diff --git a/.config/lychee.toml b/.config/lychee.toml index 200521ac41eeb739228d202ac0fb2d80be305464..733b77ec0cff9e616ecc0f851d9a3ed5e8574636 100644 --- a/.config/lychee.toml +++ b/.config/lychee.toml @@ -2,9 +2,9 @@ # Run with `lychee -c .config/lychee.toml ./**/*.rs ./**/*.prdoc` cache = true -max_cache_age = "1d" +max_cache_age = "10d" max_redirects = 10 -max_retries = 6 +max_retries = 3 # Exclude localhost et.al. exclude_all_private = true @@ -51,4 +51,7 @@ exclude = [ # Behind a captcha (code 403): "https://iohk.io/en/blog/posts/2023/11/03/partner-chains-are-coming-to-cardano/", "https://www.reddit.com/r/rust/comments/3spfh1/does_collect_allocate_more_than_once_while/", + # 403 rate limited: + "https://etherscan.io/block/11090290", + "https://substrate.stackexchange.com/.*", ] diff --git a/.config/taplo.toml b/.config/taplo.toml index f5d0b7021ba898ea3ab96323fa3fbc4efdd7b307..2c6ccfb2b34440686764c39ed6db1c73ed940f06 100644 --- a/.config/taplo.toml +++ b/.config/taplo.toml @@ -2,10 +2,12 @@ # ignore zombienet as they do some deliberate custom toml stuff exclude = [ + "bridges/testing/**", "cumulus/zombienet/**", "polkadot/node/malus/integrationtests/**", "polkadot/zombienet_tests/**", "substrate/zombienet/**", + "target/**", ] # global rules diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index fdaa0c8628f766e241ba9043698b611a0bd78811..4fc5b97caae0735058337c8b23e4ca7471761d24 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -13,7 +13,7 @@ # - Multiple owners are supported. # - Either handle (e.g, @github_user or @github/team) or email can be used. Keep in mind, # that handles might work better because they are more recognizable on GitHub, -# eyou can use them for mentioning unlike an email. +# you can use them for mentioning unlike an email. # - The latest matching rule, if multiple, takes precedence. # CI diff --git a/.github/scripts/check-prdoc.py b/.github/scripts/check-prdoc.py new file mode 100644 index 0000000000000000000000000000000000000000..42b063f2885da148033986dfa49740f2b0416460 --- /dev/null +++ b/.github/scripts/check-prdoc.py @@ -0,0 +1,71 @@ +#!/usr/bin/env python3 + +''' +Ensure that the prdoc files are valid. + +# Example + +```sh +python3 -m pip install cargo-workspace +python3 .github/scripts/check-prdoc.py Cargo.toml prdoc/*.prdoc +``` + +Produces example output: +```pre +🔎 Reading workspace polkadot-sdk/Cargo.toml +📦 Checking 32 prdocs against 493 crates. +✅ All prdocs are valid +``` +''' + +import os +import yaml +import argparse +import cargo_workspace + +def check_prdoc_crate_names(root, paths): + ''' + Check that all crates of the `crates` section of each prdoc is present in the workspace. + ''' + + print(f'🔎 Reading workspace {root}.') + workspace = cargo_workspace.Workspace.from_path(root) + crate_names = [crate.name for crate in workspace.crates] + + print(f'📦 Checking {len(paths)} prdocs against {len(crate_names)} crates.') + faulty = {} + + for path in paths: + with open(path, 'r') as f: + prdoc = yaml.safe_load(f) + + for crate in prdoc.get('crates', []): + crate = crate['name'] + if crate in crate_names: + continue + + faulty.setdefault(path, []).append(crate) + + if len(faulty) == 0: + print('✅ All prdocs are valid.') + else: + print('❌ Some prdocs are invalid.') + for path, crates in faulty.items(): + print(f'💥 {path} lists invalid crate: {", ".join(crates)}') + exit(1) + +def parse_args(): + parser = argparse.ArgumentParser(description='Check prdoc files') + parser.add_argument('root', help='The cargo workspace manifest', metavar='root', type=str, nargs=1) + parser.add_argument('prdoc', help='The prdoc files', metavar='prdoc', type=str, nargs='*') + args = parser.parse_args() + + if len(args.prdoc) == 0: + print('❌ Need at least one prdoc file as argument.') + exit(1) + + return { 'root': os.path.abspath(args.root[0]), 'prdocs': args.prdoc } + +if __name__ == '__main__': + args = parse_args() + check_prdoc_crate_names(args['root'], args['prdocs']) diff --git a/.github/scripts/check-workspace.py b/.github/scripts/check-workspace.py index d200122fee9f7035dce8c811e7c24c003d9545a4..1f8f103e4e157a8c1c804a618652741193ca5a00 100644 --- a/.github/scripts/check-workspace.py +++ b/.github/scripts/check-workspace.py @@ -18,7 +18,7 @@ def parse_args(): parser.add_argument('workspace_dir', help='The directory to check', metavar='workspace_dir', type=str, nargs=1) parser.add_argument('--exclude', help='Exclude crate paths from the check', metavar='exclude', type=str, nargs='*', default=[]) - + args = parser.parse_args() return (args.workspace_dir[0], args.exclude) @@ -26,7 +26,7 @@ def main(root, exclude): workspace_crates = get_members(root, exclude) all_crates = get_crates(root, exclude) print(f'📦 Found {len(all_crates)} crates in total') - + check_duplicates(workspace_crates) check_missing(workspace_crates, all_crates) check_links(all_crates) @@ -48,14 +48,14 @@ def get_members(workspace_dir, exclude): if not 'members' in root_manifest['workspace']: return [] - + members = [] for member in root_manifest['workspace']['members']: if member in exclude: print(f'❌ Excluded member should not appear in the workspace {member}') sys.exit(1) members.append(member) - + return members # List all members of the workspace. @@ -74,12 +74,12 @@ def get_crates(workspace_dir, exclude_crates) -> dict: with open(path, "r") as f: content = f.read() manifest = toml.loads(content) - + if 'workspace' in manifest: if root != workspace_dir: print("⏩ Excluded recursive workspace at %s" % path) continue - + # Cut off the root path and the trailing /Cargo.toml. path = path[len(workspace_dir)+1:-11] name = manifest['package']['name'] @@ -87,7 +87,7 @@ def get_crates(workspace_dir, exclude_crates) -> dict: print("⏩ Excluded crate %s at %s" % (name, path)) continue crates[name] = (path, manifest) - + return crates # Check that there are no duplicate entries in the workspace. @@ -138,23 +138,23 @@ def check_links(all_crates): if not 'path' in deps[dep]: broken.append((name, dep_name, "crate must be linked via `path`")) return - + def check_crate(deps): to_checks = ['dependencies', 'dev-dependencies', 'build-dependencies'] for to_check in to_checks: if to_check in deps: check_deps(deps[to_check]) - + # There could possibly target dependant deps: if 'target' in manifest: # Target dependant deps can only have one level of nesting: for _, target in manifest['target'].items(): check_crate(target) - + check_crate(manifest) - + links.sort() broken.sort() diff --git a/.github/scripts/common/lib.sh b/.github/scripts/common/lib.sh index bd12d9c6e6ff773f8513189a381d725243e53eb5..f844e962c41def7625fa3d45ae3cbf81ecb57147 100755 --- a/.github/scripts/common/lib.sh +++ b/.github/scripts/common/lib.sh @@ -237,6 +237,61 @@ fetch_release_artifacts() { popd > /dev/null } +# Fetch the release artifacts like binary and signatures from S3. Assumes the ENV are set: +# - RELEASE_ID +# - GITHUB_TOKEN +# - REPO in the form paritytech/polkadot +fetch_release_artifacts_from_s3() { + echo "Version : $VERSION" + echo "Repo : $REPO" + echo "Binary : $BINARY" + OUTPUT_DIR=${OUTPUT_DIR:-"./release-artifacts/${BINARY}"} + echo "OUTPUT_DIR : $OUTPUT_DIR" + + URL_BASE=$(get_s3_url_base $BINARY) + echo "URL_BASE=$URL_BASE" + + URL_BINARY=$URL_BASE/$VERSION/$BINARY + URL_SHA=$URL_BASE/$VERSION/$BINARY.sha256 + URL_ASC=$URL_BASE/$VERSION/$BINARY.asc + + # Fetch artifacts + mkdir -p "$OUTPUT_DIR" + pushd "$OUTPUT_DIR" > /dev/null + + echo "Fetching artifacts..." + for URL in $URL_BINARY $URL_SHA $URL_ASC; do + echo "Fetching %s" "$URL" + curl --progress-bar -LO "$URL" || echo "Missing $URL" + done + + pwd + ls -al --color + popd > /dev/null + +} + +# Pass the name of the binary as input, it will +# return the s3 base url +function get_s3_url_base() { + name=$1 + case $name in + polkadot | polkadot-execute-worker | polkadot-prepare-worker | staking-miner) + printf "https://releases.parity.io/polkadot" + ;; + + polkadot-parachain) + printf "https://releases.parity.io/cumulus" + ;; + + *) + printf "UNSUPPORTED BINARY $name" + exit 1 + ;; + esac +} + + # Check the checksum for a given binary function check_sha256() { echo "Checking SHA256 for $1" @@ -248,13 +303,11 @@ function check_sha256() { function import_gpg_keys() { GPG_KEYSERVER=${GPG_KEYSERVER:-"keyserver.ubuntu.com"} SEC="9D4B2B6EB8F97156D19669A9FF0812D491B96798" - WILL="2835EAF92072BC01D188AF2C4A092B93E97CE1E2" EGOR="E6FC4D4782EB0FA64A4903CCDB7D3555DD3932D3" - MARA="533C920F40E73A21EEB7E9EBF27AEA7E7594C9CF" MORGAN="2E92A9D8B15D7891363D1AE8AF9E6C43F7F8C4CF" echo "Importing GPG keys from $GPG_KEYSERVER in parallel" - for key in $SEC $WILL $EGOR $MARA $MORGAN; do + for key in $SEC $EGOR $MORGAN; do ( echo "Importing GPG key $key" gpg --no-tty --quiet --keyserver $GPG_KEYSERVER --recv-keys $key @@ -316,7 +369,7 @@ function relative_parent() { # used as Github Workflow Matrix. This call is exposed by the `scan` command and can be used as: # podman run --rm -it -v /.../fellowship-runtimes:/build docker.io/chevdor/srtool:1.70.0-0.11.1 scan function find_runtimes() { - libs=($(git grep -I -r --cached --max-depth 20 --files-with-matches 'construct_runtime!' -- '*lib.rs')) + libs=($(git grep -I -r --cached --max-depth 20 --files-with-matches '[frame_support::runtime]!' -- '*lib.rs')) re=".*-runtime$" JSON=$(jq --null-input '{ "include": [] }') @@ -344,3 +397,50 @@ function find_runtimes() { done echo $JSON } + +# Filter the version matches the particular pattern and return it. +# input: version (v1.8.0 or v1.8.0-rc1) +# output: none +filter_version_from_input() { + version=$1 + regex="(^v[0-9]+\.[0-9]+\.[0-9]+)$|(^v[0-9]+\.[0-9]+\.[0-9]+-rc[0-9]+)$" + + if [[ $version =~ $regex ]]; then + if [ -n "${BASH_REMATCH[1]}" ]; then + echo "${BASH_REMATCH[1]}" + elif [ -n "${BASH_REMATCH[2]}" ]; then + echo "${BASH_REMATCH[2]}" + fi + else + echo "Invalid version: $version" + exit 1 + fi + +} + +# Check if the release_id is valid number +# input: release_id +# output: release_id or exit 1 +check_release_id() { + input=$1 + + release_id=$(echo "$input" | sed 's/[^0-9]//g') + + if [[ $release_id =~ ^[0-9]+$ ]]; then + echo "$release_id" + else + echo "Invalid release_id from input: $input" + exit 1 + fi + +} + +# Get latest release tag +# +# input: none +# output: latest_release_tag +get_latest_release_tag() { + TOKEN="Authorization: Bearer $GITHUB_TOKEN" + latest_release_tag=$(curl -s -H "$TOKEN" $api_base/paritytech/polkadot-sdk/releases/latest | jq -r '.tag_name') + printf $latest_release_tag +} diff --git a/.github/workflows/check-labels.yml b/.github/workflows/check-labels.yml index 97562f0da09569931582864bd764e6724900d619..1d1a8770058d33ba5e449c6a2e8b307e0ff02eb7 100644 --- a/.github/workflows/check-labels.yml +++ b/.github/workflows/check-labels.yml @@ -9,14 +9,6 @@ jobs: check-labels: runs-on: ubuntu-latest steps: - - name: Skip merge queue - if: ${{ contains(github.ref, 'gh-readonly-queue') }} - run: exit 0 - - name: Pull image - env: - IMAGE: paritytech/ruled_labels:0.4.0 - run: docker pull $IMAGE - - name: Check labels env: IMAGE: paritytech/ruled_labels:0.4.0 @@ -28,6 +20,16 @@ jobs: RULES_PATH: labels/ruled_labels CHECK_SPECS: "specs_polkadot-sdk.yaml" run: | + if [ ${{ github.ref }} == "refs/heads/master" ]; then + echo "Skipping master" + exit 0 + fi + if [ $(echo ${{ github.ref }} | grep -c "gh-readonly-queue") -eq 1 ]; then + echo "Skipping merge queue" + exit 0 + fi + + docker pull $IMAGE echo "REPO: ${REPO}" echo "GITHUB_PR: ${GITHUB_PR}" diff --git a/.github/workflows/check-licenses.yml b/.github/workflows/check-licenses.yml index e1e92d288ceae235d23fa36c31d592092fe8b0ba..c32b6fcf89e06bb56cefc0517e1dcab1d1ef0f37 100644 --- a/.github/workflows/check-licenses.yml +++ b/.github/workflows/check-licenses.yml @@ -42,5 +42,4 @@ jobs: shopt -s globstar npx @paritytech/license-scanner scan \ --ensure-licenses ${{ env.LICENSES }} \ - --exclude ./substrate/bin/node-template \ -- ./substrate/**/*.rs diff --git a/.github/workflows/check-links.yml b/.github/workflows/check-links.yml index 903d7a3fcb3d94bb6913d94627418d9212397bf3..58065f369c9cf160b0b94c233df9df1016426d07 100644 --- a/.github/workflows/check-links.yml +++ b/.github/workflows/check-links.yml @@ -3,8 +3,8 @@ name: Check links on: pull_request: paths: - - "*.rs" - - "*.prdoc" + - "**.rs" + - "**.prdoc" - ".github/workflows/check-links.yml" - ".config/lychee.toml" types: [opened, synchronize, reopened, ready_for_review] diff --git a/.github/workflows/check-prdoc.yml b/.github/workflows/check-prdoc.yml index f47404744a49b86735b584e5c0f84bda3fe3078e..c31dee06ec54a0154efc3ad46ff24c79de4d0d7b 100644 --- a/.github/workflows/check-prdoc.yml +++ b/.github/workflows/check-prdoc.yml @@ -17,31 +17,25 @@ env: jobs: check-prdoc: runs-on: ubuntu-latest + if: github.event.pull_request.number != '' steps: + - name: Checkout repo + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 #v4.1.1 # we cannot show the version in this step (ie before checking out the repo) # due to https://github.com/paritytech/prdoc/issues/15 - - name: Skip merge queue - if: ${{ contains(github.ref, 'gh-readonly-queue') }} - run: exit 0 - - name: Pull image + - name: Check if PRdoc is required + id: get-labels run: | echo "Pulling $IMAGE" $ENGINE pull $IMAGE - - name: Check if PRdoc is required - id: get-labels - run: | # Fetch the labels for the PR under test echo "Fetch the labels for $API_BASE/${REPO}/pulls/${GITHUB_PR}" labels=$( curl -H "Authorization: token ${GITHUB_TOKEN}" -s "$API_BASE/${REPO}/pulls/${GITHUB_PR}" | jq '.labels | .[] | .name' | tr "\n" ",") echo "Labels: ${labels}" echo "labels=${labels}" >> "$GITHUB_OUTPUT" - - name: Checkout repo - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 #v4.1.1 - - - name: Check PRDoc version - run: | + echo "Checking PRdoc version" $ENGINE run --rm -v $PWD:/repo $IMAGE --version - name: Early exit if PR is silent @@ -62,4 +56,12 @@ jobs: run: | echo "Checking for PR#${GITHUB_PR}" echo "You can find more information about PRDoc at $PRDOC_DOC" - $ENGINE run --rm -v $PWD:/repo $IMAGE check -n ${GITHUB_PR} + $ENGINE run --rm -v $PWD:/repo -e RUST_LOG=info $IMAGE check -n ${GITHUB_PR} + + - name: Validate prdoc for PR#${{ github.event.pull_request.number }} + if: ${{ !contains(steps.get-labels.outputs.labels, 'R0') }} + run: | + echo "Validating PR#${GITHUB_PR}" + python3 --version + python3 -m pip install cargo-workspace==1.2.1 + python3 .github/scripts/check-prdoc.py Cargo.toml prdoc/pr_${GITHUB_PR}.prdoc diff --git a/.github/workflows/check-workspace.yml b/.github/workflows/check-workspace.yml index 3dd812d7d9b3743062553b700adba9d6abd93c50..81ec311ccce8153d7a28f68ff801cc917c8d1fd9 100644 --- a/.github/workflows/check-workspace.yml +++ b/.github/workflows/check-workspace.yml @@ -2,8 +2,6 @@ name: Check workspace on: pull_request: - paths: - - "*.toml" merge_group: jobs: @@ -19,5 +17,5 @@ jobs: run: > python3 .github/scripts/check-workspace.py . --exclude - "substrate/frame/contracts/fixtures/build" + "substrate/frame/contracts/fixtures/build" "substrate/frame/contracts/fixtures/contracts/common" diff --git a/.github/workflows/gitspiegel-trigger.yml b/.github/workflows/gitspiegel-trigger.yml index b338f7a3f6254b9db628f8b2b45c88b8094ef390..01058ad74d0b71385a8096964ea6c779fc6f4869 100644 --- a/.github/workflows/gitspiegel-trigger.yml +++ b/.github/workflows/gitspiegel-trigger.yml @@ -13,14 +13,15 @@ on: - unlocked - ready_for_review - reopened + # doesn't work as intended, triggers "workflow_run" webhook in any case # the job doesn't check out any code, so it is relatively safe to run it on any event - pull_request_target: - types: - - opened - - synchronize - - unlocked - - ready_for_review - - reopened + # pull_request_target: + # types: + # - opened + # - synchronize + # - unlocked + # - ready_for_review + # - reopened merge_group: # drop all permissions for GITHUB_TOKEN diff --git a/.github/workflows/release-30_publish_release_draft.yml b/.github/workflows/release-30_publish_release_draft.yml new file mode 100644 index 0000000000000000000000000000000000000000..12891ef70af36b4e848c68e292f9ba2881ee20d2 --- /dev/null +++ b/.github/workflows/release-30_publish_release_draft.yml @@ -0,0 +1,155 @@ +name: Release - Publish draft + +on: + push: + tags: + # Catches v1.2.3 and v1.2.3-rc1 + - v[0-9]+.[0-9]+.[0-9]+* + + workflow_dispatch: + inputs: + version: + description: Current release/rc version + +jobs: + get-rust-versions: + runs-on: ubuntu-latest + outputs: + rustc-stable: ${{ steps.get-rust-versions.outputs.stable }} + steps: + - id: get-rust-versions + run: | + RUST_STABLE_VERSION=$(curl -sS https://raw.githubusercontent.com/paritytech/scripts/master/dockerfiles/ci-unified/Dockerfile | grep -oP 'ARG RUST_STABLE_VERSION=\K[^ ]+') + echo "stable=$RUST_STABLE_VERSION" >> $GITHUB_OUTPUT + + build-runtimes: + uses: "./.github/workflows/srtool.yml" + with: + excluded_runtimes: "substrate-test bp cumulus-test kitchensink minimal-template parachain-template penpal polkadot-test seedling shell frame-try sp solochain-template" + + publish-release-draft: + runs-on: ubuntu-latest + needs: [get-rust-versions, build-runtimes] + outputs: + release_url: ${{ steps.create-release.outputs.html_url }} + asset_upload_url: ${{ steps.create-release.outputs.upload_url }} + steps: + - name: Checkout + uses: actions/checkout@3df4ab11eba7bda6032a0b82a6bb43b11571feac # v4.0.0 + + - name: Prepare tooling + run: | + URL=https://github.com/chevdor/tera-cli/releases/download/v0.2.4/tera-cli_linux_amd64.deb + wget $URL -O tera.deb + sudo dpkg -i tera.deb + tera --version + + - name: Download artifacts + uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 + + - name: Prepare draft + id: draft + env: + RUSTC_STABLE: ${{ needs.get-rust-versions.outputs.rustc-stable }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + ASSET_HUB_ROCOCO_DIGEST: ${{ github.workspace}}/asset-hub-rococo-runtime/asset-hub-rococo-srtool-digest.json + ASSET_HUB_WESTEND_DIGEST: ${{ github.workspace}}/asset-hub-westend-runtime/asset-hub-westend-srtool-digest.json + BRIDGE_HUB_ROCOCO_DIGEST: ${{ github.workspace}}/bridge-hub-rococo-runtime/bridge-hub-rococo-srtool-digest.json + BRIDGE_HUB_WESTEND_DIGEST: ${{ github.workspace}}/bridge-hub-westend-runtime/bridge-hub-westend-srtool-digest.json + COLLECTIVES_WESTEND_DIGEST: ${{ github.workspace}}/collectives-westend-runtime/collectives-westend-srtool-digest.json + CONTRACTS_ROCOCO_DIGEST: ${{ github.workspace}}/contracts-rococo-runtime/contracts-rococo-srtool-digest.json + CORETIME_ROCOCO_DIGEST: ${{ github.workspace}}/coretime-rococo-runtime/coretime-rococo-srtool-digest.json + CORETIME_WESTEND_DIGEST: ${{ github.workspace}}/coretime-westend-runtime/coretime-westend-srtool-digest.json + GLUTTON_WESTEND_DIGEST: ${{ github.workspace}}/glutton-westend-runtime/glutton-westend-srtool-digest.json + PEOPLE_ROCOCO_DIGEST: ${{ github.workspace}}/people-rococo-runtime/people-rococo-srtool-digest.json + PEOPLE_WESTEND_DIGEST: ${{ github.workspace}}/people-westend-runtime/people-westend-srtool-digest.json + ROCOCO_DIGEST: ${{ github.workspace}}/rococo-runtime/rococo-srtool-digest.json + WESTEND_DIGEST: ${{ github.workspace}}/westend-runtime/westend-srtool-digest.json + run: | + . ./.github/scripts/common/lib.sh + + export REF1=$(get_latest_release_tag) + if [[ -z "${{ inputs.version }}" ]]; then + export REF2="${{ github.ref }}" + else + export REF2="${{ inputs.version }}" + fi + echo "REL_TAG=$REF2" >> $GITHUB_ENV + export VERSION=$(echo "$REF2" | sed -E 's/^v([0-9]+\.[0-9]+\.[0-9]+).*$/\1/') + + ./scripts/release/build-changelogs.sh + + echo "Checking the folder state" + pwd + ls -la scripts/release + + - name: Archive artifact context.json + uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + with: + name: release-notes-context + path: | + scripts/release/context.json + **/*-srtool-digest.json + + - name: Create draft release + id: create-release + uses: actions/create-release@0cb9c9b65d5d1901c1f53e5e66eaf4afd303e70e # v1.1.4 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + tag_name: ${{ env.REL_TAG }} + release_name: Polkadot ${{ env.REL_TAG }} + body_path: ${{ github.workspace}}/scripts/release/RELEASE_DRAFT.md + draft: true + + publish-runtimes: + needs: [ build-runtimes, publish-release-draft ] + continue-on-error: true + runs-on: ubuntu-latest + strategy: + matrix: ${{ fromJSON(needs.build-runtimes.outputs.published_runtimes) }} + + steps: + - name: Checkout sources + uses: actions/checkout@3df4ab11eba7bda6032a0b82a6bb43b11571feac # v4.0.0 + + - name: Download artifacts + uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 + + - name: Get runtime info + env: + JSON: release-notes-context/${{ matrix.chain }}-runtime/${{ matrix.chain }}-srtool-digest.json + run: | + >>$GITHUB_ENV echo ASSET=$(find ${{ matrix.chain }}-runtime -name '*.compact.compressed.wasm') + >>$GITHUB_ENV echo SPEC=$(<${JSON} jq -r .runtimes.compact.subwasm.core_version.specVersion) + + - name: Upload compressed ${{ matrix.chain }} v${{ env.SPEC }} wasm + if: ${{ matrix.chain != 'rococo-parachain' }} + uses: actions/upload-release-asset@e8f9f06c4b078e705bd2ea027f0926603fc9b4d5 #v1.0.2 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ needs.publish-release-draft.outputs.asset_upload_url }} + asset_path: ${{ env.ASSET }} + asset_name: ${{ matrix.chain }}_runtime-v${{ env.SPEC }}.compact.compressed.wasm + asset_content_type: application/wasm + + post_to_matrix: + runs-on: ubuntu-latest + needs: publish-release-draft + strategy: + matrix: + channel: + - name: "Team: RelEng Internal" + room: '!GvAyzgCDgaVrvibaAF:parity.io' + + steps: + - name: Send Matrix message to ${{ matrix.channel.name }} + uses: s3krit/matrix-message-action@70ad3fb812ee0e45ff8999d6af11cafad11a6ecf # v0.0.3 + with: + room_id: ${{ matrix.channel.room }} + access_token: ${{ secrets.RELEASENOTES_MATRIX_V2_ACCESS_TOKEN }} + server: m.parity.io + message: | + **New version of polkadot tagged**: ${{ github.ref }}
+ Draft release created: ${{ needs.publish-release-draft.outputs.release_url }} diff --git a/.github/workflows/release-50_publish-docker.yml b/.github/workflows/release-50_publish-docker.yml index ecbac01cd3a5b2aaed679cfaf2ade0b04900531a..67e93ee96574de1f1e3e29f1bf6d90085865100d 100644 --- a/.github/workflows/release-50_publish-docker.yml +++ b/.github/workflows/release-50_publish-docker.yml @@ -36,7 +36,7 @@ on: -H "Authorization: Bearer ${GITHUB_TOKEN}" https://api.github.com/repos/$OWNER/$REPO/releases | \ jq '.[] | { name: .name, id: .id }' required: true - type: string + type: number registry: description: Container registry @@ -61,7 +61,6 @@ permissions: contents: write env: - RELEASE_ID: ${{ inputs.release_id }} ENGINE: docker REGISTRY: ${{ inputs.registry }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -71,6 +70,7 @@ env: # EVENT_ACTION: ${{ github.event.action }} EVENT_NAME: ${{ github.event_name }} IMAGE_TYPE: ${{ inputs.image_type }} + VERSION: ${{ inputs.version }} jobs: fetch-artifacts: # this job will be triggered for the polkadot-parachain rc and release or polkadot rc image build @@ -95,13 +95,16 @@ jobs: # chmod a+x $BINARY # ls -al - - name: Fetch rc artifacts or release artifacts based on release id + - name: Fetch rc artifacts or release artifacts from s3 based on version #this step runs only if the workflow is triggered manually if: ${{ env.EVENT_NAME == 'workflow_dispatch' }} run: | . ./.github/scripts/common/lib.sh - fetch_release_artifacts + VERSION=$(filter_version_from_input "${{ inputs.version }}") + echo "VERSION=${VERSION}" >> $GITHUB_ENV + + fetch_release_artifacts_from_s3 - name: Cache the artifacts uses: actions/cache@e12d46a63a90f2fae62d114769bbf2a179198b5c # v3.3.3 @@ -147,7 +150,10 @@ jobs: if: ${{ env.IMAGE_TYPE == 'rc' }} id: fetch_rc_refs run: | - release=release-${{ inputs.release_id }} && \ + . ./.github/scripts/common/lib.sh + + RELEASE_ID=$(check_release_id "${{ inputs.release_id }}") + release=release-$RELEASE_ID && \ echo "release=${release}" >> $GITHUB_OUTPUT commit=$(git rev-parse --short HEAD) && \ diff --git a/.github/workflows/release-99_notif-published.yml b/.github/workflows/release-99_notif-published.yml index b35120ca4e128beaa37047b0ac3f21b02f4da663..05c9d6a47f551860c51e318b01b495ca662e902e 100644 --- a/.github/workflows/release-99_notif-published.yml +++ b/.github/workflows/release-99_notif-published.yml @@ -8,22 +8,14 @@ on: jobs: ping_matrix: runs-on: ubuntu-latest + environment: release strategy: matrix: channel: # Internal - - name: 'RelEng: Cumulus Release Coordination' - room: '!NAEMyPAHWOiOQHsvus:parity.io' - pre-releases: true - name: "RelEng: Polkadot Release Coordination" room: '!cqAmzdIcbOFwrdrubV:parity.io' pre-release: true - - name: 'General: Rust, Polkadot, Substrate' - room: '!aJymqQYtCjjqImFLSb:parity.io' - pre-release: false - - name: 'Team: DevOps' - room: '!lUslSijLMgNcEKcAiE:parity.io' - pre-release: true # External - name: 'Ledger <> Polkadot Coordination' @@ -31,18 +23,15 @@ jobs: pre-release: true # Public - # - name: '#KusamaValidatorLounge:polkadot.builders' - # room: '!LhjZccBOqFNYKLdmbb:polkadot.builders' - # pre-releases: false - # - name: '#kusama-announcements:matrix.parity.io' - # room: '!FMwxpQnYhRCNDRsYGI:matrix.parity.io' - # pre-release: false - # - name: '#polkadotvalidatorlounge:web3.foundation' - # room: '!NZrbtteFeqYKCUGQtr:matrix.parity.io' - # pre-release: false - # - name: '#polkadot-announcements:matrix.parity.io' - # room: '!UqHPWiCBGZWxrmYBkF:matrix.parity.io' - # pre-release: false + - name: '#polkadotvalidatorlounge:web3.foundation' + room: '!NZrbtteFeqYKCUGQtr:matrix.parity.io' + pre-releases: false + - name: '#polkadot-announcements:parity.io' + room: '!UqHPWiCBGZWxrmYBkF:matrix.parity.io' + pre-releases: false + - name: '#kusama-announce:parity.io' + room: '!FMwxpQnYhRCNDRsYGI:matrix.parity.io' + pre-releases: false steps: - name: Matrix notification to ${{ matrix.channel.name }} @@ -53,7 +42,9 @@ jobs: access_token: ${{ secrets.RELEASENOTES_MATRIX_V2_ACCESS_TOKEN }} server: m.parity.io message: | - A (pre)release has been ${{github.event.action}} in **${{github.event.repository.full_name}}:**
+ @room + + A new node release has been ${{github.event.action}} in **${{github.event.repository.full_name}}:**
Release version: [${{github.event.release.tag_name}}](${{github.event.release.html_url}}) ----- diff --git a/.github/workflows/srtool.yml b/.github/workflows/srtool.yml index eb15538f559d2145700a73fb0e383d4103ce582a..95b1846b98e0c47cc6de2c92cadc16adc0cab487 100644 --- a/.github/workflows/srtool.yml +++ b/.github/workflows/srtool.yml @@ -12,6 +12,13 @@ on: - release-v[0-9]+.[0-9]+.[0-9]+* - release-cumulus-v[0-9]+* - release-polkadot-v[0-9]+* + workflow_call: + inputs: + excluded_runtimes: + type: string + outputs: + published_runtimes: + value: ${{ jobs.find-runtimes.outputs.runtime }} schedule: - cron: "00 02 * * 1" # 2AM weekly on monday @@ -39,7 +46,7 @@ jobs: - name: Scan runtimes env: - EXCLUDED_RUNTIMES: "substrate-test" + EXCLUDED_RUNTIMES: ${{ inputs.excluded_runtimes }}:"substrate-test" run: | . ./.github/scripts/common/lib.sh @@ -85,16 +92,6 @@ jobs: echo "Compact Runtime: ${{ steps.srtool_build.outputs.wasm }}" echo "Compressed Runtime: ${{ steps.srtool_build.outputs.wasm_compressed }}" - # it takes a while to build the runtime, so let's save the artifact as soon as we have it - - name: Archive Artifacts for ${{ matrix.chain }} - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 - with: - name: ${{ matrix.chain }}-runtime - path: | - ${{ steps.srtool_build.outputs.wasm }} - ${{ steps.srtool_build.outputs.wasm_compressed }} - ${{ matrix.chain }}-srtool-digest.json - # We now get extra information thanks to subwasm - name: Install subwasm run: | @@ -125,7 +122,7 @@ jobs: tee ${{ matrix.chain }}-diff.txt - name: Archive Subwasm results - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 with: name: ${{ matrix.chain }}-runtime path: | @@ -133,3 +130,6 @@ jobs: ${{ matrix.chain }}-compressed-info.json ${{ matrix.chain }}-metadata.json ${{ matrix.chain }}-diff.txt + ${{ steps.srtool_build.outputs.wasm }} + ${{ steps.srtool_build.outputs.wasm_compressed }} + ${{ matrix.chain }}-srtool-digest.json diff --git a/.github/workflows/subsystem-benchmarks.yml b/.github/workflows/subsystem-benchmarks.yml new file mode 100644 index 0000000000000000000000000000000000000000..1a726b669e9094e8be53ef5a1ddb1b3198210d33 --- /dev/null +++ b/.github/workflows/subsystem-benchmarks.yml @@ -0,0 +1,55 @@ +# The actions takes json file as input and runs github-action-benchmark for it. + +on: + workflow_dispatch: + inputs: + benchmark-data-dir-path: + description: "Path to the benchmark data directory" + required: true + type: string + output-file-path: + description: "Path to the benchmark data file" + required: true + type: string + +jobs: + subsystem-benchmarks: + runs-on: ubuntu-latest + environment: subsystem-benchmarks + steps: + - name: Validate inputs + run: | + echo "${{ github.event.inputs.benchmark-data-dir-path }}" | grep -P '^[a-z\-]' + echo "${{ github.event.inputs.output-file-path }}" | grep -P '^[a-z\-]+\.json' + + - name: Checkout Sources + uses: actions/checkout@v4.1.2 + with: + fetch-depth: 0 + ref: "gh-pages" + + - name: Copy bench results + id: step_one + run: | + cp bench/gitlab/${{ github.event.inputs.output-file-path }} ${{ github.event.inputs.output-file-path }} + + - name: Switch branch + id: step_two + run: | + git checkout master -- + + - uses: actions/create-github-app-token@v1 + id: app-token + with: + app-id: ${{ secrets.POLKADOTSDK_GHPAGES_APP_ID }} + private-key: ${{ secrets.POLKADOTSDK_GHPAGES_APP_KEY }} + + - name: Store benchmark result + uses: benchmark-action/github-action-benchmark@v1 + with: + tool: "customSmallerIsBetter" + name: ${{ github.event.inputs.benchmark-data-dir-path }} + output-file-path: ${{ github.event.inputs.output-file-path }} + benchmark-data-dir-path: "bench/${{ github.event.inputs.benchmark-data-dir-path }}" + github-token: ${{ steps.app-token.outputs.token }} + auto-push: true diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index c90a6c8e6e27a932c421378a333321f69f90ad0a..5e57dd86f14166e695f1c64b6b5aee56529a4781 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -119,23 +119,26 @@ default: # .forklift-cache: before_script: - - 'curl --header "PRIVATE-TOKEN: $FL_CI_GROUP_TOKEN" -o forklift -L "${CI_API_V4_URL}/projects/676/packages/generic/forklift/${FL_FORKLIFT_VERSION}/forklift_${FL_FORKLIFT_VERSION}_linux_amd64"' - - chmod +x forklift - - mkdir .forklift - - cp $FL_FORKLIFT_CONFIG .forklift/config.toml - - export FORKLIFT_PACKAGE_SUFFIX=${CI_JOB_NAME/ [0-9 \/]*} - - shopt -s expand_aliases - - export PATH=$PATH:$(pwd) - - | + - mkdir ~/.forklift + - cp $FL_FORKLIFT_CONFIG ~/.forklift/config.toml + - > if [ "$FORKLIFT_BYPASS" != "true" ]; then - echo "FORKLIFT_BYPASS not set, creating alias cargo='forklift cargo'" - alias cargo="forklift cargo" + echo "FORKLIFT_BYPASS not set"; + if command -v forklift >/dev/null 2>&1; then + echo "forklift already exists"; + forklift version + else + echo "forklift does not exist, downloading"; + curl --header "PRIVATE-TOKEN: $FL_CI_GROUP_TOKEN" -o forklift -L "${CI_API_V4_URL}/projects/676/packages/generic/forklift/${FL_FORKLIFT_VERSION}/forklift_${FL_FORKLIFT_VERSION}_linux_amd64"; + chmod +x forklift; + export PATH=$PATH:$(pwd); + echo ${FL_FORKLIFT_VERSION}; + fi + echo "Creating alias cargo='forklift cargo'"; + shopt -s expand_aliases; + alias cargo="forklift cargo"; fi - - ls -al - - rm -f forklift.sock # - - echo "FL_FORKLIFT_VERSION ${FL_FORKLIFT_VERSION}" - - echo "FORKLIFT_PACKAGE_SUFFIX $FORKLIFT_PACKAGE_SUFFIX" .common-refs: rules: @@ -151,6 +154,13 @@ default: - if: $CI_COMMIT_REF_NAME =~ /^[0-9]+$/ # PRs - if: $CI_COMMIT_REF_NAME =~ /^gh-readonly-queue.*$/ # merge queues +.publish-gh-pages-refs: + rules: + - if: $CI_PIPELINE_SOURCE == "pipeline" + when: never + - if: $CI_PIPELINE_SOURCE == "web" && $CI_COMMIT_REF_NAME == "master" + - if: $CI_COMMIT_REF_NAME == "master" + # handle the specific case where benches could store incorrect bench data because of the downstream staging runs # exclude cargo-check-benches from such runs .test-refs-check-benches: diff --git a/.gitlab/check-each-crate.py b/.gitlab/check-each-crate.py index da2eaad36c522e5ebfdc0d43e78c38507807e1a6..9b654f8071ac7237fe9c7c943540e8e020cebd6e 100755 --- a/.gitlab/check-each-crate.py +++ b/.gitlab/check-each-crate.py @@ -55,7 +55,7 @@ for i in range(0, crates_per_group + overflow_crates): print(f"Checking {crates[crate][0]}", file=sys.stderr) - res = subprocess.run(["cargo", "check", "--locked"], cwd = crates[crate][1]) + res = subprocess.run(["forklift", "cargo", "check", "--locked"], cwd = crates[crate][1]) if res.returncode != 0: sys.exit(1) diff --git a/.gitlab/pipeline/build.yml b/.gitlab/pipeline/build.yml index 002206e328cf0347fb9d0165868dd6da6d47caa9..8658e92efc8f9f7ae463a67a52eaf3d3d37df2f7 100644 --- a/.gitlab/pipeline/build.yml +++ b/.gitlab/pipeline/build.yml @@ -91,7 +91,7 @@ build-rustdoc: - .run-immediately variables: SKIP_WASM_BUILD: 1 - RUSTDOCFLAGS: "" + RUSTDOCFLAGS: "-Dwarnings --default-theme=ayu --html-in-header ./docs/sdk/assets/header.html --extend-css ./docs/sdk/assets/theme.css --html-after-content ./docs/sdk/assets/after-content.html" artifacts: name: "${CI_JOB_NAME}_${CI_COMMIT_REF_NAME}-doc" when: on_success @@ -99,32 +99,31 @@ build-rustdoc: paths: - ./crate-docs/ script: - # FIXME: it fails with `RUSTDOCFLAGS="-Dwarnings"` and `--all-features` - - time cargo doc --features try-runtime,experimental --workspace --no-deps + - time cargo doc --all-features --workspace --no-deps - rm -f ./target/doc/.lock - mv ./target/doc ./crate-docs # Inject Simple Analytics (https://www.simpleanalytics.com/) privacy preserving tracker into # all .html files - - | + - > inject_simple_analytics() { - local path="$1" - local script_content="" + local path="$1"; + local script_content=""; # Function that inject script into the head of an html file using sed. process_file() { - local file="$1" - echo "Adding Simple Analytics script to $file" - sed -i "s||$script_content|" "$file" - } - export -f process_file - # xargs runs process_file in seperate shells without access to outer variables. - # to make script_content available inside process_file, export it as an env var here. - export script_content + local file="$1"; + echo "Adding Simple Analytics script to $file"; + sed -i "s||$script_content|" "$file"; + }; + export -f process_file; + # xargs runs process_file in separate shells without access to outer variables. + # make script_content available inside process_file, export it as an env var here. + export script_content; # Modify .html files in parallel using xargs, otherwise it can take a long time. - find "$path" -name '*.html' | xargs -I {} -P "$(nproc)" bash -c 'process_file "$@"' _ {} - } - inject_simple_analytics "./crate-docs" + find "$path" -name '*.html' | xargs -I {} -P "$(nproc)" bash -c 'process_file "$@"' _ {}; + }; + inject_simple_analytics "./crate-docs"; - echo "" > ./crate-docs/index.html build-implementers-guide: @@ -314,8 +313,9 @@ build-linux-substrate: # tldr: we need to checkout the branch HEAD explicitly because of our dynamic versioning approach while building the substrate binary # see https://github.com/paritytech/ci_cd/issues/682#issuecomment-1340953589 - git checkout -B "$CI_COMMIT_REF_NAME" "$CI_COMMIT_SHA" + - !reference [.forklift-cache, before_script] script: - - WASM_BUILD_NO_COLOR=1 time cargo build --locked --release -p staging-node-cli + - time WASM_BUILD_NO_COLOR=1 cargo build --locked --release -p staging-node-cli - mv $CARGO_TARGET_DIR/release/substrate-node ./artifacts/substrate/substrate - echo -n "Substrate version = " - if [ "${CI_COMMIT_TAG}" ]; then @@ -329,13 +329,17 @@ build-linux-substrate: # - printf '\n# building node-template\n\n' # - ./scripts/ci/node-template-release.sh ./artifacts/substrate/substrate-node-template.tar.gz -build-minimal-runtime-polkavm: +build-runtimes-polkavm: stage: build extends: - .docker-env - .common-refs + - .run-immediately script: - - SUBSTRATE_RUNTIME_TARGET=riscv cargo check -p minimal-runtime + - SUBSTRATE_RUNTIME_TARGET=riscv cargo check -p minimal-template-runtime + - SUBSTRATE_RUNTIME_TARGET=riscv cargo check -p westend-runtime + - SUBSTRATE_RUNTIME_TARGET=riscv cargo check -p rococo-runtime + - SUBSTRATE_RUNTIME_TARGET=riscv cargo check -p polkadot-test-runtime .build-subkey: stage: build @@ -345,13 +349,14 @@ build-minimal-runtime-polkavm: - .run-immediately # - .collect-artifact variables: - # this variable gets overriden by "rusty-cachier environment inject", use the value as default + # this variable gets overridden by "rusty-cachier environment inject", use the value as default CARGO_TARGET_DIR: "$CI_PROJECT_DIR/target" before_script: - mkdir -p ./artifacts/subkey + - !reference [.forklift-cache, before_script] script: - cd ./substrate/bin/utils/subkey - - SKIP_WASM_BUILD=1 time cargo build --locked --release + - time SKIP_WASM_BUILD=1 cargo build --locked --release # - cd - # - mv $CARGO_TARGET_DIR/release/subkey ./artifacts/subkey/. # - echo -n "Subkey version = " @@ -390,3 +395,18 @@ build-subkey-linux: # after_script: [""] # tags: # - osx + +# bridges + +# we need some non-binary artifacts in our bridges+zombienet image +prepare-bridges-zombienet-artifacts: + stage: build + extends: + - .docker-env + - .common-refs + - .run-immediately + - .collect-artifacts + before_script: + - mkdir -p ./artifacts/bridges-polkadot-sdk/bridges + script: + - cp -r bridges/testing ./artifacts/bridges-polkadot-sdk/bridges/testing diff --git a/.gitlab/pipeline/check.yml b/.gitlab/pipeline/check.yml index 1ed12e68c2ce19b67dd5aca03cec85702351c039..89b2c00db9b2b13187a562987e00abcb232e0e32 100644 --- a/.gitlab/pipeline/check.yml +++ b/.gitlab/pipeline/check.yml @@ -7,8 +7,8 @@ cargo-clippy: variables: RUSTFLAGS: "-D warnings" script: - - SKIP_WASM_BUILD=1 cargo clippy --all-targets --locked --workspace - - SKIP_WASM_BUILD=1 cargo clippy --all-targets --all-features --locked --workspace + - SKIP_WASM_BUILD=1 cargo clippy --all-targets --locked --workspace --quiet + - SKIP_WASM_BUILD=1 cargo clippy --all-targets --all-features --locked --workspace --quiet check-try-runtime: stage: check @@ -104,21 +104,20 @@ check-toml-format: - .docker-env - .test-pr-refs script: - - | - export RUST_LOG=remote-ext=debug,runtime=debug - - echo "---------- Downloading try-runtime CLI ----------" - curl -sL https://github.com/paritytech/try-runtime-cli/releases/download/v0.5.0/try-runtime-x86_64-unknown-linux-musl -o try-runtime - chmod +x ./try-runtime - - echo "---------- Building ${PACKAGE} runtime ----------" - time cargo build --release --locked -p "$PACKAGE" --features try-runtime - - echo "---------- Executing on-runtime-upgrade for ${NETWORK} ----------" + - export RUST_LOG=remote-ext=debug,runtime=debug + - echo "---------- Downloading try-runtime CLI ----------" + - curl -sL https://github.com/paritytech/try-runtime-cli/releases/download/v0.5.4/try-runtime-x86_64-unknown-linux-musl -o try-runtime + - chmod +x ./try-runtime + - echo "Using try-runtime-cli version:" + - ./try-runtime --version + - echo "---------- Building ${PACKAGE} runtime ----------" + - time cargo build --release --locked -p "$PACKAGE" --features try-runtime + - echo "---------- Executing on-runtime-upgrade for ${NETWORK} ----------" + - > time ./try-runtime ${COMMAND_EXTRA_ARGS} \ - --runtime ./target/release/wbuild/"$PACKAGE"/"$WASM" \ - on-runtime-upgrade --disable-spec-version-check --checks=all ${SUBCOMMAND_EXTRA_ARGS} live --uri ${URI} - sleep 5 + --runtime ./target/release/wbuild/"$PACKAGE"/"$WASM" \ + on-runtime-upgrade --disable-spec-version-check --checks=all ${SUBCOMMAND_EXTRA_ARGS} live --uri ${URI} + - sleep 5 # Check runtime migrations for Parity managed relay chains check-runtime-migration-westend: @@ -133,6 +132,7 @@ check-runtime-migration-westend: WASM: "westend_runtime.compact.compressed.wasm" URI: "wss://westend-try-runtime-node.parity-chains.parity.io:443" SUBCOMMAND_EXTRA_ARGS: "--no-weight-warnings" + allow_failure: true check-runtime-migration-rococo: stage: check @@ -256,3 +256,19 @@ find-fail-ci-phrase: echo "No $ASSERT_REGEX was found, exiting with 0"; exit 0; fi + +check-core-crypto-features: + stage: check + extends: + - .docker-env + - .common-refs + script: + - pushd substrate/primitives/core + - ./check-features-variants.sh + - popd + - pushd substrate/primitives/application-crypto + - ./check-features-variants.sh + - popd + - pushd substrate/primitives/keyring + - ./check-features-variants.sh + - popd diff --git a/.gitlab/pipeline/publish.yml b/.gitlab/pipeline/publish.yml index 3b77f5363f627070984be057fb105d45c290be6e..d8f5d5832291f7afced292d3b0fdeb6238de26a8 100644 --- a/.gitlab/pipeline/publish.yml +++ b/.gitlab/pipeline/publish.yml @@ -3,16 +3,13 @@ publish-rustdoc: stage: publish - extends: .kubernetes-env + extends: + - .kubernetes-env + - .publish-gh-pages-refs variables: CI_IMAGE: node:18 GIT_DEPTH: 100 RUSTDOCS_DEPLOY_REFS: "master" - rules: - - if: $CI_PIPELINE_SOURCE == "pipeline" - when: never - - if: $CI_PIPELINE_SOURCE == "web" && $CI_COMMIT_REF_NAME == "master" - - if: $CI_COMMIT_REF_NAME == "master" needs: - job: build-rustdoc artifacts: true @@ -60,12 +57,85 @@ publish-rustdoc: - git commit -m "___Updated docs for ${CI_COMMIT_REF_NAME}___" || echo "___Nothing to commit___" - git push origin gh-pages --force + # artificial sleep to publish gh-pages + - sleep 300 + after_script: + - rm -rf .git/ ./* + +publish-subsystem-benchmarks: + stage: publish + variables: + CI_IMAGE: "paritytech/tools:latest" + extends: + - .kubernetes-env + - .publish-gh-pages-refs + needs: + - job: subsystem-benchmark-availability-recovery + artifacts: true + - job: subsystem-benchmark-availability-distribution + artifacts: true + - job: publish-rustdoc + artifacts: false + script: + # setup ssh + - eval $(ssh-agent) + - ssh-add - <<< ${GITHUB_SSH_PRIV_KEY} + - mkdir ~/.ssh && touch ~/.ssh/known_hosts + - ssh-keyscan -t rsa github.com >> ~/.ssh/known_hosts + # Set git config + - rm -rf .git/config + - git config user.email "devops-team@parity.io" + - git config user.name "${GITHUB_USER}" + - git config remote.origin.url "git@github.com:/paritytech/${CI_PROJECT_NAME}.git" + - git config remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*" + - git fetch origin gh-pages + # Push result to github + - git checkout gh-pages --force + - mkdir -p bench/gitlab/ || echo "Directory exists" + - rm -rf bench/gitlab/*.json || echo "No json files" + - cp -r charts/*.json bench/gitlab/ + - git add bench/gitlab/ + - git commit -m "Add json files with benchmark results for ${CI_COMMIT_REF_NAME}" + - git push origin gh-pages + # artificial sleep to publish gh-pages + - sleep 300 + allow_failure: true after_script: - rm -rf .git/ ./* +trigger_workflow: + stage: deploy + extends: + - .kubernetes-env + - .publish-gh-pages-refs + needs: + - job: publish-subsystem-benchmarks + artifacts: false + - job: subsystem-benchmark-availability-recovery + artifacts: true + - job: subsystem-benchmark-availability-distribution + artifacts: true + script: + - echo "Triggering workflow" + - > + for benchmark in $(ls charts/*.json); do + export benchmark_name=$(basename $benchmark); + echo "Benchmark: $benchmark_name"; + export benchmark_dir=$(echo $benchmark_name | sed 's/\.json//'); + curl -q -X POST \ + -H "Accept: application/vnd.github.v3+json" \ + -H "Authorization: token $GITHUB_TOKEN" \ + https://api.github.com/repos/paritytech/${CI_PROJECT_NAME}/actions/workflows/subsystem-benchmarks.yml/dispatches \ + -d "{\"ref\":\"refs/heads/master\",\"inputs\":{\"benchmark-data-dir-path\":\"$benchmark_dir\",\"output-file-path\":\"$benchmark_name\"}}"; + sleep 300; + done + allow_failure: true + # note: images are used not only in zombienet but also in rococo, wococo and versi .build-push-image: image: $BUILDAH_IMAGE + extends: + - .zombienet-refs variables: DOCKERFILE: "" # docker/path-to.Dockerfile IMAGE_NAME: "" # docker.io/paritypr/image_name @@ -77,6 +147,7 @@ publish-rustdoc: --build-arg VCS_REF="${CI_COMMIT_SHA}" --build-arg BUILD_DATE="$(date -u '+%Y-%m-%dT%H:%M:%SZ')" --build-arg IMAGE_NAME="${IMAGE_NAME}" + --build-arg ZOMBIENET_IMAGE="${ZOMBIENET_IMAGE}" --tag "$IMAGE_NAME:${DOCKER_IMAGES_VERSION}" --file ${DOCKERFILE} . - echo "$PARITYPR_PASS" | @@ -163,3 +234,22 @@ build-push-image-substrate-pr: variables: DOCKERFILE: "docker/dockerfiles/substrate_injected.Dockerfile" IMAGE_NAME: "docker.io/paritypr/substrate" + +# unlike other images, bridges+zombienet image is based on Zombienet image that pulls required binaries +# from other fresh images (polkadot and cumulus) +build-push-image-bridges-zombienet-tests: + stage: publish + extends: + - .kubernetes-env + - .common-refs + - .build-push-image + needs: + - job: build-linux-stable + artifacts: true + - job: build-linux-stable-cumulus + artifacts: true + - job: prepare-bridges-zombienet-artifacts + artifacts: true + variables: + DOCKERFILE: "docker/dockerfiles/bridges_zombienet_tests_injected.Dockerfile" + IMAGE_NAME: "docker.io/paritypr/bridges-zombienet-tests" diff --git a/.gitlab/pipeline/test.yml b/.gitlab/pipeline/test.yml index 0f69649546d125bd4771500f1c8157419ebcb93d..ffbee9cdcb47cd01e8298fa44bfb0cbf0270c8f1 100644 --- a/.gitlab/pipeline/test.yml +++ b/.gitlab/pipeline/test.yml @@ -23,7 +23,7 @@ test-linux-stable: - echo "Node index - ${CI_NODE_INDEX}. Total amount - ${CI_NODE_TOTAL}" # add experimental to features after https://github.com/paritytech/substrate/pull/14502 is merged # "upgrade_version_checks_should_work" is currently failing - - | + - > time cargo nextest run \ --workspace \ --locked \ @@ -34,7 +34,7 @@ test-linux-stable: # Upload tests results to Elasticsearch - echo "Upload test results to Elasticsearch" - cat target/nextest/default/junit.xml | xq . > target/nextest/default/junit.json - - | + - > curl -v -XPOST --http1.1 \ -u ${ELASTIC_USERNAME}:${ELASTIC_PASSWORD} \ https://elasticsearch.parity-build.parity.io/unit-tests/_doc/${CI_JOB_ID} \ @@ -48,6 +48,7 @@ test-linux-stable: - target/nextest/default/junit.xml reports: junit: target/nextest/default/junit.xml + timeout: 90m test-linux-oldkernel-stable: extends: test-linux-stable @@ -85,7 +86,7 @@ test-linux-stable-runtime-benchmarks: # script: # # Build all but only execute 'runtime' tests. # - echo "Node index - ${CI_NODE_INDEX}. Total amount - ${CI_NODE_TOTAL}" -# - | +# - > # time cargo nextest run \ # --workspace \ # --locked \ @@ -223,6 +224,7 @@ cargo-check-benches: git merge --verbose --no-edit FETCH_HEAD; fi fi' + - !reference [.forklift-cache, before_script] parallel: 2 script: - mkdir -p ./artifacts/benches/$CI_COMMIT_REF_NAME-$CI_COMMIT_SHORT_SHA @@ -319,7 +321,24 @@ quick-benchmarks: WASM_BUILD_NO_COLOR: 1 WASM_BUILD_RUSTFLAGS: "-C debug-assertions -D warnings" script: - - time cargo run --locked --release -p staging-node-cli --bin substrate-node --features runtime-benchmarks -- benchmark pallet --execution wasm --wasm-execution compiled --chain dev --pallet "*" --extrinsic "*" --steps 2 --repeat 1 --sanity-weight-check ignore + - time cargo run --locked --release -p staging-node-cli --bin substrate-node --features runtime-benchmarks --quiet -- benchmark pallet --chain dev --pallet "*" --extrinsic "*" --steps 2 --repeat 1 --quiet --sanity-weight-check ignore + +quick-benchmarks-omni: + stage: test + extends: + - .docker-env + - .common-refs + - .run-immediately + variables: + # Enable debug assertions since we are running optimized builds for testing + # but still want to have debug assertions. + RUSTFLAGS: "-C debug-assertions" + RUST_BACKTRACE: "full" + WASM_BUILD_NO_COLOR: 1 + WASM_BUILD_RUSTFLAGS: "-C debug-assertions" + script: + - time cargo build --locked --quiet --release -p asset-hub-westend-runtime --features runtime-benchmarks + - time cargo run --locked --release -p frame-omni-bencher --quiet -- v1 benchmark pallet --runtime target/release/wbuild/asset-hub-westend-runtime/asset_hub_westend_runtime.compact.compressed.wasm --all --steps 2 --repeat 1 --quiet --repeat 1 --sanity-weight-check ignore test-frame-examples-compile-to-wasm: # into one job @@ -490,3 +509,39 @@ test-syscalls: printf "The x86_64 syscalls used by the worker binaries have changed. Please review if this is expected and update polkadot/scripts/list-syscalls/*-worker-syscalls as needed.\n"; fi allow_failure: false # this rarely triggers in practice + +subsystem-benchmark-availability-recovery: + stage: test + artifacts: + name: "${CI_JOB_NAME}_${CI_COMMIT_REF_NAME}" + when: always + expire_in: 1 hour + paths: + - charts/ + extends: + - .docker-env + - .common-refs + - .run-immediately + script: + - cargo bench -p polkadot-availability-recovery --bench availability-recovery-regression-bench --features subsystem-benchmarks + tags: + - benchmark + allow_failure: true + +subsystem-benchmark-availability-distribution: + stage: test + artifacts: + name: "${CI_JOB_NAME}_${CI_COMMIT_REF_NAME}" + when: always + expire_in: 1 hour + paths: + - charts/ + extends: + - .docker-env + - .common-refs + - .run-immediately + script: + - cargo bench -p polkadot-availability-distribution --bench availability-distribution-regression-bench --features subsystem-benchmarks + tags: + - benchmark + allow_failure: true diff --git a/.gitlab/pipeline/zombienet.yml b/.gitlab/pipeline/zombienet.yml index a1d4db580cca734918c78bbb850cefcf3d06010e..52948e1eb719d9f8669523d9762f5662fd1b6e96 100644 --- a/.gitlab/pipeline/zombienet.yml +++ b/.gitlab/pipeline/zombienet.yml @@ -1,7 +1,8 @@ .zombienet-refs: extends: .build-refs variables: - ZOMBIENET_IMAGE: "docker.io/paritytech/zombienet:v1.3.91" + ZOMBIENET_IMAGE: "docker.io/paritytech/zombienet:v1.3.99" + PUSHGATEWAY_URL: "http://zombienet-prometheus-pushgateway.managed-monitoring:9091/metrics/job/zombie-metrics" include: # substrate tests @@ -10,3 +11,5 @@ include: - .gitlab/pipeline/zombienet/cumulus.yml # polkadot tests - .gitlab/pipeline/zombienet/polkadot.yml + # bridges tests + - .gitlab/pipeline/zombienet/bridges.yml diff --git a/.gitlab/pipeline/zombienet/bridges.yml b/.gitlab/pipeline/zombienet/bridges.yml new file mode 100644 index 0000000000000000000000000000000000000000..4278f59b1e9a2e33f32bf255436d6af5d31b30fb --- /dev/null +++ b/.gitlab/pipeline/zombienet/bridges.yml @@ -0,0 +1,63 @@ +# This file is part of .gitlab-ci.yml +# Here are all jobs that are executed during "zombienet" stage for bridges + +# common settings for all zombienet jobs +.zombienet-bridges-common: + extends: + - .kubernetes-env + - .zombienet-refs + rules: + # Docker images have different tag in merge queues + - if: $CI_COMMIT_REF_NAME =~ /^gh-readonly-queue.*$/ + variables: + DOCKER_IMAGES_VERSION: ${CI_COMMIT_SHORT_SHA} + - !reference [.build-refs, rules] + before_script: + - echo "Zombienet Tests Config" + - echo "${ZOMBIENET_IMAGE}" + - echo "${GH_DIR}" + - echo "${LOCAL_DIR}" + - ls "${LOCAL_DIR}" + - export DEBUG=zombie,zombie::network-node + - export ZOMBIENET_INTEGRATION_TEST_IMAGE="${BRIDGES_ZOMBIENET_TESTS_IMAGE}":${BRIDGES_ZOMBIENET_TESTS_IMAGE_TAG} + - echo "${ZOMBIENET_INTEGRATION_TEST_IMAGE}" + stage: zombienet + image: "${BRIDGES_ZOMBIENET_TESTS_IMAGE}:${BRIDGES_ZOMBIENET_TESTS_IMAGE_TAG}" + needs: + - job: build-push-image-bridges-zombienet-tests + artifacts: true + variables: + BRIDGES_ZOMBIENET_TESTS_IMAGE_TAG: ${DOCKER_IMAGES_VERSION} + BRIDGES_ZOMBIENET_TESTS_IMAGE: "docker.io/paritypr/bridges-zombienet-tests" + GH_DIR: "https://github.com/paritytech/polkadot-sdk/tree/${CI_COMMIT_SHA}/bridges/testing" + LOCAL_DIR: "/builds/parity/mirrors/polkadot-sdk/bridges/testing" + FF_DISABLE_UMASK_FOR_DOCKER_EXECUTOR: 1 + RUN_IN_CONTAINER: "1" + artifacts: + name: "${CI_JOB_NAME}_${CI_COMMIT_REF_NAME}_zombienet_bridge_tests" + when: always + expire_in: 2 days + paths: + - ./zombienet-logs + after_script: + - mkdir -p ./zombienet-logs + # copy general logs + - cp -r /tmp/bridges-tests-run-*/logs/* ./zombienet-logs/ + # copy logs of rococo nodes + - cp -r /tmp/bridges-tests-run-*/bridge_hub_rococo_local_network/*.log ./zombienet-logs/ + # copy logs of westend nodes + - cp -r /tmp/bridges-tests-run-*/bridge_hub_westend_local_network/*.log ./zombienet-logs/ + +zombienet-bridges-0001-asset-transfer-works: + extends: + - .zombienet-bridges-common + script: + - /home/nonroot/bridges-polkadot-sdk/bridges/testing/run-new-test.sh 0001-asset-transfer --docker + - echo "Done" + +zombienet-bridges-0002-mandatory-headers-synced-while-idle: + extends: + - .zombienet-bridges-common + script: + - /home/nonroot/bridges-polkadot-sdk/bridges/testing/run-new-test.sh 0002-mandatory-headers-synced-while-idle --docker + - echo "Done" diff --git a/.gitlab/pipeline/zombienet/polkadot.yml b/.gitlab/pipeline/zombienet/polkadot.yml index 54eb6db48cae63d9cfb08cf7da61125028904371..ba05c709a27b163386e36f680812e0cf24f10277 100644 --- a/.gitlab/pipeline/zombienet/polkadot.yml +++ b/.gitlab/pipeline/zombienet/polkadot.yml @@ -158,6 +158,22 @@ zombienet-polkadot-functional-0011-async-backing-6-seconds-rate: --local-dir="${LOCAL_DIR}/functional" --test="0011-async-backing-6-seconds-rate.zndsl" +zombienet-polkadot-elastic-scaling-0001-basic-3cores-6s-blocks: + extends: + - .zombienet-polkadot-common + script: + - /home/nonroot/zombie-net/scripts/ci/run-test-local-env-manager.sh + --local-dir="${LOCAL_DIR}/elastic_scaling" + --test="0001-basic-3cores-6s-blocks.zndsl" + +zombienet-polkadot-elastic-scaling-0002-elastic-scaling-doesnt-break-parachains: + extends: + - .zombienet-polkadot-common + script: + - /home/nonroot/zombie-net/scripts/ci/run-test-local-env-manager.sh + --local-dir="${LOCAL_DIR}/elastic_scaling" + --test="0002-elastic-scaling-doesnt-break-parachains.zndsl" + zombienet-polkadot-smoke-0001-parachains-smoke-test: extends: - .zombienet-polkadot-common diff --git a/.gitlab/rust-features.sh b/.gitlab/rust-features.sh index c0ac192a6ec69ba16abb3bad2ec49de7e9cebb61..c3ec61ab8714768c9a49f2eb2e1e544706a1d875 100755 --- a/.gitlab/rust-features.sh +++ b/.gitlab/rust-features.sh @@ -15,7 +15,7 @@ # # The steps of this script: # 1. Check that all required dependencies are installed. -# 2. Check that all rules are fullfilled for the whole workspace. If not: +# 2. Check that all rules are fulfilled for the whole workspace. If not: # 4. Check all crates to find the offending ones. # 5. Print all offending crates and exit with code 1. # diff --git a/BRIDGES.md b/BRIDGES.md deleted file mode 100644 index a6f00aec09283e10d1a697bcef3f523881941663..0000000000000000000000000000000000000000 --- a/BRIDGES.md +++ /dev/null @@ -1,91 +0,0 @@ -# Using Parity Bridges Common dependency (`git subtree`) - -In `./bridges` sub-directory you can find a `git subtree` imported version of: -[`parity-bridges-common`](https://github.com/paritytech/parity-bridges-common/) repository. - -(For regular Cumulus contributor 1. is relevant) \ -(For Cumulus maintainer 1. and 2. are relevant) \ -(For Bridges team 1. and 2. and 3. are relevant) - -## How to fix broken Bridges code? - -To fix Bridges code simply create a commit in current (`Cumulus`) repo. Best if -the commit is isolated to changes in `./bridges` sub-directory, because it makes -it easier to import that change back to upstream repo. - -(Any changes to `bridges` subtree require Bridges team approve and they should manage backport to Bridges repo) - - -## How to pull latest Bridges code to the `bridges` subtree -(in practice) - -The `bridges` repo has a stabilized branch `polkadot-staging` dedicated for releasing. - -``` -cd - -# this will update new git branches from bridges repo -# there could be unresolved conflicts, but don't worry, -# lots of them are caused because of removed unneeded files with patch step, -BRANCH=polkadot-staging ./scripts/bridges_update_subtree.sh fetch - -# so, after fetch and before solving conflicts just run patch, -# this will remove unneeded files and checks if subtree modules compiles -./scripts/bridges_update_subtree.sh patch - -# if there are conflicts, this could help, -# this removes locally deleted files at least (move changes to git stash for commit) -./scripts/bridges_update_subtree.sh merge - -# (optional) when conflicts resolved, you can check build again - should pass -# also important: this updates global Cargo.lock -./scripts/bridges_update_subtree.sh patch - -# add changes to the commit, first command `fetch` starts merge, -# so after all conflicts are solved and patch passes and compiles, -# then we need to finish merge with: -git merge --continue -``` - -## How to pull latest Bridges code or contribute back? -(in theory) - -Note that it's totally fine to ping the **Bridges Team** to do that for you. The point -of adding the code as `git subtree` is to **reduce maintenance cost** for Cumulus/Polkadot -developers. - -If you still would like to either update the code to match latest code from the repo -or create an upstream PR read below. The following commands should be run in the -current (`polkadot`) repo. - -### Add Bridges repo as a local remote -``` -git remote add -f bridges git@github.com:paritytech/parity-bridges-common.git -``` - -If you plan to contribute back, consider forking the repository on Github and adding -your personal fork as a remote as well. -``` -git remote add -f my-bridges git@github.com:tomusdrw/parity-bridges-common.git -``` - -### To update Bridges -``` -git fetch bridges polkadot-staging -git subtree pull --prefix=bridges bridges polkadot-staging --squash -``` - -We use `--squash` to avoid adding individual commits and rather squashing them -all into one. - -### Clean unneeded files here -``` -./bridges/scripts/verify-pallets-build.sh --ignore-git-state --no-revert -``` - -### Contributing back to Bridges (creating upstream PR) -``` -git subtree push --prefix=bridges my-bridges polkadot-staging -``` -This command will push changes to your personal fork of Bridges repo, from where -you can simply create a PR to the main repo. diff --git a/Cargo.lock b/Cargo.lock index 9ce9fd8a71893602f2ad2dcca49b527f7fd1d513..c636f7af2aa0881d7e609c6777e1bae80afa66e5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -86,16 +86,16 @@ dependencies = [ [[package]] name = "aes-gcm" -version = "0.9.4" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df5f85a83a7d8b0442b6aa7b504b8212c1733da07b98aae43d4bc21b2cb3cdf6" +checksum = "bc3be92e19a7ef47457b8e6f90707e12b6ac5d20c6f3866584fa3be0787d839f" dependencies = [ "aead 0.4.3", "aes 0.7.5", "cipher 0.3.0", - "ctr 0.8.0", + "ctr 0.7.0", "ghash 0.4.4", - "subtle 2.4.1", + "subtle 2.5.0", ] [[package]] @@ -109,14 +109,14 @@ dependencies = [ "cipher 0.4.4", "ctr 0.9.2", "ghash 0.5.0", - "subtle 2.4.1", + "subtle 2.5.0", ] [[package]] name = "ahash" -version = "0.7.6" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" +checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" dependencies = [ "getrandom 0.2.10", "once_cell", @@ -125,9 +125,9 @@ dependencies = [ [[package]] name = "ahash" -version = "0.8.7" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77c3a9648d43b9cd48db467b3f87fdd6e146bcc88ab0180006cef2179fe11d01" +checksum = "42cd52102d3df161c77a887b608d7a4897d7cc112886a9537b738a887a03aaff" dependencies = [ "cfg-if", "getrandom 0.2.10", @@ -165,7 +165,7 @@ dependencies = [ "hex-literal", "itoa", "proptest", - "rand", + "rand 0.8.5", "ruint", "serde", "tiny-keccak", @@ -177,23 +177,11 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cc0fac0fc16baf1f63f78b47c3d24718f3619b0714076f6a02957d808d52cbef" dependencies = [ - "alloy-rlp-derive", "arrayvec 0.7.4", "bytes", "smol_str", ] -[[package]] -name = "alloy-rlp-derive" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0391754c09fab4eae3404d19d0d297aa1c670c1775ab51d8a5312afeca23157" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.48", -] - [[package]] name = "alloy-sol-macro" version = "0.4.2" @@ -202,11 +190,11 @@ checksum = "8a98ad1696a2e17f010ae8e43e9f2a1e930ed176a8e3ff77acfeff6dfb07b42c" dependencies = [ "const-hex", "dunce", - "heck", + "heck 0.4.1", "proc-macro-error", - "proc-macro2", - "quote", - "syn 2.0.48", + "proc-macro2 1.0.75", + "quote 1.0.35", + "syn 2.0.53", "syn-solidity", "tiny-keccak", ] @@ -275,9 +263,9 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.2" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15c4c2c83f81532e5845a733998b6971faca23490340a418e9b72a3ec9de12ea" +checksum = "8901269c6307e8d93993578286ac0edf7f195079ffff5ebdeea6a59ffb7e36bc" [[package]] name = "anstyle-parse" @@ -309,9 +297,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.75" +version = "1.0.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6" +checksum = "0952808a6c2afd1aa8947271f3a60f1a6763c7b912d210184c5149b5cf147247" [[package]] name = "approx" @@ -322,6 +310,20 @@ dependencies = [ "num-traits", ] +[[package]] +name = "aquamarine" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1da02abba9f9063d786eab1509833ebb2fac0f966862ca59439c76b9c566760" +dependencies = [ + "include_dir", + "itertools 0.10.5", + "proc-macro-error", + "proc-macro2 1.0.75", + "quote 1.0.35", + "syn 1.0.109", +] + [[package]] name = "aquamarine" version = "0.5.0" @@ -331,9 +333,9 @@ dependencies = [ "include_dir", "itertools 0.10.5", "proc-macro-error", - "proc-macro2", - "quote", - "syn 2.0.48", + "proc-macro2 1.0.75", + "quote 1.0.35", + "syn 2.0.53", ] [[package]] @@ -528,7 +530,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "db02d390bf6643fb404d3d22d31aee1c4bc4459600aef9113833d17e786c6e44" dependencies = [ - "quote", + "quote 1.0.35", "syn 1.0.109", ] @@ -538,7 +540,7 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" dependencies = [ - "quote", + "quote 1.0.35", "syn 1.0.109", ] @@ -550,7 +552,7 @@ checksum = "db2fd794a08ccb318058009eefdf15bcaaaaf6f8161eb3345f907222bac38b20" dependencies = [ "num-bigint", "num-traits", - "quote", + "quote 1.0.35", "syn 1.0.109", ] @@ -562,8 +564,8 @@ checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" dependencies = [ "num-bigint", "num-traits", - "proc-macro2", - "quote", + "proc-macro2 1.0.75", + "quote 1.0.35", "syn 1.0.109", ] @@ -664,8 +666,8 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ae3281bc6d0fd7e549af32b52511e1302185bd688fd3359fa36423346ff682ea" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.75", + "quote 1.0.35", "syn 1.0.109", ] @@ -676,7 +678,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1df2c09229cbc5a028b1d70e00fdb2acee28b1055dfb5ca73eea49c5a25c4e7c" dependencies = [ "num-traits", - "rand", + "rand 0.8.5", ] [[package]] @@ -686,7 +688,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" dependencies = [ "num-traits", - "rand", + "rand 0.8.5", "rayon", ] @@ -730,12 +732,6 @@ dependencies = [ "nodrop", ] -[[package]] -name = "arrayvec" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" - [[package]] name = "arrayvec" version = "0.7.4" @@ -764,8 +760,8 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "726535892e8eae7e70657b4c8ea93d26b8553afb1ce617caee529ef96d7dee6c" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.75", + "quote 1.0.35", "syn 1.0.109", "synstructure", ] @@ -776,8 +772,8 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2777730b2039ac0f95f093556e61b6d26cebed5393ca6f152717777cec3a42ed" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.75", + "quote 1.0.35", "syn 1.0.109", ] @@ -823,7 +819,6 @@ dependencies = [ "assert_matches", "asset-hub-rococo-runtime", "asset-test-utils", - "cumulus-pallet-parachain-system", "emulated-integration-tests-common", "frame-support", "pallet-asset-conversion", @@ -833,12 +828,12 @@ dependencies = [ "pallet-xcm", "parachains-common", "parity-scale-codec", + "penpal-runtime", "rococo-runtime", "rococo-system-emulated-network", "sp-runtime", "staging-xcm", "staging-xcm-executor", - "testnet-parachains-constants", ] [[package]] @@ -858,6 +853,7 @@ dependencies = [ "cumulus-pallet-xcmp-queue", "cumulus-primitives-aura", "cumulus-primitives-core", + "cumulus-primitives-storage-weight-reclaim", "cumulus-primitives-utility", "frame-benchmarking", "frame-executive", @@ -954,11 +950,11 @@ dependencies = [ "pallet-xcm", "parachains-common", "parity-scale-codec", + "penpal-runtime", "polkadot-runtime-common", "sp-runtime", "staging-xcm", "staging-xcm-executor", - "testnet-parachains-constants", "westend-runtime", "westend-system-emulated-network", ] @@ -980,6 +976,7 @@ dependencies = [ "cumulus-pallet-xcmp-queue", "cumulus-primitives-aura", "cumulus-primitives-core", + "cumulus-primitives-storage-weight-reclaim", "cumulus-primitives-utility", "frame-benchmarking", "frame-executive", @@ -1050,11 +1047,11 @@ dependencies = [ "frame-support", "frame-system", "hex-literal", - "pallet-asset-conversion", "pallet-assets", "pallet-balances", "pallet-collator-selection", "pallet-session", + "pallet-timestamp", "pallet-xcm", "pallet-xcm-bridge-hub-router", "parachains-common", @@ -1092,6 +1089,16 @@ dependencies = [ "substrate-wasm-builder", ] +[[package]] +name = "async-attributes" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3203e79f4dd9bdda415ed03cf14dae5a2bf775c683a00f94e9cd1faf0f596e5" +dependencies = [ + "quote 1.0.35", + "syn 1.0.109", +] + [[package]] name = "async-channel" version = "1.9.0" @@ -1099,7 +1106,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" dependencies = [ "concurrent-queue", - "event-listener", + "event-listener 2.5.3", "futures-core", ] @@ -1109,7 +1116,7 @@ version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6fa3dc5f2a8564f07759c008b9109dc0d39de92a88d5588b8a5036d286383afb" dependencies = [ - "async-lock", + "async-lock 2.8.0", "async-task", "concurrent-queue", "fastrand 1.9.0", @@ -1123,19 +1130,34 @@ version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "279cf904654eeebfa37ac9bb1598880884924aab82e290aa65c9e77a0e142e06" dependencies = [ - "async-lock", + "async-lock 2.8.0", "autocfg", "blocking", "futures-lite", ] +[[package]] +name = "async-global-executor" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1b6f5d7df27bd294849f8eec66ecfc63d11814df7a4f5d74168a2394467b776" +dependencies = [ + "async-channel", + "async-executor", + "async-io", + "async-lock 2.8.0", + "blocking", + "futures-lite", + "once_cell", +] + [[package]] name = "async-io" version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fc5b45d93ef0529756f812ca52e44c221b35341892d3dcc34132ac02f3dd2af" dependencies = [ - "async-lock", + "async-lock 2.8.0", "autocfg", "cfg-if", "concurrent-queue", @@ -1155,7 +1177,18 @@ version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "287272293e9d8c41773cec55e365490fe034813a2f172f502d6ddcf75b2f582b" dependencies = [ - "event-listener", + "event-listener 2.5.3", +] + +[[package]] +name = "async-lock" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d034b430882f8381900d3fe6f0aaa3ad94f2cb4ac519b429692a1bc2dda4ae7b" +dependencies = [ + "event-listener 4.0.3", + "event-listener-strategy", + "pin-project-lite 0.2.12", ] [[package]] @@ -1177,17 +1210,44 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a9d28b1d97e08915212e2e45310d47854eafa69600756fc735fb788f75199c9" dependencies = [ "async-io", - "async-lock", + "async-lock 2.8.0", "autocfg", "blocking", "cfg-if", - "event-listener", + "event-listener 2.5.3", "futures-lite", "rustix 0.37.23", "signal-hook", "windows-sys 0.48.0", ] +[[package]] +name = "async-std" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62565bb4402e926b29953c785397c6dc0391b7b446e45008b0049eb43cec6f5d" +dependencies = [ + "async-attributes", + "async-channel", + "async-global-executor", + "async-io", + "async-lock 2.8.0", + "crossbeam-utils", + "futures-channel", + "futures-core", + "futures-io", + "futures-lite", + "gloo-timers", + "kv-log-macro", + "log", + "memchr", + "once_cell", + "pin-project-lite 0.2.12", + "pin-utils", + "slab", + "wasm-bindgen-futures", +] + [[package]] name = "async-stream" version = "0.3.5" @@ -1205,9 +1265,9 @@ version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.48", + "proc-macro2 1.0.75", + "quote 1.0.35", + "syn 2.0.53", ] [[package]] @@ -1218,13 +1278,13 @@ checksum = "ecc7ab41815b3c653ccd2978ec3255c81349336702dfdf62ee6f7069b12a3aae" [[package]] name = "async-trait" -version = "0.1.74" +version = "0.1.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a66537f1bb974b254c98ed142ff995236e81b9d0fe4db0575f46612cb15eb0f9" +checksum = "a507401cad91ec6a857ed5513a2073c82a9b9048762b885bb98655b306964681" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.48", + "proc-macro2 1.0.75", + "quote 1.0.35", + "syn 2.0.53", ] [[package]] @@ -1270,8 +1330,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fee3da8ef1276b0bee5dd1c7258010d8fffd31801447323115a25560e1327b89" dependencies = [ "proc-macro-error", - "proc-macro2", - "quote", + "proc-macro2 1.0.75", + "quote 1.0.35", "syn 1.0.109", ] @@ -1281,6 +1341,17 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +[[package]] +name = "backoff" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b62ddb9cb1ec0a098ad4bbf9344d0713fa193ae1a80af55febcff2627b6a00c1" +dependencies = [ + "getrandom 0.2.10", + "instant", + "rand 0.8.5", +] + [[package]] name = "backtrace" version = "0.3.69" @@ -1309,7 +1380,7 @@ dependencies = [ "ark-std 0.4.0", "dleq_vrf", "fflonk", - "merlin 3.0.0", + "merlin", "rand_chacha 0.3.1", "rand_core 0.6.4", "ring 0.1.0", @@ -1372,7 +1443,7 @@ name = "binary-merkle-tree" version = "13.0.0" dependencies = [ "array-bytes 6.1.0", - "env_logger 0.9.3", + "env_logger 0.11.3", "hash-db", "log", "sp-core", @@ -1401,12 +1472,12 @@ dependencies = [ "lazycell", "peeking_take_while", "prettyplease 0.2.12", - "proc-macro2", - "quote", + "proc-macro2 1.0.75", + "quote 1.0.35", "regex", "rustc-hash", "shlex", - "syn 2.0.48", + "syn 2.0.53", ] [[package]] @@ -1415,9 +1486,7 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "93f2635620bf0b9d4576eb7bb9a38a55df78bd1205d26fa994b25911a69f212f" dependencies = [ - "bitcoin_hashes", - "rand", - "rand_core 0.6.4", + "bitcoin_hashes 0.11.0", "serde", "unicode-normalization", ] @@ -1437,12 +1506,28 @@ version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" +[[package]] +name = "bitcoin-internals" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9425c3bf7089c983facbae04de54513cce73b41c7f9ff8c845b54e7bc64ebbfb" + [[package]] name = "bitcoin_hashes" version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "90064b8dee6815a6470d60bad07bbbaee885c0e12d04177138fa3291a01b7bc4" +[[package]] +name = "bitcoin_hashes" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1930a4dabfebb8d7d9992db18ebe3ae2876f0a305fab206fd168df931ede293b" +dependencies = [ + "bitcoin-internals", + "hex-conservative", +] + [[package]] name = "bitflags" version = "1.3.2" @@ -1534,18 +1619,6 @@ dependencies = [ "constant_time_eq 0.3.0", ] -[[package]] -name = "block-buffer" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b" -dependencies = [ - "block-padding", - "byte-tools", - "byteorder", - "generic-array 0.12.4", -] - [[package]] name = "block-buffer" version = "0.9.0" @@ -1564,15 +1637,6 @@ dependencies = [ "generic-array 0.14.7", ] -[[package]] -name = "block-padding" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa79dedbb091f449f1f39e53edf88d5dbe95f895dae6135a8d7b881fb5af73f5" -dependencies = [ - "byte-tools", -] - [[package]] name = "blocking" version = "1.3.1" @@ -1580,7 +1644,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77231a1c8f801696fc0123ec6150ce92cffb8e164a02afb9c8ddee0e9b65ad65" dependencies = [ "async-channel", - "async-lock", + "async-lock 2.8.0", "async-task", "atomic-waker", "fastrand 1.9.0", @@ -1630,6 +1694,23 @@ dependencies = [ "scale-info", ] +[[package]] +name = "bp-beefy" +version = "0.1.0" +dependencies = [ + "binary-merkle-tree", + "bp-runtime", + "frame-support", + "pallet-beefy-mmr", + "pallet-mmr", + "parity-scale-codec", + "scale-info", + "serde", + "sp-consensus-beefy", + "sp-runtime", + "sp-std 14.0.0", +] + [[package]] name = "bp-bridge-hub-cumulus" version = "0.7.0" @@ -1864,7 +1945,7 @@ dependencies = [ "bp-parachains", "bp-polkadot-core", "bp-runtime", - "ed25519-dalek", + "ed25519-dalek 2.1.0", "finality-grandpa", "parity-scale-codec", "sp-application-crypto", @@ -1906,7 +1987,7 @@ dependencies = [ [[package]] name = "bridge-hub-common" -version = "0.0.0" +version = "0.1.0" dependencies = [ "cumulus-primitives-core", "frame-support", @@ -1938,7 +2019,6 @@ name = "bridge-hub-rococo-integration-tests" version = "1.0.0" dependencies = [ "asset-hub-rococo-runtime", - "bp-messages", "bridge-hub-rococo-runtime", "cumulus-pallet-xcmp-queue", "emulated-integration-tests-common", @@ -1956,7 +2036,6 @@ dependencies = [ "rococo-westend-system-emulated-network", "scale-info", "snowbridge-core", - "snowbridge-pallet-inbound-queue", "snowbridge-pallet-inbound-queue-fixtures", "snowbridge-pallet-outbound-queue", "snowbridge-pallet-system", @@ -1996,6 +2075,7 @@ dependencies = [ "cumulus-pallet-xcmp-queue", "cumulus-primitives-aura", "cumulus-primitives-core", + "cumulus-primitives-storage-weight-reclaim", "cumulus-primitives-utility", "frame-benchmarking", "frame-executive", @@ -2089,6 +2169,7 @@ dependencies = [ "pallet-bridge-messages", "pallet-bridge-parachains", "pallet-bridge-relayers", + "pallet-timestamp", "pallet-utility", "parachains-common", "parachains-runtimes-test-utils", @@ -2121,7 +2202,6 @@ dependencies = [ name = "bridge-hub-westend-integration-tests" version = "1.0.0" dependencies = [ - "bp-messages", "bridge-hub-westend-runtime", "cumulus-pallet-xcmp-queue", "emulated-integration-tests-common", @@ -2133,6 +2213,7 @@ dependencies = [ "pallet-message-queue", "pallet-xcm", "parachains-common", + "parity-scale-codec", "rococo-westend-system-emulated-network", "sp-runtime", "staging-xcm", @@ -2165,6 +2246,7 @@ dependencies = [ "cumulus-pallet-xcmp-queue", "cumulus-primitives-aura", "cumulus-primitives-core", + "cumulus-primitives-storage-weight-reclaim", "cumulus-primitives-utility", "frame-benchmarking", "frame-executive", @@ -2391,6 +2473,12 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" +[[package]] +name = "castaway" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2698f953def977c68f935bb0dfa959375ad4638570e969e2f1e9f433cbf1af6" + [[package]] name = "cc" version = "1.0.83" @@ -2531,6 +2619,19 @@ dependencies = [ "unsigned-varint", ] +[[package]] +name = "cid" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd94671561e36e4e7de75f753f577edafb0e7c05d6e4547229fdf7938fbcd2c3" +dependencies = [ + "core2", + "multibase", + "multihash 0.18.1", + "serde", + "unsigned-varint", +] + [[package]] name = "cipher" version = "0.2.5" @@ -2579,6 +2680,21 @@ dependencies = [ "libloading", ] +[[package]] +name = "clap" +version = "2.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c" +dependencies = [ + "ansi_term", + "atty", + "bitflags 1.3.2", + "strsim 0.8.0", + "textwrap 0.11.0", + "unicode-width", + "vec_map", +] + [[package]] name = "clap" version = "3.2.25" @@ -2591,19 +2707,19 @@ dependencies = [ "clap_lex 0.2.4", "indexmap 1.9.3", "once_cell", - "strsim", + "strsim 0.10.0", "termcolor", - "textwrap", + "textwrap 0.16.0", ] [[package]] name = "clap" -version = "4.4.18" +version = "4.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e578d6ec4194633722ccf9544794b71b1385c3c027efe0c55db226fc880865c" +checksum = "949626d00e063efc93b6dca932419ceb5432f99769911c0b995f7e884c778813" dependencies = [ "clap_builder", - "clap_derive 4.4.7", + "clap_derive 4.5.3", ] [[package]] @@ -2617,14 +2733,14 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.4.18" +version = "4.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4df4df40ec50c46000231c914968278b1eb05098cf8f1b3a518a95030e71d1c7" +checksum = "ae129e2e766ae0ec03484e609954119f123cc1fe650337e155d03b022f24f7b4" dependencies = [ "anstream", "anstyle", - "clap_lex 0.6.0", - "strsim", + "clap_lex 0.7.0", + "strsim 0.11.0", "terminal_size", ] @@ -2634,7 +2750,7 @@ version = "4.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "586a385f7ef2f8b4d86bddaa0c094794e7ccbfe5ffef1f434fe928143fc783a5" dependencies = [ - "clap 4.4.18", + "clap 4.5.3", ] [[package]] @@ -2643,23 +2759,23 @@ version = "3.2.25" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ae6371b8bdc8b7d3959e9cf7b22d4435ef3e79e138688421ec654acf8c81b008" dependencies = [ - "heck", + "heck 0.4.1", "proc-macro-error", - "proc-macro2", - "quote", + "proc-macro2 1.0.75", + "quote 1.0.35", "syn 1.0.109", ] [[package]] name = "clap_derive" -version = "4.4.7" +version = "4.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf9804afaaf59a91e75b022a30fb7229a7901f60c755489cc61c9b423b836442" +checksum = "90239a040c80f5e14809ca132ddc4176ab33d5e17e49691793296e3fcb34d72f" dependencies = [ - "heck", - "proc-macro2", - "quote", - "syn 2.0.48", + "heck 0.5.0", + "proc-macro2 1.0.75", + "quote 1.0.35", + "syn 2.0.53", ] [[package]] @@ -2673,9 +2789,9 @@ dependencies = [ [[package]] name = "clap_lex" -version = "0.6.0" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1" +checksum = "98cc8fbded0c607b7ba9dd60cd98df59af97e84d24e49c8557331cfc26d301ce" [[package]] name = "coarsetime" @@ -2723,6 +2839,7 @@ dependencies = [ "cumulus-pallet-xcmp-queue", "cumulus-primitives-aura", "cumulus-primitives-core", + "cumulus-primitives-storage-weight-reclaim", "cumulus-primitives-utility", "frame-benchmarking", "frame-executive", @@ -2815,8 +2932,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d51beaa537d73d2d1ff34ee70bc095f170420ab2ec5d687ecd3ec2b0d092514b" dependencies = [ "nom", - "proc-macro2", - "quote", + "proc-macro2 1.0.75", + "quote 1.0.35", "syn 1.0.109", ] @@ -2837,6 +2954,16 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "combine" +version = "4.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35ed6e9d84f0b51a7f52daf1c7d71dd136fd7a3f41a8462b8cdb8c78d920fad4" +dependencies = [ + "bytes", + "memchr", +] + [[package]] name = "comfy-table" version = "7.1.0" @@ -2860,7 +2987,7 @@ dependencies = [ "ark-std 0.4.0", "fflonk", "getrandom_or_panic", - "merlin 3.0.0", + "merlin", "rand_chacha 0.3.1", ] @@ -2978,6 +3105,7 @@ dependencies = [ "cumulus-pallet-xcmp-queue", "cumulus-primitives-aura", "cumulus-primitives-core", + "cumulus-primitives-storage-weight-reclaim", "cumulus-primitives-utility", "frame-benchmarking", "frame-executive", @@ -3072,6 +3200,7 @@ dependencies = [ "cumulus-pallet-xcmp-queue", "cumulus-primitives-aura", "cumulus-primitives-core", + "cumulus-primitives-storage-weight-reclaim", "cumulus-primitives-utility", "frame-benchmarking", "frame-executive", @@ -3099,7 +3228,6 @@ dependencies = [ "pallet-xcm-benchmarks", "parachains-common", "parity-scale-codec", - "polkadot-core-primitives", "polkadot-parachain-primitives", "polkadot-runtime-common", "rococo-runtime-constants", @@ -3137,6 +3265,7 @@ dependencies = [ "cumulus-pallet-xcmp-queue", "cumulus-primitives-aura", "cumulus-primitives-core", + "cumulus-primitives-storage-weight-reclaim", "cumulus-primitives-utility", "frame-benchmarking", "frame-executive", @@ -3150,11 +3279,11 @@ dependencies = [ "pallet-aura", "pallet-authorship", "pallet-balances", + "pallet-broker", "pallet-collator-selection", "pallet-message-queue", "pallet-multisig", "pallet-session", - "pallet-sudo", "pallet-timestamp", "pallet-transaction-payment", "pallet-transaction-payment-rpc-runtime-api", @@ -3163,7 +3292,6 @@ dependencies = [ "pallet-xcm-benchmarks", "parachains-common", "parity-scale-codec", - "polkadot-core-primitives", "polkadot-parachain-primitives", "polkadot-runtime-common", "scale-info", @@ -3325,6 +3453,21 @@ dependencies = [ "wasmtime-types", ] +[[package]] +name = "crc" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2b432c56615136f8dba245fed7ec3d5518c500a31108661067e61e72fe7e6bc" +dependencies = [ + "crc-catalog", +] + +[[package]] +name = "crc-catalog" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" + [[package]] name = "crc32fast" version = "1.3.2" @@ -3371,7 +3514,7 @@ dependencies = [ "anes", "cast", "ciborium", - "clap 4.4.18", + "clap 4.5.3", "criterion-plot", "futures", "is-terminal", @@ -3400,16 +3543,6 @@ dependencies = [ "itertools 0.10.5", ] -[[package]] -name = "crossbeam-channel" -version = "0.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200" -dependencies = [ - "cfg-if", - "crossbeam-utils", -] - [[package]] name = "crossbeam-deque" version = "0.8.3" @@ -3467,7 +3600,7 @@ checksum = "cf4c2f4e1afd912bc40bfd6fed5d9dc1f288e0ba01bfcc835cc5bc3eb13efe15" dependencies = [ "generic-array 0.14.7", "rand_core 0.6.4", - "subtle 2.4.1", + "subtle 2.5.0", "zeroize", ] @@ -3499,24 +3632,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b584a330336237c1eecd3e94266efb216c56ed91225d634cb2991c5f3fd1aeab" dependencies = [ "generic-array 0.14.7", - "subtle 2.4.1", -] - -[[package]] -name = "crypto-mac" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1d1a86f49236c215f271d40892d5fc950490551400b02ef360692c29815c714" -dependencies = [ - "generic-array 0.14.7", - "subtle 2.4.1", + "subtle 2.5.0", ] [[package]] name = "ctr" -version = "0.8.0" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "049bb91fb4aaf0e3c7efa6cd5ef877dbbbd15b39dad06d9948de4ec8a75761ea" +checksum = "a232f92a03f37dd7d7dd2adc67166c77e9cd88de5b019b9a9eecfaeaf7bfd481" dependencies = [ "cipher 0.3.0", ] @@ -3534,7 +3657,7 @@ dependencies = [ name = "cumulus-client-cli" version = "0.7.0" dependencies = [ - "clap 4.4.18", + "clap 4.5.3", "parity-scale-codec", "sc-chain-spec", "sc-cli", @@ -3757,7 +3880,7 @@ dependencies = [ "polkadot-overseer", "polkadot-primitives", "portpicker", - "rand", + "rand 0.8.5", "sc-cli", "sc-client-api", "sc-consensus", @@ -3800,6 +3923,7 @@ dependencies = [ "sp-blockchain", "sp-consensus", "sp-core", + "sp-io", "sp-runtime", "sp-transaction-pool", ] @@ -3852,6 +3976,7 @@ dependencies = [ "cumulus-primitives-proof-size-hostfunction", "cumulus-test-client", "cumulus-test-relay-sproof-builder", + "cumulus-test-runtime", "environmental", "frame-benchmarking", "frame-support", @@ -3864,10 +3989,12 @@ dependencies = [ "pallet-message-queue", "parity-scale-codec", "polkadot-parachain-primitives", + "polkadot-runtime-common", "polkadot-runtime-parachains", - "rand", + "rand 0.8.5", "sc-client-api", "scale-info", + "sp-consensus-slots", "sp-core", "sp-crypto-hashing", "sp-externalities 0.25.0", @@ -3890,9 +4017,9 @@ name = "cumulus-pallet-parachain-system-proc-macro" version = "0.6.0" dependencies = [ "proc-macro-crate 3.0.0", - "proc-macro2", - "quote", - "syn 2.0.48", + "proc-macro2 1.0.75", + "quote 1.0.35", + "syn 2.0.53", ] [[package]] @@ -4037,6 +4164,25 @@ dependencies = [ "sp-trie", ] +[[package]] +name = "cumulus-primitives-storage-weight-reclaim" +version = "1.0.0" +dependencies = [ + "cumulus-primitives-core", + "cumulus-primitives-proof-size-hostfunction", + "cumulus-test-runtime", + "docify", + "frame-support", + "frame-system", + "log", + "parity-scale-codec", + "scale-info", + "sp-io", + "sp-runtime", + "sp-std 14.0.0", + "sp-trie", +] + [[package]] name = "cumulus-primitives-timestamp" version = "0.7.0" @@ -4057,7 +4203,6 @@ dependencies = [ "frame-support", "log", "pallet-asset-conversion", - "pallet-xcm-benchmarks", "parity-scale-codec", "polkadot-runtime-common", "polkadot-runtime-parachains", @@ -4137,6 +4282,7 @@ dependencies = [ "polkadot-node-subsystem-util", "polkadot-overseer", "polkadot-primitives", + "polkadot-service", "sc-authority-discovery", "sc-client-api", "sc-network", @@ -4168,7 +4314,7 @@ dependencies = [ "parity-scale-codec", "pin-project", "polkadot-overseer", - "rand", + "rand 0.8.5", "sc-client-api", "sc-rpc-api", "sc-service", @@ -4199,6 +4345,7 @@ dependencies = [ "cumulus-primitives-core", "cumulus-primitives-parachain-inherent", "cumulus-primitives-proof-size-hostfunction", + "cumulus-primitives-storage-weight-reclaim", "cumulus-test-relay-sproof-builder", "cumulus-test-runtime", "cumulus-test-service", @@ -4210,15 +4357,19 @@ dependencies = [ "polkadot-primitives", "sc-block-builder", "sc-consensus", + "sc-consensus-aura", "sc-executor", "sc-executor-common", "sc-service", "sp-api", + "sp-application-crypto", "sp-blockchain", + "sp-consensus-aura", "sp-core", "sp-inherents", "sp-io", "sp-keyring", + "sp-keystore", "sp-runtime", "sp-timestamp", "substrate-test-client", @@ -4241,15 +4392,22 @@ dependencies = [ name = "cumulus-test-runtime" version = "0.1.0" dependencies = [ + "cumulus-pallet-aura-ext", "cumulus-pallet-parachain-system", + "cumulus-primitives-aura", "cumulus-primitives-core", + "cumulus-primitives-storage-weight-reclaim", "frame-executive", "frame-support", "frame-system", "frame-system-rpc-runtime-api", + "pallet-aura", + "pallet-authorship", "pallet-balances", + "pallet-collator-selection", "pallet-glutton", "pallet-message-queue", + "pallet-session", "pallet-sudo", "pallet-timestamp", "pallet-transaction-payment", @@ -4257,6 +4415,7 @@ dependencies = [ "scale-info", "sp-api", "sp-block-builder", + "sp-consensus-aura", "sp-core", "sp-genesis-builder", "sp-inherents", @@ -4275,16 +4434,20 @@ name = "cumulus-test-service" version = "0.1.0" dependencies = [ "async-trait", - "clap 4.4.18", + "clap 4.5.3", "criterion 0.5.1", "cumulus-client-cli", + "cumulus-client-collator", + "cumulus-client-consensus-aura", "cumulus-client-consensus-common", + "cumulus-client-consensus-proposer", "cumulus-client-consensus-relay-chain", "cumulus-client-parachain-inherent", "cumulus-client-pov-recovery", "cumulus-client-service", "cumulus-pallet-parachain-system", "cumulus-primitives-core", + "cumulus-primitives-storage-weight-reclaim", "cumulus-relay-chain-inprocess-interface", "cumulus-relay-chain-interface", "cumulus-relay-chain-minimal-node", @@ -4295,7 +4458,6 @@ dependencies = [ "frame-system-rpc-runtime-api", "futures", "jsonrpsee", - "pallet-im-online", "pallet-timestamp", "pallet-transaction-payment", "parachains-common", @@ -4307,7 +4469,7 @@ dependencies = [ "polkadot-service", "polkadot-test-service", "portpicker", - "rand", + "rand 0.8.5", "rococo-parachain-runtime", "sc-basic-authorship", "sc-block-builder", @@ -4315,6 +4477,7 @@ dependencies = [ "sc-cli", "sc-client-api", "sc-consensus", + "sc-consensus-aura", "sc-executor", "sc-executor-common", "sc-executor-wasmtime", @@ -4331,6 +4494,7 @@ dependencies = [ "sp-authority-discovery", "sp-blockchain", "sp-consensus", + "sp-consensus-aura", "sp-consensus-grandpa", "sp-core", "sp-io", @@ -4348,16 +4512,34 @@ dependencies = [ ] [[package]] -name = "curve25519-dalek" -version = "2.1.3" +name = "curl" +version = "0.4.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a9b85542f99a2dfa2a1b8e192662741c9859a846b296bef1c92ef9b58b5a216" +checksum = "1e2161dd6eba090ff1594084e95fd67aeccf04382ffea77999ea94ed42ec67b6" dependencies = [ - "byteorder", - "digest 0.8.1", - "rand_core 0.5.1", - "subtle 2.4.1", - "zeroize", + "curl-sys", + "libc", + "openssl-probe", + "openssl-sys", + "schannel", + "socket2 0.5.6", + "windows-sys 0.52.0", +] + +[[package]] +name = "curl-sys" +version = "0.4.72+curl-8.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29cbdc8314c447d11e8fd156dcdd031d9e02a7a976163e396b548c03153bc9ea" +dependencies = [ + "cc", + "libc", + "libnghttp2-sys", + "libz-sys", + "openssl-sys", + "pkg-config", + "vcpkg", + "windows-sys 0.52.0", ] [[package]] @@ -4369,15 +4551,15 @@ dependencies = [ "byteorder", "digest 0.9.0", "rand_core 0.5.1", - "subtle 2.4.1", + "subtle 2.5.0", "zeroize", ] [[package]] name = "curve25519-dalek" -version = "4.1.1" +version = "4.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89b8c6a2e4b1f45971ad09761aafb85514a84744b67a95e32c3cc1352d1f65c" +checksum = "0a677b8922c94e01bdbb12126b0bc852f00447528dee1782229af9c720c3f348" dependencies = [ "cfg-if", "cpufeatures", @@ -4386,7 +4568,7 @@ dependencies = [ "fiat-crypto", "platforms", "rustc_version 0.4.0", - "subtle 2.4.1", + "subtle 2.5.0", "zeroize", ] @@ -4396,9 +4578,9 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "83fdaf97f4804dcebfa5862639bc9ce4121e82140bec2a987ac5140294865b5b" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.48", + "proc-macro2 1.0.75", + "quote 1.0.35", + "syn 2.0.53", ] [[package]] @@ -4435,10 +4617,10 @@ dependencies = [ "cc", "codespan-reporting", "once_cell", - "proc-macro2", - "quote", + "proc-macro2 1.0.75", + "quote 1.0.35", "scratch", - "syn 2.0.48", + "syn 2.0.53", ] [[package]] @@ -4453,9 +4635,9 @@ version = "1.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "50c49547d73ba8dcfd4ad7325d64c6d5391ff4224d498fc39a6f3f49825a530d" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.48", + "proc-macro2 1.0.75", + "quote 1.0.35", + "syn 2.0.53", ] [[package]] @@ -4542,8 +4724,8 @@ version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.75", + "quote 1.0.35", "syn 1.0.109", ] @@ -4553,11 +4735,22 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e79116f119dd1dba1abf1f3405f03b9b0e79a27a3883864bfebded8a3dc768cd" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.75", + "quote 1.0.35", "syn 1.0.109", ] +[[package]] +name = "derive-syn-parse" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d65d7ce8132b7c0e54497a4d9a55a1c2a0912a0d786cf894472ba818fba45762" +dependencies = [ + "proc-macro2 1.0.75", + "quote 1.0.35", + "syn 2.0.53", +] + [[package]] name = "derive_more" version = "0.99.17" @@ -4565,8 +4758,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" dependencies = [ "convert_case", - "proc-macro2", - "quote", + "proc-macro2 1.0.75", + "quote 1.0.35", "rustc_version 0.4.0", "syn 1.0.109", ] @@ -4610,7 +4803,7 @@ dependencies = [ "block-buffer 0.10.4", "const-oid", "crypto-common", - "subtle 2.4.1", + "subtle 2.5.0", ] [[package]] @@ -4661,9 +4854,9 @@ version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "487585f4d0c6655fe74905e2504d8ad6908e4db67f744eb140876906c2f3175d" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.48", + "proc-macro2 1.0.75", + "quote 1.0.35", + "syn 2.0.53", ] [[package]] @@ -4705,26 +4898,26 @@ checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" [[package]] name = "docify" -version = "0.2.7" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cc4fd38aaa9fb98ac70794c82a00360d1e165a87fbf96a8a91f9dfc602aaee2" +checksum = "43a2f138ad521dc4a2ced1a4576148a6a610b4c5923933b062a263130a6802ce" dependencies = [ "docify_macros", ] [[package]] name = "docify_macros" -version = "0.2.7" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63fa215f3a0d40fb2a221b3aa90d8e1fbb8379785a990cb60d62ac71ebdc6460" +checksum = "1a081e51fb188742f5a7a1164ad752121abcb22874b21e2c3b0dd040c515fdad" dependencies = [ "common-path", - "derive-syn-parse", + "derive-syn-parse 0.2.0", "once_cell", - "proc-macro2", - "quote", + "proc-macro2 1.0.75", + "quote 1.0.35", "regex", - "syn 2.0.48", + "syn 2.0.53", "termcolor", "toml 0.8.8", "walkdir", @@ -4770,8 +4963,8 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "558e40ea573c374cf53507fd240b7ee2f5477df7cfebdb97323ec61c719399c5" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.75", + "quote 1.0.35", "syn 1.0.109", ] @@ -4791,10 +4984,20 @@ dependencies = [ "digest 0.10.7", "elliptic-curve", "rfc6979", - "signature", + "serdect", + "signature 2.1.0", "spki", ] +[[package]] +name = "ed25519" +version = "1.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91cff35c70bba8a626e3185d8cd48cc11b5437e1a5bcd15b9b5fa3c64b6dfee7" +dependencies = [ + "signature 1.6.4", +] + [[package]] name = "ed25519" version = "2.2.2" @@ -4802,7 +5005,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "60f6d271ca33075c88028be6f04d502853d63a5ece419d269c15315d4fc1cf1d" dependencies = [ "pkcs8", - "signature", + "signature 2.1.0", +] + +[[package]] +name = "ed25519-dalek" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c762bae6dcaf24c4c84667b8579785430908723d5c889f469d76a41d59cc7a9d" +dependencies = [ + "curve25519-dalek 3.2.0", + "ed25519 1.5.3", + "rand 0.7.3", + "serde", + "sha2 0.9.9", + "zeroize", ] [[package]] @@ -4811,12 +5028,12 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1f628eaec48bfd21b865dc2950cfa014450c01d2fa2b69a86c2fd5844ec523c0" dependencies = [ - "curve25519-dalek 4.1.1", - "ed25519", + "curve25519-dalek 4.1.2", + "ed25519 2.2.2", "rand_core 0.6.4", "serde", "sha2 0.10.7", - "subtle 2.4.1", + "subtle 2.5.0", "zeroize", ] @@ -4840,8 +5057,8 @@ version = "4.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7d9ce6874da5d4415896cd45ffbc4d1cfc0c4f9c079427bd870742c30f2f65a9" dependencies = [ - "curve25519-dalek 4.1.1", - "ed25519", + "curve25519-dalek 4.1.2", + "ed25519 2.2.2", "hashbrown 0.14.3", "hex", "rand_core 0.6.4", @@ -4857,9 +5074,9 @@ checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" [[package]] name = "elliptic-curve" -version = "0.13.5" +version = "0.13.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "968405c8fdc9b3bf4df0a6638858cc0b52462836ab6b1c87377785dd09cf1c0b" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ "base16ct", "crypto-bigint", @@ -4870,7 +5087,8 @@ dependencies = [ "pkcs8", "rand_core 0.6.4", "sec1", - "subtle 2.4.1", + "serdect", + "subtle 2.5.0", "zeroize", ] @@ -4893,12 +5111,13 @@ dependencies = [ "parachains-common", "parity-scale-codec", "paste", + "polkadot-parachain-primitives", "polkadot-primitives", "polkadot-runtime-parachains", - "polkadot-service", "sc-consensus-grandpa", "sp-authority-discovery", "sp-consensus-babe", + "sp-consensus-beefy", "sp-core", "sp-runtime", "staging-xcm", @@ -4926,12 +5145,24 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c9720bba047d567ffc8a3cba48bf19126600e249ab7f128e9233e6376976a116" dependencies = [ - "heck", - "proc-macro2", - "quote", + "heck 0.4.1", + "proc-macro2 1.0.75", + "quote 1.0.35", "syn 1.0.109", ] +[[package]] +name = "enum-as-inner" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ffccbb6966c05b32ef8fbac435df276c4ae4d3dc55a8cd0eb9745e6c12f546a" +dependencies = [ + "heck 0.4.1", + "proc-macro2 1.0.75", + "quote 1.0.35", + "syn 2.0.53", +] + [[package]] name = "enumflags2" version = "0.7.7" @@ -4947,9 +5178,9 @@ version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e9a1f9f7d83e59740248a6e14ecf93929ade55027844dfcea78beafccc15745" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.48", + "proc-macro2 1.0.75", + "quote 1.0.35", + "syn 2.0.53", ] [[package]] @@ -4958,16 +5189,16 @@ version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2ad8cef1d801a4686bfd8919f0b30eac4c8e48968c437a6405ded4fb5272d2b" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.48", + "proc-macro2 1.0.75", + "quote 1.0.35", + "syn 2.0.53", ] [[package]] -name = "env_logger" -version = "0.8.4" +name = "env_filter" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a19187fea3ac7e84da7dacf48de0c45d63c6a76f9490dae389aead16c243fce3" +checksum = "a009aa4810eb158359dda09d0c87378e4bbb89b5a801f016885a4707ba24f7ea" dependencies = [ "log", "regex", @@ -4975,15 +5206,12 @@ dependencies = [ [[package]] name = "env_logger" -version = "0.9.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a12e6657c4c97ebab115a42dcee77225f7f482cdd841cf7088c657a42e9e00e7" +checksum = "a19187fea3ac7e84da7dacf48de0c45d63c6a76f9490dae389aead16c243fce3" dependencies = [ - "atty", - "humantime", "log", "regex", - "termcolor", ] [[package]] @@ -4999,6 +5227,19 @@ dependencies = [ "termcolor", ] +[[package]] +name = "env_logger" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38b35839ba51819680ba087cd351788c9a3c476841207e0b8cee0b04722343b9" +dependencies = [ + "anstream", + "anstyle", + "env_filter", + "humantime", + "log", +] + [[package]] name = "environmental" version = "1.1.4" @@ -5011,11 +5252,26 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" +[[package]] +name = "equivocation-detector" +version = "0.1.0" +dependencies = [ + "async-std", + "async-trait", + "bp-header-chain", + "finality-relay", + "frame-support", + "futures", + "log", + "num-traits", + "relay-utils", +] + [[package]] name = "erased-serde" -version = "0.3.30" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "837c0466252947ada828b975e12daf82e18bb5444e4df87be6038d4469e2a3d2" +checksum = "2b73807008a3c7f171cc40312f37d95ef0396e048b5848d775f54b1a4dd4a0d3" dependencies = [ "serde", ] @@ -5098,6 +5354,27 @@ version = "2.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" +[[package]] +name = "event-listener" +version = "4.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b215c49b2b248c855fb73579eb1f4f26c38ffdc12973e20e07b91d78d5646e" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite 0.2.12", +] + +[[package]] +name = "event-listener-strategy" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "958e4d70b6d5e81971bebec42271ec641e7ff4e170a6fa605f2b8a8b65cb97d3" +dependencies = [ + "event-listener 4.0.3", + "pin-project-lite 0.2.12", +] + [[package]] name = "exit-future" version = "0.2.0" @@ -5115,8 +5392,8 @@ checksum = "a718c0675c555c5f976fff4ea9e2c150fa06cefa201cadef87cfbf9324075881" dependencies = [ "blake3", "fs-err", - "proc-macro2", - "quote", + "proc-macro2 1.0.75", + "quote 1.0.35", ] [[package]] @@ -5127,9 +5404,9 @@ checksum = "5f86a749cf851891866c10515ef6c299b5c69661465e9c3bbe7e07a2b77fb0f7" dependencies = [ "blake2 0.10.6", "fs-err", - "proc-macro2", - "quote", - "syn 2.0.48", + "proc-macro2 1.0.75", + "quote 1.0.35", + "syn 2.0.53", ] [[package]] @@ -5142,12 +5419,6 @@ dependencies = [ "once_cell", ] -[[package]] -name = "fake-simd" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" - [[package]] name = "fallible-iterator" version = "0.2.0" @@ -5205,8 +5476,8 @@ dependencies = [ "expander 0.0.4", "indexmap 1.9.3", "proc-macro-crate 1.3.1", - "proc-macro2", - "quote", + "proc-macro2 1.0.75", + "quote 1.0.35", "syn 1.0.109", "thiserror", ] @@ -5244,7 +5515,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" dependencies = [ "rand_core 0.6.4", - "subtle 2.4.1", + "subtle 2.5.0", ] [[package]] @@ -5257,7 +5528,7 @@ dependencies = [ "ark-poly", "ark-serialize 0.4.2", "ark-std 0.4.0", - "merlin 3.0.0", + "merlin", ] [[package]] @@ -5301,10 +5572,25 @@ dependencies = [ "num-traits", "parity-scale-codec", "parking_lot 0.12.1", - "rand", + "rand 0.8.5", "scale-info", ] +[[package]] +name = "finality-relay" +version = "0.1.0" +dependencies = [ + "async-std", + "async-trait", + "backoff", + "bp-header-chain", + "futures", + "log", + "num-traits", + "parking_lot 0.12.1", + "relay-utils", +] + [[package]] name = "findshlibs" version = "0.10.2" @@ -5324,7 +5610,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" dependencies = [ "byteorder", - "rand", + "rand 0.8.5", "rustc-hex", "static_assertions", ] @@ -5361,6 +5647,21 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + [[package]] name = "fork-tree" version = "12.0.0" @@ -5393,36 +5694,6 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c2141d6d6c8512188a7891b4b01590a45f6dac67afb4f255c4124dbb86d4eaa" -[[package]] -name = "frame" -version = "0.0.1-dev" -dependencies = [ - "docify", - "frame-executive", - "frame-support", - "frame-system", - "frame-system-rpc-runtime-api", - "log", - "pallet-examples", - "parity-scale-codec", - "scale-info", - "simple-mermaid", - "sp-api", - "sp-arithmetic", - "sp-block-builder", - "sp-consensus-aura", - "sp-consensus-grandpa", - "sp-core", - "sp-inherents", - "sp-io", - "sp-offchain", - "sp-runtime", - "sp-session", - "sp-std 14.0.0", - "sp-transaction-pool", - "sp-version", -] - [[package]] name = "frame-benchmarking" version = "28.0.0" @@ -5470,9 +5741,10 @@ dependencies = [ "linked-hash-map", "log", "parity-scale-codec", - "rand", + "rand 0.8.5", "rand_pcg", "sc-block-builder", + "sc-chain-spec", "sc-cli", "sc-client-api", "sc-client-db", @@ -5486,6 +5758,7 @@ dependencies = [ "sp-core", "sp-database", "sp-externalities 0.25.0", + "sp-genesis-builder", "sp-inherents", "sp-io", "sp-keystore", @@ -5520,11 +5793,11 @@ dependencies = [ "frame-support", "parity-scale-codec", "proc-macro-crate 3.0.0", - "proc-macro2", - "quote", + "proc-macro2 1.0.75", + "quote 1.0.35", "scale-info", "sp-arithmetic", - "syn 2.0.48", + "syn 2.0.53", "trybuild", ] @@ -5536,7 +5809,7 @@ dependencies = [ "frame-support", "frame-system", "parity-scale-codec", - "rand", + "rand 0.8.5", "scale-info", "sp-arithmetic", "sp-core", @@ -5550,13 +5823,13 @@ dependencies = [ name = "frame-election-solution-type-fuzzer" version = "2.0.0-alpha.5" dependencies = [ - "clap 4.4.18", + "clap 4.5.3", "frame-election-provider-solution-type", "frame-election-provider-support", "frame-support", "honggfuzz", "parity-scale-codec", - "rand", + "rand 0.8.5", "scale-info", "sp-arithmetic", "sp-npos-elections", @@ -5567,6 +5840,7 @@ dependencies = [ name = "frame-executive" version = "28.0.0" dependencies = [ + "aquamarine 0.3.3", "array-bytes 6.1.0", "frame-support", "frame-system", @@ -5597,6 +5871,20 @@ dependencies = [ "serde", ] +[[package]] +name = "frame-omni-bencher" +version = "0.1.0" +dependencies = [ + "clap 4.5.3", + "cumulus-primitives-proof-size-hostfunction", + "env_logger 0.11.3", + "frame-benchmarking-cli", + "log", + "sc-cli", + "sp-runtime", + "sp-statement-store", +] + [[package]] name = "frame-remote-externalities" version = "0.35.0" @@ -5623,7 +5911,7 @@ dependencies = [ name = "frame-support" version = "28.0.0" dependencies = [ - "aquamarine", + "aquamarine 0.5.0", "array-bytes 6.1.0", "assert_matches", "bitflags 1.3.2", @@ -5657,6 +5945,7 @@ dependencies = [ "sp-staking", "sp-state-machine", "sp-std 14.0.0", + "sp-timestamp", "sp-tracing 16.0.0", "sp-weights", "static_assertions", @@ -5669,17 +5958,17 @@ version = "23.0.0" dependencies = [ "Inflector", "cfg-expr", - "derive-syn-parse", + "derive-syn-parse 0.2.0", "expander 2.0.0", "frame-support-procedural-tools", "itertools 0.10.5", "macro_magic", "proc-macro-warning", - "proc-macro2", - "quote", + "proc-macro2 1.0.75", + "quote 1.0.35", "regex", "sp-crypto-hashing", - "syn 2.0.48", + "syn 2.0.53", ] [[package]] @@ -5688,18 +5977,18 @@ version = "10.0.0" dependencies = [ "frame-support-procedural-tools-derive", "proc-macro-crate 3.0.0", - "proc-macro2", - "quote", - "syn 2.0.48", + "proc-macro2 1.0.75", + "quote 1.0.35", + "syn 2.0.53", ] [[package]] name = "frame-support-procedural-tools-derive" version = "11.0.0" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.48", + "proc-macro2 1.0.75", + "quote 1.0.35", + "syn 2.0.53", ] [[package]] @@ -5759,8 +6048,8 @@ dependencies = [ name = "frame-support-test-stg-frame-crate" version = "0.1.0" dependencies = [ - "frame", "parity-scale-codec", + "polkadot-sdk-frame", "scale-info", ] @@ -5862,9 +6151,9 @@ checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" [[package]] name = "futures" -version = "0.3.28" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40" +checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" dependencies = [ "futures-channel", "futures-core", @@ -5893,9 +6182,9 @@ checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" [[package]] name = "futures-executor" -version = "0.3.28" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0" +checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" dependencies = [ "futures-core", "futures-task", @@ -5930,9 +6219,9 @@ version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.48", + "proc-macro2 1.0.75", + "quote 1.0.35", + "syn 2.0.53", ] [[package]] @@ -6062,7 +6351,7 @@ version = "0.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6ea1015b5a70616b688dc230cfe50c8af89d972cb132d5a622814d29773b10b9" dependencies = [ - "rand", + "rand 0.8.5", "rand_core 0.6.4", ] @@ -6113,6 +6402,18 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" +[[package]] +name = "gloo-timers" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b995a66bb87bebce9a0f4a95aed01daca4872c050bfcb21653361c03bc35e5c" +dependencies = [ + "futures-channel", + "futures-core", + "js-sys", + "wasm-bindgen", +] + [[package]] name = "glutton-westend-runtime" version = "3.0.0" @@ -6159,6 +6460,24 @@ dependencies = [ "testnet-parachains-constants", ] +[[package]] +name = "governor" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "821239e5672ff23e2a7060901fa622950bbd80b649cdaadd78d1c1767ed14eb4" +dependencies = [ + "cfg-if", + "dashmap", + "futures", + "futures-timer", + "no-std-compat", + "nonzero_ext", + "parking_lot 0.12.1", + "quanta", + "rand 0.8.5", + "smallvec", +] + [[package]] name = "group" version = "0.13.0" @@ -6167,14 +6486,14 @@ checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" dependencies = [ "ff", "rand_core 0.6.4", - "subtle 2.4.1", + "subtle 2.5.0", ] [[package]] name = "h2" -version = "0.3.24" +version = "0.3.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb2c4422095b67ee78da96fbb51a4cc413b3b25883c7717ff7ca1ab31022c9c9" +checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" dependencies = [ "bytes", "fnv", @@ -6182,7 +6501,7 @@ dependencies = [ "futures-sink", "futures-util", "http", - "indexmap 2.0.0", + "indexmap 2.2.3", "slab", "tokio", "tokio-util", @@ -6197,9 +6516,9 @@ checksum = "eabb4a44450da02c90444cf74558da904edde8fb4e9035a9a6a4e15445af0bd7" [[package]] name = "handlebars" -version = "4.3.7" +version = "5.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83c3372087601b532857d332f5957cbae686da52bb7810bf038c3e3c3cc2fa0d" +checksum = "ab283476b99e66691dee3f1640fea91487a8d81f50fb5ecc75538f8f8879a1e4" dependencies = [ "log", "pest", @@ -6230,7 +6549,7 @@ version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" dependencies = [ - "ahash 0.7.6", + "ahash 0.7.8", ] [[package]] @@ -6239,7 +6558,7 @@ version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" dependencies = [ - "ahash 0.8.7", + "ahash 0.8.8", ] [[package]] @@ -6248,7 +6567,7 @@ version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" dependencies = [ - "ahash 0.8.7", + "ahash 0.8.8", "allocator-api2", "serde", ] @@ -6262,12 +6581,27 @@ dependencies = [ "hashbrown 0.14.3", ] +[[package]] +name = "heck" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" +dependencies = [ + "unicode-segmentation", +] + [[package]] name = "heck" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + [[package]] name = "hermit-abi" version = "0.1.19" @@ -6289,6 +6623,12 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +[[package]] +name = "hex-conservative" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30ed443af458ccb6d81c1e7e661545f94d3176752fb1df2f543b902a1e0f51e2" + [[package]] name = "hex-literal" version = "0.4.1" @@ -6314,16 +6654,6 @@ dependencies = [ "digest 0.9.0", ] -[[package]] -name = "hmac" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a2a2320eb7ec0ebe8da8f744d7812d9fc4cb4d09344ac01898dbcb6a20ae69b" -dependencies = [ - "crypto-mac 0.11.1", - "digest 0.9.0", -] - [[package]] name = "hmac" version = "0.12.1" @@ -6448,9 +6778,9 @@ dependencies = [ "hyper", "log", "rustls 0.21.6", - "rustls-native-certs", + "rustls-native-certs 0.6.3", "tokio", - "tokio-rustls", + "tokio-rustls 0.24.1", ] [[package]] @@ -6570,8 +6900,8 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "11d7a9f6330b71fea57921c9b61c47ee6e84f72d394754eff6163ae67e7395eb" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.75", + "quote 1.0.35", "syn 1.0.109", ] @@ -6590,8 +6920,8 @@ version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b139284b5cf57ecfa712bcc66950bb635b31aff41c188e8a4cfc758eca374a3f" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.75", + "quote 1.0.35", ] [[package]] @@ -6613,9 +6943,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.0.0" +version = "2.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5477fe2230a79769d8dc68e0eabf5437907c0457a5614a9e8dddb67f65eb65d" +checksum = "233cf39063f058ea2caae4091bf4a3ef70a653afbc026f5c4a4135d114e3c177" dependencies = [ "equivalent", "hashbrown 0.14.3", @@ -6696,7 +7026,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b58db92f96b720de98181bbbe63c831e87005ab460c1bf306eb2622b4707997f" dependencies = [ - "socket2 0.5.3", + "socket2 0.5.6", "widestring", "windows-sys 0.48.0", "winreg", @@ -6728,6 +7058,33 @@ dependencies = [ "winapi", ] +[[package]] +name = "isahc" +version = "1.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "334e04b4d781f436dc315cb1e7515bd96826426345d498149e4bde36b67f8ee9" +dependencies = [ + "async-channel", + "castaway", + "crossbeam-utils", + "curl", + "curl-sys", + "encoding_rs", + "event-listener 2.5.3", + "futures-lite", + "http", + "log", + "mime", + "once_cell", + "polling", + "slab", + "sluice", + "tracing", + "tracing-futures", + "url", + "waker-fn", +] + [[package]] name = "itertools" version = "0.10.5" @@ -6776,11 +7133,22 @@ version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "078e285eafdfb6c4b434e0d31e8cfcb5115b651496faca5749b88fafd4f23bfd" +[[package]] +name = "jsonpath_lib" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eaa63191d68230cccb81c5aa23abd53ed64d83337cacbb25a7b8c7979523774f" +dependencies = [ + "log", + "serde", + "serde_json", +] + [[package]] name = "jsonrpsee" -version = "0.20.3" +version = "0.22.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "affdc52f7596ccb2d7645231fc6163bb314630c989b64998f3699a28b4d5d4dc" +checksum = "87f3ae45a64cfc0882934f963be9431b2a165d667f53140358181f262aca0702" dependencies = [ "jsonrpsee-core", "jsonrpsee-http-client", @@ -6794,19 +7162,20 @@ dependencies = [ [[package]] name = "jsonrpsee-client-transport" -version = "0.20.3" +version = "0.22.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b005c793122d03217da09af68ba9383363caa950b90d3436106df8cabce935" +checksum = "455fc882e56f58228df2aee36b88a1340eafd707c76af2fa68cf94b37d461131" dependencies = [ "futures-util", "http", "jsonrpsee-core", "pin-project", - "rustls-native-certs", + "rustls-native-certs 0.7.0", + "rustls-pki-types", "soketto", "thiserror", "tokio", - "tokio-rustls", + "tokio-rustls 0.25.0", "tokio-util", "tracing", "url", @@ -6814,12 +7183,12 @@ dependencies = [ [[package]] name = "jsonrpsee-core" -version = "0.20.3" +version = "0.22.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da2327ba8df2fdbd5e897e2b5ed25ce7f299d345b9736b6828814c3dbd1fd47b" +checksum = "b75568f4f9696e3a47426e1985b548e1a9fcb13372a5e320372acaf04aca30d1" dependencies = [ "anyhow", - "async-lock", + "async-lock 3.3.0", "async-trait", "beef", "futures-timer", @@ -6827,21 +7196,22 @@ dependencies = [ "hyper", "jsonrpsee-types", "parking_lot 0.12.1", - "rand", + "pin-project", + "rand 0.8.5", "rustc-hash", "serde", "serde_json", - "soketto", "thiserror", "tokio", + "tokio-stream", "tracing", ] [[package]] name = "jsonrpsee-http-client" -version = "0.20.3" +version = "0.22.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f80c17f62c7653ce767e3d7288b793dfec920f97067ceb189ebdd3570f2bc20" +checksum = "9e7a95e346f55df84fb167b7e06470e196e7d5b9488a21d69c5d9732043ba7ba" dependencies = [ "async-trait", "hyper", @@ -6859,28 +7229,29 @@ dependencies = [ [[package]] name = "jsonrpsee-proc-macros" -version = "0.20.3" +version = "0.22.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29110019693a4fa2dbda04876499d098fa16d70eba06b1e6e2b3f1b251419515" +checksum = "30ca066e73dd70294aebc5c2675d8ffae43be944af027c857ce0d4c51785f014" dependencies = [ - "heck", - "proc-macro-crate 1.3.1", - "proc-macro2", - "quote", - "syn 1.0.109", + "heck 0.4.1", + "proc-macro-crate 3.0.0", + "proc-macro2 1.0.75", + "quote 1.0.35", + "syn 2.0.53", ] [[package]] name = "jsonrpsee-server" -version = "0.20.3" +version = "0.22.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82c39a00449c9ef3f50b84fc00fc4acba20ef8f559f07902244abf4c15c5ab9c" +checksum = "0e29c1bd1f9bba83c864977c73404e505f74f730fa0db89dd490ec174e36d7f0" dependencies = [ "futures-util", "http", "hyper", "jsonrpsee-core", "jsonrpsee-types", + "pin-project", "route-recognizer", "serde", "serde_json", @@ -6895,23 +7266,22 @@ dependencies = [ [[package]] name = "jsonrpsee-types" -version = "0.20.3" +version = "0.22.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5be0be325642e850ed0bdff426674d2e66b2b7117c9be23a7caef68a2902b7d9" +checksum = "3467fd35feeee179f71ab294516bdf3a81139e7aeebdd860e46897c12e1a3368" dependencies = [ "anyhow", "beef", "serde", "serde_json", "thiserror", - "tracing", ] [[package]] name = "jsonrpsee-ws-client" -version = "0.20.3" +version = "0.22.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bca9cb3933ccae417eb6b08c3448eb1cb46e39834e5b503e395e5e5bd08546c0" +checksum = "68ca71e74983f624c0cb67828e480a981586074da8ad3a2f214c6a3f884edab9" dependencies = [ "http", "jsonrpsee-client-transport", @@ -6922,14 +7292,15 @@ dependencies = [ [[package]] name = "k256" -version = "0.13.1" +version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cadb76004ed8e97623117f3df85b17aaa6626ab0b0831e6573f104df16cd1bcc" +checksum = "956ff9b67e26e1a6a866cb758f12c6f8746208489e3e4a4b5580802f2f0a587b" dependencies = [ "cfg-if", "ecdsa", "elliptic-curve", "once_cell", + "serdect", "sha2 0.10.7", ] @@ -6998,6 +7369,7 @@ dependencies = [ "pallet-election-provider-multi-phase", "pallet-election-provider-support-benchmarking", "pallet-elections-phragmen", + "pallet-example-mbm", "pallet-example-tasks", "pallet-fast-unstake", "pallet-glutton", @@ -7009,6 +7381,7 @@ dependencies = [ "pallet-lottery", "pallet-membership", "pallet-message-queue", + "pallet-migrations", "pallet-mixnet", "pallet-mmr", "pallet-multisig", @@ -7021,6 +7394,7 @@ dependencies = [ "pallet-nomination-pools-runtime-api", "pallet-offences", "pallet-offences-benchmarking", + "pallet-parameters", "pallet-preimage", "pallet-proxy", "pallet-ranked-collective", @@ -7080,6 +7454,15 @@ dependencies = [ "substrate-wasm-builder", ] +[[package]] +name = "kv-log-macro" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0de8b303297635ad57c9f5059fd9cee7a47f8e8daa09df0fcd07dd39fb22977f" +dependencies = [ + "log", +] + [[package]] name = "kvdb" version = "0.13.0" @@ -7204,6 +7587,16 @@ version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f7012b1bbb0719e1097c47611d3898568c546d597c2e74d66f6087edd5233ff4" +[[package]] +name = "libnghttp2-sys" +version = "0.1.9+1.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b57e858af2798e167e709b9d969325b6d8e9d50232fcbc494d7d54f976854a64" +dependencies = [ + "cc", + "libc", +] + [[package]] name = "libp2p" version = "0.51.4" @@ -7281,7 +7674,7 @@ dependencies = [ "parking_lot 0.12.1", "pin-project", "quick-protobuf", - "rand", + "rand 0.8.5", "rw-stream-sink", "smallvec", "thiserror", @@ -7300,7 +7693,7 @@ dependencies = [ "log", "parking_lot 0.12.1", "smallvec", - "trust-dns-resolver", + "trust-dns-resolver 0.22.0", ] [[package]] @@ -7332,12 +7725,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "276bb57e7af15d8f100d3c11cbdd32c6752b7eef4ba7a18ecf464972c07abcce" dependencies = [ "bs58 0.4.0", - "ed25519-dalek", + "ed25519-dalek 2.1.0", "log", "multiaddr", "multihash 0.17.0", "quick-protobuf", - "rand", + "rand 0.8.5", "sha2 0.10.7", "thiserror", "zeroize", @@ -7362,7 +7755,7 @@ dependencies = [ "libp2p-swarm", "log", "quick-protobuf", - "rand", + "rand 0.8.5", "sha2 0.10.7", "smallvec", "thiserror", @@ -7384,11 +7777,11 @@ dependencies = [ "libp2p-identity", "libp2p-swarm", "log", - "rand", + "rand 0.8.5", "smallvec", "socket2 0.4.9", "tokio", - "trust-dns-proto", + "trust-dns-proto 0.22.0", "void", ] @@ -7420,7 +7813,7 @@ dependencies = [ "log", "once_cell", "quick-protobuf", - "rand", + "rand 0.8.5", "sha2 0.10.7", "snow", "static_assertions", @@ -7442,7 +7835,7 @@ dependencies = [ "libp2p-core", "libp2p-swarm", "log", - "rand", + "rand 0.8.5", "void", ] @@ -7462,7 +7855,7 @@ dependencies = [ "log", "parking_lot 0.12.1", "quinn-proto", - "rand", + "rand 0.8.5", "rustls 0.20.8", "thiserror", "tokio", @@ -7480,7 +7873,7 @@ dependencies = [ "libp2p-core", "libp2p-identity", "libp2p-swarm", - "rand", + "rand 0.8.5", "smallvec", ] @@ -7499,7 +7892,7 @@ dependencies = [ "libp2p-identity", "libp2p-swarm-derive", "log", - "rand", + "rand 0.8.5", "smallvec", "tokio", "void", @@ -7511,8 +7904,8 @@ version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fba456131824ab6acd4c7bf61e9c0f0a3014b5fc9868ccb8e10d344594cdc4f" dependencies = [ - "heck", - "quote", + "heck 0.4.1", + "quote 1.0.35", "syn 1.0.109", ] @@ -7547,7 +7940,7 @@ dependencies = [ "rustls 0.20.8", "thiserror", "webpki", - "x509-parser", + "x509-parser 0.14.0", "yasna", ] @@ -7625,7 +8018,7 @@ dependencies = [ "libsecp256k1-core", "libsecp256k1-gen-ecmult", "libsecp256k1-gen-genmult", - "rand", + "rand 0.8.5", "serde", "sha2 0.9.9", "typenum", @@ -7639,7 +8032,7 @@ checksum = "5be9b9bb642d8522a44d533eab56c16c738301965504753b03ad1de3425d5451" dependencies = [ "crunchy", "digest 0.9.0", - "subtle 2.4.1", + "subtle 2.5.0", ] [[package]] @@ -7667,6 +8060,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d97137b25e321a73eef1418d1d5d2eda4d77e12813f8e6dead84bc52c5870a7b" dependencies = [ "cc", + "libc", "pkg-config", "vcpkg", ] @@ -7752,6 +8146,60 @@ dependencies = [ "paste", ] +[[package]] +name = "litep2p" +version = "0.3.0" +source = "git+https://github.com/paritytech/litep2p?branch=master#b142c9eb611fb2fe78d2830266a3675b37299ceb" +dependencies = [ + "async-trait", + "bs58 0.4.0", + "bytes", + "cid 0.10.1", + "ed25519-dalek 1.0.1", + "futures", + "futures-timer", + "hex-literal", + "indexmap 2.2.3", + "libc", + "mockall", + "multiaddr", + "multihash 0.17.0", + "network-interface", + "nohash-hasher", + "parking_lot 0.12.1", + "pin-project", + "prost 0.11.9", + "prost-build", + "quinn", + "rand 0.8.5", + "rcgen", + "ring 0.16.20", + "rustls 0.20.8", + "serde", + "sha2 0.10.7", + "simple-dns", + "smallvec", + "snow", + "socket2 0.5.6", + "static_assertions", + "str0m", + "thiserror", + "tokio", + "tokio-stream", + "tokio-tungstenite 0.20.1", + "tokio-util", + "tracing", + "trust-dns-resolver 0.23.2", + "uint", + "unsigned-varint", + "url", + "webpki", + "x25519-dalek 2.0.0", + "x509-parser 0.15.1", + "yasna", + "zeroize", +] + [[package]] name = "lock_api" version = "0.4.10" @@ -7764,9 +8212,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.20" +version = "0.4.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" +checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" dependencies = [ "serde", "value-bag", @@ -7834,6 +8282,15 @@ dependencies = [ "libc", ] +[[package]] +name = "mach2" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19b955cdeb2a02b9117f121ce63aa52d08ade45de53e48fe6a38b39c10f6f709" +dependencies = [ + "libc", +] + [[package]] name = "macro_magic" version = "0.5.0" @@ -7842,8 +8299,8 @@ checksum = "e03844fc635e92f3a0067e25fa4bf3e3dbf3f2927bf3aa01bb7bc8f1c428949d" dependencies = [ "macro_magic_core", "macro_magic_macros", - "quote", - "syn 2.0.48", + "quote 1.0.35", + "syn 2.0.53", ] [[package]] @@ -7853,11 +8310,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "468155613a44cfd825f1fb0ffa532b018253920d404e6fca1e8d43155198a46d" dependencies = [ "const-random", - "derive-syn-parse", + "derive-syn-parse 0.1.5", "macro_magic_core_macros", - "proc-macro2", - "quote", - "syn 2.0.48", + "proc-macro2 1.0.75", + "quote 1.0.35", + "syn 2.0.53", ] [[package]] @@ -7866,9 +8323,9 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ea73aa640dc01d62a590d48c0c3521ed739d53b27f919b25c3551e233481654" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.48", + "proc-macro2 1.0.75", + "quote 1.0.35", + "syn 2.0.53", ] [[package]] @@ -7878,8 +8335,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ef9d79ae96aaba821963320eb2b6e34d17df1e5a83d8a1985c29cc5be59577b3" dependencies = [ "macro_magic_core", - "quote", - "syn 2.0.48", + "quote 1.0.35", + "syn 2.0.53", ] [[package]] @@ -7999,26 +8456,32 @@ dependencies = [ [[package]] name = "merlin" -version = "2.0.1" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e261cf0f8b3c42ded9f7d2bb59dea03aa52bc8a1cbc7482f9fc3fd1229d3b42" +checksum = "58c38e2799fc0978b65dfff8023ec7843e2330bb462f19198840b34b6582397d" dependencies = [ "byteorder", "keccak", - "rand_core 0.5.1", + "rand_core 0.6.4", "zeroize", ] [[package]] -name = "merlin" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58c38e2799fc0978b65dfff8023ec7843e2330bb462f19198840b34b6582397d" +name = "messages-relay" +version = "0.1.0" dependencies = [ - "byteorder", - "keccak", - "rand_core 0.6.4", - "zeroize", + "async-std", + "async-trait", + "bp-messages", + "env_logger 0.11.3", + "finality-relay", + "futures", + "hex", + "log", + "num-traits", + "parking_lot 0.12.1", + "relay-utils", + "sp-arithmetic", ] [[package]] @@ -8028,7 +8491,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69672161530e8aeca1d1400fbf3f1a1747ff60ea604265a4e906c2442df20532" dependencies = [ "futures", - "rand", + "rand 0.8.5", "thrift", ] @@ -8045,15 +8508,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] -name = "minimal-node" -version = "4.0.0-dev" +name = "minimal-template-node" +version = "0.0.0" dependencies = [ - "clap 4.4.18", - "frame", + "clap 4.5.3", "futures", "futures-timer", "jsonrpsee", - "minimal-runtime", + "minimal-template-runtime", + "polkadot-sdk-frame", "sc-basic-authorship", "sc-cli", "sc-client-api", @@ -8080,19 +8543,20 @@ dependencies = [ ] [[package]] -name = "minimal-runtime" -version = "0.1.0" +name = "minimal-template-runtime" +version = "0.0.0" dependencies = [ - "frame", - "frame-support", "pallet-balances", + "pallet-minimal-template", "pallet-sudo", "pallet-timestamp", "pallet-transaction-payment", "pallet-transaction-payment-rpc-runtime-api", "parity-scale-codec", + "polkadot-sdk-frame", "scale-info", "sp-genesis-builder", + "sp-runtime", "substrate-wasm-builder", ] @@ -8107,9 +8571,9 @@ dependencies = [ [[package]] name = "mio" -version = "0.8.8" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2" +checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" dependencies = [ "libc", "wasi 0.11.0+wasi-snapshot-preview1", @@ -8127,16 +8591,16 @@ dependencies = [ "bitflags 1.3.2", "blake2 0.10.6", "c2-chacha", - "curve25519-dalek 4.1.1", + "curve25519-dalek 4.1.2", "either", "hashlink", "lioness", "log", "parking_lot 0.12.1", - "rand", + "rand 0.8.5", "rand_chacha 0.3.1", "rand_distr", - "subtle 2.4.1", + "subtle 2.5.0", "thiserror", "zeroize", ] @@ -8201,8 +8665,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "22ce75669015c4f47b289fd4d4f56e894e4c96003ffdf3ac51313126f94c6cbb" dependencies = [ "cfg-if", - "proc-macro2", - "quote", + "proc-macro2 1.0.75", + "quote 1.0.35", "syn 1.0.109", ] @@ -8259,10 +8723,14 @@ version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cfd8a792c1694c6da4f68db0a9d707c72bd260994da179e6030a5dcee00bb815" dependencies = [ + "blake2b_simd", + "blake2s_simd", + "blake3", "core2", "digest 0.10.7", "multihash-derive 0.8.0", "sha2 0.10.7", + "sha3", "unsigned-varint", ] @@ -8304,8 +8772,8 @@ checksum = "fc076939022111618a5026d3be019fd8b366e76314538ff9a1b59ffbcbf98bcd" dependencies = [ "proc-macro-crate 1.3.1", "proc-macro-error", - "proc-macro2", - "quote", + "proc-macro2 1.0.75", + "quote 1.0.35", "syn 1.0.109", "synstructure", ] @@ -8329,8 +8797,8 @@ checksum = "d38685e08adb338659871ecfc6ee47ba9b22dcc8abcf6975d379cc49145c3040" dependencies = [ "proc-macro-crate 1.3.1", "proc-macro-error", - "proc-macro2", - "quote", + "proc-macro2 1.0.75", + "quote 1.0.35", "syn 1.0.109", "synstructure", ] @@ -8377,8 +8845,8 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "91761aed67d03ad966ef783ae962ef9bbaca728d2dd7ceb7939ec110fffad998" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.75", + "quote 1.0.35", "syn 1.0.109", ] @@ -8389,7 +8857,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7bddcd3bf5144b6392de80e04c347cd7fab2508f6df16a85fc496ecd5cec39bc" dependencies = [ "clap 3.2.25", - "rand", + "rand 0.8.5", ] [[package]] @@ -8464,6 +8932,18 @@ dependencies = [ "tokio", ] +[[package]] +name = "network-interface" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae72fd9dbd7f55dda80c00d66acc3b2130436fcba9ea89118fc508eaae48dfb0" +dependencies = [ + "cc", + "libc", + "thiserror", + "winapi", +] + [[package]] name = "nix" version = "0.24.3" @@ -8500,6 +8980,12 @@ dependencies = [ "libc", ] +[[package]] +name = "no-std-compat" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b93853da6d84c2e3c7d730d6473e8817692dd89be387eb01b94d7f108ecb5b8c" + [[package]] name = "no-std-net" version = "0.6.0" @@ -8511,7 +8997,7 @@ name = "node-bench" version = "0.9.0-dev" dependencies = [ "array-bytes 6.1.0", - "clap 4.4.18", + "clap 4.5.3", "derive_more", "fs_extra", "futures", @@ -8524,7 +9010,7 @@ dependencies = [ "node-primitives", "node-testing", "parity-db", - "rand", + "rand 0.8.5", "sc-basic-authorship", "sc-client-api", "sc-transaction-pool", @@ -8588,60 +9074,16 @@ dependencies = [ name = "node-runtime-generate-bags" version = "3.0.0" dependencies = [ - "clap 4.4.18", + "clap 4.5.3", "generate-bags", "kitchensink-runtime", ] -[[package]] -name = "node-template" -version = "4.0.0-dev" -dependencies = [ - "clap 4.4.18", - "frame-benchmarking", - "frame-benchmarking-cli", - "frame-system", - "futures", - "jsonrpsee", - "node-template-runtime", - "pallet-transaction-payment", - "pallet-transaction-payment-rpc", - "sc-basic-authorship", - "sc-cli", - "sc-client-api", - "sc-consensus", - "sc-consensus-aura", - "sc-consensus-grandpa", - "sc-executor", - "sc-network", - "sc-offchain", - "sc-rpc-api", - "sc-service", - "sc-telemetry", - "sc-transaction-pool", - "sc-transaction-pool-api", - "serde_json", - "sp-api", - "sp-block-builder", - "sp-blockchain", - "sp-consensus-aura", - "sp-consensus-grandpa", - "sp-core", - "sp-inherents", - "sp-io", - "sp-keyring", - "sp-runtime", - "sp-timestamp", - "substrate-build-script-utils", - "substrate-frame-rpc-system", - "try-runtime-cli", -] - [[package]] name = "node-template-release" version = "3.0.0" dependencies = [ - "clap 4.4.18", + "clap 4.5.3", "flate2", "fs_extra", "glob", @@ -8651,45 +9093,6 @@ dependencies = [ "toml_edit 0.19.15", ] -[[package]] -name = "node-template-runtime" -version = "4.0.0-dev" -dependencies = [ - "frame-benchmarking", - "frame-executive", - "frame-support", - "frame-system", - "frame-system-benchmarking", - "frame-system-rpc-runtime-api", - "frame-try-runtime", - "pallet-aura", - "pallet-balances", - "pallet-grandpa", - "pallet-sudo", - "pallet-template", - "pallet-timestamp", - "pallet-transaction-payment", - "pallet-transaction-payment-rpc-runtime-api", - "parity-scale-codec", - "scale-info", - "serde_json", - "sp-api", - "sp-block-builder", - "sp-consensus-aura", - "sp-consensus-grandpa", - "sp-core", - "sp-genesis-builder", - "sp-inherents", - "sp-offchain", - "sp-runtime", - "sp-session", - "sp-std 14.0.0", - "sp-storage 19.0.0", - "sp-transaction-pool", - "sp-version", - "substrate-wasm-builder", -] - [[package]] name = "node-testing" version = "3.0.0-dev" @@ -8750,12 +9153,27 @@ dependencies = [ "minimal-lexical", ] +[[package]] +name = "nonzero_ext" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38bf9645c8b145698bb0b18a4637dcacbc421ea49bef2317e4fd8065a387cf21" + [[package]] name = "normalize-line-endings" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "61807f77802ff30975e01f4f071c8ba10c022052f98b3294119f3e615d13e5be" +[[package]] +name = "ntapi" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8a3895c6391c39d7fe7ebc444a87eb2991b2a0bc718fdabd071eec617fc68e4" +dependencies = [ + "winapi", +] + [[package]] name = "nu-ansi-term" version = "0.46.0" @@ -8863,6 +9281,15 @@ dependencies = [ "libc", ] +[[package]] +name = "num_threads" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9" +dependencies = [ + "libc", +] + [[package]] name = "number_prefix" version = "0.4.0" @@ -8901,9 +9328,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.18.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "oorandom" @@ -8923,12 +9350,60 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" +[[package]] +name = "openssl" +version = "0.10.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95a0481286a310808298130d22dd1fef0fa571e05a8f44ec801801e84b216b1f" +dependencies = [ + "bitflags 2.4.0", + "cfg-if", + "foreign-types", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +dependencies = [ + "proc-macro2 1.0.75", + "quote 1.0.35", + "syn 2.0.53", +] + [[package]] name = "openssl-probe" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" +[[package]] +name = "openssl-src" +version = "300.2.3+3.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cff92b6f71555b61bb9315f7c64da3ca43d87531622120fea0195fc761b4843" +dependencies = [ + "cc", +] + +[[package]] +name = "openssl-sys" +version = "0.9.102" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c597637d56fbc83893a35eb0dd04b2b8e7a50c91e64e9493e398b5df4fb45fa2" +dependencies = [ + "cc", + "libc", + "openssl-src", + "pkg-config", + "vcpkg", +] + [[package]] name = "option-ext" version = "0.2.0" @@ -8959,12 +9434,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eedb646674596266dc9bb2b5c7eea7c36b32ecc7777eba0d510196972d72c4fd" dependencies = [ "expander 2.0.0", - "indexmap 2.0.0", + "indexmap 2.2.3", "itertools 0.11.0", "petgraph", "proc-macro-crate 1.3.1", - "proc-macro2", - "quote", + "proc-macro2 1.0.75", + "quote 1.0.35", "syn 1.0.109", ] @@ -9207,7 +9682,7 @@ dependencies = [ name = "pallet-bags-list" version = "27.0.0" dependencies = [ - "aquamarine", + "aquamarine 0.5.0", "docify", "frame-benchmarking", "frame-election-provider-support", @@ -9231,7 +9706,7 @@ dependencies = [ "frame-election-provider-support", "honggfuzz", "pallet-bags-list", - "rand", + "rand 0.8.5", ] [[package]] @@ -9343,14 +9818,38 @@ dependencies = [ ] [[package]] -name = "pallet-bridge-grandpa" -version = "0.7.0" +name = "pallet-bridge-beefy" +version = "0.1.0" dependencies = [ - "bp-header-chain", + "bp-beefy", "bp-runtime", "bp-test-utils", - "finality-grandpa", - "frame-benchmarking", + "ckb-merkle-mountain-range", + "frame-support", + "frame-system", + "log", + "pallet-beefy-mmr", + "pallet-mmr", + "parity-scale-codec", + "rand 0.8.5", + "scale-info", + "serde", + "sp-consensus-beefy", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std 14.0.0", +] + +[[package]] +name = "pallet-bridge-grandpa" +version = "0.7.0" +dependencies = [ + "bp-header-chain", + "bp-runtime", + "bp-test-utils", + "finality-grandpa", + "frame-benchmarking", "frame-support", "frame-system", "log", @@ -9438,6 +9937,7 @@ dependencies = [ "frame-system", "parity-scale-codec", "scale-info", + "sp-api", "sp-arithmetic", "sp-core", "sp-io", @@ -9478,7 +9978,7 @@ dependencies = [ "pallet-session", "pallet-timestamp", "parity-scale-codec", - "rand", + "rand 0.8.5", "scale-info", "sp-consensus-aura", "sp-core", @@ -9527,7 +10027,7 @@ dependencies = [ "array-bytes 6.1.0", "assert_matches", "bitflags 1.3.2", - "env_logger 0.9.3", + "env_logger 0.11.3", "environmental", "frame-benchmarking", "frame-support", @@ -9545,8 +10045,9 @@ dependencies = [ "pallet-timestamp", "pallet-utility", "parity-scale-codec", + "paste", "pretty_assertions", - "rand", + "rand 0.8.5", "rand_pcg", "scale-info", "serde", @@ -9572,12 +10073,11 @@ dependencies = [ "anyhow", "frame-system", "parity-wasm", - "polkavm-linker 0.5.0", + "polkavm-linker", "sp-runtime", "tempfile", "toml 0.8.8", "twox-hash", - "wat", ] [[package]] @@ -9622,9 +10122,9 @@ dependencies = [ name = "pallet-contracts-proc-macro" version = "18.0.0" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.48", + "proc-macro2 1.0.75", + "quote 1.0.35", + "syn 2.0.53", ] [[package]] @@ -9634,7 +10134,7 @@ dependencies = [ "bitflags 1.3.2", "parity-scale-codec", "paste", - "polkavm-derive 0.5.0", + "polkavm-derive", "scale-info", ] @@ -9736,6 +10236,7 @@ dependencies = [ "pallet-bags-list", "pallet-balances", "pallet-election-provider-multi-phase", + "pallet-nomination-pools", "pallet-session", "pallet-staking", "pallet-timestamp", @@ -9764,7 +10265,7 @@ dependencies = [ "pallet-election-provider-support-benchmarking", "parity-scale-codec", "parking_lot 0.12.1", - "rand", + "rand 0.8.5", "scale-info", "sp-arithmetic", "sp-core", @@ -9773,7 +10274,7 @@ dependencies = [ "sp-runtime", "sp-std 14.0.0", "sp-tracing 16.0.0", - "strum 0.24.1", + "strum 0.26.2", ] [[package]] @@ -9831,8 +10332,8 @@ dependencies = [ name = "pallet-example-frame-crate" version = "0.0.1" dependencies = [ - "frame", "parity-scale-codec", + "polkadot-sdk-frame", "scale-info", ] @@ -9853,6 +10354,20 @@ dependencies = [ "sp-std 14.0.0", ] +[[package]] +name = "pallet-example-mbm" +version = "0.1.0" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "pallet-migrations", + "parity-scale-codec", + "scale-info", + "sp-io", +] + [[package]] name = "pallet-example-offchain-worker" version = "28.0.0" @@ -9870,6 +10385,26 @@ dependencies = [ "sp-std 14.0.0", ] +[[package]] +name = "pallet-example-single-block-migrations" +version = "0.0.1" +dependencies = [ + "docify", + "frame-executive", + "frame-support", + "frame-system", + "frame-try-runtime", + "log", + "pallet-balances", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std 14.0.0", + "sp-version", +] + [[package]] name = "pallet-example-split" version = "10.0.0" @@ -9911,6 +10446,7 @@ dependencies = [ "pallet-example-frame-crate", "pallet-example-kitchensink", "pallet-example-offchain-worker", + "pallet-example-single-block-migrations", "pallet-example-split", "pallet-example-tasks", ] @@ -10102,7 +10638,7 @@ dependencies = [ "frame-system", "log", "parity-scale-codec", - "rand", + "rand 0.8.5", "rand_distr", "scale-info", "serde", @@ -10116,6 +10652,39 @@ dependencies = [ "sp-weights", ] +[[package]] +name = "pallet-migrations" +version = "1.0.0" +dependencies = [ + "docify", + "frame-benchmarking", + "frame-executive", + "frame-support", + "frame-system", + "impl-trait-for-tuples", + "log", + "parity-scale-codec", + "pretty_assertions", + "scale-info", + "sp-api", + "sp-block-builder", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std 14.0.0", + "sp-tracing 16.0.0", + "sp-version", +] + +[[package]] +name = "pallet-minimal-template" +version = "0.0.0" +dependencies = [ + "parity-scale-codec", + "polkadot-sdk-frame", + "scale-info", +] + [[package]] name = "pallet-mixnet" version = "0.4.0" @@ -10140,7 +10709,7 @@ name = "pallet-mmr" version = "27.0.0" dependencies = [ "array-bytes 6.1.0", - "env_logger 0.9.3", + "env_logger 0.11.3", "frame-benchmarking", "frame-support", "frame-system", @@ -10302,7 +10871,7 @@ dependencies = [ "honggfuzz", "log", "pallet-nomination-pools", - "rand", + "rand 0.8.5", "sp-io", "sp-runtime", "sp-tracing 16.0.0", @@ -10417,17 +10986,36 @@ dependencies = [ [[package]] name = "pallet-parachain-template" -version = "0.7.0" +version = "0.0.0" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-io", + "sp-runtime", +] + +[[package]] +name = "pallet-parameters" +version = "0.1.0" dependencies = [ + "docify", "frame-benchmarking", "frame-support", "frame-system", + "pallet-balances", + "pallet-example-basic", "parity-scale-codec", + "paste", "scale-info", "serde", "sp-core", "sp-io", "sp-runtime", + "sp-std 14.0.0", ] [[package]] @@ -10698,7 +11286,7 @@ dependencies = [ "pallet-staking-reward-curve", "pallet-timestamp", "parity-scale-codec", - "rand", + "rand 0.8.5", "scale-info", "sp-core", "sp-io", @@ -10775,10 +11363,10 @@ name = "pallet-staking-reward-curve" version = "11.0.0" dependencies = [ "proc-macro-crate 3.0.0", - "proc-macro2", - "quote", + "proc-macro2 1.0.75", + "quote 1.0.35", "sp-runtime", - "syn 2.0.48", + "syn 2.0.53", ] [[package]] @@ -10859,7 +11447,7 @@ dependencies = [ [[package]] name = "pallet-template" -version = "4.0.0-dev" +version = "0.0.0" dependencies = [ "frame-benchmarking", "frame-support", @@ -10869,7 +11457,6 @@ dependencies = [ "sp-core", "sp-io", "sp-runtime", - "sp-std 14.0.0", ] [[package]] @@ -11109,6 +11696,7 @@ dependencies = [ "staging-xcm", "staging-xcm-builder", "staging-xcm-executor", + "xcm-fee-payment-runtime-api", ] [[package]] @@ -11182,9 +11770,9 @@ dependencies = [ [[package]] name = "parachain-template-node" -version = "0.1.0" +version = "0.0.0" dependencies = [ - "clap 4.4.18", + "clap 4.5.3", "color-print", "cumulus-client-cli", "cumulus-client-collator", @@ -11240,7 +11828,7 @@ dependencies = [ [[package]] name = "parachain-template-runtime" -version = "0.7.0" +version = "0.0.0" dependencies = [ "cumulus-pallet-aura-ext", "cumulus-pallet-parachain-system", @@ -11248,6 +11836,7 @@ dependencies = [ "cumulus-pallet-xcm", "cumulus-pallet-xcmp-queue", "cumulus-primitives-core", + "cumulus-primitives-storage-weight-reclaim", "cumulus-primitives-utility", "frame-benchmarking", "frame-executive", @@ -11325,6 +11914,21 @@ dependencies = [ "substrate-wasm-builder", ] +[[package]] +name = "parachains-relay" +version = "0.1.0" +dependencies = [ + "async-std", + "async-trait", + "bp-polkadot-core", + "futures", + "log", + "parity-scale-codec", + "relay-substrate-client", + "relay-utils", + "sp-core", +] + [[package]] name = "parachains-runtimes-test-utils" version = "7.0.0" @@ -11340,6 +11944,7 @@ dependencies = [ "pallet-balances", "pallet-collator-selection", "pallet-session", + "pallet-timestamp", "pallet-xcm", "parity-scale-codec", "polkadot-parachain-primitives", @@ -11355,6 +11960,19 @@ dependencies = [ "substrate-wasm-builder", ] +[[package]] +name = "parity-bip39" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e69bf016dc406eff7d53a7d3f7cf1c2e72c82b9088aac1118591e36dd2cd3e9" +dependencies = [ + "bitcoin_hashes 0.13.0", + "rand 0.8.5", + "rand_core 0.6.4", + "serde", + "unicode-normalization", +] + [[package]] name = "parity-bytes" version = "0.1.2" @@ -11376,7 +11994,7 @@ dependencies = [ "lz4", "memmap2 0.5.10", "parking_lot 0.12.1", - "rand", + "rand 0.8.5", "siphasher", "snap", ] @@ -11403,8 +12021,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "312270ee71e1cd70289dacf597cab7b207aa107d2f28191c2ae45b2ece18a260" dependencies = [ "proc-macro-crate 1.3.1", - "proc-macro2", - "quote", + "proc-macro2 1.0.75", + "quote 1.0.35", "syn 1.0.109", ] @@ -11438,7 +12056,7 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f557c32c6d268a07c921471619c0295f5efad3a0e76d4f97a05c091a51d110b2" dependencies = [ - "proc-macro2", + "proc-macro2 1.0.75", "syn 1.0.109", "synstructure", ] @@ -11510,19 +12128,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7924d1d0ad836f665c9065e26d016c673ece3993f30d340068b16f282afc1156" [[package]] -name = "paste" -version = "1.0.14" +name = "password-hash" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" +checksum = "346f04948ba92c43e8469c1ee6736c7563d71012b17d40745260fe106aac2166" +dependencies = [ + "base64ct", + "rand_core 0.6.4", + "subtle 2.5.0", +] [[package]] -name = "pbkdf2" -version = "0.8.0" +name = "paste" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d95f5254224e617595d2cc3cc73ff0a5eaf2637519e25f03388154e9378b6ffa" -dependencies = [ - "crypto-mac 0.11.1", -] +checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" [[package]] name = "pbkdf2" @@ -11531,6 +12151,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" dependencies = [ "digest 0.10.7", + "password-hash", ] [[package]] @@ -11557,9 +12178,8 @@ dependencies = [ "frame-support", "parachains-common", "penpal-runtime", - "rococo-emulated-chain", "sp-core", - "westend-emulated-chain", + "staging-xcm", ] [[package]] @@ -11621,7 +12241,6 @@ dependencies = [ "staging-xcm-builder", "staging-xcm-executor", "substrate-wasm-builder", - "testnet-parachains-constants", ] [[package]] @@ -11670,6 +12289,7 @@ dependencies = [ "cumulus-pallet-xcmp-queue", "cumulus-primitives-aura", "cumulus-primitives-core", + "cumulus-primitives-storage-weight-reclaim", "cumulus-primitives-utility", "enumflags2", "frame-benchmarking", @@ -11769,6 +12389,7 @@ dependencies = [ "cumulus-pallet-xcmp-queue", "cumulus-primitives-aura", "cumulus-primitives-core", + "cumulus-primitives-storage-weight-reclaim", "cumulus-primitives-utility", "enumflags2", "frame-benchmarking", @@ -11856,9 +12477,9 @@ checksum = "68ca01446f50dbda87c1786af8770d535423fa8a53aec03b8f4e3d7eb10e0929" dependencies = [ "pest", "pest_meta", - "proc-macro2", - "quote", - "syn 2.0.48", + "proc-macro2 1.0.75", + "quote 1.0.35", + "syn 2.0.53", ] [[package]] @@ -11879,7 +12500,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9" dependencies = [ "fixedbitset", - "indexmap 2.0.0", + "indexmap 2.2.3", ] [[package]] @@ -11897,9 +12518,9 @@ version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.48", + "proc-macro2 1.0.75", + "quote 1.0.35", + "syn 2.0.53", ] [[package]] @@ -11997,7 +12618,7 @@ version = "7.0.0" dependencies = [ "assert_matches", "bitvec", - "env_logger 0.9.3", + "env_logger 0.11.3", "futures", "futures-timer", "itertools 0.10.5", @@ -12011,7 +12632,7 @@ dependencies = [ "polkadot-node-subsystem-util", "polkadot-primitives", "polkadot-primitives-test-helpers", - "rand", + "rand 0.8.5", "rand_chacha 0.3.1", "rand_core 0.6.4", "schnorrkel 0.11.4", @@ -12027,7 +12648,7 @@ dependencies = [ "always-assert", "assert_matches", "bitvec", - "env_logger 0.9.3", + "env_logger 0.11.3", "futures", "futures-timer", "log", @@ -12037,7 +12658,7 @@ dependencies = [ "polkadot-node-subsystem-test-helpers", "polkadot-node-subsystem-util", "polkadot-primitives", - "rand", + "rand 0.8.5", "rand_chacha 0.3.1", "sp-application-crypto", "sp-authority-discovery", @@ -12065,7 +12686,8 @@ dependencies = [ "polkadot-node-subsystem-util", "polkadot-primitives", "polkadot-primitives-test-helpers", - "rand", + "polkadot-subsystem-bench", + "rand 0.8.5", "sc-network", "schnellru", "sp-core", @@ -12082,7 +12704,7 @@ version = "7.0.0" dependencies = [ "assert_matches", "async-trait", - "env_logger 0.9.3", + "env_logger 0.11.3", "fatality", "futures", "futures-timer", @@ -12096,7 +12718,8 @@ dependencies = [ "polkadot-node-subsystem-util", "polkadot-primitives", "polkadot-primitives-test-helpers", - "rand", + "polkadot-subsystem-bench", + "rand 0.8.5", "sc-network", "schnellru", "sp-application-crypto", @@ -12112,7 +12735,7 @@ name = "polkadot-cli" version = "7.0.0" dependencies = [ "cfg-if", - "clap 4.4.18", + "clap 4.5.3", "frame-benchmarking-cli", "futures", "log", @@ -12131,9 +12754,9 @@ dependencies = [ "sp-io", "sp-keyring", "sp-maybe-compressed-blob", + "sp-runtime", "substrate-build-script-utils", "thiserror", - "try-runtime-cli", ] [[package]] @@ -12142,7 +12765,7 @@ version = "7.0.0" dependencies = [ "assert_matches", "bitvec", - "env_logger 0.9.3", + "env_logger 0.11.3", "fatality", "futures", "futures-timer", @@ -12188,7 +12811,7 @@ dependencies = [ "fatality", "futures", "futures-timer", - "indexmap 2.0.0", + "indexmap 2.2.3", "lazy_static", "parity-scale-codec", "polkadot-erasure-coding", @@ -12233,13 +12856,14 @@ dependencies = [ "futures", "futures-timer", "lazy_static", + "parking_lot 0.12.1", "polkadot-node-network-protocol", "polkadot-node-subsystem", "polkadot-node-subsystem-test-helpers", "polkadot-node-subsystem-util", "polkadot-primitives", "quickcheck", - "rand", + "rand 0.8.5", "rand_chacha 0.3.1", "sc-network", "sc-network-common", @@ -12297,6 +12921,7 @@ dependencies = [ "polkadot-node-subsystem-util", "polkadot-primitives", "polkadot-primitives-test-helpers", + "rstest", "sp-core", "sp-keyring", "sp-maybe-compressed-blob", @@ -12312,14 +12937,14 @@ dependencies = [ "async-trait", "bitvec", "derive_more", - "env_logger 0.9.3", + "env_logger 0.11.3", "futures", "futures-timer", "itertools 0.10.5", "kvdb", "kvdb-memorydb", "log", - "merlin 3.0.0", + "merlin", "parity-scale-codec", "parking_lot 0.12.1", "polkadot-node-jaeger", @@ -12330,7 +12955,7 @@ dependencies = [ "polkadot-overseer", "polkadot-primitives", "polkadot-primitives-test-helpers", - "rand", + "rand 0.8.5", "rand_chacha 0.3.1", "rand_core 0.6.4", "sc-keystore", @@ -12354,7 +12979,7 @@ version = "7.0.0" dependencies = [ "assert_matches", "bitvec", - "env_logger 0.9.3", + "env_logger 0.11.3", "futures", "futures-timer", "kvdb", @@ -12394,7 +13019,9 @@ dependencies = [ "polkadot-primitives", "polkadot-primitives-test-helpers", "polkadot-statement-table", + "rstest", "sc-keystore", + "schnellru", "sp-application-crypto", "sp-core", "sp-keyring", @@ -12546,6 +13173,7 @@ dependencies = [ "polkadot-node-subsystem-util", "polkadot-primitives", "polkadot-primitives-test-helpers", + "rstest", "sc-keystore", "sp-application-crypto", "sp-core", @@ -12569,6 +13197,8 @@ dependencies = [ "polkadot-node-subsystem-util", "polkadot-primitives", "polkadot-primitives-test-helpers", + "rstest", + "schnellru", "sp-application-crypto", "sp-keystore", "thiserror", @@ -12603,7 +13233,7 @@ dependencies = [ "polkadot-parachain-primitives", "polkadot-primitives", "procfs", - "rand", + "rand 0.8.5", "rococo-runtime", "rusty-fork", "sc-sysinfo", @@ -12741,6 +13371,7 @@ dependencies = [ "polkadot-node-primitives", "polkadot-primitives", "sc-network", + "sc-network-types", "sp-core", "thiserror", "tokio", @@ -12787,11 +13418,13 @@ dependencies = [ "polkadot-node-jaeger", "polkadot-node-primitives", "polkadot-primitives", - "rand", + "rand 0.8.5", "rand_chacha 0.3.1", "sc-authority-discovery", "sc-network", - "strum 0.24.1", + "sc-network-types", + "sp-runtime", + "strum 0.26.2", "thiserror", "tracing-gum", ] @@ -12865,6 +13498,7 @@ dependencies = [ "polkadot-statement-table", "sc-client-api", "sc-network", + "sc-network-types", "sc-transaction-pool-api", "smallvec", "sp-api", @@ -12883,7 +13517,7 @@ dependencies = [ "assert_matches", "async-trait", "derive_more", - "env_logger 0.9.3", + "env_logger 0.11.3", "fatality", "futures", "futures-channel", @@ -12908,7 +13542,7 @@ dependencies = [ "polkadot-primitives", "polkadot-primitives-test-helpers", "prioritized-metered-channel", - "rand", + "rand 0.8.5", "sc-client-api", "schnellru", "sp-application-crypto", @@ -12955,7 +13589,7 @@ dependencies = [ "async-trait", "bridge-hub-rococo-runtime", "bridge-hub-westend-runtime", - "clap 4.4.18", + "clap 4.5.3", "collectives-westend-runtime", "color-print", "contracts-rococo-runtime", @@ -13064,6 +13698,7 @@ version = "7.0.0" dependencies = [ "bitvec", "hex-literal", + "log", "parity-scale-codec", "polkadot-core-primitives", "polkadot-parachain-primitives", @@ -13088,7 +13723,7 @@ name = "polkadot-primitives-test-helpers" version = "1.0.0" dependencies = [ "polkadot-primitives", - "rand", + "rand 0.8.5", "sp-application-crypto", "sp-core", "sp-keyring", @@ -13156,7 +13791,6 @@ dependencies = [ "pallet-transaction-payment", "pallet-treasury", "pallet-vesting", - "pallet-xcm-benchmarks", "parity-scale-codec", "polkadot-primitives", "polkadot-primitives-test-helpers", @@ -13228,8 +13862,9 @@ dependencies = [ "polkadot-primitives", "polkadot-primitives-test-helpers", "polkadot-runtime-metrics", - "rand", + "rand 0.8.5", "rand_chacha 0.3.1", + "rstest", "rustc-hex", "sc-keystore", "scale-info", @@ -13262,13 +13897,34 @@ dependencies = [ "cumulus-pallet-aura-ext", "cumulus-pallet-parachain-system", "docify", - "frame", + "frame-executive", + "frame-support", + "frame-system", "kitchensink-runtime", + "pallet-assets", "pallet-aura", + "pallet-authorship", + "pallet-babe", + "pallet-balances", + "pallet-broker", + "pallet-collective", "pallet-default-config-example", + "pallet-democracy", + "pallet-example-offchain-worker", + "pallet-example-single-block-migrations", "pallet-examples", + "pallet-multisig", + "pallet-nfts", + "pallet-preimage", + "pallet-proxy", + "pallet-referenda", + "pallet-scheduler", "pallet-timestamp", + "pallet-transaction-payment", + "pallet-uniques", + "pallet-utility", "parity-scale-codec", + "polkadot-sdk-frame", "sc-cli", "sc-client-db", "sc-consensus-aura", @@ -13283,24 +13939,58 @@ dependencies = [ "scale-info", "simple-mermaid", "sp-api", + "sp-arithmetic", "sp-core", "sp-io", "sp-keyring", + "sp-offchain", "sp-runtime", + "sp-version", "staging-chain-spec-builder", "staging-node-cli", "staging-parachain-info", + "staging-xcm", "subkey", "substrate-wasm-builder", ] +[[package]] +name = "polkadot-sdk-frame" +version = "0.1.0" +dependencies = [ + "docify", + "frame-executive", + "frame-support", + "frame-system", + "frame-system-rpc-runtime-api", + "log", + "pallet-examples", + "parity-scale-codec", + "scale-info", + "sp-api", + "sp-arithmetic", + "sp-block-builder", + "sp-consensus-aura", + "sp-consensus-grandpa", + "sp-core", + "sp-inherents", + "sp-io", + "sp-offchain", + "sp-runtime", + "sp-session", + "sp-std 14.0.0", + "sp-transaction-pool", + "sp-version", +] + [[package]] name = "polkadot-service" version = "7.0.0" dependencies = [ "assert_matches", "async-trait", - "env_logger 0.9.3", + "bitvec", + "env_logger 0.11.3", "frame-benchmarking", "frame-benchmarking-cli", "frame-support", @@ -13314,7 +14004,6 @@ dependencies = [ "log", "mmr-gadget", "pallet-babe", - "pallet-im-online", "pallet-staking", "pallet-transaction-payment", "pallet-transaction-payment-rpc-runtime-api", @@ -13411,12 +14100,14 @@ dependencies = [ "sp-transaction-pool", "sp-version", "sp-weights", + "staging-xcm", "substrate-prometheus-endpoint", "tempfile", "thiserror", "tracing-gum", "westend-runtime", "westend-runtime-constants", + "xcm-fee-payment-runtime-api", ] [[package]] @@ -13430,7 +14121,7 @@ dependencies = [ "fatality", "futures", "futures-timer", - "indexmap 2.0.0", + "indexmap 2.2.3", "parity-scale-codec", "polkadot-node-network-protocol", "polkadot-node-primitives", @@ -13460,6 +14151,7 @@ dependencies = [ "parity-scale-codec", "polkadot-primitives", "sp-core", + "tracing-gum", ] [[package]] @@ -13470,11 +14162,11 @@ dependencies = [ "async-trait", "bincode", "bitvec", - "clap 4.4.18", + "clap 4.5.3", "clap-num", "color-eyre", "colored", - "env_logger 0.9.3", + "env_logger 0.11.3", "futures", "futures-timer", "hex", @@ -13505,15 +14197,17 @@ dependencies = [ "prometheus", "pyroscope", "pyroscope_pprofrs", - "rand", + "rand 0.8.5", "rand_chacha 0.3.1", "rand_core 0.6.4", "rand_distr", "sc-keystore", "sc-network", + "sc-network-types", "sc-service", - "schnorrkel 0.9.1", + "schnorrkel 0.11.4", "serde", + "serde_json", "serde_yaml", "sha1", "sp-application-crypto", @@ -13564,7 +14258,7 @@ version = "1.0.0" dependencies = [ "assert_matches", "async-trait", - "clap 4.4.18", + "clap 4.5.3", "color-eyre", "futures", "futures-timer", @@ -13582,7 +14276,7 @@ dependencies = [ "polkadot-node-subsystem-types", "polkadot-node-subsystem-util", "polkadot-primitives", - "rand", + "rand 0.8.5", "sp-core", "sp-keystore", "substrate-build-script-utils", @@ -13675,7 +14369,7 @@ dependencies = [ "polkadot-runtime-parachains", "polkadot-service", "polkadot-test-runtime", - "rand", + "rand 0.8.5", "sc-authority-discovery", "sc-chain-spec", "sc-cli", @@ -13711,106 +14405,94 @@ dependencies = [ name = "polkadot-voter-bags" version = "7.0.0" dependencies = [ - "clap 4.4.18", + "clap 4.5.3", "generate-bags", "sp-io", "westend-runtime", ] [[package]] -name = "polkavm-common" -version = "0.5.0" +name = "polkavm" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88b4e215c80fe876147f3d58158d5dfeae7dabdd6047e175af77095b78d0035c" +checksum = "8a3693e5efdb2bf74e449cd25fd777a28bd7ed87e41f5d5da75eb31b4de48b94" +dependencies = [ + "libc", + "log", + "polkavm-assembler", + "polkavm-common", + "polkavm-linux-raw", +] [[package]] -name = "polkavm-common" -version = "0.8.0" +name = "polkavm-assembler" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92c99f7eee94e7be43ba37eef65ad0ee8cbaf89b7c00001c3f6d2be985cb1817" +checksum = "1fa96d6d868243acc12de813dd48e756cbadcc8e13964c70d272753266deadc1" +dependencies = [ + "log", +] [[package]] -name = "polkavm-derive" -version = "0.5.0" +name = "polkavm-common" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6380dbe1fb03ecc74ad55d841cfc75480222d153ba69ddcb00977866cbdabdb8" +checksum = "1d9428a5cfcc85c5d7b9fc4b6a18c4b802d0173d768182a51cc7751640f08b92" dependencies = [ - "polkavm-derive-impl 0.5.0", - "syn 2.0.48", + "log", ] [[package]] name = "polkavm-derive" -version = "0.8.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79fa916f7962348bd1bb1a65a83401675e6fc86c51a0fdbcf92a3108e58e6125" +checksum = "ae8c4bea6f3e11cd89bb18bcdddac10bd9a24015399bd1c485ad68a985a19606" dependencies = [ "polkavm-derive-impl-macro", ] [[package]] name = "polkavm-derive-impl" -version = "0.5.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc8211b3365bbafb2fb32057d68b0e1ca55d079f5cf6f9da9b98079b94b3987d" +checksum = "5c4fdfc49717fb9a196e74a5d28e0bc764eb394a2c803eb11133a31ac996c60c" dependencies = [ - "polkavm-common 0.5.0", - "proc-macro2", - "quote", - "syn 2.0.48", + "polkavm-common", + "proc-macro2 1.0.75", + "quote 1.0.35", + "syn 2.0.53", ] [[package]] -name = "polkavm-derive-impl" -version = "0.8.0" +name = "polkavm-derive-impl-macro" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c10b2654a8a10a83c260bfb93e97b262cf0017494ab94a65d389e0eda6de6c9c" +checksum = "8ba81f7b5faac81e528eb6158a6f3c9e0bb1008e0ffa19653bc8dea925ecb429" dependencies = [ - "polkavm-common 0.8.0", - "proc-macro2", - "quote", - "syn 2.0.48", -] - -[[package]] -name = "polkavm-derive-impl-macro" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15e85319a0d5129dc9f021c62607e0804f5fb777a05cdda44d750ac0732def66" -dependencies = [ - "polkavm-derive-impl 0.8.0", - "syn 2.0.48", + "polkavm-derive-impl", + "syn 2.0.53", ] [[package]] name = "polkavm-linker" -version = "0.5.0" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5a668bb33c7f0b5f4ca91adb1e1e71cf4930fef5e6909f46c2180d65cce37d0" +checksum = "9c7be503e60cf56c0eb785f90aaba4b583b36bff00e93997d93fef97f9553c39" dependencies = [ "gimli 0.28.0", "hashbrown 0.14.3", "log", "object 0.32.2", - "polkavm-common 0.5.0", + "polkavm-common", "regalloc2 0.9.3", "rustc-demangle", ] [[package]] -name = "polkavm-linker" -version = "0.8.1" +name = "polkavm-linux-raw" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bc03593918a5890f96c276fb1e34ab77002bea1f9136cdcb55107c241011ab7" -dependencies = [ - "gimli 0.28.0", - "hashbrown 0.14.3", - "log", - "object 0.32.2", - "polkavm-common 0.8.0", - "regalloc2 0.9.3", - "rustc-demangle", -] +checksum = "26e85d3456948e650dff0cfc85603915847faf893ed1e66b020bb82ef4557120" [[package]] name = "polling" @@ -13836,7 +14518,7 @@ checksum = "048aeb476be11a4b6ca432ca569e375810de9294ae78f4774e78ea98a9246ede" dependencies = [ "cpufeatures", "opaque-debug 0.3.0", - "universal-hash 0.4.1", + "universal-hash 0.4.0", ] [[package]] @@ -13859,7 +14541,7 @@ dependencies = [ "cfg-if", "cpufeatures", "opaque-debug 0.3.0", - "universal-hash 0.4.1", + "universal-hash 0.4.0", ] [[package]] @@ -13886,7 +14568,7 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "be97d76faf1bfab666e1375477b23fde79eccf0276e9b63b92a39d676a889ba9" dependencies = [ - "rand", + "rand 0.8.5", ] [[package]] @@ -13973,7 +14655,7 @@ version = "0.1.25" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c8646e95016a7a6c4adea95bafa8a16baab64b583356217f2c85db4a39d9a86" dependencies = [ - "proc-macro2", + "proc-macro2 1.0.75", "syn 1.0.109", ] @@ -13983,8 +14665,8 @@ version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c64d9ba0963cdcea2e1b2230fbae2bab30eb25a174be395c41e764bfb65dd62" dependencies = [ - "proc-macro2", - "syn 2.0.48", + "proc-macro2 1.0.75", + "syn 2.0.53", ] [[package]] @@ -14044,8 +14726,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" dependencies = [ "proc-macro-error-attr", - "proc-macro2", - "quote", + "proc-macro2 1.0.75", + "quote 1.0.35", "syn 1.0.109", "version_check", ] @@ -14056,8 +14738,8 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.75", + "quote 1.0.35", "version_check", ] @@ -14073,9 +14755,18 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b698b0b09d40e9b7c1a47b132d66a8b54bcd20583d9b6d06e4535e383b4405c" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.48", + "proc-macro2 1.0.75", + "quote 1.0.35", + "syn 2.0.53", +] + +[[package]] +name = "proc-macro2" +version = "0.4.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759" +dependencies = [ + "unicode-xid 0.1.0", ] [[package]] @@ -14145,9 +14836,9 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "440f724eba9f6996b75d63681b0a92b06947f1457076d503a4d2e2c8f56442b8" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.48", + "proc-macro2 1.0.75", + "quote 1.0.35", + "syn 2.0.53", ] [[package]] @@ -14173,7 +14864,7 @@ dependencies = [ "bitflags 2.4.0", "lazy_static", "num-traits", - "rand", + "rand 0.8.5", "rand_chacha 0.3.1", "rand_xorshift", "regex-syntax 0.8.2", @@ -14209,7 +14900,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "119533552c9a7ffacc21e099c24a0ac8bb19c2a2a3f363de84cd9b844feab270" dependencies = [ "bytes", - "heck", + "heck 0.4.1", "itertools 0.10.5", "lazy_static", "log", @@ -14232,8 +14923,8 @@ checksum = "e5d2d8d10f3c6ded6da8b05b5fb3b8a5082514344d56c9f871412d29b4e075b4" dependencies = [ "anyhow", "itertools 0.10.5", - "proc-macro2", - "quote", + "proc-macro2 1.0.75", + "quote 1.0.35", "syn 1.0.109", ] @@ -14245,9 +14936,9 @@ checksum = "efb6c9a1dd1def8e2124d17e83a20af56f1570d6c2d2bd9e266ccb768df3840e" dependencies = [ "anyhow", "itertools 0.11.0", - "proc-macro2", - "quote", - "syn 2.0.48", + "proc-macro2 1.0.75", + "quote 1.0.35", + "syn 2.0.53", ] [[package]] @@ -14298,6 +14989,22 @@ dependencies = [ "thiserror", ] +[[package]] +name = "quanta" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a17e662a7a8291a865152364c20c7abc5e60486ab2001e8ec10b24862de0b9ab" +dependencies = [ + "crossbeam-utils", + "libc", + "mach2", + "once_cell", + "raw-cpuid", + "wasi 0.11.0+wasi-snapshot-preview1", + "web-sys", + "winapi", +] + [[package]] name = "quick-error" version = "1.2.3" @@ -14334,7 +15041,7 @@ checksum = "588f6378e4dd99458b60ec275b4477add41ce4fa9f64dcba6f15adccb19b50d6" dependencies = [ "env_logger 0.8.4", "log", - "rand", + "rand 0.8.5", ] [[package]] @@ -14348,6 +15055,24 @@ dependencies = [ "pin-project-lite 0.1.12", ] +[[package]] +name = "quinn" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e8b432585672228923edbbf64b8b12c14e1112f62e88737655b4a083dbcd78e" +dependencies = [ + "bytes", + "pin-project-lite 0.2.12", + "quinn-proto", + "quinn-udp", + "rustc-hash", + "rustls 0.20.8", + "thiserror", + "tokio", + "tracing", + "webpki", +] + [[package]] name = "quinn-proto" version = "0.9.5" @@ -14355,7 +15080,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c956be1b23f4261676aed05a0046e204e8a6836e50203902683a718af0797989" dependencies = [ "bytes", - "rand", + "rand 0.8.5", "ring 0.16.20", "rustc-hash", "rustls 0.20.8", @@ -14366,13 +15091,35 @@ dependencies = [ "webpki", ] +[[package]] +name = "quinn-udp" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "641538578b21f5e5c8ea733b736895576d0fe329bb883b937db6f4d163dbaaf4" +dependencies = [ + "libc", + "quinn-proto", + "socket2 0.4.9", + "tracing", + "windows-sys 0.42.0", +] + +[[package]] +name = "quote" +version = "0.6.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce23b6b870e8f94f81fb0a363d65d86675884b34a09043c81e5562f11c1f8e1" +dependencies = [ + "proc-macro2 0.4.30", +] + [[package]] name = "quote" version = "1.0.35" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" dependencies = [ - "proc-macro2", + "proc-macro2 1.0.75", ] [[package]] @@ -14381,6 +15128,19 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" +[[package]] +name = "rand" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" +dependencies = [ + "getrandom 0.1.16", + "libc", + "rand_chacha 0.2.2", + "rand_core 0.5.1", + "rand_hc", +] + [[package]] name = "rand" version = "0.8.5" @@ -14437,7 +15197,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32cb0b9bc82b0a0876c2dd994a7e7a2683d3e7390ca40e6886785ef0c7e3ee31" dependencies = [ "num-traits", - "rand", + "rand 0.8.5", +] + +[[package]] +name = "rand_hc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" +dependencies = [ + "rand_core 0.5.1", ] [[package]] @@ -14458,6 +15227,15 @@ dependencies = [ "rand_core 0.6.4", ] +[[package]] +name = "raw-cpuid" +version = "10.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c297679cb867470fa8c9f67dbba74a78d78e3e98d7cf2b08d6d71540f797332" +dependencies = [ + "bitflags 1.3.2", +] + [[package]] name = "rawpointer" version = "0.2.1" @@ -14466,9 +15244,9 @@ checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" [[package]] name = "rayon" -version = "1.7.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d2df5196e37bcc87abebc0053e20787d73847bb33134a69841207dd0a47f03b" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" dependencies = [ "either", "rayon-core", @@ -14476,14 +15254,32 @@ dependencies = [ [[package]] name = "rayon-core" -version = "1.11.0" +version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b8f95bd6966f5c87776639160a66bd8ab9895d9d4ab01ddba9fc60661aebe8d" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" dependencies = [ - "crossbeam-channel", "crossbeam-deque", "crossbeam-utils", - "num_cpus", +] + +[[package]] +name = "rbtag" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72c64936fcc0b811890a9d90020f3df5cec9c604efde88af7db6a35d365132a3" +dependencies = [ + "rbtag_derive", +] + +[[package]] +name = "rbtag_derive" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b75511b710ccca8adbb211e04763bd8c78fed585b0ec188a20ed9b0dd95567c4" +dependencies = [ + "proc-macro2 0.4.30", + "quote 0.6.13", + "syn 0.15.44", ] [[package]] @@ -14563,9 +15359,9 @@ version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f7473c2cfcf90008193dd0e3e16599455cb601a9fce322b5bb55de799664925" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.48", + "proc-macro2 1.0.75", + "quote 1.0.35", + "syn 2.0.53", ] [[package]] @@ -14643,11 +15439,83 @@ version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" +[[package]] +name = "relative-path" +version = "1.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e898588f33fdd5b9420719948f9f2a32c922a246964576f71ba7f24f80610fbc" + +[[package]] +name = "relay-substrate-client" +version = "0.1.0" +dependencies = [ + "async-std", + "async-trait", + "bp-header-chain", + "bp-messages", + "bp-polkadot-core", + "bp-runtime", + "finality-relay", + "frame-support", + "frame-system", + "futures", + "jsonrpsee", + "log", + "num-traits", + "pallet-balances", + "pallet-bridge-messages", + "pallet-transaction-payment", + "pallet-transaction-payment-rpc-runtime-api", + "pallet-utility", + "parity-scale-codec", + "rand 0.8.5", + "relay-utils", + "sc-chain-spec", + "sc-rpc-api", + "sc-transaction-pool-api", + "scale-info", + "sp-consensus-grandpa", + "sp-core", + "sp-rpc", + "sp-runtime", + "sp-std 14.0.0", + "sp-trie", + "sp-version", + "staging-xcm", + "thiserror", + "tokio", +] + +[[package]] +name = "relay-utils" +version = "0.1.0" +dependencies = [ + "ansi_term", + "anyhow", + "async-std", + "async-trait", + "backoff", + "bp-runtime", + "env_logger 0.11.3", + "futures", + "isahc", + "jsonpath_lib", + "log", + "num-traits", + "serde_json", + "sp-runtime", + "substrate-prometheus-endpoint", + "sysinfo", + "thiserror", + "time", + "tokio", +] + [[package]] name = "remote-ext-tests-bags-list" version = "1.0.0" dependencies = [ - "clap 4.4.18", + "clap 4.5.3", "frame-system", "log", "pallet-bags-list-remote-tests", @@ -14682,12 +15550,12 @@ dependencies = [ "percent-encoding", "pin-project-lite 0.2.12", "rustls 0.21.6", - "rustls-pemfile", + "rustls-pemfile 1.0.3", "serde", "serde_json", "serde_urlencoded", "tokio", - "tokio-rustls", + "tokio-rustls 0.24.1", "tower-service", "url", "wasm-bindgen", @@ -14714,7 +15582,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" dependencies = [ "hmac 0.12.1", - "subtle 2.4.1", + "subtle 2.5.0", ] [[package]] @@ -14730,7 +15598,7 @@ dependencies = [ "blake2 0.10.6", "common", "fflonk", - "merlin 3.0.0", + "merlin", ] [[package]] @@ -14824,6 +15692,7 @@ dependencies = [ "cumulus-ping", "cumulus-primitives-aura", "cumulus-primitives-core", + "cumulus-primitives-storage-weight-reclaim", "cumulus-primitives-utility", "frame-benchmarking", "frame-executive", @@ -14869,6 +15738,7 @@ name = "rococo-runtime" version = "7.0.0" dependencies = [ "binary-merkle-tree", + "bitvec", "frame-benchmarking", "frame-executive", "frame-remote-externalities", @@ -14894,7 +15764,6 @@ dependencies = [ "pallet-elections-phragmen", "pallet-grandpa", "pallet-identity", - "pallet-im-online", "pallet-indices", "pallet-membership", "pallet-message-queue", @@ -14942,6 +15811,7 @@ dependencies = [ "sp-block-builder", "sp-consensus-babe", "sp-consensus-beefy", + "sp-consensus-grandpa", "sp-core", "sp-genesis-builder", "sp-inherents", @@ -14965,6 +15835,7 @@ dependencies = [ "substrate-wasm-builder", "tiny-keccak", "tokio", + "xcm-fee-payment-runtime-api", ] [[package]] @@ -15025,6 +15896,35 @@ dependencies = [ "winapi", ] +[[package]] +name = "rstest" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97eeab2f3c0a199bc4be135c36c924b6590b88c377d416494288c14f2db30199" +dependencies = [ + "futures", + "futures-timer", + "rstest_macros", + "rustc_version 0.4.0", +] + +[[package]] +name = "rstest_macros" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d428f8247852f894ee1be110b375111b586d4fa431f6c46e64ba5a0dcccbe605" +dependencies = [ + "cfg-if", + "glob", + "proc-macro2 1.0.75", + "quote 1.0.35", + "regex", + "relative-path", + "rustc_version 0.4.0", + "syn 2.0.53", + "unicode-ident", +] + [[package]] name = "rtnetlink" version = "0.10.1" @@ -15066,7 +15966,7 @@ dependencies = [ "parity-scale-codec", "primitive-types", "proptest", - "rand", + "rand 0.8.5", "rlp", "ruint-macro", "serde", @@ -15195,10 +16095,24 @@ checksum = "1d1feddffcfcc0b33f5c6ce9a29e341e4cd59c3f78e7ee45f4a40c038b1d6cbb" dependencies = [ "log", "ring 0.16.20", - "rustls-webpki", + "rustls-webpki 0.101.4", "sct", ] +[[package]] +name = "rustls" +version = "0.22.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e87c9956bd9807afa1f77e0f7594af32566e830e088a5576d27c5b6f30f49d41" +dependencies = [ + "log", + "ring 0.17.7", + "rustls-pki-types", + "rustls-webpki 0.102.2", + "subtle 2.5.0", + "zeroize", +] + [[package]] name = "rustls-native-certs" version = "0.6.3" @@ -15206,7 +16120,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00" dependencies = [ "openssl-probe", - "rustls-pemfile", + "rustls-pemfile 1.0.3", + "schannel", + "security-framework", +] + +[[package]] +name = "rustls-native-certs" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f1fb85efa936c42c6d5fc28d2629bb51e4b2f4b8a5211e297d599cc5a093792" +dependencies = [ + "openssl-probe", + "rustls-pemfile 2.0.0", + "rustls-pki-types", "schannel", "security-framework", ] @@ -15220,6 +16147,22 @@ dependencies = [ "base64 0.21.2", ] +[[package]] +name = "rustls-pemfile" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35e4980fa29e4c4b212ffb3db068a564cbf560e51d3944b7c88bd8bf5bec64f4" +dependencies = [ + "base64 0.21.2", + "rustls-pki-types", +] + +[[package]] +name = "rustls-pki-types" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a716eb65e3158e90e17cd93d855216e27bde02745ab842f2cab4a39dba1bacf" + [[package]] name = "rustls-webpki" version = "0.101.4" @@ -15230,6 +16173,17 @@ dependencies = [ "untrusted 0.7.1", ] +[[package]] +name = "rustls-webpki" +version = "0.102.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "faaa0a62740bedb9b2ef5afa303da42764c012f743917351dc9a237ea1663610" +dependencies = [ + "ring 0.17.7", + "rustls-pki-types", + "untrusted 0.9.0", +] + [[package]] name = "rustversion" version = "1.0.14" @@ -15322,16 +16276,18 @@ dependencies = [ "futures-timer", "ip_network", "libp2p", + "linked_hash_set", "log", - "multihash 0.18.1", + "multihash 0.17.0", "multihash-codetable", "parity-scale-codec", "prost 0.12.3", "prost-build", "quickcheck", - "rand", + "rand 0.8.5", "sc-client-api", "sc-network", + "sc-network-types", "sp-api", "sp-authority-discovery", "sp-blockchain", @@ -15387,7 +16343,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" -version = "27.0.0" +version = "28.0.0" dependencies = [ "array-bytes 6.1.0", "docify", @@ -15411,6 +16367,7 @@ dependencies = [ "sp-keyring", "sp-runtime", "sp-state-machine", + "sp-tracing 16.0.0", "substrate-test-runtime", ] @@ -15419,9 +16376,9 @@ name = "sc-chain-spec-derive" version = "11.0.0" dependencies = [ "proc-macro-crate 3.0.0", - "proc-macro2", - "quote", - "syn 2.0.48", + "proc-macro2 1.0.75", + "quote 1.0.35", + "syn 2.0.53", ] [[package]] @@ -15429,9 +16386,8 @@ name = "sc-cli" version = "0.36.0" dependencies = [ "array-bytes 6.1.0", - "bip39", "chrono", - "clap 4.4.18", + "clap 4.5.3", "fdlimit", "futures", "futures-timer", @@ -15439,8 +16395,9 @@ dependencies = [ "libp2p-identity", "log", "names", + "parity-bip39", "parity-scale-codec", - "rand", + "rand 0.8.5", "regex", "rpassword", "sc-client-api", @@ -15513,7 +16470,7 @@ dependencies = [ "parity-scale-codec", "parking_lot 0.12.1", "quickcheck", - "rand", + "rand 0.8.5", "sc-client-api", "sc-state-db", "schnellru", @@ -15536,11 +16493,11 @@ dependencies = [ "async-trait", "futures", "futures-timer", - "libp2p-identity", "log", "mockall", "parking_lot 0.12.1", "sc-client-api", + "sc-network-types", "sc-utils", "serde", "sp-api", @@ -15681,6 +16638,7 @@ dependencies = [ "sc-network-gossip", "sc-network-sync", "sc-network-test", + "sc-network-types", "sc-utils", "serde", "sp-api", @@ -15742,7 +16700,7 @@ dependencies = [ name = "sc-consensus-grandpa" version = "0.19.0" dependencies = [ - "ahash 0.8.7", + "ahash 0.8.8", "array-bytes 6.1.0", "assert_matches", "async-trait", @@ -15754,7 +16712,7 @@ dependencies = [ "log", "parity-scale-codec", "parking_lot 0.12.1", - "rand", + "rand 0.8.5", "sc-block-builder", "sc-chain-spec", "sc-client-api", @@ -15764,6 +16722,7 @@ dependencies = [ "sc-network-gossip", "sc-network-sync", "sc-network-test", + "sc-network-types", "sc-telemetry", "sc-transaction-pool-api", "sc-utils", @@ -15903,13 +16862,14 @@ dependencies = [ "array-bytes 6.1.0", "assert_matches", "criterion 0.4.0", - "env_logger 0.9.3", + "env_logger 0.11.3", "num_cpus", "parity-scale-codec", "parking_lot 0.12.1", "paste", "regex", "sc-executor-common", + "sc-executor-polkavm", "sc-executor-wasmtime", "sc-runtime-test", "sc-tracing", @@ -15931,7 +16891,7 @@ dependencies = [ "substrate-test-runtime", "tempfile", "tracing", - "tracing-subscriber 0.2.25", + "tracing-subscriber 0.3.18", "wat", ] @@ -15939,6 +16899,7 @@ dependencies = [ name = "sc-executor-common" version = "0.29.0" dependencies = [ + "polkavm", "sc-allocator", "sp-maybe-compressed-blob", "sp-wasm-interface 20.0.0", @@ -15946,6 +16907,16 @@ dependencies = [ "wasm-instrument", ] +[[package]] +name = "sc-executor-polkavm" +version = "0.29.0" +dependencies = [ + "log", + "polkavm", + "sc-executor-common", + "sp-wasm-interface 20.0.0", +] + [[package]] name = "sc-executor-wasmtime" version = "0.29.0" @@ -16010,7 +16981,6 @@ dependencies = [ "bytes", "futures", "futures-timer", - "libp2p-identity", "log", "mixnet", "multiaddr", @@ -16018,6 +16988,7 @@ dependencies = [ "parking_lot 0.12.1", "sc-client-api", "sc-network", + "sc-network-types", "sc-transaction-pool-api", "sp-api", "sp-consensus", @@ -16038,6 +17009,7 @@ dependencies = [ "async-trait", "asynchronous-codec", "bytes", + "cid 0.9.0", "either", "fnv", "futures", @@ -16045,25 +17017,34 @@ dependencies = [ "ip_network", "libp2p", "linked_hash_set", + "litep2p", "log", "mockall", "multistream-select", + "once_cell", "parity-scale-codec", "parking_lot 0.12.1", "partial_sort", "pin-project", - "rand", + "prost 0.11.9", + "prost-build", + "rand 0.8.5", + "sc-block-builder", "sc-client-api", "sc-network-common", "sc-network-light", "sc-network-sync", + "sc-network-types", "sc-utils", + "schnellru", "serde", "serde_json", "smallvec", "sp-arithmetic", "sp-blockchain", + "sp-consensus", "sp-core", + "sp-crypto-hashing", "sp-runtime", "sp-test-primitives", "sp-tracing 16.0.0", @@ -16077,38 +17058,13 @@ dependencies = [ "tokio-test", "tokio-util", "unsigned-varint", + "void", "wasm-timer", "zeroize", ] [[package]] -name = "sc-network-bitswap" -version = "0.33.0" -dependencies = [ - "async-channel", - "cid", - "futures", - "libp2p-identity", - "log", - "prost 0.12.3", - "prost-build", - "sc-block-builder", - "sc-client-api", - "sc-consensus", - "sc-network", - "sp-blockchain", - "sp-consensus", - "sp-crypto-hashing", - "sp-runtime", - "substrate-test-runtime", - "substrate-test-runtime-client", - "thiserror", - "tokio", - "unsigned-varint", -] - -[[package]] -name = "sc-network-common" +name = "sc-network-common" version = "0.33.0" dependencies = [ "async-trait", @@ -16118,6 +17074,7 @@ dependencies = [ "parity-scale-codec", "prost-build", "sc-consensus", + "sc-network-types", "sp-consensus", "sp-consensus-grandpa", "sp-runtime", @@ -16128,7 +17085,7 @@ dependencies = [ name = "sc-network-gossip" version = "0.34.0" dependencies = [ - "ahash 0.8.7", + "ahash 0.8.8", "async-trait", "futures", "futures-timer", @@ -16139,6 +17096,7 @@ dependencies = [ "sc-network", "sc-network-common", "sc-network-sync", + "sc-network-types", "schnellru", "sp-runtime", "substrate-prometheus-endpoint", @@ -16154,13 +17112,13 @@ dependencies = [ "array-bytes 6.1.0", "async-channel", "futures", - "libp2p-identity", "log", "parity-scale-codec", "prost 0.12.3", "prost-build", "sc-client-api", "sc-network", + "sc-network-types", "sp-blockchain", "sp-core", "sp-runtime", @@ -16180,7 +17138,9 @@ dependencies = [ "sc-network", "sc-network-common", "sc-network-sync", + "sc-network-types", "sp-consensus", + "sp-runtime", "sp-statement-store", "substrate-prometheus-endpoint", ] @@ -16207,6 +17167,7 @@ dependencies = [ "sc-consensus", "sc-network", "sc-network-common", + "sc-network-types", "sc-utils", "schnellru", "smallvec", @@ -16235,7 +17196,7 @@ dependencies = [ "libp2p", "log", "parking_lot 0.12.1", - "rand", + "rand 0.8.5", "sc-block-builder", "sc-client-api", "sc-consensus", @@ -16243,6 +17204,7 @@ dependencies = [ "sc-network-common", "sc-network-light", "sc-network-sync", + "sc-network-types", "sc-service", "sc-utils", "sp-blockchain", @@ -16267,17 +17229,32 @@ dependencies = [ "sc-network", "sc-network-common", "sc-network-sync", + "sc-network-types", "sc-utils", "sp-consensus", "sp-runtime", "substrate-prometheus-endpoint", ] +[[package]] +name = "sc-network-types" +version = "0.10.0-dev" +dependencies = [ + "bs58 0.4.0", + "libp2p-identity", + "litep2p", + "multiaddr", + "multihash 0.17.0", + "rand 0.8.5", + "thiserror", +] + [[package]] name = "sc-offchain" version = "29.0.0" dependencies = [ "array-bytes 6.1.0", + "async-trait", "bytes", "fnv", "futures", @@ -16291,12 +17268,13 @@ dependencies = [ "once_cell", "parity-scale-codec", "parking_lot 0.12.1", - "rand", + "rand 0.8.5", "sc-block-builder", "sc-client-api", "sc-client-db", "sc-network", "sc-network-common", + "sc-network-types", "sc-transaction-pool", "sc-transaction-pool-api", "sc-utils", @@ -16327,7 +17305,7 @@ name = "sc-rpc" version = "29.0.0" dependencies = [ "assert_matches", - "env_logger 0.9.3", + "env_logger 0.11.3", "futures", "jsonrpsee", "log", @@ -16387,7 +17365,10 @@ dependencies = [ name = "sc-rpc-server" version = "11.0.0" dependencies = [ + "futures", + "governor", "http", + "hyper", "jsonrpsee", "log", "serde_json", @@ -16411,11 +17392,13 @@ dependencies = [ "parity-scale-codec", "parking_lot 0.12.1", "pretty_assertions", + "rand 0.8.5", "sc-block-builder", "sc-chain-spec", "sc-client-api", "sc-rpc", "sc-service", + "sc-transaction-pool", "sc-transaction-pool-api", "sc-utils", "serde", @@ -16431,6 +17414,7 @@ dependencies = [ "sp-version", "substrate-test-runtime", "substrate-test-runtime-client", + "substrate-test-runtime-transaction-pool", "thiserror", "tokio", "tokio-stream", @@ -16462,7 +17446,7 @@ dependencies = [ "parity-scale-codec", "parking_lot 0.12.1", "pin-project", - "rand", + "rand 0.8.5", "sc-chain-spec", "sc-client-api", "sc-client-db", @@ -16471,11 +17455,11 @@ dependencies = [ "sc-informant", "sc-keystore", "sc-network", - "sc-network-bitswap", "sc-network-common", "sc-network-light", "sc-network-sync", "sc-network-transactions", + "sc-network-types", "sc-rpc", "sc-rpc-server", "sc-rpc-spec-v2", @@ -16485,6 +17469,7 @@ dependencies = [ "sc-transaction-pool", "sc-transaction-pool-api", "sc-utils", + "schnellru", "serde", "serde_json", "sp-api", @@ -16562,7 +17547,7 @@ dependencies = [ name = "sc-statement-store" version = "10.0.0" dependencies = [ - "env_logger 0.9.3", + "env_logger 0.11.3", "log", "parity-db", "parking_lot 0.12.1", @@ -16582,7 +17567,7 @@ dependencies = [ name = "sc-storage-monitor" version = "0.16.0" dependencies = [ - "clap 4.4.18", + "clap 4.5.3", "fs4", "log", "sp-core", @@ -16616,7 +17601,7 @@ dependencies = [ "futures", "libc", "log", - "rand", + "rand 0.8.5", "rand_pcg", "regex", "sc-telemetry", @@ -16639,7 +17624,8 @@ dependencies = [ "log", "parking_lot 0.12.1", "pin-project", - "rand", + "rand 0.8.5", + "sc-network", "sc-utils", "serde", "serde_json", @@ -16674,7 +17660,7 @@ dependencies = [ "thiserror", "tracing", "tracing-log 0.1.3", - "tracing-subscriber 0.2.25", + "tracing-subscriber 0.3.18", ] [[package]] @@ -16682,9 +17668,9 @@ name = "sc-tracing-proc-macro" version = "11.0.0" dependencies = [ "proc-macro-crate 3.0.0", - "proc-macro2", - "quote", - "syn 2.0.48", + "proc-macro2 1.0.75", + "quote 1.0.35", + "syn 2.0.53", ] [[package]] @@ -16754,9 +17740,9 @@ dependencies = [ [[package]] name = "scale-info" -version = "2.10.0" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f7d66a1128282b7ef025a8ead62a4a9fcf017382ec53b8ffbf4d7bf77bd3c60" +checksum = "788745a868b0e751750388f4e6546eb921ef714a4317fa6954f7cde114eb2eb7" dependencies = [ "bitvec", "cfg-if", @@ -16768,13 +17754,13 @@ dependencies = [ [[package]] name = "scale-info-derive" -version = "2.10.0" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abf2c68b89cafb3b8d918dd07b42be0da66ff202cf1155c5739a4e0c1ea0dc19" +checksum = "7dc2f4e8bc344b9fc3d5f74f72c2e55bfc38d28dc2ebc69c194a3df424e4d9ac" dependencies = [ "proc-macro-crate 1.3.1", - "proc-macro2", - "quote", + "proc-macro2 1.0.75", + "quote 1.0.35", "syn 1.0.109", ] @@ -16805,8 +17791,8 @@ version = "0.8.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0f696e21e10fa546b7ffb1c9672c6de8fbc7a81acf59524386d8639bf12737" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.75", + "quote 1.0.35", "serde_derive_internals", "syn 1.0.109", ] @@ -16817,27 +17803,11 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "772575a524feeb803e5b0fcbc6dd9f367e579488197c94c6e4023aad2305774d" dependencies = [ - "ahash 0.8.7", + "ahash 0.8.8", "cfg-if", "hashbrown 0.13.2", ] -[[package]] -name = "schnorrkel" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "021b403afe70d81eea68f6ea12f6b3c9588e5d536a94c3bf80f15e7faa267862" -dependencies = [ - "arrayref", - "arrayvec 0.5.2", - "curve25519-dalek 2.1.3", - "merlin 2.0.1", - "rand_core 0.5.1", - "sha2 0.8.2", - "subtle 2.4.1", - "zeroize", -] - [[package]] name = "schnorrkel" version = "0.10.2" @@ -16847,7 +17817,7 @@ dependencies = [ "arrayref", "arrayvec 0.7.4", "curve25519-dalek-ng", - "merlin 3.0.0", + "merlin", "rand_core 0.6.4", "sha2 0.9.9", "subtle-ng", @@ -16863,13 +17833,13 @@ dependencies = [ "aead 0.5.2", "arrayref", "arrayvec 0.7.4", - "curve25519-dalek 4.1.1", + "curve25519-dalek 4.1.2", "getrandom_or_panic", - "merlin 3.0.0", + "merlin", "rand_core 0.6.4", "serde_bytes", "sha2 0.10.7", - "subtle 2.4.1", + "subtle 2.5.0", "zeroize", ] @@ -16901,6 +17871,21 @@ dependencies = [ "untrusted 0.7.1", ] +[[package]] +name = "sctp-proto" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f64cef148d3295c730c3cb340b0b252a4d570b1c7d4bf0808f88540b0a888bc" +dependencies = [ + "bytes", + "crc", + "fxhash", + "log", + "rand 0.8.5", + "slab", + "thiserror", +] + [[package]] name = "sec1" version = "0.7.3" @@ -16911,7 +17896,8 @@ dependencies = [ "der", "generic-array 0.14.7", "pkcs8", - "subtle 2.4.1", + "serdect", + "subtle 2.5.0", "zeroize", ] @@ -17068,9 +18054,9 @@ checksum = "f97841a747eef040fcd2e7b3b9a220a7205926e60488e673d9e4926d27772ce5" [[package]] name = "serde" -version = "1.0.195" +version = "1.0.197" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63261df402c67811e9ac6def069e4786148c4563f4b50fd4bf30aa370d626b02" +checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2" dependencies = [ "serde_derive", ] @@ -17095,13 +18081,13 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.195" +version = "1.0.197" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46fe8f8603d81ba86327b23a2e9cdf49e1255fb94a4c5f297f6ee0547178ea2c" +checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.48", + "proc-macro2 1.0.75", + "quote 1.0.35", + "syn 2.0.53", ] [[package]] @@ -17110,8 +18096,8 @@ version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "85bf8229e7920a9f636479437026331ce11aa132b4dde37d121944a44d6e5f3c" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.75", + "quote 1.0.35", "syn 1.0.109", ] @@ -17126,10 +18112,11 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.111" +version = "1.0.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "176e46fa42316f18edd598015a5166857fc835ec732f5215eac6b7bdbf0a84f4" +checksum = "c5f09b1bd632ef549eaa9f60a1f8de742bdbc698e6cee2095fc84dde5f549ae0" dependencies = [ + "indexmap 2.2.3", "itoa", "ryu", "serde", @@ -17158,17 +18145,27 @@ dependencies = [ [[package]] name = "serde_yaml" -version = "0.9.30" +version = "0.9.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1bf28c79a99f70ee1f1d83d10c875d2e70618417fda01ad1785e027579d9d38" +checksum = "a0623d197252096520c6f2a5e1171ee436e5af99a5d7caa2891e55e61950e6d9" dependencies = [ - "indexmap 2.0.0", + "indexmap 2.2.3", "itoa", "ryu", "serde", "unsafe-libyaml", ] +[[package]] +name = "serdect" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a84f14a19e9a014bb9f4512488d9829a68e04ecabffb0f9904cd1ace94598177" +dependencies = [ + "base16ct", + "serde", +] + [[package]] name = "serial_test" version = "2.0.0" @@ -17189,9 +18186,9 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "91d129178576168c589c9ec973feedf7d3126c01ac2bf08795109aa35b69fb8f" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.48", + "proc-macro2 1.0.75", + "quote 1.0.35", + "syn 2.0.53", ] [[package]] @@ -17216,6 +18213,7 @@ dependencies = [ "cfg-if", "cpufeatures", "digest 0.10.7", + "sha1-asm", ] [[package]] @@ -17230,15 +18228,12 @@ dependencies = [ ] [[package]] -name = "sha2" -version = "0.8.2" +name = "sha1-asm" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a256f46ea78a0c0d9ff00077504903ac881a1dafdc20da66545699e7776b3e69" +checksum = "2ba6947745e7f86be3b8af00b7355857085dbdf8901393c89514510eb61f4e21" dependencies = [ - "block-buffer 0.7.3", - "digest 0.8.1", - "fake-simd", - "opaque-debug 0.2.3", + "cc", ] [[package]] @@ -17346,6 +18341,12 @@ dependencies = [ "libc", ] +[[package]] +name = "signature" +version = "1.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" + [[package]] name = "signature" version = "2.1.0" @@ -17369,10 +18370,20 @@ dependencies = [ "wide", ] +[[package]] +name = "simple-dns" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cae9a3fcdadafb6d97f4c0e007e4247b114ee0f119f650c3cbf3a8b3a1479694" +dependencies = [ + "bitflags 2.4.0", +] + [[package]] name = "simple-mermaid" -version = "0.1.0" -source = "git+https://github.com/kianenigma/simple-mermaid.git?rev=e48b187bcfd5cc75111acd9d241f1bd36604344b#e48b187bcfd5cc75111acd9d241f1bd36604344b" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "620a1d43d70e142b1d46a929af51d44f383db9c7a2ec122de2cd992ccfcf3c18" [[package]] name = "siphasher" @@ -17415,6 +18426,17 @@ dependencies = [ "version_check", ] +[[package]] +name = "sluice" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d7400c0eff44aa2fcb5e31a5f24ba9716ed90138769e4977a2ba6014ae63eb5" +dependencies = [ + "async-channel", + "futures-core", + "futures-io", +] + [[package]] name = "smallvec" version = "1.11.2" @@ -17431,7 +18453,7 @@ dependencies = [ "async-executor", "async-fs", "async-io", - "async-lock", + "async-lock 2.8.0", "async-net", "async-process", "blocking", @@ -17454,7 +18476,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0bb30cf57b7b5f6109ce17c3164445e2d6f270af2cb48f6e4d31c2967c9a9f5" dependencies = [ "arrayvec 0.7.4", - "async-lock", + "async-lock 2.8.0", "atomic-take", "base64 0.21.2", "bip39", @@ -17465,7 +18487,7 @@ dependencies = [ "derive_more", "ed25519-zebra 4.0.3", "either", - "event-listener", + "event-listener 2.5.3", "fnv", "futures-lite", "futures-util", @@ -17474,16 +18496,16 @@ dependencies = [ "hmac 0.12.1", "itertools 0.11.0", "libsecp256k1", - "merlin 3.0.0", + "merlin", "no-std-net", "nom", "num-bigint", "num-rational", "num-traits", - "pbkdf2 0.12.2", + "pbkdf2", "pin-project", "poly1305 0.8.0", - "rand", + "rand 0.8.5", "rand_chacha 0.3.1", "ruzstd", "schnorrkel 0.10.2", @@ -17508,12 +18530,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "256b5bad1d6b49045e95fe87492ce73d5af81545d8b4d8318a872d2007024c33" dependencies = [ "async-channel", - "async-lock", + "async-lock 2.8.0", "base64 0.21.2", "blake2-rfc", "derive_more", "either", - "event-listener", + "event-listener 2.5.3", "fnv", "futures-channel", "futures-lite", @@ -17526,7 +18548,7 @@ dependencies = [ "no-std-net", "parking_lot 0.12.1", "pin-project", - "rand", + "rand 0.8.5", "rand_chacha 0.3.1", "serde", "serde_json", @@ -17549,15 +18571,15 @@ version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c9d1425eb528a21de2755c75af4c9b5d57f50a0d4c3b7f1828a4cd03f8ba155" dependencies = [ - "aes-gcm 0.9.4", + "aes-gcm 0.9.2", "blake2 0.10.6", "chacha20poly1305", - "curve25519-dalek 4.1.1", + "curve25519-dalek 4.1.2", "rand_core 0.6.4", "ring 0.16.20", "rustc_version 0.4.0", "sha2 0.10.7", - "subtle 2.4.1", + "subtle 2.5.0", ] [[package]] @@ -17572,11 +18594,10 @@ dependencies = [ [[package]] name = "snowbridge-beacon-primitives" -version = "0.0.0" +version = "0.2.0" dependencies = [ "byte-slice-cast", "frame-support", - "frame-system", "hex", "hex-literal", "parity-scale-codec", @@ -17591,12 +18612,11 @@ dependencies = [ "sp-std 14.0.0", "ssz_rs", "ssz_rs_derive", - "static_assertions", ] [[package]] name = "snowbridge-core" -version = "0.0.0" +version = "0.2.0" dependencies = [ "ethabi-decode", "frame-support", @@ -17619,7 +18639,7 @@ dependencies = [ [[package]] name = "snowbridge-ethereum" -version = "0.1.0" +version = "0.3.0" dependencies = [ "ethabi-decode", "ethbloom", @@ -17627,14 +18647,12 @@ dependencies = [ "hex-literal", "parity-bytes", "parity-scale-codec", - "rand", + "rand 0.8.5", "rlp", - "rustc-hex", "scale-info", "serde", "serde-big-array", "serde_json", - "sp-core", "sp-io", "sp-runtime", "sp-std 14.0.0", @@ -17650,7 +18668,7 @@ dependencies = [ "hex", "lazy_static", "parity-scale-codec", - "rand", + "rand 0.8.5", "scale-info", "snowbridge-amcl", "zeroize", @@ -17658,10 +18676,10 @@ dependencies = [ [[package]] name = "snowbridge-outbound-queue-merkle-tree" -version = "0.1.1" +version = "0.3.0" dependencies = [ "array-bytes 4.2.0", - "env_logger 0.9.3", + "env_logger 0.11.3", "hex", "hex-literal", "parity-scale-codec", @@ -17673,24 +18691,20 @@ dependencies = [ [[package]] name = "snowbridge-outbound-queue-runtime-api" -version = "0.0.0" +version = "0.2.0" dependencies = [ "frame-support", "parity-scale-codec", "snowbridge-core", "snowbridge-outbound-queue-merkle-tree", "sp-api", - "sp-core", "sp-std 14.0.0", - "staging-xcm", ] [[package]] name = "snowbridge-pallet-ethereum-client" -version = "0.0.0" +version = "0.2.0" dependencies = [ - "bp-runtime", - "byte-slice-cast", "frame-benchmarking", "frame-support", "frame-system", @@ -17698,8 +18712,7 @@ dependencies = [ "log", "pallet-timestamp", "parity-scale-codec", - "rand", - "rlp", + "rand 0.8.5", "scale-info", "serde", "serde_json", @@ -17712,8 +18725,6 @@ dependencies = [ "sp-keyring", "sp-runtime", "sp-std 14.0.0", - "ssz_rs", - "ssz_rs_derive", "static_assertions", ] @@ -17721,9 +18732,6 @@ dependencies = [ name = "snowbridge-pallet-ethereum-client-fixtures" version = "0.9.0" dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", "hex-literal", "snowbridge-beacon-primitives", "snowbridge-core", @@ -17733,24 +18741,21 @@ dependencies = [ [[package]] name = "snowbridge-pallet-inbound-queue" -version = "0.0.0" +version = "0.2.0" dependencies = [ "alloy-primitives", - "alloy-rlp", "alloy-sol-types", "frame-benchmarking", "frame-support", "frame-system", "hex-literal", "log", - "num-traits", "pallet-balances", "parity-scale-codec", "scale-info", "serde", "snowbridge-beacon-primitives", "snowbridge-core", - "snowbridge-ethereum", "snowbridge-pallet-ethereum-client", "snowbridge-pallet-inbound-queue-fixtures", "snowbridge-router-primitives", @@ -17760,17 +18765,13 @@ dependencies = [ "sp-runtime", "sp-std 14.0.0", "staging-xcm", - "staging-xcm-builder", "staging-xcm-executor", ] [[package]] name = "snowbridge-pallet-inbound-queue-fixtures" -version = "0.9.0" +version = "0.10.0" dependencies = [ - "frame-benchmarking", - "frame-support", - "frame-system", "hex-literal", "snowbridge-beacon-primitives", "snowbridge-core", @@ -17780,14 +18781,13 @@ dependencies = [ [[package]] name = "snowbridge-pallet-outbound-queue" -version = "0.0.0" +version = "0.2.0" dependencies = [ "bridge-hub-common", "ethabi-decode", "frame-benchmarking", "frame-support", "frame-system", - "hex-literal", "pallet-message-queue", "parity-scale-codec", "scale-info", @@ -17800,14 +18800,12 @@ dependencies = [ "sp-keyring", "sp-runtime", "sp-std 14.0.0", - "staging-xcm", ] [[package]] name = "snowbridge-pallet-system" -version = "0.0.0" +version = "0.2.0" dependencies = [ - "ethabi-decode", "frame-benchmarking", "frame-support", "frame-system", @@ -17827,39 +18825,33 @@ dependencies = [ "sp-runtime", "sp-std 14.0.0", "staging-xcm", - "staging-xcm-builder", "staging-xcm-executor", ] [[package]] name = "snowbridge-router-primitives" -version = "0.0.0" +version = "0.9.0" dependencies = [ - "ethabi-decode", "frame-support", - "frame-system", "hex-literal", "log", "parity-scale-codec", "rustc-hex", "scale-info", - "serde", "snowbridge-core", "sp-core", "sp-io", "sp-runtime", "sp-std 14.0.0", "staging-xcm", - "staging-xcm-builder", "staging-xcm-executor", ] [[package]] name = "snowbridge-runtime-common" -version = "0.0.0" +version = "0.2.0" dependencies = [ "frame-support", - "frame-system", "log", "parity-scale-codec", "snowbridge-core", @@ -17872,89 +18864,41 @@ dependencies = [ [[package]] name = "snowbridge-runtime-test-common" -version = "0.0.0" +version = "0.2.0" dependencies = [ - "assets-common", - "bridge-hub-test-utils", - "bridge-runtime-common", - "cumulus-pallet-aura-ext", "cumulus-pallet-parachain-system", - "cumulus-pallet-session-benchmarking", - "cumulus-pallet-xcm", - "cumulus-pallet-xcmp-queue", - "cumulus-primitives-core", - "cumulus-primitives-utility", - "frame-benchmarking", - "frame-executive", "frame-support", "frame-system", - "frame-system-benchmarking", - "frame-system-rpc-runtime-api", - "frame-try-runtime", - "hex-literal", - "log", - "pallet-aura", - "pallet-authorship", "pallet-balances", "pallet-collator-selection", "pallet-message-queue", - "pallet-multisig", "pallet-session", "pallet-timestamp", - "pallet-transaction-payment", - "pallet-transaction-payment-rpc-runtime-api", "pallet-utility", "pallet-xcm", - "pallet-xcm-benchmarks", - "parachains-common", "parachains-runtimes-test-utils", "parity-scale-codec", - "polkadot-core-primitives", - "polkadot-parachain-primitives", - "polkadot-runtime-common", - "scale-info", - "serde", - "smallvec", - "snowbridge-beacon-primitives", "snowbridge-core", - "snowbridge-outbound-queue-runtime-api", "snowbridge-pallet-ethereum-client", "snowbridge-pallet-ethereum-client-fixtures", - "snowbridge-pallet-inbound-queue", "snowbridge-pallet-outbound-queue", "snowbridge-pallet-system", - "snowbridge-router-primitives", - "snowbridge-system-runtime-api", - "sp-api", - "sp-block-builder", - "sp-consensus-aura", "sp-core", - "sp-genesis-builder", - "sp-inherents", "sp-io", "sp-keyring", - "sp-offchain", "sp-runtime", - "sp-session", - "sp-std 14.0.0", - "sp-storage 19.0.0", - "sp-transaction-pool", - "sp-version", "staging-parachain-info", "staging-xcm", - "staging-xcm-builder", "staging-xcm-executor", - "static_assertions", ] [[package]] name = "snowbridge-system-runtime-api" -version = "0.0.0" +version = "0.2.0" dependencies = [ "parity-scale-codec", "snowbridge-core", "sp-api", - "sp-core", "sp-std 14.0.0", "staging-xcm", ] @@ -17971,12 +18915,12 @@ dependencies = [ [[package]] name = "socket2" -version = "0.5.3" +version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2538b18701741680e0322a2302176d3253a35388e2e62f172f64f4f16605f877" +checksum = "05ffd9c0a93b7543e062e759284fcf5f5e3b098501104bfbdde4d404db792871" dependencies = [ "libc", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] @@ -17992,10 +18936,90 @@ dependencies = [ "http", "httparse", "log", - "rand", + "rand 0.8.5", "sha-1 0.9.8", ] +[[package]] +name = "solochain-template-node" +version = "0.0.0" +dependencies = [ + "clap 4.5.3", + "frame-benchmarking-cli", + "frame-system", + "futures", + "jsonrpsee", + "pallet-transaction-payment", + "pallet-transaction-payment-rpc", + "sc-basic-authorship", + "sc-cli", + "sc-client-api", + "sc-consensus", + "sc-consensus-aura", + "sc-consensus-grandpa", + "sc-executor", + "sc-network", + "sc-offchain", + "sc-rpc-api", + "sc-service", + "sc-telemetry", + "sc-transaction-pool", + "sc-transaction-pool-api", + "serde_json", + "solochain-template-runtime", + "sp-api", + "sp-block-builder", + "sp-blockchain", + "sp-consensus-aura", + "sp-consensus-grandpa", + "sp-core", + "sp-inherents", + "sp-io", + "sp-keyring", + "sp-runtime", + "sp-timestamp", + "substrate-build-script-utils", + "substrate-frame-rpc-system", +] + +[[package]] +name = "solochain-template-runtime" +version = "0.0.0" +dependencies = [ + "frame-benchmarking", + "frame-executive", + "frame-support", + "frame-system", + "frame-system-benchmarking", + "frame-system-rpc-runtime-api", + "frame-try-runtime", + "pallet-aura", + "pallet-balances", + "pallet-grandpa", + "pallet-sudo", + "pallet-template", + "pallet-timestamp", + "pallet-transaction-payment", + "pallet-transaction-payment-rpc-runtime-api", + "parity-scale-codec", + "scale-info", + "sp-api", + "sp-block-builder", + "sp-consensus-aura", + "sp-consensus-grandpa", + "sp-core", + "sp-genesis-builder", + "sp-inherents", + "sp-offchain", + "sp-runtime", + "sp-session", + "sp-std 14.0.0", + "sp-storage 19.0.0", + "sp-transaction-pool", + "sp-version", + "substrate-wasm-builder", +] + [[package]] name = "sp-api" version = "26.0.0" @@ -18027,9 +19051,9 @@ dependencies = [ "blake2 0.10.6", "expander 2.0.0", "proc-macro-crate 3.0.0", - "proc-macro2", - "quote", - "syn 2.0.48", + "proc-macro2 1.0.75", + "quote 1.0.35", + "syn 2.0.53", ] [[package]] @@ -18083,11 +19107,12 @@ name = "sp-arithmetic" version = "23.0.0" dependencies = [ "criterion 0.4.0", + "docify", "integer-sqrt", "num-traits", "parity-scale-codec", "primitive-types", - "rand", + "rand 0.8.5", "scale-info", "serde", "sp-crypto-hashing", @@ -18133,7 +19158,6 @@ dependencies = [ "sp-api", "sp-application-crypto", "sp-runtime", - "sp-std 14.0.0", ] [[package]] @@ -18143,7 +19167,6 @@ dependencies = [ "sp-api", "sp-inherents", "sp-runtime", - "sp-std 14.0.0", ] [[package]] @@ -18190,7 +19213,6 @@ dependencies = [ "sp-consensus-slots", "sp-inherents", "sp-runtime", - "sp-std 14.0.0", "sp-timestamp", ] @@ -18208,7 +19230,6 @@ dependencies = [ "sp-core", "sp-inherents", "sp-runtime", - "sp-std 14.0.0", "sp-timestamp", ] @@ -18226,10 +19247,10 @@ dependencies = [ "sp-core", "sp-crypto-hashing", "sp-io", + "sp-keystore", "sp-mmr-primitives", "sp-runtime", - "sp-std 14.0.0", - "strum 0.24.1", + "strum 0.26.2", "w3f-bls", ] @@ -18247,7 +19268,6 @@ dependencies = [ "sp-core", "sp-keystore", "sp-runtime", - "sp-std 14.0.0", ] [[package]] @@ -18258,7 +19278,6 @@ dependencies = [ "sp-api", "sp-core", "sp-runtime", - "sp-std 14.0.0", ] [[package]] @@ -18273,7 +19292,6 @@ dependencies = [ "sp-consensus-slots", "sp-core", "sp-runtime", - "sp-std 14.0.0", ] [[package]] @@ -18283,7 +19301,6 @@ dependencies = [ "parity-scale-codec", "scale-info", "serde", - "sp-std 14.0.0", "sp-timestamp", ] @@ -18293,7 +19310,6 @@ version = "28.0.0" dependencies = [ "array-bytes 6.1.0", "bandersnatch_vrfs", - "bip39", "bitflags 1.3.2", "blake2 0.10.6", "bounded-collections", @@ -18306,15 +19322,17 @@ dependencies = [ "hash256-std-hasher", "impl-serde", "itertools 0.10.5", + "k256", "lazy_static", "libsecp256k1", "log", - "merlin 3.0.0", + "merlin", + "parity-bip39", "parity-scale-codec", "parking_lot 0.12.1", "paste", "primitive-types", - "rand", + "rand 0.8.5", "regex", "scale-info", "schnorrkel 0.11.4", @@ -18398,12 +19416,11 @@ dependencies = [ "ark-ed-on-bls12-381-bandersnatch-ext", "ark-scale 0.0.12", "sp-runtime-interface 24.0.0", - "sp-std 14.0.0", ] [[package]] name = "sp-crypto-hashing" -version = "0.0.0" +version = "0.1.0" dependencies = [ "blake2b_simd", "byteorder", @@ -18417,11 +19434,11 @@ dependencies = [ [[package]] name = "sp-crypto-hashing-proc-macro" -version = "0.0.0" +version = "0.1.0" dependencies = [ - "quote", + "quote 1.0.35", "sp-crypto-hashing", - "syn 2.0.48", + "syn 2.0.53", ] [[package]] @@ -18437,18 +19454,18 @@ name = "sp-debug-derive" version = "8.0.0" source = "git+https://github.com/paritytech/polkadot-sdk#82912acb33a9030c0ef3bf590a34fca09b72dc5f" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.48", + "proc-macro2 1.0.75", + "quote 1.0.35", + "syn 2.0.53", ] [[package]] name = "sp-debug-derive" version = "14.0.0" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.48", + "proc-macro2 1.0.75", + "quote 1.0.35", + "syn 2.0.53", ] [[package]] @@ -18468,18 +19485,18 @@ version = "0.25.0" dependencies = [ "environmental", "parity-scale-codec", - "sp-std 14.0.0", "sp-storage 19.0.0", ] [[package]] name = "sp-genesis-builder" -version = "0.7.0" +version = "0.8.0" dependencies = [ + "parity-scale-codec", + "scale-info", "serde_json", "sp-api", "sp-runtime", - "sp-std 14.0.0", ] [[package]] @@ -18492,7 +19509,6 @@ dependencies = [ "parity-scale-codec", "scale-info", "sp-runtime", - "sp-std 14.0.0", "thiserror", ] @@ -18501,10 +19517,11 @@ name = "sp-io" version = "30.0.0" dependencies = [ "bytes", - "ed25519-dalek", + "ed25519-dalek 2.1.0", "libsecp256k1", "log", "parity-scale-codec", + "polkavm-derive", "rustversion", "secp256k1", "sp-core", @@ -18526,7 +19543,7 @@ version = "31.0.0" dependencies = [ "sp-core", "sp-runtime", - "strum 0.24.1", + "strum 0.26.2", ] [[package]] @@ -18535,11 +19552,10 @@ version = "0.34.0" dependencies = [ "parity-scale-codec", "parking_lot 0.12.1", - "rand", + "rand 0.8.5", "rand_chacha 0.2.2", "sp-core", "sp-externalities 0.25.0", - "thiserror", ] [[package]] @@ -18557,7 +19573,6 @@ dependencies = [ "frame-metadata", "parity-scale-codec", "scale-info", - "sp-std 14.0.0", ] [[package]] @@ -18568,7 +19583,6 @@ dependencies = [ "scale-info", "sp-api", "sp-application-crypto", - "sp-std 14.0.0", ] [[package]] @@ -18585,7 +19599,6 @@ dependencies = [ "sp-core", "sp-debug-derive 14.0.0", "sp-runtime", - "sp-std 14.0.0", "thiserror", ] @@ -18594,13 +19607,12 @@ name = "sp-npos-elections" version = "26.0.0" dependencies = [ "parity-scale-codec", - "rand", + "rand 0.8.5", "scale-info", "serde", "sp-arithmetic", "sp-core", "sp-runtime", - "sp-std 14.0.0", "substrate-test-utils", ] @@ -18608,9 +19620,9 @@ dependencies = [ name = "sp-npos-elections-fuzzer" version = "2.0.0-alpha.5" dependencies = [ - "clap 4.4.18", + "clap 4.5.3", "honggfuzz", - "rand", + "rand 0.8.5", "sp-npos-elections", "sp-runtime", ] @@ -18654,7 +19666,7 @@ dependencies = [ "log", "parity-scale-codec", "paste", - "rand", + "rand 0.8.5", "scale-info", "serde", "serde_json", @@ -18697,7 +19709,7 @@ dependencies = [ "bytes", "impl-trait-for-tuples", "parity-scale-codec", - "polkavm-derive 0.8.0", + "polkavm-derive", "primitive-types", "rustversion", "sp-core", @@ -18721,9 +19733,9 @@ source = "git+https://github.com/paritytech/polkadot-sdk#82912acb33a9030c0ef3bf5 dependencies = [ "Inflector", "proc-macro-crate 1.3.1", - "proc-macro2", - "quote", - "syn 2.0.48", + "proc-macro2 1.0.75", + "quote 1.0.35", + "syn 2.0.53", ] [[package]] @@ -18733,9 +19745,9 @@ dependencies = [ "Inflector", "expander 2.0.0", "proc-macro-crate 3.0.0", - "proc-macro2", - "quote", - "syn 2.0.48", + "proc-macro2 1.0.75", + "quote 1.0.35", + "syn 2.0.53", ] [[package]] @@ -18787,7 +19799,6 @@ dependencies = [ "sp-keystore", "sp-runtime", "sp-staking", - "sp-std 14.0.0", ] [[package]] @@ -18800,7 +19811,6 @@ dependencies = [ "serde", "sp-core", "sp-runtime", - "sp-std 14.0.0", ] [[package]] @@ -18814,13 +19824,12 @@ dependencies = [ "parity-scale-codec", "parking_lot 0.12.1", "pretty_assertions", - "rand", + "rand 0.8.5", "smallvec", "sp-core", "sp-externalities 0.25.0", "sp-panic-handler", "sp-runtime", - "sp-std 14.0.0", "sp-trie", "thiserror", "tracing", @@ -18832,11 +19841,11 @@ name = "sp-statement-store" version = "10.0.0" dependencies = [ "aes-gcm 0.10.3", - "curve25519-dalek 4.1.1", - "ed25519-dalek", + "curve25519-dalek 4.1.2", + "ed25519-dalek 2.1.0", "hkdf", "parity-scale-codec", - "rand", + "rand 0.8.5", "scale-info", "sha2 0.10.7", "sp-api", @@ -18846,7 +19855,6 @@ dependencies = [ "sp-externalities 0.25.0", "sp-runtime", "sp-runtime-interface 24.0.0", - "sp-std 14.0.0", "thiserror", "x25519-dalek 2.0.0", ] @@ -18882,7 +19890,6 @@ dependencies = [ "ref-cast", "serde", "sp-debug-derive 14.0.0", - "sp-std 14.0.0", ] [[package]] @@ -18895,7 +19902,6 @@ dependencies = [ "sp-application-crypto", "sp-core", "sp-runtime", - "sp-std 14.0.0", ] [[package]] @@ -18906,7 +19912,6 @@ dependencies = [ "parity-scale-codec", "sp-inherents", "sp-runtime", - "sp-std 14.0.0", "thiserror", ] @@ -18927,10 +19932,9 @@ name = "sp-tracing" version = "16.0.0" dependencies = [ "parity-scale-codec", - "sp-std 14.0.0", "tracing", "tracing-core", - "tracing-subscriber 0.2.25", + "tracing-subscriber 0.3.18", ] [[package]] @@ -18951,7 +19955,6 @@ dependencies = [ "sp-core", "sp-inherents", "sp-runtime", - "sp-std 14.0.0", "sp-trie", ] @@ -18959,22 +19962,21 @@ dependencies = [ name = "sp-trie" version = "29.0.0" dependencies = [ - "ahash 0.8.7", + "ahash 0.8.8", "array-bytes 6.1.0", - "criterion 0.4.0", + "criterion 0.5.1", "hash-db", "lazy_static", "memory-db", "nohash-hasher", "parity-scale-codec", "parking_lot 0.12.1", - "rand", + "rand 0.8.5", "scale-info", "schnellru", "sp-core", "sp-externalities 0.25.0", "sp-runtime", - "sp-std 14.0.0", "thiserror", "tracing", "trie-bench", @@ -19004,10 +20006,10 @@ name = "sp-version-proc-macro" version = "13.0.0" dependencies = [ "parity-scale-codec", - "proc-macro2", - "quote", + "proc-macro2 1.0.75", + "quote 1.0.35", "sp-version", - "syn 2.0.48", + "syn 2.0.53", ] [[package]] @@ -19031,7 +20033,6 @@ dependencies = [ "impl-trait-for-tuples", "log", "parity-scale-codec", - "sp-std 14.0.0", "wasmtime", ] @@ -19047,7 +20048,6 @@ dependencies = [ "smallvec", "sp-arithmetic", "sp-debug-derive 14.0.0", - "sp-std 14.0.0", ] [[package]] @@ -19091,11 +20091,11 @@ checksum = "5e6915280e2d0db8911e5032a5c275571af6bdded2916abd691a659be25d3439" dependencies = [ "Inflector", "num-format", - "proc-macro2", - "quote", + "proc-macro2 1.0.75", + "quote 1.0.35", "serde", "serde_json", - "unicode-xid", + "unicode-xid 0.2.4", ] [[package]] @@ -19116,8 +20116,8 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f07d54c4d01a1713eb363b55ba51595da15f6f1211435b71466460da022aa140" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.75", + "quote 1.0.35", "syn 1.0.109", ] @@ -19129,9 +20129,9 @@ checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" [[package]] name = "staging-chain-spec-builder" -version = "2.0.0" +version = "3.0.0" dependencies = [ - "clap 4.4.18", + "clap 4.5.3", "log", "sc-chain-spec", "serde_json", @@ -19144,7 +20144,7 @@ version = "3.0.0-dev" dependencies = [ "array-bytes 6.1.0", "assert_cmd", - "clap 4.4.18", + "clap 4.5.3", "clap_complete", "criterion 0.4.0", "frame-benchmarking", @@ -19176,7 +20176,7 @@ dependencies = [ "pallet-treasury", "parity-scale-codec", "platforms", - "rand", + "rand 0.8.5", "regex", "sc-authority-discovery", "sc-basic-authorship", @@ -19224,6 +20224,7 @@ dependencies = [ "sp-core", "sp-crypto-hashing", "sp-externalities 0.25.0", + "sp-genesis-builder", "sp-inherents", "sp-io", "sp-keyring", @@ -19245,7 +20246,6 @@ dependencies = [ "tempfile", "tokio", "tokio-util", - "try-runtime-cli", "wait-timeout", "wat", ] @@ -19254,7 +20254,7 @@ dependencies = [ name = "staging-node-inspect" version = "0.12.0" dependencies = [ - "clap 4.4.18", + "clap 4.5.3", "parity-scale-codec", "sc-cli", "sc-client-api", @@ -19384,11 +20384,31 @@ checksum = "70a2595fc3aa78f2d0e45dd425b22282dd863273761cc77780914b2cf3003acf" dependencies = [ "cfg_aliases", "memchr", - "proc-macro2", - "quote", + "proc-macro2 1.0.75", + "quote 1.0.35", "syn 1.0.109", ] +[[package]] +name = "str0m" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee48572247f422dcbe68630c973f8296fbd5157119cd36a3223e48bf83d47727" +dependencies = [ + "combine", + "crc", + "hmac 0.12.1", + "once_cell", + "openssl", + "openssl-sys", + "rand 0.8.5", + "sctp-proto", + "serde", + "sha-1 0.10.1", + "thiserror", + "tracing", +] + [[package]] name = "strobe-rs" version = "0.8.1" @@ -19398,16 +20418,52 @@ dependencies = [ "bitflags 1.3.2", "byteorder", "keccak", - "subtle 2.4.1", + "subtle 2.5.0", "zeroize", ] +[[package]] +name = "strsim" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" + [[package]] name = "strsim" version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" +[[package]] +name = "strsim" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ee073c9e4cd00e28217186dbe12796d692868f432bf2e97ee73bed0c56dfa01" + +[[package]] +name = "structopt" +version = "0.3.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c6b5c64445ba8094a6ab0c3cd2ad323e07171012d9c98b0b15651daf1787a10" +dependencies = [ + "clap 2.34.0", + "lazy_static", + "structopt-derive", +] + +[[package]] +name = "structopt-derive" +version = "0.4.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcb5ae327f9cc13b68763b5749770cb9e048a99bd9dfdfa58d0cf05d5f64afe0" +dependencies = [ + "heck 0.3.3", + "proc-macro-error", + "proc-macro2 1.0.75", + "quote 1.0.35", + "syn 1.0.109", +] + [[package]] name = "strum" version = "0.24.1" @@ -19423,15 +20479,24 @@ version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "290d54ea6f91c969195bdbcd7442c8c2a2ba87da8bf60a7ee86a235d4bc1e125" +[[package]] +name = "strum" +version = "0.26.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d8cec3501a5194c432b2b7976db6b7d10ec95c253208b45f83f7136aa985e29" +dependencies = [ + "strum_macros 0.26.2", +] + [[package]] name = "strum_macros" version = "0.24.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e385be0d24f186b4ce2f9982191e7101bb737312ad61c1f2f984f34bcf85d59" dependencies = [ - "heck", - "proc-macro2", - "quote", + "heck 0.4.1", + "proc-macro2 1.0.75", + "quote 1.0.35", "rustversion", "syn 1.0.109", ] @@ -19442,31 +20507,44 @@ version = "0.25.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "23dc1fa9ac9c169a78ba62f0b841814b7abae11bdd047b9c58f893439e309ea0" dependencies = [ - "heck", - "proc-macro2", - "quote", + "heck 0.4.1", + "proc-macro2 1.0.75", + "quote 1.0.35", "rustversion", - "syn 2.0.48", + "syn 2.0.53", +] + +[[package]] +name = "strum_macros" +version = "0.26.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6cf59daf282c0a494ba14fd21610a0325f9f90ec9d1231dea26bcb1d696c946" +dependencies = [ + "heck 0.4.1", + "proc-macro2 1.0.75", + "quote 1.0.35", + "rustversion", + "syn 2.0.53", ] [[package]] name = "subkey" version = "9.0.0" dependencies = [ - "clap 4.4.18", + "clap 4.5.3", "sc-cli", ] [[package]] name = "substrate-bip39" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e620c7098893ba667438b47169c00aacdd9e7c10e042250ce2b60b087ec97328" +version = "0.4.7" dependencies = [ - "hmac 0.11.0", - "pbkdf2 0.8.0", - "schnorrkel 0.9.1", - "sha2 0.9.9", + "bip39", + "hmac 0.12.1", + "pbkdf2", + "rustc-hex", + "schnorrkel 0.11.4", + "sha2 0.10.7", "zeroize", ] @@ -19495,7 +20573,7 @@ dependencies = [ name = "substrate-frame-cli" version = "32.0.0" dependencies = [ - "clap 4.4.18", + "clap 4.5.3", "frame-support", "frame-system", "sc-cli", @@ -19551,7 +20629,50 @@ dependencies = [ "log", "prometheus", "thiserror", - "tokio", + "tokio", +] + +[[package]] +name = "substrate-relay-helper" +version = "0.1.0" +dependencies = [ + "anyhow", + "async-std", + "async-trait", + "bp-header-chain", + "bp-messages", + "bp-parachains", + "bp-polkadot-core", + "bp-relayers", + "bp-runtime", + "bridge-runtime-common", + "equivocation-detector", + "finality-grandpa", + "finality-relay", + "frame-support", + "frame-system", + "futures", + "hex", + "log", + "messages-relay", + "num-traits", + "pallet-balances", + "pallet-bridge-grandpa", + "pallet-bridge-messages", + "pallet-bridge-parachains", + "pallet-grandpa", + "pallet-transaction-payment", + "parachains-relay", + "parity-scale-codec", + "rbtag", + "relay-substrate-client", + "relay-utils", + "sp-consensus-grandpa", + "sp-core", + "sp-runtime", + "structopt", + "strum 0.26.2", + "thiserror", ] [[package]] @@ -19621,6 +20742,7 @@ dependencies = [ "frame-system", "frame-system-rpc-runtime-api", "futures", + "hex-literal", "log", "pallet-babe", "pallet-balances", @@ -19652,7 +20774,6 @@ dependencies = [ "sp-runtime", "sp-session", "sp-state-machine", - "sp-std 14.0.0", "sp-tracing 16.0.0", "sp-transaction-pool", "sp-trie", @@ -19713,9 +20834,9 @@ dependencies = [ "console", "filetime", "parity-wasm", - "polkavm-linker 0.8.1", + "polkavm-linker", "sp-maybe-compressed-blob", - "strum 0.24.1", + "strum 0.26.2", "tempfile", "toml 0.8.8", "walkdir", @@ -19730,9 +20851,9 @@ checksum = "2d67a5a62ba6e01cb2192ff309324cb4875d0c451d55fe2319433abe7a05a8ee" [[package]] name = "subtle" -version = "2.4.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" +checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" [[package]] name = "subtle-ng" @@ -19831,25 +20952,36 @@ dependencies = [ "symbolic-common", ] +[[package]] +name = "syn" +version = "0.15.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ca4b3b69a77cbe1ffc9e198781b7acb0c7365a883670e8f1c1bc66fba79a5c5" +dependencies = [ + "proc-macro2 0.4.30", + "quote 0.6.13", + "unicode-xid 0.1.0", +] + [[package]] name = "syn" version = "1.0.109" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.75", + "quote 1.0.35", "unicode-ident", ] [[package]] name = "syn" -version = "2.0.48" +version = "2.0.53" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f" +checksum = "7383cd0e49fff4b6b90ca5670bfd3e9d6a733b3f90c686605aa7eec8c4996032" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.75", + "quote 1.0.35", "unicode-ident", ] @@ -19860,9 +20992,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "86b837ef12ab88835251726eb12237655e61ec8dc8a280085d1961cdc3dfd047" dependencies = [ "paste", - "proc-macro2", - "quote", - "syn 2.0.48", + "proc-macro2 1.0.75", + "quote 1.0.35", + "syn 2.0.53", ] [[package]] @@ -19871,10 +21003,25 @@ version = "0.12.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.75", + "quote 1.0.35", "syn 1.0.109", - "unicode-xid", + "unicode-xid 0.2.4", +] + +[[package]] +name = "sysinfo" +version = "0.30.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fb4f3438c8f6389c864e61221cbc97e9bca98b4daf39a5beb7bea660f528bb2" +dependencies = [ + "cfg-if", + "core-foundation-sys", + "libc", + "ntapi", + "once_cell", + "rayon", + "windows 0.52.0", ] [[package]] @@ -19976,7 +21123,7 @@ dependencies = [ name = "test-parachain-adder-collator" version = "1.0.0" dependencies = [ - "clap 4.4.18", + "clap 4.5.3", "futures", "futures-timer", "log", @@ -20024,7 +21171,7 @@ dependencies = [ name = "test-parachain-undying-collator" version = "1.0.0" dependencies = [ - "clap 4.4.18", + "clap 4.5.3", "futures", "futures-timer", "log", @@ -20084,6 +21231,15 @@ dependencies = [ "westend-runtime-constants", ] +[[package]] +name = "textwrap" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" +dependencies = [ + "unicode-width", +] + [[package]] name = "textwrap" version = "0.16.0" @@ -20114,8 +21270,8 @@ version = "1.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "10ac1c5050e43014d16b2f94d0d2ce79e65ffdd8b38d8048f9c8f6a8a6da62ac" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.75", + "quote 1.0.35", "syn 1.0.109", ] @@ -20125,9 +21281,9 @@ version = "1.0.50" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.48", + "proc-macro2 1.0.75", + "quote 1.0.35", + "syn 2.0.53", ] [[package]] @@ -20207,6 +21363,8 @@ checksum = "0bb39ee79a6d8de55f48f2293a830e040392f1c5f16e336bdd1788cd0aadce07" dependencies = [ "deranged", "itoa", + "libc", + "num_threads", "serde", "time-core", "time-macros", @@ -20263,9 +21421,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.33.0" +version = "1.37.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f38200e3ef7995e5ef13baec2f432a6da0aa9ac495b2c0e8f3b7eec2c92d653" +checksum = "1adbebffeca75fcfd058afa480fb6c0b81e165a0323f9c9d39c9697e37c46787" dependencies = [ "backtrace", "bytes", @@ -20275,20 +21433,20 @@ dependencies = [ "parking_lot 0.12.1", "pin-project-lite 0.2.12", "signal-hook-registry", - "socket2 0.5.3", + "socket2 0.5.6", "tokio-macros", "windows-sys 0.48.0", ] [[package]] name = "tokio-macros" -version = "2.1.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" +checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.48", + "proc-macro2 1.0.75", + "quote 1.0.35", + "syn 2.0.53", ] [[package]] @@ -20298,7 +21456,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f57eb36ecbe0fc510036adff84824dd3c24bb781e21bfa67b69d556aa85214f" dependencies = [ "pin-project", - "rand", + "rand 0.8.5", "tokio", ] @@ -20312,6 +21470,17 @@ dependencies = [ "tokio", ] +[[package]] +name = "tokio-rustls" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "775e0c0f0adb3a2f22a00c4745d728b479985fc15ee7ca6a2608388c5569860f" +dependencies = [ + "rustls 0.22.2", + "rustls-pki-types", + "tokio", +] + [[package]] name = "tokio-stream" version = "0.1.14" @@ -20346,7 +21515,22 @@ dependencies = [ "futures-util", "log", "tokio", - "tungstenite", + "tungstenite 0.17.3", +] + +[[package]] +name = "tokio-tungstenite" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "212d5dcb2a1ce06d81107c3d0ffa3121fe974b73f068c8282cb1c32328113b6c" +dependencies = [ + "futures-util", + "log", + "rustls 0.21.6", + "rustls-native-certs 0.6.3", + "tokio", + "tokio-rustls 0.24.1", + "tungstenite 0.20.1", ] [[package]] @@ -20400,7 +21584,7 @@ version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ - "indexmap 2.0.0", + "indexmap 2.2.3", "toml_datetime", "winnow", ] @@ -20411,7 +21595,7 @@ version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d34d383cd00a163b4a5b85053df514d45bc330f6de7737edfe0a93311d1eaa03" dependencies = [ - "indexmap 2.0.0", + "indexmap 2.2.3", "serde", "serde_spanned", "toml_datetime", @@ -20465,11 +21649,10 @@ checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" [[package]] name = "tracing" -version = "0.1.37" +version = "0.1.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" dependencies = [ - "cfg-if", "log", "pin-project-lite 0.2.12", "tracing-attributes", @@ -20478,13 +21661,13 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.26" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" +checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.48", + "proc-macro2 1.0.75", + "quote 1.0.35", + "syn 2.0.53", ] [[package]] @@ -20524,9 +21707,9 @@ dependencies = [ "assert_matches", "expander 2.0.0", "proc-macro-crate 3.0.0", - "proc-macro2", - "quote", - "syn 2.0.48", + "proc-macro2 1.0.75", + "quote 1.0.35", + "syn 2.0.53", ] [[package]] @@ -20571,7 +21754,6 @@ dependencies = [ "chrono", "lazy_static", "matchers 0.0.1", - "parking_lot 0.11.2", "regex", "serde", "serde_json", @@ -20590,9 +21772,11 @@ version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" dependencies = [ + "chrono", "matchers 0.1.0", "nu-ansi-term", "once_cell", + "parking_lot 0.12.1", "regex", "sharded-slab", "smallvec", @@ -20604,11 +21788,11 @@ dependencies = [ [[package]] name = "trie-bench" -version = "0.38.0" +version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4680cb226e31d2a096592d0edecdda91cc371743002f80c0f8cf80219819b3b" +checksum = "3092f400e9f7e3ce8c1756016a8b6287163ab7a11dd47d82169260cb4cc2d680" dependencies = [ - "criterion 0.4.0", + "criterion 0.5.1", "hash-db", "keccak-hasher", "memory-db", @@ -20620,12 +21804,11 @@ dependencies = [ [[package]] name = "trie-db" -version = "0.28.0" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff28e0f815c2fea41ebddf148e008b077d2faddb026c9555b29696114d602642" +checksum = "65ed83be775d85ebb0e272914fff6462c39b3ddd6dc67b5c1c41271aad280c69" dependencies = [ "hash-db", - "hashbrown 0.13.2", "log", "rustc-hex", "smallvec", @@ -20659,14 +21842,14 @@ dependencies = [ "async-trait", "cfg-if", "data-encoding", - "enum-as-inner", + "enum-as-inner 0.5.1", "futures-channel", "futures-io", "futures-util", "idna 0.2.3", "ipnet", "lazy_static", - "rand", + "rand 0.8.5", "smallvec", "socket2 0.4.9", "thiserror", @@ -20676,6 +21859,31 @@ dependencies = [ "url", ] +[[package]] +name = "trust-dns-proto" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3119112651c157f4488931a01e586aa459736e9d6046d3bd9105ffb69352d374" +dependencies = [ + "async-trait", + "cfg-if", + "data-encoding", + "enum-as-inner 0.6.0", + "futures-channel", + "futures-io", + "futures-util", + "idna 0.4.0", + "ipnet", + "once_cell", + "rand 0.8.5", + "smallvec", + "thiserror", + "tinyvec", + "tokio", + "tracing", + "url", +] + [[package]] name = "trust-dns-resolver" version = "0.22.0" @@ -20693,56 +21901,36 @@ dependencies = [ "thiserror", "tokio", "tracing", - "trust-dns-proto", + "trust-dns-proto 0.22.0", ] [[package]] -name = "try-lock" -version = "0.2.4" +name = "trust-dns-resolver" +version = "0.23.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" - -[[package]] -name = "try-runtime-cli" -version = "0.38.0" +checksum = "10a3e6c3aff1718b3c73e395d1f35202ba2ffa847c6a62eea0db8fb4cfe30be6" dependencies = [ - "assert_cmd", - "async-trait", - "clap 4.4.18", - "frame-remote-externalities", - "frame-try-runtime", - "hex", - "log", - "node-primitives", - "parity-scale-codec", - "regex", - "sc-cli", - "sc-executor", - "serde", - "serde_json", - "sp-api", - "sp-consensus-aura", - "sp-consensus-babe", - "sp-core", - "sp-debug-derive 14.0.0", - "sp-externalities 0.25.0", - "sp-inherents", - "sp-io", - "sp-keystore", - "sp-rpc", - "sp-runtime", - "sp-state-machine", - "sp-timestamp", - "sp-transaction-storage-proof", - "sp-version", - "sp-weights", - "substrate-cli-test-utils", - "substrate-rpc-client", - "tempfile", + "cfg-if", + "futures-util", + "ipconfig", + "lru-cache", + "once_cell", + "parking_lot 0.12.1", + "rand 0.8.5", + "resolv-conf", + "smallvec", + "thiserror", "tokio", - "zstd 0.12.4", + "tracing", + "trust-dns-proto 0.23.2", ] +[[package]] +name = "try-lock" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" + [[package]] name = "trybuild" version = "1.0.89" @@ -20777,13 +21965,33 @@ dependencies = [ "http", "httparse", "log", - "rand", + "rand 0.8.5", "sha-1 0.10.1", "thiserror", "url", "utf-8", ] +[[package]] +name = "tungstenite" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e3dac10fd62eaf6617d3a904ae222845979aec67c615d1c842b4002c7666fb9" +dependencies = [ + "byteorder", + "bytes", + "data-encoding", + "http", + "httparse", + "log", + "rand 0.8.5", + "rustls 0.21.6", + "sha1", + "thiserror", + "url", + "utf-8", +] + [[package]] name = "twox-hash" version = "1.6.3" @@ -20792,7 +22000,7 @@ checksum = "97fee6b57c6a41524a810daee9286c02d7752c4253064d0b05472833a438f675" dependencies = [ "cfg-if", "digest 0.10.7", - "rand", + "rand 0.8.5", "static_assertions", ] @@ -20847,12 +22055,24 @@ dependencies = [ "tinyvec", ] +[[package]] +name = "unicode-segmentation" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" + [[package]] name = "unicode-width" version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" +[[package]] +name = "unicode-xid" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" + [[package]] name = "unicode-xid" version = "0.2.4" @@ -20861,12 +22081,12 @@ checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" [[package]] name = "universal-hash" -version = "0.4.1" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f214e8f697e925001e66ec2c6e37a4ef93f0f78c2eed7814394e10c62025b05" +checksum = "8326b2c654932e3e4f9196e69d08fdf7cfd718e1dc6f66b347e6024a0c961402" dependencies = [ "generic-array 0.14.7", - "subtle 2.4.1", + "subtle 2.5.0", ] [[package]] @@ -20876,25 +22096,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" dependencies = [ "crypto-common", - "subtle 2.4.1", + "subtle 2.5.0", ] [[package]] name = "unsafe-libyaml" -version = "0.2.10" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab4c90930b95a82d00dc9e9ac071b4991924390d46cbd0dfe566148667605e4b" +checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861" [[package]] name = "unsigned-varint" -version = "0.7.1" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d86a8dc7f45e4c1b0d30e43038c38f274e77af056aa5f74b93c2cf9eb3c1c836" +checksum = "6889a77d49f1f013504cec6bf97a2c730394adedaeb1deb5ea08949a50541105" dependencies = [ "asynchronous-codec", "bytes", "futures-io", "futures-util", + "tokio-util", ] [[package]] @@ -20946,9 +22167,9 @@ checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" [[package]] name = "value-bag" -version = "1.4.1" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d92ccd67fb88503048c01b59152a04effd0782d035a83a6d256ce6085f08f4a3" +checksum = "8fec26a25bd6fca441cdd0f769fd7f891bae119f996de31f86a5eddccef54c1d" dependencies = [ "value-bag-serde1", "value-bag-sval2", @@ -20956,9 +22177,9 @@ dependencies = [ [[package]] name = "value-bag-serde1" -version = "1.4.1" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0b9f3feef403a50d4d67e9741a6d8fc688bcbb4e4f31bd4aab72cc690284394" +checksum = "ead5b693d906686203f19a49e88c477fb8c15798b68cf72f60b4b5521b4ad891" dependencies = [ "erased-serde", "serde", @@ -20967,9 +22188,9 @@ dependencies = [ [[package]] name = "value-bag-sval2" -version = "1.4.1" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30b24f4146b6f3361e91cbf527d1fb35e9376c3c0cef72ca5ec5af6d640fad7d" +checksum = "3b9d0f4a816370c3a0d7d82d603b62198af17675b12fe5e91de6b47ceb505882" dependencies = [ "sval", "sval_buffer", @@ -20986,6 +22207,12 @@ version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" +[[package]] +name = "vec_map" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" + [[package]] name = "version_check" version = "0.9.4" @@ -21013,7 +22240,7 @@ dependencies = [ "arrayref", "constcat", "digest 0.10.7", - "rand", + "rand 0.8.5", "rand_chacha 0.3.1", "rand_core 0.6.4", "sha2 0.10.7", @@ -21089,9 +22316,9 @@ dependencies = [ "bumpalo", "log", "once_cell", - "proc-macro2", - "quote", - "syn 2.0.48", + "proc-macro2 1.0.75", + "quote 1.0.35", + "syn 2.0.53", "wasm-bindgen-shared", ] @@ -21113,7 +22340,7 @@ version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" dependencies = [ - "quote", + "quote 1.0.35", "wasm-bindgen-macro-support", ] @@ -21123,9 +22350,9 @@ version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.48", + "proc-macro2 1.0.75", + "quote 1.0.35", + "syn 2.0.53", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -21156,8 +22383,8 @@ version = "0.3.37" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ecb993dd8c836930ed130e020e77d9b2e65dd0fbab1b67c790b0f5d80b11a575" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.75", + "quote 1.0.35", ] [[package]] @@ -21458,7 +22685,7 @@ dependencies = [ "memfd", "memoffset 0.8.0", "paste", - "rand", + "rand 0.8.5", "rustix 0.36.15", "wasmtime-asm-macros", "wasmtime-environ", @@ -21586,7 +22813,6 @@ dependencies = [ "pallet-fast-unstake", "pallet-grandpa", "pallet-identity", - "pallet-im-online", "pallet-indices", "pallet-membership", "pallet-message-queue", @@ -21661,6 +22887,7 @@ dependencies = [ "tiny-keccak", "tokio", "westend-runtime-constants", + "xcm-fee-payment-runtime-api", ] [[package]] @@ -21771,6 +22998,40 @@ dependencies = [ "windows-targets 0.48.5", ] +[[package]] +name = "windows" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be" +dependencies = [ + "windows-core", + "windows-targets 0.52.0", +] + +[[package]] +name = "windows-core" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +dependencies = [ + "windows-targets 0.52.0", +] + +[[package]] +name = "windows-sys" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + [[package]] name = "windows-sys" version = "0.45.0" @@ -22044,7 +23305,7 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fb66477291e7e8d2b0ff1bcb900bf29489a9692816d79874bea351e7a8b6de96" dependencies = [ - "curve25519-dalek 4.1.1", + "curve25519-dalek 4.1.2", "rand_core 0.6.4", "serde", "zeroize", @@ -22068,6 +23329,23 @@ dependencies = [ "time", ] +[[package]] +name = "x509-parser" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7069fba5b66b9193bd2c5d3d4ff12b839118f6bcbef5328efafafb5395cf63da" +dependencies = [ + "asn1-rs", + "data-encoding", + "der-parser", + "lazy_static", + "nom", + "oid-registry", + "rusticata-macros", + "thiserror", + "time", +] + [[package]] name = "xattr" version = "1.0.1" @@ -22120,10 +23398,12 @@ dependencies = [ "pallet-transaction-payment", "pallet-xcm", "parity-scale-codec", + "polkadot-service", "polkadot-test-client", "polkadot-test-runtime", "polkadot-test-service", "sp-consensus", + "sp-core", "sp-keyring", "sp-runtime", "sp-state-machine", @@ -22132,15 +23412,29 @@ dependencies = [ "staging-xcm-executor", ] +[[package]] +name = "xcm-fee-payment-runtime-api" +version = "0.1.0" +dependencies = [ + "frame-support", + "parity-scale-codec", + "scale-info", + "sp-api", + "sp-runtime", + "sp-std 14.0.0", + "sp-weights", + "staging-xcm", +] + [[package]] name = "xcm-procedural" version = "7.0.0" dependencies = [ "Inflector", - "proc-macro2", - "quote", + "proc-macro2 1.0.75", + "quote 1.0.35", "staging-xcm", - "syn 2.0.48", + "syn 2.0.53", "trybuild", ] @@ -22193,8 +23487,10 @@ name = "xcm-simulator-fuzzer" version = "1.0.0" dependencies = [ "arbitrary", + "frame-executive", "frame-support", "frame-system", + "frame-try-runtime", "honggfuzz", "pallet-balances", "pallet-message-queue", @@ -22224,7 +23520,7 @@ dependencies = [ "log", "nohash-hasher", "parking_lot 0.12.1", - "rand", + "rand 0.8.5", "static_assertions", ] @@ -22258,16 +23554,16 @@ version = "0.7.32" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.48", + "proc-macro2 1.0.75", + "quote 1.0.35", + "syn 2.0.53", ] [[package]] name = "zeroize" -version = "1.6.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9" +checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" dependencies = [ "zeroize_derive", ] @@ -22278,9 +23574,9 @@ version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.48", + "proc-macro2 1.0.75", + "quote 1.0.35", + "syn 2.0.53", ] [[package]] @@ -22295,7 +23591,7 @@ dependencies = [ "serde_json", "thiserror", "tokio", - "tokio-tungstenite", + "tokio-tungstenite 0.17.2", "tracing-gum", "url", ] diff --git a/Cargo.toml b/Cargo.toml index e807171b24c46ac9a95344940a8590ac5209717c..460c49f7f37c2d43e021e4bfa8f4263ac1ea3063 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,30 +3,33 @@ authors = ["Parity Technologies "] edition = "2021" repository = "https://github.com/paritytech/polkadot-sdk.git" license = "GPL-3.0-only" +homepage = "https://paritytech.github.io/polkadot-sdk/master/polkadot_sdk_docs/index.html" [workspace] resolver = "2" members = [ "bridges/bin/runtime-common", + "bridges/chains/chain-asset-hub-rococo", + "bridges/chains/chain-asset-hub-westend", + "bridges/chains/chain-bridge-hub-cumulus", + "bridges/chains/chain-bridge-hub-kusama", + "bridges/chains/chain-bridge-hub-polkadot", + "bridges/chains/chain-bridge-hub-rococo", + "bridges/chains/chain-bridge-hub-westend", + "bridges/chains/chain-kusama", + "bridges/chains/chain-polkadot", + "bridges/chains/chain-polkadot-bulletin", + "bridges/chains/chain-rococo", + "bridges/chains/chain-westend", + "bridges/modules/beefy", "bridges/modules/grandpa", "bridges/modules/messages", "bridges/modules/parachains", "bridges/modules/relayers", "bridges/modules/xcm-bridge-hub", "bridges/modules/xcm-bridge-hub-router", - "bridges/primitives/chain-asset-hub-rococo", - "bridges/primitives/chain-asset-hub-westend", - "bridges/primitives/chain-bridge-hub-cumulus", - "bridges/primitives/chain-bridge-hub-kusama", - "bridges/primitives/chain-bridge-hub-polkadot", - "bridges/primitives/chain-bridge-hub-rococo", - "bridges/primitives/chain-bridge-hub-westend", - "bridges/primitives/chain-kusama", - "bridges/primitives/chain-polkadot", - "bridges/primitives/chain-polkadot-bulletin", - "bridges/primitives/chain-rococo", - "bridges/primitives/chain-westend", + "bridges/primitives/beefy", "bridges/primitives/header-chain", "bridges/primitives/messages", "bridges/primitives/parachains", @@ -36,6 +39,13 @@ members = [ "bridges/primitives/test-utils", "bridges/primitives/xcm-bridge-hub", "bridges/primitives/xcm-bridge-hub-router", + "bridges/relays/client-substrate", + "bridges/relays/equivocation", + "bridges/relays/finality", + "bridges/relays/lib-substrate-relay", + "bridges/relays/messages", + "bridges/relays/parachains", + "bridges/relays/utils", "bridges/snowbridge/pallets/ethereum-client", "bridges/snowbridge/pallets/ethereum-client/fixtures", "bridges/snowbridge/pallets/inbound-queue", @@ -74,9 +84,6 @@ members = [ "cumulus/pallets/solo-to-para", "cumulus/pallets/xcm", "cumulus/pallets/xcmp-queue", - "cumulus/parachain-template/node", - "cumulus/parachain-template/pallets/template", - "cumulus/parachain-template/runtime", "cumulus/parachains/common", "cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-rococo", "cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-westend", @@ -127,6 +134,7 @@ members = [ "cumulus/primitives/core", "cumulus/primitives/parachain-inherent", "cumulus/primitives/proof-size-hostfunction", + "cumulus/primitives/storage-weight-reclaim", "cumulus/primitives/timestamp", "cumulus/primitives/utility", "cumulus/test/client", @@ -215,14 +223,10 @@ members = [ "polkadot/xcm/xcm-builder", "polkadot/xcm/xcm-executor", "polkadot/xcm/xcm-executor/integration-tests", + "polkadot/xcm/xcm-fee-payment-runtime-api", "polkadot/xcm/xcm-simulator", "polkadot/xcm/xcm-simulator/example", "polkadot/xcm/xcm-simulator/fuzzer", - "substrate/bin/minimal/node", - "substrate/bin/minimal/runtime", - "substrate/bin/node-template/node", - "substrate/bin/node-template/pallets/template", - "substrate/bin/node-template/runtime", "substrate/bin/node/bench", "substrate/bin/node/cli", "substrate/bin/node/inspect", @@ -255,6 +259,7 @@ members = [ "substrate/client/db", "substrate/client/executor", "substrate/client/executor/common", + "substrate/client/executor/polkavm", "substrate/client/executor/runtime-test", "substrate/client/executor/wasmtime", "substrate/client/informant", @@ -264,13 +269,13 @@ members = [ "substrate/client/mixnet", "substrate/client/network", "substrate/client/network-gossip", - "substrate/client/network/bitswap", "substrate/client/network/common", "substrate/client/network/light", "substrate/client/network/statement", "substrate/client/network/sync", "substrate/client/network/test", "substrate/client/network/transactions", + "substrate/client/network/types", "substrate/client/offchain", "substrate/client/proposer-metrics", "substrate/client/rpc", @@ -335,7 +340,9 @@ members = [ "substrate/frame/examples/dev-mode", "substrate/frame/examples/frame-crate", "substrate/frame/examples/kitchensink", + "substrate/frame/examples/multi-block-migrations", "substrate/frame/examples/offchain-worker", + "substrate/frame/examples/single-block-migrations", "substrate/frame/examples/split", "substrate/frame/examples/tasks", "substrate/frame/executive", @@ -350,6 +357,7 @@ members = [ "substrate/frame/membership", "substrate/frame/merkle-mountain-range", "substrate/frame/message-queue", + "substrate/frame/migrations", "substrate/frame/mixnet", "substrate/frame/multisig", "substrate/frame/nft-fractionalization", @@ -366,6 +374,7 @@ members = [ "substrate/frame/offences/benchmarking", "substrate/frame/paged-list", "substrate/frame/paged-list/fuzzer", + "substrate/frame/parameters", "substrate/frame/preimage", "substrate/frame/proxy", "substrate/frame/ranked-collective", @@ -492,14 +501,27 @@ members = [ "substrate/utils/frame/frame-utilities-cli", "substrate/utils/frame/generate-bags", "substrate/utils/frame/generate-bags/node-runtime", + "substrate/utils/frame/omni-bencher", "substrate/utils/frame/remote-externalities", "substrate/utils/frame/rpc/client", "substrate/utils/frame/rpc/state-trie-migration-rpc", "substrate/utils/frame/rpc/support", "substrate/utils/frame/rpc/system", - "substrate/utils/frame/try-runtime/cli", "substrate/utils/prometheus", + "substrate/utils/substrate-bip39", "substrate/utils/wasm-builder", + + "templates/minimal/node", + "templates/minimal/pallets/template", + "templates/minimal/runtime", + + "templates/solochain/node", + "templates/solochain/pallets/template", + "templates/solochain/runtime", + + "templates/parachain/node", + "templates/parachain/pallets/template", + "templates/parachain/runtime", ] default-members = ["polkadot", "substrate/bin/node/cli"] @@ -533,8 +555,19 @@ extra-unused-type-parameters = { level = "allow", priority = 2 } # stylistic default_constructed_unit_structs = { level = "allow", priority = 2 } # stylistic [workspace.dependencies] -polkavm-linker = "0.8.1" -polkavm-derive = "0.8.0" +polkavm = "0.9.3" +polkavm-linker = "0.9.2" +polkavm-derive = "0.9.1" +log = { version = "0.4.21", default-features = false } +quote = { version = "1.0.33" } +serde = { version = "1.0.197", default-features = false } +serde-big-array = { version = "0.3.2" } +serde_derive = { version = "1.0.117" } +serde_json = { version = "1.0.114", default-features = false } +serde_yaml = { version = "0.9" } +syn = { version = "2.0.53" } +thiserror = { version = "1.0.48" } +tracing-subscriber = { version = "0.3.18" } [profile.release] # Polkadot runtime requires unwinding. @@ -595,6 +628,7 @@ num-bigint = { opt-level = 3 } parking_lot = { opt-level = 3 } parking_lot_core = { opt-level = 3 } percent-encoding = { opt-level = 3 } +polkavm-linker = { opt-level = 3 } primitive-types = { opt-level = 3 } reed-solomon-novelpoly = { opt-level = 3 } ring = { opt-level = 3 } diff --git a/README.md b/README.md index 93f9539a94a1de5771f04106b11ba18f27010aad..63743a456f4c8f8561bbeee8c59d63b88d352285 100644 --- a/README.md +++ b/README.md @@ -18,8 +18,9 @@ way. The Polkadot SDK comprises three main pieces of software: [![Polkadot-license](https://img.shields.io/badge/License-GPL3-blue)](./polkadot/LICENSE) Implementation of a node for the https://polkadot.network in Rust, using the Substrate framework. This directory -currently contains runtimes for the Polkadot, Kusama, Westend, and Rococo networks. In the future, these will be -relocated to the [`runtimes`](https://github.com/polkadot-fellows/runtimes/) repository. +currently contains runtimes for the Westend and Rococo test networks. Polkadot, Kusama and their system chain runtimes +are located in the [`runtimes`](https://github.com/polkadot-fellows/runtimes/) repository maintained by +[the Polkadot Technical Fellowship](https://polkadot-fellows.github.io/dashboard/#/overview). ## [Substrate](./substrate/) [![SubstrateRustDocs](https://img.shields.io/badge/Rust_Docs-Substrate-24CC85?logo=rust)](https://paritytech.github.io/polkadot-sdk/master/polkadot_sdk_docs/polkadot_sdk/substrate/index.html) diff --git a/bridges/.gitignore b/bridges/.gitignore deleted file mode 100644 index 5d10cfa41a4487247e2c331144d3dabf0ec5e6f7..0000000000000000000000000000000000000000 --- a/bridges/.gitignore +++ /dev/null @@ -1,26 +0,0 @@ -**/target/ -**/.env -**/.env2 -**/rust-toolchain -hfuzz_target -hfuzz_workspace -**/Cargo.lock - -**/*.rs.bk - -*.o -*.so -*.rlib -*.dll -.gdb_history - -*.exe - -.DS_Store - -.cargo -.idea -.vscode -*.iml -*.swp -*.swo diff --git a/bridges/README.md b/bridges/README.md index a2ce213d2541c346361eb28125a06e3079e1c269..8bfa39841f51e7824d0f1169540342c2bd88b664 100644 --- a/bridges/README.md +++ b/bridges/README.md @@ -38,10 +38,10 @@ cargo test --all ``` Also you can build the repo with [Parity CI Docker -image](https://github.com/paritytech/scripts/tree/master/dockerfiles/bridges-ci): +image](https://github.com/paritytech/scripts/tree/master/dockerfiles/ci-unified): ```bash -docker pull paritytech/bridges-ci:production +docker pull paritytech/ci-unified:latest mkdir ~/cache chown 1000:1000 ~/cache #processes in the container runs as "nonroot" user with UID 1000 docker run --rm -it -w /shellhere/parity-bridges-common \ @@ -49,7 +49,7 @@ docker run --rm -it -w /shellhere/parity-bridges-common \ -v "$(pwd)":/shellhere/parity-bridges-common \ -e CARGO_HOME=/cache/cargo/ \ -e SCCACHE_DIR=/cache/sccache/ \ - -e CARGO_TARGET_DIR=/cache/target/ paritytech/bridges-ci:production cargo build --all + -e CARGO_TARGET_DIR=/cache/target/ paritytech/ci-unified:latest cargo build --all #artifacts can be found in ~/cache/target ``` diff --git a/bridges/bin/runtime-common/Cargo.toml b/bridges/bin/runtime-common/Cargo.toml index c0072064507331848beaaec3a56a8324296dd1f4..67b91a16a302d6214830241082b21c407b04c6d1 100644 --- a/bridges/bin/runtime-common/Cargo.toml +++ b/bridges/bin/runtime-common/Cargo.toml @@ -11,10 +11,10 @@ license = "GPL-3.0-or-later WITH Classpath-exception-2.0" workspace = true [dependencies] -codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false, features = ["derive"] } +codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } hash-db = { version = "0.16.0", default-features = false } -log = { version = "0.4.20", default-features = false } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +log = { workspace = true } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } static_assertions = { version = "1.1", optional = true } # Bridge dependencies diff --git a/bridges/bin/runtime-common/src/messages_api.rs b/bridges/bin/runtime-common/src/messages_api.rs index ccf1c754041ed84dc302f0660fdd5bde8dc8d533..7fbdeb366124778b36c77725be8ca8778020be1b 100644 --- a/bridges/bin/runtime-common/src/messages_api.rs +++ b/bridges/bin/runtime-common/src/messages_api.rs @@ -14,7 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Parity Bridges Common. If not, see . -//! Helpers for implementing various message-related runtime API mthods. +//! Helpers for implementing various message-related runtime API methods. use bp_messages::{ InboundMessageDetails, LaneId, MessageNonce, MessagePayload, OutboundMessageDetails, diff --git a/bridges/bin/runtime-common/src/messages_xcm_extension.rs b/bridges/bin/runtime-common/src/messages_xcm_extension.rs index e3da6155f08a198d5469adbfc64e40213eddf8eb..46ed4da0d85481fcc7223740084945924f9c710f 100644 --- a/bridges/bin/runtime-common/src/messages_xcm_extension.rs +++ b/bridges/bin/runtime-common/src/messages_xcm_extension.rs @@ -248,7 +248,7 @@ impl LocalXcmQueueManager { sender_and_lane: &SenderAndLane, enqueued_messages: MessageNonce, ) { - // skip if we dont want to handle congestion + // skip if we don't want to handle congestion if !H::supports_congestion_detection() { return } diff --git a/bridges/bin/runtime-common/src/mock.rs b/bridges/bin/runtime-common/src/mock.rs index 8877a4fd95ce33150824b78674f38860616cf820..ad71cd0d456d827d3757433d214f7ea794406fca 100644 --- a/bridges/bin/runtime-common/src/mock.rs +++ b/bridges/bin/runtime-common/src/mock.rs @@ -141,7 +141,7 @@ parameter_types! { pub const ReserveId: [u8; 8] = *b"brdgrlrs"; } -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for TestRuntime { type Hash = ThisChainHash; type Hashing = ThisChainHasher; @@ -158,14 +158,15 @@ impl pallet_utility::Config for TestRuntime { type WeightInfo = (); } -#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig as pallet_balances::DefaultConfig)] +#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] impl pallet_balances::Config for TestRuntime { type ReserveIdentifier = [u8; 8]; type AccountStore = System; } +#[derive_impl(pallet_transaction_payment::config_preludes::TestDefaultConfig)] impl pallet_transaction_payment::Config for TestRuntime { - type OnChargeTransaction = pallet_transaction_payment::CurrencyAdapter; + type OnChargeTransaction = pallet_transaction_payment::FungibleAdapter; type OperationalFeeMultiplier = ConstU8<5>; type WeightToFee = IdentityFee; type LengthToFee = ConstantMultiplier; @@ -378,7 +379,7 @@ impl Chain for BridgedUnderlyingChain { impl ChainWithGrandpa for BridgedUnderlyingChain { const WITH_CHAIN_GRANDPA_PALLET_NAME: &'static str = ""; const MAX_AUTHORITIES_COUNT: u32 = 16; - const REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY: u32 = 8; + const REASONABLE_HEADERS_IN_JUSTIFICATION_ANCESTRY: u32 = 8; const MAX_MANDATORY_HEADER_SIZE: u32 = 256; const AVERAGE_HEADER_SIZE: u32 = 64; } diff --git a/bridges/bin/runtime-common/src/priority_calculator.rs b/bridges/bin/runtime-common/src/priority_calculator.rs index a597fb9e2f49289360acfd7ee305b44eb7874a3e..5035553f508dfea94a0cb5ddf9b916dd7d9b4ea5 100644 --- a/bridges/bin/runtime-common/src/priority_calculator.rs +++ b/bridges/bin/runtime-common/src/priority_calculator.rs @@ -128,7 +128,7 @@ mod integrity_tests { Runtime::RuntimeCall: Dispatchable, BalanceOf: Send + Sync + FixedPointOperand, { - // esimate priority of transaction that delivers one message and has large tip + // estimate priority of transaction that delivers one message and has large tip let maximal_messages_in_delivery_transaction = Runtime::MaxUnconfirmedMessagesAtInboundLane::get(); let small_with_tip_priority = @@ -163,7 +163,7 @@ mod integrity_tests { { // just an estimation of extra transaction bytes that are added to every transaction // (including signature, signed extensions extra and etc + in our case it includes - // all call arguments extept the proof itself) + // all call arguments except the proof itself) let base_tx_size = 512; // let's say we are relaying similar small messages and for every message we add more trie // nodes to the proof (x0.5 because we expect some nodes to be reused) diff --git a/bridges/bin/runtime-common/src/refund_relayer_extension.rs b/bridges/bin/runtime-common/src/refund_relayer_extension.rs index 27b7ff1a5519b70a35c304b96b0c25108155aa46..455392a0a277f3520cd7f58150f12e7420d36014 100644 --- a/bridges/bin/runtime-common/src/refund_relayer_extension.rs +++ b/bridges/bin/runtime-common/src/refund_relayer_extension.rs @@ -16,7 +16,7 @@ //! Signed extension that refunds relayer if he has delivered some new messages. //! It also refunds transaction cost if the transaction is an `utility.batchAll()` -//! with calls that are: delivering new messsage and all necessary underlying headers +//! with calls that are: delivering new message and all necessary underlying headers //! (parachain or relay chain). use crate::messages_call_ext::{ @@ -195,6 +195,19 @@ impl CallInfo { } } + /// Returns mutable reference to pre-dispatch `finality_target` sent to the + /// `SubmitFinalityProof` call. + #[cfg(test)] + fn submit_finality_proof_info_mut( + &mut self, + ) -> Option<&mut SubmitFinalityProofInfo> { + match *self { + Self::AllFinalityAndMsgs(ref mut info, _, _) => Some(info), + Self::RelayFinalityAndMsgs(ref mut info, _) => Some(info), + _ => None, + } + } + /// Returns the pre-dispatch `SubmitParachainHeadsInfo`. fn submit_parachain_heads_info(&self) -> Option<&SubmitParachainHeadsInfo> { match self { @@ -844,7 +857,7 @@ mod tests { use bp_parachains::{BestParaHeadHash, ParaInfo}; use bp_polkadot_core::parachains::{ParaHeadsProof, ParaId}; use bp_runtime::{BasicOperatingMode, HeaderId}; - use bp_test_utils::{make_default_justification, test_keyring}; + use bp_test_utils::{make_default_justification, test_keyring, TEST_GRANDPA_SET_ID}; use frame_support::{ assert_storage_noop, parameter_types, traits::{fungible::Mutate, ReservableCurrency}, @@ -929,7 +942,7 @@ mod tests { let authorities = test_keyring().into_iter().map(|(a, w)| (a.into(), w)).collect(); let best_relay_header = HeaderId(best_relay_header_number, RelayBlockHash::default()); pallet_bridge_grandpa::CurrentAuthoritySet::::put( - StoredAuthoritySet::try_new(authorities, 0).unwrap(), + StoredAuthoritySet::try_new(authorities, TEST_GRANDPA_SET_ID).unwrap(), ); pallet_bridge_grandpa::BestFinalized::::put(best_relay_header); @@ -977,6 +990,23 @@ mod tests { }) } + fn submit_relay_header_call_ex(relay_header_number: RelayBlockNumber) -> RuntimeCall { + let relay_header = BridgedChainHeader::new( + relay_header_number, + Default::default(), + Default::default(), + Default::default(), + Default::default(), + ); + let relay_justification = make_default_justification(&relay_header); + + RuntimeCall::BridgeGrandpa(GrandpaCall::submit_finality_proof_ex { + finality_target: Box::new(relay_header), + justification: relay_justification, + current_set_id: TEST_GRANDPA_SET_ID, + }) + } + fn submit_parachain_head_call( parachain_head_at_relay_header_number: RelayBlockNumber, ) -> RuntimeCall { @@ -1059,6 +1089,18 @@ mod tests { }) } + fn relay_finality_and_delivery_batch_call_ex( + relay_header_number: RelayBlockNumber, + best_message: MessageNonce, + ) -> RuntimeCall { + RuntimeCall::Utility(UtilityCall::batch_all { + calls: vec![ + submit_relay_header_call_ex(relay_header_number), + message_delivery_call(best_message), + ], + }) + } + fn relay_finality_and_confirmation_batch_call( relay_header_number: RelayBlockNumber, best_message: MessageNonce, @@ -1071,6 +1113,18 @@ mod tests { }) } + fn relay_finality_and_confirmation_batch_call_ex( + relay_header_number: RelayBlockNumber, + best_message: MessageNonce, + ) -> RuntimeCall { + RuntimeCall::Utility(UtilityCall::batch_all { + calls: vec![ + submit_relay_header_call_ex(relay_header_number), + message_confirmation_call(best_message), + ], + }) + } + fn all_finality_and_delivery_batch_call( relay_header_number: RelayBlockNumber, parachain_head_at_relay_header_number: RelayBlockNumber, @@ -1085,6 +1139,20 @@ mod tests { }) } + fn all_finality_and_delivery_batch_call_ex( + relay_header_number: RelayBlockNumber, + parachain_head_at_relay_header_number: RelayBlockNumber, + best_message: MessageNonce, + ) -> RuntimeCall { + RuntimeCall::Utility(UtilityCall::batch_all { + calls: vec![ + submit_relay_header_call_ex(relay_header_number), + submit_parachain_head_call(parachain_head_at_relay_header_number), + message_delivery_call(best_message), + ], + }) + } + fn all_finality_and_confirmation_batch_call( relay_header_number: RelayBlockNumber, parachain_head_at_relay_header_number: RelayBlockNumber, @@ -1099,12 +1167,27 @@ mod tests { }) } + fn all_finality_and_confirmation_batch_call_ex( + relay_header_number: RelayBlockNumber, + parachain_head_at_relay_header_number: RelayBlockNumber, + best_message: MessageNonce, + ) -> RuntimeCall { + RuntimeCall::Utility(UtilityCall::batch_all { + calls: vec![ + submit_relay_header_call_ex(relay_header_number), + submit_parachain_head_call(parachain_head_at_relay_header_number), + message_confirmation_call(best_message), + ], + }) + } + fn all_finality_pre_dispatch_data() -> PreDispatchData { PreDispatchData { relayer: relayer_account_at_this_chain(), call_info: CallInfo::AllFinalityAndMsgs( SubmitFinalityProofInfo { block_number: 200, + current_set_id: None, extra_weight: Weight::zero(), extra_size: 0, }, @@ -1128,12 +1211,20 @@ mod tests { } } + fn all_finality_pre_dispatch_data_ex() -> PreDispatchData { + let mut data = all_finality_pre_dispatch_data(); + data.call_info.submit_finality_proof_info_mut().unwrap().current_set_id = + Some(TEST_GRANDPA_SET_ID); + data + } + fn all_finality_confirmation_pre_dispatch_data() -> PreDispatchData { PreDispatchData { relayer: relayer_account_at_this_chain(), call_info: CallInfo::AllFinalityAndMsgs( SubmitFinalityProofInfo { block_number: 200, + current_set_id: None, extra_weight: Weight::zero(), extra_size: 0, }, @@ -1153,12 +1244,20 @@ mod tests { } } + fn all_finality_confirmation_pre_dispatch_data_ex() -> PreDispatchData { + let mut data = all_finality_confirmation_pre_dispatch_data(); + data.call_info.submit_finality_proof_info_mut().unwrap().current_set_id = + Some(TEST_GRANDPA_SET_ID); + data + } + fn relay_finality_pre_dispatch_data() -> PreDispatchData { PreDispatchData { relayer: relayer_account_at_this_chain(), call_info: CallInfo::RelayFinalityAndMsgs( SubmitFinalityProofInfo { block_number: 200, + current_set_id: None, extra_weight: Weight::zero(), extra_size: 0, }, @@ -1177,12 +1276,20 @@ mod tests { } } + fn relay_finality_pre_dispatch_data_ex() -> PreDispatchData { + let mut data = relay_finality_pre_dispatch_data(); + data.call_info.submit_finality_proof_info_mut().unwrap().current_set_id = + Some(TEST_GRANDPA_SET_ID); + data + } + fn relay_finality_confirmation_pre_dispatch_data() -> PreDispatchData { PreDispatchData { relayer: relayer_account_at_this_chain(), call_info: CallInfo::RelayFinalityAndMsgs( SubmitFinalityProofInfo { block_number: 200, + current_set_id: None, extra_weight: Weight::zero(), extra_size: 0, }, @@ -1197,6 +1304,13 @@ mod tests { } } + fn relay_finality_confirmation_pre_dispatch_data_ex() -> PreDispatchData { + let mut data = relay_finality_confirmation_pre_dispatch_data(); + data.call_info.submit_finality_proof_info_mut().unwrap().current_set_id = + Some(TEST_GRANDPA_SET_ID); + data + } + fn parachain_finality_pre_dispatch_data() -> PreDispatchData { PreDispatchData { relayer: relayer_account_at_this_chain(), @@ -1393,6 +1507,10 @@ mod tests { run_validate(all_finality_and_delivery_batch_call(200, 200, 200)), Ok(Default::default()), ); + assert_eq!( + run_validate(all_finality_and_delivery_batch_call_ex(200, 200, 200)), + Ok(Default::default()), + ); // message confirmation validation is passing assert_eq!( run_validate_ignore_priority(message_confirmation_call(200)), @@ -1410,11 +1528,17 @@ mod tests { )), Ok(Default::default()), ); + assert_eq!( + run_validate_ignore_priority(all_finality_and_confirmation_batch_call_ex( + 200, 200, 200 + )), + Ok(Default::default()), + ); }); } #[test] - fn validate_boosts_priority_of_message_delivery_transactons() { + fn validate_boosts_priority_of_message_delivery_transactions() { run_test(|| { initialize_environment(100, 100, 100); @@ -1444,7 +1568,7 @@ mod tests { } #[test] - fn validate_does_not_boost_priority_of_message_delivery_transactons_with_too_many_messages() { + fn validate_does_not_boost_priority_of_message_delivery_transactions_with_too_many_messages() { run_test(|| { initialize_environment(100, 100, 100); @@ -1500,12 +1624,24 @@ mod tests { run_validate_ignore_priority(all_finality_and_delivery_batch_call(200, 200, 200)), Ok(ValidTransaction::default()), ); + assert_eq!( + run_validate_ignore_priority(all_finality_and_delivery_batch_call_ex( + 200, 200, 200 + )), + Ok(ValidTransaction::default()), + ); assert_eq!( run_validate_ignore_priority(all_finality_and_confirmation_batch_call( 200, 200, 200 )), Ok(ValidTransaction::default()), ); + assert_eq!( + run_validate_ignore_priority(all_finality_and_confirmation_batch_call_ex( + 200, 200, 200 + )), + Ok(ValidTransaction::default()), + ); }); } @@ -1518,11 +1654,19 @@ mod tests { run_pre_dispatch(all_finality_and_delivery_batch_call(100, 200, 200)), Err(TransactionValidityError::Invalid(InvalidTransaction::Stale)), ); + assert_eq!( + run_pre_dispatch(all_finality_and_delivery_batch_call_ex(100, 200, 200)), + Err(TransactionValidityError::Invalid(InvalidTransaction::Stale)), + ); assert_eq!( run_validate(all_finality_and_delivery_batch_call(100, 200, 200)), Err(TransactionValidityError::Invalid(InvalidTransaction::Stale)), ); + assert_eq!( + run_validate(all_finality_and_delivery_batch_call_ex(100, 200, 200)), + Err(TransactionValidityError::Invalid(InvalidTransaction::Stale)), + ); }); } @@ -1535,10 +1679,18 @@ mod tests { run_pre_dispatch(all_finality_and_delivery_batch_call(101, 100, 200)), Err(TransactionValidityError::Invalid(InvalidTransaction::Stale)), ); + assert_eq!( + run_pre_dispatch(all_finality_and_delivery_batch_call_ex(101, 100, 200)), + Err(TransactionValidityError::Invalid(InvalidTransaction::Stale)), + ); assert_eq!( run_validate(all_finality_and_delivery_batch_call(101, 100, 200)), Err(TransactionValidityError::Invalid(InvalidTransaction::Stale)), ); + assert_eq!( + run_validate(all_finality_and_delivery_batch_call_ex(101, 100, 200)), + Err(TransactionValidityError::Invalid(InvalidTransaction::Stale)), + ); assert_eq!( run_pre_dispatch(parachain_finality_and_delivery_batch_call(100, 200)), @@ -1560,19 +1712,35 @@ mod tests { run_pre_dispatch(all_finality_and_delivery_batch_call(200, 200, 100)), Err(TransactionValidityError::Invalid(InvalidTransaction::Stale)), ); + assert_eq!( + run_pre_dispatch(all_finality_and_delivery_batch_call_ex(200, 200, 100)), + Err(TransactionValidityError::Invalid(InvalidTransaction::Stale)), + ); assert_eq!( run_pre_dispatch(all_finality_and_confirmation_batch_call(200, 200, 100)), Err(TransactionValidityError::Invalid(InvalidTransaction::Stale)), ); + assert_eq!( + run_pre_dispatch(all_finality_and_confirmation_batch_call_ex(200, 200, 100)), + Err(TransactionValidityError::Invalid(InvalidTransaction::Stale)), + ); assert_eq!( run_validate(all_finality_and_delivery_batch_call(200, 200, 100)), Err(TransactionValidityError::Invalid(InvalidTransaction::Stale)), ); + assert_eq!( + run_validate(all_finality_and_delivery_batch_call_ex(200, 200, 100)), + Err(TransactionValidityError::Invalid(InvalidTransaction::Stale)), + ); assert_eq!( run_validate(all_finality_and_confirmation_batch_call(200, 200, 100)), Err(TransactionValidityError::Invalid(InvalidTransaction::Stale)), ); + assert_eq!( + run_validate(all_finality_and_confirmation_batch_call_ex(200, 200, 100)), + Err(TransactionValidityError::Invalid(InvalidTransaction::Stale)), + ); assert_eq!( run_pre_dispatch(parachain_finality_and_delivery_batch_call(200, 100)), @@ -1609,10 +1777,18 @@ mod tests { run_pre_dispatch(all_finality_and_delivery_batch_call(200, 200, 200)), Err(TransactionValidityError::Invalid(InvalidTransaction::Call)), ); + assert_eq!( + run_pre_dispatch(all_finality_and_delivery_batch_call_ex(200, 200, 200)), + Err(TransactionValidityError::Invalid(InvalidTransaction::Call)), + ); assert_eq!( run_pre_dispatch(all_finality_and_confirmation_batch_call(200, 200, 200)), Err(TransactionValidityError::Invalid(InvalidTransaction::Call)), ); + assert_eq!( + run_pre_dispatch(all_finality_and_confirmation_batch_call_ex(200, 200, 200)), + Err(TransactionValidityError::Invalid(InvalidTransaction::Call)), + ); }); } @@ -1631,10 +1807,18 @@ mod tests { run_pre_dispatch(all_finality_and_delivery_batch_call(200, 200, 200)), Err(TransactionValidityError::Invalid(InvalidTransaction::Call)), ); + assert_eq!( + run_pre_dispatch(all_finality_and_delivery_batch_call_ex(200, 200, 200)), + Err(TransactionValidityError::Invalid(InvalidTransaction::Call)), + ); assert_eq!( run_pre_dispatch(all_finality_and_confirmation_batch_call(200, 200, 200)), Err(TransactionValidityError::Invalid(InvalidTransaction::Call)), ); + assert_eq!( + run_pre_dispatch(all_finality_and_confirmation_batch_call_ex(200, 200, 200)), + Err(TransactionValidityError::Invalid(InvalidTransaction::Call)), + ); assert_eq!( run_pre_dispatch(parachain_finality_and_delivery_batch_call(200, 200)), @@ -1662,10 +1846,18 @@ mod tests { run_pre_dispatch(all_finality_and_delivery_batch_call(200, 200, 200)), Err(TransactionValidityError::Invalid(InvalidTransaction::Call)), ); + assert_eq!( + run_pre_dispatch(all_finality_and_delivery_batch_call_ex(200, 200, 200)), + Err(TransactionValidityError::Invalid(InvalidTransaction::Call)), + ); assert_eq!( run_pre_dispatch(all_finality_and_confirmation_batch_call(200, 200, 200)), Err(TransactionValidityError::Invalid(InvalidTransaction::Call)), ); + assert_eq!( + run_pre_dispatch(all_finality_and_confirmation_batch_call_ex(200, 200, 200)), + Err(TransactionValidityError::Invalid(InvalidTransaction::Call)), + ); assert_eq!( run_pre_dispatch(parachain_finality_and_delivery_batch_call(200, 200)), @@ -1696,10 +1888,18 @@ mod tests { run_pre_dispatch(all_finality_and_delivery_batch_call(200, 200, 200)), Ok(Some(all_finality_pre_dispatch_data())), ); + assert_eq!( + run_pre_dispatch(all_finality_and_delivery_batch_call_ex(200, 200, 200)), + Ok(Some(all_finality_pre_dispatch_data_ex())), + ); assert_eq!( run_pre_dispatch(all_finality_and_confirmation_batch_call(200, 200, 200)), Ok(Some(all_finality_confirmation_pre_dispatch_data())), ); + assert_eq!( + run_pre_dispatch(all_finality_and_confirmation_batch_call_ex(200, 200, 200)), + Ok(Some(all_finality_confirmation_pre_dispatch_data_ex())), + ); }); } @@ -2126,6 +2326,12 @@ mod tests { ), Ok(None), ); + assert_eq!( + TestGrandpaExtensionProvider::parse_and_check_for_obsolete_call( + &all_finality_and_delivery_batch_call_ex(200, 200, 200) + ), + Ok(None), + ); // relay + parachain + message confirmation calls batch is ignored assert_eq!( @@ -2134,6 +2340,12 @@ mod tests { ), Ok(None), ); + assert_eq!( + TestGrandpaExtensionProvider::parse_and_check_for_obsolete_call( + &all_finality_and_confirmation_batch_call_ex(200, 200, 200) + ), + Ok(None), + ); // parachain + message delivery call batch is ignored assert_eq!( @@ -2158,6 +2370,12 @@ mod tests { ), Ok(Some(relay_finality_pre_dispatch_data().call_info)), ); + assert_eq!( + TestGrandpaExtensionProvider::parse_and_check_for_obsolete_call( + &relay_finality_and_delivery_batch_call_ex(200, 200) + ), + Ok(Some(relay_finality_pre_dispatch_data_ex().call_info)), + ); // relay + message confirmation call batch is accepted assert_eq!( @@ -2166,6 +2384,12 @@ mod tests { ), Ok(Some(relay_finality_confirmation_pre_dispatch_data().call_info)), ); + assert_eq!( + TestGrandpaExtensionProvider::parse_and_check_for_obsolete_call( + &relay_finality_and_confirmation_batch_call_ex(200, 200) + ), + Ok(Some(relay_finality_confirmation_pre_dispatch_data_ex().call_info)), + ); // message delivery call batch is accepted assert_eq!( @@ -2194,11 +2418,19 @@ mod tests { run_grandpa_pre_dispatch(relay_finality_and_delivery_batch_call(100, 200)), Err(TransactionValidityError::Invalid(InvalidTransaction::Stale)), ); + assert_eq!( + run_grandpa_pre_dispatch(relay_finality_and_delivery_batch_call_ex(100, 200)), + Err(TransactionValidityError::Invalid(InvalidTransaction::Stale)), + ); assert_eq!( run_grandpa_validate(relay_finality_and_delivery_batch_call(100, 200)), Err(TransactionValidityError::Invalid(InvalidTransaction::Stale)), ); + assert_eq!( + run_grandpa_validate(relay_finality_and_delivery_batch_call_ex(100, 200)), + Err(TransactionValidityError::Invalid(InvalidTransaction::Stale)), + ); }); } @@ -2211,19 +2443,35 @@ mod tests { run_grandpa_pre_dispatch(relay_finality_and_delivery_batch_call(200, 100)), Err(TransactionValidityError::Invalid(InvalidTransaction::Stale)), ); + assert_eq!( + run_grandpa_pre_dispatch(relay_finality_and_delivery_batch_call_ex(200, 100)), + Err(TransactionValidityError::Invalid(InvalidTransaction::Stale)), + ); assert_eq!( run_grandpa_pre_dispatch(relay_finality_and_confirmation_batch_call(200, 100)), Err(TransactionValidityError::Invalid(InvalidTransaction::Stale)), ); + assert_eq!( + run_grandpa_pre_dispatch(relay_finality_and_confirmation_batch_call_ex(200, 100)), + Err(TransactionValidityError::Invalid(InvalidTransaction::Stale)), + ); assert_eq!( run_grandpa_validate(relay_finality_and_delivery_batch_call(200, 100)), Err(TransactionValidityError::Invalid(InvalidTransaction::Stale)), ); + assert_eq!( + run_grandpa_validate(relay_finality_and_delivery_batch_call_ex(200, 100)), + Err(TransactionValidityError::Invalid(InvalidTransaction::Stale)), + ); assert_eq!( run_grandpa_validate(relay_finality_and_confirmation_batch_call(200, 100)), Err(TransactionValidityError::Invalid(InvalidTransaction::Stale)), ); + assert_eq!( + run_grandpa_validate(relay_finality_and_confirmation_batch_call_ex(200, 100)), + Err(TransactionValidityError::Invalid(InvalidTransaction::Stale)), + ); assert_eq!( run_grandpa_pre_dispatch(message_delivery_call(100)), @@ -2254,19 +2502,35 @@ mod tests { run_grandpa_pre_dispatch(relay_finality_and_delivery_batch_call(200, 200)), Ok(Some(relay_finality_pre_dispatch_data()),) ); + assert_eq!( + run_grandpa_pre_dispatch(relay_finality_and_delivery_batch_call_ex(200, 200)), + Ok(Some(relay_finality_pre_dispatch_data_ex()),) + ); assert_eq!( run_grandpa_pre_dispatch(relay_finality_and_confirmation_batch_call(200, 200)), Ok(Some(relay_finality_confirmation_pre_dispatch_data())), ); + assert_eq!( + run_grandpa_pre_dispatch(relay_finality_and_confirmation_batch_call_ex(200, 200)), + Ok(Some(relay_finality_confirmation_pre_dispatch_data_ex())), + ); assert_eq!( run_grandpa_validate(relay_finality_and_delivery_batch_call(200, 200)), Ok(Default::default()), ); + assert_eq!( + run_grandpa_validate(relay_finality_and_delivery_batch_call_ex(200, 200)), + Ok(Default::default()), + ); assert_eq!( run_grandpa_validate(relay_finality_and_confirmation_batch_call(200, 200)), Ok(Default::default()), ); + assert_eq!( + run_grandpa_validate(relay_finality_and_confirmation_batch_call_ex(200, 200)), + Ok(Default::default()), + ); assert_eq!( run_grandpa_pre_dispatch(message_delivery_call(200)), diff --git a/bridges/primitives/chain-asset-hub-rococo/Cargo.toml b/bridges/chains/chain-asset-hub-rococo/Cargo.toml similarity index 69% rename from bridges/primitives/chain-asset-hub-rococo/Cargo.toml rename to bridges/chains/chain-asset-hub-rococo/Cargo.toml index 4dfa149e0ea9ab4e0ac1804844a0c128f15bd5bb..9a6419a5b4055be348f4f8813e3c1301f14f7142 100644 --- a/bridges/primitives/chain-asset-hub-rococo/Cargo.toml +++ b/bridges/chains/chain-asset-hub-rococo/Cargo.toml @@ -5,19 +5,20 @@ version = "0.4.0" authors.workspace = true edition.workspace = true license = "GPL-3.0-or-later WITH Classpath-exception-2.0" +repository.workspace = true [lints] workspace = true [dependencies] -codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } # Substrate Dependencies frame-support = { path = "../../../substrate/frame/support", default-features = false } # Bridge Dependencies -bp-xcm-bridge-hub-router = { path = "../xcm-bridge-hub-router", default-features = false } +bp-xcm-bridge-hub-router = { path = "../../primitives/xcm-bridge-hub-router", default-features = false } [features] default = ["std"] diff --git a/bridges/primitives/chain-asset-hub-rococo/src/lib.rs b/bridges/chains/chain-asset-hub-rococo/src/lib.rs similarity index 100% rename from bridges/primitives/chain-asset-hub-rococo/src/lib.rs rename to bridges/chains/chain-asset-hub-rococo/src/lib.rs diff --git a/bridges/primitives/chain-asset-hub-westend/Cargo.toml b/bridges/chains/chain-asset-hub-westend/Cargo.toml similarity index 69% rename from bridges/primitives/chain-asset-hub-westend/Cargo.toml rename to bridges/chains/chain-asset-hub-westend/Cargo.toml index c9bd437562b86a97cdf2807c18b4905e695d1a5e..1c08ee28e417cb50ce9ef9ded5f17163e1bb30d4 100644 --- a/bridges/primitives/chain-asset-hub-westend/Cargo.toml +++ b/bridges/chains/chain-asset-hub-westend/Cargo.toml @@ -5,19 +5,20 @@ version = "0.3.0" authors.workspace = true edition.workspace = true license = "GPL-3.0-or-later WITH Classpath-exception-2.0" +repository.workspace = true [lints] workspace = true [dependencies] -codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } # Substrate Dependencies frame-support = { path = "../../../substrate/frame/support", default-features = false } # Bridge Dependencies -bp-xcm-bridge-hub-router = { path = "../xcm-bridge-hub-router", default-features = false } +bp-xcm-bridge-hub-router = { path = "../../primitives/xcm-bridge-hub-router", default-features = false } [features] default = ["std"] diff --git a/bridges/primitives/chain-asset-hub-westend/src/lib.rs b/bridges/chains/chain-asset-hub-westend/src/lib.rs similarity index 100% rename from bridges/primitives/chain-asset-hub-westend/src/lib.rs rename to bridges/chains/chain-asset-hub-westend/src/lib.rs diff --git a/bridges/primitives/chain-bridge-hub-cumulus/Cargo.toml b/bridges/chains/chain-bridge-hub-cumulus/Cargo.toml similarity index 78% rename from bridges/primitives/chain-bridge-hub-cumulus/Cargo.toml rename to bridges/chains/chain-bridge-hub-cumulus/Cargo.toml index d35eefa1c45c3f7cf479dcea2ee4da87dbc31627..4b900002a4d81abb9d7364f555a150a2af6c839c 100644 --- a/bridges/primitives/chain-bridge-hub-cumulus/Cargo.toml +++ b/bridges/chains/chain-bridge-hub-cumulus/Cargo.toml @@ -5,6 +5,7 @@ version = "0.7.0" authors.workspace = true edition.workspace = true license = "GPL-3.0-or-later WITH Classpath-exception-2.0" +repository.workspace = true [lints] workspace = true @@ -12,9 +13,9 @@ workspace = true [dependencies] # Bridge Dependencies -bp-polkadot-core = { path = "../polkadot-core", default-features = false } -bp-messages = { path = "../messages", default-features = false } -bp-runtime = { path = "../runtime", default-features = false } +bp-polkadot-core = { path = "../../primitives/polkadot-core", default-features = false } +bp-messages = { path = "../../primitives/messages", default-features = false } +bp-runtime = { path = "../../primitives/runtime", default-features = false } # Substrate Based Dependencies diff --git a/bridges/primitives/chain-bridge-hub-cumulus/src/lib.rs b/bridges/chains/chain-bridge-hub-cumulus/src/lib.rs similarity index 100% rename from bridges/primitives/chain-bridge-hub-cumulus/src/lib.rs rename to bridges/chains/chain-bridge-hub-cumulus/src/lib.rs diff --git a/bridges/primitives/chain-bridge-hub-kusama/Cargo.toml b/bridges/chains/chain-bridge-hub-kusama/Cargo.toml similarity index 83% rename from bridges/primitives/chain-bridge-hub-kusama/Cargo.toml rename to bridges/chains/chain-bridge-hub-kusama/Cargo.toml index 8d71b3f5eb7646a81af55c0030814c604ead82ef..ff6dd8849abe3897f1c3eb3cb1de8b7d89af5ca7 100644 --- a/bridges/primitives/chain-bridge-hub-kusama/Cargo.toml +++ b/bridges/chains/chain-bridge-hub-kusama/Cargo.toml @@ -5,6 +5,7 @@ version = "0.6.0" authors.workspace = true edition.workspace = true license = "GPL-3.0-or-later WITH Classpath-exception-2.0" +repository.workspace = true [lints] workspace = true @@ -13,8 +14,8 @@ workspace = true # Bridge Dependencies bp-bridge-hub-cumulus = { path = "../chain-bridge-hub-cumulus", default-features = false } -bp-runtime = { path = "../runtime", default-features = false } -bp-messages = { path = "../messages", default-features = false } +bp-runtime = { path = "../../primitives/runtime", default-features = false } +bp-messages = { path = "../../primitives/messages", default-features = false } # Substrate Based Dependencies diff --git a/bridges/primitives/chain-bridge-hub-kusama/src/lib.rs b/bridges/chains/chain-bridge-hub-kusama/src/lib.rs similarity index 100% rename from bridges/primitives/chain-bridge-hub-kusama/src/lib.rs rename to bridges/chains/chain-bridge-hub-kusama/src/lib.rs diff --git a/bridges/primitives/chain-bridge-hub-polkadot/Cargo.toml b/bridges/chains/chain-bridge-hub-polkadot/Cargo.toml similarity index 83% rename from bridges/primitives/chain-bridge-hub-polkadot/Cargo.toml rename to bridges/chains/chain-bridge-hub-polkadot/Cargo.toml index 4e89e8a5c9a173bc9a084af9e7c609a6bae287a8..da8b8a82fa702eeab719335fa9968b78ee965163 100644 --- a/bridges/primitives/chain-bridge-hub-polkadot/Cargo.toml +++ b/bridges/chains/chain-bridge-hub-polkadot/Cargo.toml @@ -5,6 +5,7 @@ version = "0.6.0" authors.workspace = true edition.workspace = true license = "GPL-3.0-or-later WITH Classpath-exception-2.0" +repository.workspace = true [lints] workspace = true @@ -14,8 +15,8 @@ workspace = true # Bridge Dependencies bp-bridge-hub-cumulus = { path = "../chain-bridge-hub-cumulus", default-features = false } -bp-runtime = { path = "../runtime", default-features = false } -bp-messages = { path = "../messages", default-features = false } +bp-runtime = { path = "../../primitives/runtime", default-features = false } +bp-messages = { path = "../../primitives/messages", default-features = false } # Substrate Based Dependencies diff --git a/bridges/primitives/chain-bridge-hub-polkadot/src/lib.rs b/bridges/chains/chain-bridge-hub-polkadot/src/lib.rs similarity index 100% rename from bridges/primitives/chain-bridge-hub-polkadot/src/lib.rs rename to bridges/chains/chain-bridge-hub-polkadot/src/lib.rs diff --git a/bridges/primitives/chain-bridge-hub-rococo/Cargo.toml b/bridges/chains/chain-bridge-hub-rococo/Cargo.toml similarity index 83% rename from bridges/primitives/chain-bridge-hub-rococo/Cargo.toml rename to bridges/chains/chain-bridge-hub-rococo/Cargo.toml index 1643d934a982ec0795fc370b221dc35d36d3b492..f7672df012f2fc2a21cfc987468427a3222317ea 100644 --- a/bridges/primitives/chain-bridge-hub-rococo/Cargo.toml +++ b/bridges/chains/chain-bridge-hub-rococo/Cargo.toml @@ -5,6 +5,7 @@ version = "0.7.0" authors.workspace = true edition.workspace = true license = "GPL-3.0-or-later WITH Classpath-exception-2.0" +repository.workspace = true [lints] workspace = true @@ -13,8 +14,8 @@ workspace = true # Bridge Dependencies bp-bridge-hub-cumulus = { path = "../chain-bridge-hub-cumulus", default-features = false } -bp-runtime = { path = "../runtime", default-features = false } -bp-messages = { path = "../messages", default-features = false } +bp-runtime = { path = "../../primitives/runtime", default-features = false } +bp-messages = { path = "../../primitives/messages", default-features = false } # Substrate Based Dependencies diff --git a/bridges/primitives/chain-bridge-hub-rococo/src/lib.rs b/bridges/chains/chain-bridge-hub-rococo/src/lib.rs similarity index 99% rename from bridges/primitives/chain-bridge-hub-rococo/src/lib.rs rename to bridges/chains/chain-bridge-hub-rococo/src/lib.rs index c4e697fbe9526b85c7f10cf739c6893d50190fe9..abce872d7ba35cf24b013aa26b4b1f1d796b5785 100644 --- a/bridges/primitives/chain-bridge-hub-rococo/src/lib.rs +++ b/bridges/chains/chain-bridge-hub-rococo/src/lib.rs @@ -107,5 +107,5 @@ frame_support::parameter_types! { /// Transaction fee that is paid at the Rococo BridgeHub for delivering single outbound message confirmation. /// (initially was calculated by test `BridgeHubRococo::can_calculate_fee_for_complex_message_confirmation_transaction` + `33%`) - pub const BridgeHubRococoBaseConfirmationFeeInRocs: u128 = 5_380_829_647; + pub const BridgeHubRococoBaseConfirmationFeeInRocs: u128 = 5_380_901_781; } diff --git a/bridges/primitives/chain-bridge-hub-westend/Cargo.toml b/bridges/chains/chain-bridge-hub-westend/Cargo.toml similarity index 83% rename from bridges/primitives/chain-bridge-hub-westend/Cargo.toml rename to bridges/chains/chain-bridge-hub-westend/Cargo.toml index 32a7850c5392fd892ec40e9968fa365ec59cbba3..ec74c4b947d693dba92d4da5051526e49349e0a5 100644 --- a/bridges/primitives/chain-bridge-hub-westend/Cargo.toml +++ b/bridges/chains/chain-bridge-hub-westend/Cargo.toml @@ -5,6 +5,7 @@ version = "0.3.0" authors.workspace = true edition.workspace = true license = "GPL-3.0-or-later WITH Classpath-exception-2.0" +repository.workspace = true [lints] workspace = true @@ -14,8 +15,8 @@ workspace = true # Bridge Dependencies bp-bridge-hub-cumulus = { path = "../chain-bridge-hub-cumulus", default-features = false } -bp-runtime = { path = "../runtime", default-features = false } -bp-messages = { path = "../messages", default-features = false } +bp-runtime = { path = "../../primitives/runtime", default-features = false } +bp-messages = { path = "../../primitives/messages", default-features = false } # Substrate Based Dependencies diff --git a/bridges/primitives/chain-bridge-hub-westend/src/lib.rs b/bridges/chains/chain-bridge-hub-westend/src/lib.rs similarity index 100% rename from bridges/primitives/chain-bridge-hub-westend/src/lib.rs rename to bridges/chains/chain-bridge-hub-westend/src/lib.rs diff --git a/bridges/primitives/chain-kusama/Cargo.toml b/bridges/chains/chain-kusama/Cargo.toml similarity index 71% rename from bridges/primitives/chain-kusama/Cargo.toml rename to bridges/chains/chain-kusama/Cargo.toml index 0660f34602389d1cf9e1ec88b57d1a9aeb9a3830..66061ff2793cbdd3419fa8894ab78e37486102ea 100644 --- a/bridges/primitives/chain-kusama/Cargo.toml +++ b/bridges/chains/chain-kusama/Cargo.toml @@ -5,6 +5,7 @@ version = "0.5.0" authors.workspace = true edition.workspace = true license = "GPL-3.0-or-later WITH Classpath-exception-2.0" +repository.workspace = true [lints] workspace = true @@ -13,9 +14,9 @@ workspace = true # Bridge Dependencies -bp-header-chain = { path = "../header-chain", default-features = false } -bp-polkadot-core = { path = "../polkadot-core", default-features = false } -bp-runtime = { path = "../runtime", default-features = false } +bp-header-chain = { path = "../../primitives/header-chain", default-features = false } +bp-polkadot-core = { path = "../../primitives/polkadot-core", default-features = false } +bp-runtime = { path = "../../primitives/runtime", default-features = false } # Substrate Based Dependencies diff --git a/bridges/primitives/chain-kusama/src/lib.rs b/bridges/chains/chain-kusama/src/lib.rs similarity index 95% rename from bridges/primitives/chain-kusama/src/lib.rs rename to bridges/chains/chain-kusama/src/lib.rs index e3b4d0520f61c858b54d78dfa4a45f57bac411fb..a81004afe8127b556211d0207d2bc1f9ecc02955 100644 --- a/bridges/primitives/chain-kusama/src/lib.rs +++ b/bridges/chains/chain-kusama/src/lib.rs @@ -53,8 +53,8 @@ impl Chain for Kusama { impl ChainWithGrandpa for Kusama { const WITH_CHAIN_GRANDPA_PALLET_NAME: &'static str = WITH_KUSAMA_GRANDPA_PALLET_NAME; const MAX_AUTHORITIES_COUNT: u32 = MAX_AUTHORITIES_COUNT; - const REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY: u32 = - REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY; + const REASONABLE_HEADERS_IN_JUSTIFICATION_ANCESTRY: u32 = + REASONABLE_HEADERS_IN_JUSTIFICATION_ANCESTRY; const MAX_MANDATORY_HEADER_SIZE: u32 = MAX_MANDATORY_HEADER_SIZE; const AVERAGE_HEADER_SIZE: u32 = AVERAGE_HEADER_SIZE; } diff --git a/bridges/primitives/chain-polkadot-bulletin/Cargo.toml b/bridges/chains/chain-polkadot-bulletin/Cargo.toml similarity index 68% rename from bridges/primitives/chain-polkadot-bulletin/Cargo.toml rename to bridges/chains/chain-polkadot-bulletin/Cargo.toml index 15c824fcbdb31c2c84f63bd56d4d0b3f90efc5b1..2db16a00e92492e3a167458343a88a24c2186748 100644 --- a/bridges/primitives/chain-polkadot-bulletin/Cargo.toml +++ b/bridges/chains/chain-polkadot-bulletin/Cargo.toml @@ -5,20 +5,21 @@ version = "0.4.0" authors.workspace = true edition.workspace = true license = "GPL-3.0-or-later WITH Classpath-exception-2.0" +repository.workspace = true [lints] workspace = true [dependencies] -codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false, features = ["derive"] } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } # Bridge Dependencies -bp-header-chain = { path = "../header-chain", default-features = false } -bp-messages = { path = "../messages", default-features = false } -bp-polkadot-core = { path = "../polkadot-core", default-features = false } -bp-runtime = { path = "../runtime", default-features = false } +bp-header-chain = { path = "../../primitives/header-chain", default-features = false } +bp-messages = { path = "../../primitives/messages", default-features = false } +bp-polkadot-core = { path = "../../primitives/polkadot-core", default-features = false } +bp-runtime = { path = "../../primitives/runtime", default-features = false } # Substrate Based Dependencies diff --git a/bridges/primitives/chain-polkadot-bulletin/src/lib.rs b/bridges/chains/chain-polkadot-bulletin/src/lib.rs similarity index 96% rename from bridges/primitives/chain-polkadot-bulletin/src/lib.rs rename to bridges/chains/chain-polkadot-bulletin/src/lib.rs index f2eebf9312470a42e1d3a1c7d67ab8b7a38af189..f3d300567f2b4f92cec272e0929a3c53d718c823 100644 --- a/bridges/primitives/chain-polkadot-bulletin/src/lib.rs +++ b/bridges/chains/chain-polkadot-bulletin/src/lib.rs @@ -43,7 +43,7 @@ use sp_runtime::{traits::DispatchInfoOf, transaction_validity::TransactionValidi pub use bp_polkadot_core::{ AccountAddress, AccountId, Balance, Block, BlockNumber, Hash, Hasher, Header, Nonce, Signature, SignedBlock, UncheckedExtrinsic, AVERAGE_HEADER_SIZE, EXTRA_STORAGE_PROOF_SIZE, - MAX_MANDATORY_HEADER_SIZE, REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY, + MAX_MANDATORY_HEADER_SIZE, REASONABLE_HEADERS_IN_JUSTIFICATION_ANCESTRY, }; /// Maximal number of GRANDPA authorities at Polkadot Bulletin chain. @@ -62,7 +62,7 @@ const NORMAL_DISPATCH_RATIO: Perbill = Perbill::from_percent(90); // Re following constants - we are using the same values at Cumulus parachains. They are limited // by the maximal transaction weight/size. Since block limits at Bulletin Chain are larger than -// at the Cumulus Bridgeg Hubs, we could reuse the same values. +// at the Cumulus Bridge Hubs, we could reuse the same values. /// Maximal number of unrewarded relayer entries at inbound lane for Cumulus-based parachains. pub const MAX_UNREWARDED_RELAYERS_IN_CONFIRMATION_TX: MessageNonce = 1024; @@ -207,8 +207,8 @@ impl Chain for PolkadotBulletin { impl ChainWithGrandpa for PolkadotBulletin { const WITH_CHAIN_GRANDPA_PALLET_NAME: &'static str = WITH_POLKADOT_BULLETIN_GRANDPA_PALLET_NAME; const MAX_AUTHORITIES_COUNT: u32 = MAX_AUTHORITIES_COUNT; - const REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY: u32 = - REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY; + const REASONABLE_HEADERS_IN_JUSTIFICATION_ANCESTRY: u32 = + REASONABLE_HEADERS_IN_JUSTIFICATION_ANCESTRY; const MAX_MANDATORY_HEADER_SIZE: u32 = MAX_MANDATORY_HEADER_SIZE; const AVERAGE_HEADER_SIZE: u32 = AVERAGE_HEADER_SIZE; } diff --git a/bridges/primitives/chain-polkadot/Cargo.toml b/bridges/chains/chain-polkadot/Cargo.toml similarity index 71% rename from bridges/primitives/chain-polkadot/Cargo.toml rename to bridges/chains/chain-polkadot/Cargo.toml index 6421b7f40106e404eeba04be72f5448fd5f65159..c700935f3083b5f287277c7d9975be53352b2506 100644 --- a/bridges/primitives/chain-polkadot/Cargo.toml +++ b/bridges/chains/chain-polkadot/Cargo.toml @@ -5,6 +5,7 @@ version = "0.5.0" authors.workspace = true edition.workspace = true license = "GPL-3.0-or-later WITH Classpath-exception-2.0" +repository.workspace = true [lints] workspace = true @@ -13,9 +14,9 @@ workspace = true # Bridge Dependencies -bp-header-chain = { path = "../header-chain", default-features = false } -bp-polkadot-core = { path = "../polkadot-core", default-features = false } -bp-runtime = { path = "../runtime", default-features = false } +bp-header-chain = { path = "../../primitives/header-chain", default-features = false } +bp-polkadot-core = { path = "../../primitives/polkadot-core", default-features = false } +bp-runtime = { path = "../../primitives/runtime", default-features = false } # Substrate Based Dependencies diff --git a/bridges/primitives/chain-polkadot/src/lib.rs b/bridges/chains/chain-polkadot/src/lib.rs similarity index 95% rename from bridges/primitives/chain-polkadot/src/lib.rs rename to bridges/chains/chain-polkadot/src/lib.rs index fc5e10308a8e33463a74c041f157daaef09cc9c8..00d35783a9b61844bab7701fdb60711125447ca3 100644 --- a/bridges/primitives/chain-polkadot/src/lib.rs +++ b/bridges/chains/chain-polkadot/src/lib.rs @@ -55,8 +55,8 @@ impl Chain for Polkadot { impl ChainWithGrandpa for Polkadot { const WITH_CHAIN_GRANDPA_PALLET_NAME: &'static str = WITH_POLKADOT_GRANDPA_PALLET_NAME; const MAX_AUTHORITIES_COUNT: u32 = MAX_AUTHORITIES_COUNT; - const REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY: u32 = - REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY; + const REASONABLE_HEADERS_IN_JUSTIFICATION_ANCESTRY: u32 = + REASONABLE_HEADERS_IN_JUSTIFICATION_ANCESTRY; const MAX_MANDATORY_HEADER_SIZE: u32 = MAX_MANDATORY_HEADER_SIZE; const AVERAGE_HEADER_SIZE: u32 = AVERAGE_HEADER_SIZE; } diff --git a/bridges/primitives/chain-rococo/Cargo.toml b/bridges/chains/chain-rococo/Cargo.toml similarity index 71% rename from bridges/primitives/chain-rococo/Cargo.toml rename to bridges/chains/chain-rococo/Cargo.toml index de373f0ae64b8d9a8124dbcdfcca3c2bf05e2787..5a5613bb376a5a4f75c773b3350993262149f973 100644 --- a/bridges/primitives/chain-rococo/Cargo.toml +++ b/bridges/chains/chain-rococo/Cargo.toml @@ -5,6 +5,7 @@ version = "0.6.0" authors.workspace = true edition.workspace = true license = "GPL-3.0-or-later WITH Classpath-exception-2.0" +repository.workspace = true [lints] workspace = true @@ -13,9 +14,9 @@ workspace = true # Bridge Dependencies -bp-header-chain = { path = "../header-chain", default-features = false } -bp-polkadot-core = { path = "../polkadot-core", default-features = false } -bp-runtime = { path = "../runtime", default-features = false } +bp-header-chain = { path = "../../primitives/header-chain", default-features = false } +bp-polkadot-core = { path = "../../primitives/polkadot-core", default-features = false } +bp-runtime = { path = "../../primitives/runtime", default-features = false } # Substrate Based Dependencies diff --git a/bridges/primitives/chain-rococo/src/lib.rs b/bridges/chains/chain-rococo/src/lib.rs similarity index 95% rename from bridges/primitives/chain-rococo/src/lib.rs rename to bridges/chains/chain-rococo/src/lib.rs index f1b256f0f090f048cc8db3a16c112ed8b938f6ce..2385dd2cbb250181ce5f46aef9f1e76f8fd010d2 100644 --- a/bridges/primitives/chain-rococo/src/lib.rs +++ b/bridges/chains/chain-rococo/src/lib.rs @@ -53,8 +53,8 @@ impl Chain for Rococo { impl ChainWithGrandpa for Rococo { const WITH_CHAIN_GRANDPA_PALLET_NAME: &'static str = WITH_ROCOCO_GRANDPA_PALLET_NAME; const MAX_AUTHORITIES_COUNT: u32 = MAX_AUTHORITIES_COUNT; - const REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY: u32 = - REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY; + const REASONABLE_HEADERS_IN_JUSTIFICATION_ANCESTRY: u32 = + REASONABLE_HEADERS_IN_JUSTIFICATION_ANCESTRY; const MAX_MANDATORY_HEADER_SIZE: u32 = MAX_MANDATORY_HEADER_SIZE; const AVERAGE_HEADER_SIZE: u32 = AVERAGE_HEADER_SIZE; } diff --git a/bridges/primitives/chain-westend/Cargo.toml b/bridges/chains/chain-westend/Cargo.toml similarity index 71% rename from bridges/primitives/chain-westend/Cargo.toml rename to bridges/chains/chain-westend/Cargo.toml index e55a8d649a88b88d84f4f3547c23709cef67d872..10b06d76507ef95bbff00f5560b705ecee1ec4ce 100644 --- a/bridges/primitives/chain-westend/Cargo.toml +++ b/bridges/chains/chain-westend/Cargo.toml @@ -5,6 +5,7 @@ version = "0.3.0" authors.workspace = true edition.workspace = true license = "GPL-3.0-or-later WITH Classpath-exception-2.0" +repository.workspace = true [lints] workspace = true @@ -13,9 +14,9 @@ workspace = true # Bridge Dependencies -bp-header-chain = { path = "../header-chain", default-features = false } -bp-polkadot-core = { path = "../polkadot-core", default-features = false } -bp-runtime = { path = "../runtime", default-features = false } +bp-header-chain = { path = "../../primitives/header-chain", default-features = false } +bp-polkadot-core = { path = "../../primitives/polkadot-core", default-features = false } +bp-runtime = { path = "../../primitives/runtime", default-features = false } # Substrate Based Dependencies diff --git a/bridges/primitives/chain-westend/src/lib.rs b/bridges/chains/chain-westend/src/lib.rs similarity index 95% rename from bridges/primitives/chain-westend/src/lib.rs rename to bridges/chains/chain-westend/src/lib.rs index f03fd2160a700eb3817a6feb629e9d366cc366aa..b344b7f4bf93392c08502446513a9ae39296b512 100644 --- a/bridges/primitives/chain-westend/src/lib.rs +++ b/bridges/chains/chain-westend/src/lib.rs @@ -53,8 +53,8 @@ impl Chain for Westend { impl ChainWithGrandpa for Westend { const WITH_CHAIN_GRANDPA_PALLET_NAME: &'static str = WITH_WESTEND_GRANDPA_PALLET_NAME; const MAX_AUTHORITIES_COUNT: u32 = MAX_AUTHORITIES_COUNT; - const REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY: u32 = - REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY; + const REASONABLE_HEADERS_IN_JUSTIFICATION_ANCESTRY: u32 = + REASONABLE_HEADERS_IN_JUSTIFICATION_ANCESTRY; const MAX_MANDATORY_HEADER_SIZE: u32 = MAX_MANDATORY_HEADER_SIZE; const AVERAGE_HEADER_SIZE: u32 = AVERAGE_HEADER_SIZE; } diff --git a/bridges/docs/bridge-relayers-claim-rewards.png b/bridges/docs/bridge-relayers-claim-rewards.png new file mode 100644 index 0000000000000000000000000000000000000000..d56b8dd871e8445e7cab49517123b0092ce09137 Binary files /dev/null and b/bridges/docs/bridge-relayers-claim-rewards.png differ diff --git a/bridges/docs/bridge-relayers-deregister.png b/bridges/docs/bridge-relayers-deregister.png new file mode 100644 index 0000000000000000000000000000000000000000..e7706cee78916d7e2bbcfd7ee4a1a046a0450f87 Binary files /dev/null and b/bridges/docs/bridge-relayers-deregister.png differ diff --git a/bridges/docs/bridge-relayers-register.png b/bridges/docs/bridge-relayers-register.png new file mode 100644 index 0000000000000000000000000000000000000000..e9e3e1b5ac87c5c9d31477c696912fcbc93b0c78 Binary files /dev/null and b/bridges/docs/bridge-relayers-register.png differ diff --git a/bridges/docs/running-relayer.md b/bridges/docs/running-relayer.md new file mode 100644 index 0000000000000000000000000000000000000000..710810a476e4df5e4b80fde31f9576be5ad26391 --- /dev/null +++ b/bridges/docs/running-relayer.md @@ -0,0 +1,343 @@ +# Running your own bridge relayer + +:warning: :construction: Please read the [Disclaimer](#disclaimer) section first :construction: :warning: + +## Disclaimer + +There are several things you should know before running your own relayer: + +- initial bridge version (we call it bridges v1) supports any number of relayers, but **there's no guaranteed +compensation** for running a relayer and/or submitting valid bridge transactions. Most probably you'll end up +spending more funds than getting from rewards - please accept this fact; + +- even if your relayer has managed to submit a valid bridge transaction that has been included into the bridge +hub block, there's no guarantee that you will be able to claim your compensation for that transaction. That's +because compensations are paid from the account, controlled by relay chain governance and it could have no funds +to compensate your useful actions. We'll be working on a proper process to resupply it on-time, but we can't +provide any guarantee until that process is well established. + +## A Brief Introduction into Relayers and our Compensations Scheme + +Omitting details, relayer is an offchain process that is connected to both bridged chains. It looks at the +outbound bridge messages queue and submits message delivery transactions to the target chain. There's a lot +of details behind that simple phrase - you could find more info in the +[High-Level Bridge Overview](./high-level-overview.md) document. + +Reward that is paid to relayer has two parts. The first part static and is controlled by the governance. +It is rather small initially - e.g. you need to deliver `10_000` Kusama -> Polkadot messages to gain single +KSM token. + +The other reward part is dynamic. So to deliver an XCM message from one BridgeHub to another, we'll need to +submit two transactions on different chains. Every transaction has its cost, which is: + +- dynamic, because e.g. message size can change and/or fee factor of the target chain may change; + +- quite large, because those transactions are quite heavy (mostly in terms of size, not weight). + +We are compensating the cost of **valid**, **minimal** and **useful** bridge-related transactions to +relayer, that has submitted such transaction. Valid here means that the transaction doesn't fail. Minimal +means that all data within transaction call is actually required for the transaction to succeed. Useful +means that all supplied data in transaction is new and yet unknown to the target chain. + +We have implemented a relayer that is able to craft such transactions. The rest of document contains a detailed +information on how to deploy this software on your own node. + +## Relayers Concurrency + +As it has been said above, we are not compensating cost of transactions that are not **useful**. For +example, if message `100` has already been delivered from Kusama Bridge Hub to Polkadot Bridge Hub, then another +transaction that delivers the same message `100` won't be **useful**. Hence, no compensation to relayer that +has submitted that second transaction. + +But what if there are several relayers running? They are noticing the same queued message `100` and +simultaneously submit identical message delivery transactions. You may expect that there'll be one lucky +relayer, whose transaction would win the "race" and which will receive the compensation and reward. And +there'll be several other relayers, losing some funds on their unuseful transactions. + +But actually, we have a solution that invalidates transactions of "unlucky" relayers before they are +included into the block. So at least you may be sure that you won't waste your funds on duplicate transactions. + +
+Some details? + +All **unuseful** transactions are rejected by our +[transaction extension](https://github.com/paritytech/polkadot-sdk/blob/master/bridges/bin/runtime-common/src/refund_relayer_extension.rs), +which also handles transaction fee compensations. You may find more info on unuseful (aka obsolete) transactions +by lurking in the code. + +We also have the WiP prototype of relayers coordination protocol, where relayers will get some guarantee +that their transactions will be prioritized over other relayers transactions at their assigned slots. +That is planned for the future version of bridge and the progress is +[tracked here](https://github.com/paritytech/parity-bridges-common/issues/2486). + +
+ +## Prerequisites + +Let's focus on the bridge between Polkadot and Kusama Bridge Hubs. Let's also assume that we want to start +a relayer that "serves" an initial lane [`0x00000001`](https://github.com/polkadot-fellows/runtimes/blob/9ce1bbbbcd7843b3c76ba4d43c036bc311959e9f/system-parachains/bridge-hubs/bridge-hub-kusama/src/bridge_to_polkadot_config.rs#L54). + +
+Lane? + +Think of lane as a queue of messages that need to be delivered to the other/bridged chain. The lane is +bidirectional, meaning that there are four "endpoints". Two "outbound" endpoints (one at every chain), contain +messages that need to be delivered to the bridged chain. Two "inbound" are accepting messages from the bridged +chain and also remember the relayer, who has delivered message(s) to reward it later. + +
+ +The same steps may be performed for other lanes and bridges as well - you'll just need to change several parameters. + +So to start your relayer instance, you'll need to prepare: + +- an address of ws/wss RPC endpoint of the Kusama relay chain; + +- an address of ws/wss RPC endpoint of the Polkadot relay chain; + +- an address of ws/wss RPC endpoint of the Kusama Bridge Hub chain; + +- an address of ws/wss RPC endpoint of the Polkadot Bridge Hub chain; + +- an account on Kusama Bridge Hub; + +- an account on Polkadot Bridge Hub. + +For RPC endpoints, you could start your own nodes, or use some public community nodes. Nodes are not meant to be +archive or provide access to insecure RPC calls. + +To create an account on Bridge Hubs, you could use XCM teleport functionality. E.g. if you have an account on +the relay chain, you could use the `teleportAssets` call of `xcmPallet` and send asset +`V3 { id: Concrete(0, Here), Fungible: }` to beneficiary `V3(0, X1(AccountId32()))` +on destination `V3(0, X1(Parachain(1002)))`. To estimate amounts you need, please refer to the [Costs](#costs) +section of the document. + +## Registering your Relayer Account (Optional, But Please Read) + +Bridge transactions are quite heavy and expensive. We want to minimize block space that can be occupied by +invalid bridge transactions and prioritize valid transactions over invalid. That is achieved by **optional** +relayer registration. Transactions, signed by relayers with active registration, gain huge priority boost. +In exchange, such relayers may be slashed if they submit **invalid** or **non-minimal** transaction. + +Transactions, signed by relayers **without** active registration, on the other hand, receive no priority +boost. It means that if there is active registered relayer, most likely all transactions from unregistered +will be counted as **unuseful**, not included into the block and unregistered relayer won't get any reward +for his operations. + +Before registering, you should know several things about your funds: + +- to register, you need to hold significant amount of funds on your relayer account. As of now, it is + [100 KSM](https://github.com/polkadot-fellows/runtimes/blob/9ce1bbbbcd7843b3c76ba4d43c036bc311959e9f/system-parachains/bridge-hubs/bridge-hub-kusama/src/bridge_to_polkadot_config.rs#L71C14-L71C43) + for registration on Kusama Bridge Hub and + [500 DOT](https://github.com/polkadot-fellows/runtimes/blob/9ce1bbbbcd7843b3c76ba4d43c036bc311959e9f/system-parachains/bridge-hubs/bridge-hub-polkadot/src/bridge_to_kusama_config.rs#L71C14-L71C43) + for registration on Polkadot Bridge Hub; + +- when you are registered, those funds are reserved on relayer account and you can't transfer them. + +The registration itself, has three states: active, inactive or expired. Initially, it is active, meaning that all +your transactions that are **validated** on top of block, where it is active get priority boost. Registration +becomes expired when the block with the number you have specified during registration is "mined". It is the +`validTill` parameter of the `register` call (see below). After that `validTill` block, you may unregister and get +your reserved funds back. There's also an intermediate point between those blocks - it is the `validTill - LEASE`, +where `LEASE` is the the chain constant, controlled by the governance. Initially it is set to `300` blocks. +All your transactions, **validated** between the `validTill - LEASE` and `validTill` blocks do not get the +priority boost. Also, it is forbidden to specify `validTill` such that the `validTill - currentBlock` is less +than the `LEASE`. + +
+Example? + +| Bridge Hub Block | Registration State | Comment | +| ----------------- | ------------------ | ------------------------------------------------------ | +| 100 | Active | You have submitted a tx with the `register(1000)` call | +| 101 | Active | Your message delivery transactions are boosted | +| 102 | Active | Your message delivery transactions are boosted | +| ... | Active | Your message delivery transactions are boosted | +| 700 | Inactive | Your message delivery transactions are not boosted | +| 701 | Inactive | Your message delivery transactions are not boosted | +| ... | Inactive | Your message delivery transactions are not boosted | +| 1000 | Expired | Your may submit a tx with the `deregister` call | + +
+ +So once you have enough funds on your account and have selected the `validTill` parameter value, you +could use the Polkadot JS apps to submit an extrinsic. If you want priority boost for your transactions +on the Kusama Bridge Hub, open the +[Polkadot JS Apps](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Fkusama-bridge-hub-rpc.polkadot.io#/extrinsics) +and submit the `register` extrinsic from the `bridgeRelayers` pallet: + +![Register Extrinsic](./bridge-relayers-register.png) + +To deregister, submit the simple `deregister` extrinsic when registration is expired: + +![Deregister Extrinsic](./bridge-relayers-deregister.png) + +At any time, you can prolong your registration by calling the `register` with the larger `validTill`. + +## Costs + +Your relayer account (on both Bridge Hubs) must hold enough funds to be able to pay costs of bridge +transactions. If your relayer behaves correctly, those costs will be compensated and you will be +able to claim it later. + +**IMPORTANT**: you may add tip to your bridge transactions to boost their priority. But our +compensation mechanism never refunds transaction tip, so all tip tokens will be lost. + +
+Types of bridge transactions + +There are two types of bridge transactions: + +- message delivery transaction brings queued message(s) from one Bridge Hub to another. We record + the fact that this specific (your) relayer has delivered those messages; + +- message confirmation transaction confirms that some message have been delivered and also brings + back information on how many messages (your) relayer has delivered. We use this information later + to register delivery rewards on the source chain. + +Several messages/confirmations may be included in a single bridge transaction. Apart from this +data, bridge transaction may include finality and storage proofs, required to prove authenticity of +this data. + +
+ +To deliver and get reward for a single message, the relayer needs to submit two transactions. One +at the source Bridge Hub and one at the target Bridge Hub. Below are costs for Polkadot <> Kusama +messages (as of today): + +- to deliver a single Polkadot -> Kusama message, you would need to pay around `0.06 KSM` at Kusama + Bridge Hub and around `1.62 DOT` at Polkadot Bridge Hub; + +- to deliver a single Kusama -> Polkadot message, you would need to pay around `1.70 DOT` at Polkadot + Bridge Hub and around `0.05 KSM` at Kusama Bridge Hub. + +Those values are not constants - they depend on call weights (that may change from release to release), +on transaction sizes (that depends on message size and chain state) and congestion factor. In any +case - it is your duty to make sure that the relayer has enough funds to pay transaction fees. + +## Claiming your Compensations and Rewards + +Hopefully you have successfully delivered some messages and now can claim your compensation and reward. +This requires submitting several transactions. But first, let's check that you actually have something to +claim. For that, let's check the state of the pallet that tracks all rewards. + +To check your rewards at the Kusama Bridge Hub, go to the +[Polkadot JS Apps](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Fkusama-bridge-hub-rpc.polkadot.io#/chainstate) +targeting Kusama Bridge Hub, select the `bridgeRelayers` pallet, choose `relayerRewards` map and +your relayer account. Then: + +- set the `laneId` to `0x00000001` + +- set the `bridgedChainId` to `bhpd`; + +- check the both variants of the `owner` field: `ThisChain` is used to pay for message delivery transactions + and `BridgedChain` is used to pay for message confirmation transactions. + +If check shows that you have some rewards, you can craft the claim transaction, with similar parameters. +For that, go to `Extrinsics` tab of the +[Polkadot JS Apps](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Fkusama-bridge-hub-rpc.polkadot.io#/extrinsics) +and submit the following transaction (make sure to change `owner` before): + +![Claim Rewards Extrinsic](./bridge-relayers-claim-rewards.png) + +To claim rewards on Polkadot Bridge Hub you can follow the same process. The only difference is that you +need to set value of the `bridgedChainId` to `bhks`. + +## Starting your Relayer + +### Starting your Rococo <> Westend Relayer + +You may find the relayer image reference in the +[Releases](https://github.com/paritytech/parity-bridges-common/releases) +of this repository. Make sure to check supported (bundled) versions +of release there. For Rococo <> Westend bridge, normally you may use the +latest published release. The release notes always contain the docker +image reference and source files, required to build relayer manually. + +Once you have the docker image, update variables and run the following script: +```sh +export DOCKER_IMAGE= + +export ROCOCO_HOST= +export ROCOCO_PORT= +# or set it to '--rococo-secure' if wss is used above +export ROCOCO_IS_SECURE= +export BRIDGE_HUB_ROCOCO_HOST= +export BRIDGE_HUB_ROCOCO_PORT= +# or set it to '--bridge-hub-rococo-secure' if wss is used above +export BRIDGE_HUB_ROCOCO_IS_SECURE= +export BRIDGE_HUB_ROCOCO_KEY_FILE= + +export WESTEND_HOST= +export WESTEND_PORT= +# or set it to '--westend-secure' if wss is used above +export WESTEND_IS_SECURE= +export BRIDGE_HUB_WESTEND_HOST= +export BRIDGE_HUB_WESTEND_PORT= +# or set it to '--bridge-hub-westend-secure ' if wss is used above +export BRIDGE_HUB_WESTEND_IS_SECURE= +export BRIDGE_HUB_WESTEND_KEY_FILE= + +# you can get extended relay logs (e.g. for debugging issues) by passing `-e RUST_LOG=bridge=trace` +# argument to the `docker` binary +docker run \ + -v $BRIDGE_HUB_ROCOCO_KEY_FILE:/bhr.key \ + -v $BRIDGE_HUB_WESTEND_KEY_FILE:/bhw.key \ + $DOCKER_IMAGE \ + relay-headers-and-messages bridge-hub-rococo-bridge-hub-westend \ + --rococo-host $ROCOCO_HOST \ + --rococo-port $ROCOCO_PORT \ + $ROCOCO_IS_SECURE \ + --rococo-version-mode Auto \ + --bridge-hub-rococo-host $BRIDGE_HUB_ROCOCO_HOST \ + --bridge-hub-rococo-port $BRIDGE_HUB_ROCOCO_PORT \ + $BRIDGE_HUB_ROCOCO_IS_SECURE \ + --bridge-hub-rococo-version-mode Auto \ + --bridge-hub-rococo-signer-file /bhr.key \ + --bridge-hub-rococo-transactions-mortality 16 \ + --westend-host $WESTEND_HOST \ + --westend-port $WESTEND_PORT \ + $WESTEND_IS_SECURE \ + --westend-version-mode Auto \ + --bridge-hub-westend-host $BRIDGE_HUB_WESTEND_HOST \ + --bridge-hub-westend-port $BRIDGE_HUB_WESTEND_PORT \ + $BRIDGE_HUB_WESTEND_IS_SECURE \ + --bridge-hub-westend-version-mode Auto \ + --bridge-hub-westend-signer-file /bhw.key \ + --bridge-hub-westend-transactions-mortality 16 \ + --lane 00000002 +``` + +### Starting your Polkadot <> Kusama Relayer + +*Work in progress, coming soon* + +### Watching your relayer state + +Our relayer provides some Prometheus metrics that you may convert into some fancy Grafana dashboards +and alerts. By default, metrics are exposed at port `9616`. To expose endpoint to the localhost, change +the docker command by adding following two lines: + +```sh +docker run \ + .. + -p 127.0.0.1:9616:9616 \ # tell Docker to bind container port 9616 to host port 9616 + # and listen for connections on the host' localhost interface + .. + $DOCKER_IMAGE \ + relay-headers-and-messages bridge-hub-rococo-bridge-hub-westend \ + --prometheus-host 0.0.0.0 \ # tell `substrate-relay` binary to accept Prometheus endpoint + # connections from everywhere + .. +``` + +You can find more info on configuring Prometheus and Grafana in the +[Monitor your node](https://wiki.polkadot.network/docs/maintain-guides-how-to-monitor-your-node) +guide from Polkadot wiki. + +We have our own set of Grafana dashboards and alerts. You may use them for inspiration. +Please find them in this folder: + +- for Rococo <> Westend bridge: [rococo-westend](https://github.com/paritytech/parity-bridges-common/tree/master/deployments/bridges/rococo-westend). + +- for Polkadot <> Kusama bridge: *work in progress, coming soon* diff --git a/bridges/modules/beefy/Cargo.toml b/bridges/modules/beefy/Cargo.toml new file mode 100644 index 0000000000000000000000000000000000000000..438f32fb146042f2704deb3092381a2b5cc68394 --- /dev/null +++ b/bridges/modules/beefy/Cargo.toml @@ -0,0 +1,63 @@ +[package] +name = "pallet-bridge-beefy" +version = "0.1.0" +description = "Module implementing BEEFY on-chain light client used for bridging consensus of substrate-based chains." +authors.workspace = true +edition.workspace = true +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" +repository.workspace = true +publish = false + +[lints] +workspace = true + +[dependencies] +codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false } +log = { workspace = true } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +serde = { optional = true, workspace = true } + +# Bridge Dependencies + +bp-beefy = { path = "../../primitives/beefy", default-features = false } +bp-runtime = { path = "../../primitives/runtime", default-features = false } + +# Substrate Dependencies + +frame-support = { path = "../../../substrate/frame/support", default-features = false } +frame-system = { path = "../../../substrate/frame/system", default-features = false } +sp-core = { path = "../../../substrate/primitives/core", default-features = false } +sp-runtime = { path = "../../../substrate/primitives/runtime", default-features = false } +sp-std = { path = "../../../substrate/primitives/std", default-features = false } + +[dev-dependencies] +sp-consensus-beefy = { path = "../../../substrate/primitives/consensus/beefy" } +mmr-lib = { package = "ckb-merkle-mountain-range", version = "0.5.2" } +pallet-beefy-mmr = { path = "../../../substrate/frame/beefy-mmr" } +pallet-mmr = { path = "../../../substrate/frame/merkle-mountain-range" } +rand = "0.8.5" +sp-io = { path = "../../../substrate/primitives/io" } +bp-test-utils = { path = "../../primitives/test-utils" } + +[features] +default = ["std"] +std = [ + "bp-beefy/std", + "bp-runtime/std", + "codec/std", + "frame-support/std", + "frame-system/std", + "log/std", + "scale-info/std", + "serde/std", + "sp-core/std", + "sp-runtime/std", + "sp-std/std", +] +try-runtime = [ + "frame-support/try-runtime", + "frame-system/try-runtime", + "pallet-beefy-mmr/try-runtime", + "pallet-mmr/try-runtime", + "sp-runtime/try-runtime", +] diff --git a/bridges/modules/beefy/src/lib.rs b/bridges/modules/beefy/src/lib.rs new file mode 100644 index 0000000000000000000000000000000000000000..27c83921021bb4299b18cbf2d3216427f8c89ccc --- /dev/null +++ b/bridges/modules/beefy/src/lib.rs @@ -0,0 +1,651 @@ +// Copyright 2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! BEEFY bridge pallet. +//! +//! This pallet is an on-chain BEEFY light client for Substrate-based chains that are using the +//! following pallets bundle: `pallet-mmr`, `pallet-beefy` and `pallet-beefy-mmr`. +//! +//! The pallet is able to verify MMR leaf proofs and BEEFY commitments, so it has access +//! to the following data of the bridged chain: +//! +//! - header hashes +//! - changes of BEEFY authorities +//! - extra data of MMR leafs +//! +//! Given the header hash, other pallets are able to verify header-based proofs +//! (e.g. storage proofs, transaction inclusion proofs, etc.). + +#![warn(missing_docs)] +#![cfg_attr(not(feature = "std"), no_std)] + +use bp_beefy::{ChainWithBeefy, InitializationData}; +use sp_std::{boxed::Box, prelude::*}; + +// Re-export in crate namespace for `construct_runtime!` +pub use pallet::*; + +mod utils; + +#[cfg(test)] +mod mock; +#[cfg(test)] +mod mock_chain; + +/// The target that will be used when publishing logs related to this pallet. +pub const LOG_TARGET: &str = "runtime::bridge-beefy"; + +/// Configured bridged chain. +pub type BridgedChain = >::BridgedChain; +/// Block number, used by configured bridged chain. +pub type BridgedBlockNumber = bp_runtime::BlockNumberOf>; +/// Block hash, used by configured bridged chain. +pub type BridgedBlockHash = bp_runtime::HashOf>; + +/// Pallet initialization data. +pub type InitializationDataOf = + InitializationData, bp_beefy::MmrHashOf>>; +/// BEEFY commitment hasher, used by configured bridged chain. +pub type BridgedBeefyCommitmentHasher = bp_beefy::BeefyCommitmentHasher>; +/// BEEFY validator id, used by configured bridged chain. +pub type BridgedBeefyAuthorityId = bp_beefy::BeefyAuthorityIdOf>; +/// BEEFY validator set, used by configured bridged chain. +pub type BridgedBeefyAuthoritySet = bp_beefy::BeefyAuthoritySetOf>; +/// BEEFY authority set, used by configured bridged chain. +pub type BridgedBeefyAuthoritySetInfo = bp_beefy::BeefyAuthoritySetInfoOf>; +/// BEEFY signed commitment, used by configured bridged chain. +pub type BridgedBeefySignedCommitment = bp_beefy::BeefySignedCommitmentOf>; +/// MMR hashing algorithm, used by configured bridged chain. +pub type BridgedMmrHashing = bp_beefy::MmrHashingOf>; +/// MMR hashing output type of `BridgedMmrHashing`. +pub type BridgedMmrHash = bp_beefy::MmrHashOf>; +/// The type of the MMR leaf extra data used by the configured bridged chain. +pub type BridgedBeefyMmrLeafExtra = bp_beefy::BeefyMmrLeafExtraOf>; +/// BEEFY MMR proof type used by the pallet +pub type BridgedMmrProof = bp_beefy::MmrProofOf>; +/// MMR leaf type, used by configured bridged chain. +pub type BridgedBeefyMmrLeaf = bp_beefy::BeefyMmrLeafOf>; +/// Imported commitment data, stored by the pallet. +pub type ImportedCommitment = bp_beefy::ImportedCommitment< + BridgedBlockNumber, + BridgedBlockHash, + BridgedMmrHash, +>; + +/// Some high level info about the imported commitments. +#[derive(codec::Encode, codec::Decode, scale_info::TypeInfo)] +pub struct ImportedCommitmentsInfoData { + /// Best known block number, provided in a BEEFY commitment. However this is not + /// the best proven block. The best proven block is this block's parent. + best_block_number: BlockNumber, + /// The head of the `ImportedBlockNumbers` ring buffer. + next_block_number_index: u32, +} + +#[frame_support::pallet(dev_mode)] +pub mod pallet { + use super::*; + use bp_runtime::{BasicOperatingMode, OwnedBridgeModule}; + use frame_support::pallet_prelude::*; + use frame_system::pallet_prelude::*; + + #[pallet::config] + pub trait Config: frame_system::Config { + /// The upper bound on the number of requests allowed by the pallet. + /// + /// A request refers to an action which writes a header to storage. + /// + /// Once this bound is reached the pallet will reject all commitments + /// until the request count has decreased. + #[pallet::constant] + type MaxRequests: Get; + + /// Maximal number of imported commitments to keep in the storage. + /// + /// The setting is there to prevent growing the on-chain state indefinitely. Note + /// the setting does not relate to block numbers - we will simply keep as much items + /// in the storage, so it doesn't guarantee any fixed timeframe for imported commitments. + #[pallet::constant] + type CommitmentsToKeep: Get; + + /// The chain we are bridging to here. + type BridgedChain: ChainWithBeefy; + } + + #[pallet::pallet] + #[pallet::without_storage_info] + pub struct Pallet(PhantomData<(T, I)>); + + #[pallet::hooks] + impl, I: 'static> Hooks> for Pallet { + fn on_initialize(_n: BlockNumberFor) -> frame_support::weights::Weight { + >::mutate(|count| *count = count.saturating_sub(1)); + + Weight::from_parts(0, 0) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + } + + impl, I: 'static> OwnedBridgeModule for Pallet { + const LOG_TARGET: &'static str = LOG_TARGET; + type OwnerStorage = PalletOwner; + type OperatingMode = BasicOperatingMode; + type OperatingModeStorage = PalletOperatingMode; + } + + #[pallet::call] + impl, I: 'static> Pallet + where + BridgedMmrHashing: 'static + Send + Sync, + { + /// Initialize pallet with BEEFY authority set and best known finalized block number. + #[pallet::call_index(0)] + #[pallet::weight((T::DbWeight::get().reads_writes(2, 3), DispatchClass::Operational))] + pub fn initialize( + origin: OriginFor, + init_data: InitializationDataOf, + ) -> DispatchResult { + Self::ensure_owner_or_root(origin)?; + + let is_initialized = >::exists(); + ensure!(!is_initialized, >::AlreadyInitialized); + + log::info!(target: LOG_TARGET, "Initializing bridge BEEFY pallet: {:?}", init_data); + Ok(initialize::(init_data)?) + } + + /// Change `PalletOwner`. + /// + /// May only be called either by root, or by `PalletOwner`. + #[pallet::call_index(1)] + #[pallet::weight((T::DbWeight::get().reads_writes(1, 1), DispatchClass::Operational))] + pub fn set_owner(origin: OriginFor, new_owner: Option) -> DispatchResult { + >::set_owner(origin, new_owner) + } + + /// Halt or resume all pallet operations. + /// + /// May only be called either by root, or by `PalletOwner`. + #[pallet::call_index(2)] + #[pallet::weight((T::DbWeight::get().reads_writes(1, 1), DispatchClass::Operational))] + pub fn set_operating_mode( + origin: OriginFor, + operating_mode: BasicOperatingMode, + ) -> DispatchResult { + >::set_operating_mode(origin, operating_mode) + } + + /// Submit a commitment generated by BEEFY authority set. + /// + /// It will use the underlying storage pallet to fetch information about the current + /// authority set and best finalized block number in order to verify that the commitment + /// is valid. + /// + /// If successful in verification, it will update the underlying storage with the data + /// provided in the newly submitted commitment. + #[pallet::call_index(3)] + #[pallet::weight(0)] + pub fn submit_commitment( + origin: OriginFor, + commitment: BridgedBeefySignedCommitment, + validator_set: BridgedBeefyAuthoritySet, + mmr_leaf: Box>, + mmr_proof: BridgedMmrProof, + ) -> DispatchResult + where + BridgedBeefySignedCommitment: Clone, + { + Self::ensure_not_halted().map_err(Error::::BridgeModule)?; + ensure_signed(origin)?; + + ensure!(Self::request_count() < T::MaxRequests::get(), >::TooManyRequests); + + // Ensure that the commitment is for a better block. + let commitments_info = + ImportedCommitmentsInfo::::get().ok_or(Error::::NotInitialized)?; + ensure!( + commitment.commitment.block_number > commitments_info.best_block_number, + Error::::OldCommitment + ); + + // Verify commitment and mmr leaf. + let current_authority_set_info = CurrentAuthoritySetInfo::::get(); + let mmr_root = utils::verify_commitment::( + &commitment, + ¤t_authority_set_info, + &validator_set, + )?; + utils::verify_beefy_mmr_leaf::(&mmr_leaf, mmr_proof, mmr_root)?; + + // Update request count. + RequestCount::::mutate(|count| *count += 1); + // Update authority set if needed. + if mmr_leaf.beefy_next_authority_set.id > current_authority_set_info.id { + CurrentAuthoritySetInfo::::put(mmr_leaf.beefy_next_authority_set); + } + + // Import commitment. + let block_number_index = commitments_info.next_block_number_index; + let to_prune = ImportedBlockNumbers::::try_get(block_number_index); + ImportedCommitments::::insert( + commitment.commitment.block_number, + ImportedCommitment:: { + parent_number_and_hash: mmr_leaf.parent_number_and_hash, + mmr_root, + }, + ); + ImportedBlockNumbers::::insert( + block_number_index, + commitment.commitment.block_number, + ); + ImportedCommitmentsInfo::::put(ImportedCommitmentsInfoData { + best_block_number: commitment.commitment.block_number, + next_block_number_index: (block_number_index + 1) % T::CommitmentsToKeep::get(), + }); + if let Ok(old_block_number) = to_prune { + log::debug!( + target: LOG_TARGET, + "Pruning commitment for old block: {:?}.", + old_block_number + ); + ImportedCommitments::::remove(old_block_number); + } + + log::info!( + target: LOG_TARGET, + "Successfully imported commitment for block {:?}", + commitment.commitment.block_number, + ); + + Ok(()) + } + } + + /// The current number of requests which have written to storage. + /// + /// If the `RequestCount` hits `MaxRequests`, no more calls will be allowed to the pallet until + /// the request capacity is increased. + /// + /// The `RequestCount` is decreased by one at the beginning of every block. This is to ensure + /// that the pallet can always make progress. + #[pallet::storage] + #[pallet::getter(fn request_count)] + pub type RequestCount, I: 'static = ()> = StorageValue<_, u32, ValueQuery>; + + /// High level info about the imported commitments. + /// + /// Contains the following info: + /// - best known block number of the bridged chain, finalized by BEEFY + /// - the head of the `ImportedBlockNumbers` ring buffer + #[pallet::storage] + pub type ImportedCommitmentsInfo, I: 'static = ()> = + StorageValue<_, ImportedCommitmentsInfoData>>; + + /// A ring buffer containing the block numbers of the commitments that we have imported, + /// ordered by the insertion time. + #[pallet::storage] + pub(super) type ImportedBlockNumbers, I: 'static = ()> = + StorageMap<_, Identity, u32, BridgedBlockNumber>; + + /// All the commitments that we have imported and haven't been pruned yet. + #[pallet::storage] + pub type ImportedCommitments, I: 'static = ()> = + StorageMap<_, Blake2_128Concat, BridgedBlockNumber, ImportedCommitment>; + + /// The current BEEFY authority set at the bridged chain. + #[pallet::storage] + pub type CurrentAuthoritySetInfo, I: 'static = ()> = + StorageValue<_, BridgedBeefyAuthoritySetInfo, ValueQuery>; + + /// Optional pallet owner. + /// + /// Pallet owner has the right to halt all pallet operations and then resume it. If it is + /// `None`, then there are no direct ways to halt/resume pallet operations, but other + /// runtime methods may still be used to do that (i.e. `democracy::referendum` to update halt + /// flag directly or calling `halt_operations`). + #[pallet::storage] + pub type PalletOwner, I: 'static = ()> = + StorageValue<_, T::AccountId, OptionQuery>; + + /// The current operating mode of the pallet. + /// + /// Depending on the mode either all, or no transactions will be allowed. + #[pallet::storage] + pub type PalletOperatingMode, I: 'static = ()> = + StorageValue<_, BasicOperatingMode, ValueQuery>; + + #[pallet::genesis_config] + #[derive(frame_support::DefaultNoBound)] + pub struct GenesisConfig, I: 'static = ()> { + /// Optional module owner account. + pub owner: Option, + /// Optional module initialization data. + pub init_data: Option>, + } + + #[pallet::genesis_build] + impl, I: 'static> BuildGenesisConfig for GenesisConfig { + fn build(&self) { + if let Some(ref owner) = self.owner { + >::put(owner); + } + + if let Some(init_data) = self.init_data.clone() { + initialize::(init_data) + .expect("invalid initialization data of BEEFY bridge pallet"); + } else { + // Since the bridge hasn't been initialized we shouldn't allow anyone to perform + // transactions. + >::put(BasicOperatingMode::Halted); + } + } + } + + #[pallet::error] + pub enum Error { + /// The pallet has not been initialized yet. + NotInitialized, + /// The pallet has already been initialized. + AlreadyInitialized, + /// Invalid initial authority set. + InvalidInitialAuthoritySet, + /// There are too many requests for the current window to handle. + TooManyRequests, + /// The imported commitment is older than the best commitment known to the pallet. + OldCommitment, + /// The commitment is signed by unknown validator set. + InvalidCommitmentValidatorSetId, + /// The id of the provided validator set is invalid. + InvalidValidatorSetId, + /// The number of signatures in the commitment is invalid. + InvalidCommitmentSignaturesLen, + /// The number of validator ids provided is invalid. + InvalidValidatorSetLen, + /// There aren't enough correct signatures in the commitment to finalize the block. + NotEnoughCorrectSignatures, + /// MMR root is missing from the commitment. + MmrRootMissingFromCommitment, + /// MMR proof verification has failed. + MmrProofVerificationFailed, + /// The validators are not matching the merkle tree root of the authority set. + InvalidValidatorSetRoot, + /// Error generated by the `OwnedBridgeModule` trait. + BridgeModule(bp_runtime::OwnedBridgeModuleError), + } + + /// Initialize pallet with given parameters. + pub(super) fn initialize, I: 'static>( + init_data: InitializationDataOf, + ) -> Result<(), Error> { + if init_data.authority_set.len == 0 { + return Err(Error::::InvalidInitialAuthoritySet) + } + CurrentAuthoritySetInfo::::put(init_data.authority_set); + + >::put(init_data.operating_mode); + ImportedCommitmentsInfo::::put(ImportedCommitmentsInfoData { + best_block_number: init_data.best_block_number, + next_block_number_index: 0, + }); + + Ok(()) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use bp_runtime::{BasicOperatingMode, OwnedBridgeModuleError}; + use bp_test_utils::generate_owned_bridge_module_tests; + use frame_support::{assert_noop, assert_ok, traits::Get}; + use mock::*; + use mock_chain::*; + use sp_consensus_beefy::mmr::BeefyAuthoritySet; + use sp_runtime::DispatchError; + + fn next_block() { + use frame_support::traits::OnInitialize; + + let current_number = frame_system::Pallet::::block_number(); + frame_system::Pallet::::set_block_number(current_number + 1); + let _ = Pallet::::on_initialize(current_number); + } + + fn import_header_chain(headers: Vec) { + for header in headers { + if header.commitment.is_some() { + assert_ok!(import_commitment(header)); + } + } + } + + #[test] + fn fails_to_initialize_if_already_initialized() { + run_test_with_initialize(32, || { + assert_noop!( + Pallet::::initialize( + RuntimeOrigin::root(), + InitializationData { + operating_mode: BasicOperatingMode::Normal, + best_block_number: 0, + authority_set: BeefyAuthoritySet { + id: 0, + len: 1, + keyset_commitment: [0u8; 32].into() + } + } + ), + Error::::AlreadyInitialized, + ); + }); + } + + #[test] + fn fails_to_initialize_if_authority_set_is_empty() { + run_test(|| { + assert_noop!( + Pallet::::initialize( + RuntimeOrigin::root(), + InitializationData { + operating_mode: BasicOperatingMode::Normal, + best_block_number: 0, + authority_set: BeefyAuthoritySet { + id: 0, + len: 0, + keyset_commitment: [0u8; 32].into() + } + } + ), + Error::::InvalidInitialAuthoritySet, + ); + }); + } + + #[test] + fn fails_to_import_commitment_if_halted() { + run_test_with_initialize(1, || { + assert_ok!(Pallet::::set_operating_mode( + RuntimeOrigin::root(), + BasicOperatingMode::Halted + )); + assert_noop!( + import_commitment(ChainBuilder::new(1).append_finalized_header().to_header()), + Error::::BridgeModule(OwnedBridgeModuleError::Halted), + ); + }) + } + + #[test] + fn fails_to_import_commitment_if_too_many_requests() { + run_test_with_initialize(1, || { + let max_requests = <::MaxRequests as Get>::get() as u64; + let mut chain = ChainBuilder::new(1); + for _ in 0..max_requests + 2 { + chain = chain.append_finalized_header(); + } + + // import `max_request` headers + for i in 0..max_requests { + assert_ok!(import_commitment(chain.header(i + 1))); + } + + // try to import next header: it fails because we are no longer accepting commitments + assert_noop!( + import_commitment(chain.header(max_requests + 1)), + Error::::TooManyRequests, + ); + + // when next block is "started", we allow import of next header + next_block(); + assert_ok!(import_commitment(chain.header(max_requests + 1))); + + // but we can't import two headers until next block and so on + assert_noop!( + import_commitment(chain.header(max_requests + 2)), + Error::::TooManyRequests, + ); + }) + } + + #[test] + fn fails_to_import_commitment_if_not_initialized() { + run_test(|| { + assert_noop!( + import_commitment(ChainBuilder::new(1).append_finalized_header().to_header()), + Error::::NotInitialized, + ); + }) + } + + #[test] + fn submit_commitment_works_with_long_chain_with_handoffs() { + run_test_with_initialize(3, || { + let chain = ChainBuilder::new(3) + .append_finalized_header() + .append_default_headers(16) // 2..17 + .append_finalized_header() // 18 + .append_default_headers(16) // 19..34 + .append_handoff_header(9) // 35 + .append_default_headers(8) // 36..43 + .append_finalized_header() // 44 + .append_default_headers(8) // 45..52 + .append_handoff_header(17) // 53 + .append_default_headers(4) // 54..57 + .append_finalized_header() // 58 + .append_default_headers(4); // 59..63 + import_header_chain(chain.to_chain()); + + assert_eq!( + ImportedCommitmentsInfo::::get().unwrap().best_block_number, + 58 + ); + assert_eq!(CurrentAuthoritySetInfo::::get().id, 2); + assert_eq!(CurrentAuthoritySetInfo::::get().len, 17); + + let imported_commitment = ImportedCommitments::::get(58).unwrap(); + assert_eq!( + imported_commitment, + bp_beefy::ImportedCommitment { + parent_number_and_hash: (57, chain.header(57).header.hash()), + mmr_root: chain.header(58).mmr_root, + }, + ); + }) + } + + #[test] + fn commitment_pruning_works() { + run_test_with_initialize(3, || { + let commitments_to_keep = >::CommitmentsToKeep::get(); + let commitments_to_import: Vec = ChainBuilder::new(3) + .append_finalized_headers(commitments_to_keep as usize + 2) + .to_chain(); + + // import exactly `CommitmentsToKeep` commitments + for index in 0..commitments_to_keep { + next_block(); + import_commitment(commitments_to_import[index as usize].clone()) + .expect("must succeed"); + assert_eq!( + ImportedCommitmentsInfo::::get().unwrap().next_block_number_index, + (index + 1) % commitments_to_keep + ); + } + + // ensure that all commitments are in the storage + assert_eq!( + ImportedCommitmentsInfo::::get().unwrap().best_block_number, + commitments_to_keep as TestBridgedBlockNumber + ); + assert_eq!( + ImportedCommitmentsInfo::::get().unwrap().next_block_number_index, + 0 + ); + for index in 0..commitments_to_keep { + assert!(ImportedCommitments::::get( + index as TestBridgedBlockNumber + 1 + ) + .is_some()); + assert_eq!( + ImportedBlockNumbers::::get(index), + Some(Into::into(index + 1)), + ); + } + + // import next commitment + next_block(); + import_commitment(commitments_to_import[commitments_to_keep as usize].clone()) + .expect("must succeed"); + assert_eq!( + ImportedCommitmentsInfo::::get().unwrap().next_block_number_index, + 1 + ); + assert!(ImportedCommitments::::get( + commitments_to_keep as TestBridgedBlockNumber + 1 + ) + .is_some()); + assert_eq!( + ImportedBlockNumbers::::get(0), + Some(Into::into(commitments_to_keep + 1)), + ); + // the side effect of the import is that the commitment#1 is pruned + assert!(ImportedCommitments::::get(1).is_none()); + + // import next commitment + next_block(); + import_commitment(commitments_to_import[commitments_to_keep as usize + 1].clone()) + .expect("must succeed"); + assert_eq!( + ImportedCommitmentsInfo::::get().unwrap().next_block_number_index, + 2 + ); + assert!(ImportedCommitments::::get( + commitments_to_keep as TestBridgedBlockNumber + 2 + ) + .is_some()); + assert_eq!( + ImportedBlockNumbers::::get(1), + Some(Into::into(commitments_to_keep + 2)), + ); + // the side effect of the import is that the commitment#2 is pruned + assert!(ImportedCommitments::::get(1).is_none()); + assert!(ImportedCommitments::::get(2).is_none()); + }); + } + + generate_owned_bridge_module_tests!(BasicOperatingMode::Normal, BasicOperatingMode::Halted); +} diff --git a/bridges/modules/beefy/src/mock.rs b/bridges/modules/beefy/src/mock.rs new file mode 100644 index 0000000000000000000000000000000000000000..c99566b6b06d1855319d614f4f4ddfbf2fb1918b --- /dev/null +++ b/bridges/modules/beefy/src/mock.rs @@ -0,0 +1,193 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +use crate as beefy; +use crate::{ + utils::get_authorities_mmr_root, BridgedBeefyAuthoritySet, BridgedBeefyAuthoritySetInfo, + BridgedBeefyCommitmentHasher, BridgedBeefyMmrLeafExtra, BridgedBeefySignedCommitment, + BridgedMmrHash, BridgedMmrHashing, BridgedMmrProof, +}; + +use bp_beefy::{BeefyValidatorSignatureOf, ChainWithBeefy, Commitment, MmrDataOrHash}; +use bp_runtime::{BasicOperatingMode, Chain, ChainId}; +use codec::Encode; +use frame_support::{construct_runtime, derive_impl, weights::Weight}; +use sp_core::{sr25519::Signature, Pair}; +use sp_runtime::{ + testing::{Header, H256}, + traits::{BlakeTwo256, Hash}, +}; + +pub use sp_consensus_beefy::ecdsa_crypto::{AuthorityId as BeefyId, Pair as BeefyPair}; +use sp_core::crypto::Wraps; +use sp_runtime::traits::Keccak256; + +pub type TestAccountId = u64; +pub type TestBridgedBlockNumber = u64; +pub type TestBridgedBlockHash = H256; +pub type TestBridgedHeader = Header; +pub type TestBridgedAuthoritySetInfo = BridgedBeefyAuthoritySetInfo; +pub type TestBridgedValidatorSet = BridgedBeefyAuthoritySet; +pub type TestBridgedCommitment = BridgedBeefySignedCommitment; +pub type TestBridgedValidatorSignature = BeefyValidatorSignatureOf; +pub type TestBridgedCommitmentHasher = BridgedBeefyCommitmentHasher; +pub type TestBridgedMmrHashing = BridgedMmrHashing; +pub type TestBridgedMmrHash = BridgedMmrHash; +pub type TestBridgedBeefyMmrLeafExtra = BridgedBeefyMmrLeafExtra; +pub type TestBridgedMmrProof = BridgedMmrProof; +pub type TestBridgedRawMmrLeaf = sp_consensus_beefy::mmr::MmrLeaf< + TestBridgedBlockNumber, + TestBridgedBlockHash, + TestBridgedMmrHash, + TestBridgedBeefyMmrLeafExtra, +>; +pub type TestBridgedMmrNode = MmrDataOrHash; + +type Block = frame_system::mocking::MockBlock; + +construct_runtime! { + pub enum TestRuntime + { + System: frame_system::{Pallet, Call, Config, Storage, Event}, + Beefy: beefy::{Pallet}, + } +} + +#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +impl frame_system::Config for TestRuntime { + type Block = Block; +} + +impl beefy::Config for TestRuntime { + type MaxRequests = frame_support::traits::ConstU32<16>; + type BridgedChain = TestBridgedChain; + type CommitmentsToKeep = frame_support::traits::ConstU32<16>; +} + +#[derive(Debug)] +pub struct TestBridgedChain; + +impl Chain for TestBridgedChain { + const ID: ChainId = *b"tbch"; + + type BlockNumber = TestBridgedBlockNumber; + type Hash = H256; + type Hasher = BlakeTwo256; + type Header = sp_runtime::testing::Header; + + type AccountId = TestAccountId; + type Balance = u64; + type Nonce = u64; + type Signature = Signature; + + fn max_extrinsic_size() -> u32 { + unreachable!() + } + fn max_extrinsic_weight() -> Weight { + unreachable!() + } +} + +impl ChainWithBeefy for TestBridgedChain { + type CommitmentHasher = Keccak256; + type MmrHashing = Keccak256; + type MmrHash = ::Output; + type BeefyMmrLeafExtra = (); + type AuthorityId = BeefyId; + type AuthorityIdToMerkleLeaf = pallet_beefy_mmr::BeefyEcdsaToEthereum; +} + +/// Run test within test runtime. +pub fn run_test(test: impl FnOnce() -> T) -> T { + sp_io::TestExternalities::new(Default::default()).execute_with(test) +} + +/// Initialize pallet and run test. +pub fn run_test_with_initialize(initial_validators_count: u32, test: impl FnOnce() -> T) -> T { + run_test(|| { + let validators = validator_ids(0, initial_validators_count); + let authority_set = authority_set_info(0, &validators); + + crate::Pallet::::initialize( + RuntimeOrigin::root(), + bp_beefy::InitializationData { + operating_mode: BasicOperatingMode::Normal, + best_block_number: 0, + authority_set, + }, + ) + .expect("initialization data is correct"); + + test() + }) +} + +/// Import given commitment. +pub fn import_commitment( + header: crate::mock_chain::HeaderAndCommitment, +) -> sp_runtime::DispatchResult { + crate::Pallet::::submit_commitment( + RuntimeOrigin::signed(1), + header + .commitment + .expect("thou shall not call import_commitment on header without commitment"), + header.validator_set, + Box::new(header.leaf), + header.leaf_proof, + ) +} + +pub fn validator_pairs(index: u32, count: u32) -> Vec { + (index..index + count) + .map(|index| { + let mut seed = [1u8; 32]; + seed[0..8].copy_from_slice(&(index as u64).encode()); + BeefyPair::from_seed(&seed) + }) + .collect() +} + +/// Return identifiers of validators, starting at given index. +pub fn validator_ids(index: u32, count: u32) -> Vec { + validator_pairs(index, count).into_iter().map(|pair| pair.public()).collect() +} + +pub fn authority_set_info(id: u64, validators: &[BeefyId]) -> TestBridgedAuthoritySetInfo { + let merkle_root = get_authorities_mmr_root::(validators.iter()); + + TestBridgedAuthoritySetInfo { id, len: validators.len() as u32, keyset_commitment: merkle_root } +} + +/// Sign BEEFY commitment. +pub fn sign_commitment( + commitment: Commitment, + validator_pairs: &[BeefyPair], + signature_count: usize, +) -> TestBridgedCommitment { + let total_validators = validator_pairs.len(); + let random_validators = + rand::seq::index::sample(&mut rand::thread_rng(), total_validators, signature_count); + + let commitment_hash = TestBridgedCommitmentHasher::hash(&commitment.encode()); + let mut signatures = vec![None; total_validators]; + for validator_idx in random_validators.iter() { + let validator = &validator_pairs[validator_idx]; + signatures[validator_idx] = + Some(validator.as_inner_ref().sign_prehashed(commitment_hash.as_fixed_bytes()).into()); + } + + TestBridgedCommitment { commitment, signatures } +} diff --git a/bridges/modules/beefy/src/mock_chain.rs b/bridges/modules/beefy/src/mock_chain.rs new file mode 100644 index 0000000000000000000000000000000000000000..c83907f8395684d03cc62892e519565fb72237f7 --- /dev/null +++ b/bridges/modules/beefy/src/mock_chain.rs @@ -0,0 +1,299 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Utilities to build bridged chain and BEEFY+MMR structures. + +use crate::{ + mock::{ + sign_commitment, validator_pairs, BeefyPair, TestBridgedBlockNumber, TestBridgedCommitment, + TestBridgedHeader, TestBridgedMmrHash, TestBridgedMmrHashing, TestBridgedMmrNode, + TestBridgedMmrProof, TestBridgedRawMmrLeaf, TestBridgedValidatorSet, + TestBridgedValidatorSignature, TestRuntime, + }, + utils::get_authorities_mmr_root, +}; + +use bp_beefy::{BeefyPayload, Commitment, ValidatorSetId, MMR_ROOT_PAYLOAD_ID}; +use codec::Encode; +use pallet_mmr::NodeIndex; +use rand::Rng; +use sp_consensus_beefy::mmr::{BeefyNextAuthoritySet, MmrLeafVersion}; +use sp_core::Pair; +use sp_runtime::traits::{Hash, Header as HeaderT}; +use std::collections::HashMap; + +#[derive(Debug, Clone)] +pub struct HeaderAndCommitment { + pub header: TestBridgedHeader, + pub commitment: Option, + pub validator_set: TestBridgedValidatorSet, + pub leaf: TestBridgedRawMmrLeaf, + pub leaf_proof: TestBridgedMmrProof, + pub mmr_root: TestBridgedMmrHash, +} + +impl HeaderAndCommitment { + pub fn customize_signatures( + &mut self, + f: impl FnOnce(&mut Vec>), + ) { + if let Some(commitment) = &mut self.commitment { + f(&mut commitment.signatures); + } + } + + pub fn customize_commitment( + &mut self, + f: impl FnOnce(&mut Commitment), + validator_pairs: &[BeefyPair], + signature_count: usize, + ) { + if let Some(mut commitment) = self.commitment.take() { + f(&mut commitment.commitment); + self.commitment = + Some(sign_commitment(commitment.commitment, validator_pairs, signature_count)); + } + } +} + +pub struct ChainBuilder { + headers: Vec, + validator_set_id: ValidatorSetId, + validator_keys: Vec, + mmr: mmr_lib::MMR, +} + +struct BridgedMmrStorage { + nodes: HashMap, +} + +impl mmr_lib::MMRStore for BridgedMmrStorage { + fn get_elem(&self, pos: NodeIndex) -> mmr_lib::Result> { + Ok(self.nodes.get(&pos).cloned()) + } + + fn append(&mut self, pos: NodeIndex, elems: Vec) -> mmr_lib::Result<()> { + for (i, elem) in elems.into_iter().enumerate() { + self.nodes.insert(pos + i as NodeIndex, elem); + } + Ok(()) + } +} + +impl ChainBuilder { + /// Creates new chain builder with given validator set size. + pub fn new(initial_validators_count: u32) -> Self { + ChainBuilder { + headers: Vec::new(), + validator_set_id: 0, + validator_keys: validator_pairs(0, initial_validators_count), + mmr: mmr_lib::MMR::new(0, BridgedMmrStorage { nodes: HashMap::new() }), + } + } + + /// Get header with given number. + pub fn header(&self, number: TestBridgedBlockNumber) -> HeaderAndCommitment { + self.headers[number as usize - 1].clone() + } + + /// Returns single built header. + pub fn to_header(&self) -> HeaderAndCommitment { + assert_eq!(self.headers.len(), 1); + self.headers[0].clone() + } + + /// Returns built chain. + pub fn to_chain(&self) -> Vec { + self.headers.clone() + } + + /// Appends header, that has been finalized by BEEFY (so it has a linked signed commitment). + pub fn append_finalized_header(self) -> Self { + let next_validator_set_id = self.validator_set_id; + let next_validator_keys = self.validator_keys.clone(); + HeaderBuilder::with_chain(self, next_validator_set_id, next_validator_keys).finalize() + } + + /// Append multiple finalized headers at once. + pub fn append_finalized_headers(mut self, count: usize) -> Self { + for _ in 0..count { + self = self.append_finalized_header(); + } + self + } + + /// Appends header, that enacts new validator set. + /// + /// Such headers are explicitly finalized by BEEFY. + pub fn append_handoff_header(self, next_validators_len: u32) -> Self { + let new_validator_set_id = self.validator_set_id + 1; + let new_validator_pairs = + validator_pairs(rand::thread_rng().gen::() % (u32::MAX / 2), next_validators_len); + + HeaderBuilder::with_chain(self, new_validator_set_id, new_validator_pairs).finalize() + } + + /// Append several default header without commitment. + pub fn append_default_headers(mut self, count: usize) -> Self { + for _ in 0..count { + let next_validator_set_id = self.validator_set_id; + let next_validator_keys = self.validator_keys.clone(); + self = + HeaderBuilder::with_chain(self, next_validator_set_id, next_validator_keys).build() + } + self + } +} + +/// Custom header builder. +pub struct HeaderBuilder { + chain: ChainBuilder, + header: TestBridgedHeader, + leaf: TestBridgedRawMmrLeaf, + leaf_proof: Option, + next_validator_set_id: ValidatorSetId, + next_validator_keys: Vec, +} + +impl HeaderBuilder { + fn with_chain( + chain: ChainBuilder, + next_validator_set_id: ValidatorSetId, + next_validator_keys: Vec, + ) -> Self { + // we're starting with header#1, since header#0 is always finalized + let header_number = chain.headers.len() as TestBridgedBlockNumber + 1; + let header = TestBridgedHeader::new( + header_number, + Default::default(), + Default::default(), + chain.headers.last().map(|h| h.header.hash()).unwrap_or_default(), + Default::default(), + ); + + let next_validators = + next_validator_keys.iter().map(|pair| pair.public()).collect::>(); + let next_validators_mmr_root = + get_authorities_mmr_root::(next_validators.iter()); + let leaf = sp_consensus_beefy::mmr::MmrLeaf { + version: MmrLeafVersion::new(1, 0), + parent_number_and_hash: (header.number().saturating_sub(1), *header.parent_hash()), + beefy_next_authority_set: BeefyNextAuthoritySet { + id: next_validator_set_id, + len: next_validators.len() as u32, + keyset_commitment: next_validators_mmr_root, + }, + leaf_extra: (), + }; + + HeaderBuilder { + chain, + header, + leaf, + leaf_proof: None, + next_validator_keys, + next_validator_set_id, + } + } + + /// Customize generated proof of header MMR leaf. + /// + /// Can only be called once. + pub fn customize_proof( + mut self, + f: impl FnOnce(TestBridgedMmrProof) -> TestBridgedMmrProof, + ) -> Self { + assert!(self.leaf_proof.is_none()); + + let leaf_hash = TestBridgedMmrHashing::hash(&self.leaf.encode()); + let node = TestBridgedMmrNode::Hash(leaf_hash); + let leaf_position = self.chain.mmr.push(node).unwrap(); + + let proof = self.chain.mmr.gen_proof(vec![leaf_position]).unwrap(); + // genesis has no leaf => leaf index is header number minus 1 + let leaf_index = *self.header.number() - 1; + let leaf_count = *self.header.number(); + self.leaf_proof = Some(f(TestBridgedMmrProof { + leaf_indices: vec![leaf_index], + leaf_count, + items: proof.proof_items().iter().map(|i| i.hash()).collect(), + })); + + self + } + + /// Build header without commitment. + pub fn build(mut self) -> ChainBuilder { + if self.leaf_proof.is_none() { + self = self.customize_proof(|proof| proof); + } + + let validators = + self.chain.validator_keys.iter().map(|pair| pair.public()).collect::>(); + self.chain.headers.push(HeaderAndCommitment { + header: self.header, + commitment: None, + validator_set: TestBridgedValidatorSet::new(validators, self.chain.validator_set_id) + .unwrap(), + leaf: self.leaf, + leaf_proof: self.leaf_proof.expect("guaranteed by the customize_proof call above; qed"), + mmr_root: self.chain.mmr.get_root().unwrap().hash(), + }); + + self.chain.validator_set_id = self.next_validator_set_id; + self.chain.validator_keys = self.next_validator_keys; + + self.chain + } + + /// Build header with commitment. + pub fn finalize(self) -> ChainBuilder { + let validator_count = self.chain.validator_keys.len(); + let current_validator_set_id = self.chain.validator_set_id; + let current_validator_set_keys = self.chain.validator_keys.clone(); + let mut chain = self.build(); + + let last_header = chain.headers.last_mut().expect("added by append_header; qed"); + last_header.commitment = Some(sign_commitment( + Commitment { + payload: BeefyPayload::from_single_entry( + MMR_ROOT_PAYLOAD_ID, + chain.mmr.get_root().unwrap().hash().encode(), + ), + block_number: *last_header.header.number(), + validator_set_id: current_validator_set_id, + }, + ¤t_validator_set_keys, + validator_count * 2 / 3 + 1, + )); + + chain + } +} + +/// Default Merging & Hashing behavior for MMR. +pub struct BridgedMmrHashMerge; + +impl mmr_lib::Merge for BridgedMmrHashMerge { + type Item = TestBridgedMmrNode; + + fn merge(left: &Self::Item, right: &Self::Item) -> mmr_lib::Result { + let mut concat = left.hash().as_ref().to_vec(); + concat.extend_from_slice(right.hash().as_ref()); + + Ok(TestBridgedMmrNode::Hash(TestBridgedMmrHashing::hash(&concat))) + } +} diff --git a/bridges/modules/beefy/src/utils.rs b/bridges/modules/beefy/src/utils.rs new file mode 100644 index 0000000000000000000000000000000000000000..ce7a116308d1626fd400e2ffa79e44828aea63f2 --- /dev/null +++ b/bridges/modules/beefy/src/utils.rs @@ -0,0 +1,361 @@ +use crate::{ + BridgedBeefyAuthorityId, BridgedBeefyAuthoritySet, BridgedBeefyAuthoritySetInfo, + BridgedBeefyMmrLeaf, BridgedBeefySignedCommitment, BridgedChain, BridgedMmrHash, + BridgedMmrHashing, BridgedMmrProof, Config, Error, LOG_TARGET, +}; +use bp_beefy::{merkle_root, verify_mmr_leaves_proof, BeefyAuthorityId, MmrDataOrHash}; +use codec::Encode; +use frame_support::ensure; +use sp_runtime::traits::{Convert, Hash}; +use sp_std::{vec, vec::Vec}; + +type BridgedMmrDataOrHash = MmrDataOrHash, BridgedBeefyMmrLeaf>; +/// A way to encode validator id to the BEEFY merkle tree leaf. +type BridgedBeefyAuthorityIdToMerkleLeaf = + bp_beefy::BeefyAuthorityIdToMerkleLeafOf>; + +/// Get the MMR root for a collection of validators. +pub(crate) fn get_authorities_mmr_root< + 'a, + T: Config, + I: 'static, + V: Iterator>, +>( + authorities: V, +) -> BridgedMmrHash { + let merkle_leafs = authorities + .cloned() + .map(BridgedBeefyAuthorityIdToMerkleLeaf::::convert) + .collect::>(); + merkle_root::, _>(merkle_leafs) +} + +fn verify_authority_set, I: 'static>( + authority_set_info: &BridgedBeefyAuthoritySetInfo, + authority_set: &BridgedBeefyAuthoritySet, +) -> Result<(), Error> { + ensure!(authority_set.id() == authority_set_info.id, Error::::InvalidValidatorSetId); + ensure!( + authority_set.len() == authority_set_info.len as usize, + Error::::InvalidValidatorSetLen + ); + + // Ensure that the authority set that signed the commitment is the expected one. + let root = get_authorities_mmr_root::(authority_set.validators().iter()); + ensure!(root == authority_set_info.keyset_commitment, Error::::InvalidValidatorSetRoot); + + Ok(()) +} + +/// Number of correct signatures, required from given validators set to accept signed +/// commitment. +/// +/// We're using 'conservative' approach here, where signatures of `2/3+1` validators are +/// required.. +pub(crate) fn signatures_required(validators_len: usize) -> usize { + validators_len - validators_len.saturating_sub(1) / 3 +} + +fn verify_signatures, I: 'static>( + commitment: &BridgedBeefySignedCommitment, + authority_set: &BridgedBeefyAuthoritySet, +) -> Result<(), Error> { + ensure!( + commitment.signatures.len() == authority_set.len(), + Error::::InvalidCommitmentSignaturesLen + ); + + // Ensure that the commitment was signed by enough authorities. + let msg = commitment.commitment.encode(); + let mut missing_signatures = signatures_required(authority_set.len()); + for (idx, (authority, maybe_sig)) in + authority_set.validators().iter().zip(commitment.signatures.iter()).enumerate() + { + if let Some(sig) = maybe_sig { + if authority.verify(sig, &msg) { + missing_signatures = missing_signatures.saturating_sub(1); + if missing_signatures == 0 { + break + } + } else { + log::debug!( + target: LOG_TARGET, + "Signed commitment contains incorrect signature of validator {} ({:?}): {:?}", + idx, + authority, + sig, + ); + } + } + } + ensure!(missing_signatures == 0, Error::::NotEnoughCorrectSignatures); + + Ok(()) +} + +/// Extract MMR root from commitment payload. +fn extract_mmr_root, I: 'static>( + commitment: &BridgedBeefySignedCommitment, +) -> Result, Error> { + commitment + .commitment + .payload + .get_decoded(&bp_beefy::MMR_ROOT_PAYLOAD_ID) + .ok_or(Error::MmrRootMissingFromCommitment) +} + +pub(crate) fn verify_commitment, I: 'static>( + commitment: &BridgedBeefySignedCommitment, + authority_set_info: &BridgedBeefyAuthoritySetInfo, + authority_set: &BridgedBeefyAuthoritySet, +) -> Result, Error> { + // Ensure that the commitment is signed by the best known BEEFY validator set. + ensure!( + commitment.commitment.validator_set_id == authority_set_info.id, + Error::::InvalidCommitmentValidatorSetId + ); + ensure!( + commitment.signatures.len() == authority_set_info.len as usize, + Error::::InvalidCommitmentSignaturesLen + ); + + verify_authority_set(authority_set_info, authority_set)?; + verify_signatures(commitment, authority_set)?; + + extract_mmr_root(commitment) +} + +/// Verify MMR proof of given leaf. +pub(crate) fn verify_beefy_mmr_leaf, I: 'static>( + mmr_leaf: &BridgedBeefyMmrLeaf, + mmr_proof: BridgedMmrProof, + mmr_root: BridgedMmrHash, +) -> Result<(), Error> { + let mmr_proof_leaf_count = mmr_proof.leaf_count; + let mmr_proof_length = mmr_proof.items.len(); + + // Verify the mmr proof for the provided leaf. + let mmr_leaf_hash = BridgedMmrHashing::::hash(&mmr_leaf.encode()); + verify_mmr_leaves_proof( + mmr_root, + vec![BridgedMmrDataOrHash::::Hash(mmr_leaf_hash)], + mmr_proof, + ) + .map_err(|e| { + log::error!( + target: LOG_TARGET, + "MMR proof of leaf {:?} (root: {:?}, leaf count: {}, len: {}) \ + verification has failed with error: {:?}", + mmr_leaf_hash, + mmr_root, + mmr_proof_leaf_count, + mmr_proof_length, + e, + ); + + Error::::MmrProofVerificationFailed + }) +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::{mock::*, mock_chain::*, *}; + use bp_beefy::{BeefyPayload, MMR_ROOT_PAYLOAD_ID}; + use frame_support::{assert_noop, assert_ok}; + use sp_consensus_beefy::ValidatorSet; + + #[test] + fn submit_commitment_checks_metadata() { + run_test_with_initialize(8, || { + // Fails if `commitment.commitment.validator_set_id` differs. + let mut header = ChainBuilder::new(8).append_finalized_header().to_header(); + header.customize_commitment( + |commitment| { + commitment.validator_set_id += 1; + }, + &validator_pairs(0, 8), + 6, + ); + assert_noop!( + import_commitment(header), + Error::::InvalidCommitmentValidatorSetId, + ); + + // Fails if `commitment.signatures.len()` differs. + let mut header = ChainBuilder::new(8).append_finalized_header().to_header(); + header.customize_signatures(|signatures| { + signatures.pop(); + }); + assert_noop!( + import_commitment(header), + Error::::InvalidCommitmentSignaturesLen, + ); + }); + } + + #[test] + fn submit_commitment_checks_validator_set() { + run_test_with_initialize(8, || { + // Fails if `ValidatorSet::id` differs. + let mut header = ChainBuilder::new(8).append_finalized_header().to_header(); + header.validator_set = ValidatorSet::new(validator_ids(0, 8), 1).unwrap(); + assert_noop!( + import_commitment(header), + Error::::InvalidValidatorSetId, + ); + + // Fails if `ValidatorSet::len()` differs. + let mut header = ChainBuilder::new(8).append_finalized_header().to_header(); + header.validator_set = ValidatorSet::new(validator_ids(0, 5), 0).unwrap(); + assert_noop!( + import_commitment(header), + Error::::InvalidValidatorSetLen, + ); + + // Fails if the validators differ. + let mut header = ChainBuilder::new(8).append_finalized_header().to_header(); + header.validator_set = ValidatorSet::new(validator_ids(3, 8), 0).unwrap(); + assert_noop!( + import_commitment(header), + Error::::InvalidValidatorSetRoot, + ); + }); + } + + #[test] + fn submit_commitment_checks_signatures() { + run_test_with_initialize(20, || { + // Fails when there aren't enough signatures. + let mut header = ChainBuilder::new(20).append_finalized_header().to_header(); + header.customize_signatures(|signatures| { + let first_signature_idx = signatures.iter().position(Option::is_some).unwrap(); + signatures[first_signature_idx] = None; + }); + assert_noop!( + import_commitment(header), + Error::::NotEnoughCorrectSignatures, + ); + + // Fails when there aren't enough correct signatures. + let mut header = ChainBuilder::new(20).append_finalized_header().to_header(); + header.customize_signatures(|signatures| { + let first_signature_idx = signatures.iter().position(Option::is_some).unwrap(); + let last_signature_idx = signatures.len() - + signatures.iter().rev().position(Option::is_some).unwrap() - + 1; + signatures[first_signature_idx] = signatures[last_signature_idx].clone(); + }); + assert_noop!( + import_commitment(header), + Error::::NotEnoughCorrectSignatures, + ); + + // Returns Ok(()) when there are enough signatures, even if some are incorrect. + let mut header = ChainBuilder::new(20).append_finalized_header().to_header(); + header.customize_signatures(|signatures| { + let first_signature_idx = signatures.iter().position(Option::is_some).unwrap(); + let first_missing_signature_idx = + signatures.iter().position(Option::is_none).unwrap(); + signatures[first_missing_signature_idx] = signatures[first_signature_idx].clone(); + }); + assert_ok!(import_commitment(header)); + }); + } + + #[test] + fn submit_commitment_checks_mmr_proof() { + run_test_with_initialize(1, || { + let validators = validator_pairs(0, 1); + + // Fails if leaf is not for parent. + let mut header = ChainBuilder::new(1).append_finalized_header().to_header(); + header.leaf.parent_number_and_hash.0 += 1; + assert_noop!( + import_commitment(header), + Error::::MmrProofVerificationFailed, + ); + + // Fails if mmr proof is incorrect. + let mut header = ChainBuilder::new(1).append_finalized_header().to_header(); + header.leaf_proof.leaf_indices[0] += 1; + assert_noop!( + import_commitment(header), + Error::::MmrProofVerificationFailed, + ); + + // Fails if mmr root is incorrect. + let mut header = ChainBuilder::new(1).append_finalized_header().to_header(); + // Replace MMR root with zeroes. + header.customize_commitment( + |commitment| { + commitment.payload = + BeefyPayload::from_single_entry(MMR_ROOT_PAYLOAD_ID, [0u8; 32].encode()); + }, + &validators, + 1, + ); + assert_noop!( + import_commitment(header), + Error::::MmrProofVerificationFailed, + ); + }); + } + + #[test] + fn submit_commitment_extracts_mmr_root() { + run_test_with_initialize(1, || { + let validators = validator_pairs(0, 1); + + // Fails if there is no mmr root in the payload. + let mut header = ChainBuilder::new(1).append_finalized_header().to_header(); + // Remove MMR root from the payload. + header.customize_commitment( + |commitment| { + commitment.payload = BeefyPayload::from_single_entry(*b"xy", vec![]); + }, + &validators, + 1, + ); + assert_noop!( + import_commitment(header), + Error::::MmrRootMissingFromCommitment, + ); + + // Fails if mmr root can't be decoded. + let mut header = ChainBuilder::new(1).append_finalized_header().to_header(); + // MMR root is a 32-byte array and we have replaced it with single byte + header.customize_commitment( + |commitment| { + commitment.payload = + BeefyPayload::from_single_entry(MMR_ROOT_PAYLOAD_ID, vec![42]); + }, + &validators, + 1, + ); + assert_noop!( + import_commitment(header), + Error::::MmrRootMissingFromCommitment, + ); + }); + } + + #[test] + fn submit_commitment_stores_valid_data() { + run_test_with_initialize(20, || { + let header = ChainBuilder::new(20).append_handoff_header(30).to_header(); + assert_ok!(import_commitment(header.clone())); + + assert_eq!(ImportedCommitmentsInfo::::get().unwrap().best_block_number, 1); + assert_eq!(CurrentAuthoritySetInfo::::get().id, 1); + assert_eq!(CurrentAuthoritySetInfo::::get().len, 30); + assert_eq!( + ImportedCommitments::::get(1).unwrap(), + bp_beefy::ImportedCommitment { + parent_number_and_hash: (0, [0; 32].into()), + mmr_root: header.mmr_root, + }, + ); + }); + } +} diff --git a/bridges/modules/grandpa/Cargo.toml b/bridges/modules/grandpa/Cargo.toml index 562a6e43e0271dadcf68f77f0a74bba887c862f5..0db1827211a05f715cd1aed0db93da0f52c9d67c 100644 --- a/bridges/modules/grandpa/Cargo.toml +++ b/bridges/modules/grandpa/Cargo.toml @@ -5,6 +5,7 @@ description = "Module implementing GRANDPA on-chain light client used for bridgi authors.workspace = true edition.workspace = true license = "GPL-3.0-or-later WITH Classpath-exception-2.0" +repository.workspace = true [lints] workspace = true @@ -12,10 +13,10 @@ workspace = true # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false } +codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false } finality-grandpa = { version = "0.16.2", default-features = false } -log = { version = "0.4.20", default-features = false } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +log = { workspace = true } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } # Bridge Dependencies diff --git a/bridges/modules/grandpa/README.md b/bridges/modules/grandpa/README.md index 27b4d2389c4085538362e6aea17303c44ef50795..4a3099b8afc654bfced296aaa0ead4a5d113eb7f 100644 --- a/bridges/modules/grandpa/README.md +++ b/bridges/modules/grandpa/README.md @@ -10,7 +10,7 @@ It is used by the parachains light client (bridge parachains pallet) and by mess ## A Brief Introduction into GRANDPA Finality You can find detailed information on GRANDPA, by exploring its [repository](https://github.com/paritytech/finality-grandpa). -Here is the minimal reqiuired GRANDPA information to understand how pallet works. +Here is the minimal required GRANDPA information to understand how pallet works. Any Substrate chain may use different block authorship algorithms (like BABE or Aura) to determine block producers and generate blocks. This has nothing common with finality, though - the task of block authorship is to coordinate @@ -27,7 +27,7 @@ for provided header. There are two main things in GRANDPA that help building light clients: - there's no need to import all headers of the bridged chain. Light client may import finalized headers or just - some of finalized headders that it consider useful. While the validators set stays the same, the client may + some of finalized headers that it consider useful. While the validators set stays the same, the client may import any header that is finalized by this set; - when validators set changes, the GRANDPA gadget adds next set to the header. So light client doesn't need to @@ -38,11 +38,11 @@ There are two main things in GRANDPA that help building light clients: ## Pallet Operations -The main entrypoint of the pallet is the `submit_finality_proof` call. It has two arguments - the finalized -headers and associated GRANDPA justification. The call simply verifies the justification using current -validators set and checks if header is better than the previous best header. If both checks are passed, the -header (only its useful fields) is inserted into the runtime storage and may be used by other pallets to verify -storage proofs. +The main entrypoint of the pallet is the `submit_finality_proof_ex` call. It has three arguments - the finalized +headers, associated GRANDPA justification and ID of the authority set that has generated this justification. The +call simply verifies the justification using current validators set and checks if header is better than the +previous best header. If both checks are passed, the header (only its useful fields) is inserted into the runtime +storage and may be used by other pallets to verify storage proofs. The submitter pays regular fee for submitting all headers, except for the mandatory header. Since it is required for the pallet operations, submitting such header is free. So if you're ok with session-length diff --git a/bridges/modules/grandpa/src/benchmarking.rs b/bridges/modules/grandpa/src/benchmarking.rs index 182b2f56eb1c57a165cf2eb1e86b585d70fd1801..11033373ce478fa9fefb613a1377449bb77daf1d 100644 --- a/bridges/modules/grandpa/src/benchmarking.rs +++ b/bridges/modules/grandpa/src/benchmarking.rs @@ -16,8 +16,9 @@ //! Benchmarks for the GRANDPA Pallet. //! -//! The main dispatchable for the GRANDPA pallet is `submit_finality_proof`, so these benchmarks are -//! based around that. There are to main factors which affect finality proof verification: +//! The main dispatchable for the GRANDPA pallet is `submit_finality_proof_ex`. Our benchmarks +//! are based around `submit_finality_proof`, though - from weight PoV they are the same calls. +//! There are to main factors which affect finality proof verification: //! //! 1. The number of `votes-ancestries` in the justification //! 2. The number of `pre-commits` in the justification diff --git a/bridges/modules/grandpa/src/call_ext.rs b/bridges/modules/grandpa/src/call_ext.rs index c1585020be13ca710178b59aefde4a0cde2ab87a..4a7ebb3cc8d42d7cb9d97d5c6990bb33658416bd 100644 --- a/bridges/modules/grandpa/src/call_ext.rs +++ b/bridges/modules/grandpa/src/call_ext.rs @@ -14,7 +14,10 @@ // You should have received a copy of the GNU General Public License // along with Parity Bridges Common. If not, see . -use crate::{weights::WeightInfo, BridgedBlockNumber, BridgedHeader, Config, Error, Pallet}; +use crate::{ + weights::WeightInfo, BridgedBlockNumber, BridgedHeader, Config, CurrentAuthoritySet, Error, + Pallet, +}; use bp_header_chain::{ justification::GrandpaJustification, max_expected_submit_finality_proof_arguments_size, ChainWithGrandpa, GrandpaConsensusLogReader, @@ -22,6 +25,7 @@ use bp_header_chain::{ use bp_runtime::{BlockNumberOf, OwnedBridgeModule}; use codec::Encode; use frame_support::{dispatch::CallableCallFor, traits::IsSubType, weights::Weight}; +use sp_consensus_grandpa::SetId; use sp_runtime::{ traits::{Header, Zero}, transaction_validity::{InvalidTransaction, TransactionValidity, ValidTransaction}, @@ -33,6 +37,9 @@ use sp_runtime::{ pub struct SubmitFinalityProofInfo { /// Number of the finality target. pub block_number: N, + /// An identifier of the validators set that has signed the submitted justification. + /// It might be `None` if deprecated version of the `submit_finality_proof` is used. + pub current_set_id: Option, /// Extra weight that we assume is included in the call. /// /// We have some assumptions about headers and justifications of the bridged chain. @@ -61,9 +68,11 @@ pub struct SubmitFinalityProofHelper, I: 'static> { impl, I: 'static> SubmitFinalityProofHelper { /// Check that the GRANDPA head provided by the `SubmitFinalityProof` is better than the best - /// one we know. + /// one we know. Additionally, checks if `current_set_id` matches the current authority set + /// id, if specified. pub fn check_obsolete( finality_target: BlockNumberOf, + current_set_id: Option, ) -> Result<(), Error> { let best_finalized = crate::BestFinalized::::get().ok_or_else(|| { log::trace!( @@ -85,6 +94,20 @@ impl, I: 'static> SubmitFinalityProofHelper { return Err(Error::::OldHeader) } + if let Some(current_set_id) = current_set_id { + let actual_set_id = >::get().set_id; + if current_set_id != actual_set_id { + log::trace!( + target: crate::LOG_TARGET, + "Cannot finalize header signed by unknown authority set: bundled {:?}, best {:?}", + current_set_id, + actual_set_id, + ); + + return Err(Error::::InvalidAuthoritySetId) + } + } + Ok(()) } @@ -111,6 +134,18 @@ pub trait CallSubType, I: 'static>: return Some(submit_finality_proof_info_from_args::( finality_target, justification, + None, + )) + } else if let Some(crate::Call::::submit_finality_proof_ex { + finality_target, + justification, + current_set_id, + }) = self.is_sub_type() + { + return Some(submit_finality_proof_info_from_args::( + finality_target, + justification, + Some(*current_set_id), )) } @@ -133,7 +168,10 @@ pub trait CallSubType, I: 'static>: return InvalidTransaction::Call.into() } - match SubmitFinalityProofHelper::::check_obsolete(finality_target.block_number) { + match SubmitFinalityProofHelper::::check_obsolete( + finality_target.block_number, + finality_target.current_set_id, + ) { Ok(_) => Ok(ValidTransaction::default()), Err(Error::::OldHeader) => InvalidTransaction::Stale.into(), Err(_) => InvalidTransaction::Call.into(), @@ -150,6 +188,7 @@ impl, I: 'static> CallSubType for T::RuntimeCall where pub(crate) fn submit_finality_proof_info_from_args, I: 'static>( finality_target: &BridgedHeader, justification: &GrandpaJustification>, + current_set_id: Option, ) -> SubmitFinalityProofInfo> { let block_number = *finality_target.number(); @@ -166,7 +205,7 @@ pub(crate) fn submit_finality_proof_info_from_args, I: 'static>( // as an extra weight. let votes_ancestries_len = justification.votes_ancestries.len().saturated_into(); let extra_weight = - if votes_ancestries_len > T::BridgedChain::REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY { + if votes_ancestries_len > T::BridgedChain::REASONABLE_HEADERS_IN_JUSTIFICATION_ANCESTRY { T::WeightInfo::submit_finality_proof(precommits_len, votes_ancestries_len) } else { Weight::zero() @@ -191,7 +230,7 @@ pub(crate) fn submit_finality_proof_info_from_args, I: 'static>( ); let extra_size = actual_call_size.saturating_sub(max_expected_call_size); - SubmitFinalityProofInfo { block_number, extra_weight, extra_size } + SubmitFinalityProofInfo { block_number, current_set_id, extra_weight, extra_size } } #[cfg(test)] @@ -199,20 +238,24 @@ mod tests { use crate::{ call_ext::CallSubType, mock::{run_test, test_header, RuntimeCall, TestBridgedChain, TestNumber, TestRuntime}, - BestFinalized, Config, PalletOperatingMode, WeightInfo, + BestFinalized, Config, CurrentAuthoritySet, PalletOperatingMode, StoredAuthoritySet, + SubmitFinalityProofInfo, WeightInfo, }; use bp_header_chain::ChainWithGrandpa; use bp_runtime::{BasicOperatingMode, HeaderId}; use bp_test_utils::{ make_default_justification, make_justification_for_header, JustificationGeneratorParams, + TEST_GRANDPA_SET_ID, }; use frame_support::weights::Weight; use sp_runtime::{testing::DigestItem, traits::Header as _, SaturatedConversion}; fn validate_block_submit(num: TestNumber) -> bool { - let bridge_grandpa_call = crate::Call::::submit_finality_proof { + let bridge_grandpa_call = crate::Call::::submit_finality_proof_ex { finality_target: Box::new(test_header(num)), justification: make_default_justification(&test_header(num)), + // not initialized => zero + current_set_id: 0, }; RuntimeCall::check_obsolete_submit_finality_proof(&RuntimeCall::Grandpa( bridge_grandpa_call, @@ -256,6 +299,18 @@ mod tests { }); } + #[test] + fn extension_rejects_new_header_if_set_id_is_invalid() { + run_test(|| { + // when set id is different from the passed one => tx is rejected + sync_to_header_10(); + let next_set = StoredAuthoritySet::::try_new(vec![], 0x42).unwrap(); + CurrentAuthoritySet::::put(next_set); + + assert!(!validate_block_submit(15)); + }); + } + #[test] fn extension_accepts_new_header() { run_test(|| { @@ -266,6 +321,42 @@ mod tests { }); } + #[test] + fn submit_finality_proof_info_is_parsed() { + // when `submit_finality_proof` is used, `current_set_id` is set to `None` + let deprecated_call = + RuntimeCall::Grandpa(crate::Call::::submit_finality_proof { + finality_target: Box::new(test_header(42)), + justification: make_default_justification(&test_header(42)), + }); + assert_eq!( + deprecated_call.submit_finality_proof_info(), + Some(SubmitFinalityProofInfo { + block_number: 42, + current_set_id: None, + extra_weight: Weight::zero(), + extra_size: 0, + }) + ); + + // when `submit_finality_proof_ex` is used, `current_set_id` is set to `Some` + let deprecated_call = + RuntimeCall::Grandpa(crate::Call::::submit_finality_proof_ex { + finality_target: Box::new(test_header(42)), + justification: make_default_justification(&test_header(42)), + current_set_id: 777, + }); + assert_eq!( + deprecated_call.submit_finality_proof_info(), + Some(SubmitFinalityProofInfo { + block_number: 42, + current_set_id: Some(777), + extra_weight: Weight::zero(), + extra_size: 0, + }) + ); + } + #[test] fn extension_returns_correct_extra_size_if_call_arguments_are_too_large() { // when call arguments are below our limit => no refund @@ -275,9 +366,10 @@ mod tests { ..Default::default() }; let small_justification = make_justification_for_header(justification_params); - let small_call = RuntimeCall::Grandpa(crate::Call::submit_finality_proof { + let small_call = RuntimeCall::Grandpa(crate::Call::submit_finality_proof_ex { finality_target: Box::new(small_finality_target), justification: small_justification, + current_set_id: TEST_GRANDPA_SET_ID, }); assert_eq!(small_call.submit_finality_proof_info().unwrap().extra_size, 0); @@ -291,9 +383,10 @@ mod tests { ..Default::default() }; let large_justification = make_justification_for_header(justification_params); - let large_call = RuntimeCall::Grandpa(crate::Call::submit_finality_proof { + let large_call = RuntimeCall::Grandpa(crate::Call::submit_finality_proof_ex { finality_target: Box::new(large_finality_target), justification: large_justification, + current_set_id: TEST_GRANDPA_SET_ID, }); assert_ne!(large_call.submit_finality_proof_info().unwrap().extra_size, 0); } @@ -303,28 +396,30 @@ mod tests { let finality_target = test_header(1); let mut justification_params = JustificationGeneratorParams { header: finality_target.clone(), - ancestors: TestBridgedChain::REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY, + ancestors: TestBridgedChain::REASONABLE_HEADERS_IN_JUSTIFICATION_ANCESTRY, ..Default::default() }; - // when there are `REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY` headers => no refund + // when there are `REASONABLE_HEADERS_IN_JUSTIFICATION_ANCESTRY` headers => no refund let justification = make_justification_for_header(justification_params.clone()); - let call = RuntimeCall::Grandpa(crate::Call::submit_finality_proof { + let call = RuntimeCall::Grandpa(crate::Call::submit_finality_proof_ex { finality_target: Box::new(finality_target.clone()), justification, + current_set_id: TEST_GRANDPA_SET_ID, }); assert_eq!(call.submit_finality_proof_info().unwrap().extra_weight, Weight::zero()); - // when there are `REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY + 1` headers => full refund + // when there are `REASONABLE_HEADERS_IN_JUSTIFICATION_ANCESTRY + 1` headers => full refund justification_params.ancestors += 1; let justification = make_justification_for_header(justification_params); let call_weight = ::WeightInfo::submit_finality_proof( justification.commit.precommits.len().saturated_into(), justification.votes_ancestries.len().saturated_into(), ); - let call = RuntimeCall::Grandpa(crate::Call::submit_finality_proof { + let call = RuntimeCall::Grandpa(crate::Call::submit_finality_proof_ex { finality_target: Box::new(finality_target), justification, + current_set_id: TEST_GRANDPA_SET_ID, }); assert_eq!(call.submit_finality_proof_info().unwrap().extra_weight, call_weight); } diff --git a/bridges/modules/grandpa/src/lib.rs b/bridges/modules/grandpa/src/lib.rs index f58db2481ada11e29e3cfe40315d95f468aa82cf..9e095651ef81da1e5418d7532ae56ae0fb8ef564 100644 --- a/bridges/modules/grandpa/src/lib.rs +++ b/bridges/modules/grandpa/src/lib.rs @@ -151,7 +151,86 @@ pub mod pallet { #[pallet::call] impl, I: 'static> Pallet { - /// Verify a target header is finalized according to the given finality proof. + /// This call is deprecated and will be removed around May 2024. Use the + /// `submit_finality_proof_ex` instead. Semantically, this call is an equivalent of the + /// `submit_finality_proof_ex` call without current authority set id check. + #[pallet::call_index(0)] + #[pallet::weight(::submit_finality_proof( + justification.commit.precommits.len().saturated_into(), + justification.votes_ancestries.len().saturated_into(), + ))] + #[allow(deprecated)] + #[deprecated( + note = "`submit_finality_proof` will be removed in May 2024. Use `submit_finality_proof_ex` instead." + )] + pub fn submit_finality_proof( + origin: OriginFor, + finality_target: Box>, + justification: GrandpaJustification>, + ) -> DispatchResultWithPostInfo { + Self::submit_finality_proof_ex( + origin, + finality_target, + justification, + // the `submit_finality_proof_ex` also reads this value, but it is done from the + // cache, so we don't treat it as an additional db access + >::get().set_id, + ) + } + + /// Bootstrap the bridge pallet with an initial header and authority set from which to sync. + /// + /// The initial configuration provided does not need to be the genesis header of the bridged + /// chain, it can be any arbitrary header. You can also provide the next scheduled set + /// change if it is already know. + /// + /// This function is only allowed to be called from a trusted origin and writes to storage + /// with practically no checks in terms of the validity of the data. It is important that + /// you ensure that valid data is being passed in. + #[pallet::call_index(1)] + #[pallet::weight((T::DbWeight::get().reads_writes(2, 5), DispatchClass::Operational))] + pub fn initialize( + origin: OriginFor, + init_data: super::InitializationData>, + ) -> DispatchResultWithPostInfo { + Self::ensure_owner_or_root(origin)?; + + let init_allowed = !>::exists(); + ensure!(init_allowed, >::AlreadyInitialized); + initialize_bridge::(init_data.clone())?; + + log::info!( + target: LOG_TARGET, + "Pallet has been initialized with the following parameters: {:?}", + init_data + ); + + Ok(().into()) + } + + /// Change `PalletOwner`. + /// + /// May only be called either by root, or by `PalletOwner`. + #[pallet::call_index(2)] + #[pallet::weight((T::DbWeight::get().reads_writes(1, 1), DispatchClass::Operational))] + pub fn set_owner(origin: OriginFor, new_owner: Option) -> DispatchResult { + >::set_owner(origin, new_owner) + } + + /// Halt or resume all pallet operations. + /// + /// May only be called either by root, or by `PalletOwner`. + #[pallet::call_index(3)] + #[pallet::weight((T::DbWeight::get().reads_writes(1, 1), DispatchClass::Operational))] + pub fn set_operating_mode( + origin: OriginFor, + operating_mode: BasicOperatingMode, + ) -> DispatchResult { + >::set_operating_mode(origin, operating_mode) + } + + /// Verify a target header is finalized according to the given finality proof. The proof + /// is assumed to be signed by GRANDPA authorities set with `current_set_id` id. /// /// It will use the underlying storage pallet to fetch information about the current /// authorities and best finalized header in order to verify that the header is finalized. @@ -165,18 +244,22 @@ pub mod pallet { /// /// - the pallet knows better header than the `finality_target`; /// + /// - the id of best GRANDPA authority set, known to the pallet is not equal to the + /// `current_set_id`; + /// /// - verification is not optimized or invalid; /// /// - header contains forced authorities set change or change with non-zero delay. - #[pallet::call_index(0)] + #[pallet::call_index(4)] #[pallet::weight(::submit_finality_proof( justification.commit.precommits.len().saturated_into(), justification.votes_ancestries.len().saturated_into(), ))] - pub fn submit_finality_proof( + pub fn submit_finality_proof_ex( origin: OriginFor, finality_target: Box>, justification: GrandpaJustification>, + current_set_id: sp_consensus_grandpa::SetId, ) -> DispatchResultWithPostInfo { Self::ensure_not_halted().map_err(Error::::BridgeModule)?; ensure_signed(origin)?; @@ -188,7 +271,9 @@ pub mod pallet { finality_target ); - SubmitFinalityProofHelper::::check_obsolete(number)?; + // it checks whether the `number` is better than the current best block number + // and whether the `current_set_id` matches the best known set id + SubmitFinalityProofHelper::::check_obsolete(number, Some(current_set_id))?; let authority_set = >::get(); let unused_proof_size = authority_set.unused_proof_size(); @@ -202,7 +287,7 @@ pub mod pallet { // if we have seen too many mandatory headers in this block, we don't want to refund Self::free_mandatory_headers_remaining() > 0 && // if arguments out of expected bounds, we don't want to refund - submit_finality_proof_info_from_args::(&finality_target, &justification) + submit_finality_proof_info_from_args::(&finality_target, &justification, Some(current_set_id)) .fits_limits(); if may_refund_call_fee { FreeMandatoryHeadersRemaining::::mutate(|count| { @@ -248,57 +333,6 @@ pub mod pallet { Ok(PostDispatchInfo { actual_weight: Some(actual_weight), pays_fee }) } - - /// Bootstrap the bridge pallet with an initial header and authority set from which to sync. - /// - /// The initial configuration provided does not need to be the genesis header of the bridged - /// chain, it can be any arbitrary header. You can also provide the next scheduled set - /// change if it is already know. - /// - /// This function is only allowed to be called from a trusted origin and writes to storage - /// with practically no checks in terms of the validity of the data. It is important that - /// you ensure that valid data is being passed in. - #[pallet::call_index(1)] - #[pallet::weight((T::DbWeight::get().reads_writes(2, 5), DispatchClass::Operational))] - pub fn initialize( - origin: OriginFor, - init_data: super::InitializationData>, - ) -> DispatchResultWithPostInfo { - Self::ensure_owner_or_root(origin)?; - - let init_allowed = !>::exists(); - ensure!(init_allowed, >::AlreadyInitialized); - initialize_bridge::(init_data.clone())?; - - log::info!( - target: LOG_TARGET, - "Pallet has been initialized with the following parameters: {:?}", - init_data - ); - - Ok(().into()) - } - - /// Change `PalletOwner`. - /// - /// May only be called either by root, or by `PalletOwner`. - #[pallet::call_index(2)] - #[pallet::weight((T::DbWeight::get().reads_writes(1, 1), DispatchClass::Operational))] - pub fn set_owner(origin: OriginFor, new_owner: Option) -> DispatchResult { - >::set_owner(origin, new_owner) - } - - /// Halt or resume all pallet operations. - /// - /// May only be called either by root, or by `PalletOwner`. - #[pallet::call_index(3)] - #[pallet::weight((T::DbWeight::get().reads_writes(1, 1), DispatchClass::Operational))] - pub fn set_operating_mode( - origin: OriginFor, - operating_mode: BasicOperatingMode, - ) -> DispatchResult { - >::set_operating_mode(origin, operating_mode) - } } /// Number mandatory headers that we may accept in the current block for free (returning @@ -436,6 +470,9 @@ pub mod pallet { TooManyAuthoritiesInSet, /// Error generated by the `OwnedBridgeModule` trait. BridgeModule(bp_runtime::OwnedBridgeModuleError), + /// The `current_set_id` argument of the `submit_finality_proof_ex` doesn't match + /// the id of the current set, known to the pallet. + InvalidAuthoritySetId, } /// Check the given header for a GRANDPA scheduled authority set change. If a change @@ -663,6 +700,7 @@ mod tests { use bp_test_utils::{ authority_list, generate_owned_bridge_module_tests, make_default_justification, make_justification_for_header, JustificationGeneratorParams, ALICE, BOB, + TEST_GRANDPA_SET_ID, }; use codec::Encode; use frame_support::{ @@ -693,7 +731,7 @@ mod tests { let init_data = InitializationData { header: Box::new(genesis), authority_list: authority_list(), - set_id: 1, + set_id: TEST_GRANDPA_SET_ID, operating_mode: BasicOperatingMode::Normal, }; @@ -704,10 +742,11 @@ mod tests { let header = test_header(header.into()); let justification = make_default_justification(&header); - Pallet::::submit_finality_proof( + Pallet::::submit_finality_proof_ex( RuntimeOrigin::signed(1), Box::new(header), justification, + TEST_GRANDPA_SET_ID, ) } @@ -722,10 +761,11 @@ mod tests { ..Default::default() }); - Pallet::::submit_finality_proof( + Pallet::::submit_finality_proof_ex( RuntimeOrigin::signed(1), Box::new(header), justification, + set_id, ) } @@ -749,10 +789,11 @@ mod tests { ..Default::default() }); - Pallet::::submit_finality_proof( + Pallet::::submit_finality_proof_ex( RuntimeOrigin::signed(1), Box::new(header), justification, + set_id, ) } @@ -894,7 +935,7 @@ mod tests { } #[test] - fn succesfully_imports_header_with_valid_finality() { + fn successfully_imports_header_with_valid_finality() { run_test(|| { initialize_substrate_bridge(); @@ -955,17 +996,30 @@ mod tests { let header = test_header(1); - let params = - JustificationGeneratorParams:: { set_id: 2, ..Default::default() }; + let next_set_id = 2; + let params = JustificationGeneratorParams:: { + set_id: next_set_id, + ..Default::default() + }; let justification = make_justification_for_header(params); assert_err!( - Pallet::::submit_finality_proof( + Pallet::::submit_finality_proof_ex( + RuntimeOrigin::signed(1), + Box::new(header.clone()), + justification.clone(), + TEST_GRANDPA_SET_ID, + ), + >::InvalidJustification + ); + assert_err!( + Pallet::::submit_finality_proof_ex( RuntimeOrigin::signed(1), Box::new(header), justification, + next_set_id, ), - >::InvalidJustification + >::InvalidAuthoritySetId ); }) } @@ -980,10 +1034,11 @@ mod tests { justification.round = 42; assert_err!( - Pallet::::submit_finality_proof( + Pallet::::submit_finality_proof_ex( RuntimeOrigin::signed(1), Box::new(header), justification, + TEST_GRANDPA_SET_ID, ), >::InvalidJustification ); @@ -1009,10 +1064,11 @@ mod tests { let justification = make_default_justification(&header); assert_err!( - Pallet::::submit_finality_proof( + Pallet::::submit_finality_proof_ex( RuntimeOrigin::signed(1), Box::new(header), justification, + TEST_GRANDPA_SET_ID, ), >::InvalidAuthoritySet ); @@ -1047,10 +1103,11 @@ mod tests { let justification = make_default_justification(&header); // Let's import our test header - let result = Pallet::::submit_finality_proof( + let result = Pallet::::submit_finality_proof_ex( RuntimeOrigin::signed(1), Box::new(header.clone()), justification.clone(), + TEST_GRANDPA_SET_ID, ); assert_ok!(result); assert_eq!(result.unwrap().pays_fee, frame_support::dispatch::Pays::No); @@ -1109,10 +1166,11 @@ mod tests { // without large digest item ^^^ the relayer would have paid zero transaction fee // (`Pays::No`) - let result = Pallet::::submit_finality_proof( + let result = Pallet::::submit_finality_proof_ex( RuntimeOrigin::signed(1), Box::new(header.clone()), justification, + TEST_GRANDPA_SET_ID, ); assert_ok!(result); assert_eq!(result.unwrap().pays_fee, frame_support::dispatch::Pays::Yes); @@ -1134,16 +1192,17 @@ mod tests { header.digest = change_log(0); let justification = make_justification_for_header(JustificationGeneratorParams { header: header.clone(), - ancestors: TestBridgedChain::REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY + 1, + ancestors: TestBridgedChain::REASONABLE_HEADERS_IN_JUSTIFICATION_ANCESTRY + 1, ..Default::default() }); // without many headers in votes ancestries ^^^ the relayer would have paid zero // transaction fee (`Pays::No`) - let result = Pallet::::submit_finality_proof( + let result = Pallet::::submit_finality_proof_ex( RuntimeOrigin::signed(1), Box::new(header.clone()), justification, + TEST_GRANDPA_SET_ID, ); assert_ok!(result); assert_eq!(result.unwrap().pays_fee, frame_support::dispatch::Pays::Yes); @@ -1169,10 +1228,11 @@ mod tests { // Should not be allowed to import this header assert_err!( - Pallet::::submit_finality_proof( + Pallet::::submit_finality_proof_ex( RuntimeOrigin::signed(1), Box::new(header), - justification + justification, + TEST_GRANDPA_SET_ID, ), >::UnsupportedScheduledChange ); @@ -1194,10 +1254,11 @@ mod tests { // Should not be allowed to import this header assert_err!( - Pallet::::submit_finality_proof( + Pallet::::submit_finality_proof_ex( RuntimeOrigin::signed(1), Box::new(header), - justification + justification, + TEST_GRANDPA_SET_ID, ), >::UnsupportedScheduledChange ); @@ -1219,10 +1280,11 @@ mod tests { // Should not be allowed to import this header assert_err!( - Pallet::::submit_finality_proof( + Pallet::::submit_finality_proof_ex( RuntimeOrigin::signed(1), Box::new(header), - justification + justification, + TEST_GRANDPA_SET_ID, ), >::TooManyAuthoritiesInSet ); @@ -1283,10 +1345,11 @@ mod tests { let mut invalid_justification = make_default_justification(&header); invalid_justification.round = 42; - Pallet::::submit_finality_proof( + Pallet::::submit_finality_proof_ex( RuntimeOrigin::signed(1), Box::new(header), invalid_justification, + TEST_GRANDPA_SET_ID, ) }; @@ -1451,10 +1514,11 @@ mod tests { let justification = make_default_justification(&header); assert_noop!( - Pallet::::submit_finality_proof( + Pallet::::submit_finality_proof_ex( RuntimeOrigin::root(), Box::new(header), justification, + TEST_GRANDPA_SET_ID, ), DispatchError::BadOrigin, ); diff --git a/bridges/modules/grandpa/src/mock.rs b/bridges/modules/grandpa/src/mock.rs index e41e89341b312eb252bddce6e918e8367a5ce27f..e689e520c92ffcb230a83f7a728722a688729417 100644 --- a/bridges/modules/grandpa/src/mock.rs +++ b/bridges/modules/grandpa/src/mock.rs @@ -42,7 +42,7 @@ construct_runtime! { } } -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for TestRuntime { type Block = Block; } @@ -87,7 +87,7 @@ impl Chain for TestBridgedChain { impl ChainWithGrandpa for TestBridgedChain { const WITH_CHAIN_GRANDPA_PALLET_NAME: &'static str = ""; const MAX_AUTHORITIES_COUNT: u32 = MAX_BRIDGED_AUTHORITIES; - const REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY: u32 = 8; + const REASONABLE_HEADERS_IN_JUSTIFICATION_ANCESTRY: u32 = 8; const MAX_MANDATORY_HEADER_SIZE: u32 = 256; const AVERAGE_HEADER_SIZE: u32 = 64; } diff --git a/bridges/modules/messages/Cargo.toml b/bridges/modules/messages/Cargo.toml index 224aad7b36a2fd217fa910bbb49ed4474046b30e..df5b92db7402bd048b1afca9c13cfb1dddc74863 100644 --- a/bridges/modules/messages/Cargo.toml +++ b/bridges/modules/messages/Cargo.toml @@ -5,15 +5,16 @@ version = "0.7.0" authors.workspace = true edition.workspace = true license = "GPL-3.0-or-later WITH Classpath-exception-2.0" +repository.workspace = true [lints] workspace = true [dependencies] -codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false } -log = { version = "0.4.20", default-features = false } +codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false } +log = { workspace = true } num-traits = { version = "0.2", default-features = false } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } # Bridge dependencies diff --git a/bridges/modules/messages/src/inbound_lane.rs b/bridges/modules/messages/src/inbound_lane.rs index 966ec939e70e22e830ee30157d2d7da74d59733c..da1698e6e0370f9f84ca8dd53bc1ebc99f696017 100644 --- a/bridges/modules/messages/src/inbound_lane.rs +++ b/bridges/modules/messages/src/inbound_lane.rs @@ -21,7 +21,7 @@ use crate::Config; use bp_messages::{ target_chain::{DispatchMessage, DispatchMessageData, MessageDispatch}, DeliveredMessages, InboundLaneData, LaneId, MessageKey, MessageNonce, OutboundLaneData, - ReceivalResult, UnrewardedRelayer, + ReceptionResult, UnrewardedRelayer, }; use codec::{Decode, Encode, EncodeLike, MaxEncodedLen}; use frame_support::traits::Get; @@ -170,21 +170,21 @@ impl InboundLane { relayer_at_bridged_chain: &S::Relayer, nonce: MessageNonce, message_data: DispatchMessageData, - ) -> ReceivalResult { + ) -> ReceptionResult { let mut data = self.storage.get_or_init_data(); if Some(nonce) != data.last_delivered_nonce().checked_add(1) { - return ReceivalResult::InvalidNonce + return ReceptionResult::InvalidNonce } // if there are more unrewarded relayer entries than we may accept, reject this message if data.relayers.len() as MessageNonce >= self.storage.max_unrewarded_relayer_entries() { - return ReceivalResult::TooManyUnrewardedRelayers + return ReceptionResult::TooManyUnrewardedRelayers } // if there are more unconfirmed messages than we may accept, reject this message let unconfirmed_messages_count = nonce.saturating_sub(data.last_confirmed_nonce); if unconfirmed_messages_count > self.storage.max_unconfirmed_messages() { - return ReceivalResult::TooManyUnconfirmedMessages + return ReceptionResult::TooManyUnconfirmedMessages } // then, dispatch message @@ -207,7 +207,7 @@ impl InboundLane { }; self.storage.set_data(data); - ReceivalResult::Dispatched(dispatch_result) + ReceptionResult::Dispatched(dispatch_result) } } @@ -235,7 +235,7 @@ mod tests { nonce, inbound_message_data(REGULAR_PAYLOAD) ), - ReceivalResult::Dispatched(dispatch_result(0)) + ReceptionResult::Dispatched(dispatch_result(0)) ); } @@ -362,7 +362,7 @@ mod tests { 10, inbound_message_data(REGULAR_PAYLOAD) ), - ReceivalResult::InvalidNonce + ReceptionResult::InvalidNonce ); assert_eq!(lane.storage.get_or_init_data().last_delivered_nonce(), 0); }); @@ -381,7 +381,7 @@ mod tests { current_nonce, inbound_message_data(REGULAR_PAYLOAD) ), - ReceivalResult::Dispatched(dispatch_result(0)) + ReceptionResult::Dispatched(dispatch_result(0)) ); } // Fails to dispatch new message from different than latest relayer. @@ -391,7 +391,7 @@ mod tests { max_nonce + 1, inbound_message_data(REGULAR_PAYLOAD) ), - ReceivalResult::TooManyUnrewardedRelayers, + ReceptionResult::TooManyUnrewardedRelayers, ); // Fails to dispatch new messages from latest relayer. Prevents griefing attacks. assert_eq!( @@ -400,7 +400,7 @@ mod tests { max_nonce + 1, inbound_message_data(REGULAR_PAYLOAD) ), - ReceivalResult::TooManyUnrewardedRelayers, + ReceptionResult::TooManyUnrewardedRelayers, ); }); } @@ -417,7 +417,7 @@ mod tests { current_nonce, inbound_message_data(REGULAR_PAYLOAD) ), - ReceivalResult::Dispatched(dispatch_result(0)) + ReceptionResult::Dispatched(dispatch_result(0)) ); } // Fails to dispatch new message from different than latest relayer. @@ -427,7 +427,7 @@ mod tests { max_nonce + 1, inbound_message_data(REGULAR_PAYLOAD) ), - ReceivalResult::TooManyUnconfirmedMessages, + ReceptionResult::TooManyUnconfirmedMessages, ); // Fails to dispatch new messages from latest relayer. assert_eq!( @@ -436,7 +436,7 @@ mod tests { max_nonce + 1, inbound_message_data(REGULAR_PAYLOAD) ), - ReceivalResult::TooManyUnconfirmedMessages, + ReceptionResult::TooManyUnconfirmedMessages, ); }); } @@ -451,7 +451,7 @@ mod tests { 1, inbound_message_data(REGULAR_PAYLOAD) ), - ReceivalResult::Dispatched(dispatch_result(0)) + ReceptionResult::Dispatched(dispatch_result(0)) ); assert_eq!( lane.receive_message::( @@ -459,7 +459,7 @@ mod tests { 2, inbound_message_data(REGULAR_PAYLOAD) ), - ReceivalResult::Dispatched(dispatch_result(0)) + ReceptionResult::Dispatched(dispatch_result(0)) ); assert_eq!( lane.receive_message::( @@ -467,7 +467,7 @@ mod tests { 3, inbound_message_data(REGULAR_PAYLOAD) ), - ReceivalResult::Dispatched(dispatch_result(0)) + ReceptionResult::Dispatched(dispatch_result(0)) ); assert_eq!( lane.storage.get_or_init_data().relayers, @@ -490,7 +490,7 @@ mod tests { 1, inbound_message_data(REGULAR_PAYLOAD) ), - ReceivalResult::Dispatched(dispatch_result(0)) + ReceptionResult::Dispatched(dispatch_result(0)) ); assert_eq!( lane.receive_message::( @@ -498,7 +498,7 @@ mod tests { 1, inbound_message_data(REGULAR_PAYLOAD) ), - ReceivalResult::InvalidNonce, + ReceptionResult::InvalidNonce, ); }); } @@ -524,7 +524,7 @@ mod tests { 1, inbound_message_data(payload) ), - ReceivalResult::Dispatched(dispatch_result(1)) + ReceptionResult::Dispatched(dispatch_result(1)) ); }); } diff --git a/bridges/modules/messages/src/lib.rs b/bridges/modules/messages/src/lib.rs index a86cb326cf0404512b7fe6ad0aa2a696ff7d0a47..bc00db9eba5ba12dbdaa0de7008f293a727a7ef5 100644 --- a/bridges/modules/messages/src/lib.rs +++ b/bridges/modules/messages/src/lib.rs @@ -47,7 +47,7 @@ pub use weights_ext::{ use crate::{ inbound_lane::{InboundLane, InboundLaneStorage}, - outbound_lane::{OutboundLane, OutboundLaneStorage, ReceivalConfirmationError}, + outbound_lane::{OutboundLane, OutboundLaneStorage, ReceptionConfirmationError}, }; use bp_messages::{ @@ -90,7 +90,7 @@ pub const LOG_TARGET: &str = "runtime::bridge-messages"; #[frame_support::pallet] pub mod pallet { use super::*; - use bp_messages::{ReceivalResult, ReceivedMessages}; + use bp_messages::{ReceivedMessages, ReceptionResult}; use bp_runtime::RangeInclusiveExt; use frame_support::pallet_prelude::*; use frame_system::pallet_prelude::*; @@ -376,13 +376,13 @@ pub mod pallet { // delivery transaction cost anyway. And base cost covers everything except // dispatch, so we have a balance here. let unspent_weight = match &receival_result { - ReceivalResult::Dispatched(dispatch_result) => { + ReceptionResult::Dispatched(dispatch_result) => { valid_messages += 1; dispatch_result.unspent_weight }, - ReceivalResult::InvalidNonce | - ReceivalResult::TooManyUnrewardedRelayers | - ReceivalResult::TooManyUnconfirmedMessages => message_dispatch_weight, + ReceptionResult::InvalidNonce | + ReceptionResult::TooManyUnrewardedRelayers | + ReceptionResult::TooManyUnconfirmedMessages => message_dispatch_weight, }; lane_messages_received_status.push(message.key.nonce, receival_result); @@ -455,7 +455,7 @@ pub mod pallet { last_delivered_nonce, &lane_data.relayers, ) - .map_err(Error::::ReceivalConfirmation)?; + .map_err(Error::::ReceptionConfirmation)?; if let Some(confirmed_messages) = confirmed_messages { // emit 'delivered' event @@ -563,7 +563,7 @@ pub mod pallet { /// The message someone is trying to work with (i.e. increase fee) is not yet sent. MessageIsNotYetSent, /// Error confirming messages receival. - ReceivalConfirmation(ReceivalConfirmationError), + ReceptionConfirmation(ReceptionConfirmationError), /// Error generated by the `OwnedBridgeModule` trait. BridgeModule(bp_runtime::OwnedBridgeModuleError), } @@ -923,7 +923,7 @@ mod tests { PAYLOAD_REJECTED_BY_TARGET_CHAIN, REGULAR_PAYLOAD, TEST_LANE_ID, TEST_LANE_ID_2, TEST_LANE_ID_3, TEST_RELAYER_A, TEST_RELAYER_B, }, - outbound_lane::ReceivalConfirmationError, + outbound_lane::ReceptionConfirmationError, }; use bp_messages::{ source_chain::MessagesBridge, BridgeMessagesCall, UnrewardedRelayer, @@ -950,11 +950,11 @@ mod tests { let outbound_lane = outbound_lane::(lane_id); let message_nonce = outbound_lane.data().latest_generated_nonce + 1; - let prev_enqueud_messages = outbound_lane.data().queued_messages().saturating_len(); + let prev_enqueued_messages = outbound_lane.data().queued_messages().saturating_len(); let valid_message = Pallet::::validate_message(lane_id, ®ULAR_PAYLOAD) .expect("validate_message has failed"); let artifacts = Pallet::::send_message(valid_message); - assert_eq!(artifacts.enqueued_messages, prev_enqueud_messages + 1); + assert_eq!(artifacts.enqueued_messages, prev_enqueued_messages + 1); // check event with assigned nonce assert_eq!( @@ -1541,7 +1541,7 @@ mod tests { } #[test] - fn actual_dispatch_weight_does_not_overlow() { + fn actual_dispatch_weight_does_not_overflow() { run_test(|| { let message1 = message(1, message_payload(0, u64::MAX / 2)); let message2 = message(2, message_payload(0, u64::MAX / 2)); @@ -1775,7 +1775,7 @@ mod tests { // returns `last_confirmed_nonce`; // 3) it means that we're going to confirm delivery of messages 1..=1; // 4) so the number of declared messages (see `UnrewardedRelayersState`) is `0` and - // numer of actually confirmed messages is `1`. + // number of actually confirmed messages is `1`. assert_noop!( Pallet::::receive_messages_delivery_proof( RuntimeOrigin::signed(1), @@ -1785,8 +1785,8 @@ mod tests { ))), UnrewardedRelayersState { last_delivered_nonce: 1, ..Default::default() }, ), - Error::::ReceivalConfirmation( - ReceivalConfirmationError::TryingToConfirmMoreMessagesThanExpected + Error::::ReceptionConfirmation( + ReceptionConfirmationError::TryingToConfirmMoreMessagesThanExpected ), ); }); diff --git a/bridges/modules/messages/src/mock.rs b/bridges/modules/messages/src/mock.rs index af92120539854347111d0562e284dc59e6e251d9..ec63f15b94b5205d744b1379bd6697a4ae43534a 100644 --- a/bridges/modules/messages/src/mock.rs +++ b/bridges/modules/messages/src/mock.rs @@ -77,14 +77,14 @@ frame_support::construct_runtime! { pub type DbWeight = RocksDbWeight; -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for TestRuntime { type Block = Block; type AccountData = pallet_balances::AccountData; type DbWeight = DbWeight; } -#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig as pallet_balances::DefaultConfig)] +#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] impl pallet_balances::Config for TestRuntime { type ReserveIdentifier = [u8; 8]; type AccountStore = System; diff --git a/bridges/modules/messages/src/outbound_lane.rs b/bridges/modules/messages/src/outbound_lane.rs index 431c2cfb7eef3e8dd48e49c6ac37153ae64d57b6..acef5546d2a64fa8a3fb38c6b41ae30819cdeaa2 100644 --- a/bridges/modules/messages/src/outbound_lane.rs +++ b/bridges/modules/messages/src/outbound_lane.rs @@ -53,7 +53,7 @@ pub type StoredMessagePayload = BoundedVec>::MaximalOu /// Result of messages receival confirmation. #[derive(Encode, Decode, RuntimeDebug, PartialEq, Eq, PalletError, TypeInfo)] -pub enum ReceivalConfirmationError { +pub enum ReceptionConfirmationError { /// Bridged chain is trying to confirm more messages than we have generated. May be a result /// of invalid bridged chain storage. FailedToConfirmFutureMessages, @@ -103,7 +103,7 @@ impl OutboundLane { max_allowed_messages: MessageNonce, latest_delivered_nonce: MessageNonce, relayers: &VecDeque>, - ) -> Result, ReceivalConfirmationError> { + ) -> Result, ReceptionConfirmationError> { let mut data = self.storage.data(); let confirmed_messages = DeliveredMessages { begin: data.latest_received_nonce.saturating_add(1), @@ -113,7 +113,7 @@ impl OutboundLane { return Ok(None) } if confirmed_messages.end > data.latest_generated_nonce { - return Err(ReceivalConfirmationError::FailedToConfirmFutureMessages) + return Err(ReceptionConfirmationError::FailedToConfirmFutureMessages) } if confirmed_messages.total_messages() > max_allowed_messages { // that the relayer has declared correct number of messages that the proof contains (it @@ -127,7 +127,7 @@ impl OutboundLane { confirmed_messages.total_messages(), max_allowed_messages, ); - return Err(ReceivalConfirmationError::TryingToConfirmMoreMessagesThanExpected) + return Err(ReceptionConfirmationError::TryingToConfirmMoreMessagesThanExpected) } ensure_unrewarded_relayers_are_correct(confirmed_messages.end, relayers)?; @@ -176,24 +176,24 @@ impl OutboundLane { fn ensure_unrewarded_relayers_are_correct( latest_received_nonce: MessageNonce, relayers: &VecDeque>, -) -> Result<(), ReceivalConfirmationError> { +) -> Result<(), ReceptionConfirmationError> { let mut expected_entry_begin = relayers.front().map(|entry| entry.messages.begin); for entry in relayers { // unrewarded relayer entry must have at least 1 unconfirmed message // (guaranteed by the `InboundLane::receive_message()`) if entry.messages.end < entry.messages.begin { - return Err(ReceivalConfirmationError::EmptyUnrewardedRelayerEntry) + return Err(ReceptionConfirmationError::EmptyUnrewardedRelayerEntry) } // every entry must confirm range of messages that follows previous entry range // (guaranteed by the `InboundLane::receive_message()`) if expected_entry_begin != Some(entry.messages.begin) { - return Err(ReceivalConfirmationError::NonConsecutiveUnrewardedRelayerEntries) + return Err(ReceptionConfirmationError::NonConsecutiveUnrewardedRelayerEntries) } expected_entry_begin = entry.messages.end.checked_add(1); // entry can't confirm messages larger than `inbound_lane_data.latest_received_nonce()` // (guaranteed by the `InboundLane::receive_message()`) if entry.messages.end > latest_received_nonce { - return Err(ReceivalConfirmationError::FailedToConfirmFutureMessages) + return Err(ReceptionConfirmationError::FailedToConfirmFutureMessages) } } @@ -228,7 +228,7 @@ mod tests { fn assert_3_messages_confirmation_fails( latest_received_nonce: MessageNonce, relayers: &VecDeque>, - ) -> Result, ReceivalConfirmationError> { + ) -> Result, ReceptionConfirmationError> { run_test(|| { let mut lane = outbound_lane::(TEST_LANE_ID); lane.send_message(outbound_message_data(REGULAR_PAYLOAD)); @@ -299,7 +299,7 @@ mod tests { fn confirm_delivery_rejects_nonce_larger_than_last_generated() { assert_eq!( assert_3_messages_confirmation_fails(10, &unrewarded_relayers(1..=10),), - Err(ReceivalConfirmationError::FailedToConfirmFutureMessages), + Err(ReceptionConfirmationError::FailedToConfirmFutureMessages), ); } @@ -314,7 +314,7 @@ mod tests { .chain(unrewarded_relayers(3..=3).into_iter()) .collect(), ), - Err(ReceivalConfirmationError::FailedToConfirmFutureMessages), + Err(ReceptionConfirmationError::FailedToConfirmFutureMessages), ); } @@ -330,7 +330,7 @@ mod tests { .chain(unrewarded_relayers(2..=3).into_iter()) .collect(), ), - Err(ReceivalConfirmationError::EmptyUnrewardedRelayerEntry), + Err(ReceptionConfirmationError::EmptyUnrewardedRelayerEntry), ); } @@ -345,7 +345,7 @@ mod tests { .chain(unrewarded_relayers(2..=2).into_iter()) .collect(), ), - Err(ReceivalConfirmationError::NonConsecutiveUnrewardedRelayerEntries), + Err(ReceptionConfirmationError::NonConsecutiveUnrewardedRelayerEntries), ); } @@ -409,11 +409,11 @@ mod tests { lane.send_message(outbound_message_data(REGULAR_PAYLOAD)); assert_eq!( lane.confirm_delivery(0, 3, &unrewarded_relayers(1..=3)), - Err(ReceivalConfirmationError::TryingToConfirmMoreMessagesThanExpected), + Err(ReceptionConfirmationError::TryingToConfirmMoreMessagesThanExpected), ); assert_eq!( lane.confirm_delivery(2, 3, &unrewarded_relayers(1..=3)), - Err(ReceivalConfirmationError::TryingToConfirmMoreMessagesThanExpected), + Err(ReceptionConfirmationError::TryingToConfirmMoreMessagesThanExpected), ); assert_eq!( lane.confirm_delivery(3, 3, &unrewarded_relayers(1..=3)), diff --git a/bridges/modules/parachains/Cargo.toml b/bridges/modules/parachains/Cargo.toml index 41aeca4b3bc5c608915783d2603ef0157aef54bb..35213be0674a8c8d31de79afb720fbf457f3445a 100644 --- a/bridges/modules/parachains/Cargo.toml +++ b/bridges/modules/parachains/Cargo.toml @@ -5,14 +5,15 @@ description = "Module that allows bridged relay chains to exchange information o authors.workspace = true edition.workspace = true license = "GPL-3.0-or-later WITH Classpath-exception-2.0" +repository.workspace = true [lints] workspace = true [dependencies] -codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false } -log = { version = "0.4.20", default-features = false } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false } +log = { workspace = true } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } # Bridge Dependencies diff --git a/bridges/modules/parachains/src/lib.rs b/bridges/modules/parachains/src/lib.rs index 87c57e84622aa7cb5eb1019ec88a680dc06fd8ee..1363a637604d1202ffc4bf799bf7ced180d9fe53 100644 --- a/bridges/modules/parachains/src/lib.rs +++ b/bridges/modules/parachains/src/lib.rs @@ -731,6 +731,7 @@ pub(crate) mod tests { }; use bp_test_utils::{ authority_list, generate_owned_bridge_module_tests, make_default_justification, + TEST_GRANDPA_SET_ID, }; use frame_support::{ assert_noop, assert_ok, @@ -777,10 +778,11 @@ pub(crate) mod tests { let hash = header.hash(); let justification = make_default_justification(&header); assert_ok!( - pallet_bridge_grandpa::Pallet::::submit_finality_proof( + pallet_bridge_grandpa::Pallet::::submit_finality_proof_ex( RuntimeOrigin::signed(1), Box::new(header), justification.clone(), + TEST_GRANDPA_SET_ID, ) ); diff --git a/bridges/modules/parachains/src/mock.rs b/bridges/modules/parachains/src/mock.rs index 143f11d986371c4907f79fc4faf55143d3679034..d9cbabf850ec99ee13baa0f8bfc013b1192bd000 100644 --- a/bridges/modules/parachains/src/mock.rs +++ b/bridges/modules/parachains/src/mock.rs @@ -161,7 +161,7 @@ construct_runtime! { } } -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for TestRuntime { type Block = Block; } @@ -261,7 +261,7 @@ impl Chain for TestBridgedChain { impl ChainWithGrandpa for TestBridgedChain { const WITH_CHAIN_GRANDPA_PALLET_NAME: &'static str = ""; const MAX_AUTHORITIES_COUNT: u32 = 16; - const REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY: u32 = 8; + const REASONABLE_HEADERS_IN_JUSTIFICATION_ANCESTRY: u32 = 8; const MAX_MANDATORY_HEADER_SIZE: u32 = 256; const AVERAGE_HEADER_SIZE: u32 = 64; } @@ -294,7 +294,7 @@ impl Chain for OtherBridgedChain { impl ChainWithGrandpa for OtherBridgedChain { const WITH_CHAIN_GRANDPA_PALLET_NAME: &'static str = ""; const MAX_AUTHORITIES_COUNT: u32 = 16; - const REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY: u32 = 8; + const REASONABLE_HEADERS_IN_JUSTIFICATION_ANCESTRY: u32 = 8; const MAX_MANDATORY_HEADER_SIZE: u32 = 256; const AVERAGE_HEADER_SIZE: u32 = 64; } diff --git a/bridges/modules/relayers/Cargo.toml b/bridges/modules/relayers/Cargo.toml index 35017ebbd30361ae5c6184cfdbbdd7a42e9d59bb..e2b7aca92249c19096bf129be6fab1be08a5357a 100644 --- a/bridges/modules/relayers/Cargo.toml +++ b/bridges/modules/relayers/Cargo.toml @@ -5,14 +5,15 @@ version = "0.7.0" authors.workspace = true edition.workspace = true license = "GPL-3.0-or-later WITH Classpath-exception-2.0" +repository.workspace = true [lints] workspace = true [dependencies] -codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false } -log = { version = "0.4.20", default-features = false } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false } +log = { workspace = true } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } # Bridge dependencies diff --git a/bridges/modules/relayers/src/mock.rs b/bridges/modules/relayers/src/mock.rs index 667b10e5c125ed74bad2aa7796756f372578c2ce..3124787896c3e1ee20014fc21b87ccbc19e6a2c2 100644 --- a/bridges/modules/relayers/src/mock.rs +++ b/bridges/modules/relayers/src/mock.rs @@ -59,14 +59,14 @@ parameter_types! { pub const Lease: BlockNumber = 8; } -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for TestRuntime { type Block = Block; type AccountData = pallet_balances::AccountData; type DbWeight = DbWeight; } -#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig as pallet_balances::DefaultConfig)] +#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] impl pallet_balances::Config for TestRuntime { type ReserveIdentifier = [u8; 8]; type AccountStore = System; diff --git a/bridges/modules/xcm-bridge-hub-router/Cargo.toml b/bridges/modules/xcm-bridge-hub-router/Cargo.toml index ff33b19a5811e2de96c276920fc8e354ca73ec19..06f2a339bed9d07b5615ca047177228d6585cfc2 100644 --- a/bridges/modules/xcm-bridge-hub-router/Cargo.toml +++ b/bridges/modules/xcm-bridge-hub-router/Cargo.toml @@ -5,14 +5,15 @@ version = "0.5.0" authors.workspace = true edition.workspace = true license = "GPL-3.0-or-later WITH Classpath-exception-2.0" +repository.workspace = true [lints] workspace = true [dependencies] -codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false } -log = { version = "0.4.20", default-features = false } -scale-info = { version = "2.10.0", default-features = false, features = ["bit-vec", "derive", "serde"] } +codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false } +log = { workspace = true } +scale-info = { version = "2.11.1", default-features = false, features = ["bit-vec", "derive", "serde"] } # Bridge dependencies diff --git a/bridges/modules/xcm-bridge-hub-router/src/lib.rs b/bridges/modules/xcm-bridge-hub-router/src/lib.rs index f219be78f9e1b5469fb752eed3f662c954d0ec42..5d0be41b1b5588e3ddc8c6306c9bf83ec29d6056 100644 --- a/bridges/modules/xcm-bridge-hub-router/src/lib.rs +++ b/bridges/modules/xcm-bridge-hub-router/src/lib.rs @@ -427,7 +427,7 @@ mod tests { run_test(|| { Bridge::::put(uncongested_bridge(FixedU128::from_rational(125, 100))); - // it shold eventually decreased to one + // it should eventually decreased to one while XcmBridgeHubRouter::bridge().delivery_fee_factor > MINIMAL_DELIVERY_FEE_FACTOR { XcmBridgeHubRouter::on_initialize(One::one()); } diff --git a/bridges/modules/xcm-bridge-hub-router/src/mock.rs b/bridges/modules/xcm-bridge-hub-router/src/mock.rs index 6dbfba5f6fdc1f521fb2fdf000ffb778740435e6..54e10966d51b23e7be5010b39cb9cb7d6a3b0118 100644 --- a/bridges/modules/xcm-bridge-hub-router/src/mock.rs +++ b/bridges/modules/xcm-bridge-hub-router/src/mock.rs @@ -64,7 +64,7 @@ parameter_types! { pub UnknownXcmVersionLocation: Location = Location::new(2, [GlobalConsensus(BridgedNetworkId::get()), Parachain(9999)]); } -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for TestRuntime { type Block = Block; } diff --git a/bridges/modules/xcm-bridge-hub/Cargo.toml b/bridges/modules/xcm-bridge-hub/Cargo.toml index 89e261dc6d79cd41d3afda77b37e4b48f4563c36..4483a3790900f975030e8c820f9b42442a747262 100644 --- a/bridges/modules/xcm-bridge-hub/Cargo.toml +++ b/bridges/modules/xcm-bridge-hub/Cargo.toml @@ -1,18 +1,19 @@ [package] name = "pallet-xcm-bridge-hub" -description = "Module that adds dynamic bridges/lanes support to XCM infrastucture at the bridge hub." +description = "Module that adds dynamic bridges/lanes support to XCM infrastructure at the bridge hub." version = "0.2.0" authors.workspace = true edition.workspace = true license = "GPL-3.0-or-later WITH Classpath-exception-2.0" +repository.workspace = true [lints] workspace = true [dependencies] -codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false } -log = { version = "0.4.20", default-features = false } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false } +log = { workspace = true } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } # Bridge Dependencies bp-messages = { path = "../../primitives/messages", default-features = false } diff --git a/bridges/modules/xcm-bridge-hub/src/mock.rs b/bridges/modules/xcm-bridge-hub/src/mock.rs index e40e1f9fb65157feffebeaa53e16c7def2ad22e0..4c09bce56d73eea717ad5149084e2ae337e48e87 100644 --- a/bridges/modules/xcm-bridge-hub/src/mock.rs +++ b/bridges/modules/xcm-bridge-hub/src/mock.rs @@ -64,7 +64,7 @@ parameter_types! { pub const ExistentialDeposit: Balance = 1; } -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for TestRuntime { type AccountId = AccountId; type AccountData = pallet_balances::AccountData; @@ -72,7 +72,7 @@ impl frame_system::Config for TestRuntime { type Lookup = IdentityLookup; } -#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig as pallet_balances::DefaultConfig)] +#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] impl pallet_balances::Config for TestRuntime { type AccountStore = System; } diff --git a/bridges/primitives/beefy/Cargo.toml b/bridges/primitives/beefy/Cargo.toml new file mode 100644 index 0000000000000000000000000000000000000000..2a13685207cc633fe18633525231866511afd01e --- /dev/null +++ b/bridges/primitives/beefy/Cargo.toml @@ -0,0 +1,47 @@ +[package] +name = "bp-beefy" +description = "Primitives of pallet-bridge-beefy module." +version = "0.1.0" +authors.workspace = true +edition.workspace = true +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" +repository.workspace = true +publish = false + +[lints] +workspace = true + +[dependencies] +codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["bit-vec", "derive"] } +scale-info = { version = "2.11.1", default-features = false, features = ["bit-vec", "derive"] } +serde = { default-features = false, features = ["alloc", "derive"], workspace = true } + +# Bridge Dependencies + +bp-runtime = { path = "../runtime", default-features = false } + +# Substrate Dependencies + +binary-merkle-tree = { path = "../../../substrate/utils/binary-merkle-tree", default-features = false } +sp-consensus-beefy = { path = "../../../substrate/primitives/consensus/beefy", default-features = false } +frame-support = { path = "../../../substrate/frame/support", default-features = false } +pallet-beefy-mmr = { path = "../../../substrate/frame/beefy-mmr", default-features = false } +pallet-mmr = { path = "../../../substrate/frame/merkle-mountain-range", default-features = false } +sp-runtime = { path = "../../../substrate/primitives/runtime", default-features = false } +sp-std = { path = "../../../substrate/primitives/std", default-features = false } + +[features] +default = ["std"] +std = [ + "binary-merkle-tree/std", + "bp-runtime/std", + "codec/std", + "frame-support/std", + "pallet-beefy-mmr/std", + "pallet-mmr/std", + "scale-info/std", + "serde/std", + "sp-consensus-beefy/std", + "sp-runtime/std", + "sp-std/std", +] diff --git a/bridges/primitives/beefy/src/lib.rs b/bridges/primitives/beefy/src/lib.rs new file mode 100644 index 0000000000000000000000000000000000000000..0441781e79a66f785b985047ad56da70c0f13d49 --- /dev/null +++ b/bridges/primitives/beefy/src/lib.rs @@ -0,0 +1,151 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Primitives that are used to interact with BEEFY bridge pallet. + +#![cfg_attr(not(feature = "std"), no_std)] +#![warn(missing_docs)] + +pub use binary_merkle_tree::merkle_root; +pub use pallet_beefy_mmr::BeefyEcdsaToEthereum; +pub use pallet_mmr::{ + primitives::{DataOrHash as MmrDataOrHash, Proof as MmrProof}, + verify_leaves_proof as verify_mmr_leaves_proof, +}; +pub use sp_consensus_beefy::{ + ecdsa_crypto::{ + AuthorityId as EcdsaValidatorId, AuthoritySignature as EcdsaValidatorSignature, + }, + known_payloads::MMR_ROOT_ID as MMR_ROOT_PAYLOAD_ID, + mmr::{BeefyAuthoritySet, MmrLeafVersion}, + BeefyAuthorityId, Commitment, Payload as BeefyPayload, SignedCommitment, ValidatorSet, + ValidatorSetId, BEEFY_ENGINE_ID, +}; + +use bp_runtime::{BasicOperatingMode, BlockNumberOf, Chain, HashOf}; +use codec::{Decode, Encode}; +use frame_support::Parameter; +use scale_info::TypeInfo; +use serde::{Deserialize, Serialize}; +use sp_runtime::{ + traits::{Convert, MaybeSerializeDeserialize}, + RuntimeAppPublic, RuntimeDebug, +}; +use sp_std::prelude::*; + +/// Substrate-based chain with BEEFY && MMR pallets deployed. +/// +/// Both BEEFY and MMR pallets and their clients may be configured to use different +/// primitives. Some of types can be configured in low-level pallets, but are constrained +/// when BEEFY+MMR bundle is used. +pub trait ChainWithBeefy: Chain { + /// The hashing algorithm used to compute the digest of the BEEFY commitment. + /// + /// Corresponds to the hashing algorithm, used by `sc_consensus_beefy::BeefyKeystore`. + type CommitmentHasher: sp_runtime::traits::Hash; + + /// The hashing algorithm used to build the MMR. + /// + /// The same algorithm is also used to compute merkle roots in BEEFY + /// (e.g. validator addresses root in leaf data). + /// + /// Corresponds to the `Hashing` field of the `pallet-mmr` configuration. + type MmrHashing: sp_runtime::traits::Hash; + + /// The output type of the hashing algorithm used to build the MMR. + /// + /// This type is actually stored in the MMR. + + /// Corresponds to the `Hash` field of the `pallet-mmr` configuration. + type MmrHash: sp_std::hash::Hash + + Parameter + + Copy + + AsRef<[u8]> + + Default + + MaybeSerializeDeserialize + + PartialOrd; + + /// The type expected for the MMR leaf extra data. + type BeefyMmrLeafExtra: Parameter; + + /// A way to identify a BEEFY validator. + /// + /// Corresponds to the `BeefyId` field of the `pallet-beefy` configuration. + type AuthorityId: BeefyAuthorityId + Parameter; + + /// A way to convert validator id to its raw representation in the BEEFY merkle tree. + /// + /// Corresponds to the `BeefyAuthorityToMerkleLeaf` field of the `pallet-beefy-mmr` + /// configuration. + type AuthorityIdToMerkleLeaf: Convert>; +} + +/// BEEFY validator id used by given Substrate chain. +pub type BeefyAuthorityIdOf = ::AuthorityId; +/// BEEFY validator set, containing both validator identifiers and the numeric set id. +pub type BeefyAuthoritySetOf = ValidatorSet>; +/// BEEFY authority set, containing both validator identifiers and the numeric set id. +pub type BeefyAuthoritySetInfoOf = sp_consensus_beefy::mmr::BeefyAuthoritySet>; +/// BEEFY validator signature used by given Substrate chain. +pub type BeefyValidatorSignatureOf = + <::AuthorityId as RuntimeAppPublic>::Signature; +/// Signed BEEFY commitment used by given Substrate chain. +pub type BeefySignedCommitmentOf = + SignedCommitment, BeefyValidatorSignatureOf>; +/// Hash algorithm, used to compute the digest of the BEEFY commitment before signing it. +pub type BeefyCommitmentHasher = ::CommitmentHasher; +/// Hash algorithm used in Beefy MMR construction by given Substrate chain. +pub type MmrHashingOf = ::MmrHashing; +/// Hash type, used in MMR construction by given Substrate chain. +pub type MmrHashOf = ::MmrHash; +/// BEEFY MMR proof type used by the given Substrate chain. +pub type MmrProofOf = MmrProof>; +/// The type of the MMR leaf extra data used by the given Substrate chain. +pub type BeefyMmrLeafExtraOf = ::BeefyMmrLeafExtra; +/// A way to convert a validator id to its raw representation in the BEEFY merkle tree, used by +/// the given Substrate chain. +pub type BeefyAuthorityIdToMerkleLeafOf = ::AuthorityIdToMerkleLeaf; +/// Actual type of leafs in the BEEFY MMR. +pub type BeefyMmrLeafOf = sp_consensus_beefy::mmr::MmrLeaf< + BlockNumberOf, + HashOf, + MmrHashOf, + BeefyMmrLeafExtraOf, +>; + +/// Data required for initializing the BEEFY pallet. +/// +/// Provides the initial context that the bridge needs in order to know +/// where to start the sync process from. +#[derive(Encode, Decode, RuntimeDebug, PartialEq, Clone, TypeInfo, Serialize, Deserialize)] +pub struct InitializationData { + /// Pallet operating mode. + pub operating_mode: BasicOperatingMode, + /// Number of the best block, finalized by BEEFY. + pub best_block_number: BlockNumber, + /// BEEFY authority set that will be finalizing descendants of the `best_beefy_block_number` + /// block. + pub authority_set: BeefyAuthoritySet, +} + +/// Basic data, stored by the pallet for every imported commitment. +#[derive(Encode, Decode, RuntimeDebug, PartialEq, TypeInfo)] +pub struct ImportedCommitment { + /// Block number and hash of the finalized block parent. + pub parent_number_and_hash: (BlockNumber, BlockHash), + /// MMR root at the imported block. + pub mmr_root: MmrHash, +} diff --git a/bridges/primitives/header-chain/Cargo.toml b/bridges/primitives/header-chain/Cargo.toml index 828b567bb947d851e5d0f8dac03dadebf120e614..f7a61a9ff32bd42f4199859834b6296aeaa18f4a 100644 --- a/bridges/primitives/header-chain/Cargo.toml +++ b/bridges/primitives/header-chain/Cargo.toml @@ -5,15 +5,16 @@ version = "0.7.0" authors.workspace = true edition.workspace = true license = "GPL-3.0-or-later WITH Classpath-exception-2.0" +repository.workspace = true [lints] workspace = true [dependencies] -codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false } +codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false } finality-grandpa = { version = "0.16.2", default-features = false } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0", default-features = false, features = ["alloc", "derive"] } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +serde = { features = ["alloc", "derive"], workspace = true } # Bridge dependencies diff --git a/bridges/primitives/header-chain/src/justification/mod.rs b/bridges/primitives/header-chain/src/justification/mod.rs index b32d8bdb5f1d8ce05722c938a083d7f582139835..d7c2cbf429e2b01efe4a9ea2481e66e2857d0044 100644 --- a/bridges/primitives/header-chain/src/justification/mod.rs +++ b/bridges/primitives/header-chain/src/justification/mod.rs @@ -83,7 +83,7 @@ impl GrandpaJustification { .saturating_add(HashOf::::max_encoded_len().saturated_into()); let max_expected_votes_ancestries_size = - C::REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY.saturating_mul(C::AVERAGE_HEADER_SIZE); + C::REASONABLE_HEADERS_IN_JUSTIFICATION_ANCESTRY.saturating_mul(C::AVERAGE_HEADER_SIZE); // justification is round number (u64=8b), a signed GRANDPA commit and the // `votes_ancestries` vector diff --git a/bridges/primitives/header-chain/src/justification/verification/mod.rs b/bridges/primitives/header-chain/src/justification/verification/mod.rs index c71149bf9c28e350fb43429623ca47cd367b9091..9df3511e1035ef769e5ef6c373253161be041efb 100644 --- a/bridges/primitives/header-chain/src/justification/verification/mod.rs +++ b/bridges/primitives/header-chain/src/justification/verification/mod.rs @@ -318,7 +318,7 @@ trait JustificationVerifier { } // check that the cumulative weight of validators that voted for the justification target - // (or one of its descendents) is larger than the required threshold. + // (or one of its descendants) is larger than the required threshold. if cumulative_weight < threshold { return Err(Error::TooLowCumulativeWeight) } diff --git a/bridges/primitives/header-chain/src/lib.rs b/bridges/primitives/header-chain/src/lib.rs index f5485aca1ee8b485eedd8b26874e401ceb5f4ff5..98fb9ff83d8335fc04fbce7f9e566c73d15752a8 100644 --- a/bridges/primitives/header-chain/src/lib.rs +++ b/bridges/primitives/header-chain/src/lib.rs @@ -244,6 +244,16 @@ pub enum BridgeGrandpaCall { /// All data, required to initialize the pallet. init_data: InitializationData
, }, + /// `pallet-bridge-grandpa::Call::submit_finality_proof_ex` + #[codec(index = 4)] + submit_finality_proof_ex { + /// The header that we are going to finalize. + finality_target: Box
, + /// Finality justification for the `finality_target`. + justification: justification::GrandpaJustification
, + /// An identifier of the validators set, that have signed the justification. + current_set_id: SetId, + }, } /// The `BridgeGrandpaCall` used by a chain. @@ -273,7 +283,7 @@ pub trait ChainWithGrandpa: Chain { /// ancestry and the pallet will accept such justification. The limit is only used to compute /// maximal refund amount and submitting justifications which exceed the limit, may be costly /// to submitter. - const REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY: u32; + const REASONABLE_HEADERS_IN_JUSTIFICATION_ANCESTRY: u32; /// Maximal size of the mandatory chain header. Mandatory header is the header that enacts new /// GRANDPA authorities set (so it has large digest inside). @@ -307,8 +317,8 @@ where const WITH_CHAIN_GRANDPA_PALLET_NAME: &'static str = ::WITH_CHAIN_GRANDPA_PALLET_NAME; const MAX_AUTHORITIES_COUNT: u32 = ::MAX_AUTHORITIES_COUNT; - const REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY: u32 = - ::REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY; + const REASONABLE_HEADERS_IN_JUSTIFICATION_ANCESTRY: u32 = + ::REASONABLE_HEADERS_IN_JUSTIFICATION_ANCESTRY; const MAX_MANDATORY_HEADER_SIZE: u32 = ::MAX_MANDATORY_HEADER_SIZE; const AVERAGE_HEADER_SIZE: u32 = ::AVERAGE_HEADER_SIZE; @@ -363,7 +373,7 @@ mod tests { impl ChainWithGrandpa for TestChain { const WITH_CHAIN_GRANDPA_PALLET_NAME: &'static str = "Test"; const MAX_AUTHORITIES_COUNT: u32 = 128; - const REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY: u32 = 2; + const REASONABLE_HEADERS_IN_JUSTIFICATION_ANCESTRY: u32 = 2; const MAX_MANDATORY_HEADER_SIZE: u32 = 100_000; const AVERAGE_HEADER_SIZE: u32 = 1_024; } diff --git a/bridges/primitives/messages/Cargo.toml b/bridges/primitives/messages/Cargo.toml index 54aae4a2f76a425046860835ccd2a66cc29cf135..d41acfb9d32863d14e56e095755791a420fd3ce6 100644 --- a/bridges/primitives/messages/Cargo.toml +++ b/bridges/primitives/messages/Cargo.toml @@ -5,14 +5,15 @@ version = "0.7.0" authors.workspace = true edition.workspace = true license = "GPL-3.0-or-later WITH Classpath-exception-2.0" +repository.workspace = true [lints] workspace = true [dependencies] -codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false, features = ["bit-vec", "derive"] } -scale-info = { version = "2.10.0", default-features = false, features = ["bit-vec", "derive"] } -serde = { version = "1.0", default-features = false, features = ["alloc", "derive"] } +codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["bit-vec", "derive"] } +scale-info = { version = "2.11.1", default-features = false, features = ["bit-vec", "derive"] } +serde = { features = ["alloc", "derive"], workspace = true } # Bridge dependencies diff --git a/bridges/primitives/messages/src/lib.rs b/bridges/primitives/messages/src/lib.rs index 51b3f25f7151867b52e8e5f49bc70b0a3632c05e..c3f79b3ee388c4584def56056f6cdf6328032e18 100644 --- a/bridges/primitives/messages/src/lib.rs +++ b/bridges/primitives/messages/src/lib.rs @@ -289,27 +289,27 @@ pub struct ReceivedMessages { /// Id of the lane which is receiving messages. pub lane: LaneId, /// Result of messages which we tried to dispatch - pub receive_results: Vec<(MessageNonce, ReceivalResult)>, + pub receive_results: Vec<(MessageNonce, ReceptionResult)>, } impl ReceivedMessages { /// Creates new `ReceivedMessages` structure from given results. pub fn new( lane: LaneId, - receive_results: Vec<(MessageNonce, ReceivalResult)>, + receive_results: Vec<(MessageNonce, ReceptionResult)>, ) -> Self { ReceivedMessages { lane, receive_results } } /// Push `result` of the `message` delivery onto `receive_results` vector. - pub fn push(&mut self, message: MessageNonce, result: ReceivalResult) { + pub fn push(&mut self, message: MessageNonce, result: ReceptionResult) { self.receive_results.push((message, result)); } } /// Result of single message receival. #[derive(RuntimeDebug, Encode, Decode, PartialEq, Eq, Clone, TypeInfo)] -pub enum ReceivalResult { +pub enum ReceptionResult { /// Message has been received and dispatched. Note that we don't care whether dispatch has /// been successful or not - in both case message falls into this category. /// diff --git a/bridges/primitives/parachains/Cargo.toml b/bridges/primitives/parachains/Cargo.toml index 575f26193eb68643c5c0a5fe6376d8b735ee2840..2e7000b86a5e4ba21ccadf74b1c2d5374db5c545 100644 --- a/bridges/primitives/parachains/Cargo.toml +++ b/bridges/primitives/parachains/Cargo.toml @@ -5,14 +5,15 @@ version = "0.7.0" authors.workspace = true edition.workspace = true license = "GPL-3.0-or-later WITH Classpath-exception-2.0" +repository.workspace = true [lints] workspace = true [dependencies] -codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false, features = ["derive"] } +codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } impl-trait-for-tuples = "0.2" -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } # Bridge dependencies diff --git a/bridges/primitives/polkadot-core/Cargo.toml b/bridges/primitives/polkadot-core/Cargo.toml index e667c283a07937ab88053c064fb7b8cfb380f765..53b1e574cb1997e556f17b7f21f6a28d9eb84400 100644 --- a/bridges/primitives/polkadot-core/Cargo.toml +++ b/bridges/primitives/polkadot-core/Cargo.toml @@ -5,15 +5,16 @@ version = "0.7.0" authors.workspace = true edition.workspace = true license = "GPL-3.0-or-later WITH Classpath-exception-2.0" +repository.workspace = true [lints] workspace = true [dependencies] -codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false, features = ["derive"] } +codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } parity-util-mem = { version = "0.12.0", optional = true } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0", optional = true, features = ["derive"] } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +serde = { optional = true, features = ["derive"], workspace = true, default-features = true } # Bridge Dependencies diff --git a/bridges/primitives/polkadot-core/src/lib.rs b/bridges/primitives/polkadot-core/src/lib.rs index df2836495bbe131e9cf810c43eb4af5eefaf43b7..e83be59b23890036905ae1abb441c454c2ce29a5 100644 --- a/bridges/primitives/polkadot-core/src/lib.rs +++ b/bridges/primitives/polkadot-core/src/lib.rs @@ -71,7 +71,7 @@ pub const MAX_AUTHORITIES_COUNT: u32 = 1_256; /// justifications with any additional headers in votes ancestry, so reasonable headers may /// be set to zero. But we assume that there may be small GRANDPA lags, so we're leaving some /// reserve here. -pub const REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY: u32 = 2; +pub const REASONABLE_HEADERS_IN_JUSTIFICATION_ANCESTRY: u32 = 2; /// Average header size in `votes_ancestries` field of justification on Polkadot-like /// chains. diff --git a/bridges/primitives/relayers/Cargo.toml b/bridges/primitives/relayers/Cargo.toml index 3bd6809d2789e0b3aced5b8d96448b63e1074ee4..1be7f1dc6ebd38061e98865b45d4f85d8f3f7448 100644 --- a/bridges/primitives/relayers/Cargo.toml +++ b/bridges/primitives/relayers/Cargo.toml @@ -5,13 +5,14 @@ version = "0.7.0" authors.workspace = true edition.workspace = true license = "GPL-3.0-or-later WITH Classpath-exception-2.0" +repository.workspace = true [lints] workspace = true [dependencies] -codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false, features = ["bit-vec", "derive"] } -scale-info = { version = "2.10.0", default-features = false, features = ["bit-vec", "derive"] } +codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["bit-vec", "derive"] } +scale-info = { version = "2.11.1", default-features = false, features = ["bit-vec", "derive"] } # Bridge Dependencies diff --git a/bridges/primitives/runtime/Cargo.toml b/bridges/primitives/runtime/Cargo.toml index 6786bf8f21ced12e2424ecc17ff0c4ce96fd96d7..9a9b0291687d19ac0b5698ce3ef6a591da9f86c9 100644 --- a/bridges/primitives/runtime/Cargo.toml +++ b/bridges/primitives/runtime/Cargo.toml @@ -5,18 +5,19 @@ version = "0.7.0" authors.workspace = true edition.workspace = true license = "GPL-3.0-or-later WITH Classpath-exception-2.0" +repository.workspace = true [lints] workspace = true [dependencies] -codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false } +codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false } hash-db = { version = "0.16.0", default-features = false } impl-trait-for-tuples = "0.2.2" -log = { version = "0.4.19", default-features = false } +log = { workspace = true } num-traits = { version = "0.2", default-features = false } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0", default-features = false, features = ["alloc", "derive"] } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +serde = { features = ["alloc", "derive"], workspace = true } # Substrate Dependencies @@ -28,7 +29,7 @@ sp-runtime = { path = "../../../substrate/primitives/runtime", default-features sp-state-machine = { path = "../../../substrate/primitives/state-machine", default-features = false } sp-std = { path = "../../../substrate/primitives/std", default-features = false } sp-trie = { path = "../../../substrate/primitives/trie", default-features = false } -trie-db = { version = "0.28.0", default-features = false } +trie-db = { version = "0.29.0", default-features = false } [dev-dependencies] hex-literal = "0.4" diff --git a/bridges/primitives/runtime/src/chain.rs b/bridges/primitives/runtime/src/chain.rs index 9ba21a1cddf13896b21494045cea7fdd92259ce8..4ec5a001a99ecad21617ed0afc57d3edac383d0d 100644 --- a/bridges/primitives/runtime/src/chain.rs +++ b/bridges/primitives/runtime/src/chain.rs @@ -104,7 +104,7 @@ pub trait Chain: Send + Sync + 'static { const ID: ChainId; /// A type that fulfills the abstract idea of what a Substrate block number is. - // Constraits come from the associated Number type of `sp_runtime::traits::Header` + // Constraints come from the associated Number type of `sp_runtime::traits::Header` // See here for more info: // https://crates.parity.io/sp_runtime/traits/trait.Header.html#associatedtype.Number // @@ -125,7 +125,7 @@ pub trait Chain: Send + Sync + 'static { + MaxEncodedLen; /// A type that fulfills the abstract idea of what a Substrate hash is. - // Constraits come from the associated Hash type of `sp_runtime::traits::Header` + // Constraints come from the associated Hash type of `sp_runtime::traits::Header` // See here for more info: // https://crates.parity.io/sp_runtime/traits/trait.Header.html#associatedtype.Hash type Hash: Parameter @@ -143,7 +143,7 @@ pub trait Chain: Send + Sync + 'static { /// A type that fulfills the abstract idea of what a Substrate hasher (a type /// that produces hashes) is. - // Constraits come from the associated Hashing type of `sp_runtime::traits::Header` + // Constraints come from the associated Hashing type of `sp_runtime::traits::Header` // See here for more info: // https://crates.parity.io/sp_runtime/traits/trait.Header.html#associatedtype.Hashing type Hasher: HashT; diff --git a/bridges/primitives/runtime/src/lib.rs b/bridges/primitives/runtime/src/lib.rs index 850318923dc7671c26cc3edcf2f9d59bd7b987b9..c9c5c9412913b0470024e9e1473e5d69ff184f25 100644 --- a/bridges/primitives/runtime/src/lib.rs +++ b/bridges/primitives/runtime/src/lib.rs @@ -56,7 +56,7 @@ mod chain; mod storage_proof; mod storage_types; -// Re-export macro to aviod include paste dependency everywhere +// Re-export macro to avoid include paste dependency everywhere pub use sp_runtime::paste; /// Use this when something must be shared among all instances. @@ -461,7 +461,7 @@ macro_rules! generate_static_str_provider { }; } -/// Error message that is only dispayable in `std` environment. +/// Error message that is only displayable in `std` environment. #[derive(Encode, Decode, Clone, Eq, PartialEq, PalletError, TypeInfo)] #[scale_info(skip_type_params(T))] pub struct StrippableError { diff --git a/bridges/primitives/test-utils/Cargo.toml b/bridges/primitives/test-utils/Cargo.toml index d379e950b86ef6f98754c651c980291c9b9c4012..d314c38683cdbc8b40cfda3a14c64f91854e5d7f 100644 --- a/bridges/primitives/test-utils/Cargo.toml +++ b/bridges/primitives/test-utils/Cargo.toml @@ -5,6 +5,7 @@ description = "Utilities for testing substrate-based runtime bridge code" authors.workspace = true edition.workspace = true license = "GPL-3.0-or-later WITH Classpath-exception-2.0" +repository.workspace = true [lints] workspace = true @@ -14,7 +15,7 @@ bp-header-chain = { path = "../header-chain", default-features = false } bp-parachains = { path = "../parachains", default-features = false } bp-polkadot-core = { path = "../polkadot-core", default-features = false } bp-runtime = { path = "../runtime", default-features = false } -codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false } +codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false } ed25519-dalek = { version = "2.1", default-features = false } finality-grandpa = { version = "0.16.2", default-features = false } sp-application-crypto = { path = "../../../substrate/primitives/application-crypto", default-features = false } diff --git a/bridges/primitives/test-utils/src/lib.rs b/bridges/primitives/test-utils/src/lib.rs index f23ddd1a10d3681900b024999aef279ea6fcb91d..f4fe4a242e79c0e1c8a499c4dd18ed4a2164c656 100644 --- a/bridges/primitives/test-utils/src/lib.rs +++ b/bridges/primitives/test-utils/src/lib.rs @@ -88,7 +88,7 @@ pub fn make_default_justification(header: &H) -> GrandpaJustificatio /// Generate justifications in a way where we are able to tune the number of pre-commits /// and vote ancestries which are included in the justification. /// -/// This is useful for benchmarkings where we want to generate valid justifications with +/// This is useful for benchmarks where we want to generate valid justifications with /// a specific number of pre-commits (tuned with the number of "authorities") and/or a specific /// number of vote ancestries (tuned with the "votes" parameter). /// @@ -129,7 +129,7 @@ pub fn make_justification_for_header( votes_ancestries.push(child.clone()); } - // The header we need to use when pre-commiting is the one at the highest height + // The header we need to use when pre-committing is the one at the highest height // on our chain. let precommit_candidate = chain.last().map(|h| (h.hash(), *h.number())).unwrap(); unsigned_precommits.push(precommit_candidate); diff --git a/bridges/primitives/xcm-bridge-hub-router/Cargo.toml b/bridges/primitives/xcm-bridge-hub-router/Cargo.toml index 9297a8603c0aa407e3dc5b860e21a0c227cf1bcc..94eece16d5797eb23dd12af5b8b5aeb7d283d862 100644 --- a/bridges/primitives/xcm-bridge-hub-router/Cargo.toml +++ b/bridges/primitives/xcm-bridge-hub-router/Cargo.toml @@ -5,13 +5,14 @@ version = "0.6.0" authors.workspace = true edition.workspace = true license = "GPL-3.0-or-later WITH Classpath-exception-2.0" +repository.workspace = true [lints] workspace = true [dependencies] -codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false, features = ["bit-vec", "derive"] } -scale-info = { version = "2.10.0", default-features = false, features = ["bit-vec", "derive"] } +codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["bit-vec", "derive"] } +scale-info = { version = "2.11.1", default-features = false, features = ["bit-vec", "derive"] } # Substrate Dependencies sp-runtime = { path = "../../../substrate/primitives/runtime", default-features = false } diff --git a/bridges/primitives/xcm-bridge-hub/Cargo.toml b/bridges/primitives/xcm-bridge-hub/Cargo.toml index ad49ec1e83152f60b8386d97d522c798ee87e618..27881bc99d1f838bb5a72c02fe565ef5dc0307fd 100644 --- a/bridges/primitives/xcm-bridge-hub/Cargo.toml +++ b/bridges/primitives/xcm-bridge-hub/Cargo.toml @@ -5,6 +5,7 @@ version = "0.2.0" authors.workspace = true edition.workspace = true license = "GPL-3.0-or-later WITH Classpath-exception-2.0" +repository.workspace = true [lints] workspace = true diff --git a/bridges/relays/client-substrate/Cargo.toml b/bridges/relays/client-substrate/Cargo.toml new file mode 100644 index 0000000000000000000000000000000000000000..2c98441fc3017e8bcd4a213b27d5f5d2fee3223d --- /dev/null +++ b/bridges/relays/client-substrate/Cargo.toml @@ -0,0 +1,61 @@ +[package] +name = "relay-substrate-client" +version = "0.1.0" +authors.workspace = true +edition.workspace = true +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" +repository.workspace = true +publish = false + +[lints] +workspace = true + +[dependencies] +async-std = { version = "1.9.0", features = ["attributes"] } +async-trait = "0.1.79" +codec = { package = "parity-scale-codec", version = "3.6.1" } +futures = "0.3.30" +jsonrpsee = { version = "0.22", features = ["macros", "ws-client"] } +log = { workspace = true } +num-traits = "0.2" +rand = "0.8.5" +scale-info = { version = "2.11.1", features = ["derive"] } +tokio = { version = "1.37", features = ["rt-multi-thread"] } +thiserror = { workspace = true } + +# Bridge dependencies + +bp-header-chain = { path = "../../primitives/header-chain" } +bp-messages = { path = "../../primitives/messages" } +bp-polkadot-core = { path = "../../primitives/polkadot-core" } +bp-runtime = { path = "../../primitives/runtime" } +pallet-bridge-messages = { path = "../../modules/messages" } +finality-relay = { path = "../finality" } +relay-utils = { path = "../utils" } + +# Substrate Dependencies + +frame-support = { path = "../../../substrate/frame/support" } +frame-system = { path = "../../../substrate/frame/system" } +pallet-balances = { path = "../../../substrate/frame/balances" } +pallet-transaction-payment = { path = "../../../substrate/frame/transaction-payment" } +pallet-transaction-payment-rpc-runtime-api = { path = "../../../substrate/frame/transaction-payment/rpc/runtime-api" } +pallet-utility = { path = "../../../substrate/frame/utility" } +sc-chain-spec = { path = "../../../substrate/client/chain-spec" } +sc-rpc-api = { path = "../../../substrate/client/rpc-api" } +sc-transaction-pool-api = { path = "../../../substrate/client/transaction-pool/api" } +sp-consensus-grandpa = { path = "../../../substrate/primitives/consensus/grandpa" } +sp-core = { path = "../../../substrate/primitives/core" } +sp-rpc = { path = "../../../substrate/primitives/rpc" } +sp-runtime = { path = "../../../substrate/primitives/runtime" } +sp-std = { path = "../../../substrate/primitives/std" } +sp-trie = { path = "../../../substrate/primitives/trie" } +sp-version = { path = "../../../substrate/primitives/version" } + +# Polkadot Dependencies + +xcm = { package = "staging-xcm", path = "../../../polkadot/xcm" } + +[features] +default = [] +test-helpers = [] diff --git a/bridges/relays/client-substrate/src/calls.rs b/bridges/relays/client-substrate/src/calls.rs new file mode 100644 index 0000000000000000000000000000000000000000..71b9ec84aca30cc2384b50d4c99466798f46d72f --- /dev/null +++ b/bridges/relays/client-substrate/src/calls.rs @@ -0,0 +1,59 @@ +// Copyright 2019-2023 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Basic runtime calls. + +use codec::{Decode, Encode}; +use scale_info::TypeInfo; +use sp_std::{boxed::Box, vec::Vec}; + +use xcm::{VersionedLocation, VersionedXcm}; + +/// A minimized version of `frame-system::Call` that can be used without a runtime. +#[derive(Encode, Decode, Debug, PartialEq, Eq, Clone, TypeInfo)] +#[allow(non_camel_case_types)] +pub enum SystemCall { + /// `frame-system::Call::remark` + #[codec(index = 1)] + remark(Vec), +} + +/// A minimized version of `pallet-utility::Call` that can be used without a runtime. +#[derive(Encode, Decode, Debug, PartialEq, Eq, Clone, TypeInfo)] +#[allow(non_camel_case_types)] +pub enum UtilityCall { + /// `pallet-utility::Call::batch_all` + #[codec(index = 2)] + batch_all(Vec), +} + +/// A minimized version of `pallet-sudo::Call` that can be used without a runtime. +#[derive(Encode, Decode, Debug, PartialEq, Eq, Clone, TypeInfo)] +#[allow(non_camel_case_types)] +pub enum SudoCall { + /// `pallet-sudo::Call::sudo` + #[codec(index = 0)] + sudo(Box), +} + +/// A minimized version of `pallet-xcm::Call`, that can be used without a runtime. +#[derive(Encode, Decode, Debug, PartialEq, Eq, Clone, TypeInfo)] +#[allow(non_camel_case_types)] +pub enum XcmCall { + /// `pallet-xcm::Call::send` + #[codec(index = 0)] + send(Box, Box>), +} diff --git a/bridges/relays/client-substrate/src/chain.rs b/bridges/relays/client-substrate/src/chain.rs new file mode 100644 index 0000000000000000000000000000000000000000..2aba5f5674d97b2bcf8b3e2633c36b6bee52d98a --- /dev/null +++ b/bridges/relays/client-substrate/src/chain.rs @@ -0,0 +1,286 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +use crate::calls::UtilityCall; + +use crate::SimpleRuntimeVersion; +use bp_header_chain::ChainWithGrandpa as ChainWithGrandpaBase; +use bp_messages::ChainWithMessages as ChainWithMessagesBase; +use bp_runtime::{ + Chain as ChainBase, EncodedOrDecodedCall, HashOf, Parachain as ParachainBase, TransactionEra, + TransactionEraOf, UnderlyingChainProvider, +}; +use codec::{Codec, Decode, Encode}; +use jsonrpsee::core::{DeserializeOwned, Serialize}; +use num_traits::Zero; +use sc_transaction_pool_api::TransactionStatus; +use scale_info::TypeInfo; +use sp_core::{storage::StorageKey, Pair}; +use sp_runtime::{ + generic::SignedBlock, + traits::{Block as BlockT, Member}, + ConsensusEngineId, EncodedJustification, +}; +use std::{fmt::Debug, time::Duration}; + +/// Substrate-based chain from minimal relay-client point of view. +pub trait Chain: ChainBase + Clone { + /// Chain name. + const NAME: &'static str; + /// Name of the runtime API method that is returning best known finalized header number + /// and hash (as tuple). + /// + /// Keep in mind that this method is normally provided by the other chain, which is + /// bridged with this chain. + const BEST_FINALIZED_HEADER_ID_METHOD: &'static str; + + /// Average block interval. + /// + /// How often blocks are produced on that chain. It's suggested to set this value + /// to match the block time of the chain. + const AVERAGE_BLOCK_INTERVAL: Duration; + + /// Block type. + type SignedBlock: Member + Serialize + DeserializeOwned + BlockWithJustification; + /// The aggregated `Call` type. + type Call: Clone + Codec + Debug + Send + Sync; +} + +/// Bridge-supported network definition. +/// +/// Used to abstract away CLI commands. +pub trait ChainWithRuntimeVersion: Chain { + /// Current version of the chain runtime, known to relay. + /// + /// can be `None` if relay is not going to submit transactions to that chain. + const RUNTIME_VERSION: Option; +} + +/// Substrate-based relay chain that supports parachains. +/// +/// We assume that the parachains are supported using `runtime_parachains::paras` pallet. +pub trait RelayChain: Chain { + /// Name of the `runtime_parachains::paras` pallet in the runtime of this chain. + const PARAS_PALLET_NAME: &'static str; +} + +/// Substrate-based chain that is using direct GRANDPA finality from minimal relay-client point of +/// view. +/// +/// Keep in mind that parachains are relying on relay chain GRANDPA, so they should not implement +/// this trait. +pub trait ChainWithGrandpa: Chain + ChainWithGrandpaBase { + /// Name of the runtime API method that is returning the GRANDPA info associated with the + /// headers accepted by the `submit_finality_proofs` extrinsic in the queried block. + /// + /// Keep in mind that this method is normally provided by the other chain, which is + /// bridged with this chain. + const SYNCED_HEADERS_GRANDPA_INFO_METHOD: &'static str; + + /// The type of the key owner proof used by the grandpa engine. + type KeyOwnerProof: Decode + TypeInfo + Send; +} + +/// Substrate-based parachain from minimal relay-client point of view. +pub trait Parachain: Chain + ParachainBase {} + +impl Parachain for T where T: UnderlyingChainProvider + Chain + ParachainBase {} + +/// Substrate-based chain with messaging support from minimal relay-client point of view. +pub trait ChainWithMessages: Chain + ChainWithMessagesBase { + // TODO (https://github.com/paritytech/parity-bridges-common/issues/1692): check all the names + // after the issue is fixed - all names must be changed + + /// Name of the bridge relayers pallet (used in `construct_runtime` macro call) that is deployed + /// at some other chain to bridge with this `ChainWithMessages`. + /// + /// We assume that all chains that are bridging with this `ChainWithMessages` are using + /// the same name. + const WITH_CHAIN_RELAYERS_PALLET_NAME: Option<&'static str>; + + /// Name of the `ToOutboundLaneApi::message_details` runtime API method. + /// The method is provided by the runtime that is bridged with this `ChainWithMessages`. + const TO_CHAIN_MESSAGE_DETAILS_METHOD: &'static str; + + /// Name of the `FromInboundLaneApi::message_details` runtime API method. + /// The method is provided by the runtime that is bridged with this `ChainWithMessages`. + const FROM_CHAIN_MESSAGE_DETAILS_METHOD: &'static str; +} + +/// Call type used by the chain. +pub type CallOf = ::Call; +/// Transaction status of the chain. +pub type TransactionStatusOf = TransactionStatus, HashOf>; + +/// Substrate-based chain with `AccountData` generic argument of `frame_system::AccountInfo` set to +/// the `pallet_balances::AccountData`. +pub trait ChainWithBalances: Chain { + /// Return runtime storage key for getting `frame_system::AccountInfo` of given account. + fn account_info_storage_key(account_id: &Self::AccountId) -> StorageKey; +} + +/// SCALE-encoded extrinsic. +pub type EncodedExtrinsic = Vec; + +/// Block with justification. +pub trait BlockWithJustification
{ + /// Return block header. + fn header(&self) -> Header; + /// Return encoded block extrinsics. + fn extrinsics(&self) -> Vec; + /// Return block justification, if known. + fn justification(&self, engine_id: ConsensusEngineId) -> Option<&EncodedJustification>; +} + +/// Transaction before it is signed. +#[derive(Clone, Debug, PartialEq)] +pub struct UnsignedTransaction { + /// Runtime call of this transaction. + pub call: EncodedOrDecodedCall, + /// Transaction nonce. + pub nonce: C::Nonce, + /// Tip included into transaction. + pub tip: C::Balance, + /// Transaction era used by the chain. + pub era: TransactionEraOf, +} + +impl UnsignedTransaction { + /// Create new unsigned transaction with given call, nonce, era and zero tip. + pub fn new(call: EncodedOrDecodedCall, nonce: C::Nonce) -> Self { + Self { call, nonce, era: TransactionEra::Immortal, tip: Zero::zero() } + } + + /// Convert to the transaction of the other compatible chain. + pub fn switch_chain(self) -> UnsignedTransaction + where + Other: Chain< + Nonce = C::Nonce, + Balance = C::Balance, + BlockNumber = C::BlockNumber, + Hash = C::Hash, + >, + { + UnsignedTransaction { + call: EncodedOrDecodedCall::Encoded(self.call.into_encoded()), + nonce: self.nonce, + tip: self.tip, + era: self.era, + } + } + + /// Set transaction tip. + #[must_use] + pub fn tip(mut self, tip: C::Balance) -> Self { + self.tip = tip; + self + } + + /// Set transaction era. + #[must_use] + pub fn era(mut self, era: TransactionEraOf) -> Self { + self.era = era; + self + } +} + +/// Account key pair used by transactions signing scheme. +pub type AccountKeyPairOf = ::AccountKeyPair; + +/// Substrate-based chain transactions signing scheme. +pub trait ChainWithTransactions: Chain { + /// Type of key pairs used to sign transactions. + type AccountKeyPair: Pair + Clone + Send + Sync; + /// Signed transaction. + type SignedTransaction: Clone + Debug + Codec + Send + 'static; + + /// Create transaction for given runtime call, signed by given account. + fn sign_transaction( + param: SignParam, + unsigned: UnsignedTransaction, + ) -> Result + where + Self: Sized; +} + +/// Sign transaction parameters +pub struct SignParam { + /// Version of the runtime specification. + pub spec_version: u32, + /// Transaction version + pub transaction_version: u32, + /// Hash of the genesis block. + pub genesis_hash: HashOf, + /// Signer account + pub signer: AccountKeyPairOf, +} + +impl BlockWithJustification for SignedBlock { + fn header(&self) -> Block::Header { + self.block.header().clone() + } + + fn extrinsics(&self) -> Vec { + self.block.extrinsics().iter().map(Encode::encode).collect() + } + + fn justification(&self, engine_id: ConsensusEngineId) -> Option<&EncodedJustification> { + self.justifications.as_ref().and_then(|j| j.get(engine_id)) + } +} + +/// Trait that provides functionality defined inside `pallet-utility` +pub trait UtilityPallet { + /// Create batch call from given calls vector. + fn build_batch_call(calls: Vec) -> C::Call; +} + +/// Structure that implements `UtilityPalletProvider` based on a full runtime. +pub struct FullRuntimeUtilityPallet { + _phantom: std::marker::PhantomData, +} + +impl UtilityPallet for FullRuntimeUtilityPallet +where + C: Chain, + R: pallet_utility::Config, + ::RuntimeCall: From>, +{ + fn build_batch_call(calls: Vec) -> C::Call { + pallet_utility::Call::batch_all { calls }.into() + } +} + +/// Structure that implements `UtilityPalletProvider` based on a call conversion. +pub struct MockedRuntimeUtilityPallet { + _phantom: std::marker::PhantomData, +} + +impl UtilityPallet for MockedRuntimeUtilityPallet +where + C: Chain, + C::Call: From>, +{ + fn build_batch_call(calls: Vec) -> C::Call { + UtilityCall::batch_all(calls).into() + } +} + +/// Substrate-based chain that uses `pallet-utility`. +pub trait ChainWithUtilityPallet: Chain { + /// The utility pallet provider. + type UtilityPallet: UtilityPallet; +} diff --git a/bridges/relays/client-substrate/src/client.rs b/bridges/relays/client-substrate/src/client.rs new file mode 100644 index 0000000000000000000000000000000000000000..afbda8599b2aa03c4ed4a7c33a93fdd429646516 --- /dev/null +++ b/bridges/relays/client-substrate/src/client.rs @@ -0,0 +1,990 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Substrate node client. + +use crate::{ + chain::{Chain, ChainWithTransactions}, + guard::Environment, + rpc::{ + SubstrateAuthorClient, SubstrateChainClient, SubstrateFinalityClient, + SubstrateFrameSystemClient, SubstrateStateClient, SubstrateSystemClient, + }, + transaction_stall_timeout, AccountKeyPairOf, ChainWithGrandpa, ConnectionParams, Error, HashOf, + HeaderIdOf, Result, SignParam, TransactionTracker, UnsignedTransaction, +}; + +use async_std::sync::{Arc, Mutex, RwLock}; +use async_trait::async_trait; +use bp_runtime::{HeaderIdProvider, StorageDoubleMapKeyProvider, StorageMapKeyProvider}; +use codec::{Decode, Encode}; +use frame_support::weights::Weight; +use futures::{SinkExt, StreamExt}; +use jsonrpsee::{ + core::DeserializeOwned, + ws_client::{WsClient as RpcClient, WsClientBuilder as RpcClientBuilder}, +}; +use num_traits::{Saturating, Zero}; +use pallet_transaction_payment::RuntimeDispatchInfo; +use relay_utils::{relay_loop::RECONNECT_DELAY, STALL_TIMEOUT}; +use sp_core::{ + storage::{StorageData, StorageKey}, + Bytes, Hasher, Pair, +}; +use sp_runtime::{ + traits::Header as HeaderT, + transaction_validity::{TransactionSource, TransactionValidity}, +}; +use sp_trie::StorageProof; +use sp_version::RuntimeVersion; +use std::{cmp::Ordering, future::Future}; + +const SUB_API_GRANDPA_AUTHORITIES: &str = "GrandpaApi_grandpa_authorities"; +const SUB_API_GRANDPA_GENERATE_KEY_OWNERSHIP_PROOF: &str = + "GrandpaApi_generate_key_ownership_proof"; +const SUB_API_TXPOOL_VALIDATE_TRANSACTION: &str = "TaggedTransactionQueue_validate_transaction"; +const SUB_API_TX_PAYMENT_QUERY_INFO: &str = "TransactionPaymentApi_query_info"; +const MAX_SUBSCRIPTION_CAPACITY: usize = 4096; + +/// The difference between best block number and number of its ancestor, that is enough +/// for us to consider that ancestor an "ancient" block with dropped state. +/// +/// The relay does not assume that it is connected to the archive node, so it always tries +/// to use the best available chain state. But sometimes it still may use state of some +/// old block. If the state of that block is already dropped, relay will see errors when +/// e.g. it tries to prove something. +/// +/// By default Substrate-based nodes are storing state for last 256 blocks. We'll use +/// half of this value. +pub const ANCIENT_BLOCK_THRESHOLD: u32 = 128; + +/// Returns `true` if we think that the state is already discarded for given block. +pub fn is_ancient_block + PartialOrd + Saturating>(block: N, best: N) -> bool { + best.saturating_sub(block) >= N::from(ANCIENT_BLOCK_THRESHOLD) +} + +/// Opaque justifications subscription type. +pub struct Subscription(pub(crate) Mutex>>); + +/// Opaque GRANDPA authorities set. +pub type OpaqueGrandpaAuthoritiesSet = Vec; + +/// A simple runtime version. It only includes the `spec_version` and `transaction_version`. +#[derive(Copy, Clone, Debug)] +pub struct SimpleRuntimeVersion { + /// Version of the runtime specification. + pub spec_version: u32, + /// All existing dispatches are fully compatible when this number doesn't change. + pub transaction_version: u32, +} + +impl SimpleRuntimeVersion { + /// Create a new instance of `SimpleRuntimeVersion` from a `RuntimeVersion`. + pub const fn from_runtime_version(runtime_version: &RuntimeVersion) -> Self { + Self { + spec_version: runtime_version.spec_version, + transaction_version: runtime_version.transaction_version, + } + } +} + +/// Chain runtime version in client +#[derive(Copy, Clone, Debug)] +pub enum ChainRuntimeVersion { + /// Auto query from chain. + Auto, + /// Custom runtime version, defined by user. + Custom(SimpleRuntimeVersion), +} + +/// Substrate client type. +/// +/// Cloning `Client` is a cheap operation that only clones internal references. Different +/// clones of the same client are guaranteed to use the same references. +pub struct Client { + // Lock order: `submit_signed_extrinsic_lock`, `data` + /// Client connection params. + params: Arc, + /// Saved chain runtime version. + chain_runtime_version: ChainRuntimeVersion, + /// If several tasks are submitting their transactions simultaneously using + /// `submit_signed_extrinsic` method, they may get the same transaction nonce. So one of + /// transactions will be rejected from the pool. This lock is here to prevent situations like + /// that. + submit_signed_extrinsic_lock: Arc>, + /// Genesis block hash. + genesis_hash: HashOf, + /// Shared dynamic data. + data: Arc>, +} + +/// Client data, shared by all `Client` clones. +struct ClientData { + /// Tokio runtime handle. + tokio: Arc, + /// Substrate RPC client. + client: Arc, +} + +/// Already encoded value. +struct PreEncoded(Vec); + +impl Encode for PreEncoded { + fn encode(&self) -> Vec { + self.0.clone() + } +} + +#[async_trait] +impl relay_utils::relay_loop::Client for Client { + type Error = Error; + + async fn reconnect(&mut self) -> Result<()> { + let mut data = self.data.write().await; + let (tokio, client) = Self::build_client(&self.params).await?; + data.tokio = tokio; + data.client = client; + Ok(()) + } +} + +impl Clone for Client { + fn clone(&self) -> Self { + Client { + params: self.params.clone(), + chain_runtime_version: self.chain_runtime_version, + submit_signed_extrinsic_lock: self.submit_signed_extrinsic_lock.clone(), + genesis_hash: self.genesis_hash, + data: self.data.clone(), + } + } +} + +impl std::fmt::Debug for Client { + fn fmt(&self, fmt: &mut std::fmt::Formatter) -> std::fmt::Result { + fmt.debug_struct("Client").field("genesis_hash", &self.genesis_hash).finish() + } +} + +impl Client { + /// Returns client that is able to call RPCs on Substrate node over websocket connection. + /// + /// This function will keep connecting to given Substrate node until connection is established + /// and is functional. If attempt fail, it will wait for `RECONNECT_DELAY` and retry again. + pub async fn new(params: ConnectionParams) -> Self { + let params = Arc::new(params); + loop { + match Self::try_connect(params.clone()).await { + Ok(client) => return client, + Err(error) => log::error!( + target: "bridge", + "Failed to connect to {} node: {:?}. Going to retry in {}s", + C::NAME, + error, + RECONNECT_DELAY.as_secs(), + ), + } + + async_std::task::sleep(RECONNECT_DELAY).await; + } + } + + /// Try to connect to Substrate node over websocket. Returns Substrate RPC client if connection + /// has been established or error otherwise. + pub async fn try_connect(params: Arc) -> Result { + let (tokio, client) = Self::build_client(¶ms).await?; + + let number: C::BlockNumber = Zero::zero(); + let genesis_hash_client = client.clone(); + let genesis_hash = tokio + .spawn(async move { + SubstrateChainClient::::block_hash(&*genesis_hash_client, Some(number)).await + }) + .await??; + + let chain_runtime_version = params.chain_runtime_version; + let mut client = Self { + params, + chain_runtime_version, + submit_signed_extrinsic_lock: Arc::new(Mutex::new(())), + genesis_hash, + data: Arc::new(RwLock::new(ClientData { tokio, client })), + }; + Self::ensure_correct_runtime_version(&mut client, chain_runtime_version).await?; + Ok(client) + } + + // Check runtime version to understand if we need are connected to expected version, or we + // need to wait for upgrade, we need to abort immediately. + async fn ensure_correct_runtime_version>( + env: &mut E, + expected: ChainRuntimeVersion, + ) -> Result<()> { + // we are only interested if version mode is bundled or passed using CLI + let expected = match expected { + ChainRuntimeVersion::Auto => return Ok(()), + ChainRuntimeVersion::Custom(expected) => expected, + }; + + // we need to wait if actual version is < than expected, we are OK of versions are the + // same and we need to abort if actual version is > than expected + let actual = SimpleRuntimeVersion::from_runtime_version(&env.runtime_version().await?); + match actual.spec_version.cmp(&expected.spec_version) { + Ordering::Less => + Err(Error::WaitingForRuntimeUpgrade { chain: C::NAME.into(), expected, actual }), + Ordering::Equal => Ok(()), + Ordering::Greater => { + log::error!( + target: "bridge", + "The {} client is configured to use runtime version {expected:?} and actual \ + version is {actual:?}. Aborting", + C::NAME, + ); + env.abort().await; + Err(Error::Custom("Aborted".into())) + }, + } + } + + /// Build client to use in connection. + async fn build_client( + params: &ConnectionParams, + ) -> Result<(Arc, Arc)> { + let tokio = tokio::runtime::Runtime::new()?; + + let uri = match params.uri { + Some(ref uri) => uri.clone(), + None => { + format!( + "{}://{}:{}{}", + if params.secure { "wss" } else { "ws" }, + params.host, + params.port, + match params.path { + Some(ref path) => format!("/{}", path), + None => String::new(), + }, + ) + }, + }; + log::info!(target: "bridge", "Connecting to {} node at {}", C::NAME, uri); + + let client = tokio + .spawn(async move { + RpcClientBuilder::default() + .max_buffer_capacity_per_subscription(MAX_SUBSCRIPTION_CAPACITY) + .build(&uri) + .await + }) + .await??; + + Ok((Arc::new(tokio), Arc::new(client))) + } +} + +impl Client { + /// Return simple runtime version, only include `spec_version` and `transaction_version`. + pub async fn simple_runtime_version(&self) -> Result { + Ok(match &self.chain_runtime_version { + ChainRuntimeVersion::Auto => { + let runtime_version = self.runtime_version().await?; + SimpleRuntimeVersion::from_runtime_version(&runtime_version) + }, + ChainRuntimeVersion::Custom(version) => *version, + }) + } + + /// Returns true if client is connected to at least one peer and is in synced state. + pub async fn ensure_synced(&self) -> Result<()> { + self.jsonrpsee_execute(|client| async move { + let health = SubstrateSystemClient::::health(&*client).await?; + let is_synced = !health.is_syncing && (!health.should_have_peers || health.peers > 0); + if is_synced { + Ok(()) + } else { + Err(Error::ClientNotSynced(health)) + } + }) + .await + } + + /// Return hash of the genesis block. + pub fn genesis_hash(&self) -> &C::Hash { + &self.genesis_hash + } + + /// Return hash of the best finalized block. + pub async fn best_finalized_header_hash(&self) -> Result { + self.jsonrpsee_execute(|client| async move { + Ok(SubstrateChainClient::::finalized_head(&*client).await?) + }) + .await + .map_err(|e| Error::FailedToReadBestFinalizedHeaderHash { + chain: C::NAME.into(), + error: e.boxed(), + }) + } + + /// Return number of the best finalized block. + pub async fn best_finalized_header_number(&self) -> Result { + Ok(*self.best_finalized_header().await?.number()) + } + + /// Return header of the best finalized block. + pub async fn best_finalized_header(&self) -> Result { + self.header_by_hash(self.best_finalized_header_hash().await?).await + } + + /// Returns the best Substrate header. + pub async fn best_header(&self) -> Result + where + C::Header: DeserializeOwned, + { + self.jsonrpsee_execute(|client| async move { + Ok(SubstrateChainClient::::header(&*client, None).await?) + }) + .await + .map_err(|e| Error::FailedToReadBestHeader { chain: C::NAME.into(), error: e.boxed() }) + } + + /// Get a Substrate block from its hash. + pub async fn get_block(&self, block_hash: Option) -> Result { + self.jsonrpsee_execute(move |client| async move { + Ok(SubstrateChainClient::::block(&*client, block_hash).await?) + }) + .await + } + + /// Get a Substrate header by its hash. + pub async fn header_by_hash(&self, block_hash: C::Hash) -> Result + where + C::Header: DeserializeOwned, + { + self.jsonrpsee_execute(move |client| async move { + Ok(SubstrateChainClient::::header(&*client, Some(block_hash)).await?) + }) + .await + .map_err(|e| Error::FailedToReadHeaderByHash { + chain: C::NAME.into(), + hash: format!("{block_hash}"), + error: e.boxed(), + }) + } + + /// Get a Substrate block hash by its number. + pub async fn block_hash_by_number(&self, number: C::BlockNumber) -> Result { + self.jsonrpsee_execute(move |client| async move { + Ok(SubstrateChainClient::::block_hash(&*client, Some(number)).await?) + }) + .await + } + + /// Get a Substrate header by its number. + pub async fn header_by_number(&self, block_number: C::BlockNumber) -> Result + where + C::Header: DeserializeOwned, + { + let block_hash = Self::block_hash_by_number(self, block_number).await?; + let header_by_hash = Self::header_by_hash(self, block_hash).await?; + Ok(header_by_hash) + } + + /// Return runtime version. + pub async fn runtime_version(&self) -> Result { + self.jsonrpsee_execute(move |client| async move { + Ok(SubstrateStateClient::::runtime_version(&*client).await?) + }) + .await + } + + /// Read value from runtime storage. + pub async fn storage_value( + &self, + storage_key: StorageKey, + block_hash: Option, + ) -> Result> { + self.raw_storage_value(storage_key, block_hash) + .await? + .map(|encoded_value| { + T::decode(&mut &encoded_value.0[..]).map_err(Error::ResponseParseFailed) + }) + .transpose() + } + + /// Read `MapStorage` value from runtime storage. + pub async fn storage_map_value( + &self, + pallet_prefix: &str, + key: &T::Key, + block_hash: Option, + ) -> Result> { + let storage_key = T::final_key(pallet_prefix, key); + + self.raw_storage_value(storage_key, block_hash) + .await? + .map(|encoded_value| { + T::Value::decode(&mut &encoded_value.0[..]).map_err(Error::ResponseParseFailed) + }) + .transpose() + } + + /// Read `DoubleMapStorage` value from runtime storage. + pub async fn storage_double_map_value( + &self, + pallet_prefix: &str, + key1: &T::Key1, + key2: &T::Key2, + block_hash: Option, + ) -> Result> { + let storage_key = T::final_key(pallet_prefix, key1, key2); + + self.raw_storage_value(storage_key, block_hash) + .await? + .map(|encoded_value| { + T::Value::decode(&mut &encoded_value.0[..]).map_err(Error::ResponseParseFailed) + }) + .transpose() + } + + /// Read raw value from runtime storage. + pub async fn raw_storage_value( + &self, + storage_key: StorageKey, + block_hash: Option, + ) -> Result> { + let cloned_storage_key = storage_key.clone(); + self.jsonrpsee_execute(move |client| async move { + Ok(SubstrateStateClient::::storage(&*client, storage_key.clone(), block_hash) + .await?) + }) + .await + .map_err(|e| Error::FailedToReadRuntimeStorageValue { + chain: C::NAME.into(), + key: cloned_storage_key, + error: e.boxed(), + }) + } + + /// Get the nonce of the given Substrate account. + /// + /// Note: It's the caller's responsibility to make sure `account` is a valid SS58 address. + pub async fn next_account_index(&self, account: C::AccountId) -> Result { + self.jsonrpsee_execute(move |client| async move { + Ok(SubstrateFrameSystemClient::::account_next_index(&*client, account).await?) + }) + .await + } + + /// Submit unsigned extrinsic for inclusion in a block. + /// + /// Note: The given transaction needs to be SCALE encoded beforehand. + pub async fn submit_unsigned_extrinsic(&self, transaction: Bytes) -> Result { + // one last check that the transaction is valid. Most of checks happen in the relay loop and + // it is the "final" check before submission. + let best_header_hash = self.best_header().await?.hash(); + self.validate_transaction(best_header_hash, PreEncoded(transaction.0.clone())) + .await + .map_err(|e| { + log::error!(target: "bridge", "Pre-submit {} transaction validation failed: {:?}", C::NAME, e); + e + })??; + + self.jsonrpsee_execute(move |client| async move { + let tx_hash = SubstrateAuthorClient::::submit_extrinsic(&*client, transaction) + .await + .map_err(|e| { + log::error!(target: "bridge", "Failed to send transaction to {} node: {:?}", C::NAME, e); + e + })?; + log::trace!(target: "bridge", "Sent transaction to {} node: {:?}", C::NAME, tx_hash); + Ok(tx_hash) + }) + .await + } + + async fn build_sign_params(&self, signer: AccountKeyPairOf) -> Result> + where + C: ChainWithTransactions, + { + let runtime_version = self.simple_runtime_version().await?; + Ok(SignParam:: { + spec_version: runtime_version.spec_version, + transaction_version: runtime_version.transaction_version, + genesis_hash: self.genesis_hash, + signer, + }) + } + + /// Submit an extrinsic signed by given account. + /// + /// All calls of this method are synchronized, so there can't be more than one active + /// `submit_signed_extrinsic()` call. This guarantees that no nonces collision may happen + /// if all client instances are clones of the same initial `Client`. + /// + /// Note: The given transaction needs to be SCALE encoded beforehand. + pub async fn submit_signed_extrinsic( + &self, + signer: &AccountKeyPairOf, + prepare_extrinsic: impl FnOnce(HeaderIdOf, C::Nonce) -> Result> + + Send + + 'static, + ) -> Result + where + C: ChainWithTransactions, + C::AccountId: From<::Public>, + { + let _guard = self.submit_signed_extrinsic_lock.lock().await; + let transaction_nonce = self.next_account_index(signer.public().into()).await?; + let best_header = self.best_header().await?; + let signing_data = self.build_sign_params(signer.clone()).await?; + + // By using parent of best block here, we are protecing again best-block reorganizations. + // E.g. transaction may have been submitted when the best block was `A[num=100]`. Then it + // has been changed to `B[num=100]`. Hash of `A` has been included into transaction + // signature payload. So when signature will be checked, the check will fail and transaction + // will be dropped from the pool. + let best_header_id = best_header.parent_id().unwrap_or_else(|| best_header.id()); + + let extrinsic = prepare_extrinsic(best_header_id, transaction_nonce)?; + let signed_extrinsic = C::sign_transaction(signing_data, extrinsic)?.encode(); + + // one last check that the transaction is valid. Most of checks happen in the relay loop and + // it is the "final" check before submission. + self.validate_transaction(best_header_id.1, PreEncoded(signed_extrinsic.clone())) + .await + .map_err(|e| { + log::error!(target: "bridge", "Pre-submit {} transaction validation failed: {:?}", C::NAME, e); + e + })??; + + self.jsonrpsee_execute(move |client| async move { + let tx_hash = + SubstrateAuthorClient::::submit_extrinsic(&*client, Bytes(signed_extrinsic)) + .await + .map_err(|e| { + log::error!(target: "bridge", "Failed to send transaction to {} node: {:?}", C::NAME, e); + e + })?; + log::trace!(target: "bridge", "Sent transaction to {} node: {:?}", C::NAME, tx_hash); + Ok(tx_hash) + }) + .await + } + + /// Does exactly the same as `submit_signed_extrinsic`, but keeps watching for extrinsic status + /// after submission. + pub async fn submit_and_watch_signed_extrinsic( + &self, + signer: &AccountKeyPairOf, + prepare_extrinsic: impl FnOnce(HeaderIdOf, C::Nonce) -> Result> + + Send + + 'static, + ) -> Result> + where + C: ChainWithTransactions, + C::AccountId: From<::Public>, + { + let self_clone = self.clone(); + let signing_data = self.build_sign_params(signer.clone()).await?; + let _guard = self.submit_signed_extrinsic_lock.lock().await; + let transaction_nonce = self.next_account_index(signer.public().into()).await?; + let best_header = self.best_header().await?; + let best_header_id = best_header.id(); + + let extrinsic = prepare_extrinsic(best_header_id, transaction_nonce)?; + let stall_timeout = transaction_stall_timeout( + extrinsic.era.mortality_period(), + C::AVERAGE_BLOCK_INTERVAL, + STALL_TIMEOUT, + ); + let signed_extrinsic = C::sign_transaction(signing_data, extrinsic)?.encode(); + + // one last check that the transaction is valid. Most of checks happen in the relay loop and + // it is the "final" check before submission. + self.validate_transaction(best_header_id.1, PreEncoded(signed_extrinsic.clone())) + .await + .map_err(|e| { + log::error!(target: "bridge", "Pre-submit {} transaction validation failed: {:?}", C::NAME, e); + e + })??; + + let (sender, receiver) = futures::channel::mpsc::channel(MAX_SUBSCRIPTION_CAPACITY); + let (tracker, subscription) = self + .jsonrpsee_execute(move |client| async move { + let tx_hash = C::Hasher::hash(&signed_extrinsic); + let subscription = SubstrateAuthorClient::::submit_and_watch_extrinsic( + &*client, + Bytes(signed_extrinsic), + ) + .await + .map_err(|e| { + log::error!(target: "bridge", "Failed to send transaction to {} node: {:?}", C::NAME, e); + e + })?; + log::trace!(target: "bridge", "Sent transaction to {} node: {:?}", C::NAME, tx_hash); + let tracker = TransactionTracker::new( + self_clone, + stall_timeout, + tx_hash, + Subscription(Mutex::new(receiver)), + ); + Ok((tracker, subscription)) + }) + .await?; + self.data.read().await.tokio.spawn(Subscription::background_worker( + C::NAME.into(), + "extrinsic".into(), + subscription, + sender, + )); + Ok(tracker) + } + + /// Returns pending extrinsics from transaction pool. + pub async fn pending_extrinsics(&self) -> Result> { + self.jsonrpsee_execute(move |client| async move { + Ok(SubstrateAuthorClient::::pending_extrinsics(&*client).await?) + }) + .await + } + + /// Validate transaction at given block state. + pub async fn validate_transaction( + &self, + at_block: C::Hash, + transaction: SignedTransaction, + ) -> Result { + self.jsonrpsee_execute(move |client| async move { + let call = SUB_API_TXPOOL_VALIDATE_TRANSACTION.to_string(); + let data = Bytes((TransactionSource::External, transaction, at_block).encode()); + + let encoded_response = + SubstrateStateClient::::call(&*client, call, data, Some(at_block)).await?; + let validity = TransactionValidity::decode(&mut &encoded_response.0[..]) + .map_err(Error::ResponseParseFailed)?; + + Ok(validity) + }) + .await + } + + /// Returns weight of the given transaction. + pub async fn extimate_extrinsic_weight( + &self, + transaction: SignedTransaction, + ) -> Result { + self.jsonrpsee_execute(move |client| async move { + let transaction_len = transaction.encoded_size() as u32; + + let call = SUB_API_TX_PAYMENT_QUERY_INFO.to_string(); + let data = Bytes((transaction, transaction_len).encode()); + + let encoded_response = + SubstrateStateClient::::call(&*client, call, data, None).await?; + let dispatch_info = + RuntimeDispatchInfo::::decode(&mut &encoded_response.0[..]) + .map_err(Error::ResponseParseFailed)?; + + Ok(dispatch_info.weight) + }) + .await + } + + /// Get the GRANDPA authority set at given block. + pub async fn grandpa_authorities_set( + &self, + block: C::Hash, + ) -> Result { + self.jsonrpsee_execute(move |client| async move { + let call = SUB_API_GRANDPA_AUTHORITIES.to_string(); + let data = Bytes(Vec::new()); + + let encoded_response = + SubstrateStateClient::::call(&*client, call, data, Some(block)).await?; + let authority_list = encoded_response.0; + + Ok(authority_list) + }) + .await + } + + /// Execute runtime call at given block, provided the input and output types. + /// It also performs the input encode and output decode. + pub async fn typed_state_call( + &self, + method_name: String, + input: Input, + at_block: Option, + ) -> Result { + let encoded_output = self + .state_call(method_name.clone(), Bytes(input.encode()), at_block) + .await + .map_err(|e| Error::ErrorExecutingRuntimeCall { + chain: C::NAME.into(), + method: method_name, + error: e.boxed(), + })?; + Output::decode(&mut &encoded_output.0[..]).map_err(Error::ResponseParseFailed) + } + + /// Execute runtime call at given block. + pub async fn state_call( + &self, + method: String, + data: Bytes, + at_block: Option, + ) -> Result { + self.jsonrpsee_execute(move |client| async move { + SubstrateStateClient::::call(&*client, method, data, at_block) + .await + .map_err(Into::into) + }) + .await + } + + /// Returns storage proof of given storage keys. + pub async fn prove_storage( + &self, + keys: Vec, + at_block: C::Hash, + ) -> Result { + self.jsonrpsee_execute(move |client| async move { + SubstrateStateClient::::prove_storage(&*client, keys, Some(at_block)) + .await + .map(|proof| { + StorageProof::new(proof.proof.into_iter().map(|b| b.0).collect::>()) + }) + .map_err(Into::into) + }) + .await + } + + /// Return `tokenDecimals` property from the set of chain properties. + pub async fn token_decimals(&self) -> Result> { + self.jsonrpsee_execute(move |client| async move { + let system_properties = SubstrateSystemClient::::properties(&*client).await?; + Ok(system_properties.get("tokenDecimals").and_then(|v| v.as_u64())) + }) + .await + } + + /// Return new finality justifications stream. + pub async fn subscribe_finality_justifications>( + &self, + ) -> Result> { + let subscription = self + .jsonrpsee_execute(move |client| async move { + Ok(FC::subscribe_justifications(&client).await?) + }) + .await?; + let (sender, receiver) = futures::channel::mpsc::channel(MAX_SUBSCRIPTION_CAPACITY); + self.data.read().await.tokio.spawn(Subscription::background_worker( + C::NAME.into(), + "justification".into(), + subscription, + sender, + )); + Ok(Subscription(Mutex::new(receiver))) + } + + /// Generates a proof of key ownership for the given authority in the given set. + pub async fn generate_grandpa_key_ownership_proof( + &self, + at: HashOf, + set_id: sp_consensus_grandpa::SetId, + authority_id: sp_consensus_grandpa::AuthorityId, + ) -> Result> + where + C: ChainWithGrandpa, + { + self.typed_state_call( + SUB_API_GRANDPA_GENERATE_KEY_OWNERSHIP_PROOF.into(), + (set_id, authority_id), + Some(at), + ) + .await + } + + /// Execute jsonrpsee future in tokio context. + async fn jsonrpsee_execute(&self, make_jsonrpsee_future: MF) -> Result + where + MF: FnOnce(Arc) -> F + Send + 'static, + F: Future> + Send + 'static, + T: Send + 'static, + { + let data = self.data.read().await; + let client = data.client.clone(); + data.tokio.spawn(make_jsonrpsee_future(client)).await? + } + + /// Returns `true` if version guard can be started. + /// + /// There's no reason to run version guard when version mode is set to `Auto`. It can + /// lead to relay shutdown when chain is upgraded, even though we have explicitly + /// said that we don't want to shutdown. + pub fn can_start_version_guard(&self) -> bool { + !matches!(self.chain_runtime_version, ChainRuntimeVersion::Auto) + } +} + +impl Subscription { + /// Consumes subscription and returns future statuses stream. + pub fn into_stream(self) -> impl futures::Stream { + futures::stream::unfold(self, |this| async { + let item = this.0.lock().await.next().await.unwrap_or(None); + item.map(|i| (i, this)) + }) + } + + /// Return next item from the subscription. + pub async fn next(&self) -> Result> { + let mut receiver = self.0.lock().await; + let item = receiver.next().await; + Ok(item.unwrap_or(None)) + } + + /// Background worker that is executed in tokio context as `jsonrpsee` requires. + async fn background_worker( + chain_name: String, + item_type: String, + mut subscription: jsonrpsee::core::client::Subscription, + mut sender: futures::channel::mpsc::Sender>, + ) { + loop { + match subscription.next().await { + Some(Ok(item)) => + if sender.send(Some(item)).await.is_err() { + break + }, + Some(Err(e)) => { + log::trace!( + target: "bridge", + "{} {} subscription stream has returned '{:?}'. Stream needs to be restarted.", + chain_name, + item_type, + e, + ); + let _ = sender.send(None).await; + break + }, + None => { + log::trace!( + target: "bridge", + "{} {} subscription stream has returned None. Stream needs to be restarted.", + chain_name, + item_type, + ); + let _ = sender.send(None).await; + break + }, + } + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::{guard::tests::TestEnvironment, test_chain::TestChain}; + use futures::{channel::mpsc::unbounded, FutureExt}; + + async fn run_ensure_correct_runtime_version( + expected: ChainRuntimeVersion, + actual: RuntimeVersion, + ) -> Result<()> { + let ( + (mut runtime_version_tx, runtime_version_rx), + (slept_tx, _slept_rx), + (aborted_tx, mut aborted_rx), + ) = (unbounded(), unbounded(), unbounded()); + runtime_version_tx.send(actual).await.unwrap(); + let mut env = TestEnvironment { runtime_version_rx, slept_tx, aborted_tx }; + + let ensure_correct_runtime_version = + Client::::ensure_correct_runtime_version(&mut env, expected).boxed(); + let aborted = aborted_rx.next().map(|_| Err(Error::Custom("".into()))).boxed(); + futures::pin_mut!(ensure_correct_runtime_version, aborted); + futures::future::select(ensure_correct_runtime_version, aborted) + .await + .into_inner() + .0 + } + + #[async_std::test] + async fn ensure_correct_runtime_version_works() { + // when we are configured to use auto version + assert!(matches!( + run_ensure_correct_runtime_version( + ChainRuntimeVersion::Auto, + RuntimeVersion { + spec_version: 100, + transaction_version: 100, + ..Default::default() + }, + ) + .await, + Ok(()), + )); + // when actual == expected + assert!(matches!( + run_ensure_correct_runtime_version( + ChainRuntimeVersion::Custom(SimpleRuntimeVersion { + spec_version: 100, + transaction_version: 100 + }), + RuntimeVersion { + spec_version: 100, + transaction_version: 100, + ..Default::default() + }, + ) + .await, + Ok(()), + )); + // when actual spec version < expected spec version + assert!(matches!( + run_ensure_correct_runtime_version( + ChainRuntimeVersion::Custom(SimpleRuntimeVersion { + spec_version: 100, + transaction_version: 100 + }), + RuntimeVersion { spec_version: 99, transaction_version: 100, ..Default::default() }, + ) + .await, + Err(Error::WaitingForRuntimeUpgrade { + expected: SimpleRuntimeVersion { spec_version: 100, transaction_version: 100 }, + actual: SimpleRuntimeVersion { spec_version: 99, transaction_version: 100 }, + .. + }), + )); + // when actual spec version > expected spec version + assert!(matches!( + run_ensure_correct_runtime_version( + ChainRuntimeVersion::Custom(SimpleRuntimeVersion { + spec_version: 100, + transaction_version: 100 + }), + RuntimeVersion { + spec_version: 101, + transaction_version: 100, + ..Default::default() + }, + ) + .await, + Err(Error::Custom(_)), + )); + } +} diff --git a/bridges/relays/client-substrate/src/error.rs b/bridges/relays/client-substrate/src/error.rs new file mode 100644 index 0000000000000000000000000000000000000000..0b446681818879d662ba9a71679a799519cf491b --- /dev/null +++ b/bridges/relays/client-substrate/src/error.rs @@ -0,0 +1,165 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Substrate node RPC errors. + +use crate::SimpleRuntimeVersion; +use bp_polkadot_core::parachains::ParaId; +use jsonrpsee::core::ClientError as RpcError; +use relay_utils::MaybeConnectionError; +use sc_rpc_api::system::Health; +use sp_core::storage::StorageKey; +use sp_runtime::transaction_validity::TransactionValidityError; +use thiserror::Error; + +/// Result type used by Substrate client. +pub type Result = std::result::Result; + +/// Errors that can occur only when interacting with +/// a Substrate node through RPC. +#[derive(Error, Debug)] +pub enum Error { + /// IO error. + #[error("IO error: {0}")] + Io(#[from] std::io::Error), + /// An error that can occur when making a request to + /// an JSON-RPC server. + #[error("RPC error: {0}")] + RpcError(#[from] RpcError), + /// The response from the server could not be SCALE decoded. + #[error("Response parse failed: {0}")] + ResponseParseFailed(#[from] codec::Error), + /// Account does not exist on the chain. + #[error("Account does not exist on the chain.")] + AccountDoesNotExist, + /// Runtime storage is missing some mandatory value. + #[error("Mandatory storage value is missing from the runtime storage.")] + MissingMandatoryStorageValue, + /// Required parachain head is not present at the relay chain. + #[error("Parachain {0:?} head {1} is missing from the relay chain storage.")] + MissingRequiredParachainHead(ParaId, u64), + /// Failed to find finality proof for the given header. + #[error("Failed to find finality proof for header {0}.")] + FinalityProofNotFound(u64), + /// The client we're connected to is not synced, so we can't rely on its state. + #[error("Substrate client is not synced {0}.")] + ClientNotSynced(Health), + /// Failed to read best finalized header hash from given chain. + #[error("Failed to read best finalized header hash of {chain}: {error:?}.")] + FailedToReadBestFinalizedHeaderHash { + /// Name of the chain where the error has happened. + chain: String, + /// Underlying error. + error: Box, + }, + /// Failed to read best finalized header from given chain. + #[error("Failed to read best header of {chain}: {error:?}.")] + FailedToReadBestHeader { + /// Name of the chain where the error has happened. + chain: String, + /// Underlying error. + error: Box, + }, + /// Failed to read header by hash from given chain. + #[error("Failed to read header {hash} of {chain}: {error:?}.")] + FailedToReadHeaderByHash { + /// Name of the chain where the error has happened. + chain: String, + /// Hash of the header we've tried to read. + hash: String, + /// Underlying error. + error: Box, + }, + /// Failed to execute runtime call at given chain. + #[error("Failed to execute runtime call {method} at {chain}: {error:?}.")] + ErrorExecutingRuntimeCall { + /// Name of the chain where the error has happened. + chain: String, + /// Runtime method name. + method: String, + /// Underlying error. + error: Box, + }, + /// Failed to read sotrage value at given chain. + #[error("Failed to read storage value {key:?} at {chain}: {error:?}.")] + FailedToReadRuntimeStorageValue { + /// Name of the chain where the error has happened. + chain: String, + /// Runtime storage key + key: StorageKey, + /// Underlying error. + error: Box, + }, + /// The bridge pallet is halted and all transactions will be rejected. + #[error("Bridge pallet is halted.")] + BridgePalletIsHalted, + /// The bridge pallet is not yet initialized and all transactions will be rejected. + #[error("Bridge pallet is not initialized.")] + BridgePalletIsNotInitialized, + /// There's no best head of the parachain at the `pallet-bridge-parachains` at the target side. + #[error("No head of the ParaId({0}) at the bridge parachains pallet at {1}.")] + NoParachainHeadAtTarget(u32, String), + /// An error has happened when we have tried to parse storage proof. + #[error("Error when parsing storage proof: {0:?}.")] + StorageProofError(bp_runtime::StorageProofError), + /// The Substrate transaction is invalid. + #[error("Substrate transaction is invalid: {0:?}")] + TransactionInvalid(#[from] TransactionValidityError), + /// The client is configured to use newer runtime version than the connected chain uses. + /// The client will keep waiting until chain is upgraded to given version. + #[error("Waiting for {chain} runtime upgrade: expected {expected:?} actual {actual:?}")] + WaitingForRuntimeUpgrade { + /// Name of the chain where the error has happened. + chain: String, + /// Expected runtime version. + expected: SimpleRuntimeVersion, + /// Actual runtime version. + actual: SimpleRuntimeVersion, + }, + /// Custom logic error. + #[error("{0}")] + Custom(String), +} + +impl From for Error { + fn from(error: tokio::task::JoinError) -> Self { + Error::Custom(format!("Failed to wait tokio task: {error}")) + } +} + +impl Error { + /// Box the error. + pub fn boxed(self) -> Box { + Box::new(self) + } +} + +impl MaybeConnectionError for Error { + fn is_connection_error(&self) -> bool { + match *self { + Error::RpcError(RpcError::Transport(_)) | + Error::RpcError(RpcError::RestartNeeded(_)) | + Error::ClientNotSynced(_) => true, + Error::FailedToReadBestFinalizedHeaderHash { ref error, .. } => + error.is_connection_error(), + Error::FailedToReadBestHeader { ref error, .. } => error.is_connection_error(), + Error::FailedToReadHeaderByHash { ref error, .. } => error.is_connection_error(), + Error::ErrorExecutingRuntimeCall { ref error, .. } => error.is_connection_error(), + Error::FailedToReadRuntimeStorageValue { ref error, .. } => error.is_connection_error(), + _ => false, + } + } +} diff --git a/bridges/relays/client-substrate/src/guard.rs b/bridges/relays/client-substrate/src/guard.rs new file mode 100644 index 0000000000000000000000000000000000000000..47454892cd039f40e92a8f25db435698360bde9b --- /dev/null +++ b/bridges/relays/client-substrate/src/guard.rs @@ -0,0 +1,196 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Pallet provides a set of guard functions that are running in background threads +//! and are aborting process if some condition fails. + +use crate::{error::Error, Chain, Client}; + +use async_trait::async_trait; +use sp_version::RuntimeVersion; +use std::{ + fmt::Display, + time::{Duration, Instant}, +}; + +/// Guards environment. +#[async_trait] +pub trait Environment: Send + Sync + 'static { + /// Error type. + type Error: Display + Send + Sync + 'static; + + /// Return current runtime version. + async fn runtime_version(&mut self) -> Result; + + /// Return current time. + fn now(&self) -> Instant { + Instant::now() + } + + /// Sleep given amount of time. + async fn sleep(&mut self, duration: Duration) { + async_std::task::sleep(duration).await + } + + /// Abort current process. Called when guard condition check fails. + async fn abort(&mut self) { + std::process::abort(); + } +} + +/// Abort when runtime spec version is different from specified. +pub fn abort_on_spec_version_change( + mut env: impl Environment, + expected_spec_version: u32, +) { + async_std::task::spawn(async move { + log::info!( + target: "bridge-guard", + "Starting spec_version guard for {}. Expected spec_version: {}", + C::NAME, + expected_spec_version, + ); + + loop { + let actual_spec_version = env.runtime_version().await; + match actual_spec_version { + Ok(version) if version.spec_version == expected_spec_version => (), + Ok(version) => { + log::error!( + target: "bridge-guard", + "{} runtime spec version has changed from {} to {}. Aborting relay", + C::NAME, + expected_spec_version, + version.spec_version, + ); + + env.abort().await; + }, + Err(error) => log::warn!( + target: "bridge-guard", + "Failed to read {} runtime version: {}. Relay may need to be stopped manually", + C::NAME, + error, + ), + } + + env.sleep(conditions_check_delay::()).await; + } + }); +} + +/// Delay between conditions check. +fn conditions_check_delay() -> Duration { + C::AVERAGE_BLOCK_INTERVAL * (10 + rand::random::() % 10) +} + +#[async_trait] +impl Environment for Client { + type Error = Error; + + async fn runtime_version(&mut self) -> Result { + Client::::runtime_version(self).await + } +} + +#[cfg(test)] +pub(crate) mod tests { + use super::*; + use crate::test_chain::TestChain; + use futures::{ + channel::mpsc::{unbounded, UnboundedReceiver, UnboundedSender}, + future::FutureExt, + stream::StreamExt, + SinkExt, + }; + + pub struct TestEnvironment { + pub runtime_version_rx: UnboundedReceiver, + pub slept_tx: UnboundedSender<()>, + pub aborted_tx: UnboundedSender<()>, + } + + #[async_trait] + impl Environment for TestEnvironment { + type Error = Error; + + async fn runtime_version(&mut self) -> Result { + Ok(self.runtime_version_rx.next().await.unwrap_or_default()) + } + + async fn sleep(&mut self, _duration: Duration) { + let _ = self.slept_tx.send(()).await; + } + + async fn abort(&mut self) { + let _ = self.aborted_tx.send(()).await; + // simulate process abort :) + async_std::task::sleep(Duration::from_secs(60)).await; + } + } + + #[test] + fn aborts_when_spec_version_is_changed() { + async_std::task::block_on(async { + let ( + (mut runtime_version_tx, runtime_version_rx), + (slept_tx, mut slept_rx), + (aborted_tx, mut aborted_rx), + ) = (unbounded(), unbounded(), unbounded()); + abort_on_spec_version_change( + TestEnvironment { runtime_version_rx, slept_tx, aborted_tx }, + 0, + ); + + // client responds with wrong version + runtime_version_tx + .send(RuntimeVersion { spec_version: 42, ..Default::default() }) + .await + .unwrap(); + + // then the `abort` function is called + aborted_rx.next().await; + // and we do not reach the `sleep` function call + assert!(slept_rx.next().now_or_never().is_none()); + }); + } + + #[test] + fn does_not_aborts_when_spec_version_is_unchanged() { + async_std::task::block_on(async { + let ( + (mut runtime_version_tx, runtime_version_rx), + (slept_tx, mut slept_rx), + (aborted_tx, mut aborted_rx), + ) = (unbounded(), unbounded(), unbounded()); + abort_on_spec_version_change( + TestEnvironment { runtime_version_rx, slept_tx, aborted_tx }, + 42, + ); + + // client responds with the same version + runtime_version_tx + .send(RuntimeVersion { spec_version: 42, ..Default::default() }) + .await + .unwrap(); + + // then the `sleep` function is called + slept_rx.next().await; + // and the `abort` function is not called + assert!(aborted_rx.next().now_or_never().is_none()); + }); + } +} diff --git a/bridges/relays/client-substrate/src/lib.rs b/bridges/relays/client-substrate/src/lib.rs new file mode 100644 index 0000000000000000000000000000000000000000..d5b8d4dcced2d8b2e1883b6779905c536eec49f1 --- /dev/null +++ b/bridges/relays/client-substrate/src/lib.rs @@ -0,0 +1,101 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Tools to interact with Substrate node using RPC methods. + +#![warn(missing_docs)] + +mod chain; +mod client; +mod error; +mod rpc; +mod sync_header; +mod transaction_tracker; + +pub mod calls; +pub mod guard; +pub mod metrics; +pub mod test_chain; + +use std::time::Duration; + +pub use crate::{ + chain::{ + AccountKeyPairOf, BlockWithJustification, CallOf, Chain, ChainWithBalances, + ChainWithGrandpa, ChainWithMessages, ChainWithRuntimeVersion, ChainWithTransactions, + ChainWithUtilityPallet, FullRuntimeUtilityPallet, MockedRuntimeUtilityPallet, Parachain, + RelayChain, SignParam, TransactionStatusOf, UnsignedTransaction, UtilityPallet, + }, + client::{ + is_ancient_block, ChainRuntimeVersion, Client, OpaqueGrandpaAuthoritiesSet, + SimpleRuntimeVersion, Subscription, ANCIENT_BLOCK_THRESHOLD, + }, + error::{Error, Result}, + rpc::{SubstrateBeefyFinalityClient, SubstrateFinalityClient, SubstrateGrandpaFinalityClient}, + sync_header::SyncHeader, + transaction_tracker::TransactionTracker, +}; +pub use bp_runtime::{ + AccountIdOf, AccountPublicOf, BalanceOf, BlockNumberOf, Chain as ChainBase, HashOf, HeaderIdOf, + HeaderOf, NonceOf, Parachain as ParachainBase, SignatureOf, TransactionEra, TransactionEraOf, + UnderlyingChainProvider, +}; + +/// Substrate-over-websocket connection params. +#[derive(Debug, Clone)] +pub struct ConnectionParams { + /// Websocket endpoint URL. Overrides all other URL components (`host`, `port`, `path` and + /// `secure`). + pub uri: Option, + /// Websocket server host name. + pub host: String, + /// Websocket server TCP port. + pub port: u16, + /// Websocket endpoint path at server. + pub path: Option, + /// Use secure websocket connection. + pub secure: bool, + /// Defined chain runtime version + pub chain_runtime_version: ChainRuntimeVersion, +} + +impl Default for ConnectionParams { + fn default() -> Self { + ConnectionParams { + uri: None, + host: "localhost".into(), + port: 9944, + path: None, + secure: false, + chain_runtime_version: ChainRuntimeVersion::Auto, + } + } +} + +/// Returns stall timeout for relay loop. +/// +/// Relay considers himself stalled if he has submitted transaction to the node, but it has not +/// been mined for this period. +pub fn transaction_stall_timeout( + mortality_period: Option, + average_block_interval: Duration, + default_stall_timeout: Duration, +) -> Duration { + // 1 extra block for transaction to reach the pool && 1 for relayer to awake after it is mined + mortality_period + .map(|mortality_period| average_block_interval.saturating_mul(mortality_period + 1 + 1)) + .unwrap_or(default_stall_timeout) +} diff --git a/bridges/relays/client-substrate/src/metrics/float_storage_value.rs b/bridges/relays/client-substrate/src/metrics/float_storage_value.rs new file mode 100644 index 0000000000000000000000000000000000000000..7bb92693b38d27f42b623d323ba3e7ced8ebbda2 --- /dev/null +++ b/bridges/relays/client-substrate/src/metrics/float_storage_value.rs @@ -0,0 +1,133 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +use crate::{chain::Chain, client::Client, Error as SubstrateError}; + +use async_std::sync::{Arc, RwLock}; +use async_trait::async_trait; +use codec::Decode; +use num_traits::One; +use relay_utils::metrics::{ + metric_name, register, F64SharedRef, Gauge, Metric, PrometheusError, Registry, + StandaloneMetric, F64, +}; +use sp_core::storage::{StorageData, StorageKey}; +use sp_runtime::{traits::UniqueSaturatedInto, FixedPointNumber, FixedU128}; +use std::{marker::PhantomData, time::Duration}; + +/// Storage value update interval (in blocks). +const UPDATE_INTERVAL_IN_BLOCKS: u32 = 5; + +/// Fied-point storage value and the way it is decoded from the raw storage value. +pub trait FloatStorageValue: 'static + Clone + Send + Sync { + /// Type of the value. + type Value: FixedPointNumber; + /// Try to decode value from the raw storage value. + fn decode( + &self, + maybe_raw_value: Option, + ) -> Result, SubstrateError>; +} + +/// Implementation of `FloatStorageValue` that expects encoded `FixedU128` value and returns `1` if +/// value is missing from the storage. +#[derive(Clone, Debug, Default)] +pub struct FixedU128OrOne; + +impl FloatStorageValue for FixedU128OrOne { + type Value = FixedU128; + + fn decode( + &self, + maybe_raw_value: Option, + ) -> Result, SubstrateError> { + maybe_raw_value + .map(|raw_value| { + FixedU128::decode(&mut &raw_value.0[..]) + .map_err(SubstrateError::ResponseParseFailed) + .map(Some) + }) + .unwrap_or_else(|| Ok(Some(FixedU128::one()))) + } +} + +/// Metric that represents fixed-point runtime storage value as float gauge. +#[derive(Clone, Debug)] +pub struct FloatStorageValueMetric { + value_converter: V, + client: Client, + storage_key: StorageKey, + metric: Gauge, + shared_value_ref: F64SharedRef, + _phantom: PhantomData, +} + +impl FloatStorageValueMetric { + /// Create new metric. + pub fn new( + value_converter: V, + client: Client, + storage_key: StorageKey, + name: String, + help: String, + ) -> Result { + let shared_value_ref = Arc::new(RwLock::new(None)); + Ok(FloatStorageValueMetric { + value_converter, + client, + storage_key, + metric: Gauge::new(metric_name(None, &name), help)?, + shared_value_ref, + _phantom: Default::default(), + }) + } + + /// Get shared reference to metric value. + pub fn shared_value_ref(&self) -> F64SharedRef { + self.shared_value_ref.clone() + } +} + +impl Metric for FloatStorageValueMetric { + fn register(&self, registry: &Registry) -> Result<(), PrometheusError> { + register(self.metric.clone(), registry).map(drop) + } +} + +#[async_trait] +impl StandaloneMetric for FloatStorageValueMetric { + fn update_interval(&self) -> Duration { + C::AVERAGE_BLOCK_INTERVAL * UPDATE_INTERVAL_IN_BLOCKS + } + + async fn update(&self) { + let value = self + .client + .raw_storage_value(self.storage_key.clone(), None) + .await + .and_then(|maybe_storage_value| { + self.value_converter.decode(maybe_storage_value).map(|maybe_fixed_point_value| { + maybe_fixed_point_value.map(|fixed_point_value| { + fixed_point_value.into_inner().unique_saturated_into() as f64 / + V::Value::DIV.unique_saturated_into() as f64 + }) + }) + }) + .map_err(|e| e.to_string()); + relay_utils::metrics::set_gauge_value(&self.metric, value.clone()); + *self.shared_value_ref.write().await = value.ok().and_then(|x| x); + } +} diff --git a/bridges/relays/client-substrate/src/metrics/mod.rs b/bridges/relays/client-substrate/src/metrics/mod.rs new file mode 100644 index 0000000000000000000000000000000000000000..fe200e2d3dca7ea84a41e61f18912acc0d3f4332 --- /dev/null +++ b/bridges/relays/client-substrate/src/metrics/mod.rs @@ -0,0 +1,21 @@ +// Copyright 2019-2020 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Contains several Substrate-specific metrics that may be exposed by relay. + +pub use float_storage_value::{FixedU128OrOne, FloatStorageValue, FloatStorageValueMetric}; + +mod float_storage_value; diff --git a/bridges/relays/client-substrate/src/rpc.rs b/bridges/relays/client-substrate/src/rpc.rs new file mode 100644 index 0000000000000000000000000000000000000000..60c29cdeb5c7707619b65d23800dcd7dfdfd840a --- /dev/null +++ b/bridges/relays/client-substrate/src/rpc.rs @@ -0,0 +1,176 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! The most generic Substrate node RPC interface. + +use async_trait::async_trait; + +use crate::{Chain, ChainWithGrandpa, TransactionStatusOf}; + +use jsonrpsee::{ + core::{client::Subscription, ClientError}, + proc_macros::rpc, + ws_client::WsClient, +}; +use pallet_transaction_payment_rpc_runtime_api::FeeDetails; +use sc_rpc_api::{state::ReadProof, system::Health}; +use sp_core::{ + storage::{StorageData, StorageKey}, + Bytes, +}; +use sp_rpc::number::NumberOrHex; +use sp_version::RuntimeVersion; + +/// RPC methods of Substrate `system` namespace, that we are using. +#[rpc(client, client_bounds(C: Chain), namespace = "system")] +pub(crate) trait SubstrateSystem { + /// Return node health. + #[method(name = "health")] + async fn health(&self) -> RpcResult; + /// Return system properties. + #[method(name = "properties")] + async fn properties(&self) -> RpcResult; +} + +/// RPC methods of Substrate `chain` namespace, that we are using. +#[rpc(client, client_bounds(C: Chain), namespace = "chain")] +pub(crate) trait SubstrateChain { + /// Get block hash by its number. + #[method(name = "getBlockHash")] + async fn block_hash(&self, block_number: Option) -> RpcResult; + /// Return block header by its hash. + #[method(name = "getHeader")] + async fn header(&self, block_hash: Option) -> RpcResult; + /// Return best finalized block hash. + #[method(name = "getFinalizedHead")] + async fn finalized_head(&self) -> RpcResult; + /// Return signed block (with justifications) by its hash. + #[method(name = "getBlock")] + async fn block(&self, block_hash: Option) -> RpcResult; +} + +/// RPC methods of Substrate `author` namespace, that we are using. +#[rpc(client, client_bounds(C: Chain), namespace = "author")] +pub(crate) trait SubstrateAuthor { + /// Submit extrinsic to the transaction pool. + #[method(name = "submitExtrinsic")] + async fn submit_extrinsic(&self, extrinsic: Bytes) -> RpcResult; + /// Return vector of pending extrinsics from the transaction pool. + #[method(name = "pendingExtrinsics")] + async fn pending_extrinsics(&self) -> RpcResult>; + /// Submit and watch for extrinsic state. + #[subscription(name = "submitAndWatchExtrinsic", unsubscribe = "unwatchExtrinsic", item = TransactionStatusOf)] + async fn submit_and_watch_extrinsic(&self, extrinsic: Bytes); +} + +/// RPC methods of Substrate `state` namespace, that we are using. +#[rpc(client, client_bounds(C: Chain), namespace = "state")] +pub(crate) trait SubstrateState { + /// Get current runtime version. + #[method(name = "getRuntimeVersion")] + async fn runtime_version(&self) -> RpcResult; + /// Call given runtime method. + #[method(name = "call")] + async fn call( + &self, + method: String, + data: Bytes, + at_block: Option, + ) -> RpcResult; + /// Get value of the runtime storage. + #[method(name = "getStorage")] + async fn storage( + &self, + key: StorageKey, + at_block: Option, + ) -> RpcResult>; + /// Get proof of the runtime storage value. + #[method(name = "getReadProof")] + async fn prove_storage( + &self, + keys: Vec, + hash: Option, + ) -> RpcResult>; +} + +/// RPC methods that we are using for a certain finality gadget. +#[async_trait] +pub trait SubstrateFinalityClient { + /// Subscribe to finality justifications. + async fn subscribe_justifications( + client: &WsClient, + ) -> Result, ClientError>; +} + +/// RPC methods of Substrate `grandpa` namespace, that we are using. +#[rpc(client, client_bounds(C: ChainWithGrandpa), namespace = "grandpa")] +pub(crate) trait SubstrateGrandpa { + /// Subscribe to GRANDPA justifications. + #[subscription(name = "subscribeJustifications", unsubscribe = "unsubscribeJustifications", item = Bytes)] + async fn subscribe_justifications(&self); +} + +/// RPC finality methods of Substrate `grandpa` namespace, that we are using. +pub struct SubstrateGrandpaFinalityClient; +#[async_trait] +impl SubstrateFinalityClient for SubstrateGrandpaFinalityClient { + async fn subscribe_justifications( + client: &WsClient, + ) -> Result, ClientError> { + SubstrateGrandpaClient::::subscribe_justifications(client).await + } +} + +// TODO: Use `ChainWithBeefy` instead of `Chain` after #1606 is merged +/// RPC methods of Substrate `beefy` namespace, that we are using. +#[rpc(client, client_bounds(C: Chain), namespace = "beefy")] +pub(crate) trait SubstrateBeefy { + /// Subscribe to BEEFY justifications. + #[subscription(name = "subscribeJustifications", unsubscribe = "unsubscribeJustifications", item = Bytes)] + async fn subscribe_justifications(&self); +} + +/// RPC finality methods of Substrate `beefy` namespace, that we are using. +pub struct SubstrateBeefyFinalityClient; +// TODO: Use `ChainWithBeefy` instead of `Chain` after #1606 is merged +#[async_trait] +impl SubstrateFinalityClient for SubstrateBeefyFinalityClient { + async fn subscribe_justifications( + client: &WsClient, + ) -> Result, ClientError> { + SubstrateBeefyClient::::subscribe_justifications(client).await + } +} + +/// RPC methods of Substrate `system` frame pallet, that we are using. +#[rpc(client, client_bounds(C: Chain), namespace = "system")] +pub(crate) trait SubstrateFrameSystem { + /// Return index of next account transaction. + #[method(name = "accountNextIndex")] + async fn account_next_index(&self, account_id: C::AccountId) -> RpcResult; +} + +/// RPC methods of Substrate `pallet_transaction_payment` frame pallet, that we are using. +#[rpc(client, client_bounds(C: Chain), namespace = "payment")] +pub(crate) trait SubstrateTransactionPayment { + /// Query transaction fee details. + #[method(name = "queryFeeDetails")] + async fn fee_details( + &self, + extrinsic: Bytes, + at_block: Option, + ) -> RpcResult>; +} diff --git a/bridges/relays/client-substrate/src/sync_header.rs b/bridges/relays/client-substrate/src/sync_header.rs new file mode 100644 index 0000000000000000000000000000000000000000..fdfd1f22ce9edf9311e2ae827baf0f2a8fffbe20 --- /dev/null +++ b/bridges/relays/client-substrate/src/sync_header.rs @@ -0,0 +1,61 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +use bp_header_chain::ConsensusLogReader; +use finality_relay::SourceHeader as FinalitySourceHeader; +use sp_runtime::traits::Header as HeaderT; + +/// Generic wrapper for `sp_runtime::traits::Header` based headers, that +/// implements `finality_relay::SourceHeader` and may be used in headers sync directly. +#[derive(Clone, Debug, PartialEq)] +pub struct SyncHeader
(Header); + +impl
SyncHeader
{ + /// Extracts wrapped header from self. + pub fn into_inner(self) -> Header { + self.0 + } +} + +impl
std::ops::Deref for SyncHeader
{ + type Target = Header; + + fn deref(&self) -> &Self::Target { + &self.0 + } +} + +impl
From
for SyncHeader
{ + fn from(header: Header) -> Self { + Self(header) + } +} + +impl FinalitySourceHeader + for SyncHeader
+{ + fn hash(&self) -> Header::Hash { + self.0.hash() + } + + fn number(&self) -> Header::Number { + *self.0.number() + } + + fn is_mandatory(&self) -> bool { + R::schedules_authorities_change(self.digest()) + } +} diff --git a/bridges/relays/client-substrate/src/test_chain.rs b/bridges/relays/client-substrate/src/test_chain.rs new file mode 100644 index 0000000000000000000000000000000000000000..77240d15884f4512458772b16f14f27b44f57f39 --- /dev/null +++ b/bridges/relays/client-substrate/src/test_chain.rs @@ -0,0 +1,132 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Pallet provides a set of guard functions that are running in background threads +//! and are aborting process if some condition fails. + +//! Test chain implementation to use in tests. + +#![cfg(any(feature = "test-helpers", test))] + +use crate::{Chain, ChainWithBalances, ChainWithMessages}; +use bp_messages::{ChainWithMessages as ChainWithMessagesBase, MessageNonce}; +use bp_runtime::ChainId; +use frame_support::weights::Weight; +use std::time::Duration; + +/// Chain that may be used in tests. +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct TestChain; + +impl bp_runtime::Chain for TestChain { + const ID: ChainId = *b"test"; + + type BlockNumber = u32; + type Hash = sp_core::H256; + type Hasher = sp_runtime::traits::BlakeTwo256; + type Header = sp_runtime::generic::Header; + + type AccountId = u32; + type Balance = u32; + type Nonce = u32; + type Signature = sp_runtime::testing::TestSignature; + + fn max_extrinsic_size() -> u32 { + 100000 + } + + fn max_extrinsic_weight() -> Weight { + unreachable!() + } +} + +impl Chain for TestChain { + const NAME: &'static str = "Test"; + const BEST_FINALIZED_HEADER_ID_METHOD: &'static str = "TestMethod"; + const AVERAGE_BLOCK_INTERVAL: Duration = Duration::from_millis(0); + + type SignedBlock = sp_runtime::generic::SignedBlock< + sp_runtime::generic::Block, + >; + type Call = (); +} + +impl ChainWithBalances for TestChain { + fn account_info_storage_key(_account_id: &u32) -> sp_core::storage::StorageKey { + unreachable!() + } +} + +impl ChainWithMessagesBase for TestChain { + const WITH_CHAIN_MESSAGES_PALLET_NAME: &'static str = "Test"; + const MAX_UNREWARDED_RELAYERS_IN_CONFIRMATION_TX: MessageNonce = 0; + const MAX_UNCONFIRMED_MESSAGES_IN_CONFIRMATION_TX: MessageNonce = 0; +} + +impl ChainWithMessages for TestChain { + const WITH_CHAIN_RELAYERS_PALLET_NAME: Option<&'static str> = None; + const TO_CHAIN_MESSAGE_DETAILS_METHOD: &'static str = "TestMessagesDetailsMethod"; + const FROM_CHAIN_MESSAGE_DETAILS_METHOD: &'static str = "TestFromMessagesDetailsMethod"; +} + +/// Primitives-level parachain that may be used in tests. +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct TestParachainBase; + +impl bp_runtime::Chain for TestParachainBase { + const ID: ChainId = *b"tstp"; + + type BlockNumber = u32; + type Hash = sp_core::H256; + type Hasher = sp_runtime::traits::BlakeTwo256; + type Header = sp_runtime::generic::Header; + + type AccountId = u32; + type Balance = u32; + type Nonce = u32; + type Signature = sp_runtime::testing::TestSignature; + + fn max_extrinsic_size() -> u32 { + unreachable!() + } + + fn max_extrinsic_weight() -> Weight { + unreachable!() + } +} + +impl bp_runtime::Parachain for TestParachainBase { + const PARACHAIN_ID: u32 = 1000; +} + +/// Parachain that may be used in tests. +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct TestParachain; + +impl bp_runtime::UnderlyingChainProvider for TestParachain { + type Chain = TestParachainBase; +} + +impl Chain for TestParachain { + const NAME: &'static str = "TestParachain"; + const BEST_FINALIZED_HEADER_ID_METHOD: &'static str = "TestParachainMethod"; + const AVERAGE_BLOCK_INTERVAL: Duration = Duration::from_millis(0); + + type SignedBlock = sp_runtime::generic::SignedBlock< + sp_runtime::generic::Block, + >; + type Call = (); +} diff --git a/bridges/relays/client-substrate/src/transaction_tracker.rs b/bridges/relays/client-substrate/src/transaction_tracker.rs new file mode 100644 index 0000000000000000000000000000000000000000..00375768c45c27c23dfccb7730668108a6fab788 --- /dev/null +++ b/bridges/relays/client-substrate/src/transaction_tracker.rs @@ -0,0 +1,447 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Helper for tracking transaction invalidation events. + +use crate::{Chain, Client, Error, HashOf, HeaderIdOf, Subscription, TransactionStatusOf}; + +use async_trait::async_trait; +use futures::{future::Either, Future, FutureExt, Stream, StreamExt}; +use relay_utils::{HeaderId, TrackedTransactionStatus}; +use sp_runtime::traits::Header as _; +use std::time::Duration; + +/// Transaction tracker environment. +#[async_trait] +pub trait Environment: Send + Sync { + /// Returns header id by its hash. + async fn header_id_by_hash(&self, hash: HashOf) -> Result, Error>; +} + +#[async_trait] +impl Environment for Client { + async fn header_id_by_hash(&self, hash: HashOf) -> Result, Error> { + self.header_by_hash(hash).await.map(|h| HeaderId(*h.number(), hash)) + } +} + +/// Substrate transaction tracker implementation. +/// +/// Substrate node provides RPC API to submit and watch for transaction events. This way +/// we may know when transaction is included into block, finalized or rejected. There are +/// some edge cases, when we can't fully trust this mechanism - e.g. transaction may broadcasted +/// and then dropped out of node transaction pool (some other cases are also possible - node +/// restarts, connection lost, ...). Then we can't know for sure - what is currently happening +/// with our transaction. Is the transaction really lost? Is it still alive on the chain network? +/// +/// We have several options to handle such cases: +/// +/// 1) hope that the transaction is still alive and wait for its mining until it is spoiled; +/// +/// 2) assume that the transaction is lost and resubmit another transaction instantly; +/// +/// 3) wait for some time (if transaction is mortal - then until block where it dies; if it is +/// immortal - then for some time that we assume is long enough to mine it) and assume that it is +/// lost. +/// +/// This struct implements third option as it seems to be the most optimal. +pub struct TransactionTracker { + environment: E, + transaction_hash: HashOf, + stall_timeout: Duration, + subscription: Subscription>, +} + +impl> TransactionTracker { + /// Create transaction tracker. + pub fn new( + environment: E, + stall_timeout: Duration, + transaction_hash: HashOf, + subscription: Subscription>, + ) -> Self { + Self { environment, stall_timeout, transaction_hash, subscription } + } + + /// Wait for final transaction status and return it along with last known internal invalidation + /// status. + async fn do_wait( + self, + wait_for_stall_timeout: impl Future, + wait_for_stall_timeout_rest: impl Future, + ) -> (TrackedTransactionStatus>, Option>>) { + // sometimes we want to wait for the rest of the stall timeout even if + // `wait_for_invalidation` has been "select"ed first => it is shared + let wait_for_invalidation = watch_transaction_status::<_, C, _>( + self.environment, + self.transaction_hash, + self.subscription.into_stream(), + ); + futures::pin_mut!(wait_for_stall_timeout, wait_for_invalidation); + + match futures::future::select(wait_for_stall_timeout, wait_for_invalidation).await { + Either::Left((_, _)) => { + log::trace!( + target: "bridge", + "{} transaction {:?} is considered lost after timeout (no status response from the node)", + C::NAME, + self.transaction_hash, + ); + + (TrackedTransactionStatus::Lost, None) + }, + Either::Right((invalidation_status, _)) => match invalidation_status { + InvalidationStatus::Finalized(at_block) => + (TrackedTransactionStatus::Finalized(at_block), Some(invalidation_status)), + InvalidationStatus::Invalid => + (TrackedTransactionStatus::Lost, Some(invalidation_status)), + InvalidationStatus::Lost => { + // wait for the rest of stall timeout - this way we'll be sure that the + // transaction is actually dead if it has been crafted properly + wait_for_stall_timeout_rest.await; + // if someone is still watching for our transaction, then we're reporting + // an error here (which is treated as "transaction lost") + log::trace!( + target: "bridge", + "{} transaction {:?} is considered lost after timeout", + C::NAME, + self.transaction_hash, + ); + + (TrackedTransactionStatus::Lost, Some(invalidation_status)) + }, + }, + } + } +} + +#[async_trait] +impl> relay_utils::TransactionTracker for TransactionTracker { + type HeaderId = HeaderIdOf; + + async fn wait(self) -> TrackedTransactionStatus> { + let wait_for_stall_timeout = async_std::task::sleep(self.stall_timeout).shared(); + let wait_for_stall_timeout_rest = wait_for_stall_timeout.clone(); + self.do_wait(wait_for_stall_timeout, wait_for_stall_timeout_rest).await.0 + } +} + +/// Transaction invalidation status. +/// +/// Note that in places where the `TransactionTracker` is used, the finalization event will be +/// ignored - relay loops are detecting the mining/finalization using their own +/// techniques. That's why we're using `InvalidationStatus` here. +#[derive(Debug, PartialEq)] +enum InvalidationStatus { + /// Transaction has been included into block and finalized at given block. + Finalized(BlockId), + /// Transaction has been invalidated. + Invalid, + /// We have lost track of transaction status. + Lost, +} + +/// Watch for transaction status until transaction is finalized or we lose track of its status. +async fn watch_transaction_status< + E: Environment, + C: Chain, + S: Stream>, +>( + environment: E, + transaction_hash: HashOf, + subscription: S, +) -> InvalidationStatus> { + futures::pin_mut!(subscription); + + loop { + match subscription.next().await { + Some(TransactionStatusOf::::Finalized((block_hash, _))) => { + // the only "successful" outcome of this method is when the block with transaction + // has been finalized + log::trace!( + target: "bridge", + "{} transaction {:?} has been finalized at block: {:?}", + C::NAME, + transaction_hash, + block_hash, + ); + + let header_id = match environment.header_id_by_hash(block_hash).await { + Ok(header_id) => header_id, + Err(e) => { + log::error!( + target: "bridge", + "Failed to read header {:?} when watching for {} transaction {:?}: {:?}", + block_hash, + C::NAME, + transaction_hash, + e, + ); + // that's the best option we have here + return InvalidationStatus::Lost + }, + }; + return InvalidationStatus::Finalized(header_id) + }, + Some(TransactionStatusOf::::Invalid) => { + // if node says that the transaction is invalid, there are still chances that + // it is not actually invalid - e.g. if the block where transaction has been + // revalidated is retracted and transaction (at some other node pool) becomes + // valid again on other fork. But let's assume that the chances of this event + // are almost zero - there's a lot of things that must happen for this to be the + // case. + log::trace!( + target: "bridge", + "{} transaction {:?} has been invalidated", + C::NAME, + transaction_hash, + ); + return InvalidationStatus::Invalid + }, + Some(TransactionStatusOf::::Future) | + Some(TransactionStatusOf::::Ready) | + Some(TransactionStatusOf::::Broadcast(_)) => { + // nothing important (for us) has happened + }, + Some(TransactionStatusOf::::InBlock(block_hash)) => { + // TODO: read matching system event (ExtrinsicSuccess or ExtrinsicFailed), log it + // here and use it later (on finality) for reporting invalid transaction + // https://github.com/paritytech/parity-bridges-common/issues/1464 + log::trace!( + target: "bridge", + "{} transaction {:?} has been included in block: {:?}", + C::NAME, + transaction_hash, + block_hash, + ); + }, + Some(TransactionStatusOf::::Retracted(block_hash)) => { + log::trace!( + target: "bridge", + "{} transaction {:?} at block {:?} has been retracted", + C::NAME, + transaction_hash, + block_hash, + ); + }, + Some(TransactionStatusOf::::FinalityTimeout(block_hash)) => { + // finality is lagging? let's wait a bit more and report a stall + log::trace!( + target: "bridge", + "{} transaction {:?} block {:?} has not been finalized for too long", + C::NAME, + transaction_hash, + block_hash, + ); + return InvalidationStatus::Lost + }, + Some(TransactionStatusOf::::Usurped(new_transaction_hash)) => { + // this may be result of our transaction resubmitter work or some manual + // intervention. In both cases - let's start stall timeout, because the meaning + // of transaction may have changed + log::trace!( + target: "bridge", + "{} transaction {:?} has been usurped by new transaction: {:?}", + C::NAME, + transaction_hash, + new_transaction_hash, + ); + return InvalidationStatus::Lost + }, + Some(TransactionStatusOf::::Dropped) => { + // the transaction has been removed from the pool because of its limits. Let's wait + // a bit and report a stall + log::trace!( + target: "bridge", + "{} transaction {:?} has been dropped from the pool", + C::NAME, + transaction_hash, + ); + return InvalidationStatus::Lost + }, + None => { + // the status of transaction is unknown to us (the subscription has been closed?). + // Let's wait a bit and report a stall + return InvalidationStatus::Lost + }, + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::test_chain::TestChain; + use futures::{FutureExt, SinkExt}; + use sc_transaction_pool_api::TransactionStatus; + + struct TestEnvironment(Result, Error>); + + #[async_trait] + impl Environment for TestEnvironment { + async fn header_id_by_hash( + &self, + _hash: HashOf, + ) -> Result, Error> { + self.0.as_ref().map_err(|_| Error::BridgePalletIsNotInitialized).cloned() + } + } + + async fn on_transaction_status( + status: TransactionStatus, HashOf>, + ) -> Option<( + TrackedTransactionStatus>, + InvalidationStatus>, + )> { + let (mut sender, receiver) = futures::channel::mpsc::channel(1); + let tx_tracker = TransactionTracker::::new( + TestEnvironment(Ok(HeaderId(0, Default::default()))), + Duration::from_secs(0), + Default::default(), + Subscription(async_std::sync::Mutex::new(receiver)), + ); + + let wait_for_stall_timeout = futures::future::pending(); + let wait_for_stall_timeout_rest = futures::future::ready(()); + sender.send(Some(status)).await.unwrap(); + tx_tracker + .do_wait(wait_for_stall_timeout, wait_for_stall_timeout_rest) + .now_or_never() + .map(|(ts, is)| (ts, is.unwrap())) + } + + #[async_std::test] + async fn returns_finalized_on_finalized() { + assert_eq!( + on_transaction_status(TransactionStatus::Finalized(Default::default())).await, + Some(( + TrackedTransactionStatus::Finalized(Default::default()), + InvalidationStatus::Finalized(Default::default()) + )), + ); + } + + #[async_std::test] + async fn returns_lost_on_finalized_and_environment_error() { + assert_eq!( + watch_transaction_status::<_, TestChain, _>( + TestEnvironment(Err(Error::BridgePalletIsNotInitialized)), + Default::default(), + futures::stream::iter([TransactionStatus::Finalized(Default::default())]) + ) + .now_or_never(), + Some(InvalidationStatus::Lost), + ); + } + + #[async_std::test] + async fn returns_invalid_on_invalid() { + assert_eq!( + on_transaction_status(TransactionStatus::Invalid).await, + Some((TrackedTransactionStatus::Lost, InvalidationStatus::Invalid)), + ); + } + + #[async_std::test] + async fn waits_on_future() { + assert_eq!(on_transaction_status(TransactionStatus::Future).await, None,); + } + + #[async_std::test] + async fn waits_on_ready() { + assert_eq!(on_transaction_status(TransactionStatus::Ready).await, None,); + } + + #[async_std::test] + async fn waits_on_broadcast() { + assert_eq!( + on_transaction_status(TransactionStatus::Broadcast(Default::default())).await, + None, + ); + } + + #[async_std::test] + async fn waits_on_in_block() { + assert_eq!( + on_transaction_status(TransactionStatus::InBlock(Default::default())).await, + None, + ); + } + + #[async_std::test] + async fn waits_on_retracted() { + assert_eq!( + on_transaction_status(TransactionStatus::Retracted(Default::default())).await, + None, + ); + } + + #[async_std::test] + async fn lost_on_finality_timeout() { + assert_eq!( + on_transaction_status(TransactionStatus::FinalityTimeout(Default::default())).await, + Some((TrackedTransactionStatus::Lost, InvalidationStatus::Lost)), + ); + } + + #[async_std::test] + async fn lost_on_usurped() { + assert_eq!( + on_transaction_status(TransactionStatus::Usurped(Default::default())).await, + Some((TrackedTransactionStatus::Lost, InvalidationStatus::Lost)), + ); + } + + #[async_std::test] + async fn lost_on_dropped() { + assert_eq!( + on_transaction_status(TransactionStatus::Dropped).await, + Some((TrackedTransactionStatus::Lost, InvalidationStatus::Lost)), + ); + } + + #[async_std::test] + async fn lost_on_subscription_error() { + assert_eq!( + watch_transaction_status::<_, TestChain, _>( + TestEnvironment(Ok(HeaderId(0, Default::default()))), + Default::default(), + futures::stream::iter([]) + ) + .now_or_never(), + Some(InvalidationStatus::Lost), + ); + } + + #[async_std::test] + async fn lost_on_timeout_when_waiting_for_invalidation_status() { + let (_sender, receiver) = futures::channel::mpsc::channel(1); + let tx_tracker = TransactionTracker::::new( + TestEnvironment(Ok(HeaderId(0, Default::default()))), + Duration::from_secs(0), + Default::default(), + Subscription(async_std::sync::Mutex::new(receiver)), + ); + + let wait_for_stall_timeout = futures::future::ready(()).shared(); + let wait_for_stall_timeout_rest = wait_for_stall_timeout.clone(); + let wait_result = tx_tracker + .do_wait(wait_for_stall_timeout, wait_for_stall_timeout_rest) + .now_or_never(); + + assert_eq!(wait_result, Some((TrackedTransactionStatus::Lost, None))); + } +} diff --git a/bridges/relays/equivocation/Cargo.toml b/bridges/relays/equivocation/Cargo.toml new file mode 100644 index 0000000000000000000000000000000000000000..5a067b62e0774ffb93e8b935ed287696e1fefd7c --- /dev/null +++ b/bridges/relays/equivocation/Cargo.toml @@ -0,0 +1,23 @@ +[package] +name = "equivocation-detector" +version = "0.1.0" +authors.workspace = true +edition.workspace = true +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" +repository.workspace = true +description = "Equivocation detector" +publish = false + +[lints] +workspace = true + +[dependencies] +async-std = { version = "1.9.0", features = ["attributes"] } +async-trait = "0.1.79" +bp-header-chain = { path = "../../primitives/header-chain" } +finality-relay = { path = "../finality" } +frame-support = { path = "../../../substrate/frame/support" } +futures = "0.3.30" +log = { workspace = true } +num-traits = "0.2" +relay-utils = { path = "../utils" } diff --git a/bridges/relays/equivocation/src/block_checker.rs b/bridges/relays/equivocation/src/block_checker.rs new file mode 100644 index 0000000000000000000000000000000000000000..c8131e5b9796f1050785676156ad1096181299ab --- /dev/null +++ b/bridges/relays/equivocation/src/block_checker.rs @@ -0,0 +1,471 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +use crate::{ + handle_client_error, reporter::EquivocationsReporter, EquivocationDetectionPipeline, + EquivocationReportingContext, HeaderFinalityInfo, SourceClient, TargetClient, +}; + +use bp_header_chain::{FinalityProof, FindEquivocations as FindEquivocationsT}; +use finality_relay::FinalityProofsBuf; +use futures::future::{BoxFuture, FutureExt}; +use num_traits::Saturating; + +/// First step in the block checking state machine. +/// +/// Getting the finality info associated to the source headers synced with the target chain +/// at the specified block. +#[cfg_attr(test, derive(Debug, PartialEq))] +pub struct ReadSyncedHeaders { + pub target_block_num: P::TargetNumber, +} + +impl ReadSyncedHeaders

{ + pub async fn next>( + self, + target_client: &mut TC, + ) -> Result, Self> { + match target_client.synced_headers_finality_info(self.target_block_num).await { + Ok(synced_headers) => + Ok(ReadContext { target_block_num: self.target_block_num, synced_headers }), + Err(e) => { + log::error!( + target: "bridge", + "Could not get {} headers synced to {} at block {}: {e:?}", + P::SOURCE_NAME, + P::TARGET_NAME, + self.target_block_num + ); + + // Reconnect target client in case of a connection error. + handle_client_error(target_client, e).await; + + Err(self) + }, + } + } +} + +/// Second step in the block checking state machine. +/// +/// Reading the equivocation reporting context from the target chain. +#[cfg_attr(test, derive(Debug))] +pub struct ReadContext { + target_block_num: P::TargetNumber, + synced_headers: Vec>, +} + +impl ReadContext

{ + pub async fn next>( + self, + target_client: &mut TC, + ) -> Result>, Self> { + match EquivocationReportingContext::try_read_from_target::( + target_client, + self.target_block_num.saturating_sub(1.into()), + ) + .await + { + Ok(Some(context)) => Ok(Some(FindEquivocations { + target_block_num: self.target_block_num, + synced_headers: self.synced_headers, + context, + })), + Ok(None) => Ok(None), + Err(e) => { + log::error!( + target: "bridge", + "Could not read {} `EquivocationReportingContext` from {} at block {}: {e:?}", + P::SOURCE_NAME, + P::TARGET_NAME, + self.target_block_num.saturating_sub(1.into()), + ); + + // Reconnect target client in case of a connection error. + handle_client_error(target_client, e).await; + + Err(self) + }, + } + } +} + +/// Third step in the block checking state machine. +/// +/// Searching for equivocations in the source headers synced with the target chain. +#[cfg_attr(test, derive(Debug))] +pub struct FindEquivocations { + target_block_num: P::TargetNumber, + synced_headers: Vec>, + context: EquivocationReportingContext

, +} + +impl FindEquivocations

{ + pub fn next( + mut self, + finality_proofs_buf: &mut FinalityProofsBuf

, + ) -> Vec> { + let mut result = vec![]; + for synced_header in self.synced_headers { + match P::EquivocationsFinder::find_equivocations( + &self.context.synced_verification_context, + &synced_header.finality_proof, + finality_proofs_buf.buf().as_slice(), + ) { + Ok(equivocations) => + if !equivocations.is_empty() { + result.push(ReportEquivocations { + source_block_hash: self.context.synced_header_hash, + equivocations, + }) + }, + Err(e) => { + log::error!( + target: "bridge", + "Could not search for equivocations in the finality proof \ + for source header {:?} synced at target block {}: {e:?}", + synced_header.finality_proof.target_header_hash(), + self.target_block_num + ); + }, + }; + + finality_proofs_buf.prune(synced_header.finality_proof.target_header_number(), None); + self.context.update(synced_header); + } + + result + } +} + +/// Fourth step in the block checking state machine. +/// +/// Reporting the detected equivocations (if any). +#[cfg_attr(test, derive(Debug))] +pub struct ReportEquivocations { + source_block_hash: P::Hash, + equivocations: Vec, +} + +impl ReportEquivocations

{ + pub async fn next>( + mut self, + source_client: &mut SC, + reporter: &mut EquivocationsReporter<'_, P, SC>, + ) -> Result<(), Self> { + let mut unprocessed_equivocations = vec![]; + for equivocation in self.equivocations { + match reporter + .submit_report(source_client, self.source_block_hash, equivocation.clone()) + .await + { + Ok(_) => {}, + Err(e) => { + log::error!( + target: "bridge", + "Could not submit equivocation report to {} for {equivocation:?}: {e:?}", + P::SOURCE_NAME, + ); + + // Mark the equivocation as unprocessed + unprocessed_equivocations.push(equivocation); + // Reconnect source client in case of a connection error. + handle_client_error(source_client, e).await; + }, + } + } + + self.equivocations = unprocessed_equivocations; + if !self.equivocations.is_empty() { + return Err(self) + } + + Ok(()) + } +} + +/// Block checking state machine. +#[cfg_attr(test, derive(Debug))] +pub enum BlockChecker { + ReadSyncedHeaders(ReadSyncedHeaders

), + ReadContext(ReadContext

), + ReportEquivocations(Vec>), +} + +impl BlockChecker

{ + pub fn new(target_block_num: P::TargetNumber) -> Self { + Self::ReadSyncedHeaders(ReadSyncedHeaders { target_block_num }) + } + + pub fn run<'a, SC: SourceClient

, TC: TargetClient

>( + self, + source_client: &'a mut SC, + target_client: &'a mut TC, + finality_proofs_buf: &'a mut FinalityProofsBuf

, + reporter: &'a mut EquivocationsReporter, + ) -> BoxFuture<'a, Result<(), Self>> { + async move { + match self { + Self::ReadSyncedHeaders(state) => { + let read_context = + state.next(target_client).await.map_err(Self::ReadSyncedHeaders)?; + Self::ReadContext(read_context) + .run(source_client, target_client, finality_proofs_buf, reporter) + .await + }, + Self::ReadContext(state) => { + let maybe_find_equivocations = + state.next(target_client).await.map_err(Self::ReadContext)?; + let find_equivocations = match maybe_find_equivocations { + Some(find_equivocations) => find_equivocations, + None => return Ok(()), + }; + Self::ReportEquivocations(find_equivocations.next(finality_proofs_buf)) + .run(source_client, target_client, finality_proofs_buf, reporter) + .await + }, + Self::ReportEquivocations(state) => { + let mut failures = vec![]; + for report_equivocations in state { + if let Err(failure) = + report_equivocations.next(source_client, reporter).await + { + failures.push(failure); + } + } + + if !failures.is_empty() { + return Err(Self::ReportEquivocations(failures)) + } + + Ok(()) + }, + } + } + .boxed() + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::mock::*; + use std::collections::HashMap; + + impl PartialEq for ReadContext { + fn eq(&self, other: &Self) -> bool { + self.target_block_num == other.target_block_num && + self.synced_headers == other.synced_headers + } + } + + impl PartialEq for FindEquivocations { + fn eq(&self, other: &Self) -> bool { + self.target_block_num == other.target_block_num && + self.synced_headers == other.synced_headers && + self.context == other.context + } + } + + impl PartialEq for ReportEquivocations { + fn eq(&self, other: &Self) -> bool { + self.source_block_hash == other.source_block_hash && + self.equivocations == other.equivocations + } + } + + impl PartialEq for BlockChecker { + fn eq(&self, _other: &Self) -> bool { + matches!(self, _other) + } + } + + #[async_std::test] + async fn block_checker_works() { + let mut source_client = TestSourceClient { ..Default::default() }; + let mut target_client = TestTargetClient { + best_synced_header_hash: HashMap::from([(9, Ok(Some(5)))]), + finality_verification_context: HashMap::from([( + 9, + Ok(TestFinalityVerificationContext { check_equivocations: true }), + )]), + synced_headers_finality_info: HashMap::from([( + 10, + Ok(vec![ + new_header_finality_info(6, None), + new_header_finality_info(7, Some(false)), + new_header_finality_info(8, None), + new_header_finality_info(9, Some(true)), + new_header_finality_info(10, None), + new_header_finality_info(11, None), + new_header_finality_info(12, None), + ]), + )]), + ..Default::default() + }; + let mut reporter = + EquivocationsReporter::::new(); + + let block_checker = BlockChecker::new(10); + assert!(block_checker + .run( + &mut source_client, + &mut target_client, + &mut FinalityProofsBuf::new(vec![ + TestFinalityProof(6, vec!["6-1"]), + TestFinalityProof(7, vec![]), + TestFinalityProof(8, vec!["8-1"]), + TestFinalityProof(9, vec!["9-1"]), + TestFinalityProof(10, vec![]), + TestFinalityProof(11, vec!["11-1", "11-2"]), + TestFinalityProof(12, vec!["12-1"]) + ]), + &mut reporter + ) + .await + .is_ok()); + assert_eq!( + *source_client.reported_equivocations.lock().unwrap(), + HashMap::from([(5, vec!["6-1"]), (9, vec!["11-1", "11-2", "12-1"])]) + ); + } + + #[async_std::test] + async fn block_checker_works_with_empty_context() { + let mut target_client = TestTargetClient { + best_synced_header_hash: HashMap::from([(9, Ok(None))]), + finality_verification_context: HashMap::from([( + 9, + Ok(TestFinalityVerificationContext { check_equivocations: true }), + )]), + synced_headers_finality_info: HashMap::from([( + 10, + Ok(vec![new_header_finality_info(6, None)]), + )]), + ..Default::default() + }; + let mut source_client = TestSourceClient { ..Default::default() }; + let mut reporter = + EquivocationsReporter::::new(); + + let block_checker = BlockChecker::new(10); + assert!(block_checker + .run( + &mut source_client, + &mut target_client, + &mut FinalityProofsBuf::new(vec![TestFinalityProof(6, vec!["6-1"])]), + &mut reporter + ) + .await + .is_ok()); + assert_eq!(*source_client.reported_equivocations.lock().unwrap(), HashMap::default()); + } + + #[async_std::test] + async fn read_synced_headers_handles_errors() { + let mut target_client = TestTargetClient { + synced_headers_finality_info: HashMap::from([ + (10, Err(TestClientError::NonConnection)), + (11, Err(TestClientError::Connection)), + ]), + ..Default::default() + }; + let mut source_client = TestSourceClient { ..Default::default() }; + let mut reporter = + EquivocationsReporter::::new(); + + // NonConnection error + let block_checker = BlockChecker::new(10); + assert_eq!( + block_checker + .run( + &mut source_client, + &mut target_client, + &mut FinalityProofsBuf::new(vec![]), + &mut reporter + ) + .await, + Err(BlockChecker::ReadSyncedHeaders(ReadSyncedHeaders { target_block_num: 10 })) + ); + assert_eq!(target_client.num_reconnects, 0); + + // Connection error + let block_checker = BlockChecker::new(11); + assert_eq!( + block_checker + .run( + &mut source_client, + &mut target_client, + &mut FinalityProofsBuf::new(vec![]), + &mut reporter + ) + .await, + Err(BlockChecker::ReadSyncedHeaders(ReadSyncedHeaders { target_block_num: 11 })) + ); + assert_eq!(target_client.num_reconnects, 1); + } + + #[async_std::test] + async fn read_context_handles_errors() { + let mut target_client = TestTargetClient { + synced_headers_finality_info: HashMap::from([(10, Ok(vec![])), (11, Ok(vec![]))]), + best_synced_header_hash: HashMap::from([ + (9, Err(TestClientError::NonConnection)), + (10, Err(TestClientError::Connection)), + ]), + ..Default::default() + }; + let mut source_client = TestSourceClient { ..Default::default() }; + let mut reporter = + EquivocationsReporter::::new(); + + // NonConnection error + let block_checker = BlockChecker::new(10); + assert_eq!( + block_checker + .run( + &mut source_client, + &mut target_client, + &mut FinalityProofsBuf::new(vec![]), + &mut reporter + ) + .await, + Err(BlockChecker::ReadContext(ReadContext { + target_block_num: 10, + synced_headers: vec![] + })) + ); + assert_eq!(target_client.num_reconnects, 0); + + // Connection error + let block_checker = BlockChecker::new(11); + assert_eq!( + block_checker + .run( + &mut source_client, + &mut target_client, + &mut FinalityProofsBuf::new(vec![]), + &mut reporter + ) + .await, + Err(BlockChecker::ReadContext(ReadContext { + target_block_num: 11, + synced_headers: vec![] + })) + ); + assert_eq!(target_client.num_reconnects, 1); + } +} diff --git a/bridges/relays/equivocation/src/equivocation_loop.rs b/bridges/relays/equivocation/src/equivocation_loop.rs new file mode 100644 index 0000000000000000000000000000000000000000..dfc4af0d4f62b21baa681aeb6ac6fd638e3e39a5 --- /dev/null +++ b/bridges/relays/equivocation/src/equivocation_loop.rs @@ -0,0 +1,308 @@ +// Copyright 2019-2023 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +use crate::{ + handle_client_error, reporter::EquivocationsReporter, EquivocationDetectionPipeline, + SourceClient, TargetClient, +}; + +use crate::block_checker::BlockChecker; +use finality_relay::{FinalityProofsBuf, FinalityProofsStream}; +use futures::{select_biased, FutureExt}; +use num_traits::Saturating; +use relay_utils::{metrics::MetricsParams, FailedClient}; +use std::{future::Future, time::Duration}; + +/// Equivocations detection loop state. +struct EquivocationDetectionLoop< + P: EquivocationDetectionPipeline, + SC: SourceClient

, + TC: TargetClient

, +> { + source_client: SC, + target_client: TC, + + from_block_num: Option, + until_block_num: Option, + + reporter: EquivocationsReporter<'static, P, SC>, + + finality_proofs_stream: FinalityProofsStream, + finality_proofs_buf: FinalityProofsBuf

, +} + +impl, TC: TargetClient

> + EquivocationDetectionLoop +{ + async fn ensure_finality_proofs_stream(&mut self) { + match self.finality_proofs_stream.ensure_stream(&self.source_client).await { + Ok(_) => {}, + Err(e) => { + log::error!( + target: "bridge", + "Could not connect to the {} `FinalityProofsStream`: {e:?}", + P::SOURCE_NAME, + ); + + // Reconnect to the source client if needed + handle_client_error(&mut self.source_client, e).await; + }, + } + } + + async fn best_finalized_target_block_number(&mut self) -> Option { + match self.target_client.best_finalized_header_number().await { + Ok(block_num) => Some(block_num), + Err(e) => { + log::error!( + target: "bridge", + "Could not read best finalized header number from {}: {e:?}", + P::TARGET_NAME, + ); + + // Reconnect target client and move on + handle_client_error(&mut self.target_client, e).await; + + None + }, + } + } + + async fn do_run(&mut self, tick: Duration, exit_signal: impl Future) { + let exit_signal = exit_signal.fuse(); + futures::pin_mut!(exit_signal); + + loop { + // Make sure that we are connected to the source finality proofs stream. + self.ensure_finality_proofs_stream().await; + // Check the status of the pending equivocation reports + self.reporter.process_pending_reports().await; + + // Update blocks range. + if let Some(block_number) = self.best_finalized_target_block_number().await { + self.from_block_num.get_or_insert(block_number); + self.until_block_num = Some(block_number); + } + let (from, until) = match (self.from_block_num, self.until_block_num) { + (Some(from), Some(until)) => (from, until), + _ => continue, + }; + + // Check the available blocks + let mut current_block_number = from; + while current_block_number <= until { + self.finality_proofs_buf.fill(&mut self.finality_proofs_stream); + let block_checker = BlockChecker::new(current_block_number); + let _ = block_checker + .run( + &mut self.source_client, + &mut self.target_client, + &mut self.finality_proofs_buf, + &mut self.reporter, + ) + .await; + current_block_number = current_block_number.saturating_add(1.into()); + } + self.from_block_num = Some(current_block_number); + + select_biased! { + _ = exit_signal => return, + _ = async_std::task::sleep(tick).fuse() => {}, + } + } + } + + pub async fn run( + source_client: SC, + target_client: TC, + tick: Duration, + exit_signal: impl Future, + ) -> Result<(), FailedClient> { + let mut equivocation_detection_loop = Self { + source_client, + target_client, + from_block_num: None, + until_block_num: None, + reporter: EquivocationsReporter::::new(), + finality_proofs_stream: FinalityProofsStream::new(), + finality_proofs_buf: FinalityProofsBuf::new(vec![]), + }; + + equivocation_detection_loop.do_run(tick, exit_signal).await; + Ok(()) + } +} + +/// Spawn the equivocations detection loop. +pub async fn run( + source_client: impl SourceClient

, + target_client: impl TargetClient

, + tick: Duration, + metrics_params: MetricsParams, + exit_signal: impl Future + 'static + Send, +) -> Result<(), relay_utils::Error> { + let exit_signal = exit_signal.shared(); + relay_utils::relay_loop(source_client, target_client) + .with_metrics(metrics_params) + .expose() + .await? + .run( + format!("{}_to_{}_EquivocationDetection", P::SOURCE_NAME, P::TARGET_NAME), + move |source_client, target_client, _metrics| { + EquivocationDetectionLoop::run( + source_client, + target_client, + tick, + exit_signal.clone(), + ) + }, + ) + .await +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::mock::*; + use futures::{channel::mpsc::UnboundedSender, StreamExt}; + use std::{ + collections::{HashMap, VecDeque}, + sync::{Arc, Mutex}, + }; + + fn best_finalized_header_number( + best_finalized_headers: &Mutex>>, + exit_sender: &UnboundedSender<()>, + ) -> Result { + let mut best_finalized_headers = best_finalized_headers.lock().unwrap(); + let result = best_finalized_headers.pop_front().unwrap(); + if best_finalized_headers.is_empty() { + exit_sender.unbounded_send(()).unwrap(); + } + result + } + + #[async_std::test] + async fn multiple_blocks_are_checked_correctly() { + let best_finalized_headers = Arc::new(Mutex::new(VecDeque::from([Ok(10), Ok(12), Ok(13)]))); + let (exit_sender, exit_receiver) = futures::channel::mpsc::unbounded(); + + let source_client = TestSourceClient { + finality_proofs: Arc::new(Mutex::new(vec![ + TestFinalityProof(2, vec!["2-1"]), + TestFinalityProof(3, vec!["3-1", "3-2"]), + TestFinalityProof(4, vec!["4-1"]), + TestFinalityProof(5, vec!["5-1"]), + TestFinalityProof(6, vec!["6-1", "6-2"]), + TestFinalityProof(7, vec!["7-1", "7-2"]), + ])), + ..Default::default() + }; + let reported_equivocations = source_client.reported_equivocations.clone(); + let target_client = TestTargetClient { + best_finalized_header_number: Arc::new(move || { + best_finalized_header_number(&best_finalized_headers, &exit_sender) + }), + best_synced_header_hash: HashMap::from([ + (9, Ok(Some(1))), + (10, Ok(Some(3))), + (11, Ok(Some(5))), + (12, Ok(Some(6))), + ]), + finality_verification_context: HashMap::from([ + (9, Ok(TestFinalityVerificationContext { check_equivocations: true })), + (10, Ok(TestFinalityVerificationContext { check_equivocations: true })), + (11, Ok(TestFinalityVerificationContext { check_equivocations: false })), + (12, Ok(TestFinalityVerificationContext { check_equivocations: true })), + ]), + synced_headers_finality_info: HashMap::from([ + ( + 10, + Ok(vec![new_header_finality_info(2, None), new_header_finality_info(3, None)]), + ), + ( + 11, + Ok(vec![ + new_header_finality_info(4, None), + new_header_finality_info(5, Some(false)), + ]), + ), + (12, Ok(vec![new_header_finality_info(6, None)])), + (13, Ok(vec![new_header_finality_info(7, None)])), + ]), + ..Default::default() + }; + + assert!(run::( + source_client, + target_client, + Duration::from_secs(0), + MetricsParams { address: None, registry: Default::default() }, + exit_receiver.into_future().map(|(_, _)| ()), + ) + .await + .is_ok()); + assert_eq!( + *reported_equivocations.lock().unwrap(), + HashMap::from([ + (1, vec!["2-1", "3-1", "3-2"]), + (3, vec!["4-1", "5-1"]), + (6, vec!["7-1", "7-2"]) + ]) + ); + } + + #[async_std::test] + async fn blocks_following_error_are_checked_correctly() { + let best_finalized_headers = Mutex::new(VecDeque::from([Ok(10), Ok(11)])); + let (exit_sender, exit_receiver) = futures::channel::mpsc::unbounded(); + + let source_client = TestSourceClient { + finality_proofs: Arc::new(Mutex::new(vec![ + TestFinalityProof(2, vec!["2-1"]), + TestFinalityProof(3, vec!["3-1"]), + ])), + ..Default::default() + }; + let reported_equivocations = source_client.reported_equivocations.clone(); + let target_client = TestTargetClient { + best_finalized_header_number: Arc::new(move || { + best_finalized_header_number(&best_finalized_headers, &exit_sender) + }), + best_synced_header_hash: HashMap::from([(9, Ok(Some(1))), (10, Ok(Some(2)))]), + finality_verification_context: HashMap::from([ + (9, Ok(TestFinalityVerificationContext { check_equivocations: true })), + (10, Ok(TestFinalityVerificationContext { check_equivocations: true })), + ]), + synced_headers_finality_info: HashMap::from([ + (10, Err(TestClientError::NonConnection)), + (11, Ok(vec![new_header_finality_info(3, None)])), + ]), + ..Default::default() + }; + + assert!(run::( + source_client, + target_client, + Duration::from_secs(0), + MetricsParams { address: None, registry: Default::default() }, + exit_receiver.into_future().map(|(_, _)| ()), + ) + .await + .is_ok()); + assert_eq!(*reported_equivocations.lock().unwrap(), HashMap::from([(2, vec!["3-1"]),])); + } +} diff --git a/bridges/relays/equivocation/src/lib.rs b/bridges/relays/equivocation/src/lib.rs new file mode 100644 index 0000000000000000000000000000000000000000..56a71ef3bc63c422e336c27891b58aee682d605a --- /dev/null +++ b/bridges/relays/equivocation/src/lib.rs @@ -0,0 +1,137 @@ +// Copyright 2019-2023 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +mod block_checker; +mod equivocation_loop; +mod mock; +mod reporter; + +use async_trait::async_trait; +use bp_header_chain::{FinalityProof, FindEquivocations}; +use finality_relay::{FinalityPipeline, SourceClientBase}; +use relay_utils::{relay_loop::Client as RelayClient, MaybeConnectionError, TransactionTracker}; +use std::{fmt::Debug, time::Duration}; + +pub use equivocation_loop::run; + +#[cfg(not(test))] +const RECONNECT_DELAY: Duration = relay_utils::relay_loop::RECONNECT_DELAY; +#[cfg(test)] +const RECONNECT_DELAY: Duration = mock::TEST_RECONNECT_DELAY; + +pub trait EquivocationDetectionPipeline: FinalityPipeline { + /// Block number of the target chain. + type TargetNumber: relay_utils::BlockNumberBase; + /// The context needed for validating finality proofs. + type FinalityVerificationContext: Debug + Send; + /// The type of the equivocation proof. + type EquivocationProof: Clone + Debug + Send + Sync; + /// The equivocations finder. + type EquivocationsFinder: FindEquivocations< + Self::FinalityProof, + Self::FinalityVerificationContext, + Self::EquivocationProof, + >; +} + +type HeaderFinalityInfo

= bp_header_chain::HeaderFinalityInfo< +

::FinalityProof, +

::FinalityVerificationContext, +>; + +/// Source client used in equivocation detection loop. +#[async_trait] +pub trait SourceClient: SourceClientBase

{ + /// Transaction tracker to track submitted transactions. + type TransactionTracker: TransactionTracker; + + /// Report equivocation. + async fn report_equivocation( + &self, + at: P::Hash, + equivocation: P::EquivocationProof, + ) -> Result; +} + +/// Target client used in equivocation detection loop. +#[async_trait] +pub trait TargetClient: RelayClient { + /// Get the best finalized header number. + async fn best_finalized_header_number(&self) -> Result; + + /// Get the hash of the best source header known by the target at the provided block number. + async fn best_synced_header_hash( + &self, + at: P::TargetNumber, + ) -> Result, Self::Error>; + + /// Get the data stored by the target at the specified block for validating source finality + /// proofs. + async fn finality_verification_context( + &self, + at: P::TargetNumber, + ) -> Result; + + /// Get the finality info associated to the source headers synced with the target chain at the + /// specified block. + async fn synced_headers_finality_info( + &self, + at: P::TargetNumber, + ) -> Result>, Self::Error>; +} + +/// The context needed for finding equivocations inside finality proofs and reporting them. +#[derive(Debug, PartialEq)] +struct EquivocationReportingContext { + pub synced_header_hash: P::Hash, + pub synced_verification_context: P::FinalityVerificationContext, +} + +impl EquivocationReportingContext

{ + /// Try to get the `EquivocationReportingContext` used by the target chain + /// at the provided block. + pub async fn try_read_from_target>( + target_client: &TC, + at: P::TargetNumber, + ) -> Result, TC::Error> { + let maybe_best_synced_header_hash = target_client.best_synced_header_hash(at).await?; + Ok(match maybe_best_synced_header_hash { + Some(best_synced_header_hash) => Some(EquivocationReportingContext { + synced_header_hash: best_synced_header_hash, + synced_verification_context: target_client + .finality_verification_context(at) + .await?, + }), + None => None, + }) + } + + /// Update with the new context introduced by the `HeaderFinalityInfo

` if any. + pub fn update(&mut self, info: HeaderFinalityInfo

) { + if let Some(new_verification_context) = info.new_verification_context { + self.synced_header_hash = info.finality_proof.target_header_hash(); + self.synced_verification_context = new_verification_context; + } + } +} + +async fn handle_client_error(client: &mut C, e: C::Error) { + if e.is_connection_error() { + client.reconnect_until_success(RECONNECT_DELAY).await; + } else { + async_std::task::sleep(RECONNECT_DELAY).await; + } +} diff --git a/bridges/relays/equivocation/src/mock.rs b/bridges/relays/equivocation/src/mock.rs new file mode 100644 index 0000000000000000000000000000000000000000..ced5c6f3580652a0d044171171a2a87fab1854cf --- /dev/null +++ b/bridges/relays/equivocation/src/mock.rs @@ -0,0 +1,285 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +#![cfg(test)] + +use crate::{EquivocationDetectionPipeline, HeaderFinalityInfo, SourceClient, TargetClient}; +use async_trait::async_trait; +use bp_header_chain::{FinalityProof, FindEquivocations}; +use finality_relay::{FinalityPipeline, SourceClientBase}; +use futures::{Stream, StreamExt}; +use relay_utils::{ + relay_loop::Client as RelayClient, HeaderId, MaybeConnectionError, TrackedTransactionStatus, + TransactionTracker, +}; +use std::{ + collections::HashMap, + pin::Pin, + sync::{Arc, Mutex}, + time::Duration, +}; + +pub type TestSourceHashAndNumber = u64; +pub type TestTargetNumber = u64; +pub type TestEquivocationProof = &'static str; + +pub const TEST_RECONNECT_DELAY: Duration = Duration::from_secs(0); + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct TestFinalityProof(pub TestSourceHashAndNumber, pub Vec); + +impl FinalityProof for TestFinalityProof { + fn target_header_hash(&self) -> TestSourceHashAndNumber { + self.0 + } + + fn target_header_number(&self) -> TestSourceHashAndNumber { + self.0 + } +} + +#[derive(Debug, Clone, PartialEq)] +pub struct TestEquivocationDetectionPipeline; + +impl FinalityPipeline for TestEquivocationDetectionPipeline { + const SOURCE_NAME: &'static str = "TestSource"; + const TARGET_NAME: &'static str = "TestTarget"; + + type Hash = TestSourceHashAndNumber; + type Number = TestSourceHashAndNumber; + type FinalityProof = TestFinalityProof; +} + +#[derive(Clone, Debug, PartialEq)] +pub struct TestFinalityVerificationContext { + pub check_equivocations: bool, +} + +pub struct TestEquivocationsFinder; + +impl FindEquivocations + for TestEquivocationsFinder +{ + type Error = (); + + fn find_equivocations( + verification_context: &TestFinalityVerificationContext, + synced_proof: &TestFinalityProof, + source_proofs: &[TestFinalityProof], + ) -> Result, Self::Error> { + if verification_context.check_equivocations { + // Get the equivocations from the source proofs, in order to make sure + // that they are correctly provided. + if let Some(proof) = source_proofs.iter().find(|proof| proof.0 == synced_proof.0) { + return Ok(proof.1.clone()) + } + } + + Ok(vec![]) + } +} + +impl EquivocationDetectionPipeline for TestEquivocationDetectionPipeline { + type TargetNumber = TestTargetNumber; + type FinalityVerificationContext = TestFinalityVerificationContext; + type EquivocationProof = TestEquivocationProof; + type EquivocationsFinder = TestEquivocationsFinder; +} + +#[derive(Debug, Clone)] +pub enum TestClientError { + Connection, + NonConnection, +} + +impl MaybeConnectionError for TestClientError { + fn is_connection_error(&self) -> bool { + match self { + TestClientError::Connection => true, + TestClientError::NonConnection => false, + } + } +} + +#[derive(Clone)] +pub struct TestSourceClient { + pub num_reconnects: u32, + pub finality_proofs: Arc>>, + pub reported_equivocations: + Arc>>>, +} + +impl Default for TestSourceClient { + fn default() -> Self { + Self { + num_reconnects: 0, + finality_proofs: Arc::new(Mutex::new(vec![])), + reported_equivocations: Arc::new(Mutex::new(Default::default())), + } + } +} + +#[async_trait] +impl RelayClient for TestSourceClient { + type Error = TestClientError; + + async fn reconnect(&mut self) -> Result<(), Self::Error> { + self.num_reconnects += 1; + + Ok(()) + } +} + +#[async_trait] +impl SourceClientBase for TestSourceClient { + type FinalityProofsStream = Pin + 'static + Send>>; + + async fn finality_proofs(&self) -> Result { + let finality_proofs = std::mem::take(&mut *self.finality_proofs.lock().unwrap()); + Ok(futures::stream::iter(finality_proofs).boxed()) + } +} + +#[derive(Clone, Debug)] +pub struct TestTransactionTracker( + pub TrackedTransactionStatus>, +); + +impl Default for TestTransactionTracker { + fn default() -> TestTransactionTracker { + TestTransactionTracker(TrackedTransactionStatus::Finalized(Default::default())) + } +} + +#[async_trait] +impl TransactionTracker for TestTransactionTracker { + type HeaderId = HeaderId; + + async fn wait( + self, + ) -> TrackedTransactionStatus> { + self.0 + } +} + +#[async_trait] +impl SourceClient for TestSourceClient { + type TransactionTracker = TestTransactionTracker; + + async fn report_equivocation( + &self, + at: TestSourceHashAndNumber, + equivocation: TestEquivocationProof, + ) -> Result { + self.reported_equivocations + .lock() + .unwrap() + .entry(at) + .or_default() + .push(equivocation); + + Ok(TestTransactionTracker::default()) + } +} + +#[derive(Clone)] +pub struct TestTargetClient { + pub num_reconnects: u32, + pub best_finalized_header_number: + Arc Result + Send + Sync>, + pub best_synced_header_hash: + HashMap, TestClientError>>, + pub finality_verification_context: + HashMap>, + pub synced_headers_finality_info: HashMap< + TestTargetNumber, + Result>, TestClientError>, + >, +} + +impl Default for TestTargetClient { + fn default() -> Self { + Self { + num_reconnects: 0, + best_finalized_header_number: Arc::new(|| Ok(0)), + best_synced_header_hash: Default::default(), + finality_verification_context: Default::default(), + synced_headers_finality_info: Default::default(), + } + } +} + +#[async_trait] +impl RelayClient for TestTargetClient { + type Error = TestClientError; + + async fn reconnect(&mut self) -> Result<(), Self::Error> { + self.num_reconnects += 1; + + Ok(()) + } +} + +#[async_trait] +impl TargetClient for TestTargetClient { + async fn best_finalized_header_number(&self) -> Result { + (self.best_finalized_header_number)() + } + + async fn best_synced_header_hash( + &self, + at: TestTargetNumber, + ) -> Result, Self::Error> { + self.best_synced_header_hash + .get(&at) + .unwrap_or(&Err(TestClientError::NonConnection)) + .clone() + } + + async fn finality_verification_context( + &self, + at: TestTargetNumber, + ) -> Result { + self.finality_verification_context + .get(&at) + .unwrap_or(&Err(TestClientError::NonConnection)) + .clone() + } + + async fn synced_headers_finality_info( + &self, + at: TestTargetNumber, + ) -> Result>, Self::Error> { + self.synced_headers_finality_info + .get(&at) + .unwrap_or(&Err(TestClientError::NonConnection)) + .clone() + } +} + +pub fn new_header_finality_info( + source_hdr: TestSourceHashAndNumber, + check_following_equivocations: Option, +) -> HeaderFinalityInfo { + HeaderFinalityInfo:: { + finality_proof: TestFinalityProof(source_hdr, vec![]), + new_verification_context: check_following_equivocations.map( + |check_following_equivocations| TestFinalityVerificationContext { + check_equivocations: check_following_equivocations, + }, + ), + } +} diff --git a/bridges/relays/equivocation/src/reporter.rs b/bridges/relays/equivocation/src/reporter.rs new file mode 100644 index 0000000000000000000000000000000000000000..9c4642383d1648b9eae81a5eb0b853fb07efd5d6 --- /dev/null +++ b/bridges/relays/equivocation/src/reporter.rs @@ -0,0 +1,129 @@ +// Copyright 2019-2023 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Helper struct used for submitting finality reports and tracking their status. + +use crate::{EquivocationDetectionPipeline, SourceClient}; + +use futures::FutureExt; +use relay_utils::{TrackedTransactionFuture, TrackedTransactionStatus, TransactionTracker}; +use std::{ + future::poll_fn, + task::{Context, Poll}, +}; + +pub struct EquivocationsReporter<'a, P: EquivocationDetectionPipeline, SC: SourceClient

> { + pending_reports: Vec>, +} + +impl<'a, P: EquivocationDetectionPipeline, SC: SourceClient

> EquivocationsReporter<'a, P, SC> { + pub fn new() -> Self { + Self { pending_reports: vec![] } + } + + /// Submit a `report_equivocation()` transaction to the source chain. + /// + /// We store the transaction tracker for future monitoring. + pub async fn submit_report( + &mut self, + source_client: &SC, + at: P::Hash, + equivocation: P::EquivocationProof, + ) -> Result<(), SC::Error> { + let pending_report = source_client.report_equivocation(at, equivocation).await?; + self.pending_reports.push(pending_report.wait()); + + Ok(()) + } + + fn do_process_pending_reports(&mut self, cx: &mut Context<'_>) -> Poll<()> { + self.pending_reports.retain_mut(|pending_report| { + match pending_report.poll_unpin(cx) { + Poll::Ready(tx_status) => { + match tx_status { + TrackedTransactionStatus::Lost => { + log::error!(target: "bridge", "Equivocation report tx was lost"); + }, + TrackedTransactionStatus::Finalized(id) => { + log::error!(target: "bridge", "Equivocation report tx was finalized in source block {id:?}"); + }, + } + + // The future was processed. Drop it. + false + }, + Poll::Pending => { + // The future is still pending. Retain it. + true + }, + } + }); + + Poll::Ready(()) + } + + /// Iterate through all the pending `report_equivocation()` transactions + /// and log the ones that finished. + pub async fn process_pending_reports(&mut self) { + poll_fn(|cx| self.do_process_pending_reports(cx)).await + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::mock::*; + use relay_utils::HeaderId; + use std::sync::Mutex; + + #[async_std::test] + async fn process_pending_reports_works() { + let polled_reports = Mutex::new(vec![]); + let finished_reports = Mutex::new(vec![]); + + let mut reporter = + EquivocationsReporter:: { + pending_reports: vec![ + Box::pin(async { + polled_reports.lock().unwrap().push(1); + finished_reports.lock().unwrap().push(1); + TrackedTransactionStatus::Finalized(HeaderId(1, 1)) + }), + Box::pin(async { + polled_reports.lock().unwrap().push(2); + finished_reports.lock().unwrap().push(2); + TrackedTransactionStatus::Finalized(HeaderId(2, 2)) + }), + Box::pin(async { + polled_reports.lock().unwrap().push(3); + std::future::pending::<()>().await; + finished_reports.lock().unwrap().push(3); + TrackedTransactionStatus::Finalized(HeaderId(3, 3)) + }), + Box::pin(async { + polled_reports.lock().unwrap().push(4); + finished_reports.lock().unwrap().push(4); + TrackedTransactionStatus::Finalized(HeaderId(4, 4)) + }), + ], + }; + + reporter.process_pending_reports().await; + assert_eq!(*polled_reports.lock().unwrap(), vec![1, 2, 3, 4]); + assert_eq!(*finished_reports.lock().unwrap(), vec![1, 2, 4]); + assert_eq!(reporter.pending_reports.len(), 1); + } +} diff --git a/bridges/relays/finality/Cargo.toml b/bridges/relays/finality/Cargo.toml new file mode 100644 index 0000000000000000000000000000000000000000..5ee4b10fa638f5ec226df14beca1e0c79d0055df --- /dev/null +++ b/bridges/relays/finality/Cargo.toml @@ -0,0 +1,25 @@ +[package] +name = "finality-relay" +version = "0.1.0" +authors.workspace = true +edition.workspace = true +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" +repository.workspace = true +description = "Finality proofs relay" +publish = false + +[lints] +workspace = true + +[dependencies] +async-std = "1.9.0" +async-trait = "0.1.79" +backoff = "0.4" +bp-header-chain = { path = "../../primitives/header-chain" } +futures = "0.3.30" +log = { workspace = true } +num-traits = "0.2" +relay-utils = { path = "../utils" } + +[dev-dependencies] +parking_lot = "0.12.1" diff --git a/bridges/relays/finality/README.md b/bridges/relays/finality/README.md new file mode 100644 index 0000000000000000000000000000000000000000..92e765cea0e505be7854e17a9b91df520bba32b0 --- /dev/null +++ b/bridges/relays/finality/README.md @@ -0,0 +1,60 @@ +# GRANDPA Finality Relay + +The finality relay is able to work with different finality engines. In the modern Substrate world they are GRANDPA +and BEEFY. Let's talk about GRANDPA here, because BEEFY relay and bridge BEEFY pallet are in development. + +In general, the relay works as follows: it connects to the source and target chain. The source chain must have the +[GRANDPA gadget](https://github.com/paritytech/finality-grandpa) running (so it can't be a parachain). The target +chain must have the [bridge GRANDPA pallet](../../modules/grandpa/) deployed at its runtime. The relay subscribes +to the GRANDPA finality notifications at the source chain and when the new justification is received, it is submitted +to the pallet at the target chain. + +Apart from that, the relay is watching for every source header that is missing at target. If it finds the missing +mandatory header (header that is changing the current GRANDPA validators set), it submits the justification for +this header. The case when the source node can't return the mandatory justification is considered a fatal error, +because the pallet can't proceed without it. + +More: [GRANDPA Finality Relay Sequence Diagram](../../docs/grandpa-finality-relay.html). + +## How to Use the Finality Relay + +The most important trait is the [`FinalitySyncPipeline`](./src/lib.rs), which defines the basic primitives of the +source chain (like block hash and number) and the type of finality proof (GRANDPA justification or MMR proof). Once +that is defined, there are two other traits - [`SourceClient`](./src/finality_loop.rs) and +[`TargetClient`](./src/finality_loop.rs). + +The `SourceClient` represents the Substrate node client that connects to the source chain. The client needs to +be able to return the best finalized header number, finalized header and its finality proof and the stream of +finality proofs. + +The `TargetClient` implementation must be able to craft finality delivery transaction and submit it to the target +node. The transaction is then tracked by the relay until it is mined and finalized. + +The main entrypoint for the crate is the [`run` function](./src/finality_loop.rs), which takes source and target +clients and [`FinalitySyncParams`](./src/finality_loop.rs) parameters. The most important parameter is the +`only_mandatory_headers` - it is set to `true`, the relay will only submit mandatory headers. Since transactions +with mandatory headers are fee-free, the cost of running such relay is zero (in terms of fees). + +## Finality Relay Metrics + +Finality relay provides several metrics. Metrics names depend on names of source and target chains. The list below +shows metrics names for Rococo (source chain) to BridgeHubWestend (target chain) finality relay. For other +chains, simply change chain names. So the metrics are: + +- `Rococo_to_BridgeHubWestend_Sync_best_source_block_number` - returns best finalized source chain (Rococo) block + number, known to the relay. + If relay is running in [on-demand mode](../bin-substrate/src/cli/relay_headers_and_messages/), the + number may not match (it may be far behind) the actual best finalized number; + +- `Rococo_to_BridgeHubWestend_Sync_best_source_at_target_block_number` - returns best finalized source chain (Rococo) + block number that is known to the bridge GRANDPA pallet at the target chain. + +- `Rococo_to_BridgeHubWestend_Sync_is_source_and_source_at_target_using_different_forks` - if this metrics is set + to `1`, then the best source chain header known to the target chain doesn't match the same-number-header + at the source chain. It means that the GRANDPA validators set has crafted the duplicate justification + and it has been submitted to the target chain. + Normally (if majority of validators are honest and if you're running finality relay without large breaks) + this shall not happen and the metric will have `0` value. + +If relay operates properly, you should see that the `Rococo_to_BridgeHubWestend_Sync_best_source_at_target_block_number` +tries to reach the `Rococo_to_BridgeHubWestend_Sync_best_source_block_number`. And the latter one always increases. diff --git a/bridges/relays/finality/src/base.rs b/bridges/relays/finality/src/base.rs new file mode 100644 index 0000000000000000000000000000000000000000..4253468eaace1ef2a2adc47790f7e16c38160200 --- /dev/null +++ b/bridges/relays/finality/src/base.rs @@ -0,0 +1,51 @@ +// Copyright 2019-2023 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +use async_trait::async_trait; +use bp_header_chain::FinalityProof; +use futures::Stream; +use relay_utils::relay_loop::Client as RelayClient; +use std::fmt::Debug; + +/// Base finality pipeline. +pub trait FinalityPipeline: 'static + Clone + Debug + Send + Sync { + /// Name of the finality proofs source. + const SOURCE_NAME: &'static str; + /// Name of the finality proofs target. + const TARGET_NAME: &'static str; + + /// Synced headers are identified by this hash. + type Hash: Eq + Clone + Copy + Send + Sync + Debug; + /// Synced headers are identified by this number. + type Number: relay_utils::BlockNumberBase; + /// Finality proof type. + type FinalityProof: FinalityProof; +} + +/// Source client used in finality related loops. +#[async_trait] +pub trait SourceClientBase: RelayClient { + /// Stream of new finality proofs. The stream is allowed to miss proofs for some + /// headers, even if those headers are mandatory. + type FinalityProofsStream: Stream + Send + Unpin; + + /// Subscribe to new finality proofs. + async fn finality_proofs(&self) -> Result; +} + +/// Target client used in finality related loops. +#[async_trait] +pub trait TargetClientBase: RelayClient {} diff --git a/bridges/relays/finality/src/finality_loop.rs b/bridges/relays/finality/src/finality_loop.rs new file mode 100644 index 0000000000000000000000000000000000000000..e31d8a708122db84c4c87f257edee7ee4ba616bb --- /dev/null +++ b/bridges/relays/finality/src/finality_loop.rs @@ -0,0 +1,698 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! The loop basically reads all missing headers and their finality proofs from the source client. +//! The proof for the best possible header is then submitted to the target node. The only exception +//! is the mandatory headers, which we always submit to the target node. For such headers, we +//! assume that the persistent proof either exists, or will eventually become available. + +use crate::{sync_loop_metrics::SyncLoopMetrics, Error, FinalitySyncPipeline, SourceHeader}; + +use crate::{ + base::SourceClientBase, + finality_proofs::{FinalityProofsBuf, FinalityProofsStream}, + headers::{JustifiedHeader, JustifiedHeaderSelector}, +}; +use async_trait::async_trait; +use backoff::{backoff::Backoff, ExponentialBackoff}; +use futures::{future::Fuse, select, Future, FutureExt}; +use num_traits::Saturating; +use relay_utils::{ + metrics::MetricsParams, relay_loop::Client as RelayClient, retry_backoff, FailedClient, + HeaderId, MaybeConnectionError, TrackedTransactionStatus, TransactionTracker, +}; +use std::{ + fmt::Debug, + time::{Duration, Instant}, +}; + +/// Finality proof synchronization loop parameters. +#[derive(Debug, Clone)] +pub struct FinalitySyncParams { + /// Interval at which we check updates on both clients. Normally should be larger than + /// `min(source_block_time, target_block_time)`. + /// + /// This parameter may be used to limit transactions rate. Increase the value && you'll get + /// infrequent updates => sparse headers => potential slow down of bridge applications, but + /// pallet storage won't be super large. Decrease the value to near `source_block_time` and + /// you'll get transaction for (almost) every block of the source chain => all source headers + /// will be known to the target chain => bridge applications will run faster, but pallet + /// storage may explode (but if pruning is there, then it's fine). + pub tick: Duration, + /// Number of finality proofs to keep in internal buffer between loop iterations. + /// + /// While in "major syncing" state, we still read finality proofs from the stream. They're + /// stored in the internal buffer between loop iterations. When we're close to the tip of the + /// chain, we may meet finality delays if headers are not finalized frequently. So instead of + /// waiting for next finality proof to appear in the stream, we may use existing proof from + /// that buffer. + pub recent_finality_proofs_limit: usize, + /// Timeout before we treat our transactions as lost and restart the whole sync process. + pub stall_timeout: Duration, + /// If true, only mandatory headers are relayed. + pub only_mandatory_headers: bool, +} + +/// Source client used in finality synchronization loop. +#[async_trait] +pub trait SourceClient: SourceClientBase

{ + /// Get best finalized block number. + async fn best_finalized_block_number(&self) -> Result; + + /// Get canonical header and its finality proof by number. + async fn header_and_finality_proof( + &self, + number: P::Number, + ) -> Result<(P::Header, Option), Self::Error>; +} + +/// Target client used in finality synchronization loop. +#[async_trait] +pub trait TargetClient: RelayClient { + /// Transaction tracker to track submitted transactions. + type TransactionTracker: TransactionTracker; + + /// Get best finalized source block number. + async fn best_finalized_source_block_id( + &self, + ) -> Result, Self::Error>; + + /// Submit header finality proof. + async fn submit_finality_proof( + &self, + header: P::Header, + proof: P::FinalityProof, + ) -> Result; +} + +/// Return prefix that will be used by default to expose Prometheus metrics of the finality proofs +/// sync loop. +pub fn metrics_prefix() -> String { + format!("{}_to_{}_Sync", P::SOURCE_NAME, P::TARGET_NAME) +} + +pub struct SyncInfo { + pub best_number_at_source: P::Number, + pub best_number_at_target: P::Number, + pub is_using_same_fork: bool, +} + +impl SyncInfo

{ + /// Checks if both clients are on the same fork. + async fn is_on_same_fork>( + source_client: &SC, + id_at_target: &HeaderId, + ) -> Result { + let header_at_source = source_client.header_and_finality_proof(id_at_target.0).await?.0; + let header_hash_at_source = header_at_source.hash(); + Ok(if id_at_target.1 == header_hash_at_source { + true + } else { + log::error!( + target: "bridge", + "Source node ({}) and pallet at target node ({}) have different headers at the same height {:?}: \ + at-source {:?} vs at-target {:?}", + P::SOURCE_NAME, + P::TARGET_NAME, + id_at_target.0, + header_hash_at_source, + id_at_target.1, + ); + + false + }) + } + + async fn new, TC: TargetClient

>( + source_client: &SC, + target_client: &TC, + ) -> Result> { + let best_number_at_source = + source_client.best_finalized_block_number().await.map_err(Error::Source)?; + let best_id_at_target = + target_client.best_finalized_source_block_id().await.map_err(Error::Target)?; + let best_number_at_target = best_id_at_target.0; + + let is_using_same_fork = Self::is_on_same_fork(source_client, &best_id_at_target) + .await + .map_err(Error::Source)?; + + Ok(Self { best_number_at_source, best_number_at_target, is_using_same_fork }) + } + + fn update_metrics(&self, metrics_sync: &Option) { + if let Some(metrics_sync) = metrics_sync { + metrics_sync.update_best_block_at_source(self.best_number_at_source); + metrics_sync.update_best_block_at_target(self.best_number_at_target); + metrics_sync.update_using_same_fork(self.is_using_same_fork); + } + } + + pub fn num_headers(&self) -> P::Number { + self.best_number_at_source.saturating_sub(self.best_number_at_target) + } +} + +/// Information about transaction that we have submitted. +#[derive(Debug, Clone)] +pub struct Transaction { + /// Submitted transaction tracker. + tracker: Tracker, + /// The number of the header we have submitted. + header_number: Number, +} + +impl Transaction { + pub async fn submit< + P: FinalitySyncPipeline, + TC: TargetClient, + >( + target_client: &TC, + header: P::Header, + justification: P::FinalityProof, + ) -> Result { + let header_number = header.number(); + log::debug!( + target: "bridge", + "Going to submit finality proof of {} header #{:?} to {}", + P::SOURCE_NAME, + header_number, + P::TARGET_NAME, + ); + + let tracker = target_client.submit_finality_proof(header, justification).await?; + Ok(Transaction { tracker, header_number }) + } + + async fn track< + P: FinalitySyncPipeline, + SC: SourceClient

, + TC: TargetClient

, + >( + self, + target_client: TC, + ) -> Result<(), Error> { + match self.tracker.wait().await { + TrackedTransactionStatus::Finalized(_) => { + // The transaction has been finalized, but it may have been finalized in the + // "failed" state. So let's check if the block number was actually updated. + target_client + .best_finalized_source_block_id() + .await + .map_err(Error::Target) + .and_then(|best_id_at_target| { + if self.header_number > best_id_at_target.0 { + return Err(Error::ProofSubmissionTxFailed { + submitted_number: self.header_number, + best_number_at_target: best_id_at_target.0, + }) + } + Ok(()) + }) + }, + TrackedTransactionStatus::Lost => Err(Error::ProofSubmissionTxLost), + } + } +} + +/// Finality synchronization loop state. +struct FinalityLoop, TC: TargetClient

> { + source_client: SC, + target_client: TC, + + sync_params: FinalitySyncParams, + metrics_sync: Option, + + progress: (Instant, Option), + retry_backoff: ExponentialBackoff, + finality_proofs_stream: FinalityProofsStream, + finality_proofs_buf: FinalityProofsBuf

, + best_submitted_number: Option, +} + +impl, TC: TargetClient

> FinalityLoop { + pub fn new( + source_client: SC, + target_client: TC, + sync_params: FinalitySyncParams, + metrics_sync: Option, + ) -> Self { + Self { + source_client, + target_client, + sync_params, + metrics_sync, + progress: (Instant::now(), None), + retry_backoff: retry_backoff(), + finality_proofs_stream: FinalityProofsStream::new(), + finality_proofs_buf: FinalityProofsBuf::new(vec![]), + best_submitted_number: None, + } + } + + fn update_progress(&mut self, info: &SyncInfo

) { + let (prev_time, prev_best_number_at_target) = self.progress; + let now = Instant::now(); + + let needs_update = now - prev_time > Duration::from_secs(10) || + prev_best_number_at_target + .map(|prev_best_number_at_target| { + info.best_number_at_target.saturating_sub(prev_best_number_at_target) > + 10.into() + }) + .unwrap_or(true); + + if !needs_update { + return + } + + log::info!( + target: "bridge", + "Synced {:?} of {:?} headers", + info.best_number_at_target, + info.best_number_at_source, + ); + + self.progress = (now, Some(info.best_number_at_target)) + } + + pub async fn select_header_to_submit( + &mut self, + info: &SyncInfo

, + ) -> Result>, Error> { + // to see that the loop is progressing + log::trace!( + target: "bridge", + "Considering range of headers ({}; {}]", + info.best_number_at_target, + info.best_number_at_source + ); + + // read missing headers + let selector = JustifiedHeaderSelector::new::(&self.source_client, info).await?; + // if we see that the header schedules GRANDPA change, we need to submit it + if self.sync_params.only_mandatory_headers { + return Ok(selector.select_mandatory()) + } + + // all headers that are missing from the target client are non-mandatory + // => even if we have already selected some header and its persistent finality proof, + // we may try to select better header by reading non-persistent proofs from the stream + self.finality_proofs_buf.fill(&mut self.finality_proofs_stream); + let maybe_justified_header = selector.select(&self.finality_proofs_buf); + + // remove obsolete 'recent' finality proofs + keep its size under certain limit + let oldest_finality_proof_to_keep = maybe_justified_header + .as_ref() + .map(|justified_header| justified_header.number()) + .unwrap_or(info.best_number_at_target); + self.finality_proofs_buf.prune( + oldest_finality_proof_to_keep, + Some(self.sync_params.recent_finality_proofs_limit), + ); + + Ok(maybe_justified_header) + } + + pub async fn run_iteration( + &mut self, + ) -> Result< + Option>, + Error, + > { + // read best source headers ids from source and target nodes + let info = SyncInfo::new(&self.source_client, &self.target_client).await?; + info.update_metrics(&self.metrics_sync); + self.update_progress(&info); + + // if we have already submitted header, then we just need to wait for it + // if we're waiting too much, then we believe our transaction has been lost and restart sync + if Some(info.best_number_at_target) < self.best_submitted_number { + return Ok(None) + } + + // submit new header if we have something new + match self.select_header_to_submit(&info).await? { + Some(header) => { + let transaction = + Transaction::submit(&self.target_client, header.header, header.proof) + .await + .map_err(Error::Target)?; + self.best_submitted_number = Some(transaction.header_number); + Ok(Some(transaction)) + }, + None => Ok(None), + } + } + + async fn ensure_finality_proofs_stream(&mut self) -> Result<(), FailedClient> { + if let Err(e) = self.finality_proofs_stream.ensure_stream(&self.source_client).await { + if e.is_connection_error() { + return Err(FailedClient::Source) + } + } + + Ok(()) + } + + /// Run finality relay loop until connection to one of nodes is lost. + async fn run_until_connection_lost( + &mut self, + exit_signal: impl Future, + ) -> Result<(), FailedClient> { + self.ensure_finality_proofs_stream().await?; + let proof_submission_tx_tracker = Fuse::terminated(); + let exit_signal = exit_signal.fuse(); + futures::pin_mut!(exit_signal, proof_submission_tx_tracker); + + loop { + // run loop iteration + let next_tick = match self.run_iteration().await { + Ok(Some(tx)) => { + proof_submission_tx_tracker + .set(tx.track::(self.target_client.clone()).fuse()); + self.retry_backoff.reset(); + self.sync_params.tick + }, + Ok(None) => { + self.retry_backoff.reset(); + self.sync_params.tick + }, + Err(error) => { + log::error!(target: "bridge", "Finality sync loop iteration has failed with error: {:?}", error); + error.fail_if_connection_error()?; + self.retry_backoff + .next_backoff() + .unwrap_or(relay_utils::relay_loop::RECONNECT_DELAY) + }, + }; + self.ensure_finality_proofs_stream().await?; + + // wait till exit signal, or new source block + select! { + proof_submission_result = proof_submission_tx_tracker => { + if let Err(e) = proof_submission_result { + log::error!( + target: "bridge", + "Finality sync proof submission tx to {} has failed with error: {:?}.", + P::TARGET_NAME, + e, + ); + self.best_submitted_number = None; + e.fail_if_connection_error()?; + } + }, + _ = async_std::task::sleep(next_tick).fuse() => {}, + _ = exit_signal => return Ok(()), + } + } + } + + pub async fn run( + source_client: SC, + target_client: TC, + sync_params: FinalitySyncParams, + metrics_sync: Option, + exit_signal: impl Future, + ) -> Result<(), FailedClient> { + let mut finality_loop = Self::new(source_client, target_client, sync_params, metrics_sync); + finality_loop.run_until_connection_lost(exit_signal).await + } +} + +/// Run finality proofs synchronization loop. +pub async fn run( + source_client: impl SourceClient

, + target_client: impl TargetClient

, + sync_params: FinalitySyncParams, + metrics_params: MetricsParams, + exit_signal: impl Future + 'static + Send, +) -> Result<(), relay_utils::Error> { + let exit_signal = exit_signal.shared(); + relay_utils::relay_loop(source_client, target_client) + .with_metrics(metrics_params) + .loop_metric(SyncLoopMetrics::new( + Some(&metrics_prefix::

()), + "source", + "source_at_target", + )?)? + .expose() + .await? + .run(metrics_prefix::

(), move |source_client, target_client, metrics| { + FinalityLoop::run( + source_client, + target_client, + sync_params.clone(), + metrics, + exit_signal.clone(), + ) + }) + .await +} + +#[cfg(test)] +mod tests { + use super::*; + + use crate::mock::*; + use futures::{FutureExt, StreamExt}; + use parking_lot::Mutex; + use relay_utils::{FailedClient, HeaderId, TrackedTransactionStatus}; + use std::{collections::HashMap, sync::Arc}; + + fn prepare_test_clients( + exit_sender: futures::channel::mpsc::UnboundedSender<()>, + state_function: impl Fn(&mut ClientsData) -> bool + Send + Sync + 'static, + source_headers: HashMap)>, + ) -> (TestSourceClient, TestTargetClient) { + let internal_state_function: Arc = + Arc::new(move |data| { + if state_function(data) { + exit_sender.unbounded_send(()).unwrap(); + } + }); + let clients_data = Arc::new(Mutex::new(ClientsData { + source_best_block_number: 10, + source_headers, + source_proofs: vec![TestFinalityProof(12), TestFinalityProof(14)], + + target_best_block_id: HeaderId(5, 5), + target_headers: vec![], + target_transaction_tracker: TestTransactionTracker( + TrackedTransactionStatus::Finalized(Default::default()), + ), + })); + ( + TestSourceClient { + on_method_call: internal_state_function.clone(), + data: clients_data.clone(), + }, + TestTargetClient { on_method_call: internal_state_function, data: clients_data }, + ) + } + + fn test_sync_params() -> FinalitySyncParams { + FinalitySyncParams { + tick: Duration::from_secs(0), + recent_finality_proofs_limit: 1024, + stall_timeout: Duration::from_secs(1), + only_mandatory_headers: false, + } + } + + fn run_sync_loop( + state_function: impl Fn(&mut ClientsData) -> bool + Send + Sync + 'static, + ) -> (ClientsData, Result<(), FailedClient>) { + let (exit_sender, exit_receiver) = futures::channel::mpsc::unbounded(); + let (source_client, target_client) = prepare_test_clients( + exit_sender, + state_function, + vec![ + (5, (TestSourceHeader(false, 5, 5), None)), + (6, (TestSourceHeader(false, 6, 6), None)), + (7, (TestSourceHeader(false, 7, 7), Some(TestFinalityProof(7)))), + (8, (TestSourceHeader(true, 8, 8), Some(TestFinalityProof(8)))), + (9, (TestSourceHeader(false, 9, 9), Some(TestFinalityProof(9)))), + (10, (TestSourceHeader(false, 10, 10), None)), + ] + .into_iter() + .collect(), + ); + let sync_params = test_sync_params(); + + let clients_data = source_client.data.clone(); + let result = async_std::task::block_on(FinalityLoop::run( + source_client, + target_client, + sync_params, + None, + exit_receiver.into_future().map(|(_, _)| ()), + )); + + let clients_data = clients_data.lock().clone(); + (clients_data, result) + } + + #[test] + fn finality_sync_loop_works() { + let (client_data, result) = run_sync_loop(|data| { + // header#7 has persistent finality proof, but it isn't mandatory => it isn't submitted, + // because header#8 has persistent finality proof && it is mandatory => it is submitted + // header#9 has persistent finality proof, but it isn't mandatory => it is submitted, + // because there are no more persistent finality proofs + // + // once this ^^^ is done, we generate more blocks && read proof for blocks 12 and 14 + // from the stream + if data.target_best_block_id.0 == 9 { + data.source_best_block_number = 14; + data.source_headers.insert(11, (TestSourceHeader(false, 11, 11), None)); + data.source_headers + .insert(12, (TestSourceHeader(false, 12, 12), Some(TestFinalityProof(12)))); + data.source_headers.insert(13, (TestSourceHeader(false, 13, 13), None)); + data.source_headers + .insert(14, (TestSourceHeader(false, 14, 14), Some(TestFinalityProof(14)))); + } + // once this ^^^ is done, we generate more blocks && read persistent proof for block 16 + if data.target_best_block_id.0 == 14 { + data.source_best_block_number = 17; + data.source_headers.insert(15, (TestSourceHeader(false, 15, 15), None)); + data.source_headers + .insert(16, (TestSourceHeader(false, 16, 16), Some(TestFinalityProof(16)))); + data.source_headers.insert(17, (TestSourceHeader(false, 17, 17), None)); + } + + data.target_best_block_id.0 == 16 + }); + + assert_eq!(result, Ok(())); + assert_eq!( + client_data.target_headers, + vec![ + // before adding 11..14: finality proof for mandatory header#8 + (TestSourceHeader(true, 8, 8), TestFinalityProof(8)), + // before adding 11..14: persistent finality proof for non-mandatory header#9 + (TestSourceHeader(false, 9, 9), TestFinalityProof(9)), + // after adding 11..14: ephemeral finality proof for non-mandatory header#14 + (TestSourceHeader(false, 14, 14), TestFinalityProof(14)), + // after adding 15..17: persistent finality proof for non-mandatory header#16 + (TestSourceHeader(false, 16, 16), TestFinalityProof(16)), + ], + ); + } + + fn run_only_mandatory_headers_mode_test( + only_mandatory_headers: bool, + has_mandatory_headers: bool, + ) -> Option> { + let (exit_sender, _) = futures::channel::mpsc::unbounded(); + let (source_client, target_client) = prepare_test_clients( + exit_sender, + |_| false, + vec![ + (6, (TestSourceHeader(false, 6, 6), Some(TestFinalityProof(6)))), + (7, (TestSourceHeader(false, 7, 7), Some(TestFinalityProof(7)))), + (8, (TestSourceHeader(has_mandatory_headers, 8, 8), Some(TestFinalityProof(8)))), + (9, (TestSourceHeader(false, 9, 9), Some(TestFinalityProof(9)))), + (10, (TestSourceHeader(false, 10, 10), Some(TestFinalityProof(10)))), + ] + .into_iter() + .collect(), + ); + async_std::task::block_on(async { + let mut finality_loop = FinalityLoop::new( + source_client, + target_client, + FinalitySyncParams { + tick: Duration::from_secs(0), + recent_finality_proofs_limit: 0, + stall_timeout: Duration::from_secs(0), + only_mandatory_headers, + }, + None, + ); + let info = SyncInfo { + best_number_at_source: 10, + best_number_at_target: 5, + is_using_same_fork: true, + }; + finality_loop.select_header_to_submit(&info).await.unwrap() + }) + } + + #[test] + fn select_header_to_submit_skips_non_mandatory_headers_when_only_mandatory_headers_are_required( + ) { + assert_eq!(run_only_mandatory_headers_mode_test(true, false), None); + assert_eq!( + run_only_mandatory_headers_mode_test(false, false), + Some(JustifiedHeader { + header: TestSourceHeader(false, 10, 10), + proof: TestFinalityProof(10) + }), + ); + } + + #[test] + fn select_header_to_submit_selects_mandatory_headers_when_only_mandatory_headers_are_required() + { + assert_eq!( + run_only_mandatory_headers_mode_test(true, true), + Some(JustifiedHeader { + header: TestSourceHeader(true, 8, 8), + proof: TestFinalityProof(8) + }), + ); + assert_eq!( + run_only_mandatory_headers_mode_test(false, true), + Some(JustifiedHeader { + header: TestSourceHeader(true, 8, 8), + proof: TestFinalityProof(8) + }), + ); + } + + #[test] + fn different_forks_at_source_and_at_target_are_detected() { + let (exit_sender, _exit_receiver) = futures::channel::mpsc::unbounded(); + let (source_client, target_client) = prepare_test_clients( + exit_sender, + |_| false, + vec![ + (5, (TestSourceHeader(false, 5, 42), None)), + (6, (TestSourceHeader(false, 6, 6), None)), + (7, (TestSourceHeader(false, 7, 7), None)), + (8, (TestSourceHeader(false, 8, 8), None)), + (9, (TestSourceHeader(false, 9, 9), None)), + (10, (TestSourceHeader(false, 10, 10), None)), + ] + .into_iter() + .collect(), + ); + + let metrics_sync = SyncLoopMetrics::new(None, "source", "target").unwrap(); + async_std::task::block_on(async { + let mut finality_loop = FinalityLoop::new( + source_client, + target_client, + test_sync_params(), + Some(metrics_sync.clone()), + ); + finality_loop.run_iteration().await.unwrap() + }); + + assert!(!metrics_sync.is_using_same_fork()); + } +} diff --git a/bridges/relays/finality/src/finality_proofs.rs b/bridges/relays/finality/src/finality_proofs.rs new file mode 100644 index 0000000000000000000000000000000000000000..e78cf8d62790dfc5ad665b1d4f298a5abe592164 --- /dev/null +++ b/bridges/relays/finality/src/finality_proofs.rs @@ -0,0 +1,222 @@ +// Copyright 2019-2023 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +use crate::{base::SourceClientBase, FinalityPipeline}; + +use bp_header_chain::FinalityProof; +use futures::{FutureExt, Stream, StreamExt}; +use std::pin::Pin; + +/// Source finality proofs stream that may be restarted. +#[derive(Default)] +pub struct FinalityProofsStream> { + /// The underlying stream. + stream: Option>>, +} + +impl> FinalityProofsStream { + pub fn new() -> Self { + Self { stream: None } + } + + pub fn from_stream(stream: SC::FinalityProofsStream) -> Self { + Self { stream: Some(Box::pin(stream)) } + } + + fn next(&mut self) -> Option<::Item> { + let stream = match &mut self.stream { + Some(stream) => stream, + None => return None, + }; + + match stream.next().now_or_never() { + Some(Some(finality_proof)) => Some(finality_proof), + Some(None) => { + self.stream = None; + None + }, + None => None, + } + } + + pub async fn ensure_stream(&mut self, source_client: &SC) -> Result<(), SC::Error> { + if self.stream.is_none() { + log::warn!(target: "bridge", "{} finality proofs stream is being started / restarted", + P::SOURCE_NAME); + + let stream = source_client.finality_proofs().await.map_err(|error| { + log::error!( + target: "bridge", + "Failed to subscribe to {} justifications: {:?}", + P::SOURCE_NAME, + error, + ); + + error + })?; + self.stream = Some(Box::pin(stream)); + } + + Ok(()) + } +} + +/// Source finality proofs buffer. +pub struct FinalityProofsBuf { + /// Proofs buffer. Ordered by target header number. + buf: Vec, +} + +impl FinalityProofsBuf

{ + pub fn new(buf: Vec) -> Self { + Self { buf } + } + + pub fn buf(&self) -> &Vec { + &self.buf + } + + pub fn fill>(&mut self, stream: &mut FinalityProofsStream) { + let mut proofs_count = 0; + let mut first_header_number = None; + let mut last_header_number = None; + while let Some(finality_proof) = stream.next() { + let target_header_number = finality_proof.target_header_number(); + first_header_number.get_or_insert(target_header_number); + last_header_number = Some(target_header_number); + proofs_count += 1; + + self.buf.push(finality_proof); + } + + if proofs_count != 0 { + log::trace!( + target: "bridge", + "Read {} finality proofs from {} finality stream for headers in range [{:?}; {:?}]", + proofs_count, + P::SOURCE_NAME, + first_header_number, + last_header_number, + ); + } + } + + /// Prune all finality proofs that target header numbers older than `first_to_keep`. + pub fn prune(&mut self, first_to_keep: P::Number, maybe_buf_limit: Option) { + let first_to_keep_idx = self + .buf + .binary_search_by_key(&first_to_keep, |hdr| hdr.target_header_number()) + .map(|idx| idx + 1) + .unwrap_or_else(|idx| idx); + let buf_limit_idx = match maybe_buf_limit { + Some(buf_limit) => self.buf.len().saturating_sub(buf_limit), + None => 0, + }; + + self.buf = self.buf.split_off(std::cmp::max(first_to_keep_idx, buf_limit_idx)); + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::mock::*; + + #[test] + fn finality_proofs_buf_fill_works() { + // when stream is currently empty, nothing is changed + let mut finality_proofs_buf = + FinalityProofsBuf:: { buf: vec![TestFinalityProof(1)] }; + let mut stream = + FinalityProofsStream::::from_stream( + Box::pin(futures::stream::pending()), + ); + finality_proofs_buf.fill(&mut stream); + assert_eq!(finality_proofs_buf.buf, vec![TestFinalityProof(1)]); + assert!(stream.stream.is_some()); + + // when stream has entry with target, it is added to the recent proofs container + let mut stream = + FinalityProofsStream::::from_stream( + Box::pin( + futures::stream::iter(vec![TestFinalityProof(4)]) + .chain(futures::stream::pending()), + ), + ); + finality_proofs_buf.fill(&mut stream); + assert_eq!(finality_proofs_buf.buf, vec![TestFinalityProof(1), TestFinalityProof(4)]); + assert!(stream.stream.is_some()); + + // when stream has ended, we'll need to restart it + let mut stream = + FinalityProofsStream::::from_stream( + Box::pin(futures::stream::empty()), + ); + finality_proofs_buf.fill(&mut stream); + assert_eq!(finality_proofs_buf.buf, vec![TestFinalityProof(1), TestFinalityProof(4)]); + assert!(stream.stream.is_none()); + } + + #[test] + fn finality_proofs_buf_prune_works() { + let original_finality_proofs_buf: Vec< + ::FinalityProof, + > = vec![ + TestFinalityProof(10), + TestFinalityProof(13), + TestFinalityProof(15), + TestFinalityProof(17), + TestFinalityProof(19), + ] + .into_iter() + .collect(); + + // when there's proof for justified header in the vec + let mut finality_proofs_buf = FinalityProofsBuf:: { + buf: original_finality_proofs_buf.clone(), + }; + finality_proofs_buf.prune(10, None); + assert_eq!(&original_finality_proofs_buf[1..], finality_proofs_buf.buf,); + + // when there are no proof for justified header in the vec + let mut finality_proofs_buf = FinalityProofsBuf:: { + buf: original_finality_proofs_buf.clone(), + }; + finality_proofs_buf.prune(11, None); + assert_eq!(&original_finality_proofs_buf[1..], finality_proofs_buf.buf,); + + // when there are too many entries after initial prune && they also need to be pruned + let mut finality_proofs_buf = FinalityProofsBuf:: { + buf: original_finality_proofs_buf.clone(), + }; + finality_proofs_buf.prune(10, Some(2)); + assert_eq!(&original_finality_proofs_buf[3..], finality_proofs_buf.buf,); + + // when last entry is pruned + let mut finality_proofs_buf = FinalityProofsBuf:: { + buf: original_finality_proofs_buf.clone(), + }; + finality_proofs_buf.prune(19, Some(2)); + assert_eq!(&original_finality_proofs_buf[5..], finality_proofs_buf.buf,); + + // when post-last entry is pruned + let mut finality_proofs_buf = FinalityProofsBuf:: { + buf: original_finality_proofs_buf.clone(), + }; + finality_proofs_buf.prune(20, Some(2)); + assert_eq!(&original_finality_proofs_buf[5..], finality_proofs_buf.buf,); + } +} diff --git a/bridges/relays/finality/src/headers.rs b/bridges/relays/finality/src/headers.rs new file mode 100644 index 0000000000000000000000000000000000000000..91f7cd0378ecd9ac8a0ee558266d993cc2253c9e --- /dev/null +++ b/bridges/relays/finality/src/headers.rs @@ -0,0 +1,238 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +use crate::{ + finality_loop::SyncInfo, finality_proofs::FinalityProofsBuf, Error, FinalitySyncPipeline, + SourceClient, SourceHeader, TargetClient, +}; + +use bp_header_chain::FinalityProof; +use std::cmp::Ordering; + +/// Unjustified headers container. Ordered by header number. +pub type UnjustifiedHeaders = Vec; + +#[derive(Debug)] +#[cfg_attr(test, derive(Clone, PartialEq))] +pub struct JustifiedHeader { + pub header: P::Header, + pub proof: P::FinalityProof, +} + +impl JustifiedHeader

{ + pub fn number(&self) -> P::Number { + self.header.number() + } +} + +/// Finality proof that has been selected by the `read_missing_headers` function. +pub enum JustifiedHeaderSelector { + /// Mandatory header and its proof has been selected. We shall submit proof for this header. + Mandatory(JustifiedHeader

), + /// Regular header and its proof has been selected. We may submit this proof, or proof for + /// some better header. + Regular(UnjustifiedHeaders, JustifiedHeader

), + /// We haven't found any missing header with persistent proof at the target client. + None(UnjustifiedHeaders), +} + +impl JustifiedHeaderSelector

{ + pub(crate) async fn new, TC: TargetClient

>( + source_client: &SC, + info: &SyncInfo

, + ) -> Result> { + let mut unjustified_headers = Vec::new(); + let mut maybe_justified_header = None; + + let mut header_number = info.best_number_at_target + 1.into(); + while header_number <= info.best_number_at_source { + let (header, maybe_proof) = source_client + .header_and_finality_proof(header_number) + .await + .map_err(Error::Source)?; + + match (header.is_mandatory(), maybe_proof) { + (true, Some(proof)) => { + log::trace!(target: "bridge", "Header {:?} is mandatory", header_number); + return Ok(Self::Mandatory(JustifiedHeader { header, proof })) + }, + (true, None) => return Err(Error::MissingMandatoryFinalityProof(header.number())), + (false, Some(proof)) => { + log::trace!(target: "bridge", "Header {:?} has persistent finality proof", header_number); + unjustified_headers.clear(); + maybe_justified_header = Some(JustifiedHeader { header, proof }); + }, + (false, None) => { + unjustified_headers.push(header); + }, + } + + header_number = header_number + 1.into(); + } + + log::trace!( + target: "bridge", + "Read {} {} headers. Selected finality proof for header: {:?}", + info.num_headers(), + P::SOURCE_NAME, + maybe_justified_header.as_ref().map(|justified_header| &justified_header.header), + ); + + Ok(match maybe_justified_header { + Some(justified_header) => Self::Regular(unjustified_headers, justified_header), + None => Self::None(unjustified_headers), + }) + } + + pub fn select_mandatory(self) -> Option> { + match self { + JustifiedHeaderSelector::Mandatory(header) => Some(header), + _ => None, + } + } + + pub fn select(self, buf: &FinalityProofsBuf

) -> Option> { + let (unjustified_headers, maybe_justified_header) = match self { + JustifiedHeaderSelector::Mandatory(justified_header) => return Some(justified_header), + JustifiedHeaderSelector::Regular(unjustified_headers, justified_header) => + (unjustified_headers, Some(justified_header)), + JustifiedHeaderSelector::None(unjustified_headers) => (unjustified_headers, None), + }; + + let mut finality_proofs_iter = buf.buf().iter().rev(); + let mut maybe_finality_proof = finality_proofs_iter.next(); + + let mut unjustified_headers_iter = unjustified_headers.iter().rev(); + let mut maybe_unjustified_header = unjustified_headers_iter.next(); + + while let (Some(finality_proof), Some(unjustified_header)) = + (maybe_finality_proof, maybe_unjustified_header) + { + match finality_proof.target_header_number().cmp(&unjustified_header.number()) { + Ordering::Equal => { + log::trace!( + target: "bridge", + "Managed to improve selected {} finality proof {:?} to {:?}.", + P::SOURCE_NAME, + maybe_justified_header.as_ref().map(|justified_header| justified_header.number()), + finality_proof.target_header_number() + ); + return Some(JustifiedHeader { + header: unjustified_header.clone(), + proof: finality_proof.clone(), + }) + }, + Ordering::Less => maybe_unjustified_header = unjustified_headers_iter.next(), + Ordering::Greater => { + maybe_finality_proof = finality_proofs_iter.next(); + }, + } + } + + log::trace!( + target: "bridge", + "Could not improve selected {} finality proof {:?}.", + P::SOURCE_NAME, + maybe_justified_header.as_ref().map(|justified_header| justified_header.number()) + ); + maybe_justified_header + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::mock::*; + + #[test] + fn select_better_recent_finality_proof_works() { + // if there are no unjustified headers, nothing is changed + let finality_proofs_buf = + FinalityProofsBuf::::new(vec![TestFinalityProof(5)]); + let justified_header = + JustifiedHeader { header: TestSourceHeader(false, 2, 2), proof: TestFinalityProof(2) }; + let selector = JustifiedHeaderSelector::Regular(vec![], justified_header.clone()); + assert_eq!(selector.select(&finality_proofs_buf), Some(justified_header)); + + // if there are no buffered finality proofs, nothing is changed + let finality_proofs_buf = FinalityProofsBuf::::new(vec![]); + let justified_header = + JustifiedHeader { header: TestSourceHeader(false, 2, 2), proof: TestFinalityProof(2) }; + let selector = JustifiedHeaderSelector::Regular( + vec![TestSourceHeader(false, 5, 5)], + justified_header.clone(), + ); + assert_eq!(selector.select(&finality_proofs_buf), Some(justified_header)); + + // if there's no intersection between recent finality proofs and unjustified headers, + // nothing is changed + let finality_proofs_buf = FinalityProofsBuf::::new(vec![ + TestFinalityProof(1), + TestFinalityProof(4), + ]); + let justified_header = + JustifiedHeader { header: TestSourceHeader(false, 2, 2), proof: TestFinalityProof(2) }; + let selector = JustifiedHeaderSelector::Regular( + vec![TestSourceHeader(false, 9, 9), TestSourceHeader(false, 10, 10)], + justified_header.clone(), + ); + assert_eq!(selector.select(&finality_proofs_buf), Some(justified_header)); + + // if there's intersection between recent finality proofs and unjustified headers, but there + // are no proofs in this intersection, nothing is changed + let finality_proofs_buf = FinalityProofsBuf::::new(vec![ + TestFinalityProof(7), + TestFinalityProof(11), + ]); + let justified_header = + JustifiedHeader { header: TestSourceHeader(false, 2, 2), proof: TestFinalityProof(2) }; + let selector = JustifiedHeaderSelector::Regular( + vec![ + TestSourceHeader(false, 8, 8), + TestSourceHeader(false, 9, 9), + TestSourceHeader(false, 10, 10), + ], + justified_header.clone(), + ); + assert_eq!(selector.select(&finality_proofs_buf), Some(justified_header)); + + // if there's intersection between recent finality proofs and unjustified headers and + // there's a proof in this intersection: + // - this better (last from intersection) proof is selected; + // - 'obsolete' unjustified headers are pruned. + let finality_proofs_buf = FinalityProofsBuf::::new(vec![ + TestFinalityProof(7), + TestFinalityProof(9), + ]); + let justified_header = + JustifiedHeader { header: TestSourceHeader(false, 2, 2), proof: TestFinalityProof(2) }; + let selector = JustifiedHeaderSelector::Regular( + vec![ + TestSourceHeader(false, 8, 8), + TestSourceHeader(false, 9, 9), + TestSourceHeader(false, 10, 10), + ], + justified_header, + ); + assert_eq!( + selector.select(&finality_proofs_buf), + Some(JustifiedHeader { + header: TestSourceHeader(false, 9, 9), + proof: TestFinalityProof(9) + }) + ); + } +} diff --git a/bridges/relays/finality/src/lib.rs b/bridges/relays/finality/src/lib.rs new file mode 100644 index 0000000000000000000000000000000000000000..3579e68e1ef9c686575e3ddba239bead7bd9312f --- /dev/null +++ b/bridges/relays/finality/src/lib.rs @@ -0,0 +1,91 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! This crate has single entrypoint to run synchronization loop that is built around finality +//! proofs, as opposed to headers synchronization loop, which is built around headers. The headers +//! are still submitted to the target node, but are treated as auxiliary data as we are not trying +//! to submit all source headers to the target node. + +pub use crate::{ + base::{FinalityPipeline, SourceClientBase}, + finality_loop::{metrics_prefix, run, FinalitySyncParams, SourceClient, TargetClient}, + finality_proofs::{FinalityProofsBuf, FinalityProofsStream}, + sync_loop_metrics::SyncLoopMetrics, +}; + +use bp_header_chain::ConsensusLogReader; +use relay_utils::{FailedClient, MaybeConnectionError}; +use std::fmt::Debug; + +mod base; +mod finality_loop; +mod finality_proofs; +mod headers; +mod mock; +mod sync_loop_metrics; + +/// Finality proofs synchronization pipeline. +pub trait FinalitySyncPipeline: FinalityPipeline { + /// A reader that can extract the consensus log from the header digest and interpret it. + type ConsensusLogReader: ConsensusLogReader; + /// Type of header that we're syncing. + type Header: SourceHeader; +} + +/// Header that we're receiving from source node. +pub trait SourceHeader: Clone + Debug + PartialEq + Send + Sync { + /// Returns hash of header. + fn hash(&self) -> Hash; + /// Returns number of header. + fn number(&self) -> Number; + /// Returns true if this header needs to be submitted to target node. + fn is_mandatory(&self) -> bool; +} + +/// Error that may happen inside finality synchronization loop. +#[derive(Debug)] +enum Error { + /// Source client request has failed with given error. + Source(SourceError), + /// Target client request has failed with given error. + Target(TargetError), + /// Finality proof for mandatory header is missing from the source node. + MissingMandatoryFinalityProof(P::Number), + /// `submit_finality_proof` transaction failed + ProofSubmissionTxFailed { + #[allow(dead_code)] + submitted_number: P::Number, + #[allow(dead_code)] + best_number_at_target: P::Number, + }, + /// `submit_finality_proof` transaction lost + ProofSubmissionTxLost, +} + +impl Error +where + P: FinalitySyncPipeline, + SourceError: MaybeConnectionError, + TargetError: MaybeConnectionError, +{ + fn fail_if_connection_error(&self) -> Result<(), FailedClient> { + match *self { + Error::Source(ref error) if error.is_connection_error() => Err(FailedClient::Source), + Error::Target(ref error) if error.is_connection_error() => Err(FailedClient::Target), + _ => Ok(()), + } + } +} diff --git a/bridges/relays/finality/src/mock.rs b/bridges/relays/finality/src/mock.rs new file mode 100644 index 0000000000000000000000000000000000000000..e3ec4e4d0d47a04ce5a22ee75374ebe08064df5e --- /dev/null +++ b/bridges/relays/finality/src/mock.rs @@ -0,0 +1,213 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Tests for finality synchronization loop. + +#![cfg(test)] + +use crate::{ + base::SourceClientBase, + finality_loop::{SourceClient, TargetClient}, + FinalityPipeline, FinalitySyncPipeline, SourceHeader, +}; + +use async_trait::async_trait; +use bp_header_chain::{FinalityProof, GrandpaConsensusLogReader}; +use futures::{Stream, StreamExt}; +use parking_lot::Mutex; +use relay_utils::{ + relay_loop::Client as RelayClient, HeaderId, MaybeConnectionError, TrackedTransactionStatus, + TransactionTracker, +}; +use std::{collections::HashMap, pin::Pin, sync::Arc}; + +type IsMandatory = bool; +pub type TestNumber = u64; +type TestHash = u64; + +#[derive(Clone, Debug)] +pub struct TestTransactionTracker(pub TrackedTransactionStatus>); + +impl Default for TestTransactionTracker { + fn default() -> TestTransactionTracker { + TestTransactionTracker(TrackedTransactionStatus::Finalized(Default::default())) + } +} + +#[async_trait] +impl TransactionTracker for TestTransactionTracker { + type HeaderId = HeaderId; + + async fn wait(self) -> TrackedTransactionStatus> { + self.0 + } +} + +#[derive(Debug, Clone)] +pub enum TestError { + NonConnection, +} + +impl MaybeConnectionError for TestError { + fn is_connection_error(&self) -> bool { + false + } +} + +#[derive(Debug, Clone, PartialEq)] +pub struct TestFinalitySyncPipeline; + +impl FinalityPipeline for TestFinalitySyncPipeline { + const SOURCE_NAME: &'static str = "TestSource"; + const TARGET_NAME: &'static str = "TestTarget"; + + type Hash = TestHash; + type Number = TestNumber; + type FinalityProof = TestFinalityProof; +} + +impl FinalitySyncPipeline for TestFinalitySyncPipeline { + type ConsensusLogReader = GrandpaConsensusLogReader; + type Header = TestSourceHeader; +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct TestSourceHeader(pub IsMandatory, pub TestNumber, pub TestHash); + +impl SourceHeader> + for TestSourceHeader +{ + fn hash(&self) -> TestHash { + self.2 + } + + fn number(&self) -> TestNumber { + self.1 + } + + fn is_mandatory(&self) -> bool { + self.0 + } +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct TestFinalityProof(pub TestNumber); + +impl FinalityProof for TestFinalityProof { + fn target_header_hash(&self) -> TestHash { + Default::default() + } + + fn target_header_number(&self) -> TestNumber { + self.0 + } +} + +#[derive(Debug, Clone, Default)] +pub struct ClientsData { + pub source_best_block_number: TestNumber, + pub source_headers: HashMap)>, + pub source_proofs: Vec, + + pub target_best_block_id: HeaderId, + pub target_headers: Vec<(TestSourceHeader, TestFinalityProof)>, + pub target_transaction_tracker: TestTransactionTracker, +} + +#[derive(Clone)] +pub struct TestSourceClient { + pub on_method_call: Arc, + pub data: Arc>, +} + +#[async_trait] +impl RelayClient for TestSourceClient { + type Error = TestError; + + async fn reconnect(&mut self) -> Result<(), TestError> { + unreachable!() + } +} + +#[async_trait] +impl SourceClientBase for TestSourceClient { + type FinalityProofsStream = Pin + 'static + Send>>; + + async fn finality_proofs(&self) -> Result { + let mut data = self.data.lock(); + (self.on_method_call)(&mut data); + Ok(futures::stream::iter(data.source_proofs.clone()).boxed()) + } +} + +#[async_trait] +impl SourceClient for TestSourceClient { + async fn best_finalized_block_number(&self) -> Result { + let mut data = self.data.lock(); + (self.on_method_call)(&mut data); + Ok(data.source_best_block_number) + } + + async fn header_and_finality_proof( + &self, + number: TestNumber, + ) -> Result<(TestSourceHeader, Option), TestError> { + let mut data = self.data.lock(); + (self.on_method_call)(&mut data); + data.source_headers.get(&number).cloned().ok_or(TestError::NonConnection) + } +} + +#[derive(Clone)] +pub struct TestTargetClient { + pub on_method_call: Arc, + pub data: Arc>, +} + +#[async_trait] +impl RelayClient for TestTargetClient { + type Error = TestError; + + async fn reconnect(&mut self) -> Result<(), TestError> { + unreachable!() + } +} + +#[async_trait] +impl TargetClient for TestTargetClient { + type TransactionTracker = TestTransactionTracker; + + async fn best_finalized_source_block_id( + &self, + ) -> Result, TestError> { + let mut data = self.data.lock(); + (self.on_method_call)(&mut data); + Ok(data.target_best_block_id) + } + + async fn submit_finality_proof( + &self, + header: TestSourceHeader, + proof: TestFinalityProof, + ) -> Result { + let mut data = self.data.lock(); + (self.on_method_call)(&mut data); + data.target_best_block_id = HeaderId(header.number(), header.hash()); + data.target_headers.push((header, proof)); + (self.on_method_call)(&mut data); + Ok(data.target_transaction_tracker.clone()) + } +} diff --git a/bridges/relays/finality/src/sync_loop_metrics.rs b/bridges/relays/finality/src/sync_loop_metrics.rs new file mode 100644 index 0000000000000000000000000000000000000000..4da1df811f6ece0597520a99c44c1e29171c3e20 --- /dev/null +++ b/bridges/relays/finality/src/sync_loop_metrics.rs @@ -0,0 +1,95 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Metrics for headers synchronization relay loop. + +use relay_utils::{ + metrics::{metric_name, register, IntGauge, Metric, PrometheusError, Registry}, + UniqueSaturatedInto, +}; + +/// Headers sync metrics. +#[derive(Clone)] +pub struct SyncLoopMetrics { + /// Best syncing header at the source. + best_source_block_number: IntGauge, + /// Best syncing header at the target. + best_target_block_number: IntGauge, + /// Flag that has `0` value when best source headers at the source node and at-target-chain + /// are matching and `1` otherwise. + using_different_forks: IntGauge, +} + +impl SyncLoopMetrics { + /// Create and register headers loop metrics. + pub fn new( + prefix: Option<&str>, + at_source_chain_label: &str, + at_target_chain_label: &str, + ) -> Result { + Ok(SyncLoopMetrics { + best_source_block_number: IntGauge::new( + metric_name(prefix, &format!("best_{at_source_chain_label}_block_number")), + format!("Best block number at the {at_source_chain_label}"), + )?, + best_target_block_number: IntGauge::new( + metric_name(prefix, &format!("best_{at_target_chain_label}_block_number")), + format!("Best block number at the {at_target_chain_label}"), + )?, + using_different_forks: IntGauge::new( + metric_name(prefix, &format!("is_{at_source_chain_label}_and_{at_target_chain_label}_using_different_forks")), + "Whether the best finalized source block at target node is different (value 1) from the \ + corresponding block at the source node", + )?, + }) + } + + /// Returns current value of the using-same-fork flag. + #[cfg(test)] + pub(crate) fn is_using_same_fork(&self) -> bool { + self.using_different_forks.get() == 0 + } + + /// Update best block number at source. + pub fn update_best_block_at_source>( + &self, + source_best_number: Number, + ) { + self.best_source_block_number.set(source_best_number.unique_saturated_into()); + } + + /// Update best block number at target. + pub fn update_best_block_at_target>( + &self, + target_best_number: Number, + ) { + self.best_target_block_number.set(target_best_number.unique_saturated_into()); + } + + /// Update using-same-fork flag. + pub fn update_using_same_fork(&self, using_same_fork: bool) { + self.using_different_forks.set((!using_same_fork).into()) + } +} + +impl Metric for SyncLoopMetrics { + fn register(&self, registry: &Registry) -> Result<(), PrometheusError> { + register(self.best_source_block_number.clone(), registry)?; + register(self.best_target_block_number.clone(), registry)?; + register(self.using_different_forks.clone(), registry)?; + Ok(()) + } +} diff --git a/bridges/relays/lib-substrate-relay/Cargo.toml b/bridges/relays/lib-substrate-relay/Cargo.toml new file mode 100644 index 0000000000000000000000000000000000000000..3f657645b591c51ab74c5b6b64bfdd8ca04e7b18 --- /dev/null +++ b/bridges/relays/lib-substrate-relay/Cargo.toml @@ -0,0 +1,62 @@ +[package] +name = "substrate-relay-helper" +version = "0.1.0" +authors.workspace = true +edition.workspace = true +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" +repository.workspace = true +publish = false + +[lints] +workspace = true + +[dependencies] +anyhow = "1.0" +async-std = "1.9.0" +async-trait = "0.1.79" +codec = { package = "parity-scale-codec", version = "3.6.1" } +futures = "0.3.30" +hex = "0.4" +log = { workspace = true } +num-traits = "0.2" +rbtag = "0.3" +structopt = "0.3" +strum = { version = "0.26.2", features = ["derive"] } +thiserror = { workspace = true } + +# Bridge dependencies + +bp-header-chain = { path = "../../primitives/header-chain" } +bp-parachains = { path = "../../primitives/parachains" } +bp-polkadot-core = { path = "../../primitives/polkadot-core" } +bp-relayers = { path = "../../primitives/relayers" } +bridge-runtime-common = { path = "../../bin/runtime-common" } + +equivocation-detector = { path = "../equivocation" } +finality-grandpa = { version = "0.16.2" } +finality-relay = { path = "../finality" } +parachains-relay = { path = "../parachains" } +relay-utils = { path = "../utils" } +messages-relay = { path = "../messages" } +relay-substrate-client = { path = "../client-substrate" } + +pallet-bridge-grandpa = { path = "../../modules/grandpa" } +pallet-bridge-messages = { path = "../../modules/messages" } +pallet-bridge-parachains = { path = "../../modules/parachains" } + +bp-runtime = { path = "../../primitives/runtime" } +bp-messages = { path = "../../primitives/messages" } + +# Substrate Dependencies + +frame-support = { path = "../../../substrate/frame/support" } +frame-system = { path = "../../../substrate/frame/system" } +pallet-balances = { path = "../../../substrate/frame/balances" } +pallet-grandpa = { path = "../../../substrate/frame/grandpa" } +sp-core = { path = "../../../substrate/primitives/core" } +sp-consensus-grandpa = { path = "../../../substrate/primitives/consensus/grandpa" } +sp-runtime = { path = "../../../substrate/primitives/runtime" } + +[dev-dependencies] +pallet-transaction-payment = { path = "../../../substrate/frame/transaction-payment" } +relay-substrate-client = { path = "../client-substrate", features = ["test-helpers"] } diff --git a/bridges/relays/lib-substrate-relay/src/cli/bridge.rs b/bridges/relays/lib-substrate-relay/src/cli/bridge.rs new file mode 100644 index 0000000000000000000000000000000000000000..316f59a2b0c86e1bc78c1446bb69a90b0b0bf0f7 --- /dev/null +++ b/bridges/relays/lib-substrate-relay/src/cli/bridge.rs @@ -0,0 +1,110 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Basic traits for exposing bridges in the CLI. + +use crate::{ + equivocation::SubstrateEquivocationDetectionPipeline, + finality::SubstrateFinalitySyncPipeline, + messages_lane::{MessagesRelayLimits, SubstrateMessageLane}, + parachains::SubstrateParachainsPipeline, +}; +use pallet_bridge_parachains::{RelayBlockHash, RelayBlockHasher, RelayBlockNumber}; +use relay_substrate_client::{ + Chain, ChainWithRuntimeVersion, ChainWithTransactions, Parachain, RelayChain, +}; + +/// Minimal bridge representation that can be used from the CLI. +/// It connects a source chain to a target chain. +pub trait CliBridgeBase: Sized { + /// The source chain. + type Source: Chain + ChainWithRuntimeVersion; + /// The target chain. + type Target: ChainWithTransactions + ChainWithRuntimeVersion; +} + +/// Bridge representation that can be used from the CLI for relaying headers +/// from a relay chain to a relay chain. +pub trait RelayToRelayHeadersCliBridge: CliBridgeBase { + /// Finality proofs synchronization pipeline. + type Finality: SubstrateFinalitySyncPipeline< + SourceChain = Self::Source, + TargetChain = Self::Target, + >; +} + +/// Convenience trait that adds bounds to `CliBridgeBase`. +pub trait RelayToRelayEquivocationDetectionCliBridgeBase: CliBridgeBase { + /// The source chain with extra bounds. + type BoundedSource: ChainWithTransactions; +} + +impl RelayToRelayEquivocationDetectionCliBridgeBase for T +where + T: CliBridgeBase, + T::Source: ChainWithTransactions, +{ + type BoundedSource = T::Source; +} + +/// Bridge representation that can be used from the CLI for detecting equivocations +/// in the headers synchronized from a relay chain to a relay chain. +pub trait RelayToRelayEquivocationDetectionCliBridge: + RelayToRelayEquivocationDetectionCliBridgeBase +{ + /// Equivocation detection pipeline. + type Equivocation: SubstrateEquivocationDetectionPipeline< + SourceChain = Self::Source, + TargetChain = Self::Target, + >; +} + +/// Bridge representation that can be used from the CLI for relaying headers +/// from a parachain to a relay chain. +pub trait ParachainToRelayHeadersCliBridge: CliBridgeBase +where + Self::Source: Parachain, +{ + /// The `CliBridgeBase` type represents the parachain in this situation. + /// We need to add an extra type for the relay chain. + type SourceRelay: Chain + + ChainWithRuntimeVersion + + RelayChain; + /// Finality proofs synchronization pipeline (source parachain -> target). + type ParachainFinality: SubstrateParachainsPipeline< + SourceRelayChain = Self::SourceRelay, + SourceParachain = Self::Source, + TargetChain = Self::Target, + >; + /// Finality proofs synchronization pipeline (source relay chain -> target). + type RelayFinality: SubstrateFinalitySyncPipeline< + SourceChain = Self::SourceRelay, + TargetChain = Self::Target, + >; +} + +/// Bridge representation that can be used from the CLI for relaying messages. +pub trait MessagesCliBridge: CliBridgeBase { + /// The Source -> Destination messages synchronization pipeline. + type MessagesLane: SubstrateMessageLane; + + /// Optional messages delivery transaction limits that the messages relay is going + /// to use. If it returns `None`, limits are estimated using `TransactionPayment` API + /// at the target chain. + fn maybe_messages_limits() -> Option { + None + } +} diff --git a/bridges/relays/lib-substrate-relay/src/cli/chain_schema.rs b/bridges/relays/lib-substrate-relay/src/cli/chain_schema.rs new file mode 100644 index 0000000000000000000000000000000000000000..6246bdbf015152fe0e82ac0a8287692df6a1ace9 --- /dev/null +++ b/bridges/relays/lib-substrate-relay/src/cli/chain_schema.rs @@ -0,0 +1,261 @@ +// Copyright 2019-2022 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Primitives related to chain CLI options. + +use relay_substrate_client::{AccountKeyPairOf, ChainWithTransactions}; +use structopt::StructOpt; +use strum::{EnumString, VariantNames}; + +use relay_substrate_client::{ChainRuntimeVersion, ChainWithRuntimeVersion, SimpleRuntimeVersion}; + +use crate::TransactionParams; + +#[doc = "Runtime version params."] +#[derive(StructOpt, Debug, PartialEq, Eq, Clone, Copy, EnumString, VariantNames)] +pub enum RuntimeVersionType { + /// Auto query version from chain + Auto, + /// Custom `spec_version` and `transaction_version` + Custom, + /// Read version from bundle dependencies directly. + Bundle, +} + +/// Create chain-specific set of runtime version parameters. +#[macro_export] +macro_rules! declare_chain_runtime_version_params_cli_schema { + ($chain:ident, $chain_prefix:ident) => { + bp_runtime::paste::item! { + #[doc = $chain " runtime version params."] + #[derive(StructOpt, Debug, PartialEq, Eq, Clone, Copy)] + pub struct [<$chain RuntimeVersionParams>] { + #[doc = "The type of runtime version for chain " $chain] + #[structopt(long, default_value = "Bundle")] + pub [<$chain_prefix _version_mode>]: RuntimeVersionType, + #[doc = "The custom sepc_version for chain " $chain] + #[structopt(long)] + pub [<$chain_prefix _spec_version>]: Option, + #[doc = "The custom transaction_version for chain " $chain] + #[structopt(long)] + pub [<$chain_prefix _transaction_version>]: Option, + } + + impl [<$chain RuntimeVersionParams>] { + /// Converts self into `ChainRuntimeVersion`. + pub fn into_runtime_version( + self, + bundle_runtime_version: Option, + ) -> anyhow::Result { + Ok(match self.[<$chain_prefix _version_mode>] { + RuntimeVersionType::Auto => ChainRuntimeVersion::Auto, + RuntimeVersionType::Custom => { + let custom_spec_version = self.[<$chain_prefix _spec_version>] + .ok_or_else(|| anyhow::Error::msg(format!("The {}-spec-version is required when choose custom mode", stringify!($chain_prefix))))?; + let custom_transaction_version = self.[<$chain_prefix _transaction_version>] + .ok_or_else(|| anyhow::Error::msg(format!("The {}-transaction-version is required when choose custom mode", stringify!($chain_prefix))))?; + ChainRuntimeVersion::Custom( + SimpleRuntimeVersion { + spec_version: custom_spec_version, + transaction_version: custom_transaction_version + } + ) + }, + RuntimeVersionType::Bundle => match bundle_runtime_version { + Some(runtime_version) => ChainRuntimeVersion::Custom(runtime_version), + None => { + return Err(anyhow::format_err!("Cannot use bundled runtime version of {}: it is not known to the relay", stringify!($chain_prefix))); + } + }, + }) + } + } + } + }; +} + +/// Create chain-specific set of runtime version parameters. +#[macro_export] +macro_rules! declare_chain_connection_params_cli_schema { + ($chain:ident, $chain_prefix:ident) => { + bp_runtime::paste::item! { + // TODO: https://github.com/paritytech/parity-bridges-common/issues/2909 + // remove all obsolete arguments (separate URI components) + + #[doc = $chain " connection params."] + #[derive(StructOpt, Debug, PartialEq, Eq, Clone)] + pub struct [<$chain ConnectionParams>] { + #[doc = "WS endpoint of " $chain ": full URI. Overrides all other connection string components (host, port, path, secure)."] + #[structopt(long)] + pub [<$chain_prefix _uri>]: Option, + #[doc = "WS endpoint of " $chain ": host component."] + #[structopt(long, default_value = "127.0.0.1")] + pub [<$chain_prefix _host>]: String, + #[doc = "WS endpoint of " $chain ": port component."] + #[structopt(long, default_value = "9944")] + pub [<$chain_prefix _port>]: u16, + #[doc = "WS endpoint of " $chain ": path component."] + #[structopt(long)] + pub [<$chain_prefix _path>]: Option, + #[doc = "Use secure websocket connection."] + #[structopt(long)] + pub [<$chain_prefix _secure>]: bool, + #[doc = "Custom runtime version"] + #[structopt(flatten)] + pub [<$chain_prefix _runtime_version>]: [<$chain RuntimeVersionParams>], + } + + impl [<$chain ConnectionParams>] { + /// Convert connection params into Substrate client. + #[allow(dead_code)] + pub async fn into_client( + self, + ) -> anyhow::Result> { + let chain_runtime_version = self + .[<$chain_prefix _runtime_version>] + .into_runtime_version(Chain::RUNTIME_VERSION)?; + Ok(relay_substrate_client::Client::new(relay_substrate_client::ConnectionParams { + uri: self.[<$chain_prefix _uri>], + host: self.[<$chain_prefix _host>], + port: self.[<$chain_prefix _port>], + path: self.[<$chain_prefix _path>], + secure: self.[<$chain_prefix _secure>], + chain_runtime_version, + }) + .await + ) + } + } + } + }; +} + +/// Create chain-specific set of signing parameters. +#[macro_export] +macro_rules! declare_chain_signing_params_cli_schema { + ($chain:ident, $chain_prefix:ident) => { + bp_runtime::paste::item! { + #[doc = $chain " signing params."] + #[derive(StructOpt, Debug, PartialEq, Eq, Clone)] + pub struct [<$chain SigningParams>] { + #[doc = "The SURI of secret key to use when transactions are submitted to the " $chain " node."] + #[structopt(long)] + pub [<$chain_prefix _signer>]: Option, + #[doc = "The password for the SURI of secret key to use when transactions are submitted to the " $chain " node."] + #[structopt(long)] + pub [<$chain_prefix _signer_password>]: Option, + + #[doc = "Path to the file, that contains SURI of secret key to use when transactions are submitted to the " $chain " node. Can be overridden with " $chain_prefix "_signer option."] + #[structopt(long)] + pub [<$chain_prefix _signer_file>]: Option, + #[doc = "Path to the file, that password for the SURI of secret key to use when transactions are submitted to the " $chain " node. Can be overridden with " $chain_prefix "_signer_password option."] + #[structopt(long)] + pub [<$chain_prefix _signer_password_file>]: Option, + + #[doc = "Transactions mortality period, in blocks. MUST be a power of two in [4; 65536] range. MAY NOT be larger than `BlockHashCount` parameter of the chain system module."] + #[structopt(long)] + pub [<$chain_prefix _transactions_mortality>]: Option, + } + + impl [<$chain SigningParams>] { + /// Return transactions mortality. + #[allow(dead_code)] + pub fn transactions_mortality(&self) -> anyhow::Result> { + self.[<$chain_prefix _transactions_mortality>] + .map(|transactions_mortality| { + if !(4..=65536).contains(&transactions_mortality) + || !transactions_mortality.is_power_of_two() + { + Err(anyhow::format_err!( + "Transactions mortality {} is not a power of two in a [4; 65536] range", + transactions_mortality, + )) + } else { + Ok(transactions_mortality) + } + }) + .transpose() + } + + /// Parse signing params into chain-specific KeyPair. + #[allow(dead_code)] + pub fn to_keypair(&self) -> anyhow::Result> { + let suri = match (self.[<$chain_prefix _signer>].as_ref(), self.[<$chain_prefix _signer_file>].as_ref()) { + (Some(suri), _) => suri.to_owned(), + (None, Some(suri_file)) => std::fs::read_to_string(suri_file) + .map_err(|err| anyhow::format_err!( + "Failed to read SURI from file {:?}: {}", + suri_file, + err, + ))?, + (None, None) => return Err(anyhow::format_err!( + "One of options must be specified: '{}' or '{}'", + stringify!([<$chain_prefix _signer>]), + stringify!([<$chain_prefix _signer_file>]), + )), + }; + + let suri_password = match ( + self.[<$chain_prefix _signer_password>].as_ref(), + self.[<$chain_prefix _signer_password_file>].as_ref(), + ) { + (Some(suri_password), _) => Some(suri_password.to_owned()), + (None, Some(suri_password_file)) => std::fs::read_to_string(suri_password_file) + .map(Some) + .map_err(|err| anyhow::format_err!( + "Failed to read SURI password from file {:?}: {}", + suri_password_file, + err, + ))?, + _ => None, + }; + + use sp_core::crypto::Pair; + + AccountKeyPairOf::::from_string( + &suri, + suri_password.as_deref() + ).map_err(|e| anyhow::format_err!("{:?}", e)) + } + + /// Return transaction parameters. + #[allow(dead_code)] + pub fn transaction_params( + &self, + ) -> anyhow::Result>> { + Ok(TransactionParams { + mortality: self.transactions_mortality()?, + signer: self.to_keypair::()?, + }) + } + } + } + }; +} + +/// Create chain-specific set of configuration objects: connection parameters, +/// signing parameters and bridge initialization parameters. +#[macro_export] +macro_rules! declare_chain_cli_schema { + ($chain:ident, $chain_prefix:ident) => { + $crate::declare_chain_runtime_version_params_cli_schema!($chain, $chain_prefix); + $crate::declare_chain_connection_params_cli_schema!($chain, $chain_prefix); + $crate::declare_chain_signing_params_cli_schema!($chain, $chain_prefix); + }; +} + +declare_chain_cli_schema!(Source, source); +declare_chain_cli_schema!(Target, target); diff --git a/bridges/relays/lib-substrate-relay/src/cli/detect_equivocations.rs b/bridges/relays/lib-substrate-relay/src/cli/detect_equivocations.rs new file mode 100644 index 0000000000000000000000000000000000000000..b98e41b2a43e4f88670ac8ed1d7129a0187fecfe --- /dev/null +++ b/bridges/relays/lib-substrate-relay/src/cli/detect_equivocations.rs @@ -0,0 +1,65 @@ +// Copyright 2019-2023 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Primitives for exposing the equivocation detection functionality in the CLI. + +use crate::{ + cli::{bridge::*, chain_schema::*, PrometheusParams}, + equivocation, + equivocation::SubstrateEquivocationDetectionPipeline, +}; + +use async_trait::async_trait; +use relay_substrate_client::ChainWithTransactions; +use structopt::StructOpt; + +/// Start equivocation detection loop. +#[derive(StructOpt)] +pub struct DetectEquivocationsParams { + #[structopt(flatten)] + source: SourceConnectionParams, + #[structopt(flatten)] + source_sign: SourceSigningParams, + #[structopt(flatten)] + target: TargetConnectionParams, + #[structopt(flatten)] + prometheus_params: PrometheusParams, +} + +/// Trait used for starting the equivocation detection loop between 2 chains. +#[async_trait] +pub trait EquivocationsDetector: RelayToRelayEquivocationDetectionCliBridge +where + Self::Source: ChainWithTransactions, +{ + /// Start the equivocation detection loop. + async fn start(data: DetectEquivocationsParams) -> anyhow::Result<()> { + let source_client = data.source.into_client::().await?; + Self::Equivocation::start_relay_guards( + &source_client, + source_client.can_start_version_guard(), + ) + .await?; + + equivocation::run::( + source_client, + data.target.into_client::().await?, + data.source_sign.transaction_params::()?, + data.prometheus_params.into_metrics_params()?, + ) + .await + } +} diff --git a/bridges/relays/lib-substrate-relay/src/cli/init_bridge.rs b/bridges/relays/lib-substrate-relay/src/cli/init_bridge.rs new file mode 100644 index 0000000000000000000000000000000000000000..bf7c86437ba77530ad37c5e8d376088639126a22 --- /dev/null +++ b/bridges/relays/lib-substrate-relay/src/cli/init_bridge.rs @@ -0,0 +1,85 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Primitives for exposing the bridge initialization functionality in the CLI. + +use async_trait::async_trait; +use codec::Encode; + +use crate::{ + cli::{bridge::CliBridgeBase, chain_schema::*}, + finality_base::engine::Engine, +}; +use bp_runtime::Chain as ChainBase; +use relay_substrate_client::{AccountKeyPairOf, Chain, UnsignedTransaction}; +use sp_core::Pair; +use structopt::StructOpt; + +/// Bridge initialization params. +#[derive(StructOpt)] +pub struct InitBridgeParams { + #[structopt(flatten)] + source: SourceConnectionParams, + #[structopt(flatten)] + target: TargetConnectionParams, + #[structopt(flatten)] + target_sign: TargetSigningParams, + /// Generates all required data, but does not submit extrinsic + #[structopt(long)] + dry_run: bool, +} + +/// Trait used for bridge initializing. +#[async_trait] +pub trait BridgeInitializer: CliBridgeBase +where + ::AccountId: From< as Pair>::Public>, +{ + /// The finality engine used by the source chain. + type Engine: Engine; + + /// Get the encoded call to init the bridge. + fn encode_init_bridge( + init_data: >::InitializationData, + ) -> ::Call; + + /// Initialize the bridge. + async fn init_bridge(data: InitBridgeParams) -> anyhow::Result<()> { + let source_client = data.source.into_client::().await?; + let target_client = data.target.into_client::().await?; + let target_sign = data.target_sign.to_keypair::()?; + let dry_run = data.dry_run; + + crate::finality::initialize::initialize::( + source_client, + target_client.clone(), + target_sign, + move |transaction_nonce, initialization_data| { + let call = Self::encode_init_bridge(initialization_data); + log::info!( + target: "bridge", + "Initialize bridge call encoded as hex string: {:?}", + format!("0x{}", hex::encode(call.encode())) + ); + Ok(UnsignedTransaction::new(call.into(), transaction_nonce)) + }, + dry_run, + ) + .await; + + Ok(()) + } +} diff --git a/bridges/relays/lib-substrate-relay/src/cli/mod.rs b/bridges/relays/lib-substrate-relay/src/cli/mod.rs new file mode 100644 index 0000000000000000000000000000000000000000..0dd0d5474b3a517b7eb67b641a5d3b427cad2b84 --- /dev/null +++ b/bridges/relays/lib-substrate-relay/src/cli/mod.rs @@ -0,0 +1,192 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Deal with CLI args of substrate-to-substrate relay. + +use codec::{Decode, Encode}; +use rbtag::BuildInfo; +use structopt::StructOpt; +use strum::{EnumString, VariantNames}; + +use bp_messages::LaneId; + +pub mod bridge; +pub mod chain_schema; +pub mod detect_equivocations; +pub mod init_bridge; +pub mod relay_headers; +pub mod relay_headers_and_messages; +pub mod relay_messages; +pub mod relay_parachains; + +/// The target that will be used when publishing logs related to this pallet. +pub const LOG_TARGET: &str = "bridge"; + +/// Lane id. +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct HexLaneId(pub [u8; 4]); + +impl From for LaneId { + fn from(lane_id: HexLaneId) -> LaneId { + LaneId(lane_id.0) + } +} + +impl std::str::FromStr for HexLaneId { + type Err = hex::FromHexError; + + fn from_str(s: &str) -> Result { + let mut lane_id = [0u8; 4]; + hex::decode_to_slice(s, &mut lane_id)?; + Ok(HexLaneId(lane_id)) + } +} + +/// Nicer formatting for raw bytes vectors. +#[derive(Default, Encode, Decode, PartialEq, Eq)] +pub struct HexBytes(pub Vec); + +impl std::str::FromStr for HexBytes { + type Err = hex::FromHexError; + + fn from_str(s: &str) -> Result { + Ok(Self(hex::decode(s)?)) + } +} + +impl std::fmt::Debug for HexBytes { + fn fmt(&self, fmt: &mut std::fmt::Formatter) -> std::fmt::Result { + write!(fmt, "0x{self}") + } +} + +impl std::fmt::Display for HexBytes { + fn fmt(&self, fmt: &mut std::fmt::Formatter) -> std::fmt::Result { + write!(fmt, "{}", hex::encode(&self.0)) + } +} + +/// Prometheus metrics params. +#[derive(Clone, Debug, PartialEq, StructOpt)] +pub struct PrometheusParams { + /// Do not expose a Prometheus metric endpoint. + #[structopt(long)] + pub no_prometheus: bool, + /// Expose Prometheus endpoint at given interface. + #[structopt(long, default_value = "127.0.0.1")] + pub prometheus_host: String, + /// Expose Prometheus endpoint at given port. + #[structopt(long, default_value = "9616")] + pub prometheus_port: u16, +} + +/// Struct to get git commit info and build time. +#[derive(BuildInfo)] +struct SubstrateRelayBuildInfo; + +impl SubstrateRelayBuildInfo { + /// Get git commit in form ``. + pub fn get_git_commit() -> String { + // on gitlab we use images without git installed, so we can't use `rbtag` there + // locally we don't have `CI_*` env variables, so we can't rely on them + // => we are using `CI_*` env variables or else `rbtag` + let maybe_sha_from_ci = option_env!("CI_COMMIT_SHORT_SHA"); + maybe_sha_from_ci + .map(|short_sha| { + // we assume that on CI the copy is always clean + format!("{short_sha}-clean") + }) + .unwrap_or_else(|| SubstrateRelayBuildInfo.get_build_commit().into()) + } +} + +impl PrometheusParams { + /// Tries to convert CLI metrics params into metrics params, used by the relay. + pub fn into_metrics_params(self) -> anyhow::Result { + let metrics_address = if !self.no_prometheus { + Some(relay_utils::metrics::MetricsAddress { + host: self.prometheus_host, + port: self.prometheus_port, + }) + } else { + None + }; + + let relay_version = option_env!("CARGO_PKG_VERSION").unwrap_or("unknown"); + let relay_commit = SubstrateRelayBuildInfo::get_git_commit(); + relay_utils::metrics::MetricsParams::new( + metrics_address, + relay_version.into(), + relay_commit, + ) + .map_err(|e| anyhow::format_err!("{:?}", e)) + } +} + +/// Either explicit or maximal allowed value. +#[derive(Debug, Clone, PartialEq, Eq)] +pub enum ExplicitOrMaximal { + /// User has explicitly specified argument value. + Explicit(V), + /// Maximal allowed value for this argument. + Maximal, +} + +impl std::str::FromStr for ExplicitOrMaximal +where + V::Err: std::fmt::Debug, +{ + type Err = String; + + fn from_str(s: &str) -> Result { + if s.to_lowercase() == "max" { + return Ok(ExplicitOrMaximal::Maximal) + } + + V::from_str(s) + .map(ExplicitOrMaximal::Explicit) + .map_err(|e| format!("Failed to parse '{e:?}'. Expected 'max' or explicit value")) + } +} + +#[doc = "Runtime version params."] +#[derive(StructOpt, Debug, PartialEq, Eq, Clone, Copy, EnumString, VariantNames)] +pub enum RuntimeVersionType { + /// Auto query version from chain + Auto, + /// Custom `spec_version` and `transaction_version` + Custom, + /// Read version from bundle dependencies directly. + Bundle, +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn hex_bytes_display_matches_from_str_for_clap() { + // given + let hex = HexBytes(vec![1, 2, 3, 4]); + let display = format!("{hex}"); + + // when + let hex2: HexBytes = display.parse().unwrap(); + + // then + assert_eq!(hex.0, hex2.0); + } +} diff --git a/bridges/relays/lib-substrate-relay/src/cli/relay_headers.rs b/bridges/relays/lib-substrate-relay/src/cli/relay_headers.rs new file mode 100644 index 0000000000000000000000000000000000000000..90558ed46138366221c1f9834d21060e7e54e66b --- /dev/null +++ b/bridges/relays/lib-substrate-relay/src/cli/relay_headers.rs @@ -0,0 +1,76 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Primitives for exposing the headers relaying functionality in the CLI. + +use async_trait::async_trait; +use structopt::StructOpt; + +use relay_utils::metrics::{GlobalMetrics, StandaloneMetric}; + +use crate::{ + cli::{bridge::*, chain_schema::*, PrometheusParams}, + finality::SubstrateFinalitySyncPipeline, +}; + +/// Chain headers relaying params. +#[derive(StructOpt)] +pub struct RelayHeadersParams { + /// If passed, only mandatory headers (headers that are changing the GRANDPA authorities set) + /// are relayed. + #[structopt(long)] + only_mandatory_headers: bool, + #[structopt(flatten)] + source: SourceConnectionParams, + #[structopt(flatten)] + target: TargetConnectionParams, + #[structopt(flatten)] + target_sign: TargetSigningParams, + #[structopt(flatten)] + prometheus_params: PrometheusParams, +} + +/// Trait used for relaying headers between 2 chains. +#[async_trait] +pub trait HeadersRelayer: RelayToRelayHeadersCliBridge { + /// Relay headers. + async fn relay_headers(data: RelayHeadersParams) -> anyhow::Result<()> { + let source_client = data.source.into_client::().await?; + let target_client = data.target.into_client::().await?; + let target_transactions_mortality = data.target_sign.target_transactions_mortality; + let target_sign = data.target_sign.to_keypair::()?; + + let metrics_params: relay_utils::metrics::MetricsParams = + data.prometheus_params.into_metrics_params()?; + GlobalMetrics::new()?.register_and_spawn(&metrics_params.registry)?; + + let target_transactions_params = crate::TransactionParams { + signer: target_sign, + mortality: target_transactions_mortality, + }; + Self::Finality::start_relay_guards(&target_client, target_client.can_start_version_guard()) + .await?; + + crate::finality::run::( + source_client, + target_client, + data.only_mandatory_headers, + target_transactions_params, + metrics_params, + ) + .await + } +} diff --git a/bridges/relays/lib-substrate-relay/src/cli/relay_headers_and_messages/mod.rs b/bridges/relays/lib-substrate-relay/src/cli/relay_headers_and_messages/mod.rs new file mode 100644 index 0000000000000000000000000000000000000000..27e9f1c21ba0dae1480ef8128afdfd635a1d22c2 --- /dev/null +++ b/bridges/relays/lib-substrate-relay/src/cli/relay_headers_and_messages/mod.rs @@ -0,0 +1,492 @@ +// Copyright 2019-2022 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Complex 2-ways headers+messages relays support. +//! +//! To add new complex relay between `ChainA` and `ChainB`, you must: +//! +//! 1) ensure that there's a `declare_chain_cli_schema!(...)` for both chains. +//! 2) add `declare_chain_to_chain_bridge_schema!(...)` or +//! `declare_chain_to_parachain_bridge_schema` for the bridge. +//! 3) declare a new struct for the added bridge and implement the `Full2WayBridge` trait for it. + +#[macro_use] +pub mod parachain_to_parachain; +#[macro_use] +pub mod relay_to_relay; +#[macro_use] +pub mod relay_to_parachain; + +use async_trait::async_trait; +use std::{marker::PhantomData, sync::Arc}; +use structopt::StructOpt; + +use futures::{FutureExt, TryFutureExt}; + +use crate::{ + cli::{bridge::MessagesCliBridge, HexLaneId, PrometheusParams}, + messages_lane::{MessagesRelayLimits, MessagesRelayParams}, + on_demand::OnDemandRelay, + TaggedAccount, TransactionParams, +}; +use bp_messages::LaneId; +use bp_runtime::BalanceOf; +use relay_substrate_client::{ + AccountIdOf, AccountKeyPairOf, Chain, ChainWithBalances, ChainWithMessages, + ChainWithRuntimeVersion, ChainWithTransactions, Client, +}; +use relay_utils::metrics::MetricsParams; +use sp_core::Pair; + +/// Parameters that have the same names across all bridges. +#[derive(Debug, PartialEq, StructOpt)] +pub struct HeadersAndMessagesSharedParams { + /// Hex-encoded lane identifiers that should be served by the complex relay. + #[structopt(long, default_value = "00000000")] + pub lane: Vec, + /// If passed, only mandatory headers (headers that are changing the GRANDPA authorities set) + /// are relayed. + #[structopt(long)] + pub only_mandatory_headers: bool, + #[structopt(flatten)] + /// Prometheus metrics params. + pub prometheus_params: PrometheusParams, +} + +/// Bridge parameters, shared by all bridge types. +pub struct Full2WayBridgeCommonParams< + Left: ChainWithTransactions + ChainWithRuntimeVersion, + Right: ChainWithTransactions + ChainWithRuntimeVersion, +> { + /// Shared parameters. + pub shared: HeadersAndMessagesSharedParams, + /// Parameters of the left chain. + pub left: BridgeEndCommonParams, + /// Parameters of the right chain. + pub right: BridgeEndCommonParams, + + /// Common metric parameters. + pub metrics_params: MetricsParams, +} + +impl< + Left: ChainWithTransactions + ChainWithRuntimeVersion, + Right: ChainWithTransactions + ChainWithRuntimeVersion, + > Full2WayBridgeCommonParams +{ + /// Creates new bridge parameters from its components. + pub fn new>( + shared: HeadersAndMessagesSharedParams, + left: BridgeEndCommonParams, + right: BridgeEndCommonParams, + ) -> anyhow::Result { + // Create metrics registry. + let metrics_params = shared.prometheus_params.clone().into_metrics_params()?; + let metrics_params = relay_utils::relay_metrics(metrics_params).into_params(); + + Ok(Self { shared, left, right, metrics_params }) + } +} + +/// Parameters that are associated with one side of the bridge. +pub struct BridgeEndCommonParams { + /// Chain client. + pub client: Client, + /// Params used for sending transactions to the chain. + pub tx_params: TransactionParams>, + /// Accounts, which balances are exposed as metrics by the relay process. + pub accounts: Vec>>, +} + +/// All data of the bidirectional complex relay. +pub struct FullBridge< + 'a, + Source: ChainWithTransactions + ChainWithRuntimeVersion, + Target: ChainWithTransactions + ChainWithRuntimeVersion, + Bridge: MessagesCliBridge, +> { + source: &'a mut BridgeEndCommonParams, + target: &'a mut BridgeEndCommonParams, + metrics_params: &'a MetricsParams, + _phantom_data: PhantomData, +} + +impl< + 'a, + Source: ChainWithTransactions + ChainWithRuntimeVersion, + Target: ChainWithTransactions + ChainWithRuntimeVersion, + Bridge: MessagesCliBridge, + > FullBridge<'a, Source, Target, Bridge> +where + AccountIdOf: From< as Pair>::Public>, + AccountIdOf: From< as Pair>::Public>, + BalanceOf: TryFrom> + Into, +{ + /// Construct complex relay given it components. + fn new( + source: &'a mut BridgeEndCommonParams, + target: &'a mut BridgeEndCommonParams, + metrics_params: &'a MetricsParams, + ) -> Self { + Self { source, target, metrics_params, _phantom_data: Default::default() } + } + + /// Returns message relay parameters. + fn messages_relay_params( + &self, + source_to_target_headers_relay: Arc>, + target_to_source_headers_relay: Arc>, + lane_id: LaneId, + maybe_limits: Option, + ) -> MessagesRelayParams { + MessagesRelayParams { + source_client: self.source.client.clone(), + source_transaction_params: self.source.tx_params.clone(), + target_client: self.target.client.clone(), + target_transaction_params: self.target.tx_params.clone(), + source_to_target_headers_relay: Some(source_to_target_headers_relay), + target_to_source_headers_relay: Some(target_to_source_headers_relay), + lane_id, + limits: maybe_limits, + metrics_params: self.metrics_params.clone().disable(), + } + } +} + +/// Base portion of the bidirectional complex relay. +/// +/// This main purpose of extracting this trait is that in different relays the implementation +/// of `start_on_demand_headers_relayers` method will be different. But the number of +/// implementations is limited to relay <> relay, parachain <> relay and parachain <> parachain. +/// This trait allows us to reuse these implementations in different bridges. +#[async_trait] +pub trait Full2WayBridgeBase: Sized + Send + Sync { + /// The CLI params for the bridge. + type Params; + /// The left relay chain. + type Left: ChainWithTransactions + ChainWithRuntimeVersion; + /// The right destination chain (it can be a relay or a parachain). + type Right: ChainWithTransactions + ChainWithRuntimeVersion; + + /// Reference to common relay parameters. + fn common(&self) -> &Full2WayBridgeCommonParams; + + /// Mutable reference to common relay parameters. + fn mut_common(&mut self) -> &mut Full2WayBridgeCommonParams; + + /// Start on-demand headers relays. + async fn start_on_demand_headers_relayers( + &mut self, + ) -> anyhow::Result<( + Arc>, + Arc>, + )>; +} + +/// Bidirectional complex relay. +#[async_trait] +pub trait Full2WayBridge: Sized + Sync +where + AccountIdOf: From< as Pair>::Public>, + AccountIdOf: From< as Pair>::Public>, + BalanceOf: TryFrom> + Into, + BalanceOf: TryFrom> + Into, +{ + /// Base portion of the bidirectional complex relay. + type Base: Full2WayBridgeBase; + + /// The left relay chain. + type Left: ChainWithTransactions + + ChainWithBalances + + ChainWithMessages + + ChainWithRuntimeVersion; + /// The right relay chain. + type Right: ChainWithTransactions + + ChainWithBalances + + ChainWithMessages + + ChainWithRuntimeVersion; + + /// Left to Right bridge. + type L2R: MessagesCliBridge; + /// Right to Left bridge + type R2L: MessagesCliBridge; + + /// Construct new bridge. + fn new(params: ::Params) -> anyhow::Result; + + /// Reference to the base relay portion. + fn base(&self) -> &Self::Base; + + /// Mutable reference to the base relay portion. + fn mut_base(&mut self) -> &mut Self::Base; + + /// Creates and returns Left to Right complex relay. + fn left_to_right(&mut self) -> FullBridge { + let common = self.mut_base().mut_common(); + FullBridge::<_, _, Self::L2R>::new( + &mut common.left, + &mut common.right, + &common.metrics_params, + ) + } + + /// Creates and returns Right to Left complex relay. + fn right_to_left(&mut self) -> FullBridge { + let common = self.mut_base().mut_common(); + FullBridge::<_, _, Self::R2L>::new( + &mut common.right, + &mut common.left, + &common.metrics_params, + ) + } + + /// Start complex relay. + async fn run(&mut self) -> anyhow::Result<()> { + // Register standalone metrics. + { + let common = self.mut_base().mut_common(); + common.left.accounts.push(TaggedAccount::Messages { + id: common.left.tx_params.signer.public().into(), + bridged_chain: Self::Right::NAME.to_string(), + }); + common.right.accounts.push(TaggedAccount::Messages { + id: common.right.tx_params.signer.public().into(), + bridged_chain: Self::Left::NAME.to_string(), + }); + } + + // start on-demand header relays + let (left_to_right_on_demand_headers, right_to_left_on_demand_headers) = + self.mut_base().start_on_demand_headers_relayers().await?; + + // add balance-related metrics + let lanes = self + .base() + .common() + .shared + .lane + .iter() + .cloned() + .map(Into::into) + .collect::>(); + { + let common = self.mut_base().mut_common(); + crate::messages_metrics::add_relay_balances_metrics::<_, Self::Right>( + common.left.client.clone(), + &common.metrics_params, + &common.left.accounts, + &lanes, + ) + .await?; + crate::messages_metrics::add_relay_balances_metrics::<_, Self::Left>( + common.right.client.clone(), + &common.metrics_params, + &common.right.accounts, + &lanes, + ) + .await?; + } + + // Need 2x capacity since we consider both directions for each lane + let mut message_relays = Vec::with_capacity(lanes.len() * 2); + for lane in lanes { + let left_to_right_messages = crate::messages_lane::run::< + ::MessagesLane, + >(self.left_to_right().messages_relay_params( + left_to_right_on_demand_headers.clone(), + right_to_left_on_demand_headers.clone(), + lane, + Self::L2R::maybe_messages_limits(), + )) + .map_err(|e| anyhow::format_err!("{}", e)) + .boxed(); + message_relays.push(left_to_right_messages); + + let right_to_left_messages = crate::messages_lane::run::< + ::MessagesLane, + >(self.right_to_left().messages_relay_params( + right_to_left_on_demand_headers.clone(), + left_to_right_on_demand_headers.clone(), + lane, + Self::R2L::maybe_messages_limits(), + )) + .map_err(|e| anyhow::format_err!("{}", e)) + .boxed(); + message_relays.push(right_to_left_messages); + } + + relay_utils::relay_metrics(self.base().common().metrics_params.clone()) + .expose() + .await + .map_err(|e| anyhow::format_err!("{}", e))?; + + futures::future::select_all(message_relays).await.0 + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::{cli::chain_schema::RuntimeVersionType, declare_chain_cli_schema}; + + use relay_substrate_client::{ChainRuntimeVersion, Parachain, SimpleRuntimeVersion}; + + #[test] + // We need `#[allow(dead_code)]` because some of the methods generated by the macros + // are not used. + #[allow(dead_code)] + fn should_parse_parachain_to_parachain_options() { + // Chains. + declare_chain_cli_schema!(Kusama, kusama); + declare_chain_cli_schema!(BridgeHubKusama, bridge_hub_kusama); + declare_chain_cli_schema!(Polkadot, polkadot); + declare_chain_cli_schema!(BridgeHubPolkadot, bridge_hub_polkadot); + // Means to override signers of different layer transactions. + declare_chain_cli_schema!( + KusamaHeadersToBridgeHubPolkadot, + kusama_headers_to_bridge_hub_polkadot + ); + declare_chain_cli_schema!( + KusamaParachainsToBridgeHubPolkadot, + kusama_parachains_to_bridge_hub_polkadot + ); + declare_chain_cli_schema!( + PolkadotHeadersToBridgeHubKusama, + polkadot_headers_to_bridge_hub_kusama + ); + declare_chain_cli_schema!( + PolkadotParachainsToBridgeHubKusama, + polkadot_parachains_to_bridge_hub_kusama + ); + // Bridges. + declare_parachain_to_parachain_bridge_schema!( + BridgeHubKusama, + Kusama, + BridgeHubPolkadot, + Polkadot + ); + + let res = BridgeHubKusamaBridgeHubPolkadotHeadersAndMessages::from_iter(vec![ + "bridge-hub-kusama-bridge-hub-polkadot-headers-and-messages", + "--bridge-hub-kusama-host", + "bridge-hub-kusama-node-collator1", + "--bridge-hub-kusama-port", + "9944", + "--bridge-hub-kusama-signer", + "//Iden", + "--bridge-hub-kusama-transactions-mortality", + "64", + "--kusama-host", + "kusama-alice", + "--kusama-port", + "9944", + "--bridge-hub-polkadot-host", + "bridge-hub-polkadot-collator1", + "--bridge-hub-polkadot-port", + "9944", + "--bridge-hub-polkadot-signer", + "//George", + "--bridge-hub-polkadot-transactions-mortality", + "64", + "--polkadot-host", + "polkadot-alice", + "--polkadot-port", + "9944", + "--lane", + "00000000", + "--prometheus-host", + "0.0.0.0", + ]); + + // then + assert_eq!( + res, + BridgeHubKusamaBridgeHubPolkadotHeadersAndMessages { + shared: HeadersAndMessagesSharedParams { + lane: vec![HexLaneId([0x00, 0x00, 0x00, 0x00])], + only_mandatory_headers: false, + prometheus_params: PrometheusParams { + no_prometheus: false, + prometheus_host: "0.0.0.0".into(), + prometheus_port: 9616, + }, + }, + left: BridgeHubKusamaConnectionParams { + bridge_hub_kusama_uri: None, + bridge_hub_kusama_host: "bridge-hub-kusama-node-collator1".into(), + bridge_hub_kusama_port: 9944, + bridge_hub_kusama_path: None, + bridge_hub_kusama_secure: false, + bridge_hub_kusama_runtime_version: BridgeHubKusamaRuntimeVersionParams { + bridge_hub_kusama_version_mode: RuntimeVersionType::Bundle, + bridge_hub_kusama_spec_version: None, + bridge_hub_kusama_transaction_version: None, + }, + }, + left_sign: BridgeHubKusamaSigningParams { + bridge_hub_kusama_signer: Some("//Iden".into()), + bridge_hub_kusama_signer_password: None, + bridge_hub_kusama_signer_file: None, + bridge_hub_kusama_signer_password_file: None, + bridge_hub_kusama_transactions_mortality: Some(64), + }, + left_relay: KusamaConnectionParams { + kusama_uri: None, + kusama_host: "kusama-alice".into(), + kusama_port: 9944, + kusama_path: None, + kusama_secure: false, + kusama_runtime_version: KusamaRuntimeVersionParams { + kusama_version_mode: RuntimeVersionType::Bundle, + kusama_spec_version: None, + kusama_transaction_version: None, + }, + }, + right: BridgeHubPolkadotConnectionParams { + bridge_hub_polkadot_uri: None, + bridge_hub_polkadot_host: "bridge-hub-polkadot-collator1".into(), + bridge_hub_polkadot_port: 9944, + bridge_hub_polkadot_path: None, + bridge_hub_polkadot_secure: false, + bridge_hub_polkadot_runtime_version: BridgeHubPolkadotRuntimeVersionParams { + bridge_hub_polkadot_version_mode: RuntimeVersionType::Bundle, + bridge_hub_polkadot_spec_version: None, + bridge_hub_polkadot_transaction_version: None, + }, + }, + right_sign: BridgeHubPolkadotSigningParams { + bridge_hub_polkadot_signer: Some("//George".into()), + bridge_hub_polkadot_signer_password: None, + bridge_hub_polkadot_signer_file: None, + bridge_hub_polkadot_signer_password_file: None, + bridge_hub_polkadot_transactions_mortality: Some(64), + }, + right_relay: PolkadotConnectionParams { + polkadot_uri: None, + polkadot_host: "polkadot-alice".into(), + polkadot_port: 9944, + polkadot_path: None, + polkadot_secure: false, + polkadot_runtime_version: PolkadotRuntimeVersionParams { + polkadot_version_mode: RuntimeVersionType::Bundle, + polkadot_spec_version: None, + polkadot_transaction_version: None, + }, + }, + } + ); + } +} diff --git a/bridges/relays/lib-substrate-relay/src/cli/relay_headers_and_messages/parachain_to_parachain.rs b/bridges/relays/lib-substrate-relay/src/cli/relay_headers_and_messages/parachain_to_parachain.rs new file mode 100644 index 0000000000000000000000000000000000000000..76accfa29050613070c6579103d4e41f6084eea6 --- /dev/null +++ b/bridges/relays/lib-substrate-relay/src/cli/relay_headers_and_messages/parachain_to_parachain.rs @@ -0,0 +1,217 @@ +// Copyright 2019-2022 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Parachain to parachain relayer CLI primitives. + +use async_trait::async_trait; +use std::sync::Arc; + +use crate::{ + cli::{ + bridge::{CliBridgeBase, MessagesCliBridge, ParachainToRelayHeadersCliBridge}, + relay_headers_and_messages::{Full2WayBridgeBase, Full2WayBridgeCommonParams}, + }, + finality::SubstrateFinalitySyncPipeline, + on_demand::{ + headers::OnDemandHeadersRelay, parachains::OnDemandParachainsRelay, OnDemandRelay, + }, +}; +use bp_polkadot_core::parachains::ParaHash; +use pallet_bridge_parachains::{RelayBlockHash, RelayBlockHasher, RelayBlockNumber}; +use relay_substrate_client::{ + AccountIdOf, AccountKeyPairOf, Chain, ChainWithRuntimeVersion, ChainWithTransactions, Client, + Parachain, +}; +use sp_core::Pair; + +/// A base relay between two parachain from different consensus systems. +/// +/// Such relay starts 2 messages relay. It also starts 2 on-demand header relays and 2 on-demand +/// parachain heads relay. +pub struct ParachainToParachainBridge< + L2R: MessagesCliBridge + ParachainToRelayHeadersCliBridge, + R2L: MessagesCliBridge + ParachainToRelayHeadersCliBridge, +> where + ::Source: Parachain, + ::Source: Parachain, +{ + /// Parameters that are shared by all bridge types. + pub common: + Full2WayBridgeCommonParams<::Target, ::Target>, + /// Client of the left relay chain. + pub left_relay: Client<::SourceRelay>, + /// Client of the right relay chain. + pub right_relay: Client<::SourceRelay>, +} + +/// Create set of configuration objects specific to parachain-to-parachain relayer. +#[macro_export] +macro_rules! declare_parachain_to_parachain_bridge_schema { + // left-parachain, relay-chain-of-left-parachain, right-parachain, relay-chain-of-right-parachain + ($left_parachain:ident, $left_chain:ident, $right_parachain:ident, $right_chain:ident) => { + bp_runtime::paste::item! { + #[doc = $left_parachain ", " $left_chain ", " $right_parachain " and " $right_chain " headers+parachains+messages relay params."] + #[derive(Debug, PartialEq, StructOpt)] + pub struct [<$left_parachain $right_parachain HeadersAndMessages>] { + // shared parameters + #[structopt(flatten)] + shared: HeadersAndMessagesSharedParams, + + #[structopt(flatten)] + left: [<$left_parachain ConnectionParams>], + // default signer, which is always used to sign messages relay transactions on the left chain + #[structopt(flatten)] + left_sign: [<$left_parachain SigningParams>], + + #[structopt(flatten)] + left_relay: [<$left_chain ConnectionParams>], + + #[structopt(flatten)] + right: [<$right_parachain ConnectionParams>], + // default signer, which is always used to sign messages relay transactions on the right chain + #[structopt(flatten)] + right_sign: [<$right_parachain SigningParams>], + + #[structopt(flatten)] + right_relay: [<$right_chain ConnectionParams>], + } + + impl [<$left_parachain $right_parachain HeadersAndMessages>] { + async fn into_bridge< + Left: ChainWithTransactions + ChainWithRuntimeVersion + Parachain, + LeftRelay: ChainWithRuntimeVersion, + Right: ChainWithTransactions + ChainWithRuntimeVersion + Parachain, + RightRelay: ChainWithRuntimeVersion, + L2R: $crate::cli::bridge::CliBridgeBase + + MessagesCliBridge + + $crate::cli::bridge::ParachainToRelayHeadersCliBridge, + R2L: $crate::cli::bridge::CliBridgeBase + + MessagesCliBridge + + $crate::cli::bridge::ParachainToRelayHeadersCliBridge, + >( + self, + ) -> anyhow::Result<$crate::cli::relay_headers_and_messages::parachain_to_parachain::ParachainToParachainBridge> { + Ok($crate::cli::relay_headers_and_messages::parachain_to_parachain::ParachainToParachainBridge { + common: Full2WayBridgeCommonParams::new::( + self.shared, + BridgeEndCommonParams { + client: self.left.into_client::().await?, + tx_params: self.left_sign.transaction_params::()?, + accounts: vec![], + }, + BridgeEndCommonParams { + client: self.right.into_client::().await?, + tx_params: self.right_sign.transaction_params::()?, + accounts: vec![], + }, + )?, + left_relay: self.left_relay.into_client::().await?, + right_relay: self.right_relay.into_client::().await?, + }) + } + } + } + }; +} + +#[async_trait] +impl< + Left: Chain + ChainWithTransactions + ChainWithRuntimeVersion + Parachain, + Right: Chain + ChainWithTransactions + ChainWithRuntimeVersion + Parachain, + LeftRelay: Chain + + ChainWithRuntimeVersion, + RightRelay: Chain + + ChainWithRuntimeVersion, + L2R: CliBridgeBase + + MessagesCliBridge + + ParachainToRelayHeadersCliBridge, + R2L: CliBridgeBase + + MessagesCliBridge + + ParachainToRelayHeadersCliBridge, + > Full2WayBridgeBase for ParachainToParachainBridge +where + AccountIdOf: From< as Pair>::Public>, + AccountIdOf: From< as Pair>::Public>, +{ + type Params = ParachainToParachainBridge; + type Left = Left; + type Right = Right; + + fn common(&self) -> &Full2WayBridgeCommonParams { + &self.common + } + + fn mut_common(&mut self) -> &mut Full2WayBridgeCommonParams { + &mut self.common + } + + async fn start_on_demand_headers_relayers( + &mut self, + ) -> anyhow::Result<( + Arc>, + Arc>, + )> { + ::RelayFinality::start_relay_guards( + &self.common.right.client, + self.common.right.client.can_start_version_guard(), + ) + .await?; + ::RelayFinality::start_relay_guards( + &self.common.left.client, + self.common.left.client.can_start_version_guard(), + ) + .await?; + + let left_relay_to_right_on_demand_headers = + OnDemandHeadersRelay::<::RelayFinality>::new( + self.left_relay.clone(), + self.common.right.client.clone(), + self.common.right.tx_params.clone(), + self.common.shared.only_mandatory_headers, + Some(self.common.metrics_params.clone()), + ); + let right_relay_to_left_on_demand_headers = + OnDemandHeadersRelay::<::RelayFinality>::new( + self.right_relay.clone(), + self.common.left.client.clone(), + self.common.left.tx_params.clone(), + self.common.shared.only_mandatory_headers, + Some(self.common.metrics_params.clone()), + ); + + let left_to_right_on_demand_parachains = OnDemandParachainsRelay::< + ::ParachainFinality, + >::new( + self.left_relay.clone(), + self.common.right.client.clone(), + self.common.right.tx_params.clone(), + Arc::new(left_relay_to_right_on_demand_headers), + ); + let right_to_left_on_demand_parachains = OnDemandParachainsRelay::< + ::ParachainFinality, + >::new( + self.right_relay.clone(), + self.common.left.client.clone(), + self.common.left.tx_params.clone(), + Arc::new(right_relay_to_left_on_demand_headers), + ); + + Ok(( + Arc::new(left_to_right_on_demand_parachains), + Arc::new(right_to_left_on_demand_parachains), + )) + } +} diff --git a/bridges/relays/lib-substrate-relay/src/cli/relay_headers_and_messages/relay_to_parachain.rs b/bridges/relays/lib-substrate-relay/src/cli/relay_headers_and_messages/relay_to_parachain.rs new file mode 100644 index 0000000000000000000000000000000000000000..b75ac3e60c26934c7dda603a2c7a91649d17eb52 --- /dev/null +++ b/bridges/relays/lib-substrate-relay/src/cli/relay_headers_and_messages/relay_to_parachain.rs @@ -0,0 +1,199 @@ +// Copyright 2019-2022 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Relay chain to parachain relayer CLI primitives. + +use async_trait::async_trait; +use std::sync::Arc; + +use crate::{ + cli::{ + bridge::{ + CliBridgeBase, MessagesCliBridge, ParachainToRelayHeadersCliBridge, + RelayToRelayHeadersCliBridge, + }, + relay_headers_and_messages::{Full2WayBridgeBase, Full2WayBridgeCommonParams}, + }, + finality::SubstrateFinalitySyncPipeline, + on_demand::{ + headers::OnDemandHeadersRelay, parachains::OnDemandParachainsRelay, OnDemandRelay, + }, +}; +use bp_polkadot_core::parachains::ParaHash; +use pallet_bridge_parachains::{RelayBlockHash, RelayBlockHasher, RelayBlockNumber}; +use relay_substrate_client::{ + AccountIdOf, AccountKeyPairOf, Chain, ChainWithRuntimeVersion, ChainWithTransactions, Client, + Parachain, +}; +use sp_core::Pair; + +/// A base relay between standalone (relay) chain and a parachain from another consensus system. +/// +/// Such relay starts 2 messages relay. It also starts 2 on-demand header relays and 1 on-demand +/// parachain heads relay. +pub struct RelayToParachainBridge< + L2R: MessagesCliBridge + RelayToRelayHeadersCliBridge, + R2L: MessagesCliBridge + ParachainToRelayHeadersCliBridge, +> where + ::Source: Parachain, +{ + /// Parameters that are shared by all bridge types. + pub common: + Full2WayBridgeCommonParams<::Target, ::Target>, + /// Client of the right relay chain. + pub right_relay: Client<::SourceRelay>, +} + +/// Create set of configuration objects specific to relay-to-parachain relayer. +#[macro_export] +macro_rules! declare_relay_to_parachain_bridge_schema { + // chain, parachain, relay-chain-of-parachain + ($left_chain:ident, $right_parachain:ident, $right_chain:ident) => { + bp_runtime::paste::item! { + #[doc = $left_chain ", " $right_parachain " and " $right_chain " headers+parachains+messages relay params."] + #[derive(Debug, PartialEq, StructOpt)] + pub struct [<$left_chain $right_parachain HeadersAndMessages>] { + // shared parameters + #[structopt(flatten)] + shared: HeadersAndMessagesSharedParams, + + #[structopt(flatten)] + left: [<$left_chain ConnectionParams>], + // default signer, which is always used to sign messages relay transactions on the left chain + #[structopt(flatten)] + left_sign: [<$left_chain SigningParams>], + + #[structopt(flatten)] + right: [<$right_parachain ConnectionParams>], + // default signer, which is always used to sign messages relay transactions on the right chain + #[structopt(flatten)] + right_sign: [<$right_parachain SigningParams>], + + #[structopt(flatten)] + right_relay: [<$right_chain ConnectionParams>], + } + + impl [<$left_chain $right_parachain HeadersAndMessages>] { + async fn into_bridge< + Left: ChainWithTransactions + ChainWithRuntimeVersion, + Right: ChainWithTransactions + ChainWithRuntimeVersion + Parachain, + RightRelay: ChainWithRuntimeVersion, + L2R: CliBridgeBase + MessagesCliBridge + RelayToRelayHeadersCliBridge, + R2L: CliBridgeBase + + MessagesCliBridge + + ParachainToRelayHeadersCliBridge, + >( + self, + ) -> anyhow::Result> { + Ok(RelayToParachainBridge { + common: Full2WayBridgeCommonParams::new::( + self.shared, + BridgeEndCommonParams { + client: self.left.into_client::().await?, + tx_params: self.left_sign.transaction_params::()?, + accounts: vec![], + }, + BridgeEndCommonParams { + client: self.right.into_client::().await?, + tx_params: self.right_sign.transaction_params::()?, + accounts: vec![], + }, + )?, + right_relay: self.right_relay.into_client::().await?, + }) + } + } + } + }; +} + +#[async_trait] +impl< + Left: ChainWithTransactions + ChainWithRuntimeVersion, + Right: Chain + ChainWithTransactions + ChainWithRuntimeVersion + Parachain, + RightRelay: Chain + + ChainWithRuntimeVersion, + L2R: CliBridgeBase + + MessagesCliBridge + + RelayToRelayHeadersCliBridge, + R2L: CliBridgeBase + + MessagesCliBridge + + ParachainToRelayHeadersCliBridge, + > Full2WayBridgeBase for RelayToParachainBridge +where + AccountIdOf: From< as Pair>::Public>, + AccountIdOf: From< as Pair>::Public>, +{ + type Params = RelayToParachainBridge; + type Left = Left; + type Right = Right; + + fn common(&self) -> &Full2WayBridgeCommonParams { + &self.common + } + + fn mut_common(&mut self) -> &mut Full2WayBridgeCommonParams { + &mut self.common + } + + async fn start_on_demand_headers_relayers( + &mut self, + ) -> anyhow::Result<( + Arc>, + Arc>, + )> { + ::Finality::start_relay_guards( + &self.common.right.client, + self.common.right.client.can_start_version_guard(), + ) + .await?; + ::RelayFinality::start_relay_guards( + &self.common.left.client, + self.common.left.client.can_start_version_guard(), + ) + .await?; + + let left_to_right_on_demand_headers = + OnDemandHeadersRelay::<::Finality>::new( + self.common.left.client.clone(), + self.common.right.client.clone(), + self.common.right.tx_params.clone(), + self.common.shared.only_mandatory_headers, + None, + ); + let right_relay_to_left_on_demand_headers = + OnDemandHeadersRelay::<::RelayFinality>::new( + self.right_relay.clone(), + self.common.left.client.clone(), + self.common.left.tx_params.clone(), + self.common.shared.only_mandatory_headers, + Some(self.common.metrics_params.clone()), + ); + let right_to_left_on_demand_parachains = OnDemandParachainsRelay::< + ::ParachainFinality, + >::new( + self.right_relay.clone(), + self.common.left.client.clone(), + self.common.left.tx_params.clone(), + Arc::new(right_relay_to_left_on_demand_headers), + ); + + Ok(( + Arc::new(left_to_right_on_demand_headers), + Arc::new(right_to_left_on_demand_parachains), + )) + } +} diff --git a/bridges/relays/lib-substrate-relay/src/cli/relay_headers_and_messages/relay_to_relay.rs b/bridges/relays/lib-substrate-relay/src/cli/relay_headers_and_messages/relay_to_relay.rs new file mode 100644 index 0000000000000000000000000000000000000000..b397ff50a20a62833d96a3687c8d3c3494efc5c2 --- /dev/null +++ b/bridges/relays/lib-substrate-relay/src/cli/relay_headers_and_messages/relay_to_relay.rs @@ -0,0 +1,169 @@ +// Copyright 2019-2022 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +// we don't have any relay/standalone <> relay/standalone chain bridges, but we may need it in a +// future +#![allow(unused_macros)] + +//! Relay chain to Relay chain relayer CLI primitives. + +use async_trait::async_trait; +use std::sync::Arc; + +use crate::{ + cli::{ + bridge::{CliBridgeBase, MessagesCliBridge, RelayToRelayHeadersCliBridge}, + relay_headers_and_messages::{Full2WayBridgeBase, Full2WayBridgeCommonParams}, + }, + finality::SubstrateFinalitySyncPipeline, + on_demand::{headers::OnDemandHeadersRelay, OnDemandRelay}, +}; +use relay_substrate_client::{ + AccountIdOf, AccountKeyPairOf, ChainWithRuntimeVersion, ChainWithTransactions, +}; +use sp_core::Pair; + +/// A base relay between two standalone (relay) chains. +/// +/// Such relay starts 2 messages relay and 2 on-demand header relays. +pub struct RelayToRelayBridge< + L2R: MessagesCliBridge + RelayToRelayHeadersCliBridge, + R2L: MessagesCliBridge + RelayToRelayHeadersCliBridge, +> { + /// Parameters that are shared by all bridge types. + pub common: + Full2WayBridgeCommonParams<::Target, ::Target>, +} + +/// Create set of configuration objects specific to relay-to-relay relayer. +macro_rules! declare_relay_to_relay_bridge_schema { + ($left_chain:ident, $right_chain:ident) => { + bp_runtime::paste::item! { + #[doc = $left_chain " and " $right_chain " headers+messages relay params."] + #[derive(Debug, PartialEq, StructOpt)] + pub struct [<$left_chain $right_chain HeadersAndMessages>] { + #[structopt(flatten)] + shared: HeadersAndMessagesSharedParams, + + #[structopt(flatten)] + left: [<$left_chain ConnectionParams>], + // default signer, which is always used to sign messages relay transactions on the left chain + #[structopt(flatten)] + left_sign: [<$left_chain SigningParams>], + + #[structopt(flatten)] + right: [<$right_chain ConnectionParams>], + #[structopt(flatten)] + // default signer, which is always used to sign messages relay transactions on the right chain + right_sign: [<$right_chain SigningParams>], + } + + impl [<$left_chain $right_chain HeadersAndMessages>] { + async fn into_bridge< + Left: ChainWithTransactions + CliChain, + Right: ChainWithTransactions + CliChain, + L2R: CliBridgeBase + MessagesCliBridge + RelayToRelayHeadersCliBridge, + R2L: CliBridgeBase + MessagesCliBridge + RelayToRelayHeadersCliBridge, + >( + self, + ) -> anyhow::Result> { + Ok(RelayToRelayBridge { + common: Full2WayBridgeCommonParams::new::( + self.shared, + BridgeEndCommonParams { + client: self.left.into_client::().await?, + tx_params: self.left_sign.transaction_params::()?, + accounts: vec![], + }, + BridgeEndCommonParams { + client: self.right.into_client::().await?, + tx_params: self.right_sign.transaction_params::()?, + accounts: vec![], + }, + )?, + right_to_left_transaction_params: self.left_sign.transaction_params::(), + left_to_right_transaction_params: self.right_sign.transaction_params::(), + }) + } + } + } + }; +} + +#[async_trait] +impl< + Left: ChainWithTransactions + ChainWithRuntimeVersion, + Right: ChainWithTransactions + ChainWithRuntimeVersion, + L2R: CliBridgeBase + + MessagesCliBridge + + RelayToRelayHeadersCliBridge, + R2L: CliBridgeBase + + MessagesCliBridge + + RelayToRelayHeadersCliBridge, + > Full2WayBridgeBase for RelayToRelayBridge +where + AccountIdOf: From< as Pair>::Public>, + AccountIdOf: From< as Pair>::Public>, +{ + type Params = RelayToRelayBridge; + type Left = Left; + type Right = Right; + + fn common(&self) -> &Full2WayBridgeCommonParams { + &self.common + } + + fn mut_common(&mut self) -> &mut Full2WayBridgeCommonParams { + &mut self.common + } + + async fn start_on_demand_headers_relayers( + &mut self, + ) -> anyhow::Result<( + Arc>, + Arc>, + )> { + ::Finality::start_relay_guards( + &self.common.right.client, + self.common.right.client.can_start_version_guard(), + ) + .await?; + ::Finality::start_relay_guards( + &self.common.left.client, + self.common.left.client.can_start_version_guard(), + ) + .await?; + + let left_to_right_on_demand_headers = + OnDemandHeadersRelay::<::Finality>::new( + self.common.left.client.clone(), + self.common.right.client.clone(), + self.common.right.tx_params.clone(), + self.common.shared.only_mandatory_headers, + None, + ); + let right_to_left_on_demand_headers = + OnDemandHeadersRelay::<::Finality>::new( + self.common.right.client.clone(), + self.common.left.client.clone(), + self.common.left.tx_params.clone(), + self.common.shared.only_mandatory_headers, + None, + ); + + Ok((Arc::new(left_to_right_on_demand_headers), Arc::new(right_to_left_on_demand_headers))) + } +} diff --git a/bridges/relays/lib-substrate-relay/src/cli/relay_messages.rs b/bridges/relays/lib-substrate-relay/src/cli/relay_messages.rs new file mode 100644 index 0000000000000000000000000000000000000000..b672bd4f9b86812c87532012debb89e0a601451f --- /dev/null +++ b/bridges/relays/lib-substrate-relay/src/cli/relay_messages.rs @@ -0,0 +1,89 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Primitives for exposing the messages relaying functionality in the CLI. + +use crate::{ + cli::{bridge::*, chain_schema::*, HexLaneId, PrometheusParams}, + messages_lane::MessagesRelayParams, + TransactionParams, +}; + +use async_trait::async_trait; +use sp_core::Pair; +use structopt::StructOpt; + +use relay_substrate_client::{ + AccountIdOf, AccountKeyPairOf, BalanceOf, ChainWithRuntimeVersion, ChainWithTransactions, +}; + +/// Messages relaying params. +#[derive(StructOpt)] +pub struct RelayMessagesParams { + /// Hex-encoded lane id that should be served by the relay. Defaults to `00000000`. + #[structopt(long, default_value = "00000000")] + lane: HexLaneId, + #[structopt(flatten)] + source: SourceConnectionParams, + #[structopt(flatten)] + source_sign: SourceSigningParams, + #[structopt(flatten)] + target: TargetConnectionParams, + #[structopt(flatten)] + target_sign: TargetSigningParams, + #[structopt(flatten)] + prometheus_params: PrometheusParams, +} + +/// Trait used for relaying messages between 2 chains. +#[async_trait] +pub trait MessagesRelayer: MessagesCliBridge +where + Self::Source: ChainWithTransactions + ChainWithRuntimeVersion, + AccountIdOf: From< as Pair>::Public>, + AccountIdOf: From< as Pair>::Public>, + BalanceOf: TryFrom>, +{ + /// Start relaying messages. + async fn relay_messages(data: RelayMessagesParams) -> anyhow::Result<()> { + let source_client = data.source.into_client::().await?; + let source_sign = data.source_sign.to_keypair::()?; + let source_transactions_mortality = data.source_sign.transactions_mortality()?; + let target_client = data.target.into_client::().await?; + let target_sign = data.target_sign.to_keypair::()?; + let target_transactions_mortality = data.target_sign.transactions_mortality()?; + + crate::messages_lane::run::(MessagesRelayParams { + source_client, + source_transaction_params: TransactionParams { + signer: source_sign, + mortality: source_transactions_mortality, + }, + target_client, + target_transaction_params: TransactionParams { + signer: target_sign, + mortality: target_transactions_mortality, + }, + source_to_target_headers_relay: None, + target_to_source_headers_relay: None, + lane_id: data.lane.into(), + limits: Self::maybe_messages_limits(), + metrics_params: data.prometheus_params.into_metrics_params()?, + }) + .await + .map_err(|e| anyhow::format_err!("{}", e)) + } +} diff --git a/bridges/relays/lib-substrate-relay/src/cli/relay_parachains.rs b/bridges/relays/lib-substrate-relay/src/cli/relay_parachains.rs new file mode 100644 index 0000000000000000000000000000000000000000..e5a52349469bbdf36c7de228078d8d10b0e882f0 --- /dev/null +++ b/bridges/relays/lib-substrate-relay/src/cli/relay_parachains.rs @@ -0,0 +1,91 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Primitives for exposing the parachains finality relaying functionality in the CLI. + +use async_std::sync::Mutex; +use async_trait::async_trait; +use parachains_relay::parachains_loop::{AvailableHeader, SourceClient, TargetClient}; +use relay_substrate_client::Parachain; +use relay_utils::metrics::{GlobalMetrics, StandaloneMetric}; +use std::sync::Arc; +use structopt::StructOpt; + +use crate::{ + cli::{ + bridge::{CliBridgeBase, ParachainToRelayHeadersCliBridge}, + chain_schema::*, + PrometheusParams, + }, + parachains::{source::ParachainsSource, target::ParachainsTarget, ParachainsPipelineAdapter}, + TransactionParams, +}; + +/// Parachains heads relaying params. +#[derive(StructOpt)] +pub struct RelayParachainsParams { + #[structopt(flatten)] + source: SourceConnectionParams, + #[structopt(flatten)] + target: TargetConnectionParams, + #[structopt(flatten)] + target_sign: TargetSigningParams, + #[structopt(flatten)] + prometheus_params: PrometheusParams, +} + +/// Trait used for relaying parachains finality between 2 chains. +#[async_trait] +pub trait ParachainsRelayer: ParachainToRelayHeadersCliBridge +where + ParachainsSource: + SourceClient>, + ParachainsTarget: + TargetClient>, + ::Source: Parachain, +{ + /// Start relaying parachains finality. + async fn relay_parachains(data: RelayParachainsParams) -> anyhow::Result<()> { + let source_client = data.source.into_client::().await?; + let source_client = ParachainsSource::::new( + source_client, + Arc::new(Mutex::new(AvailableHeader::Missing)), + ); + + let target_transaction_params = TransactionParams { + signer: data.target_sign.to_keypair::()?, + mortality: data.target_sign.target_transactions_mortality, + }; + let target_client = data.target.into_client::().await?; + let target_client = ParachainsTarget::::new( + target_client.clone(), + target_transaction_params, + ); + + let metrics_params: relay_utils::metrics::MetricsParams = + data.prometheus_params.into_metrics_params()?; + GlobalMetrics::new()?.register_and_spawn(&metrics_params.registry)?; + + parachains_relay::parachains_loop::run( + source_client, + target_client, + metrics_params, + futures::future::pending(), + ) + .await + .map_err(|e| anyhow::format_err!("{}", e)) + } +} diff --git a/bridges/relays/lib-substrate-relay/src/equivocation/mod.rs b/bridges/relays/lib-substrate-relay/src/equivocation/mod.rs new file mode 100644 index 0000000000000000000000000000000000000000..f6d58cbaa4ab4c4d7f489de5a80ab226b3b475b4 --- /dev/null +++ b/bridges/relays/lib-substrate-relay/src/equivocation/mod.rs @@ -0,0 +1,223 @@ +// Copyright 2019-2023 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Types and functions intended to ease adding of new Substrate -> Substrate +//! equivocation detection pipelines. + +mod source; +mod target; + +use crate::{ + equivocation::{source::SubstrateEquivocationSource, target::SubstrateEquivocationTarget}, + finality_base::{engine::Engine, SubstrateFinalityPipeline, SubstrateFinalityProof}, + TransactionParams, +}; + +use async_trait::async_trait; +use bp_runtime::{AccountIdOf, BlockNumberOf, HashOf}; +use equivocation_detector::EquivocationDetectionPipeline; +use finality_relay::FinalityPipeline; +use pallet_grandpa::{Call as GrandpaCall, Config as GrandpaConfig}; +use relay_substrate_client::{AccountKeyPairOf, CallOf, Chain, ChainWithTransactions, Client}; +use relay_utils::metrics::MetricsParams; +use sp_core::Pair; +use sp_runtime::traits::{Block, Header}; +use std::marker::PhantomData; + +/// Convenience trait that adds bounds to `SubstrateEquivocationDetectionPipeline`. +pub trait BaseSubstrateEquivocationDetectionPipeline: + SubstrateFinalityPipeline +{ + /// Bounded `SubstrateFinalityPipeline::SourceChain`. + type BoundedSourceChain: ChainWithTransactions; + + /// Bounded `AccountIdOf`. + type BoundedSourceChainAccountId: From< as Pair>::Public> + + Send; +} + +impl BaseSubstrateEquivocationDetectionPipeline for T +where + T: SubstrateFinalityPipeline, + T::SourceChain: ChainWithTransactions, + AccountIdOf: From< as Pair>::Public>, +{ + type BoundedSourceChain = T::SourceChain; + type BoundedSourceChainAccountId = AccountIdOf; +} + +/// Substrate -> Substrate equivocation detection pipeline. +#[async_trait] +pub trait SubstrateEquivocationDetectionPipeline: + BaseSubstrateEquivocationDetectionPipeline +{ + /// How the `report_equivocation` call is built ? + type ReportEquivocationCallBuilder: ReportEquivocationCallBuilder; + + /// Add relay guards if required. + async fn start_relay_guards( + source_client: &Client, + enable_version_guard: bool, + ) -> relay_substrate_client::Result<()> { + if enable_version_guard { + relay_substrate_client::guard::abort_on_spec_version_change( + source_client.clone(), + source_client.simple_runtime_version().await?.spec_version, + ); + } + Ok(()) + } +} + +type FinalityProoffOf

= <

::FinalityEngine as Engine< +

::SourceChain, +>>::FinalityProof; +type FinalityVerificationContextfOf

= + <

::FinalityEngine as Engine< +

::SourceChain, + >>::FinalityVerificationContext; +/// The type of the equivocation proof used by the `SubstrateEquivocationDetectionPipeline` +pub type EquivocationProofOf

= <

::FinalityEngine as Engine< +

::SourceChain, +>>::EquivocationProof; +type EquivocationsFinderOf

= <

::FinalityEngine as Engine< +

::SourceChain, +>>::EquivocationsFinder; +/// The type of the key owner proof used by the `SubstrateEquivocationDetectionPipeline` +pub type KeyOwnerProofOf

= <

::FinalityEngine as Engine< +

::SourceChain, +>>::KeyOwnerProof; + +/// Adapter that allows a `SubstrateEquivocationDetectionPipeline` to act as an +/// `EquivocationDetectionPipeline`. +#[derive(Clone, Debug)] +pub struct EquivocationDetectionPipelineAdapter { + _phantom: PhantomData

, +} + +impl FinalityPipeline + for EquivocationDetectionPipelineAdapter

+{ + const SOURCE_NAME: &'static str = P::SourceChain::NAME; + const TARGET_NAME: &'static str = P::TargetChain::NAME; + + type Hash = HashOf; + type Number = BlockNumberOf; + type FinalityProof = SubstrateFinalityProof

; +} + +impl EquivocationDetectionPipeline + for EquivocationDetectionPipelineAdapter

+{ + type TargetNumber = BlockNumberOf; + type FinalityVerificationContext = FinalityVerificationContextfOf

; + type EquivocationProof = EquivocationProofOf

; + type EquivocationsFinder = EquivocationsFinderOf

; +} + +/// Different ways of building `report_equivocation` calls. +pub trait ReportEquivocationCallBuilder { + /// Build a `report_equivocation` call to be executed on the source chain. + fn build_report_equivocation_call( + equivocation_proof: EquivocationProofOf

, + key_owner_proof: KeyOwnerProofOf

, + ) -> CallOf; +} + +/// Building the `report_equivocation` call when having direct access to the target chain runtime. +pub struct DirectReportGrandpaEquivocationCallBuilder { + _phantom: PhantomData<(P, R)>, +} + +impl ReportEquivocationCallBuilder

for DirectReportGrandpaEquivocationCallBuilder +where + P: SubstrateEquivocationDetectionPipeline, + P::FinalityEngine: Engine< + P::SourceChain, + EquivocationProof = sp_consensus_grandpa::EquivocationProof< + HashOf, + BlockNumberOf, + >, + >, + R: frame_system::Config> + + GrandpaConfig>, + ::Header: Header>, + CallOf: From>, +{ + fn build_report_equivocation_call( + equivocation_proof: EquivocationProofOf

, + key_owner_proof: KeyOwnerProofOf

, + ) -> CallOf { + GrandpaCall::::report_equivocation { + equivocation_proof: Box::new(equivocation_proof), + key_owner_proof, + } + .into() + } +} + +/// Macro that generates `ReportEquivocationCallBuilder` implementation for the case where +/// we only have access to the mocked version of the source chain runtime. +#[rustfmt::skip] +#[macro_export] +macro_rules! generate_report_equivocation_call_builder { + ($pipeline:ident, $mocked_builder:ident, $grandpa:path, $report_equivocation:path) => { + pub struct $mocked_builder; + + impl $crate::equivocation::ReportEquivocationCallBuilder<$pipeline> + for $mocked_builder + { + fn build_report_equivocation_call( + equivocation_proof: $crate::equivocation::EquivocationProofOf<$pipeline>, + key_owner_proof: $crate::equivocation::KeyOwnerProofOf<$pipeline>, + ) -> relay_substrate_client::CallOf< + <$pipeline as $crate::finality_base::SubstrateFinalityPipeline>::SourceChain + > { + bp_runtime::paste::item! { + $grandpa($report_equivocation { + equivocation_proof: Box::new(equivocation_proof), + key_owner_proof: key_owner_proof + }) + } + } + } + }; +} + +/// Run Substrate-to-Substrate equivocations detection loop. +pub async fn run( + source_client: Client, + target_client: Client, + source_transaction_params: TransactionParams>, + metrics_params: MetricsParams, +) -> anyhow::Result<()> { + log::info!( + target: "bridge", + "Starting {} -> {} equivocations detection loop", + P::SourceChain::NAME, + P::TargetChain::NAME, + ); + + equivocation_detector::run( + SubstrateEquivocationSource::

::new(source_client, source_transaction_params), + SubstrateEquivocationTarget::

::new(target_client), + P::TargetChain::AVERAGE_BLOCK_INTERVAL, + metrics_params, + futures::future::pending(), + ) + .await + .map_err(|e| anyhow::format_err!("{}", e)) +} diff --git a/bridges/relays/lib-substrate-relay/src/equivocation/source.rs b/bridges/relays/lib-substrate-relay/src/equivocation/source.rs new file mode 100644 index 0000000000000000000000000000000000000000..a0c7dcf5cbc32c7e5a39de5acd53d92def24a22f --- /dev/null +++ b/bridges/relays/lib-substrate-relay/src/equivocation/source.rs @@ -0,0 +1,109 @@ +// Copyright 2019-2023 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Default generic implementation of equivocation source for basic Substrate client. + +use crate::{ + equivocation::{ + EquivocationDetectionPipelineAdapter, EquivocationProofOf, ReportEquivocationCallBuilder, + SubstrateEquivocationDetectionPipeline, + }, + finality_base::{engine::Engine, finality_proofs, SubstrateFinalityProofsStream}, + TransactionParams, +}; + +use async_trait::async_trait; +use bp_runtime::{HashOf, TransactionEra}; +use equivocation_detector::SourceClient; +use finality_relay::SourceClientBase; +use relay_substrate_client::{ + AccountKeyPairOf, Client, Error, TransactionTracker, UnsignedTransaction, +}; +use relay_utils::relay_loop::Client as RelayClient; + +/// Substrate node as equivocation source. +pub struct SubstrateEquivocationSource { + client: Client, + transaction_params: TransactionParams>, +} + +impl SubstrateEquivocationSource

{ + /// Create new instance of `SubstrateEquivocationSource`. + pub fn new( + client: Client, + transaction_params: TransactionParams>, + ) -> Self { + Self { client, transaction_params } + } +} + +impl Clone for SubstrateEquivocationSource

{ + fn clone(&self) -> Self { + Self { client: self.client.clone(), transaction_params: self.transaction_params.clone() } + } +} + +#[async_trait] +impl RelayClient for SubstrateEquivocationSource

{ + type Error = Error; + + async fn reconnect(&mut self) -> Result<(), Error> { + self.client.reconnect().await + } +} + +#[async_trait] +impl + SourceClientBase> for SubstrateEquivocationSource

+{ + type FinalityProofsStream = SubstrateFinalityProofsStream

; + + async fn finality_proofs(&self) -> Result { + finality_proofs::

(&self.client).await + } +} + +#[async_trait] +impl + SourceClient> for SubstrateEquivocationSource

+{ + type TransactionTracker = TransactionTracker>; + + async fn report_equivocation( + &self, + at: HashOf, + equivocation: EquivocationProofOf

, + ) -> Result { + let key_owner_proof = + P::FinalityEngine::generate_source_key_ownership_proof(&self.client, at, &equivocation) + .await?; + + let mortality = self.transaction_params.mortality; + let call = P::ReportEquivocationCallBuilder::build_report_equivocation_call( + equivocation, + key_owner_proof, + ); + self.client + .submit_and_watch_signed_extrinsic( + &self.transaction_params.signer, + move |best_block_id, transaction_nonce| { + Ok(UnsignedTransaction::new(call.into(), transaction_nonce) + .era(TransactionEra::new(best_block_id, mortality))) + }, + ) + .await + } +} diff --git a/bridges/relays/lib-substrate-relay/src/equivocation/target.rs b/bridges/relays/lib-substrate-relay/src/equivocation/target.rs new file mode 100644 index 0000000000000000000000000000000000000000..6eee2ab91d45b033a77e30b7d05ae28b246b9735 --- /dev/null +++ b/bridges/relays/lib-substrate-relay/src/equivocation/target.rs @@ -0,0 +1,111 @@ +// Copyright 2019-2023 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Default generic implementation of equivocation source for basic Substrate client. + +use crate::{ + equivocation::{ + EquivocationDetectionPipelineAdapter, FinalityProoffOf, FinalityVerificationContextfOf, + SubstrateEquivocationDetectionPipeline, + }, + finality_base::{best_synced_header_id, engine::Engine}, +}; + +use async_trait::async_trait; +use bp_header_chain::HeaderFinalityInfo; +use bp_runtime::{BlockNumberOf, HashOf}; +use equivocation_detector::TargetClient; +use relay_substrate_client::{Client, Error}; +use relay_utils::relay_loop::Client as RelayClient; +use sp_runtime::traits::Header; +use std::marker::PhantomData; + +/// Substrate node as equivocation source. +pub struct SubstrateEquivocationTarget { + client: Client, + + _phantom: PhantomData

, +} + +impl SubstrateEquivocationTarget

{ + /// Create new instance of `SubstrateEquivocationTarget`. + pub fn new(client: Client) -> Self { + Self { client, _phantom: Default::default() } + } +} + +impl Clone for SubstrateEquivocationTarget

{ + fn clone(&self) -> Self { + Self { client: self.client.clone(), _phantom: Default::default() } + } +} + +#[async_trait] +impl RelayClient for SubstrateEquivocationTarget

{ + type Error = Error; + + async fn reconnect(&mut self) -> Result<(), Error> { + self.client.reconnect().await + } +} + +#[async_trait] +impl + TargetClient> for SubstrateEquivocationTarget

+{ + async fn best_finalized_header_number( + &self, + ) -> Result, Self::Error> { + self.client.best_finalized_header_number().await + } + + async fn best_synced_header_hash( + &self, + at: BlockNumberOf, + ) -> Result>, Self::Error> { + Ok(best_synced_header_id::( + &self.client, + self.client.header_by_number(at).await?.hash(), + ) + .await? + .map(|id| id.hash())) + } + + async fn finality_verification_context( + &self, + at: BlockNumberOf, + ) -> Result, Self::Error> { + P::FinalityEngine::finality_verification_context( + &self.client, + self.client.header_by_number(at).await?.hash(), + ) + .await + } + + async fn synced_headers_finality_info( + &self, + at: BlockNumberOf, + ) -> Result< + Vec, FinalityVerificationContextfOf

>>, + Self::Error, + > { + P::FinalityEngine::synced_headers_finality_info( + &self.client, + self.client.header_by_number(at).await?.hash(), + ) + .await + } +} diff --git a/bridges/relays/lib-substrate-relay/src/error.rs b/bridges/relays/lib-substrate-relay/src/error.rs new file mode 100644 index 0000000000000000000000000000000000000000..2ebd9130f3912ba4c0552860a2259b222220e8f8 --- /dev/null +++ b/bridges/relays/lib-substrate-relay/src/error.rs @@ -0,0 +1,63 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Relay errors. + +use relay_substrate_client as client; +use sp_consensus_grandpa::AuthorityList; +use sp_runtime::traits::MaybeDisplay; +use std::fmt::Debug; +use thiserror::Error; + +/// Relay errors. +#[derive(Error, Debug)] +pub enum Error { + /// Failed to submit signed extrinsic from to the target chain. + #[error("Failed to submit {0} transaction: {1:?}")] + SubmitTransaction(&'static str, client::Error), + /// Failed subscribe to justification stream of the source chain. + #[error("Failed to subscribe to {0} justifications: {1:?}")] + Subscribe(&'static str, client::Error), + /// Failed subscribe to read justification from the source chain (client error). + #[error("Failed to read {0} justification from the stream: {1}")] + ReadJustification(&'static str, client::Error), + /// Failed subscribe to read justification from the source chain (stream ended). + #[error("Failed to read {0} justification from the stream: stream has ended unexpectedly")] + ReadJustificationStreamEnded(&'static str), + /// Failed subscribe to decode justification from the source chain. + #[error("Failed to decode {0} justification: {1:?}")] + DecodeJustification(&'static str, codec::Error), + /// GRANDPA authorities read from the source chain are invalid. + #[error("Read invalid {0} authorities set: {1:?}")] + ReadInvalidAuthorities(&'static str, AuthorityList), + /// Failed to guess initial GRANDPA authorities at the given header of the source chain. + #[error("Failed to guess initial {0} GRANDPA authorities set id: checked all possible ids in range [0; {1}]")] + GuessInitialAuthorities(&'static str, HeaderNumber), + /// Failed to retrieve GRANDPA authorities at the given header from the source chain. + #[error("Failed to retrive {0} GRANDPA authorities set at header {1}: {2:?}")] + RetrieveAuthorities(&'static str, Hash, client::Error), + /// Failed to decode GRANDPA authorities at the given header of the source chain. + #[error("Failed to decode {0} GRANDPA authorities set at header {1}: {2:?}")] + DecodeAuthorities(&'static str, Hash, codec::Error), + /// Failed to retrieve header by the hash from the source chain. + #[error("Failed to retrieve {0} header with hash {1}: {2:?}")] + RetrieveHeader(&'static str, Hash, client::Error), + /// Failed to submit signed extrinsic from to the target chain. + #[error( + "Failed to retrieve `is_initialized` flag of the with-{0} finality pallet at {1}: {2:?}" + )] + IsInitializedRetrieve(&'static str, &'static str, client::Error), +} diff --git a/bridges/relays/lib-substrate-relay/src/finality/initialize.rs b/bridges/relays/lib-substrate-relay/src/finality/initialize.rs new file mode 100644 index 0000000000000000000000000000000000000000..5dde46c39dd674e7c01eebba4b014bc999611eb5 --- /dev/null +++ b/bridges/relays/lib-substrate-relay/src/finality/initialize.rs @@ -0,0 +1,163 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Initialize Substrate -> Substrate finality bridge. +//! +//! Initialization is a transaction that calls `initialize()` function of the +//! finality pallet (GRANDPA/BEEFY/...). This transaction brings initial header +//! and authorities set from source to target chain. The finality sync starts +//! with this header. + +use crate::{error::Error, finality_base::engine::Engine}; +use sp_core::Pair; + +use bp_runtime::HeaderIdOf; +use relay_substrate_client::{ + AccountKeyPairOf, Chain, ChainWithTransactions, Client, Error as SubstrateError, + UnsignedTransaction, +}; +use relay_utils::{TrackedTransactionStatus, TransactionTracker}; +use sp_runtime::traits::Header as HeaderT; + +/// Submit headers-bridge initialization transaction. +pub async fn initialize< + E: Engine, + SourceChain: Chain, + TargetChain: ChainWithTransactions, + F, +>( + source_client: Client, + target_client: Client, + target_signer: AccountKeyPairOf, + prepare_initialize_transaction: F, + dry_run: bool, +) where + F: FnOnce( + TargetChain::Nonce, + E::InitializationData, + ) -> Result, SubstrateError> + + Send + + 'static, + TargetChain::AccountId: From<::Public>, +{ + let result = do_initialize::( + source_client, + target_client, + target_signer, + prepare_initialize_transaction, + dry_run, + ) + .await; + + match result { + Ok(Some(tx_status)) => match tx_status { + TrackedTransactionStatus::Lost => { + log::error!( + target: "bridge", + "Failed to execute {}-headers bridge initialization transaction on {}: {:?}.", + SourceChain::NAME, + TargetChain::NAME, + tx_status + ) + }, + TrackedTransactionStatus::Finalized(_) => { + log::info!( + target: "bridge", + "Successfully executed {}-headers bridge initialization transaction on {}: {:?}.", + SourceChain::NAME, + TargetChain::NAME, + tx_status + ) + }, + }, + Ok(None) => (), + Err(err) => log::error!( + target: "bridge", + "Failed to submit {}-headers bridge initialization transaction to {}: {:?}", + SourceChain::NAME, + TargetChain::NAME, + err, + ), + } +} + +/// Craft and submit initialization transaction, returning any error that may occur. +async fn do_initialize< + E: Engine, + SourceChain: Chain, + TargetChain: ChainWithTransactions, + F, +>( + source_client: Client, + target_client: Client, + target_signer: AccountKeyPairOf, + prepare_initialize_transaction: F, + dry_run: bool, +) -> Result< + Option>>, + Error::Number>, +> +where + F: FnOnce( + TargetChain::Nonce, + E::InitializationData, + ) -> Result, SubstrateError> + + Send + + 'static, + TargetChain::AccountId: From<::Public>, +{ + let is_initialized = E::is_initialized(&target_client) + .await + .map_err(|e| Error::IsInitializedRetrieve(SourceChain::NAME, TargetChain::NAME, e))?; + if is_initialized { + log::info!( + target: "bridge", + "{}-headers bridge at {} is already initialized. Skipping", + SourceChain::NAME, + TargetChain::NAME, + ); + if !dry_run { + return Ok(None) + } + } + + let initialization_data = E::prepare_initialization_data(source_client).await?; + log::info!( + target: "bridge", + "Prepared initialization data for {}-headers bridge at {}: {:?}", + SourceChain::NAME, + TargetChain::NAME, + initialization_data, + ); + + let tx_status = target_client + .submit_and_watch_signed_extrinsic(&target_signer, move |_, transaction_nonce| { + let tx = prepare_initialize_transaction(transaction_nonce, initialization_data); + if dry_run { + Err(SubstrateError::Custom( + "Not submitting extrinsic in `dry-run` mode!".to_string(), + )) + } else { + tx + } + }) + .await + .map_err(|err| Error::SubmitTransaction(TargetChain::NAME, err))? + .wait() + .await; + + Ok(Some(tx_status)) +} diff --git a/bridges/relays/lib-substrate-relay/src/finality/mod.rs b/bridges/relays/lib-substrate-relay/src/finality/mod.rs new file mode 100644 index 0000000000000000000000000000000000000000..206f628b143b8a085dec9a0ef5de929c178c25f6 --- /dev/null +++ b/bridges/relays/lib-substrate-relay/src/finality/mod.rs @@ -0,0 +1,270 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Types and functions intended to ease adding of new Substrate -> Substrate +//! finality proofs synchronization pipelines. + +use crate::{ + finality::{source::SubstrateFinalitySource, target::SubstrateFinalityTarget}, + finality_base::{engine::Engine, SubstrateFinalityPipeline, SubstrateFinalityProof}, + TransactionParams, +}; + +use async_trait::async_trait; +use bp_header_chain::justification::{GrandpaJustification, JustificationVerificationContext}; +use finality_relay::{FinalityPipeline, FinalitySyncPipeline}; +use pallet_bridge_grandpa::{Call as BridgeGrandpaCall, Config as BridgeGrandpaConfig}; +use relay_substrate_client::{ + transaction_stall_timeout, AccountIdOf, AccountKeyPairOf, BlockNumberOf, CallOf, Chain, + ChainWithTransactions, Client, HashOf, HeaderOf, SyncHeader, +}; +use relay_utils::metrics::MetricsParams; +use sp_core::Pair; +use std::{fmt::Debug, marker::PhantomData}; + +pub mod initialize; +pub mod source; +pub mod target; + +/// Default limit of recent finality proofs. +/// +/// Finality delay of 4096 blocks is unlikely to happen in practice in +/// Substrate+GRANDPA based chains (good to know). +pub(crate) const RECENT_FINALITY_PROOFS_LIMIT: usize = 4096; + +/// Convenience trait that adds bounds to `SubstrateFinalitySyncPipeline`. +pub trait BaseSubstrateFinalitySyncPipeline: + SubstrateFinalityPipeline +{ + /// Bounded `SubstrateFinalityPipeline::TargetChain`. + type BoundedTargetChain: ChainWithTransactions; + + /// Bounded `AccountIdOf`. + type BoundedTargetChainAccountId: From< as Pair>::Public> + + Send; +} + +impl BaseSubstrateFinalitySyncPipeline for T +where + T: SubstrateFinalityPipeline, + T::TargetChain: ChainWithTransactions, + AccountIdOf: From< as Pair>::Public>, +{ + type BoundedTargetChain = T::TargetChain; + type BoundedTargetChainAccountId = AccountIdOf; +} + +/// Substrate -> Substrate finality proofs synchronization pipeline. +#[async_trait] +pub trait SubstrateFinalitySyncPipeline: BaseSubstrateFinalitySyncPipeline { + /// How submit finality proof call is built? + type SubmitFinalityProofCallBuilder: SubmitFinalityProofCallBuilder; + + /// Add relay guards if required. + async fn start_relay_guards( + target_client: &Client, + enable_version_guard: bool, + ) -> relay_substrate_client::Result<()> { + if enable_version_guard { + relay_substrate_client::guard::abort_on_spec_version_change( + target_client.clone(), + target_client.simple_runtime_version().await?.spec_version, + ); + } + Ok(()) + } +} + +/// Adapter that allows all `SubstrateFinalitySyncPipeline` to act as `FinalitySyncPipeline`. +#[derive(Clone, Debug)] +pub struct FinalitySyncPipelineAdapter { + _phantom: PhantomData

, +} + +impl FinalityPipeline for FinalitySyncPipelineAdapter

{ + const SOURCE_NAME: &'static str = P::SourceChain::NAME; + const TARGET_NAME: &'static str = P::TargetChain::NAME; + + type Hash = HashOf; + type Number = BlockNumberOf; + type FinalityProof = SubstrateFinalityProof

; +} + +impl FinalitySyncPipeline for FinalitySyncPipelineAdapter

{ + type ConsensusLogReader = >::ConsensusLogReader; + type Header = SyncHeader>; +} + +/// Different ways of building `submit_finality_proof` calls. +pub trait SubmitFinalityProofCallBuilder { + /// Given source chain header, its finality proof and the current authority set id, build call + /// of `submit_finality_proof` function of bridge GRANDPA module at the target chain. + fn build_submit_finality_proof_call( + header: SyncHeader>, + proof: SubstrateFinalityProof

, + context: <

::FinalityEngine as Engine>::FinalityVerificationContext, + ) -> CallOf; +} + +/// Building `submit_finality_proof` call when you have direct access to the target +/// chain runtime. +pub struct DirectSubmitGrandpaFinalityProofCallBuilder { + _phantom: PhantomData<(P, R, I)>, +} + +impl SubmitFinalityProofCallBuilder

+ for DirectSubmitGrandpaFinalityProofCallBuilder +where + P: SubstrateFinalitySyncPipeline, + R: BridgeGrandpaConfig, + I: 'static, + R::BridgedChain: bp_runtime::Chain

>, + CallOf: From>, + P::FinalityEngine: Engine< + P::SourceChain, + FinalityProof = GrandpaJustification>, + FinalityVerificationContext = JustificationVerificationContext, + >, +{ + fn build_submit_finality_proof_call( + header: SyncHeader>, + proof: GrandpaJustification>, + _context: JustificationVerificationContext, + ) -> CallOf { + BridgeGrandpaCall::::submit_finality_proof { + finality_target: Box::new(header.into_inner()), + justification: proof, + } + .into() + } +} + +/// Macro that generates `SubmitFinalityProofCallBuilder` implementation for the case when +/// you only have an access to the mocked version of target chain runtime. In this case you +/// should provide "name" of the call variant for the bridge GRANDPA calls and the "name" of +/// the variant for the `submit_finality_proof` call within that first option. +#[rustfmt::skip] +#[macro_export] +macro_rules! generate_submit_finality_proof_call_builder { + ($pipeline:ident, $mocked_builder:ident, $bridge_grandpa:path, $submit_finality_proof:path) => { + pub struct $mocked_builder; + + impl $crate::finality::SubmitFinalityProofCallBuilder<$pipeline> + for $mocked_builder + { + fn build_submit_finality_proof_call( + header: relay_substrate_client::SyncHeader< + relay_substrate_client::HeaderOf< + <$pipeline as $crate::finality_base::SubstrateFinalityPipeline>::SourceChain + > + >, + proof: bp_header_chain::justification::GrandpaJustification< + relay_substrate_client::HeaderOf< + <$pipeline as $crate::finality_base::SubstrateFinalityPipeline>::SourceChain + > + >, + _context: bp_header_chain::justification::JustificationVerificationContext, + ) -> relay_substrate_client::CallOf< + <$pipeline as $crate::finality_base::SubstrateFinalityPipeline>::TargetChain + > { + bp_runtime::paste::item! { + $bridge_grandpa($submit_finality_proof { + finality_target: Box::new(header.into_inner()), + justification: proof + }) + } + } + } + }; +} + +/// Macro that generates `SubmitFinalityProofCallBuilder` implementation for the case when +/// you only have an access to the mocked version of target chain runtime. In this case you +/// should provide "name" of the call variant for the bridge GRANDPA calls and the "name" of +/// the variant for the `submit_finality_proof_ex` call within that first option. +#[rustfmt::skip] +#[macro_export] +macro_rules! generate_submit_finality_proof_ex_call_builder { + ($pipeline:ident, $mocked_builder:ident, $bridge_grandpa:path, $submit_finality_proof:path) => { + pub struct $mocked_builder; + + impl $crate::finality::SubmitFinalityProofCallBuilder<$pipeline> + for $mocked_builder + { + fn build_submit_finality_proof_call( + header: relay_substrate_client::SyncHeader< + relay_substrate_client::HeaderOf< + <$pipeline as $crate::finality_base::SubstrateFinalityPipeline>::SourceChain + > + >, + proof: bp_header_chain::justification::GrandpaJustification< + relay_substrate_client::HeaderOf< + <$pipeline as $crate::finality_base::SubstrateFinalityPipeline>::SourceChain + > + >, + context: bp_header_chain::justification::JustificationVerificationContext, + ) -> relay_substrate_client::CallOf< + <$pipeline as $crate::finality_base::SubstrateFinalityPipeline>::TargetChain + > { + bp_runtime::paste::item! { + $bridge_grandpa($submit_finality_proof { + finality_target: Box::new(header.into_inner()), + justification: proof, + current_set_id: context.authority_set_id + }) + } + } + } + }; +} + +/// Run Substrate-to-Substrate finality sync loop. +pub async fn run( + source_client: Client, + target_client: Client, + only_mandatory_headers: bool, + transaction_params: TransactionParams>, + metrics_params: MetricsParams, +) -> anyhow::Result<()> { + log::info!( + target: "bridge", + "Starting {} -> {} finality proof relay", + P::SourceChain::NAME, + P::TargetChain::NAME, + ); + + finality_relay::run( + SubstrateFinalitySource::

::new(source_client, None), + SubstrateFinalityTarget::

::new(target_client, transaction_params.clone()), + finality_relay::FinalitySyncParams { + tick: std::cmp::max( + P::SourceChain::AVERAGE_BLOCK_INTERVAL, + P::TargetChain::AVERAGE_BLOCK_INTERVAL, + ), + recent_finality_proofs_limit: RECENT_FINALITY_PROOFS_LIMIT, + stall_timeout: transaction_stall_timeout( + transaction_params.mortality, + P::TargetChain::AVERAGE_BLOCK_INTERVAL, + relay_utils::STALL_TIMEOUT, + ), + only_mandatory_headers, + }, + metrics_params, + futures::future::pending(), + ) + .await + .map_err(|e| anyhow::format_err!("{}", e)) +} diff --git a/bridges/relays/lib-substrate-relay/src/finality/source.rs b/bridges/relays/lib-substrate-relay/src/finality/source.rs new file mode 100644 index 0000000000000000000000000000000000000000..c94af6108957a0d2d4b0b4079220be9c11a5a470 --- /dev/null +++ b/bridges/relays/lib-substrate-relay/src/finality/source.rs @@ -0,0 +1,259 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Default generic implementation of finality source for basic Substrate client. + +use crate::{ + finality::{FinalitySyncPipelineAdapter, SubstrateFinalitySyncPipeline}, + finality_base::{ + engine::Engine, finality_proofs, SubstrateFinalityProof, SubstrateFinalityProofsStream, + }, +}; + +use async_std::sync::{Arc, Mutex}; +use async_trait::async_trait; +use bp_header_chain::FinalityProof; +use codec::Decode; +use finality_relay::{SourceClient, SourceClientBase}; +use futures::{ + select, + stream::{try_unfold, Stream, StreamExt, TryStreamExt}, +}; +use num_traits::One; +use relay_substrate_client::{BlockNumberOf, BlockWithJustification, Client, Error, HeaderOf}; +use relay_utils::{relay_loop::Client as RelayClient, UniqueSaturatedInto}; + +/// Shared updatable reference to the maximal header number that we want to sync from the source. +pub type RequiredHeaderNumberRef = Arc::BlockNumber>>; + +/// Substrate node as finality source. +pub struct SubstrateFinalitySource { + client: Client, + maximal_header_number: Option>, +} + +impl SubstrateFinalitySource

{ + /// Create new headers source using given client. + pub fn new( + client: Client, + maximal_header_number: Option>, + ) -> Self { + SubstrateFinalitySource { client, maximal_header_number } + } + + /// Returns reference to the underlying RPC client. + pub fn client(&self) -> &Client { + &self.client + } + + /// Returns best finalized block number. + pub async fn on_chain_best_finalized_block_number( + &self, + ) -> Result, Error> { + // we **CAN** continue to relay finality proofs if source node is out of sync, because + // target node may be missing proofs that are already available at the source + self.client.best_finalized_header_number().await + } + + /// Return header and its justification of the given block or its descendant that + /// has a GRANDPA justification. + /// + /// This method is optimized for cases when `block_number` is close to the best finalized + /// chain block. + pub async fn prove_block_finality( + &self, + block_number: BlockNumberOf, + ) -> Result< + (relay_substrate_client::SyncHeader>, SubstrateFinalityProof

), + Error, + > { + // first, subscribe to proofs + let next_persistent_proof = + self.persistent_proofs_stream(block_number + One::one()).await?.fuse(); + let next_ephemeral_proof = self.ephemeral_proofs_stream(block_number).await?.fuse(); + + // in perfect world we'll need to return justfication for the requested `block_number` + let (header, maybe_proof) = self.header_and_finality_proof(block_number).await?; + if let Some(proof) = maybe_proof { + return Ok((header, proof)) + } + + // otherwise we don't care which header to return, so let's select first + futures::pin_mut!(next_persistent_proof, next_ephemeral_proof); + loop { + select! { + maybe_header_and_proof = next_persistent_proof.next() => match maybe_header_and_proof { + Some(header_and_proof) => return header_and_proof, + None => continue, + }, + maybe_header_and_proof = next_ephemeral_proof.next() => match maybe_header_and_proof { + Some(header_and_proof) => return header_and_proof, + None => continue, + }, + complete => return Err(Error::FinalityProofNotFound(block_number.unique_saturated_into())) + } + } + } + + /// Returns stream of headers and their persistent proofs, starting from given block. + async fn persistent_proofs_stream( + &self, + block_number: BlockNumberOf, + ) -> Result< + impl Stream< + Item = Result< + ( + relay_substrate_client::SyncHeader>, + SubstrateFinalityProof

, + ), + Error, + >, + >, + Error, + > { + let client = self.client.clone(); + let best_finalized_block_number = client.best_finalized_header_number().await?; + Ok(try_unfold((client, block_number), move |(client, current_block_number)| async move { + // if we've passed the `best_finalized_block_number`, we no longer need persistent + // justifications + if current_block_number > best_finalized_block_number { + return Ok(None) + } + + let (header, maybe_proof) = + header_and_finality_proof::

(&client, current_block_number).await?; + let next_block_number = current_block_number + One::one(); + let next_state = (client, next_block_number); + + Ok(Some((maybe_proof.map(|proof| (header, proof)), next_state))) + }) + .try_filter_map(|maybe_result| async { Ok(maybe_result) })) + } + + /// Returns stream of headers and their ephemeral proofs, starting from given block. + async fn ephemeral_proofs_stream( + &self, + block_number: BlockNumberOf, + ) -> Result< + impl Stream< + Item = Result< + ( + relay_substrate_client::SyncHeader>, + SubstrateFinalityProof

, + ), + Error, + >, + >, + Error, + > { + let client = self.client.clone(); + Ok(self.finality_proofs().await?.map(Ok).try_filter_map(move |proof| { + let client = client.clone(); + async move { + if proof.target_header_number() < block_number { + return Ok(None) + } + + let header = client.header_by_number(proof.target_header_number()).await?; + Ok(Some((header.into(), proof))) + } + })) + } +} + +impl Clone for SubstrateFinalitySource

{ + fn clone(&self) -> Self { + SubstrateFinalitySource { + client: self.client.clone(), + maximal_header_number: self.maximal_header_number.clone(), + } + } +} + +#[async_trait] +impl RelayClient for SubstrateFinalitySource

{ + type Error = Error; + + async fn reconnect(&mut self) -> Result<(), Error> { + self.client.reconnect().await + } +} + +#[async_trait] +impl SourceClientBase> + for SubstrateFinalitySource

+{ + type FinalityProofsStream = SubstrateFinalityProofsStream

; + + async fn finality_proofs(&self) -> Result { + finality_proofs::

(&self.client).await + } +} + +#[async_trait] +impl SourceClient> + for SubstrateFinalitySource

+{ + async fn best_finalized_block_number(&self) -> Result, Error> { + let mut finalized_header_number = self.on_chain_best_finalized_block_number().await?; + // never return block number larger than requested. This way we'll never sync headers + // past `maximal_header_number` + if let Some(ref maximal_header_number) = self.maximal_header_number { + let maximal_header_number = *maximal_header_number.lock().await; + if finalized_header_number > maximal_header_number { + finalized_header_number = maximal_header_number; + } + } + Ok(finalized_header_number) + } + + async fn header_and_finality_proof( + &self, + number: BlockNumberOf, + ) -> Result< + ( + relay_substrate_client::SyncHeader>, + Option>, + ), + Error, + > { + header_and_finality_proof::

(&self.client, number).await + } +} + +async fn header_and_finality_proof( + client: &Client, + number: BlockNumberOf, +) -> Result< + ( + relay_substrate_client::SyncHeader>, + Option>, + ), + Error, +> { + let header_hash = client.block_hash_by_number(number).await?; + let signed_block = client.get_block(Some(header_hash)).await?; + + let justification = signed_block + .justification(P::FinalityEngine::ID) + .map(|raw_justification| { + SubstrateFinalityProof::

::decode(&mut raw_justification.as_slice()) + }) + .transpose() + .map_err(Error::ResponseParseFailed)?; + + Ok((signed_block.header().into(), justification)) +} diff --git a/bridges/relays/lib-substrate-relay/src/finality/target.rs b/bridges/relays/lib-substrate-relay/src/finality/target.rs new file mode 100644 index 0000000000000000000000000000000000000000..18464d523f4f6cf4c9c165af82f6b7c2c2504070 --- /dev/null +++ b/bridges/relays/lib-substrate-relay/src/finality/target.rs @@ -0,0 +1,130 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Substrate client as Substrate finality proof target. + +use crate::{ + finality::{ + FinalitySyncPipelineAdapter, SubmitFinalityProofCallBuilder, SubstrateFinalitySyncPipeline, + }, + finality_base::{best_synced_header_id, engine::Engine, SubstrateFinalityProof}, + TransactionParams, +}; + +use async_trait::async_trait; +use finality_relay::TargetClient; +use relay_substrate_client::{ + AccountKeyPairOf, Client, Error, HeaderIdOf, HeaderOf, SyncHeader, TransactionEra, + TransactionTracker, UnsignedTransaction, +}; +use relay_utils::relay_loop::Client as RelayClient; +use sp_runtime::traits::Header; + +/// Substrate client as Substrate finality target. +pub struct SubstrateFinalityTarget { + client: Client, + transaction_params: TransactionParams>, +} + +impl SubstrateFinalityTarget

{ + /// Create new Substrate headers target. + pub fn new( + client: Client, + transaction_params: TransactionParams>, + ) -> Self { + SubstrateFinalityTarget { client, transaction_params } + } + + /// Ensure that the bridge pallet at target chain is active. + pub async fn ensure_pallet_active(&self) -> Result<(), Error> { + let is_halted = P::FinalityEngine::is_halted(&self.client).await?; + if is_halted { + return Err(Error::BridgePalletIsHalted) + } + + let is_initialized = P::FinalityEngine::is_initialized(&self.client).await?; + if !is_initialized { + return Err(Error::BridgePalletIsNotInitialized) + } + + Ok(()) + } +} + +impl Clone for SubstrateFinalityTarget

{ + fn clone(&self) -> Self { + SubstrateFinalityTarget { + client: self.client.clone(), + transaction_params: self.transaction_params.clone(), + } + } +} + +#[async_trait] +impl RelayClient for SubstrateFinalityTarget

{ + type Error = Error; + + async fn reconnect(&mut self) -> Result<(), Error> { + self.client.reconnect().await + } +} + +#[async_trait] +impl TargetClient> + for SubstrateFinalityTarget

+{ + type TransactionTracker = TransactionTracker>; + + async fn best_finalized_source_block_id(&self) -> Result, Error> { + // we can't continue to relay finality if target node is out of sync, because + // it may have already received (some of) headers that we're going to relay + self.client.ensure_synced().await?; + // we can't relay finality if bridge pallet at target chain is halted + self.ensure_pallet_active().await?; + + Ok(best_synced_header_id::( + &self.client, + self.client.best_header().await?.hash(), + ) + .await? + .ok_or(Error::BridgePalletIsNotInitialized)?) + } + + async fn submit_finality_proof( + &self, + header: SyncHeader>, + mut proof: SubstrateFinalityProof

, + ) -> Result { + // verify and runtime module at target chain may require optimized finality proof + let context = + P::FinalityEngine::verify_and_optimize_proof(&self.client, &header, &mut proof).await?; + + // now we may submit optimized finality proof + let mortality = self.transaction_params.mortality; + let call = P::SubmitFinalityProofCallBuilder::build_submit_finality_proof_call( + header, proof, context, + ); + self.client + .submit_and_watch_signed_extrinsic( + &self.transaction_params.signer, + move |best_block_id, transaction_nonce| { + Ok(UnsignedTransaction::new(call.into(), transaction_nonce) + .era(TransactionEra::new(best_block_id, mortality))) + }, + ) + .await + } +} diff --git a/bridges/relays/lib-substrate-relay/src/finality_base/engine.rs b/bridges/relays/lib-substrate-relay/src/finality_base/engine.rs new file mode 100644 index 0000000000000000000000000000000000000000..e517b0fd9b9abd50d6445e7222ef24ed946554bf --- /dev/null +++ b/bridges/relays/lib-substrate-relay/src/finality_base/engine.rs @@ -0,0 +1,464 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Support of different finality engines, available in Substrate. + +use crate::error::Error; +use async_trait::async_trait; +use bp_header_chain::{ + justification::{ + verify_and_optimize_justification, GrandpaEquivocationsFinder, GrandpaJustification, + JustificationVerificationContext, + }, + max_expected_submit_finality_proof_arguments_size, AuthoritySet, ConsensusLogReader, + FinalityProof, FindEquivocations, GrandpaConsensusLogReader, HeaderFinalityInfo, + HeaderGrandpaInfo, StoredHeaderGrandpaInfo, +}; +use bp_runtime::{BasicOperatingMode, HeaderIdProvider, OperatingMode}; +use codec::{Decode, Encode}; +use num_traits::{One, Zero}; +use relay_substrate_client::{ + BlockNumberOf, Chain, ChainWithGrandpa, Client, Error as SubstrateError, HashOf, HeaderOf, + Subscription, SubstrateFinalityClient, SubstrateGrandpaFinalityClient, +}; +use sp_consensus_grandpa::{AuthorityList as GrandpaAuthoritiesSet, GRANDPA_ENGINE_ID}; +use sp_core::{storage::StorageKey, Bytes}; +use sp_runtime::{scale_info::TypeInfo, traits::Header, ConsensusEngineId, SaturatedConversion}; +use std::{fmt::Debug, marker::PhantomData}; + +/// Result of checking maximal expected call size. +pub enum MaxExpectedCallSizeCheck { + /// Size is ok and call will be refunded. + Ok, + /// The call size exceeds the maximal expected and relayer will only get partial refund. + Exceeds { + /// Actual call size. + call_size: u32, + /// Maximal expected call size. + max_call_size: u32, + }, +} + +/// Finality engine, used by the Substrate chain. +#[async_trait] +pub trait Engine: Send { + /// Unique consensus engine identifier. + const ID: ConsensusEngineId; + /// A reader that can extract the consensus log from the header digest and interpret it. + type ConsensusLogReader: ConsensusLogReader; + /// Type of Finality RPC client used by this engine. + type FinalityClient: SubstrateFinalityClient; + /// Type of finality proofs, used by consensus engine. + type FinalityProof: FinalityProof, BlockNumberOf> + Decode + Encode; + /// The context needed for verifying finality proofs. + type FinalityVerificationContext: Debug + Send; + /// The type of the equivocation proof used by the consensus engine. + type EquivocationProof: Clone + Debug + Send + Sync; + /// The equivocations finder. + type EquivocationsFinder: FindEquivocations< + Self::FinalityProof, + Self::FinalityVerificationContext, + Self::EquivocationProof, + >; + /// The type of the key owner proof used by the consensus engine. + type KeyOwnerProof: Send; + /// Type of bridge pallet initialization data. + type InitializationData: Debug + Send + Sync + 'static; + /// Type of bridge pallet operating mode. + type OperatingMode: OperatingMode + 'static; + + /// Returns storage at the bridged (target) chain that corresponds to some value that is + /// missing from the storage until bridge pallet is initialized. + /// + /// Note that we don't care about type of the value - just if it present or not. + fn is_initialized_key() -> StorageKey; + + /// Returns `Ok(true)` if finality pallet at the bridged chain has already been initialized. + async fn is_initialized( + target_client: &Client, + ) -> Result { + Ok(target_client + .raw_storage_value(Self::is_initialized_key(), None) + .await? + .is_some()) + } + + /// Returns storage key at the bridged (target) chain that corresponds to the variable + /// that holds the operating mode of the pallet. + fn pallet_operating_mode_key() -> StorageKey; + + /// Returns `Ok(true)` if finality pallet at the bridged chain is halted. + async fn is_halted( + target_client: &Client, + ) -> Result { + Ok(target_client + .storage_value::(Self::pallet_operating_mode_key(), None) + .await? + .map(|operating_mode| operating_mode.is_halted()) + .unwrap_or(false)) + } + + /// A method to subscribe to encoded finality proofs, given source client. + async fn source_finality_proofs( + source_client: &Client, + ) -> Result, SubstrateError> { + source_client.subscribe_finality_justifications::().await + } + + /// Verify and optimize finality proof before sending it to the target node. + /// + /// Apart from optimization, we expect this method to perform all required checks + /// that the `header` and `proof` are valid at the current state of the target chain. + async fn verify_and_optimize_proof( + target_client: &Client, + header: &C::Header, + proof: &mut Self::FinalityProof, + ) -> Result; + + /// Checks whether the given `header` and its finality `proof` fit the maximal expected + /// call size limit. If result is `MaxExpectedCallSizeCheck::Exceeds { .. }`, this + /// submission won't be fully refunded and relayer will spend its own funds on that. + fn check_max_expected_call_size( + header: &C::Header, + proof: &Self::FinalityProof, + ) -> MaxExpectedCallSizeCheck; + + /// Prepare initialization data for the finality bridge pallet. + async fn prepare_initialization_data( + client: Client, + ) -> Result, BlockNumberOf>>; + + /// Get the context needed for validating a finality proof. + async fn finality_verification_context( + target_client: &Client, + at: HashOf, + ) -> Result; + + /// Returns the finality info associated to the source headers synced with the target + /// at the provided block. + async fn synced_headers_finality_info( + target_client: &Client, + at: TargetChain::Hash, + ) -> Result< + Vec>, + SubstrateError, + >; + + /// Generate key ownership proof for the provided equivocation. + async fn generate_source_key_ownership_proof( + source_client: &Client, + at: C::Hash, + equivocation: &Self::EquivocationProof, + ) -> Result; +} + +/// GRANDPA finality engine. +pub struct Grandpa(PhantomData); + +impl Grandpa { + /// Read header by hash from the source client. + async fn source_header( + source_client: &Client, + header_hash: C::Hash, + ) -> Result, BlockNumberOf>> { + source_client + .header_by_hash(header_hash) + .await + .map_err(|err| Error::RetrieveHeader(C::NAME, header_hash, err)) + } + + /// Read GRANDPA authorities set at given header. + async fn source_authorities_set( + source_client: &Client, + header_hash: C::Hash, + ) -> Result, BlockNumberOf>> { + let raw_authorities_set = source_client + .grandpa_authorities_set(header_hash) + .await + .map_err(|err| Error::RetrieveAuthorities(C::NAME, header_hash, err))?; + GrandpaAuthoritiesSet::decode(&mut &raw_authorities_set[..]) + .map_err(|err| Error::DecodeAuthorities(C::NAME, header_hash, err)) + } +} + +#[async_trait] +impl Engine for Grandpa { + const ID: ConsensusEngineId = GRANDPA_ENGINE_ID; + type ConsensusLogReader = GrandpaConsensusLogReader<::Number>; + type FinalityClient = SubstrateGrandpaFinalityClient; + type FinalityProof = GrandpaJustification>; + type FinalityVerificationContext = JustificationVerificationContext; + type EquivocationProof = sp_consensus_grandpa::EquivocationProof, BlockNumberOf>; + type EquivocationsFinder = GrandpaEquivocationsFinder; + type KeyOwnerProof = C::KeyOwnerProof; + type InitializationData = bp_header_chain::InitializationData; + type OperatingMode = BasicOperatingMode; + + fn is_initialized_key() -> StorageKey { + bp_header_chain::storage_keys::best_finalized_key(C::WITH_CHAIN_GRANDPA_PALLET_NAME) + } + + fn pallet_operating_mode_key() -> StorageKey { + bp_header_chain::storage_keys::pallet_operating_mode_key(C::WITH_CHAIN_GRANDPA_PALLET_NAME) + } + + async fn verify_and_optimize_proof( + target_client: &Client, + header: &C::Header, + proof: &mut Self::FinalityProof, + ) -> Result { + let verification_context = Grandpa::::finality_verification_context( + target_client, + target_client.best_header().await?.hash(), + ) + .await?; + // we're risking with race here - we have decided to submit justification some time ago and + // actual authorities set (which we have read now) may have changed, so this + // `optimize_justification` may fail. But if target chain is configured properly, it'll fail + // anyway, after we submit transaction and failing earlier is better. So - it is fine + verify_and_optimize_justification( + (header.hash(), *header.number()), + &verification_context, + proof, + ) + .map(|_| verification_context) + .map_err(|e| { + SubstrateError::Custom(format!( + "Failed to optimize {} GRANDPA jutification for header {:?}: {:?}", + C::NAME, + header.id(), + e, + )) + }) + } + + fn check_max_expected_call_size( + header: &C::Header, + proof: &Self::FinalityProof, + ) -> MaxExpectedCallSizeCheck { + let is_mandatory = Self::ConsensusLogReader::schedules_authorities_change(header.digest()); + let call_size: u32 = + header.encoded_size().saturating_add(proof.encoded_size()).saturated_into(); + let max_call_size = max_expected_submit_finality_proof_arguments_size::( + is_mandatory, + proof.commit.precommits.len().saturated_into(), + ); + if call_size > max_call_size { + MaxExpectedCallSizeCheck::Exceeds { call_size, max_call_size } + } else { + MaxExpectedCallSizeCheck::Ok + } + } + + /// Prepare initialization data for the GRANDPA verifier pallet. + async fn prepare_initialization_data( + source_client: Client, + ) -> Result, BlockNumberOf>> { + // In ideal world we just need to get best finalized header and then to read GRANDPA + // authorities set (`pallet_grandpa::CurrentSetId` + `GrandpaApi::grandpa_authorities()`) at + // this header. + // + // But now there are problems with this approach - `CurrentSetId` may return invalid value. + // So here we're waiting for the next justification, read the authorities set and then try + // to figure out the set id with bruteforce. + let justifications = Self::source_finality_proofs(&source_client) + .await + .map_err(|err| Error::Subscribe(C::NAME, err))?; + // Read next justification - the header that it finalizes will be used as initial header. + let justification = justifications + .next() + .await + .map_err(|e| Error::ReadJustification(C::NAME, e)) + .and_then(|justification| { + justification.ok_or(Error::ReadJustificationStreamEnded(C::NAME)) + })?; + + // Read initial header. + let justification: GrandpaJustification = + Decode::decode(&mut &justification.0[..]) + .map_err(|err| Error::DecodeJustification(C::NAME, err))?; + + let (initial_header_hash, initial_header_number) = + (justification.commit.target_hash, justification.commit.target_number); + + let initial_header = Self::source_header(&source_client, initial_header_hash).await?; + log::trace!(target: "bridge", "Selected {} initial header: {}/{}", + C::NAME, + initial_header_number, + initial_header_hash, + ); + + // Read GRANDPA authorities set at initial header. + let initial_authorities_set = + Self::source_authorities_set(&source_client, initial_header_hash).await?; + log::trace!(target: "bridge", "Selected {} initial authorities set: {:?}", + C::NAME, + initial_authorities_set, + ); + + // If initial header changes the GRANDPA authorities set, then we need previous authorities + // to verify justification. + let mut authorities_for_verification = initial_authorities_set.clone(); + let scheduled_change = GrandpaConsensusLogReader::>::find_scheduled_change( + initial_header.digest(), + ); + assert!( + scheduled_change.as_ref().map(|c| c.delay.is_zero()).unwrap_or(true), + "GRANDPA authorities change at {} scheduled to happen in {:?} blocks. We expect\ + regular change to have zero delay", + initial_header_hash, + scheduled_change.as_ref().map(|c| c.delay), + ); + let schedules_change = scheduled_change.is_some(); + if schedules_change { + authorities_for_verification = + Self::source_authorities_set(&source_client, *initial_header.parent_hash()).await?; + log::trace!( + target: "bridge", + "Selected {} header is scheduling GRANDPA authorities set changes. Using previous set: {:?}", + C::NAME, + authorities_for_verification, + ); + } + + // Now let's try to guess authorities set id by verifying justification. + let mut initial_authorities_set_id = 0; + let mut min_possible_block_number = C::BlockNumber::zero(); + loop { + log::trace!( + target: "bridge", "Trying {} GRANDPA authorities set id: {}", + C::NAME, + initial_authorities_set_id, + ); + + let is_valid_set_id = verify_and_optimize_justification( + (initial_header_hash, initial_header_number), + &AuthoritySet { + authorities: authorities_for_verification.clone(), + set_id: initial_authorities_set_id, + } + .try_into() + .map_err(|_| { + Error::ReadInvalidAuthorities(C::NAME, authorities_for_verification.clone()) + })?, + &mut justification.clone(), + ) + .is_ok(); + + if is_valid_set_id { + break + } + + initial_authorities_set_id += 1; + min_possible_block_number += One::one(); + if min_possible_block_number > initial_header_number { + // there can't be more authorities set changes than headers => if we have reached + // `initial_block_number` and still have not found correct value of + // `initial_authorities_set_id`, then something else is broken => fail + return Err(Error::GuessInitialAuthorities(C::NAME, initial_header_number)) + } + } + + Ok(bp_header_chain::InitializationData { + header: Box::new(initial_header), + authority_list: initial_authorities_set, + set_id: if schedules_change { + initial_authorities_set_id + 1 + } else { + initial_authorities_set_id + }, + operating_mode: BasicOperatingMode::Normal, + }) + } + + async fn finality_verification_context( + target_client: &Client, + at: HashOf, + ) -> Result { + let current_authority_set_key = bp_header_chain::storage_keys::current_authority_set_key( + C::WITH_CHAIN_GRANDPA_PALLET_NAME, + ); + let authority_set: AuthoritySet = target_client + .storage_value(current_authority_set_key, Some(at)) + .await? + .map(Ok) + .unwrap_or(Err(SubstrateError::Custom(format!( + "{} `CurrentAuthoritySet` is missing from the {} storage", + C::NAME, + TargetChain::NAME, + ))))?; + + authority_set.try_into().map_err(|e| { + SubstrateError::Custom(format!( + "{} `CurrentAuthoritySet` from the {} storage is invalid: {e:?}", + C::NAME, + TargetChain::NAME, + )) + }) + } + + async fn synced_headers_finality_info( + target_client: &Client, + at: TargetChain::Hash, + ) -> Result>>, SubstrateError> { + let stored_headers_grandpa_info: Vec>> = target_client + .typed_state_call(C::SYNCED_HEADERS_GRANDPA_INFO_METHOD.to_string(), (), Some(at)) + .await?; + + let mut headers_grandpa_info = vec![]; + for stored_header_grandpa_info in stored_headers_grandpa_info { + headers_grandpa_info.push(stored_header_grandpa_info.try_into().map_err(|e| { + SubstrateError::Custom(format!( + "{} `AuthoritySet` synced to {} is invalid: {e:?} ", + C::NAME, + TargetChain::NAME, + )) + })?); + } + + Ok(headers_grandpa_info) + } + + async fn generate_source_key_ownership_proof( + source_client: &Client, + at: C::Hash, + equivocation: &Self::EquivocationProof, + ) -> Result { + let set_id = equivocation.set_id(); + let offender = equivocation.offender(); + + let opaque_key_owner_proof = source_client + .generate_grandpa_key_ownership_proof(at, set_id, offender.clone()) + .await? + .ok_or(SubstrateError::Custom(format!( + "Couldn't get GRANDPA key ownership proof from {} at block: {at} \ + for offender: {:?}, set_id: {set_id} ", + C::NAME, + offender.clone(), + )))?; + + let key_owner_proof = + opaque_key_owner_proof.decode().ok_or(SubstrateError::Custom(format!( + "Couldn't decode GRANDPA `OpaqueKeyOwnnershipProof` from {} at block: {at} + to `{:?}` for offender: {:?}, set_id: {set_id}, at block: {at}", + C::NAME, + ::type_info().path, + offender.clone(), + )))?; + + Ok(key_owner_proof) + } +} diff --git a/bridges/relays/lib-substrate-relay/src/finality_base/mod.rs b/bridges/relays/lib-substrate-relay/src/finality_base/mod.rs new file mode 100644 index 0000000000000000000000000000000000000000..825960b1b3ef2cc4f73b7565d6a2c8fe3e30fdd9 --- /dev/null +++ b/bridges/relays/lib-substrate-relay/src/finality_base/mod.rs @@ -0,0 +1,107 @@ +// Copyright 2019-2023 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Types and functions intended to ease adding of new Substrate -> Substrate +//! finality pipelines. + +pub mod engine; + +use crate::finality_base::engine::Engine; + +use async_trait::async_trait; +use bp_runtime::{HashOf, HeaderIdOf}; +use codec::Decode; +use futures::{stream::unfold, Stream, StreamExt}; +use relay_substrate_client::{Chain, Client, Error}; +use std::{fmt::Debug, pin::Pin}; + +/// Substrate -> Substrate finality related pipeline. +#[async_trait] +pub trait SubstrateFinalityPipeline: 'static + Clone + Debug + Send + Sync { + /// Headers of this chain are submitted to the `TargetChain`. + type SourceChain: Chain; + /// Headers of the `SourceChain` are submitted to this chain. + type TargetChain: Chain; + /// Finality engine. + type FinalityEngine: Engine; +} + +/// Substrate finality proof. Specific to the used `FinalityEngine`. +pub type SubstrateFinalityProof

= <

::FinalityEngine as Engine< +

::SourceChain, +>>::FinalityProof; + +/// Substrate finality proofs stream. +pub type SubstrateFinalityProofsStream

= + Pin> + Send>>; + +/// Subscribe to new finality proofs. +pub async fn finality_proofs( + client: &Client, +) -> Result, Error> { + Ok(unfold( + P::FinalityEngine::source_finality_proofs(client).await?, + move |subscription| async move { + loop { + let log_error = |err| { + log::error!( + target: "bridge", + "Failed to read justification target from the {} justifications stream: {:?}", + P::SourceChain::NAME, + err, + ); + }; + + let next_justification = + subscription.next().await.map_err(|err| log_error(err.to_string())).ok()??; + + let decoded_justification = + >::FinalityProof::decode( + &mut &next_justification[..], + ); + + let justification = match decoded_justification { + Ok(j) => j, + Err(err) => { + log_error(format!("decode failed with error {err:?}")); + continue + }, + }; + + return Some((justification, subscription)) + } + }, + ) + .boxed()) +} + +/// Get the id of the best `SourceChain` header known to the `TargetChain` at the provided +/// target block using the exposed runtime API method. +/// +/// The runtime API method should be `FinalityApi::best_finalized()`. +pub async fn best_synced_header_id( + target_client: &Client, + at: HashOf, +) -> Result>, Error> +where + SourceChain: Chain, + TargetChain: Chain, +{ + // now let's read id of best finalized peer header at our best finalized block + target_client + .typed_state_call(SourceChain::BEST_FINALIZED_HEADER_ID_METHOD.into(), (), Some(at)) + .await +} diff --git a/bridges/relays/lib-substrate-relay/src/lib.rs b/bridges/relays/lib-substrate-relay/src/lib.rs new file mode 100644 index 0000000000000000000000000000000000000000..b90453ae0db2d60364a18f70d5be2f278544cd37 --- /dev/null +++ b/bridges/relays/lib-substrate-relay/src/lib.rs @@ -0,0 +1,129 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! The library of substrate relay. contains some public codes to provide to substrate relay. + +#![warn(missing_docs)] + +use relay_substrate_client::{Chain, ChainWithUtilityPallet, UtilityPallet}; + +use std::marker::PhantomData; + +pub mod cli; +pub mod equivocation; +pub mod error; +pub mod finality; +pub mod finality_base; +pub mod messages_lane; +pub mod messages_metrics; +pub mod messages_source; +pub mod messages_target; +pub mod on_demand; +pub mod parachains; + +/// Transaction creation parameters. +#[derive(Clone, Debug)] +pub struct TransactionParams { + /// Transactions author. + pub signer: TS, + /// Transactions mortality. + pub mortality: Option, +} + +/// Tagged relay account, which balance may be exposed as metrics by the relay. +#[derive(Clone, Debug)] +pub enum TaggedAccount { + /// Account, used to sign message (also headers and parachains) relay transactions from given + /// bridged chain. + Messages { + /// Account id. + id: AccountId, + /// Name of the bridged chain, which sends us messages or delivery confirmations. + bridged_chain: String, + }, +} + +impl TaggedAccount { + /// Returns reference to the account id. + pub fn id(&self) -> &AccountId { + match *self { + TaggedAccount::Messages { ref id, .. } => id, + } + } + + /// Returns stringified account tag. + pub fn tag(&self) -> String { + match *self { + TaggedAccount::Messages { ref bridged_chain, .. } => { + format!("{bridged_chain}Messages") + }, + } + } +} + +/// Batch call builder. +pub trait BatchCallBuilder: Clone + Send + Sync { + /// Create batch call from given calls vector. + fn build_batch_call(&self, _calls: Vec) -> Call; +} + +/// Batch call builder constructor. +pub trait BatchCallBuilderConstructor: Clone { + /// Call builder, used by this constructor. + type CallBuilder: BatchCallBuilder; + /// Create a new instance of a batch call builder. + fn new_builder() -> Option; +} + +/// Batch call builder based on `pallet-utility`. +#[derive(Clone)] +pub struct UtilityPalletBatchCallBuilder(PhantomData); + +impl BatchCallBuilder for UtilityPalletBatchCallBuilder +where + C: ChainWithUtilityPallet, +{ + fn build_batch_call(&self, calls: Vec) -> C::Call { + C::UtilityPallet::build_batch_call(calls) + } +} + +impl BatchCallBuilderConstructor for UtilityPalletBatchCallBuilder +where + C: ChainWithUtilityPallet, +{ + type CallBuilder = Self; + + fn new_builder() -> Option { + Some(Self(Default::default())) + } +} + +// A `BatchCallBuilderConstructor` that always returns `None`. +impl BatchCallBuilderConstructor for () { + type CallBuilder = (); + fn new_builder() -> Option { + None + } +} + +// Dummy `BatchCallBuilder` implementation that must never be used outside +// of the `impl BatchCallBuilderConstructor for ()` code. +impl BatchCallBuilder for () { + fn build_batch_call(&self, _calls: Vec) -> Call { + unreachable!("never called, because ()::new_builder() returns None; qed") + } +} diff --git a/bridges/relays/lib-substrate-relay/src/messages_lane.rs b/bridges/relays/lib-substrate-relay/src/messages_lane.rs new file mode 100644 index 0000000000000000000000000000000000000000..abeab8c1402d677923e480f65e869c4496feaf8b --- /dev/null +++ b/bridges/relays/lib-substrate-relay/src/messages_lane.rs @@ -0,0 +1,587 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Tools for supporting message lanes between two Substrate-based chains. + +use crate::{ + messages_source::{SubstrateMessagesProof, SubstrateMessagesSource}, + messages_target::{SubstrateMessagesDeliveryProof, SubstrateMessagesTarget}, + on_demand::OnDemandRelay, + BatchCallBuilder, BatchCallBuilderConstructor, TransactionParams, +}; + +use async_std::sync::Arc; +use bp_messages::{ChainWithMessages as _, LaneId, MessageNonce}; +use bp_runtime::{ + AccountIdOf, Chain as _, EncodedOrDecodedCall, HeaderIdOf, TransactionEra, WeightExtraOps, +}; +use bridge_runtime_common::messages::{ + source::FromBridgedChainMessagesDeliveryProof, target::FromBridgedChainMessagesProof, +}; +use codec::Encode; +use frame_support::{dispatch::GetDispatchInfo, weights::Weight}; +use messages_relay::{message_lane::MessageLane, message_lane_loop::BatchTransaction}; +use pallet_bridge_messages::{Call as BridgeMessagesCall, Config as BridgeMessagesConfig}; +use relay_substrate_client::{ + transaction_stall_timeout, AccountKeyPairOf, BalanceOf, BlockNumberOf, CallOf, Chain, + ChainWithMessages, ChainWithTransactions, Client, Error as SubstrateError, HashOf, SignParam, + UnsignedTransaction, +}; +use relay_utils::{ + metrics::{GlobalMetrics, MetricsParams, StandaloneMetric}, + STALL_TIMEOUT, +}; +use sp_core::Pair; +use sp_runtime::traits::Zero; +use std::{convert::TryFrom, fmt::Debug, marker::PhantomData}; + +/// Substrate -> Substrate messages synchronization pipeline. +pub trait SubstrateMessageLane: 'static + Clone + Debug + Send + Sync { + /// Messages of this chain are relayed to the `TargetChain`. + type SourceChain: ChainWithMessages + ChainWithTransactions; + /// Messages from the `SourceChain` are dispatched on this chain. + type TargetChain: ChainWithMessages + ChainWithTransactions; + + /// How receive messages proof call is built? + type ReceiveMessagesProofCallBuilder: ReceiveMessagesProofCallBuilder; + /// How receive messages delivery proof call is built? + type ReceiveMessagesDeliveryProofCallBuilder: ReceiveMessagesDeliveryProofCallBuilder; + + /// How batch calls are built at the source chain? + type SourceBatchCallBuilder: BatchCallBuilderConstructor>; + /// How batch calls are built at the target chain? + type TargetBatchCallBuilder: BatchCallBuilderConstructor>; +} + +/// Adapter that allows all `SubstrateMessageLane` to act as `MessageLane`. +#[derive(Clone, Debug)] +pub struct MessageLaneAdapter { + _phantom: PhantomData

, +} + +impl MessageLane for MessageLaneAdapter

{ + const SOURCE_NAME: &'static str = P::SourceChain::NAME; + const TARGET_NAME: &'static str = P::TargetChain::NAME; + + type MessagesProof = SubstrateMessagesProof; + type MessagesReceivingProof = SubstrateMessagesDeliveryProof; + + type SourceChainBalance = BalanceOf; + type SourceHeaderNumber = BlockNumberOf; + type SourceHeaderHash = HashOf; + + type TargetHeaderNumber = BlockNumberOf; + type TargetHeaderHash = HashOf; +} + +/// Substrate <-> Substrate messages relay parameters. +pub struct MessagesRelayParams { + /// Messages source client. + pub source_client: Client, + /// Source transaction params. + pub source_transaction_params: TransactionParams>, + /// Messages target client. + pub target_client: Client, + /// Target transaction params. + pub target_transaction_params: TransactionParams>, + /// Optional on-demand source to target headers relay. + pub source_to_target_headers_relay: + Option>>, + /// Optional on-demand target to source headers relay. + pub target_to_source_headers_relay: + Option>>, + /// Identifier of lane that needs to be served. + pub lane_id: LaneId, + /// Messages relay limits. If not provided, the relay tries to determine it automatically, + /// using `TransactionPayment` pallet runtime API. + pub limits: Option, + /// Metrics parameters. + pub metrics_params: MetricsParams, +} + +/// Delivery transaction limits. +pub struct MessagesRelayLimits { + /// Maximal number of messages in the delivery transaction. + pub max_messages_in_single_batch: MessageNonce, + /// Maximal cumulative weight of messages in the delivery transaction. + pub max_messages_weight_in_single_batch: Weight, +} + +/// Batch transaction that brings headers + and messages delivery/receiving confirmations to the +/// source node. +#[derive(Clone)] +pub struct BatchProofTransaction>> { + builder: B::CallBuilder, + proved_header: HeaderIdOf, + prove_calls: Vec>, + + /// Using `fn() -> B` in order to avoid implementing `Send` for `B`. + _phantom: PhantomData B>, +} + +impl>> std::fmt::Debug + for BatchProofTransaction +{ + fn fmt(&self, fmt: &mut std::fmt::Formatter) -> std::fmt::Result { + fmt.debug_struct("BatchProofTransaction") + .field("proved_header", &self.proved_header) + .finish() + } +} + +impl>> + BatchProofTransaction +{ + /// Creates a new instance of `BatchProofTransaction`. + pub async fn new( + relay: Arc>, + block_num: BlockNumberOf, + ) -> Result, SubstrateError> { + if let Some(builder) = B::new_builder() { + let (proved_header, prove_calls) = relay.prove_header(block_num).await?; + return Ok(Some(Self { + builder, + proved_header, + prove_calls, + _phantom: Default::default(), + })) + } + + Ok(None) + } + + /// Return a batch call that includes the provided call. + pub fn append_call_and_build(mut self, call: CallOf) -> CallOf { + self.prove_calls.push(call); + self.builder.build_batch_call(self.prove_calls) + } +} + +impl>> + BatchTransaction> for BatchProofTransaction +{ + fn required_header_id(&self) -> HeaderIdOf { + self.proved_header + } +} + +/// Run Substrate-to-Substrate messages sync loop. +pub async fn run(params: MessagesRelayParams

) -> anyhow::Result<()> +where + AccountIdOf: From< as Pair>::Public>, + AccountIdOf: From< as Pair>::Public>, + BalanceOf: TryFrom>, +{ + // 2/3 is reserved for proofs and tx overhead + let max_messages_size_in_single_batch = P::TargetChain::max_extrinsic_size() / 3; + let limits = match params.limits { + Some(limits) => limits, + None => + select_delivery_transaction_limits_rpc::

( + ¶ms, + P::TargetChain::max_extrinsic_weight(), + P::SourceChain::MAX_UNREWARDED_RELAYERS_IN_CONFIRMATION_TX, + ) + .await?, + }; + let (max_messages_in_single_batch, max_messages_weight_in_single_batch) = + (limits.max_messages_in_single_batch / 2, limits.max_messages_weight_in_single_batch / 2); + + let source_client = params.source_client; + let target_client = params.target_client; + let relayer_id_at_source: AccountIdOf = + params.source_transaction_params.signer.public().into(); + + log::info!( + target: "bridge", + "Starting {} -> {} messages relay.\n\t\ + {} relayer account id: {:?}\n\t\ + Max messages in single transaction: {}\n\t\ + Max messages size in single transaction: {}\n\t\ + Max messages weight in single transaction: {}\n\t\ + Tx mortality: {:?} (~{}m)/{:?} (~{}m)", + P::SourceChain::NAME, + P::TargetChain::NAME, + P::SourceChain::NAME, + relayer_id_at_source, + max_messages_in_single_batch, + max_messages_size_in_single_batch, + max_messages_weight_in_single_batch, + params.source_transaction_params.mortality, + transaction_stall_timeout( + params.source_transaction_params.mortality, + P::SourceChain::AVERAGE_BLOCK_INTERVAL, + STALL_TIMEOUT, + ).as_secs_f64() / 60.0f64, + params.target_transaction_params.mortality, + transaction_stall_timeout( + params.target_transaction_params.mortality, + P::TargetChain::AVERAGE_BLOCK_INTERVAL, + STALL_TIMEOUT, + ).as_secs_f64() / 60.0f64, + ); + + messages_relay::message_lane_loop::run( + messages_relay::message_lane_loop::Params { + lane: params.lane_id, + source_tick: P::SourceChain::AVERAGE_BLOCK_INTERVAL, + target_tick: P::TargetChain::AVERAGE_BLOCK_INTERVAL, + reconnect_delay: relay_utils::relay_loop::RECONNECT_DELAY, + delivery_params: messages_relay::message_lane_loop::MessageDeliveryParams { + max_unrewarded_relayer_entries_at_target: + P::SourceChain::MAX_UNREWARDED_RELAYERS_IN_CONFIRMATION_TX, + max_unconfirmed_nonces_at_target: + P::SourceChain::MAX_UNCONFIRMED_MESSAGES_IN_CONFIRMATION_TX, + max_messages_in_single_batch, + max_messages_weight_in_single_batch, + max_messages_size_in_single_batch, + }, + }, + SubstrateMessagesSource::

::new( + source_client.clone(), + target_client.clone(), + params.lane_id, + params.source_transaction_params, + params.target_to_source_headers_relay, + ), + SubstrateMessagesTarget::

::new( + target_client, + source_client, + params.lane_id, + relayer_id_at_source, + params.target_transaction_params, + params.source_to_target_headers_relay, + ), + { + GlobalMetrics::new()?.register_and_spawn(¶ms.metrics_params.registry)?; + params.metrics_params + }, + futures::future::pending(), + ) + .await + .map_err(Into::into) +} + +/// Different ways of building `receive_messages_proof` calls. +pub trait ReceiveMessagesProofCallBuilder { + /// Given messages proof, build call of `receive_messages_proof` function of bridge + /// messages module at the target chain. + fn build_receive_messages_proof_call( + relayer_id_at_source: AccountIdOf, + proof: SubstrateMessagesProof, + messages_count: u32, + dispatch_weight: Weight, + trace_call: bool, + ) -> CallOf; +} + +/// Building `receive_messages_proof` call when you have direct access to the target +/// chain runtime. +pub struct DirectReceiveMessagesProofCallBuilder { + _phantom: PhantomData<(P, R, I)>, +} + +impl ReceiveMessagesProofCallBuilder

for DirectReceiveMessagesProofCallBuilder +where + P: SubstrateMessageLane, + R: BridgeMessagesConfig>, + I: 'static, + R::SourceHeaderChain: bp_messages::target_chain::SourceHeaderChain< + MessagesProof = FromBridgedChainMessagesProof>, + >, + CallOf: From> + GetDispatchInfo, +{ + fn build_receive_messages_proof_call( + relayer_id_at_source: AccountIdOf, + proof: SubstrateMessagesProof, + messages_count: u32, + dispatch_weight: Weight, + trace_call: bool, + ) -> CallOf { + let call: CallOf = BridgeMessagesCall::::receive_messages_proof { + relayer_id_at_bridged_chain: relayer_id_at_source, + proof: proof.1, + messages_count, + dispatch_weight, + } + .into(); + if trace_call { + // this trace isn't super-accurate, because limits are for transactions and we + // have a call here, but it provides required information + log::trace!( + target: "bridge", + "Prepared {} -> {} messages delivery call. Weight: {}/{}, size: {}/{}", + P::SourceChain::NAME, + P::TargetChain::NAME, + call.get_dispatch_info().weight, + P::TargetChain::max_extrinsic_weight(), + call.encode().len(), + P::TargetChain::max_extrinsic_size(), + ); + } + call + } +} + +/// Macro that generates `ReceiveMessagesProofCallBuilder` implementation for the case when +/// you only have an access to the mocked version of target chain runtime. In this case you +/// should provide "name" of the call variant for the bridge messages calls and the "name" of +/// the variant for the `receive_messages_proof` call within that first option. +#[rustfmt::skip] +#[macro_export] +macro_rules! generate_receive_message_proof_call_builder { + ($pipeline:ident, $mocked_builder:ident, $bridge_messages:path, $receive_messages_proof:path) => { + pub struct $mocked_builder; + + impl $crate::messages_lane::ReceiveMessagesProofCallBuilder<$pipeline> + for $mocked_builder + { + fn build_receive_messages_proof_call( + relayer_id_at_source: relay_substrate_client::AccountIdOf< + <$pipeline as $crate::messages_lane::SubstrateMessageLane>::SourceChain + >, + proof: $crate::messages_source::SubstrateMessagesProof< + <$pipeline as $crate::messages_lane::SubstrateMessageLane>::SourceChain + >, + messages_count: u32, + dispatch_weight: bp_messages::Weight, + _trace_call: bool, + ) -> relay_substrate_client::CallOf< + <$pipeline as $crate::messages_lane::SubstrateMessageLane>::TargetChain + > { + bp_runtime::paste::item! { + $bridge_messages($receive_messages_proof { + relayer_id_at_bridged_chain: relayer_id_at_source, + proof: proof.1, + messages_count: messages_count, + dispatch_weight: dispatch_weight, + }) + } + } + } + }; +} + +/// Different ways of building `receive_messages_delivery_proof` calls. +pub trait ReceiveMessagesDeliveryProofCallBuilder { + /// Given messages delivery proof, build call of `receive_messages_delivery_proof` function of + /// bridge messages module at the source chain. + fn build_receive_messages_delivery_proof_call( + proof: SubstrateMessagesDeliveryProof, + trace_call: bool, + ) -> CallOf; +} + +/// Building `receive_messages_delivery_proof` call when you have direct access to the source +/// chain runtime. +pub struct DirectReceiveMessagesDeliveryProofCallBuilder { + _phantom: PhantomData<(P, R, I)>, +} + +impl ReceiveMessagesDeliveryProofCallBuilder

+ for DirectReceiveMessagesDeliveryProofCallBuilder +where + P: SubstrateMessageLane, + R: BridgeMessagesConfig, + I: 'static, + R::TargetHeaderChain: bp_messages::source_chain::TargetHeaderChain< + R::OutboundPayload, + R::AccountId, + MessagesDeliveryProof = FromBridgedChainMessagesDeliveryProof>, + >, + CallOf: From> + GetDispatchInfo, +{ + fn build_receive_messages_delivery_proof_call( + proof: SubstrateMessagesDeliveryProof, + trace_call: bool, + ) -> CallOf { + let call: CallOf = + BridgeMessagesCall::::receive_messages_delivery_proof { + proof: proof.1, + relayers_state: proof.0, + } + .into(); + if trace_call { + // this trace isn't super-accurate, because limits are for transactions and we + // have a call here, but it provides required information + log::trace!( + target: "bridge", + "Prepared {} -> {} delivery confirmation transaction. Weight: {}/{}, size: {}/{}", + P::TargetChain::NAME, + P::SourceChain::NAME, + call.get_dispatch_info().weight, + P::SourceChain::max_extrinsic_weight(), + call.encode().len(), + P::SourceChain::max_extrinsic_size(), + ); + } + call + } +} + +/// Macro that generates `ReceiveMessagesDeliveryProofCallBuilder` implementation for the case when +/// you only have an access to the mocked version of source chain runtime. In this case you +/// should provide "name" of the call variant for the bridge messages calls and the "name" of +/// the variant for the `receive_messages_delivery_proof` call within that first option. +#[rustfmt::skip] +#[macro_export] +macro_rules! generate_receive_message_delivery_proof_call_builder { + ($pipeline:ident, $mocked_builder:ident, $bridge_messages:path, $receive_messages_delivery_proof:path) => { + pub struct $mocked_builder; + + impl $crate::messages_lane::ReceiveMessagesDeliveryProofCallBuilder<$pipeline> + for $mocked_builder + { + fn build_receive_messages_delivery_proof_call( + proof: $crate::messages_target::SubstrateMessagesDeliveryProof< + <$pipeline as $crate::messages_lane::SubstrateMessageLane>::TargetChain + >, + _trace_call: bool, + ) -> relay_substrate_client::CallOf< + <$pipeline as $crate::messages_lane::SubstrateMessageLane>::SourceChain + > { + bp_runtime::paste::item! { + $bridge_messages($receive_messages_delivery_proof { + proof: proof.1, + relayers_state: proof.0 + }) + } + } + } + }; +} + +/// Returns maximal number of messages and their maximal cumulative dispatch weight. +async fn select_delivery_transaction_limits_rpc( + params: &MessagesRelayParams

, + max_extrinsic_weight: Weight, + max_unconfirmed_messages_at_inbound_lane: MessageNonce, +) -> anyhow::Result +where + AccountIdOf: From< as Pair>::Public>, +{ + // We may try to guess accurate value, based on maximal number of messages and per-message + // weight overhead, but the relay loop isn't using this info in a super-accurate way anyway. + // So just a rough guess: let's say 1/3 of max tx weight is for tx itself and the rest is + // for messages dispatch. + + // Another thing to keep in mind is that our runtimes (when this code was written) accept + // messages with dispatch weight <= max_extrinsic_weight/2. So we can't reserve less than + // that for dispatch. + + let weight_for_delivery_tx = max_extrinsic_weight / 3; + let weight_for_messages_dispatch = max_extrinsic_weight - weight_for_delivery_tx; + + // weight of empty message delivery with outbound lane state + let delivery_tx_with_zero_messages = dummy_messages_delivery_transaction::

(params, 0)?; + let delivery_tx_with_zero_messages_weight = params + .target_client + .extimate_extrinsic_weight(delivery_tx_with_zero_messages) + .await + .map_err(|e| { + anyhow::format_err!("Failed to estimate delivery extrinsic weight: {:?}", e) + })?; + + // weight of single message delivery with outbound lane state + let delivery_tx_with_one_message = dummy_messages_delivery_transaction::

(params, 1)?; + let delivery_tx_with_one_message_weight = params + .target_client + .extimate_extrinsic_weight(delivery_tx_with_one_message) + .await + .map_err(|e| { + anyhow::format_err!("Failed to estimate delivery extrinsic weight: {:?}", e) + })?; + + // message overhead is roughly `delivery_tx_with_one_message_weight - + // delivery_tx_with_zero_messages_weight` + let delivery_tx_weight_rest = weight_for_delivery_tx - delivery_tx_with_zero_messages_weight; + let delivery_tx_message_overhead = + delivery_tx_with_one_message_weight.saturating_sub(delivery_tx_with_zero_messages_weight); + + let max_number_of_messages = std::cmp::min( + delivery_tx_weight_rest + .min_components_checked_div(delivery_tx_message_overhead) + .unwrap_or(u64::MAX), + max_unconfirmed_messages_at_inbound_lane, + ); + + assert!( + max_number_of_messages > 0, + "Relay should fit at least one message in every delivery transaction", + ); + assert!( + weight_for_messages_dispatch.ref_time() >= max_extrinsic_weight.ref_time() / 2, + "Relay shall be able to deliver messages with dispatch weight = max_extrinsic_weight / 2", + ); + + Ok(MessagesRelayLimits { + max_messages_in_single_batch: max_number_of_messages, + max_messages_weight_in_single_batch: weight_for_messages_dispatch, + }) +} + +/// Returns dummy message delivery transaction with zero messages and `1kb` proof. +fn dummy_messages_delivery_transaction( + params: &MessagesRelayParams

, + messages: u32, +) -> anyhow::Result<::SignedTransaction> +where + AccountIdOf: From< as Pair>::Public>, +{ + // we don't care about any call values here, because all that the estimation RPC does + // is calls `GetDispatchInfo::get_dispatch_info` for the wrapped call. So we only are + // interested in values that affect call weight - e.g. number of messages and the + // storage proof size + + let dummy_messages_delivery_call = + P::ReceiveMessagesProofCallBuilder::build_receive_messages_proof_call( + params.source_transaction_params.signer.public().into(), + ( + Weight::zero(), + FromBridgedChainMessagesProof { + bridged_header_hash: Default::default(), + // we may use per-chain `EXTRA_STORAGE_PROOF_SIZE`, but since we don't need + // exact values, this global estimation is fine + storage_proof: vec![vec![ + 42u8; + pallet_bridge_messages::EXTRA_STORAGE_PROOF_SIZE + as usize + ]], + lane: Default::default(), + nonces_start: 1, + nonces_end: messages as u64, + }, + ), + messages, + Weight::zero(), + false, + ); + P::TargetChain::sign_transaction( + SignParam { + spec_version: 0, + transaction_version: 0, + genesis_hash: Default::default(), + signer: params.target_transaction_params.signer.clone(), + }, + UnsignedTransaction { + call: EncodedOrDecodedCall::Decoded(dummy_messages_delivery_call), + nonce: Zero::zero(), + tip: Zero::zero(), + era: TransactionEra::Immortal, + }, + ) + .map_err(Into::into) +} diff --git a/bridges/relays/lib-substrate-relay/src/messages_metrics.rs b/bridges/relays/lib-substrate-relay/src/messages_metrics.rs new file mode 100644 index 0000000000000000000000000000000000000000..27bf6186c3ba0d0db6552128574c8759d45d220c --- /dev/null +++ b/bridges/relays/lib-substrate-relay/src/messages_metrics.rs @@ -0,0 +1,190 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Tools for supporting message lanes between two Substrate-based chains. + +use crate::TaggedAccount; + +use bp_messages::LaneId; +use bp_relayers::{RewardsAccountOwner, RewardsAccountParams}; +use bp_runtime::StorageDoubleMapKeyProvider; +use codec::Decode; +use frame_system::AccountInfo; +use pallet_balances::AccountData; +use relay_substrate_client::{ + metrics::{FloatStorageValue, FloatStorageValueMetric}, + AccountIdOf, BalanceOf, Chain, ChainWithBalances, ChainWithMessages, Client, + Error as SubstrateError, NonceOf, +}; +use relay_utils::metrics::{MetricsParams, StandaloneMetric}; +use sp_core::storage::StorageData; +use sp_runtime::{FixedPointNumber, FixedU128}; +use std::{convert::TryFrom, fmt::Debug, marker::PhantomData}; + +/// Add relay accounts balance metrics. +pub async fn add_relay_balances_metrics( + client: Client, + metrics: &MetricsParams, + relay_accounts: &Vec>>, + lanes: &[LaneId], +) -> anyhow::Result<()> +where + BalanceOf: Into + std::fmt::Debug, +{ + if relay_accounts.is_empty() { + return Ok(()) + } + + // if `tokenDecimals` is missing from system properties, we'll be using + let token_decimals = client + .token_decimals() + .await? + .map(|token_decimals| { + log::info!(target: "bridge", "Read `tokenDecimals` for {}: {}", C::NAME, token_decimals); + token_decimals + }) + .unwrap_or_else(|| { + // turns out it is normal not to have this property - e.g. when polkadot binary is + // started using `polkadot-local` chain. Let's use minimal nominal here + log::info!(target: "bridge", "Using default (zero) `tokenDecimals` value for {}", C::NAME); + 0 + }); + let token_decimals = u32::try_from(token_decimals).map_err(|e| { + anyhow::format_err!( + "Token decimals value ({}) of {} doesn't fit into u32: {:?}", + token_decimals, + C::NAME, + e, + ) + })?; + + for account in relay_accounts { + let relay_account_balance_metric = FloatStorageValueMetric::new( + AccountBalanceFromAccountInfo:: { token_decimals, _phantom: Default::default() }, + client.clone(), + C::account_info_storage_key(account.id()), + format!("at_{}_relay_{}_balance", C::NAME, account.tag()), + format!("Balance of the {} relay account at the {}", account.tag(), C::NAME), + )?; + relay_account_balance_metric.register_and_spawn(&metrics.registry)?; + + if let Some(relayers_pallet_name) = BC::WITH_CHAIN_RELAYERS_PALLET_NAME { + for lane in lanes { + FloatStorageValueMetric::new( + AccountBalance:: { token_decimals, _phantom: Default::default() }, + client.clone(), + bp_relayers::RelayerRewardsKeyProvider::, BalanceOf>::final_key( + relayers_pallet_name, + account.id(), + &RewardsAccountParams::new(*lane, BC::ID, RewardsAccountOwner::ThisChain), + ), + format!("at_{}_relay_{}_reward_for_msgs_from_{}_on_lane_{}", C::NAME, account.tag(), BC::NAME, hex::encode(lane.as_ref())), + format!("Reward of the {} relay account at {} for delivering messages from {} on lane {:?}", account.tag(), C::NAME, BC::NAME, lane), + )?.register_and_spawn(&metrics.registry)?; + + FloatStorageValueMetric::new( + AccountBalance:: { token_decimals, _phantom: Default::default() }, + client.clone(), + bp_relayers::RelayerRewardsKeyProvider::, BalanceOf>::final_key( + relayers_pallet_name, + account.id(), + &RewardsAccountParams::new(*lane, BC::ID, RewardsAccountOwner::BridgedChain), + ), + format!("at_{}_relay_{}_reward_for_msgs_to_{}_on_lane_{}", C::NAME, account.tag(), BC::NAME, hex::encode(lane.as_ref())), + format!("Reward of the {} relay account at {} for delivering messages confirmations from {} on lane {:?}", account.tag(), C::NAME, BC::NAME, lane), + )?.register_and_spawn(&metrics.registry)?; + } + } + } + + Ok(()) +} + +/// Adapter for `FloatStorageValueMetric` to decode account free balance. +#[derive(Clone, Debug)] +struct AccountBalanceFromAccountInfo { + token_decimals: u32, + _phantom: PhantomData, +} + +impl FloatStorageValue for AccountBalanceFromAccountInfo +where + C: Chain, + BalanceOf: Into, +{ + type Value = FixedU128; + + fn decode( + &self, + maybe_raw_value: Option, + ) -> Result, SubstrateError> { + maybe_raw_value + .map(|raw_value| { + AccountInfo::, AccountData>>::decode(&mut &raw_value.0[..]) + .map_err(SubstrateError::ResponseParseFailed) + .map(|account_data| { + convert_to_token_balance(account_data.data.free.into(), self.token_decimals) + }) + }) + .transpose() + } +} + +/// Adapter for `FloatStorageValueMetric` to decode account free balance. +#[derive(Clone, Debug)] +struct AccountBalance { + token_decimals: u32, + _phantom: PhantomData, +} + +impl FloatStorageValue for AccountBalance +where + C: Chain, + BalanceOf: Into, +{ + type Value = FixedU128; + + fn decode( + &self, + maybe_raw_value: Option, + ) -> Result, SubstrateError> { + maybe_raw_value + .map(|raw_value| { + BalanceOf::::decode(&mut &raw_value.0[..]) + .map_err(SubstrateError::ResponseParseFailed) + .map(|balance| convert_to_token_balance(balance.into(), self.token_decimals)) + }) + .transpose() + } +} + +/// Convert from raw `u128` balance (nominated in smallest chain token units) to the float regular +/// tokens value. +fn convert_to_token_balance(balance: u128, token_decimals: u32) -> FixedU128 { + FixedU128::from_inner(balance.saturating_mul(FixedU128::DIV / 10u128.pow(token_decimals))) +} + +#[cfg(test)] +mod tests { + use super::*; + #[test] + fn token_decimals_used_properly() { + let plancks = 425_000_000_000; + let token_decimals = 10; + let dots = convert_to_token_balance(plancks, token_decimals); + assert_eq!(dots, FixedU128::saturating_from_rational(425, 10)); + } +} diff --git a/bridges/relays/lib-substrate-relay/src/messages_source.rs b/bridges/relays/lib-substrate-relay/src/messages_source.rs new file mode 100644 index 0000000000000000000000000000000000000000..49deff046f9ca0914846d19b18653f85b8cd8554 --- /dev/null +++ b/bridges/relays/lib-substrate-relay/src/messages_source.rs @@ -0,0 +1,713 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Substrate client as Substrate messages source. The chain we connect to should have +//! runtime that implements `HeaderApi` to allow bridging with +//! `` chain. + +use crate::{ + finality_base::best_synced_header_id, + messages_lane::{ + BatchProofTransaction, MessageLaneAdapter, ReceiveMessagesDeliveryProofCallBuilder, + SubstrateMessageLane, + }, + on_demand::OnDemandRelay, + TransactionParams, +}; + +use async_std::sync::Arc; +use async_trait::async_trait; +use bp_messages::{ + storage_keys::{operating_mode_key, outbound_lane_data_key}, + ChainWithMessages as _, InboundMessageDetails, LaneId, MessageNonce, MessagePayload, + MessagesOperatingMode, OutboundLaneData, OutboundMessageDetails, +}; +use bp_runtime::{BasicOperatingMode, HeaderIdProvider}; +use bridge_runtime_common::messages::target::FromBridgedChainMessagesProof; +use codec::Encode; +use frame_support::weights::Weight; +use messages_relay::{ + message_lane::{MessageLane, SourceHeaderIdOf, TargetHeaderIdOf}, + message_lane_loop::{ + ClientState, MessageDetails, MessageDetailsMap, MessageProofParameters, SourceClient, + SourceClientState, + }, +}; +use num_traits::Zero; +use relay_substrate_client::{ + AccountIdOf, AccountKeyPairOf, BalanceOf, Chain, ChainWithMessages, Client, + Error as SubstrateError, HashOf, HeaderIdOf, TransactionEra, TransactionTracker, + UnsignedTransaction, +}; +use relay_utils::relay_loop::Client as RelayClient; +use sp_core::Pair; +use std::ops::RangeInclusive; + +/// Intermediate message proof returned by the source Substrate node. Includes everything +/// required to submit to the target node: cumulative dispatch weight of bundled messages and +/// the proof itself. +pub type SubstrateMessagesProof = (Weight, FromBridgedChainMessagesProof>); +type MessagesToRefine<'a> = Vec<(MessagePayload, &'a mut OutboundMessageDetails)>; + +/// Substrate client as Substrate messages source. +pub struct SubstrateMessagesSource { + source_client: Client, + target_client: Client, + lane_id: LaneId, + transaction_params: TransactionParams>, + target_to_source_headers_relay: Option>>, +} + +impl SubstrateMessagesSource

{ + /// Create new Substrate headers source. + pub fn new( + source_client: Client, + target_client: Client, + lane_id: LaneId, + transaction_params: TransactionParams>, + target_to_source_headers_relay: Option< + Arc>, + >, + ) -> Self { + SubstrateMessagesSource { + source_client, + target_client, + lane_id, + transaction_params, + target_to_source_headers_relay, + } + } + + /// Read outbound lane state from the on-chain storage at given block. + async fn outbound_lane_data( + &self, + id: SourceHeaderIdOf>, + ) -> Result, SubstrateError> { + self.source_client + .storage_value( + outbound_lane_data_key( + P::TargetChain::WITH_CHAIN_MESSAGES_PALLET_NAME, + &self.lane_id, + ), + Some(id.1), + ) + .await + } + + /// Ensure that the messages pallet at source chain is active. + async fn ensure_pallet_active(&self) -> Result<(), SubstrateError> { + ensure_messages_pallet_active::(&self.source_client).await + } +} + +impl Clone for SubstrateMessagesSource

{ + fn clone(&self) -> Self { + Self { + source_client: self.source_client.clone(), + target_client: self.target_client.clone(), + lane_id: self.lane_id, + transaction_params: self.transaction_params.clone(), + target_to_source_headers_relay: self.target_to_source_headers_relay.clone(), + } + } +} + +#[async_trait] +impl RelayClient for SubstrateMessagesSource

{ + type Error = SubstrateError; + + async fn reconnect(&mut self) -> Result<(), SubstrateError> { + // since the client calls RPC methods on both sides, we need to reconnect both + self.source_client.reconnect().await?; + self.target_client.reconnect().await?; + + // call reconnect on on-demand headers relay, because we may use different chains there + // and the error that has lead to reconnect may have came from those other chains + // (see `require_target_header_on_source`) + // + // this may lead to multiple reconnects to the same node during the same call and it + // needs to be addressed in the future + // TODO: https://github.com/paritytech/parity-bridges-common/issues/1928 + if let Some(ref mut target_to_source_headers_relay) = self.target_to_source_headers_relay { + target_to_source_headers_relay.reconnect().await?; + } + + Ok(()) + } +} + +#[async_trait] +impl SourceClient> for SubstrateMessagesSource

+where + AccountIdOf: From< as Pair>::Public>, +{ + type BatchTransaction = + BatchProofTransaction; + type TransactionTracker = TransactionTracker>; + + async fn state(&self) -> Result>, SubstrateError> { + // we can't continue to deliver confirmations if source node is out of sync, because + // it may have already received confirmations that we're going to deliver + // + // we can't continue to deliver messages if target node is out of sync, because + // it may have already received (some of) messages that we're going to deliver + self.source_client.ensure_synced().await?; + self.target_client.ensure_synced().await?; + // we can't relay confirmations if messages pallet at source chain is halted + self.ensure_pallet_active().await?; + + read_client_state(&self.source_client, Some(&self.target_client)).await + } + + async fn latest_generated_nonce( + &self, + id: SourceHeaderIdOf>, + ) -> Result<(SourceHeaderIdOf>, MessageNonce), SubstrateError> { + // lane data missing from the storage is fine until first message is sent + let latest_generated_nonce = self + .outbound_lane_data(id) + .await? + .map(|data| data.latest_generated_nonce) + .unwrap_or(0); + Ok((id, latest_generated_nonce)) + } + + async fn latest_confirmed_received_nonce( + &self, + id: SourceHeaderIdOf>, + ) -> Result<(SourceHeaderIdOf>, MessageNonce), SubstrateError> { + // lane data missing from the storage is fine until first message is sent + let latest_received_nonce = self + .outbound_lane_data(id) + .await? + .map(|data| data.latest_received_nonce) + .unwrap_or(0); + Ok((id, latest_received_nonce)) + } + + async fn generated_message_details( + &self, + id: SourceHeaderIdOf>, + nonces: RangeInclusive, + ) -> Result>, SubstrateError> { + let mut out_msgs_details = self + .source_client + .typed_state_call::<_, Vec<_>>( + P::TargetChain::TO_CHAIN_MESSAGE_DETAILS_METHOD.into(), + (self.lane_id, *nonces.start(), *nonces.end()), + Some(id.1), + ) + .await?; + validate_out_msgs_details::(&out_msgs_details, nonces)?; + + // prepare arguments of the inbound message details call (if we need it) + let mut msgs_to_refine = vec![]; + for out_msg_details in out_msgs_details.iter_mut() { + // in our current strategy all messages are supposed to be paid at the target chain + + // for pay-at-target messages we may want to ask target chain for + // refined dispatch weight + let msg_key = bp_messages::storage_keys::message_key( + P::TargetChain::WITH_CHAIN_MESSAGES_PALLET_NAME, + &self.lane_id, + out_msg_details.nonce, + ); + let msg_payload: MessagePayload = + self.source_client.storage_value(msg_key, Some(id.1)).await?.ok_or_else(|| { + SubstrateError::Custom(format!( + "Message to {} {:?}/{} is missing from runtime the storage of {} at {:?}", + P::TargetChain::NAME, + self.lane_id, + out_msg_details.nonce, + P::SourceChain::NAME, + id, + )) + })?; + + msgs_to_refine.push((msg_payload, out_msg_details)); + } + + for mut msgs_to_refine_batch in + split_msgs_to_refine::(self.lane_id, msgs_to_refine)? + { + let in_msgs_details = self + .target_client + .typed_state_call::<_, Vec>( + P::SourceChain::FROM_CHAIN_MESSAGE_DETAILS_METHOD.into(), + (self.lane_id, &msgs_to_refine_batch), + None, + ) + .await?; + if in_msgs_details.len() != msgs_to_refine_batch.len() { + return Err(SubstrateError::Custom(format!( + "Call of {} at {} has returned {} entries instead of expected {}", + P::SourceChain::FROM_CHAIN_MESSAGE_DETAILS_METHOD, + P::TargetChain::NAME, + in_msgs_details.len(), + msgs_to_refine_batch.len(), + ))) + } + for ((_, out_msg_details), in_msg_details) in + msgs_to_refine_batch.iter_mut().zip(in_msgs_details) + { + log::trace!( + target: "bridge", + "Refined weight of {}->{} message {:?}/{}: at-source: {}, at-target: {}", + P::SourceChain::NAME, + P::TargetChain::NAME, + self.lane_id, + out_msg_details.nonce, + out_msg_details.dispatch_weight, + in_msg_details.dispatch_weight, + ); + out_msg_details.dispatch_weight = in_msg_details.dispatch_weight; + } + } + + let mut msgs_details_map = MessageDetailsMap::new(); + for out_msg_details in out_msgs_details { + msgs_details_map.insert( + out_msg_details.nonce, + MessageDetails { + dispatch_weight: out_msg_details.dispatch_weight, + size: out_msg_details.size as _, + reward: Zero::zero(), + }, + ); + } + + Ok(msgs_details_map) + } + + async fn prove_messages( + &self, + id: SourceHeaderIdOf>, + nonces: RangeInclusive, + proof_parameters: MessageProofParameters, + ) -> Result< + ( + SourceHeaderIdOf>, + RangeInclusive, + as MessageLane>::MessagesProof, + ), + SubstrateError, + > { + let mut storage_keys = + Vec::with_capacity(nonces.end().saturating_sub(*nonces.start()) as usize + 1); + let mut message_nonce = *nonces.start(); + while message_nonce <= *nonces.end() { + let message_key = bp_messages::storage_keys::message_key( + P::TargetChain::WITH_CHAIN_MESSAGES_PALLET_NAME, + &self.lane_id, + message_nonce, + ); + storage_keys.push(message_key); + message_nonce += 1; + } + if proof_parameters.outbound_state_proof_required { + storage_keys.push(bp_messages::storage_keys::outbound_lane_data_key( + P::TargetChain::WITH_CHAIN_MESSAGES_PALLET_NAME, + &self.lane_id, + )); + } + + let proof = self + .source_client + .prove_storage(storage_keys, id.1) + .await? + .into_iter_nodes() + .collect(); + let proof = FromBridgedChainMessagesProof { + bridged_header_hash: id.1, + storage_proof: proof, + lane: self.lane_id, + nonces_start: *nonces.start(), + nonces_end: *nonces.end(), + }; + Ok((id, nonces, (proof_parameters.dispatch_weight, proof))) + } + + async fn submit_messages_receiving_proof( + &self, + maybe_batch_tx: Option, + _generated_at_block: TargetHeaderIdOf>, + proof: as MessageLane>::MessagesReceivingProof, + ) -> Result { + let messages_proof_call = + P::ReceiveMessagesDeliveryProofCallBuilder::build_receive_messages_delivery_proof_call( + proof, + maybe_batch_tx.is_none(), + ); + let final_call = match maybe_batch_tx { + Some(batch_tx) => batch_tx.append_call_and_build(messages_proof_call), + None => messages_proof_call, + }; + + let transaction_params = self.transaction_params.clone(); + self.source_client + .submit_and_watch_signed_extrinsic( + &self.transaction_params.signer, + move |best_block_id, transaction_nonce| { + Ok(UnsignedTransaction::new(final_call.into(), transaction_nonce) + .era(TransactionEra::new(best_block_id, transaction_params.mortality))) + }, + ) + .await + } + + async fn require_target_header_on_source( + &self, + id: TargetHeaderIdOf>, + ) -> Result, SubstrateError> { + if let Some(ref target_to_source_headers_relay) = self.target_to_source_headers_relay { + if let Some(batch_tx) = + BatchProofTransaction::new(target_to_source_headers_relay.clone(), id.0).await? + { + return Ok(Some(batch_tx)) + } + + target_to_source_headers_relay.require_more_headers(id.0).await; + } + + Ok(None) + } +} + +/// Ensure that the messages pallet at source chain is active. +pub(crate) async fn ensure_messages_pallet_active( + client: &Client, +) -> Result<(), SubstrateError> +where + AtChain: ChainWithMessages, + WithChain: ChainWithMessages, +{ + let operating_mode = client + .storage_value(operating_mode_key(WithChain::WITH_CHAIN_MESSAGES_PALLET_NAME), None) + .await?; + let is_halted = + operating_mode == Some(MessagesOperatingMode::Basic(BasicOperatingMode::Halted)); + if is_halted { + Err(SubstrateError::BridgePalletIsHalted) + } else { + Ok(()) + } +} + +/// Read best blocks from given client. +/// +/// This function assumes that the chain that is followed by the `self_client` has +/// bridge GRANDPA pallet deployed and it provides `best_finalized_header_id_method_name` +/// runtime API to read the best finalized Bridged chain header. +/// +/// If `peer_client` is `None`, the value of `actual_best_finalized_peer_at_best_self` will +/// always match the `best_finalized_peer_at_best_self`. +pub async fn read_client_state( + self_client: &Client, + peer_client: Option<&Client>, +) -> Result, HeaderIdOf>, SubstrateError> +where + SelfChain: Chain, + PeerChain: Chain, +{ + // let's read our state first: we need best finalized header hash on **this** chain + let self_best_finalized_id = self_client.best_finalized_header().await?.id(); + // now let's read our best header on **this** chain + let self_best_id = self_client.best_header().await?.id(); + + // now let's read id of best finalized peer header at our best finalized block + let peer_on_self_best_finalized_id = + best_synced_header_id::(self_client, self_best_id.hash()).await?; + + // read actual header, matching the `peer_on_self_best_finalized_id` from the peer chain + let actual_peer_on_self_best_finalized_id = + match (peer_client, peer_on_self_best_finalized_id.as_ref()) { + (Some(peer_client), Some(peer_on_self_best_finalized_id)) => { + let actual_peer_on_self_best_finalized = + peer_client.header_by_number(peer_on_self_best_finalized_id.number()).await?; + Some(actual_peer_on_self_best_finalized.id()) + }, + _ => peer_on_self_best_finalized_id, + }; + + Ok(ClientState { + best_self: self_best_id, + best_finalized_self: self_best_finalized_id, + best_finalized_peer_at_best_self: peer_on_self_best_finalized_id, + actual_best_finalized_peer_at_best_self: actual_peer_on_self_best_finalized_id, + }) +} + +/// Reads best `PeerChain` header known to the `SelfChain` using provided runtime API method. +/// +/// Method is supposed to be the `FinalityApi::best_finalized()` method. +pub async fn best_finalized_peer_header_at_self( + self_client: &Client, + at_self_hash: HashOf, +) -> Result>, SubstrateError> +where + SelfChain: Chain, + PeerChain: Chain, +{ + // now let's read id of best finalized peer header at our best finalized block + self_client + .typed_state_call::<_, Option<_>>( + PeerChain::BEST_FINALIZED_HEADER_ID_METHOD.into(), + (), + Some(at_self_hash), + ) + .await +} + +fn validate_out_msgs_details( + out_msgs_details: &[OutboundMessageDetails], + nonces: RangeInclusive, +) -> Result<(), SubstrateError> { + let make_missing_nonce_error = |expected_nonce| { + Err(SubstrateError::Custom(format!( + "Missing nonce {expected_nonce} in message_details call result. Expected all nonces from {nonces:?}", + ))) + }; + + if out_msgs_details.len() > nonces.clone().count() { + return Err(SubstrateError::Custom( + "More messages than requested returned by the message_details call.".into(), + )) + } + + // Check if last nonce is missing. The loop below is not checking this. + if out_msgs_details.is_empty() && !nonces.is_empty() { + return make_missing_nonce_error(*nonces.end()) + } + + let mut nonces_iter = nonces.clone().rev().peekable(); + let mut out_msgs_details_iter = out_msgs_details.iter().rev(); + while let Some((out_msg_details, &nonce)) = out_msgs_details_iter.next().zip(nonces_iter.peek()) + { + nonces_iter.next(); + if out_msg_details.nonce != nonce { + // Some nonces are missing from the middle/tail of the range. This is critical error. + return make_missing_nonce_error(nonce) + } + } + + // Check if some nonces from the beginning of the range are missing. This may happen if + // some messages were already pruned from the source node. This is not a critical error + // and will be auto-resolved by messages lane (and target node). + if nonces_iter.peek().is_some() { + log::info!( + target: "bridge", + "Some messages are missing from the {} node: {:?}. Target node may be out of sync?", + C::NAME, + nonces_iter.rev().collect::>(), + ); + } + + Ok(()) +} + +fn split_msgs_to_refine( + lane_id: LaneId, + msgs_to_refine: MessagesToRefine, +) -> Result, SubstrateError> { + let max_batch_size = Target::max_extrinsic_size() as usize; + let mut batches = vec![]; + + let mut current_msgs_batch = msgs_to_refine; + while !current_msgs_batch.is_empty() { + let mut next_msgs_batch = vec![]; + while (lane_id, ¤t_msgs_batch).encoded_size() > max_batch_size { + if current_msgs_batch.len() <= 1 { + return Err(SubstrateError::Custom(format!( + "Call of {} at {} can't be executed even if only one message is supplied. \ + max_extrinsic_size(): {}", + Source::FROM_CHAIN_MESSAGE_DETAILS_METHOD, + Target::NAME, + Target::max_extrinsic_size(), + ))) + } + + if let Some(msg) = current_msgs_batch.pop() { + next_msgs_batch.insert(0, msg); + } + } + + batches.push(current_msgs_batch); + current_msgs_batch = next_msgs_batch; + } + + Ok(batches) +} + +#[cfg(test)] +mod tests { + use super::*; + use relay_substrate_client::test_chain::TestChain; + + fn message_details_from_rpc( + nonces: RangeInclusive, + ) -> Vec { + nonces + .into_iter() + .map(|nonce| bp_messages::OutboundMessageDetails { + nonce, + dispatch_weight: Weight::zero(), + size: 0, + }) + .collect() + } + + #[test] + fn validate_out_msgs_details_succeeds_if_no_messages_are_missing() { + assert!(validate_out_msgs_details::(&message_details_from_rpc(1..=3), 1..=3,) + .is_ok()); + } + + #[test] + fn validate_out_msgs_details_succeeds_if_head_messages_are_missing() { + assert!(validate_out_msgs_details::(&message_details_from_rpc(2..=3), 1..=3,) + .is_ok()) + } + + #[test] + fn validate_out_msgs_details_fails_if_mid_messages_are_missing() { + let mut message_details_from_rpc = message_details_from_rpc(1..=3); + message_details_from_rpc.remove(1); + assert!(matches!( + validate_out_msgs_details::(&message_details_from_rpc, 1..=3,), + Err(SubstrateError::Custom(_)) + )); + } + + #[test] + fn validate_out_msgs_details_map_fails_if_tail_messages_are_missing() { + assert!(matches!( + validate_out_msgs_details::(&message_details_from_rpc(1..=2), 1..=3,), + Err(SubstrateError::Custom(_)) + )); + } + + #[test] + fn validate_out_msgs_details_fails_if_all_messages_are_missing() { + assert!(matches!( + validate_out_msgs_details::(&[], 1..=3), + Err(SubstrateError::Custom(_)) + )); + } + + #[test] + fn validate_out_msgs_details_fails_if_more_messages_than_nonces() { + assert!(matches!( + validate_out_msgs_details::(&message_details_from_rpc(1..=5), 2..=5,), + Err(SubstrateError::Custom(_)) + )); + } + + fn check_split_msgs_to_refine( + payload_sizes: Vec, + expected_batches: Result, ()>, + ) { + let mut out_msgs_details = vec![]; + for (idx, _) in payload_sizes.iter().enumerate() { + out_msgs_details.push(OutboundMessageDetails { + nonce: idx as MessageNonce, + dispatch_weight: Weight::zero(), + size: 0, + }); + } + + let mut msgs_to_refine = vec![]; + for (&payload_size, out_msg_details) in + payload_sizes.iter().zip(out_msgs_details.iter_mut()) + { + let payload = vec![1u8; payload_size]; + msgs_to_refine.push((payload, out_msg_details)); + } + + let maybe_batches = + split_msgs_to_refine::(Default::default(), msgs_to_refine); + match expected_batches { + Ok(expected_batches) => { + let batches = maybe_batches.unwrap(); + let mut idx = 0; + assert_eq!(batches.len(), expected_batches.len()); + for (batch, &expected_batch_size) in batches.iter().zip(expected_batches.iter()) { + assert_eq!(batch.len(), expected_batch_size); + for msg_to_refine in batch { + assert_eq!(msg_to_refine.0.len(), payload_sizes[idx]); + idx += 1; + } + } + }, + Err(_) => { + matches!(maybe_batches, Err(SubstrateError::Custom(_))); + }, + } + } + + #[test] + fn test_split_msgs_to_refine() { + let max_extrinsic_size = 100000; + + // Check that an error is returned when one of the messages is too big. + check_split_msgs_to_refine(vec![max_extrinsic_size], Err(())); + check_split_msgs_to_refine(vec![50, 100, max_extrinsic_size, 200], Err(())); + + // Otherwise check that the split is valid. + check_split_msgs_to_refine(vec![100, 200, 300, 400], Ok(vec![4])); + check_split_msgs_to_refine( + vec![ + 50, + 100, + max_extrinsic_size - 500, + 500, + 1000, + 1500, + max_extrinsic_size - 3500, + 5000, + 10000, + ], + Ok(vec![3, 4, 2]), + ); + check_split_msgs_to_refine( + vec![ + 50, + 100, + max_extrinsic_size - 150, + 500, + 1000, + 1500, + max_extrinsic_size - 3000, + 5000, + 10000, + ], + Ok(vec![2, 1, 3, 1, 2]), + ); + check_split_msgs_to_refine( + vec![ + 5000, + 10000, + max_extrinsic_size - 3500, + 500, + 1000, + 1500, + max_extrinsic_size - 500, + 50, + 100, + ], + Ok(vec![2, 4, 3]), + ); + } +} diff --git a/bridges/relays/lib-substrate-relay/src/messages_target.rs b/bridges/relays/lib-substrate-relay/src/messages_target.rs new file mode 100644 index 0000000000000000000000000000000000000000..9396e785530d2ec5855e332e8db3dd7836938f25 --- /dev/null +++ b/bridges/relays/lib-substrate-relay/src/messages_target.rs @@ -0,0 +1,300 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Substrate client as Substrate messages target. The chain we connect to should have +//! runtime that implements `HeaderApi` to allow bridging with +//! `` chain. + +use crate::{ + messages_lane::{ + BatchProofTransaction, MessageLaneAdapter, ReceiveMessagesProofCallBuilder, + SubstrateMessageLane, + }, + messages_source::{ensure_messages_pallet_active, read_client_state, SubstrateMessagesProof}, + on_demand::OnDemandRelay, + TransactionParams, +}; + +use async_std::sync::Arc; +use async_trait::async_trait; +use bp_messages::{ + storage_keys::inbound_lane_data_key, ChainWithMessages as _, InboundLaneData, LaneId, + MessageNonce, UnrewardedRelayersState, +}; +use bridge_runtime_common::messages::source::FromBridgedChainMessagesDeliveryProof; +use messages_relay::{ + message_lane::{MessageLane, SourceHeaderIdOf, TargetHeaderIdOf}, + message_lane_loop::{NoncesSubmitArtifacts, TargetClient, TargetClientState}, +}; +use relay_substrate_client::{ + AccountIdOf, AccountKeyPairOf, BalanceOf, CallOf, Client, Error as SubstrateError, HashOf, + TransactionEra, TransactionTracker, UnsignedTransaction, +}; +use relay_utils::relay_loop::Client as RelayClient; +use sp_core::Pair; +use std::{convert::TryFrom, ops::RangeInclusive}; + +/// Message receiving proof returned by the target Substrate node. +pub type SubstrateMessagesDeliveryProof = + (UnrewardedRelayersState, FromBridgedChainMessagesDeliveryProof>); + +/// Substrate client as Substrate messages target. +pub struct SubstrateMessagesTarget { + target_client: Client, + source_client: Client, + lane_id: LaneId, + relayer_id_at_source: AccountIdOf, + transaction_params: TransactionParams>, + source_to_target_headers_relay: Option>>, +} + +impl SubstrateMessagesTarget

{ + /// Create new Substrate headers target. + pub fn new( + target_client: Client, + source_client: Client, + lane_id: LaneId, + relayer_id_at_source: AccountIdOf, + transaction_params: TransactionParams>, + source_to_target_headers_relay: Option< + Arc>, + >, + ) -> Self { + SubstrateMessagesTarget { + target_client, + source_client, + lane_id, + relayer_id_at_source, + transaction_params, + source_to_target_headers_relay, + } + } + + /// Read inbound lane state from the on-chain storage at given block. + async fn inbound_lane_data( + &self, + id: TargetHeaderIdOf>, + ) -> Result>>, SubstrateError> { + self.target_client + .storage_value( + inbound_lane_data_key( + P::SourceChain::WITH_CHAIN_MESSAGES_PALLET_NAME, + &self.lane_id, + ), + Some(id.1), + ) + .await + } + + /// Ensure that the messages pallet at target chain is active. + async fn ensure_pallet_active(&self) -> Result<(), SubstrateError> { + ensure_messages_pallet_active::(&self.target_client).await + } +} + +impl Clone for SubstrateMessagesTarget

{ + fn clone(&self) -> Self { + Self { + target_client: self.target_client.clone(), + source_client: self.source_client.clone(), + lane_id: self.lane_id, + relayer_id_at_source: self.relayer_id_at_source.clone(), + transaction_params: self.transaction_params.clone(), + source_to_target_headers_relay: self.source_to_target_headers_relay.clone(), + } + } +} + +#[async_trait] +impl RelayClient for SubstrateMessagesTarget

{ + type Error = SubstrateError; + + async fn reconnect(&mut self) -> Result<(), SubstrateError> { + // since the client calls RPC methods on both sides, we need to reconnect both + self.target_client.reconnect().await?; + self.source_client.reconnect().await?; + + // call reconnect on on-demand headers relay, because we may use different chains there + // and the error that has lead to reconnect may have came from those other chains + // (see `require_source_header_on_target`) + // + // this may lead to multiple reconnects to the same node during the same call and it + // needs to be addressed in the future + // TODO: https://github.com/paritytech/parity-bridges-common/issues/1928 + if let Some(ref mut source_to_target_headers_relay) = self.source_to_target_headers_relay { + source_to_target_headers_relay.reconnect().await?; + } + + Ok(()) + } +} + +#[async_trait] +impl TargetClient> for SubstrateMessagesTarget

+where + AccountIdOf: From< as Pair>::Public>, + BalanceOf: TryFrom>, +{ + type BatchTransaction = + BatchProofTransaction; + type TransactionTracker = TransactionTracker>; + + async fn state(&self) -> Result>, SubstrateError> { + // we can't continue to deliver confirmations if source node is out of sync, because + // it may have already received confirmations that we're going to deliver + // + // we can't continue to deliver messages if target node is out of sync, because + // it may have already received (some of) messages that we're going to deliver + self.source_client.ensure_synced().await?; + self.target_client.ensure_synced().await?; + // we can't relay messages if messages pallet at target chain is halted + self.ensure_pallet_active().await?; + + read_client_state(&self.target_client, Some(&self.source_client)).await + } + + async fn latest_received_nonce( + &self, + id: TargetHeaderIdOf>, + ) -> Result<(TargetHeaderIdOf>, MessageNonce), SubstrateError> { + // lane data missing from the storage is fine until first message is received + let latest_received_nonce = self + .inbound_lane_data(id) + .await? + .map(|data| data.last_delivered_nonce()) + .unwrap_or(0); + Ok((id, latest_received_nonce)) + } + + async fn latest_confirmed_received_nonce( + &self, + id: TargetHeaderIdOf>, + ) -> Result<(TargetHeaderIdOf>, MessageNonce), SubstrateError> { + // lane data missing from the storage is fine until first message is received + let last_confirmed_nonce = self + .inbound_lane_data(id) + .await? + .map(|data| data.last_confirmed_nonce) + .unwrap_or(0); + Ok((id, last_confirmed_nonce)) + } + + async fn unrewarded_relayers_state( + &self, + id: TargetHeaderIdOf>, + ) -> Result<(TargetHeaderIdOf>, UnrewardedRelayersState), SubstrateError> + { + let inbound_lane_data = + self.inbound_lane_data(id).await?.unwrap_or(InboundLaneData::default()); + Ok((id, (&inbound_lane_data).into())) + } + + async fn prove_messages_receiving( + &self, + id: TargetHeaderIdOf>, + ) -> Result< + ( + TargetHeaderIdOf>, + as MessageLane>::MessagesReceivingProof, + ), + SubstrateError, + > { + let (id, relayers_state) = self.unrewarded_relayers_state(id).await?; + let inbound_data_key = bp_messages::storage_keys::inbound_lane_data_key( + P::SourceChain::WITH_CHAIN_MESSAGES_PALLET_NAME, + &self.lane_id, + ); + let proof = self + .target_client + .prove_storage(vec![inbound_data_key], id.1) + .await? + .into_iter_nodes() + .collect(); + let proof = FromBridgedChainMessagesDeliveryProof { + bridged_header_hash: id.1, + storage_proof: proof, + lane: self.lane_id, + }; + Ok((id, (relayers_state, proof))) + } + + async fn submit_messages_proof( + &self, + maybe_batch_tx: Option, + _generated_at_header: SourceHeaderIdOf>, + nonces: RangeInclusive, + proof: as MessageLane>::MessagesProof, + ) -> Result, SubstrateError> { + let messages_proof_call = make_messages_delivery_call::

( + self.relayer_id_at_source.clone(), + proof.1.nonces_start..=proof.1.nonces_end, + proof, + maybe_batch_tx.is_none(), + ); + let final_call = match maybe_batch_tx { + Some(batch_tx) => batch_tx.append_call_and_build(messages_proof_call), + None => messages_proof_call, + }; + + let transaction_params = self.transaction_params.clone(); + let tx_tracker = self + .target_client + .submit_and_watch_signed_extrinsic( + &self.transaction_params.signer, + move |best_block_id, transaction_nonce| { + Ok(UnsignedTransaction::new(final_call.into(), transaction_nonce) + .era(TransactionEra::new(best_block_id, transaction_params.mortality))) + }, + ) + .await?; + Ok(NoncesSubmitArtifacts { nonces, tx_tracker }) + } + + async fn require_source_header_on_target( + &self, + id: SourceHeaderIdOf>, + ) -> Result, SubstrateError> { + if let Some(ref source_to_target_headers_relay) = self.source_to_target_headers_relay { + if let Some(batch_tx) = + BatchProofTransaction::new(source_to_target_headers_relay.clone(), id.0).await? + { + return Ok(Some(batch_tx)) + } + + source_to_target_headers_relay.require_more_headers(id.0).await; + } + + Ok(None) + } +} + +/// Make messages delivery call from given proof. +fn make_messages_delivery_call( + relayer_id_at_source: AccountIdOf, + nonces: RangeInclusive, + proof: SubstrateMessagesProof, + trace_call: bool, +) -> CallOf { + let messages_count = nonces.end() - nonces.start() + 1; + let dispatch_weight = proof.0; + P::ReceiveMessagesProofCallBuilder::build_receive_messages_proof_call( + relayer_id_at_source, + proof, + messages_count as _, + dispatch_weight, + trace_call, + ) +} diff --git a/bridges/relays/lib-substrate-relay/src/on_demand/headers.rs b/bridges/relays/lib-substrate-relay/src/on_demand/headers.rs new file mode 100644 index 0000000000000000000000000000000000000000..e8a2a3c6c58aaedeb55da67871d0ddb51830338d --- /dev/null +++ b/bridges/relays/lib-substrate-relay/src/on_demand/headers.rs @@ -0,0 +1,550 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! On-demand Substrate -> Substrate header finality relay. + +use crate::{ + finality::SubmitFinalityProofCallBuilder, finality_base::engine::MaxExpectedCallSizeCheck, +}; + +use async_std::sync::{Arc, Mutex}; +use async_trait::async_trait; +use bp_header_chain::ConsensusLogReader; +use bp_runtime::HeaderIdProvider; +use futures::{select, FutureExt}; +use num_traits::{One, Saturating, Zero}; +use sp_runtime::traits::Header; + +use finality_relay::{FinalitySyncParams, TargetClient as FinalityTargetClient}; +use relay_substrate_client::{ + AccountIdOf, AccountKeyPairOf, BlockNumberOf, CallOf, Chain, Client, Error as SubstrateError, + HeaderIdOf, +}; +use relay_utils::{ + metrics::MetricsParams, relay_loop::Client as RelayClient, FailedClient, MaybeConnectionError, + STALL_TIMEOUT, +}; + +use crate::{ + finality::{ + source::{RequiredHeaderNumberRef, SubstrateFinalitySource}, + target::SubstrateFinalityTarget, + SubstrateFinalitySyncPipeline, RECENT_FINALITY_PROOFS_LIMIT, + }, + finality_base::engine::Engine, + on_demand::OnDemandRelay, + TransactionParams, +}; + +/// On-demand Substrate <-> Substrate header finality relay. +/// +/// This relay may be requested to sync more headers, whenever some other relay (e.g. messages +/// relay) needs it to continue its regular work. When enough headers are relayed, on-demand stops +/// syncing headers. +#[derive(Clone)] +pub struct OnDemandHeadersRelay { + /// Relay task name. + relay_task_name: String, + /// Shared reference to maximal required finalized header number. + required_header_number: RequiredHeaderNumberRef, + /// Client of the source chain. + source_client: Client, + /// Client of the target chain. + target_client: Client, +} + +impl OnDemandHeadersRelay

{ + /// Create new on-demand headers relay. + /// + /// If `metrics_params` is `Some(_)`, the metrics of the finality relay are registered. + /// Otherwise, all required metrics must be exposed outside of this method. + pub fn new( + source_client: Client, + target_client: Client, + target_transaction_params: TransactionParams>, + only_mandatory_headers: bool, + metrics_params: Option, + ) -> Self + where + AccountIdOf: + From< as sp_core::Pair>::Public>, + { + let required_header_number = Arc::new(Mutex::new(Zero::zero())); + let this = OnDemandHeadersRelay { + relay_task_name: on_demand_headers_relay_name::(), + required_header_number: required_header_number.clone(), + source_client: source_client.clone(), + target_client: target_client.clone(), + }; + async_std::task::spawn(async move { + background_task::

( + source_client, + target_client, + target_transaction_params, + only_mandatory_headers, + required_header_number, + metrics_params, + ) + .await; + }); + + this + } +} + +#[async_trait] +impl OnDemandRelay + for OnDemandHeadersRelay

+{ + async fn reconnect(&self) -> Result<(), SubstrateError> { + // using clone is fine here (to avoid mut requirement), because clone on Client clones + // internal references + self.source_client.clone().reconnect().await?; + self.target_client.clone().reconnect().await + } + + async fn require_more_headers(&self, required_header: BlockNumberOf) { + let mut required_header_number = self.required_header_number.lock().await; + if required_header > *required_header_number { + log::trace!( + target: "bridge", + "[{}] More {} headers required. Going to sync up to the {}", + self.relay_task_name, + P::SourceChain::NAME, + required_header, + ); + + *required_header_number = required_header; + } + } + + async fn prove_header( + &self, + required_header: BlockNumberOf, + ) -> Result<(HeaderIdOf, Vec>), SubstrateError> { + const MAX_ITERATIONS: u32 = 4; + let mut iterations = 0; + let mut current_required_header = required_header; + loop { + // first find proper header (either `current_required_header`) or its descendant + let finality_source = + SubstrateFinalitySource::

::new(self.source_client.clone(), None); + let (header, mut proof) = + finality_source.prove_block_finality(current_required_header).await?; + let header_id = header.id(); + + // verify and optimize justification before including it into the call + let context = P::FinalityEngine::verify_and_optimize_proof( + &self.target_client, + &header, + &mut proof, + ) + .await?; + + // now we have the header and its proof, but we want to minimize our losses, so let's + // check if we'll get the full refund for submitting this header + let check_result = P::FinalityEngine::check_max_expected_call_size(&header, &proof); + if let MaxExpectedCallSizeCheck::Exceeds { call_size, max_call_size } = check_result { + iterations += 1; + current_required_header = header_id.number().saturating_add(One::one()); + if iterations < MAX_ITERATIONS { + log::debug!( + target: "bridge", + "[{}] Requested to prove {} head {:?}. Selected to prove {} head {:?}. But it is too large: {} vs {}. \ + Going to select next header", + self.relay_task_name, + P::SourceChain::NAME, + required_header, + P::SourceChain::NAME, + header_id, + call_size, + max_call_size, + ); + + continue; + } + } + + log::debug!( + target: "bridge", + "[{}] Requested to prove {} head {:?}. Selected to prove {} head {:?} (after {} iterations)", + self.relay_task_name, + P::SourceChain::NAME, + required_header, + P::SourceChain::NAME, + header_id, + iterations, + ); + + // and then craft the submit-proof call + let call = P::SubmitFinalityProofCallBuilder::build_submit_finality_proof_call( + header, proof, context, + ); + + return Ok((header_id, vec![call])); + } + } +} + +/// Background task that is responsible for starting headers relay. +async fn background_task( + source_client: Client, + target_client: Client, + target_transaction_params: TransactionParams>, + only_mandatory_headers: bool, + required_header_number: RequiredHeaderNumberRef, + metrics_params: Option, +) where + AccountIdOf: From< as sp_core::Pair>::Public>, +{ + let relay_task_name = on_demand_headers_relay_name::(); + let target_transactions_mortality = target_transaction_params.mortality; + let mut finality_source = SubstrateFinalitySource::

::new( + source_client.clone(), + Some(required_header_number.clone()), + ); + let mut finality_target = + SubstrateFinalityTarget::new(target_client.clone(), target_transaction_params); + let mut latest_non_mandatory_at_source = Zero::zero(); + + let mut restart_relay = true; + let finality_relay_task = futures::future::Fuse::terminated(); + futures::pin_mut!(finality_relay_task); + + loop { + select! { + _ = async_std::task::sleep(P::TargetChain::AVERAGE_BLOCK_INTERVAL).fuse() => {}, + _ = finality_relay_task => { + // this should never happen in practice given the current code + restart_relay = true; + }, + } + + // read best finalized source header number from source + let best_finalized_source_header_at_source = + best_finalized_source_header_at_source(&finality_source, &relay_task_name).await; + if matches!(best_finalized_source_header_at_source, Err(ref e) if e.is_connection_error()) { + relay_utils::relay_loop::reconnect_failed_client( + FailedClient::Source, + relay_utils::relay_loop::RECONNECT_DELAY, + &mut finality_source, + &mut finality_target, + ) + .await; + continue + } + + // read best finalized source header number from target + let best_finalized_source_header_at_target = + best_finalized_source_header_at_target::

(&finality_target, &relay_task_name).await; + if matches!(best_finalized_source_header_at_target, Err(ref e) if e.is_connection_error()) { + relay_utils::relay_loop::reconnect_failed_client( + FailedClient::Target, + relay_utils::relay_loop::RECONNECT_DELAY, + &mut finality_source, + &mut finality_target, + ) + .await; + continue + } + + // submit mandatory header if some headers are missing + let best_finalized_source_header_at_source_fmt = + format!("{best_finalized_source_header_at_source:?}"); + let best_finalized_source_header_at_target_fmt = + format!("{best_finalized_source_header_at_target:?}"); + let required_header_number_value = *required_header_number.lock().await; + let mandatory_scan_range = mandatory_headers_scan_range::( + best_finalized_source_header_at_source.ok(), + best_finalized_source_header_at_target.ok(), + required_header_number_value, + ) + .await; + + log::trace!( + target: "bridge", + "[{}] Mandatory headers scan range: ({:?}, {:?}, {:?}) -> {:?}", + relay_task_name, + required_header_number_value, + best_finalized_source_header_at_source_fmt, + best_finalized_source_header_at_target_fmt, + mandatory_scan_range, + ); + + if let Some(mandatory_scan_range) = mandatory_scan_range { + let relay_mandatory_header_result = relay_mandatory_header_from_range( + &finality_source, + &required_header_number, + best_finalized_source_header_at_target_fmt, + ( + std::cmp::max(mandatory_scan_range.0, latest_non_mandatory_at_source), + mandatory_scan_range.1, + ), + &relay_task_name, + ) + .await; + match relay_mandatory_header_result { + Ok(true) => (), + Ok(false) => { + // there are no (or we don't need to relay them) mandatory headers in the range + // => to avoid scanning the same headers over and over again, remember that + latest_non_mandatory_at_source = mandatory_scan_range.1; + + log::trace!( + target: "bridge", + "[{}] No mandatory {} headers in the range {:?}", + relay_task_name, + P::SourceChain::NAME, + mandatory_scan_range, + ); + }, + Err(e) => { + log::warn!( + target: "bridge", + "[{}] Failed to scan mandatory {} headers range ({:?}): {:?}", + relay_task_name, + P::SourceChain::NAME, + mandatory_scan_range, + e, + ); + + if e.is_connection_error() { + relay_utils::relay_loop::reconnect_failed_client( + FailedClient::Source, + relay_utils::relay_loop::RECONNECT_DELAY, + &mut finality_source, + &mut finality_target, + ) + .await; + continue + } + }, + } + } + + // start/restart relay + if restart_relay { + let stall_timeout = relay_substrate_client::transaction_stall_timeout( + target_transactions_mortality, + P::TargetChain::AVERAGE_BLOCK_INTERVAL, + STALL_TIMEOUT, + ); + + log::info!( + target: "bridge", + "[{}] Starting on-demand headers relay task\n\t\ + Only mandatory headers: {}\n\t\ + Tx mortality: {:?} (~{}m)\n\t\ + Stall timeout: {:?}", + relay_task_name, + only_mandatory_headers, + target_transactions_mortality, + stall_timeout.as_secs_f64() / 60.0f64, + stall_timeout, + ); + + finality_relay_task.set( + finality_relay::run( + finality_source.clone(), + finality_target.clone(), + FinalitySyncParams { + tick: std::cmp::max( + P::SourceChain::AVERAGE_BLOCK_INTERVAL, + P::TargetChain::AVERAGE_BLOCK_INTERVAL, + ), + recent_finality_proofs_limit: RECENT_FINALITY_PROOFS_LIMIT, + stall_timeout, + only_mandatory_headers, + }, + metrics_params.clone().unwrap_or_else(MetricsParams::disabled), + futures::future::pending(), + ) + .fuse(), + ); + + restart_relay = false; + } + } +} + +/// Returns `Some()` with inclusive range of headers which must be scanned for mandatory headers +/// and the first of such headers must be submitted to the target node. +async fn mandatory_headers_scan_range( + best_finalized_source_header_at_source: Option, + best_finalized_source_header_at_target: Option, + required_header_number: BlockNumberOf, +) -> Option<(C::BlockNumber, C::BlockNumber)> { + // if we have been unable to read header number from the target, then let's assume + // that it is the same as required header number. Otherwise we risk submitting + // unneeded transactions + let best_finalized_source_header_at_target = + best_finalized_source_header_at_target.unwrap_or(required_header_number); + + // if we have been unable to read header number from the source, then let's assume + // that it is the same as at the target + let best_finalized_source_header_at_source = + best_finalized_source_header_at_source.unwrap_or(best_finalized_source_header_at_target); + + // if relay is already asked to sync more headers than we have at source, don't do anything yet + if required_header_number >= best_finalized_source_header_at_source { + return None + } + + Some(( + best_finalized_source_header_at_target + One::one(), + best_finalized_source_header_at_source, + )) +} + +/// Try to find mandatory header in the inclusive headers range and, if one is found, ask to relay +/// it. +/// +/// Returns `true` if header was found and (asked to be) relayed and `false` otherwise. +async fn relay_mandatory_header_from_range( + finality_source: &SubstrateFinalitySource

, + required_header_number: &RequiredHeaderNumberRef, + best_finalized_source_header_at_target: String, + range: (BlockNumberOf, BlockNumberOf), + relay_task_name: &str, +) -> Result { + // search for mandatory header first + let mandatory_source_header_number = + find_mandatory_header_in_range(finality_source, range).await?; + + // if there are no mandatory headers - we have nothing to do + let mandatory_source_header_number = match mandatory_source_header_number { + Some(mandatory_source_header_number) => mandatory_source_header_number, + None => return Ok(false), + }; + + // `find_mandatory_header` call may take a while => check if `required_header_number` is still + // less than our `mandatory_source_header_number` before logging anything + let mut required_header_number = required_header_number.lock().await; + if *required_header_number >= mandatory_source_header_number { + return Ok(false) + } + + log::trace!( + target: "bridge", + "[{}] Too many {} headers missing at target ({} vs {}). Going to sync up to the mandatory {}", + relay_task_name, + P::SourceChain::NAME, + best_finalized_source_header_at_target, + range.1, + mandatory_source_header_number, + ); + + *required_header_number = mandatory_source_header_number; + Ok(true) +} + +/// Read best finalized source block number from source client. +/// +/// Returns `None` if we have failed to read the number. +async fn best_finalized_source_header_at_source( + finality_source: &SubstrateFinalitySource

, + relay_task_name: &str, +) -> Result, relay_substrate_client::Error> { + finality_source.on_chain_best_finalized_block_number().await.map_err(|error| { + log::error!( + target: "bridge", + "[{}] Failed to read best finalized source header from source: {:?}", + relay_task_name, + error, + ); + + error + }) +} + +/// Read best finalized source block number from target client. +/// +/// Returns `None` if we have failed to read the number. +async fn best_finalized_source_header_at_target( + finality_target: &SubstrateFinalityTarget

, + relay_task_name: &str, +) -> Result, as RelayClient>::Error> +where + AccountIdOf: From< as sp_core::Pair>::Public>, +{ + finality_target + .best_finalized_source_block_id() + .await + .map_err(|error| { + log::error!( + target: "bridge", + "[{}] Failed to read best finalized source header from target: {:?}", + relay_task_name, + error, + ); + + error + }) + .map(|id| id.0) +} + +/// Read first mandatory header in given inclusive range. +/// +/// Returns `Ok(None)` if there were no mandatory headers in the range. +async fn find_mandatory_header_in_range( + finality_source: &SubstrateFinalitySource

, + range: (BlockNumberOf, BlockNumberOf), +) -> Result>, relay_substrate_client::Error> { + let mut current = range.0; + while current <= range.1 { + let header = finality_source.client().header_by_number(current).await?; + if >::ConsensusLogReader::schedules_authorities_change( + header.digest(), + ) { + return Ok(Some(current)) + } + + current += One::one(); + } + + Ok(None) +} + +/// On-demand headers relay task name. +fn on_demand_headers_relay_name() -> String { + format!("{}-to-{}-on-demand-headers", SourceChain::NAME, TargetChain::NAME) +} + +#[cfg(test)] +mod tests { + use super::*; + use relay_substrate_client::test_chain::TestChain; + + const AT_SOURCE: Option> = Some(10); + const AT_TARGET: Option> = Some(1); + + #[async_std::test] + async fn mandatory_headers_scan_range_selects_range_if_some_headers_are_missing() { + assert_eq!( + mandatory_headers_scan_range::(AT_SOURCE, AT_TARGET, 0,).await, + Some((AT_TARGET.unwrap() + 1, AT_SOURCE.unwrap())), + ); + } + + #[async_std::test] + async fn mandatory_headers_scan_range_selects_nothing_if_already_queued() { + assert_eq!( + mandatory_headers_scan_range::(AT_SOURCE, AT_TARGET, AT_SOURCE.unwrap(),) + .await, + None, + ); + } +} diff --git a/bridges/relays/lib-substrate-relay/src/on_demand/mod.rs b/bridges/relays/lib-substrate-relay/src/on_demand/mod.rs new file mode 100644 index 0000000000000000000000000000000000000000..00bb33d6740937ea7dde9066d9caad3ced2ca655 --- /dev/null +++ b/bridges/relays/lib-substrate-relay/src/on_demand/mod.rs @@ -0,0 +1,48 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Types and functions intended to ease adding of new Substrate -> Substrate +//! on-demand pipelines. + +use async_trait::async_trait; +use relay_substrate_client::{BlockNumberOf, CallOf, Chain, Error as SubstrateError, HeaderIdOf}; + +pub mod headers; +pub mod parachains; + +/// On-demand headers relay that is relaying finalizing headers only when requested. +#[async_trait] +pub trait OnDemandRelay: Send + Sync { + /// Reconnect to source and target nodes. + async fn reconnect(&self) -> Result<(), SubstrateError>; + + /// Ask relay to relay source header with given number to the target chain. + /// + /// Depending on implementation, on-demand relay may also relay `required_header` ancestors + /// (e.g. if they're mandatory), or its descendants. The request is considered complete if + /// the best avbailable header at the target chain has number that is larger than or equal + /// to the `required_header`. + async fn require_more_headers(&self, required_header: BlockNumberOf); + + /// Ask relay to prove source `required_header` to the `TargetChain`. + /// + /// Returns number of header that is proved (it may be the `required_header` or one of its + /// descendants) and calls for delivering the proof. + async fn prove_header( + &self, + required_header: BlockNumberOf, + ) -> Result<(HeaderIdOf, Vec>), SubstrateError>; +} diff --git a/bridges/relays/lib-substrate-relay/src/on_demand/parachains.rs b/bridges/relays/lib-substrate-relay/src/on_demand/parachains.rs new file mode 100644 index 0000000000000000000000000000000000000000..f67c002bba7f9c61925cb83e96433dbd40db7d4b --- /dev/null +++ b/bridges/relays/lib-substrate-relay/src/on_demand/parachains.rs @@ -0,0 +1,1033 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! On-demand Substrate -> Substrate parachain finality relay. + +use crate::{ + messages_source::best_finalized_peer_header_at_self, + on_demand::OnDemandRelay, + parachains::{ + source::ParachainsSource, target::ParachainsTarget, ParachainsPipelineAdapter, + SubmitParachainHeadsCallBuilder, SubstrateParachainsPipeline, + }, + TransactionParams, +}; + +use async_std::{ + channel::{unbounded, Receiver, Sender}, + sync::{Arc, Mutex}, +}; +use async_trait::async_trait; +use bp_polkadot_core::parachains::{ParaHash, ParaId}; +use bp_runtime::HeaderIdProvider; +use futures::{select, FutureExt}; +use num_traits::Zero; +use pallet_bridge_parachains::{RelayBlockHash, RelayBlockHasher, RelayBlockNumber}; +use parachains_relay::parachains_loop::{AvailableHeader, SourceClient, TargetClient}; +use relay_substrate_client::{ + is_ancient_block, AccountIdOf, AccountKeyPairOf, BlockNumberOf, CallOf, Chain, Client, + Error as SubstrateError, HashOf, HeaderIdOf, ParachainBase, +}; +use relay_utils::{ + metrics::MetricsParams, relay_loop::Client as RelayClient, BlockNumberBase, FailedClient, + HeaderId, UniqueSaturatedInto, +}; +use std::fmt::Debug; + +/// On-demand Substrate <-> Substrate parachain finality relay. +/// +/// This relay may be requested to sync more parachain headers, whenever some other relay +/// (e.g. messages relay) needs it to continue its regular work. When enough parachain headers +/// are relayed, on-demand stops syncing headers. +#[derive(Clone)] +pub struct OnDemandParachainsRelay { + /// Relay task name. + relay_task_name: String, + /// Channel used to communicate with background task and ask for relay of parachain heads. + required_header_number_sender: Sender>, + /// Source relay chain client. + source_relay_client: Client, + /// Target chain client. + target_client: Client, + /// On-demand relay chain relay. + on_demand_source_relay_to_target_headers: + Arc>, +} + +impl OnDemandParachainsRelay

{ + /// Create new on-demand parachains relay. + /// + /// Note that the argument is the source relay chain client, not the parachain client. + /// That's because parachain finality is determined by the relay chain and we don't + /// need to connect to the parachain itself here. + pub fn new( + source_relay_client: Client, + target_client: Client, + target_transaction_params: TransactionParams>, + on_demand_source_relay_to_target_headers: Arc< + dyn OnDemandRelay, + >, + ) -> Self + where + P::SourceParachain: Chain, + P::SourceRelayChain: + Chain, + AccountIdOf: + From< as sp_core::Pair>::Public>, + { + let (required_header_number_sender, required_header_number_receiver) = unbounded(); + let this = OnDemandParachainsRelay { + relay_task_name: on_demand_parachains_relay_name::( + ), + required_header_number_sender, + source_relay_client: source_relay_client.clone(), + target_client: target_client.clone(), + on_demand_source_relay_to_target_headers: on_demand_source_relay_to_target_headers + .clone(), + }; + async_std::task::spawn(async move { + background_task::

( + source_relay_client, + target_client, + target_transaction_params, + on_demand_source_relay_to_target_headers, + required_header_number_receiver, + ) + .await; + }); + + this + } +} + +#[async_trait] +impl OnDemandRelay + for OnDemandParachainsRelay

+where + P::SourceParachain: Chain, +{ + async fn reconnect(&self) -> Result<(), SubstrateError> { + // using clone is fine here (to avoid mut requirement), because clone on Client clones + // internal references + self.source_relay_client.clone().reconnect().await?; + self.target_client.clone().reconnect().await?; + // we'll probably need to reconnect relay chain relayer clients also + self.on_demand_source_relay_to_target_headers.reconnect().await + } + + async fn require_more_headers(&self, required_header: BlockNumberOf) { + if let Err(e) = self.required_header_number_sender.send(required_header).await { + log::trace!( + target: "bridge", + "[{}] Failed to request {} header {:?}: {:?}", + self.relay_task_name, + P::SourceParachain::NAME, + required_header, + e, + ); + } + } + + /// Ask relay to prove source `required_header` to the `TargetChain`. + async fn prove_header( + &self, + required_parachain_header: BlockNumberOf, + ) -> Result<(HeaderIdOf, Vec>), SubstrateError> { + // select headers to prove + let parachains_source = ParachainsSource::

::new( + self.source_relay_client.clone(), + Arc::new(Mutex::new(AvailableHeader::Missing)), + ); + let env = (self, ¶chains_source); + let (need_to_prove_relay_block, selected_relay_block, selected_parachain_block) = + select_headers_to_prove(env, required_parachain_header).await?; + + log::debug!( + target: "bridge", + "[{}] Requested to prove {} head {:?}. Selected to prove {} head {:?} and {} head {:?}", + self.relay_task_name, + P::SourceParachain::NAME, + required_parachain_header, + P::SourceParachain::NAME, + selected_parachain_block, + P::SourceRelayChain::NAME, + if need_to_prove_relay_block { + Some(selected_relay_block) + } else { + None + }, + ); + + // now let's prove relay chain block (if needed) + let mut calls = Vec::new(); + let mut proved_relay_block = selected_relay_block; + if need_to_prove_relay_block { + let (relay_block, relay_prove_call) = self + .on_demand_source_relay_to_target_headers + .prove_header(selected_relay_block.number()) + .await?; + proved_relay_block = relay_block; + calls.extend(relay_prove_call); + } + + // despite what we've selected before (in `select_headers_to_prove` call), if headers relay + // have chose the different header (e.g. because there's no GRANDPA jusstification for it), + // we need to prove parachain head available at this header + let para_id = ParaId(P::SourceParachain::PARACHAIN_ID); + let mut proved_parachain_block = selected_parachain_block; + if proved_relay_block != selected_relay_block { + proved_parachain_block = parachains_source + .on_chain_para_head_id(proved_relay_block) + .await? + // this could happen e.g. if parachain has been offboarded? + .ok_or_else(|| { + SubstrateError::MissingRequiredParachainHead( + para_id, + proved_relay_block.number().unique_saturated_into(), + ) + })?; + + log::debug!( + target: "bridge", + "[{}] Selected to prove {} head {:?} and {} head {:?}. Instead proved {} head {:?} and {} head {:?}", + self.relay_task_name, + P::SourceParachain::NAME, + selected_parachain_block, + P::SourceRelayChain::NAME, + selected_relay_block, + P::SourceParachain::NAME, + proved_parachain_block, + P::SourceRelayChain::NAME, + proved_relay_block, + ); + } + + // and finally - prove parachain head + let (para_proof, para_hash) = + parachains_source.prove_parachain_head(proved_relay_block).await?; + calls.push(P::SubmitParachainHeadsCallBuilder::build_submit_parachain_heads_call( + proved_relay_block, + vec![(para_id, para_hash)], + para_proof, + )); + + Ok((proved_parachain_block, calls)) + } +} + +/// Background task that is responsible for starting parachain headers relay. +async fn background_task( + source_relay_client: Client, + target_client: Client, + target_transaction_params: TransactionParams>, + on_demand_source_relay_to_target_headers: Arc< + dyn OnDemandRelay, + >, + required_parachain_header_number_receiver: Receiver>, +) where + P::SourceParachain: Chain, + P::SourceRelayChain: + Chain, + AccountIdOf: From< as sp_core::Pair>::Public>, +{ + let relay_task_name = on_demand_parachains_relay_name::(); + let target_transactions_mortality = target_transaction_params.mortality; + + let mut relay_state = RelayState::Idle; + let mut required_parachain_header_number = Zero::zero(); + let required_para_header_ref = Arc::new(Mutex::new(AvailableHeader::Unavailable)); + + let mut restart_relay = true; + let parachains_relay_task = futures::future::Fuse::terminated(); + futures::pin_mut!(parachains_relay_task); + + let mut parachains_source = + ParachainsSource::

::new(source_relay_client.clone(), required_para_header_ref.clone()); + let mut parachains_target = + ParachainsTarget::

::new(target_client.clone(), target_transaction_params.clone()); + + loop { + select! { + new_required_parachain_header_number = required_parachain_header_number_receiver.recv().fuse() => { + let new_required_parachain_header_number = match new_required_parachain_header_number { + Ok(new_required_parachain_header_number) => new_required_parachain_header_number, + Err(e) => { + log::error!( + target: "bridge", + "[{}] Background task has exited with error: {:?}", + relay_task_name, + e, + ); + + return; + }, + }; + + // keep in mind that we are not updating `required_para_header_ref` here, because + // then we'll be submitting all previous headers as well (while required relay headers are + // delivered) and we want to avoid that (to reduce cost) + if new_required_parachain_header_number > required_parachain_header_number { + log::trace!( + target: "bridge", + "[{}] More {} headers required. Going to sync up to the {}", + relay_task_name, + P::SourceParachain::NAME, + new_required_parachain_header_number, + ); + + required_parachain_header_number = new_required_parachain_header_number; + } + }, + _ = async_std::task::sleep(P::TargetChain::AVERAGE_BLOCK_INTERVAL).fuse() => {}, + _ = parachains_relay_task => { + // this should never happen in practice given the current code + restart_relay = true; + }, + } + + // the workflow of the on-demand parachains relay is: + // + // 1) message relay (or any other dependent relay) sees new message at parachain header + // `PH`; + // + // 2) it sees that the target chain does not know `PH`; + // + // 3) it asks on-demand parachains relay to relay `PH` to the target chain; + // + // Phase#1: relaying relay chain header + // + // 4) on-demand parachains relay waits for GRANDPA-finalized block of the source relay chain + // `RH` that is storing `PH` or its descendant. Let it be `PH'`; + // 5) it asks on-demand headers relay to relay `RH` to the target chain; + // 6) it waits until `RH` (or its descendant) is relayed to the target chain; + // + // Phase#2: relaying parachain header + // + // 7) on-demand parachains relay sets `ParachainsSource::maximal_header_number` to the + // `PH'.number()`. + // 8) parachains finality relay sees that the parachain head has been updated and relays + // `PH'` to the target chain. + + // select headers to relay + let relay_data = read_relay_data( + ¶chains_source, + ¶chains_target, + required_parachain_header_number, + ) + .await; + match relay_data { + Ok(relay_data) => { + let prev_relay_state = relay_state; + relay_state = select_headers_to_relay(&relay_data, relay_state); + log::trace!( + target: "bridge", + "[{}] Selected new relay state: {:?} using old state {:?} and data {:?}", + relay_task_name, + relay_state, + prev_relay_state, + relay_data, + ); + }, + Err(failed_client) => { + relay_utils::relay_loop::reconnect_failed_client( + failed_client, + relay_utils::relay_loop::RECONNECT_DELAY, + &mut parachains_source, + &mut parachains_target, + ) + .await; + continue + }, + } + + // we have selected our new 'state' => let's notify our source clients about our new + // requirements + match relay_state { + RelayState::Idle => (), + RelayState::RelayingRelayHeader(required_relay_header) => { + on_demand_source_relay_to_target_headers + .require_more_headers(required_relay_header) + .await; + }, + RelayState::RelayingParaHeader(required_para_header) => { + *required_para_header_ref.lock().await = + AvailableHeader::Available(required_para_header); + }, + } + + // start/restart relay + if restart_relay { + let stall_timeout = relay_substrate_client::transaction_stall_timeout( + target_transactions_mortality, + P::TargetChain::AVERAGE_BLOCK_INTERVAL, + relay_utils::STALL_TIMEOUT, + ); + + log::info!( + target: "bridge", + "[{}] Starting on-demand-parachains relay task\n\t\ + Tx mortality: {:?} (~{}m)\n\t\ + Stall timeout: {:?}", + relay_task_name, + target_transactions_mortality, + stall_timeout.as_secs_f64() / 60.0f64, + stall_timeout, + ); + + parachains_relay_task.set( + parachains_relay::parachains_loop::run( + parachains_source.clone(), + parachains_target.clone(), + MetricsParams::disabled(), + futures::future::pending(), + ) + .fuse(), + ); + + restart_relay = false; + } + } +} + +/// On-demand parachains relay task name. +fn on_demand_parachains_relay_name() -> String { + format!("{}-to-{}-on-demand-parachain", SourceChain::NAME, TargetChain::NAME) +} + +/// On-demand relay state. +#[derive(Clone, Copy, Debug, PartialEq)] +enum RelayState { + /// On-demand relay is not doing anything. + Idle, + /// Relaying given relay header to relay given parachain header later. + RelayingRelayHeader(RelayNumber), + /// Relaying given parachain header. + RelayingParaHeader(HeaderId), +} + +/// Data gathered from source and target clients, used by on-demand relay. +#[derive(Debug)] +struct RelayData { + /// Parachain header number that is required at the target chain. + pub required_para_header: ParaNumber, + /// Parachain header number, known to the target chain. + pub para_header_at_target: Option, + /// Parachain header id, known to the source (relay) chain. + pub para_header_at_source: Option>, + /// Parachain header, that is available at the source relay chain at `relay_header_at_target` + /// block. + /// + /// May be `None` if there's no `relay_header_at_target` yet, or if the + /// `relay_header_at_target` is too old and we think its state has been pruned. + pub para_header_at_relay_header_at_target: Option>, + /// Relay header number at the source chain. + pub relay_header_at_source: RelayNumber, + /// Relay header number at the target chain. + pub relay_header_at_target: Option, +} + +/// Read required data from source and target clients. +async fn read_relay_data( + source: &ParachainsSource

, + target: &ParachainsTarget

, + required_header_number: BlockNumberOf, +) -> Result< + RelayData< + HashOf, + BlockNumberOf, + BlockNumberOf, + >, + FailedClient, +> +where + ParachainsTarget

: + TargetClient> + RelayClient, +{ + let map_target_err = |e| { + log::error!( + target: "bridge", + "[{}] Failed to read relay data from {} client: {:?}", + on_demand_parachains_relay_name::(), + P::TargetChain::NAME, + e, + ); + FailedClient::Target + }; + let map_source_err = |e| { + log::error!( + target: "bridge", + "[{}] Failed to read relay data from {} client: {:?}", + on_demand_parachains_relay_name::(), + P::SourceRelayChain::NAME, + e, + ); + FailedClient::Source + }; + + let best_target_block_hash = target.best_block().await.map_err(map_target_err)?.1; + let para_header_at_target = best_finalized_peer_header_at_self::< + P::TargetChain, + P::SourceParachain, + >(target.client(), best_target_block_hash) + .await; + // if there are no parachain heads at the target (`NoParachainHeadAtTarget`), we'll need to + // submit at least one. Otherwise the pallet will be treated as uninitialized and messages + // sync will stall. + let para_header_at_target = match para_header_at_target { + Ok(Some(para_header_at_target)) => Some(para_header_at_target.0), + Ok(None) => None, + Err(e) => return Err(map_target_err(e)), + }; + + let best_finalized_relay_header = + source.client().best_finalized_header().await.map_err(map_source_err)?; + let best_finalized_relay_block_id = best_finalized_relay_header.id(); + let para_header_at_source = source + .on_chain_para_head_id(best_finalized_relay_block_id) + .await + .map_err(map_source_err)?; + + let relay_header_at_source = best_finalized_relay_block_id.0; + let relay_header_at_target = best_finalized_peer_header_at_self::< + P::TargetChain, + P::SourceRelayChain, + >(target.client(), best_target_block_hash) + .await + .map_err(map_target_err)?; + + // if relay header at target is too old then its state may already be discarded at the source + // => just use `None` in this case + // + // the same is for case when there's no relay header at target at all + let available_relay_header_at_target = + relay_header_at_target.filter(|relay_header_at_target| { + !is_ancient_block(relay_header_at_target.number(), relay_header_at_source) + }); + let para_header_at_relay_header_at_target = + if let Some(available_relay_header_at_target) = available_relay_header_at_target { + source + .on_chain_para_head_id(available_relay_header_at_target) + .await + .map_err(map_source_err)? + } else { + None + }; + + Ok(RelayData { + required_para_header: required_header_number, + para_header_at_target, + para_header_at_source, + relay_header_at_source, + relay_header_at_target: relay_header_at_target + .map(|relay_header_at_target| relay_header_at_target.0), + para_header_at_relay_header_at_target, + }) +} + +/// Select relay and parachain headers that need to be relayed. +fn select_headers_to_relay( + data: &RelayData, + state: RelayState, +) -> RelayState +where + ParaHash: Clone, + ParaNumber: Copy + PartialOrd + Zero, + RelayNumber: Copy + Debug + Ord, +{ + // we can't do anything until **relay chain** bridge GRANDPA pallet is not initialized at the + // target chain + let relay_header_at_target = match data.relay_header_at_target { + Some(relay_header_at_target) => relay_header_at_target, + None => return RelayState::Idle, + }; + + // Process the `RelayingRelayHeader` state. + if let &RelayState::RelayingRelayHeader(relay_header_number) = &state { + if relay_header_at_target < relay_header_number { + // The required relay header hasn't yet been relayed. Ask / wait for it. + return state + } + + // We may switch to `RelayingParaHeader` if parachain head is available. + if let Some(para_header_at_relay_header_at_target) = + data.para_header_at_relay_header_at_target.as_ref() + { + return RelayState::RelayingParaHeader(para_header_at_relay_header_at_target.clone()) + } + + // else use the regular process - e.g. we may require to deliver new relay header first + } + + // Process the `RelayingParaHeader` state. + if let RelayState::RelayingParaHeader(para_header_id) = &state { + let para_header_at_target_or_zero = data.para_header_at_target.unwrap_or_else(Zero::zero); + if para_header_at_target_or_zero < para_header_id.0 { + // The required parachain header hasn't yet been relayed. Ask / wait for it. + return state + } + } + + // if we haven't read para head from the source, we can't yet do anything + let para_header_at_source = match data.para_header_at_source { + Some(ref para_header_at_source) => para_header_at_source.clone(), + None => return RelayState::Idle, + }; + + // if we have parachain head at the source, but no parachain heads at the target, we'll need + // to deliver at least one parachain head + let (required_para_header, para_header_at_target) = match data.para_header_at_target { + Some(para_header_at_target) => (data.required_para_header, para_header_at_target), + None => (para_header_at_source.0, Zero::zero()), + }; + + // if we have already satisfied our "customer", do nothing + if required_para_header <= para_header_at_target { + return RelayState::Idle + } + + // if required header is not available even at the source chain, let's wait + if required_para_header > para_header_at_source.0 { + return RelayState::Idle + } + + // we will always try to sync latest parachain/relay header, even if we've been asked for some + // its ancestor + + // we need relay chain header first + if relay_header_at_target < data.relay_header_at_source { + return RelayState::RelayingRelayHeader(data.relay_header_at_source) + } + + // if all relay headers synced, we may start directly with parachain header + RelayState::RelayingParaHeader(para_header_at_source) +} + +/// Environment for the `select_headers_to_prove` call. +#[async_trait] +trait SelectHeadersToProveEnvironment { + /// Returns associated parachain id. + fn parachain_id(&self) -> ParaId; + /// Returns best finalized relay block. + async fn best_finalized_relay_block_at_source( + &self, + ) -> Result, SubstrateError>; + /// Returns best finalized relay block that is known at `P::TargetChain`. + async fn best_finalized_relay_block_at_target( + &self, + ) -> Result, SubstrateError>; + /// Returns best finalized parachain block at given source relay chain block. + async fn best_finalized_para_block_at_source( + &self, + at_relay_block: HeaderId, + ) -> Result>, SubstrateError>; +} + +#[async_trait] +impl<'a, P: SubstrateParachainsPipeline> + SelectHeadersToProveEnvironment< + BlockNumberOf, + HashOf, + BlockNumberOf, + HashOf, + > for (&'a OnDemandParachainsRelay

, &'a ParachainsSource

) +{ + fn parachain_id(&self) -> ParaId { + ParaId(P::SourceParachain::PARACHAIN_ID) + } + + async fn best_finalized_relay_block_at_source( + &self, + ) -> Result, SubstrateError> { + Ok(self.0.source_relay_client.best_finalized_header().await?.id()) + } + + async fn best_finalized_relay_block_at_target( + &self, + ) -> Result, SubstrateError> { + Ok(crate::messages_source::read_client_state::( + &self.0.target_client, + None, + ) + .await? + .best_finalized_peer_at_best_self + .ok_or(SubstrateError::BridgePalletIsNotInitialized)?) + } + + async fn best_finalized_para_block_at_source( + &self, + at_relay_block: HeaderIdOf, + ) -> Result>, SubstrateError> { + self.1.on_chain_para_head_id(at_relay_block).await + } +} + +/// Given request to prove `required_parachain_header`, select actual headers that need to be +/// proved. +async fn select_headers_to_prove( + env: impl SelectHeadersToProveEnvironment, + required_parachain_header: PBN, +) -> Result<(bool, HeaderId, HeaderId), SubstrateError> +where + RBH: Copy, + RBN: BlockNumberBase, + PBH: Copy, + PBN: BlockNumberBase, +{ + // parachains proof also requires relay header proof. Let's first select relay block + // number that we'll be dealing with + let best_finalized_relay_block_at_source = env.best_finalized_relay_block_at_source().await?; + let best_finalized_relay_block_at_target = env.best_finalized_relay_block_at_target().await?; + + // if we can't prove `required_header` even using `best_finalized_relay_block_at_source`, we + // can't do anything here + // (this shall not actually happen, given current code, because we only require finalized + // headers) + let best_possible_parachain_block = env + .best_finalized_para_block_at_source(best_finalized_relay_block_at_source) + .await? + .filter(|best_possible_parachain_block| { + best_possible_parachain_block.number() >= required_parachain_header + }) + .ok_or(SubstrateError::MissingRequiredParachainHead( + env.parachain_id(), + required_parachain_header.unique_saturated_into(), + ))?; + + // we don't require source node to be archive, so we can't craft storage proofs using + // ancient headers. So if the `best_finalized_relay_block_at_target` is too ancient, we + // can't craft storage proofs using it + let may_use_state_at_best_finalized_relay_block_at_target = !is_ancient_block( + best_finalized_relay_block_at_target.number(), + best_finalized_relay_block_at_source.number(), + ); + + // now let's check if `required_header` may be proved using + // `best_finalized_relay_block_at_target` + let selection = if may_use_state_at_best_finalized_relay_block_at_target { + env.best_finalized_para_block_at_source(best_finalized_relay_block_at_target) + .await? + .filter(|best_finalized_para_block_at_target| { + best_finalized_para_block_at_target.number() >= required_parachain_header + }) + .map(|best_finalized_para_block_at_target| { + (false, best_finalized_relay_block_at_target, best_finalized_para_block_at_target) + }) + } else { + None + }; + + Ok(selection.unwrap_or(( + true, + best_finalized_relay_block_at_source, + best_possible_parachain_block, + ))) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn relay_waits_for_relay_header_to_be_delivered() { + assert_eq!( + select_headers_to_relay( + &RelayData { + required_para_header: 90, + para_header_at_target: Some(50), + para_header_at_source: Some(HeaderId(110, 110)), + relay_header_at_source: 800, + relay_header_at_target: Some(700), + para_header_at_relay_header_at_target: Some(HeaderId(100, 100)), + }, + RelayState::RelayingRelayHeader(750), + ), + RelayState::RelayingRelayHeader(750), + ); + } + + #[test] + fn relay_starts_relaying_requested_para_header_after_relay_header_is_delivered() { + assert_eq!( + select_headers_to_relay( + &RelayData { + required_para_header: 90, + para_header_at_target: Some(50), + para_header_at_source: Some(HeaderId(110, 110)), + relay_header_at_source: 800, + relay_header_at_target: Some(750), + para_header_at_relay_header_at_target: Some(HeaderId(100, 100)), + }, + RelayState::RelayingRelayHeader(750), + ), + RelayState::RelayingParaHeader(HeaderId(100, 100)), + ); + } + + #[test] + fn relay_selects_better_para_header_after_better_relay_header_is_delivered() { + assert_eq!( + select_headers_to_relay( + &RelayData { + required_para_header: 90, + para_header_at_target: Some(50), + para_header_at_source: Some(HeaderId(110, 110)), + relay_header_at_source: 800, + relay_header_at_target: Some(780), + para_header_at_relay_header_at_target: Some(HeaderId(105, 105)), + }, + RelayState::RelayingRelayHeader(750), + ), + RelayState::RelayingParaHeader(HeaderId(105, 105)), + ); + } + #[test] + fn relay_waits_for_para_header_to_be_delivered() { + assert_eq!( + select_headers_to_relay( + &RelayData { + required_para_header: 90, + para_header_at_target: Some(50), + para_header_at_source: Some(HeaderId(110, 110)), + relay_header_at_source: 800, + relay_header_at_target: Some(780), + para_header_at_relay_header_at_target: Some(HeaderId(105, 105)), + }, + RelayState::RelayingParaHeader(HeaderId(105, 105)), + ), + RelayState::RelayingParaHeader(HeaderId(105, 105)), + ); + } + + #[test] + fn relay_stays_idle_if_required_para_header_is_already_delivered() { + assert_eq!( + select_headers_to_relay( + &RelayData { + required_para_header: 90, + para_header_at_target: Some(105), + para_header_at_source: Some(HeaderId(110, 110)), + relay_header_at_source: 800, + relay_header_at_target: Some(780), + para_header_at_relay_header_at_target: Some(HeaderId(105, 105)), + }, + RelayState::Idle, + ), + RelayState::Idle, + ); + } + + #[test] + fn relay_waits_for_required_para_header_to_appear_at_source_1() { + assert_eq!( + select_headers_to_relay( + &RelayData { + required_para_header: 120, + para_header_at_target: Some(105), + para_header_at_source: None, + relay_header_at_source: 800, + relay_header_at_target: Some(780), + para_header_at_relay_header_at_target: Some(HeaderId(105, 105)), + }, + RelayState::Idle, + ), + RelayState::Idle, + ); + } + + #[test] + fn relay_waits_for_required_para_header_to_appear_at_source_2() { + assert_eq!( + select_headers_to_relay( + &RelayData { + required_para_header: 120, + para_header_at_target: Some(105), + para_header_at_source: Some(HeaderId(110, 110)), + relay_header_at_source: 800, + relay_header_at_target: Some(780), + para_header_at_relay_header_at_target: Some(HeaderId(105, 105)), + }, + RelayState::Idle, + ), + RelayState::Idle, + ); + } + + #[test] + fn relay_starts_relaying_relay_header_when_new_para_header_is_requested() { + assert_eq!( + select_headers_to_relay( + &RelayData { + required_para_header: 120, + para_header_at_target: Some(105), + para_header_at_source: Some(HeaderId(125, 125)), + relay_header_at_source: 800, + relay_header_at_target: Some(780), + para_header_at_relay_header_at_target: Some(HeaderId(105, 105)), + }, + RelayState::Idle, + ), + RelayState::RelayingRelayHeader(800), + ); + } + + #[test] + fn relay_starts_relaying_para_header_when_new_para_header_is_requested() { + assert_eq!( + select_headers_to_relay( + &RelayData { + required_para_header: 120, + para_header_at_target: Some(105), + para_header_at_source: Some(HeaderId(125, 125)), + relay_header_at_source: 800, + relay_header_at_target: Some(800), + para_header_at_relay_header_at_target: Some(HeaderId(125, 125)), + }, + RelayState::Idle, + ), + RelayState::RelayingParaHeader(HeaderId(125, 125)), + ); + } + + #[test] + fn relay_goes_idle_when_parachain_is_deregistered() { + assert_eq!( + select_headers_to_relay::( + &RelayData { + required_para_header: 120, + para_header_at_target: Some(105), + para_header_at_source: None, + relay_header_at_source: 800, + relay_header_at_target: Some(800), + para_header_at_relay_header_at_target: None, + }, + RelayState::RelayingRelayHeader(800), + ), + RelayState::Idle, + ); + } + + #[test] + fn relay_starts_relaying_first_parachain_header() { + assert_eq!( + select_headers_to_relay::( + &RelayData { + required_para_header: 0, + para_header_at_target: None, + para_header_at_source: Some(HeaderId(125, 125)), + relay_header_at_source: 800, + relay_header_at_target: Some(800), + para_header_at_relay_header_at_target: Some(HeaderId(125, 125)), + }, + RelayState::Idle, + ), + RelayState::RelayingParaHeader(HeaderId(125, 125)), + ); + } + + #[test] + fn relay_starts_relaying_relay_header_to_relay_first_parachain_header() { + assert_eq!( + select_headers_to_relay::( + &RelayData { + required_para_header: 0, + para_header_at_target: None, + para_header_at_source: Some(HeaderId(125, 125)), + relay_header_at_source: 800, + relay_header_at_target: Some(700), + para_header_at_relay_header_at_target: Some(HeaderId(125, 125)), + }, + RelayState::Idle, + ), + RelayState::RelayingRelayHeader(800), + ); + } + + // tuple is: + // + // - best_finalized_relay_block_at_source + // - best_finalized_relay_block_at_target + // - best_finalized_para_block_at_source at best_finalized_relay_block_at_source + // - best_finalized_para_block_at_source at best_finalized_relay_block_at_target + #[async_trait] + impl SelectHeadersToProveEnvironment for (u32, u32, u32, u32) { + fn parachain_id(&self) -> ParaId { + ParaId(0) + } + + async fn best_finalized_relay_block_at_source( + &self, + ) -> Result, SubstrateError> { + Ok(HeaderId(self.0, self.0)) + } + + async fn best_finalized_relay_block_at_target( + &self, + ) -> Result, SubstrateError> { + Ok(HeaderId(self.1, self.1)) + } + + async fn best_finalized_para_block_at_source( + &self, + at_relay_block: HeaderId, + ) -> Result>, SubstrateError> { + if at_relay_block.0 == self.0 { + Ok(Some(HeaderId(self.2, self.2))) + } else if at_relay_block.0 == self.1 { + Ok(Some(HeaderId(self.3, self.3))) + } else { + Ok(None) + } + } + } + + #[async_std::test] + async fn select_headers_to_prove_returns_err_if_required_para_block_is_missing_at_source() { + assert!(matches!( + select_headers_to_prove((20_u32, 10_u32, 200_u32, 100_u32), 300_u32,).await, + Err(SubstrateError::MissingRequiredParachainHead(ParaId(0), 300_u64)), + )); + } + + #[async_std::test] + async fn select_headers_to_prove_fails_to_use_existing_ancient_relay_block() { + assert_eq!( + select_headers_to_prove((220_u32, 10_u32, 200_u32, 100_u32), 100_u32,) + .await + .map_err(drop), + Ok((true, HeaderId(220, 220), HeaderId(200, 200))), + ); + } + + #[async_std::test] + async fn select_headers_to_prove_is_able_to_use_existing_recent_relay_block() { + assert_eq!( + select_headers_to_prove((40_u32, 10_u32, 200_u32, 100_u32), 100_u32,) + .await + .map_err(drop), + Ok((false, HeaderId(10, 10), HeaderId(100, 100))), + ); + } + + #[async_std::test] + async fn select_headers_to_prove_uses_new_relay_block() { + assert_eq!( + select_headers_to_prove((20_u32, 10_u32, 200_u32, 100_u32), 200_u32,) + .await + .map_err(drop), + Ok((true, HeaderId(20, 20), HeaderId(200, 200))), + ); + } +} diff --git a/bridges/relays/lib-substrate-relay/src/parachains/mod.rs b/bridges/relays/lib-substrate-relay/src/parachains/mod.rs new file mode 100644 index 0000000000000000000000000000000000000000..722f9b61f9f08d87dac3bd95a0780d8422097a38 --- /dev/null +++ b/bridges/relays/lib-substrate-relay/src/parachains/mod.rs @@ -0,0 +1,108 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Types and functions intended to ease adding of new Substrate -> Substrate +//! parachain finality proofs synchronization pipelines. + +use async_trait::async_trait; +use bp_polkadot_core::parachains::{ParaHash, ParaHeadsProof, ParaId}; +use pallet_bridge_parachains::{ + Call as BridgeParachainsCall, Config as BridgeParachainsConfig, RelayBlockHash, + RelayBlockHasher, RelayBlockNumber, +}; +use parachains_relay::ParachainsPipeline; +use relay_substrate_client::{ + CallOf, Chain, ChainWithTransactions, HeaderIdOf, Parachain, RelayChain, +}; +use std::{fmt::Debug, marker::PhantomData}; + +pub mod source; +pub mod target; + +/// Substrate -> Substrate parachain finality proofs synchronization pipeline. +/// +/// This is currently restricted to the single parachain, because it is how it +/// will be used (at least) initially. +#[async_trait] +pub trait SubstrateParachainsPipeline: 'static + Clone + Debug + Send + Sync { + /// Headers of this parachain are submitted to the `Self::TargetChain`. + type SourceParachain: Parachain; + /// Relay chain that is storing headers of `Self::SourceParachain`. + type SourceRelayChain: RelayChain; + /// Target chain where `Self::SourceParachain` headers are submitted. + type TargetChain: ChainWithTransactions; + + /// How submit parachains heads call is built? + type SubmitParachainHeadsCallBuilder: SubmitParachainHeadsCallBuilder; +} + +/// Adapter that allows all `SubstrateParachainsPipeline` to act as `ParachainsPipeline`. +#[derive(Clone, Debug)] +pub struct ParachainsPipelineAdapter { + _phantom: PhantomData

, +} + +impl ParachainsPipeline for ParachainsPipelineAdapter

{ + type SourceParachain = P::SourceParachain; + type SourceRelayChain = P::SourceRelayChain; + type TargetChain = P::TargetChain; +} + +/// Different ways of building `submit_parachain_heads` calls. +pub trait SubmitParachainHeadsCallBuilder: + 'static + Send + Sync +{ + /// Given parachains and their heads proof, build call of `submit_parachain_heads` + /// function of bridge parachains module at the target chain. + fn build_submit_parachain_heads_call( + at_relay_block: HeaderIdOf, + parachains: Vec<(ParaId, ParaHash)>, + parachain_heads_proof: ParaHeadsProof, + ) -> CallOf; +} + +/// Building `submit_parachain_heads` call when you have direct access to the target +/// chain runtime. +pub struct DirectSubmitParachainHeadsCallBuilder { + _phantom: PhantomData<(P, R, I)>, +} + +impl SubmitParachainHeadsCallBuilder

for DirectSubmitParachainHeadsCallBuilder +where + P: SubstrateParachainsPipeline, + P::SourceRelayChain: Chain, + R: BridgeParachainsConfig + Send + Sync, + I: 'static + Send + Sync, + R::BridgedChain: bp_runtime::Chain< + BlockNumber = RelayBlockNumber, + Hash = RelayBlockHash, + Hasher = RelayBlockHasher, + >, + CallOf: From>, +{ + fn build_submit_parachain_heads_call( + at_relay_block: HeaderIdOf, + parachains: Vec<(ParaId, ParaHash)>, + parachain_heads_proof: ParaHeadsProof, + ) -> CallOf { + BridgeParachainsCall::::submit_parachain_heads { + at_relay_block: (at_relay_block.0, at_relay_block.1), + parachains, + parachain_heads_proof, + } + .into() + } +} diff --git a/bridges/relays/lib-substrate-relay/src/parachains/source.rs b/bridges/relays/lib-substrate-relay/src/parachains/source.rs new file mode 100644 index 0000000000000000000000000000000000000000..4cc512b9d9b45c7334ffb121c1a8613b7f118550 --- /dev/null +++ b/bridges/relays/lib-substrate-relay/src/parachains/source.rs @@ -0,0 +1,181 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Parachain heads source. + +use crate::parachains::{ParachainsPipelineAdapter, SubstrateParachainsPipeline}; + +use async_std::sync::{Arc, Mutex}; +use async_trait::async_trait; +use bp_parachains::parachain_head_storage_key_at_source; +use bp_polkadot_core::parachains::{ParaHash, ParaHead, ParaHeadsProof, ParaId}; +use bp_runtime::HeaderIdProvider; +use codec::Decode; +use parachains_relay::parachains_loop::{AvailableHeader, SourceClient}; +use relay_substrate_client::{ + is_ancient_block, Chain, Client, Error as SubstrateError, HeaderIdOf, HeaderOf, ParachainBase, + RelayChain, +}; +use relay_utils::relay_loop::Client as RelayClient; + +/// Shared updatable reference to the maximal parachain header id that we want to sync from the +/// source. +pub type RequiredHeaderIdRef = Arc>>>; + +/// Substrate client as parachain heads source. +#[derive(Clone)] +pub struct ParachainsSource { + client: Client, + max_head_id: RequiredHeaderIdRef, +} + +impl ParachainsSource

{ + /// Creates new parachains source client. + pub fn new( + client: Client, + max_head_id: RequiredHeaderIdRef, + ) -> Self { + ParachainsSource { client, max_head_id } + } + + /// Returns reference to the underlying RPC client. + pub fn client(&self) -> &Client { + &self.client + } + + /// Return decoded head of given parachain. + pub async fn on_chain_para_head_id( + &self, + at_block: HeaderIdOf, + ) -> Result>, SubstrateError> { + let para_id = ParaId(P::SourceParachain::PARACHAIN_ID); + let storage_key = + parachain_head_storage_key_at_source(P::SourceRelayChain::PARAS_PALLET_NAME, para_id); + let para_head = self.client.raw_storage_value(storage_key, Some(at_block.1)).await?; + let para_head = para_head.map(|h| ParaHead::decode(&mut &h.0[..])).transpose()?; + let para_head = match para_head { + Some(para_head) => para_head, + None => return Ok(None), + }; + let para_head: HeaderOf = Decode::decode(&mut ¶_head.0[..])?; + Ok(Some(para_head.id())) + } +} + +#[async_trait] +impl RelayClient for ParachainsSource

{ + type Error = SubstrateError; + + async fn reconnect(&mut self) -> Result<(), SubstrateError> { + self.client.reconnect().await + } +} + +#[async_trait] +impl SourceClient> + for ParachainsSource

+where + P::SourceParachain: Chain, +{ + async fn ensure_synced(&self) -> Result { + match self.client.ensure_synced().await { + Ok(_) => Ok(true), + Err(SubstrateError::ClientNotSynced(_)) => Ok(false), + Err(e) => Err(e), + } + } + + async fn parachain_head( + &self, + at_block: HeaderIdOf, + ) -> Result>, Self::Error> { + // if requested relay header is ancient, then we don't even want to try to read the + // parachain head - we simply return `Unavailable` + let best_block_number = self.client.best_finalized_header_number().await?; + if is_ancient_block(at_block.number(), best_block_number) { + log::trace!( + target: "bridge", + "{} block {:?} is ancient. Cannot prove the {} header there", + P::SourceRelayChain::NAME, + at_block, + P::SourceParachain::NAME, + ); + return Ok(AvailableHeader::Unavailable) + } + + // else - try to read head from the source client + let mut para_head_id = AvailableHeader::Missing; + if let Some(on_chain_para_head_id) = self.on_chain_para_head_id(at_block).await? { + // Never return head that is larger than requested. This way we'll never sync + // headers past `max_header_id`. + para_head_id = match *self.max_head_id.lock().await { + AvailableHeader::Unavailable => AvailableHeader::Unavailable, + AvailableHeader::Missing => { + // `max_header_id` is not set. There is no limit. + AvailableHeader::Available(on_chain_para_head_id) + }, + AvailableHeader::Available(max_head_id) if on_chain_para_head_id >= max_head_id => { + // We report at most `max_header_id`. + AvailableHeader::Available(std::cmp::min(on_chain_para_head_id, max_head_id)) + }, + AvailableHeader::Available(_) => { + // the `max_head_id` is not yet available at the source chain => wait and avoid + // syncing extra headers + AvailableHeader::Unavailable + }, + } + } + + Ok(para_head_id) + } + + async fn prove_parachain_head( + &self, + at_block: HeaderIdOf, + ) -> Result<(ParaHeadsProof, ParaHash), Self::Error> { + let parachain = ParaId(P::SourceParachain::PARACHAIN_ID); + let storage_key = + parachain_head_storage_key_at_source(P::SourceRelayChain::PARAS_PALLET_NAME, parachain); + let parachain_heads_proof = self + .client + .prove_storage(vec![storage_key.clone()], at_block.1) + .await? + .into_iter_nodes() + .collect(); + + // why we're reading parachain head here once again (it has already been read at the + // `parachain_head`)? that's because `parachain_head` sometimes returns obsolete parachain + // head and loop sometimes asks to prove this obsolete head and gets other (actual) head + // instead + // + // => since we want to provide proper hashes in our `submit_parachain_heads` call, we're + // rereading actual value here + let parachain_head = self + .client + .raw_storage_value(storage_key, Some(at_block.1)) + .await? + .map(|h| ParaHead::decode(&mut &h.0[..])) + .transpose()? + .ok_or_else(|| { + SubstrateError::Custom(format!( + "Failed to read expected parachain {parachain:?} head at {at_block:?}" + )) + })?; + let parachain_head_hash = parachain_head.hash(); + + Ok((ParaHeadsProof { storage_proof: parachain_heads_proof }, parachain_head_hash)) + } +} diff --git a/bridges/relays/lib-substrate-relay/src/parachains/target.rs b/bridges/relays/lib-substrate-relay/src/parachains/target.rs new file mode 100644 index 0000000000000000000000000000000000000000..6df7bc0a742a9f6693a422b994c7a9203f3c8b74 --- /dev/null +++ b/bridges/relays/lib-substrate-relay/src/parachains/target.rs @@ -0,0 +1,148 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Parachain heads target. + +use crate::{ + parachains::{ + ParachainsPipelineAdapter, SubmitParachainHeadsCallBuilder, SubstrateParachainsPipeline, + }, + TransactionParams, +}; + +use async_trait::async_trait; +use bp_polkadot_core::parachains::{ParaHash, ParaHeadsProof, ParaId}; +use bp_runtime::HeaderIdProvider; +use codec::Decode; +use parachains_relay::parachains_loop::TargetClient; +use relay_substrate_client::{ + AccountIdOf, AccountKeyPairOf, Chain, Client, Error as SubstrateError, HeaderIdOf, + ParachainBase, TransactionEra, TransactionTracker, UnsignedTransaction, +}; +use relay_utils::relay_loop::Client as RelayClient; +use sp_core::{Bytes, Pair}; + +/// Substrate client as parachain heads source. +pub struct ParachainsTarget { + client: Client, + transaction_params: TransactionParams>, +} + +impl ParachainsTarget

{ + /// Creates new parachains target client. + pub fn new( + client: Client, + transaction_params: TransactionParams>, + ) -> Self { + ParachainsTarget { client, transaction_params } + } + + /// Returns reference to the underlying RPC client. + pub fn client(&self) -> &Client { + &self.client + } +} + +impl Clone for ParachainsTarget

{ + fn clone(&self) -> Self { + ParachainsTarget { + client: self.client.clone(), + transaction_params: self.transaction_params.clone(), + } + } +} + +#[async_trait] +impl RelayClient for ParachainsTarget

{ + type Error = SubstrateError; + + async fn reconnect(&mut self) -> Result<(), SubstrateError> { + self.client.reconnect().await + } +} + +#[async_trait] +impl

TargetClient> for ParachainsTarget

+where + P: SubstrateParachainsPipeline, + AccountIdOf: From< as Pair>::Public>, +{ + type TransactionTracker = TransactionTracker>; + + async fn best_block(&self) -> Result, Self::Error> { + let best_header = self.client.best_header().await?; + let best_id = best_header.id(); + + Ok(best_id) + } + + async fn best_finalized_source_relay_chain_block( + &self, + at_block: &HeaderIdOf, + ) -> Result, Self::Error> { + self.client + .typed_state_call::<_, Option>>( + P::SourceRelayChain::BEST_FINALIZED_HEADER_ID_METHOD.into(), + (), + Some(at_block.1), + ) + .await? + .map(Ok) + .unwrap_or(Err(SubstrateError::BridgePalletIsNotInitialized)) + } + + async fn parachain_head( + &self, + at_block: HeaderIdOf, + ) -> Result>, Self::Error> { + let encoded_best_finalized_source_para_block = self + .client + .state_call( + P::SourceParachain::BEST_FINALIZED_HEADER_ID_METHOD.into(), + Bytes(Vec::new()), + Some(at_block.1), + ) + .await?; + + Ok(Option::>::decode( + &mut &encoded_best_finalized_source_para_block.0[..], + ) + .map_err(SubstrateError::ResponseParseFailed)?) + } + + async fn submit_parachain_head_proof( + &self, + at_relay_block: HeaderIdOf, + updated_head_hash: ParaHash, + proof: ParaHeadsProof, + ) -> Result { + let transaction_params = self.transaction_params.clone(); + let call = P::SubmitParachainHeadsCallBuilder::build_submit_parachain_heads_call( + at_relay_block, + vec![(ParaId(P::SourceParachain::PARACHAIN_ID), updated_head_hash)], + proof, + ); + self.client + .submit_and_watch_signed_extrinsic( + &transaction_params.signer, + move |best_block_id, transaction_nonce| { + Ok(UnsignedTransaction::new(call.into(), transaction_nonce) + .era(TransactionEra::new(best_block_id, transaction_params.mortality))) + }, + ) + .await + } +} diff --git a/bridges/relays/messages/Cargo.toml b/bridges/relays/messages/Cargo.toml new file mode 100644 index 0000000000000000000000000000000000000000..570e11c0da6feeaa7bbbbd76a845df51444a10cb --- /dev/null +++ b/bridges/relays/messages/Cargo.toml @@ -0,0 +1,29 @@ +[package] +name = "messages-relay" +version = "0.1.0" +authors.workspace = true +edition.workspace = true +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" +repository.workspace = true +publish = false + +[lints] +workspace = true + +[dependencies] +async-std = { version = "1.9.0", features = ["attributes"] } +async-trait = "0.1.79" +env_logger = "0.11" +futures = "0.3.30" +hex = "0.4" +log = { workspace = true } +num-traits = "0.2" +parking_lot = "0.12.1" + +# Bridge Dependencies + +bp-messages = { path = "../../primitives/messages" } +finality-relay = { path = "../finality" } +relay-utils = { path = "../utils" } + +sp-arithmetic = { path = "../../../substrate/primitives/arithmetic" } diff --git a/bridges/relays/messages/src/lib.rs b/bridges/relays/messages/src/lib.rs new file mode 100644 index 0000000000000000000000000000000000000000..9c62cee5ee3db1e0b8825d2893d53422bf44a33c --- /dev/null +++ b/bridges/relays/messages/src/lib.rs @@ -0,0 +1,37 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Relaying [`pallet-bridge-messages`](../pallet_bridge_messages/index.html) application specific +//! data. Message lane allows sending arbitrary messages between bridged chains. This +//! module provides entrypoint that starts reading messages from given message lane +//! of source chain and submits proof-of-message-at-source-chain transactions to the +//! target chain. Additionally, proofs-of-messages-delivery are sent back from the +//! target chain to the source chain. + +// required for futures::select! +#![recursion_limit = "1024"] +#![warn(missing_docs)] + +mod metrics; + +pub mod message_lane; +pub mod message_lane_loop; + +mod message_race_delivery; +mod message_race_limits; +mod message_race_loop; +mod message_race_receiving; +mod message_race_strategy; diff --git a/bridges/relays/messages/src/message_lane.rs b/bridges/relays/messages/src/message_lane.rs new file mode 100644 index 0000000000000000000000000000000000000000..5c9728ad93abd5aa1ea9b2fc77b2a6f9968539f6 --- /dev/null +++ b/bridges/relays/messages/src/message_lane.rs @@ -0,0 +1,71 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! One-way message lane types. Within single one-way lane we have three 'races' where we try to: +//! +//! 1) relay new messages from source to target node; +//! 2) relay proof-of-delivery from target to source node. + +use num_traits::{SaturatingAdd, Zero}; +use relay_utils::{BlockNumberBase, HeaderId}; +use sp_arithmetic::traits::AtLeast32BitUnsigned; +use std::{fmt::Debug, ops::Sub}; + +/// One-way message lane. +pub trait MessageLane: 'static + Clone + Send + Sync { + /// Name of the messages source. + const SOURCE_NAME: &'static str; + /// Name of the messages target. + const TARGET_NAME: &'static str; + + /// Messages proof. + type MessagesProof: Clone + Debug + Send + Sync; + /// Messages receiving proof. + type MessagesReceivingProof: Clone + Debug + Send + Sync; + + /// The type of the source chain token balance, that is used to: + /// + /// 1) pay transaction fees; + /// 2) pay message delivery and dispatch fee; + /// 3) pay relayer rewards. + type SourceChainBalance: AtLeast32BitUnsigned + + Clone + + Copy + + Debug + + PartialOrd + + Sub + + SaturatingAdd + + Zero + + Send + + Sync; + /// Number of the source header. + type SourceHeaderNumber: BlockNumberBase; + /// Hash of the source header. + type SourceHeaderHash: Clone + Debug + Default + PartialEq + Send + Sync; + + /// Number of the target header. + type TargetHeaderNumber: BlockNumberBase; + /// Hash of the target header. + type TargetHeaderHash: Clone + Debug + Default + PartialEq + Send + Sync; +} + +/// Source header id within given one-way message lane. +pub type SourceHeaderIdOf

= + HeaderId<

::SourceHeaderHash,

::SourceHeaderNumber>; + +/// Target header id within given one-way message lane. +pub type TargetHeaderIdOf

= + HeaderId<

::TargetHeaderHash,

::TargetHeaderNumber>; diff --git a/bridges/relays/messages/src/message_lane_loop.rs b/bridges/relays/messages/src/message_lane_loop.rs new file mode 100644 index 0000000000000000000000000000000000000000..b681d86d2ae8fadb6b0d5b5277de5a1285533d36 --- /dev/null +++ b/bridges/relays/messages/src/message_lane_loop.rs @@ -0,0 +1,1277 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Message delivery loop. Designed to work with messages pallet. +//! +//! Single relay instance delivers messages of single lane in single direction. +//! To serve two-way lane, you would need two instances of relay. +//! To serve N two-way lanes, you would need N*2 instances of relay. +//! +//! Please keep in mind that the best header in this file is actually best +//! finalized header. I.e. when talking about headers in lane context, we +//! only care about finalized headers. + +use std::{collections::BTreeMap, fmt::Debug, future::Future, ops::RangeInclusive, time::Duration}; + +use async_trait::async_trait; +use futures::{channel::mpsc::unbounded, future::FutureExt, stream::StreamExt}; + +use bp_messages::{LaneId, MessageNonce, UnrewardedRelayersState, Weight}; +use relay_utils::{ + interval, metrics::MetricsParams, process_future_result, relay_loop::Client as RelayClient, + retry_backoff, FailedClient, TransactionTracker, +}; + +use crate::{ + message_lane::{MessageLane, SourceHeaderIdOf, TargetHeaderIdOf}, + message_race_delivery::run as run_message_delivery_race, + message_race_receiving::run as run_message_receiving_race, + metrics::MessageLaneLoopMetrics, +}; + +/// Message lane loop configuration params. +#[derive(Debug, Clone)] +pub struct Params { + /// Id of lane this loop is servicing. + pub lane: LaneId, + /// Interval at which we ask target node about its updates. + pub source_tick: Duration, + /// Interval at which we ask target node about its updates. + pub target_tick: Duration, + /// Delay between moments when connection error happens and our reconnect attempt. + pub reconnect_delay: Duration, + /// Message delivery race parameters. + pub delivery_params: MessageDeliveryParams, +} + +/// Message delivery race parameters. +#[derive(Debug, Clone)] +pub struct MessageDeliveryParams { + /// Maximal number of unconfirmed relayer entries at the inbound lane. If there's that number + /// of entries in the `InboundLaneData::relayers` set, all new messages will be rejected until + /// reward payment will be proved (by including outbound lane state to the message delivery + /// transaction). + pub max_unrewarded_relayer_entries_at_target: MessageNonce, + /// Message delivery race will stop delivering messages if there are + /// `max_unconfirmed_nonces_at_target` unconfirmed nonces on the target node. The race would + /// continue once they're confirmed by the receiving race. + pub max_unconfirmed_nonces_at_target: MessageNonce, + /// Maximal number of relayed messages in single delivery transaction. + pub max_messages_in_single_batch: MessageNonce, + /// Maximal cumulative dispatch weight of relayed messages in single delivery transaction. + pub max_messages_weight_in_single_batch: Weight, + /// Maximal cumulative size of relayed messages in single delivery transaction. + pub max_messages_size_in_single_batch: u32, +} + +/// Message details. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub struct MessageDetails { + /// Message dispatch weight. + pub dispatch_weight: Weight, + /// Message size (number of bytes in encoded payload). + pub size: u32, + /// The relayer reward paid in the source chain tokens. + pub reward: SourceChainBalance, +} + +/// Messages details map. +pub type MessageDetailsMap = + BTreeMap>; + +/// Message delivery race proof parameters. +#[derive(Debug, PartialEq, Eq)] +pub struct MessageProofParameters { + /// Include outbound lane state proof? + pub outbound_state_proof_required: bool, + /// Cumulative dispatch weight of messages that we're building proof for. + pub dispatch_weight: Weight, +} + +/// Artifacts of submitting nonces proof. +pub struct NoncesSubmitArtifacts { + /// Submitted nonces range. + pub nonces: RangeInclusive, + /// Submitted transaction tracker. + pub tx_tracker: T, +} + +/// Batch transaction that already submit some headers and needs to be extended with +/// messages/delivery proof before sending. +pub trait BatchTransaction: Debug + Send + Sync { + /// Header that was required in the original call and which is bundled within this + /// batch transaction. + fn required_header_id(&self) -> HeaderId; +} + +/// Source client trait. +#[async_trait] +pub trait SourceClient: RelayClient { + /// Type of batch transaction that submits finality and message receiving proof. + type BatchTransaction: BatchTransaction> + Clone; + /// Transaction tracker to track submitted transactions. + type TransactionTracker: TransactionTracker>; + + /// Returns state of the client. + async fn state(&self) -> Result, Self::Error>; + + /// Get nonce of instance of latest generated message. + async fn latest_generated_nonce( + &self, + id: SourceHeaderIdOf

, + ) -> Result<(SourceHeaderIdOf

, MessageNonce), Self::Error>; + + /// Get nonce of the latest message, which receiving has been confirmed by the target chain. + async fn latest_confirmed_received_nonce( + &self, + id: SourceHeaderIdOf

, + ) -> Result<(SourceHeaderIdOf

, MessageNonce), Self::Error>; + + /// Returns mapping of message nonces, generated on this client, to their weights. + /// + /// Some messages may be missing from returned map, if corresponding messages were pruned at + /// the source chain. + async fn generated_message_details( + &self, + id: SourceHeaderIdOf

, + nonces: RangeInclusive, + ) -> Result, Self::Error>; + + /// Prove messages in inclusive range [begin; end]. + async fn prove_messages( + &self, + id: SourceHeaderIdOf

, + nonces: RangeInclusive, + proof_parameters: MessageProofParameters, + ) -> Result<(SourceHeaderIdOf

, RangeInclusive, P::MessagesProof), Self::Error>; + + /// Submit messages receiving proof. + async fn submit_messages_receiving_proof( + &self, + maybe_batch_tx: Option, + generated_at_block: TargetHeaderIdOf

, + proof: P::MessagesReceivingProof, + ) -> Result; + + /// We need given finalized target header on source to continue synchronization. + /// + /// We assume that the absence of header `id` has already been checked by caller. + /// + /// The client may return `Some(_)`, which means that nothing has happened yet and + /// the caller must generate and append message receiving proof to the batch transaction + /// to actually send it (along with required header) to the node. + /// + /// If function has returned `None`, it means that the caller now must wait for the + /// appearance of the target header `id` at the source client. + async fn require_target_header_on_source( + &self, + id: TargetHeaderIdOf

, + ) -> Result, Self::Error>; +} + +/// Target client trait. +#[async_trait] +pub trait TargetClient: RelayClient { + /// Type of batch transaction that submits finality and messages proof. + type BatchTransaction: BatchTransaction> + Clone; + /// Transaction tracker to track submitted transactions. + type TransactionTracker: TransactionTracker>; + + /// Returns state of the client. + async fn state(&self) -> Result, Self::Error>; + + /// Get nonce of latest received message. + async fn latest_received_nonce( + &self, + id: TargetHeaderIdOf

, + ) -> Result<(TargetHeaderIdOf

, MessageNonce), Self::Error>; + + /// Get nonce of the latest confirmed message. + async fn latest_confirmed_received_nonce( + &self, + id: TargetHeaderIdOf

, + ) -> Result<(TargetHeaderIdOf

, MessageNonce), Self::Error>; + + /// Get state of unrewarded relayers set at the inbound lane. + async fn unrewarded_relayers_state( + &self, + id: TargetHeaderIdOf

, + ) -> Result<(TargetHeaderIdOf

, UnrewardedRelayersState), Self::Error>; + + /// Prove messages receiving at given block. + async fn prove_messages_receiving( + &self, + id: TargetHeaderIdOf

, + ) -> Result<(TargetHeaderIdOf

, P::MessagesReceivingProof), Self::Error>; + + /// Submit messages proof. + async fn submit_messages_proof( + &self, + maybe_batch_tx: Option, + generated_at_header: SourceHeaderIdOf

, + nonces: RangeInclusive, + proof: P::MessagesProof, + ) -> Result, Self::Error>; + + /// We need given finalized source header on target to continue synchronization. + /// + /// The client may return `Some(_)`, which means that nothing has happened yet and + /// the caller must generate and append messages proof to the batch transaction + /// to actually send it (along with required header) to the node. + /// + /// If function has returned `None`, it means that the caller now must wait for the + /// appearance of the source header `id` at the target client. + async fn require_source_header_on_target( + &self, + id: SourceHeaderIdOf

, + ) -> Result, Self::Error>; +} + +/// State of the client. +#[derive(Clone, Debug, Default, PartialEq, Eq)] +pub struct ClientState { + /// The best header id of this chain. + pub best_self: SelfHeaderId, + /// Best finalized header id of this chain. + pub best_finalized_self: SelfHeaderId, + /// Best finalized header id of the peer chain read at the best block of this chain (at + /// `best_finalized_self`). + /// + /// It may be `None` e,g. if peer is a parachain and we haven't yet relayed any parachain + /// heads. + pub best_finalized_peer_at_best_self: Option, + /// Header id of the peer chain with the number, matching the + /// `best_finalized_peer_at_best_self`. + pub actual_best_finalized_peer_at_best_self: Option, +} + +/// State of source client in one-way message lane. +pub type SourceClientState

= ClientState, TargetHeaderIdOf

>; + +/// State of target client in one-way message lane. +pub type TargetClientState

= ClientState, SourceHeaderIdOf

>; + +/// Both clients state. +#[derive(Debug, Default)] +pub struct ClientsState { + /// Source client state. + pub source: Option>, + /// Target client state. + pub target: Option>, +} + +/// Return prefix that will be used by default to expose Prometheus metrics of the finality proofs +/// sync loop. +pub fn metrics_prefix(lane: &LaneId) -> String { + format!("{}_to_{}_MessageLane_{}", P::SOURCE_NAME, P::TARGET_NAME, hex::encode(lane)) +} + +/// Run message lane service loop. +pub async fn run( + params: Params, + source_client: impl SourceClient

, + target_client: impl TargetClient

, + metrics_params: MetricsParams, + exit_signal: impl Future + Send + 'static, +) -> Result<(), relay_utils::Error> { + let exit_signal = exit_signal.shared(); + relay_utils::relay_loop(source_client, target_client) + .reconnect_delay(params.reconnect_delay) + .with_metrics(metrics_params) + .loop_metric(MessageLaneLoopMetrics::new(Some(&metrics_prefix::

(¶ms.lane)))?)? + .expose() + .await? + .run(metrics_prefix::

(¶ms.lane), move |source_client, target_client, metrics| { + run_until_connection_lost( + params.clone(), + source_client, + target_client, + metrics, + exit_signal.clone(), + ) + }) + .await +} + +/// Run one-way message delivery loop until connection with target or source node is lost, or exit +/// signal is received. +async fn run_until_connection_lost, TC: TargetClient

>( + params: Params, + source_client: SC, + target_client: TC, + metrics_msg: Option, + exit_signal: impl Future, +) -> Result<(), FailedClient> { + let mut source_retry_backoff = retry_backoff(); + let mut source_client_is_online = false; + let mut source_state_required = true; + let source_state = source_client.state().fuse(); + let source_go_offline_future = futures::future::Fuse::terminated(); + let source_tick_stream = interval(params.source_tick).fuse(); + + let mut target_retry_backoff = retry_backoff(); + let mut target_client_is_online = false; + let mut target_state_required = true; + let target_state = target_client.state().fuse(); + let target_go_offline_future = futures::future::Fuse::terminated(); + let target_tick_stream = interval(params.target_tick).fuse(); + + let ( + (delivery_source_state_sender, delivery_source_state_receiver), + (delivery_target_state_sender, delivery_target_state_receiver), + ) = (unbounded(), unbounded()); + let delivery_race_loop = run_message_delivery_race( + source_client.clone(), + delivery_source_state_receiver, + target_client.clone(), + delivery_target_state_receiver, + metrics_msg.clone(), + params.delivery_params, + ) + .fuse(); + + let ( + (receiving_source_state_sender, receiving_source_state_receiver), + (receiving_target_state_sender, receiving_target_state_receiver), + ) = (unbounded(), unbounded()); + let receiving_race_loop = run_message_receiving_race( + source_client.clone(), + receiving_source_state_receiver, + target_client.clone(), + receiving_target_state_receiver, + metrics_msg.clone(), + ) + .fuse(); + + let exit_signal = exit_signal.fuse(); + + futures::pin_mut!( + source_state, + source_go_offline_future, + source_tick_stream, + target_state, + target_go_offline_future, + target_tick_stream, + delivery_race_loop, + receiving_race_loop, + exit_signal + ); + + loop { + futures::select! { + new_source_state = source_state => { + source_state_required = false; + + source_client_is_online = process_future_result( + new_source_state, + &mut source_retry_backoff, + |new_source_state| { + log::debug!( + target: "bridge", + "Received state from {} node: {:?}", + P::SOURCE_NAME, + new_source_state, + ); + let _ = delivery_source_state_sender.unbounded_send(new_source_state.clone()); + let _ = receiving_source_state_sender.unbounded_send(new_source_state.clone()); + + if let Some(metrics_msg) = metrics_msg.as_ref() { + metrics_msg.update_source_state::

(new_source_state); + } + }, + &mut source_go_offline_future, + async_std::task::sleep, + || format!("Error retrieving state from {} node", P::SOURCE_NAME), + ).fail_if_connection_error(FailedClient::Source)?; + }, + _ = source_go_offline_future => { + source_client_is_online = true; + }, + _ = source_tick_stream.next() => { + source_state_required = true; + }, + new_target_state = target_state => { + target_state_required = false; + + target_client_is_online = process_future_result( + new_target_state, + &mut target_retry_backoff, + |new_target_state| { + log::debug!( + target: "bridge", + "Received state from {} node: {:?}", + P::TARGET_NAME, + new_target_state, + ); + let _ = delivery_target_state_sender.unbounded_send(new_target_state.clone()); + let _ = receiving_target_state_sender.unbounded_send(new_target_state.clone()); + + if let Some(metrics_msg) = metrics_msg.as_ref() { + metrics_msg.update_target_state::

(new_target_state); + } + }, + &mut target_go_offline_future, + async_std::task::sleep, + || format!("Error retrieving state from {} node", P::TARGET_NAME), + ).fail_if_connection_error(FailedClient::Target)?; + }, + _ = target_go_offline_future => { + target_client_is_online = true; + }, + _ = target_tick_stream.next() => { + target_state_required = true; + }, + + delivery_error = delivery_race_loop => { + match delivery_error { + Ok(_) => unreachable!("only ends with error; qed"), + Err(err) => return Err(err), + } + }, + receiving_error = receiving_race_loop => { + match receiving_error { + Ok(_) => unreachable!("only ends with error; qed"), + Err(err) => return Err(err), + } + }, + + () = exit_signal => { + return Ok(()); + } + } + + if source_client_is_online && source_state_required { + log::debug!(target: "bridge", "Asking {} node about its state", P::SOURCE_NAME); + source_state.set(source_client.state().fuse()); + source_client_is_online = false; + } + + if target_client_is_online && target_state_required { + log::debug!(target: "bridge", "Asking {} node about its state", P::TARGET_NAME); + target_state.set(target_client.state().fuse()); + target_client_is_online = false; + } + } +} + +#[cfg(test)] +pub(crate) mod tests { + use std::sync::Arc; + + use futures::stream::StreamExt; + use parking_lot::Mutex; + + use relay_utils::{HeaderId, MaybeConnectionError, TrackedTransactionStatus}; + + use super::*; + + pub fn header_id(number: TestSourceHeaderNumber) -> TestSourceHeaderId { + HeaderId(number, number) + } + + pub type TestSourceChainBalance = u64; + pub type TestSourceHeaderId = HeaderId; + pub type TestTargetHeaderId = HeaderId; + + pub type TestMessagesProof = (RangeInclusive, Option); + pub type TestMessagesReceivingProof = MessageNonce; + + pub type TestSourceHeaderNumber = u64; + pub type TestSourceHeaderHash = u64; + + pub type TestTargetHeaderNumber = u64; + pub type TestTargetHeaderHash = u64; + + #[derive(Debug)] + pub struct TestError; + + impl MaybeConnectionError for TestError { + fn is_connection_error(&self) -> bool { + true + } + } + + #[derive(Clone)] + pub struct TestMessageLane; + + impl MessageLane for TestMessageLane { + const SOURCE_NAME: &'static str = "TestSource"; + const TARGET_NAME: &'static str = "TestTarget"; + + type MessagesProof = TestMessagesProof; + type MessagesReceivingProof = TestMessagesReceivingProof; + + type SourceChainBalance = TestSourceChainBalance; + type SourceHeaderNumber = TestSourceHeaderNumber; + type SourceHeaderHash = TestSourceHeaderHash; + + type TargetHeaderNumber = TestTargetHeaderNumber; + type TargetHeaderHash = TestTargetHeaderHash; + } + + #[derive(Clone, Debug)] + pub struct TestMessagesBatchTransaction { + required_header_id: TestSourceHeaderId, + } + + #[async_trait] + impl BatchTransaction for TestMessagesBatchTransaction { + fn required_header_id(&self) -> TestSourceHeaderId { + self.required_header_id + } + } + + #[derive(Clone, Debug)] + pub struct TestConfirmationBatchTransaction { + required_header_id: TestTargetHeaderId, + } + + #[async_trait] + impl BatchTransaction for TestConfirmationBatchTransaction { + fn required_header_id(&self) -> TestTargetHeaderId { + self.required_header_id + } + } + + #[derive(Clone, Debug)] + pub struct TestTransactionTracker(TrackedTransactionStatus); + + impl Default for TestTransactionTracker { + fn default() -> TestTransactionTracker { + TestTransactionTracker(TrackedTransactionStatus::Finalized(Default::default())) + } + } + + #[async_trait] + impl TransactionTracker for TestTransactionTracker { + type HeaderId = TestTargetHeaderId; + + async fn wait(self) -> TrackedTransactionStatus { + self.0 + } + } + + #[derive(Debug, Clone)] + pub struct TestClientData { + is_source_fails: bool, + is_source_reconnected: bool, + source_state: SourceClientState, + source_latest_generated_nonce: MessageNonce, + source_latest_confirmed_received_nonce: MessageNonce, + source_tracked_transaction_status: TrackedTransactionStatus, + submitted_messages_receiving_proofs: Vec, + is_target_fails: bool, + is_target_reconnected: bool, + target_state: SourceClientState, + target_latest_received_nonce: MessageNonce, + target_latest_confirmed_received_nonce: MessageNonce, + target_tracked_transaction_status: TrackedTransactionStatus, + submitted_messages_proofs: Vec, + target_to_source_batch_transaction: Option, + target_to_source_header_required: Option, + target_to_source_header_requirements: Vec, + source_to_target_batch_transaction: Option, + source_to_target_header_required: Option, + source_to_target_header_requirements: Vec, + } + + impl Default for TestClientData { + fn default() -> TestClientData { + TestClientData { + is_source_fails: false, + is_source_reconnected: false, + source_state: Default::default(), + source_latest_generated_nonce: 0, + source_latest_confirmed_received_nonce: 0, + source_tracked_transaction_status: TrackedTransactionStatus::Finalized(HeaderId( + 0, + Default::default(), + )), + submitted_messages_receiving_proofs: Vec::new(), + is_target_fails: false, + is_target_reconnected: false, + target_state: Default::default(), + target_latest_received_nonce: 0, + target_latest_confirmed_received_nonce: 0, + target_tracked_transaction_status: TrackedTransactionStatus::Finalized(HeaderId( + 0, + Default::default(), + )), + submitted_messages_proofs: Vec::new(), + target_to_source_batch_transaction: None, + target_to_source_header_required: None, + target_to_source_header_requirements: Vec::new(), + source_to_target_batch_transaction: None, + source_to_target_header_required: None, + source_to_target_header_requirements: Vec::new(), + } + } + } + + impl TestClientData { + fn receive_messages( + &mut self, + maybe_batch_tx: Option, + proof: TestMessagesProof, + ) { + self.target_state.best_self = + HeaderId(self.target_state.best_self.0 + 1, self.target_state.best_self.1 + 1); + self.target_state.best_finalized_self = self.target_state.best_self; + self.target_latest_received_nonce = *proof.0.end(); + if let Some(maybe_batch_tx) = maybe_batch_tx { + self.target_state.best_finalized_peer_at_best_self = + Some(maybe_batch_tx.required_header_id()); + } + if let Some(target_latest_confirmed_received_nonce) = proof.1 { + self.target_latest_confirmed_received_nonce = + target_latest_confirmed_received_nonce; + } + self.submitted_messages_proofs.push(proof); + } + + fn receive_messages_delivery_proof( + &mut self, + maybe_batch_tx: Option, + proof: TestMessagesReceivingProof, + ) { + self.source_state.best_self = + HeaderId(self.source_state.best_self.0 + 1, self.source_state.best_self.1 + 1); + self.source_state.best_finalized_self = self.source_state.best_self; + if let Some(maybe_batch_tx) = maybe_batch_tx { + self.source_state.best_finalized_peer_at_best_self = + Some(maybe_batch_tx.required_header_id()); + } + self.submitted_messages_receiving_proofs.push(proof); + self.source_latest_confirmed_received_nonce = proof; + } + } + + #[derive(Clone)] + pub struct TestSourceClient { + data: Arc>, + tick: Arc, + post_tick: Arc, + } + + impl Default for TestSourceClient { + fn default() -> Self { + TestSourceClient { + data: Arc::new(Mutex::new(TestClientData::default())), + tick: Arc::new(|_| {}), + post_tick: Arc::new(|_| {}), + } + } + } + + #[async_trait] + impl RelayClient for TestSourceClient { + type Error = TestError; + + async fn reconnect(&mut self) -> Result<(), TestError> { + { + let mut data = self.data.lock(); + (self.tick)(&mut data); + data.is_source_reconnected = true; + (self.post_tick)(&mut data); + } + Ok(()) + } + } + + #[async_trait] + impl SourceClient for TestSourceClient { + type BatchTransaction = TestConfirmationBatchTransaction; + type TransactionTracker = TestTransactionTracker; + + async fn state(&self) -> Result, TestError> { + let mut data = self.data.lock(); + (self.tick)(&mut data); + if data.is_source_fails { + return Err(TestError) + } + (self.post_tick)(&mut data); + Ok(data.source_state.clone()) + } + + async fn latest_generated_nonce( + &self, + id: SourceHeaderIdOf, + ) -> Result<(SourceHeaderIdOf, MessageNonce), TestError> { + let mut data = self.data.lock(); + (self.tick)(&mut data); + if data.is_source_fails { + return Err(TestError) + } + (self.post_tick)(&mut data); + Ok((id, data.source_latest_generated_nonce)) + } + + async fn latest_confirmed_received_nonce( + &self, + id: SourceHeaderIdOf, + ) -> Result<(SourceHeaderIdOf, MessageNonce), TestError> { + let mut data = self.data.lock(); + (self.tick)(&mut data); + (self.post_tick)(&mut data); + Ok((id, data.source_latest_confirmed_received_nonce)) + } + + async fn generated_message_details( + &self, + _id: SourceHeaderIdOf, + nonces: RangeInclusive, + ) -> Result, TestError> { + Ok(nonces + .map(|nonce| { + ( + nonce, + MessageDetails { + dispatch_weight: Weight::from_parts(1, 0), + size: 1, + reward: 1, + }, + ) + }) + .collect()) + } + + async fn prove_messages( + &self, + id: SourceHeaderIdOf, + nonces: RangeInclusive, + proof_parameters: MessageProofParameters, + ) -> Result< + (SourceHeaderIdOf, RangeInclusive, TestMessagesProof), + TestError, + > { + let mut data = self.data.lock(); + (self.tick)(&mut data); + (self.post_tick)(&mut data); + Ok(( + id, + nonces.clone(), + ( + nonces, + if proof_parameters.outbound_state_proof_required { + Some(data.source_latest_confirmed_received_nonce) + } else { + None + }, + ), + )) + } + + async fn submit_messages_receiving_proof( + &self, + maybe_batch_tx: Option, + _generated_at_block: TargetHeaderIdOf, + proof: TestMessagesReceivingProof, + ) -> Result { + let mut data = self.data.lock(); + (self.tick)(&mut data); + data.receive_messages_delivery_proof(maybe_batch_tx, proof); + (self.post_tick)(&mut data); + Ok(TestTransactionTracker(data.source_tracked_transaction_status)) + } + + async fn require_target_header_on_source( + &self, + id: TargetHeaderIdOf, + ) -> Result, Self::Error> { + let mut data = self.data.lock(); + data.target_to_source_header_required = Some(id); + data.target_to_source_header_requirements.push(id); + (self.tick)(&mut data); + (self.post_tick)(&mut data); + + Ok(data.target_to_source_batch_transaction.take().map(|mut tx| { + tx.required_header_id = id; + tx + })) + } + } + + #[derive(Clone)] + pub struct TestTargetClient { + data: Arc>, + tick: Arc, + post_tick: Arc, + } + + impl Default for TestTargetClient { + fn default() -> Self { + TestTargetClient { + data: Arc::new(Mutex::new(TestClientData::default())), + tick: Arc::new(|_| {}), + post_tick: Arc::new(|_| {}), + } + } + } + + #[async_trait] + impl RelayClient for TestTargetClient { + type Error = TestError; + + async fn reconnect(&mut self) -> Result<(), TestError> { + { + let mut data = self.data.lock(); + (self.tick)(&mut data); + data.is_target_reconnected = true; + (self.post_tick)(&mut data); + } + Ok(()) + } + } + + #[async_trait] + impl TargetClient for TestTargetClient { + type BatchTransaction = TestMessagesBatchTransaction; + type TransactionTracker = TestTransactionTracker; + + async fn state(&self) -> Result, TestError> { + let mut data = self.data.lock(); + (self.tick)(&mut data); + if data.is_target_fails { + return Err(TestError) + } + (self.post_tick)(&mut data); + Ok(data.target_state.clone()) + } + + async fn latest_received_nonce( + &self, + id: TargetHeaderIdOf, + ) -> Result<(TargetHeaderIdOf, MessageNonce), TestError> { + let mut data = self.data.lock(); + (self.tick)(&mut data); + if data.is_target_fails { + return Err(TestError) + } + (self.post_tick)(&mut data); + Ok((id, data.target_latest_received_nonce)) + } + + async fn unrewarded_relayers_state( + &self, + id: TargetHeaderIdOf, + ) -> Result<(TargetHeaderIdOf, UnrewardedRelayersState), TestError> { + Ok(( + id, + UnrewardedRelayersState { + unrewarded_relayer_entries: 0, + messages_in_oldest_entry: 0, + total_messages: 0, + last_delivered_nonce: 0, + }, + )) + } + + async fn latest_confirmed_received_nonce( + &self, + id: TargetHeaderIdOf, + ) -> Result<(TargetHeaderIdOf, MessageNonce), TestError> { + let mut data = self.data.lock(); + (self.tick)(&mut data); + if data.is_target_fails { + return Err(TestError) + } + (self.post_tick)(&mut data); + Ok((id, data.target_latest_confirmed_received_nonce)) + } + + async fn prove_messages_receiving( + &self, + id: TargetHeaderIdOf, + ) -> Result<(TargetHeaderIdOf, TestMessagesReceivingProof), TestError> { + Ok((id, self.data.lock().target_latest_received_nonce)) + } + + async fn submit_messages_proof( + &self, + maybe_batch_tx: Option, + _generated_at_header: SourceHeaderIdOf, + nonces: RangeInclusive, + proof: TestMessagesProof, + ) -> Result, TestError> { + let mut data = self.data.lock(); + (self.tick)(&mut data); + if data.is_target_fails { + return Err(TestError) + } + data.receive_messages(maybe_batch_tx, proof); + (self.post_tick)(&mut data); + Ok(NoncesSubmitArtifacts { + nonces, + tx_tracker: TestTransactionTracker(data.target_tracked_transaction_status), + }) + } + + async fn require_source_header_on_target( + &self, + id: SourceHeaderIdOf, + ) -> Result, Self::Error> { + let mut data = self.data.lock(); + data.source_to_target_header_required = Some(id); + data.source_to_target_header_requirements.push(id); + (self.tick)(&mut data); + (self.post_tick)(&mut data); + + Ok(data.source_to_target_batch_transaction.take().map(|mut tx| { + tx.required_header_id = id; + tx + })) + } + } + + fn run_loop_test( + data: Arc>, + source_tick: Arc, + source_post_tick: Arc, + target_tick: Arc, + target_post_tick: Arc, + exit_signal: impl Future + 'static + Send, + ) -> TestClientData { + async_std::task::block_on(async { + let source_client = TestSourceClient { + data: data.clone(), + tick: source_tick, + post_tick: source_post_tick, + }; + let target_client = TestTargetClient { + data: data.clone(), + tick: target_tick, + post_tick: target_post_tick, + }; + let _ = run( + Params { + lane: LaneId([0, 0, 0, 0]), + source_tick: Duration::from_millis(100), + target_tick: Duration::from_millis(100), + reconnect_delay: Duration::from_millis(0), + delivery_params: MessageDeliveryParams { + max_unrewarded_relayer_entries_at_target: 4, + max_unconfirmed_nonces_at_target: 4, + max_messages_in_single_batch: 4, + max_messages_weight_in_single_batch: Weight::from_parts(4, 0), + max_messages_size_in_single_batch: 4, + }, + }, + source_client, + target_client, + MetricsParams::disabled(), + exit_signal, + ) + .await; + let result = data.lock().clone(); + result + }) + } + + #[test] + fn message_lane_loop_is_able_to_recover_from_connection_errors() { + // with this configuration, source client will return Err, making source client + // reconnect. Then the target client will fail with Err + reconnect. Then we finally + // able to deliver messages. + let (exit_sender, exit_receiver) = unbounded(); + let result = run_loop_test( + Arc::new(Mutex::new(TestClientData { + is_source_fails: true, + source_state: ClientState { + best_self: HeaderId(0, 0), + best_finalized_self: HeaderId(0, 0), + best_finalized_peer_at_best_self: Some(HeaderId(0, 0)), + actual_best_finalized_peer_at_best_self: Some(HeaderId(0, 0)), + }, + source_latest_generated_nonce: 1, + target_state: ClientState { + best_self: HeaderId(0, 0), + best_finalized_self: HeaderId(0, 0), + best_finalized_peer_at_best_self: Some(HeaderId(0, 0)), + actual_best_finalized_peer_at_best_self: Some(HeaderId(0, 0)), + }, + target_latest_received_nonce: 0, + ..Default::default() + })), + Arc::new(|data: &mut TestClientData| { + if data.is_source_reconnected { + data.is_source_fails = false; + data.is_target_fails = true; + } + }), + Arc::new(|_| {}), + Arc::new(move |data: &mut TestClientData| { + if data.is_target_reconnected { + data.is_target_fails = false; + } + if data.target_state.best_finalized_peer_at_best_self.unwrap().0 < 10 { + data.target_state.best_finalized_peer_at_best_self = Some(HeaderId( + data.target_state.best_finalized_peer_at_best_self.unwrap().0 + 1, + data.target_state.best_finalized_peer_at_best_self.unwrap().0 + 1, + )); + } + if !data.submitted_messages_proofs.is_empty() { + exit_sender.unbounded_send(()).unwrap(); + } + }), + Arc::new(|_| {}), + exit_receiver.into_future().map(|(_, _)| ()), + ); + + assert_eq!(result.submitted_messages_proofs, vec![(1..=1, None)],); + } + + #[test] + fn message_lane_loop_is_able_to_recover_from_unsuccessful_transaction() { + // with this configuration, both source and target clients will mine their transactions, but + // their corresponding nonce won't be udpated => reconnect will happen + let (exit_sender, exit_receiver) = unbounded(); + let result = run_loop_test( + Arc::new(Mutex::new(TestClientData { + source_state: ClientState { + best_self: HeaderId(0, 0), + best_finalized_self: HeaderId(0, 0), + best_finalized_peer_at_best_self: Some(HeaderId(0, 0)), + actual_best_finalized_peer_at_best_self: Some(HeaderId(0, 0)), + }, + source_latest_generated_nonce: 1, + target_state: ClientState { + best_self: HeaderId(0, 0), + best_finalized_self: HeaderId(0, 0), + best_finalized_peer_at_best_self: Some(HeaderId(0, 0)), + actual_best_finalized_peer_at_best_self: Some(HeaderId(0, 0)), + }, + target_latest_received_nonce: 0, + ..Default::default() + })), + Arc::new(move |data: &mut TestClientData| { + // blocks are produced on every tick + data.source_state.best_self = + HeaderId(data.source_state.best_self.0 + 1, data.source_state.best_self.1 + 1); + data.source_state.best_finalized_self = data.source_state.best_self; + // syncing target headers -> source chain + if let Some(last_requirement) = data.target_to_source_header_requirements.last() { + if *last_requirement != + data.source_state.best_finalized_peer_at_best_self.unwrap() + { + data.source_state.best_finalized_peer_at_best_self = + Some(*last_requirement); + } + } + }), + Arc::new(move |data: &mut TestClientData| { + // if it is the first time we're submitting delivery proof, let's revert changes + // to source status => then the delivery confirmation transaction is "finalized", + // but the state is not altered + if data.submitted_messages_receiving_proofs.len() == 1 { + data.source_latest_confirmed_received_nonce = 0; + } + }), + Arc::new(move |data: &mut TestClientData| { + // blocks are produced on every tick + data.target_state.best_self = + HeaderId(data.target_state.best_self.0 + 1, data.target_state.best_self.1 + 1); + data.target_state.best_finalized_self = data.target_state.best_self; + // syncing source headers -> target chain + if let Some(last_requirement) = data.source_to_target_header_requirements.last() { + if *last_requirement != + data.target_state.best_finalized_peer_at_best_self.unwrap() + { + data.target_state.best_finalized_peer_at_best_self = + Some(*last_requirement); + } + } + // if source has received all messages receiving confirmations => stop + if data.source_latest_confirmed_received_nonce == 1 { + exit_sender.unbounded_send(()).unwrap(); + } + }), + Arc::new(move |data: &mut TestClientData| { + // if it is the first time we're submitting messages proof, let's revert changes + // to target status => then the messages delivery transaction is "finalized", but + // the state is not altered + if data.submitted_messages_proofs.len() == 1 { + data.target_latest_received_nonce = 0; + data.target_latest_confirmed_received_nonce = 0; + } + }), + exit_receiver.into_future().map(|(_, _)| ()), + ); + + assert_eq!(result.submitted_messages_proofs.len(), 2); + assert_eq!(result.submitted_messages_receiving_proofs.len(), 2); + } + + #[test] + fn message_lane_loop_works() { + let (exit_sender, exit_receiver) = unbounded(); + let result = run_loop_test( + Arc::new(Mutex::new(TestClientData { + source_state: ClientState { + best_self: HeaderId(10, 10), + best_finalized_self: HeaderId(10, 10), + best_finalized_peer_at_best_self: Some(HeaderId(0, 0)), + actual_best_finalized_peer_at_best_self: Some(HeaderId(0, 0)), + }, + source_latest_generated_nonce: 10, + target_state: ClientState { + best_self: HeaderId(0, 0), + best_finalized_self: HeaderId(0, 0), + best_finalized_peer_at_best_self: Some(HeaderId(0, 0)), + actual_best_finalized_peer_at_best_self: Some(HeaderId(0, 0)), + }, + target_latest_received_nonce: 0, + ..Default::default() + })), + Arc::new(|data: &mut TestClientData| { + // blocks are produced on every tick + data.source_state.best_self = + HeaderId(data.source_state.best_self.0 + 1, data.source_state.best_self.1 + 1); + data.source_state.best_finalized_self = data.source_state.best_self; + // headers relay must only be started when we need new target headers at source node + if data.target_to_source_header_required.is_some() { + assert!( + data.source_state.best_finalized_peer_at_best_self.unwrap().0 < + data.target_state.best_self.0 + ); + data.target_to_source_header_required = None; + } + // syncing target headers -> source chain + if let Some(last_requirement) = data.target_to_source_header_requirements.last() { + if *last_requirement != + data.source_state.best_finalized_peer_at_best_self.unwrap() + { + data.source_state.best_finalized_peer_at_best_self = + Some(*last_requirement); + } + } + }), + Arc::new(|_| {}), + Arc::new(move |data: &mut TestClientData| { + // blocks are produced on every tick + data.target_state.best_self = + HeaderId(data.target_state.best_self.0 + 1, data.target_state.best_self.1 + 1); + data.target_state.best_finalized_self = data.target_state.best_self; + // headers relay must only be started when we need new source headers at target node + if data.source_to_target_header_required.is_some() { + assert!( + data.target_state.best_finalized_peer_at_best_self.unwrap().0 < + data.source_state.best_self.0 + ); + data.source_to_target_header_required = None; + } + // syncing source headers -> target chain + if let Some(last_requirement) = data.source_to_target_header_requirements.last() { + if *last_requirement != + data.target_state.best_finalized_peer_at_best_self.unwrap() + { + data.target_state.best_finalized_peer_at_best_self = + Some(*last_requirement); + } + } + // if source has received all messages receiving confirmations => stop + if data.source_latest_confirmed_received_nonce == 10 { + exit_sender.unbounded_send(()).unwrap(); + } + }), + Arc::new(|_| {}), + exit_receiver.into_future().map(|(_, _)| ()), + ); + + // there are no strict restrictions on when reward confirmation should come + // (because `max_unconfirmed_nonces_at_target` is `100` in tests and this confirmation + // depends on the state of both clients) + // => we do not check it here + assert_eq!(result.submitted_messages_proofs[0].0, 1..=4); + assert_eq!(result.submitted_messages_proofs[1].0, 5..=8); + assert_eq!(result.submitted_messages_proofs[2].0, 9..=10); + assert!(!result.submitted_messages_receiving_proofs.is_empty()); + + // check that we have at least once required new source->target or target->source headers + assert!(!result.target_to_source_header_requirements.is_empty()); + assert!(!result.source_to_target_header_requirements.is_empty()); + } + + #[test] + fn message_lane_loop_works_with_batch_transactions() { + let (exit_sender, exit_receiver) = unbounded(); + let original_data = Arc::new(Mutex::new(TestClientData { + source_state: ClientState { + best_self: HeaderId(10, 10), + best_finalized_self: HeaderId(10, 10), + best_finalized_peer_at_best_self: Some(HeaderId(0, 0)), + actual_best_finalized_peer_at_best_self: Some(HeaderId(0, 0)), + }, + source_latest_generated_nonce: 10, + target_state: ClientState { + best_self: HeaderId(0, 0), + best_finalized_self: HeaderId(0, 0), + best_finalized_peer_at_best_self: Some(HeaderId(0, 0)), + actual_best_finalized_peer_at_best_self: Some(HeaderId(0, 0)), + }, + target_latest_received_nonce: 0, + ..Default::default() + })); + let result = run_loop_test( + original_data, + Arc::new(|_| {}), + Arc::new(move |data: &mut TestClientData| { + data.source_state.best_self = + HeaderId(data.source_state.best_self.0 + 1, data.source_state.best_self.1 + 1); + data.source_state.best_finalized_self = data.source_state.best_self; + if let Some(target_to_source_header_required) = + data.target_to_source_header_required.take() + { + data.target_to_source_batch_transaction = + Some(TestConfirmationBatchTransaction { + required_header_id: target_to_source_header_required, + }) + } + }), + Arc::new(|_| {}), + Arc::new(move |data: &mut TestClientData| { + data.target_state.best_self = + HeaderId(data.target_state.best_self.0 + 1, data.target_state.best_self.1 + 1); + data.target_state.best_finalized_self = data.target_state.best_self; + + if let Some(source_to_target_header_required) = + data.source_to_target_header_required.take() + { + data.source_to_target_batch_transaction = Some(TestMessagesBatchTransaction { + required_header_id: source_to_target_header_required, + }) + } + + if data.source_latest_confirmed_received_nonce == 10 { + exit_sender.unbounded_send(()).unwrap(); + } + }), + exit_receiver.into_future().map(|(_, _)| ()), + ); + + // there are no strict restrictions on when reward confirmation should come + // (because `max_unconfirmed_nonces_at_target` is `100` in tests and this confirmation + // depends on the state of both clients) + // => we do not check it here + assert_eq!(result.submitted_messages_proofs[0].0, 1..=4); + assert_eq!(result.submitted_messages_proofs[1].0, 5..=8); + assert_eq!(result.submitted_messages_proofs[2].0, 9..=10); + assert!(!result.submitted_messages_receiving_proofs.is_empty()); + + // check that we have at least once required new source->target or target->source headers + assert!(!result.target_to_source_header_requirements.is_empty()); + assert!(!result.source_to_target_header_requirements.is_empty()); + } +} diff --git a/bridges/relays/messages/src/message_race_delivery.rs b/bridges/relays/messages/src/message_race_delivery.rs new file mode 100644 index 0000000000000000000000000000000000000000..137deb5b74f757aa111d5652cbb251a94979e166 --- /dev/null +++ b/bridges/relays/messages/src/message_race_delivery.rs @@ -0,0 +1,1405 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +//! Message delivery race delivers proof-of-messages from "lane.source" to "lane.target". + +use std::{collections::VecDeque, marker::PhantomData, ops::RangeInclusive}; + +use async_trait::async_trait; +use futures::stream::FusedStream; + +use bp_messages::{MessageNonce, UnrewardedRelayersState, Weight}; +use relay_utils::FailedClient; + +use crate::{ + message_lane::{MessageLane, SourceHeaderIdOf, TargetHeaderIdOf}, + message_lane_loop::{ + MessageDeliveryParams, MessageDetailsMap, MessageProofParameters, NoncesSubmitArtifacts, + SourceClient as MessageLaneSourceClient, SourceClientState, + TargetClient as MessageLaneTargetClient, TargetClientState, + }, + message_race_limits::{MessageRaceLimits, RelayMessagesBatchReference}, + message_race_loop::{ + MessageRace, NoncesRange, RaceState, RaceStrategy, SourceClient, SourceClientNonces, + TargetClient, TargetClientNonces, + }, + message_race_strategy::BasicStrategy, + metrics::MessageLaneLoopMetrics, +}; + +/// Run message delivery race. +pub async fn run( + source_client: impl MessageLaneSourceClient

, + source_state_updates: impl FusedStream>, + target_client: impl MessageLaneTargetClient

, + target_state_updates: impl FusedStream>, + metrics_msg: Option, + params: MessageDeliveryParams, +) -> Result<(), FailedClient> { + crate::message_race_loop::run( + MessageDeliveryRaceSource { + client: source_client.clone(), + metrics_msg: metrics_msg.clone(), + _phantom: Default::default(), + }, + source_state_updates, + MessageDeliveryRaceTarget { + client: target_client.clone(), + metrics_msg: metrics_msg.clone(), + _phantom: Default::default(), + }, + target_state_updates, + MessageDeliveryStrategy:: { + lane_source_client: source_client, + lane_target_client: target_client, + max_unrewarded_relayer_entries_at_target: params + .max_unrewarded_relayer_entries_at_target, + max_unconfirmed_nonces_at_target: params.max_unconfirmed_nonces_at_target, + max_messages_in_single_batch: params.max_messages_in_single_batch, + max_messages_weight_in_single_batch: params.max_messages_weight_in_single_batch, + max_messages_size_in_single_batch: params.max_messages_size_in_single_batch, + latest_confirmed_nonces_at_source: VecDeque::new(), + target_nonces: None, + strategy: BasicStrategy::new(), + metrics_msg, + }, + ) + .await +} + +/// Message delivery race. +struct MessageDeliveryRace

(std::marker::PhantomData

); + +impl MessageRace for MessageDeliveryRace

{ + type SourceHeaderId = SourceHeaderIdOf

; + type TargetHeaderId = TargetHeaderIdOf

; + + type MessageNonce = MessageNonce; + type Proof = P::MessagesProof; + + fn source_name() -> String { + format!("{}::MessagesDelivery", P::SOURCE_NAME) + } + + fn target_name() -> String { + format!("{}::MessagesDelivery", P::TARGET_NAME) + } +} + +/// Message delivery race source, which is a source of the lane. +struct MessageDeliveryRaceSource { + client: C, + metrics_msg: Option, + _phantom: PhantomData

, +} + +#[async_trait] +impl SourceClient> for MessageDeliveryRaceSource +where + P: MessageLane, + C: MessageLaneSourceClient

, +{ + type Error = C::Error; + type NoncesRange = MessageDetailsMap; + type ProofParameters = MessageProofParameters; + + async fn nonces( + &self, + at_block: SourceHeaderIdOf

, + prev_latest_nonce: MessageNonce, + ) -> Result<(SourceHeaderIdOf

, SourceClientNonces), Self::Error> { + let (at_block, latest_generated_nonce) = + self.client.latest_generated_nonce(at_block).await?; + let (at_block, latest_confirmed_nonce) = + self.client.latest_confirmed_received_nonce(at_block).await?; + + if let Some(metrics_msg) = self.metrics_msg.as_ref() { + metrics_msg.update_source_latest_generated_nonce(latest_generated_nonce); + metrics_msg.update_source_latest_confirmed_nonce(latest_confirmed_nonce); + } + + let new_nonces = if latest_generated_nonce > prev_latest_nonce { + self.client + .generated_message_details( + at_block.clone(), + prev_latest_nonce + 1..=latest_generated_nonce, + ) + .await? + } else { + MessageDetailsMap::new() + }; + + Ok(( + at_block, + SourceClientNonces { new_nonces, confirmed_nonce: Some(latest_confirmed_nonce) }, + )) + } + + async fn generate_proof( + &self, + at_block: SourceHeaderIdOf

, + nonces: RangeInclusive, + proof_parameters: Self::ProofParameters, + ) -> Result<(SourceHeaderIdOf

, RangeInclusive, P::MessagesProof), Self::Error> + { + self.client.prove_messages(at_block, nonces, proof_parameters).await + } +} + +/// Message delivery race target, which is a target of the lane. +struct MessageDeliveryRaceTarget { + client: C, + metrics_msg: Option, + _phantom: PhantomData

, +} + +#[async_trait] +impl TargetClient> for MessageDeliveryRaceTarget +where + P: MessageLane, + C: MessageLaneTargetClient

, +{ + type Error = C::Error; + type TargetNoncesData = DeliveryRaceTargetNoncesData; + type BatchTransaction = C::BatchTransaction; + type TransactionTracker = C::TransactionTracker; + + async fn require_source_header( + &self, + id: SourceHeaderIdOf

, + ) -> Result, Self::Error> { + self.client.require_source_header_on_target(id).await + } + + async fn nonces( + &self, + at_block: TargetHeaderIdOf

, + update_metrics: bool, + ) -> Result<(TargetHeaderIdOf

, TargetClientNonces), Self::Error> + { + let (at_block, latest_received_nonce) = self.client.latest_received_nonce(at_block).await?; + let (at_block, latest_confirmed_nonce) = + self.client.latest_confirmed_received_nonce(at_block).await?; + let (at_block, unrewarded_relayers) = + self.client.unrewarded_relayers_state(at_block).await?; + + if update_metrics { + if let Some(metrics_msg) = self.metrics_msg.as_ref() { + metrics_msg.update_target_latest_received_nonce(latest_received_nonce); + metrics_msg.update_target_latest_confirmed_nonce(latest_confirmed_nonce); + } + } + + Ok(( + at_block, + TargetClientNonces { + latest_nonce: latest_received_nonce, + nonces_data: DeliveryRaceTargetNoncesData { + confirmed_nonce: latest_confirmed_nonce, + unrewarded_relayers, + }, + }, + )) + } + + async fn submit_proof( + &self, + maybe_batch_tx: Option, + generated_at_block: SourceHeaderIdOf

, + nonces: RangeInclusive, + proof: P::MessagesProof, + ) -> Result, Self::Error> { + self.client + .submit_messages_proof(maybe_batch_tx, generated_at_block, nonces, proof) + .await + } +} + +/// Additional nonces data from the target client used by message delivery race. +#[derive(Debug, Clone)] +struct DeliveryRaceTargetNoncesData { + /// The latest nonce that we know: (1) has been delivered to us (2) has been confirmed + /// back to the source node (by confirmations race) and (3) relayer has received + /// reward for (and this has been confirmed by the message delivery race). + confirmed_nonce: MessageNonce, + /// State of the unrewarded relayers set at the target node. + unrewarded_relayers: UnrewardedRelayersState, +} + +/// Messages delivery strategy. +struct MessageDeliveryStrategy { + /// The client that is connected to the message lane source node. + lane_source_client: SC, + /// The client that is connected to the message lane target node. + lane_target_client: TC, + /// Maximal unrewarded relayer entries at target client. + max_unrewarded_relayer_entries_at_target: MessageNonce, + /// Maximal unconfirmed nonces at target client. + max_unconfirmed_nonces_at_target: MessageNonce, + /// Maximal number of messages in the single delivery transaction. + max_messages_in_single_batch: MessageNonce, + /// Maximal cumulative messages weight in the single delivery transaction. + max_messages_weight_in_single_batch: Weight, + /// Maximal messages size in the single delivery transaction. + max_messages_size_in_single_batch: u32, + /// Latest confirmed nonces at the source client + the header id where we have first met this + /// nonce. + latest_confirmed_nonces_at_source: VecDeque<(SourceHeaderIdOf

, MessageNonce)>, + /// Target nonces available at the **best** block of the target chain. + target_nonces: Option>, + /// Basic delivery strategy. + strategy: MessageDeliveryStrategyBase

, + /// Message lane metrics. + metrics_msg: Option, +} + +type MessageDeliveryStrategyBase

= BasicStrategy< +

::SourceHeaderNumber, +

::SourceHeaderHash, +

::TargetHeaderNumber, +

::TargetHeaderHash, + MessageDetailsMap<

::SourceChainBalance>, +

::MessagesProof, +>; + +impl std::fmt::Debug for MessageDeliveryStrategy { + fn fmt(&self, fmt: &mut std::fmt::Formatter) -> std::fmt::Result { + fmt.debug_struct("MessageDeliveryStrategy") + .field( + "max_unrewarded_relayer_entries_at_target", + &self.max_unrewarded_relayer_entries_at_target, + ) + .field("max_unconfirmed_nonces_at_target", &self.max_unconfirmed_nonces_at_target) + .field("max_messages_in_single_batch", &self.max_messages_in_single_batch) + .field("max_messages_weight_in_single_batch", &self.max_messages_weight_in_single_batch) + .field("max_messages_size_in_single_batch", &self.max_messages_size_in_single_batch) + .field("latest_confirmed_nonces_at_source", &self.latest_confirmed_nonces_at_source) + .field("target_nonces", &self.target_nonces) + .field("strategy", &self.strategy) + .finish() + } +} + +impl MessageDeliveryStrategy +where + P: MessageLane, + SC: MessageLaneSourceClient

, + TC: MessageLaneTargetClient

, +{ + /// Returns true if some race action can be selected (with `select_race_action`) at given + /// `best_finalized_source_header_id_at_best_target` source header at target. + async fn can_submit_transaction_with< + RS: RaceState, TargetHeaderIdOf

>, + >( + &self, + mut race_state: RS, + maybe_best_finalized_source_header_id_at_best_target: Option>, + ) -> bool { + if let Some(best_finalized_source_header_id_at_best_target) = + maybe_best_finalized_source_header_id_at_best_target + { + race_state.set_best_finalized_source_header_id_at_best_target( + best_finalized_source_header_id_at_best_target, + ); + + return self.select_race_action(race_state).await.is_some() + } + + false + } + + async fn select_race_action, TargetHeaderIdOf

>>( + &self, + race_state: RS, + ) -> Option<(RangeInclusive, MessageProofParameters)> { + // if we have already selected nonces that we want to submit, do nothing + if race_state.nonces_to_submit().is_some() { + return None + } + + // if we already submitted some nonces, do nothing + if race_state.nonces_submitted().is_some() { + return None + } + + let best_target_nonce = self.strategy.best_at_target()?; + let best_finalized_source_header_id_at_best_target = + race_state.best_finalized_source_header_id_at_best_target()?; + let target_nonces = self.target_nonces.as_ref()?; + let latest_confirmed_nonce_at_source = self + .latest_confirmed_nonce_at_source(&best_finalized_source_header_id_at_best_target) + .unwrap_or(target_nonces.nonces_data.confirmed_nonce); + + // There's additional condition in the message delivery race: target would reject messages + // if there are too much unconfirmed messages at the inbound lane. + + // Ok - we may have new nonces to deliver. But target may still reject new messages, because + // we haven't notified it that (some) messages have been confirmed. So we may want to + // include updated `source.latest_confirmed` in the proof. + // + // Important note: we're including outbound state lane proof whenever there are unconfirmed + // nonces on the target chain. Other strategy is to include it only if it's absolutely + // necessary. + let latest_received_nonce_at_target = target_nonces.latest_nonce; + let latest_confirmed_nonce_at_target = target_nonces.nonces_data.confirmed_nonce; + let outbound_state_proof_required = + latest_confirmed_nonce_at_target < latest_confirmed_nonce_at_source; + + // The target node would also reject messages if there are too many entries in the + // "unrewarded relayers" set. If we are unable to prove new rewards to the target node, then + // we should wait for confirmations race. + let unrewarded_limit_reached = + target_nonces.nonces_data.unrewarded_relayers.unrewarded_relayer_entries >= + self.max_unrewarded_relayer_entries_at_target || + target_nonces.nonces_data.unrewarded_relayers.total_messages >= + self.max_unconfirmed_nonces_at_target; + if unrewarded_limit_reached { + // so there are already too many unrewarded relayer entries in the set + // + // => check if we can prove enough rewards. If not, we should wait for more rewards to + // be paid + let number_of_rewards_being_proved = + latest_confirmed_nonce_at_source.saturating_sub(latest_confirmed_nonce_at_target); + let enough_rewards_being_proved = number_of_rewards_being_proved >= + target_nonces.nonces_data.unrewarded_relayers.messages_in_oldest_entry; + if !enough_rewards_being_proved { + return None + } + } + + // If we're here, then the confirmations race did its job && sending side now knows that + // messages have been delivered. Now let's select nonces that we want to deliver. + // + // We may deliver at most: + // + // max_unconfirmed_nonces_at_target - (latest_received_nonce_at_target - + // latest_confirmed_nonce_at_target) + // + // messages in the batch. But since we're including outbound state proof in the batch, then + // it may be increased to: + // + // max_unconfirmed_nonces_at_target - (latest_received_nonce_at_target - + // latest_confirmed_nonce_at_source) + let future_confirmed_nonce_at_target = if outbound_state_proof_required { + latest_confirmed_nonce_at_source + } else { + latest_confirmed_nonce_at_target + }; + let max_nonces = latest_received_nonce_at_target + .checked_sub(future_confirmed_nonce_at_target) + .and_then(|diff| self.max_unconfirmed_nonces_at_target.checked_sub(diff)) + .unwrap_or_default(); + let max_nonces = std::cmp::min(max_nonces, self.max_messages_in_single_batch); + let max_messages_weight_in_single_batch = self.max_messages_weight_in_single_batch; + let max_messages_size_in_single_batch = self.max_messages_size_in_single_batch; + let lane_source_client = self.lane_source_client.clone(); + let lane_target_client = self.lane_target_client.clone(); + + // select nonces from nonces, available for delivery + let selected_nonces = match self.strategy.available_source_queue_indices(race_state) { + Some(available_source_queue_indices) => { + let source_queue = self.strategy.source_queue(); + let reference = RelayMessagesBatchReference { + max_messages_in_this_batch: max_nonces, + max_messages_weight_in_single_batch, + max_messages_size_in_single_batch, + lane_source_client: lane_source_client.clone(), + lane_target_client: lane_target_client.clone(), + best_target_nonce, + nonces_queue: source_queue.clone(), + nonces_queue_range: available_source_queue_indices, + metrics: self.metrics_msg.clone(), + }; + + MessageRaceLimits::decide(reference).await + }, + None => { + // we still may need to submit delivery transaction with zero messages to + // unblock the lane. But it'll only be accepted if the lane is blocked + // (i.e. when `unrewarded_limit_reached` is `true`) + None + }, + }; + + // check if we need unblocking transaction and we may submit it + #[allow(clippy::reversed_empty_ranges)] + let selected_nonces = match selected_nonces { + Some(selected_nonces) => selected_nonces, + None if unrewarded_limit_reached && outbound_state_proof_required => 1..=0, + _ => return None, + }; + + let dispatch_weight = self.dispatch_weight_for_range(&selected_nonces); + Some(( + selected_nonces, + MessageProofParameters { outbound_state_proof_required, dispatch_weight }, + )) + } + + /// Returns lastest confirmed message at source chain, given source block. + fn latest_confirmed_nonce_at_source(&self, at: &SourceHeaderIdOf

) -> Option { + self.latest_confirmed_nonces_at_source + .iter() + .take_while(|(id, _)| id.0 <= at.0) + .last() + .map(|(_, nonce)| *nonce) + } + + /// Returns total weight of all undelivered messages. + fn dispatch_weight_for_range(&self, range: &RangeInclusive) -> Weight { + self.strategy + .source_queue() + .iter() + .flat_map(|(_, subrange)| { + subrange + .iter() + .filter(|(nonce, _)| range.contains(nonce)) + .map(|(_, details)| details.dispatch_weight) + }) + .fold(Weight::zero(), |total, weight| total.saturating_add(weight)) + } +} + +#[async_trait] +impl RaceStrategy, TargetHeaderIdOf

, P::MessagesProof> + for MessageDeliveryStrategy +where + P: MessageLane, + SC: MessageLaneSourceClient

, + TC: MessageLaneTargetClient

, +{ + type SourceNoncesRange = MessageDetailsMap; + type ProofParameters = MessageProofParameters; + type TargetNoncesData = DeliveryRaceTargetNoncesData; + + fn is_empty(&self) -> bool { + self.strategy.is_empty() + } + + async fn required_source_header_at_target< + RS: RaceState, TargetHeaderIdOf

>, + >( + &self, + race_state: RS, + ) -> Option> { + // we have already submitted something - let's wait until it is mined + if race_state.nonces_submitted().is_some() { + return None + } + + // if we can deliver something using current race state, go on + let selected_nonces = self.select_race_action(race_state.clone()).await; + if selected_nonces.is_some() { + return None + } + + // check if we may deliver some messages if we'll relay require source header + // to target first + let maybe_source_header_for_delivery = + self.strategy.source_queue().back().map(|(id, _)| id.clone()); + if self + .can_submit_transaction_with( + race_state.clone(), + maybe_source_header_for_delivery.clone(), + ) + .await + { + return maybe_source_header_for_delivery + } + + // ok, we can't delivery anything even if we relay some source blocks first. But maybe + // the lane is blocked and we need to submit unblock transaction? + let maybe_source_header_for_reward_confirmation = + self.latest_confirmed_nonces_at_source.back().map(|(id, _)| id.clone()); + if self + .can_submit_transaction_with( + race_state.clone(), + maybe_source_header_for_reward_confirmation.clone(), + ) + .await + { + return maybe_source_header_for_reward_confirmation + } + + None + } + + fn best_at_source(&self) -> Option { + self.strategy.best_at_source() + } + + fn best_at_target(&self) -> Option { + self.strategy.best_at_target() + } + + fn source_nonces_updated( + &mut self, + at_block: SourceHeaderIdOf

, + nonces: SourceClientNonces, + ) { + if let Some(confirmed_nonce) = nonces.confirmed_nonce { + let is_confirmed_nonce_updated = self + .latest_confirmed_nonces_at_source + .back() + .map(|(_, prev_nonce)| *prev_nonce != confirmed_nonce) + .unwrap_or(true); + if is_confirmed_nonce_updated { + self.latest_confirmed_nonces_at_source + .push_back((at_block.clone(), confirmed_nonce)); + } + } + self.strategy.source_nonces_updated(at_block, nonces) + } + + fn reset_best_target_nonces(&mut self) { + self.target_nonces = None; + self.strategy.reset_best_target_nonces(); + } + + fn best_target_nonces_updated, TargetHeaderIdOf

>>( + &mut self, + nonces: TargetClientNonces, + race_state: &mut RS, + ) { + // best target nonces must always be ge than finalized target nonces + let latest_nonce = nonces.latest_nonce; + self.target_nonces = Some(nonces); + + self.strategy.best_target_nonces_updated( + TargetClientNonces { latest_nonce, nonces_data: () }, + race_state, + ) + } + + fn finalized_target_nonces_updated, TargetHeaderIdOf

>>( + &mut self, + nonces: TargetClientNonces, + race_state: &mut RS, + ) { + if let Some(ref best_finalized_source_header_id_at_best_target) = + race_state.best_finalized_source_header_id_at_best_target() + { + let oldest_header_number_to_keep = best_finalized_source_header_id_at_best_target.0; + while self + .latest_confirmed_nonces_at_source + .front() + .map(|(id, _)| id.0 < oldest_header_number_to_keep) + .unwrap_or(false) + { + self.latest_confirmed_nonces_at_source.pop_front(); + } + } + + if let Some(ref mut target_nonces) = self.target_nonces { + target_nonces.latest_nonce = + std::cmp::max(target_nonces.latest_nonce, nonces.latest_nonce); + } + + self.strategy.finalized_target_nonces_updated( + TargetClientNonces { latest_nonce: nonces.latest_nonce, nonces_data: () }, + race_state, + ) + } + + async fn select_nonces_to_deliver, TargetHeaderIdOf

>>( + &self, + race_state: RS, + ) -> Option<(RangeInclusive, Self::ProofParameters)> { + self.select_race_action(race_state).await + } +} + +impl NoncesRange for MessageDetailsMap { + fn begin(&self) -> MessageNonce { + self.keys().next().cloned().unwrap_or_default() + } + + fn end(&self) -> MessageNonce { + self.keys().next_back().cloned().unwrap_or_default() + } + + fn greater_than(mut self, nonce: MessageNonce) -> Option { + let gte = self.split_off(&(nonce + 1)); + if gte.is_empty() { + None + } else { + Some(gte) + } + } +} + +#[cfg(test)] +mod tests { + use crate::{ + message_lane_loop::{ + tests::{ + header_id, TestMessageLane, TestMessagesBatchTransaction, TestMessagesProof, + TestSourceChainBalance, TestSourceClient, TestSourceHeaderId, TestTargetClient, + TestTargetHeaderId, + }, + MessageDetails, + }, + message_race_loop::RaceStateImpl, + }; + + use super::*; + + const DEFAULT_DISPATCH_WEIGHT: Weight = Weight::from_parts(1, 0); + const DEFAULT_SIZE: u32 = 1; + + type TestRaceState = RaceStateImpl< + TestSourceHeaderId, + TestTargetHeaderId, + TestMessagesProof, + TestMessagesBatchTransaction, + >; + type TestStrategy = + MessageDeliveryStrategy; + + fn source_nonces( + new_nonces: RangeInclusive, + confirmed_nonce: MessageNonce, + reward: TestSourceChainBalance, + ) -> SourceClientNonces> { + SourceClientNonces { + new_nonces: new_nonces + .into_iter() + .map(|nonce| { + ( + nonce, + MessageDetails { + dispatch_weight: DEFAULT_DISPATCH_WEIGHT, + size: DEFAULT_SIZE, + reward, + }, + ) + }) + .collect(), + confirmed_nonce: Some(confirmed_nonce), + } + } + + fn prepare_strategy() -> (TestRaceState, TestStrategy) { + let mut race_state = RaceStateImpl { + best_finalized_source_header_id_at_source: Some(header_id(1)), + best_finalized_source_header_id_at_best_target: Some(header_id(1)), + best_target_header_id: Some(header_id(1)), + best_finalized_target_header_id: Some(header_id(1)), + nonces_to_submit: None, + nonces_to_submit_batch: None, + nonces_submitted: None, + }; + + let mut race_strategy = TestStrategy { + max_unrewarded_relayer_entries_at_target: 4, + max_unconfirmed_nonces_at_target: 4, + max_messages_in_single_batch: 4, + max_messages_weight_in_single_batch: Weight::from_parts(4, 0), + max_messages_size_in_single_batch: 4, + latest_confirmed_nonces_at_source: vec![(header_id(1), 19)].into_iter().collect(), + lane_source_client: TestSourceClient::default(), + lane_target_client: TestTargetClient::default(), + metrics_msg: None, + target_nonces: Some(TargetClientNonces { + latest_nonce: 19, + nonces_data: DeliveryRaceTargetNoncesData { + confirmed_nonce: 19, + unrewarded_relayers: UnrewardedRelayersState { + unrewarded_relayer_entries: 0, + messages_in_oldest_entry: 0, + total_messages: 0, + last_delivered_nonce: 0, + }, + }, + }), + strategy: BasicStrategy::new(), + }; + + race_strategy + .strategy + .source_nonces_updated(header_id(1), source_nonces(20..=23, 19, 0)); + + let target_nonces = TargetClientNonces { latest_nonce: 19, nonces_data: () }; + race_strategy + .strategy + .best_target_nonces_updated(target_nonces.clone(), &mut race_state); + race_strategy + .strategy + .finalized_target_nonces_updated(target_nonces, &mut race_state); + + (race_state, race_strategy) + } + + fn proof_parameters(state_required: bool, weight: u32) -> MessageProofParameters { + MessageProofParameters { + outbound_state_proof_required: state_required, + dispatch_weight: Weight::from_parts(weight as u64, 0), + } + } + + #[test] + fn weights_map_works_as_nonces_range() { + fn build_map( + range: RangeInclusive, + ) -> MessageDetailsMap { + range + .map(|idx| { + ( + idx, + MessageDetails { + dispatch_weight: Weight::from_parts(idx, 0), + size: idx as _, + reward: idx as _, + }, + ) + }) + .collect() + } + + let map = build_map(20..=30); + + assert_eq!(map.begin(), 20); + assert_eq!(map.end(), 30); + assert_eq!(map.clone().greater_than(10), Some(build_map(20..=30))); + assert_eq!(map.clone().greater_than(19), Some(build_map(20..=30))); + assert_eq!(map.clone().greater_than(20), Some(build_map(21..=30))); + assert_eq!(map.clone().greater_than(25), Some(build_map(26..=30))); + assert_eq!(map.clone().greater_than(29), Some(build_map(30..=30))); + assert_eq!(map.greater_than(30), None); + } + + #[async_std::test] + async fn message_delivery_strategy_selects_messages_to_deliver() { + let (state, strategy) = prepare_strategy(); + + // both sides are ready to relay new messages + assert_eq!( + strategy.select_nonces_to_deliver(state).await, + Some(((20..=23), proof_parameters(false, 4))) + ); + } + + #[async_std::test] + async fn message_delivery_strategy_includes_outbound_state_proof_when_new_nonces_are_available() + { + let (state, mut strategy) = prepare_strategy(); + + // if there are new confirmed nonces on source, we want to relay this information + // to target to prune rewards queue + let prev_confirmed_nonce_at_source = + strategy.latest_confirmed_nonces_at_source.back().unwrap().1; + strategy.target_nonces.as_mut().unwrap().nonces_data.confirmed_nonce = + prev_confirmed_nonce_at_source - 1; + assert_eq!( + strategy.select_nonces_to_deliver(state).await, + Some(((20..=23), proof_parameters(true, 4))) + ); + } + + #[async_std::test] + async fn message_delivery_strategy_selects_nothing_if_there_are_too_many_unrewarded_relayers() { + let (state, mut strategy) = prepare_strategy(); + + // if there are already `max_unrewarded_relayer_entries_at_target` entries at target, + // we need to wait until rewards will be paid + { + let unrewarded_relayers = + &mut strategy.target_nonces.as_mut().unwrap().nonces_data.unrewarded_relayers; + unrewarded_relayers.unrewarded_relayer_entries = + strategy.max_unrewarded_relayer_entries_at_target; + unrewarded_relayers.messages_in_oldest_entry = 4; + } + assert_eq!(strategy.select_nonces_to_deliver(state).await, None); + } + + #[async_std::test] + async fn message_delivery_strategy_selects_nothing_if_proved_rewards_is_not_enough_to_remove_oldest_unrewarded_entry( + ) { + let (state, mut strategy) = prepare_strategy(); + + // if there are already `max_unrewarded_relayer_entries_at_target` entries at target, + // we need to prove at least `messages_in_oldest_entry` rewards + let prev_confirmed_nonce_at_source = + strategy.latest_confirmed_nonces_at_source.back().unwrap().1; + { + let nonces_data = &mut strategy.target_nonces.as_mut().unwrap().nonces_data; + nonces_data.confirmed_nonce = prev_confirmed_nonce_at_source - 1; + let unrewarded_relayers = &mut nonces_data.unrewarded_relayers; + unrewarded_relayers.unrewarded_relayer_entries = + strategy.max_unrewarded_relayer_entries_at_target; + unrewarded_relayers.messages_in_oldest_entry = 4; + } + assert_eq!(strategy.select_nonces_to_deliver(state).await, None); + } + + #[async_std::test] + async fn message_delivery_strategy_includes_outbound_state_proof_if_proved_rewards_is_enough() { + let (state, mut strategy) = prepare_strategy(); + + // if there are already `max_unrewarded_relayer_entries_at_target` entries at target, + // we need to prove at least `messages_in_oldest_entry` rewards + let prev_confirmed_nonce_at_source = + strategy.latest_confirmed_nonces_at_source.back().unwrap().1; + { + let nonces_data = &mut strategy.target_nonces.as_mut().unwrap().nonces_data; + nonces_data.confirmed_nonce = prev_confirmed_nonce_at_source - 3; + let unrewarded_relayers = &mut nonces_data.unrewarded_relayers; + unrewarded_relayers.unrewarded_relayer_entries = + strategy.max_unrewarded_relayer_entries_at_target; + unrewarded_relayers.messages_in_oldest_entry = 3; + } + assert_eq!( + strategy.select_nonces_to_deliver(state).await, + Some(((20..=23), proof_parameters(true, 4))) + ); + } + + #[async_std::test] + async fn message_delivery_strategy_limits_batch_by_messages_weight() { + let (state, mut strategy) = prepare_strategy(); + + // not all queued messages may fit in the batch, because batch has max weight + strategy.max_messages_weight_in_single_batch = Weight::from_parts(3, 0); + assert_eq!( + strategy.select_nonces_to_deliver(state).await, + Some(((20..=22), proof_parameters(false, 3))) + ); + } + + #[async_std::test] + async fn message_delivery_strategy_accepts_single_message_even_if_its_weight_overflows_maximal_weight( + ) { + let (state, mut strategy) = prepare_strategy(); + + // first message doesn't fit in the batch, because it has weight (10) that overflows max + // weight (4) + strategy.strategy.source_queue_mut()[0].1.get_mut(&20).unwrap().dispatch_weight = + Weight::from_parts(10, 0); + assert_eq!( + strategy.select_nonces_to_deliver(state).await, + Some(((20..=20), proof_parameters(false, 10))) + ); + } + + #[async_std::test] + async fn message_delivery_strategy_limits_batch_by_messages_size() { + let (state, mut strategy) = prepare_strategy(); + + // not all queued messages may fit in the batch, because batch has max weight + strategy.max_messages_size_in_single_batch = 3; + assert_eq!( + strategy.select_nonces_to_deliver(state).await, + Some(((20..=22), proof_parameters(false, 3))) + ); + } + + #[async_std::test] + async fn message_delivery_strategy_accepts_single_message_even_if_its_weight_overflows_maximal_size( + ) { + let (state, mut strategy) = prepare_strategy(); + + // first message doesn't fit in the batch, because it has weight (10) that overflows max + // weight (4) + strategy.strategy.source_queue_mut()[0].1.get_mut(&20).unwrap().size = 10; + assert_eq!( + strategy.select_nonces_to_deliver(state).await, + Some(((20..=20), proof_parameters(false, 1))) + ); + } + + #[async_std::test] + async fn message_delivery_strategy_limits_batch_by_messages_count_when_there_is_upper_limit() { + let (state, mut strategy) = prepare_strategy(); + + // not all queued messages may fit in the batch, because batch has max number of messages + // limit + strategy.max_messages_in_single_batch = 3; + assert_eq!( + strategy.select_nonces_to_deliver(state).await, + Some(((20..=22), proof_parameters(false, 3))) + ); + } + + #[async_std::test] + async fn message_delivery_strategy_limits_batch_by_messages_count_when_there_are_unconfirmed_nonces( + ) { + let (state, mut strategy) = prepare_strategy(); + + // 1 delivery confirmation from target to source is still missing, so we may only + // relay 3 new messages + let prev_confirmed_nonce_at_source = + strategy.latest_confirmed_nonces_at_source.back().unwrap().1; + strategy.latest_confirmed_nonces_at_source = + vec![(header_id(1), prev_confirmed_nonce_at_source - 1)].into_iter().collect(); + strategy.target_nonces.as_mut().unwrap().nonces_data.confirmed_nonce = + prev_confirmed_nonce_at_source - 1; + assert_eq!( + strategy.select_nonces_to_deliver(state).await, + Some(((20..=22), proof_parameters(false, 3))) + ); + } + + #[async_std::test] + async fn message_delivery_strategy_waits_for_confirmed_nonce_header_to_appear_on_target() { + // 1 delivery confirmation from target to source is still missing, so we may deliver + // reward confirmation with our message delivery transaction. But the problem is that + // the reward has been paid at header 2 && this header is still unknown to target node. + // + // => so we can't deliver more than 3 messages + let (mut state, mut strategy) = prepare_strategy(); + let prev_confirmed_nonce_at_source = + strategy.latest_confirmed_nonces_at_source.back().unwrap().1; + strategy.latest_confirmed_nonces_at_source = vec![ + (header_id(1), prev_confirmed_nonce_at_source - 1), + (header_id(2), prev_confirmed_nonce_at_source), + ] + .into_iter() + .collect(); + strategy.target_nonces.as_mut().unwrap().nonces_data.confirmed_nonce = + prev_confirmed_nonce_at_source - 1; + state.best_finalized_source_header_id_at_best_target = Some(header_id(1)); + assert_eq!( + strategy.select_nonces_to_deliver(state).await, + Some(((20..=22), proof_parameters(false, 3))) + ); + + // the same situation, but the header 2 is known to the target node, so we may deliver + // reward confirmation + let (mut state, mut strategy) = prepare_strategy(); + let prev_confirmed_nonce_at_source = + strategy.latest_confirmed_nonces_at_source.back().unwrap().1; + strategy.latest_confirmed_nonces_at_source = vec![ + (header_id(1), prev_confirmed_nonce_at_source - 1), + (header_id(2), prev_confirmed_nonce_at_source), + ] + .into_iter() + .collect(); + strategy.target_nonces.as_mut().unwrap().nonces_data.confirmed_nonce = + prev_confirmed_nonce_at_source - 1; + state.best_finalized_source_header_id_at_source = Some(header_id(2)); + state.best_finalized_source_header_id_at_best_target = Some(header_id(2)); + assert_eq!( + strategy.select_nonces_to_deliver(state).await, + Some(((20..=23), proof_parameters(true, 4))) + ); + } + + #[async_std::test] + async fn source_header_is_required_when_confirmations_are_required() { + // let's prepare situation when: + // - all messages [20; 23] have been generated at source block#1; + let (mut state, mut strategy) = prepare_strategy(); + // + // - messages [20; 23] have been delivered + assert_eq!( + strategy.select_nonces_to_deliver(state.clone()).await, + Some(((20..=23), proof_parameters(false, 4))) + ); + strategy.finalized_target_nonces_updated( + TargetClientNonces { + latest_nonce: 23, + nonces_data: DeliveryRaceTargetNoncesData { + confirmed_nonce: 19, + unrewarded_relayers: UnrewardedRelayersState { + unrewarded_relayer_entries: 1, + messages_in_oldest_entry: 4, + total_messages: 4, + last_delivered_nonce: 23, + }, + }, + }, + &mut state, + ); + // nothing needs to be delivered now and we don't need any new headers + assert_eq!(strategy.select_nonces_to_deliver(state.clone()).await, None); + assert_eq!(strategy.required_source_header_at_target(state.clone()).await, None); + + // block#2 is generated + state.best_finalized_source_header_id_at_source = Some(header_id(2)); + state.best_finalized_source_header_id_at_best_target = Some(header_id(2)); + state.best_target_header_id = Some(header_id(2)); + state.best_finalized_target_header_id = Some(header_id(2)); + + // now let's generate two more nonces [24; 25] at the source; + strategy.source_nonces_updated(header_id(2), source_nonces(24..=25, 19, 0)); + // + // we don't need to relay more headers to target, because messages [20; 23] have + // not confirmed to source yet + assert_eq!(strategy.select_nonces_to_deliver(state.clone()).await, None); + assert_eq!(strategy.required_source_header_at_target(state.clone()).await, None); + + // let's relay source block#3 + state.best_finalized_source_header_id_at_source = Some(header_id(3)); + state.best_finalized_source_header_id_at_best_target = Some(header_id(3)); + state.best_target_header_id = Some(header_id(3)); + state.best_finalized_target_header_id = Some(header_id(3)); + + // and ask strategy again => still nothing to deliver, because parallel confirmations + // race need to be pushed further + assert_eq!(strategy.select_nonces_to_deliver(state.clone()).await, None); + assert_eq!(strategy.required_source_header_at_target(state.clone()).await, None); + + // let's relay source block#3 + state.best_finalized_source_header_id_at_source = Some(header_id(4)); + state.best_finalized_source_header_id_at_best_target = Some(header_id(4)); + state.best_target_header_id = Some(header_id(4)); + state.best_finalized_target_header_id = Some(header_id(4)); + + // let's confirm messages [20; 23] + strategy.source_nonces_updated(header_id(4), source_nonces(24..=25, 23, 0)); + + // and ask strategy again => now we have everything required to deliver remaining + // [24; 25] nonces and proof of [20; 23] confirmation + assert_eq!( + strategy.select_nonces_to_deliver(state.clone()).await, + Some(((24..=25), proof_parameters(true, 2))), + ); + assert_eq!(strategy.required_source_header_at_target(state).await, None); + } + + #[async_std::test] + async fn relayer_uses_flattened_view_of_the_source_queue_to_select_nonces() { + // Real scenario that has happened on test deployments: + // 1) relayer witnessed M1 at block 1 => it has separate entry in the `source_queue` + // 2) relayer witnessed M2 at block 2 => it has separate entry in the `source_queue` + // 3) if block 2 is known to the target node, then both M1 and M2 are selected for single + // delivery, even though weight(M1+M2) > larger than largest allowed weight + // + // This was happening because selector (`select_nonces_for_delivery_transaction`) has been + // called for every `source_queue` entry separately without preserving any context. + let (mut state, mut strategy) = prepare_strategy(); + let nonces = source_nonces(24..=25, 19, 0); + strategy.strategy.source_nonces_updated(header_id(2), nonces); + strategy.max_unrewarded_relayer_entries_at_target = 100; + strategy.max_unconfirmed_nonces_at_target = 100; + strategy.max_messages_in_single_batch = 5; + strategy.max_messages_weight_in_single_batch = Weight::from_parts(100, 0); + strategy.max_messages_size_in_single_batch = 100; + state.best_finalized_source_header_id_at_best_target = Some(header_id(2)); + + assert_eq!( + strategy.select_nonces_to_deliver(state).await, + Some(((20..=24), proof_parameters(false, 5))) + ); + } + + #[async_std::test] + #[allow(clippy::reversed_empty_ranges)] + async fn no_source_headers_required_at_target_if_lanes_are_empty() { + let (state, _) = prepare_strategy(); + let mut strategy = TestStrategy { + max_unrewarded_relayer_entries_at_target: 4, + max_unconfirmed_nonces_at_target: 4, + max_messages_in_single_batch: 4, + max_messages_weight_in_single_batch: Weight::from_parts(4, 0), + max_messages_size_in_single_batch: 4, + latest_confirmed_nonces_at_source: VecDeque::new(), + lane_source_client: TestSourceClient::default(), + lane_target_client: TestTargetClient::default(), + metrics_msg: None, + target_nonces: None, + strategy: BasicStrategy::new(), + }; + + let source_header_id = header_id(10); + strategy.source_nonces_updated( + source_header_id, + // MessageDeliveryRaceSource::nonces returns Some(0), because that's how it is + // represented in memory (there's no Options in OutboundLaneState) + source_nonces(1u64..=0u64, 0, 0), + ); + + // even though `latest_confirmed_nonces_at_source` is not empty, new headers are not + // requested + assert_eq!( + strategy.latest_confirmed_nonces_at_source, + VecDeque::from([(source_header_id, 0)]) + ); + assert_eq!(strategy.required_source_header_at_target(state).await, None); + } + + #[async_std::test] + async fn previous_nonces_are_selected_if_reorg_happens_at_target_chain() { + // this is the copy of the similar test in the `mesage_race_strategy.rs`, but it also tests + // that the `MessageDeliveryStrategy` acts properly in the similar scenario + + // tune parameters to allow 5 nonces per delivery transaction + let (mut state, mut strategy) = prepare_strategy(); + strategy.max_unrewarded_relayer_entries_at_target = 5; + strategy.max_unconfirmed_nonces_at_target = 5; + strategy.max_messages_in_single_batch = 5; + strategy.max_messages_weight_in_single_batch = Weight::from_parts(5, 0); + strategy.max_messages_size_in_single_batch = 5; + + // in this state we have 4 available nonces for delivery + assert_eq!( + strategy.select_nonces_to_deliver(state.clone()).await, + Some(( + 20..=23, + MessageProofParameters { + outbound_state_proof_required: false, + dispatch_weight: Weight::from_parts(4, 0), + } + )), + ); + + // let's say we have submitted 20..=23 + state.nonces_submitted = Some(20..=23); + + // then new nonce 24 appear at the source block 2 + let new_nonce_24 = vec![( + 24, + MessageDetails { dispatch_weight: Weight::from_parts(1, 0), size: 0, reward: 0 }, + )] + .into_iter() + .collect(); + let source_header_2 = header_id(2); + state.best_finalized_source_header_id_at_source = Some(source_header_2); + strategy.source_nonces_updated( + source_header_2, + SourceClientNonces { new_nonces: new_nonce_24, confirmed_nonce: None }, + ); + // and nonce 23 appear at the best block of the target node (best finalized still has 0 + // nonces) + let target_nonces_data = DeliveryRaceTargetNoncesData { + confirmed_nonce: 19, + unrewarded_relayers: UnrewardedRelayersState::default(), + }; + let target_header_2 = header_id(2); + state.best_target_header_id = Some(target_header_2); + strategy.best_target_nonces_updated( + TargetClientNonces { latest_nonce: 23, nonces_data: target_nonces_data.clone() }, + &mut state, + ); + + // then best target header is retracted + strategy.best_target_nonces_updated( + TargetClientNonces { latest_nonce: 19, nonces_data: target_nonces_data.clone() }, + &mut state, + ); + + // ... and some fork with 19 delivered nonces is finalized + let target_header_2_fork = header_id(2_1); + state.best_finalized_source_header_id_at_source = Some(source_header_2); + state.best_finalized_source_header_id_at_best_target = Some(source_header_2); + state.best_target_header_id = Some(target_header_2_fork); + state.best_finalized_target_header_id = Some(target_header_2_fork); + strategy.finalized_target_nonces_updated( + TargetClientNonces { latest_nonce: 19, nonces_data: target_nonces_data.clone() }, + &mut state, + ); + + // now we have to select nonces 20..=23 for delivery again + assert_eq!( + strategy.select_nonces_to_deliver(state.clone()).await, + Some(( + 20..=24, + MessageProofParameters { + outbound_state_proof_required: false, + dispatch_weight: Weight::from_parts(5, 0), + } + )), + ); + } + + #[async_std::test] + #[allow(clippy::reversed_empty_ranges)] + async fn delivery_race_is_able_to_unblock_lane() { + // step 1: messages 20..=23 are delivered from source to target at target block 2 + fn at_target_block_2_deliver_messages( + strategy: &mut TestStrategy, + state: &mut TestRaceState, + occupied_relayer_slots: MessageNonce, + occupied_message_slots: MessageNonce, + ) { + let nonces_at_target = TargetClientNonces { + latest_nonce: 23, + nonces_data: DeliveryRaceTargetNoncesData { + confirmed_nonce: 19, + unrewarded_relayers: UnrewardedRelayersState { + unrewarded_relayer_entries: occupied_relayer_slots, + total_messages: occupied_message_slots, + ..Default::default() + }, + }, + }; + + state.best_target_header_id = Some(header_id(2)); + state.best_finalized_target_header_id = Some(header_id(2)); + + strategy.best_target_nonces_updated(nonces_at_target.clone(), state); + strategy.finalized_target_nonces_updated(nonces_at_target, state); + } + + // step 2: delivery of messages 20..=23 is confirmed to the source node at source block 2 + fn at_source_block_2_deliver_confirmations( + strategy: &mut TestStrategy, + state: &mut TestRaceState, + ) { + state.best_finalized_source_header_id_at_source = Some(header_id(2)); + + strategy.source_nonces_updated( + header_id(2), + SourceClientNonces { new_nonces: Default::default(), confirmed_nonce: Some(23) }, + ); + } + + // step 3: finalize source block 2 at target block 3 and select nonces to deliver + async fn at_target_block_3_select_nonces_to_deliver( + strategy: &TestStrategy, + mut state: TestRaceState, + ) -> Option<(RangeInclusive, MessageProofParameters)> { + state.best_finalized_source_header_id_at_best_target = Some(header_id(2)); + state.best_target_header_id = Some(header_id(3)); + state.best_finalized_target_header_id = Some(header_id(3)); + + strategy.select_nonces_to_deliver(state).await + } + + let max_unrewarded_relayer_entries_at_target = 4; + let max_unconfirmed_nonces_at_target = 4; + let expected_rewards_proof = Some(( + 1..=0, + MessageProofParameters { + outbound_state_proof_required: true, + dispatch_weight: Weight::zero(), + }, + )); + + // when lane is NOT blocked + let (mut state, mut strategy) = prepare_strategy(); + at_target_block_2_deliver_messages( + &mut strategy, + &mut state, + max_unrewarded_relayer_entries_at_target - 1, + max_unconfirmed_nonces_at_target - 1, + ); + at_source_block_2_deliver_confirmations(&mut strategy, &mut state); + assert_eq!(strategy.required_source_header_at_target(state.clone()).await, None); + assert_eq!(at_target_block_3_select_nonces_to_deliver(&strategy, state).await, None); + + // when lane is blocked by no-relayer-slots in unrewarded relayers vector + let (mut state, mut strategy) = prepare_strategy(); + at_target_block_2_deliver_messages( + &mut strategy, + &mut state, + max_unrewarded_relayer_entries_at_target, + max_unconfirmed_nonces_at_target - 1, + ); + at_source_block_2_deliver_confirmations(&mut strategy, &mut state); + assert_eq!( + strategy.required_source_header_at_target(state.clone()).await, + Some(header_id(2)) + ); + assert_eq!( + at_target_block_3_select_nonces_to_deliver(&strategy, state).await, + expected_rewards_proof + ); + + // when lane is blocked by no-message-slots in unrewarded relayers vector + let (mut state, mut strategy) = prepare_strategy(); + at_target_block_2_deliver_messages( + &mut strategy, + &mut state, + max_unrewarded_relayer_entries_at_target - 1, + max_unconfirmed_nonces_at_target, + ); + at_source_block_2_deliver_confirmations(&mut strategy, &mut state); + assert_eq!( + strategy.required_source_header_at_target(state.clone()).await, + Some(header_id(2)) + ); + assert_eq!( + at_target_block_3_select_nonces_to_deliver(&strategy, state).await, + expected_rewards_proof + ); + + // when lane is blocked by no-message-slots and no-message-slots in unrewarded relayers + // vector + let (mut state, mut strategy) = prepare_strategy(); + at_target_block_2_deliver_messages( + &mut strategy, + &mut state, + max_unrewarded_relayer_entries_at_target - 1, + max_unconfirmed_nonces_at_target, + ); + at_source_block_2_deliver_confirmations(&mut strategy, &mut state); + assert_eq!( + strategy.required_source_header_at_target(state.clone()).await, + Some(header_id(2)) + ); + assert_eq!( + at_target_block_3_select_nonces_to_deliver(&strategy, state).await, + expected_rewards_proof + ); + + // when we have already selected some nonces to deliver, we don't need to select anything + let (mut state, mut strategy) = prepare_strategy(); + at_target_block_2_deliver_messages( + &mut strategy, + &mut state, + max_unrewarded_relayer_entries_at_target - 1, + max_unconfirmed_nonces_at_target, + ); + at_source_block_2_deliver_confirmations(&mut strategy, &mut state); + state.nonces_to_submit = Some((header_id(2), 1..=0, (1..=0, None))); + assert_eq!(strategy.required_source_header_at_target(state.clone()).await, None); + assert_eq!(at_target_block_3_select_nonces_to_deliver(&strategy, state).await, None); + + // when we have already submitted some nonces, we don't need to select anything + let (mut state, mut strategy) = prepare_strategy(); + at_target_block_2_deliver_messages( + &mut strategy, + &mut state, + max_unrewarded_relayer_entries_at_target - 1, + max_unconfirmed_nonces_at_target, + ); + at_source_block_2_deliver_confirmations(&mut strategy, &mut state); + state.nonces_submitted = Some(1..=0); + assert_eq!(strategy.required_source_header_at_target(state.clone()).await, None); + assert_eq!(at_target_block_3_select_nonces_to_deliver(&strategy, state).await, None); + } + + #[async_std::test] + async fn outbound_state_proof_is_not_required_when_we_have_no_new_confirmations() { + let (mut state, mut strategy) = prepare_strategy(); + + // pretend that we haven't seen any confirmations yet (or they're at the future target chain + // blocks) + strategy.latest_confirmed_nonces_at_source.clear(); + + // emulate delivery of some nonces (20..=23 are generated, but we only deliver 20..=21) + let nonces_at_target = TargetClientNonces { + latest_nonce: 21, + nonces_data: DeliveryRaceTargetNoncesData { + confirmed_nonce: 19, + unrewarded_relayers: UnrewardedRelayersState { + unrewarded_relayer_entries: 1, + total_messages: 2, + ..Default::default() + }, + }, + }; + state.best_target_header_id = Some(header_id(2)); + state.best_finalized_target_header_id = Some(header_id(2)); + strategy.best_target_nonces_updated(nonces_at_target.clone(), &mut state); + strategy.finalized_target_nonces_updated(nonces_at_target, &mut state); + + // we won't include outbound lane state proof into 22..=23 delivery transaction + // because it brings no new reward confirmations + assert_eq!( + strategy.select_nonces_to_deliver(state).await, + Some(((22..=23), proof_parameters(false, 2))) + ); + } +} diff --git a/bridges/relays/messages/src/message_race_limits.rs b/bridges/relays/messages/src/message_race_limits.rs new file mode 100644 index 0000000000000000000000000000000000000000..873bb6aad04253b833c51cea89f2124167e077d1 --- /dev/null +++ b/bridges/relays/messages/src/message_race_limits.rs @@ -0,0 +1,206 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! enforcement strategy + +use num_traits::Zero; +use std::ops::RangeInclusive; + +use bp_messages::{MessageNonce, Weight}; + +use crate::{ + message_lane::MessageLane, + message_lane_loop::{ + MessageDetails, MessageDetailsMap, SourceClient as MessageLaneSourceClient, + TargetClient as MessageLaneTargetClient, + }, + message_race_loop::NoncesRange, + message_race_strategy::SourceRangesQueue, + metrics::MessageLaneLoopMetrics, +}; + +/// Reference data for participating in relay +pub struct RelayReference< + P: MessageLane, + SourceClient: MessageLaneSourceClient

, + TargetClient: MessageLaneTargetClient

, +> { + /// The client that is connected to the message lane source node. + pub lane_source_client: SourceClient, + /// The client that is connected to the message lane target node. + pub lane_target_client: TargetClient, + /// Metrics reference. + pub metrics: Option, + /// Messages size summary + pub selected_size: u32, + + /// Hard check begin nonce + pub hard_selected_begin_nonce: MessageNonce, + + /// Index by all ready nonces + pub index: usize, + /// Current nonce + pub nonce: MessageNonce, + /// Current nonce details + pub details: MessageDetails, +} + +/// Relay reference data +pub struct RelayMessagesBatchReference< + P: MessageLane, + SourceClient: MessageLaneSourceClient

, + TargetClient: MessageLaneTargetClient

, +> { + /// Maximal number of relayed messages in single delivery transaction. + pub max_messages_in_this_batch: MessageNonce, + /// Maximal cumulative dispatch weight of relayed messages in single delivery transaction. + pub max_messages_weight_in_single_batch: Weight, + /// Maximal cumulative size of relayed messages in single delivery transaction. + pub max_messages_size_in_single_batch: u32, + /// The client that is connected to the message lane source node. + pub lane_source_client: SourceClient, + /// The client that is connected to the message lane target node. + pub lane_target_client: TargetClient, + /// Metrics reference. + pub metrics: Option, + /// Best available nonce at the **best** target block. We do not want to deliver nonces + /// less than this nonce, even though the block may be retracted. + pub best_target_nonce: MessageNonce, + /// Source queue. + pub nonces_queue: SourceRangesQueue< + P::SourceHeaderHash, + P::SourceHeaderNumber, + MessageDetailsMap, + >, + /// Range of indices within the `nonces_queue` that are available for selection. + pub nonces_queue_range: RangeInclusive, +} + +/// Limits of the message race transactions. +#[derive(Clone)] +pub struct MessageRaceLimits; + +impl MessageRaceLimits { + pub async fn decide< + P: MessageLane, + SourceClient: MessageLaneSourceClient

, + TargetClient: MessageLaneTargetClient

, + >( + reference: RelayMessagesBatchReference, + ) -> Option> { + let mut hard_selected_count = 0; + + let mut selected_weight = Weight::zero(); + let mut selected_count: MessageNonce = 0; + + let hard_selected_begin_nonce = std::cmp::max( + reference.best_target_nonce + 1, + reference.nonces_queue[*reference.nonces_queue_range.start()].1.begin(), + ); + + // relay reference + let mut relay_reference = RelayReference { + lane_source_client: reference.lane_source_client.clone(), + lane_target_client: reference.lane_target_client.clone(), + metrics: reference.metrics.clone(), + + selected_size: 0, + + hard_selected_begin_nonce, + + index: 0, + nonce: 0, + details: MessageDetails { + dispatch_weight: Weight::zero(), + size: 0, + reward: P::SourceChainBalance::zero(), + }, + }; + + let all_ready_nonces = reference + .nonces_queue + .range(reference.nonces_queue_range.clone()) + .flat_map(|(_, ready_nonces)| ready_nonces.iter()) + .filter(|(nonce, _)| **nonce >= hard_selected_begin_nonce) + .enumerate(); + for (index, (nonce, details)) in all_ready_nonces { + relay_reference.index = index; + relay_reference.nonce = *nonce; + relay_reference.details = *details; + + // Since we (hopefully) have some reserves in `max_messages_weight_in_single_batch` + // and `max_messages_size_in_single_batch`, we may still try to submit transaction + // with single message if message overflows these limits. The worst case would be if + // transaction will be rejected by the target runtime, but at least we have tried. + + // limit messages in the batch by weight + let new_selected_weight = match selected_weight.checked_add(&details.dispatch_weight) { + Some(new_selected_weight) + if new_selected_weight + .all_lte(reference.max_messages_weight_in_single_batch) => + new_selected_weight, + new_selected_weight if selected_count == 0 => { + log::warn!( + target: "bridge", + "Going to submit message delivery transaction with declared dispatch \ + weight {:?} that overflows maximal configured weight {}", + new_selected_weight, + reference.max_messages_weight_in_single_batch, + ); + new_selected_weight.unwrap_or(Weight::MAX) + }, + _ => break, + }; + + // limit messages in the batch by size + let new_selected_size = match relay_reference.selected_size.checked_add(details.size) { + Some(new_selected_size) + if new_selected_size <= reference.max_messages_size_in_single_batch => + new_selected_size, + new_selected_size if selected_count == 0 => { + log::warn!( + target: "bridge", + "Going to submit message delivery transaction with message \ + size {:?} that overflows maximal configured size {}", + new_selected_size, + reference.max_messages_size_in_single_batch, + ); + new_selected_size.unwrap_or(u32::MAX) + }, + _ => break, + }; + + // limit number of messages in the batch + let new_selected_count = selected_count + 1; + if new_selected_count > reference.max_messages_in_this_batch { + break + } + relay_reference.selected_size = new_selected_size; + + hard_selected_count = index + 1; + selected_weight = new_selected_weight; + selected_count = new_selected_count; + } + + if hard_selected_count != 0 { + let selected_max_nonce = + hard_selected_begin_nonce + hard_selected_count as MessageNonce - 1; + Some(hard_selected_begin_nonce..=selected_max_nonce) + } else { + None + } + } +} diff --git a/bridges/relays/messages/src/message_race_loop.rs b/bridges/relays/messages/src/message_race_loop.rs new file mode 100644 index 0000000000000000000000000000000000000000..31341a9a0c0cd9fce4ba67e14bc43838f4770f3f --- /dev/null +++ b/bridges/relays/messages/src/message_race_loop.rs @@ -0,0 +1,835 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +//! Loop that is serving single race within message lane. This could be +//! message delivery race, receiving confirmations race or processing +//! confirmations race. +//! +//! The idea of the race is simple - we have `nonce`-s on source and target +//! nodes. We're trying to prove that the source node has this nonce (and +//! associated data - like messages, lane state, etc) to the target node by +//! generating and submitting proof. + +use crate::message_lane_loop::{BatchTransaction, ClientState, NoncesSubmitArtifacts}; + +use async_trait::async_trait; +use bp_messages::MessageNonce; +use futures::{ + future::{FutureExt, TryFutureExt}, + stream::{FusedStream, StreamExt}, +}; +use relay_utils::{ + process_future_result, retry_backoff, FailedClient, MaybeConnectionError, + TrackedTransactionStatus, TransactionTracker, +}; +use std::{ + fmt::Debug, + ops::RangeInclusive, + time::{Duration, Instant}, +}; + +/// One of races within lane. +pub trait MessageRace { + /// Header id of the race source. + type SourceHeaderId: Debug + Clone + PartialEq + Send + Sync; + /// Header id of the race source. + type TargetHeaderId: Debug + Clone + PartialEq + Send + Sync; + + /// Message nonce used in the race. + type MessageNonce: Debug + Clone; + /// Proof that is generated and delivered in this race. + type Proof: Debug + Clone + Send + Sync; + + /// Name of the race source. + fn source_name() -> String; + /// Name of the race target. + fn target_name() -> String; +} + +/// State of race source client. +type SourceClientState

= + ClientState<

::SourceHeaderId,

::TargetHeaderId>; + +/// State of race target client. +type TargetClientState

= + ClientState<

::TargetHeaderId,

::SourceHeaderId>; + +/// Inclusive nonces range. +pub trait NoncesRange: Debug + Sized { + /// Get begin of the range. + fn begin(&self) -> MessageNonce; + /// Get end of the range. + fn end(&self) -> MessageNonce; + /// Returns new range with current range nonces that are greater than the passed `nonce`. + /// If there are no such nonces, `None` is returned. + fn greater_than(self, nonce: MessageNonce) -> Option; +} + +/// Nonces on the race source client. +#[derive(Debug, Clone)] +pub struct SourceClientNonces { + /// New nonces range known to the client. `New` here means all nonces generated after + /// `prev_latest_nonce` passed to the `SourceClient::nonces` method. + pub new_nonces: NoncesRange, + /// The latest nonce that is confirmed to the bridged client. This nonce only makes + /// sense in some races. In other races it is `None`. + pub confirmed_nonce: Option, +} + +/// Nonces on the race target client. +#[derive(Debug, Clone)] +pub struct TargetClientNonces { + /// The latest nonce that is known to the target client. + pub latest_nonce: MessageNonce, + /// Additional data from target node that may be used by the race. + pub nonces_data: TargetNoncesData, +} + +/// One of message lane clients, which is source client for the race. +#[async_trait] +pub trait SourceClient { + /// Type of error these clients returns. + type Error: std::fmt::Debug + MaybeConnectionError; + /// Type of nonces range returned by the source client. + type NoncesRange: NoncesRange; + /// Additional proof parameters required to generate proof. + type ProofParameters; + + /// Return nonces that are known to the source client. + async fn nonces( + &self, + at_block: P::SourceHeaderId, + prev_latest_nonce: MessageNonce, + ) -> Result<(P::SourceHeaderId, SourceClientNonces), Self::Error>; + /// Generate proof for delivering to the target client. + async fn generate_proof( + &self, + at_block: P::SourceHeaderId, + nonces: RangeInclusive, + proof_parameters: Self::ProofParameters, + ) -> Result<(P::SourceHeaderId, RangeInclusive, P::Proof), Self::Error>; +} + +/// One of message lane clients, which is target client for the race. +#[async_trait] +pub trait TargetClient { + /// Type of error these clients returns. + type Error: std::fmt::Debug + MaybeConnectionError; + /// Type of the additional data from the target client, used by the race. + type TargetNoncesData: std::fmt::Debug; + /// Type of batch transaction that submits finality and proof to the target node. + type BatchTransaction: BatchTransaction + Clone; + /// Transaction tracker to track submitted transactions. + type TransactionTracker: TransactionTracker; + + /// Ask headers relay to relay finalized headers up to (and including) given header + /// from race source to race target. + /// + /// The client may return `Some(_)`, which means that nothing has happened yet and + /// the caller must generate and append proof to the batch transaction + /// to actually send it (along with required header) to the node. + /// + /// If function has returned `None`, it means that the caller now must wait for the + /// appearance of the required header `id` at the target client. + async fn require_source_header( + &self, + id: P::SourceHeaderId, + ) -> Result, Self::Error>; + + /// Return nonces that are known to the target client. + async fn nonces( + &self, + at_block: P::TargetHeaderId, + update_metrics: bool, + ) -> Result<(P::TargetHeaderId, TargetClientNonces), Self::Error>; + /// Submit proof to the target client. + async fn submit_proof( + &self, + maybe_batch_tx: Option, + generated_at_block: P::SourceHeaderId, + nonces: RangeInclusive, + proof: P::Proof, + ) -> Result, Self::Error>; +} + +/// Race strategy. +#[async_trait] +pub trait RaceStrategy: Debug { + /// Type of nonces range expected from the source client. + type SourceNoncesRange: NoncesRange; + /// Additional proof parameters required to generate proof. + type ProofParameters; + /// Additional data expected from the target client. + type TargetNoncesData; + + /// Should return true if nothing has to be synced. + fn is_empty(&self) -> bool; + /// Return id of source header that is required to be on target to continue synchronization. + async fn required_source_header_at_target>( + &self, + race_state: RS, + ) -> Option; + /// Return the best nonce at source node. + /// + /// `Some` is returned only if we are sure that the value is greater or equal + /// than the result of `best_at_target`. + fn best_at_source(&self) -> Option; + /// Return the best nonce at target node. + /// + /// May return `None` if value is yet unknown. + fn best_at_target(&self) -> Option; + + /// Called when nonces are updated at source node of the race. + fn source_nonces_updated( + &mut self, + at_block: SourceHeaderId, + nonces: SourceClientNonces, + ); + /// Called when we want to wait until next `best_target_nonces_updated` before selecting + /// any nonces for delivery. + fn reset_best_target_nonces(&mut self); + /// Called when best nonces are updated at target node of the race. + fn best_target_nonces_updated>( + &mut self, + nonces: TargetClientNonces, + race_state: &mut RS, + ); + /// Called when finalized nonces are updated at target node of the race. + fn finalized_target_nonces_updated>( + &mut self, + nonces: TargetClientNonces, + race_state: &mut RS, + ); + /// Should return `Some(nonces)` if we need to deliver proof of `nonces` (and associated + /// data) from source to target node. + /// Additionally, parameters required to generate proof are returned. + async fn select_nonces_to_deliver>( + &self, + race_state: RS, + ) -> Option<(RangeInclusive, Self::ProofParameters)>; +} + +/// State of the race. +pub trait RaceState: Clone + Send + Sync { + /// Set best finalized source header id at the best block on the target + /// client (at the `best_finalized_source_header_id_at_best_target`). + fn set_best_finalized_source_header_id_at_best_target(&mut self, id: SourceHeaderId); + + /// Best finalized source header id at the source client. + fn best_finalized_source_header_id_at_source(&self) -> Option; + /// Best finalized source header id at the best block on the target + /// client (at the `best_finalized_source_header_id_at_best_target`). + fn best_finalized_source_header_id_at_best_target(&self) -> Option; + /// The best header id at the target client. + fn best_target_header_id(&self) -> Option; + /// Best finalized header id at the target client. + fn best_finalized_target_header_id(&self) -> Option; + + /// Returns `true` if we have selected nonces to submit to the target node. + fn nonces_to_submit(&self) -> Option>; + /// Reset our nonces selection. + fn reset_nonces_to_submit(&mut self); + + /// Returns `true` if we have submitted some nonces to the target node and are + /// waiting for them to appear there. + fn nonces_submitted(&self) -> Option>; + /// Reset our nonces submission. + fn reset_nonces_submitted(&mut self); +} + +/// State of the race and prepared batch transaction (if available). +#[derive(Debug, Clone)] +pub(crate) struct RaceStateImpl { + /// Best finalized source header id at the source client. + pub best_finalized_source_header_id_at_source: Option, + /// Best finalized source header id at the best block on the target + /// client (at the `best_finalized_source_header_id_at_best_target`). + pub best_finalized_source_header_id_at_best_target: Option, + /// The best header id at the target client. + pub best_target_header_id: Option, + /// Best finalized header id at the target client. + pub best_finalized_target_header_id: Option, + /// Range of nonces that we have selected to submit. + pub nonces_to_submit: Option<(SourceHeaderId, RangeInclusive, Proof)>, + /// Batch transaction ready to include and deliver selected `nonces_to_submit` from the + /// `state`. + pub nonces_to_submit_batch: Option, + /// Range of nonces that is currently submitted. + pub nonces_submitted: Option>, +} + +impl Default + for RaceStateImpl +{ + fn default() -> Self { + RaceStateImpl { + best_finalized_source_header_id_at_source: None, + best_finalized_source_header_id_at_best_target: None, + best_target_header_id: None, + best_finalized_target_header_id: None, + nonces_to_submit: None, + nonces_to_submit_batch: None, + nonces_submitted: None, + } + } +} + +impl RaceState + for RaceStateImpl +where + SourceHeaderId: Clone + Send + Sync, + TargetHeaderId: Clone + Send + Sync, + Proof: Clone + Send + Sync, + BatchTx: Clone + Send + Sync, +{ + fn set_best_finalized_source_header_id_at_best_target(&mut self, id: SourceHeaderId) { + self.best_finalized_source_header_id_at_best_target = Some(id); + } + + fn best_finalized_source_header_id_at_source(&self) -> Option { + self.best_finalized_source_header_id_at_source.clone() + } + + fn best_finalized_source_header_id_at_best_target(&self) -> Option { + self.best_finalized_source_header_id_at_best_target.clone() + } + + fn best_target_header_id(&self) -> Option { + self.best_target_header_id.clone() + } + + fn best_finalized_target_header_id(&self) -> Option { + self.best_finalized_target_header_id.clone() + } + + fn nonces_to_submit(&self) -> Option> { + self.nonces_to_submit.clone().map(|(_, nonces, _)| nonces) + } + + fn reset_nonces_to_submit(&mut self) { + self.nonces_to_submit = None; + self.nonces_to_submit_batch = None; + } + + fn nonces_submitted(&self) -> Option> { + self.nonces_submitted.clone() + } + + fn reset_nonces_submitted(&mut self) { + self.nonces_submitted = None; + } +} + +/// Run race loop until connection with target or source node is lost. +pub async fn run, TC: TargetClient

>( + race_source: SC, + race_source_updated: impl FusedStream>, + race_target: TC, + race_target_updated: impl FusedStream>, + mut strategy: impl RaceStrategy< + P::SourceHeaderId, + P::TargetHeaderId, + P::Proof, + SourceNoncesRange = SC::NoncesRange, + ProofParameters = SC::ProofParameters, + TargetNoncesData = TC::TargetNoncesData, + >, +) -> Result<(), FailedClient> { + let mut progress_context = Instant::now(); + let mut race_state = RaceStateImpl::default(); + + let mut source_retry_backoff = retry_backoff(); + let mut source_client_is_online = true; + let mut source_nonces_required = false; + let mut source_required_header = None; + let source_nonces = futures::future::Fuse::terminated(); + let source_generate_proof = futures::future::Fuse::terminated(); + let source_go_offline_future = futures::future::Fuse::terminated(); + + let mut target_retry_backoff = retry_backoff(); + let mut target_client_is_online = true; + let mut target_best_nonces_required = false; + let mut target_finalized_nonces_required = false; + let mut target_batch_transaction = None; + let target_require_source_header = futures::future::Fuse::terminated(); + let target_best_nonces = futures::future::Fuse::terminated(); + let target_finalized_nonces = futures::future::Fuse::terminated(); + let target_submit_proof = futures::future::Fuse::terminated(); + let target_tx_tracker = futures::future::Fuse::terminated(); + let target_go_offline_future = futures::future::Fuse::terminated(); + + futures::pin_mut!( + race_source_updated, + source_nonces, + source_generate_proof, + source_go_offline_future, + race_target_updated, + target_require_source_header, + target_best_nonces, + target_finalized_nonces, + target_submit_proof, + target_tx_tracker, + target_go_offline_future, + ); + + loop { + futures::select! { + // when headers ids are updated + source_state = race_source_updated.next() => { + if let Some(source_state) = source_state { + let is_source_state_updated = race_state.best_finalized_source_header_id_at_source.as_ref() + != Some(&source_state.best_finalized_self); + if is_source_state_updated { + source_nonces_required = true; + race_state.best_finalized_source_header_id_at_source + = Some(source_state.best_finalized_self); + } + } + }, + target_state = race_target_updated.next() => { + if let Some(target_state) = target_state { + let is_target_best_state_updated = race_state.best_target_header_id.as_ref() + != Some(&target_state.best_self); + + if is_target_best_state_updated { + target_best_nonces_required = true; + race_state.best_target_header_id = Some(target_state.best_self); + race_state.best_finalized_source_header_id_at_best_target + = target_state.best_finalized_peer_at_best_self; + } + + let is_target_finalized_state_updated = race_state.best_finalized_target_header_id.as_ref() + != Some(&target_state.best_finalized_self); + if is_target_finalized_state_updated { + target_finalized_nonces_required = true; + race_state.best_finalized_target_header_id = Some(target_state.best_finalized_self); + } + } + }, + + // when nonces are updated + nonces = source_nonces => { + source_nonces_required = false; + + source_client_is_online = process_future_result( + nonces, + &mut source_retry_backoff, + |(at_block, nonces)| { + log::debug!( + target: "bridge", + "Received nonces from {}: {:?}", + P::source_name(), + nonces, + ); + + strategy.source_nonces_updated(at_block, nonces); + }, + &mut source_go_offline_future, + async_std::task::sleep, + || format!("Error retrieving nonces from {}", P::source_name()), + ).fail_if_connection_error(FailedClient::Source)?; + + // ask for more headers if we have nonces to deliver and required headers are missing + source_required_header = strategy + .required_source_header_at_target(race_state.clone()) + .await; + }, + nonces = target_best_nonces => { + target_best_nonces_required = false; + + target_client_is_online = process_future_result( + nonces, + &mut target_retry_backoff, + |(_, nonces)| { + log::debug!( + target: "bridge", + "Received best nonces from {}: {:?}", + P::target_name(), + nonces, + ); + + strategy.best_target_nonces_updated(nonces, &mut race_state); + }, + &mut target_go_offline_future, + async_std::task::sleep, + || format!("Error retrieving best nonces from {}", P::target_name()), + ).fail_if_connection_error(FailedClient::Target)?; + }, + nonces = target_finalized_nonces => { + target_finalized_nonces_required = false; + + target_client_is_online = process_future_result( + nonces, + &mut target_retry_backoff, + |(_, nonces)| { + log::debug!( + target: "bridge", + "Received finalized nonces from {}: {:?}", + P::target_name(), + nonces, + ); + + strategy.finalized_target_nonces_updated(nonces, &mut race_state); + }, + &mut target_go_offline_future, + async_std::task::sleep, + || format!("Error retrieving finalized nonces from {}", P::target_name()), + ).fail_if_connection_error(FailedClient::Target)?; + }, + + // proof generation and submission + maybe_batch_transaction = target_require_source_header => { + source_required_header = None; + + target_client_is_online = process_future_result( + maybe_batch_transaction, + &mut target_retry_backoff, + |maybe_batch_transaction: Option| { + log::debug!( + target: "bridge", + "Target {} client has been asked for more {} headers. Batch tx: {}", + P::target_name(), + P::source_name(), + maybe_batch_transaction + .as_ref() + .map(|bt| format!("yes ({:?})", bt.required_header_id())) + .unwrap_or_else(|| "no".into()), + ); + + target_batch_transaction = maybe_batch_transaction; + }, + &mut target_go_offline_future, + async_std::task::sleep, + || format!("Error asking for source headers at {}", P::target_name()), + ).fail_if_connection_error(FailedClient::Target)?; + }, + proof = source_generate_proof => { + source_client_is_online = process_future_result( + proof, + &mut source_retry_backoff, + |(at_block, nonces_range, proof, batch_transaction)| { + log::debug!( + target: "bridge", + "Received proof for nonces in range {:?} from {}", + nonces_range, + P::source_name(), + ); + + race_state.nonces_to_submit = Some((at_block, nonces_range, proof)); + race_state.nonces_to_submit_batch = batch_transaction; + }, + &mut source_go_offline_future, + async_std::task::sleep, + || format!("Error generating proof at {}", P::source_name()), + ).fail_if_error(FailedClient::Source).map(|_| true)?; + }, + proof_submit_result = target_submit_proof => { + target_client_is_online = process_future_result( + proof_submit_result, + &mut target_retry_backoff, + |artifacts: NoncesSubmitArtifacts| { + log::debug!( + target: "bridge", + "Successfully submitted proof of nonces {:?} to {}", + artifacts.nonces, + P::target_name(), + ); + + race_state.nonces_submitted = Some(artifacts.nonces); + target_tx_tracker.set(artifacts.tx_tracker.wait().fuse()); + }, + &mut target_go_offline_future, + async_std::task::sleep, + || format!("Error submitting proof {}", P::target_name()), + ).fail_if_connection_error(FailedClient::Target)?; + + // in any case - we don't need to retry submitting the same nonces again until + // we read nonces from the target client + race_state.reset_nonces_to_submit(); + // if we have failed to submit transaction AND that is not the connection issue, + // then we need to read best target nonces before selecting nonces again + if !target_client_is_online { + strategy.reset_best_target_nonces(); + } + }, + target_transaction_status = target_tx_tracker => { + match (target_transaction_status, race_state.nonces_submitted.as_ref()) { + (TrackedTransactionStatus::Finalized(at_block), Some(nonces_submitted)) => { + // our transaction has been mined, but was it successful or not? let's check the best + // nonce at the target node. + let _ = race_target.nonces(at_block, false) + .await + .map_err(|e| format!("failed to read nonces from target node: {e:?}")) + .and_then(|(_, nonces_at_target)| { + if nonces_at_target.latest_nonce < *nonces_submitted.end() { + Err(format!( + "best nonce at target after tx is {:?} and we've submitted {:?}", + nonces_at_target.latest_nonce, + nonces_submitted.end(), + )) + } else { + Ok(()) + } + }) + .map_err(|e| { + log::error!( + target: "bridge", + "{} -> {} race transaction failed: {}", + P::source_name(), + P::target_name(), + e, + ); + + race_state.reset_nonces_submitted(); + }); + }, + (TrackedTransactionStatus::Lost, _) => { + log::warn!( + target: "bridge", + "{} -> {} race transaction has been lost. State: {:?}. Strategy: {:?}", + P::source_name(), + P::target_name(), + race_state, + strategy, + ); + + race_state.reset_nonces_submitted(); + }, + _ => (), + } + }, + + // when we're ready to retry request + _ = source_go_offline_future => { + source_client_is_online = true; + }, + _ = target_go_offline_future => { + target_client_is_online = true; + }, + } + + progress_context = print_race_progress::(progress_context, &strategy); + + if source_client_is_online { + source_client_is_online = false; + + // if we've started to submit batch transaction, let's prioritize it + // + // we're using `take` here, because we don't need batch transaction (i.e. some + // underlying finality proof) anymore for our future calls - we were unable to + // use it for our current state, so why would we need to keep an obsolete proof + // for the future? + let target_batch_transaction = target_batch_transaction.take(); + let expected_race_state = + if let Some(ref target_batch_transaction) = target_batch_transaction { + // when selecting nonces for the batch transaction, we assume that the required + // source header is already at the target chain + let required_source_header_at_target = + target_batch_transaction.required_header_id(); + let mut expected_race_state = race_state.clone(); + expected_race_state.best_finalized_source_header_id_at_best_target = + Some(required_source_header_at_target); + expected_race_state + } else { + race_state.clone() + }; + + let nonces_to_deliver = select_nonces_to_deliver(expected_race_state, &strategy).await; + let best_at_source = strategy.best_at_source(); + + if let Some((at_block, nonces_range, proof_parameters)) = nonces_to_deliver { + log::debug!( + target: "bridge", + "Asking {} to prove nonces in range {:?} at block {:?}", + P::source_name(), + nonces_range, + at_block, + ); + + source_generate_proof.set( + race_source + .generate_proof(at_block, nonces_range, proof_parameters) + .and_then(|(at_source_block, nonces, proof)| async { + Ok((at_source_block, nonces, proof, target_batch_transaction)) + }) + .fuse(), + ); + } else if let (true, Some(best_at_source)) = (source_nonces_required, best_at_source) { + log::debug!(target: "bridge", "Asking {} about message nonces", P::source_name()); + let at_block = race_state + .best_finalized_source_header_id_at_source + .as_ref() + .expect( + "source_nonces_required is only true when\ + best_finalized_source_header_id_at_source is Some; qed", + ) + .clone(); + source_nonces.set(race_source.nonces(at_block, best_at_source).fuse()); + } else { + source_client_is_online = true; + } + } + + if target_client_is_online { + target_client_is_online = false; + + if let Some((at_block, nonces_range, proof)) = race_state.nonces_to_submit.as_ref() { + log::debug!( + target: "bridge", + "Going to submit proof of messages in range {:?} to {} node{}", + nonces_range, + P::target_name(), + race_state.nonces_to_submit_batch.as_ref().map(|tx| format!( + ". This transaction is batched with sending the proof for header {:?}.", + tx.required_header_id()) + ).unwrap_or_default(), + ); + + target_submit_proof.set( + race_target + .submit_proof( + race_state.nonces_to_submit_batch.clone(), + at_block.clone(), + nonces_range.clone(), + proof.clone(), + ) + .fuse(), + ); + } else if let Some(source_required_header) = source_required_header.clone() { + log::debug!( + target: "bridge", + "Going to require {} header {:?} at {}", + P::source_name(), + source_required_header, + P::target_name(), + ); + target_require_source_header + .set(race_target.require_source_header(source_required_header).fuse()); + } else if target_best_nonces_required { + log::debug!(target: "bridge", "Asking {} about best message nonces", P::target_name()); + let at_block = race_state + .best_target_header_id + .as_ref() + .expect("target_best_nonces_required is only true when best_target_header_id is Some; qed") + .clone(); + target_best_nonces.set(race_target.nonces(at_block, false).fuse()); + } else if target_finalized_nonces_required { + log::debug!(target: "bridge", "Asking {} about finalized message nonces", P::target_name()); + let at_block = race_state + .best_finalized_target_header_id + .as_ref() + .expect( + "target_finalized_nonces_required is only true when\ + best_finalized_target_header_id is Some; qed", + ) + .clone(); + target_finalized_nonces.set(race_target.nonces(at_block, true).fuse()); + } else { + target_client_is_online = true; + } + } + } +} + +/// Print race progress. +fn print_race_progress(prev_time: Instant, strategy: &S) -> Instant +where + P: MessageRace, + S: RaceStrategy, +{ + let now_time = Instant::now(); + + let need_update = now_time.saturating_duration_since(prev_time) > Duration::from_secs(10); + if !need_update { + return prev_time + } + + let now_best_nonce_at_source = strategy.best_at_source(); + let now_best_nonce_at_target = strategy.best_at_target(); + log::info!( + target: "bridge", + "Synced {:?} of {:?} nonces in {} -> {} race", + now_best_nonce_at_target, + now_best_nonce_at_source, + P::source_name(), + P::target_name(), + ); + now_time +} + +async fn select_nonces_to_deliver( + race_state: impl RaceState, + strategy: &Strategy, +) -> Option<(SourceHeaderId, RangeInclusive, Strategy::ProofParameters)> +where + SourceHeaderId: Clone, + Strategy: RaceStrategy, +{ + let best_finalized_source_header_id_at_best_target = + race_state.best_finalized_source_header_id_at_best_target()?; + strategy + .select_nonces_to_deliver(race_state) + .await + .map(|(nonces_range, proof_parameters)| { + (best_finalized_source_header_id_at_best_target, nonces_range, proof_parameters) + }) +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::message_race_strategy::BasicStrategy; + use relay_utils::HeaderId; + + #[async_std::test] + async fn proof_is_generated_at_best_block_known_to_target_node() { + const GENERATED_AT: u64 = 6; + const BEST_AT_SOURCE: u64 = 10; + const BEST_AT_TARGET: u64 = 8; + + // target node only knows about source' BEST_AT_TARGET block + // source node has BEST_AT_SOURCE > BEST_AT_TARGET block + let mut race_state = RaceStateImpl::<_, _, (), ()> { + best_finalized_source_header_id_at_source: Some(HeaderId( + BEST_AT_SOURCE, + BEST_AT_SOURCE, + )), + best_finalized_source_header_id_at_best_target: Some(HeaderId( + BEST_AT_TARGET, + BEST_AT_TARGET, + )), + best_target_header_id: Some(HeaderId(0, 0)), + best_finalized_target_header_id: Some(HeaderId(0, 0)), + nonces_to_submit: None, + nonces_to_submit_batch: None, + nonces_submitted: None, + }; + + // we have some nonces to deliver and they're generated at GENERATED_AT < BEST_AT_SOURCE + let mut strategy = BasicStrategy::<_, _, _, _, _, ()>::new(); + strategy.source_nonces_updated( + HeaderId(GENERATED_AT, GENERATED_AT), + SourceClientNonces { new_nonces: 0..=10, confirmed_nonce: None }, + ); + strategy.best_target_nonces_updated( + TargetClientNonces { latest_nonce: 5u64, nonces_data: () }, + &mut race_state, + ); + + // the proof will be generated on source, but using BEST_AT_TARGET block + assert_eq!( + select_nonces_to_deliver(race_state, &strategy).await, + Some((HeaderId(BEST_AT_TARGET, BEST_AT_TARGET), 6..=10, (),)) + ); + } +} diff --git a/bridges/relays/messages/src/message_race_receiving.rs b/bridges/relays/messages/src/message_race_receiving.rs new file mode 100644 index 0000000000000000000000000000000000000000..e6497a1b79eb70999f16cd0c1926ae9cf0ad5411 --- /dev/null +++ b/bridges/relays/messages/src/message_race_receiving.rs @@ -0,0 +1,235 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +//! Message receiving race delivers proof-of-messages-delivery from "lane.target" to "lane.source". + +use crate::{ + message_lane::{MessageLane, SourceHeaderIdOf, TargetHeaderIdOf}, + message_lane_loop::{ + NoncesSubmitArtifacts, SourceClient as MessageLaneSourceClient, SourceClientState, + TargetClient as MessageLaneTargetClient, TargetClientState, + }, + message_race_loop::{ + MessageRace, NoncesRange, SourceClient, SourceClientNonces, TargetClient, + TargetClientNonces, + }, + message_race_strategy::BasicStrategy, + metrics::MessageLaneLoopMetrics, +}; + +use async_trait::async_trait; +use bp_messages::MessageNonce; +use futures::stream::FusedStream; +use relay_utils::FailedClient; +use std::{marker::PhantomData, ops::RangeInclusive}; + +/// Message receiving confirmations delivery strategy. +type ReceivingConfirmationsBasicStrategy

= BasicStrategy< +

::TargetHeaderNumber, +

::TargetHeaderHash, +

::SourceHeaderNumber, +

::SourceHeaderHash, + RangeInclusive, +

::MessagesReceivingProof, +>; + +/// Run receiving confirmations race. +pub async fn run( + source_client: impl MessageLaneSourceClient

, + source_state_updates: impl FusedStream>, + target_client: impl MessageLaneTargetClient

, + target_state_updates: impl FusedStream>, + metrics_msg: Option, +) -> Result<(), FailedClient> { + crate::message_race_loop::run( + ReceivingConfirmationsRaceSource { + client: target_client, + metrics_msg: metrics_msg.clone(), + _phantom: Default::default(), + }, + target_state_updates, + ReceivingConfirmationsRaceTarget { + client: source_client, + metrics_msg, + _phantom: Default::default(), + }, + source_state_updates, + ReceivingConfirmationsBasicStrategy::

::new(), + ) + .await +} + +/// Messages receiving confirmations race. +struct ReceivingConfirmationsRace

(std::marker::PhantomData

); + +impl MessageRace for ReceivingConfirmationsRace

{ + type SourceHeaderId = TargetHeaderIdOf

; + type TargetHeaderId = SourceHeaderIdOf

; + + type MessageNonce = MessageNonce; + type Proof = P::MessagesReceivingProof; + + fn source_name() -> String { + format!("{}::ReceivingConfirmationsDelivery", P::TARGET_NAME) + } + + fn target_name() -> String { + format!("{}::ReceivingConfirmationsDelivery", P::SOURCE_NAME) + } +} + +/// Message receiving confirmations race source, which is a target of the lane. +struct ReceivingConfirmationsRaceSource { + client: C, + metrics_msg: Option, + _phantom: PhantomData

, +} + +#[async_trait] +impl SourceClient> for ReceivingConfirmationsRaceSource +where + P: MessageLane, + C: MessageLaneTargetClient

, +{ + type Error = C::Error; + type NoncesRange = RangeInclusive; + type ProofParameters = (); + + async fn nonces( + &self, + at_block: TargetHeaderIdOf

, + prev_latest_nonce: MessageNonce, + ) -> Result<(TargetHeaderIdOf

, SourceClientNonces), Self::Error> { + let (at_block, latest_received_nonce) = self.client.latest_received_nonce(at_block).await?; + if let Some(metrics_msg) = self.metrics_msg.as_ref() { + metrics_msg.update_target_latest_received_nonce(latest_received_nonce); + } + Ok(( + at_block, + SourceClientNonces { + new_nonces: prev_latest_nonce + 1..=latest_received_nonce, + confirmed_nonce: None, + }, + )) + } + + #[allow(clippy::unit_arg)] + async fn generate_proof( + &self, + at_block: TargetHeaderIdOf

, + nonces: RangeInclusive, + _proof_parameters: Self::ProofParameters, + ) -> Result< + (TargetHeaderIdOf

, RangeInclusive, P::MessagesReceivingProof), + Self::Error, + > { + self.client + .prove_messages_receiving(at_block) + .await + .map(|(at_block, proof)| (at_block, nonces, proof)) + } +} + +/// Message receiving confirmations race target, which is a source of the lane. +struct ReceivingConfirmationsRaceTarget { + client: C, + metrics_msg: Option, + _phantom: PhantomData

, +} + +#[async_trait] +impl TargetClient> for ReceivingConfirmationsRaceTarget +where + P: MessageLane, + C: MessageLaneSourceClient

, +{ + type Error = C::Error; + type TargetNoncesData = (); + type BatchTransaction = C::BatchTransaction; + type TransactionTracker = C::TransactionTracker; + + async fn require_source_header( + &self, + id: TargetHeaderIdOf

, + ) -> Result, Self::Error> { + self.client.require_target_header_on_source(id).await + } + + async fn nonces( + &self, + at_block: SourceHeaderIdOf

, + update_metrics: bool, + ) -> Result<(SourceHeaderIdOf

, TargetClientNonces<()>), Self::Error> { + let (at_block, latest_confirmed_nonce) = + self.client.latest_confirmed_received_nonce(at_block).await?; + if update_metrics { + if let Some(metrics_msg) = self.metrics_msg.as_ref() { + metrics_msg.update_source_latest_confirmed_nonce(latest_confirmed_nonce); + } + } + Ok((at_block, TargetClientNonces { latest_nonce: latest_confirmed_nonce, nonces_data: () })) + } + + async fn submit_proof( + &self, + maybe_batch_tx: Option, + generated_at_block: TargetHeaderIdOf

, + nonces: RangeInclusive, + proof: P::MessagesReceivingProof, + ) -> Result, Self::Error> { + let tx_tracker = self + .client + .submit_messages_receiving_proof(maybe_batch_tx, generated_at_block, proof) + .await?; + Ok(NoncesSubmitArtifacts { nonces, tx_tracker }) + } +} + +impl NoncesRange for RangeInclusive { + fn begin(&self) -> MessageNonce { + *RangeInclusive::::start(self) + } + + fn end(&self) -> MessageNonce { + *RangeInclusive::::end(self) + } + + fn greater_than(self, nonce: MessageNonce) -> Option { + let next_nonce = nonce + 1; + let end = *self.end(); + if next_nonce > end { + None + } else { + Some(std::cmp::max(self.begin(), next_nonce)..=end) + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn range_inclusive_works_as_nonces_range() { + let range = 20..=30; + + assert_eq!(NoncesRange::begin(&range), 20); + assert_eq!(NoncesRange::end(&range), 30); + assert_eq!(range.clone().greater_than(10), Some(20..=30)); + assert_eq!(range.clone().greater_than(19), Some(20..=30)); + assert_eq!(range.clone().greater_than(20), Some(21..=30)); + assert_eq!(range.clone().greater_than(25), Some(26..=30)); + assert_eq!(range.clone().greater_than(29), Some(30..=30)); + assert_eq!(range.greater_than(30), None); + } +} diff --git a/bridges/relays/messages/src/message_race_strategy.rs b/bridges/relays/messages/src/message_race_strategy.rs new file mode 100644 index 0000000000000000000000000000000000000000..93d178e55b04f64a9631f04b4e93b67594d67e54 --- /dev/null +++ b/bridges/relays/messages/src/message_race_strategy.rs @@ -0,0 +1,628 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +//! Basic delivery strategy. The strategy selects nonces if: +//! +//! 1) there are more nonces on the source side than on the target side; +//! 2) new nonces may be proved to target node (i.e. they have appeared at the block, which is known +//! to the target node). + +use crate::message_race_loop::{ + NoncesRange, RaceState, RaceStrategy, SourceClientNonces, TargetClientNonces, +}; + +use async_trait::async_trait; +use bp_messages::MessageNonce; +use relay_utils::HeaderId; +use std::{collections::VecDeque, fmt::Debug, marker::PhantomData, ops::RangeInclusive}; + +/// Queue of nonces known to the source node. +pub type SourceRangesQueue = + VecDeque<(HeaderId, SourceNoncesRange)>; + +/// Nonces delivery strategy. +#[derive(Debug)] +pub struct BasicStrategy< + SourceHeaderNumber, + SourceHeaderHash, + TargetHeaderNumber, + TargetHeaderHash, + SourceNoncesRange, + Proof, +> { + /// All queued nonces. + /// + /// The queue may contain already delivered nonces. We only remove entries from this + /// queue after corresponding nonces are finalized by the target chain. + source_queue: SourceRangesQueue, + /// The best nonce known to target node at its best block. `None` if it has not been received + /// yet. + best_target_nonce: Option, + /// Unused generic types dump. + _phantom: PhantomData<(TargetHeaderNumber, TargetHeaderHash, Proof)>, +} + +impl< + SourceHeaderNumber, + SourceHeaderHash, + TargetHeaderNumber, + TargetHeaderHash, + SourceNoncesRange, + Proof, + > + BasicStrategy< + SourceHeaderNumber, + SourceHeaderHash, + TargetHeaderNumber, + TargetHeaderHash, + SourceNoncesRange, + Proof, + > where + SourceHeaderHash: Clone, + SourceHeaderNumber: Clone + Ord, + SourceNoncesRange: NoncesRange, +{ + /// Create new delivery strategy. + pub fn new() -> Self { + BasicStrategy { + source_queue: VecDeque::new(), + best_target_nonce: None, + _phantom: Default::default(), + } + } + + /// Reference to source queue. + pub(crate) fn source_queue( + &self, + ) -> &VecDeque<(HeaderId, SourceNoncesRange)> { + &self.source_queue + } + + /// Mutable reference to source queue to use in tests. + #[cfg(test)] + pub(crate) fn source_queue_mut( + &mut self, + ) -> &mut VecDeque<(HeaderId, SourceNoncesRange)> { + &mut self.source_queue + } + + /// Returns indices of source queue entries, which may be delivered to the target node. + /// + /// The function may skip some nonces from the queue front if nonces from this entry are + /// already available at the **best** target block. After this block is finalized, the entry + /// will be removed from the queue. + /// + /// All entries before and including the range end index, are guaranteed to be witnessed + /// at source blocks that are known to be finalized at the target node. + /// + /// Returns `None` if no entries may be delivered. + pub fn available_source_queue_indices< + RS: RaceState< + HeaderId, + HeaderId, + >, + >( + &self, + race_state: RS, + ) -> Option> { + // if we do not know best nonce at target node, we can't select anything + let best_target_nonce = self.best_target_nonce?; + + // if we have already selected nonces that we want to submit, do nothing + if race_state.nonces_to_submit().is_some() { + return None + } + + // if we already submitted some nonces, do nothing + if race_state.nonces_submitted().is_some() { + return None + } + + // find first entry that may be delivered to the target node + let begin_index = self + .source_queue + .iter() + .enumerate() + .skip_while(|(_, (_, nonces))| nonces.end() <= best_target_nonce) + .map(|(index, _)| index) + .next()?; + + // 1) we want to deliver all nonces, starting from `target_nonce + 1` + // 2) we can't deliver new nonce until header, that has emitted this nonce, is finalized + // by target client + // 3) selector is used for more complicated logic + // + // => let's first select range of entries inside deque that are already finalized at + // the target client and pass this range to the selector + let best_header_at_target = race_state.best_finalized_source_header_id_at_best_target()?; + let end_index = self + .source_queue + .iter() + .enumerate() + .skip(begin_index) + .take_while(|(_, (queued_at, _))| queued_at.0 <= best_header_at_target.0) + .map(|(index, _)| index) + .last()?; + + Some(begin_index..=end_index) + } + + /// Remove all nonces that are less than or equal to given nonce from the source queue. + fn remove_le_nonces_from_source_queue(&mut self, nonce: MessageNonce) { + while let Some((queued_at, queued_range)) = self.source_queue.pop_front() { + if let Some(range_to_requeue) = queued_range.greater_than(nonce) { + self.source_queue.push_front((queued_at, range_to_requeue)); + break + } + } + } +} + +#[async_trait] +impl< + SourceHeaderNumber, + SourceHeaderHash, + TargetHeaderNumber, + TargetHeaderHash, + SourceNoncesRange, + Proof, + > + RaceStrategy< + HeaderId, + HeaderId, + Proof, + > + for BasicStrategy< + SourceHeaderNumber, + SourceHeaderHash, + TargetHeaderNumber, + TargetHeaderHash, + SourceNoncesRange, + Proof, + > where + SourceHeaderHash: Clone + Debug + Send + Sync, + SourceHeaderNumber: Clone + Ord + Debug + Send + Sync, + SourceNoncesRange: NoncesRange + Debug + Send + Sync, + TargetHeaderHash: Debug + Send + Sync, + TargetHeaderNumber: Debug + Send + Sync, + Proof: Debug + Send + Sync, +{ + type SourceNoncesRange = SourceNoncesRange; + type ProofParameters = (); + type TargetNoncesData = (); + + fn is_empty(&self) -> bool { + self.source_queue.is_empty() + } + + async fn required_source_header_at_target< + RS: RaceState< + HeaderId, + HeaderId, + >, + >( + &self, + race_state: RS, + ) -> Option> { + let current_best = race_state.best_finalized_source_header_id_at_best_target()?; + self.source_queue + .back() + .and_then(|(h, _)| if h.0 > current_best.0 { Some(h.clone()) } else { None }) + } + + fn best_at_source(&self) -> Option { + let best_in_queue = self.source_queue.back().map(|(_, range)| range.end()); + match (best_in_queue, self.best_target_nonce) { + (Some(best_in_queue), Some(best_target_nonce)) if best_in_queue > best_target_nonce => + Some(best_in_queue), + (_, Some(best_target_nonce)) => Some(best_target_nonce), + (_, None) => None, + } + } + + fn best_at_target(&self) -> Option { + self.best_target_nonce + } + + fn source_nonces_updated( + &mut self, + at_block: HeaderId, + nonces: SourceClientNonces, + ) { + let best_in_queue = self + .source_queue + .back() + .map(|(_, range)| range.end()) + .or(self.best_target_nonce) + .unwrap_or_default(); + self.source_queue.extend( + nonces + .new_nonces + .greater_than(best_in_queue) + .into_iter() + .map(move |range| (at_block.clone(), range)), + ) + } + + fn reset_best_target_nonces(&mut self) { + self.best_target_nonce = None; + } + + fn best_target_nonces_updated< + RS: RaceState< + HeaderId, + HeaderId, + >, + >( + &mut self, + nonces: TargetClientNonces<()>, + race_state: &mut RS, + ) { + let nonce = nonces.latest_nonce; + + // if **some** of nonces that we have selected to submit already present at the + // target chain => select new nonces + let need_to_select_new_nonces = race_state + .nonces_to_submit() + .map(|nonces| nonce >= *nonces.start()) + .unwrap_or(false); + if need_to_select_new_nonces { + log::trace!( + target: "bridge", + "Latest nonce at target is {}. Clearing nonces to submit: {:?}", + nonce, + race_state.nonces_to_submit(), + ); + + race_state.reset_nonces_to_submit(); + } + + // if **some** of nonces that we have submitted already present at the + // target chain => select new nonces + let need_new_nonces_to_submit = race_state + .nonces_submitted() + .map(|nonces| nonce >= *nonces.start()) + .unwrap_or(false); + if need_new_nonces_to_submit { + log::trace!( + target: "bridge", + "Latest nonce at target is {}. Clearing submitted nonces: {:?}", + nonce, + race_state.nonces_submitted(), + ); + + race_state.reset_nonces_submitted(); + } + + self.best_target_nonce = Some(nonce); + } + + fn finalized_target_nonces_updated< + RS: RaceState< + HeaderId, + HeaderId, + >, + >( + &mut self, + nonces: TargetClientNonces<()>, + _race_state: &mut RS, + ) { + self.remove_le_nonces_from_source_queue(nonces.latest_nonce); + self.best_target_nonce = Some(std::cmp::max( + self.best_target_nonce.unwrap_or(nonces.latest_nonce), + nonces.latest_nonce, + )); + } + + async fn select_nonces_to_deliver< + RS: RaceState< + HeaderId, + HeaderId, + >, + >( + &self, + race_state: RS, + ) -> Option<(RangeInclusive, Self::ProofParameters)> { + let available_indices = self.available_source_queue_indices(race_state)?; + let range_begin = std::cmp::max( + self.best_target_nonce? + 1, + self.source_queue[*available_indices.start()].1.begin(), + ); + let range_end = self.source_queue[*available_indices.end()].1.end(); + Some((range_begin..=range_end, ())) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::{ + message_lane::{MessageLane, SourceHeaderIdOf, TargetHeaderIdOf}, + message_lane_loop::tests::{ + header_id, TestMessageLane, TestMessagesProof, TestSourceHeaderHash, + TestSourceHeaderNumber, + }, + message_race_loop::RaceStateImpl, + }; + + type SourceNoncesRange = RangeInclusive; + + type TestRaceStateImpl = RaceStateImpl< + SourceHeaderIdOf, + TargetHeaderIdOf, + TestMessagesProof, + (), + >; + + type BasicStrategy

= super::BasicStrategy< +

::SourceHeaderNumber, +

::SourceHeaderHash, +

::TargetHeaderNumber, +

::TargetHeaderHash, + SourceNoncesRange, +

::MessagesProof, + >; + + fn source_nonces(new_nonces: SourceNoncesRange) -> SourceClientNonces { + SourceClientNonces { new_nonces, confirmed_nonce: None } + } + + fn target_nonces(latest_nonce: MessageNonce) -> TargetClientNonces<()> { + TargetClientNonces { latest_nonce, nonces_data: () } + } + + #[test] + fn strategy_is_empty_works() { + let mut strategy = BasicStrategy::::new(); + assert!(strategy.is_empty()); + strategy.source_nonces_updated(header_id(1), source_nonces(1..=1)); + assert!(!strategy.is_empty()); + } + + #[test] + fn best_at_source_is_never_lower_than_target_nonce() { + let mut strategy = BasicStrategy::::new(); + assert_eq!(strategy.best_at_source(), None); + strategy.source_nonces_updated(header_id(1), source_nonces(1..=5)); + assert_eq!(strategy.best_at_source(), None); + strategy.best_target_nonces_updated(target_nonces(10), &mut TestRaceStateImpl::default()); + assert_eq!(strategy.source_queue, vec![(header_id(1), 1..=5)]); + assert_eq!(strategy.best_at_source(), Some(10)); + } + + #[test] + fn source_nonce_is_never_lower_than_known_target_nonce() { + let mut strategy = BasicStrategy::::new(); + strategy.best_target_nonces_updated(target_nonces(10), &mut TestRaceStateImpl::default()); + strategy.source_nonces_updated(header_id(1), source_nonces(1..=5)); + assert_eq!(strategy.source_queue, vec![]); + } + + #[test] + fn source_nonce_is_never_lower_than_latest_known_source_nonce() { + let mut strategy = BasicStrategy::::new(); + strategy.source_nonces_updated(header_id(1), source_nonces(1..=5)); + strategy.source_nonces_updated(header_id(2), source_nonces(1..=3)); + strategy.source_nonces_updated(header_id(2), source_nonces(1..=5)); + assert_eq!(strategy.source_queue, vec![(header_id(1), 1..=5)]); + } + + #[test] + fn updated_target_nonce_removes_queued_entries() { + let mut strategy = BasicStrategy::::new(); + strategy.source_nonces_updated(header_id(1), source_nonces(1..=5)); + strategy.source_nonces_updated(header_id(2), source_nonces(6..=10)); + strategy.source_nonces_updated(header_id(3), source_nonces(11..=15)); + strategy.source_nonces_updated(header_id(4), source_nonces(16..=20)); + strategy + .finalized_target_nonces_updated(target_nonces(15), &mut TestRaceStateImpl::default()); + assert_eq!(strategy.source_queue, vec![(header_id(4), 16..=20)]); + strategy + .finalized_target_nonces_updated(target_nonces(17), &mut TestRaceStateImpl::default()); + assert_eq!(strategy.source_queue, vec![(header_id(4), 18..=20)]); + } + + #[test] + fn selected_nonces_are_dropped_on_target_nonce_update() { + let mut state = TestRaceStateImpl::default(); + let mut strategy = BasicStrategy::::new(); + state.nonces_to_submit = Some((header_id(1), 5..=10, (5..=10, None))); + // we are going to submit 5..=10, so having latest nonce 4 at target is fine + strategy.best_target_nonces_updated(target_nonces(4), &mut state); + assert!(state.nonces_to_submit.is_some()); + // any nonce larger than 4 invalidates the `nonces_to_submit` + for nonce in 5..=11 { + state.nonces_to_submit = Some((header_id(1), 5..=10, (5..=10, None))); + strategy.best_target_nonces_updated(target_nonces(nonce), &mut state); + assert!(state.nonces_to_submit.is_none()); + } + } + + #[test] + fn submitted_nonces_are_dropped_on_target_nonce_update() { + let mut state = TestRaceStateImpl::default(); + let mut strategy = BasicStrategy::::new(); + state.nonces_submitted = Some(5..=10); + // we have submitted 5..=10, so having latest nonce 4 at target is fine + strategy.best_target_nonces_updated(target_nonces(4), &mut state); + assert!(state.nonces_submitted.is_some()); + // any nonce larger than 4 invalidates the `nonces_submitted` + for nonce in 5..=11 { + state.nonces_submitted = Some(5..=10); + strategy.best_target_nonces_updated(target_nonces(nonce), &mut state); + assert!(state.nonces_submitted.is_none()); + } + } + + #[async_std::test] + async fn nothing_is_selected_if_something_is_already_selected() { + let mut state = TestRaceStateImpl::default(); + let mut strategy = BasicStrategy::::new(); + state.nonces_to_submit = Some((header_id(1), 1..=10, (1..=10, None))); + strategy.best_target_nonces_updated(target_nonces(0), &mut state); + strategy.source_nonces_updated(header_id(1), source_nonces(1..=10)); + assert_eq!(strategy.select_nonces_to_deliver(state.clone()).await, None); + } + + #[async_std::test] + async fn nothing_is_selected_if_something_is_already_submitted() { + let mut state = TestRaceStateImpl::default(); + let mut strategy = BasicStrategy::::new(); + state.nonces_submitted = Some(1..=10); + strategy.best_target_nonces_updated(target_nonces(0), &mut state); + strategy.source_nonces_updated(header_id(1), source_nonces(1..=10)); + assert_eq!(strategy.select_nonces_to_deliver(state.clone()).await, None); + } + + #[async_std::test] + async fn select_nonces_to_deliver_works() { + let mut state = TestRaceStateImpl::default(); + let mut strategy = BasicStrategy::::new(); + strategy.best_target_nonces_updated(target_nonces(0), &mut state); + strategy.source_nonces_updated(header_id(1), source_nonces(1..=1)); + strategy.source_nonces_updated(header_id(2), source_nonces(2..=2)); + strategy.source_nonces_updated(header_id(3), source_nonces(3..=6)); + strategy.source_nonces_updated(header_id(5), source_nonces(7..=8)); + + state.best_finalized_source_header_id_at_best_target = Some(header_id(4)); + assert_eq!(strategy.select_nonces_to_deliver(state.clone()).await, Some((1..=6, ()))); + strategy.best_target_nonces_updated(target_nonces(6), &mut state); + assert_eq!(strategy.select_nonces_to_deliver(state.clone()).await, None); + + state.best_finalized_source_header_id_at_best_target = Some(header_id(5)); + assert_eq!(strategy.select_nonces_to_deliver(state.clone()).await, Some((7..=8, ()))); + strategy.best_target_nonces_updated(target_nonces(8), &mut state); + assert_eq!(strategy.select_nonces_to_deliver(state.clone()).await, None); + } + + #[test] + fn available_source_queue_indices_works() { + let mut state = TestRaceStateImpl::default(); + let mut strategy = BasicStrategy::::new(); + strategy.best_target_nonces_updated(target_nonces(0), &mut state); + strategy.source_nonces_updated(header_id(1), source_nonces(1..=3)); + strategy.source_nonces_updated(header_id(2), source_nonces(4..=6)); + strategy.source_nonces_updated(header_id(3), source_nonces(7..=9)); + + state.best_finalized_source_header_id_at_best_target = Some(header_id(0)); + assert_eq!(strategy.available_source_queue_indices(state.clone()), None); + + state.best_finalized_source_header_id_at_best_target = Some(header_id(1)); + assert_eq!(strategy.available_source_queue_indices(state.clone()), Some(0..=0)); + + state.best_finalized_source_header_id_at_best_target = Some(header_id(2)); + assert_eq!(strategy.available_source_queue_indices(state.clone()), Some(0..=1)); + + state.best_finalized_source_header_id_at_best_target = Some(header_id(3)); + assert_eq!(strategy.available_source_queue_indices(state.clone()), Some(0..=2)); + + state.best_finalized_source_header_id_at_best_target = Some(header_id(4)); + assert_eq!(strategy.available_source_queue_indices(state), Some(0..=2)); + } + + #[test] + fn remove_le_nonces_from_source_queue_works() { + let mut state = TestRaceStateImpl::default(); + let mut strategy = BasicStrategy::::new(); + strategy.best_target_nonces_updated(target_nonces(0), &mut state); + strategy.source_nonces_updated(header_id(1), source_nonces(1..=3)); + strategy.source_nonces_updated(header_id(2), source_nonces(4..=6)); + strategy.source_nonces_updated(header_id(3), source_nonces(7..=9)); + + fn source_queue_nonces( + source_queue: &SourceRangesQueue< + TestSourceHeaderHash, + TestSourceHeaderNumber, + SourceNoncesRange, + >, + ) -> Vec { + source_queue.iter().flat_map(|(_, range)| range.clone()).collect() + } + + strategy.remove_le_nonces_from_source_queue(1); + assert_eq!(source_queue_nonces(&strategy.source_queue), vec![2, 3, 4, 5, 6, 7, 8, 9],); + + strategy.remove_le_nonces_from_source_queue(5); + assert_eq!(source_queue_nonces(&strategy.source_queue), vec![6, 7, 8, 9],); + + strategy.remove_le_nonces_from_source_queue(9); + assert_eq!(source_queue_nonces(&strategy.source_queue), Vec::::new(),); + + strategy.remove_le_nonces_from_source_queue(100); + assert_eq!(source_queue_nonces(&strategy.source_queue), Vec::::new(),); + } + + #[async_std::test] + async fn previous_nonces_are_selected_if_reorg_happens_at_target_chain() { + let source_header_1 = header_id(1); + let target_header_1 = header_id(1); + + // we start in perfec sync state - all headers are synced and finalized on both ends + let mut state = TestRaceStateImpl { + best_finalized_source_header_id_at_source: Some(source_header_1), + best_finalized_source_header_id_at_best_target: Some(source_header_1), + best_target_header_id: Some(target_header_1), + best_finalized_target_header_id: Some(target_header_1), + nonces_to_submit: None, + nonces_to_submit_batch: None, + nonces_submitted: None, + }; + + // in this state we have 1 available nonce for delivery + let mut strategy = BasicStrategy:: { + source_queue: vec![(header_id(1), 1..=1)].into_iter().collect(), + best_target_nonce: Some(0), + _phantom: PhantomData, + }; + assert_eq!(strategy.select_nonces_to_deliver(state.clone()).await, Some((1..=1, ())),); + + // let's say we have submitted 1..=1 + state.nonces_submitted = Some(1..=1); + + // then new nonce 2 appear at the source block 2 + let source_header_2 = header_id(2); + state.best_finalized_source_header_id_at_source = Some(source_header_2); + strategy.source_nonces_updated( + source_header_2, + SourceClientNonces { new_nonces: 2..=2, confirmed_nonce: None }, + ); + // and nonce 1 appear at the best block of the target node (best finalized still has 0 + // nonces) + let target_header_2 = header_id(2); + state.best_target_header_id = Some(target_header_2); + strategy.best_target_nonces_updated( + TargetClientNonces { latest_nonce: 1, nonces_data: () }, + &mut state, + ); + + // then best target header is retracted + strategy.best_target_nonces_updated( + TargetClientNonces { latest_nonce: 0, nonces_data: () }, + &mut state, + ); + + // ... and some fork with zero delivered nonces is finalized + let target_header_2_fork = header_id(2_1); + state.best_finalized_source_header_id_at_source = Some(source_header_2); + state.best_finalized_source_header_id_at_best_target = Some(source_header_2); + state.best_target_header_id = Some(target_header_2_fork); + state.best_finalized_target_header_id = Some(target_header_2_fork); + strategy.finalized_target_nonces_updated( + TargetClientNonces { latest_nonce: 0, nonces_data: () }, + &mut state, + ); + + // now we have to select nonce 1 for delivery again + assert_eq!(strategy.select_nonces_to_deliver(state.clone()).await, Some((1..=2, ())),); + } +} diff --git a/bridges/relays/messages/src/metrics.rs b/bridges/relays/messages/src/metrics.rs new file mode 100644 index 0000000000000000000000000000000000000000..69d80d178de809211b1874965adcf02fd76a66b8 --- /dev/null +++ b/bridges/relays/messages/src/metrics.rs @@ -0,0 +1,148 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Metrics for message lane relay loop. + +use crate::{ + message_lane::MessageLane, + message_lane_loop::{SourceClientState, TargetClientState}, +}; + +use bp_messages::MessageNonce; +use finality_relay::SyncLoopMetrics; +use relay_utils::metrics::{ + metric_name, register, GaugeVec, Metric, Opts, PrometheusError, Registry, U64, +}; + +/// Message lane relay metrics. +/// +/// Cloning only clones references. +#[derive(Clone)] +pub struct MessageLaneLoopMetrics { + /// Best finalized block numbers - "source", "source_at_target", "target_at_source". + source_to_target_finality_metrics: SyncLoopMetrics, + /// Best finalized block numbers - "source", "target", "source_at_target", "target_at_source". + target_to_source_finality_metrics: SyncLoopMetrics, + /// Lane state nonces: "source_latest_generated", "source_latest_confirmed", + /// "target_latest_received", "target_latest_confirmed". + lane_state_nonces: GaugeVec, +} + +impl MessageLaneLoopMetrics { + /// Create and register messages loop metrics. + pub fn new(prefix: Option<&str>) -> Result { + Ok(MessageLaneLoopMetrics { + source_to_target_finality_metrics: SyncLoopMetrics::new( + prefix, + "source", + "source_at_target", + )?, + target_to_source_finality_metrics: SyncLoopMetrics::new( + prefix, + "target", + "target_at_source", + )?, + lane_state_nonces: GaugeVec::new( + Opts::new(metric_name(prefix, "lane_state_nonces"), "Nonces of the lane state"), + &["type"], + )?, + }) + } + + /// Update source client state metrics. + pub fn update_source_state(&self, source_client_state: SourceClientState

) { + self.source_to_target_finality_metrics + .update_best_block_at_source(source_client_state.best_self.0); + if let Some(best_finalized_peer_at_best_self) = + source_client_state.best_finalized_peer_at_best_self + { + self.target_to_source_finality_metrics + .update_best_block_at_target(best_finalized_peer_at_best_self.0); + if let Some(actual_best_finalized_peer_at_best_self) = + source_client_state.actual_best_finalized_peer_at_best_self + { + self.target_to_source_finality_metrics.update_using_same_fork( + best_finalized_peer_at_best_self.1 == actual_best_finalized_peer_at_best_self.1, + ); + } + } + } + + /// Update target client state metrics. + pub fn update_target_state(&self, target_client_state: TargetClientState

) { + self.target_to_source_finality_metrics + .update_best_block_at_source(target_client_state.best_self.0); + if let Some(best_finalized_peer_at_best_self) = + target_client_state.best_finalized_peer_at_best_self + { + self.source_to_target_finality_metrics + .update_best_block_at_target(best_finalized_peer_at_best_self.0); + if let Some(actual_best_finalized_peer_at_best_self) = + target_client_state.actual_best_finalized_peer_at_best_self + { + self.source_to_target_finality_metrics.update_using_same_fork( + best_finalized_peer_at_best_self.1 == actual_best_finalized_peer_at_best_self.1, + ); + } + } + } + + /// Update latest generated nonce at source. + pub fn update_source_latest_generated_nonce( + &self, + source_latest_generated_nonce: MessageNonce, + ) { + self.lane_state_nonces + .with_label_values(&["source_latest_generated"]) + .set(source_latest_generated_nonce); + } + + /// Update the latest confirmed nonce at source. + pub fn update_source_latest_confirmed_nonce( + &self, + source_latest_confirmed_nonce: MessageNonce, + ) { + self.lane_state_nonces + .with_label_values(&["source_latest_confirmed"]) + .set(source_latest_confirmed_nonce); + } + + /// Update the latest received nonce at target. + pub fn update_target_latest_received_nonce(&self, target_latest_generated_nonce: MessageNonce) { + self.lane_state_nonces + .with_label_values(&["target_latest_received"]) + .set(target_latest_generated_nonce); + } + + /// Update the latest confirmed nonce at target. + pub fn update_target_latest_confirmed_nonce( + &self, + target_latest_confirmed_nonce: MessageNonce, + ) { + self.lane_state_nonces + .with_label_values(&["target_latest_confirmed"]) + .set(target_latest_confirmed_nonce); + } +} + +impl Metric for MessageLaneLoopMetrics { + fn register(&self, registry: &Registry) -> Result<(), PrometheusError> { + self.source_to_target_finality_metrics.register(registry)?; + self.target_to_source_finality_metrics.register(registry)?; + register(self.lane_state_nonces.clone(), registry)?; + Ok(()) + } +} diff --git a/bridges/relays/parachains/Cargo.toml b/bridges/relays/parachains/Cargo.toml new file mode 100644 index 0000000000000000000000000000000000000000..a73a2f5b31c1aca5d93bf0b871b79b5e279da6ff --- /dev/null +++ b/bridges/relays/parachains/Cargo.toml @@ -0,0 +1,28 @@ +[package] +name = "parachains-relay" +version = "0.1.0" +authors.workspace = true +edition.workspace = true +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" +repository.workspace = true +publish = false + +[lints] +workspace = true + +[dependencies] +async-std = "1.9.0" +async-trait = "0.1.79" +futures = "0.3.30" +log = { workspace = true } +relay-utils = { path = "../utils" } + +# Bridge dependencies + +bp-polkadot-core = { path = "../../primitives/polkadot-core" } +relay-substrate-client = { path = "../client-substrate" } + +[dev-dependencies] +codec = { package = "parity-scale-codec", version = "3.6.1" } +relay-substrate-client = { path = "../client-substrate", features = ["test-helpers"] } +sp-core = { path = "../../../substrate/primitives/core" } diff --git a/bridges/relays/parachains/README.md b/bridges/relays/parachains/README.md new file mode 100644 index 0000000000000000000000000000000000000000..9043b0b0a9cdd84c984d62b4e7c3adc6df44d6bc --- /dev/null +++ b/bridges/relays/parachains/README.md @@ -0,0 +1,50 @@ +# Parachains Finality Relay + +The parachains finality relay works with two chains - source relay chain and target chain (which may be standalone +chain, relay chain or a parachain). The source chain must have the +[`paras` pallet](https://github.com/paritytech/polkadot/tree/master/runtime/parachains/src/paras) deployed at its +runtime. The target chain must have the [bridge parachains pallet](../../modules/parachains/) deployed at its runtime. + +The relay is configured to submit heads of one or several parachains. It pokes source chain periodically and compares +parachain heads that are known to the source relay chain to heads at the target chain. If there are new heads, +the relay submits them to the target chain. + +More: [Parachains Finality Relay Sequence Diagram](../../docs/parachains-finality-relay.html). + +## How to Use the Parachains Finality Relay + +There are only two traits that need to be implemented. The [`SourceChain`](./src/parachains_loop.rs) implementation +is supposed to connect to the source chain node. It must be able to read parachain heads from the `Heads` map of +the [`paras` pallet](https://github.com/paritytech/polkadot/tree/master/runtime/parachains/src/paras). +It also must create storage proofs of `Heads` map entries, when required. + +The [`TargetChain`](./src/parachains_loop.rs) implementation connects to the target chain node. It must be able +to return the best known head of given parachain. When required, it must be able to craft and submit parachains +finality delivery transaction to the target node. + +The main entrypoint for the crate is the [`run` function](./src/parachains_loop.rs), which takes source and target +clients and [`ParachainSyncParams`](./src/parachains_loop.rs) parameters. The most imporant parameter is the +`parachains` - it is the set of parachains, which relay tracks and updates. The other important parameter that +may affect the relay operational costs is the `strategy`. If it is set to `Any`, then the finality delivery +transaction is submitted if at least one of tracked parachain heads is updated. The other option is `All`. Then +the relay waits until all tracked parachain heads are updated and submits them all in a single finality delivery +transaction. + +## Parachain Finality Relay Metrics + +Every parachain in Polkadot is identified by the 32-bit number. All metrics, exposed by the parachains finality +relay have the `parachain` label, which is set to the parachain id. And the metrics are prefixed with the prefix, +that depends on the name of the source relay and target chains. The list below shows metrics names for +Rococo (source relay chain) to BridgeHubWestend (target chain) parachains finality relay. For other chains, simply +change chain names. So the metrics are: + +- `Rococo_to_BridgeHubWestend_Parachains_best_parachain_block_number_at_source` - returns best known parachain block + number, registered in the `paras` pallet at the source relay chain (Rococo in our example); + +- `Rococo_to_BridgeHubWestend_Parachains_best_parachain_block_number_at_target` - returns best known parachain block + number, registered in the bridge parachains pallet at the target chain (BridgeHubWestend in our example). + +If relay operates properly, you should see that +the `Rococo_to_BridgeHubWestend_Parachains_best_parachain_block_number_at_target` tries to reach +the `Rococo_to_BridgeHubWestend_Parachains_best_parachain_block_number_at_source`. +And the latter one always increases. diff --git a/bridges/relays/parachains/src/lib.rs b/bridges/relays/parachains/src/lib.rs new file mode 100644 index 0000000000000000000000000000000000000000..81ea983a6f76a71cb2d9f2e0264bba9e2481fab0 --- /dev/null +++ b/bridges/relays/parachains/src/lib.rs @@ -0,0 +1,32 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +use std::fmt::Debug; + +use relay_substrate_client::{Chain, Parachain}; + +pub mod parachains_loop; +pub mod parachains_loop_metrics; + +/// Finality proofs synchronization pipeline. +pub trait ParachainsPipeline: 'static + Clone + Debug + Send + Sync { + /// Relay chain which is storing parachain heads in its `paras` module. + type SourceRelayChain: Chain; + /// Parachain which headers we are syncing here. + type SourceParachain: Parachain; + /// Target chain (either relay or para) which wants to know about new parachain heads. + type TargetChain: Chain; +} diff --git a/bridges/relays/parachains/src/parachains_loop.rs b/bridges/relays/parachains/src/parachains_loop.rs new file mode 100644 index 0000000000000000000000000000000000000000..41ebbf5aadede2b4a1f0c9dcde73ee83bd5b0766 --- /dev/null +++ b/bridges/relays/parachains/src/parachains_loop.rs @@ -0,0 +1,985 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +use crate::{parachains_loop_metrics::ParachainsLoopMetrics, ParachainsPipeline}; + +use async_trait::async_trait; +use bp_polkadot_core::{ + parachains::{ParaHash, ParaHeadsProof, ParaId}, + BlockNumber as RelayBlockNumber, +}; +use futures::{ + future::{FutureExt, Shared}, + poll, select_biased, +}; +use relay_substrate_client::{Chain, HeaderIdOf, ParachainBase}; +use relay_utils::{ + metrics::MetricsParams, relay_loop::Client as RelayClient, FailedClient, + TrackedTransactionStatus, TransactionTracker, +}; +use std::{future::Future, pin::Pin, task::Poll}; + +/// Parachain header availability at a certain chain. +#[derive(Clone, Copy, Debug)] +pub enum AvailableHeader { + /// The client can not report actual parachain head at this moment. + /// + /// It is a "mild" error, which may appear when e.g. on-demand parachains relay is used. + /// This variant must be treated as "we don't want to update parachain head value at the + /// target chain at this moment". + Unavailable, + /// There's no parachain header at the relay chain. + /// + /// Normally it means that the parachain is not registered there. + Missing, + /// Parachain head with given hash is available at the source chain. + Available(T), +} + +impl AvailableHeader { + /// Return available header. + pub fn as_available(&self) -> Option<&T> { + match *self { + AvailableHeader::Available(ref header) => Some(header), + _ => None, + } + } +} + +impl From> for AvailableHeader { + fn from(maybe_header: Option) -> AvailableHeader { + match maybe_header { + Some(header) => AvailableHeader::Available(header), + None => AvailableHeader::Missing, + } + } +} + +/// Source client used in parachain heads synchronization loop. +#[async_trait] +pub trait SourceClient: RelayClient { + /// Returns `Ok(true)` if client is in synced state. + async fn ensure_synced(&self) -> Result; + + /// Get parachain head id at given block. + async fn parachain_head( + &self, + at_block: HeaderIdOf, + ) -> Result>, Self::Error>; + + /// Get parachain head proof at given block. + async fn prove_parachain_head( + &self, + at_block: HeaderIdOf, + ) -> Result<(ParaHeadsProof, ParaHash), Self::Error>; +} + +/// Target client used in parachain heads synchronization loop. +#[async_trait] +pub trait TargetClient: RelayClient { + /// Transaction tracker to track submitted transactions. + type TransactionTracker: TransactionTracker>; + + /// Get best block id. + async fn best_block(&self) -> Result, Self::Error>; + + /// Get best finalized source relay chain block id. + async fn best_finalized_source_relay_chain_block( + &self, + at_block: &HeaderIdOf, + ) -> Result, Self::Error>; + + /// Get parachain head id at given block. + async fn parachain_head( + &self, + at_block: HeaderIdOf, + ) -> Result>, Self::Error>; + + /// Submit parachain heads proof. + async fn submit_parachain_head_proof( + &self, + at_source_block: HeaderIdOf, + para_head_hash: ParaHash, + proof: ParaHeadsProof, + ) -> Result; +} + +/// Return prefix that will be used by default to expose Prometheus metrics of the parachains +/// sync loop. +pub fn metrics_prefix() -> String { + format!( + "{}_to_{}_Parachains_{}", + P::SourceRelayChain::NAME, + P::TargetChain::NAME, + P::SourceParachain::PARACHAIN_ID + ) +} + +/// Run parachain heads synchronization. +pub async fn run( + source_client: impl SourceClient

, + target_client: impl TargetClient

, + metrics_params: MetricsParams, + exit_signal: impl Future + 'static + Send, +) -> Result<(), relay_utils::Error> +where + P::SourceRelayChain: Chain, +{ + let exit_signal = exit_signal.shared(); + relay_utils::relay_loop(source_client, target_client) + .with_metrics(metrics_params) + .loop_metric(ParachainsLoopMetrics::new(Some(&metrics_prefix::

()))?)? + .expose() + .await? + .run(metrics_prefix::

(), move |source_client, target_client, metrics| { + run_until_connection_lost(source_client, target_client, metrics, exit_signal.clone()) + }) + .await +} + +/// Run parachain heads synchronization. +async fn run_until_connection_lost( + source_client: impl SourceClient

, + target_client: impl TargetClient

, + metrics: Option, + exit_signal: impl Future + Send, +) -> Result<(), FailedClient> +where + P::SourceRelayChain: Chain, +{ + let exit_signal = exit_signal.fuse(); + let min_block_interval = std::cmp::min( + P::SourceRelayChain::AVERAGE_BLOCK_INTERVAL, + P::TargetChain::AVERAGE_BLOCK_INTERVAL, + ); + + let mut submitted_heads_tracker: Option> = None; + + futures::pin_mut!(exit_signal); + + // Note that the internal loop breaks with `FailedClient` error even if error is non-connection. + // It is Ok for now, but it may need to be fixed in the future to use exponential backoff for + // regular errors. + + loop { + // Either wait for new block, or exit signal. + // Please note that we are prioritizing the exit signal since if both events happen at once + // it doesn't make sense to perform one more loop iteration. + select_biased! { + _ = exit_signal => return Ok(()), + _ = async_std::task::sleep(min_block_interval).fuse() => {}, + } + + // if source client is not yet synced, we'll need to sleep. Otherwise we risk submitting too + // much redundant transactions + match source_client.ensure_synced().await { + Ok(true) => (), + Ok(false) => { + log::warn!( + target: "bridge", + "{} client is syncing. Won't do anything until it is synced", + P::SourceRelayChain::NAME, + ); + continue + }, + Err(e) => { + log::warn!( + target: "bridge", + "{} client has failed to return its sync status: {:?}", + P::SourceRelayChain::NAME, + e, + ); + return Err(FailedClient::Source) + }, + } + + // if we have active transaction, we'll need to wait until it is mined or dropped + let best_target_block = target_client.best_block().await.map_err(|e| { + log::warn!(target: "bridge", "Failed to read best {} block: {:?}", P::SourceRelayChain::NAME, e); + FailedClient::Target + })?; + let head_at_target = + read_head_at_target(&target_client, metrics.as_ref(), &best_target_block).await?; + + // check if our transaction has been mined + if let Some(tracker) = submitted_heads_tracker.take() { + match tracker.update(&best_target_block, &head_at_target).await { + SubmittedHeadStatus::Waiting(tracker) => { + // no news about our transaction and we shall keep waiting + submitted_heads_tracker = Some(tracker); + continue + }, + SubmittedHeadStatus::Final(TrackedTransactionStatus::Finalized(_)) => { + // all heads have been updated, we don't need this tracker anymore + }, + SubmittedHeadStatus::Final(TrackedTransactionStatus::Lost) => { + log::warn!( + target: "bridge", + "Parachains synchronization from {} to {} has stalled. Going to restart", + P::SourceRelayChain::NAME, + P::TargetChain::NAME, + ); + + return Err(FailedClient::Both) + }, + } + } + + // we have no active transaction and may need to update heads, but do we have something for + // update? + let best_finalized_relay_block = target_client + .best_finalized_source_relay_chain_block(&best_target_block) + .await + .map_err(|e| { + log::warn!( + target: "bridge", + "Failed to read best finalized {} block from {}: {:?}", + P::SourceRelayChain::NAME, + P::TargetChain::NAME, + e, + ); + FailedClient::Target + })?; + let head_at_source = + read_head_at_source(&source_client, metrics.as_ref(), &best_finalized_relay_block) + .await?; + let is_update_required = is_update_required::

( + head_at_source, + head_at_target, + best_finalized_relay_block, + best_target_block, + ); + + if is_update_required { + let (head_proof, head_hash) = source_client + .prove_parachain_head(best_finalized_relay_block) + .await + .map_err(|e| { + log::warn!( + target: "bridge", + "Failed to prove {} parachain ParaId({}) heads: {:?}", + P::SourceRelayChain::NAME, + P::SourceParachain::PARACHAIN_ID, + e, + ); + FailedClient::Source + })?; + log::info!( + target: "bridge", + "Submitting {} parachain ParaId({}) head update transaction to {}. Para hash at source relay {:?}: {:?}", + P::SourceRelayChain::NAME, + P::SourceParachain::PARACHAIN_ID, + P::TargetChain::NAME, + best_finalized_relay_block, + head_hash, + ); + + let transaction_tracker = target_client + .submit_parachain_head_proof(best_finalized_relay_block, head_hash, head_proof) + .await + .map_err(|e| { + log::warn!( + target: "bridge", + "Failed to submit {} parachain ParaId({}) heads proof to {}: {:?}", + P::SourceRelayChain::NAME, + P::SourceParachain::PARACHAIN_ID, + P::TargetChain::NAME, + e, + ); + FailedClient::Target + })?; + submitted_heads_tracker = + Some(SubmittedHeadsTracker::

::new(head_at_source, transaction_tracker)); + } + } +} + +/// Returns `true` if we need to submit parachain-head-update transaction. +fn is_update_required( + head_at_source: AvailableHeader>, + head_at_target: Option>, + best_finalized_relay_block_at_source: HeaderIdOf, + best_target_block: HeaderIdOf, +) -> bool +where + P::SourceRelayChain: Chain, +{ + log::trace!( + target: "bridge", + "Checking if {} parachain ParaId({}) needs update at {}:\n\t\ + At {} ({:?}): {:?}\n\t\ + At {} ({:?}): {:?}", + P::SourceRelayChain::NAME, + P::SourceParachain::PARACHAIN_ID, + P::TargetChain::NAME, + P::SourceRelayChain::NAME, + best_finalized_relay_block_at_source, + head_at_source, + P::TargetChain::NAME, + best_target_block, + head_at_target, + ); + + let needs_update = match (head_at_source, head_at_target) { + (AvailableHeader::Unavailable, _) => { + // source client has politely asked us not to update current parachain head + // at the target chain + false + }, + (AvailableHeader::Available(head_at_source), Some(head_at_target)) + if head_at_source.number() > head_at_target.number() => + { + // source client knows head that is better than the head known to the target + // client + true + }, + (AvailableHeader::Available(_), Some(_)) => { + // this is normal case when relay has recently updated heads, when parachain is + // not progressing, or when our source client is still syncing + false + }, + (AvailableHeader::Available(_), None) => { + // parachain is not yet known to the target client. This is true when parachain + // or bridge has been just onboarded/started + true + }, + (AvailableHeader::Missing, Some(_)) => { + // parachain/parathread has been offboarded removed from the system. It needs to + // be propageted to the target client + true + }, + (AvailableHeader::Missing, None) => { + // all's good - parachain is unknown to both clients + false + }, + }; + + if needs_update { + log::trace!( + target: "bridge", + "{} parachain ParaId({}) needs update at {}: {:?} vs {:?}", + P::SourceRelayChain::NAME, + P::SourceParachain::PARACHAIN_ID, + P::TargetChain::NAME, + head_at_source, + head_at_target, + ); + } + + needs_update +} + +/// Reads parachain head from the source client. +async fn read_head_at_source( + source_client: &impl SourceClient

, + metrics: Option<&ParachainsLoopMetrics>, + at_relay_block: &HeaderIdOf, +) -> Result>, FailedClient> { + let para_head = source_client.parachain_head(*at_relay_block).await; + match para_head { + Ok(AvailableHeader::Available(para_head)) => { + if let Some(metrics) = metrics { + metrics.update_best_parachain_block_at_source( + ParaId(P::SourceParachain::PARACHAIN_ID), + para_head.number(), + ); + } + Ok(AvailableHeader::Available(para_head)) + }, + Ok(r) => Ok(r), + Err(e) => { + log::warn!( + target: "bridge", + "Failed to read head of {} parachain ParaId({:?}): {:?}", + P::SourceRelayChain::NAME, + P::SourceParachain::PARACHAIN_ID, + e, + ); + Err(FailedClient::Source) + }, + } +} + +/// Reads parachain head from the target client. +async fn read_head_at_target( + target_client: &impl TargetClient

, + metrics: Option<&ParachainsLoopMetrics>, + at_block: &HeaderIdOf, +) -> Result>, FailedClient> { + let para_head_id = target_client.parachain_head(*at_block).await; + match para_head_id { + Ok(Some(para_head_id)) => { + if let Some(metrics) = metrics { + metrics.update_best_parachain_block_at_target( + ParaId(P::SourceParachain::PARACHAIN_ID), + para_head_id.number(), + ); + } + Ok(Some(para_head_id)) + }, + Ok(None) => Ok(None), + Err(e) => { + log::warn!( + target: "bridge", + "Failed to read head of {} parachain ParaId({}) at {}: {:?}", + P::SourceRelayChain::NAME, + P::SourceParachain::PARACHAIN_ID, + P::TargetChain::NAME, + e, + ); + Err(FailedClient::Target) + }, + } +} + +/// Submitted heads status. +enum SubmittedHeadStatus { + /// Heads are not yet updated. + Waiting(SubmittedHeadsTracker

), + /// Heads transaction has either been finalized or lost (i.e. received its "final" status). + Final(TrackedTransactionStatus>), +} + +/// Type of the transaction tracker that the `SubmittedHeadsTracker` is using. +/// +/// It needs to be shared because of `poll` macro and our consuming `update` method. +type SharedTransactionTracker

= Shared< + Pin< + Box< + dyn Future< + Output = TrackedTransactionStatus< + HeaderIdOf<

::TargetChain>, + >, + > + Send, + >, + >, +>; + +/// Submitted parachain heads transaction. +struct SubmittedHeadsTracker { + /// Parachain header id that we have submitted. + submitted_head: AvailableHeader>, + /// Future that waits for submitted transaction finality or loss. + /// + /// It needs to be shared because of `poll` macro and our consuming `update` method. + transaction_tracker: SharedTransactionTracker

, +} + +impl SubmittedHeadsTracker

{ + /// Creates new parachain heads transaction tracker. + pub fn new( + submitted_head: AvailableHeader>, + transaction_tracker: impl TransactionTracker> + 'static, + ) -> Self { + SubmittedHeadsTracker { + submitted_head, + transaction_tracker: transaction_tracker.wait().fuse().boxed().shared(), + } + } + + /// Returns `None` if all submitted parachain heads have been updated. + pub async fn update( + self, + at_target_block: &HeaderIdOf, + head_at_target: &Option>, + ) -> SubmittedHeadStatus

{ + // check if our head has been updated + let is_head_updated = match (self.submitted_head, head_at_target) { + (AvailableHeader::Available(submitted_head), Some(head_at_target)) + if head_at_target.number() >= submitted_head.number() => + true, + (AvailableHeader::Missing, None) => true, + _ => false, + }; + if is_head_updated { + log::trace!( + target: "bridge", + "Head of parachain ParaId({}) has been updated at {}: {:?}", + P::SourceParachain::PARACHAIN_ID, + P::TargetChain::NAME, + head_at_target, + ); + + return SubmittedHeadStatus::Final(TrackedTransactionStatus::Finalized(*at_target_block)) + } + + // if underlying transaction tracker has reported that the transaction is lost, we may + // then restart our sync + let transaction_tracker = self.transaction_tracker.clone(); + match poll!(transaction_tracker) { + Poll::Ready(TrackedTransactionStatus::Lost) => + return SubmittedHeadStatus::Final(TrackedTransactionStatus::Lost), + Poll::Ready(TrackedTransactionStatus::Finalized(_)) => { + // so we are here and our transaction is mined+finalized, but some of heads were not + // updated => we're considering our loop as stalled + return SubmittedHeadStatus::Final(TrackedTransactionStatus::Lost) + }, + _ => (), + } + + SubmittedHeadStatus::Waiting(self) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use async_std::sync::{Arc, Mutex}; + use codec::Encode; + use futures::{SinkExt, StreamExt}; + use relay_substrate_client::test_chain::{TestChain, TestParachain}; + use relay_utils::{HeaderId, MaybeConnectionError}; + use sp_core::H256; + + const PARA_10_HASH: ParaHash = H256([10u8; 32]); + const PARA_20_HASH: ParaHash = H256([20u8; 32]); + + #[derive(Clone, Debug)] + enum TestError { + Error, + } + + impl MaybeConnectionError for TestError { + fn is_connection_error(&self) -> bool { + false + } + } + + #[derive(Clone, Debug, PartialEq, Eq)] + struct TestParachainsPipeline; + + impl ParachainsPipeline for TestParachainsPipeline { + type SourceRelayChain = TestChain; + type SourceParachain = TestParachain; + type TargetChain = TestChain; + } + + #[derive(Clone, Debug)] + struct TestClient { + data: Arc>, + } + + #[derive(Clone, Debug)] + struct TestTransactionTracker(Option>>); + + #[async_trait] + impl TransactionTracker for TestTransactionTracker { + type HeaderId = HeaderIdOf; + + async fn wait(self) -> TrackedTransactionStatus> { + match self.0 { + Some(status) => status, + None => futures::future::pending().await, + } + } + } + + #[derive(Clone, Debug)] + struct TestClientData { + source_sync_status: Result, + source_head: Result>, TestError>, + source_proof: Result<(), TestError>, + + target_best_block: Result, TestError>, + target_best_finalized_source_block: Result, TestError>, + target_head: Result>, TestError>, + target_submit_result: Result<(), TestError>, + + exit_signal_sender: Option>>, + } + + impl TestClientData { + pub fn minimal() -> Self { + TestClientData { + source_sync_status: Ok(true), + source_head: Ok(AvailableHeader::Available(HeaderId(0, PARA_20_HASH))), + source_proof: Ok(()), + + target_best_block: Ok(HeaderId(0, Default::default())), + target_best_finalized_source_block: Ok(HeaderId(0, Default::default())), + target_head: Ok(None), + target_submit_result: Ok(()), + + exit_signal_sender: None, + } + } + + pub fn with_exit_signal_sender( + sender: futures::channel::mpsc::UnboundedSender<()>, + ) -> Self { + let mut client = Self::minimal(); + client.exit_signal_sender = Some(Box::new(sender)); + client + } + } + + impl From for TestClient { + fn from(data: TestClientData) -> TestClient { + TestClient { data: Arc::new(Mutex::new(data)) } + } + } + + #[async_trait] + impl RelayClient for TestClient { + type Error = TestError; + + async fn reconnect(&mut self) -> Result<(), TestError> { + unimplemented!() + } + } + + #[async_trait] + impl SourceClient for TestClient { + async fn ensure_synced(&self) -> Result { + self.data.lock().await.source_sync_status.clone() + } + + async fn parachain_head( + &self, + _at_block: HeaderIdOf, + ) -> Result>, TestError> { + self.data.lock().await.source_head.clone() + } + + async fn prove_parachain_head( + &self, + _at_block: HeaderIdOf, + ) -> Result<(ParaHeadsProof, ParaHash), TestError> { + let head = *self.data.lock().await.source_head.clone()?.as_available().unwrap(); + let storage_proof = vec![head.hash().encode()]; + let proof = (ParaHeadsProof { storage_proof }, head.hash()); + self.data.lock().await.source_proof.clone().map(|_| proof) + } + } + + #[async_trait] + impl TargetClient for TestClient { + type TransactionTracker = TestTransactionTracker; + + async fn best_block(&self) -> Result, TestError> { + self.data.lock().await.target_best_block.clone() + } + + async fn best_finalized_source_relay_chain_block( + &self, + _at_block: &HeaderIdOf, + ) -> Result, TestError> { + self.data.lock().await.target_best_finalized_source_block.clone() + } + + async fn parachain_head( + &self, + _at_block: HeaderIdOf, + ) -> Result>, TestError> { + self.data.lock().await.target_head.clone() + } + + async fn submit_parachain_head_proof( + &self, + _at_source_block: HeaderIdOf, + _updated_parachain_head: ParaHash, + _proof: ParaHeadsProof, + ) -> Result { + let mut data = self.data.lock().await; + data.target_submit_result.clone()?; + + if let Some(mut exit_signal_sender) = data.exit_signal_sender.take() { + exit_signal_sender.send(()).await.unwrap(); + } + Ok(TestTransactionTracker(Some( + TrackedTransactionStatus::Finalized(Default::default()), + ))) + } + } + + #[test] + fn when_source_client_fails_to_return_sync_state() { + let mut test_source_client = TestClientData::minimal(); + test_source_client.source_sync_status = Err(TestError::Error); + + assert_eq!( + async_std::task::block_on(run_until_connection_lost( + TestClient::from(test_source_client), + TestClient::from(TestClientData::minimal()), + None, + futures::future::pending(), + )), + Err(FailedClient::Source), + ); + } + + #[test] + fn when_target_client_fails_to_return_best_block() { + let mut test_target_client = TestClientData::minimal(); + test_target_client.target_best_block = Err(TestError::Error); + + assert_eq!( + async_std::task::block_on(run_until_connection_lost( + TestClient::from(TestClientData::minimal()), + TestClient::from(test_target_client), + None, + futures::future::pending(), + )), + Err(FailedClient::Target), + ); + } + + #[test] + fn when_target_client_fails_to_read_heads() { + let mut test_target_client = TestClientData::minimal(); + test_target_client.target_head = Err(TestError::Error); + + assert_eq!( + async_std::task::block_on(run_until_connection_lost( + TestClient::from(TestClientData::minimal()), + TestClient::from(test_target_client), + None, + futures::future::pending(), + )), + Err(FailedClient::Target), + ); + } + + #[test] + fn when_target_client_fails_to_read_best_finalized_source_block() { + let mut test_target_client = TestClientData::minimal(); + test_target_client.target_best_finalized_source_block = Err(TestError::Error); + + assert_eq!( + async_std::task::block_on(run_until_connection_lost( + TestClient::from(TestClientData::minimal()), + TestClient::from(test_target_client), + None, + futures::future::pending(), + )), + Err(FailedClient::Target), + ); + } + + #[test] + fn when_source_client_fails_to_read_heads() { + let mut test_source_client = TestClientData::minimal(); + test_source_client.source_head = Err(TestError::Error); + + assert_eq!( + async_std::task::block_on(run_until_connection_lost( + TestClient::from(test_source_client), + TestClient::from(TestClientData::minimal()), + None, + futures::future::pending(), + )), + Err(FailedClient::Source), + ); + } + + #[test] + fn when_source_client_fails_to_prove_heads() { + let mut test_source_client = TestClientData::minimal(); + test_source_client.source_proof = Err(TestError::Error); + + assert_eq!( + async_std::task::block_on(run_until_connection_lost( + TestClient::from(test_source_client), + TestClient::from(TestClientData::minimal()), + None, + futures::future::pending(), + )), + Err(FailedClient::Source), + ); + } + + #[test] + fn when_target_client_rejects_update_transaction() { + let mut test_target_client = TestClientData::minimal(); + test_target_client.target_submit_result = Err(TestError::Error); + + assert_eq!( + async_std::task::block_on(run_until_connection_lost( + TestClient::from(TestClientData::minimal()), + TestClient::from(test_target_client), + None, + futures::future::pending(), + )), + Err(FailedClient::Target), + ); + } + + #[test] + fn minimal_working_case() { + let (exit_signal_sender, exit_signal) = futures::channel::mpsc::unbounded(); + assert_eq!( + async_std::task::block_on(run_until_connection_lost( + TestClient::from(TestClientData::minimal()), + TestClient::from(TestClientData::with_exit_signal_sender(exit_signal_sender)), + None, + exit_signal.into_future().map(|(_, _)| ()), + )), + Ok(()), + ); + } + + fn test_tx_tracker() -> SubmittedHeadsTracker { + SubmittedHeadsTracker::new( + AvailableHeader::Available(HeaderId(20, PARA_20_HASH)), + TestTransactionTracker(None), + ) + } + + impl From> for Option<()> { + fn from(status: SubmittedHeadStatus) -> Option<()> { + match status { + SubmittedHeadStatus::Waiting(_) => Some(()), + _ => None, + } + } + } + + #[async_std::test] + async fn tx_tracker_update_when_head_at_target_has_none_value() { + assert_eq!( + Some(()), + test_tx_tracker() + .update(&HeaderId(0, Default::default()), &Some(HeaderId(10, PARA_10_HASH))) + .await + .into(), + ); + } + + #[async_std::test] + async fn tx_tracker_update_when_head_at_target_has_old_value() { + assert_eq!( + Some(()), + test_tx_tracker() + .update(&HeaderId(0, Default::default()), &Some(HeaderId(10, PARA_10_HASH))) + .await + .into(), + ); + } + + #[async_std::test] + async fn tx_tracker_update_when_head_at_target_has_same_value() { + assert!(matches!( + test_tx_tracker() + .update(&HeaderId(0, Default::default()), &Some(HeaderId(20, PARA_20_HASH))) + .await, + SubmittedHeadStatus::Final(TrackedTransactionStatus::Finalized(_)), + )); + } + + #[async_std::test] + async fn tx_tracker_update_when_head_at_target_has_better_value() { + assert!(matches!( + test_tx_tracker() + .update(&HeaderId(0, Default::default()), &Some(HeaderId(30, PARA_20_HASH))) + .await, + SubmittedHeadStatus::Final(TrackedTransactionStatus::Finalized(_)), + )); + } + + #[async_std::test] + async fn tx_tracker_update_when_tx_is_lost() { + let mut tx_tracker = test_tx_tracker(); + tx_tracker.transaction_tracker = + futures::future::ready(TrackedTransactionStatus::Lost).boxed().shared(); + assert!(matches!( + tx_tracker + .update(&HeaderId(0, Default::default()), &Some(HeaderId(10, PARA_10_HASH))) + .await, + SubmittedHeadStatus::Final(TrackedTransactionStatus::Lost), + )); + } + + #[async_std::test] + async fn tx_tracker_update_when_tx_is_finalized_but_heads_are_not_updated() { + let mut tx_tracker = test_tx_tracker(); + tx_tracker.transaction_tracker = + futures::future::ready(TrackedTransactionStatus::Finalized(Default::default())) + .boxed() + .shared(); + assert!(matches!( + tx_tracker + .update(&HeaderId(0, Default::default()), &Some(HeaderId(10, PARA_10_HASH))) + .await, + SubmittedHeadStatus::Final(TrackedTransactionStatus::Lost), + )); + } + + #[test] + fn parachain_is_not_updated_if_it_is_unavailable() { + assert!(!is_update_required::( + AvailableHeader::Unavailable, + None, + Default::default(), + Default::default(), + )); + assert!(!is_update_required::( + AvailableHeader::Unavailable, + Some(HeaderId(10, PARA_10_HASH)), + Default::default(), + Default::default(), + )); + } + + #[test] + fn parachain_is_not_updated_if_it_is_unknown_to_both_clients() { + assert!(!is_update_required::( + AvailableHeader::Missing, + None, + Default::default(), + Default::default(), + ),); + } + + #[test] + fn parachain_is_not_updated_if_target_has_better_head() { + assert!(!is_update_required::( + AvailableHeader::Available(HeaderId(10, Default::default())), + Some(HeaderId(20, Default::default())), + Default::default(), + Default::default(), + ),); + } + + #[test] + fn parachain_is_updated_after_offboarding() { + assert!(is_update_required::( + AvailableHeader::Missing, + Some(HeaderId(20, Default::default())), + Default::default(), + Default::default(), + ),); + } + + #[test] + fn parachain_is_updated_after_onboarding() { + assert!(is_update_required::( + AvailableHeader::Available(HeaderId(30, Default::default())), + None, + Default::default(), + Default::default(), + ),); + } + + #[test] + fn parachain_is_updated_if_newer_head_is_known() { + assert!(is_update_required::( + AvailableHeader::Available(HeaderId(40, Default::default())), + Some(HeaderId(30, Default::default())), + Default::default(), + Default::default(), + ),); + } +} diff --git a/bridges/relays/parachains/src/parachains_loop_metrics.rs b/bridges/relays/parachains/src/parachains_loop_metrics.rs new file mode 100644 index 0000000000000000000000000000000000000000..8138a43b3b3dc97997816b13aea1bc973206d48b --- /dev/null +++ b/bridges/relays/parachains/src/parachains_loop_metrics.rs @@ -0,0 +1,86 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +use bp_polkadot_core::parachains::ParaId; +use relay_utils::{ + metrics::{metric_name, register, Gauge, Metric, PrometheusError, Registry, U64}, + UniqueSaturatedInto, +}; + +/// Parachains sync metrics. +#[derive(Clone)] +pub struct ParachainsLoopMetrics { + /// Best parachains header numbers at the source. + best_source_block_numbers: Gauge, + /// Best parachains header numbers at the target. + best_target_block_numbers: Gauge, +} + +impl ParachainsLoopMetrics { + /// Create and register parachains loop metrics. + pub fn new(prefix: Option<&str>) -> Result { + Ok(ParachainsLoopMetrics { + best_source_block_numbers: Gauge::new( + metric_name(prefix, "best_parachain_block_number_at_source"), + "Best parachain block numbers at the source relay chain".to_string(), + )?, + best_target_block_numbers: Gauge::new( + metric_name(prefix, "best_parachain_block_number_at_target"), + "Best parachain block numbers at the target chain".to_string(), + )?, + }) + } + + /// Update best block number at source. + pub fn update_best_parachain_block_at_source>( + &self, + parachain: ParaId, + block_number: Number, + ) { + let block_number = block_number.unique_saturated_into(); + log::trace!( + target: "bridge-metrics", + "Updated value of metric 'best_parachain_block_number_at_source[{:?}]': {:?}", + parachain, + block_number, + ); + self.best_source_block_numbers.set(block_number); + } + + /// Update best block number at target. + pub fn update_best_parachain_block_at_target>( + &self, + parachain: ParaId, + block_number: Number, + ) { + let block_number = block_number.unique_saturated_into(); + log::trace!( + target: "bridge-metrics", + "Updated value of metric 'best_parachain_block_number_at_target[{:?}]': {:?}", + parachain, + block_number, + ); + self.best_target_block_numbers.set(block_number); + } +} + +impl Metric for ParachainsLoopMetrics { + fn register(&self, registry: &Registry) -> Result<(), PrometheusError> { + register(self.best_source_block_numbers.clone(), registry)?; + register(self.best_target_block_numbers.clone(), registry)?; + Ok(()) + } +} diff --git a/bridges/relays/utils/Cargo.toml b/bridges/relays/utils/Cargo.toml new file mode 100644 index 0000000000000000000000000000000000000000..ee56ebf9a956c6f4fdd06b554da279b56ed534dc --- /dev/null +++ b/bridges/relays/utils/Cargo.toml @@ -0,0 +1,38 @@ +[package] +name = "relay-utils" +version = "0.1.0" +authors.workspace = true +edition.workspace = true +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" +repository.workspace = true +publish = false + +[lints] +workspace = true + +[dependencies] +ansi_term = "0.12" +anyhow = "1.0" +async-std = "1.9.0" +async-trait = "0.1.79" +backoff = "0.4" +isahc = "1.2" +env_logger = "0.11.3" +futures = "0.3.30" +jsonpath_lib = "0.3" +log = { workspace = true } +num-traits = "0.2" +serde_json = { workspace = true, default-features = true } +sysinfo = "0.30" +time = { version = "0.3", features = ["formatting", "local-offset", "std"] } +tokio = { version = "1.37", features = ["rt"] } +thiserror = { workspace = true } + +# Bridge dependencies + +bp-runtime = { path = "../../primitives/runtime" } + +# Substrate dependencies + +sp-runtime = { path = "../../../substrate/primitives/runtime" } +substrate-prometheus-endpoint = { path = "../../../substrate/utils/prometheus" } diff --git a/bridges/relays/utils/src/error.rs b/bridges/relays/utils/src/error.rs new file mode 100644 index 0000000000000000000000000000000000000000..26f1d0cacefd8eef5687e0102588f999859012a5 --- /dev/null +++ b/bridges/relays/utils/src/error.rs @@ -0,0 +1,46 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +use std::net::AddrParseError; +use thiserror::Error; + +/// Result type used by relay utilities. +pub type Result = std::result::Result; + +/// Relay utilities errors. +#[derive(Error, Debug)] +pub enum Error { + /// Failed to request a float value from HTTP service. + #[error("Failed to fetch token price from remote server: {0}")] + FetchTokenPrice(#[source] anyhow::Error), + /// Failed to parse the response from HTTP service. + #[error("Failed to parse HTTP service response: {0:?}. Response: {1:?}")] + ParseHttp(serde_json::Error, String), + /// Failed to select response value from the Json response. + #[error("Failed to select value from response: {0:?}. Response: {1:?}")] + SelectResponseValue(jsonpath_lib::JsonPathError, String), + /// Failed to parse float value from the selected value. + #[error( + "Failed to parse float value {0:?} from response. It is assumed to be positive and normal" + )] + ParseFloat(f64), + /// Couldn't found value in the JSON response. + #[error("Missing required value from response: {0:?}")] + MissingResponseValue(String), + /// Invalid host address was used for exposing Prometheus metrics. + #[error("Invalid host {0} is used to expose Prometheus metrics: {1}")] + ExposingMetricsInvalidHost(String, AddrParseError), + /// Prometheus error. + #[error("{0}")] + Prometheus(#[from] substrate_prometheus_endpoint::prometheus::Error), +} diff --git a/bridges/relays/utils/src/initialize.rs b/bridges/relays/utils/src/initialize.rs new file mode 100644 index 0000000000000000000000000000000000000000..8224c1803ad2f74ec694cd68c18a556dddc6d76f --- /dev/null +++ b/bridges/relays/utils/src/initialize.rs @@ -0,0 +1,136 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Relayer initialization functions. + +use std::{cell::RefCell, fmt::Display, io::Write}; + +async_std::task_local! { + pub(crate) static LOOP_NAME: RefCell = RefCell::new(String::default()); +} + +/// Initialize relay environment. +pub fn initialize_relay() { + initialize_logger(true); +} + +/// Initialize Relay logger instance. +pub fn initialize_logger(with_timestamp: bool) { + let format = time::format_description::parse( + "[year]-[month]-[day] \ + [hour repr:24]:[minute]:[second] [offset_hour sign:mandatory]", + ) + .expect("static format string is valid"); + + let mut builder = env_logger::Builder::new(); + builder.filter_level(log::LevelFilter::Warn); + builder.filter_module("bridge", log::LevelFilter::Info); + builder.parse_default_env(); + if with_timestamp { + builder.format(move |buf, record| { + let timestamp = time::OffsetDateTime::now_local() + .unwrap_or_else(|_| time::OffsetDateTime::now_utc()); + let timestamp = timestamp.format(&format).unwrap_or_else(|_| timestamp.to_string()); + + let log_level = color_level(record.level()); + let log_target = color_target(record.target()); + let timestamp = if cfg!(windows) { + Either::Left(timestamp) + } else { + Either::Right(ansi_term::Colour::Fixed(8).bold().paint(timestamp)) + }; + + writeln!( + buf, + "{}{} {} {} {}", + loop_name_prefix(), + timestamp, + log_level, + log_target, + record.args(), + ) + }); + } else { + builder.format(move |buf, record| { + let log_level = color_level(record.level()); + let log_target = color_target(record.target()); + + writeln!(buf, "{}{log_level} {log_target} {}", loop_name_prefix(), record.args(),) + }); + } + + builder.init(); +} + +/// Initialize relay loop. Must only be called once per every loop task. +pub(crate) fn initialize_loop(loop_name: String) { + LOOP_NAME.with(|g_loop_name| *g_loop_name.borrow_mut() = loop_name); +} + +/// Returns loop name prefix to use in logs. The prefix is initialized with the `initialize_loop` +/// call. +fn loop_name_prefix() -> String { + // try_with to avoid panic outside of async-std task context + LOOP_NAME + .try_with(|loop_name| { + // using borrow is ok here, because loop is only initialized once (=> borrow_mut will + // only be called once) + let loop_name = loop_name.borrow(); + if loop_name.is_empty() { + String::new() + } else { + format!("[{loop_name}] ") + } + }) + .unwrap_or_else(|_| String::new()) +} + +enum Either { + Left(A), + Right(B), +} +impl Display for Either { + fn fmt(&self, fmt: &mut std::fmt::Formatter) -> std::fmt::Result { + match self { + Self::Left(a) => write!(fmt, "{a}"), + Self::Right(b) => write!(fmt, "{b}"), + } + } +} + +fn color_target(target: &str) -> impl Display + '_ { + if cfg!(windows) { + Either::Left(target) + } else { + Either::Right(ansi_term::Colour::Fixed(8).paint(target)) + } +} + +fn color_level(level: log::Level) -> impl Display { + if cfg!(windows) { + Either::Left(level) + } else { + let s = level.to_string(); + use ansi_term::Colour as Color; + Either::Right(match level { + log::Level::Error => Color::Fixed(9).bold().paint(s), + log::Level::Warn => Color::Fixed(11).bold().paint(s), + log::Level::Info => Color::Fixed(10).paint(s), + log::Level::Debug => Color::Fixed(14).paint(s), + log::Level::Trace => Color::Fixed(12).paint(s), + }) + } +} diff --git a/bridges/relays/utils/src/lib.rs b/bridges/relays/utils/src/lib.rs new file mode 100644 index 0000000000000000000000000000000000000000..2776620be3594c1f1fb98cd39b1c4b809e50eb80 --- /dev/null +++ b/bridges/relays/utils/src/lib.rs @@ -0,0 +1,318 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Utilities used by different relays. + +pub use bp_runtime::HeaderId; +pub use error::Error; +pub use relay_loop::{relay_loop, relay_metrics}; +pub use sp_runtime::traits::{UniqueSaturatedFrom, UniqueSaturatedInto}; +use std::fmt::Debug; + +use async_trait::async_trait; +use backoff::{backoff::Backoff, ExponentialBackoff}; +use futures::future::{BoxFuture, FutureExt}; +use std::time::Duration; +use thiserror::Error; + +/// Default relay loop stall timeout. If transactions generated by relay are immortal, then +/// this timeout is used. +/// +/// There are no any strict requirements on block time in Substrate. But we assume here that all +/// Substrate-based chains will be designed to produce relatively fast (compared to the slowest +/// blockchains) blocks. So 1 hour seems to be a good guess for (even congested) chains to mine +/// transaction, or remove it from the pool. +pub const STALL_TIMEOUT: Duration = Duration::from_secs(60 * 60); + +/// Max delay after connection-unrelated error happened before we'll try the +/// same request again. +pub const MAX_BACKOFF_INTERVAL: Duration = Duration::from_secs(60); +/// Delay after connection-related error happened before we'll try +/// reconnection again. +pub const CONNECTION_ERROR_DELAY: Duration = Duration::from_secs(10); + +pub mod error; +pub mod initialize; +pub mod metrics; +pub mod relay_loop; + +/// Block number traits shared by all chains that relay is able to serve. +pub trait BlockNumberBase: + 'static + + From + + UniqueSaturatedInto + + Ord + + Clone + + Copy + + Default + + Send + + Sync + + std::fmt::Debug + + std::fmt::Display + + std::hash::Hash + + std::ops::Add + + std::ops::Sub + + num_traits::CheckedSub + + num_traits::Saturating + + num_traits::Zero + + num_traits::One +{ +} + +impl BlockNumberBase for T where + T: 'static + + From + + UniqueSaturatedInto + + Ord + + Clone + + Copy + + Default + + Send + + Sync + + std::fmt::Debug + + std::fmt::Display + + std::hash::Hash + + std::ops::Add + + std::ops::Sub + + num_traits::CheckedSub + + num_traits::Saturating + + num_traits::Zero + + num_traits::One +{ +} + +/// Macro that returns (client, Err(error)) tuple from function if result is Err(error). +#[macro_export] +macro_rules! bail_on_error { + ($result: expr) => { + match $result { + (client, Ok(result)) => (client, result), + (client, Err(error)) => return (client, Err(error)), + } + }; +} + +/// Macro that returns (client, Err(error)) tuple from function if result is Err(error). +#[macro_export] +macro_rules! bail_on_arg_error { + ($result: expr, $client: ident) => { + match $result { + Ok(result) => result, + Err(error) => return ($client, Err(error)), + } + }; +} + +/// Error type that can signal connection errors. +pub trait MaybeConnectionError { + /// Returns true if error (maybe) represents connection error. + fn is_connection_error(&self) -> bool; +} + +/// Final status of the tracked transaction. +#[derive(Debug, Clone, Copy, PartialEq)] +pub enum TrackedTransactionStatus { + /// Transaction has been lost. + Lost, + /// Transaction has been mined and finalized at given block. + Finalized(BlockId), +} + +/// Transaction tracker. +#[async_trait] +pub trait TransactionTracker: Send { + /// Header id, used by the chain. + type HeaderId: Clone + Debug + Send; + + /// Wait until transaction is either finalized or invalidated/lost. + async fn wait(self) -> TrackedTransactionStatus; +} + +/// Future associated with `TransactionTracker`, monitoring the transaction status. +pub type TrackedTransactionFuture<'a, T> = + BoxFuture<'a, TrackedTransactionStatus<::HeaderId>>; + +/// Stringified error that may be either connection-related or not. +#[derive(Error, Debug)] +pub enum StringifiedMaybeConnectionError { + /// The error is connection-related error. + #[error("{0}")] + Connection(String), + /// The error is connection-unrelated error. + #[error("{0}")] + NonConnection(String), +} + +impl StringifiedMaybeConnectionError { + /// Create new stringified connection error. + pub fn new(is_connection_error: bool, error: String) -> Self { + if is_connection_error { + StringifiedMaybeConnectionError::Connection(error) + } else { + StringifiedMaybeConnectionError::NonConnection(error) + } + } +} + +impl MaybeConnectionError for StringifiedMaybeConnectionError { + fn is_connection_error(&self) -> bool { + match *self { + StringifiedMaybeConnectionError::Connection(_) => true, + StringifiedMaybeConnectionError::NonConnection(_) => false, + } + } +} + +/// Exponential backoff for connection-unrelated errors retries. +pub fn retry_backoff() -> ExponentialBackoff { + ExponentialBackoff { + // we do not want relayer to stop + max_elapsed_time: None, + max_interval: MAX_BACKOFF_INTERVAL, + ..Default::default() + } +} + +/// Compact format of IDs vector. +pub fn format_ids(mut ids: impl ExactSizeIterator) -> String { + const NTH_PROOF: &str = "we have checked len; qed"; + match ids.len() { + 0 => "".into(), + 1 => format!("{:?}", ids.next().expect(NTH_PROOF)), + 2 => { + let id0 = ids.next().expect(NTH_PROOF); + let id1 = ids.next().expect(NTH_PROOF); + format!("[{id0:?}, {id1:?}]") + }, + len => { + let id0 = ids.next().expect(NTH_PROOF); + let id_last = ids.last().expect(NTH_PROOF); + format!("{len}:[{id0:?} ... {id_last:?}]") + }, + } +} + +/// Stream that emits item every `timeout_ms` milliseconds. +pub fn interval(timeout: Duration) -> impl futures::Stream { + futures::stream::unfold((), move |_| async move { + async_std::task::sleep(timeout).await; + Some(((), ())) + }) +} + +/// Which client has caused error. +#[derive(Debug, Eq, Clone, Copy, PartialEq)] +pub enum FailedClient { + /// It is the source client who has caused error. + Source, + /// It is the target client who has caused error. + Target, + /// Both clients are failing, or we just encountered some other error that + /// should be treated like that. + Both, +} + +/// Future process result. +#[derive(Debug, Clone, Copy)] +pub enum ProcessFutureResult { + /// Future has been processed successfully. + Success, + /// Future has failed with non-connection error. + Failed, + /// Future has failed with connection error. + ConnectionFailed, +} + +impl ProcessFutureResult { + /// Returns true if result is Success. + pub fn is_ok(self) -> bool { + match self { + ProcessFutureResult::Success => true, + ProcessFutureResult::Failed | ProcessFutureResult::ConnectionFailed => false, + } + } + + /// Returns `Ok(())` if future has succeeded. + /// Returns `Err(failed_client)` otherwise. + pub fn fail_if_error(self, failed_client: FailedClient) -> Result<(), FailedClient> { + if self.is_ok() { + Ok(()) + } else { + Err(failed_client) + } + } + + /// Returns Ok(true) if future has succeeded. + /// Returns Ok(false) if future has failed with non-connection error. + /// Returns Err if future is `ConnectionFailed`. + pub fn fail_if_connection_error( + self, + failed_client: FailedClient, + ) -> Result { + match self { + ProcessFutureResult::Success => Ok(true), + ProcessFutureResult::Failed => Ok(false), + ProcessFutureResult::ConnectionFailed => Err(failed_client), + } + } +} + +/// Process result of the future from a client. +pub fn process_future_result( + result: Result, + retry_backoff: &mut ExponentialBackoff, + on_success: impl FnOnce(TResult), + go_offline_future: &mut std::pin::Pin<&mut futures::future::Fuse>, + go_offline: impl FnOnce(Duration) -> TGoOfflineFuture, + error_pattern: impl FnOnce() -> String, +) -> ProcessFutureResult +where + TError: std::fmt::Debug + MaybeConnectionError, + TGoOfflineFuture: FutureExt, +{ + match result { + Ok(result) => { + on_success(result); + retry_backoff.reset(); + ProcessFutureResult::Success + }, + Err(error) if error.is_connection_error() => { + log::error!( + target: "bridge", + "{}: {:?}. Going to restart", + error_pattern(), + error, + ); + + retry_backoff.reset(); + go_offline_future.set(go_offline(CONNECTION_ERROR_DELAY).fuse()); + ProcessFutureResult::ConnectionFailed + }, + Err(error) => { + let retry_delay = retry_backoff.next_backoff().unwrap_or(CONNECTION_ERROR_DELAY); + log::error!( + target: "bridge", + "{}: {:?}. Retrying in {}", + error_pattern(), + error, + retry_delay.as_secs_f64(), + ); + + go_offline_future.set(go_offline(retry_delay).fuse()); + ProcessFutureResult::Failed + }, + } +} diff --git a/bridges/relays/utils/src/metrics.rs b/bridges/relays/utils/src/metrics.rs new file mode 100644 index 0000000000000000000000000000000000000000..2e6c8236da454dd620ccdb5f1f03cdbf9eed9471 --- /dev/null +++ b/bridges/relays/utils/src/metrics.rs @@ -0,0 +1,192 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +pub use float_json_value::FloatJsonValueMetric; +pub use global::GlobalMetrics; +pub use substrate_prometheus_endpoint::{ + prometheus::core::{Atomic, Collector}, + register, Counter, CounterVec, Gauge, GaugeVec, Opts, PrometheusError, Registry, F64, I64, U64, +}; + +use async_std::sync::{Arc, RwLock}; +use async_trait::async_trait; +use std::{fmt::Debug, time::Duration}; + +mod float_json_value; +mod global; + +/// Shared reference to `f64` value that is updated by the metric. +pub type F64SharedRef = Arc>>; +/// Int gauge metric type. +pub type IntGauge = Gauge; + +/// Unparsed address that needs to be used to expose Prometheus metrics. +#[derive(Debug, Clone)] +pub struct MetricsAddress { + /// Serve HTTP requests at given host. + pub host: String, + /// Serve HTTP requests at given port. + pub port: u16, +} + +/// Prometheus endpoint MetricsParams. +#[derive(Debug, Clone)] +pub struct MetricsParams { + /// Interface and TCP port to be used when exposing Prometheus metrics. + pub address: Option, + /// Metrics registry. May be `Some(_)` if several components share the same endpoint. + pub registry: Registry, +} + +/// Metric API. +pub trait Metric: Clone + Send + Sync + 'static { + fn register(&self, registry: &Registry) -> Result<(), PrometheusError>; +} + +/// Standalone metric API. +/// +/// Metrics of this kind know how to update themselves, so we may just spawn and forget the +/// asynchronous self-update task. +#[async_trait] +pub trait StandaloneMetric: Metric { + /// Update metric values. + async fn update(&self); + + /// Metrics update interval. + fn update_interval(&self) -> Duration; + + /// Register and spawn metric. Metric is only spawned if it is registered for the first time. + fn register_and_spawn(self, registry: &Registry) -> Result<(), PrometheusError> { + match self.register(registry) { + Ok(()) => { + self.spawn(); + Ok(()) + }, + Err(PrometheusError::AlreadyReg) => Ok(()), + Err(e) => Err(e), + } + } + + /// Spawn the self update task that will keep update metric value at given intervals. + fn spawn(self) { + async_std::task::spawn(async move { + let update_interval = self.update_interval(); + loop { + self.update().await; + async_std::task::sleep(update_interval).await; + } + }); + } +} + +impl Default for MetricsAddress { + fn default() -> Self { + MetricsAddress { host: "127.0.0.1".into(), port: 9616 } + } +} + +impl MetricsParams { + /// Creates metrics params from metrics address. + pub fn new( + address: Option, + relay_version: String, + relay_commit: String, + ) -> Result { + const BUILD_INFO_METRIC: &str = "substrate_relay_build_info"; + + let registry = Registry::new(); + register( + Gauge::::with_opts( + Opts::new( + BUILD_INFO_METRIC, + "A metric with a constant '1' value labeled by version", + ) + .const_label("version", &relay_version) + .const_label("commit", &relay_commit), + )?, + ®istry, + )? + .set(1); + + log::info!( + target: "bridge", + "Exposed {} metric: version={} commit={}", + BUILD_INFO_METRIC, + relay_version, + relay_commit, + ); + + Ok(MetricsParams { address, registry }) + } + + /// Creates metrics params so that metrics are not exposed. + pub fn disabled() -> Self { + MetricsParams { address: None, registry: Registry::new() } + } + + /// Do not expose metrics. + #[must_use] + pub fn disable(mut self) -> Self { + self.address = None; + self + } +} + +/// Returns metric name optionally prefixed with given prefix. +pub fn metric_name(prefix: Option<&str>, name: &str) -> String { + if let Some(prefix) = prefix { + format!("{prefix}_{name}") + } else { + name.into() + } +} + +/// Set value of gauge metric. +/// +/// If value is `Ok(None)` or `Err(_)`, metric would have default value. +pub fn set_gauge_value, E: Debug>( + gauge: &Gauge, + value: Result, E>, +) { + gauge.set(match value { + Ok(Some(value)) => { + log::trace!( + target: "bridge-metrics", + "Updated value of metric '{:?}': {:?}", + gauge.desc().first().map(|d| &d.fq_name), + value, + ); + value + }, + Ok(None) => { + log::warn!( + target: "bridge-metrics", + "Failed to update metric '{:?}': value is empty", + gauge.desc().first().map(|d| &d.fq_name), + ); + Default::default() + }, + Err(error) => { + log::warn!( + target: "bridge-metrics", + "Failed to update metric '{:?}': {:?}", + gauge.desc().first().map(|d| &d.fq_name), + error, + ); + Default::default() + }, + }) +} diff --git a/bridges/relays/utils/src/metrics/float_json_value.rs b/bridges/relays/utils/src/metrics/float_json_value.rs new file mode 100644 index 0000000000000000000000000000000000000000..17b09e050973ada83a9735e373292c92ed31ff4b --- /dev/null +++ b/bridges/relays/utils/src/metrics/float_json_value.rs @@ -0,0 +1,147 @@ +// Copyright 2019-2020 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +use crate::{ + error::{self, Error}, + metrics::{ + metric_name, register, F64SharedRef, Gauge, Metric, PrometheusError, Registry, + StandaloneMetric, F64, + }, +}; + +use async_std::sync::{Arc, RwLock}; +use async_trait::async_trait; +use std::time::Duration; + +/// Value update interval. +const UPDATE_INTERVAL: Duration = Duration::from_secs(300); + +/// Metric that represents float value received from HTTP service as float gauge. +/// +/// The float value returned by the service is assumed to be normal (`f64::is_normal` +/// should return `true`) and strictly positive. +#[derive(Debug, Clone)] +pub struct FloatJsonValueMetric { + url: String, + json_path: String, + metric: Gauge, + shared_value_ref: F64SharedRef, +} + +impl FloatJsonValueMetric { + /// Create new metric instance with given name and help. + pub fn new( + url: String, + json_path: String, + name: String, + help: String, + ) -> Result { + let shared_value_ref = Arc::new(RwLock::new(None)); + Ok(FloatJsonValueMetric { + url, + json_path, + metric: Gauge::new(metric_name(None, &name), help)?, + shared_value_ref, + }) + } + + /// Get shared reference to metric value. + pub fn shared_value_ref(&self) -> F64SharedRef { + self.shared_value_ref.clone() + } + + /// Request value from HTTP service. + async fn request_value(&self) -> anyhow::Result { + use isahc::{AsyncReadResponseExt, HttpClient, Request}; + + let request = Request::get(&self.url).header("Accept", "application/json").body(())?; + let raw_response = HttpClient::new()?.send_async(request).await?.text().await?; + Ok(raw_response) + } + + /// Read value from HTTP service. + async fn read_value(&self) -> error::Result { + let raw_response = self.request_value().await.map_err(Error::FetchTokenPrice)?; + parse_service_response(&self.json_path, &raw_response) + } +} + +impl Metric for FloatJsonValueMetric { + fn register(&self, registry: &Registry) -> Result<(), PrometheusError> { + register(self.metric.clone(), registry).map(drop) + } +} + +#[async_trait] +impl StandaloneMetric for FloatJsonValueMetric { + fn update_interval(&self) -> Duration { + UPDATE_INTERVAL + } + + async fn update(&self) { + let value = self.read_value().await; + let maybe_ok = value.as_ref().ok().copied(); + crate::metrics::set_gauge_value(&self.metric, value.map(Some)); + *self.shared_value_ref.write().await = maybe_ok; + } +} + +/// Parse HTTP service response. +fn parse_service_response(json_path: &str, response: &str) -> error::Result { + let json = + serde_json::from_str(response).map_err(|err| Error::ParseHttp(err, response.to_owned()))?; + + let mut selector = jsonpath_lib::selector(&json); + let maybe_selected_value = + selector(json_path).map_err(|err| Error::SelectResponseValue(err, response.to_owned()))?; + let selected_value = maybe_selected_value + .first() + .and_then(|v| v.as_f64()) + .ok_or_else(|| Error::MissingResponseValue(response.to_owned()))?; + if !selected_value.is_normal() || selected_value < 0.0 { + return Err(Error::ParseFloat(selected_value)) + } + + Ok(selected_value) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn parse_service_response_works() { + assert_eq!( + parse_service_response("$.kusama.usd", r#"{"kusama":{"usd":433.05}}"#).map_err(drop), + Ok(433.05), + ); + } + + #[test] + fn parse_service_response_rejects_negative_numbers() { + assert!(parse_service_response("$.kusama.usd", r#"{"kusama":{"usd":-433.05}}"#).is_err()); + } + + #[test] + fn parse_service_response_rejects_zero_numbers() { + assert!(parse_service_response("$.kusama.usd", r#"{"kusama":{"usd":0.0}}"#).is_err()); + } + + #[test] + fn parse_service_response_rejects_nan() { + assert!(parse_service_response("$.kusama.usd", r#"{"kusama":{"usd":NaN}}"#).is_err()); + } +} diff --git a/bridges/relays/utils/src/metrics/global.rs b/bridges/relays/utils/src/metrics/global.rs new file mode 100644 index 0000000000000000000000000000000000000000..9b22fb86ef0cbf11268b80e7c0ac0d8c2d68d129 --- /dev/null +++ b/bridges/relays/utils/src/metrics/global.rs @@ -0,0 +1,118 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +//! Global system-wide Prometheus metrics exposed by relays. + +use crate::metrics::{ + metric_name, register, Gauge, GaugeVec, Metric, Opts, PrometheusError, Registry, + StandaloneMetric, F64, U64, +}; + +use async_std::sync::{Arc, Mutex}; +use async_trait::async_trait; +use std::time::Duration; +use sysinfo::{RefreshKind, System}; + +/// Global metrics update interval. +const UPDATE_INTERVAL: Duration = Duration::from_secs(10); + +/// Global Prometheus metrics. +#[derive(Debug, Clone)] +pub struct GlobalMetrics { + system: Arc>, + system_average_load: GaugeVec, + process_cpu_usage_percentage: Gauge, + process_memory_usage_bytes: Gauge, +} + +impl GlobalMetrics { + /// Create and register global metrics. + pub fn new() -> Result { + Ok(GlobalMetrics { + system: Arc::new(Mutex::new(System::new_with_specifics(RefreshKind::everything()))), + system_average_load: GaugeVec::new( + Opts::new(metric_name(None, "system_average_load"), "System load average"), + &["over"], + )?, + process_cpu_usage_percentage: Gauge::new( + metric_name(None, "process_cpu_usage_percentage"), + "Process CPU usage", + )?, + process_memory_usage_bytes: Gauge::new( + metric_name(None, "process_memory_usage_bytes"), + "Process memory (resident set size) usage", + )?, + }) + } +} + +impl Metric for GlobalMetrics { + fn register(&self, registry: &Registry) -> Result<(), PrometheusError> { + register(self.system_average_load.clone(), registry)?; + register(self.process_cpu_usage_percentage.clone(), registry)?; + register(self.process_memory_usage_bytes.clone(), registry)?; + Ok(()) + } +} + +#[async_trait] +impl StandaloneMetric for GlobalMetrics { + async fn update(&self) { + // update system-wide metrics + let mut system = self.system.lock().await; + let load = sysinfo::System::load_average(); + self.system_average_load.with_label_values(&["1min"]).set(load.one); + self.system_average_load.with_label_values(&["5min"]).set(load.five); + self.system_average_load.with_label_values(&["15min"]).set(load.fifteen); + + // update process-related metrics + let pid = sysinfo::get_current_pid().expect( + "only fails where pid is unavailable (os=unknown || arch=wasm32);\ + relay is not supposed to run in such MetricsParamss;\ + qed", + ); + let is_process_refreshed = system.refresh_process(pid); + match (is_process_refreshed, system.process(pid)) { + (true, Some(process_info)) => { + let cpu_usage = process_info.cpu_usage() as f64; + let memory_usage = process_info.memory() * 1024; + log::trace!( + target: "bridge-metrics", + "Refreshed process metrics: CPU={}, memory={}", + cpu_usage, + memory_usage, + ); + + self.process_cpu_usage_percentage.set(if cpu_usage.is_finite() { + cpu_usage + } else { + 0f64 + }); + self.process_memory_usage_bytes.set(memory_usage); + }, + _ => { + log::warn!( + target: "bridge-metrics", + "Failed to refresh process information. Metrics may show obsolete values", + ); + }, + } + } + + fn update_interval(&self) -> Duration { + UPDATE_INTERVAL + } +} diff --git a/bridges/relays/utils/src/relay_loop.rs b/bridges/relays/utils/src/relay_loop.rs new file mode 100644 index 0000000000000000000000000000000000000000..7105190a45831f57ecb728ac0d354157b020db8a --- /dev/null +++ b/bridges/relays/utils/src/relay_loop.rs @@ -0,0 +1,262 @@ +// Copyright 2019-2021 Parity Technologies (UK) Ltd. +// This file is part of Parity Bridges Common. + +// Parity Bridges Common is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity Bridges Common is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity Bridges Common. If not, see . + +use crate::{ + error::Error, + metrics::{Metric, MetricsAddress, MetricsParams}, + FailedClient, MaybeConnectionError, +}; + +use async_trait::async_trait; +use std::{fmt::Debug, future::Future, net::SocketAddr, time::Duration}; +use substrate_prometheus_endpoint::{init_prometheus, Registry}; + +/// Default pause between reconnect attempts. +pub const RECONNECT_DELAY: Duration = Duration::from_secs(10); + +/// Basic blockchain client from relay perspective. +#[async_trait] +pub trait Client: 'static + Clone + Send + Sync { + /// Type of error these clients returns. + type Error: 'static + Debug + MaybeConnectionError + Send + Sync; + + /// Try to reconnect to source node. + async fn reconnect(&mut self) -> Result<(), Self::Error>; + + /// Try to reconnect to the source node in an infinite loop until it succeeds. + async fn reconnect_until_success(&mut self, delay: Duration) { + loop { + match self.reconnect().await { + Ok(()) => break, + Err(error) => { + log::warn!( + target: "bridge", + "Failed to reconnect to client. Going to retry in {}s: {:?}", + delay.as_secs(), + error, + ); + + async_std::task::sleep(delay).await; + }, + } + } + } +} + +#[async_trait] +impl Client for () { + type Error = crate::StringifiedMaybeConnectionError; + + async fn reconnect(&mut self) -> Result<(), Self::Error> { + Ok(()) + } +} + +/// Returns generic loop that may be customized and started. +pub fn relay_loop(source_client: SC, target_client: TC) -> Loop { + Loop { reconnect_delay: RECONNECT_DELAY, source_client, target_client, loop_metric: None } +} + +/// Returns generic relay loop metrics that may be customized and used in one or several relay +/// loops. +pub fn relay_metrics(params: MetricsParams) -> LoopMetrics<(), (), ()> { + LoopMetrics { + relay_loop: Loop { + reconnect_delay: RECONNECT_DELAY, + source_client: (), + target_client: (), + loop_metric: None, + }, + address: params.address, + registry: params.registry, + loop_metric: None, + } +} + +/// Generic relay loop. +pub struct Loop { + reconnect_delay: Duration, + source_client: SC, + target_client: TC, + loop_metric: Option, +} + +/// Relay loop metrics builder. +pub struct LoopMetrics { + relay_loop: Loop, + address: Option, + registry: Registry, + loop_metric: Option, +} + +impl Loop { + /// Customize delay between reconnect attempts. + #[must_use] + pub fn reconnect_delay(mut self, reconnect_delay: Duration) -> Self { + self.reconnect_delay = reconnect_delay; + self + } + + /// Start building loop metrics using given prefix. + pub fn with_metrics(self, params: MetricsParams) -> LoopMetrics { + LoopMetrics { + relay_loop: Loop { + reconnect_delay: self.reconnect_delay, + source_client: self.source_client, + target_client: self.target_client, + loop_metric: None, + }, + address: params.address, + registry: params.registry, + loop_metric: None, + } + } + + /// Run relay loop. + /// + /// This function represents an outer loop, which in turn calls provided `run_loop` function to + /// do actual job. When `run_loop` returns, this outer loop reconnects to failed client (source, + /// target or both) and calls `run_loop` again. + pub async fn run(mut self, loop_name: String, run_loop: R) -> Result<(), Error> + where + R: 'static + Send + Fn(SC, TC, Option) -> F, + F: 'static + Send + Future>, + SC: 'static + Client, + TC: 'static + Client, + LM: 'static + Send + Clone, + { + let run_loop_task = async move { + crate::initialize::initialize_loop(loop_name); + + loop { + let loop_metric = self.loop_metric.clone(); + let future_result = + run_loop(self.source_client.clone(), self.target_client.clone(), loop_metric); + let result = future_result.await; + + match result { + Ok(()) => break, + Err(failed_client) => { + log::debug!(target: "bridge", "Restarting relay loop"); + + reconnect_failed_client( + failed_client, + self.reconnect_delay, + &mut self.source_client, + &mut self.target_client, + ) + .await + }, + } + } + Ok(()) + }; + + async_std::task::spawn(run_loop_task).await + } +} + +impl LoopMetrics { + /// Add relay loop metrics. + /// + /// Loop metrics will be passed to the loop callback. + pub fn loop_metric( + self, + metric: NewLM, + ) -> Result, Error> { + metric.register(&self.registry)?; + + Ok(LoopMetrics { + relay_loop: self.relay_loop, + address: self.address, + registry: self.registry, + loop_metric: Some(metric), + }) + } + + /// Convert into `MetricsParams` structure so that metrics registry may be extended later. + pub fn into_params(self) -> MetricsParams { + MetricsParams { address: self.address, registry: self.registry } + } + + /// Expose metrics using address passed at creation. + /// + /// If passed `address` is `None`, metrics are not exposed. + pub async fn expose(self) -> Result, Error> { + if let Some(address) = self.address { + let socket_addr = SocketAddr::new( + address + .host + .parse() + .map_err(|err| Error::ExposingMetricsInvalidHost(address.host.clone(), err))?, + address.port, + ); + + let registry = self.registry; + async_std::task::spawn(async move { + let runtime = + match tokio::runtime::Builder::new_current_thread().enable_all().build() { + Ok(runtime) => runtime, + Err(err) => { + log::trace!( + target: "bridge-metrics", + "Failed to create tokio runtime. Prometheus metrics are not available: {:?}", + err, + ); + return + }, + }; + + runtime.block_on(async move { + log::trace!( + target: "bridge-metrics", + "Starting prometheus endpoint at: {:?}", + socket_addr, + ); + let result = init_prometheus(socket_addr, registry).await; + log::trace!( + target: "bridge-metrics", + "Prometheus endpoint has exited with result: {:?}", + result, + ); + }); + }); + } + + Ok(Loop { + reconnect_delay: self.relay_loop.reconnect_delay, + source_client: self.relay_loop.source_client, + target_client: self.relay_loop.target_client, + loop_metric: self.loop_metric, + }) + } +} + +/// Deal with the clients that have returned connection error. +pub async fn reconnect_failed_client( + failed_client: FailedClient, + reconnect_delay: Duration, + source_client: &mut impl Client, + target_client: &mut impl Client, +) { + if failed_client == FailedClient::Source || failed_client == FailedClient::Both { + source_client.reconnect_until_success(reconnect_delay).await; + } + + if failed_client == FailedClient::Target || failed_client == FailedClient::Both { + target_client.reconnect_until_success(reconnect_delay).await; + } +} diff --git a/bridges/scripts/verify-pallets-build.sh b/bridges/scripts/verify-pallets-build.sh deleted file mode 100755 index b96bbf1833b6b3ce2bb34d2dc34aa5b8f54eb528..0000000000000000000000000000000000000000 --- a/bridges/scripts/verify-pallets-build.sh +++ /dev/null @@ -1,138 +0,0 @@ -#!/bin/bash - -# A script to remove everything from bridges repository/subtree, except: -# -# - modules/grandpa; -# - modules/messages; -# - modules/parachains; -# - modules/relayers; -# - everything required from primitives folder. - -set -eux - -# show CLI help -function show_help() { - set +x - echo " " - echo Error: $1 - echo "Usage:" - echo " ./scripts/verify-pallets-build.sh Exit with code 0 if pallets code is well decoupled from the other code in the repo" - echo "Options:" - echo " --no-revert Leaves only runtime code on exit" - echo " --ignore-git-state Ignores git actual state" - exit 1 -} - -# parse CLI args -NO_REVERT= -IGNORE_GIT_STATE= -for i in "$@" -do - case $i in - --no-revert) - NO_REVERT=true - shift - ;; - --ignore-git-state) - IGNORE_GIT_STATE=true - shift - ;; - *) - show_help "Unknown option: $i" - ;; - esac -done - -# the script is able to work only on clean git copy, unless we want to ignore this check -[[ ! -z "${IGNORE_GIT_STATE}" ]] || [[ -z "$(git status --porcelain)" ]] || { echo >&2 "The git copy must be clean"; exit 1; } - -# let's avoid any restrictions on where this script can be called for - bridges repo may be -# plugged into any other repo folder. So the script (and other stuff that needs to be removed) -# may be located either in call dir, or one of it subdirs. -BRIDGES_FOLDER="$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )/.." - -# let's leave repository/subtree in its original (clean) state if something fails below -function revert_to_clean_state { - [[ ! -z "${NO_REVERT}" ]] || { echo "Reverting to clean state..."; git checkout .; } -} -trap revert_to_clean_state EXIT - -# remove everything we think is not required for our needs -rm -rf $BRIDGES_FOLDER/.config -rm -rf $BRIDGES_FOLDER/.github -rm -rf $BRIDGES_FOLDER/.maintain -rm -rf $BRIDGES_FOLDER/deployments -rm -f $BRIDGES_FOLDER/docs/dockerhub-* -rm -rf $BRIDGES_FOLDER/fuzz -rm -rf $BRIDGES_FOLDER/modules/beefy -rm -rf $BRIDGES_FOLDER/modules/shift-session-manager -rm -rf $BRIDGES_FOLDER/primitives/beefy -rm -rf $BRIDGES_FOLDER/relays -rm -rf $BRIDGES_FOLDER/scripts/add_license.sh -rm -rf $BRIDGES_FOLDER/scripts/build-containers.sh -rm -rf $BRIDGES_FOLDER/scripts/ci-cache.sh -rm -rf $BRIDGES_FOLDER/scripts/dump-logs.sh -rm -rf $BRIDGES_FOLDER/scripts/license_header -rm -rf $BRIDGES_FOLDER/scripts/regenerate_runtimes.sh -rm -rf $BRIDGES_FOLDER/scripts/update-weights.sh -rm -rf $BRIDGES_FOLDER/scripts/update-weights-setup.sh -rm -rf $BRIDGES_FOLDER/scripts/update_substrate.sh -rm -rf $BRIDGES_FOLDER/tools -rm -f $BRIDGES_FOLDER/.dockerignore -rm -f $BRIDGES_FOLDER/local.Dockerfile.dockerignore -rm -f $BRIDGES_FOLDER/deny.toml -rm -f $BRIDGES_FOLDER/.gitlab-ci.yml -rm -f $BRIDGES_FOLDER/.editorconfig -rm -f $BRIDGES_FOLDER/Cargo.toml -rm -f $BRIDGES_FOLDER/ci.Dockerfile -rm -f $BRIDGES_FOLDER/local.Dockerfile -rm -f $BRIDGES_FOLDER/CODEOWNERS -rm -f $BRIDGES_FOLDER/Dockerfile -rm -f $BRIDGES_FOLDER/rustfmt.toml - -# let's fix Cargo.toml a bit (it'll be helpful if we are in the bridges repo) -if [[ ! -f "Cargo.toml" ]]; then - cat > Cargo.toml <<-CARGO_TOML - [workspace.package] - authors = ["Parity Technologies "] - edition = "2021" - repository = "https://github.com/paritytech/parity-bridges-common.git" - license = "GPL-3.0-only" - - [workspace] - resolver = "2" - - members = [ - "bin/runtime-common", - "modules/*", - "primitives/*", - ] - CARGO_TOML -fi - -# let's test if everything we need compiles - -cargo check -p pallet-bridge-grandpa -cargo check -p pallet-bridge-grandpa --features runtime-benchmarks -cargo check -p pallet-bridge-grandpa --features try-runtime -cargo check -p pallet-bridge-messages -cargo check -p pallet-bridge-messages --features runtime-benchmarks -cargo check -p pallet-bridge-messages --features try-runtime -cargo check -p pallet-bridge-parachains -cargo check -p pallet-bridge-parachains --features runtime-benchmarks -cargo check -p pallet-bridge-parachains --features try-runtime -cargo check -p pallet-bridge-relayers -cargo check -p pallet-bridge-relayers --features runtime-benchmarks -cargo check -p pallet-bridge-relayers --features try-runtime -cargo check -p pallet-xcm-bridge-hub-router -cargo check -p pallet-xcm-bridge-hub-router --features runtime-benchmarks -cargo check -p pallet-xcm-bridge-hub-router --features try-runtime -cargo check -p bridge-runtime-common -cargo check -p bridge-runtime-common --features runtime-benchmarks -cargo check -p bridge-runtime-common --features integrity-test - -# we're removing lock file after all chechs are done. Otherwise we may use different -# Substrate/Polkadot/Cumulus commits and our checks will fail -rm -f $BRIDGES_FOLDER/Cargo.lock - -echo "OK" diff --git a/bridges/snowbridge/README.md b/bridges/snowbridge/README.md index 49b9c2eaf553780176897a770bad9579d53bfaa9..6561df401120e9c5c5d6ee2762eb1423b5d6daaf 100644 --- a/bridges/snowbridge/README.md +++ b/bridges/snowbridge/README.md @@ -1,32 +1,40 @@ -# Snowbridge -[![codecov](https://codecov.io/gh/Snowfork/snowbridge/branch/main/graph/badge.svg?token=9hvgSws4rN)](https://codecov.io/gh/Snowfork/snowbridge) +# Snowbridge · +[![codecov](https://codecov.io/gh/Snowfork/polkadot-sdk/branch/snowbridge/graph/badge.svg?token=9hvgSws4rN)](https://codecov.io/gh/Snowfork/polkadot-sdk) ![GitHub](https://img.shields.io/github/license/Snowfork/snowbridge) Snowbridge is a trustless bridge between Polkadot and Ethereum. For documentation, visit https://docs.snowbridge.network. ## Components +The Snowbridge project lives in two repositories: + +- [Snowfork/Polkadot-sdk](https://github.com/Snowfork/polkadot-sdk): The Snowbridge parachain and pallets live in +a fork of the Polkadot SDK. Changes are eventually contributed back to +[paritytech/Polkadot-sdk](https://github.com/paritytech/polkadot-sdk) +- [Snowfork/snowbridge](https://github.com/Snowfork/snowbridge): The rest of the Snowbridge components, like contracts, +off-chain relayer, end-to-end tests and test-net setup code. + ### Parachain -Polkadot parachain and our pallets. See [parachain/README.md](https://github.com/Snowfork/snowbridge/blob/main/parachain/README.md). +Polkadot parachain and our pallets. See [README.md](https://github.com/Snowfork/polkadot-sdk/blob/snowbridge/bridges/snowbridge/README.md). ### Contracts -Ethereum contracts and unit tests. See [contracts/README.md](https://github.com/Snowfork/snowbridge/blob/main/contracts/README.md) +Ethereum contracts and unit tests. See [Snowfork/snowbridge/contracts/README.md](https://github.com/Snowfork/snowbridge/blob/main/contracts/README.md) ### Relayer Off-chain relayer services for relaying messages between Polkadot and Ethereum. See -[relayer/README.md](https://github.com/Snowfork/snowbridge/blob/main/relayer/README.md) +[Snowfork/snowbridge/relayer/README.md](https://github.com/Snowfork/snowbridge/blob/main/relayer/README.md) ### Local Testnet Scripts to provision a local testnet, running the above services to bridge between local deployments of Polkadot and -Ethereum. See [web/packages/test/README.md](https://github.com/Snowfork/snowbridge/blob/main/web/packages/test/README.md). +Ethereum. See [Snowfork/snowbridge/web/packages/test/README.md](https://github.com/Snowfork/snowbridge/blob/main/web/packages/test/README.md). ### Smoke Tests -Integration tests for our local testnet. See [smoketest/README.md](https://github.com/Snowfork/snowbridge/blob/main/smoketest/README.md). +Integration tests for our local testnet. See [Snowfork/snowbridge/smoketest/README.md](https://github.com/Snowfork/snowbridge/blob/main/smoketest/README.md). ## Development @@ -83,7 +91,7 @@ direnv allow ### Upgrading the Rust toolchain -Sometimes we would like to upgrade rust toolchain. First update `parachain/rust-toolchain.toml` as required and then +Sometimes we would like to upgrade rust toolchain. First update `rust-toolchain.toml` as required and then update `flake.lock` running ```sh nix flake lock --update-input rust-overlay diff --git a/bridges/snowbridge/pallets/ethereum-client/Cargo.toml b/bridges/snowbridge/pallets/ethereum-client/Cargo.toml index 2f76d5b8357985c65cdc09c86257bc6ddd766250..0e15304ff11234d6c1871511fc8c3237830fe9a4 100644 --- a/bridges/snowbridge/pallets/ethereum-client/Cargo.toml +++ b/bridges/snowbridge/pallets/ethereum-client/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "snowbridge-pallet-ethereum-client" description = "Snowbridge Ethereum Client Pallet" -version = "0.0.0" +version = "0.2.0" authors = ["Snowfork "] edition.workspace = true repository.workspace = true @@ -15,16 +15,12 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -serde = { version = "1.0.195", optional = true } -serde_json = { version = "1.0.111", optional = true } +serde = { optional = true, workspace = true, default-features = true } +serde_json = { optional = true, workspace = true, default-features = true } codec = { version = "3.6.1", package = "parity-scale-codec", default-features = false, features = ["derive"] } scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } -ssz_rs = { version = "0.9.0", default-features = false } -ssz_rs_derive = { version = "0.9.0", default-features = false } -byte-slice-cast = { version = "1.2.1", default-features = false } -rlp = { version = "0.5.2", default-features = false } hex-literal = { version = "0.4.1", optional = true } -log = { version = "0.4.20", default-features = false } +log = { workspace = true } frame-benchmarking = { path = "../../../../substrate/frame/benchmarking", default-features = false, optional = true } frame-support = { path = "../../../../substrate/frame/support", default-features = false } @@ -36,21 +32,20 @@ sp-io = { path = "../../../../substrate/primitives/io", default-features = false snowbridge-core = { path = "../../primitives/core", default-features = false } snowbridge-ethereum = { path = "../../primitives/ethereum", default-features = false } -snowbridge-pallet-ethereum-client-fixtures = { path = "./fixtures", default-features = false, optional = true } +snowbridge-pallet-ethereum-client-fixtures = { path = "fixtures", default-features = false, optional = true } primitives = { package = "snowbridge-beacon-primitives", path = "../../primitives/beacon", default-features = false } static_assertions = { version = "1.1.0", default-features = false } -bp-runtime = { path = "../../../primitives/runtime", default-features = false } pallet-timestamp = { path = "../../../../substrate/frame/timestamp", default-features = false, optional = true } [dev-dependencies] rand = "0.8.5" sp-keyring = { path = "../../../../substrate/primitives/keyring" } -serde_json = "1.0.111" +serde_json = { workspace = true, default-features = true } hex-literal = "0.4.1" pallet-timestamp = { path = "../../../../substrate/frame/timestamp" } -snowbridge-pallet-ethereum-client-fixtures = { path = "./fixtures" } +snowbridge-pallet-ethereum-client-fixtures = { path = "fixtures" } sp-io = { path = "../../../../substrate/primitives/io" } -serde = "1.0.195" +serde = { workspace = true, default-features = true } [features] default = ["std"] @@ -62,15 +57,12 @@ fuzzing = [ "sp-io", ] std = [ - "bp-runtime/std", - "byte-slice-cast/std", "codec/std", "frame-support/std", "frame-system/std", "log/std", "pallet-timestamp/std", "primitives/std", - "rlp/std", "scale-info/std", "serde", "snowbridge-core/std", @@ -80,7 +72,6 @@ std = [ "sp-io/std", "sp-runtime/std", "sp-std/std", - "ssz_rs/std", 'frame-benchmarking/std', ] runtime-benchmarks = [ diff --git a/bridges/snowbridge/pallets/ethereum-client/fixtures/Cargo.toml b/bridges/snowbridge/pallets/ethereum-client/fixtures/Cargo.toml index fd1914a7d30e81c3615c981d7ae8ba378a8a5724..858e2513a961288dd24c47e7d57ada1506b212d2 100644 --- a/bridges/snowbridge/pallets/ethereum-client/fixtures/Cargo.toml +++ b/bridges/snowbridge/pallets/ethereum-client/fixtures/Cargo.toml @@ -18,27 +18,17 @@ targets = ["x86_64-unknown-linux-gnu"] hex-literal = { version = "0.4.1" } sp-core = { path = "../../../../../substrate/primitives/core", default-features = false } sp-std = { path = "../../../../../substrate/primitives/std", default-features = false } -frame-benchmarking = { path = "../../../../../substrate/frame/benchmarking", default-features = false, optional = true } -frame-support = { path = "../../../../../substrate/frame/support", default-features = false } -frame-system = { path = "../../../../../substrate/frame/system", default-features = false } snowbridge-core = { path = "../../../primitives/core", default-features = false } snowbridge-beacon-primitives = { path = "../../../primitives/beacon", default-features = false } [features] default = ["std"] std = [ - "frame-benchmarking/std", - "frame-support/std", - "frame-system/std", "snowbridge-beacon-primitives/std", "snowbridge-core/std", "sp-core/std", "sp-std/std", ] runtime-benchmarks = [ - "frame-benchmarking", - "frame-benchmarking/runtime-benchmarks", - "frame-support/runtime-benchmarks", - "frame-system/runtime-benchmarks", "snowbridge-core/runtime-benchmarks", ] diff --git a/bridges/snowbridge/pallets/ethereum-client/fixtures/src/lib.rs b/bridges/snowbridge/pallets/ethereum-client/fixtures/src/lib.rs index facaffb8149cd88b0f3f369ed79dd922e9b2c983..37fe45ba60b0be1311da2d6090283acb6710383e 100644 --- a/bridges/snowbridge/pallets/ethereum-client/fixtures/src/lib.rs +++ b/bridges/snowbridge/pallets/ethereum-client/fixtures/src/lib.rs @@ -6,9 +6,10 @@ use hex_literal::hex; use snowbridge_beacon_primitives::{ - types::deneb, updates::AncestryProof, BeaconHeader, ExecutionHeaderUpdate, - NextSyncCommitteeUpdate, SyncAggregate, SyncCommittee, VersionedExecutionPayloadHeader, + types::deneb, AncestryProof, BeaconHeader, ExecutionProof, NextSyncCommitteeUpdate, + SyncAggregate, SyncCommittee, VersionedExecutionPayloadHeader, }; +use snowbridge_core::inbound::{InboundQueueFixture, Log, Message, Proof}; use sp_core::U256; use sp_std::{boxed::Box, vec}; @@ -20,11 +21,11 @@ type Update = snowbridge_beacon_primitives::Update; pub fn make_checkpoint() -> Box { Box::new(CheckpointUpdate { header: BeaconHeader { - slot: 2496, - proposer_index: 2, - parent_root: hex!("c99e49787106733eeebab4d93eb326e1f2214575c9d928f0c4ab0da0776f1622").into(), - state_root: hex!("fbf8a08c86ef36bd173e37e733da4a78aa8e85fee99a990e858dd12a59087fde").into(), - body_root: hex!("a2a8ad06901447b2807a9059580a4c40d8a941f325b1343c69f7c7c6c90e4ab0").into(), + slot: 864, + proposer_index: 4, + parent_root: hex!("614e7672f991ac268cd841055973f55e1e42228831a211adef207bb7329be614").into(), + state_root: hex!("5fa8dfca3d760e4242ab46d529144627aa85348a19173b6e081172c701197a4a").into(), + body_root: hex!("0f34c083b1803666bb1ac5e73fa71582731a2cf37d279ff0a3b0cad5a2ff371e").into(), }, current_sync_committee: SyncCommittee { pubkeys: [ @@ -544,20 +545,20 @@ pub fn make_checkpoint() -> Box { aggregate_pubkey: hex!("8fbd66eeec2ff69ef0b836f04b1d67d88bcd4dfd495061964ad757c77abe822a39fa1cd8ed0d4d9bc9276cea73fd745c").into(), }, current_sync_committee_branch: vec![ - hex!("3ade38d498a062b50880a9409e1ca3a7fd4315d91eeb3bb83e56ac6bfe8d6a59").into(), - hex!("93880225bf99a0c5ec22b266ff829837754e9c5edf37a68c05b8f803fd82fa45").into(), - hex!("4c60656ec9a95fcf11030ad309c716b5b15beb7f60a0bcfc7c9d4eff505472ff").into(), - hex!("22d1645fceb4bf9a695043dda19a53e784ec70df6a6b1bd66ea30eba1cca5f2f").into(), - hex!("a8fc6cad84ceefc633ec56c2d031d525e1cb4b51c70eb252919fce5bba9a1fde").into(), + hex!("3ade38d498a062b50880a9409e1ca3a7fd4315d91eeb3bb83e56ac6bfe8d6a59").into(), + hex!("a9e90f89e7f90fd5d79a6bbcaf40ba5cfc05ab1b561ac51c84867c32248d5b1e").into(), + hex!("bd1a76b03e02402bb24a627de1980a80ab17691980271f597b844b89b497ef75").into(), + hex!("07bbcd27c7cad089023db046eda17e8209842b7d97add8b873519e84fe6480e7").into(), + hex!("94c11eeee4cb6192bf40810f23486d8c75dfbc2b6f28d988d6f74435ede243b0").into(), ], validators_root: hex!("270d43e74ce340de4bca2b1936beca0f4f5408d9e78aec4850920baf659d5b69").into(), - block_roots_root: hex!("d160b7687041891b73e54b06fc4e04f82d0fa8fdd76705895e216c6b24709dfe").into(), + block_roots_root: hex!("b9aab9c388c4e4fcd899b71f62c498fc73406e38e8eb14aa440e9affa06f2a10").into(), block_roots_branch: vec![ - hex!("105290e42d98ab6a0ada6e55453cede36c672abf645eeb986b88d7487616e135").into(), - hex!("9da41f274bcdf6122335443d9ce94d07163b48dba3e2f9499ff56f4e48b48b99").into(), - hex!("ecea7e1d3152d8130e83afdfe34b4de4ba2b69a33c9471991096daf454de9cf5").into(), - hex!("b2bf1758e50b2bfff29169fbc70fdb884b2b05bb615dbc53567574da6f4f1ae2").into(), - hex!("cd87069daf70975779126d6af833b7d636c75ca4d5e750ebcad0e76408a5e5bf").into(), + hex!("733422bd810895dab74cbbe07c69dd440cbb51f573181ad4dddac30fcdd0f41f").into(), + hex!("9b9eca73ab01d14549c325ba1b4610bb20bf1f8ec2dbd649f9d8cc7f3cea75fa").into(), + hex!("bcc666ad0ad9f9725cbd682bc95589d35b1b53b2a615f1e6e8dd5e086336becf").into(), + hex!("3069b547a08f703a1715016e926cbd64e71f93f64fb68d98d8c8f1ab745c46e5").into(), + hex!("c2de7e1097239404e17b263cfa0473533cc41e903cb03440d633bc5c27314cb4").into(), ], }) } @@ -567,13 +568,13 @@ pub fn make_sync_committee_update() -> Box { attested_header: BeaconHeader { slot: 129, proposer_index: 5, - parent_root: hex!("e32b6c18f029e755b0273dc1c4fa2bc4979794c8286ad40276c1b8a8e36049d8").into(), - state_root: hex!("5ec9dacf25a5f09f20be0c59246b3d8dcfe64bd085b4bac5cec180690339801e").into(), - body_root: hex!("4080cf2412d6ff77fc3164ad6155423a7112f207f173145ec16371a93f481f87").into(), + parent_root: hex!("c2def03fe44a2802130ca1a6d8406e4ccf4f344fec7075d4d84431cd4a8b0904").into(), + state_root: hex!("fa62cde6666add7353d7aedcb61ebe3c6c84b5361e34f814825b1250affb5be4").into(), + body_root: hex!("0f9c69f243fe7b5fa5860396c66c720a9e8b1e526e7914188930497cc4a9134c").into(), }, sync_aggregate: SyncAggregate{ sync_committee_bits: hex!("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"), - sync_committee_signature: hex!("a761c3333fbb3d36bc8f65454f898da38001499dcd37494cf3d86940a995399ae649216ba4c985af154f83f72c8b1856079b7636a7a8d7d3f7602df2cbf699edb72b65253e82de4d9cc4db7377eafb22f799129f63f094a21c00675bdd5cc243").into(), + sync_committee_signature: hex!("810cfde2afea3e276256c09bdf1cd321c33dcadeefddcfd24f488e6f756d917cfda90b5b437b3a4b4ef880985afa28a40cf565ec0a82877ddee36adc01d55d9d4a911ae3e22556e4c2636f1c707366fba019fb49450440fcd263d0b054b04bf0").into(), }, signature_slot: 130, next_sync_committee_update: Some(NextSyncCommitteeUpdate { @@ -1096,34 +1097,34 @@ pub fn make_sync_committee_update() -> Box { }, next_sync_committee_branch: vec![ hex!("3ade38d498a062b50880a9409e1ca3a7fd4315d91eeb3bb83e56ac6bfe8d6a59").into(), - hex!("fd1e5ff5d4a15081efe3ff17857b1f95984c9a271b1c41c2f81f43e60c2cc541").into(), - hex!("e1c97f93bb7352d395d1ff8ee29881572cb7eb5d71634783701171dcd30cd93d").into(), - hex!("77fa2170ddbd89b15dae02f2e6cf9f76c8e00d1c4217320acffbe01576d0da61").into(), - hex!("e97288e0627219087a024078d69445f34f0583a6350a7c3c40c39fd1fa6f8d68").into(), + hex!("43276bee17fc9fba3f4866e902f0e5b5b308d79db91154bb8bf819973837a7d9").into(), + hex!("5572348e13ce59446ca0ea7cfeed07579da05f121920a76559e19bda94dd81cd").into(), + hex!("2d58adca9f3c742530de037f1933d6de1920ea4b68581613d4bc32b71547f221").into(), + hex!("7072b3c6577cd5a89b3234968f316f54630bb97eafbdb59e5b61637a9640255f").into(), ], }), finalized_header: BeaconHeader{ slot: 64, proposer_index: 4, - parent_root: hex!("0f7bc2353778c14c7f6dba0fc5fe6eec87228b0d3a5447b61dce67b4d9338de3").into(), - state_root: hex!("feb990de653ce494c0a263f820eaf05a9300dbdc30cb6065ede602827bfccde4").into(), - body_root: hex!("f5235cd8c24f2695fc5b7989926305c10ad8cf5a87d62a739f675f5543df2ec1").into(), + parent_root: hex!("a876486aaad7ddb897f369fd22d0a9903cd61d00c9e0dfe7998dd68d1008c678").into(), + state_root: hex!("818e21c3388575f8ccc9ff17ec79d5a57915bcd31bccf47770f65a18e068416b").into(), + body_root: hex!("1d1f73b864b3bb7e11ff91b56ca1381e0f9ca8122b2c542db88243604c763019").into(), }, finality_branch: vec![ hex!("0200000000000000000000000000000000000000000000000000000000000000").into(), hex!("10c726fac935bf9657cc7476d3cfa7bedec5983dcfb59e8a7df6d0a619e108d7").into(), hex!("98e9116c6bb7f20de18800dc63e73e689d06d6a47d35b5e2b32cf093d475840d").into(), - hex!("e1c97f93bb7352d395d1ff8ee29881572cb7eb5d71634783701171dcd30cd93d").into(), - hex!("77fa2170ddbd89b15dae02f2e6cf9f76c8e00d1c4217320acffbe01576d0da61").into(), - hex!("e97288e0627219087a024078d69445f34f0583a6350a7c3c40c39fd1fa6f8d68").into(), + hex!("5572348e13ce59446ca0ea7cfeed07579da05f121920a76559e19bda94dd81cd").into(), + hex!("2d58adca9f3c742530de037f1933d6de1920ea4b68581613d4bc32b71547f221").into(), + hex!("7072b3c6577cd5a89b3234968f316f54630bb97eafbdb59e5b61637a9640255f").into(), ], - block_roots_root: hex!("6fcdfd1c3fb1bdd421fe59dddfff3855b5ed5e30373887991a0059d019ad12bc").into(), + block_roots_root: hex!("715b08694bef183a6d94b3113d16a7129f89fc3edec85a7e0eaf6ef9153552ef").into(), block_roots_branch: vec![ - hex!("94b59531f172bc24f914bc0c10104ccb158676850f8cc3b47b6ddb7f096ebdd7").into(), - hex!("22470ed9155a938587d44d5fa19217c0f939d8862e504e67cd8cb4d1b960795e").into(), - hex!("feec3ef1a68f93849e71e84f90b99602cccc31868137b6887ca8244a4b979e8e").into(), + hex!("4028c72c71b6ce80ea7d18b2c9471f4e4fa39746261a9921e832a4a2f9bdf7bb").into(), + hex!("75f98062661785d3290b7bd998b64446582baa49210733fd4603e1a97cd45a44").into(), + hex!("6fb757f44052f30c464810f01b0132adfa1a5446d8715b41e9af88eee1ee3e65").into(), hex!("5340ad5877c72dca689ca04bc8fedb78d67a4801d99887937edd8ccd29f87e82").into(), - hex!("f5ff4b0c6190005015889879568f5f0d9c40134c7ec4ffdda47950dcd92395ad").into(), + hex!("f2b3cb56753939a728ccad399a434ca490f018f2f331529ec0d8b2d59c509271").into(), ], }) } @@ -1131,95 +1132,180 @@ pub fn make_sync_committee_update() -> Box { pub fn make_finalized_header_update() -> Box { Box::new(Update { attested_header: BeaconHeader { - slot: 2566, - proposer_index: 6, - parent_root: hex!("6eb9f13a2c496318ce1ab3087bbd872f5c9519a1a7ca8231a2453e3cb523af00").into(), - state_root: hex!("c8cb12766113dff7e46d2917267bf33d0626d99dd47715fcdbc5c65fad3c04b4").into(), - body_root: hex!("d8cfd0d7bc9bc3724417a1655bb0a67c0765ca36197320f4d834150b52ef1420").into(), + slot: 933, + proposer_index: 1, + parent_root: hex!("f5fc63e2780ca302b97aea73fc95d74d702b5afe9a772c2b68f695026337b620").into(), + state_root: hex!("d856d11636bc4d866e78be9e747b222b0977556a367ab42e4085277301438050").into(), + body_root: hex!("5689091ab4eb76c2e876271add4924e1c66ce987c300c24aac2ad8c703e9a33f").into(), }, sync_aggregate: SyncAggregate{ sync_committee_bits: hex!("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"), - sync_committee_signature: hex!("9296f9a0387f2cac47008e22ad7c3cd3d49d35384c13e6aa1eacca7dca7c3d2ca81515e50eb3396b9550ed20ef7d8fa2049a186598feb2c00e93728045fcff917733d1827481b8fc95f3913e27fc70112c2490496eb57bb7181f02c3f9fd471f").into(), + sync_committee_signature: hex!("93a3d482fe2a2f7fd2b634169752a8fddf1dc28b23a020b398be8526faf37a74ca0f6db1bed78a9c7256c09a6115235e108e0e8a7ce09287317b0856c4b77dfa5adba6cf4c3ebea5bfa4cd2fcde80fd0a532f2defe65d530201d5d2258796559").into(), }, - signature_slot: 2567, + signature_slot: 934, next_sync_committee_update: None, finalized_header: BeaconHeader { - slot: 2496, - proposer_index: 2, - parent_root: hex!("c99e49787106733eeebab4d93eb326e1f2214575c9d928f0c4ab0da0776f1622").into(), - state_root: hex!("fbf8a08c86ef36bd173e37e733da4a78aa8e85fee99a990e858dd12a59087fde").into(), - body_root: hex!("a2a8ad06901447b2807a9059580a4c40d8a941f325b1343c69f7c7c6c90e4ab0").into(), + slot: 864, + proposer_index: 4, + parent_root: hex!("614e7672f991ac268cd841055973f55e1e42228831a211adef207bb7329be614").into(), + state_root: hex!("5fa8dfca3d760e4242ab46d529144627aa85348a19173b6e081172c701197a4a").into(), + body_root: hex!("0f34c083b1803666bb1ac5e73fa71582731a2cf37d279ff0a3b0cad5a2ff371e").into(), }, finality_branch: vec![ - hex!("4e00000000000000000000000000000000000000000000000000000000000000").into(), + hex!("1b00000000000000000000000000000000000000000000000000000000000000").into(), hex!("10c726fac935bf9657cc7476d3cfa7bedec5983dcfb59e8a7df6d0a619e108d7").into(), hex!("98e9116c6bb7f20de18800dc63e73e689d06d6a47d35b5e2b32cf093d475840d").into(), - hex!("958b8e43347f6df6fa5eb3d62d06a862381a6585aa40640dd1c0de11f1cf89c1").into(), - hex!("f107dce04faa86a28fc5d4a618be9cb8d4fc3c23d6c42c3624f3ff4bf6586a03").into(), - hex!("a501cdc02e86969ac3e4d0c5a36f4f049efaa1ab8cb6693f51d130eb52a80f30").into(), + hex!("f12d9aededc72724e417b518fe6f847684f26f81616243dedf8c551cc7d504f5").into(), + hex!("89a85d0907ab3fd6e00ae385f61d456c6191646404ae7b8d23d0e60440cf4d00").into(), + hex!("9fc943b6020eb61d780d78bcc6f6102a81d2c868d58f36e61c6e286a2dc4d8c2").into(), ], - block_roots_root: hex!("d160b7687041891b73e54b06fc4e04f82d0fa8fdd76705895e216c6b24709dfe").into(), + block_roots_root: hex!("b9aab9c388c4e4fcd899b71f62c498fc73406e38e8eb14aa440e9affa06f2a10").into(), block_roots_branch: vec![ - hex!("105290e42d98ab6a0ada6e55453cede36c672abf645eeb986b88d7487616e135").into(), - hex!("9da41f274bcdf6122335443d9ce94d07163b48dba3e2f9499ff56f4e48b48b99").into(), - hex!("ecea7e1d3152d8130e83afdfe34b4de4ba2b69a33c9471991096daf454de9cf5").into(), - hex!("b2bf1758e50b2bfff29169fbc70fdb884b2b05bb615dbc53567574da6f4f1ae2").into(), - hex!("cd87069daf70975779126d6af833b7d636c75ca4d5e750ebcad0e76408a5e5bf").into(), + hex!("733422bd810895dab74cbbe07c69dd440cbb51f573181ad4dddac30fcdd0f41f").into(), + hex!("9b9eca73ab01d14549c325ba1b4610bb20bf1f8ec2dbd649f9d8cc7f3cea75fa").into(), + hex!("bcc666ad0ad9f9725cbd682bc95589d35b1b53b2a615f1e6e8dd5e086336becf").into(), + hex!("3069b547a08f703a1715016e926cbd64e71f93f64fb68d98d8c8f1ab745c46e5").into(), + hex!("c2de7e1097239404e17b263cfa0473533cc41e903cb03440d633bc5c27314cb4").into(), ] }) } -pub fn make_execution_header_update() -> Box { - Box::new(ExecutionHeaderUpdate { +pub fn make_execution_proof() -> Box { + Box::new(ExecutionProof { header: BeaconHeader { - slot: 215, - proposer_index: 2, - parent_root: hex!("97518f531a252bb6ca547b21aca9da767943ec99211d3b15c804e34c3a523f45").into(), - state_root: hex!("b088b5a3a8c90d6dc919a695cd7bb0267c6f983ea2e675c559ceb8f46cb90b67").into(), - body_root: hex!("0ba23c8224fdd01531d5ad51486353bd524a0b4c20bca704e26d3210616f829b").into(), + slot: 393, + proposer_index: 4, + parent_root: hex!("6545b47a614a1dd4cad042a0cdbbf5be347e8ffcdc02c6c64540d5153acebeef").into(), + state_root: hex!("b62ac34a8cb82497be9542fe2114410c9f6021855b766015406101a1f3d86434").into(), + body_root: hex!("04005fe231e11a5b7b1580cb73b177ae8b338bedd745497e6bb7122126a806db").into(), }, ancestry_proof: Some(AncestryProof { header_branch: vec![ - hex!("97518f531a252bb6ca547b21aca9da767943ec99211d3b15c804e34c3a523f45").into(), - hex!("5ce0db996bd499c2b4f7a93263d5aafd052f420efb617cce6fdd54e25516aa45").into(), - hex!("84f0e373b66011ce774c7061440c0a50a51cce2b4b335395eee3e563d605597f").into(), - hex!("48f9ccc5f9594142c18c3b5c39a99f0549329c6ab3ba06c9a50030eadca87770").into(), - hex!("f89d6e311e05bc75a6f63ce118bccce254551f1a88d54c3b4f773f81f946bd99").into(), - hex!("2edd6d893c22636675147c07dfcdb541a146e87c3f15b51c388be4868246dc9b").into(), - hex!("d76b7de5f856e3208a91a42c9c398a7f4fab35e667bf916346050ae742514a2d").into(), - hex!("83a2e233e76385953ca41de4c3afe60471a61f0cc1b3846b4a0670e3e563b747").into(), - hex!("e783a5a109c2ad74e4eb53e8f6b11b31266a92a9e16c1fd5873109c5d41b282c").into(), - hex!("d4ea1ef3869ee6a0fd0b19d7d70027d144eecd4f1d32cbf47632a0a9069164b9").into(), - hex!("f8179564b58eb93a850d35e4156a04db651106442ad891c3e85155c1762792f1").into(), - hex!("4cbb1edb48cf1e32fb30db60aaaeaf6190ffe4d0c8dbc96cec307daecb78be12").into(), + hex!("6545b47a614a1dd4cad042a0cdbbf5be347e8ffcdc02c6c64540d5153acebeef").into(), + hex!("fa84cc88ca53a72181599ff4eb07d8b444bce023fe2347c3b4f51004c43439d3").into(), + hex!("cadc8ae211c6f2221c9138e829249adf902419c78eb4727a150baa4d9a02cc9d").into(), + hex!("33a89962df08a35c52bd7e1d887cd71fa7803e68787d05c714036f6edf75947c").into(), + hex!("2c9760fce5c2829ef3f25595a703c21eb22d0186ce223295556ed5da663a82cf").into(), + hex!("e1aa87654db79c8a0ecd6c89726bb662fcb1684badaef5cd5256f479e3c622e1").into(), + hex!("aa70d5f314e4a1fbb9c362f3db79b21bf68b328887248651fbd29fc501d0ca97").into(), + hex!("160b6c235b3a1ed4ef5f80b03ee1c76f7bf3f591c92fca9d8663e9221b9f9f0f").into(), + hex!("f68d7dcd6a07a18e9de7b5d2aa1980eb962e11d7dcb584c96e81a7635c8d2535").into(), + hex!("1d5f912dfd6697110dd1ecb5cb8e77952eef57d85deb373572572df62bb157fc").into(), + hex!("ffff0ad7e659772f9534c195c815efc4014ef1e1daed4404c06385d11192e92b").into(), + hex!("6cf04127db05441cd833107a52be852868890e4317e6a02ab47683aa75964220").into(), hex!("b7d05f875f140027ef5118a2247bbb84ce8f2f0f1123623085daf7960c329f5f").into(), ], - finalized_block_root: hex!("890a7f23b9ed2160901654be9efc575d6830ca860e2a97866ae3423fb7bd7231").into(), + finalized_block_root: hex!("751414cd97c0624f922b3e80285e9f776b08fa22fd5f87391f2ed7ef571a8d46").into(), }), execution_header: VersionedExecutionPayloadHeader::Deneb(deneb::ExecutionPayloadHeader { - parent_hash: hex!("d82ec63f5c5e6ba61d62f09c188f158e6449b94bdcc31941e68639eec3c4cf7a").into(), + parent_hash: hex!("8092290aa21b7751576440f77edd02a94058429ce50e63a92d620951fb25eda2").into(), fee_recipient: hex!("0000000000000000000000000000000000000000").into(), - state_root: hex!("8b65545fe5f3216b47b6339b9c91ca2b7f1032a970b04246d9e9fb4460ee34c3").into(), - receipts_root: hex!("7b1f61b9714c080ef0be014e01657a15f45f0304b477beebc7ca5596c8033095").into(), - logs_bloom: hex!("00000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000080000000000000000000000000000004000000000080000000000000000000000000000000000010100000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000040004000000000000002000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000200000000000010").into(), - prev_randao: hex!("6d9e2a012d82b1b6cb0a2c1c1ed24cc16dbb56e6e39ae545371e0666ab057862").into(), - block_number: 215, - gas_limit: 64842908, - gas_used: 119301, - timestamp: 1705859527, - extra_data: hex!("d983010d0a846765746888676f312e32312e358664617277696e").into(), + state_root: hex!("96a83e9ddf745346fafcb0b03d57314623df669ed543c110662b21302a0fae8b").into(), + receipts_root: hex!("dccdfceea05036f7b61dcdabadc937945d31e68a8d3dfd4dc85684457988c284").into(), + logs_bloom: hex!("00000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000080000000400000000000000000000004000000000080000000000000000000000000000000000010100000000000000000000000000000000020000000000000000000000000000000000080000000000000000000000000000040004000000000000002002002000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000080000000000000000000000000000000000100000000000000000200000200000010").into(), + prev_randao: hex!("62e309d4f5119d1f5c783abc20fc1a549efbab546d8d0b25ff1cfd58be524e67").into(), + block_number: 393, + gas_limit: 54492273, + gas_used: 199644, + timestamp: 1710552813, + extra_data: hex!("d983010d0b846765746888676f312e32312e368664617277696e").into(), base_fee_per_gas: U256::from(7u64), - block_hash: hex!("48498dbfbcfae53a7f4c289ee00747aceea925f6260c50ead5a33e1c55c40f98").into(), - transactions_root: hex!("5ebc1347fe3df0611d4f66b19bd8e1c6f4eaed0371d850f14c83b1c77ea234e6").into(), + block_hash: hex!("6a9810efb9581d30c1a5c9074f27c68ea779a8c1ae31c213241df16225f4e131").into(), + transactions_root: hex!("2cfa6ed7327e8807c7973516c5c32a68ef2459e586e8067e113d081c3bd8c07d").into(), withdrawals_root: hex!("792930bbd5baac43bcc798ee49aa8185ef76bb3b44ba62b91d86ae569e4bb535").into(), blob_gas_used: 0, excess_blob_gas: 0, }), execution_branch: vec![ - hex!("f8c69d3830406d668619bcccc13c8dddde41e863326f7418b241d5924c4ad34a").into(), + hex!("a6833fa629f3286b6916c6e50b8bf089fc9126bee6f64d0413b4e59c1265834d").into(), hex!("b46f0c01805fe212e15907981b757e6c496b0cb06664224655613dcec82505bb").into(), hex!("db56114e00fdd4c1f85c892bf35ac9a89289aaecb1ebd0a96cde606a748b5d71").into(), - hex!("f4d6b5cf9c6e212615c3674fa625d04eb1114153fb221ef5ad02aa433fc67cfb").into(), + hex!("d3af7c05c516726be7505239e0b9c7cb53d24abce6b91cdb3b3995f0164a75da").into(), ], }) } + +pub fn make_inbound_fixture() -> InboundQueueFixture { + InboundQueueFixture { + message: Message { + event_log: Log { + address: hex!("eda338e4dc46038493b885327842fd3e301cab39").into(), + topics: vec![ + hex!("7153f9357c8ea496bba60bf82e67143e27b64462b49041f8e689e1b05728f84f").into(), + hex!("c173fac324158e77fb5840738a1a541f633cbec8884c6a601c567d2b376a0539").into(), + hex!("5f7060e971b0dc81e63f0aa41831091847d97c1a4693ac450cc128c7214e65e0").into(), + ], + data: hex!("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000002e00a736aa00000000000087d1f7fdfee7f651fabc8bfcb6e086c278b77a7d00e40b54020000000000000000000000000000000000000000000000000000000000").into(), + }, + proof: Proof { + receipt_proof: (vec![ + hex!("dccdfceea05036f7b61dcdabadc937945d31e68a8d3dfd4dc85684457988c284").to_vec(), + hex!("4a98e45a319168b0fc6005ce6b744ee9bf54338e2c0784b976a8578d241ced0f").to_vec(), + ], vec![ + hex!("f851a09c01dd6d2d8de951c45af23d3ad00829ce021c04d6c8acbe1612d456ee320d4980808080808080a04a98e45a319168b0fc6005ce6b744ee9bf54338e2c0784b976a8578d241ced0f8080808080808080").to_vec(), + hex!("f9028c30b9028802f90284018301d205b9010000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000080000000000000000000000000000004000000000080000000000000000000000000000000000010100000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000040004000000000000002000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000200000000000010f90179f85894eda338e4dc46038493b885327842fd3e301cab39e1a0f78bb28d4b1d7da699e5c0bc2be29c2b04b5aab6aacf6298fe5304f9db9c6d7ea000000000000000000000000087d1f7fdfee7f651fabc8bfcb6e086c278b77a7df9011c94eda338e4dc46038493b885327842fd3e301cab39f863a07153f9357c8ea496bba60bf82e67143e27b64462b49041f8e689e1b05728f84fa0c173fac324158e77fb5840738a1a541f633cbec8884c6a601c567d2b376a0539a05f7060e971b0dc81e63f0aa41831091847d97c1a4693ac450cc128c7214e65e0b8a000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000002e00a736aa00000000000087d1f7fdfee7f651fabc8bfcb6e086c278b77a7d00e40b54020000000000000000000000000000000000000000000000000000000000").to_vec(), + ]), + execution_proof: ExecutionProof { + header: BeaconHeader { + slot: 393, + proposer_index: 4, + parent_root: hex!("6545b47a614a1dd4cad042a0cdbbf5be347e8ffcdc02c6c64540d5153acebeef").into(), + state_root: hex!("b62ac34a8cb82497be9542fe2114410c9f6021855b766015406101a1f3d86434").into(), + body_root: hex!("04005fe231e11a5b7b1580cb73b177ae8b338bedd745497e6bb7122126a806db").into(), + }, + ancestry_proof: Some(AncestryProof { + header_branch: vec![ + hex!("6545b47a614a1dd4cad042a0cdbbf5be347e8ffcdc02c6c64540d5153acebeef").into(), + hex!("fa84cc88ca53a72181599ff4eb07d8b444bce023fe2347c3b4f51004c43439d3").into(), + hex!("cadc8ae211c6f2221c9138e829249adf902419c78eb4727a150baa4d9a02cc9d").into(), + hex!("33a89962df08a35c52bd7e1d887cd71fa7803e68787d05c714036f6edf75947c").into(), + hex!("2c9760fce5c2829ef3f25595a703c21eb22d0186ce223295556ed5da663a82cf").into(), + hex!("e1aa87654db79c8a0ecd6c89726bb662fcb1684badaef5cd5256f479e3c622e1").into(), + hex!("aa70d5f314e4a1fbb9c362f3db79b21bf68b328887248651fbd29fc501d0ca97").into(), + hex!("160b6c235b3a1ed4ef5f80b03ee1c76f7bf3f591c92fca9d8663e9221b9f9f0f").into(), + hex!("f68d7dcd6a07a18e9de7b5d2aa1980eb962e11d7dcb584c96e81a7635c8d2535").into(), + hex!("1d5f912dfd6697110dd1ecb5cb8e77952eef57d85deb373572572df62bb157fc").into(), + hex!("ffff0ad7e659772f9534c195c815efc4014ef1e1daed4404c06385d11192e92b").into(), + hex!("6cf04127db05441cd833107a52be852868890e4317e6a02ab47683aa75964220").into(), + hex!("b7d05f875f140027ef5118a2247bbb84ce8f2f0f1123623085daf7960c329f5f").into(), + ], + finalized_block_root: hex!("751414cd97c0624f922b3e80285e9f776b08fa22fd5f87391f2ed7ef571a8d46").into(), + }), + execution_header: VersionedExecutionPayloadHeader::Deneb(deneb::ExecutionPayloadHeader { + parent_hash: hex!("8092290aa21b7751576440f77edd02a94058429ce50e63a92d620951fb25eda2").into(), + fee_recipient: hex!("0000000000000000000000000000000000000000").into(), + state_root: hex!("96a83e9ddf745346fafcb0b03d57314623df669ed543c110662b21302a0fae8b").into(), + receipts_root: hex!("dccdfceea05036f7b61dcdabadc937945d31e68a8d3dfd4dc85684457988c284").into(), + logs_bloom: hex!("00000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000080000000400000000000000000000004000000000080000000000000000000000000000000000010100000000000000000000000000000000020000000000000000000000000000000000080000000000000000000000000000040004000000000000002002002000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000080000000000000000000000000000000000100000000000000000200000200000010").into(), + prev_randao: hex!("62e309d4f5119d1f5c783abc20fc1a549efbab546d8d0b25ff1cfd58be524e67").into(), + block_number: 393, + gas_limit: 54492273, + gas_used: 199644, + timestamp: 1710552813, + extra_data: hex!("d983010d0b846765746888676f312e32312e368664617277696e").into(), + base_fee_per_gas: U256::from(7u64), + block_hash: hex!("6a9810efb9581d30c1a5c9074f27c68ea779a8c1ae31c213241df16225f4e131").into(), + transactions_root: hex!("2cfa6ed7327e8807c7973516c5c32a68ef2459e586e8067e113d081c3bd8c07d").into(), + withdrawals_root: hex!("792930bbd5baac43bcc798ee49aa8185ef76bb3b44ba62b91d86ae569e4bb535").into(), + blob_gas_used: 0, + excess_blob_gas: 0, + }), + execution_branch: vec![ + hex!("a6833fa629f3286b6916c6e50b8bf089fc9126bee6f64d0413b4e59c1265834d").into(), + hex!("b46f0c01805fe212e15907981b757e6c496b0cb06664224655613dcec82505bb").into(), + hex!("db56114e00fdd4c1f85c892bf35ac9a89289aaecb1ebd0a96cde606a748b5d71").into(), + hex!("d3af7c05c516726be7505239e0b9c7cb53d24abce6b91cdb3b3995f0164a75da").into(), + ], + } + }, + }, + finalized_header: BeaconHeader { + slot: 864, + proposer_index: 4, + parent_root: hex!("614e7672f991ac268cd841055973f55e1e42228831a211adef207bb7329be614").into(), + state_root: hex!("5fa8dfca3d760e4242ab46d529144627aa85348a19173b6e081172c701197a4a").into(), + body_root: hex!("0f34c083b1803666bb1ac5e73fa71582731a2cf37d279ff0a3b0cad5a2ff371e").into(), + }, + block_roots_root: hex!("b9aab9c388c4e4fcd899b71f62c498fc73406e38e8eb14aa440e9affa06f2a10").into(), + } +} diff --git a/bridges/snowbridge/pallets/ethereum-client/src/benchmarking/mod.rs b/bridges/snowbridge/pallets/ethereum-client/src/benchmarking/mod.rs index e1520cd715393e79f0265b07263fa9b762206c97..4b8796b628d793951fec9ba905db1cd17f544eee 100644 --- a/bridges/snowbridge/pallets/ethereum-client/src/benchmarking/mod.rs +++ b/bridges/snowbridge/pallets/ethereum-client/src/benchmarking/mod.rs @@ -65,24 +65,6 @@ mod benchmarks { Ok(()) } - #[benchmark] - fn submit_execution_header() -> Result<(), BenchmarkError> { - let caller: T::AccountId = whitelisted_caller(); - let checkpoint_update = make_checkpoint(); - let finalized_header_update = make_finalized_header_update(); - let execution_header_update = make_execution_header_update(); - let execution_header_hash = execution_header_update.execution_header.block_hash(); - EthereumBeaconClient::::process_checkpoint_update(&checkpoint_update)?; - EthereumBeaconClient::::process_update(&finalized_header_update)?; - - #[extrinsic_call] - _(RawOrigin::Signed(caller.clone()), Box::new(*execution_header_update)); - - assert!(>::contains_key(execution_header_hash)); - - Ok(()) - } - #[benchmark(extra)] fn bls_fast_aggregate_verify_pre_aggregated() -> Result<(), BenchmarkError> { EthereumBeaconClient::::process_checkpoint_update(&make_checkpoint())?; diff --git a/bridges/snowbridge/pallets/ethereum-client/src/impls.rs b/bridges/snowbridge/pallets/ethereum-client/src/impls.rs index 300431d87707ddcfd15eb7937f8ef581c157aeed..f600b1f67e29e7875bfccd6fab6926edda6498cc 100644 --- a/bridges/snowbridge/pallets/ethereum-client/src/impls.rs +++ b/bridges/snowbridge/pallets/ethereum-client/src/impls.rs @@ -1,6 +1,8 @@ // SPDX-License-Identifier: Apache-2.0 // SPDX-FileCopyrightText: 2023 Snowfork use super::*; +use frame_support::ensure; +use primitives::ExecutionProof; use snowbridge_core::inbound::{ VerificationError::{self, *}, @@ -14,32 +16,13 @@ impl Verifier for Pallet { /// the log should be in the beacon client storage, meaning it has been verified and is an /// ancestor of a finalized beacon block. fn verify(event_log: &Log, proof: &Proof) -> Result<(), VerificationError> { - log::info!( - target: "ethereum-client", - "💫 Verifying message with block hash {}", - proof.block_hash, - ); + Self::verify_execution_proof(&proof.execution_proof) + .map_err(|e| InvalidExecutionProof(e.into()))?; - let header = >::get(proof.block_hash).ok_or(HeaderNotFound)?; - - let receipt = match Self::verify_receipt_inclusion(header.receipts_root, proof) { - Ok(receipt) => receipt, - Err(err) => { - log::error!( - target: "ethereum-client", - "💫 Verification of receipt inclusion failed for block {}: {:?}", - proof.block_hash, - err - ); - return Err(err) - }, - }; - - log::trace!( - target: "ethereum-client", - "💫 Verified receipt inclusion for transaction at index {} in block {}", - proof.tx_index, proof.block_hash, - ); + let receipt = Self::verify_receipt_inclusion( + proof.execution_proof.execution_header.receipts_root(), + &proof.receipt_proof.1, + )?; event_log.validate().map_err(|_| InvalidLog)?; @@ -53,18 +36,11 @@ impl Verifier for Pallet { if !receipt.contains_log(&event_log) { log::error!( target: "ethereum-client", - "💫 Event log not found in receipt for transaction at index {} in block {}", - proof.tx_index, proof.block_hash, + "💫 Event log not found in receipt for transaction", ); return Err(LogNotFound) } - log::info!( - target: "ethereum-client", - "💫 Receipt verification successful for {}", - proof.block_hash, - ); - Ok(()) } } @@ -74,9 +50,9 @@ impl Pallet { /// `proof.block_hash`. pub fn verify_receipt_inclusion( receipts_root: H256, - proof: &Proof, + receipt_proof: &[Vec], ) -> Result { - let result = verify_receipt_proof(receipts_root, &proof.data.1).ok_or(InvalidProof)?; + let result = verify_receipt_proof(receipts_root, receipt_proof).ok_or(InvalidProof)?; match result { Ok(receipt) => Ok(receipt), @@ -90,4 +66,96 @@ impl Pallet { }, } } + + /// Validates an execution header with ancestry_proof against a finalized checkpoint on + /// chain.The beacon header containing the execution header is sent, plus the execution header, + /// along with a proof that the execution header is rooted in the beacon header body. + pub(crate) fn verify_execution_proof(execution_proof: &ExecutionProof) -> DispatchResult { + let latest_finalized_state = + FinalizedBeaconState::::get(LatestFinalizedBlockRoot::::get()) + .ok_or(Error::::NotBootstrapped)?; + // Checks that the header is an ancestor of a finalized header, using slot number. + ensure!( + execution_proof.header.slot <= latest_finalized_state.slot, + Error::::HeaderNotFinalized + ); + + // Gets the hash tree root of the execution header, in preparation for the execution + // header proof (used to check that the execution header is rooted in the beacon + // header body. + let execution_header_root: H256 = execution_proof + .execution_header + .hash_tree_root() + .map_err(|_| Error::::BlockBodyHashTreeRootFailed)?; + + ensure!( + verify_merkle_branch( + execution_header_root, + &execution_proof.execution_branch, + config::EXECUTION_HEADER_SUBTREE_INDEX, + config::EXECUTION_HEADER_DEPTH, + execution_proof.header.body_root + ), + Error::::InvalidExecutionHeaderProof + ); + + let beacon_block_root: H256 = execution_proof + .header + .hash_tree_root() + .map_err(|_| Error::::HeaderHashTreeRootFailed)?; + + match &execution_proof.ancestry_proof { + Some(proof) => { + Self::verify_ancestry_proof( + beacon_block_root, + execution_proof.header.slot, + &proof.header_branch, + proof.finalized_block_root, + )?; + }, + None => { + // If the ancestry proof is not provided, we expect this beacon header to be a + // finalized beacon header. We need to check that the header hash matches the + // finalized header root at the expected slot. + let state = >::get(beacon_block_root) + .ok_or(Error::::ExpectedFinalizedHeaderNotStored)?; + if execution_proof.header.slot != state.slot { + return Err(Error::::ExpectedFinalizedHeaderNotStored.into()) + } + }, + } + + Ok(()) + } + + /// Verify that `block_root` is an ancestor of `finalized_block_root` Used to prove that + /// an execution header is an ancestor of a finalized header (i.e. the blocks are + /// on the same chain). + fn verify_ancestry_proof( + block_root: H256, + block_slot: u64, + block_root_proof: &[H256], + finalized_block_root: H256, + ) -> DispatchResult { + let state = >::get(finalized_block_root) + .ok_or(Error::::ExpectedFinalizedHeaderNotStored)?; + + ensure!(block_slot < state.slot, Error::::HeaderNotFinalized); + + let index_in_array = block_slot % (SLOTS_PER_HISTORICAL_ROOT as u64); + let leaf_index = (SLOTS_PER_HISTORICAL_ROOT as u64) + index_in_array; + + ensure!( + verify_merkle_branch( + block_root, + block_root_proof, + leaf_index as usize, + config::BLOCK_ROOT_AT_INDEX_DEPTH, + state.block_roots_root + ), + Error::::InvalidAncestryMerkleProof + ); + + Ok(()) + } } diff --git a/bridges/snowbridge/pallets/ethereum-client/src/lib.rs b/bridges/snowbridge/pallets/ethereum-client/src/lib.rs index a54d4a05ac5840df4aa7b00389527a0ec94ee22d..c1b9e19729bc47588ad179db0c9c280a05834bc1 100644 --- a/bridges/snowbridge/pallets/ethereum-client/src/lib.rs +++ b/bridges/snowbridge/pallets/ethereum-client/src/lib.rs @@ -10,13 +10,11 @@ //! //! * [`Call::force_checkpoint`]: Set the initial trusted consensus checkpoint. //! * [`Call::set_operating_mode`]: Set the operating mode of the pallet. Can be used to disable -//! processing of conensus updates. +//! processing of consensus updates. //! //! ## Consensus Updates //! //! * [`Call::submit`]: Submit a finalized beacon header with an optional sync committee update -//! * [`Call::submit_execution_header`]: Submit an execution header together with an ancestry proof -//! that can be verified against an already imported finalized beacon header. #![cfg_attr(not(feature = "std"), no_std)] pub mod config; @@ -40,8 +38,7 @@ use frame_support::{ use frame_system::ensure_signed; use primitives::{ fast_aggregate_verify, verify_merkle_branch, verify_receipt_proof, BeaconHeader, BlsError, - CompactBeaconState, CompactExecutionHeader, ExecutionHeaderState, ForkData, ForkVersion, - ForkVersions, PublicKeyPrepared, SigningData, + CompactBeaconState, ForkData, ForkVersion, ForkVersions, PublicKeyPrepared, SigningData, }; use snowbridge_core::{BasicOperatingMode, RingBufferMap}; use sp_core::H256; @@ -51,11 +48,7 @@ pub use weights::WeightInfo; use functions::{ compute_epoch, compute_period, decompress_sync_committee_bits, sync_committee_sum, }; -pub use types::ExecutionHeaderBuffer; -use types::{ - CheckpointUpdate, ExecutionHeaderUpdate, FinalizedBeaconStateBuffer, SyncCommitteePrepared, - Update, -}; +use types::{CheckpointUpdate, FinalizedBeaconStateBuffer, SyncCommitteePrepared, Update}; pub use pallet::*; @@ -76,10 +69,7 @@ pub mod pallet { pub struct MaxFinalizedHeadersToKeep(PhantomData); impl Get for MaxFinalizedHeadersToKeep { fn get() -> u32 { - // Consider max latency allowed between LatestFinalizedState and LatestExecutionState is - // the total slots in one sync_committee_period so 1 should be fine we keep 2 periods - // here for redundancy. - const MAX_REDUNDANCY: u32 = 2; + const MAX_REDUNDANCY: u32 = 20; config::EPOCHS_PER_SYNC_COMMITTEE_PERIOD as u32 * MAX_REDUNDANCY } } @@ -92,9 +82,6 @@ pub mod pallet { type RuntimeEvent: From> + IsType<::RuntimeEvent>; #[pallet::constant] type ForkVersions: Get; - /// Maximum number of execution headers to keep - #[pallet::constant] - type MaxExecutionHeadersToKeep: Get; type WeightInfo: WeightInfo; } @@ -105,10 +92,6 @@ pub mod pallet { block_hash: H256, slot: u64, }, - ExecutionHeaderImported { - block_hash: H256, - block_number: u64, - }, SyncCommitteeUpdated { period: u64, }, @@ -130,6 +113,10 @@ pub mod pallet { InvalidExecutionHeaderProof, InvalidAncestryMerkleProof, InvalidBlockRootsRootMerkleProof, + /// The gap between the finalized headers is larger than the sync committee period, + /// rendering execution headers unprovable using ancestry proofs (blocks root size is + /// the same as the sync committee period slots). + InvalidFinalizedHeaderGap, HeaderNotFinalized, BlockBodyHashTreeRootFailed, HeaderHashTreeRootFailed, @@ -187,25 +174,6 @@ pub mod pallet { pub(super) type NextSyncCommittee = StorageValue<_, SyncCommitteePrepared, ValueQuery>; - /// Latest imported execution header - #[pallet::storage] - #[pallet::getter(fn latest_execution_state)] - pub(super) type LatestExecutionState = - StorageValue<_, ExecutionHeaderState, ValueQuery>; - - /// Execution Headers - #[pallet::storage] - pub type ExecutionHeaders = - StorageMap<_, Identity, H256, CompactExecutionHeader, OptionQuery>; - - /// Execution Headers: Current position in ring buffer - #[pallet::storage] - pub type ExecutionHeaderIndex = StorageValue<_, u32, ValueQuery>; - - /// Execution Headers: Mapping of ring buffer index to a pruning candidate - #[pallet::storage] - pub type ExecutionHeaderMapping = StorageMap<_, Identity, u32, H256, ValueQuery>; - /// The current operating mode of the pallet. #[pallet::storage] #[pallet::getter(fn operating_mode)] @@ -244,21 +212,6 @@ pub mod pallet { Ok(()) } - #[pallet::call_index(2)] - #[pallet::weight(T::WeightInfo::submit_execution_header())] - #[transactional] - /// Submits a new execution header update. The relevant related beacon header - /// is also included to prove the execution header, as well as ancestry proof data. - pub fn submit_execution_header( - origin: OriginFor, - update: Box, - ) -> DispatchResult { - ensure_signed(origin)?; - ensure!(!Self::operating_mode().is_halted(), Error::::Halted); - Self::process_execution_header_update(&update)?; - Ok(()) - } - /// Halt or resume all pallet operations. May only be called by root. #[pallet::call_index(3)] #[pallet::weight((T::DbWeight::get().reads_writes(1, 1), DispatchClass::Operational))] @@ -321,41 +274,19 @@ pub mod pallet { >::set(sync_committee_prepared); >::kill(); InitialCheckpointRoot::::set(header_root); - >::kill(); Self::store_validators_root(update.validators_root); - Self::store_finalized_header(header_root, update.header, update.block_roots_root)?; + Self::store_finalized_header(update.header, update.block_roots_root)?; Ok(()) } pub(crate) fn process_update(update: &Update) -> DispatchResult { - Self::cross_check_execution_state()?; Self::verify_update(update)?; Self::apply_update(update)?; Ok(()) } - /// Cross check to make sure that execution header import does not fall too far behind - /// finalised beacon header import. If that happens just return an error and pause - /// processing until execution header processing has caught up. - pub(crate) fn cross_check_execution_state() -> DispatchResult { - let latest_finalized_state = - FinalizedBeaconState::::get(LatestFinalizedBlockRoot::::get()) - .ok_or(Error::::NotBootstrapped)?; - let latest_execution_state = Self::latest_execution_state(); - // The execution header import should be at least within the slot range of a sync - // committee period. - let max_latency = config::EPOCHS_PER_SYNC_COMMITTEE_PERIOD * config::SLOTS_PER_EPOCH; - ensure!( - latest_execution_state.beacon_slot == 0 || - latest_finalized_state.slot < - latest_execution_state.beacon_slot + max_latency as u64, - Error::::ExecutionHeaderTooFarBehind - ); - Ok(()) - } - /// References and strictly follows /// Verifies that provided next sync committee is valid through a series of checks /// (including checking that a sync committee period isn't skipped and that the header is @@ -398,6 +329,17 @@ pub mod pallet { Error::::IrrelevantUpdate ); + // Verify the finalized header gap between the current finalized header and new imported + // header is not larger than the sync committee period, otherwise we cannot do + // ancestry proofs for execution headers in the gap. + ensure!( + latest_finalized_state + .slot + .saturating_add(config::SLOTS_PER_HISTORICAL_ROOT as u64) >= + update.finalized_header.slot, + Error::::InvalidFinalizedHeaderGap + ); + // Verify that the `finality_branch`, if present, confirms `finalized_header` to match // the finalized checkpoint root saved in the state of `attested_header`. let finalized_block_root: H256 = update @@ -519,127 +461,9 @@ pub mod pallet { }; if update.finalized_header.slot > latest_finalized_state.slot { - let finalized_block_root: H256 = update - .finalized_header - .hash_tree_root() - .map_err(|_| Error::::HeaderHashTreeRootFailed)?; - Self::store_finalized_header( - finalized_block_root, - update.finalized_header, - update.block_roots_root, - )?; - } - - Ok(()) - } - - /// Validates an execution header for import. The beacon header containing the execution - /// header is sent, plus the execution header, along with a proof that the execution header - /// is rooted in the beacon header body. - pub(crate) fn process_execution_header_update( - update: &ExecutionHeaderUpdate, - ) -> DispatchResult { - let latest_finalized_state = - FinalizedBeaconState::::get(LatestFinalizedBlockRoot::::get()) - .ok_or(Error::::NotBootstrapped)?; - // Checks that the header is an ancestor of a finalized header, using slot number. - ensure!( - update.header.slot <= latest_finalized_state.slot, - Error::::HeaderNotFinalized - ); - - // Checks that we don't skip execution headers, they need to be imported sequentially. - let latest_execution_state: ExecutionHeaderState = Self::latest_execution_state(); - ensure!( - latest_execution_state.block_number == 0 || - update.execution_header.block_number() == - latest_execution_state.block_number + 1, - Error::::ExecutionHeaderSkippedBlock - ); - - // Gets the hash tree root of the execution header, in preparation for the execution - // header proof (used to check that the execution header is rooted in the beacon - // header body. - let execution_header_root: H256 = update - .execution_header - .hash_tree_root() - .map_err(|_| Error::::BlockBodyHashTreeRootFailed)?; - - ensure!( - verify_merkle_branch( - execution_header_root, - &update.execution_branch, - config::EXECUTION_HEADER_SUBTREE_INDEX, - config::EXECUTION_HEADER_DEPTH, - update.header.body_root - ), - Error::::InvalidExecutionHeaderProof - ); - - let block_root: H256 = update - .header - .hash_tree_root() - .map_err(|_| Error::::HeaderHashTreeRootFailed)?; - - match &update.ancestry_proof { - Some(proof) => { - Self::verify_ancestry_proof( - block_root, - update.header.slot, - &proof.header_branch, - proof.finalized_block_root, - )?; - }, - None => { - // If the ancestry proof is not provided, we expect this header to be a - // finalized header. We need to check that the header hash matches the finalized - // header root at the expected slot. - let state = >::get(block_root) - .ok_or(Error::::ExpectedFinalizedHeaderNotStored)?; - if update.header.slot != state.slot { - return Err(Error::::ExpectedFinalizedHeaderNotStored.into()) - } - }, + Self::store_finalized_header(update.finalized_header, update.block_roots_root)?; } - Self::store_execution_header( - update.execution_header.block_hash(), - update.execution_header.clone().into(), - update.header.slot, - block_root, - ); - - Ok(()) - } - - /// Verify that `block_root` is an ancestor of `finalized_block_root` Used to prove that - /// an execution header is an ancestor of a finalized header (i.e. the blocks are - /// on the same chain). - fn verify_ancestry_proof( - block_root: H256, - block_slot: u64, - block_root_proof: &[H256], - finalized_block_root: H256, - ) -> DispatchResult { - let state = >::get(finalized_block_root) - .ok_or(Error::::ExpectedFinalizedHeaderNotStored)?; - - ensure!(block_slot < state.slot, Error::::HeaderNotFinalized); - - let index_in_array = block_slot % (SLOTS_PER_HISTORICAL_ROOT as u64); - let leaf_index = (SLOTS_PER_HISTORICAL_ROOT as u64) + index_in_array; - - ensure!( - verify_merkle_branch( - block_root, - block_root_proof, - leaf_index as usize, - config::BLOCK_ROOT_AT_INDEX_DEPTH, - state.block_roots_root - ), - Error::::InvalidAncestryMerkleProof - ); - Ok(()) } @@ -664,13 +488,15 @@ pub mod pallet { /// Stores a compacted (slot and block roots root (hash of the `block_roots` beacon state /// field, used for ancestry proof)) beacon state in a ring buffer map, with the header root /// as map key. - fn store_finalized_header( - header_root: H256, + pub fn store_finalized_header( header: BeaconHeader, block_roots_root: H256, ) -> DispatchResult { let slot = header.slot; + let header_root: H256 = + header.hash_tree_root().map_err(|_| Error::::HeaderHashTreeRootFailed)?; + >::insert( header_root, CompactBeaconState { slot: header.slot, block_roots_root }, @@ -689,36 +515,6 @@ pub mod pallet { Ok(()) } - /// Stores the provided execution header in pallet storage. The header is stored - /// in a ring buffer map, with the block hash as map key. The last imported execution - /// header is also kept in storage, for the relayer to check import progress. - pub fn store_execution_header( - block_hash: H256, - header: CompactExecutionHeader, - beacon_slot: u64, - beacon_block_root: H256, - ) { - let block_number = header.block_number; - - >::insert(block_hash, header); - - log::trace!( - target: LOG_TARGET, - "💫 Updated latest execution block at {} to number {}.", - block_hash, - block_number - ); - - LatestExecutionState::::mutate(|s| { - s.beacon_block_root = beacon_block_root; - s.beacon_slot = beacon_slot; - s.block_hash = block_hash; - s.block_number = block_number; - }); - - Self::deposit_event(Event::ExecutionHeaderImported { block_hash, block_number }); - } - /// Stores the validators root in storage. Validators root is the hash tree root of all the /// validators at genesis and is used to used to identify the chain that we are on /// (used in conjunction with the fork version). diff --git a/bridges/snowbridge/pallets/ethereum-client/src/mock.rs b/bridges/snowbridge/pallets/ethereum-client/src/mock.rs index 3ce34eee191ac48fa95789e03d88e54ff017a2d7..bd6144ebd8f9335ff02a82ad756d1b6dd06125e5 100644 --- a/bridges/snowbridge/pallets/ethereum-client/src/mock.rs +++ b/bridges/snowbridge/pallets/ethereum-client/src/mock.rs @@ -2,12 +2,13 @@ // SPDX-FileCopyrightText: 2023 Snowfork use crate as ethereum_beacon_client; use crate::config; -use frame_support::{derive_impl, parameter_types}; -use hex_literal::hex; +use frame_support::{derive_impl, dispatch::DispatchResult, parameter_types}; use pallet_timestamp; -use primitives::{CompactExecutionHeader, Fork, ForkVersions}; +use primitives::{Fork, ForkVersions}; use snowbridge_core::inbound::{Log, Proof}; +use sp_std::default::Default; use std::{fs::File, path::PathBuf}; + type Block = frame_system::mocking::MockBlock; use sp_runtime::BuildStorage; @@ -20,8 +21,8 @@ where serde_json::from_reader(File::open(filepath).unwrap()) } -pub fn load_execution_header_update_fixture() -> primitives::ExecutionHeaderUpdate { - load_fixture("execution-header-update.json".to_string()).unwrap() +pub fn load_execution_proof_fixture() -> primitives::ExecutionProof { + load_fixture("execution-proof.json".to_string()).unwrap() } pub fn load_checkpoint_update_fixture( @@ -50,41 +51,8 @@ pub fn load_next_finalized_header_update_fixture( } pub fn get_message_verification_payload() -> (Log, Proof) { - ( - Log { - address: hex!("ee9170abfbf9421ad6dd07f6bdec9d89f2b581e0").into(), - topics: vec![ - hex!("1b11dcf133cc240f682dab2d3a8e4cd35c5da8c9cf99adac4336f8512584c5ad").into(), - hex!("00000000000000000000000000000000000000000000000000000000000003e8").into(), - hex!("0000000000000000000000000000000000000000000000000000000000000001").into(), - ], - data: hex!("0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004b000f000000000000000100d184c103f7acc340847eee82a0b909e3358bc28d440edffa1352b13227e8ee646f3ea37456dec701345772617070656420457468657210574554481235003511000000000000000000000000000000000000000000").into(), - }, - Proof { - block_hash: hex!("05aaa60b0f27cce9e71909508527264b77ee14da7b5bf915fcc4e32715333213").into(), - tx_index: 0, - data: (vec![ - hex!("cf0d1c1ba57d1e0edfb59786c7e30c2b7e12bd54612b00cd21c4eaeecedf44fb").to_vec(), - hex!("d21fc4f68ab05bc4dcb23c67008e92c4d466437cdd6ed7aad0c008944c185510").to_vec(), - hex!("b9890f91ca0d77aa2a4adfaf9b9e40c94cac9e638b6d9797923865872944b646").to_vec(), - ], vec![ - hex!("f90131a0b601337b3aa10a671caa724eba641e759399979856141d3aea6b6b4ac59b889ba00c7d5dd48be9060221a02fb8fa213860b4c50d47046c8fa65ffaba5737d569e0a094601b62a1086cd9c9cb71a7ebff9e718f3217fd6e837efe4246733c0a196f63a06a4b0dd0aefc37b3c77828c8f07d1b7a2455ceb5dbfd3c77d7d6aeeddc2f7e8ca0d6e8e23142cdd8ec219e1f5d8b56aa18e456702b195deeaa210327284d42ade4a08a313d4c87023005d1ab631bbfe3f5de1e405d0e66d0bef3e033f1e5711b5521a0bf09a5d9a48b10ade82b8d6a5362a15921c8b5228a3487479b467db97411d82fa0f95cccae2a7c572ef3c566503e30bac2b2feb2d2f26eebf6d870dcf7f8cf59cea0d21fc4f68ab05bc4dcb23c67008e92c4d466437cdd6ed7aad0c008944c1855108080808080808080").to_vec(), - hex!("f851a0b9890f91ca0d77aa2a4adfaf9b9e40c94cac9e638b6d9797923865872944b646a060a634b9280e3a23fb63375e7bbdd9ab07fd379ab6a67e2312bbc112195fa358808080808080808080808080808080").to_vec(), - hex!("f9030820b9030402f90300018301d6e2b9010000000000000800000000000020040008000000000000000000000000400000008000000000000000000000000000000000000000000000000000000000042010000000001000000000000000000000000000000000040000000000000000000000000000000000000000000000008000000000000000002000000000000000000000000200000000000000200000000000100000000040000001000200008000000000000200000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000f901f5f87a942ffa5ecdbe006d30397c7636d3e015eee251369ff842a0c965575a00553e094ca7c5d14f02e107c258dda06867cbf9e0e69f80e71bbcc1a000000000000000000000000000000000000000000000000000000000000003e8a000000000000000000000000000000000000000000000000000000000000003e8f9011c94ee9170abfbf9421ad6dd07f6bdec9d89f2b581e0f863a01b11dcf133cc240f682dab2d3a8e4cd35c5da8c9cf99adac4336f8512584c5ada000000000000000000000000000000000000000000000000000000000000003e8a00000000000000000000000000000000000000000000000000000000000000001b8a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004b000f000000000000000100d184c103f7acc340847eee82a0b909e3358bc28d440edffa1352b13227e8ee646f3ea37456dec701345772617070656420457468657210574554481235003511000000000000000000000000000000000000000000f858948cf6147918a5cbb672703f879f385036f8793a24e1a01449abf21e49fd025f33495e77f7b1461caefdd3d4bb646424a3f445c4576a5ba0000000000000000000000000440edffa1352b13227e8ee646f3ea37456dec701").to_vec(), - ]), - } - ) -} - -pub fn get_message_verification_header() -> CompactExecutionHeader { - CompactExecutionHeader { - parent_hash: hex!("04a7f6ab8282203562c62f38b0ab41d32aaebe2c7ea687702b463148a6429e04") - .into(), - block_number: 55, - state_root: hex!("894d968712976d613519f973a317cb0781c7b039c89f27ea2b7ca193f7befdb3").into(), - receipts_root: hex!("cf0d1c1ba57d1e0edfb59786c7e30c2b7e12bd54612b00cd21c4eaeecedf44fb") - .into(), - } + let inbound_fixture = snowbridge_pallet_ethereum_client_fixtures::make_inbound_fixture(); + (inbound_fixture.message.event_log, inbound_fixture.message.proof) } frame_support::construct_runtime!( @@ -95,7 +63,7 @@ frame_support::construct_runtime!( } ); -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { type Block = Block; } @@ -130,20 +98,25 @@ parameter_types! { epoch: 0, } }; - pub const ExecutionHeadersPruneThreshold: u32 = 8192; } impl ethereum_beacon_client::Config for Test { type RuntimeEvent = RuntimeEvent; type ForkVersions = ChainForkVersions; - type MaxExecutionHeadersToKeep = ExecutionHeadersPruneThreshold; type WeightInfo = (); } // Build genesis storage according to the mock runtime. pub fn new_tester() -> sp_io::TestExternalities { let t = frame_system::GenesisConfig::::default().build_storage().unwrap(); - let mut ext = sp_io::TestExternalities::new(t); - let _ = ext.execute_with(|| Timestamp::set(RuntimeOrigin::signed(1), 30_000)); + let ext = sp_io::TestExternalities::new(t); ext } + +pub fn initialize_storage() -> DispatchResult { + let inbound_fixture = snowbridge_pallet_ethereum_client_fixtures::make_inbound_fixture(); + EthereumBeaconClient::store_finalized_header( + inbound_fixture.finalized_header, + inbound_fixture.block_roots_root, + ) +} diff --git a/bridges/snowbridge/pallets/ethereum-client/src/tests.rs b/bridges/snowbridge/pallets/ethereum-client/src/tests.rs index 50b6a25c3428dba843303031018a4ef5e93cf696..765958c128212ee279bf547eb864335c7921e2eb 100644 --- a/bridges/snowbridge/pallets/ethereum-client/src/tests.rs +++ b/bridges/snowbridge/pallets/ethereum-client/src/tests.rs @@ -1,32 +1,26 @@ // SPDX-License-Identifier: Apache-2.0 // SPDX-FileCopyrightText: 2023 Snowfork use crate::{ - functions::compute_period, pallet::ExecutionHeaders, sync_committee_sum, verify_merkle_branch, - BeaconHeader, CompactBeaconState, Error, ExecutionHeaderBuffer, FinalizedBeaconState, - LatestExecutionState, LatestFinalizedBlockRoot, NextSyncCommittee, SyncCommitteePrepared, + functions::compute_period, sync_committee_sum, verify_merkle_branch, BeaconHeader, + CompactBeaconState, Error, FinalizedBeaconState, LatestFinalizedBlockRoot, NextSyncCommittee, + SyncCommitteePrepared, }; use crate::mock::{ - get_message_verification_header, get_message_verification_payload, - load_checkpoint_update_fixture, load_execution_header_update_fixture, + get_message_verification_payload, load_checkpoint_update_fixture, load_finalized_header_update_fixture, load_next_finalized_header_update_fixture, load_next_sync_committee_update_fixture, load_sync_committee_update_fixture, }; pub use crate::mock::*; -use crate::config::{EPOCHS_PER_SYNC_COMMITTEE_PERIOD, SLOTS_PER_EPOCH}; +use crate::config::{EPOCHS_PER_SYNC_COMMITTEE_PERIOD, SLOTS_PER_EPOCH, SLOTS_PER_HISTORICAL_ROOT}; use frame_support::{assert_err, assert_noop, assert_ok}; use hex_literal::hex; use primitives::{ - CompactExecutionHeader, ExecutionHeaderState, Fork, ForkVersions, NextSyncCommitteeUpdate, - VersionedExecutionPayloadHeader, -}; -use rand::{thread_rng, Rng}; -use snowbridge_core::{ - inbound::{VerificationError, Verifier}, - RingBufferMap, + types::deneb, Fork, ForkVersions, NextSyncCommitteeUpdate, VersionedExecutionPayloadHeader, }; +use snowbridge_core::inbound::{VerificationError, Verifier}; use sp_core::H256; use sp_runtime::DispatchError; @@ -212,61 +206,6 @@ pub fn sync_committee_participation_is_supermajority_errors_when_not_supermajori }); } -#[test] -pub fn execution_header_pruning() { - new_tester().execute_with(|| { - let execution_header_prune_threshold = ExecutionHeadersPruneThreshold::get(); - let to_be_deleted = execution_header_prune_threshold / 2; - - let mut stored_hashes = vec![]; - - for i in 0..execution_header_prune_threshold { - let mut hash = H256::default(); - thread_rng().try_fill(&mut hash.0[..]).unwrap(); - EthereumBeaconClient::store_execution_header( - hash, - CompactExecutionHeader::default(), - i as u64, - hash, - ); - stored_hashes.push(hash); - } - - // We should have stored everything until now - assert_eq!({ ExecutionHeaders::::iter().count() }, stored_hashes.len()); - - // Let's push extra entries so that some of the previous entries are deleted. - for i in 0..to_be_deleted { - let mut hash = H256::default(); - thread_rng().try_fill(&mut hash.0[..]).unwrap(); - EthereumBeaconClient::store_execution_header( - hash, - CompactExecutionHeader::default(), - (i + execution_header_prune_threshold) as u64, - hash, - ); - - stored_hashes.push(hash); - } - - // We should have only stored upto `execution_header_prune_threshold` - assert_eq!( - ExecutionHeaders::::iter().count() as u32, - execution_header_prune_threshold - ); - - // First `to_be_deleted` items must be deleted - for i in 0..to_be_deleted { - assert!(!ExecutionHeaders::::contains_key(stored_hashes[i as usize])); - } - - // Other entries should be part of data - for i in to_be_deleted..(to_be_deleted + execution_header_prune_threshold) { - assert!(ExecutionHeaders::::contains_key(stored_hashes[i as usize])); - } - }); -} - #[test] fn compute_fork_version() { let mock_fork_versions = ForkVersions { @@ -348,34 +287,6 @@ fn find_present_keys() { }); } -#[test] -fn cross_check_execution_state() { - new_tester().execute_with(|| { - let header_root: H256 = TEST_HASH.into(); - >::insert( - header_root, - CompactBeaconState { - // set slot to period 5 - slot: ((EPOCHS_PER_SYNC_COMMITTEE_PERIOD * SLOTS_PER_EPOCH) * 5) as u64, - block_roots_root: Default::default(), - }, - ); - LatestFinalizedBlockRoot::::set(header_root); - >::set(ExecutionHeaderState { - beacon_block_root: Default::default(), - // set slot to period 2 - beacon_slot: ((EPOCHS_PER_SYNC_COMMITTEE_PERIOD * SLOTS_PER_EPOCH) * 2) as u64, - block_hash: Default::default(), - block_number: 0, - }); - - assert_err!( - EthereumBeaconClient::cross_check_execution_state(), - Error::::ExecutionHeaderTooFarBehind - ); - }); -} - /* SYNC PROCESS TESTS */ #[test] @@ -608,40 +519,6 @@ fn submit_update_with_skipped_sync_committee_period() { }); } -#[test] -fn submit_update_execution_headers_too_far_behind() { - let checkpoint = Box::new(load_checkpoint_update_fixture()); - let finalized_header_update = Box::new(load_finalized_header_update_fixture()); - let execution_header_update = Box::new(load_execution_header_update_fixture()); - let next_update = Box::new(load_next_sync_committee_update_fixture()); - - new_tester().execute_with(|| { - let far_ahead_finalized_header_slot = finalized_header_update.finalized_header.slot + - (EPOCHS_PER_SYNC_COMMITTEE_PERIOD * SLOTS_PER_EPOCH * 2) as u64; - assert_ok!(EthereumBeaconClient::process_checkpoint_update(&checkpoint)); - assert_ok!(EthereumBeaconClient::submit(RuntimeOrigin::signed(1), finalized_header_update)); - assert_ok!(EthereumBeaconClient::submit_execution_header( - RuntimeOrigin::signed(1), - execution_header_update - )); - - let header_root: H256 = TEST_HASH.into(); - >::insert( - header_root, - CompactBeaconState { - slot: far_ahead_finalized_header_slot, - block_roots_root: Default::default(), - }, - ); - LatestFinalizedBlockRoot::::set(header_root); - - assert_err!( - EthereumBeaconClient::submit(RuntimeOrigin::signed(1), next_update), - Error::::ExecutionHeaderTooFarBehind - ); - }); -} - #[test] fn submit_irrelevant_update() { let checkpoint = Box::new(load_checkpoint_update_fixture()); @@ -703,183 +580,57 @@ fn submit_update_with_invalid_sync_committee_update() { }); } +/// Check that a gap of more than 8192 slots between finalized headers is not allowed. #[test] -fn submit_execution_header_update() { +fn submit_finalized_header_update_with_too_large_gap() { let checkpoint = Box::new(load_checkpoint_update_fixture()); - let finalized_header_update = Box::new(load_finalized_header_update_fixture()); - let execution_header_update = Box::new(load_execution_header_update_fixture()); - - new_tester().execute_with(|| { - assert_ok!(EthereumBeaconClient::process_checkpoint_update(&checkpoint)); - assert_ok!(EthereumBeaconClient::submit(RuntimeOrigin::signed(1), finalized_header_update)); - assert_ok!(EthereumBeaconClient::submit_execution_header( - RuntimeOrigin::signed(1), - execution_header_update.clone() - )); - assert!(>::contains_key( - execution_header_update.execution_header.block_hash() - )); - }); -} - -#[test] -fn submit_execution_header_update_invalid_ancestry_proof() { - let checkpoint = Box::new(load_checkpoint_update_fixture()); - let finalized_header_update = Box::new(load_finalized_header_update_fixture()); - let mut execution_header_update = Box::new(load_execution_header_update_fixture()); - if let Some(ref mut ancestry_proof) = execution_header_update.ancestry_proof { - ancestry_proof.header_branch[0] = TEST_HASH.into() - } - - new_tester().execute_with(|| { - assert_ok!(EthereumBeaconClient::process_checkpoint_update(&checkpoint)); - assert_ok!(EthereumBeaconClient::submit(RuntimeOrigin::signed(1), finalized_header_update)); - assert_err!( - EthereumBeaconClient::submit_execution_header( - RuntimeOrigin::signed(1), - execution_header_update - ), - Error::::InvalidAncestryMerkleProof - ); - }); -} - -#[test] -fn submit_execution_header_update_invalid_execution_header_proof() { - let checkpoint = Box::new(load_checkpoint_update_fixture()); - let finalized_header_update = Box::new(load_finalized_header_update_fixture()); - let mut execution_header_update = Box::new(load_execution_header_update_fixture()); - execution_header_update.execution_branch[0] = TEST_HASH.into(); - - new_tester().execute_with(|| { - assert_ok!(EthereumBeaconClient::process_checkpoint_update(&checkpoint)); - assert_ok!(EthereumBeaconClient::submit(RuntimeOrigin::signed(1), finalized_header_update)); - assert_err!( - EthereumBeaconClient::submit_execution_header( - RuntimeOrigin::signed(1), - execution_header_update - ), - Error::::InvalidExecutionHeaderProof - ); - }); -} + let update = Box::new(load_sync_committee_update_fixture()); + let mut next_update = Box::new(load_next_sync_committee_update_fixture()); -#[test] -fn submit_execution_header_update_that_skips_block() { - let checkpoint = Box::new(load_checkpoint_update_fixture()); - let finalized_header_update = Box::new(load_finalized_header_update_fixture()); - let execution_header_update = Box::new(load_execution_header_update_fixture()); - let mut skipped_block_execution_header_update = - Box::new(load_execution_header_update_fixture()); - let mut skipped_execution_header = - skipped_block_execution_header_update.execution_header.clone(); - - skipped_execution_header = match skipped_execution_header { - VersionedExecutionPayloadHeader::Capella(execution_payload_header) => { - let mut mut_execution_payload_header = execution_payload_header.clone(); - mut_execution_payload_header.block_number = execution_payload_header.block_number + 2; - VersionedExecutionPayloadHeader::Capella(mut_execution_payload_header) - }, - VersionedExecutionPayloadHeader::Deneb(execution_payload_header) => { - let mut mut_execution_payload_header = execution_payload_header.clone(); - mut_execution_payload_header.block_number = execution_payload_header.block_number + 2; - VersionedExecutionPayloadHeader::Deneb(mut_execution_payload_header) - }, - }; + // Adds 8193 slots, so that the next update is still in the next sync committee, but the + // gap between the finalized headers is more than 8192 slots. + let slot_with_large_gap = checkpoint.header.slot + SLOTS_PER_HISTORICAL_ROOT as u64 + 1; - skipped_block_execution_header_update.execution_header = skipped_execution_header; + next_update.finalized_header.slot = slot_with_large_gap; + // Adding some slots to the attested header and signature slot since they need to be ahead + // of the finalized header. + next_update.attested_header.slot = slot_with_large_gap + 33; + next_update.signature_slot = slot_with_large_gap + 43; new_tester().execute_with(|| { assert_ok!(EthereumBeaconClient::process_checkpoint_update(&checkpoint)); - assert_ok!(EthereumBeaconClient::submit(RuntimeOrigin::signed(1), finalized_header_update)); - assert_ok!(EthereumBeaconClient::submit_execution_header( - RuntimeOrigin::signed(1), - execution_header_update.clone() - )); - assert!(>::contains_key( - execution_header_update.execution_header.block_hash() - )); - assert_err!( - EthereumBeaconClient::submit_execution_header( - RuntimeOrigin::signed(1), - skipped_block_execution_header_update - ), - Error::::ExecutionHeaderSkippedBlock - ); - }); -} - -#[test] -fn submit_execution_header_update_that_is_also_finalized_header_which_is_not_stored() { - let checkpoint = Box::new(load_checkpoint_update_fixture()); - let finalized_header_update = Box::new(load_finalized_header_update_fixture()); - let mut execution_header_update = Box::new(load_execution_header_update_fixture()); - execution_header_update.ancestry_proof = None; - - new_tester().execute_with(|| { - assert_ok!(EthereumBeaconClient::process_checkpoint_update(&checkpoint)); - assert_ok!(EthereumBeaconClient::submit(RuntimeOrigin::signed(1), finalized_header_update)); + assert_ok!(EthereumBeaconClient::submit(RuntimeOrigin::signed(1), update.clone())); + assert!(>::exists()); assert_err!( - EthereumBeaconClient::submit_execution_header( - RuntimeOrigin::signed(1), - execution_header_update - ), - Error::::ExpectedFinalizedHeaderNotStored + EthereumBeaconClient::submit(RuntimeOrigin::signed(1), next_update.clone()), + Error::::InvalidFinalizedHeaderGap ); }); } +/// Check that a gap of 8192 slots between finalized headers is allowed. #[test] -fn submit_execution_header_update_that_is_also_finalized_header_which_is_stored_but_slots_dont_match( -) { +fn submit_finalized_header_update_with_gap_at_limit() { let checkpoint = Box::new(load_checkpoint_update_fixture()); - let finalized_header_update = Box::new(load_finalized_header_update_fixture()); - let mut execution_header_update = Box::new(load_execution_header_update_fixture()); - execution_header_update.ancestry_proof = None; - - new_tester().execute_with(|| { - assert_ok!(EthereumBeaconClient::process_checkpoint_update(&checkpoint)); - assert_ok!(EthereumBeaconClient::submit(RuntimeOrigin::signed(1), finalized_header_update)); - - let block_root: H256 = execution_header_update.header.hash_tree_root().unwrap(); - - >::insert( - block_root, - CompactBeaconState { - slot: execution_header_update.header.slot + 1, - block_roots_root: Default::default(), - }, - ); - LatestFinalizedBlockRoot::::set(block_root); - - assert_err!( - EthereumBeaconClient::submit_execution_header( - RuntimeOrigin::signed(1), - execution_header_update - ), - Error::::ExpectedFinalizedHeaderNotStored - ); - }); -} + let update = Box::new(load_sync_committee_update_fixture()); + let mut next_update = Box::new(load_next_sync_committee_update_fixture()); -#[test] -fn submit_execution_header_not_finalized() { - let checkpoint = Box::new(load_checkpoint_update_fixture()); - let finalized_header_update = Box::new(load_finalized_header_update_fixture()); - let update = Box::new(load_execution_header_update_fixture()); + next_update.finalized_header.slot = checkpoint.header.slot + SLOTS_PER_HISTORICAL_ROOT as u64; + // Adding some slots to the attested header and signature slot since they need to be ahead + // of the finalized header. + next_update.attested_header.slot = + checkpoint.header.slot + SLOTS_PER_HISTORICAL_ROOT as u64 + 33; + next_update.signature_slot = checkpoint.header.slot + SLOTS_PER_HISTORICAL_ROOT as u64 + 43; new_tester().execute_with(|| { assert_ok!(EthereumBeaconClient::process_checkpoint_update(&checkpoint)); - assert_ok!(EthereumBeaconClient::submit(RuntimeOrigin::signed(1), finalized_header_update)); - - >::mutate(>::get(), |x| { - let prev = x.unwrap(); - *x = Some(CompactBeaconState { slot: update.header.slot - 1, ..prev }); - }); - + assert_ok!(EthereumBeaconClient::submit(RuntimeOrigin::signed(1), update.clone())); + assert!(>::exists()); assert_err!( - EthereumBeaconClient::submit_execution_header(RuntimeOrigin::signed(1), update), - Error::::HeaderNotFinalized + EthereumBeaconClient::submit(RuntimeOrigin::signed(1), next_update.clone()), + // The test should pass the InvalidFinalizedHeaderGap check, and will fail at the + // next check, the merkle proof, because we changed the next_update slots. + Error::::InvalidHeaderMerkleProof ); }); } @@ -888,37 +639,21 @@ fn submit_execution_header_not_finalized() { #[test] fn verify_message() { - let header = get_message_verification_header(); let (event_log, proof) = get_message_verification_payload(); - let block_hash = proof.block_hash; new_tester().execute_with(|| { - >::insert(block_hash, header); + assert_ok!(initialize_storage()); assert_ok!(EthereumBeaconClient::verify(&event_log, &proof)); }); } -#[test] -fn verify_message_missing_header() { - let (event_log, proof) = get_message_verification_payload(); - - new_tester().execute_with(|| { - assert_err!( - EthereumBeaconClient::verify(&event_log, &proof), - VerificationError::HeaderNotFound - ); - }); -} - #[test] fn verify_message_invalid_proof() { - let header = get_message_verification_header(); let (event_log, mut proof) = get_message_verification_payload(); - proof.data.1[0] = TEST_HASH.into(); - let block_hash = proof.block_hash; + proof.receipt_proof.1[0] = TEST_HASH.into(); new_tester().execute_with(|| { - >::insert(block_hash, header); + assert_ok!(initialize_storage()); assert_err!( EthereumBeaconClient::verify(&event_log, &proof), VerificationError::InvalidProof @@ -928,29 +663,28 @@ fn verify_message_invalid_proof() { #[test] fn verify_message_invalid_receipts_root() { - let mut header = get_message_verification_header(); - let (event_log, proof) = get_message_verification_payload(); - let block_hash = proof.block_hash; - header.receipts_root = TEST_HASH.into(); + let (event_log, mut proof) = get_message_verification_payload(); + let mut payload = deneb::ExecutionPayloadHeader::default(); + payload.receipts_root = TEST_HASH.into(); + proof.execution_proof.execution_header = VersionedExecutionPayloadHeader::Deneb(payload); new_tester().execute_with(|| { - >::insert(block_hash, header); + assert_ok!(initialize_storage()); assert_err!( EthereumBeaconClient::verify(&event_log, &proof), - VerificationError::InvalidProof + VerificationError::InvalidExecutionProof( + Error::::BlockBodyHashTreeRootFailed.into() + ) ); }); } #[test] fn verify_message_invalid_log() { - let header = get_message_verification_header(); let (mut event_log, proof) = get_message_verification_payload(); - let block_hash = proof.block_hash; event_log.topics = vec![H256::zero(); 10]; - new_tester().execute_with(|| { - >::insert(block_hash, header); + assert_ok!(initialize_storage()); assert_err!( EthereumBeaconClient::verify(&event_log, &proof), VerificationError::InvalidLog @@ -960,13 +694,11 @@ fn verify_message_invalid_log() { #[test] fn verify_message_receipt_does_not_contain_log() { - let header = get_message_verification_header(); let (mut event_log, proof) = get_message_verification_payload(); - let block_hash = proof.block_hash; event_log.data = hex!("f9013c94ee9170abfbf9421ad6dd07f6bdec9d89f2b581e0f863a01b11dcf133cc240f682dab2d3a8e4cd35c5da8c9cf99adac4336f8512584c5ada000000000000000000000000000000000000000000000000000000000000003e8a00000000000000000000000000000000000000000000000000000000000000002b8c000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000068000f000000000000000101d184c103f7acc340847eee82a0b909e3358bc28d440edffa1352b13227e8ee646f3ea37456dec70100000101001cbd2d43530a44705ad088af313e18f80b53ef16b36177cd4b77b846f2a5f07c0000e8890423c78a0000000000000000000000000000000000000000000000000000000000000000").to_vec(); new_tester().execute_with(|| { - >::insert(block_hash, header); + assert_ok!(initialize_storage()); assert_err!( EthereumBeaconClient::verify(&event_log, &proof), VerificationError::LogNotFound @@ -978,7 +710,6 @@ fn verify_message_receipt_does_not_contain_log() { fn set_operating_mode() { let checkpoint = Box::new(load_checkpoint_update_fixture()); let update = Box::new(load_finalized_header_update_fixture()); - let execution_header_update = Box::new(load_execution_header_update_fixture()); new_tester().execute_with(|| { assert_ok!(EthereumBeaconClient::process_checkpoint_update(&checkpoint)); @@ -992,14 +723,6 @@ fn set_operating_mode() { EthereumBeaconClient::submit(RuntimeOrigin::signed(1), update), Error::::Halted ); - - assert_noop!( - EthereumBeaconClient::submit_execution_header( - RuntimeOrigin::signed(1), - execution_header_update - ), - Error::::Halted - ); }); } @@ -1015,3 +738,107 @@ fn set_operating_mode_root_only() { ); }); } + +#[test] +fn verify_execution_proof_invalid_ancestry_proof() { + let checkpoint = Box::new(load_checkpoint_update_fixture()); + let finalized_header_update = Box::new(load_finalized_header_update_fixture()); + let mut execution_header_update = Box::new(load_execution_proof_fixture()); + if let Some(ref mut ancestry_proof) = execution_header_update.ancestry_proof { + ancestry_proof.header_branch[0] = TEST_HASH.into() + } + + new_tester().execute_with(|| { + assert_ok!(EthereumBeaconClient::process_checkpoint_update(&checkpoint)); + assert_ok!(EthereumBeaconClient::submit(RuntimeOrigin::signed(1), finalized_header_update)); + assert_err!( + EthereumBeaconClient::verify_execution_proof(&execution_header_update), + Error::::InvalidAncestryMerkleProof + ); + }); +} + +#[test] +fn verify_execution_proof_invalid_execution_header_proof() { + let checkpoint = Box::new(load_checkpoint_update_fixture()); + let finalized_header_update = Box::new(load_finalized_header_update_fixture()); + let mut execution_header_update = Box::new(load_execution_proof_fixture()); + execution_header_update.execution_branch[0] = TEST_HASH.into(); + + new_tester().execute_with(|| { + assert_ok!(EthereumBeaconClient::process_checkpoint_update(&checkpoint)); + assert_ok!(EthereumBeaconClient::submit(RuntimeOrigin::signed(1), finalized_header_update)); + assert_err!( + EthereumBeaconClient::verify_execution_proof(&execution_header_update), + Error::::InvalidExecutionHeaderProof + ); + }); +} + +#[test] +fn verify_execution_proof_that_is_also_finalized_header_which_is_not_stored() { + let checkpoint = Box::new(load_checkpoint_update_fixture()); + let finalized_header_update = Box::new(load_finalized_header_update_fixture()); + let mut execution_header_update = Box::new(load_execution_proof_fixture()); + execution_header_update.ancestry_proof = None; + + new_tester().execute_with(|| { + assert_ok!(EthereumBeaconClient::process_checkpoint_update(&checkpoint)); + assert_ok!(EthereumBeaconClient::submit(RuntimeOrigin::signed(1), finalized_header_update)); + assert_err!( + EthereumBeaconClient::verify_execution_proof(&execution_header_update), + Error::::ExpectedFinalizedHeaderNotStored + ); + }); +} + +#[test] +fn submit_execution_proof_that_is_also_finalized_header_which_is_stored_but_slots_dont_match() { + let checkpoint = Box::new(load_checkpoint_update_fixture()); + let finalized_header_update = Box::new(load_finalized_header_update_fixture()); + let mut execution_header_update = Box::new(load_execution_proof_fixture()); + execution_header_update.ancestry_proof = None; + + new_tester().execute_with(|| { + assert_ok!(EthereumBeaconClient::process_checkpoint_update(&checkpoint)); + assert_ok!(EthereumBeaconClient::submit(RuntimeOrigin::signed(1), finalized_header_update)); + + let block_root: H256 = execution_header_update.header.hash_tree_root().unwrap(); + + >::insert( + block_root, + CompactBeaconState { + slot: execution_header_update.header.slot + 1, + block_roots_root: Default::default(), + }, + ); + LatestFinalizedBlockRoot::::set(block_root); + + assert_err!( + EthereumBeaconClient::verify_execution_proof(&execution_header_update), + Error::::ExpectedFinalizedHeaderNotStored + ); + }); +} + +#[test] +fn verify_execution_proof_not_finalized() { + let checkpoint = Box::new(load_checkpoint_update_fixture()); + let finalized_header_update = Box::new(load_finalized_header_update_fixture()); + let update = Box::new(load_execution_proof_fixture()); + + new_tester().execute_with(|| { + assert_ok!(EthereumBeaconClient::process_checkpoint_update(&checkpoint)); + assert_ok!(EthereumBeaconClient::submit(RuntimeOrigin::signed(1), finalized_header_update)); + + >::mutate(>::get(), |x| { + let prev = x.unwrap(); + *x = Some(CompactBeaconState { slot: update.header.slot - 1, ..prev }); + }); + + assert_err!( + EthereumBeaconClient::verify_execution_proof(&update), + Error::::HeaderNotFinalized + ); + }); +} diff --git a/bridges/snowbridge/pallets/ethereum-client/src/types.rs b/bridges/snowbridge/pallets/ethereum-client/src/types.rs index 5dcefea9f80f4e201d8de633a7a323f530220a45..8808f989754b240d207101cbeff6fe25fe74279a 100644 --- a/bridges/snowbridge/pallets/ethereum-client/src/types.rs +++ b/bridges/snowbridge/pallets/ethereum-client/src/types.rs @@ -15,17 +15,7 @@ pub type CheckpointUpdate = primitives::CheckpointUpdate; pub type Update = primitives::Update; pub type NextSyncCommitteeUpdate = primitives::NextSyncCommitteeUpdate; -pub use primitives::ExecutionHeaderUpdate; - -/// ExecutionHeader ring buffer implementation -pub type ExecutionHeaderBuffer = RingBufferMapImpl< - u32, - ::MaxExecutionHeadersToKeep, - crate::ExecutionHeaderIndex, - crate::ExecutionHeaderMapping, - crate::ExecutionHeaders, - OptionQuery, ->; +pub use primitives::{AncestryProof, ExecutionProof}; /// FinalizedState ring buffer implementation pub(crate) type FinalizedBeaconStateBuffer = RingBufferMapImpl< diff --git a/bridges/snowbridge/pallets/ethereum-client/src/weights.rs b/bridges/snowbridge/pallets/ethereum-client/src/weights.rs index e1a5578f46615e6a75400631ea7d0cc00a0d90cb..e4629746aa2d9f8afe31e6af037b71a3c6f9b2bb 100644 --- a/bridges/snowbridge/pallets/ethereum-client/src/weights.rs +++ b/bridges/snowbridge/pallets/ethereum-client/src/weights.rs @@ -36,7 +36,6 @@ pub trait WeightInfo { fn force_checkpoint() -> Weight; fn submit() -> Weight; fn submit_with_sync_committee() -> Weight; - fn submit_execution_header() -> Weight; } // For backwards compatibility and tests @@ -59,10 +58,4 @@ impl WeightInfo for () { .saturating_add(RocksDbWeight::get().reads(6)) .saturating_add(RocksDbWeight::get().writes(1)) } - fn submit_execution_header() -> Weight { - Weight::from_parts(113_158_000_u64, 0) - .saturating_add(Weight::from_parts(0, 3537)) - .saturating_add(RocksDbWeight::get().reads(5)) - .saturating_add(RocksDbWeight::get().writes(4)) - } } diff --git a/bridges/snowbridge/pallets/ethereum-client/tests/fixtures/execution-header-update.json b/bridges/snowbridge/pallets/ethereum-client/tests/fixtures/execution-header-update.json deleted file mode 100755 index 319014249c12d9de36ee9e73e08cdeabcd954f63..0000000000000000000000000000000000000000 --- a/bridges/snowbridge/pallets/ethereum-client/tests/fixtures/execution-header-update.json +++ /dev/null @@ -1,54 +0,0 @@ -{ - "header": { - "slot": 215, - "proposer_index": 2, - "parent_root": "0x97518f531a252bb6ca547b21aca9da767943ec99211d3b15c804e34c3a523f45", - "state_root": "0xb088b5a3a8c90d6dc919a695cd7bb0267c6f983ea2e675c559ceb8f46cb90b67", - "body_root": "0x0ba23c8224fdd01531d5ad51486353bd524a0b4c20bca704e26d3210616f829b" - }, - "ancestry_proof": { - "header_branch": [ - "0x97518f531a252bb6ca547b21aca9da767943ec99211d3b15c804e34c3a523f45", - "0x5ce0db996bd499c2b4f7a93263d5aafd052f420efb617cce6fdd54e25516aa45", - "0x84f0e373b66011ce774c7061440c0a50a51cce2b4b335395eee3e563d605597f", - "0x48f9ccc5f9594142c18c3b5c39a99f0549329c6ab3ba06c9a50030eadca87770", - "0xf89d6e311e05bc75a6f63ce118bccce254551f1a88d54c3b4f773f81f946bd99", - "0x2edd6d893c22636675147c07dfcdb541a146e87c3f15b51c388be4868246dc9b", - "0xd76b7de5f856e3208a91a42c9c398a7f4fab35e667bf916346050ae742514a2d", - "0x83a2e233e76385953ca41de4c3afe60471a61f0cc1b3846b4a0670e3e563b747", - "0xe783a5a109c2ad74e4eb53e8f6b11b31266a92a9e16c1fd5873109c5d41b282c", - "0xd4ea1ef3869ee6a0fd0b19d7d70027d144eecd4f1d32cbf47632a0a9069164b9", - "0xf8179564b58eb93a850d35e4156a04db651106442ad891c3e85155c1762792f1", - "0x4cbb1edb48cf1e32fb30db60aaaeaf6190ffe4d0c8dbc96cec307daecb78be12", - "0xb7d05f875f140027ef5118a2247bbb84ce8f2f0f1123623085daf7960c329f5f" - ], - "finalized_block_root": "0x890a7f23b9ed2160901654be9efc575d6830ca860e2a97866ae3423fb7bd7231" - }, - "execution_header": { - "Deneb": { - "parent_hash": "0xd82ec63f5c5e6ba61d62f09c188f158e6449b94bdcc31941e68639eec3c4cf7a", - "fee_recipient": "0x0000000000000000000000000000000000000000", - "state_root": "0x8b65545fe5f3216b47b6339b9c91ca2b7f1032a970b04246d9e9fb4460ee34c3", - "receipts_root": "0x7b1f61b9714c080ef0be014e01657a15f45f0304b477beebc7ca5596c8033095", - "logs_bloom": "0x00000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000080000000000000000000000000000004000000000080000000000000000000000000000000000010100000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000040004000000000000002000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000200000000000010", - "prev_randao": "0x6d9e2a012d82b1b6cb0a2c1c1ed24cc16dbb56e6e39ae545371e0666ab057862", - "block_number": 215, - "gas_limit": 64842908, - "gas_used": 119301, - "timestamp": 1705859527, - "extra_data": "0xd983010d0a846765746888676f312e32312e358664617277696e", - "base_fee_per_gas": 7, - "block_hash": "0x48498dbfbcfae53a7f4c289ee00747aceea925f6260c50ead5a33e1c55c40f98", - "transactions_root": "0x5ebc1347fe3df0611d4f66b19bd8e1c6f4eaed0371d850f14c83b1c77ea234e6", - "withdrawals_root": "0x792930bbd5baac43bcc798ee49aa8185ef76bb3b44ba62b91d86ae569e4bb535", - "blob_gas_used": 0, - "excess_blob_gas": 0 - } - }, - "execution_branch": [ - "0xf8c69d3830406d668619bcccc13c8dddde41e863326f7418b241d5924c4ad34a", - "0xb46f0c01805fe212e15907981b757e6c496b0cb06664224655613dcec82505bb", - "0xdb56114e00fdd4c1f85c892bf35ac9a89289aaecb1ebd0a96cde606a748b5d71", - "0xf4d6b5cf9c6e212615c3674fa625d04eb1114153fb221ef5ad02aa433fc67cfb" - ] -} \ No newline at end of file diff --git a/bridges/snowbridge/pallets/ethereum-client/tests/fixtures/execution-proof.json b/bridges/snowbridge/pallets/ethereum-client/tests/fixtures/execution-proof.json new file mode 100755 index 0000000000000000000000000000000000000000..f55898087dfec122d84f699ee75cfe9aadbb4d6d --- /dev/null +++ b/bridges/snowbridge/pallets/ethereum-client/tests/fixtures/execution-proof.json @@ -0,0 +1,54 @@ +{ + "header": { + "slot": 393, + "proposer_index": 4, + "parent_root": "0x6545b47a614a1dd4cad042a0cdbbf5be347e8ffcdc02c6c64540d5153acebeef", + "state_root": "0xb62ac34a8cb82497be9542fe2114410c9f6021855b766015406101a1f3d86434", + "body_root": "0x04005fe231e11a5b7b1580cb73b177ae8b338bedd745497e6bb7122126a806db" + }, + "ancestry_proof": { + "header_branch": [ + "0x6545b47a614a1dd4cad042a0cdbbf5be347e8ffcdc02c6c64540d5153acebeef", + "0xfa84cc88ca53a72181599ff4eb07d8b444bce023fe2347c3b4f51004c43439d3", + "0xcadc8ae211c6f2221c9138e829249adf902419c78eb4727a150baa4d9a02cc9d", + "0x33a89962df08a35c52bd7e1d887cd71fa7803e68787d05c714036f6edf75947c", + "0x2c9760fce5c2829ef3f25595a703c21eb22d0186ce223295556ed5da663a82cf", + "0xe1aa87654db79c8a0ecd6c89726bb662fcb1684badaef5cd5256f479e3c622e1", + "0xaa70d5f314e4a1fbb9c362f3db79b21bf68b328887248651fbd29fc501d0ca97", + "0x160b6c235b3a1ed4ef5f80b03ee1c76f7bf3f591c92fca9d8663e9221b9f9f0f", + "0xf68d7dcd6a07a18e9de7b5d2aa1980eb962e11d7dcb584c96e81a7635c8d2535", + "0x1d5f912dfd6697110dd1ecb5cb8e77952eef57d85deb373572572df62bb157fc", + "0xffff0ad7e659772f9534c195c815efc4014ef1e1daed4404c06385d11192e92b", + "0x6cf04127db05441cd833107a52be852868890e4317e6a02ab47683aa75964220", + "0xb7d05f875f140027ef5118a2247bbb84ce8f2f0f1123623085daf7960c329f5f" + ], + "finalized_block_root": "0x751414cd97c0624f922b3e80285e9f776b08fa22fd5f87391f2ed7ef571a8d46" + }, + "execution_header": { + "Deneb": { + "parent_hash": "0x8092290aa21b7751576440f77edd02a94058429ce50e63a92d620951fb25eda2", + "fee_recipient": "0x0000000000000000000000000000000000000000", + "state_root": "0x96a83e9ddf745346fafcb0b03d57314623df669ed543c110662b21302a0fae8b", + "receipts_root": "0xdccdfceea05036f7b61dcdabadc937945d31e68a8d3dfd4dc85684457988c284", + "logs_bloom": "0x00000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000080000000400000000000000000000004000000000080000000000000000000000000000000000010100000000000000000000000000000000020000000000000000000000000000000000080000000000000000000000000000040004000000000000002002002000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000080000000000000000000000000000000000100000000000000000200000200000010", + "prev_randao": "0x62e309d4f5119d1f5c783abc20fc1a549efbab546d8d0b25ff1cfd58be524e67", + "block_number": 393, + "gas_limit": 54492273, + "gas_used": 199644, + "timestamp": 1710552813, + "extra_data": "0xd983010d0b846765746888676f312e32312e368664617277696e", + "base_fee_per_gas": 7, + "block_hash": "0x6a9810efb9581d30c1a5c9074f27c68ea779a8c1ae31c213241df16225f4e131", + "transactions_root": "0x2cfa6ed7327e8807c7973516c5c32a68ef2459e586e8067e113d081c3bd8c07d", + "withdrawals_root": "0x792930bbd5baac43bcc798ee49aa8185ef76bb3b44ba62b91d86ae569e4bb535", + "blob_gas_used": 0, + "excess_blob_gas": 0 + } + }, + "execution_branch": [ + "0xa6833fa629f3286b6916c6e50b8bf089fc9126bee6f64d0413b4e59c1265834d", + "0xb46f0c01805fe212e15907981b757e6c496b0cb06664224655613dcec82505bb", + "0xdb56114e00fdd4c1f85c892bf35ac9a89289aaecb1ebd0a96cde606a748b5d71", + "0xd3af7c05c516726be7505239e0b9c7cb53d24abce6b91cdb3b3995f0164a75da" + ] +} \ No newline at end of file diff --git a/bridges/snowbridge/pallets/ethereum-client/tests/fixtures/finalized-header-update.json b/bridges/snowbridge/pallets/ethereum-client/tests/fixtures/finalized-header-update.json index f9d5324d57b15fc657876b46bbf4a8e716d4c30c..2dec5cc56fac60b924053573f5962c02b487b24b 100755 --- a/bridges/snowbridge/pallets/ethereum-client/tests/fixtures/finalized-header-update.json +++ b/bridges/snowbridge/pallets/ethereum-client/tests/fixtures/finalized-header-update.json @@ -1,38 +1,40 @@ { "attested_header": { - "slot": 2566, - "proposer_index": 6, - "parent_root": "0x6eb9f13a2c496318ce1ab3087bbd872f5c9519a1a7ca8231a2453e3cb523af00", - "state_root": "0xc8cb12766113dff7e46d2917267bf33d0626d99dd47715fcdbc5c65fad3c04b4", - "body_root": "0xd8cfd0d7bc9bc3724417a1655bb0a67c0765ca36197320f4d834150b52ef1420" + "slot": 933, + "proposer_index": 1, + "parent_root": "0xf5fc63e2780ca302b97aea73fc95d74d702b5afe9a772c2b68f695026337b620", + "state_root": "0xd856d11636bc4d866e78be9e747b222b0977556a367ab42e4085277301438050", + "body_root": "0x5689091ab4eb76c2e876271add4924e1c66ce987c300c24aac2ad8c703e9a33f" }, "sync_aggregate": { "sync_committee_bits": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", - "sync_committee_signature": "0x9296f9a0387f2cac47008e22ad7c3cd3d49d35384c13e6aa1eacca7dca7c3d2ca81515e50eb3396b9550ed20ef7d8fa2049a186598feb2c00e93728045fcff917733d1827481b8fc95f3913e27fc70112c2490496eb57bb7181f02c3f9fd471f" + "sync_committee_signature": "0x93a3d482fe2a2f7fd2b634169752a8fddf1dc28b23a020b398be8526faf37a74ca0f6db1bed78a9c7256c09a6115235e108e0e8a7ce09287317b0856c4b77dfa5adba6cf4c3ebea5bfa4cd2fcde80fd0a532f2defe65d530201d5d2258796559" }, - "signature_slot": 2567, + "signature_slot": 934, "next_sync_committee_update": null, "finalized_header": { - "slot": 2496, - "proposer_index": 2, - "parent_root": "0xc99e49787106733eeebab4d93eb326e1f2214575c9d928f0c4ab0da0776f1622", - "state_root": "0xfbf8a08c86ef36bd173e37e733da4a78aa8e85fee99a990e858dd12a59087fde", - "body_root": "0xa2a8ad06901447b2807a9059580a4c40d8a941f325b1343c69f7c7c6c90e4ab0" + "slot": 864, + "proposer_index": 4, + "parent_root": "0x614e7672f991ac268cd841055973f55e1e42228831a211adef207bb7329be614", + "state_root": "0x5fa8dfca3d760e4242ab46d529144627aa85348a19173b6e081172c701197a4a", + "body_root": "0x0f34c083b1803666bb1ac5e73fa71582731a2cf37d279ff0a3b0cad5a2ff371e" }, "finality_branch": [ - "0x4e00000000000000000000000000000000000000000000000000000000000000", + "0x1b00000000000000000000000000000000000000000000000000000000000000", "0x10c726fac935bf9657cc7476d3cfa7bedec5983dcfb59e8a7df6d0a619e108d7", "0x98e9116c6bb7f20de18800dc63e73e689d06d6a47d35b5e2b32cf093d475840d", - "0x958b8e43347f6df6fa5eb3d62d06a862381a6585aa40640dd1c0de11f1cf89c1", - "0xf107dce04faa86a28fc5d4a618be9cb8d4fc3c23d6c42c3624f3ff4bf6586a03", - "0xa501cdc02e86969ac3e4d0c5a36f4f049efaa1ab8cb6693f51d130eb52a80f30" + "0xf12d9aededc72724e417b518fe6f847684f26f81616243dedf8c551cc7d504f5", + "0x89a85d0907ab3fd6e00ae385f61d456c6191646404ae7b8d23d0e60440cf4d00", + "0x9fc943b6020eb61d780d78bcc6f6102a81d2c868d58f36e61c6e286a2dc4d8c2" ], - "block_roots_root": "0xd160b7687041891b73e54b06fc4e04f82d0fa8fdd76705895e216c6b24709dfe", + "block_roots_root": "0xb9aab9c388c4e4fcd899b71f62c498fc73406e38e8eb14aa440e9affa06f2a10", "block_roots_branch": [ - "0x105290e42d98ab6a0ada6e55453cede36c672abf645eeb986b88d7487616e135", - "0x9da41f274bcdf6122335443d9ce94d07163b48dba3e2f9499ff56f4e48b48b99", - "0xecea7e1d3152d8130e83afdfe34b4de4ba2b69a33c9471991096daf454de9cf5", - "0xb2bf1758e50b2bfff29169fbc70fdb884b2b05bb615dbc53567574da6f4f1ae2", - "0xcd87069daf70975779126d6af833b7d636c75ca4d5e750ebcad0e76408a5e5bf" - ] + "0x733422bd810895dab74cbbe07c69dd440cbb51f573181ad4dddac30fcdd0f41f", + "0x9b9eca73ab01d14549c325ba1b4610bb20bf1f8ec2dbd649f9d8cc7f3cea75fa", + "0xbcc666ad0ad9f9725cbd682bc95589d35b1b53b2a615f1e6e8dd5e086336becf", + "0x3069b547a08f703a1715016e926cbd64e71f93f64fb68d98d8c8f1ab745c46e5", + "0xc2de7e1097239404e17b263cfa0473533cc41e903cb03440d633bc5c27314cb4" + ], + "execution_header": null, + "execution_branch": null } \ No newline at end of file diff --git a/bridges/snowbridge/pallets/ethereum-client/tests/fixtures/inbound-message.json b/bridges/snowbridge/pallets/ethereum-client/tests/fixtures/inbound-message.json index 5aa5a59f023761e248fd23ec3b29de19092e5e90..6589dca5fb456549d201b00402b2b2fa375d7b49 100644 --- a/bridges/snowbridge/pallets/ethereum-client/tests/fixtures/inbound-message.json +++ b/bridges/snowbridge/pallets/ethereum-client/tests/fixtures/inbound-message.json @@ -1,31 +1,79 @@ { - "execution_header": { - "parent_hash": "0xd82ec63f5c5e6ba61d62f09c188f158e6449b94bdcc31941e68639eec3c4cf7a", - "state_root": "0x8b65545fe5f3216b47b6339b9c91ca2b7f1032a970b04246d9e9fb4460ee34c3", - "receipts_root": "0x7b1f61b9714c080ef0be014e01657a15f45f0304b477beebc7ca5596c8033095", - "block_number": 215 + "event_log": { + "address": "0xeda338e4dc46038493b885327842fd3e301cab39", + "topics": [ + "0x7153f9357c8ea496bba60bf82e67143e27b64462b49041f8e689e1b05728f84f", + "0xc173fac324158e77fb5840738a1a541f633cbec8884c6a601c567d2b376a0539", + "0x5f7060e971b0dc81e63f0aa41831091847d97c1a4693ac450cc128c7214e65e0" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000002e00a736aa00000000000087d1f7fdfee7f651fabc8bfcb6e086c278b77a7d00e40b54020000000000000000000000000000000000000000000000000000000000" }, - "message": { - "event_log": { - "address": "0xeda338e4dc46038493b885327842fd3e301cab39", - "topics": [ - "0x7153f9357c8ea496bba60bf82e67143e27b64462b49041f8e689e1b05728f84f", - "0xc173fac324158e77fb5840738a1a541f633cbec8884c6a601c567d2b376a0539", - "0x5f7060e971b0dc81e63f0aa41831091847d97c1a4693ac450cc128c7214e65e0" + "proof": { + "block_hash": "0x6a9810efb9581d30c1a5c9074f27c68ea779a8c1ae31c213241df16225f4e131", + "tx_index": 0, + "receipt_proof": { + "keys": [ + "0xdccdfceea05036f7b61dcdabadc937945d31e68a8d3dfd4dc85684457988c284", + "0x4a98e45a319168b0fc6005ce6b744ee9bf54338e2c0784b976a8578d241ced0f" ], - "data": "0x00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000002e00a736aa00000000000087d1f7fdfee7f651fabc8bfcb6e086c278b77a7d00e40b54020000000000000000000000000000000000000000000000000000000000" + "values": [ + "0xf851a09c01dd6d2d8de951c45af23d3ad00829ce021c04d6c8acbe1612d456ee320d4980808080808080a04a98e45a319168b0fc6005ce6b744ee9bf54338e2c0784b976a8578d241ced0f8080808080808080", + "0xf9028c30b9028802f90284018301d205b9010000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000080000000000000000000000000000004000000000080000000000000000000000000000000000010100000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000040004000000000000002000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000200000000000010f90179f85894eda338e4dc46038493b885327842fd3e301cab39e1a0f78bb28d4b1d7da699e5c0bc2be29c2b04b5aab6aacf6298fe5304f9db9c6d7ea000000000000000000000000087d1f7fdfee7f651fabc8bfcb6e086c278b77a7df9011c94eda338e4dc46038493b885327842fd3e301cab39f863a07153f9357c8ea496bba60bf82e67143e27b64462b49041f8e689e1b05728f84fa0c173fac324158e77fb5840738a1a541f633cbec8884c6a601c567d2b376a0539a05f7060e971b0dc81e63f0aa41831091847d97c1a4693ac450cc128c7214e65e0b8a000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000002e00a736aa00000000000087d1f7fdfee7f651fabc8bfcb6e086c278b77a7d00e40b54020000000000000000000000000000000000000000000000000000000000" + ] }, - "Proof": { - "block_hash": "0x48498dbfbcfae53a7f4c289ee00747aceea925f6260c50ead5a33e1c55c40f98", - "tx_index": 0, - "data": { - "keys": [ - "0x7b1f61b9714c080ef0be014e01657a15f45f0304b477beebc7ca5596c8033095" + "execution_proof": { + "header": { + "slot": 393, + "proposer_index": 4, + "parent_root": "0x6545b47a614a1dd4cad042a0cdbbf5be347e8ffcdc02c6c64540d5153acebeef", + "state_root": "0xb62ac34a8cb82497be9542fe2114410c9f6021855b766015406101a1f3d86434", + "body_root": "0x04005fe231e11a5b7b1580cb73b177ae8b338bedd745497e6bb7122126a806db" + }, + "ancestry_proof": { + "header_branch": [ + "0x6545b47a614a1dd4cad042a0cdbbf5be347e8ffcdc02c6c64540d5153acebeef", + "0xfa84cc88ca53a72181599ff4eb07d8b444bce023fe2347c3b4f51004c43439d3", + "0xcadc8ae211c6f2221c9138e829249adf902419c78eb4727a150baa4d9a02cc9d", + "0x33a89962df08a35c52bd7e1d887cd71fa7803e68787d05c714036f6edf75947c", + "0x2c9760fce5c2829ef3f25595a703c21eb22d0186ce223295556ed5da663a82cf", + "0xe1aa87654db79c8a0ecd6c89726bb662fcb1684badaef5cd5256f479e3c622e1", + "0xaa70d5f314e4a1fbb9c362f3db79b21bf68b328887248651fbd29fc501d0ca97", + "0x160b6c235b3a1ed4ef5f80b03ee1c76f7bf3f591c92fca9d8663e9221b9f9f0f", + "0xf68d7dcd6a07a18e9de7b5d2aa1980eb962e11d7dcb584c96e81a7635c8d2535", + "0x1d5f912dfd6697110dd1ecb5cb8e77952eef57d85deb373572572df62bb157fc", + "0xffff0ad7e659772f9534c195c815efc4014ef1e1daed4404c06385d11192e92b", + "0x6cf04127db05441cd833107a52be852868890e4317e6a02ab47683aa75964220", + "0xb7d05f875f140027ef5118a2247bbb84ce8f2f0f1123623085daf7960c329f5f" ], - "values": [ - "0xf9028e822080b9028802f90284018301d205b9010000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000080000000000000000000000000000004000000000080000000000000000000000000000000000010100000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000040004000000000000002000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000200000000000010f90179f85894eda338e4dc46038493b885327842fd3e301cab39e1a0f78bb28d4b1d7da699e5c0bc2be29c2b04b5aab6aacf6298fe5304f9db9c6d7ea000000000000000000000000087d1f7fdfee7f651fabc8bfcb6e086c278b77a7df9011c94eda338e4dc46038493b885327842fd3e301cab39f863a07153f9357c8ea496bba60bf82e67143e27b64462b49041f8e689e1b05728f84fa0c173fac324158e77fb5840738a1a541f633cbec8884c6a601c567d2b376a0539a05f7060e971b0dc81e63f0aa41831091847d97c1a4693ac450cc128c7214e65e0b8a000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000002e00a736aa00000000000087d1f7fdfee7f651fabc8bfcb6e086c278b77a7d00e40b54020000000000000000000000000000000000000000000000000000000000" - ] - } + "finalized_block_root": "0x751414cd97c0624f922b3e80285e9f776b08fa22fd5f87391f2ed7ef571a8d46" + }, + "execution_header": { + "Deneb": { + "parent_hash": "0x8092290aa21b7751576440f77edd02a94058429ce50e63a92d620951fb25eda2", + "fee_recipient": "0x0000000000000000000000000000000000000000", + "state_root": "0x96a83e9ddf745346fafcb0b03d57314623df669ed543c110662b21302a0fae8b", + "receipts_root": "0xdccdfceea05036f7b61dcdabadc937945d31e68a8d3dfd4dc85684457988c284", + "logs_bloom": "0x00000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000080000000400000000000000000000004000000000080000000000000000000000000000000000010100000000000000000000000000000000020000000000000000000000000000000000080000000000000000000000000000040004000000000000002002002000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000080000000000000000000000000000000000100000000000000000200000200000010", + "prev_randao": "0x62e309d4f5119d1f5c783abc20fc1a549efbab546d8d0b25ff1cfd58be524e67", + "block_number": 393, + "gas_limit": 54492273, + "gas_used": 199644, + "timestamp": 1710552813, + "extra_data": "0xd983010d0b846765746888676f312e32312e368664617277696e", + "base_fee_per_gas": 7, + "block_hash": "0x6a9810efb9581d30c1a5c9074f27c68ea779a8c1ae31c213241df16225f4e131", + "transactions_root": "0x2cfa6ed7327e8807c7973516c5c32a68ef2459e586e8067e113d081c3bd8c07d", + "withdrawals_root": "0x792930bbd5baac43bcc798ee49aa8185ef76bb3b44ba62b91d86ae569e4bb535", + "blob_gas_used": 0, + "excess_blob_gas": 0 + } + }, + "execution_branch": [ + "0xa6833fa629f3286b6916c6e50b8bf089fc9126bee6f64d0413b4e59c1265834d", + "0xb46f0c01805fe212e15907981b757e6c496b0cb06664224655613dcec82505bb", + "0xdb56114e00fdd4c1f85c892bf35ac9a89289aaecb1ebd0a96cde606a748b5d71", + "0xd3af7c05c516726be7505239e0b9c7cb53d24abce6b91cdb3b3995f0164a75da" + ] } } } \ No newline at end of file diff --git a/bridges/snowbridge/pallets/ethereum-client/tests/fixtures/initial-checkpoint.json b/bridges/snowbridge/pallets/ethereum-client/tests/fixtures/initial-checkpoint.json index 202790c1db5b53068c7aedf561dc7972cb863f00..a62d646617e49ee11c1d68e401069c5bdf4368be 100755 --- a/bridges/snowbridge/pallets/ethereum-client/tests/fixtures/initial-checkpoint.json +++ b/bridges/snowbridge/pallets/ethereum-client/tests/fixtures/initial-checkpoint.json @@ -1,10 +1,10 @@ { "header": { - "slot": 2496, - "proposer_index": 2, - "parent_root": "0xc99e49787106733eeebab4d93eb326e1f2214575c9d928f0c4ab0da0776f1622", - "state_root": "0xfbf8a08c86ef36bd173e37e733da4a78aa8e85fee99a990e858dd12a59087fde", - "body_root": "0xa2a8ad06901447b2807a9059580a4c40d8a941f325b1343c69f7c7c6c90e4ab0" + "slot": 864, + "proposer_index": 4, + "parent_root": "0x614e7672f991ac268cd841055973f55e1e42228831a211adef207bb7329be614", + "state_root": "0x5fa8dfca3d760e4242ab46d529144627aa85348a19173b6e081172c701197a4a", + "body_root": "0x0f34c083b1803666bb1ac5e73fa71582731a2cf37d279ff0a3b0cad5a2ff371e" }, "current_sync_committee": { "pubkeys": [ @@ -525,18 +525,18 @@ }, "current_sync_committee_branch": [ "0x3ade38d498a062b50880a9409e1ca3a7fd4315d91eeb3bb83e56ac6bfe8d6a59", - "0x93880225bf99a0c5ec22b266ff829837754e9c5edf37a68c05b8f803fd82fa45", - "0x4c60656ec9a95fcf11030ad309c716b5b15beb7f60a0bcfc7c9d4eff505472ff", - "0x22d1645fceb4bf9a695043dda19a53e784ec70df6a6b1bd66ea30eba1cca5f2f", - "0xa8fc6cad84ceefc633ec56c2d031d525e1cb4b51c70eb252919fce5bba9a1fde" + "0xa9e90f89e7f90fd5d79a6bbcaf40ba5cfc05ab1b561ac51c84867c32248d5b1e", + "0xbd1a76b03e02402bb24a627de1980a80ab17691980271f597b844b89b497ef75", + "0x07bbcd27c7cad089023db046eda17e8209842b7d97add8b873519e84fe6480e7", + "0x94c11eeee4cb6192bf40810f23486d8c75dfbc2b6f28d988d6f74435ede243b0" ], "validators_root": "0x270d43e74ce340de4bca2b1936beca0f4f5408d9e78aec4850920baf659d5b69", - "block_roots_root": "0xd160b7687041891b73e54b06fc4e04f82d0fa8fdd76705895e216c6b24709dfe", + "block_roots_root": "0xb9aab9c388c4e4fcd899b71f62c498fc73406e38e8eb14aa440e9affa06f2a10", "block_roots_branch": [ - "0x105290e42d98ab6a0ada6e55453cede36c672abf645eeb986b88d7487616e135", - "0x9da41f274bcdf6122335443d9ce94d07163b48dba3e2f9499ff56f4e48b48b99", - "0xecea7e1d3152d8130e83afdfe34b4de4ba2b69a33c9471991096daf454de9cf5", - "0xb2bf1758e50b2bfff29169fbc70fdb884b2b05bb615dbc53567574da6f4f1ae2", - "0xcd87069daf70975779126d6af833b7d636c75ca4d5e750ebcad0e76408a5e5bf" + "0x733422bd810895dab74cbbe07c69dd440cbb51f573181ad4dddac30fcdd0f41f", + "0x9b9eca73ab01d14549c325ba1b4610bb20bf1f8ec2dbd649f9d8cc7f3cea75fa", + "0xbcc666ad0ad9f9725cbd682bc95589d35b1b53b2a615f1e6e8dd5e086336becf", + "0x3069b547a08f703a1715016e926cbd64e71f93f64fb68d98d8c8f1ab745c46e5", + "0xc2de7e1097239404e17b263cfa0473533cc41e903cb03440d633bc5c27314cb4" ] } \ No newline at end of file diff --git a/bridges/snowbridge/pallets/ethereum-client/tests/fixtures/sync-committee-update.json b/bridges/snowbridge/pallets/ethereum-client/tests/fixtures/sync-committee-update.json index 6bf20355c7a34ea3b1a9949f39cabc363a029590..4d601d7d8f0bbc0a3eda4d3afa927c076f290301 100755 --- a/bridges/snowbridge/pallets/ethereum-client/tests/fixtures/sync-committee-update.json +++ b/bridges/snowbridge/pallets/ethereum-client/tests/fixtures/sync-committee-update.json @@ -2,13 +2,13 @@ "attested_header": { "slot": 129, "proposer_index": 5, - "parent_root": "0xe32b6c18f029e755b0273dc1c4fa2bc4979794c8286ad40276c1b8a8e36049d8", - "state_root": "0x5ec9dacf25a5f09f20be0c59246b3d8dcfe64bd085b4bac5cec180690339801e", - "body_root": "0x4080cf2412d6ff77fc3164ad6155423a7112f207f173145ec16371a93f481f87" + "parent_root": "0xc2def03fe44a2802130ca1a6d8406e4ccf4f344fec7075d4d84431cd4a8b0904", + "state_root": "0xfa62cde6666add7353d7aedcb61ebe3c6c84b5361e34f814825b1250affb5be4", + "body_root": "0x0f9c69f243fe7b5fa5860396c66c720a9e8b1e526e7914188930497cc4a9134c" }, "sync_aggregate": { "sync_committee_bits": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", - "sync_committee_signature": "0xa761c3333fbb3d36bc8f65454f898da38001499dcd37494cf3d86940a995399ae649216ba4c985af154f83f72c8b1856079b7636a7a8d7d3f7602df2cbf699edb72b65253e82de4d9cc4db7377eafb22f799129f63f094a21c00675bdd5cc243" + "sync_committee_signature": "0x810cfde2afea3e276256c09bdf1cd321c33dcadeefddcfd24f488e6f756d917cfda90b5b437b3a4b4ef880985afa28a40cf565ec0a82877ddee36adc01d55d9d4a911ae3e22556e4c2636f1c707366fba019fb49450440fcd263d0b054b04bf0" }, "signature_slot": 130, "next_sync_committee_update": { @@ -531,33 +531,35 @@ }, "next_sync_committee_branch": [ "0x3ade38d498a062b50880a9409e1ca3a7fd4315d91eeb3bb83e56ac6bfe8d6a59", - "0xfd1e5ff5d4a15081efe3ff17857b1f95984c9a271b1c41c2f81f43e60c2cc541", - "0xe1c97f93bb7352d395d1ff8ee29881572cb7eb5d71634783701171dcd30cd93d", - "0x77fa2170ddbd89b15dae02f2e6cf9f76c8e00d1c4217320acffbe01576d0da61", - "0xe97288e0627219087a024078d69445f34f0583a6350a7c3c40c39fd1fa6f8d68" + "0x43276bee17fc9fba3f4866e902f0e5b5b308d79db91154bb8bf819973837a7d9", + "0x5572348e13ce59446ca0ea7cfeed07579da05f121920a76559e19bda94dd81cd", + "0x2d58adca9f3c742530de037f1933d6de1920ea4b68581613d4bc32b71547f221", + "0x7072b3c6577cd5a89b3234968f316f54630bb97eafbdb59e5b61637a9640255f" ] }, "finalized_header": { "slot": 64, "proposer_index": 4, - "parent_root": "0x0f7bc2353778c14c7f6dba0fc5fe6eec87228b0d3a5447b61dce67b4d9338de3", - "state_root": "0xfeb990de653ce494c0a263f820eaf05a9300dbdc30cb6065ede602827bfccde4", - "body_root": "0xf5235cd8c24f2695fc5b7989926305c10ad8cf5a87d62a739f675f5543df2ec1" + "parent_root": "0xa876486aaad7ddb897f369fd22d0a9903cd61d00c9e0dfe7998dd68d1008c678", + "state_root": "0x818e21c3388575f8ccc9ff17ec79d5a57915bcd31bccf47770f65a18e068416b", + "body_root": "0x1d1f73b864b3bb7e11ff91b56ca1381e0f9ca8122b2c542db88243604c763019" }, "finality_branch": [ "0x0200000000000000000000000000000000000000000000000000000000000000", "0x10c726fac935bf9657cc7476d3cfa7bedec5983dcfb59e8a7df6d0a619e108d7", "0x98e9116c6bb7f20de18800dc63e73e689d06d6a47d35b5e2b32cf093d475840d", - "0xe1c97f93bb7352d395d1ff8ee29881572cb7eb5d71634783701171dcd30cd93d", - "0x77fa2170ddbd89b15dae02f2e6cf9f76c8e00d1c4217320acffbe01576d0da61", - "0xe97288e0627219087a024078d69445f34f0583a6350a7c3c40c39fd1fa6f8d68" + "0x5572348e13ce59446ca0ea7cfeed07579da05f121920a76559e19bda94dd81cd", + "0x2d58adca9f3c742530de037f1933d6de1920ea4b68581613d4bc32b71547f221", + "0x7072b3c6577cd5a89b3234968f316f54630bb97eafbdb59e5b61637a9640255f" ], - "block_roots_root": "0x6fcdfd1c3fb1bdd421fe59dddfff3855b5ed5e30373887991a0059d019ad12bc", + "block_roots_root": "0x715b08694bef183a6d94b3113d16a7129f89fc3edec85a7e0eaf6ef9153552ef", "block_roots_branch": [ - "0x94b59531f172bc24f914bc0c10104ccb158676850f8cc3b47b6ddb7f096ebdd7", - "0x22470ed9155a938587d44d5fa19217c0f939d8862e504e67cd8cb4d1b960795e", - "0xfeec3ef1a68f93849e71e84f90b99602cccc31868137b6887ca8244a4b979e8e", + "0x4028c72c71b6ce80ea7d18b2c9471f4e4fa39746261a9921e832a4a2f9bdf7bb", + "0x75f98062661785d3290b7bd998b64446582baa49210733fd4603e1a97cd45a44", + "0x6fb757f44052f30c464810f01b0132adfa1a5446d8715b41e9af88eee1ee3e65", "0x5340ad5877c72dca689ca04bc8fedb78d67a4801d99887937edd8ccd29f87e82", - "0xf5ff4b0c6190005015889879568f5f0d9c40134c7ec4ffdda47950dcd92395ad" - ] + "0xf2b3cb56753939a728ccad399a434ca490f018f2f331529ec0d8b2d59c509271" + ], + "execution_header": null, + "execution_branch": null } \ No newline at end of file diff --git a/bridges/snowbridge/pallets/inbound-queue/Cargo.toml b/bridges/snowbridge/pallets/inbound-queue/Cargo.toml index 1081b162ddaec58037863a65028db4dffd03b438..71d49e684e0b9379778f45743f6427a41796fd8a 100644 --- a/bridges/snowbridge/pallets/inbound-queue/Cargo.toml +++ b/bridges/snowbridge/pallets/inbound-queue/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "snowbridge-pallet-inbound-queue" description = "Snowbridge Inbound Queue Pallet" -version = "0.0.0" +version = "0.2.0" authors = ["Snowfork "] edition.workspace = true repository.workspace = true @@ -15,15 +15,13 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -serde = { version = "1.0.195", optional = true } +serde = { optional = true, workspace = true, default-features = true } codec = { version = "3.6.1", package = "parity-scale-codec", default-features = false, features = ["derive"] } scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } hex-literal = { version = "0.4.1", optional = true } -log = { version = "0.4.20", default-features = false } +log = { workspace = true } alloy-primitives = { version = "0.4.2", default-features = false, features = ["rlp"] } alloy-sol-types = { version = "0.4.2", default-features = false } -alloy-rlp = { version = "0.3.3", default-features = false, features = ["derive"] } -num-traits = { version = "0.2.16", default-features = false } frame-benchmarking = { path = "../../../../substrate/frame/benchmarking", default-features = false, optional = true } frame-support = { path = "../../../../substrate/frame/support", default-features = false } @@ -35,14 +33,12 @@ sp-io = { path = "../../../../substrate/primitives/io", default-features = false sp-runtime = { path = "../../../../substrate/primitives/runtime", default-features = false } xcm = { package = "staging-xcm", path = "../../../../polkadot/xcm", default-features = false } -xcm-builder = { package = "staging-xcm-builder", path = "../../../../polkadot/xcm/xcm-builder", default-features = false } xcm-executor = { package = "staging-xcm-executor", path = "../../../../polkadot/xcm/xcm-executor", default-features = false } snowbridge-core = { path = "../../primitives/core", default-features = false } -snowbridge-ethereum = { path = "../../primitives/ethereum", default-features = false } snowbridge-router-primitives = { path = "../../primitives/router", default-features = false } snowbridge-beacon-primitives = { path = "../../primitives/beacon", default-features = false } -snowbridge-pallet-inbound-queue-fixtures = { path = "./fixtures", default-features = false, optional = true } +snowbridge-pallet-inbound-queue-fixtures = { path = "fixtures", default-features = false, optional = true } [dev-dependencies] frame-benchmarking = { path = "../../../../substrate/frame/benchmarking" } @@ -54,27 +50,23 @@ hex-literal = { version = "0.4.1" } default = ["std"] std = [ "alloy-primitives/std", - "alloy-rlp/std", "alloy-sol-types/std", "codec/std", "frame-benchmarking/std", "frame-support/std", "frame-system/std", "log/std", - "num-traits/std", "pallet-balances/std", "scale-info/std", "serde", "snowbridge-beacon-primitives/std", "snowbridge-core/std", - "snowbridge-ethereum/std", "snowbridge-pallet-inbound-queue-fixtures?/std", "snowbridge-router-primitives/std", "sp-core/std", "sp-io/std", "sp-runtime/std", "sp-std/std", - "xcm-builder/std", "xcm-executor/std", "xcm/std", ] @@ -90,7 +82,6 @@ runtime-benchmarks = [ "snowbridge-pallet-inbound-queue-fixtures/runtime-benchmarks", "snowbridge-router-primitives/runtime-benchmarks", "sp-runtime/runtime-benchmarks", - "xcm-builder/runtime-benchmarks", "xcm-executor/runtime-benchmarks", ] try-runtime = [ diff --git a/bridges/snowbridge/pallets/inbound-queue/fixtures/Cargo.toml b/bridges/snowbridge/pallets/inbound-queue/fixtures/Cargo.toml index 61f1421e056773c4f078390f9c48f7b8fa0420d3..e84246fb5a551b2512c4e00cb4ca00171e8c3f75 100644 --- a/bridges/snowbridge/pallets/inbound-queue/fixtures/Cargo.toml +++ b/bridges/snowbridge/pallets/inbound-queue/fixtures/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "snowbridge-pallet-inbound-queue-fixtures" description = "Snowbridge Inbound Queue Test Fixtures" -version = "0.9.0" +version = "0.10.0" authors = ["Snowfork "] edition.workspace = true repository.workspace = true @@ -18,27 +18,17 @@ targets = ["x86_64-unknown-linux-gnu"] hex-literal = { version = "0.4.1" } sp-core = { path = "../../../../../substrate/primitives/core", default-features = false } sp-std = { path = "../../../../../substrate/primitives/std", default-features = false } -frame-benchmarking = { path = "../../../../../substrate/frame/benchmarking", default-features = false, optional = true } -frame-support = { path = "../../../../../substrate/frame/support", default-features = false } -frame-system = { path = "../../../../../substrate/frame/system", default-features = false } snowbridge-core = { path = "../../../primitives/core", default-features = false } snowbridge-beacon-primitives = { path = "../../../primitives/beacon", default-features = false } [features] default = ["std"] std = [ - "frame-benchmarking/std", - "frame-support/std", - "frame-system/std", "snowbridge-beacon-primitives/std", "snowbridge-core/std", "sp-core/std", "sp-std/std", ] runtime-benchmarks = [ - "frame-benchmarking", - "frame-benchmarking/runtime-benchmarks", - "frame-support/runtime-benchmarks", - "frame-system/runtime-benchmarks", "snowbridge-core/runtime-benchmarks", ] diff --git a/bridges/snowbridge/pallets/inbound-queue/fixtures/src/lib.rs b/bridges/snowbridge/pallets/inbound-queue/fixtures/src/lib.rs index 4f3445b2905364147d3974988fee0fad2f387d07..00adcdfa186adc755273b9753d833a6bdbec5b56 100644 --- a/bridges/snowbridge/pallets/inbound-queue/fixtures/src/lib.rs +++ b/bridges/snowbridge/pallets/inbound-queue/fixtures/src/lib.rs @@ -2,17 +2,6 @@ // SPDX-FileCopyrightText: 2023 Snowfork #![cfg_attr(not(feature = "std"), no_std)] -use snowbridge_beacon_primitives::CompactExecutionHeader; -use snowbridge_core::inbound::Message; -use sp_core::RuntimeDebug; - pub mod register_token; -pub mod register_token_with_insufficient_fee; pub mod send_token; pub mod send_token_to_penpal; - -#[derive(Clone, RuntimeDebug)] -pub struct InboundQueueFixture { - pub execution_header: CompactExecutionHeader, - pub message: Message, -} diff --git a/bridges/snowbridge/pallets/inbound-queue/fixtures/src/register_token.rs b/bridges/snowbridge/pallets/inbound-queue/fixtures/src/register_token.rs index b8d510e6b13d02420191591ff917eb0366f818d6..340b2fadfacfd9bdb0c291323cbd69cd71c00b7c 100644 --- a/bridges/snowbridge/pallets/inbound-queue/fixtures/src/register_token.rs +++ b/bridges/snowbridge/pallets/inbound-queue/fixtures/src/register_token.rs @@ -3,20 +3,16 @@ // Generated, do not edit! // See ethereum client README.md for instructions to generate -use crate::InboundQueueFixture; use hex_literal::hex; -use snowbridge_beacon_primitives::CompactExecutionHeader; -use snowbridge_core::inbound::{Log, Message, Proof}; +use snowbridge_beacon_primitives::{ + types::deneb, AncestryProof, BeaconHeader, ExecutionProof, VersionedExecutionPayloadHeader, +}; +use snowbridge_core::inbound::{InboundQueueFixture, Log, Message, Proof}; +use sp_core::U256; use sp_std::vec; pub fn make_register_token_message() -> InboundQueueFixture { InboundQueueFixture { - execution_header: CompactExecutionHeader{ - parent_hash: hex!("d5de3dd02c96dbdc8aaa4db70a1e9fdab5ded5f4d52f18798acd56a3d37d1ad6").into(), - block_number: 772, - state_root: hex!("49cba2a79b23ad74cefe80c3a96699825d1cda0f75bfceb587c5549211c86245").into(), - receipts_root: hex!("7b1f61b9714c080ef0be014e01657a15f45f0304b477beebc7ca5596c8033095").into(), - }, message: Message { event_log: Log { address: hex!("eda338e4dc46038493b885327842fd3e301cab39").into(), @@ -28,14 +24,74 @@ pub fn make_register_token_message() -> InboundQueueFixture { data: hex!("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000002e00a736aa00000000000087d1f7fdfee7f651fabc8bfcb6e086c278b77a7d00e40b54020000000000000000000000000000000000000000000000000000000000").into(), }, proof: Proof { - block_hash: hex!("392182a385b3a417e8ddea8b252953ee81e6ec0fb09d9056c96c89fbeb703a3f").into(), - tx_index: 0, - data: (vec![ - hex!("7b1f61b9714c080ef0be014e01657a15f45f0304b477beebc7ca5596c8033095").to_vec(), + receipt_proof: (vec![ + hex!("dccdfceea05036f7b61dcdabadc937945d31e68a8d3dfd4dc85684457988c284").to_vec(), + hex!("4a98e45a319168b0fc6005ce6b744ee9bf54338e2c0784b976a8578d241ced0f").to_vec(), ], vec![ - hex!("f9028e822080b9028802f90284018301d205b9010000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000080000000000000000000000000000004000000000080000000000000000000000000000000000010100000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000040004000000000000002000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000200000000000010f90179f85894eda338e4dc46038493b885327842fd3e301cab39e1a0f78bb28d4b1d7da699e5c0bc2be29c2b04b5aab6aacf6298fe5304f9db9c6d7ea000000000000000000000000087d1f7fdfee7f651fabc8bfcb6e086c278b77a7df9011c94eda338e4dc46038493b885327842fd3e301cab39f863a07153f9357c8ea496bba60bf82e67143e27b64462b49041f8e689e1b05728f84fa0c173fac324158e77fb5840738a1a541f633cbec8884c6a601c567d2b376a0539a05f7060e971b0dc81e63f0aa41831091847d97c1a4693ac450cc128c7214e65e0b8a000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000002e00a736aa00000000000087d1f7fdfee7f651fabc8bfcb6e086c278b77a7d00e40b54020000000000000000000000000000000000000000000000000000000000").to_vec(), + hex!("f851a09c01dd6d2d8de951c45af23d3ad00829ce021c04d6c8acbe1612d456ee320d4980808080808080a04a98e45a319168b0fc6005ce6b744ee9bf54338e2c0784b976a8578d241ced0f8080808080808080").to_vec(), + hex!("f9028c30b9028802f90284018301d205b9010000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000080000000000000000000000000000004000000000080000000000000000000000000000000000010100000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000040004000000000000002000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000200000000000010f90179f85894eda338e4dc46038493b885327842fd3e301cab39e1a0f78bb28d4b1d7da699e5c0bc2be29c2b04b5aab6aacf6298fe5304f9db9c6d7ea000000000000000000000000087d1f7fdfee7f651fabc8bfcb6e086c278b77a7df9011c94eda338e4dc46038493b885327842fd3e301cab39f863a07153f9357c8ea496bba60bf82e67143e27b64462b49041f8e689e1b05728f84fa0c173fac324158e77fb5840738a1a541f633cbec8884c6a601c567d2b376a0539a05f7060e971b0dc81e63f0aa41831091847d97c1a4693ac450cc128c7214e65e0b8a000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000002e00a736aa00000000000087d1f7fdfee7f651fabc8bfcb6e086c278b77a7d00e40b54020000000000000000000000000000000000000000000000000000000000").to_vec(), ]), + execution_proof: ExecutionProof { + header: BeaconHeader { + slot: 393, + proposer_index: 4, + parent_root: hex!("6545b47a614a1dd4cad042a0cdbbf5be347e8ffcdc02c6c64540d5153acebeef").into(), + state_root: hex!("b62ac34a8cb82497be9542fe2114410c9f6021855b766015406101a1f3d86434").into(), + body_root: hex!("04005fe231e11a5b7b1580cb73b177ae8b338bedd745497e6bb7122126a806db").into(), + }, + ancestry_proof: Some(AncestryProof { + header_branch: vec![ + hex!("6545b47a614a1dd4cad042a0cdbbf5be347e8ffcdc02c6c64540d5153acebeef").into(), + hex!("fa84cc88ca53a72181599ff4eb07d8b444bce023fe2347c3b4f51004c43439d3").into(), + hex!("cadc8ae211c6f2221c9138e829249adf902419c78eb4727a150baa4d9a02cc9d").into(), + hex!("33a89962df08a35c52bd7e1d887cd71fa7803e68787d05c714036f6edf75947c").into(), + hex!("2c9760fce5c2829ef3f25595a703c21eb22d0186ce223295556ed5da663a82cf").into(), + hex!("e1aa87654db79c8a0ecd6c89726bb662fcb1684badaef5cd5256f479e3c622e1").into(), + hex!("aa70d5f314e4a1fbb9c362f3db79b21bf68b328887248651fbd29fc501d0ca97").into(), + hex!("160b6c235b3a1ed4ef5f80b03ee1c76f7bf3f591c92fca9d8663e9221b9f9f0f").into(), + hex!("f68d7dcd6a07a18e9de7b5d2aa1980eb962e11d7dcb584c96e81a7635c8d2535").into(), + hex!("1d5f912dfd6697110dd1ecb5cb8e77952eef57d85deb373572572df62bb157fc").into(), + hex!("ffff0ad7e659772f9534c195c815efc4014ef1e1daed4404c06385d11192e92b").into(), + hex!("6cf04127db05441cd833107a52be852868890e4317e6a02ab47683aa75964220").into(), + hex!("b7d05f875f140027ef5118a2247bbb84ce8f2f0f1123623085daf7960c329f5f").into(), + ], + finalized_block_root: hex!("751414cd97c0624f922b3e80285e9f776b08fa22fd5f87391f2ed7ef571a8d46").into(), + }), + execution_header: VersionedExecutionPayloadHeader::Deneb(deneb::ExecutionPayloadHeader { + parent_hash: hex!("8092290aa21b7751576440f77edd02a94058429ce50e63a92d620951fb25eda2").into(), + fee_recipient: hex!("0000000000000000000000000000000000000000").into(), + state_root: hex!("96a83e9ddf745346fafcb0b03d57314623df669ed543c110662b21302a0fae8b").into(), + receipts_root: hex!("dccdfceea05036f7b61dcdabadc937945d31e68a8d3dfd4dc85684457988c284").into(), + logs_bloom: hex!("00000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000080000000400000000000000000000004000000000080000000000000000000000000000000000010100000000000000000000000000000000020000000000000000000000000000000000080000000000000000000000000000040004000000000000002002002000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000080000000000000000000000000000000000100000000000000000200000200000010").into(), + prev_randao: hex!("62e309d4f5119d1f5c783abc20fc1a549efbab546d8d0b25ff1cfd58be524e67").into(), + block_number: 393, + gas_limit: 54492273, + gas_used: 199644, + timestamp: 1710552813, + extra_data: hex!("d983010d0b846765746888676f312e32312e368664617277696e").into(), + base_fee_per_gas: U256::from(7u64), + block_hash: hex!("6a9810efb9581d30c1a5c9074f27c68ea779a8c1ae31c213241df16225f4e131").into(), + transactions_root: hex!("2cfa6ed7327e8807c7973516c5c32a68ef2459e586e8067e113d081c3bd8c07d").into(), + withdrawals_root: hex!("792930bbd5baac43bcc798ee49aa8185ef76bb3b44ba62b91d86ae569e4bb535").into(), + blob_gas_used: 0, + excess_blob_gas: 0, + }), + execution_branch: vec![ + hex!("a6833fa629f3286b6916c6e50b8bf089fc9126bee6f64d0413b4e59c1265834d").into(), + hex!("b46f0c01805fe212e15907981b757e6c496b0cb06664224655613dcec82505bb").into(), + hex!("db56114e00fdd4c1f85c892bf35ac9a89289aaecb1ebd0a96cde606a748b5d71").into(), + hex!("d3af7c05c516726be7505239e0b9c7cb53d24abce6b91cdb3b3995f0164a75da").into(), + ], + } }, }, + finalized_header: BeaconHeader { + slot: 864, + proposer_index: 4, + parent_root: hex!("614e7672f991ac268cd841055973f55e1e42228831a211adef207bb7329be614").into(), + state_root: hex!("5fa8dfca3d760e4242ab46d529144627aa85348a19173b6e081172c701197a4a").into(), + body_root: hex!("0f34c083b1803666bb1ac5e73fa71582731a2cf37d279ff0a3b0cad5a2ff371e").into(), + }, + block_roots_root: hex!("b9aab9c388c4e4fcd899b71f62c498fc73406e38e8eb14aa440e9affa06f2a10").into(), } } diff --git a/bridges/snowbridge/pallets/inbound-queue/fixtures/src/register_token_with_insufficient_fee.rs b/bridges/snowbridge/pallets/inbound-queue/fixtures/src/register_token_with_insufficient_fee.rs deleted file mode 100644 index 82ff2283101e331395b06dd14f3876076e71722e..0000000000000000000000000000000000000000 --- a/bridges/snowbridge/pallets/inbound-queue/fixtures/src/register_token_with_insufficient_fee.rs +++ /dev/null @@ -1,42 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 -// SPDX-FileCopyrightText: 2023 Snowfork -// Generated, do not edit! -// See ethereum client README.md for instructions to generate - -use crate::InboundQueueFixture; -use hex_literal::hex; -use snowbridge_beacon_primitives::CompactExecutionHeader; -use snowbridge_core::inbound::{Log, Message, Proof}; -use sp_std::vec; - -pub fn make_register_token_with_infufficient_fee_message() -> InboundQueueFixture { - InboundQueueFixture { - execution_header: CompactExecutionHeader{ - parent_hash: hex!("998e81dc6df788a920b67e058fbde0dc3f4ec6f11f3f7cd8c3148e6d99584885").into(), - block_number: 338, - state_root: hex!("30ef9c9db2609de19bbc6c3cbeddac889e82bbcb2db20304b3abdfbdc7134cbf").into(), - receipts_root: hex!("969335c3132a007cb8b5886a3c23dd8da63cba04aeda29857a86ee1c13dae782").into(), - }, - message: Message { - event_log: Log { - address: hex!("eda338e4dc46038493b885327842fd3e301cab39").into(), - topics: vec![ - hex!("7153f9357c8ea496bba60bf82e67143e27b64462b49041f8e689e1b05728f84f").into(), - hex!("c173fac324158e77fb5840738a1a541f633cbec8884c6a601c567d2b376a0539").into(), - hex!("5f7060e971b0dc81e63f0aa41831091847d97c1a4693ac450cc128c7214e65e0").into(), - ], - // insufficient xcm fee as only 1000(hex:e803) - data: hex!("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000002e00a736aa00000000000087d1f7fdfee7f651fabc8bfcb6e086c278b77a7de8030000000000000000000000000000000000000000000000000000000000000000").into(), - }, - proof: Proof { - block_hash: hex!("5976f37f0e331d194eb331df74355ef47565c3a1bd11c95a45b681f6917085c1").into(), - tx_index: 0, - data: (vec![ - hex!("969335c3132a007cb8b5886a3c23dd8da63cba04aeda29857a86ee1c13dae782").to_vec(), - ], vec![ - hex!("f9028e822080b9028802f90284018301d205b9010000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000080000000000000000000000000000004000000000080000000000000000000000000000000000010100000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000040004000000000000002000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000200000000000010f90179f85894eda338e4dc46038493b885327842fd3e301cab39e1a0f78bb28d4b1d7da699e5c0bc2be29c2b04b5aab6aacf6298fe5304f9db9c6d7ea000000000000000000000000087d1f7fdfee7f651fabc8bfcb6e086c278b77a7df9011c94eda338e4dc46038493b885327842fd3e301cab39f863a07153f9357c8ea496bba60bf82e67143e27b64462b49041f8e689e1b05728f84fa0c173fac324158e77fb5840738a1a541f633cbec8884c6a601c567d2b376a0539a05f7060e971b0dc81e63f0aa41831091847d97c1a4693ac450cc128c7214e65e0b8a000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000002e00a736aa00000000000087d1f7fdfee7f651fabc8bfcb6e086c278b77a7de8030000000000000000000000000000000000000000000000000000000000000000").to_vec(), - ]), - }, - }, - } -} diff --git a/bridges/snowbridge/pallets/inbound-queue/fixtures/src/send_token.rs b/bridges/snowbridge/pallets/inbound-queue/fixtures/src/send_token.rs index 2562217100eaf7cd0c5dff420c55826b277d3570..4075febab59d596b94c74a140d0176c25d3a1991 100755 --- a/bridges/snowbridge/pallets/inbound-queue/fixtures/src/send_token.rs +++ b/bridges/snowbridge/pallets/inbound-queue/fixtures/src/send_token.rs @@ -3,20 +3,16 @@ // Generated, do not edit! // See ethereum client README.md for instructions to generate -use crate::InboundQueueFixture; use hex_literal::hex; -use snowbridge_beacon_primitives::CompactExecutionHeader; -use snowbridge_core::inbound::{Log, Message, Proof}; +use snowbridge_beacon_primitives::{ + types::deneb, AncestryProof, BeaconHeader, ExecutionProof, VersionedExecutionPayloadHeader, +}; +use snowbridge_core::inbound::{InboundQueueFixture, Log, Message, Proof}; +use sp_core::U256; use sp_std::vec; pub fn make_send_token_message() -> InboundQueueFixture { InboundQueueFixture { - execution_header: CompactExecutionHeader{ - parent_hash: hex!("920cecde45d428e3a77590b70f8533cf4c2c36917b8a7b74c915e7fa3dae7075").into(), - block_number: 1148, - state_root: hex!("bbc6ba0e9940d641afecbbaf3f97abd2b9ffaf2f6bd4879c4a71e659eca89978").into(), - receipts_root: hex!("9f3340b57eddc1f86de30776db57faeca80269a3dd459031741988dec240ce34").into(), - }, message: Message { event_log: Log { address: hex!("eda338e4dc46038493b885327842fd3e301cab39").into(), @@ -28,14 +24,72 @@ pub fn make_send_token_message() -> InboundQueueFixture { data: hex!("00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000005f00a736aa00000000000187d1f7fdfee7f651fabc8bfcb6e086c278b77a7d008eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48000064a7b3b6e00d000000000000000000e40b5402000000000000000000000000").into(), }, proof: Proof { - block_hash: hex!("d3c155f123c3cbff22f3d7869283e02179edea9ffa7a5e9a4d8414c2a6b8991f").into(), - tx_index: 0, - data: (vec![ - hex!("9f3340b57eddc1f86de30776db57faeca80269a3dd459031741988dec240ce34").to_vec(), + receipt_proof: (vec![ + hex!("f9d844c5b79638609ba385b910fec3b5d891c9d7b189f135f0432f33473de915").to_vec(), ], vec![ - hex!("f90451822080b9044b02f90447018301bcb9b9010000800000000000000000000020000000000000000000004000000000000000000400000000000000000000001000000010000000000000000000000008000000200000000000000001000008000000000000000000000000000000008000080000000000200000000000000000000000000100000000000000000011000000000000020200000000000000000000000000003000000040080008000000000000000000040044000021000000002000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000200800000000000f9033cf89b9487d1f7fdfee7f651fabc8bfcb6e086c278b77a7df863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa000000000000000000000000090a987b944cb1dcce5564e5fdecd7a54d3de27fea000000000000000000000000057a2d4ff0c3866d96556884bf09fecdd7ccd530ca00000000000000000000000000000000000000000000000000de0b6b3a7640000f9015d94eda338e4dc46038493b885327842fd3e301cab39f884a024c5d2de620c6e25186ae16f6919eba93b6e2c1a33857cc419d9f3a00d6967e9a000000000000000000000000090a987b944cb1dcce5564e5fdecd7a54d3de27fea000000000000000000000000087d1f7fdfee7f651fabc8bfcb6e086c278b77a7da000000000000000000000000000000000000000000000000000000000000003e8b8c000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000208eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48f9013c94eda338e4dc46038493b885327842fd3e301cab39f863a07153f9357c8ea496bba60bf82e67143e27b64462b49041f8e689e1b05728f84fa0c173fac324158e77fb5840738a1a541f633cbec8884c6a601c567d2b376a0539a0c8eaf22f2cb07bac4679df0a660e7115ed87fcfd4e32ac269f6540265bbbd26fb8c000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000005f00a736aa00000000000187d1f7fdfee7f651fabc8bfcb6e086c278b77a7d008eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48000064a7b3b6e00d000000000000000000e40b5402000000000000000000000000").to_vec(), + hex!("f90451822080b9044b02f90447018301bcb6b9010000800000000000000000000020000000000000000000004000000000000000000400000000000000000000001000000010000000000000000000000008000000200000000000000001000008000000000000000000000000000000008000080000000000200000000000000000000000000100000000000000000011000000000000020200000000000000000000000000003000000040080008000000000000000000040044000021000000002000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000200800000000000f9033cf89b9487d1f7fdfee7f651fabc8bfcb6e086c278b77a7df863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa000000000000000000000000090a987b944cb1dcce5564e5fdecd7a54d3de27fea000000000000000000000000057a2d4ff0c3866d96556884bf09fecdd7ccd530ca00000000000000000000000000000000000000000000000000de0b6b3a7640000f9015d94eda338e4dc46038493b885327842fd3e301cab39f884a024c5d2de620c6e25186ae16f6919eba93b6e2c1a33857cc419d9f3a00d6967e9a000000000000000000000000087d1f7fdfee7f651fabc8bfcb6e086c278b77a7da000000000000000000000000090a987b944cb1dcce5564e5fdecd7a54d3de27fea000000000000000000000000000000000000000000000000000000000000003e8b8c000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000208eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48f9013c94eda338e4dc46038493b885327842fd3e301cab39f863a07153f9357c8ea496bba60bf82e67143e27b64462b49041f8e689e1b05728f84fa0c173fac324158e77fb5840738a1a541f633cbec8884c6a601c567d2b376a0539a0c8eaf22f2cb07bac4679df0a660e7115ed87fcfd4e32ac269f6540265bbbd26fb8c000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000005f00a736aa00000000000187d1f7fdfee7f651fabc8bfcb6e086c278b77a7d008eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48000064a7b3b6e00d000000000000000000e40b5402000000000000000000000000").to_vec(), ]), + execution_proof: ExecutionProof { + header: BeaconHeader { + slot: 2321, + proposer_index: 5, + parent_root: hex!("2add14727840d3a5ea061e14baa47030bb81380a65999200d119e73b86411d20").into(), + state_root: hex!("d962981467920bb2b7efa4a7a1baf64745582c3250857f49a957c5dae9a0da39").into(), + body_root: hex!("18e3f7f51a350f371ad35d166f2683b42af51d1836b295e4093be08acb0dcb7a").into(), + }, + ancestry_proof: Some(AncestryProof { + header_branch: vec![ + hex!("2add14727840d3a5ea061e14baa47030bb81380a65999200d119e73b86411d20").into(), + hex!("48b2e2f5256906a564e5058698f70e3406765fefd6a2edc064bb5fb88aa2ed0a").into(), + hex!("e5ed7c704e845418219b2fda42cd2f3438ffbe4c4b320935ae49439c6189f7a7").into(), + hex!("4a7ce24526b3f571548ad69679e4e260653a1b3b911a344e7f988f25a5c917a7").into(), + hex!("46fc859727ab0d0e8c344011f7d7a4426ccb537bb51363397e56cc7153f56391").into(), + hex!("f496b6f85a7c6c28a9048f2153550a7c5bcb4b23844ed3b87f6baa646124d8a3").into(), + hex!("7318644e474beb46e595a1875acc7444b937f5208065241911d2a71ac50c2de3").into(), + hex!("5cf48519e518ac64286aef5391319782dd38831d5dcc960578a6b9746d5f8cee").into(), + hex!("efb3e50fa39ca9fe7f76adbfa36fa8451ec2fd5d07b22aaf822137c04cf95a76").into(), + hex!("2206cd50750355ffaef4a67634c21168f2b564c58ffd04f33b0dc7af7dab3291").into(), + hex!("1a4014f6c4fcce9949fba74cb0f9e88df086706f9e05560cc9f0926f8c90e373").into(), + hex!("2df7cc0bcf3060be4132c63da7599c2600d9bbadf37ab001f15629bc2255698e").into(), + hex!("b7d05f875f140027ef5118a2247bbb84ce8f2f0f1123623085daf7960c329f5f").into(), + ], + finalized_block_root: hex!("f869dd1c9598043008a3ac2a5d91b3d6c7b0bb3295b3843bc84c083d70b0e604").into(), + }), + execution_header: VersionedExecutionPayloadHeader::Deneb(deneb::ExecutionPayloadHeader { + parent_hash: hex!("5d7859883dde1eba6c98b20eac18426134b25da2a89e5e360f3343b15e0e0a31").into(), + fee_recipient: hex!("0000000000000000000000000000000000000000").into(), + state_root: hex!("f8fbebed4c84d46231bd293bb9fbc9340d5c28c284d99fdaddb77238b8960ae2").into(), + receipts_root: hex!("f9d844c5b79638609ba385b910fec3b5d891c9d7b189f135f0432f33473de915").into(), + logs_bloom: hex!("00800000000000000000000020000000000000000000004000000000000000000400000000000000000000001000000010000000000000000000000008000000200000000000000001000008000000000000000000000000000000008000080000000000200000000000000000000000000100000000000000000011000000000000020200000000000000000000000000003000000040080008000000000000000000040044000021000000002000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000200800000000000").into(), + prev_randao: hex!("15533eeb366c6386bea5aeb8f425871928348c092209e4377f2418a6dedd7fd0").into(), + block_number: 2321, + gas_limit: 30000000, + gas_used: 113846, + timestamp: 1710554741, + extra_data: hex!("d983010d0b846765746888676f312e32312e368664617277696e").into(), + base_fee_per_gas: U256::from(7u64), + block_hash: hex!("585a07122a30339b03b6481eae67c2d3de2b6b64f9f426230986519bf0f1bdfe").into(), + transactions_root: hex!("09cd60ee2207d804397c81f7b7e1e5d3307712b136e5376623a80317a4bdcd7a").into(), + withdrawals_root: hex!("792930bbd5baac43bcc798ee49aa8185ef76bb3b44ba62b91d86ae569e4bb535").into(), + blob_gas_used: 0, + excess_blob_gas: 0, + }), + execution_branch: vec![ + hex!("9d419471a9a4719b40e7607781fbe32d9a7766b79805505c78c0c58133496ba2").into(), + hex!("b46f0c01805fe212e15907981b757e6c496b0cb06664224655613dcec82505bb").into(), + hex!("db56114e00fdd4c1f85c892bf35ac9a89289aaecb1ebd0a96cde606a748b5d71").into(), + hex!("bee375b8f1bbe4cd0e783c78026c1829ae72741c2dead5cab05d6834c5e5df65").into(), + ], + } }, }, + finalized_header: BeaconHeader { + slot: 4032, + proposer_index: 5, + parent_root: hex!("180aaaec59d38c3860e8af203f01f41c9bc41665f4d17916567c80f6cd23e8a2").into(), + state_root: hex!("3341790429ed3bf894cafa3004351d0b99e08baf6c38eb2a54d58e69fd2d19c6").into(), + body_root: hex!("a221e0c695ac7b7d04ce39b28b954d8a682ecd57961d81b44783527c6295f455").into(), + }, + block_roots_root: hex!("5744385ef06f82e67606f49aa29cd162f2e837a68fb7bd82f1fc6155d9f8640f").into(), } } diff --git a/bridges/snowbridge/pallets/inbound-queue/fixtures/src/send_token_to_penpal.rs b/bridges/snowbridge/pallets/inbound-queue/fixtures/src/send_token_to_penpal.rs index 86ba3f7ecc18f3743fd22592fc23a50f26b447d7..6a951b568ae5d39cd3c6deca801b5feb1d05322f 100755 --- a/bridges/snowbridge/pallets/inbound-queue/fixtures/src/send_token_to_penpal.rs +++ b/bridges/snowbridge/pallets/inbound-queue/fixtures/src/send_token_to_penpal.rs @@ -3,39 +3,93 @@ // Generated, do not edit! // See ethereum client README.md for instructions to generate -use crate::InboundQueueFixture; use hex_literal::hex; -use snowbridge_beacon_primitives::CompactExecutionHeader; -use snowbridge_core::inbound::{Log, Message, Proof}; +use snowbridge_beacon_primitives::{ + types::deneb, AncestryProof, BeaconHeader, ExecutionProof, VersionedExecutionPayloadHeader, +}; +use snowbridge_core::inbound::{InboundQueueFixture, Log, Message, Proof}; +use sp_core::U256; use sp_std::vec; pub fn make_send_token_to_penpal_message() -> InboundQueueFixture { InboundQueueFixture { - execution_header: CompactExecutionHeader{ - parent_hash: hex!("434148c290f27ee4be34fa344cd7608bf942a4541b27c9d868439631b3f37a8d").into(), - block_number: 816, - state_root: hex!("595e643f9095870e30e85e2bbef7d9e3a39df5aae839d26cf455d3dbf3e5a539").into(), - receipts_root: hex!("c40ab2c4abcfdea4f42195e0ad822806e5423108021c3b542646c7193319a6c1").into(), - }, message: Message { event_log: Log { address: hex!("eda338e4dc46038493b885327842fd3e301cab39").into(), topics: vec![ hex!("7153f9357c8ea496bba60bf82e67143e27b64462b49041f8e689e1b05728f84f").into(), hex!("c173fac324158e77fb5840738a1a541f633cbec8884c6a601c567d2b376a0539").into(), - hex!("c8eaf22f2cb07bac4679df0a660e7115ed87fcfd4e32ac269f6540265bbbd26f").into(), + hex!("be323bced46a1a49c8da2ab62ad5e974fd50f1dabaeed70b23ca5bcf14bfe4aa").into(), ], - data: hex!("00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000007300a736aa00000000000187d1f7fdfee7f651fabc8bfcb6e086c278b77a7d01d00700001cbd2d43530a44705ad088af313e18f80b53ef16b36177cd4b77b846f2a5f07c00286bee000000000000000000000000000064a7b3b6e00d000000000000000000e40b5402000000000000000000000000000000000000000000000000").into(), + data: hex!("00000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000007300a736aa00000000000187d1f7fdfee7f651fabc8bfcb6e086c278b77a7d01d00700001cbd2d43530a44705ad088af313e18f80b53ef16b36177cd4b77b846f2a5f07c00286bee000000000000000000000000000064a7b3b6e00d000000000000000000e40b5402000000000000000000000000000000000000000000000000").into(), }, proof: Proof { - block_hash: hex!("6c49a7f8fb2014a23e58a949c95a6743174589a7ce83434b073dc05dec402f3d").into(), - tx_index: 0, - data: (vec![ - hex!("c40ab2c4abcfdea4f42195e0ad822806e5423108021c3b542646c7193319a6c1").to_vec(), + receipt_proof: (vec![ + hex!("106f1eaeac04e469da0020ad5c8a72af66323638bd3f561a3c8236063202c120").to_vec(), ], vec![ - hex!("f90471822080b9046b02f90467018301d30fb9010000800000000000000000000000000000000000000000004000000000000000000400000000004000000000001000000010000000000000000000000008000000200000000000000001000008000000000000000000000000000000008000080000000000200000000000000000000000000100000000000000000011000000000000020000000000000000000000000000003000000000080018000000000000000000040044000021000000002000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000200820000000000f9035cf89b9487d1f7fdfee7f651fabc8bfcb6e086c278b77a7df863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa000000000000000000000000090a987b944cb1dcce5564e5fdecd7a54d3de27fea000000000000000000000000057a2d4ff0c3866d96556884bf09fecdd7ccd530ca00000000000000000000000000000000000000000000000000de0b6b3a7640000f9015d94eda338e4dc46038493b885327842fd3e301cab39f884a024c5d2de620c6e25186ae16f6919eba93b6e2c1a33857cc419d9f3a00d6967e9a000000000000000000000000090a987b944cb1dcce5564e5fdecd7a54d3de27fea000000000000000000000000087d1f7fdfee7f651fabc8bfcb6e086c278b77a7da000000000000000000000000000000000000000000000000000000000000007d0b8c000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000201cbd2d43530a44705ad088af313e18f80b53ef16b36177cd4b77b846f2a5f07cf9015c94eda338e4dc46038493b885327842fd3e301cab39f863a07153f9357c8ea496bba60bf82e67143e27b64462b49041f8e689e1b05728f84fa0c173fac324158e77fb5840738a1a541f633cbec8884c6a601c567d2b376a0539a0c8eaf22f2cb07bac4679df0a660e7115ed87fcfd4e32ac269f6540265bbbd26fb8e000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000007300a736aa00000000000187d1f7fdfee7f651fabc8bfcb6e086c278b77a7d01d00700001cbd2d43530a44705ad088af313e18f80b53ef16b36177cd4b77b846f2a5f07c00286bee000000000000000000000000000064a7b3b6e00d000000000000000000e40b5402000000000000000000000000000000000000000000000000").to_vec(), + hex!("f90471822080b9046b02f904670183017d9cb9010000800000000000008000000000000000000000000000004000000000000000000400000000004000000000001000000010000000000000000000001008000000000000000000000001000008000040000000000000000000000000008000080000000000200000000000000000000000000100000000000000000010000000000000020000000000000000000000000000003000000000080018000000000000000000040004000021000000002000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000200820000000000f9035cf89b9487d1f7fdfee7f651fabc8bfcb6e086c278b77a7df863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa000000000000000000000000090a987b944cb1dcce5564e5fdecd7a54d3de27fea000000000000000000000000057a2d4ff0c3866d96556884bf09fecdd7ccd530ca00000000000000000000000000000000000000000000000000de0b6b3a7640000f9015d94eda338e4dc46038493b885327842fd3e301cab39f884a024c5d2de620c6e25186ae16f6919eba93b6e2c1a33857cc419d9f3a00d6967e9a000000000000000000000000087d1f7fdfee7f651fabc8bfcb6e086c278b77a7da000000000000000000000000090a987b944cb1dcce5564e5fdecd7a54d3de27fea000000000000000000000000000000000000000000000000000000000000007d0b8c000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000201cbd2d43530a44705ad088af313e18f80b53ef16b36177cd4b77b846f2a5f07cf9015c94eda338e4dc46038493b885327842fd3e301cab39f863a07153f9357c8ea496bba60bf82e67143e27b64462b49041f8e689e1b05728f84fa0c173fac324158e77fb5840738a1a541f633cbec8884c6a601c567d2b376a0539a0be323bced46a1a49c8da2ab62ad5e974fd50f1dabaeed70b23ca5bcf14bfe4aab8e000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000007300a736aa00000000000187d1f7fdfee7f651fabc8bfcb6e086c278b77a7d01d00700001cbd2d43530a44705ad088af313e18f80b53ef16b36177cd4b77b846f2a5f07c00286bee000000000000000000000000000064a7b3b6e00d000000000000000000e40b5402000000000000000000000000000000000000000000000000").to_vec(), ]), + execution_proof: ExecutionProof { + header: BeaconHeader { + slot: 4235, + proposer_index: 4, + parent_root: hex!("1b31e6264c19bcad120e434e0aede892e7d7c8ed80ab505cb593d9a4a16bc566").into(), + state_root: hex!("725f51771a0ecf72c647a283ab814ca088f998eb8c203181496b0b8e01f624fa").into(), + body_root: hex!("6f1c326d192e7e97e21e27b16fd7f000b8fa09b435ff028849927e382302b0ce").into(), + }, + ancestry_proof: Some(AncestryProof { + header_branch: vec![ + hex!("1b31e6264c19bcad120e434e0aede892e7d7c8ed80ab505cb593d9a4a16bc566").into(), + hex!("335eb186c077fa7053ec96dcc5d34502c997713d2d5bc4eb74842118d8cd5a64").into(), + hex!("326607faf2a7dfc9cfc4b6895f8f3d92a659552deb2c8fd1e892ec00c86c734c").into(), + hex!("4e20002125d7b6504df7c774f3f48e018e1e6762d03489149670a8335bba1425").into(), + hex!("e76af5cd61aade5aec8282b6f1df9046efa756b0466bba5e49032410f7739a1b").into(), + hex!("ee4dcd9527712116380cddafd120484a3bedf867225bbb86850b84decf6da730").into(), + hex!("e4687a07421d3150439a2cd2f09f3b468145d75b359a2e5fa88dfbec51725b15").into(), + hex!("38eaa78978e95759aa9b6f8504a8dbe36151f20ae41907e6a1ea165700ceefcd").into(), + hex!("1c1b071ec6f13e15c47d07d1bfbcc9135d6a6c819e68e7e6078a2007418c1a23").into(), + hex!("0b3ad7ad193c691c8c4ba1606ad2a90482cd1d033c7db58cfe739d0e20431e9e").into(), + hex!("ffff0ad7e659772f9534c195c815efc4014ef1e1daed4404c06385d11192e92b").into(), + hex!("6cf04127db05441cd833107a52be852868890e4317e6a02ab47683aa75964220").into(), + hex!("b2ffec5f2c14640305dd941330f09216c53b99d198e93735a400a6d3a4de191f").into(), + ], + finalized_block_root: hex!("08be7a59e947f08cd95c4ef470758730bf9e3b0db0824cb663ea541c39b0e65c").into(), + }), + execution_header: VersionedExecutionPayloadHeader::Deneb(deneb::ExecutionPayloadHeader { + parent_hash: hex!("5d1186ae041f58785edb2f01248e95832f2e5e5d6c4eb8f7ff2f58980bfc2de9").into(), + fee_recipient: hex!("0000000000000000000000000000000000000000").into(), + state_root: hex!("2a66114d20e93082c8e9b47c8d401a937013487d757c9c2f3123cf43dc1f656d").into(), + receipts_root: hex!("106f1eaeac04e469da0020ad5c8a72af66323638bd3f561a3c8236063202c120").into(), + logs_bloom: hex!("00800000000000008000000000000000000000000000004000000000000000000400000000004000000000001000000010000000000000000000001008000000000000000000000001000008000040000000000000000000000000008000080000000000200000000000000000000000000100000000000000000010000000000000020000000000000000000000000000003000000000080018000000000000000000040004000021000000002000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000200820000000000").into(), + prev_randao: hex!("92e063c7e369b74149fdd1d7132ed2f635a19b9d8bff57637b8ee4736576426e").into(), + block_number: 4235, + gas_limit: 30000000, + gas_used: 97692, + timestamp: 1710556655, + extra_data: hex!("d983010d0b846765746888676f312e32312e368664617277696e").into(), + base_fee_per_gas: U256::from(7u64), + block_hash: hex!("ce24fe3047aa20a8f222cd1d04567c12b39455400d681141962c2130e690953f").into(), + transactions_root: hex!("0c8388731de94771777c60d452077065354d90d6e5088db61fc6a134684195cc").into(), + withdrawals_root: hex!("792930bbd5baac43bcc798ee49aa8185ef76bb3b44ba62b91d86ae569e4bb535").into(), + blob_gas_used: 0, + excess_blob_gas: 0, + }), + execution_branch: vec![ + hex!("99d397fa180078e66cd3a3b77bcb07553052f4e21d447167f3a406f663b14e6a").into(), + hex!("b46f0c01805fe212e15907981b757e6c496b0cb06664224655613dcec82505bb").into(), + hex!("db56114e00fdd4c1f85c892bf35ac9a89289aaecb1ebd0a96cde606a748b5d71").into(), + hex!("53ddf17147819c1abb918178b0230d965d1bc2c0d389f45e91e54cb1d2d468aa").into(), + ], + } }, }, + finalized_header: BeaconHeader { + slot: 4672, + proposer_index: 4, + parent_root: hex!("951233bf9f4bddfb2fa8f54e3bd0c7883779ef850e13e076baae3130dd7732db").into(), + state_root: hex!("4d303003b8cb097cbcc14b0f551ee70dac42de2c1cc2f4acfca7058ca9713291").into(), + body_root: hex!("664d13952b6f369bf4cf3af74d067ec33616eb57ed3a8a403fd5bae4fbf737dd").into(), + }, + block_roots_root: hex!("af71048297c070e6539cf3b9b90ae07d86d363454606bc239734629e6b49b983").into(), } } diff --git a/bridges/snowbridge/pallets/inbound-queue/src/benchmarking/mod.rs b/bridges/snowbridge/pallets/inbound-queue/src/benchmarking/mod.rs index 931befa2ac67810eaf7aac1b8156a46fc398f7a2..d59d92757721bac925cdfe67542138771c2a9dfa 100644 --- a/bridges/snowbridge/pallets/inbound-queue/src/benchmarking/mod.rs +++ b/bridges/snowbridge/pallets/inbound-queue/src/benchmarking/mod.rs @@ -19,8 +19,8 @@ mod benchmarks { let create_message = make_register_token_message(); T::Helper::initialize_storage( - create_message.message.proof.block_hash, - create_message.execution_header, + create_message.finalized_header, + create_message.block_roots_root, ); let sovereign_account = sibling_sovereign_account::(1000u32.into()); diff --git a/bridges/snowbridge/pallets/inbound-queue/src/lib.rs b/bridges/snowbridge/pallets/inbound-queue/src/lib.rs index bdc21fcf037025f933b7c11e92937744e83e1da7..8acbb0c2916e704930268835e12bd14972737114 100644 --- a/bridges/snowbridge/pallets/inbound-queue/src/lib.rs +++ b/bridges/snowbridge/pallets/inbound-queue/src/lib.rs @@ -28,9 +28,6 @@ mod envelope; #[cfg(feature = "runtime-benchmarks")] mod benchmarking; -#[cfg(feature = "runtime-benchmarks")] -use snowbridge_beacon_primitives::CompactExecutionHeader; - pub mod weights; #[cfg(test)] @@ -44,7 +41,7 @@ use envelope::Envelope; use frame_support::{ traits::{ fungible::{Inspect, Mutate}, - tokens::Preservation, + tokens::{Fortitude, Preservation}, }, weights::WeightToFee, PalletError, @@ -52,6 +49,7 @@ use frame_support::{ use frame_system::ensure_signed; use scale_info::TypeInfo; use sp_core::{H160, H256}; +use sp_runtime::traits::Zero; use sp_std::{convert::TryFrom, vec}; use xcm::prelude::{ send_xcm, Instruction::SetTopic, Junction::*, Location, SendError as XcmpSendError, SendXcm, @@ -72,6 +70,9 @@ use sp_runtime::{traits::Saturating, SaturatedConversion, TokenError}; pub use weights::WeightInfo; +#[cfg(feature = "runtime-benchmarks")] +use snowbridge_beacon_primitives::BeaconHeader; + type BalanceOf = <::Token as Inspect<::AccountId>>::Balance; @@ -91,7 +92,7 @@ pub mod pallet { #[cfg(feature = "runtime-benchmarks")] pub trait BenchmarkHelper { - fn initialize_storage(block_hash: H256, header: CompactExecutionHeader); + fn initialize_storage(beacon_header: BeaconHeader, block_roots_root: H256); } #[pallet::config] @@ -261,11 +262,19 @@ pub mod pallet { } })?; - // Reward relayer from the sovereign account of the destination parachain - // Expected to fail if sovereign account has no funds + // Reward relayer from the sovereign account of the destination parachain, only if funds + // are available let sovereign_account = sibling_sovereign_account::(channel.para_id); let delivery_cost = Self::calculate_delivery_cost(message.encode().len() as u32); - T::Token::transfer(&sovereign_account, &who, delivery_cost, Preservation::Preserve)?; + let amount = T::Token::reducible_balance( + &sovereign_account, + Preservation::Preserve, + Fortitude::Polite, + ) + .min(delivery_cost); + if !amount.is_zero() { + T::Token::transfer(&sovereign_account, &who, amount, Preservation::Preserve)?; + } // Decode message into XCM let (xcm, fee) = diff --git a/bridges/snowbridge/pallets/inbound-queue/src/mock.rs b/bridges/snowbridge/pallets/inbound-queue/src/mock.rs index 110f611c6766020039bd1f73def900914da8cae2..c96c868bc26ef71984e70bc40863db73cf18b9c5 100644 --- a/bridges/snowbridge/pallets/inbound-queue/src/mock.rs +++ b/bridges/snowbridge/pallets/inbound-queue/src/mock.rs @@ -3,12 +3,14 @@ use super::*; use frame_support::{ - parameter_types, - traits::{ConstU128, ConstU32, Everything}, + derive_impl, parameter_types, + traits::{ConstU32, Everything}, weights::IdentityFee, }; use hex_literal::hex; -use snowbridge_beacon_primitives::{Fork, ForkVersions}; +use snowbridge_beacon_primitives::{ + types::deneb, BeaconHeader, ExecutionProof, Fork, ForkVersions, VersionedExecutionPayloadHeader, +}; use snowbridge_core::{ gwei, inbound::{Log, Proof, VerificationError}, @@ -20,7 +22,7 @@ use sp_runtime::{ traits::{BlakeTwo256, IdentifyAccount, IdentityLookup, Verify}, BuildStorage, FixedU128, MultiSignature, }; -use sp_std::convert::From; +use sp_std::{convert::From, default::Default}; use xcm::{latest::SendXcm, prelude::*}; use xcm_executor::AssetsInHolding; @@ -47,10 +49,9 @@ parameter_types! { type Balance = u128; +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { type BaseCallFilter = Everything; - type BlockWeights = (); - type BlockLength = (); type RuntimeOrigin = RuntimeOrigin; type RuntimeCall = RuntimeCall; type RuntimeTask = RuntimeTask; @@ -60,20 +61,16 @@ impl frame_system::Config for Test { type Lookup = IdentityLookup; type RuntimeEvent = RuntimeEvent; type BlockHashCount = BlockHashCount; - type DbWeight = (); - type Version = (); type PalletInfo = PalletInfo; type AccountData = pallet_balances::AccountData; - type OnNewAccount = (); - type OnKilledAccount = (); - type SystemWeightInfo = (); - type SS58Prefix = (); - type OnSetCode = (); - type MaxConsumers = frame_support::traits::ConstU32<16>; type Nonce = u64; type Block = Block; } +parameter_types! { + pub const ExistentialDeposit: u128 = 1; +} + impl pallet_balances::Config for Test { type MaxLocks = (); type MaxReserves = (); @@ -81,7 +78,7 @@ impl pallet_balances::Config for Test { type Balance = Balance; type RuntimeEvent = RuntimeEvent; type DustRemoval = (); - type ExistentialDeposit = ConstU128<1>; + type ExistentialDeposit = ExistentialDeposit; type AccountStore = System; type WeightInfo = (); type FreezeIdentifier = (); @@ -91,7 +88,6 @@ impl pallet_balances::Config for Test { } parameter_types! { - pub const ExecutionHeadersPruneThreshold: u32 = 10; pub const ChainForkVersions: ForkVersions = ForkVersions{ genesis: Fork { version: [0, 0, 0, 1], // 0x00000001 @@ -119,7 +115,6 @@ parameter_types! { impl snowbridge_pallet_ethereum_client::Config for Test { type RuntimeEvent = RuntimeEvent; type ForkVersions = ChainForkVersions; - type MaxExecutionHeadersToKeep = ExecutionHeadersPruneThreshold; type WeightInfo = (); } @@ -148,7 +143,7 @@ parameter_types! { #[cfg(feature = "runtime-benchmarks")] impl BenchmarkHelper for Test { // not implemented since the MockVerifier is used for tests - fn initialize_storage(_: H256, _: CompactExecutionHeader) {} + fn initialize_storage(_: BeaconHeader, _: H256) {} } // Mock XCM sender that always succeeds @@ -182,7 +177,8 @@ parameter_types! { pub Parameters: PricingParameters = PricingParameters { exchange_rate: FixedU128::from_rational(1, 400), fee_per_gas: gwei(20), - rewards: Rewards { local: DOT, remote: meth(1) } + rewards: Rewards { local: DOT, remote: meth(1) }, + multiplier: FixedU128::from_rational(1, 1), }; } @@ -343,5 +339,32 @@ pub fn mock_event_log_invalid_gateway() -> Log { } } +pub fn mock_execution_proof() -> ExecutionProof { + ExecutionProof { + header: BeaconHeader::default(), + ancestry_proof: None, + execution_header: VersionedExecutionPayloadHeader::Deneb(deneb::ExecutionPayloadHeader { + parent_hash: Default::default(), + fee_recipient: Default::default(), + state_root: Default::default(), + receipts_root: Default::default(), + logs_bloom: vec![], + prev_randao: Default::default(), + block_number: 0, + gas_limit: 0, + gas_used: 0, + timestamp: 0, + extra_data: vec![], + base_fee_per_gas: Default::default(), + block_hash: Default::default(), + transactions_root: Default::default(), + withdrawals_root: Default::default(), + blob_gas_used: 0, + excess_blob_gas: 0, + }), + execution_branch: vec![], + } +} + pub const ASSET_HUB_PARAID: u32 = 1000u32; pub const TEMPLATE_PARAID: u32 = 1001u32; diff --git a/bridges/snowbridge/pallets/inbound-queue/src/test.rs b/bridges/snowbridge/pallets/inbound-queue/src/test.rs index 9a47e475b8c997a6fe4cc4d1860af3da0bf52a57..bd993c968df7373910b438a2e090ef2896bb41dd 100644 --- a/bridges/snowbridge/pallets/inbound-queue/src/test.rs +++ b/bridges/snowbridge/pallets/inbound-queue/src/test.rs @@ -6,7 +6,7 @@ use frame_support::{assert_noop, assert_ok}; use hex_literal::hex; use snowbridge_core::{inbound::Proof, ChannelId}; use sp_keyring::AccountKeyring as Keyring; -use sp_runtime::{DispatchError, TokenError}; +use sp_runtime::DispatchError; use sp_std::convert::From; use crate::{Error, Event as InboundQueueEvent}; @@ -25,9 +25,8 @@ fn test_submit_happy_path() { let message = Message { event_log: mock_event_log(), proof: Proof { - block_hash: Default::default(), - tx_index: Default::default(), - data: Default::default(), + receipt_proof: Default::default(), + execution_proof: mock_execution_proof(), }, }; @@ -77,9 +76,8 @@ fn test_submit_xcm_invalid_channel() { let message = Message { event_log: mock_event_log_invalid_channel(), proof: Proof { - block_hash: Default::default(), - tx_index: Default::default(), - data: Default::default(), + receipt_proof: Default::default(), + execution_proof: mock_execution_proof(), }, }; assert_noop!( @@ -103,9 +101,8 @@ fn test_submit_with_invalid_gateway() { let message = Message { event_log: mock_event_log_invalid_gateway(), proof: Proof { - block_hash: Default::default(), - tx_index: Default::default(), - data: Default::default(), + receipt_proof: Default::default(), + execution_proof: mock_execution_proof(), }, }; assert_noop!( @@ -129,9 +126,8 @@ fn test_submit_with_invalid_nonce() { let message = Message { event_log: mock_event_log(), proof: Proof { - block_hash: Default::default(), - tx_index: Default::default(), - data: Default::default(), + receipt_proof: Default::default(), + execution_proof: mock_execution_proof(), }, }; assert_ok!(InboundQueue::submit(origin.clone(), message.clone())); @@ -150,12 +146,12 @@ fn test_submit_with_invalid_nonce() { } #[test] -fn test_submit_no_funds_to_reward_relayers() { +fn test_submit_no_funds_to_reward_relayers_just_ignore() { new_tester().execute_with(|| { let relayer: AccountId = Keyring::Bob.into(); let origin = RuntimeOrigin::signed(relayer); - // Reset balance of sovereign_account to zero so to trigger the FundsUnavailable error + // Reset balance of sovereign_account to zero first let sovereign_account = sibling_sovereign_account::(ASSET_HUB_PARAID.into()); Balances::set_balance(&sovereign_account, 0); @@ -163,15 +159,12 @@ fn test_submit_no_funds_to_reward_relayers() { let message = Message { event_log: mock_event_log(), proof: Proof { - block_hash: Default::default(), - tx_index: Default::default(), - data: Default::default(), + receipt_proof: Default::default(), + execution_proof: mock_execution_proof(), }, }; - assert_noop!( - InboundQueue::submit(origin.clone(), message.clone()), - TokenError::FundsUnavailable - ); + // Check submit successfully in case no funds available + assert_ok!(InboundQueue::submit(origin.clone(), message.clone())); }); } @@ -183,9 +176,8 @@ fn test_set_operating_mode() { let message = Message { event_log: mock_event_log(), proof: Proof { - block_hash: Default::default(), - tx_index: Default::default(), - data: Default::default(), + receipt_proof: Default::default(), + execution_proof: mock_execution_proof(), }, }; @@ -210,3 +202,44 @@ fn test_set_operating_mode_root_only() { ); }); } + +#[test] +fn test_submit_no_funds_to_reward_relayers_and_ed_preserved() { + new_tester().execute_with(|| { + let relayer: AccountId = Keyring::Bob.into(); + let origin = RuntimeOrigin::signed(relayer); + + // Reset balance of sovereign account to (ED+1) first + let sovereign_account = sibling_sovereign_account::(ASSET_HUB_PARAID.into()); + Balances::set_balance(&sovereign_account, ExistentialDeposit::get() + 1); + + // Submit message successfully + let message = Message { + event_log: mock_event_log(), + proof: Proof { + receipt_proof: Default::default(), + execution_proof: mock_execution_proof(), + }, + }; + assert_ok!(InboundQueue::submit(origin.clone(), message.clone())); + + // Check balance of sovereign account to ED + let amount = Balances::balance(&sovereign_account); + assert_eq!(amount, ExistentialDeposit::get()); + + // Submit another message with nonce set as 2 + let mut event_log = mock_event_log(); + event_log.data[31] = 2; + let message = Message { + event_log, + proof: Proof { + receipt_proof: Default::default(), + execution_proof: mock_execution_proof(), + }, + }; + assert_ok!(InboundQueue::submit(origin.clone(), message.clone())); + // Check balance of sovereign account as ED does not change + let amount = Balances::balance(&sovereign_account); + assert_eq!(amount, ExistentialDeposit::get()); + }); +} diff --git a/bridges/snowbridge/pallets/outbound-queue/Cargo.toml b/bridges/snowbridge/pallets/outbound-queue/Cargo.toml index ae52fb3e5c49d5d35558d78a38b7f00b0d01ac8f..387491abae0f652d63c55d50279d4145dc03b18d 100644 --- a/bridges/snowbridge/pallets/outbound-queue/Cargo.toml +++ b/bridges/snowbridge/pallets/outbound-queue/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "snowbridge-pallet-outbound-queue" description = "Snowbridge Outbound Queue Pallet" -version = "0.0.0" +version = "0.2.0" authors = ["Snowfork "] edition.workspace = true repository.workspace = true @@ -15,10 +15,9 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -serde = { version = "1.0.195", features = ["alloc", "derive"], default-features = false } +serde = { features = ["alloc", "derive"], workspace = true } codec = { version = "3.6.1", package = "parity-scale-codec", default-features = false, features = ["derive"] } scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } -hex-literal = { version = "0.4.1", optional = true } frame-benchmarking = { path = "../../../../substrate/frame/benchmarking", default-features = false, optional = true } frame-support = { path = "../../../../substrate/frame/support", default-features = false } @@ -35,12 +34,9 @@ snowbridge-core = { path = "../../primitives/core", default-features = false, fe snowbridge-outbound-queue-merkle-tree = { path = "merkle-tree", default-features = false } ethabi = { package = "ethabi-decode", version = "1.0.0", default-features = false } -xcm = { package = "staging-xcm", path = "../../../../polkadot/xcm", default-features = false } - [dev-dependencies] pallet-message-queue = { path = "../../../../substrate/frame/message-queue", default-features = false } sp-keyring = { path = "../../../../substrate/primitives/keyring" } -hex-literal = { version = "0.4.1" } [features] default = ["std"] @@ -61,7 +57,6 @@ std = [ "sp-io/std", "sp-runtime/std", "sp-std/std", - "xcm/std", ] runtime-benchmarks = [ "bridge-hub-common/runtime-benchmarks", @@ -69,7 +64,6 @@ runtime-benchmarks = [ "frame-benchmarking/runtime-benchmarks", "frame-support/runtime-benchmarks", "frame-system/runtime-benchmarks", - "hex-literal", "pallet-message-queue/runtime-benchmarks", "snowbridge-core/runtime-benchmarks", "sp-runtime/runtime-benchmarks", diff --git a/bridges/snowbridge/pallets/outbound-queue/merkle-tree/Cargo.toml b/bridges/snowbridge/pallets/outbound-queue/merkle-tree/Cargo.toml index c185d5af7062045f40946fcbd3c45cb62b932216..5315d6b4adbc1618720c7e0c781c65353c0ca4d6 100644 --- a/bridges/snowbridge/pallets/outbound-queue/merkle-tree/Cargo.toml +++ b/bridges/snowbridge/pallets/outbound-queue/merkle-tree/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "snowbridge-outbound-queue-merkle-tree" description = "Snowbridge Outbound Queue Merkle Tree" -version = "0.1.1" +version = "0.3.0" authors = ["Snowfork "] edition.workspace = true repository.workspace = true @@ -23,7 +23,7 @@ sp-runtime = { path = "../../../../../substrate/primitives/runtime", default-fea [dev-dependencies] hex-literal = { version = "0.4.1" } -env_logger = "0.9" +env_logger = "0.11" hex = "0.4" array-bytes = "4.1" sp-crypto-hashing = { path = "../../../../../substrate/primitives/crypto/hashing" } diff --git a/bridges/snowbridge/pallets/outbound-queue/runtime-api/Cargo.toml b/bridges/snowbridge/pallets/outbound-queue/runtime-api/Cargo.toml index 347b3bae493b7491790854be7a28f82386d2ee4b..fa49cc0f29a0a161838ab62a1210e33a79f32c59 100644 --- a/bridges/snowbridge/pallets/outbound-queue/runtime-api/Cargo.toml +++ b/bridges/snowbridge/pallets/outbound-queue/runtime-api/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "snowbridge-outbound-queue-runtime-api" description = "Snowbridge Outbound Queue Runtime API" -version = "0.0.0" +version = "0.2.0" authors = ["Snowfork "] edition.workspace = true repository.workspace = true @@ -16,11 +16,9 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { version = "3.1.5", package = "parity-scale-codec", features = ["derive"], default-features = false } -sp-core = { path = "../../../../../substrate/primitives/core", default-features = false } sp-std = { path = "../../../../../substrate/primitives/std", default-features = false } sp-api = { path = "../../../../../substrate/primitives/api", default-features = false } frame-support = { path = "../../../../../substrate/frame/support", default-features = false } -xcm = { package = "staging-xcm", path = "../../../../../polkadot/xcm", default-features = false } snowbridge-outbound-queue-merkle-tree = { path = "../merkle-tree", default-features = false } snowbridge-core = { path = "../../../primitives/core", default-features = false } @@ -32,7 +30,5 @@ std = [ "snowbridge-core/std", "snowbridge-outbound-queue-merkle-tree/std", "sp-api/std", - "sp-core/std", "sp-std/std", - "xcm/std", ] diff --git a/bridges/snowbridge/pallets/outbound-queue/runtime-api/src/lib.rs b/bridges/snowbridge/pallets/outbound-queue/runtime-api/src/lib.rs index 51f46a7b49c8838eddf44d9d3ba18f07b57c5dcd..e6ddaa43935249603d0bee9f852c40e8091471d6 100644 --- a/bridges/snowbridge/pallets/outbound-queue/runtime-api/src/lib.rs +++ b/bridges/snowbridge/pallets/outbound-queue/runtime-api/src/lib.rs @@ -3,7 +3,10 @@ #![cfg_attr(not(feature = "std"), no_std)] use frame_support::traits::tokens::Balance as BalanceT; -use snowbridge_core::outbound::Message; +use snowbridge_core::{ + outbound::{Command, Fee}, + PricingParameters, +}; use snowbridge_outbound_queue_merkle_tree::MerkleProof; sp_api::decl_runtime_apis! { @@ -11,10 +14,10 @@ sp_api::decl_runtime_apis! { { /// Generate a merkle proof for a committed message identified by `leaf_index`. /// The merkle root is stored in the block header as a - /// `\[`sp_runtime::generic::DigestItem::Other`\]` + /// `sp_runtime::generic::DigestItem::Other` fn prove_message(leaf_index: u64) -> Option; - /// Calculate the delivery fee for `message` - fn calculate_fee(message: Message) -> Option; + /// Calculate the delivery fee for `command` + fn calculate_fee(command: Command, parameters: Option>) -> Fee; } } diff --git a/bridges/snowbridge/pallets/outbound-queue/src/api.rs b/bridges/snowbridge/pallets/outbound-queue/src/api.rs index 44d63f1e2d23f48f3d13d7834de5cde8d2c78dfc..b904819b1b186e176976b82a4fadd1ced0f05ed1 100644 --- a/bridges/snowbridge/pallets/outbound-queue/src/api.rs +++ b/bridges/snowbridge/pallets/outbound-queue/src/api.rs @@ -4,8 +4,12 @@ use crate::{Config, MessageLeaves}; use frame_support::storage::StorageStreamIter; -use snowbridge_core::outbound::{Message, SendMessage}; +use snowbridge_core::{ + outbound::{Command, Fee, GasMeter}, + PricingParameters, +}; use snowbridge_outbound_queue_merkle_tree::{merkle_proof, MerkleProof}; +use sp_core::Get; pub fn prove_message(leaf_index: u64) -> Option where @@ -19,12 +23,14 @@ where Some(proof) } -pub fn calculate_fee(message: Message) -> Option +pub fn calculate_fee( + command: Command, + parameters: Option>, +) -> Fee where T: Config, { - match crate::Pallet::::validate(&message) { - Ok((_, fees)) => Some(fees.total()), - _ => None, - } + let gas_used_at_most = T::GasMeter::maximum_gas_used_at_most(&command); + let parameters = parameters.unwrap_or(T::PricingParameters::get()); + crate::Pallet::::calculate_fee(gas_used_at_most, parameters) } diff --git a/bridges/snowbridge/pallets/outbound-queue/src/lib.rs b/bridges/snowbridge/pallets/outbound-queue/src/lib.rs index 9e949a4791a8a64d4c36f3f78628279c367939f8..9b9dbe854a5ee51e4182b39a617824dd02d0b3b5 100644 --- a/bridges/snowbridge/pallets/outbound-queue/src/lib.rs +++ b/bridges/snowbridge/pallets/outbound-queue/src/lib.rs @@ -47,24 +47,37 @@ //! consume on Ethereum. Using this upper bound, a final fee can be calculated. //! //! The fee calculation also requires the following parameters: -//! * ETH/DOT exchange rate -//! * Ether fee per unit of gas +//! * Average ETH/DOT exchange rate over some period +//! * Max fee per unit of gas that bridge is willing to refund relayers for //! //! By design, it is expected that governance should manually update these //! parameters every few weeks using the `set_pricing_parameters` extrinsic in the //! system pallet. //! +//! This is an interim measure. Once ETH/DOT liquidity pools are available in the Polkadot network, +//! we'll use them as a source of pricing info, subject to certain safeguards. +//! //! ## Fee Computation Function //! //! ```text //! LocalFee(Message) = WeightToFee(ProcessMessageWeight(Message)) -//! RemoteFee(Message) = MaxGasRequired(Message) * FeePerGas + Reward -//! Fee(Message) = LocalFee(Message) + (RemoteFee(Message) / Ratio("ETH/DOT")) +//! RemoteFee(Message) = MaxGasRequired(Message) * Params.MaxFeePerGas + Params.Reward +//! RemoteFeeAdjusted(Message) = Params.Multiplier * (RemoteFee(Message) / Params.Ratio("ETH/DOT")) +//! Fee(Message) = LocalFee(Message) + RemoteFeeAdjusted(Message) //! ``` //! -//! By design, the computed fee is always going to conservative, to cover worst-case -//! costs of dispatch on Ethereum. In future iterations of the design, we will optimize -//! this, or provide a mechanism to asynchronously refund a portion of collected fees. +//! By design, the computed fee includes a safety factor (the `Multiplier`) to cover +//! unfavourable fluctuations in the ETH/DOT exchange rate. +//! +//! ## Fee Settlement +//! +//! On the remote side, in the gateway contract, the relayer accrues +//! +//! ```text +//! Min(GasPrice, Message.MaxFeePerGas) * GasUsed() + Message.Reward +//! ``` +//! Or in plain english, relayers are refunded for gas consumption, using a +//! price that is a minimum of the actual gas price, or `Message.MaxFeePerGas`. //! //! # Extrinsics //! @@ -106,7 +119,7 @@ pub use snowbridge_outbound_queue_merkle_tree::MerkleProof; use sp_core::{H256, U256}; use sp_runtime::{ traits::{CheckedDiv, Hash}, - DigestItem, + DigestItem, Saturating, }; use sp_std::prelude::*; pub use types::{CommittedMessage, ProcessMessageOriginOf}; @@ -366,8 +379,9 @@ pub mod pallet { // downcast to u128 let fee: u128 = fee.try_into().defensive_unwrap_or(u128::MAX); - // convert to local currency + // multiply by multiplier and convert to local currency let fee = FixedU128::from_inner(fee) + .saturating_mul(params.multiplier) .checked_div(¶ms.exchange_rate) .expect("exchange rate is not zero; qed") .into_inner(); diff --git a/bridges/snowbridge/pallets/outbound-queue/src/mock.rs b/bridges/snowbridge/pallets/outbound-queue/src/mock.rs index dd8fee4e2ed08ec0f3090b765fa882b063a98300..5eeeeead140018e81a8aaaf302d678e3a4321e08 100644 --- a/bridges/snowbridge/pallets/outbound-queue/src/mock.rs +++ b/bridges/snowbridge/pallets/outbound-queue/src/mock.rs @@ -3,7 +3,7 @@ use super::*; use frame_support::{ - parameter_types, + derive_impl, parameter_types, traits::{Everything, Hooks}, weights::IdentityFee, }; @@ -37,10 +37,9 @@ parameter_types! { pub const BlockHashCount: u64 = 250; } +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { type BaseCallFilter = Everything; - type BlockWeights = (); - type BlockLength = (); type RuntimeOrigin = RuntimeOrigin; type RuntimeCall = RuntimeCall; type RuntimeTask = RuntimeTask; @@ -50,16 +49,7 @@ impl frame_system::Config for Test { type Lookup = IdentityLookup; type RuntimeEvent = RuntimeEvent; type BlockHashCount = BlockHashCount; - type DbWeight = (); - type Version = (); type PalletInfo = PalletInfo; - type AccountData = (); - type OnNewAccount = (); - type OnKilledAccount = (); - type SystemWeightInfo = (); - type SS58Prefix = (); - type OnSetCode = (); - type MaxConsumers = frame_support::traits::ConstU32<16>; type Nonce = u64; type Block = Block; } @@ -79,6 +69,7 @@ impl pallet_message_queue::Config for Test { type HeapSize = HeapSize; type MaxStale = MaxStale; type ServiceWeight = ServiceWeight; + type IdleMaxServiceWeight = (); type QueuePausedQuery = (); } @@ -87,7 +78,8 @@ parameter_types! { pub Parameters: PricingParameters = PricingParameters { exchange_rate: FixedU128::from_rational(1, 400), fee_per_gas: gwei(20), - rewards: Rewards { local: DOT, remote: meth(1) } + rewards: Rewards { local: DOT, remote: meth(1) }, + multiplier: FixedU128::from_rational(4, 3), }; } diff --git a/bridges/snowbridge/pallets/outbound-queue/src/test.rs b/bridges/snowbridge/pallets/outbound-queue/src/test.rs index 8ed4a318d68e99181e7f1e0793cc66e23829132a..4e9ea36e24bc1a4e8bb22677d55e7b8a55e6ccf9 100644 --- a/bridges/snowbridge/pallets/outbound-queue/src/test.rs +++ b/bridges/snowbridge/pallets/outbound-queue/src/test.rs @@ -268,28 +268,34 @@ fn encode_digest_item() { } #[test] -fn validate_messages_with_fees() { +fn test_calculate_fees_with_unit_multiplier() { new_tester().execute_with(|| { - let message = mock_message(1000); - let (_, fee) = OutboundQueue::validate(&message).unwrap(); + let gas_used: u64 = 250000; + let price_params: PricingParameters<::Balance> = PricingParameters { + exchange_rate: FixedU128::from_rational(1, 400), + fee_per_gas: 10000_u32.into(), + rewards: Rewards { local: 1_u32.into(), remote: 1_u32.into() }, + multiplier: FixedU128::from_rational(1, 1), + }; + let fee = OutboundQueue::calculate_fee(gas_used, price_params); assert_eq!(fee.local, 698000000); - assert_eq!(fee.remote, 2680000000000); + assert_eq!(fee.remote, 1000000); }); } #[test] -fn test_calculate_fees() { +fn test_calculate_fees_with_multiplier() { new_tester().execute_with(|| { let gas_used: u64 = 250000; - let illegal_price_params: PricingParameters<::Balance> = - PricingParameters { - exchange_rate: FixedU128::from_rational(1, 400), - fee_per_gas: 10000_u32.into(), - rewards: Rewards { local: 1_u32.into(), remote: 1_u32.into() }, - }; - let fee = OutboundQueue::calculate_fee(gas_used, illegal_price_params); + let price_params: PricingParameters<::Balance> = PricingParameters { + exchange_rate: FixedU128::from_rational(1, 400), + fee_per_gas: 10000_u32.into(), + rewards: Rewards { local: 1_u32.into(), remote: 1_u32.into() }, + multiplier: FixedU128::from_rational(4, 3), + }; + let fee = OutboundQueue::calculate_fee(gas_used, price_params); assert_eq!(fee.local, 698000000); - assert_eq!(fee.remote, 1000000); + assert_eq!(fee.remote, 1333333); }); } @@ -297,13 +303,13 @@ fn test_calculate_fees() { fn test_calculate_fees_with_valid_exchange_rate_but_remote_fee_calculated_as_zero() { new_tester().execute_with(|| { let gas_used: u64 = 250000; - let illegal_price_params: PricingParameters<::Balance> = - PricingParameters { - exchange_rate: FixedU128::from_rational(1, 1), - fee_per_gas: 1_u32.into(), - rewards: Rewards { local: 1_u32.into(), remote: 1_u32.into() }, - }; - let fee = OutboundQueue::calculate_fee(gas_used, illegal_price_params.clone()); + let price_params: PricingParameters<::Balance> = PricingParameters { + exchange_rate: FixedU128::from_rational(1, 1), + fee_per_gas: 1_u32.into(), + rewards: Rewards { local: 1_u32.into(), remote: 1_u32.into() }, + multiplier: FixedU128::from_rational(1, 1), + }; + let fee = OutboundQueue::calculate_fee(gas_used, price_params.clone()); assert_eq!(fee.local, 698000000); // Though none zero pricing params the remote fee calculated here is invalid // which should be avoided diff --git a/bridges/snowbridge/pallets/system/Cargo.toml b/bridges/snowbridge/pallets/system/Cargo.toml index aa600511633bb7d5fef36f8d4ae6cec847c4e6c4..c1ee44214c84a81dd9c4727bf81be93d5375c50c 100644 --- a/bridges/snowbridge/pallets/system/Cargo.toml +++ b/bridges/snowbridge/pallets/system/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "snowbridge-pallet-system" description = "Snowbridge System Pallet" -version = "0.0.0" +version = "0.2.0" authors = ["Snowfork "] edition.workspace = true repository.workspace = true @@ -22,7 +22,7 @@ scale-info = { version = "2.9.0", default-features = false, features = ["derive" frame-benchmarking = { path = "../../../../substrate/frame/benchmarking", default-features = false, optional = true } frame-support = { path = "../../../../substrate/frame/support", default-features = false } frame-system = { path = "../../../../substrate/frame/system", default-features = false } -log = { version = "0.4.20", default-features = false } +log = { workspace = true } sp-core = { path = "../../../../substrate/primitives/core", default-features = false } sp-std = { path = "../../../../substrate/primitives/std", default-features = false } @@ -30,10 +30,8 @@ sp-io = { path = "../../../../substrate/primitives/io", default-features = false sp-runtime = { path = "../../../../substrate/primitives/runtime", default-features = false } xcm = { package = "staging-xcm", path = "../../../../polkadot/xcm", default-features = false } -xcm-builder = { package = "staging-xcm-builder", path = "../../../../polkadot/xcm/xcm-builder", default-features = false } xcm-executor = { package = "staging-xcm-executor", path = "../../../../polkadot/xcm/xcm-executor", default-features = false } -ethabi = { package = "ethabi-decode", version = "1.0.0", default-features = false } snowbridge-core = { path = "../../primitives/core", default-features = false } [dev-dependencies] @@ -49,7 +47,6 @@ snowbridge-pallet-outbound-queue = { path = "../outbound-queue" } default = ["std"] std = [ "codec/std", - "ethabi/std", "frame-benchmarking?/std", "frame-support/std", "frame-system/std", @@ -60,7 +57,6 @@ std = [ "sp-io/std", "sp-runtime/std", "sp-std/std", - "xcm-builder/std", "xcm-executor/std", "xcm/std", ] @@ -74,7 +70,6 @@ runtime-benchmarks = [ "snowbridge-core/runtime-benchmarks", "snowbridge-pallet-outbound-queue/runtime-benchmarks", "sp-runtime/runtime-benchmarks", - "xcm-builder/runtime-benchmarks", "xcm-executor/runtime-benchmarks", ] try-runtime = [ diff --git a/bridges/snowbridge/pallets/system/runtime-api/Cargo.toml b/bridges/snowbridge/pallets/system/runtime-api/Cargo.toml index 355d2d29147f3cd84ae013363db874c9b9739b8e..4073dc0f71c2096edce47a0857cd70cf969affed 100644 --- a/bridges/snowbridge/pallets/system/runtime-api/Cargo.toml +++ b/bridges/snowbridge/pallets/system/runtime-api/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "snowbridge-system-runtime-api" description = "Snowbridge System Runtime API" -version = "0.0.0" +version = "0.2.0" authors = ["Snowfork "] edition.workspace = true repository.workspace = true @@ -18,7 +18,6 @@ targets = ["x86_64-unknown-linux-gnu"] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = [ "derive", ] } -sp-core = { path = "../../../../../substrate/primitives/core", default-features = false } sp-std = { path = "../../../../../substrate/primitives/std", default-features = false } sp-api = { path = "../../../../../substrate/primitives/api", default-features = false } xcm = { package = "staging-xcm", path = "../../../../../polkadot/xcm", default-features = false } @@ -30,7 +29,6 @@ std = [ "codec/std", "snowbridge-core/std", "sp-api/std", - "sp-core/std", "sp-std/std", "xcm/std", ] diff --git a/bridges/snowbridge/pallets/system/src/lib.rs b/bridges/snowbridge/pallets/system/src/lib.rs index b7f38fb753d31bd67acb78174e175f90fc711175..39c73e3630e7b425e46252943a44d10bfe1cebc7 100644 --- a/bridges/snowbridge/pallets/system/src/lib.rs +++ b/bridges/snowbridge/pallets/system/src/lib.rs @@ -37,8 +37,6 @@ //! `force_update_channel` and extrinsics to manage agents and channels for system parachains. #![cfg_attr(not(feature = "std"), no_std)] -pub use pallet::*; - #[cfg(test)] mod mock; @@ -79,6 +77,8 @@ use xcm_executor::traits::ConvertLocation; #[cfg(feature = "runtime-benchmarks")] use frame_support::traits::OriginTrait; +pub use pallet::*; + pub type BalanceOf = <::Token as Inspect<::AccountId>>::Balance; pub type AccountIdOf = ::AccountId; @@ -159,6 +159,7 @@ pub mod pallet { type DefaultPricingParameters: Get>; /// Cost of delivering a message from Ethereum + #[pallet::constant] type InboundDeliveryCost: Get>; type WeightInfo: WeightInfo; @@ -334,6 +335,7 @@ pub mod pallet { let command = Command::SetPricingParameters { exchange_rate: params.exchange_rate.into(), delivery_cost: T::InboundDeliveryCost::get().saturated_into::(), + multiplier: params.multiplier.into(), }; Self::send(PRIMARY_GOVERNANCE_CHANNEL, command, PaysFee::::No)?; diff --git a/bridges/snowbridge/pallets/system/src/mock.rs b/bridges/snowbridge/pallets/system/src/mock.rs index edc3f141b0735d7439b120c51da836fb8a77bd04..687072a49e2e5ca9e27d7f1be94ea89564c2275f 100644 --- a/bridges/snowbridge/pallets/system/src/mock.rs +++ b/bridges/snowbridge/pallets/system/src/mock.rs @@ -2,8 +2,8 @@ // SPDX-FileCopyrightText: 2023 Snowfork use crate as snowbridge_system; use frame_support::{ - parameter_types, - traits::{tokens::fungible::Mutate, ConstU128, ConstU16, ConstU64, ConstU8}, + derive_impl, parameter_types, + traits::{tokens::fungible::Mutate, ConstU128, ConstU64, ConstU8}, weights::IdentityFee, PalletId, }; @@ -95,11 +95,9 @@ frame_support::construct_runtime!( } ); +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { type BaseCallFilter = frame_support::traits::Everything; - type BlockWeights = (); - type BlockLength = (); - type DbWeight = (); type RuntimeOrigin = RuntimeOrigin; type RuntimeCall = RuntimeCall; type RuntimeTask = RuntimeTask; @@ -109,15 +107,8 @@ impl frame_system::Config for Test { type Lookup = IdentityLookup; type RuntimeEvent = RuntimeEvent; type BlockHashCount = ConstU64<250>; - type Version = (); type PalletInfo = PalletInfo; type AccountData = pallet_balances::AccountData; - type OnNewAccount = (); - type OnKilledAccount = (); - type SystemWeightInfo = (); - type SS58Prefix = ConstU16<42>; - type OnSetCode = (); - type MaxConsumers = frame_support::traits::ConstU32<16>; type Nonce = u64; type Block = Block; } @@ -157,6 +148,7 @@ impl pallet_message_queue::Config for Test { type HeapSize = HeapSize; type MaxStale = MaxStale; type ServiceWeight = ServiceWeight; + type IdleMaxServiceWeight = (); type QueuePausedQuery = (); } @@ -202,7 +194,8 @@ parameter_types! { pub Parameters: PricingParameters = PricingParameters { exchange_rate: FixedU128::from_rational(1, 400), fee_per_gas: gwei(20), - rewards: Rewards { local: DOT, remote: meth(1) } + rewards: Rewards { local: DOT, remote: meth(1) }, + multiplier: FixedU128::from_rational(4, 3) }; pub const InboundDeliveryCost: u128 = 1_000_000_000; diff --git a/bridges/snowbridge/primitives/beacon/Cargo.toml b/bridges/snowbridge/primitives/beacon/Cargo.toml index b59e5191b418753fc3eb1a2342194af4efc311c3..7d901bcdb04493ea3103150c7dfeff0a32814269 100644 --- a/bridges/snowbridge/primitives/beacon/Cargo.toml +++ b/bridges/snowbridge/primitives/beacon/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "snowbridge-beacon-primitives" description = "Snowbridge Beacon Primitives" -version = "0.0.0" +version = "0.2.0" authors = ["Snowfork "] edition.workspace = true repository.workspace = true @@ -12,14 +12,13 @@ categories = ["cryptography::cryptocurrencies"] workspace = true [dependencies] -serde = { version = "1.0.195", optional = true, features = ["derive"] } +serde = { optional = true, features = ["derive"], workspace = true, default-features = true } hex = { version = "0.4", default-features = false } codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false } scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } rlp = { version = "0.5", default-features = false } frame-support = { path = "../../../../substrate/frame/support", default-features = false } -frame-system = { path = "../../../../substrate/frame/system", default-features = false } sp-runtime = { path = "../../../../substrate/primitives/runtime", default-features = false } sp-core = { path = "../../../../substrate/primitives/core", default-features = false } sp-std = { path = "../../../../substrate/primitives/std", default-features = false } @@ -30,7 +29,6 @@ ssz_rs_derive = { version = "0.9.0", default-features = false } byte-slice-cast = { version = "1.2.1", default-features = false } snowbridge-ethereum = { path = "../ethereum", default-features = false } -static_assertions = { version = "1.1.0" } milagro-bls = { package = "snowbridge-milagro-bls", version = "1.5.4", default-features = false } [dev-dependencies] @@ -42,7 +40,6 @@ std = [ "byte-slice-cast/std", "codec/std", "frame-support/std", - "frame-system/std", "hex/std", "milagro-bls/std", "rlp/std", diff --git a/bridges/snowbridge/primitives/beacon/src/lib.rs b/bridges/snowbridge/primitives/beacon/src/lib.rs index 4c569d0176c21882aa3875024551848b1cc97494..6579d0f60966e1aff54583457e5fe31f7fded8b6 100644 --- a/bridges/snowbridge/primitives/beacon/src/lib.rs +++ b/bridges/snowbridge/primitives/beacon/src/lib.rs @@ -15,12 +15,12 @@ pub mod updates; mod serde_utils; pub use types::{ - BeaconHeader, CompactBeaconState, CompactExecutionHeader, ExecutionHeaderState, - ExecutionPayloadHeader, FinalizedHeaderState, Fork, ForkData, ForkVersion, ForkVersions, Mode, - PublicKey, Signature, SigningData, SyncAggregate, SyncCommittee, SyncCommitteePrepared, + AncestryProof, BeaconHeader, CompactBeaconState, ExecutionPayloadHeader, ExecutionProof, + FinalizedHeaderState, Fork, ForkData, ForkVersion, ForkVersions, Mode, PublicKey, Signature, + SigningData, SyncAggregate, SyncCommittee, SyncCommitteePrepared, VersionedExecutionPayloadHeader, }; -pub use updates::{CheckpointUpdate, ExecutionHeaderUpdate, NextSyncCommitteeUpdate, Update}; +pub use updates::{CheckpointUpdate, NextSyncCommitteeUpdate, Update}; pub use bits::decompress_sync_committee_bits; pub use bls::{ diff --git a/bridges/snowbridge/primitives/beacon/src/types.rs b/bridges/snowbridge/primitives/beacon/src/types.rs index 2af522f56b0dc4b00a155252e927a90e9bca9ed1..e12350510c9b83c85e27ecfa1534b984ff23fb05 100644 --- a/bridges/snowbridge/primitives/beacon/src/types.rs +++ b/bridges/snowbridge/primitives/beacon/src/types.rs @@ -110,14 +110,6 @@ impl<'de> Deserialize<'de> for Signature { } } -#[derive(Copy, Clone, Default, Encode, Decode, TypeInfo, MaxEncodedLen)] -pub struct ExecutionHeaderState { - pub beacon_block_root: H256, - pub beacon_slot: u64, - pub block_hash: H256, - pub block_number: u64, -} - #[derive(Copy, Clone, Default, Encode, Decode, TypeInfo, MaxEncodedLen)] pub struct FinalizedHeaderState { pub beacon_block_root: H256, @@ -346,35 +338,6 @@ impl ExecutionPayloadHeader { } } -#[derive( - Default, - Encode, - Decode, - CloneNoBound, - PartialEqNoBound, - RuntimeDebugNoBound, - TypeInfo, - MaxEncodedLen, -)] -pub struct CompactExecutionHeader { - pub parent_hash: H256, - #[codec(compact)] - pub block_number: u64, - pub state_root: H256, - pub receipts_root: H256, -} - -impl From for CompactExecutionHeader { - fn from(execution_payload: ExecutionPayloadHeader) -> Self { - Self { - parent_hash: execution_payload.parent_hash, - block_number: execution_payload.block_number, - state_root: execution_payload.state_root, - receipts_root: execution_payload.receipts_root, - } - } -} - #[derive( Default, Encode, @@ -405,18 +368,6 @@ pub enum VersionedExecutionPayloadHeader { Deneb(deneb::ExecutionPayloadHeader), } -/// Convert VersionedExecutionPayloadHeader to CompactExecutionHeader -impl From for CompactExecutionHeader { - fn from(versioned_execution_header: VersionedExecutionPayloadHeader) -> Self { - match versioned_execution_header { - VersionedExecutionPayloadHeader::Capella(execution_payload_header) => - execution_payload_header.into(), - VersionedExecutionPayloadHeader::Deneb(execution_payload_header) => - execution_payload_header.into(), - } - } -} - impl VersionedExecutionPayloadHeader { pub fn hash_tree_root(&self) -> Result { match self { @@ -448,6 +399,45 @@ impl VersionedExecutionPayloadHeader { execution_payload_header.block_number, } } + + pub fn receipts_root(&self) -> H256 { + match self { + VersionedExecutionPayloadHeader::Capella(execution_payload_header) => + execution_payload_header.receipts_root, + VersionedExecutionPayloadHeader::Deneb(execution_payload_header) => + execution_payload_header.receipts_root, + } + } +} + +#[derive(Encode, Decode, CloneNoBound, PartialEqNoBound, RuntimeDebugNoBound, TypeInfo)] +#[cfg_attr( + feature = "std", + derive(serde::Deserialize), + serde(deny_unknown_fields, bound(serialize = ""), bound(deserialize = "")) +)] +pub struct ExecutionProof { + /// Header for the beacon block containing the execution payload + pub header: BeaconHeader, + /// Proof that `header` is an ancestor of a finalized header + pub ancestry_proof: Option, + /// The execution header to be verified + pub execution_header: VersionedExecutionPayloadHeader, + /// Merkle proof that execution payload is contained within `header` + pub execution_branch: Vec, +} + +#[derive(Encode, Decode, CloneNoBound, PartialEqNoBound, RuntimeDebugNoBound, TypeInfo)] +#[cfg_attr( + feature = "std", + derive(serde::Deserialize), + serde(deny_unknown_fields, bound(serialize = ""), bound(deserialize = "")) +)] +pub struct AncestryProof { + /// Merkle proof that `header` is an ancestor of `finalized_header` + pub header_branch: Vec, + /// Root of a finalized block that has already been imported into the light client + pub finalized_block_root: H256, } #[cfg(test)] @@ -576,7 +566,6 @@ pub enum Mode { } pub mod deneb { - use crate::CompactExecutionHeader; use codec::{Decode, Encode}; use frame_support::{CloneNoBound, PartialEqNoBound, RuntimeDebugNoBound}; use scale_info::TypeInfo; @@ -627,15 +616,4 @@ pub mod deneb { pub blob_gas_used: u64, // [New in Deneb:EIP4844] pub excess_blob_gas: u64, // [New in Deneb:EIP4844] } - - impl From for CompactExecutionHeader { - fn from(execution_payload: ExecutionPayloadHeader) -> Self { - Self { - parent_hash: execution_payload.parent_hash, - block_number: execution_payload.block_number, - state_root: execution_payload.state_root, - receipts_root: execution_payload.receipts_root, - } - } - } } diff --git a/bridges/snowbridge/primitives/beacon/src/updates.rs b/bridges/snowbridge/primitives/beacon/src/updates.rs index 1ecd32c6d7b79f34854d9387fba78b99cce333b2..ca651b5806f270f85d830c218c53cb6a509cc6f4 100644 --- a/bridges/snowbridge/primitives/beacon/src/updates.rs +++ b/bridges/snowbridge/primitives/beacon/src/updates.rs @@ -6,7 +6,7 @@ use scale_info::TypeInfo; use sp_core::H256; use sp_std::prelude::*; -use crate::types::{BeaconHeader, SyncAggregate, SyncCommittee, VersionedExecutionPayloadHeader}; +use crate::types::{BeaconHeader, SyncAggregate, SyncCommittee}; #[derive(Encode, Decode, CloneNoBound, PartialEqNoBound, RuntimeDebugNoBound, TypeInfo)] #[cfg_attr( @@ -23,26 +23,13 @@ pub struct CheckpointUpdate { pub block_roots_branch: Vec, } -impl Default for CheckpointUpdate { - fn default() -> Self { - CheckpointUpdate { - header: Default::default(), - current_sync_committee: Default::default(), - current_sync_committee_branch: Default::default(), - validators_root: Default::default(), - block_roots_root: Default::default(), - block_roots_branch: Default::default(), - } - } -} - #[derive( Default, Encode, Decode, CloneNoBound, PartialEqNoBound, RuntimeDebugNoBound, TypeInfo, )] #[cfg_attr( feature = "std", derive(serde::Deserialize), - serde(deny_unknown_fields, bound(serialize = ""), bound(deserialize = "")) + serde(bound(serialize = ""), bound(deserialize = "")) )] pub struct Update { /// A recent header attesting to the finalized header, using its `state_root`. @@ -78,33 +65,3 @@ pub struct NextSyncCommitteeUpdate { pub next_sync_committee: SyncCommittee, pub next_sync_committee_branch: Vec, } - -#[derive(Encode, Decode, CloneNoBound, PartialEqNoBound, RuntimeDebugNoBound, TypeInfo)] -#[cfg_attr( - feature = "std", - derive(serde::Deserialize), - serde(deny_unknown_fields, bound(serialize = ""), bound(deserialize = "")) -)] -pub struct ExecutionHeaderUpdate { - /// Header for the beacon block containing the execution payload - pub header: BeaconHeader, - /// Proof that `header` is an ancestor of a finalized header - pub ancestry_proof: Option, - /// Execution header to be imported - pub execution_header: VersionedExecutionPayloadHeader, - /// Merkle proof that execution payload is contained within `header` - pub execution_branch: Vec, -} - -#[derive(Encode, Decode, CloneNoBound, PartialEqNoBound, RuntimeDebugNoBound, TypeInfo)] -#[cfg_attr( - feature = "std", - derive(serde::Deserialize), - serde(deny_unknown_fields, bound(serialize = ""), bound(deserialize = "")) -)] -pub struct AncestryProof { - /// Merkle proof that `header` is an ancestor of `finalized_header` - pub header_branch: Vec, - /// Root of a finalized block that has already been imported into the light client - pub finalized_block_root: H256, -} diff --git a/bridges/snowbridge/primitives/core/Cargo.toml b/bridges/snowbridge/primitives/core/Cargo.toml index f735d01a848fb15ced0f086b8b7117e6e771c688..9a299ad0ae92326a6d0bb0391baf81e6e5bad663 100644 --- a/bridges/snowbridge/primitives/core/Cargo.toml +++ b/bridges/snowbridge/primitives/core/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "snowbridge-core" description = "Snowbridge Core" -version = "0.0.0" +version = "0.2.0" authors = ["Snowfork "] edition.workspace = true repository.workspace = true @@ -12,7 +12,7 @@ categories = ["cryptography::cryptocurrencies"] workspace = true [dependencies] -serde = { version = "1.0.195", optional = true, features = ["alloc", "derive"], default-features = false } +serde = { optional = true, features = ["alloc", "derive"], workspace = true } codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false } scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } hex-literal = { version = "0.4.1" } diff --git a/bridges/snowbridge/primitives/core/src/inbound.rs b/bridges/snowbridge/primitives/core/src/inbound.rs index 4b04470ad02615d86f1a1c530f3cbed809649328..9e8ed789ab500917eb520176fdf39343a65838da 100644 --- a/bridges/snowbridge/primitives/core/src/inbound.rs +++ b/bridges/snowbridge/primitives/core/src/inbound.rs @@ -5,6 +5,7 @@ use codec::{Decode, Encode}; use frame_support::PalletError; use scale_info::TypeInfo; +use snowbridge_beacon_primitives::{BeaconHeader, ExecutionProof}; use sp_core::{H160, H256}; use sp_runtime::RuntimeDebug; use sp_std::vec::Vec; @@ -25,6 +26,8 @@ pub enum VerificationError { InvalidLog, /// Unable to verify the transaction receipt with the provided proof InvalidProof, + /// Unable to verify the execution header with ancestry proof + InvalidExecutionProof(#[codec(skip)] &'static str), } pub type MessageNonce = u64; @@ -65,10 +68,15 @@ impl Log { /// Inclusion proof for a transaction receipt #[derive(Clone, Encode, Decode, PartialEq, RuntimeDebug, TypeInfo)] pub struct Proof { - // The block hash of the block in which the receipt was included. - pub block_hash: H256, - // The index of the transaction (and receipt) within the block. - pub tx_index: u32, // Proof keys and values (receipts tree) - pub data: (Vec>, Vec>), + pub receipt_proof: (Vec>, Vec>), + // Proof that an execution header was finalized by the beacon chain + pub execution_proof: ExecutionProof, +} + +#[derive(Clone, RuntimeDebug)] +pub struct InboundQueueFixture { + pub message: Message, + pub finalized_header: BeaconHeader, + pub block_roots_root: H256, } diff --git a/bridges/snowbridge/primitives/core/src/outbound.rs b/bridges/snowbridge/primitives/core/src/outbound.rs index bce123878d3a456fc8b50f841cd64516a5d58dee..0ba0fdb61089e9bd77f162a87bcf7f78842bae5c 100644 --- a/bridges/snowbridge/primitives/core/src/outbound.rs +++ b/bridges/snowbridge/primitives/core/src/outbound.rs @@ -136,6 +136,8 @@ mod v1 { exchange_rate: UD60x18, // Cost of delivering a message from Ethereum to BridgeHub, in ROC/KSM/DOT delivery_cost: u128, + // Fee multiplier + multiplier: UD60x18, }, } @@ -203,10 +205,11 @@ mod v1 { Token::Uint(U256::from(*transfer_asset_xcm)), Token::Uint(*register_token), ])]), - Command::SetPricingParameters { exchange_rate, delivery_cost } => + Command::SetPricingParameters { exchange_rate, delivery_cost, multiplier } => ethabi::encode(&[Token::Tuple(vec![ Token::Uint(exchange_rate.clone().into_inner()), Token::Uint(U256::from(*delivery_cost)), + Token::Uint(multiplier.clone().into_inner()), ])]), } } @@ -273,7 +276,8 @@ mod v1 { } } -#[cfg_attr(feature = "std", derive(PartialEq, Debug))] +#[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo)] +#[cfg_attr(feature = "std", derive(PartialEq))] /// Fee for delivering message pub struct Fee where @@ -346,12 +350,13 @@ pub trait GasMeter { /// the command within the message const MAXIMUM_BASE_GAS: u64; + /// Total gas consumed at most, including verification & dispatch fn maximum_gas_used_at_most(command: &Command) -> u64 { Self::MAXIMUM_BASE_GAS + Self::maximum_dispatch_gas_used_at_most(command) } - /// Measures the maximum amount of gas a command payload will require to dispatch, AFTER - /// validation & verification. + /// Measures the maximum amount of gas a command payload will require to *dispatch*, NOT + /// including validation & verification. fn maximum_dispatch_gas_used_at_most(command: &Command) -> u64; } diff --git a/bridges/snowbridge/primitives/core/src/pricing.rs b/bridges/snowbridge/primitives/core/src/pricing.rs index 33aeda6d15c4701ce4594b1e783d7aa69f84cc8e..0f392c7ad4bdde9c4bed812b995b039816c8977c 100644 --- a/bridges/snowbridge/primitives/core/src/pricing.rs +++ b/bridges/snowbridge/primitives/core/src/pricing.rs @@ -13,6 +13,8 @@ pub struct PricingParameters { pub rewards: Rewards, /// Ether (wei) fee per gas unit pub fee_per_gas: U256, + /// Fee multiplier + pub multiplier: FixedU128, } #[derive(Clone, Encode, Decode, PartialEq, RuntimeDebug, MaxEncodedLen, TypeInfo)] @@ -43,6 +45,9 @@ where if self.rewards.remote.is_zero() { return Err(InvalidPricingParameters) } + if self.multiplier == FixedU128::zero() { + return Err(InvalidPricingParameters) + } Ok(()) } } diff --git a/bridges/snowbridge/primitives/ethereum/Cargo.toml b/bridges/snowbridge/primitives/ethereum/Cargo.toml index 047ebdd56695b1b42768da7108c75ce4c15b4fb4..d72cd2661733b516a6a9b8102782b4d8d5c40e36 100644 --- a/bridges/snowbridge/primitives/ethereum/Cargo.toml +++ b/bridges/snowbridge/primitives/ethereum/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "snowbridge-ethereum" description = "Snowbridge Ethereum" -version = "0.1.0" +version = "0.3.0" authors = ["Snowfork "] edition.workspace = true repository.workspace = true @@ -12,20 +12,18 @@ categories = ["cryptography::cryptocurrencies"] workspace = true [dependencies] -serde = { version = "1.0.195", optional = true, features = ["derive"] } -serde-big-array = { version = "0.3.2", optional = true, features = ["const-generics"] } +serde = { optional = true, features = ["derive"], workspace = true, default-features = true } +serde-big-array = { optional = true, features = ["const-generics"], workspace = true } codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } ethbloom = { version = "0.13.0", default-features = false } ethereum-types = { version = "0.14.1", default-features = false, features = ["codec", "rlp", "serialize"] } -hex = { package = "rustc-hex", version = "2.1.0", default-features = false } hex-literal = { version = "0.4.1", default-features = false } parity-bytes = { version = "0.1.2", default-features = false } rlp = { version = "0.5.2", default-features = false } sp-io = { path = "../../../../substrate/primitives/io", default-features = false } sp-std = { path = "../../../../substrate/primitives/std", default-features = false } -sp-core = { path = "../../../../substrate/primitives/core", default-features = false } sp-runtime = { path = "../../../../substrate/primitives/runtime", default-features = false } ethabi = { package = "ethabi-decode", version = "1.0.0", default-features = false } @@ -33,7 +31,7 @@ ethabi = { package = "ethabi-decode", version = "1.0.0", default-features = fals [dev-dependencies] wasm-bindgen-test = "0.3.19" rand = "0.8.5" -serde_json = "1.0.111" +serde_json = { workspace = true, default-features = true } [features] default = ["std"] @@ -43,13 +41,11 @@ std = [ "ethabi/std", "ethbloom/std", "ethereum-types/std", - "hex/std", "parity-bytes/std", "rlp/std", "scale-info/std", "serde", "serde-big-array", - "sp-core/std", "sp-io/std", "sp-runtime/std", "sp-std/std", diff --git a/bridges/snowbridge/primitives/router/Cargo.toml b/bridges/snowbridge/primitives/router/Cargo.toml index 712c60c2148f60f12e2be246e32242b67188bdaf..361b539af3e350a29871e82a76265de072bbf779 100644 --- a/bridges/snowbridge/primitives/router/Cargo.toml +++ b/bridges/snowbridge/primitives/router/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "snowbridge-router-primitives" description = "Snowbridge Router Primitives" -version = "0.0.0" +version = "0.9.0" authors = ["Snowfork "] edition.workspace = true repository.workspace = true @@ -12,26 +12,21 @@ categories = ["cryptography::cryptocurrencies"] workspace = true [dependencies] -serde = { version = "1.0.195", optional = true, features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false } scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } -log = { version = "0.4.20", default-features = false } +log = { workspace = true } frame-support = { path = "../../../../substrate/frame/support", default-features = false } -frame-system = { path = "../../../../substrate/frame/system", default-features = false } sp-core = { path = "../../../../substrate/primitives/core", default-features = false } sp-io = { path = "../../../../substrate/primitives/io", default-features = false } sp-runtime = { path = "../../../../substrate/primitives/runtime", default-features = false } sp-std = { path = "../../../../substrate/primitives/std", default-features = false } xcm = { package = "staging-xcm", path = "../../../../polkadot/xcm", default-features = false } -xcm-builder = { package = "staging-xcm-builder", path = "../../../../polkadot/xcm/xcm-builder", default-features = false } xcm-executor = { package = "staging-xcm-executor", path = "../../../../polkadot/xcm/xcm-executor", default-features = false } snowbridge-core = { path = "../core", default-features = false } -ethabi = { package = "ethabi-decode", version = "1.0.0", default-features = false } - hex-literal = { version = "0.4.1" } [dev-dependencies] @@ -41,26 +36,20 @@ hex = { package = "rustc-hex", version = "2.1.0" } default = ["std"] std = [ "codec/std", - "ethabi/std", "frame-support/std", - "frame-system/std", "log/std", "scale-info/std", - "serde", "snowbridge-core/std", "sp-core/std", "sp-io/std", "sp-runtime/std", "sp-std/std", - "xcm-builder/std", "xcm-executor/std", "xcm/std", ] runtime-benchmarks = [ "frame-support/runtime-benchmarks", - "frame-system/runtime-benchmarks", "snowbridge-core/runtime-benchmarks", "sp-runtime/runtime-benchmarks", - "xcm-builder/runtime-benchmarks", "xcm-executor/runtime-benchmarks", ] diff --git a/bridges/snowbridge/runtime/runtime-common/Cargo.toml b/bridges/snowbridge/runtime/runtime-common/Cargo.toml index f5b44b25585aaccdc434d93cb039e24b4712aebc..995475349e4cb62045c613596acaf659eabd7076 100644 --- a/bridges/snowbridge/runtime/runtime-common/Cargo.toml +++ b/bridges/snowbridge/runtime/runtime-common/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "snowbridge-runtime-common" description = "Snowbridge Runtime Common" -version = "0.0.0" +version = "0.2.0" authors = ["Snowfork "] edition.workspace = true repository.workspace = true @@ -12,10 +12,9 @@ categories = ["cryptography::cryptocurrencies"] workspace = true [dependencies] -log = { version = "0.4.20", default-features = false } +log = { workspace = true } codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false } frame-support = { path = "../../../../substrate/frame/support", default-features = false } -frame-system = { path = "../../../../substrate/frame/system", default-features = false } sp-std = { path = "../../../../substrate/primitives/std", default-features = false } sp-arithmetic = { path = "../../../../substrate/primitives/arithmetic", default-features = false } xcm = { package = "staging-xcm", path = "../../../../polkadot/xcm", default-features = false } @@ -31,7 +30,6 @@ default = ["std"] std = [ "codec/std", "frame-support/std", - "frame-system/std", "log/std", "snowbridge-core/std", "sp-arithmetic/std", @@ -42,7 +40,6 @@ std = [ ] runtime-benchmarks = [ "frame-support/runtime-benchmarks", - "frame-system/runtime-benchmarks", "snowbridge-core/runtime-benchmarks", "xcm-builder/runtime-benchmarks", "xcm-executor/runtime-benchmarks", diff --git a/bridges/snowbridge/runtime/test-common/Cargo.toml b/bridges/snowbridge/runtime/test-common/Cargo.toml index a2994e618913416214cb7eb21d1a56c23c2d1094..92970339fac03dd9209546c9319b899509faca2c 100644 --- a/bridges/snowbridge/runtime/test-common/Cargo.toml +++ b/bridges/snowbridge/runtime/test-common/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "snowbridge-runtime-test-common" description = "Snowbridge Runtime Tests" -version = "0.0.0" +version = "0.2.0" authors = ["Snowfork "] edition = "2021" license = "Apache-2.0" @@ -11,191 +11,84 @@ categories = ["cryptography::cryptocurrencies"] workspace = true [dependencies] -codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -hex-literal = { version = "0.4.1" } -log = { version = "0.4.20", default-features = false } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.195", optional = true, features = ["derive"] } -smallvec = "1.11.0" +codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } # Substrate -frame-benchmarking = { path = "../../../../substrate/frame/benchmarking", default-features = false, optional = true } -frame-executive = { path = "../../../../substrate/frame/executive", default-features = false } frame-support = { path = "../../../../substrate/frame/support", default-features = false } frame-system = { path = "../../../../substrate/frame/system", default-features = false } -frame-system-benchmarking = { path = "../../../../substrate/frame/system/benchmarking", default-features = false, optional = true } -frame-system-rpc-runtime-api = { path = "../../../../substrate/frame/system/rpc/runtime-api", default-features = false } -frame-try-runtime = { path = "../../../../substrate/frame/try-runtime", default-features = false, optional = true } -pallet-aura = { path = "../../../../substrate/frame/aura", default-features = false } -pallet-authorship = { path = "../../../../substrate/frame/authorship", default-features = false } pallet-balances = { path = "../../../../substrate/frame/balances", default-features = false } pallet-session = { path = "../../../../substrate/frame/session", default-features = false } -pallet-multisig = { path = "../../../../substrate/frame/multisig", default-features = false } pallet-message-queue = { path = "../../../../substrate/frame/message-queue", default-features = false } pallet-timestamp = { path = "../../../../substrate/frame/timestamp", default-features = false } -pallet-transaction-payment = { path = "../../../../substrate/frame/transaction-payment", default-features = false } -pallet-transaction-payment-rpc-runtime-api = { path = "../../../../substrate/frame/transaction-payment/rpc/runtime-api", default-features = false } pallet-utility = { path = "../../../../substrate/frame/utility", default-features = false } -sp-api = { path = "../../../../substrate/primitives/api", default-features = false } -sp-block-builder = { path = "../../../../substrate/primitives/block-builder", default-features = false } -sp-consensus-aura = { path = "../../../../substrate/primitives/consensus/aura", default-features = false } sp-core = { path = "../../../../substrate/primitives/core", default-features = false } -sp-genesis-builder = { path = "../../../../substrate/primitives/genesis-builder", default-features = false } -sp-inherents = { path = "../../../../substrate/primitives/inherents", default-features = false } sp-io = { path = "../../../../substrate/primitives/io", default-features = false } sp-keyring = { path = "../../../../substrate/primitives/keyring" } -sp-offchain = { path = "../../../../substrate/primitives/offchain", default-features = false } sp-runtime = { path = "../../../../substrate/primitives/runtime", default-features = false } -sp-session = { path = "../../../../substrate/primitives/session", default-features = false } -sp-std = { path = "../../../../substrate/primitives/std", default-features = false } -sp-storage = { path = "../../../../substrate/primitives/storage", default-features = false } -sp-transaction-pool = { path = "../../../../substrate/primitives/transaction-pool", default-features = false } -sp-version = { path = "../../../../substrate/primitives/version", default-features = false } # Polkadot pallet-xcm = { path = "../../../../polkadot/xcm/pallet-xcm", default-features = false } -pallet-xcm-benchmarks = { path = "../../../../polkadot/xcm/pallet-xcm-benchmarks", default-features = false, optional = true } -polkadot-core-primitives = { path = "../../../../polkadot/core-primitives", default-features = false } -polkadot-parachain-primitives = { path = "../../../../polkadot/parachain", default-features = false } -polkadot-runtime-common = { path = "../../../../polkadot/runtime/common", default-features = false } xcm = { package = "staging-xcm", path = "../../../../polkadot/xcm", default-features = false } -xcm-builder = { package = "staging-xcm-builder", path = "../../../../polkadot/xcm/xcm-builder", default-features = false } xcm-executor = { package = "staging-xcm-executor", path = "../../../../polkadot/xcm/xcm-executor", default-features = false } # Cumulus -cumulus-pallet-aura-ext = { path = "../../../../cumulus/pallets/aura-ext", default-features = false } cumulus-pallet-parachain-system = { path = "../../../../cumulus/pallets/parachain-system", default-features = false, features = ["parameterized-consensus-hook"] } -cumulus-pallet-session-benchmarking = { path = "../../../../cumulus/pallets/session-benchmarking", default-features = false } -cumulus-pallet-xcm = { path = "../../../../cumulus/pallets/xcm", default-features = false } -cumulus-pallet-xcmp-queue = { path = "../../../../cumulus/pallets/xcmp-queue", default-features = false, features = ["bridging"] } -cumulus-primitives-core = { path = "../../../../cumulus/primitives/core", default-features = false } -cumulus-primitives-utility = { path = "../../../../cumulus/primitives/utility", default-features = false } pallet-collator-selection = { path = "../../../../cumulus/pallets/collator-selection", default-features = false } parachain-info = { package = "staging-parachain-info", path = "../../../../cumulus/parachains/pallets/parachain-info", default-features = false } -parachains-common = { path = "../../../../cumulus/parachains/common", default-features = false } parachains-runtimes-test-utils = { path = "../../../../cumulus/parachains/runtimes/test-utils", default-features = false } -assets-common = { path = "../../../../cumulus/parachains/runtimes/assets/common", default-features = false } # Ethereum Bridge (Snowbridge) snowbridge-core = { path = "../../primitives/core", default-features = false } -snowbridge-beacon-primitives = { path = "../../primitives/beacon", default-features = false } -snowbridge-router-primitives = { path = "../../primitives/router", default-features = false } snowbridge-pallet-ethereum-client = { path = "../../pallets/ethereum-client", default-features = false } snowbridge-pallet-ethereum-client-fixtures = { path = "../../pallets/ethereum-client/fixtures", default-features = false } -snowbridge-pallet-inbound-queue = { path = "../../pallets/inbound-queue", default-features = false } snowbridge-pallet-outbound-queue = { path = "../../pallets/outbound-queue", default-features = false } -snowbridge-outbound-queue-runtime-api = { path = "../../pallets/outbound-queue/runtime-api", default-features = false } snowbridge-pallet-system = { path = "../../pallets/system", default-features = false } -snowbridge-system-runtime-api = { path = "../../pallets/system/runtime-api", default-features = false } - -[dev-dependencies] -static_assertions = "1.1" -bridge-hub-test-utils = { path = "../../../../cumulus/parachains/runtimes/bridge-hubs/test-utils" } -bridge-runtime-common = { path = "../../../bin/runtime-common", features = ["integrity-test"] } -sp-keyring = { path = "../../../../substrate/primitives/keyring" } [features] default = ["std"] std = [ - "assets-common/std", "codec/std", - "cumulus-pallet-aura-ext/std", "cumulus-pallet-parachain-system/std", - "cumulus-pallet-session-benchmarking/std", - "cumulus-pallet-xcm/std", - "cumulus-pallet-xcmp-queue/std", - "cumulus-primitives-core/std", - "cumulus-primitives-utility/std", - "frame-benchmarking/std", - "frame-executive/std", "frame-support/std", - "frame-system-benchmarking?/std", - "frame-system-rpc-runtime-api/std", "frame-system/std", - "frame-try-runtime?/std", - "log/std", - "pallet-aura/std", - "pallet-authorship/std", "pallet-balances/std", "pallet-collator-selection/std", "pallet-message-queue/std", - "pallet-multisig/std", "pallet-session/std", "pallet-timestamp/std", - "pallet-transaction-payment-rpc-runtime-api/std", - "pallet-transaction-payment/std", "pallet-utility/std", - "pallet-xcm-benchmarks?/std", "pallet-xcm/std", "parachain-info/std", - "parachains-common/std", "parachains-runtimes-test-utils/std", - "polkadot-core-primitives/std", - "polkadot-parachain-primitives/std", - "polkadot-runtime-common/std", - "scale-info/std", - "serde", - "snowbridge-beacon-primitives/std", "snowbridge-core/std", - "snowbridge-outbound-queue-runtime-api/std", "snowbridge-pallet-ethereum-client-fixtures/std", "snowbridge-pallet-ethereum-client/std", - "snowbridge-pallet-inbound-queue/std", "snowbridge-pallet-outbound-queue/std", "snowbridge-pallet-system/std", - "snowbridge-router-primitives/std", - "snowbridge-system-runtime-api/std", - "sp-api/std", - "sp-block-builder/std", - "sp-consensus-aura/std", "sp-core/std", - "sp-genesis-builder/std", - "sp-inherents/std", "sp-io/std", - "sp-offchain/std", + "sp-keyring/std", "sp-runtime/std", - "sp-session/std", - "sp-std/std", - "sp-storage/std", - "sp-transaction-pool/std", - "sp-version/std", - "xcm-builder/std", "xcm-executor/std", "xcm/std", ] runtime-benchmarks = [ - "assets-common/runtime-benchmarks", - "bridge-runtime-common/runtime-benchmarks", "cumulus-pallet-parachain-system/runtime-benchmarks", - "cumulus-pallet-session-benchmarking/runtime-benchmarks", - "cumulus-pallet-xcmp-queue/runtime-benchmarks", - "cumulus-primitives-core/runtime-benchmarks", - "cumulus-primitives-utility/runtime-benchmarks", - "frame-benchmarking/runtime-benchmarks", "frame-support/runtime-benchmarks", - "frame-system-benchmarking/runtime-benchmarks", "frame-system/runtime-benchmarks", "pallet-balances/runtime-benchmarks", "pallet-collator-selection/runtime-benchmarks", "pallet-message-queue/runtime-benchmarks", - "pallet-multisig/runtime-benchmarks", "pallet-timestamp/runtime-benchmarks", "pallet-utility/runtime-benchmarks", - "pallet-xcm-benchmarks/runtime-benchmarks", "pallet-xcm/runtime-benchmarks", - "parachains-common/runtime-benchmarks", - "polkadot-parachain-primitives/runtime-benchmarks", - "polkadot-runtime-common/runtime-benchmarks", "snowbridge-core/runtime-benchmarks", "snowbridge-pallet-ethereum-client-fixtures/runtime-benchmarks", "snowbridge-pallet-ethereum-client/runtime-benchmarks", - "snowbridge-pallet-inbound-queue/runtime-benchmarks", "snowbridge-pallet-outbound-queue/runtime-benchmarks", "snowbridge-pallet-system/runtime-benchmarks", - "snowbridge-router-primitives/runtime-benchmarks", "sp-runtime/runtime-benchmarks", - "xcm-builder/runtime-benchmarks", "xcm-executor/runtime-benchmarks", ] fast-runtime = [] diff --git a/bridges/snowbridge/runtime/test-common/src/lib.rs b/bridges/snowbridge/runtime/test-common/src/lib.rs index c9bbce98e575d5e55015aa7814d8cd57a5c3a966..8f36313e360f1a41d85b54b9796e62a45f42e9b4 100644 --- a/bridges/snowbridge/runtime/test-common/src/lib.rs +++ b/bridges/snowbridge/runtime/test-common/src/lib.rs @@ -7,15 +7,14 @@ use frame_support::{ traits::{fungible::Mutate, OnFinalize, OnInitialize}, }; use frame_system::pallet_prelude::BlockNumberFor; -pub use parachains_runtimes_test_utils::test_cases::change_storage_constant_by_governance_works; use parachains_runtimes_test_utils::{ AccountIdOf, BalanceOf, CollatorSessionKeys, ExtBuilder, ValidatorIdOf, XcmReceivedFrom, }; use snowbridge_core::{ChannelId, ParaId}; use snowbridge_pallet_ethereum_client_fixtures::*; -use sp_core::H160; +use sp_core::{H160, U256}; use sp_keyring::AccountKeyring::*; -use sp_runtime::{traits::Header, AccountId32, SaturatedConversion, Saturating}; +use sp_runtime::{traits::Header, AccountId32, DigestItem, SaturatedConversion, Saturating}; use xcm::{ latest::prelude::*, v3::Error::{self, Barrier}, @@ -40,6 +39,7 @@ where } pub fn send_transfer_token_message( + ethereum_chain_id: u64, assethub_parachain_id: u32, weth_contract_address: H160, destination_address: H160, @@ -53,7 +53,8 @@ where + parachain_info::Config + pallet_collator_selection::Config + cumulus_pallet_parachain_system::Config - + snowbridge_pallet_outbound_queue::Config, + + snowbridge_pallet_outbound_queue::Config + + pallet_timestamp::Config, XcmConfig: xcm_executor::Config, { let assethub_parachain_location = Location::new(1, Parachain(assethub_parachain_id)); @@ -88,7 +89,7 @@ where WithdrawAsset(Assets::from(vec![fee.clone()])), BuyExecution { fees: fee, weight_limit: Unlimited }, ExportMessage { - network: Ethereum { chain_id: 11155111 }, + network: Ethereum { chain_id: ethereum_chain_id }, destination: Here, xcm: inner_xcm, }, @@ -106,6 +107,7 @@ where } pub fn send_transfer_token_message_success( + ethereum_chain_id: u64, collator_session_key: CollatorSessionKeys, runtime_para_id: u32, assethub_parachain_id: u32, @@ -125,7 +127,8 @@ pub fn send_transfer_token_message_success( + pallet_message_queue::Config + cumulus_pallet_parachain_system::Config + snowbridge_pallet_outbound_queue::Config - + snowbridge_pallet_system::Config, + + snowbridge_pallet_system::Config + + pallet_timestamp::Config, XcmConfig: xcm_executor::Config, ValidatorIdOf: From>, ::AccountId: From + AsRef<[u8]>, @@ -147,6 +150,7 @@ pub fn send_transfer_token_message_success( initial_fund::(assethub_parachain_id, 5_000_000_000_000); let outcome = send_transfer_token_message::( + ethereum_chain_id, assethub_parachain_id, weth_contract_address, destination_address, @@ -193,13 +197,104 @@ pub fn send_transfer_token_message_success( let digest = included_head.digest(); - //let digest = frame_system::Pallet::::digest(); let digest_items = digest.logs(); assert!(digest_items.len() == 1 && digest_items[0].as_other().is_some()); }); } +pub fn ethereum_outbound_queue_processes_messages_before_message_queue_works< + Runtime, + XcmConfig, + AllPalletsWithoutSystem, +>( + ethereum_chain_id: u64, + collator_session_key: CollatorSessionKeys, + runtime_para_id: u32, + assethub_parachain_id: u32, + weth_contract_address: H160, + destination_address: H160, + fee_amount: u128, + snowbridge_pallet_outbound_queue: Box< + dyn Fn(Vec) -> Option>, + >, +) where + Runtime: frame_system::Config + + pallet_balances::Config + + pallet_session::Config + + pallet_xcm::Config + + parachain_info::Config + + pallet_collator_selection::Config + + pallet_message_queue::Config + + cumulus_pallet_parachain_system::Config + + snowbridge_pallet_outbound_queue::Config + + snowbridge_pallet_system::Config + + pallet_timestamp::Config, + XcmConfig: xcm_executor::Config, + AllPalletsWithoutSystem: + OnInitialize> + OnFinalize>, + ValidatorIdOf: From>, + ::AccountId: From + AsRef<[u8]>, +{ + ExtBuilder::::default() + .with_collators(collator_session_key.collators()) + .with_session_keys(collator_session_key.session_keys()) + .with_para_id(runtime_para_id.into()) + .with_tracing() + .build() + .execute_with(|| { + >::initialize( + runtime_para_id.into(), + assethub_parachain_id.into(), + ) + .unwrap(); + + // fund asset hub sovereign account enough so it can pay fees + initial_fund::(assethub_parachain_id, 5_000_000_000_000); + + let outcome = send_transfer_token_message::( + ethereum_chain_id, + assethub_parachain_id, + weth_contract_address, + destination_address, + fee_amount, + ); + + assert_ok!(outcome.ensure_complete()); + + // check events + let mut events = >::events() + .into_iter() + .filter_map(|e| snowbridge_pallet_outbound_queue(e.event.encode())); + assert!(events.any(|e| matches!( + e, + snowbridge_pallet_outbound_queue::Event::MessageQueued { .. } + ))); + + let next_block_number: U256 = >::block_number() + .saturating_add(BlockNumberFor::::from(1u32)) + .into(); + + let included_head = + RuntimeHelper::::run_to_block_with_finalize( + next_block_number.as_u32(), + ); + let digest = included_head.digest(); + let digest_items = digest.logs(); + + let mut found_outbound_digest = false; + for digest_item in digest_items { + match digest_item { + DigestItem::Other(_) => found_outbound_digest = true, + _ => {}, + } + } + + assert_eq!(found_outbound_digest, true); + }); +} + pub fn send_unpaid_transfer_token_message( + ethereum_chain_id: u64, collator_session_key: CollatorSessionKeys, runtime_para_id: u32, assethub_parachain_id: u32, @@ -213,7 +308,8 @@ pub fn send_unpaid_transfer_token_message( + parachain_info::Config + pallet_collator_selection::Config + cumulus_pallet_parachain_system::Config - + snowbridge_pallet_outbound_queue::Config, + + snowbridge_pallet_outbound_queue::Config + + pallet_timestamp::Config, XcmConfig: xcm_executor::Config, ValidatorIdOf: From>, { @@ -262,7 +358,7 @@ pub fn send_unpaid_transfer_token_message( let xcm = Xcm(vec![ UnpaidExecution { weight_limit: Unlimited, check_origin: None }, ExportMessage { - network: Ethereum { chain_id: 11155111 }, + network: Ethereum { chain_id: ethereum_chain_id }, destination: Here, xcm: inner_xcm, }, @@ -284,6 +380,7 @@ pub fn send_unpaid_transfer_token_message( #[allow(clippy::too_many_arguments)] pub fn send_transfer_token_message_failure( + ethereum_chain_id: u64, collator_session_key: CollatorSessionKeys, runtime_para_id: u32, assethub_parachain_id: u32, @@ -301,7 +398,8 @@ pub fn send_transfer_token_message_failure( + pallet_collator_selection::Config + cumulus_pallet_parachain_system::Config + snowbridge_pallet_outbound_queue::Config - + snowbridge_pallet_system::Config, + + snowbridge_pallet_system::Config + + pallet_timestamp::Config, XcmConfig: xcm_executor::Config, ValidatorIdOf: From>, { @@ -322,6 +420,7 @@ pub fn send_transfer_token_message_failure( initial_fund::(assethub_parachain_id, initial_amount); let outcome = send_transfer_token_message::( + ethereum_chain_id, assethub_parachain_id, weth_contract_address, destination_address, @@ -349,7 +448,8 @@ pub fn ethereum_extrinsic( + cumulus_pallet_parachain_system::Config + snowbridge_pallet_outbound_queue::Config + snowbridge_pallet_system::Config - + snowbridge_pallet_ethereum_client::Config, + + snowbridge_pallet_ethereum_client::Config + + pallet_timestamp::Config, ValidatorIdOf: From>, ::RuntimeCall: From>, @@ -366,7 +466,6 @@ pub fn ethereum_extrinsic( let initial_checkpoint = make_checkpoint(); let update = make_finalized_header_update(); let sync_committee_update = make_sync_committee_update(); - let execution_header_update = make_execution_header_update(); let alice = Alice; let alice_account = alice.to_account_id(); @@ -393,22 +492,12 @@ pub fn ethereum_extrinsic( } .into(); - let execution_header_call: ::RuntimeCall = - snowbridge_pallet_ethereum_client::Call::::submit_execution_header { - update: Box::new(*execution_header_update), - } - .into(); - let update_outcome = construct_and_apply_extrinsic(alice, update_call.into()); assert_ok!(update_outcome); let sync_committee_outcome = construct_and_apply_extrinsic(alice, update_sync_committee_call.into()); assert_ok!(sync_committee_outcome); - - let execution_header_outcome = - construct_and_apply_extrinsic(alice, execution_header_call.into()); - assert_ok!(execution_header_outcome); }); } @@ -430,7 +519,8 @@ pub fn ethereum_to_polkadot_message_extrinsics_work( + cumulus_pallet_parachain_system::Config + snowbridge_pallet_outbound_queue::Config + snowbridge_pallet_system::Config - + snowbridge_pallet_ethereum_client::Config, + + snowbridge_pallet_ethereum_client::Config + + pallet_timestamp::Config, ValidatorIdOf: From>, ::RuntimeCall: From>, @@ -446,7 +536,6 @@ pub fn ethereum_to_polkadot_message_extrinsics_work( .execute_with(|| { let initial_checkpoint = make_checkpoint(); let sync_committee_update = make_sync_committee_update(); - let execution_header_update = make_execution_header_update(); let alice = Alice; let alice_account = alice.to_account_id(); @@ -467,18 +556,8 @@ pub fn ethereum_to_polkadot_message_extrinsics_work( } .into(); - let execution_header_call: ::RuntimeCall = - snowbridge_pallet_ethereum_client::Call::::submit_execution_header { - update: Box::new(*execution_header_update), - } - .into(); - let sync_committee_outcome = construct_and_apply_extrinsic(alice, update_sync_committee_call.into()); assert_ok!(sync_committee_outcome); - - let execution_header_outcome = - construct_and_apply_extrinsic(alice, execution_header_call.into()); - assert_ok!(execution_header_outcome); }); } diff --git a/bridges/snowbridge/scripts/contribute-upstream.sh b/bridges/snowbridge/scripts/contribute-upstream.sh new file mode 100755 index 0000000000000000000000000000000000000000..529057c3f26feb8b3287648ccfc4fb72a649b71d --- /dev/null +++ b/bridges/snowbridge/scripts/contribute-upstream.sh @@ -0,0 +1,88 @@ +#!/bin/bash + +# A script to cleanup the Snowfork fork of the polkadot-sdk to contribute it upstream back to parity/polkadot-sdk +# ./bridges/snowbridge/scripts/contribute-upstream.sh + +# show CLI help +function show_help() { + set +x + echo " " + echo Error: $1 + echo "Usage:" + echo " ./bridges/snowbridge/scripts/contribute-upstream.sh Exit with code 0 if pallets code is well decoupled from the other code in the repo" + exit 1 +} + +if [[ -z "$1" ]]; then + echo "Please provide a branch name you would like your upstream branch to be named" + exit 1 +fi + +branch_name=$1 + +set -eux + +# let's avoid any restrictions on where this script can be called for - snowbridge repo may be +# plugged into any other repo folder. So the script (and other stuff that needs to be removed) +# may be located either in call dir, or one of it subdirs. +SNOWBRIDGE_FOLDER="$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )/../" + +# Get the current Git branch name +current_branch=$(git rev-parse --abbrev-ref HEAD) + +if [ "$current_branch" = "$branch_name" ] || git branch | grep -q "$branch_name"; then + echo "Already on requested branch or branch exists, not creating." +else + git branch "$branch_name" +fi + +git checkout "$branch_name" + +# remove everything we think is not required for our needs +rm -rf rust-toolchain.toml +rm -rf codecov.yml +rm -rf $SNOWBRIDGE_FOLDER/.cargo +rm -rf $SNOWBRIDGE_FOLDER/.github +rm -rf $SNOWBRIDGE_FOLDER/SECURITY.md +rm -rf $SNOWBRIDGE_FOLDER/.gitignore +rm -rf $SNOWBRIDGE_FOLDER/rustfmt.toml +rm -rf $SNOWBRIDGE_FOLDER/templates +rm -rf $SNOWBRIDGE_FOLDER/pallets/ethereum-client/fuzz + +pushd $SNOWBRIDGE_FOLDER + +# let's test if everything we need compiles +cargo check -p snowbridge-pallet-ethereum-client +cargo check -p snowbridge-pallet-ethereum-client --features runtime-benchmarks +cargo check -p snowbridge-pallet-ethereum-client --features try-runtime +cargo check -p snowbridge-pallet-inbound-queue +cargo check -p snowbridge-pallet-inbound-queue --features runtime-benchmarks +cargo check -p snowbridge-pallet-inbound-queue --features try-runtime +cargo check -p snowbridge-pallet-outbound-queue +cargo check -p snowbridge-pallet-outbound-queue --features runtime-benchmarks +cargo check -p snowbridge-pallet-outbound-queue --features try-runtime +cargo check -p snowbridge-pallet-system +cargo check -p snowbridge-pallet-system --features runtime-benchmarks +cargo check -p snowbridge-pallet-system --features try-runtime + +# we're removing lock file after all checks are done. Otherwise we may use different +# Substrate/Polkadot/Cumulus commits and our checks will fail +rm -f $SNOWBRIDGE_FOLDER/Cargo.toml +rm -f $SNOWBRIDGE_FOLDER/Cargo.lock + +popd + +# Replace Parity's CI files, that we have overwritten in our fork, to run our own CI +rm -rf .github +git remote -v | grep -w parity || git remote add parity https://github.com/paritytech/polkadot-sdk +git fetch parity master +git checkout parity/master -- .github +git add -- .github + +git commit -m "cleanup branch" + +# Fetch the latest from parity master +echo "Fetching latest from Parity master. Resolve merge conflicts, if there are any." +git fetch parity master +git merge parity/master +echo "OK" diff --git a/bridges/snowbridge/scripts/verify-pallets-build.sh b/bridges/snowbridge/scripts/verify-pallets-build.sh deleted file mode 100755 index a62f48c84d4fd34731c20365a20097e086aa2c99..0000000000000000000000000000000000000000 --- a/bridges/snowbridge/scripts/verify-pallets-build.sh +++ /dev/null @@ -1,116 +0,0 @@ -#!/bin/bash - -# A script to remove everything from snowbridge repository/subtree, except: -# -# - parachain -# - readme -# - license - -set -eu - -# show CLI help -function show_help() { - set +x - echo " " - echo Error: $1 - echo "Usage:" - echo " ./scripts/verify-pallets-build.sh Exit with code 0 if pallets code is well decoupled from the other code in the repo" - echo "Options:" - echo " --no-revert Leaves only runtime code on exit" - echo " --ignore-git-state Ignores git actual state" - exit 1 -} - -# parse CLI args -NO_REVERT= -IGNORE_GIT_STATE= -for i in "$@" -do - case $i in - --no-revert) - NO_REVERT=true - shift - ;; - --ignore-git-state) - IGNORE_GIT_STATE=true - shift - ;; - *) - show_help "Unknown option: $i" - ;; - esac -done - -# the script is able to work only on clean git copy, unless we want to ignore this check -[[ ! -z "${IGNORE_GIT_STATE}" ]] || [[ -z "$(git status --porcelain)" ]] || { echo >&2 "The git copy must be clean"; exit 1; } - -# let's avoid any restrictions on where this script can be called for - snowbridge repo may be -# plugged into any other repo folder. So the script (and other stuff that needs to be removed) -# may be located either in call dir, or one of it subdirs. -SNOWBRIDGE_FOLDER="$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )/../.." - -# remove everything we think is not required for our needs -rm -rf $SNOWBRIDGE_FOLDER/.cargo -rm -rf $SNOWBRIDGE_FOLDER/.github -rm -rf $SNOWBRIDGE_FOLDER/contracts -rm -rf $SNOWBRIDGE_FOLDER/codecov.yml -rm -rf $SNOWBRIDGE_FOLDER/docs -rm -rf $SNOWBRIDGE_FOLDER/hooks -rm -rf $SNOWBRIDGE_FOLDER/relayer -rm -rf $SNOWBRIDGE_FOLDER/scripts -rm -rf $SNOWBRIDGE_FOLDER/SECURITY.md -rm -rf $SNOWBRIDGE_FOLDER/smoketest -rm -rf $SNOWBRIDGE_FOLDER/web -rm -rf $SNOWBRIDGE_FOLDER/.envrc-example -rm -rf $SNOWBRIDGE_FOLDER/.gitbook.yaml -rm -rf $SNOWBRIDGE_FOLDER/.gitignore -rm -rf $SNOWBRIDGE_FOLDER/.gitmodules -rm -rf $SNOWBRIDGE_FOLDER/_typos.toml -rm -rf $SNOWBRIDGE_FOLDER/_codecov.yml -rm -rf $SNOWBRIDGE_FOLDER/flake.lock -rm -rf $SNOWBRIDGE_FOLDER/flake.nix -rm -rf $SNOWBRIDGE_FOLDER/go.work -rm -rf $SNOWBRIDGE_FOLDER/go.work.sum -rm -rf $SNOWBRIDGE_FOLDER/polkadot-sdk -rm -rf $SNOWBRIDGE_FOLDER/rust-toolchain.toml -rm -rf $SNOWBRIDGE_FOLDER/parachain/rustfmt.toml -rm -rf $SNOWBRIDGE_FOLDER/parachain/.gitignore -rm -rf $SNOWBRIDGE_FOLDER/parachain/templates -rm -rf $SNOWBRIDGE_FOLDER/parachain/.cargo -rm -rf $SNOWBRIDGE_FOLDER/parachain/.config -rm -rf $SNOWBRIDGE_FOLDER/parachain/pallets/ethereum-client/fuzz - -cd bridges/snowbridge/parachain - -# fix polkadot-sdk paths in Cargo.toml files -find "." -name 'Cargo.toml' | while read -r file; do - replace=$(printf '../../' ) - if [[ "$(uname)" = "Darwin" ]] || [[ "$(uname)" = *BSD ]]; then - sed -i '' "s|polkadot-sdk/|$replace|g" "$file" - else - sed -i "s|polkadot-sdk/|$replace|g" "$file" - fi -done - -# let's test if everything we need compiles -cargo check -p snowbridge-pallet-ethereum-client -cargo check -p snowbridge-pallet-ethereum-client --features runtime-benchmarks -cargo check -p snowbridge-pallet-ethereum-client --features try-runtime -cargo check -p snowbridge-pallet-inbound-queue -cargo check -p snowbridge-pallet-inbound-queue --features runtime-benchmarks -cargo check -p snowbridge-pallet-inbound-queue --features try-runtime -cargo check -p snowbridge-pallet-outbound-queue -cargo check -p snowbridge-pallet-outbound-queue --features runtime-benchmarks -cargo check -p snowbridge-pallet-outbound-queue --features try-runtime -cargo check -p snowbridge-pallet-system -cargo check -p snowbridge-pallet-system --features runtime-benchmarks -cargo check -p snowbridge-pallet-system --features try-runtime - -cd - - -# we're removing lock file after all checks are done. Otherwise we may use different -# Substrate/Polkadot/Cumulus commits and our checks will fail -rm -f $SNOWBRIDGE_FOLDER/parachain/Cargo.toml -rm -f $SNOWBRIDGE_FOLDER/parachain/Cargo.lock - -echo "OK" diff --git a/bridges/zombienet/README.md b/bridges/testing/README.md similarity index 94% rename from bridges/zombienet/README.md rename to bridges/testing/README.md index b601154b624ce69ed921ea6c2453d17c4d37b6c8..bd467a410d013c363913a8e4b2be8ca7b184e2dc 100644 --- a/bridges/zombienet/README.md +++ b/bridges/testing/README.md @@ -23,7 +23,7 @@ To start those tests, you need to: - copy fresh `substrate-relay` binary, built in previous point, to the `~/local_bridge_testing/bin/substrate-relay`; -- change the `POLKADOT_SDK_FOLDER` and `ZOMBIENET_BINARY_PATH` (and ensure that the nearby variables +- change the `POLKADOT_SDK_PATH` and `ZOMBIENET_BINARY_PATH` (and ensure that the nearby variables have correct values) in the `./run-tests.sh`. After that, you could run tests with the `./run-tests.sh` command. Hopefully, it'll show the diff --git a/cumulus/zombienet/bridge-hubs/bridge_hub_rococo_local_network.toml b/bridges/testing/environments/rococo-westend/bridge_hub_rococo_local_network.toml similarity index 82% rename from cumulus/zombienet/bridge-hubs/bridge_hub_rococo_local_network.toml rename to bridges/testing/environments/rococo-westend/bridge_hub_rococo_local_network.toml index 99a7d0035b511c57ccf5c10fa94165933c495ba9..52271f9442131923f8a758b16df7610e73813d15 100644 --- a/cumulus/zombienet/bridge-hubs/bridge_hub_rococo_local_network.toml +++ b/bridges/testing/environments/rococo-westend/bridge_hub_rococo_local_network.toml @@ -2,7 +2,7 @@ node_spawn_timeout = 240 [relaychain] -default_command = "{{POLKADOT_BINARY_PATH}}" +default_command = "{{POLKADOT_BINARY}}" default_args = [ "-lparachain=debug,xcm=trace" ] chain = "rococo-local" @@ -36,24 +36,22 @@ cumulus_based = true [[parachains.collators]] name = "bridge-hub-rococo-collator1" validator = true - command = "{{POLKADOT_PARACHAIN_BINARY_PATH}}" + command = "{{POLKADOT_PARACHAIN_BINARY}}" rpc_port = 8933 ws_port = 8943 args = [ - "-lparachain=debug,runtime::bridge-hub=trace,runtime::bridge=trace,runtime::bridge-dispatch=trace,bridge=trace,runtime::bridge-messages=trace,xcm=trace", - "--force-authoring" + "-lparachain=debug,runtime::bridge-hub=trace,runtime::bridge=trace,runtime::bridge-dispatch=trace,bridge=trace,runtime::bridge-messages=trace,xcm=trace" ] # run bob as parachain collator [[parachains.collators]] name = "bridge-hub-rococo-collator2" validator = true - command = "{{POLKADOT_PARACHAIN_BINARY_PATH}}" + command = "{{POLKADOT_PARACHAIN_BINARY}}" rpc_port = 8934 ws_port = 8944 args = [ - "-lparachain=trace,runtime::bridge-hub=trace,runtime::bridge=trace,runtime::bridge-dispatch=trace,bridge=trace,runtime::bridge-messages=trace,xcm=trace", - "--force-authoring" + "-lparachain=trace,runtime::bridge-hub=trace,runtime::bridge=trace,runtime::bridge-dispatch=trace,bridge=trace,runtime::bridge-messages=trace,xcm=trace" ] [[parachains]] @@ -65,14 +63,14 @@ cumulus_based = true name = "asset-hub-rococo-collator1" rpc_port = 9911 ws_port = 9910 - command = "{{POLKADOT_PARACHAIN_BINARY_PATH_FOR_ASSET_HUB_ROCOCO}}" + command = "{{POLKADOT_PARACHAIN_BINARY}}" args = [ "-lparachain=debug,xcm=trace,runtime::bridge-transfer=trace" ] [[parachains.collators]] name = "asset-hub-rococo-collator2" - command = "{{POLKADOT_PARACHAIN_BINARY_PATH_FOR_ASSET_HUB_ROCOCO}}" + command = "{{POLKADOT_PARACHAIN_BINARY}}" args = [ "-lparachain=debug,xcm=trace,runtime::bridge-transfer=trace" ] diff --git a/cumulus/zombienet/bridge-hubs/bridge_hub_westend_local_network.toml b/bridges/testing/environments/rococo-westend/bridge_hub_westend_local_network.toml similarity index 84% rename from cumulus/zombienet/bridge-hubs/bridge_hub_westend_local_network.toml rename to bridges/testing/environments/rococo-westend/bridge_hub_westend_local_network.toml index 1919d1c63f25f154e4676599afb8a2969598c10b..f2550bcc9959638b21ea78043cca3bc12d3d23ea 100644 --- a/cumulus/zombienet/bridge-hubs/bridge_hub_westend_local_network.toml +++ b/bridges/testing/environments/rococo-westend/bridge_hub_westend_local_network.toml @@ -2,7 +2,7 @@ node_spawn_timeout = 240 [relaychain] -default_command = "{{POLKADOT_BINARY_PATH}}" +default_command = "{{POLKADOT_BINARY}}" default_args = [ "-lparachain=debug,xcm=trace" ] chain = "westend-local" @@ -36,24 +36,22 @@ cumulus_based = true [[parachains.collators]] name = "bridge-hub-westend-collator1" validator = true - command = "{{POLKADOT_PARACHAIN_BINARY_PATH}}" + command = "{{POLKADOT_PARACHAIN_BINARY}}" rpc_port = 8935 ws_port = 8945 args = [ - "-lparachain=debug,runtime::mmr=info,substrate=info,runtime=info,runtime::bridge-hub=trace,runtime::bridge=trace,runtime::bridge-dispatch=trace,bridge=trace,runtime::bridge-messages=trace,xcm=trace", - "--force-authoring" + "-lparachain=debug,runtime::mmr=info,substrate=info,runtime=info,runtime::bridge-hub=trace,runtime::bridge=trace,runtime::bridge-dispatch=trace,bridge=trace,runtime::bridge-messages=trace,xcm=trace" ] # run bob as parachain collator [[parachains.collators]] name = "bridge-hub-westend-collator2" validator = true - command = "{{POLKADOT_PARACHAIN_BINARY_PATH}}" + command = "{{POLKADOT_PARACHAIN_BINARY}}" rpc_port = 8936 ws_port = 8946 args = [ - "-lparachain=trace,runtime::mmr=info,substrate=info,runtime=info,runtime::bridge-hub=trace,runtime::bridge=trace,runtime::bridge-dispatch=trace,bridge=trace,runtime::bridge-messages=trace,xcm=trace", - "--force-authoring" + "-lparachain=trace,runtime::mmr=info,substrate=info,runtime=info,runtime::bridge-hub=trace,runtime::bridge=trace,runtime::bridge-dispatch=trace,bridge=trace,runtime::bridge-messages=trace,xcm=trace" ] [[parachains]] @@ -65,14 +63,14 @@ cumulus_based = true name = "asset-hub-westend-collator1" rpc_port = 9011 ws_port = 9010 - command = "{{POLKADOT_PARACHAIN_BINARY_PATH_FOR_ASSET_HUB_WESTEND}}" + command = "{{POLKADOT_PARACHAIN_BINARY}}" args = [ "-lparachain=debug,xcm=trace,runtime::bridge-transfer=trace" ] [[parachains.collators]] name = "asset-hub-westend-collator2" - command = "{{POLKADOT_PARACHAIN_BINARY_PATH_FOR_ASSET_HUB_WESTEND}}" + command = "{{POLKADOT_PARACHAIN_BINARY}}" args = [ "-lparachain=debug,xcm=trace,runtime::bridge-transfer=trace" ] diff --git a/cumulus/scripts/bridges_rococo_westend.sh b/bridges/testing/environments/rococo-westend/bridges_rococo_westend.sh similarity index 89% rename from cumulus/scripts/bridges_rococo_westend.sh rename to bridges/testing/environments/rococo-westend/bridges_rococo_westend.sh index 3b6f8e892858ad034a9db23a717b4290f9024bde..66c9ddc037b8efb005d2239b174eb5710dddaf53 100755 --- a/cumulus/scripts/bridges_rococo_westend.sh +++ b/bridges/testing/environments/rococo-westend/bridges_rococo_westend.sh @@ -1,7 +1,7 @@ #!/bin/bash # import common functions -source "$(dirname "$0")"/bridges_common.sh +source "$FRAMEWORK_PATH/utils/bridges.sh" # Expected sovereign accounts. # @@ -24,12 +24,6 @@ source "$(dirname "$0")"/bridges_common.sh # &MultiLocation { parents: 2, interior: X1(GlobalConsensus(Rococo)) }).unwrap() # ).to_ss58check_with_version(42_u16.into()) # ); -# println!("GLOBAL_CONSENSUS_ROCOCO_ASSET_HUB_ROCOCO_1000_SOVEREIGN_ACCOUNT=\"{}\"", -# frame_support::sp_runtime::AccountId32::new( -# GlobalConsensusParachainConvertsFor::::convert_location( -# &MultiLocation { parents: 2, interior: X2(GlobalConsensus(Rococo), Parachain(1000)) }).unwrap() -# ).to_ss58check_with_version(42_u16.into()) -# ); # println!("ASSET_HUB_WESTEND_SOVEREIGN_ACCOUNT_AT_BRIDGE_HUB_WESTEND=\"{}\"", # frame_support::sp_runtime::AccountId32::new( # SiblingParachainConvertsVia::::convert_location( @@ -44,12 +38,6 @@ source "$(dirname "$0")"/bridges_common.sh # &MultiLocation { parents: 2, interior: X1(GlobalConsensus(Westend)) }).unwrap() # ).to_ss58check_with_version(42_u16.into()) # ); -# println!("GLOBAL_CONSENSUS_WESTEND_ASSET_HUB_WESTEND_1000_SOVEREIGN_ACCOUNT=\"{}\"", -# frame_support::sp_runtime::AccountId32::new( -# GlobalConsensusParachainConvertsFor::::convert_location( -# &MultiLocation { parents: 2, interior: X2(GlobalConsensus(Westend), Parachain(1000)) }).unwrap() -# ).to_ss58check_with_version(42_u16.into()) -# ); # println!("ASSET_HUB_ROCOCO_SOVEREIGN_ACCOUNT_AT_BRIDGE_HUB_ROCOCO=\"{}\"", # frame_support::sp_runtime::AccountId32::new( # SiblingParachainConvertsVia::::convert_location( @@ -58,10 +46,8 @@ source "$(dirname "$0")"/bridges_common.sh # ); # } GLOBAL_CONSENSUS_ROCOCO_SOVEREIGN_ACCOUNT="5GxRGwT8bU1JeBPTUXc7LEjZMxNrK8MyL2NJnkWFQJTQ4sii" -GLOBAL_CONSENSUS_ROCOCO_ASSET_HUB_ROCOCO_1000_SOVEREIGN_ACCOUNT="5CfNu7eH3SJvqqPt3aJh38T8dcFvhGzEohp9tsd41ANhXDnQ" ASSET_HUB_WESTEND_SOVEREIGN_ACCOUNT_AT_BRIDGE_HUB_WESTEND="5Eg2fntNprdN3FgH4sfEaaZhYtddZQSQUqvYJ1f2mLtinVhV" GLOBAL_CONSENSUS_WESTEND_SOVEREIGN_ACCOUNT="5He2Qdztyxxa4GoagY6q1jaiLMmKy1gXS7PdZkhfj8ZG9hk5" -GLOBAL_CONSENSUS_WESTEND_ASSET_HUB_WESTEND_1000_SOVEREIGN_ACCOUNT="5GUD9X494SnhfBTNReHwhV1599McpyVrAqFY6WnTfVQVYNUM" ASSET_HUB_ROCOCO_SOVEREIGN_ACCOUNT_AT_BRIDGE_HUB_ROCOCO="5Eg2fntNprdN3FgH4sfEaaZhYtddZQSQUqvYJ1f2mLtinVhV" # Expected sovereign accounts for rewards on BridgeHubs. @@ -185,8 +171,8 @@ function run_relay() { case "$1" in run-relay) - init_ro_wnd init_wnd_ro + init_ro_wnd run_relay ;; init-asset-hub-rococo-local) @@ -201,12 +187,6 @@ case "$1" in "$GLOBAL_CONSENSUS_WESTEND_SOVEREIGN_ACCOUNT" \ 10000000000 \ true - # drip SA which holds reserves - transfer_balance \ - "ws://127.0.0.1:9910" \ - "//Alice" \ - "$GLOBAL_CONSENSUS_WESTEND_ASSET_HUB_WESTEND_1000_SOVEREIGN_ACCOUNT" \ - $((1000000000000 + 50000000000 * 20)) # HRMP open_hrmp_channels \ "ws://127.0.0.1:9942" \ @@ -266,12 +246,6 @@ case "$1" in "$GLOBAL_CONSENSUS_ROCOCO_SOVEREIGN_ACCOUNT" \ 10000000000 \ true - # drip SA which holds reserves - transfer_balance \ - "ws://127.0.0.1:9010" \ - "//Alice" \ - "$GLOBAL_CONSENSUS_ROCOCO_ASSET_HUB_ROCOCO_1000_SOVEREIGN_ACCOUNT" \ - $((1000000000000000 + 50000000000 * 20)) # HRMP open_hrmp_channels \ "ws://127.0.0.1:9945" \ @@ -319,6 +293,7 @@ case "$1" in $XCM_VERSION ;; reserve-transfer-assets-from-asset-hub-rococo-local) + amount=$2 ensure_polkadot_js_api # send ROCs to Alice account on AHW limited_reserve_transfer_assets \ @@ -326,11 +301,12 @@ case "$1" in "//Alice" \ "$(jq --null-input '{ "V3": { "parents": 2, "interior": { "X2": [ { "GlobalConsensus": "Westend" }, { "Parachain": 1000 } ] } } }')" \ "$(jq --null-input '{ "V3": { "parents": 0, "interior": { "X1": { "AccountId32": { "id": [212, 53, 147, 199, 21, 253, 211, 28, 97, 20, 26, 189, 4, 169, 159, 214, 130, 44, 133, 88, 133, 76, 205, 227, 154, 86, 132, 231, 165, 109, 162, 125] } } } } }')" \ - "$(jq --null-input '{ "V3": [ { "id": { "Concrete": { "parents": 1, "interior": "Here" } }, "fun": { "Fungible": 5000000000000 } } ] }')" \ + "$(jq --null-input '{ "V3": [ { "id": { "Concrete": { "parents": 1, "interior": "Here" } }, "fun": { "Fungible": '$amount' } } ] }')" \ 0 \ "Unlimited" ;; withdraw-reserve-assets-from-asset-hub-rococo-local) + amount=$2 ensure_polkadot_js_api # send back only 100000000000 wrappedWNDs to Alice account on AHW limited_reserve_transfer_assets \ @@ -338,11 +314,12 @@ case "$1" in "//Alice" \ "$(jq --null-input '{ "V3": { "parents": 2, "interior": { "X2": [ { "GlobalConsensus": "Westend" }, { "Parachain": 1000 } ] } } }')" \ "$(jq --null-input '{ "V3": { "parents": 0, "interior": { "X1": { "AccountId32": { "id": [212, 53, 147, 199, 21, 253, 211, 28, 97, 20, 26, 189, 4, 169, 159, 214, 130, 44, 133, 88, 133, 76, 205, 227, 154, 86, 132, 231, 165, 109, 162, 125] } } } } }')" \ - "$(jq --null-input '{ "V3": [ { "id": { "Concrete": { "parents": 2, "interior": { "X1": { "GlobalConsensus": "Westend" } } } }, "fun": { "Fungible": 3000000000000 } } ] }')" \ + "$(jq --null-input '{ "V3": [ { "id": { "Concrete": { "parents": 2, "interior": { "X1": { "GlobalConsensus": "Westend" } } } }, "fun": { "Fungible": '$amount' } } ] }')" \ 0 \ "Unlimited" ;; reserve-transfer-assets-from-asset-hub-westend-local) + amount=$2 ensure_polkadot_js_api # send WNDs to Alice account on AHR limited_reserve_transfer_assets \ @@ -350,11 +327,12 @@ case "$1" in "//Alice" \ "$(jq --null-input '{ "V3": { "parents": 2, "interior": { "X2": [ { "GlobalConsensus": "Rococo" }, { "Parachain": 1000 } ] } } }')" \ "$(jq --null-input '{ "V3": { "parents": 0, "interior": { "X1": { "AccountId32": { "id": [212, 53, 147, 199, 21, 253, 211, 28, 97, 20, 26, 189, 4, 169, 159, 214, 130, 44, 133, 88, 133, 76, 205, 227, 154, 86, 132, 231, 165, 109, 162, 125] } } } } }')" \ - "$(jq --null-input '{ "V3": [ { "id": { "Concrete": { "parents": 1, "interior": "Here" } }, "fun": { "Fungible": 5000000000000 } } ] }')" \ + "$(jq --null-input '{ "V3": [ { "id": { "Concrete": { "parents": 1, "interior": "Here" } }, "fun": { "Fungible": '$amount' } } ] }')" \ 0 \ "Unlimited" ;; withdraw-reserve-assets-from-asset-hub-westend-local) + amount=$2 ensure_polkadot_js_api # send back only 100000000000 wrappedROCs to Alice account on AHR limited_reserve_transfer_assets \ @@ -362,7 +340,7 @@ case "$1" in "//Alice" \ "$(jq --null-input '{ "V3": { "parents": 2, "interior": { "X2": [ { "GlobalConsensus": "Rococo" }, { "Parachain": 1000 } ] } } }')" \ "$(jq --null-input '{ "V3": { "parents": 0, "interior": { "X1": { "AccountId32": { "id": [212, 53, 147, 199, 21, 253, 211, 28, 97, 20, 26, 189, 4, 169, 159, 214, 130, 44, 133, 88, 133, 76, 205, 227, 154, 86, 132, 231, 165, 109, 162, 125] } } } } }')" \ - "$(jq --null-input '{ "V3": [ { "id": { "Concrete": { "parents": 2, "interior": { "X1": { "GlobalConsensus": "Rococo" } } } }, "fun": { "Fungible": 3000000000000 } } ] }')" \ + "$(jq --null-input '{ "V3": [ { "id": { "Concrete": { "parents": 2, "interior": { "X1": { "GlobalConsensus": "Rococo" } } } }, "fun": { "Fungible": '$amount' } } ] }')" \ 0 \ "Unlimited" ;; diff --git a/bridges/testing/environments/rococo-westend/helper.sh b/bridges/testing/environments/rococo-westend/helper.sh new file mode 100755 index 0000000000000000000000000000000000000000..0a13ded213f5d3a0920cb466fc974c129e9ad79a --- /dev/null +++ b/bridges/testing/environments/rococo-westend/helper.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +$ENV_PATH/bridges_rococo_westend.sh "$@" diff --git a/bridges/testing/environments/rococo-westend/rococo-init.zndsl b/bridges/testing/environments/rococo-westend/rococo-init.zndsl new file mode 100644 index 0000000000000000000000000000000000000000..c913e4db31f49184eb8214fda4d525c3594b358b --- /dev/null +++ b/bridges/testing/environments/rococo-westend/rococo-init.zndsl @@ -0,0 +1,8 @@ +Description: Check if the HRMP channel between Rococo BH and Rococo AH was opened successfully +Network: ./bridge_hub_rococo_local_network.toml +Creds: config + +# ensure that initialization has completed +asset-hub-rococo-collator1: js-script {{FRAMEWORK_PATH}}/js-helpers/wait-hrmp-channel-opened.js with "1013" within 300 seconds + + diff --git a/bridges/testing/environments/rococo-westend/rococo.zndsl b/bridges/testing/environments/rococo-westend/rococo.zndsl new file mode 100644 index 0000000000000000000000000000000000000000..a75286445a240eb302ac8fd23ae7fe707e6c0af3 --- /dev/null +++ b/bridges/testing/environments/rococo-westend/rococo.zndsl @@ -0,0 +1,7 @@ +Description: Check if the with-Westend GRANDPA pallet was initialized at Rococo BH +Network: ./bridge_hub_rococo_local_network.toml +Creds: config + +# relay is already started - let's wait until with-Westend GRANDPA pallet is initialized at Rococo +bridge-hub-rococo-collator1: js-script {{FRAMEWORK_PATH}}/js-helpers/best-finalized-header-at-bridged-chain.js with "Westend,0" within 400 seconds + diff --git a/bridges/testing/environments/rococo-westend/spawn.sh b/bridges/testing/environments/rococo-westend/spawn.sh new file mode 100755 index 0000000000000000000000000000000000000000..cbd0b1bc623ab77876ed5ce3beefd7ab72db2d37 --- /dev/null +++ b/bridges/testing/environments/rococo-westend/spawn.sh @@ -0,0 +1,70 @@ +#!/bin/bash + +set -e + +trap "trap - SIGTERM && kill -9 -$$" SIGINT SIGTERM EXIT + +source "$FRAMEWORK_PATH/utils/zombienet.sh" + +# whether to init the chains (open HRMP channels, set XCM version, create reserve assets, etc) +init=0 +start_relayer=0 +while [ $# -ne 0 ] +do + arg="$1" + case "$arg" in + --init) + init=1 + ;; + --start-relayer) + start_relayer=1 + ;; + esac + shift +done + +logs_dir=$TEST_DIR/logs +helper_script="${BASH_SOURCE%/*}/helper.sh" + +rococo_def=${BASH_SOURCE%/*}/bridge_hub_rococo_local_network.toml +start_zombienet $TEST_DIR $rococo_def rococo_dir rococo_pid +echo + +westend_def=${BASH_SOURCE%/*}/bridge_hub_westend_local_network.toml +start_zombienet $TEST_DIR $westend_def westend_dir westend_pid +echo + +if [[ $init -eq 1 ]]; then + rococo_init_log=$logs_dir/rococo-init.log + echo -e "Setting up the rococo side of the bridge. Logs available at: $rococo_init_log\n" + + westend_init_log=$logs_dir/westend-init.log + echo -e "Setting up the westend side of the bridge. Logs available at: $westend_init_log\n" + + $helper_script init-asset-hub-rococo-local >> $rococo_init_log 2>&1 & + rococo_init_pid=$! + $helper_script init-asset-hub-westend-local >> $westend_init_log 2>&1 & + westend_init_pid=$! + wait -n $rococo_init_pid $westend_init_pid + + + $helper_script init-bridge-hub-rococo-local >> $rococo_init_log 2>&1 & + rococo_init_pid=$! + $helper_script init-bridge-hub-westend-local >> $westend_init_log 2>&1 & + westend_init_pid=$! + wait -n $rococo_init_pid $westend_init_pid + + run_zndsl ${BASH_SOURCE%/*}/rococo-init.zndsl $rococo_dir + run_zndsl ${BASH_SOURCE%/*}/westend-init.zndsl $westend_dir +fi + +if [[ $start_relayer -eq 1 ]]; then + ${BASH_SOURCE%/*}/start_relayer.sh $rococo_dir $westend_dir relayer_pid +fi + +echo $rococo_dir > $TEST_DIR/rococo.env +echo $westend_dir > $TEST_DIR/westend.env +echo + +wait -n $rococo_pid $westend_pid $relayer_pid +kill -9 -$$ diff --git a/bridges/testing/environments/rococo-westend/start_relayer.sh b/bridges/testing/environments/rococo-westend/start_relayer.sh new file mode 100755 index 0000000000000000000000000000000000000000..7ddd312d395aa8733d2afea59277b48721c8a36b --- /dev/null +++ b/bridges/testing/environments/rococo-westend/start_relayer.sh @@ -0,0 +1,23 @@ +#!/bin/bash + +set -e + +source "$FRAMEWORK_PATH/utils/common.sh" +source "$FRAMEWORK_PATH/utils/zombienet.sh" + +rococo_dir=$1 +westend_dir=$2 +__relayer_pid=$3 + +logs_dir=$TEST_DIR/logs +helper_script="${BASH_SOURCE%/*}/helper.sh" + +relayer_log=$logs_dir/relayer.log +echo -e "Starting rococo-westend relayer. Logs available at: $relayer_log\n" +start_background_process "$helper_script run-relay" $relayer_log relayer_pid + +run_zndsl ${BASH_SOURCE%/*}/rococo.zndsl $rococo_dir +run_zndsl ${BASH_SOURCE%/*}/westend.zndsl $westend_dir + +eval $__relayer_pid="'$relayer_pid'" + diff --git a/bridges/testing/environments/rococo-westend/westend-init.zndsl b/bridges/testing/environments/rococo-westend/westend-init.zndsl new file mode 100644 index 0000000000000000000000000000000000000000..0f5428eed3b01c042f8aad3b3df51c3a800a9b72 --- /dev/null +++ b/bridges/testing/environments/rococo-westend/westend-init.zndsl @@ -0,0 +1,7 @@ +Description: Check if the HRMP channel between Westend BH and Westend AH was opened successfully +Network: ./bridge_hub_westend_local_network.toml +Creds: config + +# ensure that initialization has completed +asset-hub-westend-collator1: js-script {{FRAMEWORK_PATH}}/js-helpers/wait-hrmp-channel-opened.js with "1002" within 600 seconds + diff --git a/bridges/testing/environments/rococo-westend/westend.zndsl b/bridges/testing/environments/rococo-westend/westend.zndsl new file mode 100644 index 0000000000000000000000000000000000000000..21d4ebf3b05b003083f7d35bf6bb7a1ca4c1ad05 --- /dev/null +++ b/bridges/testing/environments/rococo-westend/westend.zndsl @@ -0,0 +1,6 @@ +Description: Check if the with-Rococo GRANDPA pallet was initialized at Westend BH +Network: ./bridge_hub_westend_local_network.toml +Creds: config + +# relay is already started - let's wait until with-Rococo GRANDPA pallet is initialized at Westend +bridge-hub-westend-collator1: js-script {{FRAMEWORK_PATH}}/js-helpers/best-finalized-header-at-bridged-chain.js with "Rococo,0" within 400 seconds diff --git a/bridges/zombienet/helpers/best-finalized-header-at-bridged-chain.js b/bridges/testing/framework/js-helpers/best-finalized-header-at-bridged-chain.js similarity index 94% rename from bridges/zombienet/helpers/best-finalized-header-at-bridged-chain.js rename to bridges/testing/framework/js-helpers/best-finalized-header-at-bridged-chain.js index f7e1eefc84b3fa3e799d7111608cfc39783f5e21..af4f18aee9b2710612ed142c50b28caf8313326d 100644 --- a/bridges/zombienet/helpers/best-finalized-header-at-bridged-chain.js +++ b/bridges/testing/framework/js-helpers/best-finalized-header-at-bridged-chain.js @@ -18,7 +18,7 @@ async function run(nodeName, networkInfo, args) { } // else sleep and retry - await new Promise((resolve) => setTimeout(resolve, 12000)); + await new Promise((resolve) => setTimeout(resolve, 6000)); } } diff --git a/bridges/testing/framework/js-helpers/chains/rococo-at-westend.js b/bridges/testing/framework/js-helpers/chains/rococo-at-westend.js new file mode 100644 index 0000000000000000000000000000000000000000..bcce3b3a303f55a16e766c6558878650ed03ab80 --- /dev/null +++ b/bridges/testing/framework/js-helpers/chains/rococo-at-westend.js @@ -0,0 +1,6 @@ +module.exports = { + grandpaPalletName: "bridgeRococoGrandpa", + parachainsPalletName: "bridgeRococoParachains", + messagesPalletName: "bridgeRococoMessages", + bridgedBridgeHubParaId: 1013, +} diff --git a/bridges/testing/framework/js-helpers/chains/westend-at-rococo.js b/bridges/testing/framework/js-helpers/chains/westend-at-rococo.js new file mode 100644 index 0000000000000000000000000000000000000000..6a15b64a23b7c28f2b66a6491caebafc4c93dff5 --- /dev/null +++ b/bridges/testing/framework/js-helpers/chains/westend-at-rococo.js @@ -0,0 +1,6 @@ +module.exports = { + grandpaPalletName: "bridgeWestendGrandpa", + parachainsPalletName: "bridgeWestendParachains", + messagesPalletName: "bridgeWestendMessages", + bridgedBridgeHubParaId: 1002, +} diff --git a/bridges/zombienet/helpers/native-assets-balance-increased.js b/bridges/testing/framework/js-helpers/native-assets-balance-increased.js similarity index 74% rename from bridges/zombienet/helpers/native-assets-balance-increased.js rename to bridges/testing/framework/js-helpers/native-assets-balance-increased.js index 9ee1a769e9f2807ed7b73ca9c6aa4b89d5c135f9..749c3e2fec32ac0af4d244c53cb4ac1c6237817a 100644 --- a/bridges/zombienet/helpers/native-assets-balance-increased.js +++ b/bridges/testing/framework/js-helpers/native-assets-balance-increased.js @@ -3,18 +3,19 @@ async function run(nodeName, networkInfo, args) { const api = await zombie.connect(wsUri, userDefinedTypes); const accountAddress = args[0]; + const expectedIncrease = BigInt(args[1]); const initialAccountData = await api.query.system.account(accountAddress); const initialAccountBalance = initialAccountData.data['free']; while (true) { const accountData = await api.query.system.account(accountAddress); const accountBalance = accountData.data['free']; - if (accountBalance > initialAccountBalance) { + if (accountBalance > initialAccountBalance + expectedIncrease) { return accountBalance; } // else sleep and retry - await new Promise((resolve) => setTimeout(resolve, 12000)); + await new Promise((resolve) => setTimeout(resolve, 6000)); } } -module.exports = { run } +module.exports = {run} diff --git a/bridges/zombienet/helpers/only-mandatory-headers-synced-when-idle.js b/bridges/testing/framework/js-helpers/only-mandatory-headers-synced-when-idle.js similarity index 88% rename from bridges/zombienet/helpers/only-mandatory-headers-synced-when-idle.js rename to bridges/testing/framework/js-helpers/only-mandatory-headers-synced-when-idle.js index 3a3432cfaf38da93f3ea0e65657f266b66f84d74..979179245ebe9f5b250efca6f2e6199ef0ac86d7 100644 --- a/bridges/zombienet/helpers/only-mandatory-headers-synced-when-idle.js +++ b/bridges/testing/framework/js-helpers/only-mandatory-headers-synced-when-idle.js @@ -10,7 +10,7 @@ async function run(nodeName, networkInfo, args) { // start listening to new blocks let totalGrandpaHeaders = 0; - let totalParachainHeaders = 0; + let initialParachainHeaderImported = false; api.rpc.chain.subscribeNewHeads(async function (header) { const apiAtParent = await api.at(header.parentHash); const apiAtCurrent = await api.at(header.hash); @@ -22,7 +22,7 @@ async function run(nodeName, networkInfo, args) { apiAtCurrent, currentEvents, ); - totalParachainHeaders += await utils.ensureOnlyInitialParachainHeaderImported( + initialParachainHeaderImported = await utils.ensureOnlyInitialParachainHeaderImported( bridgedChain, apiAtParent, apiAtCurrent, @@ -36,7 +36,7 @@ async function run(nodeName, networkInfo, args) { if (totalGrandpaHeaders == 0) { throw new Error("No bridged relay chain headers imported"); } - if (totalParachainHeaders == 0) { + if (!initialParachainHeaderImported) { throw new Error("No bridged parachain headers imported"); } } diff --git a/bridges/zombienet/helpers/only-required-headers-synced-when-idle.js b/bridges/testing/framework/js-helpers/only-required-headers-synced-when-idle.js similarity index 100% rename from bridges/zombienet/helpers/only-required-headers-synced-when-idle.js rename to bridges/testing/framework/js-helpers/only-required-headers-synced-when-idle.js diff --git a/bridges/zombienet/helpers/relayer-rewards.js b/bridges/testing/framework/js-helpers/relayer-rewards.js similarity index 93% rename from bridges/zombienet/helpers/relayer-rewards.js rename to bridges/testing/framework/js-helpers/relayer-rewards.js index a5f567db797722e04d3bfae90745a728ff1abdff..5347c649604fc209042725c9cf269c9d3ca0290f 100644 --- a/bridges/zombienet/helpers/relayer-rewards.js +++ b/bridges/testing/framework/js-helpers/relayer-rewards.js @@ -21,7 +21,7 @@ async function run(nodeName, networkInfo, args) { } // else sleep and retry - await new Promise((resolve) => setTimeout(resolve, 12000)); + await new Promise((resolve) => setTimeout(resolve, 6000)); } } diff --git a/bridges/zombienet/helpers/utils.js b/bridges/testing/framework/js-helpers/utils.js similarity index 98% rename from bridges/zombienet/helpers/utils.js rename to bridges/testing/framework/js-helpers/utils.js index 5a5542b56dfc215a082fc6fbb8c1b9aa018de83e..f6e9f5623b47b3cb3c642245e86654ae9f65358a 100644 --- a/bridges/zombienet/helpers/utils.js +++ b/bridges/testing/framework/js-helpers/utils.js @@ -98,6 +98,6 @@ module.exports = { throw new Error("Unexpected parachain header import: " + newParachainHeaders + " / " + maxNewParachainHeaders); } - return newParachainHeaders; + return hasBestBridgedParachainHeader; }, } diff --git a/bridges/zombienet/helpers/wait-hrmp-channel-opened.js b/bridges/testing/framework/js-helpers/wait-hrmp-channel-opened.js similarity index 91% rename from bridges/zombienet/helpers/wait-hrmp-channel-opened.js rename to bridges/testing/framework/js-helpers/wait-hrmp-channel-opened.js index e700cab1d7481d77631e55492e4b0032f4382028..765d48cc49848ab7a4389f6e0d9b9b3b8cb38f2b 100644 --- a/bridges/zombienet/helpers/wait-hrmp-channel-opened.js +++ b/bridges/testing/framework/js-helpers/wait-hrmp-channel-opened.js @@ -15,7 +15,7 @@ async function run(nodeName, networkInfo, args) { } // else sleep and retry - await new Promise((resolve) => setTimeout(resolve, 12000)); + await new Promise((resolve) => setTimeout(resolve, 6000)); } } diff --git a/bridges/zombienet/helpers/wrapped-assets-balance.js b/bridges/testing/framework/js-helpers/wrapped-assets-balance.js similarity index 93% rename from bridges/zombienet/helpers/wrapped-assets-balance.js rename to bridges/testing/framework/js-helpers/wrapped-assets-balance.js index bb3cea8858a850e551ba0380b1557ccad0761717..27287118547f702b3e94eb635f9e3855d1cab535 100644 --- a/bridges/zombienet/helpers/wrapped-assets-balance.js +++ b/bridges/testing/framework/js-helpers/wrapped-assets-balance.js @@ -19,7 +19,7 @@ async function run(nodeName, networkInfo, args) { } // else sleep and retry - await new Promise((resolve) => setTimeout(resolve, 12000)); + await new Promise((resolve) => setTimeout(resolve, 6000)); } } diff --git a/cumulus/scripts/bridges_common.sh b/bridges/testing/framework/utils/bridges.sh similarity index 97% rename from cumulus/scripts/bridges_common.sh rename to bridges/testing/framework/utils/bridges.sh index 029d4cd4ff74a5c88165913a48b2b369c0f185b8..7c8399461584a85e4e8eedf5f347d9d74725f1c9 100755 --- a/cumulus/scripts/bridges_common.sh +++ b/bridges/testing/framework/utils/bridges.sh @@ -2,7 +2,7 @@ function relayer_path() { local default_path=~/local_bridge_testing/bin/substrate-relay - local path="${SUBSTRATE_RELAY_PATH:-$default_path}" + local path="${SUBSTRATE_RELAY_BINARY:-$default_path}" echo "$path" } @@ -41,8 +41,8 @@ function ensure_polkadot_js_api() { echo "" echo "" echo "-------------------" - echo "Installing (nodejs) sub module: $(dirname "$0")/generate_hex_encoded_call" - pushd $(dirname "$0")/generate_hex_encoded_call + echo "Installing (nodejs) sub module: ${BASH_SOURCE%/*}/generate_hex_encoded_call" + pushd ${BASH_SOURCE%/*}/generate_hex_encoded_call npm install popd fi @@ -65,7 +65,7 @@ function generate_hex_encoded_call_data() { shift echo "Input params: $@" - node $(dirname "$0")/generate_hex_encoded_call "$type" "$endpoint" "$output" "$@" + node ${BASH_SOURCE%/*}/../utils/generate_hex_encoded_call "$type" "$endpoint" "$output" "$@" local retVal=$? if [ $type != "check" ]; then diff --git a/bridges/testing/framework/utils/common.sh b/bridges/testing/framework/utils/common.sh new file mode 100644 index 0000000000000000000000000000000000000000..06f41320be1353720fccc76b7b76e69ba56a3b94 --- /dev/null +++ b/bridges/testing/framework/utils/common.sh @@ -0,0 +1,45 @@ +#!/bin/bash + +function start_background_process() { + local command=$1 + local log_file=$2 + local __pid=$3 + + $command > $log_file 2>&1 & + eval $__pid="'$!'" +} + +function wait_for_process_file() { + local pid=$1 + local file=$2 + local timeout=$3 + local __found=$4 + + local time=0 + until [ -e $file ]; do + if ! kill -0 $pid; then + echo "Process finished unsuccessfully" + return + fi + if (( time++ >= timeout )); then + echo "Timeout waiting for file $file: $timeout seconds" + eval $__found=0 + return + fi + sleep 1 + done + + echo "File $file found after $time seconds" + eval $__found=1 +} + +function ensure_process_file() { + local pid=$1 + local file=$2 + local timeout=$3 + + wait_for_process_file $pid $file $timeout file_found + if [ "$file_found" != "1" ]; then + exit 1 + fi +} diff --git a/cumulus/scripts/generate_hex_encoded_call/index.js b/bridges/testing/framework/utils/generate_hex_encoded_call/index.js similarity index 90% rename from cumulus/scripts/generate_hex_encoded_call/index.js rename to bridges/testing/framework/utils/generate_hex_encoded_call/index.js index 30f89d754ceb7de1b24bc31413e09c862a461256..c8e361b25a9ce3e56f3c839d53e2fc67106a98c8 100644 --- a/cumulus/scripts/generate_hex_encoded_call/index.js +++ b/bridges/testing/framework/utils/generate_hex_encoded_call/index.js @@ -126,36 +126,36 @@ if (!process.argv[2] || !process.argv[3]) { } const type = process.argv[2]; -const rpcEnpoint = process.argv[3]; +const rpcEndpoint = process.argv[3]; const output = process.argv[4]; const inputArgs = process.argv.slice(5, process.argv.length); console.log(`Generating hex-encoded call data for:`); console.log(` type: ${type}`); -console.log(` rpcEnpoint: ${rpcEnpoint}`); +console.log(` rpcEndpoint: ${rpcEndpoint}`); console.log(` output: ${output}`); console.log(` inputArgs: ${inputArgs}`); switch (type) { case 'remark-with-event': - remarkWithEvent(rpcEnpoint, output); + remarkWithEvent(rpcEndpoint, output); break; case 'add-exporter-config': - addExporterConfig(rpcEnpoint, output, inputArgs[0], inputArgs[1]); + addExporterConfig(rpcEndpoint, output, inputArgs[0], inputArgs[1]); break; case 'remove-exporter-config': - removeExporterConfig(rpcEnpoint, output, inputArgs[0], inputArgs[1]); + removeExporterConfig(rpcEndpoint, output, inputArgs[0], inputArgs[1]); break; case 'add-universal-alias': - addUniversalAlias(rpcEnpoint, output, inputArgs[0], inputArgs[1]); + addUniversalAlias(rpcEndpoint, output, inputArgs[0], inputArgs[1]); break; case 'add-reserve-location': - addReserveLocation(rpcEnpoint, output, inputArgs[0]); + addReserveLocation(rpcEndpoint, output, inputArgs[0]); break; case 'force-create-asset': - forceCreateAsset(rpcEnpoint, output, inputArgs[0], inputArgs[1], inputArgs[2], inputArgs[3]); + forceCreateAsset(rpcEndpoint, output, inputArgs[0], inputArgs[1], inputArgs[2], inputArgs[3]); break; case 'force-xcm-version': - forceXcmVersion(rpcEnpoint, output, inputArgs[0], inputArgs[1]); + forceXcmVersion(rpcEndpoint, output, inputArgs[0], inputArgs[1]); break; case 'check': console.log(`Checking nodejs installation, if you see this everything is ready!`); diff --git a/cumulus/scripts/generate_hex_encoded_call/package-lock.json b/bridges/testing/framework/utils/generate_hex_encoded_call/package-lock.json similarity index 100% rename from cumulus/scripts/generate_hex_encoded_call/package-lock.json rename to bridges/testing/framework/utils/generate_hex_encoded_call/package-lock.json diff --git a/cumulus/scripts/generate_hex_encoded_call/package.json b/bridges/testing/framework/utils/generate_hex_encoded_call/package.json similarity index 100% rename from cumulus/scripts/generate_hex_encoded_call/package.json rename to bridges/testing/framework/utils/generate_hex_encoded_call/package.json diff --git a/bridges/testing/framework/utils/zombienet.sh b/bridges/testing/framework/utils/zombienet.sh new file mode 100644 index 0000000000000000000000000000000000000000..bbcd1a30620252d8740473c3924e0988e5bff4d6 --- /dev/null +++ b/bridges/testing/framework/utils/zombienet.sh @@ -0,0 +1,39 @@ +#!/bin/bash + +source "${BASH_SOURCE%/*}/common.sh" + +function start_zombienet() { + local test_dir=$1 + local definition_path=$2 + local __zombienet_dir=$3 + local __zombienet_pid=$4 + + local zombienet_name=`basename $definition_path .toml` + local zombienet_dir=$test_dir/$zombienet_name + eval $__zombienet_dir="'$zombienet_dir'" + mkdir -p $zombienet_dir + rm -rf $zombienet_dir + + local logs_dir=$test_dir/logs + mkdir -p $logs_dir + local zombienet_log=$logs_dir/$zombienet_name.log + + echo "Starting $zombienet_name zombienet. Logs available at: $zombienet_log" + start_background_process \ + "$ZOMBIENET_BINARY spawn --dir $zombienet_dir --provider native $definition_path" \ + "$zombienet_log" zombienet_pid + + ensure_process_file $zombienet_pid "$zombienet_dir/zombie.json" 180 + echo "$zombienet_name zombienet started successfully" + + eval $__zombienet_pid="'$zombienet_pid'" +} + +function run_zndsl() { + local zndsl_file=$1 + local zombienet_dir=$2 + + echo "Running $zndsl_file." + $ZOMBIENET_BINARY test --dir $zombienet_dir --provider native $zndsl_file $zombienet_dir/zombie.json + echo +} diff --git a/bridges/testing/run-new-test.sh b/bridges/testing/run-new-test.sh new file mode 100755 index 0000000000000000000000000000000000000000..7c84a69aa47de84439091cb7b908233d02238175 --- /dev/null +++ b/bridges/testing/run-new-test.sh @@ -0,0 +1,48 @@ +#!/bin/bash + +set -e + +trap 'kill -9 -$$ || echo "Environment already teared down"' SIGINT SIGTERM EXIT + +test=$1 +shift + +# whether to use paths for zombienet+bridges tests container or for local testing +ZOMBIENET_DOCKER_PATHS=0 +while [ $# -ne 0 ] +do + arg="$1" + case "$arg" in + --docker) + ZOMBIENET_DOCKER_PATHS=1 + ;; + esac + shift +done + +export POLKADOT_SDK_PATH=`realpath ${BASH_SOURCE%/*}/../..` +export FRAMEWORK_PATH=`realpath ${BASH_SOURCE%/*}/framework` + +# set path to binaries +if [ "$ZOMBIENET_DOCKER_PATHS" -eq 1 ]; then + # otherwise zombienet uses some hardcoded paths + unset RUN_IN_CONTAINER + unset ZOMBIENET_IMAGE + + export POLKADOT_BINARY=/usr/local/bin/polkadot + export POLKADOT_PARACHAIN_BINARY=/usr/local/bin/polkadot-parachain + + export ZOMBIENET_BINARY=/usr/local/bin/zombie + export SUBSTRATE_RELAY_BINARY=/usr/local/bin/substrate-relay +else + export POLKADOT_BINARY=$POLKADOT_SDK_PATH/target/release/polkadot + export POLKADOT_PARACHAIN_BINARY=$POLKADOT_SDK_PATH/target/release/polkadot-parachain + + export ZOMBIENET_BINARY=~/local_bridge_testing/bin/zombienet-linux-x64 + export SUBSTRATE_RELAY_BINARY=~/local_bridge_testing/bin/substrate-relay +fi + +export TEST_DIR=`mktemp -d /tmp/bridges-tests-run-XXXXX` +echo -e "Test folder: $TEST_DIR\n" + +${BASH_SOURCE%/*}/tests/$test/run.sh diff --git a/bridges/zombienet/run-tests.sh b/bridges/testing/run-tests.sh similarity index 77% rename from bridges/zombienet/run-tests.sh rename to bridges/testing/run-tests.sh index cf3b529e6a9d9823f875938d8603b363c6079136..fd12b57f53349a0a449af7103c05341d3c94ceb9 100755 --- a/bridges/zombienet/run-tests.sh +++ b/bridges/testing/run-tests.sh @@ -27,34 +27,27 @@ done # assuming that we'll be using native provide && all processes will be executing locally # (we need absolute paths here, because they're used when scripts are called by zombienet from tmp folders) -export POLKADOT_SDK_FOLDER=`realpath $(dirname "$0")/../..` -export BRIDGE_TESTS_FOLDER=$POLKADOT_SDK_FOLDER/bridges/zombienet/tests +export POLKADOT_SDK_PATH=`realpath $(dirname "$0")/../..` +export BRIDGE_TESTS_FOLDER=$POLKADOT_SDK_PATH/bridges/testing/tests -# set pathc to binaries +# set path to binaries if [ "$ZOMBIENET_DOCKER_PATHS" -eq 1 ]; then - export POLKADOT_BINARY_PATH=/usr/local/bin/polkadot - export POLKADOT_PARACHAIN_BINARY_PATH=/usr/local/bin/polkadot-parachain - export POLKADOT_PARACHAIN_BINARY_PATH_FOR_ASSET_HUB_ROCOCO=/usr/local/bin/polkadot-parachain - export POLKADOT_PARACHAIN_BINARY_PATH_FOR_ASSET_HUB_WESTEND=/usr/local/bin/polkadot-parachain + export POLKADOT_BINARY=/usr/local/bin/polkadot + export POLKADOT_PARACHAIN_BINARY=/usr/local/bin/polkadot-parachain - export SUBSTRATE_RELAY_PATH=/usr/local/bin/substrate-relay + export SUBSTRATE_RELAY_BINARY=/usr/local/bin/substrate-relay export ZOMBIENET_BINARY_PATH=/usr/local/bin/zombie else - export POLKADOT_BINARY_PATH=$POLKADOT_SDK_FOLDER/target/release/polkadot - export POLKADOT_PARACHAIN_BINARY_PATH=$POLKADOT_SDK_FOLDER/target/release/polkadot-parachain - export POLKADOT_PARACHAIN_BINARY_PATH_FOR_ASSET_HUB_ROCOCO=$POLKADOT_PARACHAIN_BINARY_PATH - export POLKADOT_PARACHAIN_BINARY_PATH_FOR_ASSET_HUB_WESTEND=$POLKADOT_PARACHAIN_BINARY_PATH + export POLKADOT_BINARY=$POLKADOT_SDK_PATH/target/release/polkadot + export POLKADOT_PARACHAIN_BINARY=$POLKADOT_SDK_PATH/target/release/polkadot-parachain - export SUBSTRATE_RELAY_PATH=~/local_bridge_testing/bin/substrate-relay + export SUBSTRATE_RELAY_BINARY=~/local_bridge_testing/bin/substrate-relay export ZOMBIENET_BINARY_PATH=~/local_bridge_testing/bin/zombienet-linux fi # check if `wait` supports -p flag if [ `printf "$BASH_VERSION\n5.1" | sort -V | head -n 1` = "5.1" ]; then IS_BASH_5_1=1; else IS_BASH_5_1=0; fi -# check if `wait` supports -p flag -if [ `printf "$BASH_VERSION\n5.1" | sort -V | head -n 1` = "5.1" ]; then IS_BASH_5_1=1; else IS_BASH_5_1=0; fi - # bridge configuration export LANE_ID="00000002" diff --git a/bridges/zombienet/scripts/invoke-script.sh b/bridges/testing/scripts/invoke-script.sh similarity index 62% rename from bridges/zombienet/scripts/invoke-script.sh rename to bridges/testing/scripts/invoke-script.sh index 835b4fe500f01ea2968bcb8bff538491ec7149bc..cd0557b071bbadc41e056a2e50c9f1aa0b677312 100755 --- a/bridges/zombienet/scripts/invoke-script.sh +++ b/bridges/testing/scripts/invoke-script.sh @@ -2,6 +2,6 @@ INVOKE_LOG=`mktemp -p $TEST_FOLDER invoke.XXXXX` -pushd $POLKADOT_SDK_FOLDER/cumulus/scripts +pushd $POLKADOT_SDK_PATH/bridges/testing/environments/rococo-westend ./bridges_rococo_westend.sh $1 >$INVOKE_LOG 2>&1 popd diff --git a/bridges/zombienet/scripts/start-relayer.sh b/bridges/testing/scripts/start-relayer.sh similarity index 63% rename from bridges/zombienet/scripts/start-relayer.sh rename to bridges/testing/scripts/start-relayer.sh index 2f72b5ee556bcc8a89b2de4c5d3c53db8ac072b1..38ea62fad524486c40cf88943c48a2e4df4b86e8 100755 --- a/bridges/zombienet/scripts/start-relayer.sh +++ b/bridges/testing/scripts/start-relayer.sh @@ -2,6 +2,6 @@ RELAY_LOG=`mktemp -p $TEST_FOLDER relay.XXXXX` -pushd $POLKADOT_SDK_FOLDER/cumulus/scripts +pushd $POLKADOT_SDK_PATH/bridges/testing/environments/rococo-westend ./bridges_rococo_westend.sh run-relay >$RELAY_LOG 2>&1& popd diff --git a/bridges/zombienet/scripts/sync-exit.sh b/bridges/testing/scripts/sync-exit.sh similarity index 100% rename from bridges/zombienet/scripts/sync-exit.sh rename to bridges/testing/scripts/sync-exit.sh diff --git a/bridges/testing/tests/0001-asset-transfer/roc-reaches-westend.zndsl b/bridges/testing/tests/0001-asset-transfer/roc-reaches-westend.zndsl new file mode 100644 index 0000000000000000000000000000000000000000..cdb7d28e940cf1ac90562e761cdbad00e95e1748 --- /dev/null +++ b/bridges/testing/tests/0001-asset-transfer/roc-reaches-westend.zndsl @@ -0,0 +1,12 @@ +Description: User is able to transfer ROC from Rococo Asset Hub to Westend Asset Hub and back +Network: {{ENV_PATH}}/bridge_hub_westend_local_network.toml +Creds: config + +# send 5 ROC to //Alice from Rococo AH to Westend AH +asset-hub-westend-collator1: run {{ENV_PATH}}/helper.sh with "reserve-transfer-assets-from-asset-hub-rococo-local 5000000000000" within 120 seconds + +# check that //Alice received at least 4.8 ROC on Westend AH +asset-hub-westend-collator1: js-script {{FRAMEWORK_PATH}}/js-helpers/wrapped-assets-balance.js with "5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY,4800000000000,Rococo" within 600 seconds + +# check that the relayer //Charlie is rewarded by Westend AH +bridge-hub-westend-collator1: js-script {{FRAMEWORK_PATH}}/js-helpers/relayer-rewards.js with "5FLSigC9HGRKVhB9FiEo4Y3koPsNmBmLJbpXg2mp1hXcS59Y,0x00000002,0x6268726F,ThisChain,0" within 30 seconds diff --git a/bridges/testing/tests/0001-asset-transfer/run.sh b/bridges/testing/tests/0001-asset-transfer/run.sh new file mode 100755 index 0000000000000000000000000000000000000000..a7bb122919b40187c49e89c489d2271d646bff40 --- /dev/null +++ b/bridges/testing/tests/0001-asset-transfer/run.sh @@ -0,0 +1,25 @@ +#!/bin/bash + +set -e + +source "${BASH_SOURCE%/*}/../../framework/utils/common.sh" +source "${BASH_SOURCE%/*}/../../framework/utils/zombienet.sh" + +export ENV_PATH=`realpath ${BASH_SOURCE%/*}/../../environments/rococo-westend` + +$ENV_PATH/spawn.sh --init --start-relayer & +env_pid=$! + +ensure_process_file $env_pid $TEST_DIR/rococo.env 600 +rococo_dir=`cat $TEST_DIR/rococo.env` +echo + +ensure_process_file $env_pid $TEST_DIR/westend.env 300 +westend_dir=`cat $TEST_DIR/westend.env` +echo + +run_zndsl ${BASH_SOURCE%/*}/roc-reaches-westend.zndsl $westend_dir +run_zndsl ${BASH_SOURCE%/*}/wnd-reaches-rococo.zndsl $rococo_dir + +run_zndsl ${BASH_SOURCE%/*}/wroc-reaches-rococo.zndsl $rococo_dir +run_zndsl ${BASH_SOURCE%/*}/wwnd-reaches-westend.zndsl $westend_dir diff --git a/bridges/testing/tests/0001-asset-transfer/wnd-reaches-rococo.zndsl b/bridges/testing/tests/0001-asset-transfer/wnd-reaches-rococo.zndsl new file mode 100644 index 0000000000000000000000000000000000000000..dbc03864e2b6e5e10636532ad965860b381fa8f2 --- /dev/null +++ b/bridges/testing/tests/0001-asset-transfer/wnd-reaches-rococo.zndsl @@ -0,0 +1,12 @@ +Description: User is able to transfer WND from Westend Asset Hub to Rococo Asset Hub and back +Network: {{ENV_PATH}}/bridge_hub_rococo_local_network.toml +Creds: config + +# send 5 WND to //Alice from Westend AH to Rococo AH +asset-hub-rococo-collator1: run {{ENV_PATH}}/helper.sh with "reserve-transfer-assets-from-asset-hub-westend-local 5000000000000" within 120 seconds + +# check that //Alice received at least 4.8 WND on Rococo AH +asset-hub-rococo-collator1: js-script {{FRAMEWORK_PATH}}/js-helpers/wrapped-assets-balance.js with "5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY,4800000000000,Westend" within 600 seconds + +# check that the relayer //Charlie is rewarded by Rococo AH +bridge-hub-rococo-collator1: js-script {{FRAMEWORK_PATH}}/js-helpers/relayer-rewards.js with "5FLSigC9HGRKVhB9FiEo4Y3koPsNmBmLJbpXg2mp1hXcS59Y,0x00000002,0x62687764,ThisChain,0" within 30 seconds diff --git a/bridges/testing/tests/0001-asset-transfer/wroc-reaches-rococo.zndsl b/bridges/testing/tests/0001-asset-transfer/wroc-reaches-rococo.zndsl new file mode 100644 index 0000000000000000000000000000000000000000..9967732cabe15e020060eb0a53fd8ce1440180e5 --- /dev/null +++ b/bridges/testing/tests/0001-asset-transfer/wroc-reaches-rococo.zndsl @@ -0,0 +1,10 @@ +Description: User is able to transfer ROC from Rococo Asset Hub to Westend Asset Hub and back +Network: {{ENV_PATH}}/bridge_hub_westend_local_network.toml +Creds: config + +# send 3 wROC back to Alice from Westend AH to Rococo AH +asset-hub-rococo-collator1: run {{ENV_PATH}}/helper.sh with "withdraw-reserve-assets-from-asset-hub-westend-local 3000000000000" within 120 seconds + +# check that //Alice received at least 2.8 wROC on Rococo AH +# (we wait until //Alice account increases here - there are no other transactions that may increase it) +asset-hub-rococo-collator1: js-script {{FRAMEWORK_PATH}}/js-helpers/native-assets-balance-increased.js with "5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY,2800000000000" within 600 seconds diff --git a/bridges/testing/tests/0001-asset-transfer/wwnd-reaches-westend.zndsl b/bridges/testing/tests/0001-asset-transfer/wwnd-reaches-westend.zndsl new file mode 100644 index 0000000000000000000000000000000000000000..2037b0baf3c0aac2a0e1a8f297c6baa155ac680f --- /dev/null +++ b/bridges/testing/tests/0001-asset-transfer/wwnd-reaches-westend.zndsl @@ -0,0 +1,10 @@ +Description: User is able to transfer ROC from Rococo Asset Hub to Westend Asset Hub and back +Network: {{ENV_PATH}}/bridge_hub_westend_local_network.toml +Creds: config + +# send 3 wWND back to Alice from Rococo AH to Westend AH +asset-hub-westend-collator1: run {{ENV_PATH}}/helper.sh with "withdraw-reserve-assets-from-asset-hub-rococo-local 3000000000000" within 120 seconds + +# check that //Alice received at least 2.8 wWND on Westend AH +# (we wait until //Alice account increases here - there are no other transactions that may increase it) +asset-hub-westend-collator1: js-script {{FRAMEWORK_PATH}}/js-helpers/native-assets-balance-increased.js with "5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY,2800000000000" within 600 seconds diff --git a/bridges/testing/tests/0002-mandatory-headers-synced-while-idle/rococo-to-westend.zndsl b/bridges/testing/tests/0002-mandatory-headers-synced-while-idle/rococo-to-westend.zndsl new file mode 100644 index 0000000000000000000000000000000000000000..6e381f5377329430c0d7a8723f9ea9081556bfeb --- /dev/null +++ b/bridges/testing/tests/0002-mandatory-headers-synced-while-idle/rococo-to-westend.zndsl @@ -0,0 +1,8 @@ +Description: While relayer is idle, we only sync mandatory Rococo (and a single Rococo BH) headers to Westend BH. +Network: {{ENV_PATH}}/bridge_hub_westend_local_network.toml +Creds: config + +# ensure that relayer is only syncing mandatory headers while idle. This includes both headers that were +# generated while relay was offline and those in the next 100 seconds while script is active. +bridge-hub-westend-collator1: js-script {{FRAMEWORK_PATH}}/js-helpers/only-mandatory-headers-synced-when-idle.js with "300,rococo-at-westend" within 600 seconds + diff --git a/bridges/testing/tests/0002-mandatory-headers-synced-while-idle/run.sh b/bridges/testing/tests/0002-mandatory-headers-synced-while-idle/run.sh new file mode 100755 index 0000000000000000000000000000000000000000..3a604b3876d96241903c1c5a110cc6392f26cb7e --- /dev/null +++ b/bridges/testing/tests/0002-mandatory-headers-synced-while-idle/run.sh @@ -0,0 +1,35 @@ +#!/bin/bash + +set -e + +source "${BASH_SOURCE%/*}/../../framework/utils/common.sh" +source "${BASH_SOURCE%/*}/../../framework/utils/zombienet.sh" + +export ENV_PATH=`realpath ${BASH_SOURCE%/*}/../../environments/rococo-westend` + +$ENV_PATH/spawn.sh & +env_pid=$! + +ensure_process_file $env_pid $TEST_DIR/rococo.env 600 +rococo_dir=`cat $TEST_DIR/rococo.env` +echo + +ensure_process_file $env_pid $TEST_DIR/westend.env 300 +westend_dir=`cat $TEST_DIR/westend.env` +echo + +# Sleep for some time before starting the relayer. We want to sleep for at least 1 session, +# which is expected to be 60 seconds for the test environment. +echo -e "Sleeping 90s before starting relayer ...\n" +sleep 90 +${BASH_SOURCE%/*}/../../environments/rococo-westend/start_relayer.sh $rococo_dir $westend_dir relayer_pid + +# Sometimes the relayer syncs multiple parachain heads in the beginning leading to test failures. +# See issue: https://github.com/paritytech/parity-bridges-common/issues/2838. +# TODO: Remove this sleep after the issue is fixed. +echo -e "Sleeping 180s before runing the tests ...\n" +sleep 180 + +run_zndsl ${BASH_SOURCE%/*}/rococo-to-westend.zndsl $westend_dir +run_zndsl ${BASH_SOURCE%/*}/westend-to-rococo.zndsl $rococo_dir + diff --git a/bridges/testing/tests/0002-mandatory-headers-synced-while-idle/westend-to-rococo.zndsl b/bridges/testing/tests/0002-mandatory-headers-synced-while-idle/westend-to-rococo.zndsl new file mode 100644 index 0000000000000000000000000000000000000000..b4b3e43679162feb8c3c5253f3f963d950f31d55 --- /dev/null +++ b/bridges/testing/tests/0002-mandatory-headers-synced-while-idle/westend-to-rococo.zndsl @@ -0,0 +1,7 @@ +Description: While relayer is idle, we only sync mandatory Westend (and a single Westend BH) headers to Rococo BH. +Network: {{ENV_PATH}}/bridge_hub_rococo_local_network.toml +Creds: config + +# ensure that relayer is only syncing mandatory headers while idle. This includes both headers that were +# generated while relay was offline and those in the next 100 seconds while script is active. +bridge-hub-rococo-collator1: js-script {{FRAMEWORK_PATH}}/js-helpers/only-mandatory-headers-synced-when-idle.js with "300,westend-at-rococo" within 600 seconds diff --git a/bridges/zombienet/tests/0003-required-headers-synced-while-active-rococo-to-westend.zndsl b/bridges/testing/tests/0003-required-headers-synced-while-active-rococo-to-westend.zndsl similarity index 77% rename from bridges/zombienet/tests/0003-required-headers-synced-while-active-rococo-to-westend.zndsl rename to bridges/testing/tests/0003-required-headers-synced-while-active-rococo-to-westend.zndsl index a4960344f0a03265d2accfa52cd9a4ab1d7117d6..07b91481dc7cf995b913a9bf84edd3728982eaae 100644 --- a/bridges/zombienet/tests/0003-required-headers-synced-while-active-rococo-to-westend.zndsl +++ b/bridges/testing/tests/0003-required-headers-synced-while-active-rococo-to-westend.zndsl @@ -1,5 +1,5 @@ Description: While relayer is active, we only sync mandatory and required Rococo (and Rococo BH) headers to Westend BH. -Network: ../../../cumulus/zombienet/bridge-hubs/bridge_hub_westend_local_network.toml +Network: ../environments/rococo-westend/bridge_hub_westend_local_network.toml Creds: config # step 1: initialize Westend AH @@ -9,7 +9,7 @@ asset-hub-westend-collator1: run ../scripts/invoke-script.sh with "init-asset-hu bridge-hub-westend-collator1: run ../scripts/invoke-script.sh with "init-bridge-hub-westend-local" within 60 seconds # step 3: ensure that initialization has completed -asset-hub-westend-collator1: js-script ../helpers/wait-hrmp-channel-opened.js with "1002" within 600 seconds +asset-hub-westend-collator1: js-script ../js-helpers/wait-hrmp-channel-opened.js with "1002" within 600 seconds # step 4: send message from Westend to Rococo asset-hub-westend-collator1: run ../scripts/invoke-script.sh with "reserve-transfer-assets-from-asset-hub-westend-local" within 60 seconds @@ -20,7 +20,7 @@ asset-hub-westend-collator1: run ../scripts/invoke-script.sh with "reserve-trans # (it is started by sibling 0003-required-headers-synced-while-active-westend-to-rococo.zndsl) # step 6: ensure that relayer won't sync any extra headers while delivering messages and confirmations -bridge-hub-westend-collator1: js-script ../helpers/only-required-headers-synced-when-active.js with "500,rococo-at-westend" within 600 seconds +bridge-hub-westend-collator1: js-script ../js-helpers/only-required-headers-synced-when-active.js with "500,rococo-at-westend" within 600 seconds # wait until other network test has completed OR exit with an error too asset-hub-westend-collator1: run ../scripts/sync-exit.sh within 600 seconds diff --git a/bridges/zombienet/tests/0003-required-headers-synced-while-active-westend-to-rococo.zndsl b/bridges/testing/tests/0003-required-headers-synced-while-active-westend-to-rococo.zndsl similarity index 77% rename from bridges/zombienet/tests/0003-required-headers-synced-while-active-westend-to-rococo.zndsl rename to bridges/testing/tests/0003-required-headers-synced-while-active-westend-to-rococo.zndsl index 33c3ceebcf844cc6029d41deb289b1a1d8103132..a6b11fc24052aadf562bc34704aeda9ee115eccf 100644 --- a/bridges/zombienet/tests/0003-required-headers-synced-while-active-westend-to-rococo.zndsl +++ b/bridges/testing/tests/0003-required-headers-synced-while-active-westend-to-rococo.zndsl @@ -1,5 +1,5 @@ Description: While relayer is active, we only sync mandatory and required Westend (and Westend BH) headers to Rococo BH. -Network: ../../../cumulus/zombienet/bridge-hubs/bridge_hub_rococo_local_network.toml +Network: ../environments/rococo-westend/bridge_hub_rococo_local_network.toml Creds: config # step 1: initialize Rococo AH @@ -9,7 +9,7 @@ asset-hub-rococo-collator1: run ../scripts/invoke-script.sh with "init-asset-hub bridge-hub-rococo-collator1: run ../scripts/invoke-script.sh with "init-bridge-hub-rococo-local" within 60 seconds # step 3: ensure that initialization has completed -asset-hub-rococo-collator1: js-script ../helpers/wait-hrmp-channel-opened.js with "1013" within 600 seconds +asset-hub-rococo-collator1: js-script ../js-helpers/wait-hrmp-channel-opened.js with "1013" within 600 seconds # step 4: send message from Rococo to Westend asset-hub-rococo-collator1: run ../scripts/invoke-script.sh with "reserve-transfer-assets-from-asset-hub-rococo-local" within 60 seconds @@ -20,7 +20,7 @@ asset-hub-rococo-collator1: run ../scripts/invoke-script.sh with "reserve-transf bridge-hub-rococo-collator1: run ../scripts/start-relayer.sh within 60 seconds # step 6: ensure that relayer won't sync any extra headers while delivering messages and confirmations -bridge-hub-rococo-collator1: js-script ../helpers/only-required-headers-synced-when-active.js with "500,westend-at-rococo" within 600 seconds +bridge-hub-rococo-collator1: js-script ../js-helpers/only-required-headers-synced-when-active.js with "500,westend-at-rococo" within 600 seconds # wait until other network test has completed OR exit with an error too asset-hub-rococo-collator1: run ../scripts/sync-exit.sh within 600 seconds diff --git a/bridges/zombienet/helpers/chains/rococo-at-westend.js b/bridges/zombienet/helpers/chains/rococo-at-westend.js deleted file mode 100644 index eb9510e46f0b7ba94e55968816accac185373c7c..0000000000000000000000000000000000000000 --- a/bridges/zombienet/helpers/chains/rococo-at-westend.js +++ /dev/null @@ -1,6 +0,0 @@ -module.exports = { - grandpaPalletName: "bridgeRococoGrandpa", - parachainsPalletName: "bridgeRococoParachains", - messagesPalletName: "bridgeRococoMessages", - bridgedBridgeHubParaId: 1013, -} diff --git a/bridges/zombienet/helpers/chains/westend-at-rococo.js b/bridges/zombienet/helpers/chains/westend-at-rococo.js deleted file mode 100644 index 771a0778cb098c4e1e3a5c124c81cc38e2aac695..0000000000000000000000000000000000000000 --- a/bridges/zombienet/helpers/chains/westend-at-rococo.js +++ /dev/null @@ -1,6 +0,0 @@ -module.exports = { - grandpaPalletName: "bridgeWestendGrandpa", - parachainsPalletName: "bridgeWestendParachains", - messagesPalletName: "bridgeWestendMessages", - bridgedBridgeHubParaId: 1002, -} diff --git a/bridges/zombienet/tests/0001-asset-transfer-works-rococo-to-westend.zndsl b/bridges/zombienet/tests/0001-asset-transfer-works-rococo-to-westend.zndsl deleted file mode 100644 index 82d1eee2f45cc12b60a85b829d4a4c17588fa9e7..0000000000000000000000000000000000000000 --- a/bridges/zombienet/tests/0001-asset-transfer-works-rococo-to-westend.zndsl +++ /dev/null @@ -1,39 +0,0 @@ -Description: User is able to transfer ROC from Rococo Asset Hub to Westend Asset Hub and back -Network: ../../../cumulus/zombienet/bridge-hubs/bridge_hub_westend_local_network.toml -Creds: config - -# step 0: start relayer -# (started by sibling 0001-asset-transfer-works-westend-to-rococo.zndsl test) - -# step 1: initialize Westend AH -asset-hub-westend-collator1: run ../scripts/invoke-script.sh with "init-asset-hub-westend-local" within 60 seconds - -# step 2: initialize Westend bridge hub -bridge-hub-westend-collator1: run ../scripts/invoke-script.sh with "init-bridge-hub-westend-local" within 60 seconds - -# step 3: ensure that initialization has completed -asset-hub-westend-collator1: js-script ../helpers/wait-hrmp-channel-opened.js with "1002" within 600 seconds - -# step 4: relay is already started - let's wait until with-Rococo GRANPDA pallet is initialized at Westend -bridge-hub-westend-collator1: js-script ../helpers/best-finalized-header-at-bridged-chain.js with "Rococo,0" within 400 seconds - -# step 5: send WND to //Alice on Rococo AH -# (that's a required part of a sibling 0001-asset-transfer-works-westend-to-rococo.zndsl test) -asset-hub-westend-collator1: run ../scripts/invoke-script.sh with "reserve-transfer-assets-from-asset-hub-westend-local" within 60 seconds - -# step 6: elsewhere Rococo has sent ROC to //Alice - let's wait for it -asset-hub-westend-collator1: js-script ../helpers/wrapped-assets-balance.js with "5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY,0,Rococo" within 600 seconds - -# step 7: check that the relayer //Charlie is rewarded by both our AH and target AH -bridge-hub-westend-collator1: js-script ../helpers/relayer-rewards.js with "5FLSigC9HGRKVhB9FiEo4Y3koPsNmBmLJbpXg2mp1hXcS59Y,0x00000002,0x6268726f,BridgedChain,0" within 300 seconds -bridge-hub-westend-collator1: js-script ../helpers/relayer-rewards.js with "5FLSigC9HGRKVhB9FiEo4Y3koPsNmBmLJbpXg2mp1hXcS59Y,0x00000002,0x6268726F,ThisChain,0" within 300 seconds - -# step 8: send wROC back to Alice at Rococo AH -asset-hub-westend-collator1: run ../scripts/invoke-script.sh with "withdraw-reserve-assets-from-asset-hub-westend-local" within 60 seconds - -# step 9: elsewhere Rococo has sent wWND to //Alice - let's wait for it -# (we wait until //Alice account increases here - there are no other transactionc that may increase it) -asset-hub-westend-collator1: js-script ../helpers/native-assets-balance-increased.js with "5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY" within 600 seconds - -# wait until other network test has completed OR exit with an error too -asset-hub-westend-collator1: run ../scripts/sync-exit.sh within 600 seconds diff --git a/bridges/zombienet/tests/0001-asset-transfer-works-westend-to-rococo.zndsl b/bridges/zombienet/tests/0001-asset-transfer-works-westend-to-rococo.zndsl deleted file mode 100644 index acfe0df03d26779abf0dd3c2aa3dfc8f37c0e3aa..0000000000000000000000000000000000000000 --- a/bridges/zombienet/tests/0001-asset-transfer-works-westend-to-rococo.zndsl +++ /dev/null @@ -1,39 +0,0 @@ -Description: User is able to transfer WND from Westend Asset Hub to Rococo Asset Hub and back -Network: ../../../cumulus/zombienet/bridge-hubs/bridge_hub_rococo_local_network.toml -Creds: config - -# step 0: start relayer -bridge-hub-rococo-collator1: run ../scripts/start-relayer.sh within 60 seconds - -# step 1: initialize Rococo AH -asset-hub-rococo-collator1: run ../scripts/invoke-script.sh with "init-asset-hub-rococo-local" within 60 seconds - -# step 2: initialize Rococo bridge hub -bridge-hub-rococo-collator1: run ../scripts/invoke-script.sh with "init-bridge-hub-rococo-local" within 60 seconds - -# step 3: ensure that initialization has completed -asset-hub-rococo-collator1: js-script ../helpers/wait-hrmp-channel-opened.js with "1013" within 600 seconds - -# step 4: relay is already started - let's wait until with-Westend GRANPDA pallet is initialized at Rococo -bridge-hub-rococo-collator1: js-script ../helpers/best-finalized-header-at-bridged-chain.js with "Westend,0" within 400 seconds - -# step 5: send ROC to //Alice on Westend AH -# (that's a required part of a sibling 0001-asset-transfer-works-rococo-to-westend.zndsl test) -asset-hub-rococo-collator1: run ../scripts/invoke-script.sh with "reserve-transfer-assets-from-asset-hub-rococo-local" within 60 seconds - -# step 6: elsewhere Westend has sent WND to //Alice - let's wait for it -asset-hub-rococo-collator1: js-script ../helpers/wrapped-assets-balance.js with "5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY,0,Westend" within 600 seconds - -# step 7: check that the relayer //Charlie is rewarded by both our AH and target AH -bridge-hub-rococo-collator1: js-script ../helpers/relayer-rewards.js with "5FLSigC9HGRKVhB9FiEo4Y3koPsNmBmLJbpXg2mp1hXcS59Y,0x00000002,0x62687764,BridgedChain,0" within 300 seconds -bridge-hub-rococo-collator1: js-script ../helpers/relayer-rewards.js with "5FLSigC9HGRKVhB9FiEo4Y3koPsNmBmLJbpXg2mp1hXcS59Y,0x00000002,0x62687764,ThisChain,0" within 300 seconds - -# step 8: send wWND back to Alice at Westend AH -asset-hub-rococo-collator1: run ../scripts/invoke-script.sh with "withdraw-reserve-assets-from-asset-hub-rococo-local" within 60 seconds - -# step 9: elsewhere Westend has sent wROC to //Alice - let's wait for it -# (we wait until //Alice account increases here - there are no other transactionc that may increase it) -asset-hub-rococo-collator1: js-script ../helpers/native-assets-balance-increased.js with "5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY" within 600 seconds - -# wait until other network test has completed OR exit with an error too -asset-hub-rococo-collator1: run ../scripts/sync-exit.sh within 600 seconds diff --git a/bridges/zombienet/tests/0002-mandatory-headers-synced-while-idle-rococo-to-westend.zndsl b/bridges/zombienet/tests/0002-mandatory-headers-synced-while-idle-rococo-to-westend.zndsl deleted file mode 100644 index eb6a75c373c7add04f895c01e332d40195150370..0000000000000000000000000000000000000000 --- a/bridges/zombienet/tests/0002-mandatory-headers-synced-while-idle-rococo-to-westend.zndsl +++ /dev/null @@ -1,26 +0,0 @@ -Description: While relayer is idle, we only sync mandatory Rococo (and a single Rococo BH) headers to Westend BH. -Network: ../../../cumulus/zombienet/bridge-hubs/bridge_hub_westend_local_network.toml -Creds: config - -# step 1: initialize Westend bridge hub -bridge-hub-westend-collator1: run ../scripts/invoke-script.sh with "init-bridge-hub-westend-local" within 60 seconds - -# step 2: sleep some time before starting relayer. We want to sleep for at least 1 session, which is expected to -# be 60 seconds for test environment. -sleep 120 seconds - -# step 3: start relayer -# (it is started by the sibling 0002-mandatory-headers-synced-while-idle-westend-to-rococo.zndsl test file) - -# it also takes some time for relayer to initialize bridge, so let's sleep for 5 minutes to be sure that parachain -# header has been synced - -# step 4: ensure that relayer is only syncing mandatory headers while idle. This includes both headers that were -# born while relay was offline and those in the next 100 seconds while script is active. -bridge-hub-westend-collator1: js-script ../helpers/only-mandatory-headers-synced-when-idle.js with "300,rococo-at-westend" within 600 seconds - -# wait until other network test has completed OR exit with an error too -asset-hub-westend-collator1: run ../scripts/sync-exit.sh within 600 seconds - -# wait until other network test has completed OR exit with an error too -asset-hub-westend-collator1: run ../scripts/sync-exit.sh within 600 seconds diff --git a/bridges/zombienet/tests/0002-mandatory-headers-synced-while-idle-westend-to-rococo.zndsl b/bridges/zombienet/tests/0002-mandatory-headers-synced-while-idle-westend-to-rococo.zndsl deleted file mode 100644 index 728d54d586a9b46625e3db70251b68c6501db922..0000000000000000000000000000000000000000 --- a/bridges/zombienet/tests/0002-mandatory-headers-synced-while-idle-westend-to-rococo.zndsl +++ /dev/null @@ -1,26 +0,0 @@ -Description: While relayer is idle, we only sync mandatory Westend (and a single Westend BH) headers to Rococo BH. -Network: ../../../cumulus/zombienet/bridge-hubs/bridge_hub_rococo_local_network.toml -Creds: config - -# step 1: initialize Rococo bridge hub -bridge-hub-rococo-collator1: run ../scripts/invoke-script.sh with "init-bridge-hub-rococo-local" within 60 seconds - -# step 2: sleep some time before starting relayer. We want to sleep for at least 1 session, which is expected to -# be 60 seconds for test environment. -sleep 120 seconds - -# step 3: start relayer -bridge-hub-rococo-collator1: run ../scripts/start-relayer.sh within 60 seconds - -# it also takes some time for relayer to initialize bridge, so let's sleep for 5 minutes to be sure that parachain -# header has been synced - -# step 4: ensure that relayer is only syncing mandatory headers while idle. This includes both headers that were -# born while relay was offline and those in the next 100 seconds while script is active. -bridge-hub-rococo-collator1: js-script ../helpers/only-mandatory-headers-synced-when-idle.js with "300,westend-at-rococo" within 600 seconds - -# wait until other network test has completed OR exit with an error too -asset-hub-rococo-collator1: run ../scripts/sync-exit.sh within 600 seconds - -# wait until other network test has completed OR exit with an error too -asset-hub-rococo-collator1: run ../scripts/sync-exit.sh within 600 seconds diff --git a/cumulus/client/cli/Cargo.toml b/cumulus/client/cli/Cargo.toml index 0495eab9bd5bc2711e256a7cbb0c06ae13b1f2bc..0b2edb593c405bef266fa7e389a996fe3a2fcec1 100644 --- a/cumulus/client/cli/Cargo.toml +++ b/cumulus/client/cli/Cargo.toml @@ -10,7 +10,7 @@ license = "GPL-3.0-or-later WITH Classpath-exception-2.0" workspace = true [dependencies] -clap = { version = "4.4.18", features = ["derive"] } +clap = { version = "4.5.3", features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.0.0" } url = "2.4.0" diff --git a/cumulus/client/cli/src/lib.rs b/cumulus/client/cli/src/lib.rs index 1807b8a1718e8b5c800b3bf27b58e0f39cd2948a..a7b2eb19de88a5c585ec3f6dfe5ad46ef0399b88 100644 --- a/cumulus/client/cli/src/lib.rs +++ b/cumulus/client/cli/src/lib.rs @@ -30,7 +30,7 @@ use codec::Encode; use sc_chain_spec::ChainSpec; use sc_client_api::HeaderBackend; use sc_service::{ - config::{PrometheusConfig, TelemetryEndpoints}, + config::{PrometheusConfig, RpcBatchRequestConfig, TelemetryEndpoints}, BasePath, TransactionPoolOptions, }; use sp_core::hexdisplay::HexDisplay; @@ -443,6 +443,14 @@ impl sc_cli::CliConfiguration for NormalizedRunCmd { Ok(self.base.rpc_max_subscriptions_per_connection) } + fn rpc_buffer_capacity_per_connection(&self) -> sc_cli::Result { + Ok(self.base.rpc_message_buffer_capacity_per_connection) + } + + fn rpc_batch_config(&self) -> sc_cli::Result { + self.base.rpc_batch_config() + } + fn transaction_pool(&self, is_dev: bool) -> sc_cli::Result { self.base.transaction_pool(is_dev) } diff --git a/cumulus/client/collator/Cargo.toml b/cumulus/client/collator/Cargo.toml index 0e911b9f3abfec1a894b50d63620f914268b78a9..42f7342d1a5381a6174c15909b815485eb7c8a7e 100644 --- a/cumulus/client/collator/Cargo.toml +++ b/cumulus/client/collator/Cargo.toml @@ -12,7 +12,7 @@ workspace = true [dependencies] parking_lot = "0.12.1" codec = { package = "parity-scale-codec", version = "3.0.0", features = ["derive"] } -futures = "0.3.21" +futures = "0.3.30" tracing = "0.1.25" # Substrate @@ -34,7 +34,7 @@ cumulus-client-network = { path = "../network" } cumulus-primitives-core = { path = "../../primitives/core" } [dev-dependencies] -async-trait = "0.1.74" +async-trait = "0.1.79" # Substrate sp-maybe-compressed-blob = { path = "../../../substrate/primitives/maybe-compressed-blob" } diff --git a/cumulus/client/collator/src/lib.rs b/cumulus/client/collator/src/lib.rs index 83249186f626ff8fffbee108cd953c3cc041e467..47da0f6d96f2f41e527515aef021c53e54dea5d9 100644 --- a/cumulus/client/collator/src/lib.rs +++ b/cumulus/client/collator/src/lib.rs @@ -381,13 +381,11 @@ mod tests { sproof.included_para_head = Some(HeadData(parent.encode())); sproof.para_id = cumulus_test_runtime::PARACHAIN_ID.into(); - let builder = self.client.init_block_builder_at( - parent.hash(), - Some(validation_data.clone()), - sproof, - ); + let cumulus_test_client::BlockBuilderAndSupportData { block_builder, .. } = self + .client + .init_block_builder_at(parent.hash(), Some(validation_data.clone()), sproof); - let (block, _, proof) = builder.build().expect("Creates block").into_inner(); + let (block, _, proof) = block_builder.build().expect("Creates block").into_inner(); self.client .import(BlockOrigin::Own, block.clone()) diff --git a/cumulus/client/consensus/aura/Cargo.toml b/cumulus/client/consensus/aura/Cargo.toml index e815e89d8ce3bebcdcf52b363917ba17c0382708..70dd67cb9a00b2e7b0baf04dbfdaaff0386104e5 100644 --- a/cumulus/client/consensus/aura/Cargo.toml +++ b/cumulus/client/consensus/aura/Cargo.toml @@ -10,7 +10,7 @@ license = "GPL-3.0-or-later WITH Classpath-exception-2.0" workspace = true [dependencies] -async-trait = "0.1.74" +async-trait = "0.1.79" codec = { package = "parity-scale-codec", version = "3.0.0", features = ["derive"] } futures = "0.3.28" tracing = "0.1.37" @@ -41,7 +41,7 @@ substrate-prometheus-endpoint = { path = "../../../../substrate/utils/prometheus cumulus-client-consensus-common = { path = "../common" } cumulus-relay-chain-interface = { path = "../../relay-chain-interface" } cumulus-client-consensus-proposer = { path = "../proposer" } -cumulus-client-parachain-inherent = { path = "../../../client/parachain-inherent" } +cumulus-client-parachain-inherent = { path = "../../parachain-inherent" } cumulus-primitives-aura = { path = "../../../primitives/aura" } cumulus-primitives-core = { path = "../../../primitives/core" } cumulus-client-collator = { path = "../../collator" } diff --git a/cumulus/client/consensus/aura/src/collator.rs b/cumulus/client/consensus/aura/src/collator.rs index db0799235bca27aaa4456da6c8649b0b76fef030..5b7669c88f473b8765b6b343d1797aa707ed5916 100644 --- a/cumulus/client/consensus/aura/src/collator.rs +++ b/cumulus/client/consensus/aura/src/collator.rs @@ -258,6 +258,7 @@ where pub struct SlotClaim { author_pub: Pub, pre_digest: DigestItem, + slot: Slot, timestamp: Timestamp, } @@ -272,7 +273,7 @@ impl SlotClaim { P::Public: Codec, P::Signature: Codec, { - SlotClaim { author_pub, timestamp, pre_digest: aura_internal::pre_digest::

(slot) } + SlotClaim { author_pub, timestamp, pre_digest: aura_internal::pre_digest::

(slot), slot } } /// Get the author's public key. @@ -285,6 +286,11 @@ impl SlotClaim { &self.pre_digest } + /// Get the slot assigned to this claim. + pub fn slot(&self) -> Slot { + self.slot + } + /// Get the timestamp corresponding to the relay-chain slot this claim was /// generated against. pub fn timestamp(&self) -> Timestamp { diff --git a/cumulus/client/consensus/aura/src/collators/basic.rs b/cumulus/client/consensus/aura/src/collators/basic.rs index 78f6b726aff0cb63cd08259c327bfbda71c05b8b..a4c22a45266cf53d2015b840a54a159492e87ba4 100644 --- a/cumulus/client/consensus/aura/src/collators/basic.rs +++ b/cumulus/client/consensus/aura/src/collators/basic.rs @@ -33,20 +33,21 @@ use cumulus_relay_chain_interface::RelayChainInterface; use polkadot_node_primitives::CollationResult; use polkadot_overseer::Handle as OverseerHandle; -use polkadot_primitives::{CollatorPair, Id as ParaId}; +use polkadot_primitives::{CollatorPair, Id as ParaId, ValidationCode}; use futures::{channel::mpsc::Receiver, prelude::*}; use sc_client_api::{backend::AuxStore, BlockBackend, BlockOf}; use sc_consensus::BlockImport; -use sp_api::ProvideRuntimeApi; +use sp_api::{CallApiAt, ProvideRuntimeApi}; use sp_application_crypto::AppPublic; use sp_blockchain::HeaderBackend; use sp_consensus::SyncOracle; -use sp_consensus_aura::{AuraApi, SlotDuration}; +use sp_consensus_aura::AuraApi; use sp_core::crypto::Pair; use sp_inherents::CreateInherentDataProviders; use sp_keystore::KeystorePtr; use sp_runtime::traits::{Block as BlockT, Header as HeaderT, Member}; +use sp_state_machine::Backend as _; use std::{convert::TryFrom, sync::Arc, time::Duration}; use crate::collator as collator_util; @@ -73,8 +74,6 @@ pub struct Params { pub para_id: ParaId, /// A handle to the relay-chain client's "Overseer" or task orchestrator. pub overseer_handle: OverseerHandle, - /// The length of slots in this chain. - pub slot_duration: SlotDuration, /// The length of slots in the relay chain. pub relay_chain_slot_duration: Duration, /// The underlying block proposer this should call into. @@ -100,6 +99,7 @@ where + AuxStore + HeaderBackend + BlockBackend + + CallApiAt + Send + Sync + 'static, @@ -141,6 +141,8 @@ where collator_util::Collator::::new(params) }; + let mut last_processed_slot = 0; + while let Some(request) = collation_requests.next().await { macro_rules! reject_with_error { ($err:expr) => {{ @@ -170,6 +172,22 @@ where continue } + let Ok(Some(code)) = + params.para_client.state_at(parent_hash).map_err(drop).and_then(|s| { + s.storage(&sp_core::storage::well_known_keys::CODE).map_err(drop) + }) + else { + continue; + }; + + super::check_validation_code_or_log( + &ValidationCode::from(code).hash(), + params.para_id, + ¶ms.relay_client, + *request.relay_parent(), + ) + .await; + let relay_parent_header = match params.relay_client.header(RBlockId::hash(*request.relay_parent())).await { Err(e) => reject_with_error!(e), @@ -177,11 +195,16 @@ where Ok(Some(h)) => h, }; + let slot_duration = match params.para_client.runtime_api().slot_duration(parent_hash) { + Ok(d) => d, + Err(e) => reject_with_error!(e), + }; + let claim = match collator_util::claim_slot::<_, _, P>( &*params.para_client, parent_hash, &relay_parent_header, - params.slot_duration, + slot_duration, params.relay_chain_slot_duration, ¶ms.keystore, ) @@ -192,6 +215,18 @@ where Err(e) => reject_with_error!(e), }; + // With async backing this function will be called every relay chain block. + // + // Most parachains currently run with 12 seconds slots and thus, they would try to + // produce multiple blocks per slot which very likely would fail on chain. Thus, we have + // this "hack" to only produce on block per slot. + // + // With https://github.com/paritytech/polkadot-sdk/issues/3168 this implementation will be + // obsolete and also the underlying issue will be fixed. + if last_processed_slot >= *claim.slot() { + continue + } + let (parachain_inherent_data, other_inherent_data) = try_request!( collator .create_inherent_data( @@ -228,6 +263,8 @@ where request.complete(None); tracing::debug!(target: crate::LOG_TARGET, "No block proposal"); } + + last_processed_slot = *claim.slot(); } } } diff --git a/cumulus/client/consensus/aura/src/collators/lookahead.rs b/cumulus/client/consensus/aura/src/collators/lookahead.rs index e24b7f6f1c93b9bbe92cdf9ce5958194065862ae..3fe87e94b7b97b6d839f3f723ebe22fb26e8760d 100644 --- a/cumulus/client/consensus/aura/src/collators/lookahead.rs +++ b/cumulus/client/consensus/aura/src/collators/lookahead.rs @@ -49,7 +49,9 @@ use polkadot_node_subsystem::messages::{ CollationGenerationMessage, RuntimeApiMessage, RuntimeApiRequest, }; use polkadot_overseer::Handle as OverseerHandle; -use polkadot_primitives::{CollatorPair, Id as ParaId, OccupiedCoreAssumption}; +use polkadot_primitives::{ + AsyncBackingParams, CollatorPair, CoreIndex, CoreState, Id as ParaId, OccupiedCoreAssumption, +}; use futures::{channel::oneshot, prelude::*}; use sc_client_api::{backend::AuxStore, BlockBackend, BlockOf}; @@ -59,7 +61,7 @@ use sp_api::ProvideRuntimeApi; use sp_application_crypto::AppPublic; use sp_blockchain::HeaderBackend; use sp_consensus::SyncOracle; -use sp_consensus_aura::{AuraApi, Slot, SlotDuration}; +use sp_consensus_aura::{AuraApi, Slot}; use sp_core::crypto::Pair; use sp_inherents::CreateInherentDataProviders; use sp_keystore::KeystorePtr; @@ -95,8 +97,6 @@ pub struct Params { pub para_id: ParaId, /// A handle to the relay-chain client's "Overseer" or task orchestrator. pub overseer_handle: OverseerHandle, - /// The length of slots in this chain. - pub slot_duration: SlotDuration, /// The length of slots in the relay chain. pub relay_chain_slot_duration: Duration, /// The underlying block proposer this should call into. @@ -186,7 +186,19 @@ where while let Some(relay_parent_header) = import_notifications.next().await { let relay_parent = relay_parent_header.hash(); - if !is_para_scheduled(relay_parent, params.para_id, &mut params.overseer_handle).await { + // TODO: Currently we use just the first core here, but for elastic scaling + // we iterate and build on all of the cores returned. + let core_index = if let Some(core_index) = cores_scheduled_for_para( + relay_parent, + params.para_id, + &mut params.overseer_handle, + &mut params.relay_client, + ) + .await + .get(0) + { + *core_index + } else { tracing::trace!( target: crate::LOG_TARGET, ?relay_parent, @@ -195,7 +207,7 @@ where ); continue - } + }; let max_pov_size = match params .relay_client @@ -214,30 +226,13 @@ where }, }; - let (slot_now, timestamp) = match consensus_common::relay_slot_and_timestamp( - &relay_parent_header, - params.relay_chain_slot_duration, - ) { - None => continue, - Some((r_s, t)) => { - let our_slot = Slot::from_timestamp(t, params.slot_duration); - tracing::debug!( - target: crate::LOG_TARGET, - relay_slot = ?r_s, - para_slot = ?our_slot, - timestamp = ?t, - slot_duration = ?params.slot_duration, - relay_chain_slot_duration = ?params.relay_chain_slot_duration, - "Adjusted relay-chain slot to parachain slot" - ); - (our_slot, t) - }, - }; - let parent_search_params = ParentSearchParams { relay_parent, para_id: params.para_id, - ancestry_lookback: max_ancestry_lookback(relay_parent, ¶ms.relay_client).await, + ancestry_lookback: async_backing_params(relay_parent, ¶ms.relay_client) + .await + .map(|c| c.allowed_ancestry_len as usize) + .unwrap_or(0), max_depth: PARENT_SEARCH_DEPTH, ignore_alternative_branches: true, }; @@ -272,14 +267,39 @@ where let para_client = &*params.para_client; let keystore = ¶ms.keystore; let can_build_upon = |block_hash| { - can_build_upon::<_, _, P>( + let slot_duration = match sc_consensus_aura::standalone::slot_duration_at( + &*params.para_client, + block_hash, + ) { + Ok(sd) => sd, + Err(err) => { + tracing::error!(target: crate::LOG_TARGET, ?err, "Failed to acquire parachain slot duration"); + return None + }, + }; + tracing::debug!(target: crate::LOG_TARGET, ?slot_duration, ?block_hash, "Parachain slot duration acquired"); + let (relay_slot, timestamp) = consensus_common::relay_slot_and_timestamp( + &relay_parent_header, + params.relay_chain_slot_duration, + )?; + let slot_now = Slot::from_timestamp(timestamp, slot_duration); + tracing::debug!( + target: crate::LOG_TARGET, + ?relay_slot, + para_slot = ?slot_now, + ?timestamp, + ?slot_duration, + relay_chain_slot_duration = ?params.relay_chain_slot_duration, + "Adjusted relay-chain slot to parachain slot" + ); + Some(can_build_upon::<_, _, P>( slot_now, timestamp, block_hash, included_block, para_client, &keystore, - ) + )) }; // Sort by depth, ascending, to choose the longest chain. @@ -287,10 +307,7 @@ where // If the longest chain has space, build upon that. Otherwise, don't // build at all. potential_parents.sort_by_key(|a| a.depth); - let initial_parent = match potential_parents.pop() { - None => continue, - Some(p) => p, - }; + let Some(initial_parent) = potential_parents.pop() else { continue }; // Build in a loop until not allowed. Note that the authorities can change // at any block, so we need to re-claim our slot every time. @@ -298,12 +315,20 @@ where let mut parent_header = initial_parent.header; let overseer_handle = &mut params.overseer_handle; + // Do not try to build upon an unknown, pruned or bad block + if !collator.collator_service().check_block_status(parent_hash, &parent_header) { + continue + } + // This needs to change to support elastic scaling, but for continuously // scheduled chains this ensures that the backlog will grow steadily. for n_built in 0..2 { - let slot_claim = match can_build_upon(parent_hash).await { + let slot_claim = match can_build_upon(parent_hash) { + Some(fut) => match fut.await { + None => break, + Some(c) => c, + }, None => break, - Some(c) => c, }; tracing::debug!( @@ -347,6 +372,14 @@ where Some(v) => v, }; + super::check_validation_code_or_log( + &validation_code_hash, + params.para_id, + ¶ms.relay_client, + relay_parent, + ) + .await; + match collator .collate( &parent_header, @@ -381,6 +414,7 @@ where parent_head: parent_header.encode().into(), validation_code_hash, result_sender: None, + core_index, }, ), "SubmitCollation", @@ -437,21 +471,19 @@ where Some(SlotClaim::unchecked::

(author_pub, slot, timestamp)) } -/// Reads allowed ancestry length parameter from the relay chain storage at the given relay parent. -/// -/// Falls back to 0 in case of an error. -async fn max_ancestry_lookback( +/// Reads async backing parameters from the relay chain storage at the given relay parent. +async fn async_backing_params( relay_parent: PHash, relay_client: &impl RelayChainInterface, -) -> usize { +) -> Option { match load_abridged_host_configuration(relay_parent, relay_client).await { - Ok(Some(config)) => config.async_backing_params.allowed_ancestry_len as usize, + Ok(Some(config)) => Some(config.async_backing_params), Ok(None) => { tracing::error!( target: crate::LOG_TARGET, "Active config is missing in relay chain storage", ); - 0 + None }, Err(err) => { tracing::error!( @@ -460,19 +492,19 @@ async fn max_ancestry_lookback( ?relay_parent, "Failed to read active config from relay chain client", ); - 0 + None }, } } -// Checks if there exists a scheduled core for the para at the provided relay parent. -// -// Falls back to `false` in case of an error. -async fn is_para_scheduled( +// Return all the cores assigned to the para at the provided relay parent. +async fn cores_scheduled_for_para( relay_parent: PHash, para_id: ParaId, overseer_handle: &mut OverseerHandle, -) -> bool { + relay_client: &impl RelayChainInterface, +) -> Vec { + // Get `AvailabilityCores` from runtime let (tx, rx) = oneshot::channel(); let request = RuntimeApiRequest::AvailabilityCores(tx); overseer_handle @@ -488,7 +520,7 @@ async fn is_para_scheduled( ?relay_parent, "Failed to query availability cores runtime API", ); - return false + return Vec::new() }, Err(oneshot::Canceled) => { tracing::error!( @@ -496,9 +528,33 @@ async fn is_para_scheduled( ?relay_parent, "Sender for availability cores runtime request dropped", ); - return false + return Vec::new() }, }; - cores.iter().any(|core| core.para_id() == Some(para_id)) + let max_candidate_depth = async_backing_params(relay_parent, relay_client) + .await + .map(|c| c.max_candidate_depth) + .unwrap_or(0); + + cores + .iter() + .enumerate() + .filter_map(|(index, core)| { + let core_para_id = match core { + CoreState::Scheduled(scheduled_core) => Some(scheduled_core.para_id), + CoreState::Occupied(occupied_core) if max_candidate_depth >= 1 => occupied_core + .next_up_on_available + .as_ref() + .map(|scheduled_core| scheduled_core.para_id), + CoreState::Free | CoreState::Occupied(_) => None, + }; + + if core_para_id == Some(para_id) { + Some(CoreIndex(index as u32)) + } else { + None + } + }) + .collect() } diff --git a/cumulus/client/consensus/aura/src/collators/mod.rs b/cumulus/client/consensus/aura/src/collators/mod.rs index 4c7b759daf736f69de48b586b082a7d01534d7e3..6e0067d0cedb602face8943737f99f3cb1a201a3 100644 --- a/cumulus/client/consensus/aura/src/collators/mod.rs +++ b/cumulus/client/consensus/aura/src/collators/mod.rs @@ -20,5 +20,60 @@ //! included parachain block, as well as the [`lookahead`] collator, which prospectively //! builds on parachain blocks which have not yet been included in the relay chain. +use cumulus_relay_chain_interface::RelayChainInterface; +use polkadot_primitives::{ + Hash as RHash, Id as ParaId, OccupiedCoreAssumption, ValidationCodeHash, +}; + pub mod basic; pub mod lookahead; + +/// Check the `local_validation_code_hash` against the validation code hash in the relay chain +/// state. +/// +/// If the code hashes do not match, it prints a warning. +async fn check_validation_code_or_log( + local_validation_code_hash: &ValidationCodeHash, + para_id: ParaId, + relay_client: &impl RelayChainInterface, + relay_parent: RHash, +) { + let state_validation_code_hash = match relay_client + .validation_code_hash(relay_parent, para_id, OccupiedCoreAssumption::Included) + .await + { + Ok(hash) => hash, + Err(error) => { + tracing::debug!( + target: super::LOG_TARGET, + %error, + ?relay_parent, + %para_id, + "Failed to fetch validation code hash", + ); + return + }, + }; + + match state_validation_code_hash { + Some(state) => + if state != *local_validation_code_hash { + tracing::warn!( + target: super::LOG_TARGET, + %para_id, + ?relay_parent, + ?local_validation_code_hash, + relay_validation_code_hash = ?state, + "Parachain code doesn't match validation code stored in the relay chain state", + ); + }, + None => { + tracing::warn!( + target: super::LOG_TARGET, + %para_id, + ?relay_parent, + "Could not find validation code for parachain in the relay chain state.", + ); + }, + } +} diff --git a/cumulus/client/consensus/aura/src/equivocation_import_queue.rs b/cumulus/client/consensus/aura/src/equivocation_import_queue.rs index 5cd65ed5546bae392df811e8043ac44214f6a7eb..c3b601123b56996c597104567f7f39d29d64bf9c 100644 --- a/cumulus/client/consensus/aura/src/equivocation_import_queue.rs +++ b/cumulus/client/consensus/aura/src/equivocation_import_queue.rs @@ -70,7 +70,6 @@ impl NaiveEquivocationDefender { struct Verifier { client: Arc, create_inherent_data_providers: CIDP, - slot_duration: SlotDuration, defender: NaiveEquivocationDefender, telemetry: Option, _phantom: std::marker::PhantomData (Block, P)>, @@ -110,7 +109,13 @@ where format!("Could not fetch authorities at {:?}: {}", parent_hash, e) })?; - let slot_now = slot_now(self.slot_duration); + let slot_duration = self + .client + .runtime_api() + .slot_duration(parent_hash) + .map_err(|e| e.to_string())?; + + let slot_now = slot_now(slot_duration); let res = aura_internal::check_header_slot_and_seal::( slot_now, block_params.header, @@ -218,7 +223,6 @@ pub fn fully_verifying_import_queue( client: Arc, block_import: I, create_inherent_data_providers: CIDP, - slot_duration: SlotDuration, spawner: &impl sp_core::traits::SpawnEssentialNamed, registry: Option<&substrate_prometheus_endpoint::Registry>, telemetry: Option, @@ -240,7 +244,6 @@ where client, create_inherent_data_providers, defender: NaiveEquivocationDefender::default(), - slot_duration, telemetry, _phantom: std::marker::PhantomData, }; diff --git a/cumulus/client/consensus/aura/src/lib.rs b/cumulus/client/consensus/aura/src/lib.rs index 6ededa7a92c11cb8c313f7da01017eeef256fb06..ed6f5bdd4d6984350c5f59a3753618c3a038f323 100644 --- a/cumulus/client/consensus/aura/src/lib.rs +++ b/cumulus/client/consensus/aura/src/lib.rs @@ -42,12 +42,22 @@ use sp_core::crypto::Pair; use sp_inherents::CreateInherentDataProviders; use sp_keystore::KeystorePtr; use sp_runtime::traits::{Block as BlockT, Header as HeaderT, Member, NumberFor}; -use std::{convert::TryFrom, marker::PhantomData, sync::Arc}; +use std::{ + convert::TryFrom, + marker::PhantomData, + sync::{ + atomic::{AtomicU64, Ordering}, + Arc, + }, +}; mod import_queue; pub use import_queue::{build_verifier, import_queue, BuildVerifierParams, ImportQueueParams}; -pub use sc_consensus_aura::{slot_duration, AuraVerifier, BuildAuraWorkerParams, SlotProportion}; +pub use sc_consensus_aura::{ + slot_duration, standalone::slot_duration_at, AuraVerifier, BuildAuraWorkerParams, + SlotProportion, +}; pub use sc_consensus_slots::InherentDataProviderExt; pub mod collator; @@ -61,6 +71,7 @@ pub struct AuraConsensus { create_inherent_data_providers: Arc, aura_worker: Arc>, slot_duration: SlotDuration, + last_slot_processed: Arc, _phantom: PhantomData, } @@ -70,6 +81,7 @@ impl Clone for AuraConsensus { create_inherent_data_providers: self.create_inherent_data_providers.clone(), aura_worker: self.aura_worker.clone(), slot_duration: self.slot_duration, + last_slot_processed: self.last_slot_processed.clone(), _phantom: PhantomData, } } @@ -156,6 +168,7 @@ where Box::new(AuraConsensus { create_inherent_data_providers: Arc::new(create_inherent_data_providers), aura_worker: Arc::new(Mutex::new(worker)), + last_slot_processed: Default::default(), slot_duration, _phantom: PhantomData, }) @@ -221,6 +234,18 @@ where Some((validation_data.max_pov_size / 2) as usize), ); + // With async backing this function will be called every relay chain block. + // + // Most parachains currently run with 12 seconds slots and thus, they would try to produce + // multiple blocks per slot which very likely would fail on chain. Thus, we have this "hack" + // to only produce on block per slot. + // + // With https://github.com/paritytech/polkadot-sdk/issues/3168 this implementation will be + // obsolete and also the underlying issue will be fixed. + if self.last_slot_processed.fetch_max(*info.slot, Ordering::Relaxed) >= *info.slot { + return None + } + let res = self.aura_worker.lock().await.on_slot(info).await?; Some(ParachainCandidate { block: res.block, proof: res.storage_proof }) diff --git a/cumulus/client/consensus/common/Cargo.toml b/cumulus/client/consensus/common/Cargo.toml index 7fee51310d01e2e6696c4cbb20ba10dade106dbc..fb4a85ad122637470a81371eb12352a14ac7c61e 100644 --- a/cumulus/client/consensus/common/Cargo.toml +++ b/cumulus/client/consensus/common/Cargo.toml @@ -10,11 +10,11 @@ license = "GPL-3.0-or-later WITH Classpath-exception-2.0" workspace = true [dependencies] -async-trait = "0.1.74" +async-trait = "0.1.79" codec = { package = "parity-scale-codec", version = "3.0.0", features = ["derive"] } dyn-clone = "1.0.16" futures = "0.3.28" -log = "0.4.20" +log = { workspace = true, default-features = true } tracing = "0.1.37" # Substrate diff --git a/cumulus/client/consensus/common/src/level_monitor.rs b/cumulus/client/consensus/common/src/level_monitor.rs index 270e3f57ae5a374aba2f22966c7376e0791020ca..fb4b0498f6887f8bea1d3e7ba4e7f4082e2f9747 100644 --- a/cumulus/client/consensus/common/src/level_monitor.rs +++ b/cumulus/client/consensus/common/src/level_monitor.rs @@ -158,7 +158,7 @@ where /// the limit passed to the constructor. /// /// If the given level is found to have a number of blocks greater than or equal the limit - /// then the limit is enforced by chosing one (or more) blocks to remove. + /// then the limit is enforced by choosing one (or more) blocks to remove. /// /// The removal strategy is driven by the block freshness. /// diff --git a/cumulus/client/consensus/common/src/tests.rs b/cumulus/client/consensus/common/src/tests.rs index 597d1ab2acc2cff42d3230898c1129a7ba63b6f3..aca9226570723c3285b2817e6bcdca22b141968b 100644 --- a/cumulus/client/consensus/common/src/tests.rs +++ b/cumulus/client/consensus/common/src/tests.rs @@ -136,6 +136,15 @@ impl RelayChainInterface for Relaychain { Ok(Some(PersistedValidationData { parent_head, ..Default::default() })) } + async fn validation_code_hash( + &self, + _: PHash, + _: ParaId, + _: OccupiedCoreAssumption, + ) -> RelayChainResult> { + unimplemented!("Not needed for test") + } + async fn candidate_pending_availability( &self, _: PHash, @@ -265,7 +274,7 @@ fn build_block( timestamp: Option, relay_parent: Option, ) -> Block { - let builder = match at { + let cumulus_test_client::BlockBuilderAndSupportData { block_builder, .. } = match at { Some(at) => match timestamp { Some(ts) => builder.init_block_builder_with_timestamp(at, None, sproof, ts), None => builder.init_block_builder_at(at, None, sproof), @@ -273,7 +282,7 @@ fn build_block( None => builder.init_block_builder(None, sproof), }; - let mut block = builder.build().unwrap().block; + let mut block = block_builder.build().unwrap().block; if let Some(relay_parent) = relay_parent { block @@ -494,7 +503,7 @@ fn follow_finalized_does_not_stop_on_unknown_block() { let unknown_block = { let sproof = sproof_with_parent_by_hash(&client, block.hash()); - let block_builder = client.init_block_builder_at(block.hash(), None, sproof); + let block_builder = client.init_block_builder_at(block.hash(), None, sproof).block_builder; block_builder.build().unwrap().block }; @@ -544,7 +553,7 @@ fn follow_new_best_sets_best_after_it_is_imported() { let unknown_block = { let sproof = sproof_with_parent_by_hash(&client, block.hash()); - let block_builder = client.init_block_builder_at(block.hash(), None, sproof); + let block_builder = client.init_block_builder_at(block.hash(), None, sproof).block_builder; block_builder.build().unwrap().block }; @@ -656,8 +665,8 @@ fn do_not_set_best_block_to_older_block() { fn prune_blocks_on_level_overflow() { // Here we are using the timestamp value to generate blocks with different hashes. const LEVEL_LIMIT: usize = 3; - const TIMESTAMP_MULTIPLIER: u64 = 60000; + let mut ts_producer = std::iter::successors(Some(0), |&x| Some(x + 6000)); let backend = Arc::new(Backend::new_test(1000, 3)); let client = Arc::new(TestClientBuilder::with_backend(backend.clone()).build()); let mut para_import = ParachainBlockImport::new_with_limit( @@ -666,13 +675,14 @@ fn prune_blocks_on_level_overflow() { LevelLimit::Some(LEVEL_LIMIT), ); + let best_hash = client.chain_info().best_hash; let block0 = build_and_import_block_ext( &client, BlockOrigin::NetworkInitialSync, true, &mut para_import, - None, - None, + Some(best_hash), + ts_producer.next(), None, ); let id0 = block0.header.hash(); @@ -685,7 +695,7 @@ fn prune_blocks_on_level_overflow() { i == 1, &mut para_import, Some(id0), - Some(i as u64 * TIMESTAMP_MULTIPLIER), + ts_producer.next(), None, ) }) @@ -693,14 +703,14 @@ fn prune_blocks_on_level_overflow() { let id10 = blocks1[0].header.hash(); let blocks2 = (0..2) - .map(|i| { + .map(|_| { build_and_import_block_ext( &client, BlockOrigin::Own, false, &mut para_import, Some(id10), - Some(i as u64 * TIMESTAMP_MULTIPLIER), + ts_producer.next(), None, ) }) @@ -729,7 +739,7 @@ fn prune_blocks_on_level_overflow() { false, &mut para_import, Some(id0), - Some(LEVEL_LIMIT as u64 * TIMESTAMP_MULTIPLIER), + ts_producer.next(), None, ); @@ -749,7 +759,7 @@ fn prune_blocks_on_level_overflow() { false, &mut para_import, Some(id0), - Some(2 * LEVEL_LIMIT as u64 * TIMESTAMP_MULTIPLIER), + ts_producer.next(), None, ); @@ -770,8 +780,8 @@ fn prune_blocks_on_level_overflow() { fn restore_limit_monitor() { // Here we are using the timestamp value to generate blocks with different hashes. const LEVEL_LIMIT: usize = 2; - const TIMESTAMP_MULTIPLIER: u64 = 60000; - + // Iterator that produces a new timestamp in the next slot + let mut ts_producer = std::iter::successors(Some(0), |&x| Some(x + 6000)); let backend = Arc::new(Backend::new_test(1000, 3)); let client = Arc::new(TestClientBuilder::with_backend(backend.clone()).build()); @@ -782,13 +792,14 @@ fn restore_limit_monitor() { LevelLimit::Some(usize::MAX), ); + let best_hash = client.chain_info().best_hash; let block00 = build_and_import_block_ext( &client, BlockOrigin::NetworkInitialSync, true, &mut para_import, - None, - None, + Some(best_hash), + ts_producer.next(), None, ); let id00 = block00.header.hash(); @@ -801,29 +812,27 @@ fn restore_limit_monitor() { i == 1, &mut para_import, Some(id00), - Some(i as u64 * TIMESTAMP_MULTIPLIER), + ts_producer.next(), None, ) }) .collect::>(); let id10 = blocks1[0].header.hash(); - let _ = (0..LEVEL_LIMIT) - .map(|i| { - build_and_import_block_ext( - &client, - BlockOrigin::Own, - false, - &mut para_import, - Some(id10), - Some(i as u64 * TIMESTAMP_MULTIPLIER), - None, - ) - }) - .collect::>(); + for _ in 0..LEVEL_LIMIT { + build_and_import_block_ext( + &client, + BlockOrigin::Own, + false, + &mut para_import, + Some(id10), + ts_producer.next(), + None, + ); + } // Scenario before limit application (with B11 imported as best) - // Import order (freshess): B00, B10, B11, B12, B20, B21 + // Import order (freshness): B00, B10, B11, B12, B20, B21 // // B00 --+-- B10 --+-- B20 // | +-- B21 @@ -851,7 +860,7 @@ fn restore_limit_monitor() { false, &mut para_import, Some(id00), - Some(LEVEL_LIMIT as u64 * TIMESTAMP_MULTIPLIER), + ts_producer.next(), None, ); diff --git a/cumulus/client/consensus/proposer/Cargo.toml b/cumulus/client/consensus/proposer/Cargo.toml index 8a559c603f33c138912cfc096e2d90cc879b597e..42ca4e06f8f45e410006304cf1290e811e153b4c 100644 --- a/cumulus/client/consensus/proposer/Cargo.toml +++ b/cumulus/client/consensus/proposer/Cargo.toml @@ -11,8 +11,8 @@ workspace = true [dependencies] anyhow = "1.0" -async-trait = "0.1.74" -thiserror = "1.0.48" +async-trait = "0.1.79" +thiserror = { workspace = true } # Substrate sp-consensus = { path = "../../../../substrate/primitives/consensus/common" } diff --git a/cumulus/client/consensus/relay-chain/Cargo.toml b/cumulus/client/consensus/relay-chain/Cargo.toml index 3d06d6b89ef7447b6196b1fc395ed7be54e3ba62..cb32b98045760de5621792c6ef45f76faf2e7e08 100644 --- a/cumulus/client/consensus/relay-chain/Cargo.toml +++ b/cumulus/client/consensus/relay-chain/Cargo.toml @@ -10,7 +10,7 @@ license = "GPL-3.0-or-later WITH Classpath-exception-2.0" workspace = true [dependencies] -async-trait = "0.1.74" +async-trait = "0.1.79" futures = "0.3.28" parking_lot = "0.12.1" tracing = "0.1.37" diff --git a/cumulus/client/network/Cargo.toml b/cumulus/client/network/Cargo.toml index 995ef606d270ed688af3751016be9c8c37f80305..1210975ef690c4d110a7f96b2e88e4d151edfa87 100644 --- a/cumulus/client/network/Cargo.toml +++ b/cumulus/client/network/Cargo.toml @@ -10,7 +10,7 @@ license = "GPL-3.0-or-later WITH Classpath-exception-2.0" workspace = true [dependencies] -async-trait = "0.1.74" +async-trait = "0.1.79" codec = { package = "parity-scale-codec", version = "3.0.0", features = ["derive"] } futures = "0.3.28" futures-timer = "3.0.2" diff --git a/cumulus/client/network/src/tests.rs b/cumulus/client/network/src/tests.rs index e03f470753bb6c32c4410a7c694dea8312c74c31..3f5757d5eac13cd751a89e77545a937b3223c9a0 100644 --- a/cumulus/client/network/src/tests.rs +++ b/cumulus/client/network/src/tests.rs @@ -117,6 +117,15 @@ impl RelayChainInterface for DummyRelayChainInterface { })) } + async fn validation_code_hash( + &self, + _: PHash, + _: ParaId, + _: OccupiedCoreAssumption, + ) -> RelayChainResult> { + unimplemented!("Not needed for test") + } + async fn candidate_pending_availability( &self, _: PHash, @@ -135,7 +144,7 @@ impl RelayChainInterface for DummyRelayChainInterface { persisted_validation_data_hash: PHash::random(), pov_hash: PHash::random(), erasure_root: PHash::random(), - signature: sp_core::sr25519::Signature([0u8; 64]).into(), + signature: sp_core::sr25519::Signature::default().into(), validation_code_hash: ValidationCodeHash::from(PHash::random()), }, commitments: CandidateCommitments { @@ -316,7 +325,7 @@ async fn make_gossip_message_and_header( persisted_validation_data_hash: PHash::random(), pov_hash: PHash::random(), erasure_root: PHash::random(), - signature: sp_core::sr25519::Signature([0u8; 64]).into(), + signature: sp_core::sr25519::Signature::default().into(), para_head: polkadot_parachain_primitives::primitives::HeadData(header.encode()).hash(), validation_code_hash: ValidationCodeHash::from(PHash::random()), }, @@ -507,7 +516,7 @@ async fn check_statement_seconded() { persisted_validation_data_hash: PHash::random(), pov_hash: PHash::random(), erasure_root: PHash::random(), - signature: sp_core::sr25519::Signature([0u8; 64]).into(), + signature: sp_core::sr25519::Signature::default().into(), validation_code_hash: ValidationCodeHash::from(PHash::random()), }, }, diff --git a/cumulus/client/parachain-inherent/Cargo.toml b/cumulus/client/parachain-inherent/Cargo.toml index e00f3ba26066c037aca5e11fcb539ae6d95a4c85..6e9adab1ffc9e2bf9de9d8101eb38e4da8212b27 100644 --- a/cumulus/client/parachain-inherent/Cargo.toml +++ b/cumulus/client/parachain-inherent/Cargo.toml @@ -7,9 +7,9 @@ description = "Inherent that needs to be present in every parachain block. Conta license = "Apache-2.0" [dependencies] -async-trait = "0.1.73" +async-trait = "0.1.79" codec = { package = "parity-scale-codec", version = "3.0.0", features = ["derive"] } -scale-info = { version = "2.10.0", features = ["derive"] } +scale-info = { version = "2.11.1", features = ["derive"] } tracing = { version = "0.1.37" } # Substrate diff --git a/cumulus/client/parachain-inherent/src/lib.rs b/cumulus/client/parachain-inherent/src/lib.rs index 57353638e197acf255b73080c6802e94647c2090..051eb6764c8ce97a8305a07bdddb8f06f61fe4bc 100644 --- a/cumulus/client/parachain-inherent/src/lib.rs +++ b/cumulus/client/parachain-inherent/src/lib.rs @@ -159,7 +159,7 @@ impl ParachainInherentDataProvider { target: LOG_TARGET, relay_parent = ?relay_parent, error = ?e, - "An error occured during requesting the downward messages.", + "An error occurred during requesting the downward messages.", ); }) .ok()?; @@ -171,7 +171,7 @@ impl ParachainInherentDataProvider { target: LOG_TARGET, relay_parent = ?relay_parent, error = ?e, - "An error occured during requesting the inbound HRMP messages.", + "An error occurred during requesting the inbound HRMP messages.", ); }) .ok()?; diff --git a/cumulus/client/pov-recovery/Cargo.toml b/cumulus/client/pov-recovery/Cargo.toml index 375a57a87c2aa3fb92a6317c756b18c8117736f8..571935620d6d90b3aa1157124a2bae6fd73a19c2 100644 --- a/cumulus/client/pov-recovery/Cargo.toml +++ b/cumulus/client/pov-recovery/Cargo.toml @@ -32,7 +32,7 @@ polkadot-primitives = { path = "../../../polkadot/primitives" } # Cumulus cumulus-primitives-core = { path = "../../primitives/core" } cumulus-relay-chain-interface = { path = "../relay-chain-interface" } -async-trait = "0.1.74" +async-trait = "0.1.79" [dev-dependencies] tokio = { version = "1.32.0", features = ["macros"] } diff --git a/cumulus/client/pov-recovery/src/lib.rs b/cumulus/client/pov-recovery/src/lib.rs index 32aba6c8993a6da67cd3adeb394e87e6c067b46c..0ca21749c3eb557a78f0996c703e86b35cab6f17 100644 --- a/cumulus/client/pov-recovery/src/lib.rs +++ b/cumulus/client/pov-recovery/src/lib.rs @@ -18,7 +18,7 @@ //! //! A parachain needs to build PoVs that are send to the relay chain to progress. These PoVs are //! erasure encoded and one piece of it is stored by each relay chain validator. As the relay chain -//! decides on which PoV per parachain to include and thus, to progess the parachain it can happen +//! decides on which PoV per parachain to include and thus, to progress the parachain it can happen //! that the block corresponding to this PoV isn't propagated in the parachain network. This can //! have several reasons, either a malicious collator that managed to include its own PoV and //! doesn't want to share it with the rest of the network or maybe a collator went down before it @@ -338,8 +338,8 @@ where let mut blocks_to_delete = vec![hash]; while let Some(delete) = blocks_to_delete.pop() { - if let Some(childs) = self.waiting_for_parent.remove(&delete) { - blocks_to_delete.extend(childs.iter().map(BlockT::hash)); + if let Some(children) = self.waiting_for_parent.remove(&delete) { + blocks_to_delete.extend(children.iter().map(BlockT::hash)); } } self.clear_waiting_recovery(&hash); @@ -448,7 +448,7 @@ where /// Import the given `block`. /// - /// This will also recursivley drain `waiting_for_parent` and import them as well. + /// This will also recursively drain `waiting_for_parent` and import them as well. fn import_block(&mut self, block: Block) { let mut blocks = VecDeque::new(); @@ -495,7 +495,7 @@ where tracing::debug!( target: LOG_TARGET, block_hash = ?hash, - "Cound not recover. Block was never announced as candidate" + "Could not recover. Block was never announced as candidate" ); return }, diff --git a/cumulus/client/relay-chain-inprocess-interface/Cargo.toml b/cumulus/client/relay-chain-inprocess-interface/Cargo.toml index aa16230cd8aff0f313311c15269508156e57b544..7629b6c631a3a0195760eee7fd39e754c289dd3e 100644 --- a/cumulus/client/relay-chain-inprocess-interface/Cargo.toml +++ b/cumulus/client/relay-chain-inprocess-interface/Cargo.toml @@ -10,7 +10,7 @@ license = "GPL-3.0-or-later WITH Classpath-exception-2.0" workspace = true [dependencies] -async-trait = "0.1.74" +async-trait = "0.1.79" futures = "0.3.28" futures-timer = "3.0.2" diff --git a/cumulus/client/relay-chain-inprocess-interface/src/lib.rs b/cumulus/client/relay-chain-inprocess-interface/src/lib.rs index 866214fe2c526d77153afbea74b130aa1fda8636..6ea02b2e7c1f6d9b5313459890dd2147015359e5 100644 --- a/cumulus/client/relay-chain-inprocess-interface/src/lib.rs +++ b/cumulus/client/relay-chain-inprocess-interface/src/lib.rs @@ -21,7 +21,7 @@ use cumulus_primitives_core::{ relay_chain::{ runtime_api::ParachainHost, Block as PBlock, BlockId, CommittedCandidateReceipt, Hash as PHash, Header as PHeader, InboundHrmpMessage, OccupiedCoreAssumption, SessionIndex, - ValidatorId, + ValidationCodeHash, ValidatorId, }, InboundDownwardMessage, ParaId, PersistedValidationData, }; @@ -115,6 +115,19 @@ impl RelayChainInterface for RelayChainInProcessInterface { )?) } + async fn validation_code_hash( + &self, + hash: PHash, + para_id: ParaId, + occupied_core_assumption: OccupiedCoreAssumption, + ) -> RelayChainResult> { + Ok(self.full_client.runtime_api().validation_code_hash( + hash, + para_id, + occupied_core_assumption, + )?) + } + async fn candidate_pending_availability( &self, hash: PHash, diff --git a/cumulus/client/relay-chain-interface/Cargo.toml b/cumulus/client/relay-chain-interface/Cargo.toml index 004d30f7f94f70b7ed2e25fb9e1eebd9acc7c586..6df9847252fecf8e4bdcdec0ff9f830d6530668b 100644 --- a/cumulus/client/relay-chain-interface/Cargo.toml +++ b/cumulus/client/relay-chain-interface/Cargo.toml @@ -20,7 +20,7 @@ sp-state-machine = { path = "../../../substrate/primitives/state-machine" } sc-client-api = { path = "../../../substrate/client/api" } futures = "0.3.28" -async-trait = "0.1.74" -thiserror = "1.0.48" -jsonrpsee-core = "0.20.3" +async-trait = "0.1.79" +thiserror = { workspace = true } +jsonrpsee-core = "0.22" parity-scale-codec = "3.6.4" diff --git a/cumulus/client/relay-chain-interface/src/lib.rs b/cumulus/client/relay-chain-interface/src/lib.rs index 3dda61635804d47440689872271751e0bba27d87..bb93e6a168c849fa9d41586ad8b9ec0013e6c01f 100644 --- a/cumulus/client/relay-chain-interface/src/lib.rs +++ b/cumulus/client/relay-chain-interface/src/lib.rs @@ -22,7 +22,7 @@ use sc_client_api::StorageProof; use futures::Stream; use async_trait::async_trait; -use jsonrpsee_core::Error as JsonRpcError; +use jsonrpsee_core::ClientError as JsonRpcError; use parity_scale_codec::Error as CodecError; use sp_api::ApiError; @@ -30,7 +30,7 @@ use cumulus_primitives_core::relay_chain::BlockId; pub use cumulus_primitives_core::{ relay_chain::{ CommittedCandidateReceipt, Hash as PHash, Header as PHeader, InboundHrmpMessage, - OccupiedCoreAssumption, SessionIndex, ValidatorId, + OccupiedCoreAssumption, SessionIndex, ValidationCodeHash, ValidatorId, }, InboundDownwardMessage, ParaId, PersistedValidationData, }; @@ -194,6 +194,15 @@ pub trait RelayChainInterface: Send + Sync { relay_parent: PHash, relevant_keys: &Vec>, ) -> RelayChainResult; + + /// Returns the validation code hash for the given `para_id` using the given + /// `occupied_core_assumption`. + async fn validation_code_hash( + &self, + relay_parent: PHash, + para_id: ParaId, + occupied_core_assumption: OccupiedCoreAssumption, + ) -> RelayChainResult>; } #[async_trait] @@ -301,4 +310,15 @@ where async fn header(&self, block_id: BlockId) -> RelayChainResult> { (**self).header(block_id).await } + + async fn validation_code_hash( + &self, + relay_parent: PHash, + para_id: ParaId, + occupied_core_assumption: OccupiedCoreAssumption, + ) -> RelayChainResult> { + (**self) + .validation_code_hash(relay_parent, para_id, occupied_core_assumption) + .await + } } diff --git a/cumulus/client/relay-chain-minimal-node/Cargo.toml b/cumulus/client/relay-chain-minimal-node/Cargo.toml index 0b1e001e007a493f521f10c2659653699da04d0c..6860b42a5078d48e74bbbd7ee64fbab43e5d5e13 100644 --- a/cumulus/client/relay-chain-minimal-node/Cargo.toml +++ b/cumulus/client/relay-chain-minimal-node/Cargo.toml @@ -24,6 +24,7 @@ polkadot-node-collation-generation = { path = "../../../polkadot/node/collation- polkadot-node-core-runtime-api = { path = "../../../polkadot/node/core/runtime-api" } polkadot-node-core-chain-api = { path = "../../../polkadot/node/core/chain-api" } polkadot-node-core-prospective-parachains = { path = "../../../polkadot/node/core/prospective-parachains" } +polkadot-service = { path = "../../../polkadot/node/service" } # substrate deps sc-authority-discovery = { path = "../../../substrate/client/authority-discovery" } @@ -48,6 +49,6 @@ cumulus-primitives-core = { path = "../../primitives/core" } array-bytes = "6.1" tracing = "0.1.37" -async-trait = "0.1.74" +async-trait = "0.1.79" futures = "0.3.28" parking_lot = "0.12.1" diff --git a/cumulus/client/relay-chain-minimal-node/src/blockchain_rpc_client.rs b/cumulus/client/relay-chain-minimal-node/src/blockchain_rpc_client.rs index ab56b62c4ca59b3058e9724032e2e09264a45640..aa5e67e453f69bd02920888a19d73b94e92addce 100644 --- a/cumulus/client/relay-chain-minimal-node/src/blockchain_rpc_client.rs +++ b/cumulus/client/relay-chain-minimal-node/src/blockchain_rpc_client.rs @@ -14,7 +14,10 @@ // You should have received a copy of the GNU General Public License // along with Cumulus. If not, see . -use std::pin::Pin; +use std::{ + collections::{BTreeMap, VecDeque}, + pin::Pin, +}; use cumulus_relay_chain_interface::{RelayChainError, RelayChainResult}; use cumulus_relay_chain_rpc_interface::RelayChainRpcClient; @@ -23,8 +26,7 @@ use polkadot_core_primitives::{Block, BlockNumber, Hash, Header}; use polkadot_overseer::{ChainApiBackend, RuntimeApiSubsystemClient}; use polkadot_primitives::{ async_backing::{AsyncBackingParams, BackingState}, - slashing, - vstaging::{ApprovalVotingParams, NodeFeatures}, + slashing, ApprovalVotingParams, CoreIndex, NodeFeatures, }; use sc_authority_discovery::{AuthorityDiscovery, Error as AuthorityDiscoveryError}; use sc_client_api::AuxStore; @@ -442,6 +444,13 @@ impl RuntimeApiSubsystemClient for BlockChainRpcClient { async fn node_features(&self, at: Hash) -> Result { Ok(self.rpc_client.parachain_host_node_features(at).await?) } + + async fn claim_queue( + &self, + at: Hash, + ) -> Result>, ApiError> { + Ok(self.rpc_client.parachain_host_claim_queue(at).await?) + } } #[async_trait::async_trait] diff --git a/cumulus/client/relay-chain-minimal-node/src/collator_overseer.rs b/cumulus/client/relay-chain-minimal-node/src/collator_overseer.rs index 5f5bf338ef9907756adb1eab3f0541e870677fe5..f01ef8b05ecba77cf6458fdfe80e966b3a67e6a3 100644 --- a/cumulus/client/relay-chain-minimal-node/src/collator_overseer.rs +++ b/cumulus/client/relay-chain-minimal-node/src/collator_overseer.rs @@ -15,159 +15,29 @@ // along with Polkadot. If not, see . use futures::{select, StreamExt}; -use parking_lot::Mutex; -use std::{collections::HashMap, sync::Arc}; +use std::sync::Arc; -use polkadot_availability_recovery::AvailabilityRecoverySubsystem; -use polkadot_collator_protocol::{CollatorProtocolSubsystem, ProtocolSide}; -use polkadot_network_bridge::{ - Metrics as NetworkBridgeMetrics, NetworkBridgeRx as NetworkBridgeRxSubsystem, - NetworkBridgeTx as NetworkBridgeTxSubsystem, -}; -use polkadot_node_collation_generation::CollationGenerationSubsystem; -use polkadot_node_core_chain_api::ChainApiSubsystem; -use polkadot_node_core_prospective_parachains::ProspectiveParachainsSubsystem; -use polkadot_node_core_runtime_api::RuntimeApiSubsystem; -use polkadot_node_network_protocol::{ - peer_set::{PeerSet, PeerSetProtocolNames}, - request_response::{ - v1::{self, AvailableDataFetchingRequest}, - v2, IncomingRequestReceiver, ReqProtocolNames, - }, -}; -use polkadot_node_subsystem_util::metrics::{prometheus::Registry, Metrics}; use polkadot_overseer::{ - BlockInfo, DummySubsystem, Handle, Overseer, OverseerConnector, OverseerHandle, SpawnGlue, - UnpinHandle, + BlockInfo, Handle, Overseer, OverseerConnector, OverseerHandle, SpawnGlue, UnpinHandle, }; -use polkadot_primitives::CollatorPair; +use polkadot_service::overseer::{collator_overseer_builder, OverseerGenArgs}; -use sc_authority_discovery::Service as AuthorityDiscoveryService; -use sc_network::{NetworkStateInfo, NotificationService}; use sc_service::TaskManager; use sc_utils::mpsc::tracing_unbounded; -use cumulus_primitives_core::relay_chain::{Block, Hash as PHash}; use cumulus_relay_chain_interface::RelayChainError; use crate::BlockChainRpcClient; -/// Arguments passed for overseer construction. -pub(crate) struct CollatorOverseerGenArgs<'a> { - /// Runtime client generic, providing the `ProvieRuntimeApi` trait besides others. - pub runtime_client: Arc, - /// Underlying network service implementation. - pub network_service: Arc>, - /// Syncing oracle. - pub sync_oracle: Box, - /// Underlying authority discovery service. - pub authority_discovery_service: AuthorityDiscoveryService, - /// Receiver for collation request protocol v1. - pub collation_req_receiver_v1: IncomingRequestReceiver, - /// Receiver for collation request protocol v2. - pub collation_req_receiver_v2: IncomingRequestReceiver, - /// Receiver for availability request protocol - pub available_data_req_receiver: IncomingRequestReceiver, - /// Prometheus registry, commonly used for production systems, less so for test. - pub registry: Option<&'a Registry>, - /// Task spawner to be used throughout the overseer and the APIs it provides. - pub spawner: sc_service::SpawnTaskHandle, - /// Determines the behavior of the collator. - pub collator_pair: CollatorPair, - /// Request response protocols - pub req_protocol_names: ReqProtocolNames, - /// Peerset protocols name mapping - pub peer_set_protocol_names: PeerSetProtocolNames, - /// Notification services for validation/collation protocols. - pub notification_services: HashMap>, -} - fn build_overseer( connector: OverseerConnector, - CollatorOverseerGenArgs { - runtime_client, - network_service, - sync_oracle, - authority_discovery_service, - collation_req_receiver_v1, - collation_req_receiver_v2, - available_data_req_receiver, - registry, - spawner, - collator_pair, - req_protocol_names, - peer_set_protocol_names, - notification_services, - }: CollatorOverseerGenArgs<'_>, + args: OverseerGenArgs, ) -> Result< (Overseer, Arc>, OverseerHandle), RelayChainError, > { - let spawner = SpawnGlue(spawner); - let network_bridge_metrics: NetworkBridgeMetrics = Metrics::register(registry)?; - let notification_sinks = Arc::new(Mutex::new(HashMap::new())); - - let builder = Overseer::builder() - .availability_distribution(DummySubsystem) - .availability_recovery(AvailabilityRecoverySubsystem::for_collator( - available_data_req_receiver, - Metrics::register(registry)?, - )) - .availability_store(DummySubsystem) - .bitfield_distribution(DummySubsystem) - .bitfield_signing(DummySubsystem) - .candidate_backing(DummySubsystem) - .candidate_validation(DummySubsystem) - .pvf_checker(DummySubsystem) - .chain_api(ChainApiSubsystem::new(runtime_client.clone(), Metrics::register(registry)?)) - .collation_generation(CollationGenerationSubsystem::new(Metrics::register(registry)?)) - .collator_protocol({ - let side = ProtocolSide::Collator { - peer_id: network_service.local_peer_id(), - collator_pair, - request_receiver_v1: collation_req_receiver_v1, - request_receiver_v2: collation_req_receiver_v2, - metrics: Metrics::register(registry)?, - }; - CollatorProtocolSubsystem::new(side) - }) - .network_bridge_rx(NetworkBridgeRxSubsystem::new( - network_service.clone(), - authority_discovery_service.clone(), - sync_oracle, - network_bridge_metrics.clone(), - peer_set_protocol_names.clone(), - notification_services, - notification_sinks.clone(), - )) - .network_bridge_tx(NetworkBridgeTxSubsystem::new( - network_service, - authority_discovery_service, - network_bridge_metrics, - req_protocol_names, - peer_set_protocol_names, - notification_sinks, - )) - .provisioner(DummySubsystem) - .runtime_api(RuntimeApiSubsystem::new( - runtime_client.clone(), - Metrics::register(registry)?, - spawner.clone(), - )) - .statement_distribution(DummySubsystem) - .prospective_parachains(ProspectiveParachainsSubsystem::new(Metrics::register(registry)?)) - .approval_distribution(DummySubsystem) - .approval_voting(DummySubsystem) - .gossip_support(DummySubsystem) - .dispute_coordinator(DummySubsystem) - .dispute_distribution(DummySubsystem) - .chain_selection(DummySubsystem) - .activation_external_listeners(Default::default()) - .span_per_active_leaf(Default::default()) - .active_leaves(Default::default()) - .supports_parachains(runtime_client) - .metrics(Metrics::register(registry)?) - .spawner(spawner); + let builder = + collator_overseer_builder(args).map_err(|e| RelayChainError::Application(e.into()))?; builder .build_with_connector(connector) @@ -175,7 +45,7 @@ fn build_overseer( } pub(crate) fn spawn_overseer( - overseer_args: CollatorOverseerGenArgs, + overseer_args: OverseerGenArgs, task_manager: &TaskManager, relay_chain_rpc_client: Arc, ) -> Result { diff --git a/cumulus/client/relay-chain-minimal-node/src/lib.rs b/cumulus/client/relay-chain-minimal-node/src/lib.rs index d121d2d3356765d9327fdaa0a8c0563c3917266f..b84427c3a75a55e30d9867cbe8d45522a2d2f8c0 100644 --- a/cumulus/client/relay-chain-minimal-node/src/lib.rs +++ b/cumulus/client/relay-chain-minimal-node/src/lib.rs @@ -14,7 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Polkadot. If not, see . -use collator_overseer::{CollatorOverseerGenArgs, NewMinimalNode}; +use collator_overseer::NewMinimalNode; use cumulus_relay_chain_interface::{RelayChainError, RelayChainInterface, RelayChainResult}; use cumulus_relay_chain_rpc_interface::{RelayChainRpcClient, RelayChainRpcInterface, Url}; @@ -27,11 +27,16 @@ use polkadot_node_network_protocol::{ }, }; +use polkadot_core_primitives::{Block as RelayBlock, Hash as RelayHash}; use polkadot_node_subsystem_util::metrics::prometheus::Registry; use polkadot_primitives::CollatorPair; +use polkadot_service::{overseer::OverseerGenArgs, IsParachainNode}; use sc_authority_discovery::Service as AuthorityDiscoveryService; -use sc_network::{config::FullNetworkConfiguration, Event, NetworkEventStream, NetworkService}; +use sc_network::{ + config::FullNetworkConfiguration, service::traits::NetworkService, Event, NetworkBackend, + NetworkEventStream, +}; use sc_service::{config::PrometheusConfig, Configuration, TaskManager}; use sp_runtime::{app_crypto::Pair, traits::Block as BlockT}; @@ -50,10 +55,11 @@ fn build_authority_discovery_service( task_manager: &TaskManager, client: Arc, config: &Configuration, - network: Arc::Hash>>, + network: Arc, prometheus_registry: Option, ) -> AuthorityDiscoveryService { let auth_disc_publish_non_global_ips = config.network.allow_non_globals_in_dht; + let auth_disc_public_addresses = config.network.public_addresses.clone(); let authority_discovery_role = sc_authority_discovery::Role::Discover; let dht_event_stream = network.event_stream("authority-discovery").filter_map(|e| async move { match e { @@ -64,12 +70,13 @@ fn build_authority_discovery_service( let (worker, service) = sc_authority_discovery::new_worker_and_service_with_config( sc_authority_discovery::WorkerConfig { publish_non_global_ips: auth_disc_publish_non_global_ips, + public_addresses: auth_disc_public_addresses, // Require that authority discovery records are signed. strict_record_validation: true, ..Default::default() }, client, - network, + Arc::new(network.clone()), Box::pin(dht_event_stream), authority_discovery_role, prometheus_registry, @@ -89,12 +96,22 @@ async fn build_interface( client: RelayChainRpcClient, ) -> RelayChainResult<(Arc<(dyn RelayChainInterface + 'static)>, Option)> { let collator_pair = CollatorPair::generate().0; - let collator_node = new_minimal_relay_chain( - polkadot_config, - collator_pair.clone(), - Arc::new(BlockChainRpcClient::new(client.clone())), - ) - .await?; + let collator_node = match polkadot_config.network.network_backend { + sc_network::config::NetworkBackendType::Libp2p => + new_minimal_relay_chain::>( + polkadot_config, + collator_pair.clone(), + Arc::new(BlockChainRpcClient::new(client.clone())), + ) + .await?, + sc_network::config::NetworkBackendType::Litep2p => + new_minimal_relay_chain::( + polkadot_config, + collator_pair.clone(), + Arc::new(BlockChainRpcClient::new(client.clone())), + ) + .await?, + }; task_manager.add_child(collator_node.task_manager); Ok(( Arc::new(RelayChainRpcInterface::new(client, collator_node.overseer_handle)), @@ -140,6 +157,7 @@ pub async fn build_minimal_relay_chain_node_light_client( build_interface(polkadot_config, task_manager, client).await } + /// Builds a minimal relay chain node. Chain data is fetched /// via [`BlockChainRpcClient`] and fed into the overseer and its subsystems. /// @@ -152,13 +170,18 @@ pub async fn build_minimal_relay_chain_node_light_client( /// - NetworkBridgeTx /// - RuntimeApi #[sc_tracing::logging::prefix_logs_with("Relaychain")] -async fn new_minimal_relay_chain( +async fn new_minimal_relay_chain>( config: Configuration, collator_pair: CollatorPair, relay_chain_rpc_client: Arc, ) -> Result { let role = config.role.clone(); - let mut net_config = sc_network::config::FullNetworkConfiguration::new(&config.network); + let mut net_config = + sc_network::config::FullNetworkConfiguration::<_, _, Network>::new(&config.network); + let metrics = Network::register_notification_metrics( + config.prometheus_config.as_ref().map(|cfg| &cfg.registry), + ); + let peer_store_handle = net_config.peer_store_handle(); let prometheus_registry = config.prometheus_registry(); let task_manager = TaskManager::new(config.tokio_handle.clone(), prometheus_registry)?; @@ -172,35 +195,41 @@ async fn new_minimal_relay_chain( } let genesis_hash = relay_chain_rpc_client.block_get_hash(Some(0)).await?.unwrap_or_default(); - let peer_set_protocol_names = + let peerset_protocol_names = PeerSetProtocolNames::new(genesis_hash, config.chain_spec.fork_id()); let is_authority = if role.is_authority() { IsAuthority::Yes } else { IsAuthority::No }; - let notification_services = peer_sets_info(is_authority, &peer_set_protocol_names) - .into_iter() - .map(|(config, (peerset, service))| { - net_config.add_notification_protocol(config); - (peerset, service) - }) - .collect::>>(); + let notification_services = peer_sets_info::<_, Network>( + is_authority, + &peerset_protocol_names, + metrics.clone(), + Arc::clone(&peer_store_handle), + ) + .into_iter() + .map(|(config, (peerset, service))| { + net_config.add_notification_protocol(config); + (peerset, service) + }) + .collect::>>(); let request_protocol_names = ReqProtocolNames::new(genesis_hash, config.chain_spec.fork_id()); - let (collation_req_receiver_v1, collation_req_receiver_v2, available_data_req_receiver) = + let (collation_req_v1_receiver, collation_req_v2_receiver, available_data_req_receiver) = build_request_response_protocol_receivers(&request_protocol_names, &mut net_config); let best_header = relay_chain_rpc_client .chain_get_header(None) .await? .ok_or_else(|| RelayChainError::RpcCallError("Unable to fetch best header".to_string()))?; - let (network, network_starter, sync_oracle) = build_collator_network( + let (network, network_starter, sync_service) = build_collator_network::( &config, net_config, task_manager.spawn_handle(), genesis_hash, best_header, + metrics, ) .map_err(|e| RelayChainError::Application(Box::new(e) as Box<_>))?; - let authority_discovery_service = build_authority_discovery_service( + let authority_discovery_service = build_authority_discovery_service::( &task_manager, relay_chain_rpc_client.clone(), &config, @@ -208,19 +237,20 @@ async fn new_minimal_relay_chain( prometheus_registry.cloned(), ); - let overseer_args = CollatorOverseerGenArgs { + let overseer_args = OverseerGenArgs { runtime_client: relay_chain_rpc_client.clone(), network_service: network, - sync_oracle, + sync_service, authority_discovery_service, - collation_req_receiver_v1, - collation_req_receiver_v2, + collation_req_v1_receiver, + collation_req_v2_receiver, available_data_req_receiver, registry: prometheus_registry, spawner: task_manager.spawn_handle(), - collator_pair, + is_parachain_node: IsParachainNode::Collator(collator_pair), + overseer_message_channel_capacity_override: None, req_protocol_names: request_protocol_names, - peer_set_protocol_names, + peerset_protocol_names, notification_services, }; @@ -232,24 +262,28 @@ async fn new_minimal_relay_chain( Ok(NewMinimalNode { task_manager, overseer_handle }) } -fn build_request_response_protocol_receivers( +fn build_request_response_protocol_receivers< + Block: BlockT, + Network: NetworkBackend::Hash>, +>( request_protocol_names: &ReqProtocolNames, - config: &mut FullNetworkConfiguration, + config: &mut FullNetworkConfiguration::Hash, Network>, ) -> ( IncomingRequestReceiver, IncomingRequestReceiver, IncomingRequestReceiver, ) { - let (collation_req_receiver_v1, cfg) = - IncomingRequest::get_config_receiver(request_protocol_names); + let (collation_req_v1_receiver, cfg) = + IncomingRequest::get_config_receiver::<_, Network>(request_protocol_names); config.add_request_response_protocol(cfg); - let (collation_req_receiver_v2, cfg) = - IncomingRequest::get_config_receiver(request_protocol_names); + let (collation_req_v2_receiver, cfg) = + IncomingRequest::get_config_receiver::<_, Network>(request_protocol_names); config.add_request_response_protocol(cfg); let (available_data_req_receiver, cfg) = - IncomingRequest::get_config_receiver(request_protocol_names); + IncomingRequest::get_config_receiver::<_, Network>(request_protocol_names); config.add_request_response_protocol(cfg); - let cfg = Protocol::ChunkFetchingV1.get_outbound_only_config(request_protocol_names); + let cfg = + Protocol::ChunkFetchingV1.get_outbound_only_config::<_, Network>(request_protocol_names); config.add_request_response_protocol(cfg); - (collation_req_receiver_v1, collation_req_receiver_v2, available_data_req_receiver) + (collation_req_v1_receiver, collation_req_v2_receiver, available_data_req_receiver) } diff --git a/cumulus/client/relay-chain-minimal-node/src/network.rs b/cumulus/client/relay-chain-minimal-node/src/network.rs index 95785063c1aeb6649d7154fa39e4e111e226def3..025ac7a81a21c6a23622cac37882994309c54e85 100644 --- a/cumulus/client/relay-chain-minimal-node/src/network.rs +++ b/cumulus/client/relay-chain-minimal-node/src/network.rs @@ -15,60 +15,56 @@ // along with Cumulus. If not, see . use polkadot_core_primitives::{Block, Hash, Header}; -use sp_runtime::traits::{Block as BlockT, NumberFor}; +use sp_runtime::traits::NumberFor; use sc_network::{ config::{ - NetworkConfiguration, NonDefaultSetConfig, NonReservedPeerMode, NotificationHandshake, - ProtocolId, SetConfig, + NetworkConfiguration, NonReservedPeerMode, NotificationHandshake, PeerStore, ProtocolId, + SetConfig, }, - peer_store::PeerStore, - NetworkService, + peer_store::PeerStoreProvider, + service::traits::NetworkService, + NotificationMetrics, }; -use sc_network::{config::FullNetworkConfiguration, NotificationService}; +use sc_network::{config::FullNetworkConfiguration, NetworkBackend, NotificationService}; use sc_network_common::{role::Roles, sync::message::BlockAnnouncesHandshake}; use sc_service::{error::Error, Configuration, NetworkStarter, SpawnTaskHandle}; use std::{iter, sync::Arc}; /// Build the network service, the network status sinks and an RPC sender. -pub(crate) fn build_collator_network( +pub(crate) fn build_collator_network>( config: &Configuration, - mut full_network_config: FullNetworkConfiguration, + mut network_config: FullNetworkConfiguration, spawn_handle: SpawnTaskHandle, genesis_hash: Hash, best_header: Header, + notification_metrics: NotificationMetrics, ) -> Result< - (Arc>, NetworkStarter, Box), + (Arc, NetworkStarter, Arc), Error, > { let protocol_id = config.protocol_id(); - let (block_announce_config, _notification_service) = get_block_announce_proto_config::( + let (block_announce_config, _notification_service) = get_block_announce_proto_config::( protocol_id.clone(), &None, Roles::from(&config.role), best_header.number, best_header.hash(), genesis_hash, + notification_metrics.clone(), + network_config.peer_store_handle(), ); // Since this node has no syncing, we do not want light-clients to connect to it. // Here we set any potential light-client slots to 0. - adjust_network_config_light_in_peers(&mut full_network_config.network_config); - - let peer_store = PeerStore::new( - full_network_config - .network_config - .boot_nodes - .iter() - .map(|bootnode| bootnode.peer_id) - .collect(), - ); - let peer_store_handle = peer_store.handle(); + adjust_network_config_light_in_peers(&mut network_config.network_config); + + let peer_store = network_config.take_peer_store(); spawn_handle.spawn("peer-store", Some("networking"), peer_store.run()); - let network_params = sc_network::config::Params:: { + let network_params = sc_network::config::Params:: { role: config.role.clone(), executor: { let spawn_handle = Clone::clone(&spawn_handle); @@ -77,16 +73,17 @@ pub(crate) fn build_collator_network( }) }, fork_id: None, - network_config: full_network_config, - peer_store: peer_store_handle, + network_config, genesis_hash, protocol_id, metrics_registry: config.prometheus_config.as_ref().map(|config| config.registry.clone()), block_announce_config, + bitswap_config: None, + notification_metrics, }; - let network_worker = sc_network::NetworkWorker::new(network_params)?; - let network_service = network_worker.service().clone(); + let network_worker = Network::new(network_params)?; + let network_service = network_worker.network_service(); let (network_start_tx, network_start_rx) = futures::channel::oneshot::channel(); @@ -112,7 +109,7 @@ pub(crate) fn build_collator_network( let network_starter = NetworkStarter::new(network_start_tx); - Ok((network_service, network_starter, Box::new(SyncOracle {}))) + Ok((network_service, network_starter, Arc::new(SyncOracle {}))) } fn adjust_network_config_light_in_peers(config: &mut NetworkConfiguration) { @@ -139,14 +136,16 @@ impl sp_consensus::SyncOracle for SyncOracle { } } -fn get_block_announce_proto_config( +fn get_block_announce_proto_config>( protocol_id: ProtocolId, fork_id: &Option, roles: Roles, - best_number: NumberFor, - best_hash: B::Hash, - genesis_hash: B::Hash, -) -> (NonDefaultSetConfig, Box) { + best_number: NumberFor, + best_hash: Hash, + genesis_hash: Hash, + metrics: NotificationMetrics, + peer_store_handle: Arc, +) -> (Network::NotificationProtocolConfig, Box) { let block_announces_protocol = { let genesis_hash = genesis_hash.as_ref(); if let Some(ref fork_id) = fork_id { @@ -156,11 +155,11 @@ fn get_block_announce_proto_config( } }; - NonDefaultSetConfig::new( + Network::notification_config( block_announces_protocol.into(), iter::once(format!("/{}/block-announces/1", protocol_id.as_ref()).into()).collect(), 1024 * 1024, - Some(NotificationHandshake::new(BlockAnnouncesHandshake::::build( + Some(NotificationHandshake::new(BlockAnnouncesHandshake::::build( roles, best_number, best_hash, @@ -174,5 +173,7 @@ fn get_block_announce_proto_config( reserved_nodes: Vec::new(), non_reserved_mode: NonReservedPeerMode::Deny, }, + metrics, + peer_store_handle, ) } diff --git a/cumulus/client/relay-chain-rpc-interface/Cargo.toml b/cumulus/client/relay-chain-rpc-interface/Cargo.toml index fef6f82537d7e5760dc71bc0b492276926f3bc2e..14981677289561040875b0951dbdbffb5854a439 100644 --- a/cumulus/client/relay-chain-rpc-interface/Cargo.toml +++ b/cumulus/client/relay-chain-rpc-interface/Cargo.toml @@ -33,16 +33,16 @@ tokio-util = { version = "0.7.8", features = ["compat"] } futures = "0.3.28" futures-timer = "3.0.2" parity-scale-codec = "3.6.4" -jsonrpsee = { version = "0.20.3", features = ["ws-client"] } +jsonrpsee = { version = "0.22", features = ["ws-client"] } tracing = "0.1.37" -async-trait = "0.1.74" +async-trait = "0.1.79" url = "2.4.0" -serde_json = "1.0.111" -serde = "1.0.195" +serde_json = { workspace = true, default-features = true } +serde = { workspace = true, default-features = true } schnellru = "0.2.1" smoldot = { version = "0.11.0", default_features = false, features = ["std"] } smoldot-light = { version = "0.9.0", default_features = false, features = ["std"] } either = "1.8.1" -thiserror = "1.0.48" +thiserror = { workspace = true } rand = "0.8.5" pin-project = "1.1.3" diff --git a/cumulus/client/relay-chain-rpc-interface/src/lib.rs b/cumulus/client/relay-chain-rpc-interface/src/lib.rs index 96f8fc8b5563335eb7796bc8fd105fced15bc5e1..3a4c186e301eab295aa3befbd3c5549636fdb2c0 100644 --- a/cumulus/client/relay-chain-rpc-interface/src/lib.rs +++ b/cumulus/client/relay-chain-rpc-interface/src/lib.rs @@ -19,7 +19,7 @@ use core::time::Duration; use cumulus_primitives_core::{ relay_chain::{ CommittedCandidateReceipt, Hash as RelayHash, Header as RelayHeader, InboundHrmpMessage, - OccupiedCoreAssumption, SessionIndex, ValidatorId, + OccupiedCoreAssumption, SessionIndex, ValidationCodeHash, ValidatorId, }, InboundDownwardMessage, ParaId, PersistedValidationData, }; @@ -110,6 +110,17 @@ impl RelayChainInterface for RelayChainRpcInterface { .await } + async fn validation_code_hash( + &self, + hash: RelayHash, + para_id: ParaId, + occupied_core_assumption: OccupiedCoreAssumption, + ) -> RelayChainResult> { + self.rpc_client + .validation_code_hash(hash, para_id, occupied_core_assumption) + .await + } + async fn candidate_pending_availability( &self, hash: RelayHash, diff --git a/cumulus/client/relay-chain-rpc-interface/src/light_client_worker.rs b/cumulus/client/relay-chain-rpc-interface/src/light_client_worker.rs index 6fd057e170b715a1586dbd2dbf3f608268c539bd..9a49b60281b3c51fa1426903a0e73157a6f04e0e 100644 --- a/cumulus/client/relay-chain-rpc-interface/src/light_client_worker.rs +++ b/cumulus/client/relay-chain-rpc-interface/src/light_client_worker.rs @@ -19,12 +19,9 @@ //! we treat the light-client as a normal JsonRPC target. use futures::{channel::mpsc::Sender, prelude::*, stream::FuturesUnordered}; -use jsonrpsee::core::{ - client::{ - Client as JsonRpseeClient, ClientBuilder, ClientT, ReceivedMessage, TransportReceiverT, - TransportSenderT, - }, - Error, +use jsonrpsee::core::client::{ + Client as JsonRpseeClient, ClientBuilder, ClientT, Error, ReceivedMessage, TransportReceiverT, + TransportSenderT, }; use smoldot_light::{ChainId, Client as SmoldotClient, JsonRpcResponses}; use std::{num::NonZeroU32, sync::Arc}; diff --git a/cumulus/client/relay-chain-rpc-interface/src/reconnecting_ws_client.rs b/cumulus/client/relay-chain-rpc-interface/src/reconnecting_ws_client.rs index 322bcc93dae6d8158a0e6cfb99ded9a29bee79c5..48d35dd3a55eee935fb27f2fbc60302e9ed3e76a 100644 --- a/cumulus/client/relay-chain-rpc-interface/src/reconnecting_ws_client.rs +++ b/cumulus/client/relay-chain-rpc-interface/src/reconnecting_ws_client.rs @@ -27,7 +27,7 @@ use jsonrpsee::{ core::{ client::{Client as JsonRpcClient, ClientT, Subscription}, params::ArrayParams, - Error as JsonRpseeError, JsonValue, + ClientError as JsonRpseeError, JsonValue, }, ws_client::WsClientBuilder, }; @@ -293,7 +293,8 @@ impl ReconnectingWebsocketWorker { /// listeners. If an error occurs during sending, the receiver has been closed and we remove /// the sender from the list. /// - Find a new valid RPC server to connect to in case the websocket connection is terminated. - /// If the worker is not able to connec to an RPC server from the list, the worker shuts down. + /// If the worker is not able to connect to an RPC server from the list, the worker shuts + /// down. pub async fn run(mut self) { let mut pending_requests = FuturesUnordered::new(); diff --git a/cumulus/client/relay-chain-rpc-interface/src/rpc_client.rs b/cumulus/client/relay-chain-rpc-interface/src/rpc_client.rs index c64fff77a29fd016d7e1723ab461dc8082770682..547803865c28a28a7534b3a5d7e0075a2332c71b 100644 --- a/cumulus/client/relay-chain-rpc-interface/src/rpc_client.rs +++ b/cumulus/client/relay-chain-rpc-interface/src/rpc_client.rs @@ -19,11 +19,12 @@ use futures::channel::{ oneshot::Sender as OneshotSender, }; use jsonrpsee::{ - core::{params::ArrayParams, Error as JsonRpseeError}, + core::{params::ArrayParams, ClientError as JsonRpseeError}, rpc_params, }; use serde::de::DeserializeOwned; use serde_json::Value as JsonValue; +use std::collections::VecDeque; use tokio::sync::mpsc::Sender as TokioSender; use parity_scale_codec::{Decode, Encode}; @@ -31,13 +32,12 @@ use parity_scale_codec::{Decode, Encode}; use cumulus_primitives_core::{ relay_chain::{ async_backing::{AsyncBackingParams, BackingState}, - slashing, - vstaging::{ApprovalVotingParams, NodeFeatures}, - BlockNumber, CandidateCommitments, CandidateEvent, CandidateHash, - CommittedCandidateReceipt, CoreState, DisputeState, ExecutorParams, GroupRotationInfo, - Hash as RelayHash, Header as RelayHeader, InboundHrmpMessage, OccupiedCoreAssumption, - PvfCheckStatement, ScrapedOnChainVotes, SessionIndex, SessionInfo, ValidationCode, - ValidationCodeHash, ValidatorId, ValidatorIndex, ValidatorSignature, + slashing, ApprovalVotingParams, BlockNumber, CandidateCommitments, CandidateEvent, + CandidateHash, CommittedCandidateReceipt, CoreIndex, CoreState, DisputeState, + ExecutorParams, GroupRotationInfo, Hash as RelayHash, Header as RelayHeader, + InboundHrmpMessage, NodeFeatures, OccupiedCoreAssumption, PvfCheckStatement, + ScrapedOnChainVotes, SessionIndex, SessionInfo, ValidationCode, ValidationCodeHash, + ValidatorId, ValidatorIndex, ValidatorSignature, }, InboundDownwardMessage, ParaId, PersistedValidationData, }; @@ -647,6 +647,28 @@ impl RelayChainRpcClient { .await } + pub async fn parachain_host_claim_queue( + &self, + at: RelayHash, + ) -> Result>, RelayChainError> { + self.call_remote_runtime_function("ParachainHost_claim_queue", at, None::<()>) + .await + } + + pub async fn validation_code_hash( + &self, + at: RelayHash, + para_id: ParaId, + occupied_core_assumption: OccupiedCoreAssumption, + ) -> Result, RelayChainError> { + self.call_remote_runtime_function( + "ParachainHost_validation_code_hash", + at, + Some((para_id, occupied_core_assumption)), + ) + .await + } + fn send_register_message_to_worker( &self, message: RpcDispatcherMessage, diff --git a/cumulus/client/service/Cargo.toml b/cumulus/client/service/Cargo.toml index 2bafbee951a950ce7144e593cab9ae4387b1a5f6..e03e20fe5b416102aa99739cb00c0b39edf5b999 100644 --- a/cumulus/client/service/Cargo.toml +++ b/cumulus/client/service/Cargo.toml @@ -30,6 +30,7 @@ sp-consensus = { path = "../../../substrate/primitives/consensus/common" } sp-core = { path = "../../../substrate/primitives/core" } sp-runtime = { path = "../../../substrate/primitives/runtime" } sp-transaction-pool = { path = "../../../substrate/primitives/transaction-pool" } +sp-io = { path = "../../../substrate/primitives/io" } # Polkadot polkadot-primitives = { path = "../../../polkadot/primitives" } diff --git a/cumulus/client/service/src/lib.rs b/cumulus/client/service/src/lib.rs index 950e59aff24ec19a2e0ed3b22215d6c77fb7dc5e..9b5f0bec53875c98dc563b86ecea1d4864a554da 100644 --- a/cumulus/client/service/src/lib.rs +++ b/cumulus/client/service/src/lib.rs @@ -40,7 +40,7 @@ use sc_consensus::{ import_queue::{ImportQueue, ImportQueueService}, BlockImport, }; -use sc_network::{config::SyncMode, NetworkService}; +use sc_network::{config::SyncMode, service::traits::NetworkService, NetworkBackend}; use sc_network_sync::SyncingService; use sc_network_transactions::TransactionsHandlerController; use sc_service::{Configuration, NetworkStarter, SpawnTaskHandle, TaskManager, WarpSyncParams}; @@ -54,6 +54,15 @@ use std::{sync::Arc, time::Duration}; pub use cumulus_primitives_proof_size_hostfunction::storage_proof_size; +/// Host functions that should be used in parachain nodes. +/// +/// Contains the standard substrate host functions, as well as a +/// host function to enable PoV-reclaim on parachain nodes. +pub type ParachainHostFunctions = ( + cumulus_primitives_proof_size_hostfunction::storage_proof_size::HostFunctions, + sp_io::SubstrateHostFunctions, +); + // Given the sporadic nature of the explicit recovery operation and the // possibility to retry infinite times this value is more than enough. // In practice here we expect no more than one queued messages. @@ -397,13 +406,15 @@ pub struct BuildNetworkParams< + HeaderBackend + BlockIdTo + 'static, + Network: NetworkBackend::Hash>, RCInterface, IQ, > where Client::Api: sp_transaction_pool::runtime_api::TaggedTransactionQueue, { pub parachain_config: &'a Configuration, - pub net_config: sc_network::config::FullNetworkConfiguration, + pub net_config: + sc_network::config::FullNetworkConfiguration::Hash, Network>, pub client: Arc, pub transaction_pool: Arc>, pub para_id: ParaId, @@ -414,7 +425,7 @@ pub struct BuildNetworkParams< } /// Build the network service, the network status sinks and an RPC sender. -pub async fn build_network<'a, Block, Client, RCInterface, IQ>( +pub async fn build_network<'a, Block, Client, RCInterface, IQ, Network>( BuildNetworkParams { parachain_config, net_config, @@ -425,9 +436,9 @@ pub async fn build_network<'a, Block, Client, RCInterface, IQ>( relay_chain_interface, import_queue, sybil_resistance_level, - }: BuildNetworkParams<'a, Block, Client, RCInterface, IQ>, + }: BuildNetworkParams<'a, Block, Client, Network, RCInterface, IQ>, ) -> sc_service::error::Result<( - Arc>, + Arc, TracingUnboundedSender>, TransactionsHandlerController, NetworkStarter, @@ -452,6 +463,7 @@ where for<'b> &'b Client: BlockImport, RCInterface: RelayChainInterface + Clone + 'static, IQ: ImportQueue + 'static, + Network: NetworkBackend::Hash>, { let warp_sync_params = match parachain_config.network.sync_mode { SyncMode::Warp => { @@ -476,6 +488,9 @@ where Box::new(block_announce_validator) as Box<_> }, }; + let metrics = Network::register_notification_metrics( + parachain_config.prometheus_config.as_ref().map(|cfg| &cfg.registry), + ); sc_service::build_network(sc_service::BuildNetworkParams { config: parachain_config, @@ -487,6 +502,7 @@ where block_announce_validator_builder: Some(Box::new(move |_| block_announce_validator)), warp_sync_params, block_relay: None, + metrics, }) } diff --git a/cumulus/pallets/aura-ext/Cargo.toml b/cumulus/pallets/aura-ext/Cargo.toml index ff30dce7b03394a523a811217de0db9b7dc5cd02..fe717596f9b307993f968ea0e7b58faef591dcf7 100644 --- a/cumulus/pallets/aura-ext/Cargo.toml +++ b/cumulus/pallets/aura-ext/Cargo.toml @@ -11,7 +11,7 @@ workspace = true [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } # Substrate frame-support = { path = "../../../substrate/frame/support", default-features = false } diff --git a/cumulus/pallets/aura-ext/src/consensus_hook.rs b/cumulus/pallets/aura-ext/src/consensus_hook.rs index 089ab5c3198b98129e53e155dc4fcc009bf0e6d8..592029803391179785bb3b5606079d1bee6b553f 100644 --- a/cumulus/pallets/aura-ext/src/consensus_hook.rs +++ b/cumulus/pallets/aura-ext/src/consensus_hook.rs @@ -54,8 +54,8 @@ where let velocity = V.max(1); let relay_chain_slot = state_proof.read_slot().expect("failed to read relay chain slot"); - let (slot, authored) = pallet::Pallet::::slot_info() - .expect("slot info is inserted on block initialization"); + let (slot, authored) = + pallet::SlotInfo::::get().expect("slot info is inserted on block initialization"); // Convert relay chain timestamp. let relay_chain_timestamp = @@ -100,7 +100,7 @@ impl< /// is more recent than the included block itself. pub fn can_build_upon(included_hash: T::Hash, new_slot: Slot) -> bool { let velocity = V.max(1); - let (last_slot, authored_so_far) = match pallet::Pallet::::slot_info() { + let (last_slot, authored_so_far) = match pallet::SlotInfo::::get() { None => return true, Some(x) => x, }; diff --git a/cumulus/pallets/aura-ext/src/lib.rs b/cumulus/pallets/aura-ext/src/lib.rs index 34a41557152d8df38e0abc2d612151b2f74dc779..7ca84dff7c513c2406d3c0de7b9c0ac26048f508 100644 --- a/cumulus/pallets/aura-ext/src/lib.rs +++ b/cumulus/pallets/aura-ext/src/lib.rs @@ -63,14 +63,14 @@ pub mod pallet { impl Hooks> for Pallet { fn on_finalize(_: BlockNumberFor) { // Update to the latest AuRa authorities. - Authorities::::put(Aura::::authorities()); + Authorities::::put(pallet_aura::Authorities::::get()); } fn on_initialize(_: BlockNumberFor) -> Weight { // Fetch the authorities once to get them into the storage proof of the PoV. Authorities::::get(); - let new_slot = Aura::::current_slot(); + let new_slot = pallet_aura::CurrentSlot::::get(); let (new_slot, authored) = match SlotInfo::::get() { Some((slot, authored)) if slot == new_slot => (slot, authored + 1), @@ -103,7 +103,6 @@ pub mod pallet { /// /// Updated on each block initialization. #[pallet::storage] - #[pallet::getter(fn slot_info)] pub(crate) type SlotInfo = StorageValue<_, (Slot, u32), OptionQuery>; #[pallet::genesis_config] @@ -116,13 +115,7 @@ pub mod pallet { #[pallet::genesis_build] impl BuildGenesisConfig for GenesisConfig { fn build(&self) { - let authorities = Aura::::authorities(); - - assert!( - !authorities.is_empty(), - "AuRa authorities empty, maybe wrong order in `construct_runtime!`?", - ); - + let authorities = pallet_aura::Authorities::::get(); Authorities::::put(authorities); } } diff --git a/cumulus/pallets/collator-selection/Cargo.toml b/cumulus/pallets/collator-selection/Cargo.toml index 4216776fe8ac017958462aec1da5af58edc67f39..c04d9e1403ec0e3d527e06c7b0c7c5e6f64150ad 100644 --- a/cumulus/pallets/collator-selection/Cargo.toml +++ b/cumulus/pallets/collator-selection/Cargo.toml @@ -16,10 +16,10 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -log = { version = "0.4.20", default-features = false } +log = { workspace = true } codec = { default-features = false, features = ["derive"], package = "parity-scale-codec", version = "3.0.0" } rand = { version = "0.8.5", features = ["std_rng"], default-features = false } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } sp-std = { path = "../../../substrate/primitives/std", default-features = false } sp-runtime = { path = "../../../substrate/primitives/runtime", default-features = false } @@ -77,5 +77,3 @@ try-runtime = [ "pallet-timestamp/try-runtime", "sp-runtime/try-runtime", ] - -experimental = ["pallet-aura/experimental"] diff --git a/cumulus/pallets/collator-selection/src/benchmarking.rs b/cumulus/pallets/collator-selection/src/benchmarking.rs index 2c40f4dd0eac4a8a2ad3aed7f162a4379ccdbc93..c6b600445282534951b2c63a6c2a87181688acd1 100644 --- a/cumulus/pallets/collator-selection/src/benchmarking.rs +++ b/cumulus/pallets/collator-selection/src/benchmarking.rs @@ -22,9 +22,7 @@ use super::*; #[allow(unused)] use crate::Pallet as CollatorSelection; use codec::Decode; -use frame_benchmarking::{ - account, impl_benchmark_test_suite, v2::*, whitelisted_caller, BenchmarkError, -}; +use frame_benchmarking::{account, v2::*, whitelisted_caller, BenchmarkError}; use frame_support::traits::{Currency, EnsureOrigin, Get, ReservableCurrency}; use frame_system::{pallet_prelude::BlockNumberFor, EventRecord, RawOrigin}; use pallet_authorship::EventHandler; @@ -88,23 +86,23 @@ fn register_validators(count: u32) -> Vec(count: u32) { let candidates = (0..count).map(|c| account("candidate", c, SEED)).collect::>(); - assert!(>::get() > 0u32.into(), "Bond cannot be zero!"); + assert!(CandidacyBond::::get() > 0u32.into(), "Bond cannot be zero!"); for who in candidates { - T::Currency::make_free_balance_be(&who, >::get() * 3u32.into()); + T::Currency::make_free_balance_be(&who, CandidacyBond::::get() * 3u32.into()); >::register_as_candidate(RawOrigin::Signed(who).into()).unwrap(); } } fn min_candidates() -> u32 { let min_collators = T::MinEligibleCollators::get(); - let invulnerable_length = >::get().len(); + let invulnerable_length = Invulnerables::::get().len(); min_collators.saturating_sub(invulnerable_length.try_into().unwrap()) } fn min_invulnerables() -> u32 { let min_collators = T::MinEligibleCollators::get(); - let candidates_length = >::decode_len() + let candidates_length = CandidateList::::decode_len() .unwrap_or_default() .try_into() .unwrap_or_default(); @@ -145,8 +143,8 @@ mod benchmarks { T::UpdateOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; // need to fill up candidates - >::put(T::Currency::minimum_balance()); - >::put(c); + CandidacyBond::::put(T::Currency::minimum_balance()); + DesiredCandidates::::put(c); // get accounts and keys for the `c` candidates let mut candidates = (0..c).map(|cc| validator::(cc)).collect::>(); // add one more to the list. should not be in `b` (invulnerables) because it's the account @@ -161,15 +159,15 @@ mod benchmarks { } // ... and register them. for (who, _) in candidates.iter() { - let deposit = >::get(); + let deposit = CandidacyBond::::get(); T::Currency::make_free_balance_be(who, deposit * 1000_u32.into()); - >::try_mutate(|list| { + CandidateList::::try_mutate(|list| { list.try_push(CandidateInfo { who: who.clone(), deposit }).unwrap(); Ok::<(), BenchmarkError>(()) }) .unwrap(); T::Currency::reserve(who, deposit)?; - >::insert( + LastAuthoredBlock::::insert( who.clone(), frame_system::Pallet::::block_number() + T::KickThreshold::get(), ); @@ -180,7 +178,7 @@ mod benchmarks { invulnerables.sort(); let invulnerables: frame_support::BoundedVec<_, T::MaxInvulnerables> = frame_support::BoundedVec::try_from(invulnerables).unwrap(); - >::put(invulnerables); + Invulnerables::::put(invulnerables); #[extrinsic_call] _(origin as T::RuntimeOrigin, new_invulnerable.clone()); @@ -199,8 +197,8 @@ mod benchmarks { invulnerables.sort(); let invulnerables: frame_support::BoundedVec<_, T::MaxInvulnerables> = frame_support::BoundedVec::try_from(invulnerables).unwrap(); - >::put(invulnerables); - let to_remove = >::get().first().unwrap().clone(); + Invulnerables::::put(invulnerables); + let to_remove = Invulnerables::::get().first().unwrap().clone(); #[extrinsic_call] _(origin as T::RuntimeOrigin, to_remove.clone()); @@ -228,14 +226,14 @@ mod benchmarks { k: Linear<0, { T::MaxCandidates::get() }>, ) -> Result<(), BenchmarkError> { let initial_bond_amount: BalanceOf = T::Currency::minimum_balance() * 2u32.into(); - >::put(initial_bond_amount); + CandidacyBond::::put(initial_bond_amount); register_validators::(c); register_candidates::(c); let kicked = cmp::min(k, c); let origin = T::UpdateOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; let bond_amount = if k > 0 { - >::mutate(|candidates| { + CandidateList::::mutate(|candidates| { for info in candidates.iter_mut().skip(kicked as usize) { info.deposit = T::Currency::minimum_balance() * 3u32.into(); } @@ -256,13 +254,13 @@ mod benchmarks { fn update_bond( c: Linear<{ min_candidates::() + 1 }, { T::MaxCandidates::get() }>, ) -> Result<(), BenchmarkError> { - >::put(T::Currency::minimum_balance()); - >::put(c); + CandidacyBond::::put(T::Currency::minimum_balance()); + DesiredCandidates::::put(c); register_validators::(c); register_candidates::(c); - let caller = >::get()[0].who.clone(); + let caller = CandidateList::::get()[0].who.clone(); v2::whitelist!(caller); let bond_amount: BalanceOf = @@ -275,7 +273,7 @@ mod benchmarks { Event::CandidateBondUpdated { account_id: caller, deposit: bond_amount }.into(), ); assert!( - >::get().iter().last().unwrap().deposit == + CandidateList::::get().iter().last().unwrap().deposit == T::Currency::minimum_balance() * 2u32.into() ); Ok(()) @@ -285,8 +283,8 @@ mod benchmarks { // one. #[benchmark] fn register_as_candidate(c: Linear<1, { T::MaxCandidates::get() - 1 }>) { - >::put(T::Currency::minimum_balance()); - >::put(c + 1); + CandidacyBond::::put(T::Currency::minimum_balance()); + DesiredCandidates::::put(c + 1); register_validators::(c); register_candidates::(c); @@ -312,8 +310,8 @@ mod benchmarks { #[benchmark] fn take_candidate_slot(c: Linear<{ min_candidates::() + 1 }, { T::MaxCandidates::get() }>) { - >::put(T::Currency::minimum_balance()); - >::put(1); + CandidacyBond::::put(T::Currency::minimum_balance()); + DesiredCandidates::::put(1); register_validators::(c); register_candidates::(c); @@ -329,7 +327,7 @@ mod benchmarks { ) .unwrap(); - let target = >::get().iter().last().unwrap().who.clone(); + let target = CandidateList::::get().iter().last().unwrap().who.clone(); #[extrinsic_call] _(RawOrigin::Signed(caller.clone()), bond / 2u32.into(), target.clone()); @@ -343,13 +341,13 @@ mod benchmarks { // worse case is the last candidate leaving. #[benchmark] fn leave_intent(c: Linear<{ min_candidates::() + 1 }, { T::MaxCandidates::get() }>) { - >::put(T::Currency::minimum_balance()); - >::put(c); + CandidacyBond::::put(T::Currency::minimum_balance()); + DesiredCandidates::::put(c); register_validators::(c); register_candidates::(c); - let leaving = >::get().iter().last().unwrap().who.clone(); + let leaving = CandidateList::::get().iter().last().unwrap().who.clone(); v2::whitelist!(leaving); #[extrinsic_call] @@ -361,7 +359,7 @@ mod benchmarks { // worse case is paying a non-existing candidate account. #[benchmark] fn note_author() { - >::put(T::Currency::minimum_balance()); + CandidacyBond::::put(T::Currency::minimum_balance()); T::Currency::make_free_balance_be( &>::account_id(), T::Currency::minimum_balance() * 4u32.into(), @@ -387,8 +385,8 @@ mod benchmarks { r: Linear<1, { T::MaxCandidates::get() }>, c: Linear<1, { T::MaxCandidates::get() }>, ) { - >::put(T::Currency::minimum_balance()); - >::put(c); + CandidacyBond::::put(T::Currency::minimum_balance()); + DesiredCandidates::::put(c); frame_system::Pallet::::set_block_number(0u32.into()); register_validators::(c); @@ -396,7 +394,7 @@ mod benchmarks { let new_block: BlockNumberFor = T::KickThreshold::get(); let zero_block: BlockNumberFor = 0u32.into(); - let candidates: Vec = >::get() + let candidates: Vec = CandidateList::::get() .iter() .map(|candidate_info| candidate_info.who.clone()) .collect(); @@ -404,25 +402,25 @@ mod benchmarks { let non_removals = c.saturating_sub(r); for i in 0..c { - >::insert(candidates[i as usize].clone(), zero_block); + LastAuthoredBlock::::insert(candidates[i as usize].clone(), zero_block); } if non_removals > 0 { for i in 0..non_removals { - >::insert(candidates[i as usize].clone(), new_block); + LastAuthoredBlock::::insert(candidates[i as usize].clone(), new_block); } } else { for i in 0..c { - >::insert(candidates[i as usize].clone(), new_block); + LastAuthoredBlock::::insert(candidates[i as usize].clone(), new_block); } } let min_candidates = min_candidates::(); - let pre_length = >::decode_len().unwrap_or_default(); + let pre_length = CandidateList::::decode_len().unwrap_or_default(); frame_system::Pallet::::set_block_number(new_block); - let current_length: u32 = >::decode_len() + let current_length: u32 = CandidateList::::decode_len() .unwrap_or_default() .try_into() .unwrap_or_default(); @@ -436,12 +434,12 @@ mod benchmarks { // candidates > removals and remaining candidates > min candidates // => remaining candidates should be shorter than before removal, i.e. some were // actually removed. - assert!(>::decode_len().unwrap_or_default() < pre_length); + assert!(CandidateList::::decode_len().unwrap_or_default() < pre_length); } else if c > r && non_removals < min_candidates { // candidates > removals and remaining candidates would be less than min candidates // => remaining candidates should equal min candidates, i.e. some were removed up to // the minimum, but then any more were "forced" to stay in candidates. - let current_length: u32 = >::decode_len() + let current_length: u32 = CandidateList::::decode_len() .unwrap_or_default() .try_into() .unwrap_or_default(); @@ -449,7 +447,7 @@ mod benchmarks { } else { // removals >= candidates, non removals must == 0 // can't remove more than exist - assert!(>::decode_len().unwrap_or_default() == pre_length); + assert!(CandidateList::::decode_len().unwrap_or_default() == pre_length); } } diff --git a/cumulus/pallets/collator-selection/src/lib.rs b/cumulus/pallets/collator-selection/src/lib.rs index 7449f4d68c7eacc8b07fa45f2f991c13f3d5713b..17bbe2591d48f767305adfe4c87237c926b83187 100644 --- a/cumulus/pallets/collator-selection/src/lib.rs +++ b/cumulus/pallets/collator-selection/src/lib.rs @@ -81,6 +81,8 @@ #![cfg_attr(not(feature = "std"), no_std)] +use core::marker::PhantomData; +use frame_support::traits::TypedGet; pub use pallet::*; #[cfg(test)] @@ -118,7 +120,7 @@ pub mod pallet { use sp_staking::SessionIndex; use sp_std::vec::Vec; - /// The current storage version. + /// The in-code storage version. const STORAGE_VERSION: StorageVersion = StorageVersion::new(1); type BalanceOf = @@ -196,7 +198,6 @@ pub mod pallet { /// The invulnerable, permissioned collators. This list must be sorted. #[pallet::storage] - #[pallet::getter(fn invulnerables)] pub type Invulnerables = StorageValue<_, BoundedVec, ValueQuery>; @@ -206,7 +207,6 @@ pub mod pallet { /// This list is sorted in ascending order by deposit and when the deposits are equal, the least /// recently updated is considered greater. #[pallet::storage] - #[pallet::getter(fn candidate_list)] pub type CandidateList = StorageValue< _, BoundedVec>, T::MaxCandidates>, @@ -215,7 +215,6 @@ pub mod pallet { /// Last block authored by collator. #[pallet::storage] - #[pallet::getter(fn last_authored_block)] pub type LastAuthoredBlock = StorageMap<_, Twox64Concat, T::AccountId, BlockNumberFor, ValueQuery>; @@ -223,14 +222,12 @@ pub mod pallet { /// /// This should ideally always be less than [`Config::MaxCandidates`] for weights to be correct. #[pallet::storage] - #[pallet::getter(fn desired_candidates)] pub type DesiredCandidates = StorageValue<_, u32, ValueQuery>; /// Fixed amount to deposit to become a collator. /// /// When a collator calls `leave_intent` they immediately receive the deposit back. #[pallet::storage] - #[pallet::getter(fn candidacy_bond)] pub type CandidacyBond = StorageValue<_, BalanceOf, ValueQuery>; #[pallet::genesis_config] @@ -263,9 +260,9 @@ pub mod pallet { bounded_invulnerables.sort(); - >::put(self.desired_candidates); - >::put(self.candidacy_bond); - >::put(bounded_invulnerables); + DesiredCandidates::::put(self.desired_candidates); + CandidacyBond::::put(self.candidacy_bond); + Invulnerables::::put(bounded_invulnerables); } } @@ -424,7 +421,7 @@ pub mod pallet { // Invulnerables must be sorted for removal. bounded_invulnerables.sort(); - >::put(&bounded_invulnerables); + Invulnerables::::put(&bounded_invulnerables); Self::deposit_event(Event::NewInvulnerables { invulnerables: bounded_invulnerables.to_vec(), }); @@ -448,7 +445,7 @@ pub mod pallet { if max > T::MaxCandidates::get() { log::warn!("max > T::MaxCandidates; you might need to run benchmarks again"); } - >::put(max); + DesiredCandidates::::put(max); Self::deposit_event(Event::NewDesiredCandidates { desired_candidates: max }); Ok(().into()) } @@ -470,17 +467,17 @@ pub mod pallet { bond: BalanceOf, ) -> DispatchResultWithPostInfo { T::UpdateOrigin::ensure_origin(origin)?; - let bond_increased = >::mutate(|old_bond| -> bool { + let bond_increased = CandidacyBond::::mutate(|old_bond| -> bool { let bond_increased = *old_bond < bond; *old_bond = bond; bond_increased }); - let initial_len = >::decode_len().unwrap_or_default(); + let initial_len = CandidateList::::decode_len().unwrap_or_default(); let kicked = (bond_increased && initial_len > 0) .then(|| { // Closure below returns the number of candidates which were kicked because // their deposits were lower than the new candidacy bond. - >::mutate(|candidates| -> usize { + CandidateList::::mutate(|candidates| -> usize { let first_safe_candidate = candidates .iter() .position(|candidate| candidate.deposit >= bond) @@ -488,14 +485,18 @@ pub mod pallet { let kicked_candidates = candidates.drain(..first_safe_candidate); for candidate in kicked_candidates { T::Currency::unreserve(&candidate.who, candidate.deposit); - >::remove(candidate.who); + LastAuthoredBlock::::remove(candidate.who); } first_safe_candidate }) }) .unwrap_or_default(); Self::deposit_event(Event::NewCandidacyBond { bond_amount: bond }); - Ok(Some(T::WeightInfo::set_candidacy_bond(initial_len as u32, kicked as u32)).into()) + Ok(Some(T::WeightInfo::set_candidacy_bond( + bond_increased.then(|| initial_len as u32).unwrap_or_default(), + kicked as u32, + )) + .into()) } /// Register this account as a collator candidate. The account must (a) already have @@ -508,12 +509,12 @@ pub mod pallet { let who = ensure_signed(origin)?; // ensure we are below limit. - let length: u32 = >::decode_len() + let length: u32 = CandidateList::::decode_len() .unwrap_or_default() .try_into() .unwrap_or_default(); ensure!(length < T::MaxCandidates::get(), Error::::TooManyCandidates); - ensure!(!Self::invulnerables().contains(&who), Error::::AlreadyInvulnerable); + ensure!(!Invulnerables::::get().contains(&who), Error::::AlreadyInvulnerable); let validator_key = T::ValidatorIdOf::convert(who.clone()) .ok_or(Error::::NoAssociatedValidatorId)?; @@ -522,15 +523,15 @@ pub mod pallet { Error::::ValidatorNotRegistered ); - let deposit = Self::candidacy_bond(); + let deposit = CandidacyBond::::get(); // First authored block is current block plus kick threshold to handle session delay - >::try_mutate(|candidates| -> Result<(), DispatchError> { + CandidateList::::try_mutate(|candidates| -> Result<(), DispatchError> { ensure!( !candidates.iter().any(|candidate_info| candidate_info.who == who), Error::::AlreadyCandidate ); T::Currency::reserve(&who, deposit)?; - >::insert( + LastAuthoredBlock::::insert( who.clone(), frame_system::Pallet::::block_number() + T::KickThreshold::get(), ); @@ -560,7 +561,7 @@ pub mod pallet { Self::eligible_collators() > T::MinEligibleCollators::get(), Error::::TooFewEligibleCollators ); - let length = >::decode_len().unwrap_or_default(); + let length = CandidateList::::decode_len().unwrap_or_default(); // Do remove their last authored block. Self::try_remove_candidate(&who, true)?; @@ -590,7 +591,7 @@ pub mod pallet { Error::::ValidatorNotRegistered ); - >::try_mutate(|invulnerables| -> DispatchResult { + Invulnerables::::try_mutate(|invulnerables| -> DispatchResult { match invulnerables.binary_search(&who) { Ok(_) => return Err(Error::::AlreadyInvulnerable)?, Err(pos) => invulnerables @@ -611,7 +612,7 @@ pub mod pallet { .unwrap_or_default() .try_into() .unwrap_or(T::MaxInvulnerables::get().saturating_sub(1)), - >::decode_len() + CandidateList::::decode_len() .unwrap_or_default() .try_into() .unwrap_or(T::MaxCandidates::get()), @@ -634,7 +635,7 @@ pub mod pallet { Error::::TooFewEligibleCollators ); - >::try_mutate(|invulnerables| -> DispatchResult { + Invulnerables::::try_mutate(|invulnerables| -> DispatchResult { let pos = invulnerables.binary_search(&who).map_err(|_| Error::::NotInvulnerable)?; invulnerables.remove(pos); @@ -659,12 +660,12 @@ pub mod pallet { new_deposit: BalanceOf, ) -> DispatchResultWithPostInfo { let who = ensure_signed(origin)?; - ensure!(new_deposit >= >::get(), Error::::DepositTooLow); + ensure!(new_deposit >= CandidacyBond::::get(), Error::::DepositTooLow); // The function below will try to mutate the `CandidateList` entry for the caller to // update their deposit to the new value of `new_deposit`. The return value is the // position of the entry in the list, used for weight calculation. let length = - >::try_mutate(|candidates| -> Result { + CandidateList::::try_mutate(|candidates| -> Result { let idx = candidates .iter() .position(|candidate_info| candidate_info.who == who) @@ -678,7 +679,7 @@ pub mod pallet { } else if new_deposit < old_deposit { // Casting `u32` to `usize` should be safe on all machines running this. ensure!( - idx.saturating_add(>::get() as usize) < + idx.saturating_add(DesiredCandidates::::get() as usize) < candidate_count, Error::::InvalidUnreserve ); @@ -723,8 +724,8 @@ pub mod pallet { ) -> DispatchResultWithPostInfo { let who = ensure_signed(origin)?; - ensure!(!Self::invulnerables().contains(&who), Error::::AlreadyInvulnerable); - ensure!(deposit >= Self::candidacy_bond(), Error::::InsufficientBond); + ensure!(!Invulnerables::::get().contains(&who), Error::::AlreadyInvulnerable); + ensure!(deposit >= CandidacyBond::::get(), Error::::InsufficientBond); let validator_key = T::ValidatorIdOf::convert(who.clone()) .ok_or(Error::::NoAssociatedValidatorId)?; @@ -733,12 +734,12 @@ pub mod pallet { Error::::ValidatorNotRegistered ); - let length = >::decode_len().unwrap_or_default(); + let length = CandidateList::::decode_len().unwrap_or_default(); // The closure below iterates through all elements of the candidate list to ensure that // the caller isn't already a candidate and to find the target it's trying to replace in // the list. The return value is a tuple of the position of the candidate to be replaced // in the list along with its candidate information. - let target_info = >::try_mutate( + let target_info = CandidateList::::try_mutate( |candidates| -> Result>, DispatchError> { // Find the position in the list of the candidate that is being replaced. let mut target_info_idx = None; @@ -783,8 +784,8 @@ pub mod pallet { )?; T::Currency::reserve(&who, deposit)?; T::Currency::unreserve(&target_info.who, target_info.deposit); - >::remove(target_info.who.clone()); - >::insert( + LastAuthoredBlock::::remove(target_info.who.clone()); + LastAuthoredBlock::::insert( who.clone(), frame_system::Pallet::::block_number() + T::KickThreshold::get(), ); @@ -803,7 +804,7 @@ pub mod pallet { /// Return the total number of accounts that are eligible collators (candidates and /// invulnerables). fn eligible_collators() -> u32 { - >::decode_len() + CandidateList::::decode_len() .unwrap_or_default() .saturating_add(Invulnerables::::decode_len().unwrap_or_default()) .try_into() @@ -815,7 +816,7 @@ pub mod pallet { who: &T::AccountId, remove_last_authored: bool, ) -> Result<(), DispatchError> { - >::try_mutate(|candidates| -> Result<(), DispatchError> { + CandidateList::::try_mutate(|candidates| -> Result<(), DispatchError> { let idx = candidates .iter() .position(|candidate_info| candidate_info.who == *who) @@ -824,7 +825,7 @@ pub mod pallet { T::Currency::unreserve(who, deposit); candidates.remove(idx); if remove_last_authored { - >::remove(who.clone()) + LastAuthoredBlock::::remove(who.clone()) }; Ok(()) })?; @@ -837,10 +838,10 @@ pub mod pallet { /// This is done on the fly, as frequent as we are told to do so, as the session manager. pub fn assemble_collators() -> Vec { // Casting `u32` to `usize` should be safe on all machines running this. - let desired_candidates = >::get() as usize; - let mut collators = Self::invulnerables().to_vec(); + let desired_candidates = DesiredCandidates::::get() as usize; + let mut collators = Invulnerables::::get().to_vec(); collators.extend( - >::get() + CandidateList::::get() .iter() .rev() .cloned() @@ -861,10 +862,10 @@ pub mod pallet { candidates .into_iter() .filter_map(|c| { - let last_block = >::get(c.clone()); + let last_block = LastAuthoredBlock::::get(c.clone()); let since_last = now.saturating_sub(last_block); - let is_invulnerable = Self::invulnerables().contains(&c); + let is_invulnerable = Invulnerables::::get().contains(&c); let is_lazy = since_last >= kick_threshold; if is_invulnerable { @@ -903,7 +904,7 @@ pub mod pallet { /// or equal to the minimum number of eligible collators. #[cfg(any(test, feature = "try-runtime"))] pub fn do_try_state() -> Result<(), sp_runtime::TryRuntimeError> { - let desired_candidates = >::get(); + let desired_candidates = DesiredCandidates::::get(); frame_support::ensure!( desired_candidates <= T::MaxCandidates::get(), @@ -935,7 +936,7 @@ pub mod pallet { // `reward` is half of pot account minus ED, this should never fail. let _success = T::Currency::transfer(&pot, &author, reward, KeepAlive); debug_assert!(_success.is_ok()); - >::insert(author, frame_system::Pallet::::block_number()); + LastAuthoredBlock::::insert(author, frame_system::Pallet::::block_number()); frame_system::Pallet::::register_extra_weight_unchecked( T::WeightInfo::note_author(), @@ -956,12 +957,12 @@ pub mod pallet { // The `expect` below is safe because the list is a `BoundedVec` with a max size of // `T::MaxCandidates`, which is a `u32`. When `decode_len` returns `Some(len)`, `len` // must be valid and at most `u32::MAX`, which must always be able to convert to `u32`. - let candidates_len_before: u32 = >::decode_len() + let candidates_len_before: u32 = CandidateList::::decode_len() .unwrap_or_default() .try_into() .expect("length is at most `T::MaxCandidates`, so it must fit in `u32`; qed"); let active_candidates_count = Self::kick_stale_candidates( - >::get() + CandidateList::::get() .iter() .map(|candidate_info| candidate_info.who.clone()), ); @@ -982,3 +983,15 @@ pub mod pallet { } } } + +/// [`TypedGet`] implementation to get the AccountId of the StakingPot. +pub struct StakingPotAccountId(PhantomData); +impl TypedGet for StakingPotAccountId +where + R: crate::Config, +{ + type Type = ::AccountId; + fn get() -> Self::Type { + >::account_id() + } +} diff --git a/cumulus/pallets/collator-selection/src/migration.rs b/cumulus/pallets/collator-selection/src/migration.rs index 58b4cc5b06a1ab7da17b31ad3c457fd992c59136..5dc2fba4279a9b04dc9f1866fb2c36ea1abde80c 100644 --- a/cumulus/pallets/collator-selection/src/migration.rs +++ b/cumulus/pallets/collator-selection/src/migration.rs @@ -31,10 +31,10 @@ pub mod v1 { pub struct MigrateToV1(sp_std::marker::PhantomData); impl OnRuntimeUpgrade for MigrateToV1 { fn on_runtime_upgrade() -> Weight { - let onchain_version = Pallet::::on_chain_storage_version(); - if onchain_version == 0 { + let on_chain_version = Pallet::::on_chain_storage_version(); + if on_chain_version == 0 { let invulnerables_len = Invulnerables::::get().to_vec().len(); - >::mutate(|invulnerables| { + Invulnerables::::mutate(|invulnerables| { invulnerables.sort(); }); @@ -45,7 +45,7 @@ pub mod v1 { invulnerables_len, ); // Similar complexity to `set_invulnerables` (put storage value) - // Plus 1 read for length, 1 read for `onchain_version`, 1 write to put version + // Plus 1 read for length, 1 read for `on_chain_version`, 1 write to put version T::WeightInfo::set_invulnerables(invulnerables_len as u32) .saturating_add(T::DbWeight::get().reads_writes(2, 1)) } else { @@ -83,8 +83,8 @@ pub mod v1 { "after migration, there should be the same number of invulnerables" ); - let onchain_version = Pallet::::on_chain_storage_version(); - frame_support::ensure!(onchain_version >= 1, "must_upgrade"); + let on_chain_version = Pallet::::on_chain_storage_version(); + frame_support::ensure!(on_chain_version >= 1, "must_upgrade"); Ok(()) } diff --git a/cumulus/pallets/collator-selection/src/mock.rs b/cumulus/pallets/collator-selection/src/mock.rs index fe41e7318bcdafa025ec33a74c9651d664b03be2..4a440dfe1e92f26685415d260e0af9b1eb56a9a4 100644 --- a/cumulus/pallets/collator-selection/src/mock.rs +++ b/cumulus/pallets/collator-selection/src/mock.rs @@ -50,7 +50,7 @@ parameter_types! { pub const SS58Prefix: u8 = 42; } -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl system::Config for Test { type BaseCallFilter = frame_support::traits::Everything; type BlockWeights = (); @@ -125,7 +125,6 @@ impl pallet_aura::Config for Test { type MaxAuthorities = ConstU32<100_000>; type DisabledValidators = (); type AllowMultipleBlocksPerSlot = ConstBool; - #[cfg(feature = "experimental")] type SlotDuration = pallet_aura::MinimumPeriodTimesTwo; } diff --git a/cumulus/pallets/collator-selection/src/tests.rs b/cumulus/pallets/collator-selection/src/tests.rs index ed2044ccdfad7def46ab92180e9b177643ac8679..e8b2a4e146a2f95a1996e81f185f46c853f869a7 100644 --- a/cumulus/pallets/collator-selection/src/tests.rs +++ b/cumulus/pallets/collator-selection/src/tests.rs @@ -14,7 +14,10 @@ // limitations under the License. use crate as collator_selection; -use crate::{mock::*, CandidateInfo, Error}; +use crate::{ + mock::*, CandidacyBond, CandidateInfo, CandidateList, DesiredCandidates, Error, Invulnerables, + LastAuthoredBlock, +}; use frame_support::{ assert_noop, assert_ok, traits::{Currency, OnInitialize}, @@ -25,12 +28,12 @@ use sp_runtime::{testing::UintAuthorityId, traits::BadOrigin, BuildStorage}; #[test] fn basic_setup_works() { new_test_ext().execute_with(|| { - assert_eq!(CollatorSelection::desired_candidates(), 2); - assert_eq!(CollatorSelection::candidacy_bond(), 10); + assert_eq!(DesiredCandidates::::get(), 2); + assert_eq!(CandidacyBond::::get(), 10); - assert_eq!(>::get().iter().count(), 0); + assert_eq!(CandidateList::::get().iter().count(), 0); // genesis should sort input - assert_eq!(CollatorSelection::invulnerables(), vec![1, 2]); + assert_eq!(Invulnerables::::get(), vec![1, 2]); }); } @@ -43,7 +46,7 @@ fn it_should_set_invulnerables() { new_set.clone() )); new_set.sort(); - assert_eq!(CollatorSelection::invulnerables(), new_set); + assert_eq!(Invulnerables::::get(), new_set); // cannot set with non-root. assert_noop!( @@ -56,7 +59,7 @@ fn it_should_set_invulnerables() { #[test] fn it_should_set_invulnerables_even_with_some_invalid() { new_test_ext().execute_with(|| { - assert_eq!(CollatorSelection::invulnerables(), vec![1, 2]); + assert_eq!(Invulnerables::::get(), vec![1, 2]); let new_with_invalid = vec![1, 4, 3, 42, 2]; assert_ok!(CollatorSelection::set_invulnerables( @@ -65,7 +68,7 @@ fn it_should_set_invulnerables_even_with_some_invalid() { )); // should succeed and order them, but not include 42 - assert_eq!(CollatorSelection::invulnerables(), vec![1, 2, 3, 4]); + assert_eq!(Invulnerables::::get(), vec![1, 2, 3, 4]); }); } @@ -73,7 +76,7 @@ fn it_should_set_invulnerables_even_with_some_invalid() { fn add_invulnerable_works() { new_test_ext().execute_with(|| { initialize_to_block(1); - assert_eq!(CollatorSelection::invulnerables(), vec![1, 2]); + assert_eq!(Invulnerables::::get(), vec![1, 2]); let new = 3; // function runs @@ -93,7 +96,7 @@ fn add_invulnerable_works() { ); // new element is now part of the invulnerables list - assert!(CollatorSelection::invulnerables().to_vec().contains(&new)); + assert!(Invulnerables::::get().to_vec().contains(&new)); // cannot add with non-root assert_noop!(CollatorSelection::add_invulnerable(RuntimeOrigin::signed(1), new), BadOrigin); @@ -113,7 +116,7 @@ fn add_invulnerable_works() { #[test] fn invulnerable_limit_works() { new_test_ext().execute_with(|| { - assert_eq!(CollatorSelection::invulnerables(), vec![1, 2]); + assert_eq!(Invulnerables::::get(), vec![1, 2]); // MaxInvulnerables: u32 = 20 for ii in 3..=21 { @@ -140,7 +143,7 @@ fn invulnerable_limit_works() { } } let expected: Vec = (1..=20).collect(); - assert_eq!(CollatorSelection::invulnerables(), expected); + assert_eq!(Invulnerables::::get(), expected); // Cannot set too many Invulnerables let too_many_invulnerables: Vec = (1..=21).collect(); @@ -151,7 +154,7 @@ fn invulnerable_limit_works() { ), Error::::TooManyInvulnerables ); - assert_eq!(CollatorSelection::invulnerables(), expected); + assert_eq!(Invulnerables::::get(), expected); }); } @@ -159,7 +162,7 @@ fn invulnerable_limit_works() { fn remove_invulnerable_works() { new_test_ext().execute_with(|| { initialize_to_block(1); - assert_eq!(CollatorSelection::invulnerables(), vec![1, 2]); + assert_eq!(Invulnerables::::get(), vec![1, 2]); assert_ok!(CollatorSelection::add_invulnerable( RuntimeOrigin::signed(RootAccount::get()), @@ -170,7 +173,7 @@ fn remove_invulnerable_works() { 3 )); - assert_eq!(CollatorSelection::invulnerables(), vec![1, 2, 3, 4]); + assert_eq!(Invulnerables::::get(), vec![1, 2, 3, 4]); assert_ok!(CollatorSelection::remove_invulnerable( RuntimeOrigin::signed(RootAccount::get()), @@ -180,7 +183,7 @@ fn remove_invulnerable_works() { System::assert_last_event(RuntimeEvent::CollatorSelection( crate::Event::InvulnerableRemoved { account_id: 2 }, )); - assert_eq!(CollatorSelection::invulnerables(), vec![1, 3, 4]); + assert_eq!(Invulnerables::::get(), vec![1, 3, 4]); // cannot remove invulnerable not in the list assert_noop!( @@ -200,11 +203,11 @@ fn remove_invulnerable_works() { fn candidate_to_invulnerable_works() { new_test_ext().execute_with(|| { initialize_to_block(1); - assert_eq!(CollatorSelection::desired_candidates(), 2); - assert_eq!(CollatorSelection::candidacy_bond(), 10); + assert_eq!(DesiredCandidates::::get(), 2); + assert_eq!(CandidacyBond::::get(), 10); - assert_eq!(>::get().iter().count(), 0); - assert_eq!(CollatorSelection::invulnerables(), vec![1, 2]); + assert_eq!(CandidateList::::get().iter().count(), 0); + assert_eq!(Invulnerables::::get(), vec![1, 2]); assert_eq!(Balances::free_balance(3), 100); assert_eq!(Balances::free_balance(4), 100); @@ -225,9 +228,9 @@ fn candidate_to_invulnerable_works() { System::assert_has_event(RuntimeEvent::CollatorSelection( crate::Event::InvulnerableAdded { account_id: 3 }, )); - assert!(CollatorSelection::invulnerables().to_vec().contains(&3)); + assert!(Invulnerables::::get().to_vec().contains(&3)); assert_eq!(Balances::free_balance(3), 100); - assert_eq!(>::get().iter().count(), 1); + assert_eq!(CandidateList::::get().iter().count(), 1); assert_ok!(CollatorSelection::add_invulnerable( RuntimeOrigin::signed(RootAccount::get()), @@ -239,10 +242,10 @@ fn candidate_to_invulnerable_works() { System::assert_has_event(RuntimeEvent::CollatorSelection( crate::Event::InvulnerableAdded { account_id: 4 }, )); - assert!(CollatorSelection::invulnerables().to_vec().contains(&4)); + assert!(Invulnerables::::get().to_vec().contains(&4)); assert_eq!(Balances::free_balance(4), 100); - assert_eq!(>::get().iter().count(), 0); + assert_eq!(CandidateList::::get().iter().count(), 0); }); } @@ -250,14 +253,14 @@ fn candidate_to_invulnerable_works() { fn set_desired_candidates_works() { new_test_ext().execute_with(|| { // given - assert_eq!(CollatorSelection::desired_candidates(), 2); + assert_eq!(DesiredCandidates::::get(), 2); // can set assert_ok!(CollatorSelection::set_desired_candidates( RuntimeOrigin::signed(RootAccount::get()), 7 )); - assert_eq!(CollatorSelection::desired_candidates(), 7); + assert_eq!(DesiredCandidates::::get(), 7); // rejects bad origin assert_noop!( @@ -271,16 +274,16 @@ fn set_desired_candidates_works() { fn set_candidacy_bond_empty_candidate_list() { new_test_ext().execute_with(|| { // given - assert_eq!(CollatorSelection::candidacy_bond(), 10); - assert!(>::get().is_empty()); + assert_eq!(CandidacyBond::::get(), 10); + assert!(CandidateList::::get().is_empty()); // can decrease without candidates assert_ok!(CollatorSelection::set_candidacy_bond( RuntimeOrigin::signed(RootAccount::get()), 7 )); - assert_eq!(CollatorSelection::candidacy_bond(), 7); - assert!(>::get().is_empty()); + assert_eq!(CandidacyBond::::get(), 7); + assert!(CandidateList::::get().is_empty()); // rejects bad origin. assert_noop!(CollatorSelection::set_candidacy_bond(RuntimeOrigin::signed(1), 8), BadOrigin); @@ -290,8 +293,8 @@ fn set_candidacy_bond_empty_candidate_list() { RuntimeOrigin::signed(RootAccount::get()), 20 )); - assert!(>::get().is_empty()); - assert_eq!(CollatorSelection::candidacy_bond(), 20); + assert!(CandidateList::::get().is_empty()); + assert_eq!(CandidacyBond::::get(), 20); }); } @@ -299,36 +302,36 @@ fn set_candidacy_bond_empty_candidate_list() { fn set_candidacy_bond_with_one_candidate() { new_test_ext().execute_with(|| { // given - assert_eq!(CollatorSelection::candidacy_bond(), 10); - assert!(>::get().is_empty()); + assert_eq!(CandidacyBond::::get(), 10); + assert!(CandidateList::::get().is_empty()); let candidate_3 = CandidateInfo { who: 3, deposit: 10 }; assert_ok!(CollatorSelection::register_as_candidate(RuntimeOrigin::signed(3))); - assert_eq!(>::get(), vec![candidate_3.clone()]); + assert_eq!(CandidateList::::get(), vec![candidate_3.clone()]); // can decrease with one candidate assert_ok!(CollatorSelection::set_candidacy_bond( RuntimeOrigin::signed(RootAccount::get()), 7 )); - assert_eq!(CollatorSelection::candidacy_bond(), 7); - assert_eq!(>::get(), vec![candidate_3.clone()]); + assert_eq!(CandidacyBond::::get(), 7); + assert_eq!(CandidateList::::get(), vec![candidate_3.clone()]); // can increase up to initial deposit assert_ok!(CollatorSelection::set_candidacy_bond( RuntimeOrigin::signed(RootAccount::get()), 10 )); - assert_eq!(CollatorSelection::candidacy_bond(), 10); - assert_eq!(>::get(), vec![candidate_3.clone()]); + assert_eq!(CandidacyBond::::get(), 10); + assert_eq!(CandidateList::::get(), vec![candidate_3.clone()]); // can increase past initial deposit, should kick existing candidate assert_ok!(CollatorSelection::set_candidacy_bond( RuntimeOrigin::signed(RootAccount::get()), 20 )); - assert!(>::get().is_empty()); + assert!(CandidateList::::get().is_empty()); }); } @@ -336,8 +339,8 @@ fn set_candidacy_bond_with_one_candidate() { fn set_candidacy_bond_with_many_candidates_same_deposit() { new_test_ext().execute_with(|| { // given - assert_eq!(CollatorSelection::candidacy_bond(), 10); - assert!(>::get().is_empty()); + assert_eq!(CandidacyBond::::get(), 10); + assert!(CandidateList::::get().is_empty()); let candidate_3 = CandidateInfo { who: 3, deposit: 10 }; let candidate_4 = CandidateInfo { who: 4, deposit: 10 }; @@ -347,7 +350,7 @@ fn set_candidacy_bond_with_many_candidates_same_deposit() { assert_ok!(CollatorSelection::register_as_candidate(RuntimeOrigin::signed(4))); assert_ok!(CollatorSelection::register_as_candidate(RuntimeOrigin::signed(5))); assert_eq!( - >::get(), + CandidateList::::get(), vec![candidate_5.clone(), candidate_4.clone(), candidate_3.clone()] ); @@ -356,9 +359,9 @@ fn set_candidacy_bond_with_many_candidates_same_deposit() { RuntimeOrigin::signed(RootAccount::get()), 7 )); - assert_eq!(CollatorSelection::candidacy_bond(), 7); + assert_eq!(CandidacyBond::::get(), 7); assert_eq!( - >::get(), + CandidateList::::get(), vec![candidate_5.clone(), candidate_4.clone(), candidate_3.clone()] ); @@ -367,9 +370,9 @@ fn set_candidacy_bond_with_many_candidates_same_deposit() { RuntimeOrigin::signed(RootAccount::get()), 10 )); - assert_eq!(CollatorSelection::candidacy_bond(), 10); + assert_eq!(CandidacyBond::::get(), 10); assert_eq!( - >::get(), + CandidateList::::get(), vec![candidate_5.clone(), candidate_4.clone(), candidate_3.clone()] ); @@ -378,7 +381,7 @@ fn set_candidacy_bond_with_many_candidates_same_deposit() { RuntimeOrigin::signed(RootAccount::get()), 20 )); - assert!(>::get().is_empty()); + assert!(CandidateList::::get().is_empty()); }); } @@ -386,8 +389,8 @@ fn set_candidacy_bond_with_many_candidates_same_deposit() { fn set_candidacy_bond_with_many_candidates_different_deposits() { new_test_ext().execute_with(|| { // given - assert_eq!(CollatorSelection::candidacy_bond(), 10); - assert!(>::get().is_empty()); + assert_eq!(CandidacyBond::::get(), 10); + assert!(CandidateList::::get().is_empty()); let candidate_3 = CandidateInfo { who: 3, deposit: 10 }; let candidate_4 = CandidateInfo { who: 4, deposit: 20 }; @@ -399,7 +402,7 @@ fn set_candidacy_bond_with_many_candidates_different_deposits() { assert_ok!(CollatorSelection::update_bond(RuntimeOrigin::signed(5), 30)); assert_ok!(CollatorSelection::update_bond(RuntimeOrigin::signed(4), 20)); assert_eq!( - >::get(), + CandidateList::::get(), vec![candidate_3.clone(), candidate_4.clone(), candidate_5.clone()] ); @@ -408,9 +411,9 @@ fn set_candidacy_bond_with_many_candidates_different_deposits() { RuntimeOrigin::signed(RootAccount::get()), 7 )); - assert_eq!(CollatorSelection::candidacy_bond(), 7); + assert_eq!(CandidacyBond::::get(), 7); assert_eq!( - >::get(), + CandidateList::::get(), vec![candidate_3.clone(), candidate_4.clone(), candidate_5.clone()] ); // can increase up to initial deposit @@ -418,9 +421,9 @@ fn set_candidacy_bond_with_many_candidates_different_deposits() { RuntimeOrigin::signed(RootAccount::get()), 10 )); - assert_eq!(CollatorSelection::candidacy_bond(), 10); + assert_eq!(CandidacyBond::::get(), 10); assert_eq!( - >::get(), + CandidateList::::get(), vec![candidate_3.clone(), candidate_4.clone(), candidate_5.clone()] ); @@ -429,27 +432,24 @@ fn set_candidacy_bond_with_many_candidates_different_deposits() { RuntimeOrigin::signed(RootAccount::get()), 20 )); - assert_eq!(CollatorSelection::candidacy_bond(), 20); - assert_eq!( - >::get(), - vec![candidate_4.clone(), candidate_5.clone()] - ); + assert_eq!(CandidacyBond::::get(), 20); + assert_eq!(CandidateList::::get(), vec![candidate_4.clone(), candidate_5.clone()]); // can increase past 4's deposit, should kick 4 assert_ok!(CollatorSelection::set_candidacy_bond( RuntimeOrigin::signed(RootAccount::get()), 25 )); - assert_eq!(CollatorSelection::candidacy_bond(), 25); - assert_eq!(>::get(), vec![candidate_5.clone()]); + assert_eq!(CandidacyBond::::get(), 25); + assert_eq!(CandidateList::::get(), vec![candidate_5.clone()]); // lowering the minimum deposit should have no effect assert_ok!(CollatorSelection::set_candidacy_bond( RuntimeOrigin::signed(RootAccount::get()), 5 )); - assert_eq!(CollatorSelection::candidacy_bond(), 5); - assert_eq!(>::get(), vec![candidate_5.clone()]); + assert_eq!(CandidacyBond::::get(), 5); + assert_eq!(CandidateList::::get(), vec![candidate_5.clone()]); // add 3 and 4 back but with higher deposits than minimum assert_ok!(CollatorSelection::register_as_candidate(RuntimeOrigin::signed(3))); @@ -457,7 +457,7 @@ fn set_candidacy_bond_with_many_candidates_different_deposits() { assert_ok!(CollatorSelection::update_bond(RuntimeOrigin::signed(3), 10)); assert_ok!(CollatorSelection::update_bond(RuntimeOrigin::signed(4), 20)); assert_eq!( - >::get(), + CandidateList::::get(), vec![candidate_3.clone(), candidate_4.clone(), candidate_5.clone()] ); @@ -467,8 +467,8 @@ fn set_candidacy_bond_with_many_candidates_different_deposits() { RuntimeOrigin::signed(RootAccount::get()), 40 )); - assert_eq!(CollatorSelection::candidacy_bond(), 40); - assert!(>::get().is_empty()); + assert_eq!(CandidacyBond::::get(), 40); + assert!(CandidateList::::get().is_empty()); }); } @@ -500,8 +500,8 @@ fn cannot_register_candidate_if_too_many() { #[test] fn cannot_unregister_candidate_if_too_few() { new_test_ext().execute_with(|| { - assert_eq!(>::get().iter().count(), 0); - assert_eq!(CollatorSelection::invulnerables(), vec![1, 2]); + assert_eq!(CandidateList::::get().iter().count(), 0); + assert_eq!(Invulnerables::::get(), vec![1, 2]); assert_ok!(CollatorSelection::remove_invulnerable( RuntimeOrigin::signed(RootAccount::get()), 1 @@ -532,7 +532,7 @@ fn cannot_unregister_candidate_if_too_few() { #[test] fn cannot_register_as_candidate_if_invulnerable() { new_test_ext().execute_with(|| { - assert_eq!(CollatorSelection::invulnerables(), vec![1, 2]); + assert_eq!(Invulnerables::::get(), vec![1, 2]); // can't 1 because it is invulnerable. assert_noop!( @@ -561,10 +561,10 @@ fn cannot_register_dupe_candidate() { // tuple of (id, deposit). let addition = CandidateInfo { who: 3, deposit: 10 }; assert_eq!( - >::get().iter().cloned().collect::>(), + CandidateList::::get().iter().cloned().collect::>(), vec![addition] ); - assert_eq!(CollatorSelection::last_authored_block(3), 10); + assert_eq!(LastAuthoredBlock::::get(3), 10); assert_eq!(Balances::free_balance(3), 90); // but no more @@ -596,11 +596,11 @@ fn cannot_register_as_candidate_if_poor() { fn register_as_candidate_works() { new_test_ext().execute_with(|| { // given - assert_eq!(CollatorSelection::desired_candidates(), 2); - assert_eq!(CollatorSelection::candidacy_bond(), 10); + assert_eq!(DesiredCandidates::::get(), 2); + assert_eq!(CandidacyBond::::get(), 10); - assert_eq!(>::get().iter().count(), 0); - assert_eq!(CollatorSelection::invulnerables(), vec![1, 2]); + assert_eq!(CandidateList::::get().iter().count(), 0); + assert_eq!(Invulnerables::::get(), vec![1, 2]); // take two endowed, non-invulnerables accounts. assert_eq!(Balances::free_balance(3), 100); @@ -612,14 +612,14 @@ fn register_as_candidate_works() { assert_eq!(Balances::free_balance(3), 90); assert_eq!(Balances::free_balance(4), 90); - assert_eq!(>::get().iter().count(), 2); + assert_eq!(CandidateList::::get().iter().count(), 2); }); } #[test] fn cannot_take_candidate_slot_if_invulnerable() { new_test_ext().execute_with(|| { - assert_eq!(CollatorSelection::invulnerables(), vec![1, 2]); + assert_eq!(Invulnerables::::get(), vec![1, 2]); // can't 1 because it is invulnerable. assert_noop!( @@ -649,11 +649,10 @@ fn cannot_take_candidate_slot_if_duplicate() { // tuple of (id, deposit). let candidate_3 = CandidateInfo { who: 3, deposit: 10 }; let candidate_4 = CandidateInfo { who: 4, deposit: 10 }; - let actual_candidates = - >::get().iter().cloned().collect::>(); + let actual_candidates = CandidateList::::get().iter().cloned().collect::>(); assert_eq!(actual_candidates, vec![candidate_4, candidate_3]); - assert_eq!(CollatorSelection::last_authored_block(3), 10); - assert_eq!(CollatorSelection::last_authored_block(4), 10); + assert_eq!(LastAuthoredBlock::::get(3), 10); + assert_eq!(LastAuthoredBlock::::get(4), 10); assert_eq!(Balances::free_balance(3), 90); // but no more @@ -672,10 +671,10 @@ fn cannot_take_candidate_slot_if_target_invalid() { // tuple of (id, deposit). let candidate_3 = CandidateInfo { who: 3, deposit: 10 }; assert_eq!( - >::get().iter().cloned().collect::>(), + CandidateList::::get().iter().cloned().collect::>(), vec![candidate_3] ); - assert_eq!(CollatorSelection::last_authored_block(3), 10); + assert_eq!(LastAuthoredBlock::::get(3), 10); assert_eq!(Balances::free_balance(3), 90); assert_eq!(Balances::free_balance(4), 100); @@ -744,11 +743,11 @@ fn cannot_take_candidate_slot_if_deposit_less_than_target() { fn take_candidate_slot_works() { new_test_ext().execute_with(|| { // given - assert_eq!(CollatorSelection::desired_candidates(), 2); - assert_eq!(CollatorSelection::candidacy_bond(), 10); + assert_eq!(DesiredCandidates::::get(), 2); + assert_eq!(CandidacyBond::::get(), 10); - assert_eq!(>::get().iter().count(), 0); - assert_eq!(CollatorSelection::invulnerables(), vec![1, 2]); + assert_eq!(CandidateList::::get().iter().count(), 0); + assert_eq!(Invulnerables::::get(), vec![1, 2]); // take two endowed, non-invulnerables accounts. assert_eq!(Balances::free_balance(3), 100); @@ -763,7 +762,7 @@ fn take_candidate_slot_works() { assert_eq!(Balances::free_balance(4), 90); assert_eq!(Balances::free_balance(5), 90); - assert_eq!(>::get().iter().count(), 3); + assert_eq!(CandidateList::::get().iter().count(), 3); Balances::make_free_balance_be(&6, 100); let key = MockSessionKeys { aura: UintAuthorityId(6) }; @@ -785,10 +784,10 @@ fn take_candidate_slot_works() { let candidate_6 = CandidateInfo { who: 6, deposit: 50 }; let candidate_5 = CandidateInfo { who: 5, deposit: 10 }; let mut actual_candidates = - >::get().iter().cloned().collect::>(); + CandidateList::::get().iter().cloned().collect::>(); actual_candidates.sort_by(|info_1, info_2| info_1.deposit.cmp(&info_2.deposit)); assert_eq!( - >::get().iter().cloned().collect::>(), + CandidateList::::get().iter().cloned().collect::>(), vec![candidate_5, candidate_3, candidate_6] ); }); @@ -798,11 +797,11 @@ fn take_candidate_slot_works() { fn increase_candidacy_bond_non_candidate_account() { new_test_ext().execute_with(|| { // given - assert_eq!(CollatorSelection::desired_candidates(), 2); - assert_eq!(CollatorSelection::candidacy_bond(), 10); + assert_eq!(DesiredCandidates::::get(), 2); + assert_eq!(CandidacyBond::::get(), 10); - assert_eq!(>::get().iter().count(), 0); - assert_eq!(CollatorSelection::invulnerables(), vec![1, 2]); + assert_eq!(CandidateList::::get().iter().count(), 0); + assert_eq!(Invulnerables::::get(), vec![1, 2]); assert_ok!(CollatorSelection::register_as_candidate(RuntimeOrigin::signed(3))); assert_ok!(CollatorSelection::register_as_candidate(RuntimeOrigin::signed(4))); @@ -818,11 +817,11 @@ fn increase_candidacy_bond_non_candidate_account() { fn increase_candidacy_bond_insufficient_balance() { new_test_ext().execute_with(|| { // given - assert_eq!(CollatorSelection::desired_candidates(), 2); - assert_eq!(CollatorSelection::candidacy_bond(), 10); + assert_eq!(DesiredCandidates::::get(), 2); + assert_eq!(CandidacyBond::::get(), 10); - assert_eq!(>::get().iter().count(), 0); - assert_eq!(CollatorSelection::invulnerables(), vec![1, 2]); + assert_eq!(CandidateList::::get().iter().count(), 0); + assert_eq!(Invulnerables::::get(), vec![1, 2]); // take two endowed, non-invulnerables accounts. assert_eq!(Balances::free_balance(3), 100); @@ -850,11 +849,11 @@ fn increase_candidacy_bond_insufficient_balance() { fn increase_candidacy_bond_works() { new_test_ext().execute_with(|| { // given - assert_eq!(CollatorSelection::desired_candidates(), 2); - assert_eq!(CollatorSelection::candidacy_bond(), 10); + assert_eq!(DesiredCandidates::::get(), 2); + assert_eq!(CandidacyBond::::get(), 10); - assert_eq!(>::get().iter().count(), 0); - assert_eq!(CollatorSelection::invulnerables(), vec![1, 2]); + assert_eq!(CandidateList::::get().iter().count(), 0); + assert_eq!(Invulnerables::::get(), vec![1, 2]); // take three endowed, non-invulnerables accounts. assert_eq!(Balances::free_balance(3), 100); @@ -873,7 +872,7 @@ fn increase_candidacy_bond_works() { assert_ok!(CollatorSelection::update_bond(RuntimeOrigin::signed(4), 30)); assert_ok!(CollatorSelection::update_bond(RuntimeOrigin::signed(5), 40)); - assert_eq!(>::get().iter().count(), 3); + assert_eq!(CandidateList::::get().iter().count(), 3); assert_eq!(Balances::free_balance(3), 80); assert_eq!(Balances::free_balance(4), 70); assert_eq!(Balances::free_balance(5), 60); @@ -881,7 +880,7 @@ fn increase_candidacy_bond_works() { assert_ok!(CollatorSelection::update_bond(RuntimeOrigin::signed(3), 40)); assert_ok!(CollatorSelection::update_bond(RuntimeOrigin::signed(4), 60)); - assert_eq!(>::get().iter().count(), 3); + assert_eq!(CandidateList::::get().iter().count(), 3); assert_eq!(Balances::free_balance(3), 60); assert_eq!(Balances::free_balance(4), 40); assert_eq!(Balances::free_balance(5), 60); @@ -892,11 +891,11 @@ fn increase_candidacy_bond_works() { fn decrease_candidacy_bond_non_candidate_account() { new_test_ext().execute_with(|| { // given - assert_eq!(CollatorSelection::desired_candidates(), 2); - assert_eq!(CollatorSelection::candidacy_bond(), 10); + assert_eq!(DesiredCandidates::::get(), 2); + assert_eq!(CandidacyBond::::get(), 10); - assert_eq!(>::get().iter().count(), 0); - assert_eq!(CollatorSelection::invulnerables(), vec![1, 2]); + assert_eq!(CandidateList::::get().iter().count(), 0); + assert_eq!(Invulnerables::::get(), vec![1, 2]); assert_ok!(CollatorSelection::register_as_candidate(RuntimeOrigin::signed(3))); assert_ok!(CollatorSelection::register_as_candidate(RuntimeOrigin::signed(4))); @@ -914,11 +913,11 @@ fn decrease_candidacy_bond_non_candidate_account() { fn decrease_candidacy_bond_insufficient_funds() { new_test_ext().execute_with(|| { // given - assert_eq!(CollatorSelection::desired_candidates(), 2); - assert_eq!(CollatorSelection::candidacy_bond(), 10); + assert_eq!(DesiredCandidates::::get(), 2); + assert_eq!(CandidacyBond::::get(), 10); - assert_eq!(>::get().iter().count(), 0); - assert_eq!(CollatorSelection::invulnerables(), vec![1, 2]); + assert_eq!(CandidateList::::get().iter().count(), 0); + assert_eq!(Invulnerables::::get(), vec![1, 2]); // take two endowed, non-invulnerables accounts. assert_eq!(Balances::free_balance(3), 100); @@ -961,7 +960,7 @@ fn decrease_candidacy_bond_insufficient_funds() { #[test] fn decrease_candidacy_bond_occupying_top_slot() { new_test_ext().execute_with(|| { - assert_eq!(CollatorSelection::desired_candidates(), 2); + assert_eq!(DesiredCandidates::::get(), 2); // Register 3 candidates. assert_ok!(CollatorSelection::register_as_candidate(RuntimeOrigin::signed(3))); assert_ok!(CollatorSelection::register_as_candidate(RuntimeOrigin::signed(4))); @@ -976,7 +975,7 @@ fn decrease_candidacy_bond_occupying_top_slot() { let candidate_4 = CandidateInfo { who: 4, deposit: 30 }; let candidate_5 = CandidateInfo { who: 5, deposit: 60 }; assert_eq!( - >::get().iter().cloned().collect::>(), + CandidateList::::get().iter().cloned().collect::>(), vec![candidate_4, candidate_3, candidate_5] ); @@ -1000,7 +999,7 @@ fn decrease_candidacy_bond_occupying_top_slot() { let candidate_4 = CandidateInfo { who: 4, deposit: 35 }; let candidate_5 = CandidateInfo { who: 5, deposit: 60 }; assert_eq!( - >::get().iter().cloned().collect::>(), + CandidateList::::get().iter().cloned().collect::>(), vec![candidate_3, candidate_4, candidate_5] ); @@ -1023,11 +1022,11 @@ fn decrease_candidacy_bond_occupying_top_slot() { fn decrease_candidacy_bond_works() { new_test_ext().execute_with(|| { // given - assert_eq!(CollatorSelection::desired_candidates(), 2); - assert_eq!(CollatorSelection::candidacy_bond(), 10); + assert_eq!(DesiredCandidates::::get(), 2); + assert_eq!(CandidacyBond::::get(), 10); - assert_eq!(>::get().iter().count(), 0); - assert_eq!(CollatorSelection::invulnerables(), vec![1, 2]); + assert_eq!(CandidateList::::get().iter().count(), 0); + assert_eq!(Invulnerables::::get(), vec![1, 2]); // take three endowed, non-invulnerables accounts. assert_eq!(Balances::free_balance(3), 100); @@ -1046,14 +1045,14 @@ fn decrease_candidacy_bond_works() { assert_ok!(CollatorSelection::update_bond(RuntimeOrigin::signed(4), 30)); assert_ok!(CollatorSelection::update_bond(RuntimeOrigin::signed(5), 40)); - assert_eq!(>::get().iter().count(), 3); + assert_eq!(CandidateList::::get().iter().count(), 3); assert_eq!(Balances::free_balance(3), 80); assert_eq!(Balances::free_balance(4), 70); assert_eq!(Balances::free_balance(5), 60); assert_ok!(CollatorSelection::update_bond(RuntimeOrigin::signed(3), 10)); - assert_eq!(>::get().iter().count(), 3); + assert_eq!(CandidateList::::get().iter().count(), 3); assert_eq!(Balances::free_balance(3), 90); assert_eq!(Balances::free_balance(4), 70); assert_eq!(Balances::free_balance(5), 60); @@ -1064,11 +1063,11 @@ fn decrease_candidacy_bond_works() { fn update_candidacy_bond_with_identical_amount() { new_test_ext().execute_with(|| { // given - assert_eq!(CollatorSelection::desired_candidates(), 2); - assert_eq!(CollatorSelection::candidacy_bond(), 10); + assert_eq!(DesiredCandidates::::get(), 2); + assert_eq!(CandidacyBond::::get(), 10); - assert_eq!(>::get().iter().count(), 0); - assert_eq!(CollatorSelection::invulnerables(), vec![1, 2]); + assert_eq!(CandidateList::::get().iter().count(), 0); + assert_eq!(Invulnerables::::get(), vec![1, 2]); // take three endowed, non-invulnerables accounts. assert_eq!(Balances::free_balance(3), 100); @@ -1087,7 +1086,7 @@ fn update_candidacy_bond_with_identical_amount() { assert_ok!(CollatorSelection::update_bond(RuntimeOrigin::signed(4), 30)); assert_ok!(CollatorSelection::update_bond(RuntimeOrigin::signed(5), 40)); - assert_eq!(>::get().iter().count(), 3); + assert_eq!(CandidateList::::get().iter().count(), 3); assert_eq!(Balances::free_balance(3), 80); assert_eq!(Balances::free_balance(4), 70); assert_eq!(Balances::free_balance(5), 60); @@ -1104,11 +1103,11 @@ fn update_candidacy_bond_with_identical_amount() { fn candidate_list_works() { new_test_ext().execute_with(|| { // given - assert_eq!(CollatorSelection::desired_candidates(), 2); - assert_eq!(CollatorSelection::candidacy_bond(), 10); + assert_eq!(DesiredCandidates::::get(), 2); + assert_eq!(CandidacyBond::::get(), 10); - assert_eq!(>::get().iter().count(), 0); - assert_eq!(CollatorSelection::invulnerables(), vec![1, 2]); + assert_eq!(CandidateList::::get().iter().count(), 0); + assert_eq!(Invulnerables::::get(), vec![1, 2]); // take three endowed, non-invulnerables accounts. assert_eq!(Balances::free_balance(3), 100); @@ -1131,7 +1130,7 @@ fn candidate_list_works() { let candidate_4 = CandidateInfo { who: 4, deposit: 25 }; let candidate_5 = CandidateInfo { who: 5, deposit: 10 }; assert_eq!( - >::get().iter().cloned().collect::>(), + CandidateList::::get().iter().cloned().collect::>(), vec![candidate_5, candidate_4, candidate_3] ); }); @@ -1157,7 +1156,7 @@ fn leave_intent() { // bond is returned assert_ok!(CollatorSelection::leave_intent(RuntimeOrigin::signed(3))); assert_eq!(Balances::free_balance(3), 100); - assert_eq!(CollatorSelection::last_authored_block(3), 0); + assert_eq!(LastAuthoredBlock::::get(3), 0); }); } @@ -1177,10 +1176,10 @@ fn authorship_event_handler() { let collator = CandidateInfo { who: 4, deposit: 10 }; assert_eq!( - >::get().iter().cloned().collect::>(), + CandidateList::::get().iter().cloned().collect::>(), vec![collator] ); - assert_eq!(CollatorSelection::last_authored_block(4), 0); + assert_eq!(LastAuthoredBlock::::get(4), 0); // half of the pot goes to the collator who's the author (4 in tests). assert_eq!(Balances::free_balance(4), 140); @@ -1206,10 +1205,10 @@ fn fees_edgecases() { let collator = CandidateInfo { who: 4, deposit: 10 }; assert_eq!( - >::get().iter().cloned().collect::>(), + CandidateList::::get().iter().cloned().collect::>(), vec![collator] ); - assert_eq!(CollatorSelection::last_authored_block(4), 0); + assert_eq!(LastAuthoredBlock::::get(4), 0); // Nothing received assert_eq!(Balances::free_balance(4), 90); // all fee stays @@ -1236,7 +1235,7 @@ fn session_management_single_candidate() { // session won't see this. assert_eq!(SessionHandlerCollators::get(), vec![1, 2]); // but we have a new candidate. - assert_eq!(>::get().iter().count(), 1); + assert_eq!(CandidateList::::get().iter().count(), 1); initialize_to_block(10); assert_eq!(SessionChangeBlock::get(), 10); @@ -1274,7 +1273,7 @@ fn session_management_max_candidates() { // session won't see this. assert_eq!(SessionHandlerCollators::get(), vec![1, 2]); // but we have a new candidate. - assert_eq!(>::get().iter().count(), 3); + assert_eq!(CandidateList::::get().iter().count(), 3); initialize_to_block(10); assert_eq!(SessionChangeBlock::get(), 10); @@ -1313,7 +1312,7 @@ fn session_management_increase_bid_with_list_update() { // session won't see this. assert_eq!(SessionHandlerCollators::get(), vec![1, 2]); // but we have a new candidate. - assert_eq!(>::get().iter().count(), 3); + assert_eq!(CandidateList::::get().iter().count(), 3); initialize_to_block(10); assert_eq!(SessionChangeBlock::get(), 10); @@ -1352,7 +1351,7 @@ fn session_management_candidate_list_eager_sort() { // session won't see this. assert_eq!(SessionHandlerCollators::get(), vec![1, 2]); // but we have a new candidate. - assert_eq!(>::get().iter().count(), 3); + assert_eq!(CandidateList::::get().iter().count(), 3); initialize_to_block(10); assert_eq!(SessionChangeBlock::get(), 10); @@ -1399,7 +1398,7 @@ fn session_management_reciprocal_outbidding() { // session won't see this. assert_eq!(SessionHandlerCollators::get(), vec![1, 2]); // but we have a new candidate. - assert_eq!(>::get().iter().count(), 3); + assert_eq!(CandidateList::::get().iter().count(), 3); initialize_to_block(10); assert_eq!(SessionChangeBlock::get(), 10); @@ -1451,7 +1450,7 @@ fn session_management_decrease_bid_after_auction() { // session won't see this. assert_eq!(SessionHandlerCollators::get(), vec![1, 2]); // but we have a new candidate. - assert_eq!(>::get().iter().count(), 3); + assert_eq!(CandidateList::::get().iter().count(), 3); initialize_to_block(10); assert_eq!(SessionChangeBlock::get(), 10); @@ -1476,20 +1475,20 @@ fn kick_mechanism() { assert_ok!(CollatorSelection::register_as_candidate(RuntimeOrigin::signed(3))); assert_ok!(CollatorSelection::register_as_candidate(RuntimeOrigin::signed(4))); initialize_to_block(10); - assert_eq!(>::get().iter().count(), 2); + assert_eq!(CandidateList::::get().iter().count(), 2); initialize_to_block(20); assert_eq!(SessionChangeBlock::get(), 20); // 4 authored this block, gets to stay 3 was kicked - assert_eq!(>::get().iter().count(), 1); + assert_eq!(CandidateList::::get().iter().count(), 1); // 3 will be kicked after 1 session delay assert_eq!(SessionHandlerCollators::get(), vec![1, 2, 3, 4]); // tuple of (id, deposit). let collator = CandidateInfo { who: 4, deposit: 10 }; assert_eq!( - >::get().iter().cloned().collect::>(), + CandidateList::::get().iter().cloned().collect::>(), vec![collator] ); - assert_eq!(CollatorSelection::last_authored_block(4), 20); + assert_eq!(LastAuthoredBlock::::get(4), 20); initialize_to_block(30); // 3 gets kicked after 1 session delay assert_eq!(SessionHandlerCollators::get(), vec![1, 2, 4]); @@ -1503,8 +1502,8 @@ fn should_not_kick_mechanism_too_few() { new_test_ext().execute_with(|| { // remove the invulnerables and add new collators 3 and 5 - assert_eq!(>::get().iter().count(), 0); - assert_eq!(CollatorSelection::invulnerables(), vec![1, 2]); + assert_eq!(CandidateList::::get().iter().count(), 0); + assert_eq!(Invulnerables::::get(), vec![1, 2]); assert_ok!(CollatorSelection::remove_invulnerable( RuntimeOrigin::signed(RootAccount::get()), 1 @@ -1517,21 +1516,21 @@ fn should_not_kick_mechanism_too_few() { )); initialize_to_block(10); - assert_eq!(>::get().iter().count(), 2); + assert_eq!(CandidateList::::get().iter().count(), 2); initialize_to_block(20); assert_eq!(SessionChangeBlock::get(), 20); // 4 authored this block, 3 is kicked, 5 stays because of too few collators - assert_eq!(>::get().iter().count(), 1); + assert_eq!(CandidateList::::get().iter().count(), 1); // 3 will be kicked after 1 session delay assert_eq!(SessionHandlerCollators::get(), vec![3, 5]); // tuple of (id, deposit). let collator = CandidateInfo { who: 3, deposit: 10 }; assert_eq!( - >::get().iter().cloned().collect::>(), + CandidateList::::get().iter().cloned().collect::>(), vec![collator] ); - assert_eq!(CollatorSelection::last_authored_block(4), 20); + assert_eq!(LastAuthoredBlock::::get(4), 20); initialize_to_block(30); // 3 gets kicked after 1 session delay @@ -1544,7 +1543,7 @@ fn should_not_kick_mechanism_too_few() { #[test] fn should_kick_invulnerables_from_candidates_on_session_change() { new_test_ext().execute_with(|| { - assert_eq!(>::get().iter().count(), 0); + assert_eq!(CandidateList::::get().iter().count(), 0); assert_ok!(CollatorSelection::register_as_candidate(RuntimeOrigin::signed(3))); assert_ok!(CollatorSelection::register_as_candidate(RuntimeOrigin::signed(4))); assert_eq!(Balances::free_balance(3), 90); @@ -1558,20 +1557,19 @@ fn should_kick_invulnerables_from_candidates_on_session_change() { let collator_3 = CandidateInfo { who: 3, deposit: 10 }; let collator_4 = CandidateInfo { who: 4, deposit: 10 }; - let actual_candidates = - >::get().iter().cloned().collect::>(); + let actual_candidates = CandidateList::::get().iter().cloned().collect::>(); assert_eq!(actual_candidates, vec![collator_4.clone(), collator_3]); - assert_eq!(CollatorSelection::invulnerables(), vec![1, 2, 3]); + assert_eq!(Invulnerables::::get(), vec![1, 2, 3]); // session change initialize_to_block(10); // 3 is removed from candidates assert_eq!( - >::get().iter().cloned().collect::>(), + CandidateList::::get().iter().cloned().collect::>(), vec![collator_4] ); // but not from invulnerables - assert_eq!(CollatorSelection::invulnerables(), vec![1, 2, 3]); + assert_eq!(Invulnerables::::get(), vec![1, 2, 3]); // and it got its deposit back assert_eq!(Balances::free_balance(3), 100); }); diff --git a/cumulus/pallets/dmp-queue/Cargo.toml b/cumulus/pallets/dmp-queue/Cargo.toml index 301a77003cb6a08c2cac2c1feec48fe333959bb1..b2b24aeed72ba28ea320a90b8e725ce983fa1a07 100644 --- a/cumulus/pallets/dmp-queue/Cargo.toml +++ b/cumulus/pallets/dmp-queue/Cargo.toml @@ -15,8 +15,8 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -log = { version = "0.4.20", default-features = false } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +log = { workspace = true } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } frame-benchmarking = { path = "../../../substrate/frame/benchmarking", default-features = false, optional = true } frame-support = { path = "../../../substrate/frame/support", default-features = false } diff --git a/cumulus/pallets/dmp-queue/src/mock.rs b/cumulus/pallets/dmp-queue/src/mock.rs index 6bd74a047eb7459b309705d5f4d5a7d2e1e775f4..ed72ce678e3efa416df78b95f18c0115c91e2e1f 100644 --- a/cumulus/pallets/dmp-queue/src/mock.rs +++ b/cumulus/pallets/dmp-queue/src/mock.rs @@ -35,7 +35,7 @@ frame_support::construct_runtime!( } ); -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Runtime { type Block = Block; type RuntimeOrigin = RuntimeOrigin; diff --git a/cumulus/pallets/parachain-system/Cargo.toml b/cumulus/pallets/parachain-system/Cargo.toml index 848efd3eab67c1b02473e6d0a62e75efcac16f35..cc2e8943caad529ec05d6daa82598dc4c210aeee 100644 --- a/cumulus/pallets/parachain-system/Cargo.toml +++ b/cumulus/pallets/parachain-system/Cargo.toml @@ -14,9 +14,9 @@ bytes = { version = "1.4.0", default-features = false } codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } environmental = { version = "1.1.4", default-features = false } impl-trait-for-tuples = "0.2.1" -log = { version = "0.4.20", default-features = false } -trie-db = { version = "0.28.0", default-features = false } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +log = { workspace = true } +trie-db = { version = "0.29.0", default-features = false } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } # Substrate frame-benchmarking = { path = "../../../substrate/frame/benchmarking", default-features = false, optional = true } @@ -36,6 +36,7 @@ sp-version = { path = "../../../substrate/primitives/version", default-features # Polkadot polkadot-parachain-primitives = { path = "../../../polkadot/parachain", default-features = false, features = ["wasm-api"] } polkadot-runtime-parachains = { path = "../../../polkadot/runtime/parachains", default-features = false } +polkadot-runtime-common = { path = "../../../polkadot/runtime/common", default-features = false, optional = true } xcm = { package = "staging-xcm", path = "../../../polkadot/xcm", default-features = false } # Cumulus @@ -58,10 +59,12 @@ sp-keyring = { path = "../../../substrate/primitives/keyring" } sp-crypto-hashing = { path = "../../../substrate/primitives/crypto/hashing" } sp-tracing = { path = "../../../substrate/primitives/tracing" } sp-version = { path = "../../../substrate/primitives/version" } +sp-consensus-slots = { path = "../../../substrate/primitives/consensus/slots" } # Cumulus cumulus-test-client = { path = "../../test/client" } cumulus-test-relay-sproof-builder = { path = "../../test/relay-sproof-builder" } +cumulus-test-runtime = { path = "../../test/runtime" } [features] default = ["std"] @@ -79,6 +82,7 @@ std = [ "log/std", "pallet-message-queue/std", "polkadot-parachain-primitives/std", + "polkadot-runtime-common/std", "polkadot-runtime-parachains/std", "scale-info/std", "sp-core/std", @@ -102,6 +106,7 @@ runtime-benchmarks = [ "frame-system/runtime-benchmarks", "pallet-message-queue/runtime-benchmarks", "polkadot-parachain-primitives/runtime-benchmarks", + "polkadot-runtime-common/runtime-benchmarks", "polkadot-runtime-parachains/runtime-benchmarks", "sp-runtime/runtime-benchmarks", ] @@ -110,6 +115,7 @@ try-runtime = [ "frame-support/try-runtime", "frame-system/try-runtime", "pallet-message-queue/try-runtime", + "polkadot-runtime-common?/try-runtime", "polkadot-runtime-parachains/try-runtime", "sp-runtime/try-runtime", ] diff --git a/cumulus/pallets/parachain-system/proc-macro/Cargo.toml b/cumulus/pallets/parachain-system/proc-macro/Cargo.toml index 5f41e6423ac33cef4db6689554e92d04ececdf92..0a90c30e0331261026125f429efe70eff07ac069 100644 --- a/cumulus/pallets/parachain-system/proc-macro/Cargo.toml +++ b/cumulus/pallets/parachain-system/proc-macro/Cargo.toml @@ -13,9 +13,9 @@ workspace = true proc-macro = true [dependencies] -syn = "2.0.48" +syn = { workspace = true } proc-macro2 = "1.0.64" -quote = "1.0.33" +quote = { workspace = true } proc-macro-crate = "3.0.0" [features] diff --git a/cumulus/pallets/parachain-system/src/lib.rs b/cumulus/pallets/parachain-system/src/lib.rs index 5a0fa57fb171c60f13b87d70305a6d58dad475a1..54a1def59600dff5dd8b1484691dcb18fff5ce63 100644 --- a/cumulus/pallets/parachain-system/src/lib.rs +++ b/cumulus/pallets/parachain-system/src/lib.rs @@ -205,6 +205,7 @@ pub mod pallet { type OnSystemEvent: OnSystemEvent; /// Returns the parachain ID we are running with. + #[pallet::constant] type SelfParaId: Get; /// The place where outbound XCMP messages come from. This is queried in `finalize_block`. @@ -266,7 +267,7 @@ pub mod pallet { LastRelayChainBlockNumber::::put(vfp.relay_parent_number); - let host_config = match Self::host_configuration() { + let host_config = match HostConfiguration::::get() { Some(ok) => ok, None => { debug_assert!( @@ -280,7 +281,7 @@ pub mod pallet { // Before updating the relevant messaging state, we need to extract // the total bandwidth limits for the purpose of updating the unincluded // segment. - let total_bandwidth_out = match Self::relevant_messaging_state() { + let total_bandwidth_out = match RelevantMessagingState::::get() { Some(s) => OutboundBandwidthLimits::from_relay_chain_state(&s), None => { debug_assert!( @@ -297,7 +298,8 @@ pub mod pallet { Self::adjust_egress_bandwidth_limits(); let (ump_msg_count, ump_total_bytes) = >::mutate(|up| { - let (available_capacity, available_size) = match Self::relevant_messaging_state() { + let (available_capacity, available_size) = match RelevantMessagingState::::get() + { Some(limits) => ( limits.relay_dispatch_queue_remaining_capacity.remaining_count, limits.relay_dispatch_queue_remaining_capacity.remaining_size, @@ -462,7 +464,7 @@ pub mod pallet { // One complication here, is that the `host_configuration` is updated by an inherent // and those are processed after the block initialization phase. Therefore, we have to // be content only with the configuration as per the previous block. That means that - // the configuration can be either stale (or be abscent altogether in case of the + // the configuration can be either stale (or be absent altogether in case of the // beginning of the chain). // // In order to mitigate this, we do the following. At the time, we are only concerned @@ -475,7 +477,7 @@ pub mod pallet { // than the announced, we would waste some of weight. In the case the actual value is // greater than the announced, we will miss opportunity to send a couple of messages. weight += T::DbWeight::get().reads_writes(1, 1); - let hrmp_max_message_num_per_candidate = Self::host_configuration() + let hrmp_max_message_num_per_candidate = HostConfiguration::::get() .map(|cfg| cfg.hrmp_max_message_num_per_candidate) .unwrap_or(0); >::put(hrmp_max_message_num_per_candidate); @@ -763,7 +765,6 @@ pub mod pallet { /// [`:code`][sp_core::storage::well_known_keys::CODE] which will result the next block process /// with the new validation code. This concludes the upgrade process. #[pallet::storage] - #[pallet::getter(fn new_validation_function)] pub(super) type PendingValidationCode = StorageValue<_, Vec, ValueQuery>; /// Validation code that is set by the parachain and is to be communicated to collator and @@ -778,7 +779,6 @@ pub mod pallet { /// This value is expected to be set only once per block and it's never stored /// in the trie. #[pallet::storage] - #[pallet::getter(fn validation_data)] pub(super) type ValidationData = StorageValue<_, PersistedValidationData>; /// Were the validation data set to notify the relay chain? @@ -819,7 +819,6 @@ pub mod pallet { /// /// This data is also absent from the genesis. #[pallet::storage] - #[pallet::getter(fn relay_state_proof)] pub(super) type RelayStateProof = StorageValue<_, sp_trie::StorageProof>; /// The snapshot of some state related to messaging relevant to the current parachain as per @@ -830,7 +829,6 @@ pub mod pallet { /// /// This data is also absent from the genesis. #[pallet::storage] - #[pallet::getter(fn relevant_messaging_state)] pub(super) type RelevantMessagingState = StorageValue<_, MessagingStateSnapshot>; /// The parachain host configuration that was obtained from the relay parent. @@ -840,7 +838,7 @@ pub mod pallet { /// /// This data is also absent from the genesis. #[pallet::storage] - #[pallet::getter(fn host_configuration)] + #[pallet::disable_try_decode_storage] pub(super) type HostConfiguration = StorageValue<_, AbridgedHostConfiguration>; /// The last downward message queue chain head we have observed. @@ -1039,7 +1037,7 @@ impl GetChannelInfo for Pallet { // // Here it a similar case, with the difference that the realization that the channel is // closed came the same block. - let channels = match Self::relevant_messaging_state() { + let channels = match RelevantMessagingState::::get() { None => { log::warn!("calling `get_channel_status` with no RelevantMessagingState?!"); return ChannelStatus::Closed @@ -1067,7 +1065,7 @@ impl GetChannelInfo for Pallet { } fn get_channel_info(id: ParaId) -> Option { - let channels = Self::relevant_messaging_state()?.egress_channels; + let channels = RelevantMessagingState::::get()?.egress_channels; let index = channels.binary_search_by_key(&id, |item| item.0).ok()?; let info = ChannelInfo { max_capacity: channels[index].1.max_capacity, @@ -1404,7 +1402,7 @@ impl Pallet { ensure!(>::get().is_none(), Error::::ProhibitedByPolkadot); ensure!(!>::exists(), Error::::OverlappingUpgrades); - let cfg = Self::host_configuration().ok_or(Error::::HostConfigurationNotAvailable)?; + let cfg = HostConfiguration::::get().ok_or(Error::::HostConfigurationNotAvailable)?; ensure!(validation_function.len() <= cfg.max_code_size as usize, Error::::TooBig); // When a code upgrade is scheduled, it has to be applied in two @@ -1560,7 +1558,7 @@ impl Pallet { // may change so that the message is no longer valid. // // However, changing this setting is expected to be rare. - if let Some(cfg) = Self::host_configuration() { + if let Some(cfg) = HostConfiguration::::get() { if message_len > cfg.max_upward_message_size as usize { return Err(MessageSendError::TooBig) } @@ -1610,6 +1608,15 @@ impl UpwardMessageSender for Pallet { } } +#[cfg(feature = "runtime-benchmarks")] +impl polkadot_runtime_common::xcm_sender::EnsureForParachain for Pallet { + fn ensure(para_id: ParaId) { + if let ChannelStatus::Closed = Self::get_channel_status(para_id) { + Self::open_outbound_hrmp_channel_for_benchmarks_or_tests(para_id) + } + } +} + /// Something that can check the inherents of a block. #[cfg_attr( feature = "parameterized-consensus-hook", @@ -1707,14 +1714,14 @@ impl BlockNumberProvider for RelaychainDataProvider { type BlockNumber = relay_chain::BlockNumber; fn current_block_number() -> relay_chain::BlockNumber { - Pallet::::validation_data() + ValidationData::::get() .map(|d| d.relay_parent_number) .unwrap_or_else(|| Pallet::::last_relay_block_number()) } #[cfg(feature = "runtime-benchmarks")] fn set_block_number(block: Self::BlockNumber) { - let mut validation_data = Pallet::::validation_data().unwrap_or_else(|| + let mut validation_data = ValidationData::::get().unwrap_or_else(|| // PersistedValidationData does not impl default in non-std PersistedValidationData { parent_head: vec![].into(), @@ -1729,7 +1736,7 @@ impl BlockNumberProvider for RelaychainDataProvider { impl RelaychainStateProvider for RelaychainDataProvider { fn current_relay_chain_state() -> RelayChainState { - Pallet::::validation_data() + ValidationData::::get() .map(|d| RelayChainState { number: d.relay_parent_number, state_root: d.relay_parent_storage_root, @@ -1739,7 +1746,7 @@ impl RelaychainStateProvider for RelaychainDataProvider { #[cfg(feature = "runtime-benchmarks")] fn set_current_relay_chain_state(state: RelayChainState) { - let mut validation_data = Pallet::::validation_data().unwrap_or_else(|| + let mut validation_data = ValidationData::::get().unwrap_or_else(|| // PersistedValidationData does not impl default in non-std PersistedValidationData { parent_head: vec![].into(), diff --git a/cumulus/pallets/parachain-system/src/migration.rs b/cumulus/pallets/parachain-system/src/migration.rs index a92f85b9cd420e9e1027d1f82c643d90fea8b97c..30106aceab5a442c34360563fdfb096fdc6ac9b1 100644 --- a/cumulus/pallets/parachain-system/src/migration.rs +++ b/cumulus/pallets/parachain-system/src/migration.rs @@ -21,7 +21,7 @@ use frame_support::{ weights::Weight, }; -/// The current storage version. +/// The in-code storage version. pub const STORAGE_VERSION: StorageVersion = StorageVersion::new(2); /// Migrates the pallet storage to the most recent version. diff --git a/cumulus/pallets/parachain-system/src/mock.rs b/cumulus/pallets/parachain-system/src/mock.rs index b76553a53841dcb131e7f1a7f4017987250c739c..fe89dfe68c67e4b5d9f9e046dcf2a780a292da0a 100644 --- a/cumulus/pallets/parachain-system/src/mock.rs +++ b/cumulus/pallets/parachain-system/src/mock.rs @@ -71,7 +71,7 @@ parameter_types! { pub const ReservedDmpWeight: Weight = Weight::zero(); } -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { type Block = Block; type BlockHashCount = BlockHashCount; @@ -125,6 +125,7 @@ impl pallet_message_queue::Config for Test { type HeapSize = sp_core::ConstU32<{ 64 * 1024 }>; type MaxStale = sp_core::ConstU32<8>; type ServiceWeight = MaxWeight; + type IdleMaxServiceWeight = (); type WeightInfo = (); } diff --git a/cumulus/pallets/parachain-system/src/relay_state_snapshot.rs b/cumulus/pallets/parachain-system/src/relay_state_snapshot.rs index 5519d1521ea6da85573f2ecdd9cca001616b5806..60eccfb072f41e87223d54f34b5c7eb59c00b2ad 100644 --- a/cumulus/pallets/parachain-system/src/relay_state_snapshot.rs +++ b/cumulus/pallets/parachain-system/src/relay_state_snapshot.rs @@ -90,7 +90,7 @@ pub enum Error { DmqMqcHead(ReadEntryErr), /// Relay dispatch queue cannot be extracted. RelayDispatchQueueRemainingCapacity(ReadEntryErr), - /// The hrmp inress channel index cannot be extracted. + /// The hrmp ingress channel index cannot be extracted. HrmpIngressChannelIndex(ReadEntryErr), /// The hrmp egress channel index cannot be extracted. HrmpEgressChannelIndex(ReadEntryErr), diff --git a/cumulus/pallets/parachain-system/src/validate_block/implementation.rs b/cumulus/pallets/parachain-system/src/validate_block/implementation.rs index ce3b724420f1c9e50b65a81074e023c6b735227b..ecab7a9a09311ae0f952a7842e9f1826b00adc69 100644 --- a/cumulus/pallets/parachain-system/src/validate_block/implementation.rs +++ b/cumulus/pallets/parachain-system/src/validate_block/implementation.rs @@ -16,7 +16,7 @@ //! The actual implementation of the validate block functionality. -use super::{trie_cache, MemoryOptimizedValidationParams}; +use super::{trie_cache, trie_recorder, MemoryOptimizedValidationParams}; use cumulus_primitives_core::{ relay_chain::Hash as RHash, ParachainBlockData, PersistedValidationData, }; @@ -34,12 +34,14 @@ use sp_externalities::{set_and_run_with_externalities, Externalities}; use sp_io::KillStorageResult; use sp_runtime::traits::{Block as BlockT, Extrinsic, HashingFor, Header as HeaderT}; use sp_std::prelude::*; -use sp_trie::MemoryDB; +use sp_trie::{MemoryDB, ProofSizeProvider}; +use trie_recorder::SizeOnlyRecorderProvider; type TrieBackend = sp_state_machine::TrieBackend< MemoryDB>, HashingFor, trie_cache::CacheProvider>, + SizeOnlyRecorderProvider>, >; type Ext<'a, B> = sp_state_machine::Ext<'a, HashingFor, TrieBackend>; @@ -48,6 +50,9 @@ fn with_externalities R, R>(f: F) -> R { sp_externalities::with_externalities(f).expect("Environmental externalities not set.") } +// Recorder instance to be used during this validate_block call. +environmental::environmental!(recorder: trait ProofSizeProvider); + /// Validate the given parachain block. /// /// This function is doing roughly the following: @@ -120,6 +125,7 @@ where sp_std::mem::drop(storage_proof); + let mut recorder = SizeOnlyRecorderProvider::new(); let cache_provider = trie_cache::CacheProvider::new(); // We use the storage root of the `parent_head` to ensure that it is the correct root. // This is already being done above while creating the in-memory db, but let's be paranoid!! @@ -128,6 +134,7 @@ where *parent_header.state_root(), cache_provider, ) + .with_recorder(recorder.clone()) .build(); let _guard = ( @@ -167,9 +174,11 @@ where .replace_implementation(host_default_child_storage_next_key), sp_io::offchain_index::host_set.replace_implementation(host_offchain_index_set), sp_io::offchain_index::host_clear.replace_implementation(host_offchain_index_clear), + cumulus_primitives_proof_size_hostfunction::storage_proof_size::host_storage_proof_size + .replace_implementation(host_storage_proof_size), ); - run_with_externalities::(&backend, || { + run_with_externalities_and_recorder::(&backend, &mut recorder, || { let relay_chain_proof = crate::RelayChainStateProof::new( PSC::SelfParaId::get(), inherent_data.validation_data.relay_parent_storage_root, @@ -190,7 +199,7 @@ where } }); - run_with_externalities::(&backend, || { + run_with_externalities_and_recorder::(&backend, &mut recorder, || { let head_data = HeadData(block.header().encode()); E::execute_block(block); @@ -265,15 +274,17 @@ fn validate_validation_data( ); } -/// Run the given closure with the externalities set. -fn run_with_externalities R>( +/// Run the given closure with the externalities and recorder set. +fn run_with_externalities_and_recorder R>( backend: &TrieBackend, + recorder: &mut SizeOnlyRecorderProvider>, execute: F, ) -> R { let mut overlay = sp_state_machine::OverlayedChanges::default(); let mut ext = Ext::::new(&mut overlay, backend); + recorder.reset(); - set_and_run_with_externalities(&mut ext, || execute()) + recorder::using(recorder, || set_and_run_with_externalities(&mut ext, || execute())) } fn host_storage_read(key: &[u8], value_out: &mut [u8], value_offset: u32) -> Option { @@ -305,6 +316,10 @@ fn host_storage_clear(key: &[u8]) { with_externalities(|ext| ext.place_storage(key.to_vec(), None)) } +fn host_storage_proof_size() -> u64 { + recorder::with(|rec| rec.estimate_encoded_size()).expect("Recorder is always set; qed") as _ +} + fn host_storage_root(version: StateVersion) -> Vec { with_externalities(|ext| ext.storage_root(version)) } diff --git a/cumulus/pallets/parachain-system/src/validate_block/tests.rs b/cumulus/pallets/parachain-system/src/validate_block/tests.rs index f17ac6007a09bf02011473f95a537855eb43f3b0..1527492f57848b30a52984ba1156eb5b877268a8 100644 --- a/cumulus/pallets/parachain-system/src/validate_block/tests.rs +++ b/cumulus/pallets/parachain-system/src/validate_block/tests.rs @@ -21,13 +21,15 @@ use cumulus_test_client::{ runtime::{ self as test_runtime, Block, Hash, Header, TestPalletCall, UncheckedExtrinsic, WASM_BINARY, }, - transfer, BlockData, BlockOrigin, BuildParachainBlockData, Client, ClientBlockImportExt, - DefaultTestClientBuilderExt, HeadData, InitBlockBuilder, TestClientBuilder, - TestClientBuilderExt, ValidationParams, + seal_block, transfer, BlockData, BlockOrigin, BuildParachainBlockData, Client, + ClientBlockImportExt, DefaultTestClientBuilderExt, HeadData, InitBlockBuilder, + Sr25519Keyring::{Alice, Bob, Charlie}, + TestClientBuilder, TestClientBuilderExt, ValidationParams, }; use cumulus_test_relay_sproof_builder::RelayStateSproofBuilder; -use sp_keyring::AccountKeyring::*; +use sp_consensus_slots::Slot; use sp_runtime::traits::{Block as BlockT, Header as HeaderT}; + use std::{env, process::Command}; use crate::validate_block::MemoryOptimizedValidationParams; @@ -59,7 +61,7 @@ fn call_validate_block( } fn create_test_client() -> (Client, Header) { - let client = TestClientBuilder::new().build(); + let client = TestClientBuilder::new().enable_import_proof_recording().build(); let genesis_header = client .header(client.chain_info().genesis_hash) @@ -73,6 +75,7 @@ fn create_test_client() -> (Client, Header) { struct TestBlockData { block: ParachainBlockData, validation_data: PersistedValidationData, + slot: Slot, } fn build_block_with_witness( @@ -83,21 +86,24 @@ fn build_block_with_witness( ) -> TestBlockData { sproof_builder.para_id = test_runtime::PARACHAIN_ID.into(); sproof_builder.included_para_head = Some(HeadData(parent_head.encode())); - let (relay_parent_storage_root, _) = sproof_builder.clone().into_state_root_and_proof(); - let mut validation_data = PersistedValidationData { + + let validation_data = PersistedValidationData { relay_parent_number: 1, parent_head: parent_head.encode().into(), ..Default::default() }; - let mut builder = client.init_block_builder(Some(validation_data.clone()), sproof_builder); - validation_data.relay_parent_storage_root = relay_parent_storage_root; + let cumulus_test_client::BlockBuilderAndSupportData { + mut block_builder, + persisted_validation_data, + slot, + } = client.init_block_builder(Some(validation_data), sproof_builder); - extra_extrinsics.into_iter().for_each(|e| builder.push(e).unwrap()); + extra_extrinsics.into_iter().for_each(|e| block_builder.push(e).unwrap()); - let block = builder.build_parachain_block(*parent_head.state_root()); + let block = block_builder.build_parachain_block(*parent_head.state_root()); - TestBlockData { block, validation_data } + TestBlockData { block, validation_data: persisted_validation_data, slot } } #[test] @@ -105,10 +111,11 @@ fn validate_block_works() { sp_tracing::try_init_simple(); let (client, parent_head) = create_test_client(); - let TestBlockData { block, validation_data } = + let TestBlockData { block, validation_data, slot } = build_block_with_witness(&client, Vec::new(), parent_head.clone(), Default::default()); - let header = block.header().clone(); + let block = seal_block(block, slot, &client); + let header = block.header().clone(); let res_header = call_validate_block(parent_head, block, validation_data.relay_parent_storage_root) .expect("Calls `validate_block`"); @@ -126,12 +133,13 @@ fn validate_block_with_extra_extrinsics() { transfer(&client, Charlie, Alice, 500), ]; - let TestBlockData { block, validation_data } = build_block_with_witness( + let TestBlockData { block, validation_data, slot } = build_block_with_witness( &client, extra_extrinsics, parent_head.clone(), Default::default(), ); + let block = seal_block(block, slot, &client); let header = block.header().clone(); let res_header = @@ -159,7 +167,7 @@ fn validate_block_returns_custom_head_data() { transfer(&client, Bob, Charlie, 100), ]; - let TestBlockData { block, validation_data } = build_block_with_witness( + let TestBlockData { block, validation_data, slot } = build_block_with_witness( &client, extra_extrinsics, parent_head.clone(), @@ -168,6 +176,7 @@ fn validate_block_returns_custom_head_data() { let header = block.header().clone(); assert_ne!(expected_header, header.encode()); + let block = seal_block(block, slot, &client); let res_header = call_validate_block_encoded_header( parent_head, block, @@ -183,7 +192,7 @@ fn validate_block_invalid_parent_hash() { if env::var("RUN_TEST").is_ok() { let (client, parent_head) = create_test_client(); - let TestBlockData { block, validation_data } = + let TestBlockData { block, validation_data, .. } = build_block_with_witness(&client, Vec::new(), parent_head.clone(), Default::default()); let (mut header, extrinsics, witness) = block.deconstruct(); header.set_parent_hash(Hash::from_low_u64_be(1)); @@ -233,7 +242,7 @@ fn check_inherents_are_unsigned_and_before_all_other_extrinsics() { if env::var("RUN_TEST").is_ok() { let (client, parent_head) = create_test_client(); - let TestBlockData { block, validation_data } = + let TestBlockData { block, validation_data, .. } = build_block_with_witness(&client, Vec::new(), parent_head.clone(), Default::default()); let (header, mut extrinsics, proof) = block.deconstruct(); @@ -316,15 +325,15 @@ fn validate_block_works_with_child_tries() { let parent_head = block.header().clone(); - let TestBlockData { block, validation_data } = build_block_with_witness( + let TestBlockData { block, validation_data, slot } = build_block_with_witness( &client, vec![generate_extrinsic(&client, Alice, TestPalletCall::read_and_write_child_tries {})], parent_head.clone(), Default::default(), ); + let block = seal_block(block, slot, &client); let header = block.header().clone(); - let res_header = call_validate_block(parent_head, block, validation_data.relay_parent_storage_root) .expect("Calls `validate_block`"); diff --git a/cumulus/pallets/parachain-system/src/validate_block/trie_recorder.rs b/cumulus/pallets/parachain-system/src/validate_block/trie_recorder.rs index e73aef70aa491fc68aad4f9479222d9a076e7edc..48310670c074d1be2ec86f582c0c84622abc086c 100644 --- a/cumulus/pallets/parachain-system/src/validate_block/trie_recorder.rs +++ b/cumulus/pallets/parachain-system/src/validate_block/trie_recorder.rs @@ -97,6 +97,7 @@ pub(crate) struct SizeOnlyRecorderProvider { } impl SizeOnlyRecorderProvider { + /// Create a new instance of [`SizeOnlyRecorderProvider`] pub fn new() -> Self { Self { seen_nodes: Default::default(), @@ -104,6 +105,13 @@ impl SizeOnlyRecorderProvider { recorded_keys: Default::default(), } } + + /// Reset the internal state. + pub fn reset(&self) { + self.seen_nodes.borrow_mut().clear(); + *self.encoded_size.borrow_mut() = 0; + self.recorded_keys.borrow_mut().clear(); + } } impl sp_trie::TrieRecorderProvider for SizeOnlyRecorderProvider { @@ -281,6 +289,9 @@ mod tests { reference_recorder.estimate_encoded_size(), recorder_for_test.estimate_encoded_size() ); + + recorder_for_test.reset(); + assert_eq!(recorder_for_test.estimate_encoded_size(), 0) } } } diff --git a/cumulus/pallets/solo-to-para/Cargo.toml b/cumulus/pallets/solo-to-para/Cargo.toml index f7dc5fe4de372b1b5a03ea00cc041e3e568332d3..417038d7833c5ca4ec4acf681cba73d24ab45c5e 100644 --- a/cumulus/pallets/solo-to-para/Cargo.toml +++ b/cumulus/pallets/solo-to-para/Cargo.toml @@ -11,7 +11,7 @@ workspace = true [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } # Substrate frame-support = { path = "../../../substrate/frame/support", default-features = false } diff --git a/cumulus/pallets/xcm/Cargo.toml b/cumulus/pallets/xcm/Cargo.toml index 63cb14b16e769fe8ddd309baf8d51594b47da49b..9122e110fb92e51b0f85e3ba4136d30178d8ab7a 100644 --- a/cumulus/pallets/xcm/Cargo.toml +++ b/cumulus/pallets/xcm/Cargo.toml @@ -11,7 +11,7 @@ workspace = true [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } sp-std = { path = "../../../substrate/primitives/std", default-features = false } sp-io = { path = "../../../substrate/primitives/io", default-features = false } diff --git a/cumulus/pallets/xcmp-queue/Cargo.toml b/cumulus/pallets/xcmp-queue/Cargo.toml index 8dde44ca0ff43bb3764ed53be7db0110671b0107..ab196c6d3ec6a089d8099d6ae893631ac513e9d7 100644 --- a/cumulus/pallets/xcmp-queue/Cargo.toml +++ b/cumulus/pallets/xcmp-queue/Cargo.toml @@ -11,8 +11,8 @@ workspace = true [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", features = ["derive"], default-features = false } -log = { version = "0.4.20", default-features = false } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +log = { workspace = true } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } # Substrate frame-support = { path = "../../../substrate/frame/support", default-features = false } diff --git a/cumulus/pallets/xcmp-queue/src/lib.rs b/cumulus/pallets/xcmp-queue/src/lib.rs index 5b900769622afa3cba2c47f493ebff1a279b182b..b4cd925d540ead4ef17af337f59192c4cfec0042 100644 --- a/cumulus/pallets/xcmp-queue/src/lib.rs +++ b/cumulus/pallets/xcmp-queue/src/lib.rs @@ -462,7 +462,7 @@ impl Pallet { // Max message size refers to aggregates, or pages. Not to individual fragments. let max_message_size = channel_info.max_message_size as usize; let format_size = format.encoded_size(); - // We check the encoded fragment length plus the format size agains the max message size + // We check the encoded fragment length plus the format size against the max message size // because the format is concatenated if a new page is needed. let size_to_check = encoded_fragment .len() @@ -600,7 +600,7 @@ impl Pallet { let QueueConfigData { drop_threshold, .. } = >::get(); let fp = T::XcmpQueue::footprint(sender); // Assume that it will not fit into the current page: - let new_pages = fp.pages.saturating_add(1); + let new_pages = fp.ready_pages.saturating_add(1); if new_pages > drop_threshold { // This should not happen since the channel should have been suspended in // [`on_queue_changed`]. @@ -663,12 +663,12 @@ impl OnQueueChanged for Pallet { let mut suspended_channels = >::get(); let suspended = suspended_channels.contains(¶); - if suspended && fp.pages <= resume_threshold { + if suspended && fp.ready_pages <= resume_threshold { Self::send_signal(para, ChannelSignal::Resume); suspended_channels.remove(¶); >::put(suspended_channels); - } else if !suspended && fp.pages >= suspend_threshold { + } else if !suspended && fp.ready_pages >= suspend_threshold { log::warn!("XCMP queue for sibling {:?} is full; suspending channel.", para); Self::send_signal(para, ChannelSignal::Suspend); diff --git a/cumulus/pallets/xcmp-queue/src/migration.rs b/cumulus/pallets/xcmp-queue/src/migration.rs index 6c86c3011d23807adfbde801ec6865b6731822df..1702cd70bc2fb7e09cf15fbe21294bdb76b96ef1 100644 --- a/cumulus/pallets/xcmp-queue/src/migration.rs +++ b/cumulus/pallets/xcmp-queue/src/migration.rs @@ -20,11 +20,11 @@ use crate::{Config, OverweightIndex, Pallet, QueueConfig, QueueConfigData, DEFAU use cumulus_primitives_core::XcmpMessageFormat; use frame_support::{ pallet_prelude::*, - traits::{EnqueueMessage, OnRuntimeUpgrade, StorageVersion}, + traits::{EnqueueMessage, StorageVersion, UncheckedOnRuntimeUpgrade}, weights::{constants::WEIGHT_REF_TIME_PER_MILLIS, Weight}, }; -/// The current storage version. +/// The in-code storage version. pub const STORAGE_VERSION: StorageVersion = StorageVersion::new(4); pub const LOG: &str = "runtime::xcmp-queue-migration"; @@ -96,7 +96,7 @@ pub mod v2 { /// 2D weights). pub struct UncheckedMigrationToV2(PhantomData); - impl OnRuntimeUpgrade for UncheckedMigrationToV2 { + impl UncheckedOnRuntimeUpgrade for UncheckedMigrationToV2 { #[allow(deprecated)] fn on_runtime_upgrade() -> Weight { let translate = |pre: v1::QueueConfigData| -> v2::QueueConfigData { @@ -187,7 +187,7 @@ pub mod v3 { /// Migrates the pallet storage to v3. pub struct UncheckedMigrationToV3(PhantomData); - impl OnRuntimeUpgrade for UncheckedMigrationToV3 { + impl UncheckedOnRuntimeUpgrade for UncheckedMigrationToV3 { fn on_runtime_upgrade() -> Weight { #[frame_support::storage_alias] type Overweight = @@ -266,7 +266,7 @@ pub mod v4 { /// thresholds to at least the default values. pub struct UncheckedMigrationToV4(PhantomData); - impl OnRuntimeUpgrade for UncheckedMigrationToV4 { + impl UncheckedOnRuntimeUpgrade for UncheckedMigrationToV4 { fn on_runtime_upgrade() -> Weight { let translate = |pre: v2::QueueConfigData| -> QueueConfigData { let pre_default = v2::QueueConfigData::default(); @@ -315,6 +315,7 @@ pub mod v4 { mod tests { use super::*; use crate::mock::{new_test_ext, Test}; + use frame_support::traits::OnRuntimeUpgrade; #[test] #[allow(deprecated)] diff --git a/cumulus/pallets/xcmp-queue/src/mock.rs b/cumulus/pallets/xcmp-queue/src/mock.rs index 2bf1e3c6425a629909e950c72826f5c9385bf4f1..9d9a723cf8b538b604c45ff5b2bd366cd6f92c2d 100644 --- a/cumulus/pallets/xcmp-queue/src/mock.rs +++ b/cumulus/pallets/xcmp-queue/src/mock.rs @@ -30,10 +30,9 @@ use sp_runtime::{ BuildStorage, }; use xcm::prelude::*; -#[allow(deprecated)] -use xcm_builder::CurrencyAdapter; use xcm_builder::{ - FixedWeightBounds, FrameTransactionalProcessor, IsConcrete, NativeAsset, ParentIsPreset, + FixedWeightBounds, FrameTransactionalProcessor, FungibleAdapter, IsConcrete, NativeAsset, + ParentIsPreset, }; use xcm_executor::traits::ConvertOrigin; @@ -59,7 +58,7 @@ parameter_types! { type AccountId = u64; -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { type BaseCallFilter = Everything; type BlockWeights = (); @@ -133,8 +132,7 @@ parameter_types! { } /// Means for transacting assets on this chain. -#[allow(deprecated)] -pub type LocalAssetTransactor = CurrencyAdapter< +pub type LocalAssetTransactor = FungibleAdapter< // Use this currency: Balances, // Use this currency when it is a fungible asset matching the given location or name: @@ -177,6 +175,9 @@ impl xcm_executor::Config for XcmConfig { type SafeCallFilter = Everything; type Aliasers = Nothing; type TransactionalProcessor = FrameTransactionalProcessor; + type HrmpNewChannelOpenRequestHandler = (); + type HrmpChannelAcceptedHandler = (); + type HrmpChannelClosingHandler = (); } pub type XcmRouter = ( @@ -249,6 +250,7 @@ impl> EnqueueMessage for EnqueueToLocalStorage } } footprint.pages = footprint.storage.size as u32 / 16; // Number does not matter + footprint.ready_pages = footprint.pages; footprint } } diff --git a/cumulus/parachain-template/pallets/template/README.md b/cumulus/parachain-template/pallets/template/README.md deleted file mode 100644 index 5a6461233465c327d233fc5d97bdb3a6a85f8fd9..0000000000000000000000000000000000000000 --- a/cumulus/parachain-template/pallets/template/README.md +++ /dev/null @@ -1 +0,0 @@ -License: Unlicense diff --git a/cumulus/parachain-template/pallets/template/src/benchmarking.rs b/cumulus/parachain-template/pallets/template/src/benchmarking.rs deleted file mode 100644 index 8bba2a09867dea1d55e487661c01fd72acdf4dc9..0000000000000000000000000000000000000000 --- a/cumulus/parachain-template/pallets/template/src/benchmarking.rs +++ /dev/null @@ -1,20 +0,0 @@ -//! Benchmarking setup for pallet-parachain-template - -use super::*; - -#[allow(unused)] -use crate::Pallet as Template; -use frame_benchmarking::{benchmarks, impl_benchmark_test_suite, whitelisted_caller}; -use frame_system::RawOrigin; - -benchmarks! { - do_something { - let s in 0 .. 100; - let caller: T::AccountId = whitelisted_caller(); - }: _(RawOrigin::Signed(caller), s) - verify { - assert_eq!(Something::::get(), Some(s)); - } -} - -impl_benchmark_test_suite!(Template, crate::mock::new_test_ext(), crate::mock::Test,); diff --git a/cumulus/parachain-template/runtime/src/lib.rs b/cumulus/parachain-template/runtime/src/lib.rs deleted file mode 100644 index 1ea2f723f0d93c3bf02175d4121e9746cf88c7af..0000000000000000000000000000000000000000 --- a/cumulus/parachain-template/runtime/src/lib.rs +++ /dev/null @@ -1,769 +0,0 @@ -#![cfg_attr(not(feature = "std"), no_std)] -// `construct_runtime!` does a lot of recursion and requires us to increase the limit to 256. -#![recursion_limit = "256"] - -// Make the WASM binary available. -#[cfg(feature = "std")] -include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs")); - -mod weights; -pub mod xcm_config; - -use cumulus_pallet_parachain_system::RelayNumberStrictlyIncreases; -use polkadot_runtime_common::xcm_sender::NoPriceForMessageDelivery; -use smallvec::smallvec; -use sp_api::impl_runtime_apis; -use sp_core::{crypto::KeyTypeId, OpaqueMetadata}; -use sp_runtime::{ - create_runtime_str, generic, impl_opaque_keys, - traits::{BlakeTwo256, Block as BlockT, IdentifyAccount, Verify}, - transaction_validity::{TransactionSource, TransactionValidity}, - ApplyExtrinsicResult, MultiSignature, -}; - -use sp_std::prelude::*; -#[cfg(feature = "std")] -use sp_version::NativeVersion; -use sp_version::RuntimeVersion; - -use cumulus_primitives_core::{AggregateMessageOrigin, ParaId}; -use frame_support::{ - construct_runtime, derive_impl, - dispatch::DispatchClass, - genesis_builder_helper::{build_config, create_default_config}, - parameter_types, - traits::{ConstBool, ConstU32, ConstU64, ConstU8, EitherOfDiverse, TransformOrigin}, - weights::{ - constants::WEIGHT_REF_TIME_PER_SECOND, ConstantMultiplier, Weight, WeightToFeeCoefficient, - WeightToFeeCoefficients, WeightToFeePolynomial, - }, - PalletId, -}; -use frame_system::{ - limits::{BlockLength, BlockWeights}, - EnsureRoot, -}; -use pallet_xcm::{EnsureXcm, IsVoiceOfBody}; -use parachains_common::message_queue::{NarrowOriginToSibling, ParaIdToSibling}; -pub use sp_consensus_aura::sr25519::AuthorityId as AuraId; -pub use sp_runtime::{MultiAddress, Perbill, Permill}; -use xcm_config::{RelayLocation, XcmOriginToTransactDispatchOrigin}; - -#[cfg(any(feature = "std", test))] -pub use sp_runtime::BuildStorage; - -// Polkadot imports -use polkadot_runtime_common::{BlockHashCount, SlowAdjustingFeeUpdate}; - -use weights::{BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight}; - -// XCM Imports -use xcm::latest::prelude::BodyId; - -/// Import the template pallet. -pub use pallet_parachain_template; - -/// Alias to 512-bit hash when used in the context of a transaction signature on the chain. -pub type Signature = MultiSignature; - -/// Some way of identifying an account on the chain. We intentionally make it equivalent -/// to the public key of our transaction signing scheme. -pub type AccountId = <::Signer as IdentifyAccount>::AccountId; - -/// Balance of an account. -pub type Balance = u128; - -/// Index of a transaction in the chain. -pub type Nonce = u32; - -/// A hash of some data used by the chain. -pub type Hash = sp_core::H256; - -/// An index to a block. -pub type BlockNumber = u32; - -/// The address format for describing accounts. -pub type Address = MultiAddress; - -/// Block header type as expected by this runtime. -pub type Header = generic::Header; - -/// Block type as expected by this runtime. -pub type Block = generic::Block; - -/// A Block signed with a Justification -pub type SignedBlock = generic::SignedBlock; - -/// BlockId type as expected by this runtime. -pub type BlockId = generic::BlockId; - -/// The SignedExtension to the basic transaction logic. -pub type SignedExtra = ( - frame_system::CheckNonZeroSender, - frame_system::CheckSpecVersion, - frame_system::CheckTxVersion, - frame_system::CheckGenesis, - frame_system::CheckEra, - frame_system::CheckNonce, - frame_system::CheckWeight, - pallet_transaction_payment::ChargeTransactionPayment, -); - -/// Unchecked extrinsic type as expected by this runtime. -pub type UncheckedExtrinsic = - generic::UncheckedExtrinsic; - -/// Executive: handles dispatch to the various modules. -pub type Executive = frame_executive::Executive< - Runtime, - Block, - frame_system::ChainContext, - Runtime, - AllPalletsWithSystem, ->; - -/// Handles converting a weight scalar to a fee value, based on the scale and granularity of the -/// node's balance type. -/// -/// This should typically create a mapping between the following ranges: -/// - `[0, MAXIMUM_BLOCK_WEIGHT]` -/// - `[Balance::min, Balance::max]` -/// -/// Yet, it can be used for any other sort of change to weight-fee. Some examples being: -/// - Setting it to `0` will essentially disable the weight fee. -/// - Setting it to `1` will cause the literal `#[weight = x]` values to be charged. -pub struct WeightToFee; -impl WeightToFeePolynomial for WeightToFee { - type Balance = Balance; - fn polynomial() -> WeightToFeeCoefficients { - // in Rococo, extrinsic base weight (smallest non-zero weight) is mapped to 1 MILLIUNIT: - // in our template, we map to 1/10 of that, or 1/10 MILLIUNIT - let p = MILLIUNIT / 10; - let q = 100 * Balance::from(ExtrinsicBaseWeight::get().ref_time()); - smallvec![WeightToFeeCoefficient { - degree: 1, - negative: false, - coeff_frac: Perbill::from_rational(p % q, q), - coeff_integer: p / q, - }] - } -} - -/// Opaque types. These are used by the CLI to instantiate machinery that don't need to know -/// the specifics of the runtime. They can then be made to be agnostic over specific formats -/// of data like extrinsics, allowing for them to continue syncing the network through upgrades -/// to even the core data structures. -pub mod opaque { - use super::*; - use sp_runtime::{ - generic, - traits::{BlakeTwo256, Hash as HashT}, - }; - - pub use sp_runtime::OpaqueExtrinsic as UncheckedExtrinsic; - /// Opaque block header type. - pub type Header = generic::Header; - /// Opaque block type. - pub type Block = generic::Block; - /// Opaque block identifier type. - pub type BlockId = generic::BlockId; - /// Opaque block hash type. - pub type Hash = ::Output; -} - -impl_opaque_keys! { - pub struct SessionKeys { - pub aura: Aura, - } -} - -#[sp_version::runtime_version] -pub const VERSION: RuntimeVersion = RuntimeVersion { - spec_name: create_runtime_str!("template-parachain"), - impl_name: create_runtime_str!("template-parachain"), - authoring_version: 1, - spec_version: 1, - impl_version: 0, - apis: RUNTIME_API_VERSIONS, - transaction_version: 1, - state_version: 1, -}; - -/// This determines the average expected block time that we are targeting. -/// Blocks will be produced at a minimum duration defined by `SLOT_DURATION`. -/// `SLOT_DURATION` is picked up by `pallet_timestamp` which is in turn picked -/// up by `pallet_aura` to implement `fn slot_duration()`. -/// -/// Change this to adjust the block time. -pub const MILLISECS_PER_BLOCK: u64 = 12000; - -// NOTE: Currently it is not possible to change the slot duration after the chain has started. -// Attempting to do so will brick block production. -pub const SLOT_DURATION: u64 = MILLISECS_PER_BLOCK; - -// Time is measured by number of blocks. -pub const MINUTES: BlockNumber = 60_000 / (MILLISECS_PER_BLOCK as BlockNumber); -pub const HOURS: BlockNumber = MINUTES * 60; -pub const DAYS: BlockNumber = HOURS * 24; - -// Unit = the base number of indivisible units for balances -pub const UNIT: Balance = 1_000_000_000_000; -pub const MILLIUNIT: Balance = 1_000_000_000; -pub const MICROUNIT: Balance = 1_000_000; - -/// The existential deposit. Set to 1/10 of the Connected Relay Chain. -pub const EXISTENTIAL_DEPOSIT: Balance = MILLIUNIT; - -/// We assume that ~5% of the block weight is consumed by `on_initialize` handlers. This is -/// used to limit the maximal weight of a single extrinsic. -const AVERAGE_ON_INITIALIZE_RATIO: Perbill = Perbill::from_percent(5); - -/// We allow `Normal` extrinsics to fill up the block up to 75%, the rest can be used by -/// `Operational` extrinsics. -const NORMAL_DISPATCH_RATIO: Perbill = Perbill::from_percent(75); - -/// We allow for 0.5 of a second of compute with a 12 second average block time. -const MAXIMUM_BLOCK_WEIGHT: Weight = Weight::from_parts( - WEIGHT_REF_TIME_PER_SECOND.saturating_div(2), - cumulus_primitives_core::relay_chain::MAX_POV_SIZE as u64, -); - -/// Maximum number of blocks simultaneously accepted by the Runtime, not yet included -/// into the relay chain. -const UNINCLUDED_SEGMENT_CAPACITY: u32 = 1; -/// How many parachain blocks are processed by the relay chain per parent. Limits the -/// number of blocks authored per slot. -const BLOCK_PROCESSING_VELOCITY: u32 = 1; -/// Relay chain slot duration, in milliseconds. -const RELAY_CHAIN_SLOT_DURATION_MILLIS: u32 = 6000; - -/// The version information used to identify this runtime when compiled natively. -#[cfg(feature = "std")] -pub fn native_version() -> NativeVersion { - NativeVersion { runtime_version: VERSION, can_author_with: Default::default() } -} - -parameter_types! { - pub const Version: RuntimeVersion = VERSION; - - // This part is copied from Substrate's `bin/node/runtime/src/lib.rs`. - // The `RuntimeBlockLength` and `RuntimeBlockWeights` exist here because the - // `DeletionWeightLimit` and `DeletionQueueDepth` depend on those to parameterize - // the lazy contract deletion. - pub RuntimeBlockLength: BlockLength = - BlockLength::max_with_normal_ratio(5 * 1024 * 1024, NORMAL_DISPATCH_RATIO); - pub RuntimeBlockWeights: BlockWeights = BlockWeights::builder() - .base_block(BlockExecutionWeight::get()) - .for_class(DispatchClass::all(), |weights| { - weights.base_extrinsic = ExtrinsicBaseWeight::get(); - }) - .for_class(DispatchClass::Normal, |weights| { - weights.max_total = Some(NORMAL_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT); - }) - .for_class(DispatchClass::Operational, |weights| { - weights.max_total = Some(MAXIMUM_BLOCK_WEIGHT); - // Operational transactions have some extra reserved space, so that they - // are included even if block reached `MAXIMUM_BLOCK_WEIGHT`. - weights.reserved = Some( - MAXIMUM_BLOCK_WEIGHT - NORMAL_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT - ); - }) - .avg_block_initialization(AVERAGE_ON_INITIALIZE_RATIO) - .build_or_panic(); - pub const SS58Prefix: u16 = 42; -} - -/// The default types are being injected by [`derive_impl`](`frame_support::derive_impl`) from -/// [`ParaChainDefaultConfig`](`struct@frame_system::config_preludes::ParaChainDefaultConfig`), -/// but overridden as needed. -#[derive_impl(frame_system::config_preludes::ParaChainDefaultConfig as frame_system::DefaultConfig)] -impl frame_system::Config for Runtime { - /// The identifier used to distinguish between accounts. - type AccountId = AccountId; - /// The index type for storing how many extrinsics an account has signed. - type Nonce = Nonce; - /// The type for hashing blocks and tries. - type Hash = Hash; - /// The block type. - type Block = Block; - /// Maximum number of block number to block hash mappings to keep (oldest pruned first). - type BlockHashCount = BlockHashCount; - /// Runtime version. - type Version = Version; - /// The data to be stored in an account. - type AccountData = pallet_balances::AccountData; - /// The weight of database operations that the runtime can invoke. - type DbWeight = RocksDbWeight; - /// Block & extrinsics weights: base values and limits. - type BlockWeights = RuntimeBlockWeights; - /// The maximum length of a block (in bytes). - type BlockLength = RuntimeBlockLength; - /// This is used as an identifier of the chain. 42 is the generic substrate prefix. - type SS58Prefix = SS58Prefix; - /// The action to take on a Runtime Upgrade - type OnSetCode = cumulus_pallet_parachain_system::ParachainSetCode; - type MaxConsumers = frame_support::traits::ConstU32<16>; -} - -impl pallet_timestamp::Config for Runtime { - /// A timestamp: milliseconds since the unix epoch. - type Moment = u64; - type OnTimestampSet = Aura; - type MinimumPeriod = ConstU64<{ SLOT_DURATION / 2 }>; - type WeightInfo = (); -} - -impl pallet_authorship::Config for Runtime { - type FindAuthor = pallet_session::FindAccountFromAuthorIndex; - type EventHandler = (CollatorSelection,); -} - -parameter_types! { - pub const ExistentialDeposit: Balance = EXISTENTIAL_DEPOSIT; -} - -impl pallet_balances::Config for Runtime { - type MaxLocks = ConstU32<50>; - /// The type for recording an account's balance. - type Balance = Balance; - /// The ubiquitous event type. - type RuntimeEvent = RuntimeEvent; - type DustRemoval = (); - type ExistentialDeposit = ExistentialDeposit; - type AccountStore = System; - type WeightInfo = pallet_balances::weights::SubstrateWeight; - type MaxReserves = ConstU32<50>; - type ReserveIdentifier = [u8; 8]; - type RuntimeHoldReason = RuntimeHoldReason; - type RuntimeFreezeReason = RuntimeFreezeReason; - type FreezeIdentifier = (); - type MaxFreezes = ConstU32<0>; -} - -parameter_types! { - /// Relay Chain `TransactionByteFee` / 10 - pub const TransactionByteFee: Balance = 10 * MICROUNIT; -} - -impl pallet_transaction_payment::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type OnChargeTransaction = pallet_transaction_payment::CurrencyAdapter; - type WeightToFee = WeightToFee; - type LengthToFee = ConstantMultiplier; - type FeeMultiplierUpdate = SlowAdjustingFeeUpdate; - type OperationalFeeMultiplier = ConstU8<5>; -} - -impl pallet_sudo::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type RuntimeCall = RuntimeCall; - type WeightInfo = (); -} - -parameter_types! { - pub const ReservedXcmpWeight: Weight = MAXIMUM_BLOCK_WEIGHT.saturating_div(4); - pub const ReservedDmpWeight: Weight = MAXIMUM_BLOCK_WEIGHT.saturating_div(4); - pub const RelayOrigin: AggregateMessageOrigin = AggregateMessageOrigin::Parent; -} - -impl cumulus_pallet_parachain_system::Config for Runtime { - type WeightInfo = (); - type RuntimeEvent = RuntimeEvent; - type OnSystemEvent = (); - type SelfParaId = parachain_info::Pallet; - type OutboundXcmpMessageSource = XcmpQueue; - type DmpQueue = frame_support::traits::EnqueueWithOrigin; - type ReservedDmpWeight = ReservedDmpWeight; - type XcmpMessageHandler = XcmpQueue; - type ReservedXcmpWeight = ReservedXcmpWeight; - type CheckAssociatedRelayNumber = RelayNumberStrictlyIncreases; - type ConsensusHook = cumulus_pallet_aura_ext::FixedVelocityConsensusHook< - Runtime, - RELAY_CHAIN_SLOT_DURATION_MILLIS, - BLOCK_PROCESSING_VELOCITY, - UNINCLUDED_SEGMENT_CAPACITY, - >; -} - -impl parachain_info::Config for Runtime {} - -parameter_types! { - pub MessageQueueServiceWeight: Weight = Perbill::from_percent(35) * RuntimeBlockWeights::get().max_block; -} - -impl pallet_message_queue::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type WeightInfo = (); - #[cfg(feature = "runtime-benchmarks")] - type MessageProcessor = pallet_message_queue::mock_helpers::NoopMessageProcessor< - cumulus_primitives_core::AggregateMessageOrigin, - >; - #[cfg(not(feature = "runtime-benchmarks"))] - type MessageProcessor = xcm_builder::ProcessXcmMessage< - AggregateMessageOrigin, - xcm_executor::XcmExecutor, - RuntimeCall, - >; - type Size = u32; - // The XCMP queue pallet is only ever able to handle the `Sibling(ParaId)` origin: - type QueueChangeHandler = NarrowOriginToSibling; - type QueuePausedQuery = NarrowOriginToSibling; - type HeapSize = sp_core::ConstU32<{ 64 * 1024 }>; - type MaxStale = sp_core::ConstU32<8>; - type ServiceWeight = MessageQueueServiceWeight; -} - -impl cumulus_pallet_aura_ext::Config for Runtime {} - -impl cumulus_pallet_xcmp_queue::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type ChannelInfo = ParachainSystem; - type VersionWrapper = (); - // Enqueue XCMP messages from siblings for later processing. - type XcmpQueue = TransformOrigin; - type MaxInboundSuspended = sp_core::ConstU32<1_000>; - type ControllerOrigin = EnsureRoot; - type ControllerOriginConverter = XcmOriginToTransactDispatchOrigin; - type WeightInfo = (); - type PriceForSiblingDelivery = NoPriceForMessageDelivery; -} - -parameter_types! { - pub const Period: u32 = 6 * HOURS; - pub const Offset: u32 = 0; -} - -impl pallet_session::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type ValidatorId = ::AccountId; - // we don't have stash and controller, thus we don't need the convert as well. - type ValidatorIdOf = pallet_collator_selection::IdentityCollator; - type ShouldEndSession = pallet_session::PeriodicSessions; - type NextSessionRotation = pallet_session::PeriodicSessions; - type SessionManager = CollatorSelection; - // Essentially just Aura, but let's be pedantic. - type SessionHandler = ::KeyTypeIdProviders; - type Keys = SessionKeys; - type WeightInfo = (); -} - -impl pallet_aura::Config for Runtime { - type AuthorityId = AuraId; - type DisabledValidators = (); - type MaxAuthorities = ConstU32<100_000>; - type AllowMultipleBlocksPerSlot = ConstBool; - #[cfg(feature = "experimental")] - type SlotDuration = pallet_aura::MinimumPeriodTimesTwo; -} - -parameter_types! { - pub const PotId: PalletId = PalletId(*b"PotStake"); - pub const SessionLength: BlockNumber = 6 * HOURS; - // StakingAdmin pluralistic body. - pub const StakingAdminBodyId: BodyId = BodyId::Defense; -} - -/// We allow root and the StakingAdmin to execute privileged collator selection operations. -pub type CollatorSelectionUpdateOrigin = EitherOfDiverse< - EnsureRoot, - EnsureXcm>, ->; - -impl pallet_collator_selection::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type Currency = Balances; - type UpdateOrigin = CollatorSelectionUpdateOrigin; - type PotId = PotId; - type MaxCandidates = ConstU32<100>; - type MinEligibleCollators = ConstU32<4>; - type MaxInvulnerables = ConstU32<20>; - // should be a multiple of session or things will get inconsistent - type KickThreshold = Period; - type ValidatorId = ::AccountId; - type ValidatorIdOf = pallet_collator_selection::IdentityCollator; - type ValidatorRegistration = Session; - type WeightInfo = (); -} - -/// Configure the pallet template in pallets/template. -impl pallet_parachain_template::Config for Runtime { - type RuntimeEvent = RuntimeEvent; -} - -// Create the runtime by composing the FRAME pallets that were previously configured. -construct_runtime!( - pub enum Runtime { - // System support stuff. - System: frame_system = 0, - ParachainSystem: cumulus_pallet_parachain_system = 1, - Timestamp: pallet_timestamp = 2, - ParachainInfo: parachain_info = 3, - - // Monetary stuff. - Balances: pallet_balances = 10, - TransactionPayment: pallet_transaction_payment = 11, - - // Governance - Sudo: pallet_sudo = 15, - - // Collator support. The order of these 4 are important and shall not change. - Authorship: pallet_authorship = 20, - CollatorSelection: pallet_collator_selection = 21, - Session: pallet_session = 22, - Aura: pallet_aura = 23, - AuraExt: cumulus_pallet_aura_ext = 24, - - // XCM helpers. - XcmpQueue: cumulus_pallet_xcmp_queue = 30, - PolkadotXcm: pallet_xcm = 31, - CumulusXcm: cumulus_pallet_xcm = 32, - MessageQueue: pallet_message_queue = 33, - - // Template - TemplatePallet: pallet_parachain_template = 50, - } -); - -#[cfg(feature = "runtime-benchmarks")] -mod benches { - frame_benchmarking::define_benchmarks!( - [frame_system, SystemBench::] - [pallet_balances, Balances] - [pallet_session, SessionBench::] - [pallet_timestamp, Timestamp] - [pallet_message_queue, MessageQueue] - [pallet_sudo, Sudo] - [pallet_collator_selection, CollatorSelection] - [cumulus_pallet_parachain_system, ParachainSystem] - [cumulus_pallet_xcmp_queue, XcmpQueue] - ); -} - -impl_runtime_apis! { - impl sp_consensus_aura::AuraApi for Runtime { - fn slot_duration() -> sp_consensus_aura::SlotDuration { - sp_consensus_aura::SlotDuration::from_millis(Aura::slot_duration()) - } - - fn authorities() -> Vec { - Aura::authorities().into_inner() - } - } - - impl sp_api::Core for Runtime { - fn version() -> RuntimeVersion { - VERSION - } - - fn execute_block(block: Block) { - Executive::execute_block(block) - } - - fn initialize_block(header: &::Header) { - Executive::initialize_block(header) - } - } - - impl sp_api::Metadata for Runtime { - fn metadata() -> OpaqueMetadata { - OpaqueMetadata::new(Runtime::metadata().into()) - } - - fn metadata_at_version(version: u32) -> Option { - Runtime::metadata_at_version(version) - } - - fn metadata_versions() -> sp_std::vec::Vec { - Runtime::metadata_versions() - } - } - - impl sp_block_builder::BlockBuilder for Runtime { - fn apply_extrinsic(extrinsic: ::Extrinsic) -> ApplyExtrinsicResult { - Executive::apply_extrinsic(extrinsic) - } - - fn finalize_block() -> ::Header { - Executive::finalize_block() - } - - fn inherent_extrinsics(data: sp_inherents::InherentData) -> Vec<::Extrinsic> { - data.create_extrinsics() - } - - fn check_inherents( - block: Block, - data: sp_inherents::InherentData, - ) -> sp_inherents::CheckInherentsResult { - data.check_extrinsics(&block) - } - } - - impl sp_transaction_pool::runtime_api::TaggedTransactionQueue for Runtime { - fn validate_transaction( - source: TransactionSource, - tx: ::Extrinsic, - block_hash: ::Hash, - ) -> TransactionValidity { - Executive::validate_transaction(source, tx, block_hash) - } - } - - impl sp_offchain::OffchainWorkerApi for Runtime { - fn offchain_worker(header: &::Header) { - Executive::offchain_worker(header) - } - } - - impl sp_session::SessionKeys for Runtime { - fn generate_session_keys(seed: Option>) -> Vec { - SessionKeys::generate(seed) - } - - fn decode_session_keys( - encoded: Vec, - ) -> Option, KeyTypeId)>> { - SessionKeys::decode_into_raw_public_keys(&encoded) - } - } - - impl frame_system_rpc_runtime_api::AccountNonceApi for Runtime { - fn account_nonce(account: AccountId) -> Nonce { - System::account_nonce(account) - } - } - - impl pallet_transaction_payment_rpc_runtime_api::TransactionPaymentApi for Runtime { - fn query_info( - uxt: ::Extrinsic, - len: u32, - ) -> pallet_transaction_payment_rpc_runtime_api::RuntimeDispatchInfo { - TransactionPayment::query_info(uxt, len) - } - fn query_fee_details( - uxt: ::Extrinsic, - len: u32, - ) -> pallet_transaction_payment::FeeDetails { - TransactionPayment::query_fee_details(uxt, len) - } - fn query_weight_to_fee(weight: Weight) -> Balance { - TransactionPayment::weight_to_fee(weight) - } - fn query_length_to_fee(length: u32) -> Balance { - TransactionPayment::length_to_fee(length) - } - } - - impl pallet_transaction_payment_rpc_runtime_api::TransactionPaymentCallApi - for Runtime - { - fn query_call_info( - call: RuntimeCall, - len: u32, - ) -> pallet_transaction_payment::RuntimeDispatchInfo { - TransactionPayment::query_call_info(call, len) - } - fn query_call_fee_details( - call: RuntimeCall, - len: u32, - ) -> pallet_transaction_payment::FeeDetails { - TransactionPayment::query_call_fee_details(call, len) - } - fn query_weight_to_fee(weight: Weight) -> Balance { - TransactionPayment::weight_to_fee(weight) - } - fn query_length_to_fee(length: u32) -> Balance { - TransactionPayment::length_to_fee(length) - } - } - - impl cumulus_primitives_core::CollectCollationInfo for Runtime { - fn collect_collation_info(header: &::Header) -> cumulus_primitives_core::CollationInfo { - ParachainSystem::collect_collation_info(header) - } - } - - #[cfg(feature = "try-runtime")] - impl frame_try_runtime::TryRuntime for Runtime { - fn on_runtime_upgrade(checks: frame_try_runtime::UpgradeCheckSelect) -> (Weight, Weight) { - let weight = Executive::try_runtime_upgrade(checks).unwrap(); - (weight, RuntimeBlockWeights::get().max_block) - } - - fn execute_block( - block: Block, - state_root_check: bool, - signature_check: bool, - select: frame_try_runtime::TryStateSelect, - ) -> Weight { - // NOTE: intentional unwrap: we don't want to propagate the error backwards, and want to - // have a backtrace here. - Executive::try_execute_block(block, state_root_check, signature_check, select).unwrap() - } - } - - #[cfg(feature = "runtime-benchmarks")] - impl frame_benchmarking::Benchmark for Runtime { - fn benchmark_metadata(extra: bool) -> frame_benchmarking::RuntimeBenchmarkInfo { - use frame_benchmarking::{Benchmarking, BenchmarkList, RuntimeBenchmarkInfo}; - use frame_support::traits::StorageInfoTrait; - use frame_system_benchmarking::Pallet as SystemBench; - use cumulus_pallet_session_benchmarking::Pallet as SessionBench; - - let mut list = Vec::::new(); - list_benchmarks!(list, extra); - - let storage_info = AllPalletsWithSystem::storage_info(); - let max_extrinsic_weight = RuntimeBlockWeights::get().per_class.get(DispatchClass::Normal).max_extrinsic.unwrap(); - let db_weight: frame_support::weights::RuntimeDbWeight = ::DbWeight::get(); - - RuntimeBenchmarkInfo {list, storage_info, max_extrinsic_weight: Some(max_extrinsic_weight), db_weight: Some(db_weight) } - } - - fn dispatch_benchmark( - config: frame_benchmarking::BenchmarkConfig - ) -> Result, sp_runtime::RuntimeString> { - use frame_benchmarking::{BenchmarkError, Benchmarking, BenchmarkBatch}; - - use frame_system_benchmarking::Pallet as SystemBench; - impl frame_system_benchmarking::Config for Runtime { - fn setup_set_code_requirements(code: &sp_std::vec::Vec) -> Result<(), BenchmarkError> { - ParachainSystem::initialize_for_set_code_benchmark(code.len() as u32); - Ok(()) - } - - fn verify_set_code() { - System::assert_last_event(cumulus_pallet_parachain_system::Event::::ValidationFunctionStored.into()); - } - } - - use cumulus_pallet_session_benchmarking::Pallet as SessionBench; - impl cumulus_pallet_session_benchmarking::Config for Runtime {} - - use frame_support::traits::WhitelistedStorageKeys; - let whitelist = AllPalletsWithSystem::whitelisted_storage_keys(); - - let mut batches = Vec::::new(); - let params = (&config, &whitelist); - add_benchmarks!(params, batches); - - if batches.is_empty() { return Err("Benchmark not found for this pallet.".into()) } - Ok(batches) - } - } - - impl sp_genesis_builder::GenesisBuilder for Runtime { - fn create_default_config() -> Vec { - create_default_config::() - } - - fn build_config(config: Vec) -> sp_genesis_builder::Result { - build_config::(config) - } - } -} - -cumulus_pallet_parachain_system::register_validate_block! { - Runtime = Runtime, - BlockExecutor = cumulus_pallet_aura_ext::BlockExecutor::, -} diff --git a/cumulus/parachains/chain-specs/asset-hub-kusama.json b/cumulus/parachains/chain-specs/asset-hub-kusama.json index fba74b17f9607f58bdb17d7a0b05c8b764a9c4e5..66a705a40869ce6eb3fe2ac7a028ce68c784c18c 100644 --- a/cumulus/parachains/chain-specs/asset-hub-kusama.json +++ b/cumulus/parachains/chain-specs/asset-hub-kusama.json @@ -25,7 +25,10 @@ "/dns/statemine-bootnode.radiumblock.com/tcp/30336/wss/p2p/12D3KooWCKUrE5uaXQ288ko3Ex3zCyozyJLG47KEYTopinnXNtYL", "/dns/mine14.rotko.net/tcp/33524/p2p/12D3KooWJUFnjR2PNbsJhudwPVaWCoZy1acPGKjM2cSuGj345BBu", "/dns/mine14.rotko.net/tcp/34524/ws/p2p/12D3KooWJUFnjR2PNbsJhudwPVaWCoZy1acPGKjM2cSuGj345BBu", - "/dns/mine14.rotko.net/tcp/35524/wss/p2p/12D3KooWJUFnjR2PNbsJhudwPVaWCoZy1acPGKjM2cSuGj345BBu" + "/dns/mine14.rotko.net/tcp/35524/wss/p2p/12D3KooWJUFnjR2PNbsJhudwPVaWCoZy1acPGKjM2cSuGj345BBu", + "/dns/asset-hub-kusama.bootnodes.polkadotters.com/tcp/30511/p2p/12D3KooWDpk7wVH7RgjErEvbvAZ2kY5VeaAwRJP5ojmn1e8b8UbU", + "/dns/asset-hub-kusama.bootnodes.polkadotters.com/tcp/30513/wss/p2p/12D3KooWDpk7wVH7RgjErEvbvAZ2kY5VeaAwRJP5ojmn1e8b8UbU", + "/dns/boot-kusama-assethub.luckyfriday.io/tcp/443/wss/p2p/12D3KooWSwaeFs6FNgpgh54fdoxSDAA4nJNaPE3PAcse2GRrG7b3" ], "telemetryEndpoints": null, "protocolId": null, diff --git a/cumulus/parachains/chain-specs/asset-hub-polkadot.json b/cumulus/parachains/chain-specs/asset-hub-polkadot.json index 685a00ddc7145ed650f7cb5496fe81cfb23f0ffb..16caa52ba91376ed30187c89d249ff38ed1ea42a 100644 --- a/cumulus/parachains/chain-specs/asset-hub-polkadot.json +++ b/cumulus/parachains/chain-specs/asset-hub-polkadot.json @@ -25,7 +25,10 @@ "/dns/statemint-bootnode.radiumblock.com/tcp/30333/p2p/12D3KooWLKxHom7f3XawRJqrF8RwiKK5Sj3qZqz5c7hF6eJeXhTx", "/dns/mint14.rotko.net/tcp/33514/p2p/12D3KooWKkzLjYF6M5eEs7nYiqEtRqY8SGVouoCwo3nCWsRnThDW", "/dns/mint14.rotko.net/tcp/34514/ws/p2p/12D3KooWKkzLjYF6M5eEs7nYiqEtRqY8SGVouoCwo3nCWsRnThDW", - "/dns/mint14.rotko.net/tcp/35514/wss/p2p/12D3KooWKkzLjYF6M5eEs7nYiqEtRqY8SGVouoCwo3nCWsRnThDW" + "/dns/mint14.rotko.net/tcp/35514/wss/p2p/12D3KooWKkzLjYF6M5eEs7nYiqEtRqY8SGVouoCwo3nCWsRnThDW", + "/dns/asset-hub-polkadot.bootnodes.polkadotters.com/tcp/30508/p2p/12D3KooWKbfY9a9oywxMJKiALmt7yhrdQkjXMtvxhhDDN23vG93R", + "/dns/asset-hub-polkadot.bootnodes.polkadotters.com/tcp/30510/wss/p2p/12D3KooWKbfY9a9oywxMJKiALmt7yhrdQkjXMtvxhhDDN23vG93R", + "/dns/boot-polkadot-assethub.luckyfriday.io/tcp/443/wss/p2p/12D3KooWDR9M7CjV1xdjCRbRwkFn1E7sjMaL4oYxGyDWxuLrFc2J" ], "telemetryEndpoints": null, "protocolId": null, diff --git a/cumulus/parachains/chain-specs/asset-hub-westend.json b/cumulus/parachains/chain-specs/asset-hub-westend.json index 6f42b5f7d8bb4a76c7390b538a68b1bb0acc1613..670935c9d2474242307d691d8707030c70f49982 100644 --- a/cumulus/parachains/chain-specs/asset-hub-westend.json +++ b/cumulus/parachains/chain-specs/asset-hub-westend.json @@ -23,7 +23,9 @@ "/dns/westmint-bootnode.radiumblock.com/tcp/30333/p2p/12D3KooWDoq4PVdWm5nzRSvEz3DSSKjVgRhWVUaKyi5JMKwJKYbk", "/dns/wmint14.rotko.net/tcp/33534/p2p/12D3KooWE4UDXqgtTcMCyUQ8S4uvaT8VMzzTBA6NWmKuYwTacWuN", "/dns/wmint14.rotko.net/tcp/34534/ws/p2p/12D3KooWE4UDXqgtTcMCyUQ8S4uvaT8VMzzTBA6NWmKuYwTacWuN", - "/dns/wmint14.rotko.net/tcp/35534/wss/p2p/12D3KooWE4UDXqgtTcMCyUQ8S4uvaT8VMzzTBA6NWmKuYwTacWuN" + "/dns/wmint14.rotko.net/tcp/35534/wss/p2p/12D3KooWE4UDXqgtTcMCyUQ8S4uvaT8VMzzTBA6NWmKuYwTacWuN", + "/dns/asset-hub-westend.bootnodes.polkadotters.com/tcp/30514/p2p/12D3KooWNFYysCqmojxqjjaTfD2VkWBNngfyUKWjcR4WFixfHNTk", + "/dns/asset-hub-westend.bootnodes.polkadotters.com/tcp/30516/wss/p2p/12D3KooWNFYysCqmojxqjjaTfD2VkWBNngfyUKWjcR4WFixfHNTk" ], "telemetryEndpoints": null, "protocolId": null, diff --git a/cumulus/parachains/chain-specs/bridge-hub-kusama.json b/cumulus/parachains/chain-specs/bridge-hub-kusama.json index 0ef81806cc5c08621f3c0a308425c72f836c3ef4..6644ea41ab748548d3c6dcbd06951522672dbb53 100644 --- a/cumulus/parachains/chain-specs/bridge-hub-kusama.json +++ b/cumulus/parachains/chain-specs/bridge-hub-kusama.json @@ -25,7 +25,10 @@ "/dns/bridgehub-kusama-bootnode.radiumblock.com/tcp/30336/wss/p2p/12D3KooWQMWofXj8v3RroDNnrhv1iURqm8vnaG98AdGnCn2YoDcW", "/dns/kbr13.rotko.net/tcp/33553/p2p/12D3KooWAmBp54mUEYtvsk2kxNEsDbAvdUMcaghxKXgUQxmPEQ66", "/dns/kbr13.rotko.net/tcp/34553/ws/p2p/12D3KooWAmBp54mUEYtvsk2kxNEsDbAvdUMcaghxKXgUQxmPEQ66", - "/dns/kbr13.rotko.net/tcp/35553/wss/p2p/12D3KooWAmBp54mUEYtvsk2kxNEsDbAvdUMcaghxKXgUQxmPEQ66" + "/dns/kbr13.rotko.net/tcp/35553/wss/p2p/12D3KooWAmBp54mUEYtvsk2kxNEsDbAvdUMcaghxKXgUQxmPEQ66", + "/dns/bridge-hub-kusama.bootnodes.polkadotters.com/tcp/30520/p2p/12D3KooWH3pucezRRS5esoYyzZsUkKWcPSByQxEvmM819QL1HPLV", + "/dns/bridge-hub-kusama.bootnodes.polkadotters.com/tcp/30522/wss/p2p/12D3KooWH3pucezRRS5esoYyzZsUkKWcPSByQxEvmM819QL1HPLV", + "/dns/boot-kusama-bridgehub.luckyfriday.io/tcp/443/wss/p2p/12D3KooWQybw6AFmAvrFfwUQnNxUpS12RovapD6oorh2mAJr4xyd" ], "telemetryEndpoints": null, "protocolId": null, diff --git a/cumulus/parachains/chain-specs/bridge-hub-polkadot.json b/cumulus/parachains/chain-specs/bridge-hub-polkadot.json index 130bdf31ef211ba6d353fa97944b2bf80320997d..c51c5eff89b86a0ce553bbcfc472f6fb5cf0d535 100644 --- a/cumulus/parachains/chain-specs/bridge-hub-polkadot.json +++ b/cumulus/parachains/chain-specs/bridge-hub-polkadot.json @@ -21,7 +21,10 @@ "/dns/bridgehub-polkadot-bootnode.radiumblock.com/tcp/30333/p2p/12D3KooWPNZm78tWUmKbta3SXdkqTPsquRc8ekEbJjZsGGi7YiRi", "/dns/pbr13.rotko.net/tcp/33543/p2p/12D3KooWMxZY7tDc2Rh454VaJJ7RexKAXVS6xSBEvTnXSGCnuGDw", "/dns/pbr13.rotko.net/tcp/34543/ws/p2p/12D3KooWMxZY7tDc2Rh454VaJJ7RexKAXVS6xSBEvTnXSGCnuGDw", - "/dns/pbr13.rotko.net/tcp/35543/wss/p2p/12D3KooWMxZY7tDc2Rh454VaJJ7RexKAXVS6xSBEvTnXSGCnuGDw" + "/dns/pbr13.rotko.net/tcp/35543/wss/p2p/12D3KooWMxZY7tDc2Rh454VaJJ7RexKAXVS6xSBEvTnXSGCnuGDw", + "/dns/bridge-hub-polkadot.bootnodes.polkadotters.com/tcp/30517/p2p/12D3KooWLUNE3LHPDa1WrrZaYT7ArK66CLM1bPv7kKz74UcLnQRB", + "/dns/bridge-hub-polkadot.bootnodes.polkadotters.com/tcp/30519/wss/p2p/12D3KooWLUNE3LHPDa1WrrZaYT7ArK66CLM1bPv7kKz74UcLnQRB", + "/dns/boot-polkadot-bridgehub.luckyfriday.io/tcp/443/wss/p2p/12D3KooWKf3mBXHjLbwtPqv1BdbQuwbFNcQQYxASS7iQ25264AXH" ], "telemetryEndpoints": null, "protocolId": null, diff --git a/cumulus/parachains/chain-specs/bridge-hub-westend.json b/cumulus/parachains/chain-specs/bridge-hub-westend.json index 018ab0ee6fd9810595c841237dd253b9463aed79..447207a58107a95bcd5fca173d9d5476a0ce9cab 100644 --- a/cumulus/parachains/chain-specs/bridge-hub-westend.json +++ b/cumulus/parachains/chain-specs/bridge-hub-westend.json @@ -19,7 +19,9 @@ "/dns/bridgehub-westend-bootnode.radiumblock.com/tcp/30336/wss/p2p/12D3KooWBsBArCMxmQyo3feCEqMWuwyhb2LTRK8hmCCJxgrNeMke", "/dns/wbr13.rotko.net/tcp/33563/p2p/12D3KooWJyeRHpxZZbfBCNEgeUFzmRC5AMSAs2tJhjJS1k5hULkD", "/dns/wbr13.rotko.net/tcp/34563/ws/p2p/12D3KooWJyeRHpxZZbfBCNEgeUFzmRC5AMSAs2tJhjJS1k5hULkD", - "/dns/wbr13.rotko.net/tcp/35563/wss/p2p/12D3KooWJyeRHpxZZbfBCNEgeUFzmRC5AMSAs2tJhjJS1k5hULkD" + "/dns/wbr13.rotko.net/tcp/35563/wss/p2p/12D3KooWJyeRHpxZZbfBCNEgeUFzmRC5AMSAs2tJhjJS1k5hULkD", + "/dns/bridge-hub-westend.bootnodes.polkadotters.com/tcp/30523/p2p/12D3KooWPkwgJofp4GeeRwNgXqkp2aFwdLkCWv3qodpBJLwK43Jj", + "/dns/bridge-hub-westend.bootnodes.polkadotters.com/tcp/30525/wss/p2p/12D3KooWPkwgJofp4GeeRwNgXqkp2aFwdLkCWv3qodpBJLwK43Jj" ], "telemetryEndpoints": null, "protocolId": null, diff --git a/cumulus/parachains/chain-specs/collectives-polkadot.json b/cumulus/parachains/chain-specs/collectives-polkadot.json index e9f690234e4381f54377c7fe7174f25834a973a5..ce80e21ae625e813be0f71245bc454cb284455f3 100644 --- a/cumulus/parachains/chain-specs/collectives-polkadot.json +++ b/cumulus/parachains/chain-specs/collectives-polkadot.json @@ -25,7 +25,10 @@ "/dns/collectives-polkadot-bootnode.radiumblock.com/tcp/30336/wss/p2p/12D3KooWDumvnNwPbBg5inBEapgjKU7ECdMHHgwfYeGWUkzYUE1c", "/dns/pch13.rotko.net/tcp/33573/p2p/12D3KooWRXudHoazPZ9osMfdY38e8CBxQLD4RhrVeHpRSNNpcDtH", "/dns/pch13.rotko.net/tcp/34573/ws/p2p/12D3KooWRXudHoazPZ9osMfdY38e8CBxQLD4RhrVeHpRSNNpcDtH", - "/dns/pch13.rotko.net/tcp/35573/wss/p2p/12D3KooWRXudHoazPZ9osMfdY38e8CBxQLD4RhrVeHpRSNNpcDtH" + "/dns/pch13.rotko.net/tcp/35573/wss/p2p/12D3KooWRXudHoazPZ9osMfdY38e8CBxQLD4RhrVeHpRSNNpcDtH", + "/dns/collectives-polkadot.bootnodes.polkadotters.com/tcp/30526/p2p/12D3KooWNohUjvJtGKUa8Vhy8C1ZBB5N8JATB6e7rdLVCioeb3ff", + "/dns/collectives-polkadot.bootnodes.polkadotters.com/tcp/30528/wss/p2p/12D3KooWNohUjvJtGKUa8Vhy8C1ZBB5N8JATB6e7rdLVCioeb3ff", + "/dns/boot-polkadot-collectives.luckyfriday.io/tcp/443/wss/p2p/12D3KooWCzifnPooTt4kvTnXT7FTKTymVL7xn7DURQLsS2AKpf6w" ], "telemetryEndpoints": null, "protocolId": null, diff --git a/cumulus/parachains/chain-specs/collectives-westend.json b/cumulus/parachains/chain-specs/collectives-westend.json index ffe73b5a05a391cc1c5396c235460830c023297a..e459c631f8be9df7c5c52993c116f11ef619fefe 100644 --- a/cumulus/parachains/chain-specs/collectives-westend.json +++ b/cumulus/parachains/chain-specs/collectives-westend.json @@ -25,7 +25,9 @@ "/dns/westend-collectives-boot-ng.dwellir.com/tcp/443/wss/p2p/12D3KooWPFM93jgm4pgxx8PM8WJKAJF49qia8jRB95uciUQwYh7m", "/dns/wch13.rotko.net/tcp/33593/p2p/12D3KooWPG85zhuSRoyptjLkFD4iJFistjiBmc15JgQ96B4fdXYr", "/dns/wch13.rotko.net/tcp/34593/ws/p2p/12D3KooWPG85zhuSRoyptjLkFD4iJFistjiBmc15JgQ96B4fdXYr", - "/dns/wch13.rotko.net/tcp/35593/wss/p2p/12D3KooWPG85zhuSRoyptjLkFD4iJFistjiBmc15JgQ96B4fdXYr" + "/dns/wch13.rotko.net/tcp/35593/wss/p2p/12D3KooWPG85zhuSRoyptjLkFD4iJFistjiBmc15JgQ96B4fdXYr", + "/dns/collectives-westend.bootnodes.polkadotters.com/tcp/30529/p2p/12D3KooWAFkXNSBfyPduZVgfS7pj5NuVpbU8Ee5gHeF8wvos7Yqn", + "/dns/collectives-westend.bootnodes.polkadotters.com/tcp/30531/wss/p2p/12D3KooWAFkXNSBfyPduZVgfS7pj5NuVpbU8Ee5gHeF8wvos7Yqn" ], "telemetryEndpoints": null, "protocolId": null, diff --git a/cumulus/parachains/chain-specs/coretime-kusama-genesis.json b/cumulus/parachains/chain-specs/coretime-kusama-genesis.json new file mode 100644 index 0000000000000000000000000000000000000000..abad4fc9237c26633177892219e24a9ebfeab2fa --- /dev/null +++ b/cumulus/parachains/chain-specs/coretime-kusama-genesis.json @@ -0,0 +1,111 @@ +{ + "name": "Kusama Coretime", + "id": "coretime-kusama", + "chainType": "Live", + "bootNodes": [ + "/dns/kusama-coretime-connect-a-0.polkadot.io/tcp/30334/p2p/12D3KooWR7Biy6nPgQFhk2eYP62pAkcFA6he9RUFURTDh7ewTjpo", + "/dns/kusama-coretime-connect-a-1.polkadot.io/tcp/30334/p2p/12D3KooWAGFiMZDF9RxdacrkenzGdo8nhfSe9EXofHc5mHeJ9vGX", + "/dns/kusama-coretime-connect-a-0.polkadot.io/tcp/443/wss/p2p/12D3KooWR7Biy6nPgQFhk2eYP62pAkcFA6he9RUFURTDh7ewTjpo", + "/dns/kusama-coretime-connect-a-1.polkadot.io/tcp/443/wss/p2p/12D3KooWAGFiMZDF9RxdacrkenzGdo8nhfSe9EXofHc5mHeJ9vGX" + ], + "telemetryEndpoints": null, + "protocolId": null, + "properties": { + "ss58Format": 2, + "tokenDecimals": 12, + "tokenSymbol": "KSM" + }, + "relay_chain": "kusama", + "para_id": 1005, + "codeSubstitutes": {}, + "genesis": { + "runtimeGenesis": { + "code": "0x52bc537646db8e0528b52ffd0058640605ae3e8629134f107868930e681756ccf063649703992ad4ee818f51911de6fa91e874d2fe2ba7696b4c18dcb3a8cb4c0791c5b5583c14d76913132861747d5e806b5eae206d441fad0d2b09d95bee2db79452a69402ae14771224121affdebcea431b8a9900f6f539f2612d6606cc7537c8dca73b24858d87bf43525cf01b33f700d8cf11d3e85d9d3fe8dbdea69a20edce5d74f6d7a60dba8ff3e7d1a3cb3675ac4bb1dfe99d4e31f30fe61e80ced1b6698746f0c53b5fc7daf488483d7f3e474250e7ed4d82fe35e1e70dcc6ac647beae04000780bbd38982799429d871f06d8fa2c3d79502e00110799429d8d7957cb80fa7713a51461585c3b191cb7894cc315f5fa7134547455117d178941cfcf275e974a2bc8a7a584539e7afa29e5798a3b08a72750a7694731b177914998a9a99711c1525e3231d8ec351382a6a46f31947e1f0e923cfe1ebd4e944b12acaf26ebf662aaa8757ee37de95cf38aa7da6a262f45751963f47cdf8e551a0d354d48d1b4e2bea9215255dc7e5281d7e55148639eaf21d1ef39ecf8a8ad1ad8ac22aaac62d7f983f474d7f1515631c159d07af8e7a5e2beac60d97a92819af2ab7a9a81b362e53c9787554e5b5a26c2466e328a9d52948311515e33232be234646a687bb65b94d8d655d96d42133834384bdaaa5850373974c1ce988b3dd8c68d44e47f5b0675532579c386670381d2351b4a4c4ae57c988e6c321e78ca86ad7d6484794c1a2cc0ce66e7a78578f745c4e1255ebe62666e6c2240f3c38aa9d071e240e1c3d7c87e77c87d9430f8eb2bc871e7454d5c87b380fd3721ee20e3b384a87ef70b3831bc93cefe13dcc88bc0727390a879378e0c15197f350797092a364bcb9b974780fdf21caf80e7d7373d383a32aefa1a26e6e4498936aad71d4f41ae93d9c071baf711c24e7c15133cec30e3be8e0b5a27670afce83a32c7747bd1e9ac7c4f48cf7f09b9a1a771b1bdfe135ee358e12798df31b2f396ae425cee1e124478d9cc49a3bc94b8ec2e1ee28e73cecc083470fe7c183f370940ee7c18eba9c87d71d3bdc6d2aaaa6a26adc7d878def70d4f41deca8e8d57770d4f31d58871b47557e53513adc788f8ad2c16d6c7c074761dec351d24b15d5430fae55d48e8adae13131cea3a268687c4745f1f09818dfe12819df5151343b9cc651b3ee6c895d73924fea3515455351345ee3737a0f4759dea3a2a87b0f475d75892db1532739caaa4e6c899d54513dd4299887cb6b455996dfa8a81b7e55bf1c252b05ae8ab22ee75151964fe9d3513a6a912db1f370944c1d624bec3b54d48d8ceb50513d2aaa8757ada21c07ef51510b06286c2023cc0bd0700229271d4e18411666b4a10c2c88e28453141dbee34a8ba36e0e755d691d87eaaeb43e53e596d86d6a74388f8ada81c3692a2a35041e84610b171ad8a08c219c74a45a0045154c80042ab0810b17271d8ed25151a34a7354e94aeb38eaba928fba917e5d54691c85d524b6c43e535132750a3e45c1fc46458d3ca64e91738a22725a5118e6a38a4acdc04a1b566600668d3198e1245a2b7ce1810c4cd002304860c349e4285145553527ab34aeb48ed575a500d4edc7afbffaa32b922db1cf8abaea14a45394e756450901842fc8908335a0f0e5062759a7f053941e4750830f8c500529da10865394f6ca515545c5ea5b6247c14a5d69fdd5752500d42de7d75d256d897d3de5827a680144a112e58c126de7ceb9732e4a9577ce39f733b744170c2f4c796f537b3ba94ddbfbf6f61b0905ccb7636d72dfecdf726f9a89f92b469728eb9b753be7d8695893da712877b7db386697cfb58608fb73761b7f3b6625ccfdc9cddc43d902916ddaf89d034185bc2a6763acbdc716c80f7ff926d5377163341dc69afbac898875f92630d102f961a16f9280676fdfac8827c4d9102af4ec98d0b33797b92fdbb4b53bdf76f6cd4da7f9a0edae88761f576593d61730e1af183d90c1cfd8cc2dd1e7396ddae48f366dd4db041d8836bd874ed3a61db2a28a876ed3a636b9dfb0df721efab64e9f36ec379a874edbd40e7d063a74ac4decd0f706569f1d6228937d6fb69c773e59db9f8c31cf6b123ff7ac88e755955d3720f7ec96cfb469c619afab6e975b7e45ac4dd19dd3365dee7c468d7f5eda36699b84396742fa5f93b0ba616e79d4f6310dc8fde55314b5fda9ed5f1a89e6d97771369b67e7ba550eddf974cc95b66f693201ec520382cf3cf3ed7367639b0989ce7593cfbe9acb36c6b06fd83b9f2fdb178335e9a649ce2bf72655efd7777ac7adb64d6a7fdac6df84c3840913e6b7d4af476d0372bfce5536a99d339eadb0d226b5ef3436e36d5a774e6ad3be4d9bfc9dfb5820ee9d6f37ef3ce75787d4c5b0cadc9b8db66f5267bbd4be3e97079a4377080a94dfa128a0fc36fa7602fc0e41b1e53be3f181b2b76f9b2a6f7f6d72de2edbb4df3e3be3a9ea52e74edbaf34fec999f3e934206ec2f39af47c087de79c0db1dba40d7b86754b3d94aed2b6f7db7320f7d137e381bed3736e2624d6ed7d74e995b6f957eeb46ddb3697c4129b135ff936a9f21d27b526a8775e699bcd3f9f8c456ddf69fb9b15f11e6a4ddc3b7fda36897d331e575f93d8bbfad05f1d52153b29e6b689977f7d8eb64d6b6adfe4afbfc9dad2f6391b63ea9c478c0ce873e7ec9df1705ddaeeb46d92f3d9188f2184d4589cfdcd5edd26edf4663caf496ea7392322f5ed9bf1a498d98cb9379bbff3b9243a9707ba4dda280f3b67419c1012127ae2d96763db26f6f5d7a6f6f5cd64939cef346b58939ce3d06de69db73fdfe43b9f336dda26ad3ba76913bf739b36b13b9f8cd1b469dff9664f6ba2c73b49c96f97dfb58648fbf3f65781f8b9be26ad6f3684bdebd6cebed33bbd37aefaf8af0ea966d6c224e8e2d967dab43b04c5d0b3db7010fbec7bc3d5c77f754831ff2c42d9f9b70bb0bed95c22e8867d3bd6a615e30a5abe9db6698748d0c5b7cfb469bd9da64deced361c047ffbde74f5f15f1d52cc08985ba23bf44415bfc95fa76d5a31aea0e5d7659b360c30a4f1eb589bf8d7b775f6b4cdfcfade6cf5f15f1d52cc09981b00bad16727b569c39e9d9da64d1be9d9d97db4899f9db66987a0c8f2ec336dea67dfd6e1d366f3ec589bd6d9f786ab4fceaf0e29e607cced81ae6f151305f7a0082fb86818fa06ba02aa0555014d014501cd8262414f404d40a7d02b6809a815b40a4a023a0595424740a5a0512814f48951182a340ac3a8cb480bbd81880d2230a23588da20724327a191d0478043804278579e954783b7c57bc173c1ec625a99359854260c322a19164427c8c288ac105591a5215b43a40351124459443810852102435445140311151117a217885c206a81480c9112aa2c2e34466b5429a85810d5b8ac706de1ea7265e1c2c2f5832b08d90a322d32156429c850906591619199209b925d9155915191499141c984b037606d606c606ec0da80ad819d012b0346066c0c9818b030606a605fc0b88075c1b0805901a302c6059b022605cc09d816cc0cac8cf885d117e6956a0b110a44598858205a81480b910a4429101d413424e2816807580a322e445e4c1b8cc670554134031110443010fd40b485c807a21e5c564426442f5c24b8a298595c585c27e841e20811091ab000059c8404e1d94140100c18328449844501083080111862ae8829418c153155c49020868a982962a4c48c20468a18283151c444898122e6891821ca06ba060a069a06fd02ed02d502cd029d02a5028d02dd429d40cda065d0265032a80d680de80b466f18b5316ac308cc880c2068c26734c6c808a3228c8830fa6234849117a328465088c288de2062c3c9072a9075c9b2803d016302a60586057602cc04d814ec0aac04981558151809302ab0293029d8083029b02818142c0a0c0aec094c6886996f986d2899592617738b511a9305233546629842b38aab0da3345c57e0a1ab093f5c595c53ae125c545c535c52ae115c525c512e2896172814e813a814281328177a86e5c5e282b5054b0b161a140bb40bf542bd40b96055c1a282c5c59a8225052b0a16142c33ac2dd615ac32ac2658645856b0ba40d1a055a06b584aa06a50355034d0335033d02fb40c940c740c540c56181618d611ac21cb081611ac2fac21583bb078406140a9583d18916105c1f2c20282f5039a06cb091616ac24503016122c215845b098608d612dc1d262893112c228085406a333502e680c4662585fb07c60a961a56185c1028325068b0cd6186818e816ac275859b0ca609d617519fdc0fa32528365060b0dd61aa236ac34586a18ad61e486111b2c1d58594640b0b05838b0bab06e60d960c48675c5b262d1c09a8155a59760c1c0e2c2a2626d61bdc07281d5028b05d60a2c2d2c155829b05060656161619dc0328135c5bac22a81658545028b0aab0a4b8a35020b8a258515c53ac3a80956141614960cac272c211946be41b621d9906e906d906c9060a41a641ae41a120dd20cf20c232ef28b2c8324831c8314830c8304835443a621bf20bd20bb20bd482ec82d482dc82e320b120bf20a120d6b0a690559855115464f8c84a8154905c9454e4146419e21a1209f40af8c9630628295032b06728b34836e21d720cb904d90644826c831e412a416298654820c438221932091208f2087a41164112411e417720852083208d20b0904f903e903d903c903b903a9039945e640e24062915dc81b481bc81ac82bd28aa4819c81ac22652063206120a9482ee416f205d205b20592057205520ba902990289029985c4429e409a404e9157c812482b64159204920a398594224720a590512414198584423e2185aa30d51baa362a362a37546da8d85081a9d650a9a14a43b5468586ea0c9519aa2f55192a325463a8c45085a10243a5469546f585ca0b55172a2f1517aa2d545aa8ba5459a8b0505da142a3b24255850ea3a242c5a59a4225852a0a1514aa27544ea8b654665465544da8c8a898508d512da112a352421546054695840a09d511aaa1ca0855112a22545f5443a8845005a1f2a20242f5838a07d50e2a1d5459aa1c5438a8b05437a86c505da9685055a9645051a9b8a85a30b242a58218850b4429c4332214e213a2135807714b342396119b10c918a1a1b5f0117e9a64400314a02d9880048800009631f997af36ac763d4e926ce0c812497a92387264b2438249cf9123d772cf920d240162c204078e001dd1f3a30409264a8e1cd9818333b7209a5aa8995db6034a38c044891ea0243d3f473851e2a487498f909b9985238e28c1012643962c5142014047f42c59a284020230b19033afb064499223962c49a200349200ea00939e2556d89e1e0e1c5102e80850121d50d2f381d2a4c23a59a22409500f12477a7a38d0c394c22ac101264a8e80e0a7878926204852c46714b6e708264a303992e4889225bee708264a38008809134a1c71c4e330cf404289237a90e8319fb04e40d0e373c4891310f41061a28412274e7a20a04d27ec07942cf13f3d3e3f4a4ca0086d9ab13d40499050b2244913477a98e861c2082348f474a003498c046096b14e7c8ee849e20826ac1320263d3f3d493051e2730c264a385033b5ec114a9c3051f203e444cf11102c59628924477e7a9058a2848993cf114a2c39d94c31d6098f39844d72c4667ab11e38920428091249807a1a10337f1002254b92280152c244098eb983f5394289251b38d203c4c4113d4ef4dc983ad81f251480cd1c2c13259660e208124b9430b181234c921c7144c9120fc4a4c7031de88100123d4830b1e408264a984420c90f13dfc3c4c13ae95102a4e44789248098482233b12c1325940025f961028923404a2c717244c9129fe48789c7a1492a545fb40881e13735774848e839e576446806348397e0ea3d4a29757fbc36bb6ed731f3ba9672f246d7bb8e37566e2bcbc554d5c41c740b7158cc11e2d86a1d77dc8ebc91777388fd627cae1be3de75ec9e5bf71c4fc75573746ff7b98508b0625c553de77663e55ebfedb5dc6255c5ecb6c2dc5aebdaf5365c87cde5deaa5a5e761c63ec7671b9e265cc6195855558d556c4aa6dcbb5e524ef728cae8a514ad9db2d999b7bc41ca08a7131abaa9c9bcf71e5981dbbcab22ae79c735c653864bb1b63eced8d5bad73bb8f5de5b059392ba6821046765657bbcd6eaf1dd78ebdf8ba78af6baf6b9977fbdabdf6daddeb8ad775c52737c618e5cac85be9d011a3103a742ccb28e33e7e1ba37c72c69532f27bbb71e36b51f772579cf56e07217966cd198b98bb29740b24eeee7237dc8db137728cbda3e6de2a76dc8d312ec7b81b6337370eeed8bcccbdec96972bae7abbb79de36880d8cbcbddbbcc1be532cbe5962b77a5e465761c39eeee9c1c779dcc6e0e6ee6702bdffcb18e2d6651c5ccbd6e7723335b722b1eeb74789979f9e5e851e3606667e25d6666b70588bcce31c7d8cccd6e5d8c1de5b2e36576ccdb3340f08a9a2b5e5ec7046076bced3aa6b707c01bd755ccb1dac5c1ccd5ca0a13ad28e3dd6e166de7f8c149862d9b7b7977a55cc9cc92979717eb8e317616bb79eee6eceefac0bbbc38ac6877779bb2e3dd6d8e2c775900bb2ef632f3acb663dce5de5de9787b37f2eeeeee72efca1665bc8db3a3c831561c63ac7c543c6300e27b1ce3e3c1dd3172b41ef3004089793b3ac7ec1cb49ccdf2c6b8f1c5eaade38e0bbb63a28889e264b641f0a384077a3c1073ec0f1d5062c9910e3051d2810e28b164c7c8659ce841828992234c942449e2080e7040894a80254b94f8e4907ae881c40369c6c74c0f3b00e0266784c41225491c71046809134938d08344e9270990931e464e76ece0e17344920d2c59a2c40f007448d2f3c383a6c7e70890133d4c72e8e9c08e1b4e809c2871a2c706021d91c40993243f4047809478c0034a906676004a38d0f3b34495f949d2b3e4889a11124c7a965822c9919e0e24f95102c849dd1f8092fcf430e9e9c00e03f87152b33f8080034a7e7a9a3862801f0a50800120d1a3c385448f13273d3f4b784089238efcf434a1c4113d3f47923841e2889e233ff8980a3080258ee871724409a02540f073848eb603005242899f2348f4fcf420f1a3c411530106d0a3e40708004ef4246123c30120268e003151f2b304cdfee00125404c98f839728413251ea84098703015600003e8f149b264037ee3c7007e38e284121f003ad201264a92709224891cbaa7e78703364d30e971727f38c24409254e7e7a9a38e281233f4a0025394289254b921c0172a227872698f4b81e3023f4a652a989645357ea0505a5229220de54505010076d50502a28a8da542a15e4906c073d24290e0a0a724882381514e490a43828d548521c14947a290bc9a682828252a988648352412917c4294612c4418c645341a9540a3a241b946a24411c14d448368891a438885312c906050505a520920d0a6a24295e241b14944abd548524c541a98824c5294e4124294ea51ac92e9214a7520fc9a618c9a65229876453a94692003705de5df68093241bae695f691bf4428c307879a07e9845c8e96c177870841874e18b1b6a2074629f529cce04bca08104293790628a2f4eecd7970b0cbcf2fc379865fffad2a6f569610c056d9f17c67486e7cae8e25859130494e181d6f93b2382fdd60c117df55b37214fcbd68d7f49efaf2f4de2ed62e33f3eed5aa349ecd717a77375e9d224f62ecf5cb6c0062830610d6ac842c589b7b8e00660d410850e700084e7cc0ea9381d3e31bcb20fa7fcbe4c88fbe7b249bccd3cfb7c5aff640c2ea9bdb321f09d3b587771dabdb37269d2e95c5fbac4cef239bbbeb06fd797e71c4fe00285284e18c30dc29c98070f7ec08221b8808a2160716287599c0e122d5070852a66f0c2193438b1432f9cce07be9082136ce94210a6b071e22728579f49c5ea1e4213face363d5fdfe46faf49d02b0dfa649d3d6d744fabed4ba753f39c572e8176599f486fafea132c4f2a77bea7e9984377c2e9580ea75bb91ca8497009a733ebc583a449b0e6646935afd61881f97409587ed527975b3eeb132c462eb7fcc974ccf7049768d2b66c3cf4693dc71e572bd99e9e06d424b884d341d225e830dbe49f2c244d82d0b7edf2d029741ae80b5dc259d795aebaaeb4d1223bddd936093a0b5107bd72e751645653c4d59ae8ce53a75a136b8ca9d3d3f6276c298f837823e0a929e27cdfc8e80c43513875e5ce8d54ee2a0acb7394f3ca5f3522bd2baa5d3eaf892e7d4f9556136b11cb2bdfd3640ad4242835e94ad02b6d5d29459d6812f45897681274e841947ddb2f1f54a5ba6594d9edd137f97ca33aeb4ad0a9f3753a3475a371a5577db4ce9e7a495c3721be1d886f7fabb35b32452e98000b6378e79bb91d0ac3dc9b0d6ef9f6b95c73e2e8ec1280be95eb132c46d6218c11ee09f2b24797c03aac759779f7b4d0d708f4f527715d8c9030529ab44ffd37676f875a9cceba95e856a0c321a7132bccc25a8d73e8a9d36a35aed618b1ce6e642b0a8bab46d86145416747455f4f9de6728c6c121c6a526f908c2d395fcdbd6a0582a1ed090e391d98a54bed55dd2e65f90d0efd9e1866598e11f286359ab4efbfc12cdf9ee374560b9536d8f006194c61ca144eed3f9c4e4a8806335063073d2042185e4eedee745251aef84210c4c8a2a5094838f980832e70a08427e4200a5a9cdaa1f6641d7ad49e6071fe24ab31823dba11f6e8ae1a598745a044618f1e651dfa936f7f5c164810dffec3e940974354cbf796369aef753ab1ae2bd1871ac995da377314dd6711503204418b3294b002229ce1cba91d6ef9d521c8a55c8bb64420756a7fe23c8aab2348c0a9bd6b50738fc95db7d4b6e47ae7cf3b2b02baabdb7358ad447f99907d2b52fc146bd075c2e2dc6544ac7f752bf2bb38d637635db7d4f73ad116811f2d2f90e594ebce62be06b0d0bfac08fab1bae7dcabce311673b333fe3906c63f083cb71c8b2a6f41208b7f9e61d1837f2e7d03e2d737217e479ef9aed3b449faba8ddfb409f375529b2c5fcff9d1264b7b103a585d97b65f49e9d8fe48fa4ed710991e9fcf29f2cd1a30e7259a5ef98498ef43ac06a91c3abcbcd2f861745837fe89615656c473acfa44df9e3b49bde5322bc249ea2ff7b1fcf9ac9be55785515b2bf551cb1cd3523544a0670e3df3ab6ea9bf469af4cb27f3077da441810205cac8a5d8fd81f924c5ee0f9b7bab6ea71dd704f5236d4f32f5af89e389b94233771991e796bb6c8874ab6e99cb5a63f9f4e89d0dc96a8d5589605e39e6953f9fd8f4c11ad018c60feb66b9bcbc06fabe744bab81354874e9b2ee5f6efd052d9f6ab3a474e7b036e130d05d11cf65dd2ab7fc627ea8f10771eaea99c514361c7b8ca146e8becf9ab831caf8b105b2bba2ce8a784242bfceebeb3c3f72b56e2bb4877fbd8b13fd396b95b7bb2c08fbfab540aabab9ac215255f6eb19ce6d67ed35a9637b5cbfb222e6e2b46fbd16a759e8a3b68bd3fdc4f7f0afcef411a673a75980b23f1fe826bf29155434fe190b50f6ed1f7f9e822c1fdd498c0248a43cbf221440c115f7d070a436d544875ea44ddb0d05dab4919024d1a68d66b510d126dea12cd27878bd16ebb745c3cbc3df560c3af0b4bd77b41f7274177d971d28fef2dfb4a90987f959078a1f9d332247be3db62f77ddf5c12ee3619facf9c48c08e72c8873ce95083e3aeac9932019f4d1b7b71411ed3eb26eced7b71824ba23d2eeea13d69c4fee26e29c6325c2346daa1cbacd32a1cfb98d5f31aea085ceec10165e3e6af0699b363af4d919116db4f18637fc6661d6c77ad438cc6f26b43e5ae889676ff7c5126336e16fcca1b7e684dfaa3eec96abe08b0fc0af186294e0b77ee8acfdf0e2400792df64c3fcf4cd82607e5d93ebc58f695b74e896b63e1702cf319f8b01ba432a20e39d5b9606b1deac37cb9d77468408e696cf877126a49a6e6998bf8c880c229deb2e0efb4e63dad6951787ddf2a96dfdeceb5613f29bb83708fd7aa56d409c8adc6acc5da23d8d8753f827a404ed1cfc0e51a9c13717bf435b50f1a4dfa11708e1d995a00e09bf432b00f30cc6ef90163d781fbf432a40e3174803b97ed987e8a305b26de8442e395f5ff61877aaa8b138d1b3f73b55beb03eecc7ba75dd82be89fe0efcf0b35b33179d18b64094300634bec9e89b90cfee3c7210fbfb5bff16dff97418cc864c36a6fc26848d2943e26f4c9840094de8f24d903c7fd9e29b04897e03da021668b8f80de80a17730bbf0191600bf0372754f0410084b0e537275e6c7976ce864821a1212e1bb2619e1d6643fc9bf0479f51ab382302bdeb4603a18fde5e6541a23fdf71bda5be9ac26f4e521fbdd29a6c9830613ad54de09881d03f197079edb59f8d551a9cc2b7d6e33913e2df1eb52670bc0ad4443c3ad47cdaa3cfd63a13c261a057b0d60c790e5dc8735881e60e5561e381faabbab537c10f3df5da434dfb069adfbe65b4d082c1d3e409b9edf2bc8068442fcb41701a68fc7ab3ce9ed62f0ee209fdfaac30970559342a29a58c523a862411fb54019467af9c9f4fa8d56f9e6c04cc2b8d1dd37c2a677799908a48e55c2d13ba435764f19757ce45d01daa2286bf1ef3391dc69910b959ee5369dbe595cf4aab19f284843ef3f7ee37f34aebcf7ca72b0ceee28cbcbdd2443ed2b6ea65412a1755ef2c48e5d4771cd56a88542ef2ca4555ab21727de5d75795c7e2bce895b74fea74f6f4bcd2669af47ce4226d7f7136ccabac88eb31e7b1409ec3ac889ac5798e551e2291c642bf991016b212e33b4d9d4e4c7d5d7afe467593bf519fca2fdf2a5f225246b8aeebf29d9e0fe32c087be5b221955f3ea2c5793e5a9c27f46f719e07e8137ae2339fd6cceac87771ac918b2c6d733f5d3445d6f44cfb118d30dfe911e6a299616e4daceefa98d572fb96b65e6dec1b2b6d92f3faed5957554c23f4fd0e95a00d2314fe0e9500cc2eceea508234dee677a80464fcf3cd5576decfdf7318f40e7af9579bb830619ecf92ca64cb98b2b9ca1e372b62cb98f2b15a9941bf410d32d932a63cf42d041f6164720028430fab952741b2ae13ef9c7df6d39c6f66012b4f82d6cbc9f2b52284831533c882cacf0e5472a045086889f5f256847c980212849a3800942127b6103c8462bd9cac2ab45e4eeccead08e5c0820ea2504348e8b4f54990ac42cff4eab6c43b8fd1021668f006284242a7cd1a20f3b0a30de6946f5fefe1b75d6dbf6781fce4bc95e7a9f5823bdf5761852205ce09ba149953156d9af9761e312da0db925fcff96de6b7ed42112850e32a9ad4bed18dabf8f66dbbf0eda8e7d495d2e002207001842c5d84844ed09d6ff4fbe434a1778312c8008a1810e104450a9c93732932a707458a3e459782809373a84941c00985c588735411576a775bbe1d3a0a8b91e8b0a2765ca93d56141623d05d45b92bb5c39ab3edd090f36db7ac1a46b0042b63a8820db4f084982de89e52282083085b6c71042e3b40c3694fcfb79c6fdfcc880b099d9c57d1a61ebefd694e5b579af2ab43d04b713f2cee3d0d3a73056105217c3619ff0e5921060f5442196880fe789a70987f1eab4d93e07bee759be17c1708f4f5091d3be92eba8bee2a772ea37317dd393723180f6a1b63daa373f49ae7fcfd352f09d1a1c651428dff693b44c646dfb97bef9ccf389b772e311f287b8c610f723df36fc6d36e5d371731a3cfc919cfe5d39f571ae6bb4032873e332df5dbac329fcad7a7367f87ace8c1bfc581bd5a3ba6556e69fcedab49c734e99610f6f59d96755b973e57dba6af4f8749ad33e7d5f633cd47bacff4f64b9bcef2d900cce774de6de224f5996f1f70431b61dec96eb99205159fd56dfae53b6e4e8849ad2d7f3362526bdf4c0811ac6e4ebce5d3e76642b66e0eb320975ffe9cf1ccea7305b97cebe59b0d916f551fe9ed9b24d22eddd2f6b54d4d7e4e98bb40a2afc31935209a04bd089fd324e89b6d360fdd6d760486d9b4cee5d0855820be38d2a1fb68136d92b41cfaa56d97a4dfb48eac79a833d325e9d0d705bf01f1d06b16083f9c9666d324e9ee77c88a21709818f35cbaf3df212ba43c0d67d26b2a77df5f53d5261ce62bdf212bbcf855421968f8198dad6ad32459697071d6377b51e37756a613e26aeffad8ac8876dac61f75a05c0e058b73cbd7e7b4b41dea9e8d39ccd2b68b10cc88785911ee9d5fda9e7ac2ed77ce80d4152f8bc8d92f0ed879e92e23d2a3af7c6e8bb6a0298c7536c40ee6b221765e7a6742987c93a0af7cb321d8d6633aac3306a4b878e9d3612f0b92a2f24d90bcf4d92c126d4154d6c7acb0985512bba4a5ed695ad8a5edc9d2f6d4d990f658376e5e27da827e1767db211364f1d12f8d5a9a0b090909099d863c77d5654d9c8002c51342ffb34d8a1eebe63a2be2b97b1fe7d0371b62bfaa4cd03c10cdc7ba8bb33967e77cd89f56436403c1b7ef6fc6d3bed3419d8a0dc148300df09b366d3e3cfb76f3ecd510156730cd3740c483212aae4ce962b5ed0204611d4077a8045f3c0bbdf3395adf9b8d85be7dea30b69a11d4879f78e8fd1b061acc787ef6ce88b0d0475fad893784febaf35d20dbf39a21d7bfda64f4eb3b85cf795837579ff786f9d9d86a45283b3f9675ce9a7813faaedab0d0af0e29c85d8369013aa70f747d46661aa18fce8d3158935e93667c882269bc78c6f3e752aed3d92e6df437ffe8734b143acd4e9b3639449b368aa44dd18568d3fbe814e8c147c7409bdc47b75c3efef8b8647cf4e73b5d85d0c718638cbe37b1faec9716c31c52f9f3f9b4c69e563daf76fa49cb77fa69fcd2a35bbea5ac2867a535c1ffb426f82b9ffcb4ca67b72fcef3a91a50f97cdec4e6cd9d0e7b5aa579d5b26eefa547af34d7af6ed2d92bdf7152db6f82faf6afba6a29abeced35497a6741f8337fda937503ea6fc26cfc663c9957da567913f4973ca1277e93dea462e38930df847ce94fdb30770e359fcba1cff9aa7ccf9b4828503cf13f4dc4b7bc89ea9da4deaacfb96c527d79ccdf5fbed3b2fff24c6be2feaa354378e8a1bf8c07bad39eefb8cba1d644bff3d9cdebc30ac20ffdd25e5537feca2d6d634bdb226659965b55fa8e8bd1fde624f5eccfb11ae4f9c3ba55d5e7d526a8dfdcb30fa1dfbed3537ba39d7135cfd99fb756f3bcbdf2f934f6c9d9103b95b33f2d0bd25ef91bd25e55ce4d38cc0f10b6d99025862079e972dde779e5536adbfbe7ceaa3f4df68b90d003dd78e9ce01612f8b58e2d27e9a24e07b719e03c5bf7ceb7f6e693f9703c597be1991236ff94e4bad498fb7fcd29a24e079712cad098779cba5b6f13fabeefa789d0581fe9c339e58b7d4477f9a941a7ba5edaf436dcb78de8f9b8c7101f362dc419f50dbe78c619005e3344743a64f9fd8e58bf985b9e5d7a5cd3469ddd2a8b6ce3ea7d604ffc63f9db526f8e79c3e7b79fb89b8eef4d47ca25bb44dd32b5fe76c8ef8e7663c1b6368932ecf79cc39e3e1bae3769ab58ddf27bae50b84bfd27c71d6699b727e7d6ab4492bbf2212ddaaa3cba13fc79cb30750bf2a4d93d6b13ab34ddae8ec736e66d52df596631a6b98b65d6e5d757b7ff974d65c6ffc986f0c4819e1777d6075bbdc5ddafea5edb3e57ca7bbc9fbca777aa767d436e8ec52abe1da84bfaa366008097d0070bed26c9ac40f53154335e67b9a11d4e7790fbffd8a71052dbb40b69c872938e47a3821f4edd52de89f6f5603960b0fab15e9ab49879a047c98c211c29cd69fb6a1fef92c592f5f79f42de8a1ef06b1ebc3b64a1023cb03f15795c97af9262e4c988fd5ca93a02d63ca4956a12d63ca867a58b7e79bf5ce77dcd37af8c998d4d637b3c09631e5b43d7c10a760f71348f0a57faee0d24e47073386b278f1811bd8c0e2340031ae1802038c2c68c18cd3521650ac49ecd5af185190f1fcd40574a3cfbe3d280616bcf0faccb958caf1d826b57bef69fc9b5d604a9186d6c5641770c6801628e04817fc7ca75f95756f5c076602b649a3c907a09b3120f5efd514f302369a77ebd2f93b6dd80be9c2058eae33ddf6c698ae774644eab7769fad4d827e7d290d46d0c5efd008aaf86df4cf03f02b0616d8f8d17b93293bd3971191fad4b3b7162383e9321ed80e8bd099b2434d7b42f8a3efb46c534d10fee8b1ca678701fd63a74f29fa2ad6b0cb6b28c65c1e283f12acb0e577280842cf84dfa1a12c3f23bd9d668154de35df3cbe779401ca3be7f2ae02f53341f3db124242420f44f3be8d7eb7986f511031eb43fb16f34b7fd77f7e80e4ffcccb92efa5ac1b74e90e5627eef997483fbf3be7efeac3ffde879fff2d4e7bd4e0e2b4432d2e4efbd3aac5e9773a335d6ab740d81f0f66045227e87bf384fee02f8d0512c4b3e72c10d1b3ef12f608cf6e80e7e6476a12fba837393f9ccee5ccbe2d18ccb74d23f36dbf4cf76576157b99060536104de21f394dca81e2da0874fdd26a8acc795d97b310e866d94ca6b5d0b3bbcaa3e512027b82deda0f57629fda3a8b3db257ec982b718e2b71105ddf28b452af2b35e6ded4b8392f8ff549f42bfae54f2a9fbea79a2295d73c604f95d7482012e1677fc0f238e73ee39f731bb1272e22a52b3deeac0894e8bc06d61a232ab75c0231ba15fdc99e9268d2d3a82b3d9fd222bd3d9daa954b906892970f8aa9ee87022663097379a0d1e7926818d6e830c400e6379a30c090c6f7cdb743cc4df726fb938eab8f730935f6e7136a1be65c375b75637fd3771c37417df4a96dd02b7627b1fa3c677fdacc4809d4f20db33c1b02ddaa1b84ceeee35c7a673cbed3186d53f4fe09a3bf8c88d4479fbc5974970d811eeb067d9c470d3a67cf1fc699f3cd5e9d1cb330e736378b60fa3abb8f6c127c0fbeb8bda58b4081b85d7e68d866a1df9ef73a674458e8538cb5ceeeb44e2fe6b29a28352896579a1479aa7cb52dc8d2a4f871aa9a780fbd66085379583bab89b548e5fb46e849c6589b8cb6d43bdf718f855e2aa1ecb0df0dbc108318bc70e5b96eb7c5b46415e1ebae0b91f0d87557c1fb2c965db9f8207cf2d958b272cebd680388c936bdc5d937332333b383e776d0bc03cace6ba13e13c3e42a55aa089fab52650793b174777753f9f52a0efd3a7c8eb150f6ee6e2cddbdcc95951ce79c7331fae69c732e46df9c73cec52c94c6c66f6a8a48df37d242a7b89a15ac4291e2c7493a56a5c8d3f476ea9cd32e979a65e55ae29fbb186384afe6017bb21cb5432710480781e504f8ae71be5fe36a11ab7e104cc57e4f98ee3d20a5a3272bf75cf3ee7befbdf766bf7efdde7baf0bcadef0caef0b9203975f9244c373bbeba2a3a1f1f7a0a3a3f764e55e571bb0737eefbdea5d5de6c16389837959b28a901f3333efeeeeee767777f735459516fab1736ed961e17471166255b538aeaa6a3bba38ebef3de8e2832e466d9fbb7f75fbc0c3f8dee37d6f6f3a7e615a39c08173ceb9dd756d7136c2b7a49919991fdcbf39bf6c85b20b997b7d130e0384fd606e04e886e1052d9e170c2f6884d1052ddf4260bf1c84f48d99bdd9977d606666e9b06e93a4b74fa94929233373e5eea76d4bb0675f162c796d9bf95d93f42db6ab8074a5bdaabe26f56308b56daedbf5ec2d3f56b56eecb05ecfd6fbc82533cfdc98abc17421b11fe6dc4f883d0cc62cc8dc261ce6c130e5eb020a2d4e77df80b26fbb73428bc32fcbe23c7666cc1e78d8a1bbbb75a89af7c801079b1a1e3b6874e4d071de2d5da9bb7b46e6460c1d89326c5e96ac227cae797749dc3269cca6a171ef0137e7bc9fd4e12dc9ca91d69febd65eb501b773ce061bbfbbab31e6be0ec11698a50630cbafb373a82dbf575c965fefe79c734e079306efbdf71adb480f5d3a57419f7315363371ab78758350db97da12d273ecbdf79e7befb9f796dd833edf7a14428aef3df8de7befbdf7de7b71022fbf60a63e302600e7709c73ce6decc3b9e7bc3801800088a58a24f9053d5cd682f1eb3b561c0fbf39e71c57a1ec3beccd6fbbbb980ebf39e75cacfcc6a64955a4a15538e79c7b22cc69d64939f43987bebde7fc39f7790e6a4efbcd39e74618d3c039e728e662305737da23e6460e3237709891c978d6d76666dbddc5b139e7dc53818e4743b3edeef2d891a38647c6b3bece39e76ab6dd5d9b2d8bc30ba40c0e18c9737ed0dce891438cf7a08e39e7c579331855edc60715558c6606ce39e774c054401dbb71ce39b7c3eef260f5b0bb4bc2dc835e6d4f96d69fbbcf74dc0e8b01c036db75c7825d0780b3b98101c068de5bf2e3df7b3e305e0165778e310e66a9c05b4072f40580d33e08809d9b39ce391f30e7727c10008e8f0000a044ea81871d6e74a89af7c801879cc806b8623e2f9e5da6f1ec95d3e2d9636b797608e6d91f5f7976c7de5c8576efee48b66963df6ef6daa4b644eb550e266f217b0ba7e1ee11055ecadc35bde73a08e85b8c31fef043df628c11a8df8af4b92c031a8617a6ccb8cc480b9da4cfcde03a1dab4a9127e91dad48dfa2573ea3269b14a366f98e73e21df42ad68d1f42e803d4efaa74996f962eebba9263c3cc18ebdddddddd7dbc8f17672dd891573a371a2d10ab128916889459b6402a0bc31648bce6371038af6b813cccb21688cbe437901655d50261fe2dc6759b73ce55516ebbbbd6b6bbebd63d77ce39e7e6eeeeeeeeeeee2e2683c9ce9f4fe79c77cce2ec5b20cdbc7471b8b9ccd95ed0a6f2256e692a5f86788a175ed0f5b99594a29a21599893a9cbe25cfc577771dcf3f10e0b8aa3c1f03ce62de664da2497518dafa0eca4efe659175b8435098a6a863cd76d027fc59c23a6ef47dc216a735dd85cc65af4b220d663191dd1999d19c9f015323338640e793343696c6668f707de3dc628f6ae3ecaa36666b94ca1b1a112073601dd489f430fe77cc7396ed6b220d67badb5470e38d8d4d4ca63078d8e9a03c74cad55a6de88a9b5d6ea830c12e672bb0747f159815699107e4e717d528a7acb64cf11a21db6ab56a2ef34d4f6d41a10a7c8eca7e7ccccec3bc4679853f26058bb97f1c08ce7b9e6e521da52cf3398bba6f75c07d1fdedfc3e3ffc40d6b766a0de35ad6fedcf6577d76d6b7fb535ed55ce86b090d0efd077ed366abe63c063877b344f470e1c3352a6af37f4e3460c1d65a297bd1c922badc4e88c799725ab7783623107040089475ff29f83c1d3d23068aeb97e132dfbb061bf926453c36307cdb20feb03e0b7802639e726370771621fa850765e9c8e0f02a05f0a28fb4ea321c48f997e6020d1a475867b042dbed7ffead6e45d2db927faf7b0e79a5330f31ee9610f93a49b1c1f4d5a8f18e708f1a35905db8f5fd7fc1ee96f9ab4ced92e4e85cf3df79c73ceb98de43ab2f7e877deefea1681f7a8a3c27258d866bb4b7ebc2f0e6be692993437b01b52e63336311915714179b4058db7086b52166333c48f17fc98a16912e602ca4e69de3d9b1cf3b26cf85f9d9196dc4a4754c19648d07a2d7057235bda6037bf9ebaf2ce9fc62ca0ec6fc972714eb302ca4eda195e81642d28fbba8e1ca37f3d2a8c390789c93539dfd6b7493ebbdba41c16c6d63531aeb09841d1c835ef94c1903cacdb3aeff13e0edea882b2b7cc25dac5c17161ec72759e6f9b72a84ee5cee5ea44facf47eff3a2b6aeb4bbae3e7f754ea771a5751cd84c2623ba318aa13466c422996c06c34133735c3a2c1ab963f2c06a86a81d6ba0cdc3c1e5f0e3d7b97b38c65950ea74a2b74b8d46c331237323c78561fdebbc0cb38c86aa80b2b30a9ec8f5fb76e68d9c61dae2ac3bf7e2b74f11c6f4b928e379759ba4fdfad3f153fb28e37970f4be7d528cb3a0fe5b0cd63752f06430460165e72c28ff0299a9444f93fccfb94a6c5e9648e4823af53ac919f201eeb4c5e49785bbfc7abb29bfee7ae8d71f642abfbed12bd06db7fc3abd025dbfc2f6ec35eba9dfbaf5b7cf2ddc54fa8b1b7a3c056e17766e3a06ed9aa263d0f529ab28adcdc9f79626adf3777d591667dd2ac3dcd8db39e7ba7bb44d98dbfb76a2ae589396f43e6e51f4b36349c43fef97fcf817455d6b86c46fefefba4de0b999d13037a62c6b86b0737651ac9fdd2451fb4e3bcdc6ccee3d77af4a5733c4bd737e57370a7cf33b2f338ad9c6190fd4bfbe39e6d6bf31b34f13eead80c0b9f59b19794242ef3733c24242276764874e8e9fbb598ab9cded1ecc82588f05edf6b916b7c86de0d937e917ddd13c01dd5e267f5cb1911e7b4de2166d93f80abad1cfb220d69b805e4137f9d439b5f9e5baa5b6e5f2ed3c85b6f3a769125f41d767cc7331313131cd9b43b4a57ef45db723cfd5714585c9cd39edaa95e73bdd1a104d5acf713adea5f57ddea4f5f5cd7fdde9ac195bb0a0e1062590620c284ea92e8ef08420d4e009617081c2697dd7e5fade2c77e1ad0e942838cc090b7429e429068a941fa71897429e9ae6d4a45333e6ab03458a1fa7cca5c893c837880029323b8014d229f32d4608293f4e996f32bfbecdfcfa5b20bc4ea7691e07e76a45c44570f09d9e4f28051e980512c4b73f5fe77ca3d17d34e9f9645afd10a249cfab0a8443e722d04dfe06840e9f9e0fe17472d8780a652935be2d181bdf58a8876fbb45876fcb85c6b7edb2c379f8eca1ed29071d36d3e948f9e76fa391358744fa079d339e056c8c90377869d2fe103b4d7a43597016236334c853feb9eca1c5780e1a9d1a3f0e1a9607ec098af3761ad7e1317e23071eff7c331ee94b8940d9d937da43739e83d6ced9e53834b96acde50ebfa0ec1fa39db8f4bc352852f86999009b880bb0ed1841448fd59dc579ce43a0ec9cfdc826d26715b25f0981b2d75cb58873ed4e52226d67b51481028587d338941daec3e7ce02117d8cb746ddd28a34e9390781bacf1c07a740e638d41ae938f89e2820f21a596b8c88711c5c02318e437d82c5483bf527ce635c02d471701cea9376ea7bda537c00670fa82912e30fd8538c4b607486a1334ed467d7687be2a1ed6987b6279ab7d18a408932f21c0eb5c5e133ae43db13bf8d36f21a2d87f3d070f80e6dc6693419d7a1dd7023f60445c66f3c604f50629c3a9d6912d58670a5e7315bfef90d2eff5ca6cb3f9f49e39fe3f8f2cf732c987f3e62a11cda9e70687b9ad1f624a3ede986b6a7186d4f54dbd3484b6dc65364c7955e8ad234e9f97b1e4499077b41d9455aa6ad6320507ebe374f2665f5880b6dd224f98f67df727e57cbf33a8dd37192d3c9d992d3e1d3fa10441431d2a6caa9d42a0d5b127bd4e49298b4a41dca71faaf3659e2fb9ba0beff7d376b334d724e9dcbba5d72cedb5d682e0f7407cfa137be198f6c52ebb8fc1bdf9c7b9348ecce7d9cefe03b4d6a93ab9b3f0fde966fa31dbef5b87c13f1f02d87e95b56e31b0e986f988d6f36efb689836f3522dfae1c7ce331f2cdeae1db8e772e17c8f319df68a86f95fba623c6b7a8f996e3866ff0ab6f38a0e3f06de6657c733af826f3ce7b8144d7e15b4c0edf6e2c90ca9dd30542e3ae6e3cb8f3c983466a52bbd3bc49ed3b68374d6ae71f50fffdcd7f089267f736b91dfcede03c68fb2e2322f53bf864cc5b874feda41deae6cf156bd20dfb806eef67686cda9ddc125747a13c21e72d25a51bcd3bdfbad475a89af7c801079b1a1e3b6874e4c031f3250947187aa6ce656ec0771e43ab773e125def3c9bef1c9bd93bbf44efa4b68be3bcd278719c47ad17c739d4dee2387f9a5c1c579b423961d930ae10c2efc05208736fb649855e643caf15b4f28d185b417b9fac9ef3c357fdab9b907f5e2c0e14b4f22931a65ff0c80c7a5141ebcbe2b07769d2fe36a75c5f9ae4ea86e49d335db67ca391bed15eefba45bfba68d13f7a8ff789becfadbad154b91e5bbbbc643c5b97faef38a701c15fdf69ae82ce29cf3ea7b469ebb5a5497c692101adfc4a63f62f108ddfaf6feb5797265d693489dd077dcf97972b8d3631fff3a8c11e6c97cbcb95469b96e7d5a5fbfc01c16bcbb3effa3e5f4f7d18266bf1275fd8cd4ff7b0d6b09f106b8dfe8c15d6da6ef929b1d66ab6493ffc1ee1a77561adddf839b1d6e44f0c6b0d889f9916911c61adf54f8ab536f333066b8de6e70dacb59c9f32586b7bc6cf99a12d38b0d66a866cef79fcd625335a7260ad2d183f75e4c031239361736d44d00bf6817d95f0d381b1f533141a3dcee85cf342917b9bc6afa77e2e14dabe5910d137e130abc66ae167f55e7fac5b93ef872dd0845910d1bbdaefc58b3106a1775af35655d5515433047ef4fd8d3fd69f7775c510839687d6c39a21ede5d971bef4b31976f9e2a8a01b4ce3d96b88301af0e7bae67ddac76c48ff16818aab4cf7e04f476cb50dfb6d5bb25bc890e5817a56720abac1216b0b4ba195ffc49ff3c793111ffb81bf840c5a3c5083d129f95334341ac397076a329e7dbb7ee32874a3798e422b9f31d86a5b7904b4f2d4cf1bd86a3fd72fd92dbf4d92c156f3df5a33643d7aac1b172ecfbef5e7fdb664b72cd92d0fbdf8d4cf196c359682563e7746e6460c1d89320c078e87c3352f0dcde863dd8ebcf3eba7b4b0d53427fc9cd86ada0f3f336cb5989f226c35f87384ada6fda4d86a3ff0812004e3d9674c15e17bae99f7c256db23fc9c354178767eed2747793f5df3ba7511d3f8fd3728f48b678e826e70c875f7e3ad44d08b9d9725ab08b3e71ae31589a2571feb26e49df5e5395b121ffda3efb8a9ed6351db7c7ce5536258c6133322525cc46be25ebacc786415028826b5b31a94d3a01bfcf2edf00b5ca34d60dae4a2cf2ce3891818226c7cbb6be72f509765f6556568888a19a87cf9c2891e549cafa3d54eef3a7fbe1a931fef239dc1d08d8548406cebf8e892c3ac4a6a9273d0a5b691dec773a755756195521688509ba098e1dc153eecae18df09f85a536471da7f5b9d0d630a31fcc669a0dbae01e404ca39a6f2c0ccbd59f2a30dbb580f7e5b827dd71b36507ea7499b36757d4d6ae71c30a4b4be31cada8e97ee05633c6b3d3c6742f85f0e8741dbf94940fc5820fbae5d7210eb65caf74e673c99b64910630c2fb51da70aabb03c9f4fa334f8993fc1af183088f23254cef0f3614fab69f7e14dcf5a4dd726ee0d6250b1e2570c2a5ffc845faa7cc9f2ce60e3bb36413d13391e887e6b37bef829b1a761597e5ad8d36e6cf1f3c258ab81be627041450df4998f3e27f6b48b0ba19f18c61af4a7459f8bcd6c4515882665cfda8ab1051a1e3a9f14831ae402d1d06017e8a54bae00ecbc06ca0576699d3d39ae1b14c3bb9c0512df3905da04a5bb45e39def9499c1914307cd8e8c081e31427f427316c87ce7f687d39939ce7579c735c772e7b08bd3b9dc89dc4ae6908bd311552d4d7235ec22dfd3a5d570ad31c2f2cc2570b9a83e997e79569f603132fdf227985bbea7ebbab09c26a981eefb466b8cb8dc7223d3316fada53c17e8e59d4f4cb3f8c41a44a349ce316d4f908bd3815aa0162eef7c4f98961c2def7cc7f910ce739cff703eb51a7659c3ceb5c688ca2f3752b911e956f50c04babf3f2c8e73e7310378e74b78878477be69ef80bcf36dc7e72c8ef39de634d0f62da7d25c18d4f9feabcc3f728440997a1da3c65c1ee872f93972ce57ece430e8fab2e4206ea6fcba5b2eef868cb6fcce15128958bf75fbc0effe73af45d15f063321fcaeb745d16b7cbc060dc35c7823eb96fa1f5ff9467ab8f97898f3d0377fe81b8dcc929caf893ef44d8a3ca6d2385a492db3a600aca56d3fdef249e374480158d3ae3b51dd2ae7acc2ea6156c466460406e1e51756494db2bcf2c82eb5f66ac90f5897fc2072a3ca124ef02d7fb39cd9500ad36da18f1fba1109e846f36c25d2389d587dfc8804ed74a2b3a382f29b826e4bc613d1a66d99406481ac66d3257698f1b83a924285f862c6e6a5a916827558887d351f39403469b98c605f3331740d49f11c045bdef9ae8fa26cccc2b3f9780d88d7ee23a74dd0d98160587fe03f7f7589ab6c7079a0de2d91043b6034344ee34e63434363e3ae699cde68d207de5b0ec95548a1ecd036d35390d0054f294118151758b0af9918fa0dc305820886287b30e27f3a59774f99f2ae1851e16dceb48b8d2e396f3025007381b982febc51952e3987190fd711951115a703b3802e682be87681b9c05c6cb4ce55a55e25a03f8fca3b2be8cfb392c1294e27abb292ef9c680b92fe5efa3bc75a27f36da64b2da9f49e4259ca95db0c11f7af5ac99c354c3a9d0b8c04b35d605245e881155e689981174ae0c2024ce0032158d1c5161a58015393b190ce2febb6818855ffae823e8fbec95195264d99511b8daef04fe1b78b8a0e9efd655920fe5ce5b70bcc3bdfb0e71117ef7c9bcf6e6d10a317ac0f6e3a5fa32b4d721eb5119526017dbe8da88caa34c9398cafa0504a9ba46c4be094771863f1b029908368cfd51a5a1ce79716527e93531ab05cf807a73c3b674d05b57c3a74219e2536e1307f392f8153fe79d4ac649ed51195772e5fb669ba73ac4dd6e5ce9f170bc4dff9888ad39127e7a32b53d00d4ef91d599a4003213cd10518639c9cc32b4e27891632b84214c6d0410970704a0d218c135049c3942d70c1859373a885d3a10015a4f0032136ac8104344ecea76b0cc62a625646c4c56cb935abbcd898d224dfa00bdeb9d47649b1aa563287594c713a329370ca14aa179826b99642d9b70bcc28cbaf0e37ca30b1148182a1b01899a351e523bfaa11916315b5229f9ef59c8ec5c88c3b67f67623ec5d8de070aca230c7519dced4ca9f3672aa893cd350588c60a931e2f9c88dbccbaf6a84baa8a290b852e5d4d9b9ce8adaf1918f2a0a8b9191bb8a2ae24a958feaba6aade9aee6b852e5a8ccd795640c8d71991c19dfd30ddf1357bee3e8262b975ae5321a0a4b911b15c5a791538fd19e2ce1315bd051652157aa2a8fa142a3437f82c2f2803dc1579f40dfd3c642d89e322845a0448fc22738a47545711657aa5e456131f2a8b852e5af3a476131c2ee2a8a1d85c5084f71a5ca1d95af7c4a53e12c5fb1efc9553eb53ded4d557d78a65ec733300dfbb45c6a9bc8b7916f976f986f996fd0b7e9d1a7e889dedba4479f234a7da4f52f7dfca24b24f24bf4322c9bc134fe6b4e87f3ba3c5e759be49c7fc7b925a47f3e1d848dbd97f1bcbac177da16dfbdf7aa28b4c23673ce419f55c6036b86b0fb0744b54de217d7ba26863514aeb431be4ee7067d30cee0c07264a3186ca673b40eec697307d638c01c7a601ad64f2c1445a82bad776d1df806d376c09a871e48b4c40303408d0d8f1e015d9c00602d050ed65108c039e7a06fce238430fa807514ec1cccf90173d73f0780ed7bf507aca30c00eb27dc13007bee1e10401400db6cf747014a8e04a123399223b99273373ad4f5e1dcfa581feb637176abe6d200581041085106657f42341494fd0059911d5712ea28680a8025c0a4a383edfc308001302019cf0209625908ec740004901e5500d64f3494b700aca3e82782600c211c62779fbb7dd8e6e0bfe84eeb7fdb73e7f36970a13fcdfdc2fa9ad4ef78b0a705c19eb6c17f0fa7a1a0d2955a084624e319027b43a000b27ea29f8075eb87ce415765644e527ec874ce0d4dc663b41b4e4693423ac5f82482c56852684e313734297e8af14904b64e478a3cc5785f5fc5f84e0b002733c23e622a75a5574411458aec34a28528fb9b46643cdb6dda6a86707cf85b977d1a31ea0278d1ddddfc9efdb914dab4ee9c6be8a0c65d82e4e438f68e2f3a237eb8d2fa7c0ecefcf623e3e922d0209990390ac28bc3ce45a04489225d895dbad25699106d71d8b5c59196902098dbe9f7642684b4c564425ab4a5beca84503a324248f5cfafec01239e982bd47fb39e7db39e4fac310cc3305e297a99902aafe5eb12411712617dceffea06f4aea620c72bccc9d75017b298e59db317ca5dbe6c9b7e8036ecb5585b6276ecb8523b4b6dff09a539cd387be10348712fac1052724e330898f1f6a8c50249c0b7731956c70957fac286614d95b79430df6b1883f21894a934294a8f342e35e94a3596f3f0d4a9c6aa3516a0f11c6e0487f3a8282c96e370ab1aa1f11c9ea3a2444b4801963674504548e844e3a9d30ed7e1d42d1dda0e4bc70e5aade4c8212b6b8995879e40250d0e8db940f7c45cc8011868c00221a1138d2bb56fa4139626aebf7c07670d10f966f992cc6b8844a74eeb96fa587d7f3e9f188f4ecf685273d9d224de02e52b549ae0e20b5180c21b5610862c9cda198cd329e2044dc0a20a4bd00114359c523a0863042b6808021a5edc706ae7349cce86418a33c4d88119a850638c53ef347bd102e534a83316e873196334d6d226cb69e5214b632d60f06f3cb4a57e54198c21a7c35dbad44e99b57c53e78c87d6a5fc1c4474eb8dfc69917d885934fe18a73e9703749380862a7e00bf493803979f5818cab0a48dd1f00344f90cdfbe7117a971a5d544b73e3ed46aa2efd0d015cf63605e5519cf0db7fcf9bca1b1178dbfca789ee57d39e69b8cbf2edbe53295d3b85cc68bb8dc47c66f342073ab6e327ec93c191adfe9bfa159a171f6d23a34fe5c0b34c6a9eff37397d6e1d328e32e3ef28dc580d1680c4697baf21077a1427831f483b34037f6e2dbd98b368d2a7be12fda64552b34dece5ddabb6e97784b0caddc4593ba9db140b794cc1af0d887e8af46f621fa8c57da34f2fe4d7e8cfedab404fb915b3e471a5fb134a6c257a023df984a15dfe90de8b7496f8b6e39674122536952bbb604fb51e52b685091d6047f1a50a048e1271d2e45ce2987e3f0cd886462f876ab6efc9715a8ac56661cd3b8cba5711a52b20b9ad45a689ca7381d9aca83a140ade83ab45d026cefa3e7d0767fd8e247c7a1ed16203ad4aa2545afb4b9a4e84e389dd196a2778fd7f1d1aadca549ed52f889d3e802f482612f4d6aeef2f3dab90b7be1343ad61ff831d6255f3c503f128ec4e9cc54ac4bec3df3dcd1260a71df847ce8b3d29e476dc580e2837f1afca121297e363b2d2c4e7bf51e6a3b648436fe69d673c6c35d16a79dabd0e55bc7739ee3971b8d630d70fd09dda8ce367d5a1688e9ddcd470863c59a242d8bc7f29d662ad01b41480f2f17235f413758e5622e74a3ef86f8ca790a54cade60162a057ad5f7f37ea34b7e6051a0b0cad336d1770eabc02bb08b0502a955a5acfbfa6110623162554644aceccfa524c72c736fb6def22ec6f85a070a1618dd4ae651b322c54f99cf6dd366b3917eb79cccd731bab380d6a14242424f9cd6675a87877c7596b0823d5ea34b8edd553706bd2a66a34d963bbfead642efa0e864beb594773ea3fb1fdf16b66d82d8fbb5b04cc3de4381caab66321b79ea241a69393fb21c918f3cf3186f309ae45022a74d85bb8b982ceb92f32ec5f016aa69190de14aceb5547e02b5a26fabe5346377ecee6d12cc84602f17a7ab95cce18c1b1b6643aadf82bebdca8258df9e45165d926db2da252635f763d04a6b2a1ad4fa8a1328acd257e6c4a2c657d0adb388a48f0e9707589776fd81ffb4fd57975891e22751199ef396369dd1a6aed224e7ce994beb886a5fa94da549ee790bdd7a280b2a60b4a74e22dfe8c7ae56a8a74e238fd149390b843ffafbf15493aee47ca45157722e3283eec9a98f5ce49be42d4d721ebd7d6334def91469236da4eda95a11f94e9fd1a41eea92f31e1a6a92db9348cbbe6091821086304548e814a3a1b018716884018b30275175576a2a599c0e0f659c000b3680a20c3a60c2c9797be17452525800061a6b50a38a2a579c9c3715a733a970021bcc08c21a5ec23839ef2b4e47c6094868c20f8020a54b104e6ea60b149cf684a57d73ada934c97919746b2a194fe54da54d4da54d3543b8a672f8effb5d45a3e8f125f3d6a2753277de5964daeb123b7ca83d933597703abca5e8d6828911daf12e892e395fc22d69931bf9b643e45b4ce69bf53daaeb4a5f44755dc9957875b0ca535cc97977dd96684834814237c5e9f01757723e7d9374ca3bff3299326de72f6ed64dd2ae8f42c152b9147ec272d58de669689a4a53712557554bb382f98c9a5665e5359ae4220b9e47e89cf7509b6074a7842dade99f50c692f637faff84226c69bf2b8369d29726b9fd8dbf1091f9fed2a62a76d4f6e19736add126303fbea9381ddeb249da54def95a3142dec04693f6f75de6f7083af0c1f316a7b327593759d58dc6bad1fcc65b3e888fdfc589db7324daa42d592e0fab15297ec23c89d6c1dc69af4bddbdc5ea1a2a9c3f876ec9727996ef7ec8748210b4f8e5e2b8ccf639e276cb65b9b47b57ae38f7e07b0f4608218c95165ac418630cc24ca0dbf3e29d4ce39dd3c269d15a5a0b18307c85af643ccc041ac45a6ef760ac640b695f876dcce52d0f7dfa8ce58bc4e95815a84bf00ada194f7479c518d46541dcb73709c65fdf25d0cd1f022d8e163a83a44dcea123d126d99ed3a6e7d01d3a741af7a049d0a5c65e68fc4593a003d13a2ca54bd06d6c6e6e7cf8000288dffca1109b108fc4e9005595a13409fa1574e3a120d6f35093e04d93e014fa1cc9590c0a210f3d8dcd02d9875ef96b138f9819d025cbe5a557d52ae1c92675ac3222aa8c01a9afaadaecd67318f4396f915c1841df3057319f8901954dda9ee9c926f583f03dc89babbfbde713b5a48bd29530e82d25a5fbea06b186d023cd4357c5e89ee9b9d6b67ef6cdf97bcd3eb0633d9d86fdf6bee1db311efa6b13f47689396d003f9744396340ea5dddfa6b86d4cc34c95577bdab4bb08f3f1df7ba277a75d907f6f7d44a63ee0d8341b705638d6767df472d107e76a0050cd13a2e242404c5c9fa754a010e22fe56818c29089db6edf25be5c4c6af7312e8269f97b3fc665b977216797110eb62b8fd0109f3f9d356cbcf3469ebcbe4e2b4afc623093a7fc3beb11df7daad05b24c82275e6322b073ef39672435cf533fe3329867974f59f93a9d1b1ee3dba6918b7cdb94c371501daea3e6d0b64938ea8cb64d92a937b46d524ca5d1d69568dd78caa86e934435ab1bc5ea2667dd68aeba51ab6e2eeb4653d558617dd539ced1ef065d6a1d29242424b4e5d4fe74b61f6ecbafce103b3bab9393b33aeeabb36ecbd2ddf23bcd50987bb345a1774e1f6de7445da2498e8b4053344e874fce277cfe846efbe59d37599ddd2516c87be7f0ca0231c0bb65c33b7ee29df314ef7c42ec69ef3be3814b9ae41c117e58936892a3a1afba28b425cbb353eaae3489bbe02a4d621fa288d3a171257649290d8d3367013db23b76fefc55f67d1aa753c495d829531a9a7f7b7229a1130d33f310aec4b0ebcc566cb5609ce56d61eecdc643ae779bf0ed9bf5ebbc3a3c5b6a77d14fa6cc5ef0175cb9075cb807df4e01245cb870e14265e32a7c65e32ebe37d6e2db2bad0b2adfb1cab7b3161fd62bdf48b870e1c2053e05b870ecd765eecd06bb382e4d6a88468567c033be7dc70dd12e29dd7688ee10dd2167a1af614f3df33fa1bf3b06588213a8f0b30ebb5d36753a43b8523ba5a14eb3f96ff4db37d26f543ea47152ce07a525a8e42a95d4b1540d928e29433334a3092001031540303020180e87c3014dd6f41e14800e90ac4c583a1786834914c4300a32c6184380210000621001313a4e02ae6a5796a88645c8e1c1062421dd621917ad177ae3437826b7353e20ee4f17f6de84f349a3ab6e4317c767ec0833bc2c0e9db270bc8824b61a14de6240448cff32cbad1493adfa35c9a10d851c4b6c4bba45f6da3f13cc0fa64915e47e8ca2db4b025d9156ad67e768c8dc98860fb86618e6bca550f238726dbb1908572284af9a8785a8c96caf2a6e8312ef75f0896aa936972bc3d906a5e8ffbd4db06fc8162dfaaf4ea3b12a3d4f0af35f66261453b4b903c1cdcfe3b2a1f278cdaf412320ef3bfd58380ede8a089ef176bca149cef8a63af1c96c3be4ad64c084def62ac81f994a400227576467aaf1ef0be2ceae4086394c478c9642649a2352654484bdebfb47e71a5327232d8591b2693d91c28bb82fa8d713e9cbec699d70b11682212fad251dd8f514fe7c769a4b5ef8b9649c815c0b4089b0cbfb5f1140d1f64eaab603465bd12c3d76b0780cec349799a1cb3739fb1d61aacef293663bd12ed8e0d37d885bde9f398b9ab019e40a68f63e2a50448f88b6a2bb32edb391a4ad897ae3d18cfaee8128ba993137c765dabd32d6efcf1506b9a871b08a4b62dbad0759e17d3bbc84b8e48bd5f60e502cb723fa8c5864cd70074be5f4387b75bc817fedc574ebd1c6776c1641776bf616df5e9bef8eb5d103698be84bd290ba618c20a8bf0d936479695df76c5e469a59d92cffe8df8a0ec2df608a343903c41adf9baef775867d1decfc35efd181a7df38b4566cdeb62e6d2372078f55dd8610a438d3a82056ea25f8cb89b02a575889a017f9afca1cffd98a37ee042d8962c98de6dd49ae94430ff798bf83570e134d87a23c2a41f9282c4b440acf221cafaee8e7aa34d145311033ba4a906107c95ad35c80d69a147d5f6b0ac26fad096bed5a132458586be273beef18b363f13241722536c9da4d3e5859203939098e6644dd505f6bf55a5ac3e1dbf1bf32b43dfe09cc90133cf21151e8cc6f634186d45ae86ab7d612e8fa79440b3df4dfa4ad0cfa046bb437222b94f447d691abac8869d36cd763d4da17b3e22099a2710859c7f1b6a3bdee718dc718b888ae0726f17ba68eef5127ee50183879e211619021f96497f31e7d6d82207be69d7d11d64de148a72309612149c84b07e48fa5b80f1f187442c6cb36002adea56588a383938638ba598dd4fb47e26be0167eba085996a5ef2ded9e9a5bf78fb77d5a2cad4013d8b37fa575e55221df1f36fc9d14fe822939afed4ae50f1911c3ec7edacaa52a61cbfbdf3e51d5247e988305f03003cb8685af7d4db9f8fb74c453e51e93b155a9862227ec35865cfe8ed83595c40d4cac9cd4cd212f6082d738e74e6673c81ba4d2e7a6d2b85e3923e59d8381b208285a0e420448376c8e901a3c6d5c9905ea5fd4184acc24cba426f853d80196e819a5a843e04f5dae84facabee27c915566a522cb1cc33361351b560f0a7aa310d0ab553940eb2f72830e3d5de92af60010480e32b8d3b0c4ff1819fc12041fc8fad857aabf19add0a4323336b68b27c03e467b0a70ca8cc3b2ff350f138b731778bb31eb67a98fb81d8e74e90ce41c6b4085622fc086edd14e190a4d8356e8861def3699497471d8d721b58e89c8c45f319fbdbfe2a62fc622a02e7a8ce68818759ccc3038f9c4cf1c7a76f464e5e875853ace5aad2b3a03542d76dcb848cde2d294e449731b4d0b64157602f22238b64488e3c5168cc6f426231dc9e2d632bda66f66e6a797251c9d9d60f0ffea82d75db566654e1e169bdaa5998f0d0b888bbf088399d0917baeda588e106804a494fca30cefee788a9c9d042796f9ee4e066de42095fc94f49f62d32758112ffe5ce5d9a4abc167a96c130c09f9253474f7506a01c2eb480e934ae911191e40405a413af949b3b662ccb8b6f4e578e2c332103898826b44583f42d037e4503703e0035d968393bfea68ebe7a3dda7d9fa8ffaa1a9b39ae0852d93c13f58a9c75842716372c2aeb54522d7450a62502e6e7d7aa9f5b6f1dfeb9ecc55c38524653af24c1b8643bb9db272bd0f5905049973b052717cc3114968cdab99f1f682b5b07738f07749bcf9f76a65179a28216fe086e414818dd4db0c5a9c8da4de6aa42c06aede54a938bfb0a0217ec59276becc5d53d516c5c1c82607e67f1a3091b53e20eed7b7632d50abdf2a81d3cb931a0f0b9194f543921dd3f2142fca1cf9119cc45a661704654e9f25569b525f0f65a7467c3f35dae50c576839052d08c3313095340977a107f494c0345e9951c498e4adbbedcff51aeea947ae9698988b78f1ae4c1729144cb8c9d26c2b064fed359a9a0efb4ee2f42dcc430759fdd5769a0df79d167292ca1384bcfc005f563245da1ff289bdb98e8a8f63e314e0e885e6ab4afc0cc43fed0a4216c307eb5543c6d94703f4b14eab074e1a298443f31067d79bc0ea37fc47dc0f15267d13fea20554b4b02131ea5768248f4ffeaa63a6de8f9a6699320d6c69c35336abd94f88cf284321e3b3d55aeb8fa1fed7a36d4f71a6fd43c1347e7f62a18e131881e2d48c0f1a1aed124b34fcb424b05b3092459bc83981c9d991375f8592a63ac5a3bd9bc8abc36cbdfa38b320f8e1fc801e555241a680806d907bf7068e2a9e58054513ca0ea16b8440d1a12226934e3b5f7fd9895e83bd906dcf0839cbc5762a02b4b4a40b146e55790e5476d8620e7faeea25f52748271429e501bf97622d31711da66a768d6e0ae326430aed1a7bfe9db474c8502e74157e587cecd4adb5f2d84efcb15e970181db89e1745ecc44503dc1f4d8ce732b87a756f9d108b7f98cdb4504b6a6713ea5ca7bfe48fd963cfccaccf316f8f3ae846d4e2ebde3016cc10e8ac74568b36b9543705f8b12e1f05f998a8bb149b0df9f7998f8321abcd6b40926ce71ed64cd661fc721a508927b06af721d0bc1308c6a6dfba81bb49cb1dce532c69190a222695122f7ad66c049bba54c6f7ff62d5d01c26717a0586958f65b284ec88555fc0e2c9b42b47bc97a4c31592b387dc7ff90c515624324fed6a8c1abe9fc5a5a086a64771c25b258d0d042c1d2d303eb24d8fedc3e6674774ece3bd635f7cba9730a5644fbe9d83f3c2c61e9799d5c8f242965a0b204445af490254ccf560e078598bebb3f9a584303a2e24c2e291d079b1603613b550d7d67b23c460072a1a73637f82078325670bcd7fc1c3fd6183e58e3557427a45120ca9a6b603d811dcea4abfb99b4c3bfee66bcd799873b0408ae0435e83595077ee4de57b1c6cb8abb50081938c26e49a843d1808dc649a8f136477ab7d795ada3f1564048a634fa68ad7ad2a340802abd9e42d57246d75ba33e90ee5eaf65062f3dedac50311a0e62fdfd9816a7c27990cf96ad157dbbe310d390f2ab3ed15bb17ad4b2bdca96de1700298765ce776a6ed8e06bd48da2333176c45b97d694fa8ad866f8315c7d4a1238ca6338358c767f9b686e171b8ac38b1d9a8e1444edd1e9b75458f8d2f66e012eb09a3a8340da90124305d91c3a64a0c4de17e0e5c7bac317b1c8e1a6434821c3fb63191d3317ab7299761c750fce51448b47c9865441db5bd73d6f21adfb761c1fb9e12d62cd401b37d748258b3baeac3f8ea8f833d850e1a3956de33c617b7ab4abd6f41c863f8125597d57b38dda9e5260e6960979c1cdfdbce30db8b9b86573b79adfccbe23ed89482ba5595b3f784b490e65c6072f5d1da3e6e1f3f4b21624e45cfb3f42e69d9816e19c204cb9dde29e7de821b6cc71a53ad47b292953a941267aeb5b02b5b158920ee2c83028e87618c0306f29c534309da3e0b759cd6c289dc35b204c60b38730281d15f4ac25eb5f8ebe26db566f85815cb34d88d9af1b768235306de1ed690b91203930c59ba60517fd0fdd05bb70cf65fbbc1e55fce37fa17a03b8fc2e04f9c53e012dc96cd326a4df53558d4bcaa0b9a7b20283830552d397611c9c32e66726e70c44fc6a3817ffdd70a7404116ad6e3ebe54063332f1b328bfdf5ca262c9d5969aa3ef6ba746ca0636df0431fec28627539495ed0afb1c86ef62d50c4d6a6d84c9ff4438f61a048a617b4c8a78c61ce8d353d884d624a4084ad4c10e6dccf9ecf67fc61ccce4f9ae2a9f5225ea69d796abe5a3d4965368fa41a70b0f683c73f46df5c27e66003195e4f72d68001c56c2088b9b6886832dad8da180d97839dfc10dd3325374a131599d58e5f4837b25a37efba00053f3db4e5b1b3c6ab8f18bbc7244b50ab81ef2ee2ff6a2eb0571fe32ba7a8f0644683c68496f0dca944c420d6247729ce6876916930fd121a08a66868259674164cf4a3e9e853b1d7e545297f0247cfbfa1d5c7a30380453710852e33e5bc6898edc2342f2a0848cc37d84c045f60632380441fc07627dc9c240c7fc089a26f2c8373603414a3f3bdaca83b25378cd28addf62c0079182255188acfc33b51172e23f137837680174f88e5f81e3aa671181bcea6461dd6ec2535761f6d0b19585050621a95ebbac438c5098f3a8d8d6f8cf1cdad878e509d43bc6efda486fb295916317c4b72388cf1117dc1653c8d5cd649cb3d37e2f00c845e271ae79a50eda88d188ae1467d22fe7b2239b2f1efc9b8e00a4037f2106e4bbd6c7b9e7ee3ef9ae0835ac59b1e931ef2b0ba8e6c4777aed6711b4acc0cf33789c85eb9954df6e91d0c3868ff51635542e68c811b36adda365439508b39652756abd6b6e611842809ea547ff5e58974950a0619da562c9dab0021a50b33cab1ba3e1106dceaa3119e6b18914df9c6d4d27e31513398cca3933428867d276990c663fc7e66c19ec8ba7b707d6654eda07fc695703010081c9d8502539d24b9a3d5d2c9deaabcd7691635d560334a75223b9c13011d28cacda1f385c600f54075f41185464cdc528be4c0026d64ead6696ec4f10019a5acb10a5a909368057d8318eec6b04f8d8483b18e11a0eaae15993019ee77734712c30824cc53818a6b79c217793fe07fd81a499bbe961e7995c149d3739a11a423b4b3fd8bb612483a10890e7b2afcb9c97da6490ce32bd0c8229afa75b730d0af1b22e42f84166821f083d498d1c6abba98c8b7c5a8161b8ee1978680baeb03c92f136b9112d4b86d840c7986ca8888070a482e51d76b85711da0ceaa1bad9f3e710cb7e7a2ad3edf98856045d873982f78b239cb0ee3b8f585e8fe14cb06abdc19ee7d7bfb3d7f18db3a5d2b291dcc9985dee7f098b14d581ecc76df11edbe4828ba8c416223efeb29a5529c4fbb0ec391ccb55b4c7e03851292c10e07a206e1b9209e04287f13a9dfd27f85094cc0e7a4a94f7b46fb67563653a0e0d441f89c720cf364a5df6047dc10344dfea2d564a0b1fe9087051ce7fc0e99029b68c8a6abcfb083f38194e69c64e1e93add4971589df57667f00bffc325758acd6b46b148de89c50ae49b1d4567d6895695f18683969f45a93b4fdb50d32946f1f3c84b0ce9935b3ce747ce17b8910c3b17aab2ce4a95f6f4ad512ca8d8fefd83cd7e0a307653848198011e344055f20769afcadd0ede830939b6cfc03f4c44ebffc41d2b77875d110b849bb6b571d8180f284e0c3e010361dab9e6e73e9ac87c8cd60a53a4f96523c77bb85b91f8ac6f4a467cb8cd4acff7409e6151a11222d80732aac26f696c06ff02c6f96f3f76d6fc2f534ece471d0be4aa8ff44a2b8943feb26c847446ef24a494dcff1842e3cf22fbdcb4ab5c14493e99ae1085309f153ffbee96e958d55f0cf43061a30883098c32b8f8460224c7154400f47ef358a6efa82eeebb0e75c7c614031d60c30b00065af4bac70d67b4277082794e64400850823edb11b86d55e58a4ec17d8c427dac46b9aac1bba6c9fa0ef3ebef6498f5ed9787a6fc92c565e32ee0e909ded8de5042e3aad9cf5a136cf92dc22f96fd228002bb7c441250942a443247e9a908ef983b349ec8a7173034a0b928f31b99fa35387a9da799943cabbd70b116089157ed567bb32b0a47bf1ee7768d518c3c543eb83b7c58b04cd41a07293208f5789a808d6e97dcddc215c9d4bbc67fcb6c1ea6c5ef39a4b557ba17bbc7d1dc810500866a1a8ec7b0e5702122fff1edf54eedd2a8475ebef58c06225150d17c1035eeb933879c275a558a9239e5a12d36a1be504dfa90a69ce7297370584da0461ecfb423b9f8b8afca349743940cbe4ade77763d60dc16ea780bb1e2c9ebc037d4e0ad960186815616a299396fcda662f131a7f6b0d52ed58f9e2161a453e77dbc5685e3ef4ba663bc2c7fd7140f5f0abcefa83729e2db5ac43f18148d543c8ae41927dbdf6b19b5c0ec94793914f9d83e84c0a2df47f42c2e974a8b097da8cfe211e4cd4d103c7bc698641636f55d5989b812e80f2766452552fb3d40649a8e26f1ed5d674df78ac9f8bc17f47062eb2fbc9de199e1c8a5b45b1e88d4599e006f1b4a2b6b60e84ad711cc50da3b51ade1778eb89a1c0aaf845df354394716122cd6c43ab19920b2daea4973bbae93d3054faf77c4a7515e2dca3e6141c3b686c5a12cddad160cacf6029259b7a81c8a5703829ceb0d81579f7556d54bbb8bb834466dc345db045a80db010b9b6b5e0a35bdb790dc81b68c8535c19a1bf090275276ea5e6402c69c2067726f435403204885a1a6672d4ffb2c8e2deffa68f12c23d7606cb69a7a022dcbd1b7fb23fe2fdb899c5b7d919efd69f25c7d1c947266bb25caca6e85e8a275ad4d2e014f9a5e11aca3768c83d7ce7fac6bd76b913ef065574000aa8c90b94d3b1960a4966cf4909718610833f3d0460216bf2395b7b5bcbc2b5be8bbb0de60076ea601426f403eaa02eef3f2f636b60499e17afbd0c53ee5ae2d4ee770707f898b041a0d6a0acba5265b7d46713a4d27cfb2e031bfc326cbe71bedeac65ed333c6e1efe626df78fe277ebd0b1f8d8d444ed3432849cb2babf5fc5d5c6c7fa0b89b4252a9bceca06ae168880904525c7f77955d6cbc1c99355545dca5f9003d4c1b0e1b4acf80d5cc27da53cd003dc2677fd15fc252d09a57f14674d1da74e253a92e97254617c8b7a8f2a9902d9c4ae47427c5d2e7f5016601e6d6bf2e15fed54993a60343c98e1557571c83f86d0067916b517b463e380b49ee2e7a09dad39f10a0bcfb7511ffa37f5474c701dfbc7f1fdef9e1ff76bd4680b3fcad5b77adaa6c4ad510a0976a6a7acc1bdb256e4087d0ed836be9f1af8ef4a3980cddceb9ec25c36480aacc4fda6992fd9d7d8af22dc931d32d6b324e2d30b90c53026d21d97d692ef91fcad644527ec21b91f7e2c0c1b1f29c52aa23393ab3eec0974a9f9514d9ce12a47a5ab4b9db0d15cbd10d4e1e9816d4c7369904b6a82697e41d9d48858bd8fd169e129b396f1bb083308347a691fe631354525639d3ad64a2286d6cdd4d40f27265071ebf878df0652f4893a54d6e2b4ccdd88d1f738bd4302453cd51929210d567547e04fbac9ac02da83dacda97895e3ceb57089a4a66136010d9bc8435ef829c5a9760cd540f3dafc3e103faf16c5c8fef58fc65a8ce2001757c05c6d98477b48f73e905c1c84034d3c588d334870ed217db951f186d3736c8da81f0e0a8e0e334736ab918445a1e8688c377c9b46b6d931c7ee166a23291d72a19aa5a227006645d76e8542e9a474d6572623c235f5541aecae896868738c201dfa883ba6fb94b97895b2df097e66bebbbab050a8d509963158abc17c25296e4bc7932a28c890e40365a8f84bc4c93a263b20fe0cd04608aeec49354ed6601c3348aecca052bc323d825522ce124037fc32fa402a11d80dcfc931711d96997b4ce9e6b220732163fcfb6f6ca57cf67350b06e70a8026d6142d6110b9a5006b10861216f4b15e2caede167540309ae8eb5e68fc3d2dac718f694fd299c294462beda21f83042774f7ad55fcf4ff26098682ecb51f950bd15d16bd90ff1f9db214a36c7ccb2b1c7c57bf3fe7f6d52fe509764b7eb7c770bf9e46f5bcd179da693bd0b84484d5df34a85321b467f22f32cd0f4ff4c9d28c4d300bdb18e17878125f2a1d9963a58aab9169744a1123b14b633a57f4dcd083fa92f87ec47c1556821b23db6da2878dcdef9d6abf9346825014182c98fbf957ae787727f15e34a42d59f7cdf40b31cc135f3155aab0dd435205e11e2e4314afb67ee873ad0da82e604b88908c6f570d1de018bc6e0ae639a08361d351408c6e001379f649aeb212595872784176c53ba49de501c0859e82fa1c585434c3e18e065488a72591ad07d16d801a7454583dafbaf30534cd9eec56da85b168507c44e45a68f576982cad823eb4bd01d7121bd1b2e937d2eb9ab33726d2908a5eaf8c950dbc990345e6a7dd2ed9e9dea6528f9d9e9322db9297c7e4becb989771a138742c476e58f992bac8a041e2cb0861b742341b4e446fb81863738c08ab8fe8bbe86b4df4934f075bec4b9bf115219887ce2b917c49eb3b7a2c2bfa654d22252e0a771945ccc3fa6943dd2f29c16b845b3f91aaa54148f4faf169745e8fdab530221dfa5bb07eb564e614b5308c610a8141a77e4a0b8d9aec6ef9e9c4a7901d13793114a7ce175f46e570759474edcb5421c17870008db2f2cd36d7b80d5a145cd122c0b11413540e7fdb565aea8ca1df6fcc05abd34429a5da4b8e05e805aee67d82185f5f7a6f319d9b06faf005fe237ad50549ff964ff0e12f56433bcc7ee50d01c0923a56aa2fbc7fbc3debbcdae4d141bd26fb195556e610d9a84178cd731b76ac409590ab9567ef846a409cc29964225a08a7129618ff5f0c883e006e844a26b3e507da61ff14c4eebd89e444d9ab902761c23756c3f0642e15083be6880fab75c5e6434e84b8aa0b0388eb9fcd6931818b9a1bb59e3c4d065a838ec452e04db193ca8b91b2200e62680cc9111b61b9a0bab71b6e8b4c246cf24635fa6f4b07055b2472715db1617d5b9edb30c7c88337faab8f285aed1945bab7c4141c866a5dc19af4988211977e473271abb76c8cfdf5548580ed0d8cc89add8fd60f7b82ff152f76b021247cf3ed2cd8ac222f1ace8b6d80257adb76bfee3d8ec5eef29e09330dc1e0c70ad773fe3ce4a30fa5ca4c0577e00a7a0518c2110d623f132125e331bc009319b3fcf5554c84844b85a783ec4c188983dbd07bd5b1e947d0c04fccf3e7f715897b97b2aedc04830a1c139209f2b440ffed98fee8cfe2f82d76a03a4ff2f4c35714d9d56ed0d2d38d34f04647470f53bebcbaa2a2a4c869ccd6fad3e01692beb3c8d8456192f6fdc73898aa162917d6b3d291ebec5b31663235249b10d4af5bd983ca9132475e1f1408bff35e6e5437cd970508a46409a64785ad638d0ef0162c563e8663451669323e58c47b0a9931e8029c1a7bb93de5d0071964cadcd923939094348c10f771a86bc576102a4807b7f76ec8f807bac7678ce186dea8091164725821a461a53e7da551f085e4c549b20df06033ab54ecd1dc1661be3c892412bbf51f27a850238892c149ab3f5adfa073e5b4deae522359a805e39370aa8de44495b58272ebd4cc206fc633f27d683043ae1d541c0250a6c7b9a589a4ec30e5c02c06070dc480014c94b40b443d7f5301fb09c05cb83f7142a014430ae7115a1a82eb6f0ba389a58aedde92309ab91ed629f1bc25e47a96a709130a766729a7faa49c31a3a7329429b6121c199498ca3211aecd55954a5c4ce5af27a624dbabf4b227be6cb60260b0c926ea9bd0a0243c230994054ede927ee562525870536fe1671598af0f0eae924b795a3dfaeef2805dc92d38e16d74e17475038d7a123411263b0928fd3dae6b6120226e1392036d8eb5f849f8de017a60ff72cd75b4d792536b921d1d8afe7e0e2e9c5e7af84b7d19dbfbe3dbdbeee1bc6e4b1faa54d35810eea3366515aeafacce3f4f1e48034c74804389c38fd3f442f727e03fb18142e5176b6f6270502752d229584e5d20083ce854508d62b99f1f0aba3d684b7135031ec1c9084b1bfb2f910f9210eaf3ef6d26bd608c705846002ff65fc3ece5262d3d6242950b12b0dc73804b08c2ca67e03b485a99ad325d11c39f5c915de2aa2c209bfbfd59518d329b1ed645452c9412a770551de1aaedadee99b8375d695eaca34e1c33180cd1305bc73feb81bf089236e61c55250951a821653efcec6e37b2f13e2b53a4277d3b13f116c76cd52227a08ce4006541d432b4f9ca0715d9581f50f243288a415add50cb2c59198deb0d9b8e83e178dff50d1e0e79a2236ab8286cd08cd47838e7179db0f582040a861ba89239b47c820d45399a4ea12827eddc61b42f5bb34ced97708f5c5a3d7cfaf683eeb37d9775758133eb045edc6ee849114b5353e93f8b21ebfeaa4a8f35f8da25b266a086c41ef8c2faf923f8b71886ad5ef56234c3bb2fe20ed170b707ab9e042e7a310d43222531182ea865c76b2e1fc3545675012d1011a187971802851ab4f630f48825532733ae19ad9282b4f57db7b6b3c2cba9b416bd990643ced4b4c72c16a7379955df715566dd60f79cd22fb4d377d3711a82dbf9f9a835644fe07e074a9101463389e48ac40c970bf3ce83e6e5c61bb78b118cfe26bd471c50e7cad8ecb262780a048a656edbbd0d81640ec572ff1aefd645ba8a808d332ac646fe527a9f9e71e7a6f1c49a2d3d301ddab452b5bb206c9b091cf5675f9b4f570c725448caccbdec84d8463b0b643d6122971a3d2e3e9bd04659466a32038f48a8e0a4fb06b629410910713061c30a127ef7dc82b7f7fee2eb56ea3d245fe9cb606141798e4621550ea47ea781b5a1017c786b1fcc69b0b6351f710e6ff06e9676aa6f852a90f22d962736167b202b00e89a436719c3a9ca58d534cd5293a15f005fabaa4d2192d0c4698a9aaba69a7b7d6256d90d772c2eaeb406506907ead2c3fcb43486e2d1776003da455f5a5e1f7acd310ce4fb7491d4e88676bf3db83737c818bd34f811eefff168fb717a14f5ccfc9a48c3eecfa4ae115fae19a7a371b6c05e2a47794e2fbbb5e6920d40653f7839fb25e0089a9935a2d6f63a8a9ec57a967ab6a95304d9db2b40a317e9fe368c20d5326c3b2c5bce789876dea874182c676bee7b9452c547592bbb7debfe09836b66a88155970367c5f65b0e2449e211c233d5a1886b899b48f38ca4e7519238ac7f9a89adc7420263291ea069d7e054722a002eb937a63fd0d2cbfea7160dbf0cd0c052c2a363e1da2f612ef7fb5a6406fd9c03d43d72b437ba754588262fa77b2f8b7efebafe79e2093776cf6af6044a20518844d3cc27a79358488369e22f60ed04c7eef7d4390d57e4faee8f926d2da3c90ce8c4f43ce8ed85eaee72d21ac4d206d5ff05b0358f4e511291e8ed3b01a95475c84a2096a6e0c7b90a747e0525e220c20fc337d696c1a9c20864ba364cb811938a71862e2eee3536e43830ddb30f3d7411a459ffa9a599f61a3112f1d023fd0a9310f1dd060fa98143d31c326ed27c1631b4affb37f9c26313ed02e3133246fcc0ebf4004b237b592b22a9aa193567dca9818fb75dc8e665faa1e8fb07718c741317f0d264425bf97e3e4f7ecfff0820f19807a6a266c720515a87c88da56dfdfdc112818fa795113dd9f2da5c655db93caed1a2897a8e1daae84ffe242800c2f20779915f978d75e2590f95d229d56855349fb93cecc2937e77f86c615615fa61b32b659a686b806b9251339ab712c3c2f0e4bfcc075b0eb64635634da2e8a9c7ae5cf2d465c9fdd29ce0d1c2ff01483c3fb2a0f70c943f7ad1c2c05ddf0e5ad786660c57d393dfd81592bc79f18367d7f1dc60a2079fae5493d98241d7963d460b93f93693d1929a105f046087b565dc500fe4311173f35f01c1eb64f3218c05a31abd7f0e737b97e4ec35bfe3cbeb5ba29ca10011a8fc0fa466bed9d9cbc30e93e71a52e6cd177743b7b07b13790b0735866f11a1e256a47db9cc5a84e0d7e62148622a0734fb8846a0f18b5988b5283ee13f42a5731f9ce03f559d9b24f35bd1ea851e6fd3f48238fc3cfbd9505601f3d9e53b540aabb65cdf0e4ba6d844280f670258c16f213092be7e447d96c592226f4f800c4b85bbef01fd0a90fd44aea8d3cf67895c4659234110e1f4cf832ebad1616c5f9a3d3ee6ddafaf70870498fb4eb539aa2fc523cc6390b1ff73af37e6b42344c5121450d7d1ccd390333f40bdd92be2dab3abc148fcdefd7f87d16b4f0081b1e4fe29e494faa70af7c51a663aedb27a3aa6fa86fb5cfc95e6f19fba4421c86fba2a25441a9e257a1ae6ff3a4794d4d342a57d0cf1f7ba8d3468d4c121371e017d53dc65e5350ad2e808a0e853bb9f0146fb2928ec25d109dd831ffdf2fc19fd382c1fb49c6258055918f504c62c86ca87d3041239136332dc5fb0aabf796f829ce8e51d4a615c134a0b8b0b6fc4990b4ffd29f6946260a901e220433c6825ad6daffb816f58acf22c60565f66147fe98819383692e7ec4ccc7790820a27ad0d0790a0c0932f287d1a83451f9dd010cc9eebfe303a764b1d6344c932db967c47acbf2d7766d0bff0e9d092d5041b31d3a7cfaa00c369e2bed7ea2162992614c792decd0026cef72adc2cb8ca9406429854ad920b7e2520356a28d12616d5ae33d9c38aa4c452194b36d3ff3e3f1bf42a9d9763aa88f02026f4a4ff57f5be4183cf6b10c81aee8ad5fa12df2263ea86d218d1ccf7008a399260c094e3e698ef7ea8777242a01b942d6c8601834c287f40e90ea552cfbac350b2d5ba0dd22467ecc4e722a2e7bcc6b666ed46224b9f861749b2e7b51416629b67eb3b54ba8f3411ef08b7c9ad8c9180dad11c5e5ab9bb2cbb1a8610986171dd7d6410d3f87a1f4c4057d6c6fb7d47bf06f63eceee0b729315235dfec8fb5e70fb6f9994cdeaa4ca8d5231c8369a232ae2aec25bbc32108bc84b3d3fde1df1cd8d264c59e0ded24dbfb31c5355ef950184739869fad205fc82336d91994230c5e800121785089299088a47b0867fc236d0219395839bf5281f023c2681258a9e581cf04bbd9e63415627ba13621f88ffe8bbeb5bcfda3ea75b79887ad0b4014fb788e2bba0e8a3c3ebfd4129c3988afb19d5403600e7e39b4d52f0638a9dcc49b583413a9491f6c583bf5d2b983d3f574f8b8323be6ba38806dd3d29e27f1f0a10380fbd06744b41618d5062a71f3c78c3706d838a2e0f7a27c4d84af2c144476f69f12e2e86bdb5cb1af7648884330b64b5f87ae4515ccf87dcf6ccde2815c5a3edd9ad73e06345d42c5c0b46a638761657ab8665f51c3f1750afccc33772c3a4fb6cebb9102b39f491df15deba7a1be91e744bfd7164acbf1f641fd7bd3cda27897bb41a83efa2b9ae501f60b5edf90d29852fdb61abccbfde82e294e047c765063cc51caee1a56d9a284ae100376c92f347f744dc92d079de01d29ff4e039882aa3a790bdf35b8c2eea4b48243ad58b93e8d0ffd47d078bc889047274a8d05182901160573a7ebb825d6dcf91d21b52f0798658ac8240111cef75868102394fd662c5475be7e15510f556c47c71ca3bedb531494351ce0d83f92f5260855dc892a766180805a38c0d5bb12a0e7ead6b5aa5d921652d7673f6c67bd1f9d975cca97407bc978d4baca50a952fd7c20d0c3384148c4222da578a23c6c7c61fbaee3fc193f0d4b071b636558aec419bd72d7598b20abffdb61981e4216f0e72ddbf52cb0ee6a56aeb3db92582b225156770f51ce59dba34c8a39534e0151a6fcc4721a416d24829a99e5fd37c0c598cf7a78a29d920a7cd8306b5ae331fe2818be446e3d7a51e871d1f2a56256ce39ab2357bcb27de70aa6fb391560999318b95641ee95ab7d3759e619147094894b14756d37c84fb9e300bec4c601444901a5cbbb5fc3c214efad7eca0df993fe862d64689ac249eb445ca21b3f9b1432d3eadd52411da0650e2cb508103c115cda884f6ce29c95eda1b0187a328c3254d7d0391aeb1610c2f51fa6dc12e70daefe3052f4cfa7f55318897632de1895ee03d83f59eab10cef6bfd338e17fff070470438409e4c021cb22b9946e49143eb259fd19578862f75195eea33b89267f42567a608ca9a891d7da520c89cc685c90e777b2cabdcb6cbba2be33187ce4b3eb32b7b065fe232bdc467b872cfe04b2eb3977c6657e2191ea5eb1d8e5f0d25be1775b8a7a052c0c79b72e0185ec6fc3f6a10e6914a1b6e0de2ad1b266ce4f6cd6cda3645b6f33d21786733434ddeb90ec654229346c5858f0fc928a2f8738370fa995570bb85885f7d92676284336702e1e63e4241454a2f4681b4087d9211a32e3cb6b08a8154793c623b96ff2c8072188087151f58958ccc319a0cd92fe969bde63d6bffb26c956d911db8e60ab5179850cec60cd9ba644172dfe51ae924d3078f0a149fe94569d874a161dbc69ebcaaf02b1b85c8a4cec59192e01392d29db6aab2c951d314d0e9a53856e49357842e216ff00b786025cad953be24d456a35658f24cff3b046651bfb595ed0eda6b8f630ef20b68abcb1e54a55f63ee65751b16234ef031d059e67d06e8e4c875db8bb942840a3c7704ba2523c136ac4ce0c3090f796f872c65bb0d1d2cf9fe73ef6a1a0a40db742b5c8b3b8771c0465125086b43b06aefa158a0f846348803716064ff24047666a831cc2981058cd08f548392d382fc74e619a2a645b348080345a2e1e0b0a8bcac405c55a7e313faa9bc26dd5f279d577569ea4bfe71678b144bc5dc7bcb70487aa33e5d3c0b3abcd994d2db5506427e0b5258003fa761957787d1fc4b75a5c1512eb6cce436aa0b1d975f31393834aa82620f335663bb89b5c0a3ac234809ed49fc93d05143d5ce463ee1a6b554642c20088dd101f6f9779f805516bdc02f4f4183b05f1525c039ec47ab11704123e95e7440da037f20e5d079e34c910934ce08d50c6d75af66c25972804b95e4badc21a52ea6b1cf8950d0272134cd791887b2f35ce995881e650e76500a76196fb5b11fca2d805cf758a8250f6f6a6cea7c17dc1f325c9bfecd55ed41dd5326d40aba3977c005ac43c9a9220e10cfe210cfca5b67c8f87d2d03d7ad23a11531f9ea410d6294a84a077613f5be5704662af7edd293564d1b084de8438c607709a0d24f4d6c91890d5880c3a559aa032d752c06330d88a9809a97146483c101e54ac7f706bc1e382db1da813f0f9c428efaa294f72cfb90f5ec8466c160e11f38e38387f8a6b6901d039069882cd3a0ad88bd9ed5ece1f407871b9a3e54dd5adb7d0912a9fc47f86664850eb4af1381f5951a387b52f5fc1e686fa896402a5eada48c9aa11c48db663574626402c43416128da5532c90ac501ce0e365c51d78631328894252993dfe5218abd4280146e80f7a9865322dd92bcd6e3cdc19ac7766233cc7c7fd518eb91b5a531240f0c2a796415c9cc0ed288ada4a3ee8f537f744c1b9dabdc1aa751296fad304fd750bc4f4a03a53797226e8654e6ed28b05f9062137b1cc817a5613901f1dd70e5ae9b9665990623d6c47afe0565a1ebb80e214140c832c2e89eda9658a2e2783ef4f06020b7c742d21a45fd2d39726ffca8d4fc5b1621264a1b7f18cf6908e22ee79bd878b965e0647599548e6fe64b94e298e7f9f24c8144941dd42070ab1f5f92cc4cb9090824adf868fd549759e1fff516b1e17baf683b82be583f831e2b5370dba24b757992e36f3dd64452f6cd5f8f7adf1b17246a6a9d24c7e8790509e1f0509d939606c3e4f7c82fe4cb3d0fc1174f93a38b8edf28e3561708598bde8b502995a37aa7cdc6348992fa1a06a18cef8b94895b1ac2583de216c699ac581338d612bd0ccd9777120e554e411ded7ac70ee90f46bace0ebe8655285d1cd89c60a146321eb26015ce9a9484d96474d8ff6264f68d48f8dde22c1871d37bb7f2230747e06bdae0440cd5089ee2ee8f66e921a541f1bd2f91d2a463bda794362767945aa3b01b5c38d1ee256de90c9f4d47c78ecb5f093eea7653ac52e92a7a49488996c247bb4414ce4f374c2492770cd50143058a1a8899382e32b26d17c4ba8b241168973df5985ccfb531dda9fc215499da9b3219a08359fe4258130016530c807e0dde51046c42bacad837ef8ba0f2814a2b36f8860bb8110cddc53441b7c900d080d9f23ee46d028079001a70b75871b5f53a8d9a297b5aaabadf47d99d6e95f0d5e2a9720fc507ed72bfd55b564cd5d33b05834717220790e6649407a98822f486d4686f4b4f4608af05fc8de0ff99c89216aaf031841cf0cfb00cf247eec27ea51c4318eb96630df1fc1e6680e9c4c772a6fa2285986f323a5952e1fb52b171912e596b29ad110da7a2d02c65225395054c0337ccd84cf609936b8b4ceb0477599093152ab116877386d30036879f5df306d64f8dfdd5ed49a68a2517eedf8ec36318566343fa3dcb99fd840fd668317c3113fb228eebb7e073329dcee2e16a03b1451b2d172e3aa15169f53068bf49be1976ea2daa25306b640f8dc43e282f40f0e156f9aea2f3b0eeaae3cd85fdb86a706269b874404ebbb35ba80b43f50251768094452a5c47aa732387a02f9b3b890e79057a8451eba3b1c2f560fe1ae06ad13e3afd4b086fa50bc0620fd8c4d84fc8d05fe944004f53a110931c4853ccc8f36b447b987cbc67d4cab5d8d83406c3dc9b66383f235fffbf8ae3b5e03499818c66410f17ed1d758d4a6989c215e8458072385516d0493fae8c37850429929c8ae1276e1be42c6e9b5b73c4575e311f4709461b1ab29d5a4ae024c125c1ecc6e16f06aab09a11075dfe5eb8eb797419104dde88a3c92f7e906ae267785b8950d94c382fda3313088901b75f52c7e161e0baefe5204e53334a6272aa04713ed9d04575a2b2d6588afacf6c3193accb9aa59bcd1d08c6f9b340854377ecd4dbd97fd106b7d66cc19f8720dc25da2828f440dba9bbb359f95bfb5b6a8474bc0f2ea43570ced0afecd2ff38c0022e139fb8e0f1e3a1ef60eeb995c79f960aadb7045efec09c45b31ff359ae3f9391708c7fe3dff86682afab0b2cfa2609fe0ecc4533e039d99cfe7c101d7060eed377aa0fe5835f45a50eba531a5dca4950662135a955240bc9cfe2a0b0a06477c4ae7312fc3e5a2aa72dcbfb11283c172289f106601e0fc48475789dbb0228275fb85d281113eeb3d9e1f70c1f8f0f581b31210c8f05d8792552a9267a1306579f8c9c2232c57e1d754d5aaffb9d1553f0fd0f64476f3eab53ca6efc0374f670a119f21029159dc2546f46298a88881b99cfa4084b774517770d8faa38b9f22162247e183d631df08dd2ddc5f6732af7fc884fa1d3f6921211d31bbc59bd95dc3d6721497adbfd0c578a3242e1a7a111283828cf5c050d7d82ff0bdca0477cb03200220f6bf0642db16913b469822943c74c3d439b849ceb143e00a2a58142fca2b0e8837e87c79005c7557a6943b8f170d3d0a1157679c256f6aa046ad1647cde93b4ed3fd40466d093f49280f0b71255c80546871b679487ff966b67cd30fc26645d92985095d403b91731f071b4c20ab82d93ac8371a20ced9f0756de160100940546a1272642eb19502e17b4a516cb97094a1d0a8b3c9c8221ca080aff22a10b72d2d9fccfa37f3fec030a7d3b533c14d7c43f4079c4de2a221fe844340b6bd715279eee5b1391351d66ed7f6101ebd8095bc5027b8e5ff86ac7b4f1e294fc83eaaf8f525e9ecf2ac2a3bcb72417c59fab89c364b3235ff02d797575aaca9b482649875ffa0b7fdf9ac6a35760dfe9f2c82fa1da19ca807d90d8d8a3db399608d68d67a9b06715bb72877ce6a4484c424d766f449463fb99f119870940a28d2231b28cabfc09f2ccbf2ffd6658464b2dc151ff5b7aa86a8b53499b5d0406d7842402602fd2ca2ce4864ebc03e9f9d1389c06ed7814ecff58c27514c62920275de88ae6e1cbc0df31e272f44de597dcaed77b0d947018ddb0b163823cf60c8c1a1a7b45d0e816aef7b0856e78955c0183e82bff7e614d9a6813f1ccd9fab23b9ba29780243f3e24262d43e09f4085ca5f324d0c42f7ea51c742dd2d2914d111a019f1c41d4a445c66e768586e7ba1a652fea0598714d0dfc167db95c314a76c43a1bcbb3278c9557c25170d05f67f0cd91c13acd34566aac3282ece0a75c81d172def5b865ae94f3f1a436ecd4107a49017219a792c8b080293b68964b4f1c1a3f06a43fcd3eca5d26f91c813df0b23ccea8309bef98f12f1bd10f071ef155706e3a4184fcff6d64446a3ebfe28ae76002edfac45c63ba7978112e4df86759886680a0ec33002bbf643ea3fa229cf6102a08fe7b55168e1aea534aab1169a070d20aad6898f604c22f394a7a969453eead72377534f04b788032d6d63373f9c95ccad56c7b85b4a81b707ac5275435df80eeb857a440187ef34b37cc4343aab1560345bfaf63c480fea486d4bec97f5da6c65b2496fe09b36690c9ec64f94c8a4c41fbb7d546ec29f5772430e00bcb7a5bb5070b6ce13af5cc8348ffac808edb418daf3ef4fb7430d00043c9bd9552413066043455f163374ea4cb2377440afe36b75a4e21535f6c2d2b03391c94e5a35fe0cb8f7a10864b7a8e015f448176c61de487fda78033e360c6f95d18bbef8f5eb6c84461d9fa2f52b8af9e65c4cff16d4ba60907b35e0e06cc1c5aed38818414a5d276a5043096cfc35fde3312a991b152574904148d67939bd9e00d96a7adbe361978c5f4808de1d9c579f4aaef37e5cff8bf426c52e20d675afb8271fd8c290e21aa9a37ba7f4275fb5b77e705e5a5b93357bc4a9c2fb6642e4f3ce2025c71a2bbbe332321c3a43feace5e11b620d605d0c4c0400ca9cfc05b61b8ff26280417dedfc5277b91f157954d79f32fe50bf2b976b424c523dc165a64239e854aecf54f73c37f58c8039f2e3e960ce0df77c19633a7c01c9815979f8e1ae43d562224c7bb88160dbc0c2cf30a8c0656e4bb0bed1d993005a239d5e135e43d8700de8aae866673cb7a47b57206306c77d391763f393f2d7fc4b4aefa038b136d48ad7885ec7c903a64ac07a6e251cf90e2b4f9c40c859c5084e958b4a9ba6d794d501db89c39e265b3795a8449724c57e7531f6adbfc6d38c9cdb8f7412237edf036975e834aa3e5490bd81437d9c38b38be47dad0cfba08a607cf9fee0aeac6db50bc5eb0c701195f71a846eec2a4aa94239805d85a75fb6520537cb5d5daa4a1e9769656721e35255869bbb1faad3e8bb545c4319b640107e0e2887a8dad0706a80ddbff0a14240666726558a7d8b2147a59ad17b33eb1993560fc86591920aedaf577588eb919ed47ea98f1e8fe629047acfbea4970a0a8ff38a79a9493c5783fbd393b7f021e380b03a840a8996f408fa38a11b7ece3f426a21a0ae74213bd07c308b85398f249e5dec0b63ddbacf66ed4c3a015126e31520213267da41d12fd6a20b93f482089cb72d9a3333e1998a4771c4a9a113b82a3556339fbff6abb58bbd9d06844ac8c09ebfa5b27b3fc3f1560971a6928e871e1b4cfb6c647e4047161cb4ff4ca452f5e47d59cdaa52d3b048cc95f623c9a8d1556d2e5ea05c4561a247f7b453caba3cd70798b51adb9402a1343ff3933d002e660a32bafd210906a24e77c082e3d67b6f6302159a829e0a3c51f5d1b43a5e1a0935f0ff36c85db4d29eb18543b6bac6684d5d7428f511e3d3d1ce7fe085ecb5f30413e733447116ef1049c1deebb657d8f39d6a9119ca5ad9277571dd0c0db4bad59c445abbc0db2733cab1436ad5271bb66d7e8803507691e537ee18c5adb6302829efd40df905679aaac52c8f3a205218202441de54e84ead95c0a34fe053498d713b376bf6e0670928e61b857cce6bc1f216943aaa5194aa64fcdb2c791b3599072b2a49a551ad38c00421974118a747464ab3edfa8c4e10c9189b3414577421fd00514a0f36e008196b70e26e7a611ce18fecf41c8261290cad87ee76bd5badf562ecce218fc76024a3a8138bb0485788faf8fc0fbb5479f238fa6bb2895d09bfda4424ea400bf77aecaba2e8ccd89a584452212a06361c9bb531740bfe5105c7c716de0498df17fbe708c4a89b799010fbe9496f607df4b2ab49c879abb6ffef6a9378b21c1ff76a39bc77b5c997711159d75f6a80707a928059a40dd2f0ec2b98a121c938c7d59037136e9c7dc85742f1c86ee1f72a087c9ddc240573a3ee5de0710a2654a6f0350632236abf10dfa9ab5512288a229757cc090b5010c35ca44374dadc212d44df8ae78fdafa64284845737c552b602716a2d9800d394810e75d96d32265f1de4e43a1721ee17e9e39d8bce952ba2b749c78639b3060061e9e0e7d44410347ebf40f1abf7ce3f08a31320326107ed264afd805532f00246f7d9d320c44b16b22cc1b7f2b56dc1e0911d88465901f7e5bb4c735239c76fc670dbe7aa095f513d398ae8284d3dee68aca0b186fae281ba25652e621f06fce14b34419dbd17e0cbb7cc80591ce7d460a5505ab0037ab0ec8bd21087db86e0483092fc58ad0928360d5cdcc4921c22738dd29390541829376e4dfcbd624011a84bc6ad555a8c62bbb82ae1cdc0078c201d91c6302482b743a097de93a39e736d32f20fcb26326497d3d2c1df5513d268d958e5fce06510db990a54534606bf05cecad01fe6f083fc46405c19416fbe0d5a9fbe14ed114258aae74053ff633ab97e461d402b22cdb7ccc75cf7083ccae17b9d51a9f1983bbd7fd9453ebe78dbb01bb5a641516a3892c64e68147280a885c48d44e5ddb0cf7f6fda7b9ec74d9f61c89d8ea6eb850c9087e1d54d931238563b5350d071b00b532d7d3e1731b2a30ffe9348e9111f409f0a4bbd3eabf9ce4a2160d9e8a2e2825b1b31c8d80908461111e8e9079ab72120f23c398978d758698ffc18b1bc058afcde6809573a3e9aacc84cdc8dddc4b7e9bf08eb892f55fca36ce5fb397dd06a872fa3da4f3e4ecf971fd24ae4640ffac8828bc42c33714a550065e6150abe556644b208856d0f3dc5288a539615cf712ba20a225f09f6c24e70fc4f2e7fad7e15f5e58b6351a4e6b90424b7f10233a527df4f24ee867b4aec8ebd525f212788fcdfe6f65c7badd4e938274036a7363108b91fb7a799c02fa4e25754f4d369fdd9350303d8e01d62031c4dbf37b0278cb47de25f150c6304634327f9e9179bc1432b7e41118ba0bd5e87510f49611d5feb9e09a31965254e0026fa75920c13eace5060a671df0e3b3dd81189e1ef1b42a05499a79c9ccc903e2c640af7c7faff47d8a3c1872b1885afaaac5724a6df1d3fc5f798e774eb4d8840af8d7085baa97b4ec729967406ee7fa0f02aeac5864348e0e342d93489877ab13a0c4595977835ea7d38dad12414e230117c8c2b876b2fd1864acf0f04366d4bd926fec1c1dfad60fff1897c1fbff92824310168b901a61fe7a5b4f3dba88d8393bb23640f2e4203f0fc29cdbee1035b78bf0479ed293213801b3d8d7dfa8d26eb3badc930cd8facc30839e239fc70e749229c9400a2f7d789da55780270f5c61a77b418a1471b313008f91d139aeb6c04c305f94def637826361d03c60d750b01df31a678dbc8ded799dd6a3885e0fc81cfbd6c2b78b78e314e1e13aec5d6b54ede4bc4ff99f54b3aaffc67708812df9408d2d5d698b32baff75797c7d08e5c4774383a628c018cdcb2b17fcf81a735b2f9d4fdfbb1f97af915b3d91dd826a109984d5befce2e7b5bcceef8137b43b4565859662cc5e56cf2ad2d6f675f4578c03e279fd9f9a492cb0eebcd30318437ef0868404ab2a2e113e4cb1f36782b1616592159ff230901fb14c4a650c10d8ae40ee359afff28e7b97c347f779cee0bb3dd011aa138ad4f5b0e822a2f393f5a9768c648940c0823c7261bdca8d046430f4c145ee3d5108ef003fa6231a6a7421e7d221cb1c8140a0d8b68351659fb89489cee8d532225533edb11c13394ab63d32d75265c3995b9b44c09e798541c3deb152eb0b34d199a2f8e02d2bc58173269205f314baf5c200e24205518b5909bcb50628a5afb58d360008846e32bbd2edec77f824946b2293760a2c0e5e6ab643d2c7e61cee3c469e27fad46427802ff2006e84e30e0122d70bf76f1af43d988b05e1ac396601af514a8494fa1570789ca9ff4efb453723e1310f1f917e92d37abf50abed361cd762293b1174e73fb6b86701e71211257b13ff2773b089318e8b3413ab222176a07fae5658a350cad61671338b55a835631bab43f8e95eaea3388a303a2938303b0bfdf01706f94d591326207e8a6149544c09a66a2e2a032701606d0b576f1a22af63567217295b14d69912d159f0914a6617845445c94373853eb59152ac04bbb43bcdfc0d01641bb391a02e1c32951ed8cdaa3c8aea978a23c2d4ad262c245208331c9de7da165d8240b22ba09834bdc419dad6b262ad7cf2d55548c525edf3fc592c8c7580f7609f61ad563e2a40b734b8cc03dfb743a7c964f764336c347b6f1423f4b2176cd1d493ae3493e86610d00043a3d2e8551e2b2cae00a477552a41bd7cc222a27ed38bd5ed60b643f915d7d68a76b33487eeae64828fcc2a44020750be3e96ab6b6cc338f6cdff28701f44201b1bd35510942a6b14a8fb767ab179a84f8619f036aeab544ba9e63e0430ca36fd58457f109247d05fbfa0a02f3649902fc0e18cc6737a1b5aa6573738eaaa77b2954ae2b7f85c561ab8812dc0a278c4f39ab1f333aed59d1e3e0951721294e97977dab4cad215c2dd279f9d4706ae47cfb061cdb33570a7e6694e286a9ce642eb0befc0864d6e6561f632f5197b32affacac26bd6b706923070620f90732ea8cb2fac87138872a80099da81e98481ee157f29fa1598a28a5f2931226e0290c92f4bfed19ec85c26540d18118e064fae509e31f8cfb508831129b309ab7c24266f67ef6c440daa5aa2b98aa653ce16ce213b1617672aa5ff95c930fd459946ec83b6b7d5ed71f582db1bd4da36dd245054a4e3bd79e0979297c22b9c2b7dc37bf8901206f672b3410958dc5839a287afa209fd0951846eacf97c3a1bdaa024a474815b4e481898c6a7c16be4025b5ca37537311b95172246d768dfadeecd2b1053e3411324e0d1146c5c04223a4ac4b6f9687481c1276201224eb1b24a9a2ffd71148ac14148649926ef0da05dc31c633319fcab61021204c4c59d08f8f18d7d35bf4ca9d02230007a68b48e58155424c8030d2823b342225ca5f28338f7fde9a9fe39aaa695da1022765d5e96012b0de696ede05941e812680f4b38d077f39c367ee682c8b56d999eb630f60048c48ad34160b07d4e0b0dd36ac7889567e58895101ee1795f4b8c00b9dacd3258db0012e52d76a0d233065c418062fbb227de81d559191982c025d0b5747a1a44769f94fd3e903d7d63ee02c2e5f34215345f5736371318dfcf75a7459983e0a97230dd77c547a7e0e4578fc19f6d0cf55f4e116c60b0eaca9eb6b561bd8a97543bc85b47e9e42a4c7f82e9a5414c14023344a6250682bf99bce4b779a552331ecb8d63ef1aed751777ef8ddc92251754c62b3b055bbd555226f13253645cd4458c8a31d820d8a51060d4eef0bb00c6e49d8efb97a0309b48e1b3ad99da90acf37c937440f36a35e66c0874b5ab962cfaa89dc7530b42a4799688ef15c5a6d87828279ae9255fe822c68c933a16f3a92b82e8b8f3de78c039903a8e3695f95073904a120539cac80777eed147c1ccc61ae8d06dd3ab60b7ac1f94c3d7d0c5d97ada8c23d253a35cd37478e25e9b8b177b4edcd963818f77657a7a952ceb89d6eab7a1d7996cb6e48cc40a7e2ecf3edf78e80b16edd17a4e3190b0dd3b888ff3a3ae1f7f928984f8f723ace5081c3ebfa22a3fd7ab360c154e46f9f0bb129b425a3c1a05f1e98362de8a8144ab5405c396faa978a4e1fb88451f7878d8343a9c46270b7b6079a47150d8acdceffa4dc6095bae292a3749c6e87aef23ace1bb9d03798b6d5e837ed3d593098d30f240afa84f8c4b0128381a29b8e4db98d45a1f109b8900cd6533c710838b532ccbad9d412c89eb1e6b26220e9d04d7027c93954cdd610d5fe89bf854c598863704207ec81830c00f82b8f99c017083de4c8d36fd9de2e6f6f80321bacbf45668a5fb7747967032d9dff764fb199c1dcb129a10d60ee258c232caaf8bba66659a94b3cc53bf4affee4bb7ad49603e36a75dd46bfe435346141e47c4cbd0e359e14b2afc9d9a794c8698f28072eba5784b4e115432e26fa0449607500879171240fd52d7911ac9b4c5f12913b2435cb50b8488a32af59103481088f370bd9072a187a1270a59b827785d26f44d0429b3c5fc71a2a515e5a44a233e64df5218a43c4a78fc8752aee72aa7a7e6ce861c0430d4949603c1118277b1e0dd6b877b5f000ed1f37ee6d1bbdd0ca8d69e6a6038316e16245417eff31556b7f56835b00ef645fa43fd6fee7e0d2ad15605b9fdad86b30bf8a7b0ccc0b84445452264ee7854dbc2cbfdb60a1f4c69370b09dd43c4162ac69173e4433a6bc5526dab704794e4aaa6ccfed7f27dc9c2a2c90d69dcbdf381337e9864563659eac5fd0ce28c27bdde8f5c8593b74fa297df7b19b268352f6704e9de2566bac86dc02cde99827d129743cb43766539ee8a4896988689e4671806d179b3626388f96d7e74ea563c559ea89b44a8ad330bd419152abb642152ee59f859ceb308db63d42273932da1e8320c1112eaf4c8c1910498f4df43f7a9dd15c1aa4f84147e4c289749982b2a159c451d6ca9f389c66ddcb29ab441e39315b4f33fe9a4ea2973eaf2616ab85b1c0f3b926a3f20bac64b5b6d29d779d6010b58577240b392a7dc53718790cda65e6b1153874dede3a19ed9f3d146d3f0e2668063ed567ded73e29bd34b2c86a32808217005fcdc87f7b14f1104c3e5ad710f3d54066144e38f7d0a1d8e4a0dd43b9cba1e393319da604ccc4dcdb8e6d59f3c9ac9c8de075ff02e56dec05447147d1f8d94883db17a881c8566212bba775081f0a0ba90fb44fab085cce45824565d910ed142bf31c68bb6dc8c6725864cff6c5b7c0ad3f6b41b54e8b06b2a32d90e2adf901693787a30c0d941b7fcfffcb8fd4a9401eaf65e4414e4470e0ef2e0bd6b2c2d43c726da441acb9557a4808da386e707119d19ae2e6718a0c2a92345c388cd172357c0104316ca047038b87d163e20fcedf218ec099a805751c40d86966cdcf5294649c9c6e3fd2f86a1017e8e4501f0f343db33004af08cf2df9434bcb3f10341e52a6a5bdecfe20efdd8b9dc1b63b34b9bfc05c5c056ed8b84b43374f1b27b9f6e9d6cd4b811fab8968ac9f5d77f8c505cb9dcc0a063d8412fe0aa039497d148899d4e56c9e89f2a74d212eeeffa338952c4dd3716e2b191f4c8b60caf90a601acf4c7d2c8a5f74f28523fe3e0374d1d3e619455fd664a726294fa617e6b4c903b4cb339c469ffd17fbeda6ce2a9b29e513bf74798896eab76537b966c16a436746b95ce1d6818479b9b13979778e9cbfe9e32ad70ab561e92bdb72eb5ec62644918616f938081fb424b2dba625fa27d7dd823bf25f83ce9302997e0f52080475c1b2a519818c7b205b45e405207ea090f1eee51b78ace5f45c92a54dc00055e7b9a81f75f16fe332f68ffe40faa70c0d3d6507bde3b3d1190942c46a71622cd226dd109c212704fa45770b296afdd1045bf99ad6d37f63388d8471dfbfc036e0604e187dcd4670135436cda8dff5d7e10eff8bb386b59c349577961605081546dcbe4d451bcf7120daa8dc2084bc383fa7346debefdc323c304bbd30876c02180228276c31c0ef02ab2b54e7c0941f3703f297ea961c679285b87e78385f179617e3f70470051199878f99654480f952b940fe4695e2ae31593e2702010c17a3e0e065284a190fbe213dc85fc7e35f0693a3cc0140346dd86a03445e7a02c24ace97d0967a878bba7adcf01edc14372439d87655e173c5bd9665a48f4a72bdff9e26c9fd4a86172735c54e6f76f61ae08c4ebfc2f487b6f267ccd9e11480c47212a51c9b0e623744f1e3ae131339ff47ef7f2fcc2ae4f8eb3f012561576c8b8b742d1d8c75c253309e659fe1eeaf7a0f0d6488d7df9f937ffc3932cd899ff0a2bdd73d21d0b426784e7b154ae002beb85d803188763d5a904a15b092504f43c71a90c6843e8f4a4f0f0f2fd786e0453600647a67f7d099e886ec01bdda64755b8afe71246bcd85a08d4426537d824d7f0ca49ae749162549d265d143a9a866efc2f79024c1c2a28841c1045a8bf4d7c13d16b615766165522c2a7ab7845fa06bce9e354ba5bd0fa6f0ffb0c6aab9d0799637f36e390ebfd2ab8b259b128f0af382d346d5994d7045e6bde011a2f63be0cd59bef101417aa320c034cab33c0c09f8c87b8c292ce147b459a3c1f37b1007ae1ef84bfdfdc34b18ae21939dd6f020e2cf4dcdf41cd75ab3f64dd8e0642e1e2882fc147dc15d006deaaaf4ac097e3c9fb71ecbc2c883487eeb8bf4f8bf2fbd48dad44efea48b3fde48c2bd1801001a610c1cc24438d40c6cd056f9f56d8775aacb56ae3ea89770760937aa87e87b5b56070cddaacb20bc8c2c7ad1bf65a966dfb7035145b047951f44a878fe5fcac634342b872c1491db43eb24733d207ec2c167120e5f8bb7454bc7d22d85577482dd14c877ef8c1fa541544a6e4d292c2fddb589fa1fddb8f0bdeb6c8857d980e0726cd9c13627a360aed12b393dd971603daa72699be7be3666b57b533f744a566202cef91af6eec2231c04fc2e544df377603f0e0949f15b00af25867cead77718ca002c12af2f80639c7211fea30fb5a535d5ddcc6a8ff15158b8428d071672980a8cf77a2f7f7870411d9d02c9e5b00f5cba641b6fa82cf731c5abd5a1d221666885262895d388aa83065b5d6ff6feca36b56283529769ec4d04d8a8c52eff06b1c76c11c93d056cbc307fd81c6f9d306c25183e7dba1525cca4f08a51425a7de677a38d3f4e3a866048fa2b8b99372219279c18e807e554531108b6beb1092927dfe1a0ccc9160bc1e303c0aca3bba897bb8ce010297637a913cc6be3791f8d0fa37f5230348e35f9b43453ffa7c03f430720472f0d774e3cbce424d892ff815628679811ab15b9cffcd0b1e4cc4fea888f81b12c1ea041a7d457c8ffb918342d92abd0fbe1de2d914f8d958892b14b7a26a0878293e8e0603265ad68113eee34364541864baad05c1c4eec3dac96a4c88e88dc278e89bbb1c0399ecd586098c8861651e35fe0d0e4c265d3e58ce20df3c574401e65c1a53fc62a856e854664ed4fb54eeaf4a64f1e7f280206c11944d6cb51ed9e51c7faa84fce8323d295b7c11f62c943b5b2faa25297359da888d22b8d94bdae04d202553f77b2ba45c5d989f645966c3a4f04e05c3b608998fd5f938e52fe34c44ef164c869111d56b034b80821685372477e45f91fccadba33f62b7bfa5a7d25bf1dcecc2a37b96ef9fe2abafa4e84d3b8168da23bc9bb939b15a7ee38c5d15d12459c75f0757e2f9fe3dc5c1ef7753e39fcebfd6bab4355e4330c96d77ca2c1faa147007affec798824166386f75d3a145eb0539491580ba3bdd974b6b7540f58f84b9b63e6377c8959b004d91f9e54caa5423bac39f8fab1838922371fb9b5c99412e60614682d20dc9b48c839bbb2409e28c72de757f93af6332f5cea3e3241e4d44738c11a61a2eb398c0175db15891c2ee920d7624c06e5c4c2b22abd8fa19f729123a436012f3aa07905164b9d08c08c6dcbfc76c16c60233bc061f4e5bf8782168e9aa0833a1003ecd8c509c8ab820189518d989609a9d2e811e9fa0ba71f7fa3e9c35a4d811d2c418054d6f1bf63a58b199a9d0a2c70965f101df486d08a202994be8861098bb00ad3a360a14b75eb38f869e030efd7a7aa47e84246333fb5a19c9df4bf96be9aa922c824543466d457caa514f54b754ffe629120ab12154a3ae7be4ae5a0d7928123931290a914f780a1f6f5ce500cbbbcf0d7f39576e33e4b205042f4cd8ced39669fccb9763a0202c4da05c4fdece1eecac2b1893fb677382bf70f0cb7bb459b5604711173aa13c464e252316514a89fbac89b11c181ebb8825760a5532840d0e0d64bf0f0a25f5a7675681457a026f40044332e91026d0c6ea93483e1ece3aa5804adc3874643c897ebb280b5880fcc0dd11757cc8269491f1a18627faec432d0123e6e184a3eb99235a8657cc068387db86a1640ebf4c1c810f6715d2ca116e143b321f2cd15597447318819208a701325482ea4c8f9751a846365eb64937371d268557f95c60a131318cff8f177aeb121f6cd58d9f6d36057f4025d1b9621b512026517b09fcc167cdce25c6fcb23b5082125b7a620c05aec1a666793e0234ddfe262c48c2838a49c90b05501e6eb1417425cb2c2e7a3078e72e2b86bffe344f3f4d9c9e3a6cd0e9f5b32bdc8bc82832ae1af7c0ea5f878d3fd83e069a98bcac4beb087e55fbf14daf462b3ab229b7ade5d37d90d5b7e0d28abcd0d38585b8695900801a1d75811c2b8e0deecb90e8635a67defea83bfa0570ffbeaf45feac3c7e74349f1022250e932943da0e232789a46f6eddbd3aee5cf4e9122b0bc340b2e070007e5ea365770b29dc29fd82fd8236f8467df09e583e7c65d895e0bffdf193e70891b2ea0370e3b222369b8d99a6e9190fe999f7a5ba41c381b86694aee7b3eae7b4776e371e5fd357b1a8091a1240834e9b0c42e230a7f56565ab4093ac5e22c1eaa970132d0481e3e7e234d330064340c6891fe77010a06d42a3b72b37400cb742afc573971009d7af5a56e8b5aff99154038f9dfe87e5f0dcda1ab3790b04f3c1e6696aaa61801cf24c96fdcbb281c9fe49dc386e66c0cca4eeb5e338a22d3ea4f874d2a1a76a25db64f72e50f482bb594dfa90b884aca9ee83395ce3c566b7a00e166204af2c777b7403efdb4d747d277992b8c841b5ba76fae0294dbf8f65990766ed47f0d23767248effa9da6bf5d52882c0ab668b4de0f5d8c7ad60cbb641c426138bcfbc2b7d444331ec0225a2b09f2e0768651f56fa5c4cc87aa84a586c2f911b267167b3eb5fa2f80092e8348f65144f8a777ca24cfd39f248ec85fd903f3c87be5beaa09e9338f2f98a4ae88e7571cc16b174d7c901da64b9eb9d1a63820dbbdbcff6aed50cf1597117cb8458d825e0ada4de50a9c87f503105df53f9071de20cf54febed9423b557c1aa28f83719d069d3de9b3cc1514d25e0949be0e43f30ba233f050be9f295813e75355862ffa1a37132a3f9dccfef9e14d72b44f6beadd477442f035ef9a0e04c3ba61845f058cfdb91d02e53e07d60ffba6e35667b8ed868a265a1d4d29315d91bdda63d501c8aa36be92a356ea947c2d2a609a3f14097d71be56fe02d44171b01673445a6c9e49a0b060c207659eeefc959127d01fbddf5f268235d1f68d196bbd4cdcc21b9f58df5c7ae4d51e02cc9ef356967a164ef45ba1706395e789653d88908a15c6cc792ad722e179572126cc6d30ddbd30e334895929a1d96082db60dcd4ab8ca06772ab136c256e161b5683be01a68370e430ba4a54b457193b60b85147c1fe1ea52cb1243b8b5459b3198b213b8ea8786891c16377eee96f6a5491c68a3b197183dc0fb9e6f7b3a4d7c108ed029609c0b0bdb8557503bcb93da9205af171196827c0a44cf587994d7e2e85cd76a869cebbe286636ec63da685b4f35c167403c1a1125433e0ec60021735a5e98320a450bb4a155143328b16e7a599754495d324c46a9dc1694423ecc0f15ca51b1d3fe74dc720662340616325f01c5fe2d683a089a1a52b0841aac9012b5856c213e7e4c991a2974a2b7907043b39845ec72fb05af3accfe526270df8fbdb41d39f262656434f939c4bc0eaafc8134cce23061fdcf59951cbb46b860460c7d7c92cdbb2343a9890a8606ab91b1de3b25edb5ab0a45aef9a1dd7995d7ded82a1aa865687de0af4d566aa0aeb0ad3d94854699708be3ed8e22c1846d5becbb11f95249843f7126a7a8cbb04a4c18a685ed0aff2eaa8b1a597619b86622faa8018e4cb2ebfdb7eeb1e9c69c32418b0e565a0a8b581006d54e4006d75e310fb0e0a603bc1129a5d613bfd3383e104a17ad42944515e0c5f4834f7fe88f4645084aaeccc42431854f8ddc0fd501bd963feaa8056553bcaf727a8ad883e635c0b8e5a2c1aee1e779f7bc1ec753790e9a5a33ac61b6c5541a5dc163a1c03b92d817c9afb972008335133f0fa5e6d4398065cf012c111656508f9ef8c0238f163b40f9a8bd089c419a649621676f13e663a6e9af5b7565b27fe2740b8f4f2b13201ffe815c45004be3ec4030e5b20d459710ef5ed14d21368ef89ea4e94f7317ddc35746eacef93df1bf4a7d6ee25694fa073046bf15c94ed7ee3fd70528b712508ba0033e0ee40e50cefe61676c7a61f36c641dca9692051824011841f856e3711c968c996324919380dbc0d540efe81f382267065fa8020495bae8e5d638cddfd6f69f1c51f7077073d83df07822008822008be836076dc82eb640ec32f7416ec867fb5fd54d87d190abb2f7bd8bd8f4bfedd7befaf258c31c6163f8973f694064c26437416cc6af1ad0edfca54980c8569d9c3ec7fda7ef671b67fed7f4190dec37b9cf2917571535580d2f8277685ef2f3b87aff4a226ea2103564ac39789b0311541990c98f8a326ea21c2c497c9809572586631ddd9652c99201982a459e217cb0c881f822fea9002a82943b82b70dadf5b4d8170e334872f045f03e19fdb9aaaacb2e05f5365d3028427988a3edcece012bcf47cb1675f61f097b72c5dd1430ce6efcb60597a0b87e5fd717eef2bcd2ebd2563d5fb39df52597a6bbd39efbc51db733fef90092042c8c1cef6fbfc9f3ea338f193dfce4eb3bf9fe11dd85f8ae6b524933037e9a569ee1a5018d91ebb45dbaa01051156b55818910218d0e007135489023bcd3dc361b6687b6ccfc54ef0ec6cc26cf184f3fe0af30fa3296d620dff89bc6edd4d97c7c503739d8b55b5beecfbe4f7b7c64e0435763ceccaeefb9967671d14b85bd8eca60c3e592a511898bd963b83bb86123f72ab861232ab7e3855893bcce9f74a2821ab716ed1f67c9f49f052e06ef11f52bef530cd7349fbd6445e14a787d986f3ed36dbf8791b8378c6eb85b88d1fcf3ec7e119a6611ad2c6ef389c911ce739cf156dfc48f8162125256d7fecb708dfdaad6dc7d7ee6c3ba762199a56b757d1de1779a50dc08c948f90afe45e3e42ee65a48c846f18865b2c95d61d140877b87a60e775c7ceae717bd5e11bfccf33135394f041d2cde27421b7c1f5f91ebffbedfa7ce90c771b5c1f7fecdf0ed7dfdf6b73d533b0bf778d73d585c48d1db7eed81f7e4c817007896eddd317ef778514bd54ddb74aa46009d54d65f6ceb6ffff3d8eb7beef2b7d699377d43248be27bfef537ddf774594fd5dc1dbdf7705d1feae38dadff77d39ffa755f9fb70beac8e6507ceb7af7127038bafeef5d58dff718f1b1f976f447e997e36d286b391bfe32f99f6507ee97b207ffc1d30d394f16aa955bcc24feaefe1b438ed01c9fd1ec21fffa6374adf83f8258c9f2c8de4cff0f16b42625cc2cf92f16abaf1a3b0f1dab2f18b8dffff53bfff74d9cd2becdb543543e9c5bf51b2df433aa63b60375d75e46dff860fe444b14bc5abfbbf8aacf351569053fcd2758d79b5b919da85129c61fa60aa5a1de878072478efc52079ef3bf9f81350e2f2f77a961efc2bc32ef141f38dc637d331680757c1f12d4c14c537c5ef80f9dd1f1b7c52fc5223d32572157663d8b583afc00741710757c107c17ff055f04ff051332d008a57e0e92a98760049fe0ee027dfd30ef897a9ea7bf1867f99aabeb400e3975cabbe2fc9c77fa37c7ff271a89a013ff937fc4b525b7c6b70da4be4e097348a57e08ef3ca5c053f4c6fcc55f03d70de3b0ba990963c591704eccaff5b6536044a7bb53d9cae2d7bb5bd2b93c5bdc9b0b4d9c4ffc4e24a395d595a2bb3ad51b8b66ccfcf6387f0571923f175d801871d7a3be8d05bc920ac6af71a2e31db0107b237ee8cc30ee088830e3b9cf61549e0cf80b2055be2875597202a4913b5615c5a96204a75f0956333e83eb9615fd685035ef983600b08ba80e00b08c280200a04532018038224c0c10937d05003d9e2f202834ac5a09f49e3dcc1551d9706573dade1c9f68fc15b770757ddeeae6cff1b700ab0253e20c29c34c1aeeccee97a030d76af7647c30d250d35dc90f1cb76394ffb86afc30edeba36074e9a10fe6706ddefd15083affcaf134e1cdc15beff0ef66571d0e2ecb5b8bcc0a052660ce1356b94dbda9eefcdef5a37615526afe3fc816179f397ca4f934e9225d3da810d3e8945db73af9bf2bbf93d298303febe74bd319cae3629a73e7a90847d3fdb1771e71ae5be668d6bb19bf297bff4c9e08083b7f07bafd793c0755998ff9a6f8f276cd86a97b03d0d7ad203abda7dd3a0273fb03e765f7063195a956dcddf4102224a34d98980064d10c1eca3d8d5421072451801921230d9c12c145ac84036041938610823d05972e4a4063458a2085558f128c6f76160685ce383e98a350d4c104efc2b0c0a3ef825f043f04be0db50084c739a4d2bc579378ccd20fe2c8172632c1e63cfd9e29c31c638e77cb18cc6cd39ff06be235f1e4b9073fe72ce4860d92de2bc6f419cdadfcf709c3de77c6dccfe52dc04f83d28fef7a5328ee2989cfac4f7478130e18be8526a194ff2549a4cd3549ec873144517517c114518514489624a146344119511c519519c31e10f5bf9d7f0c127c330fc2f05f3ccc6d9d5efc1fc7d38e7ec3065ce39e79d1b30e2408516591322548802dad2552fb7c3782b4cdf8abfcad8f867e3d529635d285ef963f24bf34da7c78fda57cb870f7384b3c6e9aaa3583cd3552ca1e80cecf2d2af6809858d6b6cf07f9f4f667bddd492a2b607cb9ce9fa809386b12a8a83499f303a98ba3c7728b558ead860c619d8259c7bd8e05f70756d2f4f18cf5805185a644d86d8f8c3f8739a25a0c2ceaedee79d17b4c2cf97a182f8210e36cbbe378657f7af118ffd356fed1eb97aaf11239cab4d0233e0ad55edc15b2b0dee378645f13cedef9c1a955e0757efe3805d34947a34b87aef0cec72c01358f0c0084c8070014c8581113c84184112232002ec3e4b86e8798b4b16d1eecc87e77b01aec22333553c8277f68a31c663907d7b6464adb5b6fc147d8c31a8deb48832979bcd8b4b0d8cb51635933aca7db86d6bbedb912b5c6e6c5afe6603df912f5f714a759967b46d4a65db5e313b8f1e14ff08e4797174f46de03bf2d98e8a6c743b082ce7fdf5ab6d8b3106c006be235f8fcf06be231f005832ae205577c6da20647006bf100cadb522bed65a8cdb16dff0aa8631c618045d3026c796922c735111d26996482793798a600dd74ce0fd81249eca1b042d97eb89f10bce16971718147aba0ae69822a4322efafcc594f7057876e69c7346917067645c3543a3da248dbf1192f7bdfd4f17c0575786abbfda26398d2109270ddec2a90a3578cb53a3ef555fdd4f79b4acde57b12b066b7b0c15d6185b0557efcb70f5c6d8f755192ae4fc77e78d5dc5a9328410907adc6027821db629b524340142248a2a5cc9790ac5d2487e699ade3e0c6fad2aecfb56c57f6a1cabe23f69d5aaf84d9ac6aaf84d8d5a18abe227f5694babe22f69d166ab620ce26cf0695098b3fcbe9c53a3968fd1e2a50e64483e30f9a1031dc06e123c7ab2dced0ad10f60f7ed7df1bec5b9a7e31ee8920a2952e1187453fec0502c95252a8eb6fd71acd91efb6469a2a7898ad3be2ddaf62ded131244cbfb9bd91ef4a469a1c28508e7fad5605029544c4c0ccc8b4b4c4ccb191313738a31993131313ba215f2ba48231402374eb119842dc6b16d9f95c30f14cb5c04c33bc5b246d3b341ce129cd8b169cd61b7edaf227a9e258c59e54f660d9afde2f2d272bebcbcbcbc581953c9c6db1ff83b60f82d988e0f829b7600896a06fffb37fcaff83b60e90df271da03f9b5149d1656faf03f93f9a6d2dfb85f2a85690fe1e337994ca6d34cfd4b4dfe28fadfc8eff8f383e98df2c9b407fff22ffe1bf7311298ee805f7c51fcfb3744500453d6e7690fdff7f7a63dccf8efc7f3bf21354042102d98c5623017986d51c1e902b3b0fb57c0208b0d8ca400064caa80ddd9fe7e061e334c7c171fff574a7bb838bcfafebefbdfef3dcdf87b31fdfeeaf0eafb3e9e7bb804c635c2bfe95a82fb3a883fdfcf3ee8ffa51667ebf91d638c33ce4a7ceb5dbfd730f29773063fe7efeebcefc95d1e40e26fedf7f7b60871fadb9ddd5dc84540a6d7aa1f07b6ffb75d5fc079d021ee6b7dbed781eedcc3f6770ae02db4f0d8be290fe0eb10f777098037882fe09eafcd260ae00de29b777cd76570713a6fcda01c8c7fe7773e6767e773c88fe32ad6f935ffbbaad2e0f4c7396455fdd3ce373b9b76b6d9d9dcb966e772679a9dc99d553b8f3bcfec5cda5966e717edeb7b54b873cccee0cea99dbf9d513b67989d7fc53bfffab2f3bb7d859f7f6dd9d965db97f8f94ffb92f99caeeae72755ad3e86e146c557d576fbfdbdeea4a8a893a34f575f86c59d32d2ef247a93e9a6e0bfca80f1165661e3fc38a758c6c67191eabfb1a9a151cdc8a0312954765c9526fb9ef961f2bfb8e46fc97fe63fe537e537cbfc64fe518bfada9efca176db931fd45fc63ab744449985ac0f5ce08317943ef832f9d69561f6c5175cbd5f0057efc710e56480ab17075f5d52879bc2f8fee04de1134bef207883708238bc8f7f0dde5ac71bbcb55e60d4a0f5a121eef0dda401ee30a580074a9fedf16f7f62aa0adf6e158dbbc334db1e4f6b7075bb4923ef6f7fe90dae5ebb1980830ede0acbed0f9a30581fb8c0072ec82a21fcfe1228f70d764a0dee8ae105ec92f1f7d5fbe77d14e933526e9c71baeaa0c2f716069d03fef06bdc2dc45425745ffc1af7451d54b8c08e9d4f1857fdcae92f04b46d7ff1143b70c34dc141b0fd3f9a7dbdb6ff02ee6a8bb05adb84ed33b0ab94ae628ae21f531745100475f8e4e9fdc11a769d7f82eff23b6039ce6ff91ba777393d98de38bfe55b4ef31d2c7af057f0087c13785a3328bbeac3356538f7981ab53ca8412345d805ce5ac02270e6aa3f38dbfe60cc1f94f97f48fe5f92ffa9fff4e7679300e58f5f8e60f83a949bbcc0dd35c8b47c50afac0dfe38d61004e8e195ce5b42b2ef09db12fac1aafea2789e28faedac3b7bfd62db3f46b368b6c71fd5ac9466e968560daffc67340b46b38a5cf597d12c22aefa979a35b33dfe26cd03f8e5932e344f0decca3fd53c48d8957f8ee661b78011f578186a929979243cf0a0e344bd0e74c3bc0e71a79e02778b1df33c48d857cbfbf3e0c0be5cde9fe706f6f5f2fe3c4beceb7b7f9e23ec2bbf3f8f0decebf4fe3c46d8d7f9fe3c37fbc2efcf5303fb32bd3f0f0dec0b7d7f9e19d897ccfbf328b1af99f7e729c2be60de9f4706f6857a7f9e24f6957a7f1e9b7dc5ac20fb26dbdfa6bff2ec60fbf3e09c85f4fd491cfdc16af47d1a6d6dcf8eb6f647b5e3b3e6e0e88ccf53fe5e5c62f6c5d118169342c1ccc8a0261cedb098140a06475fd88b3692b1603aefa28d6432603adfa2bf9c1a61d39ffa02e736fd495f00dda6d44827b556006bcdbedf8305b3f667bd015a65f6357f865b1879cb1c6d61381a84b9600db13efea0d6716e21b6ffd0132c215be72d1610abf2b0cb878af5b1e2a487e5f4c1c2090ffb10db2cd91221d8fea4f6d9d91eff51fb94b40fcef6f88bdae7667bfc8598982294f3968f14ab0ebd20ca50cd5b3e50ac8a049f1c017ad8e5c3c4ae7ef059b2fdfd8564def231c2aa2edbfe3861eac36bc1c963dbfe5acfc0abfb7f43b650625d9a51622d92bbc43a14cbd40a02300350fe9063a9078618823cdf8b55c630bf168d61996cc66d7b8044e3770921405b91ee0868b338abbd82bbf615f336e7f5e3bcfdf756cddbf79db7d0b7ef53bc75f3f69de72dd5dbf72adefab7ef3d6fcdbc7d6c1f1379cbe6ed631a76b978fbb808bbd4b78f6fd8b57afb18875d690fe7b66ddbc735eb6a61e6630516b2ed6320b6e5d37bbf625d3588537af6b10cbb76de3e9ed997ccdbd2c638d61523c9d515c6a6d996874bba931807914fe69ccda0f2c9affc4cdeb8b33d38c87c120475514e3cdb630699469e19546563d58b6610153c951e77a219743e592ab510e15c4f481bff48ba3c59962f4f9ae53d4d938720304b90697cf254de734a100f35f23e9d9e3c4b7bda93c9b6b85992e36db1d65a5b12654c63cef6e0d77693a449db93e6c97bc97bcabc35836a7e86cba84cfa6e9224cb1666d8c70a9f5e0d3becba71135b986d71ca2e461276cdd08b9144f4e2755e6ba29cd74f5e2a4e1209de165b87ffddd68401dd9e8eb9171a49ea75748f872181f91c8d04f55af7789846c962501e564563aea232bcc22f16cde430499265796a8b712e5292244ffa9ada9a4a52db536666266826e8fefdd2de54153a5451c5ad6643a1bb958b1c3d2020e5d0d99e5c131a912223352044c90125c7111096408184638757bc2a5736763169a4364d9a0357c4b9da29bb33e640f8536d9bb20b433348f5a159831455289824504441878eae0f9ec9343799bfb189a9b9a5d2d5a7c0a437f45d0b283c283d1cb21a72b68768af272db23e21d91efcaaa48d7f26cbc63f748425091b3f9aaeb60918fc5ec79c4ecea86a52245444b6304365668a5a9895178a9436cae1ed55c5c1c3d1c32b9cc381f238da58c8d77472f4909221db8ddb8d253770de9af9197a37a6b789a9a1c9534ce92a56396d0f628f023fc5217bc95a90d91e9b74f5295362d2d5ab54a94957bf728526cde92946122a237bc94e31925c5ccca0fc2f6528547355e8081524a5fa186c78552b224243ca02831631c4f44a2686233110f90a3fcdaf282de65751a8865736bc12ba092d71d224cd3198c93024c1a085bb724cf174f52b59b268e15a3826dae98a89f00ffc034d72ae3ebd1c65e693a34a7f86a35055543fc3499bb4a7c3e570dc70e06ca2cdf6e0a8e13082a328014909d02246a424c90f22342884e8706ee06e3489f26426c52143d1c4a03ff3f867e8a5fac6121d3328e675cc1a79cffc0d72aa70e4bc2553736313a660501fa6ab8582948241d91ecc5cdca439682f781bbff6e1d91e7ca28f3283641e65d6c85bf564aa6cc2f6abd5a33c6c6b8623ac3ac36dc8e633f4708ea128065a0c426298c1d083e10a0c48306499e1882746f6cd5b3114b12afe273f36fe982744e816aa09d95c1552e264c9c69fd3553469a0f64c0a43520d39fb33ea2c1e55658d5903b5513b04596e0837e53d67fec60c4255aa99b76690ea67b82e436db78502c785ce81cb21a373dc6c8feda816cb419443f663e62a8e963d4cc3e43022470c91f349941b4b7c854a6fdc9cd4846a424742366fa91e7f0e9ab7681e7f0e229e23675f321f93ae3ea5ca15eb30e9ea596a6098225639af3491b34de86ad2d536b1d3d1a43024bd2e47f7b871e7ea3865e357f17aafdbf81ff7b98d9fa4295bf4bd2538499c1b37540e5c8e25396ea8ce31cb212407911c4543367ce3865d398cf80abf0341c9698170245a2870e470e8700cd9b00bc7942aa22acd41b39dabeaf637db837f86de0c57dc8571e454b5dbc6afaad9367ed2a7fcb42573ca94364a1fa58d5c3c8ec691c32b9cbac001c5cdae4971e85c06e7aa92b9d0e34e25c3ae93ac68e3186de393ca054e0e8e27bec24faae56e55a6524ba315bd8ce05c6d15b207c86c1501284da60c4ef3269346de3332355ab77bc1433af1d02b1b7f0c4d152a53f494296d94a393a3b3dbab6d82b7f1af28d9c6bfd243a91edae1157e177ac88657f8553d1483845d43b826629070ec681c361a871257f1d3681c371ac70f57f1ab348e99c62144e3407940d164c7bc8583895565d885230b2a936d5cdbab8a166dfc3afa468ebe71c32bfc38fa460eaff0d7e81b3339ecba1125ca948d67721bbf69d240379ae2902539ad931a0e26a0d8603bb129cc70bb3ef8f1e378e22df4f1e3d0794be6f1e388e2ad99c78f23675faac73f43cc5b358f7f062277cdd09bc1665f348ffad5a7fcaf5ee5e657bf62f3ab678979db842dcaad09dbc63f430fbb7210f115fe29a87415ab7cba9e576ed215b54957db03d9c631e9aaeed542e96dfc33168a5c94dbc66f3269a0764d9a83663bd79c1d8d7e41e69842be559f35aa9a19751bff9ab38bedf5d473523bed6c0ffe992a1bbf0c6fe3474f5336fe196ef72465e3c751ecd542b96dfc248c941e61f418050065d6e3939f32468f4e6c0f7e1c6d1d681d7b1b7f4a1bb97894364a1fc6453aeaf00abfd6b287a5e9c8c32bfce40ae54d4a52b150bee8dbebb5f0e96b4933a738723138d7991d14b98d7f66875de39331cac6bfcef0367e72061039da00954420d58c0c1a13822f2e405ffe70cb79baff6277cbdd276dcd7bb7a8afd61696dbf8c79c7dddc7a5bb6f6a6d8fbd32eeb0710634212dce4aded667539106a2dbbe987d6127f69a93ecf5b4a9cdbe69c6cd0097aec331fbc26fb3ef7b147779155ff94f9952a5ca952bfb7a962cfbba167b3db5d8376d21e274ddfe2f759e92f3be679b7d69ecf966db93bf59b6d94411fb8b67fe9ce6f03daa4f50f0cd393dbdf5a535ec3e4f47e7f7d865ebaddd5cb6bbb5a4a3b3348a2b9abf0f04c350144ba5718ce2a4316bdc6d531a57bd144da8abdf97ae0bd8d8f51981924f3a5d4f977349db5fd7d385b8b6fd753d1da8735d4ff7e9743d5dd6dd743d9daea7d395f07f34dbe30f82e0263dbfe8bddbf60fb33ff8edb6ff07e6108b7e72e25c3f23f73bf29698d3b502dbfd33e2ea77f4f97f354cb33d5feadfd167e433b2ef06d375011bbf91aff61de9ece344bd6573f6f57bdb6aa2c045ceb3bbd98db9ea57767fa0e0a2e062f11cedbcb39895b2437d6331e761f1dcc5e2391a2e1ac10bdc48c5d81baf54016d23d29885fcc009c80f6ccf28263f3ba71f0be21c93c6dec864877aec8dbdb1c704b455016dac7dff6328263ffba61f0be263a0ed05ee05d298df8e2315637896aee2711ced1e1fc6da970ee493a49fe0ccdf8fe96a77357eb6f8333cfcc417b41734fb12c72f8d8f4d1aac2da6d6f68cf7eef005edfbfba40c4992a93dc7153544268f332d01bbdb39e474b5bb9f3d22b14bbfa28684ac3da6373bdb6382731d6f76f635bedfab57bb63ed319d81bf74b3e3e1ee75dce19c8aa97d810452212dce3a1393c1b9ebbefd7b415b956b7b5c3f8dabbe73d5a79039e78c730af252b08aab38e015dbffdbb13f50d308a179f00a9a9dc35fcd22346a764e5f74414eb007eec0243bd4e00ebbc4dd09ee364804f35f6d97c1edd52cb2fdd7d515471c155802236ee770d313c6559a1d83cdc3ddeb8b59a466dff445677bfc839c6ba8db1e8ae5af3a8cb87d3fb4af99d80ff97b7ffc9f6cdfbf2b38f1dff5cb57876fb6fdf1cdf2cdae1255107db31ffca8db4e839373ce0bd8d6f684f893a182b7ee27b32df173fe6c4baf5621c60fe7fd35860c571d8a0dfa971361b0f20d7292f9b38e176059aefa876929c9f6f87b09d69c24860c15ee4d75f8663be72b816fb659aec260ab6c6c61c070178dafb04bf4958b2b3aeabe1ce0d0b8ea337ce577e7be0baeba8bd7f9f5fe8c175cfc7d179fc37d9c9fe12f78ebfabdd9f7daec7b6bf6bd34fbaaf61df79dd9b7b4afcc0ef78dd917dc37b5efb72f6adf8bb7dbd7f7b7655f977dfffeb52ff0ef9ff615f3375d55fd82c6c17917bc85f3f7310ece93b79ce1382e521857bd445df5576770aeaced2c5c0c6fad5627c3c59f383f03e7fd5fc049f14984e4a638aeba8b14860339ef0cceb5b5b2705cf0d62a2306164e3f9c54ff8d4d0d8d6a46068d49a1605eaec7aa28d9f7bcefd272ff3cdd37992539de2fdd1741fd69bf8fafcd065bf4d6ce2d35015afb81a1087e5f0ec11014f3dbfc65f3c6c5e60d8b2b8d64b92a35f62c039ac70143170c8660f83370a845518761f8321930fc81a1687b46b2fc7676fc7d9f499a4a7b1d7f0ee64c96ca5ca619d8f9450b2b811430e132a7397c20a8b221289aca130c164f18db933dd9933d4bd17eb6b92486a60c0fc179734e4572bb586b4d3232219859a0c16aa9de5e554c851500fe1c1d5485fda16281f08f31bcc21f9a337c30350de2d91ffc6ee45c7f6a2b2c5901b74212b6357444e9c515966cfc2be4b04b4d622104d6c5aa82851876b1782cccbcf5436321886dfd08b142ce6585dc0a397085dc0a391668b0da4d81b5831d3d71522b096181235d46f0be6c2bd86ccf4fcd5bdfbf70afdccbf612c5711c4f403700c20125017403a05c2b04ad586bd60ad2a2bd8e8070404900e55a2168c55ab35610a01c500e28079403ca01e55ab4d7d1eb28a7979365e3cfe9e520954afa5ed028254b923c5399cfe92be1933e8b57828e6924f44de7341331a992a8d2ba9c2ae8277d163aa691d0b79c662246c7523aa663b1984ac7b42ea70a9a530515932a89612a93676a78bca2196de62bfcb1b3e6cac65fc3abe995e07cf29f244f1c8de4fcac79c8e4bbc08e50544caa2486238b77a55785677b6c50b14b4cb1f1a34533540c93f0a746ba9c633672ae333a168f55c55dfad799291bff8c6e66e7adef49b22ccd1adf9e79999c5bdececc681e6670342a0816859a0215848d51bd9451aa28654b15818a49956a52b79927343b1dfd73e42bfc5303655028542a954aa1d2d5a784eaa16a52542f759b7932450accd3a4334f54e9eaa39e251893b9a3853a888af5a972baa8a30e4a72550b5763b2d58c917e196d94be1371ae306230623eb31e4d36a315fd80119379d30c9a79d3ac91b7a9b50ed7367e514866f17e56f0431bba0d1d11932a8921f853f3a15b4caa2486a0f61735892729ebf66a77504483466347d390d120721a3157f1ab2e3a284bd095a05e501557a94c91cd3488677b8838d71f7d8b712bfdbaaa6dfc2b1a76dd3cfe551176d93c96f90aff2c46936dbc9a2dd938c7629bb5fba1fd0821fed4d42dd424168f354548ba8ce0d0edfa3c7122b27e6aea16ac29c29f1af95373f9a98d3f35f0a7e63fb56fe886df2c5d74281d26dae2f390f7eaa27329b58d9aeda1d91e6ce3882dda3686581b40ac90bd73024a4e2c627233c2567b1b1da4242d829cb0c5c6bf9a1fd8f84d2f3ec4b95a266657b6f8ab65c2c8c60fc30cc34083a1c85b2735091cbf2f7f1af5af650fc3f91c51c84dc19c62f2cc29ac9a12856cb367323215996ca6224a6248baa84c379727d70785410423e62a09ce205e5095a09eb7be29370573777d78de62ed5c35a7b02d5614319f9ab2f19b3dec62f14c46d6f5b302531176fdd04c366f0ddd4c45d8d6d011a92fa5abcf8be9aa86e9fa64baa22e664f959a3dd36de36fd136a6d8d8d988e23674b627e7f2e4a6003b327737051b502c2b8a277be72d1b4eac8adf7cd4e5c95ee2898d3f26ddd9880925d99e15c8b0cb860f76e5440b212cac8af3d92b8b5762f1445ec8e215d9f849166fc8c6efc2e289281dc4ab627bf0c38e6e0a4154581f1c54459a83a3f2fcf5a7b69f60d93e53f3896ed4462e9e3c7f5a5ac85499b591cde7681c91e6ada19b0b615b434758b508bbd4242c8575b1aab03bec62f1f04aec79eb87e6a215b6f5238455c95f7d5c7e555b7e454fb108460c69e387d136ccd84d81b5bb3e43474cd9f8b10d2956cd666ce32fb58d22db83ff45db90d91efc6a1276d928625755d0583cecb201c4ae8458e2c70fcd5b367c5815a7ab8f938ddf255d5526fb8dd8f85bd2154db2f19fe97ada258ea8491bcfb60e78b18ddfe675500faff07f3a08c983b2d81efcacdd4d214809d6c7ea80091bffcada6d6c4a6dcc6ccf10e7fa53d3316ab607bf8eb6382db6f8eb8f928dffa7865dfff87f6c26ae09aa8508912277e9cfd1412e66109806f18a9cab399b9942dca51f3f1983a35d3c293353ea68fd393a75f1a5b6d9af732c065375102fe88aab41484149260d9f3da641bda273356b3ae06dfce691bbf09b4bc45f4d251b3f1943833d458382a179a1b93457460c2df8c5d098eec32c2c6ba37f1725bde2dcce9f12d9621a82faf579a3f10daff2db688cc3ab0cda9a2877a81c024723ce5249220423eeeefbb707a2956dbfd4b32fd45b9efd8ff611f196ccdbff8abc05f3f63f233a6f536fff53f2ddfeedcddbff86d8144ceb27c4b65958d5ff03625b39c95559d1e7030d0b2cfb936d2b54aceb8b7d33fb2adf7ee6d957588455a748b1adcfe6ea1151b6fd0cc5b6be9babfe9f1276e5bfe6dcb69f9958d7875bf3926d3f1b615b9f25df7ed6d9d7f8f633cebe4a6fc5b7df8e08c9f93d1e66f31738b7ead79d6dcdb7ef3785d3a738f645f3f6d51c9b82eaedd1795ffb6ca198100f513c65a8798407a8d4ede62dd5920f00b62b6630144b235992e054bd692ab1d6d99f367261d21710774c6a74c3c2b192c0426265c14afa09c14fec67f61324c6c4e70f6d17850b2d73c3c26117cb871a0b570467b2704058381f2c1c2b092c245616aca49f10fcc47e82fccc7e68db5ff5a7538975ce3eb5914ebf8768a3d11e2c984e9a948484d4dbf1f0b67b0a96aee05cc5b33c4bac5d6c0da650a8a963a2a814a8cb5db15285ca0eca1327a7cad4d2620619e96f29b1d6bb461bdd3c8d36526923990abbf97f93a679d484aab9d127ab489191da110d11b41e91215666dbbf265d775029d3a87d76395c152a53a4e89c346192571e9b8d54b5265d5c4ad91137a1248470424e08e57651c86432d97d21d911b6352484bd796b88e649d8d6101116e7ada122579db0aea118d81c760dd5f06a2714c57aa22f039f5c17b0afcd26400fbb583e6c4762d2153d79d0dbfe77488821da101143454331187a6208d43ab68926db9b78cbf4fe433947615d7324952ab1a6394282f3a278088a6e142db14e01212353628d024245435362edf23a9a48e77b8830f57bb060386fa393d3614247b7c36327b6f3c38e6c27889dd94ed10e11e74ecd070b4ad53c33b002f0c7d13c35b03f492c907f4a87538f32bd3567f8603a3fa8948e8ecea9a3d3c13aa60ea8b3b3b3b3b3b3b3b3b36362e5b820696a6a6a4aac5bb6e6e929742f1522a5a544a445690cd25a7a4b8f38e51477623d85e6e9de8eee9dd2f5d4bd54889496129116a531486be911e92dc5353630313fc36dcaa749a2c9a2265653448dade6889a5b8d1235b81a5dcd1356f5cf353b5114cf1345ff55966b1579a7f3cdb7343435b59a585813ab89d9535513ab29a2c6567344cdad46891a5ccd1335ba9a5be2dd8248323b226315f9325d5943503055a52bcbc769e2380c507f631680c729fd1bb346dea99b12ebd3b6d148507f6a1e52af43dc3ce838f7ccc37c4e121212f1a993ff6319715be2aa1f71fa21286fa7051659b0f4a84c91f233302a94e651e2aa29755f70aea71f3992f34bac4d39e8ccd120280d6502cda14fa03a540a7487f6502bacea2f8a278a22c57c6841c6f66789bd2292581f7f19cda3e4e6ea121c5ee55c7de2aa6e77938a19da0d4d71574ecaa3c46dcc2030083a43692812280db5a134b4086502cda14fa03a540a74875a81f61e45dafe29db0dd724a752a284e347e6feb451ce9fdac885c9c58bed658a17de8b152fbd1726bc20c1c4607858d55f3c4f30329466c96e49b68be2afe2e64132c2faf47878b5c32b9e283c3a9e1c4f131e5c8ce6b9d99e23b6f324b13c4aaceaaffa7699f2d85e70bed8764ee9fa67bab28aa4e68b0d95822fb697295e782f56bcf45e98f082041383e1a1c2c876cecd74515dea12eb9275c4fa98feea1829e2838506c407d3b8fe4eb5d63a69893529f371b3d72fa64d3a2b8f4d343a5d78ed343dce937686e394587fa98d296762c2a43bf138c54e3f9c64a7204eb353d18988140a35f1a966a37994f8e9b3ea4f20f2c9c4842967d26193ce34e950930e65d2a54cbadc89c79553cc5b3e564e3f5439c9bce543e514c4ee34c32e1f2827229e9c8abce5e3e43cd5b6bfea8e269c32c70c32d2f97c6a23fda566d96c4fccf6b88ee96d72164a362b89f5a1663404880f9f24a49d0f1659b0f476e6e1d181f5b9e19ae494d8feb6d4825347df9c9cf2a6c42b4d51ea8d428cb49188b1688c815d8d353cde7c3cc2aafe31d469c499f09fe6a3255e698a526f1462a48d448c45630cc6da781b8f10c1743d73baa27b2df550e9faa83fa5ebce5e4b3dd9a85947ac4fcdf61cc12879c12eb23dfea1f641b23d468a60a16d7f54baeea4d2f57da8d29bae624f97bb62a50a951d94274eac7a9a9aa706b66706d6c7a664d4361b6bbc6f5e07d53c4b5cc5e5f0ca6fde9a347c762ae5b9b9e0345d20a7c9668f2ef48d46f1caa4a35362ed3b585f6bed8b45d280fbd3463a6fa61ac5ab9ba62f4aac2d8f125ff9f3d88e9c6b56cb1db34669ab529b3da361f4bb7a5f46973a46c6fadc3709f1108a79abc5aa304aac7b36d953620d4347e7e4fb3ef83cdbd4d7f660fd6237f1619bf05ec8e28524d5876dc2dbfe2f24bd90c58a5562bdda2d0069a1e7020f17623b2d0069a1b7fd5d88b9c043fd790d7921b5f0430b329bd1f657f7ca63c35add3aaf212fa4eddf82ac851f7602507edac8c59fda28e7b33652dd57e50015014ae2b164b6e715c4be66cef26157feb69d7da4a8086dc8f6180b888c154bea1541b4593e1ca1c5f6c1c2226d1f2bd6878aadb273549a8707d6c7df85e6b1a5359a27a7799ed81eff1dcda3e37162fbe7882aa02234a0a4edff9a798b003d7f05b12d02586161b4d1cec768a39d34258015b6c5538455bdc5633bb189d2d490a1cc0c4ccc28964afd6d1d9dcabb248e31303332a690ac51a1a6cdbe8fcf2f35de25718c81999189414bedbb248e3130a5bedbc4274a13923568ce8e064dda4826c2d29799d131da284d8d74d207d313dc3e5478b4bda23c36bcf27fcd73c32bff1bcd83c32b7f1d9386cd46a53e2a19648cd26b276bdbcf316bd8ec92d1697ad4af3cb6196d5d155f475bbc2a81afb5c52bd55fbd663295faa19db70c45615bd696e9697bee0c57efc7e8155d7fc549b1d618ab0c1ba3c41a67934025d6e96e9558ff7fda284d4f8df5cdfe7472ac8fa86d368e59a3b44d29d6369b44a1c45ab5c95789f5ccfeb491fe531be9e854c42b9bf44ca1c45a667f59c42bac6336b9428935cc265928b17ed9a73672f19f3622c2f91e222ce773cedbe4246f0de93c67615b434f5835865d423cbc2ac2b68498b0366f09e5fc08db1a7a81bd796ba8e6aa12d6450024d8ea7dacf3cd2cc75f8ac02ef0e6d2e32f69221e2791c70e2f36f8e58cb3ca845fd41676b5ba1de8c42bd15bab8dbf1dd83d06a4dbbfaed45df9afeaf833caf4ba4e6d5f251c8a24097a49fcbe9cbf2f67f0f3a74df87b8830f2474d24930123bf87081b4df0cb5b92fa3c472d1361e5939aa8870c58799e1863b7a409bfc52edb62959a8557f74d4db65833d613376ef2964e6232931f0996f86e8cd3352d9d20f8a48fd792a6fc8e929a0809f8e4a7ae0bbc2b165e79f8e593a4b63012bc2e7b572b7857e3f760c1c8371fe32ddaab8aefcf7a95ac055a4b3fa39973f69c73ced792a6324453ac6136a8333996b4b63d4f6a11afb03e77c9ac416e305d35cbe24e9b2c95a25983dc38156d8f5e59fbd6207726f7a7cb0d8a61cba863e797ed3a07abcb3b443fff7357e9122111af263f4d6efb6436ad18d85f2a96a21db7a8730ef5bdd8e66c2aed729734ea2b5f6170e88e8312389258f7ec511321c9f849cc6463006c9f6d41500c0a5fbcf9aa1250770ee07f4f9ef8c9cf0c2a3dd6e193f72c5d15cf92bea6d0cf16cd52e8aa58d2a7abe25b53e867af6a50881ffcb594eaa0eefb2098965f49dbfc256dc1519f684882a3167de5598873cddffbfed215c7cea9b8da276824c6b6fd6fd6319a9c299e7dddf70702443c73503a25e164c4e403538f314565fbdb6c1b532062ea623b73b0fded2909dbdf9e4c3ed8fed6d463fb5bb306dbdf7ad63092385333fbbabd523904249718b3188ffc2fefd7b294bad8ca21dbff924b6cff3b66b1fdef78b4fd6f2908dbffe2ac7172e08fc2958000452442a4b088d8c2c333b1040498bad84424b6bf876191edef600fb6bfe7ac6998a048208ff05392a9c0b2fdb1e37e05796c7f1ca62eb64fc9f6c7998aed8ff309b63ffeb286c1c1146125b0278130452e520b0fc44a6cffec49db3ffb91ed9f33d678675d2271ae2e369d7d5d20f8b0fd5f62f6f5b9d85ea06cffaf85771f08dbfffb707a7fd8fe5f0ead949d9f0615f0af2d3905b158e617edeb7efe9219945d5a78db1fd348ed9bbad85670de5f5d6ca59209a72a71e3fb31b6d24d4d712f2f7fdf87ad1974b23dfe2a2b068c7befbd38b5f3fb15e74b7b0725ce9565656c16769da23f8e2a8a63ba9e282aa6ebabe9cadaabcdbdf0f7f2763e33cc0e4a9ca71306d5e1b3ed7bb2af6f0994c65d27eafed1f67dec97879ab12b064dfd7aaaacea78e52d944c691fbb6357fe2adb726155ff771ffb2adf1f00f665be7f0f0cfb22df9fe7c54ab5afd2fbefd8974e0e8e8b54db57cbbb7cead718a95f5b2ca4de9ffcbe9d42c5ccc02e719f72de25311c4993599e8e8279095d5af4c579dfbb4de89be897e458bac0b9c10ff505d00da646688ab240dfa7f4f9a5366b70c76822243985534be4b43ff7615c84425a9cf50ec1fb50302fe86357cddb57593164cc70e105eca279fb05c02ed5db2771341112f47b3c6ce749d6368d18a9b90b07d5a9dfd12e68683411924b44852f0d08dca56dfcaa203e4a802588ac04484170418c089224c8912045820c09022448ac04580081db38ecc2c961d7ebb04be70ac13e6eb30b840f23b002446c043d206e402401e20810458018020410207c8c206904587cdc7cdc7ce07ce47ce8b0eb268b3f6497c8767dd8f216311916322ab22419cf87cdc7111f457c0cf101c4870f1f3ec8906456886c4436a21b118e28b7056ee3df11db21db31db41db416447d10e233b6a3b8e76d876dcb61062e3df31e42b5da21bc322e9c63c90f465c9798089078e7800e781da13929e80e509569e40e509529e00e5094e9e707b42122c92367e0d246d20b601d906664a906dfc3a723a743a763a783aaae8e8e9b8a2034947161d491688659962e3d741051c7bc8001270493a706011663a7c54008b0e590590b2e0b2189125499623598a6419920548965812b040026ee39f006e02b909e826b02bc26ca5ad456b6d3d5a6dab92f5b62e59716bae082fd8f8d723360552052a02aab90a74046403ba012d715587dd810a19900d4889bb5e537c85b1eb658b218ae789ca3ecc568a1d04a040c00808e820702b826cb38ae083152cac60b162c50a152b52ace4ac30a142b6f137a0010d68405146e2d1367e1b7636f06ce8d9806443161b926cd0e286d80d4437c86e9861974a8a246cfc366011c592a9c3196d7a229a57fdd546403f9c0889a9ca6f613c3c1083a5bfd2e313f510613cc22db6d80286843c5f46ab725a009af4740292cd8064e1b7c4540757f1e380df862136f86003cd8698143a299c48c1440a23a44822c511298a483193c20710761b7f8e5d0e5e8e5eb973750aaf77e585a45f49af24d607bf0e74bf8a3069a4764e5fb6159cab05822c470d7f0e19ce31c3aecfa1ea3e87e2362efd6a8150b240908da6179ddf4613216180abf8497b4d37ad18d839bda1e6d2800481056d1644d2a5e5684c6846d092d08ed08ad086d064341f6e90dcce61178e0ebb7e7783f0b0ebe6346590a1c5e484cd268392d3e9458622198cc85054030d27bbc40f1968435286980ced86704ecc9cf0e1840f4d60d1049626ac3441a5095d134e6cd06c14d9a8d9f8317b399788d988d9208269999dab75924548c8c5c50c3abdcb480214906a34cedb689d5fe9b77955bf662f22af22232f1a90ac8857129b02f9f6359ea725de3279cb2c69b04bf5f85f332824e11876bd6c46df28400a76e0af40b2217243e886d80de1a3089621644590726f0823864832c491218a0c3164082043c48a60918214ecb0ebe6e5054626861758b1dc0b24a0580c26318ec4c0c5a8c5488a8125869518546248890125869318b7184958b18d9f1563c958339edac6ff02e945124f8c878847c6f38367c6238487c653c4c363e3e7f1c1a6403e0ccaac51dae5f7e4173ede61f8997fc3d0fccc172d3e10ad14cdd285329de12a9130fcdd8bde8b232f80bca8bd98bde0bd90f202ca0b272f98bc30e2459217452f86e4f47292f46ce3ff1def7b7fe5913e8bb74caf85b74a2d7b2b36feb762532051a85449864032d4a2f8863afc183368b67108246463a01fae923365d646aab7d14033209a03a9806458086f5dd74bc9fab2ddf46553e53ef7baf77183e56537488f7b233ec91ff9223fe4817cec060b954aa54aa56a3e6513867fa9385fd0305477340a591c08bf8d4621c9d5afd144af9803852890ecd533b269c9dc704d724f745176bc2436fe17139b02f96a8a42167f49514042e1c585b34a8990e4cf5a853095a1c2a97c98b1a28acdf454375512d5115511d5101510958f99a4192ca9546a2773de8fb1f918d30019c6e36e014b9f445fb45da36bde46bfb246210b0a49aee29a14052d7c65ee9714052415a080b45720d90b2975b1cbe66b5e4f5eba5794d7ee35e5c57bf5b04bf56262e37f397911c1ffa2e19cb25a6ef6277f0a958ad9574b4ed7542a954aa580a450282c2db7165c4bae05bcaa32eb981add72b5d1aae5a8a506e3d27438ec4a73d865a3c3ae1a1facdc14c42e919e7db9bcebc64a72a4c8102037053e922e112c34ddc67f693aecbac91ae7899c4246081511ba0915d9974be8848a13294ea03871e28489139b93234d90367e1790b00b4941b120d9cc8c19547e4ccc88a322c6ac51dae693f77c99e124aa439ab7d144403f7c854da0d9f9b2bd94bc6ede8af99a9408c9fdab69cc142d8b501a6ba44b212db3165a4bd109e534e2d49db716598b0f27162796d3ca49e59472e64e2665d1c65f1695424a9abb70fe9e2faf32837218bebc35836e6a4a59f9c326e5718384bf948567d646352a304b1923999047481c592393482ca415920a298584423a216f649230b6f187b15016cec02c60120d0a483bebf0af36b2790b2443218bbb889084298fbb05ace6f1a38054a375de46ffa33aff8ece59e9976d09ee95f39749c367cba4af5b0ace15d4814f8050401d1805dc8153401e5805ec91364032b3c6b85f5e9cc8b9de1c78037160eec3e2a3f2257d3cd0061e018b80434020a00fd0870fe9b322e207fa013f908f9b039201fd009a010901a20111f156f9f8818ab08be65bfe6b962cc1b90b475f9bf4a5c457f86dcca097f46513e25cafeddabcf5f2f8af12276b4a1a17178746d7e8283d0520292029474c0149143044013605d0a4f4a4509122450a14294ea430916284949a9422364a6fe3bfd1bb8174230901b11c9d12d5463434e9cb865737dc4be76a14578d56296ad228ed570e05e76a9dc8ddb871e3c68d2ade3aa3dcb871801b078812254a942851a24479c289dcc62f830c32ec9435fae6714c1aab8d3e2953a2660d1b977fd1a54daec81725aa8d703eeb97ed65a35fb857ee35a35f535ebcd7cda451da32e96b37e47421875dd0b9b0c3ae9ac7ef02cf852ade3a1fbf0b3d17ae78cbf498fcd5369962e377818a4d817cfc2ef8b02e6b0780c5baac7541f60340b22f9777e15846a849fe085ae41cb27108e4d424b6711258945ac06dfc2de0b00be7f1b7906b41875d3a8fbf851dc953da689ddfd1fa6bf4cd936a29078608e30646087e303256cdc070183230d0181817060c1830acca327dbf83f3a836fa8fd1463a298a57f953da28fdab8d7252d9c3705217df0caff2eb1405a3fdfae47fd1f9f12abf8bce37db93bf45679dedc96fa33f1a5ee5afd15f115ee53ff577e46afe93fe6caee637e94f89abf94dfddd4afd2d71353f8dfe54facbe1557ef27bc1ceff1db13ef947fdd56c4ffe925ed5351bb133946fc4dd214e3b508f00124d845ae7bfd38ba9fc84784be6bd35d372baa823b963f3e982ec1f21be1fdbfee7c3b67e689fccbe60defe40f1c5b0c861c159b951f9b14971fdd4f00aab5bd81556b311b6c5e2b98a6d8ed5d14448f2f77818ceeb9cd7c1a290eb23d25c1585b0aa58844529ec4adce195d87355b4c2c74755ff51f4a78664c6ae0ff973d276b3b6b5af4b44247397760f6d1347434736d08b868a868c84b8092143428668eed2bfcada68f5a486e1070c32186236b4b091e46a16a42b3ddbc3bb791c1d4db4f33d4498fa395a86c2d454e77bb060fa551b56ac8f1055b60d2a56e86875a5837a3384b01d169cabcd818d480e9a6cfc301b86dd60b8ef33837e8ec0129ceb8f2880a4d7fa75f47f8e76f1a4aa89d4f47bb06039aff32b2c5901b742122be45808010b3116662c0409a54ba854aa5494a67ada31442302400020001316002028140c07c5e2f140d053e10714800d79a05c58502308b3240c741432861843882100000066444866a6090080a80ae005ada8063790e3ef938fa72a7b25d10b4841c4a076ff7f9eaac0855cdb8c6e2261d1c814507a15fa9901a9139e05252aedce0e1495fe189fe4a6d87b45d373933bbdbfd800a18dfc55d3a18b04bacf7ef038650ca315d5f8849e4a4e5908b57d1c2ba1f76b5d4f5015cbf599704c4cb821b79473e18b1282441d95aad788ff4c2a585a2fb64df1585e2cd4917a3bfdfd112c44925c838731371dc4b9f3d62b5ac2f704615ca08460475eb0a5d6bd12602f30d6101b0e0cff54a8d5ab265137cef139cd7daadc66b931054a7b505c834c15e837c2c94c9682a69b097c286df453351a46e7eba262682ab3bf03c01e4723fb087c2c43ccdc5d4d4b3f8e4be80dec3f910246a0179666643a241e48e7ea6dc088c362f467e3849831a8a604378fdc0b43e81cd3e309016dbfe1ca0c8c8ec901bb7122ecc7217d8c3043c6180e6ddbaf3d395ff5ff25cb53f678eca1b3c32f0965f1bef198c5b071e16b97f157914f617435db3dfde9146b4ee063ab78352dfc152c88e07e30f878b6c0c20b1706b01856ada74343a4329e090ea45da803e3c8cf4a4c14a55b65b503788e1253704c22919677523d4f134c1a680267156543657b071ab02016733f941f22f5ee440861a1752f4f1581700122784797c7aab633d6f202381bf73bdd31562b4b2df3e019b050b9ee0080d1542c1a580497d2345674d8917f87b93cfaaabfdadf01ffd831ecd9b2f153c6f25ef352d484493c0c7a1d397f1613f24aca88b4f45a40f7998868b080e019aab671d351649f2c9e6b5e5d543e89783a3bbf7107c568c7be16b3e360d5dbc2579e22f22ad3ae2c952ff0cb0e1a075efc75c76fc1417bd42ae6fa9c68479f69758dec3691afef22e34696f7f525b7f4e800267bf4c2d4b5f1b082d5fe2b60d25df433c101f2ef35a64032ae642cd126e767aaba076fb48b3fe6cb1fcac77462690014157a88f012d878f0c4dc200015fd13509b2e671620b351e07ade541da3e52e43223fad7cc131144d25671c149e855f870df711b3500b1ace0c99aec27f3e4cc506fa522316bf46eceff03cc1e6114186869b09def2aa6a3c6e612e35fed8fd4473a3fbe46c0ab24a5104068de681f3c55154da49fad5b9cf76e9122a386834c703b1dda370af5b0ac25fb69cd737b7b034c7fcc98b069a083008fd48cac2c9c825e1b362afa95961d35c93666d6cd0c354324645afe39b985caac78b7a072513682cec178e0dfc6c8a1e90c9ec4f6cea2811f43a61be8ed5a1ba9cd2b164c53dbf0782a1dbbf35c2ed58087541c009b840a6f0267b17f9ae501a212ee9645695e4ad950b73ca834b3c4a08c9aa572570ad3ddfe9f58c037e2f769b5ba7a9422d5d53a8471ba006ab7e41152513503d221b2485d8147fcc9026201b7599324a666eb5f237dec11cf8463249285246cea3937521afb354f7fa8757cc0ad16298b286ccbc510e937c27aeeb2611338caf810eb550fc824866b4e6faaa88900ded9949103ff15d91ab5b584151a53bab84e1accfd639110d9d933558b14f430d30992bf7a63d0232c169d473a635f1fe85816ee7310db9865f9c5d95abd288f4df6a9b8e3c045c0521136deaf998b87f7e6bdd1ec97a04f0b6bce611dcb70efe30880ba2d9bb91dfd913bf8a42d584eae854fcd408f3623294a6ae2f044d3be8933b9d392a7d93a441202a10d47800066603a31a08942fd51ca0300f766e76f15cb2b2cc6e275f9f8ddb1c82c01e93a63360680788d3e347b02fc4992e11b2ac8227e936df4041d7437f2e8eb60f0d3447b76a0a43ea05b474e10d7b502acdfb8b93ee180ee164b1675e44d14547dfd0a13b11dcaa462e08ae49da64671dc9ebc08e5efc17d5bc1af9fce9e00e5aa1d791bd2787987b1b32574f903c4fea95afefa5e0738698c59709588417039041a23a7824d80a62bd2a719a329bf4c3fb9feab81549868cade5656a4942bc8df0d912979acd99631156ab6c7b457c4c0294366007eae8d1a5cccab6276f8ec7351bbad0ab0c9e092b6661e7e712891c58491ca2b17354b36486383894437504065df621b2c834e9b2a290e31d7efca14fca1d5942df2f64ceb2dfc48ffc68a74d31d41a899c16f92675dcfdc409c013817d441c0b8ae5c02654fe755405f0c3d35a8ef5609265220baac205d723984ea6a4dbc4385be6f092a1f40cbf7a887c78879167aa193ac0fa1855a1f5d821dcce61fb18ec422baad4184246e3ba54c702ac6a117c00a077c65b4ebc172c5bfe1a19a76cf0cf3c87594450ec94f95eb3b7853e49c6cad42883ec9488786e4a3cfb979d91c0ec54146360b7191ee174262b6fc0ab77e77f84776684efa53ea886bb24df183c135aea2a4d0bdf6816ec24f0b048781a2d88302963c2713f7f9f42cb5f86db3ad6984f401c252841dd883da3c6fa77f9b6857ba9d0e1d7a2e5cc0b75bbba06e8cf98454813f85bc2a70e9315cde3c759cee1396a68ac8c780ed6703611f18c960d633d67e3184fef645a224fcd71a30812ce513537f6d25c73781bc6cd36a8213ee8e8e0981bdf0c3ac40b480000bd3f8a3e6c85b627a9eb70cd48a9331e647b5dd35059f1b81d0b4433af73a4863b9a1bc7e57eaeadad21f6ae9774e4372ce5ceb7c3aee7c16bea65267f73b0db8c84ccd423f3eaae54496cbd88e4f76b10af0eb48601d8173b830ae60640bcaa6f9331b19dd296c86a9891b6574500d36e816173598bf218e356eb7e59239a325e5cce79bfac66e803efb1aad6cc086f92955076c5d1627b5268b72293be456a672f5288859281fe26ece76045de292ca9e3c108af8da9d68015c9bd52dbf45f6da96af5255b5a37f956d35f63ba0577765f2d85059db0fd1a8f2394d9ff2791d7cfb4284ba584fd9581b51a628269a5d58da2fae68eafeefa272ef7a59d7f45d0f2d6f8cf337af748e47a311965c952b13c67b0b2d6cc2bac94a9eb30a1cba6cc96978ee3a995e481e7613c0512879e418193fc41a8c9cd736356e15aacc89704d70a0c41cd88350a1366cb58a38e75caa4f7c136fa4d5bc9d488ba381559316c08beb548ce7c072e82803675b2b1bec9e471e9d3184523f669b09f4286569604df6ea0338149ed24970a87b71b7b4a3d6b8866059e68fe05a868bce564ef2eb1fa12ee5efddcd374a501ccbfb912854aa4f5f4f1dea0c053829c48971c5b6c780e25a4fdcf822d6c28f70c14e92d3b79ff5bb5b54b65e13bc2ee3c081ea8af43bb896813ee32f2e2c822b731a156025bace8684a968ae5398395b526f34223a4a0c882c3580131e78a7bb80e200fe775c9b9eeb8c11fab851229cef3bed78a036c89e14571a74f07935a18cd5a2397052b733976de38b91c5cc1a177606594259bac928e8e60ce407e288530539a69e4a97aba07fbf687a6b78e42d30092b8c2357634045389052f534e6f00833e8c9f0daaad9131892329b7dc4b721c2745e8ac445ef8474f447777a48278b1ee9ddc09adc6c63e6eb007cb4930ba43f11949b8cc6b854065882ea900dd89c3b5edca55eab252637b657475b61e3fb1546bf84347afbba82877da7d2a7aa56e22f8128411e9b89e60fe4feff6d67612a6c96655421d36b774efa6329c8d63fc4c52abb03cd504e0357037d638e17531ea0dbb665c87cb0ece07cb4aa9aee16c18a2eb01a07d9c1146db94df6db8cd899378325b974d50bfc73ef46dd5ce1b1515158816e4a4e62ca6ad74c0f5d81e9a78e5ad6eabac84ed975842a307de9649e16f692218bd34e8399ce2ff45fd471b7b64ee635085f6b29b07b9259465efd229e97bef8a25ef954cb234ffe486da0249de58dfe20b19543ea661cfcb62f180a92541d02c4c4e0bc00a6db1677212caca922f5185e0b6e275cb07ea806223a254c7f2f86df071743b20245a68748cb15c83e65d57090cab9aa35b71a22c79570a88316e892c577799a4af256ab1cc4d34408cd8da89cb300c9adb524e076806d172e1d30e9a1f8a6de80798cae93fb4a7f60552e0066e14e320261b6ecf0d874e2d8f2a486caf02c1b63f53fcae0542acc7a65a14764a48bd666aa09a3058933bb8effee31b588847e2b256fbf62813d7284e5d2e4cddda3f8733f6451032dc59ff6957cc9ea7658137ec8e78a5f52a9f9ab5756b6a1d8a3caab0dbccdb2941afddd11ccdc4e0a5336f488308f91874141b4e5179f2a22ad6bb0bb93cd81b82af49ef95b1e6046be9e8805827b3fc20c1378a378facd27d2889634095d848ee3dfaab62aacbe3acd4916b70d06b2f2ea6e45217fa4974a8a0d7bed1c59842b4ba9985d5d5994514df4f3c5500c0106e09975473596abb01fc2c9850bfdb40e1983d7bc67a18150099eb71a175b22e6e46d1e2d77177aeb814f6b08f19f2d050ae0506e670c5d3c7ae190d34733fcaed73a912901648ad901a34218caf7d243e43d1a8c093750ba43de72a7c29f7df93681665e413fac18e93679548b18c814b01c7dc5326f78a94f49b51c529614a063a3efb4a903090ee3d5ce35c5106351e3d8024cd299321520da5c092a155c9059f558eb677d66b1971de0cb9ed904786e06d0652a184b9abaa91a5a1334873d5de07e578a55afcbc0abe292d799d51a5277a401ddd8d8c1cb97f81685e9ec322f7a3a0b72b661f2b4689dea30ccccea97406486d9091063b1fc835e264ec3154b513e899956367c80de159c2067046f7ee7f7259e19a3f3800c4ce0e7a96d414202d3a73429543431dee9c8e7e04ac4b30071453f73b4c2db506d11b4a9fcf35fb040ce8442315d5a782516b429962733228def004ab3fddc54d03bdd5771a776b229a014acaffdf654b8fd792657ad6655eba672bc4ae66a1d33995903e85b9186bc6c1a993df9e5db195d607559e001449bd65458fc4c180895f6da3e49c47434380745776e516a383de927bc6bb3a313e507e7a9e5e0703ad7fbc30db5c1c899ba3120ad78284f7304167e4f0875705d3039020658c01803f7ee42763d3ab3785e9304bb41ba83643aebdd9a76649e4eff6391b365ba385d3d05bdd5954a0791943c35f2a9ba6c9190e0f42eb75668953451944528cf09454426534ab98b25692feca94c36234b364e9bbdcb5fd53a476e2c97314981e3090751677a4292d618dc6377845503c774d2b871a821a5d9037fc4f8c6fd742be43039dc5a9ac174275c86350afcdeff39b538e04b599621b7400b7ed4705a3443f66b49706d6d69085aced2311c49c1c7e0c5abea27fda3866fbf37d2687feb923b9645a1303f8aa3b902efb7037df88667a1007ae6ee369c893239eb9f1ccc5d3f2c24bc902baea8a8efe7b9df3fef92f031381e9d5a0b995ae9cb4cc9ab929f743d6faf44f227ae86d8d16b20de9c50f613294e219b7f9bd7bdd3374f4da678e1b5c554d6c40fefbb6f4993d36818b557e57bc353168e2bbc295d70c12b0bcab8cac24d799088303df4e74131393fcbfbd73a3af04f4aeab0f4f37fd75603d4fdc4189591c32ab465bea432782aa0557f5547a6ebfb9a754aac270971aad0c786a605fc7d6d3e50f032df10ee8173131d132452675ffdb586c5e4efc62e912ea2cbd80fe3638046f1fcf2526ba361d447769fcb762de6d1cdff67dca5a33e61adb73364b3a33d665adea016ad3f156d50a1ec2590d9b15dff21b47ded97032c52efa6a33c923f9443a41238e16c2ee24244df1e69c2e3325ebd05a0c66d5d0d2d8a8d61d28655ab5fbd938235e1d9c1c846e36eb865ec9a3d69af23e9e404f89e7be3f967b454fc18f46e3a552da9777032e5cdf537984cd0c913b9822875ab088c0ac04ab72e5d34a744623025963b3d26a4818e90ede0aa75ae3c0552e0489dc1fc56283b4d8de73c3b0e844d74b07354955d1f5e8f77249c99ded81b429cf28f1ef57efbee34d58b1628478d0f022fce822dd27c2ab49fec9e01f8ef27815bc2e80cacab3d65b0818d222cb7d2e37afd8b8867be73aa3657340db7f03c847eff958a3d12038c41d2f5d7f063ba98632f8fa8c23e61335ae0e577d30b7d117d55f8996c54ca0e62708a991100bfc99709526350c42263914979160fed9dce69163ebb8a97a3e7c0960f62548c8ed8f2f4f878a9f917c311f88b3f812bfcf1cc82398ac15410752336efad46f3c23c5242ea1efe64d161fe71c3a333cd92e73464a2d4bb7cb42d9aefaa368e9a30865917756a826e3f79548de43e019507f233acc9ef3fe83e702713a85ac97ff41730c79e499ab5f2f2e663db99afa649a2eb52e552b5d523857a799b67e072167a9f9f156019d4dd0c81c24cc6335f68e8dc4716080587d64d764be27c958266289e220572e5774c0be688375ee12569ccfab52f92aba117a4d69243e9e010e3d1cd86c1556f1ce435c5b25f4421056ea114d049818d67272403d189042871d99d282d491b50e53aa2d41595b2ba7c2d27f76837211f76a6dbd53cdd7f12dbfe5645ed7e0a2aa6df7eedc7e3ee7d766ff35df146b73cbffd482fefd2bdbd1da0248abca963ed888c8e9a09246a5066039f00330c6a53d2665fe2468e88aba9971cbbe866ce436e9283654aa93208bd382a62b3c84da587877c735e38731d21ec99ba3ba8cdd45f541cc358c495dfd941c475cde0ff6f4f34ad95691c9899f0ee9c4dbf5658d23656d6b1e9ec08d58c95ad6b312abf7e374d34be9d1738531729c69973b06683e28204e4056d894847586d39b0c2bcb76a4f74c8085e191be1f1838079da016f6d58a535c6fe00bba76fe914213593af69bd155f05ddfa90640d7d9c7ea78e49185e6022a7b35f9eee3418e7b5ffdfb67f30924e3ae437a970de37c169b24d16d25815731cdf915dc74c4e441d92941c9a761a4c490a9ad3e74d5957a0d6250ed2a0fbc896612731bd87558b5d3b41bc8dc9a8608906c3d34ea49f537b150ee67299a7b42e2d6f066b18d5502bc6165adc73aaa44da3bf16d82f083a1f18e8b64970c80dcac6ca03e30ee0769fbca3c29abb68d2164a1b09d536091f44aad67f40f202bd95f52d0ebe0eab40fe25689ff5cbbc6da9ee1afce7d06e0073e96642ff61d4f1cabd15896870a4054356b73c245f638158165879c90d41b1c30e6a60ca843aadb17ecedf184c7a07cdc1503c0758342d2d08763144ffb2f7f9ba3eb7b1e1eef2f06ecf5ab199ac06b062009703fa494d2295e0d6ed42a5b5d7b79a07490db691743b11418b4adde28ecb9f368293506c0bfab3b1f6be767ac7d1813dc4aecd512cceadbedf7acd321409eff13ede58dd85b4bbee12bbdfdcaeb509e5b0945a1cd1e57547186ab541664d5925ac676bcee7bc3403238f058d9cc5cf2de8255f4134e03fbc4cc05e12cca892413a101b3ba34ed726268727a322a087a46cdb654865b0c64ac11e9648e56450c5b855c6c3ae694fa75ae14370b2370a62a1dff230716dfcc8079ba0c468f42626cc7e02144e334825c79d7dafedd8826a7ba74a320f0e149f30aee5e1bcb6d52a932a93772da518909dd76749d94f3ac54f26fe39e38f8b219c201ed2c2613969dde70c6ebde2f0e3aec35fc9b71ab682a45601c7920b44a10c9523afd008849ce1973c539491de348bad6775fe98079180bb23be391e676ed421e645438532422bf2359a7564063f843afa224ea4cfa8395671bd386e20674a44f41259c02aa10554028d560f146281216f818ca6c8cccf998075c1b55278e24fb1b8719affdcffd25f5b9e802c43ef00fdd36a4506a72d0f9d0918c3dd35705a65ef93b69b6bce7535defc86122ad9fc81fe8db7ca6e27897f04bd923603e0c52ce2f399d8fe8c295892a53ab1baa407184cd4995a1a00fde350c110a4032b862c5ba8203fe5a1cf495877195c4fd2c7a3b96ad71a92370ef75b83331cd4b70295ff39dd257a8e0bf7cf32d08a6c19522291a5c66b3a2cadbee2e3f597ae9cbfbd9ec97a5804c13c210fd590ca8699d45d10b0aa58c4319bd2572c4e2f70555785b83d779009e243264a6c60f0cd329f68bba19b3c8d53cf1059404a978dc740948206b905990ba163993a8bb2718c3939206903e165a88cb57d88d64366207be9aded0a800d23b71bee733041f26ff1be2d88839f61610c3304dc1f71dfc364f77db9d12da4047ece4d503463641964e17b319fbec325987c9686eb31d4469137b7d13f78e3d40f7115ffeeef02172cf2034eca62bcb6761184d8c50b591195678998bc5b456473435cbc50c1d09245076efd008c3010d24e72196a263f8736255455cb7f5025605f8b376823939bf421e27cbc017f8c598260d9c407e2c469d088f7b425fc9ff3207b1692b627494af959cc7187c6901fd1b15c30d7b59af8c409466514f0a3050acf811d18dec2265e40c66403e31663576e2687db1d5b591185c2558956b8cf896083a7432d9c85e7150a222dd4f6aa7a525f7c8048d1d77f4bb3936b7daa0e5bcde0a0ed7fecc641c1ad75f8bdf991bf9b1b456a5a99f6b413766a79117998c37dff81e43b3dbfc329e78fc50f240772cf78ad21d101ae3fc3e4dba1c55604601b9fcd27604a0b9cc7e2d1951b6301eeb58e4ddc27309d6a6dc9f153e18fbc7d2d75aaeaa9f5745fe20dfb761a25f3e34bc5c85fd6407e4194dc5d6733c2432bfffb2dbfc5c0b722fe04dd31d232e5fbeb720f1e8b6ab6471daf3f0c9fbdc1c29db3234f890518cb06b4fff3c8c0ec841dbddb866e140662d39896b5135852e00f5764022734daeff0582ec1e7bdb60b9e5ad39417886c0a817c6ab2eca5ebcc7c477a2e480afe999de22b37316dabcae6fe4bb2907b8013ecf848db801df53a5ef3130345293cc0c40ede94dc5553a314cf863d5de369330706e65e45dfd6ad2e1d880f45b8e971a335ec9777979cb3857044a240a190eb3595c78e2ce80c81095bd2e88c432ea6cfb074f8cb2cac692b272c7b5fa5fb8d0cd6a6f65edba713e11df41ef78803f09f54263cfb77aeba48c7414bb77d1a07faae9014bd7a2b01130b652e9689f2b0b803b152e0b664e1c926be77d1227461125aee5ee8773ca448c78c620d33f6cc4de389180e48ee548a05836636a028d517c2fba661a2eb4d5e7b7cfe5dedec59ab33b08fd88a12b7ff1ddc2e6d7c6fb06c7394115819d6d430b5f6245890bb69b0a954ca58a5ad07099973042977ab821907f0a50447616271cc879cf70bc4ad13bad694deb52c7e0a11b9c1cae7776701b42a58152a0f16ac8292f4265e358aa5cda432dd236cf34c40a62467bff5b0002a60fea286b41c190d5e0ed15a6cac7180bec1359ebe8fb78cde3d7d77792f4979b5f1184b844f6b68b1a3521f09b1c9102f41046f2123eedf2be94678a085a3736e29c429d11c7a0431c15a9dbf67a9317f72a4f9bf4691c7682412a090ba91116539a46d85d021f599586675fbab9e77db20810590684a7047139f433a71384a8200c8b2823df5559c82f01e2884373dee7192747414866fccad9105ee114e28e478dcc4f8ea974017ddea413d71840eddfd090acbd7269e5aecfdda2abe21030edada580b13f3f7d86fea8ec160454454e51c9cd65cde014625bd84d77386d063c59a6f822d3625d4566feea401f5c5ccb64a613ee489fb2674a3187345ca0c11925bbae48052216869e460ec18fb65091eb0994bbad82a358aa38cfd52b7d3d6388eafd6025ac0e3416bcefe9b6935c681f57ea558f0118f9261ecf3f445e2cd0c56be0c7e48b980bf85425e87fe22a704f5c1ebeb586635704a82dffa314ddb1d6d29c07227416486284d42c42af53e3a7a2e38b4d5ff1433362b15f053b9b0ae37bc7e2e4f113debe4e3ed2333b32a58035001843ffd9dcc43f28228068695b53f1d9f9d850c72079ef0274f0d9cc4b2babd011fff8969c0718345b959483b2e6b1c4df8eb7e52daffc65aa6e3e80f4ed9fb2f135a1d51be649b6dca2766148d11a9f21fbfb3ab7f53f0e27b66a99d9a6ff4bb93cb10c4e88e8dae276a0bbc69d4e10b5641d313ed139f9970af8321d05405490eabe5cfb274f538d6e303149c7fe1689ceff8684dece109d9fa1f661cb2657f24e986fda21d03cacf710724bda32df8eb75bd051e23da6911c126919320185bed2c4e2064aed29c72256882699bc364cc79bce5d9d363988674e6bcc892a7b328c5c99f61093d3a6a30d74810480052501279917701109228e0cd6a199527859dc6b7a4a3f24c5190d39918436c7548e106060efbbb0085cbbd8654fdeadd1a48956bb3ae2c9f656534739b10e857d2758773e5a69c27575b7da0c759eb0d48654a5ab6721074548c3ff004268b391ddfd47cd6f7a1a981c9ebfde7bd7f5feeeb7be402009a1678bd5aa3cea753bbac6278e0eef1bc934fb796c2707239e300a9dfba9bbd6f790c02c50b2f2ec8cc3f24fa0af65cfd3aa4e7f169284554498af257b187f15d76a0f4f478318ca0b30a30522ab2a4211b5baa2f73d4f908a7b802f2b1585449c3afd97234d339a778fccb9bce13dce3bf859294e4434fa039101944347ce31e89c7ed5d1df41275afd29262cbe4ae5bac7148c70561b9757a3ee7afc97a768007406c6972506dc24b8f51032ad81e523f2091b1e9778354e4b8058cdeb737441b0ce6afdd7c77c415d9628ce9783403c2e284ac0a57049ef1c7045094cdf7cae2d78e57d873238e7e0ac1fb0ba24ed27c01dc0f7cf4feaf8e94d37189ef2ecdd86d5c3a1ca3cd4016be18c8cb11f4a859f95c21309587210910b1cc39f6674a47749c5f877ed575e326baf4c9f82af0e02f7d83bded2a5b81803b320ff02ffa119b89b160191f6714c1429e524a0ad0192e7d41843ebdaa51c0f03f9981163f3867527b737c998cbc0f4d648d3a6cdd531e3b916c626f03f8f453b534680cbda1929547d084041f83f08da9ce34c193a1caf3fb92b7e93807a721840f14c7486aa8aa5826b4697c44e75a873377280c45191febe323c45f23e62c665075d0e0dae94c4670086f43f81cf5db6c2c57c19df78032412754a93f819da9c84992edf3c0468dd18038a12e7e474eb98fdb6a59c332094e59c210a5a305dbd70481d5ca1f5028521b45db3e09bc829f5660ba595bf2993003ec83e29da9ed80997955a73d2b5e8472c7e9c29b3653b6e74ddc357ed6426fb8a147f9be09ee58666fc975ea32d5a6b4bcef19c13ca59ddbb746d905b7f0bca0bc992d34a047c4bba504499a65a46f3502d4df57a3e41402ffcb671b1ba6cd9c4454ef010580306da4e3daa2d4612233edbb56b190218d96a5371b974a4d734f62617afc70f014969d9d962ed0f74584cd7b847c6d732a580f7f30e16a5389ba59d4e8a7835a83b55b042077cb1e16b91dec0d64423476830c7ee487a5c0d8a2496b6e58c2789cb75968228e9ea106449b2237539d96a54c78fcd897e37c096f449d01ce0607e983e8027504fd1f745e12dcc61e7ef69ca004ab71ac474d9723ee856fb6bd436acbd31882afa386ecf14112c7fd9a3d92cd7be0c492cd7ddeab975355cae7d7432f09710e02af336c660048d08aba3fe8d85eae3bf3dc3d68efd76ea85ed2cedfc942b39d026091cc58f879a729c4dd6a07280091f80d80976966bd5a4c87b7260c2c34c7d65c442f1efbc6672e3c625257f581a435c8f901f8215281c20622aa29020e6c7214e5220439dd582a7071da0835d89598c6e9587cee4071f1577fa1454c001bf5081eafba184e59031cfe496e8bc06829905ecea5111e1389105b81b7b41ac1cfccabd607931c8cd59e79913805719dc31fe624d7eb2867b3d179cea8e2e7b3a39746fd65ce266d226f49390ef6479984c73f6481ec5140220fd2c13e6fae9b54773f15b01298ac4b1175cc24c850ad9aaa07b6a7b7f0ced4e9b9ac0d6219daa2d5b4615d142dedf13c1d4525be3efb1b3b049cd8081585bfd2e4627cc5476503c348d0b44a06ec44d5533669d8929d90aabfc8d503479161cd20bc805edb2ec400227c91fb2d5c20d00462c8eee81fc71a11cff26b4fe9b56a7d3679006cb83af625246f442f31ff4541a05bc2d2e66a7cf6a598eb6defcc3180bd5481be42c732f68163a327002b823d719964d5e9265ab4b7105b2e0ad0073d5c8881581fc3b0bbcb23f8d49de348b5d4c38a8f71d44d2272c91ed3c6e05d21fd0ba48efd5435e6e534ae06a4c73e0bef41b7b6431f3eb48aec5cf483f9844d8a53a39bdee255968434ae42d4c3888fb268ff432121643dc22b2af2bd5c283b8132befe03a1dbe4eee0bf3543d826c4f01c911f6be112b7f8f5467d5f4a97a86a1416a3afb01db018eaea013b8ebf9c67b8e7e3ff5396c16e38a450f3c437fced4ea7cadafb532c8259e841955a31c7fd624b3b42879f3e21ab941d4d886d51cc5bfc89434d5e5a4c68cafbf1547e3abad92b2a8f6b1d1ae1e785e0d71a9e4a59bf4899acc16128bb8800f64890b4c01801b9433f5acb02b6898b65755d4e2276af7a05945903482101d47efc4abef3220679d36cfc37caa1d3f19cb40b549912a1ae0a1078ce3d4bd34d3461a00e8e10d7707f83e0357f1ad77d4b6208c17994803f0286793abd031496c3ebdc86d6f4f7d5ac5d63e04eb81df557e2456e814b4fb2c26fe1299626b6acb9a370c31b6449cfae2a8b1820ea2ab5a37dab022d0db155746c351d24275b8e310b0081081051763a08f19932f36d3f53c730ccd4cf56192ab4db6a8f41d24f944d58ddc863a0575845300bb6891ff075b60818fdc1b81ada6b31396843ba7475c8235f229fe113ad4e4ec81c66184953c1ddca38ade9407a0cb523f7316c470613e7d7fbbbc2f970475c62861837c104ba4a5e471ab55c64367db9a02e77390a3b3f345a3de0ad33ee813e3241ec99cc4d30f10471b4b07a34f6c6ea3ebd1e9333371e4dda1d1a33fb08addec2ccb5941c1958a553b80a8b92c55b14c4c06336bb7577d2fd15f7e3f43f47ad149d5885bef80bf2389b19beab278b91acc55c6054f9eb6fbe4d184a878a7b40c5eca14dff1084e776f86025219c6ae7b37cd7909d43d3730bc1e05622d6acb3cc78d0b3057a9cac5dfd01f57c5d310492b6c25ea76162d82e418dbdb73c734f6179deff6a86cbe9990b9683eba462e3c479f6f624c42b7300a0f8056dee5c9c8905d070b9d6a73701ec86cf28fa1e063cdac46be8f033921efef453a924352e73ef9117073c4e4acde4b733684618ff24195e046527084412e028653330921948d9a586ba954691d8bcb234b9d23a79ad8daf0335e904a2dac6f1520e5222df2ebf6716a7dbd34f221534c6eb659ebe19b2235f488624fb9c946fbfc90cd64090d08d9a99ba9ae161968c85bf4de3fefbfc136ddb960db956533643dd786e1ec270e553c78b427f31dc22c70f5b057a7cb05f1204886bd5e70d07deb52add219d73c58968397b3ac5f75ce841c2e28a11c6b78db4b2d668f106c44606233a55e3dbc40ba6cb420e455223d5026661907e396bf8a55345cd84ebe06e7fbaa149be4ca3414cb80c90d2bae4330e383b43d9c2bd47d1e949103b180c2133555e3867c1febf20967dc38412a605cbbf00ba899105c18a44354ae8e014c429d5718c39824581261905d8cce15d8558c462cb10fd276c564cacd44c94527954c0fc03c295a9f919b0e400e964441d7a798a59b4ae67c8cf3eb65e1aafbf1b99973117f9fe2c0963ca3ef1eefca9e38fbd71e16b66b25ccab2e69b5945ad9cd217f3f3e076a26b96fda5c575bd4ef0c2d7c0cc898f4e0b9b4484aa6e1661e5215af40e858b1ba413da027b31e86d823e2d16276c74d2f4c118492b56bb9725796b0cf7a6da47ca51c61a063cc00e101ef06e12aedee179b9e7f405f2a9bb407e5a5e08aa75afd4d2cc2da745e87d5d50655e0dd6b7826e094985805af4bbc3e1d68a726543b1aaeaf6e44aa7d8621223848053edba4fb0f363dfce42f44f9703c62980faee43aa85463acc8c5a230b1e0ed9c127e67a7678255edee3c9d9201262984a6551ad21a2895a5e002a52d5de1bb330754a7b66ff10d0da9967df9c44d5cdec2d260ae8e4d23cca6ab990d39ddfd88843f0faacaf86d84931ee45d4418d26ad37091a4d67d923dae6632fe48e3f1e96f99928dce1a646ab65c809296d11a59e4023b447220f54cb4a806b10e300da72f75d1e9c9017462ca14da0f89d6d5365ed8f8141ddf8ba691db83a0ebe3f98bf7bb40315bdc68576d77279cca314321e4925009de93ac863d731d2c1cd7d6c15f70c87da48336f2cf4c4bde3494a39f28fdeb686b5362010ae90f37696f84eb5529e70a260b2288208498f03d782ead02ee75e521c15daa443c8acf1e105e80d52d39ea578a8318eaac6ab66070d23717639339ce6aee58a22004d23e0fc5d2a2eb76bad6a6d1a211586027f27bc98e9fe6ea924b10033e377f4010442dc6024211f075012df1deff01ba4f1cca335969e084da653a867c089d6bd5f18ca961d0978c22cea228198a9aaef2e6a615891137572f622568f1d9516b4491f24b61c47f048cf0ce80e0017ba1a2f0af40695d74d5040a8f11f2ac46e8dbfc4ed0d2837b5311feed0d01e78dc3d3ccfc98d523d4fb0fbaf50dc83ea72805ab7b83cdde3c030db8bf7b5e68541e4f496b8f7044f7a2ddab01ad789efb0ac17a2aa789a089e84fd59d1fb0ebcab16477b160ff035bb824fb0aa8c8e87a60e6526be53ad91bdddc7c98d67c45f8601ad449e41acf935e23e70bf05b409a5897d84f912af99ad2f8a1b52546cccb2f44d9cadf192b1ab791981c548b1c87d47ed76d3bd492c1dec5c813fb0725bd70b2cded3cdb6e6468a0ef448ec1add1e4624e2060bc3a744ab65603170bf3748008f0e57c96820230d03d2a21008132242000294346aa6ceec78712d7a4613723e9b21c358e92376acda8fe469fc457cfcf9d12bf0d666269a628c93db4edae9369d64df35271dbedc95232e7d7b88593750009bc8e3fbc73ddfdb9ab7cfd54f2c533209c9663dfddad1399718b62a4e1a9ae3700b6bb2b7fb141ac3917e76f43e15b38345fa9213232d30d2ed19a90c0017ce88e647c23158a0dae8fb34b2bbec3e41024c45643dd9acc7505f1588497438563b057538ac8a073e4900376c0622f9446a4019805d80581653b36ee34b2b1755a88c8d2bcd19f4d4338b8723ac02d3d81a660cc1e0746b871c359abb74a30085ba09118ca809cd93dae75095bda4a1edc7410bde453cb94ef7bfb84ae049f55ea69bc31f5b6d7317adf73e7f61afb0a3b762f7c603b90b6bac2f1d0af77c359079f13609328dedafebd1514ab891de88f309614f96f0b890ee91c7a6be278da7413e7ccb5af5cd8dc6866f452ec8251560705da1112f6b93a9501aecc2a1f918f65f631a6406784912f5244fe680042d207944d87207405ca3864a6ae56cdae0b51220b16af30d905f11d790095a3ce5e7283ec0f7a96050d95cff900100e15d160d363990217e1c012321126169613b1eef2f3343d0a660f0c62b2ed74d0b3be62aba6d502f9331109318001b2482c303adfab2d4742bdeff02595c10190bd03ba36f11e5214deb9441a92e272cd0c4e448a94bad776d25b6c9f414829b0da6701b0a2db41d3a55b24706506da6352d065b4a52b3b55f68dfba604772aa56e9b1a655523b58969329b240b6f93b4bbe4f112ce01e5b6c835ae6f8ef0643ee7b062a414794c9e13a4ecf57c4cad640a4194dddda450b90d1ea6163cc66eee84f70ff6319d49b3175a7df424608e29b8bc0946abc6f80519060a35bdfbfc24e12a997de674c047f90c8522ddd110c4011328db48e22b4d061ab50576251e3af588e730d179f8f34031bee749f148b6beb33788290d0b7d36a93563f13fa4dfea5c197a1e6742f036064a8d66ed51484259aa20ce06b4bc3740bc419fd192e066005d1475dac20dcab72c72d6dd1f8d35bd43ffeb213a2bb002f920f05a003eebb57d57c7722eabd5bf08d316ac1852c62d828a990d88ed2d1e9725d088c78e1d29c3ef3a673f6c9cd662cf923c486ddbb545b2f04565614a811534d1930197113ef1878ed5393d38798be56181090bb2ae7e602c97e3390f50071a432852e89c45e5e4d1ad2954b0829041f3e3d5624cc8f2cb79ed849aaa2190993e86e2df9b01e914ea02bf6e445da4b33b07b876e8e8447dd66e04fa3f857e5aa62e14767bf15785340e03f6932ea0423c6de11ba483ba3ac3c5448642dca1259000044b494f91e526b1f6580c30ec829d66093f7d6edab6ac35da51d90efe28aaeda28bc3a24771c795b9e6c7f8aa469d828cd3667b4e20d31e7040d84830777927fe6606e92d2e82f55a641b8bbb4a5cb2d30cc259a8180d435d27fafa087429806fc181c1b580cc6a5265b4c24063ec033bde883165dd940cb98e9352b567b48667d2fe0ad3bf1f06ac9ce21ecaed45468051c9e68649b98b184ad105d9d9ad1b9988c8336895575ce91d6dac8fe144615490da0a27845114415666bf6ee9d6c9130c7703dfe3efed16eb51cc41834619a3ae4d4cc99b6c39f06a885b47e84923a62d29aa8ec0a8610588954b13d0e91c2a108f5f0d2fd4f5c3164ac93b591a4f88552bbb71eb524e4d6cb0b32e339d7660db92d82fb6ee3e49d2206b4f06a047a8133b20ca08eab8df71bf95f6829d4b14a5cff3f266a024fc191ef0a0beb5af1f60c48eb9f51f131f359108431d0882cefd503b53ca7e2f64062dc2d847e4ee9712880ad278d722de22f52cccdc917c083ff10af98fc25e990ede1441caabeb0430538e949726ce60ccb6236d3b2204a1f141750d3b7f1a63dd3c03d70655bf714533c79e8f3c86acf66fe765b17ba34bd6dd7e43fa9ed13ba62f75d1c60edaf59c16532450a3bf7630e77843bc4467cf98add38ed5045413a666a476662b0b1b8e880405cf133b08d57d46000af3e3855692d311ac185fc3c9eace1f10876b9f3d953b5ba320120003c7150aea8c44673b2803eae240be108e71d7199e41158ebf2d33494eb8c98efd69ea0e2dadcab55a89bb0ae1ef9f301a86b4fb10257d0230d7478de2c7eac62bdfa221feed4fd7805eb0ab5e935c9629dbaf76fba3ae83df22f3ac7ac7d40fcdb5495269d6681c5abe0f5cabe9b86c6e757b5ba4e05a533c0abd3715097887d2e54a572b238b910db716ce93471cd0f04ab4f2d6eb49930b6726363c8ab005c54b817b7c08d6464c28ba6a9617f804fd2aef45d8ec7890afb84d613f6a14fed287631915b4bf61654676d35c9c9885dc104e910ebad57989880dcf343e96b4fa1df847207138067ce7d251467b71eb4ca8ac6aade200cd6034d889b3356043d05b8898d14b24de0953ee3055dda9fef0a48c27bc4d562e87d8e7410faa3f355aa3452671af12167d98af205a2fb11e9b550e30582b8d874b30e5c908835f309b547e61876ca8c6817f43e2aabea6db3addc2d67bbfb0ea004499006646cba22da5ed0cc4cb004885ea6986c68aabf54e7c4a7eda9747a99db10c60d097a12e5d250f0fe24f8dfffed7bef906c0a8c46fcdb6166be859a64ba643c4efd0ae3b270b9c848979216af49f39b9a65b03c97876690e57cdfd9ca129619be6cc020084e1531ae654decaa91dccea4d7a296b729fc4cca23977d0cfcc5c144cc80802bd19cee9e8bc1a645684bda37c4e8e208e578113041a6b10270ff56967feb0c89135828d0cb44167273576c2a765ee115ec0759be8e4fe238a4cfcc534cde848f5871a87e9b374d41c26fa7fa2b35036849673a05488acec683cc4b9ab90521527a95d50685e3aa3dcc4e84d128061d0c49282339c2ce528547004d22b2684a5061f45fb18b2d0c5a33b01e09aa51bfd1636e17d779a5eed37961e3cf3eefae1dd3c5056065091e3c165a2089e9e10f1fd2a95bf8948a41ebac1c419f894702994d8762e07c2b16fa2b6cfa01b434c64286ae1f7d2285f2f88aac8edfbd69261641d7d883dd5914860520d8f33763658f44853633dbc48acee2fc9d75ad8a57bed40c6321772741606c84cfc76883702607d3f0986e799280142014b146dccf44151146b1e9c0466fa1a1730d6c3aada2ae981395196f2f0c654f7732e5b4b9e2cea8bead039a4258128543c2a21e26b6707c42255003e3881207f251b13e93da01346a0c29ca0151e0ef67aeaf329ee3589534b496700a9f6e305bf7c949d3d46a78049165f9af53e37e4f4ba615c3c7fc0ce78ecdd379a25ea40a4381e549d4670f42ea1da0232843e1f58d2a2487cb37df714d001d4ecf1b7c7113766475a16c6bf3e64e1a9ea0d9ae7b127f43484d377b52a8018ab7915d8c72116b15d733ca5cf58d33f62042cfc4955835a0e0c5f971801f79416eb6b4297778310e68f78765b795cea4d4e6ce4866600a9f24f8408eacc5ee474f62be1172842900e9d3488bc62de8a9f8e366aaf5fef6e759df2d4225e67832faef5f9c7c2622c57aca406554b0fdb83ff190697dc7da459f66c56350249fe07af4419dc035e30146052106f7f8decd46cacfc4abef3b9600a8067cb1089d17af92157b0778ea83d550d18786e73774a4378cea16acee28fe22eb04e5d31298f2252a1bcb7bcd01cde2b355894efd6a9dfe8ec5c05da30b209b6fb261a3d1a63d4e4127400471ba8d83b6451fb84834c37fd6dca0114cc4037ba8f81e829132c5e006db88f60f12ae4602502395c299b91bb0297fead99610dbb39e0e4edaae966002957443dcc89a1bc1c1ff3f740f14243593bd707aa3843c53e108d6289189aec4724a1c8c631ec6acd50fc0c6f52352c35f1f106c58756f831bd11371f9416c49b7dd278dd8ac4d79b0dbb1a5ac1f712432e3de0f32493877c0b0a98ccf1e77168057737a8f4e15054094e380059a1c9c97a63bc44df825059a97e22bf6ee5d7b472714738f3e6b7ae196a12fe1ee932148d78a8c09ffecf27b50cb5849779497dc04819a40aab94a1c6274c05c23f54f9a2060e2bdda4657a033dd72e8f3e100955ab1c886c962b2a38d19730b0700e0f943550e3ad693445e042d33e1667050fa99f6e66c04499365d895030ed4b6976edcbb144030e97a5f46f33f7c5b1a86cdd1dc71cf06e711179e5fc992d7415ac954086e7943a7a95754ab74ab64d8ce012a1f894599205685fddf029b5793b1a69bf2a98dc66ed0223263cd4df6fb71ae30b1791ba0b5af77e3b1bc13f2000dcc022f4d76ceac868d5b337c535efee6103b79f9c37fb70d3ef04eab9afd56571a5f6a59add0e626f7b14376aaeb40b212f1b8b09e5f8e99861a1f69a7a80bdc262608415597a8801bae0fa1ab3d80b4386a56ff5b03a90ef8d993f9839ec48ef9c2860a227f32420ff5d05c7a53ceea6d24b7b1ce68794e66db4ee9ceee68e8f5c36709f1eef761c5c15d4a767e5d75baf921f70fb2743d50fd49a88ea5c2ee17dcbc358ca335235513458066723299cb82c4f80b0e143e53a5f32c405f42a968a5348c89deda1ad27beae3112c99517d1526858da8460ea06b412ecbd4c11989ec04601021b8afadb0ff06f737381667088b09ff01115808d23091afef3d3c9afe76a08b8eac8c3fb836bc3a5f0df7f4fe152a969e6c3dd520cd8f4fb816eb9a34181382f8ff0d5699708613f116fb21c4d0fa19798d51869fe1e63d205449ee97703615a7d7b336452cc5aebedafcfe2fd5879caaf87c42ee736605ccd6fd8ded96307aa95e67d1e37d98ecd4488672e1cec854268b816a530fa55291eea7c63130f0944fc3b9a25329245d8b5fd0da452f53fce45bfa62f2d0cd642b1a13f4d1e0b7146bc262fa4bf9b144dd1776199b83341c6deecca186ff6b645d40f622dcb443bb9d4a5258c3fc76bb9784d2ad4b463f2307941009ba854552d6d88a4e27abfbcebba8b5377f6f9f7e3d7f800978e53930498b3ebd7c0d1f927b41bd9a28cd6cc2ced660bf9e02c207c02bcb89c26d0c06eb5b26412623d1232e577ce66e068b9b77c446783edd8ae314341c8ba66e7122592813b2e0332c12c48a1125c00c5808f794f87497c762686137c7ed6206d7ac3f71585f0bfa19951a005a04b0deb95d17098829bc56583168ce5896d2da47d5c2a78468eee1ab4c287ab550959c0afd689b4292e8323d54e98e02fe01d8ed8656e1162aee56c5c9a48e0a0f57dfcd64f0802ee4cedfcdd2df4489fbc1cf145a060de2111118ab3066636aa4cf6bf92a3596c2fb853c0812ed43c6f8babda3431b7af0462d87205bc31c4658f25403e540c658599cc0c019803b2007ac7ab59381c938d411d0772de08d2527444bd23762ded5b3f919b5b72f0109230e232a7905e38cf253153e5efecd217fc112d7999b432b378ba13ea5488285aa1d563033a09ef09cc11691faf733d1457fbc1efaf4d62ebfbd103a205fa805b9b435e87070de9479420f082a804c9bb0f609d8b49d2eb1fb222d1b6f49f8359195a9d8a5ca91518ac3b987ac4565d2fa6d265065b3b72f6d99129518928a30ab327e747105ea8ee3118d1df78221cf650206da1b1638e729495503b9649f5429043694c12cdc7780c2a8ae285b0a0e6c43ed1207e5363f0c6137afdd5bd93a2e67b520f56c9994a221e66855a436e88db043dad92618d01c239b95f409ffe71d0183bfab0c935b31ca56726b7c6f4aa91b256026f0a606fc9d925f575d00a2683104ab6dd3c9f2979b4837885561bb029d5824131bcf5d7ea3b39e69ea5992d37eb29e22ccb19a92513685f312d3393dba7222742f831d564f6a6ef6d14dd3bafef22330423026f18d7cc6ccf0227726c8640fc5b3cee3b9e05a3bc1539025686f49e3d8107eed3220aeb712703d9d2fbb24e06b0abb829262ae32bfe3ad70cf5a69e0f73f6a60232044efb61a1f8a23bd566c4378198313898ced634258f9a658d68fc86a124877ae1892e3761a820144e51cf8dd69b72872caa0f1c5b897b0d8d99e3f4d7fe201b053ce7e3f064b8df01db34624cf74a8dcc990f745d145f8fc7b0c350319b6722b8ca6fa09a4b5440679a2e41b616684126d3cc52678950749dd861134d634c0ecb36da01430147c3598a8dca53cd1d66efdb82e6c499a26e3828495a0f4b35e22490fb36f348c85bb7e2ac21381b988eb5007288c1170fb1419385dc655f2f8b1521003aae4066b94a967bdfc4a4e61f622a206ecd1c942c1fc5144515bcf88544ab45acc107a8d905841396e8fe798ac4b6881a0ff500b6380591d32804bcb21842d7d01409c945c13fbce8e6cd59f7d6eeebe0075a5084ed260e6ff70a99ffb16f2243724b954e8555b819a0cdc99c21dba944f4f04e049c980399655c17135288a6069c4b07f493fca7278662cef76ec4682e309fbd9fe991a5e51d44fde60ad67ce85b0383867fa667992ebb00f9274f30fc266d36e3bf98a94ca93bcff5a3995f66d1f75376af0c96c2db91f0d5f64f97f07a75ad4e3322793647f8ff8b93ea3528cfb97d434736474dd301d986504616cad955f3dd008dfbe901549584faf37d46429538993896c08563559adb7e3f6c6af2aa9ee890fa427b6ec79a5d63d0132284210692f60e3b3727c5636bbb35e18bcd6399e865ce397e522cc8e8fbc166fd1558121ac1e665a9f7cdc9f2f324b614ebb9cc2c62da88e0dc74a317f5753f3017ae241e1bf9852344a2f90a033f78d7da97df58566d9fc6830cec340ffbeaeac7231b7e7d0f4c7566a64755192a9ae50de61017c2bdc0320a9d8e231f8a4b7b61e160dc8d21807ae864688e248a66c7ac6443f207194e4044aa31325362c533fdcf006a663e6a27408100ba8bc1a367e67ad5349207f60e3f7955177802c8e139488018b80eff239de565839af3a56c5e4b7caa790223eec2a1ebfdf1f1e329a1ca66da529ce3940e0a32fe4fe6296e814a2d3997f1f3a4cd175c44e5a473276393dbfed4061d59075692d7715480deb942b87498212a5605c2795923b596d6bc45838238c68fc82da07af26b85394e0c0b410681dc500bc6e60a682ca8c508d139c2f3758b12bd1f0163ca631df6aeac400035922b0777a83d45673e03539381401f6db26487e0d047c306a8b2d037a954ffc2f3fc205718466e598ba1683607707cb5e04c93c46467835ac20c9775dabd192dccd0051ed342095fe0600a077358de7a722186615581f730e3d3323d418b57a22b5729843c641910bc451f88b4c774041a66e46750e4df0ac9900bf26cd3533e2cfd4587f8a2a5d455ec0b2b8b4970ed9c43fb617551c5216f5b5899017c1305b9325e15d5ef45e18f3fc18192754586893b8ceacf3fdfc49761a7f8b1b49622a2fab9bbc5af2b63c6abbf8edbc294c013fe4c0ef36fe7e3009350860dae03cc19933d3a1a5030a750a31c195df33aa09103429b3d639d48a1e90f3ece6e914a05e13314fdd21e976b539783fd333f74cf89178de016172a605e984629976355d1dc1a20f77f7b7ab8a20240beff483a63214a1e1e98f4ca19dbbb0b591f3322030c1ad425da2b84e41a1963e3d59ed67abef364dd34b97b7c8cdba3d1b5bb8809e5432607be9858cc5000f37411871b44d86100535054155771f8603fe93ad713432f791a51278f4f7cabe925544d03f63dd7faa63257850debe1d06a265231e7f163e35f7f1619022de86720f55e564d2c513a806d2ed035d029c4fcfa4cb09bc24eed5dcee3206406986bac74d77c5a6105798f74fb26796672a4eba607ac8a483ec6e000815baa523d0432220110f330c4b6cf1854ba3af63e346310014f365ae11b49c6683a4575d062454a09650b27924eef23d9a83ae0933834af5fb37dc094a87d0481e78e48b057fc0fee4a171c70975d0c8d231427ff7d4ec3d57b2f7bfac9a84bd678a459eba0f0e5a7a6831d3c2103b8880c78168163e9bd285e3d01042eaf20c1f12ec8245df1f2d1163546e6dcecb26677c071056050a13fce24b65957a26f62d911509c2037ecde39a661db4418c4e1848524220755ace87196e831a0b9eef3790f4421f4d389761ac67e94626702a9ac9c815f00420ef1c41c1d9766effd8d263358ac450626bde404bf2a25df83f615fad8e5ebf0152b4d77a7d72ea0ec9f1dbcd7e4b035389325d5735f997819e7e38bfbd7d5bf8c165b21b7e48c5b567b6a1933137b0d6f2bba032382767a44047ea0d57d51f3cb93e65fae1582f915b35dc4e16c4d36b5da8af2d8ec13014ef2da28a2b044afddff6d958d96c61fb49f848b61ff2d207c650c171f85405b80f22060f0940301cb77801a35fb26c389afb42cb22b081a6ee48a6bc1ce94dc44ab30cdf64871b23f0e91048bfb195467454cbf25acee40d31bbe291ced925b0b5e046b89abb2d65c3dacd5aa80b5fe6ab7d6050f89d728aff7c355059f24d662850ec52a6ca389d935b8de2ef5760a92cb6712cc82f2eef9beacb86f03095df087f6ba941dfa39eaeb04314a80ca44a528c31ab6434fb7db4885aa9bc767863adf60ba5b994568310a9ea94af8b7317c7ebebece7e83ee6bd408320160b05093e74e6393ca30a315f7ed1f10b7ef8fbfcbc223a0995ea0f99437c8c666ffa2d4d8296233da017d9c41e3fde467acedfb286a5e662da1f26d0e049fad95ade3af2597779f6c6105241c503e3074e314c5c73b8a8b5c1478b9d8202536cd7896d860737c7ed6514cebeba912e50eb92f935ec4ae5721008177f1bb672abba05203549270c3b50221c04fb4fcd95d697e29ede07050bd416fb6c18b9991fab95a304c356bd627c5f6e75587b3e102ceacb8756b9000a5f2ac07659faf0aa8b8e4a850f42de3e6cb23232516a55e02e09e23cdc33394daf4b1773f908bc7415edc046ad4e99e5c5aec0fe416a63c7c14aaaf9e70b20fb9affc3a7b01c883e4be24fbd1f3ec7721fa4ab5989eb0a81c373db88a416ff6c44de8a345c9308bd96f46566ea24d39b9d966862df196bd207f1db920e625a8e1708960374e0ddc8ada576a1a58e21bd464a5557294813bf05320883e25dd470972061622951312ca0dcecc259ab1f255de1a36309435ffd9bd8c0f6bc96495b2767e394397bdf41e3bb9b65813295d73bc6c6e064f62407b6626d2f5d7a06d4b4853a85b22ed78951597467b14f3dec9a366cd1f2652a816933ff5135de9e1b1bd776000a4c5c065c919e69f8a1451578e2597f9d31de9d5c28b59a67aa5c7b9f787b14a83e56e6502086fcfc7e030baaeeaf77e385130fba36471260627dfec7acb7efd493c244218586e8a02a70419281e3e66c640abe33e70de9a02f70d93e564092c3b8c5c5ccc08b369ff84ba012c1324c7d4defd372fd67bf22101bee4b44e2b1a34384855dbf78b7cafb84d6737c16b30c5c3a8e413569a9808eec8f21bb02b3b29c206e4d40b7dff778e1f4e3dec07e55a2d490b75f3aefc158509621167867b5e8c82588fd77ab96486276386c79f9c20b534de85e7dc791eef284f4e68a6bf0c2ac6b60cfbe5dfe04fc1f11924270c9e30d46d42b519e005fd6524b305acc5c71a173cb33c0a00b2e51d31cb0eca2d8e57a151ca08cdb86a0c835247db38d65fe6e644dfbb2bbaaba8c1a60bd7fd54f954565445283ef880e3b89a56c286493238499c4f06f1e6a80822f60a1ee62123d57b460d5d051aaf43b0d7fa6201edfb6b3d8418b223453e751d189ebf3ab2e30537f905b38ee8888da084354369d229129d353261f88924638f4a38c4b0deaeea41dae793a90ff7a13d9ef412b385a0239539ea8f0b717d0f61129dbd1c33575734820b02f91008b1731088c0d26e0a380a5d62de4d88239ed324c186d6d8cc74bf1a99044d1908da73848d06519790328775977bb20f2bf3c65dc922731c159f9fd0537a4d0e64c5095649536e31210fb59214819ea1f019ae526d6c0ac96b3d8b393df3dac1039aebbc23a982c2760acec46c39b044b34fc56cdfeccb1aad71f670a00dc4aeefb8be7357f4fe4d39775192b0efcc916baa32e2e869b26f048d0fc1e2eef9450165a6c75cc47f432160aa91ba28629f6687050a95b04a0ce80309899d45f07064ee385289ac6c1f93946dc559554af0ff3794d3ffc093ad475c68aae8e0a81cca109418bd9b3f931a1c5629e9fced89ecc82a181160ac752f52be2bb26a7511fbc3a6713e5e09537a90541fa7990966fab30366074ad5f2626c3e23fa3991c1814d22d3f08bc86ede4ee3407dc4f8b49e4341c2d576b3b0a22e5be4d39f576636db5e135dcd2e0a76aafea76da7fbcb5a92903474f2283f71b6690a8ac1532caba5910debd352c53c770990bfa9e34f5f8aa2a7d03062ab3b3acbc22871ed761966d6b37a2986198b144f529bdd92aab62eb5a61115a54f9d319369f2aa9ab368e03abcd7dad309022adbf37bd3cf929edb0f6b5ece56b348937ecc82eb885ee18076131ed7342d335b34a11301577decce110f6616c318caf04df7d0705588db9df94770ac72da2a103fb7078f8131b022d72afcb60bc4e6e9d02b6a1876cac46ff4f740dc7bc36619d5d7886533f183a1f3778ca346a9ede306dc8eaccc59d0b3957bce032ef25a25d248f9bfe67ac62263a3600762bac95598a9ad94ad4eabcfb7e4e6b8c5e586355dba032bd82ad77b37759d64a2df9eed09f72f743c33c9b747b95360e6d0af2d532d00bd95bde24d825c0726250762bbcc9199e85b818c9a596b76c8616597bc7de015215dac5d75cbf42ca1951bc015725e22e7a9b4731d027fddf8f43f62567e60fb94b83903d82ff2ada8287bb62c44cf8058d29ac1edac4edc80abddbd79d8f95ee7344a79fe5e21ec0fa0972ccff7bfe15b212a83633e47b248ab0b5a7d58a58ed85bb168a8a608e1a2eab5c31aaa707b0ed0e46e98cded76b0a6ad9b3870c5338a26c28a0dc2ecb0050a79dfcd8e5bf9a0b4c4dd3416fd8224ba0698eb50ab228a6ae5154d44067755055746ef885825d18bfab1667f6919db8a8c1f9fd7cc2114d2852b859526269b37ae347fd680a7340843b81a913a4268253cf52034dadd3f19d86bdb517a34aea43788895e8de5424047e3ca1dfbcae8e609db430648235718d724d3ced9b44d46d295744ccae15e55985ec04a8d6dc78cd9bdd6ca0a464e799faf4a005d064bdb8de22a707f5fb8f2e811109728e5f5e9cfb532b5bb1c42c4965a18bbef7e310a366295451bbed300b3b05cc46352e3e0459af6419ce037c15bc9e5042310f34af3c666e50194e8463536eecda4bdac4254d78ac2dfccac1755366f5eae4f4ed6b9a3602286f0e5f1290b646094322c9b4c6e349637219d047a6dcc0ac962a8231889435018f593d8487623f5c2cd0746883917e628c95dd74d2b6a030ea26e98b21cf6c2e81b35a1510720116b979a13f4a0b46a21a123bb1c3d545a90bfe074eafd2c3c8cba1a7ed9e561ff12e4c90cb38dd3466aeef1843a579073bb0ef32f590a26d168fa6434cd489758511915ac74c40af494630fc11aeafd0d7e549c663f88f9c159a3d440ea83f4f6b034404ad87e2510e7496d4f6f1e6b6cd8f604e8a2844cacdd5b09591032b6436cfb3aeaf62b968d9d7b68a6be4071b2c9b7bd7a01a9ca0239ca1a391823f5c2f487d420cdbbe72ae73e44458d55a0084bcfb7a217eb497c7062c5a749af029d730a2c1bddf601faa0dc3c27a2e3fd1c900f7a7b2adfc86dbd9d40c08e5f2938c6d9980527487736fc9b0d591f239a22660d05f759511e3269985b8c373f5182fef04f2a0e68d75a3f83ab33f3f2cbe4a0b8b918f666316606a276e43d86a6fb214362b94b93a0e80cbb8f24b62beea0ff341c97bbbda588ef8ecb862a2e72e046bd0b2a435c43e44af8e4bfd2cd1e4f0f181a44b09b0a03af9d8441bacc2436adde585fae83a95cf360594a58a59b2d55e6ec944a95481318527ce25e2067e4d2ad127c12d0abeb386bf2f45a53f02cca91d80e738f9e441b293ad36a06f649eb83b314a705c2cfd77ac567c535855bd1adc29b8eddfdf0cbe4b5d1dc6773b274a246c0d91522f82c5bd59dc934c3ca681ada78ddeea1372913d5e000d043b5d31929980df4b427a5ae4cf34c1974fda279153fc9957d6a263c1e04d692cbc4008974f4679547283a5f9cbc9cb3ced86cb7fb9dad5249a17c1c4c326aaee4400acfeca479c604f43bc32e162041f155f1655dfec3752ebe401ba4d70b8191ef01da8f6a50d392d7d3b2a1db0996b829a100c999d714bc053e38d71b237d27830f2b4f1b308a4e0d7f74f534f0d2b177b032c22425879f4dc92d3f4cfe6b293e4f0caa17dcd41958b5591c851d132550e0171ee4dfde4b20df7719b510e7c17bb85151660715dc19e9ef1749251c3d39156bc8c382af62d526005d6f5cde903a6c0a912b232c6690028090b890c10222f35c091d4921b5c649ff6058b85dc2781e912cabd04522615bba96bd7ae65ba30ae1f0e4e558fee30911fe3e81b708533f6d6fe79d021054236e41f1ad3880f5887d08234e73b57ac85a4ba155141fb1968e83b59cbb7a1d4c6030c1242b38d93ba71879aad5072bc6926a2b373f14eafe8f39b840126b2945d324601d9b453ef499beab30e07d15df340ca587fbd44f826af7b36c9544aff3d710906ad898cff9865e90fd094d766b4ce24be157e6042b8a9c415148c3fcc56384974ba4318c1103742d3faf49e4c818a5f082fbba7ad88856e72eb40bca4e40d895a4ff3848c6db3b54d21cc4fe623136c50ad3b238889170ff6dab32d43ec81cbbe71bcd40b3a878a520cfdf9cdd5f78d5f947b02687832cf10af55b50312cae3ec49c4dbbc3dcd13c53d3ddf165fdf4688a76c8312d902ddd99fd83a5d3636148a5f6c9d1d0d11abe5df93feff72111778c00afc08877106d6ff4382179ffa4414166fe704df70afe239277074b7aff63d7f94919c0a78601bc4b78755f4bf80d4003daed099844445c04988e94076579ef4c543219c528cfef166f7bf167a0c6f64c16589c3170072f53ec6a9f76a24e8418850e0161a9c06ae4517125aab4ef8173e99f04bf89e47ea782350122430b1f338cc312aee90568565e8d9f3620577b042a55ab16da258966ade93d9c9849fc4dd53b3fedc0555ddf7913b574264b08b164f4c8d3ca2b1ff5c71c3f7843cc100c709e6bb01a05972bda9f7b6745649f5e5c9f5842101e1ffd3498dd1803c1427260ec99eb002a3970a81bf3b155a969de3901a569a775d53cd0ea42bf55fa7264fabfa08dba46920a4aa3544e51d2f87f4628a3f607729a9e22bad0442a0c481ffe82f9ec5fdf763fe715cdaf5bd94e4f53901defe3fc8ce4b6ac955aa0985503cb8f55a213702ba0f9a85308f4e2118085f8e4c51b8c9523b319126275e7d61c0da9e416236ad0e227ceb420105129380e51ec3bd1c4f7609374ae5cf1201e03293d1b5fe829357add367907f1eee4c0cb5240c83256089e0cfcf0b8ac25d14fd7bbf7b633bfff6ab01d45a8ce488c8e65860e3846b6211f0064a35e9e3efd9a2610e6174d624028ebe9456ff2c2d22427d6a4a2b01b7b84afb424507281289f4f25ff89bba4dfd924666dfcbb38776dcdfebd74de44214da767d60691a2776dd0c962a534b08d22aaab85786dfa5c096b06a4b66a363c650813127d417d19946a40a936f3ebf28dae4d8f20c0da148b2c42e5a82c46946a6378b6feeb29304e5104f24cefdf49450fdbed742473ee86e03d490b2ace0f3187b35d8a2472e657647845d8e96c67b8229f0c1eae1d0a8a1ede500f6bcb6a8ec3ceb613eae1225474dc28e9035fb99d118f4953fa1f3d36502fd0fa194dd2f8873c88f6c5f96b6a18cebcb445336d2a3dab672bc9c98bcb4ef1886efc9f7a74e85473eacba0345ee898d288fc9de0159446d8494a7399fcb71ce0839a1d1f8d237c127ac5bb369d3d7dd88f20c2aab8f172b030c122d2c65d5e5ef2bd7f3a883def528d8041b641478c41a0374764442b54a21bd63a9be2ad66674369a102878ca4dedd1641b6cc6201decef325041759a3242f03e1a67c8e87ee5f6a3eba5b23df87a14a271d6bfabf16220b3d5a53a10409d1561025af5cc474e822549747069d7515e2fa979aa5ab2495c68f2a4025b30140408949c860d4d0992047a02677ccee3fdc947ae32674406eba80b9893780068f7dcbb94f9f11bc16f45e580039cc5cfbc8fb90765c62b16b4e0d38b309a920d453524353cff600bda37e6c2cc25797f8c40051d143e5fc085a12c71050951837e95755fd3fe06089bbada309529d032cf0c55dab30c649d5b37595d9cc4ce29352950d47c32afa4a6b1d05523a880ba28dc90d4f1533f1c592145a1eed11bd016008824923fec167cd527213dac81442890e05cd68e510e3a656262b53c2d04c1c2c88276518931173b9c9302912f5c3420ce71643317032bf05ad31bde5a662876475f315e001ead667d9b89b75252e4d82d7586749ec1904f4a1744e88cb3e6779184ce7ec8fb8cb20c1c461a7ae42065272fc1db214e4c4f270ac7512590e759c2f01b64151553fa9c32c08b949e2bea6566d84c6c0925a6a044cc464b411b620dc5af5c0a9757f981390cfa5e410e11ac73243929999f252713579d72d77305f069a7fe123ee9f69b0a42b16c64151fe9f599d2bcb0d1dca66f0023c49039aa342885a20942a6e0e483f3ca9d02cef032820e134e33aaebb4a88dfd59291f3974ffe4c3fe8fd82e8e11fb59eedeb59704e360c187001f17c00f0a685c43502bed0e2097d8ed67b2de4009d2c920e7d037ef15fcc767777f79652a6940266085c08b2081f8dd12b34466334466334b6f3b990f597ab602e97aebffa51a8bffdf257577f5d7f6f714f6edb9356f356e6de026f27d697a396d45612e744f2fb369134993491aca9c944d2c646d471c9eaaf9953a378ca7f0a51159895eb5fafc4ae572c6e04de2ad6d792fa026f46ea0764e1b10d3963e5f53c53924d97e51ed99db33e0f7f4fcd39031bc59c607937477d3cd67013725414310a86e7b56577197840fbe76d910cc1ed6dba0e1edb9025d6754ecbea268583d5399934050bd6fd90842cdf70d815f194773f8e722fb1e6129afb1666e237b51a474d9087ab1aa7699cc6695ac833065af59eac39e1f947ff513ae6cc74ae06a888e3020de9b7767958614954d9d5755133679b2854577a29d5e1c137565872bb3ab4c67270008f6dc898d89dfcecf44e0a05e604a6275eaabca8c0c549cb1a94522118283027303df152e5450577bebb38b9f3bd658d3bdf65e81282eeb463581f4a5490ac905ac06178452d41760ceb43890a9215520b68adf9e2cbf2b93c2a5e10fd826e02815f7c593e9747c50ba266345adcc95de160b089d169703ed469c15de160b08991693778d084b21f78b9b5d1c6832694fd60d3b61916dc596f308d681d94b1a0de40868d3b619966dcf91cd322c2e2813d3ab00ccad03494b91dd36272674c8b6f66ebcefe981b133b15416bad2215a98b7e7d7faf7dd29a699bf82b1782c736a4691554657278753f774e46cd6ed53261c908a7e69fc2120fac2ae960a49482d20fbc637f7ea908ef947e7e0905bc03fefc920fbc43faf9a51e78e7fbf9a51fdef17e7e8907dee17e7eb79a3933cc1291d20ebcb3fdfcd290920ebcf3f2f34b27e01dd3cf2fe5c03b303fbfb4e29d989fdb34c93c1933bfc47202c888a7afb9f196e65d68be048aef81c05eee4921084e971395d0bc37bf996702e4745f689e877bfecd3073b845f294c584ddab83d281d185c137f36bc20ee62fcc3fc984dc2d90a64b763744223fba889d192d62778615bb324a6237856fe693c48e0c50ec74f089dd187c33df13673ab113836f38b193c2377313bb1c885d14bec9ee29eca4706abe4cd89dc1a9997567b0259adfbd664ecf2976afee35734aabd2aa7b9556ddabb4cab26965d06ee6dae59f99f8d2c4ea7a69f5329f2cadee0cbadd6f5ac17827c42906762d1356bb875a7be85e24247439cc10c72d0dcd9c17a399f237fd9486eeebfadf98ff977c096987de3c1d4142c28b5169e8253653533cb5b2fea1f3e54a8b2fb1299e62b46655af3ba37c8a5b9f7b12b1cd0b02b11101c28aaebf4b0f20102e4414c775219a39323f33e52f03749de8bacc0a563f7b526655ffeb6a88a33a88cabc53b9d6218eaa62fd71144d132e3d045d52e6c7854866355355a471adea6f3f7c236a2f565d655a2833c4532eb33ac2f69332ab1e329355b3aa49786c43cebcaebfd72f31a794eb5cc8ceafe90aec89d15e73815d675170237d25daef6520a771cf209d3c85cae59fb0560288cb3f59cd061697dfbbe09d6d021d71f9bbc53b1aff0ce4a90919346484886902a3064c122629e0f56fdaa7262a47332eecabd1f4c45c4f060d514688ebdd93314daeffd6c1a8e130496c2629d75fdb366b29a522e9af72e845042b5ab9ac5c562eab15d1ca05a4efb980fdf2f231c8095917b27d67bedac4758b8615a2d484a40629099ee23dd9d204c5f1f5c4dc2ee65934ae3fed9f9c15e2fa3b2d35b95e496a9092f09607b9cb85bcf4a18eb591affcc7590ed4e54cf50ff5ab891ad6452fac17d60beb85f5c27a615d7f17980bcc05e6027381c15c5c2e2e17978b2ba6cba4803fdf141e10bc225a89ae6b500ac7813fd71fdc9a45bf29aeffa77940b8fe9d695e11d7bbecd8cc69d64cf503995add32b53ac8d46a97a9d542a6d6f57f89f5176df6148b5dff9772e6e86ca51d3abd1e75c997f2747221abbd0bd9ed69ee93eb5c12b825b6339a0dae7bb2359784ebef69dc93dc12d79fb9336ab3cadb37be6c63695814e149ef626b517b7266a56171fd3b916b58b36eb890a574e622713d8a469f9c5921a1456118cde742964f7787e983aceed0fc3233ab195c7f9e59f1cd14b69f9c595d8fb9332f159ec851f9522b054c797968fd1abe1496ac44dabb704f43eeb7ad659eeca65c4a068f7169477429951eba9f4b5b5c97a8be7260603335640446c1c46a13a827abd0a5cf9c9302adae4b7a8f14d6546167624065c60836737004cd54cc5538841cc608acc24105a31c84851e139cf247859e124ef9e3a082551e128c722157792d4731c13b27bcbfb704efa0f0fe1e13deb1797f6f09ef98f0fe9e12bc13bebf2703de8901effcfb7b41bc93e3fd3d253882660e8e72a692e01d1cefefc180774a787f2f09efd4bcbf8784f702ef08afc53b34387004a5f0a4e9925e2b8527633c9713200571c810223823ea75bcbf77820a6fb3c2a3b0c29b10aef039e87f08027be98b21084e978a4a5650f2731a87a49ec90f20a73b73e3699e823c4a56c0517a0947d91a6986d9ca5ff047c5a41072b770fa1586a82012f91105b11e9d20d62c36624d820962c5c237fea258d908c5dac68b15097ce39f43ac3f3a634a24f2230eb11e816ffc819c2e15eb1a7ce32588550db15ea109eb8db0a6518d508bd0a8b0aec129ff14c29a85530e6354b374ef5f631d8e32069e87e3d6d8ccf15a9cf227bd562cc65ecb6b6980fe5fd26bc5b442182c14c6886f3c66058b69392a2609cc555c8ff0523126c83e89a3f45a5d7abdc0b63ce9b5665a7ce3a798ab668531d5970c86e3b9857c4f2169ba648d91b68ceb1f1392a5db893f1a2624b75bdf1492f6d67f09c9bfb58ae4e94a6d0949d425618cc81214a3eb62ada22485e7e195280591549bf29044b630e5e5e1648d59576521395dfe0579cd9f60cf566bcc7a2dbe8181ad8961f114fd8d3ea9c8a50f1eb9f43f2497be97e4d2ef965cfa9cd1a54fce185dffe9468ea2a4100cbfd00bc9bfdb7721892271ee26923557aebfe6b5ae8b374cd7adda1697fefc4d8cd52a1edb644f0ae096243f897279fa36f2572e9e70dd96cb5c385183cbe0cca94d9c208b28725083064746f2742b16411471ebd32d7ce0e2d6ff5cc5c2adb73e6ae6d0f1d69694235130c1821ee020cb5845f2a35c58bed473b6b1ffa39b13cb57e6f2163eb8ae77190b2332b824b54ff4f713eb2a20f4fad3dbdf5eae56ab4bef14691240ef7c7aa708a4af8bd4a61b8bbe4c3d46c1daeb956cac48d24b5b98451b47f1b36ff143d16d7b79b810da7d84a35e0787ab8c3cba3f116d7408f47c22da385fc8d8208f7509cc80001e257d89c0870d3530a1e9c1556e3f57b92d7e63fd79ab4886e0646748e3001eb799a242c6e7713ecd44f617c6af57ee538ae7ef951ae080be1aa5947a6fa4f9578877b3bc8edb3c2ddcd833eaa84f45e04e4e511a02eece5b6be5a7e19ddef5bc8edaa376ea020e8e0074747c4e9b7f1d28d4e6979f9a6a4eb4d6ae5dce24f5f93baf867dbdf931d1be863f7ad066542d41bdb3fb4143d7f7b8eec135a7b2af9dd8d281963b411e9a0678df3d043c11025c4b0b2c0e6cb43d175d21a390d15fcbb87008f75d38a4fb19922d482c0e6c7481cccb2ccc6f19689885a4cf0413d0c2d5de9b2069137938e75a9665734e2dcb26a76959a679edc2e399c38449f634fcd1a3d2d09bd89ce24270fd390725f0c304079dab0120f36a8fba42c6ed69c8b38a646f4f84090e3a17c864a15988904b49bf3e0e26e0e566ef7925692208fc66fd9332994ee710ed93c2f49338a8d487a7191d1dae00ddb748b20fa4e0e092ec279e3c11e55d1f7c63454c8c6d6155f65c804d8763e09cee9d1f8663a0a4cccce9441f9ef277d6a2c5985761b3d00708b63bdf03ac9aa20bee8caa190934d0db3a92b6559087f2ce0b47c50af087d9675cf7a753c7fcdb86930a67744c3770a62f7519e7f2eb70db4c390d362da3d30387b8d4615438d3c2e17cb766cabb35737ccc94ffb6597be258b77ccc1c18b0e86205650cd610d7bfd3b1a29de47125ea28e69d188feb48f3b5b9090bba7d3d7d399c93879a78fada8c66d9f4ce36124d0f2e8893f609d25ac11f3cd9d3ef6a1b5767a6c4d37ac86a55a47f7e80f88805715004da056ab801b4610b2720815a499aa8895ef5ecd64bc3d924b08180661f6956b3bc8e823cd4eb201a1ce5bf6d1c8f997252e7eacc1415b69fd4e19daeb33199ec0d777e5f7eba7d261770703cf0074f3f3579cf7786afe434534aba771a58a753070a45bf0ffcc1a37df69f13e0e7c7eeb9863bbf2b9d4abaf7bc1a4ebfdefcb2906fa51df42581597b8637534aaae20682edda9cc4040d39a2ebcda6fefc0a6a5d8f7a2b6806dee956c7ae5767c75a4774cccbeb65b4bd04625d4fab2ca0664dd8f5b68c05c4845121eaba1ea73575fd5c8f51b07575bdeea321cd7cee6eb72d7dcfebcf75f14ed3262e057b626ec3a84c20bc742c629d46ab8f9801cad32afe68caab8de348f4e90b91c73664d73e69cdb48debbc0f24956c8bcb8b092646e6347383a6a68415acb5a2ae1a9a1b3327191c394a68d5172c06c6f4e2d292e36b5a2db644fa908695c5c0cfcb62d7bf0bc51b2cad8c759c269a30f337fac5976f2c136c4e17763917ecfa6bae2938970c33df4c61fba98b7762ba15cc10a7d9d6d180a5961798f074a306070aa10927a88052e166c787f395b0f29607b9cb85bc8c0dbd8860d3b5f2d76ab55aad9c08561433aaa1b9317372b95c2e97cc2ac6c60553ccc857fee32c1aeba117510c56966559962c168bc5624d98cb5b2e97cbe5f22077b990973e1403539665599a582c168bf5e2e272b95cae16155e78297ba85f4d04eb22168bc562b1262c366146bef21f6739508b65b1582c16b843e5d2ac0da85b1dd4ae1acab22ccb9255b2582c16ab87fa45042b02bfb22ccbd263752de4b4d4c046bda2b192559665d940ddeaa076b550c7959b4ac7e2cc9cbae9d8b2b668ac0614eaff74b2762bb2b1131bf54f6dd5566bd3682ca3b14a6394c6268de9c050ba5e5bb3fa8989ea27929b2792db4913c9d3ff0b055e970206d2656666664749e1ed8031741c4762be99d3eb9e57561ab92ac68d5c3565b078ce36a4c83cb221611d06ca946094674059d0348253fe32e11c8253fe9912ac9a4230ca835c35598e3262ba60b6602299454c164c2226d01c8277b29993b9e65cc154c13c328598414c205c1e682699495cffd9aa992b73d55aab8c8c8c0cd5ae4cc5f243b222d911f70ab34c2c899aacd2e49d0fba07b6335ab7b0079655b839401e1cfaa88d2c1708fdbe5b68c104c05c2a830adacc6e5c077b5097fac604a5f1218f6d48d2eae5aad31c82c272b232fde5823673dc68a67cb3a747b911e982d1cc019f78ca3fca6aca4f159615f0ca6c5d07b178934b7a439674461d16111c6262c91a33baee4d9e94349f87c75c99ab85f58aa75cac3126284988d8ed5c305659fa56ae49a9d36c9bf1c052cb4b8e98d38d1a9b1ca1092814502bdc00e0a3a13116be163e8fe2db942b9ec47370965c2870aac06982f3e4f27babaf784e0d8d05e643605e04e647905ce69a784eb3584f58515853585558562e7f977dc473ba2c1b49d949ca5e5242515671f92fe0391d9b29ffcd8abd72c232e416b9fccdaac155d94ff928a727969bb08eb739d5f8cbf472c1bdf3d74cf97b3838383838ae15979edc484fda7bfa495d5e89047ed3e372944dcab22c71b08eb0582c5609598d0b0a97cbe5a2590d59ad56abd5f5bf81420d3017cecb74717070bc09e3c06f7a37b86da66c52966579621d61b1582c992ec60585cbe572e978b9cd62b158ac9235613580ff316c32cc6318c3b8c9dac06f7a309b662a9b946559beb08eb0582c96cb84cd2a1336611336611376fd5b5898a1cbedb22ccb92c562b158accd4b6d7adcd6a265b66c52966559621d61b1582cd6f527bd503b46cb2ebd2eb92eb72ebbd43a964d8fdb485907964dcab22ccbebffe978abd56ad158c7621deb58d6adcec9ea5e73c9ea019567b28522cb70acd65a966d2265cb297efaccc335516b91b3ec0a8f86deec7aa5d72dd1c8d0f78acc374c008f419e191868bed016ab9548608cc97edee771de81dd8d13478a316d9acd2a7df9e9476cee0319530018e7e3b24dd37a60fb515da488ad199d9f839bf3c0f6973a15b21aaf32b5df41131d3b7770f246a3a3544c6944b6eb46c5f6ec42bfe4b6751766fb29a5949e28a594ceffb2df5cf565a21148beceb39ee7dd079a86406d1b69db4e762369996da92d7ec6375f4c2624b6bf8d3041017374d5a3dfb6514a29a594523a9b929452fa1ba8912a9d2e277f691813c8c31ca594cac0ebde38d2663f06b3ac5efeccda2d44cd54dda8cb9481cbc00c0a333b7e72bb9452bb7d7c439e7027addec2766b1f372399e9465574fa05e2979963d09e528d02f1cb74ce9ecccc94c7e42cd471fd75b88a2733f30bc8538625b7cb2ff670cddbb88ad2b018859f7ddc9a694f6659964d8d4e20d4a7d8761d6cd39b29a5d46b69d95c409ef03bc25f897bd14cb48fd879b259ccf7c1803c7cdab2cd51a7cb4fa9cc3cf90cd390c6bba489b3002b9e67d4e2982e0b17e606cef5bc0f24954c97a6849be37a2dd69648a03575770ba0bb7dd2ea93d60c260c35ae24ea737e6f343d6ab4eb655abdfedb47238376f9dd4fce7973e73f0070590452affd91a1705dfc01a45e9afebedc6693dd1f402a4d5fee0ab92eb614eb644cbf2cba14fb83de1b18c6efa4bfbbcf072f77bdeeeee1ddcdaed728af0d6d55703e86757577de83fd3ef04746b29ee402f11290a597c5222ff6604d2d46585d207ed9512cbad83d580e2c4291a36cbe8d8596b0e57a9f077e4eaa744e12c99bb9cf856b3b904fc8add90c33c5ef61b70b8de21bfe7e7f21d7eb500395fe08eab75491678a2f0ae68635bc1e9dde942bc9ebef3eef6e773b0fe7ed401ab81ca9f8f99c02845e17697a906e6ff82e3bca4dee2cce1bbe53b65d6ffb368e7fbacd931e720331a88c417cbe263e2116686144144678d058400c01d1841363101f4f899189bfcf16c5939149bf50c4c8cf28f8b30d7594137dee522cb70fef95267dd87cf762d2f7d0c51b4e977ac8d79f030cbb1a9837f02092304292d1c7e50c36fa8b1b7021c418c4c76669c148dfc7fe40c40b27c0d0466431c610a38fcd418ad17d54a377a33c9e3941f806486805d10f12c467be8f43918312237d1fc781d01082b060640ce2a3ed30529189bf8fb6c3384526fd0cf098e2d8600da1d1eb8f0b83b46b49942b462273e46e817d00c40a561d84112744f4480b88202f46aff6008b1543fc45d00f461a0e14a3cf0b912f5143090e46260309465ce842589cacc62e048095d1e38a5852e467ec429b2e46affbb8b05f50061531af0830e8c2e8fbb890b18831011bbb90c68cd1037710031abbd0868cd1237d5cd842fc200156fab870660757786164ec421642959189a218fd8c5d583262f45ab6a0b246cbe5e342766244cc68ec42fe4116a3c72f261c222b8afa45e4c74847161b25a38d20aa0e518c8090b5102c8882888e2cb4208c58d99c20c952c46d01450c225d105a64f19c14d1a20636687c01c410ac917b2136688cdd0b193bfa42116307e1a134889831fa684f08d9db2f1481c37df78591a2d147eba10623c7c51522a88c3e9b1231468e4bdf66aa797833d4d021800602a2046c98297f21a38b61e753cf81e528768a1e86654751510433e53ec4209c059120158c3e538d91898761fb858cee856dd1545251c52539c6a52bcaf50742d3835ed2e7d21733ed0a27ac70011a5434af728220bbb51a46564a0cb164005310191ab91732f64a043ebcb09de599ef79cc37dac9069a3d0d6f385ded7d0c28398c41b8f7692382a0c1c8a4be90d1eb422e14c91b4e977ee6917ee9e3849d484343d771a1484303c7bd9051c8c86376d96f210e7d353a6a9d268ac0513ec0b0e40d0cbb953efd7a473f0d0ddd7bef89415a064b80b11a3b5a040d4e0dc41442301ab99016418371f3347e820229446317d2eca00440a317473f8e640545436317d6287123a85c518e5d580213276388172c9c170f84c62ee431004d60abb1a3a181fbee3b31480980464e14327a5ae5c07639a14468ec429a30466feb01cc6089a2910b3f2246af9248219739860536347296d50fad91bf8423c6129e18b9ae0b798362b9caf532b28071047fb1c48a35e6d785383a2fcb55eecb6d564b0b32462e64c1c8e8d5af0b1f8503cb552ef95d68c3d31796ab5cae7249cb25197d5eda68a17c62c8d8a594239863218c2443deb731c98a2e8ac62ef4ca18b558a307e518443363f431293176cf8541322c420475ddfb645af49065ecb2686307e5c8af29ae148dfc640915c0c62ee28321108d5d8803c5e8691be9f5c512abb10b6b7a18bdcf064404b5c61c8cfcb663f016dee10bf2a03364881fbe5ad1d8e4b6e397f93de69bfe2e9c49b87668e2357221c883ce90217e3cd2d78541bc35066bf4216531726110f662f4612723f75d18a4bdf06115c4c75323568edcfbb00da068317222135a24850951601939d12508c370003406f1d921258bd5c8bd0f8e0b8c8c9c388568cda0086ce4c22f8dd17bf9ba300853810236facc1f46f617489396350c7b2452c8ddf8c68a184580462ef4bc183df69a797a974a1787ce72e95396094f6a2e0cc829efeeeeee6eeb4b4e331b4769a5b48a9ba3289dd3a66075c9cffd0536b446288d2a369f69fd03d04f3645eb28d30f3c00518d8cd02210993ef09b65e1297b136f51640a0a72e848bfe679a76f5b4ff55fca4515695c1d46fa9fe7f0482ffd93df6073e95b47b50d2c5fd2e6d0295a1377198b308a5cd2be76032145728075310410b44081194ed8b8a2040600c90bac58020d2fc0204269884de1b21336806e76998bd5104a745c927421848e131b5cb9eca48b58002e3be9a206b77f8ab8cab67f1dbb59f65cf7f804793631ec7361df4972bd1a42a9480299970b839c61691a46d3551ca57d5fbf99f68ed2faa78b384ad34a66d8fadaf39845da077115f7daf74a7b8efb06793891ed873e6c4b90f5efa73f4320a1d534ad6486dd9edcaea6bdc955d96b57d3be868ea1aff636b8aaaff637f8f880f5cb4ebaa82243d7ff000ee0317b2ca292b17dcc9c1aaecc307318d0032233b0083a72851142a8381aa2e585145c6031a4e728e628be3fc3cc098113493481a4850412548cce0317508c8932ae60838791d308c20aa6c052c4103cc4467f04cc9c03f4f062a275841ff0200813084b6ed5478d71fb601c57f1b6f94ca1bca2d9ae6ddc23315b5a6bd125edfe47fdecbb74951bb516acf236e69cb30bf9663e79303719461d0ef368854367b9f3957ccf85dd434840b95e3aca9bd4aa853da5897aa85f6db0ca003c0cc0aa28d7a17419f29c74d24a9947b955dacc83071f808d8a5c457a79db8aabc8d9ba2deee2f67ba9d9c017601e734839535e9665e925aabbbb9b38ca8d8cbae4613f2e5165d83893c8751c54e7f811773defab4fa2a0dac49749778c40114bef98a94a491c6755210405f5d69dd37a92eb481ce51c345b462ce9a597ae6a98bb9e4c71558b4bae371972551422d1838aac5ca773d239ab0c957ce39fe8a553e11b9813b9d1cc71346a7c0c46f9d0f4d824e240309a29b0249765e94f269da1372967ce6ccd56395bb3b5ba24971d648587b3fb3792b7a1a893b8101340935594db532ed3e91293f0dafeccee67a6b44352c8d3e66e28da759b823c99e6accc591df27b0c32c053d03b98db16e91d2cfa8fa7a077b4bfb3d89d7e0dfb69e85b05a2db7b8e90b8ca5fc5cf97c1f9f44dae02427df22780cbf0d886e4b6ece99c74cec9d5298f8dc3d43bfc49142e3f4a651dd544d99c59ad278b83daa600321e8e72aff3be7e1bd2f39f7867be0618e59f62950d3697ceb08a3effa8ff83bef6f4e5aa6e392a0c563512dbb6fde66d9bb76d36937dec907cd225ed0fb6b7cddae962c19096ad3b8b5892be8a664e8fdd9524acf16435fa53a399d3b1151097242760d880b55a11c166ce8412058c264533875fabd5e85f63d56868e6c4e08513e5cb68e67812aa60ad56ab550ea3cb6b882aabd13f83d5a05506445f75557f660e8fdeba247d159542aea0ac55599388ad210e41562b1ce6d1736df1680d957cdf8545d79ffb440dd840e5d2184f5f71943f9785d40a2d0a29d14cc19060952bc1280f729412b48aab281546810df01114e917fa385160c98ed1d7acd9cf99cdeed8d6852177b956abd58aa56e3f0b309c24300147b983f33be4fc89bb3c886fdc0496a42fee877760b8fed3072b0147b9771a9cf2e7b896969999580f96befce52a92893c28c8833c48023a5c200abdff1ce0e3870047b9026a9db3ba6aceefb2c9b355d65a7a8e8a5a8ef21910e028efc6e2aacaee432d2d2d2e3a6cb8a5e7a88af62d608fa9fdbc541375b61087d902f25091878b8e8e293381f5b90bf389244e9b401eed3dfaddfa22ca04f25411878b232bf70b7df460be2c642eb2ace60cd9bd653cf6eb9dbcee1b35ec2147f5936ed241ddbae148aebf57430a8568e65030281ad7494ac6755086f963ebb73879b0408ef2e799432cc945b7633367dbac3d9d624531faa2afaeb3b6664ecbfb76b24fbe0d33a745e4222fc2c137f43b89d895a398ab3d6b156ba55728117df14df8f1cc7122966b4bcf91951dac07f10ebd8cc5134c2ecf2196a4b5a5274b1147f1f520578109e8a3dbef410e05aa3e8b4abee7e1d53bd67da991abbedf367bfa2fecfb71b70470017d74ebd3d714067b7c515e33c7833ce5ef290f7ad597cb5b4001c2253de83a7728bee9e7609d2fa088d79699695c086dbbbb728af6cc2534f9a71496e91a5e5b66e7c1b6bd79a8555847c8b4ece23432c4839b28b18d4775985507ca9de0042e39e44033577365e39a593ea7a07f969edf2d4ee122c9ed02c9e5028a27976bb0bcc59095eb61400047310ce00806187454052840010a407bf4e8d143e8010f78c00382de6e274b010a5080022ed65097421e5bc0f2164353ae97812f031960b0e788d573c4ba19007b8e8eb4a8f2ff66f550bf9aa86137a892f0424e125a682100389e437d03385876b080e5e646870a55a250ff4c658d8d0e0ea8d0466a8536524801059b18ec74b276db489c13b971cf0ed8b061c2096c84e1e300fa81f970e14042093990404363b71bdb69894ba8ab7097ab845cc52d0f879391cc8c110c8cc9c58ff4906d3b9dfea75cefc7e76b58211eb5ed347417b0e708c85540495c453609c46f3f0d7b8e921cc1b6c8fdfe2d1dfa1247cd7f015d0dcbc3c59e232047f1e5eb957a8e58b7e7a8e539ec409ee32e4fcde7db7374e47a6d7b8e5a8ee2eb19bd59e63d47496ad8738404e4e93962b94ac8e54b02d95b7a8e8ab8eb1e1d71145f1efe8109d0b264c972b424ec3962398aaf2f7115e9ad3b5baee2bb4d9c99f37f3af9b4d34b0ab83ce66e1cbfd3525aab0b3a1ef30d6b59a5db36bd399b1afe2a25b95fb146b02e04cb62158b60c9cf6327d3b70d2c8b69d8346ccc92b84dcb4876cbb26de3b8aed3c1e3a198371e0a92b49213c192dbc69df7dc4a6d794c9de7eedf0792d85adb1de71e739bd6755957e9ec3a6fd2ecd20e583851c408b02b2bf67c08d6bf0509cbb02b04db5eb985c5cdbd7edd4e6ec566977cce5a4c8eaaa28da3bcb3dc1f0d13c29c734e1336227074603872020a29a052bdbafcbe06e5d88d81376bb2797254adb5d65a6badde3b6aad75f6cc4c339ba2aace2fa3737394cabfceda35066dddfae7d8b6eb3ebf0baf5bb64b3d9a77ff78f5b3fa55f4d6c1abb57a15d999374709a9ed355cfa1cf657d16b05529b78dee62aee27c2f637d7d0f20de7f0e9df39fc728bdc536c8d8cd66d983fdfc0b006f8183910fac77fe045d6647aa13dbd72ad956ba5b492b5f61479fbec889f20fa38f4c9ef76adb5d6169a5edff3e6d3f7108adee174fa0c7a873fa52268a1da428ef2596bad4fa5e0428c1f4ae9b76dcfac5d8ec32eb26def7335ee22f5297d06b56f0619d03ef40efeec69c89f85fdd33be86bb47de81d5404f569d8454252080edaadf5039f52a8644d9606410b11cd8800100000f315402030140e88c5c2d1308be240dc0314000d718c406258469247035194e3480c624829630c2180183032323220520400801b8bd2c15a53d89e60383529765d30971de8868638ff50b6e4dcabbe5f6b21f632394fc874e3ce2eea251c46826f05c025575940e01b7bb0d4f3856dc7b69e1cac6c460369b83fea55fdb193f85c5cec44dc439b19eceabb32cc31873450659f03f104bf344981678453e88260ad3e031406b50f1894840645571e4f34f44e9a41f65b25d2a0fa26bd4f658a76780d7d62e8d5ade133353429e4aa410d85b12a595563f8f81f3f54950bc244b62bc1360d533b781712a54766a5f7404e7eacdfa5745d9c4ca12f9add0c2b70a3a063f9240a0f540b846928078b77b738ee7e8bf2964966ef183a629511e15f66c25605e10a4986ac77ea63fe2003ef81b2f526227ab436b99b41cd229cae3061ba4458929555d0ce0627e0746048b6feab548712bc0a8e76e4b709ef8173b20443bf74d2c9fa1f63281c5a7f9cb617618e28c6f7e6b1486da0614d5f48b5652f6261cf27a1670d14b6999684519ed28349ad50c62c83cab5618e43016ec4035b8e33a91a25fe79ac7535f419fa4f4528c20cfdb88450484f5d9221177284d639971086291e9b77030c010509575700d2c066666d67167676b3ddf07002d5ad6565cfdf8a6445d8311206612a042e3f8e298625085c85a156015fb7be06a0d3b6329c9b4d95d1eb56e45eb76db8ca06b89edd0e56b5fe6671b4a7856d037623ea635a83430b60e421ab15aaf6ae6d050a401c1bc5c100efaa408b786016b3aafa9cc92a0ebc68db5607c9dc860652238c1cfec579ee6d39e34bdde46e4ff74ee4503da3b26937d5fced2ca5a49d5bf4343e9aebf83a8f3c4128a6f3cf2238efd65998fe1c62db08445dfa07cec33d4c805b32733766207d19f41053ead90369f9d7dd1693edbb7b5fd5d909b71193c8bf684b010cdae1a6c481b10934016e98231d2f012a04c8b354245f31d51f72aa35e24acd4bdc4de68d676f1134362b5533964508709979dbf49db5f9c12d2cd9b287beb8b3237ec94419b46ec753b45c648ab3b0e65090f85ac1d55313871a4a82775ebaddc393a6b3ebbc2276e723359411c6b130047a42d7e78dd25c778b56866bb6149163a1404f4c039ac0b4ab3f0b2077fe89a175b4bd6061e61a494b6426e9a48f352280073aa1ee8cc840c4043fac11c0221444cf3d84194d5b83947126c0ab194b7707d03722ee21e9c4857e3741d37e3bd707c1c0a58f107c2cb15d2ddc70912ea152c2891d10e820b5b5b5658057fe677cb2652ab60df67c4061580c8b7e385ca26859e9b1cdc9d373be839a7a9c51692f1973273187040f73578801f50643689084e84effa484828f9602de1b5a23c0ff1ca8d5d270123ae93c66c064f0bfe11692cd5a4cc300d1c82de32c5c5a722c908bed78356e56691219f7ab4383f93a99bea41d50855ff05b8f6f593cda15faa93965714673546e1cad364ff76373fc2dd0c6bd153db065c8631811c0ac4dc194ed8dcfe36e2686500284b1faee4c7a0688041dff1c5ffb2a1431f4727fbb4cd99c2393e0dd083dbd88caf43a130fbc27940a00fb44c595faeacc24c15df3c02de1dbb7177f10a640a1569f034a5788ca4eba1c20f6193f138fe9cb322288675fdf206704030c6e4f606b7e7bcc08b2ad11c8017e07f36ef7b0d35b35f51eee29d5e88afd8c60b28292c569b4212509258cf8dcf70d38454fec68ce852aef73a1ac5631b0ed21478fa98b22d267ab42c64f6293fff04860f4c8e3e5093e3e886325c37e183dece544176f8ada0b7a8c7b54ba4e290a9ebbe808be66c4be5f8fccbeb157c25a445cb40b453c995e110fa20cb8e91931005fd198f9b532ceba8a340bce584e1af3487c28fdfd3cf44e05d541083d62d3a11a5472ee5d6296d0fac09b98a969b55db2622f881081130fa0d31bc3a90eda4ae805f2863e6fd93f189560978d37eb9b6a525034ab0f4afead4bf682be8c7af314be5b0df0c7dc5b696ce922900d782e7710f8872d6e697a973581e701f5929644c279421abc903c97158d876911e36b4e087998303c56a1969661b0edac595f88cc87ff9f15f399776db15e0bfcb242f65bf1081083f98730f0e99b60ca09aba2ea5d493200f3a55d46428b2302f2ed1f33730c7979455b6873be40a1d463b3920c477e43a2f8b64b71c5c4749f0d5b69d9de25b83afcfaf01a7433f737a19f606fff42f38397a4d0ebdb47fc0d2f4d1a396be6ce5100cbc9be60bd0a15cae2bac37f391a3a4f4cd8314ce6e5c24798bb4c8b70870894b53fb0d0f839ea7a1408b8237259b480a29f78fe7a18c9cbd0931f6edd43cc9030d365bbac79a4d292ca285b471c9ad32543695073da09349f781b42e36d4320da2b48377214ebae0169c680fb0917f8270a990398b63ed79749f8d8beb80315a8c3a012bf7bf7564a18f481ab71f3ba71dad56f2802d114f8ac07227de08c206c88c3a70e66fb0111f788221d985387d8f7fb6fcd916f190abcc973407fec03f7774a093543a7aae7560acae1bfcdf634648c45675c55311fac738eaf8104708cbd805caf5f218275c599b564fc00c0377ad97635b92c89d7e282477694fa44fae993b4eab9c67f34cc2b6cccccdc4cc4c558badc1343933a2ecb7a79ea65c4a24fcb069c112fe83b50e0c77f59e9e07cda9f3fb22d5f013aab2f83c4335b47c5b8de010537c0beb134b54506eb1b01f00c6e6fcb397e8a7f6c667799ef577512408ece8c171bf75768006c662304d160dd184b2573365172f1f9cf332edf5938190c0e6ac2e06c85b81f7688b457ce4db895164dff88e44547ca0927c0ce1f8cd166628334b60c60b309c62ddf826ff5af6329318d47a80011694ac27ddd0c83adfb896255ab957e4194eb750f45deebda9762812d3826e41828dc1108c810b209f7cf42c84ce19d0a8f4957888317825b7db318ae7a0503e0106b44dd35eb35d931b86cdf2474adb5e9dbcd89c1d99398caf79fb5f138405290ebdc33b288dc9d493f67e2037696a6aa941c24e2048c25ada5f4e6c319ba7d34a625f8e1aed128f5e0ce4abf111a02963b9f7313d2fa540555fbb07f23c7bf16c18f3dddacdf6b434a4e08896aff2f01ae59792fdffeeacad630ff415f30c322e9a49d6a4a61fec3eafcbf984c08775960e318b383d927ae444a3eb944c0ca915f9dc0d85e1ad084219665dd17ce9b77c69a8e68a95b2c5a8f69b88b284787d0e8008b1d2e43f9d85e2f3528a6023aea387bbad717758e4d6fc2731833007a44e501be67e8a6a994948832dee12a4f0c14fdb51ce4cf811d3314476aefc57652169b6be2b503fc22fa7a608d857960c6420c618d2700dc43a9c60f64d3901baac139f0b525e46c1636c144aab16789fadc642a7f95a764ec2eaf3450a5d8941d1071ecdf4565c981b3c8c34df8d06d1f489678a2ff9f56a115e0761aac60d118d577f292d49c9d124ee11269a56883e38bf767eca5ced7d774798bed9ce7b53c716e4e419a39db79fd603770e477e41aca2acf40b3654e9834c41424850e1b7b22887402c69b93a7bbe63333cba02f16db07eec08c4a2357e98c610865589f80713b3993aae87e5c590f2e655e97d6db5b7698b942f01d00c32c44f20790673d424c1831217f48643f94eb63679a31201da172117bb3d844b8da17d65d2703867d6c1bbbc8a3a621818ec20a5b1bff5af3c0a626832a6df00f41ff784512d52d3d88a02a228327d3c98418e913526f6de77ada6eef6996ef3551cd79b47fc7595c7f488e4249d77c286afb98de65089fd3df9c7bdf22c20dc49ddf16735f6ca7490ceec342995be142ba961bf6de98cfe49d04b635ac053fba82a86f623a5d10a362ea64fac8a1cea973f6b4c884b0fc5d4e9572d819638dba58e1b1ecdacc7e09c602f06bf2a6db6bb6a206253f04cf57950495ceb3d6508d8358004225fc4eac04377c34a9f1e3d4e22e34d2e362ac0926cdbfc00bfe4263660c7023bae04b8c439f3c9e84502dd6337c2e99cb9210f11a0b2c9121ab5b7e9bf808b550b5dd4edc5326915bfe88567a7458fa4a1e33b855467fdf4e2cb8704cd1d2846e442248b9e8d72f2235bc86262532b9468fea39cff3cbb9b42380a7c3424790ca95f5a2e7e8c487f3b500f2af5823b9c149130eaa44b7e00f0876a21cfa5da2341e8aec8e21f7672fc017ec651be18cbdf41e5b1b177d896f5bae786abfc40bdc31a0f57db08aa701d6223e9f4839e115fd5986bc5e1d887417a297de387e65cb462dcdb9986a298ff20fa4ee09a3a11f80552ba2f643ba91e0b227e3f2fb49733485146dfcc98f1845d2b2b69e86b500418312b6f642400ac94be5dc74b93d68af2fe29e95922df3190713217a17e7a32742de74c6f5256b40385186034244f35ace6543c422663cf3f4b36830b7abb34e0cdbe21ba459192ca40405b742f796ea91f936b447093d19b707e989f4f5ad7b5cc96fdc02046d9c1c26911176e06aaf3fe9751c14240042128aa04451ac1aacf5e142d931b31c89f25a1296c0882e361454aabf988f8491f1bf18e748f01153332ca096b9dbc7e190ad2797ab1ae9c0ed492886f351d9ea92cad1a6a75fc902c55dc90d7040c45fc01f1e3257a85898715f61d029f64a9918584ce08b281cae95d98e5d6f29c62df9e03f56f78f0270c7bbbb34853a90300c4c6c11c38b9f8dd8c4ace00a125d7a93e0e724513e9e2be5a51bd81237d7f89c671d15051f718b44bb0606d9b027e60dbbd41b4b2ef5235e05429bc89fdbbd30350600e73a7b5e900b618020d1843af56a2f06428d9023882dc2d7c1aefe411ed34152291b6c4248c69fcbfe03dbcd7e65080c77a41bf71fa17f461df2a2f56075b35f6981c055e906e72ba34252ac7583b320f05dfa14fd24ade159c3596071c9d457fad385d6a3c54d2e6504868bf29b1eae58d4cf2789010442c07b33dec41192ab43d6cb9cd718f46c5d6072183ff998ecd1fec7e7ea8296c3461f9fd2028f5be9cd1cab6f5480917e7141c833a8bdf230258a08b84d725425a160e9bb2555968e24b140bde9677adbd1485cad12a38654167ccad1c9fe00162d0dd9294d70f2d99d522332996fbb530610a74b3a479b7e5de50b14572537f829d72fb295f81cd8220d3dda2a653fdcb0ca14a846fdacc0623ca6a4acad50e85899672a7eacc376c9715a9b30133bfac3f89915fbbf4caaa9de90c84dc97712b8c0d5dced65a936a4f3474e596084a7f740805ad49c34ee15a855633d97f8b5aa49e96cf3e49c99b7372e7d24eac0da9e7808ab6f1e07105d45a949de7609b11ae55448b4e261d5d2b083b7a5ee0029f89cad2fa5e24f3016883eb3e68283a367dea1858ca9abf530567bec1734dd6ae2673ee252d985f9dd443e10a91515071d644006e5babd640be00e643cb385bde63567bf2a8428f85383cfdad9817f21fe9a13d08b3e640937e1403f3359b0385085b28daba619467c658306471538a80b5669c832c9b8256b72be3d857880b343043d0d2db11a477e9e0ceabb4e5faeb2cc3739d78c25f7da1dbc23311464b94568775c480329a705d94decc897ade4fb935ebda38c6f36361ee8554e6be729691822ccc622ff813c2613602ed40ec9dc10386b4e5d61992871595d7be22d5dce87b6ed20b1c4c0aa8286e72b7e0491ed13d5e17894a541ae7a9d24de2986fb7d6b77886fcb0c0e60e51075dfcb9510d4aa19073b5b461e787968a34f5acf0f3ae4cceb9c15447762f0ed22f6c7b97b22f2130edd147c3e350fbf888f894b071710752debd73566b72251562300c0556a6f19c4655db333cadf51503b13a6cbfd77d5c4ca1561e40d2cb39c52ba96156e4bd995867e74196604a2576a4f1c547771c0ad6172bf6618b283c3cc3303c231b98b3c0e8b81e5c96007296e467a467009a3316129cf5014ee148ca25bdccbeb6e136469a32cfa294d8ddb8351125c2a0726fa1b37ecaad1ecd791424f81f6042ab1a404947c51fd86b27a4b84db52581278235f11e39aeaecbb6f1b9bdb4a84e8d8582aa6a95b9d2674250e5128da56aa168b740d40eb52ec178063584f07d4b4c20edd16681951bb14361ac5407889b90d8a417d1aa61d6f22067407e5f77f1d03b268f0bc0355e7905d701710c612296aef5ccb93963791e3571374d2860516b17375297c94f3541ab74b290b7aba73a2a08d04aede13b8719b3df4588521cd478ea46df321068a12dbd2c2edf31a2b1854cf9462029b1f44ce879deb5098a598756de6e3f6ed870e23a4d3b1e70f845330ac1f8796e8156847315e2e3b631461b0d6195bb21a85890c7f8020e0e3f883accc8fb8b5857bd434ea941a8bb17ed6ef130f565a950e4f0f796a900236b51d5da37f7dcc0fb1a515f74f697553c08ab11c1d150d583b143cf725478f53a8e8d5ee2e1542a718b1221fa7e4b8044ada52e3618f4c1055c3782581138499681853f4b2ef951255960cfe4bcf18c5c03cd96d07b11bd4c7c064604687d65efde82e3ac457d45091c30dea2dc0177d2411dc80df10af4666ea372012f9f64142ddb036c0377510f28cea19c9d63c7fcf4074dccb89f000258abeebc1542a405e3adb0011d66c12a089118c12b101c8c8a3dd9a215b6930b975b3b478a258862f8e90a7164d922f830167ddce7b719cb8c7d603c5cbdbc4a5188adc6e195ecaf0e96cda633a2d55b68a7633becdc1f1179dc9c8bcf04bc3e4f30e802735663df40b6d130ca12ac2369e923c378ecb521c4d249fba0326145b41853183a8ad96a44e3b559dd6f208a0dadbf4ea754de93a693fda8e5bbee0ce9ae803fa3a9ea8daba4d30622558c55d8a9fcfabb6658d9b8e602df04f4f14fdaf002deb80773793217885343a82add9027002cd54bae71532cd26680a5f58e1b6f1b175d8c63b20ca61498dad6d0de47b75a35759437d47d9844af5f6f2f0ebf2ba004efaa5c5c6a96beda1a4c8d12f2686be0263f57344320484a094bbb3f150e5040d72086fb8be6fc671d6fd000363c0f81bc16598a21df29fa427a35419bb74addbc8fce23e9a50993eca8b91c62da26384af255c329dc952f4ee19600a2fbfb26117e6905179d0f2d03c1369bc767cc142f1c37a135d2f7d81f9f7c7b383ef58057150872757af9f7ff88b163e25325a165830b2b4cb24ac6f480cd52d926a74b97bfe5a967fd0e068ddd2b3af2b005a0f37b1f4d0d68b027e3aafce77f21e72300da037a9a0ec93871409c9fcddc187419a179e6b4848b5c877380c2d1e1604ed0be7992fa3d970d7cae68e50e8005cef855853ba99a00ff6d82f54bd6472181db2c67f93bf24aae94a0ac6f19b858385a19107e9017f6fb1627c10328137e35a5564cca72c2fecb8ec712ac1da2cfe608335c88bffd77d04cb110afb093d9bc9c9a7998325ac7871a79455b6cec1efa84783beadab249f24c2a6832a593e971f83f039c9c2e7d2e8eb7a735313c84bba6998c018801af55beb0646e10f62e7590a0d96927943c2a2523ba4b1ce3b98e3bf8b7d6853112dce5445460f704d215a724f82628a0d21fda3c01b6fed4091d1ddc6146ed2ed35bbb43ea29822c79cd68e86f7d4c59d9700a58f406e91724cf3e690412bc64cf50b1336823fa23cd03e9e1c83a3e6335ba1b1cd7cab1bbed525e34c090dff41bdab811b33525ef97ab56840ca05380775a67a7f7714958c2958e17df4333990328eecb20a90104b40c849bf54fa16dab01b4a67ec660b55ec286a8a620fc10dfe70a4769baa93ffc4ec7e478e2d4febee73a5331053bb61051b3495539088f4a85fab05730e768ac84afb29f31e7e41538304f5d2087ab7726233b2855a4a4bc6fcafaeddb7ec50ea32485b736bc841c2972a3cad6dd33e9be1ce28f5476bb23877f1be96d70f6a1e1aadaa7ab0be420a95defdea346e7750de39c5f3018f2159979a470144678100d3e524bc63f6a8698eddd347360e2de3a00ffbb6452a63b72063808e0360b58566bc614dedbe607cc6ed944c718c1f61a7b92bd64dd64220732587b16832a0c5277509080ae556e403a547c4a2d2f139ebfe86d855e565969d7aa1713d018030bd32e612236b1593e0ee578a7c59a6d357b4cdcab24c4f23dace751534d4ba1262881bc2ccddb78e6f4488b3c4f5cbc3eff07a1f1daabcd88d459fe2cdba9635a3c66e60a07aa7854f8fcc16046228385b0c71e3c686ca4ce0426d36087499b07b9648a704f367eea21fbf42b19028ade4bb14e6797e78c21ecd196599fc265cabae260e3b3d7f9ad5c1c07d492f314315e79a46b1be51b41a1fa6b1458986b52e2de290a16d30fb8e207319272ca1c03e3853c72ed388362c5945e4c8bc80d0ff52a6863b06ac5a516eb64818a36ffc7f8865882c741f6813fe9c0a06b9912852bb68382723c94a16eec2e034779741e3d5c311b999384d95a97f0aa8c669e0ae6e1ad984736129df45852be34370e2ffb2051108acaae633e3b30364fe644f48366e2b1e78cdb953e3424b7f375f98ed8ef4896429182f08cd75cf38e1134fa6cf896300e5e3700c1b6cd5c6d2868a92fd51c04826e105f8f8c547a00613c16fe8a89aa3b44653624c9bd83a526c90a1df06dc4934277955b2c0110ced503b186e7ed20a6272f0993eef5144a64ce2285d341cf378c2a76a00b17f19892765a04729aab1a703e2416560652b665cd30cc6f588405e68210f191ce51279e11d3ae87c33ccc669b2acb09e6ac9346286759152fbad33f7c333b3a1365f9d5a135e8c5fa63e776bf59e27eb661f5fe1f70ffcb855c4750cfd97eb919cd4486fe054381a0cf7ea1eb31bee8e110d27f235953892628b1f950bc3eac0b405c1749de88e602b8f14e8f66b767da483ac33714f289e12a2bbb1ceb4b87d6cba269f63912de941837b4bcf9b1f275768612fcadd4b20024b0a19be106f2b4fa8ee7dbd56ccea5d31ed2345e39312252700f7712a74c958a0e1d46974a43a44ad3f5daa8bd56bf8cc670a75dc8890c89c51116ae0bf23c7b3827b132375c43ff0c746b2324ee4a6351498a80489cf431b88696f4c0c48814c67608401d2692956b6f3a037e4520cd4d9731a6feee167c0f5a361a55063808d351045306b557523e561c0606b1888c72a5037aa9ca63e3ff2aa837957f966f67f1c3ca77e9957825a3b01fa34b34285f55035b8caa1023cb7f03f22934e1bfc18901da9c174cf1a5c169f3bf1aca053c69a648c45eaba094e7d67e8d48e885e4c903e67a18b75d2e3365784a3874a4b537169de08a2cde340a624da22f308d4f0ad27645408b511ce9780fe279d6bce043f29036b361237b3fd8e9565376cb707ab31973bdeaa614ebf9444e4688a1dafcf64acb3081eccc732c985dbaef3b45801ba5f55ade3cce2acd501f988322c30cc6d8dc9108147cf3f69c55cd91ef092b9f511974166243d3b2dd696052547ab6c916246cbd28cecca51f2abf835a29b0a73be3997d0a4eb0425b4342f6e5838945bb9d9cae1abab354aac255d1ac884b936764ba6d9d3ddbdff53709da1bfd7442714857356b7637accbd61871bccf4cf0601f9da23dceba3c4f4008820a170fb723b70ef57c7c48c6b4dba9de0b2957182fb78586f96271af0ac3536f115bbe814df5857d29e01781f5abbff51ee3d00632640d5e2b3c8bb65ae4725ded76c00b3e4c10233a7d6caba2da20643c553b22c1e04a197a36a21ddb8ac7d51ed11a6cdd41387be1b89f0f22570aa06c2d90c2a329656300e1e0c450a5fab2fc86a1bfab658ef212736c61cd05e71fc955d1014cda4c6db12992171c2e7c27165d8c05902e830b804a070504afd19cc252a35557d121d238235f44c3e97bfac014c2bb25b6aec71aa64ce416d8eba8a72e87837eaf48487c477b09202f314229fdeadc6fb5bed75d8a964c6038f478a8a1c8cba851bdbefdf0f61cee09662a76d05a6c878453026903fe1cfd0fb85e059f24a0c48d0d856c76c64222a24df918b17b5b468074ac1b948acd9e2275a1827da1d4be1bb3d0f9351803e16641da53fa38cf484bd8e40e92597ac43128608db88cb4e6f78fe2c934dac2b0aea6a832da1d5808b1bb6b365c80be6a504a17943da167121e41a0c584c920da457ce05bb40dc58689533d7eeab9cd79c6210734865f4de4d813905d1b9de3c4d1c35c1c38470bc4095ee5f0a881a9f15a55cbbb1de78730877cc549e2b1c29520a899b144c0014e1b3eb5f6615d23182e0b8cd176c4471665543031668627328ec56fa4bfc45197b134703a830cad9ca2082f80868d9f5fe5e64872c94c899a32e763e5bf09da789bc46f6108e4bc4aa64ee744834302b5a4790a1d2582fabc4491d0ffe10d84969aa87428a3c6d2254941aecc290f6153453fc71f532399adc90dfc87030b9816b9a95f0994d036c5e184864932df8364e5e3fe192250f6285e60e4c9bc0c58ba30c1b82943b63a9ce192bc8ce58e11427f435e1047d907ca0769e675ce052c7e02e80cdf08144b5cde0a6b0572f3509f8c2751a6b488ba3339c0c904774a507519972bc2ec63f99a94bd17ac7ac04bd6a305c37cd08f72bce1f25e04a95ca3849c9c5f5ab5813e50c8deb2e08f4d3534445341ea198b58ab8a9f59570ce7f69b7aa3441a18b5ac0271d629193018b9ae9c806154a23480ae622c693ab0814644785fdfbd3752a5b0da9201ba41048c798b5a4278fd3088f03a57715357ba91d163f4a74268bf8ec71adea06502a66595c2451826da0e2b0cd9c9b112cdf055acfe4f0c245f44906fc385602f25eae74dcf256b6a930c921a114c2d173affe3e9208b869515017859d69d249203e7b5b816948426e108438c3d8eb73b97ce82c0104a218c4ca9c40ad4c393980e0413d78212d04620c27628d1e0fe9ad5b44e25c8c106dfe0ba499489c1cbf71d01402cfa18544021568e52bf2a35352a1ce2c818131d01b02e0f079ea1b359ebc8856ecc38569df6160a2c4e628f57780f7894d94bef5c108bb4580f9582a08dab00048cae09df632d3f5a39e74b96ec96ce0864050d9bdca9012b902dd2761a07bbb0b78b82be03631d86d591507e3768b000f1328fcfebe4787011dd0f5eee72393a6681e403d285aa5f13cbba0a8139bb98d798838c955fed8cf0b95181130496fcb0b7317b90f92b30025fc8b04296dfe91a631855e9eb691c04c2556341b783a246844d4084b83edcc8148262e4a7a78cbe242778355abd78c7156ab3775773c8836e20f4d18354fb2596829bdecb498d198635574d499b298bb08a5c8de845e63c7542a4e7380d5c754d458065661b125a91044df653c749546c039bc75e24f06a6515d5ed90d507064a9a7a048317b044d502615eecc08db55e69dfd5fd57b1c9a26f65c5a805326a386f1b794114952ccf71d08b08070f5ac2297534030ee5a258bc4b6dda9514706a1e21b71c16b54893269faf78618a3d2ee2259348da77f6e8df2911fdb6affa023bda9d508c176d3833e858f508d1fdc40c143f6b41f7eba8376ac1bb0cd591b28b98ed33f0eeca067c9bc6bb48cdc00bf543fc6a2bc4dab83be31c8cc5b242705c48be197ef78a020b2b3bd15b13570e333cddcc05fb1a490d246e390320f574f619c8ec2b4374400f567e3c4080d3f3319701819b155d2b75b0a4ddae82b4295dde9aa4058dad84b0bcf15e95da257a98d231051a86d1e54ef8b00f89add00a5642e6ba909e6007c4513acd4804a2242f7cc3cf0cf0441e706942dfe6d6fea3f95589c5fdc9e66e06ed3be75b9cfbdb555fd9aa7172654554ee16f7eb260d1c385331c2abd8885bfd3f7b4344fd1977c3922e4a7d1cf4bae0cbbcfdd42c85272baee91d52c108631a8571705d98cb199e18feea77dcbf9b07c0c83463c829eb6fe69a864ca16bbff566a760d57e3f207911306a60bf228e752397158444e10139aa5cc399658033e386898facb1abc9b69347c04fa99f09b2a789fa4df9435424ea43125bb9559d4a6bf675d8f28f080bda66d2c7f39767a29dcff823848de191e8dc39178ae3dd2279c344ba3baa808f584aa9962917f227e73a28aef080ff885100ededa27a40335db860fe6486ded453a45b662d9bffbeb8f6e1b7889ad3e94dc6a851b417b7c751f1d3c43db096a6a417e060171d98282ee5563450445e287bb75d7be28073e121f7930176a11e8a447062fd6b8f01fe09fe9b983012760d371bcb63024ec35247894ac1bf150d8222246ef4554f3c773b76d8599fc5ba19fb8cdf1b8a3514749fb70035963360ba0e44a9277fd626ac1c79651c03d5f53d7b038885d90fc463212dc2c66b956304f0ebd7fd5680dd38cf2b99c9c4b741b0b984c0095dd7a75827478a456940dc8c2461c9924ffc1ee3ffcc0a373ed8a002fdf4cc71b076a942d9778ccb03e1d427ba53d97b9d5d947975e982e6a2cd36f0666a3fe0a0498c3747cd5695d1be069789eb197b4b8696a9e305d6963f5e8a8da003f036fe950b31aff9f813786dd64669048f2c5c2f9604055f600cb315c679a33163831935dbf5e18b08e75f5521f629460468cd75bee7e4e85e5f3fabdccd22a58c1cd06aa45732d4e90cc64821fa237bb7e606bcd2fb3455f70cdf111dd1441a7f68cc340cbd1a385929e7fd99314f58c4a5e087fd278fd36b83dfa4f8046f868c2bba0ba971be25f7df9679db2bc8f1afa9255c7713203ce106c9cb7a437d32d57bc79ce5c47519ca83402d4ca90a982418c297e98f6d8bf415c7c18477438b8518e6a385e920db4c941cc922e8af816fd30a2bc48d9d2dfec03c4704332a8bbdb1c930c9a303f0f2a240c00a8b320e4fbb43eed4cda0383c6a9b3ecf92a9a6a582085a67044893f1d2806e623ebb73e4cef531e2d49c50f2d9929e50af479a1dffcae975f0c4b86552fadc87d38595df96b64357189d1c4c071d6de90b0725c4d87226c5a8303839eea4e38c6ee84f31b675255a31ce90d1bf17f42a13a912c3d750ff7ddec3f861c805eb58c35e61c8c53f91b0210f9315e5291cdacee35bb48e120190278b4f2b04b160cc8bcf82efb2096295e1adc1529e649e868db0d32e7eee69be6031d365161fcd3889bf1df214663c718312217491a74edd480d46c6cb57d6244759b141b68db15585c3ec2cb383be1ecad54c26404833d43049cc0f55b9852bf0848232c2f6afc0623798e6755e7a944c23c4fc6331fead1a2b0af0e075214e8f7459e7e63318e891a67a4898d57731bf536634a7dead8bce5e62794f5bb6144ade1f6a6757a7b128b1282f49c7de74a6611b3161a372f74d3d01acf677adc97c8aa9bacfe8ee1f3b8c637386dbc0c1056e365c025cb9a533f846bb93dafba3b4c15d11965a14b54b43ef271d1052c31e31aae0ec8864106963d87aa8671d104f4eb99e54d8a3469ea2017e683cee52da66bd811ad3341b7e726b47962ccca6274ae23377e4fd3485a469d0da244b57273fed600dab5acc99688750f2bb90e990fbe878847773839a8232ec02f3a41ced9490ceb0d1c8f7a2f796ec14a58a747ea8cf731a09f1785798393421e549b37aa8f52d41b4e56b3ee61f9d1cb8f6068d8333289e8cc3b42f1d7979dc640249137b6a45f62f2a1188fcbdfaa5a2199cf4503b917898f6e2b48e13f42ad29e5ed528f35dba73c52b5ad9ac72404dfc0a87990bf702aa7acd855fb1380fe9cd13cf712553edb195b6d4eefe398018b64a9f115242a405805d377994852f743bd24e1483d3c0bed6edf01822ffac69770c348cf2dac48ba94ebcccb7df37680a7e8f1a5b4b89e053b8401ae2a8d64ca77e88cc986690f6c0556c749fddcf116741decd6cb932cf1e19ce3856354ac0b7da7dfcfd91680b05cb4a7aa206c7390b28937422f0d92060b3490ac7461605361947a5d92bac411ea774f90e57dc95c9f8ad4ce78a3f63fb0bdf7f5dde67b454141bd43e849aaf26f2716a8d3ef30ed4f684a890bb21923a22a0681aade1e99c1c6bab88db08186e865f60da9622e6eac28a612a9a6d2ec8f4b5a1dd1c5a129bdb866173ca882ae18a46cd387c81ad88cbcfc66fa916efc026912f95cf1204e70148b7461b50fbef7e73eca8bd5f14f5fa2d8efc9e344600c574188c60d23817c169e1de5bfeb13e262bb443ea5c564240ca68e19d72e27c2f5470393886a4a73083d8d7cc3fed9456c8c2b1ddc2a2c713b4d0fdf625ab65b3f92406832912d2b1a8c86820e1df3dcfaa38933b82a326f0a66ec94646bbd218c292e7815510ee27ff6ba34f7f81772b238c9e4382a664223a0caace3138aebf2099c442e90013b002b41e9a66a101c575a5d661095ed6442c8a49b7845e99e5cc617208d864425628df9c132f48ddde24359a0438bebb3960bd274f81e66115c4486669640471340ad8de592632ac2bdaec83fc4d353845f89749ad1ca811d41511ce7e0112e3215d55c6ee969c9fd4d430a74f5e5502aebe16613d09dceba1ac2ed13f3ed396c3226e84ac7dba8acb04e9f34a2d68024d5c11a19ac53d3101bfa7d5447d0877ffa7fc886b2c76aaba10b70f08391fdb1974ca7a6d2d9852fcf27c7e464b0e1ed4d06755dd98259db46c96de65195420013905304d6bef691051fc30e67fe5f8f03f85cdb9946093768ef33705f1a84925fdba41d79e20b59bca0f72677e6ba337ad4f5e4c426ec6b502a2e29362a3a75f56c822b81341dad3b4bb0a3d13c16b790bf1fbc3db8d2fe8158e44b9dc230cb8d7b685e4f8fa5acc7ec7fa98b61c6006eccd01f3ba857aad35977f026d19e7d2b76cc2fd9a0bc33e05a7694e62451682d423cb3fd50122f95101c3a93e46cd08a519d51f9e84cf7f6f406890d21471119269af90db7201a6ee7ecde1509e2d4dfaae856aac02bca4dc4345b24bc2b8743898fa26e4c15047e94aeca6a090f21f84d28810112ab6ac8b230cc6a2c6687ef86a34e23ece4ffb0f6e02678a866fb7028fc811a018a59282fda13a43bb185612e863f145496b646707dc8dcd07ed1201d9f766a906417fa42db15238cd7ecab2c25ac3cb2c31c942e8e8907ea59ee38316427387bc09ee7143dc2d56f7057e06e2a7c9734e66e41b8205151b888ef32070e30e291361e8791efcb8039e577d4dda9748c769718c4d98cbcd40616b66128f9368d686dbdd8e81c4b8ecb6568cc2c20372ba739d6bc21045d7ce1db18d7c033d8b18e90e28ec55d0070276a039920dc8ee6d3acc3ba0091b5245706722838d705a72725850b64059047aa6d80f45c025e638ff66fbeb9f1f9328a0343c1a0c34200b070b5c7c93dd6d06750d5f258437b94703345c344e940667645e0cb479fe21bbdf9826f2be63afe6c927408d7218438e0d216a058a28ab4e91c199fe35751c7d5ea02173043080fe31da4d5c0283d89cfe86c49b30cc81aa82ee1050345066de1ffc6d73292432dcf21845df1b0228e15b0661e9a24b7f926b2c7b4d4c34b1cdba2ff6f1b2aba91a08dd8035bc0fd3ffbf457101ccf94af4c14b1fcf5504458fa0c79be9f8311864ab2605dd9932861becf2d8b70423ba18b574ab486949c10b77bc01a00ea4fc0e5b0abf515342763ffb43c766fc93462a434d6501f693a8ccef3a1777d3a64c96ac60f1e0cb4227148117273e3fc8130ef9ee0d40820366ca022d97fad4a93631252ddd45d43a6b9478c1def660772df8bacb4bc040dc02639d375e94eba545f89012bf85130afa1957e5dccfc1d4554bfe4b0ebc306a47d0d7b0d1bea76026d894eaabf291235cb8eca0735f10ff0870565fb84f6078274623f15e55d83057083e166e67221101505c0ccdf2a684a2093e0728f3dfe5049acce466eef1ee543c815b32a2ee58f734088f0f7c3608a25cc512b99d914611af4c40d56654e12c1c4eefd55f942967fd8dccf522b15a7da63bd8dff9df132d0172c03d0d94abda1e5b3a9b895759626e2fc873e768daabb11dde425d51fcfb6714153a2bfc2a143234ea54dff2bc5c1912c436eb018aeb146f0a040eef25cb7e630a6f210f75e5c0c77139771fb97bdda86d728244557fa381b4d3b0a11bdd8e1a1990273c19a1bc04d2d310c1087d969832548facde7f8cef3a88fd998c4e6ebc1a983752bea799b459370ca7928f35b0ce38b5ff3134e8fc36681b2e4619932d43078cb75d07e123d1bc1e52da003992393e5231a4b9749b97c1d23e12d3c11abcb8df9788a9e56d3413ade5b0ef7a3466863f8db01a678d5c34082ce39bce0450374a1edcd3877550e309253074a33daa94e85f7cb01a040bc27c37fff2434bb025c9930250287ab929033be2837085ca7b5d7a508fe362a1f93687b21b661db06283e9859980bd9a9b1b599f7f29b75b33f954475dad64e21e548538725ab05361c5c8407826a0a0f37a8ca0e03e11634967d9e4c5b1815047aafbba65958882b21f834b05d616543c655e9fb57d1de4811b2c0a4d0e08360cda7fe4f15200f6a6e9d8cad7747d67c0a6a82a62f5cdde535c00544c4d14fb1b87afd1c3b8c7f37700285f63d0f358bfa2edd9dbc64c327a6ded5df0b5fc30c14069ae658d5a224063fb56280167615e1345fd67c0f423e029dbbc7d2fa96bc2ddd31172d43d719538ade45c8968f3893fbda05feb5d8f506b3d1d15b54bce3407c1b818a5119ec033ffdd3d0a6e9cb15778fd4ab3b22e151ff358a6b6dcc3b3901e09da013c3f0b0428c99bccf812b2223937febbf6f596651ffabfd38ac9d1c75799e1d19fe42a5524a20b76b417754f5c9257776ea21b96f4f23cb9c4c1eb84f21a47f2c784b36bd7b92dd0322ba01eafc98be11c7e53ada6a059c1c09a545014bb7a1ebe61420d7d307c8b38923aea82d85faa7e11eee8a9eece07876d961b4f4c307fb65438e2f7a7d45eb8b3f5b6cb899f95a9453a883e60203bb8c41b265389e0b97e1c4bb50dfe0c87aafbe4e572306e90b065c608f9858befe33716085e10d4749a8ea25750058e132ec54508f0118374b1c72d0eb95010070b313995e86a38a177199587f6c089ae225d1d280894751f69863323488830bbe6b52b8c40aaafd4cab456028540785ab27d77d52d56707591ea98c782e4f0951430da85875a1a86cc1f7c84ff389da2b4d39ef7b51316cd8fe7850370cb3cef7cd15e8c58b44cf6c7ee311dd701add84866bcb6a51099c9eccacdc405e0fe300ad4e3f8a127ae68516f4417ba18d0d5a058a0082f9d97acc82d2fdc8b8cb57eda1d86cc8cd74e8877642cb19f4c2882c0c395db676103c1d723fa7ab516e7634003cb1f1b1f24673e3c134cea6d31734e3f7b859ed04145f0a1b8619e8c90bfc1eabb7b12435521eff1cc8d9b7ccc6d4020261d3bb95e8b9fde5f5d0f835420b886b7aff3f480b2ed04d3aebdbd64e1e3d8dc1035fdfd1abb2fd3db149f62f81c9682fa5750dcaed421d73d23d685ada21e42dbdba3201632718ad13453e521df36f8a492455ca8f53129555854f2fa72c682738d028cc2610e99c250aeaea103fb4ac9383f41b49aa0eeabed8d1544f202bd32526c4e987139e777c9f068afc4adeda583f38ac1ccd046b719fb503fe66476b28adacd2b9a6748049657acdce97bf85bcef8585c3fedab2eedd3e91e63e1ddaf088c190c4e49832b169218c6f4b902640c663fff3a6803dde4f457a8775b96ab5bbcf489aba24ef0bc560fc0cbece6dada4fb688196daaaaa50b9e2a245728e0bc1f69ad383ea99b872a0d66f5b692e5d4e0b13caba57a1f4b09b8a4f6512a6f9c7798ff378ea8aa1e18fb470ee895875180c1e292949705f3707b718ffa0d2a2ba619116b99cc6b8d8eeed70eb662924457953f25e8758228a6caf21dc75721e35332b89f8a83da8f484fa28ca3bf360534d4ada2525263daa0e79c0611ecc491f54b6facf86046250d54e8ecffaddde358072dd28c10c5a1464ca02fd242482407e98dd404c722c534eedad11a8ab37c5a78a9f7b8b55c69b12337a6992100245cc4fd9036242d848f0bdef5287b2fbb7998b484eeb17db72cbd76d1b2c844e4be154c189d06db9ec3ef9c3aaed91286badd4a76524b36dc01c54c5609f60eb9bb962009675f790af799d67cf85e4ada06e575f51a931f25254499ae60dcf9fced9a43d86ce2b804611086fe1ee8484f5b04fe0310432c95ba128f19e0224dac6b8c92206040c9df113bebc4fb7cf0df1a20724eb7d486e106858451aa952a547b5e102dc4214ea667e7acbd6503f20d159204010a0e7a1c1d3bf5391369b379f3f3b671390192abfa0750099cf9f03b48150505d848028fb3807f991fc0b9d6b4463c9c6e4068c8ef4b702ca27525ebfca4151d3fc491e0959e26eafae0af589413ef5ad786075acd4b6a4a4b0c1d9e9aa2a705219510904bedc3c49888aa210724a86c1a728b35a90349e3b9d6398bf7398869617a656b316122920ed2df9e9206c5ba7df7af707f534d7b2ee4d6d27db5cc18d7c0990db68d129df5c33ee183789716a3758029c2587988d617ce4e7934aa0a2bceb30bfabd3438e074ddc32a0c0cfa8a3ec5d2214171f7c60c8efc98277e9400e41376df484e33d0c0c0d8b51404c21e2a5a8476d194fcfe6cbad1183057913ccb931b8f9a85ab04b0d20cdb5cfe4d58808046a0a36a787324342b0e4fc26fe85984fb8746b7f278d1085aa0d530ace413fb6beca6c8765fe123bf25c7a691309848266bf89ec53778460733b8a9c55e77615b1e004d028faa36e6153e896d60c4838e2185005ac24868b161c8928ec61eab9f1782122010c2d8a18a20bc8f082ebf0b9be7ce8a3d207ba7192c250f54b00d6be1a53d2b23ececcfe386106de970bd19574f50ff3d6181a5b3dbedd3e1fed10c176186a615c5882897c25422ffe693c0f096ea60217ea3ce3f7a4b431423ae7d81d566ccfef0ee93ebe27963e82f3e7f620e9f1b0c42f0ff2842c1e84d29fbdbc8a838cb60b4bbd3788186e902fb541d8c506c9be06b1506a108a1ceaab696013bc19244c65104764909d8f41222406f1854176097136d242a516724cb4fbe10b62dbda0b820abbcf205c107b8555b0b6e8b529bd9ff4415a783f5b1046aa59ef8ea79760e3e71524d4a8198976f98d9ccd054d96abad9a586a809e4e968151046cca7c119036b4deff28e1a9d0b3a07c44dfe0ca807417d79a426c65c56df3c5c49ad81478bd4fbcb3d0d9cd90df3b5e90df2b7c5454cedabb49ebdda6dfe9818061fecf3861ac0685a8db9e86436acc4936b1c5f39addee3a046e0b020ed6ba860bc3f34c5f119532b92e06badf0aea42ac1d2489a7d2056403dd9d2271f1154534bc3cb426daf3e0a86123183d4a49bbe4986705b4465d2f3afb738aa1d6781680b8b578ce8b033987cb8b63727148391ebbee25d75c621024a0b90f891c3fa13415aacf24cd05c22b5006aa77807f47a69a9f5b7e4f99606d3b3be0b63d4062cb95eb338871cdb5e10819f28ed6e3baf61d41739c7d78f44c108eca57866d8a6b20ec43fab528070bb5e3843e6f4f50c0574a51692ac62b314b34c95973c6cf0f23c9c0f1a58a96f0ec8b06b95dbea044df7b7b4b2d3532eddac972011539919e2398820cc1a9214069accd4f14510fe74cc7e13aceaa8285be2b384a764f30b567f2efd8b9a9f5dd2b5fafb33335f4cc92cde063f4b04c3b7c5c928b8a95db099a0b958898ad492e984217fae46fee7565072314afc4a89ff6ccf7a3c0aa8136e2a240a6cc4fdb0ae5713ca4cc07f90f74e8833335c7c98491e48195ba2b338a13b6d099018e2a0d4c80769c5540ef1561193c8755c9843dfcc6b7220f714ec341a50c0444b4656806e789bb018d60423359c42eae27939a95db4e0f934d9fe36457bef83eb2c5fa278913c8b1c8b1a06a7a97de1e4ba66e8674742c59368506592340949a255e5c5aa01d17d0b11870970c904e0d20225da024d1870c57dd08e9271fd2c5815ef4d814e3a467ade2471346f5d56923e301dad84f7ccc6f7845c15d1003323840bef217318f830e5c16949c9d46ef0119eb65c06b270df9be9c76bc4b04f497ea2580f76806ea6b99d115cc4b8082012b0f78a13730cae8276e3aef8505d61533053146775562118b92cbe2b1501ae89b4e54f4f76806f2d5783d22575a0ffbcebadedd95b8d7259e1672192dfb962e36b218637168412b74b0ca464017390636f2101a625625090bc9964dfbbaf450996ac1a611ae9024f0b0207a38923e942a0c89370dcd8e65c7bc97744e32fab0f3c0a1b9e0874177aa54b14b455348d60a422beca64a17dd1ecd83be0ebbd20275b82a356ce1e9df9d538562618d869babd4b8b0232c51943d6902e1eadf8f23558ed4f8df501bf4f1d33e849082f623ad040dc2a1682bd48ae7ac9859b2325490f591a307dfe99f680cdebee7df6a77ddd00d3f20d6b9a6fcb17908b0beb3133b8e23995990cdaa0048931ab776f44f04b0370d205dbe0958411f08102640a101576b0314c54fff9f282c6dca9862aa94c0eb3be9ca98a198fb8865f2dcd7a1ef23e12093820bf79189a29a67d3dd275562069ae8e4fdcbb410a6b2e2840430d695f697822e703e1fed26903f34e46f2896b8c842895683ec38617a49d1eca9290857c9d58d509fc0e0e4910c36970664331cac3712047e33a1cc33f99a4f2050f3c9741b6307cad507a62d9d9f1031af7270c9313f6c7883be82d72d27ddc1d596f0ac4823168b47b6960b2b5d2e9abefc780d7315b968efd530e82bc4758852c3c749dec0664e2813c71c6680068b2d61c31a2d6a00a254629b37a7ef9c7002531f9441aef8fd7ee4660d38bc8ba2f8909aeac31c06618cde36616b0014317124fa1cbec3b47349bf15d0ef6f4885b16cc8c10e66441463e18fd171399403ca795824b3d6fb5f515b1f84bf884c5eaf612c6d8b8dfa55604462e6b475807eb9429155b69af0d6b7eb2620bc631f9941ab7fa138134ead70350e1bfb8e2993e49dbadd24669fa83c6bc2f6a24b20e3e47cbc58d90709d6cd5e7bd57c76fbba7e7fdf738c98e693ce108a11bb984082b1601f6cfbfff08cde02ca5a30b928b7b0df7b64ad7fff8508484ea125b618e93cd03894b0a758201d5246995b9f644eb42b52a174b8e0ac3aa1ae6f6aa200e47d606f3ec9c27046a1543976f0c8473ac51cbe65e6ba0a804362b2fbc1d57468c8a111e7c5a79ce6391650cad680cfc25e3205c4c7beb705f77e2e5179f5cad3b5b5c7b1928251c444b60e9e4f3c1b25b0da712b8f8490202d6486202facd800e27c0510307c3487e6a8958ed32930a62a86191b1adca87ebf3e228029f32dc2f8fdbcc2f6f39a0f1566ce5b8007dd16275890f423afa5b902c33a88e71d101cefa4c385afe7dcbf08b19c2665e8ab33a070321bc917d78d0e14bb65b06c828ac6178df551c7b174834c6d6464f361443a267318ad09c4514f78b14d4f46e6286c38b4194879bd3e8be1c06e57d2c005f8b11b0e085582d49e0f20f46c481bf5f8df86db647d5ca45795034367e85e715bc8fe31b4362071481aa40c369fa40d9f457d211bf80d6850f2f216f137e03820b22902d14eea437985bdb227d99f1da97e3f996e0f337b413b1545c969d3f861e363e859260e89fef005cab316b6097bdf42e812bf399481c5227efb12e2cbc26b658bc32103063b3f7d29e1bb8afda4f67c290171cccb00fb0a7824e0205020f3cc03c20b28395a3b6e3134afd3f6aa628a290714d53c25931270d57d136803045072c4082769e6562dcd5bb2c190223c2d3954b9d0395d73de74ce4befd8cea908f99d6139c1b41eb44028ccfae5a8f80bfab4588ec8b5e7ff25a451b91c9403b36071e002f7d503ed298fdca32f9c3ce8713c818cc4da8494195eeab395d4c880bcd0a06a6976d4fc2dae8db66e5d74989096699662d1c4f539120106107f12248ca7fbe50e586abc12965c94e8448f0fa2c52f75e03582e9117a6590c1708464ec94389130d6d6053e0ad3b40dc6efdc074173614a7f108fa13207131dd638eae79d872c653e8d9b3cf1e3464cd4732f49c3548762095945962e06e45ed01043a8b5a8b1d3978ac70d3a56aca8260e232a9f178aecbe2be1441b377ec57f8330463854c845f83de87a6d2aaafb927580325197d545bc2c20da17dc71a313b3dc36c41f25172482520c6deb251db6bd82609861bcecb65c3aa488004ce4e1e6d506aa13f108a61aa07a233fcb1270b6e01c7533a0836fb9777a0abcffb8f9fba3c2ea5df8133eb86a2d0842e41d8f4085adbfac4333466aec9d6586be2fa1a8c099079a201f11810196903d7b817233f2af1a1e2e1a1a89407967009727117cb60e4fd738b6e9650e28da74e471a53906c1365507dada1845c71ad105846fe6158a75a37d7da012fa4e4468481f11d4fa7bcaa7e9d9c4538612c528a490b2f9b04783e46ae67e0a7e97b91fe13dd551dc17929e1a72a26a19ad9270bd550165e158f9a9aee8ef0e98ad3fec7e086a0cfabb14ed56602607ac4339de3018043b4dbd0862c5e530bdde6d8548a012d7e2e4afb6802a9ac15fd5a77784626c645b208879255717614a16ba60ba4ca343a1f404966ee86b6f724817b497e1091a15205454c06b8713ef5816ccb8754b540450fa493300bfddf6706a2283ecaf19ac5ec5d0855b4af2b8194c4205568c4512a507438402d857676cae66149678bc56a3e37ae3d054a5a1a0a9a47e81ffd00f168a4f12f71b13ca8381e574c8d00704a019882c3a8d6b1d718f85ce579ced04910cec28ee664f5c5a2e6eb7427f54d351005325e310ccb242438128500acb4bc52ba6933bfa816f134b74a99c24c85ac278c5e2d0f9bd3c5c24034a9c0356e3c2722328b0a468204678fc7cc69a59e4dc67431eb68711cda1cc72d5ed9506bb7cc24fbc698fea43edb4b205fef23d194762e1021349c8f6cc3bc44ee5e1780e14e4546ddb04246b31413d332ad19ba8bd2b1f6c357695cad13c00cbb60cb4e3405ceb989372c872281a8080f3368241fc4db14c03a17833f03219b4e31296066bc5001424afeea4003bca465278880c55d74e95b73d3ddca224373a564f47b88c6e50a582f7a873481cdd0305959c2f3271c4840ca35642d5d05110125621ef6beafa4076828efec21a7ac486ae2b1a968a49e9c5d51839394ac247d9872a4ae76ac2e9888bec01c6455eee8d8dccb88a36596b3118bd1d509e5245f64dd002e5ed0da53dfa0c3bbd1bc398537776e43d63780d8582be37681a2b71e84730f5bfeadf455c00bc8a076094c103c1de10a67ece63324eab38cfde4aa9b861b9ab0c688cf5b0f185325e8836b9c267f69ab1b042a9b31a4e38741833e38a1ee585d3d18088e78f3134128a06763689aa300397975a40f8791cec018401dc31df651285bbf12946dceb87d9bcbf090700f3ecd8a7fc9d47b8c553b3d00bad376ff7e5a0a3ba64b7b3c119c291182bf4279893c1548acf2c78f451b3addd7586c68c17ca492f4c54d06caf4c9164ce180c5be041397f8bed37de23300eb536b73ade474e47810206260bd26cc386edcf0073ed2cdafdc5295632cf2faace1304de4ed550f04665bfc53ef07d15f998c4e2907b656f6e3e4d91bcaa06b86c4e570584bb3b05886830063dc00f6d1676ca4b0af73f94ad075669925128beb32e5f8733bbc3fb8ed9c7732bc66f15a78ba583220f437c12746f02889d5659c5141bf87d0f11f40d6177a5b4f72f387a889ee0c8ff8699a0bfeff3483cb042ef45dbb00cead5d4a206fac3b703f87d6081509c180e51f56ef0ac03d0c66b21b49bb95404b866cab1eec3ad35044ee241d3864a8c059aa8d34e47370405f95933246a07a8eb093bd6db96c2f049f5901b27a757d18c2e1bdc41a385ff963a3435209dbf7d18e3064dd255262cc951e6b01f84304f975f414ea42ec1c4086641b9af09fca028cdcbe4b2625b27991b0f64043a6f0f603d87207e27b697c3896d09bcab284f88359d66b8bbe64258cc6962bfe51316ad50e19364c4775bcd70bd6e395fc1b3384ce901b888ac9cad09ae86e3d954a5e836b62c204a8306a48340bdc3b601d6e08724378994d2d3b8e718f2aa20513bf932c1d48c8ac11d12868804252e6948b81d4d47ae622273183a0b1d611e93ab5cdd8a76853b8311268e8991a17d7c97928d68b184156061c4e42b32213e60b6374a5f85a27c318b194c23c7cc1bf8ccfcc7342fb32651d8c37c17ab64190f82e2ee98c84faa70fb4289ae03acc2461219f1374cd01abec86eecd8a65600ad029592ecd8094a9f1b3651cd8e2bbe8ee94923e005820893432627f58f9afc9ba356837fec497799014d44124c23a41735d43619f8298db6a9dde5c8aacf3ed5a5671f0d9998106f48561a8468379a21ee9dc0c3eb810314db0241144672e2bdf3529cae83f525eb1aa280bfa6906507cc0bb08b1a1a740c29ca4b01c4cc046e6cbef02689bdeccc5224a813cdc13fb2b231964b59f70e9154db0dda54b70ccaa894082d96046105b2f0dd60dc25392a9ed51721a9bf29dfb77dd649e5f3862ffb79696afa0074d59ca94e47bde939553f8b2ccbb35bd859a2473925f5049b1034ae518c68f6472d2125a907d12fe144a810352c6f313c928a24569f884656d68b9049f571fc81f702bf2c6136674dc5823421a859bb6134712067a058c04ec39f650c0374d123ea03a3733d413feb89b8721d4d2b910687f80097f8e88d17a27593d42b4fc47dcae8e63ac1a76e532862273d1499d94a2ec9d9ee5ecd7364d9b85a93964485bc0a14a64ac6c06f646417e4f6a1d7fd88d49bcec31fe6924730bb99b041b3c943f8f3ac21f316e7ead56c5a94bf24875acb80aa6b279e76f1bf0924b7255b7ee7536aa85ca9dc996c8c037eb5ecf93a77c3251372de1f67919a7430de911de228778b795f8667de7960ece20d25ddf2a6f89b813454877cf6875d84f693d0f3dea5cba38f602d4bcaf96345e4f332ce8f4e2c94ccdf819256c149fe41d3d4959a41dc77c0b804d2fc5fa33c0775798768ecf9d37096fd134fd4c5f2426bd54abbab704f75f3dd9f1690784d0edbc9271d60e4ac291ba815d7b038b49d1f4aadf1430070c9eb5d7e83bc8aa516dfca8bc5234766f3368405141f4415318010972ed8235acbd8a1a16d4dcd0c26752d51745aa082f0ced1ad8b5f8a7e43d03b1169e91337bb3896b81ea207b2f67dcd990f2392af7401a83fac0d5e1ea478f9ec73232cdc3c5ef49492def2df2c1fbb0958ea78647436851d84420217ee5e2917b65d4cbeb399a220088a2a13d071c66f040cbe10391b776d6e192335bcc5b64c962171847b4178cbc7f8e73e3d08bf1e906e33a997249299890d97ae76753d2229a7c0757b09a07c8390e3b1045b0ca09aad57c32d757f18ee4d027203f4989b1fe65800bedc2d69dbe097131978c246f686a202e4f1c8f2d00076cd3bb0ff0d7352defd500d098fec102ac9b05135a009f35daab44a92f8ac435b635c179d0544cb306a171206d5ccede16b3ed6ab508524472e584933ca05e2cd80943bd72f49bf4f473bce0a1b76f08bf109102121514ddfe097cb1b7a2b3644f93d934f7276d48d34c2da9e930250455b735eb023b44ebb1b0501547dec03a65ef0b0c983a154fe17df02f0b76a24b0bb6a423d428502d48904daa25bba5b3052326e0e66b110ce6b490a4117847036c80c294a185a7abf5c6bc3b2331afbc55aab0ae15a6e6362dbb604ed632a81c51242300cc01cc2380456b7eefc0af55b0eb3edf68f0dfb90bf890f0db542f41ffbb6bbb67b4b29534a327d0ba20b950bde5ff97957a5e841f6047687ddadab4f304f2cc61c77fac4403db675c24a29c32af1c1507d90a014caa535a04fe6487b2885551f263a2a85be1c45554e91983a3c6392c2489ac4eddaa4c7daead28c75ea10f3a6bf796e2d629ab88bdb855ef51fc0d025eb3781f973bbd5aa24f9b6bdfb6804f3d34b648f1b04e7761eab0e31270b24023412c547ccc3bc91d1bfbc919887f125a09128db1b79f9d11b81f9987fd9d17d11a0ff91eb3f80e0ff78f9d1ff80f998c7d12f3f7a1f2f3ffa4df401f331b23e799d7f17138ebadb9f76ef3f80f492757b0f49be389dc83ebc42cb9c7d585106f2921880cd075bd2e9c33cb11773ece719037111805887aff04d63e12070a93f183ad734c13c8cd83d0ea4ea55ab57a47b039c4f5c81725dbefbcebd17d7cc4162ce259cbcbc8fa3bc641ffaa4c8837a6c77c21ce9d64838619ee6f4a03ef59339f6770db8a4f2ee7114a798c0a15e3a55f56a2389bedf88d6b3b1361509de8de472506b693c97c4b93fcf229eeb5fda192d91807666cbcaaa302f1101d292456ea02792a3436916449ff6964f7bcba7bdd5def2c16161b4e5bb2d6db9c4f6d8f72140970f3d6957b098eb65797a1c2de941d26a823cc63c7f3743951d80eeacb24349803babec90c4b52e47d1d24b3e8e8a294b97b53214e894070d82d38542bbc3da71fbfe343cb8e7e7795dded5ab104f8fed5adcb5c55fb60cd84e4c53326a4b7e00453f5e1ee6c7e86344aba47b97e77f097fb55a8964109cdb7d683581ee5dbe8bf1be903c72bf4fe1c5087048bd64088ed8ef6854e14275ed530ff5aa5b3f802e5708f5be8634ef8534dbf3f5bee3421a2b5e00fc0b3c6b4ffd0aa121cf83e05c9729d745b44a42a1ddb13b600d89d42e18806455d1729a904c1425915e5e68298201e65fde078c38bdf4227eef0347bb10207df5e8b5bdf6e7a3e14b0b7c192e3fbb68cb21f5da992de98c02d1a0eefedf69d4ec982bf1f125cee425a42bda9a26175d7997a4ae1c34308cfee57d8cfe45f4f1f230e2aa572f30bda4c754af1c5559302c98b0aabecaf296c35aa6ea135955b7f2b4ac65287833de9a266fa1e0e144c1f32713557dbce5289b85db52768d70fb693e1744d3a48536ba6d9b15e9f7fdfc727c626df5d895d563654d809969588eb2aecaea9e14b58ac598a70e7d8ab273a8729d0a2e759ffc8929135dd2bafc07af17efa5cbe8b265def2126c9a62d3d40f9b3953b80fbc9d1e558eb23cb8e0368f65d515dcfef073417459b4ab697ad2ae00e0b12dbdebbe7b92c48367e0cd5f9897be8e79a9f8d202ff764f0ea97713497e1bf8d2f7fec875fb6c7fe3a1aa1780245591f4d5e22ee9b1eb3bcc6cad5df154d5aa0520597daa0f96b83387facca6c8e2d227aa0fe753af78b353e719bb64affe57ddafd869f33227dca2ecb11fe627d8a75ef516f3547398659faaaa47187109dff8cfedefc2af029d7a79b7a5979068aad0064d93860397faedccb59510574381e50fff761ef6e5155c24aa3ed955e7304f96533ed832567db264ccf18bb009949ca009a91b444d5ea928343ce835c00a52a45d414332a7a6c36dca5a5d2674c53b3daa54ac8479d887b2e88af6545b6a2a1ef47a10208e6e99a3280fb3d4ef023ac48c3e91916e7f94ae08e0bd843315000efbd2d6cc9997aefc07902f495db75f856fc7fcb99d38e4a3a1b114e9b1bf23625dd6d5a779fb92d6d52b47d92c66a93f4b8f058365c968d992ddb7a74e374a5794ae6e1cc0009ffdee005e0a2f46804170eef7a1df1e01ef505c2d2040d2967709f8f230bf6d204822c188bf3d39929d1804e7d2df66f87678dfe3fad3c0f0f2307f819787112f30fae9250e8273ed739579bf85d5c705e008015f0eef11f0d1c0f0f2a3bf00ccc7bc1742a0470f071b0124bd25811efbab4ff5a957bce59db75c4acc48e671f4c8a18433e52d47551f99ead3aa3ef6c8131c7e984901a20b27aea85004e100888b2c53a400267c09bde52d87e2b22f47c17c3fa594be2cc0a93b7597d2b36280fff489bf651b5042162d7e80384211745043126210c60fb25cc901935edd559fdc59c8f118a45da7e3cd2fc776372aa567354da72fc7269232dcefe9938b1b684b2fd56b7becaa07f4253db62ddf13bf136df99f48922e694b232069cb99d333735ab81d22ddd04ffa350979d8b84e60defec088def2d6ad9f5859de02906c99ccb70d043b5113c256cb90caa72f07b5abb63d0bf0fc07b05eb2573b642e7d8ef5e83f807dc94e000ecd8e7af9eb659101f5926e4bb7408e9a63aca007af1828b1011251a6106e40842dbcc801119ca0223595d085104998d00209252c48f5db99a38eeca8c0065baa70e24a100fa9e6984c86b2a1cba22d59009274654b5bdad296568b87f6a7c796bdc86c2993bdfab45aad56abb9711d904bf393157453057263ab791f4c4c7db6ee35dca0bafc6c391422ba43b66b3914326423d17842ec0ba9df00ee49162e93282af45c4361ff74899d703b51ec73e24e1230c53df749c054e8fb1ba84ffc2e5a75dd11fe90f79f58c4c8f7a2f7be8891284642df35ced8a2e1ff7ea63a14fa1fde7fde874423a2ffdefb22458c84befb283e44ff79e18d1bb7f97d7c342cc21012fd6c1897fa77e8ef24d952fe49c054cdc75c2fd9ed1d1e9c54cd27015336328fa3bb8c1e9dc795f84e8fcd4e809ce2be74d9e8498fb98f93fe8a79d2619ccbd692dd7e2fbbe5b2a2ab3ac897f4d8dee337fc3c8e2685beb25e187a2efc7eb309676aa6fa49bf3a06ad44d7600a5867b7a609072f21cd83610a1f13a2f03021e95d421a3f0a679e3f7e1a3a11bd874e6c421e30d5bd4c68024ec97c4db8c303a6443fbf1ae8338d0d69ace84d01c986390f5ce83d70a93fc40a201d88dbcfbe6a02ec6c78299c99431f0177be01a64ef59597da7f00c23a55f41dbe8981511a107dc70b203ff88a4bfd2f33875f035ceeb00e679937fd2c042ef5cf58364d582c013213306e09d86ab9a5ee19017da5c5668ece6d89bebf638efa9e7e34307cdffd0fd17bcf6177197c1cdd556918b8e56039ea880f65b08ce0c94110403049f57bcb51164862c4195b28a1491344a4fa7de53da2908645a2ff11fa4e34f27de845df87de88a8634f7424f5f9e0fe7bfe2ff422b1c8f7a12f229a5f074d53bf7719aa00f4eee5559f42b350c8751e772bc77134fcf3fae0bea309674aabc04ceda0f0a44f219ca9ce43a6214d8f5068269c291472f4d831c11195cb8f5e269c29a6095f3e85107c14c2982785304f2374f99970f43221a75e1e0cfdf7610f8f35bdf40213e3f331d9b01898566f2b6817830c23c7b95bcb510e7978141f7c7046789d845451fc6f702c5e2c517d3c7a3c0dbf407f7e1afb47ae7da147ef5139f62a90390302646e6119279bc964fef295af9c8504849c7d974f07877c3517f9db56cb35a2c13dbc62251308c86834a241495f7910a7ea2d665204f3e0ab99ea21d173ffe3fb906824f4df73a291283e42224d0f8e1369e8773f53df1be1c4d07bff83fb8e7b8f7b23de877ea6443f53a1f778afdb1f72d84c799cafdad5ad1e6f00c9868526751edc053e843ff115af7809f7f8ca57be7226bec4572c8565a556fd934820e8b2e6e955f7348ba6060d0d4d0dda36e20ae50f16517bf1cb515ffc74f49d1e0077adce58e6445841ab55d8ef6f2af3b47d7feb609ea87bcc251b6679a3febe036e14cb34f56ba1973dfef428a32a20f699cf7ce633a02b332b6595db5336854bdc3b27dab05d2b36941ee994db0ebbed2f97e23dbe2a7960fdd297c3bff4e9e8be1d0b5eb77c00e72d4b5bb08c75e6bc19c26423cc93ffe755bcb8bdc46d268067dd450d731463314bfd5964f1b90cc6ed97e90092bef2974f71588f3299ec87c3d263c33898ac618ea54f6497b7ad5c72ce4a4771dfdfb37e2ee4159099956d9339a2b506cee051b9a418a75393ca6d1c73ec29bafd308cdab8d4df350be0e63d80f309205e37ee1340b86e3f04fac4a899b25fbbaa3d8e4e69a9f971e0a78b207cd0424b0c927ce007559cb0832766449105095440d9810833c400ba22d53d204122060e2f30820e56544d229429fefa3e8a14002865bf8ad34b5480f0b92ff4890a1001316780345ee6c90ad3c10ff334be0a70aae669f0909981f4323f2f4502d6980e20497bf87ecf1f9a392edef6fca2996343cf0fce1ceef95f664e275215e5e101e9ec01e5e913156778f91edd99d193357726e64915ee8c480609725f9e9fe4fbf2f3cb3112c91a9b1a363e14011023922aacf04272ccbf847cbf3e875c83e8bf7779efb5dfde7ee8b9ef9ec398903c725fc279eb57610da32a47d113f4f489240ae11fb25d26ac4343ac55f8a6bf4a51755063758a4a45ad629aacd41d541e84b507a1ad115659599f983754fee583c153b024a08e796be0335cd5a74797cb3ae01e970b8c611d5c1dcc9c9e3e51a62c2480be18561b354f562c364fd61f2dd46543a4b12ef5778c5b5daa8941611d1adfcf3398392188f9d1cbfccc934c03919170f9caadefbb273909d1734fb214f0434fb20d5ede3e290a01cc6f4ff20d280fd80aebd010a914be1169770a29ffcb71437746218429eead50f4572a33a706af4a7d9728ba2ac5cca941f4fd550733a7063066ff658aed6160a38ff9fefac4cca9210447ee8c486f304dfd3222cd629a42aa444861429a659afa5f423a0b2912a6898b693ac234f5bb84f4679afabd906e41b5c8c1edb74edcfe100eee34754ddcfe4a52175de2c3290ef3972b565d2eeaaa0670ad200047f98b69bbea0f424c70c5c2a14bfaabc2b6129c8950f8a68aac040f78062dc55de19b407d5fe1a380f7d0eca8ef5f456e5d0efdaef051d1655d06a0bbb9b5ea3146633762a7eaa23ca05850a0e997da95e5b12a9e895cbf73174912504dd80dc09b61318392753ccbbc71217841c44c07e770b1afabe6a5024c4d00d21775d11d90a4402f2ff5b7abace1d96cd623cf4a12494915bbb4d2e5958d0026afba984c5f0e27364fc1983a366c62cc1c1b4897fecca1355f691930a62ffab8e6bbf41c40a72f7a27361cab301c40ee1a91c6bfe6bfa5f4e97b1a176960a8f136de47cdbf48e37f2455432c12c5478daf118b44219dd4fc0ffec20654a852466e1055355f23de10be119caff145a2f8f8af2116a9f9178bd478177b905c15e4fef55d7425ee3c8c049c3ea118c5ffdfc6932fc44ff18555e36bbe564102d698cb7f4f55207defc90a631d2cdd5558878a343b44d23ee77d7fb5d2271a1ea2a74fc519bc17fdbcdb9f5cfae4f2354fda026ab9fd63796ed3b0d6ee738186df874297af5d886eb40675f91a2e9b8be84b7066dac6b70d1b366ac4eae3259b1cdfe7425f2a56d81920bfd715c081e09b7e2bba107c5300ee860727d674962ebbecb2cb2e3f183a55235618e59c0c598f7cc333d6f10384f3f695976b9a0ce051201a1e3cc3bc331bfeea52bf55dd1a846353612f33407ff5690aeb38c1a823a9fe2efbc436fec8255d0a1b07bacda47b9e00da780eba146816dff4a8f1387a879f71c6e5278f601d92af7f3a4462add22309c0ff9ae7afc7ce7fcd1bd1b9fd55b69533679301017989d68435c663d8bc8d275d060bdd9ab7f9186ade46a4a17f2435bd1483cddb1069a8782405a6687ed8781ba2112f037427803315856607fdfa54ec25343ce80c572406141f556aa6c02af60a09e8ed6822f8e608be4180e75f80dd2529108bdd846f7ae6a81adf35364d604c54bd71c3000628952ec9b390e4190a285c926733183a5543acb026d42b17d62319dcaa53c87c50b10082b9ca96d5bc8dcbd52e9b1aa725f561e54311d7653d569673e1587ebc080cc43397f96f0e5294cb0dcf839c092e172858a7c696f4e9084f9fe8bc3648405a469f9a1f35bb4e04c1f4b9343bfce953f1c89db7f3ea558aab6b30732a14d394c444552ab3d44f22c55cb2c25c5de7425f172b8c6fc600c90a8b317ddd56c2597856965d76b9ea13495d77492cc63aeea81a9befe7994d8d0fe0f27739ac245c49247179469bdc0672d9025a507afc02f4af7a47a7c0fcb504708ec104146051460ec6c0024b6a852f8c20a3074da820085470223944e4568f2e86b205a4dff130c0a561cc05018ea6a18b0176ec31e855ac8815e6618064050324b95557a553a7e555d227b2ae9ceafc35029215c63addedaf55fa143473a614b7df81409202b9e7d59807f169e2fa6bf218ac85bf9079a9652ef3ae414371cb764dd316ef8150b864bb825a3d7659c3d327925bb7d5272fcbb22c19e0d44569153446ab68578fdd276eb5132d856fa894769e1e95f4accbcd85c534b910bad0a205d9346d9a4fa9d573d15f3dc25cd2651c035af01c46df4558fd29611d6d5de2e7428fc339dcbe0bed8741625814838cae7df1e381001758e1e25a0a530248dda97bc7e0c6b3cec2797a5412faaac75a6bada9555623abb2d251e17f8d2e6dbaace9f2bb0cc5d9a504e03c0ba38d6dab018236e2ac055a6b1195558ba849dcbaea13adae399a41b7f0cd123a8637b9cee32a2047d57c3f8d39aa4664f049106cc57c89697226d8a980c2019f0baf2fc09adbe1f018f4c7f1e5e0a72fea6a2480f4d527579fa4d0b88c6ffa6dae0d47cd2a39904245cc074c989224652223490f5948d1840c9ed0f00111ba600115547ed8414a043e32e019e20726588d91ea77d9ec5461d54aa5b4ee347f399c0921739a6a394d15c65c2bd754e9b15d35edaab076f1ace461758f38f3194ccc4866860609851442dcc827856e219a307fee06660e0781810e4a20317c10a30b025cb1c41433a4f0a26709d7ab6dc539b1ab06e7c4a800d4b86ee0689cc46dd709c7db58c53c35ac336be64e8f1350310fab36307f36e07502fc74033d3610ead9ba894412dff47b89510198bcc33cace21980243761014b124cf86005115ff420f5c29432b818220b292d50e27a3569d406bad45a48ac2303dfd0100046d930494cdc0619a616b79902fc40dec5201b880292f3e7e2c4d027b286d6903b574b9f75acc894ffda4083b38a7536bee96796dbc0283e625371977ddcc061267c04bf60deb00a60a0649a520005ec4bb2921c2e03909570a3580abb62009238ec72b18ba7682c855d8e62251a2b61172b51721b67ac8157fba41a7e8575ac38e29bea57fc0abf5283b479a2dbf94c55ebb4614458878a23be69291855834b3eaac1283f824bce924d71840f16f386a91842a7a61388f0d8a896824b0df39813905e92633f31d8344d019b748bf504dce9133983aedd618a2eb2b87ff989cc1cfafd2398a85679f374afba052b7e598f2a47358ba5a271695cb2ebb39874036ecdb658d189a6a5472fb5b2141dcb9572bc72fbc7d2443912a3bbc6711347304bfddc0c621e88c066101122bca31171d4a8058d3070c43ace846f8e609473c1a57626d563d0d66a6dad12c01939689ab238eb3019f386bb60270871fb29cf668eea2a57accc9a00498ed5c0b79f68d83481a4bbb68de4264ec07a499ebd5ca6e17729ab1e568e80fe72f5c831d564009289e2294812c7541c53dd7e8e396a13fb8959eae766896c2c620d1b478d88164464f6e8538f3df6e8a37decb1472b971c6f939e745305b2eb445af24dd72070a9e650556c9d613d76155ab24ecbf8a6068151968bde4477b35cb04e0f316fba0821348b8769f27a56aba54fde6ddba63df51e8777a17be2907abd891f01fa6bfff3d3340eeb75bba461fee58bc0bcc08851e8dfa09920f52246f17ed52b47b56c8a4446407a5fde4bfeed496f010585f54a8fdf7721bba3eaec0e8bc140947af5a9aa4aabe5a9aa1ebd0e8916edf1527f8bb25095e912482c716b0b762b0d9cbcbc3fa5b445b9d5c34bfd3178a949f6a9bd82f11f9f79e979c92e175d59242c5f6fe688aeaf28f59e3e8973bdc7d13ce616a1bb955bafbc577ebbf9bdb440774f64990c4280e42c6fafa80b0633a757d384c544350fb3d42f2f9c4769af5ac6cb2d4a6a5dde42fcc025a7eccebe6ddce325ff262c56bd2e3294564bb5c32cc565577665974c7955956a87abc2892c5790614418404885c270c202278ab0c31448e0595aba635794a7b7cdbb19f81f05dae7b76f87d4cbef7d67044955b7779cb20f57569d81d726f5084ec19f64317bcb028261c9f026e0f7def3ec7eda15eb746255f1cd5655d6e5fe7aa2848b757c897913032ef57b1338d4f02076a7e50a2e874c3945e9b42207555890bae17b35917ab17553b5349e164e6dd20aa0dd5d764f9f6ca0a072c65758334774bb3e75d6addbd1c2f87bcfdefb7b3e015b3943fa92eab05f7f0b857c3f64bb334fb64ae647ff83f433a397f91fa397118bcc3c4946bce1f565c299228933d8af5fb70f7d902353ae2583689d02bcf9dd28ec94138874597f446d97cd8515fb0aacb960544b71a5556cbf3e6184d775c09d4f14618cf12a80734981626bb5b576cccf34e45c3d7c3816ab874bfddbb66d20e85e905bc9b55c7d22b5a00be51909d8ef5d9433678999139b3958668e9d62ea702abe616223c2d4e1a2b0d2284e4a973491636d2f8eb5bd5cd0ae15b92a1c8b1b82734d1387044704a7b24f6a4145f404b1c1609eb8d7d613a5c73fee3b97e99283e684793a639ea8161473492da86a41bcd1da2a8ee55242774199a655adb4528d56f7e9d39599638148245ba5b7682167509333a8e79519348366900c08be6c2fb055333232346cb8fbbfb440ed53f02cd7fa42ae09e7e28c9837e0e59c4c533f27c6d0a3c71dacaa556fc346c8a954cc6a61f9d1520a7d39442d882fa90569417d12c22f64c8763b8b79d33f84747b8b69d2ca685477a9427f39f83b5fb2953430ccfce87fccfc482c12c5c7e8657e7ae907e965c422a430a2d8c192d44824859cd0a28bd44c45d962a919166fdcc0c1518dfddd7da2b3caf5d744986701fdc9edb54de98f878deba293d16b8b396ace402b36962b3d220124b7f24ab338d2ab67db06e08d59801ec31d5598260f838c97869f56db3bfd43c36297b3e651f5b803a7e272e04ea0e27ce0217a001e83f607f0e5a83f0002d8ea6509547af5de7a0cb02da02776c5078beca7bc33ab64c553eb8dc742690bf0a9541c4bdb324d2cae499ff865e8f105bea1f2f22672f0f22555e860327d39ea9b0a50dd45fedc10b3d4ff048915b704c7e29926252b8ec5b1381607c5ab875c138ec55241e9539f4ea4b645db3273bcdaefb7cc0a7239cc05f682675bb92d6180ed354df592db2b0109d8963002664184d633736614b7df71608e0404d883a360ebe276184da8ac954137261babc7b900c90eda545ad0ed9f4e91c680e20543a4c856bd0a33c7bfaafe1b2f87fc9575048ed5a3571f575bb909119e391e141454bfb7ad9c49ae8a4bfd323ffa22cc2313ce94d33b22e2cfdc4e8fbd4de991f9e9f6da60bcbd186667d00c22324bf6d5e394ed554ffea22f47fdb657a3f82f8b1c0fa7721c801b6c7b71aa6d4a9fa6847c0aa8dd49058a206ebd330a15f45c242d1d5c978757c9b138ae19e055f7eaae008fc1d02be0cbc1bd0216e0ddf884bcfc90ed82e596c5447516dc0d9927cdbc1199273dc9a97a013e482ff346667ef446482ff324a7ca41e3ef63f433ef43e6493f3f1a176118fdccff18fd0c0a6291283e667ec83c49a4e19f291a621112184478a12535236e3040c206a9998a328e577b2d0b308bfa5eabbb8eeefdbff7d7f1bdbbbbfff6472e8ef69ebdffc2c621e6fb7b079898d009e689837918916428db944d26dc625ef2d24bc810f06e3998a6fe0d07f3667b85dbeb0774113b2636ac474e1576288f439c8ac7439c7b751fdba34fce42494775afee3abceb41c0f33e1e36eef7ad2a556557ed19edd990ea087d7dfe7684be8adfa346b363fbfa3ab6afa20ad3a4fd913bbf5a5fc7bc55540519b9fe525f8e4f74327a2e7422f33262975e6eaff2e525e901dddddb6b836d3192ff809e18438f1e7d0b90dc7a3895a3b6924bfd562cc592c56e87e759805bd973372fca6d8b0d09f354cb4d0c1e622bddd62c1b182d32b69eb20973b595d96b04e616324c14cf5c0bf0e5df464c9d17f8a6bf594d668e3675fa0adfcc9cfafd8d03a3b61c9bc3aff261eb2460b93a9d289ef11732b00e1587f04dbf16e4a52f18a599314bae6dadb65666a222328475b42d5a90a3b61ed7cc60d4260497fa9dc18eb3da16217ab42dda964d089edd1e31c6b8fd9e05a85dd515d6e9c1375c30aa9370c95f601d37c1ec2d7de5925dbaa05d4df49d69eac13a0dc6bc49b25d2d44903ec9a95e1b95b9bdeaf76f4d6c3998276ef3811233c4eb36379d5da4712a47359259eae754cd35a7ba2a6ef5d8a447d6347577f36d2dfdd363ab462a56a9aa30c7e2588e9add1cab395673ace6581c0e8c8bc1488e1552c1344389d2d515030149b94d5d559042b76edadbf7975756122e968b679496585c06561f56b65361641df7c175803b7f008ca22e1fbabaa5c720bea14d601c744e45bc1ae5af245c350cbea15b82baa472ddeef32a8db9587cc32d9e81abd6ca7229c128aa4459595489520bb0b29470d5baa24df8a6fec0a84a9bd0aa9a26308e08bab409eb5424f38686517338624473a0aafa435d510a344d14688645055659d5e5251a2c2a30567535a1b12ebde4aa9e79a99f73146c40b12e5540ee4882aaab71e05293314797af2890a3a081ec6590c43a347e307344395f05c2ccf1668e76c5ccd92a1655083367083962bea3f1328eaaa9f1d54b2f3996ebb20ac356e88fa700f3647d5af64867f5672fdfdb562b6c965ebe7ef712d219fd29fda74f33fa42cba6b3bf2eb20f4cc8311f7c0ae87227155818d7de19859230fc5b304b07f261a2284f1075e528da64967ab3e2d62aec22ff26334788e88d983942be23668e1017ea64e608f11ee68568f4c9cc11b2fde8fb690c668e10fb33df4f65307384841e85efa750668e10ee53f87e1a65e608e99ee6fb3b4efbf83b6e02a0724f112c8eb112e258b9a708560eb77a2c82613d961e63c2f1cc4b9cf7b0cd14cf5af5aa2df7712b5a8769524d13ebc08a9dfb7254a3804b8d648efd65cfab07560d7c86d7d3a3e6ea523f7d59e9b19fae401aebd1c7451ba8630e7dc7d9af1f815ac519f8ad48c3d96db3eea1ce698b7bda03187a9a10bcb07df72f7c088888c0c6ed44927f1369eacfdb69bf85a190ce71aba1c8d52850f334566356a45068931e7900a9ab890ac0ae56eea90eac1a0b32a23d3d5256cfa54c78cc1e5c66922a719bd62a8da24ab013b7690f65ad564b58874aa1f404b3d43cf404935907d3d42edfbcaebcd433871d0b97b9cc69a594faca7b9cb5528119c6d4f572980e9ab56ba300f938dae66bbe04a08be344ba025dfda265f79d0018e656b88fbf7a749f3ed1955b314fd40797c2a77015778206416d441a8493db4f9bccb19fc65cb127d3c4316082ca6ad092b924b7aa37bf1d1d4d7df18fa46c429afa357f24d5bdd808d5781bafbdf75ba52b0069ea03e0e7bfcdff081f00a2111b1fbe8d68248a0f1b1fbe911aff3f53b6c6ffc760e3c39fdf04b8afefc3e66b5e0b61b0d9441f352f8a456c7ccd17a9f136343cea6fbf8933705f7f8644c2e9a528f569b6b7f14752349b28c4478db7211601528199a281879c413f53e193cc53438cc2fd4cfd937356239c291b62c7c2b05f5ebf1e35be5d8eaa21da1d9dbf63e1c1ef2255027a29a38fc36dc299aaf16cc299226976d0e7a74fcb9a70a6c04bcb4a55000ab197a74ffc8caa112990971a65431b8a1ab15220206e7ab3e45f0334f24a5737852c723b292e97571627d21480366f23728c7b8570ea743500a86f43bd4604431b361bc05bdf26ac624be93baf7397ce4a23313c739b07bf76d5bccd9700c8653366a7ceff4b98d8d404a0bb3df2e9c41a54615e72d1b0fb5abb2a80134da2c26815b79fc6e6d85f2376297381425a308abbfc76d0ece8ea7722cd8eeeb9e74492fb4e64d9914bdf431a3217ecec87e6187a0f77c870c90c5cb7a2939ad0d73448a42900499651205a06b7e8961e1bc85f639754a8c800d63f5dd8483050b747e3762209409bafb1e97276d0ac99a2b8c3732365f349b6d4ce4e129c948dff0fc5245bcae6c92ec90a3b820d86f0c5113ce068319ca9309c29f690747f6cc2af3eb8fd36aeb8fd352a106e7f0703550252b1673d963dee00764f763901b2fbea332b450108a3a263e9b1fbe4a2939aa7405deaa7406510adb4e451d1fb0b2eb8d4619ffaa756b9fd5d571376ca43e62c401cc68c693aea610aee3f7be4f955588d735fbd72d50760646328401609d0d5d45885d53c3b2a8525ac70410bc6e881072aa919c60cca1d902044154b6ce9998b6ffaeb4f85d5272aac2c4b2dfdd36539eb138cbf0002c017a068e4d1b03e314d504c139569aa52a3a8524c53ff4c585188ddfe14a6b8958adb3f3281cd9ba0fa3c4d386f0ae1bc28dc51386fcc57035fff38da5100d200a4c730881140ea277e11522fbfd7237dd61dd2f7f3f9ae344a04d2a314d09db1b84f0d8acb749790851c1f9fcf8775be20f6bef021324d403c304d23f0bef0668e22e7ec4b0274b695728b75aaf805d12f885b4590f5003aa55dbdd6ca20a5946ed66ed66a4d341e4d157a4145f88258c72363de38caebe26bc2ed1779b369ca5203d0436fe53eee43f2791f1ff6c1623717bec23e2e3e9a943e91deea6aad3e41e993ab4ffe9a4ae5adaa11506b3273f83573c41b377ca0a4512211932ef5bb965c1193295a6836602144b9fd03cd88dbdfe978a0bbdb5a6dad3a1e8394325931e1664c56170b30744986c2e4b6c8c5805a39c602a471c15e16f9ca85b92443619f2a20e9cd180990bca1f5895b6880037050ef562f65bd07681e043e091cb95d277e287a896e3060e6f868619e2c20f658ad40d29b79334f4ba32c962ef557d1ca56000aa13d1cc557bac4585c9e7d1ce5227289a4cc1c4fcb34d9609ebc24ccb1bf8a446fe6f2172de9d326aefa64454f8b37eb910620c93e325ec096a3b5a7631950a9d702ad5e03dc7a0ef82470a4c3f11cf215b11ab593644c45a99f039f918aa2e57c2e702256a3a26cdf2f6262cbc0d1d67e4abe906f0b2db4f0d5dfc23ebccd1c8d7df0fd6c051be1f63311a64e65a0ffbeefbfcefbbeeebdefebbe133f253d7a40dde702507f3978dab07114e096db3fb341d3e46979212da4bdff747859a6a9df132d16d354039f719db8bc3773948bc8db0682246fe6cd40927d58674bd7bdd73df8e5e8ec1042fd168ba933e74d4814c2328ba54fdcf667e668ff9c4882a4cbb547983af51bc83405a161888b08e68da6d2549a4a53c2d545db51b968aa93d3ee9ef928827dcd344842375520993dc4711caf9c59641e7e07997b2ad578a6666aa6481b22b8d1d13b225e0ae2e1619a7abad4dc038fac1f6ebf0301e40f99871cfca2a66995528d52ca57500e02bf6e933cc5b99475a95ddfbc81086371a1eed41d76a3d334bae93003b6853acc78752e285064503e1d66b8a8c8f115fcea13d3e7de4b1df89729d5a856352ac30680a0be4bec1636def8588fa11a528f5c6343eaac11b98106bee967d80d8c622934b1a5a06186d10101e42ec93247f16a25e395cc0597cb2b2852a4f0ab47660e7d3acc90d2e3bc52a4c09c5f3acc80f915d0a7b8a8c30c1877faf83bf6dc0ab0be0a304d0a14d6f8759801a54f0c654a4b6914afbad42e3b852dcc863acc78b9a0d84f8719505a3dceeba22cea30034a8ff3f2f4785d0790c46166666619f35ce6e993fb78b44bcc405adbc8a09b2a90da488b8989d162626246b5d65a24e62bedbaefaacc0c5763626266b81a131323a359ab590b96336699b05334424e714e461f13cec4c88822cff31c66cc039181c5c0642ac93e4ecce3e84dd3364d8b7112f323999066241619bd8ce87f24e522ba60676de86d88768fa3ada68920df3808e3c1e83c60540140eac5849df24f87e85adba34301d8058c8220e60fac57adadd636f357814e01f9626ab56ab55a6b2d7566eb07183d295e068c9e248597674b8d7ef4a4cde8452b521d258df6337f24152313f27db94d76cffd26aa7b66a9ff138944af853e4635f411132333e3458fe732532ea290ec20602105c99870a64694d6eadeb675b4f3686262b45ab55a3d09a0fdce3dd076959953a398a8eee91ddc7672458759ea9e7602c44b2dba3161a7fa0b70147dec19354ddb346dd3b45aab1ddddd2da9d6aa6d5a1db9a3e155d1e3680ed41ee6cb217a8d0bfb7633de4c38123d8e9609394523a4f131e18ecccf7c9646582466fb1e32802ea06a9a9030195301fd32e10bcc775d0a1e7fdf736837191a3396c60c0d1a4fa241e367421ad20c8d297daacf7196e32cf71d450a5eb77e0772efd1fb7d396a4fe9911c7b68e83b1462349890e4332e3f21156a1c5af334ae52e65aab68b28ecbfc7cd0a2301b10f39f8a79d2e6ce98276ddc9edfc3eef08ccbef2196e14cc5f4b5d65a6ba7b07a381513f26ca9989890555ee299a646018f2af0e1907598a69669618924b194cc1f497532e1e8252f35cd8c38f2d3f0a390c6c7cc8f7e46c4a1611661e854ccc78834c0fcc9f1365b666b7f7e40700febb4ea36cb6ad03e3168222eab47ab55abd55afbdf97c38aaab63d830c64269a595614fe4f14c5b9f1ccd24c59b19aa579c94dc7a21ae672806b4311dff47b6096fac1200388f7788ff7dc9e5ab5da3c3af6fb5b499f9cff37201cd277369e77352c6703f64906eaddec6c78f3d3718475b7ed39fc5e0b45b09903def0cb415f268c4902b81989098bc488beaff4497b2a3ed647ccccc7fc91d428a491118bc8fce88fa4445f3813f2ccd3103926d2d8e7d9cb84343e68bcccd310d947a4b13f233250909768ac0843a7645e46e4f20b906cd89cc1bc00cb9e50ef00043273ac112ec936bc184d08b32e7f57c3491683ccf27ac39e682878f491e207241b0604198442df01c9be02e4de79f02b404e24493018ccdad79e6c2b568b791cad855d0548c788b34b40464791bac43f8e3837a648f379e90a0c61bdd2c9200e08f4c4419b72085040021b6b868119abfa1360a496719c357a279a533483f9dd1776aa8a18f357a9ed18eb585102e00cb5d23109b08a814e41b791cc1b0e2307ea31d0ccd9c265804f801107023df689027394406facc7f94ad6067b61a06db6cd806c300e010a48a0c77e90964d011c2fd977b14a977d1adb72190306e6d8e29b7e1cc7004f0c78ec1ee2135d0c008f3c401c5b619fea5edd196c29dc0b68e6f497c3bf732c4057ed3090af66a97f56b9fdbea551dff7096643dc995fe98bda60b3d44fd202fe38966d0a58c5ca0c13b5cd66538c399b4e98b31c6edbef18ec48eeeb96300857b9af4fced90cf583d0b0fdf6dd93f681f4b8bd7d72ceb69fc1d2e07d6f1b08fa6a929e57aba87e95069183b6703ac1b5d200a4c70eb2c18004e1be1c95bb93ca4f12ee76271515eb92be0265be83055872777e3ada4a8fb3474dec2ab1aece1c945be9d21413e53ccc2a3838a55218a280c2cb0be731238030d2f4218033290ce47c49069a7cc3e236db66db6cc6ac6d034112e97f1c7998c55e3d16e38e6d2c2c6ca53901cc62c5d023ebb01c356795cd0aeb0a0b8ba8ba57771190974aa84d9b93f4a0a36298f307dfb8bb804517b03af5ea5ebd567772ceee6c06a19c6d403f3e9f3e7d7a0c4096bbbd85d2d6e2139ba617af86cd9aa627b408e006f352e3b0c267b1582c1af6a5de65f418d4e3161e9eda3cb5bfb7749f9c631debd8b6bd281cab74325e4d513aead6cce9d6cce147f9922ef5a39c493f993acec3bcf1a165703b6c56f3804e9d0820f360897901560192db6c9bcd1cb602f4f721807c99dc253d6e33efb93a5c0820b9b1602b5ba54fadf9e3588074636d2e2b3dd64a2bfd1e47d38e7d1d8bb1ae6c20e947caba9b38c3a922c929b9fd130685e54c6a15b955d7397660672986b00e9331c7e020efd16373dd3b17de775a907b88db7a9ce3b8ad0b1e75776b415a10a80569646841cc46665ee68d907ef4e4d6d3a327bd11999f7923a327fdcccbbc0fd28f7ee665fec78c282346f121ca88518254182061834f1ba3fe0a5347db326ffa51324f8233e4a348a4b0392c67e0ffbe3e39defa7d90f17212c0efbfc7d15f38ef935a50c76e995fb0b11758e79b5f5c9eb14f51579952bd7479d1f62abbfa6fe5cc1175e7a4c07130c13ce9304fdc3b104f3a0b6eff247da78b550f8c060addc8aba55b494519f8865379894bb2c59648b2c1b629e64d3f135b1554609a195ad096056be19a702eee555de4585564209ef548b2ae056966c058a78a7d65039aa62ca6690363de6c5a8811841e3f5e601d2a6a5b7afc6054073aa06dc9326d66152f04a107739621266aebf19e257a90d8fcc9ed772413c5a950a5bbc079285d872dcbe4c0205d326e3ff7f6ba5bcc5132e0f6ea719ba291314bfd1b129e1e04607b6d2f9c7164c1ab95a1037d4506ef00a35a8a2d5b6efa8abe32b99081b52dacf3828f1e7b6b4d930bccd89e4c203619dca65bcf3435f53a06b550f4332be9bb1690e4589b3b8af424b7f5f44948ddb62da6a999346afbe95293466d5abad45fc5a895a854add347490e99a211010000200053140000200c0806044242b160aa48d20714000c79a25274601d09b424c7614a19630c32c600010001110101b46d009401a9289029aa0195708f1d7f7b927cbeee8e4ae9eb2d6ca9efa9a83add693a86a9bde55f678bdd31941a89a927c38a6210e8af6e425497613ee59e92db84426b1242680030877a559ed27464824cf454b88e95d2411a4d05eb4010249f904a9a9258d48cbb0179366a6d5670163fbacc17ff732ce3f08ec9a68f01c177b3362d6d88922ad83f017bfad9e4a0d0bbc62a6324be0b4062f98f818aa022261532dc57948a45d90eac9333061de7017a764dd574634a1066f19c7fb974e7c02df3036e3c18080b1c39d483557c3c14ab3419965d55a21ce85d65f9f74375587ef3a337e2cf6ccf1bbda5953ac941c48962f24691fe1bbaf8a2cfef65ea7e1cf492ee01d2b6d85cf1ca7884ff775736b77b41f1450cc6a010d4c73cdedecb50b5bbe9cfdd866e3d12f240b3adba77e6e64cacc9b21235ba47bceadd260be05f45016dbc6db9bad54494e0bf42fc2dffb4e65fc143d2944135a4f431964b7ec6304b9348cb04b714a4991d677c70759d6bba11c7fccd4252d63bd6f8ae5c4f9c82e463ba5855905e508b777b467c976ada9f462f44a6f955c52b149067c317d0bdf0218b447661756ebb409bffb565b05a5bb5ab603af118a0da5e144f2e699319cdc65615334c887a69fb852f5f083bced94dd68fd4e8adcc5288135afe5a4b08e05f0269d8ba91fe0c7f75fea251c9f43c5ff42a59c0b68655b1d84a6505b35f42989379b1819c98c5a7109925a1b2f1e4b34c79734ca22aaae30f67d2b6dccde1f6f94e43060dde26212cb8c3fdcd89199dae209a55cfca2f2b8b88846bb0be56f4f84e7aaef8dd37689f63e36e7cfaadf295ac2f578b3ebe6fda7d6e6a15c2be7168523237eb8d150c4acd73647ee05788c32d114147a2f62acb8f5e3c22f2d49a80c1493cbd9aa13ac827f9668d2d44e1650d05aa6bd4edece8a163426960ca2a36acd5219e9b3518132d7f3e1266d3078b9860bb290d946d9929c60524b089bf244f93fd01167129263c4977ad85beb1664be171d8bdf989c710784cda856e988340ba9e45411988cfd3cdbc3ff48b97c92226782b90d26abafcd600ab12f429fcb812f84da1c5582f05a7a008b1a64d8f898bd6586365d0c47e057a9090df435dd771ab6bac2cbb855101b480ebdb61d8184bd48f5fe4b493493ec037648a53bc572289e1b21996aa88fc94c0689407a272acee85655c050d616c3033ab64652853590c31c09ec1f25206cfee9c26b36fe81b7a08db50b0d662a516e0842b380cb44d52783883a51f3d84903f858d3708814e85f70d5b43dd822d40bb155ab26e36a28a24908a34520c30ca9d5d59d6dd4d7a132bf9c435d336b8f75b145364854c2b5003e26392c65ad662df20cd402e8f213d8e104fe037c5914a46602298256418d62317dd48713267597c5c2a9e95d98e084a946f22a48d294dc73cee56902c865e134fb1d6f5f481d2105987c29088278813600404de3b7e902912e7a56bcedf4e33b97dc87b6c3931150109e26a9a117712d8e0fcb44bfc2117e90c49e24815f04ce8bfd8b11d1e7b9c7a6736f6b2139ceae4fc05cf82fa37c6a74a668e2b44378552661d0747e3fef689e5d58890d6c8b08a35465ff44284bc85e453e31efeb414fcd255c877c56a6accf368c82134c9ecaadaed5323b80699e185819146401d51b23606bc563b2871addcb5986030900285785a48810b03a0600bd74c1aa0e5f461e0fb15d87c2933b88de7c54d666e80c7cd2eeb342f36f3f74f0b17e30daf6fb27b2fc95e1542fe704534204e731dd553e7acbc545ab263ee02446553612185a41ce5d2bccb35d36976075fccddd306be846a8204184a9a9ab1caff3c4ae7feaa560c280b5e0abad8e72c85258f12cbe9fb2d6a4cae54cdb2682c4a170bfe475106f8c86bccf8098b1ac2f184e23cc817c55c11336e99a69f6c5f7b26d299d61033c10e2cf104fe27681a1f6076021b1a4eac9b38063622f25fffc3215bfb8a7a6629908dca65b000c40d5fdebc8c307038fc7ea82d309e49e288b5288396610bceaa325205255fb0b547938f21dab95e7209ebcff632835b3c8e9ad79c2e78b69c72587416794212bbc17347558d3cc383dcac5aa45072fbbab7013283d46fecc7818e224188e81dcf15b6fc94ba271904231d543098215746f650a244478005f7eb7e90af820e69e215122d4ee7a7fa6faba9ec94848be9b32b56bfd4e7fba9b3fee47752b6edcfafdd685186262bf9dd4de9e04c4acbdbb4e4009161bae165325b0e9343bce191fec2937a6d34878837aec815cbb2b56cee444d6fae3e204036f2882bd0e66ebba8ae209c48d82e3d123423401218c6a234f69228d6fa1d2205373aad8cbe579cbb13d17ab6fbe4e2ad2fe3ed695cd717be922d166f11215e83258a1d55d061130ef94f37baac27541380091a4c582f273b452219690407068266005b962a45af53247595b1c736f5ed291259c04e347335f6ac932c24925dcba38b79669859c872b834466452a84c18be23c137bdaaf2e5ad9001dc188bc3280c49fd46069d00261222a1e0e0df95caa9af1cfae591ccd496b5c044b299cd20bbcf50218d009e180dd2a0eeaef604d741f9a957d71513c9398b8dc1c61896fe590bfe70800d498a40de685254abaaf7582a14e5c191da8632e091ff06976b03fbdc707d21ddbae978f0c007a05ec179cb52c0ddfeebed8ce9321642f2c5caafb350ca22f52adf4fb4c1464ba92acfa85a1410ea2273cbd8e77c53fa1eb30b84a7043632ad68aa59cd4a34ded78445e2b8d38644571b349f5764927e88d38b13532aaafefc85b77d0bc9709724522639b3ed35cb64ef22de555afee6e57a42dc4e49ecca228ff2de9d3c213a370c419fe89e2c536bf5b876ccd3af70d9a9c9305411b082a2e579c08e31b79a420e57f85cc26262772767ae432bc27a612776d5171b8c5685681896c0080c7fddd7daf8567c92783dd7507400168a173d4ece41ead0cb9a1e8040a9e4fb552c51da142a179fae6d6b82536bc5c25699bc674bbf6651db720feaf662709bb7960f115c9ad6c5b9b37bb849005a76289cba8ca372f78d5bf17d53eafe1803122db86766bd35ecd8846d873dc58dc8705aa7da081d09d5a5d53962f5dfd414e408a7752094415c0e88490908dcacfa914c00e145f09c6aa6b44834a1c8adafb90e28d5acd874777e38f464e34689d5699dcde85138128498704dc79d981675780479b800d06330553ab2964eef7574951475b681ba1435ea175d8ae9f025e6e90339dd38cb143b9a3997228444fc3b59937888214b801dd2720a981ea81437ee2550d78d9f2eb7c221a3f251d7aa29eb1e72d4443698a617eddec97cbfd64ed0eabf4f31c18c916c6f5dfac1b0f23d550bc8ec672e6df7f76be4c886de70b9012db1ad4a890fc2fd543715476a6055be749a1fd52f2d2b3d3287d47cbb1b13df7733d4e6b5ec63916b0895f29791508c2b50489e3cc084d7da5a62fb7df3a8c3924ce0bea6515244b8d6edb67be8c6830ccadd111af74c40f03eb4bf0283b220921fb1350e711f08d0ab17d6b30d370ec34980db326b2e078bdf3e1585e874cae77b4797d36495bb809183026738a95b385500118bdb3fb45cc3069cffe1254c9db2894db38c760289d636ea8a88aec4379aa1fa2eec53f04084b2a2a7d85ca41d2d0a1f92a82782526e664357d6074e783d211f453688a683ab5c6225287676201e5c60fef982ae4fa26648a8c0cf6e98817c5238d5da79e727b3b6203ff81eac4cf108996ad2e8507c0bec93373e2723bfde2373fe8588e61aa70c1a789973e923ff5422e9bd1618cdbddd6b64a71ab969933931cabce0848f3b680b570ec2d2bd5f6805d1ab67e39b1447c0a06487c56e48041f4b5f4d6d979f479831a3f7c1f8e61835fd928603599cc9c0b06055af88bbc8844e1e6c8f72d1e7838a385ece92970f64d5d8b3d0c644a8eb28879560e19c83102113ca5acd283f6fa816d9478708f5a74e440040de8fe26436c0f3fb75bc97c36a7f39114414ceb78bd952a994baaba231e11e1b898201f612d629c0514ab5a0b82b1e3d7e6604ccad98797749946684c32245e3d6bd7afa49400a92e0ac2b97ce1f2c186714aa1a3a61b320c9332cc04eb92f76a259deabd42d628b5a6eb1ce1de51fbf9cd5e88aadb4ab076f1e38ccc894fd8a79f537e683e8260eaea963437069dd8bee9314dc4bfd6e008ec9af35283a287e43a1d25a547715b35b5fe287de065809fc425d2316e2b917fdbc5135fc9cac5354343d2c3324190dac6a12dbf42a126e8b1da02d63b87d4f53de9467c8b82da12a0b12c6fac9cedae63f7037a2a76c3e81679952966717a0354f119aac5ad2a88adab502e068131d3dd534cd0e03fab92e2cb3065cbe194d5a4ef32109969e43a69d99376741970a7c121ce80fe009c0129878e29549177a0bf2686dc0e9abf2cf3b33e8fa731a6df35d879ece44745fbefff868c444030a9a9544e1ab84a365284e0dba1e89e983983fd28d5deb2cf3b0eed278956094448acbcb5de5ad8440420cfc33eca0bc971057abc188bb06e432a00fca857138a21f3cee03bf9404ba7834c03ce54efaef1ce91d7d7803eae38ac30093a1db4cdb496adcb05a592ffae479ba162c9b600dbe744681b0ddb8991377842a49335f08dba54f5f68f29e60217e4a1c02ee6709560ff54b8406585545aa7274d029639edf47ebd4c7a503a9ddc8949f849554edb0816b868dafacab0f07ea4c6ed6d78c0dc516e9140f5dfb6e719ecef21f880db73e08093bfbaee0dc6341da87e5834c13b48238db730929c43ec10502ad095c282ab7692a7ebbbaf7e9c7f378e371c5c6174c858d7786c8012a9c61c33b3eb860c759ec9bc211115f77cbc8eea44e31f9f303221302785530c16a3ae0b9dea4fc5759b561d00db3183f29afc2d1869e99d87995d34651502b25a62203d7efeba9a4880ef7211e5d198dc6630798968070292d2fc435310c27fe2c7629f736ab93ac334e82b22907c9569703de4a014650e654375c46a20da32ee25df616a7da4b7a3c0f60b3fe98ab79c4e3ad77226b86901218448b76254dd6a1b7e543c12a0b862b8681eb8ea0e68f8caae5d200f021e62757de02484dcb3e03ef973cf8b9d8fdf47dca6b121dc077723071cea2655ca5478f94e6891c77e3f10554e559a234ee1148c6e2f6349884d6c54d34f6025ec45523b26b1816b1cfaaf67a7902babaa4aa73e3322df5da04e5adbcde21c065b6f8ae0bd6f0f9a2a636859477821ab6cae744b6245320451617a635d7ce634508d2e44a6a778dd98ab61e2bdebf762f827d6daf4961f2b8083a9a863897e1d5bb662489db8d645f4391ec4ccaf1619744c3c4c89098eb0f6a50ec0d2c6a44ff671da3104b40b70eb3cd5dd44b7752ed84ad17d0d4980851c449e4be94f55f343a0e772e9b09584c2f12a2fd696240becbf642778fd886630bcd0f325647f5dc288041220e1c68e5d4df73e521621df0e9cb896ea3d531733a1eb43c61a61f3fbea00d738820a4e426b4569c9cbe4a6ebe914a176cf70afe50b0459a49c9400d230e5848460e57d4c379e2d42ebfd567dfe3695c2fa3f4dfed750316649e850c6542911e9379f653b60f51d66d630689bc4a68687c7b7eaecb5e141d7efb2c0f05373c85a257686241717751afd494760e7b8a34a935879a34f817079c391e74c0fc6b66b999d075b531ec249122590488d56d7f876f33b549b54e0a6f6c327508974643e02b7901b4f1e36f10cd46d428b95c6d12950e222bed08df3fbf86d20fcba1b504844ee759b0e3ca463c4f99b532d6a31a5915fc2e54a4208c3a4d72d49bdc1facf0b6bbf08e03ce4d07f6e5538f2b682a284ec162dbfc8b55327ec40331635b40f9a0cf9cca068e4105dfbe286143f7fb33f48cd3fd4483eeb6fb322e89ac2de593c57cde1be6745c1eaf4e1396d15169c4ae3ecc887e240db9ae0e4e35b5e215a9974cd543cbb046a3a3680346403275d7d5f2d2f0841d13af034f3f54dd981fb6f194e72dc0cb1df5461b472a788ddac8095a2d3667ca4bb84a43c91d4d2443742ee4cea4dbddc2a879b27385ee58403298d7d041e4ee904ebdcb9b9caf411fcfa78241623d717327588c3d1a67782d80ef5a75e559a824d621bbc4c84a8e6ace9197e95294295f4f66d01f7b1e32cc5b38be121de168aab078066db07734ca271bd3579dea39961ed5f1d0ee25ffe85242a66b450a21e4a544b8786cd5725f5acb4d8b5ed4c6232f0cdf75332abada46eb2cadec84cc543c54d31579d79ee8888fa212bd9f53e91eff9ca1c7390afb101129f4046e0480a7d1ae64c682b8b14c41318b2ac8db6168dd5c583ef10419da6677c15b880eb6d5cf91e93c4f62f6323e6e1b2e8c6ec4f001990a34191d986c366f4a9f6196f7c15173b187b3c72c9d799aa66ecc20efb0b4d76074d267dda478e140eb191115bef03faf5b39ce5a3ffc73ebc77683b6df3ab8f901234c557db2ad2595aba62579fc203650b04bdc8d277830156ea02370b2645df878df4bae00a1bb65137805f7fc237ad08fd19a4fdbdfdbebe0fa69b81dfab3993b5a69765b405f3e23ff0e39d1a0bb48279f27d37221b7fedfee9f1fcb326fbb44c50ce84ac61c435120cb41fc8402b00872d6fd27b0650e0a92e074c014869c6580bf5e4d4cf4755ad292322ced4d7cbfcb09285a76048d066947a23d4337fcb1cc4de14d953bb1bba1696c043b9c536a8950eafb853984f5036c18a0294112c2163e83c769e80748366cce9c17ef3a9114a2cff35268a33639e24f8ac35a2ec47bf0b106928784c2aec371ff94191d7ee808010bd87b390ee897689758a2d3ff3ccfcb849e12549f3859c92811a8ea2196f8ade731e74599dd7aba9284a4714e870c0aaeea8da4d1bb5fc15dfb430fceb40f5d61faf548377221120b1eb5af8a60c5ec84701e118a1804c355571cc4d3a314c38862b4217a802082b14fe5b51d9215b40392edf27f02f334110926bf317e759dc62f1aea88f9cb9508280aac9e1c9db8f376dc3df476214d724323b55418525125f441f692ba92f80b5fcb76aacb81610204f292fd9647f3bc918bb72685b5f9b29e9563da56f53be0b0f6f1b9948d120bb38a6fe79eef30887c9af47ffaeae811aa5a25933377ea90dd97d0aae98283cfbe1c16efb5f3171f08b7496481b538a079e3ed6bd0df5a72467288764d38dd7dbdb3cb19c8a255c41e8074eed084d7cf5c5a541873f5afb5cc1aabd0756420eabeb2804f8c6ccf0ae64a5f72dde4e73c6338cc2cf9859e369599971739b76996fdae4494b2489d7e4734808ddaf007c1a9087f0988c1b1fde12647a5c671637e5dbb9683bdad5edec0b7fb37a9b00fa2ba6140542d09f60d8cd5e812ceac5e3e141442fb061541170e8742112f3e6bebc6f48784005050cbeaa683bd961bbc849b2b405d9aeccc1fd281b39d317527065609da7add61d466339dd31f520c752c8743a6c2cd574d20fd48260a4d0d7c3877a41adf25dc096ceb31416cc5d9fb4b546d26520fda27ee49bc158e308012562b6106b56966844efe5f9f8f40d56bcf1f1094e2f8788bc7cd77ecb3e109d63c971ee9f817d8e3844b4f59865e7a420f5d2ca924663a49e35e6809fce938e6e2bbe5096cf654c3096b4c4fb9a087eeb865cecd5b7baa0a349659e8d3e7405391ac9965f2e425930504b0b75f54605d038582e03d8e888c667c06b4dd2f5b0320d535b7f2555bb94ec36acaece52c090d557a6dad1da4513ca1961da8f01b7358076e99b430b99639f203203ead61d7b8feec3b9ce54455118f13c19830d66ca8e78d6b272248af7fed1131c98ed9bc94142e488891c480d9bb40e33cc96e9db2b7a25e3689690ed3d19d8a7049305c46172fc44173f6bc94eac4e8c1e4563fb38161107348e2a2a42602902b5450b50ea8f5b44fedc2360c4c71ba1c356445d076d7c77d03c52fa1575c31614e3e762ba57c351a2e758f133429f2ffac0ab4680a7a66eff4dd74430d76b63c14387b99219e50a5e95c9202344fd0294664a48ba09ed4357d5378781af9b84fc282b07110d37e16dc5823325a169b12be827318e76a01b1bd1f281e6cbee7976c5fea660c685f0eb58a580f097170cc9d2a63497ad74888f58dfe9c21353b98b317657df36e213a5009f43ea992c2736d7e1e9be33ef4a7d51d434af7e7bef7046bf64099ed536c6d8eb6587e4d83c19d67acb686e3ecd0fe798729a5373923c41e71ba553887a1c6a1185f60aeb29d11db8bd01f30f37ca40dc0754315596edfd5a61c2c7688c585d939372073d204a9123bfab6c5c0790d73b2164a90ebcd69ea20631d34cad019e42918536d9fbf32c46d11516f4dec521399616688c8a67cda280f29198428166481d08cfb227aa69d643c187020adae1e4693421703ec0f8421a94952a337f7d7e6076416e41de25df29dff2a518475704d9ec4b7d38c17f4f9d6203de87352b9a55f83a998f640d3a1b25217f5870f07305de27b43fd91070491793ef9870c94064c36e22e1a6fd9953d35a11dac6542083ca3c6d3a0eee3ec0e169b05e8c3c43c97b9242126490731326e81c6e2fa685e9a90b2841805285c19d683a0d39ea918d6e686aef6aaf1c3204743f5f3c2f9050c48d8be1d897783107db2076e39e327b75e2740787f00d1bc035dd18170251bdada8b1ddcc24130cb70cb3b22d8321cf44edcb9919241d969c8d7219abc5de0e4a4e37b698bd1d5037c0e5cfd146083c06d646d33a47781c82d66686d4b633caeb37d759ba340f5ef60c964e6d9e43815535403ab225e23915743e8c064264cce64949fdb22d0120af61e7fda27453282c11ce06eb531d5880eb9cd118157f9b62179c4d2800d005e5d1bb21521101568cd3670f75f2f833c166600e552e1cac29fb2876981b89fc99e5b27c9abac0368c20bdc9e818105d0e2d284cfeebbd49158ed1b30d214614a10ef290cb76edd97dae64711a02017550988079ae3377ee0c59b4afa0b4b72919fa176d82b4194557b8173c5f36e8760bec712babf45cc52ecabb94d717b1ce0f41727528f3e86cd3d6c381420ffcf088c12742cd9d5fde182e1e0e0c668ace0cfd4ba42ab29efe73857d69fc99ec4ff3d479cb76d82a8e8c3a4ac093a0cdba834fbf5528a8fb52d52678af014267e4f98feb38f3a87126c2bf90fe6e71a313084b7b2761b3223040b8b98646082f76d696cf758a683029573d546aa52807b83dd3b57116d992067c37cebb2b37bbb080d7d634cc741c9fd05c78fa2a89b2945fa2436ade1cc494edd2dc03a752fd01db153870722be02cca3905b8db7f4e512a16950940d73e28cd0150242bdc2b75d61477d2722c60ab7c66053cb5605bc3ad9eb35757cbf00a6970048662a68716cfcc6a58bd07bcb74f192a72201006105b68d637b420f78d93a042e61b44f876680b0dd95622274b96e15e7a816ae8dc6c1236c87d7aa97700e62788497280a3c67417c975697b088a2193cf0d68c379f2f91ec558f05454bb969dc3c310c13cd82276a2f39c07e92a51ac37c0b34683fc4540fa9641017a36184c78f363aa7e025c3fdeca6f86c6884a6eb91324589c4c3e82c1d5099bdf0db171fc8ac9b7aca53dbaaa728ff373cb3f1271c60649d18947478a3faf171459e6d9e29ae30efd1881ba11ad4b40e1382e6f6e40f61295a234108405ab7a7f86110ab2034acbe5aaaa438dbae106024fce4f7f7786db9ed7f2b3c84af715450ba54b00af6f142d9e1cb10635ca29045721ac32e1086de566cb4508c415963c68a63fd02dcadc0052edbcb65fe1a0365cd7d20a625275d774f52fb3e41537415596972ed4ee028dda7c0b175ff4dca5a1409d64f0c4574c2b0149c1a5db78c3a525d8cd40e96d93b724d20850ba3d3bd4cd6bed1e7e0cc488e998ef95bc198b6952747849d27e5dbc206f6c010aa46c96692c53a012e295c3938899cdf8c8af255fe97f2fc023f386d48502a8671736be7c57cd3eaf1af960f15279a5018e0f08f5f202658625ee1edd4d9abe0bc59ab7e83889240d911775e9ec63acdb22b098c8d45e7536a71fbe09ae770f4d59be80f168942bb49fce5d6836f90ebc2d5b54f99906a83c259fbefaccd67b6375fee1023080b9b549c91ca77c6af4d39ce843051c4a1cd31d10b6bcc1a8f268e6851c9814e7c687436864572986c2fbd3b5b1f116dda4b17d4a1b4a378091ea3b3ac70b3d299369fa57922879a49009b08b651b8fa71e9680e2f560091a165853b9b43d716229038a0372da5769d00d02b0b1479cecb043bb301cc7bded7a187011802547f4309b63067f791d1113395b9b9b99da6fbcbec1bb24fa2478971e05ba967ab5272d427b581e8a413e98a17a06fe87a6a5cfe5aabd7a71401f6be04af3372cae7010757f9bf277de808220650aa45f62ea993a3000d4a3d0d6618187612e920077142d950bbf2510a35a54d5dd9d207868c5f0dda431b72852510bfae94a80ab9dca41203ec23ab44888a7ac11f516e8bea7b0299bb981f163f11ce2f8a046be61778416731f62913f5cf50af76b62c8090b9d6779e4df4ae2a04bff09f800905334b81cde80e8e9a8c4f7dd30b0c87c341c3d7c12803474a830dc447b59be4acf61be1383e0588c182e29cc1c3432c869d0e254159ce84c607f4336c7043a47ae6f0462d9797bbbc293f32bc03d7cd2059547db335cdf6f745daff71e70f20efd91b5cedf7cfc05787c77be77bb2d904f7e97d167bf1d83c975a5bee6fe303d598080a333b7d40db10873d5cc68b9beb34a3b7ccb91ef03ff6979b8e1ebf5834b83d91c594ab7326b8cf2b399fce014d0a83125216901d24d1a5e0c33e2ebe79501fc88b39e3982f765350268ee12580bbb5a559cadd8da0374942bfde13222398426cfcd7b7abc8646325b6028c1e667e39596d7e5a2712a3213fcae6920d07a7593fde33138aa021ef3a9ca9f59f0ee1ff165f5052f004e2eafeacf1d610454fcfbe43c5945a294e0726d9a678b7eecee95ed0f51bbac5ec7f017c30268b95ccb146f2a995b16b8415235319d824924384ed11bd4d75eea3db5a8cc08c22d9327fe28b99bcf13a5dfa370210a1e09666b7db2e1056b3a654c684661cc7bae30986f92c203108260466275cc693c230485cf769c0d2b11ab04dd1dd7f3b590363105bc3f17883d049ed119e736aa1101fad9288803fda692fd8241249d4d80914b300af2a1ecd231c7dbe365cd9aa36aadbdfa94dd937c641d5a367de1917dc6f9a0f43d3b9779af3379d7a196cdc11d9d37cb75ecc8c208a7dbff091fa0293a334d7513d907f747d68e321ae7e4d7b12171cedb109df699867857bb4a71a4dd02c9645159f8269aff7661ce40df43b013145ecd5259d83f5b6099f6a28357e1286c0e758680a30986c8b774afb28d4128e6ee7d7377c5d9f60ad1f3205c30fba2ab27606d40a194e301243db9cfcacae740c432061c5b2262f2860500eed8496e4ef84d94b02559f47f8204c5282ebb7482b413805d94857ceafa087143f95dc05581dd91967465383f06e375ebc30f00979fb27023ae876ec5675ad66a3b05d16b096d7392579f6f846a6491c5a9c4cc4fda4f31bfad20fca0de449cd60a2f03dbb5478bd63627b9c60f6f88edc00d512481a49a5ba39cd9ae08ced7764605a0bebfa29073c517adc8e9a13c047e69572be7863dca8b8964ecaf73320ef0e9fff82bef62020c9d35500f644f43522f583f1c6c1f3960f8116d00250f7262e70688847d2f0294509ba6d20a8558d382279765aecc9bdb516fc7a8bb965eb916eef6350a3d4e75acd3ab237483dcdfeefadba5fae57f12490997e4c5029b60f013c663257fd032b765d4131061fc6dd5e0a65e6822a79e077e965671c3daf3364d70ccd386fa0e1be5d97b313e0e6d41e8b0d988f413566abc72614c4bc2a5a6e0b19ba421e4949982001ce69475c00951b9f47bcb671ec865e07e9f61c5d6a7b06df818293df556f7211e414830abf29629e541138aa642b3cd3f21e519011de041b17bb229f14b2aeba02f2f7a99d2f95b5fca350fd647715ebbd09906c90d8b4f6e22e27cef90870542f29e30b3c82345957bd6a5e7c1583a766b284ea86d38f634143f065890cb02219772272ce8ad748f049f9f65903d497f41b6ce7be5fd86a7ebfb4b7f87e19417a8282388559b6d1b535bdb46d34c5ad4f08ef53cd9c1d33f5f77916bbe92681b5c0f8fc9a12940a05c394170418d8cd79f481faf1411bc8d80010ee332d58760a88f56ccfa3da69c44bd853634b58d4de50a2b315999c737bd4e3a03b5f959498583abfa140e70c4d77b646ec339af6645e8adbf608a92c9a73a08efda6961951bb607662d75d4a4bae1e3657e076d95a6a2cbd984ecde5216d1febf9dafb59c8bb8e0e5bcaa4b65fceb61ccf7958fb16d48c3764744419116811fca9c8059862d1824ab299e59e12021a3c94cc4127d02a2f774a8e54e0a5d92e5f078b5fe2e9fed4d561ca15f3da8e86b260be74e3b577a5948e43fe899e70928d0c61fc833d7c86a5d557e7f7f55a0d1193c6a01e5163ca0ffb7b5eb13d6a935ceeaf5f7724e3e2c37a3dcd38333e35c6c59b926f89310a6ce5e92d3d5f0e168db06efab8705b71357ef23082b1fd643eb0defdb968c32d1c8963599f696884b86985637def91e09e524cfe27ae23d9a34130264079c1187a491f7c405d025ce487fd4a0bbaa8befcb885c7e5d0118eb6a772a290a7cda53d4a9b70006f5f14e56437cddc36b795a5585e4e125bc8fee6b1554a581c53abcfdfe2d0ab2fc841add4c7f022484cf397ce0b59a618985ec55ce8a7481942ba7179d941c61c0fb318690429541bd085f69811f013b99e09de910771e423f6cdb49802b4a94e57c0a005fcea1c50db0ff64b5233e7ba73b8c9552947cef4ae819ff5c05b71417178f2f4cd99ed95c4c67428b0eb41dc7c58aa3772a2befbaeec057a0e9851309e65a73ec4d35e53e4df7d512cfca2b1caecafa787c844a3957fb5985555664e6ddad152f79c51d903f565902517b6c16669c757e5deb80f3a11ad5bc7ff6f20490f73879b4809938d914a175de0b465eba62d4a693b5dd68a365d03ba73ba5d453fa68ea6aad08619f068c7bcae2c333e995c737814e34d98bdf1070162287208b54a50918b33f7610961c1fcdf8f2986091f8e339f85239505cc4af8dfc8fa8aed5bda423032007d2d1a2752f4f085e0f02673f02a5d0b6a6413fd92a00bbae0b499b5ccc019bb2e9d7d279a71b372e8b8126589d67cae21f61d50a368ddaf7c83daf77689eaec74de7787a9aa533458a6505c40ba66458e9e1c94894090db16ed97d82afba63f17b8e75633cd9471e2d646932cff8bca8c773b0b43f8a7ac0458d9f7efd17c3b8a40298e6fc70576d583972defd116c1ed9cc5b27440e17634e6c0d7f281aa523677827b70d2e927433ee2073a00a0cb4e7dcefa83668af4bbdfb8143919f59d88478191776bdc8d32b2577a58800b9edc0b3a4efb39d337cda2c1eeb0b7b8d61c8bebf4365d076a781210a1695cd54d980100b457e9f1e4da3fa2f3d23b145880e7e637d3f80cf0a7fe7e72191a6e3879dbaa06bbda593a961c7876548da1953f81cd66757a52db28c5b338ca208a71b226dae5f337a0987f5bce2c78a10681b61eaad4dc2de3045fc84b60ea4932c36dff9cbd363d5ce1265022a53e6de38ac02f2fc00a53532cec663d09d31b414873542c762e4ecafb617976b785c4a860e829671e6f029576933f2c7ab304118d997611e781e4be4dadba2dbc4f5b8930efaa4840a62838a6a8a0f10575362d94c4578ffc9a91fc5ee1013b45e26504327e088e38596557e7b3481fdc0da616f0b4c124e56c089908d3dfc2402daea27ab0fd56b2195dabb27508c331dc538137c42014dcbc3d4310dcf9b8a331e91d0ddfcb2218ad514e8a2a50953a2e87a06448746ef98addbf5f43c2150dd9514ba83d4e4a737c947e181caac7782525226516d9b99cd7a51cd90cb588a0995b4941e72fb263f118d918b37e4b4f530123c503be875fd4c8549d6fff46f9d6dc1f534165009ca6b2fab080c2287d9b996f2cd0dc9f6c8a07476e2c1a8e4fc9e489abf968ced81f18007cec76e49df515fd01f93f65be6f91901c301906fe4dac66bec0ab149ca85295db7e9e989212aef119471e2c758037d948d576f6ab9ca5f022bc8e5d1b4d11fb37044b9616dc140d9005a05e736965d5a63b331fd12609d787aa8e7d9806fc32b4bd3e565c10e615a28c1c0fe3764502c8130d2020bb7dcac0d41017db4e4bc4fee457f9688e37917c3c7ee6dabc3003d26ed055fec36ac0e99c2c9159bb4d14691afcc8b089058d18382bd3f68a739f8308ecc99bb4f1e14d3af8c3aebf27c9232f1a24c7bc17fd3d615f4cd24d45af951924455b750afa60c063c5ab28f6421ba9906aaa421a90b55990c2de3af16074adcd4ece91f76d01e143531b48f4b9932580e29a5c8b9c4e052b2101035af488dcd4864f431cd8014b72dfebbf908a0d88cfbe5977faa2888c0fbcce4edef11fe86bb9d8cadfefd3c5d0f820c4e2bccf50f3c74cc584b84396e0541bc0f4c82fca1dc17887ff0153bcf7ffda159cd6c6cbb8bdea62f5f09344816f13339f5241ae17589d8b87999c0bd86cd4b4567a933d766cd8bb581511e7d444676a83a21ca747553649a8f079d4459ada7b67abebbd815accc11080b01b3f42b528dff80c923fc0d173e514662b6f4b68d34d8a02217b9339504dacddfc88f4e7cfcfc84afcb3eb075e950300600bfd611a23ebf2a69fd835a6ff9cc5f0158b02733ec9d8d537a936278f71b1edf13e33f80145cc9faf3f3e099e77dac0d85a02f1a932b6da7ae64367d9fb0ae57ed0bedb9b0c0f7b2cbefe29fd30405646c9ad6f6ca354a41f0a10e73366e69a9dc474bce1a53b8540f3c37ae4e043dec51f58c4d9853861b21f165fb04c95d27c98b10d497975c3cb59124781c5fabd90101c8427cc0f983cfb4d37813e38722a57c4fd0d069bc2082baf157d6e4d8a7692bc51865e269082ca7fa1f0a3be1afefa50515776953f854aff5f57b54e107a2925cb9a8960ba33f68e6bb3ce07b51dc9387fd6d84e93ed6eadf84cc4d62e6b1e7efa26767263ab4e41080b89a274c9cbaeb4ab2576a75a9a6832984dad1da705e1082c871aae64d93e044e653e9625a42c7e73cbd838165bb897b1104ded80956e5bf7b18c880064a5b4f793ab91c2f83b9dc3ef1ca4bb94dd84bae46848a114d87cf91510316dda96800e9f4aa5c2b10a613b0cfeb6e769fd8cb165b5bc2d2f51ed8b404754952887e565c8a34ab49743c60d96eda23cca8328d416748e1d7254d3e2098787c9d2b057bbae475857ae7f09d597d9d80dc5281ab77838361264e34d1ba9ea3287074487fde80c5ed535470bcf115c09596c67711832a0199f197f55ac72847e0c92efe6564d314f34700597cbc89afe36cad4343009bcb0dc047d1e4b0b75a4137846cfd72f64aff92b0d076a8a4fc7d4416540afd207a45580fe6f25d35934d07370224cc8a70967d59effae738d31834dd6be8ed28e85f76df0d9898207287bff1f83106b85f00fb327aa7654e83d1f1638be1dfc4e4cfe06d326624a256ef72540fe049d2c16aceb5de0af9c2ada93235db44ec2f199b23a3017c134a62a10d41828f50840a30d0bbff90caa86ff93b6491e395c52b06b1c6df28d227b5429629bc153c56ee4a751aa8012a020282114a1e514ab4059907329a3b4e3185a7a539d200421261891a6449bb46e2cd423322e1a94432f37ffdcd9d13cf26423492106440977c8d410bcf3a50884ca3e373292c89b7a68640894dd371a75ebfcb95df9845a7880788b54a8136207ebecfbca413e9900bdec6f5fb3896118ec4d62542bfb82cdedf3bf4f2db4a1d642e007f0723ccab016ef286386c37f723478c517261ede549a027a09da95eb25465be89956f169e89fe15dd11819cbd79ed70b1ac7d75bd14df8f11f09f0b8dbcd3cf851e15c708526846a3956296d96e95a702d90c1925e75d314cbe84154cab84cb320271923a74aa4076786e346b9983a605a42684e8c7b10029a72ce7259d38c6cfbaceb6521988d6362bcb60fac9ee6589ad57ad632a88e19e8f8d99badb7f7adcfd09791f64434d880e833188c304681a29bf58683da571aad5ddebd4334534733717ea391873d36521528732e32946f4bcd9d924cc3b051d235c7519fe31dab9a70e5ea2912d36a0d127935f8d1dc02d7c8bdda291dd50cea4728b0cb58e73049e31667384f820ec57bcab0bb88227d32786b2d861688d8bfc548804ee6226c50763e0d6cb84bb8828b14f5e78caa596b0b1168177fb0de60949ed52d5e15369046aca713afeeb0f6ec47fa6a7ef9c36f5d09b0194797a65f799aad5188a0b8dac6441659bf10c3eca5adc13b717ebf32fe7f06a508f0004c5c663675eb897192cccc0536f261c22223a41364d80a57b0e868dce3f48217632c965407d04af0c740604882aa2b224849be14a3ed35855a504200ffd1619a459a680d414d3b8243f1c83eb495bb8d625072baee2ae093f2a79ae5d5226ed97e52a9176e21953502b6e8b83d94ec78c5cd0aebb6efcddb551e4ee992368f626187f49956d77d624231fff7c3e80017f4432267050b6822295461540a6259476719a53f1cb636489fb50d1356dc739909405711dcbb60322402d25642ba134e24b10c20800e7025df19717155ccb6fa5daa940bb988e6219c2f2928b1aaee9c2d317e3d5fb767c0c82cbc2b4efee16e17984eb0240723fae9911451305520018e3f4fa7cd999a2a4a5e8905974073f990219e126294bfe8b49de3b461ee1910fb80716dc856b98e37477a5b6b4221c5706d26f2a7d955a5b2611ec8193da577240a5aa3449b3a4b57aa2b77648b10356066ab6393905220bd9332aba5bf692be4bc00d71f050f1730c97e203338495f4c6c3d6952c497e1edb37006067cf94bf21737c40192bf6508ecae7372a9217df7087a296bf811da075cfbc6ec71a5780e458b7bc5d32e62a28f0970872583a920a93787dfd6179a1d72afaeb5d96b935b8bb053cf0e6fa18d4462bd9ae7621eb47161f3f1590bdb530bb4b78581278881a91e61c0e91889131b03bfc2b409703c703c5f57767491ed2e8c9eb6c1e7cceaa96b146628902e26b132e7f496d781c687793ca878aa415d3398b9926e7f527c0faa9bc5179725045fa73602cbb028806097e61bf3adbb7380c8f723c402d9390603aa79554d1572d0be434154074e79d5442dd1c0f3cf0181400b16e169f44c5fcb6950200e2a9eb2d08591af44b06be1e27c083d3e0e425a5db915df9678cc3212893b121ccf8961082f7c0bbf552c9d85741f242293c9681329d29c6d3d6095e1cc8292b2c8dd4ba4ca8c044411360f81f7fe2d975c8ab1e41d67de62c401ab08f6108a0daaa09a9b455a31705ccf43cdc56a583ab7c1f935cf75baafc4b5fcdadac0f813feb6c48df98a33516de9b3344c0287a6ad49d7de1a13b57c0289cb76ea7e6ed39dc19053ba7081d1c750f590c7109b508f2f22fae4ac701b6a766c991201617c9c7aecd5e6ad14debc57997afe4b0df38e8b954cd8c4ccb30b43fc2fd8ca438a081496e7e7675f1d93e4d9193d10b1906a65866a916cde34367fcff0c4f8056a97c3e3fe0a7cefe98a1c22025e41a316a728d2e4c6142989ebb203aaf1899451fa2081e2182d9929f03446a817452129adc8a2f8db70cff744f68f278e4d2b6980c854d9f290f4be00602cc431de2d153cf28cf50823f5465491344eff62f79c822b460f23ff8a7db2953e051ad99fb9c5da6f8af4a5698645415fe7e1d65cfacfd44a4989358a135b8f08ac335c1a87cd41e912575852d95df09bc469e24c976cb287c618b5674238413dd9791010c7dd5940ee7182ddf73f20763d1f5fd8d21a00e61622f9cff3617686b22a9bdcc14b08d5b2fb691a98bdee5588655df67281e9d95cc83920eb1c0c2aa535af8d6f0cd097239490da3d0af7e3ef3ba9e9b71d37b677262d24d3157c6cfe20d0da51978ad5005236e8d27311c0283af985994dfd38aeb1029ab3f66af6c34ffea292c812b8864114853271283cc97a63fc3334e0ceb1bc05b546443163f32499b409133de7f27bef111c83dae0615a2f47a9400506795903a4b031cb473089f22a8d03f530e5901c590e4a2eb1978e2f5e08940edfb13b82bcb39d76b41296499471553abd5bd894f63012559da1bd83dd8954ef801f1655843aaa35a1a17416b6bd8b9e5f789e8c6a55c04baa9f0a167e35e1e08d53418c03a7d4291590fb0b28a0133136328cb1e6d638bedb3488e2f9ae99987727a698b29a0197693302eff8174126c900f6e7ea6139af60c484d76043b70cf06e5588a397c3b930c3c0f1625a97bdaaf0c1e04b05742322386ea08707bf4067d30bb83286f54044a40b32a9ac0c9ef7f6efe9ba214983a7a950b4ec382ba93dcee089f759b113287336c76395b5e07f69e2927bc43975c74c0400294ce50e69d0a63e673d8b4d692aeb9e00e4a4b03b5685e24eabb01bcdb4a40161a267f104120d58e1f55c3b22f229208de8d29e7ed13d47fbd0d68948a485b77556f41d2745e98334cb06f0c7e9d5deaa1f16835fb15013ee66ed8c9784708611b6531505f3598cd505ffb471e6a73a5a8566d53f0c02851922b039213f61ab4b63e6f7bbe55910ce623541dbcd4305edaad5919008507917d2c433b5d8d3d4aa80ab975194388f5522e8c9fd2d043b6d8d046f20a10c51f31c6946d4748e26f9108f78c38b5fb3b11e112229f486f103908871520a88d9c05a58c9ebade2dec5fc911e21ba9ac9f294e65bd9b5497b5609ac28ca66eb1a40e878d63fa8a00fdfb74add68eb29a79d3f4e7cc8c105f1a8476ee507ef5864aee2a5a2d8928aca7ea56a4294c0052655cc8f215170f8f7dd0607b15894421c166c68960b95706dedb30c9252aad94ac002c6ac3ef0d73f3041e1acd42c2c8143e79ef0a5849ff6d067fa798ae103fd39d173b6957627d10984363506d875a3c1b00248668337368f152e0bdc5191f937e22f0fc9349b315e97457859056f69431e80680c05274bacc1d2c19f49013a8442c128faee64b9065875f8f571cc9e0164ba7e3a606324e8a14b8379aff68b569ff4336dae7ae29ceb73d00dd1dbc81953855c58a62b6fef709eb8076241ea616111f400d9f400fe332dd4d20b9b5179d88a82eff0b1a5269e39bc9b850140c21042d13019982ae7d31ad13db299e2e78ef2dbdac634ccbdf1a510e87e71294a0c39895d515ae703b73bf84f06deec5e752032cc054533928e874833d864dfea1c75998a73d48f000d7ac705456c262294beb557d57cde94cb7d3e82f5837343dd05bee6ccf39694cfdb0a782b05dc93bdac3448a446626cf40a04002c26bb118097f298e9aa60820405b9d4ef6fafd5707b68671cd65d12db432af5d45e5fdd4388d96d710124a2001be2c11b4f0a32d979489b782146704e9a7ec95a279d27062452ca7444f6d5ea46df4bc90edad99f7b3af9ea9e4eaeda3b653a1b099653815bfe1d2f593316bfdab0469b93129ac21b9825fa3010c74dc7c36aaf3d5d3deeb31a8ec912b426ac75e424a6098d0439cd674273749c8599d01e8d33452634e0e24c5e71a08062e3240a678cd89806fbb0a479a895f4f16c4a95ae0313b93892a6f703f5bbfd7696b92ac06135a0ee91a821d270ac205737044b48aef1451e6525f68c5e2024756a1633d6d2cac3c66e244be3debd9c1949381524ebf8915d8b3405de8a7d2bc1c573188c267749d71a6f045c67c00cc57acc55148ea7059ab254eb14c08766238c4a588ab09f95caeeefb1fa555aed759b7fb62c5faabf23d8860e68f3d1450ff0a83832d4c5402203345ea761896f490ed24b58c228d4af11a1250bb88542ef0c305ae6325debf07e8d8a074cdbb56a7fdf1b7f655e1f0bbda2a5dbed64ec787767bbd7a192218e202383b3a736040170e83e891ada255d5ba1f9e39214817601bac645cfdb598dd84202c455c90f491a6b10cadd268e6b6183b62bb0f0c81c1b4ed2e2064316fd191f181fde8fda82cd61a1d27e03a052f125ee6177ee5abdab4558c8f4e57e2d4afbff0e7ff686cf4248163ad2e4a47dc6104f99d2e3a97eff62e34b74e6dfc47f7418b097601686e43c52293810174e8c858926d3259adcb75eda3168100af1baaea16be08266665b48ed99aaca244640494b8818f01d767485fd1eda8a4b8eaeb5083f4380989f6c2f9bb6c3f8925f0e845d3b24b97685cb69c8845ffd3e4b1a6eb302d91d07d7a4f503eb00ad69b75e417c565f9b47a3292ec1fcfabd2e288a80f6703eb834631d424f3168456c8ddd535d184cd668787c418225fdfb9c2c1edc069b882d2fd03e4bb5a9b85362ce88f520468b0235b448f638b90ed991a9523d4e6ff00b15554c0e4c505b4a6dbce95e27f42469bdb476e740a5da3189aa567c55c92d05da2f4c1a0adf3b5d977d083c1aeb6df926c95567180a5e25e6d1954158b31adeeaca0e0b7392a5535a964e72c069ee44186f1065b10d65fb74e196df29f867cf75f79a5a067022195e1ca007a846db44af3deec3f0106c9ca05e54479d7c2cbfda54efdc31f85eaf66a5cab7425f5b61c14bb00fc707a645da69ee4674c545a85c82661074183f1cd807ff8a9ac46ad117310aeebf27d511bfba6018333008c91518e6a001d5b54b34fce77c71b67ca13c8f50e931de97a21c31999ac5538f8984e8515e309af9fde1a566d591390a469f5f1d2bf5a4b1099192450d53c18ea8a89d48d2675fc886b83b2afc0b4256788a013bb34a6969ffc7927f25cb2ca7e09b5d8eb78d84756e61da475795f4d8e1d3338cd441be9badc1c9ac5f8c86998adfa3c2283b32024ec65c601bacc5055a0f07ba4b07099ebd5121490e068c85020585e413ae6c31bac8584f7006a90813fa5090995b091b8a5c0a909a645c8c80c37d494ed21a1c1a8ec271b260cdcfab0d90611482c1ae74a4c62b379227ca9f10fb8786205b1a6ea7d941e059bff0cd7ab998a9e7269909df92e85d0652a7eec2f3d6c44d3935fe2c8bcaa1be65c4acfa6f5290ad6f5472260cda8eba1b93c9fc933f87025ee30af54df1dc6184aa4b001719d9161db9af2de8ac6a4b8b9dc2828d8bda133742766a5347920f298ba13a089e749b70322024fe5bf2b0e53d0ba59a328dcee58abc744149196369a802405060453d29f90463855619b2e257562e3a0ea96b11774122a0c22bce42c4c11bb50fcb3c20fdf7f2ea8327ecad0f0f427e466cd7a265455b6b9c2239868c7cf69ff94001ed633850263cffd0499c44fa958ce9959451fb991a3365c34237a02ec1fe7a58b31caab0ee4a722eda265a1f34207561cf3d34982c3b0a6afca838c9cb279d357c2025a5a9c6148084d1f9a50cf4275d0cd1586ef585d1dd852a31a3016a8c955fcac3e2993f0e1cf9fb9743cd45dde50badf9eb96a41f1650faa5f67a3b79f91405b2d55e66df296b8c017e40b6153df61f626bbd6d5ba7e8d6c52cb77dfab46cd6779f52b8c0d2ca1154004be817ec8185d865784c7c81e9dc5def47e9df7a5481d0b8f2ac990442d3a8367176db6c6aa730ad842fdd493194233961863290f3634af42cb51b56a812300db443290e23c6d0285c8a1eb0a9e870ac4391f470ed0c6b5b8a4ec95640b3821a02ef537dcf7ba6a4f6701d5810203521effa5dbdabdf3f7bc03579ef4828a7356259b3875ab691ac23ba6b12f11c1c4dd6ab24b61a0f0406f64d012e521d0904f0d553beed5231eb8fb66c6f1aa5a3f3445eff814e098357c300d98f9f996b50768dc73d81ed6e2f433243298aab37131bcaf3aa89d7a4e3cc60fd3c80192d3ba459d5f663a41f7ab17303f1d5efed2bdfe3c7b3e184fd60a843e71475d664aa657ea8374c90b4c8129ed138ac348745827000e3020aa45e6f39ed9141a9e7cd8c8ea2050bec39602e5a5ff79d5f848318d5cab3758a0b16d81bf8782c1b54408881dad9b74a4c23d6e44ecf6799f2b89a249269c6784f3010147fdf1f1a2900b13c6fcd743390a7f52ef4705e0d31598e03779532c7d9a4f47fde703db69fb3e73e0a852a906184714c39a2c3079ba528609ac01e65e21549bebaaa726cf520c7bdb43f24b0067e2f8a01d68ea839d298930b4cd4451a9cb9f6dabb9c0b62b76a285a06e448215bac4cf409823be1be59c7b6534348f97554a1abefedba010de3488617dce12a3f9b9d470f8dd2e1b9b7db67bd9dad1ff2f86c254aa6bc71f8bb672232d0d9b7a286e4d2166ac5bc7247273632225f6e11d29620b4e342ac706fc08d7db36dc3a58fd0e25c37a96ece6ef2f14f5bde88bcc3e1b13880ddcc90b9d6daa1083c3faf5d70c5c12e667a34e2e2f1ae59f1431f99604a3b23f67c8eaff6bd834c7f4be683d5a0ea9613aeb1a415c993cfd4120da3fe06d8632d20007fbf4f352bb03dc3e33b69c5a568ec40b727fae661633ece8216af0892df8076914491f39fa3f2139dc988898a6d9af3e3c1f959d455672c59a850218531189aa93a79c5e4177402d84c53b9e7e92695f811b18683273291ca13fc6313c6f3105245bf485836313016f2ff43ff96788455af64739ac3a1cfb2228149f664b33078ff82e4758b5b6de6da75f19b21ee5509b9b1e51af1d3b02fc2ec91d4f5a66d3a23e7d7aacba41cf894de57006859c4a0f771824cb1fc336fa5c5e6d38a75d22b455f2cd097814fb6fbde7d2f4e77e20f2993523b0e23b7fabe5b2eaedb51a05327439af89837018f52fbe6861a16665f25c41e72a5f1c2b4ec2c83e4ab29b6be316c3a52b82d4cc2abc33816892ff746711fe8a107e93a59c2fc9fcf2f3f7443aa748070a8a8576f66aae94a3b0ef5a4557eed4ce9ecee40827f577216d4187a551d9b7fedf4a91087db60e836150c994550c8b95eb74afcbe607c744b06496ee64c7514fa7d791d5fe9dd51d78312db1aabe722e92d944d3d249752f8117dd7d592c2a0b3f44fbb7b885b06f5355de47961d4942208871c71956af4e8cdb9327b7012548abca628b2372d2134f82bc2b20df1c52acbeed3caa0769ed3ae8c7c6130654ca29fdfeeaa82ffad3507e40af95376fcb9d438440a9be758b0c0b1b873762a97f1b9a31b1cec31c3c979ea5cdb99a45b0fc602e3e7adfd64f2c05059a50c98b5be04992e3e8e7418e389d17a628066658b2e6e21384ade1025ca9efe121c4072c70b2c0d71023252592ba0390cca29c309b135626a9facfaa669fb4be131e0d7f25ad77717313d035cc4d6506a4a6833a36b6abf12297b3cac89c2ca54d33677621beeb4628f0de67041616271bb9991d7765c51b4525902daa616917e3023651587341ea6bbbbcc0aab631cb8ae89aca443027b2dda67cab1ea47c88772357930f3ae1cbe161f7f92a68478fd30cc93a3e14f7ef88af88aa3478ede48661aba241970b92e847ef9825ea251ef5c7dcb7004fd15385241e2a0a633f9faa1e6ce3206e50f04b9872fa6cb8cb810598a41b791df2908269edf3de9af8e317acb2865e17614bac237a036828722fd5c02e0c51dfb6e998b10ad179ac76329c8fc1144f7c24bc1382ab247c20a79d189a65b8e4afb4caa662dfa0f3a4b8bdd27a0e4f05357921c9dab5830bdc98a38ab5233368152411879229b82d4c676a094092f50e859505c60a015820e7d2100bba79359c8c56cd6133f07dda8eeb465cacfd0031dae43cddc1e2ffc667b3808f2a4f305146a67c2fdb49082b60535e05b9118b1e00da51637a261b192233f029edf37c7f3612b48bc499e9f3eebcc1cf08ce480319e7368087b72be0426581708bd27d657688af2e73194d46c7be2b99bc0111405c165bcc20b91ac059774926ffb910cbb9643490f225139b440797515bdc6b71e3fc595b275498422aba7ba8b7d6168009716c70ca0238c1005bc03aa2265b396b512c6d49fbc406eb9d690a5da3780ab6111e27aeab3bcb126a0ff9734a4ddc0fbc90d41d080014fa914aeb76cd48f166e8222f6cd71cf4e6ef2bec8539731564d83713c6a95705bed4b9fb665e9fe355c757a8a4d22fa7594437c2bdf282bac74772402bf73c25bad705560506288fd4a429888aabf0f1df6bf0030a45d05c19f5593fb569f5b6a7fa5793aa4f60f50c9bb80a3f46530b2400b2b9427f59467eb1ba7d030b21bb488402a4eef12f42ef1cedc808b61b73549120b44349bc0b376ebd340d8b92f665c1f54ac145c763ca4d3368cb17dce1f8a555e4223994bdb5d60dba41455224cc81d4e8300e5c653e6fe988aa51e9f78d0d9d6e31277f5453c07af7880a2dd27ec9ebf2b1d8c02bbbfc00fe1cf5700cebf701505264ef16e1d3a174d2956b33b31cdee30907898e3bebdb7e7a115af3d11c7438d154c5a9a6ee7833a3d7a7c402108474bc23ed1485ab347d76c4a28eacd4c0faa97f0f00812b8a14fbd16b00ffe41d874f4f8d36e57150fdd270eef0f120af5b85c4173a152a45854e2d99d2af377ef40c57412e965df392460673748c553458ce6c496a4fb5ed2b0ff3091cc2997577fcad85fd76a484d2db2dd74c5da79d9dcaab317e03b19326788819c5c22d5086e1e8b4bb297ba45ed9d32ec4c5a4cbc36e59f145e426366f4acf0c0a707c72752e2569333d58881b867bf4d4bba4bf81cf896e6603b09dd892e36bc6e3b6492ebc9909dd6d5126249d61beca044cd904b6d24954796c22e1d56d1fa0ff212e8b601f00c72ff820957a55a0ae37a62538a541d93f71e010d07dfe3165bd0387cf8b7620797bcdadc7845549b108e0888768581291b20f45bfa7e9d2afb543354764fe1dbb13e43920f8b04607827959d46a35943629ab869d9a6c3c08b5c300424c605cdf515f451c0cc5435767413835841017f6a0e90d081c83f4209bccbcd671018a539ce55bf344ae65c8ec946830edec57831a576dba2a3a01a1496d290597a7c7b0538fc8e7030b10b85cf002194bf672916db2b5bb6b312e5a3b168287a87d45aadb4c5aa61e2cb86990ff29a8effe3859d3d45af17ae3a89beb3a365febc558305b195c2e0c20e476acf85264c4f07e98542ab0013057f2e211833ec8eb99ecf04b1fff2d063fa7d6431301876959350f0183ebbed7dbee108aad5dad34c3515b0007c488531b3e293ecd0b1390363598ea7dd8b749ae3eb14271f178353d20884d60a143a722e3a53e2931e2dd16e2e62eadd6ec444ac9bab46b5c786037b6669ff9d28a405cd889b2884a6974e452617f639d18eda0093fe2d4ca790a7fd2b6456b3cee2ca725474f4a58523d13922bf294d007e15a61a705964ff117f79496abc085e48570c8601bd89b5f585336013a50eee5e911f8044abd9f27707db28d093d7a2e8c59dc24041c76f039fa31d9c6705b853e36530f5f4c389aef084b58043f141141104d4d77a6403a562c7cb5c9184c7cb04bec343281822196d10b272dabc89d151e04c07082736bf2cf0343b385b5612b96ea0713d8dfd64332c67c4c17c29e1fd1d25bc0ed4f65e4d48078596da8e07b692a111e589739de10abf0e8250284286adae9afd3dfd4243854e066bf961d3222a1c53c50bd7385a8ab62f6a7571353ddb806682e882887a41edebcec6d3126f0f90395c0540ca61ab30e07a69c4ad253cdaaacab97fdf31b4fcf43c349f3d1c2c9f2874ed7019a352c5fe2a936d6f25551a45006d45c8bd96cff227d5ecafd91fde4d280eeb38be89327314164181a639017fc50be09ce8eca90f787fcf7f46110d3232c9f6047a107994f1a780b4e2c7136564cf440b374b8f9b79d048f521c0ff680192c23036d00f0363246bc689cc44fb49bf6d847b4bb64469fbbabe761dc5b6e8b08c3a848dc01a7854d749161c31423d80e4dfa601d5e34aa939506c794441150496df81c0621a2acd0c9954289db30b439a0105ad3028590617a5127638edc04ecbf620f1937e5bee447de83d8ef55e1614dbea7b0781027ad222ec0e6a23d05378663f247fae114c656829a800d40fc9fa79e8000fb4680de846cad7511b19619094f65ea4c7394ca925656f6ec0af2695d843815ded69c8a260ea95d9239eea076ae8070149e64281461afea2724b68a54b7def78c407bf534045dbfc52088ef428f7308199c245642b034742c0b688186459fd4e0af4943dae79e5f2471c3f38d8f78fecd62c761af0d8f5750042e17250ee3ff89f3e88979595374d36cf253937711c85dd27930d666ec17f179c3d4a43df7e94c9ae16658edc15902ce52db3fe31a742ccbb846c0458be4b994af8935b76991392ba7ef3f3a1bd4cdf57c05880dddc84c8c7f5ec72ee2fd35af4ce23cca1c9f3b1bc76bd72ef4ea7ce0dcf840e76e63e9df0cc90e90f946dde9961a4465ef0f5af50a4634a7bd973b46aad4669327253c1b22b0ba040f8b9066c407e6ce611bb7df79c2809bae885b699620b5530a12d586ffe60cc3f8fc393a81aae08e568cba0518fc967def7655a4dff915d826b582e5d36d6150958243b33b5fae836c35364fc4984e2701e2a7e2518df20ff85227594aec7ba9a8c63f3faa7b6adae221cd43bb329f74f6553a650c8f1d53704807645264c8ec97138a57d2da3b5baaf8fceca022ce3305a1f074e7f59b5bb51aeb2482ffd7c60ca74ae2394566b75bd3ddd9b3e67992959d8a78610d9c69ff139abab8702f493bb1221f0133758dfc1b6933445be008085389587400c1fc708955131516e6bf20a1fc21cf12366c22cd991d592da5e4b87bdebb30930b6884d40d2fad44009ec2ed878354cc2444951b08555556aa321f175774b33d0229a617d0733e5e5ec5a3f7f9d8a393be4f07ef8656f54f23eb0c6ed8a93bc03378d73e1b673c25fef9e4ad2392ca2b3d82872b14bfcead917e3229e667390c0f914772c691f54a8a26ca71bfebeb15b77040aceea74587e564f415400fbed994bd425e553a341702377ce6acb179d83390242b4e857af317a6296bcdf37345eed8d0211f29959a0244e98c08e1f4d321a30a1b3fe2ca5f23274b1a9e0dbe8148bcbc70e77f80894bb2b5d85eb1e2d4dcca3c7a99234ddcb316f1450ef5aa6d8d813d8deb6fdbee8ca1cd8ef560938e82500ce832b85950fb8ce18bfe7fbf637d5e558d1e25220322a0366a4f7f3c641831097251c1e06fbf7cbb4afe24fdbe44b74d13362c94a2a516aeca7a7a09c420a90cb9ebed02d03da3e05421e046d8f80909a65b17450d0d9ab0064b8b6d933fcdfc8ea385f515e0c84b7891f5e8cbe07802f3540737b93cec8cf262c8c95660dfdf88a7665ac64f099f53e913ed303f8874195dec7ed951343a5793241cad228253619cbd5f77383a937dab0b0739d1b5e47b44427ba3dbd8cfc9adc970e258d6cfa0c18fac4ee53c4af0f70d3fd478e9ddf5c2933adb9731228b07556b6a6ce1f9893436574d090463c4eedd811a5bb286e0e704b054a281113d2cc2293b74cc6ebcc58ab8c69e5ba7e027129c01910b99b190f6430d35268775039f2b16f7e455108e1a9d4b926d160e98a5c06d0d3168ba2dd38dca4ca2b5f27530f495387f91b0badf75dae385865525c30b9a48506242ca927c4da648160fe8184c625a1b7417898fd695a9bc5ba74df15f913b3283af11926cc2de153c93030ff63c2f58f810c0fd74ef629415e9c40a46cb86f39b36fcc695c223098c0c36324c483419c9d3d40082a1ef34eec6790dc6c4daa91c8ab0be0285af9955b3561638ea78b0f0386a683278b211368569693f87107e055c767c8d86a81b5e6bd9759759e4fe69bcc807bed7c6c09b16bd030a2923d3b3d1f6cb2b9b9db59d254a4249e4fd05d2392c6484834ee1457f8fea1223ff558c8684a12d020d385f8371edafdfd68403a00fc0f35e576c09dc4c7acf98eb66f6ee0c60fe635eb39f9061d61ef7237eb0f4afe3b481cfc301fb649c2c822f840eb6296d7c30f5d3e7d300c1b4d62afd2d190703d4453ab03c801eece12fe06a473677124a10ce0643b77e7daba8ed24d9075c60285bf5245f5d6c1afe20d45567dd0859f58b520985ab99f072a6b07c945e8e283ff31c835cd025c3248efa35a9dc0f42febfced9a145c86112d4bbc109791f960563e1529922bd2a5b22b4d6a8d1b38721ea636f8638d4696cd79a05b1fe9567f4a814b0b56f399f2216a184b5e4ad98a3cd3132f1f73d47fb94b4b33d0c1423e2ff9a67cd4c6ac96228216f736a8c2449b0c7f4d5cbad87c5801a1eceaffc1eeebc3216d12d7cf73b7605d60ba1cc54c1c29e139a46ab958f8af05b40ef019518e92bc007f53731479348100b4a42f5beaa2a07cf11d0d31fdd6b420273c5506ae9faf0b0d0f1319f63aad9194a175db516078ab8563cab5ba9d284a6ff62d3bdd0b7f83ea6768c04f577519a9480778d270fb9d327d1be684a4cafc8240857acdb809f8974b1ab0fe80383bf1135fb1e1bf219c9266699f1a89bc6145cb6de0e79e4e8c117988fbcad12a6ce7bae69f05ad42c71a3fa8dbd1a76003d07396f4da368236ba747f41ed6f49c73f42c99dc660e7fcdbb2d37602950e3b7c8e3ca21ead6ca1bec4ec4305960c11aef7f66b6b31d8340c2056b370e0e70b7981c6b0c51557c522e0f3fb0bef30363fa769e781004d21716fea19852a617345cf8737f7af7dc5f45168e51469a394d5ae4f6002d84a149a109999759c2535a015445c47476cdc74626dc0d3bd740717a0544d247f409e80eb689ea7f5d6a30453da9b16e489f353f9062415d486f07f7761f07230157d4cf82a654859908cbf56081e72332d74cdcbd6437c7c0651538663ea30a2274cb08e22081308e5087d41d79fe91ac0e2a0aa0dac8cb5251982610a204e202497d4f481a54a5e6f862527511fbabba9971cc2076551d261da02790f8736f1cf8abd0152600790476300011364d5a155f7587ebe57ac74a0443f565bde257210046384be0cb600577350ebc952570b76380bb56f462e8a53fddebf8e9072cd24abf54411dca11c6e1ee8c321fd27c2d9c70d564c55be6b01019ef8cf5c7799246098082d02ed1cb4c6d2488cad85be001a3e478017143deb077906df5fee2f1732f07d6818691d9e86921b8ad71d37061508b5ac096e15059ee3ad22104e38c0e33e4fd1797e4bf40da9448f04b2ae7e338c939d49cc885430de3967e81ad4335d922431e9024559cd805f31883ddb668792c95ee065f284b228eda991881b30a02ab27e2e5fea0ad05b32fa2b9ba25e922bc876e16607ecd2ee32b040287075ecc560cf1d1f7529676bb516832b3a19108d1f4880bcb0a28452a28bffebde03d2f1b55703b00e7c16288785b0044ce7f4a7b83eea3a67a7a4fb8cbc93b1f203fe2aac74e50904752b01dd1873898667cddb87f79ec97ead5c86c018e0992abced0ba9bf7d816f88e299870d1d7b66de3520b071699b36b37f27f455c837c4a10b88c55f61418f20b882466ae6b8506b425837879df54cf8c3a08e39b6765f8d2207f02bf496edc6bf8027335855df95b76ef174348bc098c1a8d159f3be4b735e5a0cc50acd25c400ccb6009ecffa5c5abf305e1318a9acd6a0c0bc2eb1077875360c6f98b6fcfe1c6bcf6bc0298913a9df8111a73c862dc67199815233f4d9ff74302c4de568c54ba7af20d3ac36838258ec0c5ee669aa743ee773a268df742c1ea7e55b86012de7fb63323a9a7a57b0443f8616b9a397dff88dfbe0ac207eebabfe7f65973b865b00f05d77a01349b011e99fa9edc9db1ad64d167612d50673c5fd2f06a5666ce4fd18349f9084973acfa759c8db735ba226fcc2030d9fdfb6ad3fd8a459aa295039ae49e119fa016500443ea392d972b4a660558b7bd9d5c93d69770ed292ecaaeb6d0c25cf087c31c3b8851128bdd6013daa9901c46349cde7a14f3cde20e8ef15a056285c626254ee62ff25e5fc30692e2e712488cd63032022e6825b4e8cdddc1820db0048d2087546e8649fedb5b3b51d34bd6d3b0b44fb7f6d2c5c48f32e37b4a1715c876dd740b8be800c7d17f62de2860bf48795d422a4bda1947803c7d91d66b264cd106244197b85977973ed06c890e32c5ea26bf2b5fcea85cafa93d0b99346fa070fa1ddb7099d457115a46dc291634838ea4f1454acd0d063caf0ff1974c30c97c7f90ac0c03f28c6f7a0223aef341da4299d215562e37e29e4d6c5605cfc927f4db1483f11e096a4594659f61665db55f64196ad01b7ad9b3b3ed9fa5082da1d4b153ee5169ac0d0ac4e72a7740f74882e47e216e62852330e8c04d01307438cc57120bd21e4cd877feddcb28e230140c6b18e8510576acb1026dbbea36c29520b748c4814c4ac28cf222198bef1fefc8e6ac929b7d2273313108aa3a3a5cd032f8950c1e94d370a1a875553c3515450985a59941e1469c1189293ac683c45ca96718f64c4b796d8189e4cb9d4eb0b86d01f61d95a1a24259ae520b4caa69c10670981ae4499e391082303855336b5e2165984d0d09631854e52cf3b7014b8359d2545baf5c6f28130cd05b3f6e70fc3658847134b6ffdd727245f68662cdba6e563f4cd8f2db21d2ac8b0dd0823b7d86fa9ed9e62b3bfaa5bfeea89390ceb49868f0e17e48f8dacce47bcc7bf99a113219d4819a014606e50476a38ec84bd191b94486f3d9deb73416c19779c9e61da2693c14d1197587393ab91c1ffad789f8e57e2365eb85970cd018f285aee9a2d9dcd69a1a6b9f6cd2ce64eef09ac96ec01b59013213b2075bbe55198dae5a26bfb317a8a424348814f3858d06952df941e5c855534ca9bd50c5dfec04591386ae900e52a0c266305aa1e94aec6389912df092656e65b6f3a19641f43723546f8451f8e42a32b6ffe015a4597c9ef20b4950c442b43f153bf88416d6f199910a02d42afc26e6a77d0e613248c6d0cf825b1ebc3a1d291c0e39fc93f54fe9a88a0d2d38e85f12fb0929923e76589c4dbfb274a3ce1c25d54d623a5a03f56050a49eff901568befd03e08c2f621b9226efa5239ba7b01271cb0d550a39b267789ac6ab1a6e12026fc65a1c1df5c52c50a935f40c31a710f5462a9cfb3b11cd7bab818303c53e1f12eb1c1011874d52edf3f6ed97b07ace17b170fac78dd3f9fa6b0a3bbc111faa1299b448e34864fac6842f43763cbcabc49686852d11f579a0b19a0446b0b3930ff00ee29e16d5265bb85ffc9d5d21ef20bbe9f38dd341fb180e959e2c2dff5c852ea3a2a9a477e1c38829c2bbdfdbf6d58748675e081b8ef3693a823466c23851bdec6a04989d81ca4277d2ca2a378b3dc07ac4610d74ca6f653c9182b275a1d1a337673da8451894ca32480401b3ddd4d4920d8a609e219c878f87c0c93e19c3511256c5cfaf66afd1087807047183d1f61858810fb8495fd4869ba0be631ef0121e2d07c8451b63b90d5bff156ce7b1a74d01fad3b2aea2a24ff09a047b91fe3a6acea067e445ccbd566f518100156cc1f82e5ca0f624f8d0e8ae1c9212bf3fe1cd0a18abee45cb2ee70e0625ea228728afb81cd89319e23e0bf8a7e631ca750330bb82924d5bd6ce925294740c0b10e1977605996bec151edc812e01e9dd05a26213472a3b721215249aeca7ed2958722e1f0a98714496f7208428b4cde00182e8fd64b23c0ab776d304891d64bf935ab63421076bdee80eb036dd66cc59c76055c1f276b08fb9e0f150e78e4807731bcda5b64bc4b0f17923425a9ac4ce6aeaa63bdea407c65558aae184085dab17ae9df176158fe76d63ec86685d3ae8934c51ba44d14a7e7209cead59d49399fcde078bb4e8b7541a3871ddb2ecedc102149412bbffbae2daa3303643f38cb9e68606051d77d18f405c6d24180649af66fd6196caba5a3dd229eb70dc4f9c3a2eb757f00df22fc945487b9cefe6d66107714406a2c964cee68c4e87956b5f81636a419e6d72b2227f18cc02e65d8fb180a3eca4ae7f8172e72756fef2a59eb8f5e5727db3bbe1953878afe2553c16436b14214d21cf019c95837c986428e4e1732f9de683aa325f3bdbe51dca959395c35e49cba69d750eb3d7743289c6d7f0eb9c62765e6d36e0efd873848600d5700085ec8a6bba01a5619707e18d8ccf2c3625650b6d0e206a12382cb5beda4ac2345ed9bb2e06cc9763018e4e2957180da444b3df84b383d532379bdf9150724bbfc5b56aef5d67de794b47025b6ad8b702090db4c9f949a982c159791e0b79df8420318ee63c37b87c863acb0ca50c0e5315521b54ac9f5d5d15a3998fa249e07fe3aae7683fb869ea7d054c59ca1c9ad9faf27f774ecaa3bc5fc5c24bfe306a64a2fa554eb992aa962b6b85608559b2aa6347d29de1c230cfa5fa7dd86ead3060bfd4aa060ae2978a1a3647d5ea53614603dacaacacf0e9c2a7498d961a5e30204b7538a79c8560683c0d4c933292c2ed2b9a2f48ba5850fa01cc6f9933fec56fd7139f72f370405032572b1b0cb83cd29463f2a459bbdc17214124581253538ff0d6bc13122dcad01fb7a2aa1fabe20b1207504357a9a3cbce137e8cab070670c0f048662d2a096abfb641fcb96984958c9d06c8258d77ecc99cdc7f654b4aa8aec9941bbf798728923afc5d23c77cd3ba8cfc9ee217018b64b7cf4f29d3b9315d42e20e844dc6b152c033781e0bec53378beff42196230e137ec690c71a910d5d41ac5bc5457196e3a7bf7c167bf622bd4a3aeb78bb55c8b3955d78cceb77ec2d0f0c7b6d1650473ca9017de5aefc3944e650939fed5918048d7ae7edcab006fa507dc6a4d520be9d770530f3d1a8e764f1682500d9e09867e1d0c3031f1eaa4893908cb2ce248f8b5d660b752e4519fe3ef4775450b137145d2ee7225f90bce728ef44a5e89082ea668d85fe7ed73c45a05e636b65ee3b34a0bda9637366bde0cc76eb00e23877de97313299669dac754766d306be9f216c00e37b6d89dfb0f0a63a6b5862aeb37ac73e1f3a869984a4a63913d323e7737ff13a46a3f89282a8f953bafaccf272b7a9ae44a992a1981da6f0558c3ffa5851c11d54ec7a108a0e91f8bc447feeec8905d51718c06b2b5e069c73b22cc35edd411fcc822c9f138ec27b730a4d0659b6c89363102fba2bb8f187addb32ab6b7c7e90d2839777b571d8a13c0a1291bf738a2468ad67c007df78de27b7d21998c1699b060e9d536fd07ee52d2903cccdf4846b6856fc8edfa1c7fd89067b7e168a3b8ca7443e50921bff53873f3b1c4403c1beb2a8b2bc080b60096b795ce0042f08642226b3a1d360d648adcb731fed8d62502db827240a452564c331f7cabe8a3a1173974dc9ea13bd5acd17f28633f60b9841d227db25756f13ee25e4d7e96dc9f722c25c1de7e68c505d37e07d916079b6a5c9255d2cbef376b347c026985d54793606dd91f69555ac05f408b10a72b983a195a7ffdc13fa3419caac046e86361dbee6530ad7abf0d211a6441557003c57a000b194d6085dbb34aa44b90f2ecff9f72eafd4f25885fa88a2518bdeb8187d21d4602ddbf3f7aec7a32e36ef29fb3c4eb828aa5745e4834208e2f11611b727ffa0eff2384a965eb36afdcff52b90c74ca0932fe0c39ca8388a481230e3fd7ce7b74609a7df9c4d2ec4c9ba85f2ae27ec212c535a8bc16fe1c64bb481b3e9f281271486073c180bf1d29acc50bc0253b586eb66642d59697253f017d66256d57429e228835fa9fd3cb2676e70fd550b449daf64db09041f7ea2bf24d1efc659950a079758ae04de7da383d382eeaec7cede08d40beb6ac318c23d87927305c6f7d693cbeeb0fced1617bdad3de7489cc8120f3bae89856abaf016ed94fa4f2a4cdb2ef5a5f5a2540c08ff555716e6b9d9551b22e74b13c5b7dd9b8a224de1725707212cb07b40a38dda173f7303ccc0e4e670a2e15dbff4616af14b0e969cd32715d0d9b6e6060d7a068ffbd4c55bcd47e2a84586948060794b6254de41293e2b287027c24d11b48868566e77301210ec9304ee43f2fb4061710bb72028a694780eb57147d22f0482e1dc2ca23f3317710d645de9b507d92371e9a2168310b9175c108c87afc14858cc262f6053800b11eedfba1c3582168b03b2729abfc28490c1a79984fd363fcde1aba7450b4d9aeaf5762b4e0d12190d593a061d2f0e568ee7a71719b73a2a835c490e14945027dbf21c26412c416827b25144f44050f051668f3de077bab8129baae674e5791bdde719f9f841bf1e1940dd553f1e670035610494b0139e1d25aeb31ddb03d22cb5a3563431de5b14156da0f731ab3aa7a340c17cf45aa2a44e5e1a173f89485c86766e2ef836884a71358ab184453796f7d858b62c59fe09f03a7fef82cdb84dd1f31f4cc907ffdae2c088cb3574484b7cf8b867f1055899dd95db9f32908bceb6611b33f945e87b63f6382ad31060340ddd492dc6a4f0432709af2bb5ced571cc21b63f15d3a9f4000c69b0bc760190964b149c78f97a039ab137cd21e4d2f33e845f9d97d0750ccd7b8b9ba8fb743ef53ac156c43f4a71e9f7d0e66f60dfba4b42ab68822b8fd95e0d09e97012e9c9abddd060a77c6a7051babf89c800c401dfeca4a87dd95379b0a886c044a3fe226d58dab01c1fbf5c8b124f0d63831ca4a3d3b404faba008de844a7a06ea7ba2ddbeca1048f00f3c9e7aaa8b9fa98caad3e2d4b2d961c4be25b3232a226c06292681c2fe620a79120ac7f19610ccf7dc664cea4cbe93820e9f4f4191b01989e3ec7c81f600331a43ea2d4c51ceffb69a738f584d53e3279f117ca488441d6214df6b68de5df956605b3fe8b61f8271324dc7f5577673d746549cfa29b03509af16028a2b9fd5027e92abc67940741c5fd3c8d086428a49cf7de57fe076646d8d5c16ea9c841002af1cb85b985a9c7738785c6123e447f63ec2ea43477598b27c85fdd4046409b0def03763cdd269842659a069e0b681dfa8cc49992217ec45db401db189510396bde09fa8685f853ce621bf4518ee61ddbd145fda3217c04c19a03096e30c4e8cf992d15c59f0a42d5cf123fca9733d762c1532a341d7744328f645b60ef7862b1797dcdb89dcf5671cc1c79e5b1af436ae83052703b91177ba120b1243cb4babb5e066dc7c050fbd325a5ab56c8ec11ebfeaf518145e5d85cc86d564d6f0878838bc2a4f0149351ab240fc2c0829a9ca3d41da767aae0024a8edc3c9c41fea1474d709e0eb814f209fbf0848c4f9aedd629c3a9412c9e564b9b986f2c788954a9d1243844ad43eea306b719da9958241e9950ecc300675fb0301daed18622d16c7e301ce0fbc57c8236317537f5e7b390afc7206c4d939193d9d86c618478f0ea91206b1279dab7db48e282d6bd35dcc69921d2f10716f253cbb1b1d48bdea7e4bfc08d82aca07fb582306f77499e594ff7f72b6bba2ecee2150518fa94a969bc8302088bbf7bf8d9b8f5195a549de2a82679102441905aec184e30e58209c554d63da98c02a360f5e65294c034d127cbcf8be890bf7839ff060398dd9bcb10a9f0a12b4fa2e665703283aa0a99a99f9066a4d2582b97b4042d023ff848be6f069552a8e6a2375589784b4b6f7de5bee2da5945206670fe60e850eaf5948490bd121773d0f7c43ee6aaaa61c79e052ac9a3ef9241744e9e7b99894a985a2924f64c50d630ba9d30ce0f012d913042189055c5cd14cc20eeb9649e0902b323d44a91e6298bfdcbe68aea8a4c30ba3c30b438738a54d9a2be2a6cc16a5147f5329b385b367cf2249164bdc40fd94a5121a90c247a7cba4e0f04aa9dc11cec81770c8011da9f437e6be53a2cda43a5543cf89144e9820054d30c2143040c40238d082100930500405ade4f5d25c1157c415ad3c7e3b2ccf992bb791a3129c1041139d2c8a760cc28e4eb260b2a378828a7db363144f1cd95d07739a4d75b680d409b60089136c79ea5d27bd54eaaa1cf66cd5e7b7a37a27bf1bb274791c259a61d8dcb3691e32370c2d392069a4b2d8a9e75055069fcaac96fc92c39efdf2f8edb09e334d39549a4cb6c2e4b84d3037c1483965a779f5c3914ff36752708c7731eb0247273600da2107c401054598912d4a8455dd198936f335037f650ec964cd771cd06ca93ecf19992d18189fe796e09070494aa552ea1546ae139c2d0ee8aa9cc50e873c9539235c295b1d4a7ae96382f539546a2ec904a7d51c92096a1791212407a40df44434b5dc12139ccfbc804d0f6910101502ea805eb9246595f539b324aba4a1dcd69ee62a69f89820a5b72f25afe7d0578e71eb771d2d494984b64ba597749784ed7e26f8f970b77c1213a4af559e667b972cebe7e2f27256ee7e2698048eb8ed5f722ac6e32e325b40e89322d367b6802879bdf399e08c30fad2dbccc31899155dad629856e16bc73c9382635efbafdf0d9a679a1cbe36cd4a64d1bc4ef392a6f90ccd651ea98be656e7385934a7f9146d68684ef3ba05d1e495cfe4304626af7248a9b0e763e4a2907ee5cfe10e1bf59895c7efc6dc5cd104bb8043ae087553c6051cb793233491489c341165cfea440b271bb6a3132d7eb6132c9e38c1c20a7a289860020a269240310328b7088a1964b1e5c4024a1442b0220a213861c92d97a68c0b585e2813947f6d79979bde75df8d96b3bc8b5fad9994fb80d736bd966e3f1c2d6771c151d2e16b97fe72540ee546a91edaa41ed638bd1eaeb81ec2803d9469c13cc4380f6fe92bc7c930394e1026b3e95d3036fd2b539b4daf4a5d7e37e686a1a90e4b218d12d22decf952f8daf62e39a4375d66202d67f9fd765674c4540779ed16fdf9407fa3b0bcc5ea6f670b4fdbf41cfada2c8fbb8545df28a67c89eaceb6c005d953d62127e48a2e947abbabdeb1c32315dc941db518ba000cbab8811625b0c04c0fa2d4e0045fc0010772c0055117357141252e48525389c66895af5b1dab42bc3de46e25afcb4fba9e33bb178da100d3c77dd2b7a367d31c54f39820f8ca524742013f71b9729c2cd9f9702a0fa9167078892e94d90ae916b3d5c56c855cd09e2d395bb355345b21c7245671d04d845cd00e9aadfa1d2e8e4456dce10209a59f0f74d3cf0f08d75fbf44d4e5d22920a28e4fd48248c7871650ac00892db810039d195274a28e8b2ba2ae97a6a88f87c6b8c0503061c58e5030f144cc8e50c4a08b4d634888307a25aecfaf47fce2a5e4f59cd9b9f24bc7c90ae9902b4b9d4963139c5be0ef18c513455b45873249ec672f210b389448688cc69060016bffbed8955de0f8e5a05ec0380f09e2cb3fa6809325df848ad850142aa50ba218c404e5e592094a1a93445266ab9e66b1c56c511d87a2fc98a03c062728e39dc492188a4e62459e6441a3501060f90ec90d534e810b242a98864a85cb9e93b5355df1b6d53de9b66ddba6c3abbd67d4d24aa93c8851965ae1236d9bc71a6e7b9c41c6e37376e0f121c48f218ca0aeeef1d247fee8c7cb2312895c2283a41075991e673c5e522163724812bd3cba3c5e165117eaf1d387ba5a1e3f7f26d03c32916c3187d363144cf0d9318a274cec90b4e723d18e512c61059b1461f5d96d1e89e8417ae91bb57cc50711d459e6a641e32e2d3350a6192698fa971694fd57e249a9745ecc639e635637bfd1475ce6662573a3b5100a23e65dbd4a8cd32c445e08113d48c7a717428412ee427c10a1f9ca49f741043c4b16224f83c6b5b3b2107a2284f448f550d15cf5a853f31ea91e304ec369d047e8dc1c88a843c33bf9f1d45c7e3c37973c34680c906c9e8b64d7c0d5399d464e6997f11e9d8eaa0ee39dfc7ad05c75ea033c8cc7cfc78a0f96c3d0299a3373a62aa7e8f17b74b4cc33c3bb195975538621754ca88fc6bf1939d5c374d555fa88969b74ca549a1ecc08e6dd8cbcd2a91e33befa4a1f11f3193ad5438586ab98b28c4ef5307dc667e8237e934ef5e86ebaa99bc952277e3b4abcaff28c9b6672cdb3ce264b1d13b8d1f85693533d4eb7b98d3e82e6279dea818fa0c14609f7f1d8d0b8bfa7211369e2e6344ea402a6cff80d0d5d01d36462cbcfd03ea4931ebf9db96482d2749b5c334396915f9425cf02f30e94254f9367b20fca9297c9abfc2346963ae72c8f4824720965c9c364194459f230b214a22c7955964de45fe45db2944259f2a82c8b284bbe254f9ff94359f22b7902e99b53b674d24b5a0ed5a77a90ae72d255b4f449d1a77a6890b2e4497a22a12cab79465a52f1fdfed33256358fa787e87edf6923389dea71377de565f4649324842eae687c8872657a32d14f98f674b26784e9441b44d67cb8ddce3b2715333687708a7083263e486890a4313a5483ea50156af243448ba28e9c41545424f54805aa3fd5e7f7891138c1e20b299250031e8e70030cc48e30450761989f4293fe60f919a471005f1dcea04a649bd0493c75ddd1d11829bd41b72c6d2f51cbe8e2b668332fb595d2d62dbaa494534e399564373070620324ff8a66cf993d65f6bcdc750c5becfa3805197c76d543e6a6968bd2ebaa10afe36cd699d555cbecabc628b9435c4ffbb49259720bfe5ca1b68c30b980193021850f7cc6b082245530b18514a87002293f23c88e2768ad46e913decfe40d75f5ec80035e90c106526ee004078874f083256421034170c2073ae2046bddd20a38fcbea12e1fa090e2470928a67001500d3080010c64c00325c0a0013ba555f21dcf7083257c92e4808b3074010b5808420a5c5002288c6071ba6fa88b015a000215946ca148144f74e65fd415ada085221829fa819317c44067fe6050373b2674db1698eef87d9f730b3c4fbf9def1136ca01002320d8dc679ea41da3e040d14ec96ba4edddceab592ff3b44ee21a13dcd92ebf1d252cefeaf7bdbea66682f4d32191fd9dd26d81e841419005bc4002299a58021474e2647db7f9cba1b5ef9e436d106febd764d17b2c9736b46db36d5f23ac744bb7bdb5971176bafd8c30d3ad0e83785eb6916b68813d4abf7c2368ed77fa957c32e5196dec4bb9461b7b958cb33d69db8ff2b6f3fbfc72dcfd75355e36662bc6dd699e67edad7da73d7a6f6fe1906d4fb76b81dcdbfbed74bb8ff7f4dbd1b3effdd5274b95b0bc63d1b45b20dab55b5d33417a151460edda35a93d87a655fa668254ee9ad9a21dc0192ed284bc066e9a5b12bab8c2b3153b19e71cc5084a7cf950b5e3d44a6a8caf533ac19ba36f790d08cf568dd9aade4bce1aafd9ba71ea186de2ef1458109ac2175638820974e451d4650383292e5082a2128ca10b1d2949d009c11171d0fdb8b2b64ab967de262bfe5e8c51f16ed1463e66ba63a431d22dbae4b6a9c41be61ba229107d31596df6c53e2610499c4c7f41924611653141ba3e2f24cbce2089f3359134a607f479215d1e093ef9c466a2893dff35913ed84c360db60442154c44d8cce885c8d7c7af660ea4c78333879feb90f0a327c5138107e445d994c0c3559be9d112a32524ce28c86a3e16d0c228c8fb6cb8c9e14559f3239a55fbcae146e258bde3958374f5e87a784776481c8f05d10b810bb607146d2aa534866df6254a3449020ebda13d2d50f725b91b0938ccbea0a1264c966cd7d784b2e6fdf7116520b6be08cbdec40b11dcf628888e463388e0d451424cf32155cd47d340d5a3204943d38074491ad01924715ea3a07b892929862d8de17a0f28c2262799c02c3f4e86302801091740018808496881148610822b848a20a1332f632b99978df591e12b5a928f80bd2d26084a9b19a75a6b666d66b3ccdacc5a9927134cdf99be22cdc72bf2a27857f0c4e049d91e195c8c00146db497c4d14010693ce1678b60cf87b021a2f4b1adfe51044cc2ff6256e0b9a5f6133f20a28ee6438980e5e4992f204004a58684c440747d4511f6753b94496c52ca2418d55581ef9e409b0e41fba1ae26c2b975384d80d89ae7d922da685fd137e52b4356fa766e10ec29a5d45a9bddccb6ea63b1d84c62c7d000879e151e508c56c48be26d913f202f34a1aecfc88c51d7e74389a8cbeb62b23e29f35ba2c9fe7e422f0ad1637e10cc59449b2c0b590339834c8b8c0a7249b685dc413644050e359f255cd80795049565c94410757d5f44d60c62eb23430497cc1c4a4dc41c3cb14748ecf9962553e0306b0288a8a3425df824574c1261d2137a22da8c8e449814f8bb7c7863684bbea0961d7a4057e06c871ed0b495d6ed340aac3df4869494ce95bea04e5327f80ba2ae0c0a9195e45b1261dc23d8c520e660fac4228249b422d1c6a4b50c44d6bce681930e332bec79edbbe1ed4d6b3e50e0d063b2bd7ba8090187415e5b7ba7bd214d336088ba3c2be6d0f4ac98ad2d8684d8f2b8f0acf0a2048136992dcd49146f72f58d6d6bda32f1843c2762cbe362d31e933d4fcabc7a26a6b7a4943d152651e4cf91ad42ca9288b29698ad2a6332c6801b191c613678401e100d9620399245f96249d8a317158d748dd7cb23810774b3ec6699f6c4d69068475e1287c703a22eb9c4238174491abcb2efc650b4b922da64d709d990e92a5e94ffa0f7626c42a14abf0a08622d632f296576332f8ae745f1342b9a38992d3b5b14d47cbed86c659e0e5f373804b5a67fe04c4e5babad75861acd6706cde70aec693e1136dab409c672b6ec0db28bc99a120a131a933db39849f67c664b520a1066abc88e3c1261f576b66adcd072bd7080e17c3bbe6f28da3c99e024bd23e52674683bfb7da825916364ddc76fd339ee25e578ed9b1266979e11f92493d9657620f2f6f5dac37a191b02522f5ff5bc1763cd27b25e87267873dc5f4c0e49adbd23a3afc8039aa09443310f68bff6f401c63b42016568773b46f1011eecef5b426cc925c49e441b19abb6b632bb840656f3c86c88b226a59447e27cb1188b52c8f023c2e615b8db61bc02a76e685b7edbdf0e63941f1136925af3e90136126141a2cd0862cb01119cf780b6e6134995d24ae948f391b452299744e95e2492c4d4daa118294f9dd68c5dc4933edacf0f0e639421ca836a2b494e99ada2d9a273ce496bf0a806b0ac9908ea854f0e32c1eb61b1e7b3a1087e31ce86cfbe0b38d4964cae891394664142b50689b049e9b793d11d6443747fb17985d8faca10c1f96c288bb2b32dbe29d1e62bd2018ea2031c664345dbe519f180728085d422ea0a3259f32bfa115d9669232d4f247677b376efdd0fe0bdd3a9ed00df539be6d19d23427af7ed234d6474ceea907b3b105107f3e0df9c5d9c71cebe5d9eee40449d4e1fd1c4f623ea3b4e1f316fd6363e8f7aac23e5411f29cb6ef9ecd9a6b5ac75a39c65ff72d6c4c3949559211b1494faa1be3b0f7a2e7bc769dad54a3c2dcb9e79d93b8bc422a9a7b74d3a1174b100987e5a51ada875555b9d101c534848074c74208405c901f923392093c04217573310da363b42210311f8d4b0a3132310615fa2d912226408de25d4b34ee65b4590e649fc638241368061c0fefa4b13791df61e1eaee31cc7f51e9d10b5259e81652200b88daf56a7190d095cb422a1e082224f104131050b1da480a206514821032410413dcdb5664a55573d6756960e7b36ebf5dba9b7b6c74aabca71d37a55adb556954aa552edb09ec1d0d23b1fd3a70b6da1a6c3bc33e5cec764baa5c758a22fdd7e3ba5cf9b1e960ea3b9a252ee7cea2ee96e42e98cd8a64b0923e54d261893a4a5db4c81240d9a7d3b524f221a821cb791142542db29fb52a6b73945737d2aabfe9259efa40793b9a2ce67822c8ef57929a55c6dd659409bb5a3132da0ecae9b9efc70b09ed2a18d9d8ad154ea2e8fa9b7a4503b75ebd2f2e2f2d8f2f24e7e2693c9e290b7a5922d6598120ccd4d1904ad95301646ca542ac3b8f88506b4b15187817a659cbb32ac7e6302bbe9863d3b55258dfa2a69541d9a4a3a1cb24ba6db4e7aa994e686b898fc76ac94024ebdf46468b6e6953872d7d44bef52991be2625ae054ea0ed961bdf5ea4b97df8dcac582783ba5b9a12cf02bc36aa9a43757cee138a75f0f1c0e3bfd78b88ea389784fe8b84e3f1eafc334110090600848e7f51c3aad573f1c2ea71b2cbb4c2fa54ca554f6052ed96fc7bec3c9afc3b2ebf2e3c1f4d48dba5f9e4abd67a75aa6bca43a9f16cd15c9cf1d7245f4c90469ac470e773d7e3d70f84b1391523c2105443aafc78f07ec2e4d24e5031dd8e3c703e74424145500c3900e4e1538e48a6249d3a12748c0f576d7aec804c740b4b9a2ab54af34e6041c7231e9339fc3613e7038ce5d19f6f81de0751c4d648641c98fce0b965dafa5e74cb9a38dad3387a1b1b06ed7ea38e41c72f7ca01878ca22caea82bb2270eb7a0aab9291b93d9a2b1586c094ee8e049121a94c10863e8b1011225e842c91160a085145ca80e4f3bf5cc0bf0591970ea7582a9c7a40e93532f87b9dc2b39f5f295b3ded16cd27e7048631d8d0e875890067c273f93a925460cd35b3f266ac4547a17752a47e9f6384a3a4eb0742b65a9e5f1932d2628dbf41caaca1c9309a6a6cc161734c1f99285e460e9d457be03f31c9a8a9b2687572646e6809e335d7218e4c4050915019aadb845e91e6e5d208143aec89ee79298ad5c64b6543ecffdd0c78436b8e31431a09d842536cd8e5320a18b28db65c7299660c5eea86797d42414c9dc52cb2d757561b9bd0cebd6970f5d7e43ee92cc8b49f59687e0611ea32bc57a11bd96d1e165e9106ff9727953eaac9bde92e3044d61cbe5b9226a7a8c22d3638a4ca9dbd368951e62b70a26abb800837ac8dcaa872c2c7b98cf0f0790faba551a88498772a7ae1a62b7e9546b98872e7ac8dca6c3e87042b13ba58198ae326920f576ab6c8b1e32f7cbe9e783ddd5a4436a64cbe7cc52e62eb38a364217fb3b4e518422469c6c233b56652d5553ad3594bbea1c6a32a964d5e34781244ee9951a299d7297269c504a3a94f6f3a1dbb22473fd2492b5cad75f27614ffd76aa29739a6695ea2aa7402a95ca55afdf8e4a474c9d6c9577f1f3a1dba61cca6da2ef76d5340492067de9d74d3a44b92e63b0188fd1e175691acaa2394c90cc6d06ff1c3707040404deea70b539a0d7cb97588ff4b4ad49cbe4482307441313e3f3c391facb9fe5e6804a5aea54643d860eafcb63348dee68ccdebad8b7fc256bdf0df0f67fc9a9035d964bcb55fe3cb7cdfa1c2b8332d771ab9c8640e2c4ad726a646b1ac072cb78323a8076dc3259ee2dd7ad72895932e7cedd85c670f94bcc635afe8334cff6a55b2b4393e530882dadb4d24aab53aa977498f221754b77109b3e75169853950fa55b1f5237ddde2b65d52995ce91d2261d277818ddd2a262b3e9d2b6c8f8f9d072a981b4dca481d0ac56bb45d35c3f833234312e671d04592e7f79fc7870f9cb5d5e5e5eb4179797b3aebdb05e6462bce81867cd189739864bc762b15e3f1a69c05ec75cea540e99d3cbb8b89cb38f9f0f32e72e3f1e5cce7159e61c7797940e7b76eaa61cae82d8a5fa4d55aa9717ad52e910a57a78da2f6f8181d1aa5c6160685ebaeaaf0c9ab27e290cb2daf6e053b9881c9f0e9973e774e8725bf2a134f70dab4b3587ab1cf4263d77cd21f8d3dc31e654af2618f39c59d2405c2ef3981c823ac86abb68eefa3974947118a9d8fa2c390c62ebab7c3b2c151d7190d52e42e658d932df3227739bb9a1697a4864531ddaeb773a03b896e461b42abc3182a56fd37326e7335b261d12d9b2a4b72932b95e6aae825b9b5be639938bcd96fe3cf7244ed5d68ff3b4b5b7f5eb7471459435af77b48e58026daea83e5ced1a06b1e9a7aa033a753f61e753f536658245662b46ce6747263fdca66c5366abd3db1613f4992d9256f2da86b6a12dca36b435a1aeb884295c80041ee842078cf840a726033e08c312562839820a74e6b7a04d482b82e55e7d66af5e059277f1cbb1ba9eb26b769ca28ad82642125534a95ecc8bca0bf010ba4308f4d0bc3cc6598fb3055e06887ce9a6972eb3a9a33aaab5a9cb5cd271974e81a434113962905dfa0dd5538f9bfaa0d241367d8ac82e3d4c5de55d24c0eab20aa02d0f56e133c510a44c410594ae935f0ed5a9e9a54b08c86db275ef1c71823752cf91d2f2aa1ca63e73fbed78b9e9f6db41ee979774fddf69f6eb416e697afc7a90fb25b43769151760abffc7cf87974b0de4e5260d04bc0c72b23ac869d3bc829fb94c0eeb669d7e3a56a0ae13a4d177b9d4610c1d27c87a9d208bf2407528e3c743cb61de92c30a6c18fa0df3ee7a32c3d8572176e9f7e3816e18f9f15087d0dda2c32336cc5d7e3f1ee686b9e481de0eb14b3a74f910ba611e521da3c39e0da363ee42bf1c73c75ce6184d5f5f67ebe555879d4bae97d8e535abb8000fa1f55c1e22b71c52b77c119cd22177cb3578a9533956a75f9dea90db2f405eaeb9ddf2f8f9b0bafecb7524c0eafa5d0c02c7298640b4f55f6ed261cf36bd94c3d32edde630c8b6f5a91c2758e9ebaabbab0e59b74fa534cc4bcfa1a53c739b55ceca6190d36e39cc4db908b95b76cbe5a76375fdf8e568b9d6e1cb5b4a7297ac0f4144d24d2d3a872f6f79d792c3b9552a1dcaad3aeb35db9b42b95b4e7378fa72985eba8d78b78430efceca405e9e1fbf1c74a7de92e7eee697234e10bc6982e0e597836af0ab0dbe935e4b4e3d7e3ecc9dd2405ebe027308a3839cf68bd69f790ee532d621b8674ecae16bcf5c258741f6ccbd6fc745472c7df675c4414ebb08b957cf993956f6ea5fe69e6817c839943b9f666e28bfcebc9bc95c0c03384cd59f1dca0a64847641a7f8845cecc973a6d42c808be6cea79d73cf9e199a2db96766666674c4b46e79da555361539dd291da8a6c49a4b62345d40d244e704bb257756b17c0f48966011c5ea2b8499da9e84ed97cb622db11274fe862c7273b3a79021250470652fa2ca574d8cbe3b0251d521897b466d46d46e91b1a9ba818a933691c7193485d4aa7488f2b1c37e2629c1165d841931f40a108576002028800031f142dc104a22d44cd070fb1eb1758fe08003ce5039deaf37b75782f91ac34c0a91b75d34bc93da1b109d22219606e888b4db0c600d3cb1d725f0efac5942d4799173446639428862a031edde69076c171a7dc019089c829f8a00642af57206ab1022596d079e926b82852f6e4b82c6268e69e4c3028625183287e908213749103104c60065720920107a21c294319a28b2be2c4107164c810613311f6ce48e781db6560d76cba8a2d21a69adb105b33624bc7568e2d1ab175d3a2e1f4aad8aae1f48fad1a36a7a794280ba2d8933a650a9edf8e9ea12036a05c29f3b768fe12dd282b2c0f6d7864c0a8c37848631116e3738a5aa44919e817360da25ce0c83ca457d8330f6916f6a45bec79a35c2229a4747b531662fa0cef64bedf5bdaa75d1221bf10625fba29cb489952a62cf0905bca43f02ebd9b9a29cbb0ee20debeef29f2640524788111788083c84510ac90820440464802c5e7d36e32e94b74a16081c34b643a7dce0cbd4df5103845833823df0e0c4d5199660ea8885b04de2da67b6a71409c91530bc51dc9b8231c1007c419292a2a2a2a2acaf42926e6ab4f57d59174952b8d8979fc7662f0e9dfb7d3baccdd0e6272c3a94432bf9d940e89ec54a569798161dde5f478ba5e2ad46d8481a7cf244ee9ab9b7258b7498806552634465d5c0ce6e5e52d343a8cd9218d81f946e14a41d29867e50be546c9978bd1161dc6bce81885d1148656e9db45b4211a83cadc414262c01289e6824c195fe6f07e61c8dc94d22021fcd1b773c3b9d2b639269c9168b3fa76ea57b96e5b6d2be62465ad354828b2e26e42c50d993332c12313c4ba08ab3ce4805c55270a4d30688245340828b2a216b4a085959cd2a1f5e366c9291d393fee2ed66ca01b7674620412641b871e16292e7df4ed704cea676595d65a53959c50497341419432a134888b255c0499b810e2a2494792598bf18eda4fd6951c59341138e475d02d5db1aae9939a4da988ac18bb439828b2e2dee1028c5a0d932d88ba38a02d68e38038a0961839ee676e879c92b891704780a88b0b6af9789c0ba22e7a5b74d8124326cb48837e26d3dbc8a25759e11bda310e507d5cf40915a2415c10c7847b62b69ccc56b845d99313e29acc5678a998ad70db02a889708b12450b312d0c552d1069210aed64e4b83b8a44efe8a408a6cb1af911acb7218311ac9751f3193211447c7c768d5e45b0be86ac8a603d0d1915c1fa9b7c8a603d8d8c23589fb317c17a9d6f04eb67e41ac17a9bfadd00b7acc971cf90e3a6df8d958c1b57a14ed8bb51b7d44410d9f4f3e7435b250c36680752b6d081107c214acf0b9060e2450ab480e40b0bd4136560c02157c459bb3bf9110101b953ef41923295714493a55b00dac291d216906c6149a7e4257f220c36e46620466f770c820da8d8af1c75ba38834b2f0294226441ef167bbef4d2b9d2e32e5dfb76f4ec52d4a1a597b48d9d17179b2dab2f94093e992da995bc5e9a2b222a824f0da89c7454839c5801854d631186047a3dfbe1f86ecc5de9434ab445ac0b38a435e84a01f65e6b2dc7d99cd9bab7dfb13b582bed75883099f109db7cbd3bafdc61adb5f2d6dab0f63ec4d9f6af08bbb7979f4b6856da5f6badd56eadb5d45a7bcdf2b0f6d65a6bb35b7bfb686f1f57560321118d4ad0c5554822dada259e1f8e6ddf4ee2ae8b48c0593ccf6c6d5dcbbb762ecac78325427eb1f15736cb8e9f0e77d85f8ce9b89b8b39e8c6a71beb50023c3c220c5f233da47b44fae8f2bbe16d0e679b45b4d19e69b17527e5d08e7268771863415e5bd6d072f8daf1528910dcdde515f8eeb96dd64589b94f2e7221c01dc7d5186fbc5209fc851c11d16c41992e1e3c2cc83c99a16ced9c8d42a4d1699bc504b5779a37bf9deedd9679441bed32fb884dd8da0b1069689a474855a272156de7ec441ced3922ce8e1d226c33426cc23d8c536ced3a4418874fd85eef4ec9eda8315bdcb5e310718ab800883839d2466cb2c31a5bc3d9da5f5fdd66946a09ccfd44d850846dd7280928da689f2dc02147b4b56f99c6a28dc6c36382dab7ec43e21820d2d0ae1d0b216ccdfa441bedf3e06cdd6baf992e9bc56469d7aeb64313d4cec40e6ded71a5692024226ee2245deca2ca88034defe20cb6bfb91ed75d1e455ab9fc554e975f955097075b5e2e5fe3f22177c35cfe66b6841021bfd8303ee4ee984b190f712ccbe5a7c4d9e1f2bb6ce1cb9f666b7479d56c995211a69aa13573791d668be63c9797c721e2c8a8cff2dd3436ce4a08702f2b01e23f00d1fdf0c33bef1b91b04ac9f4c30f39ea10200391735c250fe0a6ace3a4bce3a3ccc36d8ee95676fc34801cef7ac897b2b2f3b043c70072acc00d33f23c92e761cf53f1bc92e7993cefe4792b9ed7d1ed65253d3c95bd8ca3cdfc0cf94493553268c4c0e821f7f08e54329d56586ca4c1f690a38e4ab64be0593d9b67ec8e642db656c5da92b5266b4fd6ae58cb62adf56cb6d95de6d95cb3438e91463823ce318e541e639c61a7b2ce67320e1c8791057097acc35bf2ce47f9868cbda38300de994e2b2c2d2897971b3b3a0840679b4e2b2c2d28979754c6f94ccec9398c6ce32e19006fc9397c9403c082e500001bef4e01c80100367060a715961694cb4b8af352b9c667320e381c46bee12eb9f596ecfa28bf401b5cad1bdeadb0b4a05c5e522a4ffb06f072b56ea861c34a0bcae525a582d179a96cf3995c8316724f44057c760d879167dc25d3784bbef928d3701934bb84ca4a7e409d1e6e52d2c371cd0f7fb9a131e35d8b0c192819325c64c8789121232543864a860c183264c0c890e1fd907bc81d0d39c61b1a33b24d8d4905b74ccf25653d55e6c180b17686cfa0d271829de7d93c23c35ec63b94f45ca897aa9eca7a30320f46f3626866f40449d9a48271d37d9ecd32dbcb7786ec33393b8d8ec945dc2d0307879dbd1b7936af76478a9152c1808979d6d82b6595a3f24993f41ea9dcdef4ee4565f5628fdfa1462edf8e9e3d92db94a5cd9d8ae7655449afb80e06f55ebd6c3d9d7931562e7769d12ef6df3bd4b7f3e988b9976f47cfc7e9aee4e10cdecbac7319bccddfe0bb4eb2eef2edb074c4a00a7c37c1dbcbcd02eda7eb046d86a14aed978d3376d9a895cc0c0dc892a179337c3b50dbc5b3b965772f9ecd2c36afecd3ee607834f92d31ae9257e7b2cc634c7b26e7fc70530fc759c90f3a52164f761f32253de848595e16623fe4eebf93f96975548cbfe8fc4e26c7b88aa1738e133c8d70dbd9b6fa461b968c196a6c66d0b881f1624a1d07938bb8dbc525d74c307b29af4819a5f219a6576353bd19d6a391793734a460dca85e3b7baac6cedec578289519acadb1d6c6da19d6d2b0f6c65a1aacadc1da7ba81c6b3ccfc6f366781e0dcfbbf13c1a3caf06cfb3c1f3f0eeb2673329da6435202ac7ed8d625e81352d75670f57d2a331bd1bead150bd1aac6743e6d5b8a1a5b472a9d9d95bc0956fe3ece18ec6cdf468a05e0dd5b3c17a3532ef869629461b53b627c02befe46d2f5f5356a172117797dedd488f86e9d5403d1baa57c37a37645ecb5552790bb8b34ec6b3b9db1d0d354ccf86eadd60bd56e6b95ed6bbf7e96ec6b379a3f16cbe1de8d9aced2fd70976ac52b6575c804db72799decdf876483a62530ddf8e9e6d923b7ef27a13cc3ecaa70966592703e7588bb89ba4ef4fb988bb55704b7aaee9bda88743f560d6c3c93c1b9a0700ab721593aab4dad955fece353d1ca807ab1e8ef56c641e00be1d39dc3bfa08eb38c1186d46d96b3c9ba7cd72c60427c8e9fb04cf90c1b2a9a17167c8bee577437b76992ffd7d977d3a3a24f0a0049be6bbe347774c041c91de3d3243d4967a8bd1d9aa73527924f3075dec4872db73ab547b7beee8a20ae8ee8d20cb95f9f8f8f820d189b7f2f6f228299b2c0185179658c2c40818f9b80a631322e871c42d1f431b596a25f539d3091dad94564a9558ab276ad61da3cdfc0eb03c92d5cc6af599d54acac8c8c8959452ae649e336f56f4ab2656f432320fe5571a35412af565643e653ef34e261f1577885a5d85fa8c0cea41f0e28a0d0bfaee6e58db9466d387599355c6cb4fd60c85ba37cb431831413a2b35628818e010046b66ab7e522598c621e841aaf900290a258576b7d65abb6925dc8d4c50025197109108482eb169103c2648690c701837fd0ef43b666b9e0137ba86a05a84d5d308d6d87488ec34d24cd34ab81a09447f4c90be4a249c1242a882093134b1e2074b50872b142cf7c783dc1249934e7af6f34172bf77bffc85e5dd518fb3e5f21290d1f14727bd1be57b52feeebd0bbede097f944dbf391462dfefa4e7ccd11dddd11de9d4007ac2211643a067abe808c4ec911662938e43955b52fe4e27e99088ef225eb6ca49979f0ff8233dfaf77ddf9732e901f46c15adb2047f8f4efa28df9f72a8f2c8c2f23bfa773acaa6cb3b62094723cdf2ab81b0dca481b8a8e42176df937238d243ec66d171822fff5c1e5f42c95f97970e8522bd925656be42faf7eecb2befac77f3cae89f5df9257df46fe5f576e597f411d6615d91df493a4e704573af9c8eb3355bdcbffb7df7f5dfb7fbdd9b41195deed149dafbd4a91cf2a4cb9374c86d0e08776d74eddcb5e7cc90fbe435ed9c8a0e7bb6ca4d19e750888dbf4f8731fb3be927920e63606060c050a952a99717171714aaa585856565e57432994a2515158c49a4d1e8fb3cafeb386edb587478f7f7d357f2dda450db5f849d1eda4d6a79d161b6bfa3ee9263b441e930dba4af901e5b745837e92b67c931daace8b0eeefa7dc3afdfb74583ae51841920ebb789ced4ba37757198de4b5d1351d721f8df227bf01f4c49c391ae950eed1bf93323e2591e626e5b07bf67db443dcdea781747a88dd9cd61e717821762442fbe28b2f88f6909a63654b17795a825229e5a494523a9510b13e280f5e26512995a878a7c4a3e2e36d4285fa2e46d82da2811b9dd17fb00e75cdc7cb8853c4dd522ba1f221ddf1339f26ab1e8f5e8f9a2d5927fd5e9590ae64e5ab09d6531749d79ab2a39cb23a7580efa3f75839e93d46c79aa48f6862e551e761cd5eb12ba31c754eeb4a15a2fe473d4fbd8ffaad5cc6543f78eccf8a94229f54ccc60e3b74e0f1415d30afb1d6daa172d48191a30ecc8bcb8f20010f5e9df37a551f3c138c25011ffbe8ab1112f030f2e830f82f99e492bda3b2e95d965b95facae3cb5539eae41b2d59f5dd68868c2db65918397598bcf2f9ddabae4e713f08413310a3981376bde4e9414cc8761c9188ed38e2e681fc84a456ae7dcb3c458ab4fcf4222c7f7947bdd148c6ae8f4ee09bbaea3e560ee39707e62bf988f9efa97c44ea2b9587b2ea61a87af00e1dea53b989ed2bf908fad1dd3c567ea25ff9d53c4e7fd144e6e82bf9fb29affc259f7ea01f9d07fde89be631ffed2e03e29465b9b59ce2198d5039eab868de4d5ae92a2ed963c92a5fc9f8a74cc2278dfebdfaa0acfa1109e75a546ffa012a7d3d3e3ce004eb6b7d05b0a49fb7443bc6a880a9e7ce150c541a3ba9c39bfa2e62d20632374d6bad5587f3da63b21c06b9b99964b859b97902c69c68b5121d72a8eb26bb6952b3ba59c5980ca20e9647c9c76be58fc962c00bb0d471da21c47c0236da47e05d8b220c009b3e27c234fab25183b28087de077d0efd0e94eab083ce390196f7d408be7f909bad156257ce30fdd58f36946767bfd7b49bebb52037db9e4c802b145d2a879c7155a3dd537bf7c6bfe2094301ef305bf13be277fc4dfc2bfef1608cb52008534c2022cb5d6b6770f61f93256d90fba1b2eca7ae20375b1b82b2b67bb3eb3bcd6654c0da23ab9ecb31b2868855ca8d6f2286d8dff4f6f23f82683ac8cdbc7ec0cd9eda9ba0bc3c288fe55140dbb43a1862f7109be33e3e3e7222410657ea4d108552ad2858a5943e1ab8e2063929328625c430b442a5a4525eb9c46c6520862423228c6645a66b86c89a3841481a1498218e3c62c39ed761b26e1784c4913aa28b4674129fb071e83043508a1dbf451c1d248df928b70e122747d2989ff539124707794387734fd99348c3718a5be090dbde0f8930b9e3b572ebbc6ff4ed2069a75f766981fb7923884c9f08935b1609bf3dbf1b5548da59b4995b35c21de9e2cac250759ff87582b8e603c8cff7c0f39f3e427eca483d9c69255ed4a9b9469d485d3628ea4ca953dc533ce43f9e3f677647e017a5387b741a230935417afa7a90baf2297d0c0ccae525479d54a6919eb2a8ea149ebe9dd5042958812e32faacd3f97bcea5c3e4d363b2e9b90920a24e11d27d8f79fc1ef2de9fe513387e7e35fa00c7479d49cf7974f9753f119d4e719a87347ab663f21130ee1d261fd1040f18f77e84eaf8d1865ef6004721f5dbe34744fda671441ee0f8c8433a1051879411c193baf7318fef43defb28a7ea61dea343caa9fad15355a77ef83e7afd481369a26a1ea5c36822f2de4b27a2d2a9aa5357ff308fcf43defb3ceea28ef5728ae73b1051e72bbde0b853994a64f9ca7366cb5d32cb5179e5389fee65933ddd54e42b7da6d30a8d3a9f0acf298bbe48211c8b8ceebd08e9df414a7bf0ad3a3e9eda969e6d966ca42efa5a77a0d9c12c7ba522c270767614111eca1ee9cdce621689e0f9106309066c9fcdcb08d36e771c852c58b2b287d9d6b6ccf322b13b2abf1dee6a1edd8968f44bf170dee3774fa4befbd53cb87b9ac8c7e594761465659a8e3af3f3d332466277d4d33287c4eeaaa7594fcb7707361661f4f7dc8fc92221baac4fb85925a04c578c1913d3650465dda39ce027986449b2256ccc6e61bbb053f68d126d6ebd422d5262572ef870fa87a993e94a0565ddd19e59c0a1f5b99f44c0f7b6061126f7bd0d8a2e1f91755f837d43bc87a8c0930acaaa48b8c0df0ebf7d68b7439495ddc628ebd21ffa437fbacdbb024ff9cd77930b1cda980fa497d1b9f3c844e0889b6782f739489a08fac50ab07cd5b36882d7a4af9309de671f8e929e4d72b73bcd23656ec72f52716fd10e659110b9437964dfcb2311c6d11fcababf37167171d31fea9291656faf7d489108919bcbf487ba68944b7ff6fd883b8d72b99b7478394e45d32813bc5853291344ed51a65b4cf07e0edd2de2beefecb733aaa3d9041cda1816783e8b7def69fb6482f7dd8d36d709a18d3d42d9db73e6f5e815589efbe68b14dd0dab86cb56b92c75b69ce2a17dfba6896cd7b4e8a2f9a62d91c6962d75d8a2bd864b64c97cd3b2c3ef5b338a44351d294b02894deaa440e864945146196544e9e8d89ce241844826f48525bc47a7931e0562eae4cc0a5029b9b03711df496f36c319a276c4a10fb34f3dabc515859ad9ef046bf02bc5130cefaed935cb2eb510963dc4522f7471756f8dd9efc2df8decd96576fb023c415aafc0f2f1a1105bbbcc619654677788ddb52ad9f0052c80c4070c56b084a08423a72d4fdae5511196a5b67c7994573e54d9d1037788bd1dbf1d1f85a08425b366f4f6f35b9693d6ad694d87f5da67a5daa70ef0bcdc72ca6ab368234fb3166da4bc72e74ce9812e92eeb2e923ce06d32e3fee71b6381dca38f7962b8aa228adf76e6bb59d65d9d634bbefdd36ba39ee769eb78db27db37c334dcb6e96ed96e5ca715e9669d779599e5e96518f66f975df36ca9e9d66b6d259e94802b9b94e747135331bf6ec4929a596526bb39a6531462ab32871e6942d1e09ee64a7291e9874ac79286ba67860ac7b742a0d30ad4cf07c97a5095010a509385bb7b71a07e00465408324f8e88c7245010f74ea0d7078b3a70d14fd48a3523d34911e9d91c694356f036cafedae66a73babc096ba06e11e9d1e9d9d3ddb425017e95367ce216fd65db59caa5a880f3b1cc776ed75db1d3f1ddb35fd90029b4a1d63e669614f985d3bcd4052396c98ca41af5dd3a1ddf43ddbbe676b5f0eaaab0e29a043ee1a6db26bdf8d6b99ee1c9a65d9fb4d8d1ba2ab009135552b2bdfb7c39b3dbd3a03ee618cd51ae0eedcb57c778d7bf10437385f3713ac31c09daefac6cb5163cd664aa34da6293dddd1340d6754cb324b299d95d22cb375ce487d688f37559850c51361180a83167a42e80992104f7078c14417f6eca9c97d270e2f9a54adde1b63a4f246cf9bacba840438b15df6ed08d93c1e1e3e664bfe27c2a210767da501e6baae3681c3ef2c9f2698eaf17d94fdd3372fea4af518fdfba78ff83ed22fcaaae7340f2678a04fe9b040527773fa01a1119b7b6cc2e9940eeedd3b0d24a5a3bb774f03b1efb40e9cde610751ff6521e60df55a7d01228daa796680e91274d07a2fc6a8ef18033f5b74d7dfe4d01d5ebb6e9e2a037cf26a0cf08cbbd3724ff6ed6c97db8638bc109a7bfb93dd7d1e0e2f98ecc72dbfadb5e3d538bc6032c1a8e97077f43c93556d0eebb6f75a6d46abb7498a41f4a46cb9d11cb712d473a669dbf48f790576c9a280e515b8d66f677bad7aeed2a481f6ed6c3f026b46226c4984e97d9f4d9945f67d26e57ab14c4a03a2cdb500136378c1beb10bfb3ed452b0ef63748592751f6a23d8770838b445dd8f68732fa9c0a14794094dd7a559132a05e6824cf03e6ece164558dd9e41213db411d6c00f6b5633548921ba1a1059f74426eb5e32b1efc32c8a0d920e33a21ad9500dd661165b7d3acca8d897ea1fd1a6ee4d1b31418fc823b2532678bf6d974078cb7c2678b52d22da242f0ab501eebc6f44c22aa527d385fabd17c301eeeddd113fd475bfe930c17b237c2869f9bd8c166d84cffd8fd902f7fd10d4b5834512613903519124041b28220416e884f267df487dec4de74cf0dee52f77f9cbc3ef4c882dbdf3b8e74c2bf076df6db954df925f9eca2edfb6d45d3411235243b4fcc8de12756a29479d2dead8a2d902527a84b2ef15d83e96ae6daf3fb2ec21c95e9268735fcade1254f68226ebbe66ef0559c9be4b9e20b1e2d149066403d7d8dbadd9db57d3658b268aba72687857263459f7db696f9711c7238a34ee37296cafb3d5eded77b6f0b76bced50b9ae07da9f398a8fc3e67d3366db3b1f2100cf3de1ea3cbdeaeb2b7d7982e8fe866b6eab76fd1950951d6fdb6b7df082b7dd32ada63c24411f0dca1c704757931caba2a991075e59cb4d0e92b3a8cd9a56c8ba2cd3d572a956a7cd7d94d33711fc618638c31c618638cf1c769267082d98884554aa6d3ca8884554aa6d38ae7d9a20ade0f993f820c1161f6374ed9f7994f8469e73ad2f77ddff77ddff77ddff7715a89c4522a6993dd94c01911ce6e4aa2543295bc233d5ad53a9b47bbb34513bc26c0e1e6b3ef250ee5cfde4e7710c6a15dba04c2a54b253015fbbef33e1c4862d565c51059f7374bb2ef55746cdfecc8be3fe930c64525d321b63abcf7d609ec3d613d26f6f741bb749b3d26d963428ad063c29e65bbb7e402eded6190d3bb9abd25d9435284d043b2afb764b66a6be5268fc96cd9df7bf7dd9c421e11910765bab22732a109decf1d6654d45a6b7d10b3953d43b2afec026749a6ab660251d77d8664b6547e6aadfc3ef331fd3efb992d96df6749cc960d6bd0cc169d5832f656f2297b42d475ba9ed0bef79898ad52902c19f11161dc2e954a1e122f89d5a126816c5164dded960cd1e5fd64429175ab0ebbac07d1658b686c6542fba6df7a046fa6d7d27fccd6b6efa591088bfb7ecb710f99aea8738bec2b93d8f7191470fde9388737b6ad72fcaee69577f1b3d63a815113bc3f4df07e7b47a512f8c704af2ddaf7dba74c5790c9babf8f3fec0e707802ef3d9f18e5749b83bcf68af69698e07dcef48c4cf05e3ec125ed014df0dea4bd1fcfc8beb734c0618cb2ef43ef67dfffa0ae96df0f315bf8f79ecf6ccd7def15d9b66d7b10b355dad9bac035c7ad92c10966deef57608475c7fa5e1561a3df9f668bf4fdbec358c5745a6169d93c9db9ed746f3a94c0f66cb4a07bd5ecf9cfa3e6e39543b878eb3e437780bd918cbdaa3cc0dab353798fa96bf47bd46c6dbf57cd56f7fbcf16f7fbf8f5b03deaecbae33c3a297ff7bccf8f07fee81e7f7e3c48ffee499fb766df7bcfa15ede8ea34ec7719f2d20dc23141f221536b7ba1ac80d3d019e31ea8a8b345175bcf306fa785a81a23d271630bd0c227ff68c98de6a2228ca9ab7cf3411ec040e6b9e52a73a81a57039250cde91e2df5d3969fce68e2e92a41278f36aa53bda833537d7d687f65e97aa8ff5a8da81dbb6e9ec6a997d8d7571469836815ebb76974ae01a8fc487310af80a282e3c8a01b400d006362d41741d36b78f08336d7a578095a06af01d6cfb180f846d6fa6d8d60a126feede7f50564b4221fdf583ba24908c4d2bc4965442043f4dcaa054829c5a88b42f6a6de77d231256d1bc92d4764cd0dad8a0fd1361aabd6d12686fb204dbcae892409165bf6d97228882826d2f9f60b9e5eb04ba176314ea07b794f208a640d60498fe3bcc96e6f2417374fda02cfb91dd68d816876d81842668efe3dedea16d6362505c142d443a81a58c09e15042d9f652bbbd8c325df2898c096d7bbb03bce51223b125ad1041105b12ca046d8409c923d4859fb8b6cb216885988462b9ab749fdbd22def23c2bceef232cb2eb017e26ded6d96bd66b6b467bf89b0fbec97baf0336c8f8aadbf8b01747a6b49d4869e7a5ff546d623e16f870ac7e9edd268b9b942862e76244a27a594d24aa9a534a39452e945175f383681628b4def3cad373720f8a35018c7c9c33cd539e86614b84e508211c78d36f1e3613e95b2da4a077431cabb69e6cd16b5f17d3455e2ca8eaa961d750d7a1c5ed1c6770b806db53759f66100b63d6ab6e8f7224d705dbddaf4b28c7a9abd75bb5cd771f25ac6d1c69ecb5e373d7a4ff7fd0d6f4b6f4e50a250dbe6ee853becec34771186aa99a03d77d5042d8e9b6863ff6863bbc7cffb70a4ba94a773d0dd9dee4e8712d89bb57782b646586a65b368281cdede34eadbe16e5f1361dbed6348b7a6d598a0fd965fd1c63ed302d7d8b6c8a535421b61d98edeb6b1c986852e76a4108337155b31ce084acacaf6a4d566da006e329027a18bd39bd72c90f4b4732986197c232373f392b9919979ce7cd1c050a7ef68f2eba6c68dcc6b8666e6e635a3c36f197dfa0db8facda5b888f4416d216441e36a6a52b239673c04a2ebea3b595486910c72ce3aeb672bdedfabeb67cb76e75c435057a76ddc56ae1e020e2510cf04e96bad9a449277eca0c304296a0e416dd8a851a3a666b59aaa50158984a02e6a674604fa88ebf5f0a50ce8e83d89a24740a73d5e8dd64b1c59f336cf0a5499802eaef888008777b6323acadff636ccee6aac72565ab551cda4ddd2760477bc45010eb9216e48e2c829efa96865d23299ac2696c826d9a2c69ed76c68838e00592794d2535184493975315bb6d33c2fc5b37dd344a4ce7d8fced4b492cd1a99e0b440d475927292729232c17992e262832fb0c00a593cc1820be8cc9e17601173428c0350940106968af869d689f6041c5ea108fb5ef1c966e7850e07ddb1525ae5bc18a3e4633582e3635ed8ec3ae16d4ee00d0352680aa13c295de0ad0ad2d438d21dbc4cd9f12853161509dd810c924ca4907c42fec82a8a80e596554c24d0212be406b6968382822a927022412241872612aa1574883a41852a112a11a24dbc3913b476b636cd5acd5a0444579c2b30569b27c2ec3f8388309000f38718a98bb5daa16ab76c1caaa6a65d7de58e1018d166debede5befd5b41d0def9a0923baa22ac2ec43d59e3b53cd08a3e286a431e7d55ae2d047fa459c01481ab30749635e2d7bfdb4767ef686c419401552ec49b7fdcdd58b36f20390385fec41e2cc2a648c698f54fb8d30bab5df6f47eb89334a24b654428773cb59a38da4213f0fd8cb19b3ce42b143d40546d9d65a6baf76efbd963ecb326badbdd75a6badb5f69ab5d75e6b03aa0da8542cd405a21e768ca119110c0040006314002028140c888442e17848a4898afb14000e94a456684e1689598ea220a39851c40101000000100000c08000bf5c68dfab770fe0a331fe3406dd9e62e3410304a4b83905cd573713468aa91ad6e5608590eb7de7c07d406540fdaa75b1e08180b5c935b7bb9abaead02a48160233cabe2f55ec91298badc36098be014252ac7cff5562ad2ef5a8dc482df479e65e34f41f18775bd50220e4a591b5bd80673325c49bcbec6de1674e061f99d6b7a0e9b09a430a800e51bf89e42fd812c5806ca86c61f0b09eab163a4886da276c127075dfde5ce7be6f00ff5bc91ae5f24cab84ee7f60ace0292ace5e6272c59ed597d50e7298af59f6143ee2ceb3bf2b2105c366ef2b2df21996659166a7872f45bdd013494e65e36bcd75afe48ed086337b87238537b44bcaf5fc1fee35658cb48f61e2af836bbc88e50c7ccafbc1d279e5f61aad5465a9da5dbd6b1db4356ce9b364926e8211da3f7b5d5e43adced6e9769e3d3c1d07b8b6768573eeb71d49af5c64ec0acdda8000e155ba46509d299a1835e54b8de850884e04e742967575987de7885a5a4c19659fb1cd236c057d4a9f65525be972ef64a2490cc83862360b319aa00dd5eb037a7bff6ada92fe9c6c0601d8151cfab44819746e6a552d83d6d980aa18ba281894c1e4f0c4a0b7bc7aa334ba13db5614d615359237563c3b709de0535c5cd86515dbcf3e7d73aed840c8a602d353303a520f664a3c26c7b4025024245af09e089822711983cc323119d4536ea546ade5f3a740043fb884417401403db51bd8a57577587e8144317f3786162f281cc7e611817aaa167920fb4e9d843b8132e5b53f7c1a7c162bc524a0030d53333b1a9668851af3a4cdbb49a113790b090e99b2a2bec96bdaf562a24914d56724e3b065a56598ca5e8cd5b2429ac6d10099611a001c1d64685d4866a9b25a7a9b12ef15ae7d0dfd210992403295388dba2e61dba7c2c136aea5d8135b706879617af77c6322fdd83cc85420789148a66d6dc9268f5b9c14087cc6165a120e42995f312556999a284e53617460b29bda05352459ec67a2544f6059fc9adb92f083029660d2aea7189fa539e0ccd4426fd790ce5c589038d0b9141177f83e0523c535973f4cb8ae61c0be1c7190b1cd84cfa21cee9000ac58f7f76100a8423ec10478849f597f3bd701c166165f4da8c1cc92c5c28f11dc81b13b66d0298abe6932b03d01f3021fc32fe8d07a90a1c431f8a61e8d7b38b5d87ee3bc53ce5233cc97d3e6b6126204e0955aa0152ecb2945b933468830e6ab74413a4e1207f76fef6fc714052f7aa44dc16ce7da93336652140e072ee2afe6b91ae6a46851572eb73eb075d48307a5db723d0890b381b99da9b446c45caf8138409370356cb7aa2f8e11081d0abfb1687aa6efce19dfe4b88b0ba577ffaf14f9a0475c8f056653c308879ddd017ec8be26ad8cb9ddf53fdc26337435defeec9d37a669c5392ab20d892a21650c1029332af4ceb5866e9b5ce58620c0a49c4554b460b5dbd26967b8b07320da1899aefd384ab430df775e57f306ec778fa6720734d16fb020992510a3b25ce198ab02e32932be38c80e43b306d72934511b7cd545a7113228aa58cf9f36bc261a2818714537ecadcf628f3ace5f6d42cf9a689a7acee1e620c9db9124157b4d54d5ac5eb8c5e9fabdcc2f5df118e0440f23dcd2cea53d8b10030537d0fc26ff439274cde29cef70b90276c9960afa61fd2e3bc615a8ddc6752424c139f143b2e343980a6379757977da008a8791f7c61fa68e86e7df8fa4e718563ddbb9965ffb424f94888d0fed61401246effd2dc8d4e939f14d6b0cd33ea66912c12013c29589619a67119980f972dbde8d0141970b2ac55064fddc52720e0d0f4c0379840ec30b23c7330cbe7614f1dc369b868367d171d4546a6711da7ae52a9fe48be40ee5deccd088034112c992d9f3aa0584f84e822e1027408b7130a62678a30726b71829d2192929d70a1431739d9e6dfb65fadad1731f707e8f02bc6dba38a4f70def69e1c4cade2913c1f5ad7d67184b3801b6639de45f9ed6a980762b8df74996e4e5aaf817ef400cfe4a68b09fe60f56e0ce191e82793acd98423d02c866d493ae3c02961b099bda8daacc0c5bba9121739934d03b6f40cea08b5a38fea304b8b3fdfbc55b220173152cd8f62e615123b3f316756795c3a94aaaf7596d1ae1b8e552b52dc6d276704327fd39bfa54d2983c70d22da7d6dbed8f13aea45b96a4be6c58a6fd870902daa5514028674441988332e02648008b58469f431dc3c8b6d50981672368c07911b5078faa3a7821a315414e86739876b81d9625e12691621e70548b69b679da0fb43244495d8557a3bf72b7a37dad6814812f4321acdbe409ce0b06dffd004d5bd94f1408a09b5d834e3d19715760c517c6e540be841ca0a9b4c9855f91a5548c06d6f7a6443a50827f78a8052653b35e5ff9e22c6f3e1158d5c83b4791d347aa5daab4d473bf3208333fa1bf246683c707365bc572b134633e0eccfd7c5c3c8e5d10c881a5140c1fd0749a47620f76bcda8c53d4f54836a30258337789be030202b6eef9cc0d935a4230a735ccbad642bf966441b5957884e884c3232d5b074c43f8a4fc0aa627e6281ee52433a8f2a2d4c19d81c30f07c6425daa451967024e79363dccd016ac8c97185d1200002c1890fc8f2c4749d918111643711bf4be5cdb3fc6e981665b37d19b5b3cd67f29efffaccad4353affa556a278bd7eb2f01f0165c0f630706fa6b02bc04d9de0568aeb5fb012dfa1893faea444a37a48bfc541abf56154ec7e6a1d8e25cd3a26a0bc8ecb41dfd79a7fc2fe8a191f1adde423cfe99e470551adf81130a68e340fe1119240a20fe013d3178286e74ae91a1eafc37b2e4abed832159abd7bee3df41e8ac99ea71a2ad34ca00cc776d707296cb164382c85b9fb63df57d3461ab5c9a58240652be7d6edfd7b4709681f200777a8e489ed5804ac2cd1e6eaedbb0b72768278e6a469a39f392e14b0cc1430ea5b3f68704d132b59b5d1ef2bc35f3140a277b9d6566f3c36f6bbb6a7edafd36539b5f196fc7784c2c38efe3d432ad06da62a9abf20bba8f2b30a7093d7ff5686e6f45258a8448e795b9c877c6d4a5bf94a14a3a58f28426b0ff76994887520eb61f9293b6ebf3eba03951490458de3fa0ea8804ab7bc5850e597f51ca7ec1def31a1fc518d29e97b0b4f2baf411852ad537d72dc88200ad06d0ce306615a819a18b308260e57aed6b0a345657286e25f6f8e0dbd10fa78156830223a57157e326509554422d367902267887fbbac53efd04ff3cd1fb6c6ca371520e2c23fabae3fec5ee22915eece2356ba7478ae5f8e33d0957b02d4288178e8bbde04a395356b984232e5fdf9da694bd4a397e9801f641dcde75f174d5550b482a1cccf623e90e4d90baca01368e55f43d7af89592527c4f88e89a017205cc5eed94b6509fff579b0c947f2390fb82cf847d9ae8e15ea1231270787c4268225bc75699712aa25961dec22c83785901ae3c9726c6b0627f45161ad40100c6674f05ca7dea16ccffb7a60ff8c115f5c7b4d16dad9c23a5acd768290b8d5ec8f34795416b33609b8f641236a9f243a4fca3c4f80024cc6eeca0617370d081c3a75aae726f198f0d7644b41e8211e560894b72f607e09ce326b399b17386fc7b6459e34364464ce818975dc61c23385d6a570ab742d097e043034dc10530407c1ed48b132cc691ece4d47c1b94ee48857270454d937a7dce200696a0a240975f3ce3c4961e194884881123a77c15403024b3f66e02660f10430f936fb1484fab3057c59f300f42de0cc9cc980765b454fbf6081ead3d5389901f09d2fbf7d0fd84b024f92e4ec315d965ae293e54733c7e1c552104d841d877b3baef65c4ff9da5f2b8a72f823856919827fcb9d437b9915bc2f5757981b229fd2d5a896fb82b253d16ab7407e5c150fced09c7511c8d6c616a322658c26ff26e5c2c2ae97679283c33b880b1bf31ce3c97288218a1f7d3a2dc0bc0cc677df3a9038c9f902da9984de9465c7bd084cffe9d6b2166129c9dc57a627623c058814d648269ca9dc06268053e6cb20da72715f8ccd8f596490614f692d33c51ea4690d14388d19688a7c00687a0d2a6f3c76c6b9c7a10093294ac1d7fcfcd388a65c81ee4eeaabfbf8b02174354ce9d04f5d6b594465d51aabb6ae66371661badbd488ef28a35058a1c6e3057f290a0c8fc293b597a5ac41bf6ee455fb9d8f54090385e785ec056c67a6134c9b3604db6d1eee3d940ea4b890387d08d426e36fc2df40c15caa6f79fed4057e3cb74147f9712dd05362f27ec1d49e5cfbd1d419b6db5b75356d6bc5b2aa646b3a8d0dd66d746e4368e623ac3e755abb5f47a2f6e82638f299f8b496bc8b04763dc365eb591b10b17ecc19eccebe869c1f644e18158b87922ae6abd9d63867034d1400e99d196c64203ce7c1b1f99d201dfd5b6b6c9aa7c86dc18e9985538b88b965c98b54e310c18cde95b35cf0011b3d48a80017e332e624dfc1461c22951cffbc2253c4a6af85fba844781ea66c4d2bd9fc573fd2608b762eda9cbee21aeaf65c4fd5119310efd7c9622fe6fe588871fbf561913102bd66ca6cab9ce994c9229ac7b5c9f3b1d7fe5dc2e9b176eb7d61c2dd9c257cd1b417dcb3b2e927f20f6884a0347992e3d04c198ec855a28f80469e0ff1d8c1fb351e94ba29ac81a787ab6fe832d173c26ba1dd82ac4444110e1d4d03a4360555c0eac55020224871db0a5f077413079b1a02b94a06d56e9f15ce925367725a1a3823f35b1480838e79d708d3f7daf51977dd331fd3aa33749095a600b1250a1942e9fc363992c87afc7d5a9045f2b32c4ba87cfe2dea395ba1d0cf269b05241a1d19931d8070ba6d24f366828d58f16a24b2cf60a584ce5573b4ad8c7ed517514a08ab1e8e1109aceb1112dc21aac84cd44f52f21e1d869f9c7f3dfa1e4fbc77bfdd736635cbd4db37386680897ce0f2e20470a4f9184cc67d5a99370f3ae49efe9715d31ef7eeccf64498a5b597b0d27262bbc2546b83ec47d5c1aea83f20567993c30dcf088fdabb6fbbf3cea93d079063011e1c7df2b85ccb932c8cc713ded803dc7758d66c66ca2e08f4c1eb8083885de42d235c746ebe00eec68b8e0e3bd1f83b180927421b5cf5b603036bb891cd6f4c11cbb6a1ecb56ebe9740388014d2314a49cd93a1a2d282cea4a527c0494cf40489378c808733077365aeabda8dd6006980606738c3a85f0a244d872fb1e7c83279d593ceaf336563156acff79d319f825ac843151cd0922be9bd1114b6d3365d397e050ad47fead76ee53613337cc0fa2ae1451ba53725d3d0d53c8422f8b97b3bd6a21b960d2f886a450ac08e136e3da127ea27855289a938b35a97cbe1da450a9b75aa6feac7d3a224ed8995f81a978df8050d4a6528b98dd928fb78d0776f8d548a151624f1a013b1f01f6fc05e9c157a4a3602c603610ceac00cc246138ad592865a4a9dbc245e8e614db1500477e19a4274a6803f0daafd42e6b37c78b30bf3a7702f5f12a0de5f18a54753cbd9ca3e20515b318c34e4f531c2fb24481aaf7af2b306634780f2040b78acba5706bb7a029d2a4dbf8f1c265d5f76dafb3ef1b2b30232ccff65ee9a98d1bd87c1deaf1e7b46d652cc59b6f02603df695c61e7ba461147c17d491c8128fa4b50870ab8012206968624ba9c7fa4c7019d472461d7709864e1fd017c2248dcef4395539a1721cf42281a858b71cdc80b04d097495df7cf7db07a7a3cc88a3941888507a981f8ad1332ea23773538a6315620d0ac0a0e90a98be7abbbf1ea6cce25334aef96511646033f265fadd691890acd2adb836b40387b1ec563d6f8a03d58922d6ec80e76b82fcc0c9eb44291f5de8f96fcf81f464a67a0fb42cb314014d4ef37c1946f128c6d306e22e53ae5e18f4289e4683977505ba27bc88c085c1c584a6d272183c492d8c0f3138377e8527e10d6497e8395efede3600351872c48e5b31450a7695b86020ac6117cd45b3c1b71bfc34ea9e3d08e620f36795d8ea914bf2aec0849773a8ac2ce09d875b4c1ebb684192cf354be94e2818765f84cf446909506b62ea69815f7a2957569e859c31df3b773afd9ed350845612fd04ba4894dc5d0aefbe0e1ccadbec49184b36e9513313993ec4a0e127dbb497e785f6e8c50ee37a5d824b380a18969f6c2fc43822dee76629e7c4c22e601d31dd08b333127e709c24f75df80b822ee6f61cdabbf65bfdd149e5ec701da41676969e38d01e234f239048d1e936944dfea501d761f75802cd0320e5621544c8617037ef3915aa1338e0dc396f47800039c6b8e178c4ccd69242abc2504c256b808b9fa749c90ee215686a4d1cb047ee7aa21aa066f207c6ecf9a22dfc7fc14c3e0456a860609554a64c19270aa30eb84da774235a615adba227b3a36636e2d658405a789d87de329c09081365d83cc4ba18331d243c8f9141e9ff971b8b10938715fd13545a51c334dacafc0c28eb690b82dee72c0d43d048ea1c259e2df597991bcd830f84735728762a3f285fe8ce7c9cfd81651e113a83cc4cd98f1eb45d5e2de569682ac636f8219ab98b68efe9a4297e5a4441a88b00ccf55e878ff1499b919dd5f9647e75bf32663cbfec6fed67c64d97d12f88555f387532314c604985e3cc5653b85081e80340ba26bf595592e2282bce8fc9481a0d8ea08a825ac6312e5e96d2f21318ed899251c35b6bb64f7fe7a21d0fea5a5666b8e1c186a14aab74a103d460e4281dfc404016c7028cefea877e173bfa006849450c913e4e283b51cbb283108ec677c778ce9160400d10a2be683be7ead2f55851319e2cbcc0393ad4197b67d7f2135428c98fbd48ef94736b2c859d31ca322bc7a07f015962c99f8967bb35b96fe30da05c79a24c6e066a965a80cc391237c8ac7a97af2ba96a28be7a9e589100f6846232f747f18289186def76921628a666d9b7266018f32adf6919a5eefe861e0ed5326771a60e201f1f486acf8c658f2a502093db8321c74298c97ec47a79e4b3130fa92ef836165e9120070ba0befdf41eab01901db752e8631a522501bf535a6f3d57b58aa7499fb016d5b701fa2140a84d2b3e495e69e2a67244dfb1179ea5270a02686ea8115672e3d1797409695a30a8685e498b75c81459b3884a94cbcb35cd742bce8dc161a3da5b7e5dfd181d4874654000ed1b2c20027711019d2fa402573d04db4bd61d264f6fd1b443e6d9452812f65c09e70bd0c1f06e2732035443113f5124b119239e586e1ceb9c58b26cb9e796d341441287e413c2520d17c0c5c3a4ce0304bb9a3f2756aaa5904b65194fff527794e4d08c00994bf839093323831bcf1af18313b5b6668bfd7b68936f1dc2a38fd8ee2e4a0f3fa58ac5ab9cd2e4fd89fae9b70a840b13532e308332639e01cb461c9c7e81ab7e3bc8ca217c7c96d9abbbdcdf19441c1aa3e3bde1736ed8f2361f9a6e08935b3c3299178a3cbc945b5f5a74c3dff83068257c16856fdc4d959852496efaf400543d43c4313c74c9b1f7e7b0e5ae7665011483a51a17d0d8aac9fe15146b8bb601e91ed518a777fb388d14f7a0b545d9f6a1ffe200e02ee69a937295af90f2f7e43b2a6d139f8c747467599913917ea64e647b973b3790edf280992e857384c7f6dd4e5716f0c363ce88000ece632acac104116a6a58feea33777a1ed7c1073aa6c2013533084dd074c4394ed442ea72b8d1ab007efc09cc307282b483d785c932c19895dd14ce01a003b4ff157663fe11dbd9e85850cd2ff83286d72c81852a8ed4b4b51384891bcb7ec76f0aa33cd5722bfbc0ee6f8424affefb84af15c1635ba8479b03dc3142f87019f4b9c5232eec93fa9c7ada90be0b098778762e32e5393b2cb780e43ca1589048b0dcb303b3853eb7cad3b57dff43e0950b24fcdb79deb3b8e5220af252d93d6d4bce7a2464feea67970ff8cbc72a57e31792beecfaacfc245cc1916f4ebc3c8ae08b375b0a97cb1b2b4a9647647ce2b8d7a21926c820deecbfec02eb248708de6e1de1c194f52776e85cffd709f869553a36e3f056816dc60df620652eb985a78c848dfa8371d498a2dbddca5f972746c1012e3fc7359588b77e1e3d4ac9bc8e1d99336aab403493cb0209064ef03a04c5bb7a8b9f885e9489e20b5d481b797540768423e3570f682392c015c93c84a8fd33a3fda2aa1bbf722ede690e31e6bfc742b4d042a4532c8b59416f1ddf5f86d12f8fc6e0e39eaa91c4ab1f5adb0cc039029855c11bde4a1b06c69898226362496177b1163319e47e2774aea6b44bbf5ce197a9fad84bed778db7d7e0d4e7d5741fdf9e4be0931a9da9689f5dda04724a9d79552a04ad10ae2e7e91b1f803f4b241da8f1b48d40cbadba483dc459f0dfcf8f39e9567e4000d7fc20dfae7732fcbc8a57bc07370f5e2b8336d02370e062d54fdac4ddf1dcfd186139cece23b745ad932cbf764089cfe9e42718a1eb7526bd9f97c79ac8edea55f52491fffcbd950eff06dcc1d312bf6baebfd9b6fe8f3704bfd756faabf2481b86df9201f77d046836ba4adeb2c4af312ea3695742c4838abe1491252f09150070b16811e4f69cac8cdeffc333bd7de9d51857c9e0747f175be69a77cd516d6c7e3d1be31e1918ba89be6a5136b241a53c6cbdfba69c1b99f413df82b4ed430e1d81abbb368cb42cd8171ae00dab0b6e6a7d93fd2b62a3605f0d6678b0789614fd1913459f3eb965df8fb49ff9e8570d02e537d4a8e33d604d2dae2c1bebcda867e562a119adf43e1452f07d1019bd9e329692ab29fe36c990948f3e22e4336ceb5834c80e08805ea320a74e2a3398e0e7e8ea5890a530dd4637ccbea2c411ed0a88664ecd8bef07e79383f49b697f3876159dbba54cc9b8915655e10c3a1467a62964b402b947a2cbf69214087708fd361b877e5ec7beea598b39e018ae0a9171db70ce2ddd64c26d5a10b1108510b63d5d65bae0c129c2aa1b15ca1e8cfeb88866a6266485301d6703ad5306f9f024a99eef06c24b265a4cd5accd909b87e24d78a1bf1bd3b34950a196d219a5a1650973088763dad0f9477e6186fac7452fb5939113136168254b95bcc07808d36525fb18138e272666dbb1126887f27232f73d3beaf8640fa30807e2860bec4d51934d08f608f29701b2466a1899e50658d995d0f4a8fb022154c0285f1846af5714ccd923e8914a5dc858693c72229caec8cd320335c34dd931f6d9f7e35dd6264bfd10a51e92bf2a0c84c25d3eedcaac3a9217d969aa7af41ae4ba00b3a1a2f5d5cb51f5d6580e3aa895a1562a7f5c973086607860f50222be61e1a921c0c494869cc13bbc2ae026743ddac6e028f3c27e0d646661202d01a7276cc9a8c852d1d5f59d14a7dc85bbd3e1a3abbe18cd1485d74f0765a2ef3a409efc0aa4d9e8b400ff84a264173791a7c046dc55a88fa3347326717011799049a708454d34afcafde8674c86433f605eab635b2e8a756163b5c3a0220a328b115f12e8831c5e01343ba882c01387cfeb2a6a0a660a4ddff5d51b72bd31a56b30f18e9866e476190971ba16a3240473118080daff9b82f43a56d565c521ae387e87628ef377e6e0f1212a723b5d4ac0b68aa8fcd6d8b5e3bb6a62e9d5d1aa1ad24af66ed17a46188bf2c69706608ef7ff6d1d6818fb76bcd17ea794559024e9cf0133ecee0823654119cbd0e139846fc6082fb4916f7e4199c333b148109c34bee832c91495034e282bdf7e08306b282c958ec806e90045f913331cfd180190c6500d67d98028d8fa36b1da7db3f37be1d07abe00b5bf7bd101db9e4e1da90a42891a8e6c24a14c00443e91f8a224a3aa8afa7de23b410b1d6b12c2874258c5d848a71359b29faa44bf4a5eafb5bbddab2976f7be572acf9f17b4d2eaceb0e1b4d10fa61c28458b66e3ce8fb3d5238bf9775981648a1ad60a1c9fec7b6099da1a28cfb6847d826dbd88ce160fa208d56a73c244454d8c62394313b44397437f22136736af1fc3e5773d9429b4a91e3460ac52093d4ad7177a46532a68f2a68e9ecc49d655420025fa8789ec00b9ae02064c1e2452bc091b127fa1eaac7407994db5f311cddc84a358bab2987303763281360c939121808d04efe9681a125195c8990bf49e6fd2a0866446f68b65767f9ca9a2d1b6bbb12cfa51e0673b585c39748e5d7589297236180587b7c3151b4d10ca68f2e0c1e661fc86fcf2385329a5ea1a094145b7fdfe8c28010cdfc3b85447098d8d129ae7a01ae7a459ed8d882f3c17a42d1de090fee38e77e93d49da483a34c1c7faa63f1a5de1efa131d0fe306d8c435aef32b5854f0b4d52cbe703be05e48da7990bb84db0e1d41b76410507252f30e51ffec834dcc95b0132a8d768ba64234004d43687cc303f52b9c68ee7bcee56a0d2694f4b7ccef9c455590847e8bb5d61cd36575732ee983a98873d4a8706187b5704d6a1606f0fc83fea491606bfb250c4737d0678ecf35d6a166cbcb778a9c6c3970499531bac86a62fc2084d17f8b95c3573254f7d1d4bc223372f353b6560caa3451119062b9b158a47328356a2e259240df0fcabdd0e3fa98ff32805ba8dfe9ec0ae5e0d6b1c81ac7610891c81ef0b78ec1215ea58ac8791f1dc1dd2b55b6eb184d2ef85391001a97a5649d4004548aab4c7ef0e2529a90697e02249efeb383ce5467e440955f81c3de5291121cc66707dfd8d586e5ace7e58a7871d9c941a991562770120c91809bf809b4d1ba55675c895071dea5e76ac0c094dbfec4be3047215c3aa3047682e84211ba547528ae14bda5e7fad858f9b8f4a3151e6000f409c0a1411820770a80149c5b898694cd646933ae2ec2d4b77925911db9454be16b7f17ee2c6244e6f60168e793e990bbb87493221ff9e4a9b24f4904859b36b01a1c47f31df8585173ab64c1df27eb56f2626478ac2cb130b96b1dd134a0afe4bb3d016225c508555923c81d7cd5637ddfdf275ed9ec907a0041cede9f8222198a19a95c53e08133334e211d349090c60e2b039bee70ef7e671407c046741c4d931235273813c69a6691ffca0c69377f6da2bae857d611d1027f51d717cd4b9ae60a281c6a8e89b92e8a39b4c3365b1539aa406931cc5c27c0f1854dd390d17dadf9056e5d25cc82014f7e4211cc22c9d08e928f41538ac2ac0cc3808561409f6726fabb72f3502d8340a0e038da5daa95f69e89235380cdcb926230dec0918514b4315c0e10b0e857d6bc4389f7ba48163968870978292039086561225a71bd4b82a403f990859fda5749ebbdc25e6009d456aaaa4c893903781be3ae764dfad3812d99bbc953dcd3c8a80a94e53cad31990c12fe172e03bf782a81240707049c3b747d25af2b6cbd566b0bff16ac78f3f15dc24ed02fb1738e9a90704f3931c9cd58e1d81a88e845990170735f1d3998f882a6a45909f937c0de4caa10dd60f1501a6301602d1dc09272510338bdf826fddb05b01dbaafd29a52b732489c81007c4b0d41e96903316ef9321482a370474537e71e73e87097de9b0a720f7991bf0ea2fb0b7041a7ed44090286f2f1aae9142d1d76fdd6d06f06601730198989f66c2a2c6df00da1003742dc59738e3b239f6a27d620681cd169c5d78a1fb23392e8b628afa4f8e752bb3e19735d8f5601f006b0fc86dc27a27a2628927c709ee65ec4bc9687170f693f4f75be2a2dc6c7a589f381c1f8d1f781128065d6fdd3e14add060ce207e73b6ff5aeb590b5116487ee80c2b643f98469580f52258725b4d2447995db027b955b4e5f610c078a4250a35d8de0c081d708d6ebace61cf573eba7ec11ff8f9c12bba8b95c2270fd0fc2ccdabee97eaceb97c7d787596176fd8caf57171127fb829e2951ab4e274cf3329be9f72db319d31c98cd7c7ccf6cf64dd8f051f300cb5f2a90e2df2dba602b9086d2ced1a56120a624cf65ecf3c480b6c5922859d526591fb8b00ae16a8d3a141f0bb24a804aa79ee2c686a04058f915c0a78b31e0d6839efb8cbc442a5a46958f0d4cb9817e5dc179b0d612901f8b9d7326db40a061e729ecbe4b0b84abe306022bcdff6b01cb2a3e9710f36765c442f06861d2aa92870e34dcafe27379e2f8e0a8321436f4a90b3298c3a318934c28b102302f84362b10130ee25055f4ea8625144a0e4df4b85ed93765c4f3e11ddf2a6fcf680e8f229857f3b934f17c29cd4c2c7af483021a2585361a5cafea9b3262f0c335063b79b6bd2971ca5d8f8c4ae1a30af32d4c899fc4ef27f85282f6897f944a08c374c17ee607a1106698def29c78c0a170c61189e04feee3b490da341dd853b42d80c2b82eb788139f955ab56dafbb8f3fd12cbf0afceb2008a11dec568610c2499a21c389ba9459c5b0f241428ecb21b2cc809b245cbd6b54806efb863632185e223c55e08173150cce9d685a128ad9aba67e724c8c49919791b66ea93ad21209f50c095da1db41970b8a60101827a7e49c9cfc65b07b09f482358e37ec4459c1c0d20b635263b4742b1634c83a26d66e6fd876240280432bade04f048c15d32d374ee04f6568a3987ef50e234492daf9a2b56d17deed8f80c805e1c4a692f1071abb8abfdbce8a98a15e87594aa32c2f9e204fe88eb2c5fdaa8c785f57aa0e72e05775336faf128b1646d590d5ff609d26227eb49896aba42747abe61d90168254f94eb5d5cf899b6ca48145cba63c1cf37be5f416e5726ea37b301b8603832bad474059524dee06fa8315a7acf15a2161100accba15b63eeb5dd64c406475b480f2efc24214d2ec930c34a14e00da3088f4b635e5e753143c58bb930cb7a0a01028e99be9e2f246be28b67002c83a2c46a7293d6a36895c9a9c1931c3f07696e387ee8c1369961268b1f3043e093f04f395c3c4b412aef1e1090b3c71ca6dae93ae58b0c9c3ff7215c3df20c77512f6d1b01bb3c26bfcbbfef975edf254effb9262fb544e5c4ee6b0fc99ba3f823f8ebffe8126b2bd062770c181b18901d91d55502c9a9a3c50c1fb2d7f4323eb165ef784e116f6e550795a252e38d8241e93baea5dfda8b63ef60729f4ac2e2b5a0b9b10467473dde8bcfb22eeff9f55420b6abec2d47d7caefb6188ed4b19e2f82ea3620b2c1da495997f47da3764ba859a04cea91d3d1b0da3ed2ba77483e4f1ee407292595aafba59bd092ea2f45a25ab32563e4c04bc0ef71abce744964b30df3484525f21b051d5047add7524070ca48ab85e4705c98981ad67e121d72f6b0f28ea130813432d4ca15183fe60c6d3885169eb505f383034162ee2b969194989607fea48bc8ce06ea914c30455cd55eb6ca1dd65dccb844bd03d6eb50bee7528d2c9ced98e3342dce6c61423b0ffd4a44153108ddb168f6603444cfecc0dfda006d461a81c8d6758579475ffb22ddaef10f0db813784fc2130ed6a756e4142455b8a15b95f2dac8b755b17eb9e5636706c515df56f6652ceaacaf543de3e50c3f434415c93d829532603bc061ae4cbc2b88b5e4dbc2e14f019088aa010f4875e0e9d278cbfc131b0afd399e514519c31e9b51d227a84129da8d22d12b4b98432e3402d80c6912408ea9bc293474df2f284ea436b7c76c674de1512dab19cd8196e21ef64cf2a9addf5ee5763921af4af93fcaf634c18660f371d2d31b3ce86f245386d97b7371f9b1d5e1fe56ab329ed42100aae398726af3e3d4a5062185403e6ee9581a12814823ee855d0678c423391dcf6aab1e1cc7442a79ff311dcbc82c02e6fd8652684cad00c9a18a83cb341c0e42d648eeb4ce629d1a8e92cbde401355279a648f5d4fe6a244e95bd637b07ec95d9d2e39a64f29c58b9b884c976a6f5829802631b876ebc1c38c84521c60c80565942624599a5ee49fc5674b3fdeb20a7155d11cdc94131ba59fb6e32133b4f7f831eea07c09ff2c645e5a6ef3470f62b3d2ccae381f7861abca7bb1c2ccfc81e7f30c0f6e32bf28336276f27691659c961e40df52aa5a059e66a6345fadc1382bd1f508675f8a7511003c5c7489aa23a150de96f6f00aec12fbbc9698ba7dca35212df8bbd0a49b680e904221d21001aaba6de1ffa3dfd7a943887b8ff6d56212c7ce0baf71027dc8cf5830ebf8848b12ccb0692e6297d2a92903e909c0acb00aad19b4702184314abded4c9401730a8ead1ef35189443b04d4d12cdc94887a2bfa9c57fa9f30c25cfdf674e1e83d6db4d25d3c35f82c3149dafcc8f3ff95fc2eafd19084dec2f5fd5cd1fed68838fa4d4295c037fa2b9123506c2b56b9f2b1419a1fa4866bf8df282484a9b41598ce81e2912a3b25e39f211b1251f7d5fcb14f73d6fe16b97789ca2fd7e546a726fb46a2456710323bbe3da033ddcb8f9e68b2c4ca2fff7e55a43fb5a1024c50f5c20b93acd4b1e889c979518a886a9b405cdf908353be5515acea081ff2334835ace2a3919ee26dd3b8ae547df02442cdef84a7bc795184135873f5d50ba3f6d819dc4eafad5cad2a7736c016556a4de82526c2939b69e5f8b0b9ee956a5a23d57ceca9fb89902fdffc47fd50086002fb4a39cde999b5625eea0601a055ff5c79f563565276778f47f21280fa98aaf0b5fb3aab6e9d381e6ea62c01f7ac2af8105d349251c3b16f86f17d52f64e5be3cd9b18329a63192985ce65729960bcf0e259f78e322842bf379f68a72ee6881351942872b673501001c71c6f727bcb00daeca47fe833fd52be695d24ab23ceb558ec9891761c36c090c64dae92fe715ec2c5e3a090552522090473ae424c502a9c87622f24a1dcaee01e2bb82eb010bdff856e8750958bcb4ad3705d202a4532a721c8454cc2ce422509bab4b5bc911190cd531feddb4eb71ef5b54d90fe94ea66fa2484982885a22a4befb5362c8bf053eda879f85c7f693e84a7011c935bfa1e9574693b2d96c9a45ea19813a2ea1cc36af7c220518444193cae19e269e1b4434e3564b2e0ed289d78d83c8284d5c57429d76ad65d75030b6155326ac1181d7a5f971be1a5b3a85e13c45479694d5aff446c749b33601d28a3215e3b4e75f5a41201f4c55617a273aec3ff1c92f01fe770ff13094edc8aaaf08e967d3da9666e7ae7ac4ac22bcc9086f54f84f57cdaba80749ab1a2ec93960349986d10db39711cd8a9af6fcdd4e6b50f0baeb442d1cf09aedcb3acc02ce34cc8e8791786ef8ac0e6de99c6c440423602e403f8473c23e82b6080a499b25c3ebc559d8167b9089f6896efb498380b1144aebffa88a3791a496bb519ae7abdb023bbcef1c133c9ab308d0bada1cf4361e9cafd6409c3498cda74bbf1fb404669fd61885d17f7c1d53766b1d36d347da476020b44315b751a75a25c8b238a7d806a32d3455f60e8b59eb88867c0ed59b412cad0fc6838acab2b22a9516a1e328c8d119efa930772690a3d6d62bbf0f9978bb9ca2b1ce274a11895ae25e859405877d6a9c69b98e3ad939ecabdaa70fbe158f111359a925ac1c39f8dbc634542fdd9830027f587a28a62b1c34ecab9bc386454a00ae41d42af81863bbae85da2abea2f1d1cc151cf6f9f9f1bc919005273d4e2321b643b55c0575c5477090ba51ac5aafac08f9fbc0acd3f273df85aab79a68397d85743fcbe085de5aa44ee1c0f8ad26561cf4aab4678139e43a04e9b7b252d95461e7155f449329150d433659ab79c14deaac2a52c50bdc52615db12a5ee022358b8a57f30217a9b056a4ba57b8488545c555bcc64d2a2c2a52ed05ee526331b5b872f7ba902279c2f51dcceaf3f432d9d07d69210ee8e5774c8940299497a7f2f4f21b25c9ca04d7731868028a1eef5a49024b48c7691f3cb5b0ea17837780a2437484dfc7d9c974748e595054696094115802e189125e86db8e07a3e8d22971b77854b65ad15747b9343794e3a5b410fc51450e97966c7857c9f8017751864e9038874b20c168df3be5c0e5305389c1d94c8c9c03dff0dd09130c8bac704e30bfdbb534c9ed782c6a1e85436a975fd985ba644683d0ecca1bea7b29ed64d987e03b1773586933a61d16c100804c9c122d07b1a6510977536a27980519cbbe3e8d3c7bf4a57bc7a1add805bf9a089e1b01a0fbd485e79c3c0ecd3eb946e30a2e4c4a689400ae43424fce9129f83a32612ee9a75ce410f3bae536fe9445c6425486ebc9386d8d6f9c467c2b8284a8b52a93ac64e302df3a28add44f0bf42999017307c1a46bb637ead0def66b2c1c874b850cee46df0ce106b40b4f3d84c4f0a6cca478dae34e7b7ba9a070cb592ecc65f774a0392b4db4bb50b704c2aeb14598e4c4e1bb9e3701f431fe8d4ceb0b59710c2983060f678f4051eed02c4fad586f1474feae9b427adc76abcea75e643f8450aa2717a9458b6437fd2c5e4502ec9f8ef4350394b29b58afdfca0d4b902d6f86a333caaa22bafa465a9d193e7e58b51ce56c400c4819cdb831ec59443b683a4818963286cb15e7f1cf46a38c81d8b9a1172aaeaa66f945d1e1455cd4315c669c72303b7036becf0c1b26ca82912c6a745d26f28482e3181a9b28f3c34e4ae89f1de4a5bc3d2fca18a8fb9072b867ea6e5f3226a567e52124d6f0f38c88c90b00c3cc0ddc8ade6dafca2ac52863d0c8ca6adae120db28719d1bea09ac6e2bdb665e16c98a506c530d64c82dff7a4e060f18471776b470b4973b4bb6253919c3b9fe79159ff928aa89624d265d19830aecc32b58393e9089abfc9531081f1684c3a380e9702462daed737609ba4864d2107962d8c173a33026a0baf5b8d1a046a76e49c8d4193725e9a7fe97174f2f3c31fe5b4cabdaa41e414c43e14e3e9872ab706e3f448385e16ff6b91fcbfc4c51bb298f5d263a0a340061d36983911e5bd9d7ff2a51bb73a942fa28ef2ab2e1ce2e1439f25168e69ea238e5d0bd8b3a676dc6d449d5b4a3cc93ce2e69f70421544fff58015858ebfc853ec930cc1cb3cbbac40ce640d1557bf07c71e254319c21204af1cb9db93f7c719267fb69b5efe06b52a00e75003a0adcb1f1e55b19b6d5f187e1a615298e17ae8dc625740afe1510d074894d3da732eea017d2ebf35a3ff3b78bf955491ab60eef00a041665c502ecbf7cf8d3785c423e6f5d5a28269d6529849e7657d4f32513021ae4f39c95a621138339ab99ea1402bde8a15262f84c9032305be0846f6a5cfd59c7ba16328c99a2f02640e2e1049c5113cb51ec202dd7e06a80bbbc87c96f8aa15067d7d1936540955aaf34eb63a2fee40f35aa43842f409507ff3c59603cc5cc87d870c8e32e084369ffdb413c17e0d345a8a06d13727c490c1f2a41326c4c738ff75c5a800e42ae34967a82de2e65f647575b986f9ec7da1400bf7031eacaa38c2beb53deb82adba74a9a035ae2030c10b05564612fce5bd22f6cfa575de5b9711cdf20159db9ed2c448988afc73065f0622c81f5fe2983a5fea1700d9b671ad3f16835af727172b634b4b23dc0628d0093dbe2d7a77653af4142df52aba23be20307f458e2d0ebb0b2b6ac135bfd1fad5662054eb0ce7f7a77692fbcda29c5a946e8c9371d178648f9d92508b6915ea157ca6250ceac6bb4a6630e410280e1cbd0eff747cae8c083b747ac4a7201d7ac8e4895d7655c51e47344acf11718a40bdfa736d4187203d02ebf20dad241002dcd314ea901a702426f834b4e92d27c11a0967f39924014739d42663374594142a5daf9808f158dc3ecfa3164a12aac65fd1924d6d2a96689fcd3437aa6da64477005da0ec6732d14976760180ef330434f2fbcc596c14ac8ee9e29fa744bc5307706d1774853f2936a165b309310eb1dd6b39101abce71c210df74adfe7ec961b67f9aef03d5133c0bbe7701a9c525c2900dcc35ca04200419e602a193fa275cc47b29a0fcc75736db4c1d08a1d79cc1a162a1b3fdc6267c9818f2a17887eae9696ccc75d34d962f0fb65b882c9c00f8282842d7363a1c5d95914af3053ab9a960e369f3605f516e3840079807ad2e1f6ad1fa563d528459ba8be15d783f2c9e32950f5dc07b98eae96d5f8dfee1a93793ad8c146ff3b2f921ffd37d8b0852ee45ec98f3bea17b85c80d0a3cbc4889760de15550e5906d63821c53c7cb9c35d427ecd15f442ba783e3fbf6840dcbbc7120c9a47f541e55308eca118a5e4931fee5aaf117781cf7556a5167656d628bc97612d30d94029ea149abb15cdf44859fdd1cf817e6ebbbd9317616d6f1fe2ad019d1994ce3773bcd738a3d31942cd07d23b09e71545f959ae5d40b6ddc4b64d18e346a22ac0ef7681d405dae3fdd01e077b528537a3dfd484534c70ab51fcf25fd21eab55c50e0616f7dcbbc173e02c65c65f081ceddf8b6e0d8e1e122ca9952bb7936c505d8a14dc3fcc5bc206c9d6f65bcfd679631ad6bbed66c180a7b8f2eed381f03eb9991d9e98cf1ddb86e0b4780bbe640495344d72264d82596c17ee50d0e46f4be535abae4a5c4725615709d466cce2d6215eb1ada55c297af69013414254e880113669b03348fffb4210307dbe33aeb9b660678f614edd46d3205699a64a1652861c975117f4f4852967f67fbe98ceb6f6b31e8bf6fb2b1e7b3d92bdc5b6def6ae3e37c0808cd9123c752fa7d7488d2ce9c62cc6585d9cef2b5e7bacf4eac35cd903f5bfb55a399dca1cf6df2ab8fe32cb24cdae9aaeb46c121a14a8a0dd6eaba093d09af5d0b8167831a5ced12640e214241a483bd70f78f8a9e6992303bf056609fe2f94aa68fec83519782c41390486208e0e4423669548f765a7a95562564ba012b32a2255cc4a491589594511c64304560b855e2e415dde0a8a1e07fb5b851e7289a58d9532a41e3f7ff42706c79219057f7e2d89a27baba281e5f315659501fa2828fd32de014efe125094ec5f698bb1e24458e97aa1445668a15c712dc18a7580ae35586afb41425c7637a2fc5b8912cd24d1005c3e913d278b04411055a693cf34849fbaeeae536582a35c7b4f00b712dcd7d72ab34a8fd510e12a620df7642d1adb712a617295191f554f9d5c412956fc76a32e6da13f484eaadcd0d95c252d72d1277f66b6a4a5c40c2846e636cd2cc24fdf9c43fc03dc31339e77cbe948a0e9aa073a1007e6e9a6b2db890fd00be4b094c8e08c2d9b720840eb5b6c16e2a714bf25275f5e9857d172b2c89698584cf1ba0768a3514e17b3ae2d4e1099122dd70c41789d5ce0636e566dae2b62a7af0688a26df09c0426f2a0298427b990f4b973a5803f328d43bd7df26cdad877a852510f75f010fa7a15dd4c04ad1b5863e6356da43255ea142cd72e884b3bca40db14afa1615e51a7762b69967449b7f91de5fc68d4e90faa27cece3ad6de7927d13859ff46a52c4c81687fe06c294d2f7840b3b5ba75249896a32853137c04bd92e4284910079ed1ba1f4af7c1265e66bd28220adc23b08da7f44b5474a46ed51de896c3b89a421365a84edc224abab5825eb2568894e016cea5e67d0cc0e59b59b8570e92b73afffd1394e25f2cff8f977f802c7303c881b63fcb0392cb5868129d3a9a1b617b79a0dd31d376064b54a422a4d7e444782ef6eb3a3911f014d7cb8376877ee9d0fce67ea664c2ff566d2fb39707a4719b7ea1e5a31d25ea57687d87ab6279d069e700336ab4301f6b44eb6af56340bea3fdbdc57f933c50c416e3cdfef9ccd10fa3ecf200b2df65316b001a612188e167eb846783cf55ed4673d5c59ed1ef64035ae697eedf4b95b96090608d6bd9d9b5229d0c24838070c1f4604c5a3fb596152c63999767a624660d290de12f1348265ae4655b9e87d340a331f691fde85600dbb692f3b7be73d306bfb5a37455d239414f99ea543a18de22da88993fa566f59a55131f01acc4f855cd03db416a1120e10f258b663cdf21892f37ab7c89098ca57da1f22484534054165ed6ca016f0e49a291ce8ba01e011334a7cdee205cbe999efedc6e97cb62cce371d1793d5721d293eada6d525923f2dd88d43d727e4b3a663b084ae6f72cd4d370d9b71f268b84c26e620164756823b0d30b1c4b375944876e5d86050c08c595369e4bb019f12c41fbaa5751bb5f7ecf0650b3b5e293044b22f0eff55c53204a3196eb72dcffb5ad211c380f95b15e861692ab2f7bce56b02b897c42310bc4f4d6235c0975db4e97b03e49d82e3a5b4b44604bed21b0c0b05c4dbb401ba621d912b0dda5d905bca82313ac7d05aad485eadc9401d4ae99bea3c52f7c49542d20c0be3c354c99dd0b6b61080a47aee67f722a968fe5976995ac60226302b6fcfc539f94af31d7ea0c9df983a1a505906de4caedd18e7f05fcf58f8aafebeb43f017dac7bbf91fff38efe8a9c67128bef5741a17b82fe21b3f862bee01884ba8cd47f206693089d0e5811768b29433f1652fbda1d76583c968cc126c9a60dfa17f2036162e495a6bcb887ee53eae497ace395b90b3445909f7732ee3074ccdcdf4aecfa13ca82322e1f3b1e96e7a23386f1ba806568295989ba345fda6ad522ae353ceeba5ef4c0cf6b28ac8be99c0bf09ada2f37bca83935f78a34e1d1879087d0e5e1d63548af33d79dc0dbaaf2d57c0669125abd4129a24577b9b19dcd82dc09716780c319fdffa0b475dbdd20bd19390fcd483d6385cc3426456716686f34a5b79ef5683ca598d18fa169cc207cc1b0cf2087b44fd9e6666c6aaddd9302942c7c8063f4595e37a60d02c6f5731e42c7029c6447343b5b9a1a5b01cad742ccdde37f456f16cd2b0876a2009da351574cdedae05ec6e8c9c2441ebb67c1e7744ead2b58d052460387c9a0714b1510b2d0f231307580d2bca060db2fc89225a525e2d7b3fc78b9c181b91e75de32bbdedaed2e0188dd3dda4ff8167e917e2295a28c83cdf45462f42aa8db633a5d7ae72550c3b075470876206854cc0721a96406e1492d11c5fad1897b30ea3bb961c71c909fced2eba917ca2170ae498b1cc75dc49bd5d433c395a805768ab53e1b2ddf8c2e2fd0ca495be337b1b7233bc23d6e8c1df608239a45c55024f3d5c32c290ad49877d180596cbc37519f3a9714cb73dcb04a2909f1fc5016be155e4db1214d36d0edca412b42334b87e5704be8cb279b5416d3a061027bf943b99179220feddbb1a2c7a7a0f4a1c598848ed1db71a09cdb1822e5794a39de814958502fa85ac467101cc05d9c4e8ce8b26767e3457fd1eb6f48d2197701f21cadd8a1471cb33e9435faafe7275cd7addec61c0464ef57822f175793130b46e2eda06853ea3df14b306129fdfbbf8eb3f74df916cc7458eaa11a2c8f802d5d374be5807baf055faa8f4f5d0d354308d25997831ac5c88e1523e1cc47e92945e2fce57a5e5ba94c85eb45e1e72e224e7c9cc29f56ad2261775524bebc7c91ac08982ab63a2df8eff84ac1fe94e8f4168e9a0d6789de23d8d85f468df741e3c9001f807111c8964139958d99e2bee7e6b6b2b50e90860ed63d1e7e19501a3b2311acb953006d291ba1051a38969d4f7a1e65ac1705b59cf6b15bd764310c63ff35e3d6ae4b7bcd7d06b920000a49bd17183c6dcae04b6bd93cb11ddd0ef773bd6d1a9d18c81eea102fd4879daeae40a0679918a06f0dbb32e77e77f4b78c3eee6dd5e0e366e046856acc80b0859e1ed6b7f2cfd725843cc9fdb5badc104483e23417ac76f9044908b6a1ce1eda5168ac6547ab8e41328c6c107a322a052a94ba899eb69e0eea6cd6204b7e40f3358230b3ec739c64a30857c4e4acd4202a0b4f65fef59932126221d492bd9502012a4fcea592e46d1d16961758d03f992faa6c4b7823ca0c67298ffe4b6431953ae812b5cbc22afd0bad255d720a65e44f0313b39c0eeed44013445940423cef46511b0995504bf4ee4fb9e2e8c99325da731f5a60671a179a083d4e62c0217e73f408e394bafd266b482011cf6509617ea53363988fc0300e59f9ca0cd61be1fb4c9b86f9b5def8fdef8bc04a89107570fe24bc891feb900d8406f16067aca406b72c6fda8a04076dc4ca9c706fc99193500dbd5373c7602fba803549811e8ad1b744b4208ada41d6103235d9b05a2ccc5933d1df23d298afa95b428b1f92f281750b37891b3b466dca430749321e9128761dc2240d2b00135b8c1f395ebd3908702cecc311da116cfb6761302656774fd84b612240db96c161528cf1bfac32bc58f7d306b346b815f7706d9fa0f463c9d410c180393baaa5731c8204426c3ab8d2cc83bba92d76a0eb275f7b8202641c863cf52e219a87c4f4598f6afd986724e0e8e1309fe04fd3738285f878bc308511ed245239920a9520c8dcd84a30707272774a6448010d1d0ea0af73571b42b6817014aa35e2e742fb115ce0324fffbcc569fbe34a7ba18965456b0d02ebaeb93c80a6fd6579f693c632ff9dcf170e3b06372350f1439904cd17ea61094f7ea8e8c930d015fd0e7f6f7b2d611626a8cd8d1720819a4021cebef3d177cc55dd2e3ef4682ebc15a8d0550e16e0e6f2b301ae0a22beb501365692dc7f033c5a61db4c99fc4194db781630498e80b3ec7ef778d2bcab28a4d527f994415d3c002f897e089256c59e40d050cc0b249307580f4f7fc14c41d0cb9d60904c11592a8fc6b52254bf586728ec9ef2164437442f9738936d1f27d5307b7788952b30bbd68d727ce422d137b029d0a1119f783462740d018a60c2ba1d5a89858dbe3e51eb7a90da12439a4088f693184bb3a4b30ef9887983d54a37cb09b342cf2a8435cce6d21d71bef413c8fa8c0e0202ac724e86355abc3479050094a536a7b5b91ecff319a2e9d241046051079765b10d0fe056a5f89e89ea39f7aac1ae137d5c5359ad5aa531e4090b458b08a33e04a7f093f8156a0f125ef37b77eb3b7bba5643e789f2771016ea6c3dc5ea15c160cb752f6049f1bca072280f861db19abc7da29b01d53d3e4c1e851438cfb7859dbc2a9616686d47f10e5c72cdc0f0358de11c6c4ebaad9f9509bb5afaf4d58b0ca38bd13a95b4cca7f57429e5033085dd92588d9021773c89b150ed18bf6871ecbb6f416fc30f41c516633e684c93385122c31eef655002aa338723e4fe4534cb22b842d59cb24bddaa167816158f586499f743f16df46fd5e83d0f9d1a1ec394f8664b2a6890ba5074fd6cc68704dea18582e896dee78a443aaa66f45bd6af79d7603e1a6fc57d2d776439b912426fc4d3f38d5de56746c9b41c23445afb8f23cebf0d99b707bf3c556d76606accc00ac859e30b6cf6c61fa2dd19ec9046d37f8744c0d8689e28cb95386462810e30ce103604907b667b5cbc05f5dda1ec00fc8e475c67975994664c45424e38ac42106bc52f6f65966eb62ae1979d078e87651e8d455a02d0b6fac0715180a8524f302734371d8d0390a3cd6ac17b6b488923ab61fd6bd9922d2183fcadc9f1551ff5d6af547257e3b958886f56c4c6d870ae1f4f7f5c3fe8c575b96e35810e810c85005e90c1612186a47b5ba9bd6ac61fb44a447aca7612b690969dab0514c054fc6d15c5820a38af6c37d5a0e8ed27ac04c8dea829ed0fc92d7e6b446ffa535a577253fca32a89d80f35f2c9ff44fa12454bb64830d60f2aa4e76a175e5c7bc109ce4b51b725a334dca68c19712f2a12e0aeedab65a67987392e58bdd43dd9fb6451a0942c83eb1c9d316c896e5659ce9fb524271c3a8d59b6ac7ef9b0fa98013408c4687a26518666105aaf5dac2a5b7e3e6b5517e4d733c0e6a277651192487734a50ab5531c8c70c49eda8b1cbb4bbedd58b9598dbf942b34afa309a733580fe5edd6996565483dbb4793683b52f3ff3d5d64531676259113a605179ce63670bf89ca9f89c5bc24e5aecc3e8d86b29f0e336a403ed64701b9f5511a9a0886c66c6661c4b7985e961eb59773625ae8a8f053d7d6588dc5eacc69643be608c836427df58da022f8265f756aac564f5c205889b9e9c4b9af161ca44ef0b03fe276ff3078af0c2f015817735999166cb15273045c076f4d785c9aa5de224dd4055a21a9c04492dc63c38a885e8131f62e98d4bf989836203e0f232f2618e610f78d1132143054ba0ffc14a89e79ca773788f73a8b77bc7b125b7d28f50b311ca64e0f8fa1953f15d9504e5079945a681ef1380e97f77bd05aef0dbe69102ce3033e2d474402f77e4c8865cd1bdab95f2181ce2c9980a7aed74be51246f6d449b69441b122858c524d05d0ddedbb9f3a00fe2fe8e84437d5a751be4c7cb1a8e94dcceb263c52d7d8b1eecb06c86ace03e00153168734169eaf37513de58f469b1837baff42ed7df27dd1941836e00f2d05bfe0ae432005970e0dcc29425d7a12cf79e948bc608669851b61f3772414ddf255c13329aaea0e1babad881fa4a66ce7b5345c8b1953b75334cfe7ddff57539fc8cebf268781fe8900370c14837c955d9d95019413dc3410d6891e0052a036de8f1432841e74750a0781e3e03da03ac11984f9fdd3e40135811897dc6c2527f8c8b8d8802392783760cb47192e16ed21a5902b205d35f240510751e02f59b779e16825d4b1a24eaa50e2c0776ef53ae04c6f692b9c55b85ddb6e719e76a14437aef1438e1ac8df5a954de2660d0f5e791b408d434b200becc5e92ccede122ff5110d78beb01cddfae886af23fdd6b99edc64327382c4422b5fb4a16f7fefbddab7f9ecc9deaee948ab46bb696c4aa2732419516fcdae28eecbf90b37f751224635990b001e84694c69fcdbfafb1b7cc59e66d61a09f2fda5b39ce1cd2db61841166c54736bded7168669c0a12d19fabb000882d2d0c337f6967c4b59996e91a8145031fcd09889fabad9020b153c3e81ab08fcbef5ced64794b2e321a8b9055f5ec3fd09e52827d154dd9a460a12c150ebe32396cc1d20582a4147c7db15c43849f19b1ec8fa6d1e969343230b13ef6433fe7a3e962ddf544cd7341d8444f6c7ee7d0273d9c92812bcabb15be83251961d461abdab416864d465549d009788b15dfc68260b2218875116e66440462f8515e427ff60a1e617ded86cf12ee063d50c0627d18b6f06ecb0706c3cb225af5a238476430aeb3e2636f4d3858b92ae3522bb1564de057ab7b37dd596c8a0d028672cace44deddbdd4b40fb5c75089865a8eb9f3dda7800d1b529e8807b8fc91d5e3112850bc140e9a183ad786689ed7f2c61275530d22b60c229c71478969d6249fc290e7d7837c367a3c7c34fb39a0463552bbd4245bc694bd7540b398e3a41684a1d09e22710b1f5f1308de0bfd2c678568ebd88c2f11cb259d80c98791e8ac6e7416771d9c07b6f7d4e24482c45ecb06f826d6c18e025b47885f4670c636386207d98a10a357c10d6ddb43ae449bd9ff70ffc7a63c176579707f2745cd8b826ab31926dd0138039a910ac887b1e2e64270623d160cfdb7f5f85caf938763c342e46280aeaca6b9c677dca6c03eb5c9822aa511c14074bb2722b063a0d264ec41f940f13a2a5c1d10ec4112f58ebccda080fb40de0eeeb29ae49b8ccc7698df59379939927e4ecc61fe039d04b0a7917d42a98a09df2fc3ff16ecbbc9a12ae4c589ae8082cf87ed29adca8fb6e89fdd8ae688ef1cd8af5f80831c1abcef167d765eb211b79dc55e9e7e542a4c984c43c3485ec3570828cc3c172cca22297f8ca7ce2347cd8cc69219c8c9e1d4ff06b0daefb4d811adf222fa249de510da0f84d71e94dca94e7eec7a12a148f20cab16e9ccbf54a4d3ddc142297ec05a822ba0c970b93df9bf74c8d159edf4d3052123568d9040085c22fc40e10c2e5aad2667422d41e29722fb51c0f6746d174b956bf414a6ff80ba01a92d3701fd4fa10978ac90b003ac9002a5fc81d22b67aa16f8e88ce9b2d21a836f241627800bf81554c39792ef9a1a190da91be7637348d0117115456bd536541ea51d730b123d091b334c969467f6d0c1db3201209216299982432f57938f6c23b3a5c7574e84b01de61306f740f52fb2a19c959321680c96f42cfac50f0231a6b4ce45e78b362ef45223df23aea04c98f27a39e2927c86453196d2245fa244dc163cd1d924b4b1e8f813d29b3431c7cb7d34384c35480be4931910dd50e75ed64a171c772acfca04e963f777ab531a51806d55d5c954481c34ab8614cf7643f4530c6b65dca497c12635da3af3eeab7c15a2692aae6b876819ad4e9ed6aa28f4eedce35a86e51f4069cfe5722e8f836f8c3e1fdbc0f7a4c8b3ab8d3138ab4ed4e45eb1aa58ae046910f402ff2b41c9a3a47ae7120ca8d061a9d577d2d1ba39944e729d8b6b2c92ccb0f4e417b135426da1160a5940ed8f23c6a0166d9ee4e9fca5c2a7444b77f96c67ca032d579820e4d1a261530800959c755614377540738d45e4a4ef9db6ae4c730ee13586603fff12a2f605b150433b64d90c385fa78bb74647ea144f8ca17518391473b75d08a8024a8641e7d89118342ebd56ef20ca29762019df61f5368748a74fb7c2e733523261076f8f92e7811a109712ae93895074d813324b00dac573df4e19b0fd0dcfaa0ec8bb828b00ae1d982ca21dc8d3276e0df785873feae16a405f3331bd351477f8cea4ada4b253541c27c8d43a39f8659dfb14a8b3d0836ee10a49638b7588c68163fab7790cdb0a6c7e5118596a7f19eb812eb14fdf2ced64e3fed688b1d9796d31d84f091286aaaafb1feebcbf3a72742e6bc6a81ee791a327692abbdc15d3c5a4c2d00abdf154d14ef6e4ac6e5dc7d547a2ea2388d07f1bb4246070aaac4750eb08c56e75fced1d4c2be5d58608a204e481f8503efcf9519fcfcfa9373a3bd60adca8262d4f5a489ee5d44596c2a1b2bd3f094b2ca5fb482e0a4e83cf6d089074b55e0c14512ef2bda63f8336011c1211eb9631b45cc07d2a12c1a8240d9407e2a781b4450cd3edd96a41c02ab8312398c37fe062b5acf7a5044b0d54b45fce39c20111a29199e4231ff6fe76dcfd32cd04737d9737726b855c1cc7d1432d627c3802577067b7527ea81dbb940ca7e0391a0cfe8984582a980217258c28a9ffb5a22f0cbee725e5f2b96e871b3d7f8c6fe32518351ea695cbf79ce937aee5d385fb9844ea940f44ccc15fbd42244bf9e64709641d4202b34bcb1de9657b013cfa06632c803481153699a46b5e88b139473e0f8db9d2dcd14917248d98738b706e425b7c982f99255d0ff702c96b41c2a937ddad33afcdb02b3bdfbca6f3706f1331746cfedc12755501e2d3719100a886478005cc531ace0c258f6be91d02353c2bfc85b4a63d43420bc5a69ab4e92d6b1fa6e6b4a92afc525703962dd394c61cd6ba72c970589ac3f0ea6015074bdbd06662d39a56ce2b41caa0e2c7f5ff850628efbd26cbac1350c734f10b25cfebb575d53134459ee27da9a65e155c5ab11dc45444dabb82e67a1d086f067b1b31dce304c7d7349341be05b7a0a20a0307b979301c2e18518204d022cda6a530b9b86196cec7eb77a4cf1f7633ed7b6f265b4d26cef802081c98258f9a12022b1d267683e48591195eb2d76f4b8c5528f44a50793f8862f3218cc423fc4240686291acea3e014ba80cc17ab8ddb4fed41a10b0e31b61d5a96e1586c893f7d87cf904c4c524c6792d2969a4d8dd9576b495e428e7fb412b99a85c87f6ff6181082758a75556ba831f6f8b576378c2d2fa448ef0621fb9910945d4adcd202317a86d6d510c4eb13b51934022542bdab2038c4012394d320ef0e3131e7566d3ac6ac61d47a2902366b8a8f274eb419671e3d920e42f7dcddceb23cfacb1160adbf70679968d1f15949ee0215a407cc7f468d10a34787087fbe517138f96aa528906e6dc54907dcd5bc0e5d63e077e77e0106ff9521a3c2e1860c495745c52d59ce802fda62a210a3d5bb2ae4b39a4e2c44efe3732786bb4da9e4b60fa16a0a8db79df50e0c4621e4dd9fd3773b585ef9e680665dc7f580245d42b83fe13a57971096b51859f70fa851da9f2d928fdf71035f737c9264645cdf1300832226fa87d0f050f6d688bf1258fb865731a7760360e2826c02d9b49405a74f2b3e81c61d0f835e2336fd366f07c942ef08931dcd2b029136ea53b6579a61ee73040aa56caafe4c742abc0270b3c130d44180135d3d44cf9482ecc920f8dae844ae8197aa70055aa642a5df9806f0dd8ea1ad6eabe7703cf6da15c2af8c12f2c14ed3f7ff8e937440771e930c75b40300d40b0cb29a569119d856de692a7a1f00c043ca3dfc5555c95dc06d609f534e35fb85b603cb47fafe60fe37dd045fb076ae57e1fdd9a0d8c0845864e9b513950799019a083ee614b2e4e85d208a720174a1e8f54d2785de9f68534c2d13667fee860e5cc949cd7e816c051b01210ba323e05556225dcc0d8dfdb46dcd4c56f584d596653681bc1b334c274be18fea42ab49cff4ee8b50b5f49ac76c53d97c1628b98c3de469128ca066fa01170f4569f21f5a56e91330dfbad5569dc5894844c725820da0b631d5c722f90d2f043e613eae0eb2c464dfd35d8055e741df36c5de9841c2aa274b4778a5adfa0e1d476fc9b024492db3236f4e1ac3da305963cb954ea2c586f9892dbedf190cfc07e856eac33bca32e9b4902c92beb54cf473cc37890bdc1b3a7f342f2ac05c03c4555690893a332b4c6ffd2691bec5c8b831802261576af0e16fad4f726896dda0379cb492c3f93d43858482b248cf21f981194abfe764352be85b8e7a282f89f0240bb59965c1437a81dbf345babe3657b9c9c78acce7a0e5d78fa2434dc5d41ee25f37d3933f9cdaa48ed0104d384952756c2cea7e3925165d0b70d7f1e52a642818bc58236b5f8655472d54f82312826a30f5d50bbd71643acebae022eabf6f49710f405e771aa1e9a37ff43d3e3493c01d842a1a9be64540f1d047db2f064fa0385d01479e1f6df7044bc43b11b0794578c3f46dbaf724b077b581f244685841089b389c8ea33d328f573b055d1b3b2405387e8994f00b35b3f35c22d2e89a8a9f2e556e735ea9041aecbab3f86e338329c063325103abc731240d88d4b1c3402edb019af429faf240f0eca6c5e9f309436fe6cb1be6f6be3f6540a1632479dc079c16dd9be3681c4c21bb84123f42e7426c18dfec789ba0c55780d786e6623e8b7c6f7798dfe72e7573e6ff1dc1a21a11f996252f5130375d281c1e4507708ea92d9a2a07e9dfc58d30e777f9fc8b0aee12acf9222686dbf87392cdae7d25ae12c65ec3d0548b3ac0ddf1faac14a3ba94f7709400c2a48226a0b22d767b77181fb40434b88fbfc17f7064f34cea0ac6d240a4d414df53322ae4294b0790dc0b17905e03b3f5e1acb6525e1a3942e101fb020cad291ed7b3c6a2e8582ab00fa65625940f8143bf2ea456b52d27cc1b1ef9d34ee4171923537165bcddf5dfbd564e29bc0726f997987a35faa575ff7ceeeeb09b7ffbb159024a262eee961d587fb1bf3d8d0977bc44f87a967601a802d443efbc3141bbddf747fbc8fa8e63505cc2d4bcd24654f47cb69568006318e3f5b2530bb5567e5dc3e235d07dfbcfc52d9923cc7535a8d335c65ca29fda2216e438ecb6aadd3ffa506b5ce1a89c1ee558188787ef26c259e909b100405b4c603e4cf8c91b5309610c4ce4d42f859f843684c0def2146e53e62e6c11011dce4413a3c7f51c608963d7080e4db48739f15e2d9cdc5195b121a43e3e6c9ca2f606b1c54b8d318e50cf76f88e8e3e11128fe1cb5a3ee3e6e30ea13b558fcc5fdb029ef0143ab1c8bb8c64a8114c50d6530a9ddaf91176c50a21f36f11c36eaee9d8bf82de38d5ceef14072672d5d6b5d7185c6acfc7e241f244c47746241e9d53443f1695f6a70a19d539bce1366d62755c683f89a4b5fc9d51f7670b147d96f0e16bd9f88fefb9a8ccbcfb77b15b3f4b18951141390e003129126696d4891533642725e87adbc314b90fc45a89eb82fac2e95e9a0cc1652ed8fcd556f1591b61306aa96dd2cbcc462e1c30f70308ac63ddf923a4a1c0ef62f4ef1f0a3bcf6fc8d14dae608d3999efa667d74b7a34ab5275741fb8d72a6a862c2c2bc8f32ef05c492c34bd39518de3d81d0a5f3416445fea018d80806fa7265231b115fc0e1cb6146866ca6c53243619f1bb6f47e958544d5a05b43c2035eaa40002a44889000f2572b768d3998bfbba7259edcbc33fa9b3ab64b050e0ffe0024788f19981f89ea855322c89f29d6a8afa89b801509f5a1c4e8ca4ccad78b688b45376a0e8560495f933171a739d455c62ae79cba651b80883a98687e62aa1c7c5b01232bcee14eae3662ac3c8c232d920601114e4ebfdcfc9c2418702281de6cafd534c100c3d5563daee74139760342396eb83388cb81f401dd91d4276257346e6086001b038bdb8b03151670daec8642e775febbfca12775070ead8bd96adf30e24e89841b0ce6a5ffc1c8482e305737739a062ae8479b0d31d5514cd411f25c246e9f93e69913926a34877cd47a5a179643127521f56b3fb4b42a466fe42b4c9886bdbb767294e4fcb5a42310104f8a21716bf6e59802e76a61cbd58eb87552340156cd7a62826d4bfcb023455f92e202b257381b23ccce2aa3f22775359c00eba1f282944685eec0687e35b4fce8253a2557c68ebd4a74181d233b96e2790ad6ece17e4305669bd7838d3c0ac8f0753a1cd8d0d10d2da552abf71153027cf1d82090154c943f4c9a4b4cc01f5395c70231ab11af1ca68c58841e34a01bd569e63aa7f3b1a1c6f243f6d2851f351ffae27cf8483f05ad4847f6b2533d9c7cc0a57e972a6467fff79d22885a29474c0ae2d159565d7c38754287a580971d44b0686b4418d8f88000089d8f8a623119b453f967c719f1ccc14785e21cbca7afef858e1ffca6cf97301ebd8ab42e7fbcd76702259659ec8d3b5e8210459481b2a4269a2823be6005d683559f001e0b80fd6ca4ae11bd2d368586fb72f8a0eea090a12cb09791fa7550598a4ae25a4840df2aeb976609481a522e87025014f4e537a9a4cb172545a3648041caadd7ac1deffc80a77668ffc6a94726ddc6c1d28e2992f04941ff8237567ae98aad3cae2ed3e714bf1d667487d576441a3f9476836681d2256daf6fdc70942240813f4889b9f9c489343171725004bc80086b02561f6f043a70b73b10fc88b3bb71c04990173032a8c64445cd36034c3113b08df04aa1aa5076e8125793b2658b40617b914f7816a19e71691cb3c25d840549230a22aa51d8128d7602fa227266e6aab76945b4c9ca836b6b934893a99b91c324caba4c9a9fa5bcfe633d19746651843f4a51e29e105ff61074bd1c4043c6a586a08a8f86f4a0cf74483d10afc34c2f48d89e59c555017dcb22bb920af945c0f6902b23a43e14f5b7bb6e7e7cc00168969518b9772e4813b4aea082cbda93d75903a7e7f19578e7d6de19fdb9645aa701098cf4e1e8545eddd2df27094af3c3481d41c0a5e157b10ada94a70cfab4e5549b4a8d052dbf6ccbe1feaf18e9a43a288415a008e8b61c1243a63188c0ef6d39cff3bbb3f8bd4221ca99f773f01888d04bb7e5d4ecc8b188a1c7bc4f7c41ff5130920db1c4d4b61c968b878b4674b5af466839a3bd0fc0c0eac32e33405728e8649d9a06487fb8efadaf74f5016e2fc7a31fc498cc3bace277023d473271a60d5d893fa1f5459b9758a2c44180babd8e8f174d2ea6a6064bf77a594a905e5410c28fbeccc21b0f2640b8f59c68af68df081ec23771410f72354923be8fd52ebfb59e63c64831afb60720e12106136ec09503061b457c3813164afeb0af68eb7bcb052043989ada1a0b157cb97473cff5c3ad54dca4d86aa15275fff0669fed0443aa07914fac42a62e9b2b4a97979ad23876801728673f5043a3fe13add4d74851c7d6c69489fa3e4eb08eb751568f8ec13e9863975431c2425b666a1d088e18a38976993c494bda99ecebcca46ea22d755e01413abf988a2cb19c05b303629248caa2dd089bf05ca13518cc67bb19be9c63147f89c37d10ead44db46bb7143218d44975b9e068a2ddc09e6ffd3995d78365290c3b6f059acca5a2897633dae5027eb1404cbb3907a7a671a937469009e7a9a30516e60625146f4132bf5e3fa635caa60ab04e8472d3a3ffc302c759c05e4a7f583177b590c40679999d24b084719ba4971a4e7f930e2b6f824a11809e736514f8d00db799230e8bc3840b21371eb2d86423b97142840ca47592857d0be56fd97413785512aa72dc91c796aac0a61777968246b339957e1c6bb3801d196cec2decc8107daf16fa2728e00b3134cdc5f20efe96303eae8b4eccec63618e6bf1ea80a7da2ac2d875b36de68da7315ad7690a9855d8723e1468a30fb5fd9ba61e0bf978e3132fcecdc1a03a9d76509339655137fb962ad1ca6bccb250cbafc99088832a2890a54c4a60983b694b04fcc94484647f5726ca534dbe1c5d1379068fc9d65f2b34aee35e9c83f0334bf00648e630684e1fed0c0e6a28ae5684b079a0e9c33abc5dead6fe7e037e2b1038b18c0be3db4dfb2c85a2af2f6761bc48bce8976fb8b7a7302d91cc0c87111cefedf4e6832bb36d38c8eb603d37c1a9f079ea0d14da278ca6589fcd036bd997fcf929b0c3b6218060c832ad1dc84ccb7a6aca70e345bd133993c1e9302e19142cc8510f2d75b68ee6df64384f7cfd44269f9ad6f0930f7f0c2d41093897677f3d506393e7b6c2edc5b1b6952827764043b440751ce8007e4720e967647d3cb3a9541b2729026ff4943606d5344e2ec43b106c2bdd192dcabab1bb3072046474d310873521a09ff1b88b42ea084e77bf624579c3dec9a3029c69400001a9172e84128bb6245b99dbacd1594b169c5cfea593b07a6c8c5c82a6300c265ae30e40631da548b05e80eb4b3d111c42666c8d37d6f75ca37300b749813c45a14c579119b97000ab59d10c0b3b86c486e3465db250a7b7d29fce0810cb5785039b95a05fa96d90f365db21ec6b09a72d67fb16984b364af4e0c712f8cbe4c93a7819c4f50a5138d5f2004fe92eb1734cd4dc83a986dab951bf70a934175c9257e88d1d9e69206b45a6e659fc1fd77777886cf3be8eb54b74aae395756611a0b9855de42c40595ac686904db722c0bec30944c58be46ffcb1246badb9c98e9333b79f72fa9cbba06128b23e5698ee48821c218aee526886adcfcec5b7599f3980cc056670f1be03bf29c24b353d87705072eff9691f8709839af271b1958f1f28a5dc1dedf36d527a7e3a1152eeb26a69d588eab182a775433631d4b6172e4469219e5ae737b3d2696df7e063bcea6b250fc5381ac944d91d1c148b464776252c745edd905086f4fa3124cf33f9462a263d303d464313e7113a0e596f65b03fbd3315e9738a7a3042c8583a1118144179a6118c3dbbb41ac200e68d339225e70050ea35a85251f953bfd5b94c870164ccd8835906cfa6b0e2f2200403d02fc8aa38d91031342d8ce7f64571bfd8464f802c854df95d73da0a37c160864bc2f54c8c95fcd70a27171788e7598391cf69014f918bae8c370b0e0b7500e793602f905bdf5a8f72d0fb51da83f82880fd9365bed2d8634e4147b03070244e318cd040198ef57450861c137793093c515930a0b493d5f856e9e5ea2550c1fb416d61560598123d8b1ded5441c47429e744b2b7ac4a29b1c7192625e369585bbcb330aec97d180b439570e5cba298d24c93dbf22f648c99d753431ee726d2c4f075c8eae462078fdaae1a9ac39446b9bd0ab07e3997758eda45d670c01c02b8a0383405a17f31381015c45b5862b4ecd4d41a0a1ae1faf0c4a93530e1be7ba0aa3279e235d5e90767d3e1f73d82c1b4599addb11ff490084043c1314eb9d7803ed8b7d70bf200d88c0f99306f22d0105c0c37e0cc35c05d20f4bf150413629338d2fe61ea5f42b3de9b6f0cd3064471e075e62eb9cd3853f6c1d0dc138489db25d9056561abbc7c34362ac535cea1a262fd1a8a392965d4b3f76af804b20141ba2e6e1e1581c584a9149e72ac6e44642c53d0e33a342057b161b43385fefe67dac2f31a0e5ad587604092f3ae90550a356a027fa91ad5a828c1ddfecae8e6dd88cc970a030d1f3451d8ea810a11485030c8db5f7d38270c2d1f3b2185f657a197353eadc6fa32bd597ae1c751f70885e503c54d3c20f4a56ed1f0e966e52164ae68173228c8a75e215abfb35d60083d9c2df4118558841ab5d64fddba55ecedcc3371224fb6158f7cbf177ac4a106704377d5792d6a661199c1add9ffbd15c004ca3d7e42b7e39111a77311fc096bf534bc2724bcd99399637672dd1bf0af668c3a50b3cce93e06913e4503410f06a73e8c33b21d02d3515ab881269f3b4d821928a9146da6079ee7e20f2e5cfe019c5f91ea74a75b6e07a9cd6a4a3b6a227d4e76484c20d615a6c8e37ba203cdb5e11a4768f42de8370ff3935b6ed96587297c984cf1dc535b384de7d9dff907736d63d133e0a8b00281a339a407db9d8f0f9a39e010386393f162e21fc96fb3742f55a6d3456a099e427a047d807078ed2decfb743d0e26f21c7371c0940706bf36ccb230435eb591596362ce09054303f7456010b8f0f3434fd7156b93df408f129d91ecca2b05e16bc92e8a47a6d6f58bc8354f49e9654b74798e74143093a64c12f6f468107ad58ec030f18d9a9fe1be8049b66a3cb21740a8361cf53801a90074619724f3bcef096f16340e05b8aea7076832d371f482aaa996d44bed05f56ecc81174008b1e0d515b48c958a2f0415f1d4d2bfc108f79f09ebac4a2579a720b013d67a8dc4b2b9b35b7a0a63a23d1307589052c2667156c05ba885e9429e0e988161f8ae4201c7e1db60cad18847af226a6669bf771d1cbf3f1f9a5a2337320bdd20e38ccff268124ccc0745b418185753afc7a010f5e009a960673a2bc175c1c1c47436b6d60b992f81c6b09e1f03c85d50aa371745a7a3300ce79a8c4e0450b1069441f7528c14002cca30566d3fdaff7e4ec0533c4c015cb5888f833c50cf5ca6894326d0fe10120bda3a8069970ab3768cbb8ba9390b55004e7418a2ee97764a93a4a99e65296c72854c1c8b6c78c9bebfcd5a821862150d39b15b4b763f38746896c1b73fd1c3d4fe52657942c6c992db7f44ba69fc0662a9cdea25665415ec294751449235f37fe74e36d69dd5e3127039ae7bd578c427b07d983e6116837d0d2e73e2980bb0ccd32567e1a9d19928daeabacf74d6844e07c489cf8618af207460b6b61ddc47338beab24107f1b0364fbb8f1b672f5db5d10f53bd9d87c260c5f5eb3ce4f465be5edd25feddd537aa86d4f5cc2c2d74a30dd857f7ce6deac206c79d1029969a4443990a56ecb36cdc513ab5c37ee38adc6afa48fd175f122ce66d0212980da77e7fdcc52d7036d78daf7b0e09c421057bb05778103a240c17ef7cf403828d85a7cfdbdb7ae826be4f6904d8e78c207105eb4128593f7f7149fc79e94ffffef0682cd9415a80a8acf64876b743c988842557d992e071044b21ed35d6e460c901ce7e652f8679cb6d9d195a820f6579fc5ca290e710994ec05a976c751e0990d74cd11ae5fc89a3609e9bcc533de3477e33cdf6a55181d7c0b3776f4cdbde4eefa580779e20c73b7f010ea577c167f97508b69a5bc5d9054058d9b87c65365e34948008b55a67a5165c7a83b359650478401ae8d5100b2b3f2ef602af26dc6ecdcd3269bae843582f1e9459a0c0810bee60385e7edcf749e51c426508450a9c161343b133f7ce504b1259be1af63c370a268586d9ecdfd02825b8228dca384cbd945038a28b5632a9bd43730dfba020c6351f310c23a934fe25404cba8b331226703391cc5ec67867bb161bff045e3b0cea20fd1694408b49d9e2451d2447628d35d803059a7f3420dc2863b37ac8b7f51d57b0105c88093aa327a9e0857a5ed7dc17487e230d7a191d982619f6019b47b530ad321d9093c285f1cdb159d8423d7b56fe05b40b437e32189bdefe0c0b43afd1007426dea7d9f4ec3a278e58e510095d67b1bce74c7354334e0f245ee0304c3fec6e7c4fa35efba31ff251198730ab1937e15526322007916ed0b0d28baa98b4b914a8cf70df58783e7c0e27b6600f953c88193e245f3165e41dcb223e8302b9cf051b652edb7c0bfebaec8da54e5bf1fc6370ded61ef8271749a9e9bb465ed94339e8b1ff8692f9ce348c3f93d629cfe5e0496f7907d4f947b9f6b2a6ed61c2a55ef463d2f6d8957c548a98decf964f657dbedc2364517bac08d41430813ea58372a327cf0b974f08987c504f50f8f56461e4d662690a906483b0c75089dd5fd344af749a254007e1cb85625c9bb9b853007ac4e8c288a9c6009b9e3eb57ad8b95c88e42f71eed7ba026f6f1efab07cba31000869581a39dfff26569db8e2f6fc4938b1434e7edad27de373d44acae06d0caa18ffa19abbe85abd08105af51539637e7afc2792a240a035ce26025bd8106eda9eabd5f9d043dc74e806a4bb21fac20e02c75c1988b9fbb638a7c9bca09b395257dfd0a5f907172aaa3a970b8b85911837fe12862b292cf02303fd005780b5cd0492fc33bf1fd08ccdcb24542654ad0147eb68994021e6e391eba246975d053a3993c744c41400bb80cf6d271debdd50d214fd51f8c63f4e5e1390afbf01298aff1078062e61be485c50391ca2839ae3b3138cd1441932d6d4dac0e850bb74e61f4deb94f37d8da5073fa9a7682773e8477d733cb6c857d3621ae3a941b7c6dd86f57dd56eda8ba5d39336e91efe376690f16e2862b546e7543fdd1ed0f99c2edc502df92432576b9e52597a09384bd84aeb24e7ac07850e0438b65779a7f13f3cf00840637cc753863da0b4ef055ce3a4d48052a7d661e78e11548a8e503149f7db7aac14f7fd8b0160f32896af281070b148a7df78b0a941a5b786bd74e685db8cddd6cfb49b110fa40a644752fdf66c1d0d88f714ac29f8273fb107c7dbc5652ff26cb2e4ce90dfa52764aa011bbf3b4d50d00c38c62fb669a7640911fb1a71cb7583e2605b3311346b4bec92784ab3536ee824aa2c5a4766409e5a3cc62c8f37e946a20ace0faaadc91158bd142b36d033f79bded22c32a91590ad63746d35e751c4290b165c67ebaf93f54ff9788a929aa3ecc6619233f39bfe3f57b4cea31af7292b9296628230ef1e014663b7d1305800f435a90f56476ae72a19a657f77d3289c52f77f20d4712fb32a2135845db0d14816f8b0e6e4e0bd330b59c5800f367ec55635496a73a3319bbb79031b4411160295f93debac93ce98fab7a75405cd06974a35034510103383f68faf4cfc160c6b219738746dd018c4a6f40bf47c1ad8357c3f7b84f2f58e3bbf53524fb8e2f1865d4e32946b2f647e0020109aa44ad704218651943390bb246820fb8b7a2cd0998f65481356075ff82eb3a315465c29b9e0ee5b78cd4af3d5190ea2789aaa818240a05fe7744680e5820da554d07d99b5564aa1ddfcac797413f66213db9baf81276aa81df87456876ebd370a312eec14420e7558c61373a8e8580f83fe9d37c640f50c6e5f32d92e5bb5718d42fa4523616c5fa598c24a4eddd6defbda59449cab40dc20d200f77efd41b3827cdbcf7fded4f187cd562812681e9db80d3deb779c77dfb9e756e0e9ab46b9ce3fe666e4ebb2eef6b80ee6cff3b375d01e80f7a9e4d7eb0a7c8e3b4a9a6ff02da54e4216eaa4f41e8d680a599baede5f8b6a560892bdd0b5ed05a1bda5aaba9ec21142b682a87ecf7ea209da6ce34df4fe20ddd584485262be6a01ba7e874f794f024e6a8735f31079d9656533964fb7cab1fb46ecb1fb65dd935db19b3bd523b0510574a2ba533db23f0a4b13306052048f19c3e779ce64066d77392eeaead930a702f311e9d364df5b919e3a60b631b381ea791ac562fc169bee751ceb42b11fc5446b7bf7e8985ef6f8b5ec8e95486fb29f2b8baf4e9fff28b93bebff77ff9bc3c2795e1b475723ea5745a236cad37c25e2649fad8f569f793c3a1b3b644b58efdcad99ffbbe535187d521368193e34db5ba2f71ec4b40529be36c0fe6be761a9ca4fd5319a4967469c680dbf66035b0bba79db63696aba9fa17486ddbae3aac482d2d2925fae50ca72efa9a92f434b6504addb95aebd353d2bd75c6d04b6d9110a7ec8fd7ca9ce37aaae7c1fce9db89bd8a031502420fdcebcb3bf9b2f1cbae7113789ee7799eb727cbfe463002b0b4c0e775dc8c99d7569f31f34b0b5860ee38e236223acedef7bcfccd0d6cf766de76779d84a35c7517c1cbfe934f92fff2ff423ee94d1ca6bcc4ef55a749a1a30248bddacbb51c0686cf75de570ac51560aa9a3277555a40d4e1db3ed84deaa6944ae78a3b7649e349de14902f871657af8642767dbf3eecfa93b4db5a0a525b821f2d004909e0489329004939016b8c036bdce5382c0a703989b63f8ec3ae011c667512eefdfd9df354385a21422370be941c268285e8f85f1f76a0b2d4b67308b6df615a4bcefc6b24f17f01dbe771ebc952b056d1860627ad05027bdfbdcefdd27f2f9a4c265d0201b2ef07197fce1851af5654610fa2064c1b38f910ead3b85a51a5545250f8e4aee35fcab7f49ecbd4a40992f2824c9a202a1f0f9326484a29039326080a14326982e0b0874913e4246a60d20431993630698288271f264d90107360d204b9efcfcd9814143e99c4f0964a390727ed773b44f9340e28c0f6757018a785007198eb242c6f7f871a3380bbec5b962606f0348ea5614b65e81fe0bab51caeb1ba83bf756799ce42e3c38cb16fff9b310e4c97fd99191a345cae9c4bd4b62c7a87eab29ceda10de0a4b53c780727edcf1b4753b958051083e4ebd95d19b97cc08b8ebccb219b529de47a9deede84bbd79457afb5babb7b75777bc489ef4e50edb436749296a5cddd10f5ed1203fba2501b4f9a691d662fdef53d5c5df35ecd626d968ef26eab0aab5741655819a956ca5a4bdd524a5dc609b03fbdd5b06051702dbd21ad8f04f680a4b645a2ba7faa95034cdf75fc65f88cafeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeba9cf1fee08cdc9291dab5fee830196fe39eaadfaad8fb7177777777777777772d6c8adddddddddddddddd7d3a8ccafcff8576485406cc3127a7c66aaa6bc66ea6eb662661c772a602662c07d74f96b0ebd3995d6b9d253adde4693ce3b04ed7c781810fef7b295963e3378ea9d0c90f844c428ab9f7e67caa5373ce6f396c721eddf45b33a75ef6cb1e5ff6cbcb1ea78bfe0c2be7c696b16bdc79f07c21bccc9f81cadcabf109869224e70fd6174e76bfacefa49314070d8c932f9b3a8c85c9a493b4b5cb97d60e8263d3566bcf191b278cacae3956d774cdcae1f400b6ebc5c1009c9f3da017e90f63a3879e63ad0449d89f71d81c02126ddbc7c164db9b04ccd9fc04cc19cf4dc09c0d61a207f7b3fefc1baaeea1b3fa733e911b7842508059fd1e3af327e2698ffbee51477428a0fb33083a235147ccd9fc92dcd3e6452698978d192afb7e3e0d95957e3e0e2a037ffe0c54661ff5134c799be79409c5d94945a6d4b1eb875b7cb04eeaa619296503c0fc3265fc4b594f19ff2f7f6b8e93f447e14cced8756bab83fcb0eb18c467279f4d71e72706391042132b084189cf8c2215c1055b042de1810c7630a33fbd9ae8960536c4292ae32659dfcba5699a3ea74c2d3bb0edcf1fbc54fadc95f8a76cff19f37cc6a6bba60c53993903a74c9cb2939e30ba4292153f468a98511748e1760b02d00ebc70057ac410be306207cd216ca1c9a6bb52cc997e885059b8ebd31750d9e9ebd324a80c14a91055728b26cd1cc2ae4f87525f9f12b1c2df99a97c49c3accaafeaaa9fca1e4ea64125e3d4ab8884c0672a5f7f8a0e9835151dfe8e2bfead5ee8a1b2932e93a868da0f4c80aff2f5e9105406ee38813f77a859a7dfd9e1d7a725f0c161a216fffeceae9f4369384e16a132f0eb0fd1a1c654faf5e97226db90432fcc4e65e8abe494dfa03e72aa175847fcf04d5f4e5b7d3a549f02d5a741a08e90bac5b75f521dfb6116c5d2db5605d87e396da607f3dca1a64638599fe65458398bb0ebd75abe2a17b8061d14fdb11614df3ecedca6b75697a61735cb8adf775fd225c41c76dfd7594b8d30f22535b26b4a1886e1d778788170eb843f6fe6876f73f8a6cc02dfbe6803957dda64d225fd32e0039833203e58a249f41063db17338ee9ad2ec5373d9871e616df028169903ebda5e1eff10e28e65244e1931882a505ec5b00ccdddb7c52d1d65d766e5a86dbfe97adf729992691350da24057c03650d9dcf54d796e1c87a174891f3b4983cad77fd558eac7ea9aaf92c7d4066b98cacfb27a74b21a41e5533f67aaa756c08114ac1a76760f78ef6c2174db9f3326409566590de46e1dfbdfd7a4241d3bc5037cef7d4a25830f82b91cf72cbd9c595d7a86cacccfda1a74b02e5f5baca0a6402f660027b4f6436d7a16488196d87487a692cad324726a8e93f5a467f4cb495b04d6f181da6696fdf03b1cfba1c62753fd93a640e29b2a05e29e0239ccf4b3fa75dc62cea1e1f26baaf5be94715099f953e4f1691a2a33dfd3335099f9727272ef796c67c6a53605821362b982cfca48536889ca7c3c2929a52b9bbad681cad09ea31e1c8af8a8311ca222a7ffa23f43ff4928dd7b5ffa5f6babf5845021b5fa50a5341a8d26a45a6103ca0ab8e0441021f8e2053b3dd0020f52901748308526b3f973bef78484f997b1e5a970fe7092fae02efa34af07fbcc4a85d814e092066d4a977058fd516339d726c749fa36fa38f45f334235e87af7ea9003102115480eb58b273a581c38fa5dc6c1beff7032071d8008a91aa8fb470dfaa455e27ab8ef25f53b79354502dfe77269dfeb53fa2f24d540c2717a1c752b807346676b70686872717017f5f183729c0f26601c9ca49da300571f38fc106d6e68ebf7709296b6db723c46434d8dbd288d69c1094b74808324a8a064469f3045124dd880a70538a0cde863faa365b2240b465e18d1c51235dc2725599a48410969df089713ffbe376321c7716278753999eceb5ee3bef44ab6bee7a02ebd92feb4fdeddd7bab9e7fb969bdd4b67704f3f61667c654eeb3a20d7d8ce3aefa38078d8393e4ae2456ade0388c07f17910e26d084c99fa42c61d010378ec87f7f0980ea62d6a1c664c5551bd8833694cbb7299874fa5f244549f7a71e555fe06d5a7547ee56f50f9153d84891e2baffa592bce717ad38b1963ad737ad39bbaf7303e3d2de93e3dea533e0585b30e7d93096b13fe136bc7e9518fd23ad34950c45c9e9bea9717669899eaaaafe2e5982953bfcb42f096993195bcfa650a37ec1e08aad35a6bad36f41bee15594b3d0998fe64721241109e3099504702ad618cbff4505fe2942f479599dd3df8aa9cca2a795697e953322ae36f32a95ac428ed2b9974f9a4a84bf215eaf245ab51da64b2f3c4ee288dd266dc7b0f326477ef3f76f7fe7b32994c68addb11bdab82da962471bdeeedc427ec5d2781b0ff74eba4974048d1c67392e259a636107257af3c00e70c2cdbf7de797fde6ba9d5d3660fe6d20b84ef7baca3d168341ecceeb4134f25d33563bb8a25a66b6efb3626ac7bfbaf09e35eb66b9ccb365bef7a3ac9f7f79b4b88389a2f3b0370beb45eea3843cfcf4018f7afe28ed37e2501290e8751f04b2cfebf885f4d75d5777d2d0b30cd93f4afa955c6f6f2019b2be972dc5fad9511d8c1ed4eff8c71cdbddbeb946a20e476fbfa0264fd6d613cd67257f5a691e797064060c1b4fd4c223f72a84f8119c3a9c2ae3f374e8dd1a82561575c5dd36802947e80ca4c54a6fa0f2a73dac88589855d7fd249855defe5bc0984ed7b3bbfcc98f92eda58cb751cd771dcbdd6da6b03274f68a18816960080f55e647eb2ccaf8c0157970da98cfdf934cf78ff3269ba3dbf6681eb9e3e36f7542663cad0b78f6b6c00d365bf346d5b244385b5f6cbb1c669e57ceceee9fd193bb3ed8cbfcc982e03213757d21feb71b0a89ea97982475ca180e997d8889b417d79647d1c1e037fe2fc05bdf7ea7bde7657f56080bdf7b4a54ec0e374ddafefc361e50c0e0e7b21ddffa3e9ba5fca769297bca50e9b2b7dd81cf7bd019cc4a9b11971c6068c9336090c43b34b8cb6c7838dbd3ff3dca0e79bb9c5109c27470abf136dc02f65baffc563dc4fef3a719757c58cf1be844176a99832de7b15f0cf8cf11e7b4e30fe8f083eed222617f36aa1041247464e8809c417e351f5e8f6483065b3d2b8229b23627b6f91e02a05a6fb37d87946dbcb3376a9705d5f803b3d84891edd733f6444cac20db09875faabcb7bfa77044100cde60c04352929dce55b6b451b8fe2a4d7a9383aeb32ab07378455bffb95e7748d2ab37aa886b0eaaf685b545dde1b6def551aa7ba3cfc1fd7cd5497f75c7e5597f76e05c6cf297158cac354ea9108b6f7a316de5fb1bde78ce0bd4412b70bef46c13cdbe38a6cefeb1673ce9a8559bb302d08b6f7f605d8b35924307dd4978e34a3621256e9b9efb42582034948494838b41e8ff9e0d0681ebb3eeee27eee9ba4285f38c54f973ba6af3ac0a60b78620ed4531de012136d568ffbc3ea617ffc510fb940d5c5bdfd9deb535ddcd7b875029798c86767736fad688343ebf97269f7e7a2a87a1c5a1155c6a1f1883649488eba49fa6e92a2242139ccf5dcfee99b24244c84bac2a4a19b03bfc64fb5cd7d7d4c3469fcb953edb54bdad33d2637cda55cfe80b43f0dc4d495fe537ad0e61e136dee53724997b0bb44d9b8f7208e7bb755ff61e2316fc63d45aab139e3de8772bc49759fea3d4edb1cc7715ee3385ae9459b9ba507e109ea4b9859d22ea03cc162734e36f7d3976cee7621582ad9c7fa3e4a8f6fd263b699950366878f1fec72b4ec203398500f9a728e507cba43d1012bef39b8ba64f6c4ef628e538ba5e2e6f425f1c1a75eede5702ebd6d32658712828f5363ab5ff969dbf8a7d863859fe29fe28d0a0ff04d0fe25c5a0b3463dcd69ffa536be93eee336340ba71698b9af6784e8a0f3e483d97b65ea793c5c4d27137eaef46699dd397fef4dd83a75c7ad06f9346477cdfdce7eb738dd072dab6e9699429b0e9515b44659ffe993cd32d969e6fee697098631f9326dcfe9e69177856f0bb3e360cbeff57c3d086e20d4d5c78ea5c0741bbf4a7b7e2014a7f7a3007b8c17731878c0de2c7fb94bdedb749033ef77ee430f1b977280ef3d064f277d1bb20346977e08b4fbd90128165b893d408b8bc3e9b23028b27c0e283949bee2fe6c81bb4a2e9a910b04371927bd357ceefcf6dc670efcd186ad27ee424f7b3b9af42b82c016dee4b3fdadc3bd1e6dee42fe6a8dbf5f52902c6d7c776a507ade8e3fecaea6bdc73497b449b0986549c4ec26c6fddd0ed95d619ce187f3097de73f7e027da805fcae04f8e63116f60b66bb0b371b243ddb0cf04cd1aeb512afdec1efc2fd349748511fcb48498819a557f67e6819fd99c954af907aa0450cfac94594accc07c0a8289a01978a910250801d04bc90cd43fd4229ca0e068067e29ff3099386106eae937ca30d72322109a81b70a4633900bc13c91e0829e19585a81163f33100cc13c7e4b88d9148213aa609b95760c433093af299e28729bcdd4bc94cc9ce8881920cd7072ce0f702bc9cc3f4014e4332b31788242063f389a81221538b8cd40d3173c3f33f07404298266202ee26806a6c25266416106e65933c1078e66604a08e639c511da0c5c094b9955c50ccc144a11867a66602a04330d153c1134035547498866d36f9421987f9848a8c2cf6cf502db0c1c43304f221c21cd409610cc530927e899812e442560a26706b2423053231f08cdc0186129bf94ccc0ec43c8c1126a33d02504f33c020b8666208c10ccb30a206833304608e65984244333f043304f9b139066600ec13ca360426d06be4c19d4ab0c19f6729df795c050349d300a95a29252adac648c2c2dac960c19325c60c4f80cc3cbcb647f6756ca3b338e7b30775fcadedf5c8a3d4aefe9213a5457fdd283620ff03b3de447753981fd6f4de5b8bfdc74984e49d4c169cf299d2853d9816df5ccdb01752930f570877bea96d35614b884d932c83069666d11e16a6346004ef0c48593462680e972033cd9934e590e54c61fcc81cabe29138b3501a5c00374b03c79a138659487cab8e75defafc7436506b061c6d0106c7f8e52a4d4f6668ca53c944e1a9a0f43c01bee4083d0dbe97276b1ab0ae655632a97999794c3beedcd187f8f0bda92f2e2937377af358f684f3a3f534964dfaf71d7a5907d350fef4d5afe50eb156cbe3b74d884f95fbaefbb17b274781058bd95a26f99c0fe65cac34ae01daad77a035a0f6d6bf200d72f531ecdd8dffb204481b45d014190a2677333f0dde009c43af7a9c6a13fc5d55671877f07eea5d9739241ae66ddabc1fb3af49dbec3002cfd7c29ef6d7ff353fe03aab1d39cf9ec9443f03326c207c31a639558f655402e2c654b69ee7fac1b4e444c7ffa39fb5837a43c7eac89889ff273f63dfd31620294528162617ff5fb34ab87f829e2efcc38560f93e977669c0eb99cb7fdf9406975d21a3edda12e7dec1f760778cee62c76faef716a0cf5dfe7380cfcef7b382cfcef7d802f87d1fdbd8d2bdad422eae1cc073ed885a55c3711fc63d2f8fefcbfa7dfd3220e9bff3df5b93fdf4bc0d30273f1c5fe1ef4441fddf3808026cdf083e007daecf4a51bbc477d8d571de0928b3e547e8a37a4f4105f450f41bdd8c3f4297ac849f39c1ebf09ff802a95521ea587ec505ddfa7603d4487eafaac13b8f4e0a7e4393bdd134ce77e57cf38f9bd0d27bf9793df7fffc361a5ff3e078fd1a06b9cfc6aecc55ddf7fdf9733fb3be91fe4f7df0f27bf1ffabeafa1c161f7bf3765f1bb2f9fd6b93725607d4a04e6c16e776b873839b1c8f16d1c9cd43e668c7ff5e12e7fcfc3781c8b2a0eee721f33260738350603f3d23e035cf3dcd50b4ff66b4f288aa06417ed708f0f858d68833bfc93fdc1f481c3d43d6c107089c1115c117f55dad853d425c5220f708727f1a6e53fcac2620241b0358ee3d8ca3a2e93d56ac17891a5755aefc283f5e18f2f8694074b97be5d9eead26d6cb184a1e797e2b7582ebf7ad5eb087fced59cf4555fdad8ab6fc927f166fc691aa916e29bfe388a54977404459b55cbc585037bcebf613935de3b437ef06187aa9248a9fa31eb88ffc39eb9ac3b7c2beaa89b65d4e5ce1e43d5affe4565e1cc2e553a48dd25dd2c5a675a9147e95bfcf057af1a1ffcd2e5bfd7a58dadfad6b7a0608075e68b3f7ee9a2597e8a3cc49f79cc654bb3e8d26e552bcff92ea20eff456554ff79f5ac8cbfa6b6b4d4a0b2198adf6a85e2affe55427c872deff2384f275dde136fc2d769d1adef441ee10e7599819d3d7ff5abe7449bd598e79ef9725be4c01ea94c05fad619bff5531f60fc965737951eb87bfc4c434be9bef3b6c2eca2597e953f9d7252b55af9ac416556bffa9aba4a89aa9fa28eee68afe8d1d6f0dc1454d9683bef098511b000024eb9bcb6e124cb53d1c645ac416566a85f54a60695995a88f651830a60fed4e5103d3e18e672f519d8d96128feac21e62075afd41d963f6c9dd6bb844b70f9527d1d57af565efdf7b9bc2ab3ace4b26e97b7354c37fdab1a5ff5ab0c5a51d4ac1df4c5bfa12ffece0e73eba738c7bcb36716e2bba56b501995ea6bea2abbe8140b0b0e111e59f2dc602d71fc00bb6853fa1c1bf3c906413a4bba6798754d5dedec95a883d429ae3e7cd5cf19da5d0af11a54a6d2e116b598a728be0d31cf7267da58e5165dd2ddf261c6affa17c66fc361aac7eff3c9c63cc05d83ca84aba96b509910c7612a58cb87ef03ac23fedde574c2e36e5157f1475ddae89183c3c2f0455d83cacc30b7fccc2ad39827cbb77ecc539776b77ecc2e2fdeb0b47e25d33d66979fe28dcbcaca4aa6bb355d7ee5c6e5c7af71969f79fc95afaa5fc9bec70c7e8bea6b50d9dcaa77c9a5109f36768ddb1e803be8349d9e62ec7d2af52a181f7eeff2ff31be257f0b0a89ea671ec3f05938f4a8efa31aed587df8625ebd2a9743b66ac7c86a7da84b160f96177f6e5db25a5a8718fedc43f67cd5d754552e591e35b67eb2f0085fe4b17ad58b2c5ac7ea55bfd22a3d8a25cb83ab3097e2abc41fff24e6954accabf0571a8504877afe49a575567ea575581fbe10dfe1cf5c8a5a88ff8f1afc9c4bbb5bbe8a3b3c96b64ebe7efca12e6358275be6e3a7e201a676f9dee573992e6176195f54b97c387f7cf17379ecf2e1fc51a54bece2853f43182e1ac663181f6618baa43b54fdd42588f3fcf0f1cf570967a8f2a1edc17cbae78b7ae5a9f8a5add2517d6aa6549f025379fcd58ef8a3b8fa9577d12688efe97d2af5aa952e7daf9ef5621e73e9c31e5befe2c2f2ad3c9d64d1a510df6506eaeabf6f11c51f9f258b79654c3dea5939480ebabf5fe5b95b3ead01bae7972b7f451dbee7a73ea54bd5cc2b2af258bd98597ed4213e4b4d1d3fe567f6bdfab9f22b2bada37aef4b21be553af5e0d7d410ef948ccae5900d3e8b68834f51b610ba3d53f6e17d987170d814bf0c7b3c81e797d3890faf715114e78b9a0627a7dd25efe1e3c139c9f935baa61cb2e7579ca969c874ef6f4777b43d6dc3c9cae924faab6b3ddd55e70e0d3e108417f440518513f4605667d841cf09aca0e2072ae062567f87fa3eecc0049e4f7d62b80068503b3b5657f576ad7fbbcad5ea4ebd56aed6eadca5dcd76d3df2defbd5de787673f95e5de3ac1d747b4e52d60ebaed9cdb93c26d0c335a31d2ebdf9f51619cb4317c799fbcf7be1c764ffbc6d8d7b42f8c7dc57d5df605f76595f66d417df9e52f59f6bdddbeab7d57f67df952b5efafbe4ced5b657ca9b2effba4f19ee54bd4f865caa678d2b4fcd525f9f74132bf32e9d5498fd199fd97c3a6571b439e91c7f2c5ced46bed6d3969c96d676066ed65c361e5ccd5a393f665bcc0a0f3c780e1d262b5b08cab957ba44aa9a4dc7befbd5ffabc2edb5bfb6e00c6c096b58fe32e4b8311ae5fe2a0d176d5d409b8c4b12d9e24f7381c56a66abab7de24b9ff3c1c561d64880ef06bdc82d65a6b97c0f56d95c761f60bdff42fe4297b0e137f06f1617bdb6e53a6932cbdcda507ae8e2bd6d27b99fa0eb369921748d9f41dfceca7c51943bfe461fb977269da34fcca0c74dc0d4ff46477e8d58a971dc71fffc7d638b67e7c6f3ad9aa3ae5240ec21a10a0406b2548e2b505d0e79cb37a4ef270536f527bce18f2c75630ac1773f607db2fed1e4b5c3d3dcb1f5e39cb512177dfa4a4240ddcfd52221c5faf99978d99d7cc6b66e665e365e335732d7dcdd418bc9493f55f5e24ccab7ae3d3d7cbc60c8ef7bc719c3e4faa606941a001edf9524b35ea60a5947ea540607a83eae1e8ea47e77f9fe71c47cf9bff693cf358b193b59567e6ccaef4bf8efeb4ba344b070f765f1cfb6a21012bdbaa6865240b9205c978643db22232da1132da86fde0a0ad50994d5624c34266247b223b924191dd6448b225ecfab22b644bc88252885645ac7cb1f259415a11ad96ac9c5835b1526285c4eac8aa6705440ad1ae9f4294624b294a3182fda40ca53c913274c4e808db114547181d51440bbe38c2a7054847101db1e408278e68e208258e40e2882347f41c01c411a3234643a0d510450d4dd44054839014485270218516526421c515525021454d0a278640dbf573d072f4e4f0c9f1033302f623abc998382c94f1d8644c422635221b0a082d50b4a3a126504aa090401d4115811202890b9b8d09d1d013434232265d12425c5c712b0a834224c2236111a11021105f1c6521243454eb92e8826434d88f8c474693d5644d643659910c0b19510b70d9d13a10744074b48ea7ebe98a743e9d91ee07f683747443e294e08ae082381fa32ba8886209e704d70407e40363417dd8912903613f30231c866149c082604bc084a040b9c998c86a46464f88aaabca8aac407a00ed013d0ff071c0120728e1809a03829480a4042e94a08512b250c2154aa0420951286148094d5881b4eb2f00e906da0d3d37f8c86ad54564931939f9c4c9faa34bcb8a465991ad6801450b305ac0d1026e0be8c28a2cecfa0be06201471600c4027e1640b3c2664514562cb1c2092b9ab042092b90b0c2c70a216c45bb7e4e518e51ce91ac266322b3c98a64463228b29b8c48765493d914d918d91c4d9a12b689e2309310b2b0ebdb703165e0d7b739326d8098b1396d7e260d6ad2a47cccf68a825cf24e8c4d60253a244e3e5b08dbae5f63ab29aa31aa398a21e78791e78c02d518ece72b85fd50d80f90ac061baa311c4015471059a28a64b55d5f56abb1195f5f465463317ea28a7645720b92029b0b8c19292b2b7c42c97861c570b38188cad49f52200152714211516d48c8250217ed680b18f95d340c44de8f931e0b8eb6101212121212f26e20e5b4cdad481187711f83e1cedd9eb0e189da751b846c50c2dd2a0e92b82511e431185d18430c0fe61d46ecf8d9e1b3a3c88e1e2777f0eca045419a31b7560c0f43e671f91078b397d7b9679cbd6819ff52c3175386055dec1ab8e8c2ae5f7a29d83548c64b0cd906c945dbdc6a3727b51a834154632e362542423668e18c0ce361c82eaff3cbc83c3260f819046842001b01aae8085034830a66f0996106243224e701cd1044ea6ce3c514c016260d2ee60d1f19dae626746b42652fa3262a98b1d7157c6aec7504e4301a4048268c0612af880045280214710428b29a004504289a21e83505d17d7520aac4d1d4085013126a15d518ab56f34aa592e906116ed86e54718308378a602a80f9c08060486041376c37aab851045301cc0706044372a3e846d18da21b45378a6e14c18264dca2dc6acc05690523061882e069e5ed7b21d33208de0bb92743916bd996ab487dde1d7351a66510e49e1a7b1d6528668c46925cab311a40d9e6301b8872151366c314299d7bbedc937b6ecfed19734f2e52a53eef765938ba05fd00f5747154632eb7d383331e146f4e3933717a9b79b0a82fa9529f773bf0751405a98bdbd18b8b2cecfa2a21a0d4e7dd25a8d2e956743b82e23118cff364d76f296a3172d87d105cade0d32af3b0d23044e1688b28dc6a1034c403995d7a40402d2bb52218320d254e43885b51adacacaca8742993d225f9e9f23d5d8e2d5a755ba9c9903f7e1e0c6dc6cc210475d9868b29d3850d122adb44e9c9398a38e9f31383cd0dc6afe424317a6e3d3f403e3f3d3d2b2f8a36ab17c51bbbc5fa32a232f6754423090d201b886c98e2f36ec7d110fabc4b05474328c54583a109050155d78f111fd4c9268a0d92cdcb88ca6cb8c8c2cbe88604c6508db9d46a42bbbe0bc8155463ac1e9f1f263610d100a281a4a321e412818bf63a7a6d01a24a9c0d441d110d2197085e5b8034845034844a3484381a424dd01052828610504a91aaa868d74f2972182acc350ccd98a019535d9c10da3528316b406226b18f8c9005d11535a028824697db8c145d0310d04d09508dc108aa31172117edde2730ccc83d3fcb2f3e118fc42d529e912dde4c35300599864c3cf8bc0e448da65ace30457a6e3db72e909e509968b4c584bda0a0fad4935b8dbd8e6a3063349204d5180da02187d940c48309b3618a144abc8de20dca2ad770b4926b78a2524316130a355c2105143ce52809d01444295dcaecf275f4bd8e96bc8e8e8e50fa75149ebea421b46f4e6e2717cd4991c760bc100c0faa429db30bd1142eda15a6eb75546900390d2493aca82f651e1fcd98fa364c01651339ac062d2659bf0aa5b86835564313d3758519b48f682091c2081a400eabe1c824ab91cc15bbba68d8453bb968eea261981e9b1b52750109dd60c893c86588a8490a9544120ee362305ec3a06dbab8fddc7e8cf0188c9cffc191259c3318328cd739c65b1a6dcfa35dc2f44c21dc726adce606635463396cd506a99c42b81dedfa647b5f4e2144c9f967c8c836b7282f39078d9573f48c48423725424c9e185bb6ae5a2baa56aae52da79f373b6e9c339de72cbbfcbbc48001c3a5c59a4510774697400aca1d10acfb26e946c59ba427578a269b007b0a218a25c050044be14dd213873db9953749475cbe49ba7147506e926e31b67ba24d7d524de14be5b0e83831876f7dbfc09c4edd9e6051b17058d55840497ae2b14f324a8292744b3a32c2a2e8938cf44d12164ece1d63d2cc8e8a1f4a6e926a35db594ebc4922721891939ba4264e2639e97e4291d4644ff1a6d337494ec2dbe5e9a45d02a63f9d542227e7e6d12525dd24d51c769354bb49b279ac1239139b9373dbdcdd9b2427494d929824d5926a494f3839777d2656df24d59c9cbbded56dd7a1fad409d6148b3969807042148b4c9d6c01db2fa9935db91aecd3975e11bb3e78c51cad6d3463ea83d4bd554bcba64349a85075091155577d51a4b52e64a14162120ab40320cf03c75d1f75f3b851dd0dbe156c04ae25d5ae4f9fa49ca0449bab5336228c12a98f0f18723ce076c029e10a8a5135d106c5c4c97a0214aa96e2d554eaec940f3eedfaa69aa9b632aaaefa6188aaad8c6a2c657357fd7af5ca28652b53364e0738e48a381ca484f4045815ee5d7b4abfca3eecb0025ad9260d0a7c0ff4400ff440f04b727b291f542d05b592690f8b4869297057119cbe47f938a9c4545bf93e1c7c14e5f0c308084bd4e128a44fbc1e2d31078ac3505fbfeb2e2ae39899a1a1e6ba88384e56228edb348b49a3f2f56f93c6e64e1c5cdd573d7d9b7afa2d2a1446a5502cc03725daa4b8d0bdd271350cf15f30441286b8a36e95f7f207954c674ccac3106d541e1c432e09d48885856efa841e5128b6a61245d174f50ac895a054a89bca292745362a3a65e36e00b68414ab7c8b689312dad7a27e8a3ab88dd2a88b42daf7aab48837ad7d5bf45663e3d7a74693a6eefa37d74d8f6a6ce5ebeaeb3bcd6beaeb7b1187a57cfdb1d6942d8545ca28f544cc11635f9d2a2ab28d78072d97f06677a130c01865b753b6e9aa7ffa39632bdfa16a35b6a24db5ab6b35276f80e9cbf8d58aea532afff79fbeddb953b44119edfaa6fa622e2d935d3f34a16a2545daa924b8935da6cabacb946d57270ee3be62018413da17c816b4efe584f6eaa6e22e549ca6c33eef82d65a9d92fb6a2d681ff4da99ae7bdf7fe17720d88160973fcc3aa54efcae0bbb0f3f107f8d8ba50fbf3cbda85b4c5f8a0ee2d2773a046b50994f7b9d2e39bde9895e2faa3072b7f77a15b62a82aaf8d935f684e2084feebd1f576ff73348dd9fbe628e9ddd3d58bf6ffef7e9d89f1ce5b8ea1fa4fefcf97d9fa7cbef3ff0bfbfd1e1b4fd52086a21be4bbadcb11e970a391d58f1c406c09e5058e143dbb4047b4251c56d8327cf7fcea7d833856118eafcf085a19df17d83d4aeb41b55dad87607044baa4fcfd137d1377126fa266ed674c46a323dc79db83f852fc437fde14f5fa63cd6a58d1d6a21ee758f7f3a0cf5d8a4c52f5374f9f851793a897579d29e2e2df7f6c56c37a74b4fa79ecb35a84cca49aa434cb921182d01c25a6bade77d5d47b929765c0ddb75d65ace06e59ea3dfb910af02385fec0ff0741b043c311d01385f4a6f73de9c34f47baaa71d020d3b916acf4281ebf601d6f9feeef2f7d781e287978659ecbefb29d2b7fbd335a80cfd9a7a756a6ca5c696c3b869ef10ecad4165aeb642c0dcd31458c396f501a6dd835f1fe665a3f4749735a84ca88dd064936f0426bbfe0b4c0d11d42f2a632d8f5baa41655f5e5d83cad8cfc0cee6be2c69f71de7f970be3b2e755fe4acd5e7727cd4e0f8b5d4fb79750d0d5eeb348ea681068f7133ff2ada74ef3bb3baccba35df8c937efde270d267340d384a4f96c817dd7292099e3ffe7deb5dce4926e054fda693219070573de2cdf160ce7b451bfa1c676dbc6ad87092ba0d8eda1e1cc1c91196d8e0c9dad8a5bf10df93c89e543cd902d8130a2a8436f7d45abb69dd5cd6093284667b7390ba395dd2a94b1b369c68c3fd9cdc7b1f660f8504735a484997d6c59b7247a77e5a889742bc460d2aeb347d4ed7a032e1d635a8cc7c4b3445931d803da198c2880d9e405073797e4d7d4e97437cd8e5fc72673b9dc2dde94fafb3b665adfd4e4f27afdfd1baa79cecde5e7c3d3aee6caf5340dd36d77d5fd501f6eeabe841a1eeb7cd454172b28bcd4171d21a6dee412447126912b0bf7b9ebd3f9dfc74596d9b7b9bef6f66ddb022727ff5736633eb861522f657928089e0f2fa2ce1314c84b27125cc473469608a36a70465e346ee86201786a268fad312d707c4cf3d8833e6a84e325e233ee349489f829cb449c025260ac25fe314838f893810eb1fbfc17d39a2a811f40866815f7a94279b7b93fe711865813ac7c7bdc9f4dc5f23f7477cd73c74bb44e992853745da406650586cee5136872101fb9728279b7b9087e9a4a8cb1a05d465bd6dee6bbc1ee5a0cdbdb502b3b0be1f3f889dd97d96ccfa9ee583d899d9c798a8c658dfb3b0adc6589f6621c07ecbf7b0dff29fee719fa5878c7f7f080b91935f62279b9baecf759296af718b9b38c961a21a3bd55a4eb539bba79a93dc5fa01b747dee0f0bcbcfe67ed43e9b73826b9d68f33dc8f23bac1e2d2de3efcc58b20355173766ffa92eee9dc81dd4dee4c36097dde6eea4a8c8494ee555449b0f4c21dd1f354562f5189fe559f410fba3765a7571dec461d39b38999d283b1327b9d3734f831c067e89537cc03f0555976b10f55f46952e7e307f6ff39c9d82382ffca04fa36ce4be494202bd14ddbfcfe6eb441c1a0e8d8643a31571d8f738341e27716845aac0fe9388c6b3a7788343eb718d432b82bac2e638d1e6f3c4cf1e019728dbe69efb7158396b38b4224ec2381c1acd73e937017373d93ae9204e8823d28f025ef9d5fbb3a8cef16dcfc7c93d7e8a7b3edecfae3f669c471d4f52aa1aac13b08502b6a3e8cfe22d3b42fb045c7a4f11af360bec53fa70b2b6c41cdfcea9315b350c2f3266c440ba6480890980cc8b86e9544300366ec0623303a091611c0498a1003530b8f9327d351577171c81f3a5bc49c0f4eded02997e3ed8d5af8a35a58615ac44b5daac6b6a57ebf753eca05019777b295b29f799b156a8f5ef5b28b5da5496c70e63b150ac70813667ad608f8862e8d283a14b1cea12bbe8724cd1e5d8d2e557b2d3e5cbbd25449bbadddeac40656cea39d1a6ced578d22894fba0502814ca7d6aac0e0d0db9cf90fb0cb9cf90fbec215a77bf7cedd293e42e95eebdf841daa9d47ceaead08b24ffc7d11bf23c8cc791245faf04cc194f10f9ff8380e175feff1e59cfeaea0183b6b5eaf2d7daf65417a5f5b7eae6bac555bcb1f57af646c4b15b75e3fbfeb4d7f42eeae8b41d9a3133469f7e7ecdf5e6799ee79deaadde6cd0ed45922af8bb4630c6f8f1978fbf24f197af93e7799ee7790f9eeebd0f8629e2773bca05bcfaf21a79bd425d92648a2effc71163159507ab7dc1902fdf1a4b2033fb1a718d9cb880c72faf916d2252f15079a5de4ad42e6d906d52bd222c8cbc2395bfb68be234874deff12247d60a5436b7bd856118a652a99aaaff39dc33e535bf7da63d74a35468f865952e48f5212ae3bc76effdbecae9925a9107b8af7e2a74dfde6c7fee589b1d96a255fe7b1f5251f95ee55db451d113fb2dbf7dafc6feed57fd6038c57a638075ee5f4e975edbf661f6a7882d8936758a56c8d65495fc51a15a79aa0fad34272badd29cbc4fadf652a9f4b4a7529fd3835444c07339fccf73566f0efb12e033da53c1b7d9fbff3678439ded12eeb243b3ba2aadc6eaadba9c76a3f974d30b706983ecd79b93fe5ebdd51bb6414eda6badb64641271b74b241a7b7410ef3dedf2e316483eee5ba8e13bfb4b72e3cf6ef6f69f65f6721765b6d8fa6d1b7bdfc6dfa05367d698d1ee5339c85c27ae3c1eed206855b89c366b595491387754e1c768bb0307a7204c5613796fd29e43ba0b2b9bf9fb55de35de672f5dee6d2fb7f0f04e79e01b65f3fffcecccbdfe33feb214cdc1f32abcbd357f7f8cf9ff590d7d3087e6bdf9b31b5cb2927adc64e3aee022e279316ee020d3d72a875c2eefd395f35377b2fa48d19eec2f01986c05ec0a547d69757bd574de128d806c1fdf74174ef3d1126ee13e1fe23d2bdf7dc7fdf83fb4ff7e8ded3a590faa193d704d8fe77d6ab5b1480a59039a94da9a485809e47bbce39aede6badbdb572eebbde2430dda0a8c3f31bef2fdd54d4e1e9c9fde73ba032f33dcf18eba4572460b553b310e04fff064e4f4cf5acae47fd60ffc1f4e98fc3e8115bf800d0ae4f8d38721e1cccead3100a2f68b2ebdba032faeeb4082048f19c3b9b52f207a04c00f6fc99e375e710c5ec1e7e391fd6be777afb217618f8f6530e4bd2f333dc85a2e9ad8f1c16e0dac34937e5d0f3449b5ac91c27bd048a61123ce2100cbd2f89369e07be7c92d35327e053c9be57faecf7de8ed7b6bacb36725cb4e18090bb3e770172db2beec0e19d672d8cf78573da660ed7f601c527533afd7c4fe7d87c80c152e839ccb5e78320d75d5b9d72d6debe2e7c0c7a6150af206833cb1ef7caae6cd5ee72375da72039b5412eb45965835d68730a6a835f68333e6d30346d300c6d1637288636871b348536831b3c85369736880abb6f7b5de6369852812be12ab4765cada8522d2d26abb91973bfe380cf1bb703bb3ea5612ad6c15a3a95daceda3386bdd5e9a517099c33f0aced99d7efd2dbb33eada8da9ef1a527e3e72cc74d9fce90f1a2cb71d75a8180f002a11de0262ea5010eaab11eeef2772738fce0d2a02774d98309dc252174836c5050f7340927fd7dffa03c373e3a0e0727fd7ff0c4754b797e38ccb74f4add6bb5f65e8ea3e20ddd9e893661f2c36fc769da641a31f9517bf8c0c161148a49ba67632567e2e4534a6965d1dfd9549794a5837e8e9330cecae1bb7ece0e5fdcaeaefa13c84c751d7e4ca3a01af31c36b98c47a750a47e50260e43bd36d5259099c9055c5f4e43f1e6db562bd1548806d12f70196ea754df4c18afbed49f1bc7cc6462c347c059a90482e013a1a5524ba9e57766feafaf5f2a7d8b1e327ee987b03cf83bb31208965ae6aca4438e8f4c6424c2448ff1e7136179fa2eb210c0f2f47d8c3f1f244b0fbeb73c8c8dad5b8c58f54d55b31c507af06f6879f16f00dfa489941e7c511361a2e5e78cb401b6b4e439ab648d5d2317b51168e4ee5ed2acaea585ce1616ce93234e5f23daf25749f9558aaab45264f9aab1397b596d001a9c64b2bd3ef5f183156172aacbbf669bc16fe5d27b996e9796d5afbc0bc703ccd11e64d6b772cb53f17b97209f6675a5b73d8707ee6f6610ee6fa613d86e1eec2e491e589dce61b5e4f0f0a87ef53ca95f7990955dbe25b79e25d31ff37c22b8dbeefdedc177f91ee0bbe8214c703f843ef89cee51fa961e32bff435ce2a3d4b9eb331cf1968f3dcac1c3a4dbf92c5941cbe4a463d0f7ed3f3e41c1e9e20c2473d0f0f7e1ed383cf737a1e718706525c3368f23f610f67e04b934e7aa5376d39453410020ba868826df6f3e97b938273567398e7cc033df2870e393ee8cfbf37cf5b5030b77502a6ef4345fa6aa3c444df73cf7db61a63f5e08688cf819407bb631eab3ef73bb3d277dfa3f4dd3351750fd3737a08f7a61fd27de9776625150ac10f29508db17a9cc43ffdce8cbe9787b8cbcbd42edfc36fd93409b8f4a109b89cb57222715a57f1c1771fdc7fb63fdd029e483b4c1ada3d3e8010badd0827a9932535b2518fca385bcb046c35a53949759837db76ef3bd6fdd2cf9949b3ae6621c0f4a5bfc1f4254d84891edd979e8827b4e9df50eabea4a72e69d0a6a1a6444efe5eb658e0936699b4a8593774efbda78970dffd9c859a55a20f6ad60d1e91afc4db0777c3a72991a7c9ddd56c5bc8ba47e4c449e5b81d1c3737c7715ffd28a51e678d70e9715f6b587580c5039436f7f76672df3c27cd8d614ff100a5bb63c37138341e1c1aade2d06848485e141c5a111c1a4f1424a42ebc283e1f16e05bead55eae0ba9d59ebd196329e54110fd1cbacb3e143870b2e792187441634f2894046d1eecb63e0efb2effcbcdb5f2b0b283fc40db1fa5f67736b9045cbdd20eedfbe4f63c39dab5a31dedfbb243af6d7f76e5eca5b47a44b46bbdb64b6d3fd4662f901301d55ad2a07dfd4691ec17ed4ab7373d3d6b8d06d5dab69fa9f5d9d524dadcd9c4c7df616ef77cfb1a88c73de8e5d2a39f89d3a393b6f5e2b0cb8d2d87e1d29fd3494a5f63a5b7afbd529eeea22fa4e20210a427704abd3d5d0fed59db3397d7079b00d722b0e7288071f3d9f3adf8f32d6963d70d5229e0ee41ca12a5c55204ee92d09fb9352227598e4a4d4a6fb31cb1dc6aace4612cb21c5525d09a3292b9029725a2d49c956c359632aa2e7f4f197929239c23c64e1d15e1b2444467ccfdcbbdbd2c3e33a6d3acae449477c9764b36ee449b317e8294d104f697770a0c1f14339d32a50f7349a4ee92d7ed947497587c26cdf7a72b588ac04246a5264ec238720516cafbd373c6747997884a444ebae7a5264efac3f831012e4b44dbbf6439b244a5260eeb3c098c93b4ee1a8c908645a03d5d10b2e082f620b91119d98e8a6e46537634df478d51cf03a2b29a0c08bcd4899322226c468e1801c2c88f119a119b91288c2c31e28491268c28610409233e468420c246848d8822228c88381a82888812105102228820820822882082082286186288218a6a6c86518dc5b05e911e1a44ad67889aa5341f3a84104308711ba23684134334318412432031c491218a188226c41741d482a8054114842d88224ab36d9f1ad33f350603a8c65c82264d6909876121879d9438cc34e430f1098785354a23a2b4192841693dd78ba21d2a769cd8b1ed0cf5501a10495f247191a445521649572411252de942cfaeef811e0ff878e0c703405af8d9f57b28eac1a887a31e6e3d74d103520f513440d3008f067a34e0e3451676fd1eb8e04a437cb8d9907ab0715b00f570a407207af8e981e685cd8b28bc58e285135e34e185125e20e1858f1742dc6cbbfe0eb61d8a7630dae1680ba35d5f0748274847486748e7099d9a0e131d229d263a369da21a636dc1835d5fc70998106c08f604ac0623823571b24ae14707568331f1980c8abb6a8dc96a366c781ec663678d8eca2cca284aa392688b9f2d8ad842882d80a0c21754e0820a5a50a1880a5448e167d7afc04f05802a105401a12c8276fd1f473f6e3f90244093008f047a245044023e123022811f09006501825d5f0240c08c38754b38faa1c48f227e04fdf0313232bac2880aa3288c96183961d4841190d191251cedfa0f387ac0ed0148474e42b921b5320e1c3db225b220cc98fa9fd5b2da127e861ef0f300a007043d406809464b285a826d09444bf8315274048923421c013ad273a4e8081547a238b2e48813479a38a2c4911f7aa4086aa46817d5d88b518dfd113572abb118586c92d324c78632d96ab51c26a7934a8e508e921c211c9cac3e4e46e404f1d08207153c8e260dca06643b622bc226840d08237c61042e8c6064842ba608dabf63688711402ad8c7678791146a0a9e1d3c3b7a643419906c0999904c4990ac260b82fd9041902d9932f0274d099f9a38cce430312caab196cc08598fcc47f6937384a408891192232447900081e40709cd1e218902c912244e2069028912489040e2834488238e8e6a2c868a4a8ac50038347c886068309f1b54dc70e2c610ac0706c48d2f6e7071438b1b59dcb8e206d18d25347c767d1a3e35f63536036668d787a1c1f4c0f8c01881f981310206082609982018219813ecfa3045c08c088205cd40eaf2910c483238210312320cc90024c34d062d64c842862b64a042862864582283900c4acc40daf56720c5408ba14703edfaf928df32528ea2699a47f7e822da47ffe42eecfaf90bd80fec0706044b0266040c0816e437ea539696f1b8abc27eaa8b050ea3311913590df623abb58a725136aa473210f967d2a0b22d4791976427721359898c44f6c942b48a76fd5651cba87524e391f5c87c46d80f5212182c2eb6495372e230ecb093490c8f6aac25ab62d7975121e391d1642ab19796ad5504eb8b960f0ba945d45ad272a2d5444b891612ad23ad9e161001ab3da8746b74b8b11e850acd88000000001315000028100c078422b15834cfa44df70114800f8cb65060569947418c8431839031c60000000000000000808001e0a70881b467a3d1abf5bc6c828187a33d4a1acd531578b4b006630768df63f9c0f717f1b812092398dc51ca587f014c9bb20629ca1476098142353c5a89f910b254e82009010c4d709550f0af8d84154f35482deec058f497f21c3170bb4401096c08adfff2ffe5f46a526b618dd3bfd538d72920e3b1df3c1f15724a090f9bfffeaf531d4edd1bbe4168f4faa73d9b986290ecc11886f490ccc77f3c0a63e29695b35bd932e0dfd69104d95249e959d57df62d26ea7c768459921a5ae37bb4b566edbc96d6b2efaf3fd44d418488ecec7db360b9aca48e6d2b59385f76fccd90f3e64378fb809a655b7873b74f054f5c314de3c565dcf3905f374b5d7c699027b35289d615b8c8204120a3d006258865fc96f74669b37635c76dd599525edea1ca23e874728b97603ee521033ae3ca2300f5ef98689affcea51b492bac3c782a304c6a937a333df073370bbf056c0afeec348ac6c697e7e8e008ae1d2448d3395c3e5ac76e893e72243529c94f0d7d6b70c8834ebf62d22f9c39f16ff0185d8fcb68015b620940d2d8d619ecea339bbc1283a3747fee916f275070582f7ccdf9691e9d02d03dce8a2a92370c0d5ae196db0bdb3d13b489b150014f85c922da087ca68444487074d05e560e6425d8370cee7aeb347145d1617d94620d1b0fae2920086354444fa70b54aa41e9c93c8f5b3573314a1312f7317034161d9d4538a92e0a993e7941910588f0374576978336495853d7fe3fca3bd25524fbc0c33e04a4d158f120f2c13dfa6b25b1c9c39989105ab7651b660702d2f6f3bace2dda6877638d8a5e90904b083e7112c49eae8ed2a5149ab44ba349b0bb76047f441e49e4545ec735f85b44c39879d5fd8897ad9beb545a3281c8f8b327bfa7b92ee7c3652d57caf64ff693c5fda75e2777672b051136efdef52a9023df0088f817588ad9157924499a6863433c6892dc1740d449fe41413df79a9c504321f00eaee83b1e5a006cbd6f1f83dc772292621bcfcc4b4e952b345d3b708dc76c63667fb7c24c304272771e36ba19ff60428d406353f3cbcb840a7d193d7a54e9f4593cac7d7a3605f9137970f5984e738ca5f7fe6a62b298498b97e6be27c53133e0af1b933e361b09afd9bc55e8d9534ce588df7af0758420aeccccdfb858091a98e2604143e434b0a11103b4971f388acb428fca16deceda1ba8344a75395bd57bccfa04874337b0d86f31a05eda8b127db019e45c486765c8d5ebf4fd1acf9744e299cefd42d8cb4f7aaa9de1fa13288ab868a68f885ffb8ba74cf761e33a956a9e93cc8aa26a00e4e960437664584021207e5321a860683ba24508525591b1f9f74baddd09aa3902c97ac9524fd5aa46563a5419c84dc68129cc53525d79e8a714db6574b31915ef533aaa8a38ad1260dec9fec33e6e9b415529ff27be05ed680763bc4b1428be4ad1b8cadfa307f2611598331b6d278fc106252a0ac857e0260110ce75bed6ce4c9427cb564aa63f8e84f4278a1e7a87e0f046282ae08dab7dad904b204083d2427a8d2a28028bc1762b12dff773508397ea8f75973485d5c1ed0a5ba38ccda4410086ca0e30e505f0c34f193db31b03c7473b4f4e4e372a5185d937786f4e03fbe89fca5156682665680a26402136601eb67b41043f96fe5883168fc97ab0ae019d997141aaa123179b68eb9b437373a257f8eb88e34e84d955dbcf0025a1ab547b45c91b10c334bb0f28e8a0e19e7ddebc9a447f1f47140d0d753c4615e308eddfcddc193548620cd95fc80ae787d6f7196110ea5cf4f799fda75deea863e90697ecf9dd34e6cf015c26ccc3572d8673bdc0d55966387eb19fc6917f4f31d3741fc83a26fac4551f0a16554cd3bf19317e1726ee50ba645b31c4efad700b336622bf5aa368078cbf3a9ea1f1b8a6715157ebc99239a264fc9677784120cbeaacc8ca98d7b40d1fdc3b2ca350209dbd7107eaacc9e80b060bc98005e518732eed447005967f63cbfc31c18044053d809290fe6cba9d0f85f78e8925e237ff38c08427bd5fc0d90ff02802ec04102c4db7bb1ebd22b93687a16ff3ca888e978eed9645c74d2d9b7e93c6396ece94a3294ae7f1d7b82f9032a80e1edcb5470eae271c44569a5a9c77469bb211704716f71b5e917475295309b3d12259ce945eacda66cdfdce8101e603c464ae4cab9ac5db7b847feeb1d9d0f313d7f4cb14f163c92b5bc26cbfedede0bdfcd854553aa5128a9f81d48e85139bb632baeab0ae1a1f2e03553e700bcd3afa45798f57b60ccf43ccefef82e5608933107f38b7fb70f02590ded2614e8549b2bffc6037c7062cc1196582396d9631add2f1ad4a505612ac436d25fbda26907d076a59a178630d99db0884c23c42d57847efa2d71f4f7e56f1217a0d48995bc761855da0f1279198127e12b1d95cd9117f2c83b005f947d22467ffd6b593af07b301c00bae468b7c359ef14b3fbc6aa1f98b94035adbe1b9f3d7fc58dbe9feba8a60102b0ac09e81ee3d439618ca3fd5a1001889465d44b7fcb3934b788636f49ff275c6aaedef4652062260fd00ddc511d1f19c75517c00a99b71b7818a19109c8f5489bd1f85f9ca1f2e5eaacbfe9ea7aaf1e5024cd89cd22a862499c7fc2a705570ca0f6ca029a6c0d7c0fa8a137c6578df574d57484c133e4b6a55215428234f25b10d2ce22e5533db15e16aa6b0f0036d6114c1220a080e287490053f3fa6faccb81a138f3f13ec900e251544bce091eca646a49b0cd2ab7897d459f9ca5b905157be34409a7f9db01af30879280939a802d5148f0ec3287725db75164d3df6a659f052663e1ec0d3cc45058cda7f69c88d9e5540c9125d3a6e39a059f46640eb89ead7e840f396b83e70ba6b384bb15ecc2f7439d6b12f7c08bb3b2cf07c3bf19859db006582784a379d02f276d7b2d57d108a6209a00612642da9e28144c0327af3f86dd66f8f21393762c3cad45aa4af28ad20397bd5b1ed28194df4d0fa266165f35660c8b4e2c17a4710f45a59ee8f20655ebcdeba6b7af36be8ade85eaa97bf34a82d05b2eefa26cbee0a179b5843d9bce736c185aad39cd58d6c856275d22d1b25776eedbe8369f4429c1341ee9e7bc954cfe682abf2fb73e3f7942e045d5a087d849288fad987674f35d2ed217cf90dc45596092415c9e3fdd8a84b881af29b95636dd9430c21469b307b86ac53522343c738737f365c020286189128958d0d1a3b885e00d899ce1911f56804d36d409f8a45d65145e6175b53ef0f59afa0eedcf2429f152f8db524cc6963b1d8de8443b983729428585edf977e1c2f79c38434b85202a58f6ebdbfb554537720ec006430555b1f3cf513e17a7a777fe984ff72363416adfe42ecb011f4497566d26c69321403463c85363a5f19df316033edf86a41ac4a91841ab095a53f5efa1a20cea73dccf799f4786ec97da1716e80eaf00de7bfec44a8f11d8f857a24d0e87db0623f6bab25ffb41a545ee46c36c7db991639e877b3d5456e65ad2d56730bcf25bb5dba968e9880dd52e852a8921c1604f651346d317a3ce2cac96a3779e781cc5e10efaf0e77a78e54f1a9cd3b8504a9689b6fa60edebc379c29eea9558a25082a65e87bae768dc9ba811a0f78d550fe88a5d155c634027819cd2d674ceb8e28b87ea89f086e4cdae5984cf2683e59c1aafdf0cf7b73c9b075aae050ddbc7f72ea6df5985841f1ec1a5be6978da747622d3cadd8261330402ba41ae175c56c337acc6e14a04edb90184d4a82a2ba1a8bbd8b956fa1c20523e14ffb93ddd7e7ed81ce3aa617905de2e8299ef72bf582cedfff98f870db6ae87d10f7ce13d47710bf49dedf43394db86cf54f232d3135d88fd5bf504ed81e16423fa5100aefb5e65bf87bdcea820a6b5e8af0c845b3aba0b77fecc2513bd58289ae1dd685b76e7d1b9fc2862547847b5c4136f49cdd7ffcf8bb710b0b16cf1fcd63923fef28b3a8a033af474df1b70877e5f551afb365b494659f25253cd0c3f57a103679f713f607e0398973d475ac98c18ab800ed04267b017fca2d00376b6b38da3f0b7990ea9599dc5d04642df3e221ae77d34682171d4dde75bdd34552d1e7e18f8c588dcbe6b10055d7611d21c61f3ebd8e5965f810788f6207c668fcf5922ce4aa9a05c65e1680709b2bd8cbbf7899380af856d735ecd38edaf52f4db95abb3b29e4f633e3ca8a5460428368c30a4af98392624bdcc3f6bb662074b2904c2fcc8c3e1c173312a066596c8d9fe38a6b2851d3cc328ff3393322792c5d901ded184c1d715ff645eab046c7981c1f2169d62aac81b625e8920edbe644026b3efeb3fe6a0efcf204a2655be8cbfa8f18dd2b0b32bc7769d64441388633230e487d4829e133c98a593e8e575cdb401b493fcabd60b82ee2825814d21a1f10b9403f24edb7f84e43852c340e9a2956365a5f80cbbb2861ccde6ef0849c68cd73eb935c4251a9037e447002db0391a10149a5f6af911dc71fa88c83e9defc7720823f78131b4667d3ec97096c20787334a4246e096b99b225e4647eb75b1f6233a6f673ddfbc7ce7f6ffe7bcbbff4fea155ffa5f9cff2d852158b6dbbc49015747bccecdf6cee3b5396ae39dac4551013fc023a85580853d033d78cd3543a352d41803f0cb1380c6aa8389cedd2f511efb87a948dcc9edb95f4b88a29c569ef849cb6c3cde8c8951127d144f699240529ce6cf768991484db974c353f65ab1a2de36a5f673736beba4b49cd848ec4dc8aff34eb49b3f1a588c58b903877ac680952eceda24d11d24712634615906509c3f80d346a9942fc122c1aa523db4cce0d6232d94203be4d598615f67b81f06eeaf43605d8c02f339e3a06762313f3c6772b2ac14bf37f54418d45451c62aba3bd29ebc3c625dab62446f541066aa13c9f01df7c755921c70184ec2d4b2e1c76d145e11141e4ec259240aec48e5a559bdf9cec191cdc858f1c36ac2510784d5601a9baee1041d7e09d03d8d7096f0a5a69dc2a0112d03843a4903afe2f8a2fcfee191422f69608c9d40953e266e0f4b33ece1d7dc9a1430e090feb2cb4f781ebcf64fd661846d3e3fbdbc5c22e4cfdd45d355337c3e5162302ee14517b5e239e2f74f09f1b77d45c1780f39f49da63b41b659e8d8fa3512ba5b38500b0d9aaeedfd0fa20bf2a9633a91a0b7a64add4cd97dd93cc079c094523c7b4a0c83046f77f8763e635f703013f474c8af6c6b3bf203e2236c8599d220cd3d67e58f7026104dd95ca78abb78261caebba5f63283d3d60ee5c4d954a7b0fc4102f85070bc76730cac279a429c8aba59627717cb8f9b334c64297800813fdf22c111264202838ff31b4afbd19adc3bde1ff5094dd461b35aa895f398295280796df867563a5edb8ab52bb6bacf509e297cf14966d620599921ee1de7d37ac81918dea5ad2fab0ec4c72b4fb1c694d77246f744221f1afa8db7295111cc4117683a3e5bc4c3a43c5786b08b61a659fe69a25c7a6fc36659a9d356a113aa26980ca28217a5502f30fc1e2d19196d7806452602dc2604ff65a2ea0ec1b451ae4a0ec432f8b02c284a81f25b006b8201a378f02624c657e07565abf40144ba2464f5f4fa2c6e7c0748710d6d4bac07af82483b552de69fc1d6c2a6cda6a8f153d30a6da674ab7543e5bfdd75e147f6e1d229681457b1459455b30710bd41d86b56819ededd5365858adeac1abeef6d8d1adc8d7c3c16671f8bad82d8d7b8e05576ac5713d86ea142ca911d7b83f7bcca2ad8d9927d355ac1edc75e8a9700de59ab304ba88017a873999daa3b009b47c739ab7375f5565fefb38934896c2020dd245d7193e8935f11378efda2bd43392ceb5160d364d67b7743f38c04a21b0250db05dbdf095c39d2245caaf51267058dc0fe3d551e9e969086e9133b8259bbbe6db16228f3ea9913a1ea921ad9bef0b19e9e20265aad9864c5a668ca8834e61e8120b6dffd88a995e89a4256dfb7a8ab10c7b7b966979fb9b4cf76f1032b1fed5526c921b34cb8913b173c58869c910fc5b2347a74b0f8f19fab0d3e5851de30b276c54283b933ebb82ac10dacf3c0681e9bd3d36accbb07976634864cae2cf7a243333e948ccaa67590ecbd836a9cafd30bba10a81e2c679e7078e5f65665bcc009914a283960dda614d95764f335efe1ab8924fb53a10ecd7fab8abd526ab377ab877096c63ae6134617737ac9b08e06dd6bbb121671f87f75b6bafac17f972abb75e9bedef4a85fe50b6ab76feb87fb076a16da8c0f7ee88734a0a9d48e1d856c6e9cc699565f019111d62f4b8b79fd5a1ce8d5b826499003dc9c4584024d52954a10d13aff581c6efe80b72403d40d1565c3ee171c624763016c747baad516a6a200c1ac566aa61c835b7be8031a44cd08824f8995f0fff94b9590e2deadb36381e4dbc5cf0531bdd1d0e1a84c546a16ce307398624ea39e6b56ac03cb3a542cea9b69ef1de327a1a4c96ecbe73db8862cc7144a58ed99ed0ca566427e081ff5f9235c73c16ed9e2e60a52626c373d00caea8c91d16f502c8182dbdd997526496fab3e09f0986ba8e52afa46042480508aad3bc656dc1de6dfc26510bd43296bbc92dc20fc6bb62d23aeca075000ccd713b0288030c42e250189b655fdbc18152ed6734cea332d0e74be1f7da7a0b285ff1caf45240121caed3334c76f5e749b8c7df49c36f8a364ff78a9dee85dd894177d964dc71c3485e12983afa83d18d6adbdfbcbfb3a731bb5d729ad57d40dcbf7942dbb2c802b1b283e79fe7b1115c93a26caafbc6cbbee77bc4af8bc370080f54c38fac73c06da09346eb81a3315a14871eefdd560431888cf2b16db4eb9ae350697ecebd5caf91a6e0f4e619987be0ec321f65f6fcd8f9efab4f1eba83fbf47ff9ab6303c4fcd587c0a88830ebb3809552fd446bb5435b90e899f73f2fff61e55e13c53a6ed1d2df91341461df417245fdf62cf831707cac3c11e489b19fa84ebd7790d79739c271c99ef13a5a08a95fe01785ca818c0ce775f5aec3f577e07db9618c745fa97eab76d160eb7eb83663aa1cbb8858591c5ae5a1ea102bf3e450921d674a2002be409051e6bf221652f63e18ee4281fb4ccfdd601607f87c0639ff66d214c0f9960e59733e2b08d56c57c5dcfefa5f695d2f974bdae7f06b10d3b9374cdda8d00ab52474ac88bc8fa7c6fe09df4be3b2180b9393b12cd67ba1be8c12666730fd5e92fb947ba5912d7c397a0856756aaf579194ba5b736f5460f36026acaf11087f75af166db04e0ae4c7c1fcd0d11a38f44af33c5b396b509a7cc9c0d7bdf543a9e0ef03a7fb21b80c5abb29808af162ed4e53da30dd80807fef17366cb4ca0912cd3cb8f1c403a6955b36ee35924e7ee0d6777bbd28ab6015099c2981a25fd6ccc43a6e1a31e9fc2a1154dd1005976bf5e2a257b9b7211abc1b141d237d10da037dc1b8811f1e1033f76de785b90df7ea2aa7ca7a3ea37eb7c2f4900c4fac44753d5137a08fcb3dc7ae29c0e066d80fedeb1fe6bf0c12e0e9d1dbb78c378810389407597e3ad2f31d076a51ef4036124871e1890ed3fd0daab5264263fb1b8a41e02f3f6770a3fca56ea68787ade59d1e464c9f60603f675cce11c5f1b99a623a03268385c0b7c271bfac9c7d9b5452e9aa3f66d6e97d3132f200a2a9939ef632707ce3c0c97090e273e56eb8003eea8179a2e2a49086c265d0df5c80db41f4affe3e605fdced18f065309da3a345a6f8912df4c690a40af949662b888edb08ea4822b19bbb1b35f436238f0dc33ab9db019cc93b50f5394d338659f80a58fb6c2e0964b2300262f4d2b23654a9c5990b721b4e1a4fb8b4b53573bc7379830a5fe4357462073c018fb8e9c4766604db002382cbd4748cace32c38d2ef0190e3145b00c72f4227bf14eb04d864d61d05b7037bd77fe9cf40d4ed4746714f41a2e65c698e03443651b449bd2d91f853c503bab4fb6780415533a79108019bb9b3cf2aa8a78b0da394b3d89d5d696adedd23b45511d43ecb5e0811b1ed8bc49877a3b25131efc98333f3996701185ddfcc6e118d7c1e11ad9ddb2c69da62dc2d8f7b9abbb40d1b86e32ffa43738a04d8fd720d5da8c1e47b8dfe64c6fe1befe4c4fa30f0206afd2886f785c9a6a5d4b5e16107098481649d182964c444b01ec7ec32214cd030a0ffc44c81368c3473b71e7fdad4a270b7c65b3ae835565fc7495b2908b99ff21b02caf19a86db4173eece344e11ae9d93f47f7473e7db617c875759fca40da3742c8ce98b770bc7ea073ba05ab6f09cb381946d80a651aa9b5d29bc0234cf31ea412ddf18fcdcf5ab93c27f1028a2ff964f9ba6376ebfa5bfb4b4d97fcb28e1ed2f8e657f18137b57f98da1847f34ae788b7a7b4c414a1aaca72d8b704319805ed5e53e3ca38d0dddfe805cb9e8ac882aadd1a7c43fe867acc07244a2e1db61da677af22b9ab9c1f72fcc40ed16189c185d4d51e6c31149346cfbd77d4389875ff6ff8fc788963ac8b247795dc61d9d7c8b0553fd5fdbd9f8ef707c89be07b0975f01f6ea6760b2f6485dc697aacda2075a9c5bdf7d50d2365c864ec04d0b8e7edbc64a9e3b622d04d8b98e892b33bc340bd76da2d92a53ac37abd2aeb901397d7ec663dd4553f41962fc83636d78e3c800b129b06178676ddfd562f1c6b5bb684e49d79441554433f7aebffacdee34eaca5105ef54eedde5df810c1d1c88582839c89fc5fecf8504402292859ac02d94ada9793e85327ae858f33e7e6ac8b3731573d7b17b5d7657edf5b218a136cca70e51e33e6abcefb4717821f34f9ab2614c1a248c683446636315d8fe181a4e6ecafe85e20f63ec1fbf29e8303898a12b6bfba2e36b74271e52742aaaf324199c93e89ee8fee59dac0d55060062f7774e0fcab5019f0666521048f2280a4d83991ecc7480451958145be5c95e7167d3333d5ecf4b49186bf5b47e974aff053bdfcadace732e92d31a7fb288075ed1a172fe349a2afb8aeba5eb64fbc9bf7ff9bb964307991a16695cd6f61c42ae28b9f7debe0eacd0dbd925ffc682bfd2bc48d1c0f0d24f5c7d8813579e6436448d079557366acd3e2e54cc5f9ff5d06f735fd6768348026899284ee7e7f82668d39b4cea055abe6c566088552b33f6d00f2a01c710b610cb2c5c1408e2b83d9be77a0b5fa8fdf0f5cd97861343a82360939e8211ed00c9d7309dcb3e3e5509ac42542f44d7b74cb42519d68fc9e2a0bf5e00b2272da97e40d6027c9ac1a51d24b44007e5ca63df7858924ea426bc1d28d67196484a38bba8115bcf4aa5b725b221185f339fbce77397b51d52c00b8c08938cae829651c9a43fb7eb30731bdec112132ff638031a5cb8807936de9476479550d6f6e07f8f19dbb4796e8be440462c12aaf923cd108b4246d94a4f336946ea60a4187caac1200aa30f48bae64f26530993a8fc987a1bea2f294bd1918f668b85474bb29deb7574c71dee14c79ce78073e50e73717b2ef533669db98c491bde579a0321c34c45205fc8d08fbc37628c84c272de284db8656d97c17cd010b0910802791c20a8a4304647a9cb4043a6fcc7215abd9c843597efd11de294e39c73aa639d73dfe364882d4180705c4802180d6405fafb021ffb56218299acedcded917887660610f35d0acfa86d2c23ae0ef06fe7151073b2b663da2fac1c9f38f6346d77e575aaff9caaa8cef5ae56348ad18e34ea684412b1c814dc4c1378f3b5bb13fbcf64b2b6c71e3447f1c31d3d14491423fc4ff183c0cfcc09fe078592056ad4585f2491b51d2aa691acb88c3fb9b04f9fdaf1a6a05498c43b296b3b477834cc13b835305f391cd7b9ce39dac90e3ada0972bb316f3e49b157220b65be4b384e96fbff91b59d9e843484608b7af47ef7d3c7e677b0ebff5fc904982ad7cae998cf97eff65b338e188490861872118800f20d5f8e9b43e9f65563b8812a3ff896d36e0fd2a9c9f5936bb7f2f52ffffe324da11d9ceac83a9266ea9dcbddbd7c7ac9aebb81120b92da4f3cfb0bef43d676fbcae5bc3c597d211ecd9a23dc1f8e2d5c9157faa0c48fbfa92f406ea9dc0eb554e163e7606e030682104020729168837aa5dfb090b474a7d8c4dbf3fdeb79c7383c31b04c1feb74c738e434a7b14635a337f7ff895e2a5cfeb51a087fb2960bbc49e899509dece9236bbb06c9cedfd4fa204131703ae0a75ff120b9704a3ab29fbe2f3f3d59db953c2b47c815280c4b1076934b1203c06f568fbf5f271cd3aa3b3296852e66b34b398defdb8c105556ea342c7e1d24a26c4bb8aceded191f6e55fec230a32a6b7b8bb7c1a72e67784175cced11ed209af90b9e3fd8fbdb018f2a302804250df029e9fdb5c48a656da7f5656ae743968cc341e42d2cf964158d8832b5b74ffaf58e64dd5c99ede7fdf2870ebb4bb1b8209357b0bfa6dfd3fd083c685ae9f546fe0bb2b647ce7cb8ea04784edfc6a014952180217c23fe8a40818ecbfa0007393898bb97ac3e461f61a7eef10de0e35735d59a656e25e60a58e5e57afec8fd6ad81b5fb503893d890d616d6fef0e4fc8f5e68bb73bcdba7854e7bbc53426e6285c82290ee693f63e09c21e1d0a391d5640eca07986e127d13104fe78117dfacefe32a3f83551829cb550c4165d7b23327fedc631721c723a667502c05b8484d96fa7cd69fcae5dc5f8fc29438b2275c26b679fc5f6f2e4b5d31786fc2824663f01dad7dbab73f0a7f0da83d1e6e9d58520094cb64e76886180ed07494377f4a83ee6f36c410d816a91fdb645e84ee23b4154f5b3d22b5e312b02d8ae563dfa0ed010979374053e926f2d67e54bef2296dc57f9b6992acb7f1c8538c4cf6a552eda5e8320fc2c0371fe5a5fd8320ba1f0339c809f6787a087f97acd2976d1768f2c41a9c529e89719f8795faad8a795dfd77988efd8018b7e8024f92617a5ad036d26b21bb687b10f6bbc67c8351a9e500dfa7ef325c999a6ca1f2bc7e5207f928329bed72b3d69b27af236f9f9b45744196f6a79dabb319d297489ef91d1642cb0ed707b938f6650bd424a25a4e7abb7bdb96291fb0c0df164c6ef5d964acda18583d184c8c987ee9889b23971748b6f73cb1eef24c602030da4a9e605b6f3a4aa77deff5e8fefcf1e4139df01328cb10c23a9f8ae1048e3b476b4bfbadb76f1d2e2e22d120a21bd3add5a18c2496203bd697b1f148a67416bffb7e32707309a1dbe5dbd074ffcd693695865ab9e1994218735a8b9ceb63771d54b09a00d5b3c76e4c34c752c36e676aea9282fe282e1c8d031b7c314593085a80f3d1e2c9f5fc5111525d9885b42c8e2eceb1f632f460e5a35ad4bbffe05fe5efb19c0fb548dd6b77cb6417b06fbb6073d6ee38be8ed615e3948104a8fa04ab9cdb9f1b4eb8b9286e0d7128d6b5037c17066964c434a63552db80c9c6bf80a68eff2d825ff0c001bf5f878753811d3d38887d78fe19b5d9c571c0ad67b052e3fe1f7f696adc8f47b892bd8fb6ebab99bb815379c18382c2fd3982a06b6c710f50f87d584faa0e9cb30b9509425ee04ee4d480f0c65acc58ab861b1f437f26796975cfd79f7550106afe81354779f79aea77880eba5ac4bf975ea2df94fa310be75387a2589a670e83f311ca68934bc652965c595146e682e9dd653e7c0d5c46c1ebf3bb8d4750740c89b4d16e257ae1ec38838f585f8403b2d35cc06ea27c510a410506d35bda151809e94e1ce3f3ea0f30be2026904523b5e564b8221ee396533a14019eec4924af2c3acb48293d2aeb9d01e0a15ce21adfb9c01def1690e5a19eef36935e169a7d04d4fc2cef2d3fb0f0fc9a7248bf2036f01e3b18a2ea7732432624d4d098a1f1bf4b2232c71262da4dac1d95a298747ed70ff00d77afe8e890e6ba525143b5f60bd6cda4dbe20ee04db3040d54521f37b29dbda0c11ecf13022a7b5cd24c248e9b1d14a4eb75cc94f49b2af5c737273f999639d8a19d9669fada6fd0a6954a2d1d735b6e8e61670eca128f1a67fd3fd7f9703602fc1e5208b32a02442b67edfcdb72d6549d3e0f2857bea6e12df77f4b92114a9e08a08e6c7caa6b5a7308f38a206e2f2163d8d42de92ecac71b76fe0e263e16aaff0332908274d10e5e66a15d6d24ae76e5a58b140abd2ae3e0df0e24b9c230d0e50744c047bc14185d0ce60340058ac55a25c0684747f701ce9e07851ac83281242f4708c7abaa0021bda87066d4f12f9ba6abb8ee065114f72b7c1ef80b9f687cd5610ae867138c91de22c3f92060fb9a363e4d77a3b00811f95297ca65f747283d1a3e4fe1ca698296f1b60a5a30c0228b9273e53ec506ef322e6bd7c348f923b9285538914bbc4217197a885399bb447e6772130240b194f1bb8de11a722a21714baf22760b5c2e9ee224091c7b87a74fa9f6f5edf63d0e07fd9d812aaaca46803518db06d6094b16bb27fb840d1eb5b0666ba0dbcdca74f6eb2cfeeb28583c8cd61527878b96fb1b33db06c1c1eb2e9867236c74e5af7bd38e073af6241cd2fcd8de2e5be8501c80ccf246cba85d7268c770d8f52d55473a76bab33f02f6a28e6e169ee4a94680907200f7ce00a2c39f53d0fa2b6c3c0459709080302f122d3b27c3518c8098c296c39396d0134fe23e566fa48e713e9c9d627b34bfa0303cc88e6727983cc0d31a0fdafaae83ed4e3fd31474b33a817961b63770ce4dc211904126cbc96bfcddbbc7ba4f0af2a0d054b35dd93bf3f00fcf2c9cb68adc68fb0de84eb8275606a1dc7bc65bc649a50a82720abf79da99d9e61e349846f962e5f4346e7eeb31da1e9f9f9e4cc0f67264caf1478567f36e6db3912e27651b2e6482b2bc4f3728fc264e9785cc4c63dd71bf886eef067521c84bc2163ad95646ee83e47a032a9393b6ba176f42b7c399ed0a37b17aeb60ddcd460237480065b0243a708f3e791cc7b56961a39cebddc3ca7d6295f38fea7ec73cec4963c7bd3b15a9674abe8b676fb41a50f62c0b880bab708635c5638baa83cebd2a718c578922e5afe6291f2ac97790b0c4e28fbcabaa6a15bf52027e42b97c25a7d3b362191941dd64591b3e9de6b529eaf5e03dcd0f1468cfe9d5cc7366ebd8d129beec819b3d4d52bfd03d0ec5e80b39402b0e93e2e7fc8fa67715a64dc44a79cd00b84dfbe1468344cf7e751abe88499aaab4591b20794938df53d1ec8bce69383530476812542e18a8e39bf003186503748632cd92695bca27307be8b3a759e3b3d7a77e3a7a5cedeaad99f5509c4c8733dc3e8efc2f3dc4b9ca7796ec0ecd1f78357dcdf3ee9196a7be515626b92d007f0b06bcad0422a8f5c79a42618cd7dc5624b4030dabd74293fd6685e2a882470bd6de0ab4ee462ec5277d9180d1a58105463a3edc6ebade1ca6fac9fad21fef052dd49a5caa64693fa2384635524f20c83d78e10d35c3d9a07b0acce2f1bbafb07a67309cce6ee7c41182041c11927e1139510dc232060a31a7b12758436461e177145f02146b886481dd1f230fb1c15e31be1c0f3d44d99da104b0388ad2cfdbda97696c1d8a83dda19b8ecd68217be03ffca9124e83c8e57b1914418fd0f32a277139372f064adc32ebd428c09aad13144f801b3cf9c4c1383c5378900346a5611c8a6ca3a06ac1e53804c3e1d9dc0d046a03c467b44c781d20d2505cf8800d5fde4563a7a9ea4d04aa41d3dd52027f0728e4a7387873786ece632724568eb52f4527fdb274e3b05da30cdfed4de881f25bc450ea676122cb7daa41a20d20df02bc4fdb285d34c3b29ae91619c87467cf044908bb998657f7f8a181d76e7c9c9b309498154b12c58828d4d52cafe4f20db26fa741e98de417de6ba7598fdbdf6be76d3352096664352a074f1e63dc540ddc0561280bea515b4280d8881901122880d70b67fc0ca0836cdf0194fc4bb50667ce0c480ca0e357433e9cc11ce40401b9265ad7bab48aeb4f1409a9822468cb58afda74d75b61f0856aa4e80cf146662f30603c70508d3c4422e45a941d285de9e6e171eb9fa1ea48741ff664ce084bfa8117e20054785d955eab450b436c86c9d94f03f92b437cef7564dd1f0c6eb4458bc2b7e367a74d6e2a40b06d34efc623bc8e24e441dcdfcd7f4da4189a1dc410412950448afb30331695850dec52135428242488cfbeb20057b85dd07dd6f901c9178ce642b069cbe8e75dcbb06a3ca18fe648860079dcad6e684f7da24f7f9e715c68d71021d4ffe594d620701a5ff473b4b2932ce578d35e2f6fbaa00ba01a33efccf4aaa52cf1ab068ae853ea13503c092cbc86d6c140b782605c31d0a472b856b0966acc4870c710f1c447d0e08b2f7850b790ba11204b663b293b9ddb39b15f4ebeef900cb61149ba1713d8ab60cfc0b453aba10864900fa617ef09009ac183ea8ac58466c99f7c77d13b09d9b10db55e9c12b660095b1323ade78d7cc280b27c3632493debf597ac7709fafd98958ba1ea2d13b6c4a6be4561cb32a78d40d2fc3f0572a4f505a78194e8e81248e88658aef313537939d7960be1d62c285fe1e68b3b2821e09d52068d5d8180f49deb8ba671b285e793c7e68cd3dcc427eafc03d31814705bb6c2066f14ea1f078caa6109e17002aeb69ae956d01cca06497802aed63f6502cf895981d8b968b2b8c06660c110fd87416422030d1c5f634f29c36ef205a83b696ea265295bfa7ab9404b85524e7eb0efee523a95f10a69dcc3502641a31eb8a425b2ac48de2d248d7c245a73d1b52a247ae22a46fae0aa47af1684e2018fc7cf3667f5425da0098312e7249d246514d96256c973c6f5b8af51153910b5ca1dd34cd88452520a12e205351e182ba6d43b807445152cec9c8f6a0bf3b8ca9117169b807e7336c17c82f353e22efecb86c902a1ec7bcfd257a6bd6810a1fa9b8a24514ce53ecffde6f4a48dd254468ed5f38ba590e16be163f84eabd971bfffe15a39fcfac3b5a1cf4fd1f2016c8ac30f3e208552d508fb9c204e9a23b00c1837814598e727d8e7048ecd304cfff87bc4a9f106a2525acccb752a0eea2ce2d8b0dd53499a312792f90efdf8bc2553b024fc7be1d89ac7521a32f13413ebcdac400cec8be999229eeb595969a7e2d23e634ad5385ae04488dca1f78bc97ccd45225c7092481dd8cdb604ada69e4f14a9be6dfd77dbcfb18f4325bf2dfadf79dc4ec198323edb3251a0dd95b6e31d9fc9f71a6785f856dabb42d6d856e2d9b497d09263cacfaa3b3a538d44ef9d3b2a085b77458c74b229941fa75cd90a0db18fe825cea24cf936c7ed5fe96a8cf89263a6a16338be52ec4b9e5fb07b2274acc28d0d52369ee38c1517a1e4060419fcf82c9696a96da08fad6286d9452fd4c8a3c2d9bbc3d43da4914acbe49d50f3990e97d75289934d414924a5031587d636833200015eace228559a6298399a7ae85cd48107532a08c3b72d04b34314d49f148036249331f57c634dd2532fe3962cfcb304ddc60de27b3da92276456a2500f34aab642164a2ec768c9d932b10014d7f90acb07dd34a5c99fd7a2a982914756ad6063e535295d1a3b8e9483a9dcee00e38ac183f1958f6a8073118becc7d4e0327b40e1da4009abe0bf18358410e3822dc96ae51416b636f9891f85d580292852997ef3374626cf0538791e20931b5d1d9fc022b2d6ea8ee593f4165f848fe107678c97ac5203aa93bd2db642ccdd1c26a7ca6b711e4b56be2944a0e752a267b0aa013e29074dd13652e236967c37cf7b14550d86cad3c12f9f03b2cd95ae0b464df211d6e523c2bb789327b23125b9085a4dc4bcea06ab9cee3a89fdde96ead8ed4e539e99903b2d7fdaed23ec867984a09780d354448873c24b07259755c94a66825c39955c0e1c9bacecaf2c17fb1536b8993717ad7e726f120eae92116188163d4d1e2159a085eafb354e78e3dcbc86930aa89cc26ca1c174f4e3fbb292658c379621832c7fa8a4c0b4c4f6c40442d76a87bdadddb5c2de95cf620d18ec240cda29b5fa16dca8f077021742fae4770164ad4af0f6f0fd1459902e2a021f1a81ff73ff08b4849876604fff6eb0d060a331435125a1813f1de4de3f3289df3fb28b2a32c17fbc34d4a7c114f86fb00092401244a6b1b48bfaefb28c755c9c39be43e44ab147a1928b1e053386a164726064151694208ab48009a1ca1a4fdcdd7171176f6b3b9a03e7a65e2508971a5bbf13a7cc4dc7aac3690cfdf872b3237a7398fd165bc7fde6ec0cdc309b0c82c8b9e7b81f8e391b1dfc0df47d080e311cd08a21d151ac5dfee8aa50385c942b4605eb9c46a131ce6f21c03d9f4f0ba0935ea9f508a8a211f7a0576ae9e0a3c014c363cee286acd63c03007756c016aeff343fc45c45f96ba02ac9bc0cddecc48fd89b640efeb82a45216d5720cad26fb24e1c8c9db2f223cfd96b62fc05a53abf2530b02960286290e50b2317d6cd1810177e08f1ba495336e616b520fb1a64e0fa1820672e9f3b6fe6dcc8520d0344323d0f3eddca5cd9f95a07e2cd491eab1fefe2a50b864812a49645a80facdd10a1c85f6d15e6cdec80ed207a29519e4069640e7e3ff7147266a7b037f57e325a7146e71fd07f5146eefed28ba71429a2eadae0ed0044a62d73f76ba83345a3d83c5a5da5231fb8b912dadf29be01acecf3a6b8d700e92a0d1b20a08df00e07085b7380705e0788133ef8bc459f296ca5ca5e6a3c12f8792ca80ee193817d563b79647e6ca541a71477767436f0e15a2eb4c05672453c6f46101589564369e9f8f5fbe925bc6d1fee34957a0ce50cfa1f3a492fcaede66aa7563cc178cc41f4059758d2fc19bdec8e2b831068a54a276df4f2bfa4d71fde55a36a1e962f70d151c5aecd4414c45bd3f2327a56df18d3b50428e4bb7bcd72f22de3112ecf9c99054ac58d03267a747821b580bca8a6529854359e65be81bca01e6435696788b523a1763a542d7e5ba0229bf90076334e471a93d42acafa0de680c36a09af553408973b2a68fbb73dfd99d2e3afc4566cf8bacb0c0445614d57d21c4151e0e3361085fc013e85d42d00fbd4a068298e92f84b4da3bf8d41a1ca43b24ecc524511b3314c98df928c5463a51545a0f12b8ab0f9868b8445d19fa7862757ddd4671a29de164545fcc817cd61b81172d9c365c8289a4ea3352f10f20d3a8544d6fed930780705ec53bf2034e2e82f8aebbea14419daafd237d80a91bcca3a0265077653053b3d7f958f46b1d84ca929cd36e296dddc2d28200cf698dae6a08b1027709a4e20dce1a9cfc4c853676800e5817be96e8a4462f799364355a018b01b90407997e9101fb24468780c775a20fdc2385bedaf08a563e60c3cef3aba77e74bc1a06924865cadb99488b25588e3c4a3222b55d0768ddbe4b467e0926bbfc1b312e2338202d817abfab41e59a1467cffe9b210964b7c9ed382f803d0ca39eb820b2d5e4402998ada0cc72f842327472ee2f43ad942fac38d590b3b3826b322ff62b856a70c04baa944c210211476cca6ceb25830bacb3e8a8a0643338d8a7b4d23fba946516d0ad39d10d529ad63854aa2416e648ae2eeaf5ff2a6faa54eb5b629de20d2ef1c28ea2bf2cb4b1d0295a42a12581654f8d6353a5605470aaf31b5f7f28dcc09c187be83c1fe18f31150ecf087a472a82ca95189cb149b3147b593e042271809c5421ee943263360c1dd0f11425225f1a556cc3b4447b9fd743ec61bf7774f662b5827c4e9f62fc70c12097b2aa1bd4948b506340be94b2731770405ef437425954a7c6204365cb906fad73ce36acf9c892e82bdaf6d395efa30051d1f694b3750e7818f8742429b40813299ab3c922a37894ffd5080c176b2f3b16a8b1df63fb99334c63781f3379064f1d56164f5b67b997bff650803095f41ab865fc6dd26847fc074c034dddfcfc699ee988b6facca19a1ed0b8807186b7ca78ce38fcbaf6ea6ff038db465e8878053d8b0480c2e4927042958222a85b7efd6e4aa54205b01ffad825153464d166da53429a051474a0ffd51f5a41257e98225f8cc64d34bc7610eea1cd6e9fa61b3f1557bd29a481ef06c043c37d36664d16c3f3fbc6137b430eb83202cef633b01ad7c62ba029fae0ab4507ee130289606252d80738401a3207d2c1c02be66dd8115c9fb5067185639192dbae47929bbe53007a28b64e6c4d91ca8f7fcf02caf8ae0853d96a94518bd24488ef74830e813525e9d466d29945d29155883573379595cdfdf4951e49bd113dd20af75a84d179ceebba35e621e0e5916b3cf9190d2070b692daf9a78499f65c75a3dd4f87345ed153256d7d29e1552739b6543661adb58f51e883cbf65513c3e2c1ae0cfe813e76c4546024cc78807714c50d6a5aaef12c317900e4acc0d0fcc46466c17fd8ec83e86409bb4436c84692022f3f925561326421c3fe14ea10b9a913e463c50448b78a048e176a088c1ed405d648a7ff06f660b915db773afe322e1357e1fa6fff7383449edae15bd129be92da1d28060a4622ef5d6615e984501246e7f1ea7ec60b17be7a8a7000df410c588c6348a59ef7c2815da80bad282e1deefdb928c617360be1e79127ddaccb7f772cda82c73b9f8c72cc9a6b2641014dc80e42f88d872824c3390c54c59cf8f5623dd096122713227dcba4d7fd2e2378564b71434a196439849c66c09b1669a6c0acc27e819187db47b5ebd355051a62e1ce0cf0d89632e9d5c4d632228af742e89c914904e32091db19f6fc025c3242cba8041e4613bd119a4fbcdb935eca41469411895f20661921d8c334484559125c5ada4871b2bfe1a11803a4158af66e84d16f34bc457212b3b6026fcdc4fb314850625930e00c341086ee4e14d2db124ccdd192505b4db5531fd200baee20fee18d6e0c767c10a373e01045638bfc07e1082a83e3629c3c40f7920623edb030b7f100ebb7e4cc51c118402df6d68c05ad112e3d9246936f8246bc3eac974954fe4e54d32a88195016e58f1d3ee0ddc5dbd078c2ee86eca6486542effc975d0cb031fa7119497427bb3026d82b4ef4fac46e2fc1b0d7849212a2ec14820c08d4087a88ddc61c33f083a9e7509e159fcbd66b1a4a3a6ed09aa08c7e08fe672d57b8ecc2b6729a823fc07ab80a474011b734e0bec2d86e09331f884d194ac6404327e72aaa8c4c2d14cbf5185ab8e13e16eb13212c87634d6a3172675fc89ca2622eb0b234eaac0df725b4d8c666a0d13de9e47ae451255eb0397ccca70072c6e46ad75ff7e0c824504ba7b8260f305db03d6c92e791ec4454e4b5153dababd14fce0d531ed9027b65fd169437b641f4bd9e5ca111542cf371208d0e7bdcad9856844a25a81e9a3f1bc850d86b7afcce2c17af3eaa7091997e7fc2607b222269768fb610d75edd0a51731bbd9fefc47a451bf3ba08889aecae62dbe8fb8424a309412b4ebead5b912c01f111de941227e460f8928c9d057b2d3b1baafeba8b0896a36240120f559d4880161695e33adecc6166394132c0aa2177aa4605945f0fb3faec5cb3fa1bd14a59c7bf5d56e0a1cbf7c3a77cc3eb69198c5f57c0594b6808231f9fbbe8857df892346c56f4725d00e2bdba04dc57b559e1da5c6f12c33aa7205dde2aae002a2f2ab4f5b2f4e30c8070ad5cc06c4c84c1990e584feae8a83b476b784a8731df95d349c39ca3a5041b2b77a8235b78662857987f6f7def9730c29c8030ad956758f443e329fd9d7bbe4b0b85b87b056b367bea1679ab6f53113a34c5d87f7680d7a30585b32523466be6e60bfdf7342edd94d9d94d713734e6636dfd328e5eb4a5ecc69c19056914978bf7223ed202ba7c6539de2a4c953533f11d9b00a616f44b7fd2877519e6a9d7dc379b3736812d7f753b2ad47f965a0f3812cf18447f88b7c56841d7e2974116281bf2a8002cd9d824981439c3ad129f514d94ae3f7e9cae9a54322e33b8e0a242aa8c19e7b86a19a7604cd9267c36008f2e54a8273336250d249146051c5c92ded448fa1ce69292d954b01298da7d0ca91e3a5c75d28f8b6063787c29fcb2de08da415eacfe68c2b134893df67e9f2ef28ec3e9faf6c0e937ee64a643bc43ff6258367654acd334904e779562493cf2fecd70ae43e0068f1d5c4b7a89381c74517a4c9770f9c8b3a2fa7a06a2d42b7490459e42db0f9891709a8711430d271caf3cd810be027549e7a9be0e4816facb834a8a66b58f2e3a8390c5e7d88e1f91c8adb061d4574ca987704e1d649c1567102c2f1d01e1ef8802f4b924daca1eadb8bb354cbe159f14c87286beebca0567bfde56b934addb0289bc4d7380e56c20c5dfc6e5b5857816beb7eb39963d9a6dd4ba5867e902b02feb9f11928460cb742cf81f83a0ea867c865c7b332d174521eed26e60e932612c7c4a59fa3c86b3bd8583b1bb72dabd0d0a9f80e1d5a2e91f846d1113428171d81e985245833ca00f734560a2a855e7b5ed154e1bb1850b9b1f4541d6b7dc19d50a256330f71b7f1ef48819f198bffa8c0436ae9d36d0f79307e8d1efb9334e1cf3fdca42d537f38369f59d61c7fbdae934b7dec7f1b500f4293e97d5a512029a41e1e8e5455b1c059e41a39dce83652c24410820d6aba8f6c52ea2d5f52d5078a2b7c8a81549ff363cdd11f6335d3ffc11f6fd00e4d22975e99008bed925302ac609a6b09a041a1a8c17f937f3f84a88b8a5e20f991bc7f2c44702d0c9139068ddd9bf6ac31bc787e7c4b936b9ac811fba9df1395d91b33a65357c960b9e9832367a622bfb72b50f1e11a9997faf931bcd8a33d62ef07573353d0f0c48e60ab01d6289154b3cb25920522a5f8576dbd7a1af8ca495e48326558981819950fae54f52d54be206fa687517149816c42599b622c270c31e9993d3483814e93c619be8809ab2e10ed2966ef84635ac9db9aa2caa790e322f6da00f6e43d7b63e7fc76020a268e61cab6f59bd2ad960384c83416ffa78978a21afab34280c80fe911017ed30076984c5e2388cbe99c17b31db00501d2df6a555fc5b992b1a60d9453521c0eadcf184376a9165aa789040bafa4fbb19a9146b7cbe234d0b7207c136621fd20c246fa95c825309025922b52fe9382a10baada47b886f53201498364b9180896ed244d2cdd505d682f1409365d695f92d1ae1f9b7975a2e472741c764ffed95485253d39e6c3eba11d8544d0b111c7247b42a393669972c9c03aee7ff64b411d851fca329b033dc6609b5a0f22ee017210cb64296bd2a9d6f56fe5cd78f4818e17782bea833164c0126377d4c28f8c911d5ae3780f5fa5bde6f0081aa1d6bf2e81ee17396391dcf4196a1dcb18be1bada34bad1b99322ee791139a2883574f7bc00f10729bfe59543385aaecf7c0236fb1e46e6f9fedcb9783b5f53bc3f8bcfe1cacdc4fd0531621f73db7e08a11bac0bad49e7446523442742e92963645c6e5c3213a0844a5f14f9698abdb316717ed32e11a3e420301c9c9fcd0b6a1a36728a86c62fe6cd0060c4774823e2057322067e427a5f458ea7cb0fd2cb291011cc26dde4df904863891e1652c5c78d212211d9da0b0a4424155063a88ce9eeb425bb3ba84444d1d8f0f54fad49e547952fef3e023d1d5cb4585edfd80fd5cc65f0d514660c786116033eeb4f7d59c6be90565681cfaae2edfb73423e6b8c4a0080730dce35aefa7fd6ac41651f550ee235216b7757217a08eea143f52ce9876880a67b9d197ecc511732cdd2eb089d60e8d55b75bb4a7abda36187ad9ec6616053de6c76ce654c2492b09c0fca085a90caa747dc4f6b918ab4264b98c0ac128bece8d71d19916f1d07b49fc477aebe0454c94485aab4230022bb24c5a61561ce32b36c085068b3380e6a3b9b270b39eab5461714e077e40d2692d1c28f6bff805c7705d496c1b9115284c356fce6425cf3822477502f2942a1de70009473a1c50df0e092bc7fab923c06c1bfcf8490db11702c0f71328b1cb3a16ae8b8302e888ebf3136edb11bc662092322e5434d00758f7c7d8931275363446123e0aeb41dabb95f8b4ac2203f78ed8fb79bc254d07cbcfd080b8908152befac56e3ecbf63790628e0530c2abf1237a84ffd1449d216cacac77f7361ee55239aa366c42d81855120c05fb820002e600bc08caf381cae5db18dcc1199aa04f66e0fed980c4f06be559f1889a6309a89ae1dcbeda17acdd7011b9a3e09f6eeb652594882b8dca1a65bd511dcba8f3252bc71803c79d7839709b9208a049e7491c621eac1945dd898ca9e0ccd283641b5c16d3e359c85c78c0a67312f7461f9ea9db57578f2149995a8f81780a8476c6a5d7cb3cdf80ecb1bf8a3de1d3dab18e64b90f9342ca3d8698f7bbf7e141d7eb548c089774bc594f49da86b953a83644df7b16b7124b8f4d215fc6c21068cc579846bf6e4c024435aa44c7f48e256deffda586f5c0771f49591191081d5dc221b037a4fe7d3bb9b16b417f3c2b7763d0c80eae69f0b243d2a9d388cfe26c7c4959d75a784f75182d41db2ee589a16488fbb06c4f7df5a6b95e854abb9e41ea978ba28a035a9b448b29e458277ea6d0c124c58dc473db3c5705a51a297a6b4507647d329914870cf5270cf4da953fe8ec0e6dca309a8828571b5dda40beb265a030c4a2b862670ac1bd480534c61edc692179aa46e8e61162ea208ebb1288fe0fdf7554388d055ba3e90c0bc66f311eeb1204ff602cd9379444c8b7cdfb8fccfe80f847f4ef0c34a305fd261a60ff8b7345b773800c3ad4084c47ac2680045a415298afbd7684f2102fd411c03060575ba471c9854a4a50ddf4696d700efa6b91c0773ede68b8e3e8aedd2958acc0df3cf005015d279df10aaf581f3596364e6b8b077e8e0756b9da0a221bf5eb526ba88c0341fbb11d5a6252802ad9f88cea1b588e8790a260c6bfe1c2a64b698e42d433d3e762628ed0a20873fa4ba8e8baf92afd6d0b62a7b4bb5c9cca3d488857ea42ab83dbb58fb9faaae866440b420f1df189962788d0d2ed9c052e6c16993f38d2f2e49c41449c4c0f8ab02ee8ae8501b5664fc93a7582a7caa2f5b3728fb07184780444823bed55e25cfbf15d42eec92056d6b30a04d061b3b5bb554b05d4db3dfa3691e0eeb08788047a287341faa5b83bd3de6508f4c4106462df3107105f8910c1ed0143bdf7825ee42f57bae72e5d8f3df17448505ff015eaa905103b022afa08dc7a86ff0c060947f75002e3578ddc3ba41a78d16bf98bd7e3d0844a94fb24b2e123129542f8c2d1fa7a4959fb2b567eaa370e7ea12ef4945d88147adbdc3530d67918077b78a230d6b9905a52eeab835833d21283027103def2d82dd3593c2479cab2b730d26ebf1a18aad9220fa41f681330eda45f6ab2881157451d8a42a5f8c8508ed2ee08c1eaebac40e488eab824945395ce77dc5c510e94e9ddcf2519c786c141a9ef7afd49577f5626ecf1a2f609b06f626899aa3a5ada6d61b970c36c3310461e8cc584f6128fd73289ead2ac2f8c58944ee6dee36b1552ab0b134cf8a79d149b862a6d8b5e4bde29d3ff97448cf59c50055d01523365e1f70c98c0a4a7046f564571cc6466f9b5d352c6a980e671db2b9e4a806f070cb20885ff819b4090d75607daf0647b134ff07502dfc3916729e1abf49af5356418c62813f02cf718daed1e3fac2981b3e3a5cd20bbf4b061e7ebf075670332bf905de2f296a755709d1485a99c02ce54f85061becc5b1ee3afb571ad3107ec56ab042b573121cfe99d26cc5425dd74498bf82d529b836cf932e81d36798cdfbe76f77fad0d87d0541339423f105dee00fb77560060ef0207dc0a523b304c9b1bd85325204a7cee64c3aff95d86684c7ee4f2d292a394e06acc90017daa06979a6a70c0b00ae4afa6fe180b10a447fa15969dd63a9777e2b383fb915ccc29e97019ac3cee0f417ea76090ae371b68e8f13cad67b43beecd3f7aecca6d5d9cdb05c109e066560f52047babc49fd99cf2406ad47a68ffebff0f5cc3432f83eb0ec044afd2bc63900bcb9a765abb7a96d27a02f0a51b533b9e0d6fa779076afc4541e2718bec61e2b020f5c94d07f9e65b5cf12be67b61538dee5f9d1889e3ef11f5ca2f421f589b8db5e57b8d8f43bb9238abecb38ae41870411ccfee300744a67eb509dbcc7dd0e5cd01ffd9f26819c7d74f332b0b7c5ae9887ac7fed43e8001f689219411800439003d371c0e86c63fe0d14f1661b5dee0fd824dbaf8381f764802bb26e0fa924b492b52a6aa352af651464604229245e34fd50120074e558cea98742935e18ec33d8567847e86f798d09f57c7647e22fc181df3d557f5e6642df8700fe4f0184c4311f100909b80231449fa1e5601aa6fbd50bf4f0ae3a73c64757e0e26746246bf90cd9e8cbcb44c31b0da0aee412a24e4ab324cf7fc545b0b1b55811db780736a24a552e6e59902d55569eaa85266a0f725cf68a54cc526ecfcd0076b7a101a302d3241b2451f9e42a556439a865729f3a518206199667ff1e5f2a33d9a43ba8f0aef71d15f34f6e066a27740bebe0b6d96245ed09a5b12f079864c9957b90804b5ced68e55d145b8e13764cad40b764857e1589f2195e87d54a30ac295c73c6233c7d710d0270912f657a93b8210c994752775a54fcb58cabcf9923dd2c949b6f7d720e5773775682a5070068f22282e1569273370d3bdcf1ae2936d1a3fa9827579bd3c9a2f04c7399b6d2b237f5a6858b368e3f41e2763cabf12990acbb1e88ffae5a040725b6da9b071c628253b94de858173152f2fc7350ec779bc0605e49333ac2b506ab84b7c4d3fc206f6d5e5ab11a7084c87ae73b2fe565300dc33f414e1bc7526a73940b08cc198f88b6a8626c07903343a174dc3795606472d1a777f0bf07933d8866d51ce611d8e82b99097a7db388373da22ba4138990c3162cdb5d9c7fd65080635af4ddffe8ec74de5650b443fc04d235de398108f84ec434f9ab58b53808c9f613ff2d4568103eeac16051c11c8d24b7ae21718bde8da3f74bb294cde90ee792a6a7a747ec5dc237c0151bc712b4d3fb8f0bcf3891d9f92e17c01e1d2830e894643d74f63f980d8188ceaa5e4205495cb081c20784250038d3bb29c3425f52d6a97bf6f3a1eb06c29d29056958d5c343d029f2a11191ec1b176608ce3d586c277566360ac177f27d53f8b110274b224034304a228511a8a0c0507761e8408108dea77389e921b6da1ff5495f0de1437a52cc54c5017694bbd5dee122923eb0f9158a79fa98e813888d5d93a1cf96280970dc0a0a23281fd668869474c666d8d0ee563aeb1cfc18bb7093b036041aa5fdd6d58e06c6646b9134f0f83f30696ce043476c30abbbde4078626ff4d16f791c98312435ac92e9e67f582d508fee173200669e8122850004f71201d2a7c87569b6535193ca9b3a7f544db6406b4e4790137647fcde63ff8b9fb0583c54b24264e2cf3d43161d3c89e3af38abcc4e2f1679db3d304b1686bf8a18dca7d8c497fe59ba5099f7ff7422d38818fe70af94851c20e493496635ae81d09a697b5c8d284c1a9a4b18292b2c92ad4f9c4491ee9e0adedd875e7387ed496140a782b383c1840d2f0de731464d9a783fac7fd7ea1fcc8280145bb7fe48cc72f01b3d8d6dc08141cf80b2949a227be67c058a9567a7a1adb76a93f04ecaac0152c1ca73b08d4845c05ebb7b2e0288198cc183f86b1722b3d134b407aa450a5216a945c6c72b144b7fcd4da7ae3374aebb5a359f12e5cee8e50a09955356adb322f3297cc530a495bc32bf212d7077cae954bf2efac123b5dec6b9bf82f4c77ce8663844b69deae29b05a6304b4b4706ada9faccc78828406b46eae43c87a0bfbca7df4f4e0870e89c9c546fede4973871e6230ff0eea6fc2e2937e3c1f78225cce18583c1d9eb796eb0e425f1b305dcbea84999e3c6c929e87df2d98e457397849937783c414ccedb489f71990775515ad7e96a9eafdf57846a4006020d570fbcc060190cb2a9603490f7f1a7a22246e334fc0090ea2cfcc97aa15e5c69ba095b341b9d3f0ad57ab2d8e8bcf20380093684e008cc6466f616fc2967c726184a995896c5dd5e4302658359b81385bb7732a0fd6acb3b6b505c71b0d9c5e0dfd0faac54bad7df93ff4221842d1aa94cdf7660263c6f305ee8cc19bfcb744424305dc9297ed737d245c2be8f2480c7f6955e19a77216f402b5613ff511b4a21763f1249c36b605eb5778ea349068a10923807f23519d45ed1b236bc3c923074c041030ab64106b4f7c5687348b7870c737b709261994cdb4d84707063c49bd4f1116b3f4ebda165f49635a2d7978e0c42483b1b220aa7cfff5e41bb15eaec5e61b1267d80715befd1643e678e42ea100fa1b708dfcf1958fcb5319aff9f49aebef4fe9c1aef604180e5e747fa4f36a547ff1950c135eeacb4fb60204663696eef9c49f79de64e3c41557f150dc4c08efa2bbb8fde72257c08f1bb3053b9e1b98d6639faddf3704b810495fcf12dc028801aa66e496c92f6ac6354f90f8cecd7ba21f347657613a0d48104a9e04ac4805e5f6bfc773e4c4bd2cd16acaf3ab40813d3c3d22fa4ea6fa841258ab38747a2bdc85776c9172a501b51f657fce9afacc869103f67f2d5ac69aa1c66ca1eb6274a1d633bfe6ade41e92a1a4254a797480ea0410c1875dcd614a908610a19a5ef9822c785eafa899ec5ccd9f1806461b3dea290a1343874add7906641fae086b3a8c54e7338aabc21e9bd8dbc687ad960712231a09afd822431ef22914fe6e38e4c605a8ca27df0c87c80af5deb95d0ef8d74854d0187e703d78f7cc5b1c0eec3461c5ebb7df45e0b03af0ed95edab7267255a0e38243b2da4581e2b8423e2b0cf4280a018fa4d19f43b3289a84c159c1233e88863af2ae4ac769a2063d72bdbee7ffc4683a10e4133a1a083b0456220775a55fc75fa899ab9578fcea21c3a44f15587543a3d1fd9dbb9be5db7e9144097222ce80b83602c5cbe362faf6aba03b5fede54308a5089928451bda0d40b3d8650ac9612a777db0d2dd29a475e051e92c21ed981002e82c69b2da55996986c6bef7a51dfadc144a2fa0ca7ec66f157146c95f1a80737db0f6c8bea9c2416d2fb657b08254f5dc0109f01245b2363a379af36a45cc8b6af51a6190b6c91077a494d0c2075928e45f8b2ac2fc008e03e92d0b04bbd1a03a9023051496897d862ca20f5e20baa935d523c8cbdcc3e140ea10a5226405099ad7337cb259b889653b93d09400412f70858d8a2d0c83c49402fc06098f371cec59db15525fa8f393945884f6ccbd7f9102afcc8f5e506290f8fb6924c42ffc7d43f968e35f34d03e804891b6465786711317e937646dd713a9faaf4fad7772a1406f7f609c9c11c3c46270500d3d3dae5ea87519679c4170290d79a398448c754af81ee7d5254281c42e6d8a7e84d7fcf40384659054e6a4469ed50057a214503e54afa1d0ff0e7e9718baf3e5e38fdce03095d2a54fb96cc67c52dc76af646dae82260be931ccc738574574c33f694ad2913cb06c46dffdafe2f1c2c8bcff5d75c7859f9f2e8d4d13f196ca8dfea59dc025b5f54a6dd2af9bc1e947e70cff92e28c229c7b4902d09330b3e7ca56ce136bc275a74f9fce9c7d5c27b49635912c980d62a089d89df3f48984a433dcabccfffd564f087d8e211151c5e12240c0f6886c101d298c5f6b245b120b173fc1e6cf9033dfe02d380d2be0dda3ef6b7975d1f094bf15740a99c8d7d85edff0f8fbbb0a976daf26488d4738097af008caa1efeb73be0d8ac9918571ed46308457c0a715586cd3460fe4170b95b14d65ff301593977ca26aac07fd1f7553a6dc7c70046231c6a4111930ced2132c7afff8c8be894a2ba91ea3d587b51bf5d23135a9c9fda0f0fd4f9b00971a2c13b1cda6e28b0f7f413d96369bfbddb1cac6f458e4f50413a9f1d7005aa403684ebc5f93232f6721eedc5245e479e873a6566ff37e77c64b4d3651f4e6632a782e1e126b9233d4ea21cda3caea00434700f533bde2fd006c56142e3d89e28e287562a9c71087b4179a45e149a7f38a42b7e01551d61b6b276a7d059e5ed19523c7ecfa5516a957f065f355c2781d588702507cf25ca59ec25b00debb9273c37280aeae1aeacc6bd69375b99c59ce8232fee2a8f2400b16c1f43d63a6031a5298fbcff898e50d89e379938136695f7d4e4cfdd2a4fcf1c0cbafd2735265b4336254786071932b6c5ea307b7e79a942fce175a23fa14076f571b78118eba68c3470b5e0152ad10e63a776ea291f88af7cee6cf36f7df711a4362f5af6cb2da4cee6ef0dc609e17e83a9e72191fa2d01f05d5b4631058e888ed2b658c899195b67afd8d1184fa0284d9793ca80e4c83b5b381c5021ace9fc7f649fd5128d8bad98093ac5142fa4bc7e5c64e72c11fb446ad6ccf434512788b5b865253208af09805b9490b0dce994391499ef59137c74441ad2674cdc4f4508786e71deefb84e6013e5018cdd00c39cc8fdb34afe89417b8bdf52857c2ab662cb268640754834bcb3c431175bd2142cbb9400b4a16c1fffac3e5d1441334904dec405f42deb570d289200910e016db5aa8d0b52966cefa938f73cb1037594e59be8b3e06baf45a0e7bf10caa859ed5c00c7326f2b02b271fa319763e0cb4bdeb1176c178f68e05896629d392e9317dad8feb048edc311a9be884832904ad7407bc93e2e177650a3da2d3c50121b8f07023323ddcf1e08d26210e49a2ffd495aa4fd097f888ee94431aadeb9d1bbded2f58d18b7a4ee3131dff61af35799d51008163e64231546fa7063fc53a157b03a84e77110daf1df47a706ccc5dc24144159975c98dbafc1266996f3063f2c59ebc6a533fd11246d559447a68a7aaec8b1a3eb1deed1f54c953e09570591fe35ffa7647741b4be5e6524f4a496ee949826dd1634da260aa9db903eb2072394183b461146c277e28cbf0a97d87b062fe79b3f32f54ff597431d2d7413581d7e2814ed1d051cff5b3ed40b8cb520002220d8b700e38e8b0d3b56bd84749468f67e0e92e0715d1f3967d72d9c85897acb5a3e9c00025b4dc65ce9b00b494549e8b9d27c368203cbf25b7fc91d101e68110b2427cf09a7086d7e4fdeb1d3c29a21279601dde1dc2bde00e0361db00ade5ffc06512ae0717e4aa4638e1f9ecdead50acc50985fa710ccfb242e84b63a0cad425ab8fb64988c9752f95c0be7596a28b8c3ccb5da481d40e1bf27092bc97e485441ce580c1ea9223c64de455adb91ebe0fd6ece20c24c2da87855c18cda28ce64edb35ad1a052fd3888c6939d38055d660ab254fe8abfc60d6e5f370e01281b2f1c6418ba0560c5f6a405b9a330679f92c1a8cfcb4434192c34427d16c8d3cb57049d410dba41f1958355a606748f6ed2c6e44797a64c2c919f17f2658ff198926f037f96c75c94810740a0fb4095d5f16985eaf14e429ac72421d42d31c96c45c1a722d3eef757bfb58e827a3c2986401f42efaf5f52525cf4d76929e933bb2fc50d66cd07b9d740610bbbafab81d222f3a7989ef86498658c325bd482dadde4e94b559e6850d4ca99ae1f490c5fde56553acc466c1a21398628de882d775204fd99d855c717a3c82c7524df24b70034a126ced070bbe51a16441e24a20d60797d96887ae7ae88c2e578f24710353f018c7976f110ee9b4041e75c18b363ff8d90e5dc0c0e6a033ca61fa487fdcec2b4b6b0b184db9bdd8dd55e5f808afc64d68e13b1c41f8f9d6d3f32e060e0a9857233e9784663e50c225edc86b54880a766ca53c7c379c0b7ab1b91905a101fc4c1d9970d10aea4ae46aa681e63a77a01e4e2b9ad925f4d0e556379b3559ee6be247522d57ea89207fba5c0acc0de5591667550fbc827adec689bcfe31a752e708aacfd7466678154be9006cbd2c53b0b15e39485a62560c4fe689bd47efecda9f997bdcf3bd3225e0b1e6167ee141821b8073a09007793aa9598ca4c39ab24f76b348a1e42d022b8f45b9f599018be85d1deeaf2e0b3ca9dfc15261cc58df4f5c1b5ed6d49dae35c69d76b9a4fcedadc03707e1dc22065b72f816145156e65a750fc686996d23081a09e28623063020ba5eebfb345acb2bf574cbc0c0cc25e6c523c98b923fd6495201e5b7a35de1d5cb2f739b84927d57dd7c1075df714d29254312b23680a1b7caa0f4e37e6be8e21adabc05df7ca013a71b9810fd1377e0d9d103a2205f93d82a6e1b9fba702e874fcfe6f6bb758e54c6377d49b11f5f3bb5b2ccb14ff7f28426cf19e9311060f873f8cc088d3b54f01752a0f4b0a8535cd9898ed558995887d17ae4e110be1fd7c271eb0352514a74fb6c6fd97e828ba95d26345a4ecb6ad3dc4a63fd79c21eac4848c15d6c53a8884c28d46851ce8d6a874c90042c2c0e3ad069ab484fa1616612dee5382f63a3425d67f4636aad3952bf4836763a7a689ab1bb70b2616f19a253fc0dce0ac85f768ef87078dc5056f90874f655bb626b7c58827c10dbc7fd6f6c547763964f5442521d763da4432636a12a76d0325a6da8da5ab90b674a967143378b7c8eca5d45a472ca18fe2895ab4a9c02feff6236f8092e5a316bdd994085721a3cbe32413477d93942e046a68874741b9b093abd2fb1fea6623cedad715a37af2623734332369719c6102ce3c9c68f2e3678f7d948f7bd99e45ae2e6242f0eb988e57aa14d23f918a5b291bec6345f777868a7fdf742e18674d75a0bb14d25bcd2f4ac75ea0ff396edfa8378eb466a48c1a925c949398ffc7ea3f121bf9341d7f4af53ead359caf0e04b523d9586bf04a4157515af341b3f12bd8b0ca38260fd051af124cca78b841f8c1eab2690b602ee9f0662b83fd26b9bc10120b90007434f2ebd026e76eae21184e949252a9ef9ef6079a3094fd2dff5d5d36e760839d6b91c012397e459b05e8a4fe878247a68b5bd2a0d5d069a855a8f644fbab2c84d87eedbdc1cc8526db5aec9b4508f3895d95595c92f61738dfa4414a91e29a677e74afa9333b80f9f507653587f2d420419d580e8aa4d6dad4d90c1624a082bb13ea123d1505499899d96df7a2e0e143bcc4e5989d0d35280b8190bffb19f77bc5dbb2a6b4fdb3843cb7fa9d4c071be64f6351b549e4b4c9bc57b18a52a69a85498154a33025f40770898eb87378c359e537cd7967f0d028649eebb3074e479dde4e15a78fa1228848271420e3482ad318835c9a36ff8cf44307da0714dc852206c8a79a310840d8bad6b8996e55350d8ce92aa55b8c16e42d79db66f18d34fd90dead6f7709d355181cfd523580efea29de139bf38b696734e104e395a75f5b7ea24c583649409a8017e55dc85ad4df67845c239a1559a8ad18f55bd6d731e6ff9d52a2ef6c59a4d43613e44fe225ba9c51c78035f2e18a1b447e2650e4202f2a43c45cdca381b4810c8855a3b6c132b97b6a99e861fb39c371334744b84d14ceb074b60b0fcba3d760b7dcaff3aa8446b1add0a631487bef70b8e960f05fb981472b09db7331bc8ca39fa09f1081609c28d31b90cbc4d1b7b03677f5ac3bc58ad890ba3d9f4dc8079839d20c2644c5b1508a312f77432d7e38248b0892f92a61a313e3c325ce81a901aa279502abe0c4aca3b8d2be25cb4db5efc02a19414ef3bb30a542589277cd09901a8651c9292f4bbcad392ff0a1ae0e00b53ed1e8d01968c0c1b506f22388826aab7d58c515fbdd7f76fd672a9d32ba3ec1178e4b83fdd1ff2f3ed26f750a0a459266dd8f7c01c43ddbe2b0fa78437d268a9eeb4f9f145054be3d60a725f1e9fa806c5bb34d622a4dad83ef1240f87f8f4ed787a9187b4e54febc7a36bc208f208f5728c1193522738a50369d48f748c9638e7eedac9e348d838840934df3a51b0469636d9d2f87597597a09b02d48f95c45cc094f3b7f7f4aa4a0bf0f4c737248e063ee6ee98eb024160a3f98d679533d8da691e1bc08ada1dcce9a7c055f7dc6a35b85c035e71110416fad9601300a661d2648f554aad97efa8e9670b828eb481662f53aeb47a840f36bed4e0db5c3fdfaf93d4ff553b79d322663d1e3c2e2b239decb7e87f6e0c5274dca15c529ecfafb2e81ddb3460b3de00287639d021e9ae2505a0dd8089264106e1130d7d8f487faea10b02b1664ae4f97eb2ead614d0f1e903fc4287b08401062cde5e29a6aef25ee4d79d617c99dae02e8b74006d751472df05a8a621f9c7385301cb5cb1e9060d237f2f0e14aec8cfa3fe58e7b614e5e55e94fd7224e60e20fc7306eadff42523b314428ac89f9ac470e267924241d5f2bd53a555703b7e1cedd9e94f179cd20e81660818c53b19f8a85417820be0bb56be3486876dc031efe0288c43409499dd0300d42e9ab01445e14cff06f29f0ae769e8b80accdb61c5445b61d8948921eeeac0793062b4797ddf4a60e048aa2a0c0d8fb3c06d8fce89d8db9cb489a268da5553d06e39d19f142125631b22c3a57d94d04c56f67d90946c0581d1a967790192aaa11ad17c4782ef99ba5884b7836ba779b76d7503890c41caef3e65c2554e44fdb3e1b1bcaa97e5777da891611500b371fe419802c9902622ee3425bd2dd2d842cce7ecabaaff6cf1b24ae5fcf34c0bc7fd5135a4346f444d4d28a45c4342c68702749b45e28cfdaa581592e52207df1cf2bef71772baaa5e6aa35519fd790577ebd1dc3406ff946d2891240bb42914a59f860eb6027f22625d4dccb78bba6e1000c54df72b54f9f270ccfcbf941a375559356c8ad87842c414907d7dd32240966d1b98dd24c4d13aeb8b4efdb47803b7d1af27d02a4ff723f0c4e83fae28c9c965e3891b646072ec204ab53c99a6e34fc11ab2ac597120d6a1f375aa042122af34f4fb3542d02056153da456827f6386554f98fa0ac1ccd4403e4688175049e837812abf0d4099c749eb03260fd23a2d1b37c9b523eae1595e1eca45b34c6e184717b140d226bf1ab6248abbaa970d876d7bec2aee608c94bc64f71ddbd83e36af0ab1350d3cd788befff31086319a5300bc8e5c6a9a57ea21af04ac80496f168a3382a31bb41c7e9806d3268ce5694c54ac12cca2392fc6b459dfd5cb05088b9fa9e97bfe539509191d26257b43ddf7483ebff74cf62e1e0dc8e1c58232131df1059491c9d8a0f83434664098d765e97a6392e27a72d7bda8b72d7ab4a33c322662859e076f2ab7fc74f673e888ab55d7e125dfd1c66a85bb9677d4acc8acd8e990ca8a018154c0829868d5a303844b9fdd8989b782ae702f98d82884250e027b42cc6a3e02836c5cf1e69f3e6defa2392d3670264401b5fb5ca0779c7521c049a5387bf33db33aa80e5255c154c2caa1ff4dc91740d8cc8cf9dd57754077abb15e6806376a3864b1cf652e2f4c5fe905b0b3d8c920d4b61c33dfeffa2a17e391325a50b706fad5e3c05ec35ea81ae10bf65eb8f72cc455ec4eada646983e6f1fa49c8ffa12cb12d2144142de049436156a0332f60d796501b6b785141db3e0af71cea3e8d659e355e7c41dd34419f00c7846a46bcad2e9235fe985f4b3e5dbece13ec37645c053a09df19282234a9469ff5dce0088edc48779e2df0df885800079666d6e3031830b2bb0e283453196fdd338bc5008ec88a7f0b84cc8815058eab6a46009aadb8c96254887b8a568cc6cf0d1ac6fea7da3f52b33d64e2e54a13af9bc2dc3d0babd0d231514404b6f7ce61af64e747ccf982e8ded730bb7fe2cba2cee788b913595392e161cd059c44daea7b98d7c438f2b69b7a56e6df6515dcabb45f608f28f1848a56a45b6ab55d2e10acbf223af0391106116c2ee50540608cd52ebdd6c836e4b6dc894fb32a540f6b851e64a4f30279e7d24c35d808d8057118252d3803c729ef3fa0a8429929c4205d6e394259c99d3ad3c727d84c87a3e86c0e7c04bf92ef8c520e9c56cb3cd42144431d38906537464d4104f4270ab729893b3ca04cf8275a4a5690c10ecf25859097804bd41b690a8b51f17d08ba2dc60cdb4bbf5b0cc2664d39f4b4257a263cb3210c01cd73811ec46926ba8930d9d03659b8c5646118512d6daaeed61bd0cab75ba70e8725c59278cae923044542e021fa5139841b285f5c85831917e8c0be978d2b1432804eec9056b8732118bb145a74f121086feb284da36e8346296145df21204a3768c07dee45ab04cfa330d49d47d74c82a3773369d652bb4014f036ddddc9affb36f502bf75f5cbe5e60d59a0cbad40575972a4df46517f74d56b2489f92a9c782762a362708846a93258c8c81213d017317399ada812fae07b1884f143c71d9f1b04a3343e786041284d79cb231aae341b49a055d334ff5647a68041f11575bcdb2ca6b019471c5325a47a9fbc47786b8287f98df40c030bc47882b29b9f202f567f1d3bc4c73a29e616d88b15d01c78141a73f181983cea48d78966a7b93463342a5a61cf097eab7df94788a81d1397a566aa34b20c51e6e87a772d10a6ca0fe65168705a1f677286373ad8c16112e29643104f7d83d5d8fb97a33d04a94971b759c5528acf93fa30c5d38e90734428b9ee418384864e2dc50a5713159e30127338b8798ae5224b672716849045b72d868a45939a7fba3280223d370559b8d58899856344c8bc6725c5123e9f1f05273dc42da07789c5475e02e79c87d63a6e7f1ad95e1df4825f5037780a2bc0ca485e1d5a46267f2bc20301adc9787086e5d66e142c294277ed022a2683ba42ec891122e0cd34e6561b48a7b9f5b93a5f2b65a2c35ff0e51242c78df4281c8c5ff206d07d1463a474dbaa5049328c1c875f7b9645c189cb9bc2ed368f99306564e7cefb5e5f539696db48304fb7beb7ac3071521c98a84db92017c86419ea7f4cfbaa801985afd4348b28fbdfecd4d7cc2231a6e718a91367160a939154ef35694ffa39f1827284c3178dbf2a1fff88f9c3b75e675a9dd0f4a2fe9982e5354807b6790cc0d37c1f557c6ef754c16a3b004bff6d3468279b44f83fa326fef3acd7d2300360ba535c892de4d64317fb2b8c6d03dfe80bb890ab395401d55a2856bbbdefc1210f62b7e561798cf592db6111e2901163870cd01e53620a89a53a417ce9450448e72fb3b9e84940021331771621c380b968e21d3399002b091aad1b9fd0ea7e03daaa5a6fe99569b1675d4f27ff5959b7313783bf08095a8189e191b5043fba491e04c39d2de7495d1a909846e070e01c4d253e8821a6e00f9da2aa53f413300e4533940d48bb710184a4785a1c43ca19058dcdab9d47e6a00a09b05dfa44b91af4592ec5792999766c72050387829e2dbb116d6734720280305880f08f4d2b3110dfd96113c1c71f63a40b5cd0d352029f4dc71d31183fcec637a002324f902ad45ff701b52781f90c5220ba007711c96834ab47002eb955f32cf51228d046272013d33666ca269002eb6609767d3fbced64c85bc3c22925f07a562d7eca0c2392c0d420e387249c613d3fb5351da45baa933b658b2eb24093e12c26eb204d34ff65263bd4064fdba05c5e4d895bb19c9a8a9e910e67ba2e983a301839bdac8303616b341c3b4b7a079939b25b07b39927e8792c20c0a223e8847221ce0ebe3a6b1e5e9640154ee1d341f70b8c8de0c4c66822d3f230f847af9f17af04c3cc5bce84080ce10304480e478193e3c3310c6f7c8ef2d1f0692e1b7deec0a3ffb3bc5be56e3bd2e21286aa4dc82480d7188d36aab1c82470d2003b10f0a24eb0e6cc43f0e2e790adf362588e14ed74f6e8b2013431765fbdbbd0d11cbf87f140015f57ddf160330f895122331ba4c35498d5b85abbd1b8b3683ea1f79630233ba1738e01d2d223abd51b39c4bdfe4c9aeb1c755664afd37fddf82008f8b81011c5cafaaffbc9db8b61e33fa1359517b0e8e4232238bd379bbf95a6f6fe1c0ae2b7911e8b2db5321572c22e1dad2e665b7df296b3be162d4be236263b8b013274f93e0772300c5c80d3fa6a21d359087bedbb78edd059bc8bf5ec78330e302f8aed4b9dc27c0f2503ebadb7ef6a92c9e00461d512c92c035d6a91cd7f814fc6816856139ebcb0a47881d436aab3c7f890bd26835343d421eb40b4fd2e18f8fb066996d5ebfebb25af4d877046ab1cc4e1fe8d874f25117b6d8da7f848f2bdb5b75a9c80a00fec3431a658660bf9518807046c91f9828d74d425843e47eb72e486bf9d36763ac91a73fee184e1cb7bec648032f76f47dcf77bdfb22f60afdbb98429edadaefe1bc3791652cb2c45d9b4d0f4d3c1340118bbbb68ae9a155c25b9b54ba3bacaccff16c0e02e100e65531a79afcd05b18031230a233dd0c3f4f2a468d0622484336a53abf44a7a367fe35e9af10fab57a8ea262c00428ebee21741c1c6c478439b082fa90b9d645f3c6168cb2651ea3993cd65b313402c1ab83407fcb1b2fab7cf657ecdafcc3f78a62bb9bbf56fe50e0ecf0f5739655abbaf2d703d3763aec70d9cfd08ae39a57eb6aa50ae90d148c49bf12cf485931a3f9b987cab3d4680950fb1df2bd5e524dc096e40daf809d9070778e40f58358fe96038188f2e487640671414641979627c9b87c71e75b552acc4aecef58b6334615e73b78de947090d0de8f8fd715fc5f733f85628fdd62b3b9afe02cdc01de7724e2cf773bca983831aad70d605a01e8a66eb2477066552d200a09053add0935a3209850b673d36018aed37ce34927f2e5d5beb11a5e69b876151d5390d027a2c429179bdc10e5722188adc61e069d7932eb6695bd6facd84cea0494c23bc03dfcff1b13498739b4a3e045b3abc7ede145b9f5efc108cab321d394d689c9acd2c513581fddfb2603d6ba03c6e326aa8504381258c4053ba97c7727e94df4993508fbb7f858df1286622c08b182adb60886df0e426088316ef7e29071cbdc5141fcf7d648b4b19a12002ce7494dfbca80c549361daa7f4857b390dff18088020de0364eba779131458e6801ac98a6dd72bc3d180e6102231c39315077ab68babd54a935643e30d9ec08de9fd96119ccdcd1cda34ea5314245f442a7223e02d364233504ff8192826c7c66377fd1298201dd869b08011a1a60a1e191f7013e83c75e5d3b80f06ce2d8538bcf4994a86bbba8d55517ef881de4809db20070948044ffa0c9b4a65a9c33e0f1db59d7ce774457130cb41b7134d8b578730ace55d9936de6ae9ebf6194d921ce8d1ce2f401278da31b3bdace9a938042e94e88e268a7887427e0c550b8db01958e1182a467d8ea83412020f4bf268b4f7691835f45759536c9dd612728aa00cdbbc695fdb4d711953a833e9e562cfe55ea0b5f694efa94d7493a62cd2c65ea5fe02289ea85b6431def9a968ce15e6f7830310bc4442a1813e82eb1398a1c3a88b9874f4dad0c6066c319d76bbbd360aae7c8178968442988ad3829f0c792e01647205fe49c4050d53209cd5a6394d79b0242dd804ce01d276bc3ce787ed78f98c6ffe87ef78f9b43d4e449a866d1242db22500a202b008a464d5d4b158fb9f7cda2bd01585f73e346279b702138ec3ffee3f7ff6ea49b888890901d460df30c800ca77be3e6dec099b1d91139b0d98d9b1b37ee8836c17b3f672fa114d188a43263e57d471fc18223e48f2872c44cd3418f704196af286dc90d3cb423ec1257847c760b7ac8f2c618299625b2ac9165912c4bc5b26658d68a65b158567591e0c6cd43b9cbdf08a34f55967fa1693a4c59fe06ce8d26f4d98d9cf75adefb7bf73dfc1e10efb904f15e2fcc5dc1ceb7f7ff92a39fbd4427595e22aeb02f334dc7bbfc8b8448c83595e5b31b3759be3d350d877cfbc0f6b39a7aa24bf2d513b7872c2fb790657392041cb26cb72a24f64e341cf2493c94c4ee967c029a0e7a79d966b349596d230c87eab84e0d7744955b29d75a2f075fb01e2ecb3b77e772d3d19a60312ebe347cd3e1f20b8c48b03d77bc97174c891724727489fe6460d21a7c31ce477938e93b9272d3c605bc6c34a3a0422935009385d0cfaaa5eca6d4da24721fa6bd26fa54b9f75e73773d0426cbbff4ee0422a13617282149445f8cb8b922e2e11f8a62188a847e5e09dc200dc7049ce99de228224c7e6bc8306d1b184ddc17f607f6443b71178a889b9327fa04ff1a19f18987fa4199386152d9fcc97b4f7a0e36a33494a6e1a04ee8184c64ad75c2faea9c5c32a1c4a1d8e1198cfb96babbe7ad983426ed06489768e6172f09857f491e4aa65e278143e497e4a1a293e8c494618ae6c84bd164eb0d8bf1c27ab56ee66c1c1663b925f9b92dbaf4b07cdd1ab9be6b5ed5ad204d415a24933173e00c034e2770e6cc26d6b46865496b76faf07ab2bd505a1e3992df254e7525193375e4a1261549f283583e79629d7cd235bfffa861d24b962c49a5e413f9043a2f6e32182f27a77370709c83ed60b76c822373baf4603bd838320c39068e655972499e4adee5986cc12a79a85e62d3d5e91d8a62d1b84002899e2122eb999ee9197aa4924f82fcc882a59959cc2c6654d54a55b154158daaaa51552d55f5aaba55e59c9286c36921a9912e3de7856b3b5abac636f97d8b2e3dc985d4a2a64b4f2a8938b016cedc16945a5bf320ecf7e003e33551f2bc80f80a1a4963d14008e1f478b0183c715c4d5f1ad90a77457e3d9f01e993151367a6afb0661abe2154327120ac9d8b3e13e5d62e1deae5c4a663c9a3b894ff1046376eae8897f350b2c6bd9c9a9cea897364d42b3b9cfc1a5340f612115ef29ee01c51e1e68aa8701adfd9863bdde0661ec4c8eff3e67d2a51929374e955f3736a31b39859ccce82ce2c66cd3c328fc0fe3c82a44beddabddd74f2c74389ac4535305c5e4f2cad39e784b00afb859d99a9763db9aeeb7ac47a3c2cfa8a43e8d1a24def5b70e16a6e606bac68c4668dc98fc69cabc132fc54a9aa1955b552552c5545a3aa6a54554b55bdaae412c9a4e1e8a24bcfa3647ae6bccec1b77312a74daf3b3f1ad886833d623111e5f53264034b1f6b60dbca6aa5ac2978456224a4b71cc248469d8875e29288612422105e89783641c124dc33167ed63378ce797d5c3c5767d15a9b42439170909705d2fb4267617f489cc6c4c623e391d1b0e3b11f14502845e2d0c0b6fc46224885e82308a4a9689adc338d09901f7d823d3d5565abea5355285505aaaa5055a55495a8aa2cab9a9252aab2c242235e355afe0a5b135349ab59cd5ab97eb72116d3c7e60d169dbbd48f6963e6b5aada8d336a45cfc08e2e7a4669268a54552e35d2a67719945e53d12d949ed24b29a614084a5d280d825221285532baa26abea107c2ca73b312e4caba2dc30b3fabdba2a8a125ae6713278c18033a5f591008295da40c424a21a41c42ca929426296d4819d338d264741ae9d3c4322d5fd1a7d658ac74a7aaaad9b73a86f5bcd895692b1576a93cdf5030e07a36f10cf45c0d938138beeac11a79a895beca497fa7345409fd3bb5693aea5fe3152646171d880a2689b0c7733d1eecf100e1f1b8783c41783c42783c1e8f1e2ce961b8fad1986031b10a9b351a2abae4e87c261b7ddd20020700e455c44ba5a75d752e4c448c85e119ec855d912e615892643ca1340f356fe68d6dd8af61a75f6f76c55cb8dd6c168102c2dc380341ee5ff3a64f0d876c4d8d5b727b412feca78b50715304e706e57a5eb0f30d74354da35c1b21ddf59f176cd634d9bd3927d95d24baa48fae0a90d155b01474f4c680884ec25250236f1a27886ee33122351e3d034157e86a23d879d1353fc34618d8eab09af4a1e84bc9ed05a48f4890241a5d910a9bd94cbada434995d6646477f7a44b9dcaee0c58e4960530920c20b72c98618c4c695cce1a93c6e474a96031f3ce4151ee9ae802eb562eb8070bff4962abf71f26533d9b22cf09595866bb168d2e3df24c4ec9e5acbc588c24a34bef0e0eefb393df2116496c601a5e0169d04c6f44bae8fd86df162ccded2643230da5f27738f3502af8089c812db0f3310576e2f409477e9f4d1a45adb86618f9519ac88213acde72823c5153011b4e91225457c17914a14811acabe03c461584a5caba130c9cd964e63cd3a3f86dd1a59ee9525331efb3e9ee9e4fc98c85df2286d2ac60de52eed31695b516c6d59b9b4e8b962b4a1357605f67434879be4bf9bde18f86f38425c6ba18c0015746fe8055e1c02ba38c6cef79fd559f1bf678ec0dadcced97131929bb3b8464850aec852c9e4baf1658534100e457abd7fdea2ecff73a1037161a355a7e3110b0062a8135b0c6b55cf348fe115360b9a0c56b58ef6837869d38a333496cbf6be4eafaea8be54eae43506a2d8cafa38bb3d354787212db031eed477729ff2862b39ee9237d723de36a7aa671e652b9a9e8b6a2675060fb2c9f6f0b25f10476a547e562029b4130f27b4c590846a34ab049d331e12ffccb614a155f356f7e61e76b4d1e22bb2a9ebcfad24cbb72ce72ae3a77398739d771cee39c754e49d36139ab5e58c414c045174d53b4088a5ad1a6f71c39e6cdbc694a336f5c72362fa5c17a54d9c254092ca37ae66a1cced1a5f7d24ed30cad8484766a3aa2fce846983c87e36c9ae6c833ddf434c3eb9992c45ad0927326e76c3877c339229cc3e11c009c2bc239da5cb8aaa215b528b62a2afa516705a5d6924838b32f16ed598170c9c909c3c983514e5a592e415c708cfc0ec7804f201930ca492babceccd0233434a520ae547eaf8d6612a6942a29e1c03fd88cd2a0609ee9f54ccb265d2ac99c86e35dc98f8712512b0c20fa750b8bfc4edbd5330f35c2d48a8a4e4ca11f9e12258d4ae2d9341dcea666d22ddaf428cd1b915e519a9ec971e18c92ac1d91488e2a21c3661227bf7903dbcd49e7ace6b4e6ac735e73627376a06b898373337b0a71f591a66388abba42eb421b4346c215a0746548b82a6cdbb86cdc90ed068637705c45bcb4112c34829de162601b0ae04aa5522ae0d15e0370b53ec9dc4e457eaf3017ec837d024424c50a04481f7d8449b0d2277dc6496f3c4440462b10109160a53192958bae32c20d67ce26df9e6923de5566dcbe2b4ab8546ed8a8d1ddaf3eadf870ef3b71201f6cbfa666c6d5d4bcc03d58f795eb94b411ef33ee139bcd9b774aad25916e1a13a8079b3d2528b98d2ec24df320203a0933794a9a8e9b463d2e9cc0120acd642f0f76bea651f699943c2c58580770b53e7d5c1596477bd571b58622bdb926341409370d7e98e4b290dfeb1197fbc28272bbabc2f6290da53d43697a86a6547aa1345fd8876a3df34cee0b0b211e60e68c648712bd660cdbf2e11d50f41ddac1668e0a58070b714562c70f4b49f625240a50aa06b8827d7587c91ca0c2b04f06b89c58f8f91eb4892e954a1989e894c608a5314313989e7928f9e4592d9a86ceebb4704b68381c139ce9fd392ccce4e7a4906aaea64b4f6cf6ba86d474c0bf518d1c5ae91dab79a6772ba7922e6cdb70749be4f04a9f56ea4b02383e584a00ac4767aa05e502188f545bbbd7f04528e39497b6ab68e731fdaaba6b9baa7a09f2b4a2aa5c7786afee56892ba2fb0993d25023975ed125d7997b5fe7e69cf40a2b2016e3684d633d689cc37bc030142e673d43b5c8fa4829532bae38d2a7c6322d63918466d127882718357d5a7178dee48943b5e8137c698bfcfec24586c95de46799e4d77836e99217f91dd2c1dea0288d83134e37a44f5d5ff7e3a25194a64d6fe287c5b0546447d3a73607fb1838d3279a3e359a8722ed8858189de37e3cd2bc9960e0341df30055b5a3aa7255f1a82a04545502aa2aa6aae6d5a39a377daaf27b63db39cf3a21d99372f27bcd57cb34b7942113db875474f3e88a0097807a80abf5e9500e36c80f2edaf450aea64def642419e34818469ad080e1bcc85c0d4b566231d14ecd82566aa7a6a295b0188a7b260e3df3848c3e410424a0af9877f5908957123eb00528003ed4a3caed46b5c7d5fa34446e974b1e6a84258e944bdcbc559ed3d52019551056990bca27223c6fe493f71e588f5286343143ba449b388744f47993c43d386ffa8812343dd370c041d6643dd3272b3fa9a44f99ab3e2f95488705eb6af290ea0e693759d6482d6c905f43519a669a41ebe720a6618eed77ce1a132bfad4f87a83cd280da5a146e81836a34df27bad10c2aee8e14ab7452f92d1dd4522aa19e11a12e99fb775dfba6b676124a4ef68476a7a1d13c74597de085bd8a6666953bb4f920b49e672565e068b89104a48fb0e91abbb264e7e37a6dc2fe57923c23fdebcc9efbd3112d1abdb3f44981ae9999ea1346eb0f4d6fbf2ee42310426c3ccc289fbca4c69faf4e6ab5b654ad3cfe815f9bdce16512bbaf44edf45b875cfd074cf0461dc9cf716456e070f9d74698acc819961730dbf4bd34119d40c3ac99e0feed44fca519e82d04129473990148c7220210cfa7b870dad0c8c546231d6e7f3c93e79be52faf9b6d97e5e3f34c3cfccf02333fcc40c3f30c3cfcbf0d3197e3e1fdb899f0eb638ebb7cbeb58e73b5ecb7db5ef78f5f68879deba3d5e0f97679ed8c60bbaf0934b00a7f07404a33a622b67bd27a5947256ec72d7e58acaf6fdb0aec8c980f03abc62224ec4e9d321cc515d6e60bcdc7e3c144c9720fcc23629638cf1b9f7feee0e6d90360202b9c2ddc056afffd12719a4c262e490c624d74311f3902bf23b122f39609a0eebed59b3e122c3acd5783398ebe45e50224c961d10a813238afdd81b651c025355ae72315eca18fbf0c413711e6a84e9933e55345dea433b553368154d3583764239fc8f56baede98fbdef7248acac68614a382950410aedc1d914d97379b3579365c471cf2e23dda195e0a913a7c3de55344fa8933e5533f40eed54b920e5c63734137ce8463a34133c7df25015cd33cdf429e274c905ed14d9d04af04faecc910d2dbea19de4d0ecb5ffbc5e58cc0737eb3cd7c55cd13cd4ed8539eef0be1c715e76b773c481d7e5f88686a283cd4eda00ad19917db22b406b03c8525a43a2b50064a32a67e7f31ddd33a7dcd0cc1fdcea8f3e7d6eede1df913ea57c7e60ed3f4779b5ec3b163bf8a885b51fcf7d97718c2ce661c8abc931edd25cf1908729d147d04206f9fd72eeaee3b11f946b620aa8d84212fabb486ae80669133c86c5846e078b698c24f497870ae188037172e85656b4a971457304081f71629346e56813bcc32f42b0cef62d1633dfeb760efee853670824c83fb9351cef7c585d3f18a5bc19cdcfe1e8bcb0ef5d1dc12aa80d27c7bb1af9ca58eee499ebddf5e44aaf1999604f8a49724cf250eff1f1d1a649390e20c7935cfa743dfe256b5d2c79a6d879b5ac4562c943b978701699e4d8c1585c02734997e5538897ed366f1faa3fe7679e7fe91311795ec6c35a5959d1f993961071a88deb8e4bb04e01350da5bda04287d47a9e3d8a87fa1c5a9086ac05914828bf2d953e983659df4ec44bd3d10dbb63b7ec9eddb4bbeab6debbb0985885cd6875da27ecf0976d3a2ecb7a9625ead4abea582b4cd87b0ec4620f6ecf04a43d0ccf3071f6fe2e275f4ded8a894b2291c49b227eb7a17ed6e5703039eef2de7b33ce42587a839e52a8d2db8f97a3b3fb8db2686d554e528eb73f6ffcc3e6ab75d9f97a5df3ca19e51de6230099763ca545ea55701ed60c9767633e0290fb34d2cb5bd9902ba25fafa805a06fdd510b409f3aec93c4d257987689e2f91c7c0229574f73818d36847fce461e49a5522f48a5a8b0030a15c2808623a9548a0a2331f73fa9249186861552476c17624a071e2b2cb9e2482a95b2028b8e19602a954ac9a006b3b1a18193542ad5829927d4dcbfb8b0049c542a7503185ca1563187974aa55236f082b5c4492a9572010cc65055610b39681c1a6598b94f8b3049a55237b0703eb93f6974d036a9542a0675b0725fa6e10c35a9540a0730e8034aee4723b823a954aa8a544a072f8842b349a55230782a45032cf7df1568b8f0924aa568587cd0ee3dd295a75c0ca18607f4482a45044fee3b9295589272c4d7116ccb5fa0213f9cd13ebc1a75f1a041ca28c8630692daaae7e970ee79baa64287a29ddc3a0137a6e1e8e14cfd2683f5c21011c2081fdec1038b4496487fae4f41de833cd4fb752c8294b4b586699762a392877439880f5eed06f4ea937b0f3a289e43c1eb1e8d4927c620d7f30acd603d874ae0a5d91dbbeb19460e0e54d24f7afe8c3c9a9c076377913def256df38cb85b871192f1c449f5289fcb227bee923c71a797d00cd67972e73b1a763c0fd2a7ce3d1ecf3b2ec9d5b97b078b71f0419ee53b383459db1c694c56228e105aa089355877f86e9d31d7614375eeba31ec14ed16505b6bad41f8427aa8ae0a1b7aa5ec7266a37355d876712517f81285fa5e0906891c1d6271b9bbad07117dc70293df4bc6d10916025162619036bd6320b1099d638cf114d8d1cde561210d070fb5f61cacb34d945c0d9a64223d82da5a43554fcbc1f6df934c327c3f98e11a6a6ddd2e5d6a53b40b81a336c639fb2481f48f2efd784672317677c462dc1b0e225ea9f44a0d87126c3fbb2edb2897ee183b4608a19d7758bcc3e0e39df55d2e24540551b38987aa70c9724740ec60e08a782fe1341c07a183584c4761ab9daf14c57ba656c4fb6b5938c093121eac7bb031306a7371a1ecbeb08e446a94f59e9f8247bc959f07223fe925265597d8b6297103522f2ba6cff4acfb449bfa6f97220d81689809a3c2b471e4e70c89f69418f6e3416d2e5953da9cebfe6c9cc1641a773963e599cdf0f20dfb5164e5335e6f56420f32baca83902efa8e6e0f458222009971d149b08257ec553ebacae30cbc62f14a0833a1f2d181a86020273d3eba2660b89b68456d47e368de4d8752fb485929df583f58279a8e10e9f0a5bcd9672f7b7046b2231922a24d5dea12cacd9ee190e1535a293f79b35206753604c61255e1aec8d05dd156348ae4b06814a4b9a1b90e8c36c18faecb7926e724c35b32ac05854c1bbd8dee25ba34549214e5a144873f89646d8321eb49095d74619bdec77a5242f60af5e93ad2695c177006b6dd64185123875279175d8257b98e499be01219d8ccd194dc122b1a35a2111da67c14baa8434668f660536ee6926498f3a4866e3b30fad472131786938861975a762e42c180f9ac31c5afd5466b0c6ce8f00e8c3ea51cdec1bf5d7b5c1f0a1ff399ed12fc75ec290ffd55b9af36f52b94fec7fedd941b72385d82eea64bf08e0f36e3802b83267b56024556e5ccdd746e7665074f81262cd0a78865da9027fa14459fde65598f19b4d7d21873506a2d297bee76333be5021b5fdd3d7337ef158dd0c186b0134f2fbc3a62192d64691a1a7f6830bff71e0c4cbb2dc48073b0b04bd4f5a8fdda9709cc014cf4fbbb0d368410c2c6d2c94090bd808179a8f6de7b190c4c2edd392786936bce83608e75d9f118618411461881023f168e1093a9c75ea105baf43ee4ad4b15a59442940fb4f7dcac8171750909384676efdc0c3ac9f133270c27d8a5500c7b4127108af17213e95a955c3fb9be6a28586bc5d91018280614c31511df1a894a99ddc8af8ae18a70508c8fbbb4509b17eeb258c89b850e6f06ed9567f5f68852aa6559b6c2998bb11e6232f19dd76e5228745920ad5737d6dde9f674dbee4f374a37a8fb9adff13e97d7d643f76993ebe77bf5ddb57627a6319c83c5da86b63e45eaa3d6fa785dbfea65bce8a6604bd45ce36bc7633f28a050ca3531051c3a2d728c31f1a1b49505f93a23848e84a250bec1c1caf604240191c8b2f450cd921eaa3a34a2ad5bd10bd350f4f2a587a238242dce98bc2654f7eadab12b72c38d2dd1391b41a631b55b37ec7e0d477b077072cb2d0d73b099cdf78924d8cc79e1bce8779be852c321a336972ae59c73cebe670b36b3b36163890d1f6c071b9c9dab4bf1b155d5e7935bd54cf12d362e1ae581857777340f9523017deac727211fb1c788023d7a5e59f5ad0d80f2eb187d28100e32038372e1cca54a9f8ab31ca51c9b93dca60ab3c4898174293e01378976448b2ec5f7a48caee6081735cf1d79d1d94c2f54f9e6923dc75799063bdf9e44a69f373a21a4c4c6f85871a84b71c76ba7775ce423d9c5a0ea5bc5493c13bc6589c815fec24696ec7ad6ebd717d37040f9a48b1b3d9091fb0916b93191ce310d07acaede4188072dc816e6706357c34eeb7412d070c0777d57bc5174091eba226d82af6e6b231c8cc2a51ad578342a3284772209583d6b4c3ad8023cd7c41410e58eead6e1ef2767c7837db9e1e80c71d6ca90610b4386cf3e19666d0b193eab76341c100fb65fdd4b42fcc4be060f6d327be5c619b6830c10bbcb249a8e1d34b16b155248582a6260539f2459fe93e4a13e97ffd47c943c14bc7c0a4ed3214496ff2cf930f980a1e9b81e9f7d6cb2bc4ab2fc55726d2e158270d27494649beec12f58eb5556378318d87991c0cecf574d8792a6a33d634932446649928d8c64f97683c823911c6c265292e571b23ca20b9bddb851826aefc64d9fdcc3829d6f1088b7971804e03ff8c6cd33c9db7b03e799e4bb0b7607d61d918ab14b1a0ef9a8039b5923d626b1461eea48d3815ddef6a0e9b86e8d5825464c54b4495a81753cf683020ab918d8771bb9e3b11f14502825429767cd933eb50032ca2e69933c932c6f9091a5a59f8922413104539ea8d62e75ff83020aa5884601f854154a5581aa2a5455295525aaaa515591aaaa73dd00e306ce43350f696fdcdc7842442acbcfeb4c60496085c849351d2e593e5e61df33219670c0e57a68bd3a2663adb0346847d82554d0f4c9b241967f3664dd7a423b5a4d9fc427562423cbb74c491348145849b2ecceabc32ed186a36fc1d08e10e1d825b60bcba4e9f088d62086bb74ee21b1902acf1147bc0a1fa0f3ec084fd5f18870446b70b9eab48bc5214b396469e12c3ec9f2d551d7af6384932c6f84131d499a0e20b2bc114f8c20e394b2deabef5def61ef75def3bc67dffbbcd7a44fd6017044ea88d40d30baa6e66baa032e6d6a223a87128b826953bf7374a9e3b31cd9aaef434a25c519125dea1c6ec773c1816488b15d6369d4859fa8d825674438f128b59644ca4839879463e9735f90329213d563ce1098157779877b54b97549ced9172483fdd128d23341d465aabc630cdb8650f786b931d815e9449f503e4ef4c9e6273ec442082b9cd1aa72a24f9dec449f3027fa746527fa542f27fa6439d1a7aaa29d151f569e97b28f5842a88d001cb4cb4106219d8797103e560d07c450c615d887a9a8cdc57a198be70a3d00d8ec9a82662c19ba9042195e19668833faebc25fafd4b23e3fb0efd6219c9044ab3ba40421ccee5ed802a6c8f1115342a50b372821c747dc289a6d5c55c43a7ec13a78d1492f2983a79803e8eaf0e860b350cfce5cfcc431461ed82ce4e69c4d87a42c3d1f49218aab8c237691072ecef950975842241e58961a67cb59e871c09591e5437d9a54c6df151f99cb795eb7029b59377169cef9ec668c320290bed2e75c734d763221390e7935d9a54b13af5c2047bc323f459e18aeb8fcf2c42b3ee66481bd393a16d82c42d9fe4e146aab9eab4f5070c09591699cf882514e5a59ae666ae5aac6055cd7c414b0a39d1716bea8865c1dd6c395723774ce3584a5dcddb2837d0865aaa8ae41d72d979a0e97dddb3927b5554fa94ff2aa2cd2ed33b96ace39e79c73ce39e79c53b6883deaa49c539620bbfb26bceff0bdf79eebeee79eebcecde11e9d9f6c0a85dada43d5be55e5d6a796524a49a594525659610ab0acaa03fbaff13cbd3b4aa594324bb8c4bb584cc3c3f8daa64b4f4a299f7c70e5ddc5b81e9d7b66017aa91c8d60b3a6c94df3e071a0fb01a869dc11ec6e6211ec7be6ae9046220d5c91e91c448a27ba4b10a34be77ed0a08e520481524a29a594524a29a5944b9604699068849bc912f94ecd85569225221a25c4e549edd44ba40481e4619678457e8a2aef8a0f494497e0cae8ca2c04e82e41bc76340f4579c0b791917c10f22e5c0822e5618651360823a85d92081a22b994faf4f08b854142a6e55aeb859d0f217b3921dd965bebbd3ebaa1c76b74833494a12c59b26c9144e41c594a29702591deb01189749823ba14fd113162c9a3d19547870d3f7aeb13fd68f427c299cba325447874e56824e5e87274bfa3fb3ae97e70e6f2e77aadd7557fbd6b263dd2e8dd0554e1ecc52588b7e0ec42e09370662fc240fc3570466b08812dce4841bc717617dcda44e328d0333abda3d7eef7208c51ca3929b502937159f4d6a766d1cee8580a3ac933c12a0b0b8a019d7c2616f3a181d1008c11d11f2613b3c8fa3dc4646016390003cd64828f98cccba257794d4c0603ad04df3d682578297a9d988c130d07bc08f7918603be464a69a697e6e6b008043be7ccf4ceeca494b9638cf9c1ab82106668bdf732bd2f4779d5eecef47696580fd145f2a1eb32bd1cb5155d8217859a3012a44fa1211e63463a10cf4a390e71619be481b852882b25bda307e95355e5108692a64fa3775240a08a06ce4a19a40202bdbacbdb123bedb1b437436549cb61cb3b2d4f69394bcb575a3ea3e52a2d12c3b7e4d13fb78dae953b97e5aedc19377bc9592f8102dea6c93e2d46fad47212ce86c0c0c31c28c610accbd75bae1a7776e53aa5c76a47e534ce92f2eabd2b93787fa9f4f202fa086749e46cf42130192404f4969f8f10080402812490df3309e41108e482813491412050088f0e0a921f0804ca92c8ef59127994723dbe2b437f387b1d70524a29a5e8a08bae0fd1abbb95818f5ea2fb81960c7af69169d15d612288bb1c4810b83d930b067241ac47940dbe7611db86e3bde100dd1eae0cd05fa8454545be86ca6ba8a8a40c8101e12130b97399f216969882e10a0d16961589490c9871d267904824d20cd257482ba4ab9270fd4a7dbc15ab2b2b2b7fef1ec2e718e50eaff8b82e7f61d8e9e73ac54eaf530c048249a2a6b0885ed59419a4635145a376525870f63f94cb9b0d81017d3ef4738a33ec9f4f86fdf3fa7958cc1b81de5814829507e10c06fbfc270ac1a23c83c92823ec17ca10988c61fa96ef786d5beeb95912b9e5108b59a901735d2d979b13665e4a295b5e5b92d8eb8a483a4f983cef144bda04bb7b49d32ca16921b55811ce48a4116e69696969c1cd3a9c5e82c466bdc4c9184bba60e2c50d18384d72c2e8d3932d77774682f4c98928f2b3409fa494f21287ae2be252f5ae1c74551e2fd07b0fef7811f30173e8b26d6428143a1613baaba96d830fc423e8b2337ae6941c31e3998bc2076c9e114197152441a0c7fb9e8dab79c2b309dd169cb9dc727957565edf4a5656de367daa5f7963312bb8d95eb955e6d09d0cbd1933bef2dab9a0f8ce0505a12dd0a74b0c9297972d128b697975368a2e4971f981875d0a420829a5b973a99473cedcb973ce29a5cc9d2b29a531c6dcb9b1aa2a0861ee5c6859d67b2f77eeabb5763734831dfd1a8dae725deebc8f40a74097e24177984c130d0724c5207d8a425cf4d62897a7bc352a8867368b84b8f136973b71903e55195ee556f9912e6c38e281b8f8c65644fc8c0a9a77a967ac47e8f18a40af6fb90d74ad9c72339a4567b919298b3014305b193e0a295caa489f42b5d61fd82a95b1faf9e72048e331e52b2caff17ad047075dbe826ebcbc4f09d147bf5913398a222882f04ae8239cadc88c2e710602bde526328804228148201288042281482052e82dab8c4eb200e9a183aecb2aa41938a482b326f2c8959143f7548ff1571341e029009b6488f9205d863e3a4806f4bfb712c23d5c19598441a7d4cdd952be182184f13dd91d55446f590576097451eb12e8a21ea18b1ec2b4e1005de4cac83b1ee8c6936e16fa64b988e5f12f620d7039bed20b74456f58034637035d843f3fb0207cec110b61b9080bb91e894410261233cb6bf578bdf388b31a90c8731803245e79c31890f2959720afc8afc4bb02fa1bad3cca83fe5256de597994073d914738eb9cc8cb2bcfe0a3b18269bc43e3f1d2c0199197e3bbb39dbff8cedf512e111994ffc0ae28e172ca5d4eb9c442400eaff8a824ceac0c1202fa27e59f06faa7fae773d008bf9b3591a55461792b2af2a107c1a27a79472929779812d53f1f9c819e92819ef29a72b37e98ccab0d93115dded15b7e84b367f91defc9db8bae10d069e829b7737df65c5396e81cc24240af24261233087f3e6df6dcac89980e565d2d5b7758059b8994b8975048a9ed25373db0d5337773c466ed0666faee33bd53e4200fd53434da4792a50961906772a9dc44903dc854f1886d257dcae0167dca9a174dd3a76885912b8e60d1a7249d45d7b4ac051029e52920c7b02f55a335405323102ca56d4e2765c7f82084efc5ce39a33d5e0482a53d68fb14ce350bba18c34e4f7ca713df5a8cef340c93699fced5b4cd8c81187bbbd66b8db8822d7ec2f6193fe1773c48a4ab2be47a0972ecc0575cb4ce55b5585df7c486677b46040aa1bf1e23a50daf5c9f7f31c6b709abaa6de6ad0b93b16f155b62b6082f6bdbb4209eafe2a4f4ba6ecb94da29a488597791b3f7798554b4bdcff8993d583db6cd7b6caf0e9f0db95c434f7bbc59bbaaf889c9b45b7711bf7b3e7717e57d41efdc8a1d42781d56bf2a08f10afdfcbb9f1fcc2157be8e728940ec7e2e6c13862f88c9cc0ba9aebf89b30e4c9a85a0355c61a6cf88c077658a85c42157ae4e277c35e4725ae4f708338d37735be478a745c75397e3e35deb74080bb55f2b7e37bb8864faead65ad5aa56b5aa55ad6a55abfaaaea55b5b26835e4ca133ff91ea7a0ee49213efe483622b72c30c9c9d673c55fee966559966561e7b2b544cd16c6309994c343e7dca1932b1ea90ec405dd4a39bef24e3cd4cbfd5fe32c3348a2f76da1b1a2327aad74cef83985d4169a93c619c2500c77c47c74402c11c259e77a2070d6224772331c8bbb730e57fa4af14ac8c23bdaddb8fcf3f63a42dc0e51bae7ad4f280cf061ddddba93bde3e5e9eaaba76032f1eec296b8b2f5286fc2d94b0967a521dc112182b88b7b757950c564e285549cb968bdada358f758c7ac5beb1d0b6743603ed15d56151673d19843b7856ecbd439f929a48856152d4846ceaacb2b24e525c8ceaa620a7e069de44abe9af138834e7295f268bd724672d03801c4e3ab945b17667a9d7b28a57a18ae08eb149349f9773c202ee8f8869e725b46b9d9cbfd4562e330a74bd643bd3c53ffe28c1e67d4d6c09965c119e933708e0a7e79c9a0bfd45a6b67f4eca57492a5b5d65aeb2783c918febc610ca8ef7cf00af6d0adf7522a3d3bc9832deedc7ae87e7e6087c064fbccfa75d0c564ec85a060cf21b6c495edddcd6786884eb93c617192fbf3cce5e4fe746ebd73cf75fd613157bd2d7764c6b210e47aeba1cbf6090ba9bf6e5d89ebafd677acef681bafeeca71225caccbeea19cea8ef66b67e3b63641db17ed52a8bbfb61cef2c1ba43dcaf694a7d25d9904bca09a19470ba1b7d6a5dcaae0b15c368596b755917cb93f6bb6a9224b151a224c2ead66c613ddab583305a8fe6cdbc992346ba6424c21aa344b9ac5be57ae33a1e44dc76d239cf94ea275d7a62ddb88d471c81254586115e588cf45cd6a519b3eecc1d2ca6ba2ecb0cfb041ba8ad2b73eb13c5626ea4362ebb498f2ac73458f700549dcbb61d6c2671ea4572e3f222b181db0643d24a9ea9afa4993c532fb9a9de20f5603168c871f60c336563d374341b377e620e18b6c1f8607dd3371063584c552fd265dd8772d50b6b724ea785adaf2a97751b56f0b96606bba341588cb4555555b731c7796c5682be101653e158065b2dac234f722af6a1ea41d791dc78b5711f13246fc9cd5bf270b07773635b975a8d22576fa5fae0ddac95ec0a368e09a5e82c4590e15b293a291b96c0cd18c3bebb2360c8c6db922e1eb4f9c2b62ebd08c9784f9e3c2cc6453258f7e418d873d2a51e83756ff31531678dee422e966031cf0bfb725e8efc0acbd59a8e942f5c16bc104318c0c0c48b0a3b8d85c625869c411b11b442ee472346e217bcd0852eb8b005234d07ccad8525466216a2915caf8a4e791ad0e686c98e224554701e287865a8e0854711505ec45d05f602e9786fb7dc11f5ed579fe489d8ec79fb3148049864544405e75104eb45808288cd9f67a41c4434216c0c3d104499af95e223e6033e12c44f8e12f311b3cd734e4fc6552b458cc9cf0628e6c3cad567081c9d18f31133ecd00e46a399228e24b9e36585f9f86703988f0fe86296b4a49c9694ceb22ed0bd9ea95f05d0800cef79bd016838e263ea634e003cafb5d60b746b5ea955945d584cad145bd7acae39af39dde59cbcae0b74adfceea7e188af17a51511ef2ea915117fdd190d473c0ead5ce063516b8620c3d88ae8ec1ce6035ea05b658fbc5c8a10144cca8e94b323a5eb58f7d34af1f4a6b4527ce7aab4523c7669b452ac6e33c59b8cd0002c315b11f1f356ad145f5dac95e23f1bf06021f0603edad3b940776679db23816b45c45bcc87e7025d99e5c7aa2e921b78e685870dec9a297e3ef602dd9825121b7717c98d7fac1b9f2817491115581e363ef3c2e3062803f57e5a11f1376cdcd64c28988ffe6c0005f361f3753f102fcc20e724087481eecb5186ec4c892ed0edfc4162e3d745326379d8f844b1718f8d1116230fabbc3335431b256de6152fe70c9cb151e2589d3d1907aece9c9907f2b51a0e287128b63ed0980f2b5bb14a1827684828e3151ff5f035945231a40283337006f401fb81fb019bab63b048975a84c11416ec3bc909512b227e84f9203527aa38cb327c0653b01879114d1192e1e7b3010ceb40865505820c631c412bc58b5e47a1ce7cab35e04bf69c746755446761790d7c0f106f11e242981ec45d8678c973947f44f7783e04b48136900bd8456e25ec510ebad91319f43a95f880566a1c05672b4bdc7b503e71b65203fbb8b875c9f3969fc8f3a0ef78a09b813ee37e5eebacf179872d8172cf12f6a07bee339a576a601f168370fbfcc7733dffcd400f996e4df7fc73d2ebbc1ae0b2c79abea351eee70716059ff4862d61ba070b31dd622143dc732210051381d9845b9784f86788875e7211dd2304beca3d380b02b72eb91c76c905672a7718038000e22d07a265b6786e0bca3fa0967be651fe01a2e52a2df7cca38070a6d222f27c7a700bc657c1f75c8c33973d9f1aff783e7756e51f957f4ec3f3f1d0b8e70abfcbffc42d7778c587e8f3a24f9c59b986901a67b9e82c35ce223a0bcb6bcc9b3d9167df0fb4791667347f0e6af9bc191198593ee328ff1da684e82c67c1598d3fabf1bffe2df17eedfdbca07f6e66f3e7f31d0f25fb7ce5f70aa9f114fb4f6cbbd4622d1652e3a2dfec8389c05c03b33cf41d8fc6b52cd973e8336ef6440efd588c0ac94926f2b2e823cc474a16bdce9881c58c2e924f526ee6728a2423e59e793946e4c28a9ec931443365d339e536a7dc29f24cf59363c827219b36754c0837db6cf28ebe56b059c47a5bb9a4177d6ab9412eac6065187dcaa4189c18583c97056b02c98d5ff7460d2cc6debdce99cf3d9e5f7d02dd83332270de3953850f863643ae67d0c609945f9f7b4a281f0cf3f51d6f62d69ce953c3cd7a3c9808a6c401ca28a38c3c577c609fc73011fc0198718379062671641399d372413cd3a59e291b26928b3eb52ebcb801a34f12cb264de2442ad80cda5ca725b08b3e6543ae3ca38d9db348adf5d69d3352e4ce5ba36ebc8333eb3315a760e7b3992ad2a5761895c2e6ea2e0be6eb3a6cd48d977ce3b67c67112cd7c094a087b706e66662ce151acac69c5216245b2ead541fefa7e1a8aff73a06e3a1cd43a1cc14b45c35cef514cfc8f51776a140b63e239e8752c809bb348fc406865cd874063147030aa534782cc6e5cab9c1c9dd6e96d8d6fef250d0264aa887931c23d376498668e455ed08e9852ba2be5b83c062220582c082dc58424409efd56c2bc5471db4870a35537c5f7ae1b2ce99f422f7adc010988f9be169098b89404ad80f93098b8133b73e4991abcf8a9b938e6198b018b9001396c4121b584c9531f1b04a99031b65e315ce865c3247e2481cd9c4c69d45dad43051e6d42a5f614ab4310c610c4348c065038b391a79a898d3a6a631c748eedfc0626295f76a94b479a67ed5270b3ed624918285978159489b879aa9b6c9fde2716031f0119b29972b9b5857e6481c1b9812d5e34956186224256c8c610863c8127ee21c5d22e507f30dec0512c1420446ea87238403b3d69217898dc30a0419dab8ae99e20180f9a8c2884ebad42f028b8938e644c15e5dea9cdc2f02a35bd8f66255f4e5eacc4f3181c062208635883ae9acac3aaf89753cd37e26ca9c734e5068b61b40474e212f8693a6d42e076154f76ef1faf030c9b04bf23b3ac618638c7109ae6231f041e73274afb12bc310928d310c810ca4f9972591e1bbe478b4ab4f0dc47befd9676a3a9cb3bea3dfaddb03f14a0fb5e399fa01ad04d3a71fafb0e534ee5f6fe835ee7d7541419c185535ee9ea304e3dc9b8459b092eef8d127980764cda6e52c4fc14fe3e38998039c109aa9cf816692988c13422bf539d04afd1a67dcb9bc8269dc15f7964fc183e5b2fc1e08cbefdd2f8db760297e1a97a2c55561b1165895834e7a2572ef941958e522b927ddfb06bd435771350ff5b71ca5c6abf75d92a623e54db3b5513c148df64e47b4d2e7ad9d608234cd4e8884b40ca6dc7b89e81c2db7812ea170396b4e9c106ce643912e0c33df3fe2e6e8d27c8d4b449be6218d4b9f699e6508ccc37a4c9906fb3e717b12b6198d01e13de7dc7bef3dd72743bf37df7b584e2105cc8161bcbb97a59bae3d834e1a9eef3d5bbaf5f9d644a1a39ce51d96db9e69e55295db9e894429a5209c914838fb4b17ce5e2c3c0426cfeaf2af7a500c2846b39942a82b3edc3d560b96d2397346a79439a3324608332af33a6332560b34bb57abb900336de79aedc92472a5d45a12e92f959600ad30317aca2790f2094c912463173d742b03e9c3645e03da143dc8d83b5e0feb1143afb2bd7631761a8e87851eaa7036054dc6309cd5832ea9e178ff5c9745f7cff42e4f3531cf47a2589c599c91487f294b8ab3971421d8a9929f0d4acf23d5c73b7d1f68c9eed92737cf0a13f1f0402286adfb79ba5db360080c0a165a98c110982a41a114e8923c540a0e510ab21685444ae2449bfad502a59f447aa23571492629cf49fbd361d1270be08c66cb257149da42b92c2cec923c81352717765231cabeff62afc3967bd67032b457a72913dcbb739436ea4edb33bc423820c58b771c7899ce9094527afa50286f5eaf6e7b1ee5cef950873ea31e8f07745b9baca753e71d72a17ce4dffdfcc062d8bafcfcc05ed87a95af845878c2e75e9d6221eef3ee13c7e769c945e580cb1de861d10ade761fee8589f64c118ba9139374563daaf79091b5c2644ad9274f8c095aafaa620eb0b018790b6bd768676232133fac47752963e5855d984c852f7655ec479114a4a076ae0beb11332beb6355576badd5e3b157552f0b8b994c5c98cccc181683823900ebb84ea7d3e9584b3fd73525cee05bc3513b1786c54c263c98cccc33068439a03d6c31998ffb7c3e9f4f6bdaf96032f3d53f588f9a27ae289787e60a5f16eb917de8fcb8fc286e4ebaaa874a63a873aebbdf753d88f9b8aa0a215c49a24d911b16537155fb61401a93990f92480ef0bc33016bab0a62f535b66bb453bfa3eb5f28545f61aed1d1ebf285c9a078de790a3e2b4c78deb905f2a92226f39113f3e19cc464eca4a13c2726e3a117bd0ef0bcf30a03d281a1329deaa257e67abd85f9b82a4ce6a2984c4a9ed81215b786a36232a17c5df4cab45c8f6149b45c5f5c19f9c22c142c86c9b85c6bc5da61ed591decc7b0c795911bb6c4e572c519915cadf8b088e04c56cf0abcccdbd111621fef2f019cc2ea3a04979f61fce4f9aaa1eae7b4de3cb8e7cd88c4dc5c19b9d3e9743a9d4ebd122083721419d05192c89fa334b123377be13d197df1c299e8b66692b7351c16ce68d54cf2a12b5fdd29f128bf4fc734d47e6d3aa7943142f85e63e17cc0f7ded79591a778ae6740243e954a1189176ca67e854eb00d5e9e22b95ee50c6cbd9503a651d7fb3b129044a3b05f2041daf4430696fe01b29ea874ad35b5452c9d1a11010000006314402028140c078462c180442cc9baf814800e8ea65a76521a2a498e534619460c2920020000000000000851de2194371f23b5d4780436c6d162a6808f0c5f22a5ec12efcb07bc765cd60b216612f4a8e7efb7db72a8adf378b8154861071d59546cd655ecc013546dea521369002b92b21f9e1e59880a312090fa13a78d10ff9de5b6a6667f85887cb43d5bcb1c94fc7f4ded8bae4d12a25cd531ecc0843c873947e75ad97a2fc74348cb7ca6b70624707a372864a30e4d4cd5988320a054b25c70cc1619bed109662c802c512799d9c6aff4d3c828147663124a3cd1a345f5703f73f60b94ff5bb131bed781155455d17006da196e2ef36621704b3e68e3576322d1c87e6f622eaa01f03efe89a4e6c6c7456072f919d10686a058796491fa073972adba3f56871eba531e30f759a4ec92ac465499646e655ebabed9a5e102f3e4d3026f69b13c014285dcbb780558514843cd92e0cb9c64661992055b651a6dcf209d0a0489394c6b69ee6db969e85a590f57ac2b89ea9bdd8566204c05496b40c65c3d362d8f36af095945d820c25ef27c38e1aebeeabde7d08a538bd2aee1ce2395628ef1a5e668a41b14f3afdd72a03b183781729b56090410dfcc65f6122d583a733fc84b421372a4c308cec2d602a22e4406cfc95a8ce62423147693f9541dc5a8d360aea391a79bef03b12cedd32b4266ce7c2c147b7bf71d191fc8eaa0af4267afbc5c534ef123a4ee9753103a7a869a258f547ccbb62d1d3f046c6294fd6168db6a59bbc0d7040266230e24cee273ebb7570e29e36585f93d6eb8258da5da4d0c6c612e28461110a3228f49070f72fd49057ccb570b9908d5edb92699440ba61de48457dbebf392a994c09ff172502a28c1109c26ffd1a1b0d5d3f70b0a1533fc0f0820e3906caf3bf2ce59b59fbe489239359ec7a12efdb2f8a659406f96a43544cb54d1764867c2715f9f8c025304c937824ce3996a891211371894ebd5d410bc397c9699a3747a022432d894f819052ceb318b6d4704c76dd8899fbb9cd360d6c2609f79cca86cdc466648dc2b8e257fb8e7dfeb390660cdc6094104c28bf515191b1835dd4e8846106c81c7ef67ac24e4b3a0df6dc2ba687314367c248a9d573475ee7e7a3feb44bb173acf91c11d5f2d9e20aab09f0ee2ce0002ca9034f003f8eaa5a4ca20abf6a432c37ce29ed5be0eaefa21977b812d9f565b145bb38e565f04d882eb0d6aa2aecec1893a6d28d8ca3390cdd41ac090d4f6835ce447c92cacab1425eba4f0d1fe3fde39a1bbcac991f0334e8ed8e35b0b825326b17701712e4cc41e5cb869b767889fdcc6ac65ca3758c0ac1cfe547d05567c873bc329b418c81f9e7e92d9d789baf065079ad83de1ca7d09f47fcbddbe661bb1478788fcb67f050d40475737ec2894b1846582a197351fc20ccdd37a597dbef3f9573951f9722b21926b3da757a1afd656944cc5e605f793714906d0e81d7782f3325c0de9ffe2931b9e19755b806a09efe2a589f6756de131c036661c1d9f02f691f77ca08a8f5edc3fd4da94011a1c4321cb77d9c7a576bca85494991ad6b9837469124e00731efdbb5042d6f168a2c5de42a56b1e1101fb60173d62026aebb49bb70386ae763f63a7ca60dbb945a4d68fc6d73b970766f66667fd84147a6710866e0af0f9d7a8635520e7e99b4028550881e85f029c0714d33df77d06280b47e3ec12b82bb099646c9e8f5e845d54ff5ddf943d00405bac6c97a052cbdadfbef133bfd16f166047ffb5ea492878a1f82dccf01dc2d5e16a3a1c2006ae0bf2b9f01dc4e96ebd5530365c12bfdcd57b1f38759fbbb85e9d11bebc0fb0fb8f50d5e4eee64789de7352aeb4a75747604247ef88aeb2138d5b04ea7ffc768bb39c0df725128c82e26de6c19a85a9bebe383805c7375829e855b09718daf6b0db4adfd5fe5c90a718bfb4bbc900a5d11aa22e35c662e84bfb1823215c2dfbfea82283a5a3d54c1c142d6356b23f444f3330c3965a0cb845ffcd37a5d0e3e673cda31f699d213ca1cd3ab16ce2db90c6c1f433e0f20876390a4dc43a997700bc406dd069a7f86aca1bde3134832229a1acdbc9954037e3b954d541ac5d77a4bb5e9f53a23d703b648de5bddf0528c188f59c197cce3d7756fb9e15221a73e26accc1d2721e1f10ad2d318601dfa4e8309e2a2e9b25c742219a3dc0790a1799806b66badd4c7ef72ab222ba4e36883617c06fbe562211ba365fadbb86444c9ba820bbf66a5f1158f71a3278af53d2e7b770b01f54eb1cf3119b5743708430ba727fa584d8c84dcaca7bfddaef101c1cd52efca7e5470d7af06bcaecab4e704afb860688ff50ea92d4ebcbdf306571be00c8fe6b85936862a37a291c856d142e2aa5a598693d9cf97c044c69ca7c962a080b0dac5961c5114fb253f0c00627e047ca327a92220af97ad6dc65af6ea3f5fc4e0fd7997d2150227f145d24505742124eb23ae15b04ad99edb1cb5659465f4720459a2e811450ce97e43c9c2202ad6999ecbe77f52241bca81d26083d1cd6719fcf1b828b124d56277be48344751f362a679b94876967d53061be6542bbf4da5f7ec3ad672e737f95a7bc879be33e4a0f6d8ce100f3a4c8df30fb72fa7532cc885a10f2c5ee87e95000219b23756dc09a4e057d405a3ee64ff4edd8b1e3cb855e7269714b5e149e18de5efe47bb4942b06fe9f37449e54b1b0dcc3606bcd6a6dc0ed1b71808be88264842d12cfe75c52f695da43ce1953f6bc64aa671ab4e4ef6880d78f75748fe100e597dc936a2a6b05770247a550719b4f1cb5d09928e4e7fbf19e8c290a73ef3e6f432bf15d954a007f6d72afc1c9720f9622142163bb2a4931e3025c39c34aa414a2cb8139ebd0a39d0c0dc71387ab46a6abafd3cd9bab30409b7bf88da84241f0effa3d43cb5071ce060aee1ef6c5cb12396e181c7fe0e8de62876e15bef6ec7e41a3d5052e2422292e59957e90a2ea55341f7127103b2ad192d8bbe651a083ac113e770a1f8e1d771d4a05fb81998fea4e61d04a193385a71f78a3a6eb4ba771af4599c990cb272934c941eb358af46d7e762a5cefc40c59733550a61601663fa5649da88b6a0f85c7a191a0ffce68153607c08a469098bc9c50408af2a7625ea47582cd1d41c816db1e183a0e1b33e00142688012fdf460f119c10e4aa72eaa31470d32d56eaa70ff5bda1ada2fbba3406db9188f66c3d1be535a9c43d0268162d663b400a7c1801583f68889106e104dd5429e7a1e2e58becdd0c6763fdbb39e838ad31e3f19593414b97303e429a16e6e329ccd22e89065f7ccfcc6c09cb4600b97a2dbfe7ab64dc3d0670509022a0cecf4babf8788e9160d8accf2e2f0f78c01258188f7c1012a7f265a517e30cfe4d1f53e460f03887db567122ee71d8526c91412797537327df7e02e3e31e469a30f22047b97258c48c7576bc25038e93d18068d119e8668430db00d2712d189589ea73973485327b94f5036bc8cd5cc804d01f042abeeee678e0231236e047a5ccbaff67ca894191c03567e7e6516ffe15434b238ee98ed6e6a6927c18d0a581dc3460f64564a4a7e08fcb0f0c9e84132b3e9f06ccc6fa57232906e91e463cd4270f9e9e8ad56cf81e341ebcbc2b8862063064ac309b10d695e6a9b64d31712b6c4a7444add06714f06ecfb0ca6e539f668dabb5482a0757f939245f8a6ff1a4c02e73cf3e1a4e20f7a506e32e8ed22bf96630bc3c4f62332b65f5802b4f0c22c92f5d811b9ac4422c2c5fce8caec81e4a23f641d4971973b516d024514db27bc24b9afcf512d489118ae1910057e4329cbd52493f33f47a92490d9b396a265d9e3443a7df3f08240afd30ad3983a18d6bb656104f3025b9d84aa495c62a793fe0c86cb4facd362bdd130a7bc4cbd3b24f1f75655c2da6618073c87a1b8245ebbe4697d5cf4a937ff3efc013f128862ba818a3ca40a908506d177ac652a1ee1f4563bd7c41aea60cc5b153fca1407fac22314a466a2ab85cbfe2b407d23def16a8a0ca6d6b4becfc5dba54cb7ef71c3d5d1c2cc31568cc8ac91c1b826177a3dd5f906765f0cc2dd7570aab3018ab2e3fa4d27c62f83728f1d75a302126ba3697d1f134dd5865f2931959b9b014567221a359e8e1e9f5f945e8d5fa5d4194f8c01a91747a541ed890fa65f63aa0bdaf6078840e441dec6922b53971502b9a3c406691304dc552a4e5dffc2ac53f8ec7ea203a6d9b55bc265dc7a7e2f0843060c076f84d5dd9cf6ec87424b0321b5a84dc4f17b6a26a8f062dae7b3965a0aec0cca80fcc8bee634ea9aa06678b4280c4f28c2bc4c9b0e9aba7e61159f144b6050ff90ff178b98d0c819dd5eb6cc5544cb3a817fcb38e40321699464d5b823b55d2473ef13bf8da3c26981518b1d66af02dd00d3a17e3d5bea1187446ab6802c3ccb1722ad1a4918a76b07b8cfa5a4cad4ad5b6d2e46535d48559431f61cbb8a1a62605a7645961337991d294337c2ec83a60188b531a2d7e9205e3b1f0237fa48deec21c6ac1d3e41e9195283206175a8018b6dee25303020bcc9c50b7dd7f7cfd3159ff3dfe7b5357b9cb666ea8b0f788a443219108cec9d6391a0eb27fd10314f5ac6a886801efaf6c907aa1a8a67a63accfa54ddcb12f3f540435d762b1b003957492423d982d0a1522150699dead2223920cecf94d636fd4db7e559e2ac07119568e7b617b313d2822957a3868692f59d6a1a0676dc71b169965fcdaa09ace9df6eb69669ef58655a925f603ec2c49f57d10dcdc31789549bea7a1e2198d4c013e9c8a2671c5327fbf4848de1eb716288e0cd60d91567cd57260ee4a3efc3ec0eb028ad3bf5fb1f6ed82a103012a7387ae517607ae1aa2ba964655b34323a9041063561d221a5b133bec75e71a9a544a5da089726db14cfc377a127ac3c4d3b985c9306b13db83c3962eb3b258c089d16f3c6edec9c7ac54dc9ba088005fef3f227b211a0821f510522dbaa38ff1f7370b2745ecdac5a39f60054548df71fa751a7a68b0dd6465c589192378d412d1222b5a4860894d68512f1244d9c707517ff40bc87acb64ace10e5393db9b814ed0e3b270900c8335a0c1e1fc1654c00be5f8471e09843171929b25cdbdbeb079bd8a4b2f3db27e8ebbec1beed62ea4876ebc91ec52ca8e773b6db21131910c1c226870fe911a1d35a3ee9390444434a42d77bef9b691cc7572b0acc140afdc20b1dfd01edbb9eea3106dad2047620d8daace8ec920882ab60fb1fcf9766f9b99b96a1b7344465ffe9efaa7e9946a232ff9e3e8066016bb99fc7dcc42c7bb1fdcc7f061a4c86536fce07b62fd0ab796555ebf6bddbb2f6e5630e3357c7eaf156e1b133ce017effb70c0cca6b98bc5d1577cc6527d73eb157b7199fd59da733e1be95eea129a31a5659a60e9e1e5a125c3df6ae290b9e3e97c33a3aae865f442965ca0db5bad708e9c4ff61e65d181652a2498ebe2d773cb4f4a4920f81686e18552f2f01ec606521f89382f0d5edab366af5d6d785616670616320242ad16eaaf360b28db0b708d4b3b1a574d65f1b14e9b67fe3297720e763a3d1d511fa2f1bf035040ee46c183975ed828450487d98c94aa929d5eaf0558088a26330f8b46a4fbefe207fbabdb8defd66df2ddc91928cadf1062652abcad84eb9355a8e41df39130f5ea963901975df6e845e08d24a8b20ef6d5b9a3070ba6e7193d29c242d4640cce058ae6bcedcece858e5f2e604274b1d5d484da9727a96e698cef30fa6bb1b458be643e3b94592cfb0f767b78cb686fad5233d97aaebd2a4708c980e3cbf4d0316f9f7e2daa23ed703aac192530ef1ae27469dd8f5109733aa2805acfe27f6387844159f08128c67667626b3c58b6b352814771847334978075d75a75d371db7c9d3047862dd59707d3bb0d3f13b2d69c1631b2bc50f555afe5030895aaf50e6f141bdd08361dfa05a0888be88e4a48a216601bddb3d633eff49a800d6acf69703f114f5e6b5192684148d7365cbcfeffbde0c590ba6ea1c2ded590a3d0ae629051f0d865ba612e78cb716a5fec391cfe8109969efb9b83aab5664372460d6a167dcfa0856650a4223d615f287ef653184955465738d0d32f462602adc4ed0b9dec85e361086b6855f58f1ed1824432b440970580a75fde8a909b29179c4088f7ae3dd517c913a8a2bf75c080dc468e79dff1dbe2c43e3781ea50ea8281858f94ef83c30fd5f8aacc132d48a0728371006466139510ead79b97cb4e72a3c43717da0dd74d9f9004d3612b2e5ec29e0af949ad06e0d3a7f63b2a4b583ba5cbd6358f3c4c10ff264d8223cc62a7232d98877fad9f8b220cbdd498629e2d54ac7a901777288bf2c990958a7fc0620c46458b742c6a54982ad195315cb83867ee37fc3f857ef1b1bceb93b7da146c4d446e20322a5bb4f0007148775544a0a30ac278a91a9159779ae49169d68a00baed911636e23ac1bd2ca66641945589bd71f664c700680b28e20ae0add2417a9549ff377f68efa193860caf96940ac78d79b1fa0821dcb8ab27da7b1bb480fdd037dadb35b010652925544bcf75c4c2694988afa7ffcf05a1848351483dc524d277f85bb3d240500e025923fd92e1e09810069899cbfe219a029b0901c5c443520532ade5795ea2bb78dc3060e7b42d2697eaeb679c6be9de52022947239eefb6afee81b9e426dd156e78e4585ffa798706aed36fad455298a21febab8dbed59cc27717a5fc586a2c0a400217206ec33a18f1e6b262aeff1f390d2ed2597d0c03d9ff9ceb275133fe79b459842a6f8bf1cd803f4ce789dbc895a0157a958ead98e48fa02d3d7aec87f688d7c473e7c7e012c0823c1e73eef5e67e3f4828d879b8bb3c58185de9630ba2a643612e1e15c6b2e2f594a79d40bb81c0fc7bb489b937403cfd0962fd85a326b11ed12b796022d85cfeca66438e07de25e20df4b32491b337169ad23d28b25bd0e44f2fe0af99a75ee3a9168e6a1bc60ba3d9d5b234442a879bdfd718ea3adad84c5db32956416261ffc711c077c0ec0c0841622d78963a7a98dffe8fa433f52ac0da25d5da7f54e28d48f0b6ff6e8252fe524e48ecad831f51e917f25ba06e3168babdd7236afbcb6976ccae227d41bf93ffa32b5c4b7670f18ca05c1415381ed746d8733c0cfdcfb66cf41cebc17f0fe9578e42b013e53f2a20e041f8938b0fe8a2fb557e0738c87e78ce817c16a36533c045d23fc8f7da70fffd2e70fee1e4fc3bdeb3ebc4ca541c896ee9e5bd298b58ecc575c14d80104ad83e23f7f822ac290a80a5cadd44981ce84e9dffd2fc002689b1093fb2a08663a3cd3c7fe8fed5f1dc844ca668a33296e4a390c3063700e3cb9d4acd8006c7c80e258c473d440bb6e3064f12a12a6d37e85817988d3a20f75731dcb888c0faabe52f9c45360f329e89b79cdd8fef31bb257e5ae2509fe75d3d00e8514da646c823869d6b8b5fc129846231275783e4b9c3b10c7a31d8f863988ee18a8c14eb1302db7b6bfdb2c96dd0df523e0067f7125c009e121ccace4653f65808d623fba920e7bcb3ea26afd4ab833f6ba56d79871ec3fe4cc4a76447e7a3e9d2f79706db5e55e76af8aaa88e16552ae2d5c3c31b3a025706c42b9d159aa260a47dc5eff9c014ea71d41fa1c7cd123fdd3300b1c9226a4564e6fc50957d4a4601a6c82a6700c8c13000616e50c9bd5b3ce60c49095a280bd0a22c8e760dfac6ec923081ac8a3dd14febba90091d8072ca3eb63e38819f2a871e9504a69e000430995e25e0a31824c6e9498c65d69a174c9b2ce7e76b15b73ec0729ae527415fdf48efb21b2283da80750cb76d164c17512700bb100a34e422b9984a3dbff4e8db7eddaf60fdf7c942e38dbb12fd10d8d5ec418270509d93a2bfa0f6bfd6790e8acb4124ad05837c18d0604fcae7d746d845cabed91eb439dbe25c8cd606b9dde81ac34da45c99c0923b79088c4ad4be9fd5e0c5d3c87cb26482b8a78394aa5ac1f7f50e6e10071f9514387a2f2c5cf56ea56f0e1497f02192aee71e3ab8304d3a200c4b9d56bfb9ae22e3803ea42966190b4fcabb59b70977d4cbb3627b2e8d54dee96546a7fbf05cb55fbd099a89932f05518ec9150b5c7399e0775dde9a7d2420077fe1d43d9e50021a195ba9e66031a066bfe8935057160fd20dbbefbab4e9654488402da67c603651946dcd4f536f53b9805e4170a1a47884f863b10816334fbdb5d7e762e62b1d72bc9660f02d02ceaa5110103610349550e9687445e9b1b98126dcc8a32429f796617fa1e1c7aede1fcb6af09f48e2af0ebc917d2ad018eba8e66afda236b31ca5de69aa84066827abd9a3264bad0b58067029c90a2a8d8a5a85a6d2616f097bc0e41b120208f32807e529575a48bf3e0054a3a94231503dbedce67a1a9cfb7fff1fa2d858b2cac2804c0b4edbabfc9b0a58978e9f6930fe0d54890e1006a748927db72c2e64d36374925c4766efa9eae39541243e0142af94d518067fec00b9f34e915be4933e31bff57dddc34265773a3e38c90a43b35aa6867446d530e0dfafe0cd02948b618a81f20b3583ab185a30f56f577c2e8d9c5bb7c5ffdee48851413e6aca587174216044fd6fa0ae81e7811f0c9f912b92be9656158e24bf8911cc54b8b8b618d8808d4266674860211855662fc917967416a906bc9c307825f3fd21c6c182611844f91bd28b01ea455bab788d9df682d310f931c89ce472bd835c768a549418f52b3839c85d816e4e9c410b51fdc3831fee80031ce0607d972fdb90a219e0e8b5e0db77a3bae93f072bb507fe11217eef4a056c3cdb1030a7078de237f4fe6f5ddfe552305bbb9ccc8b560a8af5f46a620d125cd9e013348136614bb3046ca61e3067dda4816201398d849ec6a85e5f4567bd347c62016191ab1379f01478d80d56c0b13c1b5f8674a81b5e6d9ebaec36bb0a55ba635e27180324573e6c233291895fb0676e0b1564fe0734a54fb66556f7f4219e3b980738da0fb60e635365177a2f0f111b21022c4b5d203affe0cd866bc80bd22a149dc5e171b88ee9202ff3bc582fdf299387507c01970bb7104dc506ad5b3a3434a02851f8427a38b00c74b5404762003c5b92ac88bcc45b9dd290a440d319a5f0f89d69017d924dde140c19a78e52f0757853ba2ba19b2bbe39ae18650deaee60a6b7b5c0fb45837a18d504ffa791e5c0a587336c17e685ff0e2dfe5460abdaa36fccec2181c1887c251ae374a5ff444328942a4dc0b565772fb1dfcc4fe32c11d4593e7e6cffc6b5ae27cc26da2c4fc686745436de886c261c374c62bef6af5b3e8d00b3db95349c95dfcd1f331001a049d5d8b1b1ed9c63baa5a8822f710f01fe173429d0d03802213058aad21301bc860877244f41066bdbaa4ad2e39a4b902f7e3a0a523fbb780b880ff07a0db03e9052abc496e5f1c8191cb00258be6e5c245fce75b4be094da92da707ae71ddccd20a4c71e2f599a8084a75438bc45061e2370cb66946ee3aca269f32b2fd1ce998f447e0f19436b722593246080edd0c2810a81fb5b3d7f1e7b93eb1c3055e5f33d611e95e9e6f8f6e2e4a6959a19d28acc6e562d02aa447749722d7d75ef561e0ebc096679b718b52d4ec85b8379f0ec2157514054d2d453a23e819dcdef478fb981d49b2788116eed546f8653ec53abc08bb3b3a25b8f74d3805c60e6529600015c755abef5e6eee41bafa4a78ea02ea5972550b32af3336001310b9938b1558995e18a99f2cbfccccf2ab29e14c02b9c56da1aa7fce175370d1bb5e6221ae2b242faee38e2e62c4244ef869c9fb3c7b55eda0880c2c61323c94ecb3eaad463ab1d1340d23b9a0405e407ef41218c00220361d56f304792d06dd79e6915535b2888e417845e9bc743585be624df1bb92de463206cf98ee2ef8b26384911bdb7d92ce40cd767162072152d23f1f7fd9a614dfd4899a85ef7408addc6fef4f080620d5f18b0e5f638a979ca2f0e69c777f426ab6a17287f0e6fac2446c43e94089207b98b2365b3b80202f1007ad2b8f8f3a7f4edc2ae0c87bb776d9e2caba6f884fe79dc70e0ac3e721818fdb1aceae3daa26d79f7a5eae2af675a05e6dcb41e7ce5b51fa6295361421cfaba4d5df1463a9bb6a5945bc30a1c2c760b83f9bffb3b97934bc4b313bfea14121a9462d4ed2e13fb2d740309f6c56935dde33eb7312d42ae894b7b10222115bef7b7e92a3ab2396e60e62bada8ac09f5aa4ec404185c1b016df237bb95a2a9af1b11ef49292322beac60e579bf9aad239c2dd121991101b5d2538873fc8b5e307394e4acccca6008f32c84539ff4944a34adc96bd8aadc631228de25c04ddfd3149ece819803b4d791ac3376e0bdfad57ecf8fc7666f1c3c7c422b3db4696cacbe779268276ce2e086e250ed4cdca4a8ad2d1de37a47c5cea70a7d2786db20ed2bd056738f878c791811208363b045f30b2f5fb7eb7d005d3abdfab3afe177865b4a85feb772da3568ba57e798aeda2a125c663bf52526c398c597ef8d9aae6bcd8ba8addf070e7831483879d54339ae2b24a9a89b21ff1ffd01233be7726c219ccfd76318e949990ec41a695ed9b569ac6ca6d4765a936e15846d6304a1abd234ed2301a06cc633fed59e7396e940e077b95844c334bb2b4d1bb6f45c51d5c8cebc774ca6cfbfb3d7ed56aef70de671ccd77ab4074118fda5f31c4b1fb08e23f98306ddb5ab27fc37ade21ead73a39c0c4701c2e882d0a9c6e4de177029167fe5651e2887a42db80685f9152c616aee6b5ad8fad25111fc02e94f5f882773a9d0a3a80b3521e2581f67b298a8390f23b9e8ee10cc68e378af09362d75084eb9fcf194bb7add6d6ffa2d1f950830b122c76575b8f4434233827791b218d4fad0cf90d49273c3dc4fe9e46cbdce2b9d3cdafac6a2b078f2cb99aaf1925586224bae8e980cf3a622462671c7e0eca3a506ef68efe90d1a75466fc7714b346b51d2f30cc282489b0bf4504bcc26d494b202f6d72707c9332b81afa7773c8e5b1f8b81b97ac08d800fb07765095828ecc1cca8b1b3575ebd5a48f8c08c8a3df87ce0f427626f12b291aeff20d5abfdfabf00aacf39a257cef35706194c59c9072c3a2ac15aef27e9534dd0decee267600b5682cd2a5c0949e7c1ae4f74f0a6a13392f45f27aaac0a040e7c893bc59ea6036e8f3ccc845a77aa34f8330033dd70bf15386db2763032dd4a9888e4871cc7e5c0fbb652d304f9a2d857f734bd85bc005f669e30203c9cbd5957d0c62e0cfbf843f248d7abd8953f27bc7880f342c8ad761ab5d6168f686e2fdd9c2620f4cd07b0745f840d8f131ee027b73e3d8b5e9fa79e4e3e285ef19478a2ea32a2f6850443dfabd0ce77d6f7a986d5b3da54bb5fe13453704e8a38bb43489ed833190365c26f2375134b57aad444ff5a957fae6e9ce295214dca5cc9a6f5dfc61f98aa335b92ccfa990d6120ace76927163666c5b5040af6c19cbc7e0304b9c79a21d30df7e4143e36390f555e4ba11c27e9c5cd26d99e275284bb0d7c6c718e80e45e1406ed1783b1d90edb4309c1657f22a8df67fcdd3d3a74ee2f5f2abee1d25e63921319ffa1f39d58a7f0850effc751f1e923f238b06bdabef3d700b272c33fc953873ce45fd8fa60d2112d3960923057e09555936fd8aaf6fccb5324f94842dd8324d949377ae2c72fbab454b9f9455a6909821c099adc5491f690a573fc5f809d2c8aa49b6e467978b036ef7e2d88b3469d2596c11deddf16095a952818aca978b9c215f6bd52144e4827e90da98cd61f7c3745a8cbc3237230c4589250ba32c7b07ecf88ecf5a082df990ec4d9122ea8bc146f6902f5ed2cdfd4cbcae8ccfcffca083f77d4e1e4963bb3ed7caf2cf67d1acb7757c6eb94fd2eb7db7cfb4e60446d0e03db014abaf90694dfa56dbe561b6477f41b298c55c126deeb3a65409e3ad576b132f8ec823d268d942186aba7736dac5c2991f076b2e92af265f821f670bfbb2232e2471651581f23e419719402d86e49540c3733f0b479ee944e4a95a37656e60353672720b201cb973b22dd868d169af23d18657d0ea580f2e316dd4bca7d122f15ae28832ef09fd4b36b8462bb08368dbcffd9e702c561890dd989a980cc3c2b25e4eecf4ab80bc9031cbd00e2666fda5d61fd30ebfef9c2cb0657c67830714fe5ba7ec0eedcbf4aba0ee5b836557ec18ce1d4c6150941369d257c07401cb1e015985de76ac5f5391b3607f257dbe5d8d83847e735d00670dbc5986a0c4cf224c7dff16c4185453ce00b432e6e94d418499a3c6baf5156e2af7ece1fab1ed72fe7e421584ee657a9036274209d72f054bb4e117bb23986e136e9fc6adcc4444d59fc671301d04cb4d301e82fd29d85c82c9192cbab5c6c23ffb0e3e04b549836a1b78d50b70fccf656decf6f54159157149f537a135d64badb1d0d04b716122fad6d8cc5ca62c2922958146c55d4d7de85d7bb832a1c40da36d488481b233a4cc7a9f6524ae1dcaab2aca144d2aa9489bce2e4599c43ad558da4dd530efb0ebaab13c041d04ac0998b17c52cb4073d131d9b91aab19d0d249a6aaf655d259a76d7334b1c7007fb839c2bc64d0d1f96342ac283ad55889a2953ae8dd23c7004bb88a0a0632ad49b383b5061ef46a4daf8c95876b61bfa2f1f5af635e2e32cf8943a41a8b3f7d409e2b76f13bdb94053215900361d66eb455daa8c632b5aaae67d3c0f313118b97d89d48a51dbdf39dd70b8f2e8e819af3421fd3f65be2ce49554d55221112d1d931eb974bf6a2e30872acc3f49a2f8df0a41635233a8bd9c62e07260bd834d19a7fd0e69196cb3b8dd98c499a26bb37ed7d9962403a7ad9dee8be079badf441844d6f56d6731c534a2abd9e061be9a0927ecdad0b7449827c47814fd961de3859665e5e592ed305d44e6d8f63949619a9b76ba3e3e9a5221dab4ea1e65aa98d671a7e09cacfb64c901a40e9512daeabd0c8fee1fce665cb95df8ec8cc5e77f287c272df2c1cd6f25251be5e0616efe58dc5eb1a81775b1bc813007a0c8be20c917fc743fb98e1f7a4e438fc078cce50e76f8591f98e59e183535355d94fb88ec1c152e8885bd0d9d8fbc00fd5ab46c17c0d1ba08c064b7042a5b85c747ab561f2949b1b6c7d7b7263ad669486bf7ce46bdd1d844cf6cfe018ff5278460b474d5b2cb05134b746fc2c1845bb1fcc6cea310d614651e9938ba09d1cb40cc0e595471b6c58a10f92e33ead0f8f9d283a429513898f588153048c5c53ce25a06d41716b8c4d85be1ce30aa4539d269e1ff03ac5fb04647d37fe6725bcc94e778440a5236e906507f181ed97c3e79cd2b5683f9e491769bc5e53b845170c4d5faf3d3349d5f33c1eb06a33f9099ff85fe7b65b1ac4f4b919c5c407ba42f7660b76bae4ea775cedcecb56841cd2109fe580449502d07b22401e275a42d4154ff403f3d232c8dba6b97b4f737476575044eefb9181772d3d097cb19206ead53b8a603c28d34ee69c9081831ee31d07ba08467cc970b18736543336aefc9e7958ecb4dcf2dcf7bbeac9808841ad25bb9b7aa938e45c60ffefa1cf16c7624a00d2ebe466240fd8bdcb5dd1aadc38b32a6c9eec84a13cc698877688221deacd5b7107be3da46b3d5f852a59b6083a4e1084d36ab5d418948b6a7ae3c528dd37d71c96fb0c3ac326e10ec511a3440154c842c97dcd128adcc0d242ee37f3e364b739041fd792c0eeb130ba2796e5de91c43da6f8f6047bdbfba0c5339c52e210fd59dfcf9c634d3057d08bcc4b53b776d102eef416967b734946ec40c4b3c17d47e1570db754b2265836705f9d6886b1822d2b4d4f5051d996269875e1ff10b41c18ed79129d341394a7f05c1f8c38b024dcfc25828054c050416eba21f439d8c812c96cb18c703320b1848788e16632e060471479e910a08681de55a37f0dc05ebbf6fd748af4c543a203bee7add07bf72f478c03f752bf070da493cf895be1a3c88c98b1755ab9b5e0ea354213e1a8620ae58250797382bfbf443219004858e797785d0c68b9e7aa572b8ebdfe9263f1f3477ff1bce2c10742cc1e34bafd6b99586993cf2db4190beb6caea173d959bc108b8f8f4217bf1472cfa97030be69155588f903a9c0dc9427df474ee0776bf3ab1e178757ff7d2995110c1bfc8e1e39607c5b3e92edf066b8c59470fde914a368ef391d6619c812c16928abb6d9024d9ff1017e75513ee5355097ed24387115c9cb6b9b5ba7bf07df315d88cf92ce112d61d682c3e375a8813ced69ef66fc84750bc236121cc496a2ea5a14f9fc1874957fbd3ae5756ae8af039439a0f76495575504346625d0153c1fc97ba054db8aef47da8f005eadc804ed8ccbebce98c2ab5301f494a520a257c1bc553a1ed706ad40a125630b817a6c13914731d96bbec3643ffa0e26e9f357cab62bb9101f0f68d6a9e6c98bb636b95c4f05e4891889c1be012bb8c2768d657c65cb7f1ca9aa0d2462545baa52feb8b3769035ff942d38a58a7999a452503dd2d6a7d4e5cbaaa8fb61f53dc4d5685df37df370c3ded986ab89999939ad0a5dc59686f0c31eed99722f987e96edf1b3ad469b35330ce119943433597395b688326af61b1855cc57fe10c13c60a5b9c19173dcfa813c68680d9409b058b94e6068c720d4a8c78255a57b6b0701f4526c562d9c73e943aa9e89b574b6546a76abe3a6c2f8b8626414f2d554d37163f34b4f2d259e3355179ff1f64b0a4d3bc724085209b248183c21f06aa50cdef104a9dff4bc9143fb500cd7571298c65d1db2f758838d44a70f8a3c60c2ee3a155668ce62e0789b071cfa272139ee3e4eb046eab628464b9f2e8c3f8658ba3b06baeaad3af68c9417a871e88d4f1534144e8cc674755acd06ee88abc8fba8d9210f03ec8589d14adb4803cb819e5d04173ff1c81039e724697b1814b9ebf79889b132d45ea6232656ca30cc7eaf38f1a1cabb6b8964be30afedf1db0cd56d13f515e5bdd6fe82b971439b70d4481a39d71f6a8f7f2de635059f0b45ea5287a804648e9b6b1394c92b2ce1c3bbda6b79ad24ef38eecaeb98312ef573e8cd1dcfa63ef20f33ad97eafaf457f6618bd3df193d9ec7690728b5036b5cd4c497ea01837a5e8730b7f4b4bd21a6b6b9c5b085f0e72854171c7b4a0e6d011d5f4e59c0a9e17d5d1fe39038cc35eaffbac5442b2730a839296c66097ef21d372edb5682906100eb9b846d2851d773ca32520175a444abde2ab5707576ab05f7dbdf745c53559f2d566ebaea43e0fa4a90e45fc90cfd2dc06399eec287a3e7645211ac4c221000ebc0647300fcd411b24b182caa20d968142c2a00b2051c4e75005938008ed1620de8b0d50c412072664605746f633827dfa51745930793c0dd92310b3ae877cc6f573c4ce0b6ca8582cdc1776ce3b7dc38d26746bca82912d787b6d28c60e230b2c3aba63081777129f07002470be13aa72f9298a035323508d29f1e40ad84e659b9ee4fae338e17b261dd501a13bab3624fa5fa2f1b73dc43a6ad19d6793078bd2460745939cba76b6ce6266a1162c224b6cadabd41eb5be7aa511e9b285544ae5107141e33290dd08a565eafe455170aba68a45464eba53fcaabfa13ff27758a03b47baf441a387ca9a9e3073e389951ba7aaa30c84311e49fce080c85285117f9f602db74d9d43bf15e58b013043620fe7f50faf7da0d06fd21e8c441e8546d2685beecc22c612a0b3933513c46134227931afc21418d9749efd71818912782319c3386be54fdc08811b3c07887dcd366611dd299862f4764fb9f752d6e4b67b2a5371b6e45352a163364c542265409468ddeeb5c21a6085cb42212c9f79069b650e64a726d6769752385a08886c9c8fa272013f24a5e3a06964e94270cff0c87dc102645ca9d8355c4d212651cdc19d3bc5462c1eb5b05215f7555af0ed840c3683e79eda005baf0014a3a632c321406161ff62a09afc6c63f2351d50eb78a4353d656e8bf2aca4d3feda4b63d08fa0b919c5f9b56a79d2cc91c3407cf2bd65c3a175d31826e35c3d4cb541a5624880a0cd10df46228732f19e5fb3d9cb745a85828f979e90a3791885a91f379bee598b2bcf016cc9c3d45e0b8fe1097a1c25d840a428fea2ef69b2eda457f6592109f101e41156032e8d5ac4b08e1eeb6e5983ae5827c2b815ec3f1a3ea165ec9e4d9cddbb0b34511bb25985700592003ca1e0e7808d4c4a3221f953aa513deb67920d3e752387702d2ef58fb863d63a0ce8da9097578e598eff6a8055afe0a402baca703defc06c505019ee87f8a11355502669eab5c0babb00729827129840a6549a2c28d5017aef0473e1f70a0d7cd817c8303a6ddce54aa9258254c784aa9ac2050b10035e31267bcb329a23a10e282560aecb16564ac0cb59ff81c3530bc6c27effbf458b38dfff14fc7ca9e027e43251d0aab6a11360e53ad0a1576fb0c3c925bba21da19f8ac8548ee135575b2b62f1480d896b95fdc82819205980913648858de4a17ce29d1c96550b5df2288fe0db357e5ed46e7e30f819ba2413123fb9a26f68cb1bbb0e6624d622cd743825a07f7480ef0057a6d74467bbc84d28856157a41c6bbc8e9cce8d6f35e227eaeb36d4f7af2e04cf7763a442382f065f12ace475422cd850c3f9160ca7e40c2c52a3507b707d0259407d71f6a54a3483ec6de60fa231619c4a682511314348f5e5a0cb7ee5c654b9d08364041d394e690a304d156e2ec3258e01ff56283cf386e2c1f294e5bbab87131ced1f83fd8bad2bc8b3150cc58966e674ec1b62662d0c00e6dcad1006ca0bf9d950e4154bfd1535b2da023f985aab4422d60da5fcbef7151b95ea29f3375a10e01522e001ebfc0a5a894a81e7ccaf60fa953e01cd8dfe276bc971d812b34823b0292d4a853012e149cb65dab07ea2315cccea6f4d183c7deb50a02abe6e53e485e31faa4a710ea3cab33bd2dd2815608b28e66daee05a88e0142efe2afaf3d9b43ca0b3086ba65be42e02881ee05063b42a5d65fa0134ef6d2b8fb53e5282a85deedf58907b531cb4ab1e63b690ff6a170cb7ee222ede550b5cbfdd7bd70e32f5fde74f6423eb9a6876e8c78d39bd10b51a0c205d0a50cb19f3795e30489864979f76c6e82fb3898ee8871029064624dbf99116e58902427ae6763c07b4342280b3ac37cdc22ab8f88aa32c055b8f0350b549acf99247360c9a41c349fb4478834e94276676badda95ab3f1fff0699b83c4706fa3e8071b6baeed2e003ff810216e67eafa8565d4151dca9558baac8d01f55fd77c3fe80b10a8fde813e20f9ec826dd4780cca49d5e207ed1cc571cc4129164106e0ea1bf8f44d9d86e28fd5682cc5d9e142e4d3db8802fecc1deb6f07d1558fcbf8637b9e867c68c57fcb579ae20e29dde56e0ecf84d2e9381aab49c06d972a79f418ddeb6ca64915baf061f65453589993a29a19844c82a000d5a209c49c22297e64d87fa39abc3d4608dccb3f1239e17f163cecb06a668c6ac5d5237c0edd32a248aa42b63394458e2e26554ba6c60cb4dff278c0aa472010324bf2a32ff38a22fba2dbbb75c47d9e9e61603cf255ad3a1f0d28f88bae8195106070e7e61cff17659c4ce2d10062faf174ec168ce4f5b198d29902cc579abc4ae6548e438cdf2a39125a916c6cdf6b1043952ad13749217d0d0254f4cb36dcf3479ede739cff10b66f9a3a266f44f81969254635c10600184e55b31ed570cb40fd9975cd08c92c5d88dc5aa8d90890bcb56bb6eaa9aec6ea9f6ebaaa7e78f4d4ad85663f894a6a01116cc72011f9edadd90da6e4900ac20d4d206b3f4b93c04f2d9f0b642ea1764c0493ed3bbd0d490051ed8ff072e747fb16aea79692c9a9ee0fe2f17b82776358a9fa1b065b98cd5f80192a5b024f1b7b1cae15c7f12a9178c1b51d566af1e1476c1ad81fe67b749d65dfb7b89aa303c54322fcab4f2771504ec40f3717d46ac57c3dd1d140d2726226b8b297895332d331257522f84c1cb3b3288450920665fb56b7f4dac3983edfe22d66ad380ad4fbf32c204aa4436287b3f9df25b905c306fb37601db870a6f2dfa0b93867caeebc896234e6d2116b22d6b93408c0711452db143cb72c68a27aea5f67eaa28b124c6b90dd779465d7db3d770e11c180dfe5bf60c800fbee10bce939d2cf64d34f08ec8789eca968c08b1a5ae1fcf881069ccd8b1a957d51a83a5f37e69f4b9340c40054a809423181cc0a5b2151834f3e42213eed1203daa4807e30193e41979119bca5606ab4f60d8708396e8cea6ea03e116ecbe5fe384971ddf9dc3758877a8f2e864f06b8309c21d6f1305feae9b35c0c3ed83838d5188ff3aba514c7538c54aa7c0c379ecac852ae1f214efd8a5e08a0d8590ed9e4ee424a95f16f7bb015f0886bf6a9bd11f496b982d7f1e0322e909938455dc3e69197a061204bca6ab018687cff88994c59a35022688ae89b2ea5d774660ead99d6d79fe6d070074b1a8026984a073cd62498ad5b08f3009e34bdf3d61dd2d2f0391f035e330f1a6eed36523452345fad049f385efe019647c340bfafa810e14b7a2233829633aed1675455d38998a7be4b60f7f03e894a706bcd4d071eb9a74f39305cab9e2aad1791ddc8f7e21e4a79c8a9472fae6c7a9577e4dc1e16dac7951b45b382208881788cb451e5a0dc57b959ac018641650edcdc2e74f43053436c0f4701b6a6be21f5317d8aa7d78dbe6ddfb0b6fdb147bf2936431ea501f26392eaf310c5248c708461c5e5a8acdfaf348831d8853d6b55b3ac412aa33673a4f3af77d191ccb30d3cc190ccfaff1d6e3f32c1f1bb253b3218ca23135de963da0f08f6850a88b08ddf58bbc66a49471509c2a6dd26559db64378a33b34693ff5ee040665a9c0aac1d8b03444e5ee147043b9fa66e7d628085e0e9036097d5d1d129c2e12a5913268cc0de92a036c3930cb3276eb4bdb13e50a9aeaa2ad0fb469b5ed4d5739cf7494cc3498b01d934a011a37e71dec0c233f502cd2d7bd3ebdb2f420576a553bbe9d5985195ff0941a518d83b08162615893690405752d985bcfd88978ca728a8310cb48cb980627694a36b6e2c49d9a4e2d682e59248c61f836ce33661ded98626ea394182b072d45614a7b009535d40fb3d5a172369615833637bab0e243d0599b7ab5611c958bc785aec88515b8cfcb25d650018671822217caf1bf0706957a273b5b4d82bd14193ceb075e4982db007b8cf1ca87e570bb75b5907777e4a6fd27be03a0fe2673216628a72f9ee4aaeae7592709980dfcf935b0d0070003d7779325e9a72326b7bb71259566efe1aaa9a180b6360fd46107ccc9c281f70a6620e340e31a20383e36d4a6af5bfda49106998e9b3250c6ddc254fa79d0c71c9be4778b60f95b3f2e770d54b8e850bee82d2043c644cc8b4f71860e29c96c0150ebe5ab8232a68e05a3336669379578ecbfb8c3d72a5ef74f39f1ac4b432b0a47bf8a5c0374026325f69314b72a55726c06a3d8c252ed48327a140bdd443c50cec8a957e6606aa51b0740af704a2223b0d231fd05fd0b76df0292770e3a46f6c057e9316d587718863db855b5ba891f7dc7ed25b7bb5cca8bb5cbbafc64f3489d248096a89375a082e54be1dc9301ca23a7b61d0e21473e759c9e049f803b19ff4423a1e74888551a9d7f8654fbcbf24660a052da7d075e3e4d61741ceb52ec1752b0f4ae3536f84cfc36768a94bd468b431968d0f27655fb5081d5a93a3391f02e1c3f85b44c90bbd303e8f73d3d570ea76b3f1f1baaedb89240c7b640f79fbd726787826a1868192b8b9d90975d79486d893b09824c3748cf2fdb509b9540d1ae360052342af72696e63598aa79b86ef1937f510ac0b045441a7c5dca842f2ad65f4095278345dd6f28716186c5a1bfc1bc60e2caf3bbcf7d024655d56d433140c060ba5da9b59ff6006015f98c1b0bf1165a730718e6c155c680a8fe58c308dae68715d408b8fe5976c4c291fde9224ad695677ed7037757de51a39e99575eacc7842e3cf9cc4119a27024d418c3059ff5d111f61b15a524944ca04b52880cf6dce8a720f98576ebbfcd25631237d2ca613776dd14bae06508cb9c8d2e4f6c94033e365a0bdc7da9e79f2795532011c5814bd63519eb251262d12ebee7f9703606ae0149d32be1771ddeb103595b8c7f7dc2c9f699428de4cc6d157b2b2bbcc6a301dda5dc343bf4a817aa870456d05d5f4b22d2a1f0f6ffc45189203c2a990ebf259d9aee1b2fc53637a248d8e29778510d2ee4a223beacb8b92488589cd707e5b24a97ae3206b83cb22036305ca77b0edf5cc6aab42369fad98f3f85c700984b0998ab9dbf790a5915a1d50bdc67e451893ced9c30606326ae73a5786f9a714bea8aaa40dca06e045b5b4e1c45232c3a647fd0590fd6e4c7ba439d9d8deadcc3b002476c26fb3813e206660a80b03c9a61117254fbed207330df863e5e44e593b0548662d4977fc3cd93f9f3dd0eaf62f8d942beffadd1f30c9c5aab6b64a0fc6a716fca44a1e34195e174813949b8b21ee28f84e81413058c02d10428330d734b06479aa0ea241573e7b893f640d18a6d6319de796a34f0729efb5518e5fcf563987b3321a842537c37b3e06ccd1bf9ef3cbf19b9ff23654f5921f651a4bc5a962417cacf9866a1c53c57443aa39b47e928cc7f3a233de24b6c7db50091c12fae7ec71ecdff2ca8ee3a36be7ef3a473986dec122122e3822f5246cc4d4eb04a0255bb59292ee92cab31bd7fd41d9a3652c6bb81fcbf1f57de57788981a1db522bd625aa5093ab822da622594a3ca2fa24cd1e32813a5da78ec1eb3f9cc6476fd69e1e6e054babf6ec5b02d177fdc8ee56900beb88b654667c6e63173001b0da0458af002234f6f0fb4581a310cb7c150e9b43e9f756554618cbb59cdbaf7e3564cca922071572c753bac1ec58cc4b5803f98066b223f1032822bca55ce10aad867e586aceacb92e0cca23988b29440e160a62eec8efc1beffb4ed449ef849c38238ef4a2fbc0645c57cb644e723c25fb0fa91c54902127df98c1b3eb586658f6a6ae5ef85a6b62686d16f76247950eae2e6dc5d13783d3160318cdbd268b050f178e84b6e2f74a5b91f805312cd963df497115ea30e6ae11fd6e172aead40fec92373d1aef3071bcf258831181aab7f78d33a8e4e6e310440db4a54c039390714eff580609ea143262119269daa5cd5253a81a35096b2bf39147bf37a574f58b7dee42550efcca0d18cc101b3535812a01c0d67fec93f8822fba17c07dd64ef5548841b2574694d378e895f8aaacfd3e04cbe87119814698d134603ecf0e6c4e2627d48d6a455966a05a5a2a0a95ad7b319cff1491a485daa94fd3458197962e7c1e27e4f5d8f116133996bc2c64dabc26215d885259e49259037d3be13287ec1b2d8f3ba0fec1bb3a0addc5761cb5f2d47cb04ebada9706d12cd771fee954171afa66c9ad34545264940354f21e9cc82dce286fc0b622c82680efb7adafef5b5a3eefb76edc23fd63721693366f235b84818e604f3223983e67c6b154847f5087ed59849009bbf3c168f0e89db4b4f491e58ec7dad596b4254bba305bf4d3dbb2e2986e60eae5c97394db244f956a26aff921bcd1da47c4a414b64851252311c1a91979a411583555eb8b4224035e11f60305f48f6d128fb508b0e7a90df901a3a913adf63f5df1af5cece8c9e60ef8bdc8ce481339b38455ed96a08fa4c0df2de231ed9152767d1eda1f29380a9f4168be5e01a02fed263a07daf00d9343be6409ca57a7d30ba77d832cc923ece69d18f7b455764c2055dacc4043820b86485e89d2b1173b964e50009898a9cb2cf93bbe4f4c338b34bc2ee754620cc9fc7ccecee87ad42e913bfb219a2eff6ff77067e15e6a99aadb0f139e2781eee8830b4bf4abdb65312c778cfba45465f3c236df6d23df9f547f4a24e24e19c5d204431375e23896c2b9e1c91fa415f1484275970871900cad43bfe549819a5d14b4c00175edccafc0f522bf6427639e9062eccd1b1690a0b63ffffbd3477aee5611d7f75e9307c42052f1649d64937395b4c7a52d205214102352dac800f20992467f5a0f1d10a13b0e797605611956d515a98d01bd3aed5d28510a8a2169d28a8abd2519ec5403929b20ecbfcd8629740b9777b483fb57a570026b423aa0b1ba896589758dc1a68f13b85498d99c8ac8fcb5a0c1393537710e71bd4589e81d043159b073c60ba4ce37cb78f22cbc6fb86b465e2a4c2003c71586860ed8a09cb6edede1097aca67356a299b7a8d67dfbd2c9fe3c63b9b66dba8f2b906e658a2adce88b8c9802271c3b955b33e60514cb3dff123ee205a101c0e6eacbab97bc023982da33ae8818c13a3258d5d49dfac3447be5e498f4137cb87fcc6b6a2be26e214dc696c06a20ebfe68da88baf2c90d5f41f207d11c9627d2ffb1a4a6c7ecea390e628f1d96fa220badc7a54e7e4c8b2f5e9d35ee378727dacc1cd6230d86c97df20043f129cf244d5f389856be0adacffd9e8156402f061c0940d33facceca81085116ff995a62382f01cc07f521867da1fff3fc774094fb830e83224db556a618aa169162a4aacdc08d293aaefe88140370c4268886284fae9303b96d3da938b3a42b0f7190560cd46e192af1f598e13d053860b129fbeaeb78a462d1bb09922b9360b1614e80ce3e6865882041e4b028b289803e8d07e9b192c73a00114a00e0bff15764f98a0883bf7621b15ed5fe455af9792fbe5a6b69a747f49f42802ba2d88902ce8e5514c5c4119945c1aca43aad6059e971c7c7afc033cf5ac3c493c6fa45506c8c3110be419252989cde786921f3c2c2cfe47583bb0003fdeacba28a31703c2fdca5a4a5ab488a50ff4683a6288bdec93b343009417e62a82a0821a6afeacc032b8920d3403c4ba0c78558d98b5fb9e62062157ee8866c5a08f7eac34a825ed3a4342be3ca75948e927deb2deb93c6af903cdab0fe958f4bc314c1d8a86845ee11d65e96e85e06666972fcd12ad398599558c737ccbb772bdcc9bbff3fe78458b065cd917340617eaaf815f504c773fd3c65fd44319a25befa28dd2f631a63936a9e5466d003f7347fd57f59a909a244b388ed430d8b4656663b5733d855e5237f6781670b77958422c227cdaa5063f84273530f22490f13760c401a8695a82f8b2750a4e96968ef555a3395d12029f166aa6cea2d51c70f22663d8ab204113e7ad45ee8d754bdfafda0aeade212910409571e14d51def4650472057f567e25035fe9c9272c9e64f54e1d1117615699024933d2ab3eea2ef51bf8b69a1a8f0cf52b608cac153db25a934673e07c550835298f75b7c856213ef099f6820a6f49d9edd8ee2f85d73a0e2e52ec2c61952169dc2f131d1c777a74b539062ca1e271e72107d89a563b2b3d81f51936639637bef3179e6418bed70b18b3531050736b064ff5cd328884710eb0338b5d311c3ad6068fe719d938156f79c46b6b01984ad74e5c8406daf6fb30fd465cb59aa3a7ce87b4d12a497f95690ff650e54612b31cd6b472dc3c2eaf1fca25aa2b91e771493f60202053eaa8bcc5667a07a7d58b5b6721933df17593f933c0f20eece4a9f9b20bb1762c6c8dc0b4a950e0466a6787828b9e40b0f8460c470805090a5d9cb7f99de33d6d53dd4b542d1830bfef9d6c2a261c5ce7cee430e7fd4433d8c477052cbf96176b03c5ed3fa41ae3a0edb4e8d4ae9e3e1003c1bcc059365e06b41b81fc8c40743eabbd8547acac1a0863624bd346ab4e283121a2327fddd93bdd1510c372a22740652d599d2de5027714d90ed74fc9637eee47025ffc402319ede208023b87a580e17dfb242669e8ea0e4278ddd07417f89a839cf0ec05312d4cb4589ef9d738ec6cba9b284903190252004506d4338366a49f6533d0b044560f1f2852f32a012db1ec92e7ca4aab56a151d49ce7b3f76a245581c5dc4fcf8e913cd28542049151fe0021ffd2288260d21f4bd1f040a5db03ca198054b0097aae96181a8511f8d2130275046c8b6ba8e17b400a0c7d3fce5e87997510edd5131d7aaae12bb72965114cf75c37b24013d3ccdc0f43812a910924fb2107d50c9888d8866ce81e1aafebcbaf92a53b8e15c1f63d8f54447c8c76a8463df7e21d33801662b3923a676f23ef4c828601d613acc9732577a2e0732d7891fee468bdae4bf9269ce20d75307487c5bfda4385a48875f83f365c87204b9e96fd23a7775ebbeb9ef2e48b6680642f7d29a7968e57d950e04e961b60cf5c84c3657e394e5baa56f56584fbb461a6d3aa36c30484011c9ba9e2d1cb0d1ec784eda77d43989cec47a80c83b0db424b6a1f6f6b25600358d58917cf98a80f0d1f77096f9ea95d8befa1d320a5bb320103ddfce4b8c447b00b071236522f9bb10ac922f02a11f09c96c3a921a8fec90c1dbb261270d714aa0a8d9d099dcd8dc647339083b9d38adf80db8ad1b407a2e1cd820c75c16b2a987adbf5d40a6bec0bd10767ff06a6cbd4dd77731760f5e72e273710e8be48267b9e310ab191d0ad289fa6b255610746ac07ce31c7e20809f4e0936fd0e81354024cd84ed64682291461ff3700c7253499cd0177a94f70eed2f3d7c4bec2e35a3311da45bff812c28e362063f2f03bcfee308e6448413518c6ee42be485ccfe63a4fa041d420b22b06b4db6ec3ddc3363fbb9be0356f4ac80e4987a9dddbedf3ae04548a2e4e183fed0d40227ceff4fc4b66f80f03713a4b55adc5fa616982a19c1da78e67057f298a80c8379e0c967c621b294f0edc7a836b6e38d93643a0a36a19091dfc12e70ae048fbfdd54ac4f949f74c94a2cc39f43f2773cd76da89bc0c3e81f1128c14cb385698354ba7909f654ac997027573f0324547acf81dddb698e1195d749413eb81c88484f9026e23143d6d5c40672419fd73a052913c914e016c4e908694226bdba0c7049009cfb799c207dea0781596e517d5c1ed492c127a789c71109ccc53970bee50bc9379a719392e8609da5d70e342cf8c47036b22b5d973df489f22c1d462e4580c11afaea6c085ca1c108d6407453ce4bb03070fb172fefaa68b058ad4cc31fe4ac47ef4b80136864230b4b0536513ffd9a6395a5f0306e5167014ecceccfbbc3b0edc18b13c13d6c76a3df880ee18451b01b950467989277eb3bfacd20007b40b7b9e9d22484dced979b9d039682ce7a28c8c5c9f20889afe1b1ec25819f10e334405440cf03f47c51bdeacff4425614cabba84d09ac49298424d0384b2e66eab9cae3c6a04eb626eb70692e96cd02785a42e157b9a6842102d1fd85e1e47e3519add4d993c1832a4b51e8fb502f0d3d2762fc19bcd8c1d537879d285ec6ee992b8b09a3434348f8d7a8fd50238c5fe039b0c4b904f0f995371fab553ccbfb605d85cff275e272ee4859bc7c313dc02ec53554af8e200c48a2b85b5b3174b46771f5c3ff1ab6b01adbc59800c1ba38e46906275cc2823415ee47c147f029c66bfaa2bad16cd8104cefb420cdcc4f6f284232703debef58114a60296c26636e9093ca4e67707a886255046b3cdff77445a427903f10155c0bcdb25b7838bc687084086110260d26cd4448ef048f78d9a593822c836d360649ac9380383d13d47e974be4bd0c3e203bb35882a71b537e3dd768a9094bbbfd51047f5fc4d25357d7118b70000227dac3bf04cfe34eaa91036dc2503a66cdd3b6cb4810c2dea3049714be85be6a229d53189d120c6be1ae708a2a5abcd525ee9365024b93c1ec870932c74bb203756bcb3f97fb87a293e2b45f4eff636cd6983993e713f44f83fd92ed0f94ab496d43675817c30346c4864dd48e82bb830f07bf62e3908b23a6661ea16c607b11cfe2220d77a06cea5b0ed60ad92c64f53aa22f154574f54924332d3e8f81cba22e3963a332b8b3c1e3c29e962174b09ff84bb38113b3653d688d7d0abb8b27dcfeea13490b57b931a54c7184cfd4641afaf724ba10474b57cea0b17b900278cb155ac7753436dfa00d6a0883c27d8cb97112bc3aebd947f4eeb0ae63277bca949bfcb8c1ec2bd23b662f74470257e247e1495b393d7cc09f481788108faaa3475d8d03c7d5ac6b56ef107cfe46a70a7bca02afc82a279700e226e709be8b8102adddf973c0798b8198938d9894cf3b606119267b6851e072221b7c1431a8e3539a5592b9dce2fdb375a91bbacb27079f8965224372e8ebf163f39dd8e8dc0c583dde78352dcfd7ca07abe30387719ab29b4d58ff31370730605e5c7a2fc947ef24305f47e690384689d0dba2cec4b6a315883b39187ddc95624ce10fff4c3972e9113d95c6485aba201181c1812a64dfb8f400f2326960bb71163f62c6b373775cbda992d72bf7d1cfca9964990c6c4e3b2fc985fc7db48c01a97bdec4521de9821864df886426e135315d67218d2a341a6101e09f59c32d303c0b256b1502a4088d33fdfca0317416e4325b9c84b004daab90abd68a81ee750d276d72f4df69cbc7be09f601c3085f0c3286629c1f6a924956b2e4e6c9e156dd4d2838a5c54e984286e73cfb3f5296601c7e1b003c0048ebf14ab497ccc6fd4a5a4948b6c214d502319654ec3e8c32586372ba8ba8e4cb12b19a44ef65feb31627e4375acb8f2eb09b6d5a70a08eedfd48133a88401e2b1a260c2591715a60a80fda92c32ea852828afc94c83bd7978739d6a988b45ca66ffc8680e9747969c06a842a3dac224f07a0d739a08518808136ed50115398ade45b63a7958b5e691d58a1d7270fae3f60c6d5018f8f24ee4760cf63a754531826cde92b83a3b9775b88f2841e669a196cb9e79541ade748700204400cd60e81c6c82d14fd0c2fa41d4cc8e81996b712411931ceea6b2962e225272e325b148b050760edee1bbe025e1c8f80fdd33690e63264e28e364607be43f870342a799be1781e6b4735d959537497ae6807a324af5e6b737ea85584a95dec7a0c99464e5b857821d9e6a9f88948a89fed1ede401deb88706d1b09c8b93577c4043531003d20f4eb6e88129303776f3af661ac41031555eb5c63aab1865a7ed059d272e7cac48c7010ed4336143cc9cec0540296abb9734d58ea6e703a363338bddaf53833526fbc72ff80f02a126c83035e4824c46a6319e745b54f757ddf9829814d785ee422c5bb7923522e563820cf1bde95c03d5584537a2b8d4c71e4bba3467ef69fe7539d28530da658c0d0cdeea95122bcdb0f245330c9e938de44346109b270aa7a8ca83ea4e7decefcf0c5710c965637c2489182a69a26762c7dc0c704f2b5e54830f59818d1fe2394ca24dede5943ab7eba2ecbbf6cfd1483a86cfe2cbddecfa001c019b2d7d165c655b21eef7c25b732ab359db33ea200232bf5e7f7256fd6210c40e94a09743c9f199959b52323aea1830fcdad2a78b6f87c344887a599b8c3e32924c4dc1b819271d110e2d8f9f0945e1858186b6648cf8ec80216696e760735427ad4734f35d9d7f15c9eee5ccbf1754a96fabf744fe7eb694f63b11c611e006423914306e563682b82b56a7afd0fbbb6f6c3190b4d57ed6faa5ad348bc69214fbc4fbbe05abc9133ea6865a88db0f33b4be9acec8df92b8ca297a6a053a75f34798bd011a2387a3090b17452492ce74a93d4e07c85b2baadd7fcc36bca4807875c21f2fedea41eaf4d644f786d32d64b9b713fd9bb92f18c4d425dccedbfe53b7e1a44fbfe7483204e55a4fe2313c80a7fb2c6136571f5cfee9d2c62e9a930063faa9614c3076c09bf4baf3ee4b76e88b42b778dc66160cb336425a2e0002ff02285c1e1e2ca6df183875b15e3633c6c5130c1d8ce27fd83628a6cc979d05536bff9e5f65b9e9308f2cbb2247f8ab701d98c581546de848c2addcb938a8c7b1cd4a74f296c6c7db9963a207f45c779c045006273e68398c43a9fd8be0c38c62f2e0cea5a82c29258cb86841890120d98be9e550df257f7ac00e72fa0a41847df864969bbc22d58665164ea1a7016dedb6870bf0c3686db1c85521772a6850d5f6b45bcb714f1de9eb5a97cd6775a284a184170940f79fddde45b1d143b0d7d5a01cd507d0e10fa953ba6fa2df01ae081f9b0572b49b5a68aba259be8168bc48dd9c52b81a35d35352e28acab988a157ad545bbe5aedba101b33c91bdaa73807adc82bed6a7afec9fe1088b5e34f57468e4e855387a806f1e0cf65194e436a7982e52836d4b8d09ab9370021585aa22e7588e4185fd000e36533078020a21d63e5fc0c2d446be9bbe412c9fd4c35601ce0e041df5950b483c62cd9c84814024773c21d9f87746220afb5959616ccbb94b006129071aa4e2c2a4a70990ec87507aeafbabdd9e87fc01718bc052e9547ac7972ecb974a41b7add5fafe97e64211d76d484f1cc13900d5fe987f286e022ae6df472318678eeb0fd99645707f3b7cd622dbcb2106dd37120852f7bc9beeb839b79155d738d4a81c619728acf7a37ab338e0662161ac2e953d0a00d3b051117fc808b78cc0c60420c03781cad0c1c7758194ae2a66ecec4924b321ba9c0177e3a19119a3c9e7d77e53b1915d7e80e3a9e1fa3e4d48ddfa558e937152adb159cec6e22dff7febf18ae407018d828e53512004f1bbf2912352b6a66f87f12e8e83e54104def4b7e0b5a8503096e8cc8a4c58aa0498c21b6c835269b3f5be91a2ae9f7511ced1e873fa54b758940850c427bd0b77d038130db46b63baf7dbf55be8f625470d70528e87e91934f3eae895be60503a1357a8989f0236d1c7823a9189350747320b2c6a3cc1c5f7008c2e1bb3fcbf220768475dabed706f7ab70f3df738d41945b160423aa7a581effbe6000b7820b5c3e84e441711dcc2f98a96061eac7c302840bff6035e5c6a632c8f73ab2d47b51e2882aa372742ff82d0edd279f6fb84a82b0039101173a23b2c3b51dcbec3690f97dbd52e4068d2aad7efbf0c392e76d24aa9b9e248649d1b1fd789176e99ef69676ebba8ebacb5c88cd05114f4128878c5ca51fa703c1836d50ef2b7050d707de74a1a74b19df75809a29a49037f66538493fc4ff86a8e31c37b8c120a5e489facf8c69b2e5ae4a748d46807ee14b255056930397a9951ab3892e2a47076e925a2a3201e1a0acece874e3145b3561312d2fec9c47f70933e51d339c53f63c21454cc20912714298b2b1b592c2c5e86189777a7b6d2484038d448dbcdc2d47c37445599506dd175a052b5440605b0599c665f8b44af00d8c9e084f10825bb89c67addcc2ba373a357d4727852dda5a0d6c520b5d40bdd4c8352aa075542b83ab39b9a82a5f3a2a8a2ea28f6fe04de0108f7c129198325ce3725a84248cb575108060a1a2e289f32a10aebce8fc6a9f24d8de6723bb124100938343ee3bc0aa9155db01ec9222a9b30baa7c774733244f907015bbbb43e033b799ae65add16aca8c0d0a5bd7d4d3c54b1b7375010ba261570f048194ea78664be1f33eb5ed8c0a238e56307c79ae61235e82ee2f8bdb41302e17ce4df8f89de2ed7444dee7c2f355569223c085524e284c0b572c38ad2cb49a4daf557fa87433ca20f4e2f5bba8b285d716add1c7f8c0524881ad887a7584758aa18e1187d908cee67321e577a4bc174d1d51b6e5febcffe6ee5737043f647e4c90e590f9eabde12cf95d5fb6210911fdb600f84cf998b7ab3bb172c46cf9543900cd23fea6d8387f4ee29fe6ea85be12ccf1531fd56ff666054d233721e794c62a912acdaeaf4be67ba73d119554451370806dfabc49fa67f96f592c831f119678f45c346a882f079fe52fa0fc7208878d712fa2cd4e8ae5c48f6a5995f8724042f556215eee892266f7c31b70b59252c00774a946bb001893862f3e20f7080e2484fff7e65e7789ad523400c3561d22655a5d3d487c06db2fe481d489c5edf17151c6723ea458affaf71aaaa2501c0e28ffa5e05d133f095cb0f7126d7c3e7deaa1567cc9e9854114f73e42cdf77264db0a111fa0234930485ca503afd004794374a382a7ce9d44e4f23fc199660a2849234f85d373bdf96563b7bf6688d1f011195633a593e6f8c7106451ffb3832bafe099df7b8832b88766879411470ec2d35ea09eb11fbc89f9d01dbdffe418a482198d44aea23afff25b8568a1cfdd90eb41bee8d537b1f9499c35ae6a86cbc96a6b55adfa39724271d69c2074576bbf36b8dd2cfbe5173387354f9a5253f676a90716e10e6f052001f439d6729406addddc3ea55d3e2180cda00f814491a505125df0f928a3439ed9065db1aa21032734dfbae0eb412fd617707a11718e8e3d0ee8504ed2ef5abca468847be3eb41ce9b2af4140bedde955a7a73a50163d53b7c76be428f48154d6c894fe47cc318d299698629fd8a2c4dfe9d5943d07b5f8465640647efe139b98b189395631596c4be1dc7aded3026c1a6758f8af41e8884aeb77bd8538b5cfa19a1a9a4a8edd4c81b9fca34c173952bfd2de1b06af2743b13b917b71662778e7467512f5e18f4ea49e78cd09dabb2739a908a88f8229887d394c7b4116093994f75d52e580ca2729203c375d26968d69286d3bc4c063cb7db7dc76b7bbdc999b47faeede3d747e5a37901720ec500a054fd9259f3552b1784682cf4a0c0ff090e1922dd0cb02a297cad1b6e5596e79e3d77ec9491a037fc2a1084944b036a68bd491c8a9c768b4e35431fed99705a01efe327e6c3bdfbb7368484a2ea09ce48bbb389d7a42d8974a8010c2c066079552a5dc52c591715d6e0d0981840ac4519340dc195ce8040f5a646f80dba8a8363865b7fa8beb076314f6d42366d9ec50ad0d391e5c892da293b55b72ed984d823bb95fe9d917ba14229c8f17edd0c3b953bcf33320ce0809af89d4bba59b00225046717cca07e7c8406b34de347038baba57ee00b38fd53d075af5a5ba42ca627694c7d82c0b34948e484564c2878928b7283cf52cc279a61713f508bb752167c3c838a32530484a81d43a8615a938cd499af75253011377d0774931d8de1442e50a68956bc7e90bcd0773e5f31245c9fab017466d5b124fba8df9153485062781edf213e025d05b31ec8977537d8c8bf7fc0ae9e9439f0e74d3899e7440736c095c63d9160351c5d5c1ac605c4b6fbc2392a7db48596f12b2abb7ac5b784a1a37f8d0229191764440e866e6d336a841808634e01fa969e65535cd0be3f758804181fd000e3651b0780382c76a66147a08340096838393f4bc346edd61fcfc6965872b625c917b2cc3a4c07e83871b28d83c31855df31edccc57281fe8b9a642209338d625f0f0f94fd02cf60fcc9e04ce3cd403798d0696d3c933aadc208b624abaf98626a131b9bccc74b6afa656ce6b6de690020a60d78bef0ed71ccfbaa9933a3d1b30a67f2896298307caa99d7da1e2716b8e883073c6a5a59311fe049118ebbb7281b370f4ebdb4c4fdbbdc71ed57ead917d99821228875aeb650521788510f5a520efd0b2e73b706dfa9385d10fe9135f43708d778ede48633bf280e07c4c3a47465d49e47b0e6a3d0a31e83adadd207d0ce5226a9cc8058668a62418dd52bea1e997a06636d3db1ab77d754f4b8ce70efa5ab7f35b7bf441d36c56ba81d89bc0f037440ae64e2bd2bb8ab9b00778640486d4e509256877eb4993b36a21cc3604ad4c28e6e15317d5ab7336a86b9eea53d2dd3c3fb63c618679090e211d5ccc17488a751856857a828f5bb90b7bf3fe06ecfedeaf3a8a5894c583f4ec9cbbe10e6a0295d93caca1248e190febc52fa4afab0c58e0c57f517170553fbab52140314f8d7283bddebbd4a9e71265e8cfdfd25810fccd60c9fb7bdf1c36e08619e8c4f19b9f5557035951af4aab31765aff5557d873dda996a8a7e246d1ba9a06204f499b6faca9588c7a7a38904f220b69b9d1e3ffa7a11ac3cb32a5d8be64839008612686e5eef8fee1a2b074c20ccf7a158598fac06a3d360f9fbb21c9263e567726d7a06f8d5f421621baac04aed304449e05ea3512a5041a7c8e17984ba288d39d2f905fdba8d3845e5180a318411ca957cb45cac3b5b537559b7d512d98dbaeda7843529516147d10244cab4e383d575ec0464a365d4ba6db67c262919a224e9f79f69ca9984e2344b78d882ca27fd9dc2f6b4f6c65513caa707773d0ce4bcc3f7643e86cab5f093f849778aece13d5c224d5db2bdad12bd66be76f2a75da3d25b18815cf602a194640c81c9ab98b84f7ea5aabf259e57d9573d5f1261108b6ccbb73cda6dbe51f68dc84a626d57b9cea6fe7c19ae046c18d1a947d400bff652a97802096b1b2af30fe95acbbc369ed1ba1d90f5c1f8c8fb81f5a1b2e70fd481acebc9f1f997c08e8f6ca73d833e7fe7aeffc045fa8bfa22577917b7182ac314d823ea86e82ad5cf3b775faec84e05e238d1a73b0f433f1aae666790ad18e3902808eec6f0f758f57a4580f1e66bc8e1aad678b80645da3891968d49cf542a8fc0842ceaa5c842b8debf598112572dff66f12c9923a8ed00cdece525f08e8658372b457852d96a38d9454817312b3be3d14f8617ff7c89336de1a4861a5d06b68751f43ac01471453c9c243816284993e7364f1d311508182c0a2c2d57d231599885907f6f5ccc6cc03967c60328290fb2446487b2df6d9b2c0be40d57ecb3b0c38f54cd3097c60b69edbc92127178f764fe153faa606fc298f23f3e55440f140af84ea92b3aeddcd1302dee3e43323929b124861be0239b858dc90422e5153b5d85f0a14458004dbc8f42c09d5bd3e986e88eea016ab5a589d7d06631201fe20eba8736c9415695938205fe395da5d7d37920d61a19874e8c3b825eb730af4eccba04fdd3f4965c1eeba3730ae05dd0688a3a4d104aa99a6cb6117d1609c8b90f50e0c879202e830257300c8c17aa6697977f2ea8421a3f864ba27c94bb3595c88e51ad34a5d051ff808c6ee31f8fa6b957d499cc91425196447c072e8cea0a8edd30ef23dd56125d35301adddc3c4526126217c1fa4ce2c7a2d8e2dd34fcd317010a468dcc8ce2ccd7febfeaff16f6711aa1cdeaeeaa06fe06f82752814351fe211a7c26cbd9dcbf49078dd9f7390b93775d99c4cd894432f6fd94a9bf460b525b19871faf7f8d77b0a19168e0655f6bc0aff866914ccf0e1a86c9453d3b1585859c3e637bb20c5c4111a07a7b8ca9438d5d70c0d3f07d99898d8a9c88830f64142e706286f2fe46eb77f96c2141e86dd8b70add35ff6560b5a4ff00726e4f03be38d378d0478fa749d28cd59ac629ab9136cf98a9b8c90687b68edbecf985e3c8e19a6d0f414522767cceb05e43d5f71fb9d6a0af020cf9b94e112bf7c0b9f442b526d4c5fa22d4824b09317dbd30466cee570fc169b23c0f1afd081e209fb5203a980ee887b19263b4e9a87267526b0be574570bf13c67ad40c8c29554e98973863a8c2652e673cc51c9081ec789ab1fee1c6a1ac5305cd2b4fc73ee514f633565cf2346903333a533756cfceb46c5e1c6e822229554b3419547086eb345ae8407fab5920ef659a9ebdd53880ab17722f47d6b80763963cf8afed68ea891fe05ed2ebca480ef83115db4ad78b8e3d7cba0043c6426f248d8f3b60167800bc163250f290bbca1f5d3e00fec10adf4c96326366b65c960602184af7a97bf0a030b9c40687719fb267c7b8a06459e8c590240a668d7bc8e45c96649b7a1b034ebfef87fa6ab3e1cb8a4d844c5cfebf7ddb8a9afa6a774bf7caaa865bcaaf5d65944a96b40e120fcfac922d0976db39f226386029a90d6d73006e82dbda615d6e690810a5d065769aaee760790b6a06d9ea157f1bd6b03fd5a64f5892e8c2a39696605ffa1c97d4341387844e1070af49d17b485b0299091766b88bf50247e7d6938206dd8af13adc4a705d89b1e3b6ea811f9485fb772887b23a41d0f4a381384f541e136e3d7956dafea3bced0e59d577dd79df13e076a017da7370a2e76c96964707deb2303d687a251fbbe5d93baa2683b7f182b9354730b81dd7ed810a685e6da4a6b38c4856a04f5d236504002a92b3b955bfd717fd5d9a9ba3136e7bf7f13c83afcc86abf2df63db2e67bbb28c538ac8314ee3e6d5893c2cd464199e4d36f711c281083cecd2dc3b7570de72e1589112cb0f658b02b1e7b845d37918da09e67420b572dc547e1748ce0c0fd6c15e368af0605b089f560b67073fa0463647ab94ce5884436b5f068efa4e13a98721476a66208ad96047266e80aa238a1cb2b515f0a2fb86819b5914e7cbfc1ae5a045823fb3798e268dd9514d7fa0d1ec901ef70be7124008d5fe369091bbe8c6cd9c3b550dbb53915a0c4b01d07b9025282a29a2f537ae1be0822130ef8c122bfeac956534cdc918afcfeb9b06bc19a08dcc96853dd20db3d1fb6bb2bec143b2e743a851ec03501deb979add33ae644f08029e8a5c43c8eac8f8a1e1bd5858dfa928d163924040944a051483aafbee95895616687c6948c92b48d3832c997a7ad0efd0240a163cab29ea68d56e797b80319d3ce5a9a454f7383ef5fe9c2fd0d8829cb2b29c84896dadb3babd7a480037ef5229811d255fbb30fbcca3369ed3c9d3ba861466e007faf95b68a65d5863066114c909dbce3314cb97503dc4f77de5d4a60f9c1ebe91e6825659122d2269b6ba61104c823c651d5dc88f395ce486642b67059b88a6e924d8af466a4e94af8d9d9a387bb84c4efd5fa226a99870eac041411265c1a8018957fd5532c9671523b5fdee3b88c08adefb346361c05f775a778ea25edb39530f983520dbf0c6261010ce35773939bdbfb95a1ffd99ecd24f7a24484037d539e63ce51e851d293ab259626501443826ab20d8d5c765907fd6c5fe161bb9d80fb0450c6c1acd4f4066c104e589096aec9da6fadcf337a95a4336342ae0bfa9eef61a3c183ddaebc61c52293f99b5e5cc0fdba306e6c895f23b5ec3f2bd87c4add6c8d1474b3903750180bbc8bc844c47e39d2af141c11c3b443c9a8027a0c91710c71189ce2f5bbc86387e2e6959669e8bdb1b1838f71a6cbe5216b1c6b2935253951e432717fcda2a35474715a8045a8fda969994f9e0f2516ded0becae8b957e6d49f62ec5977be0321c59edc37b4c8f2d36280ae973c3af61f508946d7c781acd6449a621f9fe35491b4b5f47c970f64882de223e3d0350f5752882c3ba66564d0dd40f64787f3d6f622a16c9643228c7c494abf95e81e46ef6709c992ad0a34d87bc8207c7cafb765be2cd734b828db887e08fbc5f9ce0381c4f04477dc79f9d65b8d73b5d8dd40a6e5d0658b3293a5620a78dc8cf07530caf497835994a8d63907f54637902430cd76c1e30c189f25810ad158a080396b923570344deaa4d2e934ae15294e7af11fe3902a36c6efc39a522d9cfb0883f04a0e703e0ec869496c021f94c21bebdff15ca1a4c0959a5d4bd81830096def9ac9948b5b8195abaf1fe53691156da7611eeee1602601e7394de0645855ca16f469481fdc2ecf9e349004895a6b2ee3cd2ab6d6110dd929a14a92d678f86a39ae4d1dc5c2dc4ab495c0136d5932dfd836b52274ca011c9071a38f4a029ca31b7c88399203bb1fd2140847d4ea27a6fe9ca5a81ba58c10765d78da8926386257a81a0060b94e4660f01d2ee8ef0abc0a7c9c254f71bf20fef8976afed0002e7361c6628dba3c9e98d88a419da8f061f473e37533a8fe296f5b17a91968133f932592c2108821d41303361b8279a36f0ac712713c5fc2fbd15518ee000f89be77a32e6ea7cb59dd1f0eae02b7b06e92b3252b5e22a2b5e6d05abac74c53bdb2475038f26ea39f1e54c8bc2c842e013d8d541bd24e86bc61499483d9d1426723b76f4ce8313466f200b646f069d1c46dbe54123358f95e22d1e7e993cf10521b3c06479236570088a90f42a8682838c7c3dc320aaed2710df5d6386eb58ddeec26dad308bdb815bca1aa0ea812a9eb5c31029bbb4a962a693c940c1284f921580c444318a322ba5cf4357dd9a0310b0e79fe889a659d7bba8c34de3f8f7333cff25c3591dfbfdb3206878943588dbcb8ff8608dba02f6534a7b98a772555dce46992fffca5359183c0f9c51bda0248bc38f609d77f97787cd6d541a2f1f558046d0896d42039a4e7a208e2b178147b2b5b6439b0a30fdc24f017921d0e1c55a08dc240a5e34d9647489046911764d08d1f4c4078220d21b98c1f7e06ac0ecc350e3686f1d2af3d9a7fc0ea7e309dd1811af2c2e0e6be840700f292831775019905a04f20ca8f1f8eb15689090eee39201e17b8bc803751eba6ef576c08959c019a80b1a2486abb4a88db960ff0e0a18a8181fe0a10615964720f85cc1e001445ca3ed283fd291c438507c09563258e62017f90b99e6854d30d5a6680115664d41b889c48f018e575375abacae7293800cb53cec3b6cc5cf0cbe16fea286804a68714f65873c9f5bea01499006cf08ce9c4c0d25453d7529771b98864eda238b2b5dcc784493164880b0fd013ab2cd016c0f9cbe656c60390095b96848f204100d417cc9bdaf2f1c9f606b257ca1d22a1ade7788791d216aa6b163f92c6662c15680eb0d6078ae397b668c0744ef2a737c12e9aa3ee38b0276be0e530f211961948c665a1f72d059193bd55ca728e23a938d084a42902e3d710c3da2a103b720a4dc14b0572da63e52c7d6f9b7b41827f9975735f32be033cf3735f7f8413aa56a46b4ab1210b6b2ab9611cdd77be6796aa41e8e794aa07433ad247c041fdf3e5440640ce8c8c42467ad69a69054a7a1426382ab7122645cc1eceb250c24608dfec21b0c4adfa1f9888c376d4c677e3dabbc96545e9eb49b597b605d894e6b4f4ba48cacb10ea924a8ab3b0a324c8a86e7a880898a86149f2171d2d45f14635d7d8d7ecbd028508e4463d7a4345f2b211d00b45e2be01b6629d95c194acc1a286c3b3590138d28431badb8e107575ff8b18ce16138d77a02c2108363437a3675954d3c1fdf6214bf997985d1da7e3b5e4e9dab50a93a405027449f4b929fac955a8b258534f9908cb00f2bf82efdd90927a278f686364a97239810e09a0a9a9c6f30e0784aa770ff24c1dc3a1872437f0763cb138a713cb869aa44133ee359ba62bb1c11937f2797e2db287aeb62728d3496c4a04068342342e96393f41e98c6e6107ff2a16e5f8bbadd71e93b0b5bb0d854f908f618903d2f495ff0721227744bf30af5a2bd3674d03068f202cb1828004e962604e97ffd5afa06077aaa1d6b9389c58e1d87339ca18121ece6be748b3d5cb27610cc5ccc734c72a6bd2fc2fb0369a5991be2329361472887aad5453107c41bc4859148d106ac3d2a331ca7c652035e5508830bc6b9a0b18ac66915dd2a5c28e66144b901cbbe854c3c5829047ed30de85d2653727f4d85b9ec800b802bcb3689388b126d2a3593c94842e00b1ab4e5e307aba0675fb162892164aa87d9043305b7ed60288c99436bc2aedfb768a93c6cf98813dda830126d82dc87c01076d0f6672803b2fc385a5700cadb17f2ece9b7752537d57ee0b806ac432cb69ddc290a0ba79072db4b3d1ea2248239bb400c2ce77c0e2f197017a879a55e6e76f1cb6b8717fce17c3704731085313d330187fc43a22cb6a8944b0245bb00d728a011679a0e521273b3ecda8c3b7c088c146104062a056401483bd52365f9f2e2c59806b5d7d697ecf2acae51c0e041a8264d734b5cc2ba9713d678531cdb936f03e7a331e9ffb5a0d27616327cdf6f87f54a809f2cd2b3174dffdefc600800c6d87b4635c5fd49a8612c4bda99beeb6d98ec3feda72f48b99f408556f5ed41851ff22d7d0d833d54756c4a01f229deb6ebf89448b894f2be8cc757d458660129349e1955b3951939bcd8afbd52b338304e78183eaea2d2108c9a5e74ea5d1648733ae50af76b9e9cc4b5eac4b5bf42d593ad8c75f1a547f4f8a751f5e7241c5044a422b2e474fb5c928e78db017b9ab5bc95c1e284ce3705cd342c822f1fe144c8dc7ed172ce4927d94226dd6f564f7e387e5581748580ea5d850aca48b580c6141afd6262f80fe619f9ebfcc6092392e36493f2e297013a8f7893d081393ac28b9b9a016bbe3ffb885e5bb369667bbc5eb9ed48e5e4a1094b1c38c20018309dbf866e62de2bbe8001abe4203ebc403bd0ff0fad4a3bd39c2122db80195549cbb5289d703dfdee0588090a623fd4cdc1c86b142f9e355203c3ffaf318b7d98992e21129d278171adde4e23d8a72d6d5e541c46c11c8f90b5681d980308567cbcf22c67867991cb2fd99810c2aade3642296f34c29d21a01c7ece3dadf9ae8802800e287e2129170e4808ad36e3bafc2c2ad5dc051be92f122ff56234d3a239385670bdfb094a439aaeb8a0ea68e054a88f1125141d4f1ea1ced33b032cff7b46603acae8189ca7ab3eb2073663cef6d812b77bd7656eb85975cf74a033870608294d3649e022f45bdf8bc044c145b6cfae7567e5bbac91182aa022cb4434df5f7dd47bada8bf25db0f3d1727b3637648ee5d34f783de42df42881613869cd5660ccafc589273c7d6a21953e3f40f712521ea0289dcaef37de9ed19630855d710761318978a669ba49519a8bf4b8fcf20ef2766a0e116c0a500e766c5fbf37c0958333ba7d2f6eff7dcfee959fa724aa411ebb6b3b6c31292863f7f996bf7729f73bebd13f644bcbcd61bbc125a9323f23ed72e8064a333850d893e35dfbf5ee5bd609f65316766d98413e91b01cbc49c263a9874cc5123076719d80fdc436770f37d7a9b813f01a026f6aa0f302216ff329835004481f75aa4bb19a62511d325429c17b663b623bb640cf9c114049079682667d4aeb72322c80a5d4d449542cda3ac7c41b5d52191670cb62077f2aac9ab817cb50b9d97dfc67df7bae79e9bdc7633227b85e3fde18b4089a7b44f0921461192bb7290e9560a44c28d167555717281f477adf6c0b830148f31b35d3cc4cb24414f829fcf924582b265136cdc3c674330b022b3419229ab0f8074e3be364a27890b8735b5f82beb5e60a03fc0f4a1e689f5aaff097e75a85fe59c193512f8a14c044b5500fc57095368cb043e887b2221e6e5c9b28c2bfd59ae2cda8b8f5c35f221ba6858f7993f5d0d9f61e301fb99be9e6b50b1ce923ce44a344c0cf84a0c6662151b635a89c23128d8859fae941d17da0a9d38d05469a1918e77be7972879d1893a85a07ccaf12494f33a489120cd2d431a359c77b9e8fce591f1f896f5712ba750a430f44d620975322323aab66a81be6a493b2a78bf87422cce0fffddc660099c9e555e9804f8962d536be2448cde89e2b234bf5ceb4b486cf36a4db76af1a7c002eb16d5241ff0049982d611652ffee81a175d666731bab7812bfe4535630886916f0800558b230982a222984b5171001db55de3d8c1a874155b69e001fa71ffb0798b29814f2179afd4fe9051b6b155281f5e69aa7c8bc6466f0962f2bc258c2d5c1b19bae840a398f0216416798d4520be5f99d73f056e7a7aa83bc05151cc6d480e299adf02617e857b43b520e87a48848ade328388939c675262f98e0483d0bb9491cdec26412929986148193d3812efa6994e231c53828e1bedbfe317c0f0efd48b45639bc4243d4000268ff2938aefbbc2dd8a958a3899c40562dd0688bef6f47ae5008f8446082fe1f07bd60fefe5a70e33e0aecfd02bf78d662f0b0414ba15a8366098464961605add6567fa93a8380557f5696227182147d27298619b1d94562ad08c1d3da9bc0589901862e7820035f639553151b59417ed810e584e482623a99964e364d60e05282f42ab363f75509700429dc3b13b1c53284114f70669728221ae0b2673d1e3ba4cee475e998cee75f55487135e58214531f272ec50a420f9da193360c18378a3417a50090acc32e7208e4cc0b2c70e887a02e9cab13c7ec28aa292a11e8471833a91620e0f87c4f26b1ba527720a0eef5315d64c704f849a2f9ab0bb66f0d08557bd769882aa0283b1d9fdc3c00e349301fd1394b35fb80378ab524a084da7d963da9db6d45d8f9c0541dc178eb0880c9d96f8127b11a9cd4ff02a29163383f34db10dabf58b37e609cf95b7e328efba5dfa2d03096e9e51720a74762f5abad6695d5ac8895f00176c72102143cf84e651d79dd64b88974b5318a2db6d8c7149bc5e6c3e9cbd773e2385ad611003f172712b2da44d502218b6a61de7181b957c6e9b9d58fa56c8390ad30ae8b4e3e28dcff7290fa03b762d08e73395ea76e5d5ad4586df360f798bdf4089ef3a7b78c1229318873081ce06966cd0b2f8379dcbda399bf573c8077a07e00b9b58b76af982e8b0096a1cedf7a1dc2eb4ce6cd08da312a041548422899e44bb738a006cfa452180534ef75e5b2b132ac91deeea53b2cd568da01ff69136f79852baebc85cdb5f7891cbcdbfdfe9e831279ace5ab071ebcbfa7b1d5d962bb49d7847e56631d3462d54e361e8254d35c013646979638650a7569ba9604976ce98d09b38385be2db08e00a797a959e53b0c8de9365ab34ad7d4d4db799eadae830a3ede32221a1e32f87571ba3a020756aba3442c92e314810ecdfb27a1da4ab177bf53bb4dbb5b5720ee424270f368f8ecc94daa5cbdf725b1b9199125124d3ae4fe182985d1441a5bb15b2067a6b6790c8519d4b0973cf6c398483dc921fa09693b22c3a4221c3d0aa256a910ee478a3fb8c866115dd3ffa4a90be984b65d4f8c58422f9cc2f75fec4bbcc6dd56ce80ee27b5f81ac8e3cc9f19f15f65863579e25a64298015b24b5f2d7f74e9f955f7f1d07f1c6a7f5210d0294adab3eda5cb67294ed4b63fce44cc1dfd57f09744ad4523ec843eaa017a8b4d4a021c0a0e688ca0e42cf46bed0f06af6cafc1f7e590c95e099c24bb1e89036d38e41a6ab756f2718af2b7a3c88066f4c9bcc11595405d39435c7971155c95d43affc49486559cc73e30bf49766d8828ad27ee70e5d150bc1e5c33c18be94f3be5859ed8d9fc167069f6a0a49512bd9af33ec28e0a37bf515b14426ad57e643284691d925c079b741c188483091896178cdf5590e34bd44a70419d95d3346058089cc2e2f41e8ea838855d7a16145a70f2e6f8600375d7eeb66f636a8e7ba4ba06cdca2d18ba0e04a8d77479b012189243fc76a1b5db55b5bb8873ffe6b4c5a826e0ded0262de2c01f5e2fdfbf6fe9e3bd10923b697c57e16464062c4c3d5bc322b994be09f82252ad4f2ecef844f8cdd63c39fb272d4098b79b22fc01012fde7c3e7a2f73d1002509070a0dfb1fd1506fa4618ebae4fc6fd7d05a35b816a301cb2ba6677e7749e842eff28777c3884c0566eb47d33a2c6c4356196896954af5e84dcf049bf6d278586c3f9b85fac039f0590b084118e47b2716820729b402fb9f726f8d86343f91854fbcbf627fc3dd77a82412aa2f18b7a13a798430cb502234cfe5b6f2130c3bbc9d577f765b997a0e8fa86646101303a49fd10936b700986630a3ff162e73ba6d4523e1c2be1dd0e1b99b7d5058fa01f7b78d87598c47a0f5eec0c9cf13fbba95538efa4894eefaf6ba61a662b9642b4129a5805dbe51287269100caeb87b69f1c1386bb141c690e1a990815dcc54ffdb3d3c2fc5f9aebdc8f3cd202fd2bcadfb7d26e99fac8bbbdc8d580dab67761ed626366295512fe3c8a3f7b050d6c165818edc0e469fbc99370921b8144d04d5d22801485468309fa22c32be8fec62f8be3208503fef9e37bbd61a64b8eed2ad3e999c4b887783711925010342bc45d42f53662c72404d20349a945f4a646159a6ff4ffc578e3340287932418676a6ef35c091afa446f120a21d3bf9dd1a5cfe13644f06751306cd26a08a003bb59509050192080dfab035b8dac25d1eac689a99015f34e97a7e4240415c00747428607256a93c96da15ad766cd340f07870555cec9a8968df16026f1d44214fabe8fc12fb7d590802ca1cc60268b141f7b6671ad30956ca730da9a5ad50941b818a44b0dd9595186db8b513d54fecb508a68ba24dd2598726fcd8c061ce796cba2c6e6692418db98627d2b1bfbada72948e7fa79e10141c75205c285db809436eca9e59d57c46c1e2af398f555ce200ea8e9147bdd01337e8316ee9016ee801eef50637ebc971479284072099f61f598bb29355da075728049b3b46a5d08dda22475f78db759e9cc8c76fced7a03b06921020d3bb8f8258473ffa78146a0e7508281cc282a9aac64981a5f3d8129f75af5fb80364a2592b1dcd595d60dacc8742003807a05cb21b72d1e2189d6c28b1da4c5e993f0c7c9a6d8342daafa0719e6b11eee98c60a9ae33ca6816b00cb768e181be59cae11042c649a8d056d080dec50932284206d39a6873bae0510761243e25e63338a61589898f2b01341099c162a2bda31cc51c4abac376cd70b48fff0bfa67e35c4eb2ff5460124bba6e01d3b4372775346d6fc476418315d60c7c8beeb5b746cb13416eae4ee5a0e2fb826e9a92de05d38e92cf622085172d7afa9f0db3cd5fd9396d3d2e776b77e35219abad11e7a47eae0782828ac70740247a7a7c5c0e8e4b4ce2bce9020af96e5c0ef1a12cf81caa7a70668b2aa79739f34c7ea0ce22fa0e689067e7d4e1e2394ec1573bdac12cd4808e086c41e1f83bf8fc056f6dcf6396adea9cc6ee2e9daed981f84161cfb7704d350ff337abbd66d673ede3c62fed1b157221326cf96f4e6b4ef2aac7f4ff6b79a80b25b2415536dad760d1ac1bd0e62c7e54510401c0bed2049418ac4a9193758c0ce11fe686a2071d27612ab426d391ace54fda12efdd1b67736224f0764d8162dabf93d75b3702754805d02746d18bbc1b9e995ea70e9c036b8fd6d872578e8627abfc67260a4d47a22847678f8bca5e01c6709dd967627950a439e4659004053e6ad51d844ef4eb955678f21821e8ab7ebb1cf2ef4995858337927b88e24a9b94d659215a4eba8d34c451249579b640661973e4588ff678bcc6e4f5b62f36c02d187af8565659af65f9e9e6d432e1e6ea86ee8a3dfba8618f626228115458d344e6cfa46f1ce8afbd17c76a2e0bec7d395d2d5a3700febabb4d56f2e6d32a1fe4fa7f1977e69d299b392a9e7f183f83d4ce78d58b50dff73f6b6d5f5d7ca6d1b31405c38f859975208efbbe89724361184c4bbf0a1a602888f0e3a8c352a69442eaae527ce96b8aa914ba54e2bc524f82175ae04ce591f2c319caa7a96f8b2ec2293562a8f47108108a269c8409e74d26148c560469d9465c52523d63380d168a950c4387bbb1fa0ccaca3100b5b04f714d88616deb540c4657632d63cd6723478b251eed023c5ba9521fc0c47dfa57211c29b5fb7114fabbf283036a1a1add2cdaa9c255b5a5f1ba2666d1c7c60dc57af41aa4cd1605f075f53eda9b106620cef1ac61aadccc25ec9305d585ea2c7b03b1f9933788691693b3ff14e131406093e3d1ebd4d8e3cd619173e30452b321b0c71f798071b9070831e7c4e22750611867caa2d909c8db0b3d596d520d3f3f8e690eac58a088dbd7a4317810678d98d002dc3779c2323d1ebf0dbcda240551797761f5d34dcb53a64720e57f863d45994938683ec2736d8f1e11eaf85d107f67c75114fd3d6e1d3d424dd403d4e4c168b82640a9067c6177acdb5c9515b77610431163b54d639cc7d8df794b0fa79337d470034f9ee7c99b8514d5dab7b908c7334ff204eb11da4f0137456f4f9c9729418f9ef214a45dbf5da6687914a03c14f444fa4d83bbce99e4ee0464926cd8887e203fd0d2dadccf00bd97fafc275a952d35361475d3a5f106a8021a85b815a0a55315175f05d5c42ac0b85948242859cb768a3eb9c96389a8907e53860da55f4d714908b6123b38ee3916ca5e4e6861d64cfe10c6dd734604517020ded25489de1c1f262a5cc03176d21402ecb53c65b78a42c4e329e60e2891e2cc84e17f0ac8ef9bf0da18d462f9da2c622b000044e4bff9844a2ce9c947a4c33014780db6ce028e93881bb095bfd6f9c6961e5b56520f75155c0a801e307927fc415be47203dd21c86e349f1ac8bd243c7eda7f018da8928cf2dea55693892970358c04e0bbbac14b8181cd2bd34e211bb9d418c5d6fff7c1e464e29e2a4e12691d7c442a156cca2377ad0032525041fca103aaed629659205a55550719bb6a1411f68e25449a4fb88e05b9e02b04ea11470b31192020a280d82a1469eca0969110215f93f8d24082ed48e222cc83c496ee2c09aee3caafeb288ea2bd3a3aeea4685b146ddbbaf6f7f6df7b4b29a59432e8085e095d09da64ba48b7e77518d245da70f777fa4eaebc051313728672516b6d3269933669da79fa34caefb7b3315d320a8d461e1a8546a5364b70542853254fa94b0af599c8d92963610465e8a41e7bde9536b9e36e754f3e177649bb930fe9276b417561d79d2ced79b57eebaa5a9348260e6ad044672ca4683f7dae2f39335552391291a3182209d9d741cf4470ca9eb8c0a9ad59a8d6883dd1c0d9090b55639d2db66e7bdffd6ebec277bf9bad20f316af1cb1ad309704a19acfc58e75b916da15532528b1b10e915b91231b5b1b6c0f3fcb6057a78576f5186c1aa8841276edd319c1e96833d455c1daaeec1b6261d589e814b919d9d58fe47645b22b10362d77c006b99673b2ed9a9f0f15caeaa250ed0b22d22b8b427f8d02bbfe21c48c814acf4b80faf9b500ec663fb78f9acf6935e7bb0ebab5319fc619678cefbd18e79b2f39c3d8efc62ed7a4385bac02ecd46ffea91602e208fb8bd68ea163d0f1783189cabe6e7dc47e4b4f8da9b5a2cf37b63151d62f8a19fc489b708f267d42495d67c05217edfafba80b5856aff445fbf7782ca90b89c2b4d7dfdadc3a013b87575aaf08d4b952175067ade98b3e1f9fce35856e3d03a08f59bf36cfa0a45eafa54027d01867a1b4d96ffefe7e262de78c04bce50cecd5990705da387404171c61e38c2990cfd5814853686556b5a4dc3c9630f2bef7861fa6672822b1bf73fc408c43f52a0143a988c41f28d6195d7f60aea534987cefadf7561b02bf94947baf4f15d662f0ca44a4ea6ca933daa9d310ed50f25565f69aabd3d81a5a60fc4ccfb062200c4f7ba6b8ce159b18f76094b5dd346c4c6f9a9d868de9cfa418cf80ca6a7641a42977c42111d674062803ee68bc6cea2e7486466b85311832693016e150a52e22f991d847118770e8349c061a367983260d8e1b00d8d8a4d12134b4687638b2e63184207963cf9630cc2c3675189530f45ac1cfc4a6d5828f0e95273f55be525e92ce9cf5c53a7df9b495b1679d71a12fd67b542f674b8b4f1562759babded9adedc15d2921d66a435085ab0ad3b0a6f8a9aa332e199897aad5ca1129d016abe8d49eaceca4555facf695ebeb95fc4cbf1448ebf8b6a8bf5217f0730d56daaa336f2d0a75695dd3a98b85424969be2dae615c8072dcdfe76268d2eae720c22fdfeca1a7a48e2076761d042e6d0bb08d95a14c257ecb8ee3b74e97a45d7ba97de49ff652e42215c1919c5d0fff644f91575287f691e8494e94dae91eb58b77fc4ae9488eda06d04fd65b5aebcbca31f6c0fbabd5ac34d731b27988adf65a6b2d0eae3f2a1555acb5d68a84a903ef91381a0971afc86bc969e32e697897a2a82ccb2fbdda62a5972fa2b175f4a1f926a7b6ea0193df4ac5be2e8e9e268eea88bdf4fcd549d1929e74d12c49176b59e671f4f2a6e4641e451efa929fbe74d28baa8fa592973e3a8db52979c8dc4199d8c2f2fbe947a76459c7df417909857a6c61e2d78cc341eecd02a95bd411bddacc91d3ea0fb174d1692313c7eed10f9bba45a2491bfde42517fdf4a5929f4492491bb74872d14973741a8f71e39d6f76948ef768ee28f9583af6bcab570fd49992b963e4a38fcc1da5e73d66523932ab07ea8be8a20f5dfcab73ceb966c76ec9d1acf973a220bd92b3d129290405c71fbb3459d10c60f2144051347958327aca512a37099de461f8a18fbe0c55aa564ac8491e7ec8c5a7e16c71c4aac1c70e4944f8d822b388d70e4d16193a19bac80c4d9c4d7292f834d1b38b5a14473d5e95d441f23014b144b3061f3b64b242be43e4a287442eba6834f2d0cbd0c9a7894e47178d1e7ae93714864226890525c9e431ded0dc31bac8dca17a1e238d64f218f758aa9cba094a65627b96989e42a14a272f9d4aa35289e4a558f290e4e5a954f2902496c2d054324d26a7b1e19b4c5add6159965efa1796e114401024812008925c2481e0e869387bb4f291292a475efaca696ef9a38f9ec66314710d9135f820957cf4a2974f1b77e957e43b462eba68e4a28f5c1479a9749a4b7abb4b128be43b4a1f392bc7e8221ee30e99202d71788cbb475559510a788c4770c1115ec06354e1fbf98e1cd6b589494e94d63d47dd11a98d61ac33c658639cb5cef95a7b03d156129041c47ab980b149dd7e154969fd734ab357d72668bfef69dec18387e3fa9302042988ec30d49e1b1f5bb7736a63a761a8427aceef0c7b7cf06c9a751ed467dbdc7290ce60e5a849b6761a68d27cd8a436ae426acf571fea72b383d66b924d03593668075d3bdd9f0d798736417327045a98758bcb5488d4026d4ced398ea20e1d32bf3f95a50fcad1f38b36d8d841d1b46df0c3dadeea5017ec3a0afba385d8410c521770c439e79c73ce39e79c73ce1608df0067ec34a69d461d8bf45eea34bca9991d7bc6f8cbdfe7f933e9850d6107860ada980f16352482e8e373b2b85d9d6671a6a012a9a440402318d1a65ec2a0acee6363e4a68e8788e088de7befbdf78ee0f581ab4d824853689fceb62e42612ffe546468d0dcc001801c6c0cf4126c5c02ea372239b6a9d3da220a0ab304b0327c5b51718e8aad7140350eb4be5d991e626156e3dbaeb5565014d532448ea31e6204290c399578ca0765dd293fa5ac1884acb75b1454867d4031157526f3ea8bf531d7ea229e399fa1897d70e27dfef14632c7d7c71b3faea2879cdd8ac3d11914dcd457beea2e2c57aa26d448e98c71c6cd270eb8ab188658bcc569f4c705dfa62e0394e90cce8d0f6e9d6d6ec76aadef25b3e3cfda6cedc2a270f1eb9d1ff75491c32ed8d6f38eccaef316450ffd484ff114ab6806b1430faba9f3f878d76e88715f76f06f508fc70341327b48ded852e47d35bd0381c6b79be55bbefe10383e3eb807e2e32a700f16e26361d6b4fb33f18ebad4689a07db7a48ceb287c81b3beeb478fd1e2dae81ae2cdf2eced599af565facdb96af2cdfb353792e2c0a95070bc1432cccd619bc03fa8289f4c0a485f00e0aa2f86951c427d48ab3a86460ce9c825dbee1dda5658c0e4be6206dd38239481bfb875f6fbdf220ded5194a5f44b73d5bccb71cfedd2b2ca44b0adf6e90e5690d505943a1ad34147d8ec50f955af1a0dcdb36f3a8972b9f83f054aa7ab352e8a8d05d950a5f9c2a19299d516e2ce6bc71aea7ddf8c7a7a7c78950d59f383a75bf32165ff116cf3792b892a20cc71dd2353c0efefd68fb4b27e9e96860babf1c0793f58f837fa67ffe387c66cdaf90ac7a466e78cf79afd913490f0bbc9b7ff150971c6e1cc7711cfda56fd070e242196bd972141416a3caeb70184f83c7f81c1e7bd0657f83cb3c0e6ec4f7700b7c11eee371fc85c65fb7f1ae19fe86bbf899c3bcfb8bb7f1980cf8051e09ff5eb4537ee7084739c2cd1a7ff7139d7b816f81a762536902c78df9283f47fcebe5273a46dda8ebf570f857d00b3c77430ed7f9167098aebb315d679aae7bd37528a6eb3ed375dedb3d9b5f2161d566376800514014f067ab5e27ad9c01247a14914301fd45ceb4bfc81bbc6dfcf51a0f3a8dd73ef32df7f145b805be871bf148b8ccbb3cc6d7f8119f845fe033e0df933838fac4519cd6bcfcfb5ef92b39f9d518a88b75945f856185e4593516ceb3927856069e85c4b3701766bdc7b38a7896eec2acbf563d0f94b05136d6789f79fff1ea61c0dcc180e93a17666d985ea361bacd9ea91f3a407cd78192da33658c21ee2cfbd78eba588ffd4b475dace9740a994c2693c984b211f1abde85b1727ee800799670a33c123935533cc121837019535ebbf900f06fa3bc0f1608cb838c0015bc7f1bdc7fd7f0dabfd71be66911ab5eca56b259157296b2a56c30453ccd8e0c8eca8f0d776b4dcebe961698ad1dc6d7788c9f79ec6d5cf6d765fec65ffec4673e87d3f896d7781c6ee3b3cff03478ccbb3ce541ff3e6ff37b80db955bce732c24e9e968404f7bc3692fa6d34e9aab5e2e2b94a49e8dd148b99de35f475a38fe65e4c5bbb19925e9d14077c334cd37dd7c999f49c3af7a35bf4272c2820539035d8c1953b6db78f7d7d3c4febaca6f997f055117eb4f6281c8ad9370a2174f8c7fe172a350f9f2729eee23526e3422c1c4bc70f1ac1c7b5a9fe1593618cffa41afffd531e30ccfc26d7c0baff12e4ee35b7ce659fce467787e192ef32b2efbecb187798c3f1dc6af48f91d1c3fe2fd02ff46fc5be01f05c75f14e12e7ab81963ee14e16feef4706fd1e2249c8da9d8ecc9021a536962d4dd2a5099d780025d99eb2e2cc8c69c47f2028d3916e8695fced35da52a4b528e96223de82dfec573f997917fb1fcebc80b88ba58576942c566adc3fe75a32ed6cf7fe95017eba3ce6ba0bb8e05e78d2f2fe7e9ae5295a5259d96b26deb2c7ed55b21b1e7c9cee62b578592daf33bc9198a8b305aad083cd915c5a4f9d83d1e9c7d2c8a60e1bd2b5bf52ecc3a089665cfe665b36ada8673926e4f95bf19a6f277e545e56fcaef10e12844982b241676cd55cf48595d8cadc0629c2b545250ccf718af13578bb53251c52849a1629c4c316284e0f739cc46f9d7d37dd27299341f5f0b643ded4bb2adaf9ef6016deb26ab1e4bc7e27985615b47ad7ab4970c68af1dd0583daa4d5bf55e2b78d9008761d3563d707cda4b04b4170a68af166cebe1d3b0154234d60ab131d0ad062f8fd0ce060a851e30b16f68a7834ee1a39fc9ca41fbcc9b243d37497ab64e2244dbf12649cfd6e64d9221f6ecf92ebe9755ebb1b255cfc26ca6ad7af86d153b7bee54744e3e84b055052fd0bad01d52afcfcf45b27bdbea9e7d79eeeed660d34cbeac3555d7e836edabd1de570be9ac11421f7b4790bf13042b9da1dd864076e7eedc9dbb739fbbabb3f31f1fcc0212add6da16c651ff5e4ba1b3383a4316e668ddc569ddc569ddc569ddc569ddc569ddc58535eb5dc0e972cee7dae80c0cde7b2d126b96ec6c66207be62216661de6cc47ca7b75805c9d0c54eb0de495a0bc97622baa6e6b2ed9f4a66ffa664febfaa6b2d58ab4d72c85485368a3cfb67e751b4ba1b3a7d5b57b816c5a4bb4a9eec3d0e7863ae12e046265e313a18fde853e7a17fae85de8a377a18fde853edb8eb8d0a7bcba5067f4c95b105b25393b9180d27befbd18536caf88b6635ba0ccd3b79c911cd13948a806b22d0d0264d34bab69553b0775a1acd6b50eeb42dcc598524ae9b5ad18be37fd8485598da3d6b3112b038f58987522448a143162c41e3982646b1c18644f0b86a0be41ec89bbb71087bf5071a84193bd4b706aa3f04761b96aadb5d65a6b0d3eadd15a6badb5d6fa027ab5ed7741f0662ce82698d03affa9c5ca44e5bda397a2d6e9a4d2210297749e5b1c4a949a0a9191c13e469b8b20d2149a58dbd65e77109434103ce153cbc66e98b3fe00e8b45c846dddea26fc669b4f5bacd9712441495365d979dad382e0bdb5de7aeb3569dab3e7d192397f4a8b8dd12e14f63eb1ef0d7281ec7b7f8cae5b245676816ccfe47175e0b7e81194201078815417e8029dd7f67668de9c084a6a4ff042b1adad15c414b8ba219a033a043a04b5088f8782db0990d4a07a449ba03c2d218fa156944d03d14044b9eadacd9011832ee26c0c567dfdd3b8061f9b25fa8e9083ce0a813811e03186aadd818829cca626a557a7b431dae3e1f1f02a499253a4784a3c53a450a512cf14289453b284429dbc4424c2ec1293269e48d23c9924e9550a720a1e1b2379e40935050fea419356532929a64879e549a578a9295028d4140e7ea52c04f7dc2aecae44c596a2ced05d322b4fa69578c84b292f392d7ba9fa2d475e864e2a79794d1acc2eb93d79c94953343ede3494979cda7124b1a01c993cc65d86dc149ab41232e424d2f12ecd1d239197a49b4c260d66d79489e3b44c9a628a3a232a3d548650268edd2793e6e3d6908f4c5ae5d9a53a457d29890f7a09c4a249ab2538a3b1a3c7f60c893df0de417a764ada88bc96261fbda8542a9d92b3d2c8452413db93741a3bfe8eca471f9ae0e71d5559aa1eb4b090936f499beca127b9e8474e7e28278a31748a83b749a7e0d93436654545beefcbfee173080cc3fe61fc658cf5f7895e63683ef6fd34fe72aed56c145763ea82a3b8f6bbf6b3d908b6e29bf1cda06b5007f60fd39afb55d7919a906ade22386a8d5d03bab6c09252999b349cd3adcc2a1f5d3443a67ff4d3387fe0673f4bdaf04a928495437b766d8e3df2a6f6a4a2bcf887c6bac634c61697cb01776b0fb7821ad4a3b1ddf5d420bbbbe96cf1cb3a37bbd3d13a22b8401fd6e967e1dad561fd374050b83a57047667771054b980ab2bc88116610ce5d59f49c7505eb7b5ac3da776b21892907bb967695ab7b55f9ed2c67aa9943309ebd56acc3fba91ac3b7b9ad41ceec2c0cfa45fb54d5f981a05b92194d644ca92ac3a190cf90bf948f6028924d2a252e72e642ee4206db2d227d24364880c91213244864e3aa49de96432f95464ad694d12331544bb5418faa0c30f103f00f1589111d0200158640ea66fd72236a679a6a7716fd0e896fe4c562a3795784a65527bbec65a6a4f99348c3af9899c9d5a75af9ed6b8c81c01219873f6cfb34981136f4dda407757679dc39006ca1b126fa974c5f1d3a50d01b5542a2a74ce5e731428740417208102e99cfc699dc9f069fc969ed8148ea4907e4e7102b46b2da646b0470606f626e189c749671c023f9d595c715b0d73d2feabd58a6849ec8b75489bd507b4272664ddf5b9422cec3abde40ce54bee7f72f34dfeaf6955072abb4f91a0b295d8cbe98c13c76ee94c8a63c714a4b194631f69cc1d7b49632ec77ea2b1956357d198e9d85b3466e2d89dca4ec77e52194cb6c2b1cb50190bc74e43632dc77e83c6583216c79e0395b554dbfefc0ab1e71db281f273da15b2afcf1d72ea1293fb97dcfc21707a5776c1376960595e2f457b4721f6a4615ee965af5cfc33d12a2eba7c4e14f70917bf389ccbc559bbbe6e95bfba7b77e4e5b127ad56e472d9163708bedd74cb3e49794b5f4a473da667e9a907e959baeb4b7a96befa133d4b37f9163d4b2f79a72ee548cf5245cfb2743c723c7271349658f6573a1e392efd034b2b407474c0d004fb61b385a1d379736eedfa17125163e9513c3f0b23476ad996756e417a1786a4f789bc151bc56ad92363cbb441aac7389cbbb0abe3d9d988afc2b3ebc13e78c8e396c7401746e21b75b925637e949cc8e5237256626ed5c90a719dba3e25bfa3e2a362e2297266e252795a63625a22f6674545999d667f9ee472b15ca32223d20259206bc4f2ca929ce5ffed7a7c0bf204d6ad5861e2dcd5e524e55942b9899ca15ae7d31a540e6cda2acaebf7dde66ebd4449edf92a9136b0ed32314e03b7fc272dfc6be1628bcf89c25271b23c2754369133ed3a65a185cac2ca45c5c5b43a3bd67661368bbbdd6c8ab4397bde9cc9d64f4d5b23776a4fa552d523352848a5ca42fe94899ea1ccec04d628aa8cf94d9bf59417740449b6659d7cbbb05cbb3023f6ecb5beee96af3f3bd587e52bef56207bb65a2a95fb79c2c0b0764a885c5c31e62f6d169f6db90633f244ce9e4117c6dbbaa65279cbf5a2af9393fc24213d3dae93d1c5ead45faffc6515bbdd77f2125dac4fdf9dae8ca3ed7acc3372e4c464e56c326954165e1e72b19ad4fc176dd8e79c855d3731827ba8276c0c0a3ae3732a2a0fcfe73f862e56148a72452c8c792639ab351f318259c693e9fadff3931bf5181b39d2b3a7145465569daec4da276dc88d6fbac632e61f77eaf1ed310e3f61f2188ac73c17a6bbb020f6ccd9f3baa94bd27212b7ae50d45c5881dc1ae409b2e240d4d71ff7fab771820842e2d61c7b5e5f41d61acc787a7755a62b4aa7afc4959367937f27936a37e597c3c8d9ebc5cad39a570e6c0220e3d06127870b3b3f0217769d05f9c38f0d779f9c6872769e2f568f83e8d3c4462cec621ce6d99889e9068de984c1c8598ae6a260c6fc78977cf5345c66c6aa8c83c0ee4efdcee9aedf5171d863de8ac741b87761d75b9f6baccf39a7af4c340b95b9b3c24ddf03dc25e60e0b17cfcf898209af397d85b40937eae2f32b8dc9bec2e2e1c61f8b2f2fecc2c81d70c53b8c5461de956110bcf12ebead90362f1be3caa0b2e262cc6f59f2d7ad5b62a41e07c138728632f12d0bd7c5162c30994c569242c94e26992c3bdd9ada18c69ecb112dd7f675721443bc8caf90eb738754dbd7032804555bd66d8a9244c8876975c8808eb2d3949b244488d8fc36d0223be79c69f66c6d919c79d9da5cc45abb6f92181173bef856dc04151d0a1a013f1745eb634f5b2be8748815624ffb09819ef67e3db987ca6a8e5fcf3b2aab1bf0eb9987ca2a137e31e0d7738eca88f0eb19476555037e3d07a1b108f8f57ca33120fc7a06426312f0eb5987c61ce097c6725aae9d61702ed03014eee70386e082b60b3a711ddb80c6c0db0e3a8387df09f80571dbcea8c1af5b3ad3436c88ba0404847840107edd69ac027e3d85c628e0d7a4f108edac107b0ef9517ed6c70ed13ec4abb810ffc28378175e819fc129f0307c021fc3797ccc77bccc692fe312f81a1e819ff1cac41be175036f01af39ef03037f0127e28ff0bac4e74491e255039f13c58b9f3804624c7f008ce380fbdd016fc371c0ed0ec4d3b03d3646c2d9f313028d915840cfcfe7ca48b90b0b019591aa4061f6ca4840176663a4207b5a921748b9cf8794fb7c48b9cfe7f3f97c3e1f52cf06667f1e80477100bce936fcfb7e779a7ff98c3f71199f5d14f3080303b3c54a8592e6bd985f80bff81f1ce615e02e3e013ec323c0fde9b6d1008f3d033cc6bbc3781fbc86124af8cc0ece021490a4a7a3c1cb96f9ec0d608012bf8067d57e7896029e95806721e0593a3e3c0b88f56c6ff65cc4dbdc8ec55d18cef2fc5499073d460b22ecd52d35f4f096beb45ce5313d5bfee24ff46cb57c8677ead20229ac55d2b3a5a267ab05fe166b60d9f9eeda025b9ec999cb45d1ca388223d826c9b03cb748148a41831bf148f870398d07bdc6d7b88d6fb100618262475c1a4641bba405ba70399d48da7c4da83c0e0ee36f788cc7e1b177b9ec73b8ccdfe0467c113ef3a0d368b98dd73ec3cfdcc5db38ccd7f88bbff198a7a1877fbfe28823fc75dda4c1bf26494f47032438dcc083c3cd977962aaf28874f32b2436b391eb8238e2ce29bf57a9d993d4bba8de45f52eaa87eaa1563d6a4f14ca4892e40c74a9c614dd7217ef82f1d9dce6a37c4562cf5ecfe6d8b3664f2a6a60cb02d1d1b141ec4d2452fdaef12f2447041161baedd5abd99327e7620618af1d75e940b942f2ac5a50558dff743b2b87b4b94b98c4fcf517cb46dac0f63559350dc4fc01fcc51bc061be00eee209e033fc005ce67970d9efe0b1d7c163fc89c3780178ad394aad1da0003c7cf61dfeb5d3e15fba5a3b80010a40800108e059404ec06aca277fb23f9044ce74ca552a19555a3b9bc8d9f5dffe7a9aef572e88306bcf85d913b9537717b6ab3f3e954756a01f20939d2bcaa652aedaac54094a95b2d9186dd4e960bceb66e673701a7f83d7781d6ee373f80c5fe32e9e068779d05ffc0d8ff9961ff14898de73f8eb86243d1d0d2cf049788faf353ebe9ae44ecd3f497ccd5d18ee078743c6eb69fe6d40f900788fa7353832f08ef3db85e570838e1c38a4523b5dce743a85422693c9646ab16c3f745840489b6faf7a361efb1b1c34de65e35b2efec68b9f794c291751849b60cbe53d7f9da06413168ba5e3e35937d7b9b01f367b7a8ed77ad42595d2f5426e7aef657aefc4f41e8a994def7da6f752b655cf7683869ad7bba790dc1cbf87d9b56cf99333ed4fde6095cfe1061c5ce675e4c071633e4a0e3a70b821078e1bf3cb8df22e1739d3ee226f708d8be798f2351ef3d75f3ce830afddc5dfb0f12dafe1f299bf0187cbfec6636f03e34f5ce5b307b62612f0107020bed630e02b6ea7de2ecc7afe81c0575dcdd993562baab1c3f3e0e0db78fe99b3fe86b79e06777d8d03f1b4a6c603de738ebb309af71f36de6d5e9b21ae82d87c9b556b62c5d8e265fef232333ce66bb88b5ff90b19def2317ce5679ce5630e2bed06b80b0c9d951b50b3e9dc70a6dfbcc6fb0fb7cd78af397193d1892d1e8be7e2651ec8e3e9b06a9765fba103c49e377b0631af49ce504ed2878242ce524e7e7b8bb73183c33c4d8d19322d966bd3cc60c3895b8d19322d962b85b4c99bc55bc8598bb7903778c35ca42de30ecf83cbefecf0c285eb6c4d0c8153521a26ebfb581f2b538f79cf79af3971d3b5e0356103499bbc61a6cab8a2071a6ff135fce5affbdb70989fc115f0407802be01ce80f7c15dc2196ff998af7c0c677999c35e862fe01fe03fbc035ecf830cddcd8919322d96cb793f3916469382645b4f416263b49431a48c61867ff56cfc6b57433743a6c57295329e558bfd60e9dc1c66fd000700d1001d6993772d63bc053973f116e40dde2ec8fdbfc383bf7ea70777f1f042a707ddc205e3badfd5612d415d94a02fd6639e95c3b2fdd0f941013a063c8ba7850b93551bb7cbeff8e0ff3b3d78ccfb8f77d085e93bbc0dace9c1f4db85bdfc8ba7c54b4f1637e8ffeaa12ed65f7e4ea26832994c26132a888d8767d52eec870e901b4c8befc3edfa9a53ab3f6c051243561d9d079170411ad1fbfedbae17af173856ef173be4f400839cb5982c1816c70ecd4e870bb30e83ccc19e30481beea6e13460c4c490b39d1dfcc578f2da5b7ccc5f5ee6fed7615ec6ff438ff919eee265f88b5f398c8fe1b09ff11d9ebafc4e0fe0cc4ac6cd09109c31593595dab64e4b419282a48719ff3a22e35f414edc64b11a34616b992cd36566f333633cabb67a56ce05c31d3e1623672f1759e3f778c3bcf0cf08a36ff1dfcf1541169048655996655902027b568d95d3f22c1beb870e7d71e17a96cd9ef67bc5603c8abf78d35dfce931cfc277781e1ce657f8cbab788b4f71f91d04f8eb7776f096dff1c117f0aefbe19d4701efbb04bcf720c05d3b384b0fbee283b7be07b861e64e0fcefa1ee0363d7f0f709ffef9d8984acd0834a6b284f34e40652a2150b1a9dc622a4e38efc7793fcefb71de8ff378d6c5f35f41af23af15ffe22da1527be152fe75e3a984c0766594aa3841ba75951bf9f2729eee2a55593a6f5b91d3523adb7c560e8beebf5297cf595ac02f839f0f5fcef4ca4f0fbf625935564dc7aae95835db0e2fb3df5b99efeb0665ecf0e02e1e4c56ce0c727662b26aacda8c4b8b0c16d8c962854a0a8a0c5346490a25e364922183b5c35e99341f5f7869acc9d358399e9d2bc1c2d92008b7570b76100696ed858215c8c00a436c2cfc21128636568d5513d2d383db142509928f03d87a8224a238aa59b72f7945a48d26c7ecbafc46fc812290acc147968115b9186691c845e44c081bbd452737390f2793079e6d7df41b2d8a9c92365a93a157d246889ae486e2a03b344507bdd65a6bad96d491daa58bd65a6bedbdf75e0cde30c639e7acb5febed02c6f40963708914826e9207953725289442289b039d9a5934c1bf1e66497e453fce91bbd45261dfdabf94674300c796aadb5de91777978d6e211bcf1eebd99bcc9f8ebd91663acc91b9c7b397fe4cdd5349ddb9634c1310765e8a1d1c5d0f891367c9f83fbfbdcb272809b74709334da0de9a3f973420bd9cefc837ff6d38ef0d93cb28e644f64c8ba9a831de820eb423b21e22ee413ea09fd849810eab9b210d085fdd85828c89e4ca0b19017423ddf1702bab250efc2826c4cb485bc40636228248a31a031a228364163a218124551d4b9321da228d224883232a2288aa2b84365278c7b09ca601e75b1ae23ee6a30722a627cdfee0c8af56b28874d16c63456cc1b977bedd047ebe06ca51a8b6c122e79876210cad1175019e8d633eeca405315a2c1be2a9ccac848978350eda1334ec09e7c8b09c2a6b546556585820d81b0b53c467090caa3fc952a199db0ca150b0b98abd5e2427f46e59b9cda99386ba230a94e2ea29e6ed4abf84847940b593b2bfc5b5959b122b52275f2759f2b2727b62445bebf522527ac950a65227a915680e8e8806109f6c3660b43a6f3e69cf0aec7e787883d792eac24955b916ab9fc7acb7581781756bb3f2a359b8e3d81bccb63dcfd41198dc8196ba57271655a2951fdcecacaca53e46cd55ab14e4e5627a9b23439f9fb7389dc2237c8c4c2bf120bf3f22eec9ea9142b559232efcfebc4bc403f25a994ebc4d2a8d39bbeda2bbe5a59b1f22a4995a44e582726af2b784a0be77452d8930a7bde1e9fdd856128ecc963cfebd2e272e5ee4feefee46a2ab0c73d3c178a223c552e777f7227272c48afd759e6745240914b95a460278f73ac974967e1bf8849b4591ef32c4c0a1610d6f1a48ad898cee9a4800265bae93df5b8e43114580a1eddca4495bb3f2b257f7fec79fde42fd02d728ddcde85dda00bbbbc1bc4822a49c14a52299692d4cb687af7fc7af53b2b5ef23ba7eab46262e2c2e4f54a95a472acbf44ec794f2a282cecfee0d84ab74a398c9c95a430eb699c983232269708ace47756fce4775638cbe39ceec27697b5d22613738785b8024bc152278b1ccee5721768458c0b1897c8054a99f7e7fec462b192142a7632c5621bef72b95c2e877de80f0e7da0581d5d107dd05cf06b356df407fa2d7f507e264d66830e8a6e53938820f8d9cf18e37cb5b5dff87d18fa3e10f410fcb249a98b493385a8496838360f996ded05b112aa2d63d08644f1f412768010e7acb5d60af82d6e711c4551941d33715db416679b31feba4710acf8de7bc17b6b8e5bdbd704af082b01ab60e83487f2b3d82b5452423ad4a598452d7e222886624814c571cccfda2269b2c591588ef94bb648124d60e8a221348561479139c031ff698b271125a6c492d1164dc83d6e31b4c513707f7a874f6b445344115344957185b8023b45d9b1a62e180331f0696fbdd6669b9164190d0bb34e83f6c474e8819ed6451c57f6c385d9206c0f3446c468fd92b31c72420eba256f74e84c803521ffa1da88a0b1da04356bf8350634c6ba11b6262cad2f9880a9a1348656a7b031ac2781c262f0d5276ceb655973b6b43105f62db7c6f5d8d72b0c579c0e798d0195ed504deea83ead7708da28e07a2b8d1b306034d05786511cbfa5fa42772beeef4f6519daa328636321a711fa917633e09269c622eda1befbbc32d2840183cc4508557ec3827e611766e2b031ecd66f0080ced034ec696574b6d609f105b4592f515efd819a9c81df97f3282a9123936357b5acdb18c9f1b93398733e4172961d1c45e4c8c54cce40922e774c2a13a9248dcad1939c28f148ce48939664a934f22bf2d0c8a422937c5a33527b86b4d3ce0da3cd9c030174c001a1c0a8344c58eb92d42945020000000000a315000018100a060463d1581ca8a2e43e1480117f9c54604e184964598ca3300819658831841803004004406666441592259a8b57f7a4033afe6bb10fcaa4236fb53bca081e2e5d77e53cee8575c86820c25429af2228dc690d81ea05b1d2768fa6383dbfc10e25b5d72f0b49ec9ba9874713b9e7893f9f0bcc7d4438f503e3fa27bac62e6b8aff042ccb0685232650b23a0361dc20befe7fd24eaf28b2a05798f1c732e6c93cb90a9664e955779b447bc68109879ca9ec7e6f558de88f2eb7b09ce44ac418ab78523b62bcaa198b655867774dd69068a12f87f00e53f0228965d84e1e22e3a51ebdeb405c00a75c9ddd5c26e997f22f53297e4e731551ffdbb73254051ad69e424b011e16e9c30938ca0c53d85d7ef8ef251b0c91ed4e76864c69e41843a5da8a6765b50d5855d984b8a75179fa58abf26e8930efb20b752f1d83fbe84edb71d7d34e29b82b5afc6538d5a1dfd887d4c7ce2bbf4b487cc30bcbb7a34e88a0b8d44f51e3426255f8a6cd22e5d8032f949557db04af9a3af5fc42be425e93621d25d9de46b587a5b306b58e99102cfcf4d8df49cf0e7ef0bd9ee23f004b0f2116fca07f0510d0c61284e238b16a58c81045394144687563d34cb6f65e33362e6c6d6e76e43f07a4d2ee26d006cde6f5015b16b14f552bcf2934a98a78a98242bb520e260c0c2396f7d1e886d1e052605fbde5b0c0e434a970ef04af8eee0ec820d12ae11fc4c0a78395ca5ffce85c2b1750bee50cfad7759e0909caf90af239f4d016501986010a6313406e84fe0f0f57ff889837e23d7afecee3e3cb452b037ce7bb8d527e7c61749242468f0dcbb234a0323ae24df2d01ef3ee46a0db3ae7286e62ba5001588ce6d6fd380a0ece1dde5f62360aaf5591ab9ed457376fc70766d080736a590a8eca06a595836100bdc2883772e9544f2139fce52e5801c1c08677f32258dda896d1cda21eaa515695f2f653f53db0f32e17a7948055170e80dbe394540460882ff5c02fbd0314e2348714f432e3320ad0094823e7fa434f72a3d6f3aab449aace6e2a82ff1510a3139b47d5ddf029450098528c77749330cc1d08c946368a1024590cbb65b47c3e7f4f66754072e2c940b4b3a5b757fb39f331677e733c1d12a43e3a763e3547c49363cca3e795f2e72fe74381ee091643e10c9c82fd87b0b7235598de4c2ca54ca0ddc7f46e8e12f0a7f63609692140e4645f689454f02664f880791b4df1aa8ff590dbf17c0ecb6480bbfe069efd8e42c47b6af6270aa28241cef74480430ea5ed9531878bd9903a32e56ac1aff42030149439864402ad15564e5b44dfbd094c3bb5e1d3c5d2f5740e0b20fb232e1ebba2d576b7701da938014e2e9f80215ee77aa82f5e5137c6cdc2c00c5d222f82e1265a797eefd9bb716fef851259d4b6ef1a8bdae438d1f8c1aead1c3338bd0872b288b00b27ff9150638a90060814345a4c67a8a646fe65499208c9a887a66fedf36d20e3389b1fa8dcec29a81da2f7ee99722b338501be1bff60848bac82c82cb4850c798440ee0e43488f47fa2ffe0cb8ec9198213c1e41b01ea7cc4143fa9888b3580010ce993940a7044dfc2faa2ca4f27f69aa01016b44bc1e7a2a003b59c414600b229bb05321a4c2b27cfba7f0836b1e850327be1ea46dc3082db145d21b688a6ac0c4edcbeb4b9260f467a58b34f58f7c7186804ea66ca568aa8f7afe90008584e61effab25879eeb18aec23ca973c5907dbf013cbe4574abc1ef82dc83a476733b8f7f1928bc2958817d71ebcd876bd7b050bf464f15ca3cc893afbc89af16c8134f30252b7aae0dda6082d333a3adf7defe8cdb27252853e2de845f93d26e294921f8a57b83ead99450bb55f02c90891020615e0b33c4a26f203b3b4fbe8e2fa84c08c93aa8dffe94427676ad5f968dc89e5e8b63ba0b8f148251d2d1aefdaa9e6c8a9d3feac9ed1e0c7ec3720cf38975126c48bed1a663a5566ced3b7fb47ba66af6c6b40aec3b25737543426badfbb199deff82217c700ba2e6371085f9767ef5fba50b2e552743f0cd058036c7f1804d06ff446b086ff067e4287cf28463d1b79f639442fa0eee1196beef3d7dadd2a7d4f733677f2b1099ddcf1cbd2b5311db5bd24a9ec6eb1b0b203bec1258925d5340b26191d0866e92b0373438ef9d62e98c8545dcbe08de0dd0788fd1d31ddb05d4db0603e741add328c6f161e6c12e60ed1492b390122ff6bf85154905221ac21b9bf2d3314f73de603160010d0d39ce297608a8c1196ef64943394b7e7817437ce37713f81c212aa19b2b4462faafe1d49669d88e26293e418f1c5aea65eedb640fd25894a8a28a00b5821289fecfaacda5129203265a14a2020080670a87f884ed410789a481442f5a500b0ee1787a9bc82737b95883d514548098741c5c673bf6e0ea381c00f2a930d19348d2145235b7bcbaefe0701b0d52587198280953d594068dba4f7ef41f9142b5911b6bf113fea89ce4c73a74398872572454f17d1c60ca9eed74c237dd1da24a6ae03c2b57193d2be80756af08cc2034c6fa6b07f08123aade67b9cf833737b7fd3a3418b919ae8404a769edabb7b56a99b162c68e662349d97ff2616eff137f5c1da270fd4483b9305163225b0efabbef41ff717950e10fd02caae83a3a51dcafe9d8781821391baceabc32fd02045c833a9e053f21121bc31ab8b780962b0b32a5bac0a6040369e8a20039e62489d0bc591348b417d92140f220405788d60150493c6f840546d8d869041b7ec312e543a63e4cd39c8b41f30abfeeace65beebdfcd9d5ad43086719b57a9757659a149af79171cc4afac65dfd3b3e0a462fb7f60c04d950fc5a03558929267821243d6b48aa2dd3453231a049e7fefd717559c89b817a0cc58f90f5d4433e6e0fe66ca6e1c696f147d4901737882b1697a8c1008e7fb0060103e97b699143d4ab05ed64f367563f92577d6f51fd3ed7d467037d3ff1d3846dfa6f82e12067fd7b50d2555f93eebde7dc9bc2198f82a87f418d618f1b8fe01475f7ec470e2203d447d41f1784b8f4a27ecaa9d47ff23858db2f4ad108a6a95ccfddd44f1e4e5d2702925e1f4288ee898b5f2508eadfffa0703d76f0610b336ce052874b784c4358f0e3df7f0d4ba20f68400722495a949adedcdf75092640dc1000904bb309fe6839d3b7183e148f1c2dd8ce5f2dce0c927f60eedba21fae92432d763b12d757d89286e39307d1a3178086e887437566df9a1cce35bc5f0f05a7b2853e8700c1ff032a01f992ad9d737021d3c0bceea178b0a40003d9ef94a2c76c5eefa1caa4657ab4ac33d6aaddeb704a4fde5b1a439dab374c8f856f5168afe2471f6bf4340a9e85fb40c07e1a1db6cb372bfdc06c64d736a49f4e09aebe94f75ed26fac66f3e5b36a39190ddc4d1eef74efe5f62fda9ac528ec56aeedc3f3c4c95341736c9f8a095399b775fa6161fced97cc5a7dace50ad14a417fc7159ed0a15be3498fb22eb68c5407f838281b492110c516cfbce32f74bab36e65819e68fd4914ebb3cd217f414de11d0aff809f8343c684f6447a7a30061201f38f260781cd3f7526245dbf6902311134ca701d307385fb7c890c90345360f89e8ac9c7c02eee8c133616207d0fad0b1c107fa1d63313a17508c1d5a40f776f6a3b58975356930fda99639cb172946c513b651d058af7d496ced03c8191c32fc133deb693967fb5bdb23b007733402e4b115b6ed94ca62edc4160e16912cb0112eb583df86fa247335467e3a942470905ce0cb5bdc14c5078349a499cf44dd8c8592255c0144679cc69ef910d6aee5b34cd65aa0c67e6adcb342b24f9d4e3af34569b264c9e83d0c632dbf6590860a5369767064a80eeb15d057420289691aad427c637350ff81636982495993fd0f1a45a4497174e9e4b65226929cbf652adf0be7d5f0f6570667844031e3e001353430edea862007e24c082c898f4d1e7473287863e46415aef8a668cdbe2b13f2c113a83434b2ddb27cc647c31eb4beee4990b4ac8e43a4077d16e05a0e00a03511c41bc858235c64a23826a0d1e150b4dd7cc50be02045e3692e1a96b9a9538747023998424c6ee5c6f30d8d85e936d42a6a4e8d79e06fdb79991c804ddb6326b3de4bff77cefe816cc51269eb80920259e12012f07e12cb95be187dda98224fc13387d8caad8fd90c998c3f877e9e2940f08c80fe86fe60cb06967d6cefe32a399f0cd9dfdc83c46e595852e3b38d341a9bed51e12ddcf32e09c0289827d373e900a07eaa8d782bb3a0327624d44756ca80b64e5af810b91b427bf71cca900f6c7a190fbbb004659e3da025d6e4a6e29a47ed369d5ca5b87d169a734269f64ddf6436a4677f735bbc8aad728fb319dc658b62782aa84c1edb53255bad96103471963994664b23ec3abf79548696f7f38b0709f4251535bf93986d613c6f06da760bb185d018200d5880791fd0d98d0c5bc88677175d3eda0fa4733c001ae2ee672fc13b15e3cf1a8d284cd3fe3102e5284dfd67b4aca37fa31b2f5cd028169e57226a3003025d3248f36df8699c9627fdb50835d68a7a428e95a65319c637dd34602bdd9c6015731e614058851fa9249ef3425bcbc03e872db118534355ca9558c02e800500307d7fb3217d86d94ebb207bf567e7b8d49fe40297905df3c090f6b62c2f1ad2d3eda6fdcde6f603fd065609218d9cdf6f9c1fc3556f5485c7cd64c802ac63ac043f1152394566a195faad3af8639087a7d5bede18a3ff2229f3792467cb9ca11490e40ae5b9830432cc0a3a340b95a29549df703e2ce351605e0b43078d13f207892b37fef4f5f8ccdf725a35d9608b1cd001c16efdbb1c81e4573177a9b1b3544f14b2c9878f9486911507e8c1ae6c46955e97a804afb2faf6499d9ec37e83cf0ebbf84211926897426454923391cbc504912b61b05eaf48a0b8eda27ec04f42e66a6f61f740c77e7f745f2184b00ce12e6106a0d1ffe62085af08530343723ce4bb333624ef04611a81f9d6c3327f6a4d508737823efb3fd822efa144a84384e00554980e1664afb7ac98a2cf2b279d75a5215fdf5fcd19036e50b4be61c4f0805b4515ff697e62ea04ec79064238dbbd2fb671d2442bc951b6748a78be6250d42dd42d77f19e5b5dd8cfb53ee0d7e1007e87a4aab7f6310d6f32e947ba51f02016177c9e913dd70cd4deea4828d88ab32b2aaa026cc991bed0b9c419651fe52e4d03a04edb04bef2bc04df1c6de2e15f55375cd2c48f050f324e88b78dde475b1d11834474b4b4e129c0845716307b037b0d0636647fe71ac96c02d6e04d73d2310f2658d7b1718c2ebd0a70f29e13d319715a71a10b12f4648c9ca1603353cba5e3e93927356b58f4a9090984d91763aea24d04902beac2702473ee5b96077e50adc5331717a48261e5814b57a5a4f0b46d914e15d46589e2800964cc71f3f37c1e071ca2ff4b8d74c8865dd2bf78d4730c8a6f48fb0ce7e523642e6178c254c3682b460df2846a7c7151d758d34a36c3731cb115cd9ba064d4b57838db09303c1ac02490ef60272f4ba309db5079729c13f04e00fc296ccd179cb90c8d93d12c6c62881ac18775614738d8d453e45d3946c1c0d7e8a39c4368fa59318d04248ef3da64e748b3f4a161d34f3bca6f57a6eacab7f8b35717e993452c822799e6ebe86f263328a6282e91b086ea084aeda8dbbcd8f6cbaa8c5c1bcb0a566805f9b0b1ce15de50a19cd0f27968317b3f51fba2b0a9ee94339bbd8e75d7ae097f8160272813207723b0a3a4fa4fee659422a74544138a6ecbf6b249028fa690ea8bf65bafb224eed0b1bf1c1d4997fb5d3b3b677f1098ff540fcfd7626f54de5b90adf1043cd5ed0a8f079755714705c365a0d317eca753c187e98095a4714d34554c3e729faf882e2fbc223ccad637d7dce1d407f0b0806cd6384d3d4b436ccf20d6c44d90230592e408db9cebe20a5db935ee0294791c70c43b56b550833caf5dd37386acbe2b5e07dec36cd6516982642a564cdef6f7888587def5b3a3c37ff09460e12d741c28223b79756832f546e6456ab32b9bb051feee9ed87e8545d2687baacab54661745250916087bb890421241442e6a94a0923561525690bb2818a412e940ae9afa0514794ee6fbba3a22a92854311804b45b623f2d48e1e6ef8ede9c4c72a0faf1c0b1d9ebbd29936e8202f5b63a17bec2c5590390ddd92c734abf90417ec75eb02e2e0d59b3c69dd65c732d245e84673b9c9ee8a84573c61134009e4f662c38fd6aecd97e1549f74573a2c86e1bb00900f5ef3456dc52fdda49c052c151ab889c220a0d615e7a44bdb64c00b149a16d35e0d02149bf885a9dc9e6ac1974811af456e24c1a6ad4c7e8380a7677b6319e1adc54a88c332f30d59382157501db71bfdd0e62fc582d93d066448172a68ee112ff58a76090ae8938fbe4dc633b2efe20f6d2fd6ea769fb785ca077b12b766cdfbce02d1993cc3293b27a411d2094197be1d2c579fddb8cfe2e8d126009ab67f3d80213ae13f172e009a1c7749eb91f24b327d1ee371910fd5f86b266d93e70c10ac578c61496f9d287900a2995ce3f311f293e30e6e14346d4a80ecc30714aa32f24e3d73fcdfa4378507dfc627d067e353652cb29ae1fdc7dbf259e8d759bdccdd4752ec884339055e2387a9a1d4e54b21a5359c1b94b687ec29f1758987bf3b2e7135f17326a07fdc28f9897a12aa69ea28f90124108d8f32f809aa92007a27439b649ef1cca04d8e2ef9fd962d236145d5ffae7c9bb3cbf39405d02ecd4fa088c3029ab7849278d1d1470353edd0a8bacb1b6792e5f9bec67db582bd9a55ecf9dbc0e92718f208875290326896ce9da9225599d1f741ee0a7c2c2f2315fca924993f2437285a0cdf03d385d30197c85e6a47963b165e428667658b6112d60fef5f572af9f058486ee05b5c2c2e9408a522a38d556d7c2c23e08f81c883cd58c7f0b32d1a28a7fe0659d5f6fafef3959f8b60c9447d6a3df9748827e3df56c9e3627a9026ce110c858dbb4640056a016afec433d96608e0fc3de06413152f8f58cfc7aec07617984e5da647591e4d4efe4a13a98ceb8af5bfb8ca8a844ed36e4e5f545aaa48c77efc45c11544b4966f42414617110026184c2c88dc3290ecca29f3da15271ac60df0129447f1c46671e04bf63744f6c46ddd69064fcbf40ec56502bafd85ca9c6e248e113e2d6c8bd0439f295be0cdf6e54a611b38aa99dc4ec55171dd92b525145a28c3b81f273ca24f1faa59bd1f2b2e4eee35f58a99fcc982762cd39984f56dc64a867061f864b1ced5510e010c34e5a4baaf69c769e14398922653ab79338ab79b6c55e29911e3b2100f10968ad82b851060d8996b44d57ac457b8ec48521fdbb32cc48787f9e5a4a15130773f90eb32e0a016dc30c573d6294f090edce0ef62aaaf2e10205f0f0788bdafba59596a4abfbd589e74471af987103a03a860c8dcc6ebe2f80c154d35faf56eab0bfa3aa7ef658ea54d3be4d2deac2da559f2917989f6a21be3061a32208c90a84bf5e5ddb121c25ac31f296b682bd52cb3b8da51fdbb1aac1a08e40bb8e22dfbdd7abdd213773cfd432d77d26663b145f31d3cfc5ff9f063b9e755921214c44da4da48e640290d882c32bed62ac19187e031a24f362cf6b7f709225fe13c5cbe6464ff0faa08c105188611d8c1687f7a3eeaf3f5295fc1458e5ef0f5c626f49702892813b8fdafd341ecff8649476e455178a247b45b2ec6047081f44e9476235a623579484350eb607f70a94501802062bcf1e8680d4ec99e525217bc5bc99993be60669e16b4cf1fe727d53de20d13ee4a5acc0700ecf4fc128b0b419ceb08a63195da7f0c138449f736ade706b7432ed2284d70cd6195ed1fff9723d0cf615247b029217d40eb4b752285b16778216d4c0dbbe7ee502b10211dbcfbb6aefd13e73adc5d1eaaff28000d22eaf1e4a7dc88c58aad9c51a6d8f0196264391074490d34dfd818ee6dbe9973a5c35d50a36f6eb686d49517ab6b0fb4b62e5003038a50835df422c60341de4429adc24a9302b9463bfb0ba3654f983d020aad14882eb1e0564a2fcc4f5ad934d19fdfc660b3a3765c003ea14290c9872e7521c2b708814038714d5ecee5209bc18ecfe931f64ed66e55bc848f69c2f8398a3e687ebcd95aa0b648c2588c79656661f6e0ac0dfdafb177e00d4a380a30dd765b6d8d4ad041d441cf78c0bd34b0d1a34933db88a7236ebe05848144c7406be1ef695cd3029841402e2f121c0e26e4760bb8b048a52f2c88ab340ce926a7c1ad76b87e62cab0625beca5f319394e9a82c5928ba655444ce547b72370e68e280b94ceb017307929ca49f61dff55755ba5b4160e72e222b077a3486560e805c5309af8b923160bed33d081e83cd566ed99f4226527c21bc40ee199d3fc4bbf0cdd61062ff6f3182ed63069f45e43817584162234bd9440e9f40b593bb48b62718554cadf14c4984ca3fb614d13110ed577854bde69e541b3e627d5e8e426375521acdea8b132d566458fcdb20564f4e44c52283f8efcfec6db34d02585c1dd31385d516f0f1aae38b7d34f8e109643001f020f2e1d85957941f5974d59ed3a4477924286cb84c5ff4215a883cb9745bdf4608f36f0280ed5e276648704218460c09c514ea83db780480740054a508013d03339d0cb47ab416882eeebd05f34c7d5cc105f99323731d495b1d1a7209c11aea5c515c8726cbb3b9950407cea7f6b5df3c448f65de4ac4a7cfcea0278346890e098afd93aabc072e2963d4d0701613a4581d37253112cb10c865aeeb489b94114613336c48c4a8021d5656d2d01236789b1fbb8280612996360aeb444c6850d46e5b41d9cd2978e85401eca92bb0ba55767653751426bfad2be930a2033ee8390ac59061a4dd5d940fcf0d984c474344e820031ead02a0c41172c9dd4a70a5ff8e904400ed4ed01780bfcabdb790ba840d75936b4d77547fa2caebb3f0e80b499da43066280caba1e7193a87074d7592a589d87d211796f65ecfc7ae5e574c456e0adcd176443597b817d61eef9164fd611241d01ef5be5b0a2f58a98c328ae1cf439f81f1d15aadada12e55bcc1a966160b0fece66843d02b9524cd3592b4b2ddebbf663b64dc87969f679673e5c37e5355088e8a4c85d83d12ecad6c6a5b2e8d760c7e8544485df5c1738e481fa24f7c4505836bece4ca3ad31422bbc48e32a8df5b20737a508e8c7db5401ff4f90c13ff70fe11831ae42af842f14c6a7fc61fec5342941665787dc95ab215e4aaa48187e036c5c452002a61cb46f3b01d123984e01f52e091218f87804d201bea784d6f096cae611a864c69e0d0701a09ca856d5376c2733d108b3d2dc07befcd753818a8803a2bd935189bb3fcd871a08326867cf50b9332ad8fd8aa9c09c5d287f239b1453f04f39e84665c7019800ad90fa230c8deabf4377e1fc52f53509f141fdb60737f7c2e0929c53e31d7632832a0e67580124fa55773c26a71b13f478cbc1db8e0b56e9056ec632968078d2446c4834010778e69023064b5b373f70d659e85b11dc8cf45b9ae8f4510c55a6505d64d1b6b99b023a5bfc43e1ff0392dfc0ebdba1cdff2401a4617e2184cd154622732469f694e478aab225f3494ff35444c797819f737ba66f56f6b4ce80b520b4f259dede501b8fbae030160ae5c04936f26a834a7e240a4dcd736d00e0fd8dd12fd2ec3e72f00055e4a5539471c651c400e3f454858d0948f293f01ff52a85d695bbf502ca43d16d65e0e328b60491a14f7aa93c4325a5fcabd3cfe4dff2d6cdfb9c0f72552680186b021ab11c3c5e865c4f35840a18e7c38fdc0aaa642ac53750b20c4fc500645bb37faf12d9d9d25f2825c46393636934af63be8d3e2ed8aec272774bf9c72a1e45b69c1409f4ce537317aaa52d9fe535b69d0e00fa7193401699842a453ca243b2a3ce25706a0acb219d5039c4e861841f322d98976b60b96a6f69c40bcf615f797bf6b7c5a51c368463bdf4e02b5b3b4b26ce324bdd51710013ce0d59d3d96f41e0e20f12633ca9390f90bcbf2b8cd17b093dace0efe00fef4961decfb22d3220ef95f530f2934ddf3200beee576798f1a250e66097b7f320194a27f3846384604c2de92c93469f1603c2823f61ac456ee0d5af0978b9be6a76316c2f1fe3227d4236cf6cf9ae5f37159afc503d108e301277b9aa127f0a07cd3043cf2d0a7e8417fb2ac5c4f2aaebefd8f76003671199be0d499799f3b36b0759e99629f9b624d9d404c7a9b272c9b902898b1dbdccd1cbee03ecbcfcc741ecf1008c23838a197e5e22c907930d72eed60bfac215b31f79439bd841623eaf6090ca9da70137359f0fec0b679ce58748bc5b5927ab725dc5ef38ecdec890dbe322877e959754897263e9a1a392ef52e1085096ce3c8f85d1c276a229d5e78016c1004d0507423f8a3133c0a73b987ce86bbb16f58cb37773a9f4a3142816dc28f961c0cfec5bf6f73e243c69d51ef71d82e2f9f3380bf9264b7b03ecc4eb04746804ab7c815aa99b1d0f569da11b97922844dd6939643e4997509aea8c4ce89ee4016d568145e7587a82fb41f04b2588ebc4453dcf529ac9702f845f8c15c3904775f00588d9181204bc51136c90e890061781024c1356600cb823b7bf1f8b93e0cc36f7823e9bcdb3e4664677c786ce6a6d19c88d9418b9ffb0c39a7b205a3c230b05aa486f38480a39744c6c9726821e6c97e1a245cdb8c9ac93a0408af65dbd32d6906ce484200e41ac57d069a7e26efe12385107a5acabf7e2330f819881b790f91844761ca829d3f323e38bb336f1a31d248f706ab9972d315530abab6e1f2bb9ff9fb494a15d9b06c2d4d60cecccf47727e8cf8d15e7922c9e900a9a6a5c3f94e6cd9893f01476cb3c3c843d01860955a345f7d7a2dfaea4b5455a2021edebea1b411392348e3a095e828e83dd6ceca9d46a412d04029c7a488fd2770dd3a13b5829453b4a87ed17144cd2b3d74580124c58d6fcde10a2b3cae25de0dd4583710ab83171d4da016424ef15b84e798329d519001c17ce1e278b5c293920776da84d91bd8a9c9839278c726cc0c3c9b9bc95cfd2838af164e0e94b426be6069df64ea08eb391cfd408bb39d07500109485adc4cf30d98d063c8839f3bc96fff6870cacb310407880654c45906c3694be995af5cb44f0c21cf3c14c3989f45be7c4b96f8fe38edac77e51795a37858add04f47aa992a33a371b83047b6a07a34cdce8388630e3971bf8b17ad4eae6e45c2d6d595887436281755de38389f4e1d471cf9881f6a96edbf5ed0894f6d1e032d097eb799fb4b2f84fdaacb17f17b0ec8e23598cde2b9071f74848a3d2e0a1da1de8aac5872c7441156e9e0f35904632d873583de6a5245d50cb5c9f8d1de64fa6e5eddab829e4a815c36a839248526eb8569d11aa62e001d2b67e87ee96043845e13eea1245c351c116b40932f9a8ce39dcb78fbf17d25e601b9ee2784973553a336970161413f6881268424474c7a7fa620e18804b76753528c08062d6e15f1212eb09ca9a28cd2d030655c6cd75605de3dc299e5c8613d89fa491c4fd3b8b62ba846981b6e90bfe01919426177d3eb9949bd8ebd32ae00a20580e0a19dfd1b74440a2c66689157962455913302063ce3bac72f3a7a4cfc259c4c6184a5eba617ddd5e5bda999cc45ecf935c1059735239bf1d802b0ab89657d0c15088a0448a16466741663d99d06d234be1db32a55a3d3d9f62704563462d6f7eb6ba16215d8fe6610e7d7ff6c6fb4706a52ac1c5e648871e7e0ac9adac6e6a8e5e1f7075e71c4f52abd18a8c80593d710eea2c3be6721562fe5a132cc1bb1a54d0fcf95545536723b57f471806aed5055139b487d8c70e23ba473e78f4d448e866e0738005be36bd553c46ab2bdc414ea42cf8021a77c2655db3e17953cb98aa01999e6eedde5f4746e25396940c5a5269fddb32547455b3d6c81abb81c839435647b76c20ed13f5e13a4ab398c0bb5ad06b56282924448d2d2f5b04cb6c53be01f4ae0a7725039a45d781e89993d379045e539354d1f90739f256b5bca3d53a5dd75992e5d1e4c5b8246f85b3e733e55eee13c0470c2033a2230dabda8a2128858462b1492b3ad97278945508e5ec1385192d0a114790915183af10f99528664fdf13bdf3a62178613802a5e1204fb05e2b4a3c25a65ebb1bf1b4ec729f6e9e72e8d57c8ab5475be3bc391d478fbc1fe70f0ff030bf5d01976239399c1134d035834cb86c121b24e0df4bb86d59ef35725ec499563ace7d7e8403d73f57c0b4a0fefd1057a5c0a089da7a4803dd1d7bcf1b85c6101e9a94268a14fb69cd63a8bd69c68a91e697e616bb5cb5af0dc263fba5a58ae0c0d46921f662a5d7e2094eaf2818b65990e70f0ede1be7fcb7ffee2d103ce2dec891e29bfc3c6f52900f56299b7b1dcc86689a13e58e8861f3a697cef515b753b113b28769ab7d3110bc3ea62a5791394990667ae1d68698d2d6359329cb009dfe34546075765a118c303c462dc0a4c88e98f1b547bbf518de18c629e4edfd530f90d8dc1dfaa19007c3690c08d2d2278b2dae0a0b1d67deb0e79d3f0a730d5f98cd9530be98d9b62db87d42f704b33972554ba6cc6fe018cc0801fd1d8a8dca2d826dbe30676731f6e973151472963ffd4526fe50d926a6ad16f14b100d80d0ce5ec99e1a35fd9c34b8d7f767f3d2d2db679fe81cee2c98a51bf538fd8d8ce24e26f9dd5c528e9ccc8997fd6fe038a0339d2b9d495b839f297f6a233008a5488264d32498a1d714a01d6d65795a4efff482b3cef05dafe38e167f4105306837036552f9eaf61805aa6d0a61d7b722ba6400cb601d3ee6dc00ca57db1856b876391fcc8fc2ebc6df9a210af6a4ec1bd24dde981410324cb3d78b18f60f92a200d5e1ad1f7f48fa54578d3b2f8b0c8d8993dd46d35df94cebf9130c65c9a09aba7c4df29dfe62953d32c846c4085bc8237bba53846d557c058c5842755e57d1128a31043a2faf1288cd2087cbd28fb20a2ba0b6e33a135373626f663e5db53ab2dfde88e17fcac3fa7f091637e73c89f42d5b67748fbb598296190768bc35052097b92791a50dcd3085d356d6da0caf01df1258439dc6c9e78b66616c9624e8151e4d9244c77e2dd14064adf6a6b3853dae13be728749e82918279e3390a9d07b6bc3324355fd2be368e459efc0004680ef5f0c80596c8f19624977e404fed426535ace2b12cd495ca0deeb8a9abe7849a113ff0cc4186f89a3dc27739676567a2437fe6f4bf6a1a478f7f1bf0a89d19373c6c79f05af32135a9477b30f74b0a0114c2ca239f891ca34a00e5b71b5237ee505b80b6bb457b8673d3f1127249d4fe619fce582a628ed321894a2aeb9b05c1f884ae740fa76193dec2bba083d1a848675810034957ed0dfdb95b3f9250888c0038048a6248054e215a1c4257c00dd2228a20a6b785d70a6c675bb981ed86e1d1243d9da06d2bd6480126e76bf3a53553095b9f821805a502f44e5d181462fa6d41ddb383b011d9d75b70122440a6a948c13ad257fd0eafe3c2e4bb85954f85745b189373014cc6dc5d8d138596e3cebc414ed558fe3544c8967fecc91a7308e24771e8735ca0dd11da0c5134de1e274c72658da0082624a70996ea4758f67750c2889abf0fd8428bf53d5b76a88a7b3674fdbcbcf80ccd930ab530c988bbb79ee0639f9ca1636897db83dfa124b78e2970572527692184b7429bc549d38f9f9c8d08e5614941c7763ea4538af031a1186d1b20b4befa56ba13e9f6150a8c38b7a4429ec764323a004d8b3074c290f8bf7634ea90b8f3d6faee06ae0667110c1b60def7d063d94107b80927e8aeeab650f5f80f9473cda63d11fc49ab2955c25b0e6958f7f2280c707c312d163ec6907eb7beffe3617ed87f397350bd3ce287d57d260c5dd88e64837e6576c45cedf95215429459638b989b4a259d2851de6783dded7b5b20d1fa87918a8a210831ae96a94355d539f0b0f14f2e77631e3b31da05e4bf4b93a393676ee8930fdb579a42062f8425878dbeec3b760395969e5516ec29fbf083308e604e3b21fbe8721722aa60e1a4b67510793ebb942731549e45e377e64aca6383758e97a4324bd32ce43fc1e121ee5bbb4421fb5452f7c9bc7357d5720a70fa84b5f9ca5026fc1f5d742d83abb85e28e283585ed6843c1f8a8ee1073a53b1d7ccf8660fbe0373a6fbd76a79a68ab2b05a847b27332520b20d830860452ab9d2f103cc098f48568366517b9e122553ed727f4a270ca27bce2ea3cb022629dc97f32f4697f9b90236ac73d1e10bf30977999e81407362f4eb3139832b3ab3f7db8fd95c6d240501e74445d0e79231c4365dffacc83bec1c02aabe5b1325c1696649253cefb606857b6c2b116b66e11686ea1ecd9726e845880c474d0bb56cd7429936218013acd1436e281ed753ba036449ce56d42d3636999d7c768dff04d81158dda7d2e33d2052ebe4db34fd6da78e96684f3823c8932be1569642a183d848abf348d8991b91037b27b13b4de1825e05cffb7f16ebe7149ec4622fa023445e1a3f4cbceb64fb20124afdb2f0cb9c472a3e7bf10d8f1d78520ceeba065497cca503cd009ae428cb931fe3f2c08632ea0bcecafc5a0ed9b92d71c89f3529604c3c1db2e553a911e9706b694b42b819d450409052a430f59f99552271d520c127afe3337a595b4907836736c88b8dc54fa717d69a16fd9088a5c219bfa23c0dcddc6369e876e05113c17cb9b50185dcc252d04fe3878cadff469236e1b96c0ceb0f9884673d63d7e36c20d5a130f885bfed547d38c6f6ad5242c973745edf1360372526be264d744a2c3376b0730fd0a83fd17ccc81e7844a16931b5d4c53029242eaed1454d2516670a12b823fa64bc2c485cfc661620cee6a98353206c32c064194c54e7b894150aaeab0eb5cbf7d8ba5f453f4f79aee744431d3e535ec00de73c54fe2bb25941a07799f0e4df5c74f9af5420eabbeb0a3134eeb36c43fbc3c1754004364f69e7e18d6c567565d3c636ea007061384ebbd7b2eafc08a67c94a79b04f819ab71870630286efd419a40ddae4649fae0a284d370ea1ef6b074b8b4d8b604131db61105689ecc13c3d0ba8dfe5d0b6f9ac90493dfdcde5bcd0329c59ee9a5df2c23db3561f2cb2fdb5d22dc17316008ba2e42faaf523de74596a9f06c1a846cdf8aa4253c133faacfd91551dcc1e041cc5506a71c6070efcd6383fb7d91d490957ce7077ffcd50a0154aa18a4c341418846978dc9ca46e74e10eaee65007671910c2048999d5771892324aa520f6818cf4fc573fe49ff1d239dafb7c58befb0bfb1e1c1c10e046e3edf746124cd7beaf728bca49a79f0df52c4f6977699591188c785245191c7bbb27e31f5d5593ff02e36a6af29eebc0bb61608ac3e6aafdd1a88d406b45791972cd132cddb150d05b66759318316928a4a0cb3965e43ef8e2f9273c9db5cdc9876764bacd414d7c469ade4c544b47427600806c5e703b0018c03e9605f19d7b817f0b224c5fe3354455d72dce0d4874e6c4b7784dfcb9e2068659cd9ac289803feb98f0aa70455845dea05404c3b2a7aeaaf9cf62fc2111892fa67d4bb5d96b1fe4f03659804d6334e41b09dfcfe26a3c6fc89144be28a62d3e763c93c9cffccf6d0df45cbe529b0ab1101b041bf7720924886b4a754d911182497cd4ea7b32ece314381ed75b8cddce133044b269fe05e0ccf559900f0dd74c5864d8abfc2d26928ba793dc68575edfc4bf31d2bd5f771dbe5cc2be81ceb52adb66f9c4a58f3f190d55fc9460f7ffb21580cdd0e5d321e8eefd47c590a41e0e89e756306edfcaa46e7b008865e04e75fd1a0024498c599ea532169bb5c2e5718bf1a4c7ac521073b68f8ad4cf492a728e6fd78d4c637eb6cb429338fedcc616a8489a79c4ef8ba6fa8c6bb03f1197a2c715c1e4b653b7eb03cfa8483f1f3c1fa8dad2bd16408f1b2386367e57539afbbf073f68edcb31e8f6bc85a9e931eb1eba0c8e8f90a52c28b1ea753105155e281e1193513b30b5e3e22a9bd4960331f1752821e6c1458e2f70bd419b6560ec4457497d44345addab262ebd647dd2315a9143ba90bb57148fbcf0b10792a0c667161af9355b272fc9d8281895dc2498980b568e8d684fce78570422362b63786c58d2c86464e072261d47d21864bbd4e3abc014a3da071e20e9aecfed33ed168ddfeed35fef2a4393b4a78866bd3d01cb7289a86cb6c903479316497059694d4af8d25991ec975cc50d0da5fc190dba0f87e730c200ed79ac8a02824104bed8112ac4e59618b7500744895021d5db6a7de89d71e190e53de52195debb1b98376dd335573cb7c88419a35e99798843ad3b02db59a4b0179f776324bed7a3db63937a1e30d4503b342bdb9c670dac68c7089faf3a1dbf0263bba57fb7ff94f4a91da3ef7b98525a24ae16a54584ca5e24deecbe26a8ceb6ed0723e13fa23f1692b3b2e0d01d57bd1a977816ba9cea5efa3ee1a885ffc151be693dbc426e727a1d6475c174c84044fda5a61c077bab63920a85840aafc391d5d38dfe90ce5da86aca8fa6d15247af77a0ae5525d4d4eba450356a515648ac1ceed2095c8161220f14a514ab09895696e47549aca8eadd356897dda0ff0a85aeea4d3e20ba8e2879a35103dd7eb73c987147489af0927a35a3fa702b5db06de9283a493176dcf1a5b000479781c633d4cf8da3ebc81fc1e9aaf0bab132e81dfcb10aebc128d03fe2b2b0e08a2540affafa5117dbd490cf466c93a517a5f26b12db4770a786ab138a7a5f6f3570a063f9ec7760de6eab8d9f1acc67bc89bbac79fd1ae8acd5cc3f03e91db61f43b52f107ed8d55eec2db8c1f73e3eb7f8bbc7df3d3ec786c5cf9b8b6f862e3ace2dbbc1f73e7ef7f1bbc5c7b1b3f8f3e6e70dc7451f6c0b37f8bfc7df3d3ec786c5cf9bf36eee0b8da4fa6ef0bd8fdfb167f1f3a6d40de84247abbe1d7cc09e816f9b2c6cba60a9ca96c19d850f3409dcacf70fd3961109f06840ac6404511c791d1f61018ceb0b800c2d0c502ed378d7aef699287dfca8a227d92a6054af3632ee137215f8d2ed44d272fa2a72f5c6ab902ace2b20eae82027d855e048571b92dc53f9ca75d3dd41cae2f42572f5beaa70269c6756b5cf44d7c747157d92bd02467ab520e39e901f817bbe365163f9fba7862c72927d058cf56a47c63d2117819b3a6dfa6abdc3d6fab12fdd6e242da72f91abff810a01b1def95b91b49cbe885cfa8c2b43e5e330508abe045c6f4410c5d816c35472fe15d794a99d9d3ee65470dc7c27876243b43c262964265ccabc1b904c1964e6e01488af7d4bacad9a9c47b61b7979d0212f4d2ac77d67f4d8980d0ca850fced0371ba050f3742ccac05f9463cbbc811fb5fb9ccf974e16d1a2b97ee369bb3913f4b571debed7401c0949859af6271a24f8e02ef331c83f3195f1075d5f4b22c11e621c0e8ec220d0a49cf66c5f812e8f4f09e850189cb79a0c96b4158492a663dd59f49194167a3f5d52763311f18faa9705bcb69dc8b3a87548298acd1525a80239c9c094e733d93908d64b405ab7f5991efdf60997b4946d258bd12ca98a9b1ac68755c4250d3601aa64c50cc5da72883c4778df0563ecd594c12edba2063b7f694e6de15627f678a6dc1da509a056b00202a9963e8eac806e46cfede0f62ad8f81d2384ef7920033e326a803a6dc1bcb4f193d5c094a8313b193b63d2e3eec3239fae0185c1cf0de3f55bbd553786fd7a827c75f08f8fe1d8e1b8053d96244b8d852f16694f43f83826f31f4ec2f02bae8050472eb4ca9db5a7f402852135b3909da76c985efc857ac848f5fcf92530e12749835cc0b5fefec3209387c7a7e6cdd5644338142ae2c5fb556cd266c00d52853e315db98b6a102af626c376a93f2b3ae30dafc8eafb3139448b5679cd79bbdae8df7079c6c5d9d4538ec4e554bb4f9e7526d14495d730ff1f6efd6f34177ab8a145b6a878ecb30bdcaff7357adcd63b9fd604ce8234efbee7e9b74e76291f186140ddd55046a8d629ad5918b149625837c487201ae5a8029ad03e0f14a809066e59d94d98b486eb5b4b1e4854d6e9ce0ffddfefc44c9c1f94b9a4f872b9d598a56097e344a912395017a717c1a45e9bccbf9687c40c121cf489d38bd46183e1e4773baf325040807d0778dcc05070ec3f0f138f765d954933bda4d35e041cbe36caf1eafbab04235d635c33261585d349972f7f138de2e950071b2ca4e8c7a4ba3c286664571a54093f0c5e32c1e8bb2a89c4b12c871f5978e541067cf2d06ccc582d286f001ba069149d851c7b1a5f3cb6adf98b62c497088ce160611d9a2ddd3bf09c78b6eb7d42b26a359b01739bc600cc0f52429c2e9a43cc87e93459a9541f84490cc18f424f0ac53ef66058990fa06db5ed85a7034d95a9d8cf0d4124c7f495b797c7444809caaa1d45e5fdf8672f78d16ee49404119b959abf0d780b9734c10ae064a0c92efa4cf72df7531d1573d69f4eb4d86a4b94addf5f50d2fd1a96c12933cc58cbf1244acf776de75aed7050a1998840d939988f44964e6c998b2c80cba68c8022d9eee3256807d9e69da9e254b997ae5f5e62c13a0379c3d0a21541c433feaa012c62cf044c704b22559c3bbe2ce118989309b5c616963ff68ea0def15420e1fd3abee98a4003d512d6cf47b818ce80ade09b4853bcdbd9da09486e19e3a41911b939e66edbbf23fee1545a7099d5e794c1c97bb4dc195008b18656afc8c7dd70b5b2b46c4f432e01109b6d0671f13a3be30c5d76a8344ae6dbea274006b7a22091ce93a24bdfc5d92d08d11c84f39aba7c72596fde82b67118b27769d0f749d89de2a7d5c67690e8e23c0b7376d219b88fb1589fd57c9de3a4bcb586f1ddfcafb5668a431cda0954c1375fc712a791e81294c4564573babce124d7b8d1b404cc21129925a9282d420dcfe2ed2eb4479cf3a9777a8671dbf1de0496ec1b41961a29dbb1ba74aa4acb37ae0f70f12651d9844a7c7d6c2c71306e8f5ec94d93fc53a01316bcea298cd858bb66558204b6a192347c06888a281dc32856c03a29415777ceca2a9a184769257c75c9413581a20db1816b0125685e51d763578d2d479605c869de1e033fbf553f8d405c6a005d99cd714231162500a2f324421f17148683500eb10410d32ef07f98b9c40302b61e2f30af9c1fd3b94e8c5fc53b374d3f7df2e3c7a9259ba1a4af45630bd9942c746e905f6b2940da28d7e2a5bfa586d63b107cc6d37777dfdfb1e0fb84e79a5c58ebc88f5009afbb9979109278f32dcb19ef58d598cbe71088aa407196dc4528092e44a69b8765d62af47781696066ceb400d564a383945ba74f0e62e6887b09446a72ecbe73f042b8e2ad97c072bac479882cb2900e692137bed4e5e953eb56270799d2a9ebfdf2277e30ec5012ffc0dd2b115d9c5817ab59a5f09de8e6df6be7dcfaec2a99bbe52862b72a748cf712cb6d8966a5fcfe21ddf2b7da87c8ba157715fcb2aa6a5575af10bb3fb8ee728ef4d7238bb52cdfc663e676f1130f73bc04ae41d854c067ffe74e27f02577a19952bf24a38e69a6ea52c0b079204494472fd1d6e9d7740bb65f0ee9174ad74c2651694354fa3565af1168b24bc301854f24205e3e6e2730eb91f0f248578021b2bfe88a150d7361f8df14b8d499ee6f720449465e2998a57fe63f09a34a1bc223c557d9a8c305d689d40fdff1dbdc34bb5c7dba2cd137e94776cc39f42ad176b67c3dd18973e52b68091807f266dca2a3de92a3d725839f48f90e91d571b56a7cbe6b0be79bc1cfcc74363ad62995948ef37907d25d9704329d9414a6dffee5fcc327fe810e12e4a5cba038e4d89284e910533a9aaf4285a96debc4d4e594a9f31137e3c182b57ef9f655f6589eeaf2fcbd2aac770f0cab4086755df4534843b34d5b7981021ef30c7ce0fd3c32cf3788f29f452c671e47378c52150084b0936fe2bdee31c7f0e6a027c9fdc0e4ca6e5eb786b084bcf7dbe6f61470c5351188babce3c546c129614aa1220864fe1891c77ecdd8f5175831ab014b00007b4e62b3d6121f18cb449d7771ab8c5306929b5cd3dc23340aef4d09f2d35bd426ba586592702860c1937b2b637a68eaf82b54397ea439099591a6d8eccddf160070003a1f0f5b78fe2d04dcef3392e6f17ca7444ed9ad387fa435d2c009b204c93a1df9dc7c994831d333cc84023993c50d881631647c49a3adad45fb9cee86d1b5885aa475ebd0f0e1377333eebb74b9409d5a326cebfc7c8aaa1de7c15b077325533bc1026d6f8c088e9c337bb00d8e0ad44a7e99ea2b0c30c7ae95698c953bc72a8d31f9169b9470a0e4750e801fd84fed7d3ceaab049536fa8d8e3c74593cd8e2e8eddecb834e6be47a0d78d2988cd6ee73bcb5ddaf364c9fde55198150479ca970f19471a27ba9679603e72c3463fd3f48e89dd7cf4f1c09b5148edcd748f4446667e11b4afb31729b42b062bda41777a931e5690161fb29abe714332b0ee3094967d3dbc45df4b3a8de012b12327fee094414908a30f9b5642acde414fc4703297b988929794bb3dd1a6d1ff96ab7c1987ad8c522b0c3555dd444c95b31c51d9b8229c33ef51ec2862a2c002fd9f3ca8aa6505bcd74da3b1bb8a33b80e9437ff698153583a8355d5d835af11cd7940056d521b3bf8cd7becf6ee344b5540172c6ed70d129ea87ecda432e09dbe56bfd466bc0cf08a479196d86092bb859bbed46656f8f4e5e15ad7f5b8cf04da43647b0d059a98aa9f0bf1e7266d62e6d86235536a338bcedc5a3da372a79d2edadf4dcf475e6c11793b5f95ccb86eb699d7a529bfc0798361018d08d44ac1c9543731ae24a54c576823b6074727b0b8d28eb095552925edac27993d053fa39ac8fbc89934b0a4049ec48b1e1ed8e51e54d0091e53a08cdcb477110ab0c2cca10915246a11c09160162ced5cb9327479d5b50c5b2247f425c5567ccb7de0b2f704a51a602452a2ffb82f65069c58614f5ea6e73e7b295f43ba43e72ffa52267a92545a0981c1d6241a12109300ad191d55a2d89df594fe0dddf4326a162b3a02c8c0b80b057384448b0926b00a622b9bcfda55f1108ec16b3da4cd3bb9e3e83626805f1b3be462517da7f599624f28552425281240cbd68bceeeb62fb20a2ec11c00122f22e7d088f1362b132dbfb84b69567f1e5eb7c529fe12bca56e4816b344955b90c1fe4b8097dee1a5951ebf7438aef4fc15e79cd6fbabc633adc453c564a068552a04c8249bd1751a57191e5cbfa87c8fd69d284a1e7c8178f5468f73c75d93bd93b37b763dd41db2eabd2d0b86f41ccb23349ac669d79c5f664c7ad148189045fd210e051934369b2c4113b3034e7473b29da1ae27edbc02cfd41bef5e66559d980ee4d6610fa07677090da2f6bb2361da8a3e07019300d6d60f1432ef3e64419404b34acc624a094210ecf1179d32295106d5027248fc7f02efc1de552d4ae1befb013aa95e2cdf34edf56a320ee0c951a5c440763d06cfc0417582724686a2eee10a5ef7fd39c4426c3d4145f4678488b89cf8d9ca4657717bcadc2fd6755015acc93c4ebe530ca987e1f512107ff3eff0b1c9f3b742a2f0ef354a45c27f933b18993e2f48414cfbcfa4722b48c066e6fd75e777ca7104a98e02f5bc3a0d1584020ef4f17321e828ab7024d70f0b78197c0ceb57f3dd572dc1d5f462ac3e5e46b49395792cfabc1d3779764c8a4085c43ddf266adc732f461277def32f7fde886b82a14bb968f70346ec8ca6cc8a0cab2463f568c623e889761cd8610033c4078a9a3d6c17222ce6c22612981fcb30b2a925dfb22d8c370784041adcbf6dcaa333ffa53fc35a40e6853223e541a56e0a9cdaa9732f94e8f3d9ebc7d8c54abf1bf6a7b9703134e5ba15a39c7d10092b60f885cb22ddca6fc9edb87e8989993a99fa44515260cf5f8fd6e0352e1ccf753453a5d82e71e367dbe4e6109e9079bdaad6288de812f43ed792f5d48fc4921d35873a9bd7a08414ba854b35190f04cd94736ec7cab82676e15353d418d7a0c635c3adc61a3c55499a362c1f2cf4abe8a222801119f8bb44d898ff47601b8b38383ac31e5095eea47966fae6e30f0394bc535deced7402dca54c80f69ca96e60e252266827d0fa0b313e20ab8540fd9f756481fc642bcde6201fea8608b514d88a834908e8ed2097fb4bfad8cb1b1f96bdbb5c9690d57e9a9e29ca766837dad84a417059fcbbe297a7bad7cfd2d691439c218f7bf439b422a2dc6d9ef3cf65a9497b505a81ca58b56c094b8c47ba0b46318c1dda282f733441c2113e78218652f14354e1300afd737a47a797d23a0746e992dd682ad2a9227f06c45971f5b05e6b0ba19b78dfe181f92da99d5d0618cbfafa5adfc647ae10941b91635d783092db01523675203ce1d9e4a1bcac1f71d12f25c509cbcebdd85f298679a1b4a1779f0f55f585fc648e23e144a10ac08db2ed5ef0cc6d02153f6bc898edd4a7aed560c91fdba537bfd20400a6eb7f1dcc5c222fab215d11845a8045775321afe09c119ec80f36c7be57169ec6822a669ff23a3ec2ced896552384a254c0a8e7f9f4c7788d38098ce389663b1b43c4e85f2c82f922086426c1163e79047dec0c0367a396b9d855e9a5d6d91f9cfa03664201a0fca96a50e8142d51686277a65e840422e338e9d640719481a6b32bf1ef224f44a22c5df72fd613048e9238418498fe34082b9fcaf5242000133e1a0efeb41a555dcb21cf55db907bf38c6e0da9e0c9c78b84daea31c4d1f3055a46aad84092d32f3f90e9ec980ca9b75ed9604a1de7ddfc4d9bc2ccf35787bd7c559e2790b073865e8864b874589e1312a0938643387727d8053d0cbd2c5175f74f041d28688b9621ec6585ed7ae5baf030e885f71bb3c80f6c98670dba3b4bed4813e7b434d3a677760a8095287b85f8e3ca44b1aa906aa6cbf89316df0f876f13cde5333e8b3cc889bc782c8ff8eaa783822240f9608a860074faca373498809e1db1b1ed562a64e36f69d94989cee3288f6e088d0b0dba09aba0d62398233b208ab69bb64cb2d19ab78b6f26f163a43f8cd7da66b261a241fa213b10a57606535369385f961152bcb3b0c9f820618c0577d560b9279c68cc05c9a333f07bd2875408e8db3ca74d1c9e239c57c19f3d5eecb6e8bfd01a42878e1948abcd331915cdb3945cbba6dc3f89b11a2d044c4bd05cf467df21dafc4d02daa7db48d8f201eaf167d3e68b7b2583411d35184c3433bbe9650dd720499f2ce10ee264c0d675adf6f8a0d746b56fb3b6ab45f65f18ab1607f1fa2887dbd41e54be91779b9b7f123b2a1ac838abb72c1e065404ac0fda70dffd70a0cdc75801fe21dea03340101186191193b8e23815b684656b546d0c966672a3acedd1c4eda03c4edfd5e6077ac002c32c670c34ac97c18a2f755131bc0468458802ce601878bc84baf398d0934aea1f873945217425ad64266bc8b94d3e83fb268d230acc6ac5e431aad8331f879416411ba0d2404c7cf612910e8a01bcb9a0de6ea574e795868273c90d724fae1098d4389d8ff4680ac2dbfaae987b04069c768121f029ac692e4e39cda0bc3fc9077489d130e4050100ed74ac004406f5d942f075936f1ea86a350022733f4c6515d8230c5340db2e487f79d7ce2a62ebddd730450af18512793160e0fcdb07141fb334933e7654f66f440125fac5ea2660d61862a8e59943049556c53592ed4c493218e65c1b0c3898a8fdf4528b6b76b7a59a3d13a18535502a9738424c01df6886abf1df36951a8fca64c452ea38ed3f2e4e944b8e9030560792ad529af50a06debae64cd69840900ca9eeb976c57bec6aa938054d7e9752626c00b78c94e292b94456ba266c3ce9f0342089cdaae22dd438595a81cfe1dbdd80ea5115484de8268882b9f060f127be435f24535e0770ffe04f6a593e0187756e79242a3bf2abf790ccfcd52cc5d1f0f8c82508e0f4076ba184136a7478a25967a0f6b8eabcc99bb68100f490013d495a3412b50118972744da9146e9982b4b633e2188781c6bddbebdaf39e799794942037feff925ee004cb93f1586f8f27d474584a5c92349412b768bbfb2ab872bec79301e30ef4e32f0d3fd9579690936109d2379619b422bc25ea4e11a204f384968622b6262e0b9e2e88289563d355c758e5752a4e62d1d155acc2997fa5a55157241fbcdb96a0918910c1793a797a9d32cd2f5f6e8bf1daf97c22674921728b1c44a3bf1387b8ff4bd2cf0f619ea5f0f08f8c4c9de8625b0909c905de54c201397adb0d88c4e27ce25ca5e27d51c35496b0995e9a097a7240779ce9d91d09e9778ead9d458e734ce848c4e5e7962dff9f6a9d00c40b8e0859fe542e16e2fa87edb90552a973bb7148c45a43a07756f72e758473c74c628cd6e333e5f073c8ec494d802fea6d28c8fde605177ff0fc0de9a19b046799d5de808de0c704e6e4255a3f0a2ea6a88592cb1d563c692d222cb5e33573bf4f51468dede6771eaac930b6ab63fbe83a51d54dddfb6a21e14d1b166dda8159704dc0bd262376f1f726d2b02dacf8b0beb46b286b5b7ff4696b431b02d38f22e1c197638a21d8038920369b11a2539cdd7dc1c0e0266be3aef3cc35d800c22dd7c5dc9914b55b7fac2973624fa2a131f731d5c95c0c9692271362816950f71f8a7bccc91cc80bb649783f15ab31bb439d4fa7a0163561058d52e055b2447245006ac56ce4574cfc5483fca3c1755d152fab96876786e6cd0a654a36f98efbbe7cf455eb97762c38c0b00103694275a51b7d0bd54d0e4c81f15e9b5a21525c2b1825db438ce4560247da92503622eaad0915c0d7e307c551b91dc123eee0f47d5255a514dec75642f0b254a7ba9f788c7e525842ff57f01f7a775b8db705a5dd97c87f26e78b3809c9001ca7a442b6ab48b54f1d0e4a07324bbeb1912843f4e4dc4dbe3df235e02e53ee21f0a8f0f30ba0f834e51bb282f3b7d1cdda2a5f6460519f5b8c9b77a3cbb950f2b12ff1c8d0c054e02e2a0dd9518ae04c70835f9c157fbea4a5650a7b526a34480cda348eb23cde24bf835ff7a5b8c505d5d8c94a0c6fce23fe54dc4929bdf645bafb019b4d4f51cee47fa88160e8dd7cc73940050344242c15b98c13b224d58544416f1fd5eebe7de533ea32e446631f0f95a7c809760253c32f3e4ebe06a0f01e84cb9e9795e516726df14e5354b6a4bc666b95a2d0ed6198bc54cbfacb50cd21dfbbaf308143c14b9659012824ca92fa3b467193ca0290a6065de3fede3ae949a35f48e7fca98d2b7ff339dea68a89a3428e51278422e4798a7d09627249355cc2019fb93a96dc5a36f682b1e717b228dbe6e796660b72c46a0ca9367e302fd82d4f5cf0abcb3351f934a7bd54e422b351315e889cbeaf0225c09e84752e206bed6ceb90b8473900d160a5e3741799b10403bf812a98c97476d1075b5e19c00880ae6129e0eaa40cc8ccacf9598f31052a5b1a4bdb19743cdcbc7f329ff1772c6ef1f1cac92549eb8c0fd851cc2f462f784c8779a80ec3ed8e4d4b77bee3f3eddee1908bc5a6c1091e672d3677c09041ddec5da1aadf96e146802f135d92b062c5cd1aefe235a7901899936906b52544dba579a1705afdd61166ac84201698e2459084e6ae141550c260665093f199d1fb38a66a945fb43b1ad8c3f29cfabfbcfd7f967944c44ff9c10cd280ba443a748416766576a2a2142c3cb4936de88453e82a0b9f8540771fae416ea52db96d9c18e47cf76ad1120dfeb9b19bad50dc5b1015447647f4067a17ccc4e3397fc9abe68e9404c14b09a9c2684300393290b9f3c81062c61c5194b8f2002eef361fff12c8410839a2e0672f61301a85102aa69050ec2a492381fc0b318c27885e10be140897b884105b65e0df959a473dbc4abb9b302c03c161dd83a5a31e89214e708f4c91639cea40a9525f9952f5cbc44bd80e113cba91ecdaafa12c5324859119c5e38d29e2f974ebe2f29cef54109b7d7ed2699b1c6c7fccd0beb328d6dcb34f6ee413883ceb6694ed84913062905cfa8fc22d83a2e302bc815485548352415a415e40a21a9cb43406d1023a21fce1b0e07c684c25893bfd590af286efa637a2c4249926cc78c978a9660cf55be28133a7f02bf53c904859574481a93e7c599175f802321270a836704bee4442a6e8f882f108cd45df42bb31be025efc31eb8f631e3b4507949f11f6fef0688d1f2a00a6de4d72342dbbe43c34883724e152d1e03d30e0666818e511e8c381824b39be0c1ecd2011a89c9fb43d6e95d21e4e28f3c6d62e0277b0082d418cc5ba709c9585f68366ca0475101261d72d301c5b0a194bd74fa590675e5fdc1fb2ed4c80d893a8b619e1c09285dd34d23b39b53fcbda47346cc2ec1373151e2955dd5b33ca579cdcea6aa9c355136c82cdd849895a4ef8b0c0ad3f6002980e2e3b065a7a5e830c5466d6fcbc9e41e5976cea7aa7b71eda3c3263d54a911f2191499862d00a9ab11d8b2fcb4ffaa8e5431b5bcaba1194a98ad004ce292cc386acaa93ca01aa4fcb76c09652884120e887d7498451b723d03a374a8411c29a468d6ee3d1a525bcb22c5b8326b9f897b8f52f42d786b14a45e206cd980bee9811fb358a026dd2faf4740502c23d638820bb7e395a8966181b63fe5cf9c7b2518b16352b45a0c3fc43559ed6f13078637669d6978d599d8bbfe48116f2e9cdf9c7bd2b492d31c4220509795d39c18b6ddd2fa5c19695fbd48f61ea4a0871a80841af45a20acfbfdd3d3c661835d1221448bc2e65e30d0088c816774d0eae85192d5cde6042e73aefe2cbde6b61be265611b4429ffde0585f6d50b16ce2746fde36d9dcf210000c59bfa3d5cfd789dd40581e8b83e31f3334c1a045084180b91591b13f21ea29da06e1946fd0f9d067eae6598247d479db313fb922bdd3d5a10d254c0319c08cea17f3d796f28e82894579d97173e004a27ff65e87e933ca6a086247efdb02e9d250e000219cc55cd3d04662302b16ec3e137a9e47907afe057fa25a3663f1e268f33e7280a5fb581af3cdab3a09539d63ceff136b35543900b61e667c731ba4155cd0a902e8a36f2a6892fa7e561ae4c6f2600da1800110ad69d84f6a4d3e135525de78799676018596e180fadef59c72231be0050fc7e226e1ea0c978d42564574cf4e4c71af92488e0d2fb32ae61dfe51e236d5dcab1b5568fd22ac1f38a7bf6398d700c1bab60a0b6e843f39808e55b11e456083be404c13147ef13006a8cf447ba0a00bebf92165b476bd2e6b0b0f09c329bdfe7c0d5f37f38c8f415bae3a3dba0421753e3cacf40b621f46c95bcb530b14f6e03e1d588d15886c05c958cdc8849cb2d971296cffbc484f2ccc2794e01bcd196f9a417a9f73f7df7b8c7b94f585b22af9b4aec48fee674cb8939bc34b7d63653b7559917c54fd6d0a122c84f878a47ca954393ff6a6551d1be97cdf82675861e5163fdfcd2449f5c5a39a1377749bc433c8e46a26e79d8cd38ac6e8cbb811e573922d007223245f87e42205966daf96606522ce225a97005ef80ba11301867dac2fbee0aca23b5923f90e625538b9685a1bb1f60d388938634618cfa9edf19f02d930b791756f7f2ed9edbdeb3c588933d208392b4ff123c4363865105cc01f2d241cb06a22fc73ffb03fb8ab91b362f49c605cf30c260680815716e7919ae8b6d7ff7ba58bb90b93db2314775a5a02d50c053365404d68145f8d2a119b733d01178bd598d77b06598e834d54199169f910215b12e3251126381ba8a071b6fee3534774230058bf3e08d2c51059f4b9d1cb65dba6a0c1fb30b076dcf5f2ac9ae5904beddcf3d4d4b9caeae668faf754dcf6ba3926952d18629a3167c805ec519a3a3ed6caaff6bc77d2ca30317d1865e035bb4ce35d6aee802a1df976153cb77d70ccbd95c0db382ba0b289a9ce2bada33d23187f3fddee96a64478bfdaa9a7dc44f235725daf32ad6554c9cc80a81bd61a68fe89a806bb0b08533cf85dd5a1dc5d6cacbd9abc191068eb81f03bd3638bbed35a1007e157aa00e751531417833272dfbef105c1c39061cae7cf91643223de172b378bf6e5d02f6960b8c881634ab4637cfdfed8bfd02cbe952fa3243b30229b79f94358c64605ddea3ee948e8226784be3c516b200b685b1b6dbc46510da4b6a5423682b19a7505908f875035be9ebcf80800f4620e5c8522fac67c0204b8b194eac37fb2f7567b111fc5b8f5a1a30ebc208e042acad05ef12d202af89186e5ab820737e454e474a1955343cad023af0096554205e914d07b356705d09f39872190b9a8cc8b7af7bbc56896bae57a72d35e65823cd205823ccca296e49fda472e662d2a5cc405b434bae8c1ec589680120c26f1b77824804bf598b8896b4bdf7de724b299394324d06e8055306403d8da89029e4e6266cc7c155c9668d6ae23789524360d11c02df4ef1560a293be2bdad82a9c9da248dcd1ad96af607993a0e0e9813d2da73be22d1bdc7a954df3ac87cd1b629a37e83f0f82588d36d156f978e50981d038dcd17560a29a36ea7903434c7da82e8705747477a27eb3235b2190af53f384009e2cc06acb2c7f64cff8135b2425bb845d12485222832c49d59834371557be5aac4d3b64aeb4101b6ce6db3a1dccbb280d1daa81c19d05450916dcd636d28a76ea7903ca8d1222175211b808602b0a0ad79fa26311692c7dabc9ea0ae20d36bd52069a857a5e6b16b9816a979ec15420f6e4434cda0052857884cddc62153a7d422ad72cd2259dbb5812dd393f5cb59a14cadcd666db3dabe6da4a370ebbe3514f3bf1b1d6e421b1e8e959d0c25acfafd9484556f384856df6a43918375425aada113cea0309ab413d29aab3d8cf4d7272c8c9d70fee549836873df9aa72ad55b6e11d2aa7f3bb04696094184586face15cfd4548b3dd2841288c866d6ba130eadd5b246c92459a691b84ee5499f3c74ab11e56bf2dc2595db85cf4a87a427152e115a1bc519e07504f5fcc6cbf3e416130944018218ee1753886f53bbb1151e22904c54ff43a2c7257b4a2288a626d914e9c93752fa41fa041ca88698d90524a29e544c3156ea8b5d64a6dad265cad235db2429c7404cd99cc1a741cae19739d3187b999b9cee7f4ceafe78915832a0ba87266b36b6ddfec9e81c1ea0d455b7de2303c557c6ac2275b6a4d040371ce9086128788359c6d74c724d38904d0bd20759b45b162b062a0ce6268a38f00f24420cf45d1009d94bb1b0988cba2e701c9ecb937b6b003c1b9e79873cf39ef9b73ce39e7a4218e307bfe514a29a5b4bbbbbbd65aabb5d6de7bb91083de8b47889c63100c41c719e44220120f49c230e440e81fe832fce148fcf45c26f9206616a91188cba29434a8b1d647b94f2e8a27174f8e1a979ac256d91391a494524a799b73ce797a250a848952da1648eef6eeeeca546bb548d3de5a1dcaed35791a4fa7179144cef109258ead209c45e74006bd158433ca71468d350e04a1aecde867158e3fab0c8ed708d6c348fe69a22c59aa683a842131e816305a0cd11bdd3169718ddc29ee65838c65216d6e13854d21776e1a248cfafd2e1b6433916927f513240ff7c385643afe8042e67e4caf7133ce072744a6ce09dda5e6e99b4553d15d29786fb72948bc4db789bb378bcb06dc71dcc97244570649dc51153ed952b352fa14a2734c1521d67a4457da0a5125219dadeb6cd30bdd110a85cfbf9cc6bbbcc6b79cf6d67f1e7b8ee7c1e9910b22a5809032f281010d70c00372f0e8b071316379cd0af978adb68186d7ea196a78ad8281e6b5ca859fd451ca0c29a61416a99bcb6a488438180250e94147662626e7c5f56e3c72bd46a1b08df4480fefc3889597eb781f46d0b810ee6304f61cefe35d08ecc383ebc47c07ce2e7f81d37217374b48997aca88ee70462810e40e6705093b6a1ece963283e4c1344831350f26c2425258c81d5c840ce633d6604e63ac394a8db186421b53473f63ea081b9108d1efa36083aea7217e970341705a21d6fc28f60870993f80c77c017ce60d80f30370ab00977d02dca6024ef315708c006f0d4026cb0a484005868620fa016400df0a72aa999d5035dcd5f1f4a8881a758c9e428a4461a89bcbd538d7ad977906860054645e2561d7671e45c2aec7bc4bc2aee7bc4b9a8b65ec8a12766fe7fd5f0a06be5d2aa4b1fc43c59c4e9c18cb28144ee968fa44b1ab71e10d780938033e02ee03eb014f01984e47538e5463174d1d8b02df0222c4e808690525a0cacbf09a6fe1b2ef6278031e026ed31170ee5f72e8c8e182d53a64c4b00190a4162b187231b5985e4c96093331991075e3ca51df1e745c1f2ed8081b61236c848d4e5a42dcb3a0c43c25a4c9f837c5189ae3fff9b81ff3eba90f4a87a0301f31634b88d262634b0808dd8190d72ba4ad7cfe2fcaf180f7d1873a4685721029bd5ee1bc79eba7b3ca095e2b422d9cb115642536b686627fc3655e078f7900f8cc07c0733ec871dec6ec81dc1f87cb7e07ffc15f3fdcb0810369e8876f09b574f8d61001f8161100bef523e85b405a41bee602fd58732d3e01b97f3d2747569ef9221d3e4e231d63098ba652c794e692cd369b2693eba5c52f6752d14472f1c0cbb9b840ee4d5e5e20f72b151322bae3d263f333fce66538ce772c7fc04bc01df01370ee4b589d8c5835af80685bbb650fb51c37bdd6f6b14fc5bdd65adb755a617e293125a2523a509e1624aa92944baf417744976e83eea05c3aa63c581451947c36877448537949094915626d0ec94518b242717a72e2ab139be253649df8ebe51f760f599ce5e4a37f0b76eec38f7dbe3d718cbd4588478fce39c7af817c276e7d383cc79ccfb1d6fac6203cfdd6aeb7fcfbe6e41c777e1dbbfdd63706753e1d3bf8b5ebab937727c76e67b8c3cc7887994fce71e38e9ae232c471723c0271f26e04a2c577546edc51334b8bafde3b0cc04950cb58298c657496e3b1368e92c2de2b85fd58dbd179de700f5d8637dc43ffda0872383dc41f726e6fe8d84367858e9f3a77c71acb77f4cf89d72a5e09c71567ad38fe95b1f6b1586eb1b3dcba0ab658c5b1cf31f439b6824e7cfa89cfb1e6e5cf81f8fc05befcf3d789bf5efef927bf06450de4e975cea36b38f4f9b51d35bfbce5dc7b6006d1009c0481fe1a6b9f83147c7ded7390e2e86efe9d7e9bb3ee72ef81f8dca47370865d3702f1f949cd8e3b6afec697ca8bad957f218d9572e2336818b4ca27fe611cd250fcc46d265f9bd9641e31713c271444c4134a5bbad16c325fcc264f823c979a6726756c26ad9cfab451c963b5e2c03944f6a0302288b599f404dda9cd2264eab4086058f4e2252fdf83c648fc23791e185bebe058231122791ed86bf2d6e37b013f3f9d425a0f0a9b8f7978df581dbff4b956256f77310fba43226db5d82bc6ce8d2e3c7aa0927ccd5ed224829a4c2e58e241772676a5997b080d41846792f5e179f86be67e4a89ed14ea91311e6b9df300ea4161f4149e401cd843f069dfe90bddc5cca38775cf2be579a179a314672f1863e7307610bfe0990ac35388c6e44d49a9266f4a995279bb354d12b450af8237e5d74c4b36238d85d287afed3c1195ea5bb5574949c9db40109d85984f9d838d4347f5146da36410ab57ce438124abfeb15f355f607f49a52a603f09e6516baf5c10045550cc24d68641d47a12562fc7dd7bafbda730565d45c66a4dae2fb90639090bd81f628cfbc1dce1dcb89134d53bdb4dd7752e60ff97719e2715309134d54d408ef338ee7af75aef05ecf7f27c922f91b2eaf657295256ddfb96a471452037f64eded77ddcd799d44e8fa5cc03ff642d682d075ef049de842563d54fa38c558fc9d571f61e4b598555effe2465d5bf17a5ac3a090642cc43563d0c836818c35d84f20ff4ba2f12c7a1990f6aa432860a83c47e8b42a1509544caaa8b28310ca299449cf1ee4db52509836aeea7d9b347ec929581d829bfe1db31505853ca414f74eef4453e84107d52a3a4b1a1998f38aa6c2a58596f71b1b6296ef788a32108c18820f4ed02e1fee0fac0e5c5daaa92a5a26f55a90ea943aed1ad489c3de08178ab432cfdbcfa0773777a564161968900d2c7da3a46fdee401c2d0b1196b093926e4b11e2f476e9979056c7ab03717a95557f0983e8ac39107b084cd8474730ebd361604674d231ea1b0851c788da4848cfe638ee7297ebaeb50d6b01e710f13a0cf87d58ed7c979076bf17580cf83d786b6aeaa116f2af16067eff6518dc160616e3d98c18615a5a5af16a63329e8769c04ffce9937a8a7474a4d4b1240aa33e60f855d2802e435ad8237fe087ddf3f04ba55a19f07b6c67c0efb97aa78b06bccf7d20b74b58f5191a59434f373738d64430432303bfb7dda3278f0f23506ebd9f06811a1d4194d2a66975046bdaf67df52851c750435488adda8ed058f8d319c925b3e9968b35036f5c2036f66f4a7a73c0ef69bed5bb42ae63ccddd11ba2712c9a05c393cfa03876ba45b91dadede2c04689106b6dcb36ba53b34819f5f6c8bd81487d50218c22d623ea11b9476b03c39fcf75f4864eecd08df5d91223736da6d4723272a6ab5255e2c6bedd6e99e66e8686bb2d982c2ccb9bb5ddb8efb2b5ddec404271c7d58bfacedaea7c21a50c3badf8666dfe2c4a7c0c889dd215b3c97a47f35ddb282cba44b24454258b64837c45a2f78f7309c554346d4b10696e8b80d2d084ed359c9291a424eed6dc6c831041aba3b5f1409cb27022cd4059d83e0b8168c6f7deeb971b67b3b0dd2604a235dfda76efe4aa908d4dd87e130666b8d7dab663ad94881127841b42bd465548ad5748ad5748ad63f55babb5b55dceba97ac1032923d97f3c06abb4349484a50406a1ecf8812ddf196a02077bc2e2081ee7d2e04f601dd33d23c1ed312ddf16e5d903b1e1612463d0572ba80a979661d9b42148685dc99279030ea31813f66a0437dd63c1f0d64bba073fae1205317458987a690c54258084f17c89902f07618fc3ccacd6c12321d7a953c85a6d014fa6c1bf0a823669f10ad23ea1312ea96a873c95a6bada56eeb686b5d0211227d6ff7ab6c77adb5d65aab135cd5d61637a89736786fad9cdbd1b96bed51b6f6a8c7226aca5b5ee5ff25bef224ee2815969589bf58a71498981798ab25338342a15035e5271892afc5bd3967cac5eb8db9b8b854fb82899d3ca4d5d09d058542a1502894a72a0a85f279f279f2ef546be5702ae6071111ee4862430c0d755e09cc73c2a702533fba7d98242523b623148674446fd5092641307ab1505260625e604988262f564acc0bccd592994955150a4d82c8745a82158bd127623ea968ab92228fb0261534e582594a695b1fe92abaa96f242f302a94bb040cc90ba66d4aacb61d69a65e62a27e342a8ad42898a7d206e5aa5545d59290269aa46ac9bfb372cc5360622eb1a74280c0a85ea6c0c05495546d4249591dc141cb8b9512f3024bea5810905c4e08612f3129262f960a2555574540151598d4134a4adfca0a4c24929454c493abfa62491594455d258a7431315f9986b05215a522ad5048a822f89dc48d6a105e4814568f4e641193172b25265555287789d4cbdccd1f4440766880e4578a626ef24530272531af29967f31540cc451fd5a14949cd84b1f944985e8028342394c4813fd83c1569595aaae42b938b029286fb72893ba1adba644ad5596aa13e59ad458cc0b524daa446a0c26468f502bea56d4adb366c125c624555757099214cae738dd4a0aab49464646d5c8486f0cc171140a10d479e1e2850b9d9f8129b1a46656a2aa2109692525aabe2149d594d4cc4a48babbbbbbbb6fd0bf5e661318943351c5949480ab58ab54a149af56a713b0e6afcf5ea75b4793c9d5c1268d4261e9743a44d8882643c5ba3de850853f5f1222cbc5f27215956faee0f0f07a3a435ac4c3100f3dc6f849488b71e1e1a54f4cd31f1d52a2221d3ea91075b4c4622e3a5efac4461a040815c2c232e6d0914347510ebf4de4703109692a2f395efaa8b084413dce37b084f33676561259567e629709b105a64500f454d2b4c3c0307e79c1a8c05a62b6c944613019199571868526a4a9b4f0d9cbc8c16f3e86e3fc9df9171ef32e5ce6bb1b63862a4194a1e9e9994350d8504c0b9e9dee850b1dae09e28c4ec762e9c09cd061753dae2835110361b19a8eeb1f9b63c058488b9175af8e71e2e6e6e6a6bb5eee263633735ba7d3e97ef48c133939393876662f97e38408ea3491f3edd4d8080d4da2b1058e8b15171ad029ea21e7eb015f917319e268bfe38ccb84b499183dbcf499e909837a84d15334a36302e881d1c3c3e30254f9be2c1dcff94e87884e47decb9a1c0f0d0386947137305ecc18e167686e4f19191d3231aa143142588e0c9d1c786684342688b986268799981c5872383159e5a02ac92107ae67f58ed2ae3e012489cb71d7268954e972dc4582254af24aab0c52f7daa3a983a139e79c73d69e3d8988d324db6a7960adad1c7755130956586beb1d72c18b84ca83aec343c4e9b70866a8ddf7de7b6b4b6839aef33e303c618ee3b853087e5e37b6519298e5d581bd9c7f1cc6dd9ddc3ac871287d0ac1709428ddadfac08fd679a7973e5dedbc8ebbf6626fc773da20a1adeed4566c67d870861ef8851e09bc4ac33543d250214e74d88a8ae2b202772d0219d7492832d84c515397b2a61d824c9b569f3a486adcb1681870c75d1867f3c54ec950e71cddaf373de7f2ec686e1051a80aded5f33caf2bd7597c419774075fd87d1415a8c2d8db04dfbc1875eacb7560681d759af1799e77e1fc3e70c2903367fa1248eb1344b7412bd6ca85605fae76de67437086c7590d967e665cad84e1ae86c0c3b86b713f673683c16a25aa3a68db579c41edab443ce2c9449540959024a7ec992f3ea7143ba5f493a0378ea0278869d7d12388d2a76339253dd57abfa75266dd03adb5d6ba94971ba7acb6059c160dd4a9743a2f501b63ebf85ece8e620d663467abb5d79680ba6ca9f9d3ab84bc4c90b708524eba4412492081c4bd4112905028d082277b91708479c51095127cb28506ae9355aaaaaa131ceb655eb95250602e2f56a8636368fdcc3231ad9613c2171718caca95527292aaaa22e0ca8a482429a9882755d55d5f9928ec55a4835d9112a4e4a4de284c0812aa082ef930abbe327d1d03855d4161b72694139322abaf405c2826f5a8e424b552c5ac54aa9995aae457485c545474545e2f95aaa6c008718d15c81898e80e4a134a15a21a2b10d54a354b69579faceaea8b60dcf5452d0efbca549b6e1d13b23e28ac535a1cc5c5c5494cc6a217ff60605430aa17979655aaaa9438592126262626264bf454072840f1048581537efb06bec583f81bd7c0db78065e8663e071fc029fe316781d07e277bcf63c5e8187e13f7c0f8bc53533598c17ed03783be3dd73f81577f12adee2f167bb7bf60ff09b7780cbbe016ef30c701931de7de721e03aef83e7bccb71be0787f132b3d81efca2a679fe52176d179efdde3e2dc8f3d76b38602303877234a4bd665a6e6c64d8996c723e0120936d77c7802046c5721876220bb635979bc976743c583e9dbc9ccfcef34130b22610d8c8c0b19886c7daf7c5b95a7e07c7791a9ef340363a705d06cd659ffb5f320bb6359c4fb6b86dfc0a1290832ba00a68410c36683244ab810a7a71ae7e971b1b1938762663dd562ca02b080564b92fb7c9ee3f03c7fa08b95e9403723aa17c86d1c3836b62bc98c976747264b31b1b19384d88d6ed8cf3957c632303c7b686446e6c09cd3e017ef30870d91fc06dde002ee30be03c9fc3779e07d77905e03c01dc5e121517e7c2b75f2565f2223971d97e5666b1b137b29991fe146be23c33d94e0e4a7613dcb2ca2c96ab4d609c7fd5f09da739cfdfe8791cfee26d388cdfc1633c90cd6797f9f8ac24b3585c73816c5025883f2d5ce55df8cfb0f8074f1c367600bad1b41a347c6e0ea271cef3402f6cc8781fd98c24b3585ce37a0559dc4e04d97801fdd02c6e570d1a3e796596dd5b5219e8677cdb3876b86103e8677cdb9873a25dc09617c08d1d9ce771d800fab136807eb2c5afd72bfb0703593efbec39bf7997cdd38861a3e76fe0bc8ab73cee5750bb8f3f7e7ed61b58b7201b2fa01f5a8d9576d1f061616181015b1e87e3bc8fe7bc8d1bce53f3d77b388ff12f19355cf69efb4f99c566a01fdb36807e6cdf3cc8be2ce69c70c5c018cfbdf8eb3dffcaf9dc1feed8b1728d7856097a29692c76bd58372762e00e985960f4f0605b33bad00b9d5f39324a43aac993723e961d1d3b93c9662d1f4310fd784e66e446dcc2c2c265fb3d28a0856b9901809b652f338bbd99b9aecbcccc2ce37cf69caff1e335afe23d6f03c863bccb65bc8fcf3ec859fe7a07c95c2f1a2b7e1344848d1790eb875683468ff9596f50e12ecb5ff79fe13172d079ec35f3cc643b39b26fb16eac3750586b6808ecdf12ba32fea5e7635ce55d38fe16cef331df790ce338efc2626f6c66321a999abf4e3323131383c1bcb8e071c5e8c2622adc84e9004c9502465b9e73ccb1586e64dddae2d946a0e8c64492820c49dde0065c0843129ff49e220b68164c20051bb24ace6906f9052e4c21051452c045a494734a8144f641644971d449297ed0dd5ebbe7f527bb452972e075477c73ca49728549274d11a14d5b89ec8398926b48f490aceada35044f43c835ec46594561150b457033f8ba1bdba04f2cc082102d9988220e51a4a10b0306fb3b2e701cd7277ba47621adc341cc2c7aa2447185eea782b46a9034d26609b589a4162091a750963c25904ba4610a7906e0bb3f547daedb3780e843822cdb5b415eee3108542eba75acc9b1bb6344be76d9a29455148657545eae162b05e5c464a52a214989a853087e5e87b96b6b53f983f8e51ae8b5aea0045935f3d5c294f304892890a80d7e267dd3272d2206a2af8652763d416161ab356143f6415ce59a9865196c5ec8aacb5d4e944cd8b8907d1055b9f659fa9dc2a3c2acb572b8045ce2de8bbb0f0959353baff34832f51e021a799ff7a532b51551c32719b4f866124a96492c68c2fcc04ed2d07e1fc42c99886289ec8388cad2b92c99b0b540f6c81ef965c984ed045925fd0b69492c289255141644cdae9016c4cc22879286fa17023d0692197c0a88a74c43d923a7ac2990c2ba2c99c0821bb294de0e11057dbb9b526b6fdb7e82387b9c75cec971735e260ce172b63677adec968e90beae34cb963e6eef4562bc3256472b69ea155cc55e87bdeecad56f696e74ff72f5b2d7758b1c1816b7bd5d9df3ebf9f555a2a3f60897c398439975cc460d1d60b468d12fa895b3b45adad6a4039b7aa8642c1c38355533020000000af3160000180c08868322912409125d9c1a1400126082665a562a144863912086411c0632106390210018008c31041965684a2b5044f21971936d96189fa0d60c63658978a1e2594459aa95675636f9a096b245dde85537ce538ca1dc3c94afc4e81f147dd70b632971da20ae76153d0d90d1e32588125e310c1f018827b4440160d7048250e0f366c4fa27eabb0d9c70f9defd5f15a0208a6c003e692b0f5aa0b6e3b88a5397e6fb9da41c42c1125a2a36ed9bc626ecbe729e7dc996cb8c5f59a810325f98fe78ac203111aa1182347688ea792dbbbbeaeea222d59099ab3cc69b13a1904f349f8d8c680359c28df0b28b11aae51b965949065d3364118f1f064a79a9da78f4d97c2171354bd3cfc5b13a42493ff6369a222d29a583a1be455bb4f903f08779132bb58e50f4e326990dcacd86827d4731323c1fda9209356874684a99504a8bcbea429f7fe797614635e5aa8175ef8cbee18f3f0ac17c314d52bb0a4536accbef231aedf055a8fc2f72bc5ff8c5b0c102df60a6a06241ca599f80a2582d11ccb4352723a56fa361611f88cecf1b0b4970995e5fffae12160afa1e86b76a299348c20ed1a5a729bc15d5b920b6f36440f5a1114c5d3449a8643fdeb80eff91f36ca13478589060e5f495ae328bf4b073dbdb3c908382de42e178be887af916aacf58a2e765b10aeafbb1c04a1b055b7cdd0a51c25a9ebe4785c55072372099df0ce534d11f753cfa97ea00527c4ac8d3275e23f575fa3d03290cd88413ae29d439ffa2cba024ce1456c5271cbaa40229384c42da92d0cfc5e82edfd8e50fb3aee98467989281580e1448b92252651ce0f2e9fffdd51407e87347c1e8530de8f9bcea83209580b7eb04a99369fc586541ca2328f6fdf3adbdb3287d3e832e9ef05fe914f0c2fa35fac2d38975bfb0d09a2b9ea0484aeb4268a1246d3221d66b4811e804410793cf22464f0ccd0b3a251cf9af02f80ab7b5cea586946129767089ab94318c9b64e88a6112c5063c624d114370d20c50e11273cfd893a634d409aca829dbc06d49939c0e784b7c2661a028a5fd34794b12a03556a48ccd94d7121ec9d233c0f9a4b20ffbbe53504ae396a5b70d6bca32b0570a0e8fec15d5812e44c7e1d67a916af2dd534911464aae9e81e508acab1ac836892b8de3b4ac6791ba24b656003a42b5103b597c1df0aa64ca1146aa8e02881c365027ae55e4dc6b7c18a423fd108d413e043d349f0039de086ef2389f6879325260b0bdc1ed8c1405e3c221b2271c3300d03352f8f4687b5a804c44ac231c746e2355d1a73e04bf6fb0471f5e7fb72c1e2f9d5388798f43db485555148c9a178e142f41dba8718416a71c1abdc30e82cbff86d48ed46e29002f52ce2345d80ae33561b07ca4d6b684f3e6fe48bdb828feaa7ce9a2caaa1f1aa9cefadf3a440ef8744192049a08d8539054da732129632f0d83d600702292e2d10b37148ba47691186d936615d68887a22c928ab9e52b8a3e378ea442cb01196895c39ea5f45bc4d36bf274e807dffdb2e1e70b902b92d4c0f76d0f3f3197466353bc2e310791a438006833c8306f29fb358423b759325f034a52e85a47f6f8c92dfbaf80a9ae98b4e137f4869d2cc63b8098c532365081ec108e9447591b25351c9a926285c32b4e2575f624052b295110eaa1bbc2bbfe032ba9855090693284e1833ec9261bb2e3951486803c2134800f700fab4b2e40805c17558f7cc527b15b5202da7b26e36f048acd2d294123952dd1eb96d4539f25d5440cb6cbd3010aa5c1013e3a951f6e4911372462812e297b516aa69794641711132cabda11ef9577d16672edd7af96b8bda4006ac5108629118eddb1f33861523331bfe38a49153ac6d339981453a078a557b2284de2594a60f2aa7ccaece1c0b4085eb5b2885e0e5f6f4cffab1c8706c7efc006d919594c6a56e0032a55e27effcb88048a2503c21a02d5868c83391b193866c4418dbf3662c7400ca61f40e8cdc2114a77ab7551eec4516444ad93f1d7da687693c39cddbc9ffd04aecc8cad239a419382f9a413f99e81584310fc5da2ed0f9b5496cfa8005bff166a0d2e330391b599779749c5cd92343215739372d2847837b6e7be8e0d2ab8d8a4ecfc7ab1bd849e64eabc0a3046f27bf8bb5aefd9afd779e488d7ac4e0179b3424638dda478092a68cbd01a9e4d2a22dc4dea39f5c5b79cdca3212aa926b5fbc4ff0783c3ecdec90da397c56922e24a0773bf00ed26657d5e5d6741de65c4437deefc53df199dcf91abc986d12b6552468197938225ac27941b94d584725237e3f8c38f2f78c65db417d6c8f075e77708dc7c40af33a8b5cf7e474b7af36ff2f74237b59d97e9e265b5e2b8aa19859dfd00f64e90516d27a5a25d16db6eaac356ceead90346da4975d1db844b4fa99e69c6b01a8356a66327b7dfc6d3d323101cccab35d0aca856271a79e149ad1e601ebeb4278c6109972dc3937ac772a5eb00f8a506195e47ade55dcb3c29c5e74995da481c470d382fbeb1ca4f6f45033761dc36f5c8f57f52cf3a6da6bc8863920a2b502a5510470af3b089506aef1decb155508af10103a1d4ec39e36771a19422c3b0303894dad64a634429c167d883a2d489bc2871fbb94d37e2d4c362c2cf0cbf06948eb08f529531c568b65ed1ea2c0eff7f4535de4829c41eeaae377392de32b0d06b69312952395c1209b7d8f489d34f311a330ea1464ac14aa2caaefa4cf30718679569f6853c4bae94c2832d6b9c7e32441bb6c9875c2935a4115b8b9eb04d1be69d5e2eead738a7b62224c566af0ac71680cbe138b2d95b30a033a55cc4c1f84da953d903f0818280f34a7a8aecb1dcd18f0e0dc8c737536ad16fa466a5eeb5f411de1f80e82f1ca13b34cf31f6004b00d19c48deb97e520a8c60534a888cb934231aab0d78700a2ad5fc4b903fbead161237c04b542acdc076ff5dc4ba9112950a1ac6bc8bbcd20d58a2521f232abb161fbad17d8af6d44911955a8f2fcd4b75cb01139987362d952a26af4a610767452bb54dd01f032626b895da8bc0683de535c7e24a45e267e94151e96932f03400a3335738dc7a1af2b15ca1f67d853a3e10fc0e4a39517bd489fa649c1577a7f7684ea232307c4aafeb27da7fe19d788967dedb2597622c2a1fe792bcc0026e6017cf745abdf947dc7a8e7bd4847c74da2dcdaf6294428ba90f513cd94493dad4b4b39f750679947065e496c10655a3607b61009608afaa9b4cea42565d92055936860d3928c29e2985b5a754988dd4524a569bccea81166111a3c85837af14c7c0e3439ee81e229d028f939d2f879222c1f0a88a3858749ea456e5a290c1ce593a3b7bf68d2946aae4f7029e4152c1fc98cc5ea947e0fc07889bab029b35cf447ab8cc0cdf9d038c68051bfb08fc1cd912d0b0484a4f7cbc8807f91d6e90b879d397ec7b35078ce8c90265b8a1a67b62972924ababaf7a081c50180b7f05f9bb29c5cb6502b8b333167a5ca19703ac42d59719fafecfb00b5c82b0bb6901fd7ed164dbbb061e208408b387f8de9f9dc80118bd1d7688f4dfc436c6567eddfb50f7334d08c5ba7520257e6f45f40df7db0fe7feb43de4664b21b240178051c48f58ca5adffa2962cc2cae086d5c8ab50d2db0ec49b89d44b16f3f2d0c84801c8b204eff314db1e5b5a0fdeb96584188a68895d2fc4b997ea9cc3fa33cf60d0454487d2806cc89ea647876656499336486b907c439c30b26da7846fd53b78bf7c977f996bd0482433db5c7609305b7e9bac617b2ba91692e80b0192e98f0c8763d91add9e5f7623458b23e939b687d10259c98462b3248c1305699490283b1ea0c52d88c556790c030ae3a831486319529431bd61226c946b2a75f455d2495941f41cff29ff9e2b7ecf73b0cae1020312ecaa288598f2b6abfba5783f38747b420c96452f279b5ce6b997f83106b33f8ebc168829ecc946fb90a6929d1d3e5c75f1309a060784e026ef5dc9adfcb14b1ff2770695cd67d1fafb431be301c92abbd67378bba6006cddf1c840a91b50a42c61e8c689535495f1d9bf6985e80776c22d29c19b5e48ac96ba5fc8a261f07b444490c406dc1603706f415b233fe2677fd14f5198c8e3b2819bff31d167e469765e7002fecefe9a14f207f3519224abdf02d4b30f87150a2c378e288d78e1c604c68aa8a76bd50453faadacf3a424a1a030ee895bebd9a1b4a57902c1d90c27dd8b5e20f343746514d572225479c3eb45b88621f43c1f8ad59166d276747066099113f1182d88609840b8b2bacffc6f99e58d7d1097dcfcb0bb79b3d0a1573bc9156942765c77ba50a7f9b157b0dd7e5524332e369f6d18d32e5f677ebf6b080485750cacbde54227187d395e446815fb4f3d736c29578c965ef67975070880cdfabbbb660fd26f158012b5ae442c09354b4bf442276ea6f5d3d24a135e768b688a756cf470d0b77d5eab13e1f06a7a58e559dd6e47d368426b751f832eaa32e1f6b8eed2745c8ebe429160204c154b75daf1feba7ce2abec75ad663dc39702f75d5a3d7eb528f539882e06dd6e64356ee8638a4d98c5176c88a59d44d31ae77455000166f5fde87d48aea8421dc51c748b09e57b3f189f4d3ccf7e40ca2f8a8097ec846fb61ef56150f649d31f5dd50a9914c219bd642f75cd25b358f0bc5c0c321f60aea3bfcb3fbb6474498518be4d3d9aaaecb6fc49e505ad7770cdbf59eb458df2f0ae1d7b715cb13df37dbb4bef1644535193a63f9c2be79f0e6d863097e67cddbfb78e5cabe5fcb0b3166c6142f1b7f3f97380e90e9c401702c12ecb65975f25ab44505db5502007363a985686ce3fc669bf85e2e72ad5d88e311135424912fad22024404732912386e66847d0b6e6e1c6e2ffac016847a26310703a5087ca954c28667e4ddf8eb4c43c91709d3bfff918868c071721d1349b00aae3ae70e309716ea4a060934e39b08a07bec5896bd67c0ded3e35d2102a997d2334a5cba7a059d958242a0fc52b1b1fe5cc8fdca458471240aa5056ec3a59fb01718241ba0a8c2942c828db694084fcfa375529759d514a1a6409b993cd85325490893e8f63b0f94a03361add0a2a3b02390ad8c1c7f0a70a71b9a5aad0029eae681f26b3b773728d828ac6e2566d617a4d171e6e53c90d9acc876b248fbef81b4913e717c11a10b56ab36c07863d8d18209d0a127ec1339867d9dfc2b9c228168fc0699e8e1cf3501c6b186dd49037f9a889151a72b45b51dd378c56840c6e73dedd8f767873ded83aa3bf4b5fb17dbfd6b9bcacf8a3e8baaae9875a48154617103894091613df5ba6436b53df7958756a286be69c38cc93d6a4df4492dbc5b26c47578ee44e5416165d41fe79214653d8b0a5f97d888cb2be3c4336bd1b08219358817089d89a889ca202b2429ea83284a665854f13543556f4f9218754e18a3f299807a83094686843ee87b6e3286a18854406819c31d494c7452d075dbc3d353144033260696ec1aa20e10c37805903f37a63e1131a7897a2a014931400cc95617cc46f36645126b4318e2725d48625abb301fffa9eef0d8e6798f6460360a12e1fb9b5410c928c600c8cd27075534a5abea9e7598c9589d79f230aff80569e74863529da4d67b7d6185ad687f999f142607ffdc1fd98b4dc2ca72e275018ed24541093c5618aca9a3618746704eabacec3b8d4e75895c402fbbcdc9814c65a6ea706692b1cf7311333f149f9550998127a184979bc54cd701ca645465e6a3f72c7f0dfa4c689799b78b4dae8da3e0f480ab38342033d37c132cc7fd4b715698cffc3d0d89187b537a9366a627fbd3d22914ac7e648d33a365818bdb798645a1064060a4f0e43b50e7762451ed69947b3ad2c6508cf176eccaf4aeb70331a829b4f1a49a4e99d6eecbd63adcc9a85c4fa56f574ddd651d81d2e24eee4389d0723586d83db6092d6f59e2ce9287f2275c2f2cb62572679a6d6733b62bcdb7c7e1e254c7ab943bf534a2a533de8145d5365ad9ea3418457fd652a49911ad4b98b8a52eba4374b9197c31c279a53b2997e2d0bb75c7d82973856d30358d1e3e8a2652d7782a0042f9f3f4ded5a6f7d636bdb7b2a87bc416c5fafd45263e6da795bf071197f0f25524c51568bb3decae4c8a036bfefa97897df52a700d2b60d47d7f2be9b179a79c50312bff298acbc5db97cc0ed0aca7a9073df9dc5e1dc0bc1b3e00afadc840aaa0f865d9207050cdf6f4b700eead3e9799cf354bcf55cf962914dfb7873d238abffa66d12d8aa788ae3ca3b585e81f741fba07837468b475c0687713b21ee1a1141f37e6143d6265d15b599df47367d4aab55aa517d72b7a3b2fc58154a2cac3d993e2c834c14446319a1c2b4806d95d11a31d567016c95d43469d5b168a7f28e7db287781413e752ba22d424e4247ffca11000e954bf0fd1a2fce08aa8c281050501c398284971e145c1123175d29f7bbdcec9e70ea2fd397ba655a097465a2fc899b1d2bfa1b390b6c24f0e84a062583d82dae91c0557844cc0c2a4c8d8e2b455d393f914aaf5d572ad8a848ef76b5e111f00bf9e4899a7b9df88246abca6a4dcd4993e876b6d1819cdb26de44543ce1c4b71ef925483ab610dbc1e8373d7a50cba9f089ff6e80183ea6e24f4e36ef4e287e71f08d50a82741215f1a52fcffd513c92df076d81407cba58aec3dc5779008493815533cc5195b05d86e15d796e223501104cbc71e5502837221098ff5be12447843dc14c7c9736a54bcc6e471590c4bccf7b513b8f4682afe814d0f544915976a7a2e106926c249cfcd70abc10e15272b1ce3cb0cb9a3ce20151f01e01aeaedd996a11ab19e88457d530e6e062c9fff7cd1a838b05e4b020290f75f30cf3edd0804d1a4f7da6209688463d6d1f49a7cf79e23e60ee13e155f105e559c77a807cd6a157f9fb08f3696593360e6de40382f5358eac02afe25b2f76276f5be39f1df7e151fca1fcdf0663b17c82e491fcb5a9db333d64f7c8fbf34d48aa834177c838918496bd28a731d0bdbc1e463f94c23555ae2a35ef1ace21ff6aebd8a83bfe63865c547f555cd7caba8e8dcd1e7a09d29248ae948732868f43c595f147349b24c8abb0aedfd00310d100d2ea0e02929d1c9b2cafe2ab4f701c474407470815e07e26a165c5ab267646c1e953063cad25044ddb6d5891d6b1f395616de39eb382ed8622b542a147825ac6d2c4b6cc82db3f27457f1ddb16575890ae70997c5232f6a30fb057d573a6cb29f4476b1ab38942962032de126dcf2db651982bb30f0159ff22a1e7f86b2219c6130c2ce7e2c52a2217b156f027009688edc903f38b3cb7d14db0328b03c9e644813b8640d314b22f1757951c5b3a29b40d914f06f07bd86090979551cb0956bcc55fc20d2581d2b0e77080837cbc5c6038cc27492e0cedd8a034d575457fcc064f247ef2c49037ee65705644869944cdb22ae7c514cbcd24fb260323badb64f466957db41a48210076659bcf81c3257f14cbb96c0563c383a573c358c74e115673d88f55f71f4fdee4f8d33de062b8e052a237ff3549c96c6e6441bb6e3a7e4aeb1e64faf913bebe3b47c48637129b42f45b6f597d74cf4e56aa8e5f881f285077b37ec99f1527f0f0d7bff59165f733250f7ab55b1aac5e54fbf33ff14b438a2646a6917ab7ccdc2174c801677c8a4491c22236a8e708acf5e1d6fd5342f3e218b1b8ca68acde2b88622c26d6f428b03b7300d1f6bb9113ed71d74a93042fc6de3513df6df862d0374a39029c902ad25c4542acfb7495169f124e055ad6560c53d06c004f53d2ae39f425ffaca11b1f24701b9f82a3ee0b6d15278ef01bb2664e3c7b7b81fc0af1902b4a5b92c01b70c0db009c62d204d4e09023fe83641fdd39a37be064ab689e6fe43fc3b1446db2406274c0e4b347a798a47ad9455138732cb8c88266c5e24f3ca82c505cc37b4d89a99c741889a000c17105e4d6087481ec635e103c0b462c2ea433ec579471cd989ef3996038db38b134fee45db29a22c56a5a01b56fa276ad8c6388ffccd09e2cf3ec33b38cb44e85819d38b00959211c7fc1fd7b2b0a45b2832015fa4d28d351dda0b39b0fa68a8af379507bf14eeb44e602d9d40d7f4339ec04559ca7b617176a41932efc33de1553e3de0211cbfc0ac2c0ec06bf58700ee694f6eaaa309e53d815166a5ec06cd1e10e5115a867cdd67287bf213beb0934fa3cff88d7f366b811f425e550e475aadac266a8ffc8476336621ee3ca01e0afc0951520e6db757e1ddc8c29a71fd3f212b4c7ddc6028341a5c9262b1ef2e20b679ca70e40d11169b3c8001cd500b14886f0814626287d8ffc542860e65685343332b145801086fd9274884eba84c31f2ca7a4e816e0bccd01fefc7212d21983d68ca48a7096eb68155c1fc7d0601318d60562eda2ae104e8180972227ff19e90806725309ccdc3f735282ac13e5161d2a518af8295ea1f83e9edb89c580eecb17260a80d80821c7f04dcf53a4690deef1b9090edd2360650a30c4c287793c10e03f679a105418256ff2c5db85c8bd3df6ded9709be83045c2a3b25fe2296f1901d0d5c10b56591008c85a7e2e95cf351c72261f598914016ae6be248386aaccce0e0a6073f12a4d8bfb849501b07cf51315524417dab5c819df6945a64030af93b1a089b88a3eeebe84ef1129e5c9584dce97d3a650f8f73492269a49260f6ba24f960e6c10dfb2a097fb3a3d1c8065a12c08cd2f30b5f68969b521426812f3d0ce8034a60d6300044499854aba8394fbf81f4a9350913003fd333adf439bb3f6ca47f47e9e3ab3cb04df606ecb004b437f46f709f11380949554900fc9d136ec570b4922b8a874d4f03ff78fc8699026027e101b2088a7d0c48f0269275d7c1b3b9539b4473fa57899cc3e930d304f01b5707ea5222184ae8145902a7bf81e240f541e6086448226cf0524252f187d9fee1d2c6252024366cdc123ecb7bb7c6ea1259ae12fa1b2fa0039580bfc3b6450812b1fd16038c12595009e0e0f72107623d0eca9c3cea311a2ac1d98a7f268174b1434e062dd84e58098a70892ab5cee33fe18f9dacd387c17b4bc611b0045ecead3100470771861a8d35cb80c16aecf6b9efdd0caf2ee3b65902e3489a962081c09b624b004ddac80a8ed4e75b4226b741b9043152deed4e0fe9e225ccac2bc5e01c1c7b09d1b7d81b9abdae6be9f2b7bed773199430649e99ab294889694a86317f82c3f1f3d8d97a6eb826e3ccab65a5f3ffd0d18e84267bb73af70892806e4a8c2f03593b9270cd51d34cd4f9c946753185e664cef8f4b860cd6c0af5aa85c824b839903f78b834a8c1d5ef46a441b52fa05ffce1f08db3ca24089d042550448ccb8f1e49e455c49ee64b889adfc2e362e51db742ec2cbab6544bbccb02f04380a72ca184c701f8865c9915bdd0333a4625abe3b9a5a20410998c7a8d76a466e040f5a2845721020fa7a439475fd42ac8804a20499cfd185980ba30c0f06b693a9530fda50c07768137c8fc95e62e9520064ba0a6124e38fe4a6260893dd451c2411c2dd0cb8b0153c21ba3e17e80958061a01afbfa0a3d62f4d2d584b7843d4540197db622e693ee0b959718877209c96aaedde2ab347d280642286a3a9469355710b58eebade9094be3684c5a839e80638f60d3435fda54da69cfa4083d67361d5bbdd32698504b15bd5e4856f525549255d32d6c4a1ff10781bee950aac171e097d2d053f42874b31d920e713ae977b9934fd571fa4158945a2520194990b42c7e20a559b991926597f0a0b7f430d337d8dc64719bb091834f9646e57409426ceb05fb7c596687392633598d200fddcc33a70324f3c1ae0594ec9fd4008701c9081342a4d0e94f5dc78456152f9f892c0c640bb4f4cb78c721e4b4f0b0e6845de6cb4e6fb5ac1832b92aee740eed3b5d038e70a44e39371625dca28089eb4d2091ec0b9076c21ecf25d537539f88a79fc9272f1afeacf74f8b0caacbe30a4db962fc6b96b97697587458b74f000d5355d7dad35b76f7d7c955f0e926106a7a76d35556396697f0d32b53408c40713edd73c0e4f72361d82943dcf1e8239fc2628d9f411344d8a2febba793646ff9d818705b558e5b30dd7628b2f9bf15d8e0748037c836fe1bfabd5544ff9bdd2a55ec8d8ff0954f84c9f1cfb9edd889b18e4f4a10ce9dfb71f24e6def78c1d9035a1f6ee774052b576eb51c5b493d6a8bfb588e9631a4065fe078b01d21804ff8a567b70dfc7203f023a5f2cbc4397a745d9aeac42aee00ce022d8b0d197e9d4a2fa88a9c25268e5e6982d50ee03ccf4183152a0904b83ce89182b91d7eb586fdff9da48cc9f82397026989ebd12a7af493aa361714f4b299591a37852a3b7b36d69c655645f788eaf6e3ac89efd59c37e79f34d86ceda9c00abd7e17970c62b4a51c9526d01e6949614c71ac5ed0f628b72d73f639eb4a0f4603b43d727875ce1edceb9dfb21b1d7c0e0c202f7e8dae5f8ed774cca5e5db587f5c5ca66b887b5e55b1f2a71cf2bc7c4bc4202996aa2381bb8005fe466b3e78a09bd271b6e76aca52fadcab9079baae869f884ee01aea36305fa7d696823e91ebc6798189dee5971b62db41d70455f30c27a97ef9e748ae4b0a0b6c9ba754f29db68ce4cd0f4ec199f2178cfb0013a31249cabf4cfdfab320e9ccf3530bea6925195074cccf3e95b48d2b0df0bcd3bd2ae0a8018ca4c15df7307e92acfbf71ff4ecdb6f9b91fbda23ea23095e34ed4924403f2f7d85f72e1b320192805ca3068ff3d5befc9b30e5e1ea566d61e395b3d34f03959fac65534083ed894762826c79306f56ba7aa9cede043ce08a6761d1b3e90544d9d217bd42fc07a411789919248d53f9f87ae46c341420d74128cbbdfb0c3479cec89997df8b08d5b6d6e761c9d33fea35ddd5573ae9d699699611e041a5dd019d897d73b521fff36d44adaaac6d9c661149c2c685d18132874f1ed004cc63ef9997a7d97efa4142a4890acabc9cf84531a9403027f1b15cc887a920423a5669f208e6cc07304724e3171a4cacc1abeb4be29413e821065179d19138864c8a304995a31202790b314372bcd2aa04a4c673d4ac28c61a63843f3f41943a2e8d80c16378021134476d6b448169e893661936319bf1a9a0c21d61c8cd58f962731164e5ec86e68f8602906883b119746196aec30e21cc4d2707219a118d759f5c134685a118408032044a04466a0803df277ecc398bdcea8e33d2e66b1d2b415a5cf2203a047340b320162196fe82693a139177aada20eede4070792f790659450cc5716da8860f9cf0c8a8b39e63c7682456a979db671d32152c7661ee5ba9c75554de95516b1f45409cc4b2a8125b0573e5dafd4cd0c96fb9544a9965195264afc8cdfb183e27b81c36daded430701b9f43067410c97aa6cdce5cacc9c5a328a6118cf3b7a8fc7f4da24d8058f4a7766328a5d3cf84d8f279959d9bdb18279c6dccdaf8349ee529c02cef14d13ce297568b36ed46230cb325bf86a1f43f61a6c48372d2c0d6a5c919c7f8f71fd171a568554a0171754b7030514b304d1a64c58ba1e7b915c1ade34478aa453c52c8804dbca1419a53f525d2c21ba5f5606220b057109bccc228347b8849c5be1cd2718adf84c89ac6945f2fd5465b36b05c2636acb2e805849d61f1f70e033b3a04f40d9df215bfc279646dea5575567a7e75de8cc2c5664aceec554ca8066f2cbac0ff66696636c997deffbe44c7d39c879a6bf4c635f6e384b0ccb53d6b985037416264e167e9ad874bf2206741d07c455766b62eed40c2cb567d19683ea1c572f165d50e18024fc2c4f34cd31bd7ad68156cd7d7f57a7afdf672cfa7b1cf940cb6a1c104af9f7649c17b4a847848576d1092d5e52919bbd191d74801eac40b4e047c368b26821b3f1970604ad67710be971e77199ac407f89bc7f0e7d2786ef0063754bf01bfa4323f6e13694dcdac6f6e72fa05d82427c1eeffbe6938d43ec2606de5a2269736241a3cfb9526ddd366f25fb53a08bb83dab7229fe958c042d99959d6c73b0099ae2a526b464ed01b591247d36c7a66ba1c6ab8ab2667fed07c173cad634a7f557d9f4ced5aa88e50921297bd1605f14f2b48ac5af0c1e58551795a9175879c20370d403190e63049969287b981483f7e942aef3c2164d063df4ac978d1c1c55f54ab81c3558fd759c0c5683f7792586f3f438a8dee4014ccb7f1311e31bea015468ca83bb628b1e2dff1c5e650637afbcc93c26f381eafbbae4d80c6b29843c9cc6a218a3d82bf481c79945e5852fa2a2f0f0d1f896fd49dfb34869abbc4601f2ae1406ebbfd08240411308015de39a3c2a122e08dc40261f3e0fd02971a4c97c41a525066b9d10c349e5e885daf468e1f1365040ec20fd19b8d2b66044c86c20f6ccbc2e609a3d5ef5b6f47440e136ae2a26c68479add601d94c4b9e1f87db464b87c15961997f6bc3fb9383705b08ceb6e812e1a77d114a37ebce4bc71c068a8d3c26390c874b0343ee380c8702e0e6ddd452d88cc3480748f6b977c8c7d5b8c3598254b64bc2e582820a2d67293e40c640fd705bd4f4cd8aafd9acb7e4c762dc610499d9ac0f81bc94e387b33cb2fc9ecf470eac627b69a55e71a5f1f737bc4dd686acbe5c7916a71f5f1a1d375aeb0ac66c449a7faa5b9f1ee6fec04a2b9461a19e2b8c0a0d45844d0b4634b72f86eeef85e9ad81d63b0bfd81c84c9efc438d1724f54d67d964d0119cc0de66b71efe17b8d8e2b97dc15f0f2049031a8ba0f37a91f14239d54e467638cbbeb877bb1816d60e03e079151509ce77361b05858c103f9c15a124875bd465fedf82943ff0b736162d3138e84876aae2805bd7fbc8febb460c554b6c75c30d57951436acbdebf5538bc8df7d813a13b9a27ca701ae8baea57f9497835e7c84ac023600b6f78a79e75a846aea0e4503fc39d444741f965a66726e3529a1db9534c179489be0fc205914cb258ff841b6d51e01aa6c908beee8110b952e90917f534e645586e6e60aa693388b82c4be91063b689fd0cebf1581285deed7e482394e232171161ef7629fadf3a4bcef54d02072332189b3b65187e10aea4ea2c2a0575f8fefecfe45f47115eebece652dfb585e9a5114048cfd5631af9b10b8b015ae4ed8b2adc10a0816113dc75224028aa3fc1925f41fb87347a3b34b6a669cd5d61622f020bbb7122efa597208347fe618db7a4125a26723131bb1987625e6289cc15425448ea8bd7bbc48775bb814ad992f6841c513b531f602554540ddcccbb1d32582ecbd7379f28f13f355b7de4daeb5adb21f63886513a8323a90aa2fd55633393ecfc8fa79a673c65ab397f96e0e4402b67401a84fa9a6b5747e55a35911ba0645c3c23ea340a3be36207e69faab3fdfe195374d0c20b6259603c983cf74af96d7e25d39f74884505df43665d9e709f44d2f88b11008ff89cbf9179cf56f9cdfcbab27217fbb8b8f2ab6c83acad74a18918c139b43e883eca6727d60c7215b31ea5fdfb82438e4db2f83f3a4e914f46a9085c4da2628abf4865154611d0b64858d6eaab3904995f3d9775a4859971161b779b6e5b781b0ce62758443fd03a6802c42942821d467c5ac37e19e48211392724b77eaa1ed16110e06712107344dd5632e76450373779bc86dd63d75eed18882cdb19e8ae2db2c37665e35f14896629e41e2f54bda097202b82a4347387b18bdd6d795133f2858fcdd6065ad6a4fc173418affa38d6396e4d31f49164d6051007eff0483b6cca26e46b618fd1c07e28a6687bf58d6c168d471bcc47600459484989e55d2488122e8c1266fc4ba5b484bc6078a65e045236fbed2ce7ef3281fc73aa0a68869adbea8e12a5e50f604cb4a65228b105cc3c9db352474891c0baf2648db48e3d0c28a2bd947ecceddb1d236c37d9c7892281cd5012f09f5247ea65b6adfbb7eda53088eee4fd259ac61bd5d2f5a2b750e220a5e987fe32af1142508b72f050a4093a4b4347440a908130dccd74ef112602949ac4369e6508abf3905d1237061f473ebfb391fd16911b6d5244af7005154194b77ce6546c955a1ca1e1082541895d291b86a9c1c156632b2a0cb84f6a8885080071d56228407fa391f94844454a4c344c86319ae2181e46d0a8514d97d60555e01500ecd3b463220ec916ab5cd6c98c132fff42b3ca374c9c85562492911cc0e9102acd2a53b4f94facbf829ee9018ef81cc16d319bd8d88c56e2ea0f01954d5a88d56f026e1bca321640a7ab72d4e7e98303e39650a78fcc0330f1e4870ee54f74975795574f74cb301f3bcac69a5a8f71fbcb6b11fad85d9405e31a0c07f9bd135e301f2d7a72b87b23a65085e7340bc70d3ae2a3e5e0badd54994143d6c3c5309ba906859a0a0504c39496a604b3aa4ed61fffc409cdd0f270264a7f4d0afa60b920030ab304bd51b584ee9e99eb13021e43c47c66e4f9d8d915363e9c5f55a3e487aa5b981a3f1022404013ff9a4bba263a28ad2b2ba8aa09b040d1d95a4768fd53975f993cc553a89e8a2b8e426ca8b0d7e931461e53a0746bee135a1244995138532547423b7a58d23294a4f584f30baf604301aa8dd6e1d90ca528a304565c609e0d6b43ca364f320d81a9aecb1a342be0ad7c385932893246c6cf9dd7427b1b6fe9f654a0c1ab39a617352c66bab10c29e687919f5d3e3d0ebe299aef6411bf683bdbfcca33f70c6f9b21abbe2b9abe4c9995dc518c9819dc76ce382e19c5c315583cfa0c0baafd35123e2290cd5fba2dbe61724199bb705801795cf2337edd77bc4130ea848966f3824aff16fb51d4729223f925485350a9886f747250908e467afff2bb780a650f0aa1aa5c74f61f92be7fd2f9527e89349041e3c6ade9b08a921c30f84906645abec407f95cd06f5d163139540e8f2d1be3609a4eca52fa9a17971431945c4a4860859798ed4906c76b205745035d68f292292bdce4b9301a4be160b40a460de6edcc20841fca9e41a6f7ed7733ab62ac33dbe5e6ccd75578e121346c807a32ca2a50fe57b036512d6b36e16086463c85455f4f8663685fe58d03c89d87aa72db1470f79d8be42c5eed0759164430985c8c9d802e18ecc1935b35348210fc9638b97da0eff4429499d122d811b0dc501fd7a8b32d99b44b29325e21c18a5f7edd97d37be7cd9c8b61bb7e90e6f60a0b6a2e73550fd2bc1f9403be51059140d4ad7c87988b563f6f1503a9e3c17054c2dc41d2a1924b1eaac688e4d4c3857c532860de1a065a1daf8c11d841fe048dfc9892bd9bb10ef67809fb87ca80581da4242a2395f265dda993c346649b185fa40488f34979ba16a510fc3b4b93e2baa953fc4dd4ff5ea2ee1d5fae6fa90a376e7954b447c81bd2331e778d5f27882037d307d0f194e59db7721de5909a925eb077a6839fe4497ebec9a180c353ab10e2e0e1c349e1369861f872117d143705f549c7846687478da2dc1d026321afa2725e6425409b00fc86c97de7617f0a562a9d9256c5e8fe0c5182173b18ab6c5df9c4ef451105f0e5559a2fd2828d18b61a5521723002ae10a6f2dcfaac919633b5141542307e464759c953bac8c790ebb882569cf610e448c572de9504db7c6e3d40dbb5bf3a978ff045dbc61862667b133e13b9e327c19cbb36e719393fb20fcb534a31847e006a044beb14624e96068ee51cfc360080c38d49d26e12aadbc57e31a139807927a04a7d5cefd000640d2b39b726a824711a0b69b00ad5be4a70204f6b7e2ed59c457e1bd6cd97940349584ed9f970bf6b97bc30317eb512bf6143eb0416d881f4ea3c1dbd8964267a022fd49138ed3d5f669229b64ebe7b63ea4cdb7697c21c844a3a423aea039e099a6adabc03ebc21590d2ff279b9285ed5ad9e993c7f561824f198f3739116c6c7ddcc0a9f0b01a99ae5e1f99ae3336b6fb64a7c67bb544b6a3ea7f689b6118619b3d6a0e7a43dfcb9c13531a9d84d7473a5a75819de0da034fdecb8461168dcf305e1a4fe8e6b56ece5ad9bc02181a0328e6be6f7f450f5707682386894a2dc4d1981dde86a406f756d07ea5545b7e2bc34948987ed2da723d640d4e3d832e29fb6795214f853f615e20091fecb64bf1348010847199de61cf5dab074f6437c512257b34685b8a6e077183103b1aaab46af6b20008f9b8830c9971412c274576f6080c44dcd7e4201a5f936097ae19444120e74795676ef125387b498a4ba4bb2b6176d73c787e9f96b4fda8c0017b52fd03b3a948e567401c79925fff84ffffa1f8503a85e6ea1df38b8ad3c08d71663a5e9fe7753e9c3a2ae61c43550d46e090c1e1e6c3b27e6b26c85b8ec06043a8263c64f8e86ab85061c14a210ab056eb2ae53250591aa5b1d04980839abb2b55a827920116dbec0d678e0feb4530e3a65624a3c91e97ceb5f3be14151f332f7bfb3b0294e6a46601c7e76680508bb3cf12327d6c14b08f9121ff0ccb4bc1902c6da71962faa332e9cc935fceab2ea03894240810fa84a6078431f50bf8963504bcd4a5763fbf6543c0355eb5cade8ca2c0f287e04dcb15d3c8c1de37e51591c258170876518e750d6568bd08d7d1584d4e582a3d0d6c940fcff454e2d89667d395a1682b74d30bad08da20222a023f473015b327402f6730fda369718f4264320694535daa57d0c9de02d61124a1d5dba7ccf6b078aac1fd02a37a16b933ef021672df26c18140920d49144506ffe0efa5fabc019100d66cf92a1b36e2efdb889ba4c523a738d421a2489cfeeea1505e98b06a177470fd9ee70576988955f90642c994cb57312fbc6de1a9a124ee920830c2a5abf4e84171dfc3acc1938f00d773aec9c8850d1550bce41db1ed62b170ba2e8320e749f74fcc3e18dd4dafbb155d2bc16298128fb504eb4842e8195d807182d12e8ab7d5cfe26a8f3ce7755055ba53e13baac6e760806c093e340182645de4acb66a0334b092388dd9e4a94687799d1d80a9fb550d0099e56bb02934c0ffef568c2d9153457f1042988c289ad3c53030bdd0e1115c1e9245bf3c9828229049d00a08192eb9faefb855bfce04c18181158a59569e7ad73c59b44ab92409173a61d64ba948af70b9d5050fdcd9370cab6804a317a40470cb15c7aeeca179d0004af711ed0202d72d149cb688b506058e4db694d874309d7e3c14609f69d4ed72cf1c14639124f1f759f0dfb702e716e5cb3083e8394afc73e989e56094d34051c107cf993e2860f7363915915219d48094336438e457c525683fd05dbef0025962114f1ae2c5991e78975c7bf265265abc08ed83b0809324bfb3be33bf10a6a284d5e59380e54ce3951522037400a0bba1acb6745d5923e83e420993a1020055cd40c489880ce2912fdc2568683bd7f8076fa0feba24752a2cd67cab172772046cbb8ac42025fd3919c14f87ac79ddd85ccb58418f76c87a6f4acfa64314bac8f1915ac1367054d977248020808cef0413d4d8096a0fda0d8df1178f7c3e09e94ed32f45e45e7f2542f084592150233d76743368f5bc160438006bd3e55b75fd5612087530d3d3372a62c6480aa6151e38d7a646dab61b7f3c841ac419a59c66a5e1cc81b9d8b40fb9bf4ff03047a9b5401ce4ed085c505cdb8ead24416db2bb7a9522ced93bb2d1bd95bc2df68fc91c4f2f774243fbcf2f0f7428a0ba2568a22d983296881ee33a24aed0bdba5cf0881eff17a8f3393700a8fab3d6e7587f5cb205ce63c47b982ac9a4e7bf56c4541cde3a24f647259897a64b95b90ac635b9add1a6d45c35ccac973ea3d20c0ab2426594cc6bdb403a72120a550d801994de95e0175ee80d8a8803fc14037385cfb3fa8263f364d9790e68f92876577cc23e599956f159602f3eadab027bc8af7f06f5afc42f2c6290ffd3c946cba21df8733e931701c2048772ee162bfda6d009dcc969693acdadfc72f2064868afc910b0c465ae84f8e6fd85aa1ff2f5c752ce2944ac6dc83210be2a7d66e60a1188ec6847163337e70d5337784585c8658b03b8c10676a5593402d26d10fa192f0c219c55c3784e9af576b1e5e3b58d381111f2f7afdcfa6f9c9b2bbf5c11385e854369e63a00c2eb1b0243e5e4094fcb533e7c66bc1d2e7219802d0fab46782ef83076c857b078138a7c450dba8f9227dfde880892faccfe684d9720604a5e24e10f55c45a2f1a4ef897403fb08907d583451c83162cfd2bc42bc444e46b394947932a011b6ca9871a5a01166031361bd1449241193ad9bba34c179245ccf43794f4c92033a078f846465c686bc0195bd60031ca607a376385a42aa5e231b3bdb3cfb1d437f38ae3dbc4af2302b507890ce1303480b6b89bacd74ea4ea420fbb84a7149b228020ed3c28ea02f473791b935110166c7f719f8e501410b7aa4fd9f9445f237e282827f65834b94b770f19be537f0c775b7dfb9feaf8c5fdd2765a17b3ae1ddda928ef9330ed5bcffe8eff9683a4375ae9b31dbc515326f8b07a046b12b1a9c287c67ec08e956b235cfa7f9c30bb9d5596d5d75b2c5220be179e7d61159908b45f0b4c7a81cabd6f81538d3e2e9b75aa6255258b3df1e1496feeba811963cebb6d684736f93ac664df413c0b7ff6400f1e6c5aa37a5fb6225873b5ad7a7f2dd562376e1247df57ed4d989c4b5d3fda5def6f524fbbb1db7f4cc08acda435eff638dfb102c5127f8915f40d12ca52ae8f4bf9d1a9da4331e04bee71bca60435a780cdd40b0313919ff8085a1cc93694897a7db3bdc85de8f18995952e218a8e501b6fec171f128efd8412202179e55a80bed3816602df20e4747f667f3de7fc6e67fe93ec74b47f8159a2673bfa87077b8cba166ef9eb89e142db020284c557d0854501852d2c58dbdbeecf1e29b210dc8104752e99f1912fcfa29098e9c1f4e18a0edc200b3e20e77c5811bba8c10041934ea177284cbc946408038db93eb258594c9b7c3f5f198be45bb36694706bff2e0d0378bbaef55ac3a2041cee27738bc6d05963e994d417c645c64018435b53dddde0ef76d1e8ea3797c8debe1b50a10841e63536d23050c1253e3c0bac21463cf435c58bdb4d8c3767c9376b86e1c14f937c26b87286939f3539f1e25af895495b01b132b236e331f4e8520a81e0af1e38cee3fc50424cb54a14960c95f905a8d0aa87985739bc4a4dbf450d0c0dc2f399a9e27f3180908a5a4735947e18f877caa2bdbc075b7b4fe5b7e52af347e9b800c0ee818a8f85a9df00455e3e62ef5537b296736e8f429024f563a79c08068fc716ea258ae7d0473c66a9c17555c717e55877ff88f7e2734a9bf412fd408d4729b4a530abb910a64e241f1d82bd04a66985126095806dca0f5de26203bc2241db69f1983fdadd875ae621279c29a0a05e8c88497ad0981d36fea20bb81d2c21a89b89dc141c530bf2f598e3bd9fea3e9ce3af7e634b57302de0b170369279e1ec8c8c5fd95b2ba65682c981f9101bde31f964850f1ebd75b4083ee87c3b6f848a93014db7f124a6e9f4a2b070356551b5b9cd186c63cd46a1e6d4e73c6307a9cc5174490c86d9442920bd8b9ce55984b61a19929e666aac4a15402f041789d8cabc4d852e2531d6c8ad6b03655e057a689529545f9e30df6ce15701dacbf7658881d24aa80cc76e72ab6741d4c22f26641b73cf4b7381149940fa9a371822224135c10824b605c1dec28e1b28d7ee0678dadaa5d069c6fc0a661e78d7bafeb7c2dd69fc8ebe561b2a56467df104b97b0f228b3604fa1d6f3a5b4454d1555f4cf694e82cfae6c2b5b3957f0cd4b80c2f0c1f7ea717a10535135046559ab720d206b56ce88c1553856e2b15773c2283b6fbf59c59860f1e7d9f43827c90932b6117c7d4a8cca3f44d0725edfcd9549a07e501ce7d976bb023ac5c6c40b0b749a559c2ba80d897125f45c5b8f22e8ceb854a6d563b47c9df38f3c13260e8904dd7c60088bdf3a5ecdb88603918a135e762bcebc170ef57c45f140b2e6561a82d4935fbc7660cfa3f0b581d8da8407b958ab2e5e8ac31c27704477d3df9d54c51316f76deef0715a7a6c68fa143a148fb37b3e4e3ef6bd40462a2731e1e328360b012d95f3cb7b041b5895f83825b7814ae7b5e9b8815a8d4cef38df88fa9a5ae6c8d2d340503ddc9b4e839493f9add332c6303fb574277ca41bbb982cdd019bb62a06996678d88a86ee3c21d362870fad4d9d54bd56e28edf02749e5353c44b7f36b5144dc54bae9aca5f9721f49902f4eaa3dca3c46fab906b9a65ae3acd9f545a0fdfb2e2d55dd5f4fa0e367d391f3dfdf6275083bc6f7f1ddd22574076db07ec6be594dde26ad5442b812fcf6981d7dc026f6e63716ea725b3732baa6ce49d996e6176953b09840b65b7ad13399538f0f03210f2b701812f2fbc7dbcfb9c9be7e1ad3ce66dee8e05104e86b7b7f33614ddebabda87f7cb771e4fd27ba55a9813cc1bc05800c46cba7609a2fded1edf287395cf77d14673ace38cf7fda1571300d908486028c9add4707e28ad1ed1341b81688967c53da0e15a1be402d550a7ea86e069a9e41f582487c675c43926717205eee463a99c717a453faa8e54d7168bea012dbea24f415ee51b19ed9d748a10cf7d7736959e3531c90cee94d42558adc2fa4faccb97a2d26189a8527f95038411408e063eb40f2162813cf7b29877613e83da32f7789fe9102228e2a3f54b932207cfc5a2f6b45edc11ec230eb5276782501d1121e2791f8a98a9d0d7be9e56286ab697fc9662aca32c2eed9870ddc6cdf0ca534f4b643593edd3c5b81def011a4464f9ba11c258662a31ddb8f08d58606a919aa09131143fbfdeb40ab7a444541728449962e5c8322700758c302594482dc1d52232bfaec3bcda26341fbcd8e513d5922b4869f52c638cd4555a4b17a367e2bdfd07ada5ad92e408180c22646df510eb8a888d40221b5accadc54464064c38f22a3e0a2e55ad717ad263947a98c9505ef46655ffd445210481123939b1a5759dce7a7214bfec95c1d205ec6cd943e24c64106a74a4d4dc2017a0d872b5c316160693542fa8945729e31973e39e954833e213d341cdaba31b800a7a01a32d5765331f93a0ffbd8d7f28ed0745bedc1e4d9c257a76a953647a1b3449c63e6270c7ceb9879ca234d5a613cbca8e8d2e5761684e6a2601b0fe2961c7988ba6a926bc4414a333e166bad7c8d6881ac8af1283089b78ccb971b31e10aec9ba4c57602861f01d38ab727720c9d6b146124ca6fba7edc5d409d835e576036646e2ba1c4c9b7faa60d2c59097cc0214130a9667cdbdea3aa96584cf0d485293150281924d4307ffbf46207e32be4bb5771636ce430441a71f9f381729ab9febee4b9889eead1c4ceb4097f5739faec7bfffa7fd8240fb146a8198276de3f0db166fdd999b7a1a9e06bbcb727592b6c13747bd7742a6de97f2ca0b58a3ae998a6eb6c7867cd98fc5f8bee6ebbe1141e5e87594e472babe7594a54841a38612993bf525fc3c64fe9d4a763877db9f6bd76faf00198e33600e581bf6aaaa9ef41deb8057337d479e1394aeee850d4236189b81be47ee625d43eec85556077be5349b41b0b634a6f168f75c405b9b2938188b89b6461466b52546e71fe036233431cd4908bf5c3afe9a21aaf5a31b77d9d4457ce9602022e0baab5d02f78fc91977933200124665806b5b570b29c60007fe781e0dd89ed3ba1e975022a1ec4459f697484dacbf7d470a353ef7fb71f6f25da36ea31ce7526f30b2bc96136620e8ceffea5ff89ee1d1d237ae1744bcfe043e7d44600f501040d44e3a8a15d63a5dbb5ceb74ed98b4715dc33404d73a8d592cf5568ba5460deec3189e7db894e91e04b7da2edfe5c1eee5a726ab0802dac72bc1fcfb2dc0f241b6412cd984eccdb67b6f29a594322f0eb60e8c10437edaac9e0f3d5d7b2e72ee9ae643eb023de7dbfaf8cc73a19ee73306e03f7de82782157e3628f4b351bb9f95b2532c3cfe089c3ab4f47d3ece31ced1e8875401232f828f7e4811f0b90f9d814d7da7ce225821c40566f7fd8c7e2dd8a08d22f187a80ad5f769b77a57c88cebae98adb5d68afe4138c8c531c8f386b73e8af0d643ad74cbdb14148483dc2fd0bab539bdf9bde0f0ade17507913d446b256105b68e906bd30aee8bb87fdd711ecb8d6d7a4d136c306842f5fa9bb11811c6697dbcc07a7d1c471ff38fa288c3d03f0cc3d0814c3e17edf59339bc1d77be0520e47b89e7fbf73abfee39c64b42289a733ffb8e7d74d1b7affc85d7280487bf1c7237abc055a55ea97d63e00084af1ebcf62dc28f41bda1ea34e225edd72b5386dfe37dec4cd8e9035ed23e96e81e773dcbf09be9352e573dc2cdbfb3fc8df956b3376adf1e7cf6ed1c9c8f7f38b73fd1ef07ec64837849fb389e9d05f51efa503b06f1d77119ed551042ef702b3074f257f6cef25e294fb5dbfb295ca0f60f58e3156b59def07883081c9af21e4bb0c1267bc736ec5697ea07a5cadae0aa12ce3948d02fdfa5ec5614cd08e40b0cc75ffda09f4d71f61c757997cef302b5dfdff8e5c4e5056ad187fa2e50742da24918df51c47dd147f3041be88a28920968465d703f496f5fd2e8fa9617a87d643bb17b2662b3cd194562c07d6cb5ee5b8d94d17affcf17b831e78a265510aadfeb79c309c2e29cabf8e2b423b4c553dedec69a4ce9724d1fecd4f52bd6b1b8a09c9d1c9d13848873d13b5cbf4d41a44edb5f9095223f88a85d91fb90cbd5aceb648d52e5da485c2e97a343e272394749b29a246aa5721ff2056eede6af0c71e82651bb22a8082ea98e503d8885b1ba6971b45b06f6a2b58220fe5608718176ea2e59b7556ffd2a3875ae108224ad33597fb2ee408b9593605b817e81b704d1c5b9fd9fde8678baeebb5e3f54ad73d6595fbbc24a7db8406ba7429bd182a7de0500e13507af31bcf6a1eac4025eb27ef6ea08e5f9abd7babeb7c5797d57350f2b5ca065013b59af2cd373564457b8407b6fd876eef173d8766ebbf5d683eeae81ee7e0a3a9b8697acdb34afb4ed81df936ed3c6f13c6dda933e824483ec1ec33471eadc15edaf557b1be236d57bf32f239980fd3a462f8a82a757c1ad03b153074fd68ed8c893648592d4fae9bbc12020b81297982cc911631f47c798c49125ae0c22490f224dd3be0d5daca1e730beb7748d6eeb38ef80ad0a76e8220af837ce5930e24b100cc0b98eca697f204cb7cee6662dba41601f3dc48526846ea21b04e94196b4a457b30cdd9aa4873f106136495b62377fd8ed6fc4913eadedc7c1934beb80115aa310ba46b7765c6842a8bd0c7f2042af660885b3f6e182da6d1afe6a5dba771cc31a563c4bd4545891b28211245d62e18526c694902c8052eb153b2df5d14366ac0b8f1a28e906513162d04982042caa7ad940c1cf5e6494d363cf1b629cf5e3c7e1c29f2856f413c544322fdf063eef1aebca7addd731265a0fe5b19b2c8fdd8670f090a5a53292ba4e54f6cafab05ab6ca5a592c23c79569c033f43c96389e5b13aae720a82384a036e10a1cf2ec2a0c79cee02bfa21af43645d1a72d2adf9dbf508ad19a2f5b4e691878eb37f9ed65aec167581fdd34d9301a78f38cf3eb2b4b294ef9157164de5f29c3ad79e7d7cb63777e93c67adcf2efe72f69de921f412ecdcd54c14fdf410cd2e6432e0fe910aec8bee82fca1ab40777d74c1e90ee2f4d1854c0f2042abb3e8b2ebb481974754d7ec9edda5146ed38966e7991e4018b908fba287680976ee6a96a97ed7640088d34558105984fd3cd5ab37bc1e5a0565ab9c857d43e8063aba472b7571465accd848e7440f2fd9cd729772d69b6e7ff66ae867ad7eb64a2a8721e3d84eeb4359eb3a451539f2ecf9ea36ada0c8b3cfb367acece3e62c8d0797ffe81764030fadd76fd10bcf67ff2311ca6d32720ffe3e2ff29d3fc446e8f6a1655176fb2e38720ca2d767d12bcb995a9bf8265585a5d5255686b686e7366df08b2a121eb908e5361d791e73b2f5a1273dc0fa11bad14f72a29f351f2076ed5e48641e411939d1ef3e2ec480d61ac24ef2a11a7c5288123dc07ed10936c9934e10bb2ef002b31fa12294d766e9e4dc22d767234ff29c846ea29ffd2a46b4deba752f32ac289c75cc0916ae2432e17cb76ec9f29a48a80a8cfce8571f774ba10d5e9b1e327c88aa20c38737c7cb7d363de8741ffa9115323d9caf02dbf6a10a6cda877ecb23c7e16c15ba98877fa21ffdb60df447811e67322074eb3df304ebf68910f0a2e921011fa22a48c0874615db9b7346280beebb20fcd07d4515842128f645ae2b7689503ae0a11fcf7bd96de966b4eb9a4591769e5f7fe8b63aa9c0c443b3550ecfb96bda68a27002aee246cb0af9cf05f6857cd72cd9b4519fbdcc56db47fe5620feae6949bfb39508fbd855c04eb5eeb10229645f8003c69a5c89e8f6b9fe8cee31e93669f492781b143cbaae03579576a6faec56c58db224d43edbae7043c067c75dd8ca2a3bb6c2f82cbbcf775a8d699ff39a0fb7297dce39dfdc9db39ea823dc6f40fd7a8122f26b6d9a2a6073d46efe46fcf813a19fa7bd03c63efef0afecf5b0597ae98ec97e6ef5a6e370bbd29a38748fa86f9a50a6f378bd1e8fd7e3f5ca299cad66af347fa38fa33d4dc7e6689a8e7d1cdd344bd3f4f1d7018b5f96d8fc8ddefb998e7fa5e74c289c9f2694e949d7c976e5f19e39cfa47f1e79bffa463d2f6f93d1af3c6baf01f5b7fd8d18788ec1eb6dc2e03b5b01e0bcf76a74dba49f908902eef1cef490c193b4e7aa19365bdd26eda39f26d408a51d5be10d5eb153081e00c7e1306ae4bddf3ebf378e98410d7a3cecbc9e77c03da31f8823afc1e3dfc6dfdb008f6ed473a391b78191f7bcc3cd332c093c1fb11ba1fbfe913bbaef2365ab1fb1637474de0f87e478c41863243f728cf1038ed03c03ddf691907c44918e9c87ad7e1b5cc307de8183f000ec23ba4dc03efa38f2eeaec7d9731fcf33fcb6fd0c7e9a1edc479df31c5b7db06109dd23eef9120ff772a607ec207aee26e6f5b0f3963af0aaa187fe4a32a423a47144fa8d23ca1b31835e6fd3e047efa19f7df07e208cbc063ffe3646c2bffca3cf799eab2c09d87968bdc07cf5dbd74332726cd4eba13b5bbdcf45dc1f7b2e22f7408c6ee43df7f57a758ffbfc5ecf6bed8df8971fe937fee8474628f65c6543f0f9063f0cde0167c8f0ab99ea027d59d8e99ea11a5c890320081e02ba814beece1482332d8580bae37299f38d47e3b845e43d6a404160c7e0a36f9fe3f0354fc0bee448ee4beef37b869d02806e2008e80602d1ed02f00ed0ed730de83e7f67034037a0fb1400fa01ba7da3fbbc5e0048e1a5eca71ffd34387009ddf53845e8fff916a15f83fb1c8397a6879f83d0d0c1cfb19406bf4074dfb4f7b907529ffd6669f0fc43770718343807374b832ba1fbd430bacf51748f189c34a13058e9f75ff80e83c76775ba5678293765f0d1736d42f2d1c7dac4f3d1cbdad4f3d1b1f9000cfe4345689cdfb5f67dd95efb79b5dfb4db74e4daf30c4b827d9da992323892f35c7b799b7a6ef53eeb7681d9917ef6edd7fbdd282ba111dd00b5f2652bec3eb7261492e3b009d543914aa8df730ff57b68cf473cfe6dbbfd47effdf6e83e0c5e4d0fe388e7fd44e8c780e6193604ed48bf24ed86f3380a59dcd1d1cffed9d95991d148ea67e4da3cc2a3916fdf399a0ca823d4115acf337ce2d1b72fc86440cf7b46bb1ea7918f6e64e4d884321abda8c85754847944bffa45443efe46af260f87ebf9f8c3defb59291bc2e8bcdfb6cfeb8047eff1ea8f3f3b7581a30ac4ef79873bfe78aefb5953e7433f9c8ff57ba66bb79be5d9753f0ff54dcfe54c34ffec39baedf2ec75c4683ea3ceb12eb2dfb6eb3f53817007800467a77c5cd2444187e672be2ba52c09e2e9e358da15763451c0fd88da15d6c3e838c785e3cf97e4617883bc03d69df9b76df9db76eab593a5c6fd4adc18c239493b359a764550d00a4b820ef271f4a0a01f7f2baa5d1164a7743664637754fa6ca94af70e0ed7ba34fe458364116aca849dbcd6b3baaf7aad3ee26bbde0a8f451f1bd245cbd4343c01061f25a435f0d43b7e16fc45e2ba971e83e4fdf6bacbdfc85bac3efea2234fe813d7b918b9e67cf67559c166d0c3155dada75f16a6c75c35ce27cbd70882d569bdbc5aef396cdba47d5c7b4120a0e67af9c15b556041cce9eb5ea2ad649268a3e1fddc8878ec8f187334d27d239e9b95f09e209b89c99337366cecc9939df4c6f229d4ee6481fd19ddb25fce8bb8427bd7e093fbae9a7ebf187dbf978929ef36003bdce738efbeda7713c4f9fcf1d08dc4c8f433a5106d840af43733e7ace47c799befbed93e73a9e93264e67e67e3af2b77339d4b15713059e9b28089eeb5010441ee269e7d0104fcf23f2ea472691896e231c0e2744e2469ce7489ccfe7f3e14e321c4e1475e66f3fbd89f3221f729eef92908c8a86784c8ff3dd5191e9443d21740399def4d3740cbf8a974cef80cd5fe9b8df0ee13a6b7ac0e17e3ac738d7a1fbe971380694be9f9e9e44c5b33e95f084744f179603a57bb107aee401762560078efd76e01c748042070e020804ba5b57f2db842dd002af2f2bfdc23556c9e93b496943d299f437a876c6346a7971622f3fd7114c8de4fc913eaf23d4af18c5be24df0827b69824456cfd0e51cbfe5eef707b75047d75188661188661188661182269cb7c3208b9eb3cb7b401060dbd2134c92883cf0320071d201d01e0039d4ea7f38048c8d10c453ccfe1aed0efe7e1cf7f3f1c6e8d340ab2c1b392e3366ce86de8252979909434d4234b0cbda124231f11af4857ee300801a08a8a6a0ce22d4d494905913de0506f2d5bad65ab35af21363c3a68d536d4cb601df48e8e90928c8a7c1e4439392803c007bf9c86977845bbcc2b4a32f2111579e0e1909292cf9741e957539f51521286a45e6f28e997adae7ce42d0e784543bdde063d5f0fcd5657594968c61aeaf5867679e86883d206a5215f068be706494a1f804919134623015aa44099296c9004e1d265c3e973105d0c4a68057b04b5ac5843c017fcc1ef0d5e5c0210f362f3e5f5d81d08e6c2633f00d308213ba2d0f1e3676aac4a93921c1e2278d648c5e1fa33b6e7be2d7b494a53fe3871387b8be4048cc59a356dc4d072018e00f199996dd163824d15aa50cf195299df1b7cbf458072c64c9427525c906264ca8ac76253d83c76129ed01778183df631e7a61132fa24cf67cf190a94cf6e007c44cce3de63fb6442e1289f9f3ebb9309955b0023460d1992363618188bf018c9d66319cc00f4c7ce16ac144b9a4c244ed83cd9faec057821cd2ee7ec22d80dc6fc4e7aacd47526a6c911b1265ac49c0079ec04d0220745b60c890308aa5cd0c0964c8559a2e6b1d892384c9c74cd78ec02d062082d2e3af070a91183c68929180c9a20c09610a4c72ef6a4304bf185878a142976155cc4ba409ba57d8b58a20f310b8b4ce5e7de67aeb0cf643e2bc1f159c9da670fc197d5c20a1b606a94b455b148f7f939a70583411469ce79009f91d4f89c7dc44e950d969a3234e83c01a39166574144c52c114b53e500e4335e35f3361e7b792cf602db633fc51ebb4f2c8998c7625c5c8f1d04262cf18a7de8357822dd97eb4e5daa0ffd5ae1f8d0f7bd12c0efbb55274896a2ce1fad2662d27db1a050c4e872d666260348ba6fd6db75ba5959511f5ab3b3b4db54ab448921feb66a4cbfad5b054425040f0d2fb02bb574db35177de29009c923478b59ba6d9bd875ba54593eb4571f627de836abeac36db542f86dbd5a90a2ccca9a34335751d26db72010e88a13216e4ea896a4db767de876ea3a895877c97a18d6b50f9d05b10f1f0dbdeeea66832f52a1398954c1bb81692c0cd58701f81b418e94c832c2e50a8e140573f088a9a0c3a58c917457b20fa93e04418a1c1d64d6d8303b5395863a72d0302b73064c983be216def235cbef241c16e531f6f174f3584cc9e331128f7d0350dcba6f7f8fbfc5adb78ffd837bb5ae532ebb5961578ff37c9b7e8f73008c4ace3a36e5e3abca07f3f224e94b2614799e8f1bab13ced3e69562079e3e44adb7fe45e745d13d30a130e91de4aa2b5e8d3d005e3b07232edfbe98ab1330180c96f00a06d336a5320a8bc12f182fc267d7604251519d5917b982bcdebaa571eeec96464651728b44dab3eb1e8a644216f27c968e512413463c896e23f7f98817c56c4592a4b52f66a9cfbf6df4f3fd3626222222ca4137a2b6a222f739aea8a868cde7f3a5bdfda2b3a2ac8ce5d5b5f5360bcbeaadfddece798edbed76988ac7e36129decffe0e07f1924e57f642b91c26fb13a7d3e9d676bb9d7ddd195eb2b9329d8eecbdf092cde5ba743addddd2d92cf367bf2449d20d87c3dd36dccf3ea9b5ce64a2287a619cbbde660d1a3c6b40f3165eb2d65a6badb5d65a6badb5d65a6badb5b66dcdab6b2b2bc4faddb22076ba5416850f386672d811c2064fbacf0f379cd82d7d0164e2edad8b44551a8ee0d66b4d860a78c1538649956020b70fa4e4aa48545941a58cda911b1b787d61184b704df9ac4d12fa33318fddebc863473a45ec60b14566c78b282b0014013494e4adcf121245c49c00b2f6c8840aa79c78ec19bb5107a6b86041812505933a4b47e2088db881040e1a2862c2b029abd68ee0b352b6c03cf622ec1b62c5448a1332359850a59b69458a31c60ff472f3d8177062b11e41a014a96233c32a15319109858738a8665d0c50c3fce6f0e57715f30abd899f0fad883979f3f5240a14171f3a53fd8252250a8e0fbd84db54bfa2b47de8bd30ae39e416af8916219c444d8d89b13f6448f0492bf0e13ad5b660309822c5187bf0f8c6630f5c4093c40818301a6129761534de9950b8acf2bb27c2ef24252cbf377c02be623df0431fbf98f85e7ce85ebfbac23efc6ae2e2433f9fa86c6121260e11234f8e7450654758a8011d6fd02c6163e2ec850d5dd43aebef5ca65ba2c6e1b1e7b2921132f2431f8590253d76537fb1b8127ee863135a2e4101f6d8711fe012a788d5d412185d1c80b930ebd8892b397760606db9497359999d3ab788f5d645acdb54b3d975caa975324809132e8f7dcc4c82e4d042c3c58a2d1a55fa32738e68b1a3ccd711b0207fb0a442b48b4a6074f0d8c3246fe7d763cfd8751eb162ca8a17c07899ba0147c3912cb8203f6036d0cacabcb5b041b20d73d91a970ef4b1673497f1a01859e3552615b596ee3397f96e138a444aee1150860697af1758ac8849c36c95abaed58f3397bdf59b55075bddac32104869b99511f1a15527ddbe0f7d4cc9d3c3c717ae3b6be966fa30f40f578512b0d3cdc24b36f4d16fd3ef437fba4dde54c3bebcc40ffdc44e239294e1a366224d0db13069e840ec54e56489b9e5a0625323270dd11da2aebd46af15158fb3febe546fdd4a39772ed354b9aca6da6a4c7bbb7359761b11dc5aeaad67bf5fbf9230f9111ebb1dff525d2b5ef0452ff4e61e5b557eb0bea2229a6a5089718971e598d48cb2b4d6dad22cc199614c8a05c6189b39a23cb9526bad73baa2af6329cee84a511445dda9e1eb9858d459060505059d3bd26c57e27038dc4e682cc516a1d2344d53882774a5d3e974bcded81d25bd72b7dbed7a4343258fc7e30d11eda210954343434344451b8ca5e02a2af16f2c45d6109eb22c6d8976c0f6572fb0032ecbdcb6425ecd9bf39c5b7b736e73e8bd1f726599f3dcafbc1fca0fb7496885dba9db74a184847ed7da123d871c57e4e4cff4dcaffc90cb7dc8e53ee4721f72b90fb99cf55cfd1ccf759ecbf90ef21ce9b8e7391ffad5bb943bddf4ec22f06ee739b7bf5d8f934445605cbad06fd7e3c4a8089e890af9353d80b09e3fa320c82d023fe9a546857c07a14265894341909e4dd09f753b54c4fd93b42599cb79872b7aee774f5c16fd7a6efe48d2715efe4674975f964e3a4e9745bf21377f380ff2de6fc8c91faee71d30ce962351e9232a877e3d94a8fc918e1b7fbbfc7169f471c4b9a0fa79443fdc1ae41142d74411a2a0c5bc24a2067684beb60d03d66dba150d4f4dad90fab0624ab45909f647f7bdf78ad5436c842dc638dd184e7b55f2b7e8b6d8b3938ff69592bcda104ef489e936d5b13b697fed73e8f91d524338f7f917b899fe77ff3a79faf8ab9c51b39ff457c90a517bbbf6a9e79cb5ce39db2d02ca866198fdfa0c1b4276eda1b6992acfb021d8d02ae7eb575be1aa52bd7e879c1c5011ee6f111e7b18e8faf50a81db1c5e3b4edb0ac459eb20a208227eeb3eebd5fa785d8856bdb31c3d144774dc2138bcf59aa3706358c7ab71ded86d2eb3a875e26d436bcbebdb8656db50cd6dca5aac35bb1643d18a35ceeb35a93a70c3f856a33a0c3d6b1743adb3769b5bd8bfb7de025410aa68758a2f603c09f9b0e2c2d3dde58f5ead88e3dc4fd79b724157e709f696b9e73ec79fe449191cc98f3608728c1dc3d32d3d93bf2de24912452af28c6e24144cc74845a80926ae2f82748b51289d746ca24845a809255a2fd0b10ffd36e9b80c5e66708c6ad7951802f633ecec25baeb71663483631444062f5110181c87281fa321cacfa03138ce3738c218924ec7e8463a3a3a89888c888888b26b91c8713622f2d34522c79944f749847d7e5efcf3e121dc79623f5d3bcf034fbc3a83dc7ad0108821ef05792fe847061579bd4eee16d5446e7f3b277f2ec8d97be81ef24ca29073e9fa87cb2b447ab668798144260c79906f8d8628b14fc4a9fb3d71185b783c83c7fd9eb4ef270ed871ce6e71e933f8ecf6b3eefdf8c481749ce3706305ea728b789c2b30a9a966122aa856a01e7346f30657c80bae329db58a09285fab98d0fa9de1af07e06b95126f9fc2189ca9c71e54bdee20cf4e7a364fc08ef32027c59afa6e53900739b6a6884d13460731ba2fe85660fe5d0314b20bee8fc1e00a448c2fc2f7f9af079980470f5ac1e8bb4df8835480df97b3170a3c5fbd5204ff7aef36218da80aec675f81fdecd6af18fe76ef6f95126db54a89b62f7fa7ef3661cd0387838256aa5a2cfece639c245097b0ef085410b0e314e7bd6ce778666721e7b68c339aab1313d6ce849d8a708e00d66851f60a420e723fffac8f0bc46eb1826c103b0bd85b08973ef80eb8409c2863fc5acdac082ac4aa73db2c5f7d04b6b64fc562d5abf40f87b3dadc22ac8902ee73a6872191aade341c0357dd260d652b8efc0d79e5ed74a4cdf9a669cf2046afc1eb5ab375b23a89567de4360805d26a27d17d7f0c725cb5d368ce223ca320827c74ed1b671f30a23886ff82b093973e236bddda5c49f2c87126abceeea7506fd743d77d84e65cb353f5f9d012d5e866419058d018a4ad57eb155baf184b93b5bad6da33b6c295d4b8ea37cea3a3415e490dc2fa9057d7f8a2b806913ff4c354d6c390938e7fd68b7e3827c2f5ef0ed5e5b4d63a97f39caeaec7205c514c7ae8daab7bcdb9cea148a357c7eef87fd5b7088dbb6a57ad3a8820b4f4d144a1d438c64d137155a87f84c1870fd04ea2db6e1137fcdf2ebfbe46710c1b02f65fbec00bb4daaf5a8cfccb46c19b86ab700c4c657115ae3ae34a492f8a7a1c45d15378d143d75a24937c650aaf3d544a21845215a533c8cfa08a4343bc1874b5079244491f77880f4fa25bf48ac34eea32df2514ea050679c0998043eb0506a13bc46b1fd1103df262193d250ebac3adc0aff75e7d5da3bae633eb7befd5f796f7a2d95625cb8613c14bad749b7210d2ad6f60ba4da25b17e1368d1e846e6052128348f952f63bea270e6f312eabf6db018b79bd7dba40eb590c51df4975da7bba120ec333d4ae3d141d9b235a6f93885aa60dd8baee83ab1638ab9819b3bf626ca6303640cf7746e0432d3b87723ab17ce11cf1a20398b0d313c66887055ca79a8ea1fe2d8337b5fed147fc8896da9a285278fec2dcaff4a19fa93f88cfb359011fae158d00c636341d77e4d95bc04e461e348aa4e70ae4567872eef371cead57bfc0ec2390b48f788d6efb4917987da80a78292399a0d18d379c3ea402f6d3419cbec26d3ad1adfff49c7fb743f7e943a80ae76f8525a7fed3774d7b10272a823a427d15d29c874c38fd443a2107837ffa8982d0a1417c9e83c1afdfe1aa30846a748fe767df862272e6d09a669aa8f561758158176845c4eb09a920821542bcde1511f17a426775ddcf7aee577de867437f252c60a7112fd04ae0705383c98f3a69f616b0d388226754568c913336e4857484101769a89ad4e013a7abbea9c1044dccd40e3d68d2dcc37faa30e4b45aa8f511afd1febade7a4d97dda69c9399f8ad75d45fd72efcfcfd9ddffe7a0e4695f89dad48dce0ef4cf637a365b59bd91ae0834c1d296663b2b44877963a61461c3975d68c6c7193ee4cf5b7850c265f5ad680c94a77c67a00121c4d925ca1b3e52bdd99cf0c347578e4604353266d2236c643ea4c9fb67467af02e002047afc8403fdc6565bb80ce3341998cd09861b1d7a6cb4017a926eec258c1937aa1666586fd28da938a821fce120d0dffb3614e8ef90fdf3d7eb0d4601c2f9bd6a37e8fa35bbe9be6831188b1104e4c4499ca9745f29286bce4ccc9182254a94745faa6ddf3ed05fa7412541d710fefc50f34a73a34a5b9af44f1a133b524a042a03946e4bf537459a406d48f6f43132b5838d4acc890d3168523e56fed85082a3cc2a8d6187870c2e466ecc48b7f57a9bf6d5cb9661a73165db76edcf6f4bf6f6d5cfb5c1d16d067584dae72f9fbf6ed75310c10a21b8a6a48842e396e64b9bf4e2080232a1f545cb8f3fe93e475051f1ca91444a0a8c3c2568b2f683c48b2b2b40d20d7cbb41428a969c36676ae93531270ccb4896609054a4e29d5a4c9b5a03c27a7d6aad79680574a959b0f35a6badc7bea479bde7855cbbd20626fc04f65aa7b590152b9a94989366cf8e5463275339a8946449f2a63516a0e09fa7df2026d479f6c83ffd0231a14eacf34f971f269489659e58a65f1f5f7f667cb9e14bbf3d4ca8b234cbbef4cb23bfa5791ecfef8e51c82fd6395e1d26944e33b5005e2751f35afb789e660e134abf6d090047edf2670a171e3ad08ee430f57cb53983f2f02052c30495183ef5bc32fdde30a14c3f60cad8d024bcc046e2c9912f6e7ed2cdf4681eb028b831696629c41cc91383469a639cf5ebade1a70599d555c3e44917133c5b6d785e0c6960058f2547ae0069e1828609a5ef8c3e56c46494024062793ca1aaec021f3131cc8618618b83e7853507e0087bc1c504460eaf7433fd1d3b7a46049cc101870d6d8b96914aa70c8a1940487c79a22485a1a9f8007951d3c04062040d9b372ebe8c684245e448599f324cfed469fb6a223efdb85a810547ea87971678f132b36709121d601cc733793c211726943efdb6b05f7ca2be2cfd4e9950258f2734c246202f374ef0e9f27625ddbed7595858c13d3684044937d3eb52fb88e9bc9ef3dacbce6b7d020d880e315c7c584049b51128618088a095f82195f2dce4fdae158f27c4e2f4bbc2843adddc60f8d2af0a13aae4f178425ab07831f3650a10979cad136308caf494399265c80b6952d66d0795147584893c3b5204a92187ce1db6608a17b0401367cc559a3f43d2138555938013a7d6fafcd50b2441191c5d3266b0914124dde7c7798d64c86b1d34d10747558d2c586954def3f5a689f23c81933081b4b6dc029d99705e27697badc1ae308181a24b992f244ae739aee495e5a96f89bcf6a6e99784096596a769d4c3cd57203e69f49cd16f8c78a9801d37305f55a06ce949b5ab70f2b419b45f7aa47c19681483d8e9067b26c6f75a99b957170b636ccdd2ac8a7e5b35db86d71e638c31c6189769f198c41863ec4cf869cae680629ce3f1f918638cf156cf3493def47ae44dcfb7a9006f9a66d4de3ce3e44db7804c28d3ec9152d4c0494dd3ed1f13ca44eb796e95bd2f93beb4f3a5e7b24493f2a519aa2fddbe7969a276c6b454a565e9d6cf79afcad07821cf426efb9850427c4ca852d422d3e5cfd3addb589afea5db3d2654596ad167faccc86bfd7566e66bcc902f3225f4681d4894e439a3ca20aff7bca4e77997e779e6f9c8f39307068febb20e8f386c77ec9850f8064df40b8db5362c66ea50f1d67c985b6888f8e1d146074f5a699698adce5718201fb4995f50b4b4f5a0ea728405cfcd0d9188461e22756cf00143c444af158adbe4ca734b6797605abcf60ce6cc9cb30d3b8954546d3c9224494db2c0f624499224e915b84e378b24497f42e1e3490e4fd6b224d2ab9fc73de9be4a92a4885586a140f23c129ee7568e09c5c3e29528cf2d9b09c5c3c24bd677ef040a306127cac4d13c748b599ac509ac546bb770f42f49c97f6f30616562cee32f3132a25e449579b376ba31a1c8aaa6c55b9726617234b1ea6105e9fc69b1840820b20d1b3539412fe409a20129e284075b0c6854cd590164cc8d3069d986cd2d71e7b576ab6642e99d33ed76bb33bfdbed763bcf66190dec0bd7e335230633e4b15b35699ed2b4e855743b258a6a9b052d2faa894277dc6081d243abc71fd14c0f293a4f6a6869bb12b144af80288a54a228fa939d174551f4da358ad9ec280900bf95cafa8c575efbd945edb5971e6940b2735faa6b756750e402768e922b33d0e01c28a135b040ec0409a634a8011ac46871aa82a906d7809e369779edc8de935ea59ef44c867141f3645912343ebd3ba3453159c8b868a1a145ce163133409d8341b43226949885c14e9c1f314ce410e2c7d75860a181e6e54c59ba997e8d1ab5355dbda0b458c143c61e143a7080c694fd78e1c6cc0b9224438e09cb02e4c5b33446b2b4de89c1b227cc6ec491a9255fe0ccc0fa5233a18f9415585b7ea805d2629ab435650926795c088bd2414246599db4afae2d3bbcbc48f1aec85bcf696d6eb7a98a6ec1d8302c62043023237bbb2536447ec912058297a328384858e1f1c46a0f89868ece0031dcf8d0e1c2923a2ad22eb6cc8422b16479e2a269b49052e6080b175d803196bccdc193230a18f28c19265d5280ac904013c30d171a00008d2943c38e16253d76bb2da4df3ac2d582b150bd28bacd6242895a4b4f0e352966f090c091ee13edc88c0a684cce9e207b581c29b323b19850f8ca1b0faee85d599fb128556b5ef449f7f9658c2419723a7371644e11ad33765251b482d6b302e3b567ed56e0bcf6f30a15329f5844832b4b0adb961245d2cd44464f6f0494154ada9a88dd0973a38aa22856a14246f5dab3f6918c6dec1445af33542cac0a9717bfc0c81146c09a5099da320205ca6e8c1ad759ebf4c1230626c575254beb135fb78a0b1cbc34b9abbb1fba75a31c631ba9884d39f50e05e341922449e6dc24258751ce92921c69793df6e3b55b284ef21a4016a68a5699227596a49b89dc799da1b130060c971ab1acaa21a2c843f7dd7ab273eb442cc7934fba6d32ee489de445897722d9357a85bdbd6662bbac4ee71b74ce84751e68c8eb5ea7d3e9c47469faadf4d6e74f16403d00e159a245255c26944e4722004c6ba77592174c2832eccdca8b4894a8c869adf596e5537664c8469ca8302d8ae00194ee53cc0b805a084205c9922d6426c46023a39f3123bbaf2f122759e46af9997a9188a67306870d2349f2e498c3f4ba301ca889f5fa5ca17571e356a4068a143b506bad774348204b08b96642c8228089281640ce84701902c6089a0da8191132a64f90283ca9d6ba206518b13dc1b03d62dc88f021c1474c9f1b40982ad89baaa92b79b47c54e9ad31af756e2a4a952b7e5cf0484bb516c9b0db547f27296df8cd21ec4e189e1b6178f684e5e932e3b11e3a8fddfec8d29511130b226408db8d385f8efc199b9acce9e2674e9a254faace87ede04753989b323db4d65a6bad7998503ae9b7129b151cb039d28645581b353bac744875a864040983c4cd8517232e7080ac8f0917e2e0809122c55887357260c2bfae7ae810b586d8c82aa386ce903b5d8ae0c08dc8410608d513b03b28508839be6eace1902ac08b2f4e5c5839f2862add3ea65af6fb0234d63547eac8c1924605108c143b90747bc585eb45b01bba8e5802e7889c31664eacb9906ea6d771014331d63872cca409b3ea91c54dba4347b0616b807169e181d50766f274052a62c7cb992d485208c54008db550fac29ad1e3a4dc384d25cb818fd56d2b2c4b584d9f2036c0b9e19a2a873818c1c33bac2aa90e4d1a20527ed8f131947cab2b8a2e864e4a72c47b800aa3ab506770d3f9d161e531445d1da115cb04b58bab6644111e3d4e20b764a1d0c302c3636a0d227a8a89c5ca1d2daca622407994785169f3467a24c9511f10bb02b7e32b8684157648d8975b6c559b642490056ac9912759a6bc90e5b89a28e45efb50a27af3778adfd5ce113c51dd6a15f55763bab42e756ca8aa9a8f1a2e836c5962b5a7baeac2c39b3d2daa7cd5eeb255bf264e5b0e2a42d2ad59a14751a45cf0c300510325241a92aa93a40314ca3840c1e1e7bdcbae82b49a6602d575667aed49809ea441b258642cd6b31133f15f50245b3b230255d46afdd96f8809d442cac9c336119692e07f639cfb7c9f739f7e58ce480010606869832690e4b1118594ab490d326cd6638b303fc56da5075a786a1df55ade2a96f51db56591f39cac2e80022a60309d6092cb01d32d888edc01315448c0794a0580f2427c47ca089fde07aec96840985b1b6234ca8dc903375cab0a0b3074e16d9568b8ab6e74f951b5913144a48b2064548ec344983a058ced966a97dced94ee5bc5920f1199773aec065c24f4b3e73a865496833843ebb2fe79ccd321a9ca9273d933e03138a2473a4cb208b54970bec8d14d163205289a2c3208b4e0ff65afb18e8b5b7a007f0da5f9045ac5e180dbf373c07362fcad8a079ecbe364a1ebbb7780ce666cd63b035148fdd052614d6d9f102d3021126540e8a2da48d69f1a304cf192b59570123a6c04e172b24435014e19362748720d16da9488c45169850e20a4c282de7737615985019fb6123e74a0dd5179917914a99061115488d1b2e30dc9891280ba2a7c08412bd20bd7614581d664b199ab72651d87c4937d38f81918d3f182748b4a9d922064e9a73ce270801a626e4b5761019d7b0a01b98979e3d7cd0a49b09638cb13fe1b3c7fa31e6baba21c40d4d1d1d6eb96d022b2f7c065b93f6d957c8598f17167168402912634eba99acd29c73ce619f73ce27a4a4201b02a44d589434a33974dfadfac4e467cd5e02132a934e02db7bacb4c1a2f82d02878a7f5733b4c76c8f2b9e0dbfebdb638cb7adb2578fad8fba2d17143379c6d3e740a63e8ffda9430911484bf1d83fa8c0e4b1afc0c2d7636fe1cc966016a9209589c76eadb0d2de64a589b2d5759b2a981a358f7d045e1a89da993389eebb258224af3d6b0f41ae7efc94f50023e52cc51bb017649832b8da1263c896176dd468b48200cc4c8bcfd93ff09445e86143cfd58e2839dc52fc5f4562e04e25609e78454985d1532f10ab3d7615b28895749d72996fc03913c679e5f1b8c7e170d9accccb59521b0d2ac268a0855985d540f1d83dc0e41480b6147b0738f0849d2e1599644790fe5dab0ba4d29a4c014cd28aa630195e6133647cf60d903a071b953f2a5e4c49b950bdb87ce00d683662e420b2e6cd8f146312bd56e8f8566b20ac4a4d064ca8ecc34e2296c5184996c7187f10c3d2e573961b9f1d03be179e185df113e602e70886a8d971a2238c0b6309d89273b4801964578660b153c44425b3a247cc152d9fdd0248f0fc2ac0e1774996e6b3e76cc5c967a7c039622b8b161c66666e55fc2080ab4a51d592e78b0c1c5fe484c9b2f83cb18f1338c9b20cf0d9259064c850d6bd11a88286c208023668c0dcb8b81a1373002db49c01d0ac21028645064b100255907cf0001fda973624c054bc7d39e160a44e4f843752625ced414b5124c538eb5e0754915a3ae1cb6c009534a00945b24a20e1776f6c00547e7c760f3e9183972a1f3c9c2041a3858a04ae33a7549a17b724686cbc60e766518954a2881970b7c6767cf602457e20e48b0b26c4ec08f3123542913610f0b0c2f5250f1a2d6c528cc91393be7d38d175b92c87ee1187ee935c402ebb674961770ef0d9c7536cebb3fbc6547c7605b81673912d1b2ea694e5186300b75d99c4c6db9e321a675b699890c7571efb78fa1cf84c28d02983450ac8991c5e4f49b210d5400d172737f46c1dd1ea6042e55e5569bb18560192c48d123956acd0d9c213f4c4e84afd4236268d8e94337ab4d2b0cc68d9ab6724d28065a5e913d55605898fc778ec2ceb31efb195c7580817173379dc54809548319ad1de751a7bbd9fef2e5927fa3a7616e3770fa3192155e72d0999163ec4bc4056f4b6e5c5901e6059c0a6acf931b3e306d71a5b05881340593aaccca090fa1143cf98303133e9f6edb0f27a87161d1528553548ace0f2478815d2d72a51263efc5a654798125cad4d39e34bc2bd27d80761d1bc02fbd6566b7d67d7f9376e382fd635d75ad16cadd75bbf75ac54af2518bbd3e5f3d7b13b6b62d6e1e8e2584dd1da36bf1144851b33f311da04544942e5b1678cfd0b9f3fbf8e7d792386bb3514cfbdb1678c81a3bbd63a0cc333c478c44b392807a175092ee86549204ffc534540d6e56daa4df902ad36b1df7b315aed8c6a86b50e3467c5163f365e88a9b204c9d80949c0dab0b15ab3baa1fb4a2550a0dff9bc59a36f0e5fcfbe7e7eca69d5da479dd1f302c35faf090e8b05698da24ff45ec55e5b82415aa3755c68b95e7b1eb597b7497f4eb5339d3ad4b9ca985ad46ee0e3ad2b746b473d7fbdbb64bdfc3a26e6cce3be7e6dc118c1ea5a105b901742d4b530e3938fee4fa3bb579acf9f7c1c9d2c6df4349f8f3e7ad9d3e86bc37a7a7a7a7a1af398c7343b5a3bdad1da318f76b476b476b4a31df398473bfae967069e6ec733fb4ea62c7bc7313f017d199875476b473b629b7df7bc773cb3753b8ec0fc74da71ccf68e99c99781be6c476b3330dbeccb3e9b8139cb3e9d633eb34d1bb3b55ed6eb1ccf31333df9385adf799ee3e8cbbeeceed632019fb2b53e0bcc4cd6979980379765e369732d1b9ff238663bdaffe08b272a09b9ac8660bd7a49f1d5667d758b05682d45141b2d3abcd26dbdbebe2d11f2e62b50922f2b73dc70a999132505ad3a0b125d76cc68c1a32dddb64cecb74d0bab5eb71476ea20f6c5cb8c9139744aa495c49b5b1d3824b8c0a865c160b04505ab3e56af55ed0d9818655c74793b4b47749d39a951e5a5041a206965aa695a5b5642dc9889494bc04e754d1e2e585a846c013426ad2ce2b0bdf1f8b302cb9d74d7b5bb6448941b1b6edadca4d56d541d21789b50f0f4204cc779f519b4f0f5d5ebab77b053befa59ddae6d05834117aa57ac0f751e7ad9bb4d461ebaefbad7872170c38bb09f3ef40e621f8a55b22cbb9a85aec29e35b68ac706f77c588652760ac9b7adb212f3215198a595e4db72792df9d08a7d68c9b27c88217c31e4435c68d72c1eb70ffd06ff7c78a3867c5fa9a90f7ddf2aab0ffd62d1f8f0fad8374b8beb7a957d2896e543b30fd13eac61765ef8b017de35b60f2f9eebf6a1e3e0181cc5f38da5f0d487b80a5b7de85e40be2cfdee31a14a28419ec7e3f11c58e43c9e3fd9785ec993c2f30f29f02a8fc72392040d47203a3fdaf04a70664b0f332a2f64baf076ef8d58597add227ce95526ca8d2fdd87e24b2974be7460d894245ffad5f3e40b8302e57d3e9fcf6f1e13ca57e475277d9157ab2f0afba2222765bee849952ff28bc7842abad356e7edddfdda31a11cade758a7cd13113d51942772bf4da513b91211913361a216249400910283ab888a94a88e123f5f565ee470c34b7a5edbd9f378bcb640cfab03e5797eeb9465d946e709d06badb52f8d93d744fa430aaeb526aafa699e2e72ed36cb45b5d65a0dd5a3a8df3926148ad6732c2a2a2a2af22bc7842a42ebe969cafef7f3cb6642fdd07a8e44447ee388a569f1ee7ee198505e966559966559967edf9850659ad6fb7c7ed74c281f5acf9169089a1e3968bc419283c7e3f107caf378970a0e1d47e844492992f2fcba31a1786d4c288d26cce7fce4b3bbd206119ed23eefb2139e674f216767a1cee75c565df9104b8bfa6cb52c99cd727346fb3ce5c69833566cbce0080283881b3166b0b0b4d214a4eeac283b13d2e6cb00f498d0d2f27102ca5bbaab57ce44444444447ed9985044683d7dcc0bd79765a9c6e3f1783c1e8fc7e3f95d6342f1bcf053d9ebd7eed368bebcf651fb556342e934663e4306bf696356d90f0d0d0d0d0d0d0df990676131a1f192e3b367df78c68c093584d6f3e9eb05d56fb0815f34136a03b49ea38ba8dfed76eeb789e73b57ca3b7ffaf3bb5d93ddce53b8bbdd6eb763c99a0b291d5c6af0ecbc62270e02b920cb6143ad86989dd3ef9e0bac0e5c5079edb74cf9e5a2c69765e963e9970c986e431561cac5e7ece397cf7ecaf8ec3ef7f1d9812dcac63c852183840d11b33651b27c4dadc85d239cd8b121762648c78c8d333126d40ec763c0e0378c0985e10b878beff5dcd7ebb9d2edf57cec9ddff38a76c19850daeccb5395a84ff29ce4d7cb48a5ed857a2fc4e485dc6f937621571212722615a9908fd8690238c674d1222586b6271552c144aa8b98af324037d27dbe90e72ef94bce90ab5898d7511899cf62493e8f457d1e13f3794c0f952a9ffd7631a13299d26baffbe97593d21b26304c68a12993476b035f7b059b23f55a2f0993f27a0c94d729b86c9d506186c89c54fb2d33a13497a71c371ec9f36dba5b46188fb19276f23887b93076154aace3310f27c13ca1b01c538fed0b597a6931e8f8e16304cc98d42b4813b11a5a4c80a4fbac64bd3a765c38abf1830b9755d989a9225559ae64a4db0677385280c501abe1a60c52963b6e2c88904de9c2c1e47b3dbf5a468b24e79ce5aaec8584fc6241024325cbc5151e6d54d27d3ecfc99ec743f2bc2230fcf8d1f1f5244ccaf37b25ec0aebcbd2af952d493764dcd87aed3e40affd92b179bbba4af2c5868d8bb01b53bf0bfaddd6eff660e9f2e39663cd54baf35bc5a99850580e930ff21ce4776c8cf3a4e7234f92e4ce4992cdc9933cd208e91fb0981c203b4b859dc694744be61d37c42881a3058999584a4e915291654995386cd21153fc10e9cada2186e6a74f9aab13612eba7aa4bb9231b16961d3f3d9af1886736729ce551c338ffd869950586bf78d174c0c0ed9ef767ebfc6b71fa79850235acf310c9417995e1445dfc0f4a4e4c50f29b09ddb4adda6aa9d28fa289e22d8ef767ea59850bb166f7e68c4a161852c7fb110f239fc5c040268fe80bdc538f1e32acd7ea388bdb9327ad22f14125c6b5178a66481a5385e78ec59eb7117992e386af8b9d2c6478afd3e115b737badfd3ab94d72b95c999c99cbe5c4e40090f33af539cf391fd9c67cce4f1f8fcfc909f4b939643e979be3e67374a67cae6dc6e7fc769950b93880fe3c4f3f5de93c9d099fe77962339cc3f80c9fe19a652dc696b5b43745c2de4479ec4038301e3bd3930e387b1e87c5e1f2d82f13130a97297d7efabc819f993efb1a89cf39afb9f8ec63f6bb44c9939d3732f2cb6542192d91f23a1d91d7b9ebbeaec85e87d3d9213aff809dc654f7baacfb40cd192f72c86e1c0972825a183f5eba48f0b91aa14a8a091a6225d05ce9e4f859d1040789213e741eb604cbe7ec370956d24549499ec77e5ff021a96d5bf8871d5782fd994e426dfbd9747b86246a8f50104b6444e15143c60b272b7af884c80048113d64f854b9d27124d4ba3383c490b41a6554b0e1b22ea0a544850b3c5a2fc4181193e6458e39468488095ba1850cf2a133853a70b01012a649091f42d2d0bd888fe0173e623fcc66ec910104ca0f112754b4d8a86aa345e4cc4dab48202e31e50fa50c044a5222c81b173229d2d09d489dd36643878a2f26ccf6ac4891f3f1e5c685b0305e0271093224d49b29ff7ed9b3d99e3a49d8c4a1ca9344abd8f3a1ed817e1816c40e922e7ddc3cb99286ee57880915662026b10ecd671768dd447359d6592d8fcfa1dbf7e18ec7a19be9c3196d637aaed078f9f84a3990644a09b32b6b28a6d230501a2d25b468a133d625d5e8f60f65a8a971e18aebca559abf563cf930f49b55769b46114b48c412fa4325d4f657c86d00bf8544aa9d48b513833b31b81bd122089b1d64f80ca9624bb710049c0c412b9312766548ba854a1095870790395bb65e48b79089386361ba6429d1822bdd4215cc94b23e81f62cd9d1966ea1375c677e38311362e44cba8584d0feba90d9dd42424265b74963fd16d2f15b28c76f21abbfbf85a2feba5070f7266e9de2d6d976b6b95d24626ce48051848a9374ef70b0a17892e72c6b2cdd3baa9c0fb022526a6326c8a47b8785c20b202e44facc29ab4af72eabcb485515272ff4c448f7aeeb6fd7151e4129192db2d2bdf3fa1dda5fdf99eddddaefd4fefa0ec7ef1dd9d5efdd8ddf3babdfbba8bfbe0b2efd3e75816e50b7756c7f5d87e7af9fc1a8b7f1fbb4aaf1fbb4fa7d92fdf5f354dbe7dac9f6d74fb313ed0a581b33254a9ce1c327dde70bc07029b3e70b903d52e93e37f8ca62c76dc89a3d4ed27d1eb13a63844ad612376dd27dea39e1c28b1c6d7dd802a5fbec9a009d16806c0c59d3842ddda717f0b7ce4cce4c2e2db7736e696ece5e7023c36a4f8974eb5c50a28c0b687474d8b9926e5d087450f4d1a14248151fe9d6b990472d0f9c1d47cabca45b97f5b7889b32359e4cb1a55bf78615052dad0a188921e9d679e9d45e87f6d775bab2dbb4731abf7564337eeb64fcd659e9a2feba2e8803fd9d7bfbebb96054d5ef9c950bbf73317ee7c8fe7aae2c6776736839b59d5bfbbb737d8e58a909616b934196ee9c14e9640a8a2b30b2604991ee1c9506d85c70c5d8f3c50b9774e7d4861cf9322595254f8a74e768d8f192d6040eda0b70d29deb0243e6c50a204066d84877ce8b8c49c6f4dfe636d9ae8967ac1c2bff909564a5b965c2f86d52fd36b7c8ccb5bf6e9a661a00c8dc30a3a4851a371ae936a5a0c06022c54b541a8b749b30d093c58799193781baa4db247123ca1ab5215c88b848b79995e177f9a6249012dc9f2edcc6b9fdf5b1a6a5cb93155b27d25d4ad50193d2d366861a2ce92ea9fe6e59f3c2ac4c931945d25d0aa08b6bc78c333cdc82e92e655049f111a5ccea899674975d7f85f829a2a2c7141a28e92ebdbe4cfbeb65c956aebdf85d92b9f85db6f85d5afd2da3fe7a19dce037eeedafe38253bf712c7ee356fcc695e1d0706a63bf716b3817584973c585226e5132d28d33c1eb0b0c40447268214b37ee4e178f306041dedcd1926e1cd6df2672687411f2168626ddb8ac1159686626daaedce12a926e1c17b43253522ea280b5a51be7f583fc41fa7e9359e4268351565b2449a66d728d94112423a8e8779055d00e0a46596d0505050581f91db4f63788cd9ea821fc3911e8ef1edfacd4e8f6d7c7a08adfa3d4ef31c5ef711cd3f6b8f6774c23650c1d2625dcde7ca47b94fafb9626450a3e33eeb849f748f5378e891c48b014011296ee114b88c8d6169a1e6360b849f798a5420b35324ac0e4f9f396eef1dae9a2e7049133c137e91e5b20e611b7d8822806a3fe8a277e8b51bf455114d3b6b8f657641343e122108a36527286a45b94fabb25ce9539507ab06549b748a5d4428d1a163ff2b49d48b7b8023564309ec048935a916e514c9d2f657ec480bcf1936eb1eb2f9085c5c7d78a185d71d22d7a8d20fcc326ecfd0e570877e806465b407fd06d3a18651592d5f91daefd0db77eab63192a9790dbfeba41112366c52503ec496aa58d060b3029f00049b7ce0aa9f4a8548b17ea4335c9105444240004008315003028100c870583c1681c675916e70314800e80ac5a66489888d328c7711832081963883144400444004666d3002a723fdeb659db35e7caf883c3ec87641ca47b88737992f84aba08bfa31a496044025c1499bdf1d1eb90f00f4679060583aa92c87016546e452cd0c296b248a51345fcaf807c890e1c28fc9edc7135110e0b5442d2c634cba9177c6642cec9032651007b0c351818c48bbb7c66619f56b8644597435ac0b5093bc5df65720553b17ba4069b682114a19c654ce2c7ff86c0aff52fd2c81ce6f6c9e19f8b90d6f866fb569bdd05f60aebf57633eac03d82903a4d8f9d7e5efbc42f772797480e052ca0383607a3483e3ac7474c57108be490d5a84d16360498c34fd93da0faec94453498e970f725c6aa627dcc39b8d2b3c1635868aa4f68cbdb23051fb2ebca85fb2c079e41209e30ce85022f173b6c4fe83cef66523978fdf46712d1ee11362ca9eb3670149482a77d339efa4623c769983c92f5a2b2ec349a71b9680742995b4db691e2dd0b9c524655b4afbf03e3664aac9541f437582e5d22cd6f5d2eade6a299b2870425545fb93bdfd3c6eb20ac6bee4caf2efd8b4563056b7eeb523b093fffa4a8fcca001175beb74e8bc7bc16498f87460fbc1b3ba87340c70627188a38e046e33d5d0a8d10f0debd0bc0129f56643a9ad07b3526965416da7eb40ac2b354f3680a55b1016928bc11f77050881ac45e90dc71b5f752c322e44f6e94fde13e80aeff5563b9f7ae4e777740a95092c12337f70183fddd44bf141a4d00b3c9886373288eba0a33f00e203e37b2d88fab30a9440386638ec7b3792bd8921c85040d0ecae07453e013fe7e401889d084a5ace5da5c6811d5c918e5254718beee20c96c72944e04220e474354cfdc850fc48bb79989e383b72341ba3296438bff46df9c1dcb8218c53fc8e97b0df892172ef63dc347e019e71601ce5172e78bbd9fd3a335546f44fc0d8980de43a6dd5bc547da297d2e6dcf41beba4842867a95e84b40e2963c85156b05eaa0296344393c4c5c13283c81517ee29c25bf5ecc2faf2d5c33ed1b089239ca6e21c4548876aa4baf3724b61f0bd0a33dd12a341713e03e33b841ea8a35106a6da77821808e1a4da16eca0481e452ff9a6430d14a6bd84f34bcadd0f552f34dafd05e995103f74fd70a9c02e78e6260125fa753857d39095e4838ca8a1832372927bce98d09c7b513e3bee1d6d1914d1ed5fc85b74e8ef36a20008d36bf3c16f58d02e439164f31eb6636f0ba92f25dbf0cee6ff1340c2a4114a330a141c98d1f90388bc59e490bc67a6bb4605192575a1651c6d9d3dd3999ab568cd8df054ed5c9174901bc634c07611c0064f87e8df8e8397c215af3db8483e0201b4d0bf99ea3d6628c886b01ba87c28b9d5538e13e08d3d7572c2d2270a13bcd34c36c3dc0c67e3726696c6ce91ae2a3ac79eefb73df3deffc77d75ff7dcbd792aad2b42531e0bc4b4573557190a4d914d732acbb8e1d488bce4f404a461a020392e8384d24a695dfa558cfd3da7bff8739638abc6bcf4d1ca3968eda2aa694e95b656dada9660aefc36d96bd3bdffa8fcb8f9f4477e6cbb04cebf546e611e70a6ba639c6e731d47bed33a5840d22965852d2e144233415e7f2464bc738e5fee5ddcb7eebbeb9e3ff3d81f00a6d3361887f414ed9dadce268005baac19546c5455059fe752d90dcc3a6241a72c7a34c95b70cdee62d90818aed8e8ff1d73aaa4a4108e9a16cfbd275bc0945a68938edeb71b31558a1bf77529d1c434871c40b1de36631903e648fffe64fdd328766f5821a2a7bfefe8d0c3d46fc23aad98b8a481f64d7190523e28e4313b3b02ed112bed89ff372270838dc184ff509566a20a40a7023911025668725885bccd322926df997a5aad6e44776679c6ddc33e8af3bfde4f23b5c2ba760ace76d5d78c634ebb181d14d942fcc80942456beecc5f99af682487568bee347237f932637f217b880c58d75da46d9196d76e0a8377cc8189e2ed09f07d65c899009d44798d264f903284c59e18fa6190dd8e1c0f9ddae0a311a4fe489db28a2f48e5b69ac77b1fb0e5459796ae505ad2cbbb38d4f0f94f443ff6168bb21ac84bbd533db11f6fd6f0ed413df9a1aaa1febedb2bec9163e3ec4ed1036f47bd9f4a610f7a0c17d6b582e8a83b335e35a7ab4042513b0a1853baa639904095991c530dcb32052deeaeead796a7453cd2dbb37d4cd44abb74d14eaa21e0059bd02632c36e736bbf16ed1ab14889baaaba3f580d539c1b759d2c42d58acb12320867b8767112a7010b04b6142f5f592ac1a1e055d57e6e63014d763475be83015fb8850c51c827de6e042ec0ce2104f00352798bdecceeb8f0a372206c2fc3fea6895cad90e29feaba69b7353104605c53f842c666988a479c5ead56662f2949056d54c5b86139e8f65feda5227dcdb7ba9f46f4fb82b52514388ef781a2182e8056066f799370e826f22982b35f08145ad52be10ef186543de2583a5d4c4aaee699dec1381aee156e5ce1b46ca46b1c911e4813eecfa65b591c51d8ee0985ff2ed36f8efef85b09f77fa9e57c3617835ab3502e06c472b0c3491d505788a300bccd92659aa6504f8e77a3d54bb62608b43d38c5e608657563c081154ba1853def99bc8d6610cfb5d8bb1b9824fcb3a61b64e9e874ad1f3647eb928354547f9770008ace858b627012c632a32264bb8ec8f79e1f194c77d642645a00301ee8a5e9d9c0d7adbb5a7884e809a1d77ddbab994e273f3bcce6e179a925e911826c2f12d5c5ed6cce01627062226f882dbd5d8e57de8cc1de57b5deaa91c89a7c543c8c161ab8c016e25b2cdb83d33a0abb3a8152424d85a351c27314ca504449d2e87613a9b045f9a4ecd186365bc9bcb5a40b469b6e5b0e0cfdc634a46267c722e53f5d7688afe4a24136a62ddfd2c637300d53d523517726409b8b1b263cb014e71529244ccd6889494044835ab2767289e09fd2792e700ad9a3f0d25cafe73b91d1028e6c966ef84f9ae905dda634fa8a39e4c9bb2d69d044fcb239fb75200cde174d7d47a63336ad698e69c0bbcf1827e34f6460ca948976696141137ccedb82d1b73bd4978a27e342297b2284724b072c61dee38d3ac9508e1641fbbd23c539f28c6f77c47c88417a6334645fd4737682df2dd624a331f4d562c71a9b849a62546ffc2e4320c44ce2adfa638f504f58bf1f3a9b869e0d548da7d2bd0c038931c1672cc8ca29359d07d05ca769d40b32c1501e0807b9026d1a415d854ceb06163dd4396fb0ec0c472df26204d90064bf8eb1fd22da38a38f9266e8f5c1cf719fa38964e4f5a96eb9557ac29a2d75d4daccb7cce9b5fffc151097c6c67083980de6a4c0dc6145e5d0aefa19619ff6586994d44d072472411a9f3ab21d8ee0586e5e16694f96ca921ec880608ef1746e479a72c6b41519e08b6b6fcf3d30e8af9715bf8e283ff68f8bf63d7012c3e595f1bf595b05f5767acac40a7ed9c1609cb5487612005248fa612904090f703e0577a79317db4098ba4949a6b7a4be5eafe5be8daaa67f95ffd0a8751572896aaa5b704eb949dad431ba35441a81c89840404a934b968e81c8b0e36616582ccacf24232f8983ce1d55b1f6acb253455f87be656dc72a57adca03daab283fb93d224728e40d4a335abbedeeabe3a1cf33ed731e2f68304eab9564dea7578b0d84d0d945ca320542e7570ddfee649702ed97852edf30c8de869b8ca5bf1377e09a6870aa3c346c5666c58087e36827066001881cecdd7643fa00b0773f8345da707c9a1a1a4ea679363285dea001ff648d24af941fe764042af149da6bac2020236dd2c8064374f296c692d871faf87bbdf164746a0d426b633f4320492dad8ed2593a4f58d85019b480b082c7109f083ab8e96967c21994e7fc2a7192473e3003beb53c48c328e5aaf1958031645a7eae9e06fc7d4be1651e73ee90da996d1681c1564f782b413747943a0b03858052620734167abc0d87c5fe198e044670c6cf2872594c7bd0d2187ff30bc733f9223e121374bed7a97063cd908f90147bf3cc3dad5c980a06b933e23bad745df83b760e70b8c4a8cb9f12ac8b6fcc7280e595a01a4d4316e2b53829203c5cc8e97ec0b267940c364bac800f91b3ccb4c1edde31ada848865a1407faa349bb3b50ce59e9669cadfc2813fc33a126c78183ba28069f4809fcb392339e41d1129121a6b92c007ec562a5c60245c54b51dc1b2629a59f0b293d7c7d7c1d161e53bace79a997e2a23d049338111c6faec33bc6831a831d15fe1abf4c1a2b789e137731e71d058c74721c132b1badd335b3a8bf833d6cef0034107c64ba6247500affdb128a1f7b632de90e5631d803a08c6cbdca9c471eb06403d44fe4dd04b96882a20c9128b7e00b3e62af75aeeaebbe29a8f5a8b5beca29e8d78dabcc54bba85536b80535b291c3655fab1d69af9bf10f2d7623ca5e3432880a76a0a8126343a2c8fbeaacb055948a8ca8db1ea50befcc54cd4dcd57ec1606743ad948f4f519983975717b61e92d78514f3dba7e57c29457ae5a6c32e48f272fa508f041f99fb93c120337abe67dc6224b390b1e9034c794a190c440e1f2071a411b73eab4e82ef8b61bb3f7023f59bc19ccb1a1d458f275d6fb944ec8a20927b97f3a4ab0fc417d00c03c62d3de2b2b4dd82f12ab05c2aa00ac88d533419cab30f571951b0006cfb44a4217e4a3a600b57c6d35f77678f7a1aa500c16fe444bd226a34af65cc790126df56baf35ecc898d49efcf2d8d1fe783921f2f455d6d63bf553796a8df9bf6dc832b352c948cdee48d5f21755b091b45f9b8d217d89969944b475defc3ea2c3e6dce6f1f943e45455ec354a9c72b5c89fee56f63e7471419a185912fe189ac58e2ddfec4494c84359f28a46bf331201d1e5e9825a9bfd7e08cf4694da61249643613c5926bfacbcef3ad208e3a91f6a202e1575c4e0277a05f3ad7c1dda8b904d5e2ca849349cc4aafeeca1f22a9dbf4cedf219b5cf75a7a4a533c82d01d2a19938579e9c85240f4a077d5a90031598b3a6c5d2a0e9345a17fbf5121e20ea006ba34470ca4709fdecb4e2d1735ac7ce49e1a4ee4fe7c2579155d4ed718f78a5cb9e13041cbe129c4f1f86e04829b87094947ef9a4ce003ca64158beb84a0ea20ec5307985b13b7f1be74cf0629e18bab1eedcf55799f735934742fe52aff509365dde743536dd6ee5eae6fcf74a52106ec49a53ee756ab6185fbeb98792daac0611f8d5ac014f5c9a35874fb4d7f4987996721b95b5dcbe2070c5ce4d8edea6526ff163a4ff49a21cda370172aa0a0a5ce8ad2cbc38b365447efc76b718c5b7b2a62df4f9c2d380ebb3849dd08eeb6381063e291d835913afc9bcee4198f48ce51c5f442c455756ef2b1255376c80d32b4e722be4967a6589748be610bd704d81791ba77d7aeeafef6c526c564e775cb974232de8af21f26696259d9d5fbf567bd16da0bb11c0b6c71a1ecf227f2964246a660a2a8d67fb7b9454b999dd2c74a74200c7d797025f1c2bb9cdb0346f90af6fb622dd5fb1e384cab91f6cd0b5543b019f570214649817ab86ea9199feb230f47d0085984a0c01a686ab3797397a8eccef724b86fdba004327d122b3febf815e96aec414cb3bd2ede141e2d15bab7dd05d0fb88ee71496591461bef94ac1c07bef83894ee866aefdef8db5b70467e983bba5096062504fc573c451adebe1a5cadc4634095829c54ad7330150370ef17a388bf9ea3a4acf453b685c548766a0e09cdc89b407ca4adcbf2be55dfe21407333e817b7af958f4695f36ba8d177baab9de92b0d07b06abe4bdf23a30a26434bc9982bedc9ce69ecabfabd3048996cdbb11a2528fe575c7f4dccaecc4c96404761968dd5ec062e75ff5bd2f18afcb295d26129461098a82e90a7462393979aa8b0b9d0d463fa14934b17a4f86f3fda01af5456126cce80292458d0bd4a75bcc4666fe7f49f4ead1e917decf046d157129b7823948fa16df4336467229121c2e61dbc9c631341a8c97afec4e06e0894e86b61458abbca9a0789432110fc9f921be3ee7505cc4dbe584f82e40ffce21f447eead11df882bac5c92266b519f3c47d439a9cad4ffa6ee5932bdf69afc204e3cfb6108000d5b7aa13a2affb9855c73e652a79f30b578da8cb583dacefb7f6e1f8b9a77694c243e582f9cc12dd3c987ff1ecc656e254fcd16086a82c253cf327125bae561ddf2e4b678b2532afb92053d1a4f44f56a69e66b2beb96fc7040756fba2618dde68a241d78504b43148ebcfd01fdeaa6fb44d7f2a6c9236bd61eb7f8c18c2dd7757f89e3870e73b2a1665b515e66a69ea4c9dc2ae63552cb5e4ec3a16a56539bfefccda30f6ccaf4b08360223ede8cfd34ee1872e8766429415724a4a9fee56070bd5955f496c7726517e08c08571c80c4bc238a59f522f53f0d08ef306bbed484d69d03d9e46be12279a6cacd805a3eb8b6a21f92ad51d7656242d68863f3287526f630b66d0e7ec487e9ff2063b0ae1667973b34a19e870266870dd0f83f2f5c5366ff47673f704233b2b64514b425a0b3e6827dbf9c77d307c87a5028ac0f42329ae899255bc0393186dde79a11f5107db8a6cf7dea40373998cd50a10fc776dbffd1b80075cd57b81eecd9ab0cadb1060d71cbfc5c75de1e50db6c7aabe38a8e139a161dfe238b10648fcc07c4606614d437c11601fc5b08a8ebcd65d48812cbdb2c5765e25965934dc6dd01517593b902e8176c9207bae692c9351ffc08b597be56df64af2cbe94d476b09e27027c440be0220157e172141e362f69ebb75cab5d5a5f5c1b470b3eefc6d66f3a54d96a496d207c532b534f063a17c283b743b0aadfe6414b4b83b0fe8d20a48fa8234d0ff4c93f8cf49401fc7eb28a906f2e695ee75703482f64934dded45d2037633c2b13250ef82220ac2f1104ef8544bdf573d6761f6e76cf0f205b4e098459252d2f52910db70c2794d7bac3e49641ef40f280061c121a9443e14061dd87abe1dce50033524ca766c46cd409648b73053d4205232a32cd4adbefe056801b21ecabaaa775508c027bb377b278907987fb89969e9c0492df0621205fb2c05013ff8721b0becfe57480cc54234ac2bd347116902537e1efbe5f0fbcc17ad9ea3b446b980a3e78e8bd0b0f9956664985441da8e6d8c50b3f467d948c57c7c754149fc71775d6b83264375a429d8fd63f11ca4e10638195360e5bc7c1fd7dd92b7c91bc741193cf292b19f747c9c1be46784148dfc7dc5133ea59b44d59c988bc85de28be2f9ba7d99ba32f45aa0e092241adf43995e9fe0526eaee44666a1374442ba44653a61e673d8e4ccc0d6b91cb76b2aaf5cb9533317e3a14376337c85cd62adfe473089526d3e96e5a7f750d34e510ba808ff2faffbeabb70175c3f21ad09f50a929839acb326293972e0651091569276060fd046bc40a3fcafc25bc0f7993121cfb14afa37dc66edafd4d5b1c975263436cd9e3959c108873945c1c0b163933bc0b0b1954436d1622933d137a6cb0f13063ff6f0354fdbce2ab444fd2d9fee7107f32a9597448df8b093e61f874618a4cc8f73e35684aa08f06e9173c86b6fcb2603dfb8f0111e46556313655b9251a345c68fa825b018f41554c2f2d3c8199bfb46c249135e306a58fc82c502061b4e3e5acb74cfb6948750a948f9a4dbaa010f056493a61b5684cd301e600dd613e1d5bb25ef51e430bed74d362e1dba917b4f6b0da71788d3c0325321e575f81fda10fcd6c1a79dc849879077f0897d07496f346f6184ac386ee0a1d1a4bb8a64acfc2caa52c48aa4bc346296881c94e303d30157f598ac6d56a878504a5058ada4500d847fa3f0d70ad934e9c088130fc40e79cb83fcbfeb887480630d9addf047688788793797956afbbb36de237a19e4b99e054c1c40bd345817b17f71eb5a791e9447bddcc6911d15dc48454f4fe8c12850a2eb0a9535453f9615ff4e7578d601225afd66fe053c76b3b05ed8cc8f129dbe83674cc32769d0aef167a332776cd7b250971255194c518bf984248d80c1a3c81a45aabaf06e539f4a2098ea252f188c6a2bbd559f9195b8236b88d38f05d0b545189223f91ccbc80ec29941286c8b9729776ec6b2015c393dfa746e97fa364e727e6257d3814ff420a0d555db45e5d955c5ca213666125c482a5b9c296fc2a0f3b82b0c6a8895f5972dc7358426c2075d4282980c1075a4441a23ec229e2c53ee42c421931e1dffe196abc3caf8fdde60ff9aa0f528091d2b3b780184f97705850c26b4cb553fa239203673512050036744d4ab14d6c0897b46792ef7a960140919f81a5a8a3226da27aec89acbbf2b666322aa880ee52f640abcd312412e0d156c9484c20fb4975d2ebbb1e6f1accec35dc0950f9cb361a0ff32ce89b60a2c5f33459e60c448feadceb7310fcfa1236bbc5110113286a3c672ffe784d53d29471fd320dd2de808b176ec797acf4f859e2b83fedf03c625ccf6a295c5ca73e017cd79583f026aad3206c0e6c7f71e29d29ba2d9ac481cc29794ef1664db7d170eabe758ddc8c08323a6b4ab4d2d92342dfabe494cf0a5b780870834329e0cc535fd5a739e457c3440d24b2d7cf7dd321137f0c55bf8f2a2275db90cd52a85df6c2de43ec880b11ee8dc2879ceb4dae01b21a7d38632f6c56c380fe2fef27406dd84d7d2ddc35497367083910ca82b53df859178f91d64d0084218768558593f7608c52e58b133b30cf472663c6e1153196d9391ac55e017411cac25a4978f9d291a10f64a22edc9f4ee02fdf2f61601f70951a056cb33c080fe9b2903e2619e45e4a96568f172164783e266a11121fe1b1673c07510fefd7b2a4e00e8dbb75968988e254fde46f31b64a0eaf9474e3ba7bf7309100038f75411d26632b4377a03d7caf802d5c033955b5b7e3c6997102d1ec0e37e1600e2ab685ff1459d5192e2779ac60941b8854b55ec146a05e29962ad67c2724738dc808181fd5710d7934f7d6199f0dea5b51b0422f05696f7aa62ac3962747b02fa00694b4ff391819dc2d6229950111f83c7a8e77077212154873f29b5dd4d053568845a81320b3e80d0a22d8953d66e98cc2237f45fe1679273976811c0f5c05097c5659f303cbf3ba5bfbfe27d8cc0cd468942fa6163093f68f56bfe6ee131f5893358b131120bf680fd21ff2193c117cc8312c948def9d243053e4341a11a12ea9e5b3589923f9efa6b056771e3ea1a0e12ee0a152bcc2eedc9a1d774f754d675963909c75bd6e297badc7328f84edab8315deec4bec3e3583ffbc34a700112d00beaa4875cdd127a16141d2fdfdc6e817b6b69e2a8c1a5491ac667bff864ea3a9cf87e985b85fd0f846f10002ce1120fd698db4d07804e0f13960da040a7adf9c28938fb40b726df4200271de122080fbaca751b51d77c0c2db03213381c4a0a21f2ae79912b47b5c32b8bc204ef23f30b3033cbee882dbf6310a352ae447e579bbe3366e15e98bbd8b4a183219a0ce3abdc6c4c2e553cf43400870161c2b7d4370ab13f0ff1ce1af7127e7eae9c8a23fc7997197c969552a1a11088ed451ad2033f4ae02cdde76f8df0ee3cb0826539f2f82f5f54f4a0b63e92372c22cade265aeb80f0e5f3f0bd4944d0ff1d11ea4028c4308a5ad0d64743bccfe80d296c912d0f7f577ed566d19722e602c174190ace531496c06c738dc7dab5d50fc08792a4437d185e8cc5572e001f8b5e7f01b9124597415d1c4b53683e474e4829a0e18ff93a32e8a1df5836ca008b0eb65d1ae35e65c14832f5478fd40e5a654f12726e639b15a070fb12807cd13eb4d19541c7c92920b60aa08c11d1ad79bb3058562a27716949b35ae5b16d14a42ba80e28c2c8a2697295d4de42b6e00cac955a432812a31a0695c7cf5c644d864f5fe058e506e9a520b81d15951b0175af88f967a4b97c8794055339553cd75a410389d77fa6a7ea70d8af0f5e0872c9f1c9139a1eee21c6562d16758f6d4cda442d98c99a38c8dad958c78d0ee3dabbd5ff90def86e8e07e3f21352abaa743de6564be181232f63f2c194e154fb65b01eea9c996e57821143d5f155c3c7265fff1e27063f7bed8913574f8082224f60b9c7e16f096c5631cc24f722b85aa60df7343c2b89e3c80db1859efe25846d76b8d59cd19e8e8640d9f049ada227338d82d057c045b401578ee92d9c8bfe54e495038bb25b0a13f818144eaee77c41d78aa10f247b40762aa56c9e29e8336e958e1a5cb746d1dcfcb8c917bcd9d46a9b83679513bc178edf8f2b62c9b60acc349cbb27e489a3631d4d43d4e5307c8dc6c0f0bc1e22e700e4c7ffd6a9c183a085b8e4a2d712a270a0878b6ae3f45c51a355cf19d8ca243c0341b5617dbce8bcceb06b8d91f1b3c276a289adc6a092f2492aa7ebc9d977dd96b2fa15c9c8ca4d9922921706680d19d2a82ca2fed1c6a4d6d3a8f768209a03c577db2a23ce6e2f18ac952be634542497aee458796c962f4e153b6bc8f046acb3588131c5aa444eea7d6fd42f6631aa96ac4587a58e67ff8aff4d9035d21971f9d6867a0f94e343d00fdc52e2316d849ba0eac16dbe386cf5f3f3b829891cefe2f06dda4cf96d3d916368ecb8535c06c61cf0405391caad68f0e098b106447bcff4e05fdc11de04129cc07a4eb4353b0db8d28e5916dde8465b5440d29a811cbf307bdb60a797756975b99c2990ffd9738040457db38ddbe3bbb1dfefedc2c7fc39c943ab4e0c13f81aced1c43e59caed37071ee646e1530f7d355eb74799247eb894683b5d0df15fab8bdbda84abb91b169ba9266b5b18cdb2759ed86a0c88ad5c1623d1df4f730d253db7a45134c336a706f130370a193d28c74f06fd4c65b305bed16b111d27d14b6318de6074752c43f6fd13afbe39bc22f3676083948cb912d4b66cfe957e6632ee5b8dd3c8dc3600468fed88b03b0e6febf73c5b54d3f99f75a0e1e11560f7c18f585ec251190b9850b320f5bbf8095bc572f37aff539de3b2c57d9a5186d9224a5d89f7793ea4ec9be5dc2286149d56894ca0a8c8d8c6da1c0b384d8790aad347c90f29426f9b9442a0a644d010215e1fc9c8dd2e2480e6b19425269dde23a5303dda72e26a30395d3fa59d6aca75b972e4912bc9aa8c7465b9c41ba234ae4d07880f1bae79bdd5367543b658ee365ae625278d1d2089280a8b9406d9752a349507986fdea8b54bc05c0ee0aa7385431603e36a09972675241508021d46d25fd52730fd561aff4b83234e6f2e8279e54d0a1f65a6c63ae01446108215e9023eeb33b211d8cc601fa889e75e0be3aff01f7832bbd4ec07726f8a78257f60e88195e50916d8056edcaa919c911ed062de1eee536a9a303188e8701a0ea4db59fcca0c9096cc80ecab07da8f16dd775ae54a3ad34606ff6bdda8d02c2141df524eaf2cbbd694236c2af66c66bc219c86a54572b8a3c6678e2a8c8fbca0069f3370f9e4362c85b593720fdeb795453232b843643d3422b35fec6339a322043a0ec4de99ea97b24a435727ce296dc1d8da816f2d9fa8d0a9a4244352f188428f413adf3cab7cc659ba30bd9c0bf1cfbb4b31dbf936982da55e43e5bb52c1b1716b11ee2e9ae922f29d8dcd81115977b127e38efd11d75f7cbb8a9e2ace61c43e41b9c11569593c3a64f72d52e737e2be0120b789472a089ca19e0a81d56e68797c08f51e00e8061f930eace4215f0391b945ab92fce57416184d23bb6b2d3a8fb169c56779fb0fa172e50a72efdd72379aa3133fd740d54b85252bc8c1ccbd9712046be154bfa335a6702d1cfd9edad8aab141388b7491c08185b5f18e8a380c0365ab1f9e9ebefbc4c6bab6f6f0bcf59f99c96cfb1395ade7665acdd9c7b885c887a361492b6900e5944f44c3e86b74bf6ba0f2b00d1a8037cac477aee10c346adb6a6cb346305bcb22f84407f2316af1706629d4f763474d8d2676e01ed69a141112ccab9263e7c6725ff3b04c95a1385be367d32e8ad70ee09360af0b6b35f8a8b094f974eeae7cb38d64db3c5f49fc0998ba2e0e340e435efdce750fdd829099005ced9f40088c903d0857af2b4b76830b94e68e9e6f0da8e384230f63acc49f87754c6c6aa8fe87ee9ced83f99e1c0b70fba0e72feefb10d63d6a681320c8de50954187e3e2d6f874ef4a15e665e91604a94811766ff9e286954923e9011b999e9ab7f2c8cd8a2fee062a206d1c84b3a1cf84f1078b393636c8bcaa9e34d1a1f00e86bb5418bd0d962f427b8fb1861493478baa80d18fe8cf2cd15e1c1622570f7feba29c9e327ee753290d72d26e433fe1399e5a1865b8098ec2f2f7a4cdf270b7a68e29741a8f2f740b6b55d85fad12dd0b4263adee2c2fe5ffd0f5e131e819c5807db8ae091e4bd2604571bf5440f9f4ee7f5d1be812ce28902d233789a5d777efdd3022249e7ea96494cc7728379e41fe0fc684aa5c6253561050130381bd1caf209e09db6f96020629b5c7decee7582b9e844de0456a2ee7d78c96cd2768ce79cb4bf0ac1122418e7dc2d259273704cc7b2ab65399024c895843a49857071f11c50dcfb55ba8b2f6c3f88042b07b5bd518542d5dcc782a95b4d569d687cdf8575c64d40b74bd07327146ef5417194da504888e058bedc2596b9f54685ac6fbcda1ab78166ca1e7e315b28f9565456d98332729f92530962f66ea53d6826484f4b80c4d13628f88fe81e9e9bc890ab502840b396d0b6d1de8918d1997f0cd31624ebccbec3138425315452997e8f79f8ea839a7dde6f9ef4d1bce40a1166fff04a1aaa0b500b03f7ac6770260b66c9d06aa7ff238d0e25cf8d33fce436f99620eb8c48ef319748b1d0489f9c21614de8d825bcf452a372690b82d8f4ea27a5dfe6f4f69f4efa0f0cfde3977550f24b62062d1299b93a8b2d20eb423b38e97f560a7528ac192a73d725c830b2c82f535bd4957b9341248f3809ebaf1e5b0601512fd326933ccf0fd625d322dbfce920045a54f5181160804a762d51c4ec18cb54529d610b48ca6b07d749cc027e5a2a7d9feb59b9aa6fa9effa7231cd503c8aaa88f5ee1208b7b6652cc47a5c9323ed9952ec62ce85b8502cc97713d86418db5929b066a08e9a6806dc30b902d9f003671528f072651ab9250bbcb64f3da4bf4a1ee3f5021e600451ed7e5667d874a535bab058aa503c7e9387eb9df11161cb363ab0febd0b21dcfd84ad8ddd0b5e4fc7fe0dd29ba880f529f9f01a20eb6effe282582ed52f5f4d82512814fd4c85a704246cdbd05d26f7504d1c9de309f3ad05c8411795b50fee852cb13e6dadc990049b135e234960e49f5edcaa69fec1874b93e34208330fe388a60dcd18b2015a8c24d93011c4fc2f77209cac6b5afd9d3d00b6fb992da48967ff9c9e21f75818918511b1b4cb84fdc35204700ffd297054ac9019d1de7ac449e74856b2503c626bc31acb7bf6534acd0ade072036841662627f3587580a85d704875f7688adfdad0a41adb603203175da96764e41f772825482501f9ce59663c6a4a756443f09e0f773b3c99f930e2b4b2f695228b31f21aeeb8aedca9884ecc8d0df6736f749a064eb77e27504da1c66fb993e9690a48b9280d368e182374ec479903a5948e8060c18f10f6fdc3b6ea045a0e2ee5ce825ad31954593ebc39c4c22c60d125509742ca949f1553674b3e057a99e6b587e6dfb7e4cf1d96c2ff54ffc7153647adbb074f23d0cb1aef5e0539ab552d930017c92c852e0af28b3a151feae2bacb2e054e73c1c508711fa2e7604274efc5e63c19d0b489063d8fd8452e89aa81847dc4ca8152a9766c6bc2d3e72163439a9df419979944023ed8214474d98fe6d05ff5cc057b665542fc4376ab4fb2186af43366babe025948be8d520755896adf6795b0fd679d2e10e97a297c3f8c7f704be07a05bcd7cb59ab5af5e485ee2c6c6a9f74bfb92ba1f1acfba2304c36116d0523dce223c9802135cb901fd12b01c180e9b27cfac79730edd450fcd890d2d3e7333c8fda5248b7fe2ede4dcd10b4ad4a5bfef8133b8a7b23e6a21c897b03984903a4ce39d31865d10d23f6a009f29bf3a8c5383fb6060d965250343ce94ad09ff2f351bd3e7b71e668605028557c8e4cc7406a4d7c4f044c8afc700a67436ed1c65166e3e209f7c73d1930663a7c56cf35fc82ff5b622af945fe2ac4157ac1c33c3c8db186a44c5409fe878101ab10147ff0d2980c68b5a0027b7d1329c9c74414847f5c7b743b1aa92039c457fb356ba10d6998ae8101fcbcec15b00dc0e9303893250af0a07f3d21e4851ea7374fd7e3f32a6a032829feb2edfcb72fde519a6c94df2fa8f3f423d07805a79b6ddec5a471b90840418905c6d202bfe430373ce7beb543d2dc8e8341db572b3f891d9a044f777d686a156fe85ca6a938b09aa446666674e44cda61563dc0622e6751ab1c6fb52cfd83a278e4e832e2b4e126a03760aef25325bbe0f0a61dd1bf20cfe252169cdc48f675401f35169e1153514e96d228e32c43c7da03751b9259225bd943bb92b6c460a892991931116e08698c9471f8b86b897ec4fbc56786718d084f14cf0b1a0c1abb2220115ba83be4ee88ac7d6e2e41cf0bae78129f434c86b60d04dbd62855b30b2211b435e223301c04b77b3e0d04ed78d0ed7f82ced0a4c0637c348b7dac7119b2c5c73eb9533844ee3776c94fc820318b971834f60542991a274bb3e6d3ec614fc90ac23f66a939322a6b6147ae19d340d7d748cc83eccff7fdfd7c4c231da6ddbbdec35824aea2b7a13d80cae87132a6081060b18e2aad0d3fda0fa71e88f956b0f80362033465cd9fa3dc05c7051e0bd1a9abaadcf3d20169e3546d83c13684192f1d78bab3cd4ed539ec1ad12dba8226a9521076ebec692fcf1e2b2d9180eb18b90a1b9ad2082e5f1cdd9806bb347ec7127f866a148d85f1766aa0e3557a385d5c9b6e91e5814bc01d872b6fbfd58f98c32e2840c94de169035ad44f9f5a19fc12e4a60cdba960dddeb0f9266b54903c78d10ad42008214c20271b32a6c801a1a738eba301db01fe026e601f07bdbdaa14aeba9a64957d1f04dca539ea7543f97156465efb518d6bab78f19db1c17caae8c88c3e55a237fc0c68d64955f6041332cde92d8f511d055954dc2e0438711244deda2b134a43d68231894a833bc87717ff166963470cc0f73c96d49a974881501f2c4aa4fc671924d056967a417a023d229ef830531e2de057e5b72b13ea87e98b355dd4aa59a9f0942a0b200b90f641f82c60134a81f9a9670e2a720f7822f3e83f3827e5aaccffb07c7526f773fe2a023220030ba8a61a2948e24d02d62922e628e2c6f95dca0aff54619a96b51279bd68ba68bd6701ba822c7891cbcb4aab3e9151edaf5a0bb974f5ed8af9a9f02b452e6910cca5403c2e0fe57e4cbf7fda18cb9c909b912c34024982982436d1e588bb24cd79c6bb753a1105c6a5268180325ade83f8285ad2ebe9570423de1a464e944b532c008c027f5d511fc40538635e3716f59d1820b1d0b4b64617fd8374095e89c201a8a8d038a84c8cb135e88ab3417f50fb14fc801b19f9544fec7f9d8ccbde5a8f7f28033c805480c287916ae4111011443420816a0c5414e7e8f3a738fc74bfa46500bf7b39a441f7fd637c5b40140abc06ee2166f49a646346122bf0a62db89ec7a5d119754d3605db7d69e0a6e0443bc4c5dd8e4127499528698ed43e14a49e1bb0ec966f7d580a949af193cd4141bebd42b5e21581ad04e7d3690736b9c5e442c29d34d8a567f82c50012173cafe9382eeabe8f8335aa1a1b9314c7524badf9c1cce6ce49d57d81f5124e55226366077bf71192625b47f769d8459838743fb4e8b8dd0d79f84a765189a71a4d2256cb6f82603ea20a386c9b763cb0c2035094508ecfe158910e7d06e3117cf843805167680e8e09c745126d2c53a43d2583f7d2650b1788ca5c10ae471ef23764d3b0928b3823817ac18f7f12983ee460a616b2e13ecdb2420f14626e3445e357a05e8a8db0d1fc37f1945ecec9d8716098a6ee4c4558581ca181d2f8be602eb242dc6e63fbe314c45b3d01054c8cbf63a8fac3de0b81abc2b303aef0c6b020db33d20acab32c633b89aad4783a01756c6079dd5ed31e0acbd76ea191fab9401153cb2182e3373e208cc211dc393a9724c622d79fb414d929176dec0a730ca4d262585fa6046faa7896987f15cee19a67411de90fbbb0e7e0a1311643e62257676d70869e4119ccb2d638c46e30e3186ce0670bc98712515358a7d672d3f6b4f749ad24bb26b0ae9c7418673a38d947e8434fd9f3f6ad717867516bb8fdad814ccf2d8679aa7df87394ce05f8d50f383053118acd407713d28c7e261819c2bfe2bbc3facc7bda9a4c8ea711a62952717866910ac6a041a37082cacb332c834235f044c68b79d66669c10360c29ed2258cdebd023c966f0e156dec8eacadb1300dfbd9e0cc33969645319af5e7a0e45b582f04aeda5a146e869030022075c2e8b780ebce6d779640cc43cc21d7187ac6dcef9c34d3832dead98a268147b7ec15e913de82ac8a0440ffc370e0f7078c1e266480fb48ac754467f89641787fe0b1a158a942759664057983b322a28b9092d826671ff7211dd2e64fcd1e59e08c26be81ab0ab1b26720719c4ca2f52f444e2da44e8fbd6d50a3a0e45832fe835d625edcec256249a4d161c4d106108f31f00013aecff71628ac43d2808b25d176e568285348c51373f9d70de676e6a2ab18b849e099f908529d311915e9f8f24b1e58800372c8b614434fd312f4e785e36fcc54528d9e3435c04a17ae430b1f677fa0004596102c13738ae824043470aed74d6f90fd939e16d8726c42536867f88b75914ca2eadc8406079f8cfb0e58e326ee83a98a6b6e99ab2d8928831e267fe882e361d90996026020abb1793affac70fd5041c922efd3ad0763890790d30b73a9d908c628995912580e618ab9bcc093d3cba583f5e8ec763cc4ca8afc7917ed566a4e4a3461687ead8e701db2f98e0f752413349e4bf2e7a2a847af5fab87bcb66b7e38e4834fdd2de4d2db4dfbefc17d266d9e27da3885bc2bfc24290d0b2890eeeff07daca95a0e71bcb34263f26e8052ddfdca5a27691e53390d30a78d1c11415e596deda5b80d883caa774327b89b82eb70312d6160d81162721ec4c0e24aeebe74dab050e3f32111c5f576fb28b6ee3d3e5f2c6964e0f15ea9d1cde5ef49af5b15ddfb5cb75e8e1981254faa8771fa26f99ae38305aff1e4c4a0c2a5eaf1b51b29a18f7713517768763d252187c0c6c91ccceac0adc6e459a160d328a081fcdce31ecf3d4589a91d39f18c4560468af254ebb4f5191690ddc6dcbd3062ebd6555e0666b92d6f7f424ab21f76d52da5d9aaa4c4be87e5b4e2b68dae589d8876901dcb5cc68f76854843ef9151fde6a4bd10a81064d24f6615a00772d335a4b569248aab4b312687f0b8bb64707aa109a36e0667b82761293a4840f12316586d4d2546e75aaaf28301fad1995311399fbdc7921ef876d09d6e85ba5e52fe5200b095085a0a40baf054369ad4d402f4c8a0bddb55549fc226c339c2d6937f92ed12c976ce3b311ea4eee52419bb325cb6ccb11e08ee6d5ab0e225e0a31337759d3f78f80ec93742442e987218772094a7e80b07794e025b963ace3977263d8e7dd8fba37c527392571aca155979307485bb0b125295e59ec1e19b7233cd994a0e55d67777bb837827b6b7d36b62457cf14d9d8129eca29934e1c580a4cd2bdd2055eb3d00c917f1ba21fe0a4a7de40834243c5118187a48c624cabc91fdf9a040b4c9c807b29b20350477a9bcc27aec9a1584c99eb607f9e5b5e974330e9b584ad2609154d4593e4a4a54fe05fda0e6ec6f05067baf47d54e4cbc638a8105b1223b45ea1ab07c25085b82319a3910daf3fec41c1a18f935367af60be6ff52e62440cc3f7c10730899cc229a94d38f874b2fa6b11e049b87c488d004c2e037c81646879de618c9200407c111fb1acb0f2a5c1ce1b80902f17c0c6383afa1a10290720b08de15444b07d02d3790310bcc3c2367886a14010c78b00e2259b589bb7350d3fd07960cd44c2a09361ecd9d70c7e4f4bb34bb2bace9221538cff2dba5eb71bb7809149c96378b3cfa3ce167cfbf814c1b307326f58d43fc85086b869d4329d61ac9e91c4d6198819b2c3c24a4ae9c80d58b5a2780314b9462fc7d8141cffecdc6857d388321f12642bded289dbd900a179e60f05e6cfb0bd31474fca4c7fb3529bbfbf084712af8c2aa2240173236127bc480a1dca70656c61c8df4fb8e917b4861fc651ea206061fee2273690429fd92784daa297195df7ff19f8526556e8dccabbc2faf09b1170dd6c451b628a7521f7a9408dba44f1112aea216c867282f694510a475a62d4785097d2e1bf07c0715fab5043a4e253eb48f8f27a60c8ba3259744b00e8cd4680a60600f6d1c4a5281b6a7b74b45820e7e59598971b292780c7f3af665540e1da6147253d90c4192d972d44ae1d13b888d5b1d0a1198d6004106569a2fd8fa95db17a281869115340058aeed756f5b68a3561181d93c57d60879b28eb22ccce4fa2b249c11480e241b0ac62b0226811634846fbe30117a26abeee0c5a77eb70d1d18e178d7d01328e1c1d9daf3439262697ec1313ed4f37e91c40e599cb2bcf098315a3850d9b7101ec68597b67b0f796b4364044d82b688a9b001bd12c4d527b2e865c5dca8f72c9bc7ec407e8a85747b7e16ff284c73b01b549bc1f84fb86166b20a3ab9be58efdc7a843070b9365fc007f4de77a2cd394357750a1e79011441398ec042ddf4609aa7f0ad1fd266bae72f54f36725fce0ad9c08a745ee5408bfdbee051247ec2841987005dc20a0524905a34baa9cd680656cb2229381ccbc21bd456dbe918f04e27da5f11174233d0010b61fd1f3e1e2574832be010bc4f6448ce4884bce41d13b2c0628f592618c1663020a49bd2e21c00bd920d161eae5db40cc3f54120d75343453b52f9f38b7628855a9493a02956b6ef04f7734a642ba57c0a6aa131991839d6f09cb9c709238c08328e0d23089b82fd48e484e64a675d7e069d4c7aaa3d8b1c1d288fd05c0230f6e15c023087f01432c1a803f2dad6d2626651fc97aa1d6d70baf86544f1c97da86938e0174d72003a997727d1ecf44a1949af2ef65f299cd9dcfad08d56ec8d9bfc10fba6633a03bf2bebb90cabac844fb8c59dbfe822695b0495e813a6400aafdcbacb9f93aed65d5ed1c7c226ef7989557b709f11f4be4e04c898ceaea0f0e3b926e2204f6a36a05cace99608be296494cf4c994f961c430c55de17e857fa7d104578c3e6d58aef482e68be2623560bc49a211d728e67ada398445f9a6f3ceb9ee977d3055282cb408e4a000d049b6c73411e5fd74ac835175b2a9af8e5e24c2259887656b4a22da1b1fabea095b8e239b22cf0a837359b70100f83494f764419608778416fefbfd6770926c19f4925558ab25c532510c53cc69f326057ac873d962ad8cac2b640e7f2e903b6b73f616e54fe80049c10a102f7689a901d782397dcb203871bb9c11d6932da015bb4f5e0529c83138f2cb3056b5e44c9174ad27b4c89800ba98d1945cd399bba28217104b8b5a26db038d51e36b0af3dad70621df2a40a77846d2e6866685a09b28078c7a64354e1b95becab810222549f226c31dc05dee384c54b8ba2cce95653a82d20a23ac48b0cbfce177c8a4b0ef32a34ecdb2dce2f12601101a5d17323c78d5e7d373ec20cbe4247a2ac21bfe298202280cccddcab16fe188affbefbe0a9db87263341b4efbc584f7e8b4b4f67df0ce8231b6e5fd30f2d60cbe984e3a3d00f03ed41e71a469b54a8964b45bcfb7ed85e06924ad154b86007358ef90fdfa0cf524074326399914a99c758ee2464e4b9ec2e65ff272236031a9a00838c184070cf6f1988c86da8e99f3155d37058ba91e18a384618e0211bf5bb6fe90f431b3ac89dac970975e38d32d2bbe71e6e78cfde9c415caa2a043598909ad21f2c07ace2b53a9141530801a55876cb2d3cec40b6ca1b12f164ac0f6052e81e9da98f2f676224d86824401875693507722db7f407b4c69370fcf648eb3a8a1b6d938fffee174eff4eafc0de5d9f2aab15f235699505dc5b12fc0574c82e06e8eb2fa03f92f94b7f10f08db87920c4eae1d46fd348880ba53e21aeb0a53ff4f269e22a4baa47779c25af504d904723a927630d39447d1ee90f96504728135403b2f2a00a925993b6e93840499efa2bbd8fff5aa53f8ccc1c32430f0498e0e4d9eb773b7899eeaff81f86071d9c0192f9afbe8ce45a3ee0a405dd0104ef1fbb5367eabc4297534d32215e532becfcb0fe31ac766c6a432a74a4dba6e3b3650936e375792c6215025665ea8cc8365bd4a3a25ece4f10a484eaf50f525d1c934fae5cbbfe210838f90f439ed42bc2918d50885d2c031f755f88fa4fac779cdf5c828cf9fa6585df9e91123ef0272d12657febb40fc8238b72d3123a4974ac839027287614898b68a281b8da24c07bf028ed10114947a571aad1ef19c213fc4a30f38f8fb8e24874ef0e4b4eabeac6e938bae464fedc4ba87744ddbb7bbad725f97e4077e37f50a97906ae75287938098b3c40952c017140a05d28cbe07eb89a0cf744bda711da9959d2ef09f17d24d030e2f10195fabcaaf34cbcec5cf989d6c25d44351c9147eb68cfa61085a64db5f753640ecf6140a4700c43fe473a28bc4142f705d45c545584c2421ee7f94e26a9690d7a5e88b4bcef1c47d47c5500e6603f39f457e01064b9435205262ca211f6f0a850d6f20f865e76e1dedfb19e8895cc7070aa014da944176db210efd1638478ac7c71de268b0a38ee7bd22259c5db6200df8221b331cd2b0527aef3e0f0412ba47c1204648152d345e9e570201115e16d76a1ac3409edaec2b39d87f9072462174877b639d345e84fe8b77dd210041255ba4a85b8cea6270a8149e8af269e6c38e72d353d20109c7dfcd66b3c38b4528bc43ee73f7518cca227684c2fc017dfc4c0ce799ce9a0737975da2798950cf31063c94b4ba9658f03ef487b30f17640106b951e660e38833faee62e7bcf23db07cd905f1104653738ca0dce01bd5834c1464c927c4943be7c906a5e405c2e850bfb643625cccec838b653308d3cd4f7ddb38d3145d797118fb062f65b66416d83a8ac1e58c8fa310bfec8c6701a21fbd61c2621f7a4ec8ac8728f3da00c7820c4d239383ba2d0001b9da23e786d7a106c562194ad94951988b188f052e3f00b509e469652a17a55b9ae175afed3aa4ed59c80e04794bf8703a241b36b304b3b76814a911732fdafc68dc92bd44406f1d5199cf0ad86056e208931a272b3a70ab383251b8c877544f4706d9ed511f7551d947ea26d18949280fe68f67923f54ae1f03fe2d786d1eec1e12f1b974aa948de1d8674fca9945ca38ac2b931df6cebc31af5f3a58674498e2e67953e377da2f16a16b1929b5dac80e8ba422152784e68a396c4edd7db68dfd405e1a747d80c47005eed405ab934ecfe0e366fbd3f8a16b3d8385d2a918e30ba62ff1475392e651553cf40d6ce483a33a4989782e3adc4987e176d2dd913709c5361764ec5c20ab310d3f56c00fd4aacf16f03fbe0e8931e9d4b2797c061be405ec00a5f6f5aada1a2ac0b8ef1350208e3e873cc94b52662e2147898864934623a14b31efdd717848838335215d87191ea35e386272373890c81e58913b6e62bbf18a3306dc547c3127d3f39968b32dfe476313249b4ac390c9693d2067e43836c4d2121eb0b87cbc5ce93d386788f766953cf93c3805eaa0fc7f71628dfd70bfed6e3da21daf8b8e7e1f6813fcae27ec8af9dd1689954be4bd740d61ca50c3503f6f639017dc4db17845ee0bd5a1008093f8f1c6d89ea610b760fc95d45aa2df31e82a48814882e2ca137975bc49ea3689db357352b85b7563324385e42a0f9df58143d9004656fa3512f94a2dc102b767e193dfebe0e234a41a5a3c97a88c4d603856d4282a33bb0eff399871c8215a252619ff62a83f1e9b56dc9249fdd9c2129046e5b0699a0f34cd401f26d9cff00d5285f302268b969f6cbb6a443aa0c40c5c07af280f03e2c3000ac049ab72e797a5b17d181690939055370b1f78a2759555e10798683bfef63e46755f40a80ff42cc945ef63cbd6d9733b76fcb6bcfa2844edbe024bfd3c13c28c9a6e976a3a3df69c7778ad8ac7398dc3f91e7f6e72e60cdfbee245a770a08716e7dfdea283c4fd68e42231bf66ddd70890a5cc7a3712c9d6ca26df833e11bfdc0cbe47a3c96ce2ffafc9679161774e5ef48dc6398255eba4a3c16c6d8c6e5e2d43d49b0c922189bba8ac4b0714dbb9acaf15313d2d7ebab540460d93091775980c221577edcc4adfa9b38b80b6ac107fef39eeb7df6694e61f8feea8cb9d24b037505d32385b3d6b157d02df0752b5488f2a1f1a511048213d20cc799d8fe81e068fe29d85141e1ab159e4cedb52dac3a846ae280327f1f4f5d7245aeea4d725a72a5aa84f817abc92084b374f28097150988b4518dc66c0fa928c91cdab1b25629a8999377c129469c7c8f651098c040f0578e2ceb3366430c0241c17629ff4bd2837fd7fd125c830faf06326ce09a309bcbb2ed51acb54238610e1f1e4d8755282c40b3e4f067d4a4bd24d3faccbf5e750993501959cb7240ea439881ed82a5b8a0020e398accde9ec31fbc38c7bbdfef308aebc0d9ce893317e9f19b54eef1280dab5c9f52773ce995fafa09bc20c23843fff5b66e8965cf04a3142ecb2906668f497c99802e35ffc68bb93d307fb8abf5b48d1f45a8ccd2a612be62bace2150b6237414f155dae9079432230030aa8722299bd0b2dd138878ddd3704eaae4b76f84d90191882364eb2d1e5d7bf78a9a3e0537e8ef11c07dd55718baeae0699fc80c7bda88654b7b7bd1bf440c210d23a739bf9f736af014e9cce54c7ee380ff006c7f54f0ec791d0e5111e07b5634fa5f8f1ea10fd53c5971703d42ff711c4a7aa5bbc9e4a0f8b64135aaf06185f44cbb83337d09636ba4c071b2279bf1878b99b13107b0d29bb277733e0c9063d6618aa5a43ce82df072159c7279e9611d18434c677f8f48de3eb69f164eee5ccf93875b9831b609855276bb97b3cecae8e27a4e1493e136e55df25fe5fe9a981f7e2b7df4262eb82da3ca128dc4db0c48e24e7921e8692ae14070d80b73d299729390076051489c421583934a3310436039f90f35c28803433815e70f843006472a5a08b5a2787d5918b950ae016fc2d076ed7dc14fcbfac2880a2837058b660092e884e179e2cae28b020a36d897d6a1d924c826c76cd2d8889ceab347cbf678b92e3bc46752116f3c33002a18698b920535abd0aaabbde222e4c3645ad57d4d117f6b1380072e7fa89ca77cdfdba7eef3deb67e7918555d8ad67f3ebd71a181407e84619be97c0cde9f851129a5141994a29713866dcfc0a49e2b9a89030df0036493f4eac80ba8e6f2400181eeb7ad097e1e1089f5aff844b6b7bb93201f3143dc076ecf02c4a42f5e04c787c8a0d24279ddf2af158cb12a3bc31c4971328516bd01a0ab7922b359199fa494c461c53c74ae2701798652d4851cf99dd09ce410753d4d94a4af755cb010e39517d0aa7bb2efd68f267f64d2c08bbdb230f474a9ea5109426c62d2b670879ca8bcc30f2746805079a079310a3af5f62690c80b3248aa62c1af44ffc5f4ead75ad306e7f5c6c1e136b6ad9bde7600e6f7c02071eb117353c613205ca2e52626d9a73b6a417f5e193dec469606fd8615a71e1e9c7cadd25f99ff503e20a105182560530da003040818faab78438074d802cbc72d403848c53545b926313039f24fcf92e6813e7940ece15ea1e2240e1d31323a2d719446a7ac276fa63bb90878d7b3123aca4861025d0f875389352eac8080cddf45601b1ea2f0fd64ebc5727c57d56385de3c43519410119c8cbb88ff0b5bfbfc19969b3f22f002151cea4a756b81efb4bda8b5d128f7f8b6a8d57fa8add5754e6eb262b80007876d67ceec342b968596a7699e49bdbda308245cb48551bcf7cf0c06106911953b346f19d0fede97c006bf7f594dcb4a7fe5ce414636fb105c4d3658dd1955a3d7f4e96dd2152209f62e5ae1e5536df46de2b8d8ce983892440dc36d98c6f97e2ff5261c49c642f4ef560461eebe6fc4811d61d94c62bf53f2698cf1b4b50a0d832fda8288b8f6a67ef9aa693cdadd7243f363c6a00d5d9d7f442c90872320000728cae9ec679679383df335f4796929e7ba24c5fe6e72bbc661fd801cfeb3ab2b7ba42ed0cc16b46e83e18982ca9896f13fb94de97180b14196c42f22df526c36e28e34f0c9532e46e7ce865f665796cfcc77c9e70802556fcf947ce4e7f76933de63032c8fd75460ab47c4072234d1f9f45b941e20c8805db0eff51783b21eebc799cd78896d99673bb3aa4169c8a236f6dcaf5b716c8496175791291f31fb184ff6260c33533b00b230062c7a2c9aa8b33deff7c8439b757b7cbf182277c193a1122b45ff3fe8efa8057d7df51ead1a6b1e1a0edada2cae95a58199b49a2eaf583b67c165904e316dca46cd3fca34528cefa92c4c8fff2f93d64995a74701c2709dab228a79916f194af667ac4b33a75df4178aa2b2663ebe78cfe93430e1a523549e493354d9917bf660117a2a52a899dec026088312ffc2886c5d513e8b91a3b39d5426849defba5bd681420eec0305e5d5b2215520cd40db2e73f829504084074dd1e985aec089581a6e36df55d27c22950d3feb616eec987002963801911f36da6e94ad2c17b5346c57a9f8b2c8518f8556c7a34726887018b7579e6c32030f2a3823182e6f78ea388940b6c66d435b12b1ee1330b7da0807b28886586fe02c3d8bc80316f2e430c111f907702ca275ed3c7eaabc87174d642eaf5234b1d91c5604c9652e82b7fa314523954c669bc95ae7dbda20ebdde1b76a775f85601c562c446c2f188c2d011715d6119b158bafc2e4c097354b496e58b1efbc6bb5fb052394fd6a66311043430505afe6d55eed50fff14b59409f70a53410de351b09c51170a037c0f81c75f4d1ca7a62c1896cbe38368870ea6400137b7ef0459a97877de9558902661f003b84e73550173ae57f21066107e54f94fad1ba8d54c1c67040a5963a638d6bf0b5ce3d3b7f1d004f72f02e9b331257419c7c0245b171cbd1911b8ab297251d66b41ea15b3c5b4f113327a523d09cf5a1e639a1e1f103ad612f92170a48541121fb5ab03206122a5dc9185d4c22e075126dd8b1423c3c2a737d2f983938972f3a0a3b43323848db7c6cd1b5566f8a0ab5fcde6559d6969c62531e491a9c780d2facb9649d0663dce6bf6cd328582a6ca6a8faec9e45ba1674e2c01a52ce72eec63af810b492239f11fabcd48752085b625773f98d0f7a6397254ccc26c958e9836a80cdc1c6a74d39603bee18ca0a18ab139a43d1b224fc1a293c42c5af0b0eb925ee185226262f4191c497c314f32faa83b187daba0f836f3b1460480c87579db0f8382931c01d1ffec5fa7b5992af10148e192688eda9b082f19b4fc7e047ee54eb4ccff0223920591f9e20c7d990956171093c927702a7124168f24920bdb03f76a964f4823a727fa00d48cd6ff47b1072ebc80032666e6acaa1a6543a8eb8cd1ff0214e918990f5bbd85e75f4602009f3d4df88debfdc90e94c854d133ddfa4a4f982a86f0ed2860f5ae3953a618e23f72e188ff5a93fac305cd31890023a7d604b41ee7ece85b8196c33f6aec81bb4c020f6cb79c91d8550bce42533818500c629acd10247ad64cab16fe056ac00805e00e62b51ba0c6d58309057feac21d8c47d517429c2c0cd83dc114a38cde071e3c9f190455379bea7326437f148284471964067577a836bfa7d25ee070c235d63832019364c385db1a850f0c01a6f10ddacf577b858b4fa074a260e0d47598410c3352e8445fc5b15ee1b30a3c38ba33f70f8187df0c0f3b097faf7ce4051ec00c37f35f6d5a06b8b9020bbb4af247fd3b8f11feadf19447082dbeab7216329177c6acefa80a447bab4a78ca9f838f9e6c0425c0611f1482c6381c251b7deb0db95062cb970419a85a60d3ff5e3580bc0caea99e5816f4cabc2ea27a47018724ca3302ee5bf34e071a0de973964d399403b6a871b84169fea5bf78c346e7872787f6b25dfc95b3e02e8c8648e3c92d84513952bcc226364f14a95027ec24aa67d3f9dd4b4dfb24f1b7b373f6ea98d66fe683c4a07add0bea7d4cf0fca37246c177cee271e1c99ccc29d8cfd5ea6e912d134a350b73bc9dbf93b24b2b7f25df5b26ae1a0817276eca2cbea146c8f12d22340d574205b751f404f7b6f78eb78c6b054dfeb33c12e14d79c95bd974348cb79e11a09115d884f03a36be636468fa387e1b0832861749ce6b3e88754742031fbb24feafe92fecca33ce3f53769648a2804a19f90b9950cf9f7f3cdc2bc317a80ea559919893cd2a0156153d03a8bba120bd03f42a2439dc02c5fc4988aa6622d2967ac62f0a9a934c22260c5cb9a5fe5e1ab9a01ef89e1d7308315249335a888b7e0adfd7204f93fcadbfc81323cbc2ad9d671ab2bed6c9eeed856cf81489e9a440b5957563bf14ad648364fa3104c75ca14328a1539a586d47551daa2f57fa5480dc89deb0b8a3266d733f472d15160118d8985da533a322e013d130b0e8db3a77cb59f67ed3bb1371ea3aacc2c6360a6932b670f5bd9884a019f8d43275927e06324dbdb07bd0cbb62be82485d6655407dea0b6092b159efd395591afe30fa025ebf8d2e6c06dc462679803478f6a9da32bb38ddf15051d73ac615e55d8167a75dda3012f31f7bbb884c13c10334566eb1b0fba09a3c80eabbb4c36d5cb6b3b4efec11327f2f5e7c67ab576e27f845a79d7cd68865e279cb7689d35717daa627306923a50932a8835916d4a2a177f604536527b840f6d1306d32032055c73b7b41106e5ffdafeccea633b41eb603e440210141b5d8c94d3778e6e883166bb22cba14d0a6b63d10a4b38fb48bce6663e312d8814040a2b3e34cfc26b53454b4c657cc5110c26d8d4dc08bd68f674605342040366a573ccff805d5fb34294ae660dda256c0b3ea9f4cd77386327f8201c5d7b7ac2f03b5eaf6482f5a4f01f8363606ce10e09a28217fde74bc4cc79f361dba93f84412e3487ad058ae99652b04aa08035b406d27d396f802b9b25e2ea951e9e55e31cf92d52eb2b14a1eadff5d60bded95002f58ba010bd01ec0160784f62616e7370dc3ec913ea86948faa865b46ac099623f0802681f82855bb2490cac2f3bb42b6165ee597d0882228e6caa737c13240fba65ac9cf6f23318cb7b52872606b374279f88e851249168239d3d726ea91fd0d944916dc41df9fb39fb761af75d8ee01046a8cad351b82d314ad9e5b21f1f6cc85c95a7cafb6bce663fd39cad34336787c6053757e66c2a0358c2f64ddc672a67779f49393bee173a6cb582880719eff02ee81c33b432a8002fc8329fdb6eb3c4a3455092532d5e43a0200030d07b16d98f18e52a87cbee86606a22af83b7fe3a4d583bedfbfcc8a500f4350e589dba40e8c281bdc3b2a5a5158817c7b30b3a631494f49abcf13876d0917bd97e5b245c6435e9d4b7543559948bf52d344b89d5d9c77feeb6c99d31b210605ad280e3e4dec1a5128476988a4639fae98814496b738dbf3512e409b9a0ff3f46f9c46ff6af012779f499ca6db77dbdb772576ef4c7c8b1816da71843de05bad964b716e9077ccabf34f7b3ebb6df834577ad421e5b38a0cebccd52de59422fb72625ef168b3200814016ab9f4b27296e3d600fe390f28bc1c20640e8b820689053d91d29593adc882c6f93348bb8c51d8a0b8eb79f6a5fe07c26e019b0c4b9f0a41eaaff4a153d4971421733c3bb56ec8d114495aa90f3aa0fe71ed093a4b7a063c2cee70bc4acddbcc8122fd9cff0b412a0b8d8418ed7bcaae31a7699cf5bd074e8e27c43453549a05c97400c7fb1eea7045daec069ed293898a188ba3ce178ed811c850c2f67d018e07fe0b9a92b9b5414744fae249186fc8375a694aa02774d1a55f853517f778270cbc6f3a6dd658714b554761aac1077f8e9f0f6a97e22b2d4e2bd2ee98ea11c8138fd217571fc4261676ce98e05901be640dac162d0b32e7f92a23c72a001f83779af23d2526eb36818a406effd2a52effc356ac7339bfa824ac13cf87f3b54986bbc2e7bf7da812ae17d66c5b64851a540db956731d454f8089886450d083053b7559787549e798abe1a652616b850d701b67305aa5630d14e78eb9654163655f088ac0e61808795008d3f69f800e576d787d0a1acde5808947b1fb43c2d0d94b0840e0f6e7c72d0de0c129d3fd7f089698b24607a9b007f7e012a0cf83868b40b41012faa4c2590ea8f33a02d94876a0075a4b36282da6615ba04f2cfcbb536b78f6fac10a1fdbb42a532049a24d1ee0a41621931b94b0a2c6b709a30126f3a7435e59fc4e4a566e7f2289dd0719cb2e19d918503a40749e4015457efa9a81b4d29b707148aba64e12424ad270f817c26c31a4c1a89e0b77a2030974a4e52783f8689fd39a9357d4c4f821064ad33843fc71ac124c49f14fa3ccf6950108aad2cf5c689dea907e3dde58b0918ce79833e72f9cb1318e208972c7c8770dc035538979459f7a72e97203a7654d09b8374255d752ae9249c30f2e3f9878353c888585841d167ee7980382ef0e03c0b364e8d5f6b058450424e2650cde441fdc17f0ef974cd99c242cb1f47b7326e60ec4bfa67859f077990fe4b50ceb7009e5b6a17276664a81b0adc297af269fb09d481d2200ef56560125ddeece0933689e89e2d94aa1f3eeb1648a5c66ed41680f5134d51dfe3fdc297533a66059d134f19fa9dc9d4d5bd47ead967aca67c8e61eba248d69f269fdd190b5404552aa4d1a91117cffedcc49b0753e9b8883f30c5f8299c38a37aa32e620bdc92fb031ef3d4de4721fc65c2bfa9e9382af4a3697790182c43c5bd9e2ad255c14365c95e1f02857a6f1fec6bc61414cb2dd31dfefa1f8e16491dc601da5e3628eec76e9e29a623a8ad2e659a3b9351dc95228a0481cb25592aa3fb332da12f87e1143775d2d4029c9006850a8d49a62cccf7fa70f0b34cb14d6a71323484d0765ba80d4e64bee5967bf2c5168663f9475e78c06ab4f8a8fd7d779218fd8b83236af72827950c427d122206c5683ce75cd8f176552e9d61c1c9a706974cbd3c0189ac1b00c6662f56594bba3686541158b9f92568de832c8bf29ecd3efa77bfa30b4c12ad69d66209f43d6d64201d9f477f816594832d1b1a62a53009f7a55ffb3d1c321757895be40c09941cee5f412a8de1b80b7af7c2fb4a5e33535d156a048a97a52e7a0aadc4d687b2b7b80d9f07bb63d0f08acfc2971dd64a29cb0bc703688241c5041b16c5455c707d47c2b4813bf8caa24fe50946ad406f3939c553514fd00315cc796138f8c50a8ed4390ddb48cf1334f89cfdf1454a4faf8477cb3b39aa1037d536a89f5451e6bc5cf5cc7c8b6f83a4bf06a25d43e451a52f2c792c2ac7057fb2c63c007dfc594edd62c1307d136991381676b8eed4c9e722e5f3554671ec433074c15b5fffec730d40740c23a465e4703d3ad180370d3c2725432e65567820aa62dc65f00f0f4c724067456b24308c2f92fd0b749bae007e7b6a253e124eea403a9e954a821a7058d4ae3284ac6bd3aba9690b5a32bdcc1ff64dcb1775350139ba3a8204e80800589c16cfea3a01301d979cf4f912f956618193b659ef9ffc11c8f2f385ab7fb029698f14c815c858fe5d0c00ed20a380774c3498a504f30595eea80ea06be2aaad0c21d066288e4034890466cbe2dd35d234ddbc2b056fc7db54a19fdbc2c35382cefe5026a647cc6400941e8c7bc56fca7f50d58e5004fb6721cf3b84d956be2416385492ffa444d0259821b60123afa6d43e7244d4eae81b3ba8e168f28cfa93b426dfac9d1e334c05db14328c57a1f24cbb1df303126fa6eec8be19679ae13c38a8c63f03d2de2eddfe0cfe9479a7042b413a8332976200d30646745fb770607ef1ce5ccd393ddc5fe3e2b80a94155bc04861d32a0f791bb4344df8d101c760d97864ff2a02ab10bdb36a667a7941c95408380036895434106d222528fdad5a9882c57bca9a1ed0165d823ed541253d6d562f370d0234a7fb515f6c8d2a9b648077011430ad36d38a350f45008b564675d9a9b7251cfb4940a1f4c8350dd4876d854e292af5af10ed174388c3cfd9733e204aaa0ecd418b05df3b1ef92d5fd770e28f4943ba04d2f78e3ebaa6e1402192d58bd80f621dd9c74e9641c82d16a430052d2f0759eb54cbbdbb7341115422b761248eea14132812af46caf167d3a0611759034824e3d17242403ca66d9beb5e7095308e03ab8cb927f16fd70cae104e597554b65ea06068177285287559ea80daf66c99cfa149afb4cd6a5488a526a1bd00a0e87128c8bdd120a2c4ee7caeb51e05c989b0c88853c567252feb800c00556aa57617e59db4fa6c4823c1e265a75ec898fde09a5009c0b05315cdbc85a5cd2778a610dc0c69fb6b74c10fdc606b9c8d14a4005fb90d5da83ba4779d95f225f8d7159d40e60ba44a5f662998f0cf611a0558b10d209f43d1905306af0a2ccadaf6d475dadb253cee60f42b06540447724e5ea0232a9d40c184dcb485f82377a450f9e191d1593dd638c116d720ea4c4988766b73e096941e643fabce970c354b3981f399d60f55f888997eabde3e6faf86cf89319b5565c611cf05a7341014bb90c1520cf173539ae368cd922b71168d24a5fd4b84cf6115149db78df78d676506ee7eaf932361a7dfa85cb4af534cff2a510409941a1e56f741fcb10882b6965818d01e5411f93a767f24a2dee7403679de8ab91fcd98cfeb63386707f410810d95d853d993ffe3ee6a2cf1e4e8c32b440a637ac993a6048aede66454768e2681812fcf4d4045a4b0b6f6f1b07a2964d36b95ec808ca6d9410946a445029ef4545b4f4c969341d2327a701f6ff6a85f0c1a8738c1691b8697beb2ccbdb9940c76bb974156925ac4ece4850fc0d7d67721fc0813392cf42b09d73c78d4e43ff9331aa3a3695901a523d404dd934d9ec5c2b6af5ee16a7823285e94447b392c4e2d6c7983fc5069a66859d75e0afbbc4eab3d75eb70302fd89eef00749ff2c5468f23bd697e63fe126dea33cfa1ee51f2c5e568bb34559d71095630320a7c09d1b945011cbacc6622889aa08cda709d687f0f8cac908368801cc02e4827535e5cab5dcbf2c77c01393644e3a066b8c00d82788dc54d8f0cd441afcd2099e871b1de797b8f8b6aad7d70537c880afd6880c6930b190d907137c920e3d79406edbc75554cc04d5431cc7a7dc179666095990c23c164e61328ec33aefd85fa0d49f3c8bcc19adab3d18cf59092f5370bf59313f9d626a5e51880b4a1bd291b4544c0e5b44712f6c250d0111190665ec85c3dcaaa789e12292a4098602c711c823c6af0bc5ccbbb090655d7d19c115c7090c70410505d3397f8382123cbc5faef6442d32e505fcd198cfe987abea8084b938237d35e9fe0daf7ec6e68b5222aa03be95fbe3985ea7de6410b51ef02df74825b6e2301449d15e1b419b2ed8944ec2d85116f2b3f52df35537dbf7ff2dc9bf6a4c25b53c9acae666e30cf75bc885da203bd881da42cae2f01c6d541d34766591e0fd4418ef90c14fe7763c6adfa7034684433624b65f9b28829963ee7d95e0c9acde93fc51c77e282893a3367193155bb1780cce42b0ce19acff3d00fba4816caaeda5287e9ea44b43e3b323ddf63e91b125053c17569e79a2e898cf2fb3c570a77944b9e6ffc4c2641daf6f3947ff210e7710a7bdfb86d8d14b534200155ae695cdbd19f421ca199e3cc361c771ceba3e0fa38d4320fb6603a3671a85297e7871eaca8e3766921565046f194b44aae06ce63b67287f6cc870f40e16ae765c3eac5cbb412440b8125b9c85800a457630e85d40a123dabdab88d84ea07a76ba6a1f62508a7ffcdf5253bbca5c343f3819a5e74563712f38003b216429e38deb4906184efbc6d4278b13acfe9c0629b1fb71bf791d5d9c4eec75bf9bec287390a7e0d69aa5d12a1c4ab230a64182e80468cb60420569e752c45e518a697d5c5a15a87865da4ee7c474eb3313947b3296ba6eae8bfc448afba57f307a40a7fa3bdf583316efce249249ff8f44840050837bc2cf785a7e40da4c28eef3090a7db3af09a2e0bdec8935e54bc5a4a26d2ee05ce229f059771b31fde6efbe9983ff4495af72f5e40729cbcb8636cbd1b6ad23c8683e0ac2832b1870602090fc1deae5854062d2fe92c8e34090e5bfdc3772381cb7b6a92ce12b30bcbf79a6a07915e75fac410c7e8258ba7c76878a769917021c34c862d3a4f7cb0fc4750a5e33eb3a8d66029511b1a439f6848ef268201a94a0daefa6704c7202e82eee46da06ca88f314b7ad1af5c6a6932b3ba02eea380dad8b0ba13f1baed3eddac12174e16e93ccdaff3af4b06e627b5a01c8f0533111167c5c5868e9a40d5c3c53e7d6407faa9e0e71a0863f3d4db4b5fb0201459f2c364525cfb6c877692aa473613067f0083129a3179b0f5941c1d7a39069dc49ebb8b4200e77e85e8e5a13da3051c9b09add813392cb2b5541685ae2cf6cff7fa52f3755c4add95f8d59f806d5a961563eba8a41626fa384df7c457ccbc87fd0bab76f4675a648ecf160aa0c02039b09f8f1e5bc05301d5a060b08e2453eab47ff09b88a74039d0f120813db66e2870ba2320a4c09b95c63861a4efdfab9450a895d9ee973af47e841f2c41f15b850519905fb9d1730c9868d9a79303a3f95c357ad48c43c0dee5a4ce277719ff48ea967579f211541c937c5bfd2deaef196134183168175d99c6dc341a880ac66726741a4b7740f7e40735a682c5528519010399222c450f25591848a91194138f5696d3235d2a133dee0dbfc98597de4cad7da24e880c14c517d73944ef80853ed6a4f1bbaa30bae398c851ac499d8e04c27a15a3b8331ec494b8d7da03492a9f7213e08ada55983d5c0a455264b04b1c27014882f0c80fc45619867d6e9a17a495f3807e6a9c6c83f1dd0369ddbff318ea2e25b725d35a309b249ac381e82901f014a4e18256b676e21ca602628a3fbb207dfd5c8b7f81c8d8c5a798aad3c6be6408c4e62ffb1fc7732f64c9bd8283c16406e9e1a3f19636b84929e53603ad2d1323f6bcb3988eae0b1bf1f104a85203da7a94925b1ec078fb7738cea110aa39dabf0585536580cf53a6f050d2fedda4d868b88613188696fa1f1b80d32dc161da3f56c7860bf3be37cdd117da1677d677b17665d144063619e07d88ccf11f9a9c96d83a2b684d003a42422cc9805f440f3bdf61eee9c5645c35385e07b49d06a847ba6209d7136efab29b38caa3ed7620912e9d3a413555e8c00b9c41203957ec5a65de259812a8fbbf1c39a98caf1c8a42e9e9f1272ecc3b9e0a3e89733214fd8fd9dbf61c3951109466ab08d64484af059ef0ea342eccf703a044cb8216a41257f5d98d35a753688445058216e6e96ed0df497b6546150c300952c236fe8264a7ec8103459c2e8e9c227227e942be7a511cc363b1df85e2df318074c20b92a661d1ea5c83027854c11a91677525686c9ee961db91d082867c8b74ab654cc82123b30fd2fdd347e20af0730add21dc01c8597b0be2efc0813c2ea6001f4f160b725441687b87c851cd57b120d79923c7f61e90187ad57257e540c32d6766075cc7a336c62b339ecae83c84265e35723b7b90dbce0f1758bdf48d4d244686fa516625ade27f52d08f306f607438543660eca54c83e908a5359818004273aa821cf799431ba5e04bdb10f74050c564f47470acdeeb730440c1c6d55cfab8b9fc829f750dce89a45378aca6de6cd806755afbfed705d5cd9ee22f89de096eb354540539163863ed7bd1b407da221a19aa626064d5304dc794bd74341246ee61c2c8a6270ccac16388f0b208011a32f4421ebc71d4984208552e6301626c608d1d0505e37d83bd2a96a6ee599af870d70b9a60040894265320b96fcdb8a50986794f5e38ccae6b698241eabe96382876bd464d5e7151aaa860c025e6fbc276d0599a76a90fe22558b821a048646fa4441fa4dca42d9e464e4cf052e78320b7d5419cbbebcbf4a36c5782f13ea7c9d049bba7a4d80d01e88327b386b02cb5e9323040cf0a7afe22380aec1e75ec8b58436449975aefcbf13d3a41b8868528c9e72b3d09001fa81499cca5d196753b5a62da92850a856515568e72dc51ec0c2e85ff449069080d7d8fde1ee5f2bd3433e06412bd405537b5b130ef19cca1c315d14f02be2430102cfa48fb8e27a8a87b0fa2f37866e9f23d50445944a69c6ef9a8b2ee6ad8cadd570a35c3246dd5fbad61778a4ad40652279ceaf04e3ee42f42956c6bf36cde4f42ebfab1fde5dd4ce6f1b68278c31c288c31386c1bd03583d443cb17c87d75e7d69b456ccaf94bcc08f8194b53ce34b2634d80fc73c9c861e1bcdb3e8303c86f09bfb970c2dfea3a935e8495bb8d4edae38540bf73468ab587bbd05d1ddfac242de1ac4289d2a18a5f97eb3af590bef2ac5ac49d68102bef87219c2e50402ed982c73a6251f519ce44d06495424c9ac4f916e49f8707b947e11e4f0a3d1550b087bb7c403303b5309a7ceba8a31f6da7e4d35a57db8e1253f5348c293e460cd4f4988b7ce322c017df6c1df4172b060ab25b23bc50133b4a128494450683d42a501df22f1e730fa471f4a43a4c3bc843c6da8a7536b166b033310d39c50d8cd02f90ba07d0e64f1db07b570ad173932b55715b83bc87bfd575e83d6b5532c6aec9b690f76b6279303b8ddb42ba5f171d8f3faff327fe1937f576abff0c761f52c8be4e8e0e5b005f275c602b8eee3bbd4657a5281c937a5b50ee101417c4417c3028828f719a3e0cb7b0927b194141b5ca47ca94dc19294b8e0f55df10593404df0fea103ec86a86cd6c18414d0df4dab9410903e14b56556d3f829235eb93c83fdd3dbbdd01667fa698d1c695d6c51eab4080d8d9b14750d9c1f0a54a12545903eba04c1257703272aa5f372987f2164849503c84b0425685f1b19a6d4fe85163e2e20880d4378363f2afdcab7fedbac58eaeb9a1f81424c663185433f00d05b3b7f107a63dc1348c4fa2e65c241d110d83ea3d01a139fad1f9224ab480f141b32b5f637ba224181f8d5a83cab6b19df7b12a6ee423eb0ab6dc0a0af8601a4edc5d791c1f0b48ef0639373aa3832acf7cdda3696a9db73f6282a82c5464a5f91fc0e8ec304f28e0a21fe483443efdc78362f1262dcbb229f7cfe597e4711d444a02aab7896156508e58cf01c2c08ad80ba7c05116cec30e6e42ba3091a2e096156155f844f536ad1dcbabbaa4383dc2c8e911ff1e7308e278e690e3d9675c02ce0ac54cad6b3a099461501109b834417531e60d9244a694524a524a191d060c06e3051a8c5a3821a96afaf24943472ae3842ee96b4d8974591b0e87d8379ca08aa45e89a6f77d1f454e11fd93e1dfe8d2e8aa947a71a3f236a2647448a188025b13a61e4d3d4ffdbb82024d6c36302dcd0b536b4896111aa6aa56d8d1e448c9c8145d282ab22bf2c5b8c9d014c563b7a49b2ac04793c998cff1d164538da39034f53cf5af8a9c3d3efa7487f5f1479feeaa52112d970d0a133968567ba947d57e8a4cdb6973026d4096a4796b4c174e412c372a25a97f53ef0e53a510d4a324400016d65d870c33cee8d2d0b227101e682cf562e48158e045180dd1d305ac0e685d2c3a8c81105bfb8180e4b00287a54ead0d860278dca0e4be3ac85c40a7408e40d08e8e8c8aa0090079d2e952f9f5d7755dd760d418dd5fd7750d4661fe51e5988b62080d27c2540cd1399de5659b991207230f4018c827a74d86f9d466a681b1942ba920669cdb4706154b24d2824a689595b4d040161485464cb2b0428bcec84c0ce709888c830e47c70b4618ac5658a0a911422c86c5a8e314110403ea68ea02d805059835652589c12159c65af08c3b8e5de879712bba2a5aea8d33066977c846d916538e0f87102f8ae2b4d80ccbb28967e755d702548512d0147800c3416aba6a7ba661457019e084105106c7610808f82e8bea4e1cff09704521816207e4978fd51d1551e9b5f333fb33d807c09eea9624a25cc4357dade8adf7de9bab85bf5e793fefac33c66daff2c51e903edbc859e4a3ca35135ffda8720d0d448b753ea1c2aab9a91d7d7dad2889f278fac502b2bd9b24969b0f2f0f3eba244a33e2f9e2e0ea7a92ae2bba8a90a85a6bbe811cb2aa6af2e8e967df02e0a34f757bbf7ff4c94e890025c03251b6410f0d2e6fcc0b9d5af1ec4083cb54135c09ead113f8d002b82892bf1ab8400928d63ad33857aaee88647a2fbed63a430755754a6e403d5810f8272327c221cace5f3dcf5f3d57f9479728361cc5e6a757603ff79f73ce04f8a8b2e9f23b3eaabc9212913508a46c883a6b2b9c21e282806f478f2e0b228e94e62eb0f07098898379d13250c6a1f89c427e824a389708730fc4204c79289f2d7e187c54f904f1f3795ae1c82086a808860ed0d051966bf6b16fb9303056b31c91c226d542eb16e86c39511ddf7ca6461840e9a43280ad2b12425a19728a36402db3aa9c69953a1ffbd675810ef8a8d2298493dd3f7131a0662b2ff450a4407d7138b2608fcc8e9f5da075772fde7696d29a9c207c747914faed4797c79d222d17e061889121940337a385d2c52c8b317ea8485c687a9232fa27ef4f7d9af5d327a9a01ffca94ff15cd573a49f5523f0b774f66ceed9a7fec529160ef1afdf4a5211a6e8ab7280dfb5064d662c055a144e8af5579a2a2d2ce38e86b592956fb9faab2ef2a743a4c6dbe9678f57bcb519064d69b0f991aa0cd053d10143de50565b559e722dc4950a9c8e66a038de75d5a521ebea93cf99aaa17fe2eea010bd877c789706b0c1de4b2d6d2290502574829454796e3ffb9f9b1cd0a1998143024947436b0998d81b3b83217b56959cbcc79b9f3d5626877ece563fe76c0167ae83a10b681e32a494e4ac33c6caaa26de808f2a9bdafec6479d8eceecc2044fb899bb9aa6124a55167e6830ab5e5260cc5af0bc6aaf9fd3c7bef5cb0f0b4419aa508a6c4c1f3c22254c844ca9263871c94821a6f5288f412dc618a3b9e6e38fb16f31c65867ad895e72ee47bd8f7d8b31c638e3d57581c7b5bff1d1e511ec9fb8acdc46751eca38e38cdfe58910f828c58a22d98f2e4fc87c8e8f2e4f18c30ef0e616e20dc5db1d73cbc47ae2c154bf9211c6d6c665c7b78a27f4bae7b2e1040d0d2a64709948fad8b7521f634ce2c2a8eaa52ac4998912acfdaab3ce1a44c718e3eccb3973edb0463c1ffb16633cb2e4c08f2ab7748affc4c56c3eb4006ec6dc5d27a009d0eb5015b63f638d57bed714b419b8302e30c8bdabb63887485037c03973cdb5cf396b1464dff293f6bf2ef72af0ca4d7d8b414232b8c009b6f0778c0f39c2315c45502ff4afcbd155a469414dd7acbc89bfe5872b7c00bcb3ce3a13c57cec3127e2f0b16fbd701de28c31f6fcfd28d3516d434f57dea522a362bf62ecd3105cf73551fb56e50095e05108a49f7b97f3b5af3d6e5dfcd1a01ae56afde1ebf56badb50e795561fa5317983faae47af14fdc34254bc0174111d657e85f097e299477b82a7c87420d8650450c84df5566237d85fe95e09fead60d15f5f7de7befad85c257f8d4449268d1482a08108109a99f1001e190c4ca3861047f74d961ef9f4c0840b2ffdafeaba0da75b03e9f75db79b3e9e37befbdd98ec271ae7bce28c7fccad8f7ca8abf3ddec1ddbbeeba7730d3bbefbdcf7ed87d5de07ba5a6572f76f5aed007854da1dcb33f0c572bab0cc128ac963e5c3970572407d79ef569efbd37b36773efbaeb2e02971c95acbda1a595e2c612e8e8d78213b6d441cd3148aead640f7bc866b23afebd3d6ffbf65e15a6ec157315a9d039c8045598fa34a3550d27322289a08d45f4f7f65ce86fdf62f87bef13776d52355c8410a154b2434686aa105b090d27289d301088fc7533ab6aa59db3bf0a6a1110ccee395b117b5191463f79910a4c8e3aee193319e70c7c5b56115e56a3f32ad55c3377953caafb5239a9d4a89eef504eeab5ae62563557a6133b7fcf94eced81ea065bd85445d0ffa7ba5411f49f700e3ed47315413f66914ac69f3fba34f2f04f5cdf26c160017503e5e5b24c2e9186b6ca82660c0a23caa2b3fa7d5499a5954556d36ebdf56edb03ba9570b3ced885f051a6b6187959a7b7d2502845bdbc1115c3befe1a56f6d775a51906a3caea0ac959136635b6cfb2c61963cc3db0502c40014d5454cb3126930955c502d20a0b891fb023a70f97cb51de574f13849ab2810c95231633b532a6ce410c4b7b2c56a45043da80bdc2f8850ddcc6a09a3338c4358d31c618639c33c6ae0bfc8adbd80d0b83ac59e70ec2dba48ec15a6c5d71c61983b5ac2b589557defa6e4492f10d6b0c6d8c69c2555130dcc4f060c55223369475d6b92d0381c08f32b509a9780363130064d5662c9343127aa3e1e6c3a1127d21a6400075d8eb60c564e19ebf37b49c73ce6f586cdffb89cc59b725f70fee87f5f9f6c64799dcb6369c98367a071fe31e86e3eaacb5d66075ca30978f31c638673037160c66014ab0b2ed6341c555da0aac1e993c117b3f59329ed896ca3e78802026e2c5880c039133add16ab96d2d7d50b82d35352d316f5c18d7daf43cb0210ddd90c0697e48d138a43830a04c9b80648d379b310c3e284a1f72561d792a5459682d4aa8a570bbb041e788d403936109f1e0c94e0c2f036f1ec4725ca49a70e472bef6badedaedece7db7aefbde39eae8f498eb811e2fa98e2a6beaa7efb51a638641b73870249250689a2d8cf4d041266613c1be430e8d891987b010ae32026b322823d18463560c0c83b5b02f9a947794adc7a002c30080d99187a4389d1e3d028103d6629284f0e2ba4b2ce3a47f50ea2b3d69a98cc3a67b5f794e0c1dae1b19952828911b33e86f071ddc7186350e3acc6c571ae064609c619073b7a36449b3e92a6bffa1120f18f26893f1b5e16c2d4a3a9e7a97f952c9070c36b021361c7c602899d0c40d7809fab98115d68cca627ce52703eec24638339f77308671a61bf7a8e3f9a641e3b11dba7bab6daa3b0706aecaf410dde292c96d7bf12de9583e0d20ba9127c83c1a0501549fdd48aa90fff24b8b31c13c37aebada97ed69962f122459a9a595ec9c90b55e37af819e4671a18c099f194480be24b2e1399c9cd6a557edd413925a158feda3f9a64ea7523514eceac4a498537830421b28ada5c248996167062e8edadc4e89015e75029a632bbae1d172b764720a99c08d2beb8aab05ed2b2d41722559b94b32982a378a7462cf47442c4d461e8552e13e252a09e3d2eb8f43cbc485641e50e19a8d64b3fe396aacc03886aeeaf00f828928ac932c43dd569577f5dd71ff4c260c6e8d25f3de67edd7e5d57d49f08d7750509cae048e142845e9806e246f8fab4991bbc7a101f544552ffe0a34a34b57fe25fa686b666e811b78a35fa89ca29adb0f0883038d9d460886a2c1f462c6bde3cbc982da5f0d0c6a12969022723a9e7a97f533f447f698c13e10ff9a94779ea5f5fca62acccbbaa3d8ba37008b073a9ea09900b861f25ad14b929275786b9310026eac96384a5a2469ae4c039474da9e59c73c6313ae3ec2ae59cf3d40b9f57856970fd9241e28dc5531b916d0aae454ee9b96d69c9231171ce2546658f0c270c570efc5a43a64cdbe90088a86887ca04066cc3a5171d3a1d0c2d575e18f42b0743a71464d15239896ec45a8c129a083c17751ae9a20650a5d1c0979587343aa2219fdee57c4bab1f4c72755caf76c85c709651707b2bc403b538a5c3b5747921146383b7ae20a833af04ccf8bea02142cfdc6d79ebaa18359bbbde03fc72ff4af06a99c37857febabc7593561110dc577e6593559e425c45388ad286fca6c1e085665083a030e8a3e14454e3a08022d4ae186d6589ccf60a6a948c4a2caa289aec394750203a391cf318e73ebef111d2cf39e885c128df34ae18796482b3190b7149d34a45ced97d812e6e6a32ad5a1ff4c3cdfad2ae37a0c546b06c885b3582571833e2ef98d20faa950094c05d1215f802f1851d15e7827fd858b0eac6627e4aae9a4a306e0916d27d4b9a75621cb84fe734c4dc7be73b4f1ffb414bb37b862f73ddf7eb025f9d96eeb453e72bfbd0de15faa050c7c975ceae7f5de0bb83dc4f309882ce7148b4c1afc391e18491e32a8256c8bee8e3a1b9ea853e98e3cc3c29b86ba6a20b8474a7b8ae33751d39c435028dfb6b756b230700cefa320727050e6a6ce636655c676e4ceac391615ebbaf8308fbaab50d96bb5da10f0a8d5d5d67940550a39e637ef3e4fbb8e1feecbdf7eebaebbefbdefbc7c5de15faa07043533bedbd6d6080ebcd4f16f2b0fb50bd2bf441e10d13ab75a47be3105711d4094705abb3534d17ea3d850d4249b3e3de7befadb350007799ed1f2c584537cf303d9a3860981d256c36688e2e4b4ff117f3c3c1b282d31a37ea627c5f3c146a9a481d111c28c820a398371466ea7466d49c565a6abae66c281485d460347415812f8518a60ad30d8d9a93ca914683517d413eca74b314c1c71de60cc29d3e7879e4dca2609a028833ed551eaeb50dfaa07702c1c6aa64b5ae70e9578fdb908f32dd880d370ae7fad7b218caa06bad65387d326c0ab2e89066e4c4cc55b5dd75101faacc0e92da114bf3a14ab2c8e9e06c4e1ec457248b17577b57e8834219427b75abc939e371f0ad7b06be47add7b716a31c73b6963c22e79c33d8c70a7cdb8ab86a436d53d35823975400db9022eaf45aa88c5656f0dc52b21af382180c2956e4e272d4f81615662a73025b7825eebafad7be736bf9c1cf5a6b4de78b10b7b238f94c035d3d2284658819fa03cff8008c7be4b500b73a806f7315413f325577bd2bf441210da687bbd41cae7f5de09be7d4bbfbb916bcf3ad37bcd00785479d73ce39ef3e87c47f7e069343caa7b77bc40d229fde6f48b3c077efd8ce05ed8ee7f4ed703a23bbe63cb761ef639f4bf1d02ef0b53bb363eb18580ba1f50269459632e3678f5b181e565c99f96932ae18e2bdedf25dddd65878bae3921a45bdbeb12be64fccb496b4a6719d73c98ca2d67a383261d89bf69eea70b983c738cf75cc5e52d77475935c57ce6ec99e1a31a66d6a7bb27aebad73ce39e70ef8f0cc76aee2e283fbc1d5b0705dad994c8f7bfab860b85b1d9b4cceecb8629fcaa0e3901c0cc54d16da423158ee476b5891192ca54605be6fd86d43c953cd295322d79441fc4c33283a7632aaf2007c9489a64645f1be964d914ac8d517e27255c84d72ea5ee2df1ef394bff7de5b0250154ae02ef07d3f8a6c01038849b89cd7394fc8507001c74321eb872b87c2d611899c61d16a518bdc4ddae814e59853d07aae4e44c71a0a58cc5504e5245dc50cc3bcf9af828aa283f5e536aae9db2c0a6240e5c95861d41281726cbd9c5feb0ce8d698990e0a201ea29bccd11d0cb8d65a7b3533c8af42effa5a6badb57681c930a3f6adce5a2fb976e252e1fa7581af5731ff2a64adf5bafb1a43476bad99d85d9b5f6bcf5badb3d739e7dc656441824e5e6f0f541e089db6928cdabf5e5378515c45502face064faa0e7e0d238386b54c8b0599771e76e1daab263261c949753b83a6efd6ca7aba41f93d1ed834213a90ac9763854b5782b33c34aabb9072f79e9082b065594b168808f320905fd6ef40f59c2e7e5aceff5125e09fea9a5fd55c82cee7ccfb34ca4cfada3bf42ff4af04a36ac6333897d732c1fd73d6bdeba4f479edc7b0b871a08359860d43deb04fed466ce54db48780597c00a1f1e0a35182e9b2f68c85445c9ccb8c082fa90a144b878a006c6f2a9b777422b262f4f2b1a93a21072c644c6994439165d1318a3fb22593c7d28b9bb6b10ce39f740ceb7ea561114b7986377bd19e6d6b792f1b43cfba2f85993e51d244877018d04531c9d0a3bddd4e1e38d8f814252c25aac6e3610c1f226ab69310e792b9c1df306d19c93b1c4e415632c74ba19bdeabe2ef0352baece8fb16f31c6416197faabc09d4dec5b17b8012e2b961931ce3aebbce28c31cafd70a3c8b53af87aef1de9db9bbdf161ad3aad05e35bb59ab98408ba9faa32aba48d52573ef8f15a436d73734320824d5a295d2dd92aea4ce3c7754f5da8755c36e7b35f2f61f9f62c95170cc2e5f7e56f890b23afc03186c69216565272cb989bb67804d0a3826b28850611451ea6cede490304d3bf16b7c8d25abb265942beb56577ef47ac5b44f58e86004db0ea78168b9c81125a221f72cff9afed1f5e562cebdb2dff5945ba3ce4ce967575a83fabc89247e7ec56899b034ce89725b677ce5908e65c45d0bffd4696510f1143fe5aed5b9f5167fbe6aec9d70f677f15b818131f407b97ed644455046d291ac97e3c999070a8c1d08f8c988475f1ad935e412ef0d52c580ed6c8b169a278cd58e52c98af3fbee6d11bd4c8f6809e846694e8e1c884b29db2a0b2112665d86bed71d6d4d7be25e308311123ae5a6bad87c38d1093b0176d5509275ecf7d524435dcc882c8b031ef625345d03993aebcfe26a5648c6fce5b235411d448c964cb89fb3c0d471a2c262e8c6845132e67988bc98b23178b899633193595c1cbc66bc79530f5bb735db727ad70599dd5debb5bcc46ccb3d90e3c324f5374759314ce64d2ceafc544455175f7e611100e278c3cd94c60cb5cd7cd20697c5fa09bd60280e44c84175d18243ff440287b9319721e90fd4498bb019a7541785bf908ab7b6006a353e02b865c4550be44ea7480257d34356b5c183f1e4d4e301c61c68e26152f1b6346b72988c3cfecc8d15443d33abb369a56647ccc1fd35d0616f87a31bd9aedf385048659dd564c579329434256975c2101730e199d381a48ce8a342d24683f4826960c5f60245f6778199cc44ce26c7141a6b8cbdd77c47ddfd77d5df7d500588b79391b21aa0b835f85cc76be4684e03127a921f4c6a8e33d3f00be175a56113402f742d1ce17c8315769f6afd205c18d1105e183467115411f705f8c23a047ca3105e88b21b4d1f1bac017afa88aa0c64c82f7f3f1ab908580ab981ba3e641ef9d639e47cc6bc92be619f37ef284f28e1e3a677d8701078ad0473976f0bdd5d0801b98af10551174a585bb2e8a9593456745cfb283922737f90e082aa221123e4fa431beb79a55841f5d93ae8b6373adb99a8a073db77a6059ef2cebb16dbc435a2b302aee56e08e3958494fab3a165a20a9e444158f4ac009bff2ac6befbdb74f6b35123f1ff04d79ae22e84f3f5dfdbd73fede5b4e6deffdf36349e6d45c7eef9e03d50db6effe557b7fdd9caa08aac69fae5bdd4bf42daac87e2b0e47ba1d27c2a822a8cd27eea8542179089293b2a281a1c3e8e27cd033e3ea7ad22bc195e6b181af9d9d1dd2edafd6879e715445d019499cbb45b6a7757273cfc057ee4c8e4d6eceddef8adb078bd2de7bef919ff6229b7bceb9a7edb92bf1dc31e63284ba8ca35b6473d659e79ebdb536f15b812fdc13ae2e73d408e13ded10b121e170d5a83b188dd1e0b5105bf278a828c7fce95445503592e7d35d12e34b681a0773dd73fabac09724af2982ed5d77dd7b44248d289a818243da2c50377fef1d021497bc21b267918a929d7bce392f9bd27c5dbf78e11cb446a615bb27a1c19c60610547c9c3d1d30ceea8c57e02aa1b1ef07367e7dc29811736e2852b70728e2b99b6c54af26dc8f9d89cf7387ccfdf9bcb068544ddfe2ae8ad1abb7745e8a8e7986b1d7d7b375308a06b0e7c85748952158b151a19289a69ed5252b5f93967be41c68ca3598f89a392dcfbeebbaf5438ebbc7713c76fef0a7d50a8d5f102a05dffbac017ebc9b9551906f94a4da983cac3eaaa03ff282573ce23cb179c154c28b9e51017063ef6536b6892a4ba748ab0b47c728edaab0b665e6acb39e7ec8424a4e6449a384bf9d948ae9904a81a865a8e7a66b075b89055144175816f5613cbf9a8f0de56411cbaa72458c5bea521079984a8b44c5c499542003b80048318000000002049b238cee39a92031480072fdc5884a45c6858248d43227120200ca22808c23006c2208061200682310c195a0513aedee090e7bed561a3efe6926fa125530bcd83c7dd3ba762518279e76edb9ee518e63b9339426c5f7385de71f6117d3b3c5566f87df3b4123f0885760cd41a73fd0102906708e796af051900d719a38ec54f95c737a8105ec9d2f9b52216607f0715ffadbd0adf3fc927c3ce451309bc536d78f82a21563f094a3901cda60699a06d7e693b97e6b7aca586b9c75cce4c10ec9cc95c1b3bce25df54e2e9eba0e7e1b365622687f3535bf762aea430496c7ac6cb324e113a68789002286a68f16721df1d239c86b9124e1ebd7258be7d30007608e6cff5a90b2e3b1648c2bde919868370e4b07a1b93f899e56e1f285073660ec49e14039e0079aa0263ca3f13713932ec1293db7c48468f67717a25e5688ba11496e7f8de104452ff1b25ec58b082788e160089b0bffab616f837c8c0190dc7eb16bd25a99e17880d33d2485540c402a7937240a3e06a433eea412a1269743d3bc8d526261621096c128745a38dd908c6d4ee0736a90ca164a7b42d3c683fe2229ba2172ba24001962230843b2f726285310bb04fd3548c7fcb8d896886e12aa61bc2f4d460204c14ef52b79d113c5670bb8915bcb5671c0dd35efd427346c73601da85392569dfa0a82ca4e5dd0e64457ec30a5dc0cd9728b292006f84a691aca548d0248af0724e45ab50084f217e2cd2c38e89012566429ef909f373518bd74f3f4ecec21a4e6a8608b50693654962d55103b85106735e0739b6002e431bbed6062140ab5dc11c29ac521af203015053574ede2d05c496cd5988da385cee1b0dc732f55ca2c0a504022066cb84b56c656e0c9c59f96341bfa1560d481032a19d4a6eb9682eed4f9a7546fc01901dff00a1710c080e76d0f520441cca1f459db0a800a1490cda0ef165732e80fc7c3d798483da09a1b49e1d2b580e83034b6ac73f899d9448c12416a87dbeec4ce61b945122a44f1c05f11db145e1071a79f2614376459053b9437e5bdaa915808b361f4d81c0a17a2489d2b81e2c9600935f394f50e82baa2f6dc50fe9d38c8af93cbf90ee50d6ec70a81e9ea3e7c4e3962d5d3d4fa305183f7ca0f14eceb7160d6c49bad5f930320a8c447814b6ef5593d9e29da46fb36e30caaea4a7c2aa233c5ac72e8f572a702daca9754ec23edb0bb4c256d3a67fcd760a385e0109cbba89d915e3d8b10cbd93e736c3a7a11b13f652284f6bee016e7c2f158298565da58b5fbc7a9a672a256c609bdb94530c8aa46f46501cba9d3647b6cc5e07e306377f5ea26e9165ccc4b21bf756eee39014624fce1b3545e1cc8cc57afa8708e4bb749b37f719a406a8bed994a9f38475d7f6a090982bdd30fdefef0d2c3845f4618c505c49f5c759227a514b1f5c52008412a61f95f0f104ec25e19ba8418a90ecd0a7ff2c06f77393dba29a540a76032397e121cd205243a88fbba1f77f1d0c6dd64f691881199b8160b3e544cd779ac9b5607e0778c5bad619000df067805764366f8686084ac58241c68e1932d35db7f593beed4a89f8e207352b47db97d5b6d2cb5de000187de7d47f506798aa998341b8c923fa950f968686f146370833c52fa37c2deabfc6a90b1f528eeaba0d4dff9c773d443b0c2e5f936016180788e1ae3a052878c6040c7de4dcac714b5100abd3b2a6066f661b2d4e4841cf93ab7a2d7b444038933e9761d7b89dfc9e50bcdd9180aa1c65bfc55153601e126ec4c01d7dfe268ff1e54acb329370d4abd9bc1d822a431b8d1b8c11682f1a5c8abc7e9965c87d274f41066c52a86b35750570a184c3326579251de991e1f7d15a110e46c393bfe822969cbd3a76945e85c7c3d0b39182967047189a070dc7b160bbdba7b6f1334fa9476cb4c682458a94eab31f8cb7ec1126d8c316e24b560580cbb7c040fceacd9239f33e9f128078abbac97cf0ff7b31fe886c5c65d137e07654676e15c1817387ef970cabbe2ac45db806d7deeb0954c8cf42b713e525da595c5499f8e6268a321632638e802d656091f3a06733872fafef8ee996038919c86a03c9b12e015d56d3b5f3df8cd74b398c61069ecd52dc9e01631ba69c6e422537002238ee8a6e4c703ae8e81c8d96b75822f80a811ed64edde116a4d817d23a9b4ab30df2c77033cb8e0c97a7e6b33e0ae37ced61fd8e4d6be4e6846e7117b6c73c7a0b0f5eb73bebb1119b6e9b93da9f8e278695d8e8b921c51fc812c564c382035708b859ada6d22f1d7e2dfbd04925ea826c920873cb33ec5a6854ce2b394d6f022d81857b71fb43aa0405b7d9c45c4ed3de30c682c548b0e9bafd26f3bfaeb7e7c60750b00921ad3004ced912152cd614203dc8b9e51e6a51c1acf2bda3613ca07a76160e67ad5971acb76686e45ae7a999ba911c49496bc51c5f44c0efef8cfe7d43624c8f04475ebf67c4c7aa2da6f2d8e69d9302f674766600474a7ae46de7b6b58d05f05e142c9692a72226977aaf60da58d8aa3a32a67d0c576e8b7dba46268393e79d997d5d43504f387e8785eccdeaef368ceac4b1770925a4517244daedd07a9acb0df07dadaa5fe2a89656347398c84f5630d685e6a679c06edab2629336f8fcb5598ae0335f7cd3969b9fb8621398f0793673892f9bd1fa78cbad367908f6f76b539a0402b1ccdba3282a0880e2e55af7782f8f89fecd31dba257bc1771ece20898e2f6bc9469de3c5ffea3139067f4e7f408b2f29c109d584069f288c1f9d44cdcc56510a2b2069460cf01efd869d43386f417696dcd1786d6d073f93416531fe64694d06b8dfb0d8bab02f313d03e4c047615a4069f6d3b566eeb1e833d27b11198a10b073dc1f1e805a8463b44cc87698fd0e81ed4897079216824628ce5ef890f0bdefc8c4a6e07e3570b3cec79de587dd90901e5e4e61f548210c8ee48d023ae438e4545d0f5e20a2ee57e93da2e25a2bbf18b4e5eec4df371af50271ee0f89408aa318e729212a4360a1210e08317b444429406857b643df361ce7272eec712f0a6b3773612dd4fd7ce34f6ba9af40ab0b2e0c0de46483130d670c2a5a5dcad93388aa90a1a46bcc64543af505989a8e51492587896ba4319719c7f4816f4c944c87b2f00e14eefb52579a0358be22fc562ff6ee134e42fef8a9b467ce20991411707eb334e0a0a141b2232ba70284b5fc7a6a006cceca947b935d3eb36b59d5964fe447c099386f6a28f039ed8edaa682fb3d7459f4893fb9b9325296422eb4e197d062a98bd2bce676aaec5fbf588db79d449af45f69c635a71c3e0460ec4a9e85c5155eef1adafa952b240828111868740c7058aba2af6dd0d2726346a2fc0127a0a8bd5409d427f526a78ffc1b7df270d503cc606410ca015869eb90626814258ccc0da8458d72a8b4c00c5f69042d0ceedc51773d2c98041e3176e1a77d1d1863ee936333b4ed3740694536834ef9083935f184eea5eb4396456bde1355a18dd2d8ec3dd7363420d869554c4cf9e64700b2eea3ed1557766c1751b8c59ac00e2adb945b6a667f2545e50bce620141ba249fb04fb1e640fc62b7fe935f62b12553e0ab25a37faafd313f6d8c4c952b1c1b1ce10db54e924ce20f46be474826e0477af3b82ab8a9b2b1fbe662952b25e27649ebf56fcac611d1c3775f084c4894da0bc3e3378de73df5e85b49ca07d008f107479b0be5cb047b203527f9d142a99be9420d6747c50a4878a2d2f5a0e447047966a212ad8326dc8bce7a66ae352dccf79c68cd72a0dce3b1aa98805c22208ae50aeb487026c97a72709198112718c3c67528610f781620c21c07ce5439c8bf0d5c1297a3bbb7c00762e0e85f1c9535cf8d37f66fdd2ad65d1d20098c41af4f1508d54f3f6717dc6a173ee7fb62804e64ea30e9edc896304ca8e80dd87a2d482536d387882eec09bf6a385faa319ed435c733614273601a2d75cdf9c6bae98ecfb2ccbbb95d3be42a6bc57d8a6da86fae6bcb1abe3f46c6f04bb57d2625b480275de0bba748ccef6097bee50d9690096cb567659d8df02266f4644a1e4d160fd4a4159f4f348e9cff0e58c601c2292dfd929f2d67c9329e7558c97a925eadd239bcc0ad477f7078ccc779165927e46b9e5239258d9782be9d8fee7b4a5c48de7a6216e384a68a14bb5470a8276ef380fd5c96d04619934c2794dc563db2b1f3ac6a48d7a781680b47bc841cd82453d08f3c7e03c9979fe52857b376be9ed27230bfe4e5747cdf1e951123d70a9820b27ce5fa6793e860e69ff9c51219f4a5e337f0ea2f7a0c0d1fd09ef99ccf88813eb447783d7b5dabd88bbf68d0fb78c5cd34e65035e4900c68be48db5e4789a1926c7148309f86efdd74c47fc792972f71d023c0828c9d43a6c4c5cfbd61a9350f10bd591d4ae9079201bb201493d958cdadd4197c5d892528c37b9a0cdee1f2f27da90a4e38a8659124626a439f21c4624a99f92c84b00d5043f81ae5476b9f9a86dca503fe4abe68a5839740fd674ff35d1e1dab7187ad39e365bad63a85e8918fdd0d2e4fd6290acb7f77f5a7d4d6edd102a181da45e0e102c559de6dc38d6af2e35a98dffa17ca6363c6b4e57b6a2d437133818b616e48fe3d1367354808ce712e0b8222b833b4efdd53d00638ff8061d93cb071d0ea7633f0e6792960b173c328341d18af76d92b798f63197d461d9fb3285bdf8b5fc83a7333c3d684af8b3cb1d8d2034383364d8be0c302e9b7ca3026360d1f3cd34cbc0e741c02103c442b0a7a2de066ce3c438cfec9a8de8a1409bf42a90ab919af1d95d0345f7a331ede60a74894df74e80d0ecfd476ec8e9e441827aef39e562ab9f136b1f17b82cc6f74a6c4d55b0fbd5724e5ee08ef37bae3ff0169c60663807935ff889f6dac747cbc3e40af2345f29040f061763211fd9968dc6f24847526f5c0679d69d5483529196f234bafda523ea507e863432530bc99d7a0e268244c7de9f48a439df4d2ba2fde47586412e4103eb0beaf441435bd71e4673060ed8d86701c84d83559ad7d558433e6cb7ad4993d9b1e44800800c3808c6a4a20ddc142a8a2c58c2c5a754062e1e067c53cee7a2908b4a49f9ace663e2ac9c83a3dab6a09a14e944836fd47b0b8f8bbbaa8d9d4a62ca64e638c220035d1b665d332def587d4d9f461624788e86acd2f45ee1b0be39484fa87c31d28192bb1e9319821a4c400d93420994f11e6016f85e30e23e669b1d36de2ed7980191c62c4d61441c58f20e72a9b90433efbd2f81e46e800d8e7aef513b3991a3dd413d3ab664193e81c1e970a66a83cbe381f21b2ab2789d9bcdfe1d377134ff379e7dc2ea0d884d1cf1085fa73033b1e6e4c6da98a3ac61591c53595eadf67fd7422a39d7e5602bfdb44a8157547193e40744af258e748500d95966b7a7973d8361b75a2a7e043dc3b1aa6d6ce58d06bbaf30c679dbae8cc8ebb8a1983d704a0928493b20b5afd835e3c62cb96801b438a6944ff80df519d9ec80589eabd2f8401e4323562d130fd8c4d30da344d6187d458c0c568e3bba31fbe174a05ed4fb9de0f65c4355a0118efcc638574d68c64bc120b3dccbeaf04bf481ee9c53a762590076e42386dd0e64654ff3a8805740fe02a75fcf438444f80c0cfdbbc1e1149233700a43a3b30d7135510565ea622162e247b76a4372efba07b053e15a8adfc862583e8adf6b07ca7a2cff6990c0c7715d69df67b2c8d7fb7f1fbc199cc44d10a138a7cda2f5da28a292b38d76155f1cff41592d352f06d8111b87dab83579afa47fdd6d1cc7a3d1ec44f96fe6bcdc72882054a08e73f92525e0437c8642baba14b7e98a8f67b18a94d6aa30d5339395ac96d946962e3c93ea7a0e163c73ba34e0b0861ce295a5528bf0bf2bdde6f79b267d19545cc02ca86d8895d25283d5501805aa88e13401fcba56b8a7d70279cb6de72faa9d4cec2204e143c27249b33813eaa4ee9e396989f3e012f3a764c9a5428c62dfeca95b4bdd9db0560a499e0b7a3a8e66682f13901c7a30c9221121c41d8d54a9544fb90c2930284f1da4ba45a1a47848c9331df99aeceefd0f252f23284b84550d314b53247a5369ff830c4ad81314b1f1ff418e8dc07064a26c18afcfb29af8481478f9e6a93db7287bf998c6ebc4b2c03b480b8caf7468d0a2395516073a64026ef01175ca4f1c6492094930443e008d170c0c2ed5b52ba2c41a7acf302cc9da75311213a0b42147ad5d912a250b616dd816b8e776f1b5e84d5bda5520d862e0b31b0073eca19edb03ea7ef6bb939e5f19988f902d9ebbd1dc46f04215da49cbc5537ffec1a02f9e8fe52ef5f345d9f9c27b5a703f75b480f81429d61d194917c0aac124bc362c8c2193f851df13fd8b1884c0dd42837af964c6912c946e23ab8763fa5b5174aa50af01b52896c12ce47ca5fe46da385dcd75c6769e9c4169529b301b6bc28feccb4e3664b2966a57ed90144445a342a9930182a5beb3c281e2bbdccd8af3ec4ec8f9002359bb5090b575474915444863b4238d786a586765fd2b5946f466171f0b4a988574a37747840f88606efcb40edb8e47d8504f025f4f50c15346e9797a5aa170b5f15b32a973c0f472970dbaa59b441928747cf2b6a0be37c716aa7461b9a8f956f3e6faa53559fa6f46b0ab40cbf55561bef943299eef8a75fccd0a8ea35254e5620e16b03bc74f97d03861378bf7c70c4a936e2c66ebbeeedd28c4cae49bcde69c191dadfbf0e51298870f0fedb00d43a6cc58663e9c0315e04d02696dc66aeeaca4dee420177f9b9196ba812d01ee46d6d700c837375749bf3121343b77d36dd62f7f2aa8e923503621ecd1c3f9d121e7d33598722a87b3c4313c38b07437f2a1a6a9689dc2dbb50d1c6baa0c87ef4a658084e8bade1fde8922307ec5ad5423b5846180e8fa8aa0350244d0b55befe369906572055bf935d21ac80d2ce1b5837ff35e6672a15c2bfbefff24e60c28b8a07cc169b09d50d60c05c01edcca7cb012499e4f5f28b0865055863eae8b6a7a92c40222cb05a6fed6f480d03f6252bc1bc91abf29085e414f532544d2f17c4d96acb7ab33de8b5018ab5502ec9702780dbb17a64751544acf9db3e7711ebe2b5bc8505e4cba67ef31f114de63d410a26d5a081b08a90567b487cd8662143a03f53a5075631948b1d70d0df14eeb55a25a3e74d99db86f35d16ba80aaf064bf2f185e64f8dde9e98d9e1edacaeec0b78ffee62f0fd7c08748f5c1d169d74deabf8f655fc69b28722e6d4ad0af56d02c161399a089ab09ec190204eabf6efa13b702d6f2c2ae003e634d13ab40660494ed8d7a79400629a220354b282934caaf93a565201cd0a2045d1baf493cd604533b2d4526a1605411f52046b6ef65b39c22845113b956ff827e66da23636dada41e78800d04bb0505191994438c1202d55f828adaf74e9d9bb5841653fcbe7e76204a7cf7d5d26aa12a2565d0951b5e43723fa889f27550ffd221b1c9da2a40869123f924577260e786a493953ad4d3a66c239f1eddcb3b4f92d4d77f6f80185e635eff35eec6fc2cd6b28738dca7a8273d83293dfa6c3e824b890ed4c6e7624c95da7b133f9bf29164ad94be2ef8b85da452e8058cddd30350161518eb43f0090d1353c65c35b64327155dc9b46b7934c64de6e5373f32ec8a66ef9d2dc28e9765cf26404203d9dd3c428ee081e51f73e3f796196c6ccb2a688497df2243f634a4a11ea8e01e25719f67a7593a94d288d43981a867882789bcdc92326826a4f21a6362c9df0a70ed83b93f5bb6211f55faec96e9f3ed1dea90130e76de615be75c28dde25c2e4ffa61844b9f3f6e6c897feac2f1655b3572efa469a0403b974a27d36c1c68174ef6dae91650b2d556590d4d358bd1a913afe71a871286f3a99367b736a15b282ec272dc688877ceff07b12410f5f7a01cec383c313d456ffd9174031adc426e503107de5e61b300dbd12d11d4115282a75e8ed5d7042fb9e21f19aa86b9dee09774e3a722b88687807af08d7c14cfb768529e3a3b55778f3fbc15b9a9a9e9a1ed99abcc11ce0ada558348fd07fdd323ea892924c50d534105030686b5e38ac7c1f827d271c453256b38813af54008367e3485a35156921c9f84cdedfc2eb8ec3a542de5e8d0dcf9c7a816e8ce0b18f0539cb57aff61763864998129e2708815c97e41c5884b081c7cfb9de6880797fff44260fc0aa27cf8779467a609e5e9fa2d4a21ac99bf2a46040c2e7a7227932cad4b767a3d00390626b97e5b3d6bafd3d2363dc6e41026130ec2fefe53327a9dbc23fe443353193692a63e2ea10cf4170939fe1255bb4412f1d839f1605f891a9553114847b8ea9b4b6761f3fcdb9060bc7586169d149fab876de227e3f0a408da4e75e3c460571b5d131083204cfc57686e2f223942256847cfccf0e0e514f4c2d05675e81319b9cab4d992e2108c1e669c081bae9eb92029f79f31218ee46ae6b4286b717b084d8e4c51bda25dca71add8f5e72019e92962673e143f2de6d9f09913cc867e524b2ca65f08dbe618e913d1dd3cf42692f061a9fe0e60525eb0155532353d9e9253efafc5395946459a83b4666753061d8f2e3ff49b9c0ff65d015a27e66e00075be1f08a8797bc7ea42abb67cd01af16311647929a99b930fa108025c170386c9b83dfa911875a0efc7dc1d617a6d94195b0e2c89e7754ed8655638120f78adec48e67e973cb2ab2db3dae776653ca00e54cf8fee54afef0e0c6d3af1503b11c8e6f180d83c96ba9ae90d0cf13cbf640b1da6e826aae174b40994cec94e25869132554bacc6437d5360bb636f80a00c19297ee7269da82e242cf077367276b5539e253c676789eddf897fee74673bad7221d1deb523ee3930e0368ba37b6b700f83c44282c6f9a63a4103be5d0dab85e1ba78c0ee6fcccf42ec01c3dc6c6c5b1c6d87f1ebb69f74f0f30cc3bb7122aa2ece869ef350825d372b35abac63fdd6931ba6b933267beb6f743f65b12ba1240c43351066bc97a8873bfcd540c6414dfb27fd396caea8fc76d243b62746c79c7836007571d31b69958204ccd517ec652a07bfa8ddf24fbedf0101362a8a44d6e4761e2b16cdfaeee1baf84db448cb4ad4b5ff7f92b97c5971b40b5d91469e396816749b7f5610c1f4b75ce569a5d96f515e160e17bb40e76f99bf39727681630e71230f2c8e7df0cdb0a2640f4598431be3987545a94927f863f9b806ab04fa36205c6683df6025cb08d5467bb90220795d0b28a031922109bd6418e3c88e999828ba921a81f18f2b3665288d5515812cbbdcdbef16adaea49c2315088b8dd725cb651ca6efa75624f3959b4a140764ed820a8132bc1ec0ee2d9e2f84a0a5b10af94f51b4752ddaf39cb11a9954ea35a9de712695cf7c3a7cc94a6d262c231b2763ca845879b2f858cb728e65dc05b79289e966372e2c4f4ba27350a8dd56da29438d44f5413193dee90e2c28846175cee9ee643d18a4630edcd496f7b5020273664138a280790b40ed6d74ca84b973ffa8942137d26e85da3f8804bb9008b1725abcb462b16524dea4c8005aaef965d4999a4955f5513e9964f10009b96086b8e0ec18281c226dc82390e124c08ad6ce99b1d45e994bea5d946a6899f9901cddab8de2c6e5eb0e216491d9ef671179341168ac8d118683f2ef4d566b5e8882626f20dd60821bee9d6957e255c23945dff046e4374a17d6a9eda1e5d70047e95307d6e1b087fd1e3da7fb1d9e2dca2705899bfd43ab7a588039c8313cfe619eea11dc5bdad34e3140659bd94551af83ba081ce162355d75e34749ed136a33179d364eb5802ee7c1615c504a914b20279303b7ea355ecdc291412542f113c8067852e3796215bd0f6be3e06ff22d18f5a6245eedf0799d302775a8052d0bf37f618b7fa4836d1989e89b4e5eb72860d0710bfb547a38d296e8e36b18ce6a143fb094abd51cb29d28183ed1ed17edf20bf80635c3160229ac10636de6bac25621a58764193b13f62648782244f5973b5fa11f7655ef90701f8e9adb850720b0111e46e9eba477474ac3deaabfaecedf8e661c801a41a4b96debb21f2e05c4701ce36a2cdb9690ea21a300cc937e3fcc852dfd66a47474f33a03158401e17f460545d10eac9f7726a76d929b78ea6d0de1873fc2c4b02f7ab517a4e0c43ac837ad6359317bc6035633e0a8e865d25a5090b0f3f543ec2115ff9947687c9de7bb9b37a42282fed9212cfe14ba35fa4fb61d21d1f79f09f0f3ad92c5430b2c2d3987b355238254f1c6039b5f95fd12f755b36e9e4840f83b6d62e2936996e072b064f178ddd1d1c1ceb4f42246be7a5a41e76638fad47e6f23c5ce69613a8db36343919ee93a060f18a8f4d0a5c0595a4558a0ca1f92dfc389f9cbef164abce98cd3240ddf04b6fca3b9a1f1b5ecb35a7e4eb6f47573a80e99b158998460cd2d1fdd921f8c9b82b5ba1799ae6e7a65fd9c95deca54b15ac0db8b842f8efa870d2b925e8370be69ce9468668c411e1946638d394f2980873989f81dbe38b465cdf8680e1a16ab6b8747cc6338a200213b2cf501a2723380f7376805f8db23ec6b1e87032202c16e3575e3974a37910f1c049d00204c8eb01a1a9b58d60e0ad8cd8688c7b609095eb9fd4ca690b400b271dbecfb6707f01ce7adf70ccbd0b42815889620b31a4850da60b270ac74edd0dc635ea319c8a6cf02ea391f58efc43acee72d7a40959437aeb5462bf5c3344652a84594d3c1eaa70854cbca8e1af484a303e7ec98cf9d468965d772bca5a201ec2de982a74cc140f52a95450ef10d47f05c686ef0d4909c7dcc4b03d849eb3f14d9eed3d4158866e806ae2475986a48d232017839daa18b40e0624664b3b11099438f2dda9afdddfe87e0e2129a1b2be67f60ef8bc0cd4fd9d21454b3789edf8a4d70eef4b7d26ec1bd19efc6c9b1f451b610590afb42187509e48f87c24923f34052b1ded9f178360927ba94abb7bad546c044d3e3df48270f792da9da02893d552267c147e052aec4237fe2e64b82bbca2e7106081e2a64cc1c4fe2a6e4ceb18301e19ce038a6637f40a8c47c8586e92ba60c04de431150f167479b987eda53e5e4c6235df3ca13447f3c425d1042010bd4b64abcc8a0fac254241260326eded7d41ef90311f7139bfd075ded55aabe9247fadc587f8212ca2ff7a1c4d72cbd5025856cfe6973993edf0ded19eedc22c8ab6f27a3da5f602984eccf37977a7e288eb5042105abf543e4a1331696d1046f89fb855876747406a10a2c58619440edd0d91ae47c2f33039f977f095b0a7e0889c6be489d74e66ebec563b328b344a589179ba26c6f4cf6b422a37e2c496faefebe673deb4d97aedf71e79315f6f0d41a536b12c9aea6bfc3767ef3961149966f4ef8a2b508f97bf855affbb4dff77ee8068dadcce3aca106c90e020ecab6fe203c38e7f1da4461a511e4c3a68b1e10f481c359b7f5f697ed6e1a477e7689c706a21bb5fe98c11c4d7b792418003d0bf5d7412a44ce2ba4cab0f8ddcaa9c5e2c928ef8fcb143caa4605124fa360f396bb87ef50cdec4ecb4370d9d273d1a02c278d44cf05644e374783294f8ac995253ef26c3aff36d5dc56fbcc18dff1d5132e3bcada201336e1b36a144b8aadc3a1bf251938e0ea20006106dadb3ef290aa595747076a0067ff07d3be49b09f9129c0bad076c39fec37bd6cd2db3d9b705252cc0324848d278025116436eaac3d6bb6bb24694cad1bbb212360e4a6adc4c5bddccd9c291d9ce45bd879d800b113fd5600d1d1650742619b1346876107e391236687ff50d1b4336305f0bb227900aa040844e170691e7c10b51e281a9ab5f4582eeda5b8b6bcff810743617bd6188e48fa684cdb511f52f3de656efc7c412989af19fbfd57d8bfa39b04260d12a38d2227acb9ae85167e8d7332fe9ceecc7d73527da9710de547e442613b5cdb37f1ddb1c60e541fb836a11e39e6d82d65da279e4e3c13bce3e50967196ff166dd82a43aee3b20c07250e302c53362ace34bdf18035b1c7a8005e4198d2f5f3629aaf8ff552bb9cbda37aa9025e81455ff5c58e4e52eb968a36a5887948b8009993b0baf43ab7df8b2bb368d5656b742259d9622dc640dd0c3bf682a9974af63f1de5108c2dcb206cf5731e7948430fab6ef9f4084622fcbab38639d8cdaf14b7f3872988f2bd38d3515949a6dfff1095a60c1312bec075cae174dc0e959ab865166d4c03f7a933d4420cfad062f4846c280b3df7ef01ee47b8ca6c09138e19d4a6e79571c7f0c4122d5f78329d7f1af723e538118bace8301991f068b35a35cda2b13c5580bab4a9fb0fda5bbdf582f982cbac97d7588a09da81e2bc0bc768de54fd8f2be268a4457a30713035fa6e27a23c7c40a41b83f63bd801ea444566fdf99dbd748f9a3e628dd90ed9a48416eef1b2e1212e6217af23ed81c290d117f9d2158be2266ba647bd832bc10a38876c7d81962e677399bbe6f9643fb64661144359e818c0416162b3dd216ea570ba3bf9cb5c9ae181163127e64fb41610222dd6b7409d71e60f25c8b492c6161fac57d22adde46d179257169612e9ba60ba20ae78d11143b9f5726b79721fae3c64675f5ffcc1a7522e1313ef584abdb8df579d0e842a3515d31e53a132c0f3332e6bb0ebec69c00833383c4fac7da636fa2a5df38bb8441d10732d9191cb59d6179bb1d4b6c56d74808ad4b78fdd3361c3f5d37054becbaeb537a2840d8f59480aa607d5789dd4bdaec527695e3f456062284b9e7754faa3c1312ec6080af9b9257e42fd2336fdaa6c49cd69bba8728dd9e8812470e6ad6299eba6d7c0644e36ca2cd5c6fc2813568acef19310cd9b4819ffaf6c69a08011b67018ccf3424400421be75200c760b668ebe1e16458311415e1f31c744b9dd22d11b7ec359b819ae2021aa7a3e414bae595f1d7276c1acea30d0c55f17c693ba8c998504af172b722f25cc8012abe2322c852f3f28ab647366ad37186fe6fd487773ac419c7396f1c2ae8bbf3db72ca0d6d08eb1b9c8180e12fe74f49aaca087f70c636900dede0226ba3b9ed0383559920fb01352b8200cc2e2c449822774e742d65ec7f0e9c0e98f9cfcf45008c9e791a3685ee5b275efc2de64fafc246f9f8a5887b40e99b071b6da2176a86f66855d990dfc40b3281e921e39645d68433b7b2e43c121916c5770570a484abf4a4cbd4be6b5ae19259f3712278df93e8ce87fc31ca97ad7d75e2e80484f2e9e7dbed56999cd7f2601190d88ce3f49963e66fa4b5031ba54318e713905d247b283309ce6ae2a80597cd24beaf6e93a7d06a563df3cca83267619c8f6b077853e048b3c0481f0dcbd0590e2dd6ae1f1a4ce51d94eb9f2ad2a8449b7338ea32caba07465c0fd4b877ccfede28836998ad65a06dd33ff03485740ee9badb2bb6a9c584fed892bfbcc1a5f517d029ca2882b3a912806e4d3ef63400c6a2e8b26ea4159c9b2b6f2573d0ce07fba613dee846e5c6f6f10f9e864b0fd9f8f4ac0a33714e9ca83689cc9a6249bb158068fbcc4b25ceebc83242d929659c18bde68a3b2013760436d5a7abb865610082394e700bb213bdca5e0d5d95014aff1e25483033e648021d0b442cbaf736a2489e31d98eb58e57b6d9b4caccfd35dc2bcb0455fc10e6e7186afcb62f6aa2a64d5d9dca5e5dbe92325fcdb4d7f82bbb6c7cb5b83d3d2de4f485cb6e5b9c92f5d6530f159880c3e0498f3a95eb3e03a45d44831bbf9b41fd9d7c4e94a8c0aab8601037376d1211bf1a7d2313172bee7b0242c69787baaae4de6e8ffcea6b87659bd3e59f2be6485113d8eeeecca3d4a4327952127b2fad0a0bc85a3de07251b40b3fd6cff7cf24d58553a2e695f59aee8e08dac71f7fc4b3aae0ea4b88d1ff026858e7cafe76c939031482c7ddbe39c609b7fe42649e63ca59f38b3cf398f457ab2cb5d49d4664745a05fd65ec9f85b1e2d7b7e1e3549ad960e768ea80fe7cc8e2616506ac6a5393a79888aa67a6842e784c2cc2944aa542fd6c13a29aadf49bd393dc8c979ae68fcd1c28ea48d9fa2d475ff30f6485437e820ca350ac252fae0ca8096023e66fddc4f5160ef73189e115c2a993de5c121350248b12a90ad23e0e23c6647c1b76b7909774f82dc9a4b92a9d651a8066c4a73cb5ddaed790c775290be9fcbf6d31dd0baf8bc1b0d54e8e2a0a5826b573cfdc540ed5f606984da15ed9b66c196f390cd6c975078787110e2e989a7f1b1488b5790fe9265805e3128d24e69dfc7414959bfd1ef99aa3152d2f8319ba3f7c2e092ec85de675ae0a0d649838784de38d281c1b23bb5e3a897877af1092f331bbff8bb0500335f69432c77a5671132e927460f5ceab3d8fe4a4ccd22814ca5183ab2417078242aa6265247dc9eecde8141fcfb74f85aa5919b9753c249e27e7e96387f0a6ac8d08fc5532b046e22537c322ff63acac00cc1e79a462f044db3bd2a75eb833c90d84fb0e60a2497d7c452cb3332c2e00468846a2dbd74d85795bd83d19d13a6f93ed588005b4f679fb452f75ad782974b74a12526423ec6653672d97f0363beb54bfa32c86df35393b8637d0fbb8d291791bdcfb8f21b289d757fe8e42257a4aef5e91a3b7165b1bce730911ebdbf6a4877e6431f5d20b934c8df7c9c6efe0d567295139ea2708ca2734598d18cd46bea8eceb3ac0587744c43fdf2a387db8075174958003c5e0fc23bc7ab029964f8b8438fa4155a530fa70607b1d5246dece3adf06e9bd2b3f80ea208a6177c5e750f89706194a63ad4470ad05e907882414d98d06c8b908e2d82661d291e50b71304efa787c6f493e49103b3a3c71f46af032953a52ce311b40e649db378bef730668087e9c2772f2eb175be46eafa001d4ce0f5b077b2c6ab7888afd4c37f15c42c5e31eb80a848824e3df4a4904ee1cf8f473556ed5384adc766936ddf37d2b1b7a22d0c9309021f3ba2cdaeb2ff20eb11e16308562c2323b9e134b503913a1be1b732720fca8e758b914d125bb978315620613d17c33b195d41d3db63e2417abf4bb9eecae708b62efdd0f42fc0251241264c99affd9c0441f5b091a30ecc390aa3177c1771b8cf2642322dcf5b7a96d9656c946890a1957b9fc0141bf4467a58084053a2c8f90c41a0e840c832ca57e01e926d038591cba8c30874bef7208907dfe3a563d6643745e15937a40f0e6c3ca9dcc0b095b771531ea97da5c310d7072975e3900e9d26dc65c44cbebd3aab4ad9a231a4e660bf70f73809c81d144acc0843649123d226aade4afa199492804a0b624043088622f4334420def3a70516869bdb8039a52c55a43c27b50d09c6b8e106c58952c6b788f1c0562a1c631ee80622e2c403b698617a2b8f5b71530d059086f4dc27633ce5a9c2667aa664541885adbaf1bee0c41cbc51da786345e3f52ad00bc4e1ded9561b5a063a59311d038a29e1e78a4be9ba6ccd1536c3e4ad242945cf216e2b8993a184b57580967ea85dea1876f88688145c8f571840d4c01c965801014fc0ac1abcb3f8b5ce96341dad89b0dc9a673522caffd1d6841205cbab24733dc809d1497b2e0a3678356dd411200fd67be27d0ab0f8ee8739bf25fab8e86f1fd6585a3428b734bab2fac37f612d17845f536171d17dbc86427d6c4173ecbf4a31c622c19e34d67f8a55f64c40de275831f208bb091fc5e11ad75b3259af58f78b5d40a5a03c1a56960392670a914e6a2967c04c1c6fc48661d8c52207a7bf86830b6bf615e071b9ba1cb0319ddb33a1b42ffd172176310cf83a74e0459ff0b48338a3c8757970e4e04829a68b5b5d270a5326b0bb1437485637f39ee99dd1e0bc2bd5c4d5e696de5f8e070896c57211cca5598c3dba1cf2bd2e01661cc65d98b225ee473aea0a757d5d0227b0b644bdc0eab41c153a569ae881709c7b128532208b1082454ec6403507de63d6819f2950d411650de42cf94e0d80478f423270011dec33c4e791413b07c2e2af72593b4e84c15096a3f08d1d4e3c2d796cca98dc25f2495cd864e2cde75cd78bd5a72a617aa58b617445a01ed4749d4b9df54a77bd4220a1fa10687442e4526e69b3c5dab6dcf5ba3ed31aa5efd420b2cad7eb510234290f644fe017de33e539e8b74ac85997301df3691dd23279264015656f61160ead427774900060d6fa02a1694a4004c89695a80a260a762014168bdeeca59e0c8deb00e9e50113320fe0033f000a802d5f243451729359188cff8a5880d8f31c8550e12631b52b0403ce37adc5a7842b9810408f4aa975b0d8dd1881099026803cb3013a687556a6c8a4a7ec097e8a55060a82fe9e02b1724a0cb10e060fbc004fd249aa2009f4b019fededad445574203141c5443a50469e16fe85d83270031ca36253a6bfde2041d6ef4fd4d28efd9d025de70375c4ba785d3c4b678109fb76154686cecf0378adf7662e87a7b3cd76035c275c170b66fc4ebf280265423b412a978424a62570c8e3ae43407f730c17412872e965e076191af0db33406fd1120f020a4eed0c42a94e8ce99d94df62cbe3458090f997f4ef84cb94d05874f1175d286cc0b986226d641b2849da1b161c30f29d24436ad3199f80bebcb1ddc0dc6b21f572ae96a5ed8e3451154c23234bda0eb4fa1cee250837ffe6bea4b08a33109be5239753545d285013c6cba3a32e9d82d10520f3a92741fc71c7a164ea4982eb5bc16b677209508f0277730491cf7d62a3b5fadbd551e9ecc6cb719bf0e6be6f238ef60fd912d2b7ff2eb43843efe04b334409625adf490269bdff1093531a616800a1a7846d342515e9d613a58a10bb315bd3bea32fae6ce7d2cd8ccee2584d119591ed0872d938855bbf392a5a7c032426afc1cbadba5cb5a849bde9751af2eadfc7aa36c4629d19ef299caa362a4a09037334c3f8f5b04b3ced8b38da1148ba56653323b93843bef90ee3fc767ebe24ba07bce58b25513efe95d8d0229b1268f3bc8aee462f674e4547a3f6715ebfc45cf1b3650d00fdcb6eabd57c28dff929b1da9f5a775112c3b77bbffe550d4fddcefe43ee1e0ed1b2ebe8c3dcaef3441d16823c7abf3a8495748d419bd82a46276017603c8ef62e4a03813c56a201ef2251e430a9f0d0587ffa502f7dbd3310154d5e2eea8a673de4963af1dbda22594e4be1e514d295ef469823291982a28e131409723949e77be5608f2744a5cdfb074f7ee3aea9f25d4161a29edd41fc195899012270ac56d39559b3e6b33548bb07f26460ead59eadc00d97ce125d7f1741d224bffd16f7cbf2b2cc7616efd9a3e759a512e67c1885a9170dfe0ccf71c1ab2f52c871d0017b48c3ac7b3e4b04c5b02c67bd4541157676077ef7c6d209c745f91d456a450e84ed139fa7af36ed5803186af6aad7911dee7ed23d8710bf5d41975de188659657127e292fadbaeb044732026f0053b503c1fa84ebdd480c08da518173668c582568697ebfc4c364cb6001788ea36fea7fb1207a0e9e310cbe7bf74796af5bc0c91bb6580a97211fdb722fe6dd1ee428e50da11b300b7b5e0b408dccf7c8654cd3caa1fe7ecb79ae5560d5a4b5b463cc6a9d8abc60f31131103db68971d440830c3d5e5ca1e85477f1450dba054fc01fa6825525520d218d7014e042c90023f298d0ceae00d18169ce5b10f5b95e8d880e658871d08b878127758087c40440420027044695559555555555535eb6bbdbb9b333796a62fc7c654ff859a5c07a51f4a2332a59452925206cd04170516054cd32e64aa0a6f605e115f7c4c9ba92bb49c0845023729bc101d66047a277e3f5120d05b1c1f30d777aeff3d1e0b79be037a27ff4ac555f26aa80171bb9d5d4964808d9ac8bb4244cfcf70cc05f44e3c1c94450443882802b21ca1809d0bd51242bb1200bbbdeedb3104b1e7c64400b489ca735a1ea0270781f20f38b739551899dfd2825f3e9e2fc6f93240d2b100523702d85c89ec7c5238320ea0d5cb250a364df0dfb92e1cc3be78695265040265f83b17fe3210d893e60aa077e2d9762af4206600e49e2efbfd552801f0eb5ceee55fefc43b8927d8e0fcee8b758e25dbd97d5044886008114b137a27be7725778dd240d8ccecf8fe49e607eee5127a4955129b11bc8d22cdc306bc944edc1cd9d4f1fc2c43a03f51bef667cd4a2d050caf31172a19f893b9f0a7daa177e293ac7a516e24c8f13aff393c9ecbc09ffc030a8dd03bf1dae8f6ae646a9395f7bee189c707e7bb2f4e61d41014112228249a7e3908947f40a6959213de5428221adae4f94db790a5654f98e47c73b831effb0b717878bdc37916693bce83b28860081151aad664d51246bb623908947f40a8eaefbdbb2ab4b0f2501354b7ef56f44e3c54e97439e742a2aa36593d54445ffadabdf7de838cbdcbfb352128c4e6dce81c92ae46fe4e83eb1ab5c9baa177c2776c3bf73365c8f0035af9d87642efef2e1f49a16ad8def53eb8f3c23c19b62b332202cb31ec8b51a82372d20a8fffee86c840f9073cc271223db92ac21bd14343c7d17b7df1086748489d5bb6396f7f678f77de391febdcddf962146db2bebfc54ac584180f1f37353cbfeab73ed0a41f714a2e3c3f5bdbd97bef72ddbfbf8a92e77dd64721ee7078d77b3ff53d8cb274b58a2edc7f8be23d867d711df513f7d2e773103fc28ad7b9106faff2df7fc5adbb5fd9f31ee90a539831bcce75ddee76375a83668b39bdf7418fe3b6320c947fc0e956d39dc348349effcec22a6eda641d61e3d3a8fa70be732752d195852b471625284b7364cd01743e4d09d3764f192a2f9e733414d7c74b9f7e22183ea34d3d5b711b7b993efbe25d62ed8cc3b86733a656cb7c46e40181fd336de5ddae9b0385d777723bed8bd394da64e5df7befbdf7bee9eaf8727b77735b78d6b1e4dc7befbdf79e7b7fc6637398cd39d4745079efbdf7de7bce3953bb6eabe386f74f1c5f3d5986e5398deabdf7409298d7b94c1171671b69feffcfa6e193ed3817d3d0bdfffb5399eee69ceb77df63d8177f79ef9ab99b732cbe3f8a17d35b3b3ae7bc6ce9a578db1793293bf7df7f1f349a39ef3a28022b8488a536f179776edc52a97fe7ba2a5cd777fef79f6f10b50dc78272f1283a0a0ae242ee926f9bdcf1a2c5ce4d74fac385e23b8b4ef0994af43943713e6a57d5af3226f859265d4102321c594663344f31bf25b78782c86655c4bbffb754dd5d9a2f6ed9ae77bdeb7d93fa5916883c3bd7bbdef580524949ae44d68a2e1c223d66fe9b3972c4520ff247ced75b91ebbaaecb39e79c77b7139b38e7dcd9d4f27ddfdd96a9eb72ce3951c9b95befbd6e378a71ce39e7bdf75ec2c9e3bb18bb2cd8fdde17d32cfbe69c73df84ddef591a14df3b114acc9a39c9cce5effe3f655cf2dcef7b09a30e9786c939e7fefbef9ddf4fd15871dee1ecff0faba0c5f438577acdc07c51d5b82dc9b030c3147a61eea063a198f6ece2221e6baa2a2b362cc428df685878a1b601724cb27d9f4183b33cef3d1a0f993229b49d65d66b84e4c6a30608e707d298d077ae032dfe6e4f218edf9ea06b42316bd6f2ff019f4516f33bafcfa2ce3cfc055f382cb687c59a91b95f757f81dc5b4b8184bc70893befbdf71b1e78e7d29d230d254b8a8a8d0b210d51ed12015c46c52baf382222e1eebcf7de63cc68a8891fc0b9169c888b94bdb7d6d96f0aea1debeecebf3fc0dc6592614ca23511500c3a9b73147e0cffb705948e14df24fe724c32345d4391e3813f86ff2b64a666937c4be22fc7243bde4c2c77328b116d259c7820e22fc7244126dc62a2ee871fc3ff55feb0c180790ef19763122027b5e2c8861fc3fffda1ea4122e6efe22fc7243e5e6bac8a4d6fff18fe6ff20cae0ee9eab8448e49b40fb6205b64ffde812b56e2e6faeef12ff1c8e3dce5b7ffe87cc73973f3f017946ff81de5f917b6c2609c6e567eaeb69cf8564a910c15c69b1a2e7c5e38ef12e812f0d0240df34aa573c4bd568a62c2da79918be6e028a125fa753d53a40099022bfaa87296e6ddbc52e50c31db161caa37365c8282486fda1630a03497cd33123a604400f8434180911a8b8a5bc9a91b12812aa618fbe94ad22a769d9441fc6125a72c3face455cb0f6b236d2499f3109e73be32ecf25dd4dd7b770bfdfe525b5aefdf12ef3b5fc07e5b21d60c8a8e46dbb4c64b180428aa66052579a349380cb26d0f958496db2815c5bff8ddd5a7023027a2c376be6acbac6371cea52f6ebc979777beb14aa6cf97a2b9cfebf34505b994bb5f350f92a2f31a75de79dfc193a6b46ddfbc4a53c4e6212cb3519bcc1e6e442794d39db23473f96d59cc9c7303544d602d5929bbb084fcdd2c52749260bfd927d6c9d9a7d6daed8a8d959222eba42842d02b1eb3967f100c9c57e855d59c615ea15749f370c3597e5ea529459439a0a2a25953f17e14bccaabe7bec42e450812efbcf33849bfa8f4a417e2ac9f2e69339fd7a74b59dd6bf6f6dee315654f9ba099a70673df4df84fa2a4de7be79b7d12cdccbb797dbab830db410c33a062d0cc90a172d3a6830ae0a28b2b068da956d793a8cc068ee8697ebd5098d767118c4b4b0a4b333cafcfa28ffd0d30afcf223297a66ed9affd33f0e10fc31f7a18c5782861854c0722898d0c09440f3d5668e269871fc5118c24b8b9709821c6344c6c28565d5046b8aae1c29a2a87a68c06192797b1827910656859fa78a4a8192931d5c0c3f8021b33f020124548b88dccc584109d70dc9b4b8f9826a2e3d28abdf7de63983cc609df68e191e0e9a978d9b1545f2f17b7e58b376df92ecbdd73c61b938433694245210dd5eb6ca1895e22460b8d4bfe8c638169852fd44d64853047ddbac570d6f712446db2fe0d530008faf0877ffc61f8c79ff75e7778026a8387cfa381df4559cdc01552be70c2a8038f0b27488dd650726090a5f0d945554f507a9fa428e353f4882442caa965d03bf1d027e50628941810f7930983133f3c1290d51734d984f8a62f172cdd7a46ce167a277c68d98213c79078a7cb0b7768b000f632f027ff804ed415f44e7c95950a4eb8848cf0535053003d4af3483c28a873a19c27b8a966e070e43141efe4c370504488a0970e49934a3032568485405312f44e3812750437671a36f85445e0564370f3d5f3e55041f081de89779d4c0f5c8968f0c528783ae089941ce89df8de352c1137f0a3d4c07ad304bb7f9761fdfbabc8000f64ac1dd9905231b5b344dd4b663090994e091fb213cf20b6a08810c1102298ac30d03bf14d2817d07c996681207804c95381de89ef436914681e4f8e2370326d023421c229250bbd131f3ec919145c97b8f33a956283a4e51bf4abd60aece6a7063286b02baad66aad0259630272c6a42116c7caeb67e5782aee0c69f5b3c4a6d54a5f1014044608c98dc5edc5c40e1559cb8b68b3ad22018bb206994ccd10d5777fc987dfffba30304313baaa833aa1884e79d128391346a8a5962f15cd8d7406a8d68c159d1a90b7288f0a87528da3b524b36e06acc4976dacbc7eadab48f4de6dd480d58d813179a23fde29b72b8623b824b3aba55de3e85a60cce054fd54a36c2f946ac618b624a2800945c794da271ab2ca19d4b605f36c9f27248fe66658e860536af923b53b9649629268d4a8d567d0144b483f508830929c4031b11d6fc76689a5b0f3dd6e8f0237078d09caaab2aa5a2135f7ded7b117512356d8b88660849def989d57a952dccc9b57a9925915cd52dd4eaba0dfb40a663d12526f5f393b9c3170287896320a085c5e38666cd0f1a0e9592f9223ce5a6c81f1d03a6ba1547016d4bca1335363b2728ba316477a0b06240a31e9b249b516c43fe5b8d0619a71d6349194a2c804ad30cebceecd2b150e8c4d57e642cb536ebcd03675f868b24ae91115c6d6366bb043866dcb8ac454dc17b2d1db11123eb1a8919604d298108682f430aa28a3228addf82858d53bb12b7cfc90232a752175df8ae58440c55eb2d6bd9bd768980adef7decc79efbdb7968add3ea33070b48af3d0f78323a196ac14c4e356dbd4c7c2a62952156d3b2eecb06ad931c5f2c3da3680d798dd41d4f2c3da333a3859d79e0e5ab0f3005b3264d795007a2dd952738719869d59cb3d0aac36e6b564a87b89055618e6098cc1ad3c5ca9e656ee01dcce6b5516d5ccca439e2ed12d70a8e5555e41afbd0eec9221113c506095e7155ab6a703208c50494199d715b8ca1c0330cceb9a02976bb0caba44074498877a5ef514e79c73ceffbc467500019594f40f2e7288b5d018aba8535dbda91b27305920818a782c21837454648aa9a784bae77befbdf7dedbe380aa0963c58822f48442b59471995a406dcae0be84d48062cef7de7befbdf7e6fbcf2b555195c3d80ed801db3bab17b0fb50eef270d7a0b3fcedfeed26e83db7ba97f4efbb1eee99dd5f254db2ffebee3e5b54a61b3c3e50644bf28c0ef54a6be954f4637ceacb0b6c009c77be61f637e5c29854028f1c93201d4972bec98fe1ffca8138e678a0d88713c9b7e488e947e3c403117f392639cae93013753ffc18fe6f9c890b98e7107f3926319af1a16564c38fe1ffb6301961248322c27ef8bf7f69836e39555d327520ea07f8f0fb5f2662093b1c05588d44c53771010227c70397981b6e926fc98fe1ff2e99f8d52c7772fce59804aec4e8c403f163f8bf5f1d64a2ee87f8cb314991c90b98e7f063f8bf4a283610a9231be22fc7246f262c7319783f86ff2b4561e5ef623926d1494a106c8a889c0180f428d2d8dce590627c78f2b4f6f31a65f2695b3647e46d15708378ae01cb5c2a798eac9125b240d026ad2ce7a005b2f20ac7f2c475d4d1f4234bd8ca2c2dc4ccc861ac229183857097b4a04d5813862b759d5768d915f310385c9dc3f56bb8ba01cd4376c8f204e992e13a9d59b92d19ae69332bc32c2b7f568e5939c8ca1660e516581908accc1a599955b2f2da3b613b0f9f39de56f160c9aa491259924a73ef1d0618268b5a4c0b14a23a61df3e719efd3fa5a6c7d80d98175434490ca8a39322c508b964f9ac791ac010bda03042d19143fa8332f71649df709625b5bd9013f329f391e199c1cddbf16299ebb7bcdb7cafeebfa11342320625bd9efed106926c5e2e34521473bc87b9fa6fefbdf7452fddc6016febdb9bd81a8b18d94b5511e0da5c2069cc60a145f7711cbd891dbfa0e4943dc2cec2c67a32d91263528c5b7ff8fd6f0e5c6a8832dec4b8748a704cd114a024aa69e162c19a2e77b21c9368211dd4148e0c59138f8b0e6730a0b9c1c273063613c403b1618645988a8c98a456338359019e6c314154cea49a6fcb5135542deb91822cd229a12d5ba927ae7a6454ab6f3d8a68dc27ef57b5ec930b5c3058365674a7615f0cc740732f2d165754cb8f6ba5088398d728d70e178c0ffe75776e951080e63b6a0230f3a65a0b00d6665886dffab7d67b4b6b4e80a9644a9c5c4c2082917d8a2052b87c70da9028c1d922432205e4c5032cc7b04f2acd440729193524c0720cfba4ae6062a9a6cc085242460ecda9bd413799607c411a9a38c60ccd1799913a1898878b885a3164c64def69f316d1f09c7866764e2f366e9098dfd436e38b5deac686cb31ec937281d94d481c0dfb5c8e4cba18268fbdf7e6db59260781325e206381a6404bd26a9b22eec84298e45882aca2d48c50b827baef775590b9cb6fef5dc5b2c713cc8d182ad6da446e4c976f2d754a653a6408c8819b53e65825c1a08ab45416d01595e1a89b624989c4b8b999b5fc831c8a0ce95a6b97c4b371a1656dd94035819e682136cca8532c715054c729a1e61d7a82e7bb9661301681e150adc062d102ba0c408d0920df982d94479d2b1aafe32fc7244a21502b22ed8f6117c69a322f293a2ebca07a7c630c00b3fa311d63e60411ea4ea7b5f65a6bad53f83dc98df861fdfe3cfc0567989c2da75e00693a169f2b901c68544085eb479b8fafa397ba2d8d22673dafd2273632186cd05482e6de5c4ca981e17c2953cd6dc5623002033a0639d10646a3b508e99752e598ffbc4ac15c6a04f78ef59a77afb5dffc69486f56ee49afccb7de7aff7e3f8ad37bef5d1a5579ca9987bfe00f7977282fcfb5d67bc75d02502f8a583e5ffc44424d2579ae89f69fe0a906069a8d16423f61118883225155b386a57303695d8d26b220472a600d78fa9211e3c6915af38701cde8718a81428aeaab07675d5e74302c544aa8f1dc63ab83c2d75bfd5d9f51cb544a8b399b2c125eb3f79e057352248e28a42c5684bef396ffbf02100a1cb23917432f7488662fbf3366effd5cb54cca6cfaa243e83b9fe3fd80efbc3e73dae6e16f8df763d8f231e284798d6e756d49c39ec4b026e20f6b87fd7436ca46b9ee413fc07c742499c9131a62204d64b8557f6c5ded90c9ec400015ca4a581cb3455916e7a16bcd7a9b69031a3194a294f629d4c8f4c586054c895e088d1062c33c843b89a0cb0201c9fcb05e5e201a171e50b1b8fb01d2d3dfbbbeddb90f8e6c5366d21791f8e395a1e5623932ba344939e7845bb3d8fd15fedbc38b2a0fd6092ba8314a640b08fdb1d592e2e3a86745fa70eefb0e8b891f40564eacd9209376314a6899312606d53425e5481b632f81912e2fbcfb7ae44a70ce77f4bef78661dfe63fada72f41d51536cc76f6eea131ef767a02b11e732bccb89c80746f422bee92dee11e1c3070bc4728edbd37dfbd7995f62ccd433983dac6897194a6a8c5a0dc92fa31e85a183000250d1d1115514d9875de79df7befbdf7deef3c84f79a891e6b4834b31e2d65fba285142c5b294c412e45ed8a0b2e4ec53034a318e45c76622c21ad8b1c53681752dbd973858dd65a6b1a384fc9cf6a4e43caf7de7b2fe247419c7df3cd37d75b6b9f2f1e0b02b6caeb0b2aa85025179dfdbc56c9d5e80010ab34b5a3949b4dab45b6b236a305851a5d960e6a84516db9b0b424b36660a347c60e5792546908324c3e586421b36060b5b0ac9ab93136db7a60ac5585b074385f685ca934b9966a0296c0a8642d1caaca0c8c0e280063190000000018477224c89214ca1514000720ce606488506c585c2288452262481c0a45511c09310c04210c04411c096229d9d9006f708ba316ceb3cd74f3ea5df2674bc7965f7a64cefeaf0aee9f40a631fad306085523783420e88da51e45cd852dea1a4ac94d240b494bbc61c8d204b2b65023d1ad705d8f92353a37593055663e248275378a7ae07ce36a6cc0ce3776632eb84e0e6f8eaae7da267a8bced59abc83152d9da10b598905f3e49d3a2ce20d42d2cab69d5d941cd587f28a02603f3e93215a9afd71e689f28ad82eaa44ea701497aff478b1b71c97b470b962995609734f9753e3e5a0a2dfae483f43a2290a398050063885e41e9d5937d33058e89793ca5f8eed1f839e849ca283d452879b528b62e82659f2c055edcfc8c138a430ee44e988bb570ee28b947eabd8aea6506169eb81a184f113db726b57a9d7714f9ce57849e3eda0cc29ce7ece56041b0d4dce1ed988088c84e3e1aaf5be57e0e49b356db0f4f19bf7a7dde8accd15871a788b612e99246067b0965aed29607994f2da15d9f77bf064d2a1d1b8aa2a946f9089820392bbf01515d398b459b6a369b259ccac3311da44f5d4043d58b7ff3849cd238595769d254cd13b8dcc936dfb3e49c3f9fb88224a665633691ad2df7b5a16438764b147349e3279429463f526bc0079a722ec6e5e50de18a48b3ac971ce297bc1efa5ecaac9fbf29d543acfc7238b448336e1cebc250d6be10c34cb8d494f4bc0abf42aa99d8f033a2641263f4febeec4ab73e48d57fc7cbcca2e547d85b540c49ad8dce2b6aedc2629898e25c559804de40c4e337666121b9b08def65b0f01181eed691b9aebd0ab0f9d86da894b6f09f0ba5679d70eafc6ebd0d3de2e26b52ac04b6a5fd24d83d7c7fbea69a6bcd8f40deb9c369e4d51919eb38fcf9ca8ce28b61e8c470c9e3f0fa0ca7c2ffe31691c781da66429ae26edf6c5b7854854b0ceaa2f5916666420ea14cf462649c9d86fbb4e5509d117fd8abe702dddf7dadc08d849b3687bc0b72c47035cf21a686284afd02cdc62e4b12a0c1e6cdab3f82c22db4f8f791a45dd72d63f23f353731530f437d3b40b12ccac50e12a884d7ba2d05df093e950845e30848e1dfe0512531020b94a52c7a399801af0ed560dd9911e5cdc3d6ae3288ee3d8308479cd7aaadb222812e8548c704d090049f8626401b93b6703644e56d1373cfad0eabcb6de9d65c6f92b79da830437acf3e60cac854a160b7eeebc1c8da52a3d643758b08f478ae62f1cb11c434ccdd763d82d073774bd59fe529a1ada731b05703542238bc0273907f80837a3a26a468de47373b29f3c6ee43c68cca2b3320762c026cb02a8042d5a9dc0264a86a8cf88d613eea434ddeb47077ee733e061b1559f724ba78d4b3be8d584f00d09fc112a44b49e3b970e6cc3508833c9f606b4e424590e4a0fc42cad477c75ce020f7fc03d5388c81f43889fbce9d1d76d815df66911132157698998be238c469ed466ca92b97ee621a44d1f175053da83b8571aea58825f3f3a19259bd1a67a085f47a9f618d05f86b21986d11a2e5e024d169828f66d56be71ce59f516fc4231546a66640c3aa9fe39b986f41d7116314c52a9020b52eca237550080de985d822959d1b5a79f3eadd287fdd6f7fc3d94861f09d8f300b68d3c799ce2318109f3a36392aefe3d0fc56cce9358f03a12eca5071d4dc4b9816e762c70fe0cf438b710b2aeba9626e46a42f7081444ecb6e17ad674977195a8bb0662e599c52aa9d908835b5f5aeab40cf6807959f11ecf65d8799a3374119b7fe3475c5d91d0abad9bf9c1a97f9d34b6e2ca7fb7c10db715e57d4b6b16e0e963a12a971520c54cfa0a587125745fc787d5c6f730bb1bd4bb12c7bea156a6fe7a132ce20f90bdff74248b9f8e8a24865b8bf2a1e23b29e4418279a974be90df6b1de1e4280370e8b79061dd22ee468ecbb1857e2beb17c25ea6cbf1fce3d8296dfa2b0f7f4622bc9d4a1c2fc62c089040538c8bb96994b814f32bbf9d390d91e08599eba7b61a4906c3b299a8f1dc8a991f1897df3594855547626fa45980da89491745ce2a66a9873563968d58fa5add0b9dc80231bbd1f0dc2ffae2ca9618ece000237a624b7d10020375e4d76b24214d175f8c116eb5caa911e91c86a72abf0a1c27f18497a459658fc947fa3433ab84cd33a735dbe42c20920fb181c8c87fc20673eca86320c63ba37844896b277ce55d8140d9e949e50ef2a410605caedef8199d8b353338018a1472608bb373211603399cefe3f441c3ed21f8a51912b1c7da1923a4e45f72ede38af4a1fe73686b4c0ae7bbcbc74ddd1d3900f0758e1b38133cefa89a9d118d33a15fde503fc18ecc6d9b1ab57e1275e99279ff54faf649474e98efe8fd6d87afac6c7c97791e5bdb67cc0305e22f4c4401327b15acb13aeed2b982fac1934b7aaa54ba0c7c91fe0b80a7d521a20babded148f7aa25119aff9ba639cd6b37d4fead5a9675e8e0d470d94b592332c36010f5fa246e837af782932307f2c021e7b94a25f292c0e0ba6ffb617e0052491dc1aa24c6bbdfbf808ac5d7ec121ff989d0232ff32d6aaeff4ef90c94ec259f1922e8f455712487117b4d3587b60bfa7f627c524b8fc3ec875c4905efb48ff82dafe8b890bc83b6b27455a6a2a8b049e0a30d9ce019a6108deb2983dc6a186a766f0c188855546a54e46cc0bf001ec22ebef9d31e762c1689ccc85aae2b4c1b0081de78693be49bac8e00085b432432486d955e7a4018e60b607d447dc6abf67ae87448c080979d6d492b22c8456bef81b69ea25ee09cef9a69d59ed5047350c3d6b54582e483f7a98aa61e56421890e5b475e4f55f51f7fc5a9e33e6da58ffcc8e73504d6aaf897063550d045928064f6f6ba020b04165bac60658fec773301dcd503b9d17297d3fe6303ba02342855c708dc855d196907ef7c1d7187632101ca0fda528c9ab557cb5484f2f9e7b01878b50d1c9262631003ce3f38e6d907a464b810751550b67b07374bb407d3cbc26be9ad6f0cdd152f5da4aa4dbc06cf70461445aeeb391e5889aaecba323e60df23a3c40cfeead1090d302de43a3a9e4ab794d6d48ff717f1a60ed4cb4bbf76d0612d47140b1b1359c570714a2ef8ae2336229f786f07ecce8a6499af91100e82b51c390e95c44074f3390e0f29f49ba1341af43a14d502350bcc687ce15cdfa2750a4cfbaab34a2db4da825799559939272f9ff3874a960581826678440d96d8132771401e3f0853b55fa621a8f70a10c1c047a656c23ff3750e877785f1e98c36696883732b13e4c94abb535d4b012450b50bf404fb800c2dfcc732d332dbe291912edc1fa740ca39aae1ac5c6a30b83f07ff098dd4b065f793a04b7363c49b3e86e582f8a75efd4f740b9972db45c488bedf0750108feff7149225eb0d225f92b467dbb4ab8347a793822ca74365259ee024d02225ed392e80eff189002fefc23192b8b0eb454f2425e087a328fab18fb0c9ab0e257536a8aae83c13d7d9ab03759835d8251b665ff2a966f47018af845c6a03f4aa78d4ce12edbf68b27dac7548d5a92d0478175a74c97ef2094c622f1cc1f8eb01d3cc5f8e73a2138f4b90be248fd7b73c79184899d3e7978ef6bca5c8c87252818586400e724496bbfcd221d0789c8245f335528e85260df438460b93dfcd522f4c0fdf86eaf4993c02967ae8c5410d277ca805da5ab3027edd0dca11ce65275e3e1499026f39ab0ac6ed040d13199b9545dfcc30d5b7eb1a6bb6ec55c5b538a6162ada4e955130883afda30b98d2cd6494b825eabcab0092a23d3e9cc3b93863ca831a6a03b581ff9c712a761d39b47373e549c9cd769bd90d4af88cf2ba4ad885a4dda76cc271fc3fb9ec094a28fbcfbe261eb8bc36a48789c9b823007442357284e9fc5632ad9cdc6d2fbab6266624f83e99858390e0ce90cb537012686ec39d3a3462b7922beb51fabaf4e80ccf9aa81d4006fcf1a2c09f19863ce362bee093ea96539b31c6e4e7352d107647b91082bb0dfe62db203e83a41f26e5f69a2ab63b0e51c26229f864b97b767b91632698d71d25acca142a008cbb4a6354f6f5bc777ccc3a171566b858e8bec83878045ecc7aff5cc89e74403ac6a27a7b43558ec495359bdd6936e1c1a3fddc943f42d021e2793fc64cb1b9c90c026846b4f18df55a6e1b105eb8c403bd1244a29ef1fb699b3a482e133f5f464c3b0e451058ff61506f96bf9ce74219b2337b89e878ebc1bc13d0462b0afe3c5da5a5785685a444e1983ae3377f89da3176a32c869ffca7458ffe41921a761c5838d655209cc4fdc47c46cc748afc9669764c326ef4345c07a6d1c14d24e38b8abfc6291a4c26f210eb763335e08b6bbbadd432cedfd0a3cbbae8925f75ece3e96b41f1a316ab498a41ee7363bf912a3e1b652468c91a3f50a8b9e94695824d7002f78919c6c9dd79e4b4b198803d0020f297245632ed8a17f2fcd1a492b3c7788021bd1f86c5a193ae8c3d8c1b34698b31bc74f962216f871ca7b2c3802d6d75eea7cb366450a368cfbcbe8c9c8d2fcadddc9b58c0c77a60e8394262ec40407d6c563d7870eb105df4ac616eb9a14bf9e0b80e7720a20a0e2adc63a28450c9780593642d79e8b82215c61e12a6ac72a482a97ba687850c85da7b99c278e0978f2f2493b4952b3729084759141a3ebb7ddb50f31bdbe8cea51513b9bbf492bdfab99cc2c293e06a4dd83dee324018ca9ec374af583d60d92d830baff9b1c681cdde1ebc829403b50a289ecd72d491a770a7fbc0762d6a633750d20639a228b1f33c349c30e644b79c75e23753510728926f4457814990ecc0f17ba656b5aa8161e84bec5a36841d0ad4886f44fa8b5ff415afd1f886463802d4dadb4d5716d5f2a2b41ff75433987dc622df0c6254bd9815c7dbce79181915c2ce3fc5cd8a0fbfef417facd4ad5d5fa6817402038912b537a6834c71ce694db28fa5a9b45ff37b4e849701640fa5dbbb8d235d96ee174d5882b9752e316223ae6668946ed1591943c4fb4125f497aa79767c590445968d812858f901fd17ae9ff14a587c845df66bfd87dd45e75299702abe622df71bcec35448972600f5644e18c411180898124eac382147d5f6dd8c18b6668fe2d441f0f25345a5c85deb1cf51e8d243859e87a242dbc235ccde84e1c4643f79e1bd8fbe6c6ca4c24be028644a5a125dc2ee4d5b8842f27013bd003176a060d9ba68845b81c5109bc5016caa69e903e0de2615f16ea248735f3b732b6212799fea1d51e8528ef2db8c11a31b17e291ad21725c7df4ea9e91bf6de5d48091dfb67f8a5a300557f08ea43ffee20b2930ea634c3433678679fa8755f9000269f76fbe4ee7219a53142efae588c122cfcb5766f3831f0fdf2afaa37d3db0a030c3d46571e6bcad221e8e6417696408fb17074220914defa1eff2560ddd939494d0015b7278576e33d56365f4fbd2ef741fd254d30b7da46880c0303a222b4ca541d5271a9b559de8678424ca89c4bd2a9b41067a7e1f8eb147255c91e8edff4d7ac98be0877fc36725a2eb25cae843fdc4447f8e91e89e9912811c19666888176868f3b85fea4c3b24b40d0309ede82a232769f1564649f7837eb2fbf613a59f1a89cdf6748b35629b8e3ca923cc17c84c67dec237956205dd79c92fcb28ba44920de9fd152abebeafd0050790ea7dc1b08afdea022a67718c78df77efba6c2f20ac6a1028633e26ac32fddb34457913ebd4cd3d9e8965531ae5c84037dddbef515666bbff9dd9f074ccae5ce43e4658d16b85a84f496ce83695b50ae3a78d4237c4b614ef9b5415b866c5416356d9129a086c702998406760522cabae48d755868b61c27e8ca2c654c0e9117ec9926345193766c1694d46a183cdb6c2acb277fc2224dd337524cc71a0e110ae416f06c7cdd920d3a0fe39c74ec74f56958b106427393eacc974de6ce4b2182e84d032d3e31c807898e23b961625a3d3511f3cde13b1ec84ace3338dbb9e4e7ceb31f0aa168b6df0b8b2fc304986f676b24c626e16e4929107b8881e02c8d9891db47820f3b0e75b6b4423bb905742043d2198cd204f65a1c6cd4814c6b619cc250feab8495e981277860dc9b8ce70cfdc7127d0dc2d9b4be3684a5eae042243286924f93c2fd120e55b9d15fc17cae57a46074b61317a6bad0603aff07c702c0f64d2be9757b63da7a383c269d9c8fae0d592e53c0fc1d1e8ef4aad4a4c136481eb8850ae7144426056f28a6643c05ac0c26a98fcaa943063f4273e0c6d14780522bd95e5014bc5eaadd2007afd787d6040cbc9fd080d1cab424edf59870dac1ba4af8a5c81ab8e1d66cdd4ec479ea014421d0582cb020fcf1b1b1863e5e0d0ed0d3090743b85e85a26f813be11fb402342f0319083060fa53df25c6b8ef8811d85fbb90f774b034b8c1d1c659f1982543ef1e6125c3e419e4c0882a54768cb9f254a6bbf592a552782f0e2987a174443efe01138f4f26783c6ba5b864bd9d921bc54444992e8833147fbf3358ccd7048c4696f6ac272111adf8748818489f4ac087a3321088745cdd6c56e4bcc11ce641486c456409c50af98702e4ece54207bd46fe66c784239545edfab6738608bcedc5becc9e630afd4c760cb3c715c967ae6865f741c4522b2fab433b54805e66080f7458bf14991984d2b94548482ca5041730040bad8547c2dd177424c112aaf40b99a96de7a8194bb169a6eaa6b61f2efba5f0d7541f14a5d2fb69f3baefd95b56f2c36a60b12d2fe377972d97b561a32c285e04d8e3a2e197a6ab1cce8e246b745aef4df501e1a7af55b22d84bc898bc70e4251ce819464bc9431c960282cc76429f38d77a7cde37b52ccc77df661911d84aa0dd0fc496b3ed9e69d69637b5b27d336c459bc9b31ff0af963d13392df61ed172a9d08500adb3ae565e15989865bdffcb01775b3543f7b654f57c5b59c3cfd6ef655e2b3be554ebdad9d24aacefa0751d10ce0a3ab82eeb65dd17328b7dea2ebc6fcbf5a50b5184e8b5fe0850f03da90c80218222fe5fae3ea3e424bc07a83670b27db39302a1049d1095118d5bd6d32fbd3c8f14f879a38e7a2bf45fa4ced8d858e4b01a0600406e357527d7f3b09c32be03dc141a74a66e40786db334b9f51611bde010268cffbd35a418caf0436563c5de3b53b2ac64b522baa274c2d7bf1e4a4c9a5d0e874c9b05c8412651ccba85e8b3f9c36c14c0168a691fda84893fdc207d440b885f885600ea110d470024e6836e39464a75db4707ce7526dd0318268d8be53c1855528cf4c10750a4e24efb6699d1835d5538faa5ec656829d8fc8a369fd01fa49699062e18e132dffae312c7f684a0b755dc8bb77dcef860675560d73731163c7c0b3a09148141161f545bb6f0d918aa887eff47c5a118aea2d26ba03706b2e5c0e4f72659ae1ca88f411278b277e07d2dd381cf2358a6f4c9e4afb8fb81d32ef4c971ea9544a4ed2136709abc11f5acb5490063bc3e8c9ed47f2153224af510951195b27db3e1d1162f9fdb6c8237ee120503b4c718223b87d56227da17b2304db86748e403d26ffa64a44b39eba6da9a1eff377d24245c93aa56caa0901b56d0d20a8e0e903bb618536052c76652bf7d3d4f6688d991d20d0cf41fabca23c47fba9a2fc7288919038c674a3e4a9e5a516427ac94fa4fcf4ff63750b1a0ec177454f67b36334f297281b8f400e83e8da072cb584f8d2ad548a355fe49a618806ef310e80541d44e5b2a8d57ee64a273054548abc1b5a79052795d79e62ec6e2b9f2d2248ca538f196150806aba38821b796dfc2f9bc77b6720acb7c90acb7e63a5b00869ad936441c12792b160e09d410bd735b33d60f8e1538aeb141d2b3d7b44ebce3ea00694371043711aee7a23950316a27d1e516b610c335d757f7dc8862eead19410fac7d43011905d16629e45a0ed1951371280c5708493109cd3b3957f729f6d500c975e9d8e13c4c8cad6199849c775c0b00c4e840041ee14a62f450a5a88d5c5443c84236d7bc5e1d7221880bb99eb81f2870542b13ca1572e9e815af47fb9d8843395e25520fac8d145f05811af41444db15d76b09236e7211be635e93133dec7148e293f7c85608079f609f926a49f14b605bbb1f5a3420e3eb635a243606bbbaa7796e449138b0392e064a8cea0029a28fcfe37fb68d2a6f070bacc8c421211a2658dd1916064df3f5456147ff89178321b200a52381700cb032d2c88da6f4f70ef2bacb55867daaa79955508ea671c096c630ffd06f43fceb2a902291ca883a14ec704b09c0b00c9d008c79fdcbede938f1d3b7f01005cbddef6133527074e724594cd2eaf7eab2a1c0b280c36d2b1c7234afd442c026a91199cd3b0f1c288f580c825a5f30715f885834689870e23b928e8a728e6187adba36c07c421e9c8c1f41106b0b1f22416520ec049bff4089132dec4ffa217cbca830d31922d39ae8146850d2b166e323e9d956550e9416670fdeb54953580527535560dfbcefcac9865fe1a16a1f37b3bac60adf1ebe602c1cbe9c2cc23e525d2fd4b4dc3901cae28e94f10a40146baed80f61bd4ef45a02dcf76b96cb846cb5a8e94d63bef21970b1f5f1b89c51dbbceb56561fd4218d94c9c676efee015e13bf078f5c4f65317a22bcbd063316a1865823927e9e7c120a92c9a68865c362e7eb5c6f494db0f49eb10d7315cb6ed31576a2c672896713a0bd9205e8463e44d358685dd154418268b8f5587a322feb6469990d83261c406da6194292c4a169a73c484bfdc6d259115acab1c87b0fca5d0acc2bfdf91c5a110fed79802ddc836dc9a0c752016de43934aead5fd105787dc9120b10e5a47dfe65780628eaec66f90e0762aa832c2b3fa14b1b43575c378f6100aefac3c829833f01ba6371fb981a3b1c60ec646628f67f1f1332543a5ed0751fa92e2859a1299c8638262bbe8744667e8157f65e5fec3f13f5ba5fee9008efa41ca9a6194435c832f4ffc8d48bc9e695e03fe10fa6d76374b19cfdb139ff4065360d4a78ed80268b0c7020d46d77052dfaef38838eb29d2ecfb9683a40a4d32c7090770c9c168088d3ea00df8f49c0bbc3e7af98a79ebcef6cb2e0de4728e2712a43a1ac594becd95cd6c94622a64300a24890baa14fc9302c45a869c0c03fd3aef9264be03217f4efa51ef49e9103efa91893f574771311134be1c57730bd2170e85e0bcad9b68201ceeb2cb10355f323d6cc50b0357303c073d8cdf530c7f3c3c9e00034d591d4bf56753d2fca4ccf9c13b3b35e64d89b80f56c6cbb048e7a24027924179838f29e6dd934294bbf843fde91b567db6a0bfee7f150c4d1efca61d601cf36811953fdc95471bdfd1822c69e7fc396750fc76ca36e8b27e1fad2ca09f1899c9fa694d470610e643a7d30d9b5799a134625e5e6158e72516c3ccb1d43accbaef95aaffc50264cf2c84bf2ab367535935c576a2421dc05a4c5cca58bc9a81625c7f57cb1d98843f49a4d1dba4e45411c97af8ba852abd93c9092f9d3c749d33b0185fc0b31290272e4988c2f4e40aa9280688f08487b0d36a8ea94053f518662e5ca46e6d55edaad6c9eab3a65b99678457e07a69584a0e55659693a88386a3c62993892c74b7769d5909aca47f87c5297c53561bf7ccdc893aacf0b939f3fc582b8667bc2f40afdf2714630ea8671b5f0727e5136fa14aef121ca3dbbd9917becac879dd83d3ca133daec2e35b168ca39532553379d71662a355fc6638cc84f2eefacc5233e0a807f6cfc8df502ea0f63042411abc244df8a91405fb2a81d811a43b06473d2bf70e4c428d2f465abdcca1b96b89cde0f062fe80ca0f351cc756042ba836ef584b402b824f380e0dc8f072ca41e0832fd501383f3b22cc919bcb40b5b43243cb28a8858f417926bdd6626c60a3b8922f029349c007ad386394eebfb729eb7a698aca15cc2071b29491fa005f1ac1cec38b9d35fb1ef6b8a6df8e0448ee034032d363683d4de4eac3d577251456a30ff86ea5b147e80b6d283bb942db4c5aa2677a0c0fb34e3f616800c2956ecbdd6a3abfc33828b21da5b8fa1d59478a9bc27bb477779a4dc507baaa34785c206fb4dada0f1f21027621aaca281ba4ad768357636a656a75c4b2bb4617baa17c5a909f57395890a92ed704ebe2dcc4cc07c5ed492eb084201ec421de4a0a7be49ca79609ea8bcf9726d147a989daf5481bc3e6f9c48522557ec2aded369b328c27dd699a0ba9cd3e85b9a878a9fce61c2b02d9b6c85cc116e0c0908a0413cdfc362814d67c9257a02559dbb8c726dbaecd81b28dd34a4b97d0d8f8e80de59d5527c0a75a663f09417d84e0ca9557c210d8bd31f401b5b316aa6508589135700dd031e2bb381538a33806699a8fb5fd8989ec66d958dacd70cc013bf01e38fd72daeb55a7cb1394c18ee7b80ea78d203660ac161338c2bf9fbc297e028c741a47646f3b7beb3d54c274bfeef611d2c32182627c3f4c6868593b3017f3177989300227d434f97245ccaee11d6f1625cbd57f7e12d9d01ed456ac3d193a8255d751f0d225e9b1c0ec7e67e439f6c9f3e77ce799a5c1389045d14e738b1c70c90b7700bf7cf7c75dd76bbab0f41d6faa2a1c3a6810577f708b28f7ef0b6c63a038dad9f693028d3c20fa95032ccaa1992957a9816bc4135505ba11ca7240bde68688ba3e1b733677f50c87a1a52e1f9337a69faf231159abd90468e23b6e800f0ebc5fc11c8a2b4835d31a858215a4283cee8a205b53bc51242afc9d933da8b2c187e51ad47dc308d097c4015dc7e1d99673586698e791444f85b7998eb048d5b4aa694416b080a7c80fd74c226e69acf2e6b8f561efac3af87d4377a9d85ea118c9919a646283e6771718d245749b3217c08a55f4f005c77da44e0c3a334ceb69223c9f9b0e6756be3a11bca8f477e278c313a13e933d32c4daa05aa418dfb44ca987e1489a3402bad8f63403a684df9009bca0518d1debc60aba68d30e499820183a6c380967218b3a3dde7f48f7f2e73a7ff1da6d010683d318e7157649f2288eb0c28f855348828b28ce4ea07d7734144ff49cea89d4fecb84a3c03fcbacc880c2130c05b5d413b24676f2431013e202533be887f4a513e3376131094ac5e74c900e27de882094420b213756d3e30f250b3e53176a8d212d387fd92d8d1c732252db324c8925056e5ed74762dbb78dfae9d3efae3123af955d787882c4d7a1245254ef013a9dc13a83083f36b75dadd05fc1e750aeee7f0a385a68cf5e89d7401555ee6d7f00fe1ffe65adff6b67a961471bd6468b608fb0adff0105ea3c5ecc4839299c772d3b70501f6dba90f5d3d946e43361b707983696005ad866ce9a2f624bdbf8099c187d2fddd1a0b91cfbc48381fa3dec0e3269dd0376afaf6b87e010b4b490a2c8a4ff8227403111caad5720199e72c6044ba4cd58902f9bc4fd4a5bcbf2e16e95e13dbd16ca24539584f7c82c09aa9abe50f7729cd6934f26c117305ca2e07b143da54c9fdc7a6211ad3f1ac95e42f4904f8acea4602e4e7fba1d507eced5a4abd28b498c09203a922b06132515249b6700abdd40ba28b1d8067dc87608ef9e226d84139dde310ecbd7a5cee8f41fe3cd58dfaae03412ca0439d202ae341714295879e58291003ecbb1242b9fc549fb78095acc5cb721657cb7bf9ce076beae578648e88cf97823842a344db69c266ddecf3bdd9e913a45d125c15294f2eda1f63a6b2543051d49cf6aa966da3b0987ec13680f5f91805cb04228b1d2b49175a37c8b4f7a900c3a04dd473e3fa7a19ae86fae6dc558e0996168ffedc2ee1de70719fa707298702fae49fcdebf1fd422d080a9828f82d3e2bae25ef892288fdbf8cbfd46b8957703143b3e4c12c1d7a80ac8d29a342227fee2c8a7ae3f90b8283c3033387a08194f310ab13384d4d67af72ca420414a07c7e54ba9d61307df53f7b5fd07ff2a0319fb55a73c0900649e90ee66fb9a7014e8b7570661abc40c9cba2d8109e254177989e09f426f66987df86992ccc8da879d71b6bc253dc3ebca5ffe13a31130154e150fa173de54fad47d6295308e693cdfa6ea9b7478d915f976929a216d73011c248b1650fa927bfce433c9681585c520eb01384320a9ae953a81f531b34fbfd916e3f0631f1db75c85a1313b03f25b3cac7ad6c28491414657b11efc222ae0614d791a228bac5f4b8a41a963916b16a5f582f225b4babdf0d7a266cf59605f9c606871b6c207fa173cc1e868263cfeb2d3f8c1d189e489d8c039099ca6ec40cbbe280675e37fdd5efd3208b73636bfaa777debdf1f97e03f643887a5eb56811805ea8ec2064e59dcd860f193b56be3a28e8fb1363b4561ac34f5aaffeac1de5a649c88fcc18d15293f8ac3c50673f60c86a46ce555026b60af65ec710c9836a2c6a2b8ea20f162060285e108859a1364ab5933a093f9ad4ddb36026dff547fc699b2e4ede23690427a6f09fbf7e0eb41a0475613e378ce8117a0c0098dbf640b9b8f8f0470ba9fa30341283a35755af1b93f10fb15b7c9bd255130bd89fff8287668203ff2f88c6e5a18fef60a5298d9b85239a4f1dfb513ace4d3d423442c1e6acb412f4b58fc65362044ab1ba164222b7d477855b30d0705d26cbdb820429d9c83af6cd74eaf0a98b238e4d22ce0a182a3c0477d715903da97c69f34bc911129adbac953c0de3477881cb41fed82f5f3de2e804dc4014d03715378f29c3b476a2ceac7dbea5e676f4badae7b9afad511bb3bd10320fc315be2ec89f36eef6807aab9614b28d13561658c765e8629651d88f7aa5469dcc5a47a7e2842b4767ce848a1825095e4e52bcced12d031db11310c9ce2785039a2a3c0a671f2cd89bd1498ecdbe50bb56aca78697ee00d6d5d0e68a0277794ec0d4f4bff47b9bb539a725c04364f28a1419d410bf2a48dbd3b4519ff43a6551f42b6f64be36811dfb8ecfa7bcca163c0645cd5a5cb2a7a001abbc0e03e2b8e721e02fb803fffc06991ca0625b0bd020c19f4229dd19da3c8a896f87de0f5b82aed82533d772c6b242a9af1c131fd1f3f120e6aee51c8996e0ca0809a392e0c616838cda6a4853f252110fc43b2ee344d180b2a022d61695ee2ba28d1f0fdadd553db860f6f763176f270afa93286452af86f7c4e844e4161ae1a146622636e227539a6a24d5c058dc88fffec332af33822bb6c88911a2f09ba5244a445fd0b8ae2de59e3cf6af3827f15b47862d5aad7fbaca6be03d3076ce7d51f646c619130f015e07e2b23e99232764daa6c7686943de3f6e2a6fe5b3a6c06b7d9e37afa69fe3f1c3c80143f51c18c3426dd5973dd4de9ae57ff9ff215dc1c95871ac24e7cc78c2a0e27600d5eff1545f4a110c3220f4eb62cf299d65cda591dc7ca0dadd958e4af3c2812a616d5a8473a299b52bd9df503ea736ca063cc1b5d1d214ec155657396e04055edad144e9f03e5928065429e7013fc9d5a27b3429c39ed0c6dbd5a41f8a1a078f3cecad9018b61083001d1c196063e3a52d94a718d6544ebf260c36f53e63d873b20b015d48eca5ab217e711fd230ce4f08740df033cd6bb28c10e4fcb15654d53e630e30deb0fcc4a4e302d5a47763ee013b230ec28009edee849b8e8d18f87c3981ff752380f1e8fdcd6b0da28437cbb789395a47c259f12fd3d0144930508215e5e9852f51cd230ce56a5694166f6a584ad179c9d496d86eb96f926a9fbb1384051ff482e6e3fa51b8d77aa5c857cc0c8e221c464d4871d87972e60c48821696401828f25e3af32b376ba6a4f3dacfc3cd53e5ec18074c93f095b78adca212fb8c321f10b5f4510f5e44e81d092b5801537028305db8dd56f78ca2fd25381dfa64dd541bd950300b158712d254340c9514d2cf3cc6a5752d11c18b09e76fb48ccf0140d26adabb58422b9bcc877d883d7a837d3d613955fcd50d355389b6e0e561ed19381641610eaf19b1ed4a2281d08872cd1d31883c556cb31cda8d040c946d91f84de97f799a35e728af108281eabbe547df6849563ffc337e6831cea674271553d259564ab4d994064bac6e1c0d0e85c004d54eb02000a642cb30b3749ede871eb088b05690e736a398ba6292b15d3ef02b4633ee1220f55427121041e5ba32e715c752970250bf6f852563f8b4be21e9cd6d303601c7d296d0e65305b43b9e78670cf903874f27c728a63c5e4980efdd03d2751bcca4478a013c293cbea61af2a59d6586b8253606f0ae41a12fed9cf58c684c8bd62c532fa25ff9d40e43db7fa870968ce0275f1105dbcdcd8a9cc2e818d311bf42e9be40e4ac95806e1f313eac14dfdc8f04614c863ed751b90f206b9c2e58194cd2220cb4b0f693caa40507adafeb154cacc42cab61d3beda4c24c2a1162b12fcf30799d084228f557437e301690a7f8b2fefcbeebe8d0c383e875a53362c1eb8a5dd1c93a759f27682015f3a18eeb28785bf88238542b8f8516a087345428235ffeb5c825061dce781a0e79c34163c5079e48ce4b82ed10911bd2648ec899e1bed78ded3288119892ae2182dd488ebac25d8c715d154f9a7032d381fa633b09bc6385a8a8cc1ae72f6cc1bd9743250cd170a4f5d45c20d204762f9843c1497952095c65d066f0d6a384fe99f30bac6801f27fec0f47db318834cd920830ee8950516269924759035dcbc4feab53b8992927b7969e68b6e8048ae86bab6f19a1a7f62cdd4dc6afaffd8bb34a929f4b81a22b4bbea8c19731d4bd14eee19ed224b93921a9ad4dfccea6abdf1ccae7aeab5f5c373a3b347181012ebdcd31306664c7f98b9085ac32cb50c6980fb2326ce6c4c4419e2420f5efb544057640d00914b671f7c371a49af2644bd2658f73ad553a0dda1007947d560c2a7b8b18e8a8bd82a23d823f987b67b3de4c2fc357336fd61bead472170480e622fd3f64ebcdce93e5fb62ada61114b29dfff0b28662d4f280e6ea051dafc0c5c00bc6a6da15d9bd012d52de2499c189716eafca92265f83c0681af81300c7856a44574c46e49f1545e95fdf0d498bd6b4ac95f4f72f7258a1b98b18d356efc261331f4b55ce33149306ed172590f9c62fb67ffe9ca1e09491bdfa46255045baf29c5a3f92ea5abeb749b9fed138d8193c98bc1510781b325a13275c1a2459bd370f2d41458ad416f23247a0b6a5739809a8c3e3d5a3617569572da8511252b04e4b4785c4d93bbba0a57eb55c215bb14d1be3647aae996beb267a868b00faa6eac5b5c46e275f783f1ad17bc0907843920f604692b3385675c2fbf7b150b75128840187103c493f9214bcde1321463f8779cf34398421000ce1cca755d43396d128e1200f1c99d59246970b6048aab3893d8fc2d9618542df5e5b1692d796b6ae49f2fb9a9748542ddf4d16b930c53d2ac306c819b4c6c702b5f2d7f497d129321eed8c1826fbcb8c305eed3c0378c9842cd6698426ffad7c3a9ded90c58a59bb064177cdc80dfbce9001badc827b10263026402ed02602eefde4df82235e021ec011198a08518cc805349f0dcef9a202244101ccfabf4066ed6f330c48cc67daf9bdbaf7ddf9bdf8c0591bbe8b28040e79a7e2ce580aa3a3e6c7adcc0f0b85989fbb1e30d2eedcd86db8c36176c546b4db5a3188274f0e43891662383c386050dc8d90e331d6537c8be6ec0a056d980aa913426440329861366c20866a2e52b88178f196a32cabac2b8626c59c5909a2ec168f122e92285164d564d11ab06e5ca87159bf4ac8a46948b0a6bea09653e8b9c3f52395126a0685e9e68549a724e6e4d38983598642c69294d253921191d298d769637452562884a8c683137042794830535c84bf90228faf3e4839464b1a20779ec31cef01849ecd0e9c4e5c4a0822c05188a298ef4187542e966c86685091435332568668825ea8c3d66d664cc62c460b65eae5c9c452622518b0f09152c3523645c56645254aa6c4a1b8b82563716a48b2e0b0874aee9c7520ea8aae3c3a6470c0c8f9895b81f3bdee0d2de6cb8cd6873c146b5d6543b8a2148074f8e13693032386058d0809ced70cd62282b2313bbc145cdb23155a339864443486c45580ab09aaf9717af97951973327674c5c055b62516836b9a0563ea45d305929650d60aac145735562e2f529795aab9e80eaa18a6caa062cf22d75f9d5912988a401302480f1072c08a06a460408d88e2cb028a2b0a984bc08e103120a0ec00622a7005b30c30558026019052101ac00a145298d400892f0220ae04600e003b7e319c5056226602979c0562ea43b3042412210f2b3aa420a1266e7919a16585c3dc861dbe18349465101be182b344a6429a3da45788b7e2ef54b8365fc69368e92450b8dc06c641600a703a06ca31490c2db005068129f0cd62d6dbf6fbd604b89587ff6ddbb66ddb07847840889685c6dcb6f22bfbe2560ed1b621768b8c31a11d4a195b2b499eb64dcbc14b5d0d94c5450c586b1bc786b179a21a42f8f69ea7e9ed8d80fa8242c69b09a789a914bc370d24c5f0155747822d878788b77f7f63d8d78220461b270dac1e25e88c11b71394c8727b4bae003bb1797a7a9b27731828ff78881fb3d9cb6f90e7c6fba02c22c83322c3ef6e90bbbff7b22e6266736cfea661fffe7f3e4477f71709dfffacb7ef0d7706efbdf79efecdbbf73b301134e2a7040db4af1f2c0d6d4727aebc6430c5ce9efadec8260e411834355274c1d0f4ac5c3d2dcd9e4d06316c452dc170dbea7af2f5edbdf7de4b95da7450440869d0c52edaebdfdf7bbf77903dbeb58f0fbfb7f7defb2d421a0c11f4defb92a10d4474a054fef9ddfb730786432b03e5dfd6f1b1018e615f081d1d3d19cb7befbdbc79f3fad4b1310f83ec4cd987b127204a3232d68cdab5a29823133b8a3b441bec4e315621c19d47ab88587cbe18e76bcea67bef29fce23eaf511c3fe6e12f58b463b77444ef9eaf6bc8ee3956e7bedf7bac33028677eebc3ed76c62107bda7e3bfbee62cc1131ff7b27fda26235622c29587965e5cfca319b06809995d7ff64d420e457fc775ea97446cc43986bf9fa6ed5d83520453312692c985ab51394e2e894295ecc20ed14b74cbc60c990f8ed1436a9ce0e197528aa533168d8ba2a71c336c36594bb5fb995eb23e4fa24f956f810bf5103e76bf34ef2d0901c5b9134f2acde52c1e366e645c6cb8a351d73effd5fb5902a7558d5400abb4eb2f03f5b46492d6e9e6488902e7200600aadcdec4cc556553cafd2244732436147b0d4afdfd6042d771364b66dbb09ecdc76bf4d20422b0f8930fb92e1e6810dd8033bf5c076b5402eb3731b570120b440ce8ad480f93bf30008014ce8ef3d9e4ac193f6de7befbef7de7bef2d42baf7de5b84f44367846db5ffc3ef7fe79c5c4b6d405a2f3e5e4056883baea25a5b44bc4fbd1c93a89042612654156adaa08ace8140e133f622ce4545e54577001c0c13b12a84f3a442fa9180132f335539542fd6b4b8964af2c78d39479683aa47ee072e3138d1e041daa081b57f0cffb7771fb0bdc8d924a150bc48a96632b4d5252337b12a1b3f7884ac74fc6559eeeca659c4120389cec7a621a30509ae331e3154b53f86ffeb831d297c6254eabaac62e8c181b8678b8d8ab01a9430aa968dbf1c93c4d9cce0b4cdd02051630a2c43cbe3032b3464509e86c074fca45352b33b0f7fc10c41b8ef9df530afcf9caeb937afcf1ce93cdc70ab2673dfd956b45e9fce8abf2ec3f804e3b79f9c4f4bdd4749847beff7eebbeffd13f559fc5e80eec3e34200d8e7f8538063d867e413c3db7d00b0f789e1e51bf641e9f18d020c1762b23fc7c103c2beb8af35dcceb700d6bfffcfd2f7a1e2de2763f40200438f5ccf54e50ac74629a374e3985ae860caec4899bea022fb7700c8365745122b7cbcd0a8591af177ac6d3bce8486de7e60fd248b6a7eb29c4ce1e327047d889d9c79fbe625eb2f9175446a787c07e1ed1f9bf79e1cc13321889b4ff6fe0c84f760ef071906cabf17bc126039867d2ba22e494f9bf741d906cc3bf8e2140d7e93207baf7b64ec76ec4df4df7bf7db7bdf93e57d10ee71f2bafb390463d8e7febd7b8f91c806a0fcebfda785db938cf1ad3dc7b7f3af610deeffbdf7de7bef51f04263549d36d51ced194e0ec77c5ace0dad98be085bc1cce08b7dc2bc07028ff4b31160df579eaf5edf5c64fdfbff8c79df77325ecfa90a18418a90c90d1a268c8d2ccce7c828acc6d737e73077b1bdf7deef18de7ba8220c91118eb01f2aef1364837e19418d34450eb11523ae3cd38ea717af7f0e7030867deedf221b641828ff7af7de7b1fc4e202c74fd60ed19086b612bc74942cae8ed0a83726d0a302c6069014351d2e3ac8a13a51a36d692aa944ce164d0c2c62a84ab6ba98267653f7c5336783f803172e5a70b411511569e2034a38a590bef5c4a96c75f570c1447513c30e07ddc282688646b3f9a36b296a4605848282475a9d111907122b008bc1893a5990e05ad76a705479d53d4da9b18cfdb8b1022e2a069d3202b43de16230724271c16184d657d80c124fa74bcfd6004e56965610a38f900eb48495af30258c97184ed4b0f05a15c1edb25cc718773c4ce505f6f1f271fcef7d5d83b5fdcd6f90e8ba448c77b56cf805090d6bad3558151128ff6430169d6bcfcafbfba7ddd65b6fb0e52bc3603d2edcf986dd7928c32b785f73222ed6f6bd6fcee67e5fbce56e288d9091aa4861f3b1e4f6b50adb3309aac318170794b4744667a2e8884c6b75749dd216a6a3d8034886d407fe3a2bf6dee1af183bcf7beffdefffb7efbdf7dea32f8f61df6682bbfff92ebfbdf7aebf94afdebe38a9779b90def6fdd5d47befbdf7ceb58e2c19255ecc95f9108a326a949024154a0d96b5ac6ab0ff7065af8321a67e964678407b7e85b4fb7bce59060439b61053c12633236ed6bab56a818243a66749e519a3e51732afd2275a376aeb50d8218302b9b1d8f154376ba3ad151bb41a4b492376ef015659b48c0753893343aa996af0821441d5d0b1c643c748cfc09ab5d65a8b90fe194e26d69e0109a7a0185e4e49a9291a972e085310e28c969918ba8a8fa8e4cab869402000070d831a040000301885811c8619546d011400081db240587c3844403c48181288848171200c0884416130200c0400028120481c6acb611486ae0000141480067e851ecd32983ea8b4f9a1f2bf2048521bebc67b8ef7069cc41082fcacb580dce4708302a25ee5865a066c01c6a15f023284247f78be58aa06530f943e03227a802461baea176cd93985488b01e5565baf8ad8d1185240a149888424f1c8bfe01010068748134936db7d31cdf1f6a4c9a174cc89d690f3928e2169e91e4e28686a44e657e1534892a33e33e2f74da0b79a480e545f53fdec73a2e6fc38681e36ec04ae6b0a44e563e05e00288a1b8fd107dffdf104206edba969f074d1760462c5fdb70e07b87a7aaf279083060b4b9523e77b2945638ec81390e33abb142ae862fe7a027a5d291346c4b452c36701df6ec847e61ea2369b1c8156116f3d10cc601a6d341a6721022b0a9bb9676d691b016d73342b21dd3e1a81489c4d3d0c18b573a5afd5c89b8df760c8f60c3ac7243b36ac619cc2dd74d7747e99edb8088d89c1e40bbe2ee6abd8e60d4bfb05ddaefdb94a2222c0d78b89d53052e982908a278e004db76d4902d0545862d25ebd23a600fc3fdca04f1427a8ba7e345bc4c158199485d3d16967a185571132de4e63cfa1e02e8c741bb62855ce7666583d4a4930e5a7d3b219cf6ff1ec53810324722ce54999f2a0ae653e6b80d0e03bbe3c374add08b0b90a8ddce96fb8018dcaa981ab9d74c7763be5e65c49b268e7dc32cc8259aaf581b14eaf64bfe9b74e4b6c20b4d30e18b112dea481aa791d4f75fc2de2739e90db3326874ca5ab7c04b0df72c56799b645732a60cc4b7b15ef0e81c345727ba54be77ec3087f26d5b535cd84edd41ed21d15a097209797f81d8304e5191dd57bd9045cf99a916a699464fc66a1bf1b3f6a8b173a9952613d99ce8330f1d6e66a9edb888efa75554cf353d474064ad78e21ae2686f7f99710a92ba5e779b93e470b7548ab953c18cb55be8f1710f05eedfeb895b54a3d4004b714f07d259ea77cd5c6a739d5cf4ca6ec4e558086602343661f7e1a367bd8104e0789b11122ff56aab49958a2dd754aee9ca0352a2bcaf4a6ef6fa2e8f0c8e80c17dd2298e81166182d8885d1ec65d8c5f7d8855c8d1ef9422b6f33466db41a84dd3060654001763aeb3ecd9b69ea11c2377d2c064416443fa3ca76690a2a4e9dade571505e1581181eada53ed379de91cd0b8adc8ca3bb56a9d87aecb88550e233f2db031cd8e65fcbfa6ca46d73d7c6b0f26f39514de808b980361bd07b8ededca69bf98ef76c6cb4e167a88bf758bd05293667e27263b20d40ca3ddb1e36f9fc6d0fc3afd76565d432d9b135bfd7daa59d8d1ff7e29b7130c1d062cb9cf92a1d57218f39ffb26407f81a91926d60911a5aa35fefaf913a826fa763efd008682e0b4a1f5bd6e5ad7afc37dafa4f2c28d01941d6d2b175c5c75562e0b5de82499f4b656a20095185ee2edccd09f5abcfaf7585fbf5014c05368ab58da2162763875aea90cc13580b7fed1f317062738d6407d5c29ff9d0ced2431f187010747041f4a038fe0926e3826b509d465deb88e89656337e08b23403c9eb992132168c731d5797742f8e924d47c14c3474be35cbb1f25777f5ab8472d151147d06c6716d9c98909b3d64c5d176981e422feabfaed14dfa6b343a3d6c802e6191aa0014d2a970f4df6d0547a308c10ccdd5a453b2a151c3c32b2b150f8496dd5e84178c5efcfe34c08f8d185b73e1ff2c578504a77254b4deb0c94ef008d51489ecd249b231527f0cea13adfbe66ee4e79636d2d6235cecd1b1948f9c11e328af5adaaecbd74d49f92fc10cb03d5ac9ca9e6a27797512f51c7e79aee208ee49b363a43988fe1c81c85751016ba8baae830381c7419bb4e5fca67c58b453587c58bb9bbdad8283a980c34c7c36784b887379586b1a7fd09e306c161ec43f4c5f11c9f6a486e7629ec4b51c0c960e2a11d1519466050dc37067a10745886e02ba8acc0d15e9f7bf7b3d6b5f2127ddafbfbf069ba8d3816253baf1400172102646d10b095f694e258b20d37b9e80fa1ee74e0558ee375dec3fd8bc83d2852e4210fecd22f58bcb7259ebb868740995c6a4e8beb22a193df18e77a26e0906078057cc74a508d2cd2648253c2baa9ad2117d36a1a60f29623d077f8347616791cca952a40ac9e0e77dd34a398c5aa1737431c61b1a2e8e680a8d2b9bbc843abc4a40791c745f3d5c793202e743b1f961887b496a12fc9f07e00bf21ed77d90f4344c1abf30100779a5c2dc257da1d003b613f6ba523953660aa3f57ee0253b6624e12f17fe2ea7344b8157475e44410aa362c5618905e7a3279ec349d9c96548c92793f2949d833292a01488a0b0d432be53157a0342496bfc2ce2570850aaab16b493e6fbb73199459b35907efcada8f8438a8c6186a14ddb4a76b64778f06d5800c96d3541dba38c23cd148f1f35f96daa6f0995aef52637ca1c812c8ca275823279636788a9bf706457807637655cdd037cb47136a1e9c7b0c917dc184cdfd071f7b1fc963157b8758c40781182bbc6aa24116c234b94bf1084491c7f764942e897f584ef0a6704d3fb752bd0cc30cd0fd1a2635814a238f764c0842c8a60a645930680bad14864afbcb5a48da975078e654a739c9433770b3e9e317169c6909ff986c85c8c3a5489ba28f232132b9cca6bfc7f12f38922a359f302adb9c3de3a7a36aa81f75a55870a7424a7ca3e774931a89dc523745f08b3433e3f43d8eba553e023e70dd5fa857ec64441d19ef254cd2705ccafe570e5b4660566ab2e359a4c16e67e5b8fd35516669acc21e7e7ae88b007230d10548cd2cf05a0dcf1727c02bace665ade8a12098054de5491d95e9753fb3ea2225dee8b4c71031639e5e65669b6cdb09d19250a3149994daa8325896eb801c7bb9a29de5b5a85224580ee88460bef9d37970eb00cf902f248ad51433d5cfcd6c23111368f4779b8c1a08dd96a27397f898981dffd0950cd8801e9e768c2e9f52b1db737ce5d1fbb2414ccd51271caea5065efa9f9a15c28b22f4812fbf07541277b506e8b6c0344aba853540acb029a2c5b58735bcae2b409c6d928ff3b225aefaf2b76fdabeade0ad49f80089b2063c96cc9c34d0754f1ada551c4d1df4cdca208ff5a7f8f2b9c62c8a7871cae2bb953b7f03067ca4e114dfb874e9206d6f26ba92c04106a665211a03c84b755e0064034903c188b6943c22bd155becb1fedb189344344b5021ce8b03fe84d462777970f26d2d3adde229968402d7926a6d8bb0c7297eddf7815f2dc9ff86f45ec86711af504944df4c35c4a365a1f88c34242c04b4c3c89f65cf85d9026d5a5ec8576b8751decc38a9e08d8d06bf25cee6e1d662a169b00d7a4e93cceca4999b5f0952a7b0a02f9afcd6cc952f4113ddabb24b50e6dc2e874916eab402b3fe6910deb2028441b70c41ab584398058701f178a895292018cf935ed30b41922855b22cd75e4dfdd5e4c6f28413461326a1d777da18f55b99ad7fff0fdb151442731de23c1fb7b9d5294080f7eb7ceb6e94c1cc6cc5fa892e52ef8b1a7b5c22c18501a92fe2eb459d29721c7c07271002a0891ff1629e2bbed5696d37ce9477c8dc9a6a41ff656adbbdd16a6ead409efad8fcad83a08752e088ae4d4e97b61bbda06e70f13b23a0ccd29721738a32108ff12339a45b3a37761e1c4aa74c8e3ac9295dd8a4bb0abe0a40b42313b9d39611d3be4d6bc5b4cc2a34144cd52f16d9d4466fbec17e7a4a08eb9bade556957d2898539e29342dc7cef57b0c2f6ec2b725ab9e74f63462b726c1785fc7466878a94784315d9f32e4fadd70fb9b3357a0385709718e1290702f6d2a92ae071c16c221ba9d3a0c98607a521ff78c6200aed6d1390d0b32786d09b35729d291a5c51b1ca33a110bd6ae2df643dbda9f8bdb9d69b4932c2b975cc9553b0ea653a334b98e6a24fe2276285107e45adbfb86059a19652522662b5030e2226f6528e6ca0ebbe82001c6c02fb295772ea5e2f7a4298994e813b2a4e41162bacd8b9df0313f34d7b6b41d6148599a5192da24b3a34b02f260fc721967be13e86e8a400e776f3beb6637ac9342f45ac6205f5c0154343725d80253011ad7e7869d6fe75a22b53195cd39b4d90e2346ac2a452aca0c60f1a877b7f7481736d0d760a7dd973a88e6b90f3eb84220b2c3465c14297694c40145cc245a76a80d565dec8fb1184880bdbdb57657da355ab8545ff78e5cc449cd99cfaf7696e4545b02576e0ce8dbed33457c1df398158175ee161506e1d10ef104e3dc1f1f4b73ea7988f572f5eb72b8c280c8b0b38be863980e9125318b502dc8fd1059c223185b4716d5282e14d5e9c81946ca8eba58ab2455179b843b3da6710e45a7505a84544a212b3a6cd88e0481c9f21f7172be6b95f743f8f058204cae9341456747fa5e5213a144c75d840565e21e4438ca9b2a0e57b8455b0446be1475a3cd61d8b3ea59991a03890dd1a69b17462d4f0a235cf1cc81a2fc6a28765e8836c66530a48cd47adc3cb17b52a7b5c41b927dbd379092842b246892628702c7de4bc6cf4555f21abb12f3748bd00a4c053aa388fa0c7888c8187ad4091f2c6d5a244fc39e061106460f4c54c4c24ae67cc27fdf395f6472b09dbd06895379d28843013c8d062878476b24c990610414529731ccc66056868c6bffb9c32dbb268dfdb9280faad892ab9df3c207a00ac0f51d3ae4e5c8ed39898d21a1ce850ae737e5d3782280ecf5ce0c70b4259c7baaea2cae7aa005fd372820252727b44f05989c0874a50e3cc3841bdca5b09e3cfcd3ab2cbcb99e6c414b836475fe5b2bcbfa2b0cd6bf5286fefc62e8a44f5ab873802ab3d4a149f585cac4739767b14c8c29a43e411cf1787ed271fbc5273e80cf963967253387c9a581978d31b6ef4e9193a44f4deb950988dcb67807260dafccd94ea3793419f969b7919d84810f0c66648004d46076078a4f2623840289a15b418723520d097a2529b0a6af84ce6bc636f62a3d0f916bcb8f1dbcf15e87b35a6597ad2aea0c4573c20e0257a9bb5a1d6bc27dcc2d0ab95657da3dcaa30dcc6ba5d361dbca47a35dab2dc2beaa7974308d963c8438774ebbf9892d8eba3c34e62ea40392a7b3d54f0b77d4552ce9144e4db3e237a7bc8d9c2d24c1d4a0bd943dfb5940171ddfae7e8e250c2ab439bb7fd0e3aedc88d2d16ed9c73072a6b3924db5b26a0a8790dcb632fe96014eee5231b8ea157b61bf914899837349241489037f2e1fdd4318428c6c97005743929d425b732e479ed7049a81c58607f6a7d693aaebe34a148a4f5a601c9f3eb09851d5adcd7b31e7d33c3fdd1ae14a6bfbf92f3390a90e51117bb9832c8bebcdfe0ae70cfb791763aa33546185ff856038e54b4e0c79835b067e2638f5e909c1bdad522e2faf549d208ad35dd94c861fbad470f3322b223c51f41de0f5de2edbda0e773434b3520a0ee1b2347fb3245b56c942b8bb6ac28ba590db258190dc538f95deedd4b27d18eee113d8aa89122e9072013b1a947f469ecf76385ffce551b7d5cde96a812622ffd249adeb8cf733eb062881b7dc36201d906edbaa6a5c506de3532eb592216918ad7fb23fc8cf19289a5e34581b70b3a588beea177d485f4469b475e738a1ae985e4f8c4aeceb2ab79c7ea26564d87de36cdabbfe6ff7ca2e500588143fbb27614373475143d9c9217519c488a23e10440213c0a696bb73e506a57a9da7fb9605f7d130d0118a6420599cffd731babec0edec74006e97d4f4fd9ff8a118a333d272b758ea7b37d27e83a8fc4b9846966eb9bf43b19d5791ccead3b81c739a64e2d9cb3ea4c3aa7b138e7e1d49e3374de3ca26bb6e1cc1627f69c8dea3c0d67f99dc0e3b4927389ce59e224bfd32c4eeb70737b68065ae79a9c65744aaa337bce2671aea7b3fc4ee03aafd4b904ce6439c9ef641534afb3cda57782d7b9264e253827e54c7aa7b13ac7d3a99e33709d47c4d9863359ddc49e9a8dea3c1acefa9dd0e33412e716ce49ea24bfd35a9ce6706edf19689d3375b30d6e4aaa3379ce46728ea7b37d4ed0759ed4b905ce6471b2ef6454e7713ab78e4de06573a64e253a27c59975a7b138c7d3a9bd33749d47c45906675a9cd873b6ca9b4773cdf69dd0e3b412e7129d53e224bfd3589cd6712edf196a9c63eaacc1292bceecbfd94ad91c8fb3dc77826d9d57eadc02675a9dec7732aaf31ccead77428f734c4e25ba39a96d26bdd3589cf3746acf1938ce2b7296d199ac4eec399be2bc9acef23bc1eba695b8b9c4c2a9e6b172363a72bac1b9664e263aa3e2ccaacef339b3e544beb3519d57c359bf137adf349234b7e09c2527fb9dd6e2b48e73f9ce50eb1c13670d4e597566cfd94acef174b6cf09b86f1e299b2b7426ab937c4ed645850b26cd3cf04a786a55607a706c212e77984964c1bf3b51d569abce179c55d9c931e7af3ab3eaf4dd9b53854dca3b6de53c4da7ea9d61c7b91067179d53eac4ded9569d93e1acde19b44e1b71eea29b39fa26fbce26759a8673f74e90714ea97307a79c3a53cf6922ce753877e7041be72d392bd066aab6997a279338afd3d93927e8386fe454a173aa3a39e7b48af33609f55092ef1c0474d636a7279dbad366e6dfe4254898e062baa819cb283595c3851e7ad4b12161a9660371d2a90d8ad2c01b1561b92016337295409c7e988def331a6a4727ad610742b0ee47f6c36b98561a43ef50766682f784de13eb20e88265bb70673389afb6514e64006512499576ef5191096bfab781f4b6ae26d5a325d4b3930bd2169b154d882d8f00ce7d792779ca5fa061f5849781f5d0f59895a2ec1db695415ed4c521fb7e8fb61be023328f80c2508415694047411d8d8b4152a0f4e2adeb0c7c16022aadc9575b308cca4a079b9510f81a9314ffcaffa0575e1cc41cd3d8185cb761d889b95702c38cacf2ba6316306634b867611fbb35208e1d1d3e7a1e99c55bdd98854229c709ad1a0020574a68cac3df008d8c3d4412b2f7de5bee2da54c3205df0525055805de77e858c7cc5e48e4cdeee9541e7778ee7ee6fc6875a266374310dc7f6a0b89a88b74c87de73d91e5512e45d1ecbc4f390dfa3bef21d10e12ea683ccf73ec68e48cf951e0bbf008d3c1e3c5f91cfcbdfcefc5716f9fdbf1707e5a71fc6c77defbeeadc42fec02ffd0b40ffbd6f77cd7f7e41e146586e11106d3c139b8c3dd5c0d0763171eaf1cbdf6d96517daf8de43fb3d2567317d560645cf9c38ca17b2fcf0e84f637b7fe93df38c466ed0d9a73294bbbdd349279df4a7cb72f7d5d698aa94a8904cc92151514d535f9eaa642f146b928d42994e3a29a59e8ee99f7574b649c5fa53cc21cbdb7d20f91f1d3f8ff573c8b2632a0289d476cf83c7141180fe07f3f87920cc03c8c3630a54997e9152083e4313486c9a8b9d7fc4a671a20e1e797b2a8240f3a663e64d6cda8fd8b40eb72a0a79aca97c394462d0831430564410441a2868f2a938018ff50b31647929cdf46f6e272153b99b88c6c4cc405505081dda2c19600b1f3d88407162a60859e4c39a223b5439d2e30889abc499258c3cd18205938ecd3d801123af4184e4c47d3a132149f158e7cf72c8acb1011caa48e950831810b440930c18220b21aa60c0e2280b4dbeacc9974746fe137647cb8509114c646e38d202171aa5b5aadb799435af4532974a2cf4f4c06637f83083c4c8cc111ff7beca545949b92821810193e5b7edef0cc86ff9563e4c0b07468a56fa9a6f5f302f371060cce4f1457b00a381afb375abf4764e8c406ab941428828ce36dd3ecc754fb4a7d65aebbdb4e7c3b23c9f3a316a890ce6762aa2083259388e0ad1c2ce0da2e9eb7464b0ce52bae5d0a276cbf9ed721c07c3a3a1879414427058f383c907b06073a5872c2aa459fa2d09ae4a0ae3e67c32802dac5cf1040318252bcc2562ac420024092e4a423c80859012fc30aa62f5c42979c08a2cbc20b1c40688d31911aa70a1694b10255344b16aa8b202a5258a36565bd8b06ddbb66ddbb4dc1357eb986da3b586a9db1604a574d249e7a4934ea529485b14e16408285a2869365b6a80b2c409b298200d9b39e7953144b8f93160d472b5e5d7821298c2021253cd488a1d5e93062aa870d861c9072e5736f9b01873ce392d96225ba00861d4e3cd961c5a3349d4192b7890a207125498acfc8842b7da23130a0a4276b76a6108d9cd6e9b6f4c8cb83fc088f1f144e59b4925b8d004c607244fa2923c487a3205c48f1f5576f066985182373e94d8f2849a1e386e091258a90b4ae7dcb8eba276dbb6277668bdb5725061ab2db54d92388ec3a9944529a595562a86d6da2300375ac3be567c3370dc065b8238d1a20d9826a33b65a0a00d0f41927481224dd5074e8ee36848bf3fd2a2248488a9129091220749085f9e1449eaa189157c345101860e932ab6ad87579d5cadb4563134a41cc7c57abc3ce53826e1acb5d24a2bc7713ad5b9d8f7d01c7961f7d5711c4701216d0498374dd46005cc93971846a4226c5042c48a2a8c506edbb66dfbe8f68251212f10a8f2821227b66091428d0b8635607c0c21a6471b2e3c90400b29caf556a1304114269650a1818529be7984061025569a20412105b11205e5967c81d281c819264420e64a129611d9102e3708e1041a2735db06bb52a5564a9da627bbad08aece69b927aed6315bad61eab605415f3629ddb6edcba493d249277dd9acb3d6dae5d65a6bad73d249e7a4ef5badb5d64a39aed65a6bad95db6aadb556992c48cb120d8e2833a7172d6bac10d134df4a718589d20b5da8488306835924081a1f4e446da1c29399399d9230e2040d3eae704802d2c4ca9bd624e267a660b166cc91102b78d192c58a151fb51b017eab82e553eb177bc1b65ea2db2a0d405b6a6d0d3160c28d9526901041981698ba17ac5112552220a28722ae5a1730e0890b912c9c8c8182690e6902091359929e20f1a50c5801a5767bf11c778ff0ec4661dc16fb9e1a04e4f58d04ac386da9dd6acd32c5d4144512154794a051784286c810a1c5062e55fca072f182ed5c8ee2b0c090e3386eabb5cc0d34e04025248d9b18ae54b9338805a20802071c5648a3c64d073fb8410302325ba07899406e992356b0880122b52607af833d863bca282759be8c9a18bf9e8a383f4517ef4854e62dbf7e0b3f685d5d5de5d73bf872f5a4f425ba4051e6a16945d7d38f5217d45a1745aa723b15999a3f23b753912bd208294f96288d5ceeb3a3aec5ddac39943ff9176f92525641d5fe282613baef72e998f9e2beae1912b99ebb46e1533b19e9217778b1acb5b9a3a478ec282c773e2bcb5acbf0e14e0f65ad65cc9f4c77eca811a2e6c4120af674ad1582c9629db59dec26af29e7e8a8ec72e1ee39bfefa55c21658decb6d31423b99da618d5c8ed14c52abf88b2268ad48b175ed017f47d40323983be03057d41dff77121117d79b9ffb82dfce67bff23586bdfeea8f985f49ad378f19286445e02cd9d105aa24882cd932a8eb0b3a748a364052c4de4807444fe84725ff41379e2f083577ed175d6addbf930def1389f7befc5cf6f86449cccdd7cf1dd8b97e18d17af33eb17ba6566f7ec784e99e7c441d5f5dd3bcefb8ff51d8f4196fb1d1f5befbf23ba9a5c0e8f2ebcc3b3ebbd1def69e6300e57ce733878e7c78a77f04873cd13477dee3b8cc3fb9a390c2467742dbcc3f358943b8fc36350762039c3bf77910eb9bce107f98741a05dd75131e73bec6c50fe092437b0207c1dd4b554153f3cca9c6f59500d897272443abf13650724677cdf73ef62f5c476f77e687a3776befe48b9d0c6ced7ff2c2843ef391d32bb8bf2ebdc403b41b9dbe2cafcfaf097a42c39a1dbcbdb6a00cfc360df5117f7c177b1fce7774f45fbc2f1f2456a7e278e3cb80fec539e051465f7694251e670072cc88ee7cfef7e6876e2c87d8cff36908a76e7291e75d07c0205b93e754c7938bc80a25ced7ba2d81e73b1fb1d71e43efc1a3220e7bdaf610732e7fc1447ff0ebbe8752e7a39ef6157933b310839df611c39ef611c1cb6780c9f25cef083d7cff7d0031c4c5b3ff1e87aea315703741aa0f39f8e38a690bfffbecfbe776f3ffbaef37debed473b3cb67ec7ccdf48a78b0fbbf8968b9fa20b3ccaafd57ada7afa15d00aba2d1cbfc43c1ebcdefff58e472f7738ba877dc0f3b087c1c4b173b0c8ddfbef3d24d2d11080c1be73a190ed4ee5bccf799defe7bef762bc4bd491f31eda9039e73db1b38e886387e71c7c82cc94fef7f5f5b087e1b15b40d1a4e0ebfe2562d8ec5c81783305628cf05d8444adedf5a107afccf3df4bf4e7119fbe3e7c1747fbafef253e8f38dacc53cbf46993ed28b076955e4d31fc4318ef3a66871e7079be157570d97520e0eaea2a8f45f9c5f38845b9f10ecf2f6088ed3119bec00df4f338828c49b26209ab333e4c600a354c503c91e2841340626cfaf4ffc8e694991365673964d6683359aa5c4042081424548a96fc7005d40e522c51d1830643cd1444d2f848c2e4c335ba1204d4510e6494a049fa53a42f6fd4a43f87dc7dcadda738359d4545101c8d9c214e2bba94a39133e8db6945d67f12749f62f994c7a80e6e8a2c6bab94f298e4fca8f6dd4b2d77475e99355a0318adbf9f35a495b2367da487e554545496b73372dd782375246b1e231376df61083f3fe43f62274aafe85adc1e4be162b9f5eb6b2002899fb8238ef64b0ed98dedc3b7a2572b5a35af702a992d5e93a7b5d8a75c4dee8eb53feee01d9ebfb7d3b32e2c8e6dfd7c5d9defb6af81b8f34062b7cf8fb8b3f3dccbdacb051eedc5e3bd3a3a6fe78e9a67ce73efddd33c318e1c3ccabcf373dc51f3f735fb0ec6f1fd7cee65e8c18771745ff3e474b8ce7df4a96cad27b2de8a94f5ef73db89c9483b312149a49027849f9f31843cdfc51ff1a7cfd754dc7917ed5f319591e4af82a108caff4489f4f3a305faf16aa0810824fe883d7d72e84fd1a3013f7d365148e63159074b4d11983e1e93a364caf22593d3985826f19814a7e17889be3c3a924f827c14e48fa081e9f3cd0830347029d851f3ac55e6167bcb275ff65452c4c7d30f662ef3346e2f50a2c8ed050a163f52aed0d8b24686d3863c520bdcc994476b81fbca23987bc9197cd5df5e969696922c1159fa4129edbca530b71728561eb86ddbe67d5098dc60adb51ff884c993f99aa217262db05c6c5a60188661eb3af1b2c48a970b9ce212285c802e97cbe502673631e2a14316ab5b46ffc7e5fbe4657ddd83240996bf74472b8d640782080f5dc2308104123bd01c86312678618a2053cc5045f327c11f057fa139346bd86b47a1ec9f7f8ce551e8c7c63c22601efd984704cc637a4877b45ec40899db51b357396570ff1efb9f8342f2723f4322218ff93842de9e03f082df0d620e3c86e4da1f836e08b9f57c0b721a9ce4a92ff109356f1b10a55cb16740710c59f8eed2062adbfc1dd78f390d4a6badbf51fa96ced8f7c4b6ecdf960d96336860002229aa6bc2c295305b5451e2084d7e5b19dce79cd2dd5d12910495dd9d929eb283d9dfeb71e9cfa424b99d9290b2bf01723bcd6044aef27b3ce6b13103f940966439c398c7bebbbafed71fe6dffe56c6e4724896efa97079fc08a1f148e1158536657e0a3849d05acfa3aff0c11445e391c20662aa34d15a9fc206831a10d05a780acf07939331501c650643c89ebb7bbfbd8facdfc431841cbe27e690c5c47f72bd07893cffee1d77d0fd0dbf27f6ed3deb6568c39f82df74964b075f82ff499005e2a1d9e47ef256d84c023a38935cc93acae10fb98b33e976f8fd902bc045507431dd7f4f1c47f8b0c7c2431e93df81c76437f17cb0bdbfe3ce1a10bb639facfdf716c44b24b448c871018fc99f33dcb19b9a403c5afbe1ce9c446a51aa70abf89a32dcf195653371c7ef91b5d1861081a10e58ee354129e5be250fcac3c7a2ec328c7f963f85e6fbcf9f381ccbe87cff21f73965beb346510e62882002c9cb920c6c6828c420c3133308893202259afcb6ee0408833dec1f160376c105185c7001be3da2f518ec258bf9bf8638954088cc092a3620b16108066e3b1991927b723b1939ca45988a285122678890f1a62cbfa390aae87e42226b40d494686872d24a5424152c14e7bb673def6a7df7ac6701f89cef9ec5fef311c0ef7cf76c005fbf7b96c173df3d93f1de77cf08f0dd77cf66bcfdee99ec5d36830032321880007c6201c0e0821e000ce1225faad0b3d7cb973d7a06be7ce9a367ac9e853fdb5ebe5ca16730167ac6d3b3172f5ffee8598c972f5be859bf7ce942cf2a78f912a967305ebe04d2330a5ebe0cd2330b5ebe14d2b3175f5e3cca17eee3e05112c9f25d7894455a7894465aaf83477944e773f02861c889e17bfadd3300fc0e1ea50c59ce509fc3a34ce29278dfe151d290a5c5a35462dff1286bc8d2761e577700f0e5e8b45c38177f2bcfb7808230b78c0abe3cbfc53c3f86985bc67c9ef9214b94d12d634c371dd15465e490284945bb529036b206e4e9480f61e20508fa7979e79c517296ff7283ce12e8835e3ec50508fac1462e454d03d1b60fa5d8bf97df353adfda2bd008284f6b9618212d41c10a4d94a1412a8d550ff99d5508d745f7e6cad7cbdbd1f91d1dc1bd9b73de9f2ed7a42e57009c64b0018c923623389a3b546199028aa92c2700130514526a5335b830a64889872a42f0060458485dd124fdceeaced7792a4a2929511c87b2fdeeebf79ccaf1cf77dcf1d8bd4e949beb3f16e5ecbc8b345b712caae51d5b7ee1bcac4d1c1caa8cf31cce7bd8eacaacf37aa7a1f3f2a594d7b85467eab88eced79048e7db07e71d8fb04929a59676b4d2f163b21612aaf6f35a0d8974983c263fc7d6befb56eeba0f2ffdb891c79cca0f961f9301920a1621ca45886a4cd311425d4646492a12e024450d165046a0c51134b98497305ab8b93a12c5a5650dc8d31116ab755daedb627d72f2880086228f08e1b7be8579b43efc225a8bd56239ab755daedb627d720a7da1f86141d585e20662aa343994dca02705edcb3bade862bab74af42b9cca63b24a26d434506c9a0cbdcf0499895c4cb79579bee6d24255eef0462b2f1d3d0dcc43b25d027f3e07763ed5d5eebba679d0e1186b60f999901c0e5a03be7cd9ace150208672a8e955d347524d9f5873ae1b6fa63cd6b9284bf0c367bd6cb1a884e0eca72451aab2f091030e567c3a9557d51c7913721a8e39a7721ff91c1e73bcb290ece8fa8fb2208fc99df269f657f64ab34ca82a7d3e44459924658c4ca52cffe57d9d7bd779d779d7798e579eef79fdd44f505150503fdf5e235af3e7ae918c6a21b74c96c79b7f2873268f6e5586cc3c1a72e42db9e334e229dd1276dcec572d43bebbb15e0d5ed53f24b143369a475ea369f295bbffb66de338ce5a6a3fbc61bf5b86bff7f2bf297d4ecf22b946532c9e463c36937801dcca7e4fb0db43fb9fcf1a35721a96ded0c869d49cc628ed0dbba66e2beb86ff79a01567ae150c6fcc0fb4a2674aa99579862ea66bbf3b36ca1818de90d97a94d52d63e2b1fbed3f236ff2120392dc5d59f31895475ee5342886794a2e0d177c2fc9fde4a55279723f450ec8aa8cc39ffb6fe23185a35676ab9621df4bbaf2e9f3e4979a03262dc4f2cbf4d9c4f17678f4a77f50e46087c79a2af7ff60e64c76ab2c7f304346ba95d3b05f954b3041e60e97e0bd8d2f7f6ffff3441bb27380d33a3c6ebee11cb22a574c3109335c4f86db5329c704fdb19e797f14ec496b5aff85c5f8fe9894b80439ef83600b7704db5d52d65894bf2786c7fa2571a067b244216fcdfd904b298ff526d54454135252ddb5697fed373c7c538691524e3aa7e4def284164ca594fdb25bccc09d52b63c218512f9da65151df2c30f59b56d9fd72a8adbc6a396a738d2a62e3077972bab2c6bd965ff7cb73e32c5b4cbec644c0a75ad56ab35d1fa69762885ea538de5513e3d79d8874c9ff9424232596c8c51993e1306bb79768b683ea17ad639e9e2902f6bb9f328df6bd96bf098329fe45386c17dfd5af69ae4216bb4a1e9337feee0f2266bd9b9bc611c448e759cc065c763110bd95fe2b1d964f9b3dbb48a658d36d9e491cbde437cd06cb277e0346c5c75e958671b57603ad6796c21f2fc517ec953fec89dc76e326213e6ea881644bed0b2e8a0e6090aca0d63b2d038b0d2c30942708511545168454f96dc2c3da9ba420a2a6833a98799177e28c306aa06da7cd9ac618153163cf86066852dd4d0a612543a347921a9ea0736348a1bc24a4a926fc62ba8cb1599ecd9a36477a78d20e821038a7cc8b633e0fe6b0edcee72b526dbdcb96deedc9f69ae978bd1c50d52ee2e5656d97f00b9bd2c6195bfef1aaef7ff1cace103de8705542e4cddc72b70fb136374cfc01f4d28cafd0f766dd67fe068420ab9dffb10fceed99571f1f835f789a188c3c327c85cff7e871e78ae61da9cc9b3fcfdd75f7f77b94292e10706c8201efbb9eac6aacd9adc5150b638cadc7586dd32e87fad2e6dacbe06e176172ba4dcfdfd0ffcf66096fbeb873930cbf5b9fb436e431bf53b9eeeeb7fffe1d1c107f128f3377e571ceb27b2be7b8623c72c37e6c02cf7372ea17f87cddd3238f013b9afdf12294b1cbda73f4322efbf0ffc6fecff9e6bdc19cc3d7ef861fd9d47d8e8fd091236b7af453166c50c3cf78fb17e8b33a898034fc8eda778ecee8a653826732c83ee2b7337814de60d96cbc77d7f7ffff4b117f6b1dc2d91784c8ed249964b3d7dee0d91f7a874ad56543d0c2a24d14004000000a315000020140a870402a150308b52204ffd14000b78ac404c542410c843711407312044210c03310cc23004186408328829a74629000a970be6102be5fac692ba2b261058a3b4d35e8e1c90abd043ec5c0fdc5cb83b40aace515fa310c87ec1a01162e53fc05c43f30c1a425a5815177d3c8158b02a2655100358e35bd867de9c902be864c5cf26392d2ea5e3b052f230b4635102b244356698f203a96a6b83041b7a07897c82ccaae640a8a378f973fee285f022640d01a5f2a59df0cb1785d30a701085b4ebccf6401fda74df48994899a5243402078ae404a1f08cfe032e239a978b56b3e5cb66ee4c3968d6517cfe4e84465a688a62bf794f91b22cf543d059e0eb1f4338f785a1935688645242a4c63d47d4a506d6cfc27b4ab28e67e8bc4e98339597877998b6031da851cb28ef86e961992335b63bfcfec48e6763f4a72d4696c0a0458b230901a44e35423ea8dfc6f65c5803660f4fe44293848c6fd8c0f200a4155b89d03bac328ae0e43bb34ca7a216bc7b0f2831f9d6294a147146a2f5c21ad2f96c52b88f51ce728ab05ec801888f9ce1e50b67b9cf50311b3f0671ef9540bf666b5e6d8c0e15c26006a2e4278977687120d1d817970ae29bb3bb119cce30a9ed7d0b738389441407755c9773090c95626d09403d4bb3f5deaa2fc6ea47e4b8a850d3cb37670d428cc8417c9765aee509893a3928ea9acb6f4ea4486f8ec6b3ba1bfd6977924957cd5714d6ecc9501a0190402b037793056ef43f5c985dbc7c8361eb7d6babe76b5d41702513ac848d797208b8883fee4ad736e291dfc2606e8dbfe5d6632201d4fea3648d214e669a32722e1b323180da547e1e413cadb479496a405a64f29b3670ddb1145870d3123187d17a41420886920cc7c2e1b3e2bb2021522f02243be59c0a715e18b2359e0d92f227e08758f38ee2f4da111ad00ff1ce6097788ec327235e074b20e3eb2fc00699fdc1be6fe4b6e9060305729ce1d4280af9313f601b0f6ec70fda573ed074dc189370eeb5fac077d80d475c3de1716f3180dc8e7b9a8639a50607a58ddabb89ecb9e6550c5820380fe4fefb6db618158912b2c16cc0c8bb733c90c3721ec89edec3e6b00a08badffe0b79f83aaea08038671432ec2a3b503d66f019c29eff9efb18bc12952c44d22cc1d3cc07c67c7312f435a8901ba3b5fd121e27956ba6d2d61ca4d7bd4c9148d806d6256b8c82b6a2e5d4aa91c045b8828a49ed1b03c47261e65d3eb4a2da916ae03bf6780305e7e374dc2da92b416f116f0776b178b82be5513f59c7a9e8c42f8dc265b1b81bae8a1424961e9b8fd04566f5332fca2eb01c55ea2e5671f056bbe01351165d96a3d99e85c4dd3c39bf1d8a2e9eebb24d9dadf4fba92601c47158f7716167f041fc242244cc707a87f82aea3989ebeb93958b2690f1262cf3f86ac82d3e711289e4f256c7c0a0d737e86fe8ac2c620205c4baeb83d4f5429ed7dc9ed26f7c7f50c68a774d2c3c66460ad94950abdab83d47df830950ab3a3ec2097262cc8759f7718980db77e727777b64fa1f231aee852dcb560033a3bca174f595900f7526081c099a3a5f972675dca94c594b56ebc25feef001153e221b41a08be6f9f9a8f36ee689b47e13fc2f20721ebe99709b20f69e0c08c3a11f8c9d84ebe690cc308d5ad4edaaf6b1f4b694630f5772e628a703d0e66ede4d07f2d5e9bf1c5203888692506863e575665a7d62e2585c4eddee712c3c828958c09ec7fc40113e3776fb30929e97637e2d828f7b8ca721571a72fd1e5eeacf739226ee537092eaf35ca021b0a692d1b5d5247b8b841a5282c21ebbd8b0424577cdd97307cd20289ac516ca8e89fe7c8c850f4f6edf35cefa6ee6e767ccf53593dbeec981726c7e831e8ccb515aa38484447f88feae8f2ad7352f1224377dfc63c21ac8e012c5c0f51f1fa12a04ee062403218efeda7f75351740f4d18297d11a900f3c6d1678bda37232ca4e5553025e376d4a01d34a15a34c25285d09dffc7042fad2484a668c5171fae4f2b8cb66b0b8d2cd4d2c542fa087318fba2ec8cd8e80522f68e8bbaed6723afdb638cd55dc508aeab5b88dca7562ca6b768933924b0bd63ad29ed393a6354f5eb59e7603ad18aa8e5672021a2c109b20ed7530435feb08a776859fd66f2c65563c0cf3e29746292093cf5b0799c43e45a6afd8b1c28f65925d7e58873589d36c1dc9102452db7520969944493440474d14f28b7e67a7c1c9dbf5ad43b451146376f196280609eaca2e7a25c8c4b200da768a3b60595e1b3e02ecd7194f8a4f442ce4c198c9be8b40f88e369b61d4825b427f86c33030752390bdd991ae4f054cfefe618c4512d0fa43dacd6581428f975825e30bc229c80c582b36760555dbfd484d0ec0cfb4d6437fe7c8d63f89c6204e9293f4c3c6e0cc9f257dd58a540b8c4cd9b2bac3328f4610152f60ba8308775d935a01f7fc157cf72463f353b041d2001aa2ac27de9949203864bd6f3613f1b3b9ded6f8cbb76172080773ba28cbdaf718b5978244a0af25ea810abba91a10c79bd6cd914e8d343a2718f1130264c0796e2ea71a38d1a20a72fe7ede9ed21a2d1910498b1a41e25d00ba477f87dd4a2c0a89285c20164777a66c0e67ced8f613c60241db66a2ace381029f254149cbcba763dfca5d579cc165cedbaa33ad8a734646b9fd9cd2dca528f6b395c07fa1ab3c5017a6dd1e783e0743c32006922944ed0c5fabbaa1f3cbe057b3b130cbbb6ca2ffd57a35e3129cf61aecf416ea16817a324ff9327413dda1c7b0418bb9fab23f3aaf6d6c2792a2ac69ead6e712080c6cdccb3bd33ff34e454f01b7f3767aabcb9c1a0ce05931ea7fcca45a3ac41cbc2eaca5ca58ae4ee5867406ad9b50cb4ae2699c2e22a7d22e546b8a0c1c693120292eee7c5faee438b850c3c989dca76ef711f4073e0f894116515a62b09d7a298523cb449850189cc43172508e4c56206c037c5a4998448e7543d5b1b787b837640ea2899f524461b0e14ffd2a9fc5b667779a80408abd1d9dab2a302271da69b8b526185604aef08458048d454da51a26240ef1a82a2fda7a5db51a94a0393919c826074340ab880733a40806037a3eeeb2d48a15fa5a6741b7b0e05abfba480d92a919373ce4e9f73d66734257bf07f0b89c59f647b82ab6566998a8cc2d0bd93fc9b17ad17eedf24a816fcb16b5e0d20886cb1e3ef4eeaf9cf8a73b7b76530f574dc7552c13ef4785d46515b8809a7c6274cdc2c5234090fec5f2389da16ecc409792e01c1b38b8894b29ca0b9e3d2412157b16bdf0d3e610913d7edd960c080688b56497f7505ad93b7e2ccd884376e8babaa83c7b21833d9ceada4d737bda76d896b9b6dd179d50268c29272b34330f1e25f7b2998296a4065f7f89bbe5676fb67dae765599708db5b3dbba8f5d1d85598b4dea064d8d37ef790295320680def466f04a7b7af7347d7a3c7e7abebacee3a87e3c0cc4e708608d463af84d5e8d631afe3a6df7d63c203388b6e841ace09796aa0600ef0ba9221b129a28f595668be52503c507966baeaccb6518982367308c0d2322e544a159476c2070e997420e500c3e4874716e7bac7807252f2c4cd7c47a215e060ccc91bc4be6fc9513fdb785c6b18fa1512d39c75706ae5e50247b6cff44910c0886649d057acbb31991b468ed76758cf67d197ec18ae8d2e3702e2d29aef852f7eb9570e22325f7a5559bc248e3857b06dc0cc14b2e795ca8f27b9b57b9703c810df4753c784700cdb41caa09a7cc73831685ce83746a1349f146232cadea67a5dc567c8e57cb6e52cd4da634674e113f10ceeb817c610d2bb14696bd296c8d01d607d6adefe224e025c672b48603a3c4075b52cec447056c132ccf063853984892423bb812db3cd57f2d3f2592c4135e803abd033b8a6a5593096fd5f183cb8ef5f1923c8d4ccb4db391b427400ffa05d884bf57214957173b717a0148f489cd081a0c8823c961e5544a7881d2922bb15fc6a2dfd03a6c7d22eec2b00ebe7ef74679a3879fe46fb28534a4e2e8e86b5cf0fa9016f22612236f23250290fc4d2ab7a81cc5076e7777cae843ee79990241ba21cb46c8f365e828b3463d1db9c546e58a07f614fe27539289d111d539f0d74054db387f9263d0637476bb0e6abc3cc932991e568cc89db5a70b82a4ec7cd1115d7e926225e07214467e368be89a627400c8f5456cfb0dac4563bae382948ecac42643b182074216c2d32fa01911861df72aa085f6595500f03be6ced07f047c443f592389e541b988b3112d6d147d989d839ad73557da48c1f2f08e3d8164bce3b71166ec695a9338e07336d955370c3b83b179f383ecf91a1824c2a778fdb4a57563564ef5727a2648026932a0b7c40fc8d3fe72db76b29ff69bab403aa004b93d13161cebb1487b2a672b7fc14d67b976aaa76825c886a15adb13c69a7060f55ba291cbb817b8d75a5901925be219ebd4928d5825c1d542870efae5229e8788b2311f466c7018673f2b08cbd849dc54473bccb987198d9be5f6965896699159446cd087b3b04f2a6900a88588a08077fa8876fbb5d8487d33b6bafcf02cf6eba9e97a5803bc1d509cfe46e6a1d91c088da37f0a65369bf4c725e44b56f2e7786278eb72e91fa17ec21f5b4b3d465d24428538a2261609a06d0774aad0ba85b50bf940efda7f6cc8cb9d41a6836c608ccfc0cf8000217423b2bed8f2eb8da16aa4862286c70715d2580d075f2819459a6e46634c520a38ac80a987ba48ffdafabf66483a7760ae39b00bb8f738e29638c4ae8195af44d55222d19a3f4c0904db48a382c4401449b5014d881c2f38dd83916cc5c3001eb80dc07229c1d622505855c42cb2a0297bce4b74976d0ea2d95c14e8c290b960d1edae621c99b650268c0e6d1284a9a02033517c8ac88bf6408f4a342016e62db6556b437d30878c34a4344f011585e544afc2c87fcdd5a8a42ec82b1232210d916752c0a81c25ab306b526ae59a87625421afc237c2d430bd5f71c15f3ccf47b8a97f9367c42d61f7b4b9b44d94d36e023b1b77448b10f898d752699e2950deb0782da90d849d1b877206c9900c4dd20520ee263bdc818a342939110756a129567f00a68ff3388aa664f78eab546ad39326c71a28fdcec13ac39a3d1be68fdb9eef4113f5f9ee07a7178deb2f6fad0f11e92f49b9f3e4cdab50f95b0c564c52e5c1066d15201adb8e84e84ebc5c77d83ebb83bcbb435be6d9ad0a835963afec3598d968ea2323260505b2dadfa99a7e4367f79fef57a8a17e1e992b32470a1050a1317e79fbb98ec7141ec5da85b8530aebbf4ea39e7a03cdb45e610489247b92b2f4579d7ede938314fbc6279ba2c825d0f261bb538aa840515ff4a7b6726ca6af8f5f25c0f33c32812027b65f10da2d9b410b01f0522c8fb6853758f0031faa5a992b0c9aed4fe1451758a88092415c7277a8823926220bea61d101db2b41553a9474bddb0d7c54572eb4eebb11cf0a71b4061ce252128d96bb9e7d58bdf65077fcaabb9f96cbdfaf82d7cba35d23c46b536d0ad4f555129a7cbb5fd6fc5640dcd059d5ce402af31e07a1a45696808973fa01268e6aed45106f04f8f834f14dbf8339f9e1c18ead87a0054dd683c521cde1a284d1fc17a7c3324373efdcc4c99097025ffb1c19b76e5459de2c0c7272961452700957143f624324c4309f3dc9502e6a68aab3883f3d2d7543f97137262627314c5f8e847a859bbb0818ccf6a4ef431dd030fc8a400ce46ca56a94609f95cbe2086bc3e1e0abe95b5d76825c2bf926552f9b118c15a6b7ab2d2377e590d865a65ac8d225e0cb27cbd7811ae02f070965ab0173044af82082aa7ddc118c1acc61755659d085204ce6bc54164e2a61a06a256354e8ee90948c42d190d2aafa524c0550da409732fed83b42e9ca4e31df2eea7be341907a093accb80ac4207929dce2773d337049f2a81cdbe634a1663dbe445626d452fd5c230cf16a82ea254236503a97dd9b87a50b18d74146818a3cfbeb63e2e5cbc36290f0bbbde29c28eccb59449553e2e9d94c298cb146c4bdff98fd1ffd98ae401e6978c536b0df2cec1703393ffdacc87daa3cee32df4d2c32255cf2e3cf32484dd92e860205409c883d8336c2083a70174bc7dcc9c0d9ff9e5320ee6c02c66e876393b7af9339489b7732e2d78ace9db321148b75f80785995a1f22ecdf0ff8e32e7bc12e7457343fa01240700acbe0b61ad17da04325ef041a95478cd8734d0a1efaa32e2188a03b41121af137ed826a54bad7f4ee13ea43fbe9848eb03f69c223b69ee684e349a6b52a4473890705cd56e4fac769cdb3b40a7a468cf109184217769d308db24511230a3de7e2b9b5176dd50cd0f5eedd6271ecb3c53abdf9445d13643caaea0e5d66a7afb1935b869567bf66204bb0fb1b74a860b14f377d068026e44a0f5c067eec21b473613add719acd2d5060264bc22105cc4501e6145b0b151ddad47efcc78d6b325ef45e981045696d5f9ffbed13f57517a23b46f1da26fd0b2a9df360b0dc5a62b5eaa3f43008004a210ee7c72cae11d8684efdf557ca9af50eec619ec8a0ba7a51d10eed0cef5a8cf9c21ef4c4a996d519dc01e64c2794c325ce841a7f7b98242553300b69cd34b11c16183d4e687922a327cae8ba0e2f680d44992ed5afaa46cb81921c2adcb7a4362fbdfd6c84744f1025f2329ee783b843a773bc4cff79ddb81f11a9541d9cd449d56119113c480be335a1fa7724916286bd65f32c2a7aa19b62a531ab8e00f8cbc6737bd60a621487b313bdeffe8183c57992ddf9068b7a31745c3217d081bb5c1228a1fa48c873ad721027800621c9a8a7494c1db2790baf99b1020b169f0319e0cf5b948fd193d1610cb4ce7234c2bf112c596ee63e6b33361a9d660ea5035f9c602268a00d8d4c84b01649e8236af54ae8cd1c76570e86d728105b1bf950da6d6003988af28467200a37897359772c65497294f42a917924bb1af2be96e80b96176456b46c03bc0952251612856eb2562910ab6cea192b86cc228c06975f4428a6e8a9e321cb44f2d22b5ce9f06ebc240bcd147bbf34a8e18994749695f9b955e80e1177cb859df4efcabad6a32da86d717f06b0c2ad6198462cc216bacdef72c52b51fd8fca4f1c1dc8da14e3c446319bb338176bc7ca8c60ad5db2770a004b84b533f08eb05d827480b8aa53ceafc78a08c6667668a4f4b6293a6a0fad3e0f2f9412df7220ff2aa4b0c9a19a20ec9e463941313e052e281b7b7a5c692bd5b160fd7860d7ad2b9e07076a9cdb3d625e1b0159d3732d15c729c4a8cce89b12e4f1c172a290c38196d8dfd0f3a689fce9208600871670ccbad71232db2dbfc857f5f2327b5099f54d053f77e08c1a9411e2200850442b96b10f2c1955d4604888caea29904147448ac1f0b223e662e57fea048806fa0be2f67babe3191fbf93937c727e4a42ceba5c8141aaa38d64a257c6332c0cca07cd21e7cf5e64914955b2a14d148bc7ab33a41328630309470220afd355a2609dbcda016b78478eea75db46c40620067d78755f8947700010e2c9fca0da6b8b38ab61fd45dfd0f16fd0d9529d55e0e102a8e36bee8ff9c2139426db440c82e423083180ac61d0a5419fe5104994ee46e27259349c403692fc2fddc2543c762dfb6f674ef4a7febe41347ef3923fbed631d8362dcfe948a83d4d36263e0faaa68af0a7632174d89ed494be754e5a10d0c2203cd626233dc2c8572444153e30d7d7fb9862960735f0aa26a44b59e2fd540410b8cc354f7c24bd50c99e984ac38206733453411617b1e1dd8f7858f95eec046696721c3756a7e4beb118845ac4b0eb5c1b5c3c312089c80dc13ee75320266c619bb0f744fea26f6ba11f7ee8fd6d7073227c7d9a7293f8bf07851251fb99f259b2e8fda388ce8bcc2fe20e25722a8f58b8470601063f2ce4da5f9a0086607b4739e50417687f0f5b1ea13c3b87bd113f6727cc19516a98f6770f813e5248b7be55189a857710fd67a522e828f2c318c222a31b9eac5f85ebd18a7a74360791efa08cc0c1f070d78ac8b6a542790756564a11233208c8b2a768a8b29adef9ada91e1db690721713d7029f4b7ee8b4324ced6edddbbbfa911cb40e129e00f7daaccbd1aa6639fb08cc8bca87a4172324f1532f7b41692fadc36b185f1af9725cf32b6c30c72f9c373087399f44ec3d8c8a44eb28cadabe546e85fc0bec1a4475a6b33961d92c49eac203b33571529cb795fbafa2e503045a770e00d1ff2224a6c38c33911f4671296755ec51e86113e682238c20da05a1e921aa1e6d810f3e4412670e6904ab253491300c55530b492f6042bd22371028c7bb1380b8f4ac1a841ba9f473b6b4fa891e583570856ff925f4496922429f1450ce2253ef9ca049f7537c20c6fa0e5d1f95a05a0e388999890f2a75d924222de39b85e238e4061107a4bf58f798d7a1526b7bd92b163c12d66c5b277b40be2353c53c9b84c3f3d61940a28ece5739846c5d19e21d694f59e69f9f233968e20f67a6ba725f5785c8dcc53a56068b5490db9c3488c9d12f56b29b672036d192dd63d209647fd82ebb2216b7e42ab29d11114a3f6cff669adc6b8a2558a4c29cc04a4067b38df0286e305ec240f6a1ef827f5b086676cf2706002338def28a16865798117d45820f0a190bb13e90c010690652cc1b42612832e8da8443ed09876ef590fb21654d2bd5a4cdcb894c025607f26bd70b72e708e2cf099a51095545b00f64628cfc546f77c3d7c438c3b33ab6b26fcf98e3d005d2957486a0019483794b992f0f21af981bd24a454201842dc164f2670a6a1734330d01f18fe9644572dac4bfa3c2e033064adfb762df1618d6df0faaa61e9acbec42c70eb47807487f081a599e408146cb61dd190c07506f80d6f53fa3e85cace9f540a3444ac9830bb68435f8f3755e836684ae62c839f550dcf1e3c3af3eeb0f8d2131798e6e8a8ddc350582cfd43cd5e0839353335832009f6ef2259ef6fd75aa8b13509133c3af5a873c07d0a2702c7f7e806134db2250f1e4d5f46ed1905dfe058061845b462c1845520086d132677ff985b1c27ee279fd5f45a23e355b85f5cdda0c2b209522d62d3bf5c808014abcd71fdbebd6b8ee0ffd40f7054dded04339a6d5424614cf41553ce427b7ee26105fb1788f204a90af9bef0ec368f9a6164a3ab3ad47236ec63589b195972e971bd1b38676b8f2cbc562939cc5c28e82c463b0a2f3307814124629a514c334544c7a982ff318702124ecb23924c92bba6cfef8c6869fc330e85d2640db11a96f9e1706746dc91c0ec3880c40b82a3649f0461d18ba41080fbbdde29220f708665ae2494a2388c1b8a4d3e5f8410b64a3c33092b350290acc7cf26c8bc3308697a8f038e47bee0b2ed6870c83537939132c09c02160b309fb41be1784dbc0a97a61b0e8bb14171a7dcae68b5365ae81d59ad1dd5af72d805d18a758a8279ba460a061f85e46f094e5aca83bdaa5da297a4d3aa4627647e4e5260bb64b3c28ac39083496052b8c2978730074586b0d57619418050ac4eed3e310488541529604c5339964626c7036e59f2693dce45305f52ca0298ccb349eb5f70a29e7b899952785a1928f05c0bb0660c5bb9638620df44541e5ad64d304437f04803f3217b2b5c773900ac8ab30c2f01b1cbb746b041e9e12eca04b848c08b9d646869c37d6594327635a48e62a5f8bff3e62dbf4b7dd2b1ef0cadf95208cbc280c9d29775112e512712a8122b71f01ba3b1fb0b3fff5a0d0634c06dc20a703ff7755decc9ce4a60d608fcb133d27a4c92068b5caccecb13566827c5388ed79e1f18b0c98725ad00310d5c84a29bffabbe6e9ecb82d086f516008a27290669b110e96947b1508c949acbc288579935ec137733b1029c06b157c392a6089682d18717942df1ee74aefa8998fb5022693e4c4636d34c4d128d332c8beeb11967e7b4e3ec63855291678a7590c409a8f132f2ba6a5e3afa2abe240be65b61d062eea91d8a4dba2777d9e6a5b530b2f65be1f1be70306a902e7b2e263e2b2bb2b503b032157ce9ca83ff10f84718712522043c6851f5e153cd17a2a2beed6345ef96287d8a19e386937bf7cc78515e950633c2819815a9ad85c5b12d593d31eb3b367dc1c49248b70778c01239294e466d5da86fd716dcac071a57a51a7f79a4ef07bc3ec21dd48e55e2b1b688f1522a3540183f131b62a858b5f22db98ecea838acfe42eb7016504dbb623fa72ae3667ee1f3db29e8c2b64bee35a4b4a306165a4515f90291264e51f3c538ca3037634a747830dceb2beb06a41b83881318a0962cb618c23939ec3d63fc5ecaddb155af449ef15a89e5baaf04e714239e03792b9e3ee17b4cf3328d441d203a5effca12b7251117905b569b16db63ad58a415ce871c6315e34a601f7e332379b6ef4576f7769d072d8042a4c538d8ecde2c6a2c91920362b085bc4e99bf8b66c622328fbe5f7bc4cd4ce0c9488631392314e039af2f96a5e31f6911ea6099ad4891de9f789c009366a65609872943fdd015c9b6caf25a351d5c37f9232752740ec69d9fa409adb371be6700f04285d8672ab4d3debcb9c19ce079faa126f6b7f47bac7d02351789a640b240e8ac6e2ebba9bbf592640c652c0a47ef54296bc9ea26c05a56faf4ee1cbe28e3ccc54738c00208605e0cf6ab0a0af8cdb1299f97550b71dd020f631108c07ddcda14b4e0a26c703cddb06eeb9c1c29bdf050ca035658f1f4685ff9e682450988a5841731c57581797f837ecaa04944ed0a121f02a17a4c2fe35fe64fabfa16ec8e3ff208bb354ee1090a3af5a6ca32ff8cc381acc981d56e22ebf1b270929135f6903b0f197c0c0dc76a0c0abc424ce8625d8824b9c959a17fe94c684124785b17f4b745a73ccf5ec05313576e326743431a1d438d21d75b9e9ccaf59d06e7a38ea3b5171efa1a53b240b2eca7749686cb66ced636592c19a84c546ae1c83e6b8914abd2ee64cd3c23983c33a50467184292d19e88b289aea8a8e7553e2f46320513f9a9341667146ceaaef03c1b03dfef28f1182546c314f9a68e3fde95c99ab3468c036b4041b0fb1e66cee4fd2303fe09813b75f0034258176506d7ab918f92b4374533d82ab60cc93aa1ce63a4f928bb192b9186b5f517c0633984a82c2d7125dd23f7c2103bb45d87b5d99f66ae334b5419b7b131f1ae46d9991fa988b5632fe1e39454a3b6694d2999218c37f0b1d622c370e7a7411fa8d2461431ad90f579cbd3a7e1541837841c880519fc7d0d482c6e9fe68699397c47524c3593f43f0169ca3ea1024bd12d2f9055d1b2c7185918ca6d0d41bdc7618cd8f288f35564011dedeaff528f90441e82b3535fad983585b9166c611f88699fb4234f84a7af7a76f189aac0be2e5464a6e6de580046262051cad6f5cf2d10cb40ab1402a2ea53d2a57aa2a03534850d8c4cf94320c679d898176f41f65d3551d0a12f324a8813d021b91019f1fb7d2bfbcaa167a623d1fb796b4c4ee73e7b994dfe3a0ff4c0a2f9a493b8073625a31183c515df827e033eaec71cd3c5c8b0b863ca7561f337dfc6626ee06dbc204b93d77cf86b1e5b80b6365d9d3c1a3f1c1bce13cf1a8be2e11ba5966d8f3d7049020a92006caace0eb198f0d893ae3f1725e4bce789495368ef738f20e59a85f6ab3e4aea69d20392e0c19115578dfdbc89fb41db5817e0e98102e5792abe9a6c23fe9ce0346e6e47ee581292c3b317c59bc2338bd875fac60b75447f0e797fcbdd3f0c067a4a8fd17a576a917d44284a016e0ef870fcb30283916fd8b9637d2afe088df2c120cb082e304e78c29ee5758608b0564abeb716bacb47dd9e147ba3f829db1f0ef9a50c181517b3bee47c201bc72e1bbc86b64c4338a237cb35c5954ee208e0d8366d0c1cbf6b376f0a78cdd4219d65b5f59a1993c48a3b66081be2f190258c9f55393ba34ace7c2fd7b48387d5c8a64216f039f8b760da25dadab1efbd0f89858b8005c8a5486a80ed68f70066a9cf9ac80dd1ad826f4e78b5134991a8cc89a7b106f0fc6371498bc1c4efdab740c4225964557e63f45dc0e4062d36e4547586b3073747a94476dfe7f9facb0c836ff3e006c21d7e6829704d54acad3e79ff76f389cb7a59e2786089c05b163437c4274fc867c1252ac14269688e0e66d296a6a2f848a54f0d6381b2baecba38c7d68dde03fe52beed6e3b9b4a7cd697d68558ed372621740349c576fddcf7d5f1b4c6cd100cc3e70eeef1d58b6a513dcef814bb2f2f2b76393c999f8e7010147d8cd0fcf2023e0c200d659014ee1778fc91e1f4c78cfdaaf1bd44849a9ea1e8955c4fa7b229ed434381ed202483279340bcbdb0cac760d8a8ea36680d61755fb2ddf27450ce089d672c9badd73c904ec7ae759f7cb61a2db84990063d7e065079e769fa33485adb421abe96bbd75a6dc00035766888b7d79c36e6afbbaa88f5c627842966c1b644bdbeb223a90370cf646c28a25d63bc66bed1dd4a9410c68b802343df55694f8557ede545ae8aada2d06ee1de808adff59e616568149a404b8a4915a0e8543518b14680c945b7cba01e32c2450e946172b71f24782ec6670d92c30878dec5a08f1a3cb989dcbc74eec8aa2f7e2f7ba4c20285b17ae26ea1aa71fbcb3878edbad0c0f532d99dddc5befbf2cc568f5425a0684f535d126470f0ed341806f4a0852ea22ecebce7e1093af6a4849898901497a8492a006e9f336c4e8356a2cb15aa3ec7163763ddd4ab160e0c1c050a32cad87f0adf3f9b6fb584eff736fe1f03bfe8d3426ff0e7ff81646d887f1043eb0766fd90f5784e9686d20479f04ca272d85cac4aa9512f2652734bd720103e619f7ff30cf5115edde481b44b0b5efbe4a784ebfeabe79cffbcaa1139172e18b25bb5625ca7dd928ff739a8a0f194a4601b74ed52b29bf9591585c59c394c623c255f9d3ad4c6ca27a76ba40b4ebeba9e1330a42cb95b58c25bb1c4545a9857e92151a06c7d84f7921f7a412187d82b6ccd96ec4a30c3d1bdc05e85e4613b0ee795689f30563661fae1c32404ad448fb06602a95c5366d7566262fc135718bbe498f06c8852f92618c9658462cf2878f925927ea5aaa1bd76d83b4b447a523bb8ee6754414eb2cd97bd150db6423839564a89d59073de43cf21c4c18742019017a21e5873b489da750db7f25cc18974c671e333bdd1ff32d0c32b8a194a9852c32a920ac67873b0e117950ab6596ecd0a0f6ca31fc226130d72f67cc4062414d915d2e8b331580430dacc7b70c2c8d4c77c2198fa0d6c7fc0cdac4a1e4f52749148014d4b6c0efba512cf659b9699e43a5f83919a20f5bc345a6475ddeec73917395d257de472c74f240d54fab1bf5de7b8ecb7402d1a903a47bec58564a24019fc0f9f3e0a8ab03bfb6dae3ce58588ec3f29c882ceea3669ba9e4c22af003ae32d5b8accc7325ce0a81638de5d836f1f25c55c17b41d8563ab75c2e745e495ccf22c60366c56d4fbc5abf9efb57645a3ebf59b1695bfdf79bf832281c08cd9ecd53ab6fd2308b2bbd0949865f217f9f70701d5f9948cab48500c7239638f497cd96f2a70849d676a707087bf259edbf2a9af738484ccb3553abcef954ac3813925132395c3e1ac9e7194c73e6d0f339b6120f196b9b7d996b135785a3d4fe3ad64cccc4979cd5b193f7cac76d86550e5140189d77d01cc80e0ff85262ff5d60430cde9e1a15a6f4797980ac1c618e6a8d1c21b8ddde56fa674c73d0efa3c155a66d25bce720e551c6a7ee84d4f897aa03c969f6e861221384cca13ae660cf4e9fec07389ef007997197846247f8e4e16b72114de361a5bf82f081702a0016fab50f574f38d2ccf32a1c6123e09f481c37335e1d3fc0d9af2ae04086a637aa69043585b1c2a357b93c5c5b4ff388d923c59032e6399dc8f862d86fec76c4947837049ef82388f2680ebf783ff9fffff0a6de1b33e0541ca410734dbe1f9db0a8d34da585d2fa9587b0fa7171fcb72635a394c76f8374669d921c673d018d52b92555af5437f5b6bce634d1c1074addc47aa6934d8054058404cebf9e2806aa9b7d51b84695bd5c9b273ec6b93eac8e26b50174cc45e2ef39ee25ce6ef3c2dac6179a18d54d4a3f04c3f5355145f3a31e7ef01f034354d73ce276e2d0e1b16a4153fc5403e7d057cc45c97c96e1c564a6214b020104d9e72cc9fcc8977f4bc409df7bf82212afdb026770fdba7117e9b2d08833afa41fbf59d02d166921bc2ee2fc6b665f3b1089935959e6c4b3df51ab1eb48d77c4b96e2bf9cab985bee1b2429ab41437527d452025715e12b5c4328d291355aff016d55de28cd5e2c7f2ccb1452390b8c409ef87f2fa7a45983d7d50e3e1bf7ce924ccc45a1d1f0761f05fe9382aeb5ffea816fae129aee6ff393d5b8e8a02f16f7ff4ca4939f0d683536729dc1dec101d20bfe7601d09294044091f8efe95de993fe455f1f56823bc0d2af9a376371580572e5122539e326beaeef86e2a22b9742b90ef99616819e89075dec4ba456978abe327c0a95e9c738a53082bbc6384b784abf38a556880026aa4b8a0131aee113cc60d3308d50a253ea0b67c28f32bfa1b2f5c6eb88baa688ebf71217f83b29b0bed3af40a50e48629f0b8a9adca0a79a9ed626926d3264f423ae1ba73f2e49fa3234f84ec6e9bdff6dcf08bcc363a5925874af95f0a648672c358298e670361e39321878584ba0dd37997d1e258881bde803f1396a0d6dae5e6f9d97959c6b9e1336be383896d289ffab2f34551be8411e28a889d638d110cac94e608ccc250b8b10944231c63be0365c3e09cb4e825418481928c9599f5b7691441b9ae6ffcc54b3bfcd3ebe816b2e944ae3daf5d86a4a5892469b99584c6e5c6d5a0b5c307c8a4d3be56ca45fa76c1199ae3d2915d47f9ea53483343627124bcf95102421ff20a527d60cd02ebaeece410562d568182278f187ce6647aace2ff61862549044c03a424623ad6e558bf293d6dd25ce0db98e998746f45b134b0526cdd648b0358b3eac137c7c83275500d42de5a04d3e144e019e01de79359605d035b82dce6739b93e2cf7c335d0ed7cea523c09547cc8656bfca571a236a825b3655bd333900524af17b6c47ad484e5874635eb34b8146cf15690018fc7d42b7785f244ee4a56de4a316745a8bc38b3c5506c7a24e309b13482c20bea3f32776f55cfea647c01cac1d8b9efb5c77880006636b9e711deaaab9995bf8d97b1c0118ac1308b1d4ecd8c24e1bee06f6b419b558e3cab31332c8dee3d65d7478951edfd4e5f0becb377390a7fdce55f37a2b85de2bc91cc52fe969c93de79ca933ef4d9deba2725b5d5192d51b2d7afe216e5c6866b599f9e908ef8dc3eebc305c89af86f363d922884f41c40b83942677b0f323252e269c1ac3aa94532c9d7370d18bc8282a5b45b25a2c13c9486d911c40d6addc72e08dda0b31d4cea546e786cd4c316f982e465a24ef7d266127e8390a7ae757248ba074e42d3d8e9a188be4e1902fca27eb17d33456247df02c7d09ba68e596c124b1056b39c6f09112d30101e89fdef5e5d4b122f9a5d7d008cd8d7e457212caa5a41a1f8be42c1b2fc050423f1bd867464e67679771d38b6448e0bfa932c3b477d1c54872002a30b91f47d919c9d1091ed1e9530e424a7aff935c854d094539c3aef11218ff89824645043f728a0d1d621ac9bd426f9740ab9f0ae5d943d198173212a5524cc4561ef8b4918363484eec32cd4652c1f719e97861bed76f1e822ed6115b1e754011de2a714a14ced6679e6adf5b61d848e8e4fdd98d791ac9c52337b2ba9265df6f426f1e4b9a7afae0bdc5f80101b3f5e2bec6774c0ab8b2f8d6919c511f6422588bb2757346505838c8045215187d3d6610c7987cc963fd7c148c7af84fe348564697ab3df4418d77cd9e8ea44d2613117aac474350382760b5bb614da6a12476321502e525765d550bd38a153b1cc9947f45800d9b1c0f712431e8303381b2f5347b5730d94a473c1cc99bd8791a9871423a9e15de351bc99743b0c897ae13fde3bb558025249975cd226277cdf4894eef7bb463b8cd0e8ea4756846e4f61164df54a9e74f98ca3e3280019c7b05eefcc4a40f57205c554d3ada98c419d2386c38c5c219d2b45139918c1aee30d293a51b53d44e037cef8bf302683a128de4408010200073358c21d089f7cbdeb5e0342d4ad9ac86d16454f7f2614d8523fd5b23db08516bd2c8de5bee1d3410fc0e510fdf6e417a7b480933aa72adf7268c87b4f810b1fa5c26be7371a5ecde9a5d5c1f1dbbd6850bf9dd9c8e00ba7c3c11fd17af8f8eb5fd76bc43051bb648587e25c5a7a213d10c7479f8f144e4327a79b442aeab4312e5f0f6bb69e1f00458821140a10d64b094196a3753ae9cac9133f6f4a6bc5d2b6487428bc30bd8d8acc561de30bd0d1cd60dfb9062ad957b3d4fe6383c44fc2626a2c5ae2700c38f128967e508248ee020c5e0840c76da06b022cd1736bcfc1210f6406f0149947ba068b14fd500763bb88f5209b6422b00476b245b233dc3611fbde121e2fb3b44a1ca3389ca90444df63aecf2c41891c1deb154c41365bad2e27d5b34f31174514d004ed95d7c146f483fe352e6e28614870970719ae7103f03ff6871f134f847119d1617ff63e62e2e65dd06c019a799719ad3c85d93b13ecd392359c3498b6487684c68064b1a6b81411aebab80c0907ee63db290e21e3a2d3e8379249634761aeb4b99d82d70117a2973f19eb952d6a227dbf40cd2a28f02a4acc577509a16188f2ad367d220600775adc53a02b01e07101717c31bf5f4145b40e6f9e168f109d67aa12b654930b27977cae89d52ac17af95b17a17b77efb7250b27d5792b38788afd72269b16b22961dabed90343d43684a5e700327189d400db23e1192a6a708486883124a726003216990f53bd88d8141f6ba3c930b4040624856c40b9907e89225b222f55668d23039316954898449a3f2a04b9664da7197f285bdfc389cd379a36d89ea1b264dd368ac278dfabe81a55911d80ee499a4817c5f8dce7607a5b14ecc587f0951c86de711195b5c9360b78505b2d79d406c302292352d25258f4d43a2d1aa9191446204234b1882421b8e1c21ebf750bf6bfd0eea53378001b82de3daa118b7a7c3a9c248bd16a78a7a7b72fd70aa30d2a2ccb55227c0d7610feb793650454df6ba94c16e58710f1d6b0491ec759daa44153cf091c1cec3012a18d1842419ec52362915fdf5506b1535ae8a23145751ab62892a96a882488bb28a5a154bec903533c36030d86177f19778172f11cf5e1f6d11ec15f3e2ce68021c63bc5c7f39435f2b111122fd06bc0ebbfc12f03a0c77108de1e85a195eb0dbb40cf6dad146bad6ef3a93876408106d08898522f73bcf9bdf4d0f034c2e481ebacf03c095493842123399fc6c48a41d32c9eb1588021238340107553c218606bcbe1d8107000cb8711cc7711cc76d5bdf6c16db212658dc1abbb5226b648f369f8db6d5b6a04d6823da8a6834810742324888d2c8d29014b24836a9ad50a9a8542b1199e5d4a54d7f2aa7cebbdcbb097aabf9added10f8056a8674a29a0821346e4be1d6a9aae8d16c9766da5369bcc394d6eda4c30fd569fa0ca74e9e5776323810c361200e56ebe9b37ddb19eabb1616b71e8437b99ed67b65fddd0e2aee536d2a269c9c93bd5ad4a54b7b72a19853cd3c42776666257d66eaf49a63880f6634dfad893a9091eb9151e41157ea6355ba1d43b750fa76ec2a94f3ccba99fa87050df9ed4331cb783d2bcdec7277fddcb582a758b6352aa2b339de0c97772af3b9d5ebf9b13962097fac94f6ebf9b931fa025c09435ac9baa9826db3663861592f205bbe8e2148fdbe78c18f17771c50bbbafbbdd8472ee9a7c1b3beebb99a793c9cc2a7756eb1913134b37cad1493daaa22b4a4d8ef20ee55a2242a0c9474bc42e61b2528de2c4e3591bb698c5c2427bb7f2e795af8669e5a2cec2417d85d5344cf166836a1287ab518b7dc2d529aa11a53911191dc1d648234d24159e481369ce7c72c74a45eeb3dcf1f3ceac8272b2696a89d8259ae34010e51945cc28283332caa54479ed59de41699a469348148f31336a127d4d4a7de57eabafdc54eaf2f3380e04f1c8a2f53485169bc59a482dde99ad90b556c85a212b34f190d744a234d5a81add9c8af089a8c53e6d1a51555d53bd3832afde9d900ca95c0bd4620d5a6c2bc40ac929b8cf63e6edb576a426bda04ad4c743cf8db924877b0f74c9121d1c494416f71da2085550420ed410052358f80e5e70c4121ff8e9c0083aaeeb20cbe1aeb9f061b3d7b50e6acfbb910e6a6aad14da0ebe6e4f755ccf39e7cc87f62387529ce77d7a9e779b46797888cf652d5e4fe1707ee6d43f49ef4cd2b19e495aec77dc4cf254cf75c64669d29d484600ed93746d060a1e67a0f01863f1287e8547d6b66db5fed9c36310791a8dcf26a4243d93d4335345eb55b5de84811862cb1cae53b4d83f18f5cc87ab92141ef2fa9d39756746dd99bfdca269b3fef4e9efe813d15d1e35a63d8ecc79880cb0600517d8200e334002022dd84112a33348e104497452cc7d24c90f28b030859a115da0220d1300020b8e64506bc20d4a76a07cf23c8b2b65b12b65ddc90830c6886cae61056d20927513acb46a85ec508b5d933a9a02b0b3cf94bd0ee48802c85ef79932f13c3d329e223ab08b7f5d669d9689986707098c900319ecf20b71bc7058ffba94c9ac934a83101564301c568c433cec52265e0bbb76e8f680fdd3342bd4359a504d9a20479b6881912c802c9b680151aeb5db6addb6ba6d75db2af79ac4628160d788d8d1a28fb16b4895e6b27e7f486a74eb61c3433a50a4fe753b742a0238831825d28e9e196b920f1d3dfb35491e29795d29635c8b5cae2350c218ba90eb47b9d33beac83a4efa87bb9d945493be83d23452d76a920552a31c078274c8eb4a5aeca6d1fab9674a38bc5443113448a1088905485ee811851728a1010a72000313d06b855a9c61007b6a80c4089127dcc0094ab0424f1124212892041120d5600429490c09020ea8b0c2cc09520a2df898210a54f84c410a21ac508324841c89420da69080a4a323a070031a82d088880310848ac0852688a10a0e60c20d889024a40a4667d828dd90c0da791b1ab6229857ae2e3ba2e4fa131b3332b542b66b6700c7aedd3a44f311927533875b7f8290202493df4dad1da17f7dc7eb66478b6d852c912db24276e8a467454f1d18f18aa3fe0703587a6dae8d16ebd893a5c57804bb8a836e148f27b97bc9d433d6f4d17ec39dadb6ba68b15629a3934015a26766534f082b018ac7eefd4ec749a6f6c6503108b167bad7ae5a6a3b1d27991e07cc0d92d0011624b1e00d498ea32ed14414828083283c51240559bd4dbd8dfa771cada693015aac9fa0ddba52d7d9b069b1b246ce5a0314016d20254d66020692956d4e3700eb3b4ba40e0abac96f58d6519e6eddddf336fd862bd757b69cb2a26ab78d5b969d6ba6679834f76c6a2bed496b6fbfaa24c0b9cdcdd25a233fd20cd6d87fecf9ade69e6dda235464566bbebecc8f32094aa6c87da44ecc63e6494b421c8672631f9d31c0ca3ede33e7019c28021222840925590a0521e5711a21cfbbc8b209269a9085f28b7c611d819226460e5529c7171cd48527692a0ea21d4444b43855384b802035de91048e0f5892e973de814ce5572a79997b5f13d88fa11c874da0cc408a6c3b88e8138e974b27a277b448c42bf6d1e26c2c914cefeec8bdb404c8dd0711a53a7a79e6d22fb39d4becf041448bf3271e80b386279149a49a4ca79a29a69c49f69d9348fd388de4996bcdb6ce9f1f22f367fe9c98004f35d008d024cb2698f0415e198285239468820ab240449e0149122df88192206a50c19cb31d4408791f4032648a5c8b900c89a246519a81632522a24494663611d31223a12b8821081cbaf0012cf080015c888209543802179448e2618e1aa529bda7b1cef613e6017924ed09bbcff3e974debbf7c84630875dbaa573cfb1fd847fe01f45744e58d21f530ab0f4ed619fbb94858dc30498ce3d87e91cfef1ddf41c5d034eb31be2283d548094951ee660020a3bf8001544a614a0f7ef4034366926da0e40290b8db2b044123600cd1a9094a98e98c20b66309ac9c6599bde95a2c361bf4726694c368be6134c9f32d37f14d1f1de5dca7e785c87c31ca773218ed3152065272c692cc796b40232c0000643b3998cc7a765df8b389dc361bfbbf771ce0094b2981f19810f9ce08429663399947df84711273c33e1b0718e5018e20067b33cc4848338f73186fb9471388438930a0894b230c7949d3e65a74b7a550c641d0e754e37fd7413ae4434763ad158d8b8817ef25889bade6e6f25dab2ed766edc44da4896434a2fcd4a98bb2919cd57a2930ec0ee6404c8bdf450a774d423e36ea8c3f14ca41e99fc54610d89840b44618e13f7d3a52cccb1fd28c98ff3288f5fff7d77280e734c72df64c7e230a76fdfb77888ce3bf47dd3f59a647a25122e0029ed30c9f2db0d736c2fbd847f98be71f2fb0128d4e17efa89c33d2b7d3f987e429dd2b97398a77de84ca2b1b9cda412cd36ab08f2a71b80f253fef332db1e2394000308a4f8401b8c20824c5ea4342b224b4260548612100941260fcab3e43bb045f99694620fd96ed37d412ae7a7c43b311d52ee7753d2006767c8bd1de5de8c4e3700e765b6363de716f4031cb71f5923802e489a1a24632d6becb9e0535432a212b921371a72739b18e47cb192334dbb0a9435f4f73ef1383fd6a0ab928fc83a04595367189890db0849b6a5bcf5084bf637f5940d1a9bff467b34655314bd41c07133da924ab3924f8948a956222a15958c4a4725a452d2cc87d248cec8e4d3e78efa1c522988c611d98c4a52669a25110d0905e5aee5121014244c77a87f47e1701e3ceaaa7b57e170a29ebafc7084dbbb8318480f1fe0112cf02aa13ba330c57ecf2a2091bb31d1a5b44b7d28fda1b3f9a23f6f07a8076400fae09512c698ca6327d11610c9fd3195c759446790bb08485f8fe49700474ad49468e2b0c9008e94a84f93f44c1426258282acb1678d21f7e5a45ec8cd512ce42e6d5b69dbfabba973ce5c7f28cd44e2369616ea1af8ee21522069686d22f5e913343089dc7fc1098f5ca9f3248d1e3eb85c06702cd5aecc41902ffaf6ab5183366f8bc256286af588720fb568246158008e252360add55a3bd6205b6b500949ee1fe94adc4ce50ce452cb3e0085078c325833bd7cd3260d8a6b50a340d64c5c8520616c0df056221a2bc2828479d15d446b94a6b320637d10c4f40932802d456e5af366694915b35cc31ba56fef4c7367f2660f1f60ae42089a2f5a96c275280720fd38858abe8f3508a72b3e29015220d6d6a0d9ad3e2d26f58c929ee1deb7330b8412d5234a933ac78120250ada6e7ad8d74a6bb13920d62748ae4849b92b488b58e0599488a3459922e54eca5d837ac08a4411e00806f912206528966904d84d70de53aed5a5c5d50a5956582a292827262b1598427d5e773271a5cd56da12667e491e92ba6461b051b7e4f393fb1f90a4b1224a03722088fb1d2ecdba09e0dca6985d00b7a30d07607db7c9bc196d54dca05b7758766cab412d3657fbac51147310e54090d6a0a62580ca3a5c8b68ac4f242877929137a44332750eb38e7212942cf9cf8f2eacc560524cb3a0932fa305aaddb675254a4b255a2ad15289d2d2f67a0350e69311a0a4310f873adebf7f982775af69104aa33f34880a51237a449168529d559f4aab3ff5a822d91f4ab32262c114333a54816a10a5911488d24cd994329af5312a221aaa8134368f3ad900dc4e35d8de99dc007e18a9939c9200c7468a3111f4c41252a8610750ec98e940091b20e10116da3083e8074504214347318802053f2ba04086300861568416ac614a2d98c10641c081174e7094240e47624002148c2064160406135881102f9c810a233802156a34d101282011628323d0846a20816a31a2b8810dce0007246ee819011b86c070c40c960044061d734976a5a41ca79fe2e2c263fd1033a7bc857527be3d4b795d4ec2b47eaf49c2b44e6f9d2f5a87dd6dbe68dd86aeb832e77047efe58e3a3c8a0478217a66f5af6afeeb77e3efa6b73aa6261053212dcacf2868b7f45b3ece1a5292f732050db6807404118a44d0f20e0c71c8c83ccc7129731977068dc9cb5c49632825aca0481c98a8c16c269371997754e64a2a234326737d5c80248a368821480d4cd0df0dd7eb6dcb757839c5758798b97b0a1e6b4eb92b661cc70a441e85c8f4d47579f0b8c82d3e54217aa6c5e5f23b7aa6df725b489400cafd98fd6e74b4fac64e6f6bd4e1e5d85b6ff98e9e895db6b4503abd965b33bdf2c389bdbf137bfd289660ad2797dbbafc5cb08e16658c069d7a00c6defa386b192949bcf4fddde8c75270ec5ad75db525b4efc9b1d89db9f5588bcbe977c4aecca2102dca24b6d2969217739117afcc520c60b721b9526ed33bf0f3386b3a3625e0288f7608a14376f53db927d782ea9d494052ee4ce2ba5389bd3d1392a20e82e0811790e0082400c3d7782211993fb889e860a3e5cae953d7291e658b2dd77bd8b116873816ebd021a7e091bea55d5a57a74589a305e054d2a20b9652f625923934a198443d135299e54442ea983cc78123c84a434db2ded44504ddf1e0ae932da63c8507cd29e3cc2737b9b76790fcfafa5af10fb58374bd6d53ba3be5b2b09cde7b6f6272afc9efbdd7242585d294a6f80e91394be69debb65aeeeb5d6bad15d35a29ecb7af2faf1f61aff8fb6acc2ce3a3ebf4e3ebadfa5a5b8eef72191f34b7dc9e75658b2e23ebd5857dd0ecd2baaa24c017f6d1d9e5e3b17d8bbe6617bce3c22ef4fd825b1f61d84767d75bdd82775c7771e11d7a9b5d30f6d1f9ba6863171e67905ca708e68bfa94cbd2993c16169477ddc9b833efe457a3e52eefebc2a357efcc95b98c2bf396eb227367662e7365b0665a2fd9f58e7a3357c6bbd775b9ebb6de725d66cb656e00bc2b3b36829915803eecceecba7d19370097b932b0cb6d3a00ddb52773655c7e382dd895d9e5b6bc73ddd1cbaecbb8b5639f5f8dd65db0db343539ec76765d94b35c994f504c4c4c5647591d48e51364ad1e3e7c8bfe7dfff29715c7afe760bf7af75f41f2d388bce1ba7d5fd753eee823a7708d43975b3c863eb4bc43179cd3d2f429b7a129774cf90a75396dd753de2d1fb9161cbae01c17eeb7ee987214d85db037ae5771b50b769bb62e4fa5f10eec2ebcf37a5f070ccb165f5e5f47790e78f57ebddcb3de785c8131ebdee4dee49a98f4354931795f93b34cde29786499acba6f827f56df77ab63b1faacd7b374b3bc85987ce2306775fa536eedb41edad5c3d5c387e11d5b29ab87e15b77f4d17297cba691b90b1eb9962b5b74e19193b93634fcca53ec8dd5c387786cdd146bf138e975e5d0bbc6fa1393539314bcd3faea63c53abcdcc2e151640ec17c7257505ebf1b96ca6af5ced321d3937cc3ee54d917e5f4829714ebf0f26a851b488bf233c99d4a6ecf5a9447dd26d2a2fc777b8916dbc313890ab03bddaf74f985a172474a9a4a669216e591e0008a2c85b2448283209936856439915a9414892c8fc4e98fcca510f2729442f273a816d4cd4b6bdcaeb5285fdf1fe7912cbbc6ccd5dece32b7697a69ee3b8db4283f6b9466d23a2665b06c7939692d78206456031f94a10d6990ef997cfbc84fa499244f6b323d717004a45cdf05a1c3f7fa77f3870a6038754ef7b87bf7de58e70777ef3adc3d1c4e1dd34f9e5742a9aec23f4a3dabcb069c1ce5395447c13f8ae88057fde4729600ac579d5c308338c4c152992c161e1aa43f00d1623dc53a370a82d24cd94afd577376822265a194a56262ea8cc6386cd4205aac2fc2c854d52068acd6727db7d719a95eba8eeaa5cf97c0a3304fe9e0795057bd4756bf8388208400ef6778555fb9e06991f0b2be7255de558f5e995970c8d36fe258c93112860896a572964f7e618347e520244c95463d70cc2080a5dca3e610074be5fd858d71a8ae0029533d07f81f2011944606216b4ab9defec81a1ab924c749432940ca563010202837399093af4ebf3001aab3aea33a0b2565aa37d601af82794aa7a39ee37414fe51e447f7d373781f08e403a9a7987ca5fa0455777572516eca95b47a33625a2c0294b2fbe93f7c97b2128ed26d7afed058fd771e496bf7ddee86f3a8f7c87824adef70f7ef3addbfcf7fdf5198e7c342d058eda4ec0b82c6ea3c8ecc3d5812669e3bfd66bfd33d2c6fa8d3fdf40e73dda731f912a66d722425c862fd5c0efb83de622ec7b6499914737f64cd2b6fef8fed47fd1250bfdd863a76c3dc0d75a6c5f552ccd1989cb3a911d8b32c659bf7f91cfd0ffff8de9ff847119deffd1ff3dea5cc4bdda6bd944769e6254869bccbeff2ddf66d88ea43c08f272a0c3e75c3da37ac386c40eafd1ce055cfd15fe11fa9f755f847119dd4fbe0a5ec04a47888ea360d5e29abd76b51c6519a776cfba692b2de8e63fb0fdb6db6db48e1d0749df033e368ddbb53d6fd00650e594af5a5c5ed75dbb649e3a60feba34c5af94ffe136eb3b81aa0c5ed366c5adc5e0412f3abb7d96e5db7df02fec4e4a73b73eb1651809401f9c07cff03dfbda3fce42dfa498e08203d6579cb0d3fbfee2d1ea623207d0d54b61902483fbf1ef638b2ab360820cd3db69b1edc4313fe015a940349f9c97fa03452d6ed3628cdf7cd46d67079db7050f91266fb0c02d82c6ffd87f0aecb0f47cbed8c96eb6af5803a582c43c617e26009fbde6d3abc3fbe7b67b93f8ad8ff081330dfd799ffee1d3573ad28ee8638babdca7128ae545125207deff64d5df0aaaec976d45d5d296bd4ed9981986b712b02a42c3308a41387f5fbec1fe62182c6b6cff7c86edfa3b0fe7b8f0c29ac18f314a958676e9fd8068d6de731cadb1b6f52366dbc2b652722802a0953391aab97f465c33b9628cb154598f46ccd1ad2f5f0c18d1b50de5a0890c4f387caa359bff629124d92f87404949f77cb42f4e947702b9dc645ee0d8f2fac16153a6921cff4973ccae0b09014c211437f381a925f0e6a147698871251211aeb1c3607274da79f30cfe91ce63e1dee26cc633a87a911258aa131db61168dd9214aa33f1329d431493ace9f508733dd69f41e19bda4311a93548822f9545afda94155a81ad5a38a5493ecccfad07e288db4b33a04144469a4ac12a1345246db7c8c8a722d27b9140d340df345239d8600ce530c52a4bc016ded4d81c889126c1cd1114d08fa49a3b1a499449b73d2e69c2dc4e5d1119d65f9cf76b7448a9c84f0839e658b6ded5a2243d9a8886803e7cf555bb3fd52adda1a15b5994a8f9400474b640601c7a651b3b5252cea5386c23e9e0cf52632e75379a23012e0ac355923fba78b406a676a3fb3cef99d21681e122a400ac93480ba065257d5d9ac5e66d4e78671a4b0a4b1ef32eb482119ca6edbed86bbd65600e9e911a51900123459bf7f401ae47e034d1a160f413141d250a44a1b9a34ba37cd42a652c84d6b230d1ae9126a2db78a48272109e0c392a1deb7344aa3c29bcf3f3cb6d03d3c76900e3e336428ec63896c48e48bfea9d228cd06849484dc678120104d7ec00a14e90914298fdb1172b7376b4b246f48c8fd4d855305528b326f546c53b448f1905027b564c9922532d5c76d8acba3fa8f0ea0aec2610ed5575fe11fe055b8c8bc9481a71f0e94ea06476a1a016e4094664322637d28b829e406daa238b9009479dc906c3e94a6e7e6e393fbed0149a343c6e6a40101f9020e72899ca177439211e496e20d5d0690ca9cc8e304f2832024cc9da99621799de2336752ee9356cf8cf4b3f583136f67e256e54e58adda23fd9c60cf4cecb5d84a80633dca5e677afab1d2733d7cd43c6416e698b2d2a7ac847d3c59e9f361fdac4fe5211b2861496394b369fa0dd7fb50bf43cfb5d8f30379de6ba2e79442b97a74029130f35b00c76a4469094fae934a2788e9ec6f695f5e172f621e5f72bb90f656ca4951d266b0cfea4bee48275fc693516e1dd85f7f619e57582ff300c41c0087611687619e6a841b965024e3c9e1451429e988871d86796061c538625cc6618877711798e7c5451ceac4601e7b8f4cbea349e058bd26862a153d33fa60014954a9e0364b4d35d3f6f9d0ba0b1e6776f9eb863aaf2e62021e14c95eef91c16e28629e170f64b0f7c83a16231d9b13093889a6d0b2fa1f268d2d57a028663257914c49ae9f47006b99badcf5be9d42cfc8e959ebe55a3f5fd49bbc5b93c9e49d7ad51e31c151bde2ce1ed9260deef6a749c3b347ae35622468d218b973f385bd9daf2ddaedd634b9ebddd37cb1adba19d3671d757896488b46b6edbb96c8b54bb478e4840470e6ef2a1feb604a27bf1c217afa89759483dba9fd767a4d9933556e7e3bdd9938eca1faf61c395fcc172397bbedaa8bb3e5cc7b575d9c79cfcb1b7747ee2bbe947dd7cd2fc77bc595cecc9d861c0e7b98ce3d87ebb89b33cfdd7471660ef779d3c5e13eb949efdd91bbcaa45895448ae99652936f37611d5e0ac53b269f7827755abd7cba4d5de520ca97c2d507cd2747d5a3eac90ab5dd722f51d44b1b8747d457bbeea8ae7a28d4ed5f5e4e4800c31b336f9f3bdec461cef7faef158fa7eced785fd9beaf7c5ff9cabd6fdf57de492056eee56ab256884ecca27a5df98a73db8d2f67fb0a1e3d53ee6d863d56afcf31b1af37b93ce892253926af5f5d1c13bbba38f53d8fdf5bd863bb7d0e375fa8ce61395f8c2759759bc3e170b8b6a8ba55e55c1caf45d5e597e3fd1b275eb9ca5f2e98f11d9f55bee28e3eb2ca51df0d2ac5fbbe77b6d6331fee49e3bb0ab644be6b6bdf3f9c9d79d9cc1269913a31cb56e81bb98c3a79c5e335dd0e11c193b7cb4943f50d8f379ca79dc913e038b3054eb24908c92a078f3ce812a4ac5281299484f9bcee2461ea470a98244c3d05e6a777c71fb2bd2799fbc91dbf7376c8e4dca431b10e4b94b769fa4801d5ea04e52305785080c75c924f37b9090bebf0b2bd41b33dcd165be024f3a04b94e45147feb08e93dc22f7d3e5240c07c31de59e240cf793db4918eeabeb4918eeaafb49180e86bbe9a6240cf7794109c3c170a8d74b9d98654b84dada87437335029444199f13725de04e59f1fad5a4d1b5f9a25f2bca6b7de77db2e67b3d4ad6b05e9f9235a0caeb55b2e6e5158f3a4e32fedffd5a21272420fe6885e04963355fe0acfce4f59efc94e5135850420d0f93a3567742d6f0501d41d6f0f08e44d6f030d927640d8fc99df5be4d82ace1b11d7c0d0f7b15fa17ac9230f57d950b4a987af0a6244c3deb7ef79330a7dba5ee09e59a505f716bcafd4afd7571147e9b702b93eaf6a857ddbb3d4ca6cfdb8343a5720df333ee488da0996181d45308c01d4d539071476a04eaa37147ae86071b770703c418519a90c5e2b6cf1b8161901627380456eac57827730065dea53c7a1b46fd746afc467e0dc0f90e38d4d9612601640c49b21dde23b3e99b1beadc9c87f38079a4184a20bb0165ec65523e4f4427229a675ee131023935ae40d6e577b342458b530589d565300b247b5924a956b7dfb15761d5eda7eaac8fd6aa6e7d507dc75ee636cd2209e5b305002e2f1e7365e000ac9879a15989bd66e42000580d0b0b9146e8a285ab05f3937728f7e4b2409232323f39ca95b9caa4645820b14892c118c60f5e4162dd9523183429e67d30cf02a96746183416493d33c6d05824e919d3e759c0a0610be67c3e8646a34600336866022023e60500605cb46011b321c27278bdacc0f7f62dd7de755b21cbad12c65adce08d13914bed940470b44329fb971d5a9d45751648525cd5ef46a69b29185920f950b3cc5f00c91a2b64d4bf5acb356eb6d8a5d62800612031ee380c5acf843960b67827c6698cf757aa0be332b73f7d7555498032b757bd9b329f8c4a060fe1e12c9078c037efaf46cd206872f9ddc4b84dc378d731de39314e71e813020967316e7255498031c0dbc530c5e818309284b31b02a187f1b17bfe000c67df097d643e53725081b1c495180b8bb045cb85eac200c0e61e5172bfca9ad5f1c7937fa4b94793dc6f5963f21e55b9c715cafb53d69cfcf5c6a3cc63bc93b9618c1bce42202dce18f63231b0046d386b9ac922a945189705920f663d33be8a7c7a66fc432061909ee95e4507f8fc6b312f0000e3a2058b9808cbe1f5b2025f1bd848be4b8bab15b2acb05452504e4c562adce00d6c43f30e57ca6eae94a5ec509e4785b3b132914716dd6ba3974d3068791e20e7c670934a8ab2dfe14a998d2b6538777692c1d4b8b3938c0552f813028544c2a19028440a935ab3964f8bd6fa6901b588b4925c331711978f8b1616d55a43612d0c9ae1ccf583746454d422caa1509ebfb952566281c4028985923c69eeda33c0bd910dbf368d401d4e8c6a334e8c246da39ec92753ccda5594c552c2f4901dce22498bf32c9028cdab6807fc6281946751f8a2853fe12cf49939f5c8dac7b68141007124c410fb791b946686c522c842ea41275fc61251b694a65e4e5953944b91d2985cc67029efa7701c5010cd2773b3cc716fdab3cc9d48e6502e8bc6382293feea86db7b64f4b23b7dbb628bdcfbc6d0188d71733e0194b2d54dc4cca9be6db4557808bd4d2b6991c3d131ee1c1d39ee327a6d2d88bb25c2dde4dad018f7d5ad5180a10e4e0a7556efafb0a5d118f7b64099fbd84999bb0d3a2589431ba098c9b889648f2c12a591b41f20225b2d88fb26b40dfd702f019586b89788702fd56c12d17604442d770b62a0141e4b4125da87c7928f87c7d2acc3e39694b94bba2165ee263c5a23295f38bc53223af53782ae8737cbf4610e8ec6fa3e66fe01ccb9eb2b8df20425ccecda501375d10c8888d0a443948816511a49a446696450f531a2495d336aa221a01f9a4f9eb38c44276582cc53d2f066592641091239ec6a8982f42c7ac9d19a5763e60eb431e595dfc1712358412095962369441aab35dbabec42aef20ab9f69559a4343668ac9e05b638e403cddb4b57e639abde9430f236e4598c56598e279c8333dd70d8f53c3d1336e631b37c8f59efa367241ec2dd1d3e88e839ab1c3e8193d2a653f6ac25241d486b3dd99ac35bcfd9d69e3afbd2e23c6de286b916b9cf6f62f7b436ddd86ef82216bdd19ed62a56709e35dfb39bdb1928a5b44a18ce61fa009cf132a382e3679cf4cc18d39a514302031094723d78539f2761eaed0bcd619a94289de338af9402d06bd11e75ef5dd3cf5e950dc051471e4fb20d024769644bdcbf1ee8123864148e71d1a287c516ab044e3c00bd1310c0ef9e34aa12c6071531d7a2e5e8105ae20cd0b1fa8ebbada592b5dc04755aac1567b3d133f5a3492e5d2569208026256b50dc2db6e1ae8dea03721fa590015aace7317377044c1a09902fea2b143a8fd209b93ef55d2050e75e65cdf7ce5e205a2709683fca29e0fcd0b984ab84e1cea1ae94228767748d9a4b3a783a3df3cdc8efe6c3122c95b00f7a432e59b264c9e7dddec3de1034ebd0e2ac3374a8253ca3c59a6bb6cd95de5687162bd862ad9fd1342e3a565fbbab9020595ff9b15aac2f89e048054948822004234f02178a3c20042c108942561f84ad428264f4ed75039a8a214b08c9661f09ec911a9450d8daaf364f7593c9f4fa6db8e298debdbb6953b754e0e521979ebaa879faaf74c7492bd1ca9d7c70f2642eddb1668ec6e4f5db35b9b263d3be74b75ac1b64bba397bc6e8402528cf92979c149a525829df713d33f6edb78fd6628eca797a8fb37d821277568b747c299d45f502b0542a955cb428d2d3bbe04e71e56274d0c91c40fb9ea9a8cb1d2dceeb6871d66aadb5d66edb367d3a86e50cf7f90229da1f4fd2a06eed0c0264facc9f9e99b417c899990229cecb148abed0ef2f994e5ee7a53e1e7a66ae5f8ec52dd6c954aab2664381ac319d40d69cbacf77a87f1fe6b197993beabbe1c08f879e6c51f6169f78f6033bfb93bd494a181e6bf3f68ea22e9022dc3db02305b2e3e999917b692b611eabe27238ec6d1fd7e27c2dd19ea552499a50b2669e9ee199b3fe6e360ca4676a90ed7492fba7ef864c0ba000838b933cc516a754c2d3343a84a0343f746ccedbccdb988f9901f4f50783ee6e8a87d457239d7c395d2e91c7f983842428b29dd9ce1af014d131a150a86f58e7fb09f37c37ddbb0a08aca7ed26a8a7eef7be4536dcb1dabba679d475e6761ed3e737ac93fa877966d0987dea26e729a2d337c13c45745037611e91c6ec5158f214d13179631e937b206b25aa2e6556ca4c523c4570a830cf94a19e3a787fd8a031fb7a8ac23fd098bd0ae8074f110548996ce21fb208e5cdf707a6ec16d1996fcc53244c40bfbb4ebfc33c45b08f4eff847984a031fbc6d387c6ec274e3aeaab62209b1fa78f94c917dbf5d4b654e8e4cb486b592251829625122570964870104576c5c088b9a8ff40556e5542dcba32b7ded9f9b5acb5d68e4564aba2f2561d5b97debe7569ebb6455badda6aa9b45a554545a5d5babd2a311775f9b56ed39d14c12c4c81baf7f4b6c8278ef86419593e2104a26c7fa43e48ae82cfcaeb5b0fe352d4d7037de5f0d77b7267e2c1b8f5ae1e1a87397875fc7d372929ae3bf66497c438a8ee7a5d2e3f9bb62e294fb90d755d96a75c93a32ebeab17ec395cd61d7b32eb5fe872bf77addbabd5aa5172e89506531f8ee92aad56eb7dd477d31583d9b6cbe5c2ae7a9785dd9dd78bc8d55ebaf0d8935d3098eaedb2697b170c8f9d5f193fc84cbd5c7807fff5fab19b3dbc3056e1bb70f8baeb2e39f5fdfa76c12e33ecb6ea2e2e1cfb46b95c2aec4241717d9eab3b825faf5103b3bb1bbb7a78ec0fe38ff9e3ba3bb01791bbe24f97bbee1a272d8faebb58d8ab0b6cf5f175eb72d7f12dee15dee9c36e3fbe307e37bdd4ad84bd5d18778d6fff05c3d5e5de5d3d7573f8bc28e7eeca6da8e98716bfeffbf8559815c1a4e1728b778e5fae1b29af9ffd70087bbdcb5d5cbe7aadbe72658bafa3dc1c6e6d11bbbcfb70ea772c1ee7e9f341049346c5e3057a727f65fa6e567d6d865d99334c038ddff7955233ec4e7c9bf660b7d53a103de37aab75952bf314c1a43173ebe14d0b4b7006717139ec8e3d19f6fe6e6038aedbf7e47a53eec89372f1e5f77279caedc97d7d74c6788a60be70691d76d37a8bc7f42d2d2d2defb6638fcc2df7f4767d14eabb69fc03eab53b79a6afd4f707dac3f2da6d7282c79e1b1322ec6dbabbd6ca328364131316934beb4d4c4ca889890d65313161b94d5396be26af97e5f2bb39f9f6dd98b0b84daf5801ba48493112245370bd9db57e055dcc1aed9916474aa248f8ccaef3fc5ebc27f7e429540b7a71f9b641df60d29825982fe4e5fb039266d2644c3e26c25c7e2ae919005cbe81c81a99250c40159080fed0eea4c91a9d27141246e230271c22e3335b6f884ccf646021684c9ece1c0344d674973b7a06c6e57df44c8c8797df90408a47d07af3f381cba8cf205d6fbf1bd4e9ad7fb9b3f4bdd0db34eb0078bd30a73832c39c754398cbfce21df560dc18ae4bb3fc7af81e03f77bb20b751838d6b5aeca0def4cf201285f6faafca4cc89390caca3452ee6de756dee2ebf1a2723e08b2b8116e501708368511ee602d1019130f24270dc91104076501a2993389d730906a0bccae58acb1542c0dce2531cc92bb24422450db28b3b331012b02dcf5b39ac054ba560b015b09195556e3a7d3738b4b94513e516efa60a08e6149087ca9975b44acae52157bcefd8cae0fc6e54567cfb6e6c800a4a500128b778cb4f77e4b123b738f81577889a5be01df02def5a2e7d57eb10358f3bf24edf35768d11b4e9aeb7d5d6943e781beac23ebea3459957809885ecf602488548d9fafc6e60ef3ad8ef1df1ef5977c467bd5e2d2e2f2e18df97cbfc7a69b5f00eecadb3eed872d6ef1d5b7edf554b297edff18e8d77ea5d4eef08669a82472f7b5c0aa5b6e5f7751bcaba630bd6e123c37678f0e4d765c69707cd2f1cde98997e668a75d05b1be07bc39cfbfe7de3dcb38e5d4e61adeec6b0bbc8603c7299c5c263cbccb745e6f61d616fbdeb5db239193c692cd8ef859d75471d3e72ebf72e77d2e865c594bede8f13a907d85ba7adcb7cdf9f0f5d0e29ce81bd75d85b975f0e2b8fadc36ed3b77518de699d5e7e3dd8770b8737dae21d7af08d7750213d43f18eabd3e123bb4eb75af1c8e5b1e5f6d6f523530ef4187b4693ebca4c29124f8033af583141bcc265f5661d769fc35f2f4759f182948494440952125212253baca9aadc1b5e1f35bcf7c547bd7f5539ca6bc5cb59c739bc5e987518eb30160c0683b160c7300c5bb182e1d5f1ea7d572e1dc6f8f5a7937d62e52d97afe03067c5e957b8b87c65c50a1797152ee08e4c5b5a3e6a5eb969c55756f0e8027aa0d772f98ad61d2bf651b3cbe982b93d93ca4bdf0d0e7350f28adbb44a0b8f5e6ebd939306add4cacf078b4117d6e9875baf93c67debdba4017bebf5568b22c990f130c765e0cb5c8ec6642ee35dcaed737827e3ca58193229354fc69599b58ae98cc20d94db1f210d432d144b996f58adc90556986373ca6d4e49799d34899474516e389166b3591e62e699e4430bbecf02b863e615a7acd3155fbd5b7157570827c0151fe511ce8a1b8c7b48b91d2273d80deb6197f9deb0e21af75d7b8d4493ec3744e6d2a65c74dfcd1099d7ef86c5f5ce2ce3f2b73c877732f79efab428af7a01782fb3cb39f0dee4e3a1275f2973b93917cb68519437313135a45a4502f6c749bb115b94930be0487d640b9e4982f48c6bd664ed076f01a46fefeb0176ef75bf792bee2f3f9c7fc56d1adfa653aecbeb7569d1e5e3cc2ef5f62977a7defe7002207ddd711265fb72814ca30e407fc505e273d90bcf293a263b00e3a422dfb8562b5775ad5c2b1707eb32d44a33eab6e53a2a3aa36e93c144e70e0f2a4da6efdfc9eb4c3799c21cd38723b590bbd33db5019447080a92e51334a0e5d9f9542bc76ddb56eb66edbb52fdacd7992c773a7da7532977ddfaf3a1f2a09b95a3778eebe84d3b76ecef3b79a7fa6dab37b475abb572dcb5964a6b37a9054a297db779a79277b269fcc3c2e7708fb8ac48cbe74fd00f8a0de3cc1348eaf2bbc0ccf5f975a52c0152e6811e179899fbcdea36edf2efd24f10fcb7f281b769ef5d176edeb6759ec956cf9bdbc66d5b51775a035052e68e7ca8dbc7792993a79a99f3baaf66d3b91b95cb0d48ef2949d779af7bef8c62c8a44bf16610a599431deb0f057960c7ebb3ab49ba9a044ca21af2ba2d0dc1495227495292489b5eb9337f05a733eaa40693cfa3f794869394f73b8d6ec00f0ddfa752b36c02052f005d2e7dcb9d462aa48f15856a756547afebdbb7c2938a59740649f19db2973b8de4378bccc03209ef34ba49e159540655c865e9c418cc90576e52f4b2fce4bbb933b35001b29c9061e6f09ec6008e928a995b1fc52731802a1f8f9951deb57463307d353aa3ced28da1cb9d8b8a0937ab872a26a872f7159c9987e0b7564158e5ee7e4be0ccac72d7a722027e593e01b4c4973bbc72c3e3934f00c12095bb15dcb671dcc6711cb76d1c4adeb64c5f1ebda7a314ebf793a294bf2c9f008a82bb35a7e8bb151e77b9ec7d09906ae0415119c03002269cf082ac7b29712ff6657b31bdbcc8a62f33851a793287e757a3f32c9a5184012cf990af8de3b68d3b799da9d6cad5aaba320e3570b6ef7c74a2bdc974c7eda670b32c1c6732dd6ed672a8d7a35e5f39ae72288e1b6be875a6ba6d274bf369dbceb2613b37d367debe1b2ad9844fab8f9ed9b84f1f1dcb5743c621db77301e77b92ae90b6acc40b63aa86aebccba32a360992fb38f99b773e742bbd5cb83666b39eedbc693c31ceef5dceb667950bb15a12ea5f6fbbefbe8990fb75c7202c3b6dd86d58676dde9a3f7b1fb680a4fb8c629871eae71caf461876b9c7268c2354eb9f3cc325b1e3cf9744f5f00e5134724e5712e9170a821b3904df7d1331ce743e541737d9d453d63b38ffe6e78d4d92c05d9c7a692373c66209b6ce8289366d6d133f420102559f6ec3d55e043f1387327a17b01ce4b245ea0a2674689b993145fea9b4679082fcff751b2a6c79c651e05c8f37536cb33079ce599e7bba893f9d405b0eb64e67a46524ae7bc3961620b390252302d01cb16cd5073d31d20414912242809c3e8e531744850726482554a18ebf9939bf74e5af375ce3941cebbc209891448e4f185fc4c260fc9d1511e59ac8d063481b8c5da7098b3bdf491e57537997a4ea3691b8bc8a76953a6a3eed9d4787a89a27eba634fde4c3b289cdab86f2713dee62c8fa7d31b02c81d1e4d2f6d5c7bf3a71a9b9430a6dbd09f3a148afbc63dd5dd744fef6e4e4d369d3e6e2f3d55633b17deb829751a4da79fc6ed7e26d34db887a984da5ebf3bdad7994fddbbd1f4d34ba69f3088b991b31ca599b24d7a9c18e83bf7a90aa0c4dec5531138c66424541124f763e4eb59acd6cbd7c3cc14bfe4fecf62e5a6975d450866b96bc2c7e8942b2df787835790bbfec91d7541eeaa90dc6d5ebde3968d68620c5164fa2a6b4ca7b7b2863bc55bae97d93444cda673378acc23954def360f89dc840f52d3533d9d4ef674da4ea7d3e45850634f0d72132140412edd8eeb5e2ff1cef6ee3ba8eef3c3e977dd519f0d9b2ee5f5b0bdc3233d15d984a584e1ba14576bcf54b97d474a17630fdb7b2bd974e9cefec4f207e0cc94f698e62604231b2d6e2c3f746f33c702d1e2e4ba621eb6cf6f73829f17e74156146a00475904459eff41072044709e352f392316f4a96716a2c549292844c766a7c3deebee648328993010dde99463710da28100a2c5c9d3121042479786a8795e3caadc0672aded2f3d335b9c2fb3ea38c9d6b604e5d6bdab17bc5cad464738eaf306725d9bb8f9520c0d028edc04bb3767c263f7ed5d7741ae9e70ad3c39ecc9d8bc8b3cdf1ef8915ec749b6b4d6536e4957ff92a9fdc8da2e694abf2cc9d8cb4b965fa5b49b60925c6badb5caa416655b6badb573f6d8d94884b27d17936dfb509a12f70d286606f591211c8dd198bd7d0b01dc46ce1ee9192e1bc99abeb5424cb6b6b1e948c2d8d106e5f046f769363542be589f9e09d233a55b2cdf7d3b672b0b87c70d20656b83b468378b471d968601a33ccaebb0344bcb72454f69360b4431168b89a228c644b166719a3ad0c92e257b66f6a474266bda1a019b0d20eaf4bbf9ba947cf988e41a54526dff8efa4ee9dd0deaa6db9d5eef6d8ffa6eaa1ffd3e3c24e5b5685396bb79e7812714ecbcd2bb9cd2abd7628fdca9e575e31d2b44935e3ac8f2f492b672b839bca339bcbceebcac164f5b680a3670593801dd2cdf4d1a7bf95c3be681d9cdeb550b44273611cd8f16682661e6c927049c51396905fac12c75a746bd9eee23e7d877475d1c8bb7777814226f78e450f4df9d79bba38fbcd51c4e885c5fda91eb4fb777bba4a5be95e3e68b7a714cdbb98bb3bdd479bb8f5cf1a84387d7e3cdea824929a5548757bb67cefcbc15a69022620b02794acaa4316b82092f74f501519c4a5ce5b839279d9ca4342328dfdd2b690ce7e756f3c3b15fbd6b6ffbef89752fc6a1f6a7cb7d7569ae3a004fdfe4676232d9c0d16247e301870d1fc8219cd33d9cad06cd26cca1001cb993139413247e7a2614b2f275e1b56fb5eefc11326b34dbf8a80d4a236515e5e425938e1d42985e8b80282caf9f4682e6919e610da13a945b7aeb9e9c75e71195943b8db0dc59a3d94655919985e6ae6bad6013777b3ab7ddd6b36e62fdc574931be6989cbbc97bb2e9aebc9ba08d16eb0c0a0e6fa0bcf492ccb53469920773ea843c66a593a24ab9846d103d13e694ce72163cb65ec2610ecb6833cb7b724f06a2c5ba80d25d8ea084a3ecf2d0e6ae76d5fb61a7f512fe21bc517af810ebd4968778d25eba13891ba5bbbcbf9c96bbe0317c0b9e3f2dce8904585baf2daf9f48348d95d54fcba3454ad175fb5d0067e6d65bf04d0b5709e3c263781b5f8d9a5b6fe19d10873941e09839e64711965f1c93e31e1f639e1ed9c5e2bb92eb9c9ccd5554984373eb34b7c622b2eb292bafd7c1c600a5b3409046081a9b604bfdac4d23f5ad3b8fb4582f44052b38b2565068968d67103c81d440caf2938f36b7ce7243949fdce5c293f6d26b117064addc1d2d1ee5d4991199e527373cb98e93cb8252f1a4bdf43a0421ee8e2558b09462ab4a98161e591e621b2d56161ce6bc74168ce3860470102ddecfdb2f070b73b6c80b8a8656aee956c70645bdbbfccec223885330ade6e0627c571c639efa0221c856e05fcc43801104214886514c4c27580793ba03f0f4cdb22aa762b15833a84dfe706a9e341c36e4d08a1cac393f9d97afc03c72095790bdcc99040e52f8c82e963446b3ea823d6a1e5923f75dda289358d6a4956e3ad0243269f367fc81df4d90abb4f953ba538812e039cc9ab4d376fc0d832f9f972f975f0e90c6e6f1e5a7b3e22f982724826c85fc74ee31e6914bc8021166b28b4dd64e6b6bdd4ce7b6d246aba226e46a581233b48c73f9167ed75116491d04ecb7289560c82befba966d70c1176638620e674300c757d1101efe2aa29f3394425448c2cca27e45d1332acf624e0a7156a83291e96358ba22254cafd0185208061d5bd7616979e5dd090a70e695b7562678b2f29696ab287893d359c2182b29a1cf7c08648641f294b93dbd3257dd710348a51b31de2b18a77685736010b101a4dc57dd86aaeea8bacb8df1ae61bca90faacb9c8630708e8a5e06c758dd51f5d6e932a75b1ce3ae77a52973fa7c389de29dd365f04ecae975d83b5a95c7c0296f3d5c49c1b54515fc93533cb2e0930641103ca1316e65a8054f683f860c1e4f569af5938ac7099ebc4fde7f1f8afe5c7de23067e5f62bb7783c65d58eea2dbdf216d55b5aee78655a5aaeeac93296661fc3d264fac64a4ebf058f2a99c632b717c663c4380c2c5b8cd139c61d63d4e82cb3ba3dfde4950cde517de5630cacc3d2b20ab7bc751b0ae67bc71491710348b9753a6712d461697988995756300f9845928ecdcf152ee3dc1d5a3804ddcd95b21dfaa724400310c0e732037c6ea7f9888aeeb5d71a501b0a64908290188eb0625118ad90864269626834366960d0c2bbf2d665f9eabec834c6a863f33060c058b92c922e8b24f4a9dc4d0fc66ddd98296ecc2a45e5f3306828292a3060fcc0c0306845479486074a63e3f3af1752cfd4dc82d6220b241653bc8c5e453db3fafc2b8a9ea11faae485973d23638e6ecc1453b038a2364e6f9c52ba795406197e60f4031c5920550105433436bf2571440c88a609c016b048b23e00c718a32107788c51cf4cd13347b226c6c9a5a411439b2fe64f2ebf1a2d168c70f593166fb8c2354c9962188f71189fe04f14074048c2cc8bafa257142f2309331f43535df5b1f32b88d2d8e001046f701c96747c05e5f9031cc3994b90ac9991e7fbc3a9d96425c94a1288b372b472c47120180a913533cf9f8640139b3619ad4f1ec3d9c8e5b1e611cc230ba416b4d1451e59208d261006ad3261a206b84078380ece3de2321e78b8459a7e4b922715dd7cc3132330faf1c28993bf20226b5682a0bc850fa501c2c35bccb740a267543edfe2a76752a8ca8488c6e64dc2cb5c16952b73d68b6c7978476f4bf6f29753ce82ca5da5b56795359591f859b93099875b65af224a23cf42444116a23c637c7e00c604c131408cf2fc8909e0c8022906088cbf00824163dd18245a9c31428c28cd8dcfb31c519a037c9e25890589d2f0f019538ba119011c5990b0489235aa8e9b9ea97a9ef5becd437d3ca4ac95b9cc599034cbd0b49687db1bb707b8b5f652e6c62011d3de0463a8d86290628c5a9c3153d46e7a5a7e673f1c536efb21361e43a33436f0ab88c6262def702591101a11254b88a1f58c29bfbc3fff0249d6c87cae0ee3b5c62f46128606e0f82a128b244c0cad676290e819d5e7637e648d8c8b57118b2209332765e1b304f037ee0f306fef815a8cf171e5c8a5266194008e314631314079dee48e2c948c2e4eeef80207636522068c3b562686c02a13c393b181431d1b930655c8e047666387ef8082185c8c1d4e8c4e8c5668293792124325860ba605002e2f1e7375c00358410096f85280974d0e79250693b1b460d10a5dc4881123861723c68360fca85c18b494fb1a0c1a8d9ad764d9a6000418800e312f0000e3a2058b98780396c3eb6505be776971b5429615d601524502f8894faa68e5289ced70a58cc50867e12cc65d6a9fc91a4ec65b66b2a67ede45d43329f167b1baa689310ac0098aac51fd19e5ca88f9814a9542f3191f61d0609024cc7ceac2883f087216bf009230f3ed03d5bbf65229b7b725c71851cff3bc18a3192fc66806e5b24892a4826184da0838c600498901d233e32ac6e7e42a5046952dde9139b5b763c4380dd96107ebed706d9c7e383232323232329b8ccc86fa78b851740001a48a72ac6ea854ac3316b2a0754cd1c800000000c313003030140e888462f16840242b22447e14800d99b44c6e5416e8490e43c818440c00000000000000002000180005759bd20b52719c0bc031aa37fd50e3716742ab084498bb5263a05fba855530724f717ed0caa59cded7c021fadea32df8601aa5f21d93fb57222d828fd3c4505dc8941e4097ef919713cbf2b30749afdb5734fdd84cca45c9275e0b49d62dd47fc4c5f571fa4a9530a57772abe12687fb54652d90ae201baefa6b9ed7db23aa02c5705964d96ea0543a468d232f58d74cf50fc5d91be939c52c5208e9464899c2324516f46fbb4c21ca4e2f0ee0840c2cd95749ce41ec6adc10bb3161a0ec4e24fcc62a5ab8ab7480ba69cf2f2a921d15d6eec220cf51e6184100fb0a0633149100abb223864d960491ba6014c797c4b179d5ad3be10a219af198ae0cb2cd544c4996b287452e2ba6430cb4f52e698143a64b3b02574ce670d43a27d8e2df1788d99093c8cdd677d20971ed9ef5c2a644f2bef89b3381900fe9044896b9b0723e7f922954bcb04c31d76e4c22283964f2fcd304b5e22f861c8be8bf68aeed168b07cae8b2090007d1a4cfb58f1763f0880e9247c92f842a6be17677b03677ff05897f43b5efcf426242607b2144baebcf2113a0dbb33ac9143abd0a9895a532415502608cb0e0c7c2807799f8cb0947300e34a88b48b8d14598a56995dfe67721d743982945cf339b76476282412d5d1bb04d65114788d8a831042855ac9dd56021337940233c4c4d8dd74f8e4dcbc2a919e5bfebc23e31a828c4e89951189708a4e7a33c52cd8bca958fda145dceca588661540e719ed80ea2b1d5b3e7561f5ba36f82b2f18091e2a05203639d24f98a3e8274e64864e35ff013b8805b7026fbd1e6747339618b6454928be61ec10b39271fc62f7fbf8e15b22d8b832fae7b0d1bee5233a5a326e60db4ae07d365dadaccad30cbcac8e05f7ee4070f4d5961931289e9836aedc8011b8113af03ef299a61dfc55691f44eaf8cd866a794136d17c9d8ff20f8ca8e56c0a5d48d9b88052fb30a43d62cd14467f44e8630532f2f5cf1843bce6d81fb285fd14737379f251671d9f0b2b6945ae072b2441abbf61c0d88f58fa87026008b84d54c546300c7dd5e9daa3405f25e8a9254b376ef5b23dbca108b7e8f87c509b63d6c62ecf9064295c667b6505c7f29f3d4193535c7c21d360a616ac938a4b9043fb72fa060869af7806952950e3e54bd69af5f746350687bb692024bc1f8a52c3f9558359a075f8b04756c07203e926147005d3c1760402e5006c54c01caaf31a78468e43ffb67db831bc6add04dbc1009b0fc173403e560c83931e9bc83ac0254e1d7f0492e7d9a5f49569daac77d80dfaf5cfa028f5405cec53bb218b58c9252b1e4b2a2117f13af7f47c625b340374d9cd7464106b6db6a7ce1ce6fd4da202099e71df7089dc5fb33b0d2029d0e2bf5ce95dd93f4fc174793bd3ddf7997c9ba941bd1e19ef96085b327bf9a89c20ceaac37fd0afec48ded1d40615a248636ae12512d06670e38e87894224b9afa430d39d32cf7c92c5510cc13db8358e2e47b82e3dda7ad65ec64c4f03f2e90016eb337aac77b30513cda988a68f7bc6b285dc993a0090755dfe75458811e46e2711e62238e2238f375dbe7912e76a0dbbdf345532b9853b28fed2f32d1a9dac7ea6e558eb2b72f2838129385c06602c0956582f323930f34b93afa988a6a9b99e0ad12e62ca526e804f58092c4796c0865fcd2db1b57ae097b0979f1540ba2f62208ab8578d40f86e64ade1e870e4e4bc9e0f0d5911b0a5f9514c178298e93cb94ed8ff7db591c96aeb66c748457169cf7da10921bfc71c2c4e60679f89ba9b100798c1e53fe97a0b81de89eab9934415ccf1a10536bad3ba42f747dc2d396e65f12c151e60b7d7aa08734c3f328d53a2267bfaf28253d7338a69000e9aa5e140e7cefaa175428e00d83a49d3b1ce6ea2238d85570971c5cd9d5c7745a491a910196bce2981aa2889bb9f816c9c0422ac98e939169680c47aa9f5d0524e3c0a49196ab56a926d4ca1b28fd31a19cda388cd2617af7b65a48342eaf7eb8a691536c6490d68b17e63b2e5ae43aa37a6d501abb9512ff73e26d4c935b744abb02c3dbb4f91daf91c95f978900d357a54ea05f157af4de4b5accfce7a1cf281210cb03d310db6df51dba23db47c667f7d0eb890b0485ae7d7af1ff247f74000d8b3bc533f025292cc7611e10586a826e05cf4d7f7049e30ecca78d950575b609b96a4b9e958f961394dbfeb3fedb736014c46cc7160d75c39407d4dc79caca8233a1cade3d3e661aba5f50f63b43b59b6c1ef8cf7ca1e127dfb1a8de7c0e61b20fa392cea66f869e0673120a2ad31fb3db8a8f75e11ce2ee5ab6098c949d684cc364b56abe3586146a3a73dc80c445e55bf9b1bab5a32ca8365048b655043bd25b485cd39f05aee5bd3e5dd5dcde3483b8b81b682942a76300c439309d6d69ed13dfdafaf7251a9d4abf60f6e604919abab4fcc481e6e8bc081210ea23cde179509a5c3f1cc38b2f7fe8f0a4fa02d5f76ea0db730c540ba0b6794bc980f26e3df2d10a41b3cc6440dd9e93816b1c407c2102f03ac3141ebb81ae3b11550c07f45c72725048ae5219416a807aa43d4c306256fec7f1fa4cda0bc96a7cb816a98c4bfd53bd74eb25da8b24914be7797cfbc6fd0c346d650e1a710c53727b252739e3d9660b531e1f43c6ab04a8f5daba1f17a55a04dea4397cfbbc7ae7c9910bd787bfe02791700f7cbb7f7010357e1eeae7853038b3eb7d58f03b002a739fc32852f0fbad23d00cb06cb007689b147c105b069ae8c98868bd9d8d2f439f3df554be8824053f9eea66186a6d69ceb7919b5c7ba1854ec11fd27c37585f51ae4c7bc6d3ad16eb14fc9480debf0e99d3559523181cef3cdb9fedade5c9c0c0b95c6b07bd53c16207ff4706092554cc566ad0bc9556e1b11c9ec69010864a293e226c6fc45dd6deedc13ab260e8a6928a72f0a5ce667c4f7c776096ab2ab866715c5b39f24ecefe46e1e2444e502128665bf8d28c393910b666cb1a7e4fca724be6106e846213aeccc1c71cefe1e57b51ae11343ecf0191860e459261f2b39e67470dde846066f21dc49817f35e8bcbced35c5e1bc337e658cbaf25bb7c57e5b02f295062ac80b5b03e04eb0efe4f3711dbb8fa4276407c49189a6ccbbfe650f9f2256d71005da185a4d74f8191f47ba405bd414e7221aeffdb2c5072a2dc80cd7a4586311007a2a0fd64e95af01c5ea28cc06fd0b294f3bd8610e3e84d3b17e17f45e64859f1fe875d205c641ad26b8914664d15ac59bac5a18fe47df04b62683048de8f3dc08a6f58541336b3c8a1b570c104199358d0c9a9a8bc781208718c7c57f6fea6261c918d334f37a507314aa250418fe2460c7007fa9843696887758133b7572385309d810848feb69dc48bd10f7324a59bf96a8caece3672807844de09b94ff95853ed2ac53c4e33f66814a35b725f83f200e99c4e7cc0361059d68feb8ef68df92e59387cec460dc9291f309736ea43290c96aa8f33fd9dfee46e8e3fcfa01fa8bdf256ac146773b002c851d9304cc68d31dd22bbb2e56dd9a65fc0952b8b660e580004142cdfaf25d281ca235d088012d773055f01311369fecd6fbf1f68862c7137b11eccc499a3384721ea835c0bf06142c481d2864a2ff0b10e87814f867c185c9b2ad4343a80412a6b2e3734229b3d03e4819117d9a8b7fa0558508ac87336a7abd4027e12bd8f663eb59259bde164f6565f031d45711f68247bee65050f7b597783946cc71c83c0ed11e7d6e0000e20b901ecbee932bb4f5d247300353216575b5813b1d7c390c41e33798549bbd72c989b7f79d6dd319e74756db96d5cfb98262641106f7c14c4f9b25fbc6d124fbfda7355fd3db79ccc6827c1923fae3b980f711e01ef98af7e5d51ffe3ab9af2229326da7e44e5479fad6ec07fd4265041cc0acf79fce690c35971a3a810241ec80b2212b20a91dfa04a62464cd126522fa15cd597deedaa77fa5359358a7e937bbd8f04ad5738bd0df02087d4ceaa5e44c0328255b2df0b3f04b1990b056ae9fbbd0da569528787a997574d307015657079b79a2ece98fa5a7d5dd34d74a51dd6cacdee0b5dc89dfff6517d45a132fab6053425e1ead06ac67f42adee455d8dd86dd2c888b779e6bcb4a4f3eae6a5abe1cff34252e27d8e7e54073c86e61236eccf63d43a760dea504677010e17c1891c30bbc288b1a31a0536d0da1d7463fad555d4197d13424ae002b8fc6e7760be0022eda7b040aebd2e0b3b3ffb7e94fc28ac11cad9d2cb981301e14e5f3e952ce4c9360c94ab0c21d1c0cde4a5ac002da2d0b567025061e630739485a72628b3c5618f241f33478f94aab9e5425a3d18a9052a1513c077cf00f946ab9d00d95a6bd3cd4894860d90d9e6d1123fe2a4a4929b6509c12a5b99f234d2977d8eb82092f5208db158b53dedee11861602ed9194215cdf9874d339b3c91997969833398ba1b662d31a1b4b8522f6e579cd48aeecd58e642fb1c999a0dac064ae5321a29dbdaadb2fef29f9820e31dc031392bd8fb77278c346137b9a1de80f63e98d36a625bd183525ab462862d1f26a374563a0e68358ad1368cfbe369e339320eee86b12e95a1b7585a85fec59feb9535dae9e37ecb3d821b1da95f039925c56b3864e51c33dcaf3097de3788f1775a4628abeebae1b926b3bec6e6c188ddb0e95e55384f8eae37679841a69d2f497c1272de27fb76378c98824f608f6a440734ee380a93d5046adbe103453a246426ad39a0b017d20ec8763b7f360d0eb2f6507d955ed09e6131b2d1368dbbe1fc07d27885d18d84383b186dafdf81268792d6db03cbf70c24dd622ba19e4de2c6f55c29a6ed70a3af4b01630d67aadb5837c4edd67dd47a6f0e2e94db0ae1ccc0eb746c83985428514321ef68dffb9ce326305fba4aaecfe1fb9b2feb65148406c60e788507c1a083ee941837465a5e36a7712ca0cc6658c42537c9f3de1de393c4b35063174a9c539b6e19e302907291946d17ce786e6fbedc820b3ad125787dcb6d515ae623b91037a2ceed4298035489ffe980bf8aa2656e7d6784034a8217c14dbe598015cbcb16d37e2a52cfe6eed3ca16e7d0388bafaf67a94052f3ac829ae0ae3569977e9ea3c9c8a857b6264ce14997be158844bed3132e6e4ffc83d315024ca594ffe3e9f6766d93ab8537f69bf98786e97f43c93ae9d825a5a61b772d59142af6e6d4a7a52368f3b0f71df0ad26708cbe69ce66d53651385b99ec7beb285f484f452519d4e8d0a13721a2131e58a26f76439e8484ff5343d114ff29bc449d8e1d255da587d76d17b13e189f3b6dff6148f5f51bf671992193ac78a4db52efdfe570bde037f568a4f871faa3f48fecffdcc005f9939e5a04d33a0204831ea54be3569b3c37e37f3a08860f5e031b7925ae46ce8510d61d9f263f50c1b8307a362461eb41641cfdce886d98b176955b7623aa541af721b7088d6241eed0c24f704a74f4fc2b9ebffec24c6b62d9e2abf7eba7aca822d1954d4502b987a6dc9072df0d1e8b2591b9423d79824ad9d7d6f16e46c1120de8b93d68d3758796a505777abdb4308f12b09f595d2e011ee0b4c0b1b26b055f52e9121d049baeb221f0053204ce6b304495a7dbb1754924fdb2d6f33ace0ade8a81ad0831a6b6383bcfd8ef41a7d4f9fcce8abee0c3a22ac789fd084a8a9437aa8c8f6b583845e87d62d70ccd116bc73e84aa711a7e403db24ff3cf1581cbb44787919f44e4a9bdd1f653932b589c394b870511c18b92f7d088a1f2fc1d5d2006e7a1820f0087b96d46a4ac47459f7afbc99926f81d72768c490455230aba60880156d6e4c77fd592a66502144b5aa8a21628653cf60a5283116ffd708628d62410cc248c193eba17b921950980e3d5b57d28ad434683fd3d367d2d0b3c2ec59daa0abb81f545eeccd9ab09b606ef718d5eb8d88009af0553a5a0509f004522a60bc22bf94862bbc8883ba2189edee156a7a4930c71f6eefb9e00492651e083a6b81ac6804463e066aa9b3c06240c8abf269c48af7120b951e1a1d4c9a2043f4c5bab55b280f33b1a90a4ff3cbdf5b19aff7f1b7beb90cffdd2fbd1b2e8393ce4bb2c25e2421f0ed1924ad8d5d75cf80fa43a6fc4509694154b0242ed49b5a4a6e87f4a49b81b1234ecbcaccacde91956eef9244bf146f7746b9c36a553ed53a6b35568a40a47a812405352c7d18df8c7b742806057350a95212e43c5915547ccf56dd512f240385681e240a4f7b9f372ad7ba4f933f9e780a0c50bc11386fba66d218632bbc298458799b601e85e3c1b373c4c8e0ec1e658dd9fec554b221fea41287552e77f5e8d43ffefe66549fb8fc04c3ba1a1b8e30d1241bc1f80c582d804d0a01f74d13589d73e66c1f2c2ec418d13bd18b1aa38230f4942c698c105a7868f6f9512266dc468d16cb829c387acd0d34665220c2ad10e165cb8a7382b611354e40af5ec54f93e46bb016c8dda19728e1ece40c9a22ddf73162b03351ab7b6e6af92bfb5673fafd789b00186b2174e552ddf64a42ea5c449d29e16040a00eee62b3bd570aa5925d7dd3c2d21c464422bb2d76c00bc0d0221f7d5b05f8c2179ac5799749d9c7be6a404890d83c88a91fb2b272aa048ea4e6169cce77b9cc6ddb0157fad9168c9ed9df0b6a2ac803e9340ac3b3100d6fcf77556cfe98a52c95de4cd4d043538c0ac06cebb52aed11d6ba0958b9cf5be8ca924b160829fbb0d1f0f5d987ae3016a013b749b11f5d70c0a6fd16ba10b6e1dff871e02080e4886b16583bcf226b2d5a2184883922fd156f305ef9b43449a7d27c048596ca5a02569cc905eabccbf71acbeab07b0e59e8ae7ee4128abfe5b6a91fc6d007738c139ad654c30e0569a9ff99caff9ee37f9e2e1af84205a7482c4a0fdcf8f5db7ef03eeec971efecbc5e8494466e4c5e04b7b3fe2b89eebf720089768768b96d78e5b0b907d5e3dc0d5d87f919a8216b5ba12ad66cb01a915414d40875e06f3d73f3d4790eb6b6fc0e2968ae65615682eec66a9ef7bce002bd329405486e13e4490f0b768d4badb9fe7b12ce2c756189a97a41df8ed2c6c62222599b7413fb3179fe571ee5390942a4973a21b4c400027d5ba48c70774ec0e1aa7e6fe42994d75a457d0a091e1aa4f9997d88def6fbdc3b53bd72818e23945c8e1c92f84fef7563ccb75b674145c55d2c5a7f6847c959c7fb6c7885f536027b41b1be4d98d4f148b28579e067183c36a317e2f2dde1f48240e422cb7107add2d982ef039d658f6e1d1c077d85be50b29eabe87da3d454300d12b55d5d301e40b7d9282cbcc44e7412b30495d96f548adab3ed005c24e8f16ad4c0b93f104121a33bece3ce3536ab7f804226042d83e545a6e0c57c9a9312b0fc518cfd1a8752b7d007680660784448bbc9addb7ea43a8efa2510eb67e8537f51e14bb5b3fb725aee5ba4c87db90007c4d79083b120e9257fcd8e484c2d023c008456b1c9f646271d38c719a3dda575feb4384efcca9b4206ae39ef0f5ef83f4e368113b4e18d59a1146a75673f9146d8ca69b3bdf97787b8ab0a92a3af23b6f42824399331e03f928066977c8c56fe831c7d615ac1ef6a90eda873e07e7755f55d5d1796d7437698637c290c5853558843c10837af1c7b43c182638682659f8582c147a1609814387d68456b923ea82095b96a51158a64e319e371a24e67b0aa8e6b4665bbcb26ab5b66b437b9c68f33185aaa0684328eeb80b68d4ed816607ebd4a48baccd964971ab5ebf82aa703c28e5a51bc5f64d7a167507eddebf8a8294d1860d26bb35a1539a66f810611abbf0c760b0255aef524cf40f6151a3455eb403b9a86cc670c9d378246abce81be45ff505c8202fa2cf4a4e56cc9faf2ac1071875d878b41a5fada3ea1191547315accd0abb92362ceba7d7ad6c1bde9b8dcd39a020d894ad27abee2c18760bb3f8ce59a4971841adf462ec9cff1d5a60e2af9b84fcb37f593bdc556affb3f54770a44b40c513ca907708f90605c47280b37d2160e2fb46db69fec7704da1b6ecb56a17e2f456e619c24674100c3ded775b727036d172c4ed7e792b37cddf5811250ffd1f005fc7716aae1d02c4c344c8f30398691b528c6435d4d25864b96053c702dfb9b71eea8e99f98a4c65a02e32fb8d90bae65267ef304d728a7620a4a20993bd9ab37cd931ba124008db81ee9721da6b590efe09b43bdd089ed71c3a60b4460e4d02f3df5996ea29296a2976c98b07520823d1944ae02d55bf63219c3206dbcdb04d25ebc7ba886d1b2244f21ff8c9bd07336490d7bfca2c2a45ed03c2069587bb59c2bda0025775b9b88c35b8872eaeb1c68a15c156ed817f928ce77f726c0a943efcb3d02f401e267123b091f896d26a6b06d2867bf9b55fe341e860b508d2fedb1a6a1d3102f070eeb850efbedd622f0aabd1b30db4e843972ab2b6dc748ca47a641524455d1c1d8308a5903adf72f50bb9878ce13a8bb2d404894b3e7bb486ce834ed556b258d3ae5f3f368f5f891c086c163900594ba7b729d10bcf7c8648d0d236ccb78cb70dc4394bf4dae35444b539e960d3a36cd9a7b08bd7addd4c097225cd16114bbb76d75bd0fa02e482e20770d2442b03068644c3493d1ce6155723b2c8b827d382a23f6ada1b4b4497e1cb4d677ad2d8bf9a962bd61e8035dc7d1b9dd01ebbeab5cf982e6f9bb89a2e8b0bca1b358d33d94ac46ae4293af1d76510d5aed017078adfb98e2d37eb9b812cbe08cd537419ce9eaafe329f6b9a0cb81eeedb846aec2127b41ebc244bd3129314f8da7fe03f7de9ed6a41dee780c0f488ba031611f0762ddafa6c19c3d32ec972e95a0ba162b352032bbcc4408c21a602dc3dc148110c2bd5517fcfb262e2cbfcff4ecd7e05e6cd735017ee22ec1eb5ef08a46a5142be8487170d17a1cad6306d7117c5f68590a5dd1a34066bf43cacc2e36fc0202c19775147766320f11dc3300ddfa9703650f9944b3c6be3de02cbefc5fc69f5edfcb4b3c5cae22c964ca69331bd870b9319a8ba897dfd1908926f049879eaa615b9757ba876d210b8f915a5c9d44dbd18633846d73c93d6c64bda97fe25e7cea5f8e2f370d8132c4e96c21839e4d455aa89b06cddf8f7a4cbb228d6f992bd6beec31c2c1b6f8478dcb3be67cb19c468ceb66107a3820548fef94392cdaf528aa17bb28f5010a85952dbd0d1764cc20829cb5668b8e972308802cc7b064584666e5194b89ffb9247739f26a47106467b6471a0e3ccdc080b9cc86c6c4c3d30eb109006212a1314f232542759695dfb8389430162c344819bac618a230b8dcc5b8c108528d186b9811ff07bc903f3e80ab708cadec7cfb764c5d53000e18d687952c66705b3f120db7173d82a7654065f0202602baf1a7a1b244ea735a8b8717580020d2d7df53a6c7c6fb009215e8cfbdd84096e5a2df7709f4f5375260b504f356665e3bf0c7167061e3006b47830ea68526e8272fdc6e6ebe0305f72873763acabaffcd5e95f18d6d802ae57a86cd58d0f8b8bcc838daa9d57a81208f25a86a44c996aebcca72847c71fadfd51ad71b2c3ec397bd06ec94f55a4da443a5d94b57b8f4770ded4d70f8f43405984f97bcbec0e8066d875c2e0096bcee61d478afc2f8a2651b7184b115cd184d3b018d4067887156bcf0535ad1c7d78581c2783f4e565eb9443500d9bc11c36628d1e677c510dc95ddc952775dc83e44412343f8713a98cc063e9e90a65f77ac3f77957469f0b3c32c83ad49f65fd895c3bbb68e8a23f00d7b063e1a2149275514adc490bd650529a2dd9c949c86c6b811bbb5d9d2723d807cb6b5ee7f21cf33d6e2b4cd2c54d2812cba41b3ae0f41aa241d8c6eec2ff351b7d9c397f6d08f9ea55f263daf4eecb2c1fbd6705dffbdcfa42f2634aed5193a6e6f5312c2603db63902e7ddac55dd88468ee21232adec121b30a60bb6a6a461a15039a5d75af0484502800d17172d45f12a594d2e60f3737d74c7c2927f670e39e8901c0e774de01ec06df236d99eb2906ef9b152711c1ecd18c5a2b42d1d490ebdbdbfa0eeded49d73a00a3edf861843b4eae5cb8ea24847a5677af6e075dc3d4db462553a89175463d8e6d001c206f49552f9d9f5976f3409dcd14ec841c68216bec2a5526fd1eb2f55045f16ad629debb595b3e4603cf1ba42dcc7b1d18dc73dd989dfd9b3215dc32119a6033830c2748cc4f6ff9c0801f0cb8f251ddb268eef8ac6b4efa9aabddbbfc2a2e0c86a6b2cbefde72af893a33b45e2af6e016abbbf6cd79327fbf27b9922e6d8a56348fb282c8e5d796ad3d0d5334b7d143b4a3d68f132756e61ff649b36a291ea840e04e6d7a20ba60adcf207b41d8f7fed65dc6ad334a3aab591ab6b942cee1e7a15852e5da154cf5a1ac0d808b92419e54bc877a1d2935532d8b6e2dba8c107fb9f847a2e4c02d1fdcb7df37b91b04bf3c7d37ec0d05fb3642d38a3310a3024887250aa5aece984d71931b2f036f4e4fef56325526a5a335f107930e9ef0584cd86276412cc0ad34cb5be3d77663951df7a779c382baefcb0de007918302d4082af3fc3bc6ef358f961f3b68d496328bd63cb2240b80f66b4824b83334fe06cc0a5fd4dc68e361121375ebb05cef12586b7efba6eaa61f3d9a46e6ed7d60127f0b27356b2c4a58147159cf7b28ee8900af983e257157ca83301c561def3eef7ff5fd7f6176bc36054c3d29269da04f829fc6d5a3196ff8d2ba39356a55ea3f21412364b4637f338f1b4308fe943da9f94f63dff29c781ff1a14fdeb472b65adcdd9373deee22c66fe498f2895d75b49e10a39fd8353a7a55931731e0b25e2b4e00cfa850e50b8ab43d1e66c934998b2e714c7c5b580d2cf29046b1140fb5a957f3f603cdf39a160d167892fb1b1ad4deb15508f906d012affb3db17cf285d62d304f347393118a63648350a7727bef8971887a3eaec8002cf84b530667b2481d1ff6554afea74255ab1ec4529e99595afa243b20c9b62072ffbb3845111599aa8b2c1fbfe62f06ecc703287269211bc257b7a0e7c88c2b3b4f8efbfd7bac2a088ae731dee023b7278da907e1d560e21d0299b78a550834ebd485aaf9030e0e4413731a595c1a537dd88f48485cc4f2f2b52fb8a0ac6b8f814fad478a1958c68e1f5e4c4d87429e080ad939fcd78789ceb440ee7b41cedf340322675cba4dfe000e9424466b629729f471471746dbac19f93c8e7db94e87abd2de4502beb48f23f6b88bafa2653df24e570fbb2831c7177f2a98c02bdf50e7865458a54862b974ab5c583f1e419112decbba5cd30ad34c73a09e2b7cd13dc859f9372643649d75bf3263de351fb83ff689143835852f7269f685d10a92b0819490813b2b41e705aa0b70d4ab5c36b590115ef4dc797d7006e945266ebde185f92dd8786742dec80be0b60692759828ea9c312833c6f445ec946e5dd8131a5a2507f6e78632922e2b3d6bf774c0bb315e862408bc50776eaeb32538809faa134e86131ee2d9d7a46102199b84af5123095a0e3d0122fc03722b4a78f63f0f1bb5732eabd427d879520f49abab2c728491bde5b84ccb8735b3b706c054a6d76ff876f9ced1896dbd2a01969a939ddd95d20d38e8836ff28976e905da587f25b246e7345bc08fd9602409aa2a9d668f047523da5a4d0a56f94c84186541859f4f4af2f4609bf2a8c627317507d71e9aebedd30c5d8bd79b08b3620cf20778226709d6d85559a43d5e962be5431375b160d2a5ea613d7b9e6060a8e08dc3e5579f185d8316c109dfdbe0c48c56e08a1a1e824564f68f12412f73aaf9cb7ccd3b6daf2795fdf5d598cdc7a8309ff84e2725da90355e2f6aa3313239f82fac3a1134be95552af5e94a02fe5943a3c4cb09f9040c485ac1b7aba8f30898219ed0a83bc056209f82245f4e1dab568da06b2303e359621face38a3d3554a4aaa3eb15892fc4bb2a04daadf5936fed30f2d639c0c102c21ad140b9b1d68cde643b18772fb882c1d1a05827de8714220727e14254bab43321126a983b3612c4e85337297fb62ab1fd43ce93c753c87503cd44abd66fa15d1cd1a7b2e3b63a8c477c93cc0387694980312e9014655072247314ea36e7871c457c1502d2f2c4d100369a391166e1722c9ee7c9c7c98b82e624de9779ed120ebabf327a4b833d23242d0da163ac42c762b2bf268d46aaf0ceabb2d5945a0b4bd0af3dfc412d921d04e828940ad9974fbeae358a203692517fb793610837bd0a537f5bd386adf8b200392b839a2430ea136da63e2dd174a79408a7ae6b7fce312e817e51bc1707abef7b43d703b1d7dd2534c04dcdb60f8ed6edce33816fe6bf8c86b4285c291203db8241f6e85d8b94a86572271415787dbdf8922150c62e840301085dc1d09ba294582c14cb8c52d1fa44ae2afb2c9a5eb2f5ac5ccfdb203d2858002740bd5ecd7baf51b175274cf79294f9f21e893f656d95dd4208434797a9a9f7680b573c993c606f3f05e667663f014d67c352588d0a6b8674b44d264784026b8250c9a9931a1369f653d1a7a5b833c3853b062ae50fcb0b33d99d2cc693c9706d1b5c2dc6d109583866ba9ef68998245978c2ab24896974f773f308a7e72a47c3ed8a18600095394f9076168b76a2edcdf118a0ed689d3c9b9b1337a848c0665696128c9d308823d57cbd4b5588b08cccb9d0028cea8450a74e679279e11bed8c64364a0168a2fa5cd31373efccdb173ea8883ffbdeccb1506156f5103c166781477d4048e020cc0967d95263a3bec821c9c1d6cfc46aebf9ca9aab71f206f3ac0b57876ddb881dd78c17ac81b66b3e93cf4be9b263b8590d987bce137b89996988a07e24d1e9402b6a9c501c17e2ae98560eedb2ee17735f4fa61a1336f2200c1ea900f139087ad75560ac08f2139e3126fc62d0df9173fa9ab579c099b5cafb1ce1576e88e6bddb057b25e85fb58b2ccb5edd9e532dc1727c5871b68fef40dbfd89543894d4ba4f277894003caa6666a8620cf518ba263e28690ac52a9213c639552d1ec4c006ed6fef533878a286ecb0a5c4136a103cf5227f712a4e52a0082a2810d6c62eca7857971aa719db4aec15fc4db90c331651dc24703aa6a43e7378f36a09a87182558a145aaf5d0f8a438ec7ab4e55ee46f26cd7eec50321a6ad42e2c7973ee36b5eadb839ea22a9d87c187510b9152011a9352d4f435be31245db9104554b83e310beca68a205fccd3c9e9880b761cdf7b7fb1a95263335f1fafa771318e28c9a5d8fb8545e6a5a881d2aae9bef52af9bf6a82035d63f35b4a897e75c8f487fc42fd0c76ce79a712e652ca8cff004ba9e266430c7af5b25a799fe1ccfa0d2ea5a670eebb19f1410a55c3bf1e7320c10af100782116ef548400e8f3349081f927020991c660281c4654d9129cf785b965a538635a38c0e83275d111ab27ccbdf6da9a41ab4abe045ceb571892ea7e6bc824f0ca48d02eab618de1c65032b8e4e6798f83989770262b9c3331cf0f9c46911e8d9a1105a4f9dfd602f7e006556a895fe0f1f0ac07d689fc6779455bcf3c181fe2112c17cb8c0c04d9b3d911aa0dc0b44ef3140a3ea34c83c09101e315e335f5005d99a571c7e1fb0ab9aa637e78e5f460a417b50691c5edce23b33d849fb267c1875893878c3f043859f6d7bfa00613f665035029c54738ba6e8185259c623e022bbd5316cc15482d63bb14128ad97c6eccb05d58141348b0acd2119e5c29ebcbecbf58d9d2bd7b6f2a7c644ae5c630387c2cb1c79d1a38e966791b5c505aca539e518d8feb4790877515fc185aa06437773ebaf133c826ca0553483defad32bd164ff1fc7c6727c162f530d28a13b35f31452b89fe52f57accbf94ebbfbc102b2b77dbcd16e6e252c832ee41b790e862d6904d858c59125d1a880c89a22f8cc8404a740d3491e17a856ae9b18a871695b37c8bb7691333b95e79623a8a43ccd84c433dc89708eab7e8195762ee1402d3b0c708ef94d6cbb03b778cab2664f8d703fb65354fdb2ce0c490d3568ea535ae744f59c850a1d753472cef9bd9e4cb961acb094216a653f81865309b2a9d067608ea6c2a73ba0264c42918d208c4e40405162ce1b215fcbf5db621dd1bdcc10e4a31a78a6608772d878af01b1fee6db51ead92b8c87becd080eb6c446d444e9783a04e67510718516b3c3dde924ffcddb4938fdf6b97616d0fb3ed576a5bfe7a7fa8e63b866b182a1d291ab63bdedf2a1f6245a8f6e386d60d8fefc134ceb2c14298da6276ddfc2e1fc8f96449945cd30c1eda0c9ce1b2b838ebe1b35d113305cdacabeb0eb8255f67e26b4aa5a6a6e36903c128b4eba4e4c9cf1e4e6c9aa513e7aa1115d3d958c3f73455b0a51078ebfe8485093aeff32eb38d6c57ec86c5f7697487cf525dfa02e613903c359539da6920307d5a052de46cefe1270071e1e4a0b1eae7586f8369b59e320b3e45ac284f936e580bd70e5635461fe85433a46dffc8d3eb03a7ebc6e5624f1dc901b885b1854ac6fc12a31af673f2a7a076d4d53137d58d39a5e2c18f9aaba437f2e0bbd7c0223dda46062430666f3198e55bc510a503854c4abe0d338449e6fba93521b74c2e165ee52f6f9a533ab38b50a8d985f4d9e08d6fe4faf7da242910079672556a5acf11fab413f02bfd4b395c9b3fd5f4b459811b05bff097fadcd6178921b51a11732af2a07629701c4a9591cedf720f1f2aedc510e8ca26fe7ca2c3f68bd085009f3c9b6a9cd52cfdc6c6815ff529e0629b6baef6731de845e1af5bdc1cfa4ffbde359a510923c27c772811c1c82e6067f8d522e294c1b537105ee22588357f11e353e84f9ebdb8a7465777865fbe346470ba5917a8beaf0c6b33e44ddf3eef370e7cc00140cc3c12ea85cb46dac8c76558635459fa528fe394cef4e2150add2744ed52d4c4665aa8357e969a1219f0f63ced49f5efaedae4b4af7e65590511e8b9aaf788c3ef2d00e014f5cb583684de0d44d103eb9e7d506c524b9b0f41e5985d9059a1268c6ddc3391cd3de3fc06701adf862583ac35d20616fcc495a7134398169949d543f3468c633932d09866bb2b52abc5c55b65e05c4c2caaca98def471a75119e101e6fc953cf12f0788e9b0381c5636a5810c7b6b5bef7353698df14df892cbe3c739fbdd503c3e0ab38179e1a5c4175955b7c675b164ec76d3d04c96a4269ecfa1766ab2c6596e2dd19110a4a76ed02668acb0ea96ac4ff97eeda34c3fc4a8df5a711fdbb8d26b59e9c152a1414db86302ff6eead7347f7646ca0cbf8f8042777a886d8bf4889e63e1ee331631148fed1130ca25221631571c4c0227693e8e6a6d9ea44d80471047ab1f1c9afb9d3e7e12aef9f40d2e2e6781d781a577940d3684753319846dc33e37376dbcaa0b4f48db8c1746edaea02365696d97568c8a1094f091d31b199c28c09a69b37551fd4f875be1a2f4e9619ba30e0ddc418226c337628901f8400850704a0d9c819fae5ede11db0f7222a18932e76ea52e14c91c6430b324e6ac270b99032aad18e69f1b11ed6d23daf5b4739fd6b4615649de99f6df7b5817a3f535230357854e9f1b9531174f87f4d026ba8719503e838e3a8d8b165fb4ab4fd3e7a195f151d71c5b0e6df29343c76f58acae6e2d3b65d044477dc6fc1602bc01bdbcdf8bd8c79857334f4ed523362fb9b41bdbb649ef0ca3cd0c99161dabb70794b1da20c4a32c7e616e4e18e00d47b59d9941d2dfe64dae612f2974593c25c356037e76bc89650dea6a5f1bf5d49dbe69ef3affd3deae55e07ab732c25eff3d1fad7a79b8e1b58688d78a83abbffad98cc3f16fbf8230ef8f69c83f4d94de99cd752a2ae82ba6caf3420fa7c093b8f929297ef589cf7903de075e6f3dcc6c9993b1ca99a3490d1e63ca5a5d67cbeed5379f097cf869a99ccc890352e6472c5c3e67fda81583ab62b62b7b2d9722a6fa5061f212932e13e538a4dbc4d85f58e34c78b23b116af0a125ced11a5cc432c3f4b0775510f7b15b2f0f35d4eea20d73afafcb206312e71c6e828ace55aadad38b6228520322dc9196df603bd021d50f297f081bf9de4339895355390fee47f810b3f37b5d1c6ae0d9f9bc3d9d249fb0ac8e1f6ad793985c6edfcef57e52198d02a73911fa6c0af475d86ed32bfa1510cc909beaa92651da5872b682794e2dfa480ef813c4ddf59441c12228bf997c27a2e328f9b22b715cafc89af60e3c59dcf8de359bdf4bad3b535a236bde1e8a02dbf01c55baba0c885a39653ba68372e678cb20676f17312a990332a969d0e1b403c94aefeea8b87d6b9e195138cb58ae4594ea6cda98b088495a2f423eed8a459c8d8e4a4aef7d921b938b20644e6b4a8a97e21687d438d2023fe56e825075c8a44582f266ee4a520b3004a0341ad2ed0e54b4740434b9a3d4b9ee6afeecb55c4333da8b35f791cb6448448cd4813eca655a88845859f636a4e68831b025cd522b7094d46043ee8f26cfa967baaa868fc4ad184c194437008fc7134f3c4baed36389265b769d08fd1c268e4939bd4ed3b3036eb3a6805401fb51c2c2428a900d09acea8db9c26ed7426660158069d23203649a0bc6e65e1d85a66f692bcb360f2a3df728dbdde2f1792a925514bb71c2cd4a4a3a439d829625f1989a080fe4227b941d9aa928910f6af4699486b2e3af8ee8fdec3dfb30fc9720a1b0e4c6066d87e8b54c7469c6864a0aa60d350b29b62eb13886f7adddccaf92139399778424f95ba67d60c8d74ecdcf57bf806802ff9e2e6e40ad3d16a97806a7301cbf297d230541db06cbaff6e38208cc0d715b43ec5fb6413dbe75e19f828993d00702586606545c9af8f4cebc78937a85120e1f4ef60b64d5cb669b70fbed388b671da875aeb783e421d30daa80882df8520ff22d2ed856385044051b7c42851b067437398fa809d43b733fc5804c056b97212747f78d9fca5bfca0c0a1443ea37e33a08fa596ec61116fc310281a55afe482e61efac3173cd1e0cecda73af9addaaabddac455672ca077f6d0257505847421b0ef1a44d092b7c04dc718e15f10b12e89c17a31f3d4f5eaee4938ffce6ba7d2ad21a65af459c6cd7bab37aada38e9c0eaeeb369885fc286e096a1067b058463c9eff075d83247065e80d754ab375045cbf553b789c6b97e004109832e812fbd608d9c6a314447d1401588567a1b52b0ddb7cc49cfc7d0338064cc8ca6ea793df299a172c7c20297ea214c05d94ae06f58b87660196327f8ef56412e14bc80ac153c15acc22961814324de4d52bf0ceef53d3a1ecc181322c51f5fb2fdd75e4c0e0ea7201862a12c6e27f2c1ab67787efc55887b702ad7178f3c83025cf10be9a76edf8293c7853c51b6585f1be9edb42cebdfd728528694cc09900a894b1c27fa1861f9abf11f455607fe19dd8b35c69b86c082e9f46380cdc414109e33901193e106abfca785c47bd9b5a35ca2529eda52be86d6524b95f424b92ef1752df3410e169ee650de89fc62f4b4c3fceb9a0487a129bf68848287df8909b518a344909a1d18b39b746a66758b0a6676268c826e7ef7b9335ac54287b7f9c8c1990d7ebbb6bcb8ce41ce4186f92f858ab74cc93905d2f876781750206c4448871bf3aaea493129fa011bde17bbd34fba12ee96ddae25ab48fe6608a882c642ff089340166fa6b5ef7e537e7918cc2a0946bd53b1c564ad6d99595e37b2c28f91d90e8b02176e4c163ebbcfd4a934c55e72baebaf8c5bc790c2ae7e7cdbd50bcec040f676204092180a3d8bf58cdf8778003436adaf081a196a15b2acbcc9fdacc63a3a3306b36a46a6b2a7668bcc581ba5495c3c603edb43fec8fd6ca1eb7bf7532a971036f9e3cfd1c9cee1e2cabfe815a1a3e3011ea649022c629731495f542987c5a95d06b4c912591d487ac765d6bca9c67790c57cd01480739155cf619bd3bfa397e08309c40687cf5efeef6b1bd83ddb36213e5c367973c34e791e79ab552f718ce070fb2e26a9d4b86e4010951a63d29278cb45a6d64756a8fa74091e43d975c16bd23b62abe359a3f21e504ea54410934a478ad8626420d3deab47769a8529adb01123f891c2f8d5abf45fdc98b0e4b2d1db18be238888f362ba846ca961e4371c60d1044d1a97c846500115fa17f669640fdbb87258261ecce9b7f4cd2191c13f6b726524d2a44e61648b928fc205aca05342b46d45c0f7e85dde4ba72e82c5386a7bf511ec31aad2e091c920f9e2521ddf712ba11c97a6ca666774680b7e1fbdf2da48a224dab17718ef3cd39d4e7726c7a5a0381348dd3b6d05442780ae407167ef7dff9477c6b2a3134f86706c59bfc025488e5ea7805e799d021a1b86ad5b16a4b4cd9a7c57e077d102467afdfbe85a142a4c99aeb2415821c514acea374c184bca2c0bd7a32249f3c52484507b611b13ffbd8438b6b9753b5680f37ca4798683516144f89114113ad38219904edffffbf410b7ad6e1fcb3eed273efbed421d7b6e1777ad5665d3fce4f040b41660cc95d93a417076bf8ee8c0ff48108bf45c6290b09259ea881cee1f05a6251e0704fc6a4067f28febb703ac8f402dab82851d8a1604191563f11adad1ec514cc0c7b33f45fbe89e26a832a72aab594de1263ea287effe12aa76be9c3e88c7662750cd364b2ed208f3e06e8eabea5d576a9f263a7f4d454225402606bc7c2c310b9887d73e9f6c4cb0dcbf436c3207d7367843346d7c69adacfe62f57ea9727dbfe1a9be8dea869eb15f15a6778d74fcf4971f471b15f531dc81c6793ff5688cec1bedf5ed1b7d487ae1c36c1c5f58f2427f1ef9e835df20606d2378dc887488fa9a1827eee99031f0d5875248a8880833070ee53fb05beea5e9c006f13f98225ee748dfec0f7baeb7b07978446c9fc546cd62449d4e00ae553abb343a1f2a288392e12c23cb28da5df5a62fe79ceef8c8c3d2018730beb18196049afa673c03270c9437feb7c46de718cb78c254beb8bcfa64b9e0adfacdaa99723131940e115297a7f49f4cfc83817298fc76ac0aac0dd5d43d863b6a6d3d4a8c8544b07bf9479789bbd2b86b372aec3d7b3fe14b070061373b37a7d8bb832543cb8ddd20f4528a89b4d9a037c13fbe627ec2fa9a2930b380e7bc51ff3516213d70362fec3ed60f830d98e37db5b93926a0926421a559db0c25fd0ace1f6680ca191d1a8437865abb723ea0b08feff235ea06c3496f684ce5953b216de95c49429ec999ca2b19c8218957474ec09f1d3a36d918718b6d36bb2f60eb0cc5449f05bd4a3ab43f7ad2d0c8bfddbec84bfe47986512da47df8e19a3f7a06beab028cae04c482c93a015d32106a3da4ab4565558706b857631e169b2829a3f514adb95f84d7d95803677008d9040fe9f24aaea68c7db77fcc28d43a1eece39ab411b97fb32750f274cfb4585b8502ca7c012bdb588bdc78ccc6cdef0353f1fe03779bba1d4d26783fa49a476ad9e3c0e35532ea20e78ee707ca9e579a10d2f1f7817e36698dd32ae088d9499140bd05c1f060fe6f529b66440744fb804263a7eb1c6e6406cf74a14d31ecd39a3bf4925d9a5fe52c5f2c28d6a9ad21e8c637e712df11c9ee47350579633efac03e755b644c375c76945e7a91cc0458eabd7d1ee7599bbe789349417b782c77370ba4c6f77d846837bafe815ce2426476f25995c0862110da81c51b7a1b0a553d74eb279cd47fd4eb65b7107a02b4823db024b25c2e8053d655b8f90b272b1f33a97f91131a2a81aedc82aab3230b7ce8daca725d2a17455026ad6c3e310e2fce5a64a0189a653c74dd23b4389eb70ffded55aa580d5baca8bcc0463262ef559575723afa6a8716d07007d1b0c7d1308e9319d12a2f0ef2e62a6c2b2c4547c109e37613c660b6c01f9d10fbc121f34a0a76c4b2d9305b76bbe4cc65ab4b620106b82a9233a6fa46ade6f9afd6c148894f693bf959ff1b6608e0fb4f98b0da0589bb82d901d65515f5a892f6feacb8b78ebb68dc15845a0653eaf553d4fb1e280de4b0c14ef341c987a808c1d15935501f2df879edca6a73adbb86a188ca835d043d366055dba9c698aad7d2baa53d26b929c9ed0608adacd7a26d4259776cb6c800d710a0f48b0940943424f557944795c558fb2d6d12a499592719073f4b64c141b4802041c3739a6d4ef369a541162b901e6146133284a3100a74a874671e40b1261e3bf6cb0bc4f25789135aa80bae71eadc03f14bc263beafe8936377bad99bc6ff9229152be1375a9745a178b0deef6c59f01daeead651a784b38f50371ccf407383df9632f7066a01a297618b6270ef7c59fe6a954fec8f76193531a1a7720302b4fe4429ab7b0a2f02f98da7624eba87e87bc02bd73f96b1488aa9312380f100e4921e45579b316eeb39f127be6d05dffab2542451b7586c2b38c8040169020efc5142302721cc06a52d4eedfb5c4a56dc266dd81c5f3b11c40c8c765245638068952553ad96122a734171efaf45c985432b9fd10ffe25fd4773c184bf3e0f3292b8991eb2c88209c635ee5ef66934d42c9216895e881af4821d6f25faa1131cc187c7f96e5fd1f6a4cde22a03cda38a7d32c0b428933e705cf20b65319838b993c35525a507dc3ba68af8aa4b7a011e17f70a67b0bdb48ab8fd8cb796e32a9cf5a1f5626bd127d78d7b38b5fa71ee621be14cd460b2a45c5ede0dadec5880bb2aa709fe4c94f3a13c5ea03147663cc1273214289bc82f865839daf9284b8e344220200e34c2688e31456b928ff045397a83c000639ba4539ee56779235b7ef4bfd1c0ff60d624dfe16b925efe6bde3d0a8c9c3893a7a7649a636247889bb9e05e008ceab442b03a622f84351a61c9930367563d205ed7680f47a054187eb5dd40beb65978752facbc41b14955c7a3629601282380d2a489b389f561864827ea8c87e920608be31b3fac9e3cef2075df8f84b608db354ab5ae67e1a6e03b1bcec1d07bf147980830901cc3c9ecb544bb9ab1d0340c65280dcbfd9dfdae2c362831a863351298c9b5d4bcdbb73201e73bb7cc120eae4953f11850ef84bf8dbd9085f64d052ab7b58df7cebccb29d8413f26f04946978629782d701357959f78e598ae23a1d131ab92525a3f2eb2d1b929c4140439ad7c0221a59c503b9ed7ec471f580c6c3eb2496ca2e6fdb059c192148c68f886b86e8a5b6755681076f4830e42a0af2e1ec7d4836e13ce6c9bb20e525dd2123e4a53b7fc900745b43206a5970fe314351f81e43e882a7d2177f169852f360c72699e622391729e18744aa8025105c2090bb956394956ac9a8262e9baf4756611cc0815f20092b477d7abca9d27491488e4d762a85106c2328eb794586d913dd0e03cff9cee5830523c00eb34c1ac7782fe721cc56143a7575d151cfde3536faf491cb4d326e3843a9b31245867367435cfad6868c88bbb77aa3c7f278c16d364bbc88ab613ba3438c02040e9421fb4e52adca70212493f16971cee32acc38423599dd6f2aa647a222481e0cdf8ac78944313a23ea15fa5ff799c1d1698c2529497445ce53d00b790520ea41b58015242a299e5458c8b91aa1cac039e190f7c9ee1fa644793a0954de497265b2082f34c484a6e89607128d8ad313d7673ba62b124f413edf686b7aaa27d388c073321b01cde34a42ff593f238828dace0807d44623401cd43a44822d2b45a10651f150d0802fe6045490affe4f7675f14fbf4b270951cc09bd2c70522fb45947245891fa48912e2435d1503a907903eb4ee1efb5c2d1ca96f8703740b862b639bda761d0ebe2ad6e2ac8146ba78c2d74e1fe5fb6dce64af3cea7daa23e4b0835c58f1dc69ff57558546461deed3437875f6bca132b730edf3e5b275268c14eb7ab0c2bf251b315ceff5ae0d2ce5826a8f4ff4bce82df803cd2c8b14c10199b43b2e5d73e5bfb5154103056650d90ffa933dc90c32ff9dc9602a016424418031883ab6a53b8bf5cdf07a0a0cb22d87584030e29885a7feb6d8699a18a01bafc36281ed26627d463750e835514e200850851188c32968a3b946225092ca8c2e521785fd489e2edd942ae08e72ecf4da9a64a5ca40ca1c75a9e95e73f8c5d4cc1766e6a2da88d9609f234afed0ab597888a9f91feef94c8d4e44eb1452303e745a03541a5eb81ba55882cccef94d6044904065b66fe03d542eee04f05ffcd9bb77b2a700166b2a372adedbe79a6e3472d6fd34d293a4863614e3a5a13441f8fdb2e24230b1eb7d95137d39e8ac7a955abc578849932133d88cfa8b786da8f742602aaf573d904d5532daffe0687ec68a68c78acf88f09c526a3237c12e30e6f7a5240ddcbf5c96f53e538a3ce95261779e4d70439759c1b8fb57a9b8d8a791d773cf0f02e79b1b0e02772bb8e61712d27548fc904a2ca7b4c138600e2ebe9f1f46e10d1c7bea98a435fccf02fdc8db7af8868c93d18abd661090248827fa13e54ae5801c52688f2a70beb3acce8cf1522f1df3a4bb7c6653b33464778c5d574d45be3222fba67e6c4956c7a5b362460e3f118ddf1b4cdf3f38f8350c1d15960feba90041b39de8fed8750cb4d87a4dd4d252f91245788f8b6b9a44e54277ff27f3ef4c05916ba2616dbf0f32546ed00fb102b7653accb4e551c9711f55f70583cc49e73d3c49da326d7292e6cd81adac677d62a193252c5c557d5fa5b22546280c2d9785bc1b722020fbc8bc18a4841bc3eebef5c6f940703fc69b0b2404e2efc56c340e982f6d661b91c9523ed8d06d99dfb7a9b82deb69954fe08ff79b3172e2337d7d81221371543466d812cd73e134b37e39373d8d0f7ae21d4529b040f2889a295b06171dff55f8e554458c2507943ea8ad1868e1c947970f63612d18060369adea8bc0d101b1d00ba15b24f9483efbf0d79d95063e9fa28ca35bf10b2233dd488527b4cbcc6007063c5c4b5e69d6893ce61119c45350bec4315628b6f11a9e59738458ad37ceb27b9c26d5e247c10b0f310adf6d205fa9adfa9da9fe177e18c59a46ed71c501a4fa19bfec9aaabc041aeb2464b495bf9d9325de7792c6dc3d15dbd3e06453d7e032f29abb06045d2f027fb10bfdc677209f205b2be266826c454feeb93cc84b522a85fc7209a9358783e859dae4eb14fbe0b34717a404987372b5793c29d06745693125cac0bd0c0b3da0c7f055d71ea8464d0eb219634f37e67a762fd5f9715d894f4da559b539e4a57c8922cd0761e71a4501b8a380d765d318c45583092024038451b4ce6219c1d7eebef2b826478339b2f4986b30ceb69288501cf84b5340212472b53ba3ca2ec8859f5aeacdccf5e3ab3880d9ae98f444cea33e6cc696702c885019f0e56248609d81c4402db562ebd0c62970e7a849592889c39bb8fbff851d402abe6c039d15fb832298f2412e18a7e90e20c34941af724dca0b7bbe7e9c14d29b53b03f07d089794b4b839af2554e0e4b374875b32fcf6231d44d350169fb1f706d6e85e8029bc25eb2a37520e2e2dc2e3d7568b2b3efa87e6a57cb2b452531c30ab22f8d7b0551eebbac9115059990bc55de8bf9bb2e64773b59a357b4b370d7dbfe51ac5adfb1090033e049351019d3121c47012e628fc5c9163f25d0ec865aeb3181453a40de499670d03e81b004e5d25c2df81fbaaac6cf3514c513625d3ec4e9e93c36ba41aa117a85544918db07256b9bf4ce6d41d0aa50f612187ccc828aea1b0562a81bf432064cbf21f820b3629a46a9a3ed79c99f9acc898ec1b12bc7d2015e014b5849e220582b3da472bf39247c97b4343bca3dca64400d93fdcdcc5739fc89bfb1a31c6a6f41483dbe5e06b4d1fdc5aeb36c5311f93e72b6ecbd1f037699ae6845859e3e8dd073e19e76228ea6f34c10402bdd7fbde633b36d00472e3fc364b665ad4407a90d363560763638ef4279aeb7ca5a7d07f0ed814bf574ca20060e0f663d0f29b61e9805dfe81783e43eec0860732b34819e3eec504c0267e3d4c75cf5b4b0f3eb533035553fefbe0939f6764be2ec419c932847e9d26ed917499f644dd5be5d15ceb505a7410e89ce84ba0a252d3e68eca96d108f6b9547e3e0e30502a03d58af609d4a34662f495fc3a0a3e728949750f8e96c89ce8b8342a5cca5623239a70103d70731e61cbce09b2dad602771238fbaa08649081adc52338b766c54efe54ed05711e51e71d0535ca77692a652fda90c8073ddbbc106a6677c3d5961916d510b8a69749ba93931681070d587c0fca229a2fa3e8324442ddd0750be2a517b6df5dc19113e0534f87592d8b911dd506866ce95f8459d1744908fe8d6cac410282c04ada0542b64c323288a5c59a9d878c56447cce7e0e51cd8b572e890c881476ede2224499736c12523152874103bb302db7205928132e045008fdedddfccd2a4a0972fea9a1cb6c5a9b23ff3798bfa63381d1b4b6ae1d8c7e26aac1dd3c9c55cfe2a035cca841be81523b77410739495ef227fe20deebaeaae9b96f02dd5e94a9c2c970948c3d1f33cf054dc24b220e97bfb95a5cda2c1b673c322928b9025894b43823cd60771c4419c59ddc6a8e7f532cd63dfc59a00a36b0acfb1be57edccf85492f9866e2f5c70bc9875b46e5c63f7e00e9dc7be344561b159fab51cfb694e35c69ac7f58ef721e996a37bd60f8a15ebfde67cf3289dbfb61da234358a6b03cbc0404a8ad3d6519383d67cda9418d54f50bed82a2416481d9a176f30c7529c12839305e8d67f179b9d7ca0ef1b5e8709ddc30df620c4c251a1a5261c6f36079f056c05097ce02aac75cfdfa0888f4b14e34d7b43df068d978d00d437383e22f48ebc31f0224e3062765e98c6d6fecc75f3fa99453921f9846efa8a2176a1418d6acd6cd74a6965b883664ad2f6da2cec4191219b83669aa77347abda4546c200552d6f9644d9a840bf71302a19b7a2a3e3ff34f68e006e9a98e890c8ee5e7ad17b5413f03444177850a4e0f499a2a061cf34a800b353938bd1f5113761d0c2e2c520269659db220826b07642450c1a3e1382cf616ac27f8a4ac63386e93f9354d2d3975eb12e3ee2dbc4e74ddb371c31c4483c399b6f2cc1263d084317dc0420b914038fa1e9833dde30b21260d5f25eb46aa982cfaacff790c53ccb9e8d35e4cffca3e1e1d4a2991b43d01b7e78137bb59a7df910072e3948f9cab8c01214d7329ebe2200fcac099e0e56d8d0703faa38184b3aff578d6a8ba8dfacb53a54b286ac1e0c7f040430b7664b13483d3d41eb54bf2488ffc996f11fed5d0dcf0072a5ef6ec8162313755ec7e4b5998d4dbf3033ff8b51163ec5ccfbb6f189975900c2725d8a794675fe411e72502de6c05c12d2569b53d2dcc433b8fc3cd019f7db80f7c1514a9ecd27927d043891683569d6f11c9591a91d6ad73b85092e7428b4ebeb264ad3909ec185ac515fa0b05e8c1c3b5bfbef9bc0585d2aec7c2b687a5a95da5c47d354909f0d07d1e2a48d96589c3df2f6b40c095472af0118010d8d9d50d7954d85aea25fc4327ee65d75fde57218baedd5bc0ef13f39e5f67e1f3dc1a226ead32e2b387bfe6ea61071773e7a764edd640665de8b2ea6f89a2e5aca8ab28083cdb81fc04121e6fb1c006ff1ea2396cfa913ee8e2114b122b5d3392da0c334b70715d3c175749f6c71494f55542252e31ef36462367e72536268b93b50b0b1e60bb6cc50d4395b1332a10f4bd846f4e85e3e463c7d3c2ec58f7785ffa1f87b40ddf37a86ea48ae3605cde84d9b35a4dbed4f61078e05a2316887e587041f4d821713099f14d3ae41980e3c415a4308989751dfa63c0f6abf9d2a8804d8445d5e226422c09abf3e3d29bcce7d2815aab082400904bfccbd13b6e6afbe8d8e2785b984b025f4ea4784cf8769a05ab820ef54c11ae0d3c40ffbf163859c1c240e134fffb6b29cbfed6dce27b24510f00b3cc0f9f06fe6661c677f6eb29a8cc815b1d969e986974d015ffa73709890d87611dc22492b6ac8ecde8e0300137bdcc500d39f4df87822965eb50a3432906a435591a49cd0e6e1e291074ac9e3f3aa4369edbeb4c815f1c6e6d9d065ce5da26a0765f477c922ab7ccd47c4e571bb4bf6e9a5e24bb2e80cafdec4686aa51b14ffef6e2260ba72e4d614000799bbee44396f115440197f80e27c68e59e02fef4b9b74df48094a4c3eb9fbcb263644d3b475a4945228b35f4b20148cef0b52ba34fe451f3ca4b48a8850d9c6ddc2f27f64147060a59900de88e290a9e2216b5b9c9ff8577d8981d984e1995ca0ca2dc23987a62bebd2215f59efc4b18b36a5529d4868e1637d231cbbad9b9b1ee34675c5f626cd55de675e168135a6b922fe58493acc480624e940550ff962fe0cf4ab5c15a89c74ce7e52524c0ac016574e5bd84df6aa4dfd821d0acfe43237cd8fc253b13184e5a566a5a3b2400d41e9029fe331f383dc6d02647bf85f50ac3509b96306fe79da4da821883ce212c6d304442eac053050f86922f68d98c200319585a2c055710cc1af11dd3a7a3ae5b3f5c3b215d1449c3c131061223de3cad3655d682733733a2daf4c62adc3cff0fad2798034c80ee5f17f034120e810a0ac33ac1e444b8a14852dc10cb9b76e101793a1ae12bce1f6aeb2c3ff7b7ffe86c303e08e7d164e7842368c86467d7c81a56369929a2cd86bd831be5b35925b78280ac26059249de95ae392d37f969ab05cc520586fab562c9bd4c33cd869fee324a7fb6c8d5a68d4a08a7ae841c4f44374ab7ec03cc5b758f36230e8c01a1ce4c5434e07deb104e7e0edfe42728ffeef9642b62714b655401bb33148dbb5f873febe80835f6031d7b25f56ea29f09a8a28ecc86615d45e1ac66e5744e3e100aefe7705507b55f093ee140ca03c4cf67025e5831f76565c7e79b1ebe658a4a8d67dd836ba5f2d6cfea69b801a21e433a2d4e3ce306934d8e783309ec1620dc427840ab56da9572aca4f7b26471716b6953bd05e8250b9dc9a47c1c4a8f249d969a63045086a7c63f4f4182c72577360fce5713e0ddbeda16e87f56c8355c9e878bacc1b7b136b3212e2650ed6def5d0c8e51dcb014a062bba8a79fd6e8a09bee8b3f7cb22b30937d984bd36728e5384ac68206e7c91a229eccc797f1959ec57fa0b2edfcbbbe86bd1388074617470024f747ae5078e45c0790f126cf452b9ea1edfa26d5f4325015fbc4ab009b0d9d7cb9d2e22e1992d973d8300abcd99fac93e42c4e31b6b0465467c7b675c5e39fa538c1d8256c7298a369bc70b8fe3133bf6376aaa231bf79b47b9f14fb590afc8fa87411d8b3d75e67db5ebd851d1c8f52dd1e5243e15dbcf26b216f2440cd6ec1fe64bc2b96b26806c956062da9c7e74e074dd07146b4153268f537f3b3727d86ec74474fed45ad68e661ba4d6c0aca8745ffa2d8b7290a4bce1083cc918f0330817969205c70fb28bfa466451a2390f1321b3d11e9a60b6c1c79ccc28e696898a70401c18dcc7fa17fe1f331f0a0898653fc756d5de02df3bc3988a63cb8cc6052db01e037fe71f98aa1e03ed521eab50d7afb3880683095a4c925e4a0a3c3cd166a21747699082a37e1088dd2463181b2ba90b77bf33eb5b959e8489e75b2aba6c93fdbd7bb57de34c15dd3cd604660c48241ae62b4e23d9af1d34809d6d36a0a76c44dc63bd599c352f6da1bcaadb5101c5412494b954b8b98ac40d90ff7f2500aed0b7c3428fdff55a52e4b5584625c3c9e53abc336f59c06fd05b6a245cdb335c7c5c81722e070b798fd9b30c2d28e483e31fa0e31f83c67b40d9e9279f50f9c9263717ab33fc14e9cc996f890a948805f53b2fa6604cc48745048507fd3768d3c3aa8bcd1d7a1318574cdbb238fdbac1d67b95f86bc5d26cb83cd5e3e1e3173215b9817131648c8e6ed3ea3dbe2023646ed33e6efa8ed537a7d33d01faf128c2aaa99f05a5bebdf8ddcf60b8b0fe3be104794138144a39929a09d284918fb22c9ca94862f6cdb9f0f799b82b0bc19be537912e80ff93bf04ee8fcb0cfca69674d709635e882bb0a72c555d242cb87e26ddc9805884887c6699e3dbc8f130586b53b245d9fb2855144772f95acc4eeb70042405997634a2eb91eb28a8172ae37656a8c194888aaa2c64ddd37c180db45162053b3d0fb4a2d592eb9a20408b7f78c44dfda5aa0f51a972016f54498a8951768388ed98e6c0feadf02b60ff0d56cdc52377209e923a3d5f007d74c621e704ac839506494e199541c9a6c1825bb0180bf5c34531d169e79401b62b9d28ecd917642008f579f5d6f930b094c759023c95c207a836c363a1591845733094b5a971d737113afdb8c9cff0355b963b0bcd7415ddcac7b9994d0deab55ca9bfc885005a460b4d7758d61650076c89d76b34de10478764b25d49aaabb9749e53b2735e38511c8c97918dede03a8b1ae25a37bd523842f35976eeffa6bf31481a07a1b575ca90d3d4b9be231e69cc2e2f1560597d0e0f6939a006885248318e10a3500e6d0f0126eed30e7a6ee37d1b4d90369773bb113ab4211e80725812ab31e326a8178fb584f0abf507d521d1fb9bd293b021fc185d177e6a336ed2e537341983b8d37265c1cf309a3334b8d47c0c496b0b4a2828a5dd71453eeff2a7d34aee31a4b6dc47676033c9c6ac0a7e95e572b44afbe51e83fae328e39d4d336ee2744b3b210004df74370de331d69c2601ee0466830083f16afc1094eb0fa45ab8c955803bfd21f247439e76c6104cb580d091d11e4486db91c8116fcd9644e1120b566d7daf5353337398710cce1af227a0af051cf8f0a3c4ac62f7415c01933efd76740a7e28c40df903d586caecde6d36edb8532885e44d4edfb3744d829e4a5bddcfd9458a99efaac2e44fdbb9d109b670d650d8d1a41cb13a16ffda7922ae28cc4be5404078654844a372053e9b46d13a575d99f5dca31d8f81089ea7665013235060fe8ccffb615d1d60b58b0889ae5a29306f7b78b64093e8c2825c2b4db189887b28b94c99ec6c2a4fac9aac9c88d591331b15fbb92a5b39103b84547d72ca49ca3a146b2aa50b5de77114074f3fda100d2f0eb68819f940cc70b15b878ba83a268edd3a19747000716b834c5aa2916655fb7cd008591fd92b3a4c028f0a5412b329f0bda739d08314f27fcdebf8061de5bcb7d7ddb10c39488b279796c2eafefae948ae5224461c361ed1bfcdea011d33da7df42036540a78258dfa3061b7c8f7a4a0d54808243953aede4a98fb2c95259a5b461c61adfdcb682bc64c64ea31f1d35ac3bd9311ee908904f97f31466e942921c08f2381af0b6dd8a29fbf388c3664c49120a31d57eece2ea6e06f344ccd7e66cf4ad6a26c45e4fa844e8759c1414379d21803b90ef7d6cc4b1ddc98e4e3cef6a5cb86f127b7accc0628eb88bf13e753b82cf90089e1ada0bd1d7f66f58ee76b7e11d7e7ec0ac54574202104702535fc83c0b7ee948e5e59b530ebfcfb69d1443f8ba8e60da3eea20121138f9fe57cc5011d8cf959823c85832d7603422b8b413cbd73798f04d3114e703592a4417153aa5d06240216f57655bf7172579bca3437ec215147dc4a331ffcb5597f26d03d6392721a776366f7d608f81294869c514fb7d70898b07bd8c5f47800e1d2f66682a74b902fd706a70712a4c1ba461bb7c85bfb8551a622c6ab751eea24e1ff4ea8124f5bdfa2aab32cffb7a0a0955bd0e92def2cdd4c367286c7733fadc4a06b584f28836e0102c94f1334657fb50a687bf8064bdd10510dba22c00a3301f6e0be123a7833baabfd129dc109dd8133d0853e65f6b0c4e2a2cf9f1d0051712f1ed5a4053350a9146f850245565f3b62b84ceee680c4ebd279b65d0c8e67aeb566f7b3503d0426620c1f3638556b9fac92dd294902e94e06e8b611d65977dc913dcc39be55e495eea6e3fd2a91d90c9d596b47981ff641909bf23e73f09a6c09ba34729d5040e6052d2f70acb6add8c88568118d2adf7a2a01c52c5e5537d26b9fedab51302a62bf0d3eb45a2c39fe138546ea9e0f170068d8b884b1904fbc642c57045b2e63916693c788b8a27017b1d51e5e948cd2cf6453d4c17b7f9946d24173c4fea967eb8beffba6a1981c2aafeae1fb81b6f1feeea3c14940b45eda947a234022e1305ab258171761ffdcfaec4a41f6cb3368af089daf19c777577ea91d63cd3ac92fed29a3552c247f3b12dcec2b7388011975adf70fac379a6415c42f1305bb52af264fdbbe621ff5199ee7e2a66b4d20f067d54748a9bd96955314e200d1ce52d8774bf427e87b289d03062f68018f176300cab8074c2bfb5df4523da291e4390d044c7921341e43069faa32d300513df9f23f7f5583ba5f55f29f6a32e4c7c6e5e04a2be6462850a3b54aae0f3758b0569a55118b05cd712b0331298742dcda54d2a112fd3da43d430717bd50e5b1b5cdf37b95bfe0e9f3e080457b9ea20cd5ee88529884369541a0d9bec7ee5616d64ac1b6b5589d1f88b3b87a40a808a2739371f49adc2917373c2e2cc71d0e1a01dbbba0f4c8599e3d2791480c6c25e1dc0b9a169716edf1d98a7c609a81141a3fd288033443fe6a4bed45046cc7cc8005c57f1de263288b8321f117a8a43638bd5ac3c67f1d0dc8f6f701f899abf3f6489696bf47a4c857bbc78f9ecb5e115e9ae938d101010567c5c6ad84a722cd760adfa431ff559f45b3e5b9dfb875f2688e2dcaeaecd10eaec5a2f58751532889339997206e10b33ca9c0ed93f9d9d001b749a5d5eea01dd2d3f656c5ead5e5a83c325162352853de97d5501fc2fe1109aba899dfa71dba3bddff2b182e49d073ae188426e66dde3cc89cf2519587e7737b544ab0eb73f361e3c347b7091cb6f211fba85cd75fdb233bbc93ba62b485ec2c5e2457a6045f84c4e7c4e186bd835fa9baeeed247a5559428348548825b8b6986f3f510f1dbf5fa4ceeac8e461c386a7dceeb87f8be0e30c82e6726d768a555f796a6b3d70c1eb0f2bcba02f79d3d450f47b3872303ab4087b2c6ded981d1f010cb74a69fd5a49f069c8966aa80f6747ab7e0bbd91121395dfbadbb0c2bf7f554a6715faa40e23e8b3ad3d9d06269d1dd9c02b274690ecf533807e5c5836ad634fb662a911cccc202555918794b4b65551448fcc294fac7a794926c7843d49c8b419e5e6e87d9108c4d8aafa0e61e467083412cce2112df9d2e8a5a41441a5b21b4f94ba4ff54a94463484f08792480b6b23772916c955b762707f3969febc273d7da006c0754b1ab25b1f7175ffa51312c746803bab4f3601557f23c1f5b786360941647131c4ea6a196ebe4ec6cd5393a300b61c26f5e6c36ac49227b660d2ac512090b8e59929c13c6b7b544da93d4690f3a775b64c8bafbb49f2fd40726ba759cb4f40104511415724d762178b35f9b52194fef2d9b4c08224b428004908ea1257d0b10864e1ebf756eac82ab408a2910af09f9976eb01f271847c290daa3641e61e807d0e33805778d7aafe10421dfdff54a893a0d5333c6a2043d3f2f2796cf61b7cffc2d1fbfab1215b8e405682237171580e55c75e219940f7bfa32c005de9fd44fd72070d678688acf1a4dcc578d8748b2742b8a56962884531e025e7e0b97c1c5b4a8a9cb34b5c25766c3aa39d0038d81ede2c1d20b245f7d914019d1aedc67c6d913b0f2055596d4c9f1d328eafbee2b4b541ecd794736b31df29eb5ef00c9dd6e171f2688cb7768491742089e61658ec9f1c29a0bad6a6214a777a9e21896af35854887a41290a2bf35f853aa2b53f9c5575a0e51f0a7d047ff86f83c4d5cc22a14efbb1697f75de06a1fd8eb16c98f3ad44592f096e2698078935bc7d71c8860aac5074f331a5e48b950effed8bc127f627ab1d0acd1c537a8ae4a2c25b8646b1a8949b2f2cc8d5a44254d3410e45c001a877fc36782b74002a863ed1b2341489eda99bf8aeb79eac2f7c97939d4c5ad9245bc5d54c00cc2a3a486eb61947e8a34692eb89c11881cdb562cc0118fe563fcc82e95aa5ec96e8216ffd592cb7c62afbace345af173ea044dcc45d908dcff6eca52dac4d35d77d796e912b18c246a15a9f869012987edc6f28f0675efbae443ec90fce3f0e10e517005ee47f4c0ccfc81eaccbe160f46073f3c08414eb5901b01a4c5a90109ea1b8c3f21e2de287d593f16f02a80138c1e98e6cddb02dfb51de979ec9aca2d79e3d30bb873a492383b612fb048c79e3c93fdbb46544fc3c6f9d6d08c278c4b9c4b70d6c4038eae9b0815787bbf348ede402592f95637b8deb6759d0b348cc63cd71d2840086114acc9d081903afd48516dc82443ac2742b26e6ace5742b97f0be72ba351fd80af97bce9d94824c66f42cf48d91f243ef10a354c1144d716c725bfbc442315ee1549903c6db3a35f34f325038489f1b55218ab5951e286a14c5d54fa85677442647c5f028bef67f6612c1d4444138695c48d8b1025bfc25026274f10f318cf297d1248164b33e464a334bdba16c16b33c53dd210f9f68dda8fd215cd8685589ca3cea17795ac024ed7272aa181d86929568dc909f47e6a1693f64afb9a0a252a5b62c5ce88a14e19f153639f09a18f346d67ae8cfb3010e27483d43058486075afac7c40f41419fbdc737e8575d37daf3bbd8eb48b742cefff37d10564064e9a4f825406100d4114507e7f9f3a1ec11fe1aceccff9f29d4c87c5650342aab19cd1a1a852037e516d73132d16e3313e251b742f7cbee741e4772b8370352abb66bacb04066d7ec521c605dae2cef77842c841cd4c2f8f4553bc2149fc63dd6bfdacadad3eead2fdda7868f36d914fe86d7152dd97f3e44fbc2b73a39b889146bc2e10313104e5d6f9574b12ad6eedd88068777a1c154ce3ab112fcded75216fc5652810464244d7ac58a193a33077e6d9add3eba6eaed5c730de76b7e9561b64fa72905474efce56d7215acb750f2285c6a130f656b8139029c9bbbb610447b3144f587c70f3e38a5884659934252427b07b7e9e43b1d3489ca53aeb3b62579e5a9a97b18551be38c4f447034ee1b35fbcec9d4f6e3fc313d7b33c5f5ba98be0ad07b4b67592bdf28b8c3cba8ceccb253b7f673fc52144b93c4334f88444b931261c6f25df19ba3c8ce68182ab0832cfa1823266c5eb6624e1637fa896315e9ea2d23f3239bfe2b8ed2b7a94161311980b5c7a666d04c075efa227c21a3a0d4e7f79739a138e7ae7871649ae53f36c76e2ac254f02e4bc57d2c9bc635fcc90a09a182286600e25dc6385a51430c356e93eadc89bc03510a7587b1ec06cbed03756b94627439f4251e595be28b88b23a5ed044b4d6a8cf6acbf3e12bb89acdaf4c2fcd2b4b74dc7e49967f65d349fd71ef1b0ae8b1bd46691377678d67c25d045a835c359a7cbd1e078d211731d88510636d327e43a8b92f754da4c9d40c808c9cb28b0c9ef79c11d0966ddd8fd385a1365aac313f173ca441a409a8b82fe711ce87e4e96475ce9af10a01030b9b39ab9870f2745b45719080e1e5dda79ebff5d5702e4ffcaf3b2ca12205721dee7b3543edd6e3503d778ec31be7f090513f182d2ba3e50983fe21462fc08263452107e8ee0c235a8a3db5378ce895492cd6c64d17c45168af245a3a38998f3996cb4e775c8a7be5fb2191c475a62e7b8b432699aa06f06d214c8829261a31b9bfc0b1bfffbfaf0f109f760dc1c850688e456967bae5cc6bb71359c876f8f95eb536d59b67e30a3626ef091a7465b81415b65dfa993e35d2a74f2024af2e2aabf5690375cc23808096d4dc25c846e43a135b38d84d638b5a49c3604579a3a1d62113a83499a438bab97beff7696a53114e9861ed3a175d2a4b43512de5e4a7cd4001108188baf4e50526366224a7cdb7486845671127dfe4bc33e8a8d58e01ca55f876625b94a6db4377d8c11e3dc4583abc46a7d904698139e5739179483b4c099a8e7f7345a794594f419097d7ea6d4668abe41221817f31c7e072c94718458eb9221530880ea08220a902be61c7fa9e85d62d321093d74362fae7779ecbde03e5bdc33de65958a4f06bf6dfaba0fdc65d80e63952cf968efa340514b6352a0fbbd30f7fc82dc8c616e16ff3d0fc9b3e126a9bf6b3f21799ac4b426eec9dd6598a67a56cc6c59c64ee1b6b0be2f7ba380652e6e8399526a99f4e1e091e1d97fb61cf104d9b523a3e1f0d55bcd98122c35814ce0337f0ff9b7447647e5c22ac5f77fb488540586a7070a2057447a7c67f784f399f8630f072ada12aed1ca9d1c548c2b7f18542262bcdac9efe6ea75fe3eee6ca5060c5fab166e746e1b970e8c9bfbe43bc93f8916c0cc5f1c6e0484a5e8868673fe6196cf20823b37dbad41dbf5ac50d14aeedcc76cd065b1102a312c44f7738310ec9787051a22c2147eb92f026de6f148207c2bfb13d9636b68c60ac87dc5834d15c40ac3f69f9917538ba4e9ec9fc86761c2481d37199a6d545e25985051e1f280c747aaf66428c3f806db4f59bc46bb10a6e1a004cfef29b8a28751c7e71a47825af98680024b34451b7117a219d9fa087098c63dedc4aecfdaf83323f3b75b1161db70d7686edac5cef437de90b3864d6888a7a4931d6546b5c18d9050a1af1f9307cfde966b7c7ea62720f757e9983c41f7e31eab11443fd8e562557ba127a3893c34b11320554908e696c11fad30b72939c313cef7c28cd5ceffc46b0df0d54c4c46f3572b2565b52b1e1309a247b4d928a8278796304847926a8eac11200e8c24c7301b3ae6d18266ca4f478340fa18c7ee9f13553207023b36dd716ac08792b0604288e758d05a2cced28a1f7d6fe9276cfd25deacbf08ee7f4c60003d2aef5e5800248a4407279ca93b60d2336409be5f9e57dbde390ef74a2d995da98b5bd1f5c7a415b848a91a77d6b19571b216c948ec336a59f3463b0cdd78a7c8f602e5136a5d55ebfcce66465ed7dce3456d2d66ab48cbed1563d4a31c24cc37b930f89104f21185822386060748b2802de10e5a4032e277fc3891045f560bc70fd480a67875980b68e378d823ae320689d5d7bf037e6e25fca9a47b0c7d9880137478775d579428333dfbb514e2d345fe41725c21e71c5e9fe550f88a4ea090e564801a37562c53ba7dfed1e3f8ca9fdbf1e43e86bc999b2bf85c5e5cf9e3587b1ecce5910ce47961c76d8a69ad5f1162a1192f9eadc2b8aad17bac0d655c788f3ea4a8c2ce74fec4abef045dfad01ad647a5a1c1dc1b970961787c1aa3b9886962c43b5299fa6ebe8dc0606ce556d822b8b37c3fbaefef6640a05fa1c0c73e26156c70da35213ebd886eab0d5b327ce8a7a9410ffddc4d436b13a30cce801e973e551434d5197f362c080806461415ba061ebbd98dfe0d9cc582e488aa6f2afd681f3ae923945d717862309bfc302b6bf2a34f7d8c623706d57ffd582e54731d51388f83dd173068568a524a4b771b47ec9d33b526b3845d13312fa31fefea2e51100f4d3bc6061c4d418dd041c150dc4093655ef28d5977429b85671ca5ccaac549c1a2d9feb93f340b9fcea5cf00ee8418fdb80e0269ecbd98a431a14184b1c0b5a26e7ff771e66a804a28f88ead4690d3d2c6385fcb00367843a8cda37aa8cda511f747b6bfb883aa107ea2727eb429716785d6e6db8c24db02d2a1713a5c0c2ec8c7cae460084cb311f97428a5091e91d07c6ef8bf874a2a04d6777321b2b744f2ae0c59dff0e0e90dbc74cd261c0b0cbfdb37e8a5d146476202965b4a8261ca03f1accc51fc59600e7d94e2ae7957e2df02508255e6362f1514b908a1b98e59dabc7c1155d4e55f16db88b50d5bffcb269023c798db148d431a8a005e8694b967dd905890216fd01937dbeac0d1d9cd3d598926158707e3c63bec418413e7b06762152fba0092c02614073b6c176bbadf67875c2722430ef8e5df73a29de26cec0c08cc8009ddf1e3a41585f0c6fb4987adf051380fdc3254b86812503c13987e0fc87c5bb22d4287937be484448ddb9cc8e0f46dc8d95243418285d34ece437aaa70847528bf0b52b1ccaaab38c5597614309ee3d85bf5f70239616589be24efc615c88d7130db8202251b483f74eca84a12e3040a32486e87cfab8c34704fcd90bae53cf972808eb1e28f4ff2bef817e8d254f7e9c678f6590d9ebb98bfc2adde866a5e7687efb91d38e4933571500d0364769cbbf31dee020587777706a8ea07a1f870b886dc156f50ba9d325f47ef463fb5de81e3ec7a569cdf015ff47025d5e23a7aa175713177ff5c0a9fb226fc317f236a570147531fca9b3d0051a12eefa3d54ee72dd6ff02056f6fc354a7a487c5176461cdc72ec27ae65f4a17014e4904d7cea00a80bea618cb8f7b3af3fe21052d9b1c7093234ff760a12960dd7605a60e00baa21b97f884d6a87afb2fd6f03200995767aa5867217a08b66740716c1d92914cef66809d9859782a5014884730bbadee32238159c36b4563e2651b874106278ebdb78f24a5af6cc93473c1c375003640d0761659081185e4c2929af421c6e6f10b8498e34770e05677c0556ec50f122332231022e8a29cba446279ef839aea980abdb3e6fe59df685ae019cb3e2750765a74a00d6ad1708c41da780360eb0a345b51b32aecee84f0e531e17a5134fe9505550a3a329208692b736a6e4f81ff18b0ef84c55e0aa2ee81baf2b6b7e412502fe881feb68b6460413f76be8e74af2e94e489d739a5dddd66a14afa291bf49ba6584e6d07cb9ec4329bf61d3ee2453ab7ad12b6493c6205e4149ea84483655e9d0cfc09b42e1396003c2116438163352ee57d8bdd83890b1d6ae74617ab4e678a4158e06a5595ba0483df9ae168af96a3d1f9301609fe8868af7b44ca3d73372a075b1ac25193a76d5ff4561665b48d4dd9d1879eee1c04cde24f429aabb16d046738acacd51b8f2b87688e68b2a30550285c514d7bff6a1798971c79bd10dff5a16859776222b4096c2cf663d31e3d199fad391675ee2c7bf16e0c1099588c82cf305dd139ab906778fbf66fdd0b5a71ffb59f93da9e75389f463b37d8795024b47c3ac66db414731f71f823b3733ad56e34d518d8094651c98018e6077fec02909a3d3a9e598df7f5bffa6d1c8d49b737f58f06d3ac24d742009801aa50076f7474c3fda6ab0b4d3f2ea9ec47f318d43516d6492e632d69a57bbdb7f0b0b7c72f55fcfb41d9284d729618e6fb5cfba96873def08c52c4242be60cb6fbe3308dd025d0ae1d59c1ac28214e05b0674cc283b8fbe956c476bad6b86eef7031e2e18164766c2b2e551a671177020f89e9bc43467823456bbfb0b550353f36777d1ea1b12931fc2a340cbbba36bdbfabac686788bffb6b935aa80aa7d4fd4c4bbd714e394b39cc73aa9c889fdff0494b4a32cbd1faee7489f70358eee51bc4cddcc4f90cabca2f36230e08044de072c7670ef8d852edf3f3704d9debb77a5e4375c990cd1d1a9390bc23a3db201d4e450936681885b2fc46fc9858e5de52e532749045f8d5f0929c9b1a150971d297ea3d1840157b64b3eefe996ba31c71ef87b89228c8bb041a0bfaf307b546178400b3d7ccfaada1a84a1885173a79b3a0e0cd8700d122fc58d102f1bf4bff76573277115c0882021fd7ab40fede00bc4faf692a6e80c32f3d4b8661e011a8ff875e7bfeab2a4fd34a6a33eb0278eb504146190db3889dae5d39827a6b9fa0f356e281813e1af868c8752d7bcd359f9af52fe2b8a0c0033e7c06afa9a012a5bc9dd1db4caf70c23528959c6ecb0e49fbf6565f42beec94c68af302178e84153101613dab762af989f131eea44f81d22bd49d37e4a65f9e087022269373a1614b4816cf5a2217842bc93d729ae603509e5617ab8fc7204f119ef5f499bcdb9e5ae103efc8fa92028fe4636e077b0cd879dde93aabf28a98d84dcdd8c7def7609eb1fa33521f53a7767ceddb174d682c22004572a9dd3bba3e6ff06a1c9921ffd997f6d9492c634447e475126b040a99c044f115e00909c4d739a5acce4f6c6e4144378d0a27193cd1ee1df8dd86d9648ed94b7ce48b5934c2c4817e00c1da5d8a5eaf3c5ed3a7db36981d5663305b3061e791aa61107fb17d981d280c11e139b1b3bb080f8bdd9e29b31161e6458b2650cc812b95f1d38d0cbbc620321d9275aaa2014c4b5426b64ae08db4dfca534ad0923c83b4a60a49d9ba9ae931f79de063f62b3c7e1d21f048c38502a65a4497b5c959391005e1a1131e957666b682f0ddf31a8a8f5c53cbc30df6e729e22e4107d97539178689f5cafdaef4f237cd1fe6680a314cdaca05dda83279dc444a74b6d63de956b758e46074ca02a0b53066bbca30fa078e78721873aa263150f1a5d4b4733f91836994ffaf24c5dd5664bcf4caa7a6296f278be74ea38d61a55e2ec0010a81ce29b92e1e2e94fb070ff77b47bec5b5cc841be4a41f436890c47f3d1227097014d896ab0a5a82d1405aa18a8990e6564f103245644c50f69b0d0c6a69fe8d4ce07bfd08d50ae5765c6a84d89904195c3fcabffdbc189cc6990d8bb0e5b84d3c6a5613699b88904c7f10b27c47061c05d4444b3c966e2e8337cc2555be2eaa3272715502d8f83c2cc7845d2e3d9b3648da4c03c92b15f90ca42a20a01989272ee654757e504886a9eccd2400e226be4c7c6198a6c9d87232287d047778943cc67d2d9bdc7298dc70e4d1c18ba0bf1b23ebd9675e3c8ae7778ee2bc58c547409ab39e2213a5037087f94c95d28bfb2ad13f7659ca4f4ae837124ca3d6e7220a6a38abfc786c9045d924d137813d8fbc015e6b270b315e7abe1883e853cf7c1e80537301c297464891e0dd2f9d9703a0cf1d3742b81dca79efde1d3b190f4f146d61e79553ced1fc6e7bd2f6ed4ee18e8983390782cb6207e8b97081eb9f444c5115a48962c0183d8d24a8d864861fde1cb440e3dd166f22eb5d20e90ec6f85d86e13686305e9601b6ffb56ab953e86244aca9beccc499ef882768023e15db999c35a8741906209f5b719d4b8e0de4b9e437fa45ba9effb183cb51f1218387139f1d5cba870e699a30d7c7d6b0c3429432d14a1f93b9542c2c9429197e32eb27b80af527a4f68c6b405c9189353787165aaa5a5af789418a01a4440dcd76c393ee92967596c08c08a12876f1eea59d1e63352bea24cf86f0af1bb95c2e071366e7b39e2af30393f88d32829edaee75fe55b0a2912cdae0dd1b226196ec0c9321f190e77ad9702fe2731796092455cf8293405ca2b7f9714c19b919d817cb1569279bea091c8cabf081c682015aa9fc2e5e2e0d7fc94545109965de9a950392e7282a31d7b9d2bd800dbca2fc2e10c776fc90bbeabde1799919e88dcd0a6d2cfc016f6db0681921a1d283afbd662f16cd792528232cef2c0a4d68ec886b20e3d23d1ddb0abf345aeec2b1cf132ea7275cebfd6c7400fc8737439c6c86290e2177c22a778bdaaf46064de868d594cd29bc1ea3e689757818146c62ec001d8b5ac437a96d4e8e207cb0038754004e3caad1ed862a72280ee229fcafdbc77838a309bf9899b088a0f046ba6532817cc55dab216394ae4eab923cf85769d02dd510bedc1f36d73fbf7d4ec2057fa13ca99359ed97e6868ae43ed9f309cd5f970c77856553482fa31696059aa61d61d74f799c19159848e0f0abf2941708b8f370233afcc4c5fa3c83d0e10ee075fb75c9194b93dba81b234f3df30470d34e7f631a3ee9fc94f9d00210779ce6118bdc32a07760acb6705a808398b252087205c44b77aee372ae8f5a2a7cdcf7456f08bffab99a07714abe51631fb699fa3866f0c6dae5baf589c650cf09c2d388842cf219820e5c133acd258cc8f3eab4e14d7bdad014eece4e05d7d4da83bb93e2948484a87c78719ca6bd9b9e6bf444fced5e41e3ff9a3a633679d56778ac6d2f1d652f472feba256da8959b89375412368b2eb14c22fa1d5302b8300139c74640890e6e7d1e91f8401c6e26c506b94962e4011bc7f1865603eb6c3648af95df92a03b5bcf5171685a1e1cf0eca46a8c00a2f35628f98db9f84253cef0fc219185a8f2ee0241c30dc9913bb608f3c1b08912c52f38750eaf7b7330bdb78e54e5b8ee586d883d3b139a05b07f57d4f22c53e59884d14912dcce4968b9dfd085b939e55a2baa1fd47c332c59bae7f82f2d53e1a4b4e14aae61c46577d7e0fe4404d975cb81a105a83f65d8bcf190671c0cb038760ad5e3d84be1e3c1503dbd86f907953573b668b9edee75355fe4039fe853e58fa95567cc4afd598b7bb62289621a172d1d8cabad3515b6cec915ce8e37c4e207ad322207272883df1c9e5352ec76f706298e3ceb469bfae6f33847df37ec9a4d74d00377d6e66f7cabf93d24800e304964b83cef7e6d813a44a006e2a084b77f7cee8f0aee435759e2e7167826d8c35a80525fab4e172de7fa8fffa9db071a68c2338562ee051e86f9d6d47eb428b703d5babeaff73072544bfc92cc6487961462a3b5da836d1a159e98a0e171b15cf291c8179d65e592adc82152eca84e85e80e2152943544ccc7e2b3107724e3380a5e29c83fe37e01748253b900f8111331517c2492b8342e10ba041ee978c08838aeee17989b0650e06c2dba2b21282129c8d8b6174017c46a40b8a7f004b8b3f70256e910b1e71be13769211f7785354265d9813b2bdb144070d52859e346f7d03262f7637d293a43231d5c1ed97ad63226f8c97dcee5e1623ea0d1e194a52dd3ea8aa7e497bb021577711574bec8b2da2f6ac9bf9af2555abccababdbfd2ffdd47c04ea7f87a854305c15a539998192636baaae90c84ab6da3f47cbd96d76fad80b4b8ce15cae5cc5eaa66670ff3bd702c0e0dd390b00d05219a45cb7987fb4e173bc6d1686243808df8b12ddbe0ce80da125d67623dd44448484ec480ab70a8d0a8df68008c3d1480c87835710e9c1b99101f7db7b31426855f3c527a594ef4939aa75ce7949693debcd292f4a519725db8e045513539bdb137cc04b9a29cfda8e94ef49cb6a3b7d22c9f89e73ee456a3a091f843b5793b4a0fd7ac45e501b6ea730a8f9059559a1821fdc6ae0f81863841535618c31c60affd6c06ea90b6a7e7db2fa8e31c6ee0f95312988a1a7b7a02c8aac36bdb31175ceb99cd95a08ed3b11767feeb35b06b60a8cdad321e0dd11809d32265a4e736d0bd49d2ac13b5c7325702598c033c53c133d8317b0daad3b1d8c8b576c8fbea58e86657cc52dc2c8e42d1353b43751d1d05b16bb6a929080757a99a0b72e014643ef142d075b570454b0001aeb921c8cfb1d8cbb75f5a070bb9908152c80869ebe729447a5570da5d6ebd313228783ae1d284f0074d5c8bfabffec8e36b94b4b449bdea542a899f53476068cc4319c71cf6aed5cb3374f449f7086dfd12622bcb019e212d126f769f30316189ec1cb627c0fbef6248cb2eaa2c27bf9e8317de0f9b68811c21621eccbb77eadb51f4ef68887551845747bd5459d97883e35ecf08e3ebd4ae3ce2a664c7e2863332686b92464b106250f8a12740fc2a6a68ccdb5ebd7ddeebe3b5b06949d7424603530c1ed1a8d5093daac77577dd1cdb6075babaa12d55e9aed25d99c7bcebdfb66b357aaf5161042082384cfbd67b50a6e67edeac1224723318c7af680f6a9096a4ccc0d2a7063470576aebd38212a53c6e728aaa2a895474d19df7bee3de7a2f401757fa779a61d1a88e48adf1170b6de7bef8b27f8bd9717862f785ac22726475bd0dc4b6b97b2b516253563abaaead54078d990bdb449b6a0464a5bf9508ebab324854ef86077c9409859e1c4122c9d6b72245fe4a1841525e78c8f8ff2c9f808a37c941232495149a184315ef2d0962e07217c314a171f3b4639b17cb1ae4b5a2f9042277c707ee9b66207277a58c0022ba0d802bf3b76d9502ba0b0a1f00fee9061052b988212b6a083e1dd29bc74bc1c9c810a6bc08c99de113150f60202ed1851058cea519e62d5b82752a058967a37a6cea2768836ed786f542b7cf96114c29a52085643b690de0eeaa08437479b5a0a95b38b024da37277389826a208cb1a082aa4668662876898a6ae134258d40c43c00c5b364248411535e98e3e9130b5ee5d578dab945a4729106887c3ec0a2fb8c0ef96659513cba2d72965517a4a596e87e8efa2ce09bba440798e76145e353b8640b18d4664a540f968f494d115721a1415384bc45573dd1d43385129bb6a407dd95c97880a224c450fe53474bddab5d6e6840bc3abe60a2f444f24123108ca4910b16308cbb2dc8e5941a06aed68d38e1a195b42635d73525b7d5159cf053aa8a2e615ad1d39227d8233eb19eda83d4309958d565494723a19d173c5f5b50649f9e4b20c0799e2a15c8472da282ab28cc6d1d096922245bdc80a398de828368813a7115dc869ea2983d3a1889e224241b977a2cb44852497d22e05da6c8a147dfd5a0b82a36b9645b2aa8b5a57cd8f781b8691b86eddfa93d6415b39b91113035b1019af04ccccb409cda063d1cab26cc343ece851b1a97ce0a5431eca90102d888c16a31a45b53661a4d2d21454026096c5932d449689298a10bd8a2e110ea6ef44afaf6c4de90229af2f02e52294cb5b44caeb65620af994fb0107d37d2151443dca65a25ee6608c703014963713519fd94f45c368447f31b32716d39c9327d035f4b6203448ed0bde2a0df5baaef0c249ac2a4c299d5585db25a43dd18280ac2052be17924fbe50c39765599f97552d99021f9c5b901624880c38d0aba2e6d5d0b57387b67ae25e50c020a4efc56bc648219dd65503a1bc6ae021b528f50761493a4acad255cd48515252124af9eea3112d14b8cbbab3950fbb6a687c96597f360a6a788229bc20d0ae085c3613d3b89574f1b48a31ce19e5e3454978d0e17c8fe13867cd8f462d69613fc9035e7e4e675dbf2a6ad2c3538bd1cf499754d46ca0c682064aab3a5429e194925651ca294faf1f148410d253365ec2bb57d6fdbde63d5a1b861f059b75c54e10cc708b4d3e96646baeb5b777bdc7f04b9f483f90b07efd8a97cf35682b278f895a740fc2f9492b0a427819d9e5ac55c9a136ccaee82182dd5f6c21bdbccb86e101c75369590dc7ca87b2ae06695bf08a3a2e6b546d1e75d9c478d7557d51ab306a9bb8f1d09a73ef7a319da05ef15669a8edd45d3557f438819fc412dbc8c34f2adda58352dc2ef7674df0be5073545d3631de1bee11033f69e1264f3d47cb577d5165fc8b1282e669252588c5d7d1b9ebba3efb74bdbdba6a7eb430a4754942708bf112be495b82f241489fab675a5151caf76e6e58bef40962783a5bc607190b1b8ab8c7189d631663ce96a684cf394639caa228d7ccb966ce59ce8dfa44c2cdc5b7abe65073736154116e782039e7dedd1442e7a829db557faf1c1d41d8a636c2cdbdcb26468e76578f18d5ab579fad7ad593cade165e1e92188e79492a10f206cf207b7c1ec5c858649045f6dc7ba33ec1ee5b73a04dbb2be7f29b323e47511545c599df196ce86ca69e733ca34ab35f92a5d88f3df71eb30d3ff7d87b8c1900d4cfb10a8dd0f666a9096aaeb84d3492a06109eeeec01b94d02865636a8d783086e372d136dc7c16ace2252dc670503857b73efb74a356ef2c9c20b15e5596550f8f54e4dd59e8dd691d8de4291d5995b5547ae45401833070cea942470727e190e8e077f66e7e3a3a585e247a74303d904a897ba28333e3d1c1f4ae341bcd861be480654babc26a90423fb53daf58950dbda1b26077e6b0ca68c5361ea9bc571dfc2e1e39550cd1c149e44001890eb5e829bd3c7d3ce47d77922c4a2b2aaddb9255bd04ab97a8eaa556514a7f38fc5e8f6ad4a7918ddbd1c114890ea6f7877ba283dfad9a0dd76cb887dc505bc5a432516fa05215b6def083410f8222080492a00902812810055520ab0850ce00a66f59c04107d32cdec08357ac2f6af5f7f7aaaa5f555596e167550da3fb066af5189fbc6aaa3b6d56b172c394728f073cf5d9a7ea66aafaace86faa3b79902cc65e3d8f5865f39493da1f0ed39b99c0b4b219b6e7f80ace97a8529b2fc559d986e9a33f3eb2b8c0d6696e72523820c1d63d555986a9cb72e3f79c0c3950f6ca2e77591de9a0eff4b136aab55f7e889d106d72a78f35ccfe45edcb78f91acaf9fc4ab3d45e378439fa543d3bd3260786102d430f6f5468a8d9c237f2a0e3e11c78a80c338a552d88d6a1d2a2cf5675a8ec1518b5df72301c1576a7201a26d319268cc3bc5613ab0b1a6a2191ce009203080e57b55e7587ca9ea34f970ed604bff7d804bb7ae990b7d4235e5e0e1dba7cc4cb57b58a555d390bca393f60ad2d50ce0096f0f13ea68442e15aa7cd396fdb71403ef043cd6d496e3d5af4c91901f7db923e312bd640456bb89901f79ca517a19bef33c6f8d28bf3071318044120e7e08aab4375fa2c77bd363546d1a176e5728bf2fe5f66fa14ba10dfd1a719ef0fd1a73ed5f78ba880c9c9bcbc9d0fcf31b835e0649a9029803beadc9c378700479c36b9dbfaaddf84389956c4c1f48b74775b47de62a510c0674871ff84d266552e77b1ee5200408a00543aadaa270e0e0472eed4458aa2fa72d781400f2441d5adf70dae56275d75d505e0c7d5eaa2ab8e894d605c0c01f717d8159660052cb02f88610c76603d3a26c040dc08bb9b73983006049001012c805082320f2c78c0ac70051b5730c1c1e6966106104c6fe821055710d960c60f98153a26c0407a84fb660f6cf16240f9035010d5e03406dc36b4898ed905d7ae02651028915ee04803dc1007b8771a10894c2ee07e8eb671513cf7de7bcebde79c7baf5d0194718807370edc97e5b8267fd013b2dcabd3d6e6a97973736f02cfd0aff6f7ab5df3c7bc79570977e94ea0f9ea36ed8cd588cfe19af5694b3de841f3a1536781d8c5a3726209aeeefe7073adc4c4d4a9cbe3dd3c8f8303872e4ca27302ccae07301a1728dee9b01ab0baf3edb56bbdfcb05525119c7b4ee483fa5e93016df799424be2b384243e447857ec40d192f8f0a0d9243e32883146b704126649d060879e6f6849d0e0c39a0df61950f6d282e8bbc1089e6f4c5f0b22be05d1780038d238c325af645094cf8d5f531dd4d84ccc06b3c15a66a8b80bf7cd92d99867cc46eeb79b3e9c97460583da178963f9f6838591071cdf36f96287841211cf0399f8c702f0bc8dd5c0f445c6d3eebd40515fb08353d0e3762dc20c4e07c35810266c25db8231c1dd5fa24fcd9e30a18146443bfdd04c33d3c05ad0b081fb79009786111a685377c03dd3700e42e8200d1a349e7ca681db39e79ca3a16359a1eaf4633fd7fa654a2b6a76f773743fe7a3c23e9cab53501a833621ec41491961ce6b23900828f57170fd3a9b7dead27cb1e56735ada817e36c2ff67873d4271007727e6e70dd1e34c4d007a05f8e009965a1859f1e4d4553e1839c2eb488430ad6d0634488eb7d3560038c09712101c77b139f44bc2098811f13dcd90b64a27366bf1938cca490841ff4fbdddd3fb8bbbb55f0b3034a8784280deafb3c8d417d8f2e9eb19b78e88078670e6c8d8a8afab4418d27820655eec8f4ef1456d5b4ae46db6565d9527c939255d56665c91ed4e74b49ec78976f80bc37345ac7a9303d95570fc9be38c20db418827d71841b54615a958f0ad33b3fdf4da680c2d378655bba26bd2ed02368527a5df4ba3e2f0931ac01a541cdefd5bcbbde4445e34eed9c0d7a57a0080d8d010deafc9bf37a7e185eb62423ed39b3557a0d14af120f79eaf2d4ec39a9cf0b43d0753311d89ad4de506f2cef6c137b81910beee17e73adbb15101d9d418d118c19d52100be3ffbb039d75ad026391899022730815a80d158b704f48cc68a971602488e00eeec32a8f4143231670f1801761511438b2f8e70032dbe38c20d68e88b01a4978d61f103a62aca87cd44e0f92625944dc6185f0ff8485d948c41f53eaf9a3aa432cc68fa4d4a29e58c2d5f6af912255f7ab2b529a92df59dc442c70f58fec9ebe3b558d9400b5bc8c777f66251ef53a9f62914d89de5ee5d056639bd7bb40d6b81ad83b49004c76096851688e07631be6b897a03baf50c7abb5b0d04028140b79ea329eab2a99be5e79582e42e1b869ba868a6a0ee2afcb410044727989eda02d387b260061c5feaf10e3a7c7c02bbcfbbe71c4c5936376c65c18621b8f76543ad6a35abba6a1ebd6caeea1464514a79d0b33c74f170b76ea60edbba7b7bf57dd9c8c350e83ad0cd13b3bce2276df6807545e04ac80111bae08513b23042c3188ce8d6c56362ead1deb0dc9d5aa2d3cb6a970e961e2c777717d9dc67a96ee4ddfbbdca547e77f99de670efc69dde4c51f6063e043ce2af5314bb72d99b14c66a54972c8f978ff7d02dd0592c5bea017a75d0abd379bd953f4b7f03fa55835e3ee2a99be11f3d75f3cad59183472ff14039e828071d441dc552ea95a5bf6ca64e437d4580d1c4786551a410c25801de498796ba37f4b0be5e3ee233a431549ea35140ba138c1520d3e4702ad626078fa635ddd0335ced0dfdbc215bea410f3a3de8ce5c3ee2bda1b73520070a4d34202707bf1bba86c881c265e36089c76302970033eacf3681a91c4ca9f7550189983aa52c123f1680ad0389f887c48cd5085925f831035367b4093c1b9083ab0b02120642c2147cbc76e4c08cd1c8f0edb6472f10540ab32cd4a0056669d115f45d610818845916568002a67db7c0fd96d768de9865718538609897c0401c76eeb25133098e7a07f715aac0ddec89e4b5da146f16576882e11d75730ee44ce0dce80ea3d11d28290fbb49a4368d4e501b8fc7da80e35b6c0e07458a4823b29fa3bafb72af7ad29c3c71ceb91d9ce50e1a183d38e605ec6c5810a3bbd3301c287767003bc5bbe705602763033b016037033b1692643241d0bb37c351efeed8099e4973d2a606c60faaec27b799b41127e3747ab8995463dc5c577426e9e6592be9265375734c6e23b2aaaaaa7ab5f7d4da3713e7749c8c23d5cad34ce6ac554747c731d1714c741cbc1113732dcbad25dd3171320038e937996266707e332fcfb3beeb8c952abece980c7330319e49f8faf3713200b8ef887bb9200793a2e2789c0c84543543aaa120ab71a7ac0dc33f3f3f3f73a045b4a94f0453e25a109d30741a8a2245dc108e1ca962e70e3b56637a59557bd2a6e6f1a88b6d380e713251495472ed690e6a8e3f388241a44f393609d2a72c89e0227d724ac07d29248221756293767a6a68a67ebf34b035b01afddbd7a499fa5109e8a45a95e07e3ef4065506b96adc8d6004a9f2398281fbd57f9c4c1cc2581cf2c3e2909f087f9e8b75594f8bd6432b062ae0838263848f4a0734c0c401f980cf12ec8983cf00a01c02fc1ebc6c6c98b44b473b2b3153811295278408b9037eeffe6861504cad7cc6477d5a91b7ae9a15f7a385614119a7cf72968b6268f942d9f837c35a6d925fb1d6a2645cefd228aa3c7d44860ca970cbb00c3bead98e92d0f21b77476d92af6d9216f5415d49c2c31365c4e13d368928970ed88588850a2448e4a5839d612487111c52a23072876664c243197f9f6ee5d21165c8b8b9552e1ff031b258d565e30edfcdc178caa684b2c926656b000031fcaccb077cb74a4395f779efa74d3e2da12176f4bc2d9428e97e8c67323ab25c2c2cef2a082deb5a39b436acc6c1234e0652b2c134b0d3fb6bd226980666ea63e813913898663822843d0ff68c50ec6bf2c36a340b8e60248711c9df6511890fab51a4e6a8242a895b849ec8aa6c55872a5f8471b16449c337dc90aa344c261805c3c19af8f840e75e14343045b1aabf28a01998c8e7c6444629efeb29bd9e1e6ee8316e4f7b6a6836fa2cf635b18f0dccd47f4756aecacda4947704a35cd1cdb3be343c9f6704f78dbc28525490700467b983e7e353ab4f0f967b3e55a9ad67730c9c9f8f9306c6f3793ecf47b6f6e083f0f94823b685e8623a8683c178684bf13929258477cf39e92094ad5d7a4aafb4343075d69beefd689c73523ae7fad43646da2837845aa50968137d31c2f85e6c0968535fb7ae3baf5bafa15b2f02f40b74798b08dd0a5d9383e947db9a75d0658264cdb7bedac5444a734e73f41dad9d6953d5458dcf3310be0723a43de01f151f63499a7a38c79b83de99ca8bca709e899969b1b547dfa34e4d095f55d1aa02b5245108f7001095540d820265afa5a007e716dc4fb2f7e4e8a4e71a0a81aeea6c588d7ebb5a724b6e710dd39667bd47490c876c69e1a13ddf409b0b6a374c67a144096649bc0882fb329865818522b59de59a0086c3e17c03f72b4908f4b536f59b16cbefbd18218c32c625978e18319e1b1a93efbdf725dfae9a47e1941052734238a184b0a5258fdc078d6e113d8f64509c4b41793198c6cb196af5fc62222246498c8492aa71a797059d08273367958da74df0b186ec07e6a343e8b61d07d34298d04ccd180c7dad886c45dca5036b4b60353af9d8c5c5ca780f3693b04adc19f2424309886f649c5ec669581927007c426a17c6e68661ce2c93ecb1d07324f2aa6c8e358aa8ddf5706607f0149b49d884c4ab71a73480cb6a2b0dc03e18cbb0a909c0529eca9e2311ca531d001ecfe489110269ab1868538cb1b5d65a7b2cfa482caf848bcb5deedeacfb6d6ef8679669217f1c4cffc60ddca085dba8b5e07633bbfd652514561269983e8b9554b01a53a7a50eee9f906d18e5e547eadce74844c7362c322d09519e3a8df4a9cd223b376ce471301d95cc21720704923bb2a7ba258db0141bab68530403e7871df562737c82fb3e58249e8c02f72dd9735d66d8cb6abb7098126b1fae883414f1482482fbb70c47214f9c0c10bff13ee431b253a4e708131e8864891288c4f92821b1f597a204c437294f395539cb2bca45af1fb54cdca9f5b34f28aff554645d8c47cc6078d173f49580f846d2e853e8ec46c8d2886936740d60c62e1088d94df2be4d6e06bbfbde0edc9660948b506a9b2aca9d6daa07d9d7a6facb5a6daa8f3b4e66d430f5adf276d5d47a539ec3e5e8142be32a36471e19d4cab840d8f6c4c1f45dac90ee8143603862bce58378ff2d713238de7f3f5088939929f5f0517e46de7b664b6014e7793c37d4abd3917ddf3183476f3ddc1eba8718b6396135fa41e0b00d0176c636250e6609a92ff3d38c4f65db9d73cfe1183bbdb3ec54f5b81395f469f4144905c3b1d3a72aa491c8e36410f07e5ce264640ec487cc21b2c7c1f4fb29eedc883b8fe769d1a78c33e35e4f9f1c4432c465d8a7c81a247b1c1798e52c2b57f6a028d92222c0ca58e6606eb446811e0fee5f7127ee64d604e7b8831b88c4ed54bbbda4c51de85c6bad359b6398730f76fb3469537381aba88d094602371e5436790cd015c0c39f10e7dc8470c89f75f2cd482349933d1df52a48af1a774a415673aec6b9a657cd357946240bc2761a6d8218bebc60e79c73242ce1e143496a9ec1f05e51f39396e59c73b33d61c5780333907865bc19c81258beea3da47a3d64be7e413fd16c3821fd02dc43a6b33de487c4734e371bd55b28a1371fd3167abdbaf90557a750ce39638c31c6f79e8455f5b7a90282e57befbdf7dc7c8c2d95142dca2a31032791e32e90c6c39d8ad7b96e13c7c2efceb9f65c775bcfb9571dc618638cafab8cf382dd2b3adb44fb340399614a30750a63bfd373dd48b407a4add1bb83907a9ba83a04ab419d3a7729f7288b51ee598f72cf51a770282a64b9db9e98d10171ce35eaeffda377a3e02c46db1b8daca8d9c2ee2368c1d782dd3b471c9604bb100fa82f673d0aab48496bf4ac36b5f5eec8ba8d635aa3fa70079ecbd1401e7e4c32fccbc114c2f82763e4019f1610c3439873f0fb9c33263f1ef1491a584a99719812fc07e11f74b6c4c32101e4e11cd3c399c16149700ea6ed1e8cd2624be00938993c22945354ad76b689b22e62180cdc0e07dccf0408e203cc463fc360f6f83c1a9d3db71ce717ec42b3a873d6981932e6ad96c5e68aadb3e487592666e1a92a2896f2d41591354778ce97281a7892e6adcb669cc58e5eb2312cc9e6184cdd149b7166de68c6adb74c29bab9615165627e004f200ee5f5391ac512d1a67a1a857a45a7304bb147b027f886fafbb4140bcb59cbe4193c27e3c9263c7d1c4c9fe69c785a788ef0249d4acf2d78deccd298b01add421aa6db13d7727df0e8aad88663309e233b56d4ea8d49a636c4c1b4112ab20da758ca53731f615aecdc251c4cf791f624146a50a89969f1a6f44e0b206daa4eb0a5a67c0f483c25158e6449d223a4822bbac0f1e1218ad0403ece1133736d13d28ae0f64aa2c170b8bc7f8f98c13733fe6229cb366bc6299be7c599c1f3339a8e6567dc25645817eb8365b48a3a9fc3b1582524ce393af8863afdb44d07cf57d4cd34b3d394186738502e7ae9fda6c5124e4600ed8893f1e16d1d3973320130dde79f275c1ff589e5fdc9f2218e74b7bc9be0f91073126ab9b3d426d23c8b656d5ab1f32a4be653502c18785e0096750000f0e2c30c9ebf96354ca61ee54336bfccb4604a98582012c357360391f8aa918d3dc170e2d8ee6cf3e159c1020d32056c773ab54ded2d040b1a7081fb2dc86d3a4d48ebe8087918be3ba24ca899c4449f620bb2400536e03e690935371d1ed4dc749c8e1020638cc5c862643132169d7b2d3e5bf3b5116dea409bfab96d61862dda12266018e1dcc2684ef093d113dc275d07b763adb5d61abb732ddd9460551d3640a0692ea7810e1861bd297132f50df4e6e36442a226d352d060d4c00bcc8ed31b60413422cd469f957adc9b1d245a176135fad008b5bdc9e0fe122d884645b3d1af958adc458ab816841382fb54838173a342645b0a588697df0bd4836e13f5421e4d10d09d9834a15fb6d1b4ab884753af132808d180de34b989906dac00a01780de0a4c3d0a4f6051685dc4cdccc4c4984c3f2b42312b72a080abe7879915d629a7e3823418ac46bf7b9aa65d43cc1f2c0ccca633b589b63584b297760fc6f75a73ce39e7daa57ca3d869f4299ee453992c21f5d425337326bf2c11c3642ae0607ac6896c7b45a6913e5d4560a61e429b5a8433c2efd2489b8abcdb0ca14f2d8a6e4560a726053359e65e7ed7af85447a2db26da761fa4d0a8683bedf80c070583f6038400c47e87d78d55ca30a491002599607c4334893825db6ed54d140f463a3a21fafd9567e6c5ed6a61a6a4269044e79d5c848e388d14d4bccf9643e994f726078eabe022452ad0ede6853cccccb338cc13f066ad014287ba981f11445ab18ab2a5655acaa182beaee35266da2288aa2a87f7ee0405a2604d913260dd3efab66be9d9a81521445bd29a142a7eec3694f68e4a28a418dcf8d0b268e899301ddea5757b71c137a7b9e1008389ad075489090c3c5c970df47bd5d3dde9028086157b4ee11ed09cecd097bd2a44ddda8a8ed4a241b68a3612fb987e07e55a4e62604f7e0ded9aa4d080feeb7271a912b54f704b32b245b4d489b8e5073070922a465ae33f340e409274ee3fe5e03d140f471b74e82aa018a20b5e11ccd2c8fc6ae0808dcc033f65ee24f6df0cd269183d91790ef9a801b8b191cc1dd3b5a9ec92a38331832131b6a7e736730ed96dadb8f25dae35071bf2a0327b83f6a9962b2971c738231c659476d6aca0281a4927bc3ee6dde92bbd80aa3de54490e0c9405a04e8c850c82602c620006ee763130a1698d0425ccb0e041cf0b41c86c6edd586befbdd77f6fa566b29bc1d618ebf6fadd7a505517755a3b5b0d9b772701f07ced3d47575dd4e7a21222548c30bb420956b8020936c062054e42cebde7ce4aae5f4f19595be7c3bd3bca75b3c698e302930b8731e1517121085dd8028df1a240a8ecd449d6ddedc3e607dc7dd6cd1873dd2e3af75863d8c1f7f0d57f570ff70bbfb7cb01b32f1e3edc5fdf431805380c7910c60863842cc6e89c6b9fafd968dd458072061a363c83af21a4a68c8cd986dbbd183b4658821142f79ed2750f57af8ed9a7be7d6fffb9fb5a25032a9acfaed94b869b498898243b4c378298ef47a005415b7d15f54c269335750c003b1dd4570168a76dcc0633c19b9c8c6430f00d0f431852f345b4a9a98b8136f5bc481c4e4739eab6e9dc6b77884a8836751115c0c033d130cd39e79c7386b040af20b2248b2ab0c1bdd96807684cc0f9312ba65024491e76b8a03c5c1879c891e2883280000c1e8db3124de8ee6eadb5eed6dd0600e59c235412a605167067f1839bc1210db8bfa802f7c9b08331dce18b328cc1e4189c59cf02fe869934c47461fa4216baa83906679c1b99f56408e129ad4ea1cdf149e46048a955556d6a43b3312fe1a3951152d0c6f7d326f8697fc8abd2565440ad6b04b628f86b1ebe54bda23e6f04890852d5ce0869005c08421748ae0b455e91578347e40d79438abc22eed76acb0e9b38e79c73ae4e1ef494dd15d436b32555e8e6191c7ac1540b6e19969ed75d154b79aa451262479f52ee3e449f46770f376864fb2253f7cd21108984338333d3ddf12d5ecef7d8a85f1ea87b058d547f3f5ed43c754c3cdf985551211b83f3643c2eb31ea6a4ba8cc9c4b7dee8298aa2288ac22dcf38376e6e17bd75d9a0bc87b7f4899dc5f86b12e3a49f3ec5383dbd6ae8c8b63cda395aa9a893ced8a9f496d6ad2e650367e6232dcbb280b4b43791892c4bce782512552ea7d7e5e67e3fb8bad90613d317586e7e16566e264d6164845e4ae9ad6e651a83abdf1bf9689d368b56a7665c208de5ad9b1fae6e29be7d2e79570882feda2c6be5f3f9fd58b4d5ffceb82eb7744997e5d24f96954b512db6ba6caa9553d42b751075483d44fda258ee5b99131a9151ca1c265e930706ce53245f93e7644ad1fb796d98ef2706c6c610cdeaad7ac6b9f12e9016b58605263d5fe0c9c2ce1490302b7085005c192900ae9e6370453f2bcae696e395328ae6a5b1e52956068a0d9ce7719e160a6b46ba924acf37cd78b6315b6ec48c9b6d985ebaf92452e8fa58970a51a1aaa26ea9f425ce860d9cdb92934875528f383770f58c730387ee427a7ea4b75878d954bf09b5fc4d27d3588c0c4c8c35b91877228abacbcd31b85b5a4db3202e455c1281f5dad0828847792e00a667d900f406a537e3dc6037d643a7ae87f5d0499675ca3e5c0a1d64b13ed1194c1380290ba5f4515a2917f4a4c770a09cbe000c87e8f4ecb5a1d9e8d3f7fb89f1cde61c4cd92df570af6ee35e3d878910e9e69783a905d238745f1b9a8d18e3cdf670d925b589bd02b0317df52e82a9fb842c4ae999c46d8993a94be692b604c54691a520a6234bc52251d5b4f1949d57c2e1bc04b6521e9f72d5ccc6297f78641f6e96f2a05887a7edc69332b1d4b25c3a4215899aa8ca7a5bb974b4531fd9235ef0cd3c7dc81ef142dd4cfa7cc1f494d11816bb6c7c50807d3b630910721adb34448128d129944bcd90bdb905d378f308d3399a6f765e0be7058feec8b6232d0a235f34231465564f56a31f9a1415290f7b63e27c66c3d037a94df43434df43bfe845b16e0ecbdaa43284a85ef6f0b4f30cd5fd399adeeb0259d6cd405e2b43bd7c504c852e9b7af8fade98f8f4e99d1e74d5508aa2d42d4add8af626f42630655943c224c5aa9ea32915a232459f7269c89ad57ce8940342d505724ba15b970ea04e6fe6419dfaa04ead789a479756e8b2a94e419535ba2956655929577573b32cda456668524ae9cd0fd35c710e134d50552e01a6af2ed59ce02c0fa46fe29bc0947a98ca5b6f4c5a10d4ad9b5b931f0ee796296b3ebffb60f9ebd56f75f375abe7772bfaf84a349d0c005e55a796a57a5a4a1f8a976a4c9a0d79147b05c0fa7000d897e770b552b721a13403698a52d4b44e455a86f94cabcf53aaa2a8f7d5a3ba454fd90ce495e24397f492b23e4397b22e7ffdc53217ba19c803352ab0bc75d950bfb16e6e970f0b53d4cd49e460faeb7a75d55c15c4d1462c02cb5d3daacf87abcbaa3ab58f07cd15d35b8d8a3eb532b4201aa6f4d007379feaf2115e35d4baa51204ec5f4e817b1ffe725370efc37330b5b9628a3f80294ce92b9b83290be4e1795b199a0d78d9991d32a37578a1c56047c9085b158da751815b13fc432f28e714c1ecd2611d04fa358329cb8aca280545143a2940c64b31ede618a5d2670899566db125cbda74cb7a460c6e3d5cc69d388d8b8c182119d6c5b2062286b52cb667948222aa1102fd81980f0ef369b6cdf93035637ae848073a9f94ae8f98c16cb6cf99ce33985af99d2a10ac2c4bad938f878f77f66de2e550ed5a40599fe4e78badb5d65acd6c47301f7cd3ee6e76d609390d35c29351b76f9ed886e1d6d1b81ff3c17ddb40196bac7b6609f3c1ee5b2ce969ddba0841a668bf71f692270fee331b77e2d9b37b73770920ece7f12cb1c407641a4de4b1376c6ded4bbc97218e374626d4dc3f3dfcbc2a5e0c581073087b44fa24e3ddf2a6d1a7973709c9a3e2ed3c237d22c0fbcea74ff67dd7c4fdf4e9ef3b277d1ac0fbee8903a34f300fd2a700bcff84f44900efbf27fa647aff0d613862bca70c6680fb348b1ae7ac95c88e93219431c69c638d892be50f8725bbe2590f91b98172e71a152ba31ba1638c87d530d147ef275e201a9db217341b4db21a18c533e2a0e8220dbbfb440b8261777b489b9873cd544471277481381c3af5ebca401c16dd852ecf72adc80775e5027998d5cb37959b2919ff30bb3795bda1342410b7d0bd8167976f170f88d9ed1788646c6c0876ce8e4e2b0b047a8e6e47907076f90d3b65afa7ce7ab63e5bfd64657e2abf62ad53961dc58a7ec3ca9c5d50e56201e259ec2c567420ac8c75e1ed759165b98c05c246e5a1932ecb806012c5badfb0a78aa26243a1cbc387208b7507c29ebe2255ec33b19f6c6d18c6ea576c3d6321fb50ec0d5b1be69dd9fa07c451ae87acca997da3339a8243ead1fb052d08867b08ced1344201f7b1a80111dc1a08b743c17e6215b87f4629abd5eadebfb77286f2aa22faf51175107b3c6396bd59c7d8a9c81377fab18a8e49701b8165ab58de520392c8c1ef82600666b714facd3b7be88a8ed477dbe3a5bc0f2ef4a6c40c0cdfce6ec691f296de6d400e86b7047ff32effeedd4336cb21447f87d78e2bf241c52c6417c12bf2418d1787243abb37a2bf7b439d1d8784d9c52161d17537e39030753ababb7ab0f0a06ecad9cdd7689482f28af28a522bb335dec97ae650ea53ea599437a754b652efca5356ceec0a6b8fa6a4b0a7dcbd07c6d8b1a8a51e78f47655dedecdfb1d9d5d3e587e2fcbeffd231981e308e54675f5acefcae343a14b491fbe62330e098f4e1d8e7ab0fcde9bdf47d7e697bb01398ef6ad9736f4267fd31e2fdb6fa6fec3abbd79b7441fed60b8147fe34447aacadb55b9bc2a58746f9e8acdd4c521e177efe973b81e6cc58ce11fac0f361b81e9abab260587849568925aa31a6f17cb6b58e9c4c5661276b965e513eb1d1994cf45fe24a91349963fb89dc42dda34a990375fb61d7a45cd7388dcb148d8b239780e7173ca9e21b26788ecf9914ee4933e351c0a7db6cc0c85fefa141f0a5d56d96b1846c1b97a0c800b41e002cec1cd4767c61d26d3e766d212dc978eb5da6ec631e1c8f3de6953bfdd7945cdb2670e6942c4a74f0c339a49c2338644c22f48685897394f83c673348dcfbbd81a77f9ebd301eef2d9a77b975b7d22dde5b54f2977f9a84f05b8cb497d8ab9cb5bfa64a3fe506badb55aa3fbe0c3476f76f4149b1b4e79b57906d75b36efc0d6d914915afef21c89e0bce0945f941529ad372711e71c8a44b9bc6a288e85457f588a2a2a72d1a71551f4894dfa047aaba8a8b4802e1b23b2a697b7e987a75886adfac37d20fd87c3abe6a6bc60d253ae1e2d3b6ff002931e4e21ddda2697bf36b9dc00d66a93cb0b60476d72798c25b5c9e5366c4b9b5cfe839d3535a60da8dfa8b44cf7a4492d199a1100000010005314402020100a078582b16840aaa9ba883d14000f9ea0506a4a96a8610e530a19648c21000200000020009120690040398da8027e9ab6d25b93c4e5c2b4e13377065ca055b0963ccba58fff1eab12ba2fd4006d8da8739c6df029fddf7aa43968568e73bef063a273046e6f3bef258815f8e5c0d171a4314b59d1a16b256f274e7f5af38619419c94c484ab2e23b5ed4262f7b0e176b283fb682be23d9959689e54c7db20c9d69a33f9d8a6e8607da24cc08a3694b71fb4c59fd800f94df5cbb471fc6f52b2341fa4bc65b410a1beaa880a79bcc743767ee40a5e57d0e24279944731eb6d9349329fcd8d485cfaa2163efa375ada021585d19352fe0da405d42f7e12ec7b6915a573413c5227ffef1ac09c57a1d5427cda35492b0e6ced8b2508b51e020d8c7edadf34e8744844dddcc223104462619d30e22a01d614ce2df99aa0497d9d7327954ceb00589a949626ef1897262c0dbd1afd6be2066a2efc55ff51ebf131d55c40e07a5a5098b49b328c8b073a5d820325379ec69e29963eef759a0746a512fc58dbd4730387c329fccdf83fa5eb27c8affbbe8dceb666de1e38f19eb52bc4b3584e987b73de5539404d32a2d60d342b4b34ab1116f2d4acb17449d66a29e60ccee9cc953ab3fb4f35f6845a777a257731ec0d35c57b32bd17bd44c291d73daca351b4c27113ab3d33b2448b98a38c9b171d96e42c4c1096de735d6f6c92592fa204a80dee25390c1f54f7e462698e9ea9a7c05e19560d813014c837c1a2e4de3e1abab3a56fd18bcadc6249c12687397bf60ba56dd58ed9d72a2bcce5d0847e3f372d3f6f39b197642c3b580531738d5a4aa3c17622ab2a605dc62b25c3a54b008721a44b2d30bb1221f234d0c3b8f64d3c991a31541c99810d1e7bc5e0da5252b9225223d639aab862d98e265adc403aec9641872f6395658efde5ce013253200753eeb536ab8cab81c465442482c9c93c7ffd027a10bd4c69569dd56fec86cca4cdb07e93d14c3f6eee4177fc40eda55090ae20084b4330b28aa0691d0187d7f313762acbdc5d524c7b57d7f68f66671b7c5c5d524b05c23b77dd5efc75853c54249bdd9dc72fea005ca1b8f64a9d969079d7d4e8d78e0ec0b1fb7e8ac90400064725f65346ff87ced283884db05ca6b4a5d5315a48edd6365bd4cd1a30f37a059c43ed4c52c630c11fe0bde2bfef001c025bd74ec31d4ee131f837632a9eed527a2f783012d495e3f1f0d155bfa7fe1c8dc482ac65ddd0c22388dd3c6457f5d446b3e7cdd122e387cb2094a7f743719d897c990f3954cc71c18f2c96884b2b18e511d6d57fa2b67a2e6bed27d57d3d0d798c8381f86d91d8dc99d9baa6dda1b67a5cc08ee67c6c5c1369f53f42234df3c7136bc7fe90394019228d2da1399cf48e01295269d1bf054f6409332c023b8636863d52367b6a05aa5c0bc574beb05ad877ec41a208135dadac39928bacec167e46622a43026d318266e995e08875a9d52cc5ec288e4e85de996fb705fa82091c7ba667c54ae175f531cebfcde9a3ce431a44b66909e3c55b3d1314b5acf8ed2d03dd33ecc577db4e3301ab3ef416b387775b568ec8fc0a141db7665d3b1133209650658c31ffe4627435f4924a8dfd709c1e2142c410581f44885a74e33a110c4d9818948693017a04027f5402927c0e0aa333f270c183564f44fb90a3953da53dd6b4ce520c917c8e0a3b7ef6d581da464ed38c13e4a0d0b3d34b243ab7135b7147dc587a278574de42fbd9f5987063cd90a8f09486ff3224bf4c82c6f78bfa8f2773f5d016dbd9e50e4635067ae2ed38c7931822f18c11ed4c71ea6afca6476e8a84ed80158038b65ccb19ad617276aed19183631f48c08f62b8e510d378ec4881c474697e8b4631bfe592e504dc47e5d0e1218bc795159a4fac063849ac028c6cdfbbd185c8a534a61abcee5cc3c39acc1a3d9d5d0fab25916a3106884403a5444de54e3701635ee9839df12328ab765baba43743d02bf4fc37607ffd3d409a158071dfde5e610cf4c39ceaf965bc4bd179a2657104d765f10017f987f66c14ebe4f846e7fcffa6bae18e8a9187e701d968ce1324938b206718672ab93bdac95899c5bcc579f2ee625fc4db63bd2fad71dcc81ed8e0ce14ca4084dc201a2ec47cf677128c6d9d325d5d0d4a1fe24bfacc41413a537f15dfece54d25f36e29dc12b29a51845fc804b62e419635f60b68cafb85a4131ba92d048c6085bbd32ec9dbd9585b058a4190ab9432d40af558845ff061e1fa944ff0f277572ff56e94c165e8071a010c153e31a38690892b38a6a8767b43f89bd562b78e47b6d480e454844aa84d3bdb895699c18bd6fb19f31b47a48339d1696d5f1a8b6be502e7de3b103b834bc800df5c2803a506615f3ad4b1fd73625432fb8f77682bf54288c0ee7eb7ca8244a179d57ed7bf630a3ea1ca08c76244944340b15d2ca8536576a17f78e292ec6463ab32dd581deb7b9c271d921102b8eaa3ca49b0407e403a7810a59101edee2c9865bbcc46a501e0a5424d2d3f1003970bfb957207ce3e3348dc186057effa498bd71ebb5ac3d3f6bd80d10eb9240f3cd7c452c4aaff2a79d282ef4c75508a533fa868a014f619bb496c3676cdb2f1449705b3cfeb6999aecc9645575ec4213b5a1287d933c910fded31fe3e244335237fa770ca17bbee11549e12c8aabb6433ad0a349c32278da2cd83f5fc0b6792a9d111ff38af76942f69db64e1b66d25829354879a5a175121c9d5133ff78a7f62af24d25fb5c478a33decdb45d38c71b19f079d915d4deebda6215e2ab9a26915a6b720e4830c7430ef63182050f61e1e3fd85a085136b01ec9291c604c9f57fcf23bbd9a1e1fd7b48e08a0521e3be37c4b2ec1b8ce90397e8db0968c29a4fbf6d3e07d958b50aa7be6599bb392f617353a4e2a3c388fd0997cc205db5ded23c71b72ee322db385e0eba25b75078a77a13df314baac7c975f8aeea5fdd0f5ffe7fcda4bf1ad8543157531efb69530d69e73f729bc82d139a6fa9652e7fde0015f3ac549b450f86b252addf8a3665ead975248ad7cd8dd7a227aeb6f5b056c57be5f1215a2a83903d1cf722a4eed5aac39adb638971190a9e9da3e59857804aadf387140502c991158ba640bb40edfb9181b183dbd9d57a7a763764c2adfb25209859375be7cb813ab8514d390ad476820fde81123f412dd9355f80ceef4889a493c7a2d358d68220124410c32c6214775566f591d088ed316af1b002c2233302b56fbab96a3b3143c29db91d73d86cf0c05d64a7a0026cee621d32e37eb8d82723aa0fc07631bffbef8188bd1972818263a8868f335024882ddb716f752a9058b22c2d57b3ccfbe03304324b7f128fe07be99422422db4bc36e90ad33f6c23e2b686562a1493394fe083230c2d3dcf51cefca474635318a4b002b650800cfadc590cc0b08831661e2cbf9f5a14f392cb6515aaf9973de27c3e791f8bd56284a3945b88dc9d3ecd401a9fb49479ccf53d93bbe854fd4aa206a3232440b799addabc98c62d0a57c2bf14d31827db8a75ed4aa4c85c50dd4acb9b6f32d96dcd62966353547f3c4d1066dda535635427d7f81347d47185e8a029034e5d9d9c07fcc6b3663a0397aacd61b6cc9f4a6ec540a51e1cc3522b53c09cc5c82bb2530465a1200706ab9f7a71cbb6482b45ceb47402862456fcd868e3d533469629ee27f56612e119f8bc93d0cd9a81b467d288c014d191bac37273228f721001a10a6eb4793ea6d23603974f6276e11d3affbc6d72d62c901575dc92841b775cde42bbce0fc847a6ee2483350f19c3440178f0ddaaf34e5722d4ee0fbe06151e64bfc470c2a93f79d25a0086388331970ecf81ce13a57e460be681ab3218c8cd2f6d81a09834e4dea100336de9c5c598966d96005840539ea642ea5188cdbd8ec4cc476ec9b51484d51e5625e2d3fa8d981f24cff86266231c8f451ae724ca007ff19dac8f48e6c009b340294f7954bd2f6fce0cfd1ef87a80ba7a4ea6c636aef732a5d17556576a0ea23db77f6af40ff45a1e03ff4187e6c3575df52e236046f13151f88069aa9a7c9300f6762f4c96af34aff404edb0a7e88c9e841550aa43ff954d6d2690da8e2e90b537142de8210a0f95963c3e543e6cbea5aa815858879569713cb13bf7e103ad74825bb00d0622354d57113ffc4f37a3888d9eabf4cf72a6ae724cfee7304bdb63fa4773a56df3b9a38f5623ea5b352a8374cdb8475b0aa40528acc13f02cc5a90b0c971ae0c9a9f42d525204e3784439dfb3f3acfdde58139ffb78313f60b4e3ebbe3374cf4f97f00b098a0b9b0c3a9555c59c772e4051e50595aeec19fd9da2b0ccce2e925ca452b021618053f50d6ee58bc802e6ebc0951ebeb410063cc8b91e7d36d051d6dfff6e0920b235aa41fbb1b7406b55154e4f988e82139f1715afc7c9c0494b0199b3fc25d4674a6da4de600eeafc1d054ab7ed8cb5f7a8b23ec0641d354f29cea5f35eeda55994282b041ef6e3451b0bf7b1b312bf26f2fc44aa5c020c11f797411f339cc75b2c81813465bced9c4ab4ad6c5425c9351bd036a508ffbf9c5b6518d49f5ab9af2406b51b8e4162b148a7afa4fb22327a08d98058023e4eb58614e15a8acc17530f10d7286a3681adc9f28fe1c21cb3a9da024f2e56cddfa5cde6e79d97a66bcf23e1416053c856e93efff8a8f55fc78553c3ad685391495baddfe7685997c36c5d0b2faa8aeefaeda3dd3bb4071dbdb19e4944c0dd1acaa79b1d49ee0b2f8d4339f64507c995a39b67bb021fb7765fe65db2ac851cc274217947077ccf26dfa663e13ac3564f87e7cb0919d10be131b1157ad1fb41f50eb533ff2593a2020e62e7ecee774600d3cebc9533578519295741af8b7dae6196aca88abbd43a19684f6b66a227af7a090b0396ec92ebb226c2ffe7b62197ef16c19eb20d31b942eb3088a924305b56e746b82f2cf200feafe1c0a3767a55c6b2e5aac8e21734926c42503a2be45e478c394a75c64808b5656fe71f221ddceaa74d886e73b1ad62d0ad00dbe4180ca1a66cbf72b72330cf1518810b4756fc0fbd2c79315693839f3ef16eaaaaa8635826ec3e70df3ccd9cade14a1b6c6c7075322784f9a6cb07bc8ce0fefa9da16b5ce4b3035ba4803452809ebab38fac932ee7364617ff32143b7510160c22cb23407fa1b4644455971f4c7b486a8fdb81ed19b6af71aa1b7645759e4ff6cb508acf8ce52809b768b1ad2697e504d31afe57592e5a82433219ebdd4882450f978f207665c40f2dc9bc66317b0780466014bd658de3b52ccac5bb0c425b56bf931b962a4516e63dedfaefe54282f35333464b4120f6537fcb78734d2b9b922450dc6efbe82d691849c76c03f62775f256db7284cc622a04c618914f7fb68ac5fe5ccfb5555248cfd4c4947f083b56eefe041fae58e569813303d52fa45be92e9e89b108f3334a531dd984659c81b57c85de55f3706bfccc8ccfc8165d29cf52df4a3d8891dffa2ba37401f1613f23a02453d62aaa33ac0f9b3545ad1c4641c571df4cd228f8d395f07cc994c54f57de916cc31b11d955ab5d759f366395546f3416056d25775f0e585a0da9ac4fd46bf24321b06d2d470e20b2f207683454900443594aba49260471e3b4c7611d661737c63d30835ea0c9b135026a97f5dd16383204ee65379ce83626588b2dbb8f3f81bdf3587886ff496cb399d075a3c25d3a26e6f4bd2bf14717915e241a2f6cd7f5250b634a75d06733649676a5caba47bd216ec1fd629c1573439b284aa17f9a7da36992b1a5da60659d674c899bf020c595e8e0b5d546f466fb33cd1ad583b2de9f7dfd8261738793207b09581a10c5001a46b1c7a7a4cff0e474b1dc9005aa895ac1f8ec983b7632076ab693c0b29444dddf7631150064b4a25a6ff19faa7bd242c4c71d2fc3ea693dd90533840ebc39338a1fb791747a9862156de571735055b0e53c454fe29878578f035f6f11d86dd471d445eac90663f2c6af448829ae5856efa93a17fd35c0c0a6a23c0dad9b210e1633c944babd34bef44dba70dab3c930c377442931b26ee10352ffc09d80a7ed1aeb160bc3d9927c7dc157d696d1356727bd4b0dcfb54698d3a1e6be41401d5e3e2afb9612ab679dade095dd00d96fac1a345d5d252850996bea26623be2a71662e62cefd5afce779f8e620998857ad9cd5b2a3250d8029d9dc2be2f97c3dd646a7a758fe4d16a1a482ff8cd3e9554b537f8a4c0561ade77d7e0c4f16ef315d6a1162b9fc7a72178066169df2e27a9e445cc1fe63bdb2fa00869c4445f2e26758ced27a1c2b107012a913791dca99db33a053c6c5b796d2982efdd21ff48926c7bc076e460972a66b4fb3fa04d8889ef7254808c054927b9b01df3394dba06de6d06683e1d8f4178d6a4e6e84ce4544f36d94a31f606fc3e447f4063095661f3a0ae04550e5272e5ea99977bb48b2ab501334206808582226b2a6a1867cd267ea21256cc7ba3fb2715ad66fe1cc507f320a605458c3a7d77a2e58a99bfc3331d9595a43ea2bd82ffe924fcd6a19038873fb5752efa3a8414dd7967c7163f4131568ea417e30d7bd7921d658f6b242c53a94556f248c90ecd78e2b496cb8926ec06abe1a76c5b83a0441f9a7db75313369ddddec0807d8359f39aa624a843f22e98612b9ea26f186f00cbe8f9cfc7bdcb33f708740b7bd0c31002851db00b117407c60974a607416e72dc5bf85d65ebbf5df451e202f115ae0c1ad63644e684593471fe5c8075902576f770c9c341481e5bb84041522bd444a1ca8bf0a76a97bc149b2a2b87f8cea6d43929900c5c9f8a9f2587b1b80cbca9a3ac7cf9cb6e664b70d8562fa32aff48d712c428d352c4edcc1aa6e290e10ad751ebaa0aa32a77a66bfefd3d05f8adcf8f2ca0e86834b171b7c0c985c88a32a7a801d5fae166e41248a008a32a27ad46c7c1d2148622764376b6e9a2d465bb25fb5b94c178df3ad16a0e1228121b6c1ff6caf2a2c081bc738b46ede4e83b6661d4e82e96342c95363b32b7a02c46b85b4651913a16d85be1c9520f1f59799a73d5c9e044518f4ee5b6342828d72eb1aa83d0120d7cd1ab420eb2a58691b8cea9a249c65cf930c69d3c01a0ccc7b4454bf8fb901696e7fe4c4a2c1e7070974603340446b3690ad1fb39f62fcb12f09f4c9fc34c59fbc6e888664f301e844f9868fd048d18dce7a6de6156744928347f8d4a9d9e589462738e322fe312d055873d5040e5c10007035488fc380932c72746c5acbc596045cb7d38bbf2a60c121b64496a63b62b90bc269a6b717057bea478880dd1b98c7f1596ea1dccc0806b9b210af08005ddb48d979c4905c4f3a55d3f85612bf5eb159246e68172d7398d72c37badf6350c3d04f62d01dba8cde2bbf8c2d33f262a165f8686a200cb70ebe13ea3d9a9810be35c05422632d91285810da7f46826d3e5fa82597138cfe16e9328cf30527f78615161e590328481b1e5ff7a87a1d4aec250bf3fbae846f4a9fd4f5e6ef92c2c40db4145cced427894526c0a28da8a5914920d73d4bc4c9d7603b73922a0ea5fab0f7d488d16971143ae19d7267883990928a6b075afff17b7847ef2163498f018614f3bd35fda7428771beee0c4064a306f0653f70d86939f93289bab71579819e7500edba5422dcda15c97dbd163e2ad16d51cbce958914c21a1164eb9095de2cb3193391a46c8581726095decb2200b359c4314441062ed2170eab601d6faa8977d6385f6cf36fd605356a01aafdbff5d0528d8a202f7fb9115a8d84c44c4ce29a226fd8486c91be0ea97e1b9b354202bef11700bb1974bb12e6e2d900dfd2251c7d78cc454641efa3ac8473d940b2de6a64ba8ea28d58b175e1b3b77520b97ce1f8c83ec17bcfb58ffab462964d41ca786ad5c5b8c5629624fb9ca662781fa562d54f0d631920395621fc800245b9bdb06276adba5441baeee9d7f6bc925fa5e5ccb49df1d2317e02bc3056d19782385d3d8635ca428297064d1121d71e73d355dcc9f70c725ef7ecb903d07d0685baaa9a955f2c2fb13fd072cfca7f3bd7350ff38e1992f4f458692fa7779b7ac92b3a65f1e4ba61c765ec1f61048a2a47cb8fc7e5f256f78800437984aebb892173103bcf682aa4a0e18e46d30202c8267f53550efec16a7a38c1271d2bbc1bbe426469439e5090c1b40555ecbb3e490a085a9836a391fce1817d40daf23a342e2befd4ff50195715978c0726fb8708e11078c9156a8001900a56bac5fe2f73c3a3ab40c19c1b296edab05826776c835ca625951329d920f3dc103275b6d38379c0e40cc9f238dbc09243fd9cf10b37a1d360f1ebf7ce96c076eceec06c30e467f02d75cd2be1743c4a647dfc27fd01fece71b173879fb4931ebe46f04aad84bd9f64bdc364683081196c34fdb6a4fa8af39f8e9f9c1ab21117a3575c41472c4b0cc5ccd98a810b3ecfef8b3dee8c057b4ccfa7f6ebfc01209bf3f91fa19d3eeabbc37f8ee25f83170bdd35770275428c2311cedc79afbbc3067e6a7938e0e070da9ad6770508d87d16d94e70440e5b32f275f802ad33f0934444146f9bfad26c1a2805700583ef49db2aff012af8b0d716b461ad99b7561bfd3f39214404845708b4d81e0bdfe5b310586f65b31aeb597b38e827d812697be4c3073ae1384b6f158a660aa6545a07cb13485f0394bcbb32a5b1990e47db00819ddebccea2b769ec2094be0088a5bb31c1f893501493cb63e699e76c4d70b6b94b586d015b50c11ad0e55d60e219711bb7b956c8c0445ae4db568236467aca4f84758480a36d9d1a4de32cff03fe382cb1e40ffba1f6a770bff630d3eda5b85a5fa0422bddc9ab6750ef993a895ebd790d295f2f91d78762578136689e025465027deb61a2f9693f93c83ff175109efa8556a1c7034f54cd8abbf86d9948001a739f8e61d9ab442256d3961b6427c22a71a57cc3c6fa2fd2f32df477fc2e2bc140fec43ae0b7ba9d09c0890f09916b1c01056a60a7422be9ee8b988712a171ef26d0f65a5822d850b250879608f2d4917ee1684c5104649fc8c7790e27ad2f957a7cace368fed98afc282e2340a11794c67a7e2d441c886d1b69ce516bd95c1c9bfdb54d2eadcbb09dcdc5a25d81dfc31b0245517e55cd3c4194a3851968c04dabd15eae42b58d136d8f84eaeaa571e0ebd14a57312ef674e6ed0663b614d1fafca210e69190d03e4a1ff5339229ed749ab186977301453fa702767bc6e8daf95b7898058bfb971387e9570824cdf42fde304615ddbeaccb770f04d8fee00b9ff7d1223053c464bb02acedf57d0911a96b75a52b2a6090aa51ee378f7ee4705ef309e21640b5e45e02b8bd7e650412e34b572a4a9ab304f395f5e66c247f7defbe9755a683f61eda0468e1a22b7ab7f1acad3988ee50d64bee0b038ea766b51185e554a17ccbb43ef0d7b8f2ca8681187fcd78b5ca6fc84300e39fd4ae73387680ef888f972f39a5491e7497467aeef20a1ef21487a45b38fc5bcb217bc3462d2719703ff5051404893fd1cc1ff050cad7345b660ed84b2ee7fe81b6758f907aded61a4c94aaed96a6528d2c4cfebc1020820d396e7911b66e1316dd8e863df019930a422a3233486d7650a0c339e3f385365225dd3a1ed958dae09f953513e93bb922b9a155de1a688b86669d0d9033327948a59c25c3bbe5b1e5ee8a32fffc55497b085c1132f82f496f4a9aa246c7189b0b9e3318dd6558a21c3d6f2d3ef401ecc35920a8730e74a3c5f3de89b3666134a88e78ea6c76e03ac8478012250bf26f0ff89ac23d195e1a03005c64da247e5f9f0b2e122b635c4eb5b3b6d204640f0fe0ae807ab4bb0ee3f199c21262b28eba50ce0269b10a2f3834cb483b56a95805729dc660815c14f2221ff117904f4bafcc943205072a2142a619f7ab1d2688bb001af1fa98a29f3a5f7383bd0d4b39464c404f85871373fcca692e248507d24419e99bb7c285c63929a98b878d32cba2eb4396abf7a61ec75f38fd29b24b667eaf7a4c2f28e0ddf42b47fd450f85c226fe70648a746f83c4a5909a0f0ba5230f42cb067c482497574b0d6285f5f3d52c32ae963ba91d24edb07868688a9157f72dd2c205f8f6bbbe2e94f0e91ee98b083d4f476eee75c28e5b4749ff15bd5d358ac23ca39e2679d1d5840ebb62022df0c57f6ff6ecdfa6116d3dffa7e5b881b5092898bfd1245b9220da2dc83ab8c1946cff11e3b71eafac74d9a5d303d565ab94047303d7ce76ee1943fe3e6ef31a2823e4f830fac956e8bdda0309b952dbe12bdee0178e8b2d9d101dd72c91235499d0ad3c06f31576708647a11968fdb2633e627120cd1c49e1ad76388db40efad58446f94559001ac3c06cde89f18a03391b7de0ea85113215d140c1116f1cdef1582ca093673a66b88acb93b3587f1c4b68c5c3ed6fb09e5548f18c13ba9971e0944b74d4a387a19c098eacae83811a3e7c45f9d26f5a22a28bb56298a76d44860e4613c47bc90bf8a9dba225a4c86e91b15f65610453e5f7aaf161e549fd44fafe860125800d02d6897e2b0fc2e025214146d4f13257241e4b7520046cc1ef1658156931ec23855fdf5ed2773fbf0c6429a8f3855d036c718895c71c6cd9309d15f8fe2d6c82790aef3726f13794e4cffae376e49a8883c6fc1ed9bdba2528e433243d661168f0dc39d1b6e864307373a449c4e30a655df51c991a87f5ccab8f45d83846c24f9a8d6c214a21b3cb372e4aa87774690f3ea9ddced8ba72d388c493696737b8213e5573b2c3fa9686708e4dfa546f9a59e7cb27f4bc1b73238b18e78f8389b91b052f3ef154f2c573c510dba0a7c50a3b7c8dadf2b92c1560ea4267b7c206a90f1966641e224adacb71eb368010eac406afaa1e970c9a595a293ff5d355b87fa5fa446af549183de962d6d57b300b10966555b063d4f35014ef4c1481af4c1cf99148f2c05d932561af098098b102cd8c023b5a3752ccddb7efffe1dc54140958dc4f4bf06c0106a0a2ca93f221b6f585555405e3d879e82bdb9e3a342aaac4a49902feabd766540bf32bb2fe78ee5aa4bc4e476d6fc49fcf2c381b38068c221ff988d26945bb49a2e2efff7f71ba4ff241552bdf27d1cedf4073455270278ce7198a7ca74d3ec3b328b04ff19078b6ea13e3f3874accb0e11557d141405d393dd012edd99628fe42914c44d9a4bdb53e79b7dfbe520201b052a62f9d5a40bc7c68258421156817c6137006e101a024dda4a347783ad786abf12fc237540802e8cb33e8a9a2d346c1111fdb49b230bc217e67d00125828137cd6f29972cd21334204e1d6adcf8e02076ffd6e67ba27824b0088be3014d8283718a5b651884e5aca23a67550f36ea0dd0adc21a0656a7ac2f059a51483bc62624cd5bd56525d2613df4e8c12dc2943da7c77d925908f7c742bbf2fe75ca3a12fc9d6165c20dc60130f63f451b30bc313bbfe103b803109594e92c62e44004e7b3b83c0b98f2321a9872b3cdf48d55e87a15e251e9cef5f452564b977528b0d20a3de9b46cd15420b8027b4b61eb3620ae4221e82c27eb8aca81cb6c7a6fce3456f2d60b20b1636f4d7871f6065c83d0ff00095b893dd468a3f70751afacf8d1cbdd70d0dbdd70d14fde78d1cfd876fac24082e1370de0740d4c7eaf0d7f9b5d0337f9911ffe926ea28067fd6c922fe4c20edf91abff0896a012b60582370c87782efb3a1e0e92d9e230e46e1935ef5c3b19c08f1313fe89c3e3ebb1d22341a038f46e99ef83356ad3d60786781f33273207e552b099415af7cb8cf828326c32e39d53782069d4e921b43ad7e081e53b8ba79c3380edc9c5f3fb134a292cd4460aa4fac48ce909f17f1edce849b1a9cce3b48afbb1dd811e4e1adfff8fa110797e2f082474dbc48cd420d7d11596446477f7ad69601b518149018690e990ef950825b4345d5cc7d9e3977eef9d8340b031e9d0bf7fd5a8269c216a9e2aff7d53427d00665e399a3e04b02bf4a5f41b66fb1d61cc00419a73732f7d65139a0a88a7cd6d81258f460d94b0775ecd446dab711853d64e1ec90a9bf90aed4548ac27a4e7905d234e54e58b42361e130dff3f5bd09422e6b57779f3da3aed72a960d885e65412a4d78b4f9cd8722105ef22ba339d6db293e738da2bcabbc68c571f09edd2a231c158ff7ccb263c7960eb478aacb51baa26a9e4da58cb84e0337c8da197662dbbaf93cc2a68c8367804730feac252e030c6e1389b3ad84508ad704e94f6d92153df3bbf33610867fa948c3ac57fe53049939b0a624b83183b558bfcc5a747bfdbf40f6ff170173f9580c1085d4868743eaa1a8b05c20fd2a4c7d57f110540e02800575c06c7b7baf8c62a6a4c937c163d249bfccf072262f7ea7c08d03e4115fdc17c548aede7833a2bdd1426efcf645780a40927a7f2a566a5763fc3c2bf34b016381132e58b362baae69d1996003cc17eb61dd2fe7294906279d27e920eb38bf81c9b9676b52af164f9a70d3c17688ab5472250b8d08c4508acae54cb68c9a2e01e7de111acab98a1053172685e31163b9a016b2f47e96d44ad499c32d1e374e9223cfc927b770e63c73e825cf184445ade2cd7a8396d43f7c59426edf428eee4e5dd518e432de57a64deb4a39e23054985da9b011f217a979a8e80ffbaf5e85b1537166574a913a705ce4763d3763a36b02fc94db4df1a885279560cd5a1e31459fba62fc5a6f5480ad6a18fa7eb23425874c6d53bd8252c91a3f048bf47c9dbf9bfb1149fd8cc7d134e152bffd28d0984fc775d4d28e5d0ad905957a3db1b24d93529108851c39d6558f3ef395622c2cdbfdb526da4fd408cb85f371948fa5533c480117e640e024bd6fce128a5a583b6bc0fa4c0ce0807ee80deca2f38511f989fe3ee22c59b34060b6182bc3705e6ed6fbd9d45ec48f07dd25be94292564092b3850e8ae1c62acb48777a44f837c2ae5978d7708afd6e8cb823b609dfc2cb252a54c302e79707cdd90be156ff8e452fa1d5ac676e878c48571f63cd1984029a69ed152923c67a7b57bbebbecb29242bee40ea54344404315142c47f00fbf70f026a457ba483ae91a5a2020a683917d247389c5204154a198718c946ab4c37fe430198e2d6a8debb527a8c9056ddc94981d013c12da7ab1bd63c4ee7f63157e1f16e052c706751d8cbe48dc8869c37d6cc23cac7b972388e8a3eec871788338fb76c9acc21661bfee53a6b0680ae14064aa8b9d55652bb85660f227300deaab4e45a29bc45214bac274e6a6b3085f0fd6c4fe9bd2b8465f05d738db75dc8c257e08897f27e6b9fa251e2264dc2caed419bc225fecf608f080b02cf7a47c145603acc50723b4f8e9ef834478a5818a304f7c02208f505626edd87c87fa3f045c14fadf58de674d364df7bfc9acc0393ec8680aac8e3747c3638ecd1e86a4541ee59865c85c826f34c6654a94c189099bb86563626d75b7a41fd6bf51d9b734aab9b974c0e8bdd577e0bf1e9a400602e07720fa0d2cb90a2c11d1be9dd1cfeb9bb09e9ccdecc8bbd050d523737852fe3e79b43a7f20e601be78731a7688edc9cfdb1bd33870cb7fb3eee79a91a65c0b1cd3d920c3b8d4d124a4461f1c1a1357c0cb0499d7ba5a6a62a2922cf3806263c8a684594f89a80a9401bb629e3b0f56bd938711e5137fd80866167119d7990c25f8232433cf696411de15cc6246795e2aacd8dcc08f60106439775cdda05641daf71c7503dea9e4f28a4cc50f0ffb413a1689da2b751dc74d483c6eccd082d868691997a57ef9113c97362cdf214caab72bfb8bb49f5e71ea8196ebb85a7873a608b39729a1cee80a1514d64e46344d8b39db9c7b451f7ec9450de582c1e6c281c0bcd04912c7eeab4f48593d6060c6b0c97761871251f13474ee46ad9ea38e423322e0cadc22fb276e76e92cf05be641ec3904fd4f3e8dd547859f001572f124f572337b7746189f59f711d384a322298c315aeeef949853bf00836bb82f9184cb39e4dd7350e9973cc9bc2d1daad8c06dbebfb3a3799f3d26d65612704995221ae92ea45f937f6f65e37d91edf8e39c725efa64b6e73752b23d760df05453241e00b451dcf4f8ceb3d2f0474f7b0923e221269b08afb7fdb655e7eec243b3393b5157cf33c1f5f7f8fb70b37daeaf1d08c7a9b98580255100443b34cc2ccd0e02b83af2478dbc2b3500a54f6cfee3f99bbaca3203f2cd3b367e24889315c15bc0e63cf103e79d6e72acd40695da13206f1eb30d98b806086194d771ee037069e7cbf4b891e0d9ffcfc15efb6c2276c81a813bbab1bbbf1c364b12857e1f11039f48ba8b5660fc8ba9c96efd3bce92d7a25c2b0f2ebf71422573af4aa141f2c366e2be55ff171e5da9326b6c7dc0a0f410bde14b44992e2173719de9f2d32fa07da864313d456f3c712e5b6789f97a217cbd3085408349ae2981dd7ac2c13a1c012fe3d717408026fe8f3cdf70606f2d74fc1d58f5e6760412d1c9ddea06bab3e0ed50b5710465d5ecc0da1907ae36a947d49aeb2daf97ad23b0cc19073c9f59ee7b69c4568a2d9759466ea7eb8f5639bb7ae17e8a3d437ebb345f3556c07778f41fd4fc13b7f8951c4dca8b18ff47d9a16b1efe480fe84b930f76b67035c2ddb75da8cf54d61712514a74b82e694e1d263d61be4000b6d05d94938d4d9838ef1f2122257fba1e697d8c5be138322c032e385516a72f59ea2c7999b22b40cbb6107f5876b4272dc39153e80d4a1b926b1214a57f6451a8e3c765bc7b218b0101000f4d3e5e8021eecd57fbd5ce4f44d3ac9d067ca278a47c58f6bbc50cc24a2912f2eda27a5e9e48e9441df1fa1ac9d4864e45cd59f4b501e159342769b25c671f253dbab871149773ce14caa04cee2865ead40d3370f7232c7405f5c9c5834b7adcb031322d246f0d40fc98e22192bd80f62d811e73f85ac2b9722cf512d2dbdf216cfc847d67c3639c178ff1fb4fca0f443e413d6b818dbb34e9126f1588003a1f5bd8bfef42108ec7d3c8e2d146b77bca9469ce0cc8844672005617768d0c44a36f13750717b78acc030878c611c5b80c4731246c7cbb4e9867edda22c116e1794918fcb11ce2573d4def175738f86ad61450fa5632eced3e8a2886dfef6326a851fccd2766ae819cdc3c5c976aa114c5e59519f8f131bde7be99a1b58cbaf4e134c71313eb74493c4b381fb46a82df2236a682635f4bdf6377bcfc53f11981dc2d09c94e07c4fb93484a4bd1d1dbebfc082e5175a68ce9569c94ec93a58990a9b4590545cda36082c68296bcae11797a8d95ecebcb8e82f84f65905514db85760564b2c7a144c1b78dd95072b79b9c2da104d985ca2b35f774e2b9f3b806e74f67043d64604e8db41f9cccd031656ee2e21f8d48483b22ac76ad227d266314cbe76bf843c915d9f4e20477304c0e2ee522795ffc8f65c81da830ff1172ca2a6f08f9a6a7c6aac09532555364724082b8eef94fe7c9d04c9f39c47839908eec2e2c9a3c6d76bd4e82596f3b307f0dce75d17addef2cc719632eededed4f34a5d5f060cd81c08e9112677d2ef270b76213c4e2832e795cc0c57d274f16a9b7c48d205f1b619203b7c0621c22e7241d1bbec0a842826e8131b39f9e3786fa6d12a3760142d401727edb5b89cd91f1833b777ae2c044484e547341d2bb33b2043ab74c6afde3a248db4c6d87bdc1a862448aecff2b2bad400f0228d42c97eb5db5efa6a9fc6be2460ba81fcdd3669ad1e8b685c5aced90fd40678851339371635bd378936866adc7b98ee2e2bb5520e845510a1c2bf4201e0a28129379a05532a054248abbb6c92d3fbc86ad1b51050617bb45f3947f6203f791b5862fe86419f1d8ab8d563816a241604231b47dd69d284fba59431e8650179e7ece642d292489edc1a8e1d41b1e3077b26c6ffb47c03131cab3503aac764ba3c7a480e92cad0f006aa30307c70a6af6e8d6695b2a4c4f6291bac31ef6ea87ce954cf86a79d0fb62ca468e96f5e0025cc86682193b4034b8c3913870709fad36ba9a531c6baa3ef7d6086974963bc85fbed62993fb9399c302737c27537da6496acd0e09aea1da22df4a964860a014e5c47180ea17362670ea00f0abb33d8ecbedb0aa85a0b31bcf6cdfa0f1b65e589839767255fbf8fcb52b3948d0fd9c66dd75abeb41e00ab57252fedb8a00576d8ec05577a878a5e35f3c42808612d1ac5b11fab778442f6b13ebcfdd8f80eb46d3807e2a44429498becafda0fcfa37ec9e15c7a53b320f5879967c927092fb321762c68940e5b85270c1fd2f5a634c27fe6971cac90db458d58c6446b19a52d5373eedca250e2a45fcb9b4bd9168b9eae817969874e41d4566187665ef643ea8117d53bf8841a8fcb8fd208f8a319ac08220ef142c79a4a02ace2af8dc1fa062e0bf3e57ce9257f7d0e1596d80dc9b6467b897393c871f8fa040c3f237817bfc9321f8b8cc85c1989f4055d69501b7b6c844fa7345d31238e2344b42c7818745a89cbc2ba1aaa7401d9ecb7dd281dd2bcf67cf135db7511cc6d7241ae645acad8f46afdcb7c447d32921acf24c4baf1f240f709eaea8b2c8f88106a306eae4e4a55847be7c920677193672e63e1234edb0b43afb1df96d0723aa07f7f34cccf03e22c9d6278153ef09ec4b22e1873f800d6576aa2fc6f447caecfbb9006bb1e6c24b9d74e63a09c2aaeb830f0c2c20f752159222d64b67a3eb44b13fe8043797f1db5f8e3030b914a8aa1725bc8a05e205ce08cfcca998aadcf70814359054cddafe39eedd1dc03dfd1bcb6b553507fc60455ef3137d961639fe9c8b8e323f04dede35ef6c12efa460c0dc09a5cfe5e2543c3c5c3d9a203cf587d893db0978d3f060b3d9beec6089ce62e05f514742035ff6c0a234cb296b5fb49f8a359bab8e7ffa498be6019e7033315360156c464e733cdd802e4f8e48bab18078cbaad2be7093bc89033b71b910c712900258beb09c9fbecc24dbaa0a8d51d36a4683b9ba71c21d249c0981add0a4979d31615316fa863871b83031897498a7b56e74413dbf8c66c7b6883ad791ee0bb6c81f9096b1d1963b7d118fa3bc9bc49dd986b4a5a1a998bab89dcdfbd4f151be8057c193263a85d033fa8b02f4830cc89507a07447f0126da69c1aef2104098fcfb394c02107e7457b29f9c9503689080c7248964f8c5eb4dff40a865b1746e70a691608608405c3ca19643cd5b833f092ccaa9de596229bb0b3651ece554512044eb9b38477da0e1879aaef4caf6ffcabd19b749ebc7b72de042ebd24318723989905c48842a27702462ff0d80f8f0a5e526ace117c2dae4e8983ecca13f5efb5ef841e020a7da872a4d40c5903f15489be5d26e09de1d77382eaf073444880adacb7d4e478efa1d0f1103a4cc8928726120f21f46024d2620fd524dce0b254cef23ca758b44baa8c537273217c182180260b9a1d5c56f6655ae201dc38ddaa36efa0d4e89d937da0f6ee543c6347bad123e6835a28c2baa8a81f449ed6dab207596f8e07b664c6c484265620c122ec208ae4d95cd604d6798017e7660a49f9f6ae55724f70fd308d288a1ed5845bf7079b96edc1171370ea5ee00630906e05b4dbe3608cc8fb7d004ddd9101a97f1b390adce686ba99c3b404b868dd4a430e0bda9a85047663d002640e93b51a01a3bb6990a2d2d8c00c715d9c318c22370ed30539e0da28ab55dba19e59b735d502917e5150bf4e8ec9dd92bc928ed520005e0558d8b46aa69ce2e4e3b4bb0df8275125cb93340cfb8ea8766a8949aa36384fd29136c5db8f783ead93ac19a7f3bcded0ba579a04cec97a988d27599272c873804d0a5ad45641224f8ed9003e5629d86a9087fbde59c177075a4db4f4429e3b4f6264d07c8c6c23df0e63a8a7d7f1a06df3f8080046629e46afbaf6f71fab177433c5f227e844e22bc6e9a5f77df13cf15799d223c84d7eab36e1e5e762a081b99eaa96b155fd2dd2adb92426d6cd863f997c580dae35b83bffd0151278aadb928ffccecde1e82fa1bd5ea2171ef95ad4663f67ca9d8a76a618b49d3157e15046dd12b6b028abf232fc524fd57fc7e94baa8d69b2eed522acdc987c67675d64dee114fde13c4bd78a6eb7f0f07a78db088546491abdcd17dd611e92f37d4c076bf01556ba4efc40207094619504b4a18459955fda9f7d45d86a18cde7a763704cb4d37ef0d1de7cb31ce574a9cbb588e1c23c0f7eccff2e370b17e493fbbe794cbdfe2413ca90e6f669471c46568ff0832348e70dbd42ad840b7beb6fe4c3b37098412def636281d653f46648ee03083fa570785f496a1c20f001ff15fe2f7b1f2be8417c4abcd53b015c503b03306e94fbdf6153ccbb2fdedd57982a13d61a147ca0b49253037cb3eb5123e85ce0ba2d1202c4979352a496e19bcd69c24666d1ccb9e39bf95f1cf32da0e5ef65c5173e8f8ba6723db12b8b58757ea5556f46a6546c7679c45c59c382bace05771d676d6bbb35a37bc7782520f429668c6d7fcf4a60ce4cc19c637d9b81a71dc48c398a18b6af312c9f8032d40afe4431229977e152c583b0b47104fee362c761cdd5bffa3ef018eb5a99ddd0874d84dbc63e472ab143827c8376f71ccf6d64ac9b9ab7fdff4e08e4381a10841998c6145365d0d90ced34ce4dabadc2bf2d64bbb422c1184aafb29f7153f474ab9183e476d889d02a10345e8473c9991ba86425f3a7b1e3386b37b37191dfcccf91807a3fe146feed67f39b79b333f56d1dbd2b66ba4251d4d223f142626112babefd1cae82c1ce63ac169db7190e885e4d64898e039e1be0f5ba71a77fd52ebc093722852da17a84a76accc4da707976219bc10bf887278f505a9d3dd3b8b6a6895029eccd6c78d87c5a5535a855bb6ece5697421481e86696f347f935eb08a10d1f2be64fbcc119d2b4f4f52b6ce17b00a5c250b767d56a0944583966cb006fd8a5d515d8a073621462d3a0dada075385c91bdfcfbf7b6487f10e24e98fb38a7919de0b04452b67a3a90696ac5c8dbf9f09d61d0473906035180879bed4739ec9720d325041c63d58e1360982774a9af7b1f10f3e6b43946838c914cf8fd250959849919de118e98f003eae5c99fa1f70ea8f491d0297869c3bcecc16a01325c8ad25bf1ebeea29d2efa6c6dad8357bd334dedd64167eaabdaae609ec50a3b49fab4d483e2af589ad08c0e18f0a7573a8780ecba666ed99f0df0472ad8c47103b047b2004af67d2e8276344552f6a95fa5068e4a312f64a34d8440ce919c070126481b868a1a9e97620eb347176c8b1de664db10ccf86858784a6f3d1dbbc6e249136af3da919947327055d012949c82cdea8dfa2fb22bfcbc48d018d3441cd4f57ef2643d41eb098437fea58d0c70f6a217a5dac148bace970082fe88414eb7225e8d5b0a8606bc9dc378ca21bf0ed521d3ba0fe8d0a6c69e50b88bd59be664e7e81ede57c3340adea2dbda49d12a634e812ed015a6e33d3074bbfc2efe5c9e2feac8a08a200dd7fd4eeebc2caee993edc562a2c70606e54fc371a8cbec9949458bb21d16049a35ab14772b22ccd4f490b6fc787d93b4931dc2f1acf6020f44f6798d2328094d59b433425e57eb2f085c8343159a0baaa167d20dff14ee64210c69aceeff3c092d903f4dbff94a33b14d47f8a6595e67d6cfaec52e7b76258717ae9f348ea8cc0056250c72bc3feca2395b34041801c31ffc6c831513a5d9167a6201f92a0c5835b7c3a65de42a7ea04055ce11b46557f5b0c758b2d5a51994368d79038f8c248e1bffe8cae12095254f075a1a42d8d3002dda8e90743a53d8133729f24bddd85f9d3374cad95db2e4ba4b1629aaf29b309f7f5b30385c18218744fd807e2f31d87e4f6334855aecf157c172da53e718e0f1ed3f4dcc313060e76a223a93bc689ba4bbf179c48c6ba2650c8fa808986efa84b8fded5493f206ffaa1d63aee6356900135bb05eb231905fddd334b7d06a0216750c88086ec307d6e9e40c9667d6fca231e6077136ecd023a6db2916e58f9c81c51edfb936e9d0b6b018001e3db9fa4cda4e1e355376cd2f5676c1908bb9cdd14b5a2d4a7ad483eefe709f3ae5897ff038ef36e797091386a6987978a63206b8b8148e56ae31c2b46f71d6b470974b0979b910d19a4b8e974be583ac191504e8ac102a4e696c8ab11623addc043b5666313fd87110077bfefda7a46ce9f14053c70ea7c79c6336993b8054a0399ebca38ec40ae7132d3ddb8f1681b5d731856c78c270dee34f506d48b1dfedb7e31621aaf1a4128ec8e154cf58d898b153165f66e97357a1c058036e0b9f13760371a1132bff8777687eceb24eda9fdb1ee11653a3d5017bb515989c0efa03f1addb12689bb9614320c28bb10d98907f95353d357145e25dc6239ec4f38931c9da5db99f2dc6715939695d8567ce5451501ca24164b2f44075b561a8f301d2bb84b6bfa3c5e520170a1cd38c2f192b915b6199877f23c079c4156149e6fc8d55728a0d58927ef3b72b43a45e1f96e16764601fd7980e2303eceedc9a50bddda317474299889401f473dbe0158da3263242cecdd7fb207c0f0fee6ff6781e9308dcca07147607ca4566a4f9a9977fc148f3460c5a77833e48b13401603adfde93e669d20b494816b4839b19de663b884b7adcba8e43b103985d570f0c2f459632aaee41ba753563b8463fa419c7c5aff10d72b780ca0d073d2022bd24f0a59690e8a52005cc13edad7ec6860093ef42a2a8d3e4ea28ce315b4e718b195714fef922d6bd97692c90c64a239339891f5110786e943b59f4db8aed5d152485a0e2238bbf8d903f51ca642741fd942da4a1b118b49884e68ebd06c220d86212b84d35b1be5e1ee7360c1cc53a1250822cde4d915e098735c499ebe9e5dd7cb38a12d51d9e97118087c1006de1fe98297cfc298a4140409f112a142dfa45c890db7ace87fe20a6ff9059617bfb97d39593a15408d0bcad7fd65356e3ccce4a9680696e0707facb451f394e83a25019c5b75eff65ddbefa49fc867d747183fd37da30c5d53de35b9bf243c10325e6ff2dc49876984b693520c5c4abfb5af6ac4332b4decd7db66fc0e8a273fa60ddcb51a403dffdf0aa88edc11ba306654e3a70f79524ac092a5929f0630ea12cc417b22b3840ca0dd1d3e817b3d5d3b8800a88b4e3f4b331d794d2a5c54ee3adfcb233cacea740ede77b44e26215f249f0b8d38f6e3d8d12f7605e7f984927a5366793874d74506fa412c4e30b32c7256aec3acc68faa1fc378954d9f8d80256122e7e32fdf719e056c43c4a9946a3251983bb20c7f5a8f9db97783ded8c1c9e3a2bcea40d0d858e2b5a3441e41e722b33d54b91a7c1fcfa4dca4df7f88876cdc383d2ab32d86bcb2354279a5a46e6644ccafad18dc3d4de0643ca439415693bdfe387e567b7d907982efe5acb6bc4a53db0ec453c7b22239dc84d5625a99458a9356732778215cb0b13dbaa6836a143fdd9d85f4cb8716e1c02cc209371ca6c30531dfd58bff1d27c519be725b6f0f971da6c94fc7d08206abe6db3f01436e71a96bca23145c4d83d1d1a83de37238e8aadf2270610343dbaeb3ea3b06ef2dfd4077ddeb5bb82e642b3d10c72b1d61b514e11b24df4577d218c5e6fdee43fcb6f87ad6451649973dd72f483607b08facb682e3c8c64247b5c7c13c74fbf2fc52d25adc747faea79c2f13cf6191f5e773a397094cdc510281427d3b420875391e9cd712bab646e883d4f704b292173dad8f5354e6627c3a9065971ad28bd3212d184b7f9890ebd3ca71bfcae5021efa6914f15fed3d441eba1b78d211c97f763dee07578edea8ec1b6403cea4f0251548fe88e93639aac48f1a49363512cc4bbb116f33751d91dd7a923e46b5a12e56859ce10292e780de87e5f55d3c18e4f877fa12e807ced626a171ef32593d5910fb8d0da8dc6a9552622fd9fc57e49f9cef603ad8d99b54d5cced790357105ce027be123496aec38dfffa838a4b939e2475e983f2c7719a5a502fdd22d78558a4d2fafcd4fa76ef12dd95259065ddaf0c765a85692b39406512d4704f1c717a65e5d6ead9ef49be6c92d34e095cb365b58da0bc6ab2ff4f5a3eee951aa281364727a66f34a9766cef45997063c7f0f07d0a30ab813a4b82091f8e551fb9c683b821e3704dc71fd699337f43e9025f019b8903cb89a339325ea5d9db68ad9d3f71a202a9b30dc4bc106fe4759402d027ea4fa2bd9cdebdbbf8a36fc142fdedf18f92e2afe193c6ec6a02d873d12e0b471b7dd3acaf2b83fa2158f4be21fd3de9bc09cd9ca06a1697d88c78435693b0bcd3976eb8a18a854df6c8b167435250e69525322d930c3c01afae830c554193a0ece2eb8bfd70f7603c961991eab28293ef7565ef05ca2d6c61fc8c313ff22cc2692ccffb840d4a74928111e4ee22ba5ad8ea60a967c3c9be51d8be29b2b47215d8276d2038058edccb199b8bbf3f57859cc8af1b179d9597f25d30550721d8f5bb7235aad23e192833abb72cebd321026a9da00e358545905a54fa365c51a8a528b6f174eba907f5ef197180e6bdcc6517c3ef507c9c3fd0180cea88176ea004381fea08b7f525bc22fd3a8b1d74dff320b41f67be0244c19b7793d7a0b9c67b7f080726f754c79bb2bf3a07df660e9900928d1812749503a852620cda0e40ba12da519632931cf16cb072c805f0069213949772566eba807c112e4c62184398ae063c97fa9ac29a8fec08b3bac49c840c4cc48161750574619bd05a4c97d561e3a090aa0e70937d5d2576dbda5795259bc89c27d680bb3199e6134ba5981b98298b7db0166b5a8e77f4b21363e5b9320fd7c97b3bb8d3d6926da8c7c6ccdf22f98bff72426151115b9ca78a85b6db4bd2358de408a06eb22cafd15e04f9d7dddece882d1186106bbb817dc692f0b11e1237d8d9a4dd455e5e359c7b4c2c0470b69642e97e4ed517b9fdd2e5b4aeb1b73d8aa5eba9dab9c0396f523c909f684134964b561be2f61c4b52d4e9e629856b89bf6821813bed03120ea86f97248e9bb7052f065ad8a7afcbee743db1d1ba24bf7101442ef803982a8cdf0287d3087e30a67653e8ff22884e8b50ef3ce65336cc4960e164282dd5e9b5db03d29d47a01ce69c6196e2e154e55762f25284587bdfe3a02030f47b99db21c9cc1fb285f803580596c79fc3aecfb956a037985e67c061d0fecea7854af7d40d888abe143a85fa959aa9d31c479e32570353c7ee462ec7983af8c6286c24d27691515aee32e50aaa6c0b28c20aababee1909344254995898cb31cd95b082fbe54eb0a87316426ad5bf139fc20960172477ed8fd66f867ee59d5929321f88942b0bbdbc527eac19c8bafb0213e4008392797e61b1c1f4b6b01cc94d2e2ba91f79843d79495f565880f0710d22159df30414d72a09f512bd49a95ffeb2ecfbff774a4c7a5125a92586d9ca142b2e9c163b5b332b26fef941cefaf15ba96a21bf70bae889f59a662dc7d7f4fd380450a8d842e5f557ddd0c703d405dbb943b54f0dd11d794923b0d97b03424f1c3c758c88bb00e8361b7be67a78301a5ede7f8cf218277e295c1ab0b6526210ceebba3e6c572e45a074c920918c21f6f6aa4036d6c8ad7263bba7a268abc62da35551fe2d3830636279bd3fc18ae2157b8b027265c5ac7b8c296b84a100acda316b5cf8989b36b984049bf52e0b58de6a790f88102d2e0240bebf4d0b67a0a4551073925c4f199330cfcf0a96a2886380dd1cc492889004b5c8ef38c9ec58095856b116977ccc1565b3566d6f12bd2ab40c42124788b0c901995c112f3981b56659302777bf2d45c12a68330d9ebee6b47efe99e6904eaa84f94e83268bd7dbefe599ffdc4505dd353d191be5d49ca9c0deb05328d7ea00f37390bc418b1a06e6ce7aa72705ff0eed84b32b96f59cdae38a8624c62f6827bc7cf337ff0ce032212ee46e2486295cccf205ad2dab5c05cd926d9569909b10f7b3ec5c218cb2efa38c76b1f45e08f603bc17c1d361336dfc86776529dfde4468fafd7e6c39675dc773168876864eddcf951811f35f0e24d6e3ae97df47b62aec6426683ae0b9a8d296489401b1954f20e25524b84755fd1ac906bfe26925964c50b87077d054c9208e9cc52e3b0fe63f3a6ded6959d32f76aa250dbccd8b8023e1ea7fa7c47aab1438d94c937aadfea1e238c314f4f0c79338d6dbba07214a411a53d75e4198107c2c400a1484fa56aa9fbbea5c46985c32971924468a50cf2f60211d3bbc6239846dc1a94dc42e33d0318b78b5c303b052feaa0b05b4fb9ab2e13f058282b184a5424800e56edc6ee54a202c4190d7a996d7a5f611d210770b479a411fcce1a290f3b4873f19327062e5230b40d748192c3834098f060996c29f6c16b36c53c010cf9de3bb4353bf1087626cd48c2918c2d9e0b797c9868f89e08084a503fa500281b2ebb9f0596220658db6734fd8b692f7203b6550197a66e5ffb7430f148646e43b6e7a77e409ccf803c6c44265c6289efb9f857d62d852c1be1b03a0e3fb368626b74c6822de63ea1e875987321af157051d8e40baf8428eb45b27fb4e0b90a83ac4df03c438e8903970d755561f8a37e8d0925aac9e6624518d1850188d203ad92a0043de911ce8444dd91dd1c026529ab198bde7d2cbcd3c389ad66c8db583c0f87742fb620d99496cefda0134081a92fe3ae2be72dee2e4e3f80439123a7093cc32946d45fe769be10a812f20cd99e2342a5714702b46b6da02b4ad8125abbd7cd35753a4f1fdcf1f3f7f169220ccd1cfd2220b85e165aa5a3b2acce9b48a3cd109b6232ae8e9194db5ce30e65def044bb04c3f69af081bbda46c1f15b9a3c71d470595cc94cc36bfa817f7c4ef12a5197c5101365d506508683aa5630e69043183256eed21370e08b6a8591e3ada7afa3848496e81ad5e2f5627bd14fb6adf3007b5d56d3cca68578f3dfd1c3e15d889edb828b737ca9c339ae2757578d0c9e6b994c6c4379bb700aab8a9cb525a004fc027d07e1c3d28419f3dbdad4f470174c05bebf7cd1aadf6e5602d91ca1490332477fdcb702f2ab04d0188e3982b1640e0ff463b01427d84dc1128935580ec945c71b3a7ca38fc0aa1ab96273169e085a74346ed0f81f7dac24654ca389081b9af67eaf7c12a44bb472d2765739371cb66a1017296d64626964e0767fadabfc5804f8b7d990fd210b4f9e8039113e5c671bbacfc5c4266ccae6cf9766488181bc4ec3885dc46291e37781974a42918372e406e29d27e0251a36d26c0fb104ee43ad0eeed0c61e4fb4a030b4f7ef2112a7e43c96731de9f98f85cd6d40cafc6924db7d22e44ce61348a42ed8e3f20babd2729f55fcb2586a5ac3b669b17856c6a74856dd145bfa4e4ef7fd9442aff3ecf0a851903e2aeab116a417c28f58ff88489e1d4a51b88815aa4cbf20fea95196a3e95c75817a4d997a10471a3d75e7d16b78eba3b648acad96130830ea45693b7504f1639f23b001d9a5b937dc3643008784f7421bf060dd9f8323d63373d8a5fb243cf8caee062eddfa13626f21b52a841cce5ebf56bb9a0c508656287be9fb620ef8ad66633d004af8901bde2b6242d272e78df37f2edf0feb27087a6a3c4c815f95f62bab5a5e7aae02d6b2731057b3e3b23dc448cfe967ecc6b09d8430ed58a1ede5204f2c8bff5d978bcd3344242b020ef03fe92cc488ed11ce218cc9c9dd2ad20a24052f518eee5d318c6098d917cd877f0441689da50145a4c125019e383782cc95f8973118f682fe69511a023511ec6e0ef7b7f68402258d6a1d228cdba51741b7874f47f7940e0e18f9d70c7b5a110d7e22c94dcf9b3cea42c1228567d77534d52216d836340332440b84ecfd353601d934631245684540fa25c1db16f1f6867e60b76428e07a82d2c2b44c1b3e0b29a696dd0e724f246fc89f7107bf612ea22fc2f2215f1aae705f7781117a791da01e1370f73c311c471569dac9b679e6e627f2774b3b87fa06ee0fc1a911f2d200ed4a52272a30f3b799e824dbc37934e87375edd9d3cf767b5aeefbfe2ed3ff4f51b166a1864354e149703b72475ef42e06294bb158014a5e44769547e9a739dadb384af77c9e8392cf3d8d387b6d36bb972f5d8edd39b988b32f060f1e67d046e3873a9f9806147d6949b3f94389c75ec5e1e66ea0af26e62d485b1c5c0ece01f05869a49fcf77a2d5b58587ab4c10468a98009ccabdc299876ac665143f29bff6682fca3525e0740e9a88b6bfc5bc6afa6af2b31e5810a8978490eccc9f785c80126c7598e88a11f38ca07b4c6b10e84c69aa93af39ad7e3c2b0233255688db2ed7af128ceab56e0c7d33e7ac31af7551b0d346402faef1975ebe3c6ab2dd1890e9493d4f1cb5264ee4fe818e23e89d42aa39bbeace09a3649b80fd24d90d8807280b079d5f093e4d8ca0c34fb27cbe65ea79b9e6a8a45bb6dac7fb0dd17ca91b2dff94c0bff8c6d8d40bb9cce874154c90a152da3dc59cd33e9d0841c9ddff5a87223db1b027e1aeb39e019f3929384e504fef367bc285699a6624aa29f82469e907dd721fda6e2a2a806e2b24309d2e0ed140de39a83d5b7cd05af306005ba520309a0901444a4e1781475af15f954fcf2d238896e403ac7201f4fafdb8f616f1b16a1ca6c64560e080b6c7f02d4caa586a49894a7988773bf63c8934876a906b56b71411da782e8eba022bcadbb53a0f0b7644236216c4b93874a84370a40c6aa738a3573f0719140ca35e47aa8e444e4501b7ae954c9c40ea63a8f5e14635682d0ff118f2582e2b31986c72afaf0bca1e8dd173e92b45c0c5dc471be4bd154ccb8250ce89627039ae413a21a594edceb183650984dfd9e970986b8d1c28a53c765d89224b1d588160b8e8870dad5510e73042382127cacc95a3570cf499e85369e1849890c8986fff77ab413e4fbc7b22da6f4a5aef2dcea8875efeecc55a40ab2ab8bb1a990b4a962eefbbc1f261c5fcc9e395144dfde2786b5c4643ac206741f8874a2acea3bd27ea9c22d78044c61ab87a676cdfb6d072df756ebdea73e08aeb6cd93485461111017aa30ce6e1d93116a5438a4aef2b71283f4f38374fdb2e7498b6f55924b8939cfde310a10b81dd9496d8f1775554acc16b87a5c00513f2c3b04ab24ae645c0dd1d20c026fc4b8ff4cd556ef629567b42a6780667339bd28d57fe6a74a3eb1183b1fa6af9111f6a1f6a3aad6fe091307d584fe9211305dbe2bb1b2741947c15a9daf9b1a5a81ac54a541d0f43b76f49980625d718971bb9fe847f4326fe360496ba4e25ee9841ef1513dc11c160af03513f0ec067626a4ec4ed189169ef3c8a585f8f3c71d7b5951ed2e096e8bb59b0d3a1e986b404b53431d80fa7261095163967ea5c34298e11f11e9d00dbe15548c5925a991079ab5aff5e17132a8c813a65d51050d7b52f67e08c6e14245c77d44ea66c3502d547c42e4b74751554f5a12227befc95c97d5a55c31f66e020f4ecc58a0ac98325f80411e98fe370b672ff789f7e87edb52c3f7a97c93f2ac9d68d509e40878291a54f593b8be840685c98629652f98e8b958bd225e890f4ec510c7a5db0f74ce38351c9257c50421e9c58f0ee422b9752c85169668ce958b518cc3fdc91f0c1460317ff0f630a1831792c2983d919b3680522b960298964d81c766ef980ca9240334b9381fca590dd7952f7494c95256331b2bef410ba606a96b3a609de2aac6f9b91a433eac24639459c2c23c6e3dcfc2bd90ac95cda7a327115089505d701cbb22eca446780e1d3668ef1f7be7bb0b2defa7e6de2f52043e7991cc74d3241cab81b02056b84c96dc22afc5e065bb497eb7f0d9608656fbba07c90d068302b582ceefdcea41fa97cf4bf9ae2127a4047b3f2b7e5611ae07fd3cbaf64f0dccf92248e042c130004775409edd40606c47bb1377c7bb8783e02b0cedbde00e7d8a4a288131bb2d3b23533511d6928769778c0d81fe9d0eb57bc0df2fe6b88ce9ea322061a084925d0483e916e1f38bb5c7afe1408aea6e86c0ddd946fc97457eb92978e6eb1a048a0ce0acba8258117258b76c6dfa80a4e0a9a7f55dced9a730f217ff546971e2ecacfba5fb2f2831eb86c122da4a7d389ad6ab021d3e42c8a8a434f5236ca517ce8dd084e6dea5a14c1eaf1060a92c322f1711ac3c1a91dbfa55921e076a6f27f0baef7c932911d4913ce860a95fa2e50e6c56e7e2a968d52b045fec9b57dd7656f554f55dadaa58eb3dab4e2b2d688ce1e85983432030688b7ad399df53c990f03ccf9a3131008358f22051c2d66cb1f796b04706e593c80ca91320a289e1685a16fd31c32256ec77465bf7b858ec8034cbb552294744facb2202cb888d224641a6d026843c100febd657acf1c455c3efd7662c7704c7a1f6a358f2abb4d23fce15e1b278284e34414b6678722c20b310b8ee733f9f6d99f1fcdc683fbf6674f787907729cc9e6bee4c1a876e1b586630de150653f87b4bcc0edbf72dbce0a8ba36de1fb3b39506f5edb7c5bb2481b567e1607cb8159c7d0baf2af6def9b22926b89bce8c6abf39efb8b5d7ca56d032890716e302121257c7265f3a7b2c8a9f1651db151949cdb0cfb6b01200c42e7d317438d0e1b8118bfa8565115e41db03abb8088d72347d9ead785ad989cffdd9ba00ba7675a27bd412fdd8d19c89d3657369e9bb10595cf017055843ae98f0ab2f303664e031e833eb9d04038b9566372b85318ee773da87b820ff3af85effe5e58850604a21522e6080b2ba6287e0df4e1d7b96b2f005f63615e68f3ee1e6798fcc260ae163500c73fcfb0d177db6d80392fb270e3f32e71586e2ef8d1c5022f4b9d7d779c1c7f9db0c71967c9cd8e7202e2f25bf869f00554cda1fdc077e0f832ef6d43343d37a9e1b425ceafdad85b5380c8eb6f6abd1f56d3cf075d43c644832e4a6cd0c5eb485612d98f0aa2400a85e796f42c190c5a4df8e5b6f61d91ba1efae9a2808799a0b2a7402c9c81eb0bea785499f5600e4f6e2b8bbfdbde58bbf42a210391838f959e5665632638e7153bec0352bc6c8f3dd3f0f16b0f8549a20f6171a9b246152d7db666bc17c4cd0ffcb3f2ae1844d5b75f67e18274f7f6b5cfc5e6a8cf21db00ee7255aff9670a5f20f1be1e31497f8ddbdcee3f5190a6d0e277fb1ed9ac0bab212da9bf55b4c01b7d4b1137b0365bef9df63004da3bcd1eee2557b6f2845ad51ee4698e15676600efdc89251870cdc3402bd71c55b4dba4efe21a1bbf0e9a0d52da32c2bd0cb58e49d960114b6e8be9cfac5ea2501fb40217158c8104b07319ac6fdf3371b3948d9a30f0073366765808dd39615f977377221a1075282a5ce8ccac11f89993d9a43df26044af4b61dcadb8b19f93eabd43c30c09d986f6bc621737a80ac6bae49942fc54a09adc7e5d827719d3f7f65dcf8413ba0f8fd68ea989140111dc4b7c059e0aaff59ce21f422b778f7322bb186cda9549f683fc814fbabfaa699b2dd0133a34907a10ff48c272841628a153d8970582deb2cf794284535f99effaab5d78e581199886c3544d84b19f8194f4046ef6543cca61e88275f99965cf01c71285e58b7c5cc4e13ca29db3466e942e97689849497121f06cb27d57ebcbd259c3398436f4080568c96d2a2135cdc8b45dac1d0f7e4e944b0e02cac262d1fdb7a17b53a087017833dcb224bb254ebb5acbec479d0c5ace0645097746d9a31a23a2d4e7742000b75472226a00518a2212875949b6259e7994809cab31bac453fa40cba4dab6a72ea26d0f3b7c370636d5228ddfe065502214aff7c9ef538061d029c30822be1847709d7f5ed0457a3c17f5a2d51151ea57bcf0d433b08ff605645fed6ca3f8ef8497d16ac51fe3a248b7c9eb92bac8f1fdb4ab382a4d8730e5d5557113126608cb7224f31f0738aaffcd6c87f1cf191fa2c48e836287b5019ca6aab75bdecdb342dab24a6e57d228311f883536691c8d01bd412a1d8102d1ac486a8b7610c2628a721bde4e2aa8898f3442cda349b3efc8357d6d5cf16790241992684cd95c845f86021334690752ad527de4620b84724e6979564595945d5898a76ad316da3df4e8cc1d3c6784098ccc09bc8f8464d3f6e9888251d3ff01493d6e607002936c256db30984042b8e2921d47496e45917373dc1eef8c42ebb16fad88fd84f3042912d60e37e90c383e80ce56d7cc0838a6f50b6271e76117303e6a84dab142acd83a69fba138377c65668f42d7dd59ae5b8e519c04f7f99d21c49d425d35828b72780408c01f98466f0e1d161159f1b51e4907529f9504217ed6b4d09795f7d9bf0715a049c847eb4c6e6cf977ec31ffa6973ec3d9ba54fcddd90f9b19933b9b9b1b41a060469dd8360b23046d9be5ffdf14e45ff78cc17bdc987b54519e92c5a0b1a074de5cdb2e0321e405adea03f99f60c67b51859b1a21e8832cb0d551d2e5495670bad4203fea45b34a0aa6d87b68c18270b511c4062a84e474338357443bbd9a91337238519fbf0908af928f0728549f4eaea303c0ac7b362957b0855c9442d6bc057cbfd8ac38030e6149ab8f22204199288e2321ac78f0e9bbb550e0ac71ed37edda957462b19ae591e12d1c766defdc33b870296ff116b145cf71527378d544c48e29c360a73f241fb3eaf205333893b65cac113d1b8141e129933f4c7f889d888ea2f342703aa7ad8588cf32aef0c2d1b148e0c36571eb3729981d2e4d136e22186963edfa50d46494cd055c37fbbbe292950f05a0b3aa6eef5816e0be2cb98247fa9089cb6017a202abe7d11f5c4d7308f521254b35024b83903491e277d0d976f6b5956701494b6df7fe056a1ad75851db37d672028c1c7ea429c2ad956fc4621debe94b5ab0c785d902766de7be566e6f6cb362c1daf9345eabd363fa4275038f1032c6acacad41f18cc7d65eb290f1664057777f80c8aa6ce4bf36d9d76feb62cb276b738cf0f5e6b550610f4fe99ceed2db70dcc23a744f413cff24bf9af71c4d2d8b38dc0d1bead76bf760fce7ce477da14f80539533196ce860556a0b1265355eb7e73b1200966f950f399130d8d828b9d5e06378ef6317d1ad09c00b342c1e02f45a89e77c7fb7bd384820e510a0bd24d50b4db1705d6e4b239f4d358153595a017082c1e218245069b3b6f534eb025c1b1bf188fd0d95e04613ebc6dd62cd37697735e371e19ff225fc0e0661087fceb26f534a1fdab6b07e1bbd58835810d09b649263e8e821a37bff9729e5b7ef79936a7aee85539994f808d298bba2149aba8c0237d002dc95e071af9b383b93d971ceecd3d9ba0499e053f4317505402ff09fecca2dc03195304880f0fd61cd2f1b9594054d9ca4ed4c2974e83b552599fcb3dfa805f0edb3de12ef9906f23fdb4a53e9e1c4c9518c4c5414edc592a505e609f849e1647f386d7b30c63b6fed9edd2c7c204939e4f680c8aa5f64297b4d2c23bb7663878abb8713fb1b49ca71b8a47598ec6c35030456bf7c22a846c1accc1aa6c408cdd8ebdef70a5a5fe2933b21f6a93a8523e3abf1a61dc22842ca1269be6735175ee884bf04e17b20e60c73b5ec1530760399154449a636d086dece0c65685c9a3fc9794d8db92caeda5c6c359e8281baefae5a6d123b9cdac1ca4e6c6e96cc61db90906fed0bc9704ba17459a460e10a276c5de9e617c51042ad43660245f13912c40d435fa598a2bb1ab82addab5fa7283e560b3784f70f385cc15bd1bf5b947f7ce15f8aa86f765072bf3fc0165304eff7f86786da3690354c164b298c1c091dbdc05243220bcf4ad098830c954ac7a1e0bea0fcaefb6d6b5c1a1b7b1e21987dbf545058c595604dde0fc1b09fc2d6c63801c14fe88bbfcf14ea420121bc8f69a1e02a40b404cbcfbd33868c69807077dc90c0a48ca078ee39c392f94f048094ffe70063fd5556559eb49d4bb9c170eaff42a3089bde4d7f040781fe2d6f71225a44f8253c738d72e3e76f01177b8a887c8685c4ab8931199261488ba0cc4e284c35a0742c3eab4e132245cccbdbbbf5d83043a5141a164b57bf41ea8c2167e4274237188f390f49c587a842eca5df08d2333ca2896789259216929b65abc792eeff6f5d132c1a02bbbd4b9aa7522e90b1a386c9545c22523221281bd5401fd2bb4ef89c9a57761abc4c81b728c805e93647c650eced8c24670243c17ae97ca6308859a51f28dcdc6a7d6fcf91e8999695d8e9e556b24438d1d229a66ae489c2702850013b49a0728b0f04ee1e973f463487a2016b0f8dade9943f592920350ab2dd345e6e6363ee2d74ddc6a6ff5be5da115da10a11418a0fdaf507091b7a97abfc2fad84125ee284de9d0838c9ba48f5bd5e6260fad6675de0ebdfad0fad0afd4087f422c096711afc0e3ffabe6e146ca0b7811b890f74c038b017be64dcdf1d53994bbbaf54942d736e48aaa8a2cc71135107f088ca0e384bbc4e564474b9d5340c2664573a3a003485c63017ebbe4b267cc2372800f3be097ca5e7b31873f14b30e8256556443551647f703e7ecea0e18762dd675f66a522b6889f3f0d33d9c9344eb943a52436348e5f630500d78fc8e6173fc8df5ea6f23233cf13759f7d11a83628b7da969a3f67e1be8e9ce199fc689d006a7eb6479c1b3e82c4982823a3be097c25598b6098ffc85eda23efa999c0b184e84163999f64f7865feccadebd114bc97203ea18a1821a1e611f4128a5832208f5201b46f28df9311641e709ac41da795a5d8206575fa3f75e6a714e2670b7ae3dad61373ec5057f2c2f03ef4229178daef921508b9f3449e6a9324c4e3d536034c945cccdb76d2ccac72a561bf5dea13fbd9331ecbe11066722f953d60fb49616b68aa5a612d577d6f96e1cef2459e4205e2e1e38210508e679683281b46f124f7e1e6111a507a9546a387f6cac08240c935eab5ab289771049a9513d4ecfdc55f96d1ee454d27f45f689b50baad0fd6cfd25a047e4f2496fca8398831890dd200962efdfc535cf5421062912ef5ff9e3fbcfc7d1420f40fec4cec0d862375aec17fc6a8a5e5f24682007addfdc29c8995e635e4811da1cad917eddd70084ba915f70d8e70f7877dd1f787f0137a6eef21b503502d7996a9ba215d2fb66c290e6e1061ff4ad7dd28a320f75c62efe54bc25b4200ea74611d85d45879eee63a2ddd3c92607b1956d637ce7bb5564ad01252bc3dd0c2d9ef49fdeebb8ddb0e37834f9852732b08619f588bb7d3d6296c22708c1e845205630a45a620f5c6a3903a7b50feac2baa2083f488dc99adf91383530b1ee7d6ad34d1b63ab1b53f2103918d49525488dcf2effbe5a9aebdf584356c43238cfa805527d6d812bc2d73c73c0d964ccabef7ec7a209ad371b7f503e5011a08fa7ae68bdb9b4d3b395ea7919d95dd097f59ebd3c37bb449a8eda37512ebe99bf4ae14ee19da7ca66a94cefb6e022d78f9a4e483fd38ecacdf4c97661dee3abb2593324b769f9bd737784074446538c5531f840e33a146199ffa74fab22cd7c840850b8e0f5863efc184a1f2156d1e7821227c16b8557ec02d156a798a1c1db0f03b037958a2600dae7bc11c72226abdf749a366604c4e0d4caa7c6e1cd3a775b67e78e873976a3bfb8f9c40fef1450a34607667da8edca295cceb656e2c45a648b681713298e8f2edc79f811eed9a4f7c412ebf8069c0a5adb5c33866848b627f7112e425e2fa40f3186d87d8ee2652e124188bcde87440d669d3102fd860522a0c757feb5095f13e3dd57101c705c6bb44712ea3d29ff06c9c3d8f116e1fff9c37caa5fd9e7bfe048e85a03fe0bbe9b336cb44c5ac344aa6f4912591217304cf268453ea8f8370a789bcc106216e8f2593f358853dc00dfe7468a9d5e3c8334c703e69e49e35b223940e3d8b9f3cc738f267d23603c18b39f9193f2f70664dfde4cc7ea001a5d7d04241da32e3a2ec353d5b485b3320c763264e15b88f8fd50d79e254b274021ce21532aaa7c1ff9a2edaa7cf50112407fd22088af0a94f624404074f6d51b06b176b1426f6f2229e710cd8de66cdee5cbb08c53be3d759531b40e60930e603a9f1a4d4bb54cf308d64865d8a01f816b245d2c43af11bdd0054a4dd3347d1e22e115416298cc281f323ce2c79eff401dc789310508dab76a43a833948973d40b540a7a7f81cd6de5b989171663e24567cd1477173b2dfc0f09fea11897d9278761f6f5eb9f1e9c84ac2be016f4dcfac3aa312626be454547b7896dd1b353ba1025f8eafc4cfb376024fcbe34a9b2275288f9de4e79f1dc62d935464bf41b4578be02af255a3801452edb4b4e1bed4c64de3b434168b1ae6bbcb18c0e26e933c3cc6e7eb23791c1ddc23ad4ee5042846c7cbfc0a451f2d16fafe886dae7c7b76570ffcb6af19fb05b7b11f1550a31bb1de9c00566a6d7b909f31642f64005505b1dcac936d7a59880203b78e69b5225e8bbc862d18ffb88792be44352c78d708b78dd4b9dc32e0a0a332e425e2ebebbb1f56d5bffdd566fb5f55dc65698ef1805d6f0514830297551e7506568f7f0c90fa9f9fec174793b7b440224de931c5263c7d00a16ee3e168330c993b471c943a04ef1e9cd896f1da30e2428ecdd6b298f85bccc2463bbdaadc882e2b6c00d82d8b33b33571affa56a6e16371f92cf34dcd7eb459258d573a028739e18ca6de62175e3a0eda061b7b610bacd9ea977d88f061dbc4a9ca450f88c6e8ac5289b9cc3895eabca906e0f6e1d27988d33acaf4955c3978802e3c6565c1ec782b50346b400af7f50ea4b7bf72993674513090764088da3b06917fc93194c6645125d14e4b821f446b07d47d2d1ad5d096cb73d3c87781a9caae142c4cc7145fc7b86435190ba0937df9e16b5af3534f354803083fdfdf1f9631f74d90f9697a4348f10daa72775014320bcb16a76c2c47c4fc46c8dd9cdcec3a10648c124d65a143df72cc02b5114a4b47def0c8d92eb2766b0a2b3ee10f5d348cb4895206c03162e3df39172bf4d06549758081e3dd14fc60b62c3a980914176bae0424f30ba3125d8f9b33bc40429fc006a991c61e907f26689085c9d151d2536430599d17012ecb42de15212524243416c40e695f880a84ebf3479efec03eba0e1b20fb60d1c2b1282895027e67af9bacbc3bda5af8a0cee8d05b902d2f26eaa4240ffdb262bf32c4d3597284146a14067cda21eaf2e6616018161d525a7bc8141069a59debe29a721a93d8380f7869c2fb6aa999e63c3dea83c67ed7c610d7f6560584aff2b083854cf68cea37c6f9a20fbfe053c3a5f38cd5902c35896656dbcd453f4db24a670aea5c34948bafb8642e39bc3ddd8cec20947eacc07bb6817d96a25a31f0d21cbcb4a9f99eeac7fd7284300d2bcf8addcf44f4ae6b54f2c8b3574e09537a5aef0a85ffe6ed001462cbffd83fd14467a21d528e4a749d6aeef6991072a2b7d91bafd0e9fa5ef817843accfde33015ef7409bced8ff5a1a3525d8f95c7843478824479d9ccf5be48428f95c23833cb78fcc947ea01efd0664c5c7f60e72a1be27e50e2c7a0808898163c09fd2732b24bfddd6ff1f8231731406f2469245cda04f6b9d39bc53358b6c17f7ba88829bb7560dfbd2d5168c162d5f5a3adea0e83968307cbfc59a2c79d6aff3387c879794761220a128fc7d4801c864e8be80e4b0afc1d93e23ffc4968a3f992bffd5ee26bb543abd976e8122dd20a5652e0865f4380ef19b19b40ea8dc6382b8eb8e736365786a3e3a2fa707e649daa03418aef1bf40f6cc85130e369dc6665d092e0df56e4dca00b13c2052419157aefecaca58e04ec208b33ed2ce6d9253f508c784e9d52c98c0c82643bfac85a57dee5a4310499aa1e72e6a4c3813975f5ce35459e197215b3e9c6c5790d0bb253962f19d306ae2be41fceafb342f1cf6bae1176e0773d9d85d01b6673361c7cb755ca1c18ddec44b75b25bc22ef21f7ad05f9f47833925e69745c6e36c6cefba9db27864231ea8be7fc51bc17b692022d2c9851d7dc8420fa69ea272ae2af31c581856ae02600d20afd68a8bcc271d4cf8745a3cce38230f2ea60b0cebc020227ca77f52b89b90078e4c8c888cc65ed4aff2d62f483415e0d6780bc0b2172845616188e2ea9516997f3a2fea8d1faa2dce4cbc4d9c753ffe2102654e3f0c54b80758034ad4efd0880b822ab30bdd63e53c3d9aa1f46ae5534bd4fd9840eb7874a0b33ae1c39c100f617007c46cbbd49b308e588bed3b12e4f40c65c25cb5c63cbf9678759514bad580b9888eef6545e406399f9f121315e93da6cf88e9c30702c9b67188000b4b8a868a6122dd67831125fa77c2d43168945e525448da698d5e31ca12d7ca69e88a2e204339e3c491a201d508ba772564eb77a763c731380970a83be293a5fe0c966fa4e9cc4d4e49b67319b65b0e6a41ab97ca167bcb6b95c502b9ae37c0e1e68b0d42ef3ee7c4323c9e425874e38cdec992a72ef4d894d49a72b620ef5a172cf4c743b215d387e85e3899ce7d09b5e5955ec4bd84286fe6f5523a1a97ff34a09b623fda37e332ffc682a8b73a37973513bd8a7bf9489e4d7ad39545a2eea0bf5b29e5a99b5bc1754e6e7eb121f4dae7e2b466465f61efb65e46a602dc46050e3cc4200d55301e554d07bf5130b403a4c035c730de981ad8d70ce662cf34382218fb1f8833808d6fe38456b5f833fb8ab2e001422b9df32897e68b7cf030a339fe641eb13fa0231751d34a1d6e232da4c9bdf7de7b4b29539201f50c5f0d740d31865ee93c278f4798d9135be44bf64ebbf04bb2745cb021387db82717a6cfc0c7b7afbc883e28237cf0e8f1a70f9fc718ddf680139d7bf090dd416797299e9c8a0ee5a9d4152216a316d6a909e92bdd121eb013d34a7642d9b414f0f3669e0e4abe69308747a73874305e696fa66ac6c82b3cdccf5bb058a18252917242393119f2319594487624aa5ec76d5a86d1a859fb72a5b92118e0248321eebe1bdb0338f5003a52affb3aef629dd362de7d40a2f3f53e9e3a15efe6a1746ab227adc1e9bcc3ba9cd825bb0c167f09fa38e6cf2844839ebc610c971f1bbabc9ddd4d6f941098aaf8a3f39eb226c026861a1d22f31184e854e822440c2b839e6f377937f2ba2cd898793c595e4286bbe836da6aa3b3e661f439448c21baae1b42888f31840bcf8a009b8f1ebabc0cf5ed938917459ddfa553adc948676fabec1de77195918e7d3f3cef3c76ad53e1ad619f6e837d0696294b1b7ca717b945d7475301b386e4db3d5396937952ce39e79c7366998c3c6bc8c4b36b1ae6d9e98509c9628491642fccb34e61585d2162316a619df4956e090fdac9b462d2c3890f9bb3fca1230ce74c5211613a955645ce327e75ab62bb886055dc3897da233ff8d0c30a0ff7f3162c56a8a054a49c38070c2827dfb39b4a4adc28b6785f8c2d5f6b8c0446c2ce04cbcbaf065bd503680f4f1abfa4879a100db6671913cee1c086ecb4d260c7a4b39c2ca5bc4c8cb0d06dce79a744fb4c7c30b6b047957e899d739ddbc4445f59d95456565454d86d835c143673cce78d0dd660b7b372a7bb012247917562641e3b62c461e6bad3a9185d5e1f31fabc5c5775270a36ac2b8ede83d69dbaaa3bb2ee3408f60c6f781f9d395e9c9dbaaa3b75e5dcc78464e1f8d59dbaaa2b7eafae3a257d32f181d934e8f1291f9d208515c7bdb6e78bb2c11e9d2fca4638ffe67cf7f8deeabc34fab1cbabd8d2de714ed8906331c1324aaa77c2561cd4555d45981b4418f657b6ca56ab08f3ea6e1053350a925557dc8b7b71afbae25e75c5a2b7ae58752559ac5b5930b075255fa25015527d629c734eee25aa5526722f2333dd7b591d624b7bf66218917371463821ae0817c401bde81065306353b648094ef2281ba39f1f33568489f2858b424c6937e06ef6921eba97adb41761b6aa9ae659db9deed556b1a5aeb2d7b7cbc8dc8b53459b2016ebc56a0105b986220c3b61c3baa2defe812823d221b6b4c78fab03c3a03adfde834783dd8e6f9e5dce7787d3200ead6543c97aa18ce0dc26a693403248ba220c735fe74770deb97775a0d8c1ce75785ebdba4d8cc7e0bb0403628ce8eaa8d786c6a0313166e4287624244bbb4dcc120c8831465c1d35ae4d8ce7d56d624835b09c8b9cbb28236e4a9c73d4119d7bdeb9074403ecd1630c8a5e236e445e8da85707dbc48491f52ace49aa122f79ac46945cd411252ff1d2ad3925e798d2cd70244bdbc4749f4d0cf7a18e2039e724ee75b39c2ac3281b432ad5b78f6a87e5eaaa43a21c918e6825da11f1887a443e2296ce6835628d76da473cf5d512b95ab202755df5e4e08c542fd1d0bb7c4145f73a957c41c58b5a00e7247f40472239e7b1bdaeba2f0392a59905368caeda4372aeae240bbd95873dcc70805a9cce73dc8adbe178b81ecea72f27c486190ef65cb957122cfb74b9865e1b121577c3e1482e27c2f03f67051bdafce65e95d932ce0a1673ea5c95a1f1a262955922f3cd638dcedc902346d4557571adcbb11aa43994b5f56c3ef205f5801ef912592da0a008c33a3c17010938f72eea013a38f72ecdaa11dca53d9205088fc06e381bce96b3e96cab6d8707e8db81825c43af4da5ed683b3c5a8f0fabd5b261f6ca5e9a8afb6c62341c2d47d3d156ab08d3dfce04cb30a9be1d041186d218638c31c618638c31c618638c31c618638c31724e2d77690ef5afab1df96213d35e79e4cb8c69af3dd5475616e5912c994e6c692a5879431a24599285739a437340c9e25e92255997d5d515d755835d7dd49d9079381f36fe1c81ed977ce1766e388a8186637374be454375158ec450773a1572af475257ac6faf3eea13dfded595e8468423528d74442ef9c279fb2806f185d3110dc9178e350ac28807e1e806cf4075c5b1ea4ab2ea8abb1837e4ae201bd21cd637cd61c997d3897578b2c735d823940e45c9e2cf7773bd3ee45e9e4fb8b95edf2f2fef742ae47657a742ded98c5c7e6214a435015e2bacbac8e30af3f40006d0dec59e18b9a753ccd320f73077d77533a412d9671f7eec32fae48b84cf90646018d1979089de017ee9ccd3c3197643ec6faca24a84c9bc7d4584893ed692846812fdc23c92a5a323115dca441e538a7b9640a2bac8d95f60431b359775666673e7fa803a72d1a72300433122e7e9bc13d920221ef922ade411499e0675701a7862446ea583f6242222fb2ccbb62a834929e59cd29b1e57c31c1f5f0ce8181ef6d1206b18cf3ad37d8c6113387f835f1f79d5a0f4d1600c3b48ef38f374904e4def2031d8f1ed2615ae0a373f77fa4506699696425474902ad8b0837cf38aa783f0aa83ac7c68d2a7eb9110cffa466cce354ccbaea42cd80d6f3c45e286c9877846cdc259dc172d5f74dc0b84e0c142cfe3bb8e29a594f26532503a553e92c71a14345f7c6a77523a9d52ea4c0694cb8f447215e72024980c2cd429151e2a64d8b68db6f8dca9d3ef078bcd7be1d2491a44838e3ca541434f699091a734885e166a90b2d00cbb3ba9cb18281ee30b0b0f4f4e491efbc58818724621d1dd5c858a3bdd08152a44aec2eb4db9a18acd51fc7471c84f71df5c6a3e3fe5d69cb817def06291972e43fa52b4694e9f6e9b26f4a89169fa89d34f03a6afe1fcc4bbe99dbe4ec5f703e77e1f0bffc142c48016ee3eab4cd7823af54edf74944fe42cbe8fa24c5f400b779fd194fbf1790b15d76b16ce698779dd899f664e9cfbc1c2bf8ec5e7551a27ceb570915471eaf94975cf915051f128f4339a0a96bf7aa5995e36fae6536b9d2da9bac94d7e22553845711557397194a7789c2e5d569fd34f43c4f9c96dbb2804d8fcd43a60f35d78e3a587375e73cd372f4999a3c57745683e39378576bb28ee22c0e6bb4bdab19af4e9de8973273e2f290776ce79a269b78813e76ecdc9e70d9366fa937bbe22a5fa3c917cde109592424271118a8b5044f4134d91530d45e424915392a852aa427455384985537ae29344f239dd844e6ae254b0289ad75cde9373b571e2a68bb2515d7a757943ee4fbce6c44d5a75d3c989cfea26ef621227a6e77eb32fa54cf1cd316781e2254ff94214ef34cde4a63bb52b4d2ffbe517a2d088270f4d7f3af11aa2dc1ba63fb926f7acc9f49e97bef0c67bee55199235551b2631be211aec548843c716a38a64c7b9ac321cc71ec7bd7fd643b0e89716eeb5901e39faa25371e3ae3635bb6d54a5c1934af3a00327561f9ff0118a1770e19985c7958c999951cee203d2044e1231dc350f6344977827e04220f1c36e28e72fc68d4b8c1ec0741122460c19c9c717d8506be12cbcc5d51180a19816cee286f1a23e95ef84dd53c721b7f86264e1fbc37f1a6c6ff1c518f6f1163ca3864b0c165f8c2c3e46683df8d1a70872f82ebad8e86384a08f3e46e069f9e8538428bc0b10f1c5a547e70750980111b07024a65f484ae994529f224031e594d1db6bc4174f691dc39e444c9d383b12f188983a399b382c3d939ee31cbe3d14a2c5f6f0acad0845a3e72162cae4ec3362cac4d90f105329ce6e125f9080e1e74a9cbd469812ea9a1a5489a7d349c53b33a81ee5da16745ac535a79546acdb666795d17c7e359aa35ce36a43739477dab7c239f0d3aed8bed07bbeb14115540c952f74d93ca262f439513d1fe2c8b6e89bf3177dfb3808c3e0580486c1beb9a644f6996f5f76f288e22abe1377d15c5c80a6c9354ff9e2db2dfb4cf3abd9baed9b3498b39b38e457226a70b0a78f7d3cc1e36353121108c3b718be45950c527c7bc73a6d81c8e213f9c60a7788c3b7afe11b8919d89079a2d04fdeb6cd67e26f6ef39109d28e85e20556f868f3fce1909f4d7abd067fb078d162e2b3b8ec233b15ba088104d0b727d1712fb0217712d10789213674892a9de2c4119d95c6cccccc1e8e4f470fa09d6bb57335b034b03c02cbf5b0b1b2f7143a8fcddce64d8e58b6799af4b8aed2689792a71730cfbc71beeeba28d8b0719ce09f117d4e1cbdc4e91d33fa0bfb51a4d8d2cedf8f2a3dff4a5ecbcdc0868d235b54da79f36d6a9c20dfde3b9ac71a2c8e069b03b1a5319fd1dc98b76420a079430e0a2dbb6cbc210f7d681b07bbb245041bce9b79f3e2decca15378ff305085dacb79a7773d6d7adf2a16f4abd338ceb54fcaf82329a84ba9cd214ecb384dd33ccba4742aa56b1afdb8a8a2b1e5d1348e73ce6734a679d7611e6b947a3ea3d98535f11997719452ab39a669ae0635a734d31cfb385965bacb5daf41ae55e4de89534a29added56f92c1fa899ff88c167da1cd8b4e3c6a218c3771938997944876b47157d36c685f0de798cf2125b2f7b2d7b4b0bfa354734c86761fe6332467f3b1dad8fce4e337f99660e608c325b4d5fd23558fd1de91adcef1c5c2645e2b769b5e14cd53d19cdf719dd13ebb35624bbb952f36224b07940811463b35c2b74f201a24b6b46f1fe5b14394b1797bbdc3b7673a2c63bbd92ac341a653557c06e59af3c043b5de9570224c0b27752492c7f85262d595124e29053145bd4f4178685d3cd4fefbbcbae40b103773d1eeb52d0c73aae2b5d68387f674ea3ccc12f1b42f3e89d56277f7d06a9a691b62492c124bf4c25fb4bcf87c6879f183fbf0c25b5ec078f10286a35ec080e12db6cac068b921eac50b1f7e701f5ebc78f1e20586522a61dad632dd8d456275dcc6e22a11d431dfaa0d0cc31cc3304bc412b14302e0a11d12004b24009f6ddf449506eabe3061588ba699bc45c34c32260cc35e4cd0dbc11e3c760f3df4a0395db1ad70e12cdeb1077aec978d85dd8d85b26d2cedd664be39bd251edb132fa93296ab8cbda1f79ed36fa381720f004e3f156fbe1dd22f3326653f15b79f0680cf7e288f7573adc4922f40b838c73a9558df0ec4e7f2491e5cb0ac00516e381a42e2ef0be987251f422b57be8c85136122d71afc337102dbc8e647773a41577898adba0e896566661d1f630b5f1e3ede466ef3221f9d9cb8c9c98989db3cc94dfc88cac79f1e58e17f7c20546ac3b7977cfce9811ade073d867e7cc0e30708ae6ff9f803849eef62670789b384237508bb201e3ad8b0ba62144c305287ea11e9543add2e602314d0f0f3f72314d0b0fa9fa123bf398d12b0f1270eadef220e1b7fe490869b234f9d4f7a3c753e7900aa4c65b618866d1bbda1f628238f2d7796da2ac3ce7dfe1ddb5336a4e3669d07efec970df9b21feb61f693b11aecea3a9d9c74f2ac519ebaac3650de93382a29a4678e2f954fdfe69d69e43192bc064d1e5657758976e488788874443d3ac51b90f62decb7f0d8c24d2a3ff2d267f323b7d5d4e068e433ba7eb6880d62977cd980fc7ab65d0b2449de763234f2ed1bf906245f628cbe01d96e9bf19fce5ebfd9d969f2cde7c76d9b6b9bdb08f3b974274ebde3aa0cb5d15ff2ef5382032744b0537a512728eaa1c4b1c17e7251f44a9e1ddd9541ee88a759fa47103e3f5b9aa69393924fd3896996463d417c2321cd326ff7b2e106b415e95458da823a555372a0ad0b1146c5db3b954f89d19f78e90b8ba00ab0110a67d8f1d4995de58b5ff2af1a79552422d59783bf74eb9192377aa2a463094f5168f346ec0b17e82e9c3958d474d4bc34e0d30b565786a441996c480e76e4d2a5fde2f3f0f1b7f08af2c5c1a27c8402901d1f7641b5f37088c784780c5b794ce5b14de260ae459fcfbe6a44e2c8973ad42c2d5a7d3be9862e2e20e8277a650edfea3a62c32ec853752aa43c1e4ea7c26c15d42faea17e89315d501b783ef46ebe3dfbc986742a92762c0bcf56998f7e21b1244b7beb896f125010124bc8b7ff504f886cdb56e44f2c50832c4f528d7e7c8e580dee68b084d3606947b3b4977c04f500fa128f6f0f495d133bbee4a3c14e6dbd35cbe61c5f4a1bf8d4a56fb588ed8e868c5a70b035f5087f07075bb3f9c94fdcd7c2330e959d3e549639f827e7b2d3f729c143a41b9bd3e7a8937f9773d167813ed4e9d2804fbaa943f54883318a7cf32eb34045de60511b6a73156fb139f8998b42d47669c0cfae123c44bae994a3323fb9c8e967811a3cddd8a088067c92eab7965444a56803aaae2012d0874de4fce641f2861ca04decd85cf46d37c4fcc4876c56bad9aac12ee13c119b53afd506f58d52a774a36eb0d9aadbf8637ce982224b8fe6901d0135d83cb6da80021a845e3a951745039254451aec1cfcf2926e1aec6d44a4c17e5169a05cf30c888f7c1950d6eada60af8759eb3a1b2ca720b6b4c459830dabeb7e19911b7ce4d94fd44ef0a94bb2b4a77da894a7a4a7e1f6f4a973ec2a33223202ead44603e5279fd1271fb5aa575735d2a99f116b34048752fb22719aa59d4aefe8f6f98cfed80ac1df7cbbb4e4dfa7042bd1c4cb926f5b097ce9f2dbbe38bf8bcc1d2315897c23f2230fb3a14ea8c1a6375a97af2ef7f6fa922f31c6b51b824e5f74bb202396e2481c148f8de279d9cadd639da12f57269363b75383a5b72673ba79585dde37c35a8af37cfb79d565fa50e24cef824cd535254e381a12ced025a43c269ee2dd0fdec93749aa7e891950a762bf30657537e56920a1cbb695786cb0c4bb4adab125be5db9a3c15be23f82f0ae069292bb6d5e2b033a86bd7e254de0dc301180d74adab1d5257754577555d7bc1247e6b46c185f5da485be9d622fafae0625ce8eae0c367e17d405499c0444d6a8ca4c27b148acf8ddb6699aa6699ab66d742471aa916649e9d2f02308df82b8a521cdd29d4b104098380bc08560ca33f21bfd52c2912c4d62a74094b1b1bc021998408429f906f4eda55689b5795862958674411b503654c2912f4c481616cbc85a275109e7491b4b1bc2ccbc8012ab4193775c17d0312ecea52ec83a8a866b482da01aee82220ca973d2adaed882862e68c80249169691ad18c6edda057dbb05aade16a80ae073214e252e4b4a3f4e2e1b9258262e4138104038c7001104100270972080f08e11c01723102b58541a364dc3050807e28b1188d0c4519c45a521f989b730397114f7afd2d82ca1096f0205f3b0d2ae138f11c3c50504dd4fa7d09edcf0c47da8342437f11f2a8d0d13fec44dbe3042f1262e6b4e9c3472a09189a35cd2906ae3c449ee439539b921bf89c74ac3e45e52abc12ea15fba6ce40c2497af63484e02ea143b69080f9546e4235fa932a34b02baa4568cfa2dc1ef55d712fc611754629586748a3dcec97c00ae2101cd68d00c3624b1ea119c6aa40e555783ed65b021c9f5ed242024e4cb4a0d3984102e128bbd446d02d00cc40e1db3cf88061e9ff2ae9d6fd7523ef4e6745a435d8b3794a4d8606c90c3d9299f5acb4a8474ea76764ab3316f8c604839044c1b20bdae36a68da952cd1c95081586d18ed551176c7fa8a2c232e26fdf9ea33f6b3a431af35a6d8a067012d1691436f0e163143620f2d3767c43a9ed688cf3464f8f2b245e16c201c931733e3d3e2c44e2984f7d9eb054c55d6c73eedba647e71e1f1fc67cb84788d4b8c7877bd84748f4907b32c0d247628e495476f986f172a0c1195d42ae95eec90ae7fb70b9f3b9868c1ca9c1e21e1603bdc817ea439e7b689846022b1f6ba8b373909d6a83d284e0634dbc1cc49581666997c286ec8383f8e0233fbf25d8a30f0a54df177d4ee05291784429c48b15fe7025867df1de4aa784a467f2867cbb3dfdc0bcb115700564305c992f80c2c8d04728d460e4617c84420d429e8b746a6e5d162cbbe4f1b1a343a5d3837f98d5e01d86641c630a9322086960c3cfcf3ce49f4c4ee0ab408377b04326859452cac8524a6666669e1bfacb2fc4a0e9180bf1e5225c176cf4798c9919c3be0006396307661f599679c6b7463af73519db3073286fd8c4c74a13a5f88939d3c0e00214499e357a6b6ec42ae454e186f2ab90934929a52449414a29a5741ad21af61fbe86764522cc122effa3ba7cc860709b267470e7b15eefde9ca025c6739c9298cedbe58b98bee48db8f1bc83095db01b4a295dde1f6113cf518a97f707c76d087b47eff8f6286ca023e5f700185c802249cce6fc853a9e6b6e44a190f4328c4f8002cfe3e0c7ae06a2d0cffb43044dc42ae4c4705715ab9013337a794376d36f1e2b0462157262b6ab83f38f430f23d8c0083c419d8736c6749f6afa80053920010e94107373829698cd714a62b89b13744ce7380588d9dcfb700a10d3e930c2751cd1f97675b8c6e2e3b379185b510e2888c28f3578a10763c082dbbc6088126a500328808400879818c31de12a1555c267e003034f60028f83725cb05fb8d1d120690a0c74b9d5601369b0bd2b0c1b72916f67a11b2924a8d52f1c533ac21d86fcf00f83e1a7411a52de2f482064c4209e9757d6d4275edcc10e3ce44376fe19c23fed3cc40ecfce3f9d6267154f40be441ff6918128a4c9177e82837cafb28e4142ab8eb4aa6f6ab0633d7a897a5524b21ed7792aec8dcdec4ca8549072105a8f9755317a8cb1e3789950c5172539abec28c6d11755ce844a87e7f1237d38e68b461e6fe8d6491e5a67a24155185ff6b28e069b34fac2cd1bc77cd10def3b9bd7dce63bb6236b49de914824128944228d4676f4690d0e3568c4fbd8f5da3e3ed2385dabe40b139e8ad3822d7d3a9aa59d2362c3f8e2b260392cd890af602b141d959487dcc0ae20237188839446e83407b2bd06cc230ccff0905fa8e89b0b2afae63631315091fa119a5f1d40e23d82fa7675d0abe36a1a5f56f108b2cb846469c72e0764a8c5189f08b3047f50fbf40f0d78e2104f2e8289b48f4f6ca142689f964d8fa06280151524dfeea0c6110a572aa436183a80abc78f9123ad92ce6e7f7eda277dba8c8e3a82ba747a1bc82571648e7ce1219ec843af97d8c2c989f3257da6cee46997d4912baafaeeee9e973b3e448327201bc670913f400a64630c4157f404daf4187d02f15f7c891eb27c98125f34e98c32826f84e249b2096ebe42386df08dd363c70e1e2b2fd8507b9c36d243ed52829d392e98382a6d460b47a5d2705aeda13657dced84d07e4f8f376c979666f435ed364a8fd9f33cb6446718d8eeeed6e69cf346c9c2df2c5bcaa18b2b61262bd0a09c406c91bef98c563db3e4cbe6b225659452deed52964abed0a15eb974823a67aa54a8a60e70aaa6d07451d69547e86baa321f79e4f53c346710ce9d9e4e4d9e1910092264fa74409647835247e6a0d8339a011d18f601a1d833b789d181f9f423309fce3ea767971543b23486c918e1c229c1c63b7b8e10135f443bd6454e711e9d1d966592c5d33ad3e2b3ab448b9f4eabf7a241897d2a0d4a97f5d4a074ef08365c91b339ce961886794bc6923c27c96864de8ecd9059015eab3306f8ecd2db8196be02f2d09094278fd3fba402364b6b525293063c6b5d2410b29ca6121369d55bc10a7226cf1025e4f8c02f73357b863c4685885101d30226d4369bdc75b5ab9ea6712e64434ce83129a814422493979438a9a4b31d8c833395105fe81de21cc23228b32686f885088259b8831458a0ee9a3c3827e7db59583e5ee9d01289a99c2c9d0b004c24d01736347b727e348e8b524aa763d96b6808933de144c2f774adceb4d5eaf46dd5b3c5b36d753a27835c40405c9dde6d1e7dcd15d66218d86b87bf7e171fb300e0e333b330af00542468c7b5d38a2dabceab3293ba700e00de7d39b4cfee0f0038362459c65c318c06c0c73c3f7847b2b876269129d42ccd328cec6461ae6886d56a32a12cee22064ec4543d78d11dfa6d6f9b4e16176d3f9bd8cf6f6621825c88623843a43b2c63b618c66cc3f7c402edc1b753ef28cbe7e2cbb2a9692ebe18b3f558e9d2e464b2501edac3726a1fabd5bb747943cdb69afefcd99a938a421319c44af7560cb98280a80f5a1a2667b6b9600100dde93aedabaf7143b0947ac7dece6ad5c3c353bbc7e84b72124725555227a7c19cd1a473fbcec5c73100f8daf5a383825eb2871a1cea978b2fc6445b65a8f6a42ffbd246bfe9b5485efa8a2dd897749ef6d197b359ba088dede76d202300d19767e2f51b6c880d69dfa4df0f16df6ef7c4faa379244bf3344bb60f3634a54995a14538a9329408ad160d629b48b75a2726d98e2379da274f8060a3d7d139a767ce416ce65dc9d3be7ee90dc1b2cc9cd1285586a27829292c4e5908b683d02c92c776efec508e30518602c1b27729a2ae8aa8b397fcf41f2e9c593ec9f2f981f49140b2e5fda0c53ca99c939fbf9ead5e83a5547ae48cc5b1e78ce50b62408c992d20961e19ca9eb05233a255e9727dcbd0ebf9c0b2cbfefa29673db05248060575ad1717765e42429dc29e073b3f764085b4acf5ca02ddf17440777c7839f0707083d54e84999e0dbc1aec7834b0e15cad9a55e8eb455fd24fe01203a4f39be927b031d1b5086361585b823a0ef74e7155f49e0bf1a293d2b39f894ecf7e25af61f62b655a46d23cfbd9dfb66df4f772dcf4ec277afac51611a006a790779d67bf9a619ef4a6673fafd6550daab5daaf7bd19d2d11b6c94c344554643feef99bad6f5e21c2e04284d185d8d29e850836c68db2d168e4d96ffb0cb3d24e3b5b93c8049a451aec20ed49d886059e5b60b09d84dd4922d92ffb92673f6c7e3f585cb860617171715c6258ee6cd98f7ef6fd60f1e9612e5c7e3f6e4e6063581cc725c6859be86c99ec047afbcd3b5bd3b39ffc3b5b95ed5cc94c1f0df6fc7eb0d8181697ddf703c72586c547df6cb57c344bfba9cad0d50ee7e10bdd697035573ee40bc6751bf66143b353f16243b18565731f6243d8d0aa53743a9d26944a135b9fdd7953a76aa278b695c3fef4eecb6173d8cf2412e9f568318cf69466192a22b788ded93a7184c132394f2991b2f0d89a38db93124f41cdcfb31e405f711e7cf01f32b79e65cedfa8c4b3cc7d9840b33589ac58e1fe851c7877f619ed28b7374415d1c2338bba365a6496dd7d86f42f744719b170bea1f5ec8638e617b1c2ddb3507b14eada58c1a3cc597ca13b09f415a067d6476e927d2bb21560687dc525e5c0da8ba308d0b35b03fa8a5be38367fee1989f5d1cf3c1910f4ef21f7828f1cc871eae9f7876c3151e783851b9ae725554b24fc5fac8553c1b5d153f51f1ccfa0d4f544ab2ec53b99f9f7c9e7ddf0d79e4a31b7627dfc8d99ef8e8c447d928cb9e85f3ad415d948d12672f41a13c854589a7a03ca5c453521c351ab5687157f86cc91537d47ee4aee28ce2f6cbc1cfc29b2b4d89a7784c0951a194b508c9e25bd1c2f9731f7da1fd9177b5c1ee374a3bf293b7f86a505e5ae12c78c58a5b83f292d14d71524ae84f7294ef872a7332a4526d987c09c95b541993976438d98e4e85f24b9e7976437f6c8987d94d89b7fa4bf64b9fcdd3977cc186b0a1ec26c369354b3bc9bd2a439148d9c2c3848c4c2233b0213684a4532126c56347a48830f108237eb870cd858b8f22c1549a3672ad0936092480662b53699ac83317dd0ab0a81308c2863eec08f66ab0e3557d55862f7db580be18fbc9d2a3914ec98b1d696c88426187b854378b742af4b119124fc7578ffde2c2eb0d35a72f8ac40557efc667bf631afeee4591702e9ce35c7c93c8d04b6be16871a04565624a2dc4172c0eb1255fb02129bdaf4e30c496190666e938c497c986d734c3b7c7d98aae6ffd60899348b3b47f5586ded9e29b16ab58754a5111a7887acbef87f91a9aadd99a2d49b30c05d90dddd9c1cc40773021300160adc1b27df661288825884922488150c75410312196415f0c23c4ccf0ed2e5c456f88e5682f2900aacc3c0000ea8ceec58b2a43b39f1f7dbdb21755460ef1a2c68881b5a4c1b2d37f354b07a0cacc9ee9637ac15a9245de70facc1eba84d93385602df932573d571d10405499797aee69b0eb5ccd1576047b61432fe8ece9d4741f2aa24ea5734268e0f43501a82e3060481717fa6a100910d59381d53ea41489aacacc4b5f020882dbb4202a4de643a5017a31c2c4ea8946d62379a512936772e2a1789ee779a714af390851e6b7fba1190654e8e24ae840348f4032d7be25dcc66cd66e8cf62d7104ab542a2db274a5a1f1c0f653fb1aea9df61dc1deddc053fb36df795b95412da0bae70fa8f7019144831a1caeb789b18969ef94e024ff4defbe9bceed77e339a9875522be3ec660185769d0184313c467de791e901c6d63aa5419909a390eed1d939ceca4945e156d37477fe634a36a437e0d119586cd53b74038fad6191a24cdb26c933526a64e729b67124ff14573edae344bf3ca8a26f262e4183baed248e0fb29e977232f46186ea369e862a7b4b6f92ef3b42f9b4e69daa5cfe9527a365dfb6ccc2f472f01831dc7e96ecc7709cc7168df71188d0eaedaa844b44bcf2a0d9bfefe0ceb8c251ab22492e836ced3e6a494524aa9b7d5fa718f66e94dd3a4f4e24b7529b76dc5a5ca695649b30853653853908f89105b8a105b8ce0c9c0ce0f39c877adee496fe73ce9c580cd60636ce9f9b653942673ea1e0d79edb669739b35166426ba8efaf4acd248403a752480806e383d9b42504d36d348e027d7a31591213c2c0f863c0f1fa1e0c1cef740f5df47287850e4a18841909e1d2d5c0108d0c71f202c2a7cfc79e2e6bba01ebc7a30d48321ab9f9d4ea5b8074224910fbd2f0d693a28dd36cd375631e1c1c086b3e789069be781784ed850e2084598f8f1e303fdc0f0167fe1eed75941f1e3c78f1f3f7efc151e7f26898ab7f0cfab7bde39e7393a4178ace2c73f398a5b3f7193928bfce3473a7211c2027924678f3ea3af748ac46a9014825d50e7ea84b460c32e880b622dd076652d825523f86dbbdc059570e4cb0624b5ab7ae6b0c09c8ef55a16c8b37cb3b0c4ca6827546295582516bd5d50e7b240a9edfe200110f6204aac12ab53a66c95f990a9e1128ed4346b4f27f7124e09c70675aa4663be71e335679e0fbba02e68e7db3ba1ce486bdac622b142120b73a69349ac18315c5c40d05d5ead411bd460b7e44b09a7bdac25814a385dd050f7ea823a17c7b240d95017d40975ae06b321ca6387cc56cbc3fecdf9fe00e7a3139e10f21f7f80b87e03dadce40429564e9042a785d7020a35e47c1451e8f1ddf55a3e0fdbfdec10dbb24490782fb0a1cdcc14adcde659c6264b810d37a0ce08cbe06fc7f9b00b6a51cbb001b177419202a5c196f8e62d823ad51db1ad223f3305910667a628e2f1b01bd07667a62892f1cf0f749e7d8529653333454bc5cc14ac4e310ba83bd7b7faa50bfa992986fccc14400dc6b7899d9a45880c61a5d49929583f0dc6210dc69fd128ecd950a74289333345f6621951851377f844983832d2a988d3476c8f15d23c563f12fa1eb9be7d2649904ec92c7c7c18df4c92204227b5864aa8a753120b1fbfe59b49d2e332a93554ae55a7e4153efe8b6f26c9aa65aa3554ad9d4ec9d6c7f76f26c90e5049ada102e2d12969858f7fbf99243c7e4ab586ea47a753b20a1f7fc53793448745aa35542c9e4e492a7c7cd437938427c8d61aaaa09c4ec9211f5fe59b4992e333aa35543e499ee8949cc2c76ff1cd2479a24884e11aaa223e3a25a5f0f1bf6f26890f22b5d65011e9d12919858f5fbf99243d8678b5866a88914e49d6cc14467a4418aea1ea9144d52909858fdf7d3349543c11866ba87892ece8947cc2c7e7be99243b846cb5864ac814af4ec9283efee99b99e2b5a3d51aaa9da04ec99f8f8ff2cd4c119493d51aaa1c57a7a4133ebefd66a670e94418aea1d24972d329d9848f7ff2cd24b909426b0d5510a14e49283ebec9373385108f596ba8780c754afa7c7cd33733c5d02ac2700dd56a8a239d924cf8f8a56f668a233e220cd750f94882d329b9848f2ffa6692e0f44418aea1ea892df167a640d229a9848f9f7d33532069307e0dd5131f6b0dd513b125fea440fea50b12ea979e3dbe278fefb9a32592ef23dfd2486c5717bee7208774aa913428831065c81b861144f6748ae4ed5248a77c3af5d32956a7b4273ab54518eafc2f31e66608b247d0c965d365e1a5cbc2459785cf14019898708ac469249dea82fa86656ca39144f253defce61247962e8b44540b91a52918342a344ad1568344684f8342a80ffda12c3a048865048d3545c39cd376369d590a4dac59e3a694b6e64d4aa91b322dcb382ed3328f2d886459966d1cb7695b966599a66959092247d728ed48276ba7e631539e51e076b19a464f0dd2171ea94f7e3a79d644699239a7c934e7a473625986516cce39d9270ebae883a51e596b108b314a52120d62a176ca5662e4cf6cccb22c8b4c9955b02cdbb62dd330c6dcb331cb981d3b43a7cde8cccb186bcfbc9d9bf3ba6ed7d4a0c61fb3a6695566dbb64dd3b8aee3364ed3346ddb36edd6382684e6ee2873b7f48c72d36edb2c34d3b40ccba67ddaedf1c7ee1a7a173f477c82fc8b8f51f8e0fc9452466d487664344c8ecc24669e52ca399939c6a6b465478e57901846c2a89403dbac9b49196890f36992d2b76ddbdabbe79c526aad4d4d4e2a870da31b866954532191e24f9714c336d6b46dc3308c6618c7655a8651279c0635c695523b6012c326c5300ca35fd3d9340998c4bca58d9c24975262f4528a6152caee99c96fd2d9b227d06753c64eb5679e656fec5b823febf64181908f9dcabc39e7a4d8c5b02c9b734a496da6cd348d62544e6b038d4ead6a9aa631098906310fa7945c95c94c27954eb1e6ddc694d22a93dd4cd328a57366d8a48ea9ba8871ee3987b231fdd6709e79c8dd2d8a25b07ee563144ad0792c72e1e438d27c8cf3f8d94bee6632cba69dcf6d8d45ecd6d82574f16324b6d9ca3827c72bb261e6162c018991223ddf431c6063144c787d47d183e4354b00a1972e893ce6f4e7e3536f3d8b8f501803cf7788612866073f738c331cf3435662f439e67b8e63bee61dfd36cf9cf38d7a165bb01b320d7609b3448ef9913a8a067ca7281af0690d8712455114fb32ac318f32a81c18b0f9f8931da539f8185f9476e3f685b353147366ea28be8c7df30d363a0af3e8fca1300f31075f737ab14b03be7639c6d1b3ec58cb81d44c1fdd3f9a4ccd82519f9fe904061b9a3e3481d235a7d3c1ef1cbbdd1de2274783db308cf3507eed1d6f5263f989027fde211a9492ab452ce7a14986e55bbb21f8a1e94de0d315b9f14c421757c26ebdcc5e6067ad37ce97909743d09c03cfdbd75ce455e475e455e4da26f2bab926724d85d7c1c186fc284ff3503445d5331f55075175d3448e9aec2291a3a6673e0a51534595114d5495a937860a0efe9accbbdb4205a54285b5a7aa7db66bb657f3cdfaa9cad8cd316ddb6cc96de992aa125ce221c9ad77db47dd9250d6332f5907dfe4a48bb297067cd32d216d1b931cb579e6a5eb913c446d295506b55d1a3086a7d54a337aecbb152f762a8b95ebd7cfa3d14834aaa22ad23c91c6719c7b532412cd4c91ab563755991af6cfcbf6d0a382e8a753a28b1a0d29a9445417892e6ad43f9d42893cf3e8cdead490d245892e0df822175d91e8c610d22959e3ddc322d744ae79dd5cab5bd5912fde8a9fdec34fefbce36164ddabd647b508915791d7ea9b481bd591c87add8a573fad41914f9f9de8ebaf5fc89546f4dae8b5500415d53f72f9fcf2475f0c91b3775e9541d180dfa0e813b948f3ea9de8a35e3fed7b83cd5023cfb291835f5d438d5e24848ed73a9df7b29975924b3775aac6fae6d2bdda95684e725bfaf8bdad84662be5e0b7b7fa46fac2cd47ce559a6a63abfe7ae2a31a3efeccc1e73b175eec14ca8b2decf1c3facc36e4874d3cbf0f1db7f9e00315b5b6b5c8de5004bf5d6d4a8c4eadc1ea9d148daa8bead5bc2fd4bad679e9fa1b36ef75eb230f3625be62e8e24a88053df52ecb7c240be69856b24ec26ee6d6bb49234c8a361a7977f2d270e4a7a378878a450c11f2f30c4ffc746ce475e4b5a2a0f849736637d161f5f10a1f7f5e439e07ef401eee0d55b8b768a1b2929282e22a5506e5e4282827140a8a83afe2271415540a4a65c50a143f6a854a4a4a4a8a4b4f4959e97cf0bc1f3b7acf5b6a6c940a15fc27a39163b5d2308679fde2a3541b239451ad1c7774caa41fe5c6d3631e23064af55addf3939baacce9a2eaa501bf7abdb1c1adaaf09377f5dbfcf4a97883f55027f73c36e89d1c7c94abb8b1c17a51373688633e4a0c948bca311fc595183d8ad7ea28282e516e0e7e13072b0d132ff1ce8587f998fc74b2d6e73351e6a58c09369c443ecb1c0c4426d0cc9c74e2395845f5ceb39a3a59a34ac39a8f7c546d541f79ac18e6a31d99752e1e4718cf0936ec9c9d2cf391772feb85274ff19a93a344189467de3488302a9e79a7523dc54f1feae3b7b50814af285e4f5f45f1ea331a75aa5f0efe93f78e4e99dc50859b78c641744278d583a8343a181e4798e8da862259af09b3e6e438f8515cc5f59a60c3cef9cc5ba753a79b72c393779ea1dc9a93a378e6b6d2682794178f230c8d1a13c7c1b109d28322cbbc7d74aa7b742a3479e799f7aa53352667cf7c5469341b26db1c474945986bd8d5aa7718e65e841939d6c3632b1ef3184d1ef31a33c76e58ef0dcfc776ddd5a2a669d3049fcde999f74da7764c134496cc57f0d90b3e73d20deda4c1676e6f78ca7cf4cd9bd8925dd1ed51bf5e3548ddeb6ef708ea1e0f364863341b13f49433e7fced6799c61a96c2d7083c245558eb25eb85cf0ac6f31d5f30f962a30bd12f3126f2d0efc81776354bbbd69a559d76be9d276b041f6adf397c7b87c7041ba30022d23b3e7ea84d9da923558fb57ad040e4e34bef46dd0bd4041b8c3146182578e851ed5166ce8bea4b03fef4e998bfe85496d564ce9da2015d663561072e3b2bc135ec1dbdef0b1b8d250bbaf8ab31048d61478c2419b4e7c040684373419d2e2631bd06bd3fe641cffda2d29a6f9ea4f559e6d345f0b57ad75f0eed959053a89e3a12cf39fd96f870f0f7f410f32ccc320c4b40a7b0ef315086fe5ae6e1095bf1d7348f5214b9ef06f8dd0ae7d98f1b7a7ee5e38f1b787c113d327715a41c58cedbc32cfbb80896f3ac08ce6bb21b82ef83551a45aa8cb7041bcef79460430dfc4e7137a51469bed2a9cc29aaddf357a12b7273296cf550e5e5f58458140d1afcda45b56bcedf3f9f1f9b9fe8d33ccca55b5384d9aa2b317aee9bb36edc22f20cf4ecf32709cf87e04b95972e7f92ecbc14e2a5a58e83b9179daae17cbe7421228ce6d20710613697de6ddc568b988e4dc7b4898d3c2dcac6385291f4b8c260c811149d2c9def628cb76653a7674bb2ccdb6d44df9047b5886e0685fae4119f7a631e8f04bb1313928b3cca92c49a7ad659387dfc69622e3defec741be5f486fd9e4f9d6feaf4863866d645139add1acf353f312142bbd389be28cd33e619719b9b4aba3bc364937260319dcf1ce5ab7506e57d6b5019ab3af68b5d715de586569bd925e5c0863868a55e83a1a8f374566114a522e5ca3bda589ee665363a9a983993473b367d7cd8496fe2db631e2c837a367b7c8803a39977379c3adf398ec61c87776b1cc3b0ac3d4d5efa4d1e0ca3f3d3577d8644099d76ac922cd34f6ea859bbddf044bae1c94537f4d20d412738ce8a38b7b786fac8db9d60199d76431c336cfad5db431cd467c471172572eb9db34abeb0f0c9e21a11f2cee7a187d6fd72906b5a8bcbe246c9d239b0247b390f71d01f79e7d5b9ad16e13de71c34471df4dd7423e4e46c6def660e15893ef031be4cb7f165866499314622aa73f4a977948aba93905bcedbbd0e728265e44ccd9b3abf7dfead7ce0f7e2c5c535f0994fd163ab792dbdf8d43be83bcce32a3b6ae39dc430cc67e26397b463e9f785fedd55cfdce61b07fd7aa7130ca3f319d2fb32cfe5e4ae26299d1348fb8c74adab0ce5a11e707064c600062a38127bc6227ae43ccc4728b8887c37bd49b39849cf289d94ce97f59e8e79e8c9223097ad65f2458459427a888a98cb78694010ebde6051d2a54bf0e7e37821a37719c7ee8c8a5a8a51647d7c57a7f8d9bb390dec62182dc33eedccfaf671b10c8e30628b84c2b794524a9fc8d22ed909f165f214be5b9260316f5a65e46354b2abc1f6a65376894e563e95d5a38cdec1ef6e00facca7bb34b75213ddf0f4f5e39f1d9ccb96de655e1b407f4a5d9145bac6ac86c87078e9dd659fd822dd4b82c5bca3b145a1cdfbb00f7603fcc93f2fbb38ca2d059ae6ac79c6a2614df3ec63d7fcd3fa31cc1973ce32d7e65326f2d343cbec18d36a8339eeb296619853cce98e1d0d909e09492273ad0714a4e8f1d431528944f21595924a837d3ebba1376f987d374042ea5d632b0d63d8a8daa89b53ee8fde69c565881a474ce0061337393d76fa4dba7a6440e26d5a0de674f3d85d69588a275e7a9669d586e6994ba73eab0deccecbb1a9a8a6a18b2b212301093ccff9f44e6673f35eaa4797973fe3af810dcaebcdaa7d0eef7a881a474ce0061337393d7682f80c01eabf01c2c94a8379dff03ef70d4d9cacb6bf238c707abb087e361381cd3b571fed2bc18f655aa5f14931969508ed862f22126cb8f292d2b47396455a6dd8aebfa8346d34c6512e9d9a110400000314002028140c870483d1784024eba2ea1e14000d92b45272569b88390e53c618838c210022000000000034494000cb39646c351c34ba7268206b62d2221e995e6c6348d69060d32389f457349f44a3cc59e91a5736131e9eddd65050a5061943401f151f8f2d8b2cbebe39582792352e43fc3526a048d32698c5779a49be6b824959cefbc64b1f59d5198f154e4cf4ad3ab4ffb91e35f4fb6ae55148c9ecffef8b084ba22bedc64bb809378602d5c83b4ed3ada1a3b016d405814815a52eeb3eb7ae4c9842cbfbd0d5b9810a14c5809e780029460afc9f33cba8e68104f48fdd356c6fdba6f51f56148bc9ac3c364c569fa1b7c4cd6d4a0867c61961200927049429d529958820edbed2515a5415ffb4db1326e252e336ceddcb2387d77ff3e506374ef632cc87e732316034b04d723d76d17387c509ab705c4120ce2c145dd12743c262e434be909a85dbe7f653b6927b1666484fe4e6fb6d0311530b55f14b7491a05c097d5138d97065b93408a1965d44fe2ed404d8d32e6a4fcc2a2f883026d06cbec971794995522ceed4a67393a6a32528e0706f4c0d495144af5e30532df51efe8566a5f3d4ac9c6f6ca3ab8dd633e2b689865a9d785f9e373ec25d12325e6b8638151f1a866f230e746d3f9419c5e1f87fde2ecbcc83b08bdedc3b901c0703c27520d440c2140762891eca35d9869aa047d98f2640fae3291073af186413c3cc65a17e81846d68adbd4f369727b047b530f6f277f660b9ac6b3a03e6d91c1acb89e1def095344c139ca1187bfd4d7bfa9b6dd542de824d4a6262263469d31ea19d049cc95ef10d73254683a3699eeab77bfcea0b10c876ced0be00002e95a07ebf755c7a7e8a08c7c9c6b23a65917a87dfe8442462f101ffd058f0df71d1ff6217eb8503f84da66fc534cfb08bac147a12c3a1632fec8f05e58a284e91c75967e41ea50048c1323cc3238f9f3f59239ca71cc676f1d6992913d8c25c783437a106a318a0270e484249095cbc84ac4f54a5a8e464e82c1d93dbb3b3eccc33f6e0bb3b4d9c820181698160fb4ad7c5a71f44a3a053166c7c982ec7180bfedd41c55c1c6f67d335959e60c2fc67668b8895c93f3388856f3497603659907633e27c7e5027ebb2d1adfcd6ee0a868dfeb63c46c6a05f5abbeb07cf9c700b1bc90b6de764d558be65a9568be53837fd1f9ac776f010d81d1f1edb8dffd34dc2d55f155af23234c1159f9a5eea9e7f6e9610d45c905bf0cad1022b8db8d9949b6019e60b9fe536263434b7d8e8cfca9d2c25b96e78807602ba3b5cf463180ef7fa08a0fb0d8a744017936bf157f9d7c20efbf3cfdb559bb124154ba128a30888e910e65562e76e648612a44965ee2a74ef98494d40b5beb676fb844bdd630496d24fad9317befba568088e4bd71140afa8d33fc613fd84fd5aa04f3fb15a572a1eb25e8315b504a240ccb7b83002607cc127907997b88c72af805c20402fce09c635560326b1558f56db7f64eeb4e8ff93e594beaa5a31b64a682b7c9ec2bf9b3842ca1d3526ae2afcd25df0f6ea5a404636a7f5339c4095c200c0663608296e111834cac5512e112283d499f151e209949ee1ab2c74ee6aab673ae34d5d49fd7436873d021f3f3098d6f9e2900095ee8832589a32d9c813f0b0c0ff5aaee7703d373f3dd55fd00d536daa311addf0af6fb0d65960802030c1a04774cb42fd82022f662b64522acfb30ac2cef44a3a8caa7440addf446db11c26d637116d10c0ab6a0e45466aca6a8e0338e7e4c0d6a190ca2f54326ab742092e336d671923bd92472731a42f74ebc6e89caff2712dc3f2b2251821375802a54c684a79fa610f899e020cc7d6d41591102b3bd3d12fe39b407501ade5e9dc194d091f2a71f18a409ac832c193dbc54021e6edcb056e8f55d158aed35e1ec5faae143d10bf10386af0fb3a7c3542acb2f6f441904071b1c0c198a2922161a0594a2f5ce720b88be66abb1b1bf80784412bc6e3b48e5f85ce8d36a807041613768fe3538d051299e4bd88ef7ea06e86516f640031a6d067fdc7d8c12c4cb086ecb8cc7351401e05917155b97def93a3057647d8c6f0c34d08cb528572b10e11f8a14989b22709bb57b37fc8659e6f7a71dd378b0c8a3d56e168d9ae3f1b66d5419e1136f979d817cdc8412bb257d0acecb8a3f551daed87c8f68d47d2e0ff338e2e1d5bf59deee0328c03e3785cfccd3dcf260ac039cab485b6c62042629f99b755f77297497c4d5748c048d5a5639205a6fd38b23850e05ab63149f2c0271d93677536011b130f0b83781402080cf7bee3e6b0c3341ec3c011458fc17658e153b59e04f54169889dbee9c80b870af1d7d1914a236c2c57b061123aacfe1cb2262576b12856a4b31ac5819778ec4f91810f59d49c713c7322a0ed0e219b55b5538ab2d43e7fbbcb0cf87862ecd517b408545800916c02ead96281465d5e8ca65d4ec2b49b5557086b6eceee6288ed1063b9ba369ba86a0bbc77a869fc80f1e35d78bf7cff04076a248c54f0c1366f3e3ae38489ce255b37aa17da94c1b1d90353168b2f3e20dee2ee0c4657833bf0999ad9d6971366ac710971ec7267423811106383b9eeb1d7a8a06fb97e3dca564ee95312cf20148e0f953e3a08b4c14b6565ba7f9c7adbfc3130e1540ec91dca413f3ff9069ccd093acd4333486d3149e72374aaa5100b1e4427642281abcdfe198a7a39d126c82e3358611fc2946d9edddbb6106af500fd312881409d5ebe3fcf9acdbbad72a7508957798ea9438414f8616dc30bc4a38e3519a2e763ccef5d8a8f5365835c1ffaa4b52a2c99a9b1f30566b0ed778fd33fd19059c29c47bdc581cd79fa275515454d49cb73681cbe0a4fd95742d8a634d50bd4964b97c1ca8e74e860535dd4136ff6ee62590efcd698dad13469032cb3261895c0b4372186664635598c5daf4df5023a55588959f06322ade93d180676c9f27febff13561fb14c89c0776db9b4a6ef5e4d69c389c44ac54d9a3d48d5b009af1adbaab04fb8086fa1c063ef5529fe04d56bde2e5438d6fc268a19fd01b5b20184397391e9ab1856486b645edb7d51f69ca873af902423bd38d2e086b180ea12d9f5ffa0669ad1ae51136d308c51312d942c78bfd23116b7edccb6a766ce9456edf451e3590f24203d734724418ebe03b6c97d3e26ecfcfef44dc924974f8e26f5f0ff0ca6cd33e7c4db2dc9e4db2bf4f46efe19bf7a6de632798be34ecd9e9bf449e2201297d7beb3729ddf90e0a38bc71a3c96387826e75a7cebe94dda59dba042e793bef780ed8c5dc4f2f1528328acbf7f1684e33b1e7d94f6b4a0ed0a544729a908c88168453f661ec7c832ceb3ffa41b956107e0719c702277e2581817bdba1a557274b0c12e06864a2deda5393c77d2805a896d0354716eeb450ca5b7935646e6eafc36db2a2691cb6155e87ec33323e1a21079b3a805a13eac8173c327a38bcfc7f0311a54e07248a909461bd2971424b13125f6cd6849092969c41cd67b108cbab967b90c0346495348d19ab6fd185c660d884e77b92dc866a5be9d85c4f31fba9b7451c5e64c8b8741af4ad2cac68da1781a8b820c0200a7955e69648e7b5b3d2860aaf37e11e83cf517e73f4b5705afdfb9902daaaa3a88354e119389682c7aacc04d27ed41d61f49476878f874ee2198fca8d4b72e4f033c03133c5aebc0c5e0a90993e2915dff1b107274b3970fdd7c17f813e2077a09a9ce7c315fdf2e74330e45141356c6a91d2ee99c1495fae24c7515f7ca7140bef1866bfa8e2bb1860cd342c6f1323bc088d5357f9619b0dfcc8ed1ddac52a6530b1c84ececf9efbeee527584c34e5abbedca6057e082a07b936ca72753eeb2c0a72a0cb43c4a0b65ab2cbf68d219deef7c236cc03035d3aa46b67ae63ff2adb531d1dac9d485a39757a55f84594b59900e9b92776506eb9e5047f85209b63bc19f2eb4f5f79c7110e5de7e20f5f7ce8329c6979868c1326602991a54f7a787544331c86a3fa66a2398ee0f61b50f03a5ad176178d1cb2460b8d89188dc46f9310db7c60372eb60f2fbc7b156c797547c561ab4d40d65fb115a5a59dc912472cfc22bc84dad78e6c204524a494a31ab0437aeb1a4e7ec7f175602263e57bcc75f5bbe96c898adcc88c8ac31253314544b2c31e3234a3f9c2d6d387162a9f6f58d226e3a6a5e338b3bd62c236aef11b7f1419b828744fdf260193b130bc17923e13d75ba45eddd84da653e24038954d22e9b30d3ae40b5844a53fc683f012a4b055f176383004d5e6ee81f8b1435db517d72734d5a83fd108c7411a17b3214547896822bd2e375dc449942a64de5c8ed7ebb6be8a02eb8da5cbf34b6a6d259c0a05c44669247b27943e6b94b20a3768a184315ef46bad2038a182efc90cc9ea5f36d0b0469de4cd04984ab98428eca53468295bf1894dc3579c1a51ee0f5f668e9f3850c8b81eb98494563db9c96150adab44e79e8de808a6395d9b7a4edb081aca4abd0fc01080f9d3ee41eeb81f8485f3a6305b5268199f9244b1fe2da8a0d98a6f72a85dfe4856e39698be9a2183704675562fc7fa7e07d8bb0cf3e284879672195f25c6d26c0c6a2760a2b11ec73fe9533ceda4446d57b219df817f3c718f74e160936dcd15a8280f8d78ce5c6e58a36a2a44880b2a4893468fdfdad585f457531a9499c1084a4d5dd9a1cb91bce4f8d75c56a87eba32e39620467fc002c696e3e9709448b132784b2367ec41fdd4092fb464527a08cf1c51b5f34d211ab23f25cdf02ddfb2004d799bacd550f577c210a5f08e84cff9dbf3af3278787981a515758387d0dd474fbcf19a0456b2c17e5fd2157a5cb95f94af1b10701e51e40c42cad91083d1a7d50978aa18952c82597a4981185e4f8316d0f0c4535f18f6b5dded58d2cf5ca3379fb6b415352c39f9ed7f974e07569c575de5a4a57e05307d5decae8dc731a0156c1e6ae4222bf020275c90898660b5f0b4aad7761a0bd9ed8d3e8d4869b15877b99468c5abf110ef131361e175820711f816c1ae755c35730433f3877586cc61051e10c33951b0f66313202286ab8c8e16971260c7d311fdbff01c664f828267c8063938c21349aa062e9e7f54d0595789fbbaeac85b2e1c9c81b6371496c02ba8aab586377f1c22e938d9f221eac21615d8d88801d1ea0c625e30172411cb4246fe08329ad7549f6837cd32a2ffced5954d34642d25ea7cfb2b2ecf13589c553d9b8698db8ab48776f6600da9aff951fbdf26809fe52c463f630b19179dcee64229dc9622f841289221a564b2c8a6fdc7ce0f901084e5fdd3805fabdb41fe510a243f1f0e5e2f773d5aab744201c4706974202129f67dd58fdb828a4ebd1b9ec757a96bfba1d858fb0dfed76e588482de644389f8ccb7299196525f088de8cc048a3623f5c343d42e26caee4e60b526c791b5209d650683a9c95d89c9e83244293d69827989989e4a5a76c1e304061916663a7a6dec9b57d7dbd3819e5dd1432c01bdc65c1a1b13995f14e6d3a9bc4659c53326ddcc6e4c368cbe68ce843b9fe88d5a381609e4ab1d2afa3205ce7721d16790dbf4f56c3e3efdfb8b6155e45df9017626f4d9d2c3305708beca836545781181751a6108ea1505c5fcb02ab44bad8d54804309c77db22d4dc78931f9b837d51238de240802fab338123f5c68a0b2e55b4030363c02c92b9a683e8976027d5da7ddfec29e37b3266fe1bc0cfc79e863e1570279c24fbbda821a47d1dd60aa0180290fbb57a7da6ee49182995fcc2e8e53423c39b1102b7750df25d40c00846b5432aafd81e510dcd4c3791fcb8b2cc241ef43e945aa9c01dcbcaead8ead7297b54279c16597d2cb2ad015bb80ef7845a341ed15cc596fa91312ca652114bd744956a8df47e29afee5d8981672282fccb9b3cc03a3fdf52eeb833037c874a37209c1177c2000ebc24b429397bfb0151792ea26726a27da58e10ad47a35c200ecd48e08fb576310118de18cd10d7430006fa5f0260a3e4a536485a210529f87c02e6e60ce1d76d583713cac989c52370bae770218b44082246f5250a492ac2ad46fce4f7bcb7db27f722dc336a6929694dc23ac4d68dd2d96a3cddd8aa139a1cc763f1a54b79119c584fe1779da52b5b81a7b78ad96ae5448144c5cd67bc4dbf28d38faa057cc3fd299aebb798782a0d40dde0105237011e8432df191c364156b861b6be90286826bf610225aacc51adecf871478d21ff474d279fc51748818260d61a18353eec4632c593c30b232cc0f9e479e0c631ad6b56ae0618ee063ee8d98e6d99e9b767bbe485be451050800ccf74b083dd36b431eefaf278aa6ccdaf461cb31d338e1d13d126a06e46939f3685bef49292daa16f4a93ea4f51393acd14437a1b127c83da830b58d3013b9c974a7ec519c93796b6249b50bbdc06f8d2a3052d2774bd68ef0fde08c503d33acf2c4faa9ed6f598647bfe7a867f503ab90e3dc100c40a270bf9d2fe06c4d906e7eede3f8f0c4c31c19df4de24610fa56d863636141996c7ce358f70105ec708250c96c7585a22fee89a27a9255f70da35868efc7b70e80a508fd816746a3a21b138df2dac8782eb77cec1eefce7436287dce7b5513b3c0b3feaa54b09da9333d8eaa14b331027f4ef996561017541a598733370e5df1a7574a5dd6c6542d0e8202cd8f8bb1244d83706f01d45e7785c5c139c1e2ef81a65c624d75ad052b207f241870201b3b211b9bc5830ff21b071bc0eb1aa30b3cbbc15cd4a36bcc1b281572d3aead9127bebef17a9604fe731430bfb01c680c09e380b399092c022cff7b6b3644240f36a83eaa2787c8d658aeafd791db68cb6b7244f53330506876291b2b9feb5fda4168975b4fa466ffa626b87bb38d302c2c2cba4c13f789f713726e9338ed699abbde048374df6f6ed1f2f0f2982b5256076a810bfd02ac1a510be2fe3b5f72c7880b2b3dd8f746237c1cfde9c6ee8bd877b48544b1b70eec14621967d249a0fa234ef021ec314932311888ab6bbb1d48ce36714fb51692b9f7f6ebd0ce3008023eeac60f1e7ead6274449aac9d08e7e7b61d71961902a7a73ca05d9fc18e935b57e8374b219f16f09eb9a7883c00be2d0dee4a1fc0131e2a3ce12a82169733e702963689c9da6eaaf0ee478aa830c871c6324cebaa691c9ae2ab582064282d4da5966d650a30602481ce4ac06f21782392a6c8df1619e71da5461c38615c535f4dacb8ca3caedd41ab90e28f7d7888652668d7ba0265ca929fed74b31b686a60d41bec89e51d158d66b42f1a64546b15b77f9848bdde8b7f7ca60008275c72774e85a8b30cf94f0b2e245035ce4a5a3f7ae8df6a84075427b81e7540e5e2b28a7e262bdc32082e0ff9ff4850a33ad981c040b6fdb7bcda6893fd77bdb8502aac4396ea0e8ef410da45edbeca84c90f3d20530d37464c34c1dd5ce8372cf34b1f711f0884346032a29896318362267fe10e254160d3a4923ac73814caa476ca5b026afa903dc866943d64a7c3986aca621ab1f818e52813893d5ac69011b691704f7c4808bb95141006371f518a8981f0d922c402f78b3c46554c8435acd477e5fe4ab72b82d856b2f401df3813864db67bd225aceb3b2c4dfd5e6db472a41270e2c15773deed4676466f8afb3da68ae91f8f42732550d161f818b88fb69685004ce67ec4eb87d6f92af89301702a14c8997c7a47e695018ce1a7e83a524096ffbc4e5d6b5db53ff2689ed65d1cc67dd31357156d9af9b87bdd580cb191d9d8a9a56191c8ceb8047ec0f76766621546297e88eed8b86fdba73ba432c3e4d7762b6e0c10f09323c3abe91be6e42ab52c749c8fd84a494246a0ee95b13adc649e39bf2760d0efe9dc337c0f078a1a65b0b86d94708897c31e61170b45ab819ff130a3ceda08492392a37d1b039965b7ba78589bb849666d46ebec9c919a7b496746bc904abaf9ed2daf7f8ac6a40d7382162a0480d2b76908188555761bc3e77e994e72ae33e08a70fc3549c8657dc464af2b4e5ba2d6c26e00399070dcd62c7614e97d700ac255df03dac6f214c4503deccc8bd6f4f3bc90b65a04a9a3adc1a8a954a277eef97dbad9058308f3f8e4729346318a14bea022a6421dfe40de9e6d5c6db77770c9b42470fb9dc8d85f3188cb97024b6336a5c6ab1f02d48232be069ed7ee04b5802cbb65a6c5f2fd3cad6eec204a440c46f1c5bd4eab18ed6b0c190730d0347bf07d32804c647dbc8ce9597abe9a266a39e2d2e51d0b5dd4e4d2e75909ce8b916673b31e28a75c4d14a959ad76aa16f626192f04361ab72592016359dc4e40a422d6800ee63e8175715a356e87a27ee71b593b986f5e2845ed66bd96ce5a3dd318179de81201faec785b15a148be2fd1c9d3866d951034197e8555bc25db3be4e2885f307a67fc5d479d39153d0ef2fba518cc74f7a62fd142d1aca93d41c41a2da723ae022395375b228c68200bb7f07c09aa7e8f824c0fb0b3774149469290a6da0c2c2c4aff9b945382b4be62187ecbeef8a2b146d3f004d8ff908499505c3c3c66a01bd23a01470a4bcc33a20b841e55ab9c82121b1b6e6d5b9a92713f28f1108b2f15f6327efd9de9457f97a2275e153b104774185521ec1c260728e08ca07630804270c58e1bad19a10c288e949e7526deda91777bed547c74e69d58b0bcc22c42cc8a0a5e1a1ab62b4d77e1b857c7fc1265de27190757a0fd82805d8f2c5f9d29836c0be67d2468902a3e079aab6a95620c01124adead914b9b16272fe50801898cbc0be3821ba9da25a15095109fcf9f8f28af9f15729c76e7db34c5d428b7f93e863595b780ba84a7e5cd39a4b46c117d50c368a6ba409755a0fddf0db260dbe1bdaf1ac835dfe4b1835fc3fafaebb26e4d147a2065dab6dc8e1102d062d910068991ada155b725d7ff5d0aad0eb5e9f7307c5d2d9b25e87e2492d4e4e003ef4af232e2a34c8b4e702d465b9c5d92217162818cbcc43b5a08cb365e56d2d219ee816b4be5ff3fde3ebe2c1541aaa8fd42a54dc49592a3e0b29e48698f15b93e630919823159a9538897e946e700e2cf31a788ee36cff14d4bd17196bd01f6486a36cadb3e7179ef944bedc1a004638299b4fb8bfbb3d4ca33004d33a87cfde094f99484c934334d1f42f7fcd87099e0bb9fc43fd5e248673f02f5365de86c39379f24c4279f653e39e466ecd9b0e747ae79b88a534057af79b95349e13bb986cb80ae3ca2fa15be547cfbc53fb7e7634b4bb3ef049a5f7c8b68b3066ad744d88d045da16b963e4030455611facd12f1fcc298c7a27d168b89c548b6d80bc00af55e3b07ed23a6465f8bf6bc1f31922b28d0c7364ab31dc2ee49e16d77a5650330afdf69996bbeec707a96b2695a4049aa94fda1410c99391b97ed03f00d35de186873769370741e98b38882b27e3ca699ac4d7af53e691b51d4d2498db177180a0c414d783ad9a228b83cdcfcd9faa8f6778650b52f26c5de9faa208ed1eee3548dd2f36c74b578dbe09f4508b9af3d60052ba3a867f27c94c371a49ce3000da865769f3c2d197754301cd64ffaa92e5c0407fcb26852c885cc5ee682374d86bbbb4916a8f2b2b2e6b7df09a21e816d172ec18fcea42732b4ae3e9370c40940bca1c78d8bb8f7c71af42f305988eb9ac66df96e9188467602d9f5d11daae49159103ba53208ef345c5e7940efac9fe9c3c5c4b8c5daec9df26b5d7e6a1cd9b8749274e11e301d1baa161c1f71b31da8ce4a09311b811f55838db63972c0b2653c483e9507d61ee76ba79e3cdc3b1946cbb50ada60325f1af76ecec0f2bb82b730be4ae52aef568a98fa1748a5900da8502322b6671bd5eeee7278fffdd3b318815cc7020f26d237ede53a02e673d95360a12699543134f7cc9c05e32478c81745798edfe8f205db4bc8243d3b38838c943266d14b5bc50f25421b1c8beca9bb76753e3a82e538d4099545f20cd88593c086415929adf8bde77356b123d0e4d761e544e7bcc0cdd7808bb59d7b2967d83367c086ed165bc661db72306106ce881b5b00683fc3599e6ee3d5ea1748523783395d7ad94ed3ea95aa2c6fca4b21d68685118438a282838cc649ab28f5d32a98964afc369c0e68e396bb5da642dcf59d8245f4a6d3668f388a316ecfaf403a1ca5f1c2e2cd3ff3d306a0b11cffc6d20bcb43cc52b35dba63dccc86e7677a67c97ab6d4980817e9aaa3386f80c5034ec9ee3aad9d87ef106f92c8ed277acc48b19e2e846c6daf7c740c918bd26a336038c454b4df2e0430f9788d5d5094f9bad85dac413e0ed8482a7ae72c70972aa27281508290b9e1448157c69712134262837ed788297e3135a989c09d1f92220777c125131e42214a8c208fb23dfeef5aeeb5f520a2ba2962dc85ee05424bbfe8996bac3a876e2f2c084b7c9566a2f0127c26ffb54ccd7009ee2d3690cf67d03682a232a8973fdbf258a79fb01d21af956c283134f985077c6da41fcd3ca29511942569a65f00f785af44bb81f51473f035f5abb0aa6e571e1ef62bbab7de5e4a91ceeeb084179c1d7f544851df20f3c09f9358fd5c47bd5f6e23a8b9600ab40b029caf8f51b143de2a22e8da1d6345df026c292cc49d12b0e18a95179c74a1795abdabc022c3332311d7d5c55791a36691aa8b32d119cebe176553838aaa526f10fb22368543d64a837ac20d991a566ec12f33edf8d3b3f93c712b69b4514aa998d720af491c8117070664ff777fef880f71fe7d12f4e8497ada8e9d3cec8fdb856711436f13abd3d7aa924b56b6f1f58f01a1738d7491dcec0a36c04dd4f5e2a9c00782dc5fae4bec6cee7b64ad9a2e291baaa8d2d2801001845cfe15b23a86eab8381f33466c15639dfb699de2bcb512d6bd4cb1a195913eecf8790a9d4b3cc5242978f3ff7e1210d3d57f561defd2ec1dd4af40b62f5ea2ab151c7e20799dd057886e87768c4c9a85bb9179599f36a8cdb6316217d569a81a8ee3d6d6dc7ffe6ff278e708e2276c143cbba79813876962f1006783cdd2e220b2d70a08b8d770b7387b9d4fefa65f2b047bfae122d61191cbee1d8d5618f79d6bf14a4a8267785f4feaaf4cb968555d2f1f359661293c46f21540255daaaf43c5666e59ceb1b352e8abeb73b00aa4c1a2faf12d1d4e1816f4522645ccf894409084180483cf81413f16ffd09a83a2883287f099776adc927d576b29953d4de02c168f2562d094e1246787b2476932533bcc884113aeb731838baa385d5b86115d52beb8cbb7f0fd41af31375ba91f281b153848d279c795c224f6fe5ac081be738f217c3c6597d2fd3db292d461d17778ab7b287e40f4d9c5a7f31b5067cbc05c245ebe7268c1f71f4d5785dc0cf0abc0f0fbf06d6dcfe6ac510ee366edeafc473a712575859383a2977d5a8725cd601c0e6198bc2df29fa48d059a8d96f25e9c9e0b3bbeaef06f020a08c8eeabee2514880a8f653d272fc4a917f8b6543403928b8c58564792b3352ed121e74358311ff8b465baaafed7e00378924118bc03dd13706f69d370b9d5adaaf1670a1396c8d90eece2ec6d0fedf2882a969f764ebe97410d6509476d7d8ff892eee2516204a92f8cecc44aa2a052599118ff968c21e4db5a5cc53c870b44eab04b1fcf39ada88b8aa0b6af6186792c7cd0487ff54342ec052688304bf1cd404b8cf42db07ee9502ef85a2dee3db31880fa884aee9acf73b6634ab19e0748f81ebdb988089eed4a79f2f35b0d0b87ee57b4e5822a1cce90c45bf7fed005e1f7027b381f26a31e36346b624b26d3acfbd6b77850bd7eb08ecf1f6e00a4d3b0c3ce1641f051ba8aec619f5930dd639fd970da762afdf0c509b4d8fb2e84dda28524f6984a934171f24f9f7772826da7d7735234d14f60b926c20d80c139bdf5caa729f6dce727c555621f2b0ab5d472cc9a099e01b77bbe079e435bee7c707fb2e0733643ee34f5117fa37e942475013ab65c83600bc288df222d141a1bfeb9fd119d71596f7f46b437caa9295000e0dc8465a4152b63c46a3f56df63fb8e232aba660aa76c880381cc5a7fd8b6c530e38ead029eb8db7b070b307075d4225c09a5e675e1a2354f9aea1da24ff42a076e4411737f35684bf49966d4ab8626f58f99692db0d94f3177750a0502a2ab63acdb685577428717f6e02bf04b7676f0d564b9c074e83bd7e7889058b36033db02cb02721109c8033802b6f65ac43ea81b306bb9a5c83a9a3497cd19b143ec582a1bcdb476df9d350f2c469438f84fe2379063dccebb7c18cd66081f890fa6b58edd120815952b3ac7d4e367ae1ef86d165a4437de3363c594d1cef9331e4727f64ad266bf1f3a02e7638cff41119d27fecb40b4a822d71661f07771ac877f1541b101bf018837b37a9505c577013b7bbd6b3e6ffb3baef1ba84953f3fd3b3e86fedd34d0413e85e5049bb0122b5b47910e4225aed96d9ad7bff4a277d47fc3c9ddc77630512846ad16fc11999717fc82292179df983fdc4c55f97ee61e4255aa52429d87cd470014c4a200bed80e00f449716d7b44d8fe892ddce97b891a648ce7154c5e3bc573b1b4c541bd8a041db7887ff13a8841fb3c3f12485575430fd308e434e7a7ab872808cf5d9d7f1dd047b8029c4a03495b4276fb1ece2fc97c3bd4e362823108bdab07c721b461d3d9bd2cde4de57ecdb8e32a0028b6118a69aff5a7b33de901f78dba4335a518e1ab8ff79ae25c6b48b269d1a979ff986f6c7828fa61156af426a7f9779b54962d14dd4c72db34636d923b758442c4e2eda208498e9aa4b63879ffb49c1bc49a08860c2f170c20f345af48fded016d38e2bb65ddbdf8d894d286e9f2f3b9896585674d7d9a10aa2a12d39e08f2601245a8cef3031ccd49b243449852238a020f4467a6bf0cbb027de7be25078f11b2c7d1c2e673c53828187c4753d6af8b5c98b9be21d109ed823ef3f5fcb690ef512337c36f1dee8a98f6ce0129e1234532d8c84eb313082490886338aec5eed2ca79a50d997cb4680810b17311fc533dcd5102ce87b3cb977c7fd320a47ce47e578421c37f9c0d5c85202a483496c4582cf2355457fb29d3fea9528a0c5e9755f6d5d2aa6069511829bebbf66ddff68b91eb07bdfa7dd5d47bb917e82d83233a3fcaf86a66b52703ade7f512f9d7ba94f54774939d199f54d12557ac04921c474d6500b7f549830ee1f4d841697986915cc7bb0aa1ff868192fa87423ee2bc2ec28c877c11bbe22f02f5f379737b35c5601d784809b1cbe633d3cc1cccf42e6902c697834cc91e0d9a58040471f00c658e0e892bd01d128c2d8183dfe73201fd3df794a6f29f10dd58e969f542076e34c1eec31f040bce2da7ef209268668d05379db530197e2145779d2a19ac0aad717d1b5895903b69f186a8be1d6a0e921e88b0c06703470939b6dd7436298618b9ff8adce73f8cdb275f1f26de537b3ba27e73aed42849d73cf350cb60659f545b11ac73bcaf15a03ce7cd605c70b6f324a1377409ca0cf4e74a5c2e336d85e195b5e4cbb8c5b861c24aedf6fc636b06e03755b62209290a0e377d14cf49f0dd49073dd600212856895cd1861494dd1a28a1e3fb997d9807aae17a5418115351d8e45c2121b00e3915c4045d9c671f014425436e3df306b1281725210f4343d3b6ca7f38d89dfc857203c3c380243aa95d1c9ef98089b8c7ed9b2622a09c3720fa4a94c6898729b848bfccc8971784400b62697fddffc1f5fb7c9a8e702d8004ca63da78c10be836e143566ac45d521c38a43b99814135d2d01aa142cb727ca00c6988fcff549e46938dfe67cdb23f8e1d5a7cc358f9026c23029928403e4c16b79e50a638ac48d6a5ba7ca9e040d24cfb1e0e926647dce49286838252aafd07406353f48620a951bb5eb47274fe977d9a0867bc84e01dbc642b4324b8f7ce388c77984d8c3c93b3c3641a7a9bb6aee62e506fcdad7d1ad47f90c38533a06669ed9000c67d1ab72086ad0545e58563dfcbb3b47910a6be9797d4766d398882b22219f137c0dace141fa0a82bbcd6d65d128d624c3a241cd14a39835b267dc808d6fd2fd15866c495db3feadf3b46fb3461245da099d2097ce145f2704672b8997e6f63b50cc90cd653e509ff20b034a6f2afcc285c319f66c915c18198e3ba23e05d06d7cf9758b3850c7dc6de0d3414606009cdc103626e3eca909572205028f6005bd40b71e74a47920ee89f4c45f7c830b7450ed1be09e58e421bc79cbf8bbc59f20e60425ec0058d76e19e6f60b84688419d3bb4a65df0f6e192c792814cf265fde8a92ccd5fdff2d7c8ec228bd206db1985eaa142478cd572ce6cac0b04b8c9cb77fe6a3789c3926ace972838baeb69e4449483668d50885b2eae10a48db088edbffed238574cc646dd44bea75f003c9f39484a63e68e7ca5cc5d0cb84c3fd3c7e1ffc9e1a23e85a2588bca8a1e6cb14ae4a2a19f7d57c98cce51b5672183a2539c7f90e866d55d2038aca97684c9f014d0e18803d7b2387fae3673308a82c29ca9ea6f88cd91e287ab1cf788eb1cfe549ed0b7f74da37b815ea36935c6e2b9da537502602256155231743fcebceff721071e814e1f9999d6f1efc2b1b7b1d1330b9576618b9d9ad7fae6b55f4a54fcd3460c29a39e28f2a60ed3a5746659374b0e0cbee0893b95c6e07cec42420a1230edb0ece32766a17343bc82d3998d4928d58f90e6f9f7cc68f3ab5054bdcfda76b8a620ffdda45263dbc125b8787dd79976c2885aebfdce570605056e08caa9110e783d949510dce83bdb444e064e371d99daa34ec7fa0e0797189ba04dbbdec4dc9df61c3a7c5a06d162c88048ab54ba1e6494ba708db1224df501105003208714df0bec026754a29282715cdd102133412a3061198108e7dfd79bccfdf8a8797eebbb61ac6840d34c5b4b9706f4f14eda0f78289842d979e25d431e345ab766c8bfcf0000d010557d5319095f6580c2d3b1a78360c7f0590c6a907df2bd333a1612678ccf52419b246ae281268baf6ce8bca158daaa7066d616f6a32254021fad221630c18095d39f65751383db40300d8ba3daea62c08abecd7c5c4d1ae812d9de9baa89d3c6e81406909388a950e6ea1c3042c7e67c5663eae2e82c9f819923dba2a5ec200f15d1045d1c5bf8707b4a8b5cb2326c4a08c44b73451ef24495b960c1cea7bb56b4a789083e31165a2e7e2c3f088c76ea749fff75f3e40bf0ad66c1fa826940dd8c5642dc346709f47d43b6792c21f056ca8595041723238fc3a36c21ada0037e3fdbfb524675ad3b19ec5fbc36859f5912a238e9c27ee35648be8c59316238e6a8cd080bf0d4e8c46db42e82cd29d17ffc8df92b6292228024677153b8105dea236ea9461ce2a48bc5ac3c5e6b14acb23ddcd6ed33fdc674214e7426aac17a700783991961016a1edefcff2567d5e771b44e76716013bf0309577e531f61388e217c44e06008f511681714f5507d4eef73b199dfea8290f017cbf2cc338f00d9060c682d790426006a07ef1d52ca5d59bf910b511cc9d943a40897cf8e488b3c70bdf81da6a79b120009c01a176b4cd483a7c31e9c19e6358a3b5b446566b54f62358a2ef20147107c480020c2bd49a0f33892bb8e8704561e4babf7fd19f370180ade5fc5e31a2afb253c907cdfe4dcf066d6afcbff4cf4050c1cf9f8e1212750d3dacd909130b13e57bddc7eaa060e438004930004c514ab21499fc791d1bc0485e93faa16e113fcfe4e3369ea3eeb3c2eea45ea2ff13b404883153030ac18303ac8871822018eda5804561f7282b60f88abdfcf0786016b557631f850fc66002ec6e362967086e0aa8b5dd3df41e12699676a1cf0ccf244980ae08c9d09077441b9dc3d7852e97fdf1a0ac9915367c3713a4fab4dcdae31155bec3ab1c7cf3ba013b3614029ca3d944c25bcc341ff7ccf15e5e47d9e6fff9edbf8a4a88f829242e09d711770c761b39591922228bf7d5a43dc80ec52eda4ca2edbb4129da7535369b076a495b05acd4e9a024caa8f10d19752c8009b20f027cccf3a96fb5188db182f920bfb62e02ddf64b5e320b5f5b53d266844dfbc1e17881d6d04dadbb3bbf0965bb2b079ee845276ab4ea064aada4eb20abfc7993eeee219cd5527567045456d3805b4a06baf8b7affd870f7bd8c1a7f1f5809de4da94b4dab5c9b57ffcacd71380aeda2553304e5dd5e72c5df598d80b133723df239819a0e80d464dc189ddae7810cc5a3d831d7974e14a69a61f307320f81b63bb4b44dfd6d193240608398749bf4cc41173f0b6abacbc3d1de829af34222a7194ffcbbe7395a3631cbe5714682096b1cdd67b70235b041f00a645e1f4b378971a0ef350d5ca0491d9a4193b486386f12f6b0881db3a6f86f8871b847a627ea76954bbf6a055b8812d2e78aa4ea54878310142cfcd7b21b70449d5b67cf702b5bf4c154d00c6f588f29c59430a0953e74c3b8bf8ee25219e123130f700f7c1e4d119d708c328c6f203ae19c84661f46aab28810e00d619af623a357f65bb15322aa79b6be02bffc73a71e9e440190ad04dbc888cac614d7333102849ae0ff7e6555869533f03473f81f469fe36a703a871776860a161a0d08fcf6a079f13ef413267bece133c68b2d2a7329c56dea9632d799d41e1f5fd903e20139f832a8e41f40ab0093532e85e4b14296fd033ce218aa65cf86df63b9162232ac38c80d026565e270ee5d93d7956f28980afcf0588e87af17916411f4cdb0401b738dfc740bc240ea82ee6b37e0c61a800c02d13bee413e3ecd7734f68845ebff125ecc700d3755da1aedf77f781b62dd8c06c701b0573bcb3c0f8907dee5a2fbd2d6fbf7ac62c6e18f7ff6dc6b78a787d5d1a18c2795422f703d8b9d752c7af65b2ad8c50c8d3afbae417bfa11ea239852cb7eb090d2bc6ae01e3144bf7826c97f01782426133d230f72f4e28065ba2fa3383c371366982376010b1cd3dfa89273a9b9142e88b91b5d09fab914ce0abe89720de4bab08885593a9d9939a9b5f81e9207146ef563eaab5d3b3753c1a5216024542eac05b7e4e6d70c6f6716657fbd2f613f5bba8267dc2baf87fadbd731bbaa2570856f0710a1534534ab0b7630d8adf893081b0c4bfc6fa0684df48bed768b864657d2957cc5f58b9ac04d594118b8d8c6276a34f6f6c2c224f851a7ec97f88ce9d7fe5d2299cda8bbe57568bf4629668a78793eb114315ab7e3389ea768d1f0b2add1790d8257f3187e3ccd39c7fda41d73fd3fd1a261ed6b3d4ed9e46929ef43d8945a8070773eb3313a2a9c86663c2d1dd6da7ae85a86ed5aff052e1aa2d5fa151d13cfbf1c2ac8a6cf64d0214e5594ac5c56cf1cf3f4bac7c3075f8e3981bb2514a6b4e1aec80a5ea355cc929aeb2c793cfe52dfde03c8c706c8c1cf6fa2a1ffe2d506625002624745eff68a414bde5d34831ace73dd54d3ae4ffcee0fc45ba6180898741d831a25b8e898c8c6c0f585f8b10b39fb73a06d40d61b65a8c3f9d9489307b15907f00381ed1ee6aaf390120d4e0cddec3868762991f54443ed5a08605c448e10021dc2091a2f242c21f824db482aad436d30ffa4fbc1230229cecef37233945a9845a68309eac5551eda352bddfbce5926aa4c3ef54a643aec02dcb1c66e7b5c40b23c6ee532eb4e07d6c59d7a7c1974024ae523387ec4e673d110fb4dc8e46885596eb82833265a4ada93ca9d2309d5971a6d68c6ff48714657c901b27ccc2769b7b99b9072506f1812d6a62db00139eedc07ed7a02258b2172ef7d407977b4f88da2658f22b07bc088a716f28cc58e115b23a1e81980a2e4328f5104800588908779f6e017bd2efad6b3645a45d414af74e3af65064a0d500ae53b6aa1044215e4c940e0a7753d17a819de5506e52afeb9756803a7176a5fd3b198d66344cffa3d07b005777e4b7472517e6cdd4b5645ca886a65b4d0e9e90804778e37a5233888124075e94b29298671ab039b324d1e0b2e16d832eb06520efd65e07bdf4d92793674304f298a565d265ee78d5038948eb75c182f2a273f83fa714c59c0906d0a2c35e92350092dcd04af9bf9a0f7adb890761243dd79958493e3e3639945f3917f5bdb9a239c6d9fc8ae58b7d5ef62d107652ce66986866312cef6c0e05dbd49428f45281808cb3515d09cbf9c4186b838bd85cf51f3123d5a99e96003356d0c8729f9583b20b585cfabd4cf487aefaa5275ebdd624e5aa35ad025f816ab0a4728180a5e0b54c5d8b5c33c56cde5f3d24da89d960458789be29773c5ddfad04e04981533c2078daa81253b86034fb430026c3bb98dbe4d3a337ba25dddd98ef32dfcd2224fb43d52effb3eb3022cc96d7e73c82d5afed447ddaf98c2d1938c21f58cf6691ef7fd775ee8a0e68c36df445d6e125bfe2bec3010aa1b6ba8e76d9866b3b1918fb446eddaa17edb9538313bfc783947cbd5a411723b5a89f9d2cf8740d6b0b21c207539728acb6e1715163464a3364f3a2a7fa16607a49d3bf36fde3affd2a8b3d8bfd8651fed0e6ed3182cd27e0a564384097bf95b2caa80b6868178c2d7d37366bf8a2cbe3e8461529a94b4b8d03c7db7735a840c6d462e9b60c63cf8af08a83f0b3ff455acf40b3490189bbc69e16ccae8dfcba5cd7257d94e962aa4aa309798525295f5cc664128e0d03edd95f3a87d70f586c709da573aa87be1f5270d0e4524225350b228f5856ccb4063e03d42bb8f94e29f2f49249b71962bd3887c68a491cfd8d80cf475e9158599de10aea3feb29c1a2b2648e6d713202cd29373a5d7f167b872ece24948cbc6adcaefaa0d1392a386ccc1390944095638686454aad1dee8676d2284494e4b72e7f78d3b1099c24c412b904f046ff6e73435afc2dae0e9b9f233caa254166a22a248e30de12e2e50452cb521b96520d34eb449060b40f223f9d141bd2566189900dd575ce765a85ad8486eef00384fc471dce09c42535d4b06a29ad01856aeaf4fe68f490fa8af15cced23446a0c3be00f59298bd361819d6e3adde9d5ae730c8f3fa2a75bbe9794f621b8fda55ea95db7b2824f86c0147934944332b4f2a9cafcb210404cf2c03ee920ff3d9a59d65492c3dd71c45c1511e06f94e82eb07cdd0c5716de038d490b060d44884a3a48d1efe09e81dc1a000b0249084b101358d93cd79dcb95190c49a07da48a242069dec23c3e8f400fad3fa9d79cb3470a42ecfd0e52eba455059d9e461ce6094d9c58c3097bde545c8e41473ec9a70408e91518929e7b61221ff53f3db3515e67836c234f006f8711b65c3afd850fef12267004a3e50fb040728d62ed1fdfd2bab5af6554e6e40e4c6b866474d463b6b812f778e69b318d16981a57d5c7b4529cd025e52041b4e724197f0bb854daf948f6fed661e56c581084872138d9e920c88ea651205821d82ee3be02387501ff5283afea96f564cd7693e74983a3bfc44fb557bae8996adcc993c25627d81f2352d4c6b5cbf1516e4f4c2b6a62ca7fdc887e7b48cdda581aa8087ea2d5543b6f2e3de49c3dea51cc28dbdb6efae6a993be2e3a717871546a40f554284cb0462cd9aecb18680ddf627d4ff501fce67f3a0ca673f4c8f6b5bc16f63a5536f2df7408d48720a24657981846b4b45a0703817fe0fe5a9cca0a27c932c2fd05c1bf13681724fa87ad8cedfddc6b695f7e02bdcb1e86d4a086f514b7a5a2deb724048d2f17a89d20b1b747bfa1ad19e8b23fea383be3ccc5bf0f27722de05d3ff7001027ff44ed3afc0f4fac39635927f2ff9b74fd2cd355de24e86f1cbf99a30c587cdb2d7c19fc317dfed4a9db329e50211785d5daffb2b4c848bf1d38cd942722e42bde4fc5d27b2005f245209fef99736149b4a93404730d0bc9b215879a23188b5b3fa53035d75ea3b952156e44af7160076351bc7c1adcb4145891166cf73181ad4525b05d6fe88e8f502cbacb3d67569169c484be23336fc46de95f2e832265b439b48b1b587bee1d722c8950c10858d82993bd621ee640dd10d04389aa6a55c154e7cc8afe66c1cc41e7d2c5ce8d9ad50a6c833a483823277a115ea84c230ed154b00241da58083671fa962def5ebdd823547de73ceff9e99cf944ea6dedd4305c4b8428b029befcbe37463273203b23e6d9d4260c8a43908f59625d8c041f0091a03214bebc32d0f949f0accc0a3947d5cedfc99272142dfe7ba11f26aff5af4c9cd5fa1124906d7df21a8240367f89196d819bff0c34d32273718e8a53edac1cd71adfe05b4d6e5d66d176e654c99bed01a68d804e848287c4e8429809141814cc0b4316796046e11ab8aed249ad083ecfee0d1be85845ad8e46d55cf5e87a8e6ecf14350f81153e1d8e5ce0545205656ef967b0fdbe5ed21b58892bf6d0c09001b2d1bc2c3adf0634be2d360567dd16099e925ca775b66a8b4245f628eb3e233903a2223f877330142bc35414beced574af549b48cd257fb7e36b61ede78b637e52410ed7cc5f9adeb4eee42f2089be5771283a03725ac613be4ecb1581d1766a7a0df13bd2557626f7f008622f4bbe43aab4579ed41b900fcd01b36a094ac89ed50d6805596b854da4a7fc53014301060a429f5905bda9c8af5657b4883fd25a401e4ef1e13a0d0f6445e103ac6078302b0a1e66c5e2835971f8302b1c1f6485c7cb3e0e6dad2c8fa593ac6a7962998c06fd9ee482e48812915a9ec75fce8805915e9e6da2de8755e4fb5a9eca2ada65acfa948f11c55691ef6b792aabcc8eaa5aa58aa2307954f0b72c94c7ee51c51ae428761ff69d4d2afa5a0c185d2030bb6f14dc685cc9db277a1ba0a8d790669e52cad7e4bb15614099e3823c08d8c4004bfb410ec8ce27c7f692535da3798e1f076129cd68c92c23161bc93f10e9737b654d38fbd8c4ae5df0d4bec4c89ab05b2bdd874ab3b3bc8f27ea840622f524c2c1da162fa3f979375af46afe3b2e0848be78444c64f103a3d9e59958c3a288459bdd15d7480b7d88e6ce8e7ec1a011791867e254c9b17b3f71282188df3e591a2180df66d2a687ee0c777d21f59b8b837a7b1ee2209bc65a9b1a32b434f297a30870b9c082a3b1ee097fee48150c2ecf291698e11a208c1b7093522fba1adf1302567a189c67cd38ce46ed071da72d9e4a7304bc8aa0a50abee8f68c812d52e952ecfc74be74524ea69f1f9490b34c3fdb130fa8f544780e4cb15bfe962e5c6018a332ddf84de8341ad3ad2d0b76376dbb5f4ef171c9b3b7a5280226a555e954cf235ebada44d508b2c3b59d065219b7d72f8c426b04700da606cf6cd1abc4c0f89608126d80b930843f6e01750143e586933b5fdca08963a70a7003006ded367efde510b6f9f31a19d8e5e57162384288e9fcb31956ec9f418b8c51b4803988c75337653c6896fb3a44ba4fa7c37700e33056077eac0f7fc2a73e6a1fcf43dd131dcd364578c96e47697ce710c5393fd7eef4956b10b4d5655d8a5bce3b35b01d7083fafb8038d2454da1e412a40c372faa8efa9d76150b1865a66c73fb96d12e0408b1ff6baf1c45c46314adbba3d02dae86d284a1b22ba77afae8f8b2032e65938666767f0aaa8ede779c7f729dffbeecda3ee269973ffce7660f63acfce9d8cd3e9ff19f5607f0443ad11b281d9f90087aa374c8b2c603c06707c83f4f7f8ac9cbf24f5a1533e023e64fcd65a86cec2c857deb56500b42e929a839e44864839aa3f1cd6116145d0489209b111b24f1cfec7644f45ec79e91fcf2b3dfdf16907edbb85fc9422645f85360f16e677d4e0980ce0a738176c2c077c32a27ccb946931b39d5f1bfdab4cc63b1e67e4ffec8d51afd48594d9539471a0c826d4c7ed295088b20769aad2860bbc5f1725e335eff5dbaa63917d4d753711bec124c60081fe8fbeb9712f77ae1127094acc265c4f0dc23ab131f78fc654d79ca3e681b596672afd34ea98d602189307794b53e7a52c10784aed42a410fb1ed8d0182da67ba8cea0a76910db98cbf855effd234bcdd26653711f805dc7692915e988a4d66819a019609797f46a0bb79e1e5db556f8da635a2d97d2afd40160f37470daed1dea082c3f324ac413fc3c9939d388013e7e7166dc694a23cc9bc9bec3c9fb9a1663c6d19ba1d7670ea672fe1bbd188864dad08df9e554c95c090f84d2a173b5e0b8a76a46ce7d406226fe3d6297052a9609f784b43997c9fb28b951e22e7af778d9c98385f086b93e2d8c6ef7eec681b0209c2a78f92695197fb3d48d58671aa929f45b5df1e17b92b092716396912b6307fe8575cd10848eb528940d23da8929698fa3f99688dbdcd5c97ff39fc812a41859af3a36ae586b96f7d8c9b46a3f1548064bf54777cd068a87c0e987ee6a9e4dc490cf473ab805a1bf62003adebb1cc7d4e15e0144602538b6cdb564c490d29145a2fda0c1dc31f69c71b20a29651e9afc7f00b2ad15cc19e9b2c1a0b36ec20aef995bc86e467b8380123e38ecfbc292d3a10ba0016bcb5486efac2c3337c0d457ede7c14ab394fd55f6db6c02756188b7ad830c1cb77b97a785ed6312194973b546f1b04e02e8b0be33f66648343a28c01cc7bd467cf3bb3af96e8d219f6b9cc02bfe0a5fbb589f00a2f6ac70b63f4da37a1b6b0bdeb7932f58033e578d6ff05e5b06ac3c04ae279be81be7061a34390dfd9d449e5ca0180434b8cecbf5193aba80d89849061fecd86b2428677d1c96cc68b4ca6d97235d3dd9a166e9f47ebb19e22ba9b2b336bbc01e92d33b85d4026e93c39554c51ef04aed60471ef1d725b8517d83c8999a553b0dd0ed583bf8b9c657810f1f228bbb1ab05f5ad1f5580410b3dd580a661a6efcb1c1507f55bd1d0354f4d5ee1b7eef0804256bc002fe5735225903e5450c7762817d8efbb848fa07bfed0cf2f6394717ca6b26d49db279353d17a5a857fd9fa7ca0145e87ce2303335afb760f683951ef30d2dfa5801718404cb9b8866cd71380aac65193cd0b7b34774643e9da87ea630f3bb3f4ec06061fe8a47fa240f7138e442908f5b438cde093d9f4d8708a11207e4a22c42fcb90651d93e39dc846d3682809b65fe787b267a407d3527bb92283865c367e6d6d9f3709fd98e1de5c88819d38c65b84ac1262db3f61ddd8075867a7f5b954ac96fa55d950cf07461868daf60d5c1dcedcaf5f420c777de035afe22981a55db9f898dd92b56b07d0bed55c7ecef15e6951275a2e4eb35b039323de2eaf77e7f2543723c29e5c7d1bcd497ec821ad2b27491402afcfaec07e50cb17ebef07a09b81045c027ad925c8a880583b0f0db1fbb451049ca208137d17113c6a47003f5e55a83d2761bdab32b987e2743007b55d7f4b3b098e02ebcf05d30c9e62f4f463c2d8cda82feec9ea1458c0686d6387d1bda592cd4744cce142a19e0af4301e604eb992371659eb1743c21817c6ba6dd21354b9b1705214e846aeb75b3e65e418aa538873306de2dbc5da62bae8cc98cd5ba50b8d73e3051d2f1c4953eff55d26caa4ecf403025302e92fb2917154912d60d2f55668df6a9cf0b51615d42db840792c14385a254408c127c2b67c64298da5b4289cc13fb16fd8c5e671e9263c6c634a6c5a34816f941f93dc8a997463d8f5e91fa8167d05a40c1631701a099a0ee93d240c7dee70294748cdc10998438bd19c7788c006a8669687cdc577477a839264179fd28fba3b6013c6a8e294133f076164b74143aab6afaa5a5ff510a29ddee392fd212410164dc0aca9adcc02045cb81731cae17ccf8b6a0190cf4ac78052648c0cce87406dd23a467c7396b79403743a8f1ed78cd0355ca4a18001c4ebf263d70a3eaa193f73ef30e4b635a3521b959fe09c0de1b8c1ffe1ae74a1ab89078977513ff2c22a57e412a54bc856a944a2f501fdb1d43c9d825faaeefae3235cc2270ce4a11727ebca5013d0782005d0d79108376b96e31b333e8165136ea056f5dc6ef03a61c858079e465e9665e48d52bcf22693ff23048d301cc0fbf29d452c0d884f58212e706061b05fe2d49c444666a7d94ca4c20a46efccef8b96f23e2faf517e45c7d51f5a327fd51559ff8cf2f5ead2d774a89d2af2e3b7267f6d83f0fd03061adfde81cbbe547ebba0181f926cc43142a230c9b00d2ef77315f3a3d54f22d480a86839c1f2cd0d502c5e4a4d00cb7242eba11c5585741d03813c00d00b32f14311dfc2f1fc0b392680df81360e5963dcd56acdfa51d18c1da3559afe2e618e72b43b9f19c76858b8b90838b759ccebfdf5c1f168d44ae2e3605aba29b290705d8b26360a72355542555bb625047980c968ef3ff744410508ca274767575a0e9042ba6ea59bc03128795a27bfce2d19b82a227b07685569fe9d348a1afee185fe4824b65582bc8f7bf053c8a032341da8c508b40e145efbe5ddb94cc89b29d4441db5414783f6a5178a36dfad128d8d7d4cded516cdb4e650eca356d6e7d905edeb7a93e9737d35d025d17e9c20fb5461446b73a164c61fbf55945d256104b609115c167ab00ca017645154b2b179194cc3abdb824aa7ec997e0bece6abb95cda6a45834b7547673353173ce06756877db720f1373882946e3055d826e30db73f4282ae51a2a7571e1e4b7be5e8fac53d2acec2ebdab9f459f4c7286bcbae295e8dc4f3e300ae3dc05e3986e3f4dab7b1e5b0787a6248081cc46f9f1c45c99a4e4754d752e1b420c735eb9f815b7626578c9e0d773384e30b794155ba7e69798fff2fc37030ae4c2dccb465617db2fe122500a30ce10106b8d16a5b1685c2597c23e6fbd648b06dcff02087d0eea5e566b2cc82304c5b87384bb3dbbe02e208d5dc0cfe7bc3188795048881c480ce0848c24610e83bb518eafa0c7f811787170eceb94fe1f619435192c8076b709ab89c09502273bd935e984f8fbcc055b0be8a1903828c7bc728da876512589d75b56d91703bf387cc915b3c9055c2d4863a2019a5cc7a5d2978f864472182ee440a3828b2fd834766b246cc6bc752c24762f38b9849097492ed26ff799fe368b7a73c7461063e505956809856ce9a9baef3be8f9bae961d010db5a3f56f7aa4487950475f2eadc4d7a31e7ae6fbcdca5ffabc5ad6b0384ab4a35a8e9d7880747986724171c0929e10b666a23c5d10c00ae36b59f8b5d9e21217dc118e28cd28771ed21661d549efeb4adb1e15e9a28b67ad42b5152c2dc990651bf67cfa5ce7badd78d213196b07729d8204bebd5b0261f2603d7df45ff6f40c66cf07f99ba2a337b4fbb885defe7dd647d6e05b40eeaf8c1357b60ff19c25cb1e8d953a21fc4a822f2f9947536f7fe6818010af95683b4bb2bc06016532a358c54a8c69fa150b5a06f1d5d5a4b973fe9241223f6145989b18bf6dd006319a5a949132d0cc0fe4af537212ceab2019581dcb0ea0037344b56affc45df40501a9bf9ad4241dad28a46a480c55e09a53d807ed6ec561e6fb898597b49e64ebe845143761ca22c7be22de47aeb66f82a8cd886c2f0ea79e4b85e7d3d3af1c7e52d964826a1d89fe548d0f831c5f395f25e186d655e3bb01b8d45922080537bd5aa34b54a053f92a882c0e34879671e2f86ae5baed44e540cdabaa129035867cd5c7848382952a6ed79dafea5e0a44aff2afaf8c116b9852b813db5d0be15ffc146cf94034ce29f85a674e0dc7b8c309c1dda81819d8253d7ef52f26004f7123c173059af2ddf70ecf4f7c55f5a0df157ad3c30823c7a90af129a85b79385fdd5d03111194d29937f04c43d990eb9e45c368b728d2d0bc4c6752acaf3d2c6dc21cec8aa8f549d1aace6388c80902ab98bcf1f64aa8d22d7e302a7dffa1378a772b528f2ac04e248fb9f678c07659c44178199d17e70c1d76c1f41848422eccbdc21ff7af7b7cbb0007add1f5d330d00cbe607ccf00bd4ad04745184045e1a4c531a9e59711c1c84c4324dc78f3d65e7581f93f720002a8cc55eae4390a16508fce0fa1fd3c66d60f03c0a7b20e0a5009c45a1069de39518caa3544783c59463861eaa171f2b000397d3dd85d00cec87dcd0e1b28be8b81afc634089f07990ca0df59cf5416237ee4d9faf145c6fccaaca71823a16e01c23db5174a5d7d16f9c305005006ce714e3bfddc45ae69e0c029e4338bab096837fe6f184c4c99982706af60277586340d760732ad98bd48ff63175b8c2bef308364efd55e0556ccc47c4b488e9b15cf94bbc585ed18806af5c4fd43cf8c6c5ee60427be1366c77415c5d067cce709c6e9622df8528a56c093b4193fc61141f224b1bb91a99cb53626dddb7d4eb8d31c92a04de28aad3d8fd5b650fb4b80d28b6aac46244f7374936304dca02720db9509773abe8ab9e09b7c2ebaaddab4861dd0b846d05cbc9ae9ffcf1b14b9d463b007d1a920ee857b1396cb00679449e9ef8e997bb2a5ba4e957bb6639a1878c37ea74a6c4fcdecf3a99379527affe77ebed7bfff1ed537601a4c6aa3128d75f40d5f86ae6d8238dd24369c82b8a3ee6a1728e939ad9a9a824905e6e39fe26b83f071923d5f6835335cd9d62e439511015ca43522516161e000b3dcb2c35932e47e4ce0f9391ff06d9a92fc1647b9125a34d342cd1d6940a78a25ed16cf9a5c53e42f472b1cfa6284a1f142cafee9ac9b22674214062870caf5eb9a4805b0aff17e7066dad10902047e3e7786e8101a5bd2d3be2e8bcd12caf2eb891459b9d1cbfc1ea6b535471e5ba778a1450bbe600ad217ebd32f7ac423442f68a634d2c60d150443667e8d59b3c601179903a90d4c62e15a61d5300d437afc51bc079ed20173ebeb9befddb8724da90ca8c88667cca6fde30ad32271a547de49e0ca6895a5e44d054163402f2acb03055c71e1d6d8fc1e5ca11c3197fad4b3d54eb9524be794343bb4b06a2e5e2620c35f8d4a290205a5d8a8136381a24a8014f0c57d73b619344136b6c7103a913d406ae801507f9480c5b2ecc435928c3cbad5851a0851a519612e93ee2e9c9a68edad16a09ae66b2349332004dd93480b6bcee4226bd2f76d80fc6fe7800cf05740546e5b739b6b71d92d27ac2980d25336566d790e6044572f01cb7405758269f064e3f7c7839a9bfe52dbcc0ba2ae8f55e4b68b4920ae2ceedc5415cc7402a129d86e1497094392d3e138491a69aeb176dbf64b540c99146bb7d8e0bad552e1d073deb613e9a9ca31ebafc3f2a2acfe9a01abdc586e5f0fe7b11b0638aabced2ae5e5b939e9d3af2ee99eac360beba6939483a59d5729413229f87a11761550d67a71386369507c8c6ae490c8122a466b78374a602ec809334c9e064ba5196a1849fb279a84aa88b16e194cfb8a74747ee2330b07fbf098c2032f6f3e5e529dc9a9ad51b14aea54ee1fc430fa75065a8f5c0ce33e9879b0feba6abb72ddee4289780a3166cb365ba0d9d6aa5ca7e65134dc2269960450d1147322a6ce4c352c9c0d70a2c94decdec4b99207e837f067150864c593dc67be4e0227d858e67e32404d48e7afdb05eeb94883080137004c125bd6847c6838b38a7e02d4d019d003996014d8da0e565a77f2d54b91cbaab3a238be6e386fca505c171a55cd5191496f8ff1693a36958be4ae4d7328427c8d2d506d469cdf138c631cb28a0cece0c0c96af0fd0537ff7928b1cb72cd3ac86fe3bf652345263a21154f7174735d5f500c985ed0eb5f5638d28e204e3793b5b71610b6ca120a683621ce43145a6024484c294f8fd73ff4b8526c4274583529fe302dfeb23043eb2179b5d4c40cc556698308c09873542abe1f516705781773ad7ff0379d30e94ff31d3606f0d24ef52611959000064ee9ee60b09c9631e4714b4aea1f01dae2783c4016e7616f4bd42a31fbbdcb887624251e08d1aa950f6c8b993b87a1b4d43d8837b537a76f3f2250bf777f2c05f13eab37a9a797092aae84b3c4839daeac2d0cc2f8973af936f5cea1dc14ab43a9ec7e1b04e95ed5c0ebb5ff146967ffb7010e6b25b237795647e57b799d2a7d562c538e64c1031de50f0647b0711f28d77c63d7e78aec65a3fe3a94a8f64aceeb568178d84aa715516157b9dc725f610f7d83fc2cd199e71dcc57e170ec8571f1829eb8e818ecb06a6069ca32c4c5f0a61257c1f13cecbb569e7c971c2014db186db4ee4aeb95dd276728d8f175a9bb207684a6ebd07445bc15b9dea2856b959ae6b7a381b73d8b989021fdef785e7e1f409584d440dd869427a1a7dbd285d7317406159ad550208b4eddcffabd6a90f7a5e3f046c3ba4cc39f435f113ed3e54b6a59a5d4da43baa96b2320511d3e7b5739586ce4b9b4d5061aa5ee5e17a463c9a9db3921e4fe708d947d4983b43ea7e85ae58e4ffd899224fb83f904bce19ce386cd4c8493da86ac0f0923e7958c17dc2b34f0822c07561b8e73a4c7d7d29d43415514095e402a47180ab1b0dc808e72c43b303ebc301dc3abb72821c063336ea003b75d46190856370f09e985a0cc988e79efe16dd73391531540b79d67f37f157e24b2f402b6e1d45088fe88574c2d077419d1602c87e727dbda5726c5cec2f76c3e8d68dc04f2ac0fc84f2f4c580710cbb0ae04945ad3b5526b2dac344b15b0f0e878ac0056cad88b52abadf65940345c2966607f065c307f4259a596d217e879d325e6aad73d22fa5b96a7e6c0b61f9764ca3f88748e5ab51f2ea50b5d45c0281dc40de3474ed9a2c12b4ddee5fa8177fbb1e92f076d19681a7ef7f50dfc65bb29593334de6524e05be59d192fd7e190b1209845944d99701295a6e61776faf080ef1e95dfdb4bfe1b45109d32b0da18ec1e3d678362d78f95ec6d6e11d1de96202010f39581100e5e99b9f0d7215e5c2710034596ff40ddc22f3b95f427e8bae4f56f52ea7f16fdd54b2aa3d3cf9ac2c4365b5618701039cd6be4c2bbdb2e26db2980781538708ce2a97260ff4e28fd0bd2191e0d5f0a4f8e53d559171ff3856008e83b734005251741fb871f52d38434feda02b7f76f540fe5240e7081279944e1069884fe5b61906dd5cb550410eccf64529d1c38178a83c697d2e457cbe329cd5a55ca0cbd6804045e27e3f9ea787a0a1e736b54e343e24e345d7b52fe2400188a8a25233e104480f9372c90631b4bc23d088e8ffda4998b85e62bc1db74818a26ba832be4a4cc230136435baadfc749594dfdffeebfb886bc7d65109b7d8f22d793c4182dc595e29d3d782e848da09d3b9884f579e3d0e2514ea9ff20c0ab07fb29044e6118c032e74c57e34b005f655fb9ea44a7632facd735ddd019b77019c22ceec4020f38f2099805fce50e824291139699df9bdce3648d2c62303c385473082b1f7beac877c3440cdd1ff5fb56a2171bcf1cff5a3a2dc2ceb81ead6370064757f2f723d4367d74cfb844bc70a30a0257117921e1111539a9be4723567109da9835782a9f20bbb806b9170756af646177f4f03dea0df36b690460d08af997d0e9444485bc455dd903f319cf5662de26260cc4c72acb8ce324b2da208172429a495db93770a700c29f2b4f0987622b3e2d9f38ff5d1c772faa0ca58564269bd738bd86084de7bca50cec88e40a48b59a6958a775d1f44276405fceeb1a01ead68d1669f0cf8a00a549cb15c822f0abb440a1d3c6c7fec76bad23c3378bd828350a4004d5b36ef71c3fb69a6a3474f7d634fbe4b0f6e9d37e79e19d8a68da8fabb7058a9789c328b49d69a16340ed8945f6616591e772dd6b7ba7966e000e541156d1e0414b210d0585a5f00e02d5df36c52a0e4695964d2e1de622a1c512ac79d46b6268913cda3940bfd871f242a44958c49a21172ce5d4b4e4c867e7e5baf292ce38fb3de3a9656d235fbd4e8ef7286a18c48886756a61488d57aacf620939e2d7eb9020c987711ddb4d5a5d49cda39c7950f87a51370afc44be4afe17974d0cc398258b249e77de998242612684d80560295086a0bc019d4bce5ff4f79ad27ba158b0794e4c4ea955662b7cb191b8d5c3664172ced66904900c4a3da49175eecc477f0ad48e1defc5b86e32419d9627572d11b600e6e8372dcff9b5bb782c75ad76ffda84a4c98a80fdd53a260b7d64180bcece3e2ac3a0ab5d33fdf194450c2570dc11212063ab69c4125d2fe491a1d9ba7e6205e9be5fcf033581f800621a1003b7e2022585925f6fe8315fe9b518ccf2c2430c570020afa228322b66d9c8e439b3889b7537b08d3a96a92ecf2defbab41de674d2bcad0f1213949b572fb0262a93192150660cd2a20a1620b3d4f964c5a05cf875628ec36a321b4cc922f40db21c5a4460545dc1491e63138f6bc0488e2b3a905ea35b79d929f973c80133f9ab4c56b39173925668399984271c3fa5b91dddb061284d13d6f93916807c7c5274679aa560f7a3bd7af7211b67589998736c1589905d4e9a168b0b8195efe5b62ca4cb3d7adf4cbbed0f1fcd73d49659fb2ca40e1b531503690274c7a4d12f692ef2804d0fc4dad4fe5e325518dbc6e4b2b0330c5a4af457b8ab6b7500e8426ea4e598189fdac0fe21f5394316170d4f0c0330e2b6e9fd910550d89c5b5f4207592f9f8a00ee289e726b2d29f83064677b9ce1c1741ec4767967f4977824f0fb62a95f0c396c5085bd1aa307b4afda449f432224ba5796eff092c5adc3abe8d58c630d552b8116eb0c4f1e03a666a2e128280a433d64549a38933acc6c8b3f7a84018378e4b9499cfe308224c0c0d38062f604bcef9d569403cdbbaddfa2e22d1d54534adf595d892d69db0a32e64ab79bc9b41c872159e8a1dd147154f920c4e22dfd9fde17ae53d451e26121634d893992e26349ea94414078451c8ed65bdd651d4b406d73d5ef57bf0f1356d058eecf599dd1ee0b0f1b099de643b9408b509e5d237fde778846a8eb059d5f1644182e7562864037543ab4a9e62391435601f2cad7def6cd941ae629f22704bf0d6359d6ce1e02b457905fca60ae27831c9a8797d37820fda9ea32104ff18d04f0390b27675b9fe111ea65389d1365f5e42d354b777ec056cedcc7f2e2bf19aee120474bbd00c6e90fc55e509aed6fabc5be1342b12ae9b94e16b1702a295bb1db8a34b3161e3cafea8301f55e5fa87e999cc78ce56258d33bb27612a4721bf97f839cfee17d9908dc4c837b158979fa36ba1d77246b545cd820401f2e765e3751e0095217d1d60497bf7892253a3e4330c024dac4ef537df0daa830c79e0a5ddd8da7593d05bbd826dd6f834e90e2231b3568083c52981ece22ccf2cfd04ebce6a22ff3c72d96d82c227029c7ee78e1f8994f021a886477ce086866946d12ccb94edff8d6f44261dde5558c6bb7cc26122f3c7adecde4d7dc645a151a8ab37fe08ca05c842aab2c0b5e8e7eebed6f3b77d21f06573308fa96e46946163bc9a26a130d4b5b6f58aa6437982479dcbb15460bed2a7a8dfec467a91607da1764c929730a09ae1847be508ba8befd296322664ebaf225bd6819a34fb03fc969908f094646d80067d71056750552bf82ceac6fb88b1b1bb55c24eb335a423941eee558dc617e5112756f75aa469863b2644afaccb273bea436795af8e20f0ce0e86d61c5fa80823efe1b7a29220756f8c60f59008f3b1f6d36e8f88781496348b12197b8053c1609052d2bfd908a155f9b4cf4307791d3a78b371ac421eaac69ff7981682f2157c82fdb82291b0a5500add78e0b24f282e84e22bf9c35ed5ead2a7b66cabb2312b977ef764e071c1798a9971d97b94656e0bfd365e0c18bb89b70f4f6e08a015c057c1dbc728426295b06538a011498308809e5d7eb5ee034e8c4af5e54d121f9778f50bb40e27d899570d7962a4c2b2af2586ba907f4e312348396334b5b669d52ee03bd6316742883174e712640272283b633fadb1171a7750b0089c0f59c9c4945bfbc108aad47b8914e74b647508d3354585e4c12983a86646b0fb7b962e605ce10b6950049eee364c816121fba2b6ba1fabdda18502c6357bb314b1d45b677fc6593ed214b21906c1148891ba831e117bedd00a608209d8e30f50bdbf7dd8de1ae8d4304a83cb083fe1a55ce9c1c2665af0930a159fc8c7c884aa4c6ab8b3c3484daa5f1969cb039ef231b50b922fe04e7c8a950e2f58c0a73985fd249ae4034b188a4a55b03bc8557b797fd8a92fb03ac11f7ae23b3e0b25a31a85814fb4dcb1c4f4709fca56348df66419cba2ac174dd4699817e83de845781ea14bf064e66d2649e02c81be63e9cc07d9a99050ceb05281157d948330481886fa0fe5180bbb31aab1b7614e62513c27303ed46f10a8932d78d9f10db569c6fe10d015892f0198bb18dd0649dd74b5b26a4530d308ce30966128b2cdcbac5f2374ffbec8d4b1022fa64466a1bf7f2723ca1ff63dd9702ac3ad5b12c935ce3929d3085c57320828dcc84437a993052ac557a44f6972ff6b3fb863a650528853392765d1f511288e0447e6e868129d22c17154a2d4133653196f0b89690a644d80b1ca27500c7ba6a4377eb31590e0974cf3d2411f9f591f585884ec3316c8616b9f753021bde65539eace988c9886a10b868af88554cf11574ab61672d35e4bbf930a91db9229dd09c4924b5147685c9507d71e5e932083491dc704ef46841300005720d61aaeba714d47bb22a46bc317133aebfe3202dd53e6e8e42c429a90d0e15bb4fa7115b97dad808d0c9548ca09aee47ca553a036be8d3e78fcf05519c1ae66526ba4f9b47721c5a51a5c482236ad43440707523810039fa21267ddcd38004a8817cd4f8287f1f01e20888c7348fbbafc31d352e33aeddbc6f17bcbf609be74f4b9f65cba30d629067edc8165c2581c83066b21c45a7abc93665fd204c00e728bc36e781a85ac913b34075168d17f11cc50d12051406071009a3467ebd281765cd232b2ba31d968cb3f875a3254acaa16fe29000ec465b5d428398c8e07c4cd65e581376515cff57081fe28d0627132144a056197fa34796959ffc413461c8c526e1aace32b7d40a2d55ca7181442e88295b43caea10169cb60bb495645382fd9ad6466fd0d382908bc91ad89510dfd3430f931fe71ccfa19a8c8b1a9afd6d61e9338eb133c20436a106b8f2ca0c442e1964782a119a5899a2a60aecc2180429ad76c4459a1c8df09cda686e7fad0423f50e9ec2be6eadf039babc5e0d9480d3f5bbeb24311dc2e28a0a89efd657bf57bbc84ed7c2cd9d447e18d5366114d4e7e74cccd71ce4767dff46f062bd705a020be2921f0df3e5cdcba882569ed39660307fa1ef9600853100a2f8a91c543ceb720194e7df62d505789cd811108815431cb8afb1faca01e732e0c81f923901bcb24737f7cf337306c0145718cd5e9a87c7837aebca63057eb86f6d8688c01af5ae3b50c58cd26e3793051e2e24f38f49e5038bebf429203ac0696d196973ef94ae22c2fc3cd409b7a1af410b6a75399255a01cbe82ecc38282fae88aea51e21e5cf5b5024730865e07f43b7d392a248587403fcdddef280c7d52c26737465282f0466470ca1853d42f1b09d4e0971f314bbdc42c246407d148572f6bad0a2a99b8aae3947ae32c1620a77b6f814833f09781bf092fa7decf5d0e1c5e0557e61ccf280f19e7c1d407475342cb980cdf27e6a48789cc940ca21942c4417531ae6ce97dd792cb33e4c0869c30a190a8063cfeb3201d89472075269a5873c21708069101a2df33c1dd8724ee8093ad5db20ac195bcfa3cddad855f7e72bc20b7685593c40768d1f9ec18a8788c8940f419b980bd3baf2f6582ad62e1bf5e158395fb9f7e72120c0ea7c598ee31bbe967a450d118416b0844e84725cb5919898fc234da8fdd01328ff0d8f2a4a688f38c017cf17a29e52df8e56efeaac180b79140dadfa22d07efe457ac2e5362aee6435184cdf0967c716dc426c2f2a266b8180d26185176cab95ad9d47de8b8d6360146cf5171d08c2fb644c385cd1617df0f25aa39054166dd91d01955aff02af59c213a30e864e8d9ed91e5bc034045b126f289f62f19d2c8b75550eb0877c6160b968e6ad2b406a7c9f6d196de1effae5701eb1c19cd6910d67f893a520cb2bbc6b49b039be282744d0d072870872d8ae36ac20570f819c0ad844faaf3efb1975914d331dbf90046396c4fd9a18bc65656b93f5f115f18da87668ff5a6274dac9fb71cb28adeeb70e8592e5b0aff17828c6f6fc280e6e2bdafc13b40a4c49432e6f70c6d72358b0c99dc5452cf869101315a352252cd3f388b24ddb2606bede44ae71f17e69eb19a8ee57175664a237891533f744d8b801298493fd7acc70003cb01154c62f9ebc30e15a6f15c968740659c50b29378fbadbd2c70345970aef4dc089f60060d141140ce24b00ee91b214d75a341930ec2e8b264c9f986d064c3df2cc6bff99244d03d26188be8013c3a82d3c07358da9675fa7223237cdec4901f56057cba593c1ab9980b739f4cd9b0c000a637391357b2ae84dcbd6a500973fa69de41dcb00ea5b2b04993a5bbf82ce0544d74e19b3a364ac644ebf9214751aeebe771b639bb04e1f2b0ec740ad11da56cd1fc3a403ecad342d77900c67eb2ba9bf9353000c2184c5709c2c0a6e06b91c708825ee241479ddfcda511a80d3e06a6c0347ee795d34591b1cf3a4a87ceefc7b53f69e1c88bcb5c7b2ccd06cae88efd826769175b98dcc45b5e024cd25869391a6f4d927514c162ee83c9867397155c9bb1d6395d154a389c389020b3f1261eb239d26ef9baaa0e5e08dd877d4227af215dcdba9e7509de84d80eeac94f3d32c8b1c186e1dfa51a30b0b593c53403b7054889cda74f8c6ea2a4738a39be530016c312809be4916ff70a6144b12061c8e60a4f747a2ef25661b41536df1acfd16250ac297304638503e085d43cb090c1d6d7ea889098548d078152578ae4981aaa027cc43e161ca764de55aff6115c602e8dbb2957efb918be09a6bc090f547ea2a5077ef2645ddff671cbf5352cee8817ca51ab3e8eaec63e7ab9b4f4fe0738a3340dc6c50e8029da3a59549f7606b20c30ca2e3a41580277083ffb3b3b0c2776e447356dd5852fae2bef399a8354ce4066a219114fe26d1fa177c59ece637dac5b6b5a9dfe83a5d614cf8a3d28792f82ae5e4bf70b5b495a69c0dcc55677e2c5835d70578a92c5689690ae98c760d26e6a36163bc906d0d358bc7cc6e23e6007f9803dd2023be12922246aecfd2624f2808349ffbb8cdb547e70798658fbeb00202f5c611be276cfd0bdeeef482217b1e68b23a9954e1cd91847c88d00237ed8d89a33ccb432f930d2c30796d595c98a04a9dbae88127d784dcaf92edaed414961471307216d4173124988793c1ff29b04a7b2c6fc82473f96c13621e9b9f9f5d6fab7dd671abbb86646d709bc3a62ba467dfafe321cf2b59ffe540fdf5bb9f7996f25ae1615740386c02c885f8d6086c01c73e7f1e46a09f0c10163c579d80b150557bee3ec4169780716d001cf25d587fcdadb15c7c1238ab18b5d732bebbd728486e8c449bb5958dcde6068c229fa4a5f1d0b37cfc8e93892c861a93a16b67f4b6d629c253cfc12116912a7528af695f15f0630dcd22dd5aeadaaa55ab55db534abb669bb66e93665d12cdd154e2e8c907aa6f2a5ccb2008a3a05a8ec893bc70e950aa265ec070ea7231fb8511d3c179222652b2602b00be6365565fe137537ec676ffc1b60f2417830c16a414f57dc2fcc9a5c22ac88649b3997645eb3f846eb852d45480ba131efe360c1ee63b8d7b62f262bc24a22dfd3110d408537d00e7742a11eef2288c35e5887de6d9453f1dc4abe3c257fae8afc5f2715067ff6e6226c11ebfc1801d609f13608380bd1b8f871481a2f7d752cf2e36f70daa81fbaa8d9e9c3aafaa5dc21c711215cb2ae583fd5ee254251854dd3169d5accedc2dc7606e51b9102d99677733afcd824a9c046d195de13547cfdee18d494a8bf5402e2c95ee1bf0faa8777fc7a7d81f33ff43cccaec1455fb2b0b9c64d20447cbe852811d3b54a1d1b6c3a18f35ef52dbf0cfab66a96db78b67f1b01174a0154dfa3c5526b376ba05e0b33de9e70735da16c1a67dbe0f55b655aff146843936fb12713e7d6529acb6649efaf2625c0987d242fb8401b5202c790c7e9f030705cc48a07566d6e3a4d10b578da4dde64b75c6ae1a11bc4a71e5cdf31136db81ece6b91a3530eb3249a78003edd090bcee91102ea4ee20020e73ac92a7af10a348c9161e6ce2a6cb848e560f7b2a36d8820329b916c87e27d456c04aa38794014c7e0c75f25f0eaca91b8e4ba23074c0a461a9b7ea090a7daba4344c0a4e714db56859c6f18c8efcda4250626ba3587fd601dc65d140a31a8addd42513aaaedbeb4b394d827d1e4c23911d04a646e37125b4c9da9f14f84422006b241cfa89c94bda674ac2e79597ec0002d8e5a0a8ec5c7d4df42bf1b8dcb70815beb1a5b7238833864d7b3f9a9d242a5690b72909ff7eeebf0b224595a4de046d72b227216019d590348261bd3b8c101e6d3321384c01b74154997f4a189fc6b89f05c47b7895869eca6ed9c07ea2fe4f745b07eea9cc8a21de7ed59a2297d56801edcd2a5d4b42d053f94b0898f2f91a4ceab0e2748756356c3023d9b9abf66011f1f86e40907ed6955ca1e46107c59d250ee957969a3bb2bdad0d9c88bc88730abe86ed200483e25619224251c2feba259ee36d4c41bbaee398d4112525eb4690385c61a06925486880d324b59936a14334933fd466e597842d4bacd14695d121480a8ac5481d9df785b5b745e1d5be9277e0adcebf6e892c064e84c43e7682c952f16832fe02d3d04100e03b2c7c30072411cf36760c4600609f700f23a98761408ae64d0fd6cf815f825c991e9a408b03771b6dafaf14501280abf999eb97fe92284eba46f61f0050556ab0b0f0b00ee19def9c384f251d19fae21365943c8d5760303da6687bcc79ed76425a600a7a4d47b6bfa053c0ee1df28808f8058984be1171e603a551d0327c4d4f900d4d194222354de5c9740f916e0af29bef08b4991d1355bdef8eab4e56e11d8009fb6989c34dfc26f54b5bfc4c6fed3a818172ee6fe4b3f43cce1f1460e48dacf8c168011d23926ac62a233cf22ccac05846883eab611c481808d738110c3bcd33fa009ca4b9e139320fac914faa2662163814b742830c2a4f6624fb293eaa2512e3d44e184a28268138fefc97969e8ac9e1ca263316d0bfaef8dcf16431be1e2611867e5f4c2859a99d4d21c4d245aaccaa80ef5f3f8e03b7e03712f3df87e09d051fa2e8cd23b3d7bf290170d84fd91ccf2d95a2f32a0266046acb2a4f8e0c9bf55bd5e61cea116aca07d348e9b3c25b221cb96212c43b2482e4837c0cb821b81b8c43a4252a0b85d6aa966d0b5a63a338bfc41a1cf2a26f002795fa356f4b192466d64114082d169d90253c1bc0749e15c8394f8313052a44f22430f0813a7850f1635f2bd5fcfa382bbbeb39b690bd3eea64bca28ab7e73eab9bc5f39587cb0c054b8e2e3a0ac2afadda565b8661c45fde8cd5d10927897a67369b99bdbfbaf56404afb408c7c9d37774f2a4ecaaab2e9d19bfa2ed2e1e0a78486cab242d8a3bb3675c80cdc820e293862c7689c1429e98b1ee6244aea099588123c48f989839dba2ec3cff82dcf4e7f2eaa2e9d15ce2d8ab4dca4c7bc311acbc40579b4669c0c58d5773746104e1c40019fd559e55314092e44ea34a314514069db5a891e30d834d8f6d17951b4eaac7ada193c18463bb6ddc81243adf9fa6594162639a4985b4966ea64f84a9ff8735f20e9bd2284ba0481814eefcdd99ac832f3bbe26684e50f5a1b7c798bc321bea86bcb797e5df7c6ec237224f81266603b938bdebaad59fe74665daad944e63cbb35d36f26fe4b98a8bfc388231e8a5f68c73108cf0e2cec646aa23fa8e9a618459e66fb26099636dfb7e77e3de972d276922c67f6ceab3dda434c58591f9e9cdad48641a5dc79fbd237f1f77508b4f7ed34d883229f2b1b5dbf992cc0276542f599efe53ee119a281c061561c135efaa8437b4a646a6bfebcd30df0faabcbcd7616049d4498aa02658ba389defa5c29a7d068f51277e9e3cc8b3488efe26649682da6bf9f4e3aae1173ec1da63994f03af378434bdf5dd19028039cf250a16ffa433903d39344c502661a94f4f316b631660444dd281314d9e4b9b26a88fad1f910b5411abd79ee89a258f25c711ca209139e5d630777b9f3995c1ee6d853f180dea723300306b0fcd4c687db76b90876125d81d4d20d61f45e73130d1f52d80619389f254318641ff4eccf557bf7a84c52f9c63222b41b850ba3546b8a8966f2e35058c830f86c86c202713c652a4d128f8f7361b4002d4a0b43d058c2ba33639d2ba783b87c35b6b98de4f30ad948b94c19cb30f578867fec6ce7f6b7d943f33f0b850568f85ecb322e1c4f549b02983e4efc37abb01e6b8e22bfd9ae682ebf1714b534661bb3cf6dd43bb8833ce340da85c2e31ba44cd03ce98d920b18d2625360ed3ae1416fd4705d5818053d26314e00706816f063aaffac81c2a840e6f29c4c047ab879e6cbdc7ada01552da5d686f3d55784558b4e93cc436c19aa4bf1fcc20dfb3e809f12de99dd048b9753d216fa53f2facddf6e9c781413041e1492d09c4ef03ba364d5437ef185af634ae9caa1264d7d54fda254ba87d15d24b6df8a1095fa02d62d2f89ecf39f127e861f4182c426b36aec5f29e6b5f99bf7efd5058a53994993753761c8ce800fc1c1a5b655ce2447f03b3f2792578c8476787a816d49c2c4e19c8cece6ea827b1bed4fc85102d5c422ca20554fa46dad3f0547811a0f2f82e6baa38b71849b959e9879a106d02dc320052f884d395f243a26c49b4cfaf0b21d8d34c51fc86951d9b47b9216741b41014e9bcf27cc05c2b591e41b9d5d97b5f9f3885f9d13243a48b9285694f8730426990bb19c7f901ea8effdfafe5e9b7279e22244dd3e207d5b0e3ac109c1802541522509e5b9fd371d4af0ec962494472e6535718971efe16e4659c6fa42f78da6dc61e60aaf66f211007f8504e4c49da82b10cbd0b3cc0e0865d83331f60232deeda4608a3b48f11d8baef4897327e2c016e13680cf3b1d0483db380d5eb9688a8edc0716c5a8c92d819bd3cbb59a68fce9e4d20dd85001a9e21069a87d7b0f0184a19d0b7293e0a055c447dd5b1d2bfb6986476d9fb56ed25bba7d5332a26a30e78567aba061fd0bd2cc6a2687fb819286739e9341fef4f08d3cc32db0d8be6130b7bcfa9d1ceee2438c61576c794635c57bdb8132053e7c6567c20e4471164286a0d989b390e72f4f08654582d98f48bdf620abb8f3b05df9ef470f48b47a07a8f230a24562ca5fbaf9b228056ccc1fedce1be56171e873220b751c8611366ca8e3a1f93c33b467034c9074044ce3c300a28fb594ae44cf003fc3a01e1fd953f1fdf3eea679896a4da75c75cad2dd7827922b19f72a68a6e376f6cda897e060aa6b6d41d11563a39a90512abcb1be24518853d6d2819dc63e5d76b2c7991b4286a60352639304ad2c80d6e88ec2717e108d9e5179bcbcb8915ea5acb137f6345f435c8c0a003c45b345d8b2c88c2ac2e804034ee5f3e80d5e2cf5ac9c3cf4f30d8e7de97ee1651373a9081fbc13f0a6ea98b77aeda56bc7f9345aa7ee16b36c2a0af27bba418b25a1267d66adda69802f7c7ae51e247faa6e0ec8567303afc6f2b9ccf1b63534733f65bd8da31a995f42018de28972976268177298232bc02208c92c2edb0487b4fdd9a04b83291bc55b6704e4ad89d669d72b72e087cac6f22dfb171021635ff34cd7b6a0b72d971d3920a0aa23ebb545acfcdf03075f809e192af0090852d0bbe3bff22416a4f25d0bdb6cd51e9901b7d2936b651d93e9c08b509abfe5d7226c45ed77514dff066b5c3cb7d77aa949c7ce50f1f960ab5f3df69cb51fb9059a344289fbfd82b34c7e36ac1d06c6706e6c325b1f965d4dd395247416f834cea05f4438e9536cc403ddabf86086eb7f4440e7ca480f109695b4f1cbc9b0d2abc04b825157836e25a7f34b4646208d56486027fd444a0186deb5fd791c155c6b01754215d882daf4f73cca77e4b015ca6d8b3f18d9657421b81636c91813f7b355972842bd04df74361dd9dc913e0a20e9eb2c482c88c97c315ea9713723caeb2cc1274b4754ecb3ee2dab3ba23d8108231f656e4f1b538b25225398fe82a73a614a36e43c8e4fc5c4bc9ee3af621430f1765368d026e93ec0f4c9c358ab27e8718163c11a38ca72585e0a00278962b3671b2e5ce71b37200e9faf463b1ae6a9fed3e2e1db55930627f1d289244ed74539a1b88f39b11358adfd2e35d0f17e590f0850eda6b22cb7561c9e49aec1c5b9585150528b5e3d594d9bb52f62223a77cf61261b01b90288ff3c05a0a87b56228c741dec86a3b7fa44cff4b8755b3a3415cd742b1b17a0c1224fb2faa9529556d191f92560729a93586a0f73a5afcbd0607cd013fdc6440fd231df6b62d234594834282f54a2d65e8095cff8a7825acfec098bd8c78112336288ab63f3011ce758374cd252e089ac4c69a7ec285dcd4d228fe530e0302f03ddaeee20a085122b746292574baf34afd1ad3b5ea14483177f2c876910499055b18487730d5b7276910a2ccf94d7422ab18493e7302450c3e4a69ea59c0310037c03f205ca191a2f22c7f47632fdb32180f6ecab5f8fe0a2a4a33239e9da11a811fa617c402ec207eeb8b267569ed4ca92c717d5759b20f314b60ab7c47156744e1395175bdd545be579fcbf841a0e76d8de5215b672d85ed2ede8afaab9ce6832ff6675151421c3c4d293f326191718c306514916c6c1f8e2fd72387b4a18809adce8d5b0fb65aa041edd322002c222dcb62e60b87513e13250099cdb342ca3ecf005488e7b8f24f309d2f111c0da192817549de3a8acabbbc6e2641c1c78ca42337408b6e3bf15e2e65f5d0a458134d317e25e1a9a3198e13567a7749dbfb952d5c1db7221ca6fded8be18f6cbe3110b70c9fa01ee78f74b74fa0d1fa0e9967bf1919f3ab8e2f8a5be225bcee9cd0df5a6eb9bdc5448539afed8458f944d55ce20be40909ea5d4a4a6155127976cbe16692bc305d3c3fd1e73c80096692ae64e00fe660657f729cee370f1bfd9aac0ab642ce3fb789fabef5f069a3cb9cf4929e67a7e2a7f9a4f3036c74428c1de9eef867d87a09e8c1fb8c20be004d9444ae03e2fbf9281d702735d658b5525c1afe4a20f083bc9be2f0d2e175bf22e070d3627951fc5b335bc4d34a46e7f8f6da193e8dd6219c04d946d788de1b65394dd4a5a04648809d0b746c2b5aae8a6ae87b4778f6933f77e1931dd8f241eac7429d2bb05d252cef7dca4c452670aa617558ded6b8d4c6c5aae0c1151130e09c2c3040bb52040c58d5f1aff96847189b7863084aaa95497b058cb9c20678f2f66d9ceb8e573c086c7f9abde1ea6689ff76186113dbff09f621124075a5b8e0b9878c6ba8b24c2c16886755a1768aceed1034f6d455b04294a874af654f3073bd32d7920750d15a0dc0f16da2bf73628b0e9dce9c8000077bc36cb661385c2d7a040ad7b8f9a709e8a227c35aa44fbfaff078722c802bb1a1f90c9405754978d24cd0bfa563d09d7a8577f6b781b94239e658574bea6ba0c1ff5049304666ba1c19385a0f4dd3555d7b42522e72bb0020a7196c936c8502163a9eab288153e96abbb8737a17aaebcf94e0bbaf3dc077bb5726d159de5bf276fa003cb70fd8d408752399b4cbac7cd58084673e1935291b8cc8b73c07c3dddd8663c53d037e685fd7fba9b44d796a169c8fc444b34e70732c7d397f82ccdbb5e3bcd9594f6be5b63ec7951778f34e8c6c5d2cc1ce0cd6ad86e0743a96af89a81421dd57ee02050eb880f230fd434b71edbf2ce9daf5bf7ae209a9fc48871989410311428de71d6203b10ff443533e6cf4fbf16ed777f642fb4fa1533af78e8f28a03c51b6047ab42837cf443aeb8aea0f900e27298bb90da6ffe375c9406b870e75551035d4663f55c54531ea53fdfab38a5f5d86d1d8d2b7b4f2154dc7c7f6cba2e67249f580193be9d0e5f4d6c1a050acf4bb856305e15251db9592203b7d8bc5740b9a19465d468472c3995e0623b350cdc0120ac6104a8dc2cbafc7e11a5f767450a98c909253d3e0163003b8f7b567507636feb377338e8ffa24f486b6d93b6c9266413b2f7967b07850b4d0b590bafa24a8246d945db036559e8d8b5bd1cb92bcd631c334f9fe46d4e74ec55445dc5f2c857128b0a8140f75eac4d202b13babd6c9777fdba92b4cbf5e9d6c64cd96bcd44d7eed5eefcd50e13b5e9a26da6466deb60d6e47491769192e9a688ae1da6a7a972438455ae24b7de77739a735e3c679d5eaabf598de97622d1a41dbb202ba3f209cfd8ad83f9f64ef64c255bb9575dc91e8964b784bbab8233cbf2a8759a269a26344dbb98e40e7b8e9e11dd893c656d73f9c019f3b7bb94e40ed3b2f9ee4a82dd631aeeae2419bb767a0d6bef348a67a68baecd8bf4ae776094beae21faa46d77ca4cb7697a15e1f9cb07bec09eb281481bcad691b210164fb4130dcf8c3e3f61d88447c77090f2c433ef48a3cf93135cba171d833ce24b8c31f64e9e8ebd26795e7b26c221286e878304d2b0687a86bbde91b1a73dcee92290a64dc7de51d02b1b031acd7cb797a77c439047aff20a7dc246a34f9bccf7a28b6e5defc8938e3cfdc9479daad6a75f57c01932c90dd58f6c8c452bbc30eca0cdc6805e475b0773a6bd6a176d77eb48f98eb68e94a7576d93794558d6357c7f35ed322f6bb824fa8c16d2b9a51adaa96b983a3d4d1e6da13f3b458789d847dbdb709072085f57c017d8efd65d19c3b6eba0cd6259b72a5a92a2e68b2a50081d8aaa5c8b76918f93940fd2d82fe65d5fb8539e2b793ecac8f3de7341000fa878dccb5d6e1df9b1cc88855ac9d0ab550be9247410b8d349803b425ac87b17dc0177c015401bb84307d5a75a5191542baa4ff54903acf83d21c7c5051c1714ae24ae0fb2c20b63840f6802d4ab0af735071f2c4244c7878e1a1f244282e0f0c082494f911f3a363a92f8f008e981f38385911e184b260f08694c4f911f3ad246ea48e2c32324f688383f5818e9d9f9a124c9101ed8a3c98f91fc8adcc642bc5f45ee7b2eb8194388fc2e8568eebd6deba44c631965941104e3b978af707ab1a9092ad598725fe6c6d71378e8215706d902846ea8b56de2ec9b394fcd29a594d463a434863a916994336ef1ee902fc78d9a53a4a9e0dca9f58aef750c849889e6de895c49ae2b2e9fb6b9ae689b2bc995a4fa514951e9d09c4a0a9a53fda87e18b9d7c8ed77f76a0edae40ec76ba205da5c096a8b765902be2b75e36bce127ccb4fd950497d32e6230c427d0c58c28026997a23314391e975c6f9256adcdc81be7c0e98a3ac6ffc9e0bd8cdc3535bddbafa17f14ced539f708d3e05a71258ee80b437a8b7fc00cc18bdccabaf4e5997f6c6f48a3f00f3c3dd8d49e12efec5537846ce34114ac02c315502e69634987f5da297a12e4f23f370e90332bf2b81e5876f1de2921230c77f40667825309afcf007e08d3eb428ae415de68079ceb4056113189a145b00020c966ef6e47953e1e4e4f92e45e6485d1879daa44faef1824adecbf55ae6df0f4b9eaf459eef4f4224ed1261929a6521fa797a59d3f3517933e769c30c4e31f46d3375e4f9ae8a3fdd327bb6cbe348b96bdafdee7b795364328f4bf4f28d4573f36d63c9cc5c7164d29ccdf3550d76ca909f1208599327eeb43c3fdb06b6cc9348f73e2679be8a2118733e6eb781335cf05e409f6f163c97eab3af77180ad536f171d4411bf55aa8c7cd6ed42f8c6a1bf1bb3032658da0799e26aa9ae834c5e9cf524cc5387ba8be8e44979927e3c9987f9f1dfb8de9847008f5b1c4aeff5a62ca49fce41fa4c39472bed26dfec6d4a7f832c2b332f2b9984a6099c6d76e1244129c0199dc15d293d179bafc8533cb1c5a9152227cf36569e3b92f94d11d85d112f10884b8517ca3893773ac216b6a9a6a8a1ac17c1541e8d1568626cbd305641aed023005fb0e587cb0e7abd2c4589658092c431a0ac22822cf746863229d2fb6f45cc9486f36758a29757acadab84067a4151b3e64914516f09a79864a9b5993a3129f4ce42727bf0754b98ee8ac19d9182977e4107cc6109a35192577443288cf1864d4269f909278135f20b1e87332e3cd6d273069434491cd833511266d90b6794831c31be3650edcc1c524a5618e853a4760214f2c6349beca30c31be3159780322719e207b2e2c277a902c54d3ede2a672f0843189020894144224d0ba164d99c55761494d3644d4b49219148a1d1898692611886a16428d989360202040c5ff002292545b3d65a6bb58ca43dcbb450d5b24cd3484cd490bbecbd97108f15e22169dac948cb0ec4910b47279a966559968db4d1899661188661d8cd50b2a3a06427da6874a269599665d9485321a58c4e545246271a2914229142211229142291b4ec279a9665170359f89363173421c03668dd83125017405c004de1bef87e03680b20232023dcc546a318a54814f2793256721469a3d169720585b2cc429e7ba5e4a8f30398135be26b2834ca34d1dc4859135dec8a4e507aa058880371461ae9dab9240b6fb20ba405ed0265e1e4026101e502f59048292aa5140cbbe6059a19e80a176405950b5485520fa339c2d94d8847a4591ba38b9ed918d1c908530b6b78b8660fd7c42a1011108f0f55558198010c608b440f3fd82336d188464c000c4b35036ed293f5744b3ce840d898ace7aac17d73f16483115be281b05c7311086b23e6d19f0b92b511fa3c8a2502084bc4e8a1d7ed0215c17834128944225168044468249a1d29db5b7b15501661941c22daa50dd1b5a3d8184d84e99110ce7aa6f0c30fa391482412755c0efd104468141a81a8608108e29a5b070127774d0ca3267532415368d18272a2b564a39696f991e8190e7d848910e14b2112291bc7b493674e8fceb433071bab86764fac7932769e8ce9fd59d3ddddddbd3d5350465ab3513b58e824c1417233e10a24056a554d6191e1544186ef1a09194e1dd3e661aa87c87def664daee8b4c9560dbda92fbe4c41bdfa7badd406f336c5746a7a0d991bbe19f90abfd702822c2b5a81d894cb344354a76a4c5742eaa88e822994889173c4015430b193999e5a1ba33cbdd63a5d5757dd6d4d10c5d6d688204b847c9fa2a6806f4a8184436cc0a756ebf68d2d55c2c87679af1b243bdb8b8879492aa1dc6086a91bccd526af23dc0703af2ae355b99bad0d6608c8c1c78d08a800c880e7029e8b2f375e0b3c14c3eb429e0e131fcf7c8f9125533e150d150d29a8d7f519a9531b43dfa26381d7adbf5755086a6dc4eb7abc0e3fad57ebba713d9e5edb24698c943ca01d6b8dd575590c34ab7a591830605897b541a594f430ca085bd218c9025fcf041f234551aa5ed6aee1c68bc6170c2467fd3b0bd722e6776ca3b1e58136d2a51ea90d665b6fddb236a8c757f571ebaa7aeaf7b24e6d8d7aea147ded5b587235680c852ccd49fcf922f6cc3557cf2454394d1aedd2f93d9f0cd357901b7da0146aac955a20f96450eb8fd12f59afc8c7036f756a63ac532a6140075da7ac8d7af949ce577beac2b2b9faf9685d1a44cc4c318c1104acc03c17fd4907157d67e16200e01d06103146fa686d5c20a767cec9a2d4558d20768c6e21c2437ac1b568917b4850df03ba1bc36ec3e96f9ad6c6083a2ac719ea4dbdeca2e10e62541952a739e764514a5f1e09be9833f453b63ec1193cbc17fd18fd5cf45772ac024e34b9be07505a298aa2a88a06cac650b5fa646d4c7fb0f36d175a61fab631d4192eb4a0fc011623eebe3c94333005d38c2ba495fa9eaa454975a2d676ebd32b6b4304d3aae86463e89cd5e32b9cc5fce24510f175b970ea7bc054efabd19748544062b25faaa44237b8fd97e70df9eecf4c088bd8f75cb47c904e2dc8c95bc895a42c6d875ae1fd9218cd3d1a319a838fe54ea8dddd2d65655100c23824c618615733d75cbb48ccd25cb7c8f3709a302d8750949443a28cf209928702f20972489443628c924a087127c9b23b2e91b2e392aaab9886a824a601be809f8f4baab8a43958bdfadcaa572b52ca29af22b7eb24b9c33169f4a0d183860d68e0b40f0d1bd0e841a3c7bd682c883de19a024c73ef3a3946fb63be5f52b8b87934f7a470676e7c11b95defc81d8e186315bda37540a0b97e50b88de39bfac852274b8c5b347745e1c2772c195ed8b8477e87fdc610e782c2ede04e7e134e17183992b50b842dbba6a6a62647cb928d17710e981b431886fababeae01fdd12bb44448192bbaf679a56c3a528e820f9182a7d0b49fbc35a9bd42c86533c343ccc44528289b75d1565f29cac6a09cb231a2de4250f479a08d41b12af8ebf4d4a7fa0b4f6d6f305aa4df0d664bf4be0f1d07295b9f2eb631f3fdc54cfc2addeab7ba2eaaf57a76cb6e33b9eee10dd57ab8357c35c25779e1ef363adcfaa193c34d7b68cbae68abd6d5dcac3fd93498ddebca422125a87c399143a351adf7bdc1df6e1b13c2400f6d718bb1873666097becf5baa0959132f6d9ec9919c86ee79a9b571bba2ccf48297de8d469723784dd1076ee2ecbae375c49f193198c9430d4ebe59b55db7dd9daeb82bf3678086d8d8ae52b8beac1a597dbdd2eeae37653cc8c4a74a023d738a9e6d136cde55457a97264fd55b7cc0897fa93bf53d63a6db07734d7364b8821e34dcc5e610b9e0c7873d1e0529fb6be037c21e1006fda0e422e7ccc69971f70c64dbbbc9bee7a699bd82277b4e0c9a02e0f9f8033e8e5a18d8ed66942c2e2e5e4d88b76f92320d02ef7f21420f54bbcb9fccdda65742ec2c79bf89348b5527a73b3c58474441fe169833d48ee16daa08f0eee642cf2687b194a98e34dc4c932e664294f8cf8c0175dfb60eaba07f07127d4161595ba31de0bd64a5fb2f6b656dc1dfb5922aa5f7f95bade25b531a2531b037a080a48821a263ec488e8759bb39f6fd0f67265a998112e51a0c30e0729539389e6eaa52de2cdc44fefa9da2d766512af2165f089b606cdf5d56e33f6f5d42a41658acad5c6481ba97a98686932b435aa15af10bbd731bb85e8451b759858ad8d811784e978ecaf39ec3848b9631a9722b631737cc44c34875d36d7313291ede1067af5b1152b4165db39912b8c15097c015fb70ec644f8beb5314b80acc38d367737521bf0db6473f24c6e94cdfdc29b830a25097624e8b9b8e2c629f3f21b0384d1f32247d07321860e94a3cccbb2b90b098c9a78a5e17659961de38cf2092517369412ca28e6414ab8345e71b8d348a6625f70b84db0f7316bd6cf5febd1c6cc67a4ebbadd3a9a6cfbde7b99972feefec54d93a90dabb6d0b6d5a6c915e83a75d9db2eefc210a76e1dc4c9efd6466d0c4551d5df10a28be42b4993a70de6b7809857dea4a35e69b8f110a4842b3f77e0922632d3e690dc9b9f135ca0243fdb479e8bf7264af26f08ea0fc398301e7e015250e55382bd2aa680223f0bd09a76c9321f5eebadcf95eb296787c4dd5bf8badcfb420fa9c47b5dd8865b5f7d2020dc7a5db2ce0b74499718bacd55d6eb55857b6fd55a65ea4397ed5292549c76f05e62cd3484947a37a8d39c843f8664f914dc91a08ff6116db2843ea4b8d7a9ea34c693f15ee06b4979d58f4e793701e9944aad1d047139a44fa3b843c8f241bc9b9090bb89489653913c19a1ec1235b67c31d75cca595edf16c23011f5a18770ad416c1dcc298796089a6c6196e652da055eb0af94d73be94c39938f286e75fa145c3d9e657b59866eb36c30c39a287d6412a9440a69903472937f54ab866aeda11ebe97298793ef567ab50b0dbdbefa7068637e580367b05c1e96009ae0b90471d922037b47a25e4b8d8fab67d9deab6fa9e76a85a10aa10de177ad6a5916f66aebaab358df5e5f41d805404b104184ce823b98ef0b02b32cebc6760c77a199d0310b10af9411ea080a101bcb26771a8be664b748d95c65a25d42f8429d1fd007f41144907ee1788a4823ed02bae4e192489647b27c10876909440291413a6335f40fc85caf04962bfee1dd94b385fe2c11a1e32e62979f76daa50269172bbe481d978b0996872e5f4333403c07cc419c055f4fb8416cf247e892419a135d4224901890cee5e1f620ccea203c139176e1e13b5902c942b29c8664794b44e8d7136e27756442782674fc19b9d39cfcd19cfc9b934e962c6f25cdc9735b2fe9169210180402d101027754de62c1d087f52a81b40bcba54aad179d6e628b3c65c153ce74736fb27c55830fff614b62cb01f386736cf57a37e54c394f868f49a75d7cb8fcf4a35dac4b9a576e5e21e595bfb772794b56fc2e8c9c135f60cd9453e30396409a93b707bd9340a2c869978639be5ee64c3eda45a7befa00cc550fdbcb3c6cdd5392e557b6ee66b99b72b21420599e421f599eb4a16cdd75b2e52c41652311ac691172a92e8f040e987ea1b185c66f0b1842c88b3b7a3b9225e7b98e656243cd3437d91cad616900cca0f2c83d7890b2c7122a78e8c8d6c6c095f6894aac8d4b6e624b4fa49b63c634883e9da4247b597612f1e58e4e4239017d54b53c6d1a7faa6da6de892c5564bf9a5e3555a95a455aaf973c5c563cc425b9e525eed30ec7d5e1b824c5331445c634588d4bf53489dbc3b14bcbe854557109e5e15d79a04f22bec094ded19cf2d72f29f7a107bc823b4a276be2e115ccc4c34a095f58fbd01e966549a924fee46e3e47cf547722b794ed1395c019f23432e9cf292ec9937e5a322ec9d3fa64e1997ef5e95d8e39c54a5a75621995c017f32a9b4dd9bacfc3c496f88b3b4a2f0aee2eee48240d77c71d37c21d17aa42af169da12edf732e49d23593dcb8c371493c43fdd5a2d465a8741d7bf9e393882fc737b6c4c7eea4b89dfe8061ce318dfd29ab83301c82c2cac8cf54541ee6c4df18d30067488be3ea2419e6904837c7aa7d281b63a98baa16ada84f8a7a758b4e365d27c9fd47ea34c4169f494d72b67c961808e95434b92b1cd3409764681bbf1b97e4b925d11c134d34173fbb63fcdd4a40850f98e4fe61228cec1f507f145b99670abf6e69d1dc1586db3d222dba97058e249664f922124083043482d4f0f4842dad7c9d46345784eceeeec6483437e50491609281e6e6a439e699688208ac99873afae50d316ff2a44005da65a25b115c9e454c4e521e982798f314e31c5792dbb23b43cc447373e67858c09c095252c09d3c4d46343715313d0c792a439e2638e42902af6582c07331411fed32e968179907e18e97bb3704de4c873c9ae40eeae4e94c343125a05e65b89d1c9280767927d13fbec013bc96e92dc8d32ddc5119e409e2209332863a9e8be94a72a7c31d2174a220ebd6046d14972c6951eb94526859b728b5dd1d638cf3515e578dd99aece9d6c96c6573168e375114755dd7655ebe70c97ee68ab7945691265b1b8e2b57b89202bea03ea81e10673621c1cd9cb3e7e79c73ce1963f6ecd93de7fc9c73ce391bc7782ee6af2bae9c308ce6e61c43bfc732230e5a702ccd09d19cbc01f2001e0cd013ee330223cb438002156897d23c063290a30978c9e46f286b50b343a3b81dcd92c69718b1459ec6a0f0bd07697c31c06b9177c29542963286186e8c2c5bb4f0892cd0c11e4be59a9332e68ed19cbc1059bec4e81629c465863b3f25a05d645e8411ed5262394227032e727b7948ee9ecf0f6a72f794cc1ecfc55506967679f575055e0b7c927cdf73c1445ea1089222b9be0bdc57c50f244030925f93fcaa880249ae5847f3ccf23a854314a0a3904ef4d3a14d9e8e8354a2d8c6ccf414d7e4e9b262d6655eb670a97ec67abc85234d9eb6eea2c974ab56c017f2d3d6c589490c776870029bfca050939361e437240b26b2374ac3703b1af25d21cbcbf7258dfcb2846f092384bdc1c795e6a43c921bdf2cb295003f3d52d434e10e89dc95261ca43ca95f7208eaf49edaae0f2e9da7d73efa343f33f53bdf4f9699be34611b3353a730131513cdd16bdba85ebf5e5bf4de3151b883237ba35a99da3b1e153af5908da15e7ce91dd0d5344db35ea569f3f74eadc233a35b775229372e4ec15de751d73779620a539466dd86655d7bf69df802714011ab319d3a75a875f730f152cf34919581a742f686f614d034af95993e337107b16962184b3c51d7403646344714455158a36962cef70eeab37be42ebbb6cddc3b91a9adcbae69cd2377d99caa4c7b36ca9ea33315638c233c43c518638d7bead9b56da228ead6c553f6aa66539bdac4a5fbf9ec300d71e24b83709e7d6ea257ab775aebe81398e86df3049c9155b5ce8c0eb20b181d7498065dc2aaf613f4a64a98615b4793b1471b83051d4cd293e3911c63f77a60cd9351a45dde903bf4e4173944ec20099e0a72842fa8418e3c310a6183919c8076e96811f388f8e2c357de511ea20f383e1e30c542b4981846732c99e5176c9f941e401964c78831a7534a062b23659e280a279ca8eee9c6076d9a83375d00f81d448831462343803a601158243661823be1520dfa89620804439d1a5864e776d0a64896a14d7ca141a91b49a49fe360348d2628b4e91618636c5cb2214b35e2a93c43612432901b57a0658637cdc1439b215868b3733b1af0341260040426869101243a896761863637383007ea080183468873c0dcb742b8fae50dc1d202fa5c3ef14179e1c883dee0b5bcdc613253ec782d2f4fb8ce49a2640ee48edb0b1c0225f73b073c599e8ae276241d1d1d1d12e4c0ab6debc8934814e2c8431c263810073261c2041a8981add3405aa77ff4cf93f1ee146e4723cbb78e8e655d4a6ed73f13ec9f5e021ae0bdf4cf6b918fe90b81090c347063b8174858b852e8e7843abc1788d3290f061038287e03520c2e0b4c90e5f65ab21cc0cf91f8d23a47748e407c44477e073b5104e1814c7ebafba2147791e67a9a33d247e24bac411459de0e21cb373ed23f4d244bd9d12ed22e90c239e77cf3689779299f1cb2bcec600fe8a7a675b48b4def803db007f6c09e2c3f872c7fbaf7037f32067dc01f3008e4690933083285b975e20b29b6c89348f7ea64f94a8a2ffd135be429bdf7a704b723492066717fe2cbe8928afef393e547a2ade61ea637d80307e240264de427b457a113b4d3c65415a594d2377d9fe23e06edd6e5c8f6d8f6ae4893ed86e3ca17dc608f6dda986ac22bcd21b910dfc6544eb724b8cd7335c906f5b174924996ffa46f9a8ee4ae9b487ca1b27b28bd9744fa394e421eaecead23e579e56915214fb90b8314e33c1c111d3d768adb45253ba34651495939175f9ae26e54d2372bb88351c2ddeb49c11df788a8e0eeb87b3c19ee6234ee2e8c1156c251d3ec41c2111f791b041de983f6503d534f4f7c8994dedb33491f5247feb8892f3d84d7228f0427b414b2fc8467106e277372da454e1d691b4280024a2a605dde08ae050c21625c97a7615d4ad7a72558349135ddd246de481c224f86e5c3a642f9dc86b40b0877f0d2d1d6367b823638648342987041efa0902c799a93541457d43aac296e078964083437e52191d17b7807838777dccabba7bc23a99c083d912cfb06460fb883c17d05773f790aee4879d42ab8bb79444737dd223f8a4a9a49dfc41749efa5f8262727e7e522cde5c41729e54bc12a52f64892a432b3366b82db491e2559be6b1e394412a1c9a187ba2f7774f1a66b36c81eeda264496412b1883fb10975492f532291f8671179169167599bd637cf85fc95e4bee64ab87b4848b87b466e1e79c41e3eaef59393935b585e1f7e42baca96b295a8bffc2ca904f2cd862703cfd7c9c6cc4fd50f4a51eae509e5f3f328372a29e08b69ba354f4dd3aa7e4cd42dfdecfaa6eb2164f9d1d60920cb8be4435b2765c62c21fd22879013bc91efd13a9acb1dd4d13e601dd706779aa310673e9b9b2c9994fa079b4a45f1e2b5c4d3f8228bfb2247ecd575fddab8e6aa5715fdb5bdebb11ee55a76721d05a55239e8292fa9a01ce52c28a3d153b6dbdce8275b088a7b5d7494873699974f5ea38d41c1ef5e284d9c9c5cd32e4dc3a513edda75458982f2f8686b4814edd7c9c9310cc37e7282728242da5ec64828b56abf36ecda751414ecbaae1d05c37e5da45f97125426910ed31a7614d2cb996c6e74d0d6dd3ca2cd8d603adbae38dcaac22aacba3a62176655a32adab09f6ca1437b6ff5eb625575f24a24fa6834424141b9cccb28b844fa0c0ee9dc520d946347c1af39946327fd9e265f5b77e5eb275b0749dbd6d17c657f563b4dd632d12fd1c8126118b27eb71014173b08c36873fdec4663afeaaaba5bb1aceae271ddacd283b6aebe7ad44fefcfe85db67527af150d1d45a397f4a30d0a81439ab38e623ddbb48f7e323a1c8d328c8394315ccab06355256d48e78ef047d5efd6d1e40b026920d0481b8d40a2572311063a86551f55d5b11108f4aa128d5e5507814418e823d013590f5970a739eb34f9aa2e6817103386d43add5eae96d5219d1b3b3e04a915d5a22e1adc2afe0074bbd5e97a360d730c73ce59d1061da669608f7a9adcf852621dbe777cb44ebf806ef568cec269cefa81cd8700bd6ff523ed96c6948d012de136e4e91d7bcb525bb4d65b064f86bdf59e019c516fbdda9e2d6b6b18c01756f76cbd71bfe0b9b00e1272ad1ed9b2ac5b5696556a8d35dec233cd43b1810a287ed4d72e724ea9853b5f5324de831333d14864139484fb4ad3f49e799e7a3f132e3566221ae13a86d9674a6db416b6376ab62e2bf3decb56c6d8ebb562b5d699f9aa5a312c56ec730570467db4a1db79618b2bf6f90ec7d5590c5700d336e2d2fcb56e7157c3babdbd057535c31df114742b73dd560bf41b5f7e23ee6065c5882f85ad8b0ac12666edadc537d334611fb4b18f102777f4206b61b7a0431b38c33a08c3449b235a7007e814b3e00e1b313c635f1f8fc5f85b50dc3099b1cddacf8a6db5810e13e15d81adb562558551308de11275d0e96fc4d79e5eef64067d5a19ec331057d81f2fb8023803b30781e69429b80238835a3b537f658baf5aa96a59a05bb77654107e769ebe42100874999741a0c763a0c783224db616db40969e6e7484857c1512ea3f72c5e21f4b177b32f67a5df13dd05f84363f3294f8615686ba746ffad12eef51764ff5d1067adcaad747f5c316f54ed19c4ae79daa82584fda5769c95b3b91b278c6b28fcf8e5e7cef51959a39f516502d2ae2923d7cd53cef117735dee38df7083b2a6e5df523439095918fd6de80ef9e185fbd4bb332ef3354aca2014f45e2b823ff70d7012dc371c74232b39dac1863c45d8c91e6543ab10a92bbea303eeab0d28133de21ae767257490acfc4f74a9efe00c16be937e0bd24118f783246973804218e8ac29ab65b3cac628cb7b43a4cebc017f19595a1afafb607ba68b360cdc3342789f8d23c1104efa541e7e92ade4bac02fa60d8c39894ddf52e4f61182ed15b4872d73d3eb02656f15e600aa0cfd53df12589eec92d43505c1c17683be2b9b03ead0cf5990a7750da1b57a60e5360bd1bf05aacc72462254507e22fcbe239655a490167d40ec7f3b1aacaf2514921e5dfe6a39202cec8a97e641933a8e2a31af1239e8c239e0bf8f748d9573816182d62f0bc2117cae7783d30f1080c2431d914dceee6ee6ede4a91eb99a7d8ddda36663ac571759e9fb9e1c31484841bfb12976ccc3cf158ea97f516b736ae39ead43507f972dfda5ebe7e6e7df5d1b5df5778b30ec07cc9817494637f246c63e6d15946dbd51ce8a22d6b0e746cbbcd819e8d2efab5c9bc9c89a27535916dd9354df4696344b89465cf34cdcab25b2bb2f65926da3a27b2f66763b293ed657b72cbfa89fde8d6663fb2ae6d938db1966559349f5816954f0ed3f6c45edbac8fb693db1ce828dbdd5e86e99b84a52c4559f15a6b594abdc3f17ceaddecb30d3bb4d42545fd9ea2b25337fb7d28143af98cbd667f72d069b2b57557b6dee5c8a39f6c9a956da23f3bca369a3c12dd5b37440fda42505816b4687334b9aa16655114a5e829a5f00cac5820c910686e9aeaa3d7a6638ad893a74b9d523136e4d15c84dd9718122902633ca80957be09a70912696eaa70c0b92c32dcf8f98602678337cd4d8f1be461844b935fe010d321ce4dbbf0b8148d4c0991a9161d4ba656a653971d6384524222d05275ba892fb048b74c9f3a3884e34e1a32e1c021cd4dc7e276cfc07424a6e3783d49e478496a78e40eda1c71447c8143865c65b8f088044c2fc288768912420156214f5b98c290a7090e792ea60fe91ad014bdbda4fcfdc1d0efbd30147ae8de946edb53d3a6b42b6c1f26f4a2db0842781ca41c7a0c4188fb18167aad189561e744ee6872c4fa7d1006bd370c746ceb8330cbc660d50a508cd2c6d8d777df8d20262c5b83e6198aba42dbbd8fb9b51b51ba5524a153db3d4c0c6f88ae815c575c3eb36d5ae7ea5054efc85424b54e8c91745dc1c3a46ffa89def1c44d8eb6b120ee4a2f20c04a1de29bfdb8398a3b433febe9619aaaaed709b70b7734d4b32133c530716298e303eae4401f3aed323d3981f0b29cd50af862d624568a3b1d429d76b151e440eaf447bb543b4172077357ad802f2a7c85225dfc91e3af308492335b57eb9071ea9c0875762a2baefc862801034f902ab0c8c733591cdc3e063280c42996798e9a762941d92d7d7919b9d465e7344e0f1fb98d5c493f0412d94a1416690e1ae917bc190d782f6eb490e1bba7854b083c0e7e6e14781c8ccfe708882f1f59f6797aa7488f868fc20c478e49e4584db388e6fab2b75b55104eb02f2ddc8e7b3e2d321721bcda85e6269128bd9459ca1849a4dcb345b774243d688304069ad3c285d0873261895cd81123ed9df84271e7c47e793b3927be4420dd024f2f7189c23b3acd4108ed3cbc91fd6207a9e2421e39ec18f151e16d2965c3d72f728877870079211d4ae48f941d8ee74323865dd18270bdddae785d8f52d6573fae2b6ef4d606a5b5e22653a230673a155124913686d281c189048b1969e555e0d124f191defb083d12236dda5c5715ee90682e624027528a816e8953ce908803319083dbf5cff381a4dc3ff10536a15437f9899f624f4dea1ecd45082145e10ec70561146e079bd81cdc0e3681d5d6471e8d53aa7f1907b7d28dea668910420871d79dd3e3d6c8cc9f1bdcde583206e229ed78c4c7c747ebd00977f73eff744b6c96bc12a40d64f8696ed2ed65081bff547183dbc1233f4794c012129f25edc2a45da0b5c18d36cd451b5cea5db4c93153fdd34db658a3a37b47f718691d16ce0a2f23777ae5a326234105143f39c668e43635c448ac692ec8bcf57e9a8b3ded62e16e52fd94a8a8a3b9b823c79d76794d720777722491ee8d3487cbe141935c80fca8e04115b942c8a35be2df90dc3d1fd8a3737e744bfc1092901c630492e3e395c585f9074e2c37189658614a0d14f28302097c3214741ca1f941a104445870fb2508826364073a4ec88f8a9c2446b44bc9c6cceff188e722c7487e54e8a048eea891dc50c7b4d971c303e2f48039a5f8a090214df27b2eae29dcae45862c2ba4eb4eb0a239bb6694573681c19515a498c808a59432ce08a18f1f3f9a7b3e9a0642086447c80f128a502896935352cecbf91989837432595ebf00f109c4167d624b9f481ca47c72908d39c1a588a34f64d964b74494975e7a25cd93a294fd4494b89fb032db79b86c1750fcca7b47e96d73336b8ebdd6138aa2541ea6a8939389f14cca554e663c518911aba8a448159553d72e314c479f6c2425354f4ea2b66d1dccdb4156e68747fb43bcf64e931965329eb278525454b6975352289a26e2a736bb07b5cd9cdc891c53a4764a9ed266fcc9c9b14649edd88cda658aca898665d48e37d261e2b669c7189e939ad4c9e7b5c3b40fb8bb3d6079ed73d34e3a4561954f7184af3dc32aa437e92425454bf9e829291f1da653524e460781a4e86630cb6863bccaa58c564b9130a5081289441aa56ca47e62e5d9c6032e6d2594bfbc825f73a02ba350944fdb9c9ce02bc968c4d39c90e6668dcf4eefa8892f2ca7e4ac9970582e9fb6f9b9aec0a249f4e9963e4dc11dc5f161c4e7c8758591ecbaa2b4f251d47cf8f8b48b9624255bd93a98575e7a0549345fe9621e9db2a54b96e4557ef2d72e2a5449aaa8dce8ac72d99ccaa145c125d9f58e946b9a06514e4e489bdc3ad226f3320a0330ece4e4d994a7e090ce9559654bb9f6948d269350b49f6cdd057ab68db00c6dd7056197f4b150f844253e160a1f9f5993f9e00e400a2a5593fb3f84d81fa0a03c5af90352bcca880797a270907296a333e9d3c664299f295bec892d8d511845c989634f7cb9ba65ce9eecd496e1d28ca51e446eefbc823f7e80fe5c6ecc15c273419b7b35d97a177b8034b72395c4887b32892d9bbc94cc192325b13cd25c37d5e4fe64125f624f0f2152ad18127a0768b28c528b33a25f988e3bb85d0b017339d22ea3770be1c97850fb044f4e8e6d206deb62be97b6d4dc68ced27c7c863b9a6c8499f8c94cd8984b0eb7271ae9179409f74049865bc88f0a1f37395214759997295cca3e239fdde6c87134471b4d9e18c636d0250a8e525268a30b6e4763d722df1871a6cd95e2a75317c60518d1dc7b29e6885823a2436d1edc3c1bb303222fdac6d827eea319d22b4efc927c0fbaa1f6a1ca1587db43daa51e16e99e36d247da0549bb608787479a4302856be4b980f0f9e48e25c308936cd3afcd3ab4f5393ae091a9e0c14e7e54ec20488e911f153b3892eb74416b9fb83057960c2b2eddcfe090ce9dbf588e52c6d722c77b2f0d782df1544fdd7e5c50b811cf89e311cf459c182e815148926147650a770f0e10875e1896e29f9c18a7396c5b70616e1f2a49b52cb816acc2a7497e43ee70240b20bf2aac68922395451659d821bf1fbc2b6ef2f3ab620c4c727d1af0b931e59e769efad46f6a9a72ff35c914fe01fdb34e5c434c212d11f2539613db9012c72b10e19973cece893c5fee38c94a6793393d4f41d98499fb062ab8f2af5df0665370e7fc24ffae2b67ddedb2fc3eb18cdd37b9719a47e3e4b636d7cd4832ef87e71e8638793ab529b85b090ac97d2824c32179486e4c41c963e57543ef932bf6de419b5ad157af9310db1bef9895b94e2fdff779b4e9bb5e298aa2ea36333d8ba26aa5aa157006755a3f3d3b6d5df5c9b4aa847a40bd47dfa3b5c6abaa4f577d64ec9fadb0374e7c89394f8e2eba28b6af721473a87cb7a2508e75ddd469caafa269e221a17549eee273f4cc25294aab57243549ee22ad3ed56337eeaa4f8ef4f494be5fa7ef115278fa5e95afacccf55b315f6a059c01c2a04aa3154d3a1c0f534a312e4daf6c6eaec6c1c9f5f62a21283a99e9672aee20a5b11e52dc7580a65a5161f5a689d247bb004aca3c49fc2e2f59ad803360f5c91d77f2fb816604519450e3cd7ee76fcd36238ec0f7374233f7463417b96e89a377a2d061e88aee10a2c31b458f2caf22e20b8b111dcb686b713f9a09fd7e6674aeb918baa88574b1ef46a39e61df8d463daa7d8d469d7419bdab67a9f51dcb4c3dd7a25d6a673796c8d22e236be30079c4b5b8f5305d73541185903c4317855e1fc58f7c17701f3a4c5716386309b875aecdf2644898597a66962723e678209ecba854710d38b2352e686f3c9e3c7a689b59e6502874686b744d56226691850bd1855c2bf381cea12542f0bd103d072967d1bd11c2f071a27b6a6dc41c8a1dc2efb910e1229a8bd711f1dd7d11db11303f6b447337bb4f84b3ed75cbec17782f2ecd7a37267eae75fad03b963c75649fe25ef439ab59e3539adf4a139386e85872d63d311811cff2643c11be9a2b8d4a237cab504874c893a9e3b8b2904c9db227b8f1dcf5f8cac2752d728421448e3168440b02814422d1655e16e1d2e833a2cf8fde16daeed6e5c8f7a34d849d26dfed8184b09505b3f5628cd43b961ca96a9be6a44e294afa845a93c18e9452ca9601e47703e4f7ed09f15ce4df0a0fef488f079c1303bfd8d2c1c071f861e51df7b2823b27b6c4edcd680cb1802fe2df031e179f849c042404e9de99aece892f13782d58c01947b021c81972bc187274401c72bc7572a16884375be1c6692e36687a9eb07832a60ab70f7b842bb7f6f18c7047ef39293dee9ce722de16e1569d33c2545aa7db1250b461b104dc724e36b8a4b9f86ceb72480be4e6daf34d21c7daa012c8e45ef7376aef2ce58f74945255e99c1cdf3aed12df39eda37fe438bd93684a0134b9e5d4019a4cb1077cc88d4ba3fea893c83209d0eb5425ee94b8f903a55c5de20a97aacfd09697fdd1d651b744a7a2beaac36ed11bcf884ef18ccafb52661156b9f5d2666dd4f7dbd650c1b2b9147c8b8262b32c935936a9ec3d4fb2db53d95bdae78839eb646b19d66eb5f7a649dbb79f0f7587de1688e810976a5c5677aabff5f76e5d35aabff755129987af7c84690bc51d5dd95eb74c11e854fdfdc55df5910268a6e9a3d32dbbdc8a78b94469d6191b7d9ae665165d62d15f73a2119ea95e297c6fdddc20eb958db1570d2d570c994025422e7c124dc43311af09a884ad55c54d2b158d08000004001314000028140c07c462a150342a9786bd3d14800d9aae54724c9a66499043c818430c0120300000020000c06010008c78502f586b75588bbc10d822f450c62711065e684fbfd3bd016c22b6f55d8ea64413026fc1c58bb8fb9ed66553c9f342454a2cc188084a8928c0278711eb55c55bc1b98937d7f2b22a1c2de9859b402c3767a25772a3108349a8ad1b1dec131cf4da8993ebdd94f2745b7fe97f406dd14bb84e8068fdfa0af60064b924cf0ba91efb859cd5addd1199b3abf09ebefe554afdf698a3405f3e98cdc9b4ace2ddc01427e6c754fabb2a9bc089fc4095f8f0aaaf0e36b930b4655177da3af365bd4842c6dd85aa31f3337e0efdc18c3a4a8c1e3cf6918a11709cace16e4bf95e2b9760b82c07fb648c6830c38198f3849e7a7c0110ef8264ce4ac489ac66e9cf45af714785a4807b33093934aad58d7e894093e15d8def1cc93c46c18f8ea2185e9a0115f514a442b832e5ec611b9b829757bcb9dda25ab34002e7d22d5267a774a5eae61e71860b9d2eec967d7b1e411d4cfbf9011069f6f4ae61f33d82fa4aa43632dc3dbb05e2f5f76616fb24ae947a2a5e4be11f40dfec6e00bd41611da7f5f4e3b4a157301141f9bc1d7b9439561144c953eac27b5da620f4c96bc8a9dbea2261a294ad1aab24dd05d971439c47abceaa9e688a80a95ef009d5b966f2e494585044b5e40aabe54c99e825a1e34fc7f9d17da37ecf49be47f9ab170f26c1205ced2a980a1f50731d3b8b5439eec82e5822e30582ba448cc5fe19f88f30513acfe2b20ed156f1735607d92ff9306114a8ae7a0fd4d580a28ed6a103416168db1808d61d173ead28d82bbee65094ca6f1d08b4801b35f37d9bc3a7325fbb8f9476f86381e6492aff2de288c0896eebb561296ce3c3e5fab76b293dadea3b558983c93b3b1b9cf0c26faba5a5bb5dfef69dcbc7c0b1370ed43d35eb2c9909dc4976466eb66a62c05b9d54661554ae6c144167aaa93e1072eda86d4bafdcdc3223655dc944c2e69602b676dcbbcae77022cf364d7685884a395073f6a65100c0d229bb8689f895ca8164055c5f7e7dc42e33b036a249655bf80b0adab0b5f92e599b21a8af68f99451d01299100bab27be9a07b249359d6baf376cef9786dc2cdb58bf2806022d9e56d9cbc0e688192bc8e786295525470f4e588347506da1cb7802d008c422a2818ed8183c02300960e259c18c36d125870deb3c6a9fc0a14f7b8e92959a62c3e3fc96f1db362a834774c90bc91162fefdf241dfaa026cfd9c6270c462b81996002b2084eb5cbf4d1a88f0440bf6a13b924f444b7913f85402f4574b42516e044c17ade12d8e83556a3e2a0e0ff9445e6f094066e26d83305800e231124dfdb49962e1d33c5a17d668466a3d9dfd520bc9a31c9dae6724e39e76aa7011c34fb63c59064bf1009199ae3eb283bb50569d69a845e6ad54056318a35ca84a10fbe9e58a51f57499df14ba5a9eee0489963e757c408dea6ca025c12125af18490067e074bf756b3dca978d0cc00798a25add13d067d613dfb305d0ecb167782e0eab3b58294591527854f2b1abe21a2da0f081a01d29679aac1c41d03fa883144481d032aee0eb7cc5589fb84adfdcfd02c19e071ec0617afd56cce2d585083d319335966200420b385ee57d52c24c1677db16f370b6a6d3d17da1ae03848cc75d25a19a086ae41f3c14a3ee4440979d8f2a45350de0b61a6b1c95df411ab759c3a185c1c52097b7d77797ea895626c1aa9ec21760aea838e85b1434b5b9966af56ddcb4a4a18df921130e502f717df3b6550179e18e65852ad11ba5c0273b8fe3bc153920cf2c4cf35261ee292dfaa70f524d6246a1df54bcf7317c3f5830abe6d36bac593d4fa22ee651eb9db72174845b880e45e4433a27f2a6a98128b2a613f0239ec5f6ab006274e7e53ed27421ae0463439fc881b5792e669f27b857bd02685b1e89b6085e1b418f3573216a502c1d2c5e33ac813c6f092c02016c8a8e92697b4c1639bfb8e7fdc80f5667181da170da77f089ba0ed63e1d394f444b30460e4187db6c225c0291779a6a4091ffed24f9bcd233e52fbc502cf38c7780482e789fc2150ad3bf85542ce8762286223dc14678acfdea6bf3c5e65504e7c3c1ed0a3b8096cca74d440818b68b800e819689fa670d38d36aa404c4cb253ce5d15d3bb7fb29e88a54de72bb086276e500ca881df6260a18a74a3ea6e0d637e41035ab14a903ff172694868617a5368f6a61ecc317482f7ef3c4e5738df73026597e27d6bd01d1c73ea034d8dc7c4b6f3146415821cef8713ecebe81d16091b35a47d59c583ab9a4c132f004318d433810bd6241d86d238dc62ddcc85cc0bb9abd5d94bdf1c70b650c49ad99fc045a9489ab005979e799baccaf78fe970010f3bfa04ad05810319513d22483c3f6e3cf5d2f9c8a946a9b89de3a65710b538b46632468fb6deeb310181c16b085d7a00e52efcdc6848b6c0c7fad3cf9f1943a9a439f27906d2906a5773934128612d035c2a4167184f9d947f9a823d805ef62cc53478b31c3f6963d97b58d840d1b3a6c7ced57348f124f6d0c4af13a5799d4d041655e5f412536279040c09fd4b525ba948d1c3dc4382ebc80784a8208a158338385ebda69f58fdf7c895e10b2b0a0f5b641e7651d16e53f918e727db58ba17f0d42929891e4e97136140f03d434f1060c7e9896a4322328e317ee81d5f56a63e64d11708ceb1c196a44001fc6b2996944c40e3aef66185870b8d3e63c6908ba21746cb9433ab0188cc3d0644e0e56c26095b7ed208a9efe646eca53f525645344c547a90d9725e6f4b6b5803a8f6ff29576e04aa010b32f47f2ea5f102ef94cc3c7fde2b35cb1e8927db9b87e07700772104a0a1cccae0cf4b883cc34c437f38b021f44aef1e0ef51a9d6e7acfe64be6c56d8352cf38b96ba5922bac1fe232a362bb4819da6f6b276920565491137f060aebd71242595e66785097c61cb4e782a136a4038a720342342782c131faf374498cdff41b87194bf839b2d6021a1ecbe9dc20c5364c3ebee6e685545484b8b282ef762028b23ad52dc22a65a191c2821c629489cc1346c5e33a95f045c5ed7a8dd2e477fc3b0c109fdb901cb87e4d4e686fbd6e3dff32730ccdfc113d3c88c8631137bfb4dbc84c31fca25d059ee1f7b1474863ff575e6f36a870b4d6874515b83402c52e3ee5d237f0b2229f6ad31d9e6058e455f5eaf318ef416ec9dd47a1f745224c50191285a457a10c035f9399e1ecfa1763256e695dd067cbfc6902473d2a77ac5da22f111577f0aac86b90d8f608638c552a6b0a957046ab1fe2146b40b664c3d5a625569efb12914536dbbebf561e34066ba12cecfbe34b40481dbf2c0141d851b3459aa84d71e60ba151da05eb51d48e42d14cea6dc530c29cfc010eebcdd7c46303d8313edd6966a0503a886b91bfc53c61e34062ef0a17948e058b55cb6470222df8ebcf403d87526c9b03fa67c20b8112482cc7d8172336609c46920a5cccf7d06d0a0bff363d02093901514ee301c6c3a9e3a7c74b9ce2125434a0b92f1b8b6cefad5c9fcd6fd7077a25f90bcc89f89e8f6043674ec3ab2f0fa880fad20825ba8e4e43a0207126d38ce03670aebc15618adc19944038e2ee9c6949f2b9346c3c30db6c391bc838bd101b939765c61995c22356f301a0585be13fa414190e27af22db59f984724f1e5c5059297949563a43121f408f57514a662cfd9638ba25df0a0311784a05e9c156688179b9747193f68dd333f26ac68dc7d152d875c9f50b4232ea3d302f45652eefd8202471632d4ef3a1339f789d7e80f46e1ad4888007629138f3668d26ff401914ce52eb7182174241af43b8282f0efd035e148ed218bd90571758e89703cd26e2029b6765ff7adbdbfa020548b7d92096e7f434c47ea16c59bf6dc263063731bfe1cc7f318eae0df61644b8331991192f9265cc74e29601169d7dec00e31cb84c49eff766b2358ae9bd5df80e438786d823130c92e570650b28f66ac2a8db7d362e8e0d984887b022519538824fe118ef546d043428cac3c2aa9c0ed94695d247ebc1ca65d82e2d38479769137b4ebde4299d1fe0a544ded112c5173bf1e168d87a0a4f2dc6934dd566b145b82f6169eaea8f94148f0b4680ecdcebb7414a3f43ed40bdba7b8e5d49f41ceb79b31995845ea6b52b39b81e04c47717f4d1751a77ba6e2aee8c2cc082930f3c88836eb7a1b2ae37411a374dfb92149dc9f882fa3c24871cf06f8381c87f2fca1da3e52882aa25fe5a2badec40e900687c8ec8c86278f615468acabbb01c8bb48f01c536813057b339ab238f1c68950b078e29d49dfe352421e52fa89df339a934c0406d1379eac1c7fa9e4784c4403065e0730da702ff5b917a64a8a2713cda3ba2024fea92605a036038bf0d32b0db0ad80dc968cc116941551b16a12c4b0b468b0381aa96969468debf36ccca614afd6c7d5b5b71a3c14ab3fea828a508ca4186db50bc0c412ad6e7230d628011c5c95a10ef4d9a3c981f86f9e44e4c80009e483fd8815cf382132a4cbe569f39ee0fc0322ea17e8e9530a287904edd8c6b93ea8b20b0d023065c8521891366a483480c19d40609afb4c1fb65fa465bb984400b9e1bd28278b759442862a74ae69b65f31f927a5d60e8afd8afce82b4ec2d7ada7052ef84af2e1c7c871bf2f4ae848f152bf21901a74543424630cfff35f777552bebbfd96a21983a2c1d11f27e4b233b080dba94cc4aff8ccc3a264447433ca9af3a7a37bf6e539404fd599545bbd3def7219372cec0a61e13c6588ce3bbf9336af57beca1364e9f0603187ebbd0302c5ffdd9d8b14f2524dc876d369e9c8015d4fbfbfa88fe209bf092ba0aa05cf9fbafbb5736930fb09ba2699380fb974ba55ae965107dd7cbc8b28771388dac8d75cdc26f1908725c02956bf96bc078e6fa4f169410f154a1e8b23c6ff82f20a8349b0fec99c923cf0106d349905005da5a4e165091bf86b1c0c48775a8656799239c8f1d2cfdca344a292abac19343023c0e766a7d1eb8206b08940061cd94d7cb84d601a01d3dc0f89de60c8ab6f7064ebc0305c11ff46db744cc11d822876731b5304b8ad92338859fd410100844dfdd578ebbc1599717364b83ad95d6b9b496c47d2a4f919b7931b34afec3171f3267fe6512a897597b184c90c4455e5bb564175e8daf20f8e4f0d74f1ad4163782ad6a2313d8b0745ecb8fc27e28dde439f53c9fad660d1be684b94d86f3f04c20e86326d2d83e7c986db37d5ac339cd38c22847229f82c9fd00d8d3b9d981197deb591087f510d5dab01c5aa0787091244b0710912cfb6468806a25fb47455653b6b4d21bf1ac406b2b75ba63869ecca448977aaa5aec34da54f6f57520d954c50aa310561561932d45644a0fd5b715a8bd4884e2290662f0107af7fe16f4c73029bd269ac886afd2f23747e97b30ebaa8457123a22c1345b4169e20dfdad91158b98a0306df49f1d21a174b194c08ca7968b1b4558f517fc8eb9076d32beeebb42babd522ac7912cd46c148533e2d65a5f1555b3815950a04fc11f732fe30e9a76f5c81db28130d366ef44034638916cca9dd5870182b85c7beac0387a5f28d33c9578491fbf6300776a7bc29b46d907dc39038b6975761512b88631c2d34c6dbf95cf8bcc9df50e3bdc376d71cfe97e5fd5d744ab31b85613ee0a85d168b8df51e4c30c292fab86e012e847f14bf7bc87bb72888121a9ac136ce7074e38c1fe466f21080b2b6129ce5f94c77b12322068e62c05e3bbeb0c562107e59117825e772eeb85ad38968442d663e934374d3f0f38eee44979c025a15fc1dee61a309084280bc5e206bb5e829b3d43eac7b31461230211f5b21de9c90857fa8ea66bc9873990ab8d5cb80c1530b5503987a0bd4241bc322523ecb0a60da45a0433f6c1b543639332093ba2644bf07ccb3acf5dab317bdb702a6accb2c5a28942387f71d567b84889aa9e158ff69e541f42ad0509e369081938e79fd5dd95754e10f09da63f7f8d78035d7a5a6ad74b4c9802cc84cdb2a76bd3a20313c9fd4011451c9709a927e6add04246073b033354708dfc01439f8e38fce45bdf6e9eb979327758b766308f140c1a1b9e80bbc8e31b29cd805de6ea69f87c28c0b7e1340aa94134e4ef4286c14a9c47550d1e539550f28225bdfeda8f7a07243f820933c9350d9e9cc2e4e05e04b41e596db86255d961a5001ead7cb95f242205f07820ff43c0721669281adc7e0224812a9c75a03a4b02d445b60641f020dcdc8113999450928f277062f604c9682748909e16fd7edd20ad6e3749608f81b3c4e7653f07a6536c0bef9b3da174958245332fe56271b91b6d2eb83f27c1fc615ea276b532711011575cc7342e99c41b0a73e7900195a1395a32a681f857f50017dabdecac1c76867000539d07d9a1e56181600de8463512a90e2d90b4ab3d00caf35fdb7ac2c20fa5a466a6c10c24acd51e89797c9d1e37e335b329fb3e09725148ec42ffd9d5efc81fa6321d330bd27144e2d113434ec9487899f8fadca778dbfd2d0894801a0341f85b4d1eb28d6049a6a4ba47b0b099ffdee5949a400f0d7804228a8ecef4d6383102859b7dffc440227de56c58640ec89e8c5b3e6ee23bacce8a9b22ec45d60b320ac4fa2f4073899f71ca70a48645ad4ca1998cf063c768b0c28e5c673f14de2ca2f1278c8630bb7b3414029572431bd4ed97d7ea46aad2feca544dffb423b3d9ea107fca6376d4e3fb8934bc027ad1f2830273f9ae2da9322e943db7e1fe0b44889bca4f4aa8026f8e75799784b2addea4b265dcf4cf83900566dc320b1058e7381038be2c4b2db64295ea79a615388ee9113c387be38c8079b54c33defa6aea5d3e4835d5dbc9559888839395e2979108c9773d68ec38b5cc243bb58f7dc117fa4e96f58aae2ade07aaf851bae801e390916303d85bcc5eacad3ef203e1fd4c7889c7c43fab2d52fa561c895a257767fbfb60d42eea2ded46dabc9a915b0d17c35500158635f5e094570b69c87ac0d62b5c9588a0d2e981e6883d72c35b75ea8fdfd6f29fcb21df3c952a017e570d4e4d7dd9614019d64a1c4433566123fcab8912324837d769dcdfb61044f90882d751e0fbdefde6ee555580768c4c8766f68f0b94b775fce3955618a33575ae63a1d97b99efa3a4f6b1ac465bb0b00425292e4424120d432ee70d47d9eb77537331c16ece3775fff236c7274e2ceb673c1756432fe2422bbe69fa34513aeeac10a7e431387d25b3817a7d4628601b022d729fd36afe417345795d5fddc3075ec6533dd82e9bdf62237e4951fd545a5701dfc121ce1fdd962247dc9561967025a04d9aa7d53d41a22ee6c7ff1ad8d5182f99d458539f0ae67f2ea7475d181f238ebc5567e394745b68511b9b1d503208e6b5c4127142a7328a20e5768bc04342e6bc3d0a2700ae62a8edc53b73aaadfbb8c208c0cb40181e9cef4233314bcf80100a91400d51919ad278106622b5b67acf7ab0195450d573969fd210e8eb67afe461bf8f55c286a9bec1fcea6e5094aa5018b5740492fa79c232cce5190a81e32c8309b3e0bd44fc90fe631a47031ada91534d37dc39075d2d9292768d04eab9d2be89afb0050d5618d1dca3ad05b06770986d2e62b99f7e45141e4b9a6e26340b96c97bff9e328836204e5bb353f0c76d2bde7a33aa55a913fdf380ea7d8a0ff025360ba84a59df10cc9f02f4e31bbfe57593339415a6ca68505759de3185fb981292d3604e7949626c2c9f0b54736d70b466b57f291cc610e63796214b01a9dd2d9242eed738cd62b3d82a51addc2fa56885d107aa6607baf8629c40a7216e071f2b5a9e90a4c68b431bc140836f6b83cda9e51c518eddaecb81bed3b16818b164b9c890f4e8bcc81c8e007d05511df3792a51174a3facdd47d3f7abb9ed41af80d8d8fab7af25e0f5ff5c446339b0882ac44ab467667267777c84840d71500410f587f3bfe1fc1928821e821a97a5cdcbe9576236d7f55d8f05e15acda7c92c3a499dd7a5ca10c53ce7a4e019f245089eb0f420d26dbcc103494c63b322b3cb12fbde062e19050606efc7329714736f5beb964627b93e5789304c419514f4e605ad58907700992726e772ec33f2a7d530b15f05cce04ed96438e0fd7898054c68ce5c115b4ae1f0eb4be48e6a8f99d7acfb828aa88a1ea97c00cf3da3c7ba50782045b3e9f31d46e0db0b49597050edae820e5e3de0e6cc1ce9ec464414c3d99d482ad2aa40a79f2982934f797ea331f712d75c3229b6a01dce4eabd72bdf5b7c2f3eec2989100aa1315e54b442ad698c17ba6911d24213a30e5d226fdc41185f4979c58d68c0691ebd195518f9717e097ab5e935d8a31eeddaf99c29678563d4ac4ee44bb992dacf1402b5145998167c42a957552b488c6ad5e448e0b66cc201488c3a927ff3e893ccf57e8e8937bca2058c83aca9114caabf4fa91122b93026fd2d53e446a3504dbb70a137665131e19246d7dc9f342b2d9233b814d4c19b1dd81d2647821b6721fa8b199bfa24a9c38ec63c7925884e565e07c2adc1e74b8b3a568dbc0fe758050d40c08f2a32458e1c693c35261b27ff5ca375267e36fa08d786120e242c8f3c54631537b884f5231e772a2656f63797cd4a0bb3dfc2f4a808eb55c14374092cdea009c4017eed64c01d9ab93f44046fc3be6a6b0fad1207469cf23a26cdde0939a76d86b0c04bbb6d5ad7482146bec528956470bbe1dc28fbe8dd01e14c2744cc8f64551c7cc38c17b09b6058ecccfc16ec55d1130750c0c2a2588dba9c6a5a9924027758733d8e0aa66cdce8cfdf67b7208129d82f86252d12d89bd57842fa075ba7413196abc3fd4ec8dd74cf4aa0b279ab38f0c7b979c29ec0609c16d2cf00b648d13616c39d07670e0ad288c0f1cb3214d65302c40fa5dc731ace0886b754ee8a5fd28e08f51d0d67a45191f9b3d633bf209bfc020127c7f0c24f691b25fc5c2842b9c4b516b004fa535eb13125c9e5d5744bcd707457c04f7a6b93cf105df9ffd21aca4838588b8144c7715f56a0811ce5b7ddbd877dacb4e150bf20f801f2e2811eaa70678e3b511e173abd2ead91f636dc12044986d328a4d256bb4bcfbefb8a00e0c5634cbc0d7a63b8a10dc929b29595e9dcb3d7873d6a0e19be2c418722b42b71236654c301a0269c0a1079a4fe6adba5f7da50a223e3686b49ef133db0f025b4b01a8cc609a47c6891b7b32ce23e88606338188c8411a50675945223597f83142a9df21a92023e0e113e9a8892ac228878a8f6b592f924307438c7baa23fec9f7284a713504c65c870c6b248741c143d9d0f86cb82a72f15e3fcbbe98a4e2fb69dc7f083707e950662ad0f4827a9e66edafa6204d747968b214f8d3626b9936c72459b79e496bc9f84aad6257d42387dc19faf1d6f7fd0b0ea9a027d88836b42bdee1a5e8248913a5ace55c85e7bc35ceb46d2b2777a6c4c6fd63988d7d1d2e049c302656dd33f76c60c2cfd8d048df90fb9e17aa08b49518746667a5cfacc15e85ed9a55232cf55fb91839f9d25fedf9345ac80b722a75f8daaffb3df455e2f5aab359f9381311a531521ec0be4a52a9530a3dc4c37b213663d447e19ff1f8eba7d0c58005204f78bb0def85a45a1518e018de7a2b4e1700c96be053a1216c4428cc5bf6e5cb129ead0a5746ebfc6b0cff67b7aa8e1c8e8ee6c2088e0201bc0bcca19a878af3e84d24520a4602efea3e28744cd337d634712a3576a18acc675585adf8e3c20437ccbb52ac17203ba283f702515e00db0f7f0bc7a8eea37ff3fee7a914e8eb3b22c3e50e0f5f846659d178b0b754d48ccf82125801bab0da54def24b12c50a2ce299e2e977278cdc2136ad6dad987a034e3d917fd0d636fa89dd303925cf9877cd3af2e44bc5731d1209627cbf999f5529d59e5fa5bcce41404e08e23432c0b0b50b370ed221ae254a80388db65fddebae27cf56dbd514979ae14494a298b1c9a5e1baf5235c7a024284d65f1d0481e439e8421f57f69240d43bddacaca68ff7965e602e1c268c144cede6c67ac3c3ca5780628cefe3a0ff751bbf709d7aaeb327bd165ac23bfd543df6a7fb149def14c2a3c1301c87f816ebc6fa00c25113264c160a024e919a14e4be895ea19711728f63054e906b627c0e2b9a8886ced010829d7bb0faf4468376e02c34d8702391926899003a7375ab98bffc040239084d754e3e00efe4066bd8df635751922cfeed80b1122a2328d755ea83f884d1023836082fc293dc16318a0f13b801216eaae2a78ddf53f05ed46f08bfcc2df83714f7a7d91214872d73dd08e1cd6bbe89bdd15a8f15cc520402824b082d6197167440bb03e1ca8ecbc448feb531d18a66a92681fe03eeb6968a514071298f9328bd8223c962fdfde752a9ab0f4021a8bde3ae8a5ab8db844b2113bccc512d567eadc83d45da70aebaaf98036f64b7f5ce880fd5fa0b19f290d138c2c9d3b14e9ded4098c086efd4b001e17c212df4432711f12df86f44a4e740929287b01f45ba10b91ab0bc6f477662539d7e1ed298b92d728f089e9d0a5b1f911c3d2e6b501fe0e857ea6c76e2b2dd7ef442e69e1ecda5254bbd1d556aabb3b79c3b8555ed8d3a4fec44ce07acb6205fc5b3f3357d7b8289db91841dfe14f16b298c3700111072c6019d66612006d1928b05e57dd71af42ae898855f07f4196c9161c220cdefb616fd169fd105b68b37017c498e496d9fff209b7d03fd7e5ef1e6c58754b51c6b43faab1906ab80bb1bf2b7da39a020db809e70470a7f2050c28374fbe2859d9c65892ba5fbd7d81f0ba81b471a42eb668b916c842284afd93431a7e60d10085d2af2b66b961903e31f6a70d5903a467776fb779d832cd8f4d6679d7dc2870a36bddc36866648d583837e475af775f8475c46222bc4a1a8476556df8c57e3b057f9c53bb8c991cccc0d1011e6fbd7ae3f8d65562fd6b0235b3453c270eba41c928c3f03e3ead7473a8d5516cc770cbb4bd7ef9827046cdfcc50c8d70c44e38356c1832669401c62d34bb085e1518e7f0e745e375220a45f79e25cba865e88e08f5b1382d3565806a44bd73f3b0c539a2a41016a3ce74a858eb745028777c8c265788db0eef462fc6fea2771ca17906f4e2f1b79961cb3ebc8c42d49374b30dbf4971a38b3c241395dc13b601ce3447d0f971a62cc1cc2438c70c4eeba4320289a789afaf77508f7aa8ceb5d4558aed4a68d6b3b709896269f05d1e253006c47883a3da824f9d67c0779862bc270a2e6a3d36be755b7a475475ed2fdbcbdb52d0394f40432c0c623aac3656330d878af9e7f97f9c12e8f8c0ff25060fad6760dbe47a2d835dd6177d53789673c1a6026fd17725995765bf87e068fde3d9992865f08df14b640a3770680c4b6230e2316ca27eea0f335ed130180b73402ac597e0289ef25cad75646d43dcdbfd9e1c359e55f0414b435bf06f1c135ca2df4367e743a06667b48de376f5e48d167c630fab546482a1d73e1fb600d3b5f87ce1e5f6ed62677cf253bcf25e84da739c0a1cb247be0ceb043c18f3264e60ecad18a7b1c06a2c0996532a6cfcbb08408907829f0a11b4315f084c314df65261e2959c645ded1bfdf07ba2398e3aec9598977e8b752da50d39a9754f2bbff0352d064ee266446fabcd95e5e9c7f8374a67d9c0d280c95256adc034459f59b1a3229c1e32599fff304a1202f5c5862ec225a9c34f306b23e2fa74c14069b926d8c03c489ecb09a0703e5d0256a27cdd26ef209c18ee1ef8d0fef84c757a4cca45515191725b156d170909bb7e2353a6ec779f78ed379d6ff24e88e916c33fd6cbfdaf36c0fbd7229a9d7b62e34f642673601c3303c3a331d8284949fb6814143e0493d46d424098aab238185d78e77672e9d1be116b3017881e2bd894039572cd1b51c91a10e6e55456e9008568e8e9599906250b741a60f5976e6ea60ab00abe439931fdd3ac9a5d18833b22f5bfbd73287127a551c2e53c7dfd888b470dc4573e892c179fc6f43725fe5fdd772c18ba28d3c4abc0a03734bda33c24b83e8709be6d8f79ef5e4bd4d33b961505953f9641a69a92bdea844f7fa421fb018571301ef87d6d866917f20af5f9312bb83e67cca4caf1e74c351615459c420ea7653ab943b05d8b1f9a1473c165cb9fb27f7c8b8c0c0703fd07eda8ca4e0f34f8f8f5678c29b6d09a71a3f27ea2365f3f250e08bfa02d0443f8ae882370d974f4e2c9b924b623ef7bf020bf9c725c993bc47940049577050ee057f400e136f6825a30f68cb7b5703269b40533dd46736176b1836f62dfb0e916c27d823acf37645a6c95727a3b5630f0df6b0f4d272547b607ac66bf6e73594f00d3e251288e5237e819cb06a9585fd063224741f2b0832a921c072d0e6b286cb90b691a472e304cc179f0a9ca1ab7a3610ae41618897f80631749624485897c427040b10813161dc12f7c6f7284328049ff1ee714f9f0473f4ddcffe2bf4ec50ce4838fd55dc82ed7237e00f7e91835f542f2211ce196a0ed0b40a39e40d1f7885c9e095c8dcafbc48ee62900ed8e97a5bf12306280ab7f13b9827563605398c54c00b3b85a537aa9973b001fc27dc521314104f1c2b5c8fa947eeed5fec2ba45f9278c28cc8df5f4767afb1d7962802d1598ca14fa903a4b43d76dcb5a7925b95138bad078e5398e12ddc00b4e3ab8f9e1960969c901820e132a02c7c8a03eef5b37ce1a2a49c00de5de4ee4d167103e5a9f6d73a9b2def844075b82dc0ae0cacedf332b4f61b59d7e03e8b092287b67570f9dc41b14ffaeb64a90864a03d241816c1179c894c0693a379cd4326b6bd80b80640ed29ccc78d9a9f632a35f1b13667b76e22f300c3c918eb2fe74dfcbf404ece845ea95b1e9c62b56a86ea4c5caa8f5213974c6920c3b3a321f574d0e011e4792e1a96a45cd10c4525dc8b72cd1c930c4770f35a73b07f99cb6f86507679e3f9d0c5425140c09b734490e01b746860041fe5a3afad71332e2c5d5f1122551c78f2d45ab458e5ad45237ef680c88c5fb9fcded3dfb22ea37c0b9c33981780b42dd60aaeac2b15ee99be2617c45861a0674a6d6b3d888cd0aaaffc380aff1228b825d2f15c94deb6b663865ecb2278e5c87b0a4dd29f523bc020ac7c364f8d74a41b06c3032c57202175b6eae8245f47acd5e63b4cb0bdc23aa9ff8d826248a8140b249a4adf077086620838b36b5463f8c146e654458802aaed4fc3af9946919fb4a6e86904a45f0a02c0e48a94568b05f80770cd234a950f2a4b2cf03d922a9f33452acfa6b5a1d6fd0408da321135a1c45bc7667ad9c37970a55683cb8ab0931455f2df740aa3112dbdbc807d1adfa8ae360704612329cfc87daaac90db5ca768f03fe876169c5c23562eda05731903ae0e98ecc1eb00b995e2c6f41d48d6b24c15413605e9d5ac4a58f734b8849060780adac3f2a1b48cd56bdbf1912967f03c44bed8e5a00fda1f8458551f2ea55023477a621643b10265e3ada54911749e91967aa39e82898a20202a445332a5c6ddf6d1c31dfebf41f5c07d96fd81d9a1918cd112a6c18615b3ad200a6ff3880a9a3277d49879d10d839d25a26411f2604115b46fb7d9d55344e4e23537200db84732ddf4c27c7beb275a0a37980c8233c2ca76820aa1ccf126d2479f7c4c470bacb90779a80280c0605dee5bb024b6a6ba2979f87c8823ac5f47daee138458079b520607dad693b0cb3a3d5de707fc34b62c1507b0d4a63277c05843a7bb438aba35069b158ef73ac465a644484c670d934e80ae866b71f2a1f1bbb594cfd58d4a0f7b65a9671818df4718630e2334a5837157e416208b2b403326af09551e5650fc7acad7c6f3754288f6060c5df7c59fea1a46da23e1a945db54dc7746785d5d0014e47be6c9f110b11bf995146719577b55d816dfed0c28f4302b9e1f0f96094bb6592566f2933cf956305fad3220f50678dcd4297bfd60f40e7716a71cd9728a34a3c3303d694e64517d4945f72d7a4fcf1d3db116bd3c3daf9a798015d414f19d23f16d4da8931880db42214774de575549e2e6f2182a5e1cd366d93bda92e5d586ca76120e0f3b64127828b362912ace91d3abd84739dfd4a63b3e91b0ac5461411657e2b4e476539a05b7f30dcccef323f54038e8d69a760b88873288dbc245af5844abfc3459c9356c4529f10a77d3b7a5e0fa6c7e22751162e81ce3b8b04cb9db4fc4ca998e85707facb345e3a9ec776c7ef34649b709e62022a17ad8aa6122e73da3601c959c20f4de6ac5b8a667c603846ec976d014b4a11d44776eba818c6f6be16eec0bcb4bf63c0ebdb904651614765dc0fce051bd5020aceeb32ff71b49b1662c5bf8e499cc9752b6fd76446d3465ffa641bf72743588ce449199715d40cd64d145e526485f4b52025a9e1d03aed1d8b62353599b855be49480dd241a9e9116cefd5c224d6955c1bb548590e68870a3e5fe3b099802e04b8f761cc9c9429e8f16b6221104157eb614ba65aa158f47f0fa55ecaf730142feeca65ee2b179306a659dac57440fda91379a95b621faaa68c04071c2bec7fe512319b80f6ec9ecb420fb51a1e40a7af201385b25a41a37e5a4ea2872f4aa90033b404ef4aa5d60cba7b836c61250518ebaa251704ed6159cfcb82d7eb8f344207bf48ef710947ca562c37aa9b4b2576c395b8e7412f91f73685a09c99faefbe3f8a82fbb326d1413db38eea29b65024a3253ed7d100ec16b32a366b0b8183cd187c32df1dc52121bc776e48c50b1279d3bd7bd21ac89d799a00729abcd9ea6c41c29e1fab0b3ea5f709aa6e3a35eb0bb3baef71fab069c35b4cf0e15409bc04c973adc3b906b290cbabcb25650982f852cb223cce88e3a4867e688154e7c22675056b61e07de8b5fd1276ea3bc2a110b12e1a3ff70460f9281dc5e0689472b32dfd1c80425f4bf2d477666532442407cef827d4f577fa8ad8fa7379a524bda4f27f5733a6a970ed27cbb3e54cade90c83aee353472f623653a4c3e615517ac0d5314abb19ad1763876d77aa6c064ec1b83582f1d7dae260b318bc0c970ad4ea18f8264104a73e4b0fa249c582a030bc06dcfa703e56a39f5a212eacb66979e177b6d26a868213cee6e364837860dfdefb4d80010b3b19471c7f6b892f040b23590ea1aa57dbf5afa5319a58a2f662b3bfcff4f0eab2fead8ab1bcdc1441861d8e6c714bbfc840c5bcb293ffd2dfa6d7d8122056bf1a2317c929bcfbfe12d6cd6dd96b6253d67751675786243e4fc66b95e18c24ec88c6fd9a925e14e546684dbb91ce57480703b128891f17f033f14fefceb0aac8a994233f27f553587f916df3d138bb2557caa0299a973e8155f008830fec15dff1cd6ce8a9183bb40bec7386809df95980eafa3f7a5e8e8815e508511b0e2d245a598a04a352c88cbb3a3e4ab170aaa5a9dc9d6f8f242d765d20e9b958f3d859e7318779129863f1adb90b8eeed2da920686a11865802239e9197ef3b6030282f955cb3bcd6cd2a229402d7752b8cf13bd847d64f8976a5d73efc044c4c44f8cb342062408e09c553120f67425097a38d583588fb5ec2c3cab945ae35dc63ab90c9b726599e46382a6ac0f4760c25dfe835ffc84b1739a9acbbbfcd88fa04d395ba15c47fe8c51513027d5ac53869a9524bd50c9483ede4911892d3bd5d4e4622922512f17a301c134824b885e8d8062d5560941e5ba9d88b0798906944d8039365a8d80e5302739953076b13e2bfb454801bae8464204087b56e469b977b0b5b4c49be4ac04f5fa60432de8f98e0e620df616b1a4258f9c1e7812ea63b0ae7b0be852091657701030bfa667dd2144c29ab8ed561bc8be203b19caec45ee1caee9a10fc1ac8e79874c992498c7d49867eaafe4a7d220d183039b188c88f82b91fec87c8698b472e1c3baac17f74040cccf01da923afb49b7602e5eb25adfc5081cceb7e1ac061afc57424601175fbb5d587e98468504c8b7ed5f91d6f981342922f7b815184fccb2f17f3aba19f112127c050b2241337da1c967e2e9e64a43f648c1413d94dd14011c077beb10308e04291f484f66b40915d5da0075a940143021449d96fd650040386303149ac348322f5f3a03876ec031844332238e96ce68f516660c20874cdfd31d802309805d930db4d02a53740689ec1f9ff138d3a07b1c6e8783aaf3ce4896131c8dbb335870a8afca820bc9dfc1eb9266589ba51ac16080fc40ac31ca1e2b97d465026e8b2c648ddf8e4e3268cbf3140689825c87c1004aed4968809a20dd462a90712d5bed6169f587076257d88d7b1740c73dda51b5c31f2183b4e6dbd693438a662755f43cc7ca138b7ea4df3d9694964ba00362408fcf93fad2f6bbed5cdabe29005e6ff2c1dea7bb89d4d3427392eba232acb939889af86253ae25aec24e18a1223904e15a59a05ac32a486ab8778d442707e5f0dd0dc24a0cad5069c7091a7c1375830956c5f7e31920e5e56580e07c29d463408318144d70861655a8fb58045eb847ecf88086012ac59b18da75de7a803ca941b9ebe981d957473ed9b4154d7ea5cef125c7b36e7f24a0c8063d29d30035337a50e740ac94a3295dd725ece9844926b5c82050445adcf58e5791a750848b2e13867f50cca64d9b41109ded800fac38f1c890e5a06afb8e38771bf1a53177cf9e2bf799fe26a5088e31708bc548233b591260a93294e02edaf3a4ebc54b629100092fd1db22e1c84044ed241b45a983cd21ae594b8ca7ef47d45f1319214412f69b875609026c0a1f89f2af6d0ac0420eefd7765895bdf268099193073c9da83ade4b780a90d602bd030b5a888f19f889f6467be7824542b7b6e98ff084d26b3ba37fd9a13e4b31196b02a5a1988365a757c9884dff196c02b4dd306f75e48dec99058b689f00964178eb6914c28c732a5be4333401c0378d0a15224c3af9eb351f2d414ee82e222dfa7c1ece24b3804a4186c7e680be4fe5ab6582ed3591a9bf65213263eb20087042351c1995be5d00d3fd41b6ac5cd01e359b0e8bfcbbd93daab40a3dfd0ea10e83ac8520e49e74161eeff678360f0449cb010bc26097cd610f5330c065f311e2c74ec2b1c9012a089a191eb238321e1f51bc4e9afb490ac3d6673a40e08bce76d5ec96024fc0387e101e53f509fe3b08342c508fd62550f1bb9baa76a6893b64fe12a06c1d6ccb85a223a5c0d19a6f4e1a25881eb83e491ef0c97957f834175f89aa08f0b144abd836ae92b1407ada4b6f97a13a0a977069b2fa8ead770b91ef22c54ab5d17ac0c2bf698c179a1f37d13d748ed7cc25913a178e51a977e4d8b32623a0df8e3b199f8d413e487c12d1ea720842d17cbdf144e1f2fae34d4f571bcc50e8401c55e739460919d9a808d962956a4beca7e0e630e927d162253582ee89efe9c0b822c70f99297e457904167ac440a0c381de2adcbc0f8ae40d9064e4cd1a69be1f9170f5c26ba22668f2a24288b89b21a35d03b80498a4adb9fd01c5ab33c0e265a88bec7356b75b476c43582c18dd957a101098b2f9f2d5c94dd6e195fb2896070cea6c5aaeb34fe55605a09614e98397934475c097e51ac0c0c74572760169044eb04c02a083d351a2f80935a054efd3914ef1ae6ff67a3360250c69957e9e63ff54d52e38416a293b3c813a6dd7199a56dfd517f1817a92459ec20627e0ed234c2c6a47ad50bf5c5e702d3efd7ede020f314c14e7290dfff9f08da6d4b58946a9510ecb7a9b00c8a3f52d8dfcf08fd7116f721b435049044c3fe5edb7b7621e4db0bc240012a20d2f10f3ebd9c21280924227cc2f022545cfb423ffb97bfe8f4723f9f45fc4e1c7f1b58d872baa35bcac12a85030036bc0fa6ce0600361858cc69c1d4effe55abf1a0f24f87a5560467f9f2387e4b757a271afddd4f34c5e2be9910f1a07c57cd0fc23bb12ee13eba4f8f2df9075b88c1298a473c5723456222e0eeb5ba229dc454b73e9a05726e606ccb26f7a7f0c5e1312e375a0ee7453cbb228f36d3c69b3bd780d7a11e6f9015b3839d2c89fa049fc245bd4c834ebeafac27479e5f9148734709f25cb7ececcf3feeb72f917a2d5e828f9f59f523454d43713dd35731893d69458a8ad263188eb08cbd1f946a244c3200259ecbd9201ad8ecd76c1c1bb871495fa9159865355e4985291bb27b2f8a907a78506a1d8b4fdf300b4c3b523673b14f8caaaf7d18504a8f3f3753437af5640bf7d711c241938152da3070db12815a2c8152a4f2685f6287fb47b20293d51f78309e469874f9b9d80423359936dc94702bba5be171b154e0589994202020c414beadd752c8c8c6a449cef3c3d018af7e1e75403e21bbcbddf071ec5365677d2733f7dc2bc495d726ab31d35d88f42e6ca0571ffc21b08384fe81ca3270ecb8b4328ae559749174528d46ef9e6f13b2486de286269f6e2d624cc53bca6eb2bc6238014df7b29b940cca60360d6b0bc336c3279f8a15bcc98915566705940252508ab0e43a4fc1b779a2038d53846d4b82265b8a07d5408168fa32f444d58ca693376efb8b0109b58f206d1e10ea6549d0eab1ffb5be2c0907c30d036146fdb224d843364ecdf29d501d084e20c3d215b960a04e5d4aa8ea8461db411d28509a02bb1ff06c163c1d533d6f7ae76b9c83b843eaf181c39fb9d3c5411bc8a07901b5da5edce573d82b961278a089fb70f6c58891cfe98f6d1ac2383b3f51202d5f8d216ad209a706a2101d653c8884a2db21ca9474b955f116479bfe195b76cb58695430c15229d2cdf07b9b216123b8cbee92e61f9ec1f202460858f2b77d3d8c61a5267244a43332c8f649bff66e0760beb7ca00be6e2172523cba26a96bab074e1af6aa1326b21735b8c1a4eaf3299d700cc2833868a70a5e315ae0f68f39ff90061cba18f7305422cf20cfb9267e3a8235dbc34192a47ddd81b5d872036a48bbfbe78b0d3900142f369d8c612c457e344e432beebe0d90cb211b48ef65493e495350f6c2936e79b98f665ca0e5bcec563a62c0de91e4aeb2a28b8bb8d51ea36b6a12ea799b20953b92c6a5e5a94a413cc6b51072bf5be92962d013c8c60bec2a445a02d6fcbee9297170f74e6bcd43688d57b309d504883cbb45a42ddc9dabcd7a4838f51ec30883f5d2bc6b2ce6df160022efb3be4e44578c9238f0d793851e2b4a5cd21b014504b2b8fc79ae33953aa4ac8d06361ef7ba92fc68b91d9579032c050004a7b7a2821c067792eb22ef165c64ae083720e6d62e694ea41f8404992993dddb5d3bf8f034dc7d8fdc0b3a35740a2e499178ec52e6d6feb01def4cf7432263dd88046b7f79dd068e4e9da33c33f2f333da7c53c4e5522d309cf3f806434ac3102d8f3e663b1de6306038e58dd3152cb247fda1ec2e2eda9c45565711d66cf33b7e7b076709e5e45e3d8c9f9b8554ce2c43bb8a1edc59d185a7056af5257d0047da14b7098bf10ce1d1c37c3cdcf4513389504a2e4c3d84f29e689b4cbb63ab3c1994695a3c0991280ef2a0e6332c4d694befe72edd0818bc5911f5f9bf27b331c252af6c8d004228a46cbc8221d93ba07e92c0f4719d4d4b111ca81e2971e34aefe05ba3cb53f1bf010422ba6cf42b69185fb62e113c0c6f6e6ec05589386a9fb957fba44634d1e4c0c34970f5989c9f926799736b6f7a3340da3788a439abcecbf505c1670ad482d35cf9cb4b74c2e7b0280af57c8cf27efcffa49c3794a778667afcadb670bbeafee4ab65141dbd51c97a719761eb1565d7facc2cb995d653cc0d24fe6aa0697a3b96498f96f0c3ee249f9949e327cba6a83b6338285d8bfdeb6e9f34677fc71e81b075167858d14c5b340a4eca55a6758e3f2ea7da34024091866ecded37d6d56c3340016c1b56be6dbe02670da7d8fccf50405d0b77f36626f0c234f19fca1ccae53d54647d27472ab01943338abd1a8b4d54940e417b0ca55a00ce84254e8045ec70a08fa194e93426c9c090b35c6fd7b964e457468b44eadf4b13607aa666f3272883a8e2525a87c609e89f53dc7ef64b80537f9001565b9c4fd4a48d3b23c04fee8f8bcb3adf7dac1ba8433ac06da523e98e36bc78a3eb9157e2b17c7cec29e3f44bcb9775f502dad365b04ec4efc6f5033f04b6698592b18a644a75118ff0942074882d8380363a2d03abc925cdafc0fb329ba8b3f31f70e6ee75fa0d615b168aa58e9c50a240a294084f6bc45b67abe193566a7f28b040c200856925c2b1ae97c485d2414edccecc5f9e879ce42f2dc3923d7a0c4177e0c27999a72224cbedee6b72ed088ee48cf4516cedf942f29d45cb17f4f4ab1bd4c31d135211266423dcee2619baa8d02b4501f3371b134dd24754877088a6ed6c61dc2edbf47672692ae6540ae4b36a218a6a2450ffb42817e5d67b329c84584dc1d00793f33205ff769f8a212618a64ddb122718354af3d4cf6e5fa8461902befb1fd6d6bd5f45d5f19e2229176a963679232a8a1cd0b4d1cae5c19ca9297dc81814cf2184b0901aae8b745f435a01ed8bfe0af8bcfe86291c17fcc024efdda21bc6a24ed4273fb110a129f62c0fa517fc7652e79cb486c9a5a59dff7026557b0e1b7ce4fade0eded34360c39ef62e196d0dc37a02c4fbcf0e170028086bc0b1692f2ad879079e7a606fc87da1c89a9ce808460b7ec5f5419c07b79a74d93e4a3d0ba9227d5e8cdacf2b77ea03d01079c9e75b72cd8c4cb7d1444b0f21def3ff0cce7b0485b5871f3ade5e2b9fe48ec74cf91b28f1c2f84675933a9fd43d3f2b69e221cf5fbdacb5ba7888ada3a8c75ff4818aebcf98fd17eaf24162d9d28442a22e1262931e3e82fb458331d3a3345affd2f0df1dc031ed0b7276c93d49e9298dfcaace0cc384865db77b5b0cab37967ac21d7a4d99923b3f6bf5390b44fd974d35a2ce88513268e4bcb3ec15a623309d10f79ba317db494eaf8b18df4b7cabf0fbc8d11cce74f9d974cb2d02257c992b3e516039af0db8745f3090975575b8ae0189392fead53bbc365115e80ed83d7ab8c8bd2ba3805d934c2a5f9b161016fe301ce37b38aa9dd7ed40f749b19a51ade875d0ab34cd0f4487062127a56b1fedae843a11d121b668347e67ba5a89630090516b939ed161414dd6313fecb2e97a05991a0dbd1b0d0ed95a06d441f6b45a4d016b2c6a31d619d9becacaa061c569b3ab987c5d9a84f30b1a510c0e312c960bf92f264464e03dde0758f0a42531fd5e94e8bab95ceb918560e48a6d2b8d00815d301cfd88282a3bd9b858e21922199b5d94f1541025aa68c65baea21a33f597f5bbf0b31a60e647647be5d8d02204be612bc0b8d221083e684ee75933232e3148331168a5e9c715429af30f342406511b74bdb3f7a30c00d6d6a46ffdbcd8d6e860fd44e0f3c2b24f38d93870f914de08be1696e24f5bf0d8c79cfcd5a393f53025fdaf862aae71d9537670f9648ce79408e212a0db24e716e2ec8589becaad42c123c11a550485d253d10f41a5ae80c98ef0aa6558cbf6afea6aa20b837476cf3660e8cdea7938b7dcea850c79849c28e3ec4c17ff35ff57db7f25a07c2869c778a4b7e8ff2662dd0bd60ea2d9ac231d71510cee84802ca8c31aedb8a3999e0267f201869410cb3758b3c425a2825eb5462da240ed7c08cb7603c2da1d76fba363f8c54b3d5df89383e438044056ad869b0c0d991ec2a73756611a3a96b9b9abe3acbab9d23aaa25e5aa1b3b5659fb245c07775d388be2d896eca26713505084c668c72b79703c9736d8907aab43cf6527f0b6ac7f38239352c06b00095a5ecf6421ac7da4aea201970924a06a85c1891c9c8a417ba803d397537b83002c2a7de8e1928344873c08f7e810007bdd342f83a58828f3c88d4d42e378a142b3088acf688907efd68bdc36416e9555aad306f58a4fbce4a320440bdee7a36dce16b060c05e63d1b5e16e14ac1d2a05a5cbfed655ad35b30657751d7803d6bf5dbc46d023e138d05f143a3dd6e4965857a4d9226f9fe7fd8c64dad6ae10e53c7f8908bebbc460677f287a307f1cb69bf9a863adf60fbee11d9f04ca11f4955f4b64ab9483c1ebfd9a39f4acd3c6bf821b8aac3e01dd0a99ac0d2ac46ab5910b7f0e4149a64d4172b8a2f80da2236815392f439ccb6f09ed9babe6300e00db970a0a8f3f7d4abf146b7b815af800b5f461626164304a2359bc5af105f4b59435f02b32a2a8435f4311d9e14db454020fcbe180076034816b285d01ce63f0c0292a8962a3024f01428874a1b073b9f19cf9b5ecd413962739525d0eca735447d68b58b9ca6c7695cb3e9e04b94969908a5e046a434cb64d8510588eaffba46d5127c87d95252f36700c51121d5c74aba0fec544da902abdb9e8045db451f82eafdc942bcfa1484d2a0dd634f7636d27e15bcb16247863eeddf5e6d9621393782a833f474dd02ce37db930680c0996f14e80f7b708831c1ac4ad1187084b065827c7e761a297108e459c046db5381c60b18d9807e2e9ae8a75783c138d477cc4c1418ae3d270bac2980511a259c495086246ae8d54fc3853eb963e43c3cae83e01fb93ab4f70a00deabb295ae583399a4abbf080d5dba5835c76839d39064710115dd30dea07117c6368aee51bbbb70c46161b6e185eec65cd03057510d0c51e94d38716ac94acc740689226381b3151a0741232b2ca1a240cbb7c3744ed15684ce26953dccd31a377186dfba679dda9871faae503984ee4a846d54e7dd46109111556043b7581ea547f4bbd7d67fde37a440ca598d8eb08884082f1e739b44b1316f43e895eff360d6f05e29c7c0845dbbead5a7c3b76815c280ed186ed3825c5c844d128f6707563a4e2003dde3307005933b25ddf934c5a7573982754512a15ef3bae532e851e7899278dc86b6614b829ace6a667c44ab6e6de2f281916ec0e159b5aebfe8b4a6ca5cac782199df2bdf1516a10ffefb46afdfdcda97e14a1f8ee590f015d0e02c647ef2d6e787899863deca9dfe21912060cbedc733891d85e3be26a0486b0a2fae54abc97305e3c280648fe3ea002c4feffaf2fc1feef8285e99adb9b98e81df12b93331b48d590428589eccc51fcaf40c36edf12dcf8e70e22fc9d48b2e83b9f2a6493b9a49c6f1361742674728b82300ab4fc4c63f837039d1bc0328e058d2c97aefcae919d35741edb59efa8688006db1c5fdc502a8e24f06e21de81dd948a38b19ae4933e52a3537d3ac6e281e7b1066039883c2a15f21ebb0f8f982ae095df8ca9642cbec428bfddd3f58f324caccb5ad2c9b15e34c15f52833221e20fcddfa73234bce83180a3fa8e9fc8d35fd8101e1aaaf80fc164aa5285abb8f4f37343479aea0a64fc3f143c6e8bae2bc6abfe4cab5eaa52b6a0de6e455e9459b0e165c98852f817fb44aeff7c1842ce0a47fda7d1702a5cd648ce64266b030f739afe6193b30c1cc5fa60f026418d8e01e32400b911b422afa403fe4ba99b5e35191dd91aec12029a6c8b2615f04f46c4b55b4cb3c5b07fef638734a8753afdcc5276f7b547b6a3ec16bc1658499a7c00870a7f3938ca6b8893011c0042fd0ba21282b86c089484be52aa5778066f079b5720bc55d890c15f9a821428031d4beb85691b62507e4ce0787514f7346138e35bc257ad3d09f4473c8205467be0ca285528a3c97b9326c1a4269851f6003b55c652abea66020fe22de3d9a3405600c0813b94663a6eed127c07df30a7b6f6e004e0185878bb5b61aeafd657b3c5cb07db29c0cd24cc9355304ebdc9959292cb568ee4a81e508989e779098a707088ac1c67fc22acd8b9147e8c18fb8db230dec8894f4bf680818e9549b599dc2e155508100d478c52a5a9300ef8a9e8d1d9dc6fdf4b935f2adbbdaa7981540db896ac0d43d7e07de6f899228d4418cbce8fc83d8f9edaef58e96ad838c993771b134373ba51cc91bf38177eb89cda48d51fae07929b1da7c19c8b0d4f3d93dbabbd86478e87389426f21fab86512284f9801a9848b6fd927d918da249f737213852975f21ac9d55ed01381ed3d0276e78b49c88aae9f6e4310b039520a07807ce3430d50b1a2233aac6b0c2c9606bb405f66814b3d57d41216e323dc60a8397267f3bf8f908c5f9ad7247eb6dca1edd9a10cd49f2a60a3a801e8fc426e583e53752a53af7e0c148e2ae8ff7a5131a837659b091239aa18629b6f409c601ea5a2e7a915a99dcbb7025f8ac0a39f3797cb7b56071903d40eea4e8638ccdb758045e86b88e6cf5416e1c644938f48db8b135cc23e94d630491b9196a3839d1956b91946f862ddefeee7ba966bf9f10bcf7e46fc852a9d298cf7c081c0ea1bbae405e28d18aaf422794143fa50a1a80432de62751875ef0a2292ab79d002cd94abdf4d6803bdcadc3100717249adcadf25dbf9a6d2ad15f6e21c7d003913920085cc3f7af22629c605902839062bbd78591d3bb54ceaf4b526d04e7dc689a539ff624d0142d4c7966d74a1368888e10f35972a34921fa98856d188a3a2cdccc1d5bd630b67963304f6cc73075a4757dd45ed54327545a954930d5c027932a12d259b788443fe1e147ac6657fdddb297286914e1292609d5e5800ea418fb9c44305b76810828c2052769c28ee2d150d24fd6aea3371c80ce0340c27a861107e8e50a17d4a11bcea9d9aef03bef6b71852ab7e83915038d3a229fb2cb6517b9d8c3f63957d03ef526e8e63a9ef9f7becf0d9f4a655302d235d9b2463d6a388045811a0f4eaea28b56ddd4e028d80e2aab81e482634119813250fa5a3586b8efac402aa794a5aa38211b079428438b4fcd1c63c94970cb1cae303686f51e7dfa1ffc6058d1dbd132022984fb5184b7d5ce8b0f3f232ddbb88dd86fd468f5c7386f0305d65fc192400c03aa6aad8b3737da202aad7d585de5f4ffce006bd3d3e9f1f0d3f9f241411653af616429891ab1af55acc0f65f8e4617ba2873da760820eb4111e29f2812276a2d8fac0acbbfb8c49c6aa202e487a4ef9e8ac22f4f5b21503cac299b70510ad8b1f4639187a7e6ff093c3a88c9c54f3c059a8ae78ce474e54090d3d0c61ef55f5224685c26d0d74846be5409093cd0e2623e823da70052c8f3f2ef69470440f64a6f9a48a694d04d5df94c55043d5394af69c4e32b2fe1ddf7d6133bf75da003ba6f854188f25f06020c7c72321eeef047d9fd2ab54bd036810686415e02e659391e1313008c18180d1885984e035ac3de90ebe70de20a1e7b60a8e69c33b307bb0af9d833240101fa0a98a155399c8dbfd6723b09c273ee57113a74eebed3b5fcd0791e1bf58469e0bfc4a445d601bc22d4e3cedbc0a5c428eb0cd3f17cb659b219424f1d5135ed821ba65bf3f52194ef25934f5077d1368a2337d1865962e40ce6bb082f738490c850b73213c0a8c342e52e56a2a5103c64c2f1df42ec329eb76ead27d1e0650cf93346990c9e0ada07a3e198880eec687ac46b63985411478e80ceb375dcd1caac6a73169fcfe0d8a83dd4e10fffb250f5134d79345584e4f964659209cd2ca1e099b407a6816189476e240a1d4df0f9e6508cc6b95e13472e6c74a6223d4bdad01abdaf8bfea39911c5de835fa54612b250ea9b99305a0f1e6414f7aae678594041aef626559c5bd530e31cadecbe3645775bc2e8f0dcf16809f1edc6e50ecb754b8381389daec088150442b12f4a3098329198e0f6e2020011587bd952ec6aebbfed1494ebe966e9736897e9873889b8a32507a2c0602a665c31bbca0d6f66073ffabdf96db4cb441c9c4f4fca15f6838567677941d5eba585f34aca928a84f8197a692e8c76322d397f2fc065af3298cf43ae9703576d4bbb7bd67a2f31988067183cfdc7b05d752154243cb09a8a44c55b049ee8bc9069a42a37521ca7b4a613d324930fb49c70092bed6bda525ebab8881c8aaf216b9cc80c99737ef9fd6091037402a843780df4493297e8d398b022585d6357748e1462393a98c581ce2d6b8f2e4f404d5bc93c3c72af8705985b523f4d2ca24648e5c452716b99a1a2f8c7baa995b8c245499b8bd9d520f030daea9e5380a1c1b9557e81255e0b3a4272036754fa056846bc019b0d6f38d62761c1b0ab3b56206a022060786bc6ec75ce60d59930410c35213c66aa2125e3d80c57d12a925995eccb001fea5134735c606d4084a7588a387888a7d4e06a724e876f6006b7b16cce2fcddb1861d735b3a589a714cf4e9214451b06ef47ea276afe58cb0f25bd7c9db2d47dfb1fe716c8ca841724aef6afe6e75f335104b7ca92c846c1cac077232228d4d2ca3650234ded05595d672b04d2cec9520d4c599d9a27460be142324a4bdc80d6b273f860e17597950ab569781dfef5031253999f672e4f804cb076355c0b3cd6420fedd53f0cff0fc28c729c490cf8cdf1be8e56170ba4786b020c9895c01ca970bf290557c5e2180e810558cb2a1b8edb43fed33c7e203d05add7d1d2b053f9e062c5a8c8da4a32332a40226e2a6445e3be67c8ac886aeb0359d0649ab6f20e360eb125b6b70baf1083ea62afd2aee93bf4d35c7d58bed2a5c873a0a8a4a75d07cdf7d17cc564c8ec3417585d247d6556a7a79c570c672a2c604238e2380ee20cb3f0c287431e2d710f413ed173c0a359575fd81e99274836a2492236a443a1cac73a8f8847f0a36349e4ca784ab788f0caba46f3c1ded72874b3f3054de4dd72cbacbc38f5a3e21e8d2cc03509569d3b1715edb0b5c7b4322b85ebe05e1ceb120f70259ddb7156f81f7394c713c0849942986b391d4632d7a2c0c7304e25132473359808f8a86fce9377551e5752475ae813fb26364212a3a2126544352d01dbb898aa5367747e60fc2999a2d2b3c5d0bfd583697b421f470d981939f369a4bf0518810ba936572c5bdbb5d16338811ce62823eb3e134c964c491ce24bd1a786c357ac66c5146e77d1105856cd6a336c283d1a14258dd76e6e3b94112ed10a4aa487b6bd5ad48927a0600da790a566a505e940bb36432caf253e02876c57b4f93ab805bac86022e111d4acc419af7e0b48cd2a20ab3c296c1f3c53c60f903e4b3012a289d9cd3d316bb3aa49eddf1281ab042d663e3fea979086a59adc652136a27a45901879d5396fb49a167056c0b196774e883c9695a880b352e0c8ee76387770565c9473518756e876555adf948c3024016e0054dacb6ab4c1e21d75c2db08cd4b975dbfe7259f956a6e78e74ebdcc4ee66cc0328314f71d749852203d80873938a7117572401163ba3a5b7b5c685bac9b2e9aab3ce08cd2ec0fc67d0cac56f83a311349d4680ea999ea0463d853980bdda24bdf58e244f76fdaaaaed51843f810f48cf04994446c25f0e79ba5e90ad9729dee6f58ecc6b6c25bef2e58bfafba4fffd780f06a8db3be01b32dcea447abf4f47712bc7cad68758cd913126d3cfa7c8d083d8b046b0f352c132be7c0f66eecc6438336fe5a69e3f19839dc4a6c563a85d2049f5605fa8647b180c438c98005337b5f57819f4efb19bf133b6add27ac7de0708bb0d5989d141cdbc5bee35518a047627bc81a2c882a6cfe282e225b99e04f440b0037eda89e49030c6c9f98508bb7085342b6504add97c653d27dc68ae87a4eb5df6e0019fe62f5cf5abf74828e7f138fbbadd54213e6ba1b3af2fc6b8d6984ec6486685ef90194618be32db295757d0a22f9aab23ae48e1f49c9015311c879e20542da6faa67f91bb52197622906fa787d7784af2716e6124dd2f785c52ea8a2ed90a071434b2d1bd33c902e35664ee2e8091a5fd42f91b1f38ac55f80be264ce827db401ee0490a509033806dc7e53e6b9bd235067cf6fcd4262c0230f998ad37a23f40d0fb870b842ce7a2d129d4240ca7facb3e01d4f75fc2d055dd5f9faa9ae48fdba1648550c4cc10130e358806d7554c41e8e7ec60ad5c6a92da28290c675c465ef805e2423825657b3a241a0408a5a5091e3e05d898db2ea3d1991ad0a5db2b330adcc239a4b8a80abdb84fefa788ea644948609b4b16fab1d56d493efbe9456c2b160dee6b22f820fef7a4a15359e23f38e6769a5092da894b036072ec9deaffa6840ca32f42b91f8fd7f15846ab4c24f95b1135ff3aa467d9c6e101a16e2e9ae800bacd4d7b387be07583cca27439d5bc44cbb5c7ec17763431263030e35c51c6ec14d09a310c4e441397ef9e9d94f729cd780b4d561af649d9688d5363996b306036e179aef10105eb85f79df248ad40b78203ce36002e7016699b1493b3a0f5cb29a2e356a712f35d8081eca3d4c63d6863bfbf35296dc6589d7c3b2902b358ddb7b00eca8371b9dd090b1d7f8fe017b7aa7d27976e540c57468ddd94506f6590520e63ff253477766bfb1a72adf943c8cc4af5142af75e739e1dcc492098a6c4bfd265cb0b2a0ca5ce45e1f30e20d7ee75a87e5667fbba72b9023a7acd690cffcb34988c8e5600ea4ad77046a39a699f5522974bcde8ddaf69a705293cd325b1a432e74fa7972f4c7a3d1eafdf9fffc917dd853cf25bc5257129f63c045219ad58f511ddf89419fbfee981a5801a4d8a5875284bf1d2ca61c4fc2a60ed0007ca7152eacae2d387bbbe19ed6c3a4096ce6a05cfa7ff321009ed9710052cdcba2902aa12b4660b9e27418257e084bf28711f59ae08b942dd95287aa525667a9d11d40461743d6f2e69e98b92e014a455add172865fea974606cc1361065c269bfe4c8595755b8bc21b9895add571d6d693e0c629254a8157572aeb1a9295561e30a09852bcd3782e772a1bf0bb8246b7d14340887c408c995250f15f5880b12174bf508ee3cf9d9e1a3c6403f852d199ecd7bc0280def4d0b287a50f567bd25922597cced48656303c4f21370cc50a74292c3018dc089d132c2dd91fc60b8794500caeacd0742e8fc04fefb6aeb93679cfe08a24f0b500dbe09301b5e941e0e5a30115a433001dc401dcf073da28779c83e5093f96500f2b83f4f88ca1d47081d5fed166e728ad4ddc331f3620fa469da97a37acce094668652a0bae0252201898f490e4014480941d1aa837ed637a21b742ac75baf4f4e5dea0fe82056e3f4cb87280b0e60b9254515cec5286bca36f197d15c9aa743508419fe8a5ce01a6b472a6f6cb21edc8d773528ee29a593eb40e37502539bc9e1ab35e8fc407da69d75fec39670a8a46ddfa8a029801c7502bf5fea26d3465f1d72e8e9ffe06b3e52b007b86bccc9c6a4a8a2ab861a63e66fde8cd52e5b15611aa7e58ef273a85099ef097458fbf76c6843e91a46e8ec8d1f1e1d39b225aa8b58ab579d670ffd1af7d4e59480d3b4cf838c78b2f0ee626f79433b8e94b020d0b198394a1d3a704b8a04b3ac676af420ef6e584aa8747421c6aba6b68d280c2075da7246860caf17a6855e396335e3650a761d82982e7ed9fe45e0f13719c0ac9bbbe4ff48985bc369e5931b2ba795ec1e4036787dc50174285116bf5f8a29c95ccbb775052f30597620a27c3d03ea34ecee8db42c07abf4a7f52519ec07436a9be906092c89c40fade5585e513d6bdc3ee26ac6a0805869fa2dcc6edb088cf0e0eba1a85c8a059660f679561a2d3f5502be42fbc746c2d71c0ac6a8d7dd6b1dc68ad8707ff300fad381f04da9a3999ca69bc415a6b7c1a51e4eb5ad12a6ddc61643a056bb602488ebe7af557420ba9bc3fb168b69dd743db0a4185fc55a4e3a69ea2d1affe7b6ae90a964a2f1d447d4b9c8b5223d87151a1c6c16ee7969b960e0973e16110db85ed91a4419661d1898e36739fcd885fda528dc9189ae377cb2299b2172d98701f1bda1e2019903abd2d684a862e5ebfcf3dd8646fb6f5da7ac0d5693c80b2c5a3fed335e41a8ab21d450349aebfc342aa6d3d6df278fdf23ca1f734b6516a235f4df0e7c344eda60b0f7ff0089353a22d60f58d09090e5d7b0fee245e421507a189f49c43eee8a05124877ca879b28e9968179c88b5124015220a810ff28718c85a181ec0194e97167b90930130109a6c7f375d72e490cf925b517d05b0c228b9bb4ff62e0be906a41597ef3930869378b87ba682504198b2ff25304a82bccf20f39570dac18f7d6790bd32f8f857f0d9a61a6ac002130a4d9ebe5e7b78d53f9b9261a94c14ffbf4a04176a7c70e3c58291b80bfc83918078bff3ae221e4c6ca110a969a52a94af1b4b312ecef5beeebaaec971c6cf2a526c84536915a16b89a6360ffb66fe942c2e3396ea7fdf2099742421fb6af2b05c9a47954478c7dcead7003aa76e9a2be4e1a6c0de8567e6a58fa06e763fdcd8ed7b0cb5586f24eb9f5b867e535b79381d3123a5619a83eb63f0e51fa1c7a8afad5ac6005da311691c4b28f6e5a9918de28e1fc3f0bb341c60aa5742c6ce51ffacb429765aea6e6660396c3500cad30e606dbc226bfb267883f57be9c5dea2494e3f61cc8c2e1e229a1959829b1b372572510e7db8b8fb0088fedf259ee39fd0eca9c13f368d1b42fff7a163d2c4c9a0a0b8d51ac77032e8a1c7c440af3cd4e17c88f11e3de8c8e32f29bf79c44f49cc4c077ea9ed5ef4543d632952c2df88bd495902163c543016686d43fb86d3d3526ef1e33ab285332101162e8cf9c09f2c5ce631c61a733a86b5f2d9718a8627232a635891d3ab8e6a099b883e6f42b36f316b6f54a8a0548e67cb03ad612388f51e380f73cdb11ca798aecdc530e63cf58816d4f972254626732cc8c4c1a4a3de0d8a7acba89d37646bf386b9972ae9f2ae26dc0e941f913ec1c0e20325868e14796de53dc30d5e37160017cbd2036def19c93a940cfddc417a78063b7909b0d22d924e52654320028805fcedf4fe3b17a70772eb38a2561c5176193c074d38da5f8c4b52e080ad423563ba4547630351fcfcdb20c11af46e2f625c3b4dc385a439c2a442cf52740a5abb86f27fd295c9ae8e224e984cd33f0edbd34096efc85928268de869aa92344ce13f21e310afdba549b5a20ae02f21e8e5bb8de06763669c30de0ba22cb8956ba85441a95c9b859975a629bd101e90ab056842a53fa09ad7e0c290a750b54f85b93bda61a9dd6813831d229596da5a0af43f9ea72226bc2280229a7598e4ad811713e04df51e6eb8eb8b9b990ac9484d26aa5faf2ff3169fc992c9d4856d97d82788bc59899d92a60c1e2c3673a790e28071d7a5ef4dc3f9b9f938fb3adfd2cddbc71c29c797758e95a78159c93e4d7f824752cd552b9c95b1d8041ad7292da8b5112309de7f65df1b59fcaf4652f8919f494b39533a802ab59cce26377d2520529c8b2ca056afb46640c6bc230bf305a1b9b069406d98db237683a3370301f18611f2fe0630aaa8cfc1d0ddf9fcf14ff22ab9c11dd9270adf1188c415b72113aa7c3ea77d6c0efb093621c811b4331d3745189efc45222f1ac5dd9c8ceee1f60f413a165f24274ebd402c29e512c30f65e67855ed37ea76172ca07e7b5f5d36404edf3c3832ed7d45036c9bbaf72a45a1a6ba1a2749c4551fae4fe3b5a86317741a9ab4803d1b9dda5ec73f05b07caa5db11c5af64533fc91cc460df8677563f648420d5334c9d1113ee289c68ace4cb5cd23403e6b08132c4cd04a29028b232e76bc7259051ce5692531fc866e7a2283a8c50021812e5721422f64292721849fe3384b0160ee6ab2911f81defbed0c9b94ad9cc38438490627387e53b5412a637aa73079ac5fc81ab01242faf7950ecc77d90dd612ff254b3ea8f4d924ae278e764fd12c243ee6c7c0924dd2cde3700e3f239244361010bb277092b2492c01df6259457a18a924d7f4f0f0005db5b2f839d29f813c6450d92491086ec7767ddc2d5cbf179bd5b9c60710f085363f13093844dc1b8d7cb9b4742dcd8124083e862f6ae78b6b9d9653ad23f9f40d20c33caa490e302621236d7a57756d77da07fd9ba681600b96aa131b961ae52e752921e272aa34ed1691a3f18ced14614f67967c52f23f34571fb212c425bc18812cbc44953c1863056cc3e9a5a51ce04c014637ba7a8abe2430aeae4768085e5e10ada70b43202a4747dd760e9dc7cbc88001d33624173f3610e74d118adca2e0f12f62d6a84c253d2afd810749dab6b765eeabd2b554ca80c6f4da820e79e9320c9b6d10ef05884cb68b06a9a6f8587ef8ec1dbf961f6aa85673ed5f41e1a98485b70d2675dc69c2668d7f9532bc0a4cc8761f66279cc8a36a5cff0584fb69e669396598d5c66943b498561ad6eb5eb00e64b1deed8c6e1083c0ced716c8d98358af08c1455b48cb1c12701634587deed815087c31d4426356d37f6b93c96c1bbb1c3f8f22a06cf9d54643d6eaa05ce1928e75348ebf9a34e41c325a3ac3026145b1742a0116ac860a8bf89b753c7eecc705bf817cc2877bd93b91fff3c6b90ec7dd7179123fc0c068bb4f06efa10931547e82beff0690a0280e193263186397442ea3640c4af412da6838148962b6db1fa3a65f24a844018db88ea3e409c947a0373d46f1186ff30c68744d85a2b89b8e1d7bfb6066603bf674312c753c01d9540c2656c97ce32d3c048e49d935113c3a3c4aa6cee3b5e6cb5e17aa5bf28eb61065bc27132da9a1372e17222c405d8573a011cca025880aa5eec5c2ddb06cd5b353130e9db35a314e2c07e25a4e71bafb8e12f163fe1e8480d90fea1025462fdc28e3af7e26067c30e47bf43045efb39beb01f2fc84072742d1d829584dea9841d3b39b92b3d0ec487fc98d20c5397040608fe0e9edcdef68a0fbfcef4a1924577aad0bea2feb04ddcd60696b06ec827aa242d3b1f6cd1862ffd3e9ffe80ab129ac9fcab0622b901be2095b3cedff8f64ea8728555f867a0b7a7413d54acdcdf49cdf78c506fa42fbf49e7a73d890f3f77ad0fbe8c34b11cda2ec750afc2e55d2b4d14a5be49f31204d2f5f0ff27d063727e55908dd0f4ff849fbd4412ca1a0f406627752cee09e7f4c01c5cf4e0b18795f1dfcd340758eda34c766606c8271dc463ce082e89a716cdc96b9bea0453969c4d8a1e5f6b8c1bc73956b2bbe68d72f031c409f13e87101150ea0c10168b8010537a0e0025438800a0750e1021a9c808613d07032e0eb4ed498aec64642c71d1156e8648302996319ac7e604586509ae9d705985a2b2a9f82a394a165a9ded4b87d1ad76522077d37aeefc66119e6709fc6e9dbf87d3456511421f158e787cb97e3fb6abcd23442e62cef1b18a9c2ee6337c67205277b3c149b54aa7d412eac946d86b87690656b4e2e65364476145f985e02fc639f858657cc409a352bff98b0cbc73af8b993c1fc3fe625800451b65b5d003f416099701b83751aedf75f073fb0f6b2c58006fafb8c55bdddcf5820e211b3ac3f49f506bc8dde4069ae5903f732250f0698c6968aaf7e71ca344ef2e37f99602f47a0884905338dc22fc1591ab3e4bb18de3625699d58d1b565154c3201d1e2355e97066046c4b281a13ccc49fa20e824ce75877929247ca56ad4496c8fa1e21c7f2c5d06238d69a717e7da7b61a7865ba7eddea228b18ed479fb3ced1af958dd082720e4d0bc8327ab4db26285eb1475f7a63ff81a8b922a51a7f2d6458286dbb92e933a8f7c1a7b60413ec24fade41e1f6e916ff0edd95d4de1a68d05c81e3c3d5b4ad6fd0a2bd9c4bc07b981872699ef6c63b9fd03415f39260135213db7d14857e89a1854014530151b0c2c6ae04f7b3b7d028719b0db4225d6e265f2127a79cd7bdd16a86a38c702bc26db34e7212571aede48196430f116603dce6ddef97060c3de085c265e1fa2999be0f0b8634dd31b37b0596ec644bfe48623c0f93820b69fe0e9fde67769a0f3e8dd9532e2d54bd32b37aa596eee40bffc4627d8b93860c63ec1d7bb4def0140efd1b7973a961ca9290cb29739e834a16f9a032ab139f035e7405e71d0c105b24f4939823021015dc8bf1712a6369160d6586d6ada48c85f115ab02b3c4e6f5eea1113c70d51f960dc84960bf7f2e82bc8771b2cd935b46eb1eef01239bf3f642fe83818d6ef4a0799b9da43f0206e10e74d89e139c8efae2080cb260a8625624bb21d83b0cfb813fc0767af522323d8aa6eaf256eb54cad042f3823a384ff65d14cbfe023b747da43302dda88f3ffa40cbd034c1ed1bb71782d9e6c58702bafd3a43b36848511175823c93346d7e99f5220b2a06d3e9cd2f0d1894e61a174c671e10485847cde4b644892b5f27e2c0420f75912673bc54cf318585fd58b8a18ebbe52949ccc567d29ba46b3f995dc1c1cf234944149797a8423db5caf76f04c3879381cec0569b00097e53ed86ff389f1fbd663d382bb31344a6784013e6033768141b02ef06ae85da57d146892d58f1e80e804ab72eb609103013a1f66f6ae8bec2efa514b405434fecaafccfe00d82d0f7316b105e875e6c6dd0075f25e04148927aeb3e04be7ccd4adb39203c057ff2489926e934d995f140c03dd625faa6048f629c9003cbae779cb0dbd766f42c7534f1ca787df84efccf0f74e9dccfd0ce67c369eec2cd8c1c27778006fbad871ddc03d76325a61566eaa305a358e6875cd254d1e459316fbc2253376af7ca9b6ac145b06a86ae1431bbfad7f2fc1bbda566e2ba55c4add1ea00b80a80309249a410ba4fb8c0a1255224627bfa48893bb5dc5873876fb4a3a3e13bbcc311ab731ef79f2887cb61a3b4cec3765e1af7c4ed4b90a85512602341058392b76c299541c7255a199af923a3d75305feb2c00674a6d276b9b84fd2ebaa58a503162a95addddfb8f3bdc469503e1182fb4448c1b76530d2a6199b0546d516a290d759bb8ec618b407a897a21c035cb3b41ba16b6040c7918288634fc524efb7a66b0c4e530b0a6dbdba85454d39a1f95b44dd03ae6b4a4d9b3df4aaa0a720a55b4a51f0a76557b63f22ca879e2207641da5ba797908eb092b37499cb114302a0d5dcb5a950f6001c0dd3f70cd945e7238fce42802b158bce04cedcc3012185e9a41512dbee14a01f92fd16def871baf038253be7d105acd2134cc9bf010a8c42688c8ec39ec9514877a0d60e87e99a235a8d97f840f3a5d760412d3f8c161b7f5b2d8b4efd600d6873ff41a9b3742472a6690739f2eb69505ee2084e54d2850039e77ab89bb8fb938fc318e8e21d56612fa79112487f8aa7c39ce7601b8f047e71cd9276214fa4e2636a958183bd710a96c596e45cc05a4996548b340ace47036aaba9f2e41756e2d9e71af1d22eb0ca49dbfbb6ca29d5b0e5bff515c0db7fbb3e345d8fb2a8d3bbb8d5209fa8966df02f2c7d559f98b3ad14863015f07e1d6e49e2d24e67fa390072396456fffce06416ff53c7c8b57a94c30761bf0e90d8b43b7ca616be174368b1cbd52719cc9cc346df855efa9cb551ab9dc3080383508e207003c927e32d30b99220cfaea4dafc39a89399bcee380efe716d88a3e3f34573bd5c907675211cf096888e0b8d2b1729f69c85c2807b520e7d8fbcff35cfc09c8a05ae76482c87be3e04b8cfbe31a83d09dacc1688b4f33030ac7ca9b3d720410b88cbaee6d46775979a7ee0dabd062009c95f8b9ad73ced1a8dd88796ad1644fd58c8f4a0765c7dbd240de28836a67ef156da1e96e105b3629b799e9533ada2ef04be23eec0283a30668b4b9a693e01f2dc3de5811d337f8608c97dc9602fd3e002b92c30c00cfb72d3d05e7373f039c70b30b0dbf15b2cb6d0e59328908fcf6d735aeab47dea7f5337670ab1da6fcf9f651b4ad09019dc04336cee67cf0c43b94550957a7de4f3cadad98093c1d4cf8d7b9d27a240468c900d481fccb7b51b5dfb978dc23112a8aab2dfbbc2eba3aa1f9df8a4a8b3b1f77a0fca4cca1aa4d5ca05ed2ac2066fc72c01f289061f9066feff8a291b5d9ab0e726f2a85256c76c742d91f009ce6aa1ea1db803531a0512e3beac04a5ac91a59734aabe60321faa235114370f6e9c924811a8fb956d78966aadb9e17daec763d7a7e1d1cf304cf85a9f7ea183abf0ab345a918099fc9eb537078a842021e97a36eae81b5f78415319222cf1ca5231f143cb55f01e03acd05ba11864a621f0480385c6ec3abdd7a337bd06ec1431ccaba330cfd10def2907e6b84e0cc0833225f303e171e276db6931d293bfad305feb3d54c36261c9e8beaea89d66dc93e1661bd2153b6f21dd5a09a826a254bbe5a09f57e09b29bd5863c58346d41bc92fba0fb4cb839b1c1ca293bbe77ab887403b741e06dad7a87a7412447283b2a20b3678c5835ebac4efd655447d06557ba8984f85671c8293572f5d6a467c070aaaa0da51f8d1f726ca1c972e135579ccc45b008a6423c6e35866715c8b60d067e3f6d08c91f9911609f2548f39801fd12210d5b7984abfe80b0a70e8824afe080526c97ab597478c705fd24c4a686fc0e99188559d00e9d9bad809d0b8357c874c045a50884286ce74467c6800c4865765a3bd79dc85f4e11ad11213e320c4cfbf9b92c1688c714250df352111abae7cbcd5249e893ec8afa32d38103d476ca6832d5dbf52e72aaaa718e11aa5dedee11310c7aa84cb4b02c3aa77a9ad274aa4b23e885c51925393deb494980436e2746d0463b7fa4abf921dc5b62205a8d27c82fe17e4dc355807dd567e47372c3ccf4d1b376feb0bdda747b654174fba1688a9a0920d0d15786a0d229fad9e009bc9747bb689a17456046d1ffa846908ce221dc61b9088f9e1466191d634f9b8e6570ff118e13dd9905be3d3099cadba85aae1e2d1a711d89414031859ba6473bac0664eea7a6356308193c90a6e0d5df930c029c324252a874b959294f7fe00747257f0f48afc28e022d26b2280826f22c23d73de43437b38bcbf1fee143a3060f1fed08be127337eb9796715476cf8950708ea0a785e0e052b61f2ca1ee48cd5eeccc8967de0fb830350434df77a45c5a3407c33203d669631417a7e8cafffe3f385df2cf80453c7d7d6fbf38ec072e125fdd9f51e991fc3ca137937761892809501cf3e1fa0fe7a61cfdc6820b1aafd94b99ad092a94ea249e3db505583104affbf50af64f9791f124eac4845a5755e89f359c46f6b36f7f510643aa2e38b9ca43c818457aba155b61d0fe32554d19dca8ee77d8079e378bb723697cca4a39dbfd0698012a0c814c442a4831ae8b0908639234063004aa602e3990987e3a88810190ce64041639402415010fc032003e4b824d767b7121b31748e7e1265508dc019301a0cf0a101a1c1001f377845a0fc26e77d53f09aa7cd0d5cda28b940137d8de1f79beb140e71c312e4afcdf968418ae7de8f7d973ab2b7c8e8030f436300a2dfb4363b0600fd8654d0a7857aff5d68201f265a3212b66e25d13dfdf9d175deec0f0d7f0fd461987f048eda6fe3dfff923ec8d56dca2d858e161a71a031960c7e2001ac6719e76646985632a49bf3410eb522cf5afa462eb54fc2646449de74c26e95505838721115dd18358e37a528b75c5011d8e09b30387d2017bdc8fe6342c16a955ef6b6c5011a473a4135914133196d0c345d83bdf1aa47215984cd17d1c79763db4fc58ac17ca0554d504b34bd34daa2370b5d8026b1704ed0b8538897fb6df612f1cbd0380e6a29dc7ff1fe18f33bfda143e1c3d04243d019f3fd8107a53bdd74a7199ba527122ff23c9687ce8e97235bdb78832690d38b732118d0abd8e3f9f65b7b64819ca991a78fd4b54b75f233250527706307c1aa9e9deb5b00807da8095edaf7662c0679616093a280fc4af87d7ad72d83ed724120a719122382634f5deed60512b2a7c0f73c97ed0bcc07cc0e02b9efedb00936a5e56202ffa47387c07fb6529fc5e59831efcac754855caad1f12f46aab12842af3c95ecf9c208ed333aa1214059809c5742a397953ed5197ba1d2382583932b4436625063ad714190a31901a93a94851416a4fa820bfc1569798298a7416311b503645844c2f84ab91c3a054438a7d1e357e166a0f949cb606c07724e658a41931ea04eb3fddec9d34c63e1133c66e1cb818a35d881dc553a46a9df9aaeb98ecf142cd2e8275393070b4bc9618a8026b82c3b90ebc3e103e5bb4a23d8d6a7e95d69843c4efa3e7e7bfa90718630e4f3b8eae917d249b9438e312175df09668ce2aae7a2742af079e104d07b3682e0b3e637448aa5fdcec2414c6b38f294c002390a5acf4505b1ea21926a3399542077edab17e66e7aad9da3025bff36a53ab0efd7b8e71bd6f45526acce3e68acff14d0bfb849f7713fe72f9dc21afd3e8db8046421deb83aa8f4aa7f0fc240508419e204c227c438a8057b8e067668077bdfc7e75eda41924d24b2754015ecb90aa658699178294a860644c9740c45a91412b2d3c30b82874eb13419e519793eec6d5e2ad8ee8a0eec7172b21e17d785a0946e03175c8fbd5f3d673e1b9a83890689446e058eed923679599adcb41a3817a4200a6ab1e2fa26b134aad190713561ea7aa356bf6c5cb84e8f240cd2c69784b7f1775aad81a894955a20be1b728c3241b3222abf432cb42f472ad11f6d0d0784807a90adf74c3e6aaa686b58bdf870a4b2ad6edab0c3f39a58a53412d4d3110acb7580b26ec8a2d2c114a034f2800894b524880391284942cc412c1ea0ddad3fc1c8fa11367321d7e3e7f96fda54b9716466099b8e22ea20c833334e2085ed2060078120060415b3797bae471f08509250fb4626b402415c1415dd09aee6a244c744ff8ac345e95f5f9af2d99701ca89c4c3e14199ebd9be3aeb25fe60661fd105639b7065d76d4e9ecde6e3ceb141f95dc2f445a4794ca5243bec95acc8de9bf4c55d9d15784d8833482e1798ad4640306db51e469dfad354fe30b414de1d7242c73f45ea05794e2e65f20740138e59003ba27ddb866e71a1887188e15601fb819f3013e3178ef1005810cb08fee4ba971d07492bf768df252f0331e4210f396d81ac5b8c9f86b1d3e4b0e49054226f0727e5177838885cdc9a3688a4794ca8f3d0136de371ce8fd7b40a41f1e4637cf4d04fe6ad5737535e6a72f89e844c7d81ad1ffebf7481d3b38549523c5f3c75eff250601aef71d2bccc559569ce17b7a7f7595dde27e24cce91c26050d5817f30622d761a59ca531f5d42e55a405b81639a1ee00092de3d3cf72c315fb8431627c5fbf285a66e45b967927c0581e2f9f964cfa7197c08ab40ee9e7148651a98370dc50a654c6ea5fe8f40645e1512aeda115e08e136058aa6f597a44411e32c5e8a8fe6f338e6381cf6810151526a09122d27642edd409685f8875fb2655322e9429f23a92be579d17070e6590a702cda997aa90a3db13e484a74da91c25c4b9c8468c10d25aa59b7603900e92ddb633c93f6669a5ad59d571b7b6c62d97341a9418a2a22a0d6091ac21bacdba28724f820646b72531d0056efae619485ab67293deef026cef386f4a5fcff4ab77698db53a06703a7ecee306b74b886db217ed9810d1e8633a8f172c7ddd4c4058bd5e5bf7b9683faede26546e2cad5938153761b1c51e47307d78e497c208e12b2b9782b2e55800f6783c4d89ae188b2cc378220ca2113387e69672b24329cb6922371e97a76358cac5d779c90f5ffb3f75ea405e6bd97f4da2b10b5c675ea9bc2ce6f8f85c5168762e9903167d1f98b0e1a2d5d488b0634b3a1df0e4f3bf4f5a3e8d1271b2fbaab5a87cd6c86782aa795c9d07bdf9971a87487371179f8438ae5a3cf677aff1b3446d0f27f079a85e130eebc247ed54fed88619defdf3d6141abf535ec0daed1d7e9dea3ee813a1559e74c182a885e040c522e988e7866b62140abf665a94108a7c65769c75a5182c3de5cf80e692c7eb62aa435387bf90ca424bd4774ce356da1925d731f118cb4c616285817af631625d92fe659f011986e165fd8562cb8e6b4d5d2bada6e31ada0514ad0d5255a5fbf9de57049834090158caaf7a9f5edd3015cf5fa5c0d2dbf7041cba89c65a0dd9ebde9a10c4e74341ff2a6c052127405bdc34116e159b8cd8ecc26f9ada96a85b1146b41f5503d6b2561f39ebddd3868e0c4fb70f55862d0a032e5b247f8edc9178dc7f70401e2e7931ab576bc1b5aa5c8cbc5e5ede9772c524fb19a14612677abcc749cbafdd6f7480d810883f76399a27a56df21177ebb017da5b2af363e1e3966a9af7c1b41dc3e6473ce8beaa1683fc09477bdc8d04bd5752253ff22b75d5489eab114b1df93b88f579a6e9281c22521043bf0e6528f5ab61b58a346726e0e1ae00d086252a7cc801676e9b0bb17f17eff2ba7bddc077631c47069b4cad7471bc690207bcc1b253f3aa0bb5fbaa6096375e261829043d4980ebeadc1e712143f562fc23bdc6064f49e67ba1523ea594e4ff648cddaab8d772946d0359f8f824fe62d7d381125bbe5e801510f4755d5514dcfd3681a54f8894687158266008bb5af85844e6d125d6b4b25ea81fa5db28a3328612b9810cec27bac377cd6623e144f6db0b080b04275a227656341c9021144577e453a6d4162c4aa203d7c2ca7aed708ed2a78acb14e95fc4407aa2a303658272b03cb594948a82471efe369f8812b9276c9587c6291abff3c79fddbe93d138b9191cf68ac4ecc546aab98952303b37850d7300ff1a62f9d2ae42ec1a72b9a01eccc72c8c95d453c314ca14379739043c67783fa29061220b3433f04108990d1af381931473b91da73625f8c6845b4a4a2714dcfb21c5af73e40b7e70df323c9e5b4fd8dd4485a452aee40814ce4ba66c3215a625de45600915dd96803f41945ddb3589674b991aba2d314a0ae1cf8a1add4a574c88ae1d5c935ae82fe7e828c5d8acb7e22e397f3372d7f7f8299839440728f989545a812ff91372a29d7896cec37a54ca9197bcaaddbb40151567d2ae2be6c3cdf2a104435c62e10f224d14a7827ecd1ef0784c000f8536cc6f4f896a352873790b61b6b373c413943cf3be076973c9b0d00f81cf58bf7cf683d733a7a33c7769cd279eb300010945a9c14a20ab0bb60eb0688ed3ec8bef82aa3d818775ab47d185af3a5af7dc4b45b394fb18e67457ada7a792558d148a6b6b7e677a2b4586b6741c9941fa95b9c13ff1e13b4ba60eef39bd481131caeb86518607058aa52961f40364c523fc7581c93e65d16c0f769dc24202049002a79ee616f96d04247ed0c4affd93222012e9c38219fbc8f625ce17d5ea8366968770340611c9e6ba7338de5ec4ceac5fa58b03a66451e1b78ff38f23853868d21e637dd7887d50747f94011f7a7678358ce51f07a5f1606cfe800f4af5c701c20fa9385c3156b41ed3ed70ea11af0e2695d28b9f98bd3c70b7d241e105ddd85ad5821cd2c89077b857c0f6f0c46a4b12ecbea8bec0a0d7d644ba3ec4e5d84d9bda44a226e8e9538e8af7b62dc5ea7ca7346c6dcad7fde1fde468c0b994115430fe35e6fad7870d874adb2928a99e79a28854f230d74454fcfef8b36a1f540a36768725450c6faa9d0bc3ed9cf2eb40fdd48facb8722e512aed25b9297e396da84aee80f8e9fb038d95f5e9d409715f354e18bbe2efc338089c6f9759a8288227b81f273ec852490a18ddde0aeb920cc06530ccffc50727c33277293be09d34c0ebea8ff651ecc2edd0836e37a06a50bbfad55b14d349f81c3fd9d8597fa9c01382eebb81901242055ae24d3ed18cf659756dc0619d461d699041c819a012e83a8aa4bc797cf97ce4128b9daebb4887a763fec0b45cc3262871d353045e63149ec096f719ea8b9f357a46b976a4a52a94c46438f8186b2d77fbd17075b0e04a75bf826c068b1d4237345eaa16d9e0daba712e3834db89f6ad87f6c8084ba2a7c1b14868a2d84d66a8bfa7037b617dd285b1da66d29026426f9c5b3fd64f7037fede8944f77c9419c3980207d2b6cff9f5c06ff30b640854fee3c9bf111c02afea591ca7be5d081bc06e23ebebd5df60837e0c14daee885ed4920c4ac51867a9eb502051451bd60a0b17e93d928a0ba579d9b2f4d2b1f622bf51b394ee4c5b8f2476f9666efd24558745138510aa6fdce61609727eb9624967f9bbbf41fdc46b9dc3f06046ad286f433169001a831559fe2cdc1982136203f88b78886abc65e2504e48b78ad738f31ba7331a52a786368d4b1a2e705fdc080ff316d598246181010976c72a65a5500180351396c4d69c1709d05e33b468461d6a2af3980c3cbea2548667f46c69da8965246d3d05d32b4807ac933373a818aeacade32b51b34fc2036748cd826f985679194b0adb1a5990f365b92f63db11ecaa960a69a040f07efc7c8c0694f5f531cfca5da81a466c70da0c0c247c641ebb43ff25c30e15794993bd180b9865764bfb956ecaa47111d3c401965d8b4ee49913630b9f980c7834a9d5c97f9c3b939f47ece0aefae346e042ab367ba54201e95493a751cd1ec48d4ff45b323d795eab0d1c55428f66747876876245a9f5757a7e68058fe5696e0626991bca8e6b7657ef3ad70449b86b03c367c1e8b632fa647190b865a6b8d34420869846cb2f7967b073e0b340b570c4f988214e64fdbb7d30f298644219820d06c4e6d5e0cafae3629a54b4ca0c17825301bdd145f2b47962716a37cc9a306a54dcacdb3459e212acfb3b85d15be50d2e483e0ecd12e4df44080685a9865b327a6c86b38890627a61675d2a0f60cd79b5ad3200ea221a230bb3e26a6b10b67d24ca23559bee59c7822d59ae9a23ca73a7990209f4edf24fd6d2288cc5976eab3d58aa36dd77e68473d6edee82b7baeaa8731b26692b553d66c74d1d7676cd9ae3dc6176a2457e4357cec8822bd8cb84b150e599f51ada93fd145a34274c12e5f6bbc96d6f60d4fa3d74db76819aa85fd66d6e6b1eedf0d63648b9b90dc6d429aae8fc42ec5eaa35d14be79d32e131625267803388906314c1b64e1069c12acb3c257e431e44127ac3ed82b4fcc64aca75294f060d487e7ce9ed343ca437b1a94f39e30f56950b672489a65ce1ed21c9e2c4f75bae534871ee9961d4a84e862b7db0d8792def4c8327ad3a09c3138d448bd35a753e84d96383b5b9c5220e9bec2b367f668339fde7838c311c3b3a741195dd810e3ac16a83c7bc289445fb9ea744b4873b294af39dd228f64f98e0adf7ccc217d65195de22bec409975d9c1667526bfe963d4a06c826699d360ad3f0dca8a1355e499f0fdc01e4466ede144ca52fe98136926519a7530999eddd06213a6af06a53667cc349ca72f0dfbc1300502fa429ae9ab093a7de88ffc2950b7cc9efa53812ace74c938c414797987ec894f05591e0706f2b367c6f97d3db387ab35d566d296d1a88b92a6ab931053e4b50cf585dd1323cba376459896eef58593ce1bf651d3d60e9ab1d38ce11879450e9dc8da9968903628bb27aa482dbad02b7228a3cad45ea3c189e11fad1dd881c050de238a704286b539316d01b159489d80124bb840d9e0bb22f72751280d726f992e695a26cc03cc2659a4c1d77c42749147882ad24783dbb90d539ee862ea9ee9ca7e16eb5996c599f504e597d92357e4edc3ce36286bf2253eb2864bae13446056dde1a0a62756778208cceaf4863d918aac5d62a163d04e0e8144a12c82d5639e3e567875ed62ab3b6f380219054498d58f90e557f70922322f9c1a9a1913944006060a2230188d75c64f600242aa5611da22ca2631968cbd59e28c5c54c1c09fc5fab0094415ec49047d219749ecb248068632e6b231532e105f18a04474b1c7feb16c3000c3308cd6d74c4e8eaf199b31f4e4388531e8e4301665ccbebb6c3a91c32d5710c8c8c8982087209091915141ae8f2eb30683628b285b8d4e899225e3cdf2d8123385fe8b2e32cb25ead1b498daa8388988c9f664976366896b449521590351852a61852fac71c444bbb299f2a3070ec41714b9428fd1d4882e33d30dbb32a34761c912cc52aab27cd843fe6a30346c5b57d7366fba18135409da4033fe14318364090227b27c114df8b6c84483da83e83062b31b76b3ac6241ba0504417cd45a332e8b42d949f6315dacec630981a026a936b559802baeb8a2b5437e7ee2d003acfc631ec7bcbc361aeccc6a908806b39b35383922706c5012b1b1baa5735329afa5b8df31e10b59b9a5307dba4cb8595fb35821a84db1d17f2dd68964160e656eb1a56ee7161b867538b0635dfd1617209f329253b7f4a6bec9ef437d0f518fa8d3519f3f50f1b49d4e271c9e4ecf4e3f2d3dd3cbef74e2b6d3773aea8419d020fd11ddf551842f8c41a7874056d93efe88764998c8433ef5ee769c9ec2a1f564eeb4543f4ca552a9d60ed65bbc050e599848de52b773ea346b71432152e34e97653b1ca7a36ec9b78d43dd92a7727cf77459a93bb30977baacc72e47eace8c3a3d08cddefd910a5367e1389d763a664ebdfbdcf093638e79a332b697c2ad1dd93ba72561ea70c4c8acfad655ac837bf7185f4e0fbd14eeec7de61f4de88839935c7f734559f504bb45c9408d868965abc1d9e888f0b28e986f34481fe49475c45c44835eac717a9d51b5beabe976fe587ca6d46536fd48c50c09b79bcee2b676d49fde44ea2537461593fc6e0c2fd77b5edee4eb8aec3eafeeb3ecfaaa8ba33bc7e88ae248965344e1532473ef36cb7957cae4ef4a27e4543d0172ad5d6bf7a9246e74121f4e61edaa2b331d9c774ae110484ead72f7daf54075bf314fa1f7c3c3d889873ccec1bd7b365d11866607596c64faca3ffadd4d376c1edcbb296896b2f7c68e65f73ebd530f7b5bfc1ea666ea13f578439951a69fa6bde77d7ed7bebb4db9d345ddcbf1dd266454f11e84e6d34d77a39e5763eefc5d794596371c52822c65a630049cee749cdef974adc371ba46bbd4b7ed1b8dd34bfd467fb79e8b9157648efbf13d75ef863766486b47eaa737f11df5ee9bb73d77b7003072ea3060c457ee6ebc227fb7b58300397502e4d44f97003976588ccc29fca3efdd7bc6beec39bbcf9ff76c7a31f3b4eca70c631be7bd0c9f775abbbbd7dad1fd7b17a3cae931aaa45237f442efa8cb2e87f7cf6bed389d7b086465af0756390492310c6495e5ab3c0bd952ea11946596798b0bd0a24092b30ffb8868504edae5901905d46af2dce4878486334bc351227cf20b3421cd21102edaec5023a409d048a5a4921464d28f2a2585576d4c264d97c98f7cf956687cc8f331a4524a0aafaa529d1e7177d5cdaec2f248f5135d541d96495e552689df53a954ca43a5bca354582675573d8c2f99f4752ad46d427a32491e613e3e157bc5ba462a7b5ef6dbf6eea44a61524926c92472a9bbea7dbb7b5e97f250a757a1befed747a1505ee85d4b7d9dea8d5d2d0f1f8048ee70abf3de79477929eff574d4e9aa1baa544fdd76dde9aa772a7b3a1de5a94ea98a6559ea5b2a533de5a99eca541e0e332c4ba552d953e7529cea3bba6fdd8f4ef5d885dd877deb52a9ef43a152a99f50ef0a915975ba7dc36177d53f950a7f47794fa550de511895ea9cbaa177d37715a54f9d4e47e1d3877f743477787bfd72dfa8d5cc62588f113ef91b461c216be44db7845fdef1612448bb280c8f0e4e189766f29c47399436311ec62cc09833a6815583621a2c3b2c4f744bf86e14d12da6f78d38a25b324b83a55b253b1ca6538abbef7bec3c140a8542bd1e85eb53b7df97427df7f4b512e44ac7e35d2aab111663236e70e16baebbbbbb7b9553125b4197d5ba21692931ad4d449c30715e737dee467b19c77533e3eebdbb9dc7795dc4dc56c556850ee6b4119b119b119b11d334ab59ab6956d3ac66b50dc95a6b4f354dc3ae691a0f32eee459d35d9c3cefe4791e3ea95017954ae1907e38336d18485cdaaa5871d9d247c489ba21d5cd682bdaaa381171624372426d484e9b116a3b9d70b815499aaf6e27d4e9439df047b9ad8aad8aad8aad8aad0a9b440b433892cecb8f88137443da8aa2c441b22cb33765ddb5e67038eca5b8fcd1fce130c3f1ba08331a0d6b9b8966ab62abe26b4bc399342cabb5d61fa13dfd902ca3edce26eda9996eea2ccb3253cc32cb4cf73c53e6fd46775b7b5967268b754f2f7b77aecbb0d9655c167ee0d9bbebcc740e875ffefc66c2916638b4d8eca46dc2168ab6536cce491fb199a9cd2ca5449c681aae2876c825c5964dfbf4286686f6167bc819596b5927efd8c31fadddc5697b7798dbb66f716ee7b68de3ba731b4a957a5fb59251fdf4d58ddd57ddc6a18781b0b276acc3198e260c84489645b81ff2f6d88a3bb5f6ca1e2f3fedcb449c18929b862bb232e4927e84a65b29abe58e307a17a81d98b4daa18838b19d2b92dfb8a41fde6396f4a347d90dc7cc4ff6f050d216c9da2b6afb36eca27edb5651f25e639cd1edf5decd1b0e4d78d5a0b49c1572a5318cb906a527b31acb19695c91c62571469c51175d74f76e668a7db67dca703864356e7b72a1be6b29a96718f5ec294d3beade148dc319ce3cd339edf3a276f06d38fc9c53725660ae6b2b85978db546b2c59fc5914a61b76a71c6e97c61eb64960755dba4acaf5c915cb19c6c1a9d233b3a47767aa0f39282da1767855cb1dc91ed81ce0e4f8fcf6b87079f947587a7c7e7c559a1b3e3a373c41538cc3a1c3e4e2061be7f387ca0f013a83b41042647fd56b1b74ef770e8237badd3e9a75a3d1ca33dec2e6466294480f281c24f3831e40a278cc10d74b8031eae80411d0a2230280c85ea5f8763e6b94845968ff447910275d51d22619e8857c0a4304d0b18148e02752886404104e643a15028140af513d880417d080acfccccd0d880f94e03c27c9fa161c17ca7c960becfcc9c208379e2a42423c38279c22ec9c8c07c9f390108f3c4cc830cccf713d880f9308be89b2e141c80210b344128e2822dc0a88a583145910d9e70861f182239335798d141d052198460b21934610b2cb022095f8802a6efb5890e1b1c5035c06cb48b3553ecadb54184922768c44ce936ee446be44c3fcd596bb78c44b57b98d164fba869a7d3bb5d60867641bba05dd02e689bcce73cd93ec63e92ad668d84dcb7d34988cc590fd34fd86bd3dbf46a7ab51cb779576e5a585f617d85f515d617689475393a5fa15f9d345df5d52948ddd2cf5ae97bb1802ef49ae0cf62757777777777777777d7d7566db7a3dfd1a21f242c3a0ddab72ae601e689675077aaa6d76a7af7132522da4e4d977e812e85b4a8857e8927ff90e3cf124ddebecfbb31cf9c0653b2f6d6de2c389bbbf0851307d3f141cf1eda7be2b4565f9428aad8ad3e8156a37ad4d73cecde3cdddb6eda6eda6eda7ef2bebdce6004e4e8fd2e2ffd16b17777769d9f3132e95897a4e2fa6afc8285ef47e5f00e0d0b395dbeafea7af43d2c04084e7e40743b52729d69d0765ef8fad3e36ec5b8067ba57fe69c2653e795743b325ab14f70e34cc7a1e9b2238ae69898539ec74023b76115f9b0996c6796b29da9f1f3d5a16c310cc3300cc3300cc3300cc35ed2e1c0565d8fedd3bb9cf13ebf3d9ce71e4a9a1d1387a7af6ffd77ebb74bdf75e10beb0b6b22c897b3a36ebadc4f5b05b2950af9a66ef9a940a98ec776137785c8cc61d49d39882b3b882ad6064b50783a753b4e5888ccdf372e7c3d71a24b8773105d629e39dd42e74fe5681ca5bb1bfa6647258f3c82c924794c92c724794c6d327561d660d6f538610e0b91b9c3a1e95fb7c3bbe907f7e37b10d39ba014c986ebcca75d1a442c36a812b8fdb0e5e818f18dfe81ebaecddba544f40b140c45546949a6412392646bed37ad86352a15826c4d7a55caf6a66e4763aac2e58a061a9fc17af195e4d8e5f81a5df555a3d0dd826b78195861f8b6d03dac56c8b9e98c4517882e1953b4db2b115dbcbf450b142a869ad584d0ec3de694bd9bbc9b753dbc6f58488e20327b980b69956131e1e8a5485a701b2da24888a851a7d813859488fe745bf8b467b929919c4bdeeda7d2bb8b658ad32d28ac93550ea752d3191af6180eb59bded51f179ce9d62435a922d5a35b81a28a3d772b15a28afde9d62ac895a02a748564b9c3f5c788e9aa439d622f93d17c35d91ebbc1706c7785e862b37da5e9166de67facb05df535a98c2f9448aed8371094dc1242f3f79853d645e17b45979fe882cd242396183e2e6421db87958a6cb310a7c8f67328c6c8bc3dac484958489f51b68f712249caf6767b4d4a2459dfc4f5952d0e6bee13658b6204901a1e22b984f3d347457686a6527431125de8ebbb31aad0ae4777add5e568715bf62e8e79edd61fd3ad40a6a04eb1b7918d58900c857d4e6b81eb4f54b1a7b7beba20efd5126acf1a9c3a3449d45d12750b875bda3b3c83b2bd14a95b13964275fbec745518dc79f5bc845e70275d8ec63fbc07911c143e0db7b47313075b0f4f9c062d97ad3e160dcb6223f7eb0362e1e064fb8d06e7d577cd9ccc3c1e23b376d674d59f4eb10ffa108824db872cd9be22e51ffdb0fe68f86bd07e622ed2a965187b6dcd23055b44093b7651f86451f75152d3fe6274a133f1459620ae4417f9449e58ca44152d7c618d2c29cd323a337a39d3384d339b858f9332b90451ca544a250d383a44bb456ed9b9977e726b60890669cbcc392b656525560dcecbe388a1580d32d1555aa2ee0a1d151d1a3a2a8c3a37746da0c2a3bda98993b76e2f8bb8b8bdb4e99616b7ac5b935b16b7973952471ee916d56deaf69247f6481ff9923fdced65d0902492486451bb7e7b792491dad53433c5be4626b959b2b6f518adc7c8de59965191bd7384f1ed6aeffbe29462d8c97ceb36cdccb28fc6c5856172593fb9f17f271491d87e1565db3d44f6ad9be55993ed7441b6efb0f0c5f8c9c3fe37932b732bc64fae753d5a8ff1acf51826adc730897185c86c02e34e9e1e9f1797ced0748abddc341053a24b661fa78dd6b64c6ea6712737e6d6cdf27461dfc29e656f62cfc2bec47e65afb24fdd39348926923b8bee346ad0bebbf3c81eb3af7726994a0d2e3528d3a0fd2f9de914fbedd2223a64966faf043f3367da4f1d1ad95ecbb2c79ce130cb324dcbecdbf64fb64782c2a6226718eb7a64efa0e8d2f1c8b20c6796d6b4e85317589fac1e413e197b638f2ef37651f89a983fe9969a6e69ddc56b8bd7b7916e61bdbe7158bcbe758ea85e53afa8d7b74fb77cafef57ff748bf7faaeefa016eaa1266a245df43eea96ecf58dd4ae599324d779b394274eaef5db8661309eddbebd2fae69dcddde7df774d4fd9ebaa8ab6eeaabab7ac95d9dc52db989c969cc10994933b3afb6dee2ba38ebb6f8bc31c69d09c28b9fe03031de097d456aadb5d61aa30bad940bb9bec3c2377f529fc560dd18264ede753d589fe7589fac08e3ce233b3c2fee5ca23234d1056b42e6931b2fcd649fdc0c6bdd79a4c17a1777ee34c8d3603debce9e06eb4deef469b09ec59daf06eb4beefc69b07e75275083f5aa3b831aac4fdd29d4603deacea149d460fde94e24b3681acda33b9166528349a6d25cea94991c147cf321a5c9d408a95b8e66ced8537ca044831a884b4fd22d7355e91a1d123367eac87c21a5a199393595ba20633db0374d115a135d220fac254d953537b9b694527675d1a9216cb25b7e2cf2934311ccb13d1a55382a3e941c1ba5c1f8d89252afb523a2e0b0971dfd464d3436184f23a68dbb1cf4de27bd6723531dde447d4241da953af618e3f7184f345297a553b6c6dc447d37fc32f7d30d59997b77c31899c34dc8ac81d8bdabe1d51bc48c681083c39de896231aa4c3d79aa7adc951eea45bb0a3192fc292f64edf61cf6ce4894f1ac4be6a10bb5dc1e79dc87675d04ffaf989693e82086df5c3538ee3501ac4fe06b192632b4c85a5b0925596a9be2f851121b3cf8f667556cc6bd14cb3d763f58486e6a23018d62101e6fa6559966559a6d9b36851ab1f3b28e5300ac5631c86c3bde0e6d4cfbc27be7eec30889d0dfe68d13c7128a318b6cfed73db52f0c9cf47eea1b63d44c5387cd8e5bd28bef0d9b6666b621e60966d38fcb23561b0413abf81d145bac4c8a4946cb3da2131bfb5b2cb471470c3adec1906b30bf17169eed8f0617f7c5123d86188e5c70e4199e62a879c5cc31ab9bed2dee873dfd094652a4b1759ce141955ea6bad36707d0785af9e060a0b78848fe8125b4e4fe6467b967d1f8b154350939718343ddc6e2f6feceed6be811d84664d7bcc49eb41afe11b53521e32d763af4164a6e0fcc2b6b988a7ac5b6690c63f70ec9098f8c70f247e4ccc7d0b9fc4f40527dd1284c617a5bd21895b1549a044105144d5304bc4120d12916f34d81856319011404044dc2862da67cf6816a98d06bbd2241e98d446f2899a16b6cf50ee23ba4a9f18bd4e478755b9e3d37538a274c5ce43fd644fc4891a6b03dd1fdc87e4ba9256de466a2336699f1c5f2ba60f83504f9a4e236e71a79f7ff6451cee8834c6184eda753a4c1e4ddaf5c76e61516565b1496c72d3af8409cd58e050f2e0d0904c261395524a2965030dc9b1ca2b77ea69bf64571fb60f0edb27c7cbeeb24a19a58c554a1e13d73dddea6aaf77aae2ab933b99876946bb53d395a03d0c424d268edea4c48f68fac961d3e735ee9b768df39ebdaf84a995c0b3633b1c9acd326bb35556825c99973e92a7be95205f76da27a905127ea0f084274021d9b16e071623eb7f548c688b28e1a928d76fb227ad98cd34d3c675dee943a554ab121626ac162e5aaf9ea26cffbcbde0a6942d2526e537185c3c8d2d27efdde30bc987584139de00b1425bc3358166ca8cdf2690d14948aed41fd93861ada24abde97e51e5252721f9828a2bf52cdf7712b247f6c822b56be562a75e0f9e0f1ee8a5dcf3667828f7b6239a23efdee3683c19f736202020200fdfdb8c3623cfdb74747474bc17f7b69f1f2fc6bd8dc6f33c0fc6bd2d27c7f34c474747475e8b7bdb8ce7b5ee99808080803c17f74c46469e67d2d1d1d1f14aee997e7e3c937b261acff33c16f74c39399ea71d1d1d257997484c339ea7baa70101010179a97b9a915ca9469ea7e9e8e8e878da7f3cedc7d3683ccff372bc7720be6839f6de99e81679ef40a2cb090808c8bb8f76654033a51a79df115f32231d1d2274bcd36857a673c4bcf7e37d467cc97ee44a8d4de365edca686696f125cbf1e83dcf4b0171c8f2a187191d4a6786ef74378e86ab39ba47471c4dae8721c3c34046401708a8fec5bb179bcef6e36d3a2f361d9d9f5c7f128383b1d16c39de46f362a3d96872727deb646b613ada663cd3510bd3d1d13693eb5db44c2e4c402623cf04d4c204046494eb5bb0b412938ee9c733e9949874747e723dcb246361a231e578269a12138d892627d79bac2c4a3b32cd78da114a3b3a32cde47a162a2ca50169469e0684d280808c727dc957354d47fbf1341d4d47d3d17e72fdca9ae1a31a8d96a3d168341a8d9673bd4b2cbd69036404040464d49993b3eafce8e8e8fce4fa793b6fab69f3049aae6fdaef9b5fb67997ebe178ee375d9c117b7424d71cab865cdf197d6176749421b52b88e7b4cb1efd00c48c8ec6bb6c26a503df9dcab4cbca40e9a1f3e19d25c21d9276d99b1ba3ae769de5e9ded32e4c49e955bbda75d6a6eb3022a269a476b5ebb024dd4952bbb09e9e56aa5ded3a6ca80b6a1776733384a4eb301e9e29fc4417964ebbaa92d28e524fd761365df79e6957252a42d4365d579374aba276d59e9ea39ea4aeab439d4fbbeacdcdcf4d50778458bbefdde54dbba89292c451d2e9ecbb6a433453ea52f70ec4179aa43b13dd727a7720d1451e7d45dd7dd4ee3be20b1dfab921a246ee4ea35df4e60823a20b7d77b05bb6d087dc7d467ca13cddb3764da59952dfe50e25ba78efba777856e1a399be320d7b94cdccc0216bc681c0e1f7c3510ace66727d04735786efe483b5443de01928d8f6c8c018d7abae07c35a0bc35a9b7a1703b3180c0cb3a8179c0b0cc35c6018f69d6c2d0cc35c6018766a61628161f51e4b3351c26c945828d57725598a2809518a88a89e5b5955ed194ad56f282cab3795e7a6def455ab345ddc4db561b13eacc4d11325a249b89d5c591f517d56866fe6d022a13d433d3d3d439f99ac1e0dbde1a99b77e9b7244bbb2519dd8e94ec19e16c3853a7d425e16e389ba54ea946fa26ec926e3c9b5c3d23b956ec464fa4993493748be566a7a373b74493e56434194d4693b1e829e7a4d3ae20ba25da29758b952b571a754afd36b9ec882bc26265474af3a87245727de76e89b369b03e3b9a2eeea68bc817ce0571a5beeeb058dfe46a8e38184495fa906341ae37713551a5beb3e2e34e425ffca250fd4928578ba45bc22ec91ad5675b24756a97d4256997caebbb254fc69bd9ecbc995ccd9c46f2e5932bf5df37818cb2ecfb58ac77d88c36827dae66bab6f8357703d54daeade3d9d68e0c9fedb0f049a1f2ec12875d925cbf652d67ccaa372f871aac0fe24aa24ea9cfeeaac17a95cbea947a7a8f623d9999545f59e06597f4217136ed9a3793abe1565c4dae9f3773baba241dc32e29d72fd74c7197d460fd1abe2e09ec1f35d8e2769a6f6ee5b2453365be0653274f7b2357e66dd17445dbd37323b7788aa0ec69498c6639c6a8041b7b627cec91f59ea22a82d224a6d0cf15508c5d8cbbc9194db7d4e4799ac9cc6733332b923b8aa4810c6000e5023294b040053005262081081c023192788003603480010b50c049025a3e7a20c0051247f038006b8789113a72b0c051840160565975a30004400d2045c48bcb2780930d574b370400025043088fdb58568250f901081a9a294b017de86106663590010c5c40090b548002139040042090c4031cd000062c400109f0d10301481cc1e3003b8cd0910347110680c9370a40800110f1e222001bae96216a04000042b0ac04a14203881f52401f7a9821e3c68c1224e3ca8c12244485a322222bcc98018475b0ce111efcf8f0488182922323c68df93331aecc9fa12901ce4dcd133264c8c0288251642486b99404690c3f9218ad1bf3894f3ef1792581480868093162f4b8b871716324063c477266707262d332b931b392c8cc4aa2f4861a1a9938b45a492c8458080d51816484040b2c5690c9eac8eac88e0f805e3d403031d1a141d1148122c7880d0a56ab99d4edacca9f91cc9fd11119649492caa05215f1dcdcdcf0bc72f7fa6182443214e484cea79839239c111c1af4ece8d8e074ba51d294e2921c6c8accd081e3926443d9105116928e8ab6b06d422c184b0d95a01a2268d89ce862c9c0437a04030f29cf051e529f1bc497239478487190fbef5399e8f261818794a6020f690d051ed29b2ce3fd5987f80264020fe71d72dff72792e86242020fa751041e4e24083c9c49607021bec822493c9c5e188a2e273dd1256b1ef070be1cf0700235e0e1148a2119f0e2fd69135d7267010fa711053c9c3909e8cf9ab982f822837c3c9c2dc8fd5924bab092a24b0af578d84a0878386590e8561ae28b443ae261afe128bab4088a2e99c4e3610f1de06123d9f1b08d72b39822be7411231ef6147ea2cb4a27baba46c7c3dec9f1b07b703cec9cce417ce923453cec1d449792e8ea1d033cec22300fdb26770a0ff1a5836e3c94572c4597af28ba5aa8000fe511011ecaa4015cf585f8d248443c9461208a2e289fe8eaa49787f2c7e5a10c12c0654fb71c21becc227265da78289190fb26ba668deba1c46979287586f8e9351e4a18e4be74417c99478244d7dc9929f3423c8c4b007828677200581e4637e47e07e2cb0c9235d1a57b9f0920d1255b79188f8278188b54ee23baa6d04c99341e462be4fe8ef832531ec69f1f1e1201c469cccd457b830f7dc8edc3630c5933501ece9967c4175a83125d2ab5912b3366004f0ce0f0cbdd72011cb2f211f2c52251c2c774d9220b085540880238646520f2c5124d00879d99982e2b011c819804015c44bed8a1248ad44c97bd79000e3307d434a0e6887cb13c0c38b2335d98d2027614b093809d20f9626d7ce0b0e7a5d07461443d709821400a11e5792424927cc1921c81c39e58cf4c99cf78e0303b00de814356c6868cc06e74d4e4a8c1517344be603c451cc9b32a19008719ccce7cde09922f98cd8da03cdf42d35589664a0184082034001cb27223c9974a4423e5398bc8975ae711f9525f3ac9a59304d049368a642e1c662d38fc86c03570d8992acd20f9526d28d144922f34003b00d811628725680587ac2f081c7e2a3470d893f6d4c8173a94c94c17bda13c72651e08fc034e4a016bb20f3864f5806760146c8344becca42424bf31632199b1d0504ea25450248a040b593e9c704041092a222a2a2a22ba3766194764967164c70740af1e2060ac736fe7f70cf5f4f40ce59861c80c83d2d022148a2c9f438d501b8a821fdb1bcb636fec8dbdb13c2f6ecc318c5e5c9963181d91414629a90c306014bdb89d4f94ac8d929292b561dd985dbc5cbc7e9890e591cca119349d7072327d300cc330acc58db925736b1a99389306b367ee4c9d6903172d3a6f580f3684f5cc19330b25164a4b729845e60c1d58ac2459de603cd80d76336f3224b3c9105116928e8ab6c0820516cab2f3aa62b556cc26c79cda49dde6e92004f54ffbf41056ab3e429484888828498e59a5ea225dd351e8344edfb40a52298ceabcd59ea19e9e9ea13cef1dc9ec1d2199616629091abe0fd71b9e7a536fea0d4f9ea79f1fa02714110945c1f370773b734ad5464949a9dae469923839f2063e3c47240e380e13252122224ab2b4540779236b24cd1d3a673d433d3d3d43797eab441149e4421224232fdc4c572633298f7c89acef9bf426ec99698d1a4264f92944936700a6c52c9d37132773323319ceda7809752693c97459f8fa332d13d62c3f516e4e6af20cad15dd19be10cc926381df63b556d8ccc6f762013d93892fb648aecc8735cb74ca7c89a07cbd0588a07c9c2e03c414593f3b2bd42289a33bc31752997a9a2b0e87648a35991c6510c180943078c316512cbde931da39ce7b8663e215598ad4c3faaeebba6e5ec3d445f7852fc61899bd8befe1186984157bdabd9b5e6f9885f55e96634c093d1c336fb4ec141061bcfad3a9d6572e37c6b5bbd16bba008eb10c1928283366f4d0830f3e80604aca0f3f0001040d1a2a2a4104b1b2c2c222040002506388215ebc754fcebaadd535e9dbe2a95b72efa68e5deff73677b30be072b7f7bee2d857fb9d5c7b30a6af1c193272745050748ecc987164a7871e76787cf081a707047b7c52527c5e3ffcf0fa0102881f201a34808254548284820842686865e51811cb591e368644882200bc1e330ac0510da4212e04120014e50018d5381a0229d763492d495c4a3604d092e44a624349002d0470c39aed6d5cd70dbb6cdf7287b86149b6af710370c317d91e0037bcd95e881bcec8f62c77e5862ad93e881b0a91ed556e3844b6a7714301647b206e38806cffc30de313b27dca0de314d91ebc61a442b6f7e186918a6cdfc30d6316b2fd8c1ba2dc307e21dbcbb8611443b6c7378c64c8f631aa4415fb7bb3a862ffcb4515fb18f78b2af630ee2aaad8bfb8aca8627f724fa28a7deb3eaad8b32e4a54b137b96054b15f5d1a51c5bee4b24415fbd4ad1155ecbd6b23aad8639788a8629fdd1b45181155ec4df788a862af5d1f51c57ebb0c882af62c6e1251c5dabbb84a449538c537f366ca71c14c20ab4596fde0e128afe4f8b394246fb4d21f1ad44a2abd30775aa0ecab9e360ac0df88b24531a57265882e698498522f4346aba552e550166d399445ae29d329f531b4f1bda60c7d3568445f2052ae8fef90be5016b584985256924515cf22a997d46993abcc74cdef63b15e3f79a0891da36ceda0f65366be64be39e9949932260f67d0a4427b6132343235a8c12ad429350731a55e094c3a0e4e58717c40842f094f78ac383527aad479b4c3835cbf94e448ac5a83bc30c599c03a42ae3508b1e24495ba86cf3eac91b7b8001f253c10e18127636fec8df530d2b73e4b4639362b75f999acd7e1a0af067fa64c0d7d75cbcca4892e514497194818c81af9822dc9214829240e6ab2b5967b0d24e6bc2d7a931676ad8549810412b8e2f8ecfcf4d497c9b56f9a8976ecb4c54db4164d78da293635cca3b7f4d6de3e521bfe287990d45357bd6becebb1255b5363ed12ed72a4505cc96d748b2a75d6d0f62d12d1a912ef9eb2f4aee7ddcebb9c7737ef9abcab7937f3aef52e4654bd4b65cdccde6d8f05a6d160bfa491682c38f9995e23bad0d7b344170c9432576225d98703404d41857d3844aedfa83db5db4d9296743a3e533754734a66e4e843d61ed2882fd9585ce4b8db5d0e8a0204e57e79bba72c8d4415d34f79bb9e9297b7db0d7579bbdc0e97b7bbcd225bdeaee9c894b7abfd6879bb59e3d8259bb78b116179bb95e752591355660612554cbfd1464415d3ed8c12554ce7e4278d8a34d83c3b0d56aed5e1987346a6e6549de8f2bdbefa20baa0a19621b670f2a58fd43a9b0ed90d7da4da737fd1f1e06eb9d05adb6db5567f3746b6faf6b678b29e1b36cf9499295527579c211ca006e9f0f5b38753a68fea90e8631fa5f8e7155d9e105dbc57a0985326b3d77dfb1e0ffaceb2a8d5f4d6a0a006a9d7e1c82a0ea5ae04bccadc487c3ceca11e0f3b080148d44f99e94a00ae3838823efe1e2c1602be0f091c3ba576c5a93962f85ab43dea35411fc344c6363a7cf6a6871567b31c0d42338dadec15e7b6b287606e651bae400dd68a131423937276acc341bf297df5f4457fbac5645f616298c831aaa8ba1e298a6d8fa01dcda36ffbd6d21b73c2de0495464264f8012215bbad9a75ec1a2b845c2f8bfac52aca9505d3ee66b128718b66dbb7958811edc414b688b2c922bd4483b57e462c69229db9e9d634b6177fa3e7125165fb46bd7f33a5d64f080cb7bc7afc6ecc94aafa4909b952b99294bc32d7daa9e19bdfb0afbe6cf4ac562b95ea29d553aaa7ec4b56a7abd3d5e957efbcf0612beec64cf5d93dab155e3dd53bd125f258ad5658d513a8a7504fa29e453d8fba14c75d1cdce9672ac5aa6046a3caa457a5faf671a74e07e569900524815edddd5d1abea4d466c2c9249f6e41cdd70467cdcc803ea1c9229a2f9ae09149d157e3cafc8d39e794b912f3a92f65b1e6245092a442744597d3bf7a095792a492402a09a47a8852015d2028aac79cb20a3f1ed5f5b057adaefa4a857f9c545f9d54b8a5fa4a95c2a82b6b1a8c9d924aa552a994b4e16eb4d13274e6fa9a7993baeae1a441ae57e1d860d743f5548dcdbc892e91870a67ac66e99ddee99d68f3ea96d58d7c2bece149386b7c4aaecddcc531cf2a798b78a3721c7765c9b59d8e9997882ad2266f9dcdf6c22179e2691355ea69cb7409e6ebed595c19534a9eb56cf62d4a1ea24a1e6a98514949c9634eb9a4e4114b9b064f48b9feab47d5a41ef625dd8e94ba99c8af67fac866c2a5ae902cab9092d4e6296a243daef65142be34116a501b215a91b35c827be7e88bd105eb6957cbcc94faecf501b18426d1ac611de99c4aa7cdacb182045a3d85696d999e691a2cdf28c23a394ac9518f5d8e59336fa64db7a4706bf5d4ace996d6aa8fe4fa2628584b502d53c4a6658cb44c4ecb1c69199ead447eb1eb9192a74f83dd3495bee46147914b56a732334d135d3a1eab53da46481121be7c443bd145f57a12fa58257775290baee4d67ca39ef57d5dd2255dd2e177674d83d839287cf5a104ca15ffc0aefdc7ea41644ecda7ce5d996550b7582c058b57ae5e7597882af5f3ae210db91e45e3034f2658dab0c046b29cef088be73e9bc96c194daae761ef347b1dd64054a9e764963fd1c58473683888cc2e28866712aa0970832d76531a34a337a3ad797b2ca311062102e6ecda0d93c8f560a7c3872c83d02cafdd7aaad1e82284e21605431a6960614a160a84d7fcb3cc3a9ee7bb9ed6cac93ae71b0975d8c95feed820c7715c9e51c58a872c79b2e0d97dea178d3032ed13b9421f51e8fb45505e6e5ca10f25145986444196f8f3f592c6b84d56cb28b39e11c41ea7cbc613ec3158d831ec2477bf6395a2d6539ef44d2b6d23be9e950fcc5f22bebf90fb15854deedc58064439a4b9c76045c6c0d72257312746e485298ce18a298c810e79d5a09cc218d090575f970025cad9623f27f66d727d9b9d7eb396abb43b00915c11106997a3bb55411e4de567af618a2f1ce56f0aa2a51ccfc5557e01b6d8c3171fed8612be0bc3b7c50e0c1fd62d3ffa5bd7bdce3abfd4b76c666c36c7e1509ab27bc761f6ee37667689ec5cb169db63a88685b4c8da63e83ff023fbdce8468f7dcb9e7dcb708c869252a6ee762044764e323946950f8715cf6f73fb69abdf1e4aae7e7bddb09998872b60547f82c6c24041044685e34cc166cc8c91a18e98636caec768376f0e7a13677a76204476f2c4b28985b4c8dec3994d4cf54cfb9d5385e1180f4b1185eaabd56ab55aad562b954aa552a9543f810d18d587a8f03753e46ab55aad56ab9fc006cc0ab33aa24fdef4983b29a511d174ce1412d9c9dcb7badd1ffdd60e2dcf29afc812ab43c670a8e10c4ba17aab7096a9076cc6ee650ccf1e8d5b1689d68e2cd303b119c34266e354a39ed8bee99a73ce1885082315391eb3d6da1885b0df361c32914d16c3300cc3304cd3281339d486d45aabb5d65a6b2d7d8c292108e69cb31f638af645610203c59c73ce39677737f6211543d1af94523ac410a11339d46e8a01d03e89e450e331718c4268979d0e994d9387cca66cd2b0eb04762886a838c10c3e80821bb2a00322983a8488145e30811d8060831f94400b3073ce89a1c070104c38ce5a6badb5fe043660eaa170227b142630500cc1acb5d65afb13d880b187c209130e7270041ac4c00956c0817122c3ac99223f2412e9e0018a21232ee4210830df4c915996655996659642f135866118866158c550c44ec1d94c9173ce39e7fc096cc04c0c05263287d85e0561db6208a494524a8982d2097df46144e263a6c8974caebc58363e968d0e5feddc32aad496730e5bccdb0947444191605491510587c481d2f9fa61d6208e54b69452887e3b4dfa7e4885c8de21e9ad4fb6c7e8198ee4ec186561616161d9628c99065f8ccc356268a69143960fb182bed879d28794521a14d322c5ba1edd0eec9623a2218402f49a2c7dc11cf3d849748b44ede0fb7c4a96f807f6cc763ce803a8d2a8d4eb174c83a053866604000000048315000030100c864342d15014c8c266db0114800d8ca44c5a581d49c4248581c8186390410040060000000000a00100a2434aa49803dec163596551263f045bd048b77b22bbc8f18c7274931f022d34a4db3d114317369b41bc687dec439ffbec14ad6dfa14c16077b447eb66dc0adcbc3f34fe876ad68b5671bc417f81d2fdc8ca697e4a677e6b3a67b5c8c132aa784d6799402f6036e441af6b2bfd20c9ed7632c86cfdf906f7650874883bf627a9a3a3bace0588151354467ac3dfc97b9121c7374147c5c26f1a957984f69c84d4cc63908fd93f0c43b0aa856bf483fc79e0497f6d0700b77a67bf8380110f801fec7f7e382c5964ea5cb90dc141116c391fcea54f9cd3c26d5a591d6b8c4af38306b71265569868e2e613717ec710c79b3ec5f9d2899e1abf6a03c49a4e16887c29bca660ec90b7e393a76097b4667c0d479bd6ac9dfc5d7a17e7af1de3d4e7974c10739e32b7fff4251cd75a339a3fe6d3de77c69e54c26c482810c2b4854f2012953cc8bb10b980f382ecc4beb6c0fb767bbde86ff37e228b4d7b048cc66032273b9c0e901c35d2ca72358bb64f8d2f8c0300249e5f643d4f57f0f8be165c02bf39a917e8e2a5785368fb25074aba3b7eb887297fa9d043dff25a3256d885ab8744e7e4c39fa9cc21011478bef46d6412dadcb85a80c6c3946004580daf2ff4d5070c779bde7bb1bd3cc5ac7b3eedbb96c18e90de048104153ea294a9adfe4784a6db38663b0bf744bbaf2cf464f36c61f7aa423971356ca466dd6f1058140f28b657573bb028757e2acd5823ec12f5e7d689b3a9d0010451224a7a2b5b393a5b6c17a47a0571d000c05594d234ba5eed45d24357d53824c13738764e6882ae91ca058cb2b6cb7220bcfbd0c093be86dfd52815730318b1f0181ef185211e2d908eef68e865465031a256ac7293e20e9b69c27d7ef59325ce057e821730f844c4b804acbfce71ae4388aa289b43b1ab8bb9872c24fe735dbd19cbf032ea1fa6f306c7fa1d9952441f2360624732ca2140120c81a9cc6c59a2001bb3748e43c02fc2c768b35f49ee1f3d9b233fa22e8206e1caa7bb4e50caaf748406e3925fa9086d2b303dce8028e3d6063993f5f5ee1de12d3d4e85506ebfb7c16fad406633fcfec473a25df1adc425582fd8c1e633243c70a52d864067eff303e089887a0d1524d6ee145cebf717fd0d05a9060253853ac3d798dad34a0bb8d94b27bdd6de58903acf0b6359c01d0bf4771ca400c42689c4adb9d2a15d6cbdcc540fe3a11540e9d701f60a22bd047be2e2d2b49de4023e34941d4d57cf908a5ad3205b32f3307906fb195f0902edccc7b54412347f11051ff230a1876f1f84653cf0ad9665ec6680687bca895609b0bc2bebecafd2095b9b6ef6a48e01423f0f0b866e692c6a63c55bd18a1fd26781290ddcc8733b237a240f4aa6dd0339cb347a71a95387db2c3414944c118f98a792e61fb1a883a8bfa82161705befd2d2e775ae544283e8b90d5d8f8504173440cda451935e72581ea3d8e4db6762f8b3cea852cbbc0b0e391aa6edc9c559c2cc843ecc91c4aeb8d48440dba0ea0920d3d2d21d646d035c9b1450312a1ce4dc46ef256e854762432393c544c2ad9487d506956cff1db2eb43bc70c6fb1912dcc5d97836e02e169e2ee71bd677ebc9b2646561bc320008527852a3dc9e77e97f32ccbc2c3db393e9b4de3bf0d3be7a1c54b8ce167363b5b1a71174af17b8c6ad35a38bd509b376a977d0d9d3485f13a5d5d2ede8e551bbd0375c70c61f4ffb76e61a5df4aaa7e6642002627422f31b6e5f16d545af3cad678a38fec1f9fe942e0ffba7a3df930083d35f58a4e2847ecb2e6e8ea573ba5ceca76667113fbf9e46a17ad84406ee79ba84150b2108ada97f5e6467e5f0e77b6af0620b4d94148720859109dbc6a1ec465ad5b3de3848efcf35ea5d31293fa5b236a6187b3592a95f86b8817a4f35a6397117a0a3535581deba78e9fc70f54e0209846ffedca64f79aa6eeed426d70bbff91cffe11537b9834ca1dcfa4b0e9ed85017d61ebaaad64a8fd003b4adf50a813039bad931567cbe5c8559854afff8f781f621086de07c4eb05152923764693a4d264ac8f9612cdda9f4cd708d456a46181f07842f424c33bf9c7b817f4fbde0ee4fbb519b4e78135828211caef909315a51406407f9ceadd3e970d1534a8e12db747eb047aa3de756fc68fa9793ead196ff0e1264f02c0a531a43a2949fcc3f1e8ec7f908ea74efb05e9b65410af9127a92ee89696043a6ba4c06f00d1a7dd2209dd410b9dcd234608314b79e2398825937f99c86aa550b82989036c099c4a576a164ffdd534fd1bc7dd16cc7fec7f2448060ce07fe2539893a557cd8bc08c319067b16c10403fdb97344249e66317c46132192e6713072449f34281ff8e2d099a2f9bc46be95a430bdf3cc49afd1436a01d9a827df9e4e2d9a00b7c1483b067f2bf3dd0ef2711f4279f07de0096765381c6684b7aca9f91301c5901c5c0f085a97c5b042c604a7922bc02f0391f74142bf016d96b375a3dfe6259fe390f17a282691f4a61b340e3c6ec96a6685e9b90783efbe253416503a63e35b103c4a066d7d9db95884de4bfc1befabbdc7987d4ca28078a9a8b5e36f77b266977dae393eaef23a45d6463bcbf98d7242c13fb3d853f497a3ebdb7858c65c934c8893a6395ca10e619b6a7d7b07303d4bf96102924b9b55221102bc18d0ce5664c6834f9881256177d2f5aa66617cc5709235681f33fdcf4b3f3ffa73e85748283bf02f4b1e5c70807dfc99173de97cc90e0a0c4621f0c37867c158c8a1e21ca9c31f188203814fcda3250e1ab8c6794a751de0d0d6a2c138ca5ea085b2ee2dee3c050c5096b7e0c2e0753e650df27b961e8c278fb8aab9db01653c951698c3a0a346d7b019e22cf35e71d6b045fa90dd469ef0f6648c5653092b13752be879b9ab17168d00b7b557483d2439821c0b7ace12667901ee62509cf8052b606d39c88f2cbaf25bf91824ea1e718c2e37e86481ce68183118c7b35fda17a98c07a2d6e8f5908a8de990d42aecbd87ea3b1b8a5608cc1f7ed049a4da593df9bbd7664b7e525fdd6b969c649faacbc978f7675c1604709752b9ce927f9ee2b058eede7ec391b7a75edee860ebeafc1bf988633caeba694ebfffd1c9eca4bd093ae2dd8424ea8b3a1f518fc50225dc0c263e6c17227d1f0e3e643a6d36d24de0ddc9b0859db26b8a72a1df9c96da8e027c770c61648ae187b950b33ea1bf25ba7c2177c58c69923c6f2d079f4e81364922d0697e0b2b3323cf5172e740b056f2fdc0029aa4df2e323a854a13d49068b2434ad293cc51a58974b0ced84f734624680a9685df905c3eafb459c6dde38fba7b0a0f5020741b4d9cc2a566c94596bf26d6ce4fa66ec8e99c936fb0116a3d48f747af56a64e093f82cef823d5a2930a92da2e485a4dd753adc6adb2783038177e18af2289a7eeb67c3ce19ee63dbec8a5c75b823d8e2a3f45533f6cf0d4c08318fe4cc89e82d6aa3ee87bc7f85caffa787d53aa0e0eee7964c59a35113705eccd94a69002e8f9b3b742300e9ad9e4be81d04083dd398560e261c5a045b4572652b893ca1a844917f3c6d27f12b6067867e318b88f890c2149280365eddcd4175b31a4c8c7373ee1b05331428633ae83deeb8dedc4f4053690b0a4be03a2f34b5639455aa26d5f0cf7d38291dbe1e2ebf128741a9863fe8bbc656c86c2f68ceb3d8c0fdfd86019b73a94dacc76631a7b1708ab3a81256e1dd188c23956070d03d3fcb761ed6125ea0e72e003fd784d0bf26fc63d13475f4368afad69ba08102ed6ffb1ff2c3226680db78a076e0c49e3de587865ef1d1f0a9579944282f8a56fa66e232774b0d2c79b688461bdc5c1090717a0209f250b4445b5135319a3e2281cf697b7e028b2c16b3cd5afadccf133ec0e8615ea3c2437e5d8c825543eb248055bbb7a0dc1dcf296a36d8d83bd46a7e3af6e7d66d7bd185f74631b97055ea4a7e0c29a4615ec008bf6e235721ab7c1ac34137861892fa4a1efe82004621fee7520c5d2c0c5595d98a6b08f05722f0bce39cf087a3d9943b8e5b7177581bea72173c52c3746aa4049aaea0df0ea4e3e23e706044adc179aa568d026c6662bbf862044086d6cc709ffda8c0b456852e237df10309d401261696ebbbdbf0a17b102f3584a013d6bf2b85c6003b364818999057f41270bd36d7051e653bb319c94998f47f7d76bb0b0d8ff9591e2e72f8d06911d1b0895b93e48d210690c2ca50578f353479513e87eb36e1c978476df74e91137b5c40b089cdb4a0fde110a35c081ac11e16438c2735862f71a472aba5102796bf8ab7411e1c2123ebb73a40e55fba155d857f0b2339450a374fee7111b48a27f9868b81bfa1ac3f16b045a880e3d7762d05559c901869fb65b9c54dbcf28d0d2dee531502115baac4fbd95b00bb4bbf109380c034ea9949f8478d8f8bcd5c37b9807b0be6db74767442a7fec36f2551312fea90dd71f9bf238608614cd6815552cf9f032ad8376c70429987a9ba03c4152c5d16a7b9c05912c04743141a93417015738c186822605c0e1d32c70fd944d057f2aa44313461fbec939bb6f81011ba6f12d254fdd520b1fb217832ac5fe1d7db1c97edd488836f7af9327820f83a7150473470bafa6817fa4235a308052ca0bd9e1c3d42b1d0ebde34605832b9181693c138493e291c7ceba34a9a232d4d3821d2eac18588284d27d4979f6daa68a9eb04c21f0685784f9305512a4b159d09ff572f707fd0442e74faf9aea3a2e623f35d4567d63e0cbec08490312216b067298e6c71b475ad3307b5e21e59f11e1c1218709065345ada578a2332ee90f786d8ad37f56c7049cd337bcabd00d3772ebc8ceef87ae42b043cad6f52688de3cbc1c80b4dacfd75035fd1b67ca22d195192a61c19d31f0f513c28857efdb4c5e0b1434832c610b7cdce35d74a9b48ef1e7bccb0ef272f2c99e3b82097454054e8e885de84e96986291a7cb27e2f588d1890823c09c0dd0bb1a1498a74136d58e3c173317b7d47bef584a570d3876397b10856403bad7c8676b134212c8dd3e2dbef017f399c6c21b2c8f75e28cf81afa7386a9596766c67c560262adaf010524c85739f3a12b0ab824a0b57c3d4c6cdd83d94e091ff98629fd2ba8a0635549728ffa7ffe666a8d948cf927fab28596a9b9bd3705cea6dfd7d1566f35ab23466032755aa2ef737b9ed372641ee6cfff9bb26cd5394b602c8c1877628cb7ba7a10cd653b26d9fd7510541efd1fa79ab17ffdb098e7598b6a444b4ffe1c3042a61f270ee32b2a941bb75d9dd64d0a6fafff0043a5db8c174da261c86f47ba2d35e0a2d9df17ecc0496f03e8a1b971ef220653ee8dbb09a3f529335b888f208d5eb54e167643d403948ee8f9fccdf87ca9de93ad43ec4098d5797ad2b19d3ea76d8b27cb0c825fd6ddb1f9aef29c16cda3e472848eac447d164e744437a2b463c5e8aefadab6a42a3a8cc5715cd11e02f92ff08fe9fae5fabb9f54b7c4f72b31e4e89300f86c7251126d050500e56ca9635a2086c52974d9503d72052d9958d7e3af56ce1161646c1685658a32928ea99684f3ea43d7260d5ed28dbe4a4a6afe1ce156a01c0e09c210945a07a3fa2a47e27c57729b9b97f158c578b9013c680e69726422e0a09800d1b5f1cc76b791aa4e1276dc639b27ffa1d0cc6b6175507c5144d0d765c31532c656c40de0a1341b5e3bcca274e23647d6a4c2cb0f0bfb238534fe3f0ee462ed9b89a5bd07149e10bf3264d5247c0e31a26cb84923d79b1f8564a7d39251009dce68732dc26b64b3563f0060d9764d0ac31204fcd777abc3b5b141020f70cdf15c36f305d76c7975c807a9b0f163b92cabd8689a819fd0a1ec83f2b99d3e8d1fe2de2dc81649b7298285f678b7cf16ec219c230181d2a905c1441826a31ee57801130b1a04c30a39c73a333b4c470f1e2702c9234fa35935a80b4ac88a8d8efee4f1811d4383191a787659868a6132dcf47f95830774922612ce354b56e934837bec7553b50d5120c9ce0c1232dc1e08ee208c87ddcca3363988512fcf0326c9fdf530d0de1ef0531974e6e0f54c6e10ed8b9fc558fd78023b8a8a11417057f2a08ced6d365fa474751e7144bed1f26f58126b670c8da594c3b3794ea8d25d211e4199074b9da034708b737e509d1ed06d2fbc2b2154410c04ab7aa1d4b91085401f20cf289be4d7f6ecb3db9cce68c939d9f110e2a9ed3605f696b4ad96ece7d2094398ce3dd6e7f90b2ad695293e1b679ca274d1a49214fa910684b8b39651dd5e9ea51a5aa5911730f94b31d236858a4cf615430ae9b729b90bc27dc279713d302144fe59e516999e9d543e664db437e5919b02d7ea5fd4ef6b87cb41b01e09dce6d3cead246cc53b5089d01415ef90646c37cbed0e2e10ce9c5f888454b7912bfb6b75e45ddf4ff0d98563156f101740f8ac1e36f0344aa8767497c2846a166b371f6d43fdc23ca1eaae6f1239c228af4f587835079e89afd5ead581b79fe6fea80e70c176d5fe3a9a92a822c3cf152fc0f6e5b609ab0f6c2588daf64777fa619a83e0f187916a9fa8a184096b2d8873b99fc62b37c0d6b3c0d8cbf774ab5ab99c7045c820dfc2ed7b528f1e1f9edeb3055c4842f1e680305529ceb364527c8eba1e3057102a0c5e47d74e5ca892d3e09d400c410cfc89cc8f2ec8413a6bb1de1e219677af0d24b1ff5c7f4e55f7f56bfe99076a303612fdd26fca31ffbf8fe811f1fb64d19eb289f5c000f8d86297460b3971a33f1c2c71ad4adc8a9c1c6a1428549c593a9925937fa0887bcca5d558019a663c9c897d505e294ad156f3ad1ddd757fa9ce1869e547d7035c25b85beea5c4e6576fe2b3834a388ce612fec9a56599344dd8f0cb144ca05be173f7d8becf3619c4a60670652dc654008a640d3a366b90e868ac72cdbac1b4b53568f305421e84ca171b8237cdad36340c8cf33018a0e55dccfdf3069a5be7e8bf81c29280f1c8e7117d55a098372b4d11e62f0482c457f3361042bed6f24883e9f2a9fbb5152fe61498d981d3cece5771214791484de006172e8e043d459062bd6f979afdaa3cf6b734b8a71dd30f7fa31c05a8a247ee34f63867d0fcc23b4dcb33fc39e5462061c3a1f8730227faf446545e2b08dd63efa755701ebf99c2502aca0738721a789f7dfb899e959c7f7d7401fc20cc6bbe1b0a258e3e99a1964e52b2a004cb988cb059f1250acc08314e8c7dc83c872c7cbaaadb6559a147d04f405bceec2ff10c65b270c50c97c71de66852f819ee0e403164c13c52464130f786d28f4b6adabd80f3424f5112fca35d42854698fb7c9b8bc0b7ab3ae6a9b66b6f42c5e6563994d6af8c2efcb73a3843c01647d178a1c8556830b5ebb572c6eb193fb689e60b4d32290c7815905d14b97b81694ca67d50654def3c035406ae780b3dcaeb6f5fd1390219bf74e933057d0febd4e6f7c29c2a5e1baf156062bf8fb95ba68eef3c1f162020afa335cb7f486f746e193e1e448c7f26203b9b418979943e088a50dcfbf00895581e7fbb27d6d2a05b53a08e98584da3dab988c9eff49733032fc74b5a7093416844e4196ff45c0fa672412b7d0896b682956116152cd09c6cb959f327447326851ddb0123a9c49096c499a0b01997f6199e55d29ed6698751c799dcdc0b0e05e55ee801e2029921321a7fcddb767ea9cd884801e571c7241a0067e5bba362cb1ce78ecea535295e1fcd12a8a0f24fedfd18886ebd0e27e5d69c260dce4378ead69ecc621af02c1f3b92bc0118a3758142d70a75ce3afc5b8ef64128e882e7cb768a3433d64853498702e1ab16d950a7e71d63bde52e9279141c68f08f6e9ff758c6ec8801a0b6dce87b120c21449a92d36eef8977316a7518825c8506537bbdb6511864291cec4a87c335c20a7ee19be9f0c612c4c4f6aec611f3354e61922dee936e9665325e6d8a36dc502dcc86c00b1b9748c61ab79e082513e41406da9d279a134e0c0a33506811a1208c78088cdf51149e6f7ecd5c0058dfa0e4a3a6f0ac2e25362094a42d0c0c97a650222bfd55467da601eb32888a99a5b9ac1dccec799c4f82737a613796f8abe98202819cf39266be364d0258d553dcdc1b4167d330d8249651dbc5b6d21a1b902b03ad054d26973d070b606641e2efe4ac33bb1fbc219b145d6c46e8987204080ddb83c0f227ac3bc79e0bf0b16434a963d37b49bc0e9ef3e75d5afdf9eb85d5b26c4306845d40b4c74fd645419e0f50c3335697c05ddc05491079316848ca9cecd77629cdbb0229757f07f4c0bd594ed4086e38c6165905fc2a4caeffa88ae27680dd01bb46a7d80be5a839961a56e1e3d26992501b4202af761cc41686d133cc9efbbde7e35affc37a92c5fdd3d5f7a22571a78c8e52a63e2c97e957732235f066247d29313fa2ece8eee775c3b4596f4dac091873f69866b1af4c0ee97a1803c807c3025c54d0c367203702ef613f861a9380719c72d236197bf072a81f36fae0d40b2bb627469f943d622311d54328f2aa1c244e4320cd4fb871bdfbff5cab747d905bfec623a977ad3706ef66cb74c57d56e48469d8d52110a9d02d91ab3a48eb9af3813fd252322bf1725f9c966cfa04d17f4316cfa8b20023f303d5c445a29c239f7f4d09e7230de9d60c2230d083c880f8dac76a029e8df5ae1debabd8874d3cd195fdf585a1e770cb8c18c52a5631c5544cb115536cc514abd8c52846318a2986628ba998622aa618c538627889d12d0292473defb72664856f484dfa4958a0fc65b02d937f998969a59bd1b4eeb294bbd34191343bf36d28cf68b1627ab01aedc07967b441874b6fc2460277eee6a4222b146a8b0291bb18c0e571a8118eff0d6f95994b05eb4951222476dfd221144f1fa64109c294c11749729d061527f0e5f8c1bdf7a754641cfb7261a34eb4b4c55cbae41db16a23095f050523c7deac1628f8c9b0dba8a96f18edc4ee2485384fe2a7b5fc6cad4fa6356c7379a0ed27b516af2d9a2e1005180335cc724db98e7d34336a6fd484b3f5934bce143903383afc5d8bedfd3089c949b8c5939aba6f42175d47064481bf73bc429377e4b197cf1e21917acc6f1d5fda792388d4c85ff6c0ffec61ff7e392c88a631a42bd520826d3f585e7ea254fed86a5c41d45eff00aef49d021903e2218906b314af00a0289241a476ffdbfea2203a14bf4204fe160efdb5b730ba067c01f04bc62052df7fd8affeb22bfef9ebae203adebf1084cf20e2ea7f3ab4fed949ff70ebae203ae8bf9c1d31f0cebea2534602220e211385f41b1b41c4a3ffa27c471095fa75a34f48e8a6190ea95514c52fe88a8e497fdfc35bd0b7205251feb31ffcb973ffffe50982e808999d48dc41c44dd8fbb0dae11eb74f9b04112fbb87e640215510ae219d02111c71049959241944fc1c92f0f8c520ca34784fa24dec581b3b47fb777436d525888e19a0723b88a6a5f17627870b22d8e3d3e5a9a0340e27114447f34d26e04afcb1cfd32ee02062851aaaa642b8b7d452c4612cdae503fd2b4904e4965aaeef74065f390cb41096e5f50c5f7b9714cea3f540d0434751d58444b754ec58b709921ed247403fba2934dedb90eda09329005ca8d9321da78153cbc9733a72db4fc5a0d6baa82f9d2a76e735dba47704841cfdf0c1d075c45161ac9414dbe41739ed4408759b533178a63548f064e4a0d9caa3abd30b8367648385dce5e6e7232834720086748cea3ca640423a6dfc6393be302c4b167c8eaf325ffec9c1f6140cde744d08fd98396f76ef28e9f5cae08dd068219739f96904228c1e882189aa86a72198800ecdc30950471a71364133a41ff837b1d07385b814fba9e2ddd8891c7433d3212f7701b916cbd4dde8f2a45c13946fc76a189794d7e931316af28b9a6dcdd54d230194c41399f43123d33b33b4eae9c17f7016f3d7eca6f52184c2a8269fd2e1b28b668b01332fb92bed7e8a8595c315c8183b1ea99056c718d6b7c82d60569f6b0479c50660c629994faaee8885a2313ae4da7d0a510bac1d789f8bd23c0b7fec60d22148994b322ba76d7575711e64e189e5476473ccc19a521f164f83742b103968ef48f64b1b651f5f0b2543a6e40f890126c67138a361007e7c51107eb3b0ae1ce0daaca20d0ce896ce84e07d0195aaabc6d752acfca3371c21a708ac240ef2819d0418db3f82fcda24041c2a2411f0ef20e2d06800d1b438d8018416c004fea10b08294c8070a771cc61a7d3fe50551c0e0ca0ea358e1f938b00e4f70f0e033145013847b2ff4e89bd914ac6e1c1ffbdd6e330900cf5dfbd7be6c7208dbb7ff50e3208b0c0939e59c019fc2d66102325b2ffa614781fd4a2a6aa03fe4e3a8800827bff17fb8daee07b66b0fda927436b0f84f0e7cc42367112fa29fbcf8f0c75aef937d11f4c07fafe7380219b38167ecaf6e7ef4339f7fb2fa080701a90e4e81484b4f70fed1f6a3aeddf2c656868798686ce008ae8b22bb13f8a694bee34bb8f212a614d9fdaddf45704538cfea7ad075b4a57ccbc43ff8977df4615e7239563e40acf313f4e83efdb788954bed0ff93bffd3dc8cddbe77e112c6f36331f89c12da6520d880b78221eefa7c317e21f18a120614f0bb91528063f2f8676ec1cfee4b394069829b03f7f3a59319bc8d32d647b14654ff32741bb0d1a94fdfb0086a1b50d76db16e8dee2d9903edb28090f645ab8a832481b81223d98a465bcfaadac9e369d36aaa8980cbf3668dfa9599ac80ef90e72e7e90f66f159dbfcd399aed240ee88483d19ef76553ffb81dc1a1ead13e25fd5f4258b5d7909677acc61e9e01a34fb9a0d4627c479add94916baf224c8f59cd3b2d35568fe373bc1fc901f5efccd204779f97b8b5e461edef4f2691ac68323954bf748b91c5a3c86c339b5710e966f6bea5d55486393c1bc178fe0dd7a1fb2df1b3790fc4edcec4c4fe366b75a8d382b4d3224d4381471a141ca9386188fba5cdafffc787318bc6b9f043353c792224919291aa66f969d9912651b0a517580a6fe01c1eeb6d834b0d3e9dd5603d3b0d7f56f436b7d3b1171b5786f7d487701dc20c8203699cf3f82d39a3ae6c7b1fbd0ee4c7fe6cc7a91b8af57d9345b31443cae2a870fe8e0be2db45adc5645fc175b9eea0220ed39149afe87781a9360c3c452f4c31a11252e209c72151a43e09479289531ea3545d89412877d5f18ad4c0876eb50266898db2aeae38d31cc96b50ec43ab265a196ac7c7c2cc20f9c89062d37ed5b4503197fd18c4565b8d772151063bdc604c7e835171b5a3e2d1428eb5f42a0814284d2ea5faf28b8f0a8bf59db3fa34d370d01687a21dac04b007ceffa1c20ec34f948d74d4fdc40c7406459298101f2a4bd8880f74e417ef22455a10428fe03f0fb02b8444cd04c3f806b02b61c509c22bca476722f3d07502ed959ee4e51aebd31d0aa896e8beee66cbac4739d82ffa083903530f3c1878c8affaf97f60fe44b42326a3160a6313bb844a18c7436fe872fd5b02872baafbf486c2dc62f04790a65b6e11424c25be826d8d480782949d01bd9e10601c2443dacd9f3cf5bd87d40f95e73e4278b35ea970dffe457c0c5d93f2279e329464ed6242e3a91a994dfa431b22237ee50764fc61acc3d61e0bed28ea370efca89dcba62ed42f0c8dcb1adb23e4f7dd54afda553b0eebaf112bebdebc2a06088162d758328941d24b2b9382e9c90495bd171fe43811ea5b89ae79294c0cee892f71b508b80f072305ad47a16cb169678a1ffe019a7d771d055bcb2808c516d381cb16a353a094d241aa7509d3e13bddf1623d0e6732cf4aef3924ce7f6dd0b259269404a49f9a4a5ddb4b6adfb85365553d7ac3bc024469e8ca0cd09489cd4149d32dca622f504301ea46819e1c64933c722c69de298ac42f4b2a2147a2e08d43d4006ed080f141eea1013290f8744d9ce3b3c5344cb7b3984c92f9066c640c3b52ccd7e636806a718c455600e91acfeb9952a5e1a2535263bd9ba641a0690ec942aac39d5b8dec5c9d9670172ac8041fb0f836986d7b2302a81a506d026bbc20ef15f1110f98f5812be0f740c570a6a0ef64435d727c09a227777f7192ff93d8f0b5607ca1a3d204c6a91870c6cb2997d875872db304119843b6f702da10bc9dbf92ca3ae247631a0bf622e1c183cbc1850fe54fb42ca81010a1bba624d5b9ddb195b1c54de1865bdc60ea72ee13d23e34343fad4cf258ca26dd475b31ef2cf01c609ec19a162e53d30ef9d1609ec1cb5e1520749da3e467e127539060c940f234cd91e19420f36445b1ac9de1fbcbfb53a4720a65b8138c16622cff30f95cb65c55229d2c02b2f9756536507d9e5623a90cb852ae159ef08d92c2d809216d5acf67c4f4e87da13544b03e781ef935a36a7124215093e8faa943aa5579b5509a1b2e497472aa54ea9c566aa215491ecf36895aa577ab1998a102a487e7aa4520815123e1e5115c20a894fcf3715576a7542d116dd4b7e5c314524af71bba7eefd2f70c827fca87b98f87a11f300f15b7c4b89def817dfa5a2cffb79df52d1f7febcb784e87b1fef5d2a7abc9ff72f153defc77b4b8a9ef7e1bda5a2c7fb78ff52d1f37e26bca545bf94e89688ce524d7896887e49d12d2dbaa536e12d15fd25a2b344744b616aafd41b034ef37d686227a3f29571ef25dd928a221343d0a6b6c8fbe4eab55e46dc6dd5f49654365da0ac96deea3d461172f9c05b109af6e2e7cbe5aa7a47da17879d6b7c37e951f31d995fdbd2b657ba2a4d5456cca09aed62dfcff5aa7a0fbd1639195fb6c0490f32eb98f9d92cedbd4fc7a5a265c708a2c916f15fb9d0ebc0214f88d9c9e6dd6fb36b27a404d11a0443dee7ac3b05a3d2472db441ad1edf1a4f569a5ef23e3ccf8b48c049e2d5dd93608a01133f60b293f1b7da84026466e99efb99851422800666522c869bd97871ef5d33d735ac21404929c26d6b0dc148b56ba0089e4cf065ef1532ac249e062a5b0c0e795dd80b04a5f9e46dd34cc183ea26a704d91a447f09b1b19beb450c3d6cd5a3cd91e512a9b6cb7b2cf8269e9c41b0d1945a1aa16e160a7159713d6a1bbe09e4d8e9f5bf9605401a0e85adaa205f58d7686ed473a961b234fdd9dcdd0b0b3f8540e63b43b9c996dac31c1adf2d4eb885e82791f95718c45f6388189fe249fd4d116d2e33bdf411fc0f1a8a225cc21683d7fa25cee46d97b8a27c1932e6fe6c36d51cc9acd0ff7f60b28f75c4d9b2f876e2fd7d9209eb38df6f7474c7f45eed5a80c64943d87518267d0ce07a3f3dc99623f88cd05ef823e45d2a69c525708d2689c65d91c26880cf7de31833f6898c0df93f90113f351e06d003efb3b6c3c8d856fb3e5a74bb7e78e98208a28ac7b17a70c12e9dacc5d44cd6a9b25b524960fed1001725b25cb24037fd4666bfb3f7ff0f3a0006db690432222e19cc2aad9e925264be69256e104bf9c27a2b8888906b175b11b5dccb04325298bb3b2fbabae789c7482c7f2cf0def2d2a9e399b8b68a7526bbf8690fa5cd4a5cdab5528aa9c057effccc35e33cb42bd97779f6f5a3c310f32cc66be32fb394990abb08aa650eb23c8b5f9aaeea7e229d849bf9cec9c323980106cf22c0ae73c4328cb4de2ff888adf8c2c394fa0139753cb946c60f00b3155f66330c7eac946f614c5cd9cf819694b21639162b3eae17d153feb44afef7a5a163f7db1ed2f962435c455740936bab787c7c3c4030d4c25bec6deb6bf416314693db80035b48cb6a65d907efdc70ef7d3b745b5172ce04932e25cd642aa60525233a608ca53813ec4613c175c407af81f86907b774220cf22738a5b88c0665b6a5cc4e812dc041f21cc581ec763f0731ad69ea42ebec6199d355a2b3b5b0f615cbc1ab0a5203833439db5e3de13390715bec6dcca6a19197dfd301dd163a9510c60d2140c501e82a9d4bb9f2116e5006b7767ad6c51ec06b35b064a9d4ef9bb0d4eb52ce8c037d8c4199d74d2da57cf6118d4179cf74f6dc67b6219903fa2a5343b71dd87c413a980a38cb413d08c906aaaf497c5260ca8c8634aab3033c41c3ce668fe3d4201420f54d4013f5aed8cd24d33347e6605def5437c7b9d12f21b71fac407c051178b4f1be8e706fba46ebe3568f9ab08394ebd8a3529c9fe995521545aec3eba1b40d55ce504af6c600119586b23813422fa99ca1e21121998a5ec4468b924f3d91533d5b3d79568940503811e7fd3fedd2c7f06ad6be33d7e083fd8b8e777e2f78b38c1cbacd7526820806e26ad82dde202a7b0c50cd3791a7b73d5bc346c57eeb36f7cd9c9aadb9482e5c32b5afd0f42d2194ae27bb46e119cd5c87e6897e08dd363392f5f0846c3f08add0b79a058cbeb5a9ebff8f18771468a64db87b7c7f73292aea2ef79955bd82c55b69a670be58366b8835d7c0756a30e164c4558fc85d2e331bec925e6b2d5ff42150a912cd1d27a396229deb6cd2066c965b3847663df1ca7d5a0217e47e93b155b9069a5a99f6cf33759aa914df42602a13d7beded9375067453170458d137aefd568c516e353d5dc9f93b585341454852db7d1082ee5bb2ca54eef2a6b8cc2180344e6da8078234610e74afb361ac1d41d979b79db78716fa85cacf1f1cdbf682e0dffd545de1056dfcb3488c2fc8992f89b8b6bef6e2e93593d97c82fbb70ea9a1aeb83f71d059cbd5ad148b15e27f66cd0280aa5eeba42151d88b88f3b64fe9a5dd237716960c91a55570294b80e0307d981fd604c35c743128d45c4b12030f52bb46b68edd984c0f6dbb4645e3d0bf0dc498cb28f2b0ed39ebb05a28daa6f20fb2f77739b4c5b73e2cd91d6966d44e90b99c6f1cc9b302de815ddaf593a7028f437adcaa13bee67164a9c2d3770aa50a55f349323c6553d464c7afd5a2cf750a0dd049ec4b438f885348c4883cd79b7f20eb9cfad335bcd96a583e0725adbd64d34c4d11cf01f56789e51cf654661827d66cc39ec3186f1e1f9a2159bc4e4724277a22315c92ce9d2f783c14b49679d724182ae08c8cd47c209ba0866e023485cfede23b335d4836e8f72a00e1051c9fdb5ce86aa291b87828604311af57386071a26e8e2797c15b31a9676361af73966780f53f945013a2a1d78e1390fb7152c604cf4352ab610471daf0fa1f1e53f010795d03089985a4b009aca9a5489c913a9d749fbac410ad7fbc86a1dce9cfa4c12a713c79f536c297521620136a835f142b362515cc1fccea1b3f2c324e4b5e56371b058ac6159e68d78b1f1859e02d247e09dd362cd875d9f5a48784ca1959e74c3ad498e51edc77b196f7030cd1193a40ff3088e85e6b85a958c1b052a47882ec676349b38fee0166ed5a6350ff21b221f630f886291b661af483909df9b8f75b651f36cbec279bc7b1b3eed1ca8f394e9b459cdbed9fe94be2a40e3ca36587eefde80f080bbf8ccc9134c24dbd11d7756c5d88b823c92bf4aa71c58055ff0661e827a880f91e584ce5300d481d337857805c6268548d684518f533290168a2f34913860edb99b1b5072a96099b7fe61f7f04f5abc49cc0b8974e9b4ae6596ceda0b552d30e83401784ce4dd3b9f2402f93edc0955bcaf96f5f5c3cef9974b452fb5a513e479fe87217278d92f66b20ced9b053df77375e1a2f505859b379d1f19f80152bbd961d5f1908dcb5e105af2350764977135e211518eded76f30cae95162e0dd3fd2e37aa619210a3d1b5e59aa8557f1446314560d3586cca9d7cfcf20e5ab0bd4f09fc900b983f7a15054fa6cb885274c6d97db97c40a92cfc87db081f453ae31017f72441a4657b19bffd4bb0e3e8075154678b83d4dbeca72afbe0d5e16abe407572c243c8b321fe4dcff44880b6061cd30dc7a6bd9893e3d87de90a95c79efd790f0abf887be57c2ba8b649bae574e9e3ba96a50e8e892922fa628522f57c461896cb60191541bed5dce58759c408cccaee6ca4af46a8907dc73b360c302367b6bb46086f72236d3171d5b5ad251a6573ebd0505f8406d976b0aab006e536b9c725dcb44b642cc8bc47ea4904cc98465ac4c71460857eecef7546862d37dbcdd8b44da28b450eef6b6e6e4e4255ca8864cc952a9b8130921ef6356d1ef62d76c5e3bc4e8ed21c2a02baa3216acc7db07aa60e61698cc43130b352c5c42bacb519374301a8a071483a0235067e0ca99e02b3a6811b24b4aabdb950a4852e02461b45763d769d483376c40d243b91fd0bef716893c9369efd6e574f02d6260e258d839b4d61c4b4cfe439c54dbd7d19e9007213178473ac5430b4c12e0d6810541b0e5dd9e0c1ba6066ee710d02e659b1b0e61da2987919f2b8d6c04722c699d444201c516a0ee3fcede3739e4ed524cc014849fd3e9cb374d1d4588b22b884da1983763376467aa287d0a5a5a5402c836fdbf52976c78e596f52d3a36cf5897f232923011364c8da9291c3618d0d20759f86d10529b799163b37fb0b22385b9ba075105371446bc64781deba25920782bdfe63a5a3ba780863ab6dc564fdfb7cc4f682dd723fdc39fac9907a73c57b0a22a1093320a367cd846dac106955b0502f8896068583c48d5df298404c4157265b9f789d79e217dfa3bdbf4e74404cf671ed5d478dc6678d31444f0f8805d01dee2e8913af18803953a63c0d861ac8642118c7db9991ac3ce4b981e382dc9520c1040d2fd46aec28797422253c496fb3bf540e8be92de4ea16a0185a78993590e02e06d39eb47323e261e09ae8bf549232800106a0bfebef7c8080280d868ac343b8015fd084a13067085c682e4c3dfff8b06f891d864f948a39744e1fa3c87d84c404cf533a9067d489a4180c5d1404d6ebdb51c675a2fe110ed8ff35406c079442b5cd7b46c8dd3a922730a9e1c1776371b84969f201ec4dd16a7bba214cee8493c7c15bea7219fd25ef00dc47e75332d748ba0d0990c9fa9b9f0d945b1c2189a012aa7ea35f8ec117e2d795c049a5adb9216f7d814609062655e72232e5d6b89b8ef21934e1b9b96fd4e0efdd70279baaef945b32507cac834db8364548a34e05b399d9c0e3106292bc2e411d7393a9d3c3af2d4dd54dabaeab1421332c0311bc7d13b53da30ef59e42ea4b14fd2d69259a5dbef4c6ec805ade2451d9c18aa51e316b34dd4a80f2ca3a1980fac77b521dd7e5fa69f90616d1d052ce4fd4f25c7714dbf42b29ee64d265f5858d8b24d37a1cecd98da7ebd6765824dee29900b63ada57bde6b8c3e7c80358d4ecea4b6d07bf94a7faae847f58409d97ab85d90cdad53cb487a76cbccd41403089df89c7ad457435ffcc4e20640814a546c6cdbd92873090bee8a3948c7a03d412220d8c1ecf28f20b05eefc14bc6610132494d30659d8ceb0174652d33e626d5d2562551d6796e5792f78963381cabe8e48aae68e2cc48a0218c3936885798a169fe1bf3ed0ba9bb5f5bd460727b0c92c3fb7053380d17725191a76c3172b809d01b03c04140a04970f0649a5c77193a865f74ea89ab570545b239abd91b8c8ff0c260f4005ab1f304f2100227e6b5902e684f52380d25ec1c7513cd8f80987ffe334d9d69ed55c0977ea22bf015251bb92ee9fdaf3fa2cf150dac0ea4941840e528e40be814ec76fb27879542d64659e0fc293b928446710afce356464628a216ee92837ab891b106437b7219de732f71be89f3db0305f5932842affe6fa68bfb228e840df9e8d49306716d214566f5b716d400d2795c11719dab8934bd40b7f98d8e09f223ba9935e23859e32758695b687c56c4c1de927bc39aa9bfdadb8fdc88ccc95a7b7bca97087914ee358d0b869c2d08d6720654e01ec8e6b8b919cb36e65292bdddf754377884c469d0057fa7fb297ef0f2c557f1b278d6128a0efbf490fd26bd7ff3f38b86eba90ee79ac28381101be5da385ea60fcc0bbdec545bd16230dd8c37ec3c2f0cdf96e84471d5155bb4de080c4fe1e1c389f8da1d3cd70faf22f0b35bf37a0b0460ee0321191811deb6507c85ce0d7432d154e3ddd966d0d614be0596b59827e0e4e2151b302712723d31e8dc9db8ffe90ae1514684188fabab5c8f6ee51a4df7d600ef417bebfa4e3b2811539ec27e90e74c39d5eaae13d01951a803b730c4cedfcda67c0b21f869ac565e90107102849210ea1112f412277d1885dd83e1b07b38c16b23118c036e7d7da26ff478ca273d1d71a302d529d938958e6d7a556ea3326bd5935c8ec6894e660867f022e8cce38b4f03d204e06bec6e4d10e28d020c775b06a0fdb9f379424acf11b94e84f5a2d279331cc55a775138a1abf3c313b58f1d7cc3ec93160995047ce65292698bda33c73818807cec39d26ff07ca90167c4ad9d78ad510fe713c5e308140d9a1bb0f027c401b74cccd6618e1e330cddd9986749775f4015df7c9eca684c9728a4590fc5c3052d4250b7accaae23fe9d2a76394cd62b8462d6f813544a86211e9c99c9a035b732d1bae5787eece24a2bcd3ac87175c85e458a8ead1e0ef482806f747765a9601d2e841b543c8062d050acb8023439c636c329bd853521894a6cfced1db16af1498e8da410cb10a55837c5a5be3da318070d52939adffc85ea007e5a9560bc23074c92f4c0b5266f4b3ec57f9acf9740169b68195066cd8b1c54fe9d9021036fcf07292b49fe3936597b683ae9cfdd80219835c5a07d4b1a2ed5f7e92eed6ef981cd1c966180cf129d68f9103e60198331c5d7c1f6c46c0588c1b731d6c3a28fb763843bf84a5e0f867a50312ed748cb964e7c0c7d30b992a7c8064e1dab2b5268aba9e37470af533ec870c31a000cd0a9c9dae11ecc18e495501d56bffdeafda22f0189a0af7cb149252af3b4d20fc8980a8be53263c4a4a981423c7e076363a9520eed69b470dec1752b6adecad4ae140b8f5e3d0f158a605076984e653c4ef59d1d53551d3e5e034bf0d12d8a4a1336156a076fa0bceb85493ab14389e393593720b1f3f400f1634000ee2b1cec97e08d0d178a93003081ccd49d5ee3361a3411bd9640b15bf84d39f2d9a2ef8b0b6c49aaea5ff22f49ea0efe4a14680dd76e510112a15425dde8d647f40273c237f71f9f694595c31b167fc3e720ecfd48e2e9229a5ba88276a87a6814305f0305fb3efdc33f562ffa94cc703d123e8b4106afc5e150f3a9a84cf04be65926f4deae716e95a91cf1ce0091fa4a87cf9a3b8382f44e5896c1c1428b546f29b5f3ad3e0d0b52ba69b947ab70a5c68f3d22cecf3442bc48720d928b0434ddf813a9fbc81726430e49bbc576fc3087b6e7460835b1c0f3f0222232e879b8627686b25f3418fa904a14f64a90eeb0e45f5155d8a61dc98a3b68820632e8b501e674be7e822154ca52aa48e1c4ecc8e96338998d828d6d786a251b214bea39872c2460d7500770853adbfb03f56c3ae3173e50e71ee2dc8aef5dcdb0d939ff7cb5a16dbab2276645abd3e4b7ca7a7e4ce83a9081310322879c1d0c0bf65dfd008a9d92de97b40d30bccfc0b61a980040307742dbf54a32253072ac6ce8896f76b552377687d8e1f6b28cdc6e0e9d34c5776c751780b03d2834e2b981d9ce388d122c0a5f9e9776fa51fc7e74df0b26f92dc8b3d94c1c1da206f274c83cef6e1bd7fd1072afc1c006f3efa074ef5fc93dc777c5bdc051f69b98c39791cf0b7e6da33d32da2a165dce784cd8bf12729ae84ac9fae29342225fc1e1ce10c088ba89d1669e82c0fe260990ab1116f21f26aad363e9a2dd642458ca02e57e0754366f2a4b02facd6919392549db39dac5f1a1faf1209960ca8b29174f7af6d2d454dbe377de274002896420ae03023f922aa77fe1f6e388ef528f43ad4af2d6fadd25228f7c9d5352a4220a7ede0e5ec6fbb89860f5549d3d5d929c4e5599ec8bee9bdfa3250a72a0bcc99b82e7347c036324591e8a14fd11bb90510c20e4ca8a0f3e53fbb036c508bf6bc38a62582e2c5309ce59a81524dac0939998d785d6920cbd0c4d97471b689a8f5ab5caf4cd82949394e3f42d39b219a53cf1d6395445a1273c3f2ebc210b09307c90a042e9722284d7ab00c8fd983881da5cfccd3ba69e618c3c89cdce5baf7d46af19ff20c44886f3f8037b096f673c0f384195bccb29b3173a17f2f8da8c786a1619ade4fcadd9f7ca615c15868487125f1d2521e3cfa99c1fbd6a94c3b2d5a9652866f0af57d2bff027d8a47ec15af608a16bac9da77c440d993ca82fcd5425005583ba428a15730b88a85ad21d0e630e3e29770b6fa092715a14d50d4dc7fb87c1794afea34af12c0a7a34356942a50859c856588559847f10cc5885ec2e830467e66b01e489104ada99592066d0303e7e2041fbfca26a532fda09ab9f59bc7d6de717aca6007d9ec1fb4602461c664ceec32e1fbb0c3419c2affc203a40cc19bcdd5a1f28311cd660eade575801b37c10308f1dd5b3a9fb35a6cf23167dc6a3c16a4042e0dba94856b563b7fb86cb01b28b553f6a6a513928f28fd1e80b1cbd26a0cd26af1921b2fcd38093bbc9c87108f85013c03315afd7db709de7ef7a4294f0c44b0544027c0b8156e7f32a1f2125bada5978b3ee1181ab5941d5e16578845187d99ee69b02f316aa6be3ab6409bc6eafa29ca6389a8fce6d7c850b357681e80a54920c01d50a7709f0212c4f3a08be473449607213ea126e4578c20f89fb551b6f1b3bd2de10e13f0838cd49c6e7e52b42b630e2ce4239e0624c74602cb17a5aa04f7c4fc838813eec5abaa0639115a7f9f3589e7f9703c9d0f483c42170eac0c3c372fcc69913ac171b0679dacd27fdc6f9e24233e004321e66674f2f6e008c37f94559b79de215bff96142802c7f13b30dd54e208595018e110238544d84852e851309f11f94ecb5f4f5a342349ef2623c151d3f9ad5623135128031737cc03a92aa082291a88e545733ab63c9c506df9932e3c0c0a5a979efa9d655e128cebd10a13b32461ed11354da6b64652ac0c143c8bb03db12da979521f62a5ac94825a6fbc6b70bed73cee032075aff4faa7b4d84451c886d946ef9d350e1c28b22de5ce5a083c2fcfa2fbed47ad4a5a31b1c06007048f48b927a7adb5d30dbe6f9bbce55dde5793f143fb351f7571536b19074d61dfba26c6912c1e97c86cabbd4c7d018c9997e88794cbe69083b97a1c37cd454fc952044d6e0204c522251eff04cc50c9c5f501e0c5950ef45a5be5da4721c4e37e2a2dd03945249408de5f9edf699251d30850f1ccf47219ccc61556f034de01db0bcf0e6991115549c3f204d5d6778e2a27bae688e4e61c8887f81f88151e417f308f0eea449a1a5d56555e46ee73ee3131f46e53b2669b49181a84dd9426fa5019ed729c3cc6cba919ab6f74c14c350940a43ec445007cf45b6473aefc3df19649cb36835e3150289724cf7785a27e0a2c32118a55cf33f607d10d56196344a85f37ed4d4816daa4dd0e5c7f8f5094c19cb0737c496bb18af553532828252da06a0314fa2da9509a34995538cae00761b0d9b85dd03b270970e90f8e8068a1fd41faa4a807b8d0004ea78ea31f102fe97664d08680922e0d559a168456478f2c5aaa0c55375bb7a0e867dc8519a26f907c4622902b2c3b6597c527ac6952b17ae33c73fa586b8cae55b4f9b1a7fe197be9d8a1a8b160ff08210f2226e7719979a6bfd46e1996b3c3855624250e7492be9e71c1a263ad70a519812ac64f33c2f475ee4508fe81b036db15e1eec6248eb086010add1b3b0e6ee75db0b27f5ea109bbb2dc7ce345fc2a9fe0adf95cd9c1655b18828d56679f1d390702c21a7be2c1c875e435df5ec2c2e1b66d1fea1d8f387685650ea047e035502a3dfc5359701e2099123982615370200d34c76387d79cfa950f00770e2a64a18eac34c9061f72730211b4854b124b6ecf5475729735cfe067cfecf273cadc51a4b25dde35ef109052fd7fc7e1065afbda7ff33a4354876071ed187899e1ba2506809ba8443742ae15b074e32d8832e5b69afcc004b41a2245eaa2e27f2ddddc760665ffdc4603f1e1f1fc5127e7ce87c01ae5ad60e17e70126757f7c3723f27a62653451e6ef6eb446bc1ea551d6433328bd9a88281e36dd193f5bc42d648e938405496b530b03bf5af1e1315131c7469609fd02943cb18cf418db6d0a41d0b35f89cd82d449fc8d42cfa9e2776333e02e0ff58a185c8fbd53f18a0630d650a74e85e2a19103dd835cf19a59fdb2cadd49e8609ba23cc57f6cee6493a85afd9971af06c124881ee34e12182f22acaaecc7480c9fa6a8b1f0253a42b73959877d19b7d2541fe46a0269b7c1de06eb4267b2e19de85be44b33b31faec81b3f34f8c7a31bdb45baacd721c63f3051268e9d7ada7e0926760dd3ff369b78156d5081593f8f6e12c26f3c3eeac2f164477bfe768fb380a0b80149d526bfd33c29cc833c9b34da019b93b70a1cada8d79b41d6c572baf492d53e704b23c28c3cfdd5f4ec6ff8bb746c113093f8191f0b706bc580ed5fc422874e3524ffa59dd9d0bef85ea209f6f7a2ebb8b9113b13f03232e1fb042809719be51c7cfb3a192cd5bdd9da8e652b0cb5c04999fd6a47eca11b13b4c440e69d23700e1c2d4f673211c411bc8991d28109abafb60c029f18a65ca67602ede15e2e2fea15121b9373cf14894a41fcb85fbc98d609261a5ee0333a7556daae9e186af513e99674c60b0b9223e0088585cdb36f7af97569615907131d0bec5370eb29e47126c98ec04836fe123808fdcc87a5bd4b9783a2b661de2cf0b8e184b838caef03d77ae7ce0bfb5a549f6bf8d68e71d7584072708c23b129e38962aef7e4eea1c48a5b44cf09fe286c62932e21a3f3e42a6ddb597283bfe2e03ae9efeb08e87a3d5d260aa18b364490121abbdb2533c037b27d35bbd24b2a5741cc00e017cfcd69d264b5bb1fb85f34558ede8045f8790b88e3be633ab6f5c27792b905a191a07a6792cc92af13b771bef01e05fccb2da9ff80448361be85c20a8d7116f842da6b4e6215c768b64b443d8b00da09121edcd7f1602d107c0b77ef0bf0893bac567dbcf46489856d473fdb3efdabccde6b310891182f3156eee2d25926d4bf2981e83a4bbc86a45d459fed38fca8d0f6c57c457c31fd72d5c52e41e36dffbe4aa452bcb777ec926bb7dd3a88fbebf68d4dd9e569509ec114f7b0153017a1931f5946d1bd70ebdbcc6aac6f19835ac5894193092a3b1beb788691feee2f516224247d970fe6f399986b888417ac597f0df562f8e1cb3f1c1c9175810873a08015ab4d51c7385babcceb70385b5082077d11fb0f30801bc09f49f39147400b7a527232e6b1a56200c85a12eb6abea890114b1a471f4b5365dfff7b346f8910ce3164438174f0341571fcf0bed9fdf75bd41c97be43725adad504cd5b6f92f39892bf8290b454751b146605300effb54e72ba46c6efcaf9ed162817c60505edaaace7c1f56f3612cf6e92cce91bd45e84f51ab26c1708a47815a338e2697f631dfd3a6097a7d12b2f59dbbbec0e3b02aeb11b226e751919233409b8ae88a44097f66330275a31300491f3e09163374a5f3697df114fbf1068d1f177972dc2a9d17b5044b658ef6c71854bce3d445decf0175c94219eb9ea17d0b34080ab2c8e0c268337eaa83f037dd7dd57bd409b6a74d4cb5726f610ddf08d87e52cd353bd3478e852d2efb588f1b7aeb5b6e2be1f53d4385166e885c165f7dfbaafb6852e5044b82b9ba17a6d9616523f986bcbd8c0438561b0ae6e20446a8f29ff8b1eb05fc90f1e6fdceaadbbae7b6f18f0b9bf37b89b3c2f84fdf82fe09c267ee82200c1bd866e4edfec763540836ff60458d8e595232cb32cdd8b10291f637d9c60a6cd919e18b12218ef252cec626f923ac0a1a274dcb0179d66abfeba33238608f9ffc5904a23618ce173cf2e6091754041ea8dca5a2e1348cdb22abcca4e63d7d10f58a4fdb8fce01ee1b7816d18b8cfac743ba197f5ffb8b63e33d14a2807934d7b1881aaebb4dab307c5a582d6fb5a8b6ab16767a5672821e3ddfe2d34c31c3a7ae1c2e332d6d9499b92bb6c8f0d5d9dea6dbf233b77cc81416d5f12a2b6bb569a262ce6c0feec892703bfb950b03d501f27fc35042b1140878caba32aab42eb6f227b233c9583f8c9c692c610d82f24ba7f5b30b87b83f26f3f2098be528fc00f77ec74c73a76bc0c172927933116f70a04d41fcdad8e1d9e93f25c4b5224555d9a25effb4b96e98ffa43abd2cd6231b068fb06f79bad3a21d6bbc64bc09da44cf0aab268cb0291ee62ddeaa9fffd3fe20df15f770dee4b0098e81d0ed240eed6d6c2caa08fcb8cc5a0296fbf32af5be09d18d05d470e2f20bc302b6d644c710d600d07535b913b95f85d7d22a416f0842e7182407b8ab22c72898060711110d3e970fe600610f9ecdd32a73b075444c37017300af9e751d5df17ea621a551dba0d5f1b5565c581daebac7b4db61f5ecc36cde1651316a72685bb053e2173d9b65024adbc79a42416c1e691b9922442e590cc8263b54fc5fb5c086b3d03024c225b26d7d8dcd25d7af3d57a76f21f150e09189f58b89cfb1f089a9d8e23cc875496a5dbdbdb4e0c0a6c5e61949dc6023c7dcc134378f8cd3589a433fbe218ebd264dfc65b49278e91efbe0fd827c4ec9b1b21d87e4bdba383eb59e0d8072aea9db17b19e0266bf64f398979ccafc54dc8df81e096435327054590c533b1a8d05563e288839a90d5205bfd6c13adacac61ad04458427e741bfed549044cecd4820b6fd310e2136a1d1bf2b767217e4189a3e9b722997c63a760b44b8ab58616404a55c9149b50ffb6b5f7a9e971f0d385186fe287bbc47273fc59bae9c665127eb8d09e1aeb32d4b84682c224a80252143968b6fda723f635f3d0afac9e563d34008371fba8e3600259b803bd4e64323011626f8e3d8fb56401eac6c710d748ec1f0455e699b70b00a4a3ea92032ffd4d000fc88e669f2184e05c6c3ee6fbc19f1a7fb0e315f05527476cd454c6b4379646503597a550270320d646854190b19585eb7dc54d816935be0187e2f8122413006b5eec57a3e675764e5b7b019d76f37340a6ab9156ae2f7ecd7593a2903b104ac056d75ff2eb985de376257a1a94da50e3404d4dc634118f9b59991f848901f9048a65ae9ded637347017b04eb441bb79e13f7c25dada0c9e9209a543f0113966096dcf67c1bf8ad084163518c36eab2e08d3548970cd4a0db4eda15bda5d95b9f7088e76d26cd387d9d5ef6a2d51a948905102820e168078e3d9c701692137eeba057b08dc6dc96c21209165aa6328a641b3c483676101b93dde974e028c64f618a9d4615382ed4d93b7baba296339af3a9ea7e9d4abd78ec692d7b038204a443f4612a5542c96a4bed87cb281d1a633751b6168c09c5d6568150a8b2e2e372ffd37b637687c88dd452cf992f92a08a6a165c6f0e1f6107aa3390696dcf55d3a447bcfe7efa2957eda19dc1e97ed026a279331f1b34ca45e1c648a1ef06d011ea627ceb4a56fad956efc8e2d3c890679e3e800697cac86801724ed85703e62025257f27120d726d1f11dfedb2ab8e168b62c3b75dfe6ed8f51adac488db2858730d8a9ce32572c74422942aa7dc977b8f777fad5ea97a56eaff65fac73a9c128564aa0acb8359c6fe2e5a40525a370b804e8396c9b2b42e29246475923501707211d424884c7245f38fb6d7047e59101b830dd2980e7b475dda9c1cab781a3a9995b4d8f95c4a42185bc8eb505f3d359938f5fd3a57944d305ad56b95a62d15b600bf5109a04359d475d22d1d38ad1110b6f5b908f9711a38e42a41e5132746ad93528360f851a931038869de6d962c32d9052bdb217d2e406cab5883df7480c7fc712add142705746bb93a5c1e7236154d89b6289395c9c4098941b2a9601f714e530ceb9199455b6e231a0f682302f771fe11e8700d407c1df420d292c2d443cc178901618ad2cebb9aed7e44faa67101cf2a1205abc43f767bc5e17914215187712802a15657077546c7155404a4b49232936aa8f5b5b88fea09282ab11a46602dbc6eb6b9cc9acd507af9dbc8b9efcfb18f370a4bd117f07ced7707d21fbeea1b2302de16ff8532234135f47af9ae44a2b40c5fc6b7cc3c0709854be7ecd7a5acb0822ad650add102144ddc836afaf9a4dd84bc7ed1d7159526739d70ce24612bad21d4d2865fa49d26552010190063c84303a86828206b2c23bd1c9d1750babdfd42fb67831592ef6cd56a3a826e24e0cc31da304aca5ce702f378cefdd349be597161145aac32a6034920bc3c4420137c2a4e30338745969d2a7570788e4ff5867213aa6592a4c1f3b8489a336f58f3d80bb3001cf0dec71efdaa91e642e622d4bdacaa8364d5a4970cf5df29c4b6465702dc5d45b00a1a11c44138ec104146488fd9a179a4106aab1d07bf7120e0f1a14d987d5e4b59e0d417d9c63035cf09bc90c87941a6c466573c1fc7d5d5777c1234bd94ece96daa4fabac67290902d1c2e801318125fa57a299f7c7b0b31c5e2a41f33768782cc9ac84f354957202d50b00f9ef0de636508c4feccad1f3bb8cee3bdd6d7dc37655246d360ffdba842f1f6cacad6ccc5eea7aa0554338ec94f400636bd9c872b9a6ef145f8c1b9c168f4c6c5ab7b58cbf92bb73f07a62226bcd7d675d477ea3bfd3d290f538b9c813cbe1489c3866866dfa534a80c675ada95b802bfe2feb735043b6f8f6e168ee0dce1a8e65b3b2381fc544b3a2dd92c1b41bcb43433cd5f701f2a02bfdc353a43754c8da886ac14805b0d886254c2c10b96ad270ec12b789f339d1df4e1344bb853ab781c81ce3d9fc6a61796278603b6e78f49d3d15062742f549de960d8e06dd1132560b5beff221aa82bf62989aabb74104330c2cf95bf7241e243871e5c7e3a35ff722d149a361bd45a0d507ae5f0a2bb2132b9a859cf2f6135cfa2651499f365d8ef1d3b54f3299652b8569e1fbc724fe3ea8323d4b0a30ee3b00e5c7e7af739c93d88d4c24dbe8fc39ce2e0554d9cdb821d517b872ffc5da438c03f307fae71821a3ea303844a4839389070115d04a43c2ce07b639ca3f1d2de35779f90eedfdd1175a8efd92069a68333068e5da13e82ae02442390b3eb72e2082986bf7096af7aa6c645219bf4fc9769b8a6f9b38b0eb7f52c54f764a440d20a4f2789a1d88ad7d6bc90210e2fb904a4099795ea20f3478ffc22947b1ee2cb3f8aa64067e05696e8b39f57d265c1867fa4d79f4f7475b496c3270fae6f7ce4b146205d027e7b11e80106396f9e66d1621a9012a86b0fd043a10e6038f2d11aa0e249d4e25340ab2181a2a4ce4d6a02219d43c05fec6be600db02bc5e5f929533e2b186bf63991230815f670dd14dcc7e12d954bb17ea8dec7616f2ac8490c9f982c77c7c86d60d28af5c608751a0b00d6c5df752908a4e16919cec225fb61b3086ada35606e259faeb9f3e9817960872eb87515afceefb07603b7cb8acd56e62427e6f4f8844bc199f69d4f6e7f4d111ad5063657a0ccb25100d7f73536d5fb871702cdbf583a6b06a4bec09750aa12999a8189b8a095fbdae22bfa0e0127f6d72d0908ede1be447ef4ce0d136fd082d2898da415dae54c4cfba5558395f0509603828f9b762957033eedfd01c8b5e1fe098d4c9b6ff60405583213d8f2dbcb13f2294534cd213a1c645bb286eadb737fd3021412ed0a8cfd8f4069e9ef98e5b28364cd12dad9fc95417e0d2f6e8222f5c30f070b00af40dc7ab1926f2170bc6f2014ea8ac7ebf3285e824a654bdc9b54db7ecdf0e61f30f1cdfb162ddf1743d9eb8428cfea67a2ded9e68daabc92f64dc466b4389ed7adcd56ede143b4b5039520a3ab1c0e8c64c1cffc88c3809195d93645ece2fb72ac074695ba962a9458cab0ba8c623388e0e124fb92d2af217ed11bcaf1327c4933fea7e5c363692e79c01022394585e295fe33994d3fe8beb0c071a8d5432aae5b87b144d7e798bae3d2c5e91ce5b43f5a0758b65bc7b2a2ca70a39f1512a66583278c565097999f77de3e2efe5316e02d5d91c0230304bf672499351665b965f9c92587bc51921ffdd10791e0a3a6d11fc6f9c9df92b99ca8c1a0b21f32d32da59d0f51664835a3a152fe5584575a8a4f7521600d625c7be3a77e56d6a6eaa7179d56363c2e452453bcf826657091c76af32f3b5553bbcc846c6dd968ed3614ec61bf130e29e7e0524736086f85dee36cbb2b524e9d4d534b79305649ce17640699bc47b9e594f15724c15ea366d33c5c980256a9999203cec725fe02c31d73ca5e7ac62669016b76be96f9baf09b3511bac1f80378b988c332188c1a05a231aff50ee5b0199eb1c681a9235a07ab398d77cd202db37a5b8e8a3542cdcd7e7c9ff9a99c8918c88b9ae2b086971ca665c4ccd3ec3de4c1c5201ad627bf0f962819114c2809e6319fe5e1e13d3c9a956d832e9642dd2723d940dd064f4e9025317376937a0bdfb29633520513db8be5a0b2a54926849802f80f7a090cfea20cfb1af522781d401a2fec0d216e7a34975fba0c52843ca62dd27ee78b60b548f2f4684009a66488d03098540bdf419eac576a9ca8335156bc86e5afd93726dcf52879a660f4e332ba4a2ecbd56463ce347b81ec8af768b1eaa4a82748cd44e67c3e0be69dc65f85fa44c08155ebcd24790df09dc5960f0f8aaa4f190b51746128fb7f3f4667c12e202c277a2bca531e59f143f74d44067b6ed2cb26eb04ec539e71278b02b30b6cc9de4a39fb079118c18e93815723838cd53d9cd9f9cd3d401124479af0319d3f5967142859fb45cc6861db0d1b5ea20003982dce4b645933082c6a3d0ac22135d16e11ccfc69a162d5aa02abf580b9fab84d44f68afab0bb2ef854746448efe40c1ed8e432e971f50e9015a1810f79a94000ab6b1d48780514ad29f5fd6dd8cc66a48328d5fe61a699f873ee7df0447b754b1318501f88e6eb5e3330ea797d55f6416d4ba2029f924a7f3ec113a97bb24722e3ab6279cc4d2b640858661df830b6a0c9826231312dc5c7c91bcb28add179953d2cb396979e5d6b6c3d60c02c820439dc49d02ea3da8b83838a1fa576670d61678928fd9772ca8296aa06267ad637dd7611360d13c977ee8b7405d5a0bb8d8598715aa1e352eb6bb4c0fe47b353da2b0e21ceea6350d0b8c73fc2899464e3adf54230f7246a9d45ef8056a7fe777cd4c034e29e7ac6519668036b5880c61944a8fb2a7a017bbfebb39e039e0b9de67046c49d872180404e8b2367627ba124d64cbbebd57078a61abbb4f86aba1d1af885603c44363719525d76a5ef2e34383ce2cb7def69a2bb56373699b47740dc5760a8bf6bf2f34cd827cd37417740018a9233ed463a4e55a921242a022ee6e0d59bcbbb970b363d9c3ff84367f1890877e7c76c4e4c43ba7b568c9ae7c80e7ac55a107a72846b24ddb531a0b42f1ba1721ad80cad0e0c9464a369016b62a7a96b6a202bd5dc0952b7d9ab1de8e4b2260ee48397c361ab8c916d6b2991c02fb3fa8fa3d5491b9058c1a31687f3c1f16271910c1d3b80f14c25f56293065ad055954360b2cd629ce578f44b9b27d8f87173040f1b64bec47b876bc34884d484c9625ddcb9ddf2218928d4804b3ccb06735a71f63484065b569dd00d9bf3640709a3347a40525c544d769563c99714b4f8855eb2ed94364aae6c1b06590373821a089efe42618282b2b74c353501d4ebccbc22bab809c06344bbc7208fc8f96848c0a6e10558818356ce986bc4141165b4d3c615aff38ff01d6920d205ef45d20aabc9d596d4951c31391143ebea3ed709c529a9e1a20ce12d76e49a0b933e2d7707699257beaf5b00bc2d01c6840e56ae91c0ffd43b710aabd2154100399d1d98496190fb8b99fdee113a9f7535ef1e0974ab955bb5940941f827e6fa639724f25c542d735a0fc3212b8edc0b3fd340e4586bf837b33bafd68a3a287c1d8a27c260275cb5ee47aee2abe37537798230320b87bc11871ee75d633cac7cb46943695f16a2775dbccb80dc74ff7dc84e62bbc4d91e1657b451345916c7982f11ed43fc46edc4cd9da2fa3da4967e986f3f3c8055b1f7d46c79718350184606d9846d067843089b271440d5e048f8ef74904f14fa4a0c06f898a948dd31f178a494832be265ad1eaf1f173f8e7bbccd37ea215141b3aebd0aad88ea313353ec9e313342c30ad1caf985e4466f5cc5d9fb7d08aef35ed449a348bcd817f4fd1883e8716fe0ea504cbce8d8d5356f084fb8b5616192de7d020a7b46a61b47db9bda07d91db3737a4d5d55592da7c3e7096e94323ad427ffa98f95c3fb616698505e66767c2706997b44709845e22f8405a8d2e459b38a4d8e22a71ea5e918c523d9b3523ad2e1f805c00a284198b68bfb7a8f80ecf4a445a01cc8ce9c38531b7a13080b1fe7ee59d5a6ba41520e3deeaec6d141ebce22f23040f19e4f1f6ac505d25018761c8999f58c1fac1500182d4f330d2b519c61bfcd84617cb2d7dcd79713bed4aeac254b4b83d1fd17a985d81f1c972a4a6869b5df11a809f590460d136bb826b0588edd65051a5506cacef7c21bf0c587bb3e31991496f1a4419aceef60d41428f6671e9ecaa8f55b08ff1bf7f14cb405ac8d662a0d0f9d28908c6f9246e44faf79afafecdae78780a1277431059ce1e18441ee56a04c7d7d915103e62c09efc61a28b1da56c47045df5da6ab7cb12c9c1423d036757888349840b0fcd4a0b2efe7028659e6aba1ae3238a1d1831a61454e5d9d5dd6ec38d403596db6deec1eae6366b726513548f076ac7c47bfda98612a5a6c8b78376665706abf76e2e967243cfaec05b53e61158566657a87bf17e8a987d3a3b292c767675d7f2823f8b05d344e0b29fbc37c12188edff0e1f82bba40f0ac2b501a09db1cdae321c29f26003582571c262bda07f7605309874c7ba9aaaf6b19c5d85aa564aff1cda2b4c0857cbc7fed64bde5771d57725efb51aef56956d5d615b09bc6f37f7ad7a9a02f0de7629a77243132c60df60592a5803350feb0b9631392a813d584ed98d96099d61b38b7d2685b5d89e7cc2d29ff3a1f124cd15a5d18640b270d18ebf3eb063a2543da568e14bc2851cb2cc80909b5dc9fe5a397c50318d90d66f6d8893835bc466d23635f8b96922af460d3aae720c1a74fb737f66a6e1463e05d79cdeb10ab4c83006a34d1c448cfd151e5a9650ba3c96e530f0d7fc55ecfc91903d8061828bb58ee2b0c96c8c023cb39a4683b4d6860bd9c74094e75ccb92bdc96de070f3d961e9e9e35f90fe19c8f871b096799133359e3611d3226407fccc3a24fe11ffb5d8723b1078756b06ae4209fd4ea5677c9cc92eb8a1ad1d762d66d9d867f450b216d40ddd0f30bc3960bdb4b61eb8bd874b3570ac6cacd8bd1dc1b393ac3c4ed3dde9a38887befe0403d98149ecd2af79b1bdfc473894dc837b9168245feb27e140eabbb8407c5a82a0b3d1bf919c3008ee50f589b93521acb10267f65da09ef093d8e06569d56ed1fab591a7283b650dd8f1aebf4842df16f18c2620918e7742a3c88ed79f692c8986d777acf83521b915841a38417b3d3425712432fbd4493beb032ed56328783b3d5bd07e6c21325de81043b2d0a667fd2644c543f160b095ff9d866f26140a7ecc44b60c885d587f82dca16d06b9c20f7ed0dff567a8fa46d53333fccd637e87439e1e29e3a7aabdad5fc2d5716278b6cafe377ddbcce2f487d8ad60a5b596b5aba47c9ce90071bd86451273df66d0b7115853fae563e7c6519b1932967778b715b8ce40bc65521e3c40e113159876e60ad9b778c6f33a6029d5e1434892cc07d5e1f0e132ddfce35946f7573fe2081d9d4ad45ed2abead9da1ae6c53139614d7309a6ea27d657b82e1654661f8b19f887fd01b339df6894ce1d93f854d5c39110d38a18ac8e9c6b0d2e911b4a4e483d48bed59a481500bf76ffa3254e3838150f88804feb6301d8a5f11603d841e3402f3a04301e50ca3e85a07302281b6330530fec2f7353352cf4d46c50a9008ac6f886213efb48df0508608ae1466e80272da173136c142879df011811b60cb98d41581c397deb44ab0c73eaf801f8178c6b439c7fd560ed65e6f301da45b05d6f67b9c1ad33800a13f115def7491bf18595f9c7fd99026e1b61b2134d8670cbe7cb09a77e2a3c832fc4409d42855fc6eaea2e049e50ba69d1c277208798e69dab0616ff0c32fd8f64e776604c8b60c002ec37805bcc48bd4edfca12881c589cfd782913cbe418e9354edc386aecac3248e5ccbb6f02d3e74ae4a0d8dfb3e30bbce178add24cc84a979a90562b0c946e691e43d8d3ca2ceedf1a74b429bb0516cc312bfd5bf3370fdb48eec9080e29d26b14e962e5e61d0be879ba52555a2c11676c2333debaa3f681ddd7a70efb6f2c9609036d7236336858738c127d74970880c9049d2cc80c2a615f3ee8980d0ee6cd018fa9afbc9d0e7431989d2cb9172db0041d37d5e41a56df8086aa1cc9202f73f15f268d5e70824ad0d7183f0d1d41d9b6362cc60bd569d6172c7149121c4e3091650689f244d0ebe0c7ae9690c3f8a5885d1f14e1f3c71557cef7d5605186713a344b5830ce4ef2431344723bf9cc18203c8be0297ff199e99e4e12386fa60294d48c6a851d8111824f157e6628f3e524c489c73a26e4e4957bd393636e45c274ffcfe5d38ab64f0cfaa587eeae968995449c90ba19127fd0a9564c9e25aa451abd23d08af444988465a007610ffb6fcbcc56a41d87a3d384654ed86a05131c987cc04d7387175833588aae61633feb391d04a8da71ec03e33f3013b3153c9c975ee731fb716eb76ebd19e4dd8201d43fb76c18eb646ab543d035dec92dc005d00400ef073cd9fb42bf465225da852b691f75a92dac00c638913e90ab371d439eff768d2280353fcf3b8d2f106ee36b506bb232d9430b2ef5ce9b2529cd8f8220b8460c030cdd681eb7398f2544bc63a039cd63d9a852b956983a2048f66f21b95b2d4bfbe8135c51a8da5fd77365880820bd0a1ccb531d221539e5dd4f417db3a1417e082e6263a29f30f98553166ee23e35ce30421d1575881307ef4abe612670b4ec16869e7195058634ac3256480084897234918e39e4e754df4b9214f28e846774568da26518ceae0f3009b7bbd1380c5e363a6b31a02d2b1a0d3654640612600d766b0463046d774899cbda44e14b9df02a4654c08434d3d052826194ca8c258e55f3d127aa1945463e2ecd6e0260ab60c2511b72e8ce236519b4f4e766aaa38e377e5f0bfd01392174d83dcddf723ed2c369869bd505094c6a0c9b7ba50ff8b37b43f352bae694f53e094801cbbb302c0e3e5f3175a9638a474dec192e6c5751c92c26963d33cf004234dc46e490cce790312798c9d3ecd7708d8fd9773fe2945ff92694369ae8aa047aa3c06f15ff07d4a385e1c7cdc36c4209875d249ed54b8c0d13461a177f8cf326c4c6111c311d67adaff6a51cb57381976fcdba9fec91cb9139062e5bd57ccb0afd124c55c85be53869e064e5facc6e0c15ed84ef3acfbee03d0337d31c979a0a9ed44095e1e23b28824e0c7db4201c38628902442c0e5e7c3f6267b9c0acb294c492c261d662c40d0bb03027a7eb8616cdefe85791efa10776205ce79bea7a25c4c26aa6e368ee2050289fbd5b7390aa50f62dc60f83d080b8418e5d45f0cfb7f3b619a0c0092fbe30b72fdea5a379594918af2d5032857e4138847c1775e435b1f37e3309a58b8d95ac93c95b5ab601c03a25cb1b2efa070feab3f3dc490c41d8e979df35fa55c7e165d98540eec945904fad2aeaff06b4026fb258741b9655676c4837228cdebcea26b0f3709b3f4c0696a0a6bf4ca4ae9633606da196d053625e2d1222943d6f9503865e54ea10ad7666234c19c9fd45ebe35aab53c8f938c4dc040a8c4e8ade147d4e977f8fb959ea0ab90185840608591d57311d612675944c86db5acd09da6eb4350e1441481adcdfcebefd253f96457a8b5a6c662655f5a92c82bc1b41f5b12cb6e00b847223dfb58f681558c4b909bcab29916a58ed1e6d79fe6cbd3bc58d8f658d7c5973b86d270e2ebd229c51f384f2bcf216a9c5719c981798bfb7bce305ca809047bf1802379fc63394e072c262fe2a8242a23c38d54dd25abf784aa39d590558de9db7b037b481bc6a7cc05fd4417963a67e2141321e15bdc18424caf2c5dab2e75552100db44c44f6d26e76ccd31498383960bcce557f2bdf6f7157fa445767a6cef7d495ebdd6e2fd2b27feb6694d96958e6df1197202629dbeec8735e9402b591bd440703ca2aee6958405e15a503b9414b80c2f1ac0bea71e42f71edcd403d38e3ea4634da699a27714b61fc4ce331ad3355193f870eee19571fd45243effb96c56e96602a34b57de954af1eadc9c57414811cec3722c9de52ee2db79432259902c1064b064e0636fc310bdb52c92f6de295e76332b5a0de70ff4aad39eb3beae570da4bad3dbf49622654324449e85d36db6aab2d9784f5fe5556fd6ff0fd9da5c2777f36d5454476e19f6e106d7f4b44a0eb94f3e8bddb67c331decde9f1307991dd44cee299fc0afb4acf06a28161fa1f68874f9baaabaebaeafe645be2c2eb1eba769b0eb7da24dc35b17925d69794fc56f2de5392f911ff9212eb477c36ef793cec584995794fd3f023afb2ded3da3be23e5aa821f769ed7de867b4cb42d68f5021d5117143c48d45f9a77a0f895e7954487d16a5426a5ff7ef275baeb10dc78550b4786ff12eab8cd4c7b0afb2ad62d6775a7b7267480b9e9cd9a61c3d32f94b0b6b6a539b6ef4cf10813dba51b991e726cf02c360557611e1deddbbbbf76f07d9213d721605429e1eddb80bb87a1d5ed4c226e1fcc6fe2bd2a3cd89dcf7defb8b0df53d5f2a84baf9e95a433d32ba7c725459b1cbc6ca4de23922ada92069ed3d1e8ef16ef87bf0dd87d78061acc71eb39bb3fcd4da7b24fe93e4bd7fef2713b7d6487af4d3a3ebbb05bcf2fe097983ba83fb8070bba75fb8dbb4f98efb3a49239920fa4a4fe7b9af2e19f72e731e363d2a3921ad0569ad86633c13f0ca7b1d5a8842d5d5503a5e4f8efb5ec7fb9fcc77b4f678eedba86018ebdff7b4b2b69470b067e9be9a1d3d9296a5bd1f85446bd2c5dd6a75f0d91d4277906645f73004248af1c4b9cb037a54bd943470dc1869c487557c2e006603546aa85fbdac36f815843e5ce883b7a398aaac6c8d520392bb69bfc9ed84c5c5a5dc5c4e4455e57229f97d5596abac249b98a0dc3f9784c78f32946d142afa37e5efc6fca9db7b90612aea376a7d655976b72f22a88f54a49470ee9f139950fee659fcf688d2fddaadde51fa5fcc6076837b4a972fecc9b97cf9ce6eedbd4c3fb428cff97ab63d0ee9fa0aee9cdd66a8e62b1275a516473bd70309210ef851bd833888762e67b2ca464d51371cd7693846bc7c1501e6f9630e1977f0b8f023134c8237b103177ea4816b60d8860b1f26816860a8860bab6078860b1f2281636058860b1f9e2018188ae1c28747a017187ee1c2873e700b0cbb70e1c31e9805860f4dd00a0cb170e14323700a0c1f1681506028850b1f128154307cc80397c0a448845b206cc2850f874024302916e116f85009700a264523dc021f1ee1c2873a90084c8a266e810f8b70a1f6f0611098147bb805c2215cf85008c3f0f0f0a10f98147db8053e04c2850f8330cc0e0f1ff28049f108b7c0873db8f021108681f1f0610e98144fdc021feee0c287390ca3f2f061144c8a4818e2e092e20fb7fc6098948737b8f0e10c981493700bb40fa1b8f0e1133edcc230fdf0a54ba975b4a05ab80be4a0ec6b5675f8900ea11c1e871c70407912ca6f7d49cffce2635efcd637e6990f7080674600029e39010978e619339ef9de67fee1876756800216f0cc0b90796619209e198867a641a3860d060421c433d778661bcfcc80670ee29985f869809719c5b2f82519f62bb2923f39d132d1f39069bf43c6c3c3c87678950cc6a7642a6fb394efccfe67fd42649bfb24f941723ae2d36332528408cf901d9d92902040727ef8883d6e9cbb9c92df5c58fd486b2bf7f2a9eefa6f1027be926f5007fa5c088f549f58591f1c6772a6577aa557b2b1b1b1f1f171f94ae0eec32bf0d9bfc02fefa4a1e0c22702d1eb403d9501e27089e2a054b284035f4acbe2b8333d652f9eba411c980a21182e7c58ea27b87063005d3cf47953fbf008a94024fcf14efea87f22d13bbd9394b596da6e9e23441644c680cc465623a39101916db1e7c297c916906dd1c885af80ec876c8b44666409c810906d51678b2552b6c5205b041273b6f823fad8628f0ddec8dbe26de6395c07c780af92f98ecc77c878c8dc8663c0d732bfc992703d649b3771e10320db1c04173e4bb6f9083637c1851f806cf3145cf82dd9e62cd8dc0517be00b2cd6370e10f20db7c06173e01b2cd6bb07914177e01b2cd7370e18fb2cd79b0b90f2e0cc2e644d87c8acd91b0f91236a7627328f8142eb4c2e643f6ef66fd704438d5713e93d77b1ce9955c0b7cb70293628f1e5830c23026536052f4e1a30a17be176118160fe38f1f7052c1a49893f3041e86a996c0a40804481386308c850426c5204194b0c3306f0a264521428ea0c3300620029362a9548412c3d0203029eae80c4108c3481f3029eeec00e1c2f720ce0326c521ae05fe901e5cf80e24f2f0c09228981489d48049b1c80c98148dc48049d1e45a20c3acf0c130273d701846f4447060040af8ee0226c51e163029fab816980226c523aec5044c8a27d7026f1806e5450eaf430f0c8eace08402ef007c52fc712db00926c524ae05324cf6f09d0926b90f84493e70e1cf1c321c5e872c8737c95c3c0b16ff015b7b77ffd6fd7c0d81d9278545c1debd5544152908ea7ec7d5726f62c28e871c2c0ed6f4c2a2587f6b43b1a127aad55657cb0dea7f525816921016c2b1017f86408f4afecc7337eb675eb7fb5772a47ef7762cae7d83f516dbede95c4bcb5a84d8c531cbabfc961478d6b053858cfb1ebba8c533671dc22cfb4a2eb2926f71f237642c4019cc6a4c20c02ef7f170379792677f29a2b21b0fffa290dd44d56eb539c421e7982d0aa8081efe45a2caa6c78fb15cf7db112cd639f6251975d1707f2364ddf720cbb19b09f676bb008ecb5f723d04e0257355d0a6815ba5702416233aec8dfaa0f767d507cd787de7ec5d50a5617e1078523892a39100478061a8771dfe76df0c048eccd9f6cab98aeb0c86ebbc85eb6c85eb763b82e5d6c730cc39e75cbf73a1877d05613fc3b16cfe9551fb5a93167777df6dd2701b25c74c05be70296c985455559e6df2665b062e67337ea37d52b8169f397964e404477a32abb813d7ec012c04180830136024c04a809500230136026e1dac0633015663c274603a301a23603a8c80e930426986923434343314e601cc0358135813580e2c47472addbcaeea6b6c372f6951496b95989452caebabdfae5a7ffebb6c5cd55a4fa1f74563bb794929a59492565f795f34beeb8e5dbd5b94a9b72a35792c6895c18fd97b47dd594929a5a48e446545a994524ea794bec4beeb4b57555f2395b2aaa4dde8cbcaa39b177659164629c564fd79c57961b69dacd83563adb5d65a6badb5d65a6bbda4bc2896c177d9c31e342f29ad97d27a392d394198947f49ea48f40894528c524a2946e9152a29095532a3ae9b57472ae5064b15adaaaaaaaa4aca23482aa594544a4a29959256efc7c56949392dcbb268dd62bb79498c0989552f31ebb22ccba2d5b2aabfa494524a29a594524a2965a52fabeaaf786926d3b1f2af7d046b567ffd9c5736e32e7d57a447d5a2c8a7a192a71e849584e85b52fe55492a29e42b8968d20616300ebca0ae63be18d04dd077f41d7d37c550fb395e143e87a16e7f238a7bd72f9dfbbfec2665ad33d358be1657eec36b08f7f4fbf9557ae43ebec6307c23b5d34d5765af2f3054f84f254661728f50faddb3bcf7efbdf7de73777ffedebff7fcbdf7de7bef3d154cd77409b57b06ed9337d06cfa98fb67b443790f6fd8e0b74a5880bafdae0d978d30a7abcc0fe7dd24f9294204488ed7f88e233e3b3a3d1aa769921829120488e3e16a4e470ca9a1c231f8e9900784c92a1b4673fb6f6e0fbc3790c7dd2445737bee3343dd280f23ae5dfc857fe87726dfa4f678509b761eb7ff3ab9d3be4e749d7beceeec987aefc5f538fbb01f3349fd1e5219ba8888641d494fde8efb2023da683e20ce6d6823e9dbd9b1d9b1793b3b3b3f3fb4ff95ee262592fa92bc9d1c7007e471f9df917e793bf7fdf80fb4798f75c6e0036d28680373a00f22456445a408883ed30ebc68fc75458cc6e8fc2f34d44dde394ba8ab25978d95ebd25aff739121a38ae8c5db5102c768fa90c02dedd74fddea35a134fabaa7eacbf8be8b46e9d1cd49d0886bf1dfdefd488754ecd9f80b0c62c4912011d7d297b5ac4d658ddc7e908823c1222217df0ec7e87f3fb0887ccb6e2277dbb2c8bd7e6aec19fe32be7287a5013336429c29878f217de211c48dd0bc1e73058dacf9bf1d7f79bce2df2f9a5f91dbf4baad2e1a0f6d585cf1061a5f56728841130ef274fb19dadced5d35f05c96e2b28e1a76dc799da13aeb44cc5037d7e3e4462f0d789d955ef295a627fd5e7297d48b3891dbfd4e9eda0c9355ae2aea466ff7b34a6b73f603b9f1638fcb97794c776855ef7a7a513ff3ee73b71ebe8cfe8b4958c09dae12ef3d5bee59251cca56c1af647ce8a443f7ac5b16ea201526d351ec1b2065adbe699779c58b8b3f9367e6150f9969f053fcd453f0297e964f321406fd7c6de2e2253664b75aadc31cc5be2f19eaa9cc2f191f5aa338db28e476e8607695a1f23bf68e603fdf738ffb2d71a9d65a6b961e31f514f5eed453568359f5fcc8501d85357eeb2b7eed52ecfe335a094959168ab21ae6d78c868f427d44a1ac055c1b92e8cb364ba2af0596a0b9949f6649b819b69bca65cac687b2def8f546af2270a98de5f2e672d9bd76fc9ea33171d30547b802911719b97cf90a3d97ff0d31696ebbd26dbfff6ebdd250ef63ce646beed94a863a70771f7ab3ba3aa94e6bd731bc92504b5256d677c837f5b80ed19fdabed2d6ede3853b843f666aa7aed55bfd2890b28f6796805001a3c1b7dbdf0c27e3d8f966ce3de05c92eb3ef028e7d3ef5512c2528ebfb8230e733a07fab88eeff40bc491ae0373208ebb6c4139ff7721ccf195fe23fd02815416e6f890d63ac7775aeb9ae3ae035d27486fd007f7e5f408080751fde3d6686bce66af660a3eb9ed5ea894be63277e478fd0995ffc857aa7301cd4ed5fa55f446eb9badcf717e6674fba4b30e74b0662c65de7d5b726df7a8a9fbeb3801b425a25bead12ce2d4af5f2a9b732944a5236624fe1a373ada7ef29cf66e4f5970d42a31a102817bd320bb821dc7bca6d10f119453ef5558622a9c812ed0d485d1339c22a93a7a353f2fc233260835f44be327f3eb3880a6d0a777e16ee7c96f3374672671257061d978f5cd621c38d5f32f27d70d790a1fc77e5fcf94c854e74c8a0e36e313b313ddaea9da3f90be851fffc1a2e723fa93c992fae9b4ba8d4cbefb7d2faea6bcc17624eaa9eb0ca8c47e24f8784bfdce02f2c7ede90395ef16791adc8e0bfc93fcae4a9aceff54e614f65eeb18c06f58e7af7ce6e0e52af99887f12db0437360b6e64175f89d15da89f4ec576f24f74bca85181b2357f2799e59ed47722ae13bb517f837a8a7a475ccd94b2754e4c25264d03b29bac2776abf6ca286bee3a341a5a55ee08954b5522ae77560977a9c7dcd57c7c23ec57551475d3e2bbf88b2bf54afc7741a20bd25a7ccc065583fff13717e465c5c76f1d3b9a478f6ea80a453a35dadcf89b0f36be12a38f1b7f45d6005f898f658f92c19a3f911c1b1d9c214c243acb5726c387d6dcc27ed4ed75153fa20e92d37d377ed3c41dd4a918dffd5d5a731b0176f079f3b6c46d9aa6e91e3d72d03b97d69c8d406b51d2d0b34e196ceed6342e8811213d8a312251f2f14b4ea058f1a0a69971f7b214682dbeab41c25fa46f357e11feb2c2c68f4003a2e4e101750e3a9377a8d5143fa8b9d53f4ee55c8f5cfe1672321ae175baab9cab5c7c23186687b3a900bfc8f015f9727335576e8ec77537a5315cf91ba3e14af99b63222ba235f92ea3406b52860c29453268fcada8ea277388b28f110ce357fe11f2290a0afa27fdf25f7391cf3d922a57b25cf90e470acedda3469473b235c7d43d469951ee23b44f05ae45c6650099df7b197dd781fa7b7d9b3e17f137eae9f309dcf712c22dbbcf573027a5ce5d64f40b123427a217ee1d66d4a173563d5f54f73b66e798257c0799b6f6dc7940b9c46650b7775d52f87cc864951e3907847a225fbc8ac63265baa918e35fddce753bd7525296d67e173f3297a478a2fa8b2a8f0aec89baa95ce8fcfd8330fa7335badb57a378349ef32c542fbfb2663416832a2d6b553f5d70f595a43a421e1a7cf925bbf3da5b94f129ead95112f68b61f20645ed07670d77e9cc73ff86d45f4af9d7c7c771a167db0c5bcf977b7604bd96ed1fb81607e44278c95096b64603d17b2267c7954fbdac15f682ba3d49a385ef42c651f63926f0b3c99cdc1afc9ea0986d7f6311f1ddeb87f03e1cd13920ac78fa436e7fcccd4599f14f7eb629c6a68476b7dd1c8df4636c9c88b969ec9271d4ac3e94953cd50f3251b70464a2402607325d48ada46f51ee2dfad64c4b9a31156363b9351ccbc4de90efd4cfe818271cc97ab785ec66636eae7b4aad7b8b3a4a29b52ca5d4dd53f9cea2b8e80261f49ddd6cd077ffae292be626e6e6b6bb56340bcb5351bfc2869ea8db0ca47f839a945ae1e244d1fe4759092f6b0d912e9d7b489d738e7e9b626cdc53f46738cdb6181f77ab3ebb61fd12d7d17f72eb8fb17124fa1d8373b78ada62aaaf28ca6e3137b77a964fd1a72acabdf5d4539594d6bbcab977abb2f467748c4d282b7993cce4dbb4c2c65f5cf0f80a7cb9c2e642f82e78fcc585a856f82727dd73f21fc4fc3e39b128d89b3c250a72e1bb38f94ba5f115f822918b938bd3851fe3c4bb083dd1261d2f1afd374016ba0f551af8314e3852571be3847bea4d305e2cc6094772ced9ed0878036f2e683b02deccef7754e517e92b7054fd48fe88be9b81f35dac7beb9e3be3cff6e98971a24df39f9c1f73e3442f5a732f5a833004352b931965adce1b3add536e06decac638e15aa89fe132a2d4643d40c2cf8fc4bdce95725edddd25cf7a37f65ece69bd8bace4b1cc722f6af12e504276936c37d175bbf170dfcf19aafdb5fe2bf5e3096537b05fe236b3e0fed0877642ef9585bd117a4c0a47aaef8dc3638f83ddba5f5814bbfd1a5cd84d54450b2bb2dd6dfd6b36b7fefec2beb2696d53dae129622a954aa552a9a6a6a6a6a6c64d393939393939ed23a78374a97744a7d3e974baa1542a954a2c6a6a6a6a6a569ce4e4e4e4e498b0bc9894dc0ed535a5524d4d4d4d4d8d9b4ea69fa6691d5d6352522a954aa5504d4d4d4d4d75939bdc0412808c1257236d2a8ec8c7e714512a954aa5528daf744d4d4d4d8ddb713c454c3e202ac2939fb052a9542a5db400060815e12f10877d7e1ccd3b9d6a4aa552c9d9381ce7c3e5b820f49ddee99d66a9542a9564c0541729a396443b8ff34e4568dabf4854abf4a927d1d3f0e8c0b1fcc1d00e5249a01b7aa236cff51788e3f244b7a78cdbcce3ce1246bb3d8e05e2ba90070cd5f54f12c6405c97c15063ae03d0e6e9d10aa79186061be67b8e9dc839616250d4fe19238c9657006d2696835a513c273afc04c90a4f30d288b49720cbba91e8b786f15ba47eb3527ec3507e2bb9fcec46d66f2c567e7301339f8df01700fcdff02e5a3c00e6f7307f653e2aca54deca5afc84148e814722ab626158caa65816c5e688a2c57be07f48113d6852a6a84bc62d0b9ee01878a4f2ef238cdf6015f7a121e537b80694df2213a316bfc5266e0441b4b9cf721747ad96f51608f415c83d28ba0ce8ff85e8a452a9325f4a19d083e2a45252521ea5ba88107d8af520d0fc1bd657e8a7536bef678c2a3f9f129d54aa6913342dcacfb72e22440fb24a00617dfd99f9a9479b9f2cbb81ec5bd445df75c9cc0b0887c39a735ad32d2b7369cdd25032e6f92919b3a66d31773e8c8c79fe146532589b5f80f9a01765325a9bef436b53caf943e0e9c124745a737e75c95813f4ef82ecb6048c6c73170628e5e129f2e8d1fca772838a8aca83b214ebd21ac8ca68edf1a3cf3a5508d9e9d1631f9e1e6d2c44ba488f64852618195f9a9db456bd4a96848362e56b36e3aec80a6184bfc81b5cf8b8a8c58ab5b627ca1c6ba0f95426294a564f589bbf92897865fee4079201f5f5f12307880e9a1c3834346138512089039cb34883727877c9e8f0351c29e5df3320081ec15839e9e1449e9c3c8c14d9c30a0804650a0fd60efff77ffecfb5feefac214dd3341e78786d0718307e468f52686872e89030a46dcb827ecee81982292a3fa91e3d82f1ef291ffdb2f2efa54aca4ad639bdf27e87ac83082981fe7d4ae6ee2c81af0346bc0f3c18ace0d13c0e3c9a9497b2d694df447787b7c3a7380dc3e40059fb443c08f459efdc243d9234397a64b94ae7b4f67e8719290ffaf7d324c552292a0ceee1650500bf55235806d6dea3f117005878065e79ff6c096c7a881fa859b16db8ef9d5ccbfbad211938c6fb0d9ef8aff5a887c041324e207b03f4d9dff01f47724219a63c8c77c36fbde36836d0da7b9965e024528137c51af152fe552ebec54f8b8aa0e8532c3c41130a8a49c68cbb6f635a7b8f433699e90922813f30499b744987faa5860ed9cba1c3af7902d99d1ceca38127dea18168f879109e2012f84355c7e1dd0d9e5abc4773c37b16d94657649be8fd49960425c35f58402c35fc45d6ba13061305a34956e0a75ea8b626e99346288a4a2a4c9ecc0de56563e5ce68cd7bf4e8a5f1bfa1bb480cf1bea3a8356ffb82b20b90ffa3b22aab6a9b9fba758fd83d1866060ce3de7fbc86ffe0bf2844031ed03b28e60eeb876d386e8d23f5c87dcfd2daaba1895ad42dba8fb21a35c30ccfc1c2745ffdf9f3a7a55afd25fe73ee1597b2569148632bdd25c7e87e439cbbfc660cd0803ec3330cc3a61b81d6de3fc071bc26e4e36f1c0fbf64aac7865037ee714f0385892031d32e47ff7b4f3a1d936ee1117900bbc87e96f71acbb3331cc3bdcb91c1748c65060331afd22fa0f7c93c3e337280de03ff03c8468161ef180618a66f9cfe22c301c75f6af88abfac55f4afe15c8f31c619edd6a747fbe81fd3005304f131678cb4868ba6b977f7d871aec89dfd031342f7e891fc487d0f1fadc59719f5d37a6a3bc2e5c2fee17a50f2abec5d8cc2ec0df8548f59d5235c6efc7a05b1c20650b041fb68cddf65035e43549bdb66dcbd71e3414cb67651be288afea0d13f665c8fd6bc0db7b3c031bc6715f53da494aff7def78fac7fb4e6f0bdfb4a5a1bef1da4715651dd4f8fee69cd5fda47860c17174dfbefd1e3fab70949958dd323ef97a1340dbe499a86fd3b878eb671cde3fa7b2e02143c7c2e77e37cfca54d740bd5875d11d7e3ef8ec65fca5adddbe42d1d039ac655c68c23661cc95de6e70b761678c5df0bd7c750d1709d6d9b684ffde7b471e8c26415fa53df3b25a5fbcb6ef55e57137552d5fb25b3d10b452fac69b21a040281404f51a0ea715c296b0692d6cff013abca625314c56f04935532d0a32712b148a46355dca37e17a127de75d7a3ae20aa680d017f46bbb7e19ea9fb26452d192874fc0ff36106c5ec871710fd019c67a8e4cd557549ebd8cc08000050008314000030100807c482a1602c1424ecb21d14000d8da44e6c549c674990e328c390410618000c0000000000800191290101fb8b3414fdaed73ee3d4d4ab288eb2cefbe362bdc168a89e3de3a2c265cb32c6cca6a8185511ca7a52961d256c4a9c4558410e7a20c79a4dd9126135ffc9c6c63c8b98386594b25dada14efaae54f99fe809ec84c7e20ce69103368cb022628a39320ab1cbf7892778626e3d6010340b4cbd094f9ae029f0b5d58d350b3982a552e4fb84266422e099f1f7a72c67ac32ca7b83246d5e6e339d6a4f89ef9dff6c013130f44c9f6477722bc96fbb1d93b90443983d0466280d6d9bd459d0c412dcd765cfa9e70c6195c61e05847602caf5eaec772be2cc2258f08f97fa67c8d1543d8cddf06011098d2b91570af94dcc844f02f6128f3c48f3082b22a0c895239733184861d77b0a399efff67fec3f3e2d059efaa0a7405cf6dd02da839f16cc145c31104b8c3781bc343a8da024692146904754c882234e826e7fd1661977ebe5fe20ac47f50f699f6461a50999e38f8cefc2dda1b880ba656be84e19549034d078686dec5d3404ce8df8286615de70ce523fd01f1ce1297597bccccf10648607a002e2358fb08a9013a24083c1bb1ac49a2457a018958d5149cc080349fc85fecc4679e14278c66c0f828bf0b725a994febd487a1a209ecc28473d79143d94a21ed78aa220f767aca75746f4491616ca3e9379b930d66d60b58a517d772232e7e92a5f702ad9720f9b62aec822302795b56bc211df49104b7e4c78e22672af6f7f14655804c42c37fdc750fdecf10362a220ae8c983d3dd9b36e1308783af04e84a40d51933f3c346e38e1ac4ee1c6c423cb1600d9198c133182a2e3a62f0599bcf2117fba3ecd6102498c3b00b8b816031e60423c7d2d212bf425618c60289ac1adc34a312aaf40c0784d0fbba01da4bb6aed387b2d1ebf8a8e8dd2ea1abd911a7f79eb18e72c63258b348ee573ef43cf1581995817e828f5953a10e5978e45208bc096d1d9530096c51e030e5392780b24317492cbc2035ea2982372c2b4dad6f0815a80125649d07072efbe5fd83b3cb032c8e5b7536905c15cfe1dfea6f66711531241bb93c8d7f7b7b3a5e5d16a799cf8e24e644059e11c0ea121659e28dd5dd0ec3a7e6def96bc6f25c09135942eef52e6e1990579626f2ca77f478f08971aabc4205647e676479e196167b24997e7d231c43499b429c9192b8e1c938b3dce5c629f7011a7a3d9019f76e0942f933f400ce75813465dc1b1002b2e60420a849fafc260822f27a3d8b1d414c6a7c056bb1d129faeeab8af03f891793ff219d69f40c95438370b20ffc3eea109f82eef05ffe6f74a2417cc12f66dc05502840e3e4de94c4141194bf049ed9d60c8f65afdd0c0b25abb04245f0e9bafa674a6e68b0c3fb0ef4e3132d0b0825a9a9046a2fa1488bf5d28cde0343cca735593674b002d7a7c97c6bafb4a9f3a1849689a40b4388dcacb14a9f1adb38939f370758e5a42d278ff90090a5e5e867217fc8d1e49904dc3a14274e207b8fdb658e21aca4abbb0cf9cc76574b58c69a3a5ab0e7ca2e88f29955e97b84f7ea669362015ef06da82cbf1936287e7d3568eaa22e870a19cf68feaf0b911353e561293ed6bf95c8cf8d5dd5e1f2052a47c21212c7b2efcc6e5a06d82921729d8bb29e7dd22a515cedbd010f539afd9f4a4cad90a0eba7e79b5cf50cf94491315dc78c91ae6586d8ae21d013c43fa5bdb2b191497fab811ca0a045f8a5ab1099e184c7871446a6a383d843f2a2cbe52b4338443da1c99af845c40bfed35b24c50e166ec236d3a275f385ffcb14f266dd6eec7c0b4df0f063e186bb66290e1d2273392ffc4f433064066336c9a2a523858b9883870e66568b2bc34797d1335b69d6fb3e6a6a3cb65db094c277dc7e54e0197b4fc866d5af673622f5b49fbfb49c38854063320e7a1e2f65d028e2bac295edc766c280527d4e45f867da45d4e784859a7b401007fa9d018b9388c5a8faef88f4ccbf50ffaabdb08ee39cefa73eeb950367c90a3942b118c0c070acd513742ce8028a33b6c50b0063f72bae6545de03fba5e4c5f47eb56a6ae590b625401387ef8bf619ce327abb3d629dc7cf6bfb578fc08b9fcd1a80130a99137143b963f4ddbdc331d9ea6ad549e89e44a38e5f86120de0ba5fd07b8df07a50821732cdcb94640dfa9bdc06a8fa91447e25800c7ccb919865fa01f5d4aea03e88f4eb573ce6ed4aa51be84037c8f7120db7fdf7f7e5ff5af5a9e382652bd1d8c9bce33de4f62204c5c1b91838dc9396da9247e04f8fb1be919a3090a8deca2d881ef1956af63e2427e361eb6f591a71f0cefad9cc4a78be36e217c802bc60d39811b9ec0aae73265fc12cf5ce02d9f344ae4d485f591503ea278cd25e747ad395288b2ffa3149cf0a8a0f2b20a4ed3832d0182b529fd055397ff7be1c242a9e54606ca6a9221cb06070e6a585baa110511f69f4089f0f40a9b4fbdcad30529be0fec76abc1e1909c4e1e9cd676cb6a0dcecd63559f98fe9bcacfed424524e9b907c8a6307a773040658343125caadc0e49f5f614b50b35d94104a3003f45fcf84d97bdc5df7e10a500e09ecb280e2f65c299c77e95bedf588a7e3b665cabe4190007588a8d07a20f6a12b2aef07e05c55c7ddbc6e61237c03c0960c035d8c4b670fc70b23f0c0604b60641d5241ba29817c849cefe4d85f2beda33fd374fd958332d5dfb91575be540b7f8695c38fbbf87ff8cfd5057e8b3be8398c0b34975f58c218178f66eb101bcfe3d639dabb171136feeb08e15986a03f9b5c281e890f2b278c632180ddd81d1f8a3073507a8a6736ab2004a32345aa33fb1e7f2f6a1a7148d0f84df038189f66880da0cebb4b33266cd85d692d3046fd137e41c07e07627f8e33c35c3d50bc6ce2016194e45e4dafe31e780dc8611fbc9b7cf0e89e114df0c72e3207746a60669bbf29e7fe4d4389ebe2384ffd15f83f6d1a0255378ad0f8adac38f21c8acd0c6b9eabad798f07d70bf7a3b774266ecceaaff11dd0244547132a6eee4ecae90a3fcc90aa187147116725274ca05bd02330d2448243f45c394982e5e1780969c5804ee531e16982fb7186b8f0bc0b414e22097942688274191f78e598da97bb5b20763b74d3ffe9a187df446d1a44fa1fa0c2bb1b1d60c84e4440267715ccce6fef1bfb2f4e59dc7d964ac78cb4c537a230d0706131f8cad9a253b317f4302b1be4323c5f3815a78181a5ebdf4234073f3678f46fc8828fb76697225a537d0c9cb9b6f9b8699acbbde888cf8efb8dfc8cc7e1e2613cb126a00346b078c235f7d7faaddc86e4a6f6623335b2abd997d4da389414698c79dcc0c89ed95852b41cc666ad0515cec8ef1a3c235a178379e4c8d2e53d75e26732d40d046754971095677e4d8802cbd593033143d7db3bba0830321b17f1ad8069d7a8333f711e9cd9ee1cc45e4d41b8b30c468c7ca2ec0ba6bed98980b68322bc8ba654037a8603150439f6fdcdbcecf7874d9dc673beb2a303ca883b44c5d29d412bd53e01bd74571e1c9d03dbd42c80f96826dfa8ffc343ad98a3f5666d54db6c0c560f30612cf80f8d4e1e6534879eb2631357e70f2e5c82e86f81e71d08e09455401863eb2bc9885d1d3e542ff9d8323626c1c6747cbef584a86120e14f45efcc859bb30301236b5f9e887a86e4899208f20f918591cece122ed16f203cf5915a2c9169745205d15f60cd17a2c1830ce3b8c6bad50de34e596e6d1488a66a4b35586f94b9824316451565b2e7d60b27a3b8848f3bf12828b46ea54dcf06ef8f48173d6cdba9967356d725730597cc6e0ccc88457c5fa5537b260de3c5999ef648c081500e06a699cf639caaf721f0d38c7898fb09537b4e03979ebbc8284c89cede42d5dc2ae62aefcf2b75418683679d421ed800e0d62d2a68ea4a46fe0a1e95380624ba0202028af7f44a58f07b68f377f7bd4698e06f6ed604180b789a82e5461a6df3d823230f984353672ebb821892835805f5950631464102904aaa016519148eb4b08c7ef997e700a4bcf8d5b55dc82e3653f6a35c4ae18b19d9cc452fd1b4d0ab8eddd3c657956afe2e70c258a28a336fefe7ae9fbff449703e22039910837aa574c0e5281875d06011fefa491c9fbc3f9df6dbc8c6eae5e696439d8bc7f643652706767cea3fbf733cad7d283bcba4091d3f70a1deb9dd0f0741bbcb6187672a5b4bf8ce982addf5099c6dc6854da6ff661f53edbb55cc7b3d94282f8592d2dfd65c37c3bc09b2d761e850e6ef4135b34af9f97baad521d89d224c0f30ef7b0b6f1a5eeb0982f200d0bce743f08cbb84acd04d28189769eb9ee9fd39ae42640b33fd57757e11e38ba8982d4a72282c5aba4c3881dc8b6b680438ad67d0015d5f49014953f903858e786d85175a7487665c5e53439fb07b9500e30d8016d7bb02a67a866ac1eb380557909d5c34b204832211a65e1fe58c37d154b3bc24735ccbf4f8506eea0c4ab02d6f0528c3850b82ba92b8077c431c412e1a027b3896d359cf823fab83b9661b78a1697991152223de42c1bfec1a1563f23d7b966dc3fd4a0547f1e6f656b13f01d7446868a8dee811deb0e836ad5dc532fb2888729741a10ef98eb40b1161c49c392db62e099ab7f6d95eb15e0e250844559278f05d48e387aefd8124c232cba1ff8aaf1a83d152651fb747bf6808e130b5b2ef21b0de4ca0d66e06419f59b4a83f8094ad2d2a3350b99873c6d7aed76bbbd8428c10441bf1b070a0821991125eee994a744a385cb6160173646282e647f5f6ce713b6731ae000f067a8497752866051bc700058df9c910fbb95eec35290c873b79fc08d47be3217d27b7aeca9f197851d14d0ac35f4df1d1ba2cb0e8459d7f0c68ee6fd19966903d4a16ae3c0d8156fb95a089d0b71572fbb5405a9465e6e298dbb05f00f591ea2eeed434cad09573d189df6a532aff85d9f42ac654531dc661af83031dd17bffb6cd3d1c5af79ccbfd318be20adb9b9968a86c24083367ca6b0294eb6f8d097de353401e08a361a12e56e286ccb56a76c1d26f136d97e398486cfed53ce42edd3bf2b8be810117014b0c61f7a5bed1f7625c28ce982dbef0d8b98dbd91ef5452b1808c3eb6a7ae39203183a4ef1424d2c21089151d093685bfd1332bff02ed653a8d4a65bb944638e43a8d03508c47d0583f2bf1d3c38bbb896f19a0903030f9b0de779c32182f86e37419e148d278a3bafe4fd980c127923397f2edd7951ce3e9cd911ffaf35d038eb2871fb6e2a9946fee4dc4db1659ffadcdef4db0265304ffc78334be5d9c16f89184026142d6cef2c507920f2d014798688d627e918749628616a2850122c63f0780267580e7f880a6145f60317471219cba1daadd8f614a678055fd3d4ecb88e37eee1ce52ec14264bf4b4f9e64a7adf14fd92be919c85cb219f42c6b23f8e5644794e80e7b0f3186f1f42a0c81388d7afa760b70a4b80621e49ee38f8226c89494fd5474b93799053c3c5970ad2ab056d524081ebce887f5ce9f946da1b084ddf7da17603efb0ee7407c12461dad18131837d23f590ff12a2c006ab4c44746851b956c7ec67252d61306d224d6010251eb7968cd8d90c4b1d7dce7af10adeb19638f5d466ecccabc6261b71c97a31d55036c01c6537e4a1056662b05ddb4d0e8b9a73c78a014ae8aa7ad253664fdbf1d2fb66086d9109ae75ff42d2d782be3b3703c6d99fe63120b909f120401a6ba80c1782e2360419b93e550e3cc0e9d2b541605f0dd2cc6d092fe7a7f093e0919269b25b7b40860dd7f432882eb05bc2302727ea2823c1455dd50fb8a350bec8b30edfc5f4632272bf5d070e5972bbf89b835fd0a2769e72778e02929b31ecfd680dbe671c3a502c5c538a19fdc2caf244c5f5e11f6982d84612fed32d20a99208c9d184236dfb34aeb7b0c56d1cf2047ebcb51167bd0f5ddd68968bc37b645322d68f4ccad610a9e7289d8d6f4ef3ec8840a8bace447f7f2b484718c20303d14102ad2b621c77b4f1db4b8503ff9e308f3e2cfa7c90aa5fccab7d5131d78280cf022430dca2a74d71e8f4223e8f01f17a49b05a658b266315389663d31d406676c37858d1b21f6314e8f94e9879053dafd17da070d20330116a21daf8c733cc4b229fa3520f9e99d9b07ac59c96dc5fe46704a437336c6dabe1f4040bda6785eaf935fc88ad300f2053fc89b06c2cb436ced8c7e00256535e422243dc63998acdd34392f037d2ee6a00cb42277a40b605d0b95dc1573289f8e0f26ad2013ad772064856a38139ce068a289b57058df023b0687515f2496286bbcdf8aaec7d174d3c0aec8295cb28dffbbbaff681e0246d542e2a92c026a75de723c0b61782407d0d4b81912c0eac787d8941d858cd12fbd37ef8128278980ca9b71282d0ff42109d95e150bfa1959145beab980b56803f6a276ad578cefdee7686cc9d53b4b507680be13046ed42312a8cf1dbf4a56aab6aebeecf3a2a6c7ffc6120e21b772fde7d8aa0300aadfaee075f9357b908a36804bc1fde7dfa3be0b02bcc8df83e0a197a88b510edc12d9edf06f6ad51d5948146cebdbf0934cb23d5711b85455b7e1246be7b52071f2c338264a82e684856423d91ec8a8f96124187fcb4114863e1f52f86aae077e2a3079309eab74d011681266b0940d5664aa6ef3f22147ed46ea5c9dd580934b6ec7ea0e935a6ef7b7fbfa8585fca47bc2872f99becf0894507592a800499e229cd1acc3a6dd136c92d8b1f351a7f3af6578bae4fafe7f7f2d4ee63bb0fd6dcfce32ac8eee1376f0dc70983fdc6ca84af775b38e46b7416b72c38a8d68896cd0753a55eaf697d9cba3b2a99022205925d80fb6389f339d2bb862362ddbfa42b46b92aa86013d84f481f761b3e365bc784a010fbe5ff8237a485343c6c022aa7c64a12dc1e47a0f399a5356661e8286616ea2e838137ede10691c9916ba8501e32654cfe5b7aa0d80063402858fb3141d994bb9c09f8d4b3c65d81d805521d64817d8847dfc58368d26512f6c31cddfe1781b82147156286128e57166162189b06a5afd01f2d0583798ea6a70813437e4ce9df167955e0451e50c9b230b30aac300e32954a183cf881045fe83a62447573d622ce0e2bd511a429b239a4ecec577fba107565a5845f4479bf50193cf5bd404884d28af9a0cd5f533fc436c89440743a3360003b84b519c22df01841eb434f28f1ec1e499407e16a328769d992cdd3c53feba9e419340023d8f938c3fea19cf27bb40079b00b0f0986f02fc29f93296b480f11aa8166f85ffd9cbcd9060f9725a52aa920be4512f8eb4f69c8dde1b32e86bbc11181242831ab59fb34a0d74f87cecbbcdaf4b5caef5889be90dfdc9acaa543b6bf74d1d852fe7f9cedb043a1428c73480e5314f2bf3eeb50c1ce597905a72d81340fa25f92eaaade5e63ba5f08aa433b2bfeb64cb96216a910aeca7a0e65aeb0d24d5f40fbb1e18431942b89be90207a8cfbf8df66277b5867cb3b2f9f5682002c580b3ad2d87e23f4f5473006dea537ce47e099a6c93ba5aca667ae30ee773472f2e3c35684b9e47457f32a3122effd2bf848bf5b13eb337d80ba154c1653c606c41db6a49f250156d2e8a5f9951434c59ed4e2d52538eece61e0511509542f1198b93acd6297978dca0440ff1838e4819173a128a91e86500a8e036841597b768149e42f99c750709907bb09b11deae7eccaa2ca082c2926c87b3de44ac9a26dbce94b0e52f398b228f0b0cb0029bd3eec30809112e376f4abb47ff14ebeabbafd2cdb67c0354a3041ca22a0c9bbc555ee46bbec1b4d7109c9e19a8bcb4cdf7a5910118035a3188f062fbb4335f21e8565a64655f0ef15c784de6231ff45e0c57f11a7470fae57ea42539194cb1749690e492d43e975a7238d2d5cbacafea271e50617e8e0b1868ec3278595d93e0a5efd22502f33820db4665153cfebcb9201618bb95c7131e6b6300f98cc377e74978d24d1cf0f3b0ce7d7040bdc65a39c84d90a4bac5a6116d4d66b53f5378a16ef20c5388014660e64950e6e4aba43fd32ea476f84f285126c3d8a26d8055678bc8aae3b9c5d135ed7f2a45ccb02c7d552a8fef985db579230a7113325266e3db83b86d03f38f50caa21e5573c37af046b94d001176fc378451c22d8853d73036e2d0a747143dd8f3c57d1955daf38da5c0056b8ccb774aa154d2f546d403f4bafa8bcbe4254b93de239e76380683f70e54f28f3a4235bfd9f448ae970595341af789aed15bf756345f648dfbce6317b30c8996c7e76b317ac0b6d25426f6ed5dab573bd0c6c0abdf8d58ed3c8b810808264d0087833a46b7d5b4b5f1b76a445f7d2d7d2deb6f122f532e2df5fc7ebcc935c298033a16d660e271f3f46a1591386165849e866b290057c061a1fd7d629bb6adfaacc80f7f2e19e5567ef517ea36e39d61a3e0d95582d92afd3c878be421180b1a03844edb892100a26f876fc96464ae32126f59098fe3f9af5d4c0a0a3c3be47b340572755bdb0de949145a1d151aeb630d75f134513164f9a7d8da19bf102a3bfd9c27eea243a3c1cec4abd0aa5b8b5a7c6c66020def89aafdf893536b65f5d3754bb3d6a348b16735d647e8c13d3f739ead6acf16d5636e853cdb757b9ccff580770ccff18f428497d27d10effe3040e4e40c50ba49ac8fc468b9c7bae171a6b1e03002abe301f94285ec0b8382af6153939b08d548c141f993c6920313b26b0ed03affb9ffc9fe3bf46eed056dd94afb15f40a3810b7c2f7da13df2c7cc392e68c2d3dee9ec3d80e01d91051e7b5da520db95b5e03aef41078463dd8100b5308ab980b95789e9acd2faafee6db485aef61c3e9c7b7d18b8e0c37024147aca4f29552a3c57191179ec95d19cdee973d994b8cc3305b89ef3c655db3f5082d6299cd283d074d88821ad7307d7345aa37bb95fa7d003acd9b2c2df5689eb66b8bff2e91cf321910d0892f91fe17cef170369293c331f17e9e11c6a999fa04a2158d0ee608b243294a24291323fcb7a6db4d61c683fbf579c2e75db61470235282d05dfdd92a7500312c62c5590e20ccacb568c57330db1b80f25ca67062bf4eebd0383d7a8baeab20550024bc566f61f8364e0867c0807cc0b3f45b9cc56cb8781860f637e26285fc258e94a801c8945675bb88cceb463c4ee571a9646f0cacc2ade02f56798265525a5fa08640637a8ecbdd33154c812311e0e88fae501c1147d5edf17513204b4267bb76a8517ea15de32b26e0275e9ad14ab9fced5120966c631a7612962d2da42d09f503820a6d7f933da5b28496c097c999cf2c4e182b56652e5fb51b927f422370b2cd2656ec77345e936f28724897d7f027672ba8ce852a3e92b6458d3e5d96a3a308cbe4a381770a0f3270bdfc247bdab4d19239641b6789cf974a43f4bf64dcba248f67e25fa36b3850ca8d1244bd8283a99722cbbaa4b488a97de7cea7b75cf946d7259e8e81ba195668cae584e4df643e62a3151a9ffa7f322d92cd66a426214e0cdf148a37b89ffeab52956d089ec6725ddd6932eb3129ec885a3344c0ff0121ae2ab3aa54b796a7dff551e10cb1d57ba43804d74c412db52f7d6124d372797b854a6908dd12046b79a12414f4bed1aad9611c09e07515349c9f5f5d53a7fb71dfe0738841e72f1b79a32850016f2df3462ca1a80e65d71ac72ceca554b2913807273352748b9904356419299234068ad2f8b55df4e4f9ccb13c0a36a6fb47166757bd0a76d6c616ef802d1d6a58e19e6871fa2894d726ffc37323d968bf0321e73c3f08b1d450c14260950fea701515daeb0d3725f336d80e63abc886e723eb989776a4204e562a31948828916428a5aa344a9ca5bebc6064889c152f25c1033ce4c645ef3d99b0448994a68d539a5b4c5d29947684e1b02b557a6cdb0171d13703ccd4f0bf66455a54ca1ea776a0d0f693098789e820cca7570b8dde09091231bf9e17385541656adad0695597197125ddcf4927063af66a17835639978fe5863846c8f170b0a29a8c43f45b433ff3aba39d496607439f595a2457bc711d655d76edeb58f53dc3fc58813c3d08808a506506abe0d042a74455d76630f8ab6adf067bf36ee8b568264c08c6d400b194c3484083c0cfc847840b5df4b0fcaee671408315bd696a0acb302d50ecb78709569490f2783eb1e549345a5f79a665ac0f608b66fa792bad37b5936cf813134aa27ecea8bac8076acf28a98dc602c476ce40f4055ebf67131c1008e6fb867d35d70bcc8c63cefda53d742aab3b5878af104f8bff6c67615dd26044f706780e6bb9866cfa48cf9c1364933ed0622a42938594e651054a0199b6acd3e3964ef2fc07e2a7b0a1a9dd33a83e3d84463e817e0f5a4535e1374cd963eac3a5c2b3eda88057b8a6c484c3dcb3165fc069703046f8f5c80560e0e2aae75fff75d24606748f280a84fc1e3d3d951c2548f6248cb22353ba6cd69e1efc891812821f4cbf26c5bd94c07b0ab565e8a26aed8f57e40b4bf49ad4b2b4c2cc9666ee565011b733f04f7f4f561f4c3e523955861c47a71681a9ac5fb527d385fb432a99c53991fa9b57b24ba6e1068d5d4a92e20cb116d21e79d03cfd9ea645fc08251eb994f1a65d647748b0c0b7fa13b6ca01611528741702d0134645904cbc81f74db06fe871b5c4b3873d6b510e60af9f5c5e79b3c9d552f202eee5d98b1a71fd39e58d40d48d190307d12e000578f8109e1b5002076744bd003f0cc12e4430e29e71e4d0206a8b3a79e3100f05367d448f026b45358d8452335b0f9e84f816c0a302d2c08282b644ea9846a06b89b8861269c9de56add7cd99ff55e43662a750f830b16008053f4ea3453a574ba16f661d18a2a33542ff150aa4328a92680e680e7a905536380ee8a050dae9f9f26352cb9c80557c9afdff534cbc1933bbb6bf3688f098b91c3152268afdb26a254fa331c29f06f9ae3923070c2b472e04c889cd8348b577615646b9544b82aece47319c1300f41c5c77807ed1104402eb4eec2ad2c6b55bd5c8b5968d57a8ac95086471ec551f216b41c2bf950562167ed3e199db956891130528a5272514360c25ab752d582737780caebcf6d0d0d3036b05921772c3261c83ad20fdccd2515df2fb52ab908a78f473d9ad307c03d67998774e9f756da8c4c3be4777825e4611a41670abe1a80507a908ca36642fca977929dab0ccfa3ebad4e58d62045752a9584d2b7efadd9a9eac533bcff360e929583deebeb89745c7697003ac6f02db76bd995c87f18e27b9a505f918cc3dc80c63328f6aecaef03fc218141e287868f3e2e6b64d15a330cff83a5834ec144a01d07bb8143b3baa772bdc66323e0f1fc2db7dd51690ff7304133d78ef7b7514436560d7e14f462e7143a39af450f6fb3aae1ab6f5d9b15cdc2bd46c4fe1573b47590a9a9f7141589c50b9a83676fb1b3615d211eea9888c8869d6a3f9537876ae0c57deb72b0206ca154808f6c8fb7540e297558f146925e42948b0e06905928baf7ea1faa38793e6a69324872c172b14bc7698746eb196ed354e6fe2d8fae6763f6888e6e360a062a95b7e5bd7c2f45a2b91220301c14b6862035e93392ca1a4961c7edf0ad2c329ece25d40efddd77a54bcd28fe4592676080b22050265d046e602e5979404d9a7667a1540b0293358d58e72e3a5b3c859f1f46f16904286abc54b91d0077ffe17e99b8b68ad0b91621933a91d9cbaa67996d83578ca3909d6eff90f86a98a4d8c235cbbaaa03390b6b1e2158028c1774ac2b48668da2d73c8e4df1d3ce31b537602806090a38be2fa20e62853ab73b47720433230243c943802025b62829857e523eda3f4ab550dd5ef522facd70a784faf693c51abc4dfbb05887593fa2f37711919110d2e9d54d80cc1f04abf77c788e145b20d361f6c7f3fc8ed92adf726c8051533680cafc7ce13917b034b775fe4a7ef8564543e44e2923cd5a3ac212e003f5bc57b56904b7e248ea3f9a01c70d84cd7fc28f5ec9f9818e9a3cc0bbdf621a24e0812c706dd5b4aa25de91929f94ebc1c4d1a04a9b49a4fbcdde1b7a21281e951bdf3c7744b0180255ceb2efd1ec34af6ca9c3dead4569fa58ad06e4d9a6f1a2a348fb332c18cae3c45df170f805f68e981317fc3e1ee52cf4fa150bea17e9ef15d95e8e3c69cf5c069d38b0e0dfdabad7a897d3d6e20b7553abef72039bd0a38fa30bf003248f012643cc36805d84f00b83d8967adc28ee04695a811c7d223057ee7756acb9ab597e518e099cbdb5f28656334036ea79485311293bd013efe2c17951b2ada4007a8c81d94cdd7df5c0e5570b7a5a6a1b18856f9dfb94e97411fb609f1f4c1264ab85a4180af3d9d48366c8282142f2ca16f1f88f615a89d98be40ea9ec4a1b86ce86b1221fadb20d55299fa534013595e8350b48d41816012b51339699d728511f88cd12814680a9bf4e825af34f9c3e48a0f7893c5f933e840cb69a329e9d7174f8711d4d42dd905b1688368661cdc7d937d715f60b659872786913fe5def0d7f7577702e6c35caac8227bea70efa1b940a5be5504504387aa3afd304b65b6a81e6a3b08784a56ea2aabb529bb108482f4c8a6708de903f1361c65df4b17b711d8cc2bc3d73f9f77861b03ddfc4c86c0a03fef65ccb214be7f63f4ed34b76b19ff735c51e85e9940e5bc8727997dcce70326522182547bd7992547bdcbcf4460b1f64951c9b1597d5823c7ba377026367b3be69d9313fcbaeca5c2c8fa6c903809ca62d49c9edc6a81d1cf2afa95e4312ae90bbb00637a17161d12a0d0a06ffaeb1c6fd8a816438901105403f0b8d780cd060d7e2382a8145858134adeaed83e8469fc396b5ae1b9feb43ad6139fe41f40107e57d4c6f50b0791c5428a4d00e084e279f067d14d90eaa20ff2926fc0a8f3a2274dc538da51b391c437dd9352a5b40535224903d0fa54e7e8e087bb7780da1986962c79b4bd4a8eb959c5546ae540e8f8aa45424d089888b473e1cd17c7b9c208c5d44f31f5716176f83c9083598e2da3ba0a711b07dbafc14a5265dbe1a08fda0d82710a06033f78bef2f5d9fa168bd906085ba67d5be4ef6a24a7fe6b6934d7b7d4e222869b9a811720078eea98608fd1e6c3e17a96ef0126ecb777c5cbaed4cc24ded9df411feeac49cb76c5f171546cb2f73ded21405c4fa889243db7e9cd243b144381c86d09ce36b8f7f74971757f89d47d7fb3b6e0007b726015ffeb7ea9ac2b5fc77bcfb37a314d4c4707723594a68a1e5800ee0d438fa68554d24656d20642b5b2abf7349f76e116303a15d58b227972568fbc4102dc4057bdbdd3a7d6da706035a369525e7aa606317782baaf23b2b8f70ae524c78b9bab14a676ff152672ba2843c2d392496076b2de9caf3c69c9502f2261fb66493907a61604bc221a8959cac30b9327910382b6b3e42fc5d1120329d7e06578c2e3ad51b3607e7cc708e3a62b63a30cf94a18eaf9a7186a14b88bd25a118a1d5bc0977a3237a24ff2f29164db9e68c8320a6d94f11532fbab86e9495576a9deb164a6360ac6f1cb7a6e00bbe72779a26dcaf054578cdd0e8d3e3bdd6b9980e76c25522fdbeb1c8f01d28230c943d833928b072b5a14201550f4a8228bfe158e32616c25ddb8753eec876fe8bea58dad6ad61088bc8eac534a6d8c1fea1c8fc4480a5d1501b212b71107cbaeb47e6279369cb0e26184aba6ef399cda65618c1cc94072a6b5234eb1304e7078e02ee04ff5fb6c6f5906f6b939353d1272a9600d4b1c106eac41accd8b239a50e8ea826bc0ccd8cea6c7650604003352b614453ed4fb8cc5613a5395448fbb0533aca30110f3c3157b1918c842d4dd01335d46d6608acf77215d18d3df2e0b4186cc85601001686d718bc9080decc3b472c5a7020fce7d9c4e8844e1953a29bbb32ff65c2b89fd98721026464c0c1f10733a1840dda4f5a980f993cbb565e8040656c8bad76194116417ea3b047854550c1ef9c3b695113408bda79e7ff876bcb8c97bb1f2cd4f5a61862b5a67eaa1b2c59abd66a7ae8a716b1701f420c0090e0cecaa6e68b6242ca3f687ab0a91afd66413210da70dbf55d480547680b435e1a56aa8c042f4b82b0b00180cb7ad89a05130c24ffba3abde7851a453b992f8c09e3d39bc8fa2a519caa37bb3d6285b05434a9cc3e28b453e43b47a75860ac0918fbdd1950f23f0da221b1824163c21946264e5b45cda81030058c756b55354eedcd2fa53a46bc3c093bedaafd8672086c23cdcb9a60c4660b6e5c009753ab50d06e6aa1c1eda7bbf2dd548479a1258cdddebe01967f853dba6c7d8a53cec898f296c4fbb0d8637fa0bf094b67f3fc973cea53bcd27000d928481dc39230309d5b73b965175e316a8c9e0b3c04ac31e56f9c597c581f8adaa91c8d8a7966acb02c566a6350c23f8a10ceb8c64fbe5fbf850ad0e0399d865400697a9d8890e3a3db8202900672d218eb92baff9638273dc6b04f62edb60e29e5ce16c118c5865edfdaa802a2386be3a9e18de19a4dcccb74085a12b533d7cb390384881d2b29ad749c0f9a17691b0d51fca61de2c611a140bb2d51bdd225d8f8fa9942c3e2a3ea07ea4a77f2545f80ca24e50ccdbc965f3e6ebfaed95c3d288992879e18156e03676e6c984a69680dcaa1c2367ae403a89ea1aefc123a49cc8297b8aab4712dbabb38452b7c3b26f1dd9686e6ba6750ef3a4d0ff794a39af30965524f72980fe601b9fe7e31b7416e5e5e0c2828343c56ad260dbf8ca11e04e1f0e9108640afb9f2a682b6b89a580761e0a248af147047e92047e1772cb6385185ca192363fe911952bca70cf89832e7d2e309b9b11e05448f8f30da46e3214e11ec81557347e1b9ad4039fcf8bdc35e6f5d809e43fb57ee5e5486cb3329f266f6ac3b4e2d32a474bc7110a2788c03ad1a331470a37e35f4f4a1261e7c4971509e4abef0f634a45dee99f616c0bc640f1506f22852a3dc0aca94611406795c4aa109e27d5e62210de3bda1b9c15ffdd798ab698139fe7bbd4225d5c88fcfe4b615ecefe20f0b62cf8acc59ceecc0e8649b62c3e2d9738b07c614c6a6552659ab0885e76dadf6e82fa833515114908ea846551162f3717b81b186036f0ee8992d4dd6aa5d25bea555bc77a1609815a6f8e7dfd50536ef9b944d2827fb3d4909e2115a29e17dd2ecc143d537dfc9ea1acda2a6959b94e632465d7c713542f8a813614ee140363f84d57b0992749b969290ac83b7aef08b79a63374613099db8f4ab65ead4dbee3266ba4bafb11bbf104b780bb541a7f8471034ee8d113b060244f8e75e3953dc7c663df6bbdfe6566e90084646455b6d844eb124953093faebcdf457d071b342b170f8bc9f5b1d8c98fe146b367f8a48dbeefadfc5ef2d27b0572f96e34f51b0042da7f8fa4e79eb3eb3590831e73f37e3e7ccf2ebb1748dccf2b163b6c4e8fee7028c2d0d261c2e81589f755c7fbd8857b1f8300f6e2516aef8408f4a11c06d1ddb762effd76b6978f95afc6fcfe0241ec7cd1b389517afffb3d45fcbe09d4d8c3c1f723ef45c3be2768bd582858903bb00a45d17fa928a487f0268e8f2cfb6a7ae7a036d111f4bae8864e44e412cd21f82ae5db004ec46c950034a3249d3a06d9c40a0caded8f61964980c0c85aa70e836c624586d6fbe398652740d064b5047ac9983679867fa6e779c88fd6bf05191219da457a6464ad53c3209b582143ebfd31cc3209101959dba9619049acc0d05a7f3c669904088cac77ea18642756d06895647a0080f6780680b8f524038fee2510f428187219f07d33844e745f1a96fb8dc3677bb38161b29407150351a15f258335f1208867e6017d9491e3f8b9301e3cdcb08e48d1023a6b9b1d2f60e4c629ff78cd7628440084cc4321df4fd8f18c16f6689ced975be442082d54fe341841cd585475806564ce2dbf8591fb1752e22d1a8aebfd59365136d614e842cb8ff701f9b9019bf669f560b5509d301c6d6a64886718f2dadf050d5411fa5efd440e83bad9523df30a972c9c21cf5be22b00bf5bcec7cf1dbd4fe70ee3164d0c79de4379279ac89122c49da071284f2699ffdb77dc19a63eff4d988c3b0105e7433befaf72144f885754738c5fb5cd3f7975fd79b2a0d4c47dca4b064ad7cf712f3be44148f18877acc5ab32a8a0c5058cf126141707f470e7a7b179bb78a37d9dbd1e1e7acaf396ec3777423de551d381b05923adc4a81ddfbf9dbe319567dd7cd07ba511210d84609e9d27cb7b6a538128b18e24bfc6b484c074f1a302dcc1f23ed84a59f7fa1d20bd1e7505d172f9a65deff22e55558886b8006f149e53413acb061e2084a1933e0fbace9fd4f2a8dd91f10a46f44bd05a68607f8ddc2cefa9c2191c86e808876a40f58c9586a4adb6599ebdff416ff4fa54888bf7c1d845917e9e5cc3ff1c3fc4d7de9ec5397d8a16905ca3fbd98a0f76796c37b2ce1533c6c197375494356f0831a3fa1dd04f73f18f0b0a4ed00c7ad05cac4f9765ee302f605d841dcc5d570746ae2d8f58c0951c84014a1ce67df02f9f26f115389d77bc63fa6a4f2da1dabf94c38b22a665c35eefac98f7fdef7eb76e524d52c197d9d5ceb4cdd8658fe15a31cf92e08edfd72c64beef567327971a14b2fed7e28277c8a751cceb717fb32646904ad74ba37b2c563fe5279ad1fea5e9cad40ca302d8298a71b1733a68fe3ea2e6e69931d8bf5aa862ded2575bc6f83386f0a3ddd0d3f97a14f33e505f7c3a69b03951c2ed99763ce89380b0b69eea877fa19817942f66679ed555cc331a7c602a5a360bc4c615f39e0d1339963c767c7b2b0a59a87299e03d5e22496d20bf6b1ad75d4545e259d1005885c9e0a577dc65defedde4bae64394e80edab4bc6c33a9fdd57f6aebb2b52e8189e8511570a85ab2a836bb2daaf759a65b8bc7b149dc4c5df30e8ae6d68bd05528929b78e80b91bd8153b37100e25691288ca231cfc7f3baa81eea68cd0dcb2daee3ab59c74aacadca5c18d07951b26cee592fc6eb164a06d4bdc91dcdec705b4e2501ce7f501490574a9bddd40419567606cd966a768556b27355f7074c35184ca477684cfda3152f311d48ff7b1c09e6bb5fc96af6c5e93345fb28faf92c0a1e80645b09c507161a8267d606985f5f679d05e7a10f301368233f3dbf78cf428392c1022bb8816547be27f91cdb3fff42c9449531b7302da7d9afee22bbfe21f5b5d26881fe0de7a93de5fbd139ae556d003d4adead5320c4f62dabee9c6c84ca47828b189820eb8982546fbdfc3158dca81110a87b9a1e54ab3e1790d27b2d609a2e563632054ee54ef4f74f8ff2210832a7813688576e11f564d5c9b8fcb0c4d52f4a01b457ee03b78789091312f792467bcf0109cf2143cbbdeb5bbbc3e3c878036d078db3d338fb955333d49d6ac94e0bffada4f6d077de1e65f51c3a7642ad095385445a7dc2fc1a598e6cf22892be17add76410bba34019f02fbb7a333703b181e248b72fc2bee20aa3f5273062462214629e14a03d60adc73c918f2c19940a3d944242e5c4669c3f001776ecec726b462a7352fd2e66c93e8e871f824d8ffcb47ded67e44b6c50d8764a28381664c7fe1cad9c5695b5df951b342704132cd7f02a86c67295dac704c0064c42240d3da9da50f9f78a0673716b1173a798107aff1929475a65f7496cedb7d50f13fca1e5f8f25da4cbe50ec23bf6fcf899f1c765dc6bbe77c7309c1f198a42c3ba715781835db911ca8ca618b6c866f91bcedde59d218efc8c1c0b97149f6254067563c20c1dc56dee47c553e293004b154f6415e70a2b17a9bea10515e1d25ddbde9aee00ef19188e37d34940f2dd33c719b0ad7c38c3bc3f789856083bd70d42deea475805d52df1782e42691b224296646be968ca690f0542bf8a409b72412b818a3ee9514dd3bfc3ba7cce6c4b4348114d59df5dc534f77a389e29a076204260cf518a4c56a2741b192ea366868d45c5f9b206a0c789318f420ca6593cf2cc6d54b6919c2969c90c92509bb6c16fc2b9b6fa51a2fa9ecdfcbe1b2454963a840166890878dd839a9b98ee1897413fb916024e9048e524c2edf17e7cf2a6a6d145a9ba3c56f76156a9e3b9ea0441f69e40bcb27aa93691438c5eb4b666047e353ec87603c2f64088f54ac349abd382fadc467bb10a295841e4bfe9ef11d01205ca2c3c046582a75d3c64ca868a2e9ceae5dc14b4569df2cc1304b73ef554c00a4e9ceeeb9faf2aea3195fbea179c26ed6202ec655c5c0c96e280a2e56445172c8d92441928d8f8dfb379843e4970edc17abb03360392de7660931ff61907f19699219e6fdd86d21a306f1bebfa858ab5aeae1ad241f3499c0cd366ae7ca2b5c773ffca0cbf182a87d516d4fe22e51ff813657cfeff2010ed4f40a4891d25e02a76c38c8038b32060e32c69b4e13572e631867e5872b2ce60d7f64074eacf4d51e076e3640e721b8633dde19a4dc4090e13fd056ee97117db67b4fc3beacacb5b986feb520c5e2513f4ad80063ef87c7c739eb56bc7a9b49eda50213fe532b77f83a8388f30c25576e8dad744b347da82fc2d504732d233268448f4ea0d99dd351ae56c9e66b59c37c9ea6eaf860a20d05f4ea4c7e7e867721006f550a02f7d16831b5914663c1770d3a2a155e448b30cbbcee7b04b04f35d63b0dccac87c7125736fde87e497657ea5849575c227e08d51ea015be533332c2081cea25c069165020451147e81c65bc4d5e3b35450fa01001d48d934e380e7daa661c37cb987ececcd4d660c867407677e97488497e7480f2511cf39ffd1299c9584532dc49f143279c64b31717b5f6ed419592871ae5aa7ee107b9c0f1b500ee2d9fb1e99eb65b49e073ca40bae222787f58cf971d45d4eeff4d63343151d38c7bccc2540983c4574f78891f186a9fef5a3a04429c4038ce7a09c97ae2ca3d274cb3c8a0080cff7f71ecda8a827b84662f97f100395ba7d228b5a342df390fd9cce646f869b868a0e8f7210873a39801524a73ce6405bc5258c9eb09bdac352424b52330722b1a5a415a6464b1bb17e014a7fb0d54060e7cc89510ed50533b515562af1900bdd56e6937358861e5a7c6384162f05bed75e2d49814894500f807c098421154b102a29737bd9536f09a68de6c3d428844c9496cb1cefd1188e6d5653368bdcbc4caaf83e474f95ae2cd056d27b37f1c406d56c5ee1bb9bf3743718d6809867bb8dbd61ca65d31b2238383a5f3a1ffb3b373b9ff4ae3ebe6110ce55f0490a6b191fc6937d688010f47aa2d1477e4a64bc7ce5ba4d6cbc01f151f65391ff1f3c37c63f85b5a3a82b86daaffe4ee9c0d58303ef0513c93ac2d50324c1db1affedd15a7e89e72d1ae9314084083d8870be2e4fcb13419e5da7db4109e70f22f23164ffeb05061c22875173d663d5c3973c7184ed9c85819d6eaa3c81446ff77e0d303934914cd5f6768aee911584217ab0f9e17c2fc910469f11bbddf738f2906f78ea78f4ea0b428b53d980a08efaa80cf445ffcfbfd626263896084f74c0563df20679ae596b665ba2bf68414a9b382f8abc07e656a2a5505b2155cb94c8fb50814bc19548e1575c6e9c3684f9cbe7582e94eb58c0c4aeb7b74e26dd2578c833e6120577706ea13799e4304979b7a112f70d5a3d194afcb80ad88653783d58cd489b3b2eb42935d28e54ce76e3af4cc58e0406729681a0faeaca012f3e9b8c18d6cf59e1e13591ddcf2ff9f97025d0c0cd3e5380f7c32ae8ce5b8692e0bf5861fde4a40b30c3ec8a682edc9bde4fdcdb842395d0a7769b048da1f680cedfd0809e615215bb89caeebd781590b3ba44adf0db2ed09c7f3dc4df67f937bb571867258309f01542f23c637543e819a05c13ce029d81302b587e38cf1a87d010f9e219a97fa1658fc23662be7eea54bdc3d28d7faf22d8c37844f9e7be8a4877f0ec11694abb83397f549579dc5ef6d4667174597047040cee72ca784960c18590f57855bda325afff2c73b43b8a13c16a950f60b7afd75e515e853af0d758c1226077f39554f3338c37b4a37f40bbcca1946400d2ec3fc181dc8cdce1ddbe725c1f9e9f04369fba69efd5b0c43471900287aba283a0d3373a104deea273ce79cb92e3df987f752f91c773de8f20839bdd31d1d7de41bbcc5697715b7708d06a0ea1a16ee14786e83b1f81aed3bcf883d5156a288480e1e5b84ec5fc8b446b823a7dd822cc3a3c7af137ce84ce565f8c020e9f950965af119ce304e07adef4e63e2d1c133d2cb0510a4dde3df2804b9645a2672a1f61b763bf74b8ffa581272674d255e0c673b3ffce940020ae2d14d11871c06fa2ed199744591ef8033fc4f7f2705ea7f1bd2cdd34fbfb6037317db74323f365ff1d43b81218784b1b3cc551dc7a8e6c2585df13344a603c4444d4dc46b5871cd47d93afdf3f39e41a168504104ae0371df8aef6d042027f40f7a1ad36dc3b180c196f7bd08238a68f3646803124a832079b4559b8603044ccdb639ff2e4e715682f435486b19b4358af3015cae379b530ea714e40cebe966fb1e450603ccc6b6f44836fb81db3516396a3002b73236e38cd843792b1c4bb65aeae8d8d5f05103400485254997e0be9871672617a33c10c19f2e3d2303c4e53c5a684e40b4f27b735259ea6e210285a447700f62f06d8d307f72ee03b387b028598e70b9df2cf2a568a006460e8f23b166c4c64d2bb5da71f96f35c3c7e1ef88173ac81e33a7316b733ab9b7a4f5a68cadde74fdaf8a8ff90f58b81af2586c36df91e82211a807aef1f78d4e8c2d2e252dff129cb743dc2657c0fccb4b4dd7d025fc6bf9b485504387841d0b1ee2e5a1d5a13f8eef6ddebca88bfd969561a913b61853e1be028ace6ae687c31d647fcb97f7b2e663617251174d817e2117e4cdbed66ab8a104513264fa8a327ffd253d6adde0d9c323256f52a9b05fe6c53945c9d2b3b7d53a40f75fe2cfa4c0dad66f6f520158630f61155bef42d81af5f83fa49c572616134f573f5faa741635a8600fe095086663ba96b1d02355ac595d0cace55b8fc6eb9b73bec202cfbc81eed298ff8b928ebe7769da7387f39ce26b6d336c744b16e3d60be0d772c4cac4f6c4865d6835d403cb718b604df00ad2dded8b0cc199d7cf0f50f42ca1a221da4a715755e9c56ba9d62141f6dadb5b218b558880fcafb2a4198ea9bd2258f26d60b5c117728ed07fc889106653edaa9c5b3263dda8bf4aca99f9f3a228eba064c4dbf166a53b4e02189017285f347968ae46a4a55c6427edcaeba4542f7a367f932960f1b54132b4d8156e917b58f296e91580a5bd3c4ba8b9518ff083b45cee14f50406cf969b0cb9f015b9ec8fd5aa85253c1848443ee45694212f20a785efd0ccf8358342fe545f1ed6d39f76003c9967eb63f5eb003e0b762b6025be87f3a0f8ea42ea1b942a3339cc1cbe3de4bfce11579935c7485992abcd4c0225b449c9f35f4a1b5eac735456c417cd6e629f42f9c9a469808eabfd204fbbd6aea65918f610bafbdc296b7de1a9f16c08a14d431419a37c4f5120110ff6ca4bedf73090537510c2b8cb837864693fd9edbebbb5afceb227784ebec2d8f2d892a4dd6194980676e6e7b845c2dbe1f0c1319b0f46cca2a887cfa5004fc8a4115888df6a2e8505b2fed495e53d265f42b041945e0c44f2ba5b6b1ea693e1d93672f681ebff61eef2225bdaf983f49179a558ae6c1a474bd84d27c363e25ea4fdaa64256932ea33190b6265a38a46a2ba6991f99508c11bb568e4c6878de10482213a6d20f18763088a98189270d07d1d6ab279b6acf9e1ba444b59447991e259d31de65afddc8c543b5f09d5233c62a5048d95b21acecb3a28241954427495482a0eba08dc9dc65663b5530aeb920f78a9fd9890b0c02d6e8f0eda9a05b75b12eefedc963ce5091c28be783cd8e42364881fb8f35bb5f191bca232d02654a7d698610eb66b6679017d7698630a4e78a685b00bb7080ef68fcfb62232980b29886a44d57f3076b3534e45e3c265ad8ab143e985e9abd91045e2c8dfde25cd817936c53771fc7f983a17c67947f594760d38450867339980c0ec8277ed5218d3ba32b0170ee5900cf5e238a09088482c0e7a4c2fe8fc5d2904e086792cf785e44a6ceaaf1d146efe925123b44bd143da543c5f64351c4f7373ce36c61caf4fa14d59c9bb69efe04431d47dbfae6f34255bde24fe88076f1821bf7c7eb13e6bc3c90afccf5c1dbd2437eae4ef7d32b58cebb4ff77b17d36ba6634adb6b02660ab22d035f3a57206ee66eedef3d4ac341a0a921a27c38d091feb948a5b35cff18ec15561587c129ecfe39a0dd18f22376d2c5ffcca46a32024ad6d3ddd2bf4f61b018e026abab3709eadc295ec1d398ccf2061bb659479f0d301ee2e17c4318d14574b7969bf54a51bbe287d97fd24596edf23ef6459f8e442c18ae07c50a56e6baaad191a539c440b403f8432261d3d3ec05f3f0bbf6f3f85f2d646f9dc37dc8a6a7c9faa787ba5a8b6d15da2ce016010af62a6e3b7005c26c86235572aa22c41fee10e925da32554f624da5a4c4f17d827aa7b29c9a583eff6da77ccdd7f41b97f46d1e13bcae4680916d7cd3b74cec25bfe3ff6d18e33476edbb9b1107a93f165224a249ae1654f668dae1d5eaca922c6c01e440bdec1f9efeb0510ac120d3b87c0537afe0ac64803a013abca7e7ed4783e0ce94338199d7103d705a94d70dce6f138fc548a3b20e4137d8bc6b2a93913668ba4f8c5fdc7b13fd56586a06417eb932ca760dc6ec6f90a566efe26658be6054cc83807c57b974e8c73905eb9ea8d0564de6cc54e8ff385b4e164bba513ee2f7969ad4c16b41e3bb71e62a02ce732057e38097ffe2b3c5a1a5e65a7eb30b65fc17240dbf3eba5628d916eb4bda2e67de56e39506738b00b19b4230feed1da75950f370dc616eb9626e11690b1c962dd2324ca18b05815bd7e0f0db67d3fcd9bb04c1eb66aaecf5c0ba656e251021a97129134797230a94e0828b49d6555b0c1070d2b9f9af65f5d9d4040d49b3727a5df078f83fb837eba6a860454dd15af8053ece9d86fa132b31bd4333b8797af5095c722162b7e50c3893e706603ce2508a109ba6e8cc10563f09c2119971f09a9866b72364ee1a804b07722eb9a240446eb3ff637e4717e3ab42cab5b413eca4498f010878af082db0d5e80bd024ad27777e560823e7b6fbf028fb80bf6248885a3e188309c4153ee328ef8ff1f0a55303afe505ecc5ee10dab338d99d306430842941bf1fb06a1baf3ef98fd524e183909e1240f6768da60c888e9f597b859f6e1ddf387c37f14ae5b76d246e822761c12b7654cf5eb757ec8fa585e19b13a1feb10589666bda4f249b5bb8ee0856157f90c127db8255690c1851f51f815df39b7a26220c2411d8783e92c99e1e76f98c087b7559eebaa5885eae80799f581bc189a36f8287b04c49959b9e13c165be2163c0659401d0be24e03fd612b5d3d463791f1081a14eff24fa579df1d5f0f00f63d67d8ccd9d5ee3662f888703b9d5d1712df60b386624ec62b3d8abef855dd4f0e90fcbc9ce32eeff6fe13c410fd8d9851fdea21138bb50063332c2ce2efcf0168dc0d985329891117676e167de6129e67f4444ecd2e27942bf15bbf48d7758caf41d1125bbb47a26696fc22e3de33d2c45f78d881cf6252de907c3fbd01670f479996ce2d379ae4897fe5b2a4a31255ddf65610e842d20f5ff60ae0cfef332a0f87fcb03c56f591434678c49c28b4a4f886e072e18d0de896b7e8917038c4ae8b4a4b551c0fca922f0b55d913b87956fbf5e15cdd7e890f5e861cdaa0a1d019fa0906abb34e3aa42dc9e223a40819b0ee2764705222174ea42091614fe146e5dc7b38f8bd57d3431db6c40446f0611fc1efa4eb947f60c639d7009e1553c5be29e8f635e19c0257b3328b4c73d4da30c6686abd28437fb52e58a250533188b7c01e54cd76838c99e1b4a84f9ec03a88f63e061c66ba585ce41274c126708f25c548552a48f9060163e80e5fbd16efe91a180b50fe40e59f12e9e53ba67e927c07efd8f66b63e12a23a314fbe81973d5d6622d0db0fa569ae4bc090538fdd44d3dbacc268969e929e3979f1b6a68cd1001097c18b2e9a7f230d50cdb9c15d2681ab086ec48cebe47540a7f524e9e52da8825ce591d01a71e52787841a4fce7869e6f9b5432370e10d2f8de39bbc8b7582ea325a8416269dbd0039b974542d7b8b0a073825355a68474574421ea8f0903f541fca49368eb28f8ea80119d82436cb7c1dd668c7eb45024a0192ce27ba34d0a2a4d19d97ee261f239e62bdb83b4ec45f6d841950e86a1bb8a814a0ee470ac37b97052f1812974a3dff1bac9b96677d89e47ebf98b4c74f0b3b92dc3d005f6255799b5c07c976609288641bf46d32e4e5b5410d13da6957a2b94bb169d91871e49b6d38342f49ff4a26ace00f7deaa50c280bd3446b5872ae6ec692114e1f83241c6e579588be08e9e8b468e8ce4e07409a0d3db6eaaebde925acf5873dc9c6465bd51a13545d7c19cb661bab788ae106fa8cc8e7438f65653b5cdd2d5923530c371336d68b9225709d6a0b838c16b3bc1751f5b7df5d4d4cb720242f7f76794033afc696a3ab4c6c1d24994b371f24607a2fb588c73df475ba8ccf5da35f42b38060a58aa015c02c1c60f6046c20721679d100c4d3f96929b694230600dc6813de669991ed5575a1164c71bc447715143d705c72ab8bcaae611da8f38f420495b1746dade0ac582d2f5f81a0012eb26fc7cb9ffe4b9ab16bac052a6c4b3fbb2e5284a4d01d91b19fd8948f90eb2d767e1746e5a29ab839e67c1b51d7ef896877cc8dca9f64e6e42bf84494834f2c7f2d210a5f10776f9d20f984696cb86dbc1888b7fbe09880973875859b167b1a15d0e5e70178c14780fcc92a4d6941c638ff464f2ceaffca13f4f7bfb8c2a5e7b702753f54aca8266d02d40584ff045d2062195231000cfa2aea500eff23d7c3e3622b1cb7260274927390ce898d1886efcd0429a001186ec7bed0de0a4022cb7c70ab5bf390ce7b6bcd7c6c0c60ae752ed6bf1373aa402e09e307d456c45d07dda12932831ce159fb592c9ec5f05385242f12877f95bd1fd718128c1f554ec22e31fc5719f9b0f3c49721cb905c62e04228b261e827c6d30b580e7c8107f793f8613b17a8902a88e82df93b09b6cb701d2149be4170f4b02d7e5c2d92bc77dbd435a24b84c00b6078f60fb1ac243f640da5cb5921968c1c49faad86f7911311d2cb050a6ee269a17147ac18e89f642b48e02355bf47b13d35c8df8dc1e14d21a242f3531a5969cb13a9080c9c14d3d0b088b6c1677f5dd202ccf502fa54ea7a59209c5151074d55b3849c9c7414de8a78004526e6f9a6228a26b63c00b91d279ae1f13c263ca17629be2992b8a2693b9b26b13cd433a136a05565235bdaf15eff2490d01c9eaf776246b8be916858b29b6cd964efbda59452caa707b90772074440b27d8b8a54aeb3dc1e74f7b6c587ec8280ce942a2959e1e35449413931df7dc07ca852253e50243e7c745ec3e64d96c6b16402ed7ba9b035435d670e4189360e8ba003116c9c3125b20103a05b22d0a9f069fa721beff21bdf922963726cdcd0d961fd4c0683e1f2d2e2e285bf604c182c2e7f41d3f27226c7c60d9d1dd6ce6c7b1e8656dbb05dc8ea4edafb5966a9b4f73396dfd064f901b8cb0bc05bfe067ff900b88bb7c169fe71f0d913c0659e6e87315faed60d5f12b1e14b1f007ce9842c26e56487b7b81f0b64838252666656aa131306658a18550a45dc397131637c0d0f7b9727a1e7f59757d1f37acb97f4bceee261f4e58ef4bce68e1e7e779e22eaf02d048a5ef99ea64a565258fe5f25b64dd35c39f7c9c9c9a9655f7accb35676389aa1942c94dbdd807028e28e27859886fd0c97fd0d8ec7bc0cefe113e032dff9ccdf1fdc87f7e1deabe8b0830e2fcabbc310ab33e366099bcba865f432ca469f9151aa2785d5f1b0438ab8136a41b6b8cb4b8b8b978be5033a4ff7d5eade177127b5aff0fe44079897e94ab2b84cd4716971e1a1ecf57688b53ca2b5b9a069216259ac133e30eb32a2bdcdccc8c09831351d4cefb93198113923eac0ea8c587335e7254f597bc20ccc2c9d1077629bc52c6d59b03c0f77f919bce565f097dfe12e5e87d3c43c0effefe1337fb95a5ffa944ed8c870d8dcc8feb5bd7fed7b62d6bcd8c0dcd0bc78cbcbc5c5f2a21ad9d3c8647f55e8a706d5201824bdda2b2a3064b4f7a91833dafb121d98753782a16f7a78205ce665d0fc75175ffacbc3f0967fe12e9d1fe07d9074d773027c4ae039709c6d0903bc021c88af3908f87afba90af80a43ac405506adb6d4fa1bee7a1bfefa1c209ee6ac3890df6e8cf56eabdde0c20e84f1a2bc2b2529c8dec6677fe3ffd7631ec7655e86cf7ce934dfb98b7fe12f0f7a0bcb61cc978be5add2d57add94aed6eb4b1b4f0f91175ffa38013362f442df883a2f6698bc17e24ede2f441d1c1a1af6db653f8386c77c0d57ebe56abd70c49dbc7374255d3c47d479f11c1107de2c9e03d3a299717dde5d17714776cf5bf211dce633ef3558ae04293e423837f21ca42c916273233772a3afcb1177f2663163c4d81af6355cf6327cf62cff9fe131307f7de63b18fef235def2a0bbbc8db3b8f972b54a57ebe56abd6c6abeb4c1f8b287c805e2071f09e02186b89377598b422565fc86a803e337441c78cf7868c3fc1f1ddc7378dbb783e7571633b455de9581f9d2c673802f7df8b2872f816eccba01be44c09737c49dbc67ccb216051b30ffc3839bffb383cbbcf3bcd77830bde73563bacde7c65229c791a050a18e11a31ceeef1f6684be589f3d2c88bed8908484848484a4c4099b0e5fd66eccbacb0b119f1dd97e7d1d52796cb68a43ac3dde7fb04f2287684468e3f53e7c281a02a6437c003da279ea620719449d17b3acdddce4f8a9218358830ce28ebb63788c92b5f334bb3b9741dcb9cef210070e1d1af6d7655fe3b3b7f17f96c7fc8d9bdfb9cce3f8ccbf709a2fddc583cee2302f57ab74b55e2e2f9a06ae96493b5f26cd579f69b4ad67822565755426eadc19f40c65ccc372f4c5d2b867849779449f08be9e6f05df8d26233d22d223223d22d223223da213cd9744ca97163a9b79fd4c26ea78f7763ec30eede2513c96c3ebe031bf02e32f2f9716174beb24163b575452ca5a39c49ed65bc49dd77e1336458dbe586f296b658de2505a6de9febf36696b3caf3c3cb9a373cf5f441dcf6411772ecb0eef2ce20a57d670db3a0f7147b64b1b1472f8d98d59e7219ee70dedbda541e7eb81c3fbd1c15f3a98e5101bb35e83a80333cbda11c8eab412002f2e3d5a4e7a982f57ab6499ac7aa852253d50243d7acc4a9ebf72789af33ddda4adb99d9726b6276ba73349f3abe20808daca5a59a3c208e9de7b71e7dda16d6f2ca78a9f3d3fec39d75eaf767354a89170760b2145a181377ba7f7dd982d1101e71e21bf79654fbb1ac216f7c044abb5b6e8de2cee3ab2830277388cefadc3dd5b87bbb77beb70f706d63a1cce18df4c45adb5d65a6bbe5ee7e3e393da9f91157c2efd529becb2aaf3f121ad36b55e878590a2d0340e8a1b74715dad66229bd62a6d8a03abc8e090ceb81302873a2170a81302873a217068db6bea1b38d43d0ae37b45b213027b88d0096dab87ba9e90a2644bd60f903472638c31beb7c3175f5acd7cb1fdecbdedac763e2a11a108adafb36ddaf5e99ec0dd8d6a417a379f9bcfcde7e673f3b9f974e677543272fb3aff7c7cc05bbe79538f8767c16be399acb62aa776d869fc25fb7bf2bb9df7811abf6987248d9fdc61a8c5d20e458d5fdc7a87a3c61fee90d4f8499be6e007f7e77519df1dae74b962b14ad824e98bf54a5a17d6aba84940e2ed1d6b93c2ed99640da93f5b536eeab04d3dc49df879b6dd15252a08410291aabd3877de0792422d9646d274224195a4542b1356f982b9ae15dd6a2f57ab6499f8bb6ecf2d0f15ad54a91214c99b2d2b74bb3d242713699e94b5a73b1a4ba23e4161d51e4fe8487b282926d5cd9e1495d536ad80c4b85db4415c516a8338fa62bd74058853edd44a6a531cc579916a2535a85ddd69a1a351d770b7a887b4b8fb48a5389a484a7ec56abd54fe2485e5647991cdf49dd13017ba666f16c8e2ac91a3cfc810d1c5d5ec50ad56abd52c5191d151eee56a952c1c0e87c399d46ab55a6da552833afa72356ba3015f12b19dbd150811a567222b89be79cf61ec14e468c51d94ceef7282f23f3f64e0e12b95cd3c890c0d334645cf6b92f7fa2d752843cbced72c3dcff5742ce5168b8989892bb6592cd68b74eeb22cc51d6f4bc1c5e71cf113a8b595d95110191aad96ca6929dbed7c6e40b894a7a1e536afc36f9e871ff1403e9ff15ece041c892fc2f3ab0409e2b01c87bd4e5c3a34f0d07173d8ebc4359a703c6b8b1d1d57eb7644b858b996ce9f52d6ec69cadd92dc2dc9dd92dc2dc9dd92dc4eed2b4e4e6468d068af95e3a18af7b9ccb79cc6e7b8cc5db7a859db16ac9c6845eb532aa9fc960123c8cd8f1f3362c4cc6c6a5ccc62666468d078272350f1edfaf1e309e675586923af59d6621e079f7902f8ec07e0322f00a7f101d8c1afd3fc0d282738f8939eebf030a11c1e86ab1478160e04389d4868b5252fff6b9bac4c28ae534a8b243f4be60790a16a7463d651622d7231d9ae1f3f70a9148c0928154ba958744a89c9dae2de804cd96c0d4de3280ea53b94699a6fe138e2957018cf43078dcf7199b7e1b31b1ef39e07f92248bcdb7d6ee453d0b831e47036a0a7959da7fb6a459246bc1057e26b4eadfd4cfca95a0642beda5b8ceb5ff8eb71dc06259ee6c0fce63e37f6754478d7464e0b26ee785b0a349f53f3386e3e87c368b98c4fe66fccbc8ec79c5c4080b8d9b9c34c9ecb01ce680a0e7b9db88cb64959963db5bc59b92878cf8d398fdb7c88d760b9256c38a01c89e439582e7762e65c662e9b9e4bd95839db0d1b392f463218181913cc4ce79f6d996c46a73c0068e8e1375f030f1d39cc7f9d00a0861e34f0d091c37c72bf4e642e97a8e3b94bc4816d7858a351de86c7ccde7399d7711a7f8387c7f81c87f134b874b8cde7f09ac7e12e7ec769dee529ffb90cdfc3738ef7f2dcc32c61309395b3c1cad1f03ec46bf6dca2f5b0dc148c72e07818d0cec36ee3184839920d481c398ee338ea571e62e389898971a153be06a7f91beee27978cde7b8cdd3e037dfc38ff822dc8807e2b5f644b8ec3d87717dc6b768bc8efbcce3f098b7e1415e0947e227e0f94b1be57f82f84910376df8bbbf3ca017f8158c526c294be8c861feebc473db120579580d262bd7a3e4d6697858108f87ddae60a4c373b8e9ef2f3f71cff997b61b447b953f97adc707c8973722be048a89020c26ea780e1371e0197f5dc6771ee33d87f19fd7da037123be083fe227e037df72179fe3415e8823f14a787e910822609e4d8dbb3ce7b45cb9f33e22842831812280d8e41fce93849ffc90993f4998de33c3f45a0cd3634c2b30dd6a5c905c88e5e2b7ebc78f1f3234fec589e999d70c5f3aff977202c3fc19dcdb27cf030e1eca104118fdef70ff2d43b7674f81d0a46c33205fe3e7e6c66e6ab83952c41d777bb7e52c31712745dcf1fcf31007e767fbeb5e2ee373f88c77398d566ecd5caf1b3093957bb9b2a971a28d9395151afedb677ce7b0af51f39f9ba05064d282e98894c9ced37db522491390c969a6dcb63efb9295636d4183877e1d8b95636d51a3e1ba99080f82c411461001a4082045785acb64e7e9be5aad3c2ba7f2ac2d4ea093c58ad16a4bacd75e61e558b9225680fc6a452489701836c6caa5fc76c9d0aefce3c70d96980d1b3654a9121b28121b3632ddafdc32aba8e3ddfb0d55f17d35568e952b92821212015b4df084490a2996205272420dc619dface0bb8efd669c0b4c9ee2b983a1a852af9275b6acc45c2d979754cae4ccab142f954aa58c71a92b753774b874a32b99fd46d4b94336dad4a5f20945a2e2f776559ed21817341777dd685fdf9317f773812ed015bae20dba41f8f59ac960523319167760b86cd853fa4265d4a327f6d78ff4c45e3e092de9897df530fa82437a62153d49ec79f41ca3657bf9a9f7d16021d2d32383f9c01a311e9b0de60524edf30eb9b517971c6dfa13eff28904954bb9b4e413892985d2f6e8559ab0ce969598163674f729355b0f118b7d5e1edf5226a52b6ee8ee4fb018459dd2dc960a7b5e3fe5ebaa21cb3a62ff16e9bcb228c1a1bb7be466718f8c6eec624192a24e892d62cfeba468857474f7be73f713c87c2231a550598cbafb178ca7603c84391d6583eef9a4cb883b4a8e3d46dc11821277b2973c2cc158064322eee4d0ddbb503a74f7ad7bc49e2556cca049de74968a697b7eacedc6accdde7cec69814c76fe393d65326d4d25fed45c6eb59a4177bfaa5ba84747262b1ebafb140dbafb929d4da9125d03cf431b74074514438f896e4ce8c660e0f2d5e8c68aaccb45335372c20dbafbd38eadb4b054afd224556a02162eed618551d8eb25001315468cd0ccb85ea187d5a9c36003208b0809e11999178cf4ee94007adcafc74038c84b8c4b56c0dca4e67f6582a4e12c4abb8555be5429935597718d229b352808c7ccbe5a3314f6bc0e037bde8d4d8c8346997e7af7fcefdd8bbbc494aab8d54c26ea648c3b6b5fdc11f7256a028983ee5edfa36b1a99e20eb8ef1116a4e9e90e5504d05d4ad5fdb7730eba4ba90aa04fddce4f4d4ef240bebd3257441d13f3128d80cca105c9b222eeb81b06237d4694591177b0974a52a992543e91dc227bbecc4b64cf1a60205bc3f2eb1897ff06cbac41a34278464695b242954a951440778fb7971fe3c6442646d4c918a78ab078b9e2f9f4d3ffd8ce9cd3510fe4db26e6cf8a93842cb11c90d56f4c8cb8a3f3ec337147c8c69e9d45dc69a1d59646707c4a5fce8bfd2526eee498f8f3adbcdfd8f598b8b2e7c540f71205b4ba71577b36ad2b914f53c2a9d8437492d7b0eea3d34e4e9ab4cab33b6781fe7928a7fd2891bc7392343b7a841e212991c6ce3750659d4931aa6e206353892a84b4de0ac69cbdcab369365f2149549b773d9c3d9c4193d33ab74e0bfd8b515b5372f2a98dd17edcf1e911ffb27fb7ba05cd1f76d3237b03d92ff592cd3608290aeda63ab2d376a84671b0d7239b4692249931beb7070b357fa1264da653f5eadd9ff5ecf52ec88305cd5a290ec55f77981ffcb6d7ed10ebfc798759e72f57272c2eeb8d48d93271c9d6a0f41301a8810e9590c01aa49b9b9294c638951223a0d3b53c140a87a299cd4ac612a9528911d0a97e513be3f71bfb219d5cce9344d4a5d5eaba49eece7aabb7ff21d19c0a54719e495bd9bbc31a5e5d9fb031ebe48d3485246d82595df759d20761ce5d87bd0ff43eb0cb7545d7e65a416f37868b5de80e5da2dcb5b94632798d7447b7fbba235b73bd7bbb6e0c9d173e307b5e973d7cad15c86a9908294aee5664761cc5e9e13dd76835310e56bb53600ffc40ef0b97a03561480ac330ecb93638664023f410e8dadc5cf226bc5d9bd96c369bcdc230831feef22c0be12984425e1370dbe68a73f1e37cbd9c73c68f7528e8bd062d096807b6c1a12990b6d210e76bc1b0d6fa992b920db6adabdbea08dac377c445a1663cc5a6b5f651f2bca28345389c1647f842904402c34f5f9b8f528ad3518a9329c5b9f614929c4e7eb19329a6c3db5104b8bfb114ee101596c40c05b6d86685c2b5b6b189a9edaeadb764a90835796d86804ef26f756d42d2d39c10ff8a4a0a8a874f92ba936dee77d8cbd5daa1d6f84bd60e4b23199a4a36f8162099e78731c618638c318669fcdf0e5de3d0d418638c3ba739e0d39cec9ddfec39f66ccd79ebb53a94c0423adb5d21a437e03c620f04ddc30e7ea0f781d70a3a034a846ddd32615bb77e2bd125736ef8a339f5666baa903d858440af33a036a05baf3f37d6893f2b0f9b1de96607dff6e57c26bd56fca136fbc538df9b71b6df1594e27c315a62cef87aeedec68f0269b67dd2063f863dbfd3cb6edd034ff03c290eb595665c023d1226e19215a4aef33a28e0d5ecc672dc9881e2e06bedc5d6f620947530359e407ab6e665fbb05e1078f4ec9a44d99a1f9be7909eb3b71cc5d694ce207c2841910f4d22893a3e30ceefc3079244fd43927ec61b668decd5b379d2cc7cf01104cef9dc4278e20e2ab4af190394915c36f53ad9a535623b47166475991e59f668d6b031eb36f6d91a99d74d7131a699cd62dcdce07c51dc5d4e7b5ac7a8d66ae57d61bef7f3aa082f7835c623bea812daec8cf9af4c4c1bc4416db4db4ba1b02d65c2e8346ac5269d4689409adf68922513c83cc36d047dd1a224955269d2446bae53296ad8a0361a536d1a4185b0b7112526e020b4069b313ca5f2bab2d6524b2a65134552426262024f9bfa97a03cd3f3ebe9f0fc7a262c4daf8dfeaef8e78d59d7ffe32c8a436eea24a792529cf10645024f24e4686ab9b4c9e463da3f50ff90a4a9248eaeafbba1e0cc3f23724039a01cd005caad6c5a05ba369bc6ac4f512b820d09db62418d2a0ac28dcd1a63a843f105a3142715829fd791447d4956d5031ca80da645d4881e3d1e612825aad4ab34b1ce98ca8aab45faa5c29eb78a0b90e41d3abb939bb0ed3b31691f492357a6495bf99b341f7178f5388ee3388ee338be78916d37fa54ba788ad59d291ebab8b890e3488ee39872be663298dda566322ceedce87c328da46719fa94bba7355888f4f4c8603e70c7786c369817909473dad0a73ff1fc2b37205c5014f6f4b9b1944b4ba8d23a87888ab4482942055191d1d116581ee7720d07e53f31f76985a3c04238080be5d0f97fbf1e0745a1828ddcd38eceef4f8061a12c5ebb7bf1d48b6924472c832171a164d0f95ba7929ce2724a7149a1e1c443e75fed93c92a7fcaa487ce5fb23b96c6c10d3a675b0f117b3a61cf0b840bcab753e6c93e2d2c2e9a99a06c0bcab6a2a000e8fca7bdf219e8967d2e0f8ea288919e1bb3e1a06c135faffca6dc69182c3f592474a75f9e48ff454a3bf6d9888d1129738f3d6ff62931522453913b30db724f269279b22d87eedf73b6659e4c24fb9c720f0e6a427ebd558f83ec898570113c74c251602378080b1d50e1eef283fba4830134eadd4db2ca490507ddf374bf41947e361bbbfef98aa8936dd9a60233f98cb863f4ec32a4af883be75992cab603948fa3c83c560807659e6ccb3d7846e68ce998014e263231388ad87dfd4f8ac7b24fbee527ec79cb1467752a2b1e9ee7494292242b2ad9766d7050b605651b0eca362c9492dfb61ca0734980c6519cb0100ec2413ffcf0832a55f2038ae4871f48378d9824c77cdbd7451d92b20d13655cb5793fc0e2a8daf290696fa081a5c29eba5e00031948e2870516f0030d0821866040037890c0902022a000083cc0013bb3ddb9043ec523f0330e8197f1073c0d77c0d37803de8533e06b7c88b77121fec6692fc317f030bc66e08ff08a8137c2eb05bed6927824fcc707f13ac402ae201400c40fd96d70b942acb31675fed947eafcb3afd382a4f94ac73c027ce60fe0b3f7c165be07a7f106707fba67bce736efc36b3e0105701915a880c3f82102013ec8f6cd77ee2301157856ae76001f78ecd953803534c7385f931cf1fd3eefd2933af62a04b6d7ac1fc6b42b5dc718d38052eaed6b8e5090d56928f69341185651c7052c18814824a4806253114af1c40eb51892bef1c78ab105630b5840525baba8c2c62e4dc826a2a72621f9be13ae16e74eb3f6ad413f3513e18c8855c89e1f8b5502410ff569cffb4829d289ea138eb6f109518f2b50c1980293a988c924b4494092a07aec598b28ceb8af97844a42a3533a9a845445379baa22d49049dc596dd5ed66d2230a5043b6a68e2720d1a313644a6bbd8fca37e20137d510c54195c252580a4b612944f554d6571b6922d65a49eaa4c71294845420c8030e443e7cb859d89afc05a025d660e27d316e6ae49f41ccc1fa9cb505c54179586677957bd94d3ca532571ebaaee4cac4a4f64cd5b02b94ab7c9a837a5dfc12dd9e97f512cf0ff5a15ea3092a89fa3ecff3462748cf437d2e945faf46950a58e888e298f8fd3e92a4b47393aa5b09486acf94674a5f52a687aa0245843251437a240149f252d451798b75f7f56a746d4abfa8211135245e470d5d9b1898f8751491ad49f975d4115bb3f2eba8a26bc34a7dddaf1ca4d2d3f395a823efd49becf0ead4afb6aacc3af5a95d32d220c072893abed4a376f8e9d493ec10d4a93fed90a4536fda61a8534fee50ebd48f3b2c957658d2a9177738ead4eb1d923af5e10e4d3af5a41d9268d6d39c54ea3f6f87253af5dd0e533af579872a9d7abcc3954efddda1894ebddd618c49c92aa5dc3b627f1dca3b944943c2e42d3d3d371175e05de2218b625b42790dbbfad4b32c7df1dc44d429f1106b556bb3de54c4c6aeb3449d95691a47602a51ae7aba535f6e2a0445573776bd042592aed70b06f3d389e520c81a4790f2aa54c9a348fe51fe094199d423a1fb6422c792a8c323fb6251e7ab557574b2811a5652565b324b17f3ce6f0cc10a09d4f82429a5faf3d5392361a6d3c985a246b4ae1182d36737ab13ec657218f619cd47712157a3cfbdf7c4c1f3130244893240895a28b9e5de7bef4a0464f5ab415fd15c1a1c821b4b9d7cb1b21c3721b891d1811ade7c6acf8dd12bdbb47bef6d02c6be6c1aa594ae562449fbaa49bbb4ea42ddbfd29796ccd2c5bc9e9ef3eb592181a20e75da040854f448244553944da394527db269f7de5b792a8ff54073e540e489f1d716601f3d00337db653d08be4745d9b76efbd2824724f26b9ad4dbbf75e4a6989bef7de9b52e9b1898c44eec92b9649c92a29a5d4a575ee2171e913ec6572980fe9fa3a7df9c068bec63da4cf2e99b6f1033de2891e39e069143d3691a202822b2708c69cd45a6badb5ee5a88102209618024b4a9b3340182b9458f4d6424724fc6d8458f4d90d56f55ebd71eda1ce0400bc8ea383c9356795a2810c40e7a053d6f8873df9bb1bda307b4c61863330a283675ad33ee4aa58e8e001bb7a967a07d615e64303324724f96e97bef4c06f3e2d2c2123b57602fd72cc617425a6e1aa5945e16a5d6e4c377b569f7de4b559b4629a55d4e795d89871a3950af900d34e706dd180f09d875a79064d2a1c6b7db26454d8e2591fc3aa04d8156a56e6442c43e7aec4048e909bc1f0ddfea99863ffd55ead72be6004984acaa23ba0b74a915694feaf866a7dd7b6fbe7956e9b10364f51b524a7b36f58b31c678155e9649b96aa95ca9d7674b602827f993693a2151c694928ab8a2cf304662015b3e17efa583c9323cbb3156668655c25e8990b8a42c5bb3572264ddb4efa3d7a4fdb0b149edc901b23abef96399d89255ef6d692a529396c4d0c5edeb230f59fd0e7171d42b8fbd356cc5a408298af5b0fa1037df8fbb759c9e98e203fb3afe216e7e5417cab7d382ed0382167af41503890be013c8b3a2e8b5a27493bd62216cac37c618637c23c5e73d0a08474c642168d3c82f07459b76ee31c8800a42225082084c7044fb3021851447a8420e2ea0ba422d0c576461892664c184910218e0411559d881179ec8a14e81283285529123e3c9a6402832848ab55626b4b0000f186c30842ae4d0c8bdb235f78a4dbd866b8373708e1028be808422b62d8e88c00515920a25010a3f4dcc8088065eb0841cda6a7777092c4842ee7681dc1886723a7355738f6cdacdbe45380214527c210550a4c09d8002161839c1a8033eb04ebf4d0122bbeeda55ecf3835b786bf57ab920050e58b0efddf7de6bda14083e38b2692847021d7aa27bb7d021c97a9550472237099b3261fbb0eb0e3db2aba863b3e92cea1c197531ac0dcd29ea72cd99da7c4f4ad56bd891e2c848dacc44dd18a14219a0625ba7c15f770cdc0da1b5b405724658da42490b6458ea0213dfe7ee7d5dd775b5d65a6bbeefeb6e288edd9ef310c40b6af3dd98e79e53e17ad72b4237b3a7079a2e5b20691fcd657bfeddef2349f0dbdef755bf89d1612faba062cf6d687e39eab5b57a35bc4b897675eb41b0356025738831b6b8f3eb4a741887d8c352fe4007b57b38545bf51182e48961e89e07bad6a04822b9478e2e66ecd6148a6e124bf488489a3f2cc93d330ceb067aecd17645b036bbb55714b38bd6452b661ab98524a1040ed526569faee27bed15b3288a261690b41f3787a6e8acec344bfb3a935637e9764e769f772553047d7cf3c7dda149134202bfce338540690f88e2b0242489ce4938545be7249fda55b0e2ae23794eab3cdabb5a852451bd44721caaad23919c069d84a894eb1b8a7a52a1991100001000006317000020100a868382599824511805ef011400126592684a449e88a3b14892c22808a23006820c21c6100294318019848aea0495716458d7ecb8bb41ac18496ae668830a5c566ce3ce36face3dc21df0770159bedefb328408df92d8e3e67c2f1c70b8c6f83204b6f402abe67a020d9a8ccaed4c08c61b6cff73d0fb242a503b0e6e42cc711966b5341d92ab8a25c1c9d167aa97bb9dc6f595f9d0550dba777b42235ffaaffb080e567405a6ef4a7be16547aafbb3fa91a1f5480e68f7be2d7d9c179a8d376d29af85bd49a0de3cdad72ef2b7d4a8a8e4bd7c8b86284d2fa6ab4937b5eb11c3efcdb844df8a8136012abe908c492b101045b1dd11009b6d5cdddc561462c9a6db43df759706a7053a2def411c8e7576f40b9a6a13ff9d54f64f3dfb3e51ff06a5da2a8dd6940b66bfed425bc96debc4d322aa2782d9dbb47e1bbc61d4aab3a3d82c71fad788c95d7b4b97f039889270bd95c4a6e13ad5380c281414819d6483a125e3f71d1288e67038fd40cb6ee757800c093d00649b5f2b9963f9e238950b9070d739c01792fd967b2802061eb55f33a2ad84704b0ce81ad5350af45ca9c6d16417ba5419d2f85ab8b73953c3f5140895bf703dbcce5c7e6e02e9d372e1fa8df1ac78de1730715dfa1c82e5a9cb3227c18c2aa38c1f5f81352805bbc702d2d0d9cbd34b2253d62646a5af9328eed7f2af941a5ab8d45679dd21a9cbc5a9afab35648b4f7f5163fb808201b3cd42d67ec5a6899ceadb53736d196567d54301c1586043c9c8de0e377a2758e6ee6f187bcd0679578a19e4a82ad0549a39ee822c0fc9ff5369c035bbd2deb4d0e959461709cf3b3a989a1789cbc6ff2ec1c25d67aed18521cc03db3b5db949c7918ead367000f218ff5a47e9e9add2a8b6cb28bb695140f693c4c2100cdcc5c1e55047438e57ad3eeeef8e2bed754ade34e17a1c19f09b43cb21f5f64a3aee9f9e17c548ce7ecd12510d29c1de638533ab0ff4dc475683004584c0f56cb8ad46f0e825039299be13eb5fed6b3e9d98118092a25ebc3d6e32cc7280fee2d3209a83985edf5ec51c548210fa92558171f3a7e72468e76ea786ef76cc90f964e18db7d99c8c4b5a5ff5b5d72093ef815fa39255ca3ed91cfe72e464b7db066b945d26cebed2a1b005359fbb27fba7be31c454753c78678dca23b39118b4be72c61b1136a65ea0e06f9a0888533fd81cb66b045ef981546475cd1b5fedf94405ed015770f6cab32f193e50c9d526ffef341555450b31d82af7d14034e71ad9ce39ef22125e484140fad04dd694e9acc8bbda6e31ce867e6d1ab219e93bf5de2e41af0dc423f37b3393fa4daca45883eb200548b576e484d96c3aa8ea1936e2eac519129f39b63ac85c1c0366d2c58840fce5dc16520a359a0ad4b75adbb1bc591af5f26d765449bfd27ef707925e2a4ba80bd99ca7635cfaded2385617ddcbd9b864f057cc4c23ccfea197d28b691a646219ca94d0578bbe2e02e546c03b783a04fee2318b9802cc5ad42ded7281b27cc779e4d1d844c54f02f5414cb3c530fe423285ccba7995d8d0182c72bbfa73fefbc4ad143b5ad3b956a616b9768b1e9835852b54c26a132df8c57a4c7b6f223885faccab6f0448a2040c331ab95b5cf83c498a6272c3fa01afdeda350561e407cd5b5f60026f3a7543f4ee78abd7d5f7d72ea85cb13e92670ea78c025c2c4c3a6bc9c04c49485e92d86979c47fac63b9533ace19c66cf71c01d1bf16b8d7c22cd2757c34997e213d1103b37e8e143c36febf06e70ff7fc49f8e629ed9836b1f317c98680e5d16af8ca8900dd4922818e9ee0862017cbd2f3452f3f57807ea69e0dcd288573bb45eff9b54bb28804e678cbd13c7fe0884846646d209bcf407f7e3d70c39439aa20786a37232204435f5f40e80c6b762381057fbe26b897239a1301d0552b447bf45a376e40ea054cba6302e89e7abb51b66465366164ed050d28bfaf9aaa84880d375d1cf359f9c47a8e3f68ee422e290543c9ef40efa1b12c8ea00c152946dc16f6bdc899b8b6e777413c08310f2771b9008b2210f4e47960eba5fa57c576894ade0fea50057eb5716d54fabb93daf9c902bbcbc85b864aa542e3514ddd3c1c22f5c5f0c4360372b7a3f9852094376099765f6c5a8ab652cd8fcfa73af63fdcdc227c287b66dd696dd5dc96a99e8f0b0d9b839d216dbee76f565efa8ed23f79f302eebdda0771b7909c9bd79e30563255ad1d207d1be8bc958626681d7dc34f8a4460b1f337436c1949560ac377f87cce950438064ed149f0fa3f4f53c49d1a42e5358cb789015411df76fd9a4178bae1cccd28f48d7978239f60d2fd29a4dde0844a9fc8fedb6a19a52a1f1eba0a45dcc98819abaf88e089402eec6bc4aa94e38e6b049c37e01bf39b88f23aa96b3cd371f0c3eef24e73306af0f637b349d85822abb394a6c7173e2d6b2a65c14e1fcba83670756ad4698eab9740dff650b2cad0ff75b0d2f1002a3ef79bd5b9e36865a260dcd5fd2b4efa4af77fe858564884fbae83b6211f0186c3d53e9807cd4010b19546a0ca1057c95677254212e6a03185819c4061a66f006686e16b23a4f4028dbe0be4e09621ec18d8097260c22cc8245ac3540d37d10256009d3854ad92dc702c8e2c6ed3738128e16d12807d7164f051aa6076e48cdf1d0cb0056504974858dc984788c05be8f76bf76493d85104a566151e2e49ec42a8f9c22b07aa8515d51738763c6794dfb9eecda4d09eb724c33986fa21576e88fb914fa98cabd05425a85c3cddc7e5860256434def589c0823e4d0d2b2c5f206333cdc3a3166a85397a6976f1821e69f30f262eb7ba417bb68851e07aea7d9edfad5653b7bfae67ddd261382b8907334f642a9c9cb52642a717cb43d57969f25be8098b48ed080317c57e4da1b6861da034eb64de353e28176d3f8ae3182a5c90316654a14f1d0ee6f3e9fe26e942c987424ae647c9ab7cc7b612d3ca02a268754728a970f1715fbd0420fb10da9d644e6a2457a53273adcafd9de2e159af5b6c715c739a1c02719aa1a10a2101661ad01e210701fdc5a75e96236d94fe07588e4a386e1852766a063c63d688a6d60211e93311dae64db1434daff7e0887059f0d810a5608780f8f9e4bf7173123f67e8a2fab7c00c8d748e634e9dc44a37300566e40e8579ca812234232ec0989040224fa4d81fbec3c84fba57a63920832934734510d4685fe0db4653ec44907e03d0cce8bcc2a6fa694a763b455ef3499e3383c8c6953695e94c7842e4a6257b6f93f37c36a130388defafe20609d36dfd14fce2f854e51bd01d494b56167a3137f9671f087b942cf3353c441f9b72bfc03b849c5e884f9c5d2744c5ccc43006baa50709263fef4f687021b456733cfbae4b5652dd39d47d8e9b47a0101bc1bbc0d5ec01da33fc337a86a6c8b54d036bfec94bdbf2e4f1003a70f7d3ad25f15428a0382061387ddd43dbea4eaae77b5f2935a2f65b00d6074a4094080e5c0122fa9e0a8c073ed092e9f314b3be6b7da8565c22023616e171edc13bec4cb20fc47adf14b6983fe506134429013d9c6936e6219bc36cb6bc50254dd6231e2eeaaef5125e2418c1a0c3d1e2d2dba4c3fa042c4f59831a23e65242fcd4be3534ed1df9ee6248e24c848e9c9127b457ced872c5c1a2de140af660e1a5cc11a4b653f0acc40d442fef94a84ff9bde1976dc719277a42a99939ea2412198ca7fd3461135f895caaa5f4ea6a996f273415b15df993549d459b67e6178eee298d9cc5461de8d32b17e042bbe643c341d95766e3793abca21f92c1a37b1e7820b0c23488a176a477f4ab8e27d3f93fadc0a3e1a7f52ac97c822b794789860f9f3fbe50097d4c88c9aacf7373a3eb262656c012e28518b5311037ccbc1b52b62d4cd7fea692ecf320a722455024a47152f187e98e04cfae8ed958ab01d680698a77c5c19b6dd60fb7a7314af952ed9641e0765826b0397ceb0a25c38886a94a5423b71bbcf24411e5c5c0ea7126d0c945dc13da3b3942f424eeaadd2de1e5c2b748a56dc425627c2854cd4cb43748111f5f32c5e60a27e3c4817d9c80f2fe11243d4cb53bc8489fa3c1614dc13882114ae0f497ba694844c1fe50e23ce5b819070bf1445c1cabc4e461146e9274d0806605ee052c1e50e86cc9b4a88abd19b8f6300b137e7d240ba6e3f31754473b0b230c5dc60d009d40c84599b0b0487a16d1fb1771fae76ba87c0da8daae9bd0d4051031407d5e8bfc529b9e6f7a3ca4b119b610411af1bd292b8959e256f4f1de16d051bf6128be7233e9a48f8a687fbddbc50d684d44e49ef218be2bff9b21099a4dd29679c0cb3206dc33ef2db17bab6d538c80f8384d7decb61641734f2e110eaeb0118519fe644003183fc44ce440e25033dce91fa627aeb3449c4501379403b7bb3608c10dac682f96adc2577bb616fa917f8a4e7bb63ba563e9ba95d244b91517ea5d0dcd814235a3a73848dfa05444d0f1ba9e50dce6cb04355c7288aa90d3a0d53467c582376351e0c0094695480dec02361f16231f8050d8e3c0cb60bdf800c80a0e6db734ff40598c342004d72d46aa004714f5b8d51c0f2ed0614c25bc4a56d014bee393a2457698018052d069281ba44e9d811d81a7b1a8d208881ca4dd0a1a1c0490249afea71564eeb513cd860921f7508c8ccb020a871ce97671af001053409388a09568403a2c9e31cdb437a11ffcd6caefd04037b79aa6e344d8e3b86e803f61feb8da21bd2e7d2ef66f80eb6bb9edf6be239af6a00d412282de5ca1e8bb1788b8eae5ba589f65824686ac88cea9e9b206730356e88e6bfc502736e528a44c8aab60976fe375950e0f9bc9cb4158ef8ae41368d09fcc52f9cf566c9128619af5dce5d7ce8eafc8ad36060cb73b3e6b283b9ae27b4cb351bdc702b54c14db51dd8f41c0309dedcf67886857bc32a5cb3d91d71219388c25a31c3a2326c2f47a0cc0b2549d8d94f25946cb8267abad911cf929e1ec6d1208f0ab933c4f37beee774745557e5873022f4aee53ceadce754478027f72120f4cf2a95ad53da8f3aea5db0e911db52a4d0621bb73944d0690a1875d440fe6692ed8f2a5207de4cab755f79a65cc0a8026091e07411e98bae30896db2a903f9e053ae9555a8e9b5841dd740e20f40442a7814b07fa29c46a6487bacdc30aca6c65a0c5c5bd1338186f0b960f112850ce62262789bf49b1b965a6d6e2d712dab185c80a5cefe3cb76d7e3ad15ee70794b35dd828abdc2a853bf332f672730ee58613dddf5ed472609c61f0dd2b396bd907c0a55c1187abfa207fb9615a1193bfc4abfa7f903c57d57580f81b937c08e925780e6b010d8879c5727e96cb23dde3aa9f11d5cd8f297100466f7a3b64c9a05802d32b961068b8699e645dd717a9156f33ab8ca4f592223b30a513fe4e319e522a564a3c16ee6299709d88c0eace33e78738b3b376e0f712c4277655ae091d7d730b3ed78ab11eabc614b72c5c4f7074d03e9e9184bd11e4ea02cbf3a42e1da26ad3f1f69cc466cbe2631d0de70d24749f88d51c4fcc1bdc2f9d9f2ecb11ddf6435fdf3063c370b9db87ee9d4a75059122f7084043d390d7b2936ec1841bf7799dcf66f33400e3930b402a8f23cd777df6aed19d11736ad8bf0cedeb143e6eed34edcb8551271f6db4bd3ec57aef999f8d00048ad6fa9cb034a6b2ff4006282235b57fe89d2e08a37b611e78d994714552c364f6f3f8e5258a675fa4fa52cfae794fa6acd971e8ba8f488a0df4acf87c02764eca4b5a96f003c592083f8971ace06de5e6f0161e004d074d36ac56da7c88f12f3732bae92062effbbb736d7b8a266da30cdef3f07080269c2c7465e55d99a646e0dec9146e9577f572af467085af014af8119c0092edc77828e78075748d44f946967775bfe30a43b2592940b9ec427375e31e44860bd78fdad159805146996b8005d47e9014f199477e92c104cdf0b26601d263467aed865707037a8d881c4430f1a80d7e38943f96690a2fa669748e3fcebfae9d39e972fdedb96473edd827b90d6b9babd03021a1d61fe1553911717829fbc2e43f8e90fa5a2f078782d7355b432d8b95d47719d8dcd6317e7f22a7f50f5d0b90b604b43f63a416dbd3d19d8bd328c70122e69ed800b3ec0524c3dc59a5cdf8bd46a7e4fd468f78561bf6ef9646570099472f4a14650ee64dd2ab92c8c2ca5652c57589c46dde4ac62be1482cd720665e6c5946f336e12b00cc6756811d4df9b914495f6cc69d73e95ab9378b55fbe015f00b2e7ea1cdb879aeb939ad30a34a3ff7b19bb0e98da82dab5ab7088261d637cb0d01d603afb7a5e42efcf220c64fe0372bb0c8248f953c24915932690e303d5f5b04bfcb324f9b0441193b9fcf5d52b9f22272235bba35abb65fb31a16cbc488b21ac0a56cfd1b99c4e6fd4e03f29c58b5be158a4ddbb2b059c41a5731c353c44ff8660fcc91553b6b015d4c67f000d95c48ae12c65c508447c993a948a4afa4d6f365393694f767434d6124a93b9787581bba1a08bcf87441a7d7a1558f7e8b09e2c4a7cbb170dfbab6ff350025267c8d8e41bfc516cf3830af14b4b405dda3b62333e9d6239a62886f2b3ba0fa2dae4f8ba614f1aa4939ea11d11509445178b82e85b2c3e2b8383d6feedcde10262ce4f8bac8198b25cb5e8305cca32a57c07ca646b35b05cc3516af79cc63651242ebae8ceb5d9449e530d5e1abe6b5420d152c714c9f807e7640aacfc3d862cfbd569f21c318c26e08e603d9a581e3ac97726378d2fc2b4f95b7c155e597f80da18d79e597c47ff47772b84a1d8c03a2af3dd0b657a44ac531d02ee9e3805bd71ea0d7284024205880e90fcacf370330b218c8e12a7c23aefa4ea7831171ebab8a6da8437147a6564cae823fa1da0e16840c3181f5eafa8ba1d2c99452717c5f12d2476cb7a890e755bd33dee8092bdf9191df09b998d30d66d0a214ad13df6b82131f349004afaed66949c76ef2ea4098e4e4f113968fcc712e87646dcdbc30e343ee18382f480bb6a065928cb1ca71516ca79cdea1d3977076cfd495d22224214ee4932fa7516dac89303a9da5382f82b9cef6713dcde915048f904bfc0304380da8657ef8e117b6a7cf09e44a286e6922eb57a6f05267a294029d78ad4c040543a721c6443fb21cd2214c64d534910434264afc02f884a593f22ee33f779348586e518de776c915cce9a56c353ff0d40f23b6ee5cdf886336755a317a9c66abe3a27446d82cf7ebdcce0ee871c9705a3fc57e532052d62fc43404a5e7e5c5295cf93151fb84e92c0bab38e5543f7a295090ea53ceef0b944178328b1ee5365917f82126244391701d7641b22d0481f51c42546d3bd7e73d7c46eecea1414d3f0063821ef3c54766706e9eab0d67577703f50c97ac1cca1146845cf22455b295fe74014211f97ba1f08dc51f0fdabdef50b39603ebacc47f1761635600d1dbde0566d93ee8300e284f654a95483463bb5219ecdc3a55967ba8b8504dd8e254c9efdfb07e313963255a586c21c53fd5852d04a2f4ac9008d7ef87988a512a3c0594602c85ffd252946f3067a895424d362650a02b5f7018b63293d01a914eb50217a382818c9af0234403d03781886fc00ba5f73ebf9a8ebb7d8c9754eb7650f60ebbbe65fff426c05ca24b504aa18934d2b408113b1b6856c807443c38505f9c0748eab8e43d8428a6038c01d65077e0987a6b097346b9da1684b4e0aafa28f7b96a2d3ce9a2d6d502ce2c6b32f3a96d3ace008b3eeca23d34fb2a3791a8b2c4d691efe6ece608546848a407e113300b0a8c9daa8170cf06102d0bc90abbad75cb2e45c2ded4cce00fc11e7426e4df7f089166effc855fe50063c9dadf0515c502dbc1c6e41feb1c999e62d1c440f293ac1fc2a0daed842f114e0d1b69e05dbde038d93c0fbe38979cf560a0b2f752471633a0acff2181a0da3cbb8508b88b4d8275a2de6f4be5191a69e76cd51df7b49b00d15d71fb47b28380c9011649a4225e8cbc7a84bc97eeff499e2f30db11e47784e835cc1da3968f1a2889eb9e709c5c8b672b549233c93ccf9ab254e7b95e12a2f42b89a0eaeb838d86d60d2bbf1e2cdd68fb906a35317d10dc71450a24c27cd00c01c36cdaf47537b7be2c64b1787f72c90044bf7e54e5f70806500dc1aa424d06ef26a26100af5a99c9347172dafe468a167ebf971deab491385fb86724f40e255c91d42f115182cc45818ed8e400f0e52433f63be7df496de5c6e633b8bfa7f251813e09b523c03ca13427744bd92ff450833dcd212c4a7e18b0a1a8186d4f3f2522a874b146fd7f0383cc085e258bc9b01a5e792b550e98d586acc68d1c446e11b452ecae2702626873a13769761014890fe13ef799d4544f54f281ca9e70f1697137f08f6f36374462a80943b956b9eeb4d368ca8c50412ed4cbe91f02d5182f4e5834d9e99d26e6f5ae4760219f5f919ec754f52f54aa554dabb80a2d05dc802553eff44bd2b066920c9702f68073e317ebf404491d441f4773c51f086a7c74c71c238628ed22f9b244506d56c5a7cc1900ee48d3ad7422ff6325b8aa356fa3b4bd0dc770bdfe1ad2f043f4d22c314da0631328389079aa7a6bdf1434807cd2ff27e45a84c9103e05a313ed01a782916df129ac0cdc09d6afb1b68f1da0934a60807c2f7e3490e9a280b2f84320fe0f9019a14ceb6e89f70a5b2e7cff6b0a8230ad2000d277f7fb009b4a389092d67571fc7a643154df3eb72e9ed8546acf34ebbf66e2595200a1391c9f4533110713ab1dc636d5fd0fdebadf70580d48d81e0846cae2e815c2ce417caed2a98eb2c7ce579f2dbb12a8657348cce6c03fe0535bda1cdeb5398885c333b53b9328e0b7a15762e3930729b6cc504ad5861145af2407fd3da84005e81d2edbce1bf740471eaafd031f20fd98207330fb11dd2cb39781ae545ad07c856f0ca7f72fab5e01d3e845155318f5b0f5232a0c241f80b37b5a0f2f2a88e83d6aeae3c3b59d9c35029ab42a01e0e06ff6b19c4d231ca1891b8aaf9c26f83cf875d773f33127b68144df20a3485e82575716b9b9c9132c8e6e1cc65040526345c8e462c028af53e60bf7e7e2d94129e0ce0ee5cbd48d6e1eaa0b7627f9fea32004da3244bd8c18bd36db99b3f130c897d951be44a29a7e17e8325ea6b7877eaaca3388d10eb80c922cc414b2e00c46ad9875bbdd6cac315e783e3e733ff3709013758507f72db5d5ebb2207d9f983c4defaa8f97fc9f51e3c9954312068c1b0c97592c2832680ad8b1da2f525e96794b83831f7f2cb513541e8f73d2a29bcf8e9a96cb0c324add24cc5c3d68f46f5a8e95e475623409398ad07c34149dd2930f46107ee04afbebe6021f0eb132ee26b25ea3f007519ceb3bfade4aacf05613a4ee4deb5445601cffa08c343a81c40781333bd625ae83d02a526f7c707df990989d8ea58dcbb1804be485401603135673fc0995cb9ea17952e7fbae8009beeebbbc6ca8a8f883d4cb4fa7b15dd7bb591eaba97ab68101c500f286f18268f0f89d5da41c3d1b740cec48901a53485d0d5ec1cd2e1a22143ed5ff53fe64aec677e04ad6c46ec790cf1e833d5b2aba184eefb91d908e9e26c16e760c829a6fba0f54b903ba26f36824d74201694cedd93777393a14080ded9499126f4c4e68445f516e851d3fdbb5f75a21803d0db840b08e8381f8be0994c4e8c48bbb41d822ea176a943283b81b744495edc6640a7621e4679314b5478cbfb7276a126c02e6a7edcda1e649c3f81cd828c86023a7da2cdd5d1f29a0f66bef9fee8691b490cf607c5d43e62a8d22009651cbe17f7a37b9f22514eefaa204e5b8cbad54a6dad9b0f0ad7fb8cbe67fea0cd7ba89783947f80141d8190b8a29d0f5d125ee998243d13f8a05f4fd0e159248d3b67043305ab060a2487f3c14b1cf83461085225b0391d6e8dea8cd354bef35750574993712e4934668e073eabb41203568e414c6ba84125d3fea368db985647b847ccc7f2bd7b03ce33ecefd74aa14a9ecb040d8f73fb41f8450c6b1fd6a20e6e1075ea54a4ac6a514af768f15bfb8468fcb2a51e6d68500913dfee0e9614036590290c987ef36cdf57246c143d326725b9af2dc5f971e86d40400169a09e71c9fdcbc171de7676898952855eb288ad5087507f24106bcf236bbeeb0b02826dff5421f65f68a65efd0952a49168080b502c199a8ad8b1faf10d54dda229cc221bf4c86bacd072f21368443c7526343a0cb3e60aaf8f95c60d752f093b546107cacaa8953954d3d4e2d238ecc4237aae3be2c39c87176b6399011a9283b11704353ac8fe74c4415be016391d5ca0f57548bbaea9f1b61490d89fc01ef87efeeeef93b4e869a7afb43fee892ab1b182ed9652f6ef777cfff09536e62030796330eb50c10b1242d26624f651d5e1f9202094ef09cffabb5f69f4e518449817c35109ef33e5d82359cdd4fd1325cbaad8f924007601ebcccda32d82b1d7b15ae62428dd20a70433740c2e07407d8293134ee904823bc0b1c8528109b28eb9fb9a2d5099e2abdeaacac73181bce7da09c3c4d78358e9afca648695168a25aacd695225db9d99eebce08649807920b6f6769a0fccbbeb658b1961604d18003acdb746f967d701fe3b660a66d7fba63471477a5a447c64b419182a5fe0292a5c3a5304a2418ddc1cfae8cf2a00790afcbbb2a421d3559006fbf4582ebe5a61213da07313cfac361efa8bd80e3e7b002fb0cec3dc57e4b75cc4b9c889222bfab6eb00a3def1c83ece3c73f0a2c0f6437b59c411a9550eb1e370bc11c92650041b1e48fbdaf180e583accf205edf8c9ae2533cdeae1c97e5a181deef5332764669c1bdfd37214363f49e0e34a29209b4206fe69e628d42a24d66ce3133b4148ff83f10471860e9a88e6a34364dcbc69b6d43477ec5681ab1a373bc369094814b6ef6073da023c18ba63e60595b6f1835c5e0159ee4801e69739c0b497e44337168ae2fdcff46278e04e19eba9ae9134c457a7483f159b404a10bf7881bef02321bb2dd139ee6dfc769172faa45de0c0eb9c5304fa2865c1dfd85e2752d9e93043fdc3f9c2709083fdfb920453e56f3e0e2b5c404caa427f6b62bf252ab2389e71c1f002e962c5d6593dc5850c232e452f082e34729a6112f62d4b3e327bd0cdf3433096119689136677b0ad1df65214f8b5cb411eece6510823c4be5c8ea5feb06faa3f5b7dc9745bc495aea2d989032637ea5902f07cbcd4754a9571330ab4e9763b544506ddb03141f5611599604aaa68758e05116a957c3fd81fbc9d099a32a59c0baf28c2ca6415230156b17bfcb461afec0720ea20bfc40ee46e24cf7545120866052954d307035089138d6db5a3ea0983309aeaa059610b2e48fcf0ba7f75b3c21dc966cfb52e310ea93dfde17d15e30a4c36fe21fe80427d5624b7cdfec10b890f8986400ff5123ca894c695af5e606d16ecf80877ba1301bd5c007cfb55482b2e041eef0105e11aef203c056b5cd9f2af6456bc7983c805d5e25aecd7ff37127c66228131eed1926d19f3fb567ba9f101f51de0de6eeced46ef1e3a1b667dcfc51f0e2fca48fffa592fae0705fa38c37a3dd12fc4d494124bb61d17745162d04355a6165e1ccaf98876504d91503f52d69837aa01141b07ef1f5b8f3ef64385e880f8314e2707db03d7b5bfeeafc25e1444cd80b272082172ec1d538766a776563aeb353fa0c304ba868e50c89a7fc0430c5a434750c87e2e1d28eb0b7861b562860e3589fca5e28276c256e5c031c4b63c869b1467c2a583500b01b5b1f224d6152ffb93cb136b17a18842fd22794fcdbc3d4f9ac74e87f25c0a3553071f0f3941183a2be429e596eca01cbbdbd4017baac12e5d574ec1d18cb43e0a3f481c14dcd4c148a07336782dac1771bd7558cf503581366904eeaa35db40fea0e2b2ce4fd0b14318f399289318d40ea2d497c5c155408002395c034ad51a1ca8dc3e6036b583ff250b3f04ea88f8e582e1c5913e76cadb784453857a30f95500b903f6d69384e5b3badbaa31abc81df0f100078d2d97535d72870086125c881a1c56f58090acbb2cbd83047adc7f228cb906f50e38c675772e7ec05564bd03afec600a8760f59b4df1f2e202466f5f9d6e94f3c84a747002812c2af180a3e121f71c95dcb4b4e316c1bde2a1f6e39e810ea9ba17c840003e281c9eb33433c325c70db23bb5feafa72c9d7aaee261cfbb24696dae8224083f301e36d83ab3e2254b09b7e4c19934cbb5932f2c9c41ea6746684e2b6f9dbc1d8451929bb4b5b231a27d88637f030a9fa6a58ace2b8ffd5e45691e60d12f5b7add56ec42c2dcb077ee54951e6f08749948cdc304c865a8bead045eb83d7d41686fa3a1b728ec781e6c9e1b4323093a3e00d5d11f2fa7c32ae5440f369fb551016ffd13d03f9e7cb19f01e3f403cb0410b68921eb91a829982dfb644197b6d7f490189432beb0654a323d3cd5e00d062cadba4ba8a04ee50bae965a5daed582917f61c945f7eecfc5391fcd0e85ebe651dd63db72332604db17e1cc794dce1200cfff72d559f5f05000d38a572a48e64ed04e1731f3c4f5c06ed523792d88a979025303c1a9afae0f5bd08f071c23b804df846e637b48b75ed768920486ce22645ce92dc204cd0d0bb939954acc21375d1bfcba07a91af317991576d09c6c740f8f42f78720a351323fd8bcf1a25d1a6c0a444752431d3b70e2b450703a7e7782c7c223eb7f71bdcfac4e94a9d16aa837bae2b5e51083e161dea16a2cb2de22fec84248b79e0c0860a1179734d992ec9a475d1bb368796e6a09849ac3681a4c14fe523196959af8d7f1c787b9dbdc73cd6161b1ea4a7906cca2735bf5e02b8529b60ec7fc4dd776300dcf9886c7c05fbbbc395b0e9f7feec5836570189082c359a738a751c6ae4820e85b85786be2eee19050ef3984f9b943d45c3d2353696307c74e768156d110f84b001bfb3d07efee2ecd496168cb7e0cf101d69ad9acaab25a8c961d74a018d226ad860172327deeef45ff13624da953c5c89e63cff1429a344ba2cf0d387236303c6e0e613d45dfe2dcad4d23d437a431e8f0b4006d93d6a5af9c0098f4114935035bd9dec8508f38c19eb5042a0cec666d5c07f8968f8548b67cd273b28da08a6e62db260dbdbcdd00bbd9f3ed82abfbef828f252b26c3d6badad0831f0461e59a6bb7b8c92506c697650ee2a5e03584547221afb1653c2b1a1f2924706c8267d72b2735f63b2a317ed9dde1ad04504cf43caca40aee9fc449db7484eef3b186fb71df238f7e180720ac096ec3ff3540ac4778bb29ef15826d5c599c048683ab2618a26f144562c4fc86438a6415566067859d81fdbd3fdca0a47db487c68ab60da0c074d41e08c89137c84e2aa9645077ba37dff0d233a8296dfd7516958a583b9d5b78206b334372af74f7f9e00973e89b97e2eac055eb8ed1e025b4faaafecad7833daea6b851502e5e40de1d420698c38d923e82b2f804728fc36604a18cf0d0dcd6b0d139724511fbfae5b2474c34a99ca5b73ac26974728cc869f61ca1249633bdc474cb696dce6a45a986719427dbc77c47a77431d0f943e858b254c4f454a8d2a00b19414a47c488b5881f177382f4d07277769ecd7a168d51ae7c5137b257f9881dc6c907fe14bee0fa581a3ac99744a049ae907a8eb8e0e1e2245e1cf6418e01a75dc871de2d01c3bfaffd3ccf7cca60b7806e9e1e7a11299c942179d208e78ce38313f27346d2f82c38993f096e3e9c860763938d4608e50c8b7e0cb316dc881f6e2790591a71839ebf56a3e16d93a06b4e87c2bbdb741642b1d3230d051ce23b28098a4c992ba945329753b5cded9dabb01834389df448c45732d59d24b68358375bf536029af414cf5b68590e8a43c52a38ff27b7a8a4f0000c772f753fc2e73ed6cd5ed2c44891a1aa152d385d6d4c741c0033444777f8cd73dab8fefcee4c737e16a59ed703af789f0e98f101dc7b48fd6190c0d94afc1b3218e8aa551e5afa3ec479fd0ef3127290cfdc924e0495601590d7120c4d4086938107d535109dc5b52cae3f1583fe2cfb74acde6698b86edeb25e31b95d6c386063081249a271617399808c78e3db4f9a6d0c107e6cb20e6645d74d07af95c5dd02d9fbd2f71b75dbd4c9d70d53a260fbde87c99f74679b11d3fc07d63c1430b51555cfe7ab1c805161f852dbb92ddec54bb4b4382dc550dc7818d9757148b540707e8a64eb07d3ecaabafeb458c4ea6e8f27a84a1272f69b37edd8f33b8d631ea57acf15504932415a734262003705435016770952b73f1129beb1d69d55bc63e0959aaf9b8718711f2e0c541a10222b35f485908dff2c75fae8a02a5ac1511a8479e2bcaaa2ac54d77b77b055f3d9e67932ad4edbb01d9ee672132b44565f025cd65ec30512b790abe7f0414d2f10cbcfe8b55bd115d4f1a04c8c930d2a4028a17df601e225d728f3f81bda15b605b97cadb4bf6aeb8629b850eded85c0820977a3a2e3a1f72e2a0749de74cfd42dab711a2a049adfc9cca3d3d1bd5e7db0fdb070e21cc45c2f9c974c94dd74f7865d736b9490932ee34a62ffd7b8b9444248a92e7a4bd9795bcfa7992a47219cc74971c2fba82e1e4cb96c07e2aa6b09ed4b2d8daff695d8686850ad4281ba5e6c36280090262d3553e9c3ad51db066aa818d67276c97fd8b75826e46cd9c83cb54fc81cb23dd2ce744d72a92ff982b80ef90ab58ceaa3d0e954a2ebc8cc61d320b5870b9d33771668388b5920e14465815c4066861133b076210bb07052ff836278455104220749b2f92ea4c50a370b557ff74f51ce4e3b0387b67305e628acacd9d8d8cdc19071d72b3e012d715c735e976bc49dee39dce08da5c37311a2b758c8bf318c58bd37b0bbe896e5fba8ddec696046a676dfa7bef69bbaff738e05db620599299c9c21f88ba75405db8f376f0d035b934d31184eff2502862872d5ad285122ad1096e387efb134ec6aa3fdadc41e0cfaadcad96c623d220a2f076bb9ea9029663949a7b7e39e16e35e383098bcb92c300993242b2b2b2764842d6bef4e4720ada31eb1e991c6b9ade9b479074d29b69b7101ab7c72f68988c528b974a4d7358da3fed4d22de1e1df9dcc5c9cac097c533c618c0faefb2beeee61824455cf44ef41b1f2177f0b03e89cd5bc2c7a0091dc8ce88ee68e49b0c50c7475d72833bb5d8094a7a53eec078517a921a29161a4960b9502f1026004c09e4b7ccecaba7eb89b0e8d2003dba8ef4764a42bc4e1e88368c516b0b71e57d0b11ffb98f3ed287c00f7f6b4eaa791f75d8717255cde4d67ea2cd798e4389e39323506af4b71370141f78d0f0aad78a7d3d728bea44e3e0e9b179abb298c7c75de56c2046f7e0bcffba590e346e2dbde592215bf9118b0e8164440ecd7988ba40479085b5cc528dc35c2a65e9d11f34101b8c1855e2d08bed510d225da6971ce754680d307af32620c05af398ace2ac5bfdd823883c17c33bf337afea7593b8cf76292b976155d42441948114b5ab4b007736f186330745cc0ee667755ccfde6dcb970475c78e329ce4bc0c16d9016572015becc0daaf0241f6df4860745db500d0b09d51171ea0009dc6369ca93c5d157d8dd447a01e77603511d3fc51613ad37f2d891db778dc9ddec17a8c73f1134619c37f71d18cbb4ca400cefe66d67e54e1a19ababeef09872329cfa893fe7ac0187d1688325f04773d560b121482e98d515b799e93879e998a1b8051ec081a543c8622d82326607076e77ca2990b0ca1cfa6c090059c4058087dd24e24c6abf0f83d453ad77d315020980b3785d825d5e54a5899572dcb85d62759faa5142659072ebe28d1212d0d646dc6ac91eaca8313cd2bd1aa6454f34e3a2eaf021dbd8bd7f8a0618c23ceae335cc6b222251828c411fd320619ac27e37e37af456d6f131660b66641fd923190c0874c8dc60d5081f4917d33d81be350b0edc3af9bb191bb77cf8d6f082436dfa7eba3213551e6067c6f2e5d29f2f212d8e32a59cb4cbb9ed785089b57eb708b893bfc835f535a56f947612f8fdd45f130bd3cb2433bd6f85445d20a48368c571202a56cd3d2c5eaf5008e2502c12567ace1ad28fad3156decf5ecea12e428e1032b282471acc1ea45fe5e6660a9872d2575902d82cb9ee810fec0895c2a1ee9af35c6a9b94ec262f809264c78c4d1fac6d1bea960cf20963f136d4c1a0085c26a3e1c39f6a90104f639908b27b8392501238201e4ba7db50e7c21861e0f7f56a750155a69b33718fe079221c4e5b8944b61890b91943a26ba66f0898c03050946448b649ef51d02e07408eee971fb6c0abbf968ff6f1a8be7287c9bccc7f1c972ea8fddb94a1ee74097875263a0bb5bd9f30c01d714161cf850101fc736c34c069a0dd33055308c68a1b1b80befec350bc3b586774a55b01a9f1ad48158bcfce4c6097d1c2f49355ebe8c4faf50f395d0772c5148bdd910a999c72586262e678f29a89c085f16ee6d98d6cbfbf500f7ab318eb5958c33cec318e5bf308b178d64e434dd450822a9209da4f7dbc4a13f6b561c768f70b7280416be8d04a19f70b3a44406be851a50cdb0f53f0ff2db854c17ad0a6db38721107650c38d8d4d0f21dc706319c0f634337380ba526063604129d5b8819d66b0c824dc40917bc01a4ea761c5951a7aa2e0e124ac65d4e216632d39bce6d59318b5a38c4158e91975913564a9cc6990beda0c3c0f4a6ab6c2ac26de1c343db92784284e600389860ff3944c500e3205a264d0a36c3df74d10e0288770ddc88b2a42224177990fbea0c9666337048e2eaf4d6c34ee969d200fd81393c4e4fee76bd3ab2b14208db0e0ec0b1d5e9509694203454961c835680534059af08f6ed9b9379da5bddb9b734e67a9f9b6397b59a062660f3a399ff673a02a4c76bca47b4c6dd8c787d2988bde85988a41e562db79ebb8b5895720c59b13140cecbd38bc4d3a175f8d1c17fe74edff9f633d68d4c94d0de4a5552c5876330e83423432de085a2035001e25f8123a721af0bb84624971cd6878243b32e7811696ec35bba5911da016d7e995c3083b364bdb293a431a9578d18191058a1a16afc708e77cf2e9c6ba43e4caaa9e77400e4e1803d3fee1abde5e875902a2e485ae6ae261a97925b0b3aa51c8bb27e6d8a467aaf24da52ad38c712ebbd84d383d862ab45f772a494a39b2e63f29c69ca04cc12bd08887dafc06d6c34e62fff858ef2e93c04baa8eaa5c553804b20c7013060e2379cba53dce956d5c70f075a0aa1812094808ee67ac42148dc6c04baff2cc406422801dc81b8a95e9c3a4f3e66337038c79bb7815002b74b3d4e61016d4073f3ab22d2ca298f9c721bc228bf41f8799c95c4efe3d007b9f1dd58b01c37808a092abb11f0f67c4ef87a5937184a5c1bd5799b294cc50eece8a12c5c54fc67d5d7e99c751822eb138fb38403064e896e8c43394339d2540827c7d79110c61345096b49750105fe9162425e60990b119c3394632996ee74b9802377e607acdf2be9da5b48dce185f8d64bf046bb5e6834eee2e0b814fe44525c881029b020431234f6599280f73025c0f5a51806d07d9ddabec71a654adc3df3213c70f2d4319ed8a64e473b665ce98ac99b8328ed7c1d5ffa62929d3402d15b4dfa58e392043df5950d9caad1ad1d948e2a1d89162330cbefe198bc827fba714c965694d000884afefef8c66b471965e4557889ffe69b1605ad607c57c7cd9458663946d71bd69dcd90a17a2172ebe6fa0eeada3c3d44d22bd909f77e4e8370a95a7184f85d485de99d8ee433e35d68e6f1c6e462e5ae4345f14ea81d16ac8b6aec723f4a30c5f133f3d305a71e0a96771dd1d0c40e9f43b2588ed135f5d9162a8ba0d811aa3587f1461ca4d2138319c5926b8dc99ee2ed9fb81003f016ca23e07e7dd81fa15b42359cc2e1c8d4267d6ba0b3e05324d195965885f2b301c1450c6a1939bee983fdf9dd5deff0f284833a2452c9b55d29326cb76ecd8edbf71ecfbccb1b9275ec4117b491074364065f8cb444310189ea790d5dd0ee13565e10d8d1b312d8f35dc072dcbdd6b6682c31005e2a656455ae82e98630be9e2804d832f7100549ca10947946406148c93e573b733abdab517bdc18a23d191a524a865e0daa67a2eb60c676267752b9114c2c35ded09386548b2e09fe767dca91b20e5858b8f36806836f68b4eb5a4ecc91bd30ac14df097ca3fc112a77d10b82724af65794bc19e67448d1961909d6fe62eaaf27b250055555de02a7483296d6a69cf60c8aaab0ca03e51f86b4c19b0deeed071652fe050a13f2c88053a1e29d72138507ab32a9acd88d164445a37033f2a6bbb4a67cc26a8ad2898ee3ee1508d2df8879138212ec6a191653ed6452ad82360bd83df9a97245fee1374fe625ab77c015d2f26b080a9ec3f4cc52c4f47c2f75b67275b832ad7a9ee3051270023cae901644339fc4c9fdaf19df0436aa86f20b90553189fe4dddd7da69821f2455cce0cbb13e760141cf4290048608d497e9999309bff73e08c7bca6f958562a527b7810fa787ce0d034b3e2a9c52923e28da6bb8bb11fe8ce716aba729b29874bc84d2693e464bb411657296f26a08a09a054050505a2e0a25cd18f82deef6231af5318c48abdd633850526e5d87eaa4587b0f0c000c3838d8d6ea9ec1ebe42751c20fdad78a9f202b3987303724c523e12efc5a4f1af75b1101acacd07dc158294e4967194764a073f2402fcd23b0344d7fe0e084accb17fbdf5dcf572979b2906d78324b4dc2ffa1a31b49caa3dddf5a1e5027a838556ca0fc201b4fcd7abf1d7dc15d6b9e0a6f6753c5b65b0c63084bdf76014f9397cc002219175e73086e896ddc07f9d1f545fe60aa0449543de152e32b515150cd8bc805679a7005e4ef0d90db345631571a7b44b9c02cd751b50294cef367463de6a6c7f31eb1503f6a543e4a3ffaeb058b1f2b8e84d36a41619b8676d0806d9fb91d8526d60212ec7e1823a180aac703f5b31a9dc14d63ea3dbdfea70210ab47b0490f943c68722ea3a96ab3bbf29aff05610a776ca2b84f7fe10de2ab465147ff1ed94e1b109df49b6e425ab429ae22db7294efb327c3a059e18974376d7a12601d2df4cb2b10251fe0ac5dfc1327b5a7078ab162bd4d5d9656d46183d37178f2f2eeb8f8186c92008f6f40b70be9d67bcf914d4362fd7f6e8155653dca1776b69f8e505fb3d31798a61dded9cdcc9670056951b7689e97488cddf4100d13dc98b7433050b8950319d2eea2e804fb317e6741f7b85f7e449b90f6ef3ddfee00461cfe514bb20657264f78761f334a6bf901e05ff31286b019cc61907257207af3122319f02dc8a490a1d2e8c76afd3447abf06f90951ee0ea69d8c9bbd421a78d2f081678f2b81a21457d85cb2add816e7e2776bc586ad6b02c35364aa6fbc9eacc768f4ad3a3c0b7deaa7cedffa4239e6a3b93ebab488ec0ddb3ba89332384fa15ab0aeaf84a4f60a297d3942c829a02895af43b5487d9048141ae03754b4e016e130598dce4ec9cf76fdf72bc46b2ece8d038ac94fb08a826c682d5cbdfd0cb6fb33cbf1d915b20d734fe780130454761a23fa2cc8c808d7b08b63d1887a7469525c86be429726b59f8116bb68252521218db8227ee5ace596833efe1bfb64e06a14850c7d2b50b8515acebfc1e969192e9466e984d0558f9df617efb784bb9c5c3815aaddb79e423575ba25d8dfce4efd6e44a45b23a27acb882072bdcc2dc73a5dd1487eadb228b84be564c0642936e884140886e07a335f05ce2e2cca3ece60cd69c4782018a5122e7c2967a7966b90b1a3ac16d11b0f13e5bb53518307add32c60eb1e94b6f29039997ed14afe3731073109fd52a7435e2a4327ceb8bc22e1007739796a9b811293f548d3e3277f851bb4b2c70ead7309c9fe465cfa797883022c7411883175217fbc5555b4c1e26190719f1ea1cbad6ef9be7928fa372cca18cf6416f90e6678ca3f677bcc8dc549c74ba4e2d180436a5d73e567fca92beba4505b8381072c9c1dd0678b5b1f9d4ffac3b1da07c69dfd8316053d6c5141ca604f6c29d5a2cbb76d328efcb85640835e6ec94cab9d19d23c442a91f9a9a156a37cc2bc6bbc281710ce041efb9bfe9daf9fcff88032bd317f57e6997c054fbe90195a3ad98810294254c019417c78958050fc23819a7cca88a1a244ae1c16c4e435a875cc3a7ae3c45ecc4ea1f65a258fb83e48c6bbee7354e58e6159d1e4e1a30755b0c8f851174e7eb3cddf961a6b43536350f83b8f147513c765ea4dfecaa206dc77bab0dda50b38f75a7e5857977edbd1d9e9175493f0a00512a2d363d0f82d5226c3417f3c1dc28826e1fb526d318ff6b12660269e9d5cd00db251c744b792f915b5a5426c7f5935350d28f5a6b1e816415838860bd01fc0b3bc8c76e8906767a670bafb421776bf39f21df012db0c94df7371edae82dd9281599dba1837ef97f0c506aa5d48a242a406abdca169d61af8715511e5e81e4dde43d422bc852dbf574f74f3e54de727cfc0e742311ea5d5ce6bbcadfd3622c60f06e0d6e6180e874b27d62770a5731b2fb7a41f5ede4154009a44924c58180f7551cf4aa33e00ceec9ca38bec782d4261e1c5c5c7e8640b147b185c7261a0aa82c1420d460a1fa3b94a7f850b0f3c3ed64a4ee4d33851653376093b17fe983d710d8771e001b08a60510407313d566121b587cfba256c4e6f2c837b5e683f6ee9282104c3d3581701192ca537e03a5debd470911d9a956d82383f626736f6a4c0129eae513dc538e5691b4834a7381d1bc5aeca0dfe27bd2d0bd5c3aa7e1d4225d8e7f679c7aab359d5b9821803b7d3ad8c1be0964626f56ff0325bad5325ba1ed06675b40eae6ec48b6a8cf4d37993f7fcbd2daf47edba7f82985ce7455888578b6f1d82d36bbd43cc8872e16451e13a0956d3ad4ce8ba370c40a096acbfaa280e6581bb5fa885b35c6a4ecc54ecc3f6fc45fabcf331a973871865b67d2983fd419f0644085014a0297cff83f8a904d2e9d00ab931bce92efbd1946d00e96535effdebe9841a146d05082735af0e08db8a5122e8f6d7d34265c25454d7a694487d5ed63892d0c6f243340bd0abd868dd2e7032dba243240b7eb0d63cea814339e6bd41d47f93912c4d755f3fd4c083fc5a58f94977e3ab01e064e376fe96e4d827bb0706ad968555aabd10ef7402b9b3365a44f2a832be7e9518143e5e1d0a04797e0b561eb7050e3e2e75b56ff594972f5b5e86e2fc4da20e3d2ec989c185f3c8d924865efddea4130250920d346a1562973087684eea441367e287c21a25241abf0ed3160cb4fa0d7dca7a1b468fa97bf865a902277a438cb4d7ab11afb65e310c730d6b02a6ef50a69a714a3779f9d11a853b6e9bbd566ae19e1c4efdb2df4101e085d1ab4ae08c28a0ef9aa62f1ad2ad8c09bd890a3483a29d156f1e7fa009c15f6d62bcf3503279ddaf9f8d92c731d833e34f9e2fbe65d3a01355b02d27ca9a4a962a1a9254140063f2ec3887cfefb78ee9c267b2098fc8e9cffa7cea5c23d17dde64449108bb0d0364c1f84e0e39384969567a6d828c4775c773106a0e00e79e8c020d4ec1f88d190e54f1405f9a62c10e542daad58363265d7da7bce4f8ab1b1e4ea0c2dbbfbae68c1219d82bd793458b9f8ca89c8245c0d8bc9b5ce5513129b56a156b83b9f37ec5494b4216d1ef9b50f1013ea1824d63e13915361ca92f1a2ebef8b59428b13d5ef248973f65a16d0f43779367a1b2b705f46f9485023e2853dac693a5c0351d450429c81712e56037e0e7881ad66ec4c3ee6847cd86129f229625d375938f04152f05a7c2a17451d85377931e0d1dc6436a704fa5200f912b3824910fdc0dccba2f5537e97e998c21fdfff7fad8a7d4e86e13a11ee95d32323b2a302b4449e8859799f370a10deae7a0825971e17df283898d14c1edc988ea1628a84ccaf040946aa736a238052343a68d5f23e6b46523d717ae3116370daeb33ba406678356316e6b0c93623856ffb6127e8350444b5c8f4b0613a3e7a65cdd92d4921e92e9737f2117a8f96ab5d1de6040989856e6f84cee3122b299e9a3af465f6609fee78050f22a3e1cbe7a45ff3bd3f8c906e341dded5c879bbc275ba2fe2aac70070e4fa3ed797b8c827fceccd71caf3bfd155c487e6e45d09e3b6dd9698e3b25d95edc0dc0dda86b44eff2eae89cf68880d1d1bd8d94787f97237c95566d528778198a436e954527f4a90194ee827cf51e30446923483fe97ca48330b413e4f91542c9c19eaf490c3ac8c1f3cbb496c1968ffd7fae61427f995c0f6bdf40c3605207edd7e5c400ab75aab687ea61f1e3f65cb7ec37a92ee95ad7b84b6c5d1e0b058d547e96bb6ac9b9d4ebb086b2bfdafb810ee802544ea0392f678ace10a721c4a7e7c4dec8e13c68a237a9aed7aec176e946eb34aa109f6fb0ace901d4db68b00c1775e05d9a13a84980f67f8d6e88d7dce3fbe11c86664829ca471b273b7393a7fdfd80d9c34856ed10c114437de23779cdb50375897ff1690e35aff441d243b53bbe55e08f0983e95fcc29a8103d60dc37e9b5e48c9a67480abf759b4417ccce7657c71aa679e0537238824201d6437db49fdcd7e1439d3df81294553d40da5094fd056e129e54f6284a6d03843b66a1d471fe51e8a8af11db848ab1acada1fc7561f635eaf8a9b20d0f26605115e67a8a00ed7c5be37e6026d50c7250c31f8e5793b41ce27bdae4a0c01cdedcd1fef5b9c179a044d51b1cee9ca8d33eb5536081e4632a5127423a958120d3b041a912fe283499d7cc4918d2db21234ed63b3991be307e8c43040ada146ba38e323c8293dc1c7ff44feae2fbea02ca11ab8883ec39d33bef0fe0daf320204bb67bc7e30ad29beffb47189f7752e79c9fe8dec69f3a4dce3871e200921769b81aecedf401a19bb674a0d6fa9f699e0590d2f8c4f73a223b6c21ef5aec1037794b229b552d9d7ad9f1894d3d8e84c007c6f3c83c9207d6b39b266a355474032aa43e8b592014ba9a0e1513ee3467f573f2658018692543cf827d8b5b8b544986a71f036a6f1467be164722eab3c71c4f800b67b067e9623cde393adfc2ac694d565bdb8fcdf5a5b27ec4b6e29832d02163516c6b7befbde59652262965bd08cf083808b77cbbc1a6569de3198aac42a10f1bc970aa241414141414d4766d97ed08e2ac24a763e85091e76584341cff51b1e76748ebf19f0d78758c219a088eae54989896a8d2c3a9c74ab5d9683c4e4e5dead3934c16a3a16b44603e23ccc965d5460476240b6939554a25ebd7a52562efda52c3655b0223c7c6637479e1e1d103781c5a00dfa381bc093a00df4303e079e81f3eba859fa15df81d3ac8041e670203f8e182861d05d137535113188076390940bbb60440bb9e80685717006817d40fedf2b2a3a3054de70efe9d9086f3df8dab03672c896ecdceeb06a76fb609ba56e4c75ae4329eb046a75c56918e946a52d248a5a270e008690f84c304d854f529f54ddf6404fd68a107d22c3c0fddc19e011a02bf001d81e7340bd6b10095002d817f80a6b30668fae424014d6f5050502b0cd1443eebf1af8ef131adf330b48cc7d1fa1fa0e76c8508685814ece6b22d9574b21dcd1d98cb8bcbd6830e9dc2efd03e82fe47aff0401af63c34fe1e277c8fde8f43a3f03c0e789cdc7dec3a00460ce7669bd313d46d748086413d69d8169853256d3ea458add6f7b1582c168b55a443e1840d55492fa38f212d0629132314ba3b4648d3197a1d9a8515827c0c09d1585821c807cedd381e28a499f0403c36c0219ac8737ab573e8da101e403c24f9ff7a8922d42c16bb13f6a3615660362d4e5262e6196714f919e1902d01cc59e17768ff199a85f7d1b497413fe013a01df00dd03300e96ebf091a85efd127f068159e013a02bf000d011a445480a202e985f051da496b09f2012386034544e8a884190166049a8655993b4573274a085141a38f5105edb2a1b0656bd793dfeee2ec04810738608619a1d0dd3fdf23a4e5f81e40ffedd028f2384378c0a69ea428721febc0f1c1a9c1dc6162f2d4ffd12e2b39b4cb29137141b96eae2897724d018d2e1b0fe24e0e5d9be169e85a917f5d23b2c536c29e5c0634c29c8ef2acc8088372d90e7d337502ec08ef706386861db15aad8fc562b1582c1a2f4e44b4cbe6b22d4f5da050d051021526a625aa54b19242486d362ac54748979676a8934a9f24254509a992128f9e1e4582429a0912a8648dc2408d06970dd1f428a445950c0a81f89ee1595048e36a437280391abf0e8dc2efd029fc0cedefa37d3c0dddfd8f0e7a20adc2f3d0b0efa14f781ebd7f480e5d2b5264abe0a4e54602a48ffa1fe4a37c948ff2d1de412c35d4ae5fea235d45c3a8f8d0e29482beb9a1a06fa0f44d934023e99bbee99bbee9db0d36b55d369715cf5d1e229bcd7c34ac0acfc7f21258910e7d13958fb0d864e62465787848f25f1433948b47bb6c2e2b2ea71eeddae27a9a3b5c18c8e5e4b2b202b85a81587e540f2d7b1e9a7c207de37ff4ce0fd144de47dbf81dba84d7a16be4d03505d466f8ac001cba47c328f2b17b0336c500fd512f55547df4515e327d740ff9c87f3452c6327ff413d9e63fda293f551f0d95a5983e9a0a1e92fccf4747faa6614c542a596549f7a08f4ad037b71afa064a23e927b493a6424369248da491349246d24832edb2b9ac541267cf186fa4b0106725391a7986c6d996287333e8ec325c2b72a13eeac3549ffbf55feac5541f2cc3d7d745fe9380bfb165d02e2b754bdde11b8f2edb929d2d83d65ff4d3ff7454f5e1b8d8679ccf453e8f9fbbcf337cfe57f581f1f963d527c6e797f1792c7554252bf7a5be6dfd45a705d087f42d863376af43eae89961861147d78a14d12e2b55e6b24d115d79642108460b7709b1065516f44d7fa93edcd7d7517a278f47c8cdfd7d0a90db6eda1d6158c2c68ee17c69e924632f14feb81be75d369715d716d793cbea2740bba05c567f2814926d6e743975409c95acb165d02d8434fc03c6cb76ecfd27ce730f2336442bc065f5570869382b843140dd60818786830891d16545c865bb615cb6a11d1b3c78f0a871d1f068b178f018a2e7cc9f9bdb4697ae28d7544d118c09d7eda60bd80e2ea89b2c601c80bdc0e57493839b2a6e86004b411802c94d6cd7b99c5c3697ed8b29a9182a3541121fa6b456daaeefe3ed862631dc70642fe62ec6b72f5e30c085a91295f397a89b9820a98e863dbf0421123129b97952df6d4f308cd49e4f449592a83d7ff5c59ebf0a87627b4a9451e265862523b2582c164b09d49e3ff5672a5646f82a88cbe595127624db5b2832965a57aa96e36ac553dcdddddd29bdbe7a42a95d31896eab8afeae250e5bd3b973bf5efcc2941b2f15a732e79c7306f9a44f5c5412c5ac9eac94564f56472b21325e0161bdf8bea9f5d453d7a7aa2465a348f326459ccfe5ac82fdd8b4f6a088c96f48b695946a71f660e14a8645a35f37319c193a868c1a648d1d9e1e1c2b2939fc1625351583d96c369bed0609090909c9e6c5c4c4c4c454e35a49d1e19292929292a269b1fc36e34c325276784d92116d369bcdb6b2aeb22ec5e716155a07ad7fd6a5fc38ad2225d559f701575280ac67eb2b293cdc5ae75647f0e8b13aa2c709f7a7db2edfe7d65a6b292dc1ca8817e7cee5b8b9e31c37ba5beaa2bd4e31bed7dd2fb0ef576bed1d27c6e25b39112bfd1cb5e973f85aafb3d6fa73ce59e9d7cfcf1df1d5d7eb3fe752f7afd633e7ee5e47ead3dd8eeeee5e7bb82c9fd7cd39e7e42abe76ce39e79cf373fccb5a6bcd2eabb5d65a6badb5524a3fae8aaf3b821ae1eeee73ce5ab59e3b135fdb6ab18068751f449ae7cefc0ab4a7bbbbcf9508e8fc3612777777dac4f39238055be0b449b5d587babb5fbff7e8d2795f0317e94eeb81e05b39a9b5d6cab4e7cfe7f0fc6be7bb1327e5b64c7327091a744695b1eb7fee838e8d7147acb9cf391d8e07e38b81b0f04665b37a893532ae993c411b5015825e97397cadd79c69e44caaee7398bb63ee8cf0fde75c716533e7d6ebac6fadc5bb8eb65a6bc7d2e659496badb52e04b5ab26729ab9703f9a3bf3272e7dbaf6c563b5d6d29036df0ed5ec3b3af1ad9498b5d65aebd34a89f9dc7c3cffceb75e574ad45a6b9d13f663d7b1b4c0ae4f959ccfd5a68fb55e4fc04fb7115cc358e75afe6fae92102b98560d61a845b3fcdd789467f92baee50f73b6fb20c74079ff5e2336f8ae65203f6bd710065b5414c240f388ab7761adb5f8f5aa0198a333ab3e1a36f7d54b69ad97524adffabd77a4948e25fd8bbfbcf7de7befbdf7de7befbdf7de7befbdf7de7befbdf726b19bc6be3be6cce55c5a1feb95d6136afe9c73def43f07f3d7fc35e79c3f8f99523abeaed6b1815a35c45821032c5055d82aad191d30124e4fa0b6740105156022c0e5c9c90f983031b584510c7ab003265cc08227a45c31c760518413276410e6ca1066f3a7042e940ffc892bb65d6dcb8165069f4082fbaeb558f2acb5e9161cf846d79e579ed8428568492a0b971d8610c4960e7c993e501a62ca0b9200831f766005910e441881c40e5f78c0e2685692dbadd0c0c909cc121045182208220e88008826c24851020637f0410576e0059208b4f430c517b3f9330222f6fbda178b0b60c0c9b8760447235146ff8a16476cd59e57b480daa5ad35afe20347589cac28ca61d6b4fd6d15db7b80030f1081081dbc6822c4ccf19e585860c3130b0b6c3e78d3db84a5f86a31c10e74eb64b972d3c1b7ffabfe4c9d2c36dcf38a9625244bbddada84ce393b9a2be7b889e8446c759973776b5b2d56cbba0f49d4174dc2dde9ae619839e7cc95a496decf5e3477e6cf3a832a9b3a7d0166090530499b5eb14193fd57ae7042a1077fe9eeee187fe9eeeed8dd1db3402c5fafd8ebc05cc83f370cb568f6fd37433cea1af8d97fbcd12807a0597e703ccab3efeb8b9cf63eebaee6759a868d1d638caf1dbb57326db30ce4cf40f7397685f9e84237e26aa350a998544ce08d3dcff37c709f52afcbf7c71513ae5c145e6bdf47c519d2dc2b696957c41663af146715ec47a764d37136550dd22abe8feaea5e026dfaf407d1715581959c18537c55b01f782c0fb07ff06cd4d6770f2fc65c48cb39779d149ab7f48160f81255aaf13e4972424bb25b9c627d99d638675877a9d5a2a1a9a1a9a9a969b1666a6a64c49a9a9a558d2aaca9a9a1a19a7387f3e2b3d52d10c6d3f662eb9b14ac2a5bc950a8db201886e26a258ab6355b2c16fde163b15a2d1a9a90e6726550a725be622df107f1e63aabab603fb0a5201eedebbf9b1b182ca4bd62a50803c64a056249e2e4e4fc036dfcf40711fb0fa29e3f8e630e0e8c186c1c6f6c5e35a38ba6358e236b9c9119c5711c478e67e6326d5f2d89f9af6d629bd417471dddfa19daf53134cd6bcd59272fa3e6256393338323ab5102b9736342edfcb609e52266477292676e3e49deae97692323fc3990b3291c8ce6bfaf03afb64d9c58a4a54abaf48cff416ce5d0f86cc3c67f34b4d114ff42e3bd50c8db35efdd6e34bcef62abe9966997aa79549117fa944f7d36365d48bb37dccb070585bf90765773dbd82f43d7c933f335da4e72e65f3a4f72e66db438c999cfd1ad49ce3c8e8e4d72e661fae7ce0c38c999d724675ecf00863ff496f94f2c61abee8c8c6ac5aad1e5e96925b6645b9c9c44191ad28acd2633e3025b5ac746dba830628a8e90929e4cb96c09af926766cc30514e85e54c4a3832a62aaca4b9e38f8dae9651c5e6b2a72ed542697b6bd9a4ab632cd18c116dde45451cd8b86d9036bcc90cfde8c89d38920d241c9ce94f3c296709f1be6c6c6236ae284a4a5b4ae84b4b353521edf51fcc4647a924d368975ca634ef18516653f3ac905603a3a6c68d6a422fb279d5e4d8d824f17ce6f98f471b4da95fc0ead4940c16bb37210dc380e1988dc7b14163ac4fb5ea546f55ca6bb2b1da6ab54a959c9c57a5529998f0cdb9daf5a31ebbff66444989f9e21e91fa26b9ec16b92c4c25a76ee89a54ab482e43aa4b2ef3a7a1120cb2a7c7c60152dfa3304fa22c5552ca655142e1ae19936c54928d4a8aa1a3fa8fce983364c890c934393aca3a32684c1a3366d410ab512d9231839c240d1ad346dba83095fc11762f77395c73813083866cca48320aa7da35f45daa323139ae1b3b5593bfc0239d9aca3492c81ab346944c16d2ac9498303170b86bb48daa6418315352951443a5a46051fe63936c52146993926cbcb44dcad1368a942a2e6372d912d3981d1aa692fe356854d4d55d97a7272f50505fe8ed46b750a7254aa0549c2ee135fe3bce698d6b36fea56b32188d8dcf2dd767c3ded08cf8b9d1ee2b23c4cdcb42da8d0e1b7ace6e34dd33b43fec489bd0231afe3764eefbff4648bb9687272a4726938d364c95d9241e448bc351a3228e47acf99e90f6cab986a795a395d88c18c0f65afbc42a85b41a1ce04a056269a376bc74cdc6dbe81a8d282be532ff9c83834b78ae84778db51a4f33d64a7818ba26fb980d6d3405a4d986a613c7e5ba6d6f09fa6545f216f98fecfd6d94d494ff90efff5d7d234adde16f422894b4642787cdd3ffa4b868643233e4eba606f6f9bbfa4aa9a45b21c4fbe58db27d4947257d406b2dfe1d21ed3e76d1c8ccf454d2fd6b260b4135929409404d26b34953c4fc16061764a8a409374af5c1ef52dc265f9b831b1da0804aba5fd75b1aeb7a1d3436c93ec14c2ef35b6393da3ea9327f9f90867f5eb26d7fd2fcfd170d2ef3c711d268c659493b4e0940e53041470e1ff0a5ed13aba423a4d58c36e90221694709322020a01a170d508b0504c4b566de8e25d196793b33ce4aca8cfeaa10fcac7ff73604922bd9c4664c2f934e3d800aa4fc572910b11b79133faa64d55f66473fd5cd58d27df35ae3bc0c0de37574ec63e8fba3ce4f440f796f12450554031220c3021840a4c88f0a3e302d4327c6789b31c14cd2cc0a669666ecd0c1347b61061c26f4f4d86ee44ddcc88fbcc90c45b4d1941c44680ce1d93c5400fa24795f478ada351755928ae993974c321fb909e64fc63293fc27db5cb6547df2d3cfac60fa642926596163c943eab1245fc658bece2873cbb7f106c5a4fa2ae8200c2d037320a73f90471fe0716821dfa361e8a10bf03c340166c4f03fe5e7a0517e3ec0c708c0b31110437900d716d793ab8b0bcae5e54687cf0d4c07878be87aab5528974155a91a55a360401c78e3c6e726367b210787093d3a3649fc3df4cf1d9ca70c8b93c4afcb1960e10fbdbbff543066305635542a4e94edd52acb1491c2627b9242143b1db0974143e013a01ff00de81e48e3678096000d5c448a888cd372a75d50b728a9292f14e27ac8d12cbc0eede377e86e8597413be07f7c06912244548079111a0b2bac56453e60dc62379cdb0d350ff4ba5769ef41f0af4642bb48848cd4543ff7111b76cd1b57cf3df89e37537d371679ae6bf07f61f5dd7fae81581b76adfb6f8642c6b0c89b81631843381679b3d57b639137f380e0d8650dfc23444f76ad0341212bd57b63d1fc320bc3c0eefb86cdb7dbb76bd81d5df07e3639f1c586cd71363931b567931344d81f065dd78e54980939793177e616729a9a3c73cfb1b45f56a71ff867d7755a49f74c8866e20d5382e09f1fc24065e6792e7c1f5483cc30861c406c9975230e0100c30220b6806101105c66dd13ed190e19a9753ff7910dec5ad19d75415c1b7fa815307bc207dfa624a86777733e893f67e097a24a1ca7f87f0abbb481b58fcc2c453cb1f11b998f7ff5d3654a6818e7ede70c9cda5e39af7021b5af1120bee7db30b38fd828268a2e1217bef70ff50ddf874f73610913a2590e53ee13cdbabf21101ffb869a4a698a446d2ef33e7c52429fbc9bad7bba5125aa84f4255552c2846836c5ff4b3a84384b14b6111b58fb488e12394042c91418c0577d91925a344afd9c8550bbac45e0685467ddcf999139cebfa39121a23ddf86d63e52002298ecf9b3a9044f758eb0f917d8b2cb0b68d973099d79dfe91ceacc1b8d72515191eb1a7ed43ddf2701e6ccd3485663f6fccf69f6d83100d1acdb53d78e74ccba9fe10b4be698a925dc9859376697cdffb89cb92031b944f1c0c945041f971dc0d9c485896ee2d20155f662a50a23eed9b4e526034edda48508bb3543a580a23fb6ca5854d86c255b5ad06411256b1eb1ac4e2da5ea539576d4ae4d5b8ebaecfad5367b5071e26ba7573aa3f29ff4aaca1bb68ff5c6559c293e18444bf3e57cb52485340580b611ea4ebffb7dadca874c09b6aaa83f9be8321d40fe23f360f6acd2362a69295949b192e2f78d49eec64f4320378c1933c609bfa7eda600d0bea3115b57d50641dd6badb54e9ba537287f63b003ed67edcf951d4bbcd22a6bc5508364be49ae4d6255b46ef1cd39e7c518e4387c9fda3ca748ab61803890bbab9f4f670f99eff6ec19f3bc2f75c4e79e73ecf7f1bd3d9b23bf4fa539bc55fa6e194deff7df0693d41d3e1802a163c68c1933b387baee4f5b10a4db75a9b3bde5d32ac5cd71a5dd9cffd08ca20c1451f5acd7f95548e35e6694c9dccf9dfb2cddaae4ade49dd173f5412eeaf0fd884e48fbc62972daeeab2d17fe2afc4295a85bf5f5459c1cbe368b343ed2e85c65dca793d8edd9d8f51ed33c9ab51d7108046fabed762d56b2b26ac7844a0b983965f66cd272032d4d4b9c16b93672dfde3188854a62ab59a824fe317bc4aacff7f47b1810fa1fcd7f561bb94195c4e2fd4aa23de35feb59cfb9a7554fbdfca5d77a9046ab7e863faca755df0a83c4aa0f4df5b40b838c9468b7c6f2fed52a1796d019f823b3546fedeb7cb97afb6fb9f7c63048fe3b9644fb7e4bf59ff7f72dcd7bbab4cfd18c3020ad577deb552d3d7756d97186f5ae30c8374befb977b5b4f82c5dce8c25d14e427736120a116dd1b5d24654e30e35a881bc30c8d7655ba95757d91d88f84bbbedf7ccf0c7dca1b3b6aae7836af6a09b3e5d59badd6eb7efbaeeb929123a46d780644a1515ed2433bb7b4f02ee8e861a90a8b0ebdcb99f046fae06ee93e0ddfd44928344858d848ed9d68e73dab8af8dd4b7abd85be7feb37aee925aee6718001c0ad55af57dbab22e5d5fc7e9c9b60f0352df9b6c107ecf794fab89d5673dadf9ab575fb5ccc7aacf4ac8430f42e43a41f567fefb4a3a34e74ef7370c62bfacf7ef08ab01e2fa9977fdcccffc123a8b551f979e35045fa7fa4c2474d78e5eafd2aef7c2a1fb577b36af0a7217fff5b1eae31160ce6c5e45675f38743f976ebd9119ee455dded25f156a50d7300601aae4631d141067930da46cfbf5cb2100886850ff864321901cd2ead86301ba7d04e7dc2955aeea41f98876ddf4691d4b1cdc29109e299818b3e9fd7a470acc2ffb08111252db470a4c274a25638dfb70d8146b6053eb4a36bd230d3ed694ccc761f5b43483a21937166160ff107ffaa87e41345272605ee1e2894d37b545d3ce9f53ec9ed1bfce317bea1108e1082d2144b166ec7945084d0881c9cab0727b81d8fad7c81d453bbacf1ed3ce9daa839ddcf832c03881819a4f1b638cf111627d6a8498abb5d6dad7eb3f0757bd2d5e4971f3ced5e72bddd6e25a71abc502e2eee59ca35188f5afc53f2b0984311e4bfc25fe8a6b4f7dfb9cc518e36aadb5d8ce777d643e6d104c1453e020678ec3f85e6bdd6bbd81489fe6b973a1f8565da4e812459728ba4811858ecbe36244093ed0c40d3e300515b3f9930242741cd277a54b148cc5bdf85ad1c70b172f9a4841530fba60b13d0749d4b8cce0c90e888032c5511ed37d098730bfcc7081859625a0488182848b031ca8a80c81556061044e5954a0658b294bac28b67020c45eed790507587629621dc66b65b56793173b4011d50128ae58224517dbee79050a24d4ea61ae75be62d567ba7deb5506ef799dd7755ed7799de761fc1ec6393667cd18638c31d560929b8dbe241b036eab1095b4716dd77d9fce95f4ba2e731ca76fb576eed88f55d2be7dfa515781c8e1ec63bdd27a02c6d87b8cb18731fe4f4f1c54bdffc659c99ac7ccc5c48c31c678b4af03621ef2fb787dacd7cece3929b5737a99c4c6f09c18f76cfcdfe3bb3f07abbda0ada19015b2e3ce632d7536fe397e25f15b1d7307cf39313e62b17677773beff7820f68f79095fa1d33c7658ecb1c97b94f52b375950d2f883fcecb5d973deec3e00dadca57b5d23a55e1ea5a1083b489c8d15a873e30df88429c75f0c569ba5bd5677e8ce3f2a60fa4a36312bae953fa1cc7658ecb1c97bfa494d29c33bef9b9a71c57392e7fce39ffdcf1defb5c49efe69c339733f765ce397339e79cb99c73ce39e79c73b6de07f947df7b1cd2e8535aeb15b182d5ed0df3b6eb73f8e62f7bee7c607605a36a028acc3077ea5b7d1335028610993bf5432dc3dca1794fd78e806634df659ae7ec636d8368c36bdbb14633ce1ce504c204e68efadfa5dca6d10ad09bfe91ff7c5f182431bb1e7d5f28192ded26253edad5c9ae5fe22a48df4d9c2296e42e6787b4ebc7307bdc23764969ae3e20c83453554d7cf5bf557d4aa9382be9b33e6d1ff2aa4516885e34772c2044e3637dd25c16d5ad5f6bb1cd76efbd18638cc523c45c562529299b4d3c420c05c06dfb5f37b30af663db4be5b33f27a535e7ea74ccaed6c7396b940fffb7129318fab182b53089360d693ec230f696288246e6d349b46938e4cd991193fcdc3381bd909f7b18f2088337e66ecc351cea86c21f749c23cead7bdd5a6bc3218e00f9b9bf210c797cb9cc651f0e316e4dfb1ee4864378dfff5644fbe3427fc7e1d0fd3d447f8c56d3319bfb4a77de5dee26ed54f6e99ea1107e3b003cde71d65b39a86fd21c0e09a94aa2275ffd4fc8c30a823e845f78bd2c087aab35945bbb95b31587ac15fa562e183191315971e1d0b81299c42e1c0aab2d89760d87c451ec663774a95d8266f00556e7aeded7623c8a2b2a03855629edecec61e70e8d953aadca89d9da1775cfadea948a6fbf5a3bff6f65ab8f7d254498e6125ca9f9b58699757eede2f3eb53f5a1566836bda311ffa7d9f7bf74d3eaf6622e77de0786aa952833c36ad1b86a5e3637b05849bb238cb9431f67eed09ce93f77cbacd5ca2eeb17bb7e69a34a55524c9db255a65b3477a895aae19ff41fd57f5e433d67a0cee16753e87f184ff1ffdc0b4b1c36fe36be3d402aedb43d3d6d1adca036f23e6a34054ff19fc2fd67bf061b5ebb9b93a7a4d9f493bc6a6688767f4ea7bb8a23cb1b36378a73477fa09eb3d00b690efbf1f4bb2cb3b59e3bf4bb1dfae77d5de7a94a1c361d813efd75b9e3b03777e803b9cc22c1a168fb68b9197cadd74c3b15123a666f3c7ef8089f6dbec618c46a3488028b1f72b0b2450f3af8620b264820210a240c0116c5a88a0bb6d8a00825ba70394116b6272168e07b6261ca8133e5c0a1f8e60cf153e0d1032b56d084920eb4144d49225377024b0ab6bc9def5e7a1e47836ad6449b3372c723e0f6f7e2ab3fffad3a8c6dc7716f3dbf17cc1c25da58db23e0b6ee392882083a1491858e2d620aa4e7f095218aa0b23dc6767707c2e2eed6bdd57a7d7b623981975db678d063bdeebad72e0b67dddddddd6de8bcc684e0957f28f6f21f1d2c27c0a289bf8e8e8ea7492840d8a5ce1019ca971d3cbf178a1074f8628cf19526f9e27b2f0db6c5dcb4ad97b5526df0c2a3286628467c608432c407a088e0080a1213283ce40065890e58881863a493c5e6993db110c10544e2728e97a0e860ad4e96a511f890977240e28ed00326420eb79645136b75b2d476d06442d144a776a509969a124828b082082abb14bd282420624c952e6e70051731906ae21602a51584c0083d08813bce61b02f10b39bb74e0f908e2c3d3a7afce7fd1a2971fd7bf008d43377d9b3a98884bdf7ee3bb65e9cfb5dc27fefb5fbde2c9cfb9760df3cd22ca48e4e4f359242a6878e76467b745419fd2e05a2d192255decb267da544b6875b73744fa9322f1cdb79574c188c90d3c60f284c4040b0fbecc986c289208c196a82e8cc0c46c4e994a92f473ee6169db6c49db839193286c705a193c8295bca3ad8727dbcee91df86410e9c418b56834c5de1f6dad767cd157c838833c883922f74653ee0bc1e17a106188303e21ba6330ce5e2ebf068d449808c3e36b7c97714fba8ce3b8175b53870be2bbb111a7fd5ed5477dfaadea5823d20faa3850cae373d1f0c7e5386eac81d6e857a56f6291079146bcaf8303f0713d882dd604b78395b4ff7dd37f747c7c2bc4128cc1acff0bbf4f7db015ab7864895eebed13a27b46e69311a77d59cf7fef8b7e65b2d3d2e9632db51356ef63d1481445981d5fe3bbec3ee9b2fb4653681597884f91be95a8fa3a205541ad128da6e4baa3bed19479e36b0e9bfea49f97d00012104734d5a2b28081107c7490022e989ce860cb1520b2f0410f628a1044105004610a285b8a80022d9808411519bbe600c40f6c25145a8670c54a1460aeb0220301015f387182289290028a0e44296cb067054430451544cc008b0bac80a0884a4e1822229cd8a2052fb89283168c510db1bb15a4c04e77ff194eeadf121b0b0eaaec96d2bdf75e714f2c453fd8784f2c452458c2f41ec1038e2f26c2b647336badb563792467b14d5d6cb1ed0e336bad8e28b6c23d9bbab862aff6c442c40c76291ec1bfd2724eeb3e270c4fafb57a60c4b9a98fd5074be7fdd2ee4a29c55797dec33afab04c1fc6517b9128b14e6ba641d53ad1b6beb750daf72b3da1ec3e89dd25f74932edbe6ab5739ef7d36aefe7e78ddceebaef46233ba87e4e4fa01e98fbdd637cf1bd5f7a5f725fdaefde352c7b9cc55d18c4ee8bc42fb5991bd324c6b63920b76230df11f155494ace1e71363d3dedd9f4c4d32e5fb5a7e9074e76fdc1aedfe3d446cf2a8ca88000c02001198e04d51f3aabdf42f5994d7c5a5089edd9a44592164cb23082ce9e4d5948b1675316351d7b364571d1dab329aa073ef66c8a3a41940e2c31605450e09619a8988660edd984050f60126caeb8d102dbb3090c531398a4dd24f5f4aa71d1b45833329887a6278aaad252952a36a5304ea2d8d71fadd3a94f5ad63d3397c75943dd36e4ecfbf36dc8e9f604c067c49f6eee3f0e745dda9f250e1b06807dbf679775736ec4bfee394f985e9836379636fb97b75c7911cb3996f3bb793362977e130ec0df8bc88d65697f7676aca1ee5af7576cee2f5756a75d7fdc3b96442dc86c8709e966ddd35dadf03d43211c16763af1c3dd3314827d30c1acfb292405231a70d60752f29ea1109e2998e8f60c85b8971f84c0db33142243e9082c9f981a50f104b8672804860f28706282b04231e2220b0d547b86425c3c406249d46acf5008b5e2082d8a0062cc9859f7538b7b864264aae041114958a2648a7f27b32f10bbeffbc384ee4642612e2ca1b30ec90bde775f83058836f70498b34fc848ee1ed42a4f836117d6c00ff2f003a005a884ecd8c97ad429542300000000000316000018140e884442a12809b34892740714800f74964e58489f0983b1248c6114454108196388218600421031686868a80362c38cf62dfeec04d62ee8ae287b1cdbc2f81cd923d940061804abb7f1c1b1cf24906d237bf60ba5c55c3e83ce4a3f02bb6bc86ee24c7eae5d968b16c837faedcdd339865271366525defc5e92aa367290b9bfefd05127db89c9920ad5a61d4529dec40b8b770628a0c560b0f0d27d3c310221ff1f8d7edcbd7a9532c5d39a7e633ba53424a751852c7387c611827dde102f1d085d422d9e10a5118ee51c719f915e5a41f07148c853268f486f7e1750b5bed7967af9d1b65d874c6727249fdd8be65e7092e32382921307d6a58e957e0211583638ddf8f0f2e80ae111c7f734f0a2c6dcbbb5851144ebb1297722809a22887ce6da9c9407a03c8d8964acb6e89c5021cc27dac8aed7ec51a7d78da4ae0fdd0916d8fb15e0f44013606a65facfda0ca02741c81461456a7e2df002723a5a459e9dcd5e3ca05676587493837abfcce19d1daa7b1173fdd4bdc468bb4cdf891022d70f2d8b8a380e862a071a8157db8b687a4f3b7332bfc352d27d801ef45be0dca2a2aa7711977c5a749991fd38a6af65115be52770cd80048c04be011180f6ebf3d8cdfc3588828cfbc7e44165a0bf4614c5d3567e60f4a9603daa72c03c230fe1093ab4fac6f0ee9393f039e7db881989a85cace016e353787bbe06a3b6e9cf3f7d8d36c2953e9571e4d6da536ebc4531b9723eac97577636e2707d5e0457476b1d2b87736c8773533b979be19b07cb78e501de2a0166e7fde671d2109fb0e6820501bab84e212a5f82cdec0f0c8bdc86157efaa3fa9b8840dc8762b0331a06f1bca4e4f274c3fe1a98329af2b5766e43efaa03f01133fb7a981ad67cca52f89ba0690c41f92473f477e8839c046b0c3f81d709135abb6835f5a54ac54ab749d0044d4262085da65e435336732b857cc2ecac069caabeb11064e910a896b82ee71db72f4fa71007371690be6ffa4bc1d8d2b866fea997a66e4dc0ee2944462c6806fe1d8f726165bd874e3121ed58563c36d4bff601d1df98481ec79c70a5acca35aabab37d3a81fdafb3e6ceb68b5d70e7541cf626a1128e43da2631a335913b8799abc08842da4b7d3bb2e5efa595a92877cf7dc96cc993ba2948c886f2292199038e93ca68b3a09c4561b022d9555185b991a18de2f960a9602d2aee08f9620e5f227a257112dfd8e625eddd855d5f3bd199f47cd953d56017449241d734f70c267261f2ad581374de94f673af7a3dfa20e1bd2e74ed5c58df216083fad72114fd5a4b4719dd1032ed2550dc1b62207d596aa60a0dbb72a8d9f8b39c79fa5d900916c603e9b195e459e329affb05b4bc0d5294d30ff61b3164b35f3d3201d604d1d48c0024211002be333c086f27f658b77400261f7aea9f9917d422b31ef0dc7c3bf36a61d1a4b33e66383b8ac1a80dd96002fdd9256afe2c632b09a10cb0bcf44cb019215c5a73d7e408232e94e08c87987d18fbabc476e9a0914c708cf7a00f9580de2cd88423540d6f0d99f30e4a7617b03a2752c84ea4d80c15c3a9dbdc780fd385d5ac2533a8e482ac81aade70eaa31b6c1de33e9558211866872862ea1a7876b0ef243047b16d9f99843fc26d215e0c4976169e5b50737dbe5f26e05ecac4a031fc9fe73d029a7d831e863517cfc848e22644b050450d9c1eecbaa475ddabf1399668966a2ec8859dbaba78b33ac0c40ec08547dfdd3ad367d48afbc2fbb5f5a58a40afc1000d56354f52f651aa200f4a1c7a0bdd1d1eb7199289244dacf981e07c43411b513c2c52bd586a961d6e8f261ea8382a6312639993febfd80595720b8bf1664987250f771a68d713143d728ce9253438193a76f6d34f8af22adf3f531b943c9d0cddc889e71dcc3f74f1455e7d608c0d794f1d7a7bb2bf429a5ffb730470a8b3502cf211620606b5037d1b6a0bda16f21dd42ec8ed101ba8f69077a0b620ee43d8f4908a20d63c98145687db512a5ea06822084c5387f6e379d407e3f04b8ebf5e7c043ef367ae7d92aba9fc5dd2ca792641376d65e0d33a9dfef451cfbe572c56c2d47269c0ab2a745cb682c653ee450936c354bcfda1cd38371c81beebd8d6dc439800c2287b4dbf86ad0ce58a9ff0532699610ab5f4af65674893a4e515215a1468f26170738a049f98cc367697a15e7b6fde11a46de8c7212a3e4de12ec8192b445cf9bf6802eda55cce25a870ae9cc14b4afc23ca6d84535a29fb41cfa99ac87eb0482f054457ffd28f6a55014a5d2980205b8854df006ec9050ae91dd1d7aa697d1ae513d4e2c4bffbb55ae526c4d50560b67139c69f409988c637e2ff7f83234e3d1c6103a615e97d25d014f8d4de0d663442206ae893a6be9af551643719633095d81822b32b009f49c759880112f151dec780922bb59d2ce1ee246639e35fcff225defbe0e6e9fb82752759e38f7dd84da748607ff0d55b7af66ae8929fc66bd00282904f77855c681d87bde2f6b6d7922e6af1f3513b483c7eb1f61e34d9b8496edf3b00d8bb49b21cc32cb183a46335a41dc26ab7009ef4c8c7d52aa91a08ab8c387b921ab19ac4dd6bdb149b2c8bc6475ce6933863deb316ae5cd42471794690d3ebab46189e933c1d11c9ab8e622197bff48e8a911885095829b183a63547742ca7975653a745bd6c2cc67b36c59c406d74a725a2c5eea33c2dbcf9a1b7a4b665ea868797c46c0c0eb1bdaf96bc1022f6eeeba8d36bc8bfae085ee9c7d1f6a022560e9336298c97ccc5f0b5301690d57d03a3b7343bbd32d083858ecb6342022ab2c4906486a632e679529f34655640301b79963124300adc688b9df7b87f1024513df16dfa42e37c7a51549b512e7ccfcfeb0fec8dc6fbc11dcd7249640ed060852987c74be062d09e52a565fb8476740bf2a32623cdf83849df3f6ca4abbc532eb056f71a06711d8125e00b8ee1ac8318e1c8d9e81629af08a039551d0856d5b026bd449f9c0af48f89853192b691211ed0b0e86fbfecacf92b296626fa57ebfbe2f74c8f17b08b07c4d4b6ae8f6fc5d06b863b5d479cf54026c6623bd208c2d7b92c076514d44a651c272dde0ddd3b05fea70bef4647edbbc96c3600b7dd755f73ce8f406b44b81ed7a1b0ad41e9a0800292858dc00efb53fd8e9a9ef138deafaaba659f6aac9c50d34c142f64fde3455bf96d7e9b5aae01f68f10739451bac338453c2f214150c9ac7affbd5cf215f37f4b6fabfd7b5ce9caf62112f47aff56d7204a903b8ec3e275bf59a54191b5fd049ea21a92787b1ae40289f04448b600211fa930122aa91367ec8f9c1cb93d0ecf54dad9f89593112c8b68d371d59e8c1181166f144a052b174b107a81baabf024e25357d4aef5822b7af6067b7a04ab4facd49878b649993bf6ad6d1ee1971d1a4ac6408bf84a84276ce3b45f16265b6298bf4e8358e9266d593e868c5e5ae314b9c01b0a91f181665c3c1dcde73dd258e0a6606a38620006a874312ea06f58a3f5a664e698442773f1d6ca8769beff242dc706692cd77a2b60f10a22c025c2fd474dd617e70210b1c50b9c4742ce24590d68264ea059e4c30ff0229c0390628c1bf02ecaf5135f36da007992ab68633baa8b965fb8287d6aff254827bcd23785c6e0d017fa5b8db81bf62e3170e9e10abd6e799ea3b76979ebfeebff738582bbfc0b6e73c3392aca85fc7f195158579f4e786645c9fd51e8ac5fb7a4142d77701ab5a80d6da026846efe14e78c19bb4a8abfe8615ca9ae88713d1a13afe3a787d18530db8048b897e51e883525ad3c2b757f963f0c08c7a8c5ab07f1d9d93a10e061432b3f6e209beae18328d2ab9b6202d4861225939792626ae670673a827371a19a3ca9f566d695b2bac512cc49335e3255a5c3ee6d40c9ef93fb0d007a5cbb53f3bf3305a22b8a5249b18b6989ae30bda5310886d8e054c3c5c6807f41fbbea75af30190877fe5f91a8a8e3be2c91f47a4cf06af2441cf0a2edc70ce19ae2cf1ecdd57631d04b48781a4ec5e2a3692f60d593e57e5b168a6dbd673bd289604dba9045b7260e8fb2038caa9e072877059940b26f238ad9a4b5cb6441617bca8dab1518d63c3bff6092c5764c6c9ca648db91d7198734a57573c09461c93ccfeae01afa525b8aa18da4e445a0e53ede97da179d5a6acfd09add130b7d4901d4b1edb2b0e4972eedf85657de743ecf974409efa5f6d67ac657437270f87d403ed81352aae8135bc1e022c6740644c3b4d0f386a5278925ebf80feeef5d42345de430ee847f8f9cb94ff27172ff32cb6479e8df784047b4401238b5fe102324561cfd874884a405df77e5ad847d36cdfb4f73342859ab9dbf4fdf10db988d7ab5f20c06f347c05e6bd98689b6ee98a6bb435d20848dea14dbc7db2c76f5a95ccdca1e48fa3c62120c1334a9d932ee881056e42a97a04f649722940cb9de3b6d993d11498934ca4da12aef8fbb4d2f871a2e8e8e59ce0ad81c0af160e81fbe3ec0134299f076d7b29dcced8869c548054f09cd10084c3f2de9ba34ffbc3ffa33c091a74be55a3a8f81f8dad07afbebe1bf3c83fcb61efbb13987facc88387dc1167941f42b181fdc03e0b923a48b3874ebfd4c7321b6c78a7e7dcf4c70beaaf87e8202206af4b92efb858416f9830a6d8da5f5a8d9e6463866391de5124f8abafed98f32c9f9230d9a13ac82d4af5a7104235a1064ed30d65d100324b1b47ad0954e5431d697f8d2586720e4bcbd816a4ede8844e7aaac43368fdd96c2083e0f1672fa201a606936d866346ccaf9246f900d95b0a3cc74f3918d0e04fe629b3ee75d07872f9d28753ee3d0c71fdb20924c6f5c3d61990c5c85ce18a8824bf76cfd00ebdf8bb616510282289a326ae54de8b4e470478b0c3481eaa16e94c458d99ebde8bfbff7914752891544abd9095065828a23e7bb8f984f571a32e52717ea69596521e3a35445a7fa56e04152eed3ea2386675b21f81194f4563cc7c42868daabe74f0c647ed7f344c32d4840a3ad1b45cc36282183a647745a37fc0a23943ac77c85115397acf5aa33d20688286c3a8fd540c845a17dd7091da272ae6d743f46a519e6d5e48678d5dc93ead0fdfd3fadb911c64e0f9994456a4d1d8728218d3d4db29b727caf7d27bea67178a0143eb6266d19e77891fe411e3ff8aeb566513317c6a30ca1922fad81985e5a7d6e4b9cc6dc824715b8a9217aaa83520af156efbbf0f9491b8fe81aa35d041a0c7e09247c3997be31716b8b3f1d0d8ef593492660a59306ee7f02c1cc560edb0dd437c25cf1529f4c8faef0165e076beb84a017331380bd01313f228b0f7f88b696ee06666cbdbc29ffab4ede910bdc2dc8c86c77b4aa45357362de101eaa86feb72cbb5ae19a4563e647bcd75f4023f93990799b6c9fce225d18887cf5485e550ffb94c1573828690736832e488ed0a5ba7323f4c5453f40d10995f355b430a4901e59a53696331765e45c89e7f6bfaef6e4686bf2ff3d6aeba710b0a5568716c158ef6609f9c07a18565d83306956cb368bcccf3c3c248766e91194cf9f13e2fc8fc79556bef1e388ec78bfa43774efd91b58108597a59f282ce2584728176df95f3e406f124d3cae3abe9ab62f66374c4bed08f3d74b33fca6b45468853ac51b1447726f26ae7028866a9877b9be0897904045bc6a67db952fd0aaa600c9809678468c70080e2cb80d72091bd9fe6fda969f257d41139e0160ba0de178a68f270b68c5ced59d6182d65848e4107c1c854da7d450c5ed416027ae1d7f99edd9e4bd0aa62d552259cdd51528f3a3d2ed75fa9510eeaa8a694782f0dbd1592cae7ba127812070dbc1e2ba2cd48fe2a453598b4f272f3c5fdc887f86ae821c8f7ea7ab8743cbcca28194741fb55062be199ec676678745ceb5409f6df647f493af38f53996227ceb25a9588472fc4ba815220d0bfc8ae68fb39b500848547e14bde8d2bea772bc2a39a8f8e2cd1315f0a7689c530fe944455f9d0be539da22ca44641732b05149cd2804851bd7ee9deeb51274cb72e49f41d6a3e739f4c6686ce672a63547433e59c4c3318ddaaa51cf5df2723bdc33d56186f76dc784304c6b5621dc81da56c21664495b47088bc4bcb59c5dca8c2ef9ec64c9dd3474d023166272f194e76ea9940aa2a165aaa584c147ce7a71e36d37e3bce3f90365b648c6b213d7d49aa8c7ebe91ab3a7d528d2c4c38f4b38a54228dd5a7137dd484038d9e917721de8c425c7d9e1675fa5e58d5679babe66f6a8e54dc8a86c89a3df135439016d39a8c4f6e2a1bbd7ec83d43f43bfafeb221f8a400ee8540ad9176d9211ffffdbf4884a45870be897e6442081493f50d01d286502ca432c21045c554863821234235cd109f025f1e076deaf9ff873cb6522390c8b0c87b9b90e6ec29a5e1f5b8c5352f859907923e457528bc899d2e22a4140b765517ad393aea4983f88b948642792652cb14f4d0d6b8e4ca4902d04405861b4ccd012de4cb95054c6b905125e8459c947a1d6679cb2a5ef8eeae13a4de2164a1cd003c46d28d16b83cc3490144cc676f5de2df75f0e133439a6f2720b88aca82a2fd0ab1d55446b43eaf080d97619aac2ff124595b447e37c487b148170a84cf71db6b04a192dcab81027a8a1d0199e77442042186cf2ddb361e27e8966bef577bae34144184fe610fca8403f38930168035abc0db052f5780c38fb5e8025c65c7679e8b86c173232c6910cc8f4714782c100040baf1ad57d9602b34f87d9166af450112e5430f4a5f6a462cf7205238576083ba70a42cd3c9de8966b7fd3e4c1fc5d505cd1f3935f08849ade84b2ce056620761c35411f1c255039a40a2b702dbfcb2a177240f51507cb9346f9b3a8257f7ade0891118406efb705e6ad07d2d05b154b8f1e1dbb0b36c1f129629d5ac91ee2e11570aec509d3f091d5d68aba187cec3592e6b2fd02b2d40538505bd441bc664df822bc629f85f1d5f0b964850429a0fc90a34d40c5c7a1e17b8d3c2dc7a32029ea162087dcae00d3a077f0bfab547fa6f69f3e0b691e2322bedb61dad989da00c6ded4b620039b338beaf31cecaa1ad44773e6589b94d8e8a6f62c1997857028af74a63d46935f0b86779b3e421448ab8ae3262ecbf53d74a34f781e897e355e929fc532c1154f4133839ab6a8c8cd3601612e6495e60923022b9172d3efd1c4d7b44ff35ee63a46c6702004075c99ba5964fdd74993dd71a94604246c0c3a98e2131ed41240bf1c11d12fe8047593bcd12180a581195dd20b8c4c5b02f2d8161f72fbcf395b38e94da9c46f7fe9f69913992809aa3a745d881f67035a2c9098ee33a888d0f473b19f3f0ed970385fd2e1c83726dda2654fff7ef5252700c9254533666fa626d74732193f51e1449f27caade82b0520766808f290f1e67b4f4e222229f07fecd4cfccdbdaa04a8980c9b4f5751077c6269869ed077264e0cff72bbdcdca6dc7fbffcc4e2c18a25bb29fc74920be0d4be317a6e13c66c344eea2c97ebe11ee5a0ff0056e7d19b9631c3373f82c9911d38761effaee3839e70e4b55962a4d55ed8be5b444c06983aa4be71a5900ebb2bc826cb222f345d29f7b1763759f15b8fb29a7e6f78f3480469e154a7b28cef1c2f95cf84b7dc864b6016a514320b941953f7005654a48b3e13126f0ad07516d744691875363379b3b82fc8103ff2d0cce3e73070b345fa2937411f0c3aebd4941e635f27049d5a88b9e3f6329f7400eb26a99bd8135bafad6345b15fae1359f3af6048468cc151a6e89a1ab3a42429b3720960feebc85ffec0996362acbca3b60eacfca262379b808c26a94a7885785a3e436500a3136c7df8d37c8cae719c53ea5eddb8737b49a6deba1c2d9e0a12763d6247e798ee72475c031b33edbe34c849c15e3aca8b038710d71a429de362a3bedef0318c5e26e3ae9ac898d441e35c01be4fa20c120d748d91f15406ad3f9affe90b38455d384b70a01329d80daac29ee7e38dbd798b07b4667c7e916e1a10225d087100a599177f04dd220fe979a0457fce738d251f84e8f46e3f49b26a0258959029b14136c8a23bc57c36a5851081632aa184ca51e6088f07e5fad92ac9062daec7b5259f7cfcd9b1c25f40fad3545b3c22dd0c877ce914a8b5c3fd38cb1842edb149ea89df6da64112df2038d1d6ccd01d759a357ae0a80bd2c48787d07d85f030fd581f8f69aa8ff9e1cfef03a71e6e2f3b3ac947e96bfa925bc3b5874891f05be9d5d255f1d9e889aa440d9c6ff2ea484b39c83f44d34b996cde512db6e1d8cedfd32d12a086d7419fbd755cee5ae046f8968cc21fe2b87f542ae1859d8f8d22bae5407497e7c224f90b727fbef344f1ea76b53025dbb3701aa2a4dd5c2edd12fc55b4ec3dc16ea30818407c9d3179f7ea7b1603f5918e02fa99b8663be73736d91ef56621140c81f4e3c79611d87a054410eafd30cb8ad2eec45d46c371fee3cf2712860db891646d30ee57504cc70dd3a139ca57b1980813fab68d275a6df41c3064a31ec82bf26f1d6920724f8dc53cb1dcf6642d00d89208009aa89b6461b314417771cb65be52a0cd79646b85eb8904bfc85610f05dcedead7b836a443b856da36d9a0c3a4290936da301d72ad28fb0700b31c766d8d674fd5d2bd03f963021f55e170373e8081778169d8b43b150601028aab6853048f3d71f888aa7f0b632490e1fbe5168d6214c8900ea252b00ae92802608d949d81691fd0b6020c296b4c3057ccecce2fc7666b6d7c4a2850d4f0155f98e47c17557232951338ca8f5252d11b1afded11259c24ea8feb847e94d269222854830447d33a3a9a8e13f34b5bd4e9e608a81d2579650b2f8f5ed42a0f78d4f02fb0bc05334aeffe695c6d1e56af617ec22ec2ec30bc07cac2d25b8943a7521ac3370ab044a735b124a9314ded92f08721fe98120e714eab17fcc832a5b080ed54d68de776df2224298de6800aa62332fc0e4eacb220f04a9fc010418dce02a38bb32fda9e54c137d0fdfd8c5caee9dbea687649dad2a59f7c2f6a7aef82029d183320e6ebadd1fd3b071a391cd75451991bda52fdb5ba8beafb7df7239cc11d95b9e687c425f079944286e4ac377b7e6e9525656c4274b8349421ea3dd9b41b84f2651b866b1b985195000b2f8906a67a3a2790d8727f51316cecfd55ce3531ba89980c9f07270bb2d42c8274584c7f186d1b072d04d586769e0af5533d101aba263593d9ce85287dbfe34e5ec67614d01ae092ebed5f46ff88ebafa131d12aeab7faf20e2838590398fe3c7cd4f5545ccd928d7458ea429d5e0329de387a3c1167b217a16cf49010029c5a313b8d95bd9635621e6f8bf7d78be89606413ed4b01f3967b35cd514cc585e81586f232afc328ebca1487f71ca2698672992bca766e29c4e5d586433381ad9987083b69b1d5948c90c1e6be07b64249ff1b90f55b62dfbb1cff0d7239e98b36843ba8b906b2479762e54d20ad2050363c5b62237a825b1669689496d77a6ea14c196f9d3cdb530a73adb430cb122c9c5dd8931d7a55b16d308b3a6288e715cb1900827ad4658512ef7d07d73a360c68161f98b3d79049f96473c06be5b9096bcea358e636663462bb0d6f427ccec28557c2b5e67f91f11f3f41466f8c42b30d2299ef03fb6b77fbe88dc22c379c4f29e360d43cfa70be8f87bf6e46662fc281efe4cdfaba3f7864c387c479c583a5e3b3211662e88d8a6fab0b3b20017f7558a3a3629095c437cf63a1c455d7e5d0fae5ad6a0ad388f8b6b054044f43269625c330bfb6896f7e35f797c5927b38638527dc4e3b3c7739714bbfac572f4601df68ae3449bbe9a42172a4f436c2690d5db508b7bf67285ff2d178f8ae073ba3574c685fc0a09654f287854003eba4a518b905f374e7c322b4f14ca81e6384f120f0d569ca68d2ca1752e3753d30ca9885b716c01b7a0768b12555441ac78fad7f989fbd8f192de24a8e6058d4447080dea1ca878fbe7922beb78f0bab4daf5afe57dd0142487ca85b93ead51e9cb46f7586c3d623fbf9f63713ad19c006458c0fdababc56a191b42a7f49941048d49bee24d5b78af8ed701f775947b19112bb1bc412afb341e20ecd4790ecb714201d7f1086564a2f608aa3426572457f53b4eb7e4d6120a86e8fdf574749ac5c02d9dce6bcce3a8e4c57ced6bc1fd05458b0b8de479063d330d2d5d149c71fd420168b8227d501715aeda669427ed8e09ba2b2792ccdc14faaa220b8a48b1cb0310109a4126829b56de65a9d3e3654d8206e2f6089c7ba8a2dda76a1e1d0b2f749ba889c584775d5306e98a9083840f3d410806d80c09de758b1790a96548395b79e0b02ebd15d5e383ee83e1070d1cc72390c1550ac4913428bf31e63623391a75a1396eb628e60ce59ae2dcd6e8eb1feee9bd7ea10ca2f1f1e6ccd9617a40bec31710d7196a4ddd8df209dc1328d1280c6bd7f1050cb55303d5f8b318124f3f33981d642b90082bb77b3cda3abbf91916b0413e1e4823d02f7268fa264790a8053140cc259e681c98836bcff75e903501852b822c09db56dff84aa58f579efdf335d58f62d269fda21501c63b74eafcf0b1212086bbc738b9f2dfb05d8240b4935471ce1bc45c50c628133e0afb63afa013bd65b433ec0c8ec594f5b6c5955b83f00c655dc28bf0e9dbc05976a7f2266deac1eb81dd9b5cf7f2e28ae6083122b22715710fa67f1e43d92de2e12895c11f0841910e9b99e19670473e663fdaad5f37899dae5a1332ba15227cc1f277b9a9ab70fc0515cb0fcea742b88384aaa7db371347d8aa814e48a8d97515dd219e45c5205b64eda0a65824366481a983d2645932e16f0a23f3bbd5a89cfbff89396e6cce086a28d816a3cc90ae7b0fc3d9ced11fbe1e51f0bfc5d5622a6f8a68200b72a691bcbd216ec919d79caca09518e00153819ae2900e2a034b74b63106c6ab583598bdafe95209082835f3f753f139a18595f40c10d141c711193127669535d2092478ec8769d54c2e3135e95f46be0fbe8e4a30c1c3923041e9528d491f32ce28f130a8f8641ac1ef91d7ffc5d3693b0f0e58704dd435a9e48947b429eaa4aa4515fd8d96860b224ed6233a8213830a7ef9bf9354ad366b132e4c50f3a1a92c207b0e4407b880b57a0af5fca2189b24193f764a73614cfc8587ad52c08b455fa8a0d3a1dccf35b7ff03dd5cff3448c44e96097d4da6ac4620d6315ace47f844aff0191dde447ca03fc56b8f172de48bfadc42287bfa1b7157d0d4331bb60ca6b03df8fea3f54ef43f577d4f71a3510f13fcd69e41cb493770b78e16c937110e8e51819f57e38c7e8f3e863a749bd350571fb01eb9c4371decc4ed2f379d0664cde91d78c0aca37d916b265f74a420fb073014d1878bd42d13ff5da5eff68afd7d1be50cfa25eeebacd216447a8854d709393f55740d231612df2746ee1afc93661eda0233c636e20257b12a07baf09aa784535e283999907c83a63c211b589e941cd3d302cd0bdb7d8ccab63b7de30d68caf1a129e9421ce892019a4fb863791a433261ce011c99a953771b461d4886eefe2dd7d87ad0cd77d468960f71dadd3e9d31dcc20d83bcc0b02e0c8b9d38db7ed8d9a1aeead5c8811025d91bd3ca418f803ec9c553c06dedea192f1bc8f0ab1af21b12ac32d1ab93cdcd1ebe341b97871be3256190773429134812e0eea4f688e24ce1edb7d22135f3e7ac9e8fdd4e989e553a23fd292f4769397d09eac5907428fea74533ca6d964364ed6ab75198cd05302b2cbd010b60df2b0ac0a941b55a81a05d2458350093369a0d6b0ed5ec9d109751aeb48cf05cc56de57cbcc1fd42fbada819771e1c98864e8f54754e35d33f59372eba328717307b845e61fbd472fe5dc96629c5e44c5a3a36c8bffcef13de450c0fb330a65d9c063223282aa65d331fbf1067c01e020bb861e6552b5086395e214251176cf0d55e6b84ce1979902c0110a9fb2089015abd733b1f8b587071b29176a0fcb87f466bbbae32fb868f6025c8e9c2fd82454ee61885708104b51597546634530074066583d7f337f37b59ff2ec05783b3b9484ab1d626704361dcedcb982160f6a3b978789b48d9a9d7151b1609847d21fc9ef898d53e75eef3f6a3cd6192d101596abb5a4a1b7f2e1a9ded4544f10a73fc034d233e19e039ccbc62f294caeeb7efab74b474f8d55181c36fcfe73aa53502971a0ab4c9599626e088ac63d6abb0eb33f5de106b8becab07927642c5d648057c20884aa054078e9161048c3d99e0167de907677da295a678ea2e7fbcb8f9a75a9587b4b8aadbecc4177ef31f9bb88e9c173bc11214b3ce30bd445bafb91a2e5a0d94eec46e88e8ef6049de6802af043cf975b751db92f9e3945092d60b4386c1b2109ad18b271674f1ef70da95dda50ac597423a3e652d83d69340dc378f148e9220c71c7218c66e941c92f01641227d6bd9ad9b3bcc3b8eb2ab07d4f2bf2e682a71d14b5c9beed475081977d8e88ec9d472e5604c0883e289fe96cab097301bfa00c9e8074264a965dfb1e17e5043700dbf2662e0df8b902aff0b1d029257d9924e0777210a35cd79496482f84f03002094e0e1c28ebe0fe0dab6fcc9943cc9d760c8b5232f09d416a01a11b14d0e43f88aeb84d20471eeeee0f55ed3d5ec3690669cdf95bb21d3143a0ef55892d0e4bf50ada37beffd68c78567c2fd2d03d9904221870502dd5d2ee21a18a2b2d1de3b16704d26aae5b2968602c6747c0a579a2b4e3a35b29f7e6adb90ec4fd88d2a5613c9eb14da1aaf3136e4c9bd3d9cf97a08f9f017f29c35425da4f7db30be9a5bd3e9efcd2f6686ae224190553d7c2b785eefa1e539317c4cbc79e4509cca6be09eff7e9b46c91be6f2acbe70571a944d6b539baae871e53c080024fe186a4c611fcbbd2d0a12e3660ddaaf1ccb2a8c0e029529fac5bd25c0905aa2b0ac12482022d12188615016247800377c403550bde4ea870077258979e0a6a12c950f391555ce2e2bc10241ffbb7bb1668e0d65d270d4d70cc970d4be202d3e9dfd461a64b2fc3577c7866e4d2213b35d252909616f929c84a8774cac8a5405a2ad2a7219516f2a91d59996dc5a26b646307f8ec5a20fb7b55ad955780bb4bfe70331e8cda0adc57d49fb803cc0f08226ed042c90780700f20efb916c4e990fa4ebac10b528b38c0373bc5f81f9cb3548b290f6cb75b7d3235de8e1506033759ef032843e7aca700536268bc31464aed4303c5ffa148f16c61fc77f89612687f5183b92efb422f76023eff7e41daa26b69d61387aff2918bc9aadce26acb1a59da4dfdb3ba353c97d4e5dd3632d68f25b27f5920554e2adcee6dd5c273f2577df9857750d9b714cfc5a26c4ed1e19bb963ee385a9b09552a09983b54e452a8216ee8ff2ea83e07f7516b28703bf3f19400ad4b85f98ee01b83c111469ff42f4e18a42e40801bcef1c9255ccfea23300c0b37fd1e892ca2186b526188f98a53e2cc39cc3ec4892adfbcf31f619adadff1da4e839e4b9c378ed88cfe0d69f19bf969685429676f2e3dbef30612e5b9745822a8533214b1231712a40270710d99b08b83fbf645b29b53592c08edddffb278c89fe80391151116d91fdbff08fa5ce2a768ae7b3bc1b5920a543d65b6f8d02c2695ffb978ba9256a78c92377c8ed9ec70dd1fd6e92b0125a1955729f7462ef303e8bd79f829699c9f25eb0d4fcae83a1a0ed4de4d7ef6dede2a82f6b931c5da9d09c34b5592f03e4a662d107ce27911e4430baeef1d909845d659d4281f3ba26eabc043951f97c478bcea7131998f51be4bd54c4e743e0b1294bf363bdced9d389cdd7bede86bd8e515601a70ab8c72ff3aa5725c7b7dde4906168c4851cc0e27511e6f70278edc1b9197210b944a38c4aca5bda9c60a39def30b6a167148662e04ba5b73cb7381fbcb3b259a85df96f835364f15c91a85b0fa3784c72c27e59496408974f76d6b0df109f3a27fc77fa09ec776244df3aa1b98d33f4aaacaf8a8620869b6b797e43af65ca523bdc649c008d8ff4abf83883b60388a41cf0dacf70ce9e74201e03352a94c1b9d510b213e56c24cc1acd987242ef153a3abaa849165abbb2c469b97bcc9603fe630f0652636566ae4763576ecc053eaa25601975fbce0aeec538647839d5a3bf6cd78ea5ec37cbdd55957440f69bc2edf6ff523b3b9858f9905617d15de61e0a3232a060bc6027c8cd504498da7424ef5d393771f3c75043474ecea4bf5b56ceb8d73ec3242aa130fb54a973e905b555c6a88aeda7faa2619c7425fa39a64f06fbd72d7999abc58b1d1906545740dba912c6fcab9b40d7cf764303ff4309f13d2c7f938d41760cdaa08c0c473f4dd1b5d1abcb047f1100b658d9efc5a8d635af96ab329a03d5a7c0fd185c926f2a1a19461c432dfaebb010a47c753a3d67a374361288d8fe97e061c8066368bdb562f1af686344fa39b9071d9844d624de9ff93e293c0fb3b2ef64a1cb1c8423064a69b6c38a589625a2161a72c4bbd1cbe87d2a8a9ae02913cba600160db18ec286e4bdb15d0a8e19a50150719469f0c8da5276f3ab7e1e83156bc79add8347a99b5d2dc9c7dc1092b35bb8c912351086e28f4cf040373e2228cd6a85580479225ca12f7efbf225dd1a068afb8684b37bb84906a3fb0799666311b01213c3e8bbd17ad4ff719adec5026463ea3d63ef32e78d3378401ea5f210291e5d8e73f2b5e1a411e1a6da6afc9ed994c2d96f6c12b14cb5b4c973249c5529f1049f2040b23a6073fa55820325c6015d77f2751ddaa259d18cb7477c72d8e5b4925ba1832130d503585233c638b3fd5c4c89a770914ed21dccea5273199798adc8163c7eddb02596028d7f68dc19bbce0c1f7d94d61e7959373f853f0b8f84fec5173d9e32ec7ac54054165a445e1341e1f86947cb7f003245743bc77310f85c4218b6bc6ba2a24365b33c6c6c9a9a6f31cf4c15841c8e15a4e1f8415382d78626d9466b804dd787a5d1dafd33cf4d00338fa1fd278f3cd396ceeda161883001cd739ccfa07308453fc2816a1ae14474b42dd8ee9bdd7abf9ae445076d605cae8474335adcc1089d3b5bde5e9d546b456cece76edcb11e202e47d07a63cad38427e7f37c7573f8c1009f61c4b32528b7b7f2b9bde72477fd31f0daaf22da5481270f877aaea41859a09fc8f4bcf59043f39ae6ace91e9178ae03ab25c0dc58970c7f7711fc525c58c08109f0743cd696e04fe9074a7f48393e05c423f219ca3864c536fa2c1819ca0b5a12b970e2b2a30abef9f139ef18fa6338d50a7f25c54fa425b1a7b1be65ff3eb7f5b2d4ec3cce1926a3cb5871a53911323a2dfb00aeb17a46bed06f3bc90d32011c8b6e946824aea87ece2ae471cdc2940941494e5d939dc9fee80789f193f331e4cda9a8a7c0fcd9df4c7615f56746cb7dabc39d7bf609e9285ba0843ef14f170432e9fa87932680639cf98869046d213fd345fda5cc425773a17c02bf8a866fb85361c3ac5a0b32fe70e541faaa97de9431865bf4a8323ff70a2d5ea554dc50c96ae58e4009662718c206eff223046f4b3a586909110288f17f968b0fe6df5aff22d937a06e49694a4adcc041da614f8a65a0f3f60c34a914a6ceb9b55cae040dc09afebf80eb95760e579aff0c646c37b07723ef3eadcfbe64a240850d34e5ef037b84c40aaf51051d4f1650753212fbec42b96692a76c1233194e0bed1fd5447b01121aef92cfa4e20511ceacbee4321ee7df2095323b4b2a43684a25b94aa2441c90247705c749fe9dc849a5c76d35a42839a75a8dadf169cc0ede7230acf54422d28b429b2496d1923cf3d4bbc0fd54da3ac70c3520471ef92dbda7d3c2ef7725c244a3707af58419ce5e3e5e899b49944c5d0f92988607b2c1450c40b2814a0a8c327f875a6275100c30523e4f71f4df06c6132ee32f139e150ce3881409a60bcdc57a9604efda03c84084e007cbdc31262a916d6ce9bfe19d0e2203285d6871614f28e905265c1ca1d4eae62472c9f0f3e97168091143f6dd41d217aca4dbf3753b9110a831137ed2ad00d3706cc0090bd785e43fa6c2ac5bb7723f5befd3d00e9796c4e3665f06e088d8887ece6ab7be3c3cd9cbccf6e3193910c6c6f808dd2ffcbc5aacff7b67b305e2f30bcbc67bb7d8e3cbf43229248b52245b4f0366a01d285a0d92a96a5e599ca29d2cf0c6677a46d9baf950ff29068b9f3aee0614261929ee367ada836a7b89303b8c2f4710d0ade5e0ebdf91626ddb070ffdab17c5cacc528e8702653d52c4d1be96180475e55bd2571ab52fd9501e89eadbb35ff12068e0c60de145b863eca4d231ec1c05065634b6d7bb234c591be57996d414cf3a2dc6e5c2f0b8dc234ce2f197ade6e9d6f9e2d5c9125a9be5fcb59447358a0b005f36168e2557f064f8ae63f1b2f0ec6872e9f5f26ecbf9c81b092b080083eab678250dc734b64d0ae5d0b8d57c0221dbbb5b6bdef9f3c898a841cba8a09148fe833332f7807ff928dde30bc9ae178d69b4a09cf0cd4c187724fd8d733a80d0db613d3e27abe6fccb5ad06e2b037a90f894956169176051409d6965f2316816ed057f69fe2d51e5028aa445b2357c4fa05982dd538bdf8a3061c0383df88c8bb06b50c1f955272df4ce785cde8bf266d7aabfe06d7bdb4a2d26e4cae874035f820126ad91196c4a8ed413edc1907b8b1f7b0dc7ac65e7a679ac60ce8d2033781b34cb98025dbc7985f648265dc432a4baf9025e5a300f64e9c6ef10d6be2a73bf617cc00176299ad461c1e43be22673ef750fb8bcaa2a539539bb107e0307edb98002df8fc87aef1df1c1ded41b849d6b9852f47ff4b4d545bd9d808237200804ea4662c37dd5bff5c5c37ae83d60b401377719c92b32629b3f9a65044d9599b94b1492f439e93caaa4102093f8ca5a92cad3e200309a709e3c4d6020c52e2dc8a32b333fee1ad10b11aa9e5d8b726901b2fe2051a8f0ee1436f65b48111b74ffcf50b55198d139278ba9523be3b4c228c94894c5a22fe994a31148e7a85a43bfca06dabe3073e28db2620702660750d554de5581c8b70fd381896731ae16267ddfc09b628da179ea1d670a7659f0927f75c6fad0a67e21af8aa072958b10c8f9e9e4362dff7f547fcd1699594c5a94254336aed05b6afe24e5058a0e2bd1b252f171fef37236e0aae53deb2ac0bb4b4012f0785e8d8ee9e93a655a539bd7b82ce6719b35977d3f01c02be9080158fe59964f93e5dace4a54becbf22d5ae8de272189f43f85e0817b217023ed20c741a612f09a6b30fccb5a1dac16ec6ca8ad809cfa554cccc75948e54d077e6010585cbbd698ecf1607079a1b8825e8747486a8558632382e019e6f101a8ea8c0006adac6b81d2e609b621bc4b07cb50a71eb4923bf36d830fdc9713481a917af5d8d7f25365b32a8d6c4a1c14d1f6e5f88c3ca94d12b3c44dee3e34f0e0473c468a0475588f692541e2159ec25daad2df3246fe334dbdcb01f47d6476178b18c98bbd9814cc9ea21274b847bf6c175db0ed29176d0671f1821102aa2d58ac01b61e3323c39b7a3d95f081a228ca22ddb0c7602a1380182438cf1997f2050b52c15102c90673ebc4f9281d809e4119914d36930517867f707f38b9d968d980092dd153bdaff9c3b4bd8746a37563b0c340b6872ad40b232128937249284a097a49877cc542f3d2030f6c538986009197da440019d3567b222ee94c72d2942d023f07a45dc497ab8cc22fb3c1f42826cda7b241bd35648a895859b7a9090e792e04ea890ae6214117de01644eceb91087c836c896bf4973c2d8178c4a30018af586f50a03a9e5a1613de64e4b36fde2471c847f95f09d0778253a44dc9545f6125b2ad80c5546fc9263fdefcb482ada2d2cf22f0500b4b53238f2a5b24aeb3d30986897cb554bbecfcaf50207dd3860b5e99cc6265d6803e364961892c040271d38b5949608c35452450256a8a2eedd636c3ef84e982e05155a0782e135c31eba651ab3aa6d6b7ee94a2e2360181e3d8beaa94315c7c65183c48c89209662134730c684323b94727a728b1f575a5da40be1d4681af0d3330f10f45dde1a2acd0f9fb120fb636007fdb2b3b2034c7044e59e82a25bd664004164981d738816b0eef530308c7bcd4ef85cd5c57b4828143581b8939613318816f3a151126362cb99c29fd61e924211b8a80256d19806c2989da632c795a813c08ac7199b0e3e1ae96f23233bf2e335cc704862fb6c2fcfa02449a1e630efc87c12eeaef349a0244b98db62510b4dfb169fa8a3a5fd5952f7de6870bec39e07239eaa4bb82958870fb1198818a730fa9560708b5b05c555f5c9f59657e7843a556dd0328fcd5358af513a3034e66f969edfd5c33717417e195265be52983517d38f9ed022c6bdf3dc4ca93d510fcd8af1db4dbabbe0e0da255224baf887b09b123d8dc8e8afd95f52b9390b531f3b361fba16881205b4c775cf8d20c092fa084ecdca0091fd622eaa659234dfa680aefe6122d8ee448386c31fa22efaf16c1c9854596277965fc4f1612ac0ab950271854cc7f0335ddeacf3e10f7ebbdb52a1f0256896c7508127ed687c72e1e5c8e54d5fb9da63a96039623191aaadda9404d3481bfafafd11700ef91de30f9c65227b2db2b3d96bc71403d859346da0beeda9e8a231021b5e887e1ff6788949546712cbf9918682659166ace627c30ec9edf7adc8e5fb9df42d80960a9fb8b8461d2daa134782a94b4bc7b01afda1b949b655e449ae66052eb3b0237f1ec585f4d65f0ddfcdc35af695e061ff78cb40d4af326107338c190b7fcaebc255795a90a3f3c02476a94a66106209edcd06f543162ae40aab72b89dbf78a8a1d322e3c4f28cdd7f523eccb412d5177065f790cfcd1154a738bca1a2733fbae6bc5a1c52c9881a7931f7657cdd56ca978a24308595891b46a51ba2eb1ab7a2de09bd129cb9900f6cd9c5e1765ce9b12e9d3419fd779589a8a15829599b1eeb159c0880693e6f5a1659b0ddf2c3eac49834e7f0fbbac08789e836422e9249a34e73b4e192d0c2ffb55bb57b2ead2a4a99ea7865f2ec85cdbdc90a7c742322285c70f7e3e515a90696b17b5d53169c85e30a42b6043360c1620a8647ada1f914871c2631a2a4818a071368ce07bbd9bd79708dc72d861f2638da1ce5c578b7564bfbc02844f2699bb798dce4dfc2227932496967923dc8e591473cd10fadf67eca862cfc818f2df8689905da649a17fab023ea4b367f15b46caa24c62bbd3f0c20a28aeddbe2fcaeef2bdec528065b4136a2f45f5995744e03f7e8bf2ba1e86e4d32622834fe1be5977aba105793d2781e832bbf819dc26cf2c2b880cace60f77aa06a49c8c7255bc3b10e19d7d551c4d0f37830869588220e976879b2ea4470794eb3d23ac4f1a6aee94aaffa9e839519d36c5b615d179804cca7692e815cbfc6043463fb3d823091121ab62195cd303d3495523816408eaeb74c6f9bed99404e1ee6555b048169542530aa18e56e5778764cf637621ecd6dab41eac6414dc28a0ba950911695d630ac033403b0282c18f1265284444984d8844fe9ed881fda4d6e0882113b0d678f095b79c7d95c90fda637b3142cded6e306331a52713ee5e240dfbcfed4f90d43af6fbd1ab881c02234d05fbb0ba4fc8a435f1b89a489421b1bccd8c7cc5bc2404b53edaa59a948e6e113401114f1ee3b4e6b8203e1ddcae163e997465b8291fb933bda52eade31556f3a92a19a75efbcff66bcc4477e0ea0ac531120aca5311741ae27c7b308b7ec0fca03e3d9546003d9dda5bd0083128629d4373259dd32422df8142c6508ef50f8c95312746a8292510e79cc9224a3c28c1fe1b464d8f2a7d4fea8b3e0e518a5ca178fb8dcc443372a1def353df5a8e9e92c122c41de821f373cbed9048add243b78f1d9131e40f6fded28ff0c96a8f7cd9133ac3d1330ad52adf2bc710aceadfa4345682dd0c217fe191cb11e59391b7c339909eec2535a30b1894fd788c8ab6498a63f9e60f2ea9f96eb89fc55ca081dbbf97c51a3bae91a6762378c75f30b709ffe53caf2694b26ac225f32ae805681de17dc64cfe32e5e336ba7ef03538e798f48ce5be2a3d6e642f0f7377668d8fc13a57177722df92bde806a96075d9c8202420d29f1266658c5dbd0bbd0b742236dc75a812837084292792559988501ae79033f2e176398fd4214ee4761a033e268db64217f8e51e80974688d967f2c599278334cb9a48eb80eb744d178dcbefce69222261913061859439975ff3b4dca61d7998c5f8ebd49e9f6c72769b0a5b8f936e0041a9024fc6a9d7912927eaedd91ca0947cb8a349caa8084363482341d224f7ac32446cdba8c8761025948998721697f2580c52d73b9ac6d4453b756adb319153b78f89f9d0dae5418624fcfa9d9848a3fa10646da88e9aabdf86d3f78fcfa9467de7d5946fc89dbe0d3f77453bb9537539bd21dc614559571e7fdd9a1719a7aa81e2c04420ba31c7583446ba75dddcd4c177ff6a77d85f61125e226ddb606742d45d0a8a94416ddaace01d65afdabe38c5db2d49853d9b3bbf7d241a7355b20877e819c035d66b8526de9c59226565559d432c3ca459872347e4b386ac7747bbb11af0da648b06cef1a2d84f7fe6856f3420c89f03b674c64744b88c8c53ef9e0ed9a1eea1ac3b3bf3e9d93ad5e506664466fa7a2c9c8170d95eab0309d9ad8d8e316cc97224875aab604e95cbcd00f91e19a71ad7a830da44c31381e229107a75103aeb33ec0435049520361e095df30d562642e3c09c10d4db89da5df78b4d6eb1ad975c0b0e7195acd3c110123b587583a245a75980e37521a071e923e354e6f2401a8364c191dbf351f14f7cccce93716ab75728d4c7621853c9e099e6ec76f7aaea16cb6706ac754aab577855c28143159d7df7236f5447a824dd2265495b094509abe423493025354fd0bccaa500d2d9ac21d1447d277a743fd9d427ea492aa9ac62a5ddaab730f1c21971fb040cd9b51731e97811cde6f668f03c8146f9c40f0ed7dd1133370d7164fd5435ff9ee255f9aeeb2af4051bed2baa541d78566ec1909270b3fdc0092a30957dcc6aa54a8392e9ff56370a24527d99dd54f3737722f7de20c256d258ba138a21e44624d3570617d1c287aecdc4446ddb50bb4704cef8b19de2ec6c0c278b4dbb52dd88e45c2fcfa85acd32c1c0859fb57d9e6574c1611b516990f000575fb9f10bb11e32687c25e6a404f9b97cc2839c9d52c057768d515635bba34de96dd1b276d63b22d23a0365ad112edb7a16f65b13448ceb847e9da6719e013f1ded7c7bc771de235fc1ee2f604db305aa74146a500dbcd10d1b8d56cfc9a6d74182bc8e889d8c50cae717186601d2ea1f33998a024fa4d9489aada9398a043f44f14c36e16c992f52c1120a044fc90193cd5b7edc2fad087d3010542bac273ea0e73dd5092c270c12a0b85b270a6d87a0a2d427ee0e241fea0f514e2f0c36c50917577cf7970e6b2d0e3d0454721a4f55d82b9a48382e699cac80c9827b45be9141b4ca831e89df1415b10af77afe6494a24178a31459c9bae807387af0a27152348b1199a69d91a139ac377b20b83e88bce6f51b5a17cf643827855b0c82c57c7a8599496244d0a728b42a690eb29f889c3a7f562bcd0583bedabe50a8941c5d82e547c8cf59d5cdd3431a5bb94364d2aca72a2fef89888d535410ef69bcb41dd9805cfe817aa4cbd9115e9d84f05c5a9de85c4a7824632a01f625a0110a1e347072750d9654181b2622b0a3ea4f983b8f4e146f283e898c2839dfcbe4235a629c7b66d4c519e10da8ab2e9d74641b9984687289d24b2444bd052d79329ac393889446d8f45203ca80909d8693c1bf96241788c87de883d429618708b200d8912bb2fa3a083b0486a61591c91d527dbe49406aa2232fb838559142c800c20a036b4705d0e2496830f2c4af5c1cb1cbd3a31c28d0cb3244c96040ea3230c87696a6d0bed842482ca42f4fbf99374676d26eb06fb341c46984395e63289e81f3871cd29146213ea65d0c82477a86c3cb178a2a33d26e172b826aa26f69818b65b0d3567eaee0ed907055ff522e29241f015b8fda57c8a8b24c9c1ef281c01097b27196f13a51a03fdc28198139ddbf0be0c732b2f1dfb041c496565e43508ee919a2d826e22cc82b21a9b27b91296a746b157a1c81c82b172eec04ff681d16061d19942a06c708442051ca825001e2e3f8ee40002f254d4500df0c44e9eb65dc1fd9163a8e46a622865eb95c2cad81ed623a1cd833da7bb7ec12db3b8e1dc901e884e997cf495cdec21a156baadd4f1ac7f9dac5ca984461aa5ebe333e56224d4802d597e360e8471e4e1bd39272b3a963a2733aef0444fd4d053ae9bd731c9f8e53857e0dc3189e67afccda9e6316ed98a9fa26f260e2a0d46861a0273cd37b42f11a0b6c22d4eb5663988819ceb1f0af5eb2cca374cc9eeb3f1feaf11e9f45fa983ecec0ac1c070df30e0924fbebe558abc6911131873d385803d7c42d8dd5a5c4a9babbb40581177238fb220a8963d6aa9e006eca23f23a7847523598122d60099c5737be8574ac48c21aa2bb964fe0ed7dbfe9664435398ddfb64f662819258c8956c89a0b6ec2d2f7d2e0fbd3aaacf7f488e233e736e0863cddcc036178f1e801e96935bc9e02c76eeefb3d3851b256eff648869dcf1959071c40e43be7db4649740ca43c977d6f248d756a2dfdb8746c12448b1753597f9ce0ff2250459996a0124ac3429f7f6b87a64c11e6e7b580ab7be78431725888b4cea81ead80c2f96005f7debde973ecb033ec2bb683928e95aaba3d06a8db8a0da2c98a88d1036d198fda248a84a70d50e7fd0703b338d9e26c595540c7a0e70eaac92b830f13ea428478f0916c83577588f9cf5ee8e5f3b1b0bdf951710038be2dfa9a7b0242f20a831566200b79bac1511d2aaea200124a43ea0118fe9b84d7782c1bd505617c6d26743f9a71819ed224028e071dbe103281626fa19272a48cf42e079639044c0749060cd2f1e5b32892916c633fa0825074d4a403e773817d01a7d6f0be6324930c8883fad705160b10bfaa054468b10fe9898090889cf9394a9d1e7a9a331a1c1bf27e7491444b6657447fc5561b116d160ddd388e71f146d8acc235dea8f47264abecb461110814e8719ba349909546cc1e35bfd2a1989d080ab77bd67c0048f03678f348585eab157dbaa1e2ae7214bc157a839e931ae9119864bf0c63405497047c511b215fbefaa74273c7dac395e8b627e8d1efdb9fef0d39202854f66bf7e58d473289cf4b27e040bc2a830b5597254afe07f072859756e15430eaadc1c55ff2cdc826163907925532b9f1db00b4b205c115524dcc20e127c8d640bd5f355b53431003351063df1aac7ff49f1932109deceae0989295c28fdc0decae5c301288ebcc52ac9584d01b508875f7eb04b7d423760c8b640d03ece154de6b8c64a687caa63707d8befcf7c6d5defe968c49d249594078204a0c855cdf8bd0685d701c17ab96e44d078391805df8e63dba3de784c7b859394f9ec34c2471094dfa5309e2314d540e520d95488ca6445356b9f1e1d1d39be0a712c105f3568125116e539022595dd9d12b2329e9ba877808a90c945a7ce416ab2c7b76a995477816668b2d7902311e8226b776343ab2e687107c3777f3cbf1f1c82b650ce3e41f50e5f1182fb23ace1dc4fecf61252ed0f6fe9a00b1fc9a3126bddb1c14ec46cc449441a46c208f491052c21bfa5d6b794cbdfd11bf5f816a604a8998df19d9802b5045202a8f62f27b25e3d800dd0a88e0ba98e7c3ccc5f2e09983fbbcf0c831411dc88a20d222283e39b29af692a107052f40441a0a557a2814eacbc391f08bed2850941efc3e97a61ff07d13342bff85c787b6eb52f6335f2404e434aa53e3220b6648b7ec38bad5c14866a6cb9149e35f5ccd5bf3387760f45a2c795311769ded696e8a5bb02801d32255be65050cfa1739bad5277033ad77031bddfe100826badaefeea906da54a3c734df1548219ae0b4a1610c534099bd4aa47f751a990ffa0f519a24296137c27b718a0b344f01af0a2dddbfe2774476855b3c9cc46b39494fff999fd68a9aff30b457df39637f94c6de9b6ce32127b903839b116dd3f7507703760ca4dc3341d679255eaa9abc4a98a4689e0bb35e61567b711202fa9e2d8fa9ac67567b89dc2eb3cbdcf411307e8c8a052da249df1394b608c3ece6abf507a2b05d09f95df0854f7c7fa0b949deb642de419b86cd6ed8fd1516d1248812d26c2f64ab1168b6d7444361fff5d82434f59a8a68f2b5432ecdbe7c288f809a114d96bf5cb6257877577cc207df3f196cd47612d104331646558b7374aba217a48968b2147a08cda08e48928826b9150f032f72f1c37444939f041ec16c91b0a3c72cf0fdd2ac22fc0f428868c2dfcf61e4e6c1f2832857ae8474d7f8c0a7f1e1e2c74baf41b77db1f28a683277a7e1e64ae5d39e2ffcd75b652847878868a27fe3d958de5a96a7db992c5f83d4642c8e1607784b7df895f3d46b90099c7a344b8b4fbe3ae7974e13b753dd7f388968a2cbdb3e5d95310e949cd6f739114d5a2366627aab649b7bbaaff6403c27248d15e696ed417010606a584493d29b0f8dc51dea4a07024e78344a153ea2c9f131fe9c3025aa4cd11e1dd51f9cd48897971d9e5d4416d04890229a1cda9b64c71d04c42f839ecd8d1c0002269a1a859026f6f3c80c413f38afeb20b6799930d5034a59c8e371655723d60092b4ace37b355f30d9f9d6436cd6a6079a64b5d421283682583686a1443082f2a2253ddf0bd501cb915e62acc4322bc6697361492c3a9f88bb61ada2a19720e6d14b56f29b4204da9f0e5ae41591bd9e7e81a2527918c2bda5b0d6ec98bc3eb359a9e5e844acd221f1241e5b8e59791420d6001f9ad465ddaa8da8e2d72dfd8af31199f6793cbdbcec38780e53b296fa2545db920168617cf60868b2f9b9cfa9a5a15733d128c6a6dd3d99eb090f5e68a0091f81846a7ca101e0a63be810a1fa9f7dc6b645c69e1ad0056efc1b7000ab1e10454a5c8bdf1dfbed9c617efccb09b4d28b322d0449eb21501f788c961e9727c2f6ab2fb6f16d7351f3ec86bb1cace0f047ecba8a1616f5d2657d49f4abff41033ef530e615ebbf1cb258abd3d3205b564969d73e84736792e0a5a6f44e15cba5fa8e2d5c8a70dd436c7e10c61119666035cacc1582732d3383fe388f0bbec682519d0038580f5ca7cf2f78fb96b7a4ca525707a631a02b2a20f408116e8f53f603b499e7e021a18f71bd2569a40cdf80a47370836b1b0dc8e02791145c6dab58caf763a3236d0b04537f410905052525113d5e52118a8a3914e6dc505b08a47256b5751b6da974f28b3b7f4b7525be0fa19ba69aca909147d335bd27dca396f1e24506e767644b6259b3143075805ea779e6bd4444a3a045bc23065d581e41b85e2f0e11e8fcb3d697a8cc70557f313f882c177d521c0ce4f283d723af1a5c53345cdcbe47658f6d619fe8722ee1095138ead5df9bad1b3cd00196a65ed03e663118ee7b64c1100805836301517608602c0263a471bf0612e612f7242c1332a8eab38882068e2ca69c0ccc6c0d58104c5a85b87e069b8cf6cd9520df8716672b322082745eadaca75be8483eb61bda765580e277a584c61b15a795f75aba210aaee217ffe7138428edb189028841540c778e07d3e9fbaee1617db04dc009f1d2fe2d7a04d9f4309bff3fe7d37479f3f17eea1ce754742dc378bb4d881a6ca93b2e7b8f5db2ea427e1693937c3a92e434f299f548ecd758188698c3ac2f43c501ee0db0843864973214bb036b8ac5afeb046010138c9d18e820eb3d6c23a2a271dd08c7bb9c4db4eaf20cc14a1856d6712b11a2fd342728de1eb4b2efbed2526c7bc2e62288ccd328cee7b71c559a1e2574ad02fc309fa377bfa5905e8cd32992757deb0dbc62fe46297eb04e54f3de95c9efa10c7fbd80852982b5b050990661e80b1abb6a2819f9d6bbcdc011fe6a41b1d08df1908d6e3f9056fee0419a792f1dd0a4fb83d1332a3752a9b0a5fecb061387df7d038898d04397783534ada24e34c9bcaef81269f8f1beeae702689b88703711e0dc55d5a8db42e590c84fc5481f8334bc068558e6975474467ccc8cfcfd6a146f66e2481b09375fb0783bce1ebe7caada3e2315919a23b2d4b2437a9f8f57e271f56e0f4aa144f696192f657fee8d47ef321a81ef06873772fef8f6212791823bdf32b04ed987dcb46cd252c36cd256bfcf9e7349438236cd319c36f68151dbd309559bd391585be83cae2d7dfad7d67eced8c63bb9d9a6b1481f446e64508166d7b8d97852080b1bdcec4d2f6dc339ffe528c9ef627acca716ba2d1dd8dbcf374f9c9fc69068635279e476055680872785fcaab94392d9c450f0750692dd6599b747ff8f11eff510f9b673769091cb86d5875ab21d72786f520e26cd2315c85cdf66a9e26f5ded05b2606929a414ec2f368f10e6cc95716619732c662ca52a0bc27155c98fe031dd991578a3df3f589e2c9a875ac4aa145ea4a24b05087fcb5626fdc24517864fbd64e9e2b80a74eb575a89e69d1f5143262ed14897e946d460b124810a55f878fdb46a97e3d8d116477a49030d117bf40704b903b474988c3475a64233b66d3f5e4adfae62072047cdd26fab2608c548fdf86892253e500cf29b760c2acc9c98eded37cf24c66908376845401ed451842c350f2dff9cb6aefdaef992701939516e805696683ed7a8eeef4b7f9b91beb339d60e428361830c2643f8525b9902213b538682ab0ce83a297f926ccc9580f7e08a155dc0131d96d3252160a253aa67c62a2afb23f3eebcf95b523257b8ad4b7c4f1b9388a0ffba7b5c0ff1ac07403eee617e89a95386e48505628428e96026ef19cdc78ce089ba8ce8cbb5a1dea8f86dcc32d96e585b52b455467280c3756f33b85306ec39a79366e951af5c256afc992707d458c0e4cc24a6701b04eecb0d6b662627464ab81343ffcc49b5a3ece95bd4546eb92b20e558cc36ae88bf2109fc7bf0dbcd9bff510545b338265638afa2a0f31086af9716cb8c38a71a94c7107972f53928a30c46f9a9e079cbef87da3073604e6f4e4c47c7a064f018ab43af7b992fe09f9582e7565790ea0a75219009df86eaae283a154daf79cac64c89585b17ce84e075a631924061611c9a672be4b2af85cf7677a2c95bbbe773d7e377e831576e54830f10fca9043e8644410f561048cbb83902203361621233899982558d0078a3bc5dbc01fff27d3968842b3da19d4052bcdb236aa265266b8bc88e2ddc21bac91288879047a0b7e46b7ca2e865098ba4d76ea015a5ef577e9e186d64bdb4b48994294c10d40ff50d6f7a2476c712f94e29254d502a232cdf7b0a55dffbaa6965c378ab1f37393f2c110ecc7123c23a1aed709e0d63c328e2478e25f280b08e463b637dd3e9b5376289a05ee3401ba60241ad4e279e0eec0c095381540bc604d62b401bc6f4ad6654364c15136a5ea0423703b4a62040ffe14646174384e643d524e1d5a4421d4a8446be868f54844734cfd53c4d2accf135b526c7ca084baac60b6bcadb469ad53646abde6a884a95212a552c11eb9c9744c879db980ac45b79354884ddd7d1c8d7204195b0b64a4b24f534affd19db4a96c8cc36a60209373234349a03a1e5299ad5e64605c2a5386f1b83856734e25e6319bb37e2b141ad8c768c6e4c36dfca28f4beb09ae0004110959a41c3076e0a13b081d9401b13d0bad82eb68c38dcddcbc0a07ef100a8698e05e85e6b7d859b11a311aa3201d66ab5cd3dd4e77d4588a0d6fa99883043d334d389cb07388e3b814374c0f33c0f4409b10193c96442a582280304c1d40c1063a452a9d40c8dffa04618751333e382042860240a758c46dfe8262882662685024fa6cfebb84db3aa6dd3b41a80fe55e3362ee4a2d6ca753e7814d034adf3348d0a2a388ee3bccf468d072cf1bc2f65d25060c950c3091316b6da2de0e864a061835aad16021a3170d7d15ad0c3c6c3383a1967903112851b0246a39b33c4d800acd5dd5df5fdf8a6858c14607103b00e119eea1061d0902df26938d6ddf037bed7b63636326ea3b88eadaaa02e5a91212d3b26378c424dc7dbafdf79a01682e6a56ec69d51b3afb9d1a9bcad0d7b03c4aa6e59552e5db422415f68935a19fd832ba39b9b9d711b5357b8b2f2b6311548ad5a0d97d0c84110c57b1c4918467c1056234b3c873d89015694456956d3ea157505d7d1aacd68147aa10583b4223445665e33bd6ba94fc3f94e0fae8caa17e3e9dd823fa3728b03ae8c2a16e3c97b5baf005381d8556b15a4e168a69591a7316a1d8f2d7225b6b4b4b4e4c3c3fbd8307505fbda0fb9b2fac25420f6ad689dfd1a2242a315c410f1ecafe03d3e6aaf1511ae9c8cc97669189da8cd8ab160ea15368c182be68bd0863972d8d7aa166edb97834b35f13147cd6fa81c3c3e844740ca870c3c3e841fe2b1aaf9107e68c7aae675fcf7bdfd1eac391efcbeea79b6eb348edbb68dd3b4ceda91cb91e3ebc8755fd3bdb53735df3dcdca5d47fb1aaa524ff348349f519d3c636ab58da9402a1315136dfcfea46252c7ef4daad075b4f75421a83eed73d8b0d058ae07454538200b2322f0041a60a6e87630e1036cb060872c44906185ca053c80400f2e40060562b0e980258a2e3cb0e4050db87859d2c2071e3840a412e4e08c2f46b00232b4cc5a004607c618e38305a61023031a9625e26001103de420881a2c6d59d050820728c8e2800c1ce1830c14f1a5861f8a98401933b8308202f60d2c50f4000a3374d0800290f862dfc0b24515330023c413646c9146189fd7719b666d0e46e7388ee3b80d023c285102279608a2054de8605bb26308c106983252588102387a76b0012eb088a3054790a0023888030e295cf00302c8b8020540b82560a30a2338e0c41309d0e0a85a9a5040067858c0103df868ef2ea6ab4008c6e73cd7ba0b18c1438610dd057c20030eb0eb3a2c4970918006f460812c50a002313ed82e3081af3c088a03cc0f4c3082207440089fade3b80b7411c3fb620dd4a7f9b7bdf7de7f71c669d3e1fde03c8d2c2cc0c01716f8400b996ddbb66de3b42a38ce3f4d4c17361ce0c50721de084110ea124558c1003576e0a287d04647a863dbb6d7c8f81db66dfbfff10fe8a28d2f6264c0c40d903881a7755dd775a90a70d1be0dac9ff6d950c6160fa081820e84890110524058b2c1113288a20c0bc008c2dbb6cfe3b8ee8b2e5027208288534ac3518527088db66ee4346e749daa1ab9ed67dcd78cdbb66d1ba7a3d6d5576be5b1aa0a8eb51bb7d754db58b7144650b3d656d7c019fb2bfb7d268f89aa699aa62551022fb40975fc20f3832b4664e08c2e6ae4a00c0f3e20059cc08b133071c40d2c1046f341b6428d2ab8b031051c4b3ef82101111c18e30499312820c6d4450e8c10a1ebdce8c1468d1cdae7f5f0b82eb4e9820c23787491816d87b60037c608820f4300b1c5082e3431392858a2880544c005327040175b00a1a38b298408814b8e2e7e10a2260e20421d2480c60d1f66c29c91442acc05904085b1a208308c97214e617e40c2c4051c417c5cd86008afe3b880810f1d171d5882e3a20b22362e18a0008d8b0474b15d1082d8d28387911b9d0c2c1ae0838be9035305b76ddb6642853fd8a2013518a0003014500232c004a1f560dcb6cde3c081112ef08103501c61019f8d041b6ddbb66dfb6143c60f3010d8e1c70f304d80e0872d3f36b0810902880907b491011f7ca000161f1a360093d8020a06b411831f5e500608a9323e27c8c2075facb1021d24008d18745dd7755db7850ab4d3b76da181cfe4adbe1065d2baaeeb3a8ddbe2029f876509073fc040105370608c32baaeebba8edb6cbcd1c93863031508b528b375db0d1726005cc785c7691a05bcedb3093f940ab270400b40f0441438f882029fc60311bc48408c0a6c80012e9e50838a4ef37850e3019dfd6cc20fb545145ec7d96824dc8c316a5ace8f1c359cf0c1c7e8646ce1c39802c268f42306689420c7a669ff7961d4689f4df8a1c2211a37040d2cbe6ed3ac0dc76960701cc7713c373b395ace102fb421da0d1a5f3c8ebbb1d9b137393c9e8786151cc7719c9121466eb42243d068c0c87143b89b214378bed168c8cc0b76b68f4383094dd3b4bff9f1680421c487060f3d78706ce972f00317ce607b1668377f060a38ceebfcdb344dd3344d0b354e5b693ab41f5da7699aa6699ad6dd9c11022daffdff8f6e34fa1d1b685968a66efb000f75ab261863cba66ddbb679f146c771dcc6719b0ecfe3388ee3388ef33832bcb8c1c8ede0c3711cc7e9308d4661a7c31893d675ddb66d5f10b494b9001b3ad8020409d2e0c14646db010076f0828d194c400d0a40e101c1c1152ed0800e48c0a1c40c3a1dccf0c6195f2891041a548ce0b58ffb6de7e67f0cf9c1174b64e982030ac081c406fe8d1ca408021633f800125f80b16962a0c6ee3f54e72131d37576ecbaedd4c69836b438c109102046d771a19d60b3200e25c0f0a0840312d0fdcecae84b6387b1ebfeebbaaed361b39d2186ddb44ddba2d801056a5440076584e884183b2dbe9872e08037c2a8c005596230050ab8ed8788303a195a00317ea393a185169b0a8046751c8dc06a6db50fbadbcd47df34edab5ab5a356ab8f208dd151c7fdacfb9a6d69697b1fb5940f5f0575e18eba321261d442ad568efbcaad6c7c30518d3e808cb8d18d0230ba511ddd1bbdd5a6aae3575575ccc162d9ac0706e83d08facf09e8b4faac67b4c3d5caa13ce7f93ecf034f2088f2543f1e9007a6521b6a66c6fbfef43429a0ef04943a791e8da79d52decac7e951284f3593f27e3c8fc6c686e6a77e6f643a3d48636968686868aa7f33a79fd4f79980527f7a4ff5935a9dc0d3e9bdd3077a1e2af5f38d566a1c5e78fac21450ea7b552af5d3d1fccc23a0e6c3f7940f19687ee687866ac299d40f575337cfa4e374dab1034455140a854285a023857a5398fad1c0d492d383a91d6138737a7086878d0d8f991518d6300cc3d0ed3773fa1fd39f4e3b52a84fa552a9936965a5c6815a3101c7d3ca5de7c7d6a068524b503c524339523fde88fa1f1f4fdf23d5c4c7935158e3187ba4a4d0fccc833435d07c3f75443da8a3ead0a143870eb7df0c6a47eae7f4a8f75475e4914a7d4dea8432a1de3bad988023ea533f750477a03cd5cfe94fde2aa5e3f374a456a895bb0eb832addc75be9551f7d6c7f63f1ab7adfe647338a1756fdad19a745aa7753c39befbaf43753ff38563c8ad8c7e657433723be38e96433546c861e1c2b305e1c612318dfe5a911d3dfe8dc251cc68390e7060b832ec0d0f15b7821e2a0e0d8e034e841b016706b7024e055c0abc07c59d8053833381f7a4e13d68780ff79623c39dc19580230137024e045c083833c8706c18713018ed736bd8233cde3e58a3329d40546a8686fb3832dcaad6e40861070fd30944a566686a54a61388ead1a3c77f9e0a895b49d16315f22841041e5b13a10db2c6f87d3200b90739d5879f366eefbe69bf79dc36c39ddef40848f9183a99863eef97e89f9f6edcbaeefbaae7d9aed3386edb364ed33a3b1a7d461f8a537151847534fa4c4639f5e6c6def86bdf8d566a1c9daa1b3b26b4325fc46ce37682cfeb6a1bdc56b7d7bc8c5b2d53c7d15575acf594c609c5bd11ea9ba96f3731333ef8b8256e8bb781e9d668a30d4eebb25931b60c4b66ac61190f6b991189f501e4cffd8fbbbbbba66926ee41ce56ffacfd3ea0ed755826dbcfb7712b95eb58a971fc705846cffd339d4e27d0643a7da91f1e1e0dc774e2401b1b70c8eb3894c9c4712720fb1cc86ddbc6d98d33a57eac3b784ad9b72a295e4585212a25c5fb0e951af2569f86a3e1a4524d7ce4fc9bd980b8df524c4026a0fe01c70d1cb995f6a99f3afe8029ff52dc6a8fdb2afc01f41f4660e5f13b4c303ad8450c04636fac8706150dc75a222fb00b27729486a6f2c63ac568df2e51d18a8060341c0b9671e444400e8060d2d8a1eac0e0a1eab6701cfb20079c485701bf29c312e9aeb037160ceff9a2b340e745d785f784e9b8f01e30dd16de03462be25a745974587415e8283001ef09df7e7785f7d43c08260ca36e8cd17e27c61ed9f1964ccd32daf7bae5eb810f7e30da379d5070c4a1e950c9425021e5502595a95159711dfba12ad51bc5e3411e7f32f1f8cfeb78ac942a026a0f4a1ab78a75231aa3d18905535c319ed6b00f088d6a97d116c9b1b1214334cd6a9a75323ca0192158d00d6e7b7053b9fd2d0cbbe77eebb65aed6ff6df6afa071cb5ff01479b83c5a259db0468ddc8464a35996cf56fe6731dd7713bdab7355fc26d34aab1a1ebb88eebb040db4a657368353f29a0baaaaee33a5bea27b49667fca1e97878349ccee8fb99b116e5a39762b2c3da9d1d53ca4ad84558b555fd4ef664b7d55ba9718cddaafe2a8ef105a05686ca7b3cf04fe1674a81cfc3e7a3a58a34dd21f7db66f43e7dd4d7d0db7c4c3ade732aeb3ade579545fa3cb5e5183fd5ab00e0287811c78161b4de73deffe8af1a3d4d158e9f6aeb3c93cfe7037a2850e5f9801f0a54753e9c0f784281aacd070451a04af301511eea34a3634ca95cc3a9a119add5617148186b2ad47cac0f0856b7e0363333a654a00f4ae53e27958d8663356d04adb6cd6c1fdaa0c68e03bdad0b61fcac0704d047132cb55a8b426ddcca7e95c9c6fd70d56219391ff58f3a1f3278dffd90e9bff756a6d5f7ad3e2df5c369dba869da1686dfb7a57e341f43de772f45c3e1b4df34ed37cd81b41fed392df563474dd3ba94a6d2543f3e722b1fdb1f6940f6b7d7543ff699f8f8f12fa531f9fc34725fc76dc3b2d91312d65a6badbd41b52bc623bb5aa1ec4dfda25d81baa28c25c2637420d8229d18d780187dc6dd48a3a2cce723a48162c26fecdb104175b137df89d18a7c3956465f082b31dfd789d9198d3a3144822c134e44482bd26dd170ec7f5f18dad8fc4e972f424e041501bfb12ad3138e637f87caa484e3d84745c089988cf09b2f9688898bbd79c2b400ef3939d184f730e13d4b9814e03d5d1725505db4225f122624bc27c7db371de13d21bc7d9311de937afba622bc67e6ed9b88f01e9ab76fe2e23d21aa4b7d61cb476164cb8e8f8e37323d60b46ff2628fe878fb200b462e83d1fea71529530395ab33457c58200f34d94af4a13c5b65a85fad9aad5b6d524bb02d58122c683dcb55adda6a6b4f2dc182d6dbaac669b516a95abda9a68aaab5ba504db027cdabdf566dad3db5763cac8ebad9ca6db5050b56cd9a5035cddacd6eb5056beb08f6544df5db6cadb5a796604f9e56b76fabb516f96a93c267445381ab5a35d5cda69a4c3d60017c985001b0556b3bebe11aeed8019bd46aabadb5eab8e731af014b25438031fe0480a20d3308a062c30d1a6e0b243085056bf8904a0d1782220458e882c0a540e185135254398a0c50189109ba43903881c2841c34b924ecb400850d9016ee4c048ab020f5a388ea5489b0a00681482b8e051079385c6cfdc0049dd6179bb3c60372ceefa4a082971c1b9cd07ad409df23877b09c1066f7144f86f3bb86beeee007077a29a32ee079055d1a9886397d4d8bd8a07b93b0e1ed650b9fb96ac148de643fb62690b626973d2a5f0d5d34196f0014b1c87f204a046960d8a205b0f541411e812b0b43931f1389160b3c39289005b0d9a09e0ee501f938fa73b692ed89c380e2c7d60967454c9622aa2398103d40a96b8389638d408672ca1f6ea8b2593cd8cf55ce08070476cd9018aa0840e1b104b342a1a95a65303e4b3a98943074e858fc733a2d16846be2896b427418074a78e8a250dec46d872c0205add505bce8909a78247806e84eed419a174a074986c4c3c3c026841d0a11b41bb4207ae8ca500186db06705a084ad0745d3d56c55d3d1926c41a81e9df568f07c7850b81d33b503356e43699a66354ffb34d389844df3a6783968824e355ee755cddb866c40b6fa89a0f9c8623a818bc0d20c15596abacdc7a744876d053aac58ef71c0110313a4110233345086ac4888082e4b7c6078a148466d3006080a21cde715a0862850e2f800094470c2103b5d9440b2c40ad0000119606c6185144044012421db43e85407372083821290408c2cb0e460802a35508902e587c90926f4e0e1451758ac90400e38b04a2021a327ccac400556604b71c0c1831d5429400f1e35689031c605c0d8428b090c21840f2c0310808628508040f081313c60812e4d4ea00608c810038c2f1e10c50f08d8e10664d02801185f7841012d4bb8045a529322f3023656a00131ba0883c5144404814b9601aa148006a0252ef4e0d4a440f0010d38c104115a70698001003159e282bf800d107c6003637411068b094c5184105a6c1800d00b2ef4141912042747cde671bc800d156c40036388d14598094c5104114204a1a5052c1baac0004404c20f9cc44033930212b800f103151a761810c40f33a52a4c716870d820703fb03ef822b041c04e61a5a8426c106da78aa08ea682f63c4eb024541fde089a08d566eb51799842c891430b371ad44c981a01250248c2a9c6e47d9d67bb8ee3b4ea9d96530038b0e4993cd336f311f14c5a09a8a12c5056df4d77fa7836144ddd501d6b4bd2525acd96c60e4b2c7533d6336d39a9127824b0749a01556e393359ec101fdc94ad764630b0f4821325353bd8edb439c1e1c1120c7448c18c2c95eba939014916bb8da0e9c4aaea08a7420996baee84202d3b687c10a0fd64e9614904130d281d281d3730d911fbf469074b46b6e9a75544e899b41477b4f90044966f9be94aa8342b648901034c299ca1e52ba3c48c053924355e0b5b0cb80057e8100277736272124057654bc16b41072ea0f8d1010243f00877b4a448270908630994b998d8212584a6ce4082e6822702912c27af85eef4cd6845807eb4124e4c76b074f28052425f131f4b989c4c4d5042a5112e967a6c39444e5d4f08a9ee042e5919e0014ba7af8909443f2c715ac8d54e86eec4b9d0a570c407949950f89a74274f849412d38f0d8aa9870e120430028f143e15629022802ca74ff45648ad500428c8436dde085c8f46c484da5078249ec93b6d40b818361e2495f3a1a9381e3ba68fd45a58e282cd77e2612a9225091470c877b3fdd87e7410584a616653c2a9c09960fab1914013442b4187251148d55c9acea671075819c0882f326a8504cc1073851510882201587050d2472e4cb60c50a5062a334c110a723280263d3c2bdc08200000f86d0c31e2b0811b3180e14800562388e079f14007a478800c4b60e82961070aecc2f0224c155fa488a20150787162ca0d0a4044269618128a03086f10d560833160b0724d114398ae232e9cbc2f4470296232411a537ce96981480f1de0e9f348f0b1851655701905ca0080982ce91912042747cd4c6a5b80103ef490630d162c60850420808586198a10b1d1b185c08c1ccc70e4052226af9b000f6128c080248cf8e1004f2c600143448172c4051450f5079a0f6c998dcc8fb16d6c31b02ce0d6a86a5834ec19a612a0486043604160bdb013d0acb0479b51fd514ff84ae0484889607bd81d55474d085c0e5b53c36dc682dcc99abecf7a1e67b7aad5dab9fbc989f80d1e82484ea2bb51338d01c165264d5496e35e4d2731e9d6272edafccec3d375f7cfc31301dc5d001e9e56084f37de7a577e9cbff9c7a5f9db7c1766e94def8bfc6bfe9e1169119a7850b355ee3ee3a14906defa22d4c4afa4c7b979c1c8a3661126b24114c502bc8abc6be1c63926eebebde64bcb37cd7a55c1c34f86cf086a6e8dcb7f91fbc27e67f435cee5e3dc60329565fd99f07d5ea278dfd75e1b258a434f0b2f8a7fed22149fefca8f49f3d49f66577ab77e5c84ded424ba89858d0a77c7b274637d5e579d410b41fec8a7a98c4ce17bdc4d778f79d8690026436d38e59c6e6e70781c4e39a703fc1fe0ffffdd6d0aee16c7dddea0d06df99e2a4efc7bc20ea7cbe1eea1879d75ff9ed3f76c173eff4fadfd2a32d3ffedc2674bdf175e4041c879e1fedadc32a27f6de2d7fe1e5da2b24cf4aefc5b96dfdd0ae0d4f3fb7e898f4813bd316ec90bd0e3ee2378c855f193e86e198c1bfd7b4a4cf4b3f2e2f4bc5bf624cd69ba2429a769f6e1487017459d8a658601d930174e33e979b8015133a60c7f23463ec8cdbbbbc9ddb5bb53f1705339917906d1d178cf769a896ee8aeb46dee3b55cab87b95269650d225d448e0ee2b77b71e6a65b8af88dc6d00dced0f770b00770772df6a36ad66f3d8957d777b82bb35c1dd96e06e4970b73edced0835e6a07bd5e2ee357868ddc0652671b923b220eee8f0b0a08980b882ececb010e412110911521609e222a2934d51e37d53529ca55b9b453805928bd24b5a2f7c9b674c7f6bdf160f0fed1077cfe1a1e5e27e5ea40cc3694d165cdcbd8787d600eeaec3433b00777f410997a899628d9aafcd9b47f1f9461e137d79caf24b3f8ebb0b71afd9dd51af19c386bb15c1fddd6de9ee300feb111be6aa55b87bb5369ee634c58fde2f319aca364e378a61f88cc1ccdfe64df717a1e6de179666d75faf0c70f7eca137e1ee290febbbfb0e0f2be8ee253ecdeb7a8df78ce8df951fcde6be3f4b330cc3742a3ae76e55ee6ec543b771779d8a244662255d329fe705324b6f4a649e40c8540321324f22f30422438b749464a879eaa049193d42653a4388b088f028e9ec882c14118300d1a8795fe499f30612936d2d4b81a4b83c4d1911100ccb2f20eeb687bbe5e16e77b8fbe6ee2877abc3830308d0c52c2d8dae7d597800c11a29b407b5d512abd51840b7a271e7a745872cd5beddaab66d5a16604d14b5d6a3fadeb66ddedbcd37edbfefab66a4d5fa9ba6d92b46f5bbdfae20d9adfdf79ff65df1bed54e35a9dea63aea4caba36efb1ecb6864bf3bea5656ecfb5f01d630c01a7def0eb4a51b695359b1198fbaf7b1aaacca8acdd8adb6369abea69ad4f1dbbe7e2b2b57466f75f4409cb6b2e2fe9e8a1262c0267cff8fab7922dcfe399bd1532af701512afb3e3ad8ea63bf3ea82d6928944559ef563e9878df1d792b2966f6bb951433ed61187550b9cfa7d2b2fd92f6f5ad35bd4d05997e5369c101fc6a4261595a02553cc0e0a3fd49a5654bf5d19e07187cb6d750281db4af9f526949fda7d2b2a47d5d69d141fbd3f3f03ee06a49fbd34acb96f741a996b4b78f52e99092417bed83ec3beaa4da52b7541fd3832a2d3cc0e073fa2dd507fc0d855ae1006af984dc07b5c2a18a21f0ebe3707aebc399baaf3e718cddea488a997d2966db8741f66bca870cdbdb1fd2befe970adade5341da6bb6db01fcb42257aee4605ffb1cea6f7fa58a21ef4f7f45cb96f7e186bae73e07d37fab2b3cbc0fb7ba928369c57db7caa1fb6fb5e57db4f7563974f5b995f6fe397415f5a92ad5964dcb966dc5c3a715b1ef3c546105061e362d5baab002c378f43c6cab2aacc050534b5c0c0d60cd03c858830b0db49060f4af618cfedc11a3bf87c5c891418328460e74ef41f2c12df1c1ad54ee1f431dab7ba927f509b732c2e2a3d37c6fa3f7c47b57e56c5dea497dd2b98fedb5af39a37fce68f445a96fdf7e57b920c0930a54d1d0a07e6685c3cca3c2771f1cc04ffd0ca70f5738d0fce9532b1caa18a2f9d3e3e0e33ea0ca475dcdacae545157338f5af9a89f7a2c3e57504f033ecd0f814ff3f5694e9f5a5da1f9d35fa9797087eb7cefa3fe6b38da63f141a97cd4553a84faf0b3497db8ba7225c4e243b3ba52859114343f431d93c50668689e6695030e483efc9a9586fa6f15ae42cbc2f7334ff3463b0b9859056938355edc0c15161f940a8b4f0c9aaa2ea13eb5ba7225a6e168dfd270b447ad94341ced5329ee63458afbccbc14f749d525544ab363f552b978e9e2c5ce3c4a4563fa4d5557485654554c2a1da2f999d5952b333fb3aa342b29eea3a582a1d168de7d66dea86a342ab0a252d5c75375a5c3753ecfc7f6f57d4edbb8fdb66a5533be29726c6ee4e0b81cdce7e872e4d8dac8f19b1b3972e4d8dc40e5c881ca81fa5027ad269c497d39500fda1a1b5a1a3b638d6e50df36661bb38da9a9de981e3d5ed3b4f74eebf1a0a6696e60b9e246e79ebf8f3d7cdbdc7befa1b9e1f5f8ad0d37bcf71e8f44eba132da80d0c3ebd1a3478f37dcbd95d1466623d3c3f33c1e1e1edff578adc78ed0f3bc9d517bef5d2b22c2eb78d78a8cf0393efc19548f3f7d092ad7704850f5781faa1e3f82aac78b60a3720da7c7ca88c7eae419777c5e686d46cfc67a6f4dab6dcc36661bb38de9b0f0b0a6283eceb423954a713b4ea914e77d9ff236321b996dcca7bc1d3b76fce6c68e0d08a351caf33c2ff534bfb9515df0b63746a314cd8e1d34de8effd5ca682333a64e9e93e7fbb1763b56461acb7f3a56465f08ab1c466f745369562914e86d63b631ab4f8cfd2c9819ffbe9999cfeb4ca73f7d2aa310cb956f66e6b31d3802bfd4f79d1ef53d6ae69b419d3c8de651e1a366be0f77c5e24b7dda0cf87d2af5bd4559950d53819c4cd5f3402bc6ebc00eecc00e046d073cd0f340d003410f043dd076c0f36c1820085a3156cc12f07d6f0e00bbd740cff352a919edc3d487a0722d95fa1d2ad770663c1bbe178635af43e516a726a49949a156276a34751f428ed36a6fa3c986a92e70afd9303ab4d5f7458df72068c180b6033520c8d5d830402bc686f1b05cc901ac31c201b41d188dbcdf7604dfc1b05e013e8d0da36666e6c11a1af0695623989ea3799a1a3004af6201862b23101582bfd930368c0d63c3ac5033d6f301e83f8cdc8c8ec6e45b8d1115f5d5d5873a2234daf91e101e999e1b8d764654455b67186b5f569acd146f14482b5dd8c647a4b9952e6c8a9259a238161b37164af159a2b70916d2b23396ca844a54e6c25266329f22d42ccfdc046fa52552504c6aac24bdf84c52849a3a9f494abc639824c7182c6d82e25894240c25064b9ba4d8854d9d635849d24dcbd7366938224bb746818c9078062143908e188191547a7a564082915458e5127c12c9b2123336d210453463f7537c94e62496cb95c53fd277bf8ecb951f4a13d7d8145b2c34b71e357f63ed2d089f50a12af10da6e96c5820eebeb9454163738f4af7494fcfd0a31a9f8f89b0fed906baa9ecb2aa9727a6d6cea75092d6ef7cea9ce21bb23691ccf2efa7b8dcf79491e7253fefffe15e35095cdc7d9317c5657a936232568962cdcaa54cb336d63a31168ba51383914a3118a9c462b9e600774fbda6b5e46e849aaf6737e9bc8fd3fb1a76d31b2bb2c20a414c3dd33d3d7a2b617163fd79632dfb9c568a8b2e7a9fb47e46746628ee3ec4bdb240a567f8489bb00f3243b5801575e833ce20200847f040087482bbeab5a951f37736d637955d1e7147672b611d2d3b653019995da8c9bae98db18a50b3e86ebdf3a95978df32262bcbbb51bc519385912e3ef56595682662cdc87d4bb3442fc93a896e8ad15386849aac8d750f4beb198e41346357e8451c9bed9fe1a357e1936e6a9e2cbcaf489a27912cb6c4c99844e84bbc2f8af725d14c4a79b10835d3adbfc5e3dab2d6df1263749b4af8af89f425d639cdfbb5cda4adb1de79868f1eef9f2f31d62f7d5fac8de2f4c6b62cf6d2b7c9ce39656d8d8bccf2a56f1328af2346483c835e92e2f2e22647643e897a7a48d3479b1aa3f80793292e512c94535c039aa1a01836bb41b828bdaf24b36d9e77a7f989d2d01189491c13a2614788901592ae14255ca225d0ede961c5b4d6382dcbd1dca7ecc9ae925641abb8aa1055a9526555c5dd91b87faa15dc3fb103dd9de5a192146b1ddfb8f8b684bb1bc0c324b12041c41d31880e9ab5110b9729d649a8b863d7d53092ca79659bbc45a83963b1942e4c63ec8ad2d3d3d3032395302c935b965ffabe5efa368191544a93a533c93acf4bfab47cc6b18c8b5ac7f2163d1cc5b88ba36b0cf53661e6286ef34b9c6634bf92f47d210183d38291544a140b6919deae7c93e2a4d71833417203921f2e26613427e5d737e97e795f230c5ac0d0f27d61d871fd78e40d7777f496189685dc9dc7c323508447a8b8cb4e12074d33d1cd6f5367111d8ff0b8b851acc717beb8fb0bfa85138c94e12ea23926fb126ff27e895ea2bc3fe773d21b000f8d24c0c81017d670b185f33925500ba7b27dd12253fffd22d444baaf4765ae97952eb4cef32669fdfdbc51f351990b0b7077281eba10e42ec2fe7e9a9f34f785e52dbbe8fd57912ca7affd2a324bfc1a72c1c61dbdefcaefee513cec11e3a2d6b2a7a127881e9ed736936e0b4070bf52dcbd050f5bf8d28294164e992ef1c645a50cbdaffd69d16b9307043c4a2e9ee72533aacdc7698b858fee6e15a1e6d1ddb3f296e825c1439e24ee3ec5c32263bab8b865f9cb347f4ef9d7dce6e7a41809a3b317b92fec62a29f5dd88bb7089522d60a222c17f29008cadd873c64018c8b252e314689721a7b8d62a4146ff4a22946ca457f5e197a9fbc58e2582ca7e76926cd4e2253eb1c7bfcda5a96535c84de1227ef2f2f4e8b501335ffdebc365f43226c766a593691701afb19d193f78cfd2f61e100ee3e83872c04c0ddc5d979ca5c5a97fabebec4481986d312c9c4244e7f865fda444d9879cf24e60dd2183341a748b95b4886d3bc4c9e0c09251942f1d11dc25a4a894ff33251126556ceca4be2981246a76c140b8dee7e82872bbc5c341fcda6bb17f170851b174b6cb65a8f828742cab8e86ae2a1902f6289374e638f894e22a46fb59c7828246886de4fb34b9b8f0ab1293189531d0f83ace1eee26b147c7818040ca983663448cbddb38e0c1e06f15c3ef170e78bbb8b6976e1f49e242e75709ac4dd8d78b8d3728c9ab0146f5c3e26ca7177251eee84b2d72f123535101eb83b0d1e02f1627edeaefcb39bf419fdfbda4c318a8b3e47dfa421204d4434ef9736937e865f1be73cefcda34939c568d20b1e022951597615a1267eed51f47244e6f3cfd3dcbbc4982465fa88cc272a7bfc1a125f627e7d44e673ff4b4422ce760c86378af5003cd471c35ddc18c3d2bcafb9cdd2bc318db14b6625c5b1fcf83514ea7cd1a1e29e62974b4684c91bd3efca7f44def3efebd87da5384844cdc72942cd2dcb692e3f6f118be6cd63997eedfc1896f5eb9bf438c5af219d9d30670d11e749122aefcaa9a971697e89b5c6694c096ff3b1965d1213bd5824e29b271fc54866d1e3d790bb4bf13067c9e532cb7f6d33c9040f73a8b88b3ac766865ed8e73ca4821b30198abf95e6345dd27afc1a32a2947d8e1c39729e37494fcf9124afef0f19310223a994b89ca5d7244d174631116b6f8d4b1849e5c8119c1b2330920a0c6f9385b1eb8852f649c10cd186968d87295c21dad0daf13005a5201ea6c093c227dad0527988938687385f441b5a384a403cc441e2a20dad123cc4b1b92123dad04ac1c31b3036b46e9670d186568962ddd313d42ac0632cc42af13661e659b260a49266ed12c5dadd937888021451dfd793a646cd742be17d63da2c3fc5b1dfe8bdaf51f36e342749319a94d38dca32ec1ef91c1c1e2141649f736384c43394b84465d947935ae93e4171099462984ca339499966124b7122e5c80c292bc5e5111c1ed9e7f0c86e8cc4a2cc589868766118c9dce46569136b34c7344eb72c6398b9f79d95174b49b1e932778652849a258a83b46cdf2d344bb14c0631cdafbdefd6288e6999fef312e5f3e7f1ce309cfe7d347f898fc87c3e4eafc627915984ca98bc3843efbbcccfc14577ebd728a445262c95913798db4cb399c6febebe5f62fd22cd57d2e79478c76078ef5ba258fffd7d53fc2d212bc85a8fdecf29f1bea479c6644a5eccfbf19179263d4e7ad1951f865ffb4b0c4bb30b351f27bd463189d3df3ac3ee9f274e7a7d3f47e322f4bec854963fefd78fd3bb71517a372ca72eb3c48f91eeeb3cc7175fbf966533bd489f94d1a3c749bfef6bbf76529a1acde4e3f4beceafa4d7287eedcf6961344369bd0be8c5d7a62bff9324543eefdfa7ecbab0921771cef36ef35de607f9ad65463f3bcf2bd3b29b2f710cc598e8f57dbd365ffbdf953fc54430198a65e79de1c5d4bcb1c769e9d69718e973f2cdbbf2bff47d3d111684bc107c744f226dfe0cc7f0a28edd74ffc65a5f6d2a618dcd22d4cc4568166729965939cd8b747f6bbceff9f835f49b0c1c6f7cc660994481d06c2e392f999de812ef34c762328d4e913265e3944473929da1603d05052a515966b2339423323b418b4c9c62a42cb43394511f91d9894f5276b2d31cc3271edab22847247e252931119acd1d33535213c984321427e5f541b3a9533c43797d50b3c84ca394e679915020bdb1d6e30cbd4f721e4af38b442f969264b663b025f82432778a9150a09da12879824fa28b4e394d2638959de66552a258684a89adbc0bf80653c3643053e9c2f2fef3caace0c7449ff797f80653e3f4b5f9b506ee6e83873ec8388c546215993e390f9d1845ef2b4986729e322658866532bc8a4c9c9462a4ccc25b4662259cee04d1c127d63a69def73c33c9c2247a655a9bacf3eebc595bcb8ccacbda586bf2b2cef36224f3bcac18c6472c1626d3ec7aed8b4b56523ecfcbdae6696e99eee9616d146ba251892be734e8c4247a491646ca692c7683b0ca33bf344e5f9bc5a271f720b83be9610934b81799dadca70c2664051d2cc3322b3ab8e86a8d6137955d2bdc6b1524b87b91bb5fafb94107dcd16c6ef26af4a643288e45c95086883b228f0e8c5442e1e6059be3eed5aa508fb87be9a14d15f7129726524e635a062b71994914ffecdc244ed34cfecee8df7dcbdf284ef10b357f682776b786991b17a5b2989ee123d6c61acda6d65807d19844ef79a5a040e3cc65ee8c6e549649164e33c9da1acbace0f4bcb3346f6dbeb68cc84c379a49349b453865c5725a6eb3c429c9c2321423e1940533ef499e39c7d02253eb8bc97ba2d9dce64e6f2cc52e8dde74276114a758df1799ca621a9f57b3b0bef8646dac5119464ab1c6294e6545a60bcd6411714727c547392582e99bc482101d4c5e970e86991b95a53a31cd23442706bb5b6398b9470f6d4277c769468b80ca4d62239c6e14c33089ca328a5e9cca62a92cc6c2fbe294d4d8c4acb2bc33a59cc674363ecf1b2b59b33316bbb8bc69514cc6c23798697e6dd9dd2846c22c25d385d3d8799a47b8e8a679eb2312bf48d696e5d7369358b8cc246b63ad71d18db16217bf581beba3f4c270ba23b620440786b79e691d0cbba9ebc7c31d68b88b25d6b2c744bf338a5ef2617803c1f246ef2b88c5fa1e5c66f2f149745fe4c5292afb12a778a3f87bce8ba678a3a693596ab907f37cf3ed85ea9e975a7235d5739acaf1a833f513b21571ed88cd04cf7e1fb769b57a0f2bbaf52ac3064375cf05ce69baeab5568e1b6241ebb556cd36a9d5abb656adbbc1565b3dcb434aad5df5dcd694a8d9aebb397dddacddb8d4ad567baa3ab0d5e45cddac866b35b2b5da6f8af561abed365b69606bed6c95a1f6a855b35f0638cd9ba93c6aadd5b660777c5a75a2dadad95aadc6aa763b998658543df255ee87f642f5acdd8268276b2b0e0d917a802d08c8440bb2beb97540ddb49b8db355730e89da82ead6c330f4ea75abb68ea99f4da156cb59abd5ba420552bf8ab2d6da2e4945c1dacdd61d4d0445f80450533946b04a54ce8a50b7aa55b741f64f75736b76fead1a84e6aa0c54473286d56a5737afa6aad6c5daaf47ab3c5ab5767b8b32dd54ae566f670b72c24eb5a7eeb35ead3dd5da13685d35d94d43aa2b2bab55d3a926d0d6cfab168935c19a604bd05cf34a533b6b6b6a0bb5cd8a60adad5ddd5cd5f4a3829c0d62947131cd2fe431911857b867540c2531907c12767dce3b0c322ece6e528a4b5496f3194a184bb8e7d7ec44a31cd9ac30dc3d03698836b432f025033728dd27a2de262a13714aa09c9c1b5756e187b45e3ccf4b5e9d949de43c4483d27d3225434181525ca6515c51b62c0a36d32c948499e43c04254329f1d0130b1cb9478c6cd4cc310c3387d2accf3b2add274f6039759567c63875b192309a371860dc4530b6c0c0e049f1be271836e21769883825c6a90bcc175b88be7889fb8b10352dd08605bc8838a936611658122dc093f7cd976f7811012fa8b8fb46314c56945e266226b1f602852ed2707751eb7cfe96e59c4fca2726fa2d23eac24b117a9e3257ab8b201771c29421c2654eab15c68c9cd3305dc2e040a699498993ee6ba8c4252e5193d4580a5089a5f89478a3e69312bff43d85d27d6358ca948d85b6ce4eb696292971522ed1255c7c29325f9ff3e642c93c02c2451377b1c5858d0f9835dcc516982ea2894d975966181830e74db72083f4e31665b88b5b2cb9e7fd49f9dc82c891f2cc4d868cb8a2ccd0faf2cc2f8c53971112cf70f789cbd42c7b7a86b428c3451b5a5a74d1e2a5058f1661166d64914516a02c5077ad749f88e87965a5896496a8899a5be377e594bf3394175518cddb4c6519e9ba3e2bf91e8c9ae7c3f2ded9e7c59ce21b4cf353593691ee0b136d5c34bb302dcb33a01785b292fffb31d9a338967b8eb499a6b23cd39fcb1423e1a4dca455629cca48ac51b3851fbd644e4ef10de6a790a6f0b23c7b17d0aba2485952c343199b0cbd942543e312293fbfc4e78784a63c7911c5b18c9ab0c7af210cbb505e3cc2a9ebcb1c22a1f367e8f8a2acd5fafb1a6b99cefb67e92d42f379bfd57a8d73b4cb957179d30df369b5649900df6ab51e87ff23775f259f93067dce11d789858cc0cc9750ec3ec145f785ffff03fc3f3ecd182c93196db55a4b1e009ff719835d25fc3ee5dfadb7a8b789ca728a6bb8fbc44aca4d5eac0448e31b304e9994676e72b11221a25ba238a6b464090aa4d16c6229b36d96a6cc8a5934c30e58ca58021d91d9894e8fc8ec04c537e4d4a58beee9c23875f9acaa7877bf9fe611a870e3092aa870255250111389ccd40154ece45448890878e118c98cc092bb58ea08d4704429fbe84be2192040060265787187c0121508e8bcb69974cff3b23092894b96be2c519fe725f7253acf9bc49b3081ca2592e9b0dc628a26dacc50a6b811f39734dc4598f91a856d7ed69f8391ccf3378ee1cb175702f4f733942f4bf848ca972157ce694fcf97976207eee20c1fa9f0ad1208c7d09ae1a3bfb7855fe9c527394b2f6a1269f3efbf9292f4ef183e2231d24974b55992668902bda851c05ad3a0bfd4d87ca5f93536491396d14ce22f42cdd999e272bfa833143dc3316428331c43590295785f93cc5a8f198a550515a1e649640a95a7f94ac29295784a14404471a40165dc459c8ccd33bd3aae13ebf33493b4d9800634d18020b101360c4081bb8b0c8800036a60c027120d3d86c13209c515eeee2414555e647ab18662c68b181cf1cc681411effbd8cb16773127f182c4319197f08932dcc527987011a739c9119c9d1d2245587045d13bbd419fb3510c7b22e809175b287e25b51650c602b62ce0051737895d2eac4d27ca38f1e5719a87ca333bf172776dbe133c621334706fa2012e3611e44dccce248cbe3699388389ed2eca5073a3792b1d51c228133c4c84e21265f478b8c4520ba7996cb55a4b4c29cfbcc42ba00d773129a30af8a280ac15d0854c9732bae0808feedeaedc0596bba0940881124b1945cdc7422fcececf394facd19bf43849092a527694f85c2c93304344ef79511396d124bc24114b82c745f3937024d270175324ae70246248f0b83b7ac9f3ca36127e84981417a1f9fca123ba1c1173df473471b13c42047717a59467fef2cc4618b154e2d969841417316c9b4918e746b392306a84bb58c417772f22e65e04127711951515a126798958639be93d65efca9924e20b114b317848c40d1732af910b98248c728979116a7209811ce9bbd3fc18cde3106cb8fb10460c81e4c27e1ebff6102f9628feac4d21da108ff415e28bef5b0a114baff9d242ecb88ba5796338a87913441b41741183888d41dc9c2946ca39697fde23106b00f14524ef1802114bef110f81b871d484c1ce5be6f407119c9734719a93e852099acda224a57983607803a1b222ec53e225f84c82cbfba43c730e2a710954e2a012a7254ec2685002dc45ccc4431fae7017cf9c834a1f5ee6198bddeb4388232bf18bd4a8ac3433d29634b4beb1596ac694f0162eee5b5a2ecef6161e34971ff6404644cd22dc0317f78d3769a63bdffc6b580f41e8d8c3096568d96ba3381bcf6e7e67f4653c58c103157c5ebd95306ac23279c3c343410002ba9428def7cd1cfb9d914c04f0783649bc11f015a16646432d34d0d2c545d22ccae72d373e5f4b4c7cfc1ad2d244cbcee8d00e6bb8bba7bf03185209bf363fdc41c977b871378bb4197b7c5ebdf1ec77b838d5a104ee1965256114355d9aa57461a509c3dbdc19c98ce9f065b29891c58b52162a3b59bea5365cb4a1b52466a9cb6b896729742c6d602903cb9733e71896252c54441b5a58765ce93e11759252e93e11f58b650e9add13a7254e333954a63709a78fcfc767ce411bd537f63a69e3a2f2e6f328cd49b9fc1779f1a3f78c3d4efaa33427e1941895dda45fe217cd22d4ccc1e7d55b13c9307acf1393da84bd2bbf9e91b7089f381a35ef2bc9851de9bb6f5eef5cdea33307a5664c694986529ae79de13ccd2db4510c1b755692874a74cace5030cc1c2a42734ac3964529cf2c54a618298ac6e715ca50d07bc68ed24cc38ec9d2344969e6199496cccef42ec1fb3ac9796867243328c56852949da1a0d92c7a221401e7084e7312568ee534c63a3a654431988c88755e1293e8452a2f2e65276b764f2cc5dd59f050290840a094590902eea55902c1e7fd9385cfab959ce0f3ead7e699f5e3d77efc1a52d2dc45d7c5694ef247a7cce75d7988b565f93cb1669d1797667966cdd238cd6489625692152f424d9d74f36536531cf44e346abe8658a8595e7c66170a84cf2b549a3756a2580ade17c94c6347b62ccf6e8ca59b9c3907ddad51208c67379604cd2626cd3426652c315a640aed9ca5245d293d2c16942840425296ccc05af2334a893224c462f5a8421910742aa63876e2178b2544c70577df6c8f8b25b6f2e2519a933eef37fabcffbc661a8287322ffe3d44f9247a28518406e0b21a3289bb6dc1ddf2b8db22ee9688bb65c1dd0e71b72b7cee3895c5d2ccc2f995b4dfc0a96ccb5c7783b1b7b858a2f7ca8a4c22d8d566f9dae68c2895c57edc2ff7bde362cea619a594e5589649702a0b2ab1eee239ef1c97f9399a8ab9c443fdb9bba871113e4d24338dbddee625353ecf9b245d63a674df7562fd65799f8b46e18e2992347f8987521b2b377077d7e34bdf26e779936c257c24c568d28de99e9ea12123ae2831d951ce4eacec58f9d68881f1181733f68a21896532b90cd186965724302c0bbd66159946387d1776fec8bb50e29796c57e6bd9007888b45efa36697d4eabf5e81571880421cdd86cdf7cebefbf2e1aa4749f8867116aeabbef0d8a4f11e7467c155ec80aad3fbafb5b69dee46592a365afa11775701afbdb6abd2b6f8dcaced80b59a12ccbfb298e617d7dc4193e6ae1dcb832bec1d4ad1b4c7ddeb2bc8f6a33cdae19e9ca337c74f3e585c14efcfa1c9cded7b1fb4429a731d789853294129d824fa28b4ed9198afdd1a388572277473d34bd1022eee8e812b3582c20b3d85966188ecd36deb7089fb89cdd139738361b42b30b2b9929e534e8bc387dbdf47d8d5866c54465d9859a654fcf509ad314b3c8b45a2f336237697c79f19792bb3b9a1f8df2a2e23beeae6f123abe4efefa268d252eb1147c9e660c49184a89f72db5c62429132ada22165129f1de268c48e62a834d17132e78e86ab9bb98e66fe1342739cf4b9a4b5c4670193109a3248e69d8c569b88b250c1e622e2e92afefabc4a5499a3221cc5394ca6039cd29be41070dcb32eef85582c08596685c744424d34766f8e8c80cc700c3dbc465266738067717c1c332e66593f223d3b8825c126d6891545cb4a145f2b868438b0c713c244a83488a201e168484c47d74619f376a125d7db19417491cd33fdb298ee534f62b263c2c68bdc2e9f3b02024f425c6a546013537fe791a889488f82823a1e6a397bcfb962f7d9b88385ba7a62c8dfdd6b83cf3cdc7303e82fd9317f525fa1e2d807fb1856159a8f5620ba7afbd33fa2ef3716e1eebf33279519bdf6a65fda52c45712c765fbff575e56f61d8455b2d9ce62df4e2d6f9d4b2d72e2a32d39d95309a4997d942f327bdcb6ce1e41c193292662637adc7b1d97e69ecca2f7263972b6b13bd2f12c3c89b6e6ca6fb75d14d31123ecd93d4d9af22f37c4d9a5b9be7391ad1789318e92f8a354e6338bdf9bf8f629cb431d117a1662c769fbcb8b5797eebc8909116acbc384533d6977cd474659d2dcb9f8b7e675429fbbc886f30b50e6a3e2e4aeff977861ca4cd24a0172f4eb30b86b7d9b364280a9417f5677ddecf51f26293175b1b0bbd48e634f645a889891e47a380c26e5ebfa863f7494e8a5f1b17e5fd5b163b2f0e6aea3fefce432f2a014aef2923ff3c65aed8c5af1e744a898b50f3b53394f3bc49302c27413779d3adb4240fe98b531205ca43bac4180a865d28248e096925782703776f79c8e3e605bb5acbca0c059799ec99c572ba51ccbae946cd9e97be4d7a7a865efabec629b8cc493469c6f2c6fabe621bc5484b74aa378a4dd274b9641a936812179672f755925d294ef10d2c34a3248e69a50dc3249aa1f4f40c6112cda84e459d62334d2f51906aad90aacdb0824ea28132ec717afd0727d8104e11e34b4cd9a2f119fb0a8453aab8fb79b1762ba6a43025fc9effa212c1dd1ba0faf3628d9aae99bb1b79d86402eeeee3e1500cee0e434b95c9149769fe2234a749ff397fa5c8c61a776b12f2c2ddc512c55b9bfae2f3f77d4c347b6ddb630423212deea2bb0de2ee9fdd396f8a61249534a3260b35616936ba30d691a49b96db34dae84d2a51f3a8346f0c9da2af798ea419cba419cb431b0be1323fd11833d958089f44174f3922b3939de6f3ea142399e894f43c2f8963b3cdca1a239901a420a8f40ed0754d4d3ac69499111901000000d31300203020140cc72322a12a6a29937c14000876c05a6c549ac9c328865118a40c3284100408800130003042439800f30e5225329cd904683a294b9c9fb94783644d4126292cccc23d4672b66d193a768d57145c6b17e5d00a96e24d3c197a67896b198d7eca3802bf878b013a076aa0bc671b098c165da6095ed807b6c8619420e926c3308bda7be82c2c10ddfb4f3a2692c66b759e4b569ac2d50b05f88aa542f64f01182046284726499b255031995c6780d3d6d265b9ab115fe2cd27eab15ab5bdf4597249bcdeef16516b7ab454a45a2222527478b8f0c89df34abe3259d57825c722748559981768454abaf6f13affaebfe039c90b09dca420111541e4b5a769b8d87b63470bf054edca96d59f1295d159217866ecfeef482a1c96cf52090e35fcef42c813380d1ffd9c61d36a66a49285515900a18ec80761f8a75bc0841d4c6f05a26e73e012076efdb9f61a6d8cbfa1ea003a46bd1f1ad3b9ae56a4686bc9874ba57c6a6240ea400b2dca45951f664ceb5c84fe8200542ba6f022b6cc1f2576f787e3704518859ea94ab450aef9c24f136b903c64e17b06b78574303463820865db1804ac5ecb66eb39bb4f65a9cf91c1030d88273f5ca8b864d7116301070fc8640d046f6bbc6a6c4e354f08373322ca0f5387fef28a0199474ef385be61ac6f54622765a2566fba649c71502506f95baa01c6b47ec280d306bcac33c4ec0847e6941cda281b13133b335695cf7a2117dab93ef6f94a9c9c73813e5b988c634efb00716a25e15d31c7411bef00c5d8076fcad667c88663760e0e32e5176779e72b148cd347870e645e15e1ac86acb769f4058939ead2c62eadb3dd917fe63a2aeed8e810a7a39dd640940bc16080d61ab400c51ac3f04ea024e06bb8e1e102e94b8ca8111d60af60eb3693e5cca8b43bf061614a6811f1e88260aef56639e8bf92de7d0cccd56e895270d77cd0427a88e739c8f051e09c62cf5021ed385b4adb5ad02455d11ea056e883cfefe20af8be06fbad7a88327e1120e3b7d19801fbd9fc35d2d28eadf1a43b75170a70923a4e742373342f1784f9d3cc37a1a519944a476eee005a0d20735d721df6593f172779601d6b9224d5895a09c0b8c7d514e3fbb11831b929617ecc1848ac0a8f09729ffeb9267b4f1952aca316fdf2e83b119234d3fa1b5f769b149b95c08bfdd4820a804249e509eeac4bef54ecda4af9e467bc6a64300f6a63e85b88f900f56c0f020395ad4db70ab1e50f670eb09e388988994b1b96c9fab75cc6cfb6213615a94fda6473c3bf8d7bb95652234d4e7192c08402f915926b69cdb52657c7f5a946c1f8b778bdc54d090d94085e1a96645fe38425ea66b2f1b5635e38124e32b3d00b34e5c12b2d2173621ebd7c11a1aa1aa35de45b59a0f80fe7f39b6ee46e80c0225b9481747d831cfb315200b16746ffbf449edc145cc0044049d3d2208262e0fd1265a6e65bc6bb35e5ce4b32836879ba72b2fbc0978bb764d77a1ba6e7088eba7cb5f0bbbf04cf0f52f061f29b90c8654b0bf27175216553ab8168e1104a79776015a208d9e16793c74c187194a0c17f5894b8089b8a5cc9ab2a597093d7229ede55a6f98f4794e3ba0f7b6633c00ea2a48febdb6151484846421d0d32ccdcc01d221de452d8f6e5e6e84e888377352a050a047a7c08c63dec4c509338687c5b925624b84b22b0beae2786c343ff1fe61c13b90de0cb106fab62149ed719288415ac9257612da566600d6218a69fb50d089251b460ec022f5fc62df07834d9aa9d3614916064ceeddd9f58f4fbad85077656456bdd46e089511a5642f1a5e3da6964b8b2ff6f5407dc56c84794e18a5f8b53c72f2938c98a23a049778e818f47475f49d876084b5b13192f401a79fa055c31a86a8d208e9f0129c93c1374374e8cafe3a0907496e6a522f8c12583863d4067b5490ce29605da8ce6d3406b5526fa0249f191ab30cc03b35262311f2b02c2189360687231588cd784ada2cde7c514e15c1c3a3cd8e56277dc91fe472fb5f6fb92c4a591a6bae042a1a0075422348f356f31ceca990623a9397912f0851a97bf83bc583b65c275c86f0a7e46e78867594dd088880c5ab9a03ec6c7408bf9b72b226995e8cae6d5e809e3866f2dacc96ecd98029daeb860a9c08f5224189cca7bdbd26ef120b259b76ebbc903a9a5289926a3494910a0b6471398bb072240b6b4ea115d60f3c854dc19c53a699c66c05c5db503c6b6ff50823015c8c777c06f248996bec50c3c57c3816268fa6d0f568ccf4ff1bf99b707bbc5085756a1ac73bb556412a1e7ccb6458e786749d8ca3c3e830ed03c917716d87a9652db29136f895bcbce002262dc3fdd52ba8b977be2d1322329fe7d303359d2e1620ed810fdf02d0141ffd9bbe672956a62cce509b23f1a38d381dc7dcf722ac2a07ca5fc00d8ee41867fc03628b45fa9e5db1daee7fd018166fedae6b387e3ee5914f41a41c4976ce9b13359eda98295bd9c80cee56edffa29068b0fa0ef9781f95fddd811fe76434bd713e1c4077eaa36be0e48a8cdca3147694b4392cee385d855ca15231d10bdcc709548a7c60eea7b4281481b20c8443a46a2f5bd1ad8ac37b043a5bfcf12b95d420f1a651f73176170211dc61502fd5253107eff5f5f01bc7d75f18aa4ef1fdfe424f02e1807664169c8c8ad39d2e00d61af855850b79b9961f58f13dd7f4875df85f302cf332ac1aabc8edc2a50edfd406f0362415e457bbc8666fd70a964d70e3c5aa1394b9bc7be650799ef8d2d5502e5f1f11007a39d6090bf15c59255a0218a264fab908832cfa119cc8014c3490d62369e0d9dfcad6b01cbe2851d0432a8c2b7d8ef59e53612c3eeb0f6db2bfd939accd7427e635360074932038abf28d3cd9219655bd18304f4a93a48feb29e952663aa92029c0754d6d1b6760ac1f70d38ba7737a3a6845a86e5d410cf21f4a9719221ca05b916f68fe58e7323004f9019c8f8f65dedd505c60155b63cfdf646de8d9c5648844238c4b5d3660ca4b6ad7cc6ddd883fb001e092d2689e9fa5a8392dceec70b9c7c5ce2ca07aa1e96d7c6ede76bf6e029c856c31922bda6447edaa07f0e936284d9797aab09ed20d2ef23d38e7c128bcfd2a4945d5d0a1d40b08b38728ab36a7c030074ca1c06f04721fcad4eea5e3b6cf062f5336732fd5c81c2bab0a87454d077c52ec7424bd84413f71171a887190c4eb7e10608f8334e9d3f77cd136ec242985d2c5e088acf8c008ff7330833b1857942934bc76e3db938ec17ad573333cabb792e9bc4fdd6583d132399931046fc698a6cc39bb735adcafe3b7c194905a7183c737b7dfb7df674bc825e24ccf252e4587a8601509ea100059d3ec3c68f20a33941134ba1075a1c51318a25f9c1bb6b5bea5076db5ff6e08a81c742535e9ca9ab7209c1df582690efbce808bffe04abbf92be8e488ef32ebab249f20dc4df8fa4ee397b241c501b424dee90de4f8cb403c83caa8421c15f0e92cc3fe01fc39b4a0ec67c0c3bbea847be7f9bdba667f533c29ef3552a28c3a3373a218130cb0b1054bcfe70bacf5e2bc40acd8bdd3d5ed956fc7962d670a8f6cfee35b948112c2a90bcc526928a27a84eba45e87bd3c7a05a9318b11930b0688b8984c976b611b9ad44d4c90988716005a2884dece078f15d21a85665d91efdb178099129dd96d03789cce2f40d6f17896a623af6e943c159ef089d9aba2206e758d2333a908a87c171e5cb4ee543886c9c4513940f8129261275b8f8ddbcbd5d88e2cd05e641fc2614653ea990f844ef5f275950007aaa96167a38af44673f4931eb6a0a6bb532309e5c631a97557134dc8f9ed5106e135a322ad5472f644a40539f9fadabb5d2447636172f469b24e3feb4bc71dd46ac134364fb4c884fe8f179a8cabab3015da0beae2509aa1a3988612a00523e058575ad04d8472206cf2072fe7faf74cfce789ae293754e14fad0026bd638794b09db8a45c7a1d528f4a1020bbb5e5c4f0cc182da3c59384c804861f41a8acbfde500876c8f5cc3daa9a7043c4c0a83d9d8bdf1c43966f62d21bc309a6dd82b18d56345d63585007bc953462bc491d778b0d17b85d5578856cb42ac59871ad866c86267fb39f55c39bb5906de2bb0020e73fe748455a9960a2856de5c0475111ae32079ac9af7b006cdd3e7148d9a99ecd865e75f2c337301ef5de2590d5aba5205a79104c3821258868ff11dc8fe7f2ebcfd6c6698811d4edea9b601778486eefe93eb30da27a05d2eb5ec7e43de9ac3bd9dd5e99d7ac8e639bea35498bdcb6e4d88c30fb15e029c5e8e954cb775ec216c46e7c7835ac9c6a7e9f382c01fc3c4d3d8e5b7617189aea1761b14304e90a2d83e44861ce1b4f5f63971812c1191cd30e89b9d4d66cdc9f523640527c903843e4a2195c615d0df332859694b91ec59c5d18881899d68a8b35bd35a0bb5bd5a8f9af7c29c581635e924466689b9ae86271b53f292bb8d4fc45e1cb67278ed09511fb4e3f2052bdbc15a916505ae08f7e22c97caeadc19252340851b3900c67dccb53cec701cfef58d3eb4668f12a1e56149601e7ecf4b9f3a18f65636056b951617ac2a212971bc108fc2670d6101eae39e9ea72bda360b70b4151bb7437618b0d9487247347702c698fc01b0fc974c723d183e59a4d9f86bc5aea66fa5a05aa2037b0557f86854b622d63b8bac640715ba6f92749d6b6518414a6f414d91e0e0e0e62df23c10c4b09bca1dd20a59db118c79ff9067fb5e093c1c70ed50ed5372597b5e41a2e1da4349ab10daee52eb976202f5aa546f6eb32b915d7a7940ffd5696e0f2b62a20016f652a0812695fd6c554152d6f3a4cf7d31b63434b89eacc120ebbefced7af35a24a0ad29db75d8d4e181bff56d6a98824843d5a5960a712795ba89a5a4dddb19f8ec5ddd64f4b6156420d9db182e173f50af4bae674e912dbc1c6ea48c3a9dba4f7261a250819ffe2eed2e9feea36277f5bcbfcb73b6c440ce141315a10a450c62e5bc050e38d5e4014a9dbf1979f0a6717f95e5aa629b9d921caff30f951bd9011346b1c411c341574d162153f910d059e73b3649686ba619f2f461d8d1d9043a532d2c4b9dcf738eeef7aebcdfe842104c7bdf934e974ce2f3c0e5b475bbd04984f09990289e8332fc85ad8dca93c268f2a176d2401fd779831cd6bf9db1c05b3dad5b58f0f39867219f220696e2232c1c32177430801e0af8431fcc241983704e998121622cb38dadeedb1dce1bc17a01e5c8c4cdae05501b016241789f69687a3402780f4cee0c520d274c81e305b83fe97734798dfac7aa99c291eb063304a22fd40f1619683100e460931068f654a190decdc52809ff91db55b25538cce6f91ff5d595252e7ff01c831d13a6fe9f44729febdea63d576390ae4923cf02945bce07c205225635c404d6347666e65cb8b3b5ec3205e1cf115ae9eb0677751e967eec6f456d4fbf2f4cc2bcb0c306d6b6fa9bee1db85b61ff8f2eb203400a84f5c2b1bf9b3c2cee025aa47394ff255770a0c946f469f5c138f11c5499d3af6b9a3a12f04e7fd8e9ac6d5ed2552ffd4dff1307b0e96d43d2f9d1fe1ba70fc23f22767d96494a9f1a6218b8813a06e83c83a5ab21cd31049d1b89b0b52aa7adb43f8041b0b23241c778f141525716761d24e7a698f93cab0314331c22b0b145eff62d8f3cafad98bc391e1cbca27df63afe3068789beeb45da554d7ee4a26b1bfa42d41a8db1ffb5f2b1cea691e70cc101ce199e27168cbb0909285b4da1948b07f7c98cc218d8c27e083828c890fadcd9a4b1294716b9210169a18b980c5aed5f74a6247fa1da42339ef5e9407744aaec9074a525d101fcfac2776ec7933a1e9aef7df1d10485eca276db2c5e9aa17d34ae909bf9cf46e7ab3a153a345e6a865ffbf605bf280540ea79916f121ed4a0a8af4f9da664e349f10719c6d3bd46f220c024dbcc1dec3652889feb193f5175c93459e2820e19912d7cdf68c2c486fde0881bf985c31fdf53af333b5d7ec4c9c52da0408a23670da9c85755e214084a9288c384314f00244c1cd61799fc7996101b1392607dc1d002c1c22fd0c5ec25587d809ff27506e362112a5b0c20713d8740dc9e63712192432d12196c176e88834fc2e678918ea132428eea2fc7ec74452460619d0202682eb69c529c6592b2e68908f8b86eae7cf9e1e31e1cd50782f1a1eb2098d87e4550e53f6bc6f02f64c3a09adb235781862c216c6419997a7c104570e270663567e919159d7eaa20ba08ad8bbabf076f2106ec83d4285bde40a29e8588f385880d9d4b895837fd7a75bb0d95042854082cbaa016ada2f03eb2c4f1bf47fa3ec9f2fdba914f44e4e15cfd2d8c71870d54a2a21ce074b0a9008a845cdad8bcef9aed9069641eb3a74d5b1666a8e9c335a0bd5c1b9ef719c880b635eab634c9b8ae68e89f0368e95f2854fc68cc167c27bba9843d9f611135bafe268e2220f861f1bfae735855c89352b33d7274faa2b49b36c847bfe92f2e9a6d29c29079bd836d7118f7f186610c981f9ff31c4ca278a59def774ae81b3b24c4435e9b9b63f164b6265f79dd928a0de9219d23773d3d86a1277489749c2c480279fab0c689ee849b971084b998c94a209cdc8acfe8aa23d3a3256834eeab420c75cdb0b7139be9fcb997f029b4f6a0564a7f3bde998dcd6e17b928b1634618521e077fb085f29c0e538730abfb182d1cd475ee5091962363d338e187f8d638726cf4a6617bf181949b26178cd20136080f84c1d68d3155973c97b62555caf0c3d56329bfe58baf226659e44e62cbb1e5d31a0ef48c09ca9f3573cf2688e0e9912340a23de2ade1d4095cd5a6dfe38bfc33563db8dc8cde29a3c6ca5f2529df3f0a218390ce04923ab16c1fdde53c98f0e8acfeac86a07fb16b873684d682b38ea533ad7462dfe010dd01942e6fe314b020032a6b14125e74e22fca92d539d33d2b731fa03a18c9a36aac3ad16cfc1ff80f92d28cd35c621d2c5a3d16b08338e13c585090e673d4d611ab21d378b44ab5e017993b4333331d017a0a68bfff4f7917891ea4980cbf65893420bb3285683dfaca34e9d8d4424ba8e8438bc686812310ea603436669c798cd8ba3da7dca6df265186f75baccff0a0c76460f57ee4470d5efe5b9d470b2d92addece0c9ba444b073ad95809df5615188b3bcc1d24d6f72aaed8e3c3d267c8b816257253f968e9c3a86eee2081dde068609a307cab6bad3a8215fa5251f15a9846b03309f954413833f2f2d23c9cb66502c74cad3edd5c52b3727be06db59b1503d97360c502915f274473470b9f11e62ed2c361a11075e60404b92c231bdc07d8c7be73c10ff866e5c23daebf677ff2a9614ca11928e5bbfcc7e5ef814bb4c4cfa20349c82087e687837d04c297e4beea5783f80483ab7d10763a84313fa9e7c8ae0707f008734151542ae738573826262aa164277c42530e833aaec494549f5ccfc97d48932de35114dc5007fa86993241f3519a171b3b36845b78f9c7b4db38060fd6c3909472ee5e56d0c7ab3ab8ae4839ae3fe12d3dc2e0666d635aa324388607346a5015df19b047515aff366a862449a1dd876bcf273b3db445c4ccd4e0b46720cc5928ee37f366b2828b48e32d6ed6633f4425d7b0aef8ea1b8634fa1a50c257e818d93dff1b413c3520f38230dc46551266fe563d983d4a4fbe0c538dd7fc646efed7a36895d6f6daf514a92dead81d19d143e0ddb047db67fb8228b06acf3efd941bd3bd3fd2253d950d11f533187d029cfa9e72ab59645d17aa5c32f5819d2c92d58c097d007cbb4815cc627331518d183133792afbd9b73af326ba568647d8fd64852799a8278896e83569f85e90eaedf43f3a0d760ce2fc8bd88d45bd2bc704568515d3447f6ea2859a8b1156cb49e632f20570e20bdd60dbb86bec2ba46c8e1bfed2dabf66aa71f981033125a3196d8a4571a8911855934c604e4c1ca65abbd073617e85e30354f496da6a53b6d4176b8ca311326190a4d819c39e29a4236685d8de30258575a729a5268aa4a4d28a1433f257cb1d424975a499da7b0702b1eadfbf47f46f216239444d9267f03c84572af54026fd4a9e0391d578028f6acfa9ec3097113f1276dc0548341bcaf9c6b180c715e2bbd521197f7146ac22502bb01671c9a10f00ed7ccce87bf0163bcdf414f0d000c26818b630705f754b05828d5c445b129640b30de7a068426dc51deca87dff33314c0ee7fcd5c594f93425fa9831e9912a4111ccefafd62647a9fd5940aee8a5a047c7488b1fe06d34712f9e236bcd18b6412aec61c2ca6ec47b28ec99584e6035de9e20bbeb22af35518e2fc85d8371b3eaa1c4fe6ef4117ad8584257348ec8f18251b6c8c7c538511dd957e7c515108863f2a43de2f6c974d1a43e94f08c6891aab6dc55c377449811e96026661a0adae678cc234d7708a6d46d29d6c71400126b99fcb73bf0e9f8481a1d5f861eddd0a1e02bdd46f19aa506051681f248c173c28263b2ab3877f2e5d8ac8e9d8a200f60620199f74da8585a7c3ef3d9fdeeeb808bcc1767432e0bb49ad728914950e26d851a3d629de444fec288eb6102b4bae071ee5d1a2aa18341266bc86f191a833c892da29722a30c371f5eed21b68d9ad1bf4f9db66bb727bcf8fea87158cd8d0cbf1ee53aed7ce346df3d05d3cf2e1e786111827ae5a3f72d7c04d90765ec8fd5a56f4cc6890fd0c32f28faba36397c0da147c4f6b4694b244ea6b1b33121280b2bd5f3f0f8cc41cab50d5470b2e2f818dbfb151c18e06005ac6f31de4e2020490dc802c336e71784d6168b2db1c9a1adf498636995eccf0d92f1912be2ce778b3469a08b888c4685887f1125dc466e49dbbabc34f9eb953aabe14233d3045663748cfefe953fe211725da207c8bf307ee2b0937331f748b01b3c6e631e649b61fdaab0910521069fd40a60f480425395083284c4e3c478e72572dd8d556c667fb8af271b63633af7a9bb4ea2884a063319823cc300df4a86c6bc4a47c41a34d8197b39d776a6893048b05ec23ca8749b09f7210503c5341b9320cae261758b934f1e5bcc8c04c87649a8bca84e3399fa186e935cf454843e69bcb8cd8b119d06fc3fe7803b2ddd110466a5b78efd0a75bc820e95a1dee998a88451c772f055af9a855e798a842745ca8205e1f9d61c0022037bdb4d7cd789f557c0602a48f38ccb84fcda371fc5612658e06bafb791a414ce15103ae2d7e8a2792d0e52e3908c6b2deab20ad9b2dc4fc2e16bde57be5b5238b74b00074c659122d8a8b438209e44d15395d1ed0b959abfba0edfb60d4c0382faf8fbc3aa09603c85d895eb929b81da1f34a6bc1c433bb12aaab7d95ad837eb9ba66652667f1788ac98fdf8f5cf591fd338136555d3e458614beac60205ae49c53600eb479f23ee57a815e760d36b0da4f66dd9c0ab39a89c57645d4d9edbd0fda7a119b6475cc18d8e36490f5c9d5e28868dd06ddb13caaf6d2e3cccfb9f7988be9f86a29a0c6886d927164e403af2e775c4e5af23e80128b4beebb9addff5a7a9abfaf57c7aecf754d1be912ac6e2807dceef5fa271cc0ef3624fe791a74702baf9471475d4119c9b3ed32bcd25718e639878ce30b1f3dbdfd437d9818c93718a04fb8d360e6ebd32a76a91ce167c9be76898f283ae3bfc6459713b83274729badd6dcf5308677e6c88330db460327a581f4c6d2abee26a2a2406e6601ce2cd21e9629adeafd669768862ec55d493fd3aba0bf5c7dc82b599c0544adda288f677a52269205a9a83ee6fdea3a63ac8558a5714ee7818af879c0b134ca32c89ce422f01bc887c45c7e511216d53db1b88d30417951e0806f5074c0f62b1ff892e8fd14de3f0849fd0a5691c35e5252a54b39f28035ca45c6f4c53322728a24ada65bf6d9b2ae96a32340129753aa0d4d698d9ed5d83f33f4853da0b040e23ea1259420638429e00ee0149375c68a4fa061d23aac7409c070a1efa4434f431e394d83814a49be4b3678dfc48e89ba44a695599169321bec3ed7ec7164d57fb77a6ff2e02df3e600163c3f3e4e9ab96802c7bf74820390535a3be47447477a9280a24da30482efe5df0cc79f134ad7d69ccbd2f7e348d069534291be22022fbde7c9be5d3d7cd31d46ca2cd2bac5980981de4c695349e78608d706d35e26aa79587894ec59fbc1264d7b079a073502f0cbbc7d6506c1bfd1e8ff1173fde0eb820a8483da662c95d803ba284f529c4e6862988242aba357f80e91f3c3717b3fc5a0be6dc062784ea625ce0a51657497c82b503e3b6f5adf9d9f1a3a878e556e7081f6c8d323b4900ae4671a9f09197f7e995ac798b9769f999140688accac352a4b68b6eea0d86ec5115910acc83bba08a45aca6cdf916dde3c83ae72e866920c296aa58cbc1cdd641b0afe44f61351587b1a2765d73f3952c5fcefb2c15af1ecda1b56737833a3ea679484630d752a1c16ceab7d40f6325d14b042fd2723f005d8b7b4523c588387cbf07a951579720ec58b504ce13338e9876a712f4f47e6a6599b2cb593da4341e6f16918e6d74587b9b8b35cf9eca499a643f5582c196607b4fcb0b204582f4a8aa43c7c3c9d471e2faecb4c0801b8dffcbd9c6c0452153814029eef5dda4e669d07f30182e3808b6f642a3b5c2222d9291c6827944529f99d05d81ddd4b8f0cf437eeefba6f4fe3fbc2a70f85e033eddb01c6d31e84e6b6fc31325a28a85866b2afff6c2956246391f399758dd9b82de78d978b4b7647d9e80de626758edf7a6aa8281ce00407053a23e0d465d612a41d54ee696ff36e7e84b3527c1b6e48db4f19707f268cee3f262febd03fc6bdaeb69e0d8307ee96b6dc50cea221285818faac57739fbdd6a38b7215963083fe934c3c58e9a147473c7a73bf348de87da595bceef2d1b7772b2acd4986e080fc0d83b91633af808a2796778fb1fe08b7bf4e1d882279b3167fb936f8c73d45c0c98590e94e8c42da24873ec793b0c9cc0f364bc3804c5098d71eee992a9eea8de7096f101c5d4de889a416d160f1c8423077efd835138c27b5a5fa5a913062cabbf7ecf4ede3a5e19ce93d3d92d5cf6a7d4195895caa7cdbf18c18cd91cc2c8c5085b29bd3c97f63e0a62c1f6fc0084109fe7b99c7d771fa1d9417b918a3c9f59d25228792590f80c5c79e266c0355332cb74f954e2740b5a7c2279c2c9ba5528e20629d95194b0ce74b1169333611721bf61e6640223e533d97e1a40de1200d7402b145c3767c4e3521d48e93e72e20f8f5e0750970f64d5774be2bef95c3af3987d3680a247302c6c349b517d21d60355326761c16782a227aa62cb2c5b7267ced9cbfc069182c1d47eacccbbae59ba245c1b54323a928407d7292eb8f8884ac7f8bebfeda994b60296885a4b9f4341b3cebae4ee71d389d769f35c072732cd9b8a67c490c7e2fcf26136e4e8569fd9dc8c8ddde8b617bfd45f764cac2c6138f068329127662f56c07b45015fb155241b1df178a2bb4be22715564808af2fe54f8736536f479a15246fce52c9a98323051388c4fbc9ecb076efb64d20b8e3e5e6927c335a22a6d1221a7f4dcc88e940952110e49a32c90a53c4c76c329ce65a760617b7b8adb5a51ea97bf718db251b598246f3af42384c56b786c5637921ad82660a49b96ee4bf5ad50d1eb80618b94799fb348888477977137a97b9639fd68734475eac7bb99819a0f7f7f722401e2d3c25f71be5f1271a6af13c47f75e0cbc5d541c2378d4ebedbee9b775bae817cd0666fd63b4a1508485984639fe8f573898e2a18ab99abbf20aea58c38f0ebc62dbb8509a4b7a0d7d765318727753ff742540b40e4e92e330de79f1cc04968783671fda5c6816ace29a0df4954246fa5f0028910455f7dbe6396aab4a3296ee4d17f9c34df15863fc6b53d3f62624d79a6167db787b3b0bec90ada2f5e4329e8371d9f05b5970d4f3ff44447de6cad468f1d42041710fe6671f7d4f6f76c0bf9450b038fc0c8832078a8880553494ff3c76a1735779186993bad5248da22132de3576ab5a0eb84817d15eceebd296ada906cdcdf5259b775eb65292024658e0bb9fb3b24fa26ff959331948cf7485018e8801a45c74b29713f876492212d5481504820b7d2e70acad983937aa72a69ea41fd5b17136e6df7a79b6af6bea47c1d5a5439f269cc544c4c5f6e2e3195ff4351ab732bda33598c5402d115674b4ca2ed069e2aa3e8bafa966fa1014df7a29ba7c3733c7d8489d970dad0d16cc143208fec60aff0a8d2a5ee62eb9f44bbe8a0f0fb52e48e6d92623d3562d7d6964609733f883e7799ee4a778329067699b4d5241b0fa04e1e652306fc773204a754f94d3da40803c5255b9bba38cb11901700b7423385f621c87c59ce92b342034f476ad9c347a7a7d07764fa4b76622a381e360be44862684c2383dc3eb5d978f004ce441f4f0d4c06a653c16b8e36e5f0f83f24c9b030fe517eb102ac310afdf8a2c47bd871516abdd141e998728ea92743a1ddd7a677c0d0d704f7be8ac18aecdc6a7ae14548e1d57db2cff81f073a091315ed8f44d4e3777b3130e6e48a8b9cf95764802775fae0046ed7a61f6006c82b14decb703e35e4660fca9dbf6f84c77cee12c1e0f2bb52ae4f1ee908332252c7949c505e75ab7f0d1cbf6d0821d849b1752988b8ebc3faa45af6a59a891ad478a28462b7c4502454e5e342b418d18d4fd1be07d081ed3f8bf1cb2636e40a38338d369505f86e360577b2cedf39d3c23401cf859a6efc5a15f7499e87f7b4e2d7111620f0f342a0cc585751e5963d291eb3f0d18bfc8dc3de7c98100eaea6cf676882ee202a0cc093f221e04159dcdef10e2e993759be1792398cc507d85abc68f8937e200de67580b482dc5c960fe29721c66fb2f99b0ddc54b94c4950d86a7e62eb89e5a4404f24aa669e9cf88c7a9a670f909e791405d4bee9195da40dce32876653ff133d46faad8961944a0624a8ecbb077a15917134a30bc785851c2749dbfbb4c7d9339df461b4da4971b6e87a2056001dc018e7b47936a56e9a2cce4c7243b0515cf9c8b844861b95c38b131e8edd2f8986bd336ec6e18b2c239bb97d8efcdc48cff6fdb720f6345951da1da361d2fa0b1a84b04335bfb74af0a1c17d351f36e423cf09cecada32d573bae9609bb80856a1458e1509d627ef206bc7b3f0848d5e29ce33e8e56f65d00ccaaac594339fcc7a81855a01ff6d1bd8b4a452ea090c5864f12a613fe3b545fafd11875221268e7f4e8a260abc5f1a84870c196600bb3ccc5a29bf483bad6804a305ec660063d30a0730e4445b16e65f1f87e01ced3a43b607c39c9c0be59e0e1040ee87d3d42c7b13a12611e5f11265a3bb14013a62ea3a033a2a8b2126486a5f9beac2aff771021afe1546cabf1096cbe6614a490813903460a27cbda55a3923c057055f06adc3f15c8b9ee9737e00e52fc75f004e19e8ad3b52c32147617555cec66ad5c17b2aa1a54fadb482905f4edebd9c038600e751741db6f6b5e340a59641eda8fd674bfba45df41d6aa06010103b9236c49216a4671e594ab5a8d6ef1052c8409e18bdb04dcf1e165d81ed99fafc12ed022e4b48a1e3a22657a4a10f55c57ca75c4f214eb21e99ee31e4642aea7e81280889741e09a373f62a8c916e259e54519ff37c69d24e427fb9f2ce7d78b8785aa8e80c19f789fe1fa7180150352f632eebdb81ee0daba2fadd83c61c228fbf238fb826599302d1783e9c16c167e7ec8fc6d0c3cbd841f0d5d763f7ebe7f708b0c36d2c5a522a736cb311b4a2cfc31324824f41f6f1700550ff48cf0a171be0149e90bef9e58d555c7d593c1c3a66c3661bfff45758823824cc31d92bf3e014d2ed5fd2037f087d385a9caa33415fe4a81eb01ea383b0b90b7fe19ea74b804dfa61bb1381e859610d38b54acd39a7e121bf3b3c60ac0421b5e0aea8e2a615540f1688441b7b8964474593501644af264ef8c6ce9398220e3a2dac7a5ff54d9b14465cc34525eef606db3373354ffe09f0189598eec67b6db93906b7bd7f97668c4c5d8e2cfcb5ee34302d2971b837046e57dcd0d928778cb6e0fa320856c581cb63c14573959c11c71049a6df510692591aa97562033ec9ff51463cb8a65bf03b01db10206e0f66dc8cf8c496d960b898aac42eb5ed4c78653b259a885bda316dc797ed790617ce9b98bb337ac17966a24c6a822e7fb89dc6fe0ffab7fd750dcfede224b3ef52a98d99829826c0bafe60d9bff0134fd1c5c5cecf819d8629f0615d56b30f9e0e53d3e6f6207540430022784206d14e1019754c1dd34da0ed1971ee5e783643b3e206874ff5f904d8590d7acd8c0fe5dfe8868c58477e26d78bf1593ab10638f12fb62a4f8b4acd4536d5b122306ace40c213d82b51123a5b34a7907ef04cc6867fad2351e3a8239d801d877075357e8605594671af50a145f6b04201353d6d1a371445febd323d6e41ed50880ed719b0e549dae515106095178b942636f1669d56a91f1cbe9f339e049af6ad004a63b9a884ced1c8e2e9064d84f2e9e7fc830f7c1d5d0feeb411ee4607bc797b2dc1fb33c3311ed1ac143ad901d9ebe9c10c383701f3074381b61767f8a7be2d2c95545f39939ad3a23b1728e08f5b0d61ce505a974573d1301c631e97d80e97b1d5cfda964ef35c3a7c490b01e530cd4593161ddfa0a9306700aced82bcc1d6da0d48b09bac18d7c241e67ae5612d623a693f405e66ae9415fdb5331ca814c3add79c78a237165a134db4c86244127896d9a7aea5a113ba80ea77f104c139b51e52f2146919fc9cf6c60060b3f6534e01f5624fe5ac7fc09f35ed60dc5fb309cfc9d1fff3de3d21f277dedbd847c3146f63c7ad139aa3738f04fc1f6a8db508d28f08f4df5f6efcabbeb54cbe44ccb0d58077798bc5496fe3e155f3e1ff5422436f45b3db17148fb1020ccaab9ede04adb719dff373ec5fdaee802a4351f60c5f7ab088536df68849cf741d47bd27638e0b4314ae523fe59d751154e5716810156b8834db032e7facc75b525b87a0efed5693f13fdd8ff5acf60860c3a2cd2d2ee0f9b075fa330c70d80d04c3df6a91c6ab7a7f04794ec98fc5cd500c90555510fc5b7c63e9fa18c5b9bb080631462d86129ca0161b74f6fb993040bb7f3ae4c3eb65ff3ff15ec8c3b5cc9195b1c5bdd4c7b126bb70d4faff57c1e633aa72df3dab4cb3abd6684a51db5b7bd90e7e896a63ebf01b3546f5221711d02131f36bac35610f992ee7638e5f99a3a2896b80d30cb31cd0538c33ea70fec95e8e815c4d1faae363f05fc5c650f6cae03b7872fe9bcb3af06fd6cd4184903b4a73d8f0d11a915b752f717c0534043249b139f5cfaa0de1b18d6cef05ba5dc5ddd75e0eb9f2cd3bd34e3cc9eef00f786f9ffc1bcf8d300e545378290d23507fefeda71ec34566de689256ad96ad3e23688ea83567d99c7c1b7fec31663463eaa0e9b6d5b6eae52b659ac47765e2f769cd1d09d190c96233e0f00e0635ffe1e2e5ad0a9dcba27c3013a23711c4403b9bb6dca9878c30b0f53c1d8c16abbe1a00017d4f122727e19a7cdf4dd1277ae1c7068d6053849f6a9074a5477cc6f436511d331d150460ad6562b6d3355187f84221b6793694e9cf8584fd5c76a54e8463847c8c847e87ad246ed0f0ea4f3c21cc8f870afc9789f43c29556c745ae005672206d903eea64f901b0cc37c59bde3ba8cc5bb1a095458e112988a82e258f8363c171704b242f7216219c7cee80e3f99223f9cc3fc75f84947764f719e99cb6a2f6de4db37158ae624c5c0dab494e51b0180aa1fb8568d48d6ad875761e89c6f7046efbcac6b3611b61e47b131e156ed775489f04fe54ef9624fbfc41a655195a51edb2136fe151b4d41d2582da2a286521c52edb0053fc54439441ab18d858845a3d152bea2247cead5a3dbcf81c996b5bfe56b07ae0f8dd9848d8135ba99c4e985364c49f28fe8b8ed3729df39f933b71e3e65e4f8097b40dcafc0a0138ef1eaefd26d108895abb7e9692b0668f00cd56257d98328ef8f205da530a3b7c00f718a8a74950ee16048ff0da2c3ab92c5852de07608cd760082cef04194977fd4c5fb6cc99e055f5241af87f4a6460745fb110429d3c2eac368950ad380146f9963c38068a4317ced9be65ca63b66c88d64d2219839e08c2752ff9c95d8f301708ffe93b70fe90e0a7fae412343dd2d434812941e35926150698505512c57736b72225204770bf569215db25031dc244217ad27c68b0209fe4f077a4698532d0138494b10344d876b21ed87d06d23b3143860f2aee6edb4db9aac731ce76836d662dde52986eda249be1062821e508d8f6aef5819e6e054872ca7d3df92d18b51949195953961b177e5a479a6bdf73ffbc4db55b7000512a15d471970223257886cd31781338d5fdd71068f4396175250a7392bc73d62648c6aa493a10cb7d2f004d3d485fd370079dfa435baafd073c1474c262b432a307107a9bfa8461d877c4cc1b95b5e6b94dac0284c88b4113ddbba7960429371e96fbf337871663a370d37a497ec0ece0356b2b11909afc50d0a601d5225a7a0ecf0bfc49ebb975982157837e65e89e53e3aafb5b38c979e69aad0da13e4f7b1a1d75c91681da6d7586f9f42588a92f31fecd9850d792910858b0410791089175f69f85ba6aca1b1461a7a00306eac03884d9c5f2e92e14bd4630024b9a5a5c20bc0adefb4bba95032ba27d02d317d9e0c2fa053c768300f927ff81532d22a9e60f21f6c623c0ba1ad03588ca7588c4f0e143cee0a40694eeed1147b8bcda10c6ba269c261d836677e1dcf49f52ed5e16e6befc40c949d8be8aa05a28a86a3e4ec0087705422f16dc112367775df422ef8246065bfaf8f4bb0266f06c477bda2429ae0502d54cbe072454961ce7f03bbb35274b20678e50d2ff42177900ec27107a8197bde3a1390c46c76f4d4cc116f254f455ca64d9513a483f69a368b3493b209d92cc47031230619f30196b514dc4f9b9b7170f6453ae83c6b518803b038b58a5b4e9e2afcb1eb632e4a831e0b0e6ace621e5f7a14c97780ecd24824b5034207535cd0d490d5b0c038c215f85587a7134a6f7c7759786b6cc2304041a5c9606472566a3cbab51b2a28c7de13ed07a76f4e06fc04b7816275b17a85160d4fac03fb30d66b6728eb6b962fe591c9b07c7fe2949d6ff967a04276789a38c361b8f12a644fb7c25ecc509d942a56009482a6c63c1a879e81fdff87612c2b0ace4a20a104a0a9e4f5b613708b7c79695c16234f4b579da5001a0bc188cafa198c998abd684fd46100c7654040216c641c370e2a1ac9506f19098acc1c84c7a47bf717204a25d321a50d8e853edc144c9acbefbd2b68e60573238f391d595dfaca501225cc0d65431be17fac03c86c85bef467b4fe2dd48dd3b597caa931cef3f5e79a9b77192ebeed808e068c618434ae20266b24c3e2949244f7dd4f2d88a00c7848219078fef9fd410f558e02d1d2172b33e6bdb2383c211285c2999e783c8291b5d1f01351b69133a3a84738f267777ae3012adefdffcbf2f25a1439f95e7446a3d258378cb1926d20eb6295c0a3f4fcc3a59e8366f3d30f6e32f424897266bd8d559ee491e15deaa3155934713919dc1504a5369c827920a57ca2217e66ab24c7b9c2263669a83489a4868a1b8b1a6422b0166a54007c34b366f4007ee11db828a2797291ec717850786ad9f1e67dd733ed9f834c3136317174ab9fad6c5b1390b29ea356028d154a8b2fc84b2164f5e38c7fd2bd05b0f95ce3a458313c46532d53287421d62017bc3d4ca18224493aa74229506c1491a4391bb1b512a879896e4a4d0b247a3c115ce3aade1d228446fc49a06c72b6fea9aef3d5cd8bff735e602762170d2fb0682806ca4519f1297f531021503e18f8c24103317222a0e4c3413de796a67d1d6d51bccf5826237ce53c84f090cd7369be2204a15edf5f22f1c191f872728648f59108bc33374b340a4123a71bc2ba40284bf8b10057241eaf8f03088d8f7464247d31a31ad29d40f88613dd5a8d95c1f026517158e96af2b6d6b2c6c9c34d38a1718d62f9b74b65591d41d2f4b148c72e90dadfaa1efe135199d9f052db89f7baca5e10621e17fd998670121fc75089bd55906d09bc92bc55a583a4d1537c8fc67c373924b0a0d10b12905017cc50d22366b571df4a06fd20aecbb1d0dedf3d39820d4f8bead73d7278b51d7c3415051813f0076df9afc2de8cf97b697699918b57bde13665305e21c397183acb835057c9be59474355c53811c1b450e63ab44e480a181c2a4c883242a9079bc0cf48dc74b7e7c75097eee617c30ec738f42052e3cd8f0e80c04abc0ea12df2079a945164dc2c14989d6ee902cf4f6c03d4a2e43842bdee8dd822810bca2359f5e760b4ae3b1157a432c75a3492d9b0da5950400612880cd82bf9de3f3ca0bc34421dbd7deb7430cffd902aa14df209c7c114718d5d616a564e4922d854d668a55fd3b6312ba87a599c8ee73d7a5d01bc6bf73f33d87ee01bf2c406dfa6b07b91ee61ed13a6adfd466ebb2c17f19dffeea66b5e5ea8007cc1a0e425b255db8c7f15c91be41f0bee3e2e784de46e61ee135fb06296c2e4fae003fbd1f229c495a3691a6793fac8a2773fd01888a8fcfffe90e745b4ad155d1b31e038d6951a59fb939750ae38fb8c2779716e38027c528baf3ba7b88c06c90679b0884e2c03b30de6b770ff069da96bd3fe83df2d95c190d15afbf5d653d18a6d52279c5a0f770b4975cac7790b248592a38ebad4749351c12990ebcd37a12ba11b71e1d96f37c0fa8b830e94e9825e9ee114c347c1ac0f0354f10dddb546e2c73f718631f5b163ed882de51f869b1839d1618ad0c0c73a0689de792e766e45753e1e89c6a78404fa62c6434ee1be67d009ea7d4969c910a8937f946578bd3380e1d7ef74eef2099892b1cb4b8d0fea0ac9501bc65eaa16855110381a108ee0648f1d52b07975eb3c6c191576da32660fa1e12db22f2c375d6daf2398263a3edee514e8cb82439d5227ed40195e1414055d3dd83c86d091f001725670b74507fb97b080c586421c8570a6694f3e4da3f02c41e565a3f7ce80e7a12e131e3440252527799840e4e0aa6b9f02762d876b0116821165f8121e65a2d775518cf6e128c74e42ba92832609325c3d696048d376e62006202fea1087c3bcc2c01e840075d1fe899792d3790f921f5e6df7c366e350fcf0ca151cc878ccb361d84ce0d6680fb724cdf38330e1f27db87c1b1e6cc1310f2d109d3871595b2fcccfa78579b07228088a656bab6469255770f3848343be7cc6e58cae18a75a916f974f1a2a39a29353ed105b99a7904fb3610624dfff3d3cd9f126fa2281a951416cbb91c6e0f1f1a774d349529aa03ddd362fa6c70c601a34a9b9b4848492c6f5c660a03abdf8c1a52de622db95118458a6d56a0860a85780c0f0ae2c025b89f395e29ce4911e268126a9518bb256ddaf74f67bb52bc0a6d36dcc55121e6861e620df8964dcc8a25f82a7c0604f45a03c79dfd19641a9c61c5fb26c6f5473c2e4c49a177372372f00b070de2a0f0622d1b308f86bb8ffe77f92374d53476bf6caa1dd336c89c2874a61a0bf8d1bddb68a1a5f1c2433f87ef5cfc47fb75e708bf432bbc53c5286dc5a9fb56d92b889674c7022dc7fcbcf83ac39815ab4ab2109c5a690ecea8e6973f3bf1bb7c7769dfda0ac12748a95d0a94b0f5904271d061006303116720eb9ab1494b7de670547ce1b7e8f013214a398f72218a96249a7a734d20786bc01ae478dd3901b587481b70b2e38af9b4546c0fa1161629e1b9559a8bfb91d3707a041b20d5029d8f84ed21ae99fb9879ebfdadb35cce060a1f106db28f46a4a8e856078a3ea01a6a7fcb05a3e7c0837915efc051700ed71cbf663d0256c3b0c2949cbe2abb61ffca16f5d09f9c4332ff6a6cebfd31decd7785ffab439b2f58e24edf1d1a4fdd8097337cf0e67da834b39d6f7db229a455f0420afb26fa641fe96fd7c0fffd42564f08254fcfb2b0e94e607b483c3bba53467a220e82efe0ba9761b3b2459562ed742df7926a4a31c8cee3b1c85196923c3dd853ed61205346d80320de7280644604094eb51ef8d96c26729e5462509e557594d4559dc608883ad25cf301f23ffe2fff83f0fee23305b59c03ca852b982177c03b38f6784769aa98107ce8b988df9665900a10f482a0411f4af72612ac0bf08b17fbb2a1879fb56b89038c6a500a11f222428b3ee47dc221efda4e09f8d7aca045df3294e0906f6587c4fc6b5ed0a3cf6ac46db0a94129a4b017012dea33e44ff3ae7c6a9eda801301af1458493f62590ad1ede19239fdc4736148842959d7984e6714206378bcf240d3f786e355119fcf7bd35740cc765c1facf1b552374d1e9fad46ec5cdb46322bb36a4863d3b336ed4dcbbab4330d6bd2c63459875481c606959f8f1197fff4bd0da9756645389e30a9dd8c518439d81a6836a9c3c0a92fd4037cecbc1c0dfd6d2eded5c1514d1c5cb88ebbd28429e8bee887e16234dbf12ac785bf56c0306b4c37f2b677968eebe48ed1389540107fcb262f188e5d4938316331c45fe6fd6611d25a38faf8c1ee5f4a8de24cf888e20cb0784ae95c5ef8cdf40d7eee269b3332b1529efe7e91cc09a76f7cdf2c9585c88c82751b24cc9ef5d6967299f836f1cd3bf5f5dcccd89f6e6867d0c73f14d21368f95410262cfa804c9f66d68a4d250b19ab47d6b5c8e9479647e3b43b4d728ddeef9541b6dbfcf637654c6d5670376a7be2fce9f51937fcfae255b3a88eeaa9f76c1fd2239f8f0371b1ebde98d8058280c4ed161269ebd2d3c3a62271d1e7992d8b219756bbf399e0c186b99e8cb245c7b78c763e22f4ba32772db5e3a2af20a74e2b2f4cacb871b9a9b365787e36e6bf870d5b8655764e1c8bac9990fa6be2e0ae9cef4e5537126af2de8df9d45be11b5614b6a080326d4f9d21ad95890d7da51f2ead52d091fcfbe2dda40fa15720a302cf58c878170b22ef4b1642183189314a10bd2b7400b27adaf96815fb5c4c7ab7e093ab28a1b8018dc64129ea444e1046d19d7e35d8482dc15113dca6dd9b9712e7287a2c6c52e8d8cc11d3d24d611b17991fd92324695fc836170a5c81fc697e232b297c08d49e4491b74c7a571ce97ce3f09759d36e2d7156134ea35ee5d6ec8a8a32dbd88f75273a75013b203108594f56738f43404c3b6cba97456be2d0982b8647796126dd9969b4d21f0d242a16f7516e551335d3c041c08b45c0d8c486dce28dc0956793ebc4699e288f402b01ee2e0096bc97a079701f7abd3f65c88b426c98b27f292cf1d3cc5af202962db7e5dcc31a6a99ffb5b2e25240747be45c82bdb5c3e0a621bf3b63e0a6505e735b638dcb049a5a86cad92f640ce268b67211f11fabae30134f6d6f3e2c5ac19c724f4d97b05a6f63e7db00f5cac04aef8fe1d47144630be1b0a6300fba0650ac988b1e0f2125b7fc2b7a001978627d51fc57d33ff81f5393827c94c0cad9fdb26a814fec8ce440e5982677c90f75b13ae1c2e30270c35ad8ec23ee44b24b9461c819c3db9e6e645d9745aa50826cbd2dffd371c5c308f7eb8c38e50468c8cc8bbe7b41a74348b4f986f2234297bb94c7904e53f005a2f6cae1c1d9c3dfd3ec542990ba717ef2658e5a5f8ad2751830ac1a291cbcfc61f4b3b2029352ba788c5b61d2934d4167fb0a2dca383458aeb578bc75d95eaf9707128325de4f9a47ab460e613134de44e744cfee83ee002bf377558f05e0bf42972280a3a6f98594d535be3e51bad64b59eda31f719bf80b7b01b056ca4ca601ca5792d7168f0d7ee4ec58d79ad99db65b526e888e36fc865e4ed1b0cd1351044d4b0acb997d0b6042ac53855eacce524fc17139a2b193adfc4e204fc41cb396a8a8e274f3cca9c43af7596fab104e33a1dbf944f0fb03b0c4b994c615862a2c12e47d3a95a4bf2ead7f8067df9acc19c42e5944a41d567311a42f351468a5bb6525b0ec99b436467f3a2da24f10d310026986302895880a630e374a8f573120a6c38cb3528fd3d5ec5713478ed242eae62620761195170b486face382721504c23dfc6a1c7010829927d53bd9dae466fb1a2a71c6e57b95dd758362f0244c93f5a4973d45601dba15803bf5769f27757405044c398e9c8e2ba7f3e8ed38723bef1d2fbe71a9cc395011fa0fd48ab78f3058cf8f029309acb719d84285a0154228e4aeb8d9f6e24509faa1195809524931599cce511cf02d7001c4810aaeaa65dd8efea21a0fa33e40453ff80360a4b1f691cd3d8ea7bde28124b45a12de95ced59b9599878b5c92f68cede40d9578f8f71b3126c3e18954570a7e539748d07bedc10f3f1900efdf72786f3ff2411d61e6f1537071bb453900fab0e79ec91a6952776bcaf8e93c21b6d61d686c58bc0eb712d1f5426820388bf6407d10cff61932efdfb81f627c43f0c36ba711080c592d7ed6e31059b9579af9e8e0f425432055d3007478ebe97e50b60a9c9f71f00e6fdcc307a644927471ec6c6e8787e2b99cb162275f9acb0e7f16c1fa2b52d77b8d2c062f9c80e75de8764a3ff366d6cdac9b1937336e66f4a679263e4481bec86c0e785b1eda29d1c98f7f329babcb43f7a7ff23febe7a612f4eacf9e6fe4d0bc52045113ef7687a85891438002e2d3d73da0f2aef7356cbc3a07ba93d2eaffbc0674e2f325fdcf0705d0ddb0f26fc1909a12fc0995f1fa53850d09591851927d7d894c5db1de2ef0db5ab5c26d919fdd16b8728dbc8a00dc2cdbb076f052d8e5b663e46b1b7f43cbdf541a0125663710da7aa685770a605bff7dffe36cb3ace3fd9c2b0e146fc0f0cf06e19bb610fd9807e0309e83c1769c1898c8251a9fbe0a45b42c2090254d0a5c6c97d78d13564c537b79e14075fec41195e339643e6807c9698edab307504df2171b9d5bef0bb4dc79a7d06cc5ab91faae4ee2e6427a5d4908e2d621591f474e73eb3eeb18a4bc23b061fa8b0763ed9b05448e19c398ea5241e9c89e7e4b171cbe2ea9ea114bd6a7ac3394e75acee8df602199c818614a2b596aeff180d92bc22fd19960e938cceaa749f33270bc7831e99858a363972e7d529f01ac14edb3abb4ef4fb08ca9b75fa35b2ef8f69fd6a01f44229c477bb843738bcedc1e358e9d7c1df809fc0dbfa5117f885b465eba31c9ab658c5bc04db2277d5335c2f86e90b0c3f7f66ad94cca51e02953a13e62eb9b51458f453aa99dc4d90dca8daedd17cbebb09c6223324b9cb4356fd6c05c7b96e0067484ab3d603354424586b95badb57c4f59702d91286a89c629fdce31c5b4af1ee26481602c8be4228dabdd77f969de835b3ee2e739539ce94fa74ba55a276f7670774afb08b4b178b9e6c461a3ca5d4b41bcb9c51ba08d9ad009ca5750671b8389cfa54ee2f3430253877e35314f004bd46ec03b3f9fba51c6871e8581450629163fd433681477df3be5de2f4eda6844c5dc080f021f57698de3b2e6f72ebd305dae103f5da7c656d3a55fb8715b9dc3dee2559915e003d9addc1082a301a586189d9794b7faf22081bbfd2350e6ce53ea3a74a1ec16a5d6fafe436ebc73156e629c0ce696350c7624538cec6ad799ce221eb26eb549aaeeee78ea2affe251508808e1c5878d53b9a96e2a08459988c802027761a951c0c42b2f5e14f0e67a1f18c2add4a7f1ec0453917d1927622c291508cdf8ad2c652945a26676b6d29111f3c812d999cfae06fb3e815759cb278482a58ee64ba96bb9412e64b4668c96554304205a6bdcc42ef805e0729d7c7278673e28dfbd21d8222e9b924db0b2c30cf6c2893c0f42eaacc05a5195996f697b53b286d06c68c378ac96c59c187d376da4389eb18a823e12ebea94988ee9f69bd6c16d269bd87fd83ce03fc3d9caf4456f0449a3d2ef2f254c5e4f2ea11fd73c979183b3c0309be4af82d0f40cbdf454a732c51464df5c433972380fb3b370fdfa871c51a9881e5b550a2771a874412db47d662233c3bbdb7f3381e0894d30e310a65299112d087876abcaecb50b6070253aa770fcb87f971c4ba44164e6f2ec051cf87b5e9417c44ba1e3f78aaea84a5f87f4fd62eb51d9daaaf1f1015427df054552787473e8891baba02a5672f86b83bb68dfac4a9462c50ccc9488891aeee2bd9800f0f3a234760ef925b5375e4c49cf16cc8370795c804eee86e04c4bd62d9940f17ad4815f0ac8e3c5afa81266de5820aa24aa3d4191171af6836e6cb452f428173391b5dc449887a0564f929138222e28da2a07aaf297f6af455f0d90ca4618fdb88b75190712397cab616256864918142f0e29065d63e2b484e264f77a62b48f0b4796f43300bdc923866e09d6444da6a534ad3ac3cc5d63e241caaead402a9f2f4214b745d303b33ef21ebeea3edde8c9eb485a5267c0aaf09b0e8b968c99cf4bc549ca90e2f63c569aac4527ab023db8512c4de58b3cb4abbc5be08b318d9ecce522c8e19c6367f392f0cd692660aef98ca8cbb2929381197f8ffd86ec5c34c115381557ee376cc8149f0ed1687fa1643033f5141a5d2aa405cbdef35da4ecb5865710ed4fd203d7f8bfb560548399c975aa23974f7a99f600a2ed82556448169ba0f9323aca45c9f2f2de6b46bcc6a9491129de294c6ab547a474575b6793e1bc4e4b88a278d39cb65790603d28ea0c38f3a4dfc414ed49d5979f7de0873b0c69ea7a9e0690263ff338470d337e1d2dbf33edf934143e4d649ae0948a555d6f0433444beacdf5a3f54e795c9412daa0c4e84416418a682e37f348dc2ef39582030ae6622ae716f793bc4f1510642681ca7cf2b77d66fde5b290d826b0858500b9fe762e5516ef0cd8b2cf2903f9a166d3e889fc329e466e406f27abdca23748047914883e1bf3452a41936fb4ec6eea749f687c8bbc5f158531d37328dc15f106fd4358326bfc8eae62fd28d1847e6c2c651d76c6542011999a48d0e8b4df4a70e7cc08883309cdced62567b0a4f255544c5751064b8272e60eebcae3ce5c434516fe84a38ced3ee3c92b01a618c20b600d27e988eec8f79173e006f89bd54805675286f9845a958bcd84155a8b9b240ed7ddd908414dc60d6b043e5c5fb5fe67a08cf2326955044af6d686425386ec4afb997d79090e5607eb7eec10570a41ac419d8c599196061ec360e277fc5d146d1568682e009f440f50a44dfd90387c4dbd2a4d6efb3f19647725dc3a2f1491c653148bdc2b53668f43d3f8c54c5992d75a1bb043e6cfe47e26c18ab33e9f357a82ebb921d55699d72bac81d223b3919f2a07cb8b18272c186652e021f8842ab78697c4065c92873c6a85f63244457c6b2119f1bb58805ba391b59c43ace977aab99099d0a246223c96a5aa104e9785f337090fadc790faaebb86332133546da973eff4bc741d78e9a4a0ac4857a5db6d3b13f26a1401ebe4ebc91235b680c230eed27d9a61967eee999d85d1a4c7290076e3c46e46836c5b06f484d7a1032d70f94039d8943262ad10b0278eb5a46ce060e71c800cd3d86efe3950ee6c7fc28afa48af8fa65239c602822d11e58245efc3d8ac1705605a778187123d9518c902de68b004175801123ac9a2bc12b53f7643c43c7a948f9d61c4e6d250cd47d701eece7cf6da870971010689a109a39b1c070b2d0408c2e3e7608ecab871fb090cf1c58e8294efac5f897131772188bea9205ce07a40bf8b63a0e5d452f26927ac57b84dd1cfb37f52173dbf127db8254a9592c0400ce9be77d7cb95faf4bb88b1b31abe7a7073fbe9348d217cb8661fc60278e246bc5d369c0ef44ff4cf1a662868f1d46814d0175216a3b6139520fecafb8f6e54eba23b50db7a70d0a86468bf739a91b5f1e902a1a5d1da7c695f600e2c4b2aadb79d74263ddb0dcd099365c0df6caf28b3bf5a252d5d72202d56dca986012174093fbe264906917f239d9b87a664faadf8f2c027d5201b308eb7ffdd9c28cbc53d6f9b392d60c1b169435c8cd7f7455539c7854bfb4f69b02977866cf372d521c60a4b3fb07b28c43c24f08c33b8a865c3a21ca82e19efdf9db5423ed0610108d30bf35a191b5131fca233b45e996ee7deb58459500bb7f828bdb4711132aad8e404728520eccb18be7231978fc178fb63ef7c9578c6a330acb2ce9549760e575c319bc8de910a002984862ec1afc7f4431b0a727184d14eb8dbf1bb0a85ca023b4f84aa66c94c30332dff9ff1b3600424338e04d41810a3d1a00b277005428edad919eb0349d2c0d7597dffec7922156abe9a9a2e9523ff22eaa582a48e697a1c811d5c03e92eec621ba7a6ac46b74dba4eb0c466c8f95624b75fee651fac38cf705f1f55d9ffff9d6ad39d194a5b0e853d4e045215c303a0fbabd35b0e3c8026287c7e66b5034f8c224303960d55f43741c6a0184a435289d9b67f4f99db946792d50f432371d57c6d32a2f3e2bd25439061f0d89f5cec1f36a3ad69908e03f1f860f7b5ee63e11d8eeca6db500db4853a922dcf9a11af0785c58bd9893c68c630a040d23c48f89c428939ac7b40b0d2716ba1cfa4db881c22c5669aefef09c149076ccd49b6f9eef060aa8c48743984459e336a9447d3249c2a488041950736f5ea3959068d6d8d7696d4d6d6b109476daa295eb62d937161623e1b9db2289b5f5214e051dc72a04c10436a0fdb90b406784a620546dc1a06337fdf3bf7c317abe25574a6a3fe26c15d520635d5e506abecf32b16d529a418c698f54064411d066c5f3ae95d1938c928b204fb096889f18918003266192afa7fef00a008134815c75be2f095c1a608e804b49f2e1b84b14008895c02646839f24a84eac55530bc494b40dd7f17c354d36036fe10955788b9b318cc20022242fdd9f5da5ca869398e3d7813ae928ae900d943c7c72efe6e0a2f998497065997fb17406c1004f6fdde26112e45bd5492256dd7e1aabebc2a7b1732b82abd8c02d041451dcb7470d96639c2ee2ec9ff9193395a00a6bf91bc1de8c616f26e6f9d547c31991b960dc57971ec0e4bc7d2816c42ca023dbbb440223d9a8c3470fc07dd5af1e1a0cb6a0ca91509c5c78f43a872801922fd267f09240d51290dce782217de6f84f5583c8a63f08c7b22904d6b180c187527c7ab8f4f36abd67f9071a1d89c366074f49b56c79ebf756088b9a92a12878b01616c229f2b287a592847106a94511e4ce003c9b287974e91328275c1950ebe6ce047c4668f77e4fe0d46e9af98189b5b8c5d8739a8f1ff3d5f2208d76184a0fc1c061dc1f8b7fb32f30d1bd7d29b798412fa8bf6102f955c04c8b6c63f6dd6ad11694943486b0f708860bd6c2f083825c294a12e15d1890e70d92ee8006e994517398288a424e5ed4fbb9af96f1793291ee329d2de042607c46ecdcdcc955062127adad5317306324f602ab66bc0aa4aaf228264e3bf56082be977ff311ef41bdc90cc743b4f4cbc3b708d618c34a991a06094e7b634bc6d287f4744c0913535fa749dcb41fca2e61ab21bd2505972f4cc0647a04ae5b9a303273171512bb28f13684d6479f445f398b57d9ab58f5263ad28950021590cea4529a818c27072291b6ee251390e456bb86f1602b804da2820d9e1d158a2713d7774a55b1370a2e4871667fbad731889b5c0e57a94541430f8f44dfc85c4b7eef0882a691b9845726999333bad52a019fd40ad9c4b660b40332cdd8cfc5cec5d0513166040fe64e4b8845c8e32d844cb9e8548bcd853d2bbcd68a9d20b18e66934f0c64e71c79f99981407399d0acc664bf50dc726b34079326e9d23457ee856b7bd20df6a32d71bd8ec93a7b35650f8eddefd2190dd67c4be41d3631b4196d081471b22da94ddfc2a9294738a9d067bc616c11976d425cd58e708bf6bfb2a81a190ed3bf551489b68b98d468c2454e18d415085bb042a8049904b01a219e6b27ea9c6f47503eba49f3f163397a838e24ce3f89fb84726ac95c8e1787b31e488f42c89a7e6583bed5661299b7879abd52b3a10599062c83fa912298841fdfaf404cd02732b9822dbae0d7ed8e78d9757e5ea5517fd09e692f7274455fe578a7417bddc19ea72f6d4b95bc2bceb29412fc742ec3e268f2b1817cf56eddd810452439bbd83033cd060b54829096160d373d3f2935e89ed7e2d154a9ca6e0aff7eb068000fcf9cc2b10e04f18a187b4b6fbad1c0f3c2e5c9c5ad740b8bebb730d4a444f4b8d4b44539410cdd306c5491c416c2bad99b18f584bbcbf2f48bf947d36c1cc3f128f28eaf286fd01e85ade7ae3783d4211efd420841bd61ebb80568f609784f9c3c1a81577981e0bbcdb6436f656376d67fd55ce225353cea5875a00deb2b9e4f5eb5562cb2cdc1fcb168e44f4e2d1729515fa9fa0a59473e03ec49637eb7b0d79a2d3f37e088fb1f65404aafae2f0298c2406314674251e795bc9086d343b706576ec9bb49d0e373931ed6bcae51e79b600a4db24d533918a8a6b43f455b5fc24ff7601864779d37488a0586b0a1511e806d02ba84bbaa69328858ba0b161d7b73097b8ac71d505d2d581d6660724c8550ee08f038ba02912b0adf2bee42a6aff9ee7b79d7dfc17c43393c3e2d52899523644df394fc63ee8eaf8c6fd0d509e4d1a0a10ec240b638b74d5af5100d7ca4088243368e5b0bc8fe59580a4cebe7cb864f9dc353d52e6c38d59d85e92ffba188187b481b888743a8c0002c66aa7ba2346db9ec61acd804bebf9fcd46253b75dbf0798e6195ca5a42b6c1f7cb5664729edcfcd90ebecbaf0526bac9b064c7d2b5fe8ea0c6679214d3787800f7ab48b129a01035128185b7b2c3e52d06cc6248b6c915e54804b5ca35f6cb1204573e7d5e3835a16777560b24c4a667f6cbe7ce12cf9f11d0a0419d8c097906c1b529cb30cea1b8326c9e0a3ad597be700a494029d1ed597b1637013099c95de2046c2f73a7473d1e1c19888992c08786c43ec8ddb536467231f589cf82cdfd0b77a24e9f07a6b5e0703525cd80c85079188b03bc296e701037e81c767d0c00e7769ef41036b80a8f4466b8344c64e6381a951e02167e63fa9ae032ece67c1f90ae5a69d13f958e148df60afec06617f61285c10f06140468444461e1c5c9eaf0b3390698780c7c30ca13a591ab53638897ebf564917c6b7b7236a3896b7fa248910d1721bae300bf9f1fa0b36303d1c3a07084386a967bfc7a863b481594fe8048330e417d72fb684bc13f3bd1a4d9a0c8875ecf53d4079b55c148f44a8af3d6544bedfd7b91699de0f2b351022809a31375c758a6fd46f67927c0c6ef6176aa08abc85cd3028ae1636865bf0827435b7357c8f5e5e3db69da81408d3e4fdc9fc93bc7b97a9d8f131b62b35609798083d64886b018f7caab6e73c0bf2b8a4d45b5d72286af2df642cc97bf1af2032d256d8f1ab4701000eb5881c3ca6e0a303a99977fc79d4247cbaf7feafbb6cb032ee5ee3669b5da897cd6db93e67d9bfc4a87d559352286bec7c7c7bd153e75b510fa0029867c27ec6d4e1c59ca5eaea24dd0172e28728f81be6db3b83b52e4e34d730af0e59b6c8d93c201ea657ec0b23cbea2d1c4f17ee83ebf2e3ebe87dc3472a72b054d2a0f4880b689d8e655fd0ad838b7687b762f4c05e9db279485cbdaeb4ad900d7610d2461c2b754c2562f3843c36fcfd1f7524b64a75f3334555b0fcd690ea5e992eec9436976ac7852ac8ff84c5feec5dc675abda0259b2a7a0696fb6384db12c995f0de06f3bf754b1cacd041f99b9b5b799dde1ae052aef6725582397e6105ca82ea7c59b72815b4fd518267d7cdd33c0786a169f8d482f99358e8cf15b93507643d9a2158ca38df0c7328a8f8780f5beebdbea7df3df6020808125b93baf8f9839359aaa132171938c0cd2499f9a1c3ecfb63d4d8484737a546ab98650bb32ac369f9a4d544c2dd5a1043704b502b2fb546a82d574b0509551a2020aab0a73a5e36265f8b49a5948585bd6272164962cbde85fb8ea8ecdde8b43bf850fea080e67bbab64baebc954fedefcb3c0db124053caff01a7db99a7a84361dbee3e87cdd16be7fe8b09e6acd15a6626110ed5695f56e3a339d33c0fe2166ce39e4b5ee9bd2dbd56bf26acc9ed36593b16d67a4d9d7b706492579563c1ee9747ebdff9ba2283ebcf1f4848f259cb341fcc1b11542b1cf05d61d99af29217f09200ffc42d0efa6decee76c4d5250598fdd8d40f4a259efc49c8c5d72f47cab066c666ea72d5da793a203b16206d4280d580cd38b9806cdcf68c5983b5a29cb003d51e49577217f2ed5c0b63c568ced3d500c173cfd48851ed197435c569afe5c59d8f4ea367f6a2d37c3c23c79c3ddd912de050c32208f4f11b9ce4e4c1bac06340289c7356252c85acaee09afc6b6a8cff6411f34490c3ce5ae03159b9fb29414b19a39f15f1456af023b3f3d087ceb975e08a0f00112b62c0164bac4305986b40e93a8ee8fd8c7fc0ce8dc44d63f1a95cdafd1bd860ca420dd9e1a75ebda7a845ea35c6dff655d39ca02b46ed01023ee8234cb57d6ac6e05cd7fbd5f72faab96d872b8b7dfdc2f11f3d4cb4a9b606033ac615aa700ac2f0be695a5bfeafa3ef15eba57c1833fbd8a7a697bb6b02bca0f92f79bf0031417a939d974c392ac0160665ea3171a1912c30acc2132faf0f5e872be48181730c01e4f3693acb0ce5c26da65436da31193872e0bc394fa9ef17289d592871d7737a38b7f37eaa24891c470e523982640a6c0a9a70bbdaced20cd7e31272b716b91b37fac40a0dc912816d414620e281ff37967340051cd6be7537155326f51443429429fdad9593145129a0fc3c5361e62b7bb141557a232aa89c4b83b2066929f8373e22364646d10ffeb7718f6927f48a2174761c6ffa2e4025491c3530a08b80f57b0b554d7a05b4a48c1b5c0487a8649c085cdef2dcd28af01cea5d8dc00e781bced838a7603e1d42520f28adbc92908b7003285db944d53fbd8f1415d4222da184cb1cfa91a24c8bfae8c383c56304147a550b878f15782ce5a175108d01abde47020e4010bb6285d9e3a4d1bc70256675ebe0fced0e83439c2ff1194a224c20f16c34fa2587288b2121788605cd9f8551842565850c8b27a0c5ce2aad4d718e44b9eebd825f7188ea9900dfed56e03183d6f93982db1482643840bd1795e19d16131c79df07ea022e3424719854502d7d5a97c7f683838ba3d336f6f6cf0d31b4852c082c6009417efb319afc5b9e8712687360e5a0c1d9097b60cc9956ec9b2c102a0e81151e9eef00655a23501f6c870f71e049b12da20217c2dbe6104868cc661dd6ad3f1f6217d7390f8554803f75a662adb0c51822f238f920a1f404161ff0ead898e18fce23bb44a554ab72c3603d8ba6bf6cc9b23263ca8f0cbbeeb48eef6921816d625ba4f4dc8ca2d66bc7b64988313c6741e377b231a5876498d421bc7713a253832335d683a3240905ae556b535606a12f985c5800baaef05250023a77fc2e0d5298496cbaf77b365e63f3ed57e6064e699c0bc1b53fc384f399a82b03b36cac6544dc464f57c04249cd73628934f410200008ca8ed5d137de4957669c7034b4d29dcc90682897e5b774083e700b77656af8206930f1b6d2daa519da20d7d1569c2c4c9afbb3ef44939b26ee1f71ce98fa58a6ece66d89ce665b69014e0515a9665dedc011665cbcc2ebaa31bf8aa52452facceee361b468a9bda0c927d50b36c34be36e9f9edc93dbd7eaeb170dda31c3d1ea201e8e8967255f252140992134ed3aa6ac466c30e941806feba473c1c3d1020b6b601f1039089480308a21c18c219393abe544166e07d7cafbd166a683b4aae5caef6405cb36d16dc829aeceeeede9b3ab0b4cfeeb76772909602f01be420f61b743a829411ca91a2a50bdb922c1c5c878483568575f23f9265afededc2281d2efc545097f4ee2148c21e270836a8397da7f06081b3d3644c8d0c0bcc98dfa7573108a8c1c246a3542514a19199cd17fe1e0e2d7c4459d3c494bd408715068a687805d42485410a486a525858a0ae7b62e94744c85aa43f2c38116a359c24f7648e212e4b3bc4484145214e481e05dac68a32110d7068a1f38daf4e1714a9e64582f478f95d28d2e3559b3436ac221957c6810e09d78e926e4f01357c6284e0eab86972f4e505a7c415bac8a737b4201198113a0001cc77c0aa1d0bb8b172b311b5d584f764813c5b9354c151b581ceaf81a19634bc08ea507865a502832a93a6473314e05b47848e52f9643490444b059a41294945262c32a2c46bab47a24d7bda220432d2287d0c1ee01497810e89a514230248a26d126e39c8119cc083a3af471490322171e9e12703045395045a9ab234d8f1a8c3923e78dc196512288082ae4a7902a19260a6447dc2c19829c0b13a1eb850ac2a55610a0252e2388952af623442aba822c86a4086445a4c065405a214e246d7d9131d666e716544844840da690406ec90638d292e61fb16dcb1e65602862a376b823518d47c88148f1637a75681519004c31c481c4a3b44dea7221c4c5576ae080e64a26812760ad4fbe59710d5060c63d6924815fa50a1e489a417108dd5085506430929593f5269252df1361859a4460ed106536fb254a86fdcb0d12716f3e2c2589f2c0c6d5c0d1dd4b16bebc03b7708820c17ba149000165a0d065881b81e01ea130737bcbc62120d695e98d5999466f7230ffb53536aaaabc498fb74ca89854230b8c45ce08280c314b54b834d6ee6dc12e89a2441c396583e85b5e0eccb862525d87cf91dfa8d75f080e1014c6ce21f8d1a2022992bb9aa7c339524e9b89167ed2c512032af27af547b7c58d84c0141f94958760280837d0d64f1c1a32d0b0f370e2530b94d60c30b97855666a8ceb048cf68b2bd3c49407cbddc2a18a02f9a606451a5290f8c491dd8f0dd422a59027166518813c9081af024036c55e952c306281a0bcca5ea12c22852064f86390bd2ac3133620564aac7111c71894ef87e7e3ea9e90409d30a3820bf3a4a46806c5d40cbd878e090a442451c0c30d0284c031934f091b2a680311a43cedcc89071f6648607d80d02707c1695a92489528f0e5e6b3269756943d34542e2200d9a417718295a53a14b899784372963066169abc0049324907e1dccc4493181401a1e0acee0412198273cd22251c10d4916e85441d030c07f5812d400432956b44f0019a626358ae0420adc1d071c44ddc57054a7c3282b810c297a13011a27597226181538a555034f9e4b3d3a756203033ce3095d8a48284eace9c292c053a3868358a6a2161e446a2ab80e5887fc5cc0926586e80bac46dc03766cd47ee2b4ac75b8f088c786f561c78bc41a0bf5047bc294d900e5489792572eee4d16ad1973463da9f083d467b8c988e3627445fc31aa3107ed425aab31253ab47f9e24e0e0c20b50212669b8c4428229118050158b4d26452a138ad18f3882441d1c971b0ac84827727271b0b802a57853230c893195102ba0fa8c8559a0a165d5258d9da61808505265e68d1508ef0fab0bd9132852da1c40c84b1090d55b88cb2c890061c03a878e3c61eec4ee6068e185a50c9d09ee2a9032a56650a441c22e147c5d985861958666238b9a1e24843c0097d8520082ba3b1e74ac613180fa86078e3b08649020040368ce9c59d258fde110c78d89a0cf7df49d088978a1c20187292aa2324cda3a93e10a949f2f4bd22f37b46a024c5b861c3d5c99810343ae4f182528bdfb819c07371224c0169761ec4dd28dcd9f5f84225a880a584dadb030a8022847695a3e99a1d2e5c785026d0a69e169333328c8e7b3a51d4c294a254948a43424d880d0713384cc98169c1f2d68a49cf171c38a5a1ba219230ce80a83e3220b011a66a2e65c3a63041329b70e6ee9c3d063d30027640216c13ad608b332c5895061cb0c219286583a522929a30f062e612658210bc18346872cf115485ede70403268c61c466bd232338b15771496f0c8aa792c6254a6064ca720a7d7d0994d01860aa95ebc703480930fac254800e4a0b26a032304b244729207c55009a44316baca66611de0a5930dae2d1f4e99b96462489fb20b49b62c0983620befd3910a01a8033f04d820c28f108dce889f3f214e022e1e5198e097458b91b04fbf0c44489092c093124178b85a1179202963093a502a8254cc19b14f1a82586a00929e3b741eb5111a29440302991f5082a7118fae20c0298c47c3439619075c492998cc28aea52f75c6cacc906634f18264aa803c079cc13131d356814f00217cf800a90223278200d638814ea1b53756105b13c8699249482a895f454ac31263991aaf1513a80d656065eeec882084101c0de083d51895328055272294322c461a7c39b075f7008c365c19b46829a05cd5f3ec974c14b433ef9a86c7d85a086d6f178d75b44ca4e93868e78bf53f068b4863d0ce17bf4c1b3f3198acefa0f03e7e3968e78b72c6616c4cda5e4c6ca5b38bbef66c64b131698ff96060c1a79314211d28e463ef051e20a61a71b1882bf4a8d2dd16169d52b9e073c5cba61552d6d4113cede9b2409a070a8c22a23641d2a8044eb568b3a9506251131045555cf2013b0e42f2aa659ece44c51b45a9331c660e16b0f930f801f6c64daa0c2c07163c44052c60860b1c00c627475ea5c5cd09029ba2c22046d3e6d1d2526607180a3ec45a78081680645dd5c79107485e13dc220a04100156e1b8e533976ca294088b4899ea0f9d99039b58cc7825259289422944acd07025ccddd8084395dab0d400f598127e1c92e0c691f01ff2f86ffb1b83f5bf87c1225dcfc1f81fed14f1a7231545461313fb325dc6e67793e989b839e7bc64b1a22cc5e2e2cadbf6c732261ac76cbbfec37fbb3de9f1ab7bd48ae8fadf118d44fb1ec2e53c14dab10b5c8168585858f21ed6fe58b7b6ffe1e90701f727967eec878d847f94f2d1d5d100db976068a5fded31f917ff8d56fc379a7d0fe1e47f1f91b530be3dd99104e7f53b37e3bd89487b181bc7ba8ddf4627f9d12b07def6979343da606b757fed260e6f23b2f86fb43f2423d2f417d6c9686c65c57fa3cdd9bef86b3ab6877474cd96bc65b439dbbfcdd9fe8d48d36c9f28a3057f7178f3307ba9a245ea98b37d31f86b3a16139bb3bddaafe9b257afcccc6ee32fde36d2873c66cb79e28bd81eaafdff22073109aff335da816698b18eae61a1ed85c4b83a9a3897a5d0f6679c73ee262646cf4634db0bd95a04eb7f9c8b6922d1df740b3b5fb46d4f6c71a2c81576be68c7f1b1820f55c4056b3aae06daf7b08800cf5824fafab3c96832f10f71c89eecfffa456c0f8b6262b6f1cfd1b798982d26f6ff1cb493fe48cf46b4644ddf5e367a35dbf6c4323be9d9c4889fee13c5e835fbe310dafeac458b600b31b13facefe0d1f6b797e5eca29858fce9c4c4e4db0e1eeddb076fe3b783413afa18b4f3c5b5b360b0c597e93219ada61bdec3e2b0be8d7f781cc6bf5e3b32687f3338198294eeb6fb713cfe7d08c1bb66fe8b35716ed7441fd366b81a29563ab087fddfc2849c3cace1b1122be26f2318ff28067f1465b77f37b483bfacad450926a31dbdda8da483c7622d0c1e8b4839bb183c169164f2b76b04c5c482dccc2fced407db48dfb4912eb6f166f06200e7620fd335bdd62028a8178cc2fb056f70ce85f1ed8bdcb46b600ae0fd6dba1ed219df08ca685162000031106c1a84a681153ab81a10792027c24f4ea22a259ebb9ef1d49c0d4a32d5116141499a960f54289c58bac4891366aa6b802e440c18603684d1db13160e34181527c7d92492f56dfc5a8261c7622decc2eff88f1744379cf70ee09c2fe0bd360e0ae09c13e1bf08de38ef1961b3a602af72c7ae819f361a3fdd6dfc7474493bba3eca43da8698583018414cacfe44a22f73a367235a0bb015354df465626211c4c48276d0f86579280c0e8f3e78b46db64cdc36dbd87cc43e340d3fb61d6c32d85c3630360e9cf306fc679c80737ebcedb054cd00f39b61a2e2a5d85a1d5e8aad2529c5d24ab1b5ad524c8d12e7a598da1a5e8aa9d9715e8aa9b928c5d416705e2a2ac57e6957d2e24ab1b412a5988c3c9c73194d4a3199ff646c88a1a914d3c17f318afc629c71ce4bb1185b9c9762686ed082f0520c6d8b73cee32bf8ef4cc79916ce39d0aefffd8bde2856d2b7ecc962b11476580adbee077d8df4c8d938e6e66be4d86df7fa1a39762cc6378af18d627ca3ac464f8d016a38efa5e1bc67001ace7b67cc70de2b43660ce73d31616ad9e88bdfcc38a3fef59fa36b3223bdf67b9b701ec3c739e7bd768f46c18064a76e01569cf31e3c644197ca24c027ce39168e639b1a06b65e9de29c2f4023c600362d3c82780058d131838a932e79a080f260a266b0420de7bc97f602b0090a0928aa38e7585c531489ca42401e469cf30605609980e748cc950bce794f53aa2a412ac89289e59c2fd812e7408bb0900f4b9c73dea740a81613490f24ce39cf117c2eb023801f95789898580bb6e3718c7e1313fb2a6dbfc217bd8d9c0bc66f039efc3292b55ddf2992471e868781e37849152638e73cf8cfac03ef4033eca6e95af6ffccd79eed3d16eb33bb2f1bd1cad08ec5fa8ce8db92f56d7c65ffdbd46e9a6ef302c6cb172f5d7a5cb89b9e3ce4bd1ac06fd3c4b8b4bb91726579a46938081180f22f5f408800b48dff782c16e9782e891e078f37e2062fce4ff1c0ca388f15af4125ce09358ac4796fcbcb5b2081014a8fee0020e49caff50a78f58a73de33f67c832a3d6e343087f3b0241a1b9400ca19e9baae04da30d22e85b1d1d764bcc1992cac0e0b50992811b487c0e49f0b7ee869e1bc47c003076c32cd792f0be7bd01b070debbf2854509e390681cdae0dd59a108b8638c6719fafa5641f4c3fa2ebf902ee122b28e8536f218a46fe33078e48e5ddac5da979f8e86d1be4caf9199fd61fd56ca462f26061791751919e2d0cf7137b218bc6d4f8cbbfffce948fc3a3152760dace9dbd7ff1ec631d453f413b3e3fc0fffb96b78d2e8fd47ca9e26027d122e7dcc794f00ce7b56b692f7ed65a14c1bc5c4e46fac9bf1657aad5785f31e15de981d6e98fc4a959cf7793740fcfa988479627a157ead4fa6e3e014ce7b527a0170de8bc2790f0ae7bd279cf79c70de6bc2798f09e7307e905670de5bc2794f09e77c412f09e7b148808ba953fc12e70f70ce7bf0dffa4afec3fa3e8166182c87fd617daba9c5c519bd7d7bfa2e79c4d9713a4ab0611cd0df1f58df368c748bfb355d062c819cf7901ce1724dd7d9b66713de1ed9aab69becc95af5db9e4cf6643f5401ceb904fe93e3870c2f7f6893122cee8706d938e7366dac5193c73d383288e001ef47b7807336ae26e1bf4c7638973fd1dffe857ddbc30a467a45b4f8af47840405640fc459ac28e561b13784c74608e7bd209cf780dc71ce87c73122d197a5016fe4918efbff451cf27823e9f20befff67e09fc16cdb13e3b21c1ec7fe9f83f41d0cfe3f276be26d874cf6ecd09828314707ed21d0845d0631112cc1ec122382946025927f2e988483c1a071b8a0130b16658d8c1744e9e06b7f6470c216fa3a062a7e619a38e7b491c12f4c0be7fca68d45a431d84268fbb31f45f917d605fc812902ca1fae7f603fb01bf4fd032b3907a200c481be347e37b3b117bf139e7e27e8b5df09bb21bdf63bd175fc9958f53381066844d6257d0febec61697be1cf041bb246fe4c70cec77e2516e0bc4889b3121b803c7a107e241471b39e89b1de9febd1c6618f6d04155e82cdf41a5a49cb01e3fcede5e05dfeef1657ceb41d976366e517de741dd00b91756c6a358e357e0dac6b1f97f6a7f376291bbdec69a26cfb3a9b16faba2c127f2db48fdee84bda8efb4039e02fc1c0de88be04dedf16de43613cac7ff10b8f1f28671c0e8ba5e71117a7a3948dde1edac631004ab812f887f56d93b879c4d943bbfe461fdba0e3ba6f241289431eafd98c3231313bf9e7824122f1d7898989891d6d1d3c74945f085686d172a5fde98672469ab64b7bac04cab27d1b873efe47fbd775df58a304d6d9c7ffe778c4cdd1f459f21ec6fee8633b0ca6e9e48c724dd79546b412e8bd6cfcf24daf8dddf49abfbd59924cfef7101e0ae99acd9eb1c8e69c1be13f1e49386f3117fbfaad85ecbf708c86212616f4415a2e280b6f7958271b3d1c94bf8d6c71e6bf30e86b7f8c8d63aae2e27a759cf7e838ef2139efdd9cf76cce7b35e7bd1f9cf78e9cf768ce7b46ce7b45ce7b44ce7b739cf77c70de1b72de1372de93e3bc3773defbbd98f31ecc79cf73de8be3bc17e4bcd783f31e0fce7b3b38efe9e0bc9783f31e0ece7b3738efc171deb3c179af06e7bd37ce7b6e08701ea88d06e7857a6c33384f1b7b5b9b9103ad6dc6d96da4ef86352d8c53abb1167c618cb9b9bd6a41b3b63138b61ac11b636a71655ccc391dd71a0e9c1970ce859cf328fcd723cf8f6b08e75c68fbdbf8c338e7d9f0e241fe103e24eb4ff74be3b01c1ec77e6c047ee11b70a6cb193f2d54bc93961b1e57e1507e5a746e5a64bfac50b4b02eae4cc260ffcfa5301e82c595ffcf63f2d0b3fdff0268d3b77d1cdec7e290782cfab838f95844c265128c762b8171c7e14ddb441ba9c2048a524579a2445196285994c7e11dbc3f518589e3f02e11137d1c645126ef4f4c91a204bb6d641d171757028fc31b2ec14c1c8777491b4b94614962ed89c3a2115987dd46ba8e5b8b2bbd6da48746fa38bc4bef6f38eeff3918171757d6439a06711cdef5900e44f96fe4b148c771443f236eacfc7f0e123d3d1bd13ef1ff39f86d0fff3f07ff7f81f6e7e07178dbff98bccdfe7fc17bafd238e7b29186ebbeb1c2d9af4217e7143c71208fb81f853afc4781ca8f82f047a1a5f0e03781525036d2b03c0c0639e718f86f42130e94bf7148fbf84d88ebe2bf092ec6244ce0cb24ac8826fb4940c339e763128e9cdf3f09619cf31afc1721922fce28ede49f1bcab61bfe8b1000f0fef6f1389c7333d264757fadeeafc9f297e531bbeeaf4100c37f108e10ce7e104a52bf0775d27e0f1e98c6df03ae88037f0eec8e9f3814d6953f07673f075df74f9aa195bf068a68b84cc6757fedd7000d07fa18fcd780cd2661f66b600f39968435cef903de333907cec51e1ecabf581c96c9b8d236d6b4fced862f4a208f381d49dba795c0ba243cf4a571680fe9ec3eb21867c7d97125d02e4dc81f2c790f8dc862918e4b7cd848d7ff58820d631b4d36d26445ba7e71dbc334fa0deda6d76cdcf49a5dd343e2cb3bf1e39102f288e3f3e335e1fcc7bbf1e399e0401e7141a1ed853f5ec78176e9d9d4dace4ae3d86dfc6e3fdec5edf9fe6eaf3cd5aff400893eb679c4c5e9288dc32fcf331df66515493f479ba6d94bd0c2b212787f399b38f4735923e72491882c0eed245cfe3f97327dcfb65ad98d52ce388c87456f4ccab47d0f7ddd0d973f4c283714965ec537d2f5aca2aabad2c6b28eaee54abb88842b81717165dcdc8c3823d1237fd075374dc71f2e67fa1389be6883fdb0fad3d1b52f0a63e3874b1b71257d979e2626fdd1ff635ddcd1abfd38db267e239b5ad98d7228ff22d2fe6db227b3a049858f39e76f9c63e1e09c13b94f060dcee9d98856460783c09a9ecbb8b8d29795c3e398af9163f0ed6be4ed6d399a38177bb8f425d85dd3427b1682810051d6c35fcadff670988dc63666444b1289f4b134d24764d0e863e04cfcf63d2c3fd1f6bfae9c8be93aeef6250b16659c5d22ed8fb4eda127da377188848f65d213c36c5f7e239d240e8b48dbf625982cf789c01a25d097437f8cb341b3c944ba8e1ed6d9e5af33fefb1ed6bff6c66159dabeb43f5dfddd4adbfe729ecd8e6f987a60a3be52a8382f9622a4a7941b2ecb469a8c734e81f321f775f12915c739fff0eb522b38e79c9420526e38b77d2d17f68dc3b9fc35ad56023ff2873fd265f2be7f7d9463fa0bdf48c5a47ca3fe8cfa316a06e71c68fb5f7ed848c7bfbe69a89d48123f91b64f2489bfe86d7b5489510f445de29c8b1ac391c5b28e3e93bf8d0c8a1272cee356f50cc6895239077e397f2c8a7ac023401357d37172ed637b2847d024021c6d5fceb3bd6c1144085587730e94897439ac4325e172a810a03c857d5ff4f13d948d25283040e3d0cb814ab387f6afe5e8fa58d2c63150e527429fc024ebfbd7b7fde988df2ed2116930f9ffdbe86b8facbd3046bad9c34f427b58be7d6ae57ff46c3e083671fee9dbf8ef7f37741313fb72fef8e5fc1182221c821c70c02431ce1613b3e390743249fc43b94f948dbf3451a2943fb24c7e30e35078c7c61925d0e863646cc22e67dafe72feb679c4cd338cdfceabc5e92893f0fce5b28e269649a25dda43a22f0effddd03e7eb9fc489a962bc7ca21f1581c7e394fdffe68d7952692f7b1f8c38cb4b104ddd0ae91f16f93bf8df46c9f081387b5afe963f1bfc9f4da97f36cf4da27c2fee87fdb4dafa125e1f22379c139af08e7e5d8308aeed74739cfd6a2c58a35bb46d2b0506ef88dc1a4ec7f7ddb9ed8a2c5bf1bba95602b4eb4067d1bd14ab01679f45ff8ef866e47ffcffeddd0edcb79364d0d38e7329afced32e0477ee48ffadfb39c9c7f03268d7ef88b473b2eeeb68d432fe74bfb1beff8d7c979587fba1a691b6bff89347d2c655a78ffd2ee6ef1b6e2fe76f0fffa86c5c482f2ff6effd76f6435fd628ea6c96c9b46b38ffef666c92fe3b6fb6bc92f43feb7edd3e088f61d7bda5882d932f10f3d4c13619936b29540a45ccadfaee9bafe3411cc260efd5cd674897623bf7c278d1ef8e35ab4c815f1b71177a3d9bf948d7e58c695943c01d5ca6e504a44090ce7b1a3a41484920cce398f1d25983c2c75ec00f6d4263d40fc65b787b6dd81738e88733ec77d36c8f0e171ccd7c831a0af91bea66dfbc7df58a2b18d95c0e04d136de0ede9122c49ace9b9e4bc9786de367d66fbb4ff5f24eb4f37247e33dbac8e5efbc4e3b07ea3dfe49f66138963b61d0d1bd1feed6f3739e3f0367aba4ffc6d35e4a1997d1b3fdd5bffbabf76dbc334b3a427fefab31d8bf5d937a2f9db9bc9fe9f15e9db4696f9db9bd9665f1ed6f5a79b712cc6378c686ec5f8c66dfc45b9ef56cbc98db9d1b311eda6896eb64ffbf277938766dff642b663b13e3b16e31b377246b2fe74746c0fcdfed98f8774f577b34fb406fde6ff59fc43ed47d1ecb67d9a6ca4c9cabe4c97cdd5be58ffdbc31d8bf599b18e366393d1d8ea3f241eff7f71dbfdb5e49721db3538db93018301549cf39b26daf27f1910248c6f5fb487452ec6808be02fe9d93894fdaf672f646eb6e39c0bb9cfd10abb06de763f06e73db433ce7b3038efbde0bcf79a71de2be3bc47e6eb8d71de730186f31e009c730d9cf3c2f8184dc063e3b7ed1f948d7f2ef630e77d22d1c7601020408010c1e8c94ae0fd93773d94cb3fa334fa7b58d795635a8b0c016de13dac1bfadaec0d9e391f82f01f03377a623ee2162814a952afc527fe6b993814c6bc519c733aee4b4489f3a0fc932b0a34c3be71288c7d312cecc842fe3f4a15c77fdb7347fa8df76278f4651cd95c4c13c982a59dac3d1db004deb4b1ace9d2fe48629c241e8f63e56dfc455a4d4cecad8e361e8afbb683435df48779100c1dc039b75bac48c240bb34d2be468e81bd2889f0d0b691b6f11bbf4d0be3b246d2384aa06d236f5ffbe3d197325d1fcb1327ea7cf9c94aa03d47d3c232eedf058db4f1cb49f88efbc8fa8e2be9bbb487c263d1df375c0944fef876e939efad38cb7f3744dea5e75c8ef31d9c73139c37e1be4141ec1af885b18f837f58df29e6629ad8c30c60f3d38187cb198772c6e1a0071c284810e7bf48db8208181344acfb6b82380796267e4d174b9449a3bf4918ed4fcb81f870602021e781cc401ce8062e6f12c6d20614a702504913eb02c42441586c480345a8bb4b7b82225105225b0ec28017a87c516145100b1536006861c8c7404f025914d252a001635660f6ea1f272c9209d880498bc88d1a11200c0162d21e98e12007060d64867648c023ebc4666d4ca79a789615443dc6e82127b403576fb053c206180e02348193c62c73ebd8b381823e92be500c068899783b45870ada772368cb16047fb22210f4c1e767950b313a7cc004f1e1e97540739176f2a2438baa287272609daa74e912d3f227d49003da04c728091522d43d440bdee2a2e71c2122c30c2f369084a0227bc07a0b6385e4a842070203905ac4a84898ae4474505270c131e842093b3e672615e0a5d5000a3151846c8171604920be04ed8ccb431f4b3eeefc9d025a91f951c011e9024406b94da204ad0131c948a4708d50005ddb72eb70034c0b289ed8862deadad6293f7c6443d8a4b97ae46633f960630b0020c50bab15a62d42a49428296364b33ef86eb612b95aab7bc0c7c7221a22e07a143b8cf099f912ac14673c92ced0c87a434a1328af318e2cb11d1001d089326b49667472b4866b462522f61e158bf0d0a9b16c0f956cfc26bc39fdbc8a2ba4580055a229696fb234c030f26911015e846458716713025b6b48b81821aa71df75c95b26962452e8caac3fe48f4a1208d2425296e3b746eaf1a98a86511b068033a3c40b231372be0290d31cb97023939a64db0222159828c081c52710bddfa5392002dd8a7e1977e8c6d59b27de8602f42ca8df8a8809930ad9a9d59b99e1054ca6221d7487d63aa9aab2442eabf396b516801d2418a1cc92e0192f73b80840c72106105014f434628e5a26f4afb03a7a30180739b982aa8991536cc6e4400207c855d61e0761ca2468b4c5049c1c4cbd355f3a0757f5962fa5daaa4cdae364d8e592ab39185cf9b9902180496730bd0af34186d7efa175a60edc41c2144a8e16b5382bb8386cea30e74eab2a38e6b66af8e18a004cd4002abaaca4e8635b350c702075000e4e8459055a6844f4e1957e6f6ffe6cca5ac341d1200f36bd25bde289c991460f385c4a11872e8389115c7fd2b87dd942a9c19034531228b0558232e3d2848cd305342f858e7e82583eaf1a8a84b8893ad8896da20310a66165f893a788a01d43b28c50404c1a97bd66d11697010e152f145ae3014b0e84347e489df109797f7c65ad7082c09047981a423e4bbce007721a20b96201c9a4413d106369042e0d6227e6b8d0d5893239483da526c2f8305d119547088a2913e47ce1b184ca87350d0b3e08a1c05b9201a389ab0a221451d1b8b874cac2ca08119a58246090187e22cc2f469ba50ae4b4882005c7c6a801ada1a6214d0734ac9632c64b0426b4053a88ca74e1c31b3f4ffc4890d326891c078a3641f1f48b234555818856004a171e5f24d1587167c3db053c56327172f00ac262888a110afe5c3040cd20b219a0dc0560ea1e49e26119667db021b6c50671050b8e0059673cb3370ebd105426a8c3bab91e68cc69600b98251852085c005ab500a53004ce2c70878913a32c2a770a68032d0a524a871d1f82e428417288c3e38f940947fc11301d0e5018a54214863f4356092c542f444e3275491031088a56af500f5a3e01249271c60b9a861142071f0eb422d2204d908f9b2190ba8ea0a1e9aa41a49f7378881cc2f12aeb8ee76889561d01a84ad848a1e5c796a10a8278748c3c88e8b3c40ca9b412714469c568604b29b62e50bc56490010ee9cb86181de0ad28782d6a8348c25e340d0874b136e54320b387ad8549ee168503790c8d02529c03827d63224c9d0e86e6eca961916457e24204193165bc33664826c4cf02571c573bc4201e6f4bd411182317b647721809f1902c1498a576989c2213152752a18314bbac4428ab1d5a90b12243847d8004a3c7015015ba3c257e7d29a356b6d9e38a068531a43a49c0cf2ea2377c726861b07fada0a33205e7415b8e494b0d2c3400e1939c8b4c2c2d24681483f0f5e605766672bce90b4e252b707eb92864f886d254621cc45a314717b08688072817a0046e80a2438390b38bcce4b0b24f8356904f7a02e6b4d5bcda6cd940c5daa6ca8d0a1d499af4f6cd8e8048931640a7ce4c20f047284e2d0e4899955a60a026a39ea0f95940342c46824c643189f146c4a5051b5e18e904d0ccc9428ea980e65e0a21067cf0556593ef9e8c236d0e7080b36697ef0f859b0255178dcac02c24b5d7d35c9f1a603071faf34058d4c41a17e18008ca413715a616862680e02882680a0d2490d9c07f0fc6995d5e8d1045324acf0648772b223ce00abdcc143023986d8793b141b3457de423c11ebcaf0b9faaa4e53483d89a08cee8823565a3092f850050a658f60e009971e897c833a446ab4f6666b81fa51238d0084347542d3c50619a96c4a19883ebf1a650fe878b8a3a547d5a575822a476eecd72b06d3ae781800c79ce7528d5112b6acf93823e08e498677abcd8453678a3ee087283049565fb6d8b2fb941f403aa244d121420d0873f281a9aa4c08bd1c30664c100e906ecce890e1928d1b642e5a6d62f405ac02287c8664d98263f7628b5c4f8286089c491f3ab37c5304983b40499f358273cd883d9074907911697b37894194c0190dad1fa729145db84e34ec274f657e8333647c52497112c397ca2d38aa4cc2c6c883b0801e12c23cd000a2c3ab4dbc511c24ff3e61666d71c11567939624dc001eeaa73f6fa7c8b80efd7824b953c4990851004fa23a133c351134086aa40a4e2aa182e22a19a526a90ed45d102b039bb2e3510c25ec910e2e05deacfa0952f50020c46e8618283f4c758aa4c46db09d000bb13a854017353314ed89838177c18f231174057e52c5186553984dace165a974497064e9f16020ca8e08753ed890e300024eac44a92ef0a817abd2f051e12460585b036442e28d06535f8020501e96566495b101e54b1baa0b3a1080b23665489ac98101b8b7109d50a4acd079631031939d3054b2340721488a0f32e823cc2b1cac3c6861d8344a0c0e09ce6393a84eaf80a448eb10654c170f503f0a48f148c6844213c860d3753c92d49427c7037b1c10731c1306014e2b0015c836c0015eaf36adf139f2a468c9c3598d0b9de08654d162d424c796617a95a1411a3b3b5985ceb031c5d666858b1c02b618d4088b9bf4c843023a6c24d905556c7c0bccbed482a8492300cdc4892daf955219c0141b60f2595b2326217d13d0348c6c15816be578dd9440615280820051c652dfbc268c479b3f994679e202c900165c95178b4b67583411bf7072418129347ecbd7962bb5060eb0d9e044e310162911786142e22b746424c3b6ab33f6c3ac863b93b37a59f2fa94d596838f508e181b94334d6c701139c3333609c8a1920a2b5b4ca862d6ef048305115a0a486a2e06999811e209524392144426346950da20aa8066c897325117b076789a53b258012592043bae36252af5e312c34d014e59e2315a2bae140235a1cf86b0323b2a224061e44549d81d4b0edc25baf084cb95142ac654d8c4c20982d3050390f54048d98d0a8ed46cabb41aa462a3e16f900433d011d605499c3e75248068636505062e0d6c90af213d55bcb8079ea0a031b3eace56991cfa96090e712a2e79548ee000e54caa0c82660451051983e9870d2d90308809a5c016180088484068831c127640b4b23ce919a6c960680e3eb8a0aa0d90204a1dc65258a09bc2e648c0845250e890b905e84a459499a02e35e252841c8fc09050416aedf8042aac041f509c8c07fcf4ac14507460f5b33b1b4bd78cd1246306961067665d82240102939e0831876d0500698e8061b51a616a8b98c03363810915bcc2b3054ed0839d212a4eb6409a1108f04fb0aa83ab0cfe0315aefa1803054b02742888db44c0965a1c1be5210a8215758500f94e1db47c2d4ca4f2f3064a048356d18b3a85eab290a19585515d3c59c244c94f1a92096b4ea56d11b2476088808827375b8ec247a4fc8cf185495547eb6b76e313044704767cb6ccf1e29207471d31166d8704f8c32585af0ac115c38401e84aab49900c103a2001a5e0c8efc1882f8c7c852ebcf850be113385d5160d2e581842b2f6d3c3827708820519ac58e132e48a851aa982d96a8b8452d11692ec772c24a3d06a114096035678b9f0f140a4a1939a46761d080511b1094c02439c2a1072a16d14a5b8ae301580e2a0c70a0b250310fa4d3a7501ce8b4ead9a68ca82a6b36a18d820408727757ed829c68a7b6c23a6d634b940a9cbb80ad50e11874a7d0978524815b3d0d888b8f2270828092492288048c2a9271cc8da8861f20568e640993062995eb4d561104291e3a689c0da44434d909c4593ac64dd81c023d09103173a770b311415d0c83848808423c181afdcb0d3ca840342c8b0304cc0c3139b1d6b95b402b5c2d325a789b4c2304400274482260b8d3a9c84e04f031dda446963caaf01938186a72e532811a7744119b3a7c45a083830ee3b18cca091aab5c440f0ed44da3085c8c3af51e2e094140f73162098c01148c6252cc3ad0713ea68ca00a22ede69e3422852c7a4cc1d1388c396062909004b05123b04465403cd6935f92e482874a30f31450427a4503440113727431e4b6afaa8494d950c2862f648cd21525b5932d8484f04fa14431467b3424820e1b37be0f7a706110ffd65688249335678f0d2c19bc3a0c6dd0243c2c04065a52beee4e22a60820566304b8091063cc6d864e8e373804b80b58b86209b940106393d6d52af0a46d120c5aac72b204b8c501a4821a4e4ca226212891444ce41ed0dfa922942457e2f1d4c4af61090aa0888cd08b5290f660d62f62862e0950e10682c1e788469880de9820643677e5ab8e43890e3a8f1f44d247f073c0a5561ebc7e30b923f79ec7c627265431a142d343b72600218310a34a552993b17c688413aba5245031b24926863a023286b83115595cacea0c15539a1a7842540ee060a8651b0b812d044d15087a5c2f9c80f06e09d479502ad58f2284830cd0f3faf300b8a20359abec45f7ead32d42081a84b041cd6dc2fc408f822437025558d09420601c1a0c7c422417719383049c3a3d2982c8ee0ac56782ab8ac60c46024eacd900d493a391d6005324d99a0fed110e26950a0127a4675cdc082008055a8249dc91281b18d40dea3550f99cc9e4a9b50c9270908508ac3f7c00159e6c8c5ebcddd8e9f192a0eab475d9a7a7038e5862b8720b433396ca84ae18016049a34f939657606462cd4d96b250a021e2885312ea8531ce33d5e487af0e96e4e06216aa5bac4c1c9a143be6c351225c8ca96dc228726b5ac3aa95c6d4a5326a238e663eb98d858a01140d5ab0e1f12d1f84abd3240e02343052e42ed71350097219edc08b61e60d2646bd0a127e89975a15028565fbe38446225638b0725504d7a6952823e79dd81b185458849a1c29b950770bc26f9b83c23ba4aadf844f851690ccc94b3035cfc3454586088ac250caa373c35008a38b8861e431e10129b326462644b9b42984a70ae4d1d4c1841f51d46882e88a03d95fc9784049c386074084243c68124389614e11b1a9409f58602a220298cdc201519ce2fccd12155b6c3cb0f2071d8185461e3fc370a108e44426404500115170b6e179c6f40e091045d82ec3285c1d102e64e2a3b052e818993938009187004f1a080f5cac04955a137770798d844a93f3bc8ec516327953fc2041597181c6610ac4ec441d4e8c485306f3a1c819b50e980a14e19dc50838ca5485291aeac55899225a639431b1399af03a91d41c1648a27455b3e450a82651789930bde652613881783b8c4b151c2b9561d397218182fc0496001e71e0218d5e4819bafb6416038cfd002870b260a04931c15e15bfd12059c207d089286731f894e293c6419319b709ea1811f9a5c25e17572c1b7d8a0a27362a57638f741390156a247e50ae75e7665c906bac42939e70aeb057a20860445b88f54a2066a0c58e15c8397a6479846b171ce7500073b39515cf0df0d4d71555870aea14f516e4d10e71752382591c070fefb93642f15e11be6528d4839bf9047810e5438cf32b96c72c139785d11c33986333a4f9c678109969cc3a1cf3906484938d7ca52c47987244578970fceb59a70eec105cfb0c539e79c73ce39e73c4bcd85287f886bf640b8b14a469a848030186a504a810a062451850e60bdf0ca244088030a3715a5701cfa34640b0325472c008364a9d8624017a944604a99c9fe8126a4c285410d347024a584a513820d6c6a5b28d1d81064c6999337702ebc1a13cbbed7e8ff0ebd09c086050ba282803a74c81346010f17c638905263a51104aae8943133474825a161d1273eaa6ba20959668aaf411e3f3f7eb025b941043952063149fa58a0ae62c285270b0b0701c0a6804000a78092b23a4f1a4e08998076c4738057263672cc5ca981c9478114126c3821d58e88d2aa34d920a70d97dbdf6889cb0273886749cea7109932783119c2e1551d0c689c0c6e8cbc669225df95368cf634aa1000181374803a848230b7654712133a10a3fe00755467e68c0440193cd13021c30e203d315c0cc242850d511d5f3fed247adbb0ae0985b4ba3b8da05b2c8808cb4c8428c3d4eb1224d29e0f4532a45922733b45dc9284c48c5205511058f200064396275230bc7e5f17b4b2d29081d352a0c2dca201c08e31e6045008541a3374bae464355880159d283ce4de82131636b903261b4deaeecad0b71e1652c0889111a2a546c71563cd998f468217c9af2f3388baca460574815b0480161a0943314cd1910e261e183163b38094481c1187b3a49998ac06cab0110ab52509831761a4268310270c542a906975c60f1c017cc234b8e445cf170e77d61a8b1f02110c2135e88c0040c506594228474e282c38a26d0839140cb2e00b43af8d9a07398d064101e3e0828e0e06611bfee0b82437e60c4f04aabea86cea80ec7e147481b900440179dfa1933405800d122ed87961d9545161b40882ad2a68854c15365c586001112ad2c19218871c228cb62cfa4951b1851d1b7ec171d5f5a3338589b94a113ac2e0f7a778a99517ae42949ce4d160640162898d140d070b065b5a345a83e2f7c5491520d5253690008530e2c04cc6162ea3073f139cbad1801a9d351e8dab8711af4167e0d03153580823224b724b8e39207c093c50d43684c350013a43d6f0bade30b015019405721cc828a06eea01c7ebe1400caf12112c5064138554653de484ea33074b251f8e2b5b8e534ad889a1a1c35995c521cd16bdca4f1a02a63a7109e3aa5465a30c570628139c962c1d100609212106a8606b393c889200802c90b638d1a48783d6913a4f4a2b158e4e0970eab3022538c1fa932e6b972937be0d981f48eec049800e8b08cc907848b1e3ceeb2c004d06c4b5f9148458c86809d16288ad78a30d049488af4a781e4cba787000e4266d2491716bd2c254328ea70eb78b192cd248aaa226f4b176401708105a0fd0f4254f0415a0c893fd08a3b96c6020c48885a7b0bb3e49920250b02324490d073d4b0ec16d033f366551a5e851ab2a36b206b85df08899744a3184024c4b7adc3dc2b0e2c776e7195e62d5c3ce1612126480c2410217992aa092e0105b85bc52a7be88ca1a11c19249e849470198c763dbb25417dca0f154e5d5ab2fe7cec89892066fa636ec6804620e9157008068e043154e303e017f77b0522160e1151364a038ac528432c5e3428924a73a08f06ae8e68a71597902a2d2808099149cda5765681e4410748749eccd6fc6994aa3327d7982c6a0819eb443f2015c63aa303047890971d28b332218ae479286097431003532e02c0b832426827804347c9d0689ca63867648c29aa72b95f81537ae0f797cccd5d8e1620d84983b5b2eecc879f940a1a4c109386c5e8d0ca116b64e7d7c4774a02124b9c96221c1c28720232a0d6c8929f52ad4a21d170ca93182804e20d54286426d887862006703110f838c083bbd369f07350ba5b0a6944ac4c510a02c0284b9b748946e1198d9a2ca90bc9a80859d9345194c4f424f58a840e0487e2541daa335af0721209080b893ea0b6d0800a72e4d80b3a1d546ad922a4e032b1b519d26203a98334097163f12d8202c24c1e1238c044c209051d1810f1ac7c227013ebd408cbb84210a31b4da92cd89292e1efea4b5265a883459eb6a50425e43979100a00dc4893d967cc01d1c2020041214ad521646a491434332a3204b814452cccc09456780dd89379f13940d18e8b06a36f9cc15b7472a8f3d71619938b82559d32464515258c88f9c14adbb23ebed7cb386480ca80788e078c3024908491720008087982332cc3460c9e410255328451bc64c51258070800a151b157c91dae069c18f936b6444aa425e39561e592e64fdb02e04033d7084c3e212a93fa82a98340096320daaec3460e812051c60a84cadc80a2276e577e7a84439e1015c9e0c183e9400c874e16ac0c959c24284a21a0f3c5a88fa4141010d33400d4120eb1004ae4ea994341468a4bfdfa9142964f011c1c64d91064e9cb5f5e1b24153c0aa839b14193684b1704b92fbe1b546c22a3b9c7688598a07b9b5fd786a3e354c826ca55845a690171e8eb4628051b4f568a823838a0928b852920aad8b03da02af09586f2c3d91e0378444bda5c7d796d707e3c80c14731a20242ad299305e8f1e98b08503c62401192a2cd24859e4c447d1b29681c6b3258e5a1c35ae5309283ba3f688f15028cd9130fe435c0e2224663473073cd1b214a30a194a7128b553ecc09828539bd30589c35a410b93d60b383604a1573e7c7998a0094915022411d0150776e72269a2a825acc048ec55932f1656683024946147531759d692417b7c006a2401c49e233dd0f0e8d096a5449014af1d9343a0685882b63beb9497a45a1728736f97e088e8d2c0292718dc2cc1106681a81727ba2c8d62c0769ce3c0e54c17272f4c408af305c3274064a22cc932e2c90fb290a4118a32194de51901c9110610f029ad168adc28d910e380393300411b3eb13a2052852494ccc43c74bc15bc11cbcaaaa4d6098216844eaebc7048d0236a810b59ae84892b0467c8b702336a8d8d0fba0d2c9283eab80adb732704020a103716d0fa992176d0f24229cb1a2922eea4aa030276c1e74004014b04d093e5cd0126106000872a0d571e887285a65dd3ca8b172a0f4fdc207f2b9460099a0841ec7044512401e6b441e38262868239a7883046845052a10e191c93bc4451b123bb817163d49ab96d3e746cf331e0653b200a2c0b96427b4e157131a35c11bcef910174f400697100a93836227cbcd256d598f026628da40a3a42d9c95fdcf88e1a182011274b940767abec422d3221da8a0282d08f307ae8083a58450954e0e227c301288454880046c89029060a4460a5cc948f02106009403a5cf1c150b6650b888fba2d5f03ab105065cad591c39691060a78b93270f9ec3cc81995c0842f1c62d8f8a31c1e72bc0d4062cc1c9b2961c7089a78124a691170578a0428445a32c8dc00519133755d43ac70ada95ae321cb24224d8e948bde3a78590b1023270b09218c823ec418c0c0002d1098ca326f86d8b51903444c1903c63cc100aa00348938387041525a0e2833b62610397032e2d6db54830b154b3f80201ab0c024cb8dafd103896a189104c54c1e0602192007c30eae0792ca4e60a201a44294e05e01c101f592e16b94aa804d7729930a0e569dc8028094f15392649144c43847420558ddb99028d4933222b23c80052309e1880462066c40d289cd9ab155036619e064648233c8edc7e8688806831e67084d7934c5c8c6c3d10518135efd177368e8410da1689a90681a222902a005013127b0227b5c6ce06165cb4fee0809261e5ad09314d535f9dd011286ab0ffc46d8a98204460a60f171c18497130d1d0f8f3fe5222981907714d802c7a3f0bde2f2d282eac8aa15065cb9f300db063c5c2d2479173fc6d081d26815045ac884f8e42585ca2a2a522694310a9a40e614c034f9b4786da1e046a04e9fc59616451eacb0b0b5c7934d206ad5032d02e8552823c8d0ca30ca1580ce893a38a4986455d04ca804c9a722a9a0ed0e0e3b810326b6407810e1cc169926567219e218a8e28ac32b1483025b06372f622e2cd571704ffad06bb1810a190f6894085a84c10c84b61f046487c6c439a435c8adcb913681166824a30fe2b38406efc2832649a61c493a671c5cad30cf6c72d1e19315331b7a97082f11420aad58e40015adb62d6716793900830967fcd2000b85571709b22a801ae4a0544131c68b4048523dd0a16bad2c9352575434e11229299fc291e5c01a1ea63812545046851dc8b0d4d5856100b89e0e38c583e8c81d271d1e39c0810390507e4c89f5f9e427c410c51c054b99aca2bd0a926ce7b463e3039e12432526181e289a408d452722726ad298f0c4c111041b0a3158e302f0c1b101aec48145c408f1739569ac821b3b263571b581941eb8351b178670c90262bcb3e65890010bc5e603a80d1dca3078c5f861684081424b22928ff96705025147638c36b1a012655d9dc88a70a922e36382934a382ab873ba59faa0556a40069064ca9a3737403c25e0e91104709e7e26ecea060ac511a5f6a38ec6121a8f4a71d98fa6506921c6c4a5430c88e8c4298d8d972243e8bd16230e0e5e0cda5bb214c9e7870898126e44b9a1030691922e284075da3ae5a1c959e9c48e4d4e7a2416d0717ac02b45271f005cb951750045e666812b60b4f87890122397675097006e10da0009a2296e0b492cc453c3aa471d1286bcbc7670b0cb6025502b3f172858e7bea70473eaeb910755c95627973a7f5e2500f434288528095a14ac690140985377441e55a221440faa405dabe0d4123d39e2f060e84a994a613f567960d97c282b4ea0e5f6d849f46687a84eeb88a194d0178905c04072f4e14a212311ba62226315b0e9742050186462952bafd62148300b48a4215f8568a8b8ed84ac02a34501cf5c00726b8f5e652d50a2d05a9e0518169d7871ec03224a0290e86a5720e6187058e08e34a1d45c0a5101bc59d0a38601a0ac2d43070f2e606a95aaebcdc9a32799b860202b3b23b4618b9ebac7704d5a1817241cb21c795530c6cf1a44122cc01074b1c664a150804a254e38d6f070f891b20589981717e6c891c315248581e7063dc9e4279136c831881c74426df0b30100578c5ab191f24b404f2a3b044e555945e3ccab3207a2242f008bf5234b6ee8eaccfc5e6d3d4a9145c39d0789a264e172856bca00432449c013e4f7f61aa1e3401f4a012413b07006a30690cb001b98443caadddc440a13c00bc789a406ad35051c9056c153970aadaa4ba390187ca1645c6233c5090db844a602426131200517891e91229d9a2b7307ce062367f068dd79fd58a758305f4c3111cc24e66740241cbe257e320c878065484e12f5ca8840a2dd42537ff953898e87486d103cea62e84d830c8ca6c088c3c05727447264d25e002ac1f085d012651103d6f7000774801a189fd2b6c0889062f0220903195c4ca063800c9a2c6560bf846a40c08808c12a6b0d044c0f0c1e9430e9f4a0458a28aa90492c78354176d1827393fa232ad5f132a07672c48276a40b4c1bd8902396111fdc12a13074674ba60e82663a5e26dca10d40e347823d10904dd262e1e2f41308951242109292d8528306754da002809d2c75660594486c0b885aa1a283853833d86e187f12da2092550d0bc5c81aa4e88d15d68cd0193517afbcc478a880218859250916e06a45a3acd2e28118661871d06183eb0ee83cb3ff77d63c5dec784d7976bfccfef974d7df53d5dca1033d816feaa6e73fcd75fd3f76d1b8f539deeffd67d7b845d33ebb729cfebba15d0308a4eb7f67a48d40601169c4f1b6e7efec1977b93de13eabad3de6deb8f1a2ada9a6a98ac61d3dd56e9a690af7fe347555df76158dddd634e5176d5f306cbc671bc7bfc3bdedf05f53d9bb2a6abce90a77ef9ee9e9e7d8fcee2964bbec8f28f0ed753bdac2e6caa2ec197ff3c7b2f1a7646e6fff5f9ed1d88d4f996555f514b2fd7cd1f69a2babb6ebc9b2acabf6748d856c27fa5aeefbe3d9eb7fbb7771465b1aaf57d3584ed9139dd593755d54c8f6744506efe2ccb2bd3d9653d65459d6f778f6ae2a64bb3de34dd9d83dd9156e5d349edbb315b2ddf889c1f55455b3b5d74cd7159dbf477d8755765e856c9787c17f4cde49e318109834fab7155dcb117cd582c1db46d6bfb49785fd29c7aa899eee8c9aeb2c64fb8f8db4fb63e30ce38bb5b58f342ae3f5308aa2a70caf7037d5b385bb19e33563b7c36ceffefff66453183dd15e36463bdbf6783653f5abfe8c87b7bfedb3f7b3d79fa99cb2ea9f5b989dd738755b18efac9a72db7dcbfaf3c3b1290bd92ed3622f5e9645ddde9aaebb76758ed756a6df37ed5e6ee10ecfa8e9ce1f3ebb69f67a369de3565dd5d43c63d57721dbd1b3ecfd5e46bfc9c6ae7b9adeb7eed93bd9dbbaa6da5b3395d1f844515315b25d051b7bbbeb7ad4bbbf95d773f56917b2fd48d7b2e9ba78bb89fed4cbe839c7ecfc5357c876e2b1380ccabff642bbed2c00ef3ac37e86cd58555d164e6198becf53458bd785cf74f5ab4f7d2ab729dc0ad97ed734ec43b0787d6f5bf7c7a76f61f8fcf32aaca389442fb4d9beae783f7b9a73ca9a669fd1f89f5dc8f66fa48971d0f8e9fc4d17e9fad84f752d47504cc5bbc2f2f9bd8b9af329abdfa742b6b7de064c96f6752d4790157b65d6c7ae39afae7cb6ffa37e9ee9a09be6bea69767954d61d9654d143e55b4f6455776f63feea7db9ea96cce685fd71e7f3a148d7de1b665d1755dd71676cd160602dd752d47105e5f333e67d89f728b9e1d565b58bd8b33aabeed0aab3e3dd359f632cac6a690ed421b790cd6f4bcf6b4f4ed262cfb368dd3d8354fd5cb42b6d75e189b3d88be671aa7706baa3d757bef1e15b2bdbeeda0fbef610d07040281adba9623c8e37c5dd6c72e6aba2a1ac332ac7a3924fc6d8faa6b39826dfd9dbbf9ff7ca21e364fb89fb090ed41b4afa7f9fa595d579975e3d545d539f642b6ab2352bc736b9eed575b739de1f8eca990edc1b3af77714657e0fb65d9554f55864d5796dbb60bd95e47d772c17e86bd701aab6e5fdbb8b76c57ff2a64bb6cf4b4dc4ff6eb0dc6d7d857d9d7dbd75bda57fc6dd4f9361707d8aba27d956113763f6ac271cccac6619d11491b836d1743f17a345d65965d59d5f4303c77f4eb0dc6d789226b7a0602efe20cfc324fe417f1581c7ebda57d054ff5581ca245a411bd8b330a9f78e5d9b7ab3f5b37354d74954d21dbefe21c94330ee7dc5fd371ba9623689a78d1f4cf716a7eb63ddd7fa6b290ed41b6c79f2e58e76b565dcb116c4b14693a4894eb601002893a18b4917530e835a20769a21c4dcc20a2fc0211020d9a20487c285196f000d6810487131b4c0d26bc4864b033747961988b3d4c24d2f5890bb2ffb517d79f0bde76dfd861ab07bf5c06ad6e6795f89d4710beda7f62acc142051114ce093d190c21a148c7c15f07837d6e55cf63fced201be1947f3078dbfd1310badd176e7830dfc8a083d81e16413448570e0c56f55c5062b5670fdad1757750ce3814da5ed8a1b781d783c5604ddf3ebeed7e07fe33e0172602de2f7ae3829f98313924704145a88cf19e21ce7b8538ef11e2bc3788f39e20ce7b8138ef01e2bcb700e73d0538effde1bce787f35e1fce7b7c38efede1bc9700e73d3d9cf7f270dec3c379ef0ee73d3b9cf7ea70dea3c3796f4eef4d2f89041ec8559431dec003e763fc770814ff1d4ac37f87862f3c8ce018dcdfa136fe3b3481ff0c2de23f4308f09fa126fc6708e63f4365fc67088cff0c31e0bf4286f8afd01acef98d076c9c73b69fa310fce7e802ff396ac07f8d58f15fa354fcd70802fe6b5489ff1a2de2bf460bf05f2339141a4cf8e561c57f9490fc97c7d4035f872ceeeb3081fb3a3860b0d5558affba20715f6981ffbafef05f979b1f561bff6191f11f1690ffb03af01f1603feeb4dc07fbd49fcd7e3c37fbd34dc57e68cff7a5bf8afd784ff7a37fff584fcd7bbc17fbd31feeb993e1f050d1826fccad4dc5786c87d65823edf2a42dcb7ea0ef7ad5ac3e3f136bde1be4d66b86f9314eedb1484fb36d171dfa699fb36f1e0be4d70dcb729cdd7a00f1cf7f531e3be3e2bf7f541c17dc9567dbab8af0f16f7f129c57d7c2e711f9f44dcc7870ff7f171c339b7906541c204090f7c3e8e709f8f3afebb04e43e1f46eef311739f0f1ddce7c38dfb7ca4711f90ce7d4042701f102eee0382c57d771470df1d29eebba3c47d7783b8ef0e0ff7ddb5e1bebb2ddc774785fbee9a70df1d10eebbfbc17d7742eebbf3fcd7880bf7ddc171df1d1bf7dd8d71df5dca7d7728b8efae03f7ddfdb8ef8e01f7255b715f925405085b122238b0006102859f96970f4718eec34185fb7024e13e1c48eec301731f8e97fb70a0e03e1c1b9a30f07d60f4a10cf77d80c27d1f6eeefb4073df8798ff2e69e0be0f6cdcf7c18cfb3e8871df872feefba0c57d1f18705f4901f795a4b8afccc47de523ee2b05715ff987fb4a35dc576ae1beb20af7954bb8af0462c18b418409172a44a0c0204b42a256fc978813ff2542c431246ae3bf4424f80f5129fe434488ff10b9e13f4454f80f511dff2172c17f883cf01fa2082848942c1703179c6399dcd72609f7b5f9c17d6d62ee6b03c77d1ffe705f9b34ee6ba3725f9b12dcd7e602f7b5c1e23e36a238e7102a700b18b2b85a9e1b24bc4c9cf304e09c57c6393fe586b5e001560fcb41af8103099c7ff87de89c771abc9b31813184086f82668aed8b17ceb93039e34aceee7aa846e68dc352c5598a288d9f68fc44f514253a1612a062c30fe89c6ba1c2a7d8e06c009842c0ae8144181e3e307b60862c8ae24520490f2f8f5d6b69511e7d1cacfb46440d44d97dd938c6396f2355a21dd8c3e24f4724fa22b1aedf982612c78c7243a2ff77433b6d8d831e75fdc695c608954e1893f64f94a0fac7f518959f281a11e7fcc1212e671c0689bec32abb061e7db1bdc1de586fa837d21be88df346bff1eb7f76a26b6fd3a4afeb31f91b87f3978d358cc3fb138948b25fd365c6211ddf433279182c225f383aa663ba4d36fedbfe70bee86da40ca1ed85f587e76afa453249661fefda1f6b24912d4934cef0b797935f46f2cf9967f2a7abdd978dc6135d337ae1dbaf6935b67bac481bbf5ca48df50bbbfe70f1abfd7848db48d648dbfffacd382cca63df36fef99b11fd301ecac818447b28f7d384f17f7beb3f3734d26af7d058434643cef2f01769b76fa4d7c4f41e061cbcbfc6608b900860602c5ab0284dd8c9c312f7fcd3c4daea19f7fcd3cab22c230029ede461f0cbc93f586ce04268f080c12a422c5acc9f3888c50a14a5f113834199486355a2c4c5c186db964b162ccab8b661b36cc1a0ab5312ce39182ebd0c63510a815f4efebc08ff712283e30dad6c8c6dacac5c51dac943ce3bfe3685e2298ebe4882731e68cb8811a559b2f850dedf9e67da04e70c5a30081b31a264d1a2948d9f2ff0c317c4592065418c05680bce16a8f86922d6b49de2c743a22636dee6f672433a6f4c9122ce4489a3afeb8c4831b1381bb5c5c452942e45c5c44ebad3462a2686d2c968a90dd4c697bf8d14134b79b4ecaaa6e8d982472f55e85811d7636262293d1bd15ad0b311cd6e61fc695fa6e1a4579391f59b5b0be34ffb45bf66e7d5e8d988f68bde3817fbdbed13614fafc9df58838d5e9b8be9b4fbabddf49afdff0ba2ff66f49add2b139134dc2ffab56f13fd8b974844be903f913866b740d186f297bfb1869858fd8f48bb8509b013b58944e45ad238568c6fd4df46d6ff887473fb74c3dbaf198732ec7be8ebfb58acc964a1b1c6d1d76f9f6e68d3f49bfdff0b39e370edcb74fccd8a434f44d2b5b1c65dd347b37f3774b35f99489f7d22ece937d993118936b2be8d35e46fac3143260ee1bed98b7906913846248ec9c4215c8b3b1ee3b1f696470ad344b2bbf66c49992693d192324dd6a2c589ae38d11ab76da4cbdab3235b240ff34c57248f1395d1e66abaeefe6b278af4212676d28989c5e09c63f19fa4519234715e8ced8c4822baadcd407b2b5bab112378634c6d187fbae09cff752ddce24ff786400333b85d036fcf36e73fdcbf87759dec7f3dfffaa40b8a05e36fc31e1ec7ece1d1cb1989c7e2f068d7d12bec2fd3c6a0cd9b00921baee67f7ddb305ac8b4d144c5c4c48a18011284014d9cfbdbe65eec1a488410c148cb466fa4c738ef15d072a412ce39cd7f8e4ef0e027d26b32913e33fe3bba7ef16fffebb23a9af8c99244e38c1a652fd1277d1abdd6760f8bc334b319656b6fb06d465bdb1b7cd36a98cd500bde18531313f3b61cbf6e2f4dc3fff672fe48d7c734ba1672fe8d8de88d686ec97b58835eab654f267b32db7e85773d249b69ba66933dd9af9137f2c53d1c33fe39facdb6e935b5167234f1a6e9b6ffdbea9ff4c492e88d63753471368ed935bdf68948992e969eec889ca3eda12f1a69248cb4ffdb3c94bdf03622cb5ffb1746a4971bdab68a21b02c6dff614f447aa1dd17def5102e7d69844b13259246b49b36fafafbfa5555555555354dd3344dd3344d51144551144551f43ccff33ccff33c7befbdf7de7b374ff3344ff3344ff3344ff3344ff3745dd7755dd775ddb66ddbb66ddbb665599665599665d9755dd7755dd77555555555555555d5344dd3344dd33445511445511445d1f33ccff33ccff3ecbdf7de7b374dd3344dd334cdeebaaeebbaaeebba6ddbb66ddbb66dcbb22ccbb22ccbb2ebbaaeebbaaeebaaaaaaaaaaaaaaaa699aa6699aa6698aa2288aa2288aa2e7799ee7799ee7d97befbdf7decdeeb6ecaaa6e8d9d588feaee962118de3f023d73f05da370ee58c2fd17fb75fb315ff8dc67f7d1670ce6343fc75d1f675257d26c7ae81493868dbfe48f4b79f937e8eb64bb01547db860c7948db9891ae328f37079a5bd0eccd81963686d6f6ba05dfb61a6f636b30d0dcdcbc2dc71f0804f2de8d3d89f61c320104024b946f1b5babbab9dd25edeae890b75dff38d2c6e29c8fa1502e078e1b70366abcb9b5d1605b534b9311e30cc68bd7ac8c6cecd52bae2dadacdf2bde4cdfc7641dd7741c76b405e0bc48d72f8c9f18a4efe011196ce7bb0691e88b6e34fd46c6a237c40fe7d931b488a7e8a7e76876d344b79b26ba058f472f26e676553d6b5b4cccd748dfa2be6db1a2edeb56d0f5cf91241b9ac9c61a44e210ae3f9b1dacffb13d7b0d300f02c0e382732e26163cda6559d3731e309ee701c7e388f3607158fef018c0f9d1ae8141f9db0de7f40c8b87f72f0aef61edc38e101e60a1e1f55cf44af02071dea2433c4163eac4d93550f6bfe6597442d5749c821ef21dc87a461a6f18397f3986bddbb2ab9aa267377b167a127a3d1e2b9eaa39258844a4f1378773cee3e2e45ce23f397138e7c7e4fd93b364881c3bceb989520c0cacc44f4e0d3969a5b18824d271597ee3d048d7b62f1669bb2f94a3eb1a697f234d34311b8761295094355daef9b5f2a6e54a94ff1e1a8773797b9a38dbffa6913f4ae330f9e7927fcec48b6e9ac81d61a6699ac81d25ca3810427880c589c595f1f701d3a5d1d7fef862c64b640d100f2bd6dc28113a419b0885a062820899180de39106ee10a1704283a60553a80c81f4966983a25ad210316966c470a103d39062251969b8005843584d2b9a70249721581b5ab95a54b91182e88aa01d26a2a40921a0ae819b0f2c220889adccf1f1caa242480ab63533955213045945c1461d1b55a0200a445003e8cf89360895074ee612bd511004c719b2175d4c2408f2a5049197bb064120a4e624bc61d5a601b9636609098a005e005182c5a9e7840523206c8940a962592601f1e2f47e5085a3c7dd26250b3480c12072f7865d838420fe3b20509ec4b56ce8bb1710541409838b72f70353c1fc64cd3149290d14a1ee4e2d6986ca17155604b148d614d252a001d3932b306911b9d12349071ac80ced908067c728887a8cd143ceae8b9d5c1dbb3302411f7c7e56d5b942739176f2b2a34e9098963fa186b8a91300dee2a2e71c5117c47a0b6385e4585722111d94145c72d09d6a0085982842b8e8f6f4b1e4e3cee3a17322b74994a0b514746f6e1d6e80691185ae241bc226cdd523e427ac5698b6089542c649e46aadee011f6411335f8295a21c32c6184796d80e9080e49a518988bd67c5fdc08437a79f57f1ad0686914f8b08f072231921aa71df75dd63c81f952410b4754b18b5610038334bec473732a949b62db0c35c9a0322d0adc82616a06741fd66c45e31998a74d01db27b6b01d8418212ea436aea2cc6414eaea07252c37b1c842993c0511de6aadef2a594db0f55aefc5cc81000a51f7fced4813b48997e489973a755151c733f6e5849d1c7b66cfc088146441f5ee9771c65d35bd22b101ced9818c1f527cddb314909ca8c4b93b223db31c39f3c4504ed20426be232c0a1e20543b41b16f41dfc404e032457e85783d889392e74349871d2820f4228f0968c65b874cac2ca0811e30fa38a341dd0b07a8ab1c187377e9ef899505c742c7279bb80c74a264ec5d9003583c866802a9e1f6c886db143105bf5425099a00e4b0c04886885ca9d02da408b883c8824fe0c5925b050e74ef50af5a0e5137309f870a015910669e69ad420d2cf393c736e7504a02a61c39cf320a2cf1233a4d27c7802c56b950410c1079c5169184be6810f22b60fb424191addcd4df131bcf4064508c6ecd1304d6989c221b152c3bb53172448708ea18b3a97d6ac593b6018a18fdc1d9b186f840cc82961a587811cc2301ebcc0aeccce84739f10db4a8c825005f5008cd01548425e9346700feab4e40c55e850eacc1728b9017e209023140727721e95940342c47024077647c82606664b66095865f9e4a34b3bfb812d89c2e366d51c808f579a8246a6cc703388468f26982281c517e521811c43ecfcaf93e173f5559e3e1218497ca80285fa6b911aadbdd95bbf8b0d3252d9943239931e5597d609ab7cc00038e63c976cc8493bd98c2dbb4ff90124fbc0545526845fe2062ed9b841e6c2554c068edd8b2d72677c8cc588b4bd9bc4248a19c08ae02d203abcdac41dc11fee9e95a046aae0a4133c205fc5efb09d000bb142e547f8712482aee04f9ca9383d714ce2dae2383000f716a21341b053254b731082a58270306c1a25068744704894315d3c40d5c1331d41ad005420db0007f4b07456e3422738223d0c6890c6ce4e96a11e37831a6171931ef570b1c0ec4b2d889a1e10c0141b60f2593c1c21798099d784f168a3000f1f2c2e9d61d154e491ba526be0001b1c0f5ee8c848869ddc41c892d7a7ac361d3bb004d9e14f305810a1993b502449416442a3a643021d7db8c470538053161d51c2caeca8881045870d1d201e0829bb51c1911ca124c10c748479c94127c791bab355268733871a9433a932089a910307264f7a86693218c2d1662c8505ba296c70d8e128eb83a302ab9fddd9987a2392204980c0a4276e8c6984a92d6202cf0ddace1015275be0863b7763815a1c1be5310a4e510b13a9fcbc8902a7a59585515d3c5d829309d92330445004ceb44101973c38ea88b1b0b1400c1306a02bae6c547930e20b235f211b3a5cb03084642dcb86881aa58e8564145a00d4c0536349db284a715d626ad09874ea029c179e6abc717a43008d8d882b7f84bc097983f1967507028f40c70e6e952440c291e0c46e6726e0e189cd8e196e76188608e0844c706bd1264a1b539e8ddb032863f69458fb6a6b2406826f271287b62f6dc3b65483940480a502b5711a83ee685cc992c1467a42108d38bb077e7f6a14699c00c2968aab80091698c16c7cd89e04d96a64113189440a226c1f5e3a9894ecd13203d48c391a0c9df969b930c3c88cb4196b98d6d650308c82c59db05607bcf3a85220166b645004a9d1f4455ea3a006494d8c9a51ad9d81050100ab52a961d54326b3af92968803b2cc918b863402d2e2b4143256c950404b06150364e41893f1852806a9187762288941a38018689b6cb4373bd082a0bd404b3ba3943c33e3cfea4e672cca9c3980c108861718c24c30d017ae5e087a21008617c117263ebda85e3eaf93defba6be6515b34f6672cc8a98c9302b7ba04c4d195dd958d904b2476462c88a642c596fecd0a13f96055292b1780c98a4888b097c70177f9a7017535cb8c0c15d7c7100a630b84d183f3158f78d2592b50fd65e1807ed2170267ebbd76b50a14105bb061aeb7fdffe98a2be6d1e01e59c1ff9efcc25bb062689494f3cda43b3386b7e6d360ec366e3b004fb9d498b7bb0c9cca12fb36e079ac01ef6e5fadbf7301e128f769fae441affd117ebbed10c1b2fcda477ec6b2f8ccd7471cee3cafacbfddb38fc957915571afd27d2349cf475ededd2ab85a8a9944952f31c65b8f0f6c714c9bb03cf307a360ee1b495c2db1f4b22714c4c6c810a359c011d06744ca0e9baadcbbaababbaa98bbaa7db5dd375dbb665dbb555dbb445dbb3edadd9ba6ccbb2eccaaa6ccaa2ecc976d664ddb55dd9755dd5355dd1f55cfb6aaeaedaaaacbaaaaa9aaaa87aaa5d3555376d53365d53354d53343dd39e9aa98bb6288baea88aa6288a9e68474dd43ddb933dd7533dd3133dcfb39fe6e9f6b6b37ded6a4f3bdacfdebbd95db33559733555333551f334bb699a5d7122ac852a0bd266f74037c69141e2d3faa3a2b6c1254686154175438d4d28c983970590e809c4a0c91922373e40e0489220838c456b272e283a9040870e6002c8045b2bcef4088014d6132204143bec3ea4a0c0672ad9d4020717631e4720dcc479451194a1d38a30ad768409a12082056a3395075c6cd569b526a3e97105c3ad64da2818e13e015a45621373f535d84d80e48654c0ecb5043e05a74a96072850f161f416e5040bae7686891db75d231b3ce42aa4818047f6ad8a1441262a7106fc34b5d51fc2c0733498d071a1edc4ab80a4c1273635d10238ae3b079851d026d722518bc7ee01c0bae6078b5024682cd409401c96549a5ef520a541d10a232e8649085ef151a31c152ae475c1852937df0924ea1780234a9a156280fc0c9d52024ad097529f1e7880c55babb5411b807858b1e64637a8c1e2b1c203d4745f10b48950082a2532e5e9c95580650f87135962348c471ab83363d09625719a57319a7038a141d382295488a09900120307be19050c6f993628aa1b7875276ecd82379fb840ca4a3323860b1d0f68f19c4861f5692224c9a1928c345c80de142c0919be70a180450a064d2b9a70e496325c1e3c901604529a485a1b5ab95a541d40c78d03af3159b2466975b82268878928693832905145fc02d5e5a1abae819b0f2c205c7a806d01521c9a5ccaa065658e8f5716155e6a92d853311a71baf3c0b666a6526a8213174c9ceae0800748273250b051c74605a8c90f4f894d4388587adb8aa006d09f132d515205251d02e6b432df03277389de56913ac0f4024b823aae19ce90bde8622281daa60c7fee76a8e1a4674b09222f770d7a90a1032311960ba34011f2cd4978c3aa953167550300d2d8ed19c580979925242802784b4939fe4a01bce204820b8b53cf098b45522404d02106a457a0d67c8940a96259244582c0e20d03492d4e2478717a3fa8c2d1630432c591512552a1c9e252b24003188c214a4e4411ee71536507cd8f5d8384207eb6068b528b8555de4d039427712d1b6302a204a525324ce979b800414591303828854cb97fdc6094d992f60353c1fc640dfd48871f5a0806bcb08af6f8c36aec61f73483a95a63a179d3f3abad67d1f8745954f6718a75e6f5a6dcaa30aaa6261bc3b2bb0ad9e097ab7fd1ec774ddb2996997786cd133d7b2ab35d86d1382ef3b2ddcb5e465d773ed5b4f526f248e69de1985d579585db3575e1d68f797bef33eae7983d3f1b9b3d02b0c4bc72975befcd763ed7f85cd9142bcc2bb3b2fcd595fd3d8dd353c502f39ede557b8bca6c9aaee9dcbfbc731c9b32bcb61ef6aef9e7d4cb1bcb2cacca290bcf6957d5d8ecf2c21e55d31656d1f974e5f98cc3e2f2ca6dfb63f8fc317aa29f8d5b21dbeddff6c0daf29a5ded6c1bcb1ffd2bcaaa70012f1ba72ddbb2addcce287bce6b152c2defbaca3d4661d63ce1f89b70c722e0457d6caa69dccaace94d35ee58595ef4ffefc6ecff7d4dcfffd17301ac015e188d3dfb65154edd198ddfd30d0bcbdb5dd6cf2c1aaf739cb22d1b0bd98e74cbdafa998c0bc0baf2ca6647d3d4bbe7bcaef1da4d21dbdb7ffb1ba9b6d6c012e065e1146ee7559e7b9aa26657b1acbc261a9bf21aa7b3ca9a6aea63639537955b3435bb799e5e766177c6a2f2feb66dd1d97463f56461d5c59af2ae7367511555d7f5bb707761b7ab48b0a4bcbff7563dd5739e65d76c652f64bb796305f0c29d8553f78c7b576338edb390ed6977fb4a032bca1bcb316bcaae79b6ee1af7f40bd91ea4e5f5bcc382f2b69f4dff7a9eb3774d38353b4b0f8347bb633d79bfdbd396f5ed7caae9aca23dc572f2a6ea39bbaa4f65f3fbbffeb4fd7a8321d365f777c36af2f6b6ff96457d2c9f660bc3a690ed41a38fcf4ec462f2aae6ccc2deff386ed9f9afea91aecd80c0235dcbb547c22882b5e465e1bfc66a1af795fdffa3339692575ed77ffad5fcbf6d67b6f542b6df345df77e622579dbb89be80ac7ee1a9f9e75bda9070bc92bc7735fd358365bf99b2a8aba81b08ebcf037571646639795cdeeba2eda07cbc8dbe3d4c7de956313ededead7d40f5691f734e7f38c63d85de5735dd5386947d7c7572fda6113f5ac0cbbf3baaa9f4fcfd59bca6bec65f944dbafc2710cb77abfdbbd2acfea19c32b1a7fb457f0ce5fede6ef70bcaa28ec51363d0df558bd5e8de3d934655595e5d94c7bdb29785dafca7197cfd884e7335e7f5ff5b2b2da7ad5f4b16aba6cbcba26da9be04dfdeae3d874e37faef18cc6c6a45cf625afa8aaf7ec5eee267ac26a47d1344525783d3bcbe937e77f7e3766e135d5dbb668dca2a9db76b98ddd98eda17ae7b48d5733ed6cecd5b39b6ddd3bf5a6f02ab36b575d6f76b69ba690edbd9b7a5d379d65f36ce5d3f4a739a342b6afc65ea9774d53f49cd3d5b3b22cbb6a6a47930181f2b7a3e19425f648bdec573f8bf67435cdaeaeb22b64fdedcd7c5bdf47bb37ea85d1d685db5655fd3f5177fe4938789ef237d600026551af2cb329ea5b596d6156955d57c8f6085eefcef27cbaea77db533dcfd30df5b2333aafadca9ee88cb2a7290bd94f847dbb962308a407ea6d3d9bc62acb7ed45cdbbece69fae99d61d64ccdf8747bef41f0ca691ba7a96fd7ee6558eda7a7f7fc6c9a9abd3dcd336ecd15fd2a0302d11eec2afaa7d7e9953f3c7f7356d919fd299ca22ea737fea679fe18eeebfff30ccf9bde955dffaaaaa61aa3b1dcdbfff596f605046a7ae5734e5db4fd6b1aabee87cf4c6fef710ab3fe8ccf133de1b3c5f4aaabfb5dd9ab1feef377bffbc06bae6a5f51d53461b355ddd5ec5d7a5d5365d93ec3ff6ce5af9e5f7a965e556ee5569ed5f57ff46c61bb2f1bcbd01eec6707d473e03dd735fd70675d148e7f3cbb291078f4c5b6d21ba35d6d4d2fc76b8ba6de85814020104a8fd2dbd1b59f73bcfe3376bfdac26b5f655f675f6f695f40e04a070406fb4a77ba1d4f6fd2eb63d644599675e37ea2a86f7b925ed66c4f78f6fd777665d38ea27468955e036febceee29fb9ea6b26fdbee23bd28aca6e88f59349d512fcf2aa4b79b68bbb2ae37bf1bcb265b0777aee93d7abf79c25f3e3dfa61578dffcac0ebdb133de1396d51996de5a05a77a6e9397a63d8c3a7baaa279aba6e3aa3307a8dde786d673776d3d34ccf335d4f253d466f1acbec09afe73a9b2b0bbb7e7a8b5e559ebd79b2a6fb59975d5755c8f6b5efe9297adb546657f6344dd6bbb0da4f057a895e7fb6f23ccfa6e9e1efce2e2b647bdbbfde60d875690fd19bc6eda99eae9ca2a6f9cfd30dde5f8eedf78771e83d61d7cf27acce6c87cf565e856c3fbba1b7cb306aaae9da3dfcd1f3444f0a7a85defe5d2ffb76f66eecaea64ce85d6198654df7443dbb9ea63755017a83de96853faab2b0fbe1aec6b00a0402814060efacaf919eed07f404bd2c2babb21cf7738563ffbd19e84dbf7ac65efdeeea7a0fcbb090edbfaefbc6b50b6fcf960a6f7f4c93f749d603f4ae2c8cb61f75e51595d31eb3eed71b8c2fe03f26df80c020db62e92df0c65d6e5db8ffd4ec1e46db5581775e7d375134663d1caba86bfe1a69d3c438d89e445f76d6e9fd79bdd97676754f148dbb1c7f64b1bd916ac6176acfcfeb7d7b76d7a7fd84db35edaa90ed5f328bfc2a0e853690ee0b66915f66dae74dd7d48c59b475e5343dcdb93efbd0d76f668fcfdbe19565e36fa6e7c9a22bca0ad96e9f7d357b7bde15fee74f3f9bb22e6ac27e5dcb111cf612783bfbdb9e7635464fd654e7146df5bce69cf6189ebd399bb3caf69fe73dbb3ab7309aaa9d65bff965263d3cefe9677746e7debbfacf794e7b77deb585e355555358fdae0ac32a8ada7953d4fbf8ab69ef6ccaa26e2b647b9d5736e779f528abf63986fb69d27955d9bb5d6dddb9b76d6b7a384de7bcf2bac6df644df4cf6b4f3f2ba627e7557f9caeebbaa2abf9633fc36a7a715e353e4f389d5db6fb59ee2e1cb93dfb8cc2abe9db183d1178d17866531865d5399d537535d137ef8fd5f5c3e7a976198edb943dddbc282cb3a7999a6777d58fa6ed79c0ebd5d48ddb55fee7dcaa5eee357a6dded5446514354db7a3732c9b1f65f3aeaaeaca6e0bafabecaa6eba0ad9bee6e8ad79fbe9d19eb66aef5ff5ae89aa793d7c76f77459b6fbefd5cfa6695e555e61796ddd3ebb2b3cb306bcbdbbb377cdd365e37fa6a667551d3d34ef2c9bf347e3b38ddbf3b3739ca267deb335e5753effc9c630bca22710989a79bf9fd114657bca76f9779f96794ff6cf2deabf875997edbf75d323f3c62c6aaaeb0cc7b39fe3d49ccbd8d2bed4047a63de19565d9fa2728ab27ded272ae65dcf164561f374653986cd763ec3bc2e6c7e8fce6caab63f5dd7f444c1bc301aabb269c2b0f94d53f55f5e5956ff3fe5355e7bda51d6f5f2a2a96cfeb665fd0ca3ec1c9b4d7a5d5eb555571885e3d564bbec3f7b82e97179fbfce1d87567d477538dbfb74f2ebd2daf0bcb699c9adefd73bcaaa85ac0ebd5d8bb7e9ed713fd29daa66e2fa0a7e585cfd9b769dab673eb7ffc3d01af8c76f7cbf277ddde57f3a3595ef46ce79ea2bdfb768ebd37077867b8f7b835e395fd6e6cba698af6b0bcaa9cc6de8c638fcae78c9e72efcaebb6e6b9aeeb09fbef4ff88c856c978934f0c557d9171a1078f44520d0f64060fdefe1693ae909f07aff7d1c9b67aa9e306baa67003d2bef39bb332ba767cacaaaaba6b090edeb6dffdba719e9557959bffaef53d377d5cfbdcf684ae535cf793ddb796d61156e3f9c9e535e8f9aa9fc6357553ffbdbb44d51b50fd093f2aaabe9cd189ee71346e734f542b6d7778b26ebb7934c2f80f7a7301b9beeec5d1445db15ed4579d1b68dd37945dd59765b554e7b50ccf5ec409bee3d79bfdc5515fd302bc36aaa9abfe7e485fddaae696fbd0ac773dbcf5e93775e55dfa270ebaae88ffd3fc7f498bc3d6e57f44cff6f5bd8779fa6617a4b5ed4ece69fcd0eafe6f71ef54060bb962348d753f2b62a0ca76adacee939bb319cba5e7a49ded49c4d9fa2b1d9ffe963dfa6597a48def8a771fcdd544e5d19f5a9dc3bf2aa6a87bf09b3dd847f6763b667e43dd52fc7a67755758e6339fe2801bd222fea3f7aa2de8cd735fde60927659a2cbdc37bf5b6731a9b5d6d6197fdaecb9afe4dfdc373f5b6733761d865d7d4fb8e7ad72ca83ec06bf5b2aac9f6f35c4dd985d1df5921db7bb75ddb4d2bf872051eab17563f3c9bad1b9fe7f94fef297861effa13fea9ebc25ffe72c66152363b7d1bd1d4f3e88ba8dabb0edeaad7cbe91acf676acea91aa3a88c4ef0b66bfc4db96555afcae80a1791368cb459b5afe6b99623a8c653f59a6aaca232ebe5ff59788d5d9e046f37d7b69fb1777f3ac366ff42b607efb57fbda57ddd40609ca2a7d95ee2a57a5558fd68ebd753f56a3cc731aad7a3e6d95d0fb76c3b7b16664fbd312bc7aedacdb68d7dfa4f18454dbdae2ba7704fe1f94cd1798667142df5aa2dccf6965d7f6cba07f048bdf1cc7e1fab3e85d9df9ae8799e74e7a83745e59fa6ab9b9ae7daa6b3a8d7b370cb76d39561776dbd7cb611bc2d7bb26ecab2ff8cd93446cd50efecd57eba6cefe777cdd3a3280aea8dcf738d4fb445d37535bfcb06fbf9e99565774d555585e356edf247217855148e639fbaabd9e3f67f58c8f6d5d3dbbf6755b59557f85c3feccf4eaf1bc3acbab272efa6eae1f84439bd1f357d37533f9feecca6678a6e7ae73636d1dfb6bf9be9eacd7f6a7a4fafbaaa2cab68dca2306ab242b61391c560ea060402813d092fd30bc7271c9fa68bbabfede83f31bde9ccce7f45e1f6b72bda6f3cf0aa319cb26667cdb9ab66bbca42b61b3f31fe7441b7bfe05d7ad72fa3f2ea6538fd73abae5ec8f62faf4b78965ed76dd1d5afeb3cbbea1cbb737b1ebddada8fbe68f69be7c09b9a675f51bfb6a70977d3ec95de3696cd936555f7bb6c7bb232a5d76ccd1465fb4765168653d80bd94ecfc661f0fe722b3ddf1f0610588837e97557589ddd14f6b0fbbdcb7654d2db5377ee6ada59d37f9ffa7e86d7c06bb2acead5f5c370abaa66ab0ad9feff1c149a9d112fd23bbbb139c3a8ab9a69ac7ad614b24634db5eebfb08e93567754ed3d45d7f3fdd2ec742b6a71dd8cbbeccf78b2dedebd12bbb33ecfb99c2ddf41eed75417b08041683ffcfc1b3ff5f7c957dd974430ff7f596f665ffffa218df0002e58cc3ffe79355c463e0edf0997ab4cbece9c2b2cba2aa91269601812ccfd1ebbb29afe6099b2b7aa6f18c1663bba0791ed5732d47f08cd7e86d55944dd32e7f533559f8e4317a4fd58553cfcaee99c6683c9f660ff6456f8caae79ca2a68fbd29a7ec2a64fbd98fbe8653f4b6663ccbb1b9b6dd4ce5f98c652392ae83493898a2f7106ecf1eb4d39e8397e8854f7575d5558ee5997555b7237adbdf63b7af688ca6a63fd59677e83de7d975e3d3cbf279b2706a9e3c432f1ab75f6dfdbcfad6afeeef2bbb962328e4157a4fd6f4720aabdd5de19eae6c31be41e84d7d9bb2b08f65d34c7b1c9f42b6b3835edfb2dd4555d9a7b1e9b6f6ff7330ee5d8e27e87559584d53136ee3d874d1f6eb0dc657fd8dc61ac27b0807040281f5ef9d678517e88de7b9fde7875bd9b727fa4f40af5fd1f9645bf3a3f1ea9e3ffe8f17083c1663762d47d0076f817786e75465e73e9b737aaa662b647b31b66bcdaec0ebcab19aa2ea1cafbeb7279cfe7967f844d9d8744ff67717954f21db5bb431f554c3f3f37ed6fdae3b9fa7dace2b8a9a7dde3ecf1d9eddaeaead5f4fd7ecc1e3f37a993d4dd6abac3aafdd65e53def8ac6ea19a39e3d4db5355d2f64fbbaaa6d5fcb11048097c0dbcef0ac9a70cace698cb2702c643babe7fdfec371f7aed9aa323bbb6d9e37763f3aa7adbac2aa9f4fb40d26ebdbec5a78785e77edf22ab7739f531366d953c8f67ffb1b595c6d7c957dc9f87a4bfb3a7a35f6ceebc6683cc3dded322aff154e856c2fd2f59c9e3c393c3baf8ca671bcb26daa9a29ebaaac90ed728db48d5fed6e5f6bf0eabcea87e3d46cddf37f7fceab4b84873152fe356b62e1d1795bdf9eb2e9b2fd8cd938564dde9cf7a773bbaeeceaaee6dae1b515b21dadae5fc4ffe80604beade508f294f0e4bc7e46d1998ddbd95de1ee7e53c8f6b4be8f282fce7ba66a6cfaeec2ae476713654d333c38afd97ffbddd5c7739755145d4f37d8cf293c04deb3cb6a6cb26d8bca665f4f94f7e6f52edbbae899a6283b7b5966ddbc663cab327a9a2e0aa36ceb4d143de0ed723f4d565dd5d9a76b6baeec175e9b575e7f7bca7e354f739de5fecf93cd3bc728db671946d5f3ecf3e9a2e89a375dd5f8fbd58ce3389551b40d76b49f6d786a5e5635cdf4ec6aeb5338f5a67a76d50c8097e6557b7cb6ae8c9e321c9fa98f51d4807796dd0fafa70c9b737ccaeeda83ddeca7013c34af775b7576cd734e531636dbd3ec675e1955fb7a76195e65b6a3310b04a26eb0a3577866ded36c5b2f9b6b87dd3eafaee99679d7b8ab2cdb5d549e4fb4c71e7583bd45e9ce303c326f3fd1b3aba9cca2ecdcc27d15b21de58d79e7183dd11335e1155e511585d7b51c419927e69de1794ed7cfc26c3cbb2edcdd804020f0ecc11e7fbadedd3ebc30affa65d78cd3ceb2a9faffaa1e936f49bbd605c303f376183e5d98fd720bfbd394ff9757367ddaca1f4dddffff47552faf3bcbab5f55b69f666a76b50381f7b76daf767961f764d7f4fbd975655346bd1bec5cde56edff84d53575e5366ed576cbabce69daa6eefabf3a7f349d89445f16ec5e7805bc72ea9e3df6322bcf29cccaab5b86a7e58de13335dbb37fd8abac9a76025eefceeedc7fdb5d556e3dfab3bc68bc9e262cb767bcaa68aaae03bc262c9baec9a6f3da9a270a637957588dd7dfae71dbfd37bf39c365d772048dbc2bef373b9c9a3e455514f5ebbc9e6b1c4f80173efdfa51d9fd7367d7d83d81c013088c3f1d1088b6489e9517fdb33ca3eb9ccedec37d4dd978555eb3f5f0dcbabdc7b0ebfa7816b2fd8badedeb8b4d5d631e95b7b72babba6aeae78efaf5446d20b05577f0a6bcadbb9e299b9eaddcfed3954f296f8aceacea5797f5aab976d97581f0027861d8643f3bb3f179a668eccfb7b4aff9b701a3f0a2bcadeae1dfaeeb99c232cbb2adfbf506033dc9f0a0bc33bbf68fcaeae9b6ecf9e50f04f61eecad1dde93b78d61975561589dd3563ee5930acfc9bb76f89cd7158dfd399faed9a2295a00afc9db65d7a7ae797eb3cf296aa252784c5e36867b8f677956db2ebb309cd20181ab1bec29ddd9b9f096bc2b7ace663b7f3fa32eeb65190804026d37d85d02784ade933ddb338d67afca1d7555b30d76f3092fc9abae6abaa6eb39b7e80cafb071280cfebba1ed7ebdc1f8a2672010180c76b3077b3b8687e46dd5f8c32d2babb3373fda6521dbbfde601463bba071b8b6f57db4e31d795b53ed6bdae3b48557ef4f13c647123d10c8b22aaf0acfc8fbe7d5ed7d365b788dddb6a728da579979a25ded6b3982bd2bbc22ef7aa2beafedff71acba6677856cbfbf1c2a1b91ad0a22efaac21d4e517996e31535937f2e78f4c57e9afde88b684dbb6c70c8cbce28cac62d7c9e6eead51f94bbaa9e7d2d471029e49d51198d67156d7b9fd7aec642b6afddec6cbbae685fcb118c83bcaa87dd7535cf336ebfeafe53c87639e3f00ec2489b3d653421405e3765dbaf9eb10ccfa75f5b54c8f6a091eee7d71b8caf1bfe6633cabee42410380feb6f030834a20181402010687fbda5a17de2fc96f655c338036844068d3410581c0281c61a4906040281bdafe50842c873f7ba1f565bb7fb8ec6de6c5973987c57d4345157eee669fab3a7bd752bd2f50b201008fc35bd1691467468f7aa9e65bdbcc2ab0bdbfdb3fad7d1693dea5ed8cb7137d78f7695657faca62b4cf7ce1e965dd645d7f9af7eadfb46b4fe6ef5edd63b5bdf36f2355516fef1eab63df6eb19c341e327b23d79a463f54b56915f6f5fb08afc72cf7fbff0ac7a14eea9ebc6ee975df4cc7ed9df7d6cb2271ccbb10af7d90b5fd46f0bab5ef5f399b669ebb669fbf506e3cb4e46fb7a4bfbfa7246df06047e39a3af8140fb4877762d4750fef1ce2bbaba6b67e5de9eea2cab41b7d7b7ad1edf133d4f539ecf555ed9d6754fd565e9d74cfb3aa36d1cb72aeccf18eef56da3c67756e78ebae869a66cdbc22a2a64fb6df7837248f8cbc1b57fbdc1f8aabdf0b4d9da0be3d4adf8a22becc2b37ac6693ac768da6f3b5dcb117c89af2bc3b2f965d9f59f855dd424d2347c36f7b25dfdbea7329a9ef09ad2b771184c5764f0dbb53fa63df5f1ce27eb67163e617645fd6cc6edd98b48231a1cbe333cab1efe67dcdd1396dd2e64bb7adbc33457f8baf09753bfa66d8f7daaf6ff8947e49b29f7a62eab9ef357d9536dcf356ed13ebf72aaf675fe6b1b77384dd9ff7e94fd283bcf310bffbea2f1507edbeea6701a7f73feebdc7af3df472f8fc99e0d086cd7b51c41b9f865d9f384bf2cbb7f96ddef6121db55b7deedfab777715e01bf6a0c9fb26cfe767561b5455121dbdbf946ba765bdf368afab7453dba7acfcee9dcc2b20b0bd91e34d1b1b8174e65565ebbeaa2b0aca6a72a647bf03c89c41fa76ef045d5fe3bfadb1856d7746ed5752d4770478f779dd5194d65d4ec6d8757d4050289c41f9beb5a8e200e1eef6fd7dfe51f9fd5a834f18995919ac428848c2104180c89040024a31100303828188e470312c95c40b8051400035f9674a04e1b4aa44918e4304c21638801c600400801100119a21a070ccf197fda13dca1cfe05367f856a9b4a40edb4dfd00e3dda5f6968130c61524ae65a9907dd40e400cb0dd6164256e6533f35d54d5423dfe9a8177e7289e313ccc891b01044e009c9b4ad12ded6e8f5b136e8d968bf1a17f136c653a653354203f4109b99dc742e152c9b31b0304060098d56b04f0a5a4da365b1bcda7695b2cba5d7518d91a183f78f3e6979ec66a758ef9be4eeaa367088b2c636e8cdfdaa700289331e64258b9e512d93aad5911a2e5c88455f43f2678e675caa03b0d332b2f401b7cdf6673da27072b79c771fa24c7be92f35cb7e212afd5c76b46aaa0db49fcc4e7495ce6857616df8004265ebaa9bef57216b7c94b6cfbadb2e33e5a0d1168263519ad0d84711aed68b0723d0570a3a9bf1568749d8855a14fb9dfff5d2878c9af1af6089d6777649b6fc44a0714c0536b32f7cacaae4d88f7af2bc32f53c4e61a7c8f00e0bd9fd2d56148958e73dc86025c6ead0201782d60806dfa4ecda7a2e09816e68a402a06f6d065b9da7a69baae3ba6e7448904d967b54c0aede38d190da1d9a0dfd0caca21a5d356a3281445c5293c3112f911dae7c07324168828f6be8c200948ea16724a2a0eced8fdf12f517008236b5c496274587e699c9b9031412c714dbfe1ce6285232606258b7b464a8ab3faae67f6ab40b14041ae6465e5a8c6b3379464485174f228355da118afd3b949f5419c1c554f60dc09ddd1e64c9956abfd22ffcf7178cc14ac82aceef8a1179529ba771e513ab7b7aa0a9b5f86e6a4430bf742dd94baadf9e3956ef2e967a950a5a407e597a90a4fa3e5cb322664278ef802e352884a5c539f478dcbc398e62a5b8e100038936451b1b8d17042fb5cfe1ec2cd0fbcf800079bc5e0ab7c05f4580cb353f91b89a105708a54a5c55aa15bf9cd701f14be5bb680f8e2032f70dabc84865577fb01aa9924d47524cf60568def4f2c8780194f125507b22900dd97bce1386824071af7ea5116118fbb8bc8da3007b355a32aee1e5999816c53052fe26daa715aac1d3545fef8a36f8ecd6381997533e9f6148674f07326329d4549910ec94b1b5b927c8049457e5a59a8b4bd3d2d384d11074dba413f2082d4841ad26c2b83f0ec333d3069a170cf0112a0d5d0b693d3f8cf37d97fa441b39c62c6b7c1ed3f94b7f94b58f3476907b33c931bc4c7fba98f5f2f6e7479e95ef5518e73c67b3fd0e1d89fad4e0e88060be40834a06ead7506851e6261cd718516036302e6350614a118b3307b1f3faadbcfe020b6c5a36574a722247ddb53ac9f81e201c2dc0b9d18b77580f1812cd83e7d5a64a9228e15d00744e2dccc200f387081de40b49f70e73c8fa9f7b9e7a830d74b91dbe836db94d1483b15f674e7e2521dc4be7917527147a2512b217433c552d6bf116a845494765c75192b1f1f8443adbc80d6c258090840497640a311625a44af00612038bb04c65bb346e974f73a0c528f0064b87d3d87002cb834aea1dd0cc53f61f449c200d98867a802cf338ddd4e586b6eb570ead15dde894752991362554dcef0613f06d57ae2f955656eb761da6de9e6b8078ecb27258d5d6fdab82142792a0b8659ca649ffe14e8040c4bceca14f12e63768e7ebafc98c822564cebcd0c9c10f9a769c3c44e38f97ce9c563ea73dd76272e27f5c259bddd6348b7a39efb6e99eaede2617cf3040f0bae13638cfabe1b9a3174598a7ce759bf3944cbb81724f5562143d132c66cf8ae29886049bbe1092c8efd3f164b32101f765c69e9730e230542e9ec7ab48fccfb6b4befc6e4e0de8757208a9303e912858cc7ec407a336753323382110d500d314aeb0fcfdda3c4ed47f2dbfa837a67b1f57cd806ed56fc8c6a68e750972ca234a963977fc064f19819dc8f7dc9de38c90e97d04eeb290a3eb8c61d47a95df479d73fe98e861b693fdda1617d5e6c7a4841d1a0b178e5d1ca3295fc154c74835aa461dde6b2a722da5994d50bf4cfbe0c1be9b624497a8dc272d590a2b4d95f45b0518ceb1ca900e3877e2af43f5673bf7c3c418f893d90b8b28421db09ae24a1b12e3b36b5c09c8855f568064305607903b118481148d8b157cf5ebdce1eec2d796e20c229020c11ec29a7678e77b3e299e69d44df361ef58f2e8f78ddcc36b750d38909ff581546723e39144137d8db9a6c3860076e525e3eee2d9b5a28aeaeb4ec8cd7406dcc04db0dc29e1393413ee0149ad1d2a4703a2b55e79d6beefb9a8fe7e194fab047d380252ca1ba5cdda23b24d0af8d1123c9f299c1a0816b62e405520f33313bdf78d0053fc8568602c9e1392616dafdbbc4376b42d3f7dc4c14da36cd72d0b4af6565643e156f8095d6f6c6470e22c3ca02b8672c13eed133dcdb4762a5ea3b0610e951f9a13d3b1692097a286cca75efa42ecb2bd1af8d55478a917928a3a5842f460fd9aaa72b6c9347d7e65ab87703f4d81913403df96ecf73231b73648dd8f9e4972e1b951813c9706ad0282f1fab85d05e94ef452871a5a5407d5ac0e34b3744ce10903f8d656f8060ca074440843ed5ff1697cc156dc07568ccd6470fed8a5c37965c5d321afbcd8c865271d644f318fa9ca18b46b6b72a4900d3c892d65c135bab9f21c30f1722825592cab74fc0fc6431349efd87f6eba010b99667f60717c7b4f957f1c5e744c09e6f592bd0f16584b6d198dc07506e6b5938fcd7d584c4aacea42d90e11fdece1edc4f9e311512e9ec37d9b52d23a1ded7276a76421345c6739059f73769b534db649b1c65c0b7434ca85bf207144fe754ce4cf8599f143f52aac61e6fff67c076ca6504d6f582694101f8127b7bd41772e384d202943af1e84b7bd7696688735157fdfe79f13a502d09f353091f0d2a0abfb1307102e1f2bd2f0dfcff4891be42af8b4a6ae017229f69275097648090d68e52d04a0b60529a02034ca601b897fcc99f245c84211d5b61f9ba052ea13f82171906a715f2b8b1f60605e05b1f0cfb8d9ecdef923e2a6578309eee093a5a6db1b1d76bc32ecc6a6d2c5d4acaba384d9382306ed1c91b9d32e7c4dd54abcdcc39acd82d44c448d19065ad15a8ddb6111b89d4c1309514a2022aa35b9321b26fe9474465d27d8c2f57079844f2c10452412a979668b2220003fc221c75a222620465f8a9fa48d59414547d472603764410c40e54f5903f179323872395a05c211c91430c8a5297dce05a1dbea84325264a88d0b062171b0cb37f6ae4d470f9478d7e0fe28d6fca4e79a663e9399f0d7ad885a6c32280f629831992836a8cb24f116bf50295bd0bb6dd9f23425e181f361d225d808f79b57bdd9f98e96006aad990b59da01b7fc26fb3ff73fc38fbb67bb8cde52a86c7966063db5f650c99c993cae5b76525bb8ef8f3ad512faa3bf66f7a7235a8cef40c01dd07568e3733d419d019ad9b2cb38c72f683245d65ad60cefa7b58344bdfab0e08fd917d96fe37d44393e1a2214f7f2b695c01f672f321c3832d5df9b52f66ce3917ff9ff2144c146bffd9873ce4fac7b46c90acf43feefc24336423ec3371f1b00c52777148f44617b3d5fa12147d630aa74e3350119082ed83d1812590f3961f977625d444267c8580b13a683028830c09e6c13ec014ba77c74ded363e188abbc932ccd256c911126666689065735d00d0b2097a07c86dbf68b5a7965fea9a9570b2e9bf56aacaa203c3f6e13c064386f25ae5008c57ef8e7e0ef4dbbdd501620a9f9c46a45a9fed230809a7f074f9088079a5c26256b66cba5170a70e6c007c408f5744086378c0b08f2275a5ad7d4bec2f29cea91b1d698fa9e5ad359abec83c0ce66696dc4d0f9214f1f6ecad754ab5ef3a3810a71c412f88b90e4f262d87eb4a40d0cd1a1171809f1ea5393ebe908432fc8b19f2c23c36de5f79f45f0e358060bf58e3bc28e99f4025f3b69f3c7519508c10125f4f78a070fce8536c9d95bad03d90092da0325d5dff929aaa1a59abc9e4eb21ee0d38fee7e60def782244576719a89a6450c0e13ed039b7d6fb93aac208785d5999d9dbca4d8089694f71a9cf33b485cc601bc8ea9fb764d97ab1c12e2092bdf718abc50204f5bb9faa9e81aa42b07057c92c40260bfc71ddfaa88c60cf714ed0e83e45efd9a3e679414b07e9566598c0f2aa006a7cdc83347fbef3e9fc074a822436e1e50064d85bf37d3a0b19c9345258d020b4713b1354b2b9048114b3d795386b3041147dcfe75d20ff7ad3a2d5c00c345d94f8fba2679f039dc18dd516f8c8f549b230785e096619cddf55c8a31ad1c61f251690577a18451aeef3f8779f3429f5a1c194069461348051bba7b7342e372044ca487fa141adfb547d810845d2cf597078bbb4a03efdc724058c8d70662cfff4b09d48c6ce2e4947cdeb3d1a229320937cd3f5dbddb87aea94a61c7ab386a067a708cbecd511363d023c8fc0a089cd542eefba9ae7a33086fbdb1dfcd0b826afe80678459e6fbcda93aaf361a0758e41de87024325f59b5c9da01610b085e2c2238465fe1e5b44cca2e6da8dc2173f2b35f4e851e9f1cedef76640774848bf9052f7917825baad73c0ee661a2e823d944214a107256acf1fcfbd7c1626aa77624d6242b29cbdd59aecb1b62ae301af08bae8df8356a984c9b70b0e64bf162e0fa356b62c6cc22ef2cdfab1623fc04adc804908024615149a7cbfb9d96b8fc68b3f552fd0231cd833bc802fc2c3ab678093b25f71e1a38ee8a41a435012753ae9d4c2e0100638ac0728c82dbc1bcf1db03f63ec3139a0c6b27e262436c7f9408abdbe4e66aeafd9eff9178a27d5531a21d63a47d8f494f8f30b22a5bbbb1944261aa5aebbb8b0d7e7b1e826fc2ea9984ed777734510a0c854f9bbb826affb9d24ca0b2b9d290f3e3126a9cbb125c6e42b87c8e08a1acda51290fafd0c8fd581313b61ac7df7b2d8222cdcdf216779009551b59e49ccb2b630ac14e8fb2fd9ef885512faa012396872386a44487ffd09e228ad171295fb5aca4524b37591b54eb8a2f323cb70253ea1748b9efb323910262b83b595831f14806c1555e269413e74cdda13bb0e890c14e476ac9c940c1f711a35624909bdf75c517da15a6160e4c2f96957a6acf997c46c4e4b1ce89b012bc5094600a752b76a26c615084be5a6cc0817577aec6094ba367b9c0c767ecbedffdd931fd8b6ece7792520ba55ec33f17e00424224528efad54d028dfc8fbb98c16843b5ed3d11e227d9c284317aec2d6ffb8beba29cbcdc588f65399b6f3a4a9df66614f5ae1356a9013148e3d7440fe330aa402a3362a75028b0a4028c76da75913b3737aa350b11e065179619c1a49ffbaff40866eca3f220e9658c066eed50d6c8437d76451aaabf2748d2ca90965e24e5c38c33d97920122a9703b7bc238e4ba9d212fbb034534e1381245a42b6dee5e5ba0a953fb2a237e03106330c613afc1e35c6e3c5b2b024727d66a9af8f19dc8e39a8c84ff84f3845f40263230d5eb13878ce401aec5063c353e0fe40c22f0364ec92e47d965ad0c5a591ba04a1f071a80c969d218b6f7f8070687356f1f4de8cc64a5fb88af38165cc20eafeaa916872dc54b706313132a23876afb0486cbdcad4edfe9cc4aed272ad0cc54c5a2592e3c828c0eeddb35599053e8eb4c134544b9b380db7841d241d1f64fc3d3ab53e85076e0c2061e42e50ec618b99e54958f9dd90f3544e6cd76d7b864b4ee26c4b67091a807afc09b8391e76f3dd0f17cf82b3bcfbd335ee1b9319d4183eb9f673b1c67a71fff44f19b0374204cbe7c29a65a30957690b0a4cce3851f1931d2dd618144683a4e4f426a1638c4857a4dd94d76dec88e762588b7c02a46ac7868fa7eba68ebada105df3ba1d7c9f644428c38d16e26a13abdf792289e74cffc76255eb43da71a59aeadae16f9398b27c735ae469fd1acab97cab924314e383431d980efc9c383eb48eb4d2de03821179c26716631d38bf49094e72b07d4a333fa7a6a819bb2ba612677ae49da74be29e5c10770b0a55ab3f1882e797641bc23e02ec2dea27771d2caf5d3dae3476fae1754456917c93253439ef2da6ea87b08ce32abb1c34cc8b02a6b00d4beded3d0ab2ff8c4cdee56ada61c0cb9bb02b3128c50550006aa2f3f17adf0e74379aadba760c277ae048f9a1dfd18a0fc1acfd94dc6c23b57261137844f2e45603a8b320e8e7a7dae269e9c15e4360fbc353cc7cf22020883e7bf8f4f0069829aaa2e12aef3f72c18838e96b498248dd0c5de450b26ca054291d9f57e167c5c3871eb63e6db91d8b213224ad1f263f4aa5ba094705cec0d81a1b3e30c5c02b453cdd1972459f22ec2a743697ff8c15b8cc5ca0286c401f84510e311edd14ee3fb9872009c5e48547afaef122098f586bd71bf86fccf85843d7ef17c6ce59a83633131fc042973db618b17ffa1b92c57cc7c61dd756f654b48d093c71c7844c5f2d986fcb488e2e701a29c74756900dd79610504e5123cd005d0d140fea7af65143f483e699e0479de1e120505a71f8b3dcb00a83d68b501b0381ece6704b81ed1199bb62fa221de8c61fdc8bc55b1dbbf8d4e27eb460d15e3d00fa14472a757898e60e1a4a4035d0637a59113d916e394fbb00c941131a9403259d0a534288b8f664da43248ac62ce61e1bd96534460316bfe6bef210d1e54c468f011388d7e358e2c18bb818269bb7863d90013b3818a8ccb00528778041ab74b5caac791bc7418ddbb00654006bc49b9e0393ecd1b0bc1c361ff00406f107b4a59c295e9c306ac9ed08f82b832334f63e94b2294d5e614c54e38b69dc6aa915466c4013b79764aced1a6bf1a47a0c1dd705d7a40c2a5e64f4a0161595e1f1bc8107ad350edab3152d3b97d520cccb6b07ad798d7a41c791156610e04307edd4c406207ff236f6ee6f15feb1a6dc558c0e6e0535f397fa2403d8f00fe87fb2e8be05b0e502b66d0e93c15d9b14c2e36d5c4b1825aca44bef3201f8288a4418540eb492c24496a14aad30c0af00336880aae24935e644653b170c53f4c84100ce18316fcb4896bd07fd66c4bc732c444bde8368a4ec77b2d7959e3d7539a60999d0dbd129853353dcf321df5e5ce55de10cde1ff2577e87bc8d08e20a142208475b8a43b2a60ae9a10f663d84d92e7dddbfd1b943e8f57e8054f8176357d2d7725c7d2d6b069116da2eec7d02bcf2fc136962e08b688ea57160d29ffc853a9584a64805d82b2b1c36a7362d969dbb412ed94a0595b11981a3191ccfaa25631e19cd73a8db4d078cfcfc966084e3404407613476db459449beaed9cbfee81e282ffab32be467344765e968a25611f35f0c12fab8881c748deb9d558b5fc261154ebffbe746467b988d3a06b8512f66d8347366e8145738b9a340b7037a24c9b4804b377bcc6430806ea9905656bf88311d2e8d0a9773d5fe986f89a4486e1e491b86b85b3b8e2b30260b233fc5652bb5b53b90fda25d1862c51a6eba56df9405a925e150a2af9a855eb77b5fa1e6623300eb16cc174e24fd66ed7308ace581a2582899cd6da7d39b52291f8ed0a3dda490320ef47d384faaadd62049f95e75c039809e75035defe8a09bddf6efb518cda9b9842af0df6100ab85b35a6f90c6a106c0ee9383b22773d1b74e935c5ce115e94118514a7fbd93e218bacf64a2e59a520d5c8ba95b75ca44666d16770d632c12b24c9435a02fa57ea07402de6c702d8a2670b10ebac9d68c7d94e6353fe725acbc001887fc32d22d9aa2edd3929680f912d80297041431be067c74491eb831ac4ebe6b06d7652066815fa549fe3090263566bb05f15c995395d539f5f24ce021e4d2c1dbc98043d0520464ef71aa1af43476269af7af19464c637bb421ef8be7e36c2f9cbab6bd2ac98bb3ab650708f4665f669586ac7c0291364d2088625adf0851a212679a07b1e7faf8f3aaa611f413fb9c6b4d32ca9c9e6e2930e6de1025855122e300b939e6050a7ecc80810542bb18e6d187079df968274fba8098be3441147b6fa6fd0234f603b1cc56d41f823f0fe91204e5b9cc23f17cffe3dfd7ac4de7a9495fb6a02c477f557f076971ed2487600b1f5a33d0e7cf38fc79a65c4290fee7e4456baf7dcfa7c7d003161bbf518c8db453e930dbd64685acb5573abe6fab8d8c7a5c42b3a596b7b46d243ebd2b9cb982e918caa6bd86752377bef785027e75510dbd7dbcb304831f7febca81aaf9bc4052ea83f6af872dc2023fbc92992361bbddb37164f27fdae34a4e43f6996fd4136c076e2ca07bcf6c120704ddfc41e7cbac7b7a5ceb3b9e7f656e127814a47b64c6be664d0dca92834fef9035881e7b20ff73d8abd3ccd017b531f99ba86c3be00b8ae009ba06d4de4b5d1e82e4a07de073a9ef25f4bee462f1a89b379e68cdcb6b658f7c86e8fee7859f17d4860419ff862abb070f716cf10ce0980e1cf160d9ea2f3c1a1e20013f754e13f79c3167b31998cbb392dfc2627a03c677a4a42ed48434fdf53f5e9dc59031be637ff1b9e447aeb45c83a64cc1c861ca84e5362667abddc58a0710c4702dc487a429cf80309ee399ea1cc2983976918dcd254f3fdaab71d921c0e0e0dd466501df26ce5fd2da0f0679db172119d3fe250df2e05e7f81f1e2a4a5cf2717972c930710476309390ba4a72301e34594a9a4e296989af4c525ed2b2956bd2b0fad981ccc84ca99dfd038df7900c98297798cf9f6a376f36495043d138fd553e86137827c926b6079ea035e7699693e0e3a1a670f549185d8d33ccb891697379f994ee1c50f37582b2ccc708eaa0fadd3ba17cac1ae3d2ed46e9e64358dd59e702e19f84c35ef301097b8863a2a9cc8bd990f98fe0c024dec5041f0a5211960e0dc624a3a339b0f966af522713bdf90107ebf89f4f2168c876cf55335870a7d86e65d98a2e5bfa1cca0c6fdaf32cb8d50c8ae2e39603f1a5ea4ec653be3edc30e7959d865c5f8e93725c852fb343198d7619633ed0928e922c5f6c1eeaddeccdcfd75048dc03316e5787fd7c6758be8074df2845ecde87f615ec2b548a93e0fc3607612aff76c4714fbb080a6c65b5d27ff4d047e33ac81e419bdb37a5652ecad88d5690b2e2c45d47bcace8a69f893ba9e652a61b3b5a73067ddee7ba22e76d6be0cf96f6f9cdf449a1832b9096bc80047945a318a6e79c6fa33a3e3e6c81d71258b6bf1dd5fa8e1fb8edc5fa0817f8539114e568ce7b4f4449f5b3210e804822ade0e16c5b6cf0b201c7211b88f09672bfc26698165a1cb634b9662fb4a510ef64385ff30293dd93c6acfc7bac310f3bd0d71998691b2f18fa2dcb34e50dac2f5eb3c314bdb7f62d382de660621b8d1e22d02ddc4be9d5a869da37f2ecda4f9b4fbe338d767a014e768f97061a2be877f2a0eac7d7f3e8006fc67d4067e9b55bdf25fc2eb2ae6549b2d8e3030e8d7d4e8fffe5047886ec018476f262f3c2b60042c8f299dffdd54f1d0ebc17f0efe32ce7934ffc57bcb02f0cc99ad63fa1d43ae001c8ddc4a3e33d2d8aa7a4beb5a2d17ff3bc6d763043f50a43dcf5b991d144a49376b204066d89ec2c176e455103e5eeeb913fe177487addc147fde91f63a14a23b30156207908da1e98fedef323e33d0a90698883f8180357b480e728785c53ffe30ce335391d711acde6c69efd1da473fd62ecfafd6b857f3ab1d33d612d76412196d829be4883e06ee3a1bb2fd034f63d5d6f0b4d38de26ca3dfecd475ad63b167d3ce502a14d04249be4c6e4d30d76e142a2a1791d06eed68e27bd548449f3684e75046313f7b275700105316041b8d4ff8a4402fbfdb228e03db2fc6c69c3b084ddaf7e2f2cbdfee260a3279f2909c1820b20e116e3646c03edc59daf276931ef3761fd2adefb9758a755124b09e2c7e7b25673d010e771d624989852ff23c6d9fb61a752114bf8d44b026545437ade46f87e2f54f05976a5360e4377494014cde35fb9f49525b7a1adc4dcd82a25d844ff007177b3392d6a801d17295ff8fde011f0c62e8f7a1484c14a1b2695c89ec237cb97d24c14d078d787e0517fd785805b3fc88e44f5be56635b1241c886031bfbb4649226704b33db289efebbdb884147ae983bea44db721c3a7b533563a56ac8dcbefc3e9f7ea7e5074b701a6f1e2e28c3855b603046e3d82eacc58761ba3717d35229ee06a874ff56eda1afc18445299f96b130ba7ce01b4ef55e573fd1bd4d9a9315a67eb3c9b36e367d7c08a251f6f2ed9a36dd78f9e8880dbd19da60061a2f1de25cd2239b10de82be2f090c164ae585e61c4e2b9906939a65a5403a9aecf1d00fdd24415790d851107309766a477ac64568e68228531533ac5e4d1344d789764a4ddb61053aa303ab4c73189680fdaba355ceacd7f24c0da1e34791a64ef8e47007c693640057c10d79ad6ca28a7b8a0a53a6afe455d8057285b3ff78c38c06a1a07e926baba927f13725c39359ca67f22807743081de97b867f9c37dc77cde8e04464070b00bf63a6c6faa3c5af75f9517e9b6074779ab0b8d245b2337dfccbb076500091e87543917f9381bd2e09ab7edb34642d95835fd8dcfdd75077ce1586888b203cc20730c2a30c7e8c16c1b1e9eecd621f7c97de9d6329bad16001ca6d404d4191f743f3f44bc7bb6b1e019496f87d3935d8a3da38b85b41c2b336908f7697394f52b790bf3219e18e6c79cecf1e8dde93e73487753ec9530aa691ad67c6a916783490c9084bf4df789477bf3491df69fe89fd98692039ee35976fabcca126bc86abbf3fbb91062deced8b560abd0de233546e54f5771ee1568f335a5185f5588e6443813a985265e1f08dcbbfde490c5630f243fe05fc833ce577d37dfb748383afeb3ad53e6a224bb7e5ae5291eb014a2606a8ff5750a7c704925672f012bb027e42c7f1295097a3253df3e90217560cc62d04dc41401e8503d7c2b4f49d202c4062100b2086b3aff23dcc16fb81e213e6255a4b57366cd9b053e2a7fe203904b4f81b0bfa92d2b14576932c1b2defb6bb4cf94438c18157029b50c820e4d2f5d91482b375e1646b88cc7c2930664e338f25e832a6fee260666a39ac0902062325522fc09169752a46984b13a5bc3bc42e2bebc74605314f3d09d0455c2c8536400f216edc5390d10e983d01b677521f5cd124b3ecc53b4bf3e8611582fb1de8115ce9954140c2382fc03cc2685ec86d12b7c28aaab5c77b3a09f7a20571989bee34cc8247da2b14c0e0f48964595d8765237c40e50996dcf52834f5d250518b84f92475fe0e528897bb7b7a31d49e875fa7771567b84d1e3cddc1857ebbf4b95be0006988d721a5a258c32888a52d0c157bf9df9f39c8bad1e76015b85995c82324652bc1a91e09d18b9d7c346a9d63720aba563b0a469bfa39de5829f94a481df13de00d3be8f22d23117238c041164354511102683ea2449632337affe38c80523919171589c43547d12cbc438509dd2e8f36bf20112305301f29ce47fc5190faf10a9f7c8e164288d1685cca2d7bd94458a90d945a254ced0ec601daa5ff9feaaf3b73a8ac53ae7534c62ef1881860710104336461b0a4a11b326e6a22a1f868754c6d222079b60e8a1b4e93e77169983e73f0dfe5c483e847130828c21387a5204f07f14aa80d4c4e08e680693d658152e71a07abd1d6f4c032f9eade85c03ea8a83ae3902df1065744a41b767f2fc902355a24762da6a623a21ab741582cb4e8811a949c535b8a9e97de440e3a801b4ddcf5990622e86d688bcda7654a5ab3ffe34e8a49e40697a5f1ea0c7a6bd87cc4aac1cb52a1a7bf647d0f523aaa19b98f6731b9d1a01ebe411eac7aa29ab3235523cdf2f4473bc88055ef188a7882414328ab8b201a6f78c56b5abec00ab97092e05e50307b2b45cf4be48aecad2fabb38e229fed9244b35790cdb84eb7db5601c299ea89e6d9a3c353bd2059ae2b46b3d548b50f3425462caed7122da376fdfeca08cb69512397778b5a87bbd225b52c93c463599d6f752982992eca67b5abc7b79638c13cab24b054d7e453b1d86cb655839829d47fa54f7e06b7b283fcda6abc5027298b59991916ad149f29923bd2afde4c973a0afedb48166d51b29bed72512d7f7063b02d5ada7c6713069b55d7166ced693566a8c50fde8960c13eca0beda998a6b735840be7a4b0803e3594fa5c44a2d8b6c585eb5844919ff5c264665c413cdb65ca7b5a28403ebb623233d8a0c6ad72e124325c309fdd529d1c69283e8eb9e213182bacef5e591903382b17c75c992a4c0190088af287c87932e5d0b8c990a16cc9ae81d5a2a8ce2f6d44067b1739de651b036430e88d4a7cd8225804dc4aadb1bee8c36a7e740701ee32ebb8b4af44fab7494344b51673b6480b72577cd87fb9d20f55511de64effb66b21206018f96098a33b2439263b411458a7d6e54ef5167cd9606ee331cc200bbec7f8112afd6799dd1835c33c7e6565870e92af98718a9c19c35d0992f1d274cff80648b1b6d65f3b72b83101097de2c6f91716400a0c7289d78ce94a66c0eca085c04c9a170e46aac6477a48092f6943f36c6e97f2fe8b6900dcc9e18f325a19dae04d0aee75382aff251c9567621a023eebf803cfd5762134732f10ab5db1e7ebb079668edcb62578f42f63efaae8d1125f28f6ed4919034904f08d0080e8d998bb0759a6b9ba07f1cd2dedafe481cf052ea574b7701fde67a7728d90990c2b5d3e0318ee50177dfd0cfb6cfd91d374b4e75dcbbebfb92b2c70f4ce1bab5053db286b7ee3c9fa8ce2d4317f921f8d4ff0c41bbf664797ac247d9658d37e0901302c1ff31c55e4e15c28bfe64e718c9a5cbf2f78c8be9d30cbd18bc19080fb15c0e0919582b8327f6b258ab3ecb80ca29e043ec53c06422ba3752a363b38adbd29fae1ea3f9ce9251803fba76556065f45d3d239d6c5c6dec333f0eddea711da9e71fb8e891962d9aff22ebe3ca2a19401807ccf0e637d92254b7c128fe1fe17d11ba801fc4c7ca808c1189d355fbfc3f5534d93cac964a01ddf2d1ff7acd07f33d40350be7c644086919cf797aab1f0fdecdd0da9165be634615309ddb1257a576e5b97bcfe5ff4bf8aa206536dae95e33adf3f824438350ff12188d21f64b685ea8f4d94e664f6c90aa8f649153b16419d525d00257cb136ed9273f467f37b4e60213a3e0a347e503367f8bc1598ef7a911656dbd185636023cd391dee6b14c5a8d820b6103c38d32bbab38129adc9481a291d37ed97cc81cade7aa8e009606422361ba4c76f7f65dbdee7d2ecd1e64ca25a08ca47acc0202ad1a8af41b330d4da0da0305188415dbbf6701083908967fe3bf3eeb3a70dd5d637d705893a282cdd5a6a38a9bc95f809216d4ad844bf9d92a1dc4d35e3aa7f931365272d1f415dd65360823b8da1072633a9bfd6d0a005b5d1f765e74449213cb27e418abefdd3a4d15f988294265a599b32d589a02c4f1a05eaa850289944ea974a0d2d53311cd229e27fc42ae53fcd22facaa513c4eb74e897ba5fc2de32151b2c6451d52919f53f390bfd4bd328fec2a65196b69ba89b1c96b7b70adc4ea20a1761a5a3dc52179ed8d156b5d30f04efaae4e97bcd7bd7656fabf085533e02a42f7aaa7d04d53f0902785d05945625f0af32b84007632b84b429614e29a4500ba52a8687a8a16a72f8891eae2c88c115915e49cc4c13092e8aaa54f144591459173f268c33943168a4918a36662f8ea4a8a344f278a03eca2f903f28e44a1219a246122692f15492e6322942278f29949a2ae57ba5729856064d2c69a865ae5c12925eca08e6a514538c643e493327443330aa49816c26d14d6209a78cca797802a3ed279e6d8b0c950d5bbc3846432e71402e5e9414046a57291bb8f92c172af76f8217d8fac31ad22b3ab6d626dfc24eb283b7914edce079b96229f36471f48d0b3d99926a1a74a65e241c43ee030ee4193f6c85435df4c1532bc4038bfc98530fffcdb968478d09449f39de8fdf89b547c5fe23694ff6191d6bd8859d3043030ec0a3345c803c801d98ebcb95e91b7abb935b841ae14e5e2b6f51cb1658fa9866e99ead14912a7bd760856e87a1cd7ad48cfcf1fb16c5d8ca4ad2dc43a451034f574fc8826b3450756be50a753058f3ac96faf5d1ed565ded45e1e43c3e36d8cfe3bf58d00db2ba4d43939fedb8ed29bb538e75149f5dddfaf711c7372db7ef1d99035a16b429eeb0e3257c805c59364d73549d4f78b2abd90bbfc9716598dcaeb64b96ae244dcc6e4d63182bd024c7cd30298349e8b25d7557a3f128fdb5809246998eea3211f888f2a7fcfeb9d64cce079246b28a642536b5586bdc93538e84c3cc1fd0eeec75a12f4b4fd9ee3c0f8fcdf965f5c59b9393e7ba580358d186ecd9611ae02cccc580c1b0fcd0b330d4c1377d76f72f9ef768dfb441954868dba59f93f0c1b0540a8b57ecf68f3bd3f5b6c02bd372647be040ccf6bbd080a52a36305f8e0794b435d9532e5aef2121403bc90883e147a59f8f348a16c7c4f68d23ad3d03fa48e5141949a02bce8f1e116cc6f6b3864d2209fd8c302a4bd510bf197172333e9109ebbbf9a5f13d0633f11f00a164395b03f50fa11ed0a5f47a80cfc39da82d484bded8aa330eb30ef7d92163990030d15cbf6ff62cdf8f56c92cdb8993291a78f34b95ba55ac734e9e0548421db5b20a5f87bb77ae9bb36ac0a13bef3e8fa8911a7bd4625ec551d4ef6524a0b7c65030b42e3df472612f6a00c5c1dd9f3017048036ef3e9a740230941ecb0283fa4df3da59635ac19cb0542f9f1be4d9431cc686b5370d58ca7b0196d7a6f66c12fa71cc3172efc48b5f3644beb226527cdc2eedc9001129b894871ca20734980feedd35b718db4dfbe8ba42f309365afd37301dbb75b5e92666678d181051906ce93fcc4224ea6554d1a4c123faae8d83b35985c27ed54a688c070946088802b9221db3fc75ce2b13959e6910dc345b0a1cecab152bd39f6ae7ee19cd43d7861978d95cb3a494d9499548e3432d8a6ef3a8f3496c608668fd3e7507cc91594379ee3d2034f64537374c2e97f5a779581f2251346d7239ded19e9bf018ea4312c55e24e46c10f14b1d8e4609241a5fdc1da5e1205c0a4f8f2fc43c630216e3dea0885b12bd742fd669e733e14a869360654bd74411da81697ee0560bcdebf06befd8b62db33f02dbd22af7a42b0be029fe0fe18de44454ff3e846cacadcbfbeb2d61f76c32a515a4c68fc53a8684327e29409e7fcda3842154bc6e78b3c4c67c37fe614abf77e34e9b6af75c3f7ece73a1ba9c4307067a4fd29142512a5aed258f00151430f38f205acd0ea5ba4ba40d5c7066a396020c34610c5c0fe184cf912dfe275405393648a682ec833cb7692a51206b198c02bc9ff7abe7dcc5433b75395162ffde830ad787d114506dc1dc99dd3f6289680a06ef187c8f6e68b58b91b953a140f39279414274ab7dec09ea053b1f81579e7ee4528a1d0b1725d1c1f870775190a6e298881e4f381f552ec0a321e9635b4afae37bfb1c336c38014922a458faf1c4e4cfdd49b72587e4baf857b87676fa99632c9f6cd4e1db2d070513322944239704f6de9b6b6d99946de4af94361389ad44b9906262b9a0c23fe5b18c4bfe9ce8aa64a5f43f79488b67b166c8d45d3d8f03a68f183790b9c83f00df841ee147c7d9af20590e8e77ff513ce0d62188daf8c133c145a4885929f511b65e7278fc65814d38524a55d6f3f462f0605fcbd7a03e8bcd7e7dc41760e09f79801071622dafbd9184cf8bb4da42487b7818c787b270f6fd63af367814b49bef9051bb243a27aacad0cb33bbfa605f7cf52e82b274ec09d167645752996b1bd01729d00c9295a22a7a9e4806ef78db6d61306103da3cbc7d726d0ea0c2742c96a3508b31af540449865609f5b019db360ea1934e3979563a517cf17f848cea42d069cd0dbd54ea199ff9d21e8e7270c3833e1c0557a2db32beddff1bd72f1adbfde474b47ba7cca0931451b5a33ea46b7f8ab9b0ca216f4a44d4c85d913ab19522bb971e5eca813806b847e6b122d1b2e4f5768c19b02bffcd20bca4ea2966322007f7901c1686d0ae72e1b92f8fccc97667dc06659ba40e3f3517a5f71209ca25482624c78d73e399aeba71930fd66680e139a9d81a310586842641673ce17b9428e7f3a149f4b56403fb41775cb8097cb28e4a0a1ecbbf31c80a6c323e624bf9fc2f47480cae63a312cc7b0929168000d2d947230d96d1e045dc1569895642c1f74b15c391b307f668a222be216a29adbefa9322e04389a44afafde9752841306f6a77593fd35289156f2819725a2ec7001e5f49156705dbb3ee7cca998e499d1c8f98cd2ea14304ae7a0f3f87651e1bb6221cd5b7e3c336608100c5ce964a14526963392fe57dd026e7be30a0e05cd4e3b749c7c8cd5844508996ed7127a3c73f2176e84fd235bac00ba30dc50154e990e7433ca990bf662452e0495f6a59d4d13f20ff32ecbae6b0660b52f20bacd3cba03a043ba8df3cccfb3799662b8ad321a4261812b562a0470df0095f51da31153318131876b104349cb1f16bec1562bd5bb0757433cbd199791e9d03af61c2972d62db14a2bc5764d61336ba1b6a2f5014f7d5aaf0084191a7258418538c91b89bd0d7bb11ae69bfbd5fa552206e84863307b8e6c825560eb59815727626f89f44f0b9360ac11a25e9130b76aacb1b14c19d18e11b4f4a294f745b7e2515c688e6153ca0cc007a2c164a8b2f748099343e670fae20d775328d891193c00e3c0ceab56358e78eac81028ab0afc9634fc798835b8762ef56b3397889a170232630a4dc97e8acb4db1d79074de7757905dd8e0b027f35087508620805ebc818a067d9b9b2486c936c8dcaaa93cd71dcc04e0c5a071421900326cd0aa86cb01144b4636068f251978ea9226cb7b23c45613a42c9bf8703818d017347e33df3dabecdf8513aa5a9375af35369ec5a206ef211e67cdc70223c6cd16aae60ee04ac08220fa078fb4acee105adb4d5f927648f65ec70c53c146e0550c4177eda36807753113e6491fb5d884e5ac013a813802fea73e5ca25e2bc52ffb9c49dd74608c5e8d244593514a17efffd059204e4840e3351f2cbe7eb598e847a21841b9368a887a68fd3f09405f5310161e0d70b3ae8d73b0aef67bec751dd32ab6aa24b1b1b2b3f72f47c52cb349396a58397ab3beb8ea821644b404c09bfd4c4f21b14de8ef715f320f27d3f299e303520ec32416144653e4ed4c1e7a42fc27a0db29f9d73fdb6e1247e02bbaffd2cd65f1f6bf0bab9cee101b19cc6f027bc49dcf489fb03cd9c73a6ebb62037eced9ff21bdad1f078f4b9dce35f45df677572d6bb5146ecdb86ed871730dfb934d381262a923a97284b6759317318987f96eadd88636bfa4f898e55834e0dbb90dbefe5fac5211c799ff601ad9019bc4c6fa55b55d06672d61f8cd51c95e9dd5155f6fbf59d5cbfa2d828094ff4f191a58e8c4ce7dc79aaafa9b1c0d38177719caae5d0abc3f43eb5cfbfee2bc30fdc9c91a8faa6bb3a73cd5de473959e739ac1d7619f5aaacf7ffa591473f9a33519b1e730c9cb625c010c241b8ec50597661997da3cec949ecc6bfbcd51d2ca65cdf2ba7f7f3b107e842efc87e1573675a98290f4cd8a9859167c6c1b78764ff6c4691b24b63e5d895f5a5b1a28d5bbc92a8a2b1f880e38886215dd3094894b751920bbc4a94734887b4b8ccc5d0cdaf455e6b9175e027c3eb104859d4b7a1cc85fd1540e9b1bee3f14fba129fe9de2f516572efb34d5bfdc18717fda1b49e9fdd04ed49b89d851877603f5d39e1d23aa4d0a3af0892b5f203d136977da0880bce32652d6a5c4540ca247d77e0d1d74f69a170e0a9d35f06f0d63cfa72abbc8c861cf719ea50702f718936bdd8a3049f59bf575e149abb6befca4ae0cde761d7365ab23b79fa33a25463edfef1e99523ca5873b39c1c424e5a7806252243dcb4629294ba03e4b14e3ac74cc5548a43d321bd0ed161a0a5bd7f3bf1a5fe49ce3373874c98ba0723db452c4e2399e6c47364e58b86867d867e1e3482432245c0d45fb4597edfa0582d53e367455146d77432dc5473f4a8f48aa03523a5bbbc72731f112916109f7b1c241a97c3de26390fbb96f2b5b8a5c017e5130e2888c3479995ff2c803674d2fc7c973d80b70abee22c6f91d839397a54d0a9a6c013396cf6f173e288fcc75bfeed9b7184fa4aff38583641c710916d82fd057b5268defa7bf4eddd76c6633260ca3d8a9b5a6b5094f6c95479fb5e434545c1e016dec582577e5e7f457593fdb0f757c8a9ed3ad6fbb7c73b316e7fec50c74976cfe6cf394ecd3d88913195762aba93a2bcbd94ee136f68cca36e5e02207031f11bc71a8ecd1129a2bf17a05792f78408d5ffbabe523919895ac3c504e2f77e2f0f7bd74b7fddc72ef3eba3f5cf568ee64cb7ee602d7c7c513719f71d68b48af875fd8bc44e53f6b412ec77be3ee6a5886f9e7a7361769a5349c21bba4c69ce1a4527857ae85293c4af13ff83731507197100af3dd9db9f2b8cfe7b0db8201404cb58524b112aeea6f01bf82919c1c097a007fd4893605e27e065ffa392738f0a5da8f1db57535874ed5306651784034780c00de7538cd3f4edf7fff32713926f0158c08a205f9aacd1854fed6bacdcc78ada3f967780db20b3f26e94e1151a833486b18a58c363a2742809f6ab887f06c0115b34c701f2e1263a1cfd6ca0bfaef25ee58f9c67765c53961ea312d2625c943a48831d726d5db06c4efa0894f90f57f1aab0644d8ced06377698505f153b8bf06224f59ae5a9dfe6351a301cf71b1be4f124752f6b8b2790ca144000bfd8e8d9ee84eeaa67b6a3d2010c2423af45bd46ca098077dd1d43d297ab97246fa5675f84458c9fc47c162c09b2777b8ddd8f673c6b25877a8fb3ceda26f763431a8d6e90b7c1cf7e2e507ba4e84c1616bc0948e6d386e46cfbb5e6cbcaf71c9892129d40db243d62fee42e217fcfb5762c47718ff2b5cf8ca327474d10cc4e9b45b76dfe9c7ad209cf67319162fe40e69bcc0a5b953d4fd23abd43c427a84ec7c87972813536aea1a30c846c8471a35fa5b833f1f9619d8df453a1636f76363c3d23ed925a1a690ab328fb869d0ecef22e421a3275f304f01c3ccb2cf36532301d602138c1e648ecd36e5ef0c93bdadb92e3ee52d23b8fa43d29936353acb60d29224f1df189be72a570aeeede0be083c920a919e910b84afea7af9be65e4e565df02c8ab13c7ee612991ae50e2faa394ee28ab2c1b090e339c1b65582c7d35580013bfe6c653cd8c39a86650d2f2b554cb0a283ab7dc7018e08ad101d57e71d6e190e390ecd71a341e323aaedb5b6c74e37a77f799957b084c099fbdb4bd6a1dd58c4cfab4b4c8a7b627c6eef12928f2ee0002c1652c8a4090afa4e0d04c38681928d25b3241f8f00b33cce553dd725f81d70d48e0e6ad9af6d217ac3d808aed666161d075efcf0e868774bc2f99ef3ed675d549d3748c67b6b52eb14c5c3da4ad7342a53c5ab02a72021da195aa7d38ba43f9ef1b9c1f18ee722d9faa487916724a39376be501228586575d757ef3f56bfbc7b467b5360e28ae247f6104213a38f9a7dbf88ee34e7de9861e42446cf3f20d165e4569ba8043c960b86ba96422f700432d14af3e08d41c778a75ef5b4cac95494eda0dea75fbdcb65ee0481bf406eaf85f7b867da377758aae8044209a49aa7cab8786f2150e871fbcb5852ec32b3819cab779927739caf5668243e9799f079dd4350dacedb261c173060bc8cf0bb4dc125b1a89718919f611405d78028f809cdac8653499f88dc0c5954e060c838632e209e6e734d7ec382a1a036f74e6f88980c3001c79912ecbe1cc49cb412c1decb02aca2b1f0d8ba3e131a2e8300aacb695d14fde5906f80a640cc6346041d4f037af7f7eaa5e9338ecda5f288d93221f443cdda83eecb295197aa21d5556379f7593ce6fd0036daa3ca2b8a92dbac78e7c9ad29149fc168bdd988cd3cadbee4826c265cc5c97577490e7874172c2366be660f90338e5dce549fc006f8cf352ec1653649a100450d89ea7cbd6cc5a907e2efd74109c7b16ccca70eb659fe069b185caadbd70a0c23f30196db298f612362f1959840bf9990627e50883edcf9a03a5da430cd7e935ffd0f224d379927a19a528c1e56261502ce523b4301e505b8bde4c61a34d682d667e165fd7c6b68a448a5a73934d6f8322e960626f2abbbba98a31fd449eb95d20c7f8beb69f4387bcc98da5e6fa5f6577c1b065931f0320bfda67eab306db883a73202f6819f0fbe3bd1e32a7569de10a75f12f286148033a35c590df2cc6d80acf8cf277ad85e00e28c3e6ff8e0647e02d416a4ceff083d0ef48fd6ad11f767734823fec016bdfe6c101a818f8d801d182d4920fad9d146c76749eceb332e7e44a50d38195e3bbc1038f60d968a426a6e5b1081dcffc00077b580b66e3d5189fc27e718b58889f33ed38dd0ecd13d1cd074a2ba264b16127131779fff15a016f9989c872bd5bd737b31f0c45cb0708532cce1ec1e12b61df6eadd4404fa15e417f852428bf4e95187729e3483cc68506a23d488b20fe226bf3dc0065fbd212ed8b8c539a01d8c83d327f9833f46a087a6c265281b294590589b6e574c82b66e657fcfdb482ed867d020ac7af0b724d93e64e917c2db8a1d8525d73f29a543d822e8fb40bee55f1826a897bf0fd87d3acb480a3463f6fa40eade7feecb41f3de0f30c1bef7f5d89c194497a8762a056cd2f84035be275fe7c980067340edd848b1480911ca790588223207428d943499378758719f9916784f551e108eed6e32752588ec4d66a0fc0315fcb8d9f40783a73b9a0b9417906870316ff65d7f282028c22a7eba149ec32cbe8a76e1f52eb7838ea4c9a7364b9028f065a691fe322b290c0553c1cd3831ae5b1d162583c00bf70bf75a638b56be22a6222a87931104ac7ed7bf99780c8541f38b5531486b4804620ac76219a24a2f59c8b91ea413d46dfdd2d36b3f93bfe308c94d9cf9a4438e2225d9b68fa9085b4a8173d45bad656050ad657dd0da262c247fb61aa2be1c413caa10ae7a2d9db50450d6807e900dc7b5d61eef912c7a25dfa5d3ae02dc6413e1d9da68f0e044cbf45cab1b3db87a52bb20d4b0ab8005e58edd1aed2fa9153f14c1ef0feae3d781ec3c2563b9f2e1e32025b5dc9d10459f1dbf7811f8b9f6793f9bc7001fca3c91239b623910c16b4bcaa61ded4fb37119c150ffba42b4c5b39e8312b6886cd1842b5a2b7fb5cddfaac07a13e834e6222640ae26929e8352884916c32f8b120e844b09e231fb63c5125a89bc01913ea491b952efcdde8b8811b8c1f939ac7e9fc36bbdd539d9e4214e1f19f5f629dba646db90734c14b59ff037f79a2f243915e22c827f4cc91461d1569f7dcf8f8289f4c2c6e19a6a0e3d4850da2721acec6a5d05149b2aba8a4d56adc6cf5c2c5a9963fa43748bf7bdbdfbd100387631bc69c1f6d9df8bf7f96f145133b1988a420e848635a23dfe31d444179b3054f7a458dc44c7844455557f7ecc4e3616f16c78fbcf4b2f7557dc3016dafe0a957348a7d00e99956d7485a8f13a6cae7a4f0a1aa01d215d661baa30f9b2eda2d39031bf102a74619ada0551652c4b4c91cd89343e359da2a6da5a317ae94e08cfa3fb2533a9681388d46518581043caa6fbb2d191d23e4447aaba44263a9d362b3a0708cd3dbb5d14de54be71a0377857084a0051ebd178573b9c77869cf55f4c8cb157af504a8a47b67d9766d3b35735eb16276c4aa613d1c68b59020547c1e430d58b0dbfdde834d9ddc1e64b6887b36b1075beb8bcbffaa7f536afcc2f1346102f8e805d04f5c5dcab254dd90f0c6c294fe749ba63440f20f89296bdce5008381c6333f0d13439259940daffb85af0a9edf800f2ea44c1c51d5c08026e66bda5a194f7e41c281fc47122872645b6fc06339e6cda2c6c56189510088da94ebd802c0e815246a0c933f7fb921879ffd986b78412d96938dd733c2e6a9b3035ec5ac1a34326bf3c09e36fe893b23de38effe0f77a3c873dbe873191413ea87e0d085f3e723c57c726ebd05cfe79685f39dd177d5a14dfb9ae4b9e6e3bdd6af195980ca8b1584201f60e6d702ff1de070a7751fca6064c9fcf5a8c40ab269127afcc54b8062f250b6fb0018f3a93cb0321e16322af37d50c5c262cc4b8315ee65ebdc2a7edc819b865ef7c1c1dcfd9b00da2de6e83e59b04a8d99f17e782cc75efdd7b2e06f91d1e0ab88a92897f63641c014cd5ec0684e3b23c364cee75993a8e4a7e981cbebf46d70480fb6776f1889309f001b57813f938ad91ee661e85be5b2503fbc3c1bc067a6b1c1f45841ecdc1df583845d8f363d5c2c1d90ed52cd9335253cd5de56341b5a3f08ee94c8d7257753ffedb71d5e57f67a4b3a81d63c10628dcd2c31d9261bd88bec7a1e2bf52ad1b167ce73c59b3f6ac251241d1f501443b8fcd6e9d0198928594942f04860fe6c2dc56e4df69ad8d9e106f27f07e848b225c3afbf1f1d6d0a020ba18abefacd63130e38aa4027d6867a66ed704deec680654c7a229759d137bb63d1268523160adfd2f12303bf428fa592ec9a75771c875c8000586c5b8163a168a72b8499117f8f2a0b7bf08da809321fe980979080c0b685b8619428d0ab3ce6488b2296db278efb714fa58978566d76d170b389e50953bb2ede70982c6254f5842f8a82563b83e5afb362e1b37ae53c408e4c309ac05a121423c1cd45a575e454295e4bc7f73b7d40277ab66363cc8d3d584f0cece1726d9a3c1c2b0abe7f299c6ee3b43cf69afb413c61695c7c61f0ddd73dc7f5702f425989b812c467c8083890d245fe7aa4a6d51267fb6b5662f070a62e843d2bd953d5f4540c36dd301a9c68b68b70dce6745a59eac3eee60b8c395c8b4c610a1a9046c6044078931436925622bba7c8f114b6f4f302859d768e2c73bc503a21fb53c732bfc834d65c9e149a9338c14f502499b83ea82722f3ffa9ab0a351e4a046849bce4d0e4feb85f4acbdbc614f3e13211207403e49569525380b60819f7dbf3d4e5dd001189ff8f793fac60eda888bbb8fb2af372ad84098ae6f50f1737bf322dcd71619d5f7aebc5fbfa2771a006c45b4e53a8c342edce5d0c5cc5724eb7137796807f5373fc61f8d24e8abcc7c6e62a1bec248b8e11921bb09f934b17f6482b699742532f26facd775811b1acd0d965d2c1840be8f0ad889db4f2843c88b70d2916cbe5c9020a9388c490bf80a5639225d3da42419351d9fd57ecfa3ece3027aca2e8bc3810b27ffa3a4478920c291dc6c295161540ea24fb1093ecbd97edea63744bc83da76626d8b1c03666079f5b03f6733df2229739fb76f63dd85360ead47f54021e9794e3c75c0d53ba5c964342499ea620aaa9cacaaf9799eca42ea385133e325690ece7881a08e6a73b8fc0e7190568f2fac98d6ed373e3f4e4f784d149e1b68fe89492f148199ed69d1a79be96a3140a26b7f361f283c4a8b341dee05d497c126fac83873bd45ef780580d7415c4ce103116b04c32ccdde010f4abab014a43386241d5a96e280bc111c2a6ae05d8068202bf5b988a5313a5aff24b8e061ad14d9771c1fbf4ff1a6513a147fd7e73497151a41a70f4c9066977754ee35da4ae06acad69b9117ed969a513ba7c6dc232cecbe3ca6d3b13b1cefc58c29c73c8b5546dc08a8846ef2f76ee2ced3a9f2c2c6f890645d7bfe33498ac1dff53ad8e0073e60180418ea6f73ea3f7584ff4f096571d8386f92ffa825092cbdd5d298b444e46c4c8e51e644140ff59a4458c7c5c09ec12764e6f21531cbcd16239a22abacc7a3211086ba41504c34ab2fbb409f3851240d77a81e15bc93cebd74ecbe4e02fe02f7465385d8b99b6d7bcbcc32990df545075d7e97251603f60156a3aa12837d83d6a802d5afef482fde171de583a5d9b6ab7d5ad5900ddd60a7872f01809bdd0f1af2021a8de2e3e5b1066ac805df4dbfb5193bd9978a6dfc7bc7d9af3899214c66e76972b81b0fdcbc0491a424ecf9d2d1cbec8735bec2fff80f21a82f988fb84bcd067019bb3006e2cd3d5879a581847af746455569b1d9f1a888ecd49d489432a3a051cd974cacf936fe5cb907a33300861e2200501d6943f5893cdf1fe473bb067f00f8747718334352037454423c84058177b2737971625051e27ba0d57acec8e33b7b2c0ba146ff85039da983347571d30f91b9f176e3c6c1cb4e5a0e4cb9c6c898a11dc400f82d5e4967650d033efd44bd24276836c3f5fe22ec638ae0c5630866259a2933df887cba47558258fca6b2918eaabb94ac6e9dc7fc6da5843d95135f5c3ba59d80a4212b75e1f9e64b907d93c6b8bb50b85d4f24891400615d6069e700268759989c7a55cbb770e68fdf54272d27fe58aa8fb167b096522dcafa00bd3a89568edeaf3d4877d276e159cbf81754c4e35b80b06c8a23e993b26eced1d0d4d47bbfd8d3909fd1311ea48cd72cb340b31ff49635a842e80339a6b0e582520c7eb26355a040e2a623838b1100dbf682b6fa778f84685f75270e7979a243ef011890df77df8e176e442642a20767884b355bdf1e6fd915498eab7761063fd9582892c321cc2d4441a16344ec8e6b1aa5888a301683f2f9007b02fe43df2a8663b5058b0403d9a7ec14d17a134f38893127426b8daaf0d70fe332bf263a28716efbb0be69f5098d7080976f097aa4737f59643cd8c160467830da5bd185a3950c9574fca98aaa765adaa0cfc18d95cc7f61575fd41080d75eaec4b030448b1af2f2221c45727a14af5af54497b1e07a2a9bbfc56393bc0da22ff93a41f1180a783f5e5f1f5880a0c52f73ff59825b16d0906c26ebec0e338f8b2310fb76320c45eaac7e6ec823b056074468d8de0de546c1f37c24acb30d34065315dbd4a5d6f110669dd9637f4b9e85950342895a18bf80fd38774400a168cd37bcf868596dbf82ff4a889aba279444bf98f3e9120b22f2cf8b0deb95189aed713bbce401f431f188268b6e4a2744302ca4e5a55b7b7f2805fce11383be20afac1fe53e424ee9ca0303352f0c4981d1c53d871d23b4c4454386577b6670ed2ef6217fa4cdc7cd631cd4e29f0953eae4526c3e672c4c3bdb6492dfffdb6c32cafb15045f19e10d1e1cba15358d97be367ae3ea49948fbd7f7a3f7542bc04d15f40cd3f07fb6a34b98389661098de076a995aaa79d43d5f7987b262d602196b61f19f641b3288ed49a56dafd6e2facfd534b9bc66e66714a56d2fcb282c9b59b47460b6b3556688c42113f2b1ca7249b0904dbc41ebf8040cfd5b581b4035f101732cb637c054f17e33fd61cdc6a0a1ab110494c499e268b85978ea6a8ad3247771d792a69af794249c3577360f50ab5c7602200325526951969bd10bd1798477ce64da818ae16777dbdadfe55bda01bb49a4e5f77795067ca5879dd4c6223aec263b86f51b7ccfa7aaccbecaf3d9cf160729e83fc397788bc61007479fca177d6a773df95aad34f2834dbf22824a68a09dd262a99b9abe7eed66df0cc125f5d49467fb7f5f779d5cd8c6894bc6c46e7bda4e2f41ef145375b5b98f18de1a0ffcf7a6f1c5ec8f8a911d409b4f9e70c3542a67ea4c3f1c2b5a18ca8183180dbc341539edd043207a126579d5c9cc74d010f1058a5ede316ae7d6054fe31412ba61413f05a94a888b4cd240886d1ae9860ce42f6a10a7610af4cdc6d6d5fb15a7554f801cdcf20ef7151aa83a9d959a276c3aa0f3a3082184c48174cf4efcbea781991b7a5cd1c0ef5309d54833a9d82e3fda649b2bfb77483ae7c7d41d95f0659e2a150dd90906192d86ce4be677f0c1f6fa12e402265e3280d68fb931d6b0f7442c40cbb6941ce4c27daa8e3df2e4745f91bad70ca158307d13939a5509d87af4a131b41fd43b955fc37c50134805ed1ff19a91385f795bb620cc29c43196a3ac799b43f6315393a6e7a2c406822d72faaeff6ee4f717edc420000bc2d7145be745c8b7e7d8f72af476573614a710c8b4614e44a093c063b3bde697be3c8e5f40695906312dc921ac4ee7d5585fd4636ac178909c3120b268d5534d8eed0cbb5844c03e5947f51628a45ee6f59e80f840cf1a56042cec1d498a918ed34fca138c73d94ed6b0aff5ab450f1ddb78ddfc578bc87337530f7af959e0056cb6ca4895c059e798c87cde3906997e405d821082316fa3006f6ccd4496f7f6cce07d5d7cdf9fd2bc0e622576ec763a044bc2b4dbaf8a3d1637315858b53489c1655ca2d6f6339a897f1f3e5558242933b85f9186a39d5d84a9085f49f3d25fe0320d01c160211fb1aaf914f9911175f7b89f2d7b062c387a13a6612da24cbc2a3cf79acfd3f18128067d0ab6e8fb306bf3064d625c968396791120a3fdbd28c5700689a3c5305064557a9ba5812aa20141267043f824c8d06b2ca1a49bc0cdcc0cea2fb2d5093ada0261e29fa4c81fbb8f98e8e76c621a9a4c992ba11b9a482976f5b40487c55e71679c644b190b4c84c83af29d812df3cede2901e6b04986cb5fec1fee8d9b1968de88f9102db0286b0c957b0f3f13ce288de49b277d812ca114f346f3127c27b023e0b1f9a2e54414eaf1d8a78449106bf40e2099573b11f5639ebc3ebde19b421c7466e71f600e83f83af018910e308263650e1dc6c6710f06c42a2cfa60e9ed828c28772765a111fcf77bfbd1d227b384006ddd6e10420ae232ab4cc9d00c7b1974dea27c3e809370806467b710377cea4746222e25bbc6a09cb3d1228211860e1b79202dcecb895b847b53e3f7d4566c7543d844d7194f7e32ac39543e05106ba97cb81a47018081b87dafd84e4e257c5d77815048a1d7d2bd2ef8028619192d948d5c0c3c5244a73706a2c759280922fed9b005b2c47019dc1c08caf2684c8588a6258bcc0ac6009a18eedcef51c292d576fa84ef6f6e6ac8864bdcb80798c6bc1e74c169473fe9eb9a0784d209d8f6ceb365811f347269c61097b87e081c4f1647b2c3658b6357d885fb6b597ff52832fb796e7d5e1de36a3351860d4a6d48b65dac2fc309a7dacc130bf89a681aa2079a39d18aaf174af855427383e338a59f4fcf907f04a0402205a5347dcea164982e34c9d8dca05534ab1583319ad02afe138ff461166c17424aff0a2e5b6819f136c7fac71c1b35fb5a92eb622c4891b02df7571a9a9dc40e2afde1321c0c6deaca738dae1bd3fd5096a90e12d95ed915b50f0373fc048fa8c450a61e18ac8200854bd15411c73b0469ccd1a11a846232c170836ad37851a3e8551c8d4f3baa8dd77bd0e8efeaf7b14624cab1c73c92eee6a41aede1d285e2ecd997e11efe0edcab01c88e7b9f0846808c23ce14dbc42a0c000260d20cf90bc532d58d1871ef726e2845427a08bc534353d7acf47f429f2b8440e0d36537e928dd35b8aaa8d44602cd71232e700ea09cdf1010140ca69ef99f5518740dcf6120afdf5e72d46d39409ab5510986d16a3eff94a485899ac6706ad7b415b048b6b725deb4bb005031c3329e98cab89f476c2e2c242d9da1142e3bd641d165f91ad8d12c7d4509e0a53b97220923f2f5b213ab1dee02ece19a4c919c4b6c6b62daa2cb23ea923f8efe9d213dd15ffeea45313cedde812e84746a27500222632acc91b839ff3b415fb1bbac18dfbd1d49e668d2eb697c8675fc62186868b73e9a36751d523cf5a2a217a4451ad3ea6679be552cb88f36ac6f0aa217fb4bfe250ca483302caadc9df61af51cf28643ecd6306c341061d820e2dcdc53aacc072ddd2294ee730172d839e5d9ad0028ca71cc961040f278a1e4f233611d9d4c69301b23c3784752ae760eb58a77dc3f9f75105dd1c0f3407f820ead14725fafda428124958d2cac262e18436a3b2add1ad31685567ee5cbbb455a043872207654d40270a1b20a656d075e18308e868ac0fd64684693c748254b268f7d5da94bd3baac58f54b3dcc0331a5ac6b8dbc53ee966c198e24a76b036fb55162432f1cdd30731427723d4e89905b1b0a35ed36522aedc344c558ca216860e8adef8fecf433aa62ece0ed2a47623bd1921d8aa5f8a467141514336ade6885a3ee1fabb3d2d5d98a13cec00073006f74a58a3a49d0f9251a6473051bfe1f7c2d8b8bb74ee3b07ce167220aca813033ccb19437ef4696b088078616c8f583b9fb6e34b49459259a0072c746d5924ecb76a9e611c1806b8639f250274c90e50eaa19a2225190a3f1eac7d497807464feed2a75b84fa32d952d6e0500a1cd07aacc5cfa53b553f2ed38c2a13973eb55b086b3c257bb1d89198b1de5dbebba3c677a02ca7dda39ebd7832d6fb024edf1d77d4f688211688f03165fc2f750f28413c65fe5cb5d3d0e1df01e53359d721c41544e14a551fe3bd6e1446bcf017c14f21de0e1df05c5cac36616a8557c8b8fabb1351a620100fab0fb2f992e1799e186ad532417734df06c7e3c13f35581186d55c4dc1f1e22848a293b861fe97751d7aaccf5a8b5ee1b1d4c956efd8d06e8567d89c5dd4e4308a74cb1b1aad5a8b65f3c840d79d4387006f090bb5c85eb6e6161e5e4c73c9bf8f75fa04b76ea19c254a448738be358c72e85452a0eba3787c2f5ec81908dde00e07711a4f5df964f7036aabea9a5d5de88af767ae401faece2b648d780cbc8c5747905f6540e4995697bc5a91dd4cb432569f19c9e51865a94a31dc0e4f92b00c7bd1452707594298000094f6470641ea8513c9b2ede4f9dd0ebcbd133348364f03fe55d62244ff48200ae6beccc1d029683d960e325c6b125f0a4cbe6c5a2fc5d8ef7e0f85f79257b46d869be498c28212c6d0e384e9da0c1eb610bd3374b7a822d2fb5853bbc21de951775e0cb6646b9eb6f9ed820570b4e3ed65362c9baf9cdc899182dbb5b5ddf2f1f54ac6ea967fde6e3213b708b8f5344dd755eabf0c6f125fbf1198aa94db6cbf10691b3a7b150423c3b44c6781714d1d5ec6d3dd2d197770e404fa6821188b2cf790d3086591a20ec2f6ae40d2095875b19723dfb52140a608c284e76f922d012b87471f013f682a23d6d42680ab6ce711138fb491fdba4882cdb5f2af4285185253502b26af69b96e86f56172553d7c862edb775fa442beaf1406cc5129aaf24db61aa37fd11325dce9a212848b3112a3b1d93600cadf1d065de1685a04988ec90d696628727552ea5c5046ba659040cb16749d9175fdcb248fe3eb560b25bc8096cc55601aff1d7767cdd71980f80f77a7b2036f9cf8665b47a2f190973e197c7599ca82b69daa2b0cebd80468a60203531f32d32a9b285b9386b2b9899ff971ead9586cba319717b1fe60775c7994cb10d52dbf2daa1db03d9cbade6e8240ca76cafc26e56803919335ade96a5082ac56c0a2abd1cf70da8a92916ab2a9838f17ec3088a317cbd81a57deb516fb3c1c0cb2a1be3bbf0ac60a75a7697da99461798b461d6028af95ca27a2d42fd118d5e479397e1593f38ab30eae7f4d2b5c0686b6e52ea5228a20c6059621fbcb5ebd6662b62dacc1c5d5b4e7cb3e80317d19e2f75f6d6c2636693d26b9931906e4ed023ea9841f0c3a60b0a6d0013033333333333333333333ab6a1abfb54744564a32452e6d8c1185abc42453923ba529ce4c7cf845daf01769c35fcc662d919ee102400cd90b150c666b3491021e0871518517363849b32eee796ee2c08b1a9cc6f22f3449115fa3794183b368952849b4b9d955225acc25f06206474d2a43c8d3681f3e7a2183d34961ec549d7823d789a889200421f02206e7aad3e6612a5a52d2106fc00e5ec0e0b4356f428e527f71aa3243010f84b0a0e31507a1b4cde8b778494b82be91c591a06f4880043e32825c71d224a5ead478195faf15873b314929cf5caab4d2b1e2f81deac62b4b3f0501295bc53156d4850c27bb6913a38ac38cccf053ad5944978a93c997bfd5adf86a7259648168304024470d0e5876a0e2946abfa7642fa9959244d4b69ce2a8c14bfb562ead0515253a4c71f493fd2ecd4b492a742be828c571633a51547ba438c893597e4f33059f53c7288e954bb49bb2365db213c579663b66cff48d8916117d4147288ea77a1634ea66a799141427add679f9ca64ee1309508eb2818e4f9cb24f2c3badf45fab79a2adaa0a42c54a3012e2366e64d198dbd189b3dd2561de2a8805d58ba8a9053a3871d6984da6f94dfd5106ded0b189e3e8ced0ad8baf723abb4b347192344466b80a25db2311b564c347928e4c1cd7bf3b53c59d86be44d470a8a00313c72449921283865a58371d23173a2e7136cd97337fc24b8b96748725cef5172ae893ccb4e88d889a8d0a8080d8b8a1858e4a9cf2b64ec6dbfb693751e2a44eb3d246cb3b6deb4de29826e58c897e5d49b288e408493690e990c461944a4205f3cfd00c89a8b916080703ac231227a949b76d5027bcbe17511bf186c429b4c84df5265ee955a2818e471c4f8f0afa2fd929d15b448d4b301292dcac60a0c31187bf2f3b39e38efc0d1b712c299ac949b93f080808c8480e1b68197192428e8fa5b065d1ab2c46702420ad6da460243140c7224e5256722b3158fcd3a42451c451dda2969874bf7164c4449c6aabc41893c78d976a071d8838bf9b54b18ff5d19672888392f242c9ac747257107618e270194b8935c913d133b41d4147218e4989676292f1222fae88da4848b25182771c8911e22ca64a651adf7427c806710a16842ea5f39725e95a4e1067d1a64c8cb944ff9316382a10a245a320f1d01188d37ec8144c12a2554d36dc98c404c7800e409cfb67fe456d3829762971e4d8a2e30fc74b269aca29a926f9e687a38c7c570e0f2d56f7e1a4043929c8eeb5942be7c3f14ae64eb7b1630f2729b6324c2ee3688bc90e3d9c57545773ec32fd29f008a82d3aa0230f2761f5bb8409311e0eb3f9296f31ca7d2137920141c71d0e1a374c123332c4eb49442ded3bec703c316b52aa3358509708928bc0468d7275389f795e506adb4aa5121dce27d7644aaa2455ab267338862f159f57fa649a12391c4fbc4cd94288fc8b8b889a094810f2c8b30849361081472e011a33729460023890169e6e5000a45c00fad01187535693b2f72d7eff9788a899d5a0030e870f6dd17e2c55bb6544140424b12274bce1183559ebcef8dcc69605f21c23c56ed010818d1a7b9e6ed848bcc30d07a1a74a66ec37d1d67b162139be86c84848b98e369cee04b358df4da631dec186a378b696858ab163e51a4e625232497ed152b25d2a821a6fe346bb6144871a4e637a83a8641627ae2ca28623c7888d1a7888373ad27010da9fd5e3e2d61632a1030d077da7c47819de15468ac3739400033368cc90c002be02c9198e99945c6174091b9e273683c68c19584860c648020ed3263acc70b41275d49458b3a034653857981284dd9ff81963c870ded1bfd9abbdacd2348693244951998426f9737d311cf6548432e5fe362637b608c9813ac70d1b3368cc7015d4c800b2801eea08c349507bf5314918cbf78aa86d8137e800c3c147688bbb6ea95f7fa404688b90911a0bb295e8f8c2d96212936991f34c5a23021b37d2928d0adcc0e2060e1c88022020366e68a1c58d0e19e9f0c279847e6db9987032425d3845afac1517f35c386cbe4dd25c088d7576c7164e195ead3548bd2052a385b3cb9552f22554ea4dc9c239eb34868d3deb14190bc713257dafd2a6a4d55f415382a6d3f4d2808098223aac70126a5285ae3476212c0ce8a8c229cbeb684b666549dc3aa870b62acd55259ce7858c88dadae898c2299718c35f37455a3691c269de42c624f3529512c70b4147148e36a2ba2a7e3b4428b1d0018563d26edf9753c5843889a865c7130e42891353265d32fd9bda4287134e9ae48f4bf944b365aca309e7eedc205312635f31165103010101010149098180180620111d4c387c9f986e34863e135ac261c489b39d7aaaebf71a8c820e259ce44b3f91c1b2891f2f0987fdadca1546a8996591705e93b2c9b793d42513b45103e5e840c711cef91733e512ac7e531a0d1d46385c74fd983f2fcd5d01a1a308e73c31378911b9f7a1abc00c2c243023c78d1b18c80e221c4597bcb989ca971c0ee1b4e94dc91fa1f269b184703a4986f6be332997a406e1bcb1191b7b5fb632d70184f3a5bd4cba2c8844e8f8c131c9fe8a31cea25acad8b8115266f674f8e05c17bc522ebf0ead931e9ced6b764c26419a383d0f4ed2447e9a96c5ba0fede0fca22ec874aae94453e0d0a183933093927cc2fae5ec7370902585929a34fedac975e0e03416662e9dcc74dce07c326a10adf1f32315289ea0c306a72a259778eed9b97beaa8c141dd6bc8baa6d5999e06073532be491a53c89e7cc70c8e7f627ccffeca73b364704ca16664d388f13669470cce3a5a7499b6b44cd93b60704a53f2492749f21a7bc5e9e46f51445d719e115aff2d4d4aae5d2b0e6a2a8845bbd2547792ac38eb6f36531f5a92c622e06215c72f2d79720875131daae2602a3bd6465f12e42ca9389ee456cace4c66fe101527e9b372d5735b629d051a0971b3324282ae91a32c052e4e712ccb4cca52e83cedb3290e1a64f0f5d3d5d4574b71122efcd62a0899f32c521c67b4250d61a5bdc4378a93564a39b522cd54d44571ec53c25a52b94d29af43719817a554ccbb73cd04c5592ff98d6ccc0d9fab083e7150bae354bf9da0521aebbae0c21387d79372d94cfcd01b75e214f4cd4a94cab21faf0b4e9c5f5634e8535517d6e46213c711b6652276f28de645d4fe4688c8087240a289e3fbc92409e2dab72fcdc429c46f54760d97e49163e220eeed7531378961c64b9ca48b316a92df997194963866d6d2a3ea23fce2384ab0c5d955e270394c85f35313252a2e28714a32d67f55e998249cc4b9b22925b79aa323e51bc99c085c48e2a4aa4a6a13e533d7c573118993560c6a4bea86b06c042e20710a939b4fb8f0a969541781193466d856c1c5234edf6562da5eaeb9a28e389f361393a73b76c281c343b6405aa88b461ccdc4c5e9bd6513f616d1b32e1871122a467c968957bd5a5a59c4d95426319e262d13de89a8790e1c37922b451107dd8ad7d4922419ed2f0c2e1271ca96a926c6b4f8f89968e0460e1b0fa08007422ce00211c7a4d132af2873bdd2b37071885352536d26ac04fd176388a3582a95bcc289db5ab935b828c4498a307da6c2055d13218e5a25833699a74e261d059ea3045a8488e4a87102633788f3997bd556bba8724b444d057150d2fcc95d056b934b11b5828138097772a2c474ff975844cd05208e1d6a739a8ac92bde1df9c3f92a9624c7c64a7da62fe6042efc704ae9336f0ebfa04f8e036de138b658d3a23be0651570d1879324bbdb296d5eb7c9e2820fa7103234c786c9d5a113514b1a13a031830337dec603f670fe4b164adf4e52a54911352d4250e0c58a1e8eb184f14b5994e8d868115ce4e1943d3e2d98586781fa4616862b708187935b694a6a418bbc688d9011f7bfc351ac2f4668cb8b41dc24706187d3883021bb663137001775385db57fad49b941efc6e1bf7438cfebbb98e0266e1af14fd0052ee670165de29820b233699ada851cce3222e324d50a198465e40a2ee270b476930415df3a7a747038a7a6ddaf14c49a7825eae20de70c97cf4c3a19a52daf00379cf532e39f4a3749b4442289c80872006a1b37682489821b27c002044464048998369cae844ddae2e574f5323103b860c3e9d4f7492af86fccea226a77b586b356d6f5afbeacae4b0d07b1492affef6c7b51c2349c464d5d361d4a8ac9d8a1e15c92b86023532c9394a488e2bec0c5194e49526d0b3a6e2a292d262ecc704ac24e895767b857d019c145194e5146b52965597de393e124a537415bde18446590095c8ce1dca2444db443759b24226a213792b1e1420c27f1c4e83dfb1159d1ba08c3c92da8c7ff7c885591175c80e12ce7bba74caed8324227b8f8c2498cd1a29f12cc3face485d3bb9baca557e5f761178ee322738b95a01a4ec985f3bcec462faf68fad52d9c729460999733e82c152d9cfdaea489fd19fe3b15419f9689ed8a93da4b176fee458ca515a724e3f4c8a4c64c880b0424c434e1c18a83721d95bdf49bd0513d5671d8b3d323c35d0c42095571124a56486d6b8f71640b2d7088a0950a78a4e27861d9b2749e146f44651ef040c5f9cc8232e97ab62fe514a7d3d2aea4b4881373f430c5f182b6ddd924a6d251271662c62ee1518a9305ebb7a05fab72ad07298e75bb5a52b2d1ccadf118c5e95ded84d913e3218a83e95845ef4ba24b5285e268165bda4f0a5293a01451d3000888718407280e972dceda5af213773f719ef1b70cbfa33b5f0f4f1c936852c80d354ae59276e230f2f4c97c0e0001611a3466241b4e82460af01a38b000010101390f4e1c46a49a36dda4b2c9aeae4ec46313e74df917f4bdaee48b3d3471ca7dba31fe82e5f13113a78a1a43c69ccfc9c53c3071924de9117264b6d6fd66d098e1038f4b1cd49d689525f94b38358d1987e9016743f0b0c4315c1431934f9b7ccaabc429994a2b72c9eef2c8831227b9f7be6257ef3189e3e9baebb4a0bc5a5611b51c23288b901c35b2d862a43c247112469a64722dc3b7684a4063c60c0b60c002129841c302129831c3022539247844e2ec795aa54edae09dbf889a086cd41871678007244e2553b29421c4892c298f479c426c08e95de1cc4cccc311e74b91db159f5fddf810b4112dba036aefd188a38e7cb86fcc4b9b37234e493a5b4d624528bb7d11c7b8f771ad9b1571d60a15dc432fe610fa441caf34558a322b228e2637a3f4bc7488d3e8aa0c26e3c6932e6588ac3390635853a769423bf349529047218ead31c8be94efc5434688639dec35a6a74da8d406714c29b5e55c2e2f5dd1f610c4417e74655c562ba67a930f7804e2246eb6399997c4125e01e294a167a3088b299a9b7f38ac8ef80ef3d1c30fc7f2ccafcdaf2d4af4e8c359fdf5459870af1a631e7c3829d5ab376f3e053c10e21e7b38a5133bd94325e92e9c20eae19c596d36c85fdca09220e6e168ba7253e3fce55bc5c331e5fd51a1ad153399dce17c9e4967123e5acf7a3b9ccc2b6b984c21fee292247538ef95e58a86662df1eee870503d152c7508ad1b4e10e7706cedbfd1d34b5ebec9e1783f5fe9d2ac94ca0c621c8e6752f3c59dccd491c1e124aa46d54dcb74af718f379cdc2ab97bbba8cbeaa11bcee27d3e76628511226ac3a9f2e93dcb1a76418ed870ae0ce6735f4a6b38ed8c5237a9645c91aa1a0eca4c0cb30e5521b3958683fc080d7ff964461bd170dea441976e32214adbbb331cec7ef42fbcc9275b6b86738d09e23586d18da995e1f01b84093d6ef3173d32a8a1c4bc6272abc718ceadaec1f485fa8bb1cd8187184e6321f4c6976138e54d27a355f5463379309cba4d2a154e2bdd64fbc249aa132b44c678277e79e11c16e62f9f8951b3fe5d385fa5d44c31fd574c31170e27f8c6d9f426c9d77f0b07959f757a71599450f1d0c2a94cf68c792b5488c51e593825bdd87762525bd6241e58385e0a95375dd03fd2f21e5738b8c9d7743529b849620f2b9c4d924276f35e3a39496ff0a8c27954868ca6f392664d7b50e1a48489999b5cd453725338986cf924b9945e0a878db1de10be89c249d070a57992f08d690f289cabc4da67c693abede2f184d32653fd917bf170c231b76c97c956f726f64d3889778fcd244eb38bc5830907199a4dd6d9588829dac16309a7fb17f17dd192699087120ea67409ef0d4af68d3c09070d6a9394829e9da04a9070fcd7607b95498f231cd48dcc74cd242669818387114e2daa33986077f93bde15e16ce1bd92ba2c9632d69d133c88703eb9b6acfecc338fec8670ae132709625f9bce7242389c5de83dd1435c38fb2e0887936f540e4b3196c9f200c249cbbcf26e379c124c8f1f1c4cb788f9c9964ead2d041e3e386912372132dfc512d51e9c3289d97479598c49361e1c33d5de4f9811b7d8a2153c76700e712f72192c58890da2870ece2675ef66460d12c1230727fd35d14653fed4d9207ae0e0ec6da192502a49274ac9e306a738b22f8d306969734f21c90632379218f0b0c129eae8492127931e5379d4e060aa65524cfb9bea1e343868499fe954a808dba4885af198c139d4c32a65d497596cc4430647cbbe924e0a7372c80c16c12306279574f742882e61b52578c0e0b8297f9b0c9331e9682f5e714af221dd4d4513a22c49e28a83ec8a056dea4fdc986ac5495b55a87cc99455095971d6501b6bf3a4ab8bf32a4e3135f69d7c7739a3a78ab3bf97084d42d544ff527192eb5a67a75228ed3f2ace37fb97ab2479529de4298e71639f29459ac8209be274b95acec2f5a538f87909b1af30f59991e2a0276ab4e0ee280eae156337c38593a4e54471ec73cdf1ebe2553587e2a0a6e473cb5d1b2da4a038f79a6082ca275c4555e0f0e21387ef12cd84679a17edee5e78e2e0a226a992a4cb74e294548fca5192b4e94f1239710c1b7dbc940669c9fca58007425cf0621347d13197629acf4d41a589530a1bca7e834ad598c9c431ef9ac5af8e32b97b4c1c2b754d8ec612e456ecc5258edb1b2b29395a9409fb0b4b1c47262db1da66f482b012c751492a9d1647a70802929845bca0c439f54b5f360d6e72749338d89e9874a6552d45f34212674ba17de369b7781a338717913826a9f29bda0d53317e0189d36c52aa73922066ec2285178f388b4c796bfaf20993ef0b479cf2f24cfc5692dc42f6a211e7f88b6994c688539292a08449626788b52ce2e8a5c5d7675cf47e7ba18863fc89729574938863d0aba4a25993596e1071da3bad6cd167115e1ce214dedafe44dbae5116439c94fe2fa94d105fda094212db620b8483032f0a71aece20b3578a51512f429cf54fa9ed33a9b54a1ec439bc7f3709afd1a276419c3747bfa437d9e22d1588e35adca668cd57b763c81b5e00e2949b4b12d524e93f9cc4d8f6cc69273f9cb4cb6f8590a7cba4ac0f871761c233475bc4457c38ed66330d9d3e62d9dec331e68f0915b33e177c3d1cef52bbdba8601ece9b1d1b3457dad00de1e198f46dc9969420e64647c38b3b1cac3d65638a675953ee851d4ea3a4ffc99982129312abc371ad4ec54c526636494c8793d279a26df9a93fcbcde1248e900b22a39ee86bc9e198dd5e93984f84a5c53542f4b27811877326bb3749b6941bbbf2020e2755932a59e89e0b6279c341575a859c54f2c20da7f0a1c76c4d890ab7bf68c379d64c949c2b9bbec7176c3885babb202a7cb1869360ea176715d3a98abe50437268ac245f5763c4a4e178ba43b926d5f49bc268388f4cd1e1ae3fca1452e30c27b94fda26c1ceb62fc90ce7cd6f172caafda20c27d1f95adb342645860c190e7a7fad6153c812372a8a1763389d2ca1c4f47955beff85180e3286d0eb332553ac0a0d1c3590057c64e454f1220cc7b0f94ed4944b1026a96038e8cac95842888c31e72f9c4c9c52174e2ca3f0c20bc7b2d257962ab388a65d386979cb5fc209e2c259df2c63bcd25a6513b391175b386653929a60a675d43c2d9c5470cdfb4d514cc6f94516ce619fd9e4e24e185362e16c71ac3ee49bb4ecf60a2775a124dda5e765ff0b2b1cb6ecd4c2a560361605ccc0420209500a782044e445154ef9e4b6786197bdc471a8778d2c32d035b2184940428583daa57a99eac93ffe8b291c544d9049bfdfafc9165a34e2a8c003520ae75bafafebdc2bb14ea2708ad39ae4b24927d5e443404084f0020a873139a637865793f26f2ef0e2092769334549532944b6c809a7984e5242fe8413adac098715ad14fb3e79cf9209c72f91c9748f8c2749ea174b3808cbd2a1d7a43a21b7e485124e3b5a8248117acfdc0fb181da092f92707e773335fad5c48725b811b24978818483c595c78ededd243e928587e0b8a1e5c5118e9915764c584d93c7712344ad181c9ea34642e385118e7d99e42a5e899cee8bb09abc20c2412f75349f5c23b6c4396ca0461b30b705d202435e0ce1989b16e626ebba7a498819b281a30223098042bc10c269d34c8ab72ab27bb7201c749b4c19197d54cc8fa4c023608070b2dc54992aae173f389c9bfa931b4c46e66ce4b8f0c207071574a9b52b25595c5744ad78e1450f4ea92e636b92d0b754e71849b00b2f7870b87c9edd5dfe5ff9bed8c1799309b9d27bf2ee9988a8ddc85158bcd0c1a95b354979bf84d73211f0220727a975e93257959cb75ee0e0a095928c9654b052da3fc046094432d0352a072f6e701613d39990eee12eb2b7512301c6cccc2cfe563251a1f286dd89b36b2c0d4a0caa3693cf89a349db79d79a266f2d13623380b189d358f64e8d7a6ba9945580a189938c35f3b6a56a36279938dc660d9b92b6fd265701100318983867df65ccbef5250ed2b26fd3bb59688a25cebe4932ab9bbb0c318d4a9c72747e695162e5939450e260a19254c1aae35cbb49b02633b229752a8983b4935c3b84a9a04784118983a9ec7c8c3441e2b03944c8b71ab7138d19603ce220d2ce4ed413541825c81127157ee156eefb2ec368c441995ffef42e61a6368c38653f493c13f4476ba42020c9224e724ada8712de4fea36024311479353fd5e479e88c3c865b659af0ba3160c449c82d5a953dd3b5f671fe29ce5262821defa4b8c226a35466a181bc9a2468e12140086214e292a1bd452ef45a485b8449fbcde5012e2143474d6d86b79891b40c018c429979a5e865222040c411c764fcc7d5599620c3ba4c008c471c46dc91772b6322e188038c639cb98719a5ba9ca00c61fce5623f3c539d95452d80fa75367a62e09e2b75268fa701247a6d6246b3e214c091f4e6f9b4b12cb7b3973df801934663080c68c05cca0b18753de91a244f90c1f3a82a18783fa6ddffb5989f4330d30f2703c95c62c6d107516e478389728db9433b88abee60e878d9b9fe9942cba6187618753b509422625fc92ea7f068dcb038c3a9c4fb46b0af667ba2e498763daeb8b6d294749959bc3d92433156ab252107f228753eba9a6b1ccc6e194c468dcfc172edb9ceae070d61c7b23cc432f3420203980f186a35da9585a4cf525992232821c3083c60c0accc04202202022e986835ad23d9af6a15a646d38696e0da1eaddeb6ae300061b4e42e6d59d8da7316f726b38ec2955abefaa7519cda04163061612d0000808266380a18663d68c8fda9a143f3427809186a35fd298f274ac010c349c724d454d739226e9ba1630ce7054b54bcf9cb1a2c9d0994163060e4fc88b19cef66652e77e58bc744d190e3f1b84b6f7d020fa2a0c6090e17426a56a92f48bd8288901c6188e61b3525bcf0479133c6b030c319cc26bff68c83cf22cdd364c0d30c2703e792c84264bb9e5570a72d428768001869318a55a82e7092ffa041262233546dc868b00e100e30b87939a5ee2eb1a6239120f30bc70d0fe4cd125c55ad4ce42cc981f6074e11844cc5899a0452c6d40404040ec46ca0c01830bc7ca57b198f7fe90a12d606ce1209324c5b2545c0acf68e1a435458e8a88f413d1e0106064e134fba62c6fd60b8bbb0a010616ce39bab4faa5778553ee59fc4dd1b5c2495bd692f2ca86b074a9c2e1b36492b3aef2769f4680418583a6b18af14ff41a534ee198d456f48c1e236b7339020c299cf352578941c44f8e1885936caa4a058d278b7a1d0a67911151cdd7b436499e70beeb36317ecb68c56c0205184e38aa4511dd4b29cf5f4d389750ab6e4a93250a3098d0b78ec58f09309670521572ddd374abd243634d80a18453950c966413da6bc329092731493245cb7bfa5ad60318483887d234b3f5d35dafeb0807d165a533a5b52433698463beac2f9a79a2e5138b70eccae4a1c45758d312e1aca57ffe94f8a12a6b4c42041843387cc9d95e8d9937c95a3c802184931ad73649f80dde9d29028c209cfa37a5be24fd4634a4051840385c900b336be94bd6f507273f0fd3cc97732df55c80e18353364de9d582b957c97b01460f4ef2a6bc56b99a47890c95008307c72db92944e46c6a6b07c73afdcaf533a5a9c49325c0d0c1419e14ca2c496f165fca1b6fa3c61d1560e4e070693e356d0c7a2fe60c0930707034490e256e75e95b966e7010db73278ba8cd1b64120d306c70f65eed0df5559f553a038c1a1cd6fb7f4b4dce50974b20c0a0c149b0249ede767506475dab71b55426c9570701860c4e792c63f210af545386980b60c4e0bcb984abd0b716646d2a0b306070f8b7d210616e955bbee218a4ef9bd6c5654915579cba47fe46fac9dbbead38a8ae14d3c26e4cee222b0e4a995232a52406d1d4db2a8ea6fb2666f454b124dfc2872ace956ef7f9b77e154a5271128b2327c8cc702a48aff0818a53988da72491263a1b44e30b1fa738bbed9ea469a66469dc1407954be6ae4befd3da4b71b293562cdcc8ac9d901487ed1a25d37a53fde533c3c7288e494a59e3afd7d5565a1407eb0d377e275f5a3e14279bff90662b325616288eb6265e9292d45be28987d81a3e3e71ca2647d659ce096ea6278ee9b4ccec63aed2cc9d389850f99149888c3f160808274ea9de84d266a62aade9386ef4c7264e7929377f9a2e8b7a061612980102a28983bef92539a29289b3a9af4e79b9b7f20f1327315c95789717bcc478068d190f3038878f4b9c2c63374c344144f8b0c4d1840dabaf259b52f25d89936d34497989277949529212c7b694b6a2f94c3ea54de2d8736695dc2cfc7669923897c86a2a338d259e94267c44e2e4a13395246f897e7241e29c1a6646491a3ee23897d3b5cde424b35188691d3e1c714a929856bf152e33798d38ab88d80d35fbaf5dca22032020216668f0c18853080f69f19220c39abb88d328319a9adfd7ef162960068d190998610109ccc8127c28e23ca756c62cec64e82d1147d16ca76241b4a79d883825999214632a25a368778883e9d125c6c5dfb4d810474de12ecd49e9429cbe4e4f7a886c163f11e2248bfa2dc132ebe4ab38828f419c64d060d962456f9283801c123e0471f84d67e1eaca6ba34920ce779b41fa657f4b620b88d3550ade7f2246da5fc8f0f18763c69f95a59261c9f4190001010109b194c3871f8e6eb9c9af5f9329c9c3420252f8e8c3f1c48eba569b8b354a4ac087c3788ede9b8e9217fcb29103c3c71e4e17e629a357ce4328f570de39339d49164fbf983c9c94bcb2986ead3342838763fe4bf2c8653ae9c265420c93f07187932055932ccd1a6452e9910f3b1cff52e65279529c4d973a9c7545dbda7c263994183a9c947892a4f3843641e58b161a3ee6705226bb6fd07ba76564391cb48eba57ecf5d0a1bf389c4a8bcdc5942a8766ee6fdcc06101341dc2071c4e1fa2b5f9de4cc6d7df7010cd962a8956a1d3a44c0d3edc702e7ddabda277f6d18693f40c26fc5d529992cf86c37fdbdbc971620a155ec331989a923abe4953c371f4f5627d89d1d33521566938885a65ddf90a6d7ea221f6820f349c946ef9cc5ef147c6dbf8e0e30ca79425083b3929733ff830c3f9448febf451e2b7e8ca7054d354269b9651d7350808143ec870166923e564b9a079d445f818c349beeca37d835c454d6a88a5e0430c27994a99f81b42f49b6c09c3417358d2906fa2a3651d7c80e1b0b16e1e5baa2f8ffb85f35dca11f7b2621a745e3889dd78a6eef28dff8658760d35c247174e42e48da86c3df96309b1e15984e4683b077c70e1a0b4491b17637a0819db40d12d9cc3f7926c2bf1cb1294e51c0002a221c5b4703449bcd4a77f6366d4b370342996be1432569a287d60e124e858537ec2096575b9c2b96b936ba99d5a2a6d5248f06185a3463d65256a49d229c9037c54e194c7d372c67419767321968e63061f54389794ca84ac6c563b95b78d1b1458c2c7144eff39ba7159a6e59e144e62512fd9bf8611b94688999e8f281c43a624fc6cec5753b2c6830f289c36a9333d9aceea7c7ec2514c9689bb92ec4a962ef870c2492cf115150d7e6be21f4d3865db2a91ed9209a7d25557cd6c19ffd512ce6de24dfec922251c4e4b0c9536b9838f241cbfd652541831275ff58184839b2cf576fbf3934a0a043e8e7092e554eef9d99896ca8711ce65fe7e964ff35184c375bb99afa92432459111e4001a33b2dc8d1360e12440592840010b48018e1b5af80440403885a4e9e18308e77151eebba1a4cb91171a15984163c6d102c78d6fc3c7100ed2e4adadd3ed87104e7665622ac5ec9235ff08c2e17d73a56eb4be5c52ef1800014920205d0304061f4038c795c894d371d15da9467cfce07862f30595bbeee29f2491f8f0c1f1a4c5ed9764e2fe941f3d38e92a9b2bd5733a540515f1c183a3e9ca65793bd4bd4909b2402608a9f11f6233b068c0165a3c20050a181941160071c2c70e4e627c4daa379f5ac96f051f3a38f6c8c6b592cbcae023072765e2db75cd28a984930f1c9c2b8c66889213370e888f1b1c73689272defff25cd006c7246490bd932a35389ffc669543a9b4f7ea070d8e264c69cb6d72ad3df4318393b696d6930f09a9010252563ddcf02183838f5413ebaf579155033950160c0001b1e13972a02c82f01183f3d76e30a54de8b313fa80c149cb7f78cd49319b6e11354f00c8c0e315e7ccd91ae31bdd8cbce9cd356723ce334ac8bc39212b0911230e9a596f37c996e43731101053467811c7bcbc17ead76a7e7610900ac850c4c9ad33adf777e346544646426ee428d79e6ed0306524031b01198938956e5f1b3741834cbf889ad9b93365846520e26c3fbfbb317765d24806404070241c2ee310474d259ce9122b5d5f4ebe05ea110f7963387c044b86218e49be54f724a5f3e4b81067358d49949153d2a509218ef1fc4fcc7c4ac9e9d3208ee297b726f9a668b120cefb9f7f9d1706e2242a2a435aefd7890b20ce964b570a1f292696f41f4cb1272ca21690c08c09d02881e1c8b105c618830c3f1cc4871ce131a74605918c3e1c948fa524e5e3ab74c7878398c6f82a1af4c9a1b28753106ee2749f2cf7af530fa7b0bca6b1fab24949c6808d0ac8c8c3f1946db8adb878f7c9ccb3e035830c3c1c2be6ba2af35b8ca7dfc861e3014a010f84e090718763d021bb416957861d0eef268ea5efabb815acc3e1774f05ed1926bb48e970129a4649d28f5e1231cee178322dcfbce413f43e1972385aea9b2bb9fa4fede6d220230e87f96cb71c3b27ebbd0c389cc692b4f297f10dc7a441498275f96f6fe78653780b6a845cd5f94e807084e428c1165aec40461b4e7d92ccbbab28725321776c389abab832f2eee2978c885a48ade1585dafa9bdc49860bb886642861ace6f72c34e9e20fd3aa36390918653f5c9ca3342a4a706a1e1a42db4fb48f598355dc619ced526edb674944a4b926a84d8b8a1e901362a7014f0404800e420c30c87cb97ecc43bd1a42c2732ca7092d1547fba659bfc36194e49ed9224ecca848c9a8c311c946b3c3158d8e02baa840032c4701293605249e9c7b64c18869374a2fc887f8fb9a632c070ceeecc6ad2cae95097889a096a2413d458401632be70d813dd196fb252ce464870e3860302c007195e38870cdfaf999496b99876e134b3267be336b23423a23672638b934d90c185c3e7a74513dff4862bcf10938c2d9c6684b4ebdf1042e9c5ee6568e1342aabade8fa6d5b46168e25fed56de1dfb45f26030b27b9a4e94b16a5de576f838c2b1cefede4aa9ab04169df0a47fdcb95de4d28499ab0881a7a055ca4414615ce97a14e9cb45d9a4416512b1b810c2a9ccb64861255593fb993318583c5982461b45c2691c249b4f6935464acda84a42c6eb4086cd4d8c29d042124b8718343123721230a675f930471e41899c1000ccc60830c289cf264af53a2ea785b58c6138ed17dc5af4e2ba2664420c309e712b446ff5556674870e3868867916adc952dc868c2f132c65862d9f49b993c292890c184933ca34a5031ca4965a1828c251c4ec986cdf8b260d2af8473c6494ad44b2ae84c56414612ce792755da755ed8341151c30ad010c95183032359649180193466cca03183c68c19584860465256a420030907bdc14f941275a3792da206023292a306ca38c2b9cb4e939c7b622b3e1135c591630b194638f8cf87f8a82e59d369ea9620a3082793ee5c4d8950ef2123c2d94c53994a292cae960a053c10a20119433869d816ad273256d989885a020119423808a9fa558252b14e52cb08c239df24b1f246bfb72045813b000424a1c0456400e164c25b89b96264ac45a68c8c1801c8f8c1a94ac789716137988565f8e074ad799258ab6c5237193dd83fe334e789b68b800707211b4fd2569562bdb583e3cf5594f1d3bca1611d1ccb2e493f2767decda1c563a600e1c0818ae3b8d15ac8c8c1497bcd87feaab7522b0ece7a2ac534cc9a3062bfc1412fb6966cded8e098c29da0cefcfa5449528383bcb2e83d6a2e9420cba0c1714b54fdec85934ea949010f847c40c60c8ead7f31975f16119b89a885545595cdc04202336894f641860cce6ec265caa5444b5c2f230647ebfa50dba07a322703062741575f8a777f21478bf18ad3452f35e1f45e5cf55c716d9b24a93bfd62b4e278a24ee9db662c8b9388dadd0c2c1a50108e12a0108bc18a93a50be799afda6e6b11b513b80db3195834202dc62a0eead24acab929a60e550c551c76b57594b8e637e918a93865bc693171f52b6a490c549c648bac983abd54c90c2c1a00023242821b3744629ce224469e94cb64a6385b8830d124614e7b2ca538052d6d1a94b0d5393f294e6fc2896e324659a81e03e78318a338cc9d9d94c2e829134f44718c934ff7ae4ae7ef1b8a73678a50f2fb59e80ec500c5d99289dd3e62b75c2f9f389bead59fc99864f7ec89c38c50befea9232e8977e2a8d1ec4accec54374909278e9bbdf1643a258495691327f9a4696ba5d555137e2186268ef12dc655d634c9843213a7785212ebd8ca3e2719625788818953a9946942df05d5695fe2e8afaa6169c4c532dd12a7d2959dbd6d55e2b4ad6d319a899546bca3c4612d5cfa6e1265c82ab1f4ffe64e12c738d9aed48eac1d153f28c488c449664dce672a29a8a6ee2071deac739a84aec8eb7ef788e39d05216e77ba73c4493ab9e3224eb72c095f234e315cf80b42451b0f25461c5493fb65d5c6dced2ee224bfe92609d69b255c10157172cbb79b7ea39dbe869888b37a699cd013ee041dd6126220e264eadf97513d445ccc28c438c4517e4bc574b726c82a211a82554d52978a4a825888931eb5361ac48e2638429c0493ca44e8957c96db208ed1f7948a21323a2e9d8238b928b14d1e37e5f61926c408c4496f4a13eb4f056d1e2302e2645be1cf527a3339eb3f9c7f748d5227b64831d50fc750319a9216f564bcd687b3464d7f797345dd6cf1e114fb62dcfd4b269fda93640f277135caf23ed3c351636a290fa7cc50a7a48626956412443c1ccf33680d1a3344acbcc3c194ec57b2624f7017ed70feb73071f3dde226d43a9cedde2e479d0a5a464f87c39c50eae797de24b19910c31bc498c3497cae9fda50829ebae4703465caae1871389f76195db24fded92e8310030ea7b0a27666f4ce5598450731de7052828929ffc88e13743d420c379c52b6cb2f57e2a9254b1662b4e11c2ac3f6c5f82b3b411b3522703783186c38d7553659adddec7bdd104b8010630de76e2d4d33c94e79996a38c68dea12b5e2426759e3c606424c8b1869386b9e6b892e27f3448d86a3cbe5910d3fd2c53fc3f94daeda24fa82127da1420c339cb2a55d934aa8c625b1b1321ce4b9fa7f7889be3f22c3c1e72d9412a37a731bc3298c0adbbf92c208d9300d31c4705eaf4d9b2bb4a5e5cd0531c270ba9ca25263cf64f01f0cc7f0bea943dee9cc178ed135e7a878e1fc7b66f9d737edd63c82b2a0b14688d18593e993bfe2f7a486bdb9701236c6cd2735dbcda8b770304198bcbac992da64da32c4d0c2b9d692d41b53bcd5f19318593826d53369446cbaec86701c101084c36bc4c0c249be8ddf2689caf9f75ee15c1a43ead749b71e7a2b1c7554aee9305153291ea30aa77427fe29b9ebec664f418e1ab683185438c6e54e99d717efd2838090600469113285a39df42253caec27bd278563d674425fd07ad205a1289c6ccfc4a44abded26998318503849a2c917d4a4cc355b79c269f3456fd73426c9a0e284c35f12c34273e5f4cc36e1f839c24d05a997d562c2d93289eb16c4f72413e6428c259c45e9e768592f21a3e9410c259cd2786d961126cbeac783184938293196d83a19128eab72ea7ef7cc33fe231c4b50923e492ddb6c0e6310c308a7b7b89de6e56e629b8883184538e688129745fa8d6c4884184438cbae8e922f4f50e2343186703e0ffd27456b897a199ae068104308c79e516f39414138989cfd96fa5a77a68070cae62d626ed64e92f51f1cd336679498ec0cb30f0ea3fdaa2c553a398bc5e8c16934499f1b83921ea9a10508488fd4d022e9420c1e1cd62c9be613993d8450093176702c25e554dfe5849b500727f924f9c43caddfcf33460ece79994cffa51cb335c2c151e3d77de953fe1ac486183738bac8d1d6a0e49262e3d9821836389fedbffefa8cda932c428c1a9c94ca57d2932c67f00b0d8e5627dd9df598daf262cce0d82683ee0c9b35c514951fc490c14914bd162bb216448b1b2306e7bcbc235aba5d628c890183d365bbf79eb05f712e3ba9e669192cc66c5c717e93a6a499941a74a9b4e2ac57924adb6b65e2172b8ee9629fa60f6162ce985ac5e92ccd5c2c19454765aa405b3a4d2a4e9ba559268608d323a2e22449492ef1ab7f0ae8290e7aece4e7babf4488a638c97b9b269a05dd3b2ac5a935af6ff6aff279498a93e816c7c3ba519cca82bed8341fba440618a238dcdf9518c4a7286d9b0ac5e1ebd2eef3fce54d0b8a5338513abd927293d2fdc4292669f29ab83167578a274e82028fc4a81452c6a2501c0c0302411083000424bfaf0253120000000c120f860332a1542e90f3001480044838284a32361c2c221a188ec9229150180a8583c15018100ac431104541180d9440a63e9abcca0b01f330bdda343407612c2a34ca67d3c698ca6589624288b64e6bfe540dc138937c4498d2f2dfc1ccbd401ecff1eb31ffea839ffc2cf4a44e3e0cb71f76b83668988f0f2fc04007aaaa29ab6f81a29bf2625465e5d7cc7b82c6c5fd4d7223f3ff87a696cbba9adb245a5b8fafb0c7ab687880b902a0970140690023aab3cae83700a4c4ba556c33b569ec0d1c00693719809e0a2b2f033388875c6ad8cbbf4c27dc05ba75863e2353a1b6d2e953b5a136a0d1ad0d516b0935dc9fa825c49aafb9a8e562b74baa7c54c748143e8d00ba3e8fcb8e4a325254925075059bd90314dc75660d5616386c61c7552b72cbe0c36e2a14b3f5102a8281c41cd8809bbd773fe1443b845fbe878fdfa139c08b7b1396e72ce30162f1ab59bc36ebf30f6b0620fc673748321cabd6a75cc505e04e1188857903fc29c632e0db9cb3522216a1cc41adf8cbf1087c32b58ccf26b985714e36b6460ec7e90adfd1d4263bb1d8ce23d7e21c159bc70da5880eed5f59ac989dc31182bd97525ef034b1dfa706da468ff2fe98a76179033c82b1182c8c4e3bf39d87e5e8bfe124107c669ec57ad43603c7377e844288fb30c88141349d7c7ac913ddd718e33e3cd0fdee8186349e644c7434a18c1b66496f4bda821e4c9f20223afec4670c06956ba6e8bbe97d560d9da8ddd120c57af4b9298b869d30f85e14a507cd521a33965659b69810754c5e544a20469258613a5a9d67f89cf012d5c2f6562a189917330e9ac2aa2355d4fd82b9a7cf896d28573879d0e20d671eb92b04a7fd37d074e4e7c8a7a9fd173ec00e1eb0cde3d815392c45001a9b6b0e501b408678820e7695e56165ca89024270091c00988f152893b49cf4ba865fe99cc4e521104473faf31dde8f4d3e5d504dadc9bb70c7f77e960ac1d33e58cfb8b8fa5f57bc9e3c5aadd51d0aa09d8ea034410ec0c92992073d91375d05caddb99cb3c6dcb5687a44958817cd8500eb3c153f59b8845594d07a9fd8fff1808dd82376b435610113a271d75fd2d6b480ae6c9dc05c50b8ca1b3b746a57459a8848e3a0ba362fa9acfc88e888b48b1a985bfd9fdf42850fcfb5d261e0c76230a54934c0447b41d0d102beee85a5941c697eb0061bdea5f0ba15b062a0a84097c0ec2066fc0f82b65ab493581c4ba04899a31405275fa4898013960ac7b55d1094df7ed48b2fccc2eba2afb8472dbfcfb52345ad60c5dd464be730d8d2e22c66c4a838a1e7b6a2ccc14c997356658e12be1cb5d55f909a20e016d577f4aa1b07a2d54df8ba706ecfe013c2aee5a7607c324a09fbe00878fbd84e7bd10bc2b3ebf99c043b5d93d1e37e363bc720fffb05fb3742b2ec376d9ca345463421ebbe6f5e868fd816a5f7286374cb425d57e232ddee33852a2fbe4e69f278fa42a29b30a6ce4ffdf9d5964598169c45550539af9fa72ac2b39621a2c26aea6ac163ee05c9993da52ef56dc75c3973112e6475b2892d5101628694be17b76ba9790d1fc443d2224634a1c27e16a217dfb81cd43bea53e37926d5df1a01818603fb1084eb0514ee818dc79432b1997fc7a0476393740d1b2b5dc9cbb048e4803f33cba331e51eceea84bdef384bd49dcc0d54e86e1068c566d3c5a97b5e7274e34bd983504146858537b26dde025e00e71062fe296370bd92b4a3753894ef0efa95a2afa7e7db83db2f35d72aa7d9d44d331a99c5c689791aab619ed23e5cfd709bfb66ce81db5484a809f287e39f30166f0235f5f67ef89c9d5fada36fa22691b1f16a46c353b3501afd0b0545748c8ab39804a1ab91acb25fea414f151ca67301c2af2fc2bb70427fecb8c568a24afbf5c260434f416ad0d086b9b9022e8e77cdd83b4ac05b614fd2f5ce78b9dbd27e4c569de3a24895d1058e4039e0194b615d106a45b5418bb0cc0d49436727bc0bd7a05d2f26d6140ab8da6f11134d1300a100b8419184c7e0aee15df07cd1086cf47e5781b94ce00d1e65200e912fc84969a23739f4600cdafce0e4bac2ceb76105aa3500083082554b657abd7116acaf074646f41ae86dcc3379563453d2473dd82af353b37ecabca0485082520478ed44ffbf858fb5bf20857cc15d73088fb8be153401bf54b029e09b7b6abc2d1f7928380cbacd3c6d8cb2da025cd8bd4b9f4e7dac227b04c5044ac852862da0ce8d579fff60ffcc819adc5114c4533461fc7fc5f3764f46626b14bf84433fba298262f8458561fc8927d074d43c4799f11a03a6e001bf89658c34448636d9e91529b1cf06e21f443dba888db6f427165855faa86f849624d548faafff37f8453cbbe1ab1b62084422df7c4def4f0d097fe2cee0432142589a11034c55fe9ca26cf73a71c051cdf33885652f21a9d096ccf3d52bf56aecd9f843c8583ea8cdcc8cea03160142aaf4a36ae4a85e08958c075356f81b795ca464342817c3f80fb3947782373064a7b05a14a03808ab7d2a6243c2671c54475395f1747d738ee08dcd153e1fcec3706e291ee1dcd9a2f1d419cefb7d434224f735bffe5569c3235abe3e97ea69226b76f968985cbff0225a692ca1d00bb63632370fc01548e991e762935f4c02d005702a4a76f73d74c1157f6566f2cee01d32c51bd189a3dc560ced83c93ea0f42b92592c4f870de17be24502cdda624bac85b94c35998fa4fd704ae08d6296bf81832bf56c863128e61236884406fdbeeece937927c7a2a83fdb0810c699f80122ae64e7491255a4e997ce1bed4e23892fab79f0364cc6aace385dbddb286dcdc5537376c2a4aac0c25a7f97683a95a22f0da3606014c6998766f1cb96cac58194adda436bed5939f8cdcf125957cd880fd2867bc7731c21fe0834a4a70ebb4052e15d375c8892129bf87a74c29fd758924191c1edabe8f1a7e62aa315d4cc162f582dcf160f0c81fc32e15dd01ed5c81049a8d8a31e3839160b63244e9d2b049b05aef92f6775ea59b825346e75e1ac18c911c35e41921c6eb176e598ab022499c3244c555bf78a1de8677133ecaca5acf5590451d9549b433371cbc9f5141344ceb163d94e43f5ec6358bfbe4a12b6ac94fdd8fd862c3ef238da69bb53b4c4da719fd69d3e8b7b4095014728244cd3087387425973900c6f27586ae7890b7487270e9a7871397487ad9eb87c4f5f5f315a8e5184d21e25626851a4224d5ef2f2084f1d1003abe48c2487649d99eb259e76ac65d5cadf4d73ea34f5c11fbdf4733a0dc016097172ecacea1e731a16b0271f19d161905aac412493c488230fc1c5f9422657ca51ceef5baf71f8dd42a50e79049aa1545c43984226d111b69a56340330b07d77f766682685ca31beb81b1885d06d70b58e2fd26f5431867a30e62a04a81a046fc262f85004b51983c453035c527a0564c4b62c410b9531b2d7bdfc19e3f05c1e8878b7b50664dd92da7c18dd2d15d7a6db8008e3a06fd8c9620384da2f49ed41f758ea6589bc8a9927f92c0354d98138fd362e0d0c62af2fc697c8040310a2c18b9a2059ed1bcbcea617f56c963098b5d0bf229f7e7ff372a985faf3b6ee70178cd1806e4960d40f289850f6bfa00d79ab582a47262413ee2c141eca24641f1e9a2f668ded9967c7c9962d0f6d80f80784864997e7922b4642600d1502b227b75094abbb95ac5cd85ab85fc1950015e3081cb19a23894a4c54b204bc457a38c32677c59c17e5f4123a0cb5bd18d55951c6aaba34afd6f81e1e008da60957c172403033258e0e8143feee5b6130d730d0e7f369dbdb635e48d2abd2620d327b071176e9ebe808f6d62082bf46cd440dc2fca74c04796b0a41642a9ff2511afb199eec57d30631af4346d88e7bde561b2c8449ae849d54ea6dd28257d731a068b8e17977fba000f8dc0208c122062a16b7be5de8f5631aedccbf689bc3e8d32490ac7b90a9eb144cab10324e6eaaa2c61ff681ed42eee35595e4f58ea92415fdf30d4fbd5b430650e3d1a69ee011903da84974c8be1eb8560d5cd7447af4f4888af12198c733eca56884aa3ebac86b1ad14b08131967c8e79e1938112527af4219e9443bfb21b168c6f00110339042b21e7b834602792d18ab3bf22851a999cd413cb2710d85106e2914e521ab9ffac41412785467c6c92d2e2f5e2f06d1e161103f92a98779d048d1ea1a7af86289f08157812834fb7d8ecd7e9a8a4254007db341ca51ae17446a1413fdb0bd4837790134dd9d917831f60258cf1e758ce79d59f1ffe24111f71699479514440cf082a8819505559ed0899005e12f267c591cc330e33042a286e76b02ca11bed550d283b97f89c3291fa5ea7d79b8a0f539f7faa28111c3dbbf81b2a3124bee52dc71011c63a05bd20543001b49aa252ab3b66504a2f167b3f2092c5b942b902fff2878f3dbdea2d65963b1de357d3c9e2f6f90d0fd93ee8a11bbee35daff187a9cccd4075c0260cac1ea8b4b09aecb8d13934046f051eb4118865531addf14f8f0c7af148f34e084d2c3bd859a4e8e29a7a903f405801854f56a750dfaee570555bfca5476626295b39aa987af79f88ce90f5d3ebd8b35b255baa347c72df6658d934ff5c76cda034cafb5a92c72e3cb8c410785bebd7ea03a45230b588afaf84481ad2718cf13d4d10a415408ebea7801c3ca8940d9e8d261c8708e4890bb60c71beaf720ece41838634cf9e9a93df964379475ed4e7829bb8ee66c86467fe64670c7b4aa394980cc1a433e6ea0aa160cd2f1b459c37bc803701dbefa52f1537937167c4c28059e23169e9b5a9998ddcdd80a1d792a3cf8437dd80b21ddf0824aac28280cb056a4cb11b169918ad38a727b14387752a903b7ac1e8f023581b50f59d0db4ed6597e417c319a54eca8345a1e77de7fb9684395aa76dc5b8e4e320ffca30cd79a697318227dcd002c7477ad981d15cbe2d4247cc93f423dd5d8a8b76efe1d78303ee65660d83a40ece1c720c94eee504d0035b5c6c16b37090ee290487b34ca161b434a6ea76308c86f121657abc0c17394d18d0e9c37d075ca60e91aa37f8184a6cd83848023838b57a5440162fe8f8fec701fd0db2b264e7dbe9f5e197c2e3d2d705f04c8925b0ca020f9952fa690db79aa9bd815f8bee8b56e4891e850ac883fccd0370c25fc46a0841de67992a2a46c7c054945422d73ca806960dbcb40708d58da37321984ffec96d5594bc72274c0e8288e5c694c1e3dabc3280e149fa16d8dc99990744e5680002f26f387150d8d9fbde504b629552d112834ae9f0c881872fd89a03df03b840870648dfc70ddc82441b62db3b7dd20a1cec24bf8724db000ed55ea316882a58f079f6d7664fd7adcc28db2f5952f957d0e68b43de07353d3faf56a9799838143d2214b264fa19b65e8748fac1ef531dc7aed7c7d058e1917a6497b88a542cd12acbd3eea19c7fcc969cdfa3551c543f19ecaf653c0e5f3364545cb40ffc3496054276fadeee8baea2856b5220c676d6621c03a5ff71e53d7e538db8b4758aca4de0083d469c58bcd6127da38134401b482935604f087afcdd64141d5852dfe0aa53b9914bebb3d164dc72f836818b458f5e36706420999e7428561318d8117b5db56a5b0e915657ec9c1d03a8aeccc2830da969f2a97c10c24bcc2501822bb2409dc38d2aad08755e8d8cec625bdac13aae49794015d1d38b9400d79ae04e411505087651cd12948acd8ede567311b0e973400154f78d476266c880f816de4285944688c4c420103e7904845143705f11a6be1ffb4ff5e84c4246a6a4543d35d7a3348fa4b0c8f2ff9a3b8cae88092f3d05654611bcf06493326c3c54702cb0ad68ca892e7cccb25b70b823d5bcfe2a2019c3214011b43cb4abd9315e26df00af33994c69d5ba385647b0c7449ce12cf5a0be2fdee3b002e20f85a0165fcf5a6ee9dc097284b5f6dc252ae7b629a2f8b4c7111a96c88694402b36824e3ab59f6660467dcf71a8b10a1921cb63ac1fda7a5a447477d6ba2b5a1d7c80031f48e9d17d3b4b60685fdd650673ae5b5616f59bf3e93ae42d89821fd74a54041b2d355ea1cf294fea3ae8a84302468a8586151ccabbbe2e04bbdc775e3f762c3d0a34be65814709ea9f66c0c244afc25b4ffae14ec93c54eae8ff19ab4b5a574ae4353c692579f3abd1f50ed52806477d3639d8a66862fe0d8b897026a1099fc88463b3a2daf1394b675754015f0587b3c0078387b895f5939b0d43252f18ecf59f4a1db45b54b288e627e0c63be7781edd191454fbfcc0af2f00d0ca8969bbfa3166adb95094c31f86eb9f751a638565cb23dd1c5e306f659a53d695c9f5f498d01c5cde5b1e3a36255f3427b739921e0595365ef308c938e2012c3a10c19073c3a5c813430b5a15f9474b1973a729c206236de8dcda3ac5120980dd230867929b93d6a6f6e24e93bb76e3bc179758333d4220a12aa600c0dc61a17cf568ca0ead154a85624792137ff17ea051c0647d51f34b291c3433b3228a5511619a93695f21061935e5040aeef44be121125196e0b6cc917ad8f4336628151194b22e8b56f4e34562c60380be22aeb805c84d768f76546d32e6a42576c9c828166589104c25543821d603c907b1cc086ec21d11836c29c777e333fc848d4d7a99e8b85665614ea4aa7dc781713cca8c656b0fc1faa20e6721cdddd6335625cd6fedf9ac596ce42e8cb3b5ad54ab5729f0a2fb3f24e28856c2f7de342c59111b8605d7d1b18c2e8b2a029eafd5943672fe21c43545baa89de4936d49a613275d26c4357a651963896c6840d2bb5f0ddf3c7f7244609a17c87c1854c06e04c8c5570b36e3a6c46852c764ae2ef7a961694043e4f5547a92fa4c858208c927b1be83a9033dbb408109ea088a2dae51d18be1ac8eb1081a5f027ad5dea1d3f647b1dcd1dd98caed332aef110340d01cf3ec0708eb8a7e6127810f2a5b7f86e432b3be2f834200672a52fb2911f1e01e6bb96847f4dd29f59abe8ae1a731327814eaa2d6d9b9bb4c1f720d1863db43676c5a7943f071289b47567f25514c7176baca765f48bfebc84fe335dc1a83bfec45c0febb99c7780967e4bba1389b48bbb3d3e0c235f6e2581010acabb92a38af2e6637d8836a76020b120318d1a119922f7a650f9870611a011581aeda2e0862994aacc74adb4a2aae391d911aa6ac4749514e2674b05ac0f47811806e7171ad5852e283662e52384dd0b9c35dba924621cdbd73684c342ce987a9b41377af7530338f2d5def2d2c13630341559066c14cc699e5341251cc41f6e785a2a0e429edb8a72ddaf73784827c6db1b5f0295f28bcf2bc6973bf4e5a36b7b07733095422ae3bc3ab6cd813608937cb353c538062a2aa2a19fc2290a1d1675fc612b5ca9a7e364c5f729a13cf8ff5660c0b66715cddd3355f10422efef0b93ff886d94c3578d2be236d4ef9fbd8951ff726dd1481c2ec2b9e340aa26f017c67b1b983653c8157e3e43c1fb902b22dab1d9f2ef74a74d95f5769fd732afbe9324d7304bf8577ea51325ff105b248f49462680a16e121bfa1f11d223ca60f0b8c53512cd3ca207b6ea07df0b850b720f5a8d0712753269440fdd23e2c617bc5822f08845f861214b83acd4bbccd5a13c2df678d9484e5ef12abc0df7f7f74903730d731344301642b382798a170bfd7df8aa2b4afb984639c9bf780c33a69f3e05331cc04d52807350311db7dee182e3ad82b4fd8c20581aa90fb4231e1f4175fc4d15fc7b68c4d9226ee03c29ae1f696525c7cf86bbb216e143135d328305afed0d58dd0605b0fa89c720017094965465d2e16dc883a66ee2878f54b788219976fe50a50425088141fd415a5cf98018b673a270333153049cad1c87cab46cd41833eb8307822095a73ae50f79f0d5bdf5b00d2431236bc0c834e363a2ef00316f0a4df1d4b1630e1213fc2b356840a22c2ea701eb467eecf8c60b500912d26eb1a6342aaa3c1431f0c90cd741c29b537c71b671c3ab82d375cb57a4eab2843d26ab5439258bf8d4b561cab8836fbf45163d1decc2149ad2ac5516cfb4b1003498397c7b2eed075bdfd1cf3868d1c4e520c197ba63da6f83004427416fb5ebaa0b93469dfc0ecc760ea6928831807565b526f84c42adcdc0a0758e48208f088b8f780efd58251f50ca7e15d17c6958ccf199604078baba925e743044338dee427ea1c6314a1a962d1534bd815f31eb55987b119230ad063426f58ea7c846594073c435b7f13e0f4ba6265554ad7d716f4e94fea27f886f190e1ead51de35722f95470866d962180717cacf08995407574769b65bc7b11b9711f9a38d8602ec9f53255c06b17ca1e1b4139ad5a8864bf9364954861c319050b765c89af93ee9e9f26da55339f3b9abd51ca4a66bf7571941182a63db4caf89884e9a6b5e8838a37bbc47a1e4e6490bde21ffc058e607b108a330a87d0200621fca0c5c82878e5fcb0ae440afb8bc3e1975440f0deb1ef52a548dcb9a08ad8c1f872c3fd53c6ac636d737463014e894cde523753629b5a00b233d9b418cbcd689d197951be09c9e951af2d922c585204144e48f32617bc9c60c6e48281bfcbfd174e5e930168bf508f7774e84e925871138a8955c192f0d1d4dcc71b909a102d598d8cd2415d5c73c3cc706de2d8c31b72cf4458839391f16c626104dc14ee3de00d17ebbdab45ddb9d07ad6869dbac3bb834447cc0ca03225e51bd8c4b14a4d6e484cdc638d2a61e3b30d876dda4ae0f4188769e374e72aea06c9c0e199bb9d43d020282c50dbc3d2551e9b18e39b6ba5d743aa3e39c1d08a3f8045c5764e7c0409323cefb77aad02d40c6ce72adef3eefa2246b86177f31d2862f29c64daa02d2b2d6a5a2ee5d3e7c2b001cefa6647de502f4e088f6b86ce5aa0996ff5b08e4050ff830d257010bec67c84a59f55748c05c651878d3115f8870dbec82453b6eaf1267cd404a33e7dba65c67ddb065e58533c99e84691947f4bf9186c04219403ea175826d1751f1b7f4c290dee5146faef7b1f5137ef9b5c8e247c39baabdf1c45eb682e49d4ce5abf2caeb8b8f85ddd71d2a634a86a48e79bfc3a97eec767ab7c30fe261c52a2b7e8f34a2b15aeb3581ea3e8ca80a1db1a4fe674cfac82380f1f4ad369f1cb955c30a1aaf4fb880903fa43a161b6440211ac4687ece29608737d8d755f834c2f5feea0f0ea6cf3124f4c0777b2a1d7ce36bbcd9b511cc489febc88fcc9d1d835390b2add086d8529f896b1c92c1bf95714bf32903832974def9a3f84065ea65a824168c841a4fc5dd1c50b6292c1a24816874497308fa282e3e2986597a7dc094056314927e58261baa857b9a93648aa390ffe29192ba7a91de02ca526a381fc81153b8955ff4caa500559c90713ebd4a763c1511d00a2bf3ac90fdde9f6288957a36690db670c276116141319ab543285cc557a369c898d8ecf047a143186750d5a50393ab002d6b5249171372dfaf28a2d5329a13a68976382b9ca6347f5518f0a4115ac471d076bfb3c128d56b44d1c0cd03a0aef9443312e041ea3db9c694c2ebe2e075ccd0f0bf9bced7d1fff4949cd3abdc796b3b65ab35e1c5cc002c2ab6951a75407dabe8522acee624f70526c7b9d440739b941d830738929b8b712c89b4f0579b2336e3352f8e23ab4ab79e649053d53c11ea1320672bd56227ce80662cee6678aafdb23f1bb62e49173d658c9bd84d73835e10a6480a007845d04e6ba29853e6c0f3175ae115460b02205fa5b2a0541884ebfc7b0211aa0e3edd4598d1b5929a4a834b7b808b2632cc99b8850f9fe66f36986b419fa91401affe78a595d7319779dd494f9501ef2a0656415e8bf8f3629b577fa4787a220abc06d56099b669f22aab05684d71faa7d36d9d2a7322a5d3459d0c9dd32f974de7d45437ebdb1ae59685b612fd88777d250f40cf121820fd603e1daf7351ec25ac085399d430ae8f83f5c4acf82992ced041dd8f3575e76c97ba1318e799fb3876140c0fda4992958d5cb5d11d7591b41c8b1247f49f94747a0bc689fc5be02fea7d79303e7c84e20abc2685fb3a5693d9f4c0053df4aa2366618ccf04ba5e7640a4fe45e5c4543553db892955d65e96fd97c1893008c66ea1c817f1ba7337db7db40905662b91119fb0f00d053d333a739845f98fa852921e48c2a4141713208514589a555cba79480dc1813c4ffd74471c5ffceede0f5c89d8dcbe3be9277309cd793fd6dd882d762cfc7d6a65d92982be75bc92803efc8cc07176cc458b332ba45e03a27bc2d81ef866aa304369b98d7aab699b8e72cb6a81bce2bb3d769aa8c608ec06ca07502447301d129f6e02f40170a489bdc0d43d1f9c00324ad6d81e0c5e288835413a8e6dc4a50331020192a62287b73320642556a2956c944140f4c0169267bf5fc4936ef60736344f7291d3c706bf164f32023848afe570afa32f446f5a1cb01db486507d6ee106cd4cde36e0374d8b3247bcfec7eb08d6a54e1af3e03c2897a0066d88a6f04acb85764994ceb6577f1930e1e88f38da66bf58e233d5056a4368c18b8906611e41dea716ea5e8b73c7454bbfa2a8a6ef0816811e27088689ab10a098e9daea26b035b69171b34ccfe26f2fc9f4fba305f00b31ca2fda28ab40bcdb387a32b7a1fc8ab4703240467f33a51d5cae19553e76926cb535f6310780209dcdfe76c30ff6a1457ffb0f2b6268f78336491f101cdc9aab8f5863c00a23c017cca0b9e2a328ec9f31fad930bce91aa5fda08b35c4bdbd2554de9287520617ccd501c8dcf2d4cec8bc6c2e063adbc4ffe125b2d41d0496f17b0474d04ad760040e04cb97197f66449ebe1717eeb8c485cb381d986a717007dff857e92478026d1a8389a36f2ebf1537b55e689f5e47637265a04ee97692de89024e17ed3ced79082d338713bd74fad595306996870cd8321c95f06ee6eda1ce2039aa71cac164dbe2cb11755dc81fc1dc1cc28e8af6d29465fc3e3d21ae4a7adf7fb9a1c6605e7c7e9a4095a53a04030af2716ef4ce7cbac71b938a3b584cdf4f3e0f9967c9c07bb8147a7b8dc57c744d0d4ab79185387589b1862b9a89abe57c4deb591f630337cae9a3cd009f46a679dd6cc62704e994da150bdc496c4e1f47c0ccba13c312f2131b7a041e1832f77c65fa7d00346f0ce08e4987b0c85cd498376c32b7e23e487e00a22ec008455a59c9f95a90656fa32bb067c8c38617372fff1550fb24f3d16510dac8fb186a4a6cb0ed1626ef35a7013ffbf11b51f7333ce6606d05a00fd676257269c358414828063288289c2630aea4159043a6473b02805781b7930a9473d3730491b3a6b0b9dfa1d22ba0f28f7b7fc0efd12276ebfa40c3d41ab3be9932fb2a9cc1c7407aaed20b5b706026cedc3e68ba79a459123370ca9d9bce72e5365c07861d2d1c1599c38fdf152ea41abdaf0e7b7a8421f902a62fc65c675d46d96ff538a6aa7b7f5d3d871b6072e304ab301ad41c6d01cf087f2d3e8e693651dcb6d1695906101fe0469e356ed148315ce78cfc3f1f8662c98829c8a3c612ea02cd36c8255edf17eec88e5b5ac10d35cf502d967a730d9b12803e4ae56e6e7dcfaefebf95644d6745fc83f7b1dff4024a23ddee4c0af28db4ae2da5a24a2f42c212214b61953b536dd210e11cbef9aeeac58f3b447a6f1e79121135776b200e5e2f966bcaf68f9e2c23b8e32a7b832187b3b61c5f63fb48d5a6d4f3c9e5325ded985f489c0f606e204e86b6ed25975fc92976d3f31271dc21f3f2042e474f0023b2724f5929b2ac288b9ca09ec3376839ee4891830959d0905624ef9490aae75002260233ca2002b68d5c883074e1c77f58c308bb22124c522504bf7ee2856e8a2b2feb1721f5b8d632a65c7fd09dbe5caf4d42c1e4fa4968ff21eb3ddfd68c727b3132c3bf6aed1a1ac82c2ea729819a599f6794b8aaa291e7e25ea777ee15c9240a411dc47fda8177da5b5968328a11497cfc8f00df3b5138bbdff3e7576786069448e7d5c99700871228bae813e265080f8353047a0162614c7315b8a96c6faa233d30b056ceece4008d1b30d05aafc59ef325ba695ef166441207d2e7fdb8d05584e6339c9f1403ad66e5281eea51c49c9a9288118e9a33c71b868c131d1ee382edf1ec22d5ffde4a50f58939774a1519e47402dd3b8bcc0922e75d47d703c28d6db5881c3da5fdb7d6b672b3181b29f44ff271a65ce76b75544175e1749b4e4ba0ec33a4a7dfcac9a32abd2a082a559fb52c6ab2ae93f38067cc3b459942f48e4d88bb5c358e7b5f41c377f7126a16cc34530eb0b26708711631e1b3c50afca81c358bbadad0654a237c95380b14a1f7be42be9e8c5113f00b385ddbe253980c6cfb4b0024aca15168007d2e651e4ded54b67bc8c42e9eb1cccaafa79fbefbbebf22f8339ffe81b2f9d29212a3d33f749058c4085df803c7cff0186bc7159284a7955395f3734783c297d2ab097fc5cc78c0258902004b592da798642928488a118d698879fa1da22661e07266f35e7e6c832696ee25c348a729a8a915e013a9bc1a6fa44d81c3cfcb4f89fd565a6ccdb91033227f8f693126c01e89b0a7070e7ba5e309b333b0cfb6aec8a5bd1fe2e001e3f44af9e285848707e747845f721e02f463ce5c88416b4eeeb20ca5e1c74e565d990c94fa8afa689992bd86a5a4f710922e99ba5d7d7d29d211cd5106abf46df3cc697bf36d1a1135a8d4b53bd84b8210b785fb50f8a9d52cdf741b1464354d87f0aa704883437b63118e7e3064768e83b43d08a4df522d3f1d83d41b299be61f6912c075e74493a1e5496502f1a7efd80959447287a72daf1fbcf29d71c9040a8d3e46d3aa642f879fbaa138737567eb5a6453c70ecf8c31e74763633e1315297a4b8698000fdf7af8fc5efaea5c609b71ee1af0ab131d45cac6b45400a52c8209a1fbd8621dc68afc9fcbeaa312cd9ca2110652e5e74489ffb3ed8b28ceb33a7803521ff1742ebe7daceea32fb1eb3b192e6f332213f2304a18a1f494f3854c502402bbc41ca0221bd37ded405a8628ad30f4e79971a120dde190eb375de48b483d016b4529af711c607a5e1fe3bea766f3b829e4db580a60ea4d50b350f7621c2415298fa82bf6ccca08b8d5b05d3e5ace0926276d2212e0146a703f7f1d645f54883268af380922abfb3af9b46713cfeeea9820daaafd60bc6eb82ddce5bf6037f750c9dc8c0060a845e2af5a7920a198109e9a5f98b1d068f99f3d393f1b1c5830cdda236eb07f914bf75396e9bff48963373ad4cff7b30d997849ddf6e7e241a1e07382cece108f3b167b2ebd61fb4199344d95d2591d37664bd1aa32e1aafc322aed4d8593965752bfee1ce709c7b683764c4242c34b25d3d68a601be852832b36683068b3eeaaa300754174d8098a3f515f8549efc8dbff356e5e40017100492b302c37485cb9f4198a5003d60c432c7cf8c236a60ca52246edc45c13625e2ee4f6f1f2af8548825a36bfa3c9c0ac1264cfb7cbb75c37b9aec5952b9326ea01f728015837a5795be7004738b32c0a3a39c12532226eed4cd230c7b1d2a0d39cd8453ac68bbdc0623d0b41abed2126ffa74b3e43ca0a10f37fa1e880907c9cc3001b3703cd5c467b734c98fe28f8aa561f34d28b76621e906bd9718b81cc0274af54d481156ab2ddb075b68a8c6876388a4e433d9d9e634114251768f4533394ef12778194687c635aa184bb33ad21781f129d32699a585998a5b626429faca4a89b642c874c30a212fe70a19371871a8e82f3ea61157b025efe7059660acdeec78e5de073599356a850d000f49b9ac4c9230ebadbc828bdc95721029cfb4f8822f2ccfa81b9a541becefe2fa7441ae7e7b00c62fb321651c907efc9156db4a3571a05c47b4b1591df0835b5e38b223d026dab60ae0ca830b655736384b5feaa5e1eae9345773a460fcbb0f3defc1dbe9e7eefdf2c096f8ea05b05c345555af53112e537e19c31534d0af19707554d8764b72d4f6bdedf5c26aa0939d10829fa76af57bee4328e3ddf14a0e1de94b15404db623a90aa5bad456c34891899c88f99474535f04cc9cb60731e0996db70bc90cf2f08f145e306901208f8c6b9051653ee76cc0c317970d95dff6cd821b100166996106fd18e1139cd530a6fe74432d6d836ecb2c70eba46e501a9e5c384704ca71a642d60ceee19b1b151b7e62503f503af548db3323b69d43b5598afe06dd2eed239c2e385d95eb0a9aaa2e7362c08c163c1762347aaac3a1797dc64edd119b17f38cbb89561f1d7902381129c86b6232b21ec30d293b341abe9d949d4aba410cde8616b7a0ae84c6c6d0d7101fcb0b768e83995f53f1931eccc2159c07fac3d0f78123e9f5b03cc408278c42a646dd034bdf97abe84010784bbfabfc056331666d4bb1036ea764978cc5ccbfb5fe1505c9659357dc35e2cd7714d3924251d508ce93d885c2e5ffb35afffed87a746973d0891b975417d9c6d34a0394ee16e7bfb022394ed41bfb046d0bfc38d7e062140c6e45a6da5d6406e0a937a64b3c6709c8c7119af43faa34088ac5c016f66e2ff83149de2480a60733cd83b21dd808a0837525eda44bc5a0a1482e2af3a22d59add130ef4c3db5615bfad6ae695b5d3024739c656024fff4b4a64c490b7dbd92b1b066a89b4e0e88c6f89c19be0808948cc0ad2f5e408b72020d0da2fdcd46977f5e1919d5e993336bcb839bc9b5bccf1c89b451e01b70a959d6835a2a2f08abc699b50f3224387d3912f57f548bdd3c9f9a8538a6c9fcbf3e4ed895eae9f1e94a959c103ac0a97c559c1e8da4fa4c839e26f891db671217d9f7d89afdf7130aba1e7aafcaa8f45cb9897ed51bfd89af0d76bcace30860d40241bb88c80690c933d9d618f202fe61b5960bb04b897a21ae0871ce704b47ab4d91c13ef6f04bb0f9bcff56b27c0b5975924d173285b16e5378e8816c760f9458cb049778a4d7819d40e89012a089048fe39574d512ca4d1d20176592b94b009c92e0aea208b125d0e4998051860ca5d4a91c74568410e80cd32face166ba431db10f19dd298c6bea361db13b8222ee572b43a33d9f4121c05ec39f5378c7003cd21d469f7ac8b690dd9b7aa1705373161540f6f2297d2543f71d1e4d9c3aff01af8760d4aeb5c411f2dc4e891e3f48721399ef0c7283bf510186131dbf06d777a9002eddf36ae573e66f09ae7efd4f2ced9f04f661d85dfe367835cc6311797cd43ef2a513d8d42a751c62522ec478add9e8966065be21031c90551df1c5198c38f0eb3f2c792d9ff43f6ec85e145150aa3d654a927db41019088a358486e70b3fad7b9481b98b3ea88c7f913f48300b522aa934380bf748f1344b42dfc68b945711c66dfa74b6fa46f2bc07c9a33618b959b55a60071ed0b3722693bf10589342ae92deb553c163ae0597fb72ef457f0e87b94f17f3b0a84b6243dd7768fa5930cdbdd9b28e9679695a8cd5c19331bfe8db202233a3278150fccbeeff1e94844ec47f57ef3c08b8edc23c2af7c01591c5ac3a53a8c716e4490da12f10d70ccc3280252a0786b17f2ac5ed9a32dbc35ff3fd37ac71afae8a48a093ac27a71f757b552b162549052717d5244aaadb07d01ecffd31ee5c7ebefa5f35ae73cf4a4eb04ce35c9e37afc6018df7d48a76d0dab3aa94585afff0e0b2cda89ccff11386ed169688b72b5f5705d41a10f986e03157927e709487fce535a09a6fd6ed610dbafb2cffb1b79d90d70f2bb3515fdc15eb990e7f1e0ee94f92ac4ecd2617362eb3baac1b8111dc2330c33f3a76414c9aa103fa781a440fb42a893582970db927d4dd55ebd6240a2af78ddd04d6cd4e3160aee36d1de51140a2dff915cb2ac0c5768410722fc84e202017f6af4124739f1825bd2a81e119d0cd80fc2a777b207a41c90aaaecbdf7be3c53424d4dfb22275b0024e9159150f5c01c5e07acaf7613c5f33e1873ac36774081cffc1082d2ec8357edc802e6c1f629f94c0044aca0fe62af2f19edcef49a7d82f16272c59ed850612972e2c8778dce2f1622242e81203c40a755190789d3115da7ff081904b2374082b846994c865b40582a2b11215204cb70dfc1331d598fe649240133c18621b030687f6790344a52350efeff67fa22baa95c894191a8ab0182ba1b03248f44e31bfc0100fa0868071e900977d132a5410f56f787066893e8511446bbd9af1671a8f200af8b215bc7c0e20cc62bb603968e2723d086ff3c1f30961212e4c04f8bc51a249b7270e196a03a56c026af43fa63830ec34e903300cc3300cc3300cb34c2076fc56bed91faf2999e49609012f1c23b29e0a9494529232a51473eb0220d8068084b046d6b43e019c0a500a080a68ef87e93cecd0e7fc1a4fc3cbf14fe560f0a8431f85d62ef520d364cad0a155423d9e9b72398ae77368a507194c939766395b1e7268a308cd7b2a2e2ae3ea1187366a9f7069f2a355b33ce0d0a8e6ff8c4976677d79bca155fac14fb57612fd1f37744a8955fe1e444e79cea30d8d98cbbaad2537be2ce8c1863e35c9d5af5b905a84a6e0b1865e78b652beabc3e39c6ae8376b7c0be39e73f692471a3aed66324625f59aae88864ebd5566e1e5d25a76f90cadd8a0b59c548b199acfabc3f8860b21b3aa0c8dd42e5ebb705a501f3cc8d0a8f6868ebd61be933a865e94500fd142954e0d8aa119edbf2d2e83879a1e86fe7c46a88cc945d52c058646c6e41a5b94d02d3ef785569aba4cad94c8c30b9de61c7f51babc5227198f2ef4820857a9c2c5dfce7b70a117a4baa03bcbdca8bf7a6ca1957ea619b2529a6ac9430b9d94b1dea9e3e68fcaf3c842ef22c4cc9a6a3958e8b4efeac60ed9e30abdef494fd9fd34538f157a9de99bb4ccf2e7ce12d201f0c2a30aadd8dc92362d52bfa8639e64713144444444fa10e0081e5468db74e6eccd8c627226491111419382c7147a41462d49f1a2ec2185467e43bcfecd2562a4a2d02af1e269ce3cb19d22bc1b7840a133253727a1e595f35a0bf2c0e309bd14a1c53cc5c513ab77c22bf56bade59b37a1f1182db7fed166a2954ce8b7539788f274d9a62451b361a3e40cfc81c7127a713242db434d85c72f071e4a688494e13bc8fc2f87075392d0af16155a7e519f569791d0a7d662739450da3b9647e8c5cd72f64fdff4c5d6f030423ba734b84e42fb945c91a8a10e3c8ad0e61c750b2e1f3e9e0caae141847e44c7ac5c469ad4d89d780ca14dd5d15c3b4b0aa1dd2437a7d477d1a57804a16fd157c49e8fc72c2b7900a11d25a59659f75c0793bf8d656d78fca051291e4c8cd4927841896f78f8a0dd53da79a5945ad462961af4a25fd94f93f974143a3729c98b36afced2a46e511294941312dd45bfab6387ae56193e289168186698a0a443176d0c9e2511a651b445975cb4efca94a70b325cf4a22ce9f1fd1bc637abe316bd7c6b0d5f1745a2766cd17e7e5daed4e7d4a32f2232860ac210110143472dda28d5fb37cf78a8ba246a69380ada0a3a68d18feccbf036a92b5e25513be33fe5cca2f370aa6557d3d72ca7f1262608c30c13a4e12af80008be04c58cbc95451fe275d4b22cbc9c63fa14b761df023244440ebf8d944a4cd2061db16883d012f15a6cff98913739b1f3800d1b7e2365c980c108093a60d168f71d17b2752623f68a56aeaf8a8f195d3e3f1190a4b80848529c448c30c6284118628421820e57f4720bcaa3e716635d295bd1e8e688cc527f7acba3931c232ee86045f3f24757b6fc19a71aaf4c4ad850f28cc5a06315fdbfd2ae59c3c6975d68e236ca787542c6be3a31394a060c46b04315bd4739d2d467c3fa8649d44cdc068ea444e0838e54742e0b225308f59c91ab49072a3a0ff7f477f57f9d321da76863962d1d640891d9e93045e7497bbf4a5706a2a314cd0bb16baa323dcaa811a18314add4dd2ef6ea959de519452ffb1b3f9fa648f4d8b10e51b4e6df6f62b5b0590a3fc71a49cf64042928688891f239d6f8003fa12314950e503ca0e313617478420c0c7474c27470e26499948c6c421317e8c844af834bb2bc656f51478b890a745c822fe5d13bf7e796e8dbf5ef88bb8af824abc448090e0f9431810e4a44a0631212e890447f52ae97a8a779eb7fc4648ddc48f134461e3112296bfc19296b7c0928d00109943f03e5240d0a743ca29562b338971142c69779939274e364394b478c60a0a3118c68e5bfa8324ad91efde145f433a7d9fedb3af8788a984047221ed08188b65c35863d21aab33803a2e3102310e83084033a0ad12b997596165a3061c245444444240a1d84e84d66cd4c3a89b77069c7209a3fa54a7c3d66d134d4218856e64875f99d3b02d1eb76195d298fa6251b03a20dbdadfc472a828e3f74a644f33783bb2c6913caa3a960fdd0e910d3112a2f76120eb41c28276574f4a11f3d2575d2f8f18239965743071f5a2d7370d15d0697c5e6f20ca2630ffd49fdbe2f9efeddd293a899d48343a0230f6d66d2929767ff73860e3c343a85b94857a144b3ccb1161cc38188c808504a468ee100514a4670a49c8e3b8c80d16187c6d3c46a162efb68492751b3e1237a385ea9d151070674d0a1914907d52974552bf7eca1630eadfce822cb4b7e736374e89043bbaf4fc8d0d60f7d793b74c441011d70f0e87843af6495663dad41a3ff1d6e18a940471b16d0c186110674aca1ef286474d3b1ef8228a9a117f13a6e18f1725ed199f892928646689d97420a215acc2634b4a1e1caf547072f1d3b432fe99ca986cf182953666873d2524cdef44bbab465e8e514df767163d442647490a1179e4b09df0faba7aa8e31f4224b75b3bf9259f1c4d07acea05b520b5a33f9c6cee80843efadd24cb46c90fe2a30b4fd9b5ae9d5ae4746ef0b8deb95d925ad4934e693179afd9cb5e8e8bf7b3277a1d5fdf8b27cf92c779c3ab8d07f74771967ca84d28b888ca4a43cca8e2c4a49c18e2d747e5a56cb46b27720e8d042f3592ef72793fb9d62165a99d917f76f41aad43bb0d04bdaa56b39658ee9cc92a875a0e30aadfe9847acee9339af153a19452bf1b2b4ac6396055bd0518566e43b5f8f4b97bae5ef58d041855eccd244aa8be2c5f72c14c771724da1d90dbe5148655a3c29d521853e697f2b0feff2893cd1be230abd66164c7f94cb1e75550393131b9b820e28b4529856a93fc70e538d3f27e878423f2f8bf6d16d8d7abd1b25cb2b2734ebe287c6243ebe5c494a090e90063a9ad0b8eb9ce6094dd0c184b695f6fdd3a82e5abe90a89de1378ca18e25f4aa77b5d6b2a0353dcb8282374181191d4a68d5c3cbcab3b8c245e125a10d3e32684cfab3183b0a09cde7ecfca79427df4c8fd046d3dff1928e2eb5f290a89ddde057c0db6184d65c94ed2f655d7bde8bd09aaccb6242cb9dd37d22f42bd67c74b91e57253384ce75d442c76cc105915a247408a1ffb82bf342cb603e6b47109a4d75b1fb5c92dd6492a81da231822c071a37c218430561740081d7a6dca51c1d23514b1974fca033f34ef997a2e5f0b1c3078d7099b40ed94aaf16a468265ff4a215237f5bf2f9d4d2a25250bc8c335eb4f153dc8316f4246a26236b9878eea251a17410b2b9a48e56cf74d1ee8b9ac40539dbda8596e48b5cf4a942c913cf5254b5d817b8684c8ee7a875164e6946d42859671cf8e2166d9f0c9f3d0759255f27c516adeca85f482de467793ca716ad7019b685bb98f78d91a83279ed2f68d197c8acb1a48e5adcc5b368fcc7e528f5b96ea02cdadff032b9acc594f65c2c7a793529fda9aa32430e8b665db5522e67654a48a557f4275a8f10bf7aa3271957345274458590b956f4332335fab6ca8a3646ebce3288cd51afb78a66753eb9a69ba13bb3a8a23121656a4e21b63cbc52d1ead94cfda051a3ca7e052222af4444c880c1481a5fa0a295cd24b5887297a577123593131b27cbc8a6e08b53f4493c275126a31164afee0b53b4e3b95a84c6d0bca6a0380e15f8ab4044a4149d78dd314bbe5ad3a386e73059232511ca2f48d1e8d9245565c76771e5246a252367fce3501580c0eed595f1c528dacf9945e1313f288d7112b5b316d8585e8de048e10e2d7c218a3ecb629e965992d318e750b41ae36beb76bf201afb0214084da4dfa4a58cad65af0baf7532bff8c44113f104a289f8179de845c69b16a3c9139de7e1441fde3e68c54de8203e6b597ea9d38b7e5d4ee6524bba0f5e34eac9c4bfa851e395c90844444444523cf0b18b76b4c8d09b3367b1598b2edaf0e2ea52367bf6ac76bcf8c845e7399acf894da9f426ef40f0818b7666f563d0aad2659c246a6938868f5bb4f9e26f3419cd7c356e1ef8b0459fad62b51ce219ba5bc4f81214330c9e008ef0518b4e64653cf5cb597e919ee4407b7542c6d90f5ab41de465efa02d65376666d147cf8236977ff794d3872cfafdec92d62dfc3dfa1e8bbebd25ad5cca9571b935b0e8646c8c9975f3ee4b3a26699ca8e0e315fdc7985dc5cbd1a530992bdad82b37c6172e57828f5634ebb21c545dc78c3f58d1cc7a299d0f79faa12251b3e187ab683b33cba7318b1a6744b3fc5045a353cb578788f3788d13941c29af34157dcc79dfa4b86cba3ee10315bdd0d49f754c7ab34c5a87e4e314bdd6fae921a3ee7e2ed52859a6e855a6ca2f2dbb7b95598a566e962535d931af564a73c41843056140e28314bdbe1c8396e5184eb9e41a85415fec52dd363f44d1f7ce8b06ed8cfa08451b22b4fc3185584d6d4139193922f800452f274f5ade54a541658b868d8f4f74e69b252d661429e3c713edc93df553f9a23ecf7c74a27733adb5bb373487538c0f4ef4a2ccae5df628b489369b679975b38c870f69a2effcad1ed7b3ce2c74996864347ed0923d3325c56be428b151924a6cd8f031ccd270940d7c60a29352a994a92f328e8c3dca3133d27015d8a5e12826f8b844df29b39478586f490991a4384992a438890d3e2cd1c78c2f4773348b6bf8a844af450819474a97db2ec7c6c98852a2175e546acda8f5ca8d88480e346ed4e06312edb92057c62bdd512a44a2c692e8e5f8154aa8bc097d2989da488e8f48f4323288cd318bda59deee0312adbad43ca7cf3c680f9aa47182f0117d0e1e46e9ec596290a4b808d6118dd4654297127f42b72c1f8de8c5ff76fb66f9f566583282820f4674c23febe4ede5b25b8e16d1bcb62ca1397a5875a5227a51cde41d724f44af75345b27172df98f88e8bb35c9921df92d76f4108dd232e88f2366f2f46688dee3cb9e8c14edac55883e4c472daf99dce4324c88deff65b72856293f1937c6069196b5342153576fec43106d68e9a7b53ca63a640ea91332ccf547203a153ae91d99dbfd736ed307201ae92a47c7ecf9bb399ae01887e0e30fcd9cce8bab336a5a74f9f043a3f93d3acb761dd3d6b9c18360f916d83d1a377835b23c0eb88c8f3ef4b205a93a6309712d567ce8dc4d6f68ee2cbba8d93df462871663903959b25f3df431c8536d1e5e3ec77ce4a15f1f2df8490d6a6a5a0c1e1a577285682df90e7d36d1f4a8753ecba6b543dfae2b5ed0903fead0be8b318a93f9cf9246d1a1131ddf92f897f325286698e0630e9d165d14fe594572e87496f1c5e059bccc2943a2baf91187be57e6d2f82e46eb5a8292c364e0030ecdb676b61c352de92cbda1d75a6f3e13ae514f6b6e6843cd3d987ccdee1393f0d1865e664fadfbff94a7bb52f8604323f5becb39aae71fdd9da4989c2c6679bc865e5c525a4da3c878945243bf5a102933a3965c943a6968dee499362d5c79ea090dad9b482d4a937c8656673cef91e17d98a1d5ec282fb9d092d86f3fcad0c8a85d4913fee235683ec8d09bd0d3f2c71cdbbfe17f8ca1d10f3d7fe14ad6e51743ab4264bb96c53ec2d0e8a09da12e6860e86352d94a9c3c654ae87c7ca117b5cfe6d8f3f795621a7c78a113a5ddd9336659e8f074a117f39d577eb3fbcbc25c685c1619dec447a4b8cec7169af1d24a974b625bfefe430beda99812dea9794c8c43f8c842b36e424bc2e76379e63fb0d0c7963db7a051a97cf549d43e8789d7e00a6dd2faa4f470d94f6a7cf0618536ec6ffc8db194528546a616a99fccb529f34b6c7c8e1212b4207c50a1d3a5ae51bcd6fcdce6c7141a59aea5921d3ae49b4cd0381951fe281f52685d50da7b5ef856f59f442d75f011856673c91c5a16bcc465ac018ab20f28b442b3e09ed977b48ba3248df3f1844666d59d4d6f38f9424de34d1ec5700a1f4e68468e891784878f5d5a4de8959cd7231edae473644227fbf12d9bcca174f46309ed079da37b76a6ce82f29cf0a1847ea59ce937d919afbab91b1f49e84ddd4cb7382f6736b750f840429b3fa54ca2e5f0ea4a3e429b5fd2a0b46f39d03801133e8cd0e80f339774d0516ef87c14a1d3552e29d9f2c713fda26bc207115af73ddd4ae613d7827262ec66f031845eeb4d25a26389d328fa10422fcde5a58ed995cb5bca71728282858f20f4823e7dde1e4774c90c62326030721f40e8b5a45cccb275ac5c293777b24c46c0468c8f1ff4e1c28e66c94789f5f0c307bd164b868db2a414df722f7ae135737e3ef395bbf1a2152d6869e926336578176d96c58a5dcf9266d5cd2f6e03872e7a615e10d9a54a29f1d15c34bab3e479ffc9a03dc545afad74cee2aa284daa43a23672e30465e528b95162035d5a0e351e61e0718bc6f33f5f8ba3399ae8a02dfaf821338ea7d07ccf7ad4a2d351d5528ccb1e7d9e072dfacfc29ccca5e13c66368b46cbcc7d615d48d46cd828394316bde4aaf478fc50d172160e1eb168b4696b1da5b95382072c5a9d4c6a292ba47099cde52368666c0f1eafe8e5489562fe3335844a0d1eae685c636849a185a8d21a7f8649b6a253114a9846d72e67fcac685fc6fc8c13f7aca211dea27f5ce5c227f05045a3517c64c754325a96c354744a8ecaa48389d4061ea8e8b3fe90c2450d234c8b6b093c4ed166e12237b869cc723e290f53b4d93bc346a945ebf0a798a1b54729da20dcccb318cbe37727c7d7e04b50cc204523bf350be37234544b25258251f4524fee6b7136338b19cbe1218adef489d79acd25081ea1e84de95caa852ced61446cf00045eb71b7a3ebbc0bdaf2f8441ffd536370d73f22bc35237878a2132f3fc90c6d8d9ba34e74a2b7d5dc84ba244ccb19103c38d1095525c5aa9241e8ce42a286f223c7686e139d16175b367d97b4d23a231e9ae8fb555c79969b3bdb814726facf2fe8a072747a5019a263b5f7c044ff3a8c5c7122f529e6be244709123c2ed10817758cd541849031f9ca129d099d265a5734eb0cc2307854a215aeb3be0c5aafd6fa43a2a64a46d648232338523e90438d1611c9a1c65bc183128dba68e1196314ef529b44a76b529e0ba61e93040f4934e225730fad842eade49168e7339bd419db5a6ce185c003127d76b94fcbbc5ade109b47b452c69bd4620e71d6c0c311bd7231782e31f3928cda8836534f89114275a76cdee0c188de25d7d96d7af258449b2fe4b5aa6cd9e52052449f1e4e27d15a7aa5983c12d178965da3976c17f3b48cf04044af5dc81229548609c26883c7215a316df2c289b7965f45a2268266f03044a35eda5349f790a94485e845fcc5115ace93105a3c08d10857f12ca7e2e37986443d06d178522e55cbe6e45a5c3c04d1e8d0f02db6a0a2128f40b44afe5d18b15a1c7d5a88e20188c65fd0976590235d634301143cfed0ef7a6657d9ec496cce0fadca10d3a36599992d49d446504e46d270146424f0e843ab434a193a8ef6f54d518c191f5a4fde4a875c1923bbf11e7a5955eae0ba4a47d5d708ca490edf3323f0d0433fba95f0cd3287d14945810a443cf2d087687751a550265226f1d0cbd562fedc79e40ad9ccd8e30e9d760236464e4c26d1cb4ba9c57d75495ceb25d127d35e26e342ebd2e291e84fa4aa122ec92f1d3548b441870f524e8b9e21741ed1f7e6e4d2536917740ad111ed7e9c923a75d688464a156f79478bd1f9614427264cec0bfa5402b2887ea3ccb1a7330ca2883ebb646a2a756ea14527116d0b7a5ec9585ddd302d144010d106f32caf85d33b2345904334635ab590a742121043b4f95564ce332fb916d3cbc04234d284f894e9caf4750c84109d9cceb95cee9c41f43a6b3ff170dd403919e306cac9e2130388203aa58410e59a1a45992e039040344ab99c93d49e63b82806441b4e7974735f7d2d757fe825692ae5851c97739001f143afe3bbc96ff9a7956f7de84b0699abb7f4e80e1e3880f0a1973f876c154d1aa48e5240f6d06a97782d2e3eddb3540f8d4ba273d6b2deac01c9431f45887a8e6302c143ff9236616eee32c808efd0c99754667eecf6d4b23d80d8a153a54469d68d1e36e640ead0e60ea385c89ecccc591640e8d0a6b6ece2cb713c43447773e8b4cce6d4beb245b941460e9d3829b596fa052daec8e3d087d4427c9b74018143f3f35fde92cc535a902e01e40dbd1c4ce8585a89188f0fc40dad8ef2b26f9ed372fe541bfa4c17b4b81957e9d2fa1d081b1a51d76e55e6b39eba35f42f9fcea8b620446e49a2866000a286568bcc5ac797b5cc173c98865ec6cba25e19b63240d0d0afc6f19cdab15f10269ea137ffec97ff5a90fbe163865ef78b6f8c32b44eae2c43a7737233297d103274a262e489f81e2d4c7b03640cadced9556b793f65ccb2187a713c5da5cacf6bfa14863606ad7546171a64b4090cbd54e2b49bbcacc385ee0b8dd6916a5e2ebea0b4a506102f344a955ecffd5a167d65bad09acecf46b12dcbad74b8d00b4ac828a3a5d7c3847e00d942a771b390a9b5687ae4d5421b7b3c9ae7161e64aed20092857e35c80c2b426ab640b0d0fba80bdbf9c26b516b815ca1f90e2f572984521a47b642739a84b6e9301ef3a973aad0beac5a7566a9b9c5d3b2020815da97795ad2297c3dca17069029f4f15bc98fb9e849b6e50b2052e8c4055f53beba1a540a310aadf77616aadd2f7ae840a1d372fe79984df9a94f204fe85446ddba635c6c9d7c4427f4a93decb9928dadbcbf036942ef626c61ce3d856c006142eb2e6611dfd3f1a13d4a005942e35aabeee0d9f4838ef10c204ae893925afcab740149429f346ad642f3282575048284be65c86b2d9f944abb0be408adec4fe1a5fa6456520562844e83cc2befa29663e7fc9c22f4e9aab32008111a9d75eb98e530212f7a9021f49fa7cbf39e0879cd8008a1119af57c6878d54a7390164082d0b7f629ef7f190408fdab46f98ce1bda566417ed0798cfd306f1dd5640a15203ee885f51d5f9d2d6acfb2547ad129213dc8ef4e8517bdf05dee792265336b5576d1e80aa5dfc388cace4b4517cd6a96f3aa47eb9215e7a27379263d7c952ab8683ea4a8ce42b4f8d1dda291d94bbb7b7ceccb6a8bbe83fe092da54bb2757806708b4a2d3a337577555a09dd2854a145df3256c751d9dd3832b36833cbc153fca80b9d3f880e1559b4e6728610e1a7a243afc4a215db416921b4f8d2b2ac028bf6a516575be8bae913565ed1ffca3c5adb431557f432aa65cf6639e6a6a9d28a5ec9fb686b31e9efffdcb1a2fdccdf1a3ab5bad0f46e156dcbade639a6b41c3b7aa78a3634a8e8f3173d68b84c182aa9e85dc91f0d2ec8ac9f16c9504145a705ad95fa46cd11f3413c457f1e5be6597d219aa2d5a9a25fc99645a9f5432c45af4accb398434f77a9428a36e89c94a9ead03126af328a56659b9807779da3ceaa88a20f59f239471f2d4e59094563425b8ed4a547c4f70a28fa5511263ae39e8b33aa7ca2cfc9bba3d6aeb5d0912b9ee8e794abd6a43d4e3da8138db896c578d472963486112b9c684e8a4eee528716f5c56ca297e518a596a38bd144af51e7ba5c224a6837136d0c26cdb414d5d9b962a2cd2c2d7db17b73d2b14b342a576a59c89b0b57254bf492aed2ca65398c5495a954a2ed2cbc52a9e54fa972a444e342f4e5542fdd2dc3ca24fa4d993529efa85995ab2289fef385e6cb64241acf2cb2a9a3d4aade02895e4cc72c45a968ddb93da27ff9c57e7fd72d8a3c39a2d7b9a59c4d33bd71d5bb4a239426baa4bf7cb2c2885e7d8516640bb3f1bd5516d18b7459741d9458f141e5878a225a8daea673a9eb9f5d93504944e77268b159f49e15a35510d1e7cc9a63f4cc51b764aa1ca217648a78551aea19d28a21da2457c6e8f0b22a791deba052883674925ab7d862ceae7508d1bccb72965b16a7575e3888466791aafa2563e43d4134ae49946aa6502db94b20dad4e1524a7f6d97a1ad00a24f328f76598472a9b5963f344aca8bf243736ef252c3ca0dee5adb875654e874515f6cf5a84a3e74a62946a3121b1aba2751d3bd3db45167d3615a75d42994bd41450f6d7f8fd614e9e24999a9e4a1174573501173bdd183153cb4f2c59c7a37c568a1f5ca1d1a35b1328b2dbfaca4ec8250b1439b3f3ffe726f5ed741e80c953a34a27a4a693f117b3a4a874eae08d7d62e79e25099431f7fa556d56526937a14ad2287d6a4d48ea9b1fa615b2a71e8bc5d16472aad4a85bf77a8c0a1d7a2cbb965eb7f4126d3869ba0e8bda1158fda55bbd849cbd1191537f4ab95dc1d131d7c778546a50d8dce2bbada7f9490afc486f6c4ca4f1d2fcf62d09254d6d0b72ceb9c5cc968dde0ef068d868a1a1a315a5b968496ff0513eb19fe2ed034f4ef49dfc36897656aacfcc4469ea08286beb5e626a96bc27470e14063e48c93131b6b2908430cb6ca197acd151f5f8ec91867153334524d5d32dd723de457865e7e595b5c91498bea520cc38c108cb1c6970047850c7dee29ad5a5adfbbbf31f449b3d631e55162e8c50d975bd0d385a1ef951f261b32ebe7c66b1a1530b4dda28c1d4fb3bc32b998a1f2855ebb205a5e63634bb68a171a8f51d159d14d2694952ef4bbaea1e4e6396d970d47f91b4f82a3d1b8d0790b5ac5c86b97d4a654b6d06c6c6e8d71b468396ace56b4d0cb29b7bb745b9451498da4b8b1140f8811c60740a07e711c2b58e34bc0834a165ad1c26619b33d152cb4e52df47f66b9ac65874447504e2251b94227d48416a48b2e771eb1a1344954acd0f89eefc78e41eb721d33894a153af7d2826867cd42c79d446d0c152ab41fe447359654325b4ba5bc3a31394b54a6d097683eedd1ddd2a48a442d73a08102117c098a191529b4dbb2a4da73907ac5aa246a765aa844a12d1de31d37831528b43a675966c165ce6b722ba93ca193f3951bc4fc09993b4e688452d3e1a16ba509ad7f9febcaa8c1cfe70a13dad82fce739bce41b6ab2ca153d1a9afc947b4ec5a51425ba2646ba9f8d33a65246a222208f1a19284be55489d23b33cb2735441422375ec1452ef7fd0f892a072845ec7ea99121754dd57152334fab25c1efd6496c7e7af14a1d75298d63842b66b9b44e885edf2511a26d364a83284de536a17a9456ecee85684d0ce86cc5992512e5b96952034db51c9134246355d88446d8c0a105a19c46541c7ea102e3a0a2a3f6844491512a31217b0cbc05906f0cc4d60a935697f6b81091811a422168125470a1a280508c01a29031e014841f9050d75828223011c4829c1e11e013803000200800c6c0007201f00404a4a122180003c872b910204c073b83a411139000006d08004a0fc198be7481919010140001470001c37ccd026f1a0abb5a8747d1c379632b427bc3dff66cba32e92e100608ca1cfac1bb54793def81b9a6088610d1c4b18da132deb5ea9239b3d22515b03c772e36fe48dbf81c0000396e4502737be8025397050a2d018194900185ee883afce9d2d7fd41d4312dd3334ce6e3cca080e4ad4885a1e470a5b0e93124c3129c961a3048c2ee00802c0e00296e4402149b13132920030b68025396c90a4f8c84802c0d0428e4fb9f1370c004616da4ce9db27d685e91f0c2cf42f5b1675bf9c3805c7c988d9001857e825d562ca4f422b212be3e04fc98d1393356c9c94f13fc65eca186058a1fd1c57a36f6aa5a2f555683fc36af414a29e9da442ab2be379d45916bbc33585d66484dcb032ea89098121855ee6a454a7761e8c28b4a2849a67bd331850683d68d32ee678e59afb13fa8e528a4b3a7bf4d825184ee83dce63891727839bdc844ef8c993b31ab3d28c097dbb206596436f0e9fcf25b473a23fbf1c33fadfa58436b6ff64a92909bd122926d385979e5a0b129a934d13af5f95762a8fd07e799beea82b23f43af87a6752faaa6f16a1552ecbc8902f4b3a0939115a2d96d0a2698daaa58e0fa18d177590101aede7a74346f92fcc29088d96279b49537b4f0b0161f79848f32a56e77e739dc5e82c307ed0ea4f9d34cba0328c6a81e1834e6a19d13a2615d9ff662fda74edd41e735d7c252251fb33dc8c105ef4fa4a85792bd58fc2905df42d7f16a3590ea51dafb3105df4d95f54fa5f87a76769482e5aadd3b4a40ce579b5741221b868b465f428326bf1516cb7684bb6187d7eaa5f6e1d5b3423376bffd231b769c1736ad17ee78eaf64c7efe6d56942082d3affd5f93bcbac59b46232e4cb496368a94ab2e825195208393b32b3cb8a45df63e27b56e9a628132c3a8dfe1b64c3854aa17a452f688ba67a43e68acef574ce598d193fcfade8a30b993b56e82c8b4acb8a5eb7ea345dd9ace9e62a9a0d25e693988dd95bcb640d55f41db5d49d95596827532adaf8d94cfa768648cfa610828a46778c8c51b6cacdcde613424ed178872993555a37b31885105334524bcbcacfed21d52b459f4fcdfba4929d2d5e4248d1c9c7e99b6e595dd522868ca2d5a2de5f4d17a4ee9c88a2e844cb3a4bdda3158a3e68d916ba59102228da1894870821425e920ff1139d7639e64931c24dcc86e889ce85cbe2472da46a7e87d8893ebc4c32eba3943e9de3447f5aebecb2ac235d4cc24df42dfe37557787a889e65373e8ccbe0c324b2266a2cf973b67c163d6979e43210413bd52ba263d44483d9b74894e6941ae88d559e55f36c4127d940f95adc346d7f32d21a412adbbb0eaadc4c3ffb94e174228d17f9eb91c56b618a7e4c8844ca24d623acb48e1e185fb9268de05f9820b1d5b5be8dc8544a259a95bbe56d959c33b2b8440a26db95f12fb265e265a218f307816fd5745378ee837ca876d49e61f8434a2198d9ba4d0d2d4b1c41e8430a295a3cb34e7f032b3700111b2085c77e6b0bffa3d1c5c88229a13af673fe308edfd862422b92d3a534b9d8720a2f1d7172e731ea3538a3ce0218768b56949312ae61043741a84123717a485e89472f945dd6a2a36ea09d1eb90ef628ce7ddd32893139435a264840ca2d54169cabf6c390a755941342e54cc88d19b5cd67a0d4423ca05d12eebd7ce4f25205affffac1d73b88a77e80f7d668f09253a2eac9b8e1f3a2d0b7f79a51b6e42847d68339a9a9059cc1e373fc887e605f9653edfae5fb9f6d0cb319fb532b9b9f3327a6853648be54ae67c41694e481efa9871543f690de2a1d17e931926c5cb399bc33bf441e918ce4477d693fa103bf49a39bca8d45f463d87d4a115dff372f2a815428746c5446ae1e5f124c2143287c684e789c6cc3a86ca246a2925c84c19217268e5889e9551e3978a9049481c1af12b8347a97154b82b040e8d77ce209f84e816f1b284bca1cd115a68d6b9f3851965baa18d7933b43c732ea40d7df6c6c80d7b1e5a9486b0a19d17de6263d2fe395c43a332a79462b6d3c5f9500b216ae837666cc1b7f40977244de0810fa0c00421484c43ab59d2feda3bccc6900a41432fb666f1b339f907d9869ca14f2252a94e2e7533f6344ec4101149e3040525082166e8359b16224de458082943e3e1da394dbcd872a42164685c778775315ad070791c38d01843ef7ab3a30bdd9c5576232347b2a0f8a7a41a42c4d06ff6fb08ddfdba3c64c3811012865e3e4f725e561ae61dd34108185a79e23a62655d3eefbfd08f0b72f5bee7cffa8222226d08f142a3de829716cf8e580e42bad06f26f92cdd64d456a5102eb4d14c698e5ce15d5a2c25640b9de6299121ba3cb77848d402215ae83dc669544acb92f6a025240b7dcca022dcf565f0fcc406167a9f9d7d93f19469872708b942bf9fd3e37dbe94d2a463566883dc7d2d0bf1dafa9f2af492fe78729430fd8d5d0a15fa98a4ebf391621ada4da12d313ae683ce98a2742934ca25e5a2f14aa7c69c178444a12f69a2b53c14dad88296b37916b1fa3f4fe8f59ae8865697b2abcd20c409cd6ad920a56bd4ae05214de8f4ba0ba1e5312d8cfed4cc086142dbfdba7fa374792eaf294b68b4b590fb26647849cb4ae8c524b57efc53ba202409ad472dab8596b4b859c94868b7633fcaab708c9023b4da7368066da2d58488042146e865ea152edec9fdef9022345a9658139b255fcc3184088d10d3f0a24bcafea4afb1206408cdeb9c938cfdfd4a731742e3fd7e22b2e4cacf5a4282d00a21a370c9c5380a4280d06accd1f7930ea6c5fc412108f981a2153914e28346cabb309df5c7dd2c5d2379bde8b4164d9856edf3a2dd329da3651d36bb9477d168d9a1cf5fe975d1c8d62e8f901da9b318ca45df316717b34bf2275c8b8bbe579b9a9411f275cfab3e0820b768fe5777092965ab7cc6169d3ed961fa596b7d524a44c453d4f2a80720b5e8bb77830ed25b8bd1315a34427a4ba132e2a5c818c82c7ab94fcb9a56fe51c7670520b26893965bee1c5bf34c9cb1685746c7184f653e552622028b5ec7f653e22f27e52d4ea22220af683ca8f857993fcb410b22515b273f82726220ae685bcea2e3de3a478d2741016945ab73922d5de716a49bec021056b4396b73159dd492122d966ae6a03f882a7af1272fb9f89d5c450b928a763f8fd69d592a8f31064145ab3d3cbf2464ffafa64c4e524800728ac654366ea81462da3b88297acf264c6750223da5685c906632c575bce008c8880208297a15f11a3ec88ca2cf4ae74f55528b32d9021145ebc9ff052de31b8084a2ef3d25cae7a567cf16285a1da5d6627468b195de7701f944ab275a6c996849ffbb487278192222243972388827fae05143feaad2faf7ec44a3bb0553327f57a48c4a4038d1caefb8427faece26a32226209be865c943fe8c78eb1017899a794a4a490e13bfb189c61a2848060c463a00a289ce4db830adbabd93f64032d19afc3cffb9a576932211111191c4018260a2dfd48ce1fa856fd172705ca293dd70d9fafc57356c89f6c3876999ce2ad1e6a8fb9b59a7de75414af449738ede38718c5ca8d43006f3601c0c868281400cc2301cd6bb400073120800202c1c8e064402a15054a61f14000452422a48422a2c3020160ac623a1382c10060261602010c3401443410c06623c48c464039f4c69829a3886742b11a5dc5ce8e2335e93f88f556a290615b07e2566e54f5ec9eddc6f0be29645b1ed82cf82ca70704fb020c104ac903840aac14b1cc43fadbcff3ded33fcfffbc38f7782313377b1f69c11cd8c300ed0ad986986e3d763d609583fb0c91b539685ba70f59a85e38261f95089f3cd9490bc930cf45fde6c17963b3bd6f991186b1feab83b8b64913c16f2e2c8371a7b381e7e4861a5d82c675920be1c140f95fff30e895cbf774dc517544153c37406a9991f94bcfa8beb0a16baa20b0c576829285adc592f259a1d3f0daa2368a068735cf0da8a8f9188fea0c1bfeb7e0abe873766d99971b869e0ac3efdc79e734dcac54cc32b4802a24cbec9adeb1510816055769479ac7a05686d8b64000763a5986e08aaed2cb7b7fc03ffed796038e8929cb0218bd77d23a03be15c4390e743c52b4fed45b128c9f793bb2136a163788ebb2d6a4778829dc102cbf00252aa3e103e2826902de0d581083578f993a38906461bb598de5558238a3f1c442558dcef3008b7966dc996730aec782c5b8d846d74bfd1ae98fed1f361cdf3e96a84b84648898f67a28d3211be72ea3e9d723e24f301280a2f8db78b60de1f4d863ebedd24b3b513989e6c30c5b66a59ff40324084b565de384aef5a5b30e95bcd1006e39b2f584b9d8f8b274cebc0333a7e0a067d8180814f28df581d5fcfad71814ca6f9c1736f936d4b9e37294ca2af72c69e7ca4f2244edbe72440fe9974544c699e003c9f0000f31b3b68c4679f42acbeba595f36418174b70bd077d8508a7034ef01ed7c3ebcaab138e9eb81d2a1b022f527a3681305193e759cc0379c2956946d56d1ca4be0306f5b83228234d3dbdd70d62e7cb9dadbc22516c79249490cb096ec017ed6875e71765d2af481b6dde3aed0d086dee0f3a623aac08829c1766af5e7f3fab815b28fbab098d297a22eadcf19c8260264cf25e6a6544691f0f32937ab3dbd29b766cb9f849e5249ae5f5cf72a1b9f72238546d7bc85d009fdc86b2c3fab0e5ad485381596ec04db80a83380a6cf6e382eead11f093aa0315a066cd89ecb0130cc8daeb14bddfdf9252ed7088aa59eb99af4c3d77d7778ce0e9e635d8fdb9743fecc98a4ddd28a99b036aa087e442c485eb391a8463c15aef75e0aea506f05ebcc4f617ad85b61769de823fe3f9dc65c5691ab5b321b5f431ea9d78a0d7f9166312bc81a0c6eadaa1c31e42b80c1a1c8337164c2f165a409b472ae278e7672496b3f4cd913c100d3e30b8ab3de3106c5f166879ddc4ae360b95d11317e1e73b8a7c880c3ca6c111778adaae8c18b17ee0c87e34a96111b267257b72b95e761028a1f15797ba1cbe6f38c817f7ca0bf8e8d3ed2975b839762d55d549705bdb54ff9f695728b98549953075449e7b65f5c66a7441ca0d9bc1ab5a005ecf70aa64e368340972ca156be1e95bf1d389971329dadb25ecd4fdfd3b19556d9f9367a257d9a591920e0917aa57e01c7d902fd5cfa7412bc93b924e74bdf191d83e419b4a585395578c551a685c678df282ed42c7156755b7cea3ebf486ce46df105757da0eada021211f3081ef26cf844d3f9e971217e6b452e794ed635ddd644327d1e718e500dabf7a280358ccf3061d99ab82dddbe5519501d98c3ac05cc1592826b158d864edbd3f4f753accb956ae46e583d1f5ba52f37f34c833147812e1ff106fa7cf206c8134347fa028501cb25713a2f3790f73f214e4f324c1a39bc5082b683369402215bbb2cdb5f516b207aeba211c38d7cdbd7ddee180af6be3002bdc3342bc2958880685c938660a36ae0c185b912bd83516c17e778b2f1b1bd0a00865be8f8c908d6cfcab9337c6511029d6a9cd294c506101d425ef63b65022d638e2606015d955aaadbcab202e4b75eb4a0a10542cb08a004f9c096e211fe2aa2592a1991826ec70c180f6c2ceea51bf7673888b6f49afa1c0f4c764567efb93996bd74f4d0dabfb1cc82672d9c3135ffd55551947691fceeafe889c8346ea040a6df112e130aa5858da0890495d42de5a070cfb4f1ebc68609aa30a1a383e62a92d0103ef51372b9fbae33133461b1efb72ef1959026ecf81d8e3fec517274f1523391084365eccd24d4928ca9f9e2411f00459a9e2f95c766aa4127fe7d8272ede5cda022efcfbd30d48f2b36cc16cde570feb6ed9020773585574e7ba0a01d369e626061ecafa916629972d84646691aefbdd8dd6643c73e225decd41d0c1a16766dbcd66163acadba48cc80f7632c5f99a2564410880f794e6c53915fecc290c5f46227f9e56fc715f12b3b79ade94c49fbdb35d2b53b72962b483d1f651b805df0c7e50b4bd870e54217361917aec66a948529b08159172e0f8e03ac5477a8113d8165d2624410007b6dedc1274f9e6133913e84e9c6f3f8a6da997046816172f064f959db56f0e66e30c45fa823c9b5d5c4b5a68970d59c4a6d3f253a58024d99300751dd267c0893c472bc06730cb9cd54971b1428f6f7f74dafdce04e83d4dc06e6fb938549c250cdcbb61e7388c443beea464b5db874e3d67581ad6a92a69d877c3a1fa4f35da4bb97d585b0ebdeb00d3f8c202d95968d0c85319811bde5421bd09ec2d4731d19b2635163190ef527ea00cad950fb126b2478c8b49199bb14e0b3f7136ac1b27a61023b05bea31570e80223437155c92804c3207312e4dc12bf42fe32d330de866a93144c4428e7b0b42b3de1ceb4d4be62c9e66645206930e23558ff7092707f8f29eb5ee7e209a14cdcf1bd27e553790c8936d6fbecf6fd7a64d7206aff581912a1734ab6ea8f53b5f30b2a5a419eee6753417c5511395e1fcd6378f428ca4629beb9553e3fac21d92d0030b9c96ae5aa65da07c3deb35c9ee1c94e2b50b563d4ad341c78317136dc617769e397520f14ae52f56a6d13a8bf45be2f75a66a790bc501dfbc50b618c50d33b89823c7bfe3a56d40a3f93082ea762d673255d7a026daeb914428145da2f4fa7490da3aa7ab4db4c8dccfd40999a9b704834aa27af22a4934c52440789b048549d581a044958f0329652dedfc1041159102462e6b4545370f82443386c8f66ddf36f0300233b21c368b42b557406583993296f7ce13b4221829f1d56cb0198ccd8423a1a15418be0591b805eb5b11cda015df2744609cf3c44d9f80bd42acd8b4e7176f0800588b4526bac0be629c72d955eed0a56f934bc839c280192e68b53eb07526a3a3776584e82c898c3514e830dc044266bf184704085ba2211036b5e571b69f9ecaa2a0608b67f2c66d030f8f0f16123e9e7f6c5d0036306b6a1ed64c8b9446e039b12a834c6ca927f66974c6fac02e9d6779024a636cc01c4861834fb10425d02ef4e5c081ecebcfe7b89a797cdc3ae60059a5c61d3cbb89b6f653f8a47baa92a99a0491a04978409a7a7d4a56477930eff60bbc8768fb8ddbc7274cfcc18271552bd3b4a412e048ac58cb749271eebdbb10dde4d54346f305a36026bba9991ae7371f8baaa05ce700a0d8aed159b05499871a48122a46284c17f1d0ddf0a120329a7ffd82e99390333e4c613cbbba305f6a8ee48cd56b777a2daacfcb5c79ed405e6c73c7e696760c04942bf65ee5dbebd8def43a8e00a4061055b8c5dd7158791fad1797297c371668aabb4270cc02d6a8f888d928e554d374aa5eff1685dcb325853fa3953e7899c038ea98ba5d49828946620e9483c909142bae8e2269c44084f16013fde094e1d4899951c6095036f42b450d607fdc7815cad156570025efa3b3de87ee7a908c77d288fc0a6c14ace72ba829ce050a3d46f95866d8a7b3fea09223d7e94a8356aac80365631d380a785026e2ec556ad92014a479dfb4ad1aeeaec29244b6eb30d3445b63526d486af2aab6aed7c36c8139224fca4342094801e438c44ab10d6d19e59e8dacdf8de0654a5bd5afa5b262dae965fb02668c84c1262b7c665460eeb0a7c9a344cfb28890ec5ce7d51e09b81129c17dabfe5ac7c665ffd2e9bd6fa32684c83cdde3e2bd27cf35b8176ad58227e93fde476cd4f247607b61ec0e307cd630c2d38e3bffea64c926478f711fe10cc745bb673a4b9f6fce39a5941632e864a67dc7604165556a34be39b5700417f935784351d8bf785c053199051d8b790983868eaa32bed2bd06f95ba15e414292566b6db47a12c0a7780bdd05d7b84349255d9f0c7b27935b7bde34d1512a2428c0235850850b2f66528817d26cd869fee02f6fa1244e486ae0268735932139aaad08b5b093b73f9e6b58bc6a21fcf250ec1709213d186883cd33db48d9b8dc7c525612d631f358bda7f3a5737a4a02a828c039d42ef6934b1ce09ce92a484b1582b8ed153c73a86437530edce1d534cbf1d8b588743e3bc05fb31b8ec8fa7e148d63005c8ed5a4ed792ffea19e2e58ffd911b4fe23483f38400324d87da2f505fbcf7c7f23a209b7f477b0383aa5173868cc921d57c7b0e45c0fd8c95fb027edf75ab757dd7aa130bc2eacf23b00d1260009544a7adbcf58b6f20161930380819e38e6912d30a7211c665aac83978bbc4ea7d751efbceec2291f81e8ea6f863bb06f1cda35fa2ea334f82a5692fc282c1a1607e8ae2731cb0b6c0fe6bcbac7b0d7b905f9849c6f864e0845b89414bcb03f50866be1d94e4f9ad2931c9942c2049e10cc41304b78debfea3ea264dc4d2adf04858441adda471f26b2e73e599f8fb3619f8795d28ed8d600fadc761cdc37b448c9b422525d84c2b9b3fa77708fe2a11e165bad45f0c7918ec4698b6c14a27b32956f72a689a32d76e021e008185b415631424bf188bdd0e5470c85becc6332c9ad39b99910c486c2cf73158440dbc722159f64a04a05127c1b5a3bcc1197dadc47be0de374ce653815b63e64cf5bbe4545103eb93112466a2bb20e31c99527b22b4fdb25c0d29bd9916a79466b295101cc7b066bf8442ea1b0337bc8a4188cc7cd71503f4fa7cb681592c9b90ca64e1710f905d32a01fd7470aafc254ffb9163e361fad39caef81e03908ba228f4f2d042dbfc7710711619e5de6f63a74ed0be8246421bcca5b2499865551bf356dfb6a73dd25647da8d7039167f85d835755d078aa438a7a2cb4d63c7650b31c192a234836f65d63d9a8d6fac9500923dc381efbee111c66e5cb39fbf469bbc97cff7e7e1e4d5effbf094284185355bc5cac1a9dfa682528b2a3965c7420900a0cfaf1f1c2707119f5c2a4d11a538e266b25f2d5d078776e9152bd14aa585fae5203b4129603fcd8509509c8cf7edcbc7017e928944df15c7de46088130c0d1e75f6dda02741e5be4853ba432196c74884658bf7a0db061b044288c6828c116482d7143e78c44119109fae84f80a2f113eb3f9976dcc7dd5ddcfe7b45a1bbaa4e83418900cd492baece00b1f29a13ae8d6169df5a83b3c8120fc6427553cf0ee055dd74a58cee3fd65032cacb628af757b5069f946c2e3b8be058c00eda3dd9f8bee00203d1b7cac4ad2e3d982b0fd7d1702504d85fdd1e14f79aa5346c04fb1d5c3a586361a558888926f1a3fd2cdbd686268663382f6191ed74e22b73dec5425e6fce917032b83d9c426b323fe61ea32d2e4fa46118839c800a3989443d3b46ce5e4a225d2ae294e0839ad045b997d05218b596f169e49a37890496e56418a80e1477174122bd4afbd56df7ff7739753472cf3395255c561c2ccd3fee1c5c6124176c1bb40251526a77779e0baf7b1edc614f31a2a2df682acd71257ae8c332f9cbb71b015c59bf0f8efcaa3e5311fc1bddf40531e645d6fc2a908edf1c3193d10c147d06c293d698a8331ad05c0bf33d90a7598dcfd44baa5aa8234dd736d73c67892cc4c71a7a82c191742a4216c205e48e64f9fa1cb72e39678e1bacadb8751d9b5aaa879381df08e97498fb7ed61e55d9708ecf77c2b80dc7ac0c9c0833780b9f0398901bf4152bbe06ce9b4863acd7970e49fecc8be8c5fa52d8cfa87f9d7ec794425cfee5896cc6fd3a72be8808909d653bac7249d7da8195894b7ae926736e096837ec95e319144a2d25eac5d7cb80f35e359faf505411e9cd9a3c700eb33ca7c80d4366e047c3a9eacca96f86a28aea443b4e88a9a2f3971b469fc433d49b75fb58584b5c8676dc621b496506a5072955071a5cd97b8e8192eff150528ad53c22878bcbda4ba15b83addf6389929c552c6fa5f28b68e53bbdb8de8f3b2e22c15d9a1abf684db8e17c06524efbc5b50690d9cdb7786d2af9fa1c5b8341d145b62cafa7b0a9c63be9f002099510d582ebb4065d88a44fcdfa35658513289091d6bdd1faadaebdfb0ce0f215636c9239840a818456763c793180468d475090b64b6d985834a55124e5378c87afb611674b9bf9d04260fe58a534ee87fcaea7a1a1120d262851565bfe5c7f75b94e1d7fa160eee8c2de801c2b2b58c8d082b71fda721f2b778171eb57c4ac56e439c06888d9c6b01e4eab67e54406955cbfb6bf7009400af526ea56fc50ce1cb058210c7359ab26c4351c4bdd1d3afcf194e758464f5874ee63dcc34b3a435dbed6034a6af0b0f653e4e6f8d222e0e574e894cec1d0c04b4a8251f116a69b793a5c1816681f140b1ba0923c2b17c7224780a25147b504097e8ad4e00b5a6c9200244454f2d9b7348272f9bfe234cfe95f0525db4e8717cde89f349b44d4db80d8ce0eb9491a2767c334e9d4f5e70842e55d7dbe45ec637308350cc9f79b4b969ea644e208dc999f6a18ec838e22c0013a97a85d02721b74889224e2d5a2876053eb5ef8cda1e9a5dff3e384ae63a8fda3309291eaf03dac7c02a99585c5a055764ee7a0d3c70729e5dff657f5f3e6072a7b28f9610c3d61b0859b4f93468ec9a786a11d8b3cd235ad763654b2ff97eebd0932a46cfd868eb16d25a5c0b5d7d54c4f8f2b8a969f81306f02fe1a0ec64e4990eca9c93921e123993c119211ba89ae8141e4a630f56be9ca468aaf89dbf4fbd9473eb13d66c468cfed75ca77b7ce7ca33b2832f666b2aace5bf2215ec2a4bb96b814e42cb8e2de141eda116730c7ebabc986e64826c96620c38ed55d976728058c3a4b5f63cce541ee34ce9e0fbf5876754d33ad0ba51a4b8c3b174a809deff86c8c78be547cff2a0be9474e90b50b2c397db4519c631acb87edaed9f4ec75d63d6c937ed0c04fb25c2ba9e100d02862f42c58ff2c92b83fb63583edbd216128a23141a554454956ea6b43271c777382c99cc0e4900f6687763af39866fd19eba9a4399608785b29aa46555673c9f4f04edd78a3f1a43c9501f185645211b7f5de086831af0c15eefd12c508ba4199e50c3acea181a9e45ce5a4f42043e39c2f671926010da9721e118e51a84221fcc1052f251ad3f0991bb6acac5744d0c66ce7061520908b0a30c72902305062a05210639a154bbcbd27ea0412fcb45afcc69828a2723194bd109466d6a6a36d2dfb181cd345c56dd8bda6ead431e72ac9d83227f96a41081fefe7f338d0d3318466cdb0d5cdaba01241e65a2367effc2541ff98104834423312b9b67570bbe80cbfea8d5aea3add245a38e1a599590fa2ef25b35539348e4de76c2a57b6ad92f8bba71ce11a67d16c3474f35fb087d619404b9af9fbf45b2d3342ab4b18358585739ea937cdff15e79bbec3f2394f28c4f2e62abfd4dbd4f3dd9914898b515f708681fde76401b91443adc28f742be55fa81127a987351c3b0b9fee761f9d5f321aaccc3904e875bc8cce4b9ec54baa009036db710b48921441932825182913bad2ab284b61cd08181768a4edcacbc116d138d7b82c3a8a827022af537313732ac6f4cc227837fca198992f5658d399c741dcd9bb7c683f66c41b7e8000e7270473b9d247567716fc4c72f7050cbb2e0f7d909d5619a8369086435545b46482598e4e131058be54478405201e6ed9aaaa1c2773617ed95839965c2d9a3d03459948cae8dacd0a337f6b4111f4d3798d2be97da084e9f264c8c7c481887b7685a5fbed7ed4276c8d4d6140a16459934dec3d6673b6bf791229c06a3368afb48f827d8bf5917dca66e55d6285860290d2d06f298220d456735a14f2f52b1f3219dc70427dbe4dc73a94debeef6f238d81107824867b110788beea1c361095668fc30855c03ebc09bd725f18dd5eac0e5de9a9a21ee59032af0d57b60f8ddaa98d5e63a248809b8b862702813f56519f12c8a1a22f6865dcdfeef5eaaf5d76984cf082ee1b2cfed9cfc4d259b460b6600a991a01f1db88f43b775fb10b4d2e32385fe81a0481ae0c85f4e736ff58731101f9c3e9749a9b5b83cc64799d7f98f56691e0be715b01ddc947abf05f09233c84681b13cc2a66a8c015467eb90f431923c1513d96a61123337cba3b8285e66ea5e341deb57fa60b256e8337c44f1e14d80829307b5cffc9ebab66822584dbf930d0f70c06d0b456df61055c8aef183550daba8b6fd505d9df60bee970f39d6fa036eb9fc7632a665e6d4f8556872d86f2fc1b8cd2d110c282459e3498e786660f86ad02a9d03a62ad1bd30c550f878f15dc7125ab6149a391eb247d5eab002e8c2c71b8bed33cbdf3cbca9b2fcc371e815a5163c01195dce28eb5b3fab2110c67599c9e7d72c9872f4d6b60b37694cd9d194dff330a1c0dd5a6d2635660ee993ff6345efcd5ab0d1d3c64b8c322d586542d846d0a4993c8d9f0d8a3492c4c8607297ba0fe85c46a0bf6043812cd1ddc921378513b583fcca5982a68b84aefb2eb11193f904f9383cf2f990503317f1cdce10178ba8620e41da0203fe188525dacf3a7cfcd2b08eafc88fa328339efd4ce07804f3872dc3d91d99f81cbd2cf15e9735299ea96ce4d7bc9892d34c230884d270c30762a255a8c99c92a4018f3cb1fe680546504271b755ab63514d77f16fdf2c48ab41ec26799d0ef5014f2aba4f3a52673925f5402f5cd1dd871e3869baa596d0946baa9bfd2f7816ae69c9a36c478dc33584fe7b17284375b932d35993710442466f477ebb485bf00cc7051e2e081298fda29d7e380040a39dbc2e083dcc82841ffc5dd9b7d1b7e44b1df68799016882eeb763cf291dde048ddbc25e6bcbea26d0a07def13454d6cdb1741f6557aec0bbe4803c285f4c03eefa64a84d63c5f6646d1e1273fb2d0068a3ccfad697eb23d7b02e5f876e8040de674995753b56619d462ebd595045451c745465aefd6eb28a9eebe6177a24c62dcbeec2709640634fab793069f59df3299aca8abc1e7a728a6518e09cfe6dd124ac1625af32b585e3d20a3250e9a80542d81034f43ad1aa15227173ff220667a557417a6408b2e3a74677baebccd0acf23088cd4ea83c02df6ba866ee42ebc9a7d020569644fb0d691b463a48e53300f36da9d01c2bb8b02efa369901f346bedb54e92971a9b25a71450a0aed698caf1c14cccb09d0762666b0b418cf0bf75ae4d904dcf928a9503329dde3a86067f9beac240a2c759a64bd650d769719e1dd05dbabaff57151fb28557ca31518e3f3da30744604f618735f9792120ca302757c68f2e0412e94b118e9f8c74dde4c2447a8741442e2358ecb781f27251c81425e25839b0bc195d09c9c15f1b639cd95e83e18a0742fe7e52ee38363487dfb25a1199308ac739fe320a9064726782e80c5c1945947d460ddad35a3030173a8fd16acd64ed0ebc4a553f99c3c2e4ebf9001605e7b13454cd3f3c4bba6732d48c7c6d2753854293274f5445491d0c6d516a65fa965922f2fde2ddfa97c3443ab53aec6331505d28cbe0fa20754fc60c280ce129f0eb859e0fe7d2082b9a310e0d881639f1a33b1ac299628ac36f3fe0093693352ac14802c52b254ac275e2313db96cf4453071c5293f69d494b43bdad1dae92078534e6f9f93596298d1d7eafc6ecb62ace74c4bf368a30c07f74488f07586456d50e601c77f82482d3c03931c369261134fba567563433b3c71c3737ee20a3b7d31def9d3c573e2ce1520b5feb753f39a888eac38e82f0efbf6e3f5e1ddd22a1050a068c3f35dd03cad8d2b8d86b031e1ea53748149ee355ef0bb64f4ba41249c9b0b003facadd83ad6fdba89e0326cf64083af807a533c5dbccb39070826b74da550252130f9c1ed811bfdf3ae290b9404b733fa21e4cc23f2f0644b95e18632679fc83a458c5181063a6ba62c6e1ffd522ce08706a009421252a2009c34940ea246069cc5e2b407c42b27c1258a1c755172aff1846c3fed5768f8fcd8b526e8a7f92f4e9d05dc2036b400b389d367ca9036cc07f73c69c47b69eea984af28e11e52484617eefba6f074788cb5d171ca950ad0eff6e9f01366d8feb5275408ddb6030556c8db3dc6bae953ddb186311123a31750527e8843f5982d9878e97a21bad484db62e36b51f57afa9264a0b8a489ca067263a1d66190458e4e60658952b1b55f25a0045511b3b0821e7e748bd80abc96b55b9ff9930d0c62e24b7446d57a887a4e479552db476de8c5196911a388e40eb7038f338847930c453a865cb3889f009ddf23443d57563d8bb4aee6c1db11756a154a1b233ab8ed69c8e597cf093ecd48e933e86b89ad84c48c4c1a8c35910f93418d141bec026ac878b3d6939a62050748611bc10e6c8552b27ae16f36f46a67fb0d19c676f11ac28da210eed135b6bb7c62909ff852479bb44bb34321651782950bdba0c758f826ad680cc0af308a0ee517d6b25aa2a623cc926c921362601dc13d0ce6c21a746c33a5b85f5207a3ecb3d52c865f08013a47024de3d8a5ae6c8cc12f5d196635cc38714a4cad2a837b6644fa5a8c6267a6508988dd38220f8bf0dcb6147c984819e49420a194fdbcca406a56a79423e7d079fee3d4dcca90aaa910115ef2f429b633773c6ffc4bd2011c00400cca2e09f0e9c1ebab29f1e54555ceef36a2c1a7f6ae3d34183da08c2e42163719c5ed669bedd922b9e11a078a1b996b0bc53bc1711091329b38bf50a169970bc7981bfa1aab346881ddb7ad70607fc7dbcd3235ca99a69f3ba2a435f4e732a6117943d5e25a01f91e6b9eb51b32b85a3d9f1de264b90e94e01aedba996e7af52076a584c7a050302ea94af8e7691e0075b00eb51e808fef554e046d0aa205b0f86b577b4b3136fce526bd6e977194bb61c241941494dba55a0abf9c55cbeac889e49eadcb0c2405cd34b8c08d711e49539641ea7bbd8e42a20d3c9d28f48e848f9c478533e1ac71ad9a85fd025a05ceb1499d680651c228259e2bed134da1295a92d8cdecc3b77485ca86e49fb03e344ff70ca0631d9e7443891089462514590a1497eba6e4f1f498d946b959e41ef792a532223d86bfd8eb09a981bf3f906959bf37c4d429e5e00a0396be66b532e90d4cc7208d684c54183dd5037d01310bca4ded207d237c6c12b374648b2c25abb4b31a75801616b97fae8848cddbe38b27479716abf03f932090ced973017340f431ae37953d9e302320995b6a6bb6e1bc55bf6f1fe9df93674b224688c0f4c63f840877ca699d45b026070babd2806ea4ee4db179511f6fca964ca02ae31741c6ebfb2680ce4fe6ac1d434e5c11a29dcd6010e17ad6f523ea7b2931a2ecbf5bcf3316ea38d1453a2b34c55b0c29dcb1043ccbb4444924aa4b2252224ee719a5fb7b8837fc2f54e897ddfafba0700c09a022b6b0e296c641c7ef16474ad793322e003141cec5d961ef24eac8d02c080bbd18e2f1e2ef90117a259d444a3e13100b77ff478574c3ca55e873080b5bb180f8dbce337a4468ff032a1fa7ae740065b58f1015802a1b632e4686b414d0473a669e4ce030b06ef3736582725ae15d83cf768e12dc0550494ec761523f14d5418272a32e1b2b31cd852ac289a217a492b8ad463b994ac5dcfcf02c06c8e7082e6744d2f4cd6356eeb227b814f6930ca4b4c44e6a0e17974a5cd7162e6c23b4bd83c9194cfccf5e206d7e374e8e592848a70ef2f49e156f83b75f20d297e34818a6a450bf4b64333bb8b9a5d3b8223113c8a4396666fa1fd1cc2b88e7bbd28f8b412c4413249fd264e793152aabac48bb16c8170d601789066d62dd93b1b77f7a98d11263d4c716f50618c4acad10db14a687fbeff004ad386449285a1bf2e96e52944349740977387e0fd194235da6549a944618db99c8366a0504264f8cd7667f0b8451e0ce5a765ef99a460c84685c9d5f9ef667731b5566e186f6dfa9898fb07043d4c3a64b81dcee50db2140d77bcedb0578058e91bab05d7966c6e72366badaaa4ea4040ca16945ecfca9ac0dab57fde546db179050483dc246641fe3209e2b7d76a42bb16d0edabfd1242b63b0fc05613acabd8dcf98c340f20c2a2f074d17d5bd511c67ccb11256cc01c644ba2a6a4511389de57babefc5561010165832b8665c9165fde836f744a0ae2f93ae41573016c592faacd834d53933fc3cc1fb6f7f2f0fb216ff61d1e4899b80918176c82e920db4902855366beb596de1d8bce3d22744407c7a72bad5de7c97a041e7e7c3b16b31dc158901afa8dae260fb99a2adf372e6ba9ea12b8b35c85ed4aab15b0cdd2b7ee2261175a59ff48e002764a2dca2a1466054a3f272cfcec9abf1be5c4a5c67d2fd68cf80e3edf5ca6934b6708f0b45f6aba47d34bdbbb317b11b759e38c5a3c01b68d5503998b27d5b82cbc4f5138f558c202baaf76003c5f2a9081a4420c2d5f8ef38548f62336c48a9b931557746d295ea6778cc9851a0a6416a216446bc02eda11d0455459d85038f799d01b64f8e0be2b8c773dbe68bdefc2abc6de2b7681ec07a5c4b1ac9157ca334f8f42135ebcb90859adf3d12fb207fbb2e02ae2f6218f82c821300c9d539c6a71da17abd7696228754c8bd579e15e162a2eb45179e41acfb4ec5eb507c757ff05717182ba17d0fdd62901d7c8079f80f19abd605a8d47d2a0b4822003dec2e4", + "patch": { + "balances": { + "balances": [] + }, + "collatorSelection": { + "candidacyBond": 533333328, + "desiredCandidates": 0, + "invulnerables": [ + "HRn3a4qLmv1ejBHvEbnjaiEWjt154iFi2Wde7bXKGUwGvtL", + "Cx9Uu2sxp3Xt1QBUbGQo7j3imTvjWJrqPF1PApDoy6UVkWP", + "CdW8izFcLeicL3zZUQaC3a39AGeNSTgc9Jb5E5sjREPryA2", + "H1tAQMm3eizGcmpAhL9aA9gR844kZpQfkU7pkmMiLx9jSzE", + "J11Rp4mjz3vRb2DL51HqRGRjhuEQRyXgtuFskebXb8zMZ9s", + "DtuntvQBh9vajFTnd42aTTCiuCyY3ep6EVwhhPji2ejyyhW", + "HmatizNhXrZtXwQK2LfntvjCy3x1EuKs1WnRQ6CP3KkNfmA", + "HPUEzi4v3YJmhBfSbcGEFFiNKPAGVnGkfDiUzBNTR7j1CxT" + ] + }, + "parachainInfo": { + "parachainId": 1005 + }, + "polkadotXcm": { + "safeXcmVersion": 3 + }, + "session": { + "keys": [ + [ + "HRn3a4qLmv1ejBHvEbnjaiEWjt154iFi2Wde7bXKGUwGvtL", + "HRn3a4qLmv1ejBHvEbnjaiEWjt154iFi2Wde7bXKGUwGvtL", + { + "aura": "E8E67m6hzdSKnmdHpkzuEd8JtWR9bSBUq9vwiRufHzZ95er" + } + ], + [ + "Cx9Uu2sxp3Xt1QBUbGQo7j3imTvjWJrqPF1PApDoy6UVkWP", + "Cx9Uu2sxp3Xt1QBUbGQo7j3imTvjWJrqPF1PApDoy6UVkWP", + { + "aura": "CgjLFDEdzCUE1jk9UnYcu1CyVenT1H6YVcrh9QPZLGxKLhm" + } + ], + [ + "CdW8izFcLeicL3zZUQaC3a39AGeNSTgc9Jb5E5sjREPryA2", + "CdW8izFcLeicL3zZUQaC3a39AGeNSTgc9Jb5E5sjREPryA2", + { + "aura": "HbRj7HfC344iugeEtJAHPvhXHH5NYQ2vWLdAyRZutzobqpL" + } + ], + [ + "H1tAQMm3eizGcmpAhL9aA9gR844kZpQfkU7pkmMiLx9jSzE", + "H1tAQMm3eizGcmpAhL9aA9gR844kZpQfkU7pkmMiLx9jSzE", + { + "aura": "FJDBwbp7Zb6XhzPuY5vXNDumKZ7tkrvDArLpZ86x6hS6TXi" + } + ], + [ + "J11Rp4mjz3vRb2DL51HqRGRjhuEQRyXgtuFskebXb8zMZ9s", + "J11Rp4mjz3vRb2DL51HqRGRjhuEQRyXgtuFskebXb8zMZ9s", + { + "aura": "CofLuVWVddqHR87Bp8p2G5A3kW92tF4U7rWudXcyEqtxz5L" + } + ], + [ + "DtuntvQBh9vajFTnd42aTTCiuCyY3ep6EVwhhPji2ejyyhW", + "DtuntvQBh9vajFTnd42aTTCiuCyY3ep6EVwhhPji2ejyyhW", + { + "aura": "CiZGfpBeJ3FgAtksyBAwxyqRaua32e7BkyFM6NXTNk3JYcr" + } + ], + [ + "HmatizNhXrZtXwQK2LfntvjCy3x1EuKs1WnRQ6CP3KkNfmA", + "HmatizNhXrZtXwQK2LfntvjCy3x1EuKs1WnRQ6CP3KkNfmA", + { + "aura": "FRd2aGXXgFY3f6bE4UeT3Ty87tJmra6GRWbRkahEq5rHVGt" + } + ], + [ + "HPUEzi4v3YJmhBfSbcGEFFiNKPAGVnGkfDiUzBNTR7j1CxT", + "HPUEzi4v3YJmhBfSbcGEFFiNKPAGVnGkfDiUzBNTR7j1CxT", + { + "aura": "HAKDDNB1tENBDWZwLkV8VoDJufPQu63KWBF7UFmM6JYGAgi" + } + ] + ] + } + } + } + } +} diff --git a/cumulus/parachains/chain-specs/coretime-kusama.json b/cumulus/parachains/chain-specs/coretime-kusama.json new file mode 100644 index 0000000000000000000000000000000000000000..ebb79e03f045565a915800afee4574491eaa3bc7 --- /dev/null +++ b/cumulus/parachains/chain-specs/coretime-kusama.json @@ -0,0 +1,92 @@ +{ + "name": "Kusama Coretime", + "id": "coretime-kusama", + "chainType": "Live", + "bootNodes": [ + "/dns/kusama-coretime-connect-a-0.polkadot.io/tcp/30334/p2p/12D3KooWR7Biy6nPgQFhk2eYP62pAkcFA6he9RUFURTDh7ewTjpo", + "/dns/kusama-coretime-connect-a-1.polkadot.io/tcp/30334/p2p/12D3KooWAGFiMZDF9RxdacrkenzGdo8nhfSe9EXofHc5mHeJ9vGX", + "/dns/kusama-coretime-connect-a-0.polkadot.io/tcp/443/wss/p2p/12D3KooWR7Biy6nPgQFhk2eYP62pAkcFA6he9RUFURTDh7ewTjpo", + "/dns/kusama-coretime-connect-a-1.polkadot.io/tcp/443/wss/p2p/12D3KooWAGFiMZDF9RxdacrkenzGdo8nhfSe9EXofHc5mHeJ9vGX" + ], + "telemetryEndpoints": null, + "protocolId": null, + "properties": { + "ss58Format": 2, + "tokenDecimals": 12, + "tokenSymbol": "KSM" + }, + "relay_chain": "kusama", + "para_id": 1005, + "codeSubstitutes": {}, + "genesis": { + "raw": { + "top": { + "0x0d715f2646c8f85767b5d2764bb2782604a74d81251e398fd8a0a4d55023bb3f": "0xed030000", + "0x0d715f2646c8f85767b5d2764bb278264e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x15464cac3378d46f113cd5b7a4d71c84476f594316a7dfe49c1f352d95abdaf1": "0x00000000", + "0x15464cac3378d46f113cd5b7a4d71c844e7b9012096b41c4eb3aaf947f6ea429": "0x0100", + "0x15464cac3378d46f113cd5b7a4d71c845579297f4dfb9609e7e4c2ebab9ce40a": "0x20026d79399d627961c528d648413b2aa54595245d97158a8b90900287dee2821610a59d610a39fc102624c8e8aa1096f0188f3fdd24b226c6a27eeed5b4774e123a6a0745688c52b4709f65fa2e4508dfa0940ccc0d282cd16be9bc043b2f4a04c46ff658221e07564fde2764017590264f9dfced3538e283856c43e0ee456e51d4e6d6256f56677bcdbc0543f1a2c40aa82497b33af1748fc10113b1e2a1b460d6a941f3a15918925170cc4e703c0beacc8915e2a04b3e86985915d2d84d2d52e5c49f7bc76b9e1b91566945e2eb539d960da57ca8e9ccd0e6030e4b11b60099f00168a3d082a8ccf93945b1f173fdaecc1ce76fc09bbde18423640194be7212", + "0x15464cac3378d46f113cd5b7a4d71c84579f5a43435b04a98d64da0cefe18505": "0x5005ca1f000000000000000000000000", + "0x1809d78346727a0ef58c0fa03bafa3234e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x26aa394eea5630e07c48ae0c9558cef734abf5cb34d6244378cddbf18e849d96": "0x0000000002a3067479c4", + "0x26aa394eea5630e07c48ae0c9558cef74e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x26aa394eea5630e07c48ae0c9558cef75684a022a34dd8bfa2baaf44f172b710": "0x01", + "0x26aa394eea5630e07c48ae0c9558cef78a42f33323cb5ced3b44dd825fda9fcc": "0x4545454545454545454545454545454545454545454545454545454545454545", + "0x26aa394eea5630e07c48ae0c9558cef7a44704b568d21667356a5a050c118746b4def25cfda6ef3a00000000": "0x4545454545454545454545454545454545454545454545454545454545454545", + "0x26aa394eea5630e07c48ae0c9558cef7a7fd6c28836b9a28522dc924110cf439": "0x01", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da96639be2514832922403288b3139bacc5f00168a3d082a8ccf93945b1f173fdaecc1ce76fc09bbde18423640194be7212": "0x0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9835fb70434ad8c544e7161ee304031d7026d79399d627961c528d648413b2aa54595245d97158a8b90900287dee28216": "0x0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9856aaa163561c5ca3deb5e62c85126a710a59d610a39fc102624c8e8aa1096f0188f3fdd24b226c6a27eeed5b4774e12": "0x0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da992f26db9e1a10596464efc932b402ef1e5c49f7bc76b9e1b91566945e2eb539d960da57ca8e9ccd0e6030e4b11b60099": "0x0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da998f5524a460ad187fe23dfbea8165c7ed4e6d6256f56677bcdbc0543f1a2c40aa82497b33af1748fc10113b1e2a1b460": "0x0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9b1448ce020e3766f52006b47b6ce779bd6a941f3a15918925170cc4e703c0beacc8915e2a04b3e86985915d2d84d2d52": "0x0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9b2f4429c50834c52a099157f11c40a473a6a0745688c52b4709f65fa2e4508dfa0940ccc0d282cd16be9bc043b2f4a04": "0x0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9dc607cc9989171316a1164a926215f70c46ff658221e07564fde2764017590264f9dfced3538e283856c43e0ee456e51": "0x0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080", + "0x26aa394eea5630e07c48ae0c9558cef7f9cce9c888469bb1a0dceaa129672ef8": "0x42283d003c636f726574696d652d6b7573616d61", + "0x3a63": "0x", + "0x3a636f6465": "0x52bc537646db8e0528b52ffd0058640605ae3e8629134f107868930e681756ccf063649703992ad4ee818f51911de6fa91e874d2fe2ba7696b4c18dcb3a8cb4c0791c5b5583c14d76913132861747d5e806b5eae206d441fad0d2b09d95bee2db79452a69402ae14771224121affdebcea431b8a9900f6f539f2612d6606cc7537c8dca73b24858d87bf43525cf01b33f700d8cf11d3e85d9d3fe8dbdea69a20edce5d74f6d7a60dba8ff3e7d1a3cb3675ac4bb1dfe99d4e31f30fe61e80ced1b6698746f0c53b5fc7daf488483d7f3e474250e7ed4d82fe35e1e70dcc6ac647beae04000780bbd38982799429d871f06d8fa2c3d79502e00110799429d8d7957cb80fa7713a51461585c3b191cb7894cc315f5fa7134547455117d178941cfcf275e974a2bc8a7a584539e7afa29e5798a3b08a72750a7694731b177914998a9a99711c1525e3231d8ec351382a6a46f31947e1f0e923cfe1ebd4e944b12acaf26ebf662aaa8757ee37de95cf38aa7da6a262f45751963f47cdf8e551a0d354d48d1b4e2bea9215255dc7e5281d7e55148639eaf21d1ef39ecf8a8ad1ad8ac22aaac62d7f983f474d7f1515631c159d07af8e7a5e2beac60d97a92819af2ab7a9a81b362e53c9787554e5b5a26c2466e328a9d52948311515e33232be234646a687bb65b94d8d655d96d42133834384bdaaa5850373974c1ce988b3dd8c68d44e47f5b0675532579c386670381d2351b4a4c4ae57c988e6c321e78ca86ad7d6484794c1a2cc0ce66e7a78578f745c4e1255ebe62666e6c2240f3c38aa9d071e240e1c3d7c87e77c87d9430f8eb2bc871e7454d5c87b380fd3721ee20e3b384a87ef70b3831bc93cefe13dcc88bc0727390a879378e0c15197f350797092a364bcb9b974780fdf21caf80e7d7373d383a32aefa1a26e6e4498936aad71d4f41ae93d9c071baf711c24e7c15133cec30e3be8e0b5a27670afce83a32c7747bd1e9ac7c4f48cf7f09b9a1a771b1bdfe135ee358e12798df31b2f396ae425cee1e124478d9cc49a3bc94b8ec2e1ee28e73cecc083470fe7c183f370940ee7c18eba9c87d71d3bdc6d2aaaa6a26adc7d878def70d4f41deca8e8d57770d4f31d58871b47557e53513adc788f8ad2c16d6c7c074761dec351d24b15d5430fae55d48e8adae13131cea3a268687c4745f1f09818dfe12819df5151343b9cc651b3ee6c895d73924fea3515455351345ee3737a0f4759dea3a2a87b0f475d75892db1532739caaa4e6c899d54513dd4299887cb6b455996dfa8a81b7e55bf1c252b05ae8ab22ee75151964fe9d3513a6a912db1f370944c1d624bec3b54d48d8ceb50513d2aaa8757ada21c07ef51510b06286c2023cc0bd0700229271d4e18411666b4a10c2c88e28453141dbee34a8ba36e0e755d691d87eaaeb43e53e596d86d6a74388f8ada81c3692a2a35041e84610b171ad8a08c219c74a45a0045154c80042ab0810b17271d8ed25151a34a7354e94aeb38eaba928fba917e5d54691c85d524b6c43e535132750a3e45c1fc46458d3ca64e91738a22725a5118e6a38a4acdc04a1b566600668d3198e1245a2b7ce1810c4cd002304860c349e4285145553527ab34aeb48ed575a500d4edc7afbffaa32b922db1cf8abaea14a45394e756450901842fc8908335a0f0e5062759a7f053941e4750830f8c500529da10865394f6ca515545c5ea5b6247c14a5d69fdd5752500d42de7d75d256d897d3de5827a680144a112e58c126de7ceb9732e4a9577ce39f733b744170c2f4c796f537b3ba94ddbfbf6f61b0905ccb7636d72dfecdf726f9a89f92b469728eb9b753be7d8695893da712877b7db386697cfb58608fb73761b7f3b6625ccfdc9cddc43d902916ddaf89d034185bc2a6763acbdc716c80f7ff926d5377163341dc69afbac898875f92630d102f961a16f9280676fdfac8827c4d9102af4ec98d0b33797b92fdbb4b53bdf76f6cd4da7f9a0edae88761f576593d61730e1af183d90c1cfd8cc2dd1e7396ddae48f366dd4db041d8836bd874ed3a61db2a28a876ed3a636b9dfb0df721efab64e9f36ec379a874edbd40e7d063a74ac4decd0f706569f1d6228937d6fb69c773e59db9f8c31cf6b123ff7ac88e755955d3720f7ec96cfb469c619afab6e975b7e45ac4dd19dd3365dee7c468d7f5eda36699b84396742fa5f93b0ba616e79d4f6310dc8fde55314b5fda9ed5f1a89e6d97771369b67e7ba550eddf974cc95b66f693201ec520382cf3cf3ed7367639b0989ce7593cfbe9acb36c6b06fd83b9f2fdb178335e9a649ce2bf72655efd7777ac7adb64d6a7fdac6df84c3840913e6b7d4af476d0372bfce5536a99d339eadb0d226b5ef3436e36d5a774e6ad3be4d9bfc9dfb5820ee9d6f37ef3ce75787d4c5b0cadc9b8db66f5267bbd4be3e97079a4377080a94dfa128a0fc36fa7602fc0e41b1e53be3f181b2b76f9b2a6f7f6d72de2edbb4df3e3be3a9ea52e74edbaf34fec999f3e934206ec2f39af47c087de79c0db1dba40d7b86754b3d94aed2b6f7db7320f7d137e381bed3736e2624d6ed7d74e995b6f957eeb46ddb3697c4129b135ff936a9f21d27b526a8775e699bcd3f9f8c456ddf69fb9b15f11e6a4ddc3b7fda36897d331e575f93d8bbfad05f1d52153b29e6b689977f7d8eb64d6b6adfe4afbfc9dad2f6391b63ea9c478c0ce873e7ec9df1705ddaeeb46d92f3d9188f2184d4589cfdcd5edd26edf4663caf496ea7392322f5ed9bf1a498d98cb9379bbff3b9243a9707ba4dda280f3b67419c1012127ae2d96763db26f6f5d7a6f6f5cd64939cef346b58939ce3d06de69db73fdfe43b9f336dda26ad3ba76913bf739b36b13b9f8cd1b469dff9664f6ba2c73b49c96f97dfb58648fbf3f65781f8b9be26ad6f3684bdebd6cebed33bbd37aefaf8af0ea966d6c224e8e2d967dab43b04c5d0b3db7010fbec7bc3d5c77f754831ff2c42d9f9b70bb0bed95c22e8867d3bd6a615e30a5abe9db6698748d0c5b7cfb469bd9da64deced361c047ffbde74f5f15f1d52cc08985ba23bf44415bfc95fa76d5a31aea0e5d7659b360c30a4f1eb589bf8d7b775f6b4cdfcfade6cf5f15f1d52cc09981b00bad16727b569c39e9d9da64d1be9d9d97db4899f9db66987a0c8f2ec336dea67dfd6e1d366f3ec589bd6d9f786ab4fceaf0e29e607cced81ae6f151305f7a0082fb86818fa06ba02aa0555014d014501cd8262414f404d40a7d02b6809a815b40a4a023a0595424740a5a0512814f48951182a340ac3a8cb480bbd81880d2230a23588da20724327a191d0478043804278579e954783b7c57bc173c1ec625a99359854260c322a19164427c8c288ac105591a5215b43a40351124459443810852102435445140311151117a217885c206a81480c9112aa2c2e34466b5429a85810d5b8ac706de1ea7265e1c2c2f5832b08d90a322d32156429c850906591619199209b925d9155915191499141c984b037606d606c606ec0da80ad819d012b0346066c0c9818b030606a605fc0b88075c1b0805901a302c6059b022605cc09d816cc0cac8cf885d117e6956a0b110a44598858205a81480b910a4429101d413424e2816807580a322e445e4c1b8cc670554134031110443010fd40b485c807a21e5c564426442f5c24b8a298595c585c27e841e20811091ab000059c8404e1d94140100c18328449844501083080111862ae8829418c153155c49020868a982962a4c48c20468a18283151c444898122e6891821ca06ba060a069a06fd02ed02d502cd029d02a5028d02dd429d40cda065d0265032a80d680de80b466f18b5316ac308cc880c2068c26734c6c808a3228c8830fa6234849117a328465088c288de2062c3c9072a9075c9b2803d016302a60586057602cc04d814ec0aac04981558151809302ab0293029d8083029b02818142c0a0c0aec094c6886996f986d2899592617738b511a9305233546629842b38aab0da3345c57e0a1ab093f5c595c53ae125c545c535c52ae115c525c512e2896172814e813a814281328177a86e5c5e282b5054b0b161a140bb40bf542bd40b96055c1a282c5c59a8225052b0a16142c33ac2dd615ac32ac2658645856b0ba40d1a055a06b584aa06a50355034d0335033d02fb40c940c740c540c56181618d611ac21cb081611ac2fac21583bb078406140a9583d18916105c1f2c20282f5039a06cb091616ac24503016122c215845b098608d612dc1d262893112c228085406a333502e680c4662585fb07c60a961a56185c1028325068b0cd6186818e816ac275859b0ca609d617519fdc0fa32528365060b0dd61aa236ac34586a18ad61e486111b2c1d58594640b0b05838b0bab06e60d960c48675c5b262d1c09a8155a59760c1c0e2c2a2626d61bdc07281d5028b05d60a2c2d2c155829b05060656161619dc0328135c5bac22a81658545028b0aab0a4b8a35020b8a258515c53ac3a80956141614960cac272c211946be41b621d9906e906d906c9060a41a641ae41a120dd20cf20c232ef28b2c8324831c8314830c8304835443a621bf20bd20bb20bd482ec82d482dc82e320b120bf20a120d6b0a690559855115464f8c84a8154905c9454e4146419e21a1209f40af8c9630628295032b06728b34836e21d720cb904d90644826c831e412a416298654820c438221932091208f2087a41164112411e417720852083208d20b0904f903e903d903c903b903a9039945e640e24062915dc81b481bc81ac82bd28aa4819c81ac22652063206120a9482ee416f205d205b20592057205520ba902990289029985c4429e409a404e9157c812482b64159204920a398594224720a590512414198584423e2185aa30d51baa362a362a37546da8d85081a9d650a9a14a43b5468586ea0c9519aa2f55192a325463a8c45085a10243a5469546f585ca0b55172a2f1517aa2d545aa8ba5459a8b0505da142a3b24255850ea3a242c5a59a4225852a0a1514aa27544ea8b654665465544da8c8a898508d512da112a352421546054695840a09d511aaa1ca0855112a22545f5443a8845005a1f2a20242f5838a07d50e2a1d5459aa1c5438a8b05437a86c505da9685055a9645051a9b8a85a30b242a58218850b4429c4332214e213a2135807714b342396119b10c918a1a1b5f0117e9a64400314a02d9880048800009631f997af36ac763d4e926ce0c812497a92387264b2438249cf9123d772cf920d240162c204078e001dd1f3a30409264a8e1cd9818333b7209a5aa8995db6034a38c044891ea0243d3f473851e2a487498f909b9985238e28c1012643962c5142014047f42c59a284020230b19033afb064499223962c49a200349200ea00939e2556d89e1e0e1c5102e80850121d50d2f381d2a4c23a59a22409500f12477a7a38d0c394c22ac101264a8e80e0a7878926204852c46714b6e708264a303992e4889225bee708264a38008809134a1c71c4e330cf404289237a90e8319fb04e40d0e373c4891310f41061a28412274e7a20a04d27ec07942cf13f3d3e3f4a4ca0086d9ab13d40499050b2244913477a98e861c2082348f474a003498c046096b14e7c8ee849e20826ac1320263d3f3d493051e2730c264a385033b5ec114a9c3051f203e444cf11102c59628924477e7a9058a2848993cf114a2c39d94c31d6098f39844d72c4667ab11e38920428091249807a1a10337f1002254b92280152c244098eb983f5394289251b38d203c4c4113d4ef4dc983ad81f251480cd1c2c13259660e208124b9430b181234c921c7144c9120fc4a4c7031de88100123d4830b1e408264a984420c90f13dfc3c4c13ae95102a4e44789248098482233b12c1325940025f961028923404a2c717244c9129fe48789c7a1492a545fb40881e13735774848e839e576446806348397e0ea3d4a29757fbc36bb6ed731f3ba9672f246d7bb8e37566e2bcbc554d5c41c740b7158cc11e2d86a1d77dc8ebc91777388fd627cae1be3de75ec9e5bf71c4fc75573746ff7b98508b0625c553de77663e55ebfedb5dc6255c5ecb6c2dc5aebdaf5365c87cde5deaa5a5e761c63ec7671b9e265cc6195855558d556c4aa6dcbb5e524ef728cae8a514ad9db2d999b7bc41ca08a7131abaa9c9bcf71e5981dbbcab22ae79c735c653864bb1b63eced8d5bad73bb8f5de5b059392ba6821046765657bbcd6eaf1dd78ebdf8ba78af6baf6b9977fbdabdf6daddeb8ad775c52737c618e5cac85be9d011a3103a742ccb28e33e7e1ba37c72c69532f27bbb71e36b51f772579cf56e07217966cd198b98bb29740b24eeee7237dc8db137728cbda3e6de2a76dc8d312ec7b81b6337370eeed8bcccbdec96972bae7abbb79de36880d8cbcbddbbcc1be532cbe5962b77a5e465761c39eeee9c1c779dcc6e0e6ee6702bdffcb18e2d6651c5ccbd6e7723335b722b1eeb74789979f9e5e851e3606667e25d6666b70588bcce31c7d8cccd6e5d8c1de5b2e36576ccdb3340f08a9a2b5e5ec7046076bced3aa6b707c01bd755ccb1dac5c1ccd5ca0a13ad28e3dd6e166de7f8c149862d9b7b7977a55cc9cc92979717eb8e317616bb79eee6eceefac0bbbc38ac6877779bb2e3dd6d8e2c775900bb2ef632f3acb663dce5de5de9787b37f2eeeeee72efca1665bc8db3a3c831561c63ac7c543c6300e27b1ce3e3c1dd3172b41ef3004089793b3ac7ec1cb49ccdf2c6b8f1c5eaade38e0bbb63a28889e264b641f0a384077a3c1073ec0f1d5062c9910e3051d2810e28b164c7c8659ce841828992234c942449e2080e7040894a80254b94f8e4907ae881c40369c6c74c0f3b00e0266784c41225491c71046809134938d08344e9270990931e464e76ece0e17344920d2c59a2c40f007448d2f3c383a6c7e70890133d4c72e8e9c08e1b4e809c2871a2c706021d91c40993243f4047809478c0034a906676004a38d0f3b34495f949d2b3e4889a11124c7a965822c9919e0e24f95102c849dd1f8092fcf430e9e9c00e03f87152b33f8080034a7e7a9a3862801f0a50800120d1a3c385448f13273d3f4b784089238efcf434a1c4113d3f47923841e2889e233ff8980a3080258ee871724409a02540f073848eb603005242899f2348f4fcf420f1a3c411530106d0a3e40708004ef4246123c30120268e003151f2b304cdfee00125404c98f839728413251ea84098703015600003e8f149b264037ee3c7007e38e284121f003ad201264a92709224891cbaa7e78703364d30e971727f38c24409254e7e7a9a38e281233f4a0025394289254b921c0172a227872698f4b81e3023f4a652a989645357ea0505a5229220de54505010076d50502a28a8da542a15e4906c073d24290e0a0a724882381514e490a43828d548521c14947a290bc9a682828252a988648352412917c4294612c4418c645341a9540a3a241b946a24411c14d448368891a438885312c906050505a520920d0a6a24295e241b14944abd548524c541a98824c5294e4124294ea51ac92e9214a7520fc9a618c9a65229876453a94692003705de5df68093241bae695f691bf4428c307879a07e9845c8e96c177870841874e18b1b6a2074629f529cce04bca08104293790628a2f4eecd7970b0cbcf2fc379865fffad2a6f569610c056d9f17c67486e7cae8e25859130494e181d6f93b2382fdd60c117df55b37214fcbd68d7f49efaf2f4de2ed62e33f3eed5aa349ecd717a77375e9d224f62ecf5cb6c0062830610d6ac842c589b7b8e00660d410850e700084e7cc0ea9381d3e31bcb20fa7fcbe4c88fbe7b249bccd3cfb7c5aff640c2ea9bdb321f09d3b587771dabdb37269d2e95c5fbac4cef239bbbeb06fd797e71c4fe00285284e18c30dc29c98070f7ec08221b8808a2160716287599c0e122d5070852a66f0c2193438b1432f9cce07be9082136ce94210a6b071e22728579f49c5ea1e4213face363d5fdfe46faf49d02b0dfa649d3d6d744fabed4ba753f39c572e8176599f486fafea132c4f2a77bea7e9984377c2e9580ea75bb91ca8497009a733ebc583a449b0e6646935afd61881f97409587ed527975b3eeb132c462eb7fcc974ccf7049768d2b66c3cf4693dc71e572bd99e9e06d424b884d341d225e830dbe49f2c244d82d0b7edf2d029741ae80b5dc259d795aebaaeb4d1223bddd936093a0b5107bd72e751645653c4d59ae8ce53a75a136b8ca9d3d3f6276c298f837823e0a929e27cdfc8e80c43513875e5ce8d54ee2a0acb7394f3ca5f3522bd2baa5d3eaf892e7d4f9556136b11cb2bdfd3640ad4242835e94ad02b6d5d29459d6812f45897681274e841947ddb2f1f54a5ba6594d9edd137f97ca33aeb4ad0a9f3753a3475a371a5577db4ce9e7a495c3721be1d886f7fabb35b32452e98000b6378e79bb91d0ac3dc9b0d6ef9f6b95c73e2e8ec1280be95eb132c46d6218c11ee09f2b24797c03aac759779f7b4d0d708f4f527715d8c9030529ab44ffd37676f875a9cceba95e856a0c321a7132bccc25a8d73e8a9d36a35aed618b1ce6e642b0a8bab46d86145416747455f4f9de6728c6c121c6a526f908c2d395fcdbd6a0582a1ed090e391d98a54bed55dd2e65f90d0efd9e1866598e11f286359ab4efbfc12cdf9ee374560b9536d8f006194c61ca144eed3f9c4e4a8806335063073d2042185e4eedee745251aef84210c4c8a2a5094838f980832e70a08427e4200a5a9cdaa1f6641d7ad49e6071fe24ab31823dba11f6e8ae1a598745a044618f1e651dfa936f7f5c164810dffec3e940974354cbf796369aef753ab1ae2bd1871ac995da377314dd6711503204418b3294b002229ce1cba91d6ef9d521c8a55c8bb64420756a7fe23c8aab2348c0a9bd6b50738fc95db7d4b6e47ae7cf3b2b02baabdb7358ad447f99907d2b52fc146bd075c2e2dc6544ac7f752bf2bb38d637635db7d4f73ad116811f2d2f90e594ebce62be06b0d0bfac08fab1bae7dcabce311673b333fe3906c63f083cb71c8b2a6f41208b7f9e61d1837f2e7d03e2d737217e479ef9aed3b449faba8ddfb409f375529b2c5fcff9d1264b7b103a585d97b65f49e9d8fe48fa4ed710991e9fcf29f2cd1a30e7259a5ef98498ef43ac06a91c3abcbcd2f861745837fe89615656c473acfa44df9e3b49bde5322bc249ea2ff7b1fcf9ac9be55785515b2bf551cb1cd3523544a0670e3df3ab6ea9bf469af4cb27f3077da441810205cac8a5d8fd81f924c5ee0f9b7bab6ea71dd704f5236d4f32f5af89e389b94233771991e796bb6c8874ab6e99cb5a63f9f4e89d0dc96a8d5589605e39e6953f9fd8f4c11ad018c60feb66b9bcbc06fabe744bab81354874e9b2ee5f6efd052d9f6ab3a474e7b036e130d05d11cf65dd2ab7fc627ea8f10771eaea99c514361c7b8ca146e8becf9ab831caf8b105b2bba2ce8a784242bfceebeb3c3f72b56e2bb4877fbd8b13fd396b95b7bb2c08fbfab540aabab9ac215255f6eb19ce6d67ed35a9637b5cbfb222e6e2b46fbd16a759e8a3b68bd3fdc4f7f0afcef411a673a75980b23f1fe826bf29155434fe190b50f6ed1f7f9e822c1fdd498c0248a43cbf221440c115f7d070a436d544875ea44ddb0d05dab4919024d1a68d66b510d126dea12cd27878bd16ebb745c3cbc3df560c3af0b4bd77b41f7274177d971d28fef2dfb4a90987f959078a1f9d332247be3db62f77ddf5c12ee3619facf9c48c08e72c8873ce95083e3aeac9932019f4d1b7b71411ed3eb26eced7b71824ba23d2eeea13d69c4fee26e29c6325c2346daa1cbacd32a1cfb98d5f31aea085ceec10165e3e6af0699b363af4d919116db4f18637fc6661d6c77ad438cc6f26b43e5ae889676ff7c5126336e16fcca1b7e684dfaa3eec96abe08b0fc0af186294e0b77ee8acfdf0e2400792df64c3fcf4cd82607e5d93ebc58f695b74e896b63e1702cf319f8b01ba432a20e39d5b9606b1deac37cb9d77468408e696cf877126a49a6e6998bf8c880c229deb2e0efb4e63dad6951787ddf2a96dfdeceb5613f29bb83708fd7aa56d409c8adc6acc5da23d8d8753f827a404ed1cfc0e51a9c13717bf435b50f1a4dfa11708e1d995a00e09bf432b00f30cc6ef90163d781fbf432a40e3174803b97ed987e8a305b26de8442e395f5ff61877aaa8b138d1b3f73b55beb03eecc7ba75dd82be89fe0efcf0b35b33179d18b64094300634bec9e89b90cfee3c7210fbfb5bff16dff97418cc864c36a6fc26848d2943e26f4c9840094de8f24d903c7fd9e29b04897e03da021668b8f80de80a17730bbf0191600bf0372754f0410084b0e537275e6c7976ce864821a1212e1bb2619e1d6643fc9bf0479f51ab382302bdeb4603a18fde5e6541a23fdf71bda5be9ac26f4e521fbdd29a6c9830613ad54de09881d03f197079edb59f8d551a9cc2b7d6e33913e2df1eb52670bc0ad4443c3ad47cdaa3cfd63a13c261a057b0d60c790e5dc8735881e60e5561e381faabbab537c10f3df5da434dfb069adfbe65b4d082c1d3e409b9edf2bc8068442fcb41701a68fc7ab3ce9ed62f0ee209fdfaac30970559342a29a58c523a862411fb54019467af9c9f4fa8d56f9e6c04cc2b8d1dd37c2a677799908a48e55c2d13ba435764f19757ce45d01daa2286bf1ef3391dc69910b959ee5369dbe595cf4aab19f284843ef3f7ee37f34aebcf7ca72b0ceee28cbcbdd2443ed2b6ea65412a1755ef2c48e5d4771cd56a88542ef2ca4555ab21727de5d75795c7e2bce895b74fea74f6f4bcd2669af47ce4226d7f7136ccabac88eb31e7b1409ec3ac889ac5798e551e2291c642bf991016b212e33b4d9d4e4c7d5d7afe467593bf519fca2fdf2a5f225246b8aeebf29d9e0fe32c087be5b221955f3ea2c5793e5a9c27f46f719e07e8137ae2339fd6cceac87771ac918b2c6d733f5d3445d6f44cfb118d30dfe911e6a299616e4daceefa98d572fb96b65e6dec1b2b6d92f3faed5957554c23f4fd0e95a00d2314fe0e9500cc2eceea508234dee677a80464fcf3cd5576decfdf7318f40e7af9579bb830619ecf92ca64cb98b2b9ca1e372b62cb98f2b15a9941bf410d32d932a63cf42d041f6164720028430fab952741b2ae13ef9c7df6d39c6f66012b4f82d6cbc9f2b52284831533c882cacf0e5472a045086889f5f256847c980212849a3800942127b6103c8462bd9cac2ab45e4eeccead08e5c0820ea2504348e8b4f54990ac42cff4eab6c43b8fd1021668f006284242a7cd1a20f3b0a30de6946f5fefe1b75d6dbf6781fce4bc95e7a9f5823bdf5761852205ce09ba149953156d9af9761e312da0db925fcff96de6b7ed42112850e32a9ad4bed18dabf8f66dbbf0eda8e7d495d2e002207001842c5d84844ed09d6ff4fbe434a1778312c8008a1810e104450a9c93732932a707458a3e459782809373a84941c00985c588735411576a775bbe1d3a0a8b91e8b0a2765ca93d56141623d05d45b92bb5c39ab3edd090f36db7ac1a46b0042b63a8820db4f084982de89e52282083085b6c71042e3b40c3694fcfb79c6fdfcc880b099d9c57d1a61ebefd694e5b579af2ab43d04b713f2cee3d0d3a73056105217c3619ff0e5921060f5442196880fe789a70987f1eab4d93e07bee759be17c1708f4f5091d3be92eba8bee2a772ea37317dd393723180f6a1b63daa373f49ae7fcfd352f09d1a1c651428dff693b44c646dfb97bef9ccf389b772e311f287b8c610f723df36fc6d36e5d371731a3cfc919cfe5d39f571ae6bb4032873e332df5dbac329fcad7a7367f87ace8c1bfc581bd5a3ba6556e69fcedab49c734e99610f6f59d96755b973e57dba6af4f8749ad33e7d5f633cd47bacff4f64b9bcef2d900cce774de6de224f5996f1f70431b61dec96eb99205159fd56dfae53b6e4e8849ad2d7f3362526bdf4c0811ac6e4ebce5d3e76642b66e0eb320975ffe9cf1ccea7305b97cebe59b0d916f551fe9ed9b24d22eddd2f6b54d4d7e4e98bb40a2afc31935209a04bd089fd324e89b6d360fdd6d760486d9b4cee5d0855820be38d2a1fb68136d92b41cfaa56d97a4dfb48eac79a833d325e9d0d705bf01f1d06b16083f9c9666d324e9ee77c88a21709818f35cbaf3df212ba43c0d67d26b2a77df5f53d5261ce62bdf212bbcf855421968f8198dad6ad32459697071d6377b51e37756a613e26aeffad8ac8876dac61f75a05c0e058b73cbd7e7b4b41dea9e8d39ccd2b68b10cc88785911ee9d5fda9e7ac2ed77ce80d4152f8bc8d92f0ed879e92e23d2a3af7c6e8bb6a0298c7536c40ee6b221765e7a6742987c93a0af7cb321d8d6633aac3306a4b878e9d3612f0b92a2f24d90bcf4d92c126d4154d6c7acb0985512bba4a5ed695ad8a5edc9d2f6d4d990f658376e5e27da827e1767db211364f1d12f8d5a9a0b090909099d863c77d5654d9c8002c51342ffb34d8a1eebe63a2be2b97b1fe7d0371b62bfaa4cd03c10cdc7ba8bb33967e77cd89f56436403c1b7ef6fc6d3bed3419d8a0dc148300df09b366d3e3cfb76f3ecd510156730cd3740c483212aae4ce962b5ed0204611d4077a8045f3c0bbdf3395adf9b8d85be7dea30b69a11d4879f78e8fd1b061acc787ef6ce88b0d0475fad893784febaf35d20dbf39a21d7bfda64f4eb3b85cf795837579ff786f9d9d86a45283b3f9675ce9a7813faaedab0d0af0e29c85d8369013aa70f747d46661aa18fce8d3158935e93667c882269bc78c6f3e752aed3d92e6df437ffe8734b143acd4e9b3639449b368aa44dd18568d3fbe814e8c147c7409bdc47b75c3efef8b8647cf4e73b5d85d0c718638cbe37b1faec9716c31c52f9f3f9b4c69e563daf76fa49cb77fa69fcd2a35bbea5ac2867a535c1ffb426f82b9ffcb4ca67b72fcef3a91a50f97cdec4e6cd9d0e7b5aa579d5b26eefa547af34d7af6ed2d92bdf7152db6f82faf6afba6a29abeced35497a6741f8337fda937503ea6fc26cfc663c9957da567913f4973ca1277e93dea462e38930df847ce94fdb30770e359fcba1cff9aa7ccf9b4828503cf13f4dc4b7bc89ea9da4deaacfb96c527d79ccdf5fbed3b2fff24c6be2feaa354378e8a1bf8c07bad39eefb8cba1d644bff3d9cdebc30ac20ffdd25e5537feca2d6d634bdb226659965b55fa8e8bd1fde624f5eccfb11ae4f9c3ba55d5e7d526a8dfdcb30fa1dfbed3537ba39d7135cfd99fb756f3bcbdf2f934f6c9d9103b95b33f2d0bd25ef91bd25e55ce4d38cc0f10b6d99025862079e972dde779e5536adbfbe7ceaa3f4df68b90d003dd78e9ce01612f8b58e2d27e9a24e07b719e03c5bf7ceb7f6e693f9703c597be1991236ff94e4bad498fb7fcd29a24e079712cad098779cba5b6f13fabeefa789d0581fe9c339e58b7d4477f9a941a7ba5edaf436dcb78de8f9b8c7101f362dc419f50dbe78c619005e3344743a64f9fd8e58bf985b9e5d7a5cd3469ddd2a8b6ce3ea7d604ffc63f9db526f8e79c3e7b79fb89b8eef4d47ca25bb44dd32b5fe76c8ef8e7663c1b6368932ecf79cc39e3e1bae3769ab58ddf27bae50b84bfd27c71d6699b727e7d6ab4492bbf2212ddaaa3cba13fc79cb30750bf2a4d93d6b13ab34ddae8ec736e66d52df596631a6b98b65d6e5d757b7ff974d65c6ffc986f0c4819e1777d6075bbdc5ddafea5edb3e57ca7bbc9fbca777aa767d436e8ec52abe1da84bfaa366008097d0070bed26c9ac40f53154335e67b9a11d4e7790fbffd8a71052dbb40b69c872938e47a3821f4edd52de89f6f5603960b0fab15e9ab49879a047c98c211c29cd69fb6a1fef92c592f5f79f42de8a1ef06b1ebc3b64a1023cb03f15795c97af9262e4c988fd5ca93a02d63ca4956a12d63ca867a58b7e79bf5ce77dcd37af8c998d4d637b3c09631e5b43d7c10a760f71348f0a57faee0d24e47073386b278f1811bd8c0e2340031ae1802038c2c68c18cd3521650ac49ecd5af185190f1fcd40574a3cfbe3d280616bcf0faccb958caf1d826b57bef69fc9b5d604a9186d6c5641770c6801628e04817fc7ca75f95756f5c076602b649a3c907a09b3120f5efd514f302369a77ebd2f93b6dd80be9c2058eae33ddf6c698ae774644eab7769fad4d827e7d290d46d0c5efd008aaf86df4cf03f02b0616d8f8d17b93293bd3971191fad4b3b7162383e9321ed80e8bd099b2434d7b42f8a3efb46c534d10fee8b1ca678701fd63a74f29fa2ad6b0cb6b28c65c1e283f12acb0e577280842cf84dfa1a12c3f23bd9d668154de35df3cbe779401ca3be7f2ae02f53341f3db124242420f44f3be8d7eb7986f511031eb43fb16f34b7fd77f7e80e4ffcccb92efa5ac1b74e90e5627eef997483fbf3be7efeac3ffde879fff2d4e7bd4e0e2b4432d2e4efbd3aac5e9773a335d6ab740d81f0f66045227e87bf384fee02f8d0512c4b3e72c10d1b3ef12f608cf6e80e7e6476a12fba837393f9ccee5ccbe2d18ccb74d23f36dbf4cf76576157b99060536104de21f394dca81e2da0874fdd26a8acc795d97b310e866d94ca6b5d0b3bbcaa3e512027b82deda0f57629fda3a8b3db257ec982b718e2b71105ddf28b452af2b35e6ded4b8392f8ff549f42bfae54f2a9fbea79a2295d73c604f95d7482012e1677fc0f238e73ee39f731bb1272e22a52b3deeac0894e8bc06d61a232ab75c0231ba15fdc99e9268d2d3a82b3d9fd222bd3d9daa954b906892970f8aa9ee87022663097379a0d1e7926818d6e830c400e6379a30c090c6f7cdb743cc4df726fb938eab8f730935f6e7136a1be65c375b75637fd3771c37417df4a96dd02b7627b1fa3c677fdacc4809d4f20db33c1b02ddaa1b84ceeee35c7a673cbed3186d53f4fe09a3bf8c88d4479fbc5974970d811eeb067d9c470d3a67cf1fc699f3cd5e9d1cb330e736378b60fa3abb8f6c127c0fbeb8bda58b4081b85d7e68d866a1df9ef73a674458e8538cb5ceeeb44e2fe6b29a28352896579a1479aa7cb52dc8d2a4f871aa9a780fbd66085379583bab89b548e5fb46e849c6589b8cb6d43bdf718f855e2aa1ecb0df0dbc108318bc70e5b96eb7c5b46415e1ebae0b91f0d87557c1fb2c965db9f8207cf2d958b272cebd680388c936bdc5d937332333b383e776d0bc03cace6ba13e13c3e42a55aa089fab52650793b174777753f9f52a0efd3a7c8eb150f6ee6e2cddbdcc95951ce79c7331fae69c732e46df9c73cec52c94c6c66f6a8a48df37d242a7b89a15ac4291e2c7493a56a5c8d3f476ea9cd32e979a65e55ae29fbb186384afe6017bb21cb5432710480781e504f8ae71be5fe36a11ab7e104cc57e4f98ee3d20a5a3272bf75cf3ee7befbdf766bf7efdde7baf0bcadef0caef0b9203975f9244c373bbeba2a3a1f1f7a0a3a3f764e55e571bb0737eefbdea5d5de6c16389837959b28a901f3333efeeeeee767777f735459516fab1736ed961e17471166255b538aeaa6a3bba38ebef3de8e2832e466d9fbb7f75fbc0c3f8dee37d6f6f3a7e615a39c08173ceb9dd756d7136c2b7a49919991fdcbf39bf6c85b20b997b7d130e0384fd606e04e886e1052d9e170c2f6884d1052ddf4260bf1c84f48d99bdd9977d606666e9b06e93a4b74fa94929233373e5eea76d4bb0675f162c796d9bf95d93f42db6ab8074a5bdaabe26f56308b56daedbf5ec2d3f56b56eecb05ecfd6fbc82533cfdc98abc17421b11fe6dc4f883d0cc62cc8dc261ce6c130e5eb020a2d4e77df80b26fbb73428bc32fcbe23c7666cc1e78d8a1bbbb75a89af7c801079b1a1e3b6874e4d071de2d5da9bb7b46e6460c1d89326c5e96ac227cae797749dc3269cca6a171ef0137e7bc9fd4e12dc9ca91d69febd65eb501b773ce061bbfbbab31e6be0ec11698a50630cbafb373a82dbf575c965fefe79c734e079306efbdf71adb480f5d3a57419f7315363371ab78758350db97da12d273ecbdf79e7befb9f796dd833edf7a14428aef3df8de7befbdf7de7b71022fbf60a63e302600e7709c73ce6decc3b9e7bc3801800088a58a24f9053d5cd682f1eb3b561c0fbf39e71c57a1ec3beccd6fbbbb980ebf39e75cacfcc6a64955a4a15538e79c7b22cc69d64939f43987bebde7fc39f7790e6a4efbcd39e74618d3c039e728e662305737da23e6460e3237709891c978d6d76666dbddc5b139e7dc53818e4743b3edeef2d891a38647c6b3bece39e76ab6dd5d9b2d8bc30ba40c0e18c9737ed0dce891438cf7a08e39e7c579331855edc60715558c6606ce39e774c054401dbb71ce39b7c3eef260f5b0bb4bc2dc835e6d4f96d69fbbcf74dc0e8b01c036db75c7825d0780b3b98101c068de5bf2e3df7b3e305e0165778e310e66a9c05b4072f40580d33e08809d9b39ce391f30e7727c10008e8f0000a044ea81871d6e74a89af7c801879cc806b8623e2f9e5da6f1ec95d3e2d9636b797608e6d91f5f7976c7de5c8576efee48b66963df6ef6daa4b644eb550e266f217b0ba7e1ee11055ecadc35bde73a08e85b8c31fef043df628c11a8df8af4b92c031a8617a6ccb8cc480b9da4cfcde03a1dab4a9127e91dad48dfa2573ea3269b14a366f98e73e21df42ad68d1f42e803d4efaa74996f962eebba9263c3cc18ebdddddddd7dbc8f17672dd891573a371a2d10ab128916889459b6402a0bc31648bce6371038af6b813cccb21688cbe437901655d50261fe2dc6759b73ce55516ebbbbd6b6bbebd63d77ce39e7e6eeeeeeeeeeee2e2683c9ce9f4fe79c77cce2ec5b20cdbc7471b8b9ccd95ed0a6f2256e692a5f86788a175ed0f5b99594a29a21599893a9cbe25cfc577771dcf3f10e0b8aa3c1f03ce62de664da2497518dafa0eca4efe659175b8435098a6a863cd76d027fc59c23a6ef47dc216a735dd85cc65af4b220d663191dd1999d19c9f015323338640e793343696c6668f707de3dc628f6ae3ecaa36666b94ca1b1a112073601dd489f430fe77cc7396ed6b220d67badb5470e38d8d4d4ca63078d8e9a03c74cad55a6de88a9b5d6ea830c12e672bb0747f159815699107e4e717d528a7acb64cf11a21db6ab56a2ef34d4f6d41a10a7c8eca7e7ccccec3bc4679853f26058bb97f1c08ce7b9e6e521da52cf3398bba6f75c07d1fdedfc3e3ffc40d6b766a0de35ad6fedcf6577d76d6b7fb535ed55ce86b090d0efd077ed366abe63c063877b344f470e1c3352a6af37f4e3460c1d65a297bd1c922badc4e88c799725ab7783623107040089475ff29f83c1d3d23068aeb97e132dfbb061bf926453c36307cdb20feb03e0b7802639e726370771621fa850765e9c8e0f02a05f0a28fb4ea321c48f997e6020d1a475867b042dbed7ffead6e45d2db927faf7b0e79a5330f31ee9610f93a49b1c1f4d5a8f18e708f1a35905db8f5fd7fc1ee96f9ab4ced92e4e85cf3df79c73ceb98de43ab2f7e877deefea1681f7a8a3c27258d866bb4b7ebc2f0e6be692993437b01b52e63336311915714179b4058db7086b52166333c48f17fc98a16912e602ca4e69de3d9b1cf3b26cf85f9d9196dc4a4754c19648d07a2d7057235bda6037bf9ebaf2ce9fc62ca0ec6fc972714eb302ca4eda195e81642d28fbba8e1ca37f3d2a8c390789c93539dfd6b7493ebbdba41c16c6d63531aeb09841d1c835ef94c1903cacdb3aeff13e0edea882b2b7cc25dac5c17161ec72759e6f9b72a84ee5cee5ea44facf47eff3a2b6aeb4bbae3e7f754ea771a5751cd84c2623ba318aa13466c422996c06c34133735c3a2c1ab963f2c06a86a81d6ba0cdc3c1e5f0e3d7b97b38c65950ea74a2b74b8d46c331237323c78561fdebbc0cb38c86aa80b2b30a9ec8f5fb76e68d9c61dae2ac3bf7e2b74f11c6f4b928e379759ba4fdfad3f153fb28e37970f4be7d528cb3a0fe5b0cd63752f06430460165e72c28ff0299a9444f93fccfb94a6c5e9648e4823af53ac919f201eeb4c5e49785bbfc7abb29bfee7ae8d71f642abfbed12bd06db7fc3abd025dbfc2f6ec35eba9dfbaf5b7cf2ddc54fa8b1b7a3c056e17766e3a06ed9aa263d0f529ab28adcdc9f79626adf3777d591667dd2ac3dcd8db39e7ba7bb44d98dbfb76a2ae589396f43e6e51f4b36349c43fef97fcf817455d6b86c46fefefba4de0b999d13037a62c6b86b0737651ac9fdd2451fb4e3bcdc6ccee3d77af4a5733c4bd737e57370a7cf33b2f338ad9c6190fd4bfbe39e6d6bf31b34f13eead80c0b9f59b19794242ef3733c24242276764874e8e9fbb598ab9cded1ecc82588f05edf6b916b7c86de0d937e917ddd13c01dd5e267f5cb1911e7b4de2166d93f80abad1cfb220d69b805e4137f9d439b5f9e5baa5b6e5f2ed3c85b6f3a769125f41d767cc7331313131cd9b43b4a57ef45db723cfd5714585c9cd39edaa95e73bdd1a104d5acf713adea5f57ddea4f5f5cd7fdde9ac195bb0a0e1062590620c284ea92e8ef08420d4e009617081c2697dd7e5fade2c77e1ad0e942838cc090b7429e429068a941fa71897429e9ae6d4a45333e6ab03458a1fa7cca5c893c837880029323b8014d229f32d4608293f4e996f32bfbecdfcfa5b20bc4ea7691e07e76a45c44570f09d9e4f28051e980512c4b73f5fe77ca3d17d34e9f9645afd10a249cfab0a8443e722d04dfe06840e9f9e0fe17472d8780a652935be2d181bdf58a8876fbb45876fcb85c6b7edb2c379f8eca1ed29071d36d3e948f9e76fa391358744fa079d339e056c8c90377869d2fe103b4d7a43597016236334c853feb9eca1c5780e1a9d1a3f0e1a9607ec098af3761ad7e1317e23071eff7c331ee94b8940d9d937da43739e83d6ced9e53834b96acde50ebfa0ec1fa39db8f4bc352852f86999009b880bb0ed1841448fd59dc579ce43a0ec9cfdc826d26715b25f0981b2d75cb58873ed4e52226d67b51481028587d338941daec3e7ce02117d8cb746ddd28a34e9390781bacf1c07a740e638d41ae938f89e2820f21a596b8c88711c5c02318e437d82c5483bf527ce635c02d471701cea9376ea7bda537c00670fa82912e30fd8538c4b607486a1334ed467d7687be2a1ed6987b6279ab7d18a408932f21c0eb5c5e133ae43db13bf8d36f21a2d87f3d070f80e6dc6693419d7a1dd7023f60445c66f3c604f50629c3a9d6912d58670a5e7315bfef90d2eff5ca6cb3f9f49e39fe3f8f2cf732c987f3e62a11cda9e70687b9ad1f624a3ede986b6a7186d4f54dbd3484b6dc65364c7955e8ad234e9f97b1e4499077b41d9455aa6ad6320507ebe374f2665f5880b6dd224f98f67df727e57cbf33a8dd37192d3c9d992d3e1d3fa10441431d2a6caa9d42a0d5b127bd4e49298b4a41dca71faaf3659e2fb9ba0beff7d376b334d724e9dcbba5d72cedb5d682e0f7407cfa137be198f6c52ebb8fc1bdf9c7b9348ecce7d9cefe03b4d6a93ab9b3f0fde966fa31dbef5b87c13f1f02d87e95b56e31b0e986f988d6f36efb689836f3522dfae1c7ce331f2cdeae1db8e772e17c8f319df68a86f95fba623c6b7a8f996e3866ff0ab6f38a0e3f06de6657c733af826f3ce7b8144d7e15b4c0edf6e2c90ca9dd30542e3ae6e3cb8f3c983466a52bbd3bc49ed3b68374d6ae71f50fffdcd7f089267f736b91dfcede03c68fb2e2322f53bf864cc5b874feda41deae6cf156bd20dfb806eef67686cda9ddc125747a13c21e72d25a51bcd3bdfbad475a89af7c801079b1a1e3b6874e4c031f3250947187aa6ce656ec0771e43ab773e125def3c9bef1c9bd93bbf44efa4b68be3bcd278719c47ad17c739d4dee2387f9a5c1c579b423961d930ae10c2efc05208736fb649855e643caf15b4f28d185b417b9fac9ef3c357fdab9b907f5e2c0e14b4f22931a65ff0c80c7a5141ebcbe2b07769d2fe36a75c5f9ae4ea86e49d335db67ca391bed15eefba45bfba68d13f7a8ff789becfadbad154b91e5bbbbc643c5b97faef38a701c15fdf69ae82ce29cf3ea7b469ebb5a5497c692101adfc4a63f62f108ddfaf6feb5797265d693489dd077dcf97972b8d3631fff3a8c11e6c97cbcb95469b96e7d5a5fbfc01c16bcbb3effa3e5f4f7d18266bf1275fd8cd4ff7b0d6b09f106b8dfe8c15d6da6ef929b1d66ab6493ffc1ee1a77561adddf839b1d6e44f0c6b0d889f9916911c61adf54f8ab536f333066b8de6e70dacb59c9f32586b7bc6cf99a12d38b0d66a866cef79fcd625335a7260ad2d183f75e4c031239361736d44d00bf6817d95f0d381b1f533141a3dcee85cf342917b9bc6afa77e2e14dabe5910d137e130abc66ae167f55e7fac5b93ef872dd0845910d1bbdaefc58b3106a1775af35655d5515433047ef4fd8d3fd69f7775c510839687d6c39a21ede5d971bef4b31976f9e2a8a01b4ce3d96b88301af0e7bae67ddac76c48ff16818aab4cf7e04f476cb50dfb6d5bb25bc890e5817a56720abac1216b0b4ba195ffc49ff3c793111ffb81bf840c5a3c5083d129f95334341ac397076a329e7dbb7ee32874a3798e422b9f31d86a5b7904b4f2d4cf1bd86a3fd72fd92dbf4d92c156f3df5a33643d7aac1b172ecfbef5e7fdb664b72cd92d0fbdf8d4cf196c359682563e7746e6460c1d89320c078e87c3352f0dcde863dd8ebcf3eba7b4b0d53427fc9cd86ada0f3f336cb5989f226c35f87384ada6fda4d86a3ff0812004e3d9674c15e17bae99f7c256db23fc9c354178767eed2747793f5df3ba7511d3f8fd3728f48b678e826e70c875f7e3ad44d08b9d9725ab08b3e71ae31589a2571feb26e49df5e5395b121ffda3efb8a9ed6351db7c7ce5536258c6133322525cc46be25ebacc786415028826b5b31a94d3a01bfcf2edf00b5ca34d60dae4a2cf2ce3891818226c7cbb6be72f509765f6556568888a19a87cf9c2891e549cafa3d54eef3a7fbe1a931fef239dc1d08d8548406cebf8e892c3ac4a6a9273d0a5b691dec773a755756195521688509ba098e1dc153eecae18df09f85a536471da7f5b9d0d630a31fcc669a0dbae01e404ca39a6f2c0ccbd59f2a30dbb580f7e5b827dd71b36507ea7499b36757d4d6ae71c30a4b4be31cada8e97ee05633c6b3d3c6742f85f0e8741dbf94940fc5820fbae5d7210eb65caf74e673c99b64910630c2fb51da70aabb03c9f4fa334f8993fc1af183088f23254cef0f3614fab69f7e14dcf5a4dd726ee0d6250b1e2570c2a5ffc845faa7cc9f2ce60e3bb36413d13391e887e6b37bef829b1a761597e5ad8d36e6cf1f3c258ab81be627041450df4998f3e27f6b48b0ba19f18c61af4a7459f8bcd6c4515882665cfda8ab1051a1e3a9f14831ae402d1d06017e8a54bae00ecbc06ca0576699d3d39ae1b14c3bb9c0512df3905da04a5bb45e39def9499c1914307cd8e8c081e31427f427316c87ce7f687d39939ce7579c735c772e7b08bd3b9dc89dc4ae6908bd311552d4d7235ec22dfd3a5d570ad31c2f2cc2570b9a83e997e79569f603132fdf227985bbea7ebbab09c26a981eefb466b8cb8dc7223d3316fada53c17e8e59d4f4cb3f8c41a44a349ce316d4f908bd3815aa0162eef7c4f98961c2def7cc7f910ce739cff703eb51a7659c3ceb5c688ca2f3752b911e956f50c04babf3f2c8e73e7310378e74b78878477be69ef80bcf36dc7e72c8ef39de634d0f62da7d25c18d4f9feabcc3f728440997a1da3c65c1ee872f93972ce57ece430e8fab2e4206ea6fcba5b2eef868cb6fcce15128958bf75fbc0effe73af45d15f063321fcaeb745d16b7cbc060dc35c7823eb96fa1f5ff9467ab8f97898f3d0377fe81b8dcc929caf893ef44d8a3ca6d2385a492db3a600aca56d3fdef249e374480158d3ae3b51dd2ae7acc2ea6156c466460406e1e51756494db2bcf2c82eb5f66ac90f5897fc2072a3ca124ef02d7fb39cd9500ad36da18f1fba1109e846f36c25d2389d587dfc8804ed74a2b3a382f29b826e4bc613d1a66d99406481ac66d3257698f1b83a924285f862c6e6a5a916827558887d351f39403469b98c605f3331740d49f11c045bdef9ae8fa26cccc2b3f9780d88d7ee23a74dd0d98160587fe03f7f7589ab6c7079a0de2d91043b6034344ee34e63434363e3ae699cde68d207de5b0ec95548a1ecd036d35390d0054f294118151758b0af9918fa0dc305820886287b30e27f3a59774f99f2ae1851e16dceb48b8d2e396f3025007381b982febc51952e3987190fd711951115a703b3802e682be87681b9c05c6cb4ce55a55e25a03f8fca3b2be8cfb392c1294e27abb292ef9c680b92fe5efa3bc75a27f36da64b2da9f49e4259ca95db0c11f7af5ac99c354c3a9d0b8c04b35d605245e881155e689981174ae0c2024ce0032158d1c5161a58015393b190ce2febb6818855ffae823e8fbec95195264d99511b8daef04fe1b78b8a0e9efd655920fe5ce5b70bcc3bdfb0e71117ef7c9bcf6e6d10a317ac0f6e3a5fa32b4d721eb5119526017dbe8da88caa34c9398cafa0504a9ba46c4be094771863f1b029908368cfd51a5a1ce79716527e93531ab05cf807a73c3b674d05b57c3a74219e2536e1307f392f8153fe79d4ac649ed51195772e5fb669ba73ac4dd6e5ce9f170bc4dff9888ad39127e7a32b53d00d4ef91d599a4003213cd10518639c9cc32b4e27891632b84214c6d0410970704a0d218c135049c3942d70c1859373a885d3a10015a4f0032136ac8104344ecea76b0cc62a625646c4c56cb935abbcd898d224dfa00bdeb9d47649b1aa563287594c713a329370ca14aa179826b99642d9b70bcc28cbaf0e37ca30b1148182a1b01899a351e523bfaa11916315b5229f9ef59c8ec5c88c3b67f67623ec5d8de070aca230c7519dced4ca9f3672aa893cd350588c60a931e2f9c88dbccbaf6a84baa8a290b852e5d4d9b9ce8adaf1918f2a0a8b9191bb8a2ae24a958feaba6aade9aee6b852e5a8ccd795640c8d71991c19dfd30ddf1357bee3e8262b975ae5321a0a4b911b15c5a791538fd19e2ce1315bd051652157aa2a8fa142a3437f82c2f2803dc1579f40dfd3c642d89e322845a0448fc22738a47545711657aa5e456131f2a8b852e5af3a476131c2ee2a8a1d85c5084f71a5ca1d95af7c4a53e12c5fb1efc9553eb53ded4d557d78a65ec733300dfbb45c6a9bc8b7916f976f986f996fd0b7e9d1a7e889dedba4479f234a7da4f52f7dfca24b24f24bf4322c9bc134fe6b4e87f3ba3c5e759be49c7fc7b925a47f3e1d848dbd97f1bcbac177da16dfbdf7aa28b4c23673ce419f55c6036b86b0fb0744b54de217d7ba26863514aeb431be4ee7067d30cee0c07264a3186ca673b40eec697307d638c01c7a601ad64f2c1445a82bad776d1df806d376c09a871e48b4c40303408d0d8f1e015d9c00602d050ed65108c039e7a06fce238430fa807514ec1cccf90173d73f0780ed7bf507aca30c00eb27dc13007bee1e10401400db6cf747014a8e04a123399223b99273373ad4f5e1dcfa581feb637176abe6d200581041085106657f42341494fd0059911d5712ea28680a8025c0a4a383edfc308001302019cf0209625908ec740004901e5500d64f3494b700aca3e82782600c211c62779fbb7dd8e6e0bfe84eeb7fdb73e7f36970a13fcdfdc2fa9ad4ef78b0a705c19eb6c17f0fa7a1a0d2955a084624e319027b43a000b27ea29f8075eb87ce415765644e527ec874ce0d4dc663b41b4e4693423ac5f82482c56852684e313734297e8af14904b64e478a3cc5785f5fc5f84e0b002733c23e622a75a5574411458aec34a28528fb9b46643cdb6dda6a86707cf85b977d1a31ea0278d1ddddfc9efdb914dab4ee9c6be8a0c65d82e4e438f68e2f3a237eb8d2fa7c0ecefcf623e3e922d0209990390ac28bc3ce45a04489225d895dbad25699106d71d8b5c59196902098dbe9f7642684b4c564425ab4a5beca84503a324248f5cfafec01239e982bd47fb39e7db39e4fac310cc3305e297a99902aafe5eb12411712617dceffea06f4aea620c72bccc9d75017b298e59db317ca5dbe6c9b7e8036ecb5585b6276ecb8523b4b6dff09a539cd387be10348712fac1052724e330898f1f6a8c50249c0b7731956c70957fac286614d95b79430df6b1883f21894a934294a8f342e35e94a3596f3f0d4a9c6aa3516a0f11c6e0487f3a8282c96e370ab1aa1f11c9ea3a2444b4801963674504548e844e3a9d30ed7e1d42d1dda0e4bc70e5aade4c8212b6b8995879e40250d0e8db940f7c45cc8011868c00221a1138d2bb56fa4139626aebf7c07670d10f966f992cc6b8844a74eeb96fa587d7f3e9f188f4ecf685273d9d224de02e52b549ae0e20b5180c21b5610862c9cda198cd329e2044dc0a20a4bd00114359c523a0863042b6808021a5edc706ae7349cce86418a33c4d88119a850638c53ef347bd102e534a83316e873196334d6d226cb69e5214b632d60f06f3cb4a57e54198c21a7c35dbad44e99b57c53e78c87d6a5fc1c4474eb8dfc69917d885934fe18a73e9703749380862a7e00bf493803979f5818cab0a48dd1f00344f90cdfbe7117a971a5d544b73e3ed46aa2efd0d015cf63605e5519cf0db7fcf9bca1b1178dbfca789ee57d39e69b8cbf2edbe53295d3b85cc68bb8dc47c66f342073ab6e327ec93c191adfe9bfa159a171f6d23a34fe5c0b34c6a9eff37397d6e1d328e32e3ef28dc580d1680c4697baf21077a1427831f483b34037f6e2dbd98b368d2a7be12fda64552b34dece5ddabb6e97784b0caddc4593ba9db140b794cc1af0d887e8af46f621fa8c57da34f2fe4d7e8cfedab404fb915b3e471a5fb134a6c257a023df984a15dfe90de8b7496f8b6e39674122536952bbb604fb51e52b685091d6047f1a50a048e1271d2e45ce2987e3f0cd886462f876ab6efc9715a8ac56661cd3b8cba5711a52b20b9ad45a689ca7381d9aca83a140ade83ab45d026cefa3e7d0767fd8e247c7a1ed16203ad4aa2545afb4b9a4e84e389dd196a2778fd7f1d1aadca549ed52f889d3e802f482612f4d6aeef2f3dab90b7be1343ad61ff831d6255f3c503f128ec4e9cc54ac4bec3df3dcd1260a71df847ce8b3d29e476dc580e2837f1afca121297e363b2d2c4e7bf51e6a3b648436fe69d673c6c35d16a79dabd0e55bc7739ee3971b8d630d70fd09dda8ce367d5a1688e9ddcd470863c59a242d8bc7f29d662ad01b41480f2f17235f413758e5622e74a3ef86f8ca790a54cade60162a057ad5f7f37ea34b7e6051a0b0cad336d1770eabc02bb08b0502a955a5acfbfa6110623162554644aceccfa524c72c736fb6def22ec6f85a070a1618dd4ae651b322c54f99cf6dd366b3917eb79cccd731bab380d6a14242424f9cd6675a87877c7596b0823d5ea34b8edd553706bd2a66a34d963bbfead642efa0e864beb594773ea3fb1fdf16b66d82d8fbb5b04cc3de4381caab66321b79ea241a69393fb21c918f3cf3186f309ae45022a74d85bb8b982ceb92f32ec5f016aa69190de14aceb5547e02b5a26fabe5346377ecee6d12cc84602f17a7ab95cce18c1b1b6643aadf82bebdca8258df9e45165d926db2da252635f763d04a6b2a1ad4fa8a1328acd257e6c4a2c657d0adb388a48f0e9707589776fd81ffb4fd57975891e22751199ef396369dd1a6aed224e7ce994beb886a5fa94da549ee790bdd7a280b2a60b4a74e22dfe8c7ae56a8a74e238fd149390b843ffafbf15493aee47ca45157722e3283eec9a98f5ce49be42d4d721ebd7d6334def91469236da4eda95a11f94e9fd1a41eea92f31e1a6a92db9348cbbe6091821086304548e814a3a1b018716884018b30275175576a2a599c0e0f659c000b3680a20c3a60c2c9797be17452525800061a6b50a38a2a579c9c3715a733a970021bcc08c21a5ec23839ef2b4e47c6094868c20f8020a54b104e6ea60b149cf684a57d73ada934c97919746b2a194fe54da54d4da54d3543b8a672f8effb5d45a3e8f125f3d6a2753277de5964daeb123b7ca83d933597703abca5e8d6828911daf12e892e395fc22d69931bf9b643e45b4ce69bf53daaeb4a5f44755dc9957875b0ca535cc97977dd96684834814237c5e9f01757723e7d9374ca3bff3299326de72f6ed64dd2ae8f42c152b9147ec272d58de669689a4a53712557554bb382f98c9a5665e5359ae4220b9e47e89cf7509b6074a7842dade99f50c692f637faff84226c69bf2b8369d29726b9fd8dbf1091f9fed2a62a76d4f6e19736add126303fbea9381ddeb249da54def95a3142dec04693f6f75de6f7083af0c1f316a7b327593759d58dc6bad1fcc65b3e888fdfc589db7324daa42d592e0fab15297ec23c89d6c1dc69af4bddbdc5ea1a2a9c3f876ec9727996ef7ec8748210b4f8e5e2b8ccf639e276cb65b9b47b57ae38f7e07b0f4608218c95165ac418630cc24ca0dbf3e29d4ce39dd3c269d15a5a0b18307c85af643ccc041ac45a6ef760ac640b695f876dcce52d0f7dfa8ce58bc4e95815a84bf00ada194f7479c518d46541dcb73709c65fdf25d0cd1f022d8e163a83a44dcea123d126d99ed3a6e7d01d3a741af7a049d0a5c65e68fc4593a003d13a2ca54bd06d6c6e6e7cf8000288dffca1109b108fc4e9005595a13409fa1574e3a120d6f35093e04d93e014fa1cc9590c0a210f3d8dcd02d9875ef96b138f9819d025cbe5a557d52ae1c92675ac3222aa8c01a9afaadaecd67318f4396f915c1841df3057319f8901954dda9ee9c926f583f03dc89babbfbde713b5a48bd29530e82d25a5fbea06b186d023cd4357c5e89ee9b9d6b67ef6cdf97bcd3eb0633d9d86fdf6bee1db311efa6b13f47689396d003f9744396340ea5dddfa6b86d4cc34c95577bdab4bb08f3f1df7ba277a75d907f6f7d44a63ee0d8341b705638d6767df472d107e76a0050cd13a2e242404c5c9fa754a010e22fe56818c29089db6edf25be5c4c6af7312e8269f97b3fc665b977216797110eb62b8fd0109f3f9d356cbcf3469ebcbe4e2b4afc623093a7fc3beb11df7daad05b24c82275e6322b073ef39672435cf533fe3329867974f59f93a9d1b1ee3dba6918b7cdb94c371501daea3e6d0b64938ea8cb64d92a937b46d524ca5d1d69568dd78caa86e934435ab1bc5ea2667dd68aeba51ab6e2eeb4653d558617dd539ced1ef065d6a1d29242424b4e5d4fe74b61f6ecbafce103b3bab9393b33aeeabb36ecbd2ddf23bcd50987bb345a1774e1f6de7445da2498e8b4053344e874fce277cfe846efbe59d37599ddd2516c87be7f0ca0231c0bb65c33b7ee29df314ef7c42ec69ef3be3814b9ae41c117e58936892a3a1afba28b425cbb353eaae3489bbe02a4d621fa288d3a171257649290d8d3367013db23b76fefc55f67d1aa753c495d829531a9a7f7b7229a1130d33f310aec4b0ebcc566cb5609ce56d61eecdc643ae779bf0ed9bf5ebbc3a3c5b6a77d14fa6cc5ef0175cb9075cb807df4e01245cb870e14265e32a7c65e32ebe37d6e2db2bad0b2adfb1cab7b3161fd62bdf48b870e1c2053e05b870ecd765eecd06bb382e4d6a88468567c033be7dc70dd12e29dd7688ee10dd2167a1af614f3df33fa1bf3b06588213a8f0b30ebb5d36753a43b8523ba5a14eb3f96ff4db37d26f543ea47152ce07a525a8e42a95d4b1540d928e29433334a3092001031540303020180e87c3014dd6f41e14800e90ac4c583a1786834914c4300a32c6184380210000621001313a4e02ae6a5796a88645c8e1c1062421dd621917ad177ae3437826b7353e20ee4f17f6de84f349a3ab6e4317c767ec0833bc2c0e9db270bc8824b61a14de6240448cff32cbad1493adfa35c9a10d851c4b6c4bba45f6da3f13cc0fa64915e47e8ca2db4b025d9156ad67e768c8dc98860fb86618e6bca550f238726dbb1908572284af9a8785a8c96caf2a6e8312ef75f0896aa936972bc3d906a5e8ffbd4db06fc8162dfaaf4ea3b12a3d4f0af35f66261453b4b903c1cdcfe3b2a1f278cdaf412320ef3bfd58380ede8a089ef176bca149cef8a63af1c96c3be4ad64c084def62ac81f994a400227576467aaf1ef0be2ceae4086394c478c9642649a2352654484bdebfb47e71a5327232d8591b2693d91c28bb82fa8d713e9cbec699d70b11682212fad251dd8f514fe7c769a4b5ef8b9649c815c0b4089b0cbfb5f1140d1f64eaab603465bd12c3d76b0780cec349799a1cb3739fb1d61aacef293663bd12ed8e0d37d885bde9f398b9ab019e40a68f63e2a50448f88b6a2bb32edb391a4ad897ae3d18cfaee8128ba993137c765dabd32d6efcf1506b9a871b08a4b62dbad0759e17d3bbc84b8e48bd5f60e502cb723fa8c5864cd70074be5f4387b75bc817fedc574ebd1c6776c1641776bf616df5e9bef8eb5d103698be84bd290ba618c20a8bf0d936479695df76c5e469a59d92cffe8df8a0ec2df608a343903c41adf9baef775867d1decfc35efd181a7df38b4566cdeb62e6d2372078f55dd8610a438d3a82056ea25f8cb89b02a575889a017f9afca1cffd98a37ee042d8962c98de6dd49ae94430ff798bf83570e134d87a23c2a41f9282c4b440acf221cafaee8e7aa34d145311033ba4a906107c95ad35c80d69a147d5f6b0ac26fad096bed5a132458586be273beef18b363f13241722536c9da4d3e5859203939098e6644dd505f6bf55a5ac3e1dbf1bf32b43dfe09cc90133cf21151e8cc6f634186d45ae86ab7d612e8fa79440b3df4dfa4ad0cfa046bb437222b94f447d691abac8869d36cd763d4da17b3e22099a2710859c7f1b6a3bdee718dc718b888ae0726f17ba68eef5127ee50183879e211619021f96497f31e7d6d82207be69d7d11d64de148a72309612149c84b07e48fa5b80f1f187442c6cb36002adea56588a383938638ba598dd4fb47e26be0167eba085996a5ef2ded9e9a5bf78fb77d5a2cad4013d8b37fa575e55221df1f36fc9d14fe822939afed4ae50f1911c3ec7edacaa52a61cbfbdf3e51d5247e988305f03003cb8685af7d4db9f8fb74c453e51e93b155a9862227ec35865cfe8ed83595c40d4cac9cd4cd212f6082d738e74e6673c81ba4d2e7a6d2b85e3923e59d8381b208285a0e420448376c8e901a3c6d5c9905ea5fd4184acc24cba426f853d80196e819a5a843e04f5dae84facabee27c915566a522cb1cc33361351b560f0a7aa310d0ab553940eb2f72830e3d5de92af60010480e32b8d3b0c4ff1819fc12041fc8fad857aabf19add0a4323336b68b27c03e467b0a70ca8cc3b2ff350f138b731778bb31eb67a98fb81d8e74e90ce41c6b4085622fc086edd14e190a4d8356e8861def3699497471d8d721b58e89c8c45f319fbdbfe2a62fc622a02e7a8ce68818759ccc3038f9c4cf1c7a76f464e5e875853ace5aad2b3a03542d76dcb848cde2d294e449731b4d0b64157602f22238b64488e3c5168cc6f426231dc9e2d632bda66f66e6a797251c9d9d60f0ffea82d75db566654e1e169bdaa5998f0d0b888bbf088399d0917baeda588e106804a494fca30cefee788a9c9d042796f9ee4e066de42095fc94f49f62d32758112ffe5ce5d9a4abc167a96c130c09f9253474f7506a01c2eb480e934ae911191e40405a413af949b3b662ccb8b6f4e578e2c332103898826b44583f42d037e4503703e0035d968393bfea68ebe7a3dda7d9fa8ffaa1a9b39ae0852d93c13f58a9c75842716372c2aeb54522d7450a62502e6e7d7aa9f5b6f1dfeb9ecc55c38524653af24c1b8643bb9db272bd0f5905049973b052717cc3114968cdab99f1f682b5b07738f07749bcf9f76a65179a28216fe086e414818dd4db0c5a9c8da4de6aa42c06aede54a938bfb0a0217ec59276becc5d53d516c5c1c82607e67f1a3091b53e20eed7b7632d50abdf2a81d3cb931a0f0b9194f543921dd3f2142fca1cf9119cc45a661704654e9f25569b525f0f65a7467c3f35dae50c576839052d08c3313095340977a107f494c0345e9951c498e4adbbedcff51aeea947ae9698988b78f1ae4c1729144cb8c9d26c2b064fed359a9a0efb4ee2f42dcc430759fdd5769a0df79d167292ca1384bcfc005f563245da1ff289bdb98e8a8f63e314e0e885e6ab4afc0cc43fed0a4216c307eb5543c6d94703f4b14eab074e1a298443f31067d79bc0ea37fc47dc0f15267d13fea20554b4b02131ea5768248f4ffeaa63a6de8f9a6699320d6c69c35336abd94f88cf284321e3b3d55aeb8fa1fed7a36d4f71a6fd43c1347e7f62a18e131881e2d48c0f1a1aed124b34fcb424b05b3092459bc83981c9d991375f8592a63ac5a3bd9bc8abc36cbdfa38b320f8e1fc801e555241a680806d907bf7068e2a9e58054513ca0ea16b8440d1a12226934e3b5f7fd9895e83bd906dcf0839cbc5762a02b4b4a40b146e55790e5476d8620e7faeea25f52748271429e501bf97622d31711da66a768d6e0ae326430aed1a7bfe9db474c8502e74157e587cecd4adb5f2d84efcb15e970181db89e1745ecc44503dc1f4d8ce732b87a756f9d108b7f98cdb4504b6a6713ea5ca7bfe48fd963cfccaccf316f8f3ae846d4e2ebde3016cc10e8ac74568b36b9543705f8b12e1f05f998a8bb149b0df9f7998f8321abcd6b40926ce71ed64cd661fc721a508927b06af721d0bc1308c6a6dfba81bb49cb1dce532c69190a222695122f7ad66c049bba54c6f7ff62d5d01c26717a0586958f65b284ec88555fc0e2c9b42b47bc97a4c31592b387dc7ff90c515624324fed6a8c1abe9fc5a5a086a64771c25b258d0d042c1d2d303eb24d8fedc3e6674774ece3bd635f7cba9730a5644fbe9d83f3c2c61e9799d5c8f242965a0b204445af490254ccf560e078598bebb3f9a584303a2e24c2e291d079b1603613b550d7d67b23c460072a1a73637f82078325670bcd7fc1c3fd6183e58e3557427a45120ca9a6b603d811dcea4abfb99b4c3bfee66bcd799873b0408ae0435e83595077ee4de57b1c6cb8abb50081938c26e49a843d1808dc649a8f136477ab7d795ada3f1564048a634fa68ad7ad2a340802abd9e42d57246d75ba33e90ee5eaf65062f3dedac50311a0e62fdfd9816a7c27990cf96ad157dbbe310d390f2ab3ed15bb17ad4b2bdca96de1700298765ce776a6ed8e06bd48da2333176c45b97d694fa8ad866f8315c7d4a1238ca6338358c767f9b686e171b8ac38b1d9a8e1444edd1e9b75458f8d2f66e012eb09a3a8340da90124305d91c3a64a0c4de17e0e5c7bac317b1c8e1a6434821c3fb63191d3317ab7299761c750fce51448b47c9865441db5bd73d6f21adfb761c1fb9e12d62cd401b37d748258b3baeac3f8ea8f833d850e1a3956de33c617b7ab4abd6f41c863f8125597d57b38dda9e5260e6960979c1cdfdbce30db8b9b86573b79adfccbe23ed89482ba5595b3f784b490e65c6072f5d1da3e6e1f3f4b21624e45cfb3f42e69d9816e19c204cb9dde29e7de821b6cc71a53ad47b292953a941267aeb5b02b5b158920ee2c83028e87618c0306f29c534309da3e0b759cd6c289dc35b204c60b38730281d15f4ac25eb5f8ebe26db566f85815cb34d88d9af1b768235306de1ed690b91203930c59ba60517fd0fdd05bb70cf65fbbc1e55fce37fa17a03b8fc2e04f9c53e012dc96cd326a4df53558d4bcaa0b9a7b20283830552d397611c9c32e66726e70c44fc6a3817ffdd70a7404116ad6e3ebe54063332f1b328bfdf5ca262c9d5969aa3ef6ba746ca0636df0431fec28627539495ed0afb1c86ef62d50c4d6a6d84c9ff4438f61a048a617b4c8a78c61ce8d353d884d624a4084ad4c10e6dccf9ecf67fc61ccce4f9ae2a9f5225ea69d796abe5a3d4965368fa41a70b0f683c73f46df5c27e66003195e4f72d68001c56c2088b9b6886832dad8da180d97839dfc10dd3325374a131599d58e5f4837b25a37efba00053f3db4e5b1b3c6ab8f18bbc7244b50ab81ef2ee2ff6a2eb0571fe32ba7a8f0644683c68496f0dca944c420d6247729ce6876916930fd121a08a66868259674164cf4a3e9e853b1d7e545297f0247cfbfa1d5c7a30380453710852e33e5bc6898edc2342f2a0848cc37d84c045f60632380441fc07627dc9c240c7fc089a26f2c8373603414a3f3bdaca83b25378cd28addf62c0079182255188acfc33b51172e23f137837680174f88e5f81e3aa671181bcea6461dd6ec2535761f6d0b19585050621a95ebbac438c5098f3a8d8d6f8cf1cdad878e509d43bc6efda486fb295916317c4b72388cf1117dc1653c8d5cd649cb3d37e2f00c845e271ae79a50eda88d188ae1467d22fe7b2239b2f1efc9b8e00a4037f2106e4bbd6c7b9e7ee3ef9ae0835ac59b1e931ef2b0ba8e6c4777aed6711b4acc0cf33789c85eb9954df6e91d0c3868ff51635542e68c811b36adda365439508b39652756abd6b6e611842809ea547ff5e58974950a0619da562c9dab0021a50b33cab1ba3e1106dceaa3119e6b18914df9c6d4d27e31513398cca3933428867d276990c663fc7e66c19ec8ba7b707d6654eda07fc695703010081c9d8502539d24b9a3d5d2c9deaabcd7691635d560334a75223b9c13011d28cacda1f385c600f54075f41185464cdc528be4c0026d64ead6696ec4f10019a5acb10a5a909368057d8318eec6b04f8d8483b18e11a0eaae15993019ee77734712c30824cc53818a6b79c217793fe07fd81a499bbe961e7995c149d3739a11a423b4b3fd8bb612483a10890e7b2afcb9c97da6490ce32bd0c8229afa75b730d0af1b22e42f84166821f083d498d1c6abba98c8b7c5a8161b8ee1978680baeb03c92f136b9112d4b86d840c7986ca8888070a482e51d76b85711da0ceaa1bad9f3e710cb7e7a2ad3edf98856045d873982f78b239cb0ee3b8f585e8fe14cb06abdc19ee7d7bfb3d7f18db3a5d2b291dcc9985dee7f098b14d581ecc76df11edbe4828ba8c416223efeb29a5529c4fbb0ec391ccb55b4c7e03851292c10e07a206e1b9209e04287f13a9dfd27f85094cc0e7a4a94f7b46fb67563653a0e0d441f89c720cf364a5df6047dc10344dfea2d564a0b1fe9087051ce7fc0e99029b68c8a6abcfb083f38194e69c64e1e93add4971589df57667f00bffc325758acd6b46b148de89c50ae49b1d4567d6895695f18683969f45a93b4fdb50d32946f1f3c84b0ce9935b3ce747ce17b8910c3b17aab2ce4a95f6f4ad512ca8d8fefd83cd7e0a307653848198011e344055f20769afcadd0ede830939b6cfc03f4c44ebffc41d2b77875d110b849bb6b571d8180f284e0c3e010361dab9e6e73e9ac87c8cd60a53a4f96523c77bb85b91f8ac6f4a467cb8cd4acff7409e6151a11222d80732aac26f696c06ff02c6f96f3f76d6fc2f534ece471d0be4aa8ff44a2b8943feb26c847446ef24a494dcff1842e3cf22fbdcb4ab5c14493e99ae1085309f153ffbee96e958d55f0cf43061a30883098c32b8f8460224c7154400f47ef358a6efa82eeebb0e75c7c614031d60c30b00065af4bac70d67b4277082794e64400850823edb11b86d55e58a4ec17d8c427dac46b9aac1bba6c9fa0ef3ebef6498f5ed9787a6fc92c565e32ee0e909ded8de5042e3aad9cf5a136cf92dc22f96fd228002bb7c441250942a443247e9a908ef983b349ec8a7173034a0b928f31b99fa35387a9da799943cabbd70b116089157ed567bb32b0a47bf1ee7768d518c3c543eb83b7c58b04cd41a07293208f5789a808d6e97dcddc215c9d4bbc67fcb6c1ea6c5ef39a4b557ba17bbc7d1dc810500866a1a8ec7b0e5702122fff1edf54eedd2a8475ebef58c06225150d17c1035eeb933879c275a558a9239e5a12d36a1be504dfa90a69ce7297370584da0461ecfb423b9f8b8afca349743940cbe4ade77763d60dc16ea780bb1e2c9ebc037d4e0ad960186815616a299396fcda662f131a7f6b0d52ed58f9e2161a453e77dbc5685e3ef4ba663bc2c7fd7140f5f0abcefa83729e2db5ac43f18148d543c8ae41927dbdf6b19b5c0ec94793914f9d83e84c0a2df47f42c2e974a8b097da8cfe211e4cd4d103c7bc698641636f55d5989b812e80f2766452552fb3d40649a8e26f1ed5d674df78ac9f8bc17f47062eb2fbc9de199e1c8a5b45b1e88d4599e006f1b4a2b6b60e84ad711cc50da3b51ade1778eb89a1c0aaf845df354394716122cd6c43ab19920b2daea4973bbae93d3054faf77c4a7515e2dca3e6141c3b686c5a12cddad160cacf6029259b7a81c8a5703829ceb0d81579f7556d54bbb8bb834466dc345db045a80db010b9b6b5e0a35bdb790dc81b68c8535c19a1bf090275276ea5e6402c69c2067726f435403204885a1a6672d4ffb2c8e2deffa68f12c23d7606cb69a7a022dcbd1b7fb23fe2fdb899c5b7d919efd69f25c7d1c947266bb25caca6e85e8a275ad4d2e014f9a5e11aca3768c83d7ce7fac6bd76b913ef065574000aa8c90b94d3b1960a4966cf4909718610833f3d0460216bf2395b7b5bcbc2b5be8bbb0de60076ea601426f403eaa02eef3f2f636b60499e17afbd0c53ee5ae2d4ee770707f898b041a0d6a0acba5265b7d46713a4d27cfb2e031bfc326cbe71bedeac65ed333c6e1efe626df78fe277ebd0b1f8d8d444ed3432849cb2babf5fc5d5c6c7fa0b89b4252a9bceca06ae168880904525c7f77955d6cbc1c99355545dca5f9003d4c1b0e1b4acf80d5cc27da53cd003dc2677fd15fc252d09a57f14674d1da74e253a92e97254617c8b7a8f2a9902d9c4ae47427c5d2e7f5016601e6d6bf2e15fed54993a60343c98e1557571c83f86d0067916b517b463e380b49ee2e7a09dad39f10a0bcfb7511ffa37f5474c701dfbc7f1fdef9e1ff76bd4680b3fcad5b77adaa6c4ad510a0976a6a7acc1bdb256e4087d0ed836be9f1af8ef4a3980cddceb9ec25c36480aacc4fda6992fd9d7d8af22dc931d32d6b324e2d30b90c53026d21d97d692ef91fcad644527ec21b91f7e2c0c1b1f29c52aa23393ab3eec0974a9f9514d9ce12a47a5ab4b9db0d15cbd10d4e1e9816d4c7369904b6a82697e41d9d48858bd8fd169e129b396f1bb083308347a691fe631354525639d3ad64a2286d6cdd4d40f27265071ebf878df0652f4893a54d6e2b4ccdd88d1f738bd4302453cd51929210d567547e04fbac9ac02da83dacda97895e3ceb57089a4a66136010d9bc8435ef829c5a9760cd540f3dafc3e103faf16c5c8fef58fc65a8ce2001757c05c6d98477b48f73e905c1c84034d3c588d334870ed217db951f186d3736c8da81f0e0a8e0e334736ab918445a1e8688c377c9b46b6d931c7ee166a23291d72a19aa5a227006645d76e8542e9a474d6572623c235f5541aecae896868738c201dfa883ba6fb94b97895b2df097e66bebbbab050a8d509963158abc17c25296e4bc7932a28c890e40365a8f84bc4c93a263b20fe0cd04608aeec49354ed6601c3348aecca052bc323d825522ce124037fc32fa402a11d80dcfc931711d96997b4ce9e6b220732163fcfb6f6ca57cf67350b06e70a8026d6142d6110b9a5006b10861216f4b15e2caede167540309ae8eb5e68fc3d2dac718f694fd299c294462beda21f83042774f7ad55fcf4ff26098682ecb51f950bd15d16bd90ff1f9db214a36c7ccb2b1c7c57bf3fe7f6d52fe509764b7eb7c770bf9e46f5bcd179da693bd0b84484d5df34a85321b467f22f32cd0f4ff4c9d28c4d300bdb18e17878125f2a1d9963a58aab9169744a1123b14b633a57f4dcd083fa92f87ec47c1556821b23db6da2878dcdef9d6abf9346825014182c98fbf957ae787727f15e34a42d59f7cdf40b31cc135f3155aab0dd435205e11e2e4314afb67ee873ad0da82e604b88908c6f570d1de018bc6e0ae639a08361d351408c6e001379f649aeb212595872784176c53ba49de501c0859e82fa1c585434c3e18e065488a72591ad07d16d801a7454583dafbaf30534cd9eec56da85b168507c44e45a68f576982cad823eb4bd01d7121bd1b2e937d2eb9ab33726d2908a5eaf8c950dbc990345e6a7dd2ed9e9dea6528f9d9e9322db9297c7e4becb989771a138742c476e58f992bac8a041e2cb0861b742341b4e446fb81863738c08ab8fe8bbe86b4df4934f075bec4b9bf115219887ce2b917c49eb3b7a2c2bfa654d22252e0a771945ccc3fa6943dd2f29c16b845b3f91aaa54148f4faf169745e8fdab530221dfa5bb07eb564e614b5308c610a8141a77e4a0b8d9aec6ef9e9c4a7901d13793114a7ce175f46e570759474edcb5421c17870008db2f2cd36d7b80d5a145cd122c0b11413540e7fdb565aea8ca1df6fcc05abd34429a5da4b8e05e805aee67d82185f5f7a6f319d9b06faf005fe237ad50549ff964ff0e12f56433bcc7ee50d01c0923a56aa2fbc7fbc3debbcdae4d141bd26fb195556e610d9a84178cd731b76ac409590ab9567ef846a409cc29964225a08a7129618ff5f0c883e006e844a26b3e507da61ff14c4eebd89e444d9ab902761c23756c3f0642e15083be6880fab75c5e6434e84b8aa0b0388eb9fcd6931818b9a1bb59e3c4d065a838ec452e04db193ca8b91b2200e62680cc9111b61b9a0bab71b6e8b4c246cf24635fa6f4b07055b2472715db1617d5b9edb30c7c88337faab8f285aed1945bab7c4141c866a5dc19af4988211977e473271abb76c8cfdf5548580ed0d8cc89add8fd60f7b82ff152f76b021247cf3ed2cd8ac222f1ace8b6d80257adb76bfee3d8ec5eef29e09330dc1e0c70ad773fe3ce4a30fa5ca4c0577e00a7a0518c2110d623f132125e331bc009319b3fcf5554c84844b85a783ec4c188983dbd07bd5b1e947d0c04fccf3e7f715897b97b2aedc04830a1c139209f2b440ffed98fee8cfe2f82d76a03a4ff2f4c35714d9d56ed0d2d38d34f04647470f53bebcbaa2a2a4c869ccd6fad3e01692beb3c8d8456192f6fdc73898aa162917d6b3d291ebec5b31663235249b10d4af5bd983ca9132475e1f1408bff35e6e5437cd970508a46409a64785ad638d0ef0162c563e8663451669323e58c47b0a9931e8029c1a7bb93de5d0071964cadcd923939094348c10f771a86bc576102a4807b7f76ec8f807bac7678ce186dea8091164725821a461a53e7da551f085e4c549b20df06033ab54ecd1dc1661be3c892412bbf51f27a850238892c149ab3f5adfa073e5b4deae522359a805e39370aa8de44495b58272ebd4cc206fc633f27d683043ae1d541c0250a6c7b9a589a4ec30e5c02c06070dc480014c94b40b443d7f5301fb09c05cb83f7142a014430ae7115a1a82eb6f0ba389a58aedde92309ab91ed629f1bc25e47a96a709130a766729a7faa49c31a3a7329429b6121c199498ca3211aecd55954a5c4ce5af27a624dbabf4b227be6cb60260b0c926ea9bd0a0243c230994054ede927ee562525870536fe1671598af0f0eae924b795a3dfaeef2805dc92d38e16d74e17475038d7a123411263b0928fd3dae6b6120226e1392036d8eb5f849f8de017a60ff72cd75b4d792536b921d1d8afe7e0e2e9c5e7af84b7d19dbfbe3dbdbeee1bc6e4b1faa54d35810eea3366515aeafacce3f4f1e48034c74804389c38fd3f442f727e03fb18142e5176b6f6270502752d229584e5d20083ce854508d62b99f1f0aba3d684b7135031ec1c9084b1bfb2f910f9210eaf3ef6d26bd608c705846002ff65fc3ece5262d3d6242950b12b0dc73804b08c2ca67e03b485a99ad325d11c39f5c915de2aa2c209bfbfd59518d329b1ed645452c9412a770551de1aaedadee99b8375d695eaca34e1c33180cd1305bc73feb81bf089236e61c55250951a821653efcec6e37b2f13e2b53a4277d3b13f116c76cd52227a08ce4006541d432b4f9ca0715d9581f50f243288a415add50cb2c59198deb0d9b8e83e178dff50d1e0e79a2236ab8286cd08cd47838e7179db0f582040a861ba89239b47c820d45399a4ea12827eddc61b42f5bb34ced97708f5c5a3d7cfaf683eeb37d9775758133eb045edc6ee849114b5353e93f8b21ebfeaa4a8f35f8da25b266a086c41ef8c2faf923f8b71886ad5ef56234c3bb2fe20ed170b707ab9e042e7a310d43222531182ea865c76b2e1fc3545675012d1011a187971802851ab4f630f48825532733ae19ad9282b4f57db7b6b3c2cba9b416bd990643ced4b4c72c16a7379955df715566dd60f79cd22fb4d377d3711a82dbf9f9a835644fe07e074a9101463389e48ac40c970bf3ce83e6e5c61bb78b118cfe26bd471c50e7cad8ecb262780a048a656edbbd0d81640ec572ff1aefd645ba8a808d332ac646fe527a9f9e71e7a6f1c49a2d3d301ddab452b5bb206c9b091cf5675f9b4f570c725448caccbdec84d8463b0b643d6122971a3d2e3e9bd04659466a32038f48a8e0a4fb06b629410910713061c30a127ef7dc82b7f7fee2eb56ea3d245fe9cb606141798e4621550ea47ea781b5a1017c786b1fcc69b0b6351f710e6ff06e9676aa6f852a90f22d962736167b202b00e89a436719c3a9ca58d534cd5293a15f005fabaa4d2192d0c4698a9aaba69a7b7d6256d90d772c2eaeb406506907ead2c3fcb43486e2d1776003da455f5a5e1f7acd310ce4fb7491d4e88676bf3db83737c818bd34f811eefff168fb717a14f5ccfc9a48c3eecfa4ae115fae19a7a371b6c05e2a47794e2fbbb5e6920d40653f7839fb25e0089a9935a2d6f63a8a9ec57a967ab6a95304d9db2b40a317e9fe368c20d5326c3b2c5bce789876dea874182c676bee7b9452c547592bbb7debfe09836b66a88155970367c5f65b0e2449e211c233d5a1886b899b48f38ca4e7519238ac7f9a89adc7420263291ea069d7e054722a002eb937a63fd0d2cbfea7160dbf0cd0c052c2a363e1da2f612ef7fb5a6406fd9c03d43d72b437ba754588262fa77b2f8b7efebafe79e2093776cf6af6044a20518844d3cc27a79358488369e22f60ed04c7eef7d4390d57e4faee8f926d2da3c90ce8c4f43ce8ed85eaee72d21ac4d206d5ff05b0358f4e511291e8ed3b01a95475c84a2096a6e0c7b90a747e0525e220c20fc337d696c1a9c20864ba364cb811938a71862e2eee3536e43830ddb30f3d7411a459ffa9a599f61a3112f1d023fd0a9310f1dd060fa98143d31c326ed27c1631b4affb37f9c26313ed02e3133246fcc0ebf4004b237b592b22a9aa193567dca9818fb75dc8e665faa1e8fb07718c741317f0d264425bf97e3e4f7ecfff0820f19807a6a266c720515a87c88da56dfdfdc112818fa795113dd9f2da5c655db93caed1a2897a8e1daae84ffe242800c2f20779915f978d75e2590f95d229d56855349fb93cecc2937e77f86c615615fa61b32b659a686b806b9251339ab712c3c2f0e4bfcc075b0eb64635634da2e8a9c7ae5cf2d465c9fdd29ce0d1c2ff01483c3fb2a0f70c943f7ad1c2c05ddf0e5ad786660c57d393dfd81592bc79f18367d7f1dc60a2079fae5493d98241d7963d460b93f93693d1929a105f046087b565dc500fe4311173f35f01c1eb64f3218c05a31abd7f0e737b97e4ec35bfe3cbeb5ba29ca10011a8fc0fa466bed9d9cbc30e93e71a52e6cd177743b7b07b13790b0735866f11a1e256a47db9cc5a84e0d7e62148622a0734fb8846a0f18b5988b5283ee13f42a5731f9ce03f559d9b24f35bd1ea851e6fd3f48238fc3cfbd9505601f3d9e53b540aabb65cdf0e4ba6d844280f670258c16f213092be7e447d96c592226f4f800c4b85bbef01fd0a90fd44aea8d3cf67895c4659234110e1f4cf832ebad1616c5f9a3d3ee6ddafaf70870498fb4eb539aa2fc523cc6390b1ff73af37e6b42344c5121450d7d1ccd390333f40bdd92be2dab3abc148fcdefd7f87d16b4f0081b1e4fe29e494faa70af7c51a663aedb27a3aa6fa86fb5cfc95e6f19fba4421c86fba2a25441a9e257a1ae6ff3a4794d4d342a57d0cf1f7ba8d3468d4c121371e017d53dc65e5350ad2e808a0e853bb9f0146fb2928ec25d109dd831ffdf2fc19fd382c1fb49c6258055918f504c62c86ca87d3041239136332dc5fb0aabf796f829ce8e51d4a615c134a0b8b0b6fc4990b4ffd29f6946260a901e220433c6825ad6daffb816f58acf22c60565f66147fe98819383692e7ec4ccc7790820a27ad0d0790a0c0932f287d1a83451f9dd010cc9eebfe303a764b1d6344c932db967c47acbf2d7766d0bff0e9d092d5041b31d3a7cfaa00c369e2bed7ea2162992614c792decd0026cef72adc2cb8ca9406429854ad920b7e2520356a28d12616d5ae33d9c38aa4c452194b36d3ff3e3f1bf42a9d9763aa88f02026f4a4ff57f5be4183cf6b10c81aee8ad5fa12df2263ea86d218d1ccf7008a399260c094e3e698ef7ea8777242a01b942d6c8601834c287f40e90ea552cfbac350b2d5ba0dd22467ecc4e722a2e7bcc6b666ed46224b9f861749b2e7b51416629b67eb3b54ba8f3411ef08b7c9ad8c9180dad11c5e5ab9bb2cbb1a8610986171dd7d6410d3f87a1f4c4057d6c6fb7d47bf06f63eceee0b729315235dfec8fb5e70fb6f9994cdeaa4ca8d5231c8369a232ae2aec25bbc32108bc84b3d3fde1df1cd8d264c59e0ded24dbfb31c5355ef950184739869fad205fc82336d91994230c5e800121785089299088a47b0867fc236d0219395839bf5281f023c2681258a9e581cf04bbd9e63415627ba13621f88ffe8bbeb5bcfda3ea75b79887ad0b4014fb788e2bba0e8a3c3ebfd4129c3988afb19d5403600e7e39b4d52f0638a9dcc49b583413a9491f6c583bf5d2b983d3f574f8b8323be6ba38806dd3d29e27f1f0a10380fbd06744b41618d5062a71f3c78c3706d838a2e0f7a27c4d84af2c144476f69f12e2e86bdb5cb1af7648884330b64b5f87ae4515ccf87dcf6ccde2815c5a3edd9ad73e06345d42c5c0b46a638761657ab8665f51c3f1750afccc33772c3a4fb6cebb9102b39f491df15deba7a1be91e744bfd7164acbf1f641fd7bd3cda27897bb41a83efa2b9ae501f60b5edf90d29852fdb61abccbfde82e294e047c765063cc51caee1a56d9a284ae100376c92f347f744dc92d079de01d29ff4e039882aa3a790bdf35b8c2eea4b48243ad58b93e8d0ffd47d078bc889047274a8d05182901160573a7ebb825d6dcf91d21b52f0798658ac8240111cef75868102394fd662c5475be7e15510f556c47c71ca3bedb531494351ce0d83f92f5260855dc892a766180805a38c0d5bb12a0e7ead6b5aa5d921652d7673f6c67bd1f9d975cca97407bc978d4baca50a952fd7c20d0c3384148c4222da578a23c6c7c61fbaee3fc193f0d4b071b636558aec419bd72d7598b20abffdb61981e4216f0e72ddbf52cb0ee6a56aeb3db92582b225156770f51ce59dba34c8a39534e0151a6fcc4721a416d24829a99e5fd37c0c598cf7a78a29d920a7cd8306b5ae331fe2818be446e3d7a51e871d1f2a56256ce39ab2357bcb27de70aa6fb391560999318b95641ee95ab7d3759e619147094894b14756d37c84fb9e300bec4c601444901a5cbbb5fc3c214efad7eca0df993fe862d64689ac249eb445ca21b3f9b1432d3eadd52411da0650e2cb508103c115cda884f6ce29c95eda1b0187a328c3254d7d0391aeb1610c2f51fa6dc12e70daefe3052f4cfa7f55318897632de1895ee03d83f59eab10cef6bfd338e17fff070470438409e4c021cb22b9946e49143eb259fd19578862f75195eea33b89267f42567a608ca9a891d7da520c89cc685c90e777b2cabdcb6cbba2be33187ce4b3eb32b7b065fe232bdc467b872cfe04b2eb3977c6657e2191ea5eb1d8e5f0d25be1775b8a7a052c0c79b72e0185ec6fc3f6a10e6914a1b6e0de2ad1b266ce4f6cd6cda3645b6f33d21786733434ddeb90ec654229346c5858f0fc928a2f8738370fa995570bb85885f7d92676284336702e1e63e4241454a2f4681b4087d9211a32e3cb6b08a8154793c623b96ff2c8072188087151f58958ccc319a0cd92fe969bde63d6bffb26c956d911db8e60ab5179850cec60cd9ba644172dfe51ae924d3078f0a149fe94569d874a161dbc69ebcaaf02b1b85c8a4cec59192e01392d29db6aab2c951d314d0e9a53856e49357842e216ff00b786025cad953be24d456a35658f24cff3b046651bfb595ed0eda6b8f630ef20b68abcb1e54a55f63ee65751b16234ef031d059e67d06e8e4c875db8bb942840a3c7704ba2523c136ac4ce0c3090f796f872c65bb0d1d2cf9fe73ef6a1a0a40db742b5c8b3b8771c0465125086b43b06aefa158a0f846348803716064ff24047666a831cc2981058cd08f548392d382fc74e619a2a645b348080345a2e1e0b0a8bcac405c55a7e313faa9bc26dd5f279d577569ea4bfe71678b144bc5dc7bcb70487aa33e5d3c0b3abcd994d2db5506427e0b5258003fa761957787d1fc4b75a5c1512eb6cce436aa0b1d975f31393834aa82620f335663bb89b5c0a3ac234809ed49fc93d05143d5ce463ee1a6b554642c20088dd101f6f9779f805516bdc02f4f4183b05f1525c039ec47ab11704123e95e7440da037f20e5d079e34c910934ce08d50c6d75af66c25972804b95e4badc21a52ea6b1cf8950d0272134cd791887b2f35ce995881e650e76500a76196fb5b11fca2d805cf758a8250f6f6a6cea7c17dc1f325c9bfecd55ed41dd5326d40aba3977c005ac43c9a9220e10cfe210cfca5b67c8f87d2d03d7ad23a11531f9ea410d6294a84a077613f5be5704662af7edd293564d1b084de8438c607709a0d24f4d6c91890d5880c3a559aa032d752c06330d88a9809a97146483c101e54ac7f706bc1e382db1da813f0f9c428efaa294f72cfb90f5ec8466c160e11f38e38387f8a6b6901d039069882cd3a0ad88bd9ed5ece1f407871b9a3e54dd5adb7d0912a9fc47f86664850eb4af1381f5951a387b52f5fc1e686fa896402a5eada48c9aa11c48db663574626402c43416128da5532c90ac501ce0e365c51d78631328894252993dfe5218abd4280146e80f7a9865322dd92bcd6e3cdc19ac7766233cc7c7fd518eb91b5a531240f0c2a796415c9cc0ed288ada4a3ee8f537f744c1b9dabdc1aa751296fad304fd750bc4f4a03a53797226e8654e6ed28b05f9062137b1cc817a5613901f1dd70e5ae9b9665990623d6c47afe0565a1ebb80e214140c832c2e89eda9658a2e2783ef4f06020b7c742d21a45fd2d39726ffca8d4fc5b1621264a1b7f18cf6908e22ee79bd878b965e0647599548e6fe64b94e298e7f9f24c8144941dd42070ab1f5f92cc4cb9090824adf868fd549759e1fff516b1e17baf683b82be583f831e2b5370dba24b757992e36f3dd64452f6cd5f8f7adf1b17246a6a9d24c7e8790509e1f0509d939606c3e4f7c82fe4cb3d0fc1174f93a38b8edf28e3561708598bde8b502995a37aa7cdc6348992fa1a06a18cef8b94895b1ac2583de216c699ac581338d612bd0ccd9777120e554e411ded7ac70ee90f46bace0ebe8655285d1cd89c60a146321eb26015ce9a9484d96474d8ff6264f68d48f8dde22c1871d37bb7f2230747e06bdae0440cd5089ee2ee8f66e921a541f1bd2f91d2a463bda794362767945aa3b01b5c38d1ee256de90c9f4d47c78ecb5f093eea7653ac52e92a7a49488996c247bb4414ce4f374c2492770cd50143058a1a8899382e32b26d17c4ba8b241168973df5985ccfb531dda9fc215499da9b3219a08359fe4258130016530c807e0dde51046c42bacad837ef8ba0f2814a2b36f8860bb8110cddc53441b7c900d080d9f23ee46d028079001a70b75871b5f53a8d9a297b5aaabadf47d99d6e95f0d5e2a9720fc507ed72bfd55b564cd5d33b05834717220790e6649407a98822f486d4686f4b4f4608af05fc8de0ff99c89216aaf031841cf0cfb00cf247eec27ea51c4318eb96630df1fc1e6680e9c4c772a6fa2285986f323a5952e1fb52b171912e596b29ad110da7a2d02c65225395054c0337ccd84cf609936b8b4ceb0477599093152ab116877386d30036879f5df306d64f8dfdd5ed49a68a2517eedf8ec36318566343fa3dcb99fd840fd668317c3113fb228eebb7e073329dcee2e16a03b1451b2d172e3aa15169f53068bf49be1976ea2daa25306b640f8dc43e282f40f0e156f9aea2f3b0eeaae3cd85fdb86a706269b874404ebbb35ba80b43f50251768094452a5c47aa732387a02f9b3b890e79057a8451eba3b1c2f560fe1ae06ad13e3afd4b086fa50bc0620fd8c4d84fc8d05fe944004f53a110931c4853ccc8f36b447b987cbc67d4cab5d8d83406c3dc9b66383f235fffbf8ae3b5e03499818c66410f17ed1d758d4a6989c215e8458072385516d0493fae8c37850429929c8ae1276e1be42c6e9b5b73c4575e311f4709461b1ab29d5a4ae024c125c1ecc6e16f06aab09a11075dfe5eb8eb797419104dde88a3c92f7e906ae267785b8950d94c382fda3313088901b75f52c7e161e0baefe5204e53334a6272aa04713ed9d04575a2b2d6588afacf6c3193accb9aa59bcd1d08c6f9b340854377ecd4dbd97fd106b7d66cc19f8720dc25da2828f440dba9bbb359f95bfb5b6a8474bc0f2ea43570ced0afecd2ff38c0022e139fb8e0f1e3a1ef60eeb995c79f960aadb7045efec09c45b31ff359ae3f9391708c7fe3dff86682afab0b2cfa2609fe0ecc4533e039d99cfe7c101d7060eed377aa0fe5835f45a50eba531a5dca4950662135a955240bc9cfe2a0b0a06477c4ae7312fc3e5a2aa72dcbfb11283c172289f106601e0fc48475789dbb0228275fb85d281113eeb3d9e1f70c1f8f0f581b31210c8f05d8792552a9267a1306579f8c9c2232c57e1d754d5aaffb9d1553f0fd0f64476f3eab53ca6efc0374f670a119f21029159dc2546f46298a88881b99cfa4084b774517770d8faa38b9f22162247e183d631df08dd2ddc5f6732af7fc884fa1d3f6921211d31bbc59bd95dc3d6721497adbfd0c578a3242e1a7a111283828cf5c050d7d82ff0bdca0477cb03200220f6bf0642db16913b469822943c74c3d439b849ceb143e00a2a58142fca2b0e8837e87c79005c7557a6943b8f170d3d0a1157679c256f6aa046ad1647cde93b4ed3fd40466d093f49280f0b71255c80546871b679487ff966b67cd30fc26645d92985095d403b91731f071b4c20ab82d93ac8371a20ced9f0756de160100940546a1272642eb19502e17b4a516cb97094a1d0a8b3c9c8221ca080aff22a10b72d2d9fccfa37f3fec030a7d3b533c14d7c43f4079c4de2a221fe844340b6bd715279eee5b1391351d66ed7f6101ebd8095bc5027b8e5ff86ac7b4f1e294fc83eaaf8f525e9ecf2ac2a3bcb72417c59fab89c364b3235ff02d797575aaca9b482649875ffa0b7fdf9ac6a35760dfe9f2c82fa1da19ca807d90d8d8a3db399608d68d67a9b06715bb72877ce6a4484c424d766f449463fb99f119870940a28d2231b28cabfc09f2ccbf2ffd6658464b2dc151ff5b7aa86a8b53499b5d0406d7842402602fd2ca2ce4864ebc03e9f9d1389c06ed7814ecff58c27514c62920275de88ae6e1cbc0df31e272f44de597dcaed77b0d947018ddb0b163823cf60c8c1a1a7b45d0e816aef7b0856e78955c0183e82bff7e614d9a6813f1ccd9fab23b9ba29780243f3e24262d43e09f4085ca5f324d0c42f7ea51c742dd2d2914d111a019f1c41d4a445c66e768586e7ba1a652fea0598714d0dfc167db95c314a76c43a1bcbb3278c9557c25170d05f67f0cd91c13acd34566aac3282ece0a75c81d172def5b865ae94f3f1a436ecd4107a49017219a792c8b080293b68964b4f1c1a3f06a43fcd3eca5d26f91c813df0b23ccea8309bef98f12f1bd10f071ef155706e3a4184fcff6d64446a3ebfe28ae76002edfac45c63ba7978112e4df86759886680a0ec33002bbf643ea3fa229cf6102a08fe7b55168e1aea534aab1169a070d20aad6898f604c22f394a7a969453eead72377534f04b788032d6d63373f9c95ccad56c7b85b4a81b707ac5275435df80eeb857a440187ef34b37cc4343aab1560345bfaf63c480fea486d4bec97f5da6c65b2496fe09b36690c9ec64f94c8a4c41fbb7d546ec29f5772430e00bcb7a5bb5070b6ce13af5cc8348ffac808edb418daf3ef4fb7430d00043c9bd9552413066043455f163374ea4cb2377440afe36b75a4e21535f6c2d2b03391c94e5a35fe0cb8f7a10864b7a8e015f448176c61de487fda78033e360c6f95d18bbef8f5eb6c84461d9fa2f52b8af9e65c4cff16d4ba60907b35e0e06cc1c5aed38818414a5d276a5043096cfc35fde3312a991b152574904148d67939bd9e00d96a7adbe361978c5f4808de1d9c579f4aaef37e5cff8bf426c52e20d675afb8271fd8c290e21aa9a37ba7f4275fb5b77e705e5a5b93357bc4a9c2fb6642e4f3ce2025c71a2bbbe332321c3a43feace5e11b620d605d0c4c0400ca9cfc05b61b8ff26280417dedfc5277b91f157954d79f32fe50bf2b976b424c523dc165a64239e854aecf54f73c37f58c8039f2e3e960ce0df77c19633a7c01c9815979f8e1ae43d562224c7bb88160dbc0c2cf30a8c0656e4bb0bed1d993005a239d5e135e43d8700de8aae866673cb7a47b57206306c77d391763f393f2d7fc4b4aefa038b136d48ad7885ec7c903a64ac07a6e251cf90e2b4f9c40c859c5084e958b4a9ba6d794d501db89c39e265b3795a8449724c57e7531f6adbfc6d38c9cdb8f7412237edf036975e834aa3e5490bd81437d9c38b38be47dad0cfba08a607cf9fee0aeac6db50bc5eb0c701195f71a846eec2a4aa94239805d85a75fb6520537cb5d5daa4a1e9769656721e35255869bbb1faad3e8bb545c4319b640107e0e2887a8dad0706a80ddbff0a14240666726558a7d8b2147a59ad17b33eb1993560fc86591920aedaf577588eb919ed47ea98f1e8fe629047acfbea4970a0a8ff38a79a9493c5783fbd393b7f021e380b03a840a8996f408fa38a11b7ece3f426a21a0ae74213bd07c308b85398f249e5dec0b63ddbacf66ed4c3a015126e31520213267da41d12fd6a20b93f482089cb72d9a3333e1998a4771c4a9a113b82a3556339fbff6abb58bbd9d06844ac8c09ebfa5b27b3fc3f1560971a6928e871e1b4cfb6c647e4047161cb4ff4ca452f5e47d59cdaa52d3b048cc95f623c9a8d1556d2e5ea05c4561a247f7b453caba3cd70798b51adb9402a1343ff3933d002e660a32bafd210906a24e77c082e3d67b6f6302159a829e0a3c51f5d1b43a5e1a0935f0ff36c85db4d29eb18543b6bac6684d5d7428f511e3d3d1ce7fe085ecb5f30413e733447116ef1049c1deebb657d8f39d6a9119ca5ad9277571dd0c0db4bad59c445abbc0db2733cab1436ad5271bb66d7e8803507691e537ee18c5adb6302829efd40df905679aaac52c8f3a205218202441de54e84ead95c0a34fe053498d713b376bf6e0670928e61b857cce6bc1f216943aaa5194aa64fcdb2c791b3599072b2a49a551ad38c00421974118a747464ab3edfa8c4e10c9189b3414577421fd00514a0f36e008196b70e26e7a611ce18fecf41c8261290cad87ee76bd5badf562ecce218fc76024a3a8138bb0485788faf8fc0fbb5479f238fa6bb2895d09bfda4424ea400bf77aecaba2e8ccd89a584452212a06361c9bb531740bfe5105c7c716de0498df17fbe708c4a89b799010fbe9496f607df4b2ab49c879abb6ffef6a9378b21c1ff76a39bc77b5c997711159d75f6a80707a928059a40dd2f0ec2b98a121c938c7d59037136e9c7dc85742f1c86ee1f72a087c9ddc240573a3ee5de0710a2654a6f0350632236abf10dfa9ab5512288a229757cc090b5010c35ca44374dadc212d44df8ae78fdafa64284845737c552b602716a2d9800d394810e75d96d32265f1de4e43a1721ee17e9e39d8bce952ba2b749c78639b3060061e9e0e7d44410347ebf40f1abf7ce3f08a31320326107ed264afd805532f00246f7d9d320c44b16b22cc1b7f2b56dc1e0911d88465901f7e5bb4c735239c76fc670dbe7aa095f513d398ae8284d3dee68aca0b186fae281ba25652e621f06fce14b34419dbd17e0cbb7cc80591ce7d460a5505ab0037ab0ec8bd21087db86e0483092fc58ad0928360d5cdcc4921c22738dd29390541829376e4dfcbd624011a84bc6ad555a8c62bbb82ae1cdc0078c201d91c6302482b743a097de93a39e736d32f20fcb26326497d3d2c1df5513d268d958e5fce06510db990a54534606bf05cecad01fe6f083fc46405c19416fbe0d5a9fbe14ed114258aae74053ff633ab97e461d402b22cdb7ccc75cf7083ccae17b9d51a9f1983bbd7fd9453ebe78dbb01bb5a641516a3892c64e68147280a885c48d44e5ddb0cf7f6fda7b9ec74d9f61c89d8ea6eb850c9087e1d54d931238563b5350d071b00b532d7d3e1731b2a30ffe9348e9111f409f0a4bbd3eabf9ce4a2160d9e8a2e2825b1b31c8d80908461111e8e9079ab72120f23c398978d758698ffc18b1bc058afcde6809573a3e9aacc84cdc8dddc4b7e9bf08eb892f55fca36ce5fb397dd06a872fa3da4f3e4ecf971fd24ae4640ffac8828bc42c33714a550065e6150abe556644b208856d0f3dc5288a539615cf712ba20a225f09f6c24e70fc4f2e7fad7e15f5e58b6351a4e6b90424b7f10233a527df4f24ee867b4aec8ebd525f212788fcdfe6f65c7badd4e938274036a7363108b91fb7a799c02fa4e25754f4d369fdd9350303d8e01d62031c4dbf37b0278cb47de25f150c6304634327f9e9179bc1432b7e41118ba0bd5e87510f49611d5feb9e09a31965254e0026fa75920c13eace5060a671df0e3b3dd81189e1ef1b42a05499a79c9ccc903e2c640af7c7faff47d8a3c1872b1885afaaac5724a6df1d3fc5f798e774eb4d8840af8d7085baa97b4ec729967406ee7fa0f02aeac5864348e0e342d93489877ab13a0c4595977835ea7d38dad12414e230117c8c2b876b2fd1864acf0f04366d4bd926fec1c1dfad60fff1897c1fbff92824310168b901a61fe7a5b4f3dba88d8393bb23640f2e4203f0fc29cdbee1035b78bf0479ed293213801b3d8d7dfa8d26eb3badc930cd8facc30839e239fc70e749229c9400a2f7d789da55780270f5c61a77b418a1471b313008f91d139aeb6c04c305f94def637826361d03c60d750b01df31a678dbc8ded799dd6a3885e0fc81cfbd6c2b78b78e314e1e13aec5d6b54ede4bc4ff99f54b3aaffc67708812df9408d2d5d698b32baff75797c7d08e5c4774383a628c018cdcb2b17fcf81a735b2f9d4fdfbb1f97af915b3d91dd826a109984d5befce2e7b5bcceef8137b43b4565859662cc5e56cf2ad2d6f675f4578c03e279fd9f9a492cb0eebcd30318437ef0868404ab2a2e113e4cb1f36782b1616592159ff230901fb14c4a650c10d8ae40ee359afff28e7b97c347f779cee0bb3dd011aa138ad4f5b0e822a2f393f5a9768c648940c0823c7261bdca8d046430f4c145ee3d5108ef003fa6231a6a7421e7d221cb1c8140a0d8b68351659fb89489cee8d532225533edb11c13394ab63d32d75265c3995b9b44c09e798541c3deb152eb0b34d199a2f8e02d2bc58173269205f314baf5c200e24205518b5909bcb50628a5afb58d360008846e32bbd2edec77f824946b2293760a2c0e5e6ab643d2c7e61cee3c469e27fad46427802ff2006e84e30e0122d70bf76f1af43d988b05e1ac396601af514a8494fa1570789ca9ff4efb453723e1310f1f917e92d37abf50abed361cd762293b1174e73fb6b86701e71211257b13ff2773b089318e8b3413ab222176a07fae5658a350cad61671338b55a835631bab43f8e95eaea3388a303a2938303b0bfdf01706f94d591326207e8a6149544c09a66a2e2a032701606d0b576f1a22af63567217295b14d69912d159f0914a6617845445c94373853eb59152ac04bbb43bcdfc0d01641bb391a02e1c32951ed8cdaa3c8aea978a23c2d4ad262c245208331c9de7da165d8240b22ba09834bdc419dad6b262ad7cf2d55548c525edf3fc592c8c7580f7609f61ad563e2a40b734b8cc03dfb743a7c964f764336c347b6f1423f4b2176cd1d493ae3493e86610d00043a3d2e8551e2b2cae00a477552a41bd7cc222a27ed38bd5ed60b643f915d7d68a76b33487eeae64828fcc2a44020750be3e96ab6b6cc338f6cdff28701f44201b1bd35510942a6b14a8fb767ab179a84f8619f036aeab544ba9e63e0430ca36fd58457f109247d05fbfa0a02f3649902fc0e18cc6737a1b5aa6573738eaaa77b2954ae2b7f85c561ab8812dc0a278c4f39ab1f333aed59d1e3e0951721294e97977dab4cad215c2dd279f9d4706ae47cfb061cdb33570a7e6694e286a9ce642eb0befc0864d6e6561f632f5197b32affacac26bd6b706923070620f90732ea8cb2fac87138872a80099da81e98481ee157f29fa1598a28a5f2931226e0290c92f4bfed19ec85c26540d18118e064fae509e31f8cfb508831129b309ab7c24266f67ef6c440daa5aa2b98aa653ce16ce213b1617672aa5ff95c930fd459946ec83b6b7d5ed71f582db1bd4da36dd245054a4e3bd79e0979297c22b9c2b7dc37bf8901206f672b3410958dc5839a287afa209fd0951846eacf97c3a1bdaa024a474815b4e481898c6a7c16be4025b5ca37537311b95172246d768dfadeecd2b1053e3411324e0d1146c5c04223a4ac4b6f9687481c1276201224eb1b24a9a2ffd71148ac14148649926ef0da05dc31c633319fcab61021204c4c59d08f8f18d7d35bf4ca9d02230007a68b48e58155424c8030d2823b342225ca5f28338f7fde9a9fe39aaa695da1022765d5e96012b0de696ede05941e812680f4b38d077f39c367ee682c8b56d999eb630f60048c48ad34160b07d4e0b0dd36ac7889567e58895101ee1795f4b8c00b9dacd3258db0012e52d76a0d233065c418062fbb227de81d559191982c025d0b5747a1a44769f94fd3e903d7d63ee02c2e5f34215345f5736371318dfcf75a7459983e0a97230dd77c547a7e0e4578fc19f6d0cf55f4e116c60b0eaca9eb6b561bd8a97543bc85b47e9e42a4c7f82e9a5414c14023344a6250682bf99bce4b779a552331ecb8d63ef1aed751777ef8ddc92251754c62b3b055bbd555226f13253645cd4458c8a31d820d8a51060d4eef0bb00c6e49d8efb97a0309b48e1b3ad99da90acf37c937440f36a35e66c0874b5ab962cfaa89dc7530b42a4799688ef15c5a6d87828279ae9255fe822c68c933a16f3a92b82e8b8f3de78c039903a8e3695f95073904a120539cac80777eed147c1ccc61ae8d06dd3ab60b7ac1f94c3d7d0c5d97ada8c23d253a35cd37478e25e9b8b177b4edcd963818f77657a7a952ceb89d6eab7a1d7996cb6e48cc40a7e2ecf3edf78e80b16edd17a4e3190b0dd3b888ff3a3ae1f7f928984f8f723ace5081c3ebfa22a3fd7ab360c154e46f9f0bb129b425a3c1a05f1e98362de8a8144ab5405c396faa978a4e1fb88451f7878d8343a9c46270b7b6079a47150d8acdceffa4dc6095bae292a3749c6e87aef23ace1bb9d03798b6d5e837ed3d593098d30f240afa84f8c4b0128381a29b8e4db98d45a1f109b8900cd6533c710838b532ccbad9d412c89eb1e6b26220e9d04d7027c93954cdd610d5fe89bf854c598863704207ec81830c00f82b8f99c017083de4c8d36fd9de2e6f6f80321bacbf45668a5fb7747967032d9dff764fb199c1dcb129a10d60ee258c232caaf8bba66659a94b3cc53bf4affee4bb7ad49603e36a75dd46bfe435346141e47c4cbd0e359e14b2afc9d9a794c8698f28072eba5784b4e115432e26fa0449607500879171240fd52d7911ac9b4c5f12913b2435cb50b8488a32af59103481088f370bd9072a187a1270a59b827785d26f44d0429b3c5fc71a2a515e5a44a233e64df5218a43c4a78fc8752aee72aa7a7e6ce861c0430d4949603c1118277b1e0dd6b877b5f000ed1f37ee6d1bbdd0ca8d69e6a6038316e16245417eff31556b7f56835b00ef645fa43fd6fee7e0d2ad15605b9fdad86b30bf8a7b0ccc0b84445452264ee7854dbc2cbfdb60a1f4c69370b09dd43c4162ac69173e4433a6bc5526dab704794e4aaa6ccfed7f27dc9c2a2c90d69dcbdf381337e9864563659eac5fd0ce28c27bdde8f5c8593b74fa297df7b19b268352f6704e9de2566bac86dc02cde99827d129743cb43766539ee8a4896988689e4671806d179b3626388f96d7e74ea563c559ea89b44a8ad330bd419152abb642152ee59f859ceb308db63d42273932da1e8320c1112eaf4c8c1910498f4df43f7a9dd15c1aa4f84147e4c289749982b2a159c451d6ca9f389c66ddcb29ab441e39315b4f33fe9a4ea2973eaf2616ab85b1c0f3b926a3f20bac64b5b6d29d779d6010b58577240b392a7dc53718790cda65e6b1153874dede3a19ed9f3d146d3f0e2668063ed567ded73e29bd34b2c86a32808217005fcdc87f7b14f1104c3e5ad710f3d54066144e38f7d0a1d8e4a0dd43b9cba1e393319da604ccc4dcdb8e6d59f3c9ac9c8de075ff02e56dec05447147d1f8d94883db17a881c8566212bba775081f0a0ba90fb44fab085cce45824565d910ed142bf31c68bb6dc8c6725864cff6c5b7c0ad3f6b41b54e8b06b2a32d90e2adf901693787a30c0d941b7fcfffcb8fd4a9401eaf65e4414e4470e0ef2e0bd6b2c2d43c726da441acb9557a4808da386e707119d19ae2e6718a0c2a92345c388cd172357c0104316ca047038b87d163e20fcedf218ec099a805751c40d86966cdcf5294649c9c6e3fd2f86a1017e8e4501f0f343db33004af08cf2df9434bcb3f10341e52a6a5bdecfe20efdd8b9dc1b63b34b9bfc05c5c056ed8b84b43374f1b27b9f6e9d6cd4b811fab8968ac9f5d77f8c505cb9dcc0a063d8412fe0aa039497d148899d4e56c9e89f2a74d212eeeffa338952c4dd3716e2b191f4c8b60caf90a601acf4c7d2c8a5f74f28523fe3e0374d1d3e619455fd664a726294fa617e6b4c903b4cb339c469ffd17fbeda6ce2a9b29e513bf74798896eab76537b966c16a436746b95ce1d6818479b9b13979778e9cbfe9e32ad70ab561e92bdb72eb5ec62644918616f938081fb424b2dba625fa27d7dd823bf25f83ce9302997e0f52080475c1b2a519818c7b205b45e405207ea090f1eee51b78ace5f45c92a54dc00055e7b9a81f75f16fe332f68ffe40faa70c0d3d6507bde3b3d1190942c46a71622cd226dd109c212704fa45770b296afdd1045bf99ad6d37f63388d8471dfbfc036e0604e187dcd4670135436cda8dff5d7e10eff8bb386b59c349577961605081546dcbe4d451bcf7120daa8dc2084bc383fa7346debefdc323c304bbd30876c02180228276c31c0ef02ab2b54e7c0941f3703f297ea961c679285b87e78385f179617e3f70470051199878f99654480f952b940fe4695e2ae31593e2702010c17a3e0e065284a190fbe213dc85fc7e35f0693a3cc0140346dd86a03445e7a02c24ace97d0967a878bba7adcf01edc14372439d87655e173c5bd9665a48f4a72bdff9e26c9fd4a86172735c54e6f76f61ae08c4ebfc2f487b6f267ccd9e11480c47212a51c9b0e623744f1e3ae131339ff47ef7f2fcc2ae4f8eb3f012561576c8b8b742d1d8c75c253309e659fe1eeaf7a0f0d6488d7df9f937ffc3932cd899ff0a2bdd73d21d0b426784e7b154ae002beb85d803188763d5a904a15b092504f43c71a90c6843e8f4a4f0f0f2fd786e0453600647a67f7d099e886ec01bdda64755b8afe71246bcd85a08d4426537d824d7f0ca49ae749162549d265d143a9a866efc2f79024c1c2a28841c1045a8bf4d7c13d16b615766165522c2a7ab7845fa06bce9e354ba5bd0fa6f0ffb0c6aab9d0799637f36e390ebfd2ab8b259b128f0af382d346d5994d7045e6bde011a2f63be0cd59bef101417aa320c034cab33c0c09f8c87b8c292ce147b459a3c1f37b1007ae1ef84bfdfdc34b18ae21939dd6f020e2cf4dcdf41cd75ab3f64dd8e0642e1e2882fc147dc15d006deaaaf4ac097e3c9fb71ecbc2c883487eeb8bf4f8bf2fbd48dad44efea48b3fde48c2bd1801001a610c1cc24438d40c6cd056f9f56d8775aacb56ae3ea89770760937aa87e87b5b56070cddaacb20bc8c2c7ad1bf65a966dfb7035145b047951f44a878fe5fcac634342b872c1491db43eb24733d207ec2c167120e5f8bb7454bc7d22d85577482dd14c877ef8c1fa541544a6e4d292c2fddb589fa1fddb8f0bdeb6c8857d980e0726cd9c13627a360aed12b393dd971603daa72699be7be3666b57b533f744a566202cef91af6eec2231c04fc2e544df377603f0e0949f15b00af25867cead77718ca002c12af2f80639c7211fea30fb5a535d5ddcc6a8ff15158b8428d071672980a8cf77a2f7f7870411d9d02c9e5b00f5cba641b6fa82cf731c5abd5a1d221666885262895d388aa83065b5d6ff6feca36b56283529769ec4d04d8a8c52eff06b1c76c11c93d056cbc307fd81c6f9d306c25183e7dba1525cca4f08a51425a7de677a38d3f4e3a866048fa2b8b99372219279c18e807e554531108b6beb1092927dfe1a0ccc9160bc1e303c0aca3bba897bb8ce010297637a913cc6be3791f8d0fa37f5230348e35f9b43453ffa7c03f430720472f0d774e3cbce424d892ff815628679811ab15b9cffcd0b1e4cc4fea888f81b12c1ea041a7d457c8ffb918342d92abd0fbe1de2d914f8d958892b14b7a26a0878293e8e0603265ad68113eee34364541864baad05c1c4eec3dac96a4c88e88dc278e89bbb1c0399ecd586098c8861651e35fe0d0e4c265d3e58ce20df3c574401e65c1a53fc62a856e854664ed4fb54eeaf4a64f1e7f280206c11944d6cb51ed9e51c7faa84fce8323d295b7c11f62c943b5b2faa25297359da888d22b8d94bdae04d202553f77b2ba45c5d989f645966c3a4f04e05c3b608998fd5f938e52fe34c44ef164c869111d56b034b80821685372477e45f91fccadba33f62b7bfa5a7d25bf1dcecc2a37b96ef9fe2abafa4e84d3b8168da23bc9bb939b15a7ee38c5d15d12459c75f0757e2f9fe3dc5c1ef7753e39fcebfd6bab4355e4330c96d77ca2c1faa147007affec798824166386f75d3a145eb0539491580ba3bdd974b6b7540f58f84b9b63e6377c8959b004d91f9e54caa5423bac39f8fab1838922371fb9b5c99412e60614682d20dc9b48c839bbb2409e28c72de757f93af6332f5cea3e3241e4d44738c11a61a2eb398c0175db15891c2ee920d7624c06e5c4c2b22abd8fa19f729123a436012f3aa07905164b9d08c08c6dcbfc76c16c60233bc061f4e5bf8782168e9aa0833a1003ecd8c509c8ab820189518d989609a9d2e811e9fa0ba71f7fa3e9c35a4d811d2c418054d6f1bf63a58b199a9d0a2c70965f101df486d08a202994be8861098bb00ad3a360a14b75eb38f869e030efd7a7aa47e84246333fb5a19c9df4bf96be9aa922c824543466d457caa514f54b754ffe629120ab12154a3ae7be4ae5a0d7928123931290a914f780a1f6f5ce500cbbbcf0d7f39576e33e4b205042f4cd8ced39669fccb9763a0202c4da05c4fdece1eecac2b1893fb677382bf70f0cb7bb459b5604711173aa13c464e252316514a89fbac89b11c181ebb8825760a5532840d0e0d64bf0f0a25f5a7675681457a026f40044332e91026d0c6ea93483e1ece3aa5804adc3874643c897ebb280b5880fcc0dd11757cc8269491f1a18627faec432d0123e6e184a3eb99235a8657cc068387db86a1640ebf4c1c810f6715d2ca116e143b321f2cd15597447318819208a701325482ea4c8f9751a846365eb64937371d268557f95c60a131318cff8f177aeb121f6cd58d9f6d36057f4025d1b9621b512026517b09fcc167cdce25c6fcb23b5082125b7a620c05aec1a666793e0234ddfe262c48c2838a49c90b05501e6eb1417425cb2c2e7a3078e72e2b86bffe344f3f4d9c9e3a6cd0e9f5b32bdc8bc82832ae1af7c0ea5f878d3fd83e069a98bcac4beb087e55fbf14daf462b3ab229b7ade5d37d90d5b7e0d28abcd0d38585b8695900801a1d75811c2b8e0deecb90e8635a67defea83bfa0570ffbeaf45feac3c7e74349f1022250e932943da0e232789a46f6eddbd3aee5cf4e9122b0bc340b2e070007e5ea365770b29dc29fd82fd8236f8467df09e583e7c65d895e0bffdf193e70891b2ea0370e3b222369b8d99a6e9190fe999f7a5ba41c381b86694aee7b3eae7b4776e371e5fd357b1a8091a1240834e9b0c42e230a7f56565ab4093ac5e22c1eaa970132d0481e3e7e234d330064340c6891fe77010a06d42a3b72b37400cb742afc573971009d7af5a56e8b5aff99154038f9dfe87e5f0dcda1ab3790b04f3c1e6696aaa61801cf24c96fdcbb281c9fe49dc386e66c0cca4eeb5e338a22d3ea4f874d2a1a76a25db64f72e50f482bb594dfa90b884aca9ee83395ce3c566b7a00e166204af2c777b7403efdb4d747d277992b8c841b5ba76fae0294dbf8f65990766ed47f0d23767248effa9da6bf5d52882c0ab668b4de0f5d8c7ad60cbb641c426138bcfbc2b7d444331ec0225a2b09f2e0768651f56fa5c4cc87aa84a586c2f911b267167b3eb5fa2f80092e8348f65144f8a777ca24cfd39f248ec85fd903f3c87be5beaa09e9338f2f98a4ae88e7571cc16b174d7c901da64b9eb9d1a63820dbbdbcff6aed50cf1597117cb8458d825e0ada4de50a9c87f503105df53f9071de20cf54febed9423b557c1aa28f83719d069d3de9b3cc1514d25e0949be0e43f30ba233f050be9f295813e75355862ffa1a37132a3f9dccfef9e14d72b44f6beadd477442f035ef9a0e04c3ba61845f058cfdb91d02e53e07d60ffba6e35667b8ed868a265a1d4d29315d91bdda63d501c8aa36be92a356ea947c2d2a609a3f14097d71be56fe02d44171b01673445a6c9e49a0b060c207659eeefc959127d01fbddf5f268235d1f68d196bbd4cdcc21b9f58df5c7ae4d51e02cc9ef356967a164ef45ba1706395e789653d88908a15c6cc792ad722e179572126cc6d30ddbd30e334895929a1d96082db60dcd4ab8ca06772ab136c256e161b5683be01a68370e430ba4a54b457193b60b85147c1fe1ea52cb1243b8b5459b3198b213b8ea8786891c16377eee96f6a5491c68a3b197183dc0fb9e6f7b3a4d7c108ed029609c0b0bdb8557503bcb93da9205af171196827c0a44cf587994d7e2e85cd76a869cebbe286636ec63da685b4f35c167403c1a1125433e0ec60021735a5e98320a450bb4a155143328b16e7a599754495d324c46a9dc1694423ecc0f15ca51b1d3fe74dc720662340616325f01c5fe2d683a089a1a52b0841aac9012b5856c213e7e4c991a2974a2b7907043b39845ec72fb05af3accfe526270df8fbdb41d39f262656434f939c4bc0eaafc8134cce23061fdcf59951cbb46b860460c7d7c92cdbb2343a9890a8606ab91b1de3b25edb5ab0a45aef9a1dd7995d7ded82a1aa865687de0af4d566aa0aeb0ad3d94854699708be3ed8e22c1846d5becbb11f95249843f7126a7a8cbb04a4c18a685ed0aff2eaa8b1a597619b86622faa8018e4cb2ebfdb7eeb1e9c69c32418b0e565a0a8b581006d54e4006d75e310fb0e0a603bc1129a5d613bfd3383e104a17ad42944515e0c5f4834f7fe88f4645084aaeccc42431854f8ddc0fd501bd963feaa8056553bcaf727a8ad883e635c0b8e5a2c1aee1e779f7bc1ec753790e9a5a33ac61b6c5541a5dc163a1c03b92d817c9afb972008335133f0fa5e6d4398065cf012c111656508f9ef8c0238f163b40f9a8bd089c419a649621676f13e663a6e9af5b7565b27fe2740b8f4f2b13201ffe815c45004be3ec4030e5b20d459710ef5ed14d21368ef89ea4e94f7317ddc35746eacef93df1bf4a7d6ee25694fa073046bf15c94ed7ee3fd70528b712508ba0033e0ee40e50cefe61676c7a61f36c641dca9692051824011841f856e3711c968c996324919380dbc0d540efe81f382267065fa8020495bae8e5d638cddfd6f69f1c51f7077073d83df07822008822008be836076dc82eb640ec32f7416ec867fb5fd54d87d190abb2f7bd8bd8f4bfedd7befaf258c31c6163f8973f694064c26437416cc6af1ad0edfca54980c8569d9c3ec7fda7ef671b67fed7f4190dec37b9cf2917571535580d2f8277685ef2f3b87aff4a226ea2103564ac39789b0311541990c98f8a326ea21c2c497c9809572586631ddd9652c99201982a459e217cb0c881f822fea9002a82943b82b70dadf5b4d8170e334872f045f03e19fdb9aaaacb2e05f5365d3028427988a3edcece012bcf47cb1675f61f097b72c5dd1430ce6efcb60597a0b87e5fd717eef2bcd2ebd2563d5fb39df52597a6bbd39efbc51db733fef90092042c8c1cef6fbfc9f3ea338f193dfce4eb3bf9fe11dd85f8ae6b524933037e9a569ee1a5018d91ebb45dbaa01051156b55818910218d0e007135489023bcd3dc361b6687b6ccfc54ef0ec6cc26cf184f3fe0af30fa3296d620dff89bc6edd4d97c7c503739d8b55b5beecfbe4f7b7c64e0435763ceccaeefb9967671d14b85bd8eca60c3e592a511898bd963b83bb86123f72ab861232ab7e3855893bcce9f74a2821ab716ed1f67c9f49f052e06ef11f52bef530cd7349fbd6445e14a787d986f3ed36dbf8791b8378c6eb85b88d1fcf3ec7e119a6611ad2c6ef389c911ce739cf156dfc48f8162125256d7fecb708dfdaad6dc7d7ee6c3ba762199a56b757d1de1779a50dc08c948f90afe45e3e42ee65a48c846f18865b2c95d61d140877b87a60e775c7ceae717bd5e11bfccf33135394f041d2cde27421b7c1f5f91ebffbedfa7ce90c771b5c1f7fecdf0ed7dfdf6b73d533b0bf778d73d585c48d1db7eed81f7e4c817007896eddd317ef778514bd54ddb74aa46009d54d65f6ceb6ffff3d8eb7beef2b7d699377d43248be27bfef537ddf774594fd5dc1dbdf7705d1feae38dadff77d39ffa755f9fb70beac8e6507ceb7af7127038bafeef5d58dff718f1b1f976f447e997e36d286b391bfe32f99f6507ee97b207ffc1d30d394f16aa955bcc24feaefe1b438ed01c9fd1ec21fffa6374adf83f8258c9f2c8de4cff0f16b42625cc2cf92f16abaf1a3b0f1dab2f18b8dffff53bfff74d9cd2becdb543543e9c5bf51b2df433aa63b60375d75e46dff860fe444b14bc5abfbbf8aacf351569053fcd2758d79b5b919da85129c61fa60aa5a1de878072478efc52079ef3bf9f81350e2f2f77a961efc2bc32ef141f38dc637d331680757c1f12d4c14c537c5ef80f9dd1f1b7c52fc5223d32572157663d8b583afc00741710757c107c17ff055f04ff051332d008a57e0e92a98760049fe0ee027dfd30ef897a9ea7bf1867f99aabeb400e3975cabbe2fc9c77fa37c7ff271a89a013ff937fc4b525b7c6b70da4be4e097348a57e08ef3ca5c053f4c6fcc55f03d70de3b0ba990963c591704eccaff5b6536044a7bb53d9cae2d7bb5bd2b93c5bdc9b0b4d9c4ffc4e24a395d595a2bb3ad51b8b66ccfcf6387f0571923f175d801871d7a3be8d05bc920ac6af71a2e31db0107b237ee8cc30ee088830e3b9cf61549e0cf80b2055be2875597202a4913b5615c5a96204a75f0956333e83eb9615fd685035ef983600b08ba80e00b08c280200a04532018038224c0c10937d05003d9e2f202834ac5a09f49e3dcc1551d9706573dade1c9f68fc15b770757ddeeae6cff1b700ab0253e20c29c34c1aeeccee97a030d76af7647c30d250d35dc90f1cb76394ffb86afc30edeba36074e9a10fe6706ddefd15083affcaf134e1cdc15beff0ef66571d0e2ecb5b8bcc0a052660ce1356b94dbda9eefcdef5a37615526afe3fc816179f397ca4f934e9225d3da810d3e8945db73af9bf2bbf93d298303febe74bd319cae3629a73e7a90847d3fdb1771e71ae5be668d6bb19bf297bff4c9e08083b7f07bafd793c0755998ff9a6f8f276cd86a97b03d0d7ad203abda7dd3a0273fb03e765f7063195a956dcddf4102224a34d98980064d10c1eca3d8d5421072451801921230d9c12c145ac84036041938610823d05972e4a4063458a2085558f128c6f76160685ce383e98a350d4c104efc2b0c0a3ef825f043f04be0db50084c739a4d2bc579378ccd20fe2c8172632c1e63cfd9e29c31c638e77cb18cc6cd39ff06be235f1e4b9073fe72ce4860d92de2bc6f419cdadfcf709c3de77c6dccfe52dc04f83d28fef7a5328ee2989cfac4f7478130e18be8526a194ff2549a4cd3549ec873144517517c114518514489624a146344119511c519519c31e10f5bf9d7f0c127c330fc2f05f3ccc6d9d5efc1fc7d38e7ec3065ce39e79d1b30e2408516591322548802dad2552fb7c3782b4cdf8abfcad8f867e3d529635d285ef963f24bf34da7c78fda57cb870f7384b3c6e9aaa3583cd3552ca1e80cecf2d2af6809858d6b6cf07f9f4f667bddd492a2b607cb9ce9fa809386b12a8a83499f303a98ba3c7728b558ead860c619d8259c7bd8e05f70756d2f4f18cf5805185a644d86d8f8c3f8739a25a0c2ceaedee79d17b4c2cf97a182f8210e36cbbe378657f7af118ffd356fed1eb97aaf11239cab4d0233e0ad55edc15b2b0dee378645f13cedef9c1a955e0757efe3805d34947a34b87aef0cec72c01358f0c0084c8070014c8581113c84184112232002ec3e4b86e8798b4b16d1eecc87e77b01aec22333553c8277f68a31c663907d7b6464adb5b6fc147d8c31a8deb48832979bcd8b4b0d8cb51635933aca7db86d6bbedb912b5c6e6c5afe6603df912f5f714a759967b46d4a65db5e313b8f1e14ff08e4797174f46de03bf2d98e8a6c743b082ce7fdf5ab6d8b3106c006be235f8fcf06be231f005832ae205577c6da20647006bf100cadb522bed65a8cdb16dff0aa8631c618045d3026c796922c735111d26996482793798a600dd74ce0fd81249eca1b042d97eb89f10bce16971718147aba0ae69822a4322efafcc594f7057876e69c7346917067645c3543a3da248dbf1192f7bdfd4f17c0575786abbfda26398d2109270ddec2a90a3578cb53a3ef555fdd4f79b4acde57b12b066b7b0c15d6185b0557efcb70f5c6d8f755192ae4fc77e78d5dc5a9328410907adc6027821db629b524340142248a2a5cc9790ac5d2487e699ade3e0c6fad2aecfb56c57f6a1cabe23f69d5aaf84d9ac6aaf84d8d5a18abe227f5694babe22f69d166ab620ce26cf0695098b3fcbe9c53a3968fd1e2a50e64483e30f9a1031dc06e123c7ab2dced0ad10f60f7ed7df1bec5b9a7e31ee8920a2952e1187453fec0502c95252a8eb6fd71acd91efb6469a2a7898ad3be2ddaf62ded131244cbfb9bd91ef4a469a1c28508e7fad5605029544c4c0ccc8b4b4c4ccb191313738a31993131313ba215f2ba48231402374eb119842dc6b16d9f95c30f14cb5c04c33bc5b246d3b341ce129cd8b169cd61b7edaf227a9e258c59e54f660d9afde2f2d272bebcbcbcbc581953c9c6db1ff83b60f82d988e0f829b7600896a06fffb37fcaff83b60e90df271da03f9b5149d1656faf03f93f9a6d2dfb85f2a85690fe1e337994ca6d34cfd4b4dfe28fadfc8eff8f383e98df2c9b407fff22ffe1bf7311298ee805f7c51fcfb3744500453d6e7690fdff7f7a63dccf8efc7f3bf21354042102d98c5623017986d51c1e902b3b0fb57c0208b0d8ca400064caa80ddd9fe7e061e334c7c171fff574a7bb838bcfafebefbdfef3dcdf87b31fdfeeaf0eafb3e9e7bb804c635c2bfe95a82fb3a883fdfcf3ee8ffa51667ebf91d638c33ce4a7ceb5dbfd730f29773063fe7efeebcefc95d1e40e26fedf7f7b60871fadb9ddd5dc84540a6d7aa1f07b6ffb75d5fc079d021ee6b7dbed781eedcc3f6770ae02db4f0d8be290fe0eb10f777098037882fe09eafcd260ae00de29b777cd76570713a6fcda01c8c7fe7773e6767e773c88fe32ad6f935ffbbaad2e0f4c7396455fdd3ce373b9b76b6d9d9dcb966e772679a9dc99d553b8f3bcfec5cda5966e717edeb7b54b873cccee0cea99dbf9d513b67989d7fc53bfffab2f3bb7d859f7f6dd9d965db97f8f94ffb92f99caeeae72755ad3e86e146c557d576fbfdbdeea4a8a893a34f575f86c59d32d2ef247a93e9a6e0bfca80f1165661e3fc38a758c6c67191eabfb1a9a151cdc8a0312954765c9526fb9ef961f2bfb8e46fc97fe63fe537e537cbfc64fe518bfada9efca176db931fd45fc63ab744449985ac0f5ce08317943ef832f9d69561f6c5175cbd5f0057efc710e56480ab17075f5d52879bc2f8fee04de1134bef207883708238bc8f7f0dde5ac71bbcb55e60d4a0f5a121eef0dda401ee30a580074a9fedf16f7f62aa0adf6e158dbbc334db1e4f6b7075bb4923ef6f7fe90dae5ebb1980830ede0acbed0f9a30581fb8c0072ec82a21fcfe1228f70d764a0dee8ae105ec92f1f7d5fbe77d14e933526e9c71baeaa0c2f716069d03fef06bdc2dc45425745ffc1af7451d54b8c08e9d4f1857fdcae92f04b46d7ff1143b70c34dc141b0fd3f9a7dbdb6ff02ee6a8bb05adb84ed33b0ab94ae628ae21f531745100475f8e4e9fdc11a769d7f82eff23b6039ce6ff91ba777393d98de38bfe55b4ef31d2c7af057f0087c13785a3328bbeac3356538f7981ab53ca8412345d805ce5ac02270e6aa3f38dbfe60cc1f94f97f48fe5f92ffa9fff4e7679300e58f5f8e60f83a949bbcc0dd35c8b47c50afac0dfe38d61004e8e195ce5b42b2ef09db12fac1aafea2789e28faedac3b7bfd62db3f46b368b6c71fd5ac9466e968560daffc67340b46b38a5cf597d12c22aefa979a35b33dfe26cd03f8e5932e344f0decca3fd53c48d8957f8ee661b78011f578186a929979243cf0a0e344bd0e74c3bc0e71a79e02778b1df33c48d857cbfbf3e0c0be5cde9fe706f6f5f2fe3c4beceb7b7f9e23ec2bbf3f8f0decebf4fe3c46d8d7f9fe3c37fbc2efcf5303fb32bd3f0f0dec0b7d7f9e19d897ccfbf328b1af99f7e729c2be60de9f4706f6857a7f9e24f6957a7f1e9b7dc5ac20fb26dbdfa6bff2ec60fbf3e09c85f4fd491cfdc16af47d1a6d6dcf8eb6f647b5e3b3e6e0e88ccf53fe5e5c62f6c5d118169342c1ccc8a0261cedb098140a06475fd88b3692b1603aefa28d6432603adfa2bf9c1a61d39ffa02e736fd495f00dda6d44827b556006bcdbedf8305b3f667bd015a65f6357f865b1879cb1c6d61381a84b9600db13efea0d6716e21b6ffd0132c215be72d1610abf2b0cb878af5b1e2a487e5f4c1c2090ffb10db2cd91221d8fea4f6d9d91eff51fb94b40fcef6f88bdae7667bfc8598982294f3968f14ab0ebd20ca50cd5b3e50ac8a049f1c017ad8e5c3c4ae7ef059b2fdfd8564def231c2aa2edbfe3861eac36bc1c963dbfe5acfc0abfb7f43b650625d9a51622d92bbc43a14cbd40a02300350fe9063a9078618823cdf8b55c630bf168d61996cc66d7b8044e3770921405b91ee0868b338abbd82bbf615f336e7f5e3bcfdf756cddbf79db7d0b7ef53bc75f3f69de72dd5dbf72adefab7ef3d6fcdbc7d6c1f1379cbe6ed631a76b978fbb808bbd4b78f6fd8b57afb18875d690fe7b66ddbc735eb6a61e6630516b2ed6320b6e5d37bbf625d3588537af6b10cbb76de3e9ed997ccdbd2c638d61523c9d515c6a6d996874bba931807914fe69ccda0f2c9affc4cdeb8b33d38c87c120475514e3cdb630699469e19546563d58b6610153c951e77a219743e592ab510e15c4f481bff48ba3c59962f4f9ae53d4d938720304b90697cf254de734a100f35f23e9d9e3c4b7bda93c9b6b85992e36db1d65a5b12654c63cef6e0d77693a449db93e6c97bc97bcabc35836a7e86cba84cfa6e9224cb1666d8c70a9f5e0d3becba71135b986d71ca2e461276cdd08b9144f4e2755e6ba29cd74f5e2a4e1209de165b87ffddd68401dd9e8eb9171a49ea75748f872181f91c8d04f55af7789846c962501e564563aea232bcc22f16cde430499265796a8b712e5292244ffa9ada9a4a52db536666266826e8fefdd2de54153a5451c5ad6643a1bb958b1c3d2020e5d0d99e5c131a912223352044c90125c7111096408184638757bc2a5736763169a4364d9a0357c4b9da29bb33e640f8536d9bb20b433348f5a159831455289824504441878eae0f9ec9343799bfb189a9b9a5d2d5a7c0a437f45d0b283c283d1cb21a72b68768af272db23e21d91efcaaa48d7f26cbc63f748425091b3f9aaeb60918fc5ec79c4ecea86a52245444b6304365668a5a9895178a9436cae1ed55c5c1c3d1c32b9cc381f238da58c8d77472f4909221db8ddb8d253770de9af9197a37a6b789a9a1c9534ce92a56396d0f628f023fc5217bc95a90d91e9b74f5295362d2d5ab54a94957bf728526cde92946122a237bc94e31925c5ccca0fc2f6528547355e8081524a5fa186c78552b224243ca02831631c4f44a2686233110f90a3fcdaf282de65751a8865736bc12ba092d71d224cd3198c93024c1a085bb724cf174f52b59b268e15a3826dae98a89f00ffc034d72ae3ebd1c65e693a34a7f86a35055543fc3499bb4a7c3e570dc70e06ca2cdf6e0a8e13082a328014909d02246a424c90f22342884e8706ee06e3489f26426c52143d1c4a03ff3f867e8a5fac6121d3328e675cc1a79cffc0d72aa70e4bc2553736313a660501fa6ab8582948241d91ecc5cdca439682f781bbff6e1d91e7ca28f3283641e65d6c85bf564aa6cc2f6abd5a33c6c6b8623ac3ac36dc8e633f4708ea128065a0c426298c1d083e10a0c48306499e1882746f6cd5b3114b12afe273f36fe982744e816aa09d95c1552e264c9c69fd3553469a0f64c0a43520d39fb33ea2c1e55658d5903b5513b04596e0837e53d67fec60c4255aa99b76690ea67b82e436db78502c785ce81cb21a373dc6c8feda816cb419443f663e62a8e963d4cc3e43022470c91f349941b4b7c854a6fdc9cd4846a424742366fa91e7f0e9ab7681e7f0e229e23675f321f93ae3ea5ca15eb30e9ea596a6098225639af3491b34de86ad2d536b1d3d1a43024bd2e47f7b871e7ea3865e357f17aafdbf81ff7b98d9fa4295bf4bd2538499c1b37540e5c8e25396ea8ce31cb212407911c4543367ce3865d398cf80abf0341c9698170245a2870e470e8700cd9b00bc7942aa22acd41b39dabeaf637db837f86de0c57dc8571e454b5dbc6afaad9367ed2a7fcb42573ca94364a1fa58d5c3c8ec691c32b9cbac001c5cdae4971e85c06e7aa92b9d0e34e25c3ae93ac68e3186de393ca054e0e8e27bec24faae56e55a6524ba315bd8ce05c6d15b207c86c1501284da60c4ef3269346de3332355ab77bc1433af1d02b1b7f0c4d152a53f494296d94a393a3b3dbab6d82b7f1af28d9c6bfd243a91edae1157e177ac88657f8553d1483845d43b826629070ec681c361a871257f1d3681c371ac70f57f1ab348e99c62144e3407940d164c7bc8583895565d885230b2a936d5cdbab8a166dfc3afa468ebe71c32bfc38fa460eaff0d7e81b3339ecba1125ca948d67721bbf69d240379ae2902539ad931a0e26a0d8603bb129cc70bb3ef8f1e378e22df4f1e3d0794be6f1e388e2ad99c78f23675faac73f43cc5b358f7f062277cdd09bc1665f348ffad5a7fcaf5ee5e657bf62f3ab678979db842dcaad09dbc63f430fbb7210f115fe29a87415ab7cba9e576ed215b54957db03d9c631e9aaeed542e96dfc33168a5c94dbc66f3269a0764d9a83663bd79c1d8d7e41e69842be559f35aa9a19751bff9ab38bedf5d473523bed6c0ffe992a1bbf0c6fe3474f5336fe196ef72465e3c751ecd542b96dfc248c941e61f418050065d6e3939f32468f4e6c0f7e1c6d1d681d7b1b7f4a1bb97894364a1fc6453aeaf00abfd6b287a5e9c8c32bfce40ae54d4a52b150bee8dbebb5f0e96b4933a738723138d7991d14b98d7f66875de39331cac6bfcef0367e72061039da00954420d58c0c1a13822f2e405ffe70cb79baff6277cbdd276dcd7bb7a8afd61696dbf8c79c7dddc7a5bb6f6a6d8fbd32eeb0710634212dce4aded667539106a2dbbe987d6127f69a93ecf5b4a9cdbe69c6cd0097aec331fbc26fb3ef7b147779155ff94f9952a5ca952bfb7a962cfbba167b3db5d8376d21e274ddfe2f759e92f3be679b7d69ecf966db93bf59b6d94411fb8b67fe9ce6f03daa4f50f0cd393dbdf5a535ec3e4f47e7f7d865ebaddd5cb6bbb5a4a3b3348a2b9abf0f04c350144ba5718ce2a4316bdc6d531a57bd144da8abdf97ae0bd8d8f51981924f3a5d4f977349db5fd7d385b8b6fd753d1da8735d4ff7e9743d5dd6dd743d9daea7d395f07f34dbe30f82e0263dbfe8bddbf60fb33ff8edb6ff07e6108b7e72e25c3f23f73bf29698d3b502dbfd33e2ea77f4f97f354cb33d5feadfd167e433b2ef06d375011bbf91aff61de9ece344bd6573f6f57bdb6aa2c045ceb3bbd98db9ea57767fa0e0a2e062f11cedbcb39895b2437d6331e761f1dcc5e2391a2e1ac10bdc48c5d81baf54016d23d29885fcc009c80f6ccf28263f3ba71f0be21c93c6dec864877aec8dbdb1c704b455016dac7dff6328263ffba61f0be263a0ed05ee05d298df8e2315637896aee2711ced1e1fc6da970ee493a49fe0ccdf8fe96a77357eb6f8333cfcc417b41734fb12c72f8d8f4d1aac2da6d6f68cf7eef005edfbfba40c4992a93dc7153544268f332d01bbdb39e474b5bb9f3d22b14bbfa28684ac3da6373bdb6382731d6f76f635bedfab57bb63ed319d81bf74b3e3e1ee75dce19c8aa97d810452212dce3a1393c1b9ebbefd7b415b956b7b5c3f8dabbe73d5a79039e78c730af252b08aab38e015dbffdbb13f50d308a179f00a9a9dc35fcd22346a764e5f74414eb007eec0243bd4e00ebbc4dd09ee364804f35f6d97c1edd52cb2fdd7d515471c155802236ee770d313c6559a1d83cdc3ddeb8b59a466dff445677bfc839c6ba8db1e8ae5af3a8cb87d3fb4af99d80ff97b7ffc9f6cdfbf2b38f1dff5cb57876fb6fdf1cdf2cdae1255107db31ffca8db4e839373ce0bd8d6f684f893a182b7ee27b32df173fe6c4baf5621c60fe7fd35860c571d8a0dfa971361b0f20d7292f9b38e176059aefa876929c9f6f87b09d69c24860c15ee4d75f8663be72b816fb659aec260ab6c6c61c070178dafb04bf4958b2b3aeabe1ce0d0b8ea337ce577e7be0baeba8bd7f9f5fe8c175cfc7d179fc37d9c9fe12f78ebfabdd9f7daec7b6bf6bd34fbaaf61df79dd9b7b4afcc0ef78dd917dc37b5efb72f6adf8bb7dbd7f7b7655f977dfffeb52ff0ef9ff615f3375d55fd82c6c17917bc85f3f7310ece93b79ce1382e521857bd445df5576770aeaced2c5c0c6fad5627c3c59f383f03e7fd5fc049f14984e4a638aeba8b14860339ef0cceb5b5b2705cf0d62a2306164e3f9c54ff8d4d0d8d6a46068d49a1605eaec7aa28d9f7bcefd272ff3cdd37992539de2fdd1741fd69bf8fafcd065bf4d6ce2d35015afb81a1087e5f0ec11014f3dbfc65f3c6c5e60d8b2b8d64b92a35f62c039ac70143170c8660f83370a845518761f8321930fc81a1687b46b2fc7676fc7d9f499a4a7b1d7f0ee64c96ca5ca619d8f9450b2b811430e132a7397c20a8b221289aca130c164f18db933dd9933d4bd17eb6b92486a60c0fc179734e4572bb586b4d3232219859a0c16aa9de5e554c851500fe1c1d5485fda16281f08f31bcc21f9a337c30350de2d91ffc6ee45c7f6a2b2c5901b74212b6357444e9c515966cfc2be4b04b4d622104d6c5aa82851876b1782cccbcf5436321886dfd08b142ce6585dc0a397085dc0a391668b0da4d81b5831d3d71522b096181235d46f0be6c2bd86ccf4fcd5bdfbf70afdccbf612c5711c4f403700c20125017403a05c2b04ad586bd60ad2a2bd8e8070404900e55a2168c55ab35610a01c500e28079403ca01e55ab4d7d1eb28a7979365e3cfe9e520954afa5ed028254b923c5399cfe92be1933e8b57828e6924f44de7341331a992a8d2ba9c2ae8277d163aa691d0b79c662246c7523aa663b1984ac7b42ea70a9a530515932a89612a93676a78bca2196de62bfcb1b3e6cac65fc3abe995e07cf29f244f1c8de4fcac79c8e4bbc08e50544caa2486238b77a55785677b6c50b14b4cb1f1a34533540c93f0a746ba9c633672ae333a168f55c55dfad799291bff8c6e66e7adef49b22ccd1adf9e79999c5bdececc681e6670342a0816859a0215848d51bd9451aa28654b15818a49956a52b79927343b1dfd73e42bfc5303655028542a954aa1d2d5a784eaa16a52542f759b7932450accd3a4334f54e9eaa39e251893b9a3853a888af5a972baa8a30e4a72550b5763b2d58c917e196d94be1371ae306230623eb31e4d36a315fd80119379d30c9a79d3ac91b7a9b50ed7367e514866f17e56f0431bba0d1d11932a8921f853f3a15b4caa2486a0f61735892729ebf66a77504483466347d390d120721a3157f1ab2e3a284bd095a05e501557a94c91cd3488677b8838d71f7d8b712bfdbaaa6dfc2b1a76dd3cfe551176d93c96f90aff2c46936dbc9a2dd938c7629bb5fba1fd0821fed4d42dd424168f354548ba8ce0d0edfa3c7122b27e6aea16ac29c29f1af95373f9a98d3f35f0a7e63fb56fe886df2c5d74281d26dae2f390f7eaa27329b58d9aeda1d91e6ce3882dda3686581b40ac90bd73024a4e2c627233c2567b1b1da4242d829cb0c5c6bf9a1fd8f84d2f3ec4b95a266657b6f8ab65c2c8c60fc30cc34083a1c85b2735091cbf2f7f1af5af650fc3f91c51c84dc19c62f2cc29ac9a12856cb367323215996ca6224a6248baa84c379727d70785410423e62a09ce205e5095a09eb7be29370573777d78de62ed5c35a7b02d5614319f9ab2f19b3dec62f14c46d6f5b302531176fdd04c366f0ddd4c45d8d6d011a92fa5abcf8be9aa86e9fa64baa22e664f959a3dd36de36fd136a6d8d8d988e23674b627e7f2e4a6003b327737051b502c2b8a277be72d1b4eac8adf7cd4e5c95ee2898d3f26ddd9880925d99e15c8b0cb860f76e5440b212cac8af3d92b8b5762f1445ec8e215d9f849166fc8c6efc2e289281dc4ab627bf0c38e6e0a4154581f1c54459a83a3f2fcf5a7b69f60d93e53f3896ed4462e9e3c7f5a5ac85499b591cde7681c91e6ada19b0b615b434758b508bbd4242c8575b1aab03bec62f1f04aec79eb87e6a215b6f5238455c95f7d5c7e555b7e454fb108460c69e387d136ccd84d81b5bb3e43474cd9f8b10d2956cd666ce32fb58d22db83ff45db90d91efc6a1276d928625755d0583cecb201c4ae8458e2c70fcd5b367c5815a7ab8f938ddf255d5526fb8dd8f85bd2154db2f19fe97ada258ea8491bcfb60e78b18ddfe675500faff07f3a08c983b2d81efcacdd4d214809d6c7ea80091bffcada6d6c4a6dcc6ccf10e7fa53d3316ab607bf8eb6382db6f8eb8f928dffa7865dfff87f6c26ae09aa8508912277e9cfd1412e66109806f18a9cab399b9942dca51f3f1983a35d3c293353ea68fd393a75f1a5b6d9af732c065375102fe88aab41484149260d9f3da641bda273356b3ae06dfce691bbf09b4bc45f4d251b3f1943833d458382a179a1b93457460c2df8c5d098eec32c2c6ba37f1725bde2dcce9f12d9621a82faf579a3f10daff2db688cc3ab0cda9a2877a81c024723ce5249220423eeeefbb707a2956dbfd4b32fd45b9efd8ff611f196ccdbff8abc05f3f63f233a6f536fff53f2ddfeedcddbff86d8144ceb27c4b65958d5ff03625b39c95559d1e7030d0b2cfb936d2b54aceb8b7d33fb2adf7ee6d957588455a748b1adcfe6ea1151b6fd0cc5b6be9babfe9f1276e5bfe6dcb69f9958d7875bf3926d3f1b615b9f25df7ed6d9d7f8f633cebe4a6fc5b7df8e08c9f93d1e66f31738b7ead79d6dcdb7ef3785d3a738f645f3f6d51c9b82eaedd1795ffb6ca198100f513c65a8798407a8d4ede62dd5920f00b62b6630144b235992e054bd692ab1d6d99f367261d21710774c6a74c3c2b192c0426265c14afa09c14fec67f61324c6c4e70f6d17850b2d73c3c26117cb871a0b570467b2704058381f2c1c2b092c245616aca49f10fcc47e82fccc7e68db5ff5a7538975ce3eb5914ebf8768a3d11e2c984e9a948484d4dbf1f0b67b0a96aee05cc5b33c4bac5d6c0da650a8a963a2a814a8cb5db15285ca0eca1327a7cad4d2620619e96f29b1d6bb461bdd3c8d36526923990abbf97f93a679d484aab9d127ab489191da110d11b41e91215666dbbf265d775029d3a87d76395c152a53a4e89c346192571e9b8d54b5265d5c4ad91137a1248470424e08e57651c86432d97d21d911b6352484bd796b88e649d8d6101116e7ada122579db0aea118d81c760dd5f06a2714c57aa22f039f5c17b0afcd26400fbb583e6c4762d2153d79d0dbfe77488821da101143454331187a6208d43ab68926db9b78cbf4fe433947615d7324952ab1a6394282f3a278088a6e142db14e01212353628d024245435362edf23a9a48e77b8830f57bb060386fa393d3614247b7c36327b6f3c38e6c27889dd94ed10e11e74ecd070b4ad53c33b002f0c7d13c35b03f492c907f4a87538f32bd3567f8603a3fa8948e8ecea9a3d3c13aa60ea8b3b3b3b3b3b3b3b3b36362e5b820696a6a6a4aac5bb6e6e929742f1522a5a544a445690cd25a7a4b8f38e51477623d85e6e9de8eee9dd2f5d4bd54889496129116a531486be911e92dc5353630313fc36dcaa749a2c9a2265653448dade6889a5b8d1235b81a5dcd1356f5cf353b5114cf1345ff55966b1579a7f3cdb7343435b59a585813ab89d9535513ab29a2c6567344cdad46891a5ccd1335ba9a5be2dd8248323b226315f9325d5943503055a52bcbc769e2380c507f631680c729fd1bb346dea99b12ebd3b6d148507f6a1e52af43dc3ce838f7ccc37c4e121212f1a993ff6319715be2aa1f71fa21286fa7051659b0f4a84c91f233302a94e651e2aa29755f70aea71f3992f34bac4d39e8ccd120280d6502cda14fa03a540a7487f6502bacea2f8a278a22c57c6841c6f66789bd2292581f7f19cda3e4e6ea121c5ee55c7de2aa6e77938a19da0d4d71574ecaa3c46dcc2030083a43692812280db5a134b4086502cda14fa03a540a74875a81f61e45dafe29db0dd724a752a284e347e6feb451ce9fdac885c9c58bed658a17de8b152fbd1726bc20c1c4607858d55f3c4f30329466c96e49b68be2afe2e64132c2faf47878b5c32b9e283c3a9e1c4f131e5c8ce6b9d99e23b6f324b13c4aaceaaffa7699f2d85e70bed8764ee9fa67bab28aa4e68b0d95822fb697295e782f56bcf45e98f082041383e1a1c2c876cecd74515dea12eb9275c4fa98feea1829e2838506c407d3b8fe4eb5d63a69893529f371b3d72fa64d3a2b8f4d343a5d78ed343dce937686e394587fa98d296762c2a43bf138c54e3f9c64a7204eb353d18988140a35f1a966a37994f8e9b3ea4f20f2c9c4842967d26193ce34e950930e65d2a54cbadc89c79553cc5b3e564e3f5439c9bce543e514c4ee34c32e1f2827229e9c8abce5e3e43cd5b6bfea8e269c32c70c32d2f97c6a23fda566d96c4fccf6b88ee96d72164a362b89f5a1663404880f9f24a49d0f1659b0f476e6e1d181f5b9e19ae494d8feb6d4825347df9c9cf2a6c42b4d51ea8d428cb49188b1688c815d8d353cde7c3cc2aafe31d469c499f09fe6a3255e698a526f1462a48d448c45630cc6da781b8f10c1743d73baa27b2df550e9faa83fa5ebce5e4b3dd9a85947ac4fcdf61cc12879c12eb23dfea1f641b23d468a60a16d7f54baeea4d2f57da8d29bae624f97bb62a50a951d94274eac7a9a9aa706b66706d6c7a664d4361b6bbc6f5e07d53c4b5cc5e5f0ca6fde9a347c762ae5b9b9e0345d20a7c9668f2ef48d46f1caa4a35362ed3b585f6bed8b45d280fbd3463a6fa61ac5ab9ba62f4aac2d8f125ff9f3d88e9c6b56cb1db34669ab529b3da361f4bb7a5f46973a46c6fadc3709f1108a79abc5aa304aac7b36d953620d4347e7e4fb3ef83cdbd4d7f660fd6237f1619bf05ec8e28524d5876dc2dbfe2f24bd90c58a5562bdda2d0069a1e7020f17623b2d0069a1b7fd5d88b9c043fd790d7921b5f0430b329bd1f657f7ca63c35add3aaf212fa4eddf82ac851f7602507edac8c59fda28e7b33652dd57e50015014ae2b164b6e715c4be66cef26157feb69d7da4a8086dc8f6180b888c154bea1541b4593e1ca1c5f6c1c2226d1f2bd6878aadb273549a8707d6c7df85e6b1a5359a27a7799ed81eff1dcda3e37162fbe7882aa02234a0a4edff9a798b003d7f05b12d02586161b4d1cec768a39d34258015b6c5538455bdc5633bb189d2d490a1cc0c4ccc28964afd6d1d9dcabb248e31303332a690ac51a1a6cdbe8fcf2f35de25718c81999189414bedbb248e3130a5bedbc4274a13923568ce8e064dda4826c2d29799d131da284d8d74d207d313dc3e5478b4bda23c36bcf27fcd73c32bff1bcd83c32b7f1d9386cd46a53e2a19648cd26b276bdbcf316bd8ec92d1697ad4af3cb6196d5d155f475bbc2a81afb5c52bd55fbd663295faa19db70c45615bd696e9697bee0c57efc7e8155d7fc549b1d618ab0c1ba3c41a67934025d6e96e9558ff7fda284d4f8df5cdfe7472ac8fa86d368e59a3b44d29d6369b44a1c45ab5c95789f5ccfeb491fe531be9e854c42b9bf44ca1c45a667f59c42bac6336b9428935cc265928b17ed9a73672f19f3622c2f91e222ce773cedbe4246f0de93c67615b434f5835865d423cbc2ac2b68498b0366f09e5fc08db1a7a81bd796ba8e6aa12d6450024d8ea7dacf3cd2cc75f8ac02ef0e6d2e32f69221e2791c70e2f36f8e58cb3ca845fd41676b5ba1de8c42bd15bab8dbf1dd83d06a4dbbfaed45df9afeaf833caf4ba4e6d5f251c8a24097a49fcbe9cbf2f67f0f3a74df87b8830f2474d24930123bf87081b4df0cb5b92fa3c472d1361e5939aa8870c58799e1863b7a409bfc52edb62959a8557f74d4db65833d613376ef2964e6232931f0996f86e8cd3352d9d20f8a48fd792a6fc8e929a0809f8e4a7ae0bbc2b165e79f8e593a4b63012bc2e7b572b7857e3f760c1c8371fe32ddaab8aefcf7a95ac055a4b3fa39973f69c73ced792a6324453ac6136a8333996b4b63d4f6a11afb03e77c9ac416e305d35cbe24e9b2c95a25983dc38156d8f5e59fbd6207726f7a7cb0d8a61cba863e797ed3a07abcb3b443fff7357e9122111af263f4d6efb6436ad18d85f2a96a21db7a8730ef5bdd8e66c2aed729734ea2b5f6170e88e8312389258f7ec511321c9f849cc6463006c9f6d41500c0a5fbcf9aa1250770ee07f4f9ef8c9cf0c2a3dd6e193f72c5d15cf92bea6d0cf16cd52e8aa58d2a7abe25b53e867af6a50881ffcb594eaa0eefb2098965f49dbfc256dc1519f684882a3167de5598873cddffbfed215c7cea9b8da276824c6b6fd6fd6319a9c299e7dddf70702443c73503a25e164c4e403538f314565fbdb6c1b532062ea623b73b0fded2909dbdf9e4c3ed8fed6d463fb5bb306dbdf7ad63092385333fbbabd523904249718b3188ffc2fefd7b294bad8ca21dbff924b6cff3b66b1fdef78b4fd6f2908dbffe2ac7172e08fc2958000452442a4b088d8c2c333b1040498bad84424b6bf876191edef600fb6bfe7ac6998a048208ff05392a9c0b2fdb1e37e05796c7f1ca62eb64fc9f6c7998aed8ff309b63ffeb286c1c1146125b0278130452e520b0fc44a6cffec49db3ffb91ed9f33d678675d2271ae2e369d7d5d20f8b0fd5f62f6f5b9d85ea06cffaf85771f08dbfffb707a7fd8fe5f0ead949d9f0615f0af2d3905b158e617edeb7efe9219945d5a78db1fd348ed9bbad85670de5f5d6ca59209a72a71e3fb31b6d24d4d712f2f7fdf87ad1974b23dfe2a2b068c7befbd38b5f3fb15e74b7b0725ce9565656c16769da23f8e2a8a63ba9e282aa6ebabe9cadaabcdbdf0f7f2763e33cc0e4a9ca71306d5e1b3ed7bb2af6f0994c65d27eafed1f67dec97879ab12b064dfd7aaaacea78e52d944c691fbb6357fe2adb726155ff771ffb2adf1f00f665be7f0f0cfb22df9fe7c54ab5afd2fbefd8974e0e8e8b54db57cbbb7cead718a95f5b2ca4de9ffcbe9d42c5ccc02e719f72de25311c4993599e8e8279095d5af4c579dfbb4de89be897e458bac0b9c10ff505d00da646688ab240dfa7f4f9a5366b70c76822243985534be4b43ff7615c84425a9cf50ec1fb50302fe86357cddb57593164cc70e105eca279fb05c02ed5db2771341112f47b3c6ce749d6368d18a9b90b07d5a9dfd12e68683411924b44852f0d08dca56dfcaa203e4a802588ac04484170418c089224c8912045820c09022448ac04580081db38ecc2c961d7ebb04be70ac13e6eb30b840f23b002446c043d206e402401e20810458018020410207c8c206904587cdc7cdc7ce07ce47ce8b0eb268b3f6497c8767dd8f216311916322ab22419cf87cdc7111f457c0cf101c4870f1f3ec8906456886c4436a21b118e28b7056ee3df11db21db31db41db416447d10e233b6a3b8e76d876dcb61062e3df31e42b5da21bc322e9c63c90f465c9798089078e7800e781da13929e80e509569e40e509529e00e5094e9e707b42122c92367e0d246d20b601d906664a906dfc3a723a743a763a783aaae8e8e9b8a2034947161d491688659962e3d741051c7bc8001270493a706011663a7c54008b0e590590b2e0b2189125499623598a6419920548965812b040026ee39f006e02b909e826b02bc26ca5ad456b6d3d5a6dab92f5b62e59716bae082fd8f8d723360552052a02aab90a74046403ba012d715587dd810a19900d4889bb5e537c85b1eb658b218ae789ca3ecc568a1d04a040c00808e820702b826cb38ae083152cac60b162c50a152b52ace4ac30a142b6f137a0010d68405146e2d1367e1b7636f06ce8d9806443161b926cd0e286d80d4437c86e9861974a8a246cfc366011c592a9c3196d7a229a57fdd546403f9c0889a9ca6f613c3c1083a5bfd2e313f510613cc22db6d80286843c5f46ab725a009af4740292cd8064e1b7c4540757f1e380df862136f86003cd8698143a299c48c1440a23a44822c511298a483193c20710761b7f8e5d0e5e8e5eb973750aaf77e585a45f49af24d607bf0e74bf8a3069a4764e5fb6159cab05822c470d7f0e19ce31c3aecfa1ea3e87e2362efd6a8150b240908da6179ddf4613216180abf8497b4d37ad18d839bda1e6d2800481056d1644d2a5e5684c6846d092d08ed08ad086d064341f6e90dcce61178e0ebb7e7783f0b0ebe6346590a1c5e484cd268392d3e9458622198cc85054030d27bbc40f1968435286980ced86704ecc9cf0e1840f4d60d1049626ac3441a5095d134e6cd06c14d9a8d9f8317b399788d988d9208269999dab75924548c8c5c50c3abdcb480214906a34cedb689d5fe9b77955bf662f22af22232f1a90ac8857129b02f9f6359ea725de3279cb2c69b04bf5f85f332824e11876bd6c46df28400a76e0af40b2217243e886d80de1a3089621644590726f0823864832c491218a0c3164082043c48a60918214ecb0ebe6e5054626861758b1dc0b24a0580c26318ec4c0c5a8c5488a8125869518546248890125869318b7184958b18d9f1563c958339edac6ff02e945124f8c878847c6f38367c6238487c653c4c363e3e7f1c1a6403e0ccaac51dae5f7e4173ede61f8997fc3d0fccc172d3e10ad14cdd285329de12a9130fcdd8bde8b232f80bca8bd98bde0bd90f202ca0b272f98bc30e2459217452f86e4f47292f46ce3ff1def7b7fe5913e8bb74caf85b74a2d7b2b36feb762532051a85449864032d4a2f8863afc183368b67108246463a01fae923365d646aab7d14033209a03a9806458086f5dd74bc9fab2ddf46553e53ef7baf77183e56537488f7b233ec91ff9223fe4817cec060b954aa54aa56a3e6513867fa9385fd0305477340a591c08bf8d4621c9d5afd144af9803852890ecd533b269c9dc704d724f745176bc2436fe17139b02f96a8a42167f49514042e1c585b34a8990e4cf5a853095a1c2a97c98b1a28acdf454375512d5115511d5101510958f99a4192ca9546a2773de8fb1f918d30019c6e36e014b9f445fb45da36bde46bfb246210b0a49aee29a14052d7c65ee9714052415a080b45720d90b2975b1cbe66b5e4f5eba5794d7ee35e5c57bf5b04bf56262e37f397911c1ffa2e19cb25a6ef6277f0a958ad9574b4ed7542a954aa580a450282c2db7165c4bae05bcaa32eb981add72b5d1aae5a8a506e3d27438ec4a73d865a3c3ae1a1facdc14c42e919e7db9bcebc64a72a4c8102037053e922e112c34ddc67f693aecbac91ae7899c4246081511ba0915d9974be8848a13294ea03871e28489139b93234d90367e1790b00b4941b120d9cc8c19547e4ccc88a322c6ac51dae693f77c99e124aa439ab7d144403f7c854da0d9f9b2bd94bc6ede8af99a9408c9fdab69cc142d8b501a6ba44b212db3165a4bd109e534e2d49db716598b0f27162796d3ca49e59472e64e2665d1c65f1695424a9abb70fe9e2faf32837218bebc35836e6a4a59f9c326e5718384bf948567d646352a304b1923999047481c592393482ca415920a298584423a216f649230b6f187b15016cec02c60120d0a483bebf0af36b2790b2443218bbb889084298fbb05ace6f1a38054a375de46ffa33aff8ece59e9976d09ee95f39749c367cba4af5b0ace15d4814f8050401d1805dc8153401e5805ec91364032b3c6b85f5e9cc8b9de1c78037160eec3e2a3f2257d3cd0061e018b80434020a00fd0870fe9b322e207fa013f908f9b039201fd009a010901a20111f156f9f8818ab08be65bfe6b962cc1b90b475f9bf4a5c457f86dcca097f46513e25cafeddabcf5f2f8af12276b4a1a17178746d7e8283d0520292029474c0149143044013605d0a4f4a4509122450a14294ea430916284949a9422364a6fe3bfd1bb8174230901b11c9d12d5463434e9cb865737dc4be76a14578d56296ad228ed570e05e76a9dc8ddb871e3c68d2ade3aa3dcb871801b078812254a942851a24479c289dcc62f830c32ec9435fae6714c1aab8d3e2953a2660d1b977fd1a54daec81725aa8d703eeb97ed65a35fb857ee35a35f535ebcd7cda451da32e96b37e47421875dd0b9b0c3ae9ac7ef02cf852ade3a1fbf0b3d17ae78cbf498fcd5369962e377818a4d817cfc2ef8b02e6b0780c5baac7541f60340b22f9777e15846a849fe085ae41cb27108e4d424b6711258945ac06dfc2de0b00be7f1b7906b41875d3a8fbf851dc953da689ddfd1fa6bf4cd936a29078608e30646087e303256cdc070183230d0181817060c1830acca327dbf83f3a836fa8fd1463a298a57f953da28fdab8d7252d9c3705217df0caff2eb1405a3fdfae47fd1f9f12abf8bce37db93bf45679dedc96fa33f1a5ee5afd15f115ee53ff577e46afe93fe6caee637e94f89abf94dfddd4afd2d71353f8dfe54facbe1557ef27bc1ceff1db13ef947fdd56c4ffe925ed5351bb133946fc4dd214e3b508f00124d845ae7bfd38ba9fc84784be6bd35d372baa823b963f3e982ec1f21be1fdbfee7c3b67e689fccbe60defe40f1c5b0c861c159b951f9b14971fdd4f00aab5bd81556b311b6c5e2b98a6d8ed5d14448f2f77818ceeb9cd7c1a290eb23d25c1585b0aa58844529ec4adce195d87355b4c2c74755ff51f4a78664c6ae0ff973d276b3b6b5af4b44247397760f6d1347434736d08b868a868c84b8092143428668eed2bfcada68f5a486e1070c32186236b4b091e46a16a42b3ddbc3bb791c1d4db4f33d4498fa395a86c2d454e77bb060fa551b56ac8f1055b60d2a56e86875a5837a3384b01d169cabcd818d480e9a6cfc301b86dd60b8ef33837e8ec0129ceb8f2880a4d7fa75f47f8e76f1a4aa89d4f47bb06039aff32b2c5901b742122be45808010b3116662c0409a54ba854aa5494a67ada31442302400020001316002028140c07c5e2f140d053e10714800d79a05c58502308b3240c741432861843882100000066444866a6090080a80ae005ada8063790e3ef938fa72a7b25d10b4841c4a076ff7f9eaac0855cdb8c6e2261d1c814507a15fa9901a9139e05252aedce0e1495fe189fe4a6d87b45d373933bbdbfd800a18dfc55d3a18b04bacf7ef038650ca315d5f8849e4a4e5908b57d1c2ba1f76b5d4f5015cbf599704c4cb821b79473e18b1282441d95aad788ff4c2a585a2fb64df1585e2cd4917a3bfdfd112c44925c838731371dc4b9f3d62b5ac2f704615ca08460475eb0a5d6bd12602f30d6101b0e0cff54a8d5ab265137cef139cd7daadc66b931054a7b505c834c15e837c2c94c9682a69b097c286df453351a46e7eba262682ab3bf03c01e4723fb087c2c43ccdc5d4d4b3f8e4be80dec3f910246a0179666643a241e48e7ea6dc088c362f467e3849831a8a604378fdc0b43e81cd3e309016dbfe1ca0c8c8ec901bb7122ecc7217d8c3043c6180e6ddbaf3d395ff5ff25cb53f678eca1b3c32f0965f1bef198c5b071e16b97f157914f617435db3dfde9146b4ee063ab78352dfc152c88e07e30f878b6c0c20b1706b01856ada74343a4329e090ea45da803e3c8cf4a4c14a55b65b503788e1253704c22919677523d4f134c1a680267156543657b071ab02016733f941f22f5ee440861a1752f4f1581700122784797c7aab633d6f202381bf73bdd31562b4b2df3e019b050b9ee0080d1542c1a580497d2345674d8917f87b93cfaaabfdadf01ffd831ecd9b2f153c6f25ef352d484493c0c7a1d397f1613f24aca88b4f45a40f7998868b080e019aab671d351649f2c9e6b5e5d543e89783a3bbf7107c568c7be16b3e360d5dbc2579e22f22ad3ae2c952ff0cb0e1a075efc75c76fc1417bd42ae6fa9c68479f69758dec3691afef22e34696f7f525b7f4e800267bf4c2d4b5f1b082d5fe2b60d25df433c101f2ef35a64032ae642cd126e767aaba076fb48b3fe6cb1fcac77462690014157a88f012d878f0c4dc200015fd13509b2e671620b351e07ade541da3e52e43223fad7cc131144d25671c149e855f870df711b3500b1ace0c99aec27f3e4cc506fa522316bf46eceff03cc1e6114186869b09def2aa6a3c6e612e35fed8fd4473a3fbe46c0ab24a5104068de681f3c55154da49fad5b9cf76e9122a386834c703b1dda370af5b0ac25fb69cd737b7b034c7fcc98b069a083008fd48cac2c9c825e1b362afa95961d35c93666d6cd0c354324645afe39b985caac78b7a072513682cec178e0dfc6c8a1e90c9ec4f6cea2811f43a61be8ed5a1ba9cd2b164c53dbf0782a1dbbf35c2ed58087541c009b840a6f0267b17f9ae501a212ee9645695e4ad950b73ca834b3c4a08c9aa572570ad3ddfe9f58c037e2f769b5ba7a9422d5d53a8471ba006ab7e41152513503d221b2485d8147fcc9026201b7599324a666eb5f237dec11cf8463249285246cea3937521afb354f7fa8757cc0ad16298b286ccbc510e937c27aeeb2611338caf810eb550fc824866b4e6faaa88900ded9949103ff15d91ab5b584151a53bab84e1accfd639110d9d933558b14f430d30992bf7a63d0232c169d473a635f1fe85816ee7310db9865f9c5d95abd288f4df6a9b8e3c045c0521136deaf998b87f7e6bdd1ec97a04f0b6bce611dcb70efe30880ba2d9bb91dfd913bf8a42d584eae854fcd408f3623294a6ae2f044d3be8933b9d392a7d93a441202a10d47800066603a31a08942fd51ca0300f766e76f15cb2b2cc6e275f9f8ddb1c82c01e93a63360680788d3e347b02fc4992e11b2ac8227e936df4041d7437f2e8eb60f0d3447b76a0a43ea05b474e10d7b502acdfb8b93ee180ee164b1675e44d14547dfd0a13b11dcaa462e08ae49da64671dc9ebc08e5efc17d5bc1af9fce9e00e5aa1d791bd2787987b1b32574f903c4fea95afefa5e0738698c59709588417039041a23a7824d80a62bd2a719a329bf4c3fb9feab81549868cade5656a4942bc8df0d912979acd99631156ab6c7b457c4c0294366007eae8d1a5cccab6276f8ec7351bbad0ab0c9e092b6661e7e712891c58491ca2b17354b36486383894437504065df621b2c834e9b2a290e31d7efca14fca1d5942df2f64ceb2dfc48ffc68a74d31d41a899c16f92675dcfdc409c013817d441c0b8ae5c02654fe755405f0c3d35a8ef5609265220baac205d723984ea6a4dbc4385be6f092a1f40cbf7a887c78879167aa193ac0fa1855a1f5d821dcce61fb18ec422baad4184246e3ba54c702ac6a117c00a077c65b4ebc172c5bfe1a19a76cf0cf3c87594450ec94f95eb3b7853e49c6cad42883ec9488786e4a3cfb979d91c0ec54146360b7191ee174262b6fc0ab77e77f84776684efa53ea886bb24df183c135aea2a4d0bdf6816ec24f0b048781a2d88302963c2713f7f9f42cb5f86db3ad6984f401c252841dd883da3c6fa77f9b6857ba9d0e1d7a2e5cc0b75bbba06e8cf98454813f85bc2a70e9315cde3c759cee1396a68ac8c780ed6703611f18c960d633d67e3184fef645a224fcd71a30812ce513537f6d25c73781bc6cd36a8213ee8e8e0981bdf0c3ac40b480000bd3f8a3e6c85b627a9eb70cd48a9331e647b5dd35059f1b81d0b4433af73a4863b9a1bc7e57eaeadad21f6ae9774e4372ce5ceb7c3aee7c16bea65267f73b0db8c84ccd423f3eaae54496cbd88e4f76b10af0eb48601d8173b830ae60640bcaa6f9331b19dd296c86a9891b6574500d36e816173598bf218e356eb7e59239a325e5cce79bfac66e803efb1aad6cc086f92955076c5d1627b5268b72293be456a672f5288859281fe26ece76045de292ca9e3c108af8da9d68015c9bd52dbf45f6da96af5255b5a37f956d35f63ba0577765f2d85059db0fd1a8f2394d9ff2791d7cfb4284ba584fd9581b51a628269a5d58da2fae68eafeefa272ef7a59d7f45d0f2d6f8cf337af748e47a311965c952b13c67b0b2d6cc2bac94a9eb30a1cba6cc96978ee3a995e481e7613c0512879e418193fc41a8c9cd736356e15aacc89704d70a0c41cd88350a1366cb58a38e75caa4f7c136fa4d5bc9d488ba381559316c08beb548ce7c072e82803675b2b1bec9e471e9d3184523f669b09f4286569604df6ea0338149ed24970a87b71b7b4a3d6b8866059e68fe05a868bce564ef2eb1fa12ee5efddcd374a501ccbfb912854aa4f5f4f1dea0c053829c48971c5b6c780e25a4fdcf822d6c28f70c14e92d3b79ff5bb5b54b65e13bc2ee3c081ea8af43bb896813ee32f2e2c822b731a156025bace8684a968ae5398395b526f34223a4a0c882c3580131e78a7bb80e200fe775c9b9eeb8c11fab851229cef3bed78a036c89e14571a74f07935a18cd5a2397052b733976de38b91c5cc1a177606594259bac928e8e60ce407e288530539a69e4a97aba07fbf687a6b78e42d30092b8c2357634045389052f534e6f00833e8c9f0daaad9131892329b7dc4b721c2745e8ac445ef8474f447777a48278b1ee9ddc09adc6c63e6eb007cb4930ba43f11949b8cc6b854065882ea900dd89c3b5edca55eab252637b657475b61e3fb1546bf84347afbba82877da7d2a7aa56e22f8128411e9b89e60fe4feff6d67612a6c96655421d36b774efa6329c8d63fc4c52abb03cd504e0357037d638e17531ea0dbb665c87cb0ece07cb4aa9aee16c18a2eb01a07d9c1146db94df6db8cd899378325b974d50bfc73ef46dd5ce1b1515158816e4a4e62ca6ad74c0f5d81e9a78e5ad6eabac84ed975842a307de9649e16f692218bd34e8399ce2ff45fd471b7b64ee635085f6b29b07b9259465efd229e97bef8a25ef954cb234ffe486da0249de58dfe20b19543ea661cfcb62f180a92541d02c4c4e0bc00a6db1677212caca922f5185e0b6e275cb07ea806223a254c7f2f86df071743b20245a68748cb15c83e65d57090cab9aa35b71a22c79570a88316e892c577799a4af256ab1cc4d34408cd8da89cb300c9adb524e076806d172e1d30e9a1f8a6de80798cae93fb4a7f60552e0066e14e320261b6ecf0d874e2d8f2a486caf02c1b63f53fcae0542acc7a65a14764a48bd666aa09a3058933bb8effee31b588847e2b256fbf62813d7284e5d2e4cddda3f8733f6451032dc59ff6957cc9ea7658137ec8e78a5f52a9f9ab5756b6a1d8a3caab0dbccdb2941afddd11ccdc4e0a5336f488308f91874141b4e5179f2a22ad6bb0bb93cd81b82af49ef95b1e6046be9e8805827b3fc20c1378a378facd27d2889634095d848ee3dfaab62aacbe3acd4916b70d06b2f2ea6e45217fa4974a8a0d7bed1c59842b4ba9985d5d5994514df4f3c5500c0106e09975473596abb01fc2c9850bfdb40e1983d7bc67a18150099eb71a175b22e6e46d1e2d77177aeb814f6b08f19f2d050ae0506e670c5d3c7ae190d34733fcaed73a912901648ad901a34218caf7d243e43d1a8c093750ba43de72a7c29f7df93681665e413fac18e93679548b18c814b01c7dc5326f78a94f49b51c529614a063a3efb4a903090ee3d5ce35c5106351e3d8024cd299321520da5c092a155c9059f558eb677d66b1971de0cb9ed904786e06d0652a184b9abaa91a5a1334873d5de07e578a55afcbc0abe292d799d51a5277a401ddd8d8c1cb97f81685e9ec322f7a3a0b72b661f2b4689dea30ccccea97406486d9091063b1fc835e264ec3154b513e899956367c80de159c2067046f7ee7f7259e19a3f3800c4ce0e7a96d414202d3a73429543431dee9c8e7e04ac4b30071453f73b4c2db506d11b4a9fcf35fb040ce8442315d5a782516b429962733228def004ab3fddc54d03bdd5771a776b229a014acaffdf654b8fd792657ad6655eba672bc4ae66a1d33995903e85b9186bc6c1a993df9e5db195d607559e001449bd65458fc4c180895f6da3e49c47434380745776e516a383de927bc6bb3a313e507e7a9e5e0703ad7fbc30db5c1c899ba3120ad78284f7304167e4f0875705d3039020658c01803f7ee42763d3ab3785e9304bb41ba83643aebdd9a76649e4eff6391b365ba385d3d05bdd5954a0791943c35f2a9ba6c9190e0f42eb75668953451944528cf09454426534ab98b25692feca94c36234b364e9bbdcb5fd53a476e2c97314981e3090751677a4292d618dc6377845503c774d2b871a821a5d9037fc4f8c6fd742be43039dc5a9ac174275c86350afcdeff39b538e04b599621b7400b7ed4705a3443f66b49706d6d69085aced2311c49c1c7e0c5abea27fda3866fbf37d2687feb923b9645a1303f8aa3b902efb7037df88667a1007ae6ee369c893239eb9f1ccc5d3f2c24bc902baea8a8efe7b9df3fef92f031381e9d5a0b995ae9cb4cc9ab929f743d6faf44f227ae86d8d16b20de9c50f613294e219b7f9bd7bdd3374f4da678e1b5c554d6c40fefbb6f4993d36818b557e57bc353168e2bbc295d70c12b0bcab8cac24d799088303df4e74131393fcbfbd73a3af04f4aeab0f4f37fd75603d4fdc4189591c32ab465bea432782aa0557f5547a6ebfb9a754aac270971aad0c786a605fc7d6d3e50f032df10ee8173131d132452675ffdb586c5e4efc62e912ea2cbd80fe3638046f1fcf2526ba361d447769fcb762de6d1cdff67dca5a33e61adb73364b3a33d665adea016ad3f156d50a1ec2590d9b15dff21b47ded97032c52efa6a33c923f9443a41238e16c2ee24244df1e69c2e3325ebd05a0c66d5d0d2d8a8d61d28655ab5fbd938235e1d9c1c846e36eb865ec9a3d69af23e9e404f89e7be3f967b454fc18f46e3a552da9777032e5cdf537984cd0c913b9822875ab088c0ac04ab72e5d34a744623025963b3d26a4818e90ede0aa75ae3c0552e0489dc1fc56283b4d8de73c3b0e844d74b07354955d1f5e8f77249c99ded81b429cf28f1ef57efbee34d58b1628478d0f022fce822dd27c2ab49fec9e01f8ef27815bc2e80cacab3d65b0818d222cb7d2e37afd8b8867be73aa3657340db7f03c847eff958a3d12038c41d2f5d7f063ba98632f8fa8c23e61335ae0e577d30b7d117d55f8996c54ca0e62708a991100bfc99709526350c42263914979160fed9dce69163ebb8a97a3e7c0960f62548c8ed8f2f4f878a9f917c311f88b3f812bfcf1cc82398ac15410752336efad46f3c23c5242ea1efe64d161fe71c3a333cd92e73464a2d4bb7cb42d9aefaa368e9a30865917756a826e3f79548de43e019507f233acc9ef3fe83e702713a85ac97ff41730c79e499ab5f2f2e663db99afa649a2eb52e552b5d523857a799b67e072167a9f9f156019d4dd0c81c24cc6335f68e8dc4716080587d64d764be27c958266289e220572e5774c0be688375ee12569ccfab52f92aba117a4d69243e9e010e3d1cd86c1556f1ce435c5b25f4421056ea114d049818d67272403d189042871d99d282d491b50e53aa2d41595b2ba7c2d27f76837211f76a6dbd53cdd7f12dbfe5645ed7e0a2aa6df7eedc7e3ee7d766ff35df146b73cbffd482fefd2bdbd1da0248abca963ed888c8e9a09246a5066039f00330c6a53d2665fe2468e88aba9971cbbe866ce436e9283654aa93208bd382a62b3c84da587877c735e38731d21ec99ba3ba8cdd45f541cc358c495dfd941c475cde0ff6f4f34ad95691c9899f0ee9c4dbf5658d23656d6b1e9ec08d58c95ad6b312abf7e374d34be9d1738531729c69973b06683e28204e4056d894847586d39b0c2bcb76a4f74c8085e191be1f1838079da016f6d58a535c6fe00bba76fe914213593af69bd155f05ddfa90640d7d9c7ea78e49185e6022a7b35f9eee3418e7b5ffdfb67f30924e3ae437a970de37c169b24d16d25815731cdf915dc74c4e441d92941c9a761a4c490a9ad3e74d5957a0d6250ed2a0fbc896612731bd87558b5d3b41bc8dc9a8608906c3d34ea49f537b150ee67299a7b42e2d6f066b18d5502bc6165adc73aaa44da3bf16d82f083a1f18e8b64970c80dcac6ca03e30ee0769fbca3c29abb68d2164a1b09d536091f44aad67f40f202bd95f52d0ebe0eab40fe25689ff5cbbc6da9ee1afce7d06e0073e96642ff61d4f1cabd15896870a4054356b73c245f638158165879c90d41b1c30e6a60ca843aadb17ecedf184c7a07cdc1503c0758342d2d08763144ffb2f7f9ba3eb7b1e1eef2f06ecf5ab199ac06b062009703fa494d2295e0d6ed42a5b5d7b79a07490db691743b11418b4adde28ecb9f368293506c0bfab3b1f6be767ac7d1813dc4aecd512cceadbedf7acd321409eff13ede58dd85b4bbee12bbdfdcaeb509e5b0945a1cd1e57547186ab541664d5925ac676bcee7bc3403238f058d9cc5cf2de8255f4134e03fbc4cc05e12cca892413a101b3ba34ed726268727a322a087a46cdb654865b0c64ac11e9648e56450c5b855c6c3ae694fa75ae14370b2370a62a1dff230716dfcc8079ba0c468f42626cc7e02144e334825c79d7dafedd8826a7ba74a320f0e149f30aee5e1bcb6d52a932a93772da518909dd76749d94f3ac54f26fe39e38f8b219c201ed2c2613969dde70c6ebde2f0e3aec35fc9b71ab682a45601c7920b44a10c9523afd008849ce1973c539491de348bad6775fe98079180bb23be391e676ed421e645438532422bf2359a7564063f843afa224ea4cfa8395671bd386e20674a44f41259c02aa10554028d560f146281216f818ca6c8cccf998075c1b55278e24fb1b8719affdcffd25f5b9e802c43ef00fdd36a4506a72d0f9d0918c3dd35705a65ef93b69b6bce7535defc86122ad9fc81fe8db7ca6e27897f04bd923603e0c52ce2f399d8fe8c295892a53ab1baa407184cd4995a1a00fde350c110a4032b862c5ba8203fe5a1cf495877195c4fd2c7a3b96ad71a92370ef75b83331cd4b70295ff39dd257a8e0bf7cf32d08a6c19522291a5c66b3a2cadbee2e3f597ae9cbfbd9ec97a5804c13c210fd590ca8699d45d10b0aa58c4319bd2572c4e2f70555785b83d779009e243264a6c60f0cd329f68bba19b3c8d53cf1059404a978dc740948206b905990ba163993a8bb2718c3939206903e165a88cb57d88d64366207be9aded0a800d23b71bee733041f26ff1be2d88839f61610c3304dc1f71dfc364f77db9d12da4047ece4d503463641964e17b319fbec325987c9686eb31d4469137b7d13f78e3d40f7115ffeeef02172cf2034eca62bcb6761184d8c50b591195678998bc5b456473435cbc50c1d09245076efd008c3010d24e72196a263f8736255455cb7f5025605f8b376823939bf421e27cbc017f8c598260d9c407e2c469d088f7b425fc9ff3207b1692b627494af959cc7187c6901fd1b15c30d7b59af8c409466514f0a3050acf811d18dec2265e40c66403e31663576e2687db1d5b591185c2558956b8cf896083a7432d9c85e7150a222dd4f6aa7a525f7c8048d1d77f4bb3936b7daa0e5bcde0a0ed7fecc641c1ad75f8bdf991bf9b1b456a5a99f6b413766a79117998c37dff81e43b3dbfc329e78fc50f240772cf78ad21d101ae3fc3e4dba1c55604601b9fcd27604a0b9cc7e2d1951b6301eeb58e4ddc27309d6a6dc9f153e18fbc7d2d75aaeaa9f5745fe20dfb761a25f3e34bc5c85fd6407e4194dc5d6733c2432bfffb2dbfc5c0b722fe04dd31d232e5fbeb720f1e8b6ab6471daf3f0c9fbdc1c29db3234f890518cb06b4fff3c8c0ec841dbddb866e140662d39896b5135852e00f5764022734daeff0582ec1e7bdb60b9e5ad39417886c0a817c6ab2eca5ebcc7c477a2e480afe999de22b37316dabcae6fe4bb2907b8013ecf848db801df53a5ef3130345293cc0c40ede94dc5553a314cf863d5de369330706e65e45dfd6ad2e1d880f45b8e971a335ec9777979cb3857044a240a190eb3595c78e2ce80c81095bd2e88c432ea6cfb074f8cb2cac692b272c7b5fa5fb8d0cd6a6f65edba713e11df41ef78803f09f54263cfb77aeba48c7414bb77d1a07faae9014bd7a2b01130b652e9689f2b0b803b152e0b664e1c926be77d1227461125aee5ee8773ca448c78c620d33f6cc4de389180e48ee548a05836636a028d517c2fba661a2eb4d5e7b7cfe5dedec59ab33b08fd88a12b7ff1ddc2e6d7c6fb06c7394115819d6d430b5f6245890bb69b0a954ca58a5ad07099973042977ab821907f0a50447616271cc879cf70bc4ad13bad694deb52c7e0a11b9c1cae7776701b42a58152a0f16ac8292f4265e358aa5cda432dd236cf34c40a62467bff5b0002a60fea286b41c190d5e0ed15a6cac7180bec1359ebe8fb78cde3d7d77792f4979b5f1184b844f6b68b1a3521f09b1c9102f41046f2123eedf2be94678a085a3736e29c429d11c7a0431c15a9dbf67a9317f72a4f9bf4691c7682412a090ba91116539a46d85d021f599586675fbab9e77db20810590684a7047139f433a71384a8200c8b2823df5559c82f01e2884373dee7192747414866fccad9105ee114e28e478dcc4f8ea974017ddea413d71840eddfd090acbd7269e5aecfdda2abe21030edada580b13f3f7d86fea8ec160454454e51c9cd65cde014625bd84d77386d063c59a6f822d3625d4566feea401f5c5ccb64a613ee489fb2674a3187345ca0c11925bbae48052216869e460ec18fb65091eb0994bbad82a358aa38cfd52b7d3d6388eafd6025ac0e3416bcefe9b6935c681f57ea558f0118f9261ecf3f445e2cd0c56be0c7e48b980bf85425e87fe22a704f5c1ebeb586635704a82dffa314ddb1d6d29c07227416486284d42c42af53e3a7a2e38b4d5ff1433362b15f053b9b0ae37bc7e2e4f113debe4e3ed2333b32a58035001843ffd9dcc43f28228068695b53f1d9f9d850c72079ef0274f0d9cc4b2babd011fff8969c0718345b959483b2e6b1c4df8eb7e52daffc65aa6e3e80f4ed9fb2f135a1d51be649b6dca2766148d11a9f21fbfb3ab7f53f0e27b66a99d9a6ff4bb93cb10c4e88e8dae276a0bbc69d4e10b5641d313ed139f9970af8321d05405490eabe5cfb274f538d6e303149c7fe1689ceff8684dece109d9fa1f661cb2657f24e986fda21d03cacf710724bda32df8eb75bd051e23da6911c126919320185bed2c4e2064aed29c72256882699bc364cc79bce5d9d363988674e6bcc892a7b328c5c99f61093d3a6a30d74810480052501279917701109228e0cd6a199527859dc6b7a4a3f24c5190d39918436c7548e106060efbbb0085cbbd8654fdeadd1a48956bb3ae2c9f656534739b10e857d2758773e5a69c27575b7da0c759eb0d48654a5ab6721074548c3ff004268b391ddfd47cd6f7a1a981c9ebfde7bd7f5feeeb7be402009a1678bd5aa3cea753bbac6278e0eef1bc934fb796c2707239e300a9dfba9bbd6f790c02c50b2f2ec8cc3f24fa0af65cfd3aa4e7f169284554498af257b187f15d76a0f4f478318ca0b30a30522ab2a4211b5baa2f73d4f908a7b802f2b1585449c3afd97234d339a778fccb9bce13dce3bf859294e4434fa039101944347ce31e89c7ed5d1df41275afd29262cbe4ae5bac7148c70561b9757a3ee7afc97a768007406c6972506dc24b8f51032ad81e523f2091b1e9778354e4b8058cdeb737441b0ce6afdd7c77c415d9628ce9783403c2e284ac0a57049ef1c7045094cdf7cae2d78e57d873238e7e0ac1fb0ba24ed27c01dc0f7cf4feaf8e94d37189ef2ecdd86d5c3a1ca3cd4016be18c8cb11f4a859f95c21309587210910b1cc39f6674a47749c5f877ed575e326baf4c9f82af0e02f7d83bded2a5b81803b320ff02ffa119b89b160191f6714c1429e524a0ad0192e7d41843ebdaa51c0f03f9981163f3867527b737c998cbc0f4d648d3a6cdd531e3b916c626f03f8f453b534680cbda1929547d084041f83f08da9ce34c193a1caf3fb92b7e93807a721840f14c7486aa8aa5826b4697c44e75a873377280c45191febe323c45f23e62c665075d0e0dae94c4670086f43f81cf5db6c2c57c19df78032412754a93f819da9c84992edf3c0468dd18038a12e7e474eb98fdb6a59c332094e59c210a5a305dbd70481d5ca1f5028521b45db3e09bc829f5660ba595bf2993003ec83e29da9ed80997955a73d2b5e8472c7e9c29b3653b6e74ddc357ed6426fb8a147f9be09ee58666fc975ea32d5a6b4bcef19c13ca59ddbb746d905b7f0bca0bc992d34a047c4bba504499a65a46f3502d4df57a3e41402ffcb671b1ba6cd9c4454ef010580306da4e3daa2d4612233edbb56b190218d96a5371b974a4d734f62617afc70f014969d9d962ed0f74584cd7b847c6d732a580f7f30e16a5389ba59d4e8a7835a83b55b042077cb1e16b91dec0d64423476830c7ee487a5c0d8a2496b6e58c2789cb75968228e9ea106449b2237539d96a54c78fcd897e37c096f449d01ce0607e983e8027504fd1f745e12dcc61e7ef69ca004ab71ac474d9723ee856fb6bd436acbd31882afa386ecf14112c7fd9a3d92cd7be0c492cd7ddeab975355cae7d7432f09710e02af336c660048d08aba3fe8d85eae3bf3dc3d68efd76ea85ed2cedfc942b39d026091cc58f879a729c4dd6a07280091f80d80976966bd5a4c87b7260c2c34c7d65c442f1efbc6672e3c625257f581a435c8f901f8215281c20622aa29020e6c7214e5220439dd582a7071da0835d89598c6e9587cee4071f1577fa1454c001bf5081eafba184e59031cfe496e8bc06829905ecea5111e1389105b81b7b41ac1cfccabd607931c8cd59e79913805719dc31fe624d7eb2867b3d179cea8e2e7b3a39746fd65ce266d226f49390ef6479984c73f6481ec5140220fd2c13e6fae9b54773f15b01298ac4b1175cc24c850ad9aaa07b6a7b7f0ced4e9b9ac0d6219daa2d5b4615d142dedf13c1d4525be3efb1b3b049cd8081585bfd2e4627cc5476503c348d0b44a06ec44d5533669d8929d90aabfc8d503479161cd20bc805edb2ec400227c91fb2d5c20d00462c8eee81fc71a11cff26b4fe9b56a7d3679006cb83af625246f442f31ff4541a05bc2d2e66a7cf6a598eb6defcc3180bd5481be42c732f68163a327002b823d719964d5e9265ab4b7105b2e0ad0073d5c8881581fc3b0bbcb23f8d49de348b5d4c38a8f71d44d2272c91ed3c6e05d21fd0ba48efd5435e6e534ae06a4c73e0bef41b7b6431f3eb48aec5cf483f9844d8a53a39bdee255968434ae42d4c3888fb268ff432121643dc22b2af2bd5c283b8132befe03a1dbe4eee0bf3543d826c4f01c911f6be112b7f8f5467d5f4a97a86a1416a3afb01db018eaea013b8ebf9c67b8e7e3ff5396c16e38a450f3c437fced4ea7cadafb532c8259e841955a31c7fd624b3b42879f3e21ab941d4d886d51cc5bfc89434d5e5a4c68cafbf1547e3abad92b2a8f6b1d1ae1e785e0d71a9e4a59bf4899acc16128bb8800f64890b4c01801b9433f5acb02b6898b65755d4e2276af7a05945903482101d47efc4abef3220679d36cfc37caa1d3f19cb40b549912a1ae0a1078ce3d4bd34d3461a00e8e10d7707f83e0357f1ad77d4b6208c17994803f0286793abd031496c3ebdc86d6f4f7d5ac5d63e04eb81df557e2456e814b4fb2c26fe1299626b6acb9a370c31b6449cfae2a8b1820ea2ab5a37dab022d0db155746c351d24275b8e310b0081081051763a08f19932f36d3f53c730ccd4cf56192ab4db6a8f41d24f944d58ddc863a0575845300bb6891ff075b60818fdc1b81ada6b31396843ba7475c8235f229fe113ad4e4ec81c66184953c1ddca38ade9407a0cb523f7316c470613e7d7fbbbc2f970475c62861837c104ba4a5e471ab55c64367db9a02e77390a3b3f345a3de0ad33ee813e3241ec99cc4d30f10471b4b07a34f6c6ea3ebd1e9333371e4dda1d1a33fb08addec2ccb5941c1958a553b80a8b92c55b14c4c06336bb7577d2fd15f7e3f43f47ad149d5885bef80bf2389b19beab278b91acc55c6054f9eb6fbe4d184a878a7b40c5eca14dff1084e776f86025219c6ae7b37cd7909d43d3730bc1e05622d6acb3cc78d0b3057a9cac5dfd01f57c5d310492b6c25ea76162d82e418dbdb73c734f6179deff6a86cbe9990b9683eba462e3c479f6f624c42b7300a0f8056dee5c9c8905d070b9d6a73701ec86cf28fa1e063cdac46be8f033921efef453a924352e73ef9117073c4e4acde4b733684618ff24195e046527084412e028653330921948d9a586ba954691d8bcb234b9d23a79ad8daf0335e904a2dac6f1520e5222df2ebf6716a7dbd34f221534c6eb659ebe19b2235f488624fb9c946fbfc90cd64090d08d9a99ba9ae161968c85bf4de3fefbfc136ddb960db956533643dd786e1ec270e553c78b427f31dc22c70f5b057a7cb05f1204886bd5e70d07deb52add219d73c58968397b3ac5f75ce841c2e28a11c6b78db4b2d668f106c44606233a55e3dbc40ba6cb420e455223d5026661907e396bf8a55345cd84ebe06e7fbaa149be4ca3414cb80c90d2bae4330e383b43d9c2bd47d1e949103b180c2133555e3867c1febf20967dc38412a605cbbf00ba899105c18a44354ae8e014c429d5718c39824581261905d8cce15d8558c462cb10fd276c564cacd44c94527954c0fc03c295a9f919b0e400e964441d7a798a59b4ae67c8cf3eb65e1aafbf1b99973117f9fe2c0963ca3ef1eefca9e38fbd71e16b66b25ccab2e69b5945ad9cd217f3f3e076a26b96fda5c575bd4ef0c2d7c0cc898f4e0b9b4484aa6e1661e5215af40e858b1ba413da027b31e86d823e2d16276c74d2f4c118492b56bb9725796b0cf7a6da47ca51c61a063cc00e101ef06e12aedee179b9e7f405f2a9bb407e5a5e08aa75afd4d2cc2da745e87d5d50655e0dd6b7826e094985805af4bbc3e1d68a726543b1aaeaf6e44aa7d8621223848053edba4fb0f363dfce42f44f9703c62980faee43aa85463acc8c5a230b1e0ed9c127e67a7678255edee3c9d9201262984a6551ad21a2895a5e002a52d5de1bb330754a7b66ff10d0da9967df9c44d5cdec2d260ae8e4d23cca6ab990d39ddfd88843f0faacaf86d84931ee45d4418d26ad37091a4d67d923dae6632fe48e3f1e96f99928dce1a646ab65c809296d11a59e4023b447220f54cb4a806b10e300da72f75d1e9c9017462ca14da0f89d6d5365ed8f8141ddf8ba691db83a0ebe3f98bf7bb40315bdc68576d77279cca314321e4925009de93ac863d731d2c1cd7d6c15f70c87da48336f2cf4c4bde3494a39f28fdeb686b5362010ae90f37696f84eb5529e70a260b2288208498f03d782ead02ee75e521c15daa443c8acf1e105e80d52d39ea578a8318eaac6ab66070d23717639339ce6aee58a22004d23e0fc5d2a2eb76bad6a6d1a211586027f27bc98e9fe6ea924b10033e377f4010442dc6024211f075012df1deff01ba4f1cca335969e084da653a867c089d6bd5f18ca961d0978c22cea228198a9aaef2e6a615891137572f622568f1d9516b4491f24b61c47f048cf0ce80e0017ba1a2f0af40695d74d5040a8f11f2ac46e8dbfc4ed0d2837b5311feed0d01e78dc3d3ccfc98d523d4fb0fbaf50dc83ea72805ab7b83cdde3c030db8bf7b5e68541e4f496b8f7044f7a2ddab01ad789efb0ac17a2aa789a089e84fd59d1fb0ebcab16477b160ff035bb824fb0aa8c8e87a60e6526be53ad91bdddc7c98d67c45f8601ad449e41acf935e23e70bf05b409a5897d84f912af99ad2f8a1b52546cccb2f44d9cadf192b1ab791981c548b1c87d47ed76d3bd492c1dec5c813fb0725bd70b2cded3cdb6e6468a0ef448ec1add1e4624e2060bc3a744ab65603170bf3748008f0e57c96820230d03d2a21008132242000294346aa6ceec78712d7a4613723e9b21c358e92376acda8fe469fc457cfcf9d12bf0d666269a628c93db4edae9369d64df35271dbedc95232e7d7b88593750009bc8e3fbc73ddfdb9ab7cfd54f2c533209c9663dfddad1399718b62a4e1a9ae3700b6bb2b7fb141ac3917e76f43e15b38345fa9213232d30d2ed19a90c0017ce88e647c23158a0dae8fb34b2bbec3e41024c45643dd9acc7505f1588497438563b057538ac8a073e4900376c0622f9446a4019805d80581653b36ee34b2b1755a88c8d2bcd19f4d4338b8723ac02d3d81a660cc1e0746b871c359abb74a30085ba09118ca809cd93dae75095bda4a1edc7410bde453cb94ef7bfb84ae049f55ea69bc31f5b6d7317adf73e7f61afb0a3b762f7c603b90b6bac2f1d0af77c359079f13609328dedafebd1514ab891de88f309614f96f0b890ee91c7a6be278da7413e7ccb5af5cd8dc6866f452ec8251560705da1112f6b93a9501aecc2a1f918f65f631a6406784912f5244fe680042d207944d87207405ca3864a6ae56cdae0b51220b16af30d905f11d790095a3ce5e7283ec0f7a96050d95cff900100e15d160d363990217e1c012321126169613b1eef2f3343d0a660f0c62b2ed74d0b3be62aba6d502f9331109318001b2482c303adfab2d4742bdeff02595c10190bd03ba36f11e5214deb9441a92e272cd0c4e448a94bad776d25b6c9f414829b0da6701b0a2db41d3a55b24706506da6352d065b4a52b3b55f68dfba604772aa56e9b1a655523b58969329b240b6f93b4bbe4f112ce01e5b6c835ae6f8ef0643ee7b062a414794c9e13a4ecf57c4cad640a4194dddda450b90d1ea6163cc66eee84f70ff6319d49b3175a7df424608e29b8bc0946abc6f80519060a35bdfbfc24e12a997de674c047f90c8522ddd110c4011328db48e22b4d061ab50576251e3af588e730d179f8f34031bee749f148b6beb33788290d0b7d36a93563f13fa4dfea5c197a1e6742f036064a8d66ed51484259aa20ce06b4bc3740bc419fd192e066005d1475dac20dcab72c72d6dd1f8d35bd43ffeb213a2bb002f920f05a003eebb57d57c7722eabd5bf08d316ac1852c62d828a990d88ed2d1e9725d088c78e1d29c3ef3a673f6c9cd662cf923c486ddbb545b2f04565614a811534d1930197113ef1878ed5393d38798be56181090bb2ae7e602c97e3390f50071a432852e89c45e5e4d1ad2954b0829041f3e3d5624cc8f2cb79ed849aaa2190993e86e2df9b01e914ea02bf6e445da4b33b07b876e8e8447dd66e04fa3f857e5aa62e14767bf15785340e03f6932ea0423c6de11ba483ba3ac3c5448642dca1259000044b494f91e526b1f6580c30ec829d66093f7d6edab6ac35da51d90efe28aaeda28bc3a24771c795b9e6c7f8aa469d828cd3667b4e20d31e7040d84830777927fe6606e92d2e82f55a641b8bbb4a5cb2d30cc259a8180d435d27fafa087429806fc181c1b580cc6a5265b4c24063ec033bde883165dd940cb98e9352b567b48667d2fe0ad3bf1f06ac9ce21ecaed45468051c9e68649b98b184ad105d9d9ad1b9988c8336895575ce91d6dac8fe144615490da0a27845114415666bf6ee9d6c9130c7703dfe3efed16eb51cc41834619a3ae4d4cc99b6c39f06a885b47e84923a62d29aa8ec0a8610588954b13d0e91c2a108f5f0d2fd4f5c3164ac93b591a4f88552bbb71eb524e4d6cb0b32e339d7660db92d82fb6ee3e49d2206b4f06a047a8133b20ca08eab8df71bf95f6829d4b14a5cff3f266a024fc191ef0a0beb5af1f60c48eb9f51f131f359108431d0882cefd503b53ca7e2f64062dc2d847e4ee9712880ad278d722de22f52cccdc917c083ff10af98fc25e990ede1441caabeb0430538e949726ce60ccb6236d3b2204a1f141750d3b7f1a63dd3c03d70655bf714533c79e8f3c86acf66fe765b17ba34bd6dd7e43fa9ed13ba62f75d1c60edaf59c16532450a3bf7630e77843bc4467cf98add38ed5045413a666a476662b0b1b8e880405cf133b08d57d46000af3e3855692d311ac185fc3c9eace1f10876b9f3d953b5ba320120003c7150aea8c44673b2803eae240be108e71d7199e41158ebf2d33494eb8c98efd69ea0e2dadcab55a89bb0ae1ef9f301a86b4fb10257d0230d7478de2c7eac62bdfa221feed4fd7805eb0ab5e935c9629dbaf76fba3ae83df22f3ac7ac7d40fcdb5495269d6681c5abe0f5cabe9b86c6e757b5ba4e05a533c0abd3715097887d2e54a572b238b910db716ce93471cd0f04ab4f2d6eb49930b6726363c8ab005c54b817b7c08d6464c28ba6a9617f804fd2aef45d8ec7890afb84d613f6a14fed287631915b4bf61654676d35c9c9885dc104e910ebad57989880dcf343e96b4fa1df847207138067ce7d251467b71eb4ca8ac6aade200cd6034d889b3356043d05b8898d14b24de0953ee3055dda9fef0a48c27bc4d562e87d8e7410faa3f355aa3452671af12167d98af205a2fb11e9b550e30582b8d874b30e5c908835f309b547e61876ca8c6817f43e2aabea6db3addc2d67bbfb0ea004499006646cba22da5ed0cc4cb004885ea6986c68aabf54e7c4a7eda9747a99db10c60d097a12e5d250f0fe24f8dfffed7bef906c0a8c46fcdb6166be859a64ba643c4efd0ae3b270b9c848979216af49f39b9a65b03c97876690e57cdfd9ca129619be6cc020084e1531ae654decaa91dccea4d7a296b729fc4cca23977d0cfcc5c144cc80802bd19cee9e8bc1a645684bda37c4e8e208e578113041a6b10270ff56967feb0c89135828d0cb44167273576c2a765ee115ec0759be8e4fe238a4cfcc534cde848f5871a87e9b374d41c26fa7fa2b35036849673a05488acec683cc4b9ab90521527a95d50685e3aa3dcc4e84d128061d0c49282339c2ce528547004d22b2684a5061f45fb18b2d0c5a33b01e09aa51bfd1636e17d779a5eed37961e3cf3eefae1dd3c5056065091e3c165a2089e9e10f1fd2a95bf8948a41ebac1c419f894702994d8762e07c2b16fa2b6cfa01b434c64286ae1f7d2285f2f88aac8edfbd69261641d7d883dd5914860520d8f33763658f44853633dbc48acee2fc9d75ad8a57bed40c6321772741606c84cfc76883702607d3f0986e799280142014b146dccf44151146b1e9c0466fa1a1730d6c3aada2ae981395196f2f0c654f7732e5b4b9e2cea8bead039a4258128543c2a21e26b6707c42255003e3881207f251b13e93da01346a0c29ca0151e0ef67aeaf329ee3589534b496700a9f6e305bf7c949d3d46a78049165f9af53e37e4f4ba615c3c7fc0ce78ecdd379a25ea40a4381e549d4670f42ea1da0232843e1f58d2a2487cb37df714d001d4ecf1b7c7113766475a16c6bf3e64e1a9ea0d9ae7b127f43484d377b52a8018ab7915d8c72116b15d733ca5cf58d33f62042cfc4955835a0e0c5f971801f79416eb6b4297778310e68f78765b795cea4d4e6ce4866600a9f24f8408eacc5ee474f62be1172842900e9d3488bc62de8a9f8e366aaf5fef6e759df2d4225e67832faef5f9c7c2622c57aca406554b0fdb83ff190697dc7da459f66c56350249fe07af4419dc035e30146052106f7f8decd46cacfc4abef3b9600a8067cb1089d17af92157b0778ea83d550d18786e73774a4378cea16acee28fe22eb04e5d31298f2252a1bcb7bcd01cde2b355894efd6a9dfe8ec5c05da30b209b6fb261a3d1a63d4e4127400471ba8d83b6451fb84834c37fd6dca0114cc4037ba8f81e829132c5e006db88f60f12ae4602502395c299b91bb0297fead99610dbb39e0e4edaae966002957443dcc89a1bc1c1ff3f740f14243593bd707aa3843c53e108d6289189aec4724a1c8c631ec6acd50fc0c6f52352c35f1f106c58756f831bd11371f9416c49b7dd278dd8ac4d79b0dbb1a5ac1f712432e3de0f32493877c0b0a98ccf1e77168057737a8f4e15054094e380059a1c9c97a63bc44df825059a97e22bf6ee5d7b472714738f3e6b7ae196a12fe1ee932148d78a8c09ffecf27b50cb5849779497dc04819a40aab94a1c6274c05c23f54f9a2060e2bdda4657a033dd72e8f3e100955ab1c886c962b2a38d19730b0700e0f943550e3ad693445e042d33e1667050fa99f6e66c04499365d895030ed4b6976edcbb144030e97a5f46f33f7c5b1a86cdd1dc71cf06e711179e5fc992d7415ac954086e7943a7a95754ab74ab64d8ce012a1f894599205685fddf029b5793b1a69bf2a98dc66ed0223263cd4df6fb71ae30b1791ba0b5af77e3b1bc13f2000dcc022f4d76ceac868d5b337c535efee6103b79f9c37fb70d3ef04eab9afd56571a5f6a59add0e626f7b14376aaeb40b212f1b8b09e5f8e99861a1f69a7a80bdc262608415597a8801bae0fa1ab3d80b4386a56ff5b03a90ef8d993f9839ec48ef9c2860a227f32420ff5d05c7a53ceea6d24b7b1ce68794e66db4ee9ceee68e8f5c36709f1eef761c5c15d4a767e5d75baf921f70fb2743d50fd49a88ea5c2ee17dcbc358ca335235513458066723299cb82c4f80b0e143e53a5f32c405f42a968a5348c89deda1ad27beae3112c99517d1526858da8460ea06b412ecbd4c11989ec04601021b8afadb0ff06f737381667088b09ff01115808d23091afef3d3c9afe76a08b8eac8c3fb836bc3a5f0df7f4fe152a969e6c3dd520cd8f4fb816eb9a34181382f8ff0d5699708613f116fb21c4d0fa19798d51869fe1e63d205449ee97703615a7d7b336452cc5aebedafcfe2fd5879caaf87c42ee736605ccd6fd8ded96307aa95e67d1e37d98ecd4488672e1cec854268b816a530fa55291eea7c63130f0944fc3b9a25329245d8b5fd0da452f53fce45bfa62f2d0cd642b1a13f4d1e0b7146bc262fa4bf9b144dd1776199b83341c6deecca186ff6b645d40f622dcb443bb9d4a5258c3fc76bb9784d2ad4b463f2307941009ba854552d6d88a4e27abfbcebba8b5377f6f9f7e3d7f800978e53930498b3ebd7c0d1f927b41bd9a28cd6cc2ced660bf9e02c207c02bcb89c26d0c06eb5b26412623d1232e577ce66e068b9b77c446783edd8ae314341c8ba66e7122592813b2e0332c12c48a1125c00c5808f794f87497c762686137c7ed6206d7ac3f71585f0bfa19951a005a04b0deb95d17098829bc56583168ce5896d2da47d5c2a78468eee1ab4c287ab550959c0afd689b4292e8323d54e98e02fe01d8ed8656e1162aee56c5c9a48e0a0f57dfcd64f0802ee4cedfcdd2df4489fbc1cf145a060de2111118ab3066636aa4cf6bf92a3596c2fb853c0812ed43c6f8babda3431b7af0462d87205bc31c4658f25403e540c658599cc0c019803b2007ac7ab59381c938d411d0772de08d2527444bd23762ded5b3f919b5b72f0109230e232a7905e38cf253153e5efecd217fc112d7999b432b378ba13ea5488285aa1d563033a09ef09cc11691faf733d1457fbc1efaf4d62ebfbd103a205fa805b9b435e87070de9479420f082a804c9bb0f609d8b49d2eb1fb222d1b6f49f8359195a9d8a5ca91518ac3b987ac4565d2fa6d265065b3b72f6d99129518928a30ab327e747105ea8ee3118d1df78221cf650206da1b1638e729495503b9649f5429043694c12cdc7780c2a8ae285b0a0e6c43ed1207e5363f0c6137afdd5bd93a2e67b520f56c9994a221e66855a436e88db043dad92618d01c239b95f409ffe71d0183bfab0c935b31ca56726b7c6f4aa91b256026f0a606fc9d925f575d00a2683104ab6dd3c9f2979b4837885561bb029d5824131bcf5d7ea3b39e69ea5992d37eb29e22ccb19a92513685f312d3393dba7222742f831d564f6a6ef6d14dd3bafef22330423026f18d7cc6ccf0227726c8640fc5b3cee3b9e05a3bc1539025686f49e3d8107eed3220aeb712703d9d2fbb24e06b0abb829262ae32bfe3ad70cf5a69e0f73f6a60232044efb61a1f8a23bd566c4378198313898ced634258f9a658d68fc86a124877ae1892e3761a820144e51cf8dd69b72872caa0f1c5b897b0d8d99e3f4d7fe201b053ce7e3f064b8df01db34624cf74a8dcc990f745d145f8fc7b0c350319b6722b8ca6fa09a4b5440679a2e41b616684126d3cc52678950749dd861134d634c0ecb36da01430147c3598a8dca53cd1d66efdb82e6c499a26e3828495a0f4b35e22490fb36f348c85bb7e2ac21381b988eb5007288c1170fb1419385dc655f2f8b1521003aae4066b94a967bdfc4a4e61f622a206ecd1c942c1fc5144515bcf88544ab45acc107a8d905841396e8fe798ac4b6881a0ff500b6380591d32804bcb21842d7d01409c945c13fbce8e6cd59f7d6eeebe0075a5084ed260e6ff70a99ffb16f2243724b954e8555b819a0cdc99c21dba944f4f04e049c980399655c17135288a6069c4b07f493fca7278662cef76ec4682e309fbd9fe991a5e51d44fde60ad67ce85b0383867fa667992ebb00f9274f30fc266d36e3bf98a94ca93bcff5a3995f66d1f75376af0c96c2db91f0d5f64f97f07a75ad4e3322793647f8ff8b93ea3528cfb97d434736474dd301d986504616cad955f3dd008dfbe901549584faf37d46429538993896c08563559adb7e3f6c6af2aa9ee890fa427b6ec79a5d63d0132284210692f60e3b3727c5636bbb35e18bcd6399e865ce397e522cc8e8fbc166fd1558121ac1e665a9f7cdc9f2f324b614ebb9cc2c62da88e0dc74a317f5753f3017ae241e1bf9852344a2f90a033f78d7da97df58566d9fc6830cec340ffbeaeac7231b7e7d0f4c7566a64755192a9ae50de61017c2bdc0320a9d8e231f8a4b7b61e160dc8d21807ae864688e248a66c7ac6443f207194e4044aa31325362c533fdcf006a663e6a27408100ba8bc1a367e67ad5349207f60e3f7955177802c8e139488018b80eff239de565839af3a56c5e4b7caa790223eec2a1ebfdf1f1e329a1ca66da529ce3940e0a32fe4fe6296e814a2d3997f1f3a4cd175c44e5a473276393dbfed4061d59075692d7715480deb942b87498212a5605c2795923b596d6bc45838238c68fc82da07af26b85394e0c0b410681dc500bc6e60a682ca8c508d139c2f3758b12bd1f0163ca631df6aeac400035922b0777a83d45673e03539381401f6db26487e0d047c306a8b2d037a954ffc2f3fc205718466e598ba1683607707cb5e04c93c46467835ac20c9775dabd192dccd0051ed342095fe0600a077358de7a722186615581f730e3d3323d418b57a22b5729843c641910bc451f88b4c774041a66e46750e4df0ac9900bf26cd3533e2cfd4587f8a2a5d455ec0b2b8b4970ed9c43fb617551c5216f5b5899017c1305b9325e15d5ef45e18f3fc18192754586893b8ceacf3fdfc49761a7f8b1b49622a2fab9bbc5af2b63c6abbf8edbc294c013fe4c0ef36fe7e3009350860dae03cc19933d3a1a5030a750a31c195df33aa09103429b3d639d48a1e90f3ece6e914a05e13314fdd21e976b539783fd333f74cf89178de016172a605e984629976355d1dc1a20f77f7b7ab8a20240beff483a63214a1e1e98f4ca19dbbb0b591f3322030c1ad425da2b84e41a1963e3d59ed67abef364dd34b97b7c8cdba3d1b5bb8809e5432607be9858cc5000f37411871b44d86100535054155771f8603fe93ad713432f791a51278f4f7cabe925544d03f63dd7faa63257850debe1d06a265231e7f163e35f7f1619022de86720f55e564d2c513a806d2ed035d029c4fcfa4cb09bc24eed5dcee3206406986bac74d77c5a6105798f74fb26796672a4eba607ac8a483ec6e000815baa523d0432220110f330c4b6cf1854ba3af63e346310014f365ae11b49c6683a4575d062454a09650b27924eef23d9a83ae0933834af5fb37dc094a87d0481e78e48b057fc0fee4a171c70975d0c8d231427ff7d4ec3d57b2f7bfac9a84bd678a459eba0f0e5a7a6831d3c2103b8880c78168163e9bd285e3d01042eaf20c1f12ec8245df1f2d1163546e6dcecb26677c071056050a13fce24b65957a26f62d911509c2037ecde39a661db4418c4e1848524220755ace87196e831a0b9eef3790f4421f4d389761ac67e94626702a9ac9c815f00420ef1c41c1d9766effd8d263358ac450626bde404bf2a25df83f615fad8e5ebf0152b4d77a7d72ea0ec9f1dbcd7e4b035389325d5735f997819e7e38bfbd7d5bf8c165b21b7e48c5b567b6a1933137b0d6f2bba032382767a44047ea0d57d51f3cb93e65fae1582f915b35dc4e16c4d36b5da8af2d8ec13014ef2da28a2b044afddff6d958d96c61fb49f848b61ff2d207c650c171f85405b80f22060f0940301cb77801a35fb26c389afb42cb22b081a6ee48a6bc1ce94dc44ab30cdf64871b23f0e91048bfb195467454cbf25acee40d31bbe291ced925b0b5e046b89abb2d65c3dacd5aa80b5fe6ab7d6050f89d728aff7c355059f24d662850ec52a6ca389d935b8de2ef5760a92cb6712cc82f2eef9beacb86f03095df087f6ba941dfa39eaeb04314a80ca44a528c31ab6434fb7db4885aa9bc767863adf60ba5b994568310a9ea94af8b7317c7ebebece7e83ee6bd408320160b05093e74e6393ca30a315f7ed1f10b7ef8fbfcbc223a0995ea0f99437c8c666ffa2d4d8296233da017d9c41e3fde467acedfb286a5e662da1f26d0e049fad95ade3af2597779f6c6105241c503e3074e314c5c73b8a8b5c1478b9d8202536cd7896d860737c7ed6514cebeba912e50eb92f935ec4ae5721008177f1bb672abba05203549270c3b50221c04fb4fcd95d697e29ede07050bd416fb6c18b9991fab95a304c356bd627c5f6e75587b3e102ceacb8756b9000a5f2ac07659faf0aa8b8e4a850f42de3e6cb23232516a55e02e09e23cdc33394daf4b1773f908bc7415edc046ad4e99e5c5aec0fe416a63c7c14aaaf9e70b20fb9affc3a7b01c883e4be24fbd1f3ec7721fa4ab5989eb0a81c373db88a416ff6c44de8a345c9308bd96f46566ea24d39b9d966862df196bd207f1db920e625a8e1708960374e0ddc8ada576a1a58e21bd464a5557294813bf05320883e25dd470972061622951312ca0dcecc259ab1f255de1a36309435ffd9bd8c0f6bc96495b2767e394397bdf41e3bb9b65813295d73bc6c6e064f62407b6626d2f5d7a06d4b4853a85b22ed78951597467b14f3dec9a366cd1f2652a816933ff5135de9e1b1bd776000a4c5c065c919e69f8a1451578e2597f9d31de9d5c28b59a67aa5c7b9f787b14a83e56e6502086fcfc7e030baaeeaf77e385130fba36471260627dfec7acb7efd493c244218586e8a02a70419281e3e66c640abe33e70de9a02f70d93e564092c3b8c5c5ccc08b369ff84ba012c1324c7d4defd372fd67bf22101bee4b44e2b1a34384855dbf78b7cafb84d6737c16b30c5c3a8e413569a9808eec8f21bb02b3b29c206e4d40b7dff778e1f4e3dec07e55a2d490b75f3aefc158509621167867b5e8c82588fd77ab96486276386c79f9c20b534de85e7dc791eef284f4e68a6bf0c2ac6b60cfbe5dfe04fc1f11924270c9e30d46d42b519e005fd6524b305acc5c71a173cb33c0a00b2e51d31cb0eca2d8e57a151ca08cdb86a0c835247db38d65fe6e644dfbb2bbaaba8c1a60bd7fd54f954565445283ef880e3b89a56c286493238499c4f06f1e6a80822f60a1ee62123d57b460d5d051aaf43b0d7fa6201edfb6b3d8418b223453e751d189ebf3ab2e30537f905b38ee8888da084354369d229129d353261f88924638f4a38c4b0deaeea41dae793a90ff7a13d9ef412b385a0239539ea8f0b717d0f61129dbd1c33575734820b02f91008b1731088c0d26e0a380a5d62de4d88239ed324c186d6d8cc74bf1a99044d1908da73848d06519790328775977bb20f2bf3c65dc922731c159f9fd0537a4d0e64c5095649536e31210fb59214819ea1f019ae526d6c0ac96b3d8b393df3dac1039aebbc23a982c2760acec46c39b044b34fc56cdfeccb1aad71f670a00dc4aeefb8be7357f4fe4d39775192b0efcc916baa32e2e869b26f048d0fc1e2eef9450165a6c75cc47f432160aa91ba28629f6687050a95b04a0ce80309899d45f07064ee385289ac6c1f93946dc559554af0ff3794d3ffc093ad475c68aae8e0a81cca109418bd9b3f931a1c5629e9fced89ecc82a181160ac752f52be2bb26a7511fbc3a6713e5e09537a90541fa7990966fab30366074ad5f2626c3e23fa3991c1814d22d3f08bc86ede4ee3407dc4f8b49e4341c2d576b3b0a22e5be4d39f576636db5e135dcd2e0a76aafea76da7fbcb5a92903474f2283f71b6690a8ac1532caba5910debd352c53c770990bfa9e34f5f8aa2a7d03062ab3b3acbc22871ed761966d6b37a2986198b144f529bdd92aab62eb5a61115a54f9d319369f2aa9ab368e03abcd7dad309022adbf37bd3cf929edb0f6b5ece56b348937ecc82eb885ee18076131ed7342d335b34a11301577decce110f6616c318caf04df7d0705588db9df94770ac72da2a103fb7078f8131b022d72afcb60bc4e6e9d02b6a1876cac46ff4f740dc7bc36619d5d7886533f183a1f3778ca346a9ede306dc8eaccc59d0b3957bce032ef25a25d248f9bfe67ac62263a3600762bac95598a9ad94ad4eabcfb7e4e6b8c5e586355dba032bd82ad77b37759d64a2df9eed09f72f743c33c9b747b95360e6d0af2d532d00bd95bde24d825c0726250762bbcc9199e85b818c9a596b76c8616597bc7de015215dac5d75cbf42ca1951bc015725e22e7a9b4731d027fddf8f43f62567e60fb94b83903d82ff2ada8287bb62c44cf8058d29ac1edac4edc80abddbd79d8f95ee7344a79fe5e21ec0fa0972ccff7bfe15b212a83633e47b248ab0b5a7d58a58ed85bb168a8a608e1a2eab5c31aaa707b0ed0e46e98cded76b0a6ad9b3870c5338a26c28a0dc2ecb0050a79dfcd8e5bf9a0b4c4dd3416fd8224ba0698eb50ab228a6ae5154d44067755055746ef885825d18bfab1667f6919db8a8c1f9fd7cc2114d2852b859526269b37ae347fd680a7340843b81a913a4268253cf52034dadd3f19d86bdb517a34aea43788895e8de5424047e3ca1dfbcae8e609db430648235718d724d3ced9b44d46d295744ccae15e55985ec04a8d6dc78cd9bdd6ca0a464e799faf4a005d064bdb8de22a707f5fb8f2e811109728e5f5e9cfb532b5bb1c42c4965a18bbef7e310a366295451bbed300b3b05cc46352e3e0459af6419ce037c15bc9e5042310f34af3c666e50194e8463536eecda4bdac4254d78ac2dfccac1755366f5eae4f4ed6b9a3602286f0e5f1290b646094322c9b4c6e349637219d047a6dcc0ac962a8231889435018f593d8487623f5c2cd0746883917e628c95dd74d2b6a030ea26e98b21cf6c2e81b35a1510720116b979a13f4a0b46a21a123bb1c3d545a90bfe074eafd2c3c8cba1a7ed9e561ff12e4c90cb38dd3466aeef1843a579073bb0ef32f590a26d168fa6434cd489758511915ac74c40af494630fc11aeafd0d7e549c663f88f9c159a3d440ea83f4f6b034404ad87e2510e7496d4f6f1e6b6cd8f604e8a2844cacdd5b09591032b6436cfb3aeaf62b968d9d7b68a6be4071b2c9b7bd7a01a9ca0239ca1a391823f5c2f487d420cdbbe72ae73e44458d55a0084bcfb7a217eb497c7062c5a749af029d730a2c1bddf601faa0dc3c27a2e3fd1c900f7a7b2adfc86dbd9d40c08e5f2938c6d9980527487736fc9b0d591f239a22660d05f759511e3269985b8c373f5182fef04f2a0e68d75a3f83ab33f3f2cbe4a0b8b918f666316606a276e43d86a6fb214362b94b93a0e80cbb8f24b62beea0ff341c97bbbda588ef8ecb862a2e72e046bd0b2a435c43e44af8e4bfd2cd1e4f0f181a44b09b0a03af9d8441bacc2436adde585fae83a95cf360594a58a59b2d55e6ec944a95481318527ce25e2067e4d2ad127c12d0abeb386bf2f45a53f02cca91d80e738f9e441b293ad36a06f649eb83b314a705c2cfd77ac567c535855bd1adc29b8eddfdf0cbe4b5d1dc6773b274a246c0d91522f82c5bd59dc934c3ca681ada78ddeea1372913d5e000d043b5d31929980df4b427a5ae4cf34c1974fda279153fc9957d6a263c1e04d692cbc4008974f4679547283a5f9cbc9cb3ced86cb7fb9dad5249a17c1c4c326aaee4400acfeca479c604f43bc32e162041f155f1655dfec3752ebe401ba4d70b8191ef01da8f6a50d392d7d3b2a1db0996b829a100c999d714bc053e38d71b237d27830f2b4f1b308a4e0d7f74f534f0d2b177b032c22425879f4dc92d3f4cfe6b293e4f0caa17dcd41958b5591c851d132550e0171ee4dfde4b20df7719b510e7c17bb85151660715dc19e9ef1749251c3d39156bc8c382af62d526005d6f5cde903a6c0a912b232c6690028090b890c10222f35c091d4921b5c649ff6058b85dc2781e912cabd04522615bba96bd7ae65ba30ae1f0e4e558fee30911fe3e81b708533f6d6fe79d021054236e41f1ad3880f5887d08234e73b57ac85a4ba155141fb1968e83b59cbb7a1d4c6030c1242b38d93ba71879aad5072bc6926a2b373f14eafe8f39b840126b2945d324601d9b453ef499beab30e07d15df340ca587fbd44f826af7b36c9544aff3d710906ad898cff9865e90fd094d766b4ce24be157e6042b8a9c415148c3fcc56384974ba4318c1103742d3faf49e4c818a5f082fbba7ad88856e72eb40bca4e40d895a4ff3848c6db3b54d21cc4fe623136c50ad3b238889170ff6dab32d43ec81cbbe71bcd40b3a878a520cfdf9cdd5f78d5f947b02687832cf10af55b50312cae3ec49c4dbbc3dcd13c53d3ddf165fdf4688a76c8312d902ddd99fd83a5d3636148a5f6c9d1d0d11abe5df93feff72111778c00afc08877106d6ff4382179ffa4414166fe704df70afe239277074b7aff63d7f94919c0a78601bc4b78755f4bf80d4003daed099844445c04988e94076579ef4c543219c528cfef166f7bf167a0c6f64c16589c3170072f53ec6a9f76a24e8418850e0161a9c06ae4517125aab4ef8173e99f04bf89e47ea782350122430b1f338cc312aee90568565e8d9f3620577b042a55ab16da258966ade93d9c9849fc4dd53b3fedc0555ddf7913b574264b08b164f4c8d3ca2b1ff5c71c3f7843cc100c709e6bb01a05972bda9f7b6745649f5e5c9f5842101e1ffd3498dd1803c1427260ec99eb002a3970a81bf3b155a969de3901a569a775d53cd0ea42bf55fa7264fabfa08dba46920a4aa3544e51d2f87f4628a3f607729a9e22bad0442a0c481ffe82f9ec5fdf763fe715cdaf5bd94e4f53901defe3fc8ce4b6ac955aa0985503cb8f55a213702ba0f9a85308f4e2118085f8e4c51b8c9523b319126275e7d61c0da9e416236ad0e227ceb420105129380e51ec3bd1c4f7609374ae5cf1201e03293d1b5fe829357add367907f1eee4c0cb5240c83256089e0cfcf0b8ac25d14fd7bbf7b633bfff6ab01d45a8ce488c8e65860e3846b6211f0064a35e9e3efd9a2610e6174d624028ebe9456ff2c2d22427d6a4a2b01b7b84afb424507281289f4f25ff89bba4dfd924666dfcbb38776dcdfebd74de44214da767d60691a2776dd0c962a534b08d22aaab85786dfa5c096b06a4b66a363c650813127d417d19946a40a936f3ebf28dae4d8f20c0da148b2c42e5a82c46946a6378b6feeb29304e5104f24cefdf49450fdbed742473ee86e03d490b2ace0f3187b35d8a2472e657647845d8e96c67b8229f0c1eae1d0a8a1ede500f6bcb6a8ec3ceb613eae1225474dc28e9035fb99d118f4953fa1f3d36502fd0fa194dd2f8873c88f6c5f96b6a18cebcb445336d2a3dab672bc9c98bcb4ef1886efc9f7a74e85473eacba0345ee898d288fc9de0159446d8494a7399fcb71ce0839a1d1f8d237c127ac5bb369d3d7dd88f20c2aab8f172b030c122d2c65d5e5ef2bd7f3a883def528d8041b641478c41a0374764442b54a21bd63a9be2ad66674369a102878ca4dedd1641b6cc6201decef325041759a3242f03e1a67c8e87ee5f6a3eba5b23df87a14a271d6bfabf16220b3d5a53a10409d1561025af5cc474e822549747069d7515e2fa979aa5ab2495c68f2a4025b30140408949c860d4d0992047a02677ccee3fdc947ae32674406eba80b9893780068f7dcbb94f9f11bc16f45e580039cc5cfbc8fb90765c62b16b4e0d38b309a920d453524353cff600bda37e6c2cc25797f8c40051d143e5fc085a12c71050951837e95755fd3fe06089bbada309529d032cf0c55dab30c649d5b37595d9cc4ce29352950d47c32afa4a6b1d05523a880ba28dc90d4f1533f1c592145a1eed11bd016008824923fec167cd527213dac81442890e05cd68e510e3a656262b53c2d04c1c2c88276518931173b9c9302912f5c3420ce71643317032bf05ad31bde5a662876475f315e001ead667d9b89b75252e4d82d7586749ec1904f4a1744e88cb3e6779184ce7ec8fb8cb20c1c461a7ae42065272fc1db214e4c4f270ac7512590e759c2f01b64151553fa9c32c08b949e2bea6566d84c6c0925a6a044cc464b411b620dc5af5c0a9757f981390cfa5e410e11ac73243929999f252713579d72d77305f069a7fe123ee9f69b0a42b16c64151fe9f599d2bcb0d1dca66f0023c49039aa342885a20942a6e0e483f3ca9d02cef032820e134e33aaebb4a88dfd59291f3974ffe4c3fe8fd82e8e11fb59eedeb59704e360c187001f17c00f0a685c43502bed0e2097d8ed67b2de4009d2c920e7d037ef15fcc767777f79652a6940266085c08b2081f8dd12b34466334466334b6f3b990f597ab602e97aebffa51a8bffdf257577f5d7f6f714f6edb9356f356e6de026f27d697a396d45612e744f2fb369134993491aca9c944d2c646d471c9eaaf9953a378ca7f0a51159895eb5fafc4ae572c6e04de2ad6d792fa026f46ea0764e1b10d3963e5f53c53924d97e51ed99db33e0f7f4fcd39031bc59c607937477d3cd67013725414310a86e7b56577197840fbe76d910cc1ed6dba0e1edb9025d6754ecbea268583d5399934050bd6fd90842cdf70d815f194773f8e722fb1e6129afb1666e237b51a474d9087ab1aa7699cc6695ac833065af59eac39e1f947ff513ae6cc74ae06a888e3020de9b7767958614954d9d5755133679b2854577a29d5e1c137565872bb3ab4c67270008f6dc898d89dfcecf44e0a05e604a6275eaabca8c0c549cb1a94522118283027303df152e5450577bebb38b9f3bd658d3bdf65e81282eeb463581f4a5490ac905ac06178452d41760ceb43890a9215520b68adf9e2cbf2b93c2a5e10fd826e02815f7c593e9747c50ba266345adcc95de160b089d169703ed469c15de160b08991693778d084b21f78b9b5d1c6832694fd60d3b61916dc596f308d681d94b1a0de40868d3b619966dcf91cd322c2e2813d3ab00ccad03494b91dd36272674c8b6f66ebcefe981b133b15416bad2215a98b7e7d7faf7dd29a699bf82b1782c736a4691554657278753f774e46cd6ed53261c908a7e69fc2120fac2ae960a49482d20fbc637f7ea908ef947e7e0905bc03fefc920fbc43faf9a51e78e7fbf9a51fdef17e7e8907dee17e7eb79a3933cc1291d20ebcb3fdfcd290920ebcf3f2f34b27e01dd3cf2fe5c03b303fbfb4e29d989fdb34c93c1933bfc47202c888a7afb9f196e65d68be048aef81c05eee4921084e971395d0bc37bf996702e4745f689e877bfecd3073b845f294c584ddab83d281d185c137f36bc20ee62fcc3fc984dc2d90a64b763744223fba889d192d62778615bb324a6237856fe693c48e0c50ec74f089dd187c33df13673ab113836f38b193c2377313bb1c885d14bec9ee29eca4706abe4cd89dc1a9997567b0259adfbd664ecf2976afee35734aabd2aa7b9556ddabb4cab26965d06ee6dae59f99f8d2c4ea7a69f5329f2cadee0cbadd6f5ac17827c42906762d1356bb875a7be85e24247439cc10c72d0dcd9c17a399f237fd9486eeebfadf98ff977c096987de3c1d4142c28b5169e8253653533cb5b2fea1f3e54a8b2fb1299e62b46655af3ba37c8a5b9f7b12b1cd0b02b11101c28aaebf4b0f20102e4414c775219a39323f33e52f03749de8bacc0a563f7b526655ffeb6a88a33a88cabc53b9d6218eaa62fd71144d132e3d045d52e6c7854866355355a471adea6f3f7c236a2f565d655a2833c4532eb33ac2f69332ab1e329355b3aa49786c43cebcaebfd72f31a794eb5cc8ceafe90aec89d15e73815d675170237d25daef6520a771cf209d3c85cae59fb0560288cb3f59cd061697dfbbe09d6d021d71f9bbc53b1aff0ce4a90919346484886902a3064c122629e0f56fdaa7262a47332eecabd1f4c45c4f060d514688ebdd93314daeffd6c1a8e130496c2629d75fdb366b29a522e9af72e845042b5ab9ac5c562eab15d1ca05a4efb980fdf2f231c8095917b27d67bedac4758b8615a2d484a40629099ee23dd9d204c5f1f5c4dc2ee65934ae3fed9f9c15e2fa3b2d35b95e496a9092f09607b9cb85bcf4a18eb591affcc7590ed4e54cf50ff5ab891ad6452fac17d60beb85f5c27a615d7f17980bcc05e6027381c15c5c2e2e17978b2ba6cba4803fdf141e10bc225a89ae6b500ac7813fd71fdc9a45bf29aeffa77940b8fe9d695e11d7bbecd8cc69d64cf503995add32b53ac8d46a97a9d542a6d6f57f89f5176df6148b5dff9772e6e86ca51d3abd1e75c997f2747221abbd0bd9ed69ee93eb5c12b825b6339a0dae7bb2359784ebef69dc93dc12d79fb9336ab3cadb37be6c63695814e149ef626b517b7266a56171fd3b916b58b36eb890a574e622713d8a469f9c5921a1456118cde742964f7787e983aceed0fc3233ab195c7f9e59f1cd14b69f9c595d8fb9332f159ec851f9522b054c797968fd1abe1496ac44dabb704f43eeb7ad659eeca65c4a068f7169477429951eba9f4b5b5c97a8be7260603335640446c1c46a13a827abd0a5cf9c9302adae4b7a8f14d6546167624065c60836737004cd54cc5538841cc608acc24105a31c84851e139cf247859e124ef9e3a082551e128c722157792d4731c13b27bcbfb704efa0f0fe1e13deb1797f6f09ef98f0fe9e12bc13bebf2703de8901effcfb7b41bc93e3fd3d253882660e8e72a692e01d1cefefc180774a787f2f09efd4bcbf8784f702ef08afc53b34387004a5f0a4e9925e2b8527633c9713200571c810223823ea75bcbf77820a6fb3c2a3b0c29b10aef039e87f08027be98b21084e978a4a5650f2731a87a49ec90f20a73b73e3699e823c4a56c0517a0947d91a6986d9ca5ff047c5a41072b770fa1586a82012f91105b11e9d20d62c36624d820962c5c237fea258d908c5dac68b15097ce39f43ac3f3a634a24f2230eb11e816ffc819c2e15eb1a7ce32588550db15ea109eb8db0a6518d508bd0a8b0aec129ff14c29a85530e6354b374ef5f631d8e32069e87e3d6d8ccf15a9cf227bd562cc65ecb6b6980fe5fd26bc5b442182c14c6886f3c66058b69392a2609cc555c8ff0523126c83e89a3f45a5d7abdc0b63ce9b5665a7ce3a798ab668531d5970c86e3b9857c4f2169ba648d91b68ceb1f1392a5db893f1a2624b75bdf1492f6d67f09c9bfb58ae4e94a6d0949d425618cc81214a3eb62ada22485e7e195280591549bf29044b630e5e5e1648d59576521395dfe0579cd9f60cf566bcc7a2dbe8181ad8961f114fd8d3ea9c8a50f1eb9f43f2497be97e4d2ef965cfa9cd1a54fce185dffe9468ea2a4100cbfd00bc9bfdb7721892271ee26923557aebfe6b5ae8b374cd7adda1697fefc4d8cd52a1edb644f0ae096243f897279fa36f2572e9e70dd96cb5c385183cbe0cca94d9c208b28725083064746f2742b16411471ebd32d7ce0e2d6ff5cc5c2adb73e6ae6d0f1d69694235130c1821ee020cb5845f2a35c58bed473b6b1ffa39b13cb57e6f2163eb8ae77190b2332b824b54ff4f713eb2a20f4fad3dbdf5eae56ab4bef14691240ef7c7aa708a4af8bd4a61b8bbe4c3d46c1daeb956cac48d24b5b98451b47f1b36ff143d16d7b79b810da7d84a35e0787ab8c3cba3f116d7408f47c22da385fc8d8208f7509cc80001e257d89c0870d3530a1e9c1556e3f57b92d7e63fd79ab4886e0646748e3001eb799a242c6e7713ecd44f617c6af57ee538ae7ef951ae080be1aa5947a6fa4f9578877b3bc8edb3c2ddcd833eaa84f45e04e4e511a02eece5b6be5a7e19ddef5bc8edaa376ea020e8e0074747c4e9b7f1d28d4e6979f9a6a4eb4d6ae5dce24f5f93baf867dbdf931d1be863f7ad066542d41bdb3fb4143d7f7b8eec135a7b2af9dd8d281963b411e9a0678df3d043c11025c4b0b2c0e6cb43d175d21a390d15fcbb87008f75d38a4fb19922d482c0e6c7481cccb2ccc6f19689885a4cf0413d0c2d5de9b2069137938e75a9665734e2dcb26a76959a679edc2e399c38449f634fcd1a3d2d09bd89ce24270fd390725f0c304079dab0120f36a8fba42c6ed69c8b38a646f4f84090e3a17c864a15988904b49bf3e0e26e0e566ef7925692208fc66fd9332994ee710ed93c2f49338a8d487a7191d1dae00ddb748b20fa4e0e092ec279e3c11e55d1f7c63454c8c6d6155f65c804d8763e09cee9d1f8663a0a4cccce9441f9ef277d6a2c5985761b3d00708b63bdf03ac9aa20bee8caa190934d0db3a92b6559087f2ce0b47c50af087d9675cf7a753c7fcdb86930a67744c3770a62f7519e7f2eb70db4c390d362da3d30387b8d4615438d3c2e17cb766cabb35737ccc94ffb6597be258b77ccc1c18b0e86205650cd610d7bfd3b1a29de47125ea28e69d188feb48f3b5b9090bba7d3d7d399c93879a78fada8c66d9f4ce36124d0f2e8893f609d25ac11f3cd9d3ef6a1b5767a6c4d37ac86a55a47f7e80f88805715004da056ab801b4610b2720815a499aa8895ef5ecd64bc3d924b08180661f6956b3bc8e823cd4eb201a1ce5bf6d1c8f997252e7eacc1415b69fd4e19daeb33199ec0d777e5f7eba7d261770703cf0074f3f3579cf7786afe434534aba771a58a753070a45bf0ffcc1a37df69f13e0e7c7eeb9863bbf2b9d4abaf7bc1a4ebfdefcb2906fa51df42581597b8637534aaae20682edda9cc4040d39a2ebcda6fefc0a6a5d8f7a2b6806dee956c7ae5767c75a4774cccbeb65b4bd04625d4fab2ca0664dd8f5b68c05c4845121eaba1ea73575fd5c8f51b07575bdeea321cd7cee6eb72d7dcfebcf75f14ed3262e057b626ec3a84c20bc742c629d46ab8f9801cad32afe68caab8de348f4e90b91c73664d73e69cdb48debbc0f24956c8bcb8b092646e6347383a6a68415acb5a2ae1a9a1b3327191c394a68d5172c06c6f4e2d292e36b5a2db644fa908695c5c0cfcb62d7bf0bc51b2cad8c759c269a30f337fac5976f2c136c4e17763917ecfa6bae2938970c33df4c61fba98b7762ba15cc10a7d9d6d180a5961798f074a306070aa10927a88052e166c787f395b0f29607b9cb85bc8c0dbd8860d3b5f2d76ab55aad9c08561433aaa1b9317372b95c2e97cc2ac6c60553ccc857fee32c1aeba117510c56966559962c168bc5624d98cb5b2e97cbe5f22077b990973e1403539665599a582c168bf5e2e272b95cae16155e78297ba85f4d04eb22168bc562b1262c366146bef21f6739508b65b1582c16b843e5d2ac0da85b1dd4ae1acab22ccb9255b2582c16ab87fa45042b02bfb22ccbd263752de4b4d4c046bda2b192559665d940ddeaa076b550c7959b4ac7e2cc9cbae9d8b2b668ac0614eaff74b2762bb2b1131bf54f6dd5566bd3682ca3b14a6394c6268de9c050ba5e5bb3fa8989ea27929b2792db4913c9d3ff0b055e970206d2656666664749e1ed8031741c4762be99d3eb9e57561ab92ac68d5c3565b078ce36a4c83cb221611d06ca946094674059d0348253fe32e11c8253fe9912ac9a4230ca835c35598e3262ba60b6602299454c164c2226d01c8277b29993b9e65cc154c13c328598414c205c1e682699495cffd9aa992b73d55aab8c8c8c0cd5ae4cc5f243b222d911f70ab34c2c899aacd2e49d0fba07b6335ab7b0079655b839401e1cfaa88d2c1708fdbe5b68c104c05c2a830adacc6e5c077b5097fac604a5f1218f6d48d2eae5aad31c82c272b232fde5823673dc68a67cb3a747b911e982d1cc019f78ca3fca6aca4f159615f0ca6c5d07b178934b7a439674461d16111c6262c91a33baee4d9e94349f87c75c99ab85f58aa75cac3126284988d8ed5c305659fa56ae49a9d36c9bf1c052cb4b8e98d38d1a9b1ca1092814502bdc00e0a3a13116be163e8fe2db942b9ec47370965c2870aac06982f3e4f27babaf784e0d8d05e643605e04e647905ce69a784eb3584f58515853585558562e7f977dc473ba2c1b49d949ca5e5242515671f92fe0391d9b29ffcd8abd72c232e416b9fccdaac155d94ff928a727969bb08eb739d5f8cbf472c1bdf3d74cf97b3838383838ae15979edc484fda7bfa495d5e89047ed3e372944dcab22c71b08eb0582c5609598d0b0a97cbe5a2590d59ad56abd5f5bf81420d3017cecb74717070bc09e3c06f7a37b86da66c52966579621d61b1582c992ec60585cbe572e978b9cd62b158ac9235613580ff316c32cc6318c3b8c9dac06f7a309b662a9b946559beb08eb0582c96cb84cd2a1336611336611376fd5b5898a1cbedb22ccb92c562b158accd4b6d7adcd6a265b66c52966559621d61b1582cd6f527bd503b46cb2ebd2eb92eb72ebbd43a964d8fdb485907964dcab22ccbebffe978abd56ad158c7621deb58d6adcec9ea5e73c9ea019567b28522cb70acd65a966d2265cb297efaccc335516b91b3ec0a8f86deec7aa5d72dd1c8d0f78acc374c008f419e191868bed016ab9548608cc97edee771de81dd8d13478a316d9acd2a7df9e9476cee0319530018e7e3b24dd37a60fb515da488ad199d9f839bf3c0f6973a15b21aaf32b5df41131d3b7770f246a3a3544c6944b6eb46c5f6ec42bfe4b6751766fb29a5949e28a594ceffb2df5cf565a21148beceb39ee7dd079a86406d1b69db4e762369996da92d7ec6375f4c2624b6bf8d3041017374d5a3dfb6514a29a594523a9b929452fa1ba8912a9d2e277f691813c8c31ca594cac0ebde38d2663f06b3ac5efeccda2d44cd54dda8cb9481cbc00c0a333b7e72bb9452bb7d7c439e7027addec2766b1f372399e9465574fa05e2979963d09e528d02f1cb74ce9ecccc94c7e42cd471fd75b88a2733f30bc8538625b7cb2ff670cddbb88ad2b018859f7ddc9a694f6659964d8d4e20d4a7d8761d6cd39b29a5d46b69d95c409ef03bc25f897bd14cb48fd879b259ccf7c1803c7cdab2cd51a7cb4fa9cc3cf90cd390c6bba489b3002b9e67d4e2982e0b17e606cef5bc0f24954c97a6849be37a2dd69648a03575770ba0bb7dd2ea93d60c260c35ae24ea737e6f343d6ab4eb655abdfedb47238376f9dd4fce7973e73f0070590452affd91a1705dfc01a45e9afebedc6693dd1f402a4d5fee0ab92eb614eb644cbf2cba14fb83de1b18c6efa4bfbbcf072f77bdeeeee1ddcdaed728af0d6d55703e86757577de83fd3ef04746b29ee402f11290a597c5222ff6604d2d46585d207ed9512cbad83d580e2c4291a36cbe8d8596b0e57a9f077e4eaa744e12c99bb9cf856b3b904fc8add90c33c5ef61b70b8de21bfe7e7f21d7eb500395fe08eab75491678a2f0ae68635bc1e9dde942bc9ebef3eef6e773b0fe7ed401ab81ca9f8f99c02845e17697a906e6ff82e3bca4dee2cce1bbe53b65d6ffb368e7fbacd931e720331a88c417cbe263e2116686144144678d058400c01d1841363101f4f899189bfcf16c5939149bf50c4c8cf28f8b30d7594137dee522cb70fef95267dd87cf762d2f7d0c51b4e977ac8d79f030cbb1a9837f02092304292d1c7e50c36fa8b1b7021c418c4c76669c148dfc7fe40c40b27c0d0466431c610a38fcd418ad17d54a377a33c9e3941f806486805d10f12c467be8f43918312237d1fc781d01082b060640ce2a3ed30529189bf8fb6c3384526fd0cf098e2d8600da1d1eb8f0b83b46b49942b462273e46e817d00c40a561d84112744f4480b88202f46aff6008b1543fc45d00f461a0e14a3cf0b912f5143090e46260309465ce842589cacc62e048095d1e38a5852e467ec429b2e46affbb8b05f50061531af0830e8c2e8fbb890b18831011bbb90c68cd1037710031abbd0868cd1237d5cd842fc200156fab870660757786164ec421642959189a218fd8c5d583262f45ab6a0b246cbe5e342766244cc68ec42fe4116a3c72f261c222b8afa45e4c74847161b25a38d20aa0e518c8090b5102c8882888e2cb4208c58d99c20c952c46d01450c225d105a64f19c14d1a20636687c01c410ac917b2136688cdd0b193bfa42116307e1a134889831fa684f08d9db2f1481c37df78591a2d147eba10623c7c51522a88c3e9b1231468e4bdf66aa797833d4d021800602a2046c98297f21a38b61e753cf81e528768a1e86654751510433e53ec4209c059120158c3e538d91898761fb858cee856dd1545251c52539c6a52bcaf50742d3835ed2e7d21733ed0a27ac70011a5434af728220bbb51a46564a0cb164005310191ab91732f64a043ebcb09de599ef79cc37dac9069a3d0d6f385ded7d0c28398c41b8f7692382a0c1c8a4be90d1eb422e14c91b4e977ee6917ee9e3849d484343d771a1484303c7bd9051c8c86376d96f210e7d353a6a9d268ac0513ec0b0e40d0cbb953efd7a473f0d0ddd7bef89415a064b80b11a3b5a040d4e0dc41442301ab99016418371f3347e820229446317d2eca00440a317473f8e640545436317d6287123a85c518e5d580213276388172c9c170f84c62ee431004d60abb1a3a181fbee3b31480980464e14327a5ae5c07639a14468ec429a30466feb01cc6089a2910b3f2246af9248219739860536347296d50fad91bf8423c6129e18b9ae0b798362b9caf532b28071047fb1c48a35e6d785383a2fcb55eecb6d564b0b32462e64c1c8e8d5af0b1f8503cb552ef95d68c3d31796ab5cae7249cb25197d5eda68a17c62c8d8a594239863218c2443deb731c98a2e8ac62ef4ca18b558a307e518443363f431293176cf8541322c420475ddfb645af49065ecb2686307e5c8af29ae148dfc640915c0c62ee28321108d5d8803c5e8691be9f5c512abb10b6b7a18bdcf064404b5c61c8cfcb663f016dee10bf2a03364881fbe5ad1d8e4b6e397f93de69bfe2e9c49b87668e2357221c883ce90217e3cd2d78541bc35066bf4216531726110f662f4612723f75d18a4bdf06115c4c75323568edcfbb00da068317222135a24850951601939d12508c370003406f1d921258bd5c8bd0f8e0b8c8c9c388568cda0086ce4c22f8dd17bf9ba300853810236facc1f46f617489396350c7b2452c8ddf8c68a184580462ef4bc183df69a797a974a1787ce72e95396094f6a2e0cc829efeeeeee6eeb4b4e331b4769a5b48a9ba3289dd3a66075c9cffd0536b446288d2a369f69fd03d04f3645eb28d30f3c00518d8cd02210993ef09b65e1297b136f51640a0a72e848bfe679a76f5b4ff55fca4515695c1d46fa9fe7f0482ffd93df6073e95b47b50d2c5fd2e6d0295a1377198b308a5cd2be76032145728075310410b44081194ed8b8a2040600c90bac58020d2fc0204269884de1b21336806e76998bd5104a745c927421848e131b5cb9eca48b58002e3be9a206b77f8ab8cab67f1dbb59f65cf7f804793631ec7361df4972bd1a42a9480299970b839c61691a46d3551ca57d5fbf99f68ed2faa78b384ad34a66d8fadaf39845da077115f7daf74a7b8efb06793891ed873e6c4b90f5efa73f4320a1d534ad6486dd9edcaea6bdc955d96b57d3be868ea1aff636b8aaaff637f8f880f5cb4ebaa82243d7ff000ee0317b2ca292b17dcc9c1aaecc307318d0032233b0083a72851142a8381aa2e585145c6031a4e728e628be3fc3cc098113493481a4850412548cce0317508c8932ae60838791d308c20aa6c052c4103cc4467f04cc9c03f4f062a275841ff0200813084b6ed5478d71fb601c57f1b6f94ca1bca2d9ae6ddc23315b5a6bd125edfe47fdecbb74951bb516acf236e69cb30bf9663e79303719461d0ef368854367b9f3957ccf85dd434840b95e3aca9bd4aa853da5897aa85f6db0ca003c0cc0aa28d7a17419f29c74d24a9947b955dacc83071f808d8a5c457a79db8aabc8d9ba2deee2f67ba9d9c017601e734839535e9665e925aabbbb9b38ca8d8cbae4613f2e5165d83893c8751c54e7f811773defab4fa2a0dac49749778c40114bef98a94a491c6755210405f5d69dd37a92eb481ce51c345b462ce9a597ae6a98bb9e4c71558b4bae371972551422d1838aac5ca773d239ab0c957ce39fe8a553e11b9813b9d1cc71346a7c0c46f9d0f4d824e240309a29b0249765e94f269da1372967ce6ccd56395bb3b5ba24971d648587b3fb3792b7a1a893b8101340935594db532ed3e91293f0dafeccee67a6b44352c8d3e66e28da759b823c99e6accc591df27b0c32c053d03b98db16e91d2cfa8fa7a077b4bfb3d89d7e0dfb69e85b05a2db7b8e90b8ca5fc5cf97c1f9f44dae02427df22780cbf0d886e4b6ece99c74cec9d5298f8dc3d43bfc49142e3f4a651dd544d99c59ad278b83daa600321e8e72aff3be7e1bd2f39f7867be0618e59f62950d3697ceb08a3effa8ff83bef6f4e5aa6e392a0c563512dbb6fde66d9bb76d36937dec907cd225ed0fb6b7cddae962c19096ad3b8b5892be8a664e8fdd9524acf16435fa53a399d3b1151097242760d880b55a11c166ce8412058c264533875fabd5e85f63d56868e6c4e08513e5cb68e67812aa60ad56ab550ea3cb6b882aabd13f83d5a05506445f75557f660e8fdeba247d159542aea0ac55599388ad210e41562b1ce6d1736df1680d957cdf8545d79ffb440dd840e5d2184f5f71943f9785d40a2d0a29d14cc19060952bc1280f729412b48aab281546810df01114e917fa385160c98ed1d7acd9cf99cdeed8d6852177b956abd58aa56e3f0b309c24300147b983f33be4fc89bb3c886fdc0496a42fee877760b8fed3072b0147b9771a9cf2e7b896969999580f96befce52a92893c28c8833c48023a5c200abdff1ce0e3870047b9026a9db3ba6aceefb2c9b355d65a7a8e8a5a8ef21910e028efc6e2aacaee432d2d2d2e3a6cb8a5e7a88af62d608fa9fdbc541375b61087d902f25091878b8e8e293381f5b90bf389244e9b401eed3dfaddfa22ca04f25411878b232bf70b7df460be2c642eb2ace60cd9bd653cf6eb9dbcee1b35ec2147f5936ed241ddbae148aebf57430a8568e65030281ad7494ac6755086f963ebb73879b0408ef2e799432cc945b7633367dbac3d9d624531faa2afaeb3b6664ecbfb76b24fbe0d33a745e4222fc2c137f43b89d895a398ab3d6b156ba55728117df14df8f1cc7122966b4bcf91951dac07f10ebd8cc5134c2ecf2196a4b5a5274b1147f1f520578109e8a3dbef410e05aa3e8b4abee7e1d53bd67da991abbedf367bfa2fecfb71b70470017d74ebd3d714067b7c515e33c7833ce5ef290f7ad597cb5b4001c2253de83a7728bee9e7609d2fa088d79699695c086dbbbb728af6cc2534f9a71496e91a5e5b66e7c1b6bd79a8555847c8b4ece23432c4839b28b18d4775985507ca9de0042e39e44033577365e39a593ea7a07f969edf2d4ee122c9ed02c9e5028a27976bb0bcc59095eb61400047310ce00806187454052840010a407bf4e8d143e8010f78c00382de6e274b010a5080022ed65097421e5bc0f2164353ae97812f031960b0e788d573c4ba19007b8e8eb4a8f2ff66f550bf9aa86137a892f0424e125a682100389e437d03385876b080e5e646870a55a250ff4c658d8d0e0ea8d0466a8536524801059b18ec74b276db489c13b971cf0ed8b061c2096c84e1e300fa81f970e14042093990404363b71bdb69894ba8ab7097ab845cc52d0f879391cc8c110c8cc9c58ff4906d3b9dfea75cefc7e76b58211eb5ed347417b0e708c85540495c453609c46f3f0d7b8e921cc1b6c8fdfe2d1dfa1247cd7f015d0dcbc3c59e232047f1e5eb957a8e58b7e7a8e539ec409ee32e4fcde7db7374e47a6d7b8e5a8ee2eb19bd59e63d47496ad8738404e4e93962b94ac8e54b02d95b7a8e8ab8eb1e1d71145f1efe8109d0b264c972b424ec3962398aaf2f7115e9ad3b5baee2bb4d9c99f37f3af9b4d34b0ab83ce66e1cbfd3525aab0b3a1ef30d6b59a5db36bd399b1afe2a25b95fb146b02e04cb62158b60c9cf6327d3b70d2c8b69d8346ccc92b84dcb4876cbb26de3b8aed3c1e3a198371e0a92b49213c192dbc69df7dc4a6d794c9de7eedf0792d85adb1de71e739bd6755957e9ec3a6fd2ecd20e583851c408b02b2bf67c08d6bf0509cbb02b04db5eb985c5cdbd7edd4e6ec566977cce5a4c8eaaa28da3bcb3dc1f0d13c29c734e1336227074603872020a29a052bdbafcbe06e5d88d81376bb2797254adb5d65a6badde3b6aad75f6cc4c339ba2aace2fa3737394cabfceda35066dddfae7d8b6eb3ebf0baf5bb64b3d9a77ff78f5b3fa55f4d6c1abb57a15d999374709a9ed355cfa1cf657d16b05529b78dee62aee27c2f637d7d0f20de7f0e9df39fc728bdc536c8d8cd66d983fdfc0b006f8183910fac77fe045d6647aa13dbd72ad956ba5b492b5f61479fbec889f20fa38f4c9ef76adb5d6169a5edff3e6d3f7108adee174fa0c7a873fa52268a1da428ef2596bad4fa5e0428c1f4ae9b76dcfac5d8ec32eb26def7335ee22f5297d06b56f0619d03ef40efeec69c89f85fdd33be86bb47de81d5404f569d8454252080edaadf5039f52a8644d9606410b11cd8800100000f315402030140e88c5c2d1308be240dc0314000d718c406258469247035194e3480c624829630c2180183032323220520400801b8bd2c15a53d89e60383529765d30971de8868638ff50b6e4dcabbe5f6b21f632394fc874e3ce2eea251c46826f05c025575940e01b7bb0d4f3856dc7b69e1cac6c460369b83fea55fdb193f85c5cec44dc439b19eceabb32cc31873450659f03f104bf344981678453e88260ad3e031406b50f1894840645571e4f34f44e9a41f65b25d2a0fa26bd4f658a76780d7d62e8d5ade133353429e4aa410d85b12a595563f8f81f3f54950bc244b62bc1360d533b781712a54766a5f7404e7eacdfa5745d9c4ca12f9add0c2b70a3a063f9240a0f540b846928078b77b738ee7e8bf2964966ef183a629511e15f66c25605e10a4986ac77ea63fe2003ef81b2f526227ab436b99b41cd229cae3061ba4458929555d0ce0627e0746048b6feab548712bc0a8e76e4b709ef8173b20443bf74d2c9fa1f63281c5a7f9cb617618e28c6f7e6b1486da0614d5f48b5652f6261cf27a1670d14b6999684519ed28349ad50c62c83cab5618e43016ec4035b8e33a91a25fe79ac7535f419fa4f4528c20cfdb88450484f5d9221177284d639971086291e9b77030c010509575700d2c066666d67167676b3ddf07002d5ad6565cfdf8a6445d8311206612a042e3f8e298625085c85a156015fb7be06a0d3b6329c9b4d95d1eb56e45eb76db8ca06b89edd0e56b5fe6671b4a7856d037623ea635a83430b60e421ab15aaf6ae6d050a401c1bc5c100efaa408b786016b3aafa9cc92a0ebc68db5607c9dc860652238c1cfec579ee6d39e34bdde46e4ff74ee4503da3b26937d5fced2ca5a49d5bf4343e9aebf83a8f3c4128a6f3cf2238efd65998fe1c62db08445dfa07cec33d4c805b32733766207d19f41053ead90369f9d7dd1693edbb7b5fd5d909b71193c8bf684b010cdae1a6c481b10934016e98231d2f012a04c8b354245f31d51f72aa35e24acd4bdc4de68d676f1134362b5533964508709979dbf49db5f9c12d2cd9b287beb8b3237ec94419b46ec753b45c648ab3b0e65090f85ac1d55313871a4a82775ebaddc393a6b3ebbc2276e723359411c6b130047a42d7e78dd25c778b56866bb6149163a1404f4c039ac0b4ab3f0b2077fe89a175b4bd6061e61a494b6426e9a48f352280073aa1ee8cc840c4043fac11c0221444cf3d84194d5b83947126c0ab194b7707d03722ee21e9c4857e3741d37e3bd707c1c0a58f107c2cb15d2ddc70912ea152c2891d10e820b5b5b5658057fe677cb2652ab60df67c4061580c8b7e385ca26859e9b1cdc9d373be839a7a9c51692f1973273187040f73578801f50643689084e84effa484828f9602de1b5a23c0ff1ca8d5d270123ae93c66c064f0bfe11692cd5a4cc300d1c82de32c5c5a722c908bed78356e56691219f7ab4383f93a99bea41d50855ff05b8f6f593cda15faa93965714673546e1cad364ff76373fc2dd0c6bd153db065c8631811c0ac4dc194ed8dcfe36e2686500284b1faee4c7a0688041dff1c5ffb2a1431f4727fbb4cd99c2393e0dd083dbd88caf43a130fbc27940a00fb44c595faeacc24c15df3c02de1dbb7177f10a640a1569f034a5788ca4eba1c20f6193f138fe9cb322288675fdf206704030c6e4f606b7e7bcc08b2ad11c8017e07f36ef7b0d35b35f51eee29d5e88afd8c60b28292c569b4212509258cf8dcf70d38454fec68ce852aef73a1ac5631b0ed21478fa98b22d267ab42c64f6293fff04860f4c8e3e5093e3e886325c37e183dece544176f8ada0b7a8c7b54ba4e290a9ebbe808be66c4be5f8fccbeb157c25a445cb40b453c995e110fa20cb8e91931005fd198f9b532ceba8a340bce584e1af3487c28fdfd3cf44e05d541083d62d3a11a5472ee5d6296d0fac09b98a969b55db2622f881081130fa0d31bc3a90eda4ae805f2863e6fd93f189560978d37eb9b6a525034ab0f4afead4bf682be8c7af314be5b0df0c7dc5b696ce922900d782e7710f8872d6e697a973581e701f5929644c279421abc903c97158d876911e36b4e087998303c56a1969661b0edac595f88cc87ff9f15f399776db15e0bfcb242f65bf1081083f98730f0e99b60ca09aba2ea5d493200f3a55d46428b2302f2ed1f33730c7979455b6873be40a1d463b3920c477e43a2f8b64b71c5c4749f0d5b69d9de25b83afcfaf01a7433f737a19f606fff42f38397a4d0ebdb47fc0d2f4d1a396be6ce5100cbc9be60bd0a15cae2bac37f391a3a4f4cd8314ce6e5c24798bb4c8b70870894b53fb0d0f839ea7a1408b8237259b480a29f78fe7a18c9cbd0931f6edd43cc9030d365bbac79a4d292ca285b471c9ad32543695073da09349f781b42e36d4320da2b48377214ebae0169c680fb0917f8270a990398b63ed79749f8d8beb80315a8c3a012bf7bf7564a18f481ab71f3ba71dad56f2802d114f8ac07227de08c206c88c3a70e66fb0111f788221d985387d8f7fb6fcd916f190abcc973407fec03f7774a093543a7aae7560acae1bfcdf634648c45675c55311fac738eaf8104708cbd805caf5f218275c599b564fc00c0377ad97635b92c89d7e282477694fa44fae993b4eab9c67f34cc2b6cccccdc4cc4c558badc1343933a2ecb7a79ea65c4a24fcb069c112fe83b50e0c77f59e9e07cda9f3fb22d5f013aab2f83c4335b47c5b8de010537c0beb134b54506eb1b01f00c6e6fcb397e8a7f6c667799ef577512408ece8c171bf75768006c662304d160dd184b2573365172f1f9cf332edf5938190c0e6ac2e06c85b81f7688b457ce4db895164dff88e44547ca0927c0ce1f8cd166628334b60c60b309c62ddf826ff5af6329318d47a80011694ac27ddd0c83adfb896255ab957e4194eb750f45deebda9762812d3826e41828dc1108c810b209f7cf42c84ce19d0a8f4957888317825b7db318ae7a0503e0106b44dd35eb35d931b86cdf2474adb5e9dbcd89c1d99398caf79fb5f138405290ebdc33b288dc9d493f67e2037696a6aa941c24e2048c25ada5f4e6c319ba7d34a625f8e1aed128f5e0ce4abf111a02963b9f7313d2fa540555fbb07f23c7bf16c18f3dddacdf6b434a4e08896aff2f01ae59792fdffeeacad630ff415f30c322e9a49d6a4a61fec3eafcbf984c08775960e318b383d927ae444a3eb944c0ca915f9dc0d85e1ad084219665dd17ce9b77c69a8e68a95b2c5a8f69b88b284787d0e8008b1d2e43f9d85e2f3528a6023aea387bbad717758e4d6fc2731833007a44e501be67e8a6a994948832dee12a4f0c14fdb51ce4cf811d3314476aefc57652169b6be2b503fc22fa7a608d857960c6420c618d2700dc43a9c60f64d3901baac139f0b525e46c1636c144aab16789fadc642a7f95a764ec2eaf3450a5d8941d1071ecdf4565c981b3c8c34df8d06d1f489678a2ff9f56a115e0761aac60d118d577f292d49c9d124ee11269a56883e38bf767eca5ced7d774798bed9ce7b53c716e4e419a39db79fd603770e477e41aca2acf40b3654e9834c41424850e1b7b22887402c69b93a7bbe63333cba02f16db07eec08c4a2357e98c610865589f80713b3993aae87e5c590f2e655e97d6db5b7698b942f01d00c32c44f20790673d424c1831217f48643f94eb63679a31201da172117bb3d844b8da17d65d2703867d6c1bbbc8a3a621818ec20a5b1bff5af3c0a626832a6df00f41ff784512d52d3d88a02a228327d3c98418e913526f6de77ada6eef6996ef3551cd79b47fc7595c7f488e4249d77c286afb98de65089fd3df9c7bdf22c20dc49ddf16735f6ca7490ceec342995be142ba961bf6de98cfe49d04b635ac053fba82a86f623a5d10a362ea64fac8a1cea973f6b4c884b0fc5d4e9572d819638dba58e1b1ecdacc7e09c602f06bf2a6db6bb6a206253f04cf57950495ceb3d6508d8358004225fc4eac04377c34a9f1e3d4e22e34d2e362ac0926cdbfc00bfe4263660c7023bae04b8c439f3c9e84502dd6337c2e99cb9210f11a0b2c9121ab5b7e9bf808b550b5dd4edc5326915bfe88567a7458fa4a1e33b855467fdf4e2cb8704cd1d2846e442248b9e8d72f2235bc86262532b9468fea39cff3cbb9b42380a7c3424790ca95f5a2e7e8c487f3b500f2af5823b9c149130eaa44b7e00f0876a21cfa5da2341e8aec8e21f7672fc017ec651be18cbdf41e5b1b177d896f5bae786abfc40bdc31a0f57db08aa701d6223e9f4839e115fd5986bc5e1d887417a297de387e65cb462dcdb9986a298ff20fa4ee09a3a11f80552ba2f643ba91e0b227e3f2fb49733485146dfcc98f1845d2b2b69e86b500418312b6f642400ac94be5dc74b93d68af2fe29e95922df3190713217a17e7a32742de74c6f5256b40385186034244f35ace6543c422663cf3f4b36830b7abb34e0cdbe21ba459192ca40405b742f796ea91f936b447093d19b707e989f4f5ad7b5cc96fdc02046d9c1c26911176e06aaf3fe9751c14240042128aa04451ac1aacf5e142d931b31c89f25a1296c0882e361454aabf988f8491f1bf18e748f01153332ca096b9dbc7e190ad2797ab1ae9c0ed492886f351d9ea92cad1a6a75fc902c55dc90d7040c45fc01f1e3257a85898715f61d029f64a9918584ce08b281cae95d98e5d6f29c62df9e03f56f78f0270c7bbbb34853a90300c4c6c11c38b9f8dd8c4ace00a125d7a93e0e724513e9e2be5a51bd81237d7f89c671d15051f718b44bb0606d9b027e60dbbd41b4b2ef5235e05429bc89fdbbd30350600e73a7b5e900b618020d1843af56a2f06428d9023882dc2d7c1aefe411ed34152291b6c4248c69fcbfe03dbcd7e65080c77a41bf71fa17f461df2a2f56075b35f6981c055e906e72ba34252ac7583b320f05dfa14fd24ade159c3596071c9d457fad385d6a3c54d2e6504868bf29b1eae58d4cf2789010442c07b33dec41192ab43d6cb9cd718f46c5d6072183ff998ecd1fec7e7ea8296c3461f9fd2028f5be9cd1cab6f5480917e7141c833a8bdf230258a08b84d725425a160e9bb2555968e24b140bde9677adbd1485cad12a38654167ccad1c9fe00162d0dd9294d70f2d99d522332996fbb530610a74b3a479b7e5de50b14572537f829d72fb295f81cd8220d3dda2a653fdcb0ca14a846fdacc0623ca6a4acad50e85899672a7eacc376c9715a9b30133bfac3f89915fbbf4caaa9de90c84dc97712b8c0d5dced65a936a4f3474e596084a7f740805ad49c34ee15a855633d97f8b5aa49e96cf3e49c99b7372e7d24eac0da9e7808ab6f1e07105d45a949de7609b11ae55448b4e261d5d2b083b7a5ee0029f89cad2fa5e24f3016883eb3e68283a367dea1858ca9abf530567bec1734dd6ae2673ee252d985f9dd443e10a91515071d644006e5babd640be00e643cb385bde63567bf2a8428f85383cfdad9817f21fe9a13d08b3e640937e1403f3359b0385085b28daba619467c658306471538a80b5669c832c9b8256b72be3d857880b343043d0d2db11a477e9e0ceabb4e5faeb2cc3739d78c25f7da1dbc23311464b94568775c480329a705d94decc897ade4fb935ebda38c6f36361ee8554e6be729691822ccc622ff813c2613602ed40ec9dc10386b4e5d61992871595d7be22d5dce87b6ed20b1c4c0aa8286e72b7e0491ed13d5e17894a541ae7a9d24de2986fb7d6b77886fcb0c0e60e51075dfcb9510d4aa19073b5b461e787968a34f5acf0f3ae4cceb9c15447762f0ed22f6c7b97b22f2130edd147c3e350fbf888f894b071710752debd73566b72251562300c0556a6f19c4655db333cadf51503b13a6cbfd77d5c4ca1561e40d2cb39c52ba96156e4bd995867e74196604a2576a4f1c547771c0ad6172bf6618b283c3cc3303c231b98b3c0e8b81e5c96007296e467a467009a3316129cf5014ee148ca25bdccbeb6e136469a32cfa294d8ddb8351125c2a0726fa1b37ecaad1ecd791424f81f6042ab1a404947c51fd86b27a4b84db52581278235f11e39aeaecbb6f1b9bdb4a84e8d8582aa6a95b9d2674250e5128da56aa168b740d40eb52ec178063584f07d4b4c20edd16681951bb14361ac5407889b90d8a417d1aa61d6f22067407e5f77f1d03b268f0bc0355e7905d701710c612296aef5ccb93963791e3571374d2860516b17375297c94f3541ab74b290b7aba73a2a08d04aede13b8719b3df4588521cd478ea46df321068a12dbd2c2edf31a2b1854cf9462029b1f44ce879deb5098a598756de6e3f6ed870e23a4d3b1e70f845330ac1f8796e8156847315e2e3b631461b0d6195bb21a85890c7f8020e0e3f883accc8fb8b5857bd434ea941a8bb17ed6ef130f565a950e4f0f796a900236b51d5da37f7dcc0fb1a515f74f697553c08ab11c1d150d583b143cf725478f53a8e8d5ee2e1542a718b1221fa7e4b8044ada52e3618f4c1055c3782581138499681853f4b2ef951255960cfe4bcf18c5c03cd96d07b11bd4c7c064604687d65efde82e3ac457d45091c30dea2dc0177d2411dc80df10af4666ea372012f9f64142ddb036c0377510f28cea19c9d63c7fcf4074dccb89f000258abeebc1542a405e3adb0011d66c12a089118c12b101c8c8a3dd9a215b6930b975b3b478a258862f8e90a7164d922f830167ddce7b719cb8c7d603c5cbdbc4a5188adc6e195ecaf0e96cda633a2d55b68a7633becdc1f1179dc9c8bcf04bc3e4f30e802735663df40b6d130ca12ac2369e923c378ecb521c4d249fba0326145b41853183a8ad96a44e3b559dd6f208a0dadbf4ea754de93a693fda8e5bbee0ce9ae803fa3a9ea8daba4d30622558c55d8a9fcfabb6658d9b8e602df04f4f14fdaf002deb80773793217885343a82add9027002cd54bae71532cd26680a5f58e1b6f1b175d8c63b20ca61498dad6d0de47b75a35759437d47d9844af5f6f2f0ebf2ba004efaa5c5c6a96beda1a4c8d12f2686be0263f57344320484a094bbb3f150e5040d72086fb8be6fc671d6fd000363c0f81bc16598a21df29fa427a35419bb74addbc8fce23e9a50993eca8b91c62da26384af255c329dc952f4ee19600a2fbfb26117e6905179d0f2d03c1369bc767cc142f1c37a135d2f7d81f9f7c7b383ef58057150872757af9f7ff88b163e25325a165830b2b4cb24ac6f480cd52d926a74b97bfe5a967fd0e068ddd2b3af2b005a0f37b1f4d0d68b027e3aafce77f21e72300da037a9a0ec93871409c9fcddc187419a179e6b4848b5c877380c2d1e1604ed0be7992fa3d970d7cae68e50e8005cef855853ba99a00ff6d82f54bd6472181db2c67f93bf24aae94a0ac6f19b858385a19107e9017f6fb1627c10328137e35a5564cca72c2fecb8ec712ac1da2cfe608335c88bffd77d04cb110afb093d9bc9c9a7998325ac7871a79455b6cec1efa84783beadab249f24c2a6832a593e971f83f039c9c2e7d2e8eb7a735313c84bba6998c018801af55beb0646e10f62e7590a0d96927943c2a2523ba4b1ce3b98e3bf8b7d6853112dce5445460f704d215a724f82628a0d21fda3c01b6fed4091d1ddc6146ed2ed35bbb43ea29822c79cd68e86f7d4c59d9700a58f406e91724cf3e690412bc64cf50b1336823fa23cd03e9e1c83a3e6335ba1b1cd7cab1bbed525e34c090dff41bdab811b33525ef97ab56840ca05380775a67a7f7714958c2958e17df4333990328eecb20a90104b40c849bf54fa16dab01b4a67ec660b55ec286a8a620fc10dfe70a4769baa93ffc4ec7e478e2d4febee73a5331053bb61051b3495539088f4a85fab05730e768ac84afb29f31e7e41538304f5d2087ab7726233b2855a4a4bc6fcafaeddb7ec50ea32485b736bc841c2972a3cad6dd33e9be1ce28f5476bb23877f1be96d70f6a1e1aadaa7ab0be420a95defdea346e7750de39c5f3018f2159979a470144678100d3e524bc63f6a8698eddd347360e2de3a00ffbb6452a63b72063808e0360b58566bc614dedbe607cc6ed944c718c1f61a7b92bd64dd64220732587b16832a0c5277509080ae556e403a547c4a2d2f139ebfe86d855e565969d7aa1713d018030bd32e612236b1593e0ee578a7c59a6d357b4cdcab24c4f23dace751534d4ba1262881bc2ccddb78e6f4488b3c4f5cbc3eff07a1f1daabcd88d459fe2cdba9635a3c66e60a07aa7854f8fcc16046228385b0c71e3c686ca4ce0426d36087499b07b9648a704f367eea21fbf42b19028ade4bb14e6797e78c21ecd196599fc265cabae260e3b3d7f9ad5c1c07d492f314315e79a46b1be51b41a1fa6b1458986b52e2de290a16d30fb8e207319272ca1c03e3853c72ed388362c5945e4c8bc80d0ff52a6863b06ac5a516eb64818a36ffc7f8865882c741f6813fe9c0a06b9912852bb68382723c94a16eec2e034779741e3d5c311b999384d95a97f0aa8c669e0ae6e1ad984736129df45852be34370e2ffb2051108acaae633e3b30364fe644f48366e2b1e78cdb953e3424b7f375f98ed8ef4896429182f08cd75cf38e1134fa6cf896300e5e3700c1b6cd5c6d2868a92fd51c04826e105f8f8c547a00613c16fe8a89aa3b44653624c9bd83a526c90a1df06dc4934277955b2c0110ced503b186e7ed20a6272f0993eef5144a64ce2285d341cf378c2a76a00b17f19892765a04729aab1a703e2416560652b665cd30cc6f588405e68210f191ce51279e11d3ae87c33ccc669b2acb09e6ac9346286759152fbad33f7c333b3a1365f9d5a135e8c5fa63e776bf59e27eb661f5fe1f70ffcb855c4750cfd97eb919cd4486fe054381a0cf7ea1eb31bee8e110d27f235953892628b1f950bc3eac0b405c1749de88e602b8f14e8f66b767da483ac33714f289e12a2bbb1ceb4b87d6cba269f63912de941837b4bcf9b1f275768612fcadd4b20024b0a19be106f2b4fa8ee7dbd56ccea5d31ed2345e39312252700f7712a74c958a0e1d46974a43a44ad3f5daa8bd56bf8cc670a75dc8890c89c51116ae0bf23c7b3827b132375c43ff0c746b2324ee4a6351498a80489cf431b88696f4c0c48814c67608401d2692956b6f3a037e4520cd4d9731a6feee167c0f5a361a55063808d351045306b557523e561c0606b1888c72a5037aa9ca63e3ff2aa837957f966f67f1c3ca77e9957825a3b01fa34b34285f55035b8caa1023cb7f03f22934e1bfc18901da9c174cf1a5c169f3bf1aca053c69a648c45eaba094e7d67e8d48e885e4c903e67a18b75d2e3365784a3874a4b537169de08a2cde340a624da22f308d4f0ad27645408b511ce9780fe279d6bce043f29036b361237b3fd8e9565376cb707ab31973bdeaa614ebf9444e4688a1dafcf64acb3081eccc732c985dbaef3b45801ba5f55ade3cce2acd501f988322c30cc6d8dc9108147cf3f69c55cd91ef092b9f511974166243d3b2dd696052547ab6c916246cbd28cecca51f2abf835a29b0a73be3997d0a4eb0425b4342f6e5838945bb9d9cae1abab354aac255d1ac884b936764ba6d9d3ddbdff53709da1bfd7442714857356b7637accbd61871bccf4cf0601f9da23dceba3c4f4008820a170fb723b70ef57c7c48c6b4dba9de0b2957182fb78586f96271af0ac3536f115bbe814df5857d29e01781f5abbff51ee3d00632640d5e2b3c8bb65ae4725ded76c00b3e4c10233a7d6caba2da20643c553b22c1e04a197a36a21ddb8ac7d51ed11a6cdd41387be1b89f0f22570aa06c2d90c2a329656300e1e0c450a5fab2fc86a1bfab658ef212736c61cd05e71fc955d1014cda4c6db12992171c2e7c27165d8c05902e830b804a070504afd19cc252a35557d121d238235f44c3e97bfac014c2bb25b6aec71aa64ce416d8eba8a72e87837eaf48487c477b09202f314229fdeadc6fb5bed75d8a964c6038f478a8a1c8cba851bdbefdf0f61cee09662a76d05a6c878453026903fe1cfd0fb85e059f24a0c48d0d856c76c64222a24df918b17b5b468074ac1b948acd9e2275a1827da1d4be1bb3d0f9351803e16641da53fa38cf484bd8e40e92597ac43128608db88cb4e6f78fe2c934dac2b0aea6a832da1d5808b1bb6b365c80be6a504a17943da167121e41a0c584c920da457ce05bb40dc58689533d7eeab9cd79c6210734865f4de4d813905d1b9de3c4d1c35c1c38470bc4095ee5f0a881a9f15a55cbbb1de78730877cc549e2b1c29520a899b144c0014e1b3eb5f6615d23182e0b8cd176c4471665543031668627328ec56fa4bfc45197b134703a830cad9ca2082f80868d9f5fe5e64872c94c899a32e763e5bf09da789bc46f6108e4bc4aa64ee744834302b5a4790a1d2582fabc4491d0ffe10d84969aa87428a3c6d2254941aecc290f6153453fc71f532399adc90dfc87030b9816b9a95f0994d036c5e184864932df8364e5e3fe192250f6285e60e4c9bc0c58ba30c1b82943b63a9ce192bc8ce58e11427f435e1047d907ca0769e675ce052c7e02e80cdf08144b5cde0a6b0572f3509f8c2751a6b488ba3339c0c904774a507519972bc2ec63f99a94bd17ac7ac04bd6a305c37cd08f72bce1f25e04a95ca3849c9c5f5ab5813e50c8deb2e08f4d3534445341ea198b58ab8a9f59570ce7f69b7aa3441a18b5ac0271d629193018b9ae9c806154a23480ae622c693ab0814644785fdfbd3752a5b0da9201ba41048c798b5a4278fd3088f03a57715357ba91d163f4a74268bf8ec71adea06502a66595c2451826da0e2b0cd9c9b112cdf055acfe4f0c245f44906fc385602f25eae74dcf256b6a930c921a114c2d173affe3e9208b869515017859d69d249203e7b5b816948426e108438c3d8eb73b97ce82c0104a218c4ca9c40ad4c393980e0413d78212d04620c27628d1e0fe9ad5b44e25c8c106dfe0ba499489c1cbf71d01402cfa18544021568e52bf2a35352a1ce2c818131d01b02e0f079ea1b359ebc8856ecc38569df6160a2c4e628f57780f7894d94bef5c108bb4580f9582a08dab00048cae09df632d3f5a39e74b96ec96ce0864050d9bdca9012b902dd2761a07bbb0b78b82be03631d86d591507e3768b000f1328fcfebe4787011dd0f5eee72393a6681e403d285aa5f13cbba0a8139bb98d798838c955fed8cf0b95181130496fcb0b7317b90f92b30025fc8b04296dfe91a631855e9eb691c04c2556341b783a246844d4084b83edcc8148262e4a7a78cbe242778355abd78c7156ab3775773c8836e20f4d18354fb2596829bdecb498d198635574d499b298bb08a5c8de845e63c7542a4e7380d5c754d458065661b125a91044df653c749546c039bc75e24f06a6515d5ed90d507064a9a7a048317b044d502615eecc08db55e69dfd5fd57b1c9a26f65c5a805326a386f1b794114952ccf71d08b08070f5ac2297534030ee5a258bc4b6dda9514706a1e21b71c16b54893269faf78618a3d2ee2259348da77f6e8df2911fdb6affa023bda9d508c176d3833e858f508d1fdc40c143f6b41f7eba8376ac1bb0cd591b28b98ed33f0eeca067c9bc6bb48cdc00bf543fc6a2bc4dab83be31c8cc5b242705c48be197ef78a020b2b3bd15b13570e333cddcc05fb1a490d246e390320f574f619c8ec2b4374400f567e3c4080d3f3319701819b155d2b75b0a4ddae82b4295dde9aa4058dad84b0bcf15e95da257a98d231051a86d1e54ef8b00f89add00a5642e6ba909e6007c4513acd4804a2242f7cc3cf0cf0441e706942dfe6d6fea3f95589c5fdc9e66e06ed3be75b9cfbdb555fd9aa7172654554ee16f7eb260d1c385331c2abd8885bfd3f7b4344fd1977c3922e4a7d1cf4bae0cbbcfdd42c85272baee91d52c108631a8571705d98cb199e18feea77dcbf9b07c0c83463c829eb6fe69a864ca16bbff566a760d57e3f207911306a60bf228e752397158444e10139aa5cc399658033e386898facb1abc9b69347c04fa99f09b2a789fa4df9435424ea43125bb9559d4a6bf675d8f28f080bda66d2c7f39767a29dcff823848de191e8dc39178ae3dd2279c344ba3baa808f584aa9962917f227e73a28aef080ff885100ededa27a40335db860fe6486ded453a45b662d9bffbeb8f6e1b7889ad3e94dc6a851b417b7c751f1d3c43db096a6a417e060171d98282ee5563450445e287bb75d7be28073e121f7930176a11e8a447062fd6b8f01fe09fe9b983012760d371bcb63024ec35247894ac1bf150d8222246ef4554f3c773b76d8599fc5ba19fb8cdf1b8a3514749fb70035963360ba0e44a9277fd626ac1c79651c03d5f53d7b038885d90fc463212dc2c66b956304f0ebd7fd5680dd38cf2b99c9c4b741b0b984c0095dd7a75827478a456940dc8c2461c9924ffc1ee3ffcc0a373ed8a002fdf4cc71b076a942d9778ccb03e1d427ba53d97b9d5d947975e982e6a2cd36f0666a3fe0a0498c3747cd5695d1be069789eb197b4b8696a9e305d6963f5e8a8da003f036fe950b31aff9f813786dd64669048f2c5c2f9604055f600cb315c679a33163831935dbf5e18b08e75f5521f629460468cd75bee7e4e85e5f3fabdccd22a58c1cd06aa45732d4e90cc64821fa237bb7e606bcd2fb3455f70cdf111dd1441a7f68cc340cbd1a385929e7fd99314f58c4a5e087fd278fd36b83dfa4f8046f868c2bba0ba971be25f7df9679db2bc8f1afa9255c7713203ce106c9cb7a437d32d57bc79ce5c47519ca83402d4ca90a982418c297e98f6d8bf415c7c18477438b8518e6a385e920db4c941cc922e8af816fd30a2bc48d9d2dfec03c4704332a8bbdb1c930c9a303f0f2a240c00a8b320e4fbb43eed4cda0383c6a9b3ecf92a9a6a582085a67044893f1d2806e623ebb73e4cef531e2d49c50f2d9929e50af479a1dffcae975f0c4b86552fadc87d38595df96b64357189d1c4c071d6de90b0725c4d87226c5a8303839eea4e38c6ee84f31b675255a31ce90d1bf17f42a13a912c3d750ff7ddec3f861c805eb58c35e61c8c53f91b0210f9315e5291cdacee35bb48e120190278b4f2b04b160cc8bcf82efb2096295e1adc1529e649e868db0d32e7eee69be6031d365161fcd3889bf1df214663c718312217491a74edd480d46c6cb57d6244759b141b68db15585c3ec2cb383be1ecad54c26404833d43049cc0f55b9852bf0848232c2f6afc0623798e6755e7a944c23c4fc6331fead1a2b0af0e075214e8f7459e7e63318e891a67a4898d57731bf536634a7dead8bce5e62794f5bb6144ade1f6a6757a7b128b1282f49c7de74a6611b3161a372f74d3d01acf677adc97c8aa9bacfe8ee1f3b8c637386dbc0c1056e365c025cb9a533f846bb93dafba3b4c15d11965a14b54b43ef271d1052c31e31aae0ec8864106963d87aa8671d104f4eb99e54d8a3469ea2017e683cee52da66bd811ad3341b7e726b47962ccca6274ae23377e4fd3485a469d0da244b57273fed600dab5acc99688750f2bb90e990fbe878847773839a8232ec02f3a41ced9490ceb0d1c8f7a2f796ec14a58a747ea8cf731a09f1785798393421e549b37aa8f52d41b4e56b3ee61f9d1cb8f6068d8333289e8cc3b42f1d7979dc640249137b6a45f62f2a1188fcbdfaa5a2199cf4503b917898f6e2b48e13f42ad29e5ed528f35dba73c52b5ad9ac72404dfc0a87990bf702aa7acd855fb1380fe9cd13cf712553edb195b6d4eefe398018b64a9f115242a405805d377994852f743bd24e1483d3c0bed6edf01822ffac69770c348cf2dac48ba94ebcccb7df37680a7e8f1a5b4b89e053b8401ae2a8d64ca77e88cc986690f6c0556c749fddcf116741decd6cb932cf1e19ce3856354ac0b7da7dfcfd91680b05cb4a7aa206c7390b28937422f0d92060b3490ac7461605361947a5d92bac411ea774f90e57dc95c9f8ad4ce78a3f63fb0bdf7f5dde67b454141bd43e849aaf26f2716a8d3ef30ed4f684a890bb21923a22a0681aade1e99c1c6bab88db08186e865f60da9622e6eac28a612a9a6d2ec8f4b5a1dd1c5a129bdb866173ca882ae18a46cd387c81ad88cbcfc66fa916efc026912f95cf1204e70148b7461b50fbef7e73eca8bd5f14f5fa2d8efc9e344600c574188c60d23817c169e1de5bfeb13e262bb443ea5c564240ca68e19d72e27c2f5470393886a4a73083d8d7cc3fed9456c8c2b1ddc2a2c713b4d0fdf625ab65b3f92406832912d2b1a8c86820e1df3dcfaa38933b82a326f0a66ec94646bbd218c292e7815510ee27ff6ba34f7f81772b238c9e4382a664223a0caace3138aebf2099c442e90013b002b41e9a66a101c575a5d661095ed6442c8a49b7845e99e5cc617208d864425628df9c132f48ddde24359a0438bebb3960bd274f81e66115c4486669640471340ad8de592632ac2bdaec83fc4d353845f89749ad1ca811d41511ce7e0112e3215d55c6ee969c9fd4d430a74f5e5502aebe16613d09dceba1ac2ed13f3ed396c3226e84ac7dba8acb04e9f34a2d68024d5c11a19ac53d3101bfa7d5447d0877ffa7fc886b2c76aaba10b70f08391fdb1974ca7a6d2d9852fcf27c7e464b0e1ed4d06755dd98259db46c96de65195420013905304d6bef691051fc30e67fe5f8f03f85cdb9946093768ef33705f1a84925fdba41d79e20b59bca0f72677e6ba337ad4f5e4c426ec6b502a2e29362a3a75f56c822b81341dad3b4bb0a3d13c16b790bf1fbc3db8d2fe8158e44b9dc230cb8d7b685e4f8fa5acc7ec7fa98b61c6006eccd01f3ba857aad35977f026d19e7d2b76cc2fd9a0bc33e05a7694e62451682d423cb3fd50122f95101c3a93e46cd08a519d51f9e84cf7f6f406890d21471119269af90db7201a6ee7ecde1509e2d4dfaae856aac02bca4dc4345b24bc2b8743898fa26e4c15047e94aeca6a090f21f84d28810112ab6ac8b230cc6a2c6687ef86a34e23ece4ffb0f6e02678a866fb7028fc811a018a59282fda13a43bb185612e863f145496b646707dc8dcd07ed1201d9f766a906417fa42db15238cd7ecab2c25ac3cb2c31c942e8e8907ea59ee38316427387bc09ee7143dc2d56f7057e06e2a7c9734e66e41b8205151b888ef32070e30e291361e8791efcb8039e577d4dda9748c769718c4d98cbcd40616b66128f9368d686dbdd8e81c4b8ecb6568cc2c20372ba739d6bc21045d7ce1db18d7c033d8b18e90e28ec55d0070276a039920dc8ee6d3acc3ba0091b5245706722838d705a72725850b64059047aa6d80f45c025e638ff66fbeb9f1f9328a0343c1a0c34200b070b5c7c93dd6d06750d5f258437b94703345c344e940667645e0cb479fe21bbdf9826f2be63afe6c927408d7218438e0d216a058a28ab4e91c199fe35751c7d5ea02173043080fe31da4d5c0283d89cfe86c49b30cc81aa82ee1050345066de1ffc6d73292432dcf21845df1b0228e15b0661e9a24b7f926b2c7b4d4c34b1cdba2ff6f1b2aba91a08dd8035bc0fd3ffbf457101ccf94af4c14b1fcf5504458fa0c79be9f8311864ab2605dd9932861becf2d8b70423ba18b574ab486949c10b77bc01a00ea4fc0e5b0abf515342763ffb43c766fc93462a434d6501f693a8ccef3a1777d3a64c96ac60f1e0cb4227148117273e3fc8130ef9ee0d40820366ca022d97fad4a93631252ddd45d43a6b9478c1def660772df8bacb4bc040dc02639d375e94eba545f89012bf85130afa1957e5dccfc1d4554bfe4b0ebc306a47d0d7b0d1bea76026d894eaabf291235cb8eca0735f10ff0870565fb84f6078274623f15e55d83057083e166e67221101505c0ccdf2a684a2093e0728f3dfe5049acce466eef1ee543c815b32a2ee58f734088f0f7c3608a25cc512b99d914611af4c40d56654e12c1c4eefd55f942967fd8dccf522b15a7da63bd8dff9df132d0172c03d0d94abda1e5b3a9b895759626e2fc873e768daabb11dde425d51fcfb6714153a2bfc2a143234ea54dff2bc5c1912c436eb018aeb146f0a040eef25cb7e630a6f210f75e5c0c77139771fb97bdda86d728244557fa381b4d3b0a11bdd8e1a1990273c19a1bc04d2d310c1087d969832548facde7f8cef3a88fd998c4e6ebc1a983752bea799b459370ca7928f35b0ce38b5ff3134e8fc36681b2e4619932d43078cb75d07e123d1bc1e52da003992393e5231a4b9749b97c1d23e12d3c11abcb8df9788a9e56d3413ade5b0ef7a3466863f8db01a678d5c34082ce39bce0450374a1edcd3877550e309253074a33daa94e85f7cb01a040bc27c37fff2434bb025c9930250287ab929033be2837085ca7b5d7a508fe362a1f93687b21b661db06283e9859980bd9a9b1b599f7f29b75b33f954475dad64e21e548538725ab05361c5c8407826a0a0f37a8ca0e03e11634967d9e4c5b1815047aafbba65958882b21f834b05d616543c655e9fb57d1de4811b2c0a4d0e08360cda7fe4f15200f6a6e9d8cad7747d67c0a6a82a62f5cdde535c00544c4d14fb1b87afd1c3b8c7f37700285f63d0f358bfa2edd9dbc64c327a6ded5df0b5fc30c14069ae658d5a224063fb56280167615e1345fd67c0f423e029dbbc7d2fa96bc2ddd31172d43d719538ade45c8968f3893fbda05feb5d8f506b3d1d15b54bce3407c1b818a5119ec033ffdd3d0a6e9cb15778fd4ab3b22e151ff358a6b6dcc3b3901e09da013c3f0b0428c99bccf812b2223937febbf6f596651ffabfd38ac9d1c75799e1d19fe42a5524a20b76b417754f5c9257776ea21b96f4f23cb9c4c1eb84f21a47f2c784b36bd7b92dd0322ba01eafc98be11c7e53ada6a059c1c09a545014bb7a1ebe61420d7d307c8b38923aea82d85faa7e11eee8a9eece07876d961b4f4c307fb65438e2f7a7d45eb8b3f5b6cb899f95a9453a883e60203bb8c41b265389e0b97e1c4bb50dfe0c87aafbe4e572306e90b065c608f9858befe33716085e10d4749a8ea25750058e132ec54508f0118374b1c72d0eb95010070b313995e86a38a177199587f6c089ae225d1d280894751f69863323488830bbe6b52b8c40aaafd4cab456028540785ab27d77d52d56707591ea98c782e4f0951430da85875a1a86cc1f7c84ff389da2b4d39ef7b51316cd8fe7850370cb3cef7cd15e8c58b44cf6c7ee311dd701add84866bcb6a51099c9eccacdc405e0fe300ad4e3f8a127ae68516f4417ba18d0d5a058a0082f9d97acc82d2fdc8b8cb57eda1d86cc8cd74e8877642cb19f4c2882c0c395db676103c1d723fa7ab516e7634003cb1f1b1f24673e3c134cea6d31734e3f7b859ed04145f0a1b8619e8c90bfc1eabb7b12435521eff1cc8d9b7ccc6d4020261d3bb95e8b9fde5f5d0f835420b886b7aff3f480b2ed04d3aebdbd64e1e3d8dc1035fdfd1abb2fd3db149f62f81c9682fa5750dcaed421d73d23d685ada21e42dbdba3201632718ad13453e521df36f8a492455ca8f53129555854f2fa72c682738d028cc2610e99c250aeaea103fb4ac9383f41b49aa0eeabed8d1544f202bd32526c4e987139e777c9f068afc4adeda583f38ac1ccd046b719fb503fe66476b28adacd2b9a6748049657acdce97bf85bcef8585c3fedab2eedd3e91e63e1ddaf088c190c4e49832b169218c6f4b902640c663fff3a6803dde4f457a8775b96ab5bbcf489aba24ef0bc560fc0cbece6dada4fb688196daaaaa50b9e2a245728e0bc1f69ad383ea99b872a0d66f5b692e5d4e0b13caba57a1f4b09b8a4f6512a6f9c7798ff378ea8aa1e18fb470ee895875180c1e292949705f3707b718ffa0d2a2ba619116b99cc6b8d8eeed70eb662924457953f25e8758228a6caf21dc75721e35332b89f8a83da8f484fa28ca3bf360534d4ada2525263daa0e79c0611ecc491f54b6facf86046250d54e8ecffaddde358072dd28c10c5a1464ca02fd242482407e98dd404c722c534eedad11a8ab37c5a78a9f7b8b55c69b12337a6992100245cc4fd9036242d848f0bdef5287b2fbb7998b484eeb17db72cbd76d1b2c844e4be154c189d06db9ec3ef9c3aaed91286badd4a76524b36dc01c54c5609f60eb9bb962009675f790af799d67cf85e4ada06e575f51a931f25254499ae60dcf9fced9a43d86ce2b804611086fe1ee8484f5b04fe0310432c95ba128f19e0224dac6b8c92206040c9df113bebc4fb7cf0df1a20724eb7d486e106858451aa952a547b5e102dc4214ea667e7acbd6503f20d159204010a0e7a1c1d3bf5391369b379f3f3b671390192abfa0750099cf9f03b48150505d848028fb3807f991fc0b9d6b4463c9c6e4068c8ef4b702ca27525ebfca4151d3fc491e0959e26eafae0af589413ef5ad786075acd4b6a4a4b0c1d9e9aa2a705219510904bedc3c49888aa210724a86c1a728b35a90349e3b9d6398bf7398869617a656b316122920ed2df9e9206c5ba7df7af707f534d7b2ee4d6d27db5cc18d7c0990db68d129df5c33ee183789716a3758029c2587988d617ce4e7934aa0a2bceb30bfabd3438e074ddc32a0c0cfa8a3ec5d2214171f7c60c8efc98277e9400e41376df484e33d0c0c0d8b51404c21e2a5a8476d194fcfe6cbad1183057913ccb931b8f9a85ab04b0d20cdb5cfe4d58808046a0a36a787324342b0e4fc26fe85984fb8746b7f278d1085aa0d530ace413fb6beca6c8765fe123bf25c7a691309848266bf89ec53778460733b8a9c55e77615b1e004d028faa36e6153e896d60c4838e2185005ac24868b161c8928ec61eab9f1782122010c2d8a18a20bc8f082ebf0b9be7ce8a3d207ba7192c250f54b00d6be1a53d2b23ececcfe386106de970bd19574f50ff3d6181a5b3dbedd3e1fed10c176186a615c5882897c25422ffe693c0f096ea60217ea3ce3f7a4b431423ae7d81d566ccfef0ee93ebe27963e82f3e7f620e9f1b0c42f0ff2842c1e84d29fbdbc8a838cb60b4bbd3788186e902fb541d8c506c9be06b1506a108a1ceaab696013bc19244c65104764909d8f41222406f1854176097136d242a516724cb4fbe10b62dbda0b820abbcf205c107b8555b0b6e8b529bd9ff4415a783f5b1046aa59ef8ea79760e3e71524d4a8198976f98d9ccd054d96abad9a586a809e4e968151046cca7c119036b4deff28e1a9d0b3a07c44dfe0ca807417d79a426c65c56df3c5c49ad81478bd4fbcb3d0d9cd90df3b5e90df2b7c5454cedabb49ebdda6dfe9818061fecf3861ac0685a8db9e86436acc4936b1c5f39addee3a046e0b020ed6ba860bc3f34c5f119532b92e06badf0aea42ac1d2489a7d2056403dd9d2271f1154534bc3cb426daf3e0a86123183d4a49bbe4986705b4465d2f3afb738aa1d6781680b8b578ce8b033987cb8b63727148391ebbee25d75c621024a0b90f891c3fa13415aacf24cd05c22b5006aa77807f47a69a9f5b7e4f99606d3b3be0b63d4062cb95eb338871cdb5e10819f28ed6e3baf61d41739c7d78f44c108eca57866d8a6b20ec43fab528070bb5e3843e6f4f50c0574a51692ac62b314b34c95973c6cf0f23c9c0f1a58a96f0ec8b06b95dbea044df7b7b4b2d3532eddac972011539919e2398820cc1a9214069accd4f14510fe74cc7e13aceaa8285be2b384a764f30b567f2efd8b9a9f5dd2b5fafb33335f4cc92cde063f4b04c3b7c5c928b8a95db099a0b958898ad492e984217fae46fee7565072314afc4a89ff6ccf7a3c0aa8136e2a240a6cc4fdb0ae5713ca4cc07f90f74e8833335c7c98491e48195ba2b338a13b6d099018e2a0d4c80769c5540ef1561193c8755c9843dfcc6b7220f714ec341a50c0444b4656806e789bb018d60423359c42eae27939a95db4e0f934d9fe36457bef83eb2c5fa278913c8b1c8b1a06a7a97de1e4ba66e8674742c59368506592340949a255e5c5aa01d17d0b11870970c904e0d20225da024d1870c57dd08e9271fd2c5815ef4d814e3a467ade2471346f5d56923e301dad84f7ccc6f7845c15d1003323840bef217318f830e5c16949c9d46ef0119eb65c06b270df9be9c76bc4b04f497ea2580f76806ea6b99d115cc4b8082012b0f78a13730cae8276e3aef8505d61533053146775562118b92cbe2b1501ae89b4e54f4f76806f2d5783d22575a0ffbcebadedd95b8d7259e1672192dfb962e36b218637168412b74b0ca464017390636f2101a625625090bc9964dfbbaf450996ac1a611ae9024f0b0207a38923e942a0c89370dcd8e65c7bc97744e32fab0f3c0a1b9e0874177aa54b14b455348d60a422beca64a17dd1ecd83be0ebbd20275b82a356ce1e9df9d538562618d869babd4b8b0232c51943d6902e1eadf8f23558ed4f8df501bf4f1d33e849082f623ad040dc2a1682bd48ae7ac9859b2325490f591a307dfe99f680cdebee7df6a77ddd00d3f20d6b9a6fcb17908b0beb3133b8e23995990cdaa0048931ab776f44f04b0370d205dbe0958411f08102640a101576b0314c54fff9f282c6dca9862aa94c0eb3be9ca98a198fb8865f2dcd7a1ef23e12093820bf79189a29a67d3dd275562069ae8e4fdcbb410a6b2e2840430d695f697822e703e1fed26903f34e46f2896b8c842895683ec38617a49d1eca9290857c9d58d509fc0e0e4910c36970664331cac3712047e33a1cc33f99a4f2050f3c9741b6307cad507a62d9d9f1031af7270c9313f6c7883be82d72d27ddc1d596f0ac4823168b47b6960b2b5d2e9abefc780d7315b968efd530e82bc4758852c3c749dec0664e2813c71c6680068b2d61c31a2d6a00a254629b37a7ef9c7002531f9441aef8fd7ee4660d38bc8ba2f8909aeac31c06618cde36616b0014317124fa1cbec3b47349bf15d0ef6f4885b16cc8c10e66441463e18fd171399403ca795824b3d6fb5f515b1f84bf884c5eaf612c6d8b8dfa55604462e6b475807eb9429155b69af0d6b7eb2620bc631f9941ab7fa138134ead70350e1bfb8e2993e49dbadd24669fa83c6bc2f6a24b20e3e47cbc58d90709d6cd5e7bd57c76fbba7e7fdf738c98e693ce108a11bb984082b1601f6cfbfff08cde02ca5a30b928b7b0df7b64ad7fff8508484ea125b618e93cd03894b0a758201d5246995b9f644eb42b52a174b8e0ac3aa1ae6f6aa200e47d606f3ec9c27046a1543976f0c8473ac51cbe65e6ba0a804362b2fbc1d57468c8a111e7c5a79ce6391650cad680cfc25e3205c4c7beb705f77e2e5179f5cad3b5b5c7b1928251c444b60e9e4f3c1b25b0da712b8f8490202d6486202facd800e27c0510307c3487e6a8958ed32930a62a86191b1adca87ebf3e228029f32dc2f8fdbcc2f6f39a0f1566ce5b8007dd16275890f423afa5b902c33a88e71d101cefa4c385afe7dcbf08b19c2665e8ab33a070321bc917d78d0e14bb65b06c828ac6178df551c7b174834c6d6464f361443a267318ad09c4514f78b14d4f46e6286c38b4194879bd3e8be1c06e57d2c005f8b11b0e085582d49e0f20f46c481bf5f8df86db647d5ca45795034367e85e715bc8fe31b4362071481aa40c369fa40d9f457d211bf80d6850f2f216f137e03820b22902d14eea437985bdb227d99f1da97e3f996e0f337b413b1545c969d3f861e363e859260e89fef005cab316b6097bdf42e812bf399481c5227efb12e2cbc26b658bc32103063b3f7d29e1bb8afda4f67c290171cccb00fb0a7824e0205020f3cc03c20b28395a3b6e3134afd3f6aa628a290714d53c25931270d57d136803045072c4082769e6562dcd5bb2c190223c2d3954b9d0395d73de74ce4befd8cea908f99d6139c1b41eb44028ccfae5a8f80bfab4588ec8b5e7ff25a451b91c9403b36071e002f7d503ed298fdca32f9c3ce8713c818cc4da8494195eeab395d4c880bcd0a06a6976d4fc2dae8db66e5d74989096699662d1c4f539120106107f12248ca7fbe50e586abc12965c94e8448f0fa2c52f75e03582e9117a6590c1708464ec94389130d6d6053e0ad3b40dc6efdc074173614a7f108fa13207131dd638eae79d872c653e8d9b3cf1e3464cd4732f49c3548762095945962e06e45ed01043a8b5a8b1d3978ac70d3a56aca8260e232a9f178aecbe2be1441b377ec57f8330463854c845f83de87a6d2aaafb927580325197d545bc2c20da17dc71a313b3dc36c41f25172482520c6deb251db6bd82609861bcecb65c3aa488004ce4e1e6d506aa13f108a61aa07a233fcb1270b6e01c7533a0836fb9777a0abcffb8f9fba3c2ea5df8133eb86a2d0842e41d8f4085adbfac4333466aec9d6586be2fa1a8c099079a201f11810196903d7b817233f2af1a1e2e1a1a89407967009727117cb60e4fd738b6e9650e28da74e471a53906c1365507dada1845c71ad105846fe6158a75a37d7da012fa4e4468481f11d4fa7bcaa7e9d9c4538612c528a490b2f9b04783e46ae67e0a7e97b91fe13dd551dc17929e1a72a26a19ad9270bd550165e158f9a9aee8ef0e98ad3fec7e086a0cfabb14ed56602607ac4339de3018043b4dbd0862c5e530bdde6d8548a012d7e2e4afb6802a9ac15fd5a77784626c645b208879255717614a16ba60ba4ca343a1f404966ee86b6f724817b497e1091a15205454c06b8713ef5816ccb8754b540450fa493300bfddf6706a2283ecaf19ac5ec5d0855b4af2b8194c4205568c4512a507438402d857676cae66149678bc56a3e37ae3d054a5a1a0a9a47e81ffd00f168a4f12f71b13ca8381e574c8d00704a019882c3a8d6b1d718f85ce579ced04910cec28ee664f5c5a2e6eb7427f54d351005325e310ccb242438128500acb4bc52ba6933bfa816f134b74a99c24c85ac278c5e2d0f9bd3c5c24034a9c0356e3c2722328b0a468204678fc7cc69a59e4dc67431eb68711cda1cc72d5ed9506bb7cc24fbc698fea43edb4b205fef23d194762e1021349c8f6cc3bc44ee5e1780e14e4546ddb04246b31413d332ad19ba8bd2b1f6c357695cad13c00cbb60cb4e3405ceb989372c872281a8080f3368241fc4db14c03a17833f03219b4e31296066bc5001424afeea4003bca465278880c55d74e95b73d3ddca224373a564f47b88c6e50a582f7a873481cdd0305959c2f3271c4840ca35642d5d05110125621ef6beafa4076828efec21a7ac486ae2b1a968a49e9c5d51839394ac247d9872a4ae76ac2e9888bec01c6455eee8d8dccb88a36596b3118bd1d509e5245f64dd002e5ed0da53dfa0c3bbd1bc398537776e43d63780d8582be37681a2b71e84730f5bfeadf455c00bc8a076094c103c1de10a67ece63324eab38cfde4aa9b861b9ab0c688cf5b0f185325e8836b9c267f69ab1b042a9b31a4e38741833e38a1ee585d3d18088e78f3134128a06763689aa300397975a40f8791cec018401dc31df651285bbf12946dceb87d9bcbf090700f3ecd8a7fc9d47b8c553b3d00bad376ff7e5a0a3ba64b7b3c119c291182bf4279893c1548acf2c78f451b3addd7586c68c17ca492f4c54d06caf4c9164ce180c5be041397f8bed37de23300eb536b73ade474e47810206260bd26cc386edcf0073ed2cdafdc5295632cf2faace1304de4ed550f04665bfc53ef07d15f998c4e2907b656f6e3e4d91bcaa06b86c4e570584bb3b05886830063dc00f6d1676ca4b0af73f94ad075669925128beb32e5f8733bbc3fb8ed9c7732bc66f15a78ba583220f437c12746f02889d5659c5141bf87d0f11f40d6177a5b4f72f387a889ee0c8ff8699a0bfeff3483cb042ef45dbb00cead5d4a206fac3b703f87d6081509c180e51f56ef0ac03d0c66b21b49bb95404b866cab1eec3ad35044ee241d3864a8c059aa8d34e47370405f95933246a07a8eb093bd6db96c2f049f5901b27a757d18c2e1bdc41a385ff963a3435209dbf7d18e3064dd255262cc951e6b01f84304f975f414ea42ec1c4086641b9af09fca028cdcbe4b2625b27991b0f64043a6f0f603d87207e27b697c3896d09bcab284f88359d66b8bbe64258cc6962bfe51316ad50e19364c4775bcd70bd6e395fc1b3384ce901b888ac9cad09ae86e3d954a5e836b62c204a8306a48340bdc3b601d6e08724378994d2d3b8e718f2aa20513bf932c1d48c8ac11d12868804252e6948b81d4d47ae622273183a0b1d611e93ab5cdd8a76853b8311268e8991a17d7c97928d68b184156061c4e42b32213e60b6374a5f85a27c318b194c23c7cc1bf8ccfcc7342fb32651d8c37c17ab64190f82e2ee98c84faa70fb4289ae03acc2461219f1374cd01abec86eecd8a65600ad029592ecd8094a9f1b3651cd8e2bbe8ee94923e005820893432627f58f9afc9ba356837fec497799014d44124c23a41735d43619f8298db6a9dde5c8aacf3ed5a5671f0d9998106f48561a8468379a21ee9dc0c3eb810314db0241144672e2bdf3529cae83f525eb1aa280bfa6906507cc0bb08b1a1a740c29ca4b01c4cc046e6cbef02689bdeccc5224a813cdc13fb2b231964b59f70e9154db0dda54b70ccaa894082d96046105b2f0dd60dc25392a9ed51721a9bf29dfb77dd649e5f3862ffb79696afa0074d59ca94e47bde939553f8b2ccbb35bd859a2473925f5049b1034ae518c68f6472d2125a907d12fe144a810352c6f313c928a24569f884656d68b9049f571fc81f702bf2c6136674dc5823421a859bb6134712067a058c04ec39f650c0374d123ea03a3733d413feb89b8721d4d2b910687f80097f8e88d17a27593d42b4fc47dcae8e63ac1a76e532862273d1499d94a2ec9d9ee5ecd7364d9b85a93964485bc0a14a64ac6c06f646417e4f6a1d7fd88d49bcec31fe6924730bb99b041b3c943f8f3ac21f316e7ead56c5a94bf24875acb80aa6b279e76f1bf0924b7255b7ee7536aa85ca9dc996c8c037eb5ecf93a77c3251372de1f67919a7430de911de228778b795f8667de7960ece20d25ddf2a6f89b813454877cf6875d84f693d0f3dea5cba38f602d4bcaf96345e4f332ce8f4e2c94ccdf819256c149fe41d3d4959a41dc77c0b804d2fc5fa33c0775798768ecf9d37096fd134fd4c5f2426bd54abbab704f75f3dd9f1690784d0edbc9271d60e4ac291ba815d7b038b49d1f4aadf1430070c9eb5d7e83bc8aa516dfca8bc5234766f3368405141f4415318010972ed8235acbd8a1a16d4dcd0c26752d51745aa082f0ced1ad8b5f8a7e43d03b1169e91337bb3896b81ea207b2f67dcd990f2392af7401a83fac0d5e1ea478f9ec73232cdc3c5ef49492def2df2c1fbb0958ea78647436851d84420217ee5e2917b65d4cbeb399a220088a2a13d071c66f040cbe10391b776d6e192335bcc5b64c962171847b4178cbc7f8e73e3d08bf1e906e33a997249299890d97ae76753d2229a7c0757b09a07c8390e3b1045b0ca09aad57c32d757f18ee4d027203f4989b1fe65800bedc2d69dbe097131978c246f686a202e4f1c8f2d00076cd3bb0ff0d7352defd500d098fec102ac9b05135a009f35daab44a92f8ac435b635c179d0544cb306a171206d5ccede16b3ed6ab508524472e584933ca05e2cd80943bd72f49bf4f473bce0a1b76f08bf109102121514ddfe097cb1b7a2b3644f93d934f7276d48d34c2da9e930250455b735eb023b44ebb1b0501547dec03a65ef0b0c983a154fe17df02f0b76a24b0bb6a423d428502d48904daa25bba5b3052326e0e66b110ce6b490a4117847036c80c294a185a7abf5c6bc3b2331afbc55aab0ae15a6e6362dbb604ed632a81c51242300cc01cc2380456b7eefc0af55b0eb3edf68f0dfb90bf890f0db542f41ffbb6bbb67b4b29534a327d0ba20b950bde5ff97957a5e841f6047687ddadab4f304f2cc61c77fac4403db675c24a29c32af1c1507d90a014caa535a04fe6487b2885551f263a2a85be1c45554e91983a3c6392c2489ac4eddaa4c7daead28c75ea10f3a6bf796e2d629ab88bdb855ef51fc0d025eb3781f973bbd5aa24f9b6bdfb6804f3d34b648f1b04e7761eab0e31270b24023412c547ccc3bc91d1bfbc919887f125a09128db1b79f9d11b81f9987fd9d17d11a0ff91eb3f80e0ff78f9d1ff80f998c7d12f3f7a1f2f3ffa4df401f331b23e799d7f17138ebadb9f76ef3f80f492757b0f49be389dc83ebc42cb9c7d585106f2921880cd075bd2e9c33cb11773ece719037111805887aff04d63e12070a93f183ad734c13c8cd83d0ea4ea55ab57a47b039c4f5c81725dbefbcebd17d7cc4162ce259cbcbc8fa3bc641ffaa4c8837a6c77c21ce9d64838619ee6f4a03ef59339f6770db8a4f2ee7114a798c0a15e3a55f56a2389bedf88d6b3b1361509de8de472506b693c97c4b93fcf229eeb5fda192d91807666cbcaaa302f1101d292456ea02792a3436916449ff6964f7bcba7bdd5def2c16161b4e5bb2d6db9c4f6d8f72140970f3d6957b098eb65797a1c2de941d26a823cc63c7f3743951d80eeacb24349803babec90c4b52e47d1d24b3e8e8a294b97b53214e894070d82d38542bbc3da71fbfe343cb8e7e7795dded5ab104f8fed5adcb5c55fb60cd84e4c53326a4b7e00453f5e1ee6c7e86344aba47b97e77f097fb55a8964109cdb7d683581ee5dbe8bf1be903c72bf4fe1c5087048bd64088ed8ef6854e14275ed530ff5aa5b3f802e5708f5be8634ef8534dbf3f5bee3421a2b5e00fc0b3c6b4ffd0aa121cf83e05c9729d745b44a42a1ddb13b600d89d42e18806455d1729a904c1425915e5e68298201e65fde078c38bdf4227eef0347bb10207df5e8b5bdf6e7a3e14b0b7c192e3fbb68cb21f5da992de98c02d1a0eefedf69d4ec982bf1f125cee425a42bda9a26175d7997a4ae1c34308cfee57d8cfe45f4f1f230e2aa572f30bda4c754af1c5559302c98b0aabecaf296c35aa6ea135955b7f2b4ac65287833de9a266fa1e0e144c1f32713557dbce5289b85db52768d70fb693e1744d3a48536ba6d9b15e9f7fdfc727c626df5d895d563654d809969588eb2aecaea9e14b58ac598a70e7d8ab273a8729d0a2e759ffc8929135dd2bafc07af17efa5cbe8b265def2126c9a62d3d40f9b3953b80fbc9d1e558eb23cb8e0368f65d515dcfef073417459b4ab697ad2ae00e0b12dbdebbe7b92c48367e0cd5f9897be8e79a9f8d202ff764f0ea97713497e1bf8d2f7fec875fb6c7fe3a1aa1780245591f4d5e22ee9b1eb3bcc6cad5df154d5aa0520597daa0f96b83387facca6c8e2d227aa0fe753af78b353e719bb64affe57ddafd869f33227dca2ecb11fe627d8a75ef516f3547398659faaaa47187109dff8cfedefc2af029d7a79b7a5979068aad0064d93860397faedccb59510574381e50fff761ef6e5155c24aa3ed955e7304f96533ed832567db264ccf18bb009949ca009a91b444d5ea928343ce835c00a52a45d414332a7a6c36dca5a5d2674c53b3daa54ac8479d887b2e88af6545b6a2a1ef47a10208e6e99a3280fb3d4ef023ac48c3e91916e7f94ae08e0bd843315000efbd2d6cc9997aefc07902f495db75f856fc7fcb99d38e4a3a1b114e9b1bf23625dd6d5a779fb92d6d52b47d92c66a93f4b8f058365c968d992ddb7a74e374a5794ae6e1cc0009ffdee005e0a2f46804170eef7a1df1e01ef505c2d2040d2967709f8f230bf6d204822c188bf3d39929d1804e7d2df66f87678dfe3fad3c0f0f2307f819787112f30fae9250e8273ed739579bf85d5c705e008015f0eef11f0d1c0f0f2a3bf00ccc7bc1742a0470f071b0124bd25811efbab4ff5a957bce59db75c4acc48e671f4c8a18433e52d47551f99ead3aa3ef6c8131c7e984901a20b27aea85004e100888b2c53a400267c09bde52d87e2b22f47c17c3fa594be2cc0a93b7597d2b36280fff489bf651b5042162d7e80384211745043126210c60fb25cc901935edd559fdc59c8f118a45da7e3cd2fc776372aa567354da72fc7269232dcefe9938b1b684b2fd56b7becaa07f4253db62ddf13bf136df99f48922e694b232069cb99d333735ab81d22ddd04ffa350979d8b84e60defec088def2d6ad9f5859de02906c99ccb70d043b5113c256cb90caa72f07b5abb63d0bf0fc07b05eb2573b642e7d8ef5e83f807dc94e000ecd8e7af9eb659101f5926e4bb7408e9a63aca007af1828b1011251a6106e40842dbcc801119ca0223595d085104998d00209252c48f5db99a38eeca8c0065baa70e24a100fa9e6984c86b2a1cba22d59009274654b5bdad296568b87f6a7c796bdc86c2993bdfab45aad56abb9711d904bf393157453057263ab791f4c4c7db6ee35dca0bafc6c391422ba43b66b3914326423d17842ec0ba9df00ee49162e93282af45c4361ff74899d703b51ec73e24e1230c53df749c054e8fb1ba84ffc2e5a75dd11fe90f79f58c4c8f7a2f7be8891284642df35ced8a2e1ff7ea63a14fa1fde7fde874423a2ffdefb22458c84befb283e44ff79e18d1bb7f97d7c342cc21012fd6c1897fa77e8ef24d952fe49c054cdc75c2fd9ed1d1e9c54cd27015336328fa3bb8c1e9dc795f84e8fcd4e809ce2be74d9e8498fb98f93fe8a79d2619ccbd692dd7e2fbbe5b2a2ab3ac897f4d8dee337fc3c8e2685beb25e187a2efc7eb309676aa6fa49bf3a06ad44d7600a5867b7a609072f21cd83610a1f13a2f03021e95d421a3f0a679e3f7e1a3a11bd874e6c421e30d5bd4c68024ec97c4db8c303a6443fbf1ae8338d0d69ace84d01c986390f5ce83d70a93fc40a201d88dbcfbe6a02ec6c78299c99431f0177be01a64ef59597da7f00c23a55f41dbe8981511a107dc70b203ff88a4bfd2f33875f035ceeb00e679937fd2c042ef5cf58364d582c013213306e09d86ab9a5ee19017da5c5668ece6d89bebf638efa9e7e34307cdffd0fd17bcf6177197c1cdd556918b8e56039ea880f65b08ce0c94110403049f57bcb51164862c4195b28a1491344a4fa7de53da2908645a2ff11fa4e34f27de845df87de88a8634f7424f5f9e0fe7bfe2ff422b1c8f7a12f229a5f074d53bf7719aa00f4eee5559f42b350c8751e772bc77134fcf3fae0bea309674aabc04ceda0f0a44f219ca9ce43a6214d8f5068269c291472f4d831c11195cb8f5e269c29a6095f3e85107c14c2982785304f2374f99970f43221a75e1e0cfdf7610f8f35bdf40213e3f331d9b01898566f2b6817830c23c7b95bcb510e7978141f7c7046789d845451fc6f702c5e2c517d3c7a3c0dbf407f7e1afb47ae7da147ef5139f62a90390302646e6119279bc964fef295af9c8504849c7d974f07877c3517f9db56cb35a2c13dbc62251308c86834a241495f7910a7ea2d665204f3e0ab99ea21d173ffe3fb906824f4df73a291283e42224d0f8e1369e8773f53df1be1c4d07bff83fb8e7b8f7b23de877ea6443f53a1f778afdb1f72d84c799cafdad5ad1e6f00c9868526751edc053e843ff115af7809f7f8ca57be7226bec4572c8565a556fd934820e8b2e6e955f7348ba6060d0d4d0dda36e20ae50f16517bf1cb515ffc74f49d1e0077adce58e6445841ab55d8ef6f2af3b47d7feb609ea87bcc251b6679a3febe036e14cb34f56ba1973dfef428a32a20f699cf7ce633a02b332b6595db5336854bdc3b27dab05d2b36941ee994db0ebbed2f97e23dbe2a7960fdd297c3bff4e9e8be1d0b5eb77c00e72d4b5bb08c75e6bc19c26423cc93ffe755bcb8bdc46d268067dd450d731463314bfd5964f1b90cc6ed97e90092bef2974f71588f3299ec87c3d263c33898ac618ea54f6497b7ad5c72ce4a4771dfdfb37e2ee4159099956d9339a2b506cee051b9a418a75393ca6d1c73ec29bafd308cdab8d4df350be0e63d80f309205e37ee1340b86e3f04fac4a899b25fbbaa3d8e4e69a9f971e0a78b207cd0424b0c927ce007559cb0832766449105095440d9810833c400ba22d53d204122060e2f30820e56544d229429fefa3e8a14002865bf8ad34b5480f0b92ff4890a1001316780345ee6c90ad3c10ff334be0a70aae669f0909981f4323f2f4502d6980e20497bf87ecf1f9a392edef6fca2996343cf0fce1ceef95f664e275215e5e101e9ec01e5e913156778f91edd99d193357726e64915ee8c480609725f9e9fe4fbf2f3cb3112c91a9b1a363e14011023922aacf04272ccbf847cbf3e875c83e8bf7779efb5dfde7ee8b9ef9ec398903c725fc279eb57610da32a47d113f4f489240ae11fb25d26ac4343ac55f8a6bf4a51755063758a4a45ad629aacd41d541e84b507a1ad115659599f983754fee583c153b024a08e796be0335cd5a74797cb3ae01e970b8c611d5c1dcc9c9e3e51a62c2480be18561b354f562c364fd61f2dd46543a4b12ef5778c5b5daa8941611d1adfcf3398392188f9d1cbfccc934c03919170f9caadefbb273909d1734fb214f0434fb20d5ede3e290a01cc6f4ff20d280fd80aebd010a914be1169770a29ffcb71437746218429eead50f4572a33a706af4a7d9728ba2ac5cca941f4fd550733a7063066ff658aed6160a38ff9fefac4cca9210447ee8c486f304dfd3222cd629a42aa444861429a659afa5f423a0b2912a6898b693ac234f5bb84f4679afabd906e41b5c8c1edb74edcfe100eee34754ddcfe4a52175de2c3290ef3972b565d2eeaaa0670ad200047f98b69bbea0f424c70c5c2a14bfaabc2b6129c8950f8a68aac040f78062dc55de19b407d5fe1a380f7d0eca8ef5f456e5d0efdaef051d1655d06a0bbb9b5ea3146633762a7eaa23ca05850a0e997da95e5b12a9e895cbf73174912504dd80dc09b61318392753ccbbc71217841c44c07e770b1afabe6a5024c4d00d21775d11d90a4402f2ff5b7abace1d96cd623cf4a12494915bbb4d2e5958d0026afba984c5f0e27364fc1983a366c62cc1c1b4897fecca1355f691930a62ffab8e6bbf41c40a72f7a27361cab301c40ee1a91c6bfe6bfa5f4e97b1a176960a8f136de47cdbf48e37f2455432c12c5478daf118b44219dd4fc0ffec20654a852466e1055355f23de10be119caff145a2f8f8af2116a9f9178bd478177b905c15e4fef55d7425ee3c8c049c3ea118c5ffdfc6932fc44ff18555e36bbe564102d698cb7f4f55207defc90a631d2cdd5558878a343b44d23ee77d7fb5d2271a1ea2a74fc519bc17fdbcdb9f5cfae4f2354fda026ab9fd63796ed3b0d6ee738186df874297af5d886eb40675f91a2e9b8be84b7066dac6b70d1b366ac4eae3259b1cdfe7425f2a56d81920bfd715c081e09b7e2bba107c5300ee860727d674962ebbecb2cb2e3f183a55235618e59c0c598f7cc333d6f10384f3f695976b9a0ce051201a1e3cc3bc331bfeea52bf55dd1a846353612f33407ff5690aeb38c1a823a9fe2efbc436fec8255d0a1b07bacda47b9e00da780eba146816dff4a8f1387a879f71c6e5278f601d92af7f3a4462add22309c0ff9ae7afc7ce7fcd1bd1b9fd55b69533679301017989d68435c663d8bc8d275d060bdd9ab7f9186ade46a4a17f2435bd1483cddb1069a8782405a6687ed8781ba2112f037427803315856607fdfa54ec25343ce80c572406141f556aa6c02af60a09e8ed6822f8e608be4180e75f80dd2529108bdd846f7ae6a81adf35364d604c54bd71c3000628952ec9b390e4190a285c926733183a5543acb026d42b17d62319dcaa53c87c50b10082b9ca96d5bc8dcbd52e9b1aa725f561e54311d7653d569673e1587ebc080cc43397f96f0e5294cb0dcf839c092e172858a7c696f4e9084f9fe8bc3648405a469f9a1f35bb4e04c1f4b9343bfce953f1c89db7f3ea558aab6b30732a14d394c444552ab3d44f22c55cb2c25c5de7425f172b8c6fc600c90a8b317ddd56c2597856965d76b9ea13495d77492cc63aeea81a9befe7994d8d0fe0f27739ac245c49247179469bdc0672d9025a507afc02f4af7a47a7c0fcb504708ec104146051460ec6c0024b6a852f8c20a3074da820085470223944e4568f2e86b205a4dff130c0a561cc05018ea6a18b0176ec31e855ac8815e6618064050324b95557a553a7e555d227b2ae9ceafc35029215c63addedaf55fa143473a614b7df81409202b9e7d59807f169e2fa6bf218ac85bf9079a9652ef3ae414371cb764dd316ef8150b864bb825a3d7659c3d327925bb7d5272fcbb22c19e0d44569153446ab68578fdd276eb5132d856fa894769e1e95f4accbcd85c534b910bad0a205d9346d9a4fa9d573d15f3dc25cd2651c035af01c46df4558fd29611d6d5de2e7428fc339dcbe0bed8741625814838cae7df1e381001758e1e25a0a530248dda97bc7e0c6b3cec2797a5412faaac75a6bada9555623abb2d251e17f8d2e6dbaace9f2bb0cc5d9a504e03c0ba38d6dab018236e2ac055a6b1195558ba849dcbaea13adae399a41b7f0cd123a8637b9cee32a2047d57c3f8d39aa4664f049106cc57c89697226d8a980c2019f0baf2fc09adbe1f018f4c7f1e5e0a72fea6a2480f4d527579fa4d0b88c6ffa6dae0d47cd2a39904245cc074c989224652223490f5948d1840c9ed0f00111ba600115547ed8414a043e32e019e20726588d91ea77d9ec5461d54aa5b4ee347f399c0921739a6a394d15c65c2bd754e9b15d35edaab076f1ace461758f38f3194ccc4866860609851442dcc827856e219a307fee06660e0781810e4a20317c10a30b025cb1c41433a4f0a26709d7ab6dc539b1ab06e7c4a800d4b86ee0689cc46dd709c7db58c53c35ac336be64e8f1350310fab36307f36e07502fc74033d3610ead9ba894412dff47b89510198bcc33cace21980243761014b124cf86005115ff420f5c29432b818220b292d50e27a3569d406bad45a48ac2303dfd0100046d930494cdc0619a616b79902fc40dec5201b880292f3e7e2c4d027b286d6903b574b9f75acc894ffda4083b38a7536bee96796dbc0283e625371977ddcc061267c04bf60deb00a60a0649a520005ec4bb2921c2e03909570a3580abb62009238ec72b18ba7682c855d8e62251a2b61172b51721b67ac8157fba41a7e8575ac38e29bea57fc0abf5283b479a2dbf94c55ebb4614458878a23be69291855834b3eaac1283f824bce924d71840f16f386a91842a7a61388f0d8a896824b0df39813905e92633f31d8344d019b748bf504dce9133983aedd618a2eb2b87ff989cc1cfafd2398a85679f374afba052b7e598f2a47358ba5a271695cb2ebb39874036ecdb658d189a6a5472fb5b2141dcb9572bc72fbc7d2443912a3bbc6711347304bfddc0c621e88c066101122bca31171d4a8058d3070c43ace846f8e609473c1a57626d563d0d66a6dad12c01939689ab238eb3019f386bb60270871fb29cf668eea2a57accc9a00498ed5c0b79f68d83481a4bbb68de4264ec07a499ebd5ca6e17729ab1e568e80fe72f5c831d564009289e2294812c7541c53dd7e8e396a13fb8959eae766896c2c620d1b478d88164464f6e8538f3df6e8a37decb1472b971c6f939e745305b2eb445af24dd72070a9e650556c9d613d76155ab24ecbf8a6068151968bde4477b35cb04e0f316fba0821348b8769f27a56aba54fde6ddba63df51e8777a17be2907abd891f01fa6bfff3d3340eeb75bba461fee58bc0bcc08851e8dfa09920f52246f17ed52b47b56c8a4446407a5fde4bfeed496f010585f54a8fdf7721bba3eaec0e8bc140947af5a9aa4aabe5a9aa1ebd0e8916edf1527f8bb25095e912482c716b0b762b0d9cbcbc3fa5b445b9d5c34bfd3178a949f6a9bd82f11f9f79e979c92e175d59242c5f6fe688aeaf28f59e3e8973bdc7d13ce616a1bb955bafbc577ebbf9bdb440774f64990c4280e42c6fafa80b0633a757d384c544350fb3d42f2f9c4769af5ac6cb2d4a6a5dde42fcc025a7eccebe6ddce325ff262c56bd2e3294564bb5c32cc565577665974c7955956a87abc2892c5790614418404885c270c202278ab0c31448e0595aba635794a7b7cdbb19f81f05dae7b76f87d4cbef7d67044955b7779cb20f57569d81d726f5084ec19f64317bcb028261c9f026e0f7def3ec7eda15eb746255f1cd5655d6e5fe7aa2848b757c897913032ef57b1338d4f02076a7e50a2e874c3945e9b42207555890bae17b35917ab17553b5349e164e6dd20aa0dd5d764f9f6ca0a072c65758334774bb3e75d6addbd1c2f87bcfdefb7b3e015b3943fa92eab05f7f0b857c3f64bb334fb64ae647ff83f433a397f91fa397118bcc3c4946bce1f565c299228933d8af5fb70f7d902353ae2583689d02bcf9dd28ec94138874597f446d97cd8515fb0aacb960544b71a5556cbf3e6184d775c09d4f14618cf12a80734981626bb5b576cccf34e45c3d7c3816ab874bfddbb66d20e85e905bc9b55c7d22b5a00be51909d8ef5d9433678999139b3958668e9d62ea702abe616223c2d4e1a2b0d2284e4a973491636d2f8eb5bd5cd0ae15b92a1c8b1b82734d1387044704a7b24f6a4145f404b1c1609eb8d7d613a5c73fee3b97e99283e684793a639ea8161473492da86a41bcd1da2a8ee55242774199a655adb4528d56f7e9d39599638148245ba5b7682167509333a8e79519348366900c08be6c2fb055333232346cb8fbbfb440ed53f02cd7fa42ae09e7e28c9837e0e59c4c533f27c6d0a3c71dacaa556fc346c8a954cc6a61f9d1520a7d39442d882fa90569417d12c22f64c8763b8b79d33f84747b8b69d2ca685477a9427f39f83b5fb2953430ccfce87fccfc482c12c5c7e8657e7ae907e965c422a430a2d8c192d44824859cd0a28bd44c45d962a919166fdcc0c1518dfddd7da2b3caf5d744986701fdc9edb54de98f878deba293d16b8b396ace402b36962b3d220124b7f24ab338d2ab67db06e08d59801ec31d5598260f838c97869f56db3bfd43c36297b3e651f5b803a7e272e04ea0e27ce0217a001e83f607f0e5a83f0002d8ea6509547af5de7a0cb02da02776c5078beca7bc33ab64c553eb8dc742690bf0a9541c4bdb324d2cae499ff865e8f105bea1f2f22672f0f22555e860327d39ea9b0a50dd45fedc10b3d4ff048915b704c7e29926252b8ec5b1381607c5ab875c138ec55241e9539f4ea4b645db3273bcdaefb7cc0a7239cc05f682675bb92d6180ed354df592db2b0109d8963002664184d633736614b7df71608e0404d883a360ebe276184da8ac954137261babc7b900c90eda545ad0ed9f4e91c680e20543a4c856bd0a33c7bfaafe1b2f87fc9575048ed5a3571f575bb909119e391e141454bfb7ad9c49ae8a4bfd323ffa22cc2313ce94d33b22e2cfdc4e8fbd4de991f9e9f6da60bcbd186667d00c22324bf6d5e394ed554ffea22f47fdb657a3f82f8b1c0fa7721c801b6c7b71aa6d4a9fa6847c0aa8dd49058a206ebd330a15f45c242d1d5c978757c9b138ae19e055f7eaae008fc1d02be0cbc1bd0216e0ddf884bcfc90ed82e596c5447516dc0d9927cdbc1199273dc9a97a013e482ff346667ef446482ff324a7ca41e3ef63f433ef43e6493f3f1a176118fdccff18fd0c0a6291283e667ec83c49a4e19f291a621112184478a12535236e3040c206a9998a328e577b2d0b308bfa5eabbb8eeefdbff7d7f1bdbbbbfff6472e8ef69ebdffc2c621e6fb7b079898d009e689837918916428db944d26dc625ef2d24bc810f06e3998a6fe0d07f3667b85dbeb0774113b2636ac474e1576288f439c8ac7439c7b751fdba34fce42494775afee3abceb41c0f33e1e36eef7ad2a556557ed19edd990ea087d7dfe7684be8adfa346b363fbfa3ab6afa20ad3a4fd913bbf5a5fc7bc55540519b9fe525f8e4f74327a2e7422f33262975e6eaff2e525e901dddddb6b836d3192ff809e18438f1e7d0b90dc7a3895a3b6924bfd562cc592c56e87e759805bd973372fca6d8b0d09f354cb4d0c1e622bddd62c1b182d32b69eb20973b595d96b04e616324c14cf5c0bf0e5df464c9d17f8a6bf594d668e3675fa0adfcc9cfafd8d03a3b61c9bc3aff261eb2460b93a9d289ef11732b00e1587f04dbf16e4a52f18a599314bae6dadb65666a222328475b42d5a90a3b61ed7cc60d4260497fa9dc18eb3da16217ab42dda964d089edd1e31c6b8fd9e05a85dd515d6e9c1375c30aa9370c95f601d37c1ec2d7de5925dbaa05d4df49d69eac13a0dc6bc49b25d2d44903ec9a95e1b95b9bdeaf76f4d6c3998276ef3811233c4eb36379d5da4712a47359259eae754cd35a7ba2a6ef5d8a447d6347577f36d2dfdd363ab462a56a9aa30c7e2588e9add1cab395673ace6581c0e8c8bc1488e1552c1344389d2d515030149b94d5d559042b76edadbf7975756122e968b679496585c06561f56b65361641df7c175803b7f008ca22e1fbabaa5c720bea14d601c744e45bc1ae5af245c350cbea15b82baa472ddeef32a8db9587cc32d9e81abd6ca7229c128aa4459595489520bb0b29470d5baa24df8a6fec0a84a9bd0aa9a26308e08bab409eb5424f38686517338624473a0aafa435d510a344d14688645055659d5e5251a2c2a30567535a1b12ebde4aa9e79a99f73146c40b12e5540ee4882aaab71e05293314797af2890a3a081ec6590c43a347e307344395f05c2ccf1668e76c5ccd92a1655083367083962bea3f1328eaaa9f1d54b2f3996ebb20ac356e88fa700f3647d5af64867f5672fdfdb562b6c965ebe7ef712d219fd29fda74f33fa42cba6b3bf2eb20f4cc8311f7c0ae87227155818d7de19859230fc5b304b07f261a2284f1075e528da64967ab3e2d62aec22ff26334788e88d983942be23668e1017ea64e608f11ee68568f4c9cc11b2fde8fb690c668e10fb33df4f65307384841e85efa750668e10ee53f87e1a65e608e99ee6fb3b4efbf83b6e02a0724f112c8eb112e258b9a708560eb77a2c82613d961e63c2f1cc4b9cf7b0cd14cf5af5aa2df7712b5a8769524d13ebc08a9dfb7254a3804b8d648efd65cfab07560d7c86d7d3a3e6ea523f7d59e9b19fae401aebd1c7451ba8630e7dc7d9af1f815ac519f8ad48c3d96db3eea1ce698b7bda03187a9a10bcb07df72f7c088888c0c6ed44927f1369eacfdb69bf85a190ce71aba1c8d52850f334566356a45068931e7900a9ab890ac0ae56eea90eac1a0b32a23d3d5256cfa54c78cc1e5c66922a719bd62a8da24ab013b7690f65ad564b58874aa1f404b3d43cf404935907d3d42edfbcaebcd433871d0b97b9cc69a594faca7b9cb5528119c6d4f572980e9ab56ba300f938dae66bbe04a08be344ba025dfda265f79d0018e656b88fbf7a749f3ed1955b314fd40797c2a77015778206416d441a8493db4f9bccb19fc65cb127d3c4316082ca6ad092b924b7aa37bf1d1d4d7df18fa46c429afa357f24d5bdd808d5781bafbdf75ba52b0069ea03e0e7bfcdff081f00a2111b1fbe8d68248a0f1b1fbe911aff3f53b6c6ffc760e3c39fdf04b8afefc3e66b5e0b61b0d9441f352f8a456c7ccd17a9f136343cea6fbf8933705f7f8644c2e9a528f569b6b7f14752349b28c4478db7211601528199a281879c413f53e193cc53438cc2fd4cfd937356239c291b62c7c2b05f5ebf1e35be5d8eaa21da1d9dbf63e1c1ef2255027a29a38fc36dc299aaf16cc299226976d0e7a74fcb9a70a6c04bcb4a55000ab197a74ffc8caa112990971a65431b8a1ab15220206e7ab3e45f0334f24a5737852c723b292e97571627d21480366f23728c7b8570ea743500a86f43bd4604431b361bc05bdf26ac624be93baf7397ce4a23313c739b07bf76d5bccd9700c8653366a7ceff4b98d8d404a0bb3df2e9c41a54615e72d1b0fb5abb2a80134da2c26815b79fc6e6d85f2376297381425a308abbfc76d0ece8ea7722cd8eeeb9e74492fb4e64d9914bdf431a3217ecec87e6187a0f77c870c90c5cb7a2939ad0d73448a42900499651205a06b7e8961e1bc85f639754a8c800d63f5dd8483050b747e3762209409bafb1e97276d0ac99a2b8c3732365f349b6d4ce4e129c948dff0fc5245bcae6c92ec90a3b820d86f0c5113ce068319ca9309c29f690747f6cc2af3eb8fd36aeb8fd352a106e7f0703550252b1673d963dee00764f763901b2fbea332b450108a3a263e9b1fbe4a2939aa7405deaa7406510adb4e451d1fb0b2eb8d4619ffaa756b9fd5d571376ca43e62c401cc68c693aea610aee3f7be4f955588d735fbd72d50760646328401609d0d5d45885d53c3b2a8525ac70410bc6e881072aa919c60cca1d902044154b6ce9998b6ffaeb4f85d5272aac2c4b2dfdd36539eb138cbf0002c017a068e4d1b03e314d504c139569aa52a3a8524c53ff4c585188ddfe14a6b8958adb3f3281cd9ba0fa3c4d386f0ae1bc28dc51386fcc57035fff38da5100d200a4c730881140ea277e11522fbfd7237dd61dd2f7f3f9ae344a04d2a314d09db1b84f0d8acb749790851c1f9fcf8775be20f6bef021324d403c304d23f0bef0668e22e7ec4b0274b695728b75aaf805d12f885b4590f5003aa55dbdd6ca20a5946ed66ed66a4d341e4d157a4145f88258c72363de38caebe26bc2ed1779b369ca5203d0436fe53eee43f2791f1ff6c1623717bec23e2e3e9a943e91deea6aad3e41e993ab4ffe9a4ae5adaa11506b3273f83573c41b377ca0a4512211932ef5bb965c1193295a6836602144b9fd03cd88dbdfe978a0bbdb5a6dad3a1e8394325931e1664c56170b30744986c2e4b6c8c5805a39c602a471c15e16f9ca85b92443619f2a20e9cd180990bca1f5895b6880037050ef562f65bd07681e043e091cb95d277e287a896e3060e6f868619e2c20f658ad40d29b79334f4ba32c962ef557d1ca56000aa13d1cc557bac4585c9e7d1ce5227289a4cc1c4fcb34d9609ebc24ccb1bf8a446fe6f2172de9d326aefa64454f8b37eb910620c93e325ec096a3b5a7631950a9d702ad5e03dc7a0ef82470a4c3f11cf215b11ab593644c45a99f039f918aa2e57c2e702256a3a26cdf2f6262cbc0d1d67e4abe906f0b2db4f0d5dfc23ebccd1c8d7df0fd6c051be1f63311a64e65a0ffbeefbfcefbbeeebdefebbe133f253d7a40dde702507f3978dab07114e096db3fb341d3e46979212da4bdff747859a6a9df132d16d354039f719db8bc3773948bc8db0682246fe6cd40927d58674bd7bdd73df8e5e8ec1042fd168ba933e74d4814c2328ba54fdcf667e668ff9c4882a4cbb547983af51bc83405a161888b08e68da6d2549a4a53c2d545db51b968aa93d3ee9ef928827dcd344842375520993dc4711caf9c59641e7e07997b2ad578a6666aa6481b22b8d1d13b225e0ae2e1619a7abad4dc038fac1f6ebf0301e40f99871cfca2a66995528d52ca57500e02bf6e933cc5b99475a95ddfbc81086371a1eed41d76a3d334bae93003b6853acc78752e285064503e1d66b8a8c8f115fcea13d3e7de4b1df89729d5a856352ac30680a0be4bec1636def8588fa11a528f5c6343eaac11b98106bee967d80d8c622934b1a5a06186d10101e42ec93247f16a25e395cc0597cb2b2852a4f0ab47660e7d3acc90d2e3bc52a4c09c5f3acc80f915d0a7b8a8c30c1877faf83bf6dc0ab0be0a304d0a14d6f8759801a54f0c654a4b6914afbad42e3b852dcc863acc78b9a0d84f8719505a3dceeba22cea30034a8ff3f2f4785d0790c46166666619f35ce6e993fb78b44bcc405adbc8a09b2a90da488b8989d162626246b5d65a24e62bedbaefaacc0c5763626266b81a131323a359ab590b96336699b05334424e714e461f13cec4c88822cff31c66cc039181c5c0642ac93e4ecce3e84dd3364d8b7112f323999066241619bd8ce87f24e522ba60676de86d88768fa3ada68920df3808e3c1e83c60540140eac5849df24f87e85adba34301d8058c8220e60fac57adadd636f357814e01f9626ab56ab55a6b2d7566eb07183d295e068c9e248597674b8d7ef4a4cde8452b521d258df6337f24152313f27db94d76cffd26aa7b66a9ff138944af853e4635f411132333e3458fe732532ea290ec20602105c99870a64694d6eadeb675b4f3686262b45ab55a3d09a0fdce3dd076959953a398a8eee91ddc7672458759ea9e7602c44b2dba3161a7fa0b70147dec19354ddb346dd3b45aab1ddddd2da9d6aa6d5a1db9a3e155d1e3680ed41ee6cb217a8d0bfb7633de4c38123d8e9609394523a4f131e18ecccf7c9646582466fb1e32802ea06a9a9030195301fd32e10bcc775d0a1e7fdf736837191a3396c60c0d1a4fa241e367421ad20c8d297daacf7196e32cf71d450a5eb77e0772efd1fb7d396a4fe9911c7b68e83b1462349890e4332e3f21156a1c5af334ae52e65aab68b28ecbfc7cd0a2301b10f39f8a79d2e6ce98276ddc9edfc3eef08ccbef2196e14cc5f4b5d65a6ba7b07a381513f26ca9989890555ee299a646018f2af0e1907598a69669618924b194cc1f497532e1e8252f35cd8c38f2d3f0a390c6c7cc8f7e46c4a1611661e854ccc78834c0fcc9f1365b666b7f7e40700febb4ea36cb6ad03e3168222eab47ab55abd55afbdf97c38aaab63d830c64269a595614fe4f14c5b9f1ccd24c59b19aa579c94dc7a21ae672806b4311dff47b6096fac1200388f7788ff7dc9e5ab5da3c3af6fb5b499f9cff37201cd277369e77352c6703f64906eaddec6c78f3d3718475b7ed39fc5e0b45b09903def0cb415f268c4902b81989098bc488beaff4497b2a3ed647ccccc7fc91d428a491118bc8fce88fa4445f3813f2ccd3103926d2d8e7d9cb84343e68bcccd310d947a4b13f233250909768ac0843a7645e46e4f20b906cd89cc1bc00cb9e50ef00043273ac112ec936bc184d08b32e7f57c3491683ccf27ac39e682878f491e207241b0604198442df01c9be02e4de79f02b404e24493018ccdad79e6c2b568b791cad855d0548c788b34b40464791bac43f8e3837a648f379e90a0c61bdd2c9200e08f4c4419b72085040021b6b868119abfa1360a496719c357a279a533483f9dd1776aa8a18f357a9ed18eb585102e00cb5d23109b08a814e41b791cc1b0e2307ea31d0ccd9c265804f801107023df689027394406facc7f94ad6067b61a06db6cd806c300e010a48a0c77e90964d011c2fd977b14a977d1adb72190306e6d8e29b7e1cc7004f0c78ec1ee2135d0c008f3c401c5b619fea5edd196c29dc0b68e6f497c3bf732c4057ed3090af66a97f56b9fdbea551dff7096643dc995fe98bda60b3d44fd202fe38966d0a58c5ca0c13b5cd66538c399b4e98b31c6edbef18ec48eeeb96300857b9af4fced90cf583d0b0fdf6dd93f681f4b8bd7d72ceb69fc1d2e07d6f1b08fa6a929e57aba87e95069183b6703ac1b5d200a4c70eb2c18004e1be1c95bb93ca4f12ee76271515eb92be0265be83055872777e3ada4a8fb3474dec2ab1aece1c945be9d21413e53ccc2a3838a55218a280c2cb0be731238030d2f4218033290ce47c49069a7cc3e236db66db6cc6ac6d034112e97f1c7998c55e3d16e38e6d2c2c6ca53901cc62c5d023ebb01c356795cd0aeb0a0b8ba8ba57771190974aa84d9b93f4a0a36298f307dfb8bb804517b03af5ea5ebd567772ceee6c06a19c6d403f3e9f3e7d7a0c4096bbbd85d2d6e2139ba617af86cd9aa627b408e006f352e3b0c267b1582c1af6a5de65f418d4e3161e9eda3cb5bfb7749f9c631debd8b6bd281cab74325e4d513aead6cce9d6cce147f9922ef5a39c493f993acec3bcf1a165703b6c56f3804e9d0820f360897901560192db6c9bcd1cb602f4f721807c99dc253d6e33efb93a5c0820b9b1602b5ba54fadf9e3588074636d2e2b3dd64a2bfd1e47d38e7d1d8bb1ae6c20e947caba9b38c3a922c929b9fd130685e54c6a15b955d7397660672986b00e9331c7e020efd16373dd3b17de775a907b88db7a9ce3b8ad0b1e75776b415a10a80569646841cc46665ee68d907ef4e4d6d3a327bd11999f7923a327fdcccbbc0fd28f7ee665fec78c282346f121ca88518254182061834f1ba3fe0a5347db326ffa51324f8233e4a348a4b0392c67e0ffbe3e39defa7d90f17212c0efbfc7d15f38ef935a50c76e995fb0b11758e79b5f5c9eb14f51579952bd7479d1f62abbfa6fe5cc1175e7a4c07130c13ce9304fdc3b104f3a0b6eff247da78b550f8c060addc8aba55b494519f8865379894bb2c59648b2c1b629e64d3f135b1554609a195ad096056be19a702eee555de4585564209ef548b2ae056966c058a78a7d65039aa62ca6690363de6c5a8811841e3f5e601d2a6a5b7afc6054073aa06dc9326d66152f04a107739621266aebf19e257a90d8fcc9ed772413c5a950a5bbc079285d872dcbe4c0205d326e3ff7f6ba5bcc5132e0f6ea719ba291314bfd1b129e1e04607b6d2f9c7164c1ab95a1037d4506ef00a35a8a2d5b6efa8abe32b99081b52dacf3828f1e7b6b4d930bccd89e4c203619dca65bcf3435f53a06b550f4332be9bb1690e4589b3b8af424b7f5f44948ddb62da6a999346afbe95293466d5abad45fc5a895a854add347490e99a211010000200053140000200c0806044242b160aa48d20714000c79a25274601d09b424c7614a19630c32c600010001110101b46d009401a9289029aa0195708f1d7f7b927cbeee8e4ae9eb2d6ca9efa9a83add693a86a9bde55f678bdd31941a89a927c38a6210e8af6e425497613ee59e92db84426b1242680030877a559ed27464824cf454b88e95d2411a4d05eb4010249f904a9a9258d48cbb0179366a6d5670163fbacc17ff732ce3f08ec9a68f01c177b3362d6d88922ad83f017bfad9e4a0d0bbc62a6324be0b4062f98f818aa022261532dc57948a45d90eac9333061de7017a764dd574634a1066f19c7fb974e7c02df3036e3c18080b1c39d483557c3c14ab3419965d55a21ce85d65f9f74375587ef3a337e2cf6ccf1bbda5953ac941c48962f24691fe1bbaf8a2cfef65ea7e1cf492ee01d2b6d85cf1ca7884ff775736b77b41f1450cc6a010d4c73cdedecb50b5bbe9cfdd866e3d12f240b3adba77e6e64cacc9b21235ba47bceadd260be05f45016dbc6db9bad54494e0bf42fc2dffb4e65fc143d2944135a4f431964b7ec6304b9348cb04b714a4991d677c70759d6bba11c7fccd4252d63bd6f8ae5c4f9c82e463ba5855905e508b777b467c976ada9f462f44a6f955c52b149067c317d0bdf0218b447661756ebb409bffb565b05a5bb5ab603af118a0da5e144f2e699319cdc65615334c887a69fb852f5f083bced94dd68fd4e8adcc5288135afe5a4b08e05f0269d8ba91fe0c7f75fea251c9f43c5ff42a59c0b68655b1d84a6505b35f42989379b1819c98c5a7109925a1b2f1e4b34c79734ca22aaae30f67d2b6dccde1f6f94e43060dde26212cb8c3fdcd89199dae209a55cfca2f2b8b88846bb0be56f4f84e7aaef8dd37689f63e36e7cfaadf295ac2f578b3ebe6fda7d6e6a15c2be7168523237eb8d150c4acd73647ee05788c32d114147a2f62acb8f5e3c22f2d49a80c1493cbd9aa13ac827f9668d2d44e1650d05aa6bd4edece8a163426960ca2a36acd5219e9b3518132d7f3e1266d3078b9860bb290d946d9929c60524b089bf244f93fd01167129263c4977ad85beb1664be171d8bdf989c710784cda856e988340ba9e45411988cfd3cdbc3ff48b97c92226782b90d26abafcd600ab12f429fcb812f84da1c5582f05a7a008b1a64d8f898bd6586365d0c47e057a9090df435dd771ab6bac2cbb855101b480ebdb61d8184bd48f5fe4b493493ec037648a53bc572289e1b21996aa88fc94c0689407a272acee85655c050d616c3033ab64652853590c31c09ec1f25206cfee9c26b36fe81b7a08db50b0d662a516e0842b380cb44d52783883a51f3d84903f858d3708814e85f70d5b43dd822d40bb155ab26e36a28a24908a34520c30ca9d5d59d6dd4d7a132bf9c435d336b8f75b145364854c2b5003e26392c65ad662df20cd402e8f213d8e104fe037c5914a46602298256418d62317dd48713267597c5c2a9e95d98e084a946f22a48d294dc73cee56902c865e134fb1d6f5f481d2105987c29088278813600404de3b7e902912e7a56bcedf4e33b97dc87b6c3931150109e26a9a117712d8e0fcb44bfc2117e90c49e24815f04ce8bfd8b11d1e7b9c7a6736f6b2139ceae4fc05cf82fa37c6a74a668e2b44378552661d0747e3fef689e5d58890d6c8b08a35465ff44284bc85e453e31efeb414fcd255c877c56a6accf368c82134c9ecaadaed5323b80699e185819146401d51b23606bc563b2871addcb5986030900285785a48810b03a0600bd74c1aa0e5f461e0fb15d87c2933b88de7c54d666e80c7cd2eeb342f36f3f74f0b17e30daf6fb27b2fc95e1542fe704534204e731dd553e7acbc545ab263ee02446553612185a41ce5d2bccb35d36976075fccddd306be846a8204184a9a9ab1caff3c4ae7feaa560c280b5e0abad8e72c85258f12cbe9fb2d6a4cae54cdb2682c4a170bfe475106f8c86bccf8098b1ac2f184e23cc817c55c11336e99a69f6c5f7b26d299d61033c10e2cf104fe27681a1f6076021b1a4eac9b38063622f25fffc3215bfb8a7a6629908dca65b000c40d5fdebc8c307038fc7ea82d309e49e288b5288396610bceaa325205255fb0b547938f21dab95e7209ebcff632835b3c8e9ad79c2e78b69c72587416794212bbc17347558d3cc383dcac5aa45072fbbab7013283d46fecc7818e224188e81dcf15b6fc94ba271904231d543098215746f650a244478005f7eb7e90af820e69e215122d4ee7a7fa6faba9ec94848be9b32b56bfd4e7fba9b3fee47752b6edcfafdd685186262bf9dd4de9e04c4acbdbb4e4009161bae165325b0e9343bce191fec2937a6d34878837aec815cbb2b56cee444d6fae3e204036f2882bd0e66ebba8ae209c48d82e3d123423401218c6a234f69228d6fa1d2205373aad8cbe579cbb13d17ab6fbe4e2ad2fe3ed695cd717be922d166f11215e83258a1d55d061130ef94f37baac27541380091a4c582f273b452219690407068266005b962a45af53247595b1c736f5ed291259c04e347335f6ac932c24925dcba38b79669859c872b834466452a84c18be23c137bdaaf2e5ad9001dc188bc3280c49fd46069d00261222a1e0e0df95caa9af1cfae591ccd496b5c044b299cd20bbcf50218d009e180dd2a0eeaef604d741f9a957d71513c9398b8dc1c61896fe590bfe70800d498a40de685254abaaf7582a14e5c191da8632e091ff06976b03fbdc707d21ddbae978f0c007a05ec179cb52c0ddfeebed8ce9321642f2c5caafb350ca22f52adf4fb4c1464ba92acfa85a1410ea2273cbd8e77c53fa1eb30b84a7043632ad68aa59cd4a34ded78445e2b8d38644571b349f5764927e88d38b13532aaafefc85b77d0bc9709724522639b3ed35cb64ef22de555afee6e57a42dc4e49ecca228ff2de9d3c213a370c419fe89e2c536bf5b876ccd3af70d9a9c9305411b082a2e579c08e31b79a420e57f85cc26262772767ae432bc27a612776d5171b8c5685681896c0080c7fddd7daf8567c92783dd7507400168a173d4ece41ead0cb9a1e8040a9e4fb552c51da142a179fae6d6b82536bc5c25699bc674bbf6651db720feaf662709bb7960f115c9ad6c5b9b37bb849005a76289cba8ca372f78d5bf17d53eafe1803122db86766bd35ecd8846d873dc58dc8705aa7da081d09d5a5d53962f5dfd414e408a7752094415c0e88490908dcacfa914c00e145f09c6aa6b44834a1c8adafb90e28d5acd874777e38f464e34689d5699dcde85138128498704dc79d981675780479b800d06330553ab2964eef7574951475b681ba1435ea175d8ae9f025e6e90339dd38cb143b9a3997228444fc3b59937888214b801dd2720a981ea81437ee2550d78d9f2eb7c221a3f251d7aa29eb1e72d4443698a617eddec97cbfd64ed0eabf4f31c18c916c6f5dfac1b0f23d550bc8ec672e6df7f76be4c886de70b9012db1ad4a890fc2fd543715476a6055be749a1fd52f2d2b3d3287d47cbb1b13df7733d4e6b5ec63916b0895f29791508c2b50489e3cc084d7da5a62fb7df3a8c3924ce0bea6515244b8d6edb67be8c6830ccadd111af74c40f03eb4bf0283b220921fb1350e711f08d0ab17d6b30d370ec34980db326b2e078bdf3e1585e874cae77b4797d36495bb809183026738a95b385500118bdb3fb45cc3069cffe1254c9db2894db38c760289d636ea8a88aec4379aa1fa2eec53f04084b2a2a7d85ca41d2d0a1f92a82782526e664357d6074e783d211f453688a683ab5c6225287676201e5c60fef982ae4fa26648a8c0cf6e98817c5238d5da79e727b3b6203ff81eac4cf108996ad2e8507c0bec93373e2723bfde2373fe8588e61aa70c1a789973e923ff5422e9bd1618cdbddd6b64a71ab969933931cabce0848f3b680b570ec2d2bd5f6805d1ab67e39b1447c0a06487c56e48041f4b5f4d6d979f479831a3f7c1f8e61835fd928603599cc9c0b06055af88bbc8844e1e6c8f72d1e7838a385ece92970f64d5d8b3d0c644a8eb28879560e19c83102113ca5acd283f6fa816d9478708f5a74e440040de8fe26436c0f3fb75bc97c36a7f39114414ceb78bd952a994baaba231e11e1b898201f612d629c0514ab5a0b82b1e3d7e6604ccad98797749946684c32245e3d6bd7afa49400a92e0ac2b97ce1f2c186714aa1a3a61b320c9332cc04eb92f76a259deabd42d628b5a6eb1ce1de51fbf9cd5e88aadb4ab076f1e38ccc894fd8a79f537e683e8260eaea963437069dd8bee9314dc4bfd6e008ec9af35283a287e43a1d25a547715b35b5fe287de065809fc425d2316e2b917fdbc5135fc9cac5354343d2c3324190dac6a12dbf42a126e8b1da02d63b87d4f53de9467c8b82da12a0b12c6fac9cedae63f7037a2a76c3e81679952966717a0354f119aac5ad2a88adab502e068131d3dd534cd0e03fab92e2cb3065cbe194d5a4ef32109969e43a69d99376741970a7c121ce80fe009c0129878e29549177a0bf2686dc0e9abf2cf3b33e8fa731a6df35d879ece44745fbefff868c444030a9a9544e1ab84a365284e0dba1e89e983983fd28d5deb2cf3b0eed278956094448acbcb5de5ad8440420cfc33eca0bc971057abc188bb06e432a00fca857138a21f3cee03bf9404ba7834c03ce54efaef1ce91d7d7803eae38ac30093a1db4cdb496adcb05a592ffae479ba162c9b600dbe744681b0ddb8991377842a49335f08dba54f5f68f29e60217e4a1c02ee6709560ff54b8406585545aa7274d029639edf47ebd4c7a503a9ddc8949f849554edb0816b868dafacab0f07ea4c6ed6d78c0dc516e9140f5dfb6e719ecef21f880db73e08093bfbaee0dc6341da87e5834c13b48238db730929c43ec10502ad095c282ab7692a7ebbbaf7e9c7f378e371c5c6174c858d7786c8012a9c61c33b3eb860c759ec9bc211115f77cbc8eea44e31f9f303221302785530c16a3ae0b9dea4fc5759b561d00db3183f29afc2d1869e99d87995d34651502b25a62203d7efeba9a4880ef7211e5d198dc6630798968070292d2fc435310c27fe2c7629f736ab93ac334e82b22907c9569703de4a014650e654375c46a20da32ee25df616a7da4b7a3c0f60b3fe98ab79c4e3ad77226b86901218448b76254dd6a1b7e543c12a0b862b8681eb8ea0e68f8caae5d200f021e62757de02484dcb3e03ef973cf8b9d8fdf47dca6b121dc077723071cea2655ca5478f94e6891c77e3f10554e559a234ee1148c6e2f6349884d6c54d34f6025ec45523b26b1816b1cfaaf67a7902babaa4aa73e3322df5da04e5adbcde21c065b6f8ae0bd6f0f9a2a636859477821ab6cae744b6245320451617a635d7ce634508d2e44a6a778dd98ab61e2bdebf762f827d6daf4961f2b8083a9a863897e1d5bb662489db8d645f4391ec4ccaf1619744c3c4c89098eb0f6a50ec0d2c6a44ff671da3104b40b70eb3cd5dd44b7752ed84ad17d0d4980851c449e4be94f55f343a0e772e9b09584c2f12a2fd696240becbf642778fd886630bcd0f325647f5dc288041220e1c68e5d4df73e521621df0e9cb896ea3d531733a1eb43c61a61f3fbea00d738820a4e426b4569c9cbe4a6ebe914a176cf70afe50b0459a49c9400d230e5848460e57d4c379e2d42ebfd567dfe3695c2fa3f4dfed750316649e850c6542911e9379f653b60f51d66d630689bc4a68687c7b7eaecb5e141d7efb2c0f05373c85a257686241717751afd494760e7b8a34a935879a34f817079c391e74c0fc6b66b999d075b531ec249122590488d56d7f876f33b549b54e0a6f6c327508974643e02b7901b4f1e36f10cd46d428b95c6d12950e222bed08df3fbf86d20fcba1b504844ee759b0e3ca463c4f99b532d6a31a5915fc2e54a4208c3a4d72d49bdc1facf0b6bbf08e03ce4d07f6e5538f2b682a284ec162dbfc8b55327ec40331635b40f9a0cf9cca068e4105dfbe286143f7fb33f48cd3fd4483eeb6fb322e89ac2de593c57cde1be6745c1eaf4e1396d15169c4ae3ecc887e240db9ae0e4e35b5e215a9974cd543cbb046a3a3680346403275d7d5f2d2f0841d13af034f3f54dd981fb6f194e72dc0cb1df5461b472a788ddac8095a2d3667ca4bb84a43c91d4d2443742ee4cea4dbddc2a879b27385ee58403298d7d041e4ee904ebdcb9b9caf411fcfa78241623d717327588c3d1a67782d80ef5a75e559a824d621bbc4c84a8e6ace9197e95294295f4f66d01f7b1e32cc5b38be121de168aab078066db07734ca271bd3579dea39961ed5f1d0ee25ffe85242a66b450a21e4a544b8786cd5725f5acb4d8b5ed4c6232f0cdf75332abada46eb2cadec84cc543c54d31579d79ee8888fa212bd9f53e91eff9ca1c7390afb101129f4046e0480a7d1ae64c682b8b14c41318b2ac8db6168dd5c583ef10419da6677c15b880eb6d5cf91e93c4f62f6323e6e1b2e8c6ec4f001990a34191d986c366f4a9f6196f7c15173b187b3c72c9d799aa66ecc20efb0b4d76074d267dda478e140eb191115bef03faf5b39ce5a3ffc73ebc77683b6df3ab8f901234c557db2ad2595aba62579fc203650b04bdc8d277830156ea02370b2645df878df4bae00a1bb65137805f7fc237ad08fd19a4fdbdfdbebe0fa69b81dfab3993b5a69765b405f3e23ff0e39d1a0bb48279f27d37221b7fedfee9f1fcb326fbb44c50ce84ac61c435120cb41fc8402b00872d6fd27b0650e0a92e074c014869c6580bf5e4d4cf4755ad292322ced4d7cbfcb09285a76048d066947a23d4337fcb1cc4de14d953bb1bba1696c043b9c536a8950eafb853984f5036c18a0294112c2163e83c769e80748366cce9c17ef3a9114a2cff35268a33639e24f8ac35a2ec47bf0b106928784c2aec371ff94191d7ee808010bd87b390ee897689758a2d3ff3ccfcb849e12549f3859c92811a8ea2196f8ade731e74599dd7aba9284a4714e870c0aaeea8da4d1bb5fc15dfb430fceb40f5d61faf548377221120b1eb5af8a60c5ec84701e118a1804c355571cc4d3a314c38862b4217a802082b14fe5b51d9215b40392edf27f02f334110926bf317e759dc62f1aea88f9cb9508280aac9e1c9db8f376dc3df476214d724323b55418525125f441f692ba92f80b5fcb76aacb81610204f292fd9647f3bc918bb72685b5f9b29e9563da56f53be0b0f6f1b9948d120bb38a6fe79eef30887c9af47ffaeae811aa5a25933377ea90dd97d0aae98283cfbe1c16efb5f3171f08b7496481b538a079e3ed6bd0df5a72467288764d38dd7dbdb3cb19c8a255c41e8074eed084d7cf5c5a541873f5afb5cc1aabd0756420eabeb2804f8c6ccf0ae64a5f72dde4e73c6338cc2cf9859e369599971739b76996fdae4494b2489d7e4734808ddaf007c1a9087f0988c1b1fde12647a5c671637e5dbb9683bdad5edec0b7fb37a9b00fa2ba6140542d09f60d8cd5e812ceac5e3e141442fb061541170e8742112f3e6bebc6f48784005050cbeaa683bd961bbc849b2b405d9aeccc1fd281b39d317527065609da7add61d466339dd31f520c752c8743a6c2cd574d20fd48260a4d0d7c3877a41adf25dc096ceb31416cc5d9fb4b546d26520fda27ee49bc158e308012562b6106b56966844efe5f9f8f40d56bcf1f1094e2f8788bc7cd77ecb3e109d63c971ee9f817d8e3844b4f59865e7a420f5d2ca924663a49e35e6809fce938e6e2bbe5096cf654c3096b4c4fb9a087eeb865cecd5b7baa0a349659e8d3e7405391ac9965f2e425930504b0b75f54605d038582e03d8e888c667c06b4dd2f5b0320d535b7f2555bb94ec36acaece52c090d557a6dad1da4513ca1961da8f01b7358076e99b430b99639f203203ead61d7b8feec3b9ce54455118f13c19830d66ca8e78d6b272248af7fed1131c98ed9bc94142e488891c480d9bb40e33cc96e9db2b7a25e3689690ed3d19d8a7049305c46172fc44173f6bc94eac4e8c1e4563fb38161107348e2a2a42602902b5450b50ea8f5b44fedc2360c4c71ba1c356445d076d7c77d03c52fa1575c31614e3e762ba57c351a2e758f133429f2ffac0ab4680a7a66eff4dd74430d76b63c14387b99219e50a5e95c9202344fd0294664a48ba09ed4357d5378781af9b84fc282b07110d37e16dc5823325a169b12be827318e76a01b1bd1f281e6cbee7976c5fea660c685f0eb58a580f097170cc9d2a63497ad74888f58dfe9c21353b98b317657df36e213a5009f43ea992c2736d7e1e9be33ef4a7d51d434af7e7bef7046bf64099ed536c6d8eb6587e4d83c19d67acb686e3ecd0fe798729a5373923c41e71ba553887a1c6a1185f60aeb29d11db8bd01f30f37ca40dc0754315596edfd5a61c2c7688c585d939372073d204a9123bfab6c5c0790d73b2164a90ebcd69ea20631d34cad019e42918536d9fbf32c46d11516f4dec521399616688c8a67cda280f29198428166481d08cfb227aa69d643c187020adae1e4693421703ec0f8421a94952a337f7d7e6076416e41de25df29dff2a518475704d9ec4b7d38c17f4f9d6203de87352b9a55f83a998f640d3a1b25217f5870f07305de27b43fd91070491793ef9870c94064c36e22e1a6fd9953d35a11dac6542083ca3c6d3a0eee3ec0e169b05e8c3c43c97b9242126490731326e81c6e2fa685e9a90b2841805285c19d683a0d39ea918d6e686aef6aaf1c3204743f5f3c2f9050c48d8be1d897783107db2076e39e327b75e2740787f00d1bc035dd18170251bdada8b1ddcc24130cb70cb3b22d8321cf44edcb9919241d969c8d7219abc5de0e4a4e37b698bd1d5037c0e5cfd146083c06d646d33a47781c82d66686d4b633caeb37d759ba340f5ef60c964e6d9e43815535403ab225e23915743e8c064264cce64949fdb22d0120af61e7fda27453282c11ce06eb531d5880eb9cd118157f9b62179c4d2800d005e5d1bb21521101568cd3670f75f2f833c166600e552e1cac29fb2876981b89fc99e5b27c9abac0368c20bdc9e818105d0e2d284cfeebbd49158ed1b30d214614a10ef290cb76edd97dae64711a02017550988079ae3377ee0c59b4afa0b4b72919fa176d82b4194557b8173c5f36e8760bec712babf45cc52ecabb94d717b1ce0f41727528f3e86cd3d6c381420ffcf088c12742cd9d5fde182e1e0e0c668ace0cfd4ba42ab29efe73857d69fc99ec4ff3d479cb76d82a8e8c3a4ac093a0cdba834fbf5528a8fb52d52678af014267e4f98feb38f3a87126c2bf90fe6e71a313084b7b2761b3223040b8b98646082f76d696cf758a683029573d546aa52807b83dd3b57116d992067c37cebb2b37bbb080d7d634cc741c9fd05c78fa2a89b2945fa2436ade1cc494edd2dc03a752fd01db153870722be02cca3905b8db7f4e512a16950940d73e28cd0150242bdc2b75d61477d2722c60ab7c66053cb5605bc3ad9eb35757cbf00a6970048662a68716cfcc6a58bd07bcb74f192a72201006105b68d637b420f78d93a042e61b44f876680b0dd95622274b96e15e7a816ae8dc6c1236c87d7aa97700e62788497280a3c67417c975697b088a2193cf0d68c379f2f91ec558f05454bb969dc3c310c13cd82276a2f39c07e92a51ac37c0b34683fc4540fa9641017a36184c78f363aa7e025c3fdeca6f86c6884a6eb91324589c4c3e82c1d5099bdf0db171fc8ac9b7aca53dbaaa728ff373cb3f1271c60649d18947478a3faf171459e6d9e29ae30efd1881ba11ad4b40e1382e6f6e40f61295a234108405ab7a7f86110ab2034acbe5aaaa438dbae106024fce4f7f7786db9ed7f2b3c84af715450ba54b00af6f142d9e1cb10635ca29045721ac32e1086de566cb4508c415963c68a63fd02dcadc0052edbcb65fe1a0365cd7d20a625275d774f52fb3e41537415596972ed4ee028dda7c0b175ff4dca5a1409d64f0c4574c2b0149c1a5db78c3a525d8cd40e96d93b724d20850ba3d3bd4cd6bed1e7e0cc488e998ef95bc198b6952747849d27e5dbc206f6c010aa46c96692c53a012e295c3938899cdf8c8af255fe97f2fc023f386d48502a8671736be7c57cd3eaf1af960f15279a5018e0f08f5f202658625ee1edd4d9abe0bc59ab7e83889240d911775e9ec63acdb22b098c8d45e7536a71fbe09ae770f4d59be80f168942bb49fce5d6836f90ebc2d5b54f99906a83c259fbefaccd67b6375fee1023080b9b549c91ca77c6af4d39ce843051c4a1cd31d10b6bcc1a8f268e6851c9814e7c687436864572986c2fbd3b5b1f116dda4b17d4a1b4a378091ea3b3ac70b3d299369fa57922879a49009b08b651b8fa71e9680e2f560091a165853b9b43d716229038a0372da5769d00d02b0b1479cecb043bb301cc7bded7a187011802547f4309b63067f791d1113395b9b9b99da6fbcbec1bb24fa2478971e05ba967ab5272d427b581e8a413e98a17a06fe87a6a5cfe5aabd7a71401f6be04af3372cae7010757f9bf277de808220650aa45f62ea993a3000d4a3d0d6618187612e920077142d950bbf2510a35a54d5dd9d207868c5f0dda431b72852510bfae94a80ab9dca41203ec23ab44888a7ac11f516e8bea7b0299bb981f163f11ce2f8a046be61778416731f62913f5cf50af76b62c8090b9d6779e4df4ae2a04bff09f800905334b81cde80e8e9a8c4f7dd30b0c87c341c3d7c12803474a830dc447b59be4acf61be1383e0588c182e29cc1c3432c869d0e254159ce84c607f4336c7043a47ae6f0462d9797bbbc293f32bc03d7cd2059547db335cdf6f745daff71e70f20efd91b5cedf7cfc05787c77be77bb2d904f7e97d167bf1d83c975a5bee6fe303d598080a333b7d40db10873d5cc68b9beb34a3b7ccb91ef03ff6979b8e1ebf5834b83d91c594ab7326b8cf2b399fce014d0a83125216901d24d1a5e0c33e2ebe79501fc88b39e3982f765350268ee12580bbb5a559cadd8da0374942bfde13222398426cfcd7b7abc8646325b6028c1e667e39596d7e5a2712a3213fcae6920d07a7593fde33138aa021ef3a9ca9f59f0ee1ff165f5052f004e2eafeacf1d610454fcfbe43c5945a294e0726d9a678b7eecee95ed0f51bbac5ec7f017c30268b95ccb146f2a995b16b8415235319d824924384ed11bd4d75eea3db5a8cc08c22d9327fe28b99bcf13a5dfa370210a1e09666b7db2e1056b3a654c684661cc7bae30986f92c203108260466275cc693c230485cf769c0d2b11ab04dd1dd7f3b590363105bc3f17883d049ed119e736aa1101fad9288803fda692fd8241249d4d80914b300af2a1ecd231c7dbe365cd9aa36aadbdfa94dd937c641d5a367de1917dc6f9a0f43d3b9779af3379d7a196cdc11d9d37cb75ecc8c208a7dbff091fa0293a334d7513d907f747d68e321ae7e4d7b12171cedb109df699867857bb4a71a4dd02c9645159f8269aff7661ce40df43b013145ecd5259d83f5b6099f6a28357e1286c0e758680a30986c8b774afb28d4128e6ee7d7377c5d9f60ad1f3205c30fba2ab27606d40a194e301243db9cfcacae740c432061c5b2262f2860500eed8496e4ef84d94b02559f47f8204c5282ebb7482b413805d94857ceafa087143f95dc05581dd91967465383f06e375ebc30f00979fb27023ae876ec5675ad66a3b05d16b096d7392579f6f846a6491c5a9c4cc4fda4f31bfad20fca0de449cd60a2f03dbb5478bd63627b9c60f6f88edc00d512481a49a5ba39cd9ae08ced7764605a0bebfa29073c517adc8e9a13c047e69572be7863dca8b8964ecaf73320ef0e9fff82bef62020c9d35500f644f43522f583f1c6c1f3960f8116d00250f7262e70688847d2f0294509ba6d20a8558d382279765aecc9bdb516fc7a8bb965eb916eef6350a3d4e75acd3ab237483dcdfeefadba5fae57f12490997e4c5029b60f013c663257fd032b765d4131061fc6dd5e0a65e6822a79e077e965671c3daf3364d70ccd386fa0e1be5d97b313e0e6d41e8b0d988f413566abc72614c4bc2a5a6e0b19ba421e4949982001ce69475c00951b9f47bcb671ec865e07e9f61c5d6a7b06df818293df556f7211e414830abf29629e541138aa642b3cd3f21e519011de041b17bb229f14b2aeba02f2f7a99d2f95b5fca350fd647715ebbd09906c90d8b4f6e22e27cef90870542f29e30b3c82345957bd6a5e7c1583a766b284ea86d38f634143f065890cb02219772272ce8ad748f049f9f65903d497f41b6ce7be5fd86a7ebfb4b7f87e19417a8282388559b6d1b535bdb46d34c5ad4f08ef53cd9c1d33f5f77916bbe92681b5c0f8fc9a12940a05c394170418d8cd79f481faf1411bc8d80010ee332d58760a88f56ccfa3da69c44bd853634b58d4de50a2b315999c737bd4e3a03b5f959498583abfa140e70c4d77b646ec339af6645e8adbf608a92c9a73a08efda6961951bb607662d75d4a4bae1e3657e076d95a6a2cbd984ecde5216d1febf9dafb59c8bb8e0e5bcaa4b65fceb61ccf7958fb16d48c3764744419116811fca9c8059862d1824ab299e59e12021a3c94cc4127d02a2f774a8e54e0a5d92e5f078b5fe2e9fed4d561ca15f3da8e86b260be74e3b577a5948e43fe899e70928d0c61fc833d7c86a5d557e7f7f55a0d1193c6a01e5163ca0ffb7b5eb13d6a935ceeaf5f7724e3e2c37a3dcd38333e35c6c59b926f89310a6ce5e92d3d5f0e168db06efab8705b71357ef23082b1fd643eb0defdb968c32d1c8963599f696884b86985637def91e09e524cfe27ae23d9a34130264079c1187a491f7c405d025ce487fd4a0bbaa8befcb885c7e5d0118eb6a772a290a7cda53d4a9b70006f5f14e56437cddc36b795a5585e4e125bc8fee6b1554a581c53abcfdfe2d0ab2fc841add4c7f022484cf397ce0b59a618985ec55ce8a7481942ba7179d941c61c0fb318690429541bd085f69811f013b99e09de910771e423f6cdb49802b4a94e57c0a005fcea1c50db0ff64b5233e7ba73b8c9552947cef4ae819ff5c05b71417178f2f4cd99ed95c4c67428b0eb41dc7c58aa3772a2befbaeec057a0e9851309e65a73ec4d35e53e4df7d512cfca2b1caecafa787c844a3957fb5985555664e6ddad152f79c51d903f565902517b6c16669c757e5deb80f3a11ad5bc7ff6f20490f73879b4809938d914a175de0b465eba62d4a693b5dd68a365d03ba73ba5d453fa68ea6aad08619f068c7bcae2c333e995c737814e34d98bdf1070162287208b54a50918b33f7610961c1fcdf8f2986091f8e339f85239505cc4af8dfc8fa8aed5bda423032007d2d1a2752f4f085e0f02673f02a5d0b6a6413fd92a00bbae0b499b5ccc019bb2e9d7d279a71b372e8b8126589d67cae21f61d50a368ddaf7c83daf77689eaec74de7787a9aa533458a6505c40ba66458e9e1c94894090db16ed97d82afba63f17b8e75633cd9471e2d646932cff8bca8c773b0b43f8a7ac0458d9f7efd17c3b8a40298e6fc70576d583972defd116c1ed9cc5b27440e17634e6c0d7f281aa523677827b70d2e927433ee2073a00a0cb4e7dcefa83668af4bbdfb8143919f59d88478191776bdc8d32b2577a58800b9edc0b3a4efb39d337cda2c1eeb0b7b8d61c8bebf4365d076a781210a1695cd54d980100b457e9f1e4da3fa2f3d23b145880e7e637d3f80cf0a7fe7e72191a6e3879dbaa06bbda593a961c7876548da1953f81cd66757a52db28c5b338ca208a71b226dae5f337a0987f5bce2c78a10681b61eaad4dc2de3045fc84b60ea4932c36dff9cbd363d5ce1265022a53e6de38ac02f2fc00a53532cec663d09d31b414873542c762e4ecafb617976b785c4a860e829671e6f029576933f2c7ab304118d997611e781e4be4dadba2dbc4f5b8930efaa4840a62838a6a8a0f10575362d94c4578ffc9a91fc5ee1013b45e26504327e088e38596557e7b3481fdc0da616f0b4c124e56c089908d3dfc2402daea27ab0fd56b2195dabb27508c331dc538137c42014dcbc3d4310dcf9b8a331e91d0ddfcb2218ad514e8a2a50953a2e87a06448746ef98addbf5f43c2150dd9514ba83d4e4a737c947e181caac7782525226516d9b99cd7a51cd90cb588a0995b4941e72fb263f118d918b37e4b4f530123c503be875fd4c8549d6fff46f9d6dc1f534165009ca6b2fab080c2287d9b996f2cd0dc9f6c8a07476e2c1a8e4fc9e489abf968ced81f18007cec76e49df515fd01f93f65be6f91901c301906fe4dac66bec0ab149ca85295db7e9e989212aef119471e2c758037d948d576f6ab9ca5f022bc8e5d1b4d11fb37044b9616dc140d9005a05e736965d5a63b331fd12609d787aa8e7d9806fc32b4bd3e565c10e615a28c1c0fe3764502c8130d2020bb7dcac0d41017db4e4bc4fee457f9688e37917c3c7ee6dabc3003d26ed055fec36ac0e99c2c9159bb4d14691afcc8b089058d18382bd3f68a739f8308ecc99bb4f1e14d3af8c3aebf27c9232f1a24c7bc17fd3d615f4cd24d45af951924455b750afa60c063c5ab28f6421ba9906aaa421a90b55990c2de3af16074adcd4ece91f76d01e143531b48f4b9932580e29a5c8b9c4e052b2101035af488dcd4864f431cd8014b72dfebbf908a0d88cfbe5977faa2888c0fbcce4edef11fe86bb9d8cadfefd3c5d0f820c4e2bccf50f3c74cc584b84396e0541bc0f4c82fca1dc17887ff0153bcf7ffda159cd6c6cbb8bdea62f5f09344816f13339f5241ae17589d8b87999c0bd86cd4b4567a933d766cd8bb581511e7d444676a83a21ca747553649a8f079d4459ada7b67abebbd815accc11080b01b3f42b528dff80c923fc0d173e514662b6f4b68d34d8a02217b9339504dacddfc88f4e7cfcfc84afcb3eb075e950300600bfd611a23ebf2a69fd835a6ff9cc5f0158b02733ec9d8d537a936278f71b1edf13e33f80145cc9faf3f3e099e77dac0d85a02f1a932b6da7ae64367d9fb0ae57ed0bedb9b0c0f7b2cbefe29fd30405646c9ad6f6ca354a41f0a10e73366e69a9dc474bce1a53b8540f3c37ae4e043dec51f58c4d9853861b21f165fb04c95d27c98b10d497975c3cb59124781c5fabd90101c8427cc0f983cfb4d37813e38722a57c4fd0d069bc2082baf157d6e4d8a7692bc51865e269082ca7fa1f0a3be1afefa50515776953f854aff5f57b54e107a2925cb9a8960ba33f68e6bb3ce07b51dc9387fd6d84e93ed6eadf84cc4d62e6b1e7efa26767263ab4e41080b89a274c9cbaeb4ab2576a75a9a6832984dad1da705e1082c871aae64d93e044e653e9625a42c7e73cbd838165bb897b1104ded80956e5bf7b18c880064a5b4f793ab91c2f83b9dc3ef1ca4bb94dd84bae46848a114d87cf91510316dda96800e9f4aa5c2b10a613b0cfeb6e769fd8cb165b5bc2d2f51ed8b404754952887e565c8a34ab49743c60d96eda23cca8328d416748e1d7254d3e2098787c9d2b057bbae475857ae7f09d597d9d80dc5281ab77838361264e34d1ba9ea3287074487fde80c5ed535470bcf115c09596c67711832a0199f197f55ac72847e0c92efe6564d314f34700597cbc89afe36cad4343009bcb0dc047d1e4b0b75a4137846cfd72f64aff92b0d076a8a4fc7d4416540afd207a45580fe6f25d35934d07370224cc8a70967d59effae738d31834dd6be8ed28e85f76df0d9898207287bff1f83106b85f00fb327aa7654e83d1f1638be1dfc4e4cfe06d326624a256ef72540fe049d2c16aceb5de0af9c2ada93235db44ec2f199b23a3017c134a62a10d41828f50840a30d0bbff90caa86ff93b6491e395c52b06b1c6df28d227b5429629bc153c56ee4a751aa8012a020282114a1e514ab4059907329a3b4e3185a7a539d200421261891a6449bb46e2cd423322e1a94432f37ffdcd9d13cf26423492106440977c8d410bcf3a50884ca3e373292c89b7a68640894dd371a75ebfcb95df9845a7880788b54a8136207ebecfbca413e9900bdec6f5fb3896118ec4d62542bfb82cdedf3bf4f2db4a1d642e007f0723ccab016ef286386c37f723478c517261ede549a027a09da95eb25465be89956f169e89fe15dd11819cbd79ed70b1ac7d75bd14df8f11f09f0b8dbcd3cf851e15c708526846a3956296d96e95a702d90c1925e75d314cbe84154cab84cb320271923a74aa4076786e346b9983a605a42684e8c7b10029a72ce7259d38c6cfbaceb6521988d6362bcb60fac9ee6589ad57ad632a88e19e8f8d99badb7f7adcfd09791f64434d880e833188c304681a29bf58683da571aad5ddebd4334534733717ea391873d36521528732e32946f4bcd9d924cc3b051d235c7519fe31dab9a70e5ea2912d36a0d127935f8d1dc02d7c8bdda291dd50cea4728b0cb58e73049e31667384f820ec57bcab0bb88227d32786b2d861688d8bfc548804ee6226c50763e0d6cb84bb8828b14f5e78caa596b0b1168177fb0de60949ed52d5e15369046aca713afeeb0f6ec47fa6a7ef9c36f5d09b0194797a65f799aad5188a0b8dac6441659bf10c3eca5adc13b717ebf32fe7f06a508f0004c5c663675eb897192cccc0536f261c22223a41364d80a57b0e868dce3f48217632c965407d04af0c740604882aa2b224849be14a3ed35855a504200ffd1619a459a680d414d3b8243f1c83eb495bb8d625072baee2ae093f2a79ae5d5226ed97e52a9176e21953502b6e8b83d94ec78c5cd0aebb6efcddb551e4ee992368f626187f49956d77d624231fff7c3e80017f4432267050b6822295461540a6259476719a53f1cb636489fb50d1356dc739909405711dcbb60322402d25642ba134e24b10c20800e7025df19717155ccb6fa5daa940bb988e6219c2f2928b1aaee9c2d317e3d5fb767c0c82cbc2b4efee16e17984eb0240723fae9911451305520018e3f4fa7cd999a2a4a5e8905974073f990219e126294bfe8b49de3b461ee1910fb80716dc856b98e37477a5b6b4221c5706d26f2a7d955a5b2611ec8193da577240a5aa3449b3a4b57aa2b77648b10356066ab6393905220bd9332aba5bf692be4bc00d71f050f1730c97e203338495f4c6c3d6952c497e1edb37006067cf94bf21737c40192bf6508ecae7372a9217df7087a296bf811da075cfbc6ec71a5780e458b7bc5d32e62a28f0970872583a920a93787dfd6179a1d72afaeb5d96b935b8bb053cf0e6fa18d4462bd9ae7621eb47161f3f1590bdb530bb4b78581278881a91e61c0e91889131b03bfc2b409703c703c5f57767491ed2e8c9eb6c1e7cceaa96b146628902e26b132e7f496d781c687793ca878aa415d3398b9926e7f527c0faa9bc5179725045fa73602cbb028806097e61bf3adbb7380c8f723c402d9390603aa79554d1572d0be434154074e79d5442dd1c0f3cf0181400b16e169f44c5fcb6950200e2a9eb2d08591af44b06be1e27c083d3e0e425a5db915df9678cc3212893b121ccf8961082f7c0bbf552c9d85741f242293c9681329d29c6d3d6095e1cc8292b2c8dd4ba4ca8c044411360f81f7fe2d975c8ab1e41d67de62c401ab08f6108a0daaa09a9b455a31705ccf43cdc56a583ab7c1f935cf75baafc4b5fcdadac0f813feb6c48df98a33516de9b3344c0287a6ad49d7de1a13b57c0289cb76ea7e6ed39dc19053ba7081d1c750f590c7109b508f2f22fae4ac701b6a766c991201617c9c7aecd5e6ad14debc57997afe4b0df38e8b954cd8c4ccb30b43fc2fd8ca438a081496e7e7675f1d93e4d9193d10b1906a65866a916cde34367fcff0c4f8056a97c3e3fe0a7cefe98a1c22025e41a316a728d2e4c6142989ebb203aaf1899451fa2081e2182d9929f03446a817452129adc8a2f8db70cff744f68f278e4d2b6980c854d9f290f4be00602cc431de2d153cf28cf50823f5465491344eff62f79c822b460f23ff8a7db2953e051ad99fb9c5da6f8af4a5698645415fe7e1d65cfacfd44a4989358a135b8f08ac335c1a87cd41e912575852d95df09bc469e24c976cb287c618b5674238413dd9791010c7dd5940ee7182ddf73f20763d1f5fd8d21a00e61622f9cff3617686b22a9bdcc14b08d5b2fb691a98bdee5588655df67281e9d95cc83920eb1c0c2aa535af8d6f0cd097239490da3d0af7e3ef3ba9e9b71d37b677262d24d3157c6cfe20d0da51978ad5005236e8d27311c0283af985994dfd38aeb1029ab3f66af6c34ffea292c812b8864114853271283cc97a63fc3334e0ceb1bc05b546443163f32499b409133de7f27bef111c83dae0615a2f47a9400506795903a4b031cb473089f22a8d03f530e5901c590e4a2eb1978e2f5e08940edfb13b82bcb39d76b41296499471553abd5bd894f63012559da1bd83dd8954ef801f1655843aaa35a1a17416b6bd8b9e5f789e8c6a55c04baa9f0a167e35e1e08d53418c03a7d4291590fb0b28a0133136328cb1e6d638bedb3488e2f9ae99987727a698b29a0197693302eff8174126c900f6e7ea6139af60c484d76043b70cf06e5588a397c3b930c3c0f1625a97bdaaf0c1e04b05742322386ea08707bf4067d30bb83286f54044a40b32a9ac0c9ef7f6efe9ba214983a7a950b4ec382ba93dcee089f759b113287336c76395b5e07f69e2927bc43975c74c0400294ce50e69d0a63e673d8b4d692aeb9e00e4a4b03b5685e24eabb01bcdb4a40161a267f104120d58e1f55c3b22f229208de8d29e7ed13d47fbd0d68948a485b77556f41d2745e98334cb06f0c7e9d5deaa1f16835fb15013ee66ed8c9784708611b6531505f3598cd505ffb471e6a73a5a8566d53f0c02851922b039213f61ab4b63e6f7bbe55910ce623541dbcd4305edaad5919008507917d2c433b5d8d3d4aa80ab975194388f5522e8c9fd2d043b6d8d046f20a10c51f31c6946d4748e26f9108f78c38b5fb3b11e112229f486f103908871520a88d9c05a58c9ebade2dec5fc911e21ba9ac9f294e65bd9b5497b5609ac28ca66eb1a40e878d63fa8a00fdfb74add68eb29a79d3f4e7cc8c105f1a8476ee507ef5864aee2a5a2d8928aca7ea56a4294c0052655cc8f215170f8f7dd0607b15894421c166c68960b95706dedb30c9252aad94ac002c6ac3ef0d73f3041e1acd42c2c8143e79ef0a5849ff6d067fa798ae103fd39d173b6957627d10984363506d875a3c1b00248668337368f152e0bdc5191f937e22f0fc9349b315e97457859056f69431e80680c05274bacc1d2c19f49013a8442c128faee64b9065875f8f571cc9e0164ba7e3a606324e8a14b8379aff68b569ff4336dae7ae29ceb73d00dd1dbc81953855c58a62b6fef709eb8076241ea616111f400d9f400fe332dd4d20b9b5179d88a82eff0b1a5269e39bc9b850140c21042d13019982ae7d31ad13db299e2e78ef2dbdac634ccbdf1a510e87e71294a0c39895d515ae703b73bf84f06deec5e752032cc054533928e874833d864dfea1c75998a73d48f000d7ac705456c262294beb557d57cde94cb7d3e82f5837343dd05bee6ccf39694cfdb0a782b05dc93bdac3448a446626cf40a04002c26bb118097f298e9aa60820405b9d4ef6fafd5707b68671cd65d12db432af5d45e5fdd4388d96d710124a2001be2c11b4f0a32d979489b782146704e9a7ec95a279d27062452ca7444f6d5ea46df4bc90edad99f7b3af9ea9e4eaeda3b653a1b099653815bfe1d2f593316bfdab0469b93129ac21b9825fa3010c74dc7c36aaf3d5d3deeb31a8ec912b426ac75e424a6098d0439cd674273749c8599d01e8d33452634e0e24c5e71a08062e3240a678cd89806fbb0a479a895f4f16c4a95ae0313b93892a6f703f5bbfd7696b92ac06135a0ee91a821d270ac205737044b48aef1451e6525f68c5e2024756a1633d6d2cac3c66e244be3debd9c1949381524ebf8915d8b3405de8a7d2bc1c573188c267749d71a6f045c67c00cc57acc55148ea7059ab254eb14c08766238c4a588ab09f95caeeefb1fa555aed759b7fb62c5faabf23d8860e68f3d1450ff0a83832d4c5402203345ea761896f490ed24b58c228d4af11a1250bb88542ef0c305ae6325debf07e8d8a074cdbb56a7fdf1b7f655e1f0bbda2a5dbed64ec787767bbd7a192218e202383b3a736040170e83e891ada255d5ba1f9e39214817601bac645cfdb598dd84202c455c90f491a6b10cadd268e6b6183b62bb0f0c81c1b4ed2e2064316fd191f181fde8fda82cd61a1d27e03a052f125ee6177ee5abdab4558c8f4e57e2d4afbff0e7ff686cf4248163ad2e4a47dc6104f99d2e3a97eff62e34b74e6dfc47f7418b097601686e43c52293810174e8c858926d3259adcb75eda3168100af1baaea16be08266665b48ed99aaca244640494b8818f01d767485fd1eda8a4b8eaeb5083f4380989f6c2f9bb6c3f8925f0e845d3b24b97685cb69c8845ffd3e4b1a6eb302d91d07d7a4f503eb00ad69b75e417c565f9b47a3292ec1fcfabd2e288a80f6703eb834631d424f3168456c8ddd535d184cd668787c418225fdfb9c2c1edc069b882d2fd03e4bb5a9b85362ce88f520468b0235b448f638b90ed991a9523d4e6ff00b15554c0e4c505b4a6dbce95e27f42469bdb476e740a5da3189aa567c55c92d05da2f4c1a0adf3b5d977d083c1aeb6df926c95567180a5e25e6d1954158b31adeeaca0e0b7392a5535a964e72c069ee44186f1065b10d65fb74e196df29f867cf75f79a5a067022195e1ca007a846db44af3deec3f0106c9ca05e54479d7c2cbfda54efdc31f85eaf66a5cab7425f5b61c14bb00fc707a645da69ee4674c545a85c82661074183f1cd807ff8a9ac46ad117310aeebf27d511bfba6018333008c91518e6a001d5b54b34fce77c71b67ca13c8f50e931de97a21c31999ac5538f8984e8515e309af9fde1a566d591390a469f5f1d2bf5a4b1099192450d53c18ea8a89d48d2675fc886b83b2afc0b4256788a013bb34a6969ffc7927f25cb2ca7e09b5d8eb78d84756e61da475795f4d8e1d3338cd441be9badc1c9ac5f8c86998adfa3c2283b32024ec65c601bacc5055a0f07ba4b07099ebd5121490e068c85020585e413ae6c31bac8584f7006a90813fa5090995b091b8a5c0a909a645c8c80c37d494ed21a1c1a8ec271b260cdcfab0d90611482c1ae74a4c62b379227ca9f10fb8786205b1a6ea7d941e059bff0cd7ab998a9e7269909df92e85d0652a7eec2f3d6c44d3935fe2c8bcaa1be65c4acfa6f5290ad6f5472260cda8eba1b93c9fc933f87025ee30af54df1dc6184aa4b001719d9161db9af2de8ac6a4b8b9dc2828d8bda133742766a5347920f298ba13a089e749b70322024fe5bf2b0e53d0ba59a328dcee58abc744149196369a802405060453d29f90463855619b2e257562e3a0ea96b11774122a0c22bce42c4c11bb50fcb3c20fdf7f2ea8327ecad0f0f427e466cd7a265455b6b9c2239868c7cf69ff94001ed633850263cffd0499c44fa958ce9959451fb991a3365c34237a02ec1fe7a58b31caab0ee4a722eda265a1f34207561cf3d34982c3b0a6afca838c9cb279d357c2025a5a9c6148084d1f9a50cf4275d0cd1586ef585d1dd852a31a3016a8c955fcac3e2993f0e1cf9fb9743cd45dde50badf9eb96a41f1650faa5f67a3b79f91405b2d55e66df296b8c017e40b6153df61f626bbd6d5ba7e8d6c52cb77dfab46cd6779f52b8c0d2ca1154004be817ec8185d865784c7c81e9dc5def47e9df7a5481d0b8f2ac990442d3a8367176db6c6aa730ad842fdd493194233961863290f3634af42cb51b56a812300db443290e23c6d0285c8a1eb0a9e870ac4391f470ed0c6b5b8a4ec95640b3821a02ef537dcf7ba6a4f6701d5810203521effa5dbdabdf3f7bc03579ef4828a7356259b3875ab691ac23ba6b12f11c1c4dd6ab24b61a0f0406f64d012e521d0904f0d553beed5231eb8fb66c6f1aa5a3f3445eff814e098357c300d98f9f996b50768dc73d81ed6e2f433243298aab37131bcaf3aa89d7a4e3cc60fd3c80192d3ba459d5f663a41f7ab17303f1d5efed2bdfe3c7b3e184fd60a843e71475d664aa657ea8374c90b4c8129ed138ac348745827000e3020aa45e6f39ed9141a9e7cd8c8ea2050bec39602e5a5ff79d5f848318d5cab3758a0b16d81bf8782c1b54408881dad9b74a4c23d6e44ecf6799f2b89a249269c6784f3010147fdf1f1a2900b13c6fcd743390a7f52ef4705e0d31598e03779532c7d9a4f47fde703db69fb3e73e0a852a906184714c39a2c3079ba528609ac01e65e21549bebaaa726cf520c7bdb43f24b0067e2f8a01d68ea839d298930b4cd4451a9cb9f6dabb9c0b62b76a285a06e448215bac4cf409823be1be59c7b6534348f97554a1abefedba010de3488617dce12a3f9b9d470f8dd2e1b9b7db67bd9dad1ff2f86c254aa6bc71f8bb672232d0d9b7a286e4d2166ac5bc7247273632225f6e11d29620b4e342ac706fc08d7db36dc3a58fd0e25c37a96ece6ef2f14f5bde88bcc3e1b13880ddcc90b9d6daa1083c3faf5d70c5c12e667a34e2e2f1ae59f1431f99604a3b23f67c8eaff6bd834c7f4be683d5a0ea9613aeb1a415c993cfd4120da3fe06d8632d20007fbf4f352bb03dc3e33b69c5a568ec40b727fae661633ece8216af0892df8076914491f39fa3f2139dc988898a6d9af3e3c1f959d455672c59a850218531189aa93a79c5e4177402d84c53b9e7e92695f811b18683273291ca13fc6313c6f3105245bf485836313016f2ff43ff96788455af64739ac3a1cfb2228149f664b33078ff82e4758b5b6de6da75f19b21ee5509b9b1e51af1d3b02fc2ec91d4f5a66d3a23e7d7aacba41cf894de57006859c4a0f771824cb1fc336fa5c5e6d38a75d22b455f2cd097814fb6fbde7d2f4e77e20f2993523b0e23b7fabe5b2eaedb51a05327439af89837018f52fbe6861a16665f25c41e72a5f1c2b4ec2c83e4ab29b6be316c3a52b82d4cc2abc33816892ff746711fe8a107e93a59c2fc9fcf2f3f7443aa748070a8a8576f66aae94a3b0ef5a4557eed4ce9ecee40827f577216d4187a551d9b7fedf4a91087db60e836150c994550c8b95eb74afcbe607c744b06496ee64c7514fa7d791d5fe9dd51d78312db1aabe722e92d944d3d249752f8117dd7d592c2a0b3f44fbb7b885b06f5355de47961d4942208871c71956af4e8cdb9327b7012548abca628b2372d2134f82bc2b20df1c52acbeed3caa0769ed3ae8c7c6130654ca29fdfeeaa82ffad3507e40af95376fcb9d438440a9be758b0c0b1b873762a97f1b9a31b1cec31c3c979ea5cdb99a45b0fc602e3e7adfd64f2c05059a50c98b5be04992e3e8e7418e389d17a628066658b2e6e21384ade1025ca9efe121c4072c70b2c0d71023252592ba0390cca29c309b135626a9facfaa669fb4be131e0d7f25ad77717313d035cc4d6506a4a6833a36b6abf12297b3cac89c2ca54d33677621beeb4628f0de67041616271bb9991d7765c51b4525902daa616917e3023651587341ea6bbbbcc0aab631cb8ae89aca443027b2dda67cab1ea47c88772357930f3ae1cbe161f7f92a68478fd30cc93a3e14f7ef88af88aa3478ede48661aba241970b92e847ef9825ea251ef5c7dcb7004fd15385241e2a0a633f9faa1e6ce3206e50f04b9872fa6cb8cb810598a41b791df2908269edf3de9af8e317acb2865e17614bac237a036828722fd5c02e0c51dfb6e998b10ad179ac76329c8fc1144f7c24bc1382ab247c20a79d189a65b8e4afb4caa662dfa0f3a4b8bdd27a0e4f05357921c9dab5830bdc98a38ab5233368152411879229b82d4c676a094092f50e859505c60a015820e7d2100bba79359c8c56cd6133f07dda8eeb465cacfd0031dae43cddc1e2ffc667b3808f2a4f305146a67c2fdb49082b60535e05b9118b1e00da51637a261b192233f029edf37c7f3612b48bc499e9f3eebcc1cf08ce480319e7368087b72be0426581708bd27d657688af2e73194d46c7be2b99bc0111405c165bcc20b91ac059774926ffb910cbb9643490f225139b440797515bdc6b71e3fc595b275498422aba7ba8b7d6168009716c70ca0238c1005bc03aa2265b396b512c6d49fbc406eb9d690a5da3780ab6111e27aeab3bcb126a0ff9734a4ddc0fbc90d41d080014fa914aeb76cd48f166e8222f6cd71cf4e6ef2bec8539731564d83713c6a95705bed4b9fb665e9fe355c757a8a4d22fa7594437c2bdf282bac74772402bf73c25bad705560506288fd4a429888aabf0f1df6bf0030a45d05c19f5593fb569f5b6a7fa5793aa4f60f50c9bb80a3f46530b2400b2b9427f59467eb1ba7d030b21bb488402a4eef12f42ef1cedc808b61b73549120b44349bc0b376ebd340d8b92f665c1f54ac145c763ca4d3368cb17dce1f8a555e4223994bdb5d60dba41455224cc81d4e8300e5c653e6fe988aa51e9f78d0d9d6e31277f5453c07af7880a2dd27ec9ebf2b1d8c02bbbfc00fe1cf5700cebf701505264ef16e1d3a174d2956b33b31cdee30907898e3bebdb7e7a115af3d11c7438d154c5a9a6ee7833a3d7a7c402108474bc23ed1485ab347d76c4a28eacd4c0faa97f0f00812b8a14fbd16b00ffe41d874f4f8d36e57150fdd270eef0f120af5b85c4173a152a45854e2d99d2af377ef40c57412e965df392460673748c553458ce6c496a4fb5ed2b0ff3091cc2997577fcad85fd76a484d2db2dd74c5da79d9dcaab317e03b19326788819c5c22d5086e1e8b4bb297ba45ed9d32ec4c5a4cbc36e59f145e426366f4acf0c0a707c72752e2569333d58881b867bf4d4bba4bf81cf896e6603b09dd892e36bc6e3b6492ebc9909dd6d5126249d61beca044cd904b6d24954796c22e1d56d1fa0ff212e8b601f00c72ff820957a55a0ae37a62538a541d93f71e010d07dfe3165bd0387cf8b7620797bcdadc7845549b108e0888768581291b20f45bfa7e9d2afb543354764fe1dbb13e43920f8b04607827959d46a35943629ab869d9a6c3c08b5c300424c605cdf515f451c0cc5435767413835841017f6a0e90d081c83f4209bccbcd671018a539ce55bf344ae65c8ec946830edec57831a576dba2a3a01a1496d290597a7c7b0538fc8e7030b10b85cf002194bf672916db2b5bb6b312e5a3b168287a87d45aadb4c5aa61e2cb86990ff29a8effe3859d3d45af17ae3a89beb3a365febc558305b195c2e0c20e476acf85264c4f07e98542ab0013057f2e211833ec8eb99ecf04b1fff2d063fa7d6431301876959350f0183ebbed7dbee108aad5dad34c3515b0007c488531b3e293ecd0b1390363598ea7dd8b749ae3eb14271f178353d20884d60a143a722e3a53e2931e2dd16e2e62eadd6ec444ac9bab46b5c786037b6669ff9d28a405cd889b2884a6974e452617f639d18eda0093fe2d4ca790a7fd2b6456b3cee2ca725474f4a58523d13922bf294d007e15a61a705964ff117f79496abc085e48570c8601bd89b5f585336013a50eee5e911f8044abd9f27707db28d093d7a2e8c59dc24041c76f039fa31d9c6705b853e36530f5f4c389aef084b58043f141141104d4d77a6403a562c7cb5c9184c7cb04bec343281822196d10b272dabc89d151e04c07082736bf2cf0343b385b5612b96ea0713d8dfd64332c67c4c17c29e1fd1d25bc0ed4f65e4d48078596da8e07b692a111e589739de10abf0e8250284286adae9afd3dfd4243854e066bf961d3222a1c53c50bd7385a8ab62f6a7571353ddb806682e882887a41edebcec6d3126f0f90395c0540ca61ab30e07a69c4ad253cdaaacab97fdf31b4fcf43c349f3d1c2c9f2874ed7019a352c5fe2a936d6f25551a45006d45c8bd96cff227d5ecafd91fde4d280eeb38be89327314164181a639017fc50be09ce8eca90f787fcf7f46110d3232c9f6047a107994f1a780b4e2c7136564cf440b374b8f9b79d048f521c0ff680192c23036d00f0363246bc689cc44fb49bf6d847b4bb64469fbbabe761dc5b6e8b08c3a848dc01a7854d749161c31423d80e4dfa601d5e34aa939506c794441150496df81c0621a2acd0c9954289db30b439a0105ad3028590617a5127638edc04ecbf620f1937e5bee447de83d8ef55e1614dbea7b0781027ad222ec0e6a23d05378663f247fae114c656829a800d40fc9fa79e8000fb4680de846cad7511b19619094f65ea4c7394ca925656f6ec0af2695d843815ded69c8a260ea95d9239eea076ae8070149e64281461afea2724b68a54b7def78c407bf534045dbfc52088ef428f7308199c245642b034742c0b688186459fd4e0af4943dae79e5f2471c3f38d8f78fecd62c761af0d8f5750042e17250ee3ff89f3e88979595374d36cf253937711c85dd27930d666ec17f179c3d4a43df7e94c9ae16658edc15902ce52db3fe31a742ccbb846c0458be4b994af8935b76991392ba7ef3f3a1bd4cdf57c05880dddc84c8c7f5ec72ee2fd35af4ce23cca1c9f3b1bc76bd72ef4ea7ce0dcf840e76e63e9df0cc90e90f946dde9961a4465ef0f5af50a4634a7bd973b46aad4669327253c1b22b0ba040f8b9066c407e6ce611bb7df79c2809bae885b699620b5530a12d586ffe60cc3f8fc393a81aae08e568cba0518fc967def7655a4dff915d826b582e5d36d6150958243b33b5fae836c35364fc4984e2701e2a7e2518df20ff85227594aec7ba9a8c63f3faa7b6adae221cd43bb329f74f6553a650c8f1d53704807645264c8ec97138a57d2da3b5baaf8fceca022ce3305a1f074e7f59b5bb51aeb2482ffd7c60ca74ae2394566b75bd3ddd9b3e67992959d8a78610d9c69ff139abab8702f493bb1221f0133758dfc1b6933445be008085389587400c1fc708955131516e6bf20a1fc21cf12366c22cd991d592da5e4b87bdebb30930b6884d40d2fad44009ec2ed878354cc2444951b08555556aa321f175774b33d0229a617d0733e5e5ec5a3f7f9d8a393be4f07ef8656f54f23eb0c6ed8a93bc03378d73e1b673c25fef9e4ad2392ca2b3d82872b14bfcead917e3229e667390c0f914772c691f54a8a26ca71bfebeb15b77040aceea74587e564f415400fbed994bd425e553a341702377ce6acb179d83390242b4e857af317a6296bcdf37345eed8d0211f29959a0244e98c08e1f4d321a30a1b3fe2ca5f23274b1a9e0dbe8148bcbc70e77f80894bb2b5d85eb1e2d4dcca3c7a99234ddcb316f1450ef5aa6d8d813d8deb6fdbee8ca1cd8ef560938e82500ce832b85950fb8ce18bfe7fbf637d5e558d1e25220322a0366a4f7f3c641831097251c1e06fbf7cbb4afe24fdbe44b74d13362c94a2a516aeca7a7a09c420a90cb9ebed02d03da3e05421e046d8f80909a65b17450d0d9ab0064b8b6d933fcdfc8ea385f515e0c84b7891f5e8cbe07802f3540737b93cec8cf262c8c95660dfdf88a7665ac64f099f53e913ed303f8874195dec7ed951343a5793241cad228253619cbd5f77383a937dab0b0739d1b5e47b44427ba3dbd8cfc9adc970e258d6cfa0c18fac4ee53c4af0f70d3fd478e9ddf5c2933adb9731228b07556b6a6ce1f9893436574d090463c4eedd811a5bb286e0e704b054a281113d2cc2293b74cc6ebcc58ab8c69e5ba7e027129c01910b99b190f6430d35268775039f2b16f7e455108e1a9d4b926d160e98a5c06d0d3168ba2dd38dca4ca2b5f27530f495387f91b0badf75dae385865525c30b9a48506242ca927c4da648160fe8184c625a1b7417898fd695a9bc5ba74df15f913b3283af11926cc2de153c93030ff63c2f58f810c0fd74ef629415e9c40a46cb86f39b36fcc695c223098c0c36324c483419c9d3d40082a1ef34eec6790dc6c4daa91c8ab0be0285af9955b3561638ea78b0f0386a683278b211368569693f87107e055c767c8d86a81b5e6bd9759759e4fe69bcc807bed7c6c09b16bd030a2923d3b3d1f6cb2b9b9db59d254a4249e4fd05d2392c6484834ee1457f8fea1223ff558c8684a12d020d385f8371edafdfd68403a00fc0f35e576c09dc4c7acf98eb66f6ee0c60fe635eb39f9061d61ef7237eb0f4afe3b481cfc301fb649c2c822f840eb6296d7c30f5d3e7d300c1b4d62afd2d190703d4453ab03c801eece12fe06a473677124a10ce0643b77e7daba8ed24d9075c60285bf5245f5d6c1afe20d45567dd0859f58b520985ab99f072a6b07c945e8e283ff31c835cd025c3248efa35a9dc0f42febfced9a145c86112d4bbc109791f960563e1529922bd2a5b22b4d6a8d1b38721ea636f8638d4696cd79a05b1fe9567f4a814b0b56f399f2216a184b5e4ad98a3cd3132f1f73d47fb94b4b33d0c1423e2ff9a67cd4c6ac96228216f736a8c2449b0c7f4d5cbad87c5801a1eceaffc1eeebc3216d12d7cf73b7605d60ba1cc54c1c29e139a46ab958f8af05b40ef019518e92bc007f53731479348100b4a42f5beaa2a07cf11d0d31fdd6b420273c5506ae9faf0b0d0f1319f63aad9194a175db516078ab8563cab5ba9d284a6ff62d3bdd0b7f83ea6768c04f577519a9480778d270fb9d327d1be684a4cafc8240857acdb809f8974b1ab0fe80383bf1135fb1e1bf219c9266699f1a89bc6145cb6de0e79e4e8c117988fbcad12a6ce7bae69f05ad42c71a3fa8dbd1a76003d07396f4da368236ba747f41ed6f49c73f42c99dc660e7fcdbb2d37602950e3b7c8e3ca21ead6ca1bec4ec4305960c11aef7f66b6b31d8340c2056b370e0e70b7981c6b0c51557c522e0f3fb0bef30363fa769e781004d21716fea19852a617345cf8737f7af7dc5f45168e51469a394d5ae4f6002d84a149a109999759c2535a015445c47476cdc74626dc0d3bd740717a0544d247f409e80eb689ea7f5d6a30453da9b16e489f353f9062415d486f07f7761f07230157d4cf82a654859908cbf56081e72332d74cdcbd6437c7c0651538663ea30a2274cb08e22081308e5087d41d79fe91ac0e2a0aa0dac8cb5251982610a204e202497d4f481a54a5e6f862527511fbabba9971cc2076551d261da02790f8736f1cf8abd0152600790476300011364d5a155f7587ebe57ac74a0443f565bde257210046384be0cb600577350ebc952570b76380bb56f462e8a53fddebf8e9072cd24abf54411dca11c6e1ee8c321fd27c2d9c70d564c55be6b01019ef8cf5c7799246098082d02ed1cb4c6d2488cad85be001a3e478017143deb077906df5fee2f1732f07d6818691d9e86921b8ad71d37061508b5ac096e15059ee3ad22104e38c0e33e4fd1797e4bf40da9448f04b2ae7e338c939d49cc885430de3967e81ad4335d922431e9024559cd805f31883ddb668792c95ee065f284b228eda991881b30a02ab27e2e5fea0ad05b32fa2b9ba25e922bc876e16607ecd2ee32b040287075ecc560cf1d1f7529676bb516832b3a19108d1f4880bcb0a28452a28bffebde03d2f1b55703b00e7c16288785b0044ce7f4a7b83eea3a67a7a4fb8cbc93b1f203fe2aac74e50904752b01dd1873898667cddb87f79ec97ead5c86c018e0992abced0ba9bf7d816f88e299870d1d7b66de3520b071699b36b37f27f455c837c4a10b88c55f61418f20b882466ae6b8506b425837879df54cf8c3a08e39b6765f8d2207f02bf496edc6bf8027335855df95b76ef174348bc098c1a8d159f3be4b735e5a0cc50acd25c400ccb6009ecffa5c5abf305e1318a9acd6a0c0bc2eb1077875360c6f98b6fcfe1c6bcf6bc0298913a9df8111a73c862dc67199815233f4d9ff74302c4de568c54ba7af20d3ac36838258ec0c5ee669aa743ee773a268df742c1ea7e55b86012de7fb63323a9a7a57b0443f8616b9a397dff88dfbe0ac207eebabfe7f65973b865b00f05d77a01349b011e99fa9edc9db1ad64d167612d50673c5fd2f06a5666ce4fd18349f9084973acfa759c8db735ba226fcc2030d9fdfb6ad3fd8a459aa295039ae49e119fa016500443ea392d972b4a660558b7bd9d5c93d69770ed292ecaaeb6d0c25cf087c31c3b8851128bdd6013daa9901c46349cde7a14f3cde20e8ef15a056285c626254ee62ff25e5fc30692e2e712488cd63032022e6825b4e8cdddc1820db0048d2087546e8649fedb5b3b51d34bd6d3b0b44fb7f6d2c5c48f32e37b4a1715c876dd740b8be800c7d17f62de2860bf48795d422a4bda1947803c7d91d66b264cd106244197b85977973ed06c890e32c5ea26bf2b5fcea85cafa93d0b99346fa070fa1ddb7099d457115a46dc291634838ea4f1454acd0d063caf0ff1974c30c97c7f90ac0c03f28c6f7a0223aef341da4299d215562e37e29e4d6c5605cfc927f4db1483f11e096a4594659f61665db55f64196ad01b7ad9b3b3ed9fa5082da1d4b153ee5169ac0d0ac4e72a7740f74882e47e216e62852330e8c04d01307438cc57120bd21e4cd877feddcb28e230140c6b18e8510576acb1026dbbea36c29520b748c4814c4ac28cf222198bef1fefc8e6ac929b7d2273313108aa3a3a5cd032f8950c1e94d370a1a875553c3515450985a59941e1469c1189293ac683c45ca96718f64c4b796d8189e4cb9d4eb0b86d01f61d95a1a24259ae520b4caa69c10670981ae4499e391082303855336b5e2165984d0d09631854e52cf3b7014b8359d2545baf5c6f28130cd05b3f6e70fc3658847134b6ffdd727245f68662cdba6e563f4cd8f2db21d2ac8b0dd0823b7d86fa9ed9e62b3bfaa5bfeea89390ceb49868f0e17e48f8dacce47bcc7bf99a113219d4819a014606e50476a38ec84bd191b94486f3d9deb73416c19779c9e61da2693c14d1197587393ab91c1ffad789f8e57e2365eb85970cd018f285aee9a2d9dcd69a1a6b9f6cd2ce64eef09ac96ec01b59013213b2075bbe55198dae5a26bfb317a8a424348814f3858d06952df941e5c855534ca9bd50c5dfec04591386ae900e52a0c266305aa1e94aec6389912df092656e65b6f3a19641f43723546f8451f8e42a32b6ffe015a4597c9ef20b4950c442b43f153bf88416d6f199910a02d42afc26e6a77d0e613248c6d0cf825b1ebc3a1d291c0e39fc93f54fe9a88a0d2d38e85f12fb0929923e76589c4dbfb274a3ce1c25d54d623a5a03f56050a49eff901568befd03e08c2f621b9226efa5239ba7b01271cb0d550a39b267789ac6ab1a6e12026fc65a1c1df5c52c50a935f40c31a710f5462a9cfb3b11cd7bab818303c53e1f12eb1c1011874d52edf3f6ed97b07ace17b170fac78dd3f9fa6b0a3bbc111faa1299b448e34864fac6842f43763cbcabc49686852d11f579a0b19a0446b0b3930ff00ee29e16d5265bb85ffc9d5d21ef20bbe9f38dd341fb180e959e2c2dff5c852ea3a2a9a477e1c38829c2bbdfdbf6d58748675e081b8ef3693a823466c23851bdec6a04989d81ca4277d2ca2a378b3dc07ac4610d74ca6f653c9182b275a1d1a337673da8451894ca32480401b3ddd4d4920d8a609e219c878f87c0c93e19c3511256c5cfaf66afd1087807047183d1f61858810fb8495fd4869ba0be631ef0121e2d07c8451b63b90d5bff156ce7b1a74d01fad3b2aea2a24ff09a047b91fe3a6acea067e445ccbd566f518100156cc1f82e5ca0f624f8d0e8ae1c9212bf3fe1cd0a18abee45cb2ee70e0625ea228728afb81cd89319e23e0bf8a7e631ca750330bb82924d5bd6ce925294740c0b10e1977605996bec151edc812e01e9dd05a26213472a3b721215249aeca7ed2958722e1f0a98714496f7208428b4cde00182e8fd64b23c0ab776d304891d64bf935ab63421076bdee80eb036dd66cc59c76055c1f276b08fb9e0f150e78e4807731bcda5b64bc4b0f17923425a9ac4ce6aeaa63bdea407c65558aae184085dab17ae9df176158fe76d63ec86685d3ae8934c51ba44d14a7e7209cead59d49399fcde078bb4e8b7541a3871ddb2ecedc102149412bbffbae2daa3303643f38cb9e68606051d77d18f405c6d24180649af66fd6196caba5a3dd229eb70dc4f9c3a2eb757f00df22fc945487b9cefe6d66107714406a2c964cee68c4e87956b5f81636a419e6d72b2227f18cc02e65d8fb180a3eca4ae7f8172e72756fef2a59eb8f5e5727db3bbe1953878afe2553c16436b14214d21cf019c95837c986428e4e1732f9de683aa325f3bdbe51dca959395c35e49cba69d750eb3d7743289c6d7f0eb9c62765e6d36e0efd873848600d5700085ec8a6bba01a5619707e18d8ccf2c3625650b6d0e206a12382cb5beda4ac2345ed9bb2e06cc9763018e4e2957180da444b3df84b383d532379bdf9150724bbfc5b56aef5d67de794b47025b6ad8b702090db4c9f949a982c159791e0b79df8420318ee63c37b87c863acb0ca50c0e5315521b54ac9f5d5d15a3998fa249e07fe3aae7683fb869ea7d054c59ca1c9ad9faf27f774ecaa3bc5fc5c24bfe306a64a2fa554eb992aa962b6b85608559b2aa6347d29de1c230cfa5fa7dd86ead3060bfd4aa060ae2978a1a3647d5ea53614603dacaacacf0e9c2a7498d961a5e30204b7538a79c8560683c0d4c933292c2ed2b9a2f48ba5850fa01cc6f9933fec56fd7139f72f370405032572b1b0cb83cd29463f2a459bbdc17214124581253538ff0d6bc13122dcad01fb7a2aa1fabe20b1207504357a9a3cbce137e8cab070670c0f048662d2a096abfb641fcb96984958c9d06c8258d77ecc99cdc7f654b4aa8aec9941bbf798728923afc5d23c77cd3ba8cfc9ee217018b64b7cf4f29d3b9315d42e20e844dc6b152c033781e0bec53378beff42196230e137ec690c71a910d5d41ac5bc5457196e3a7bf7c167bf622bd4a3aeb78bb55c8b3955d78cceb77ec2d0f0c7b6d1650473ca9017de5aefc3944e650939fed5918048d7ae7edcab006fa507dc6a4d520be9d770530f3d1a8e764f1682500d9e09867e1d0c3031f1eaa4893908cb2ce248f8b5d660b752e4519fe3ef4775450b137145d2ee7225f90bce728ef44a5e89082ea668d85fe7ed73c45a05e636b65ee3b34a0bda9637366bde0cc76eb00e23877de97313299669dac754766d306be9f216c00e37b6d89dfb0f0a63a6b5862aeb37ac73e1f3a869984a4a63913d323e7737ff13a46a3f89282a8f953bafaccf272b7a9ae44a992a1981da6f0558c3ffa5851c11d54ec7a108a0e91f8bc447feeec8905d51718c06b2b5e069c73b22cc35edd411fcc822c9f138ec27b730a4d0659b6c89363102fba2bb8f187addb32ab6b7c7e90d2839777b571d8a13c0a1291bf738a2468ad67c007df78de27b7d21998c1699b060e9d536fd07ee52d2903cccdf4846b6856fc8edfa1c7fd89067b7e168a3b8ca7443e50921bff53873f3b1c4403c1beb2a8b2bc080b60096b795ce0042f08642226b3a1d360d648adcb731fed8d62502db827240a452564c331f7cabe8a3a1173974dc9ea13bd5acd17f28633f60b9841d227db25756f13ee25e4d7e96dc9f722c25c1de7e68c505d37e07d916079b6a5c9255d2cbef376b347c026985d54793606dd91f69555ac05f408b10a72b983a195a7ffdc13fa3419caac046e86361dbee6530ad7abf0d211a6441557003c57a000b194d6085dbb34aa44b90f2ecff9f72eafd4f25885fa88a2518bdeb8187d21d4602ddbf3f7aec7a32e36ef29fb3c4eb828aa5745e4834208e2f11611b727ffa0eff2384a965eb36afdcff52b90c74ca0932fe0c39ca8388a481230e3fd7ce7b74609a7df9c4d2ec4c9ba85f2ae27ec212c535a8bc16fe1c64bb481b3e9f281271486073c180bf1d29acc50bc0253b586eb66642d59697253f017d66256d57429e228835fa9fd3cb2676e70fd550b449daf64db09041f7ea2bf24d1efc659950a079758ae04de7da383d382eeaec7cede08d40beb6ac318c23d87927305c6f7d693cbeeb0fced1617bdad3de7489cc8120f3bae89856abaf016ed94fa4f2a4cdb2ef5a5f5a2540c08ff555716e6b9d9551b22e74b13c5b7dd9b8a224de1725707212cb07b40a38dda173f7303ccc0e4e670a2e15dbff4616af14b0e969cd32715d0d9b6e6060d7a068ffbd4c55bcd47e2a84586948060794b6254de41293e2b287027c24d11b48868566e77301210ec9304ee43f2fb4061710bb72028a694780eb57147d22f0482e1dc2ca23f3317710d645de9b507d92371e9a2168310b9175c108c87afc14858cc262f6053800b11eedfba1c3582168b03b2729abfc28490c1a79984fd363fcde1aba7450b4d9aeaf5762b4e0d12190d593a061d2f0e568ee7a71719b73a2a835c490e14945027dbf21c26412c416827b25144f44050f051668f3de077bab8129baae674e5791bdde719f9f841bf1e1940dd553f1e670035610494b0139e1d25aeb31ddb03d22cb5a3563431de5b14156da0f731ab3aa7a340c17cf45aa2a44e5e1a173f89485c86766e2ef836884a71358ab184453796f7d858b62c59fe09f03a7fef82cdb84dd1f31f4cc907ffdae2c088cb3574484b7cf8b867f1055899dd95db9f32908bceb6611b33f945e87b63f6382ad31060340ddd492dc6a4f0432709af2bb5ced571cc21b63f15d3a9f4000c69b0bc760190964b149c78f97a039ab137cd21e4d2f33e845f9d97d0750ccd7b8b9ba8fb743ef53ac156c43f4a71e9f7d0e66f60dfba4b42ab68822b8fd95e0d09e97012e9c9abddd060a77c6a7051babf89c800c401dfeca4a87dd95379b0a886c044a3fe226d58dab01c1fbf5c8b124f0d63831ca4a3d3b404faba008de844a7a06ea7ba2ddbeca1048f00f3c9e7aaa8b9fa98caad3e2d4b2d961c4be25b3232a226c06292681c2fe620a79120ac7f19610ccf7dc664cea4cbe93820e9f4f4191b01989e3ec7c81f600331a43ea2d4c51ceffb69a738f584d53e3279f117ca488441d6214df6b68de5df956605b3fe8b61f8271324dc7f5577673d746549cfa29b03509af16028a2b9fd5027e92abc67940741c5fd3c8d086428a49cf7de57fe076646d8d5c16ea9c841002af1cb85b985a9c7738785c6123e447f63ec2ea43477598b27c85fdd4046409b0def03763cdd269842659a069e0b681dfa8cc49992217ec45db401db189510396bde09fa8685f853ce621bf4518ee61ddbd145fda3217c04c19a03096e30c4e8cf992d15c59f0a42d5cf123fca9733d762c1532a341d7744328f645b60ef7862b1797dcdb89dcf5671cc1c79e5b1af436ae83052703b91177ba120b1243cb4babb5e066dc7c050fbd325a5ab56c8ec11ebfeaf518145e5d85cc86d564d6f0878838bc2a4f0149351ab240fc2c0829a9ca3d41da767aae0024a8edc3c9c41fea1474d709e0eb814f209fbf0848c4f9aedd629c3a9412c9e564b9b986f2c788954a9d1243844ad43eea306b719da9958241e9950ecc300675fb0301daed18622d16c7e301ce0fbc57c8236317537f5e7b390afc7206c4d939193d9d86c618478f0ea91206b1279dab7db48e282d6bd35dcc69921d2f10716f253cbb1b1d48bdea7e4bfc08d82aca07fb582306f77499e594ff7f72b6bba2ecee2150518fa94a969bc8302088bbf7bf8d9b8f5195a549de2a82679102441905aec184e30e58209c554d63da98c02a360f5e65294c034d127cbcf8be890bf7839ff060398dd9bcb10a9f0a12b4fa2e665703283aa0a99a99f9066a4d2582b97b4042d023ff848be6f069552a8e6a2375589784b4b6f7de5bee2da5945206670fe60e850eaf5948490bd121773d0f7c43ee6aaaa61c79e052ac9a3ef9241744e9e7b99894a985a2924f64c50d630ba9d30ce0f012d913042189055c5cd14cc20eeb9649e0902b323d44a91e6298bfdcbe68aea8a4c30ba3c30b438738a54d9a2be2a6cc16a5147f5329b385b367cf2249164bdc40fd94a5121a90c247a7cba4e0f04aa9dc11cec81770c8011da9f437e6be53a2cda43a5543cf89144e9820054d30c2143040c40238d082100930500405ade4f5d25c1157c415ad3c7e3b2ccf992bb791a3129c1041139d2c8a760cc28e4eb260b2a378828a7db363144f1cd95d07739a4d75b680d409b60089136c79ea5d27bd54eaaa1cf66cd5e7b7a37a27bf1bb274791c259a61d8dcb3691e32370c2d392069a4b2d8a9e75055069fcaac96fc92c39efdf2f8edb09e334d39549a4cb6c2e4b84d3037c1483965a779f5c3914ff36752708c7731eb0247273600da2107c401054598912d4a8455dd198936f335037f650ec964cd771cd06ca93ecf19992d18189fe796e09070494aa552ea1546ae139c2d0ee8aa9cc50e873c9539235c295b1d4a7ae96382f539546a2ec904a7d51c92096a1791212407a40df44434b5dc12139ccfbc804d0f6910101502ea805eb9246595f539b324aba4a1dcd69ee62a69f89820a5b72f25afe7d0578e71eb771d2d494984b64ba597749784ed7e26f8f970b77c1213a4af559e667b972cebe7e2f27256ee7e2698048eb8ed5f722ac6e32e325b40e89322d367b6802879bdf399e08c30fad2dbccc31899155dad629856e16bc73c9382635efbafdf0d9a679a1cbe36cd4a64d1bc4ef392a6f90ccd651ea98be656e7385934a7f9146d68684ef3ba05d1e495cfe4304626af7248a9b0e763e4a2907ee5cfe10e1bf59895c7efc6dc5cd104bb8043ae087553c6051cb793233491489c341165cfea440b271bb6a3132d7eb6132c9e38c1c20a7a289860020a269240310328b7088a1964b1e5c4024a1442b0220a213861c92d97a68c0b585e2813947f6d79979bde75df8d96b3bc8b5fad9994fb80d736bd966e3f1c2d6771c151d2e16b97fe72540ee546a91edaa41ed638bd1eaeb81ec2803d9469c13cc4380f6fe92bc7c930394e1026b3e95d3036fd2b539b4daf4a5d7e37e686a1a90e4b218d12d22decf952f8daf62e39a4375d66202d67f9fd765674c4540779ed16fdf9407fa3b0bcc5ea6f670b4fdbf41cfada2c8fbb8545df28a67c89eaceb6c005d953d62127e48a2e947abbabdeb1c32315dc941db518ba000cbab8811625b0c04c0fa2d4e0045fc0010772c0055117357141252e48525389c66895af5b1dab42bc3de46e25afcb4fba9e33bb178da100d3c77dd2b7a367d31c54f39820f8ca524742013f71b9729c2cd9f9702a0fa9167078892e94d90ae916b3d5c56c855cd09e2d395bb355345b21c7245671d04d845cd00e9aadfa1d2e8e4456dce10209a59f0f74d3cf0f08d75fbf44d4e5d22920a28e4fd48248c7871650ac00892db810039d195274a28e8b2ba2ae97a6a88f87c6b8c0503061c58e5030f144cc8e50c4a08b4d634888307a25aecfaf47fce2a5e4f59cd9b9f24bc7c90ae9902b4b9d4963139c5be0ef18c513455b45873249ec672f210b389448688cc69060016bffbed8955de0f8e5a05ec0380f09e2cb3fa6809325df848ad850142aa50ba218c404e5e592094a1a93445266ab9e66b1c56c511d87a2fc98a03c062728e39dc492188a4e62459e6441a3501060f90ec90d534e810b242a98864a85cb9e93b5355df1b6d53de9b66ddba6c3abbd67d4d24aa93c8851965ae1236d9bc71a6e7b9c41c6e37376e0f121c48f218ca0aeeef1d247fee8c7cb2312895c2283a41075991e673c5e522163724812bd3cba3c5e165117eaf1d387ba5a1e3f7f26d03c32916c3187d363144cf0d9318a274cec90b4e723d18e512c61059b1461f5d96d1e89e8417ae91bb57cc50711d459e6a641e32e2d3350a6192698fa971694fd57e249a9745ecc639e635637bfd1475ce6662573a3b5100a23e65dbd4a8cd32c445e08113d48c7a717428412ee427c10a1f9ca49f741043c4b16224f83c6b5b3b2107a2284f448f550d15cf5a853f31ea91e304ec369d047e8dc1c88a843c33bf9f1d45c7e3c37973c34680c906c9e8b64d7c0d5399d464e6997f11e9d8eaa0ee39dfc7ad05c75ea033c8cc7cfc78a0f96c3d0299a3373a62aa7e8f17b74b4cc33c3bb195975538621754ca88fc6bf1939d5c374d555fa88969b74ca549a1ecc08e6dd8cbcd2a91e33befa4a1f11f3193ad5438586ab98b28c4ef5307dc667e8237e934ef5e86ebaa99bc952277e3b4abcaff28c9b6672cdb3ce264b1d13b8d1f85693533d4eb7b98d3e82e6279dea818fa0c14609f7f1d8d0b8bfa7211369e2e6344ea402a6cff80d0d5d01d36462cbcfd03ea4931ebf9db96482d2749b5c334396915f9425cf02f30e94254f9367b20fca9297c9abfc2346963ae72c8f4824720965c9c364194459f230b214a22c7955964de45fe45db2944259f2a82c8b284bbe254f9ff94359f22b7902e99b53b674d24b5a0ed5a77a90ae72d255b4f449d1a77a6890b2e4497a22a12cab79465a52f1fdfed33256358fa787e87edf6923389dea71377de565f4649324842eae687c8872657a32d14f98f674b26784e9441b44d67cb8ddce3b2715333687708a7083263e486890a4313a5483ea50156af243448ba28e9c41545424f54805aa3fd5e7f7891138c1e20b299250031e8e70030cc48e30450761989f4293fe60f919a471005f1dcea04a649bd0493c75ddd1d11829bd41b72c6d2f51cbe8e2b668332fb595d2d62dbaa494534e399564373070620324ff8a66cf993d65f6bcdc750c5becfa3805197c76d543e6a6968bd2ebaa10afe36cd699d555cbecabc628b9435c4ffbb49259720bfe5ca1b68c30b980193021850f7cc6b082245530b18514a87002293f23c88e2768ad46e913decfe40d75f5ec80035e90c106526ee004078874f083256421034170c2073ae2046bddd20a38fcbea12e1fa090e2470928a67001500d3080010c64c00325c0a0013ba555f21dcf7083257c92e4808b3074010b5808420a5c5002288c6071ba6fa88b015a000215946ca148144f74e65fd415ada085221829fa819317c44067fe6050373b2674db1698eef87d9f730b3c4fbf9def1136ca01002320d8dc679ea41da3e040d14ec96ba4edddceab592ff3b44ee21a13dcd92ebf1d252cefeaf7bdbea66682f4d32191fd9dd26d81e841419005bc4002299a58021474e2647db7f9cba1b5ef9e436d106febd764d17b2c9736b46db36d5f23ac744bb7bdb5971176bafd8c30d3ad0e83785eb6916b68813d4abf7c2368ed77fa957c32e5196dec4bb9461b7b958cb33d69db8ff2b6f3fbfc72dcfd75355e36662bc6dd699e67edad7da73d7a6f6fe1906d4fb76b81dcdbfbed74bb8ff7f4dbd1b3effdd5274b95b0bc63d1b45b20dab55b5d33417a151460edda35a93d87a655fa668254ee9ad9a21dc0192ed284bc066e9a5b12bab8c2b3153b19e71cc5084a7cf950b5e3d44a6a8caf533ac19ba36f790d08cf568dd9aade4bce1aafd9ba71ea186de2ef1458109ac2175638820974e451d4650383292e5082a2128ca10b1d2949d009c11171d0fdb8b2b64ab967de262bfe5e8c51f16ed1463e66ba63a431d22dbae4b6a9c41be61ba229107d31596df6c53e2610499c4c7f41924611653141ba3e2f24cbce2089f3359134a607f479215d1e093ef9c466a2893dff35913ed84c360db60442154c44d8cce885c8d7c7af660ea4c78333879feb90f0a327c5138107e445d994c0c3559be9d112a32524ce28c86a3e16d0c228c8fb6cb8c9e14559f3239a55fbcae146e258bde3958374f5e87a784776481c8f05d10b810bb607146d2aa534866df6254a3449020ebda13d2d50f725b91b0938ccbea0a1264c966cd7d784b2e6fdf7116520b6be08cbdec40b11dcf628888e463388e0d451424cf32155cd47d340d5a3204943d38074491ad01924715ea3a07b892929862d8de17a0f28c2262799c02c3f4e86302801091740018808496881148610822b848a20a1332f632b99978df591e12b5a928f80bd2d26084a9b19a75a6b666d66b3ccdacc5a9927134cdf99be22cdc72bf2a27857f0c4e049d91e195c8c00146db497c4d14010693ce1678b60cf87b021a2f4b1adfe51044cc2ff6256e0b9a5f6133f20a28ee6438980e5e4992f204004a58684c440747d4511f6753b94496c52ca2418d55581ef9e409b0e41fba1ae26c2b975384d80d89ae7d922da685fd137e52b4356fa766e10ec29a5d45a9bddccb6ea63b1d84c62c7d000879e151e508c56c48be26d913f202f34a1aecfc88c51d7e74389a8cbeb62b23e29f35ba2c9fe7e422f0ad1637e10cc59449b2c0b590339834c8b8c0a7249b685dc413644050e359f255cd80795049565c94410757d5f44d60c62eb23430497cc1c4a4dc41c3cb14748ecf9962553e0306b0288a8a3425df824574c1261d2137a22da8c8e449814f8bb7c7863684bbea0961d7a4057e06c871ed0b495d6ed340aac3df4869494ce95bea04e5327f80ba2ae0c0a9195e45b1261dc23d8c520e660fac4228249b422d1c6a4b50c44d6bce681930e332bec79edbbe1ed4d6b3e50e0d063b2bd7ba8090187415e5b7ba7bd214d336088ba3c2be6d0f4ac98ad2d8684d8f2b8f0acf0a2048136992dcd49146f72f58d6d6bda32f1843c2762cbe362d31e933d4fcabc7a26a6b7a4943d152651e4cf91ad42ca9288b29698ad2a6332c6801b191c613678401e100d9620399245f96249d8a317158d748dd7cb23810774b3ec6699f6c4d69068475e1287c703a22eb9c4238174491abcb2efc650b4b922da64d709d990e92a5e94ffa0f7626c42a14abf0a08622d632f296576332f8ae745f1342b9a38992d3b5b14d47cbed86c659e0e5f373804b5a67fe04c4e5babad75861acd6706cde70aec693e1136dab409c672b6ec0db28bc99a120a131a933db39849f67c664b520a1066abc88e3c1261f576b66adcd072bd7080e17c3bbe6f28da3c99e024bd23e52674683bfb7da825916364ddc76fd339ee25e578ed9b1266979e11f92493d9657620f2f6f5dac37a191b02522f5ff5bc1763cd27b25e87267873dc5f4c0e49adbd23a3afc8039aa09443310f68bff6f401c63b42016568773b46f1011eecef5b426cc925c49e441b19abb6b632bb840656f3c86c88b226a59447e27cb1188b52c8f023c2e615b8db61bc02a76e685b7edbdf0e63941f1136925af3e90136126141a2cd0862cb01119cf780b6e6134995d24ae948f391b452299744e95e2492c4d4daa118294f9dd68c5dc4933edacf0f0e639421ca836a2b494e99ada2d9a273ce496bf0a806b0ac9908ea854f0e32c1eb61b1e7b3a1087e31ce86cfbe0b38d4964cae891394664142b50689b049e9b793d11d6443747fb17985d8faca10c1f96c288bb2b32dbe29d1e62bd2018ea2031c664345dbe519f180728085d422ea0a3259f32bfa115d9669232d4f247677b376efdd0fe0bdd3a9ed00df539be6d19d23427af7ed234d6474ceea907b3b105107f3e0df9c5d9c71cebe5d9eee40449d4e1fd1c4f623ea3b4e1f316fd6363e8f7aac23e5411f29cb6ef9ecd9a6b5ac75a39c65ff72d6c4c3949559211b1494faa1be3b0f7a2e7bc769dad54a3c2dcb9e79d93b8bc422a9a7b74d3a1174b100987e5a51ada875555b9d101c534848074c74208405c901f923392093c04217573310da363b42210311f8d4b0a3132310615fa2d912226408de25d4b34ee65b4590e649fc638241368061c0fefa4b13791df61e1eaee31cc7f51e9d10b5259e81652200b88daf56a7190d095cb422a1e082224f104131050b1da480a206514821032410413dcdb5664a55573d6756960e7b36ebf5dba9b7b6c74aabca71d37a55adb556954aa552edb09ec1d0d23b1fd3a70b6da1a6c3bc33e5cec764baa5c758a22fdd7e3ba5cf9b1e960ea3b9a252ee7cea2ee96e42e98cd8a64b0923e54d261893a4a5db4c81240d9a7d3b524f221a821cb791142542db29fb52a6b73945737d2aabfe9259efa40793b9a2ce67822c8ef57929a55c6dd659409bb5a3132da0ecae9b9efc70b09ed2a18d9d8ad154ea2e8fa9b7a4503b75ebd2f2e2f2d8f2f24e7e2693c9e290b7a5922d6598120ccd4d1904ad95301646ca542ac3b8f88506b4b15187817a659cbb32ac7e6302bbe9863d3b55258dfa2a69541d9a4a3a1cb24ba6db4e7aa994e686b898fc76ac94024ebdf46468b6e6953872d7d44bef52991be2625ae054ea0ed961bdf5ea4b97df8dcac582783ba5b9a12cf02bc36aa9a43757cee138a75f0f1c0e3bfd78b88ea389784fe8b84e3f1eafc334110090600848e7f51c3aad573f1c2ea71b2cbb4c2fa54ca554f6052ed96fc7bec3c9afc3b2ebf2e3c1f4d48dba5f9e4abd67a75aa6bca43a9f16cd15c9cf1d7245f4c90469ac470e773d7e3d70f84b1391523c2105443aafc78f07ec2e4d24e5031dd8e3c703e74424145500c3900e4e1538e48a6249d3a12748c0f576d7aec804c740b4b9a2ab54af34e6041c7231e9339fc3613e7038ce5d19f6f81de0751c4d648641c98fce0b965dafa5e74cb9a38dad3387a1b1b06ed7ea38e41c72f7ca01878ca22caea82bb2270eb7a0aab9291b93d9a2b1586c094ee8e049121a94c10863e8b1011225e842c91160a085145ca80e4f3bf5cc0bf0591970ea7582a9c7a40e93532f87b9dc2b39f5f295b3ded16cd27e7048631d8d0e875890067c273f93a925460cd35b3f266ac4547a17752a47e9f6384a3a4eb0742b65a9e5f1932d2628dbf41caaca1c9309a6a6cc161734c1f99285e460e9d457be03f31c9a8a9b2687572646e6809e335d7218e4c4050915019aadb845e91e6e5d208143aec89ee79298ad5c64b6543ecffdd0c78436b8e31431a09d842536cd8e5320a18b28db65c7299660c5eea86797d42414c9dc52cb2d757561b9bd0cebd6970f5d7e43ee92cc8b49f59687e0611ea32bc57a11bd96d1e165e9106ff9727953eaac9bde92e3044d61cbe5b9226a7a8c22d3638a4ca9dbd368951e62b70a26abb800837ac8dcaa872c2c7b98cf0f0790faba551a88498772a7ae1a62b7e9546b98872e7ac8dca6c3e87042b13ba58198ae326920f576ab6c8b1e32f7cbe9e783ddd5a4436a64cbe7cc52e62eb38a364217fb3b4e518422469c6c233b56652d5553ad3594bbea1c6a32a964d5e34781244ee9951a299d7297269c504a3a94f6f3a1dbb22473fd2492b5cad75f27614ffd76aa29739a6695ea2aa7402a95ca55afdf8e4a474c9d6c9577f1f3a1dba61cca6da2ef76d5340492067de9d74d3a44b92e63b0188fd1e175691acaa2394c90cc6d06ff1c3707040404deea70b539a0d7cb97588ff4b4ad49cbe4482307441313e3f3c391facb9fe5e6804a5aea54643d860eafcb63348dee68ccdebad8b7fc256bdf0df0f67fc9a9035d964bcb55fe3cb7cdfa1c2b8332d771ab9c8640e2c4ad726a646b1ac072cb78323a8076dc3259ee2dd7ad72895932e7cedd85c670f94bcc635afe8334cff6a55b2b4393e530882dadb4d24aab53aa977498f221754b77109b3e75169853950fa55b1f5237ddde2b65d52995ce91d2261d277818ddd2a262b3e9d2b6c8f8f9d072a981b4dca481d0ac56bb45d35c3f833234312e671d04592e7f79fc7870f9cb5d5e5e5eb4179797b3aebdb05e6462bce81867cd189739864bc762b15e3f1a69c05ec75cea540e99d3cbb8b89cb38f9f0f32e72e3f1e5cce7159e61c7797940e7b76eaa61cae82d8a5fa4d55aa9717ad52e910a57a78da2f6f8181d1aa5c6160685ebaeaaf0c9ab27e290cb2daf6e053b9881c9f0e9973e774e8725bf2a134f70dab4b3587ab1cf4263d77cd21f8d3dc31e654af2618f39c59d2405c2ef3981c823ac86abb68eefa3974947118a9d8fa2c390c62ebab7c3b2c151d7190d52e42e658d932df3227739bb9a1697a4864531ddaeb773a03b896e461b42abc3182a56fd37326e7335b261d12d9b2a4b72932b95e6aae825b9b5be639938bcd96fe3cf7244ed5d68ff3b4b5b7f5eb7471459435af77b48e58026daea83e5ced1a06b1e9a7aa033a753f61e753f536658245662b46ce6747263fdca66c5366abd3db1613f4992d9256f2da86b6a12dca36b435a1aeb884295c80041ee842078cf840a726033e08c312562839820a74e6b7a04d482b82e55e7d66af5e059277f1cbb1ba9eb26b769ca28ad82642125534a95ecc8bca0bf010ba4308f4d0bc3cc6598fb3055e06887ce9a6972eb3a9a33aaab5a9cb5cd271974e81a434113962905dfa0dd5538f9bfaa0d241367d8ac82e3d4c5de55d24c0eab20aa02d0f56e133c510a44c410594ae935f0ed5a9e9a54b08c86db275ef1c71823752cf91d2f2aa1ca63e73fbed78b9e9f6db41ee979774fddf69f6eb416e697afc7a90fb25b43769151760abffc7cf87974b0de4e5260d04bc0c72b23ac869d3bc829fb94c0eeb669d7e3a56a0ae13a4d177b9d4610c1d27c87a9d208bf2407528e3c743cb61de92c30a6c18fa0df3ee7a32c3d8572176e9f7e3816e18f9f15087d0dda2c32336cc5d7e3f1ee686b9e481de0eb14b3a74f910ba611e521da3c39e0da363ee42bf1c73c75ce6184d5f5f67ebe555879d4bae97d8e535abb8000fa1f55c1e22b71c52b77c119cd22177cb3578a9533956a75f9dea90db2f405eaeb9ddf2f8f9b0bafecb7524c0eafa5d0c02c7298640b4f55f6ed261cf36bd94c3d32edde630c8b6f5a91c2758e9ebaabbab0e59b74fa534cc4bcfa1a53c739b55ceca6190d36e39cc4db908b95b76cbe5a76375fdf8e568b9d6e1cb5b4a7297ac0f4144d24d2d3a872f6f79d792c3b9552a1dcaad3aeb35db9b42b95b4e7378fa72985eba8d78b78430efceca405e9e1fbf1c74a7de92e7eee697234e10bc6982e0e597836af0ab0dbe935e4b4e3d7e3ecc9dd2405ebe027308a3839cf68bd69f790ee532d621b8674ecae16bcf5c258741f6ccbd6fc745472c7df675c4414ebb08b957cf993956f6ea5fe69e6817c839943b9f666e28bfcebc9bc95c0c03384cd59f1dca0a64847641a7f8845cecc973a6d42c808be6cea79d73cf9e199a2db96766666674c4b46e79da555361539dd291da8a6c49a4b62345d40d244e704bb257756b17c0f48966011c5ea2b8499da9e84ed97cb622db11274fe862c7273b3a79021250470652fa2ca574d8cbe3b0251d521897b466d46d46e91b1a9ba818a933691c7193485d4aa7488f2b1c37e2629c1165d841931f40a108576002028800031f142dc104a22d44cd070fb1eb1758fe08003ce5039deaf37b75782f91ac34c0a91b75d34bc93da1b109d22219606e888b4db0c600d3cb1d725f0efac5942d4799173446639428862a031edde69076c171a7dc019089c829f8a00642af57206ab1022596d079e926b82852f6e4b82c6268e69e4c3028625183287e908213749103104c60065720920107a21c294319a28b2be2c4107164c810613311f6ce48e781db6560d76cba8a2d21a69adb105b33624bc7568e2d1ab175d3a2e1f4aad8aae1f48fad1a36a7a794280ba2d8933a650a9edf8e9ea12036a05c29f3b768fe12dd282b2c0f6d7864c0a8c37848631116e3738a5aa44919e817360da25ce0c83ca457d8330f6916f6a45bec79a35c2229a4747b531662fa0cef64bedf5bdaa75d1221bf10625fba29cb489952a62cf0905bca43f02ebd9b9a29cbb0ee20debeef29f2640524788111788083c84510ac90820440464802c5e7d36e32e94b74a16081c34b643a7dce0cbd4df5103845833823df0e0c4d5199660ea8885b04de2da67b6a71409c91530bc51dc9b8231c1007c419292a2a2a2a2acaf42926e6ab4f57d59174952b8d8979fc7662f0e9dfb7d3baccdd0e6272c3a94432bf9d940e89ec54a569798161dde5f478ba5e2ad46d8481a7cf244ee9ab9b7258b7498806552634465d5c0ce6e5e52d343a8cd9218d81f946e14a41d29867e50be546c9978bd1161dc6bce81885d1148656e9db45b4211a83cadc414262c01289e6824c195fe6f07e61c8dc94d22021fcd1b773c3b9d2b639269c9168b3fa76ea57b96e5b6d2be62465ad354828b2e26e42c50d993332c12313c4ba08ab3ce4805c55270a4d30688245340828b2a216b4a085959cd2a1f5e366c9291d393fee2ed66ca01b7674620412641b871e16292e7df4ed704cea676595d65a53959c50497341419432a134888b255c0499b810e2a2494792598bf18eda4fd6951c59341138e475d02d5db1aae9939a4da988ac18bb439828b2e2dee1028c5a0d932d88ba38a02d68e38038a0961839ee676e879c92b891704780a88b0b6af9789c0ba22e7a5b74d8124326cb48837e26d3dbc8a25759e11bda310e507d5cf40915a2415c10c7847b62b69ccc56b845d99313e29acc5678a998ad70db02a889708b12450b312d0c552d1069210aed64e4b83b8a44efe8a408a6cb1af911acb7218311ac9751f3193211447c7c768d5e45b0be86ac8a603d0d1915c1fa9b7c8a603d8d8c23589fb317c17a9d6f04eb67e41ac17a9bfadd00b7acc971cf90e3a6df8d958c1b57a14ed8bb51b7d44410d9f4f3e7435b250c36680752b6d081107c214acf0b9060e2450ab480e40b0bd4136560c02157c459bb3bf9110101b953ef41923295714493a55b00dac291d216906c6149a7e4257f220c36e46620466f770c820da8d8af1c75ba38834b2f0294226441ef167bbef4d2b9d2e32e5dfb76f4ec52d4a1a597b48d9d17179b2dab2f94093e992da995bc5e9a2b222a824f0da89c7454839c5801854d631186047a3dfbe1f86ecc5de9434ab445ac0b38a435e84a01f65e6b2dc7d99cd9bab7dfb13b582bed75883099f109db7cbd3bafdc61adb5f2d6dab0f63ec4d9f6af08bbb7979f4b6856da5f6badd56eadb5d45a7bcdf2b0f6d65a6bb35b7bfb686f1f57560321118d4ad0c5554822dada259e1f8e6ddf4ee2ae8b48c0593ccf6c6d5dcbbb762ecac78325427eb1f15736cb8e9f0e77d85f8ce9b89b8b39e8c6a71beb50023c3c220c5f233da47b44fae8f2bbe16d0e679b45b4d19e69b17527e5d08e7268771863415e5bd6d072f8daf1528910dcdde515f8eeb96dd64589b94f2e7221c01dc7d5186fbc5209fc851c11d16c41992e1e3c2cc83c99a16ced9c8d42a4d1699bc504b5779a37bf9deedd9679441bed32fb884dd8da0b1069689a474855a272156de7ec441ced3922ce8e1d226c33426cc23d8c536ced3a4418874fd85eef4ec9eda8315bdcb5e310718ab800883839d2466cb2c31a5bc3d9da5f5fdd66946a09ccfd44d850846dd7280928da689f2dc02147b4b56f99c6a28dc6c36382dab7ec43e21820d2d0ae1d0b216ccdfa441bedf3e06cdd6baf992e9bc56469d7aeb64313d4cec40e6ded71a5692024226ee2245deca2ca88034defe20cb6bfb91ed75d1e455ab9fc554e975f955097075b5e2e5fe3f22177c35cfe66b6841021bfd8303ee4ee984b190f712ccbe5a7c4d9e1f2bb6ce1cb9f666b7479d56c995211a69aa13573791d668be63c9797c721e2c8a8cff2dd3436ce4a08702f2b01e23f00d1fdf0c33bef1b91b04ac9f4c30f39ea10200391735c250fe0a6ace3a4bce3a3ccc36d8ee95676fc34801cef7ac897b2b2f3b043c70072acc00d33f23c92e761cf53f1bc92e7993cefe4792b9ed7d1ed65253d3c95bd8ca3cdfc0cf94493553268c4c0e821f7f08e54329d56586ca4c1f690a38e4ab64be0593d9b67ec8e642db656c5da92b5266b4fd6ae58cb62adf56cb6d95de6d95cb3438e91463823ce318e541e639c61a7b2ce67320e1c8791057097acc35bf2ce47f9868cbda38300de994e2b2c2d2897971b3b3a0840679b4e2b2c2d28979754c6f94ccec9398c6ce32e19006fc9397c9403c082e500001bef4e01c80100367060a715961694cb4b8af352b9c667320e381c46bee12eb9f596ecfa28bf401b5cad1bdeadb0b4a05c5e522a4ffb06f072b56ea861c34a0bcae525a582d179a96cf3995c8316724f44057c760d879167dc25d3784bbef928d3701934bb84ca4a7e409d1e6e52d2c371cd0f7fb9a131e35d8b0c192819325c64c8789121232543864a860c183264c0c890e1fd907bc81d0d39c61b1a33b24d8d4905b74ccf25653d55e6c180b17686cfa0d271829de7d93c23c35ec63b94f45ca897aa9eca7a30320f46f3626866f40449d9a48271d37d9ecd32dbcb7786ec33393b8d8ec945dc2d0307879dbd1b7936af76478a9152c1808979d6d82b6595a3f24993f41ea9dcdef4ee4565f5628fdfa1462edf8e9e3d92db94a5cd9d8ae7655449afb80e06f55ebd6c3d9d7931562e7769d12ef6df3bd4b7f3e988b9976f47cfc7e9aee4e10cdecbac7319bccddfe0bb4eb2eef2edb074c4a00a7c37c1dbcbcd02eda7eb046d86a14aed978d3376d9a895cc0c0dc892a179337c3b50dbc5b3b965772f9ecd2c36afecd3ee607834f92d31ae9257e7b2cc634c7b26e7fc70530fc759c90f3a52164f761f32253de848595e16623fe4eebf93f96975548cbfe8fc4e26c7b88aa1738e133c8d70dbd9b6fa461b968c196a6c66d0b881f1624a1d07938bb8dbc525d74c307b29af4819a5f219a6576353bd19d6a391793734a460dca85e3b7baac6cedec578289519acadb1d6c6da19d6d2b0f6c65a1aacadc1da7ba81c6b3ccfc6f366781e0dcfbbf13c1a3caf06cfb3c1f3f0eeb2673329da6435202ac7ed8d625e81352d75670f57d2a331bd1bead150bd1aac6743e6d5b8a1a5b472a9d9d95bc0956fe3ece18ec6cdf468a05e0dd5b3c17a3532ef869629461b53b627c02befe46d2f5f5356a172117797dedd488f86e9d5403d1baa57c37a37645ecb5552790bb8b34ec6b3b9db1d0d354ccf86eadd60bd56e6b95ed6bbf7e96ec6b379a3f16cbe1de8d9aced2fd70976ac52b6575c804db72799decdf876483a62530ddf8e9e6d923b7ef27a13cc3ecaa70966592703e7588bb89ba4ef4fb988bb55704b7aaee9bda88743f560d6c3c93c1b9a0700ab721593aab4dad955fece353d1ca807ab1e8ef56c641e00be1d39dc3bfa08eb38c1186d46d96b3c9ba7cd72c60427c8e9fb04cf90c1b2a9a17167c8bee577437b76992ffd7d977d3a3a24f0a0049be6bbe347774c041c91de3d3243d4967a8bd1d9aa73527924f3075dec4872db73ab547b7beee8a20ae8ee8d20cb95f9f8f8f820d189b7f2f6f228299b2c0185179658c2c40818f9b80a631322e871c42d1f431b596a25f539d3091dad94564a9558ab276ad61da3cdfc0eb03c92d5cc6af599d54acac8c8c8959452ae649e336f56f4ab2656f432320fe5571a35412af565643e653ef34e261f1577885a5d85fa8c0cea41f0e28a0d0bfaee6e58db9466d387599355c6cb4fd60c85ba37cb431831413a2b35628818e010046b66ab7e522598c621e841aaf900290a258576b7d65abb6925dc8d4c50025197109108482eb169103c2648690c701837fd0ef43b666b9e0137ba86a05a84d5d308d6d87488ec34d24cd34ab81a09447f4c90be4a249c1242a882093134b1e2074b50872b142cf7c783dc1249934e7af6f34172bf77bffc85e5dd518fb3e5f21290d1f14727bd1be57b52feeebd0bbede097f944dbf391462dfefa4e7ccd11dddd11de9d4007ac2211643a067abe808c4ec911662938e43955b52fe4e27e99088ef225eb6ca49979f0ff8233dfaf77ddf9732e901f46c15adb2047f8f4efa28df9f72a8f2c8c2f23bfa773acaa6cb3b62094723cdf2ab81b0dca481b8a8e42176df937238d243ec66d171822fff5c1e5f42c95f97970e8522bd925656be42faf7eecb2befac77f3cae89f5df9257df46fe5f576e597f411d6615d91df493a4e704573af9c8eb3355bdcbffb7df7f5dfb7fbdd9b41195deed149dafbd4a91cf2a4cb9374c86d0e08776d74eddcb5e7cc90fbe435ed9c8a0e7bb6ca4d19e750888dbf4f8731fb3be927920e63606060c050a952a99717171714aaa585856565e57432994a2515158c49a4d1e8fb3cafeb386edb587478f7f7d357f2dda450db5f849d1eda4d6a79d161b6bfa3ee9263b441e930dba4af901e5b745837e92b67c931daace8b0eeefa7dc3afdfb74583ae51841920ebb789ced4ba37757198de4b5d1351d721f8df227bf01f4c49c391ae950eed1bf93323e2591e626e5b07bf67db443dcdea781747a88dd9cd61e717821762442fbe28b2f88f6909a63654b17795a825229e5a494523a9510b13e280f5e26512995a878a7c4a3e2e36d4285fa2e46d82da2811b9dd17fb00e75cdc7cb8853c4dd522ba1f221ddf1339f26ab1e8f5e8f9a2d5927fd5e9590ae64e5ab09d6531749d79ab2a39cb23a7580efa3f75839e93d46c79aa48f6862e551e761cd5eb12ba31c754eeb4a15a2fe473d4fbd8ffaad5cc6543f78eccf8a94229f54ccc60e3b74e0f1415d30afb1d6daa172d48191a30ecc8bcb8f20010f5e9df37a551f3c138c25011ffbe8ab1112f030f2e830f82f99e492bda3b2e95d965b95facae3cb5539eae41b2d59f5dd68868c2db65918397598bcf2f9ddabae4e713f08413310a3981376bde4e9414cc8761c9188ed38e2e681fc84a456ae7dcb3c458ab4fcf4222c7f7947bdd148c6ae8f4ee09bbaea3e560ee39707e62bf988f9efa97c44ea2b9587b2ea61a87af00e1dea53b989ed2bf908fad1dd3c567ea25ff9d53c4e7fd144e6e82bf9fb29affc259f7ea01f9d07fde89be631ffed2e03e29465b9b59ce2198d5039eab868de4d5ae92a2ed963c92a5fc9f8a74cc2278dfebdfaa0acfa1109e75a546ffa012a7d3d3e3ce004eb6b7d05b0a49fb7443bc6a880a9e7ce150c541a3ba9c39bfa2e62d20632374d6bad5587f3da63b21c06b9b99964b859b97902c69c68b5121d72a8eb26bb6952b3ba59c5980ca20e9647c9c76be58fc962c00bb0d471da21c47c0236da47e05d8b220c009b3e27c234fab25183b28087de077d0efd0e94eab083ce390196f7d408be7f909bad156257ce30fdd58f36946767bfd7b49bebb52037db9e4c802b145d2a879c7155a3dd537bf7c6bfe2094301ef305bf13be277fc4dfc2bfef1608cb52008534c2022cb5d6b6770f61f93256d90fba1b2eca7ae20375b1b82b2b67bb3eb3bcd6654c0da23ab9ecb31b2868855ca8d6f2286d8dff4f6f23f82683ac8cdbc7ec0cd9eda9ba0bc3c288fe55140dbb43a1862f7109be33e3e3e7222410657ea4d108552ad2858a5943e1ab8e2063929328625c430b442a5a4525eb9c46c6520862423228c6645a66b86c89a3841481a1498218e3c62c39ed761b26e1784c4913aa28b4674129fb071e83043508a1dbf451c1d248df928b70e122747d2989ff539124707794387734fd99348c3718a5be090dbde0f8930b9e3b572ebbc6ff4ed2069a75f766981fb7923884c9f08935b1609bf3dbf1b5548da59b4995b35c21de9e2cac250759ff87582b8e603c8cff7c0f39f3e427eca483d9c69255ed4a9b9469d485d3628ea4ca953dc533ce43f9e3f677647e017a5387b741a230935417afa7a90baf2297d0c0ccae525479d54a6919eb2a8ea149ebe9dd5042958812e32faacd3f97bcea5c3e4d363b2e9b90920a24e11d27d8f79fc1ef2de9fe513387e7e35fa00c7479d49cf7974f9753f119d4e719a87347ab663f21130ee1d261fd1040f18f77e84eaf8d1865ef6004721f5dbe34744fda671441ee0f8c8433a1051879411c193baf7318fef43defb28a7ea61dea343caa9fad15355a77ef83e7afd481369a26a1ea5c36822f2de4b27a2d2a9aa5357ff308fcf43defb3ceea28ef5728ae73b1051e72bbde0b853994a64f9ca7366cb5d32cb5179e5389fee65933ddd54e42b7da6d30a8d3a9f0acf298bbe48211c8b8ceebd08e9df414a7bf0ad3a3e9eda969e6d966ca42efa5a77a0d9c12c7ba522c270767614111eca1ee9cdce621689e0f9106309066c9fcdcb08d36e771c852c58b2b287d9d6b6ccf322b13b2abf1dee6a1edd8968f44bf170dee3774fa4befbd53cb87b9ac8c7e594761465659a8e3af3f3d332466277d4d33287c4eeaaa7594fcb7707361661f4f7dc8fc92221baac4fb85925a04c578c1913d3650465dda39ce027986449b2256ccc6e61bbb053f68d126d6ebd422d5262572ef870fa87a993e94a0565ddd19e59c0a1f5b99f44c0f7b6061126f7bd0d8a2e1f91755f837d43bc87a8c0930acaaa48b8c0df0ebf7d68b7439495ddc628ebd21ffa437fbacdbb024ff9cd77930b1cda980fa497d1b9f3c844e0889b6782f739489a08fac50ab07cd5b36882d7a4af9309de671f8e929e4d72b73bcd23656ec72f52716fd10e659110b9437964dfcb2311c6d11fcababf37167171d31fea9291656faf7d489108919bcbf487ba68944b7ff6fd883b8d72b99b7478394e45d32813bc5853291344ed51a65b4cf07e0edd2de2beefecb733aaa3d9041cda1816783e8b7def69fb6482f7dd8d36d709a18d3d42d9db73e6f5e815589efbe68b14dd0dab86cb56b92c75b69ce2a17dfba6896cd7b4e8a2f9a62d91c6962d75d8a2bd864b64c97cd3b2c3ef5b338a44351d294b02894deaa440e864945146196544e9e8d89ce241844826f48525bc47a7931e0562eae4cc0a5029b9b03711df496f36c319a276c4a10fb34f3dabc515859ad9ef046bf02bc5130cefaed935cb2eb510963dc4522f7471756f8dd9efc2df8decd96576fb023c415aafc0f2f1a1105bbbcc619654677788ddb52ad9f0052c80c4070c56b084a08423a72d4fdae5511196a5b67c7994573e54d9d1037788bd1dbf1d1f85a08425b366f4f6f35b9693d6ad694d87f5da67a5daa70ef0bcdc72ca6ab368234fb3166da4bc72e74ce9812e92eeb2e923ce06d32e3fee71b6381dca38f7962b8aa228adf76e6bb59d65d9d634bbefdd36ba39ee769eb78db27db37c334dcb6e96ed96e5ca715e9669d779599e5e96518f66f975df36ca9e9d66b6d259e94802b9b94e747135331bf6ec4929a596526bb39a6531462ab32871e6942d1e09ee64a7291e9874ac79286ba67860ac7b742a0d30ad4cf07c97a5095010a509385bb7b71a07e00465408324f8e88c7245010f74ea0d7078b3a70d14fd48a3523d34911e9d91c694356f036cafedae66a73babc096ba06e11e9d1e9d9d3ddb425017e95367ce216fd65db59caa5a880f3b1cc776ed75db1d3f1ddb35fd90029b4a1d63e669614f985d3bcd4052396c98ca41af5dd3a1ddf43ddbbe676b5f0eaaab0e29a043ee1a6db26bdf8d6b99ee1c9a65d9fb4d8d1ba2ab009135552b2bdfb7c39b3dbd3a03ee618cd51ae0eedcb57c778d7bf10437385f3713ac31c09daefac6cb5163cd664aa34da6293dddd1340d6754cb324b299d95d22cb375ce487d688f37559850c51361180a83167a42e80992104f7078c14417f6eca9c97d270e2f9a54adde1b63a4f246cf9bacba840438b15df6ed08d93c1e1e3e664bfe27c2a210767da501e6baae3681c3ef2c9f2698eaf17d94fdd3372fea4af518fdfba78ff83ed22fcaaae7340f2678a04fe9b040527773fa01a1119b7b6cc2e9940eeedd3b0d24a5a3bb774f03b1efb40e9cde610751ff6521e60df55a7d01228daa796680e91274d07a2fc6a8ef18033f5b74d7dfe4d01d5ebb6e9e2a037cf26a0cf08cbbd3724ff6ed6c97db8638bc109a7bfb93dd7d1e0e2f98ecc72dbfadb5e3d538bc6032c1a8e97077f43c93556d0eebb6f75a6d46abb7498a41f4a46cb9d11cb712d473a669dbf48f790576c9a280e515b8d66f677bad7aeed2a481f6ed6c3f026b46226c4984e97d9f4d9945f67d26e57ab14c4a03a2cdb500136378c1beb10bfb3ed452b0ef63748592751f6a23d8770838b445dd8f68732fa9c0a14794094dd7a559132a05e6824cf03e6ece164558dd9e41213db411d6c00f6b5633548921ba1a1059f74426eb5e32b1efc32c8a0d920e33a21ad9500dd661165b7d3acca8d897ea1fd1a6ee4d1b31418fc823b2532678bf6d974078cb7c2678b52d22da242f0ab501eebc6f44c22aa527d385fabd17c301eeeddd113fd475bfe930c17b237c2869f9bd8c166d84cffd8fd902f7fd10d4b5834512613903519124041b28220416e884f267df487dec4de74cf0dee52f77f9cbc3ef4c882dbdf3b8e74c2bf076df6db954df925f9eca2edfb6d45d3411235243b4fcc8de12756a29479d2dead8a2d902527a84b2ef15d83e96ae6daf3fb2ec21c95e9268735fcade1254f68226ebbe66ef0559c9be4b9e20b1e2d149066403d7d8dbadd9db57d3658b268aba72687857263459f7db696f9711c7238a34ee37296cafb3d5eded77b6f0b76bced50b9ae07da9f398a8fc3e67d3366db3b1f2100cf3de1ea3cbdeaeb2b7d7982e8fe866b6eab76fd1950951d6fdb6b7df082b7dd32ada63c24411f0dca1c704757931caba2a991075e59cb4d0e92b3a8cd9a56c8ba2cd3d572a956a7cd7d94d33711fc618638c31c618638cf1c769267082d98884554aa6d3ca8884554aa6d38ae7d9a20ade0f993f820c1161f6374ed9f7994f8469e73ad2f77ddff77ddff77ddff7715a89c4522a6993dd94c01911ce6e4aa2543295bc233d5ad53a9b47bbb34513bc26c0e1e6b3ef250ee5cfde4e7710c6a15dba04c2a54b253015fbbef33e1c4862d565c51059f7374bb2ef55746cdfecc8be3fe930c64525d321b63abcf7d609ec3d613d26f6f741bb749b3d26d963428ad063c29e65bbb7e402eded6190d3bb9abd25d9435284d043b2afb764b66a6be5268fc96cd9df7bf7dd9c421e11910765bab22732a109decf1d6654d45a6b7d10b3953d43b2afec026749a6ab660251d77d8664b6547e6aadfc3ef331fd3efb992d96df6749cc960d6bd0cc169d5832f656f2297b42d475ba9ed0bef79898ad52902c19f11161dc2e954a1e122f89d5a126816c5164dded960cd1e5fd64429175ab0ebbac07d1658b686c6542fba6df7a046fa6d7d27fccd6b6efa591088bfb7ecb710f99aea8738bec2b93d8f7191470fde9388737b6ad72fcaee69577f1b3d63a815113bc3f4df07e7b47a512f8c704af2ddaf7dba74c5790c9babf8f3fec0e707802ef3d9f18e5749b83bcf68af69698e07dcef48c4cf05e3ec125ed014df0dea4bd1fcfc8beb734c0618cb2ef43ef67dfffa0ae96df0f315bf8f79ecf6ccd7def15d9b66d7b10b355dad9bac035c7ad92c10966deef57608475c7fa5e1561a3df9f668bf4fdbec358c5745a6169d93c9db9ed746f3a94c0f66cb4a07bd5ecf9cfa3e6e39543b878eb3e437780bd918cbdaa3cc0dab353798fa96bf47bd46c6dbf57cd56f7fbcf16f7fbf8f5b03deaecbae33c3a297ff7bccf8f07fee81e7f7e3c48ffee499fb766df7bcfa15ede8ea34ec7719f2d20dc23141f221536b7ba1ac80d3d019e31ea8a8b345175bcf306fa785a81a23d271630bd0c227ff68c98de6a2228ca9ab7cf3411ec040e6b9e52a73a81a57039250cde91e2df5d3969fce68e2e92a41278f36aa53bda833537d7d687f65e97aa8ff5a8da81dbb6e9ec6a997d8d7571469836815ebb76974ae01a8fc487310af80a282e3c8a01b400d006362d41741d36b78f08336d7a578095a06af01d6cfb180f846d6fa6d8d60a126feede7f50564b4221fdf583ba24908c4d2bc4965442043f4dcaa054829c5a88b42f6a6de77d231256d1bc92d4764cd0dad8a0fd1361aabd6d12686fb204dbcae892409165bf6d97228882826d2f9f60b9e5eb04ba176314ea07b794f208a640d60498fe3bcc96e6f2417374fda02cfb91dd68d816876d81842668efe3dedea16d6362505c142d443a81a58c09e15042d9f652bbbd8c325df2898c096d7bbb03bce51223b125ad1041105b12ca046d8409c923d4859fb8b6cb216885988462b9ab749fdbd22def23c2bceef232cb2eb017e26ded6d96bd66b6b467bf89b0fbec97baf0336c8f8aadbf8b01747a6b49d4869e7a5ff546d623e16f870ac7e9edd268b9b942862e76244a27a594d24aa9a534a39452e945175f383681628b4def3cad373720f8a35018c7c9c33cd539e86614b84e508211c78d36f1e3613e95b2da4a077431cabb69e6cd16b5f17d3455e2ca8eaa961d750d7a1c5ed1c6770b806db53759f66100b63d6ab6e8f7224d705dbddaf4b28c7a9abd75bb5cd771f25ac6d1c69ecb5e373d7a4ff7fd0d6f4b6f4e50a250dbe6ee853becec34771186aa99a03d77d5042d8e9b6863ff6863bbc7cffb70a4ba94a773d0dd9dee4e8712d89bb57782b646586a65b368281cdede34eadbe16e5f1361dbed6348b7a6d598a0fd965fd1c63ed302d7d8b6c8a535421b61d98edeb6b1c986852e76a4108337155b31ce084acacaf6a4d566da006e329027a18bd39bd72c90f4b4732986197c232373f392b9919979ce7cd1c050a7ef68f2eba6c68dcc6b8666e6e635a3c36f197dfa0db8facda5b888f4416d216441e36a6a52b239673c04a2ebea3b595486910c72ce3aeb672bdedfabeb67cb76e75c435057a76ddc56ae1e020e2510cf04e96bad9a449277eca0c304296a0e416dd8a851a3a666b59aaa50158984a02e6a674604fa88ebf5f0a50ce8e83d89a24740a73d5e8dd64b1c59f336cf0a5499802eaef888008777b6323acadff636ccee6aac72565ab551cda4ddd2760477bc45010eb9216e48e2c829efa96865d23299ac2696c826d9a2c69ed76c68838e00592794d2535184493975315bb6d33c2fc5b37dd344a4ce7d8fced4b492cd1a99e0b440d475927292729232c17992e262832fb0c00a593cc1820be8cc9e17601173428c0350940106968af869d689f6041c5ea108fb5ef1c966e7850e07ddb1525ae5bc18a3e4633582e3635ed8ec3ae16d4ee00d0352680aa13c295de0ad0ad2d438d21dbc4cd9f12853161509dd810c924ca4907c42fec82a8a80e596554c24d0212be406b6968382822a927022412241872612aa1574883a41852a112a11a24dbc3913b476b636cd5acd5a0444579c2b30569b27c2ec3f8388309000f38718a98bb5daa16ab76c1caaa6a65d7de58e1018d166debede5befd5b41d0def9a0923baa22ac2ec43d59e3b53cd08a3e286a431e7d55ae2d047fa459c01481ab30749635e2d7bfdb4767ef686c419401552ec49b7fdcdd58b36f20390385fec41e2cc2a648c698f54fb8d30bab5df6f47eb89334a24b654428773cb59a38da4213f0fd8cb19b3ce42b143d40546d9d65a6baf76efbd963ecb326badbdd75a6badb5f69ab5d75e6b03aa0da8542cd405a21e768ca119110c0040006314002028140c888442e17848a4898afb14000e94a456684e1689598ea220a39851c40101000000100000c08000bf5c68dfab770fe0a331fe3406dd9e62e3410304a4b83905cd573713468aa91ad6e5608590eb7de7c07d406540fdaa75b1e08180b5c935b7bb9abaead02a48160233cabe2f55ec91298badc36098be014252ac7cff5562ad2ef5a8dc482df479e65e34f41f18775bd50220e4a591b5bd80673325c49bcbec6de1674e061f99d6b7a0e9b09a430a800e51bf89e42fd812c5806ca86c61f0b09eab163a4886da276c127075dfde5ce7be6f00ff5bc91ae5f24cab84ee7f60ace0292ace5e6272c59ed597d50e7298af59f6143ee2ceb3bf2b2105c366ef2b2df21996659166a7872f45bdd013494e65e36bcd75afe48ed086337b87238537b44bcaf5fc1fee35658cb48f61e2af836bbc88e50c7ccafbc1d279e5f61aad5465a9da5dbd6b1db4356ce9b364926e8211da3f7b5d5e43adced6e9769e3d3c1d07b8b6768573eeb71d49af5c64ec0acdda8000e155ba46509d299a1835e54b8de850884e04e742967575987de7885a5a4c19659fb1cd236c057d4a9f65525be972ef64a2490cc83862360b319aa00dd5eb037a7bff6ada92fe9c6c0601d8151cfab44819746e6a552d83d6d980aa18ba281894c1e4f0c4a0b7bc7aa334ba13db5614d615359237563c3b709de0535c5cd86515dbcf3e7d73aed840c8a602d353303a520f664a3c26c7b4025024245af09e089822711983cc323119d4536ea546ade5f3a740043fb884417401403db51bd8a57577587e8144317f3786162f281cc7e611817aaa167920fb4e9d843b8132e5b53f7c1a7c162bc524a0030d53333b1a9668851af3a4cdbb49a113790b090e99b2a2bec96bdaf562a24914d56724e3b065a56598ca5e8cd5b2429ac6d10099611a001c1d64685d4866a9b25a7a9b12ef15ae7d0dfd210992403295388dba2e61dba7c2c136aea5d8135b706879617af77c6322fdd83cc85420789148a66d6dc9268f5b9c14087cc6165a120e42995f312556999a284e53617460b29bda05352459ec67a2544f6059fc9adb92f083029660d2aea7189fa539e0ccd4426fd790ce5c589038d0b9141177f83e0523c535973f4cb8ae61c0be1c7190b1cd84cfa21cee9000ac58f7f76100a8423ec10478849f597f3bd701c166165f4da8c1cc92c5c28f11dc81b13b66d0298abe6932b03d01f3021fc32fe8d07a90a1c431f8a61e8d7b38b5d87ee3bc53ce5233cc97d3e6b6126204e0955aa0152ecb2945b933468830e6ab74413a4e1207f76fef6fc714052f7aa44dc16ce7da93336652140e072ee2afe6b91ae6a46851572eb73eb075d48307a5db723d0890b381b99da9b446c45caf8138409370356cb7aa2f8e11081d0abfb1687aa6efce19dfe4b88b0ba577ffaf14f9a0475c8f056653c308879ddd017ec8be26ad8cb9ddf53fdc26337435defeec9d37a669c5392ab20d892a21650c1029332af4ceb5866e9b5ce58620c0a49c4554b460b5dbd26967b8b07320da1899aefd384ab430df775e57f306ec778fa6720734d16fb020992510a3b25ce198ab02e32932be38c80e43b306d72934511b7cd545a7113228aa58cf9f36bc261a2818714537ecadcf628f3ace5f6d42cf9a689a7acee1e620c9db9124157b4d54d5ac5eb8c5e9fabdcc2f5df118e0440f23dcd2cea53d8b10030537d0fc26ff439274cde29cef70b90276c9960afa61fd2e3bc615a8ddc6752424c139f143b2e343980a6379757977da008a8791f7c61fa68e86e7df8fa4e718563ddbb9965ffb424f94888d0fed61401246effd2dc8d4e939f14d6b0cd33ea66912c12013c29589619a67119980f972dbde8d0141970b2ac55064fddc52720e0d0f4c0379840ec30b23c7330cbe7614f1dc369b868367d171d4546a6711da7ae52a9fe48be40ee5deccd088034112c992d9f3aa0584f84e822e1027408b7130a62678a30726b71829d2192929d70a1431739d9e6dfb65fadad1731f707e8f02bc6dba38a4f70def69e1c4cade2913c1f5ad7d67184b3801b6639de45f9ed6a980762b8df74996e4e5aaf817ef400cfe4a68b09fe60f56e0ce191e82793acd98423d02c866d493ae3c02961b099bda8daacc0c5bba9121739934d03b6f40cea08b5a38fea304b8b3fdfbc55b220173152cd8f62e615123b3f316756795c3a94aaaf7596d1ae1b8e552b52dc6d276704327fd39bfa54d2983c70d22da7d6dbed8f13aea45b96a4be6c58a6fd870902daa5514028674441988332e02648008b58469f431dc3c8b6d50981672368c07911b5078faa3a7821a315414e86739876b81d9625e12691621e70548b69b679da0fb43244495d8557a3bf72b7a37dad6814812f4321acdbe409ce0b06dffd004d5bd94f1408a09b5d834e3d19715760c517c6e540be841ca0a9b4c9855f91a5548c06d6f7a6443a50827f78a8052653b35e5ff9e22c6f3e1158d5c83b4791d347aa5daab4d473bf3208333fa1bf246683c707365bc572b134633e0eccfd7c5c3c8e5d10c881a5140c1fd0749a47620f76bcda8c53d4f54836a30258337789be030202b6eef9cc0d935a4230a735ccbad642bf966441b5957884e884c3232d5b074c43f8a4fc0aa627e6281ee52433a8f2a2d4c19d81c30f07c6425daa451967024e79363dccd016ac8c97185d1200002c1890fc8f2c4749d918111643711bf4be5cdb3fc6e981665b37d19b5b3cd67f29efffaccad4353affa556a278bd7eb2f01f0165c0f630706fa6b02bc04d9de0568aeb5fb012dfa1893faea444a37a48bfc541abf56154ec7e6a1d8e25cd3a26a0bc8ecb41dfd79a7fc2fe8a191f1adde423cfe99e470551adf81130a68e340fe1119240a20fe013d3178286e74ae91a1eafc37b2e4abed832159abd7bee3df41e8ac99ea71a2ad34ca00cc776d707296cb164382c85b9fb63df57d3461ab5c9a58240652be7d6edfd7b4709681f200777a8e489ed5804ac2cd1e6eaedbb0b72768278e6a469a39f392e14b0cc1430ea5b3f68704d132b59b5d1ef2bc35f3140a277b9d6566f3c36f6bbb6a7edafd36539b5f196fc7784c2c38efe3d432ad06da62a9abf20bba8f2b30a7093d7ff5686e6f45258a8448e795b9c877c6d4a5bf94a14a3a58f28426b0ff76994887520eb61f9293b6ebf3eba03951490458de3fa0ea8804ab7bc5850e597f51ca7ec1def31a1fc518d29e97b0b4f2baf411852ad537d72dc88200ad06d0ce306615a819a18b308260e57aed6b0a345657286e25f6f8e0dbd10fa78156830223a57157e326509554422d367902267887fbbac53efd04ff3cd1fb6c6ca371520e2c23fabae3fec5ee22915eece2356ba7478ae5f8e33d0957b02d4288178e8bbde04a395356b984232e5fdf9da694bd4a397e9801f641dcde75f174d5550b482a1cccf623e90e4d90baca01368e55f43d7af89592527c4f88e89a017205cc5eed94b6509fff579b0c947f2390fb82cf847d9ae8e15ea1231270787c4268225bc75699712aa25961dec22c83785901ae3c9726c6b0627f45161ad40100c6674f05ca7dea16ccffb7a60ff8c115f5c7b4d16dad9c23a5acd768290b8d5ec8f34795416b33609b8f641236a9f243a4fca3c4f80024cc6eeca0617370d081c3a75aae726f198f0d7644b41e8211e560894b72f607e09ce326b399b17386fc7b6459e34364464ce818975dc61c23385d6a570ab742d097e043034dc10530407c1ed48b132cc691ece4d47c1b94ee48857270454d937a7dce200696a0a240975f3ce3c4961e194884881123a77c15403024b3f66e02660f10430f936fb1484fab3057c59f300f42de0cc9cc980765b454fbf6081ead3d5389901f09d2fbf7d0fd84b024f92e4ec315d965ae293e54733c7e1c552104d841d877b3baef65c4ff9da5f2b8a72f823856919827fcb9d437b9915bc2f5757981b229fd2d5a896fb82b253d16ab7407e5c150fced09c7511c8d6c616a322658c26ff26e5c2c2ae97679283c33b880b1bf31ce3c97288218a1f7d3a2dc0bc0cc677df3a9038c9f902da9984de9465c7bd084cffe9d6b2166129c9dc57a627623c058814d648269ca9dc06268053e6cb20da72715f8ccd8f596490614f692d33c51ea4690d14388d19688a7c00687a0d2a6f3c76c6b9c7a10093294ac1d7fcfcd388a65c81ee4eeaabfbf8b02174354ce9d04f5d6b594465d51aabb6ae66371661badbd488ef28a35058a1c6e3057f290a0c8fc293b597a5ac41bf6ee455fb9d8f54090385e785ec056c67a6134c9b3604db6d1eee3d940ea4b890387d08d426e36fc2df40c15caa6f79fed4057e3cb74147f9712dd05362f27ec1d49e5cfbd1d419b6db5b75356d6bc5b2aa646b3a8d0dd66d746e4368e623ac3e755abb5f47a2f6e82638f299f8b496bc8b04763dc365eb591b10b17ecc19eccebe869c1f644e18158b87922ae6abd9d63867034d1400e99d196c64203ce7c1b1f99d201dfd5b6b6c9aa7c86dc18e9985538b88b965c98b54e310c18cde95b35cf0011b3d48a80017e332e624dfc1461c22951cffbc2253c4a6af85fba844781ea66c4d2bd9fc573fd2608b762eda9cbee21aeaf65c4fd5119310efd7c9622fe6fe588871fbf561913102bd66ca6cab9ce994c9229ac7b5c9f3b1d7fe5dc2e9b176eb7d61c2dd9c257cd1b417dcb3b2e927f20f6884a0347992e3d04c198ec855a28f80469e0ff1d8c1fb351e94ba29ac81a787ab6fe832d173c26ba1dd82ac4444110e1d4d03a4360555c0eac55020224871db0a5f077413079b1a02b94a06d56e9f15ce925367725a1a3823f35b1480838e79d708d3f7daf51977dd331fd3aa33749095a600b1250a1942e9fc363992c87afc7d5a9045f2b32c4ba87cfe2dea395ba1d0cf269b05241a1d19931d8070ba6d24f366828d58f16a24b2cf60a584ce5573b4ad8c7ed517514a08ab1e8e1109aceb1112dc21aac84cd44f52f21e1d869f9c7f3dfa1e4fbc77bfdd736635cbd4db37386680897ce0f2e20470a4f9184cc67d5a99370f3ae49efe9715d31ef7eeccf64498a5b597b0d27262bbc2546b83ec47d5c1aea83f20567993c30dcf088fdabb6fbbf3cea93d079063011e1c7df2b85ccb932c8cc713ded803dc7758d66c66ca2e08f4c1eb8083885de42d235c746ebe00eec68b8e0e3bd1f83b180927421b5cf5b603036bb891cd6f4c11cbb6a1ecb56ebe9740388014d2314a49cd93a1a2d282cea4a527c0494cf40489378c808733077365aeabda8dd6006980606738c3a85f0a244d872fb1e7c83279d593ceaf336563156acff79d319f825ac843151cd0922be9bd1114b6d3365d397e050ad47fead76ee53613337cc0fa2ae1451ba53725d3d0d53c8422f8b97b3bd6a21b960d2f886a450ac08e136e3da127ea27855289a938b35a97cbe1da450a9b75aa6feac7d3a224ed8995f81a978df8050d4a6528b98dd928fb78d0776f8d548a151624f1a013b1f01f6fc05e9c157a4a3602c603610ceac00cc246138ad592865a4a9dbc245e8e614db1500477e19a4274a6803f0daafd42e6b37c78b30bf3a7702f5f12a0de5f18a54753cbd9ca3e20515b318c34e4f531c2fb24481aaf7af2b306634780f2040b78acba5706bb7a029d2a4dbf8f1c265d5f76dafb3ef1b2b30232ccff65ee9a98d1bd87c1deaf1e7b46d652cc59b6f02603df695c61e7ba461147c17d491c8128fa4b50870ab8012206968624ba9c7fa4c7019d472461d7709864e1fd017c2248dcef4395539a1721cf42281a858b71cdc80b04d097495df7cf7db07a7a3cc88a3941888507a981f8ad1332ea23773538a6315620d0ac0a0e90a98be7abbbf1ea6cce25334aef96511646033f265fadd691890acd2adb836b40387b1ec563d6f8a03d58922d6ec80e76b82fcc0c9eb44291f5de8f96fcf81f464a67a0fb42cb314014d4ef37c1946f128c6d306e22e53ae5e18f4289e4683977505ba27bc88c085c1c584a6d272183c492d8c0f3138377e8527e10d6497e8395efede3600351872c48e5b31450a7695b86020ac6117cd45b3c1b71bfc34ea9e3d08e620f36795d8ea914bf2aec0849773a8ac2ce09d875b4c1ebb684192cf354be94e2818765f84cf446909506b62ea69815f7a2957569e859c31df3b773afd9ed350845612fd04ba4894dc5d0aefbe0e1ccadbec49184b36e9513313993ec4a0e127dbb497e785f6e8c50ee37a5d824b380a18969f6c2fc43822dee76629e7c4c22e601d31dd08b333127e709c24f75df80b822ee6f61cdabbf65bfdd149e5ec701da41676969e38d01e234f239048d1e936944dfea501d761f75802cd0320e5621544c8617037ef3915aa1338e0dc396f47800039c6b8e178c4ccd69242abc2504c256b808b9fa749c90ee215686a4d1cb047ee7aa21aa066f207c6ecf9a22dfc7fc14c3e0456a860609554a64c19270aa30eb84da774235a615adba227b3a36636e2d658405a789d87de329c09081365d83cc4ba18331d243c8f9141e9ff971b8b10938715fd13545a51c334dacafc0c28eb690b82dee72c0d43d048ea1c259e2df597991bcd830f84735728762a3f285fe8ce7c9cfd81651e113a83cc4cd98f1eb45d5e2de569682ac636f8219ab98b68efe9a4297e5a4441a88b00ccf55e878ff1499b919dd5f9647e75bf32663cbfec6fed67c64d97d12f88555f387532314c604985e3cc5653b85081e80340ba26bf595592e2282bce8fc9481a0d8ea08a825ac6312e5e96d2f21318ed899251c35b6bb64f7fe7a21d0fea5a5666b8e1c186a14aab74a103d460e4281dfc404016c7028cefea877e173bfa006849450c913e4e283b51cbb283108ec677c778ce9160400d10a2be683be7ead2f55851319e2cbcc0393ad4197b67d7f2135428c98fbd48ef94736b2c859d31ca322bc7a07f015962c99f8967bb35b96fe30da05c79a24c6e066a965a80cc391237c8ac7a97af2ba96a28be7a9e589100f6846232f747f18289186def76921628a666d9b7266018f32adf6919a5eefe861e0ed5326771a60e201f1f486acf8c658f2a502093db8321c74298c97ec47a79e4b3130fa92ef836165e9120070ba0befdf41eab01901db752e8631a522501bf535a6f3d57b58aa7499fb016d5b701fa2140a84d2b3e495e69e2a67244dfb1179ea5270a02686ea8115672e3d1797409695a30a8685e498b75c81459b3884a94cbcb35cd742bce8dc161a3da5b7e5dfd181d4874654000ed1b2c20027711019d2fa402573d04db4bd61d264f6fd1b443e6d9452812f65c09e70bd0c1f06e2732035443113f5124b119239e586e1ceb9c58b26cb9e796d341441287e413c2520d17c0c5c3a4ce0304bb9a3f2756aaa5904b65194fff527794e4d08c00994bf839093323831bcf1af18313b5b6668bfd7b68936f1dc2a38fd8ee2e4a0f3fa58ac5ab9cd2e4fd89fae9b70a840b13532e308332639e01cb461c9c7e81ab7e3bc8ca217c7c96d9abbbdcdf19441c1aa3e3bde1736ed8f2361f9a6e08935b3c3299178a3cbc945b5f5a74c3dff83068257c16856fdc4d959852496efaf400543d43c4313c74c9b1f7e7b0e5ae7665011483a51a17d0d8aac9fe15146b8bb601e91ed518a777fb388d14f7a0b545d9f6a1ffe200e02ee69a937295af90f2f7e43b2a6d139f8c747467599913917ea64e647b973b3790edf280992e857384c7f6dd4e5716f0c363ce88000ece632acac104116a6a58feea33777a1ed7c1073aa6c2013533084dd074c4394ed442ea72b8d1ab007efc09cc307282b483d785c932c19895dd14ce01a003b4ff157663fe11dbd9e85850cd2ff83286d72c81852a8ed4b4b51384891bcb7ec76f0aa33cd5722bfbc0ee6f8424affefb84af15c1635ba8479b03dc3142f87019f4b9c5232eec93fa9c7ada90be0b098778762e32e5393b2cb780e43ca1589048b0dcb303b3853eb7cad3b57dff43e0950b24fcdb79deb3b8e5220af252d93d6d4bce7a2464feea67970ff8cbc72a57e31792beecfaacfc245cc1916f4ebc3c8ae08b375b0a97cb1b2b4a9647647ce2b8d7a21926c820deecbfec02eb248708de6e1de1c194f52776e85cffd709f869553a36e3f056816dc60df620652eb985a78c848dfa8371d498a2dbddca5f972746c1012e3fc7359588b77e1e3d4ac9bc8e1d99336aab403493cb0209064ef03a04c5bb7a8b9f885e9489e20b5d481b797540768423e3570f682392c015c93c84a8fd33a3fda2aa1bbf722ede690e31e6bfc742b4d042a4532c8b59416f1ddf5f86d12f8fc6e0e39eaa91c4ab1f5adb0cc039029855c11bde4a1b06c69898226362496177b1163319e47e2774aea6b44bbf5ce197a9fad84bed778db7d7e0d4e7d5741fdf9e4be0931a9da9689f5dda04724a9d79552a04ad10ae2e7e91b1f803f4b241da8f1b48d40cbadba483dc459f0dfcf8f39e9567e4000d7fc20dfae7732fcbc8a57bc07370f5e2b8336d02370e062d54fdac4ddf1dcfd186139cece23b745ad932cbf764089cfe9e42718a1eb7526bd9f97c79ac8edea55f52491fffcbd950eff06dcc1d312bf6baebfd9b6fe8f3704bfd756faabf2481b86df9201f77d046836ba4adeb2c4af312ea3695742c4838abe1491252f09150070b16811e4f69cac8cdeffc333bd7de9d51857c9e0747f175be69a77cd516d6c7e3d1be31e1918ba89be6a5136b241a53c6cbdfba69c1b99f413df82b4ed430e1d81abbb368cb42cd8171ae00dab0b6e6a7d93fd2b62a3605f0d6678b0789614fd1913459f3eb965df8fb49ff9e8570d02e537d4a8e33d604d2dae2c1bebcda867e562a119adf43e1452f07d1019bd9e329692ab29fe36c990948f3e22e4336ceb5834c80e08805ea320a74e2a3398e0e7e8ea5890a530dd4637ccbea2c411ed0a88664ecd8bef07e79383f49b697f3876159dbba54cc9b8915655e10c3a1467a62964b402b947a2cbf69214087708fd361b877e5ec7beea598b39e018ae0a9171db70ce2ddd64c26d5a10b1108510b63d5d65bae0c129c2aa1b15ca1e8cfeb88866a6266485301d6703ad5306f9f024a99eef06c24b265a4cd5accd909b87e24d78a1bf1bd3b34950a196d219a5a1650973088763dad0f9477e6186fac7452fb5939113136168254b95bcc07808d36525fb18138e272666dbb1126887f27232f73d3beaf8640fa30807e2860bec4d51934d08f608f29701b2466a1899e50658d995d0f4a8fb022154c0285f1846af5714ccd923e8914a5dc858693c72229caec8cd320335c34dd931f6d9f7e35dd6264bfd10a51e92bf2a0c84c25d3eedcaac3a9217d969aa7af41ae4ba00b3a1a2f5d5cb51f5d6580e3aa895a1562a7f5c973086607860f50222be61e1a921c0c494869cc13bbc2ae026743ddac6e028f3c27e0d646661202d01a7276cc9a8c852d1d5f59d14a7dc85bbd3e1a3abbe18cd1485d74f0765a2ef3a409efc0aa4d9e8b400ff84a264173791a7c046dc55a88fa3347326717011799049a708454d34afcafde8674c86433f605eab635b2e8a756163b5c3a0220a328b115f12e8831c5e01343ba882c01387cfeb2a6a0a660a4ddff5d51b72bd31a56b30f18e9866e476190971ba16a3240473118080daff9b82f43a56d565c521ae387e87628ef377e6e0f1212a723b5d4ac0b68aa8fcd6d8b5e3bb6a62e9d5d1aa1ad24af66ed17a46188bf2c69706608ef7ff6d1d6818fb76bcd17ea794559024e9cf0133ecee0823654119cbd0e139846fc6082fb4916f7e4199c333b148109c34bee832c91495034e282bdf7e08306b282c958ec806e90045f913331cfd180190c6500d67d98028d8fa36b1da7db3f37be1d07abe00b5bf7bd101db9e4e1da90a42891a8e6c24a14c00443e91f8a224a3aa8afa7de23b410b1d6b12c2874258c5d848a71359b29faa44bf4a5eafb5bbddab2976f7be572acf9f17b4d2eaceb0e1b4d10fa61c28458b66e3ce8fb3d5238bf9775981648a1ad60a1c9fec7b6099da1a28cfb6847d826dbd88ce160fa208d56a73c244454d8c62394313b44397437f22136736af1fc3e5773d9429b4a91e3460ac52093d4ad7177a46532a68f2a68e9ecc49d655420025fa8789ec00b9ae02064c1e2452bc091b127fa1eaac7407994db5f311cddc84a358bab2987303763281360c939121808d04efe9681a125195c8990bf49e6fd2a0866446f68b65767f9ca9a2d1b6bbb12cfa51e0673b585c39748e5d7589297236180587b7c3151b4d10ca68f2e0c1e661fc86fcf2385329a5ea1a094145b7fdfe8c28010cdfc3b85447098d8d129ae7a01ae7a459ed8d882f3c17a42d1de090fee38e77e93d49da483a34c1c7faa63f1a5de1efa131d0fe306d8c435aef32b5854f0b4d52cbe703be05e48da7990bb84db0e1d41b76410507252f30e51ffec834dcc95b0132a8d768ba64234004d43687cc303f52b9c68ee7bcee56a0d2694f4b7ccef9c455590847e8bb5d61cd36575732ee983a98873d4a8706187b5704d6a1606f0fc83fea491606bfb250c4737d0678ecf35d6a166cbcb778a9c6c3970499531bac86a62fc2084d17f8b95c3573254f7d1d4bc223372f353b6560caa3451119062b9b158a47328356a2e259240df0fcabdd0e3fa98ff32805ba8dfe9ec0ae5e0d6b1c81ac7610891c81ef0b78ec1215ea58ac8791f1dc1dd2b55b6eb184d2ef85391001a97a5649d4004548aab4c7ef0e2529a90697e02249efeb383ce5467e440955f81c3de5291121cc66707dfd8d586e5ace7e58a7871d9c941a991562770120c91809bf809b4d1ba55675c895071dea5e76ac0c094dbfec4be3047215c3aa3047682e84211ba547528ae14bda5e7fad858f9b8f4a3151e6000f409c0a1411820770a80149c5b898694cd646933ae2ec2d4b77925911db9454be16b7f17ee2c6244e6f60168e793e990bbb87493221ff9e4a9b24f4904859b36b01a1c47f31df8585173ab64c1df27eb56f2626478ac2cb130b96b1dd134a0afe4bb3d016225c508555923c81d7cd5637ddfdf275ed9ec907a0041cede9f8222198a19a95c53e08133334e211d349090c60e2b039bee70ef7e671407c046741c4d931235273813c69a6691ffca0c69377f6da2bae857d611d1027f51d717cd4b9ae60a281c6a8e89b92e8a39b4c3365b1539aa406931cc5c27c0f1854dd390d17dadf9056e5d25cc82014f7e4211cc22c9d08e928f41538ac2ac0cc3808561409f6726fabb72f3502d8340a0e038da5daa95f69e89235380cdcb926230dec0918514b4315c0e10b0e857d6bc4389f7ba48163968870978292039086561225a71bd4b82a403f990859fda5749ebbdc25e6009d456aaaa4c893903781be3ae764dfad3812d99bbc953dcd3c8a80a94e53cad31990c12fe172e03bf782a81240707049c3b747d25af2b6cbd566b0bff16ac78f3f15dc24ed02fb1738e9a90704f3931c9cd58e1d81a88e845990170735f1d3998f882a6a45909f937c0de4caa10dd60f1501a6301602d1dc09272510338bdf826fddb05b01dbaafd29a52b732489c81007c4b0d41e96903316ef9321482a370474537e71e73e87097de9b0a720f7991bf0ea2fb0b7041a7ed44090286f2f1aae9142d1d76fdd6d06f06601730198989f66c2a2c6df00da1003742dc59738e3b239f6a27d620681cd169c5d78a1fb23392e8b628afa4f8e752bb3e19735d8f5601f006b0fc86dc27a27a2628927c709ee65ec4bc9687170f693f4f75be2a2dc6c7a589f381c1f8d1f781128065d6fdd3e14add060ce207e73b6ff5aeb590b5116487ee80c2b643f98469580f52258725b4d2447995db027b955b4e5f610c078a4250a35d8de0c081d708d6ebace61cf573eba7ec11ff8f9c12bba8b95c2270fd0fc2ccdabee97eaceb97c7d787596176fd8caf57171127fb829e2951ab4e274cf3329be9f72db319d31c98cd7c7ccf6cf64dd8f051f300cb5f2a90e2df2dba602b9086d2ced1a56120a624cf65ecf3c480b6c5922859d526591fb8b00ae16a8d3a141f0bb24a804aa79ee2c686a04058f915c0a78b31e0d6839efb8cbc442a5a46958f0d4cb9817e5dc179b0d612901f8b9d7326db40a061e729ecbe4b0b84abe306022bcdff6b01cb2a3e9710f36765c442f06861d2aa92870e34dcafe27379e2f8e0a8321436f4a90b3298c3a318934c28b102302f84362b10130ee25055f4ea8625144a0e4df4b85ed93765c4f3e11ddf2a6fcf680e8f229857f3b934f17c29cd4c2c7af483021a2585361a5cafea9b3262f0c335063b79b6bd2971ca5d8f8c4ae1a30af32d4c899fc4ef27f85282f6897f944a08c374c17ee607a1106698def29c78c0a170c61189e04feee3b490da341dd853b42d80c2b82eb788139f955ab56dafbb8f3fd12cbf0afceb2008a11dec568610c2499a21c389ba9459c5b0f241428ecb21b2cc809b245cbd6b54806efb863632185e223c55e08173150cce9d685a128ad9aba67e724c8c49919791b66ea93ad21209f50c095da1db41970b8a60101827a7e49c9cfc65b07b09f482358e37ec4459c1c0d20b635263b4742b1634c83a26d66e6fd876240280432bade04f048c15d32d374ee04f6568a3987ef50e234492daf9a2b56d17deed8f80c805e1c4a692f1071abb8abfdbce8a98a15e87594aa32c2f9e204fe88eb2c5fdaa8c785f57aa0e72e05775336faf128b1646d590d5ff609d26227eb49896aba42747abe61d90168254f94eb5d5cf899b6ca48145cba63c1cf37be5f416e5726ea37b301b8603832bad474059524dee06fa8315a7acf15a2161100accba15b63eeb5dd64c406475b480f2efc24214d2ec930c34a14e00da3088f4b635e5e753143c58bb930cb7a0a01028e99be9e2f246be28b67002c83a2c46a7293d6a36895c9a9c1931c3f07696e387ee8c1369961268b1f3043e093f04f395c3c4b412aef1e1090b3c71ca6dae93ae58b0c9c3ff7215c3df20c77512f6d1b01bb3c26bfcbbfef975edf254effb9262fb544e5c4ee6b0fc99ba3f823f8ebffe8126b2bd062770c181b18901d91d55502c9a9a3c50c1fb2d7f4323eb165ef784e116f6e550795a252e38d8241e93baea5dfda8b63ef60729f4ac2e2b5a0b9b10467473dde8bcfb22eeff9f55420b6abec2d47d7caefb6188ed4b19e2f82ea3620b2c1da495997f47da3764ba859a04cea91d3d1b0da3ed2ba77483e4f1ee407292595aafba59bd092ea2f45a25ab32563e4c04bc0ef71abce744964b30df3484525f21b051d5047add7524070ca48ab85e4705c98981ad67e121d72f6b0f28ea130813432d4ca15183fe60c6d3885169eb505f383034162ee2b969194989607fea48bc8ce06ea914c30455cd55eb6ca1dd65dccb844bd03d6eb50bee7528d2c9ced98e3342dce6c61423b0ffd4a44153108ddb168f6603444cfecc0dfda006d461a81c8d6758579475ffb22ddaef10f0db813784fc2130ed6a756e4142455b8a15b95f2dac8b755b17eb9e5636706c515df56f6652ceaacaf543de3e50c3f434415c93d829532603bc061ae4cbc2b88b5e4dbc2e14f019088aa010f4875e0e9d278cbfc131b0afd399e514519c31e9b51d227a84129da8d22d12b4b98432e3402d80c6912408ea9bc293474df2f284ea436b7c76c674de1512dab19cd8196e21ef64cf2a9addf5ee5763921af4af93fcaf634c18660f371d2d31b3ce86f245386d97b7371f9b1d5e1fe56ab329ed42100aae398726af3e3d4a5062185403e6ee9581a12814823ee855d0678c423391dcf6aab1e1cc7442a79ff311dcbc82c02e6fd8652684cad00c9a18a83cb341c0e42d648eeb4ce629d1a8e92cbde401355279a648f5d4fe6a244e95bd637b07ec95d9d2e39a64f29c58b9b884c976a6f5829802631b876ebc1c38c84521c60c80565942624599a5ee49fc5674b3fdeb20a7155d11cdc94131ba59fb6e32133b4f7f831eea07c09ff2c645e5a6ef3470f62b3d2ccae381f7861abca7bb1c2ccfc81e7f30c0f6e32bf28336276f27691659c961e40df52aa5a059e66a6345fadc1382bd1f508675f8a7511003c5c7489aa23a150de96f6f00aec12fbbc9698ba7dca35212df8bbd0a49b680e904221d21001aaba6de1ffa3dfd7a943887b8ff6d56212c7ce0baf71027dc8cf5830ebf8848b12ccb0692e6297d2a92903e909c0acb00aad19b4702184314abded4c9401730a8ead1ef35189443b04d4d12cdc94887a2bfa9c57fa9f30c25cfdf674e1e83d6db4d25d3c35f82c3149dafcc8f3ff95fc2eafd19084dec2f5fd5cd1fed68838fa4d4295c037fa2b9123506c2b56b9f2b1419a1fa4866bf8df282484a9b41598ce81e2912a3b25e39f211b1251f7d5fcb14f73d6fe16b97789ca2fd7e546a726fb46a2456710323bbe3da033ddcb8f9e68b2c4ca2fff7e55a43fb5a1024c50f5c20b93acd4b1e889c979518a886a9b405cdf908353be5515acea081ff2334835ace2a3919ee26dd3b8ae547df02442cdef84a7bc795184135873f5d50ba3f6d819dc4eafad5cad2a7736c016556a4de82526c2939b69e5f8b0b9ee956a5a23d57ceca9fb89902fdffc47fd50086002fb4a39cde999b5625eea0601a055ff5c79f563565276778f47f21280fa98aaf0b5fb3aab6e9d381e6ea62c01f7ac2af8105d349251c3b16f86f17d52f64e5be3cd9b18329a63192985ce65729960bcf0e259f78e322842bf379f68a72ee6881351942872b673501001c71c6f727bcb00daeca47fe833fd52be695d24ab23ceb558ec9891761c36c090c64dae92fe715ec2c5e3a090552522090473ae424c502a9c87622f24a1dcaee01e2bb82eb010bdff856e8750958bcb4ad3705d202a4532a721c8454cc2ce422509bab4b5bc911190cd531feddb4eb71ef5b54d90fe94ea66fa2484982885a22a4befb5362c8bf053eda879f85c7f693e84a7011c935bfa1e9574693b2d96c9a45ea19813a2ea1cc36af7c220518444193cae19e269e1b4434e3564b2e0ed289d78d83c8284d5c57429d76ad65d75030b6155326ac1181d7a5f971be1a5b3a85e13c45479694d5aff446c749b33601d28a3215e3b4e75f5a41201f4c55617a273aec3ff1c92f01fe770ff13094edc8aaaf08e967d3da9666e7ae7ac4ac22bcc9086f54f84f57cdaba80749ab1a2ec93960349986d10db39711cd8a9af6fcdd4e6b50f0baeb442d1cf09aedcb3acc02ce34cc8e8791786ef8ac0e6de99c6c440423602e403f8473c23e82b6080a499b25c3ebc559d8167b9089f6896efb498380b1144aebffa88a3791a496bb519ae7abdb023bbcef1c133c9ab308d0bada1cf4361e9cafd6409c3498cda74bbf1fb404669fd61885d17f7c1d53766b1d36d347da476020b44315b751a75a25c8b238a7d806a32d3455f60e8b59eb88867c0ed59b412cad0fc6838acab2b22a9516a1e328c8d119efa930772690a3d6d62bbf0f9978bb9ca2b1ce274a11895ae25e859405877d6a9c69b98e3ad939ecabdaa70fbe158f111359a925ac1c39f8dbc634542fdd9830027f587a28a62b1c34ecab9bc386454a00ae41d42af81863bbae85da2abea2f1d1cc151cf6f9f9f1bc919005273d4e2321b643b55c0575c5477090ba51ac5aafac08f9fbc0acd3f273df85aab79a68397d85743fcbe085de5aa44ee1c0f8ad26561cf4aab4678139e43a04e9b7b252d95461e7155f449329150d433659ab79c14deaac2a52c50bdc52615db12a5ee022358b8a57f30217a9b056a4ba57b8488545c555bcc64d2a2c2a52ed05ee526331b5b872f7ba902279c2f51dcceaf3f432d9d07d69210ee8e5774c8940299497a7f2f4f21b25c9ca04d7731868028a1eef5a49024b48c7691f3cb5b0ea17837780a2437484dfc7d9c974748e595054696094115802e189125e86db8e07a3e8d22971b77854b65ad15747b9343794e3a5b410fc51450e97966c7857c9f8017751864e9038874b20c168df3be5c0e5305389c1d94c8c9c03dff0dd09130c8bac704e30bfdbb534c9ed782c6a1e85436a975fd985ba644683d0ecca1bea7b29ed64d987e03b1773586933a61d16c100804c9c122d07b1a6510977536a27980519cbbe3e8d3c7bf4a57bc7a1add805bf9a089e1b01a0fbd485e79c3c0ecd3eb946e30a2e4c4a689400ae43424fce9129f83a32612ee9a75ce410f3bae536fe9445c6425486ebc9386d8d6f9c467c2b8284a8b52a93ac64e302df3a28add44f0bf42999017307c1a46bb637ead0def66b2c1c874b850cee46df0ce106b40b4f3d84c4f0a6cca478dae34e7b7ba9a070cb592ecc65f774a0392b4db4bb50b704c2aeb14598e4c4e1bb9e3701f431fe8d4ceb0b59710c2983060f678f4051eed02c4fad586f1474feae9b427adc76abcea75e643f8450aa2717a9458b6437fd2c5e4502ec9f8ef4350394b29b58afdfca0d4b902d6f86a333caaa22bafa465a9d193e7e58b51ce56c400c4819cdb831ec59443b683a4818963286cb15e7f1cf46a38c81d8b9a1172aaeaa66f945d1e1455cd4315c669c72303b7036becf0c1b26ca82912c6a745d26f28482e3181a9b28f3c34e4ae89f1de4a5bc3d2fca18a8fb9072b867ea6e5f3226a567e52124d6f0f38c88c90b00c3cc0ddc8ade6dafca2ac52863d0c8ca6adae120db28719d1bea09ac6e2bdb665e16c98a506c530d64c82dff7a4e060f18471776b470b4973b4bb6253919c3b9fe79159ff928aa89624d265d19830aecc32b58393e9089abfc9531081f1684c3a380e9702462daed737609ba4864d2107962d8c173a33026a0baf5b8d1a046a76e49c8d4193725e9a7fe97174f2f3c31fe5b4cabdaa41e414c43e14e3e9872ab706e3f448385e16ff6b91fcbfc4c51bb298f5d263a0a340061d36983911e5bd9d7ff2a51bb73a942fa28ef2ab2e1ce2e1439f25168e69ea238e5d0bd8b3a676dc6d449d5b4a3cc93ce2e69f70421544fff58015858ebfc853ec930cc1cb3cbbac40ce640d1557bf07c71e254319c21204af1cb9db93f7c719267fb69b5efe06b52a00e75003a0adcb1f1e55b19b6d5f187e1a615298e17ae8dc625740afe1510d074894d3da732eea017d2ebf35a3ff3b78bf955491ab60eef00a041665c502ecbf7cf8d3785c423e6f5d5a28269d6529849e7657d4f32513021ae4f39c95a621138339ab99ea1402bde8a15262f84c9032305be0846f6a5cfd59c7ba16328c99a2f02640e2e1049c5113cb51ec202dd7e06a80bbbc87c96f8aa15067d7d1936540955aaf34eb63a2fee40f35aa43842f409507ff3c59603cc5cc87d870c8e32e084369ffdb413c17e0d345a8a06d13727c490c1f2a41326c4c738ff75c5a800e42ae34967a82de2e65f647575b986f9ec7da1400bf7031eacaa38c2beb53deb82adba74a9a035ae2030c10b05564612fce5bd22f6cfa575de5b9711cdf20159db9ed2c448988afc73065f0622c81f5fe2983a5fea1700d9b671ad3f16835af727172b634b4b23dc0628d0093dbe2d7a77653af4142df52aba23be20307f458e2d0ebb0b2b6ac135bfd1fad5662054eb0ce7f7a77692fbcda29c5a946e8c9371d178648f9d92508b6915ea157ca6250ceac6bb4a6630e410280e1cbd0eff747cae8c083b747ac4a7201d7ac8e4895d7655c51e47344acf11718a40bdfa736d4187203d02ebf20dad241002dcd314ea901a702426f834b4e92d27c11a0967f39924014739d42663374594142a5daf9808f158dc3ecfa3164a12aac65fd1924d6d2a96689fcd3437aa6da64477005da0ec6732d14976760180ef330434f2fbcc596c14ac8ee9e29fa744bc5307706d1774853f2936a165b309310eb1dd6b39101abce71c210df74adfe7ec961b67f9aef03d5133c0bbe7701a9c525c2900dcc35ca04200419e602a193fa275cc47b29a0fcc75736db4c1d08a1d79cc1a162a1b3fdc6267c9818f2a17887eae9696ccc75d34d962f0fb65b882c9c00f8282842d7363a1c5d95914af3053ab9a960e369f3605f516e3840079807ad2e1f6ad1fa563d528459ba8be15d783f2c9e32950f5dc07b98eae96d5f8dfee1a93793ad8c146ff3b2f921ffd37d8b0852ee45ec98f3bea17b85c80d0a3cbc4889760de15550e5906d63821c53c7cb9c35d427ecd15f442ba783e3fbf6840dcbbc7120c9a47f541e55308eca118a5e4931fee5aaf117781cf7556a5167656d628bc97612d30d94029ea149abb15cdf44859fdd1cf817e6ebbbd9317616d6f1fe2ad019d1994ce3773bcd738a3d31942cd07d23b09e71545f959ae5d40b6ddc4b64d18e346a22ac0ef7681d405dae3fdd01e077b528537a3dfd484534c70ab51fcf25fd21eab55c50e0616f7dcbbc173e02c65c65f081ceddf8b6e0d8e1e122ca9952bb7936c505d8a14dc3fcc5bc206c9d6f65bcfd679631ad6bbed66c180a7b8f2eed381f03eb9991d9e98cf1ddb86e0b4780bbe640495344d72264d82596c17ee50d0e46f4be535abae4a5c4725615709d466cce2d6215eb1ada55c297af69013414254e880113669b03348fffb4210307dbe33aeb9b660678f614edd46d3205699a64a1652861c975117f4f4852967f67fbe98ceb6f6b31e8bf6fb2b1e7b3d92bdc5b6def6ae3e37c0808cd9123c752fa7d7488d2ce9c62cc6585d9cef2b5e7bacf4eac35cd903f5bfb55a399dca1cf6df2ab8fe32cb24cdae9aaeb46c121a14a8a0dd6eaba093d09af5d0b8167831a5ced12640e214241a483bd70f78f8a9e6992303bf056609fe2f94aa68fec83519782c41390486208e0e4423669548f765a7a95562564ba012b32a2255cc4a491589594511c64304560b855e2e415dde0a8a1e07fb5b851e7289a58d9532a41e3f7ff42706c79219057f7e2d89a27baba281e5f315659501fa2828fd32de014efe125094ec5f698bb1e24458e97aa1445668a15c712dc18a7580ae35586afb41425c7637a2fc5b8912cd24d1005c3e913d278b04411055a693cf34849fbaeeae536582a35c7b4f00b712dcd7d72ab34a8fd510e12a620df7642d1adb712a617295191f554f9d5c412956fc76a32e6da13f484eaadcd0d95c252d72d1277f66b6a4a5c40c2846e636cd2cc24fdf9c43fc03dc31339e77cbe948a0e9aa073a1007e6e9a6b2db890fd00be4b094c8e08c2d9b720840eb5b6c16e2a714bf25275f5e9857d172b2c89698584cf1ba0768a3514e17b3ae2d4e1099122dd70c41789d5ce0636e566dae2b62a7af0688a26df09c0426f2a0298427b990f4b973a5803f328d43bd7df26cdad877a852510f75f010fa7a15dd4c04ad1b5863e6356da43255ea142cd72e884b3bca40db14afa1615e51a7762b69967449b7f91de5fc68d4e90faa27cece3ad6de7927d13859ff46a52c4c81687fe06c294d2f7840b3b5ba75249896a32853137c04bd92e4284910079ed1ba1f4af7c1265e66bd28220adc23b08da7f44b5474a46ed51de896c3b89a421365a84edc224abab5825eb2568894e016cea5e67d0cc0e59b59b8570e92b73afffd1394e25f2cff8f977f802c7303c881b63fcb0392cb5868129d3a9a1b617b79a0dd31d376064b54a422a4d7e444782ef6eb3a3911f014d7cb8376877ee9d0fce67ea664c2ff566d2fb39707a4719b7ea1e5a31d25ea57687d87ab6279d069e700336ab4301f6b44eb6af56340bea3fdbdc57f933c50c416e3cdfef9ccd10fa3ecf200b2df65316b001a612188e167eb846783cf55ed4673d5c59ed1ef64035ae697eedf4b95b96090608d6bd9d9b5229d0c24838070c1f4604c5a3fb596152c63999767a624660d290de12f1348265ae4655b9e87d340a331f691fde85600dbb692f3b7be73d306bfb5a37455d239414f99ea543a18de22da88993fa566f59a55131f01acc4f855cd03db416a1120e10f258b663cdf21892f37ab7c89098ca57da1f22484534054165ed6ca016f0e49a291ce8ba01e011334a7cdee205cbe999efedc6e97cb62cce371d1793d5721d293eada6d525923f2dd88d43d727e4b3a663b084ae6f72cd4d370d9b71f268b84c26e620164756823b0d30b1c4b375944876e5d86050c08c595369e4bb019f12c41fbaa5751bb5f7ecf0650b3b5e293044b22f0eff55c53204a3196eb72dcffb5ad211c380f95b15e861692ab2f7bce56b02b897c42310bc4f4d6235c0975db4e97b03e49d82e3a5b4b44604bed21b0c0b05c4dbb401ba621d912b0dda5d905bca82313ac7d05aad485eadc9401d4ae99bea3c52f7c49542d20c0be3c354c99dd0b6b61080a47aee67f722a968fe5976995ac60226302b6fcfc539f94af31d7ea0c9df983a1a505906de4caedd18e7f05fcf58f8aafebeb43f017dac7bbf91fff38efe8a9c67128bef5741a17b82fe21b3f862bee01884ba8cd47f206693089d0e5811768b29433f1652fbda1d76583c968cc126c9a60dfa17f2036162e495a6bcb887ee53eae497ace395b90b3445909f7732ee3074ccdcdf4aecfa13ca82322e1f3b1e96e7a23386f1ba806568295989ba345fda6ad522ae353ceeba5ef4c0cf6b28ac8be99c0bf09ada2f37bca83935f78a34e1d1879087d0e5e1d63548af33d79dc0dbaaf2d57c0669125abd4129a24577b9b19dcd82dc09716780c319fdffa0b475dbdd20bd19390fcd483d6385cc3426456716686f34a5b79ef5683ca598d18fa169cc207cc1b0cf2087b44fd9e6666c6aaddd9302942c7c8063f4595e37a60d02c6f5731e42c7029c6447343b5b9a1a5b01cad742ccdde37f456f16cd2b0876a2009da351574cdedae05ec6e8c9c2441ebb67c1e7744ead2b58d052460387c9a0714b1510b2d0f231307580d2bca060db2fc89225a525e2d7b3fc78b9c181b91e75de32bbdedaed2e0188dd3dda4ff8167e917e2295a28c83cdf45462f42aa8db633a5d7ae72550c3b075470876206854cc0721a96406e1492d11c5fad1897b30ea3bb961c71c909fced2eba917ca2170ae498b1cc75dc49bd5d433c395a805768ab53e1b2ddf8c2e2fd0ca495be337b1b7233bc23d6e8c1df608239a45c55024f3d5c32c290ad49877d180596cbc37519f3a9714cb73dcb04a2909f1fc5016be155e4db1214d36d0edca412b42334b87e5704be8cb279b5416d3a061027bf943b99179220feddbb1a2c7a7a0f4a1c598848ed1db71a09cdb1822e5794a39de814958502fa85ac467101cc05d9c4e8ce8b26767e3457fd1eb6f48d2197701f21cadd8a1471cb33e9435faafe7275cd7addec61c0464ef57822f175793130b46e2eda06853ea3df14b306129fdfbbf8eb3f74df916cc7458eaa11a2c8f802d5d374be5807baf055faa8f4f5d0d354308d25997831ac5c88e1523e1cc47e92945e2fce57a5e5ba94c85eb45e1e72e224e7c9cc29f56ad2261775524bebc7c91ac08982ab63a2df8eff84ac1fe94e8f4168e9a0d6789de23d8d85f468df741e3c9001f807111c8964139958d99e2bee7e6b6b2b50e90860ed63d1e7e19501a3b2311acb953006d291ba1051a38969d4f7a1e65ac1705b59cf6b15bd764310c63ff35e3d6ae4b7bcd7d06b920000a49bd17183c6dcae04b6bd93cb11ddd0ef773bd6d1a9d18c81eea102fd4879daeae40a0679918a06f0dbb32e77e77f4b78c3eee6dd5e0e366e046856acc80b0859e1ed6b7f2cfd725843cc9fdb5badc104483e23417ac76f9044908b6a1ce1eda5168ac6547ab8e41328c6c107a322a052a94ba899eb69e0eea6cd6204b7e40f3358230b3ec739c64a30857c4e4acd4202a0b4f65fef59932126221d492bd9502012a4fcea592e46d1d16961758d03f992faa6c4b7823ca0c67298ffe4b6431953ae812b5cbc22afd0bad255d720a65e44f0313b39c0eeed44013445940423cef46511b0995504bf4ee4fb9e2e8c99325da731f5a60671a179a083d4e62c0217e73f408e394bafd266b482011cf6509617ea53363988fc0300e59f9ca0cd61be1fb4c9b86f9b5def8fdef8bc04a89107570fe24bc891feb900d8406f16067aca406b72c6fda8a04076dc4ca9c706fc99193500dbd5373c7602fba803549811e8ad1b744b4208ada41d6103235d9b05a2ccc5933d1df23d298afa95b428b1f92f281750b37891b3b466dca430749321e9128761dc2240d2b00135b8c1f395ebd3908702cecc311da116cfb6761302656774fd84b612240db96c161528cf1bfac32bc58f7d306b346b815f7706d9fa0f463c9d410c180393baaa5731c8204426c3ab8d2cc83bba92d76a0eb275f7b8202641c863cf52e219a87c4f4598f6afd986724e0e8e1309fe04fd3738285f878bc308511ed245239920a9520c8dcd84a30707272774a6448010d1d0ea0af73571b42b6817014aa35e2e742fb115ce0324fffbcc569fbe34a7ba18965456b0d02ebaeb93c80a6fd6579f693c632ff9dcf170e3b06372350f1439904cd17ea61094f7ea8e8c930d015fd0e7f6f7b2d611626a8cd8d1720819a4021cebef3d177cc55dd2e3ef4682ebc15a8d0550e16e0e6f2b301ae0a22beb501365692dc7f033c5a61db4c99fc4194db781630498e80b3ec7ef778d2bcab28a4d527f994415d3c002f897e089256c59e40d050cc0b249307580f4f7fc14c41d0cb9d60904c11592a8fc6b52254bf586728ec9ef2164437442f9738936d1f27d5307b7788952b30bbd68d727ce422d137b029d0a1119f783462740d018a60c2ba1d5a89858dbe3e51eb7a90da12439a4088f693184bb3a4b30ef9887983d54a37cb09b342cf2a8435cce6d21d71bef413c8fa8c0e0202ac724e86355abc3479050094a536a7b5b91ecff319a2e9d241046051079765b10d0fe056a5f89e89ea39f7aac1ae137d5c5359ad5aa531e4090b458b08a33e04a7f093f8156a0f125ef37b77eb3b7bba5643e789f2771016ea6c3dc5ea15c160cb752f6049f1bca072280f861db19abc7da29b01d53d3e4c1e851438cfb7859dbc2a9616686d47f10e5c72cdc0f0358de11c6c4ebaad9f9509bb5afaf4d58b0ca38bd13a95b4cca7f57429e5033085dd92588d9021773c89b150ed18bf6871ecbb6f416fc30f41c516633e684c93385122c31eef655002aa338723e4fe4534cb22b842d59cb24bddaa167816158f586499f743f16df46fd5e83d0f9d1a1ec394f8664b2a6890ba5074fd6cc68704dea18582e896dee78a443aaa66f45bd6af79d7603e1a6fc57d2d776439b912426fc4d3f38d5de56746c9b41c23445afb8f23cebf0d99b707bf3c556d76606accc00ac859e30b6cf6c61fa2dd19ec9046d37f8744c0d8689e28cb95386462810e30ce103604907b667b5cbc05f5dda1ec00fc8e475c67975994664c45424e38ac42106bc52f6f65966eb62ae1979d078e87651e8d455a02d0b6fac0715180a8524f302734371d8d0390a3cd6ac17b6b488923ab61fd6bd9922d2183fcadc9f1551ff5d6af547257e3b958886f56c4c6d870ae1f4f7f5c3fe8c575b96e35810e810c85005e90c1612186a47b5ba9bd6ac61fb44a447aca7612b690969dab0514c054fc6d15c5820a38af6c37d5a0e8ed27ac04c8dea829ed0fc92d7e6b446ffa535a577253fca32a89d80f35f2c9ff44fa12454bb64830d60f2aa4e76a175e5c7bc109ce4b51b725a334dca68c19712f2a12e0aeedab65a67987392e58bdd43dd9fb6451a0942c83eb1c9d316c896e5659ce9fb524271c3a8d59b6ac7ef9b0fa98013408c4687a26518666105aaf5dac2a5b7e3e6b5517e4d733c0e6a277651192487734a50ab5531c8c70c49eda8b1cbb4bbedd58b9598dbf942b34afa309a733580fe5edd6996565483dbb4793683b52f3ff3d5d64531676259113a605179ce63670bf89ca9f89c5bc24e5aecc3e8d86b29f0e336a403ed64701b9f5511a9a0886c66c6661c4b7985e961eb59773625ae8a8f053d7d6588dc5eacc69643be608c836427df58da022f8265f756aac564f5c205889b9e9c4b9af161ca44ef0b03fe276ff3078af0c2f015817735999166cb15273045c076f4d785c9aa5de224dd4055a21a9c04492dc63c38a885e8131f62e98d4bf989836203e0f232f2618e610f78d1132143054ba0ffc14a89e79ca773788f73a8b77bc7b125b7d28f50b311ca64e0f8fa1953f15d9504e5079945a681ef1380e97f77bd05aef0dbe69102ce3033e2d474402f77e4c8865cd1bdab95f2181ce2c9980a7aed74be51246f6d449b69441b122858c524d05d0ddedbb9f3a00fe2fe8e84437d5a751be4c7cb1a8e94dcceb263c52d7d8b1eecb06c86ace03e00153168734169eaf37513de58f469b1837baff42ed7df27dd1941836e00f2d05bfe0ae432005970e0dcc29425d7a12cf79e948bc608669851b61f3772414ddf255c13329aaea0e1babad881fa4a66ce7b5345c8b1953b75334cfe7ddff57539fc8cebf268781fe8900370c14837c955d9d95019413dc3410d6891e0052a036de8f1432841e74750a0781e3e03da03ac11984f9fdd3e40135811897dc6c2527f8c8b8d8802392783760cb47192e16ed21a5902b205d35f240510751e02f59b779e16825d4b1a24eaa50e2c0776ef53ae04c6f692b9c55b85ddb6e719e76a14437aef1438e1ac8df5a954de2660d0f5e791b408d434b200becc5e92ccede122ff5110d78beb01cddfae886af23fdd6b99edc64327382c4422b5fb4a16f7fefbddab7f9ecc9deaee948ab46bb696c4aa2732419516fcdae28eecbf90b37f751224635990b001e84694c69fcdbfafb1b7cc59e66d61a09f2fda5b39ce1cd2db61841166c54736bded7168669c0a12d19fabb000882d2d0c337f6967c4b59996e91a8145031fcd09889fabad9020b153c3e81ab08fcbef5ced64794b2e321a8b9055f5ec3fd09e52827d154dd9a460a12c150ebe32396cc1d20582a4147c7db15c43849f19b1ec8fa6d1e969343230b13ef6433fe7a3e962ddf544cd7341d8444f6c7ee7d0273d9c92812bcabb15be83251961d461abdab416864d465549d009788b15dfc68260b2218875116e66440462f8515e427ff60a1e617ded86cf12ee063d50c0627d18b6f06ecb0706c3cb225af5a238476430aeb3e2636f4d3858b92ae3522bb1564de057ab7b37dd596c8a0d028672cace44deddbdd4b40fb5c75089865a8eb9f3dda7800d1b529e8807b8fc91d5e3112850bc140e9a183ad786689ed7f2c61275530d22b60c229c71478969d6249fc290e7d7837c367a3c7c34fb39a0463552bbd4245bc694bd7540b398e3a41684a1d09e22710b1f5f1308de0bfd2c678568ebd88c2f11cb259d80c98791e8ac6e7416771d9c07b6f7d4e24482c45ecb06f826d6c18e025b47885f4670c636386207d98a10a357c10d6ddb43ae449bd9ff70ffc7a63c176579707f2745cd8b826ab31926dd0138039a910ac887b1e2e64270623d160cfdb7f5f85caf938763c342e46280aeaca6b9c677dca6c03eb5c9822aa511c14074bb2722b063a0d264ec41f940f13a2a5c1d10ec4112f58ebccda080fb40de0eeeb29ae49b8ccc7698df59379939927e4ecc61fe039d04b0a7917d42a98a09df2fc3ff16ecbbc9a12ae4c589ae8082cf87ed29adca8fb6e89fdd8ae688ef1cd8af5f80831c1abcef167d765eb211b79dc55e9e7e542a4c984c43c3485ec3570828cc3c172cca22297f8ca7ce2347cd8cc69219c8c9e1d4ff06b0daefb4d811adf222fa249de510da0f84d71e94dca94e7eec7a12a148f20cab16e9ccbf54a4d3ddc142297ec05a822ba0c970b93df9bf74c8d159edf4d3052123568d9040085c22fc40e10c2e5aad2667422d41e29722fb51c0f6746d174b956bf414a6ff80ba01a92d3701fd4fa10978ac90b003ac9002a5fc81d22b67aa16f8e88ce9b2d21a836f241627800bf81554c39792ef9a1a190da91be7637348d0117115456bd536541ea51d730b123d091b334c969467f6d0c1db3201209216299982432f57938f6c23b3a5c7574e84b01de61306f740f52fb2a19c959321680c96f42cfac50f0231a6b4ce45e78b362ef45223df23aea04c98f27a39e2927c86453196d2245fa244dc163cd1d924b4b1e8f813d29b3431c7cb7d34384c35480be4931910dd50e75ed64a171c772acfca04e963f777ab531a51806d55d5c954481c34ab8614cf7643f4530c6b65dca497c12635da3af3eeab7c15a2692aae6b876819ad4e9ed6aa28f4eedce35a86e51f4069cfe5722e8f836f8c3e1fdbc0f7a4c8b3ab8d3138ab4ed4e45eb1aa58ae046910f402ff2b41c9a3a47ae7120ca8d061a9d577d2d1ba39944e729d8b6b2c92ccb0f4e417b135426da1160a5940ed8f23c6a0166d9ee4e9fca5c2a7444b77f96c67ca032d579820e4d1a261530800959c755614377540738d45e4a4ef9db6ae4c730ee13586603fff12a2f605b150433b64d90c385fa78bb74647ea144f8ca17518391473b75d08a8024a8641e7d89118342ebd56ef20ca29762019df61f5368748a74fb7c2e733523261076f8f92e7811a109712ae93895074d813324b00dac573df4e19b0fd0dcfaa0ec8bb828b00ae1d982ca21dc8d3276e0df785873feae16a405f3331bd351477f8cea4ada4b253541c27c8d43a39f8659dfb14a8b3d0836ee10a49638b7588c68163fab7790cdb0a6c7e5118596a7f19eb812eb14fdf2ced64e3fed688b1d9796d31d84f091286aaaafb1feebcbf3a72742e6bc6a81ee791a327692abbdc15d3c5a4c2d00abdf154d14ef6e4ac6e5dc7d547a2ea2388d07f1bb4246070aaac4750eb08c56e75fced1d4c2be5d58608a204e481f8503efcf9519fcfcfa9373a3bd60adca8262d4f5a489ee5d44596c2a1b2bd3f094b2ca5fb482e0a4e83cf6d089074b55e0c14512ef2bda63f8336011c1211eb9631b45cc07d2a12c1a8240d9407e2a781b4450cd3edd96a41c02ab8312398c37fe062b5acf7a5044b0d54b45fce39c20111a29199e4231ff6fe76dcfd32cd04737d9737726b855c1cc7d1432d627c3802577067b7527ea81dbb940ca7e0391a0cfe8984582a980217258c28a9ffb5a22f0cbee725e5f2b96e871b3d7f8c6fe32518351ea695cbf79ce937aee5d385fb9844ea940f44ccc15fbd42244bf9e64709641d4202b34bcb1de9657b013cfa06632c803481153699a46b5e88b139473e0f8db9d2dcd14917248d98738b706e425b7c982f99255d0ff702c96b41c2a937ddad33afcdb02b3bdfbca6f3706f1331746cfedc12755501e2d3719100a886478005cc531ace0c258f6be91d02353c2bfc85b4a63d43420bc5a69ab4e92d6b1fa6e6b4a92afc525703962dd394c61cd6ba72c970589ac3f0ea6015074bdbd06662d39a56ce2b41caa0e2c7f5ff850628efbd26cbac1350c734f10b25cfebb575d53134459ee27da9a65e155c5ab11dc45444dabb82e67a1d086f067b1b31dce304c7d7349341be05b7a0a20a0307b979301c2e18518204d022cda6a530b9b86196cec7eb77a4cf1f7633ed7b6f265b4d26cef802081c98258f9a12022b1d267683e48591195eb2d76f4b8c5528f44a50793f8862f3218cc423fc4240686291acea3e014ba80cc17ab8ddb4fed41a10b0e31b61d5a96e1586c893f7d87cf904c4c524c6792d2969a4d8dd9576b495e428e7fb412b99a85c87f6ff6181082758a75556ba831f6f8b576378c2d2fa448ef0621fb9910945d4adcd202317a86d6d510c4eb13b51934022542bdab2038c4012394d320ef0e3131e7566d3ac6ac61d47a2902366b8a8f274eb419671e3d920e42f7dcddceb23cfacb1160adbf70679968d1f15949ee0215a407cc7f468d10a34787087fbe517138f96aa528906e6dc54907dcd5bc0e5d63e077e77e0106ff9521a3c2e1860c495745c52d59ce802fda62a210a3d5bb2ae4b39a4e2c44efe3732786bb4da9e4b60fa16a0a8db79df50e0c4621e4dd9fd3773b585ef9e680665dc7f580245d42b83fe13a57971096b51859f70fa851da9f2d928fdf71035f737c9264645cdf1300832226fa87d0f050f6d688bf1258fb865731a7760360e2826c02d9b49405a74f2b3e81c61d0f835e2336fd366f07c942ef08931dcd2b029136ea53b6579a61ee73040aa56caafe4c742abc0270b3c130d44180135d3d44cf9482ecc920f8dae844ae8197aa70055aa642a5df9806f0dd8ea1ad6eabe7703cf6da15c2af8c12f2c14ed3f7ff8e937440771e930c75b40300d40b0cb29a569119d856de692a7a1f00c043ca3dfc5555c95dc06d609f534e35fb85b603cb47fafe60fe37dd045fb076ae57e1fdd9a0d8c0845864e9b513950799019a083ee614b2e4e85d208a720174a1e8f54d2785de9f68534c2d13667fee860e5cc949cd7e816c051b01210ba323e05556225dcc0d8dfdb46dcd4c56f584d596653681bc1b334c274be18fea42ab49cff4ee8b50b5f49ac76c53d97c1628b98c3de469128ca066fa01170f4569f21f5a56e91330dfbad5569dc5894844c725820da0b631d5c722f90d2f043e613eae0eb2c464dfd35d8055e741df36c5de9841c2aa274b4778a5adfa0e1d476fc9b024492db3236f4e1ac3da305963cb954ea2c586f9892dbedf190cfc07e856eac33bca32e9b4902c92beb54cf473cc37890bdc1b3a7f342f2ac05c03c4555690893a332b4c6ffd2691bec5c8b831802261576af0e16fad4f726896dda0379cb492c3f93d43858482b248cf21f981194abfe764352be85b8e7a282f89f0240bb59965c1437a81dbf345babe3657b9c9c78acce7a0e5d78fa2434dc5d41ee25f37d3933f9cdaa48ed0104d384952756c2cea7e3925165d0b70d7f1e52a642818bc58236b5f8655472d54f82312826a30f5d50bbd71643acebae022eabf6f49710f405e771aa1e9a37ff43d3e3493c01d842a1a9be64540f1d047db2f064fa0385d01479e1f6df7044bc43b11b0794578c3f46dbaf724b077b581f244685841089b389c8ea33d328f573b055d1b3b2405387e8994f00b35b3f35c22d2e89a8a9f2e556e735ea9041aecbab3f86e338329c063325103abc731240d88d4b1c3402edb019af429faf240f0eca6c5e9f309436fe6cb1be6f6be3f6540a1632479dc079c16dd9be3681c4c21bb84123f42e7426c18dfec789ba0c55780d786e6623e8b7c6f7798dfe72e7573e6ff1dc1a21a11f996252f5130375d281c1e4507708ea92d9a2a07e9dfc58d30e777f9fc8b0aee12acf9222686dbf87392cdae7d25ae12c65ec3d0548b3ac0ddf1faac14a3ba94f7709400c2a48226a0b22d767b77181fb40434b88fbfc17f7064f34cea0ac6d240a4d414df53322ae4294b0790dc0b17905e03b3f5e1acb6525e1a3942e101fb020cad291ed7b3c6a2e8582ab00fa65625940f8143bf2ea456b52d27cc1b1ef9d34ee4171923537165bcddf5dfbd564e29bc0726f997987a35faa575ff7ceeeeb09b7ffbb159024a262eee961d587fb1bf3d8d0977bc44f87a967601a802d443efbc3141bbddf747fbc8fa8e63505cc2d4bcd24654f47cb69568006318e3f5b2530bb5567e5dc3e235d07dfbcfc52d9923cc7535a8d335c65ca29fda2216e438ecb6aadd3ffa506b5ce1a89c1ee558188787ef26c259e909b100405b4c603e4cf8c91b5309610c4ce4d42f859f843684c0def2146e53e62e6c11011dce4413a3c7f51c608963d7080e4db48739f15e2d9cdc5195b121a43e3e6c9ca2f606b1c54b8d318e50cf76f88e8e3e11128fe1cb5a3ee3e6e30ea13b558fcc5fdb029ef0143ab1c8bb8c64a8114c50d6530a9ddaf91176c50a21f36f11c36eaee9d8bf82de38d5ceef14072672d5d6b5d7185c6acfc7e241f244c47746241e9d53443f1695f6a70a19d539bce1366d62755c683f89a4b5fc9d51f7670b147d96f0e16bd9f88fefb9a8ccbcfb77b15b3f4b18951141390e003129126696d4891533642725e87adbc314b90fc45a89eb82fac2e95e9a0cc1652ed8fcd556f1591b61306aa96dd2cbcc462e1c30f70308ac63ddf923a4a1c0ef62f4ef1f0a3bcf6fc8d14dae608d3999efa667d74b7a34ab5275741fb8d72a6a862c2c2bc8f32ef05c492c34bd39518de3d81d0a5f3416445fea018d80806fa7265231b115fc0e1cb6146866ca6c53243619f1bb6f47e958544d5a05b43c2035eaa40002a44889000f2572b768d3998bfbba7259edcbc33fa9b3ab64b050e0ffe0024788f19981f89ea855322c89f29d6a8afa89b801509f5a1c4e8ca4ccad78b688b45376a0e8560495f933171a739d455c62ae79cba651b80883a98687e62aa1c7c5b01232bcee14eae3662ac3c8c232d920601114e4ebfdcfc9c2418702281de6cafd534c100c3d5563daee74139760342396eb83388cb81f401dd91d4276257346e6086001b038bdb8b03151670daec8642e775febbfca12775070ead8bd96adf30e24e89841b0ce6a5ffc1c8482e305737739a062ae8479b0d31d5514cd411f25c246e9f93e69913926a34877cd47a5a179643127521f56b3fb4b42a466fe42b4c9886bdbb767294e4fcb5a42310104f8a21716bf6e59802e76a61cbd58eb87552340156cd7a62826d4bfcb023455f92e202b257381b23ccce2aa3f22775359c00eba1f282944685eec0687e35b4fce8253a2557c68ebd4a74181d233b96e2790ad6ece17e4305669bd7838d3c0ac8f0753a1cd8d0d10d2da552abf71153027cf1d82090154c943f4c9a4b4cc01f5395c70231ab11af1ca68c58841e34a01bd569e63aa7f3b1a1c6f243f6d2851f351ffae27cf8483f05ad4847f6b2533d9c7cc0a57e972a6467fff79d22885a29474c0ae2d159565d7c38754287a580971d44b0686b4418d8f88000089d8f8a623119b453f967c719f1ccc14785e21cbca7afef858e1ffca6cf97301ebd8ab42e7fbcd76702259659ec8d3b5e8210459481b2a4269a2823be6005d683559f001e0b80fd6ca4ae11bd2d368586fb72f8a0eea090a12cb09791fa7550598a4ae25a4840df2aeb976609481a522e87025014f4e537a9a4cb172545a3648041caadd7ac1deffc80a77668ffc6a94726ddc6c1d28e2992f04941ff8237567ae98aad3cae2ed3e714bf1d667487d576441a3f9476836681d2256daf6fdc70942240813f4889b9f9c489343171725004bc80086b02561f6f043a70b73b10fc88b3bb71c04990173032a8c64445cd36034c3113b08df04aa1aa5076e8125793b2658b40617b914f7816a19e71691cb3c25d840549230a22aa51d8128d7602fa227266e6aab76945b4c9ca836b6b934893a99b91c324caba4c9a9fa5bcfe633d19746651843f4a51e29e105ff61074bd1c4043c6a586a08a8f86f4a0cf74483d10afc34c2f48d89e59c555017dcb22bb920af945c0f6902b23a43e14f5b7bb6e7e7cc00168969518b9772e4813b4aea082cbda93d75903a7e7f19578e7d6de19fdb9645aa701098cf4e1e8545eddd2df27094af3c3481d41c0a5e157b10ada94a70cfab4e5549b4a8d052dbf6ccbe1feaf18e9a43a288415a008e8b61c1243a63188c0ef6d39cff3bbb3f8bd4221ca99f773f01888d04bb7e5d4ecc8b188a1c7bc4f7c41ff5130920db1c4d4b61c968b878b4674b5af466839a3bd0fc0c0eac32e33405728e8649d9a06487fb8efadaf74f5016e2fc7a31fc498cc3bace277023d473271a60d5d893fa1f5459b9758a2c44180babd8e8f174d2ea6a6064bf77a594a905e5410c28fbeccc21b0f2640b8f59c68af68df081ec23771410f72354923be8fd52ebfb59e63c64831afb60720e12106136ec09503061b457c3813164afeb0af68eb7bcb052043989ada1a0b157cb97473cff5c3ad54dca4d86aa15275fff0669fed0443aa07914fac42a62e9b2b4a97979ad23876801728673f5043a3fe13add4d74851c7d6c69489fa3e4eb08eb751568f8ec13e9863975431c2425b666a1d088e18a38976993c494bda99ecebcca46ea22d755e01413abf988a2cb19c05b303629248caa2dd089bf05ca13518cc67bb19be9c63147f89c37d10ead44db46bb7143218d44975b9e068a2ddc09e6ffd3995d78365290c3b6f059acca5a2897633dae5027eb1404cbb3907a7a671a937469009e7a9a30516e60625146f4132bf5e3fa635caa60ab04e8472d3a3ffc302c759c05e4a7f583177b590c40679999d24b084719ba4971a4e7f930e2b6f824a11809e736514f8d00db799230e8bc3840b21371eb2d86423b97142840ca47592857d0be56fd97413785512aa72dc91c796aac0a61777968246b339957e1c6bb3801d196cec2decc8107daf16fa2728e00b3134cdc5f20efe96303eae8b4eccec63618e6bf1ea80a7da2ac2d875b36de68da7315ad7690a9855d8723e1468a30fb5fd9ba61e0bf978e3132fcecdc1a03a9d76509339655137fb962ad1ca6bccb250cbafc99088832a2890a54c4a60983b694b04fcc94484647f5726ca534dbe1c5d1379068fc9d65f2b34aee35e9c83f0334bf00648e630684e1fed0c0e6a28ae5684b079a0e9c33abc5dead6fe7e037e2b1038b18c0be3db4dfb2c85a2af2f6761bc48bce8976fb8b7a7302d91cc0c87111cefedf4e6832bb36d38c8eb603d37c1a9f079ea0d14da278ca6589fcd036bd997fcf929b0c3b6218060c832ad1dc84ccb7a6aca70e345bd133993c1e9302e19142cc8510f2d75b68ee6df64384f7cfd44269f9ad6f0930f7f0c2d41093897677f3d506393e7b6c2edc5b1b6952827764043b440751ce8007e4720e967647d3cb3a9541b2729026ff4943606d5344e2ec43b106c2bdd192dcabab1bb3072046474d310873521a09ff1b88b42ea084e77bf624579c3dec9a3029c69400001a9172e84128bb6245b99dbacd1594b169c5cfea593b07a6c8c5c82a6300c265ae30e40631da548b05e80eb4b3d111c42666c8d37d6f75ca37300b749813c45a14c579119b97000ab59d10c0b3b86c486e3465db250a7b7d29fce0810cb5785039b95a05fa96d90f365db21ec6b09a72d67fb16984b364af4e0c712f8cbe4c93a7819c4f50a5138d5f2004fe92eb1734cd4dc83a986dab951bf70a934175c9257e88d1d9e69206b45a6e659fc1fd77777886cf3be8eb54b74aae395756611a0b9855de42c40595ac686904db722c0bec30944c58be46ffcb1246badb9c98e9333b79f72fa9cbba06128b23e5698ee48821c218aee526886adcfcec5b7599f3980cc056670f1be03bf29c24b353d87705072eff9691f8709839af271b1958f1f28a5dc1dedf36d527a7e3a1152eeb26a69d588eab182a775433631d4b6172e4469219e5ae737b3d2696df7e063bcea6b250fc5381ac944d91d1c148b464776252c745edd905086f4fa3124cf33f9462a263d303d464313e7113a0e596f65b03fbd3315e9738a7a3042c8583a1118144179a6118c3dbbb41ac200e68d339225e70050ea35a85251f953bfd5b94c870164ccd8835906cfa6b0e2f2200403d02fc8aa38d91031342d8ce7f64571bfd8464f802c854df95d73da0a37c160864bc2f54c8c95fcd70a27171788e7598391cf69014f918bae8c370b0e0b7500e793602f905bdf5a8f72d0fb51da83f82880fd9365bed2d8634e4147b03070244e318cd040198ef57450861c137793093c515930a0b493d5f856e9e5ea2550c1fb416d61560598123d8b1ded5441c47429e744b2b7ac4a29b1c7192625e369585bbcb330aec97d180b439570e5cba298d24c93dbf22f648c99d753431ee726d2c4f075c8eae462078fdaae1a9ac39446b9bd0ab07e3997758eda45d670c01c02b8a0383405a17f31381015c45b5862b4ecd4d41a0a1ae1faf0c4a93530e1be7ba0aa3279e235d5e90767d3e1f73d82c1b4599addb11ff490084043c1314eb9d7803ed8b7d70bf200d88c0f99306f22d0105c0c37e0cc35c05d20f4bf150413629338d2fe61ea5f42b3de9b6f0cd3064471e075e62eb9cd3853f6c1d0dc138489db25d9056561abbc7c34362ac535cea1a262fd1a8a392965d4b3f76af804b20141ba2e6e1e1581c584a9149e72ac6e44642c53d0e33a342057b161b43385fefe67dac2f31a0e5ad587604092f3ae90550a356a027fa91ad5a828c1ddfecae8e6dd88cc970a030d1f3451d8ea810a11485030c8db5f7d38270c2d1f3b2185f657a197353eadc6fa32bd597ae1c751f70885e503c54d3c20f4a56ed1f0e966e52164ae68173228c8a75e215abfb35d60083d9c2df4118558841ab5d64fddba55ecedcc3371224fb6158f7cbf177ac4a106704377d5792d6a661199c1add9ffbd15c004ca3d7e42b7e39111a77311fc096bf534bc2724bcd99399637672dd1bf0af668c3a50b3cce93e06913e4503410f06a73e8c33b21d02d3515ab881269f3b4d821928a9146da6079ee7e20f2e5cfe019c5f91ea74a75b6e07a9cd6a4a3b6a227d4e76484c20d615a6c8e37ba203cdb5e11a4768f42de8370ff3935b6ed96587297c984cf1dc535b384de7d9dff907736d63d133e0a8b00281a339a407db9d8f0f9a39e010386393f162e21fc96fb3742f55a6d3456a099e427a047d807078ed2decfb743d0e26f21c7371c0940706bf36ccb230435eb591596362ce09054303f7456010b8f0f3434fd7156b93df408f129d91ecca2b05e16bc92e8a47a6d6f58bc8354f49e9654b74798e74143093a64c12f6f468107ad58ec030f18d9a9fe1be8049b66a3cb21740a8361cf53801a90074619724f3bcef096f16340e05b8aea7076832d371f482aaa996d44bed05f56ecc81174008b1e0d515b48c958a2f0415f1d4d2bfc108f79f09ebac4a2579a720b013d67a8dc4b2b9b35b7a0a63a23d1307589052c2667156c05ba885e9429e0e988161f8ae4201c7e1db60cad18847af226a6669bf771d1cbf3f1f9a5a2337320bdd20e38ccff268124ccc0745b418185753afc7a010f5e009a960673a2bc175c1c1c47436b6d60b992f81c6b09e1f03c85d50aa371745a7a3300ce79a8c4e0450b1069441f7528c14002cca30566d3fdaff7e4ec0533c4c015cb5888f833c50cf5ca6894326d0fe10120bda3a8069970ab3768cbb8ba9390b55004e7418a2ee97764a93a4a99e65296c72854c1c8b6c78c9bebfcd5a821862150d39b15b4b763f38746896c1b73fd1c3d4fe52657942c6c992db7f44ba69fc0662a9cdea25665415ec294751449235f37fe74e36d69dd5e3127039ae7bd578c427b07d983e6116837d0d2e73e2980bb0ccd32567e1a9d19928daeabacf74d6844e07c489cf8618af207460b6b61ddc47338beab24107f1b0364fbb8f1b672f5db5d10f53bd9d87c260c5f5eb3ce4f465be5edd25feddd537aa86d4f5cc2c2d74a30dd857f7ce6deac206c79d1029969a4443990a56ecb36cdc513ab5c37ee38adc6afa48fd175f122ce66d0212980da77e7fdcc52d7036d78daf7b0e09c421057bb05778103a240c17ef7cf403828d85a7cfdbdb7ae826be4f6904d8e78c207105eb4128593f7f7149fc79e94ffffef0682cd9415a80a8acf64876b743c988842557d992e071044b21ed35d6e460c901ce7e652f8679cb6d9d195a820f6579fc5ca290e710994ec05a976c751e0990d74cd11ae5fc89a3609e9bcc533de3477e33cdf6a55181d7c0b3776f4cdbde4eefa580779e20c73b7f010ea577c167f97508b69a5bc5d9054058d9b87c65365e34948008b55a67a5165c7a83b359650478401ae8d5100b2b3f2ef602af26dc6ecdcd3269bae843582f1e9459a0c0810bee60385e7edcf749e51c426508450a9c161343b133f7ce504b1259be1af63c370a268586d9ecdfd02825b8228dca384cbd945038a28b5632a9bd43730dfba020c6351f310c23a934fe25404cba8b331226703391cc5ec67867bb161bff045e3b0cea20fd1694408b49d9e2451d2447628d35d803059a7f3420dc2863b37ac8b7f51d57b0105c88093aa327a9e0857a5ed7dc17487e230d7a191d982619f6019b47b530ad321d9093c285f1cdb159d8423d7b56fe05b40b437e32189bdefe0c0b43afd1007426dea7d9f4ec3a278e58e510095d67b1bce74c7354334e0f245ee0304c3fec6e7c4fa35efba31ff251198730ab1937e15526322007916ed0b0d28baa98b4b914a8cf70df58783e7c0e27b6600f953c88193e245f3165e41dcb223e8302b9cf051b652edb7c0bfebaec8da54e5bf1fc6370ded61ef8271749a9e9bb465ed94339e8b1ff8692f9ce348c3f93d629cfe5e0496f7907d4f947b9f6b2a6ed61c2a55ef463d2f6d8957c548a98decf964f657dbedc2364517bac08d41430813ea58372a327cf0b974f08987c504f50f8f56461e4d662690a906483b0c75089dd5fd344af749a254007e1cb85625c9bb9b853007ac4e8c288a9c6009b9e3eb57ad8b95c88e42f71eed7ba026f6f1efab07cba31000869581a39dfff26569db8e2f6fc4938b1434e7edad27de373d44acae06d0caa18ffa19abbe85abd08105af51539637e7afc2792a240a035ce26025bd8106eda9eabd5f9d043dc74e806a4bb21fac20e02c75c1988b9fbb638a7c9bca09b395257dfd0a5f907172aaa3a970b8b85911837fe12862b292cf02303fd005780b5cd0492fc33bf1fd08ccdcb24542654ad0147eb68994021e6e391eba246975d053a3993c744c41400bb80cf6d271debdd50d214fd51f8c63f4e5e1390afbf01298aff1078062e61be485c50391ca2839ae3b3138cd1441932d6d4dac0e850bb74e61f4deb94f37d8da5073fa9a7682773e8477d733cb6c857d3621ae3a941b7c6dd86f57dd56eda8ba5d39336e91efe376690f16e2862b546e7543fdd1ed0f99c2edc502df92432576b9e52597a09384bd84aeb24e7ac07850e0438b65779a7f13f3cf00840637cc753863da0b4ef055ce3a4d48052a7d661e78e11548a8e503149f7db7aac14f7fd8b0160f32896af281070b148a7df78b0a941a5b786bd74e685db8cddd6cfb49b110fa40a644752fdf66c1d0d88f714ac29f8273fb107c7dbc5652ff26cb2e4ce90dfa52764aa011bbf3b4d50d00c38c62fb669a7640911fb1a71cb7583e2605b3311346b4bec92784ab3536ee824aa2c5a4766409e5a3cc62c8f37e946a20ace0faaadc91158bd142b36d033f79bded22c32a91590ad63746d35e751c4290b165c67ebaf93f54ff9788a929aa3ecc6619233f39bfe3f57b4cea31af7292b9296628230ef1e014663b7d1305800f435a90f56476ae72a19a657f77d3289c52f77f20d4712fb32a2135845db0d14816f8b0e6e4e0bd330b59c5800f367ec55635496a73a3319bbb79031b4411160295f93debac93ce98fab7a75405cd06974a35034510103383f68faf4cfc160c6b219738746dd018c4a6f40bf47c1ad8357c3f7b84f2f58e3bbf53524fb8e2f1865d4e32946b2f647e0020109aa44ad704218651943390bb246820fb8b7a2cd0998f65481356075ff82eb3a315465c29b9e0ee5b78cd4af3d5190ea2789aaa818240a05fe7744680e5820da554d07d99b5564aa1ddfcac797413f66213db9baf81276aa81df87456876ebd370a312eec14420e7558c61373a8e8580f83fe9d37c640f50c6e5f32d92e5bb5718d42fa4523616c5fa598c24a4eddd6defbda59449cab40dc20d200f77efd41b3827cdbcf7fded4f187cd562812681e9db80d3deb779c77dfb9e756e0e9ab46b9ce3fe666e4ebb2eef6b80ee6cff3b375d01e80f7a9e4d7eb0a7c8e3b4a9a6ff02da54e4216eaa4f41e8d680a599baede5f8b6a560892bdd0b5ed05a1bda5aaba9ec21142b682a87ecf7ea209da6ce34df4fe20ddd584485262be6a01ba7e874f794f024e6a8735f31079d9656533964fb7cab1fb46ecb1fb65dd935db19b3bd523b0510574a2ba533db23f0a4b13306052048f19c3e779ce64066d77392eeaead930a702f311e9d364df5b919e3a60b631b381ea791ac562fc169bee751ceb42b11fc5446b7bf7e8985ef6f8b5ec8e95486fb29f2b8baf4e9fff28b93bebff77ff9bc3c2795e1b475723ea5745a236cad37c25e2649fad8f569f793c3a1b3b644b58efdcad99ffbbe535187d521368193e34db5ba2f71ec4b40529be36c0fe6be761a9ca4fd5319a4967469c680dbf66035b0bba79db63696aba9fa17486ddbae3aac482d2d2925fae50ca72efa9a92f434b6504addb95aebd353d2bd75c6d04b6d9110a7ec8fd7ca9ce37aaae7c1fce9db89bd8a031502420fdcebcb3bf9b2f1cbae7113789ee7799eb727cbfe463002b0b4c0e775dc8c99d7569f31f34b0b5860ee38e236223acedef7bcfccd0d6cf766de76779d84a35c7517c1cbfe934f92fff2ff423ee94d1ca6bcc4ef55a749a1a30248bddacbb51c0686cf75de570ac51560aa9a3277555a40d4e1db3ed84deaa6944ae78a3b7649e349de14902f871657af8642767dbf3eecfa93b4db5a0a525b821f2d004909e0489329004939016b8c036bdce5382c0a703989b63f8ec3ae011c667512eefdfd9df354385a21422370be941c268285e8f85f1f76a0b2d4b67308b6df615a4bcefc6b24f17f01dbe771ebc952b056d1860627ad05027bdfbdcefdd27f2f9a4c265d0201b2ef07197fce1851af5654610fa2064c1b38f910ead3b85a51a5545250f8e4aee35fcab7f49ecbd4a40992f2824c9a202a1f0f9326484a29039326080a14326982e0b0874913e4246a60d20431993630698288271f264d90107360d204b9efcfcd9814143e99c4f0964a390727ed773b44f9340e28c0f6757018a785007198eb242c6f7f871a3380bbec5b962606f0348ea5614b65e81fe0bab51caeb1ba83bf756799ce42e3c38cb16fff9b310e4c97fd99191a345cae9c4bd4b62c7a87eab29ceda10de0a4b53c780727edcf1b4753b958051083e4ebd95d19b97cc08b8ebccb219b529de47a9deede84bbd79457afb5babb7b75777bc489ef4e50edb436749296a5cddd10f5ed1203fba2501b4f9a691d662fdef53d5c5df35ecd626d968ef26eab0aab5741655819a956ca5a4bdd524a5dc609b03fbdd5b06051702dbd21ad8f04f680a4b645a2ba7faa95034cdf75fc65f88cafeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeba9cf1fee08cdc9291dab5fee830196fe39eaadfaad8fb7177777777777777772d6c8adddddddddddddddd7d3a8ccafcff8576485406cc3127a7c66aaa6bc66ea6eb662661c772a602662c07d74f96b0ebd3995d6b9d253adde4693ce3b04ed7c781810fef7b295963e3378ea9d0c90f844c428ab9f7e67caa5373ce6f396c721eddf45b33a75ef6cb1e5ff6cbcb1ea78bfe0c2be7c696b16bdc79f07c21bccc9f81cadcabf109869224e70fd6174e76bfacefa49314070d8c932f9b3a8c85c9a493b4b5cb97d60e8263d3566bcf191b278cacae3956d774cdcae1f400b6ebc5c1009c9f3da017e90f63a3879e63ad0449d89f71d81c02126ddbc7c164db9b04ccd9fc04cc19cf4dc09c0d61a207f7b3fefc1baaeea1b3fa733e911b7842508059fd1e3af327e2698ffbee51477428a0fb33083a235147ccd9fc92dcd3e6452698978d192afb7e3e0d95957e3e0e2a037ffe0c54661ff5134c799be79409c5d94945a6d4b1eb875b7cb04eeaa619296503c0fc3265fc4b594f19ff2f7f6b8e93f447e14cced8756bab83fcb0eb18c467279f4d71e72706391042132b084189cf8c2215c1055b042de1810c7630a33fbd9ae8960536c4292ae32659dfcba5699a3ea74c2d3bb0edcf1fbc54fadc95f8a76cff19f37cc6a6bba60c53993903a74c9cb2939e30ba4292153f468a98511748e1760b02d00ebc70057ac410be306207cd216ca1c9a6bb52cc997e885059b8ebd31750d9e9ebd324a80c14a91055728b26cd1cc2ae4f87525f9f12b1c2df99a97c49c3accaafeaaa9fca1e4ea64125e3d4ab8884c0672a5f7f8a0e9835151dfe8e2bfead5ee8a1b2932e93a868da0f4c80aff2f5e9105406ee38813f77a859a7dfd9e1d7a725f0c161a216fffeceae9f4369384e16a132f0eb0fd1a1c654faf5e97226db90432fcc4e65e8abe494dfa03e72aa175847fcf04d5f4e5b7d3a549f02d5a741a08e90bac5b75f521dfb6116c5d2db5605d87e396da607f3dca1a64638599fe65458398bb0ebd75abe2a17b8061d14fdb11614df3ecedca6b75697a61735cb8adf775fd225c41c76dfd7594b8d30f22535b26b4a1886e1d778788170eb843f6fe6876f73f8a6cc02dfbe6803957dda64d225fd32e0039833203e58a249f41063db17338ee9ad2ec5373d9871e616df028169903ebda5e1eff10e28e65244e1931882a505ec5b00ccdddb7c52d1d65d766e5a86dbfe97adf729992691350da24057c03650d9dcf54d796e1c87a174891f3b4983cad77fd558eac7ea9aaf92c7d4066b98cacfb27a74b21a41e5533f67aaa756c08114ac1a76760f78ef6c2174db9f3326409566590de46e1dfbdfd7a4241d3bc5037cef7d4a25830f82b91cf72cbd9c595d7a86cacccfda1a74b02e5f5baca0a6402f660027b4f6436d7a16488196d87487a692cad324726a8e93f5a467f4cb495b04d6f181da6696fdf03b1cfba1c62753fd93a640e29b2a05e29e0239ccf4b3fa75dc62cea1e1f26baaf5be94715099f953e4f1691a2a33dfd3335099f9727272ef796c67c6a53605821362b982cfca48536889ca7c3c2929a52b9bbad681cad09ea31e1c8af8a8311ca222a7ffa23f43ff4928dd7b5ffa5f6babf5845021b5fa50a5341a8d26a45a6103ca0ab8e0441021f8e2053b3dd0020f52901748308526b3f973bef78484f997b1e5a970fe7092fae02efa34af07fbcc4a85d814e092066d4a977058fd516339d726c749fa36fa38f45f334235e87af7ea9003102115480eb58b273a581c38fa5dc6c1beff7032071d8008a91aa8fb470dfaa455e27ab8ef25f53b79354502dfe77269dfeb53fa2f24d540c2717a1c752b807346676b70686872717017f5f183729c0f26601c9ca49da300571f38fc106d6e68ebf7709296b6db723c46434d8dbd288d69c1094b74808324a8a064469f3045124dd880a70538a0cde863faa365b2240b465e18d1c51235dc2725599a48410969df089713ffbe376321c7716278753999eceb5ee3bef44ab6bee7a02ebd92feb4fdeddd7bab9e7fb969bdd4b67704f3f61667c654eeb3a20d7d8ce3aefa38078d8393e4ae2456ade0388c07f17910e26d084c99fa42c61d010378ec87f7f0980ea62d6a1c664c5551bd8833694cbb7299874fa5f244549f7a71e555fe06d5a7547ee56f50f9153d84891e2baffa592bce717ad38b1963ad737ad39bbaf7303e3d2de93e3dea533e0585b30e7d93096b13fe136bc7e9518fd23ad34950c45c9e9bea9717669899eaaaafe2e5982953bfcb42f096993195bcfa650a37ec1e08aad35a6bad36f41bee15594b3d0998fe64721241109e3099504702ad618cbff4505fe2942f479599dd3df8aa9cca2a795697e953322ae36f32a95ac428ed2b9974f9a4a84bf215eaf245ab51da64b2f3c4ee288dd266dc7b0f326477ef3f76f7fe7b32994c68addb11bdab82da962471bdeeedc427ec5d2781b0ff74eba4974048d1c67392e259a636107257af3c00e70c2cdbf7de797fde6ba9d5d3660fe6d20b84ef7baca3d168341ecceeb4134f25d33563bb8a25a66b6efb3626ac7bfbaf09e35eb66b9ccb365bef7a3ac9f7f79b4b88389a2f3b0370beb45eea3843cfcf4018f7afe28ed37e2501290e8751f04b2cfebf885f4d75d5777d2d0b30cd93f4afa955c6f6f2019b2be972dc5fad9511d8c1ed4eff8c71cdbddbeb946a20e476fbfa0264fd6d613cd67257f5a691e797064060c1b4fd4c223f72a84f8119c3a9c2ae3f374e8dd1a82561575c5dd36802947e80ca4c54a6fa0f2a73dac88589855d7fd249855defe5bc0984ed7b3bbfcc98f92eda58cb751cd771dcbdd6da6b03274f68a18816960080f55e647eb2ccaf8c0157970da98cfdf934cf78ff3269ba3dbf6681eb9e3e36f7542663cad0b78f6b6c00d365bf346d5b244385b5f6cbb1c669e57ceceee9fd193bb3ed8cbfcc982e03213757d21feb71b0a89ea97982475ca180e997d8889b417d79647d1c1e037fe2fc05bdf7ea7bde7657f56080bdf7b4a54ec0e374ddafefc361e50c0e0e7b21ddffa3e9ba5fca769297bca50e9b2b7dd81cf7bd019cc4a9b11971c6068c9336090c43b34b8cb6c7838dbd3ff3dca0e79bb9c5109c27470abf136dc02f65baffc563dc4fef3a719757c58cf1be844176a99832de7b15f0cf8cf11e7b4e30fe8f083eed222617f36aa1041247464e8809c417e351f5e8f6483065b3d2b8229b23627b6f91e02a05a6fb37d87946dbcb3376a9705d5f803b3d84891edd733f6444cac20db09875faabcb7bfa77044100cde60c04352929dce55b6b451b8fe2a4d7a9383aeb32ab07378455bffb95e7748d2ab37aa886b0eaaf685b545dde1b6def551aa7ba3cfc1fd7cd5497f75c7e5597f76e05c6cf297158cac354ea9108b6f7a316de5fb1bde78ce0bd4412b70bef46c13cdbe38a6cefeb1673ce9a8559bb302d08b6f7f605d8b35924307dd4978e34a3621256e9b9efb42582034948494838b41e8ff9e0d0681ebb3eeee27eee9ba4285f38c54f973ba6af3ac0a60b78620ed4531de012136d568ffbc3ea617ffc510fb940d5c5bdfd9deb535ddcd7b875029798c86767736fad688343ebf97269f7e7a2a87a1c5a1155c6a1f1883649488eba49fa6e92a2242139ccf5dcfee99b24244c84bac2a4a19b03bfc64fb5cd7d7d4c3469fcb953edb54bdad33d2637cda55cfe80b43f0dc4d495fe537ad0e61e136dee53724997b0bb44d9b8f7208e7bb755ff61e2316fc63d45aab139e3de8772bc49759fea3d4edb1cc7715ee3385ae9459b9ba507e109ea4b9859d22ea03cc162734e36f7d3976cee7621582ad9c7fa3e4a8f6fd263b699950366878f1fec72b4ec203398500f9a728e507cba43d1012bef39b8ba64f6c4ef628e538ba5e2e6f425f1c1a75eede5702ebd6d32658712828f5363ab5ff969dbf8a7d863859fe29fe28d0a0ff04d0fe25c5a0b3463dcd69ffa536be93eee336340ba71698b9af6784e8a0f3e483d97b65ea793c5c4d27137eaef46699dd397fef4dd83a75c7ad06f9346477cdfdce7eb738dd072dab6e9699429b0e9515b44659ffe993cd32d969e6fee697098631f9326dcfe9e69177856f0bb3e360cbeff57c3d086e20d4d5c78ea5c0741bbf4a7b7e2014a7f7a3007b8c17731878c0de2c7fb94bdedb749033ef77ee430f1b977280ef3d064f277d1bb20346977e08b4fbd90128165b893d408b8bc3e9b23028b27c0e283949bee2fe6c81bb4a2e9a910b04371927bd357ceefcf6dc670efcd186ad27ee424f7b3b9af42b82c016dee4b3fdadc3bd1e6dee42fe6a8dbf5f52902c6d7c776a507ade8e3fecaea6bdc73497b449b0986549c4ec26c6fddd0ed95d619ce187f3097de73f7e027da805fcae04f8e63116f60b66bb0b371b243ddb0cf04cd1aeb512afdec1efc2fd349748511fcb48498819a557f67e6819fd99c954af907aa0450cfac94594accc07c0a8289a01978a910250801d04bc90cd43fd4229ca0e068067e29ff3099386106eae937ca30d72322109a81b70a4633900bc13c91e0829e19585a81163f33100cc13c7e4b88d9148213aa609b95760c433093af299e28729bcdd4bc94cc9ce8881920cd7072ce0f702bc9cc3f4014e4332b31788242063f389a81221538b8cd40d3173c3f33f07404298266202ee26806a6c25266416106e65933c1078e66604a08e639c511da0c5c094b9955c50ccc144a11867a66602a04330d153c1134035547498866d36f9421987f9848a8c2cf6cf502db0c1c43304f221c21cd409610cc530927e899812e442560a26706b2423053231f08cdc0186129bf94ccc0ec43c8c1126a33d02504f33c020b8666208c10ccb30a206833304608e65984244333f043304f9b139066600ec13ca360426d06be4c19d4ab0c19f6729df795c050349d300a95a29252adac648c2c2dac960c19325c60c4f80cc3cbcb647f6756ca3b338e7b30775fcadedf5c8a3d4aefe9213a5457fdd283620ff03b3de447753981fd6f4de5b8bfdc74984e49d4c169cf299d2853d9816df5ccdb01752930f570877bea96d35614b884d932c83069666d11e16a6346004ef0c48593462680e972033cd9934e590e54c61fcc81cabe29138b3501a5c00374b03c79a138659487cab8e75defafc7436506b061c6d0106c7f8e52a4d4f6668ca53c944e1a9a0f43c01bee4083d0dbe97276b1ab0ae655632a97999794c3beedcd187f8f0bda92f2e2937377af358f684f3a3f534964dfaf71d7a5907d350fef4d5afe50eb156cbe3b74d884f95fbaefbb17b274781058bd95a26f99c0fe65cac34ae01daad77a035a0f6d6bf200d72f531ecdd8dffb204481b45d014190a2677333f0dde009c43af7a9c6a13fc5d55671877f07eea5d9739241ae66ddabc1fb3af49dbec3002cfd7c29ef6d7ff353fe03aab1d39cf9ec9443f03326c207c31a639558f655402e2c654b69ee7fac1b4e444c7ffa39fb5837a43c7eac89889ff273f63dfd31620294528162617ff5fb34ab87f829e2efcc38560f93e977669c0eb99cb7fdf9406975d21a3edda12e7dec1f760778cee62c76faef716a0cf5dfe7380cfcef7b382cfcef7d802f87d1fdbd8d2bdad422eae1cc073ed885a55c3711fc63d2f8fefcbfa7dfd3220e9bff3df5b93fdf4bc0d30273f1c5fe1ef4441fddf3808026cdf083e007daecf4a51bbc477d8d571de0928b3e547e8a37a4f4105f450f41bdd8c3f4297ac849f39c1ebf09ff802a95521ea587ec505ddfa7603d4487eafaac13b8f4e0a7e4393bdd134ce77e57cf38f9bd0d27bf9793df7fffc361a5ff3e078fd1a06b9cfc6aecc55ddf7fdf9733fb3be91fe4f7df0f27bf1ffabeafa1c161f7bf3765f1bb2f9fd6b93725607d4a04e6c16e776b873839b1c8f16d1c9cd43e668c7ff5e12e7fcfc3781c8b2a0eee721f33260738350603f3d23e035cf3dcd50b4ff66b4f288aa06417ed708f0f858d68833bfc93fdc1f481c3d43d6c107089c1115c117f55dad853d425c5220f708727f1a6e53fcac2620241b0358ee3d8ca3a2e93d56ac17891a5755aefc283f5e18f2f8694074b97be5d9eead26d6cb184a1e797e2b7582ebf7ad5eb087fced59cf4555fdad8ab6fc927f166fc691aa916e29bfe388a54977404459b55cbc585037bcebf613935de3b437ef06187aa9248a9fa31eb88ffc39eb9ac3b7c2beaa89b65d4e5ce1e43d5affe4565e1cc2e553a48dd25dd2c5a675a9147e95bfcf057af1a1ffcd2e5bfd7a58dadfad6b7a0608075e68b3f7ee9a2597e8a3cc49f79cc654bb3e8d26e552bcff92ea20eff456554ff79f5ac8cbfa6b6b4d4a0b2198adf6a85e2affe55427c872deff2384f275dde136fc2d769d1adef441ee10e7599819d3d7ff5abe7449bd598e79ef9725be4c01ea94c05fad619bff5531f60fc965737951eb87bfc4c434be9bef3b6c2eca2597e953f9d7252b55af9ac416556bffa9aba4a89aa9fa28eee68afe8d1d6f0dc1454d9683bef098511b000024eb9bcb6e124cb53d1c645ac416566a85f54a60695995a88f651830a60fed4e5103d3e18e672f519d8d96128feac21e62075afd41d963f6c9dd6bb844b70f9527d1d57af565efdf7b9bc2ab3ace4b26e97b7354c37fdab1a5ff5ab0c5a51d4ac1df4c5bfa12ffece0e73eba738c7bcb36716e2bba56b501995ea6bea2abbe8140b0b0e111e59f2dc602d71fc00bb6853fa1c1bf3c906413a4bba6798754d5dedec95a883d429ae3e7cd5cf19da5d0af11a54a6d2e116b598a728be0d31cf7267da58e5165dd2ddf261c6affa17c66fc361aac7eff3c9c63cc05d83ca84aba96b509910c7612a58cb87ef03ac23fedde574c2e36e5157f1475ddae89183c3c2f0455d83cacc30b7fccc2ad39827cbb77ecc539776b77ecc2e2fdeb0b47e25d33d66979fe28dcbcaca4aa6bb355d7ee5c6e5c7af71969f79fc95afaa5fc9bec70c7e8bea6b50d9dcaa77c9a5109f36768ddb1e803be8349d9e62ec7d2af52a181f7eeff2ff31be257f0b0a89ea671ec3f05938f4a8efa31aed587df8625ebd2a9743b66ac7c86a7da84b160f96177f6e5db25a5a8718fedc43f67cd5d754552e591e35b67eb2f0085fe4b17ad58b2c5ac7ea55bfd22a3d8a25cb83ab3097e2abc41fff24e6954accabf0571a8504877afe49a575567ea575581fbe10dfe1cf5c8a5a88ff8f1afc9c4bbb5bbe8a3b3c96b64ebe7efca12e6358275be6e3a7e201a676f9dee573992e6176195f54b97c387f7cf17379ecf2e1fc51a54bece2853f43182e1ac663181f6618baa43b54fdd42588f3fcf0f1cf570967a8f2a1edc17cbae78b7ae5a9f8a5add2517d6aa6549f025379fcd58ef8a3b8fa9577d12688efe97d2af5aa952e7daf9ef5621e73e9c31e5befe2c2f2ad3c9d64d1a510df6506eaeabf6f11c51f9f258b79654c3dea5939480ebabf5fe5b95b3ead01bae7972b7f451dbee7a73ea54bd5cc2b2af258bd98597ed4213e4b4d1d3fe567f6bdfab9f22b2bada37aef4b21be553af5e0d7d410ef948ccae5900d3e8b68834f51b610ba3d53f6e17d987170d814bf0c7b3c81e797d3890faf715114e78b9a0627a7dd25efe1e3c139c9f935baa61cb2e7579ca969c874ef6f4777b43d6dc3c9cae924faab6b3ddd55e70e0d3e108417f440518513f4605667d841cf09aca0e2072ae062567f87fa3eecc0049e4f7d62b80068503b3b5657f576ad7fbbcad5ea4ebd56aed6eadca5dcd76d3df2defbd5de787673f95e5de3ac1d747b4e52d60ebaed9cdb93c26d0c335a31d2ebdf9f51619cb4317c799fbcf7be1c764ffbc6d8d7b42f8c7dc57d5df605f76595f66d417df9e52f59f6bdddbeab7d57f67df952b5efafbe4ced5b657ca9b2effba4f19ee54bd4f865caa678d2b4fcd525f9f74132bf32e9d5498fd199fd97c3a6571b439e91c7f2c5ced46bed6d3969c96d676066ed65c361e5ccd5a393f665bcc0a0f3c780e1d262b5b08cab957ba44aa9a4dc7befbd5ffabc2edb5bfb6e00c6c096b58fe32e4b8311ae5fe2a0d176d5d409b8c4b12d9e24f7381c56a66abab7de24b9ff3c1c561d64880ef06bdc82d65a6b97c0f56d95c761f60bdff42fe4297b0e137f06f1617bdb6e53a6932cbdcda507ae8e2bd6d27b99fa0eb369921748d9f41dfceca7c51943bfe461fb977269da34fcca0c74dc0d4ff46477e8d58a971dc71fffc7d638b67e7c6f3ad9aa3ae5240ec21a10a0406b2548e2b505d0e79cb37a4ef270536f527bce18f2c75630ac1773f607db2fed1e4b5c3d3dcb1f5e39cb512177dfa4a4240ddcfd52221c5faf99978d99d7cc6b66e665e365e335732d7dcdd418bc9493f55f5e24ccab7ae3d3d7cbc60c8ef7bc719c3e4faa606941a001edf9524b35ea60a5947ea540607a83eae1e8ea47e77f9fe71c47cf9bff693cf358b193b59567e6ccaef4bf8efeb4ba344b070f765f1cfb6a21012bdbaa6865240b9205c978643db22232da1132da86fde0a0ad50994d5624c34266247b223b924191dd6448b225ecfab22b644bc88252885645ac7cb1f259415a11ad96ac9c5835b1526285c4eac8aa6705440ad1ae9f4294624b294a3182fda40ca53c913274c4e808db114547181d51440bbe38c2a7054847101db1e408278e68e208258e40e2882347f41c01c411a3234643a0d510450d4dd44054839014485270218516526421c515525021454d0a278640dbf573d072f4e4f0c9f1033302f623abc998382c94f1d8644c422635221b0a082d50b4a3a126504aa090401d4115811202890b9b8d09d1d013434232265d12425c5c712b0a834224c2236111a11021105f1c6521243454eb92e8826434d88f8c474693d5644d643659910c0b19510b70d9d13a10744074b48ea7ebe98a743e9d91ee07f683747443e294e08ae082381fa32ba8886209e704d70407e40363417dd8912903613f30231c866149c082604bc084a040b9c998c86a46464f88aaabca8aac407a00ed013d0ff071c0120728e1809a03829480a4042e94a08512b250c2154aa0420951286148094d5881b4eb2f00e906da0d3d37f8c86ad54564931939f9c4c9faa34bcb8a465991ad6801450b305ac0d1026e0be8c28a2cecfa0be06201471600c4027e1640b3c2664514562cb1c2092b9ab042092b90b0c2c70a216c45bb7e4e518e51ce91ac266322b3c98a64463228b29b8c48765493d914d918d91c4d9a12b689e2309310b2b0ebdb703165e0d7b739326d8098b1396d7e260d6ad2a47cccf68a825cf24e8c4d60253a244e3e5b08dbae5f63ab29aa31aa398a21e78791e78c02d518ece72b85fd50d80f90ac061baa311c4015471059a28a64b55d5f56abb1195f5f465463317ea28a7645720b92029b0b8c19292b2b7c42c97861c570b38188cad49f52200152714211516d48c8250217ed680b18f95d340c44de8f931e0b8eb6101212121212f26e20e5b4cdad481187711f83e1cedd9eb0e189da751b846c50c2dd2a0e92b82511e431185d18430c0fe61d46ecf8d9e1b3a3c88e1e2777f0eca045419a31b7560c0f43e671f91078b397d7b9679cbd6819ff52c3175386055dec1ab8e8c2ae5f7a29d83548c64b0cd906c945dbdc6a3727b51a834154632e362542423668e18c0ce361c82eaff3cbc83c3260f819046842001b01aae8085034830a66f0996106243224e701cd1044ea6ce3c514c016260d2ee60d1f19dae626746b42652fa3262a98b1d7157c6aec7504e4301a4048268c0612af880045280214710428b29a004504289a21e83505d17d7520aac4d1d4085013126a15d518ab56f34aa592e906116ed86e54718308378a602a80f9c08060486041376c37aab851045301cc0706044372a3e846d18da21b45378a6e14c18264dca2dc6acc05690523061882e069e5ed7b21d33208de0bb92743916bd996ab487dde1d7351a66510e49e1a7b1d6528668c46925cab311a40d9e6301b8872151366c314299d7bbedc937b6ecfed19734f2e52a53eef765938ba05fd00f5747154632eb7d383331e146f4e3933717a9b79b0a82fa9529f773bf0751405a98bdbd18b8b2cecfa2a21a0d4e7dd25a8d2e956743b82e23118cff364d76f296a3172d87d105cade0d32af3b0d23044e1688b28dc6a1034c403995d7a40402d2bb52218320d254e43885b51adacacaca8742993d225f9e9f23d5d8e2d5a755ba9c9903f7e1e0c6dc6cc210475d9868b29d3850d122adb44e9c9398a38e9f31383cd0dc6afe424317a6e3d3f403e3f3d3d2b2f8a36ab17c51bbbc5fa32a232f6754423090d201b886c98e2f36ec7d110fabc4b05474328c54583a109050155d78f111fd4c9268a0d92cdcb88ca6cb8c8c2cbe88604c6508db9d46a42bbbe0bc8155463ac1e9f1f263610d100a281a4a321e412818bf63a7a6d01a24a9c0d441d110d2197085e5b8034845034844a3484381a424dd01052828610504a91aaa868d74f2972182acc350ccd98a019535d9c10da3528316b406226b18f8c9005d11535a028824697db8c145d0310d04d09508dc108aa31172117edde2730ccc83d3fcb2f3e118fc42d529e912dde4c35300599864c3cf8bc0e448da65ace30457a6e3db72e909e509968b4c584bda0a0fad4935b8dbd8e6a3063349204d5180da02187d940c48309b3618a144abc8de20dca2ad770b4926b78a2524316130a355c2105143ce52809d01444295dcaecf275f4bd8e96bc8e8e8e50fa75149ebea421b46f4e6e2717cd4991c760bc100c0faa429db30bd1142eda15a6eb75546900390d2493aca82f651e1fcd98fa364c01651339ac062d2659bf0aa5b86835564313d3758519b48f682091c2081a400eabe1c824ab91cc15bbba68d8453bb968eea261981e9b1b52750109dd60c893c86588a8490a9544120ee362305ec3a06dbab8fddc7e8cf0188c9cffc191259c3318328cd739c65b1a6dcfa35dc2f44c21dc726adce606635463396cd506a99c42b81dedfa647b5f4e2144c9f967c8c836b7282f39078d9573f48c48423725424c9e185bb6ae5a2baa56aae52da79f373b6e9c339de72cbbfcbbc48001c3a5c59a4510774697400aca1d10acfb26e946c59ba427578a269b007b0a218a25c050044be14dd213873db9953749475cbe49ba7147506e926e31b67ba24d7d524de14be5b0e83831876f7dbfc09c4edd9e6051b17058d55840497ae2b14f324a8292744b3a32c2a2e8938cf44d12164ece1d63d2cc8e8a1f4a6e926a35db594ebc4922721891939ba4264e2639e97e4291d4644ff1a6d337494ec2dbe5e9a45d02a63f9d542227e7e6d12525dd24d51c769354bb49b279ac1239139b9373dbdcdd9b2427494d929824d5926a494f3839777d2656df24d59c9cbbded56dd7a1fad409d6148b3969807042148b4c9d6c01db2fa9935db91aecd3975e11bb3e78c51cad6d3463ea83d4bd554bcba64349a85075091155577d51a4b52e64a14162120ab40320cf03c75d1f75f3b851dd0dbe156c04ae25d5ae4f9fa49ca0449bab5336228c12a98f0f18723ce076c029e10a8a5135d106c5c4c97a0214aa96e2d554eaec940f3eedfaa69aa9b632aaaefa6188aaad8c6a2c657357fd7af5ca28652b53364e0738e48a381ca484f4045815ee5d7b4abfca3eecb0025ad9260d0a7c0ff4400ff440f04b727b291f542d05b592690f8b4869297057119cbe47f938a9c4545bf93e1c7c14e5f0c308084bd4e128a44fbc1e2d31078ac3505fbfeb2e2ae39899a1a1e6ba88384e56228edb348b49a3f2f56f93c6e64e1c5cdd573d7d9b7afa2d2a1446a5502cc03725daa4b8d0bdd271350cf15f30441286b8a36e95f7f207954c674ccac3106d541e1c432e09d48885856efa841e5128b6a61245d174f50ac895a054a89bca292745362a3a65e36e00b68414ab7c8b689312dad7a27e8a3ab88dd2a88b42daf7aab48837ad7d5bf45663e3d7a74693a6eefa37d74d8f6a6ce5ebeaeb3bcd6beaeb7b1187a57cfdb1d6942d8545ca28f544cc11635f9d2a2ab28d78072d97f06677a130c01865b753b6e9aa7ffa39632bdfa16a35b6a24db5ab6b35276f80e9cbf8d58aea532afff79fbeddb953b44119edfaa6fa622e2d935d3f34a16a2545daa924b8935da6cabacb946d57270ee3be62018413da17c816b4efe584f6eaa6e22e549ca6c33eef82d65a9d92fb6a2d681ff4da99ae7bdf7fe17720d88160973fcc3aa54efcae0bbb0f3f107f8d8ba50fbf3cbda85b4c5f8a0ee2d2773a046b50994f7b9d2e39bde9895e2faa3072b7f77a15b62a82aaf8d935f684e2084feebd1f576ff73348dd9fbe628e9ddd3d58bf6ffef7e9d89f1ce5b8ea1fa4fefcf97d9fa7cbef3ff0bfbfd1e1b4fd52086a21be4bbadcb11e970a391d58f1c406c09e5058e143dbb4047b4251c56d8327cf7fcea7d833856118eafcf085a19df17d83d4aeb41b55dad87607044baa4fcfd137d1377126fa266ed674c46a323dc79db83f852fc437fde14f5fa63cd6a58d1d6a21ee758f7f3a0cf5d8a4c52f5374f9f851793a897579d29e2e2df7f6c56c37a74b4fa79ecb35a84cca49aa434cb921182d01c25a6bade77d5d47b929765c0ddb75d65ace06e59ea3dfb910af02385fec0ff0741b043c311d01385f4a6f73de9c34f47baaa71d020d3b916acf4281ebf601d6f9feeef2f7d781e287978659ecbefb29d2b7fbd335a80cfd9a7a756a6ca5c696c3b869ef10ecad4165aeb642c0dcd31458c396f501a6dd835f1fe665a3f4749735a84ca88dd064936f0426bbfe0b4c0d11d42f2a632d8f5baa41655f5e5d83cad8cfc0cee6be2c69f71de7f970be3b2e755fe4acd5e7727cd4e0f8b5d4fb79750d0d5eeb348ea681068f7133ff2ada74ef3bb3baccba35df8c937efde270d267340d384a4f96c817dd7292099e3ffe7deb5dce4926e054fda693219070573de2cdf160ce7b451bfa1c676dbc6ad87092ba0d8eda1e1cc1c91196d8e0c9dad8a5bf10df93c89e543cd902d8130a2a8436f7d45abb69dd5cd6093284667b7390ba395dd2a94b1b369c68c3fd9cdc7b1f660f8504735a484997d6c59b7247a77e5a889742bc460d2aeb347d4ed7a032e1d635a8cc7c4b3445931d803da198c2880d9e405073797e4d7d4e97437cd8e5fc72673b9dc2dde94fafb3b665adfd4e4f27afdfd1baa79cecde5e7c3d3aee6caf5340dd36d77d5fd501f6eeabe841a1eeb7cd454172b28bcd4171d21a6dee412447126912b0bf7b9ebd3f9dfc74596d9b7b9bef6f66ddb022727ff5736633eb861522f657928089e0f2fa2ce1314c84b27125cc473469608a36a70465e346ee86201786a268fad312d707c4cf3d8833e6a84e325e233ee349489f829cb449c025260ac25fe314838f893810eb1fbfc17d39a2a811f40866815f7a94279b7b93fe711865813ac7c7bdc9f4dc5f23f7477cd73c74bb44e992853745da406650586cee5136872101fb9728279b7b9087e9a4a8cb1a05d465bd6dee6bbc1ee5a0cdbdb502b3b0be1f3f889dd97d96ccfa9ee583d899d9c798a8c658dfb3b0adc6589f6621c07ecbf7b0dff29fee719fa5878c7f7f080b91935f62279b9baecf759296af718b9b38c961a21a3bd55a4eb539bba79a93dc5fa01b747dee0f0bcbcfe67ed43e9b73826b9d68f33dc8f23bac1e2d2de3efcc58b20355173766ffa92eee9dc81dd4dee4c36097dde6eea4a8c8494ee555449b0f4c21dd1f354562f5189fe559f410fba3765a7571dec461d39b38999d283b1327b9d3734f831c067e89537cc03f0555976b10f55f46952e7e307f6ff39c9d82382ffca04fa36ce4be494202bd14ddbfcfe6eb441c1a0e8d8643a31571d8f738341e27716845aac0fe9388c6b3a7788343eb718d432b82bac2e638d1e6f3c4cf1e019728dbe69efb7158396b38b4224ec2381c1acd73e937017373d93ae9204e8823d28f025ef9d5fbb3a8cef16dcfc7c93d7e8a7b3edecfae3f669c471d4f52aa1aac13b08502b6a3e8cfe22d3b42fb045c7a4f11af360bec53fa70b2b6c41cdfcea9315b350c2f3266c440ba6480890980cc8b86e9544300366ec0623303a091611c0498a1003530b8f9327d351577171c81f3a5bc49c0f4eded02997e3ed8d5af8a35a58615ac44b5daac6b6a57ebf753eca05019777b295b29f799b156a8f5ef5b28b5da5496c70e63b150ac70813667ad608f8862e8d283a14b1cea12bbe8724cd1e5d8d2e557b2d3e5cbbd25449bbadddeac40656cea39d1a6ced578d22894fba0502814ca7d6aac0e0d0db9cf90fb0cb9cf90fbec215a77bf7cedd293e42e95eebdf841daa9d47ceaead08b24ffc7d11bf23c8cc791245faf04cc194f10f9ff8380e175feff1e59cfeaea0183b6b5eaf2d7daf65417a5f5b7eae6bac555bcb1f57af646c4b15b75e3fbfeb4d7f42eeae8b41d9a3133469f7e7ecdf5e6799ee79deaadde6cd0ed45922af8bb4630c6f8f1978fbf24f197af93e7799ee7790f9eeebd0f8629e2773bca05bcfaf21a79bd425d92648a2effc71163159507ab7dc1902fdf1a4b2033fb1a718d9cb880c72faf916d2252f15079a5de4ad42e6d906d52bd222c8cbc2395bfb68be234874deff12247d60a5436b7bd856118a652a99aaaff39dc33e535bf7da63d74a35468f865952e48f5212ae3bc76effdbecae9925a9107b8af7e2a74dfde6c7fee589b1d96a255fe7b1f5251f95ee55db451d113fb2dbf7dafc6feed57fd6038c57a638075ee5f4e975edbf661f6a7882d8936758a56c8d65495fc51a15a79aa0fad34272badd29cbc4fadf652a9f4b4a7529fd3835444c07339fccf73566f0efb12e033da53c1b7d9fbff3678439ded12eeb243b3ba2aadc6eaadba9c76a3f974d30b706983ecd79b93fe5ebdd51bb6414eda6badb64641271b74b241a7b7410ef3dedf2e316483eee5ba8e13bfb4b72e3cf6ef6f69f65f6721765b6d8fa6d1b7bdfc6dfa05367d698d1ee5339c85c27ae3c1eed206855b89c366b595491387754e1c768bb0307a7204c5613796fd29e43ba0b2b9bf9fb55de35de672f5dee6d2fb7f0f04e79e01b65f3fffcecccbdfe33feb214cdc1f32abcbd357f7f8cf9ff590d7d3087e6bdf9b31b5cb2927adc64e3aee022e279316ee020d3d72a875c2eefd395f35377b2fa48d19eec2f01986c05ec0a547d69757bd574de128d806c1fdf74174ef3d1126ee13e1fe23d2bdf7dc7fdf83fb4ff7e8ded3a590faa193d704d8fe77d6ab5b1480a59039a94da9a485809e47bbce39aede6badbdb572eebbde2430dda0a8c3f31bef2fdd54d4e1e9c9fde73ba032f33dcf18eba4572460b553b310e04fff064e4f4cf5acae47fd60ffc1f4e98fc3e8115bf800d0ae4f8d38721e1cccead3100a2f68b2ebdba032faeeb4082048f19c3b9b52f207a04c00f6fc99e375e710c5ec1e7e391fd6be777afb217618f8f6530e4bd2f333dc85a2e9ad8f1c16e0dac34937e5d0f3449b5ac91c27bd048a61123ce2100cbd2f89369e07be7c92d35327e053c9be57faecf7de8ed7b6bacb36725cb4e18090bb3e770172db2beec0e19d672d8cf78573da660ed7f601c527533afd7c4fe7d87c80c152e839ccb5e78320d75d5b9d72d6debe2e7c0c7a6150af206833cb1ef7caae6cd5ee72375da72039b5412eb45965835d68730a6a835f68333e6d30346d300c6d1637288636871b348536831b3c85369736880abb6f7b5de6369852812be12ab4765cada8522d2d26abb91973bfe380cf1bb703bb3ea5612ad6c15a3a95daceda3386bdd5e9a517099c33f0aced99d7efd2dbb33eada8da9ef1a527e3e72cc74d9fce90f1a2cb71d75a8180f002a11de0262ea5010eaab11eeef2772738fce0d2a02774d98309dc252174836c5050f7340927fd7dffa03c373e3a0e0727fd7ff0c4754b797e38ccb74f4add6bb5f65e8ea3e20ddd9e893661f2c36fc769da641a31f9517bf8c0c161148a49ba67632567e2e4534a6965d1dfd9549794a5837e8e9330cecae1bb7ece0e5fdcaeaefa13c84c751d7e4ca3a01af31c36b98c47a750a47e50260e43bd36d5259099c9055c5f4e43f1e6db562bd1548806d12f70196ea754df4c18afbed49f1bc7cc6462c347c059a90482e013a1a5524ba9e57766feafaf5f2a7d8b1e327ee987b03cf83bb31208965ae6aca4438e8f4c6424c2448ff1e7136179fa2eb210c0f2f47d8c3f1f244b0fbeb73c8c8dad5b8c58f54d55b31c507af06f6879f16f00dfa489941e7c511361a2e5e78cb401b6b4e439ab648d5d2317b51168e4ee5ed2acaea585ce1616ce93234e5f23daf25749f9558aaab45264f9aab1397b596d001a9c64b2bd3ef5f183156172aacbbf669bc16fe5d27b996e9796d5afbc0bc703ccd11e64d6b772cb53f17b97209f6675a5b73d8707ee6f6610ee6fa613d86e1eec2e491e589dce61b5e4f0f0a87ef53ca95f7990955dbe25b79e25d31ff37c22b8dbeefdedc177f91ee0bbe8214c703f843ef89cee51fa961e32bff435ce2a3d4b9eb331cf1968f3dcac1c3a4dbf92c5941cbe4a463d0f7ed3f3e41c1e9e20c2473d0f0f7e1ed383cf737a1e718706525c3368f23f610f67e04b934e7aa5376d39453410020ba868826df6f3e97b938273567398e7cc033df2870e393ee8cfbf37cf5b5030b77502a6ef4345fa6aa3c444df73cf7db61a63f5e08688cf819407bb631eab3ef73bb3d277dfa3f4dd3351750fd3737a08f7a61fd27de9776625150ac10f29508db17a9cc43ffdce8cbe9787b8cbcbd42edfc36fd93409b8f4a109b89cb57222715a57f1c1771fdc7fb63fdd029e483b4c1ada3d3e8010badd0827a9932535b2518fca385bcb046c35a53949759837db76ef3bd6fdd2cf9949b3ae6621c0f4a5bfc1f4254d84891edd979e8827b4e9df50eabea4a72e69d0a6a1a6444efe5eb658e0936699b4a8593774efbda78970dffd9c859a55a20f6ad60d1e91afc4db0777c3a72991a7c9ddd56c5bc8ba47e4c449e5b81d1c3737c7715ffd28a51e678d70e9715f6b587580c5039436f7f76672df3c27cd8d614ff100a5bb63c37138341e1c1aade2d06848485e141c5a111c1a4f1424a42ebc283e1f16e05bead55eae0ba9d59ebd196329e54110fd1cbacb3e143870b2e792187441634f2894046d1eecb63e0efb2effcbcdb5f2b0b283fc40db1fa5f67736b9045cbdd20eedfbe4f63c39dab5a31dedfbb243af6d7f76e5eca5b47a44b46bbdb64b6d3fd4662f901301d55ad2a07dfd4691ec17ed4ab7373d3d6b8d06d5dab69fa9f5d9d524dadcd9c4c7df616ef77cfb1a88c73de8e5d2a39f89d3a393b6f5e2b0cb8d2d87e1d29fd3494a5f63a5b7afbd529eeea22fa4e20210a427704abd3d5d0fed59db3397d7079b00d722b0e7288071f3d9f3adf8f32d6963d70d5229e0ee41ca12a5c55204ee92d09fb9352227598e4a4d4a6fb31cb1dc6aace4612cb21c5525d09a3292b9029725a2d49c956c359632aa2e7f4f197929239c23c64e1d15e1b2444467ccfdcbbdbd2c3e33a6d3acae449477c9764b36ee449b317e8294d104f697770a0c1f14339d32a50f7349a4ee92d7ed947497587c26cdf7a72b588ac04246a5264ec238720516cafbd373c6747997884a444ebae7a5264efac3f831012e4b44dbbf6439b244a5260eeb3c098c93b4ee1a8c908645a03d5d10b2e082f620b91119d98e8a6e46537634df478d51cf03a2b29a0c08bcd4899322226c468e1801c2c88f119a119b91288c2c31e28491268c28610409233e468420c246848d8822228c88381a82888812105102228820820822882082082286186288218a6a6c86518dc5b05e911e1a44ad67889aa5341f3a84104308711ba23684134334318412432031c491218a188226c41741d482a8054114842d88224ab36d9f1ad33f350603a8c65c82264d6909876121879d9438cc34e430f1098785354a23a2b4192841693dd78ba21d2a769cd8b1ed0cf5501a10495f247191a445521649572411252de942cfaeef811e0ff878e0c703405af8d9f57b28eac1a887a31e6e3d74d103520f513440d3008f067a34e0e3451676fd1eb8e04a437cb8d9907ab0715b00f570a407207af8e981e685cd8b28bc58e285135e34e185125e20e1858f1742dc6cbbfe0eb61d8a7630dae1680ba35d5f0748274847486748e7099d9a0e131d229d263a369da21a636dc1835d5fc70998106c08f604ac0623823571b24ae14707568331f1980c8abb6a8dc96a366c781ec663678d8eca2cca284aa392688b9f2d8ad842882d80a0c21754e0820a5a50a1880a5448e167d7afc04f05802a105401a12c8276fd1f473f6e3f90244093008f047a245044023e123022811f09006501825d5f0240c08c38754b38faa1c48f227e04fdf0313232bac2880aa3288c96183961d4841190d191251cedfa0f387ac0ed0148474e42b921b5320e1c3db225b220cc98fa9fd5b2da127e861ef0f300a007043d406809464b285a826d09444bf8315274048923421c013ad273a4e8081547a238b2e48813479a38a2c4911f7aa4086aa46817d5d88b518dfd113572abb118586c92d324c78632d96ab51c26a7934a8e508e921c211c9cac3e4e46e404f1d08207153c8e260dca06643b622bc226840d08237c61042e8c6064842ba608dabf63688711402ad8c7678791146a0a9e1d3c3b7a643419906c0999904c4990ac260b82fd9041902d9932f0274d099f9a38cce430312caab196cc08598fcc47f6937384a408891192232447900081e40709cd1e218902c912244e2069028912489040e2834488238e8e6a2c868a4a8ac50038347c886068309f1b54dc70e2c610ac0706c48d2f6e7071438b1b59dcb8e206d18d25347c767d1a3e35f63536036668d787a1c1f4c0f8c01881f981310206082609982018219813ecfa3045c08c088205cd40eaf2910c483238210312320cc90024c34d062d64c842862b64a042862864582283900c4acc40daf56720c5408ba14703edfaf928df32528ea2699a47f7e822da47ffe42eecfaf90bd80fec0706044b0266040c0816e437ea539696f1b8abc27eaa8b050ea3311913590df623abb58a725136aa473210f967d2a0b22d4791976427721359898c44f6c942b48a76fd5651cba87524e391f5c87c46d80f5212182c2eb6495372e230ecb093490c8f6aac25ab62d7975121e391d1642ab19796ad5504eb8b960f0ba945d45ad272a2d5444b891612ad23ad9e161001ab3da8746b74b8b11e850acd88000000001315000028100c078422b15834cfa44df70114800f8cb65060569947418c8431839031c60000000000000000808001e0a70881b467a3d1abf5bc6c828187a33d4a1acd531578b4b006630768df63f9c0f717f1b812092398dc51ca587f014c9bb20629ca1476098142353c5a89f910b254e82009010c4d709550f0af8d84154f35482deec058f497f21c3170bb4401096c08adfff2ffe5f46a526b618dd3bfd538d72920e3b1df3c1f15724a090f9bfffeaf531d4edd1bbe4168f4faa73d9b986290ecc11886f490ccc77f3c0a63e29695b35bd932e0dfd69104d95249e959d57df62d26ea7c768459921a5ae37bb4b566edbc96d6b2efaf3fd44d418488ecec7db360b9aca48e6d2b59385f76fccd90f3e64378fb809a655b7873b74f054f5c314de3c565dcf3905f374b5d7c699027b35289d615b8c8204120a3d006258865fc96f74669b37635c76dd599525edea1ca23e874728b97603ee521033ae3ca2300f5ef98689affcea51b492bac3c782a304c6a937a333df073370bbf056c0afeec348ac6c697e7e8e008ae1d2448d3395c3e5ac76e893e72243529c94f0d7d6b70c8834ebf62d22f9c39f16ff0185d8fcb68015b620940d2d8d619ecea339bbc1283a3747fee916f275070582f7ccdf9691e9d02d03dce8a2a92370c0d5ae196db0bdb3d13b489b150014f85c922da087ca68444487074d05e560e6425d8370cee7aeb347145d1617d94620d1b0fae2920086354444fa70b54aa41e9c93c8f5b3573314a1312f7317034161d9d4538a92e0a993e7941910588f0374576978336495853d7fe3fca3bd25524fbc0c33e04a4d158f120f2c13dfa6b25b1c9c39989105ab7651b660702d2f6f3bace2dda6877638d8a5e90904b083e7112c49eae8ed2a5149ab44ba349b0bb76047f441e49e4545ec735f85b44c39879d5fd8897ad9beb545a3281c8f8b327bfa7b92ee7c3652d57caf64ff693c5fda75e2777672b051136efdef52a9023df0088f817588ad9157924499a6863433c6892dc1740d449fe41413df79a9c504321f00eaee83b1e5a006cbd6f1f83dc772292621bcfcc4b4e952b345d3b708dc76c63667fb7c24c304272771e36ba19ff60428d406353f3cbcb840a7d193d7a54e9f4593cac7d7a3605f9137970f5984e738ca5f7fe6a62b298498b97e6be27c53133e0af1b933e361b09afd9bc55e8d9534ce588df7af0758420aeccccdfb858091a98e2604143e434b0a11103b4971f388acb428fca16deceda1ba8344a75395bd57bccfa04874337b0d86f31a05eda8b127db019e45c486765c8d5ebf4fd1acf9744e299cefd42d8cb4f7aaa9de1fa13288ab868a68f885ffb8ba74cf761e33a956a9e93cc8aa26a00e4e960437664584021207e5321a860683ba24508525591b1f9f74baddd09aa3902c97ac9524fd5aa46563a5419c84dc68129cc53525d79e8a714db6574b31915ef533aaa8a38ad1260dec9fec33e6e9b415529ff27be05ed680763bc4b1428be4ad1b8cadfa307f2611598331b6d278fc106252a0ac857e0260110ce75bed6ce4c9427cb564aa63f8e84f4278a1e7a87e0f046282ae08dab7dad904b204083d2427a8d2a28028bc1762b12dff773508397ea8f75973485d5c1ed0a5ba38ccda4410086ca0e30e505f0c34f193db31b03c7473b4f4e4e372a5185d937786f4e03fbe89fca5156682665680a26402136601eb67b41043f96fe5883168fc97ab0ae019d997141aaa123179b68eb9b437373a257f8eb88e34e84d955dbcf0025a1ab547b45c91b10c334bb0f28e8a0e19e7ddebc9a447f1f47140d0d753c4615e308eddfcddc193548620cd95fc80ae787d6f7196110ea5cf4f799fda75deea863e90697ecf9dd34e6cf015c26ccc3572d8673bdc0d55966387eb19fc6917f4f31d3741fc83a26fac4551f0a16554cd3bf19317e1726ee50ba645b31c4efad700b336622bf5aa368078cbf3a9ea1f1b8a6715157ebc99239a264fc9677784120cbeaacc8ca98d7b40d1fdc3b2ca350209dbd7107eaacc9e80b060bc98005e518732eed447005967f63cbfc31c18044053d809290fe6cba9d0f85f78e8925e237ff38c08427bd5fc0d90ff02802ec04102c4db7bb1ebd22b93687a16ff3ca888e978eed9645c74d2d9b7e93c6396ece94a3294ae7f1d7b82f9032a80e1edcb5470eae271c44569a5a9c77469bb211704716f71b5e917475295309b3d12259ce945eacda66cdfdce8101e603c464ae4cab9ac5db7b847feeb1d9d0f313d7f4cb14f163c92b5bc26cbfedede0bdfcd854553aa5128a9f81d48e85139bb632baeab0ae1a1f2e03553e700bcd3afa45798f57b60ccf43ccefef82e5608933107f38b7fb70f02590ded2614e8549b2bffc6037c7062cc1196582396d9631add2f1ad4a505612ac436d25fbda26907d076a59a178630d99db0884c23c42d57847efa2d71f4f7e56f1217a0d48995bc761855da0f1279198127e12b1d95cd9117f2c83b005f947d22467ffd6b593af07b301c00bae468b7c359ef14b3fbc6aa1f98b94035adbe1b9f3d7fc58dbe9feba8a60102b0ac09e81ee3d439618ca3fd5a1001889465d44b7fcb3934b788636f49ff275c6aaedef4652062260fd00ddc511d1f19c75517c00a99b71b7818a19109c8f5489bd1f85f9ca1f2e5eaacbfe9ea7aaf1e5024cd89cd22a862499c7fc2a705570ca0f6ca029a6c0d7c0fa8a137c6578df574d57484c133e4b6a55215428234f25b10d2ce22e5533db15e16aa6b0f0036d6114c1220a080e287490053f3fa6faccb81a138f3f13ec900e251544bce091eca646a49b0cd2ab7897d459f9ca5b905157be34409a7f9db01af30879280939a802d5148f0ec3287725db75164d3df6a659f052663e1ec0d3cc45058cda7f69c88d9e5540c9125d3a6e39a059f46640eb89ead7e840f396b83e70ba6b384bb15ecc2f7439d6b12f7c08bb3b2cf07c3bf19859db006582784a379d02f276d7b2d57d108a6209a00612642da9e28144c0327af3f86dd66f8f21393762c3cad45aa4af28ad20397bd5b1ed28194df4d0fa266165f35660c8b4e2c17a4710f45a59ee8f20655ebcdeba6b7af36be8ade85eaa97bf34a82d05b2eefa26cbee0a179b5843d9bce736c185aad39cd58d6c856275d22d1b25776eedbe8369f4429c1341ee9e7bc954cfe682abf2fb73e3f7942e045d5a087d849288fad987674f35d2ed217cf90dc45596092415c9e3fdd8a84b881af29b95636dd9430c21469b307b86ac53522343c738737f365c020286189128958d0d1a3b885e00d899ce1911f56804d36d409f8a45d65145e6175b53ef0f59afa0eedcf2429f152f8db524cc6963b1d8de8443b983729428585edf977e1c2f79c38434b85202a58f6ebdbfb554537720ec006430555b1f3cf513e17a7a777fe984ff72363416adfe42ecb011f4497566d26c69321403463c85363a5f19df316033edf86a41ac4a91841ab095a53f5efa1a20cea73dccf799f4786ec97da1716e80eaf00de7bfec44a8f11d8f857a24d0e87db0623f6bab25ffb41a545ee46c36c7db991639e877b3d5456e65ad2d56730bcf25bb5dba968e9880dd52e852a8921c1604f651346d317a3ce2cac96a3779e781cc5e10efaf0e77a78e54f1a9cd3b8504a9689b6fa60edebc379c29eea9558a25082a65e87bae768dc9ba811a0f78d550fe88a5d155c634027819cd2d674ceb8e28b87ea89f086e4cdae5984cf2683e59c1aafdf0cf7b73c9b075aae050ddbc7f72ea6df5985841f1ec1a5be6978da747622d3cadd8261330402ba41ae175c56c337acc6e14a04edb90184d4a82a2ba1a8bbd8b956fa1c20523e14ffb93ddd7e7ed81ce3aa617905de2e8299ef72bf582cedfff98f870db6ae87d10f7ce13d47710bf49dedf43394db86cf54f232d3135d88fd5bf504ed81e16423fa5100aefb5e65bf87bdcea820a6b5e8af0c845b3aba0b77fecc2513bd58289ae1dd685b76e7d1b9fc2862547847b5c4136f49cdd7ffcf8bb710b0b16cf1fcd63923fef28b3a8a033af474df1b70877e5f551afb365b494659f25253cd0c3f57a103679f713f607e0398973d475ac98c18ab800ed04267b017fca2d00376b6b38da3f0b7990ea9599dc5d04642df3e221ae77d34682171d4dde75bdd34552d1e7e18f8c588dcbe6b10055d7611d21c61f3ebd8e5965f810788f6207c668fcf5922ce4aa9a05c65e1680709b2bd8cbbf7899380af856d735ecd38edaf52f4db95abb3b29e4f633e3ca8a5460428368c30a4af98392624bdcc3f6bb662074b2904c2fcc8c3e1c173312a066596c8d9fe38a6b2851d3cc328ff3393322792c5d901ded184c1d715ff645eab046c7981c1f2169d62aac81b625e8920edbe644026b3efeb3fe6a0efcf204a2655be8cbfa8f18dd2b0b32bc7769d64441388633230e487d4829e133c98a593e8e575cdb401b493fcabd60b82ee2825814d21a1f10b9403f24edb7f84e43852c340e9a2956365a5f80cbbb2861ccde6ef0849c68cd73eb935c4251a9037e447002db0391a10149a5f6af911dc71fa88c83e9defc7720823f78131b4667d3ec97096c20787334a4246e096b99b225e4647eb75b1f6233a6f673ddfbc7ce7f6ffe7bcbbff4fea155ffa5f9cff2d852158b6dbbc49015747bccecdf6cee3b5396ae39dac4551013fc023a85580853d033d78cd3543a352d41803f0cb1380c6aa8389cedd2f511efb87a948dcc9edb95f4b88a29c569ef849cb6c3cde8c8951127d144f699240529ce6cf768991484db974c353f65ab1a2de36a5f673736beba4b49cd848ec4dc8aff34eb49b3f1a588c58b903877ac680952eceda24d11d24712634615906509c3f80d346a9942fc122c1aa523db4cce0d6232d94203be4d598615f67b81f06eeaf43605d8c02f339e3a06762313f3c6772b2ac14bf37f54418d45451c62aba3bd29ebc3c625dab62446f541066aa13c9f01df7c755921c70184ec2d4b2e1c76d145e11141e4ec259240aec48e5a559bdf9cec191cdc858f1c36ac2510784d5601a9baee1041d7e09d03d8d7096f0a5a69dc2a0112d03843a4903afe2f8a2fcfee191422f69608c9d40953e266e0f4b33ece1d7dc9a1430e090feb2cb4f781ebcf64fd661846d3e3fbdbc5c22e4cfdd45d355337c3e5162302ee14517b5e239e2f74f09f1b77d45c1780f39f49da63b41b659e8d8fa3512ba5b38500b0d9aaeedfd0fa20bf2a9633a91a0b7a64add4cd97dd93cc079c094523c7b4a0c83046f77f8763e635f703013f474c8af6c6b3bf203e2236c8599d220cd3d67e58f7026104dd95ca78abb78261caebba5f63283d3d60ee5c4d954a7b0fc4102f85070bc76730cac279a429c8aba59627717cb8f9b334c64297800813fdf22c111264202838ff31b4afbd19adc3bde1ff5094dd461b35aa895f398295280796df867563a5edb8ab52bb6bacf509e297cf14966d620599921ee1de7d37ac81918dea5ad2fab0ec4c72b4fb1c694d77246f744221f1afa8db7295111cc4117683a3e5bc4c3a43c5786b08b61a659fe69a25c7a6fc36659a9d356a113aa26980ca28217a5502f30fc1e2d19196d7806452602dc2604ff65a2ea0ec1b451ae4a0ec432f8b02c284a81f25b006b8201a378f02624c657e07565abf40144ba2464f5f4fa2c6e7c0748710d6d4bac07af82483b552de69fc1d6c2a6cda6a8f153d30a6da674ab7543e5bfdd75e147f6e1d229681457b1459455b30710bd41d86b56819ededd5365858adeac1abeef6d8d1adc8d7c3c16671f8bad82d8d7b8e05576ac5713d86ea142ca911d7b83f7bcca2ad8d9927d355ac1edc75e8a9700de59ab304ba88017a873999daa3b009b47c739ab7375f5565fefb38934896c2020dd245d7193e8935f11378efda2bd43392ceb5160d364d67b7743f38c04a21b0250db05dbdf095c39d2245caaf51267058dc0fe3d551e9e969086e9133b8259bbbe6db16228f3ea9913a1ea921ad9bef0b19e9e20265aad9864c5a668ca8834e61e8120b6dffd88a995e89a4256dfb7a8ab10c7b7b966979fb9b4cf76f1032b1fed5526c921b34cb8913b173c58869c910fc5b2347a74b0f8f19fab0d3e5851de30b276c54283b933ebb82ac10dacf3c0681e9bd3d36accbb07976634864cae2cf7a243333e948ccaa67590ecbd836a9cafd30bba10a81e2c679e7078e5f65665bcc009914a283960dda614d95764f335efe1ab8924fb53a10ecd7fab8abd526ab377ab877096c63ae6134617737ac9b08e06dd6bbb121671f87f75b6bafac17f972abb75e9bedef4a85fe50b6ab76feb87fb076a16da8c0f7ee88734a0a9d48e1d856c6e9cc699565f019111d62f4b8b79fd5a1ce8d5b826499003dc9c4584024d52954a10d13aff581c6efe80b72403d40d1565c3ee171c624763016c747baad516a6a200c1ac566aa61c835b7be8031a44cd08824f8995f0fff94b9590e2deadb36381e4dbc5cf0531bdd1d0e1a84c546a16ce307398624ea39e6b56ac03cb3a542cea9b69ef1de327a1a4c96ecbe73db8862cc7144a58ed99ed0ca566427e081ff5f9235c73c16ed9e2e60a52626c373d00caea8c91d16f502c8182dbdd997526496fab3e09f0986ba8e52afa46042480508aad3bc656dc1de6dfc26510bd43296bbc92dc20fc6bb62d23aeca075000ccd713b0288030c42e250189b655fdbc18152ed6734cea332d0e74be1f7da7a0b285ff1caf45240121caed3334c76f5e749b8c7df49c36f8a364ff78a9dee85dd894177d964dc71c3485e12983afa83d18d6adbdfbcbfb3a731bb5d729ad57d40dcbf7942dbb2c802b1b283e79fe7b1115c93a26caafbc6cbbee77bc4af8bc370080f54c38fac73c06da09346eb81a3315a14871eefdd560431888cf2b16db4eb9ae350697ecebd5caf91a6e0f4e619987be0ec321f65f6fcd8f9efab4f1eba83fbf47ff9ab6303c4fcd587c0a88830ebb3809552fd446bb5435b90e899f73f2fff61e55e13c53a6ed1d2df91341461df417245fdf62cf831707cac3c11e489b19fa84ebd7790d79739c271c99ef13a5a08a95fe01785ca818c0ce775f5aec3f577e07db9618c745fa97eab76d160eb7eb83663aa1cbb8858591c5ae5a1ea102bf3e450921d674a2002be409051e6bf221652f63e18ee4281fb4ccfdd601607f87c0639ff66d214c0f9960e59733e2b08d56c57c5dcfefa5f695d2f974bdae7f06b10d3b9374cdda8d00ab52474ac88bc8fa7c6fe09df4be3b2180b9393b12cd67ba1be8c12666730fd5e92fb947ba5912d7c397a0856756aaf579194ba5b736f5460f36026acaf11087f75af166db04e0ae4c7c1fcd0d11a38f44af33c5b396b509a7cc9c0d7bdf543a9e0ef03a7fb21b80c5abb29808af162ed4e53da30dd80807fef17366cb4ca0912cd3cb8f1c403a6955b36ee35924e7ee0d6777bbd28ab6015099c2981a25fd6ccc43a6e1a31e9fc2a1154dd1005976bf5e2a257b9b7211abc1b141d237d10da037dc1b8811f1e1033f76de785b90df7ea2aa7ca7a3ea37eb7c2f4900c4fac44753d5137a08fcb3dc7ae29c0e066d80fedeb1fe6bf0c12e0e9d1dbb78c378810389407597e3ad2f31d076a51ef4036124871e1890ed3fd0daab5264263fb1b8a41e02f3f6770a3fca56ea68787ade59d1e464c9f60603f675cce11c5f1b99a623a03268385c0b7c271bfac9c7d9b5452e9aa3f66d6e97d3132f200a2a9939ef632707ce3c0c97090e273e56eb8003eea8179a2e2a49086c265d0df5c80db41f4affe3e605fdced18f065309da3a345a6f8912df4c690a40af949662b888edb08ea4822b19bbb1b35f436238f0dc33ab9db019cc93b50f5394d338659f80a58fb6c2e0964b2300262f4d2b23654a9c5990b721b4e1a4fb8b4b53573bc7379830a5fe4357462073c018fb8e9c4766604db002382cbd4748cace32c38d2ef0190e3145b00c72f4227bf14eb04d864d61d05b7037bd77fe9cf40d4ed4746714f41a2e65c698e03443651b449bd2d91f853c503bab4fb6780415533a79108019bb9b3cf2aa8a78b0da394b3d89d5d696adedd23b45511d43ecb5e0811b1ed8bc49877a3b25131efc98333f3996701185ddfcc6e118d7c1e11ad9ddb2c69da62dc2d8f7b9abbb40d1b86e32ffa43738a04d8fd720d5da8c1e47b8dfe64c6fe1befe4c4fa30f0206afd2886f785c9a6a5d4b5e16107098481649d182964c444b01ec7ec32214cd030a0ffc44c81368c3473b71e7fdad4a270b7c65b3ae835565fc7495b2908b99ff21b02caf19a86db4173eece344e11ae9d93f47f7473e7db617c875759fca40da3742c8ce98b770bc7ea073ba05ab6f09cb381946d80a651aa9b5d29bc0234cf31ea412ddf18fcdcf5ab93c27f1028a2ff964f9ba6376ebfa5bfb4b4d97fcb28e1ed2f8e657f18137b57f98da1847f34ae788b7a7b4c414a1aaca72d8b704319805ed5e53e3ca38d0dddfe805cb9e8ac882aadd1a7c43fe867acc07244a2e1db61da677af22b9ab9c1f72fcc40ed16189c185d4d51e6c31149346cfbd77d4389875ff6ff8fc788963ac8b247795dc61d9d7c8b0553fd5fdbd9f8ef707c89be07b0975f01f6ea6760b2f6485dc697aacda2075a9c5bdf7d50d2365c864ec04d0b8e7edbc64a9e3b622d04d8b98e892b33bc340bd76da2d92a53ac37abd2aeb901397d7ec663dd4553f41962fc83636d78e3c800b129b06178676ddfd562f1c6b5bb684e49d79441554433f7aebffacdee34eaca5105ef54eedde5df810c1d1c88582839c89fc5fecf8504402292859ac02d94ada9793e85327ae858f33e7e6ac8b3731573d7b17b5d7657edf5b218a136cca70e51e33e6abcefb4717821f34f9ab2614c1a248c683446636315d8fe181a4e6ecafe85e20f63ec1fbf29e8303898a12b6bfba2e36b74271e52742aaaf324199c93e89ee8fee59dac0d55060062f7774e0fcab5019f0666521048f2280a4d83991ecc7480451958145be5c95e7167d3333d5ecf4b49186bf5b47e974aff053bdfcadace732e92d31a7fb288075ed1a172fe349a2afb8aeba5eb64fbc9bf7ff9bb964307991a16695cd6f61c42ae28b9f7debe0eacd0dbd925ffc682bfd2bc48d1c0f0d24f5c7d8813579e6436448d079557366acd3e2e54cc5f9ff5d06f735fd6768348026899284ee7e7f82668d39b4cea055abe6c566088552b33f6d00f2a01c710b610cb2c5c1408e2b83d9be77a0b5fa8fdf0f5cd97861343a82360939e8211ed00c9d7309dcb3e3e5509ac42542f44d7b74cb42519d68fc9e2a0bf5e00b2272da97e40d6027c9ac1a51d24b44007e5ca63df7858924ea426bc1d28d67196484a38bba8115bcf4aa5b725b221185f339fbce77397b51d52c00b8c08938cae829651c9a43fb7eb30731bdec112132ff638031a5cb8807936de9476479550d6f6e07f8f19dbb4796e8be440462c12aaf923cd108b4246d94a4f336946ea60a4187caac1200aa30f48bae64f26530993a8fc987a1bea2f294bd1918f668b85474bb29deb7574c71dee14c79ce78073e50e73717b2ef533669db98c491bde579a0321c34c45205fc8d08fbc37628c84c272de284db8656d97c17cd010b0910802791c20a8a4304647a9cb4043a6fcc7215abd9c843597efd11de294e39c73aa639d73dfe364882d4180705c4802180d6405fafb021ffb56218299acedcded917887660610f35d0acfa86d2c23ae0ef06fe7151073b2b663da2fac1c9f38f6346d77e575aaff9caaa8cef5ae56348ad18e34ea684412b1c814dc4c1378f3b5bb13fbcf64b2b6c71e3447f1c31d3d14491423fc4ff183c0cfcc09fe078592056ad4585f2491b51d2aa691acb88c3fb9b04f9fdaf1a6a05498c43b296b3b477834cc13b835305f391cd7b9ce39dac90e3ada0972bb316f3e49b157220b65be4b384e96fbff91b59d9e843484608b7af47ef7d3c7e677b0ebff5fc904982ad7cae998cf97eff65b338e188490861872118800f20d5f8e9b43e9f65563b8812a3ff896d36e0fd2a9c9f5936bb7f2f52ffffe324da11d9ceac83a9266ea9dcbddbd7c7ac9aebb81120b92da4f3cfb0bef43d676fbcae5bc3c597d211ecd9a23dc1f8e2d5c9157faa0c48fbfa92f406ea9dc0eb554e163e7606e030682104020729168837aa5dfb090b474a7d8c4dbf3fdeb79c7383c31b04c1feb74c738e434a7b14635a337f7ff895e2a5cfeb51a087fb2960bbc49e899509dece9236bbb06c9cedfd4fa204131703ae0a75ff120b9704a3ab29fbe2f3f3d59db953c2b47c815280c4b1076934b1203c06f568fbf5f271cd3aa3b3296852e66b34b398defdb8c105556ea342c7e1d24a26c4bb8aceded191f6e55fec230a32a6b7b8bb7c1a72e67784175cced11ed209af90b9e3fd8fbdb018f2a302804250df029e9fdb5c48a656da7f5656ae743968cc341e42d2cf964158d8832b5b74ffaf58e64dd5c99ede7fdf2870ebb4bb1b8209357b0bfa6dfd3fd083c685ae9f546fe0bb2b647ce7cb8ea04784edfc6a014952180217c23fe8a40818ecbfa0007393898bb97ac3e461f61a7eef10de0e35735d59a656e25e60a58e5e57afec8fd6ad81b5fb503893d890d616d6fef0e4fc8f5e68bb73bcdba7854e7bbc53426e6285c82290ee693f63e09c21e1d0a391d5640eca07986e127d13104fe78117dfacefe32a3f83551829cb550c4165d7b23327fedc631721c723a667502c05b8484d96fa7cd69fcae5dc5f8fc29438b2275c26b679fc5f6f2e4b5d31786fc2824663f01dad7dbab73f0a7f0da83d1e6e9d58520094cb64e76886180ed07494377f4a83ee6f36c410d816a91fdb645e84ee23b4154f5b3d22b5e312b02d8ae563dfa0ed010979374053e926f2d67e54bef2296dc57f9b6992acb7f1c8538c4cf6a552eda5e8320fc2c0371fe5a5fd8320ba1f0339c809f6787a087f97acd2976d1768f2c41a9c529e89719f8795faad8a795dfd77988efd8018b7e8024f92617a5ad036d26b21bb687b10f6bbc67c8351a9e500dfa7ef325c999a6ca1f2bc7e5207f928329bed72b3d69b27af236f9f9b45744196f6a79dabb319d297489ef91d1642cb0ed707b938f6650bd424a25a4e7abb7bdb96291fb0c0df164c6ef5d964acda18583d184c8c987ee9889b23971748b6f73cb1eef24c602030da4a9e605b6f3a4aa77deff5e8fefcf1e4139df01328cb10c23a9f8ae1048e3b476b4bfbadb76f1d2e2e22d120a21bd3add5a18c2496203bd697b1f148a67416bffb7e32707309a1dbe5dbd074ffcd693695865ab9e1994218735a8b9ceb63771d54b09a00d5b3c76e4c34c752c36e676aea9282fe282e1c8d031b7c314593085a80f3d1e2c9f5fc5111525d9885b42c8e2eceb1f632f460e5a35ad4bbffe05fe5efb19c0fb548dd6b77cb6417b06fbb6073d6ee38be8ed615e3948104a8fa04ab9cdb9f1b4eb8b9286e0d7128d6b5037c17066964c434a63552db80c9c6bf80a68eff2d825ff0c001bf5f878753811d3d38887d78fe19b5d9c571c0ad67b052e3fe1f7f696adc8f47b892bd8fb6ebab99bb815379c18382c2fd3982a06b6c710f50f87d584faa0e9cb30b9509425ee04ee4d480f0c65acc58ab861b1f437f26796975cfd79f7550106afe81354779f79aea77880eba5ac4bf975ea2df94fa310be75387a2589a670e83f311ca68934bc652965c595146e682e9dd653e7c0d5c46c1ebf3bb8d4750740c89b4d16e257ae1ec38838f585f8403b2d35cc06ea27c510a410506d35bda151809e94e1ce3f3ea0f30be2026904523b5e564b8221ee396533a14019eec4924af2c3acb48293d2aeb9d01e0a15ce21adfb9c01def1690e5a19eef36935e169a7d04d4fc2cef2d3fb0f0fc9a7248bf2036f01e3b18a2ea7732432624d4d098a1f1bf4b2232c71262da4dac1d95a298747ed70ff00d77afe8e890e6ba525143b5f60bd6cda4dbe20ee04db3040d54521f37b29dbda0c11ecf13022a7b5cd24c248e9b1d14a4eb75cc94f49b2af5c737273f999639d8a19d9669fada6fd0a6954a2d1d735b6e8e61670eca128f1a67fd3fd7f9703602fc1e5208b32a02442b67edfcdb72d6549d3e0f2857bea6e12df77f4b92114a9e08a08e6c7caa6b5a7308f38a206e2f2163d8d42de92ecac71b76fe0e263e16aaff0332908274d10e5e66a15d6d24ae76e5a58b140abd2ae3e0df0e24b9c230d0e50744c047bc14185d0ce60340058ac55a25c0684747f701ce9e07851ac83281242f4708c7abaa0021bda87066d4f12f9ba6abb8ee065114f72b7c1ef80b9f687cd5610ae867138c91de22c3f92060fb9a363e4d77a3b00811f95297ca65f747283d1a3e4fe1ca698296f1b60a5a30c0228b9273e53ec506ef322e6bd7c348f923b9285538914bbc4217197a885399bb447e6772130240b194f1bb8de11a722a21714baf22760b5c2e9ee224091c7b87a74fa9f6f5edf63d0e07fd9d812aaaca46803518db06d6094b16bb27fb840d1eb5b0666ba0dbcdca74f6eb2cfeeb28583c8cd61527878b96fb1b33db06c1c1eb2e9867236c74e5af7bd38e073af6241cd2fcd8de2e5be8501c80ccf246cba85d7268c770d8f52d55473a76bab33f02f6a28e6e169ee4a94680907200f7ce00a2c39f53d0fa2b6c3c0459709080302f122d3b27c3518c8098c296c39396d0134fe23e566fa48e713e9c9d627b34bfa0303cc88e6727983cc0d31a0fdafaae83ed4e3fd31474b33a817961b63770ce4dc211904126cbc96bfcddbbc7ba4f0af2a0d054b35dd93bf3f00fcf2c9cb68adc68fb0de84eb8275606a1dc7bc65bc649a50a82720abf79da99d9e61e349846f962e5f4346e7eeb31da1e9f9f9e4cc0f67264caf1478567f36e6db3912e27651b2e6482b2bc4f3728fc264e9785cc4c63dd71bf886eef067521c84bc2163ad95646ee83e47a032a9393b6ba176f42b7c399ed0a37b17aeb60ddcd460237480065b0243a708f3e791cc7b56961a39cebddc3ca7d6295f38fea7ec73cec4963c7bd3b15a9674abe8b676fb41a50f62c0b880bab708635c5638baa83cebd2a718c578922e5afe6291f2ac97790b0c4e28fbcabaa6a15bf52027e42b97c25a7d3b362191941dd64591b3e9de6b529eaf5e03dcd0f1468cfe9d5cc7366ebd8d129beec819b3d4d52bfd03d0ec5e80b39402b0e93e2e7fc8fa67715a64dc44a79cd00b84dfbe1468344cf7e751abe88499aaab4591b20794938df53d1ec8bce69383530476812542e18a8e39bf003186503748632cd92695bca27307be8b3a759e3b3d7a77e3a7a5cedeaad99f5509c4c8733dc3e8efc2f3dc4b9ca7796ec0ecd1f78357dcdf3ee9196a7be515626b92d007f0b06bcad0422a8f5c79a42618cd7dc5624b4030dabd74293fd6685e2a882470bd6de0ab4ee462ec5277d9180d1a58105463a3edc6ebade1ca6fac9fad21fef052dd49a5caa64693fa2384635524f20c83d78e10d35c3d9a07b0acce2f1bbafb07a67309cce6ee7c41182041c11927e1139510dc232060a31a7b12758436461e177145f02146b886481dd1f230fb1c15e31be1c0f3d44d99da104b0388ad2cfdbda97696c1d8a83dda19b8ecd68217be03ffca9124e83c8e57b1914418fd0f32a277139372f064adc32ebd428c09aad13144f801b3cf9c4c1383c5378900346a5611c8a6ca3a06ac1e53804c3e1d9dc0d046a03c467b44c781d20d2505cf8800d5fde4563a7a9ea4d04aa41d3dd52027f0728e4a7387873786ece632724568eb52f4527fdb274e3b05da30cdfed4de881f25bc450ea676122cb7daa41a20d20df02bc4fdb285d34c3b29ae91619c87467cf044908bb998657f7f8a181d76e7c9c9b309498154b12c58828d4d52cafe4f20db26fa741e98de417de6ba7598fdbdf6be76d3352096664352a074f1e63dc540ddc0561280bea515b4280d8881901122880d70b67fc0ca0836cdf0194fc4bb50667ce0c480ca0e357433e9cc11ce40401b9265ad7bab48aeb4f1409a9822468cb58afda74d75b61f0856aa4e80cf146662f30603c70508d3c4422e45a941d285de9e6e171eb9fa1ea48741ff664ce084bfa8117e20054785d955eab450b436c86c9d94f03f92b437cef7564dd1f0c6eb4458bc2b7e367a74d6e2a40b06d34efc623bc8e24e441dcdfcd7f4da4189a1dc410412950448afb30331695850dec52135428242488cfbeb20057b85dd07dd6f901c9178ce642b069cbe8e75dcbb06a3ca18fe648860079dcad6e684f7da24f7f9e715c68d71021d4ffe594d620701a5ff473b4b2932ce578d35e2f6fbaa00ba01a33efccf4aaa52cf1ab068ae853ea13503c092cbc86d6c140b782605c31d0a472b856b0966acc4870c710f1c447d0e08b2f7850b790ba11204b663b293b9ddb39b15f4ebeef900cb61149ba1713d8ab60cfc0b453aba10864900fa617ef09009ac183ea8ac58466c99f7c77d13b09d9b10db55e9c12b660095b1323ade78d7cc280b27c3632493debf597ac7709fafd98958ba1ea2d13b6c4a6be4561cb32a78d40d2fc3f0572a4f505a78194e8e81248e88658aef313537939d7960be1d62c285fe1e68b3b2821e09d52068d5d8180f49deb8ba671b285e793c7e68cd3dcc427eafc03d31814705bb6c2066f14ea1f078caa6109e17002aeb69ae956d01cca06497802aed63f6502cf895981d8b968b2b8c06660c110fd87416422030d1c5f634f29c36ef205a83b696ea265295bfa7ab9404b85524e7eb0efee523a95f10a69dcc3502641a31eb8a425b2ac48de2d248d7c245a73d1b52a247ae22a46fae0aa47af1684e2018fc7cf3667f5425da0098312e7249d246514d96256c973c6f5b8af51153910b5ca1dd34cd88452520a12e205351e182ba6d43b807445152cec9c8f6a0bf3b8ca9117169b807e7336c17c82f353e22efecb86c902a1ec7bcfd257a6bd6810a1fa9b8a24514ce53ecffde6f4a48dd254468ed5f38ba590e16be163f84eabd971bfffe15a39fcfac3b5a1cf4fd1f2016c8ac30f3e208552d508fb9c204e9a23b00c1837814598e727d8e7048ecd304cfff87bc4a9f106a2525acccb752a0eea2ce2d8b0dd53499a312792f90efdf8bc2553b024fc7be1d89ac7521a32f13413ebcdac400cec8be999229eeb595969a7e2d23e634ad5385ae04488dca1f78bc97ccd45225c7092481dd8cdb604ada69e4f14a9be6dfd77dbcfb18f4325bf2dfadf79dc4ec198323edb3251a0dd95b6e31d9fc9f71a6785f856dabb42d6d856e2d9b497d09263cacfaa3b3a538d44ef9d3b2a085b77458c74b229941fa75cd90a0db18fe825cea24cf936c7ed5fe96a8cf89263a6a16338be52ec4b9e5fb07b2274acc28d0d52369ee38c1517a1e4060419fcf82c9696a96da08fad6286d9452fd4c8a3c2d9bbc3d43da4914acbe49d50f3990e97d75289934d414924a5031587d636833200015eace228559a6298399a7ae85cd48107532a08c3b72d04b34314d49f148036249331f57c634dd2532fe3962cfcb304ddc60de27b3da92276456a2500f34aab642164a2ec768c9d932b10014d7f90acb07dd34a5c99fd7a2a982914756ad6063e535295d1a3b8e9483a9dcee00e38ac183f1958f6a8073118becc7d4e0327b40e1da4009abe0bf18358410e3822dc96ae51416b636f9891f85d580292852997ef3374626cf0538791e20931b5d1d9fc022b2d6ea8ee593f4165f848fe107678c97ac5203aa93bd2db642ccdd1c26a7ca6b711e4b56be2944a0e752a267b0aa013e29074dd13652e236967c37cf7b14550d86cad3c12f9f03b2cd95ae0b464df211d6e523c2bb789327b23125b9085a4dc4bcea06ab9cee3a89fdde96ead8ed4e539e99903b2d7fdaed23ec867984a09780d354448873c24b07259755c94a66825c39955c0e1c9bacecaf2c17fb1536b8993717ad7e726f120eae92116188163d4d1e2159a085eafb354e78e3dcbc86930aa89cc26ca1c174f4e3fbb292658c379621832c7fa8a4c0b4c4f6c40442d76a87bdadddb5c2de95cf620d18ec240cda29b5fa16dca8f077021742fae4770164ad4af0f6f0fd1459902e2a021f1a81ff73ff08b4849876604fff6eb0d060a331435125a1813f1de4de3f3289df3fb28b2a32c17fbc34d4a7c114f86fb00092401244a6b1b48bfaefb28c755c9c39be43e44ab147a1928b1e053386a164726064151694208ab48009a1ca1a4fdcdd7171176f6b3b9a03e7a65e2508971a5bbf13a7cc4dc7aac3690cfdf872b3237a7398fd165bc7fde6ec0cdc309b0c82c8b9e7b81f8e391b1dfc0df47d080e311cd08a21d151ac5dfee8aa50385c942b4605eb9c46a131ce6f21c03d9f4f0ba0935ea9f508a8a211f7a0576ae9e0a3c014c363cee286acd63c03007756c016aeff343fc45c45f96ba02ac9bc0cddecc48fd89b640efeb82a45216d5720cad26fb24e1c8c9db2f223cfd96b62fc05a53abf2530b02960286290e50b2317d6cd1810177e08f1ba495336e616b520fb1a64e0fa1820672e9f3b6fe6dcc8520d0344323d0f3eddca5cd9f95a07e2cd491eab1fefe2a50b864812a49645a80facdd10a1c85f6d15e6cdec80ed207a29519e4069640e7e3ff7147266a7b037f57e325a7146e71fd07f5146eefed28ba71429a2eadae0ed0044a62d73f76ba83345a3d83c5a5da5231fb8b912dadf29be01acecf3a6b8d700e92a0d1b20a08df00e07085b7380705e0788133ef8bc459f296ca5ca5e6a3c12f8792ca80ee193817d563b79647e6ca541a71477767436f0e15a2eb4c05672453c6f46101589564369e9f8f5fbe925bc6d1fee34957a0ce50cfa1f3a492fcaede66aa7563cc178cc41f4059758d2fc19bdec8e2b831068a54a276df4f2bfa4d71fde55a36a1e962f70d151c5aecd4414c45bd3f2327a56df18d3b50428e4bb7bcd72f22de3112ecf9c99054ac58d03267a747821b580bca8a6529854359e65be81bca01e6435696788b523a1763a542d7e5ba0229bf90076334e471a93d42acafa0de680c36a09af553408973b2a68fbb73dfd99d2e3afc4566cf8bacb0c0445614d57d21c4151e0e3361085fc013e85d42d00fbd4a068298e92f84b4da3bf8d41a1ca43b24ecc524511b3314c98df928c5463a51545a0f12b8ab0f9868b8445d19fa7862757ddd4671a29de164545fcc817cd61b81172d9c365c8289a4ea3352f10f20d3a8544d6fed930780705ec53bf2034e2e82f8aebbea14419daafd237d80a91bcca3a0265077653053b3d7f958f46b1d84ca929cd36e296dddc2d28200cf698dae6a08b1027709a4e20dce1a9cfc4c853676800e5817be96e8a4462f799364355a018b01b90407997e9101fb24468780c775a20fdc2385bedaf08a563e60c3cef3aba77e74bc1a06924865cadb99488b25588e3c4a3222b55d0768ddbe4b467e0926bbfc1b312e2338202d817abfab41e59a1467cffe9b210964b7c9ed382f803d0ca39eb820b2d5e4402998ada0cc72f842327472ee2f43ad942fac38d590b3b3826b322ff62b856a70c04baa944c210211476cca6ceb25830bacb3e8a8a0643338d8a7b4d23fba946516d0ad39d10d529ad63854aa2416e648ae2eeaf5ff2a6faa54eb5b629de20d2ef1c28ea2bf2cb4b1d0295a42a12581654f8d6353a5605470aaf31b5f7f28dcc09c187be83c1fe18f31150ecf087a472a82ca95189cb149b3147b593e042271809c5421ee943263360c1dd0f11425225f1a556cc3b4447b9fd743ec61bf7774f662b5827c4e9f62fc70c12097b2aa1bd4948b506340be94b2731770405ef437425954a7c6204365cb906fad73ce36acf9c892e82bdaf6d395efa30051d1f694b3750e7818f8742429b40813299ab3c922a37894ffd5080c176b2f3b16a8b1df63fb99334c63781f3379064f1d56164f5b67b997bff650803095f41ab865fc6dd26847fc074c034dddfcfc699ee988b6facca19a1ed0b8807186b7ca78ce38fcbaf6ea6ff038db465e8878053d8b0480c2e4927042958222a85b7efd6e4aa54205b01ffad825153464d166da53429a051474a0ffd51f5a41257e98225f8cc64d34bc7610eea1cd6e9fa61b3f1557bd29a481ef06c043c37d36664d16c3f3fbc6137b430eb83202cef633b01ad7c62ba029fae0ab4507ee130289606252d80738401a3207d2c1c02be66dd8115c9fb5067185639192dbae47929bbe53007a28b64e6c4d91ca8f7fcf02caf8ae0853d96a94518bd24488ef74830e813525e9d466d29945d29155883573379595cdfdf4951e49bd113dd20af75a84d179ceebba35e621e0e5916b3cf9190d2070b692daf9a78499f65c75a3dd4f87345ed153256d7d29e1552739b6543661adb58f51e883cbf65513c3e2c1ae0cfe813e76c4546024cc78807714c50d6a5aaef12c317900e4acc0d0fcc46466c17fd8ec83e86409bb4436c84692022f3f925561326421c3fe14ea10b9a913e463c50448b78a048e176a088c1ed405d648a7ff06f660b915db773afe322e1357e1fa6fff7383449edae15bd129be92da1d28060a4622ef5d6615e984501246e7f1ea7ec60b17be7a8a7000df410c588c6348a59ef7c2815da80bad282e1deefdb928c617360be1e79127ddaccb7f772cda82c73b9f8c72cc9a6b2641014dc80e42f88d872824c3390c54c59cf8f5623dd096122713227dcba4d7fd2e2378564b71434a196439849c66c09b1669a6c0acc27e819187db47b5ebd355051a62e1ce0cf0d89632e9d5c4d632228af742e89c914904e32091db19f6fc025c3242cba8041e4613bd119a4fbcdb935eca41469411895f20661921d8c334484559125c5ada4871b2bfe1a11803a4158af66e84d16f34bc457212b3b6026fcdc4fb314850625930e00c341086ee4e14d2db124ccdd192505b4db5531fd200baee20fee18d6e0c767c10a373e01045638bfc07e1082a83e3629c3c40f7920623edb030b7f100ebb7e4cc51c118402df6d68c05ad112e3d9246936f8246bc3eac974954fe4e54d32a88195016e58f1d3ee0ddc5dbd078c2ee86eca6486542effc975d0cb031fa7119497427bb3026d82b4ef4fac46e2fc1b0d7849212a2ec14820c08d4087a88ddc61c33f083a9e7509e159fcbd66b1a4a3a6ed09aa08c7e08fe672d57b8ecc2b6729a823fc07ab80a474011b734e0bec2d86e09331f884d194ac6404327e72aaa8c4c2d14cbf5185ab8e13e16eb13212c87634d6a3172675fc89ca2622eb0b234eaac0df725b4d8c666a0d13de9e47ae451255eb0397ccca70072c6e46ad75ff7e0c824504ba7b8260f305db03d6c92e791ec4454e4b5153dababd14fce0d531ed9027b65fd169437b641f4bd9e5ca111542cf371208d0e7bdcad9856844a25a81e9a3f1bc850d86b7afcce2c17af3eaa7091997e7fc2607b222269768fb610d75edd0a51731bbd9fefc47a451bf3ba08889aecae62dbe8fb8424a309412b4ebead5b912c01f111de941227e460f8928c9d057b2d3b1baafeba8b0896a36240120f559d4880161695e33adecc6166394132c0aa2177aa4605945f0fb3faec5cb3fa1bd14a59c7bf5d56e0a1cbf7c3a77cc3eb69198c5f57c0594b6808231f9fbbe8857df892346c56f4725d00e2bdba04dc57b559e1da5c6f12c33aa7205dde2aae002a2f2ab4f5b2f4e30c8070ad5cc06c4c84c1990e584feae8a83b476b784a8731df95d349c39ca3a5041b2b77a8235b78662857987f6f7def9730c29c8030ad956758f443e329fd9d7bbe4b0b85b87b056b367bea1679ab6f53113a34c5d87f7680d7a30585b32523466be6e60bfdf7342edd94d9d94d713734e6636dfd328e5eb4a5ecc69c19056914978bf7223ed202ba7c6539de2a4c953533f11d9b00a616f44b7fd2877519e6a9d7dc379b3736812d7f753b2ad47f965a0f3812cf18447f88b7c56841d7e2974116281bf2a8002cd9d824981439c3ad129f514d94ae3f7e9cae9a54322e33b8e0a242aa8c19e7b86a19a7604cd9267c36008f2e54a8273336250d249146051c5c92ded448fa1ce69292d954b01298da7d0ca91e3a5c75d28f8b6063787c29fcb2de08da415eacfe68c2b134893df67e9f2ef28ec3e9faf6c0e937ee64a643bc43ff6258367654acd334904e779562493cf2fecd70ae43e0068f1d5c4b7a89381c74517a4c9770f9c8b3a2fa7a06a2d42b7490459e42db0f9891709a8711430d271caf3cd810be027549e7a9be0e4816facb834a8a66b58f2e3a8390c5e7d88e1f91c8adb061d4574ca987704e1d649c1567102c2f1d01e1ef8802f4b924daca1eadb8bb354cbe159f14c87286beebca0567bfde56b934addb0289bc4d7380e56c20c5dfc6e5b5857816beb7eb39963d9a6dd4ba5867e902b02feb9f11928460cb742cf81f83a0ea867c865c7b332d174521eed26e60e932612c7c4a59fa3c86b3bd8583b1bb72dabd0d0a9f80e1d5a2e91f846d1113428171d81e985245833ca00f734560a2a855e7b5ed154e1bb1850b9b1f4541d6b7dc19d50a256330f71b7f1ef48819f198bffa8c0436ae9d36d0f79307e8d1efb9334e1cf3fdca42d537f38369f59d61c7fbdae934b7dec7f1b500f4293e97d5a512029a41e1e8e5455b1c059e41a39dce83652c24410820d6aba8f6c52ea2d5f52d5078a2b7c8a81549ff363cdd11f6335d3ffc11f6fd00e4d22975e99008bed925302ac609a6b09a041a1a8c17f937f3f84a88b8a5e20f991bc7f2c44702d0c9139068ddd9bf6ac31bc787e7c4b936b9ac811fba9df1395d91b33a65357c960b9e9832367a622bfb72b50f1e11a9997faf931bcd8a33d62ef07573353d0f0c48e60ab01d6289154b3cb25920522a5f8576dbd7a1af8ca495e48326558981819950fae54f52d54be206fa687517149816c42599b622c270c31e9993d3483814e93c619be8809ab2e10ed2966ef84635ac9db9aa2caa790e322f6da00f6e43d7b63e7fc76020a268e61cab6f59bd2ad960384c83416ffa78978a21afab34280c80fe911017ed30076984c5e2388cbe99c17b31db00501d2df6a555fc5b992b1a60d9453521c0eadcf184376a9165aa789040bafa4fbb19a9146b7cbe234d0b7207c136621fd20c246fa95c825309025922b52fe9382a10baada47b886f53201498364b9180896ed244d2cdd505d682f1409365d695f92d1ae1f9b7975a2e472741c764ffed95485253d39e6c3eba11d8544d0b111c7247b42a393669972c9c03aee7ff64b411d851fca329b033dc6609b5a0f22ee017210cb64296bd2a9d6f56fe5cd78f4818e17782bea833164c0126377d4c28f8c911d5ae3780f5fa5bde6f0081aa1d6bf2e81ee17396391dcf4196a1dcb18be1bada34bad1b99322ee791139a2883574f7bc00f10729bfe59543385aaecf7c0236fb1e46e6f9fedcb9783b5f53bc3f8bcfe1cacdc4fd0531621f73db7e08a11bac0bad49e7446523442742e92963645c6e5c3213a0844a5f14f9698abdb316717ed32e11a3e420301c9c9fcd0b6a1a36728a86c62fe6cd0060c4774823e2057322067e427a5f458ea7cb0fd2cb291011cc26dde4df904863891e1652c5c78d212211d9da0b0a4424155063a88ce9eeb425bb3ba84444d1d8f0f54fad49e547952fef3e023d1d5cb4585edfd80fd5cc65f0d514660c786116033eeb4f7d59c6be90565681cfaae2edfb73423e6b8c4a0080730dce35aefa7fd6ac41651f550ee235216b7757217a08eea143f52ce9876880a67b9d197ecc511732cdd2eb089d60e8d55b75bb4a7abda36187ad9ec6616053de6c76ce654c2492b09c0fca085a90caa747dc4f6b918ab4264b98c0ac128bece8d71d19916f1d07b49fc477aebe0454c94485aab4230022bb24c5a61561ce32b36c085068b3380e6a3b9b270b39eab5461714e077e40d2692d1c28f6bff805c7705d496c1b9115284c356fce6425cf3822477502f2942a1de70009473a1c50df0e092bc7fab923c06c1bfcf8490db11702c0f71328b1cb3a16ae8b8302e888ebf3136edb11bc662092322e5434d00758f7c7d8931275363446123e0aeb41dabb95f8b4ac2203f78ed8fb79bc254d07cbcfd080b8908152befac56e3ecbf63790628e0530c2abf1237a84ffd1449d216cacac77f7361ee55239aa366c42d81855120c05fb820002e600bc08caf381cae5db18dcc1199aa04f66e0fed980c4f06be559f1889a6309a89ae1dcbeda17acdd7011b9a3e09f6eeb652594882b8dca1a65bd511dcba8f3252bc71803c79d7839709b9208a049e7491c621eac1945dd898ca9e0ccd283641b5c16d3e359c85c78c0a67312f7461f9ea9db57578f2149995a8f81780a8476c6a5d7cb3cdf80ecb1bf8a3de1d3dab18e64b90f9342ca3d8698f7bbf7e141d7eb548c089774bc594f49da86b953a83644df7b16b7124b8f4d215fc6c21068cc579846bf6e4c024435aa44c7f48e256deffda586f5c0771f49591191081d5dc221b037a4fe7d3bb9b16b417f3c2b7763d0c80eae69f0b243d2a9d388cfe26c7c4959d75a784f75182d41db2ee589a16488fbb06c4f7df5a6b95e854abb9e41ea978ba28a035a9b448b29e458277ea6d0c124c58dc473db3c5705a51a297a6b4507647d329914870cf5270cf4da953fe8ec0e6dca309a8828571b5dda40beb265a030c4a2b862670ac1bd480534c61edc692179aa46e8e61162ea208ebb1288fe0fdf7554388d055ba3e90c0bc66f311eeb1204ff602cd9379444c8b7cdfb8fccfe80f847f4ef0c34a305fd261a60ff8b7345b773800c3ad4084c47ac2680045a415298afbd7684f2102fd411c03060575ba471c9854a4a50ddf4696d700efa6b91c0773ede68b8e3e8aedd2958acc0df3cf005015d279df10aaf581f3596364e6b8b077e8e0756b9da0a221bf5eb526ba88c0341fbb11d5a6252802ad9f88cea1b588e8790a260c6bfe1c2a64b698e42d433d3e762628ed0a20873fa4ba8e8baf92afd6d0b62a7b4bb5c9cca3d488857ea42ab83dbb58fb9faaae866440b420f1df189962788d0d2ed9c052e6c16993f38d2f2e49c41449c4c0f8ab02ee8ae8501b5664fc93a7582a7caa2f5b3728fb07184780444823bed55e25cfbf15d42eec92056d6b30a04d061b3b5bb554b05d4db3dfa3691e0eeb08788047a287341faa5b83bd3de6508f4c4106462df3107105f8910c1ed0143bdf7825ee42f57bae72e5d8f3df17448505ff015eaa905103b022afa08dc7a86ff0c060947f75002e3578ddc3ba41a78d16bf98bd7e3d0844a94fb24b2e123129542f8c2d1fa7a4959fb2b567eaa370e7ea12ef4945d88147adbdc3530d67918077b78a230d6b9905a52eeab835833d21283027103def2d82dd3593c2479cab2b730d26ebf1a18aad9220fa41f681330eda45f6ab2881157451d8a42a5f8c8508ed2ee08c1eaebac40e488eab824945395ce77dc5c510e94e9ddcf2519c786c141a9ef7afd49577f5626ecf1a2f609b06f626899aa3a5ada6d61b970c36c3310461e8cc584f6128fd73289ead2ac2f8c58944ee6dee36b1552ab0b134cf8a79d149b862a6d8b5e4bde29d3ff97448cf59c50055d01523365e1f70c98c0a4a7046f564571cc6466f9b5d352c6a980e671db2b9e4a806f070cb20885ff819b4090d75607daf0647b134ff07502dfc3916729e1abf49af5356418c62813f02cf718daed1e3fac2981b3e3a5cd20bbf4b061e7ebf075670332bf905de2f296a755709d1485a99c02ce54f85061becc5b1ee3afb571ad3107ec56ab042b573121cfe99d26cc5425dd74498bf82d529b836cf932e81d36798cdfbe76f77fad0d87d0541339423f105dee00fb77560060ef0207dc0a523b304c9b1bd85325204a7cee64c3aff95d86684c7ee4f2d292a394e06acc90017daa06979a6a70c0b00ae4afa6fe180b10a447fa15969dd63a9777e2b383fb915ccc29e97019ac3cee0f417ea76090ae371b68e8f13cad67b43beecd3f7aecca6d5d9cdb05c109e066560f52047babc49fd99cf2406ad47a68ffebff0f5cc3432f83eb0ec044afd2bc63900bcb9a765abb7a96d27a02f0a51b533b9e0d6fa779076afc4541e2718bec61e2b020f5c94d07f9e65b5cf12be67b61538dee5f9d1889e3ef11f5ca2f421f589b8db5e57b8d8f43bb9238abecb38ae41870411ccfee300744a67eb509dbcc7dd0e5cd01ffd9f26819c7d74f332b0b7c5ae9887ac7fed43e8001f689219411800439003d371c0e86c63fe0d14f1661b5dee0fd824dbaf8381f764802bb26e0fa924b492b52a6aa352af651464604229245e34fd50120074e558cea98742935e18ec33d8567847e86f798d09f57c7647e22fc181df3d557f5e6642df8700fe4f0184c4311f100909b80231449fa1e5601aa6fbd50bf4f0ae3a73c64757e0e26746246bf90cd9e8cbcb44c31b0da0aee412a24e4ab324cf7fc545b0b1b55811db780736a24a552e6e59902d55569eaa85266a0f725cf68a54cc526ecfcd0076b7a101a302d3241b2451f9e42a556439a865729f3a518206199667ff1e5f2a33d9a43ba8f0aef71d15f34f6e066a27740bebe0b6d96245ed09a5b12f079864c9957b90804b5ced68e55d145b8e13764cad40b764857e1589f2195e87d54a30ac295c73c6233c7d710d0270912f657a93b8210c994752775a54fcb58cabcf9923dd2c949b6f7d720e5773775682a5070068f22282e1569273370d3bdcf1ae2936d1a3fa9827579bd3c9a2f04c7399b6d2b237f5a6858b368e3f41e2763cabf12990acbb1e88ffae5a040725b6da9b071c628253b94de858173152f2fc7350ec779bc0605e49333ac2b506ab84b7c4d3fc206f6d5e5ab11a7084c87ae73b2fe565300dc33f414e1bc7526a73940b08cc198f88b6a8626c07903343a174dc3795606472d1a777f0bf07933d8866d51ce611d8e82b99097a7db388373da22ba4138990c3162cdb5d9c7fd65080635af4ddffe8ec74de5650b443fc04d235de398108f84ec434f9ab58b53808c9f613ff2d4568103eeac16051c11c8d24b7ae21718bde8da3f74bb294cde90ee792a6a7a747ec5dc237c0151bc712b4d3fb8f0bcf3891d9f92e17c01e1d2830e894643d74f63f980d8188ceaa5e4205495cb081c20784250038d3bb29c3425f52d6a97bf6f3a1eb06c29d29056958d5c343d029f2a11191ec1b176608ce3d586c277566360ac177f27d53f8b110274b224034304a228511a8a0c0507761e8408108dea77389e921b6da1ff5495f0de1437a52cc54c5017694bbd5dee122923eb0f9158a79fa98e813888d5d93a1cf96280970dc0a0a23281fd668869474c666d8d0ee563aeb1cfc18bb7093b036041aa5fdd6d58e06c6646b9134f0f83f30696ce043476c30abbbde4078626ff4d16f791c98312435ac92e9e67f582d508fee173200669e8122850004f71201d2a7c87569b6535193ca9b3a7f544db6406b4e4790137647fcde63ff8b9fb0583c54b24264e2cf3d43161d3c89e3af38abcc4e2f1679db3d304b1686bf8a18dca7d8c497fe59ba5099f7ff7422d38818fe70af94851c20e493496635ae81d09a697b5c8d284c1a9a4b18292b2c92ad4f9c4491ee9e0adedd875e7387ed496140a782b383c1840d2f0de731464d9a783fac7fd7ea1fcc8280145bb7fe48cc72f01b3d8d6dc08141cf80b2949a227be67c058a9567a7a1adb76a93f04ecaac0152c1ca73b08d4845c05ebb7b2e0288198cc183f86b1722b3d134b407aa450a5216a945c6c72b144b7fcd4da7ae3374aebb5a359f12e5cee8e50a09955356adb322f3297cc530a495bc32bf212d7077cae954bf2efac123b5dec6b9bf82f4c77ce8663844b69deae29b05a6304b4b4706ada9faccc78828406b46eae43c87a0bfbca7df4f4e0870e89c9c546fede4973871e6230ff0eea6fc2e2937e3c1f78225cce18583c1d9eb796eb0e425f1b305dcbea84999e3c6c929e87df2d98e457397849937783c414ccedb489f71990775515ad7e96a9eafdf57846a4006020d570fbcc060190cb2a9603490f7f1a7a22246e334fc0090ea2cfcc97aa15e5c69ba095b341b9d3f0ad57ab2d8e8bcf20380093684e008cc6466f616fc2967c726184a995896c5dd5e4302658359b81385bb7732a0fd6acb3b6b505c71b0d9c5e0dfd0faac54bad7df93ff4221842d1aa94cdf7660263c6f305ee8cc19bfcb744424305dc9297ed737d245c2be8f2480c7f6955e19a77216f402b5613ff511b4a21763f1249c36b605eb5778ea349068a10923807f23519d45ed1b236bc3c923074c041030ab64106b4f7c5687348b7870c737b709261994cdb4d84707063c49bd4f1116b3f4ebda165f49635a2d7978e0c42483b1b220aa7cfff5e41bb15eaec5e61b1267d80715befd1643e678e42ea100fa1b708dfcf1958fcb5319aff9f49aebef4fe9c1aef604180e5e747fa4f36a547ff1950c135eeacb4fb60204663696eef9c49f79de64e3c41557f150dc4c08efa2bbb8fde72257c08f1bb3053b9e1b98d6639faddf3704b810495fcf12dc028801aa66e496c92f6ac6354f90f8cecd7ba21f347657613a0d48104a9e04ac4805e5f6bfc773e4c4bd2cd16acaf3ab40813d3c3d22fa4ea6fa841258ab38747a2bdc85776c9172a501b51f657fce9afacc869103f67f2d5ac69aa1c66ca1eb6274a1d633bfe6ade41e92a1a4254a797480ea0410c1875dcd614a908610a19a5ef9822c785eafa899ec5ccd9f1806461b3dea290a1343874add7906641fae086b3a8c54e7338aabc21e9bd8dbc687ad960712231a09afd822431ef22914fe6e38e4c605a8ca27df0c87c80af5deb95d0ef8d74854d0187e703d78f7cc5b1c0eec3461c5ebb7df45e0b03af0ed95edab7267255a0e38243b2da4581e2b8423e2b0cf4280a018fa4d19f43b3289a84c159c1233e88863af2ae4ac769a2063d72bdbee7ffc4683a10e4133a1a083b0456220775a55fc75fa899ab9578fcea21c3a44f15587543a3d1fd9dbb9be5db7e9144097222ce80b83602c5cbe362faf6aba03b5fede54308a5089928451bda0d40b3d8650ac9612a777db0d2dd29a475e051e92c21ed981002e82c69b2da55996986c6bef7a51dfadc144a2fa0ca7ec66f157146c95f1a80737db0f6c8bea9c2416d2fb657b08254f5dc0109f01245b2363a379af36a45cc8b6af51a6190b6c91077a494d0c2075928e45f8b2ac2fc008e03e92d0b04bbd1a03a9023051496897d862ca20f5e20baa935d523c8cbdcc3e140ea10a5226405099ad7337cb259b889653b93d09400412f70858d8a2d0c83c49402fc06098f371cec59db15525fa8f393945884f6ccbd7f9102afcc8f5e506290f8fb6924c42ffc7d43f968e35f34d03e804891b6465786711317e937646dd713a9faaf4fad7772a1406f7f609c9c11c3c46270500d3d3dae5ea87519679c4170290d79a398448c754af81ee7d5254281c42e6d8a7e84d7fcf40384659054e6a4469ed50057a214503e54afa1d0ff0e7e9718baf3e5e38fdce03095d2a54fb96cc67c52dc76af646dae82260be931ccc738574574c33f694ad2913cb06c46dffdafe2f1c2c8bcff5d75c7859f9f2e8d4d13f196ca8dfea59dc025b5f54a6dd2af9bc1e947e70cff92e28c229c7b4902d09330b3e7ca56ce136bc275a74f9fce9c7d5c27b49635912c980d62a089d89df3f48984a433dcabccfffd564f087d8e211151c5e12240c0f6886c101d298c5f6b245b120b173fc1e6cf9033dfe02d380d2be0dda3ef6b7975d1f094bf15740a99c8d7d85edff0f8fbbb0a976daf26488d4738097af008caa1efeb73be0d8ac9918571ed46308457c0a715586cd3460fe4170b95b14d65ff301593977ca26aac07fd1f7553a6dc7c70046231c6a4111930ced2132c7afff8c8be894a2ba91ea3d587b51bf5d23135a9c9fda0f0fd4f9b00971a2c13b1cda6e28b0f7f413d96369bfbddb1cac6f458e4f50413a9f1d7005aa403684ebc5f93232f6721eedc5245e479e873a6566ff37e77c64b4d3651f4e6632a782e1e126b9233d4ea21cda3caea00434700f533bde2fd006c56142e3d89e28e287562a9c71087b4179a45e149a7f38a42b7e01551d61b6b276a7d059e5ed19523c7ecfa5516a957f065f355c2781d588702507cf25ca59ec25b00debb9273c37280aeae1aeacc6bd69375b99c59ce8232fee2a8f2400b16c1f43d63a6031a5298fbcff898e50d89e379938136695f7d4e4cfdd2a4fcf1c0cbafd2735265b4336254786071932b6c5ea307b7e79a942fce175a23fa14076f571b78118eba68c3470b5e0152ad10e63a776ea291f88af7cee6cf36f7df711a4362f5af6cb2da4cee6ef0dc609e17e83a9e72191fa2d01f05d5b4631058e888ed2b658c899195b67afd8d1184fa0284d9793ca80e4c83b5b381c5021ace9fc7f649fd5128d8bad98093ac5142fa4bc7e5c64e72c11fb446ad6ccf434512788b5b865253208af09805b9490b0dce994391499ef59137c74441ad2674cdc4f4508786e71deefb84e6013e5018cdd00c39cc8fdb34afe89417b8bdf52857c2ab662cb268640754834bcb3c431175bd2142cbb9400b4a16c1fffac3e5d1441334904dec405f42deb570d289200910e016db5aa8d0b52966cefa938f73cb1037594e59be8b3e06baf45a0e7bf10caa859ed5c00c7326f2b02b271fa319763e0cb4bdeb1176c178f68e05896629d392e9317dad8feb048edc311a9be884832904ad7407bc93e2e177650a3da2d3c50121b8f07023323ddcf1e08d26210e49a2ffd495aa4fd097f888ee94431aadeb9d1bbded2f58d18b7a4ee3131dff61af35799d51008163e64231546fa7063fc53a157b03a84e77110daf1df47a706ccc5dc24144159975c98dbafc1266996f3063f2c59ebc6a533fd11246d559447a68a7aaec8b1a3eb1deed1f54c953e09570591fe35ffa7647741b4be5e6524f4a496ee949826dd1634da260aa9db903eb2072394183b461146c277e28cbf0a97d87b062fe79b3f32f54ff597431d2d7413581d7e2814ed1d051cff5b3ed40b8cb520002220d8b700e38e8b0d3b56bd84749468f67e0e92e0715d1f3967d72d9c85897acb5a3e9c00025b4dc65ce9b00b494549e8b9d27c368203cbf25b7fc91d101e68110b2427cf09a7086d7e4fdeb1d3c29a21279601dde1dc2bde00e0361db00ade5ffc06512ae0717e4aa4638e1f9ecdead50acc50985fa710ccfb242e84b63a0cad425ab8fb64988c9752f95c0be7596a28b8c3ccb5da481d40e1bf27092bc97e485441ce580c1ea9223c64de455adb91ebe0fd6ece20c24c2da87855c18cda28ce64edb35ad1a052fd3888c6939d38055d660ab254fe8abfc60d6e5f370e01281b2f1c6418ba0560c5f6a405b9a330679f92c1a8cfcb4434192c34427d16c8d3cb57049d410dba41f1958355a606748f6ed2c6e44797a64c2c919f17f2658ff198926f037f96c75c94810740a0fb4095d5f16985eaf14e429ac72421d42d31c96c45c1a722d3eef757bfb58e827a3c2986401f42efaf5f52525cf4d76929e933bb2fc50d66cd07b9d740610bbbafab81d222f3a7989ef86498658c325bd482dadde4e94b559e6850d4ca99ae1f490c5fde56553acc466c1a21398628de882d775204fd99d855c717a3c82c7524df24b70034a126ced070bbe51a16441e24a20d60797d96887ae7ae88c2e578f24710353f018c7976f110ee9b4041e75c18b363ff8d90e5dc0c0e6a033ca61fa487fdcec2b4b6b0b184db9bdd8dd55e5f808afc64d68e13b1c41f8f9d6d3f32e060e0a9857233e9784663e50c225edc86b54880a766ca53c7c379c0b7ab1b91905a101fc4c1d9970d10aea4ae46aa681e63a77a01e4e2b9ad925f4d0e556379b3559ee6be247522d57ea89207fba5c0acc0de5591667550fbc827adec689bcfe31a752e708aacfd7466678154be9006cbd2c53b0b15e39485a62560c4fe689bd47efecda9f997bdcf3bd3225e0b1e6167ee141821b8073a09007793aa9598ca4c39ab24f76b348a1e42d022b8f45b9f599018be85d1deeaf2e0b3ca9dfc15261cc58df4f5c1b5ed6d49dae35c69d76b9a4fcedadc03707e1dc22065b72f816145156e65a750fc686996d23081a09e28623063020ba5eebfb345acb2bf574cbc0c0cc25e6c523c98b923fd6495201e5b7a35de1d5cb2f739b84927d57dd7c1075df714d29254312b23680a1b7caa0f4e37e6be8e21adabc05df7ca013a71b9810fd1377e0d9d103a2205f93d82a6e1b9fba702e874fcfe6f6bb758e54c6377d49b11f5f3bb5b2ccb14ff7f28426cf19e9311060f873f8cc088d3b54f01752a0f4b0a8535cd9898ed558995887d17ae4e110be1fd7c271eb0352514a74fb6c6fd97e828ba95d26345a4ecb6ad3dc4a63fd79c21eac4848c15d6c53a8884c28d46851ce8d6a874c90042c2c0e3ad069ab484fa1616612dee5382f63a3425d67f4636aad3952bf4836763a7a689ab1bb70b2616f19a253fc0dce0ac85f768ef87078dc5056f90874f655bb626b7c58827c10dbc7fd6f6c547763964f5442521d763da4432636a12a76d0325a6da8da5ab90b674a967143378b7c8eca5d45a472ca18fe2895ab4a9c02feff6236f8092e5a316bdd994085721a3cbe32413477d93942e046a68874741b9b093abd2fb1fea6623cedad715a37af2623734332369719c6102ce3c9c68f2e3678f7d948f7bd99e45ae2e6242f0eb988e57aa14d23f918a5b291bec6345f777868a7fdf742e18674d75a0bb14d25bcd2f4ac75ea0ff396edfa8378eb466a48c1a925c949398ffc7ea3f121bf9341d7f4af53ead359caf0e04b523d9586bf04a4157515af341b3f12bd8b0ca38260fd051af124cca78b841f8c1eab2690b602ee9f0662b83fd26b9bc10120b90007434f2ebd026e76eae21184e949252a9ef9ef6079a3094fd2dff5d5d36e760839d6b91c012397e459b05e8a4fe878247a68b5bd2a0d5d069a855a8f644fbab2c84d87eedbdc1cc8526db5aec9b4508f3895d95595c92f61738dfa4414a91e29a677e74afa9333b80f9f507653587f2d420419d580e8aa4d6dad4d90c1624a082bb13ea123d1505499899d96df7a2e0e143bcc4e5989d0d35280b8190bffb19f77bc5dbb2a6b4fdb3843cb7fa9d4c071be64f6351b549e4b4c9bc57b18a52a69a85498154a33025f40770898eb87378c359e537cd7967f0d028649eebb3074e479dde4e15a78fa1228848271420e3482ad318835c9a36ff8cf44307da0714dc852206c8a79a310840d8bad6b8996e55350d8ce92aa55b8c16e42d79db66f18d34fd90dead6f7709d355181cfd523580efea29de139bf38b696734e104e395a75f5b7ea24c583649409a8017e55dc85ad4df67845c239a1559a8ad18f55bd6d731e6ff9d52a2ef6c59a4d43613e44fe225ba9c51c78035f2e18a1b447e2650e4202f2a43c45cdca381b4810c8855a3b6c132b97b6a99e861fb39c371334744b84d14ceb074b60b0fcba3d760b7dcaff3aa8446b1add0a631487bef70b8e960f05fb981472b09db7331bc8ca39fa09f1081609c28d31b90cbc4d1b7b03677f5ac3bc58ad890ba3d9f4dc8079839d20c2644c5b1508a312f77432d7e38248b0892f92a61a313e3c325ce81a901aa279502abe0c4aca3b8d2be25cb4db5efc02a19414ef3bb30a542589277cd09901a8651c9292f4bbcad392ff0a1ae0e00b53ed1e8d01968c0c1b506f22388826aab7d58c515fbdd7f76fd672a9d32ba3ec1178e4b83fdd1ff2f3ed26f750a0a459266dd8f7c01c43ddbe2b0fa78437d268a9eeb4f9f145054be3d60a725f1e9fa806c5bb34d622a4dad83ef1240f87f8f4ed787a9187b4e54febc7a36bc208f208f5728c1193522738a50369d48f748c9638e7eedac9e348d838840934df3a51b0469636d9d2f87597597a09b02d48f95c45cc094f3b7f7f4aa4a0bf0f4c737248e063ee6ee98eb024160a3f98d679533d8da691e1bc08ada1dcce9a7c055f7dc6a35b85c035e71110416fad9601300a661d2648f554aad97efa8e9670b828eb481662f53aeb47a840f36bed4e0db5c3fdfaf93d4ff553b79d322663d1e3c2e2b239decb7e87f6e0c5274dca15c529ecfafb2e81ddb3460b3de00287639d021e9ae2505a0dd8089264106e1130d7d8f487faea10b02b1664ae4f97eb2ead614d0f1e903fc4287b08401062cde5e29a6aef25ee4d79d617c99dae02e8b74006d751472df05a8a621f9c7385301cb5cb1e9060d237f2f0e14aec8cfa3fe58e7b614e5e55e94fd7224e60e20fc7306eadff42523b314428ac89f9ac470e267924241d5f2bd53a555703b7e1cedd9e94f179cd20e81660818c53b19f8a85417820be0bb56be3486876dc031efe0288c43409499dd0300d42e9ab01445e14cff06f29f0ae769e8b80accdb61c5445b61d8948921eeeac0793062b4797ddf4a60e048aa2a0c0d8fb3c06d8fce89d8db9cb489a268da5553d06e39d19f142125631b22c3a57d94d04c56f67d90946c0581d1a967790192aaa11ad17c4782ef99ba5884b7836ba779b76d7503890c41caef3e65c2554e44fdb3e1b1bcaa97e5777da891611500b371fe419802c9902622ee3425bd2dd2d842cce7ecabaaff6cf1b24ae5fcf34c0bc7fd5135a4346f444d4d28a45c4342c68702749b45e28cfdaa581592e52207df1cf2bef71772baaa5e6aa35519fd790577ebd1dc3406ff946d2891240bb42914a59f860eb6027f22625d4dccb78bba6e1000c54df72b54f9f270ccfcbf941a375559356c8ad87842c414907d7dd32240966d1b98dd24c4d13aeb8b4efdb47803b7d1af27d02a4ff723f0c4e83fae28c9c965e3891b646072ec204ab53c99a6e34fc11ab2ac597120d6a1f375aa042122af34f4fb3542d02056153da456827f6386554f98fa0ac1ccd4403e4688175049e837812abf0d4099c749eb03260fd23a2d1b37c9b523eae1595e1eca45b34c6e184717b140d226bf1ab6248abbaa970d876d7bec2aee608c94bc64f71ddbd83e36af0ab1350d3cd788befff31086319a5300bc8e5c6a9a57ea21af04ac80496f168a3382a31bb41c7e9806d3268ce5694c54ac12cca2392fc6b459dfd5cb05088b9fa9e97bfe539509191d26257b43ddf7483ebff74cf62e1e0dc8e1c58232131df1059491c9d8a0f83434664098d765e97a6392e27a72d7bda8b72d7ab4a33c322662859e076f2ab7fc74f673e888ab55d7e125dfd1c66a85bb9677d4acc8acd8e990ca8a018154c0829868d5a303844b9fdd8989b782ae702f98d82884250e027b42cc6a3e02836c5cf1e69f3e6defa2392d3670264401b5fb5ca0779c7521c049a5387bf33db33aa80e5255c154c2caa1ff4dc91740d8cc8cf9dd57754077abb15e6806376a3864b1cf652e2f4c5fe905b0b3d8c920d4b61c33dfeffa2a17e391325a50b706fad5e3c05ec35ea81ae10bf65eb8f72cc455ec4eada646983e6f1fa49c8ffa12cb12d2144142de049436156a0332f60d796501b6b785141db3e0af71cea3e8d659e355e7c41dd34419f00c7846a46bcad2e9235fe985f4b3e5dbece13ec37645c053a09df19282234a9469ff5dce0088edc48779e2df0df885800079666d6e3031830b2bb0e283453196fdd338bc5008ec88a7f0b84cc8815058eab6a46009aadb8c96254887b8a568cc6cf0d1ac6fea7da3f52b33d64e2e54a13af9bc2dc3d0babd0d231514404b6f7ce61af64e747ccf982e8ded730bb7fe2cba2cee788b913595392e161cd059c44daea7b98d7c438f2b69b7a56e6df6515dcabb45f608f28f1848a56a45b6ab55d2e10acbf223af0391106116c2ee50540608cd52ebdd6c836e4b6dc894fb32a540f6b851e64a4f30279e7d24c35d808d8057118252d3803c729ef3fa0a8429929c4205d6e394259c99d3ad3c727d84c87a3e86c0e7c04bf92ef8c520e9c56cb3cd42144431d38906537464d4104f4270ab729893b3ca04cf8275a4a5690c10ecf25859097804bd41b690a8b51f17d08ba2dc60cdb4bbf5b0cc2664d39f4b4257a263cb3210c01cd73811ec46926ba8930d9d03659b8c5646118512d6daaeed61bd0cab75ba70e8725c59278cae923044542e021fa5139841b285f5c85831917e8c0be978d2b1432804eec9056b8732118bb145a74f121086feb284da36e8346296145df21204a3768c07dee45ab04cfa330d49d47d74c82a3773369d652bb4014f036ddddc9affb36f502bf75f5cbe5e60d59a0cbad40575972a4df46517f74d56b2489f92a9c782762a362708846a93258c8c81213d017317399ada812fae07b1884f143c71d9f1b04a3343e786041284d79cb231aae341b49a055d334ff5647a68041f11575bcdb2ca6b019471c5325a47a9fbc47786b8287f98df40c030bc47882b29b9f202f567f1d3bc4c73a29e616d88b15d01c78141a73f181983cea48d78966a7b93463342a5a61cf097eab7df94788a81d1397a566aa34b20c51e6e87a772d10a6ca0fe65168705a1f677286373ad8c16112e29643104f7d83d5d8fb97a33d04a94971b759c5528acf93fa30c5d38e90734428b9ee418384864e2dc50a5713159e30127338b8798ae5224b672716849045b72d868a45939a7fba3280223d370559b8d58899856344c8bc6725c5123e9f1f05273dc42da07789c5475e02e79c87d63a6e7f1ad95e1df4825f5037780a2bc0ca485e1d5a46267f2bc20301adc9787086e5d66e142c294277ed022a2683ba42ec891122e0cd34e6561b48a7b9f5b93a5f2b65a2c35ff0e51242c78df4281c8c5ff206d07d1463a474dbaa5049328c1c875f7b9645c189cb9bc2ed368f99306564e7cefb5e5f539696db48304fb7beb7ac3071521c98a84db92017c86419ea7f4cfbaa801985afd4348b28fbdfecd4d7cc2231a6e718a91367160a939154ef35694ffa39f1827284c3178dbf2a1fff88f9c3b75e675a9dd0f4a2fe9982e5354807b6790cc0d37c1f557c6ef754c16a3b004bff6d3468279b44f83fa326fef3acd7d2300360ba535c892de4d64317fb2b8c6d03dfe80bb890ab395401d55a2856bbbdefc1210f62b7e561798cf592db6111e2901163870cd01e53620a89a53a417ce9450448e72fb3b9e84940021331771621c380b968e21d3399002b091aad1b9fd0ea7e03daaa5a6fe99569b1675d4f27ff5959b7313783bf08095a8189e191b5043fba491e04c39d2de7495d1a909846e070e01c4d253e8821a6e00f9da2aa53f413300e4533940d48bb710184a4785a1c43ca19058dcdab9d47e6a00a09b05dfa44b91af4592ec5792999766c72050387829e2dbb116d6734720280305880f08f4d2b3110dfd96113c1c71f63a40b5cd0d352029f4dc71d31183fcec637a002324f902ad45ff701b52781f90c5220ba007711c96834ab47002eb955f32cf51228d046272013d33666ca269002eb6609767d3fbced64c85bc3c22925f07a562d7eca0c2392c0d420e387249c613d3fb5351da45baa933b658b2eb24093e12c26eb204d34ff65263bd4064fdba05c5e4d895bb19c9a8a9e910e67ba2e983a301839bdac8303616b341c3b4b7a079939b25b07b39927e8792c20c0a223e8847221ce0ebe3a6b1e5e9640154ee1d341f70b8c8de0c4c66822d3f230f847af9f17af04c3cc5bce84080ce10304480e478193e3c3310c6f7c8ef2d1f0692e1b7deec0a3ffb3bc5be56e3bd2e21286aa4dc82480d7188d36aab1c82470d2003b10f0a24eb0e6cc43f0e2e790adf362588e14ed74f6e8b2013431765fbdbbd0d11cbf87f140015f57ddf160330f895122331ba4c35498d5b85abbd1b8b3683ea1f79630233ba1738e01d2d223abd51b39c4bdfe4c9aeb1c755664afd37fddf82008f8b81011c5cafaaffbc9db8b61e33fa1359517b0e8e4232238bd379bbf95a6f6fe1c0ae2b7911e8b2db5321572c22e1dad2e665b7df296b3be162d4be236263b8b013274f93e0772300c5c80d3fa6a21d359087bedbb78edd059bc8bf5ec78330e302f8aed4b9dc27c0f2503ebadb7ef6a92c9e00461d512c92c035d6a91cd7f814fc6816856139ebcb0a47881d436aab3c7f890bd26835343d421eb40b4fd2e18f8fb066996d5ebfebb25af4d877046ab1cc4e1fe8d874f25117b6d8da7f848f2bdb5b75a9c80a00fec3431a658660bf9518807046c91f9828d74d425843e47eb72e486bf9d36763ac91a73fee184e1cb7bec648032f76f47dcf77bdfb22f60afdbb98429edadaefe1bc3791652cb2c45d9b4d0f4d3c1340118bbbb68ae9a155c25b9b54ba3bacaccff16c0e02e100e65531a79afcd05b18031230a233dd0c3f4f2a468d0622484336a53abf44a7a367fe35e9af10fab57a8ea262c00428ebee21741c1c6c478439b082fa90b9d645f3c6168cb2651ea3993cd65b313402c1ab83407fcb1b2fab7cf657ecdafcc3f78a62bb9bbf56fe50e0ecf0f5739655abbaf2d703d3763aec70d9cfd08ae39a57eb6aa50ae90d148c49bf12cf485931a3f9b987cab3d4680950fb1df2bd5e524dc096e40daf809d9070778e40f58358fe96038188f2e487640671414641979627c9b87c71e75b552acc4aecef58b6334615e73b78de947090d0de8f8fd715fc5f733f85628fdd62b3b9afe02cdc01de7724e2cf773bca983831aad70d605a01e8a66eb2477066552d200a09053add0935a3209850b673d36018aed37ce34927f2e5d5beb11a5e69b876151d5390d027a2c429179bdc10e5722188adc61e069d7932eb6695bd6facd84cea0494c23bc03dfcff1b13498739b4a3e045b3abc7ede145b9f5efc108cab321d394d689c9acd2c513581fddfb2603d6ba03c6e326aa8504381258c4053ba97c7727e94df4993508fbb7f858df1286622c08b182adb60886df0e426088316ef7e29071cbdc5141fcf7d648b4b19a12002ce7494dfbca80c549361daa7f4857b390dff18088020de0364eba779131458e6801ac98a6dd72bc3d180e6102231c39315077ab68babd54a935643e30d9ec08de9fd96119ccdcd1cda34ea5314245f442a7223e02d364233504ff8192826c7c66377fd1298201dd869b08011a1a60a1e191f7013e83c75e5d3b80f06ce2d8538bcf4994a86bbba8d55517ef881de4809db20070948044ffa0c9b4a65a9c33e0f1db59d7ce774457130cb41b7134d8b578730ace55d9936de6ae9ebf6194d921ce8d1ce2f401278da31b3bdace9a938042e94e88e268a7887427e0c550b8db01958e1182a467d8ea83412020f4bf268b4f7691835f45759536c9dd612728aa00cdbbc695fdb4d711953a833e9e562cfe55ea0b5f694efa94d7493a62cd2c65ea5fe02289ea85b6431def9a968ce15e6f7830310bc4442a1813e82eb1398a1c3a88b9874f4dad0c6066c319d76bbbd360aae7c8178968442988ad3829f0c792e01647205fe49c4050d53209cd5a6394d79b0242dd804ce01d276bc3ce787ed78f98c6ffe87ef78f9b43d4e449a866d1242db22500a202b008a464d5d4b158fb9f7cda2bd01585f73e346279b702138ec3ffee3f7ff6ea49b888890901d460df30c800ca77be3e6dec099b1d91139b0d98d9b1b37ee8836c17b3f672fa114d188a43263e57d471fc18223e48f2872c44cd3418f704196af286dc90d3cb423ec1257847c760b7ac8f2c618299625b2ac9165912c4bc5b26658d68a65b158567591e0c6cd43b9cbdf08a34f55967fa1693a4c59fe06ce8d26f4d98d9cf75adefb7bf73dfc1e10efb904f15e2fcc5dc1ceb7f7ff92a39fbd4427595e22aeb02f334dc7bbfc8b8448c83595e5b31b3759be3d350d877cfbc0f6b39a7aa24bf2d513b7872c2fb790657392041cb26cb72a24f64e341cf2493c94c4ee967c029a0e7a79d966b349596d230c87eab84e0d7744955b29d75a2f075fb01e2ecb3b77e772d3d19a60312ebe347cd3e1f20b8c48b03d77bc97174c891724727489fe6460d21a7c31ce477938e93b9272d3c605bc6c34a3a0422935009385d0cfaaa5eca6d4da24721fa6bd26fa54b9f75e73773d0426cbbff4ee0422a13617282149445f8cb8b922e2e11f8a62188a847e5e09dc200dc7049ce99de228224c7e6bc8306d1b184ddc17f607f6443b71178a889b9327fa04ff1a19f18987fa4199386152d9fcc97b4f7a0e36a33494a6e1a04ee8184c64ad75c2faea9c5c32a1c4a1d8e1198cfb96babbe7ad983426ed06489768e6172f09857f491e4aa65e278143e497e4a1a293e8c494618ae6c84bd164eb0d8bf1c27ab56ee66c1c1663b925f9b92dbaf4b07cdd1ab9be6b5ed5ad204d415a24933173e00c034e2770e6cc26d6b46865496b76faf07ab2bd505a1e3992df254e7525193375e4a1261549f283583e79629d7cd235bfffa861d24b962c49a5e413f9043a2f6e32182f27a77370709c83ed60b76c822373baf4603bd838320c39068e655972499e4adee5986cc12a79a85e62d3d5e91d8a62d1b84002899e2122eb999ee9197aa4924f82fcc882a59959cc2c6654d54a55b154158daaaa51552d55f5aaba55e59c9286c36921a9912e3de7856b3b5abac636f97d8b2e3dc985d4a2a64b4f2a8938b016cedc16945a5bf320ecf7e003e33551f2bc80f80a1a4963d14008e1f478b0183c715c4d5f1ad90a77457e3d9f01e993151367a6afb0661abe2154327120ac9d8b3e13e5d62e1deae5c4a663c9a3b894ff1046376eae8897f350b2c6bd9c9a9cea897364d42b3b9cfc1a5340f612115ef29ee01c51e1e68aa8701adfd9863bdde0661ec4c8eff3e67d2a51929374e955f3736a31b39859ccce82ce2c66cd3c328fc0fe3c82a44beddabddd74f2c74389ac4535305c5e4f2cad39e784b00afb859d99a9763db9aeeb7ac47a3c2cfa8a43e8d1a24def5b70e16a6e606bac68c4668dc98fc69cabc132fc54a9aa1955b552552c5545a3aa6a54554b55bdaae412c9a4e1e8a24bcfa3647ae6bccec1b77312a74daf3b3f1ad886833d623111e5f53264034b1f6b60dbca6aa5ac2978456224a4b71cc248469d8875e29288612422105e89783641c124dc33167ed63378ce797d5c3c5767d15a9b42439170909705d2fb4267617f489cc6c4c623e391d1b0e3b11f14502845e2d0c0b6fc46224885e82308a4a9689adc338d09901f7d823d3d5565abea5355285505aaaa5055a55495a8aa2cab9a9252aab2c242235e355afe0a5b135349ab59cd5ab97eb72116d3c7e60d169dbbd48f6963e6b5aada8d336a45cfc08e2e7a4669268a54552e35d2a67719945e53d12d949ed24b29a614084a5d280d825221285532baa26abea107c2ca73b312e4caba2dc30b3fabdba2a8a125ae6713278c18033a5f591008295da40c424a21a41c42ca929426296d4819d338d264741ae9d3c4322d5fd1a7d658ac74a7aaaad9b73a86f5bcd895692b1576a93cdf5030e07a36f10cf45c0d938138beeac11a79a895beca497fa7345409fd3bb5693aea5fe3152646171d880a2689b0c7733d1eecf100e1f1b8783c41783c42783c1e8f1e2ce961b8fad1986031b10a9b351a2abae4e87c261b7ddd20020700e455c44ba5a75d752e4c448c85e119ec855d912e615892643ca1340f356fe68d6dd8af61a75f6f76c55cb8dd6c168102c2dc380341ee5ff3a64f0d876c4d8d5b727b412feca78b50715304e706e57a5eb0f30d74354da35c1b21ddf59f176cd634d9bd3927d95d24baa48fae0a90d155b01474f4c680884ec25250236f1a27886ee33122351e3d034157e86a23d879d1353fc34618d8eab09af4a1e84bc9ed05a48f4890241a5d910a9bd94cbada434995d6646477f7a44b9dcaee0c58e4960530920c20b72c98618c4c695cce1a93c6e474a96031f3ce4151ee9ae802eb562eb8070bff4962abf71f26533d9b22cf09595866bb168d2e3df24c4ec9e5acbc588c24a34bef0e0eefb393df2116496c601a5e0169d04c6f44bae8fd86df162ccded2643230da5f27738f3502af8089c812db0f3310576e2f409477e9f4d1a45adb86618f9519ac88213acde72823c5153011b4e91225457c17914a14811acabe03c461584a5caba130c9cd964e63cd3a3f86dd1a59ee9525331efb3e9ee9e4fc98c85df2286d2ac60de52eed31695b516c6d59b9b4e8b962b4a1357605f67434879be4bf9bde18f86f38425c6ba18c0015746fe8055e1c02ba38c6cef79fd559f1bf678ec0dadcced97131929bb3b8464850aec852c9e4baf1658534100e457abd7fdea2ecff73a1037161a355a7e3110b0062a8135b0c6b55cf348fe115360b9a0c56b58ef6837869d38a333496cbf6be4eafaea8be54eae43506a2d8cafa38bb3d354787212db031eed477729ff2862b39ee9237d723de36a7aa671e652b9a9e8b6a2675060fb2c9f6f0b25f10476a547e562029b4130f27b4c590846a34ab049d331e12ffccb614a155f356f7e61e76b4d1e22bb2a9ebcfad24cbb72ce72ae3a77398739d771cee39c754e49d36139ab5e58c414c045174d53b4088a5ad1a6f71c39e6cdbc694a336f5c72362fa5c17a54d9c254092ca37ae66a1cced1a5f7d24ed30cad8484766a3aa2fce846983c87e36c9ae6c833ddf434c3eb9992c45ad0927326e76c3877c339229cc3e11c009c2bc239da5cb8aaa215b528b62a2afa516705a5d6924838b32f16ed598170c9c909c3c983514e5a592e415c708cfc0ec7804f201930ca492babceccd0233434a520ae547eaf8d6612a6942a29e1c03fd88cd2a0609ee9f54ccb265d2ac99c86e35dc98f8712512b0c20fa750b8bfc4edbd5330f35c2d48a8a4e4ca11f9e12258d4ae2d9341dcea666d22ddaf428cd1b915e519a9ec971e18c92ac1d91488e2a21c3661227bf7903dbcd49e7ace6b4e6ac735e73627376a06b898373337b0a71f591a66388abba42eb421b4346c215a0746548b82a6cdbb86cdc90ed068637705c45bcb4112c34829de162601b0ae04aa5522ae0d15e0370b53ec9dc4e457eaf3017ec837d024424c50a04481f7d8449b0d2277dc6496f3c4440462b10109160a53192958bae32c20d67ce26df9e6923de5566dcbe2b4ab8546ed8a8d1ddaf3eadf870ef3b71201f6cbfa666c6d5d4bcc03d58f795eb94b411ef33ee139bcd9b774aad25916e1a13a8079b3d2528b98d2ec24df320203a0933794a9a8e9b463d2e9cc0120acd642f0f76bea651f699943c2c58580770b53e7d5c1596477bd571b58622bdb926341409370d7e98e4b290dfeb1197fbc28272bbabc2f6290da53d43697a86a6547aa1345fd8876a3df34cee0b0b211e60e68c648712bd660cdbf2e11d50f41ddac1668e0a58070b714562c70f4b49f625240a50aa06b8827d7587c91ca0c2b04f06b89c58f8f91eb4892e954a1989e894c608a5314313989e7928f9e4592d9a86ceebb4704b68381c139ce9fd392ccce4e7a4906aaea64b4f6cf6ba86d474c0bf518d1c5ae91dab79a6772ba7922e6cdb70749be4f04a9f56ea4b02383e584a00ac4767aa05e502188f545bbbd7f04528e39497b6ab68e731fdaaba6b9baa7a09f2b4a2aa5c7786afee56892ba2fb0993d25023975ed125d7997b5fe7e69cf40a2b2016e3684d633d689cc37bc030142e673d43b5c8fa4829532bae38d2a7c6322d63918466d127882718357d5a7178dee48943b5e8137c698bfcfec24586c95de46799e4d77836e99217f91dd2c1dea0288d83134e37a44f5d5ff7e3a25194a64d6fe287c5b0546447d3a73607fb1838d3279a3e359a8722ed8858189de37e3cd2bc9960e0341df30055b5a3aa7255f1a82a04545502aa2aa6aae6d5a39a377daaf27b63db39cf3a21d99372f27bcd57cb34b7942113db875474f3e88a0097807a80abf5e9500e36c80f2edaf450aea64def642419e34818469ad080e1bcc85c0d4b566231d14ecd82566aa7a6a295b0188a7b260e3df3848c3e410424a0af9877f5908957123eb00528003ed4a3caed46b5c7d5fa34446e974b1e6a84258e944bdcbc559ed3d52019551056990bca27223c6fe493f71e588f5286343143ba449b388744f47993c43d386ffa8812343dd370c041d6643dd3272b3fa9a44f99ab3e2f95488705eb6af290ea0e693759d6482d6c905f43519a669a41ebe720a6618eed77ce1a132bfad4f87a83cd280da5a146e81836a34df27bad10c2aee8e14ab7452f92d1dd4522aa19e11a12e99fb775dfba6b676124a4ef68476a7a1d13c74597de085bd8a6666953bb4f920b49e672565e068b89104a48fb0e91abbb264e7e37a6dc2fe57923c23fdebcc9efbd3112d1abdb3f44981ae9999ea1346eb0f4d6fbf2ee42310426c3ccc289fbca4c69faf4e6ab5b654ad3cfe815f9bdce16512bbaf44edf45b875cfd074cf0461dc9cf716456e070f9d74698acc819961730dbf4bd34119d40c3ac99e0feed44fca519e82d04129473990148c7220210cfa7b870dad0c8c546231d6e7f3c93e79be52faf9b6d97e5e3f34c3cfccf02333fcc40c3f30c3cfcbf0d3197e3e1fdb899f0eb638ebb7cbeb58e73b5ecb7db5ef78f5f68879deba3d5e0f97679ed8c60bbaf0934b00a7f07404a33a622b67bd27a5947256ec72d7e58acaf6fdb0aec8c980f03abc62224ec4e9d321cc515d6e60bcdc7e3c144c9720fcc23629638cf1b9f7feee0e6d90360202b9c2ddc056afffd12719a4c262e490c624d74311f3902bf23b122f39609a0eebed59b3e122c3acd5783398ebe45e50224c961d10a813238afdd81b651c025355ae72315eca18fbf0c413711e6a84e9933e55345dea433b553368154d3583764239fc8f56baede98fbdef7248acac68614a382950410aedc1d914d97379b3579365c471cf2e23dda195e0a913a7c3de55344fa8933e5533f40eed54b920e5c63734137ce8463a34133c7df25015cd33cdf429e274c905ed14d9d04af04faecc910d2dbea19de4d0ecb5ffbc5e58cc0737eb3cd7c55cd13cd4ed8539eef0be1c715e76b773c481d7e5f88686a283cd4eda00ad19917db22b406b03c8525a43a2b50064a32a67e7f31ddd33a7dcd0cc1fdcea8f3e7d6eede1df913ea57c7e60ed3f4779b5ec3b163bf8a885b51fcf7d97718c2ce661c8abc931edd25cf1908729d147d04206f9fd72eeaee3b11f946b620aa8d84212fabb486ae80669133c86c5846e078b698c24f497870ae188037172e85656b4a971457304081f71629346e56813bcc32f42b0cef62d1633dfeb760efee853670824c83fb9351cef7c585d3f18a5bc19cdcfe1e8bcb0ef5d1dc12aa80d27c7bb1af9ca58eee499ebddf5e44aaf1999604f8a49724cf250eff1f1d1a649390e20c7935cfa743dfe256b5d2c79a6d879b5ac4562c943b978701699e4d8c1585c02734997e5538897ed366f1faa3fe7679e7fe91311795ec6c35a5959d1f993961071a88deb8e4bb04e01350da5bda04287d47a9e3d8a87fa1c5a9086ac05914828bf2d953e983659df4ec44bd3d10dbb63b7ec9eddb4bbeab6debbb0985885cd6875da27ecf0976d3a2ecb7a9625ead4abea582b4cd87b0ec4620f6ecf04a43d0ccf3071f6fe2e275f4ded8a894b2291c49b227eb7a17ed6e5703039eef2de7b33ce42587a839e52a8d2db8f97a3b3fb8db2686d554e528eb73f6ffcc3e6ab75d9f97a5df3ca19e51de6230099763ca545ea55701ed60c9767633e0290fb34d2cb5bd9902ba25fafa805a06fdd510b409f3aec93c4d257987689e2f91c7c0229574f73818d36847fce461e49a5522f48a5a8b0030a15c2808623a9548a0a2331f73fa9249186861552476c17624a071e2b2cb9e2482a95b2028b8e19602a954ac9a006b3b1a18193542ad5829927d4dcbfb8b0049c542a7503185ca1563187974aa55236f082b5c4492a9572010cc65055610b39681c1a6598b94f8b3049a55237b0703eb93f6974d036a9542a0675b0725fa6e10c35a9540a0730e8034aee4723b823a954aa8a544a072f8842b349a55230782a45032cf7df1568b8f0924aa568587cd0ee3dd295a75c0ca18607f4482a45044fee3b9295589272c4d7116ccb5fa0213f9cd13ebc1a75f1a041ca28c8630692daaae7e970ee79baa64287a29ddc3a0137a6e1e8e14cfd2683f5c21011c2081fdec1038b4496487fae4f41de833cd4fb752c8294b4b586699762a392877439880f5eed06f4ea937b0f3a289e43c1eb1e8d4927c620d7f30acd603d874ae0a5d91dbbeb19460e0e54d24f7afe8c3c9a9c076377913def256df38cb85b871192f1c449f5289fcb227bee923c71a797d00cd67972e73b1a763c0fd2a7ce3d1ecf3b2ec9d5b97b078b71f0419ee53b383459db1c694c56228e105aa089355877f86e9d31d7614375eeba31ec14ed16505b6bad41f8427aa8ae0a1b7aa5ec7266a37355d876712517f81285fa5e0906891c1d6271b9bbad07117dc70293df4bc6d10916025162619036bd6320b1099d638cf114d8d1cde561210d070fb5f61cacb34d945c0d9a64223d82da5a43554fcbc1f6df934c327c3f98e11a6a6ddd2e5d6a53b40b81a336c639fb2481f48f2efd784672317677c462dc1b0e225ea9f44a0d87126c3fbb2edb2897ee183b4608a19d7758bcc3e0e39df55d2e24540551b38987aa70c9724740ec60e08a782fe1341c07a183584c4761ab9daf14c57ba656c4fb6b5938c093121eac7bb031306a7371a1ecbeb08e446a94f59e9f8247bc959f07223fe925265597d8b6297103522f2ba6cff4acfb449bfa6f97220d81689809a3c2b471e4e70c89f69418f6e3416d2e5953da9cebfe6c9cc1641a773963e599cdf0f20dfb5164e5335e6f56420f32baca83902efa8e6e0f458222009971d149b08257ec553ebacae30cbc62f14a0833a1f2d181a86020273d3eba2660b89b68456d47e368de4d8752fb485929df583f58279a8e10e9f0a5bcd9672f7b7046b2231922a24d5dea12cacd9ee190e1535a293f79b35206753604c61255e1aec8d05dd156348ae4b06814a4b9a1b90e8c36c18faecb7926e724c35b32ac05854c1bbd8dee25ba34549214e5a144873f89646d8321eb49095d74619bdec77a5242f60af5e93ad2695c177006b6dd64185123875279175d8257b98e499be01219d8ccd194dc122b1a35a2111da67c14baa8434668f660536ee6926498f3a4866e3b30fad472131786938861975a762e42c180f9ac31c5afd5466b0c6ce8f00e8c3ea51cdec1bf5d7b5c1f0a1ff399ed12fc75ec290ffd55b9af36f52b94fec7fedd941b72385d82eea64bf08e0f36e3802b83267b56024556e5ccdd746e7665074f81262cd0a78865da9027fa14459fde65598f19b4d7d21873506a2d297bee76333be5021b5fdd3d7337ef158dd0c186b0134f2fbc3a62192d64691a1a7f6830bff71e0c4cbb2dc48073b0b04bd4f5a8fdda9709cc014cf4fbbb0d368410c2c6d2c94090bd808179a8f6de7b190c4c2edd392786936bce83608e75d9f118618411461881023f168e1093a9c75ea105baf43ee4ad4b15a59442940fb4f7dcac8171750909384676efdc0c3ac9f133270c27d8a5500c7b4127108af17213e95a955c3fb9be6a28586bc5d91018280614c31511df1a894a99ddc8af8ae18a70508c8fbbb4509b17eeb258c89b850e6f06ed9567f5f68852aa6559b6c2998bb11e6232f19dd76e5228745920ad5737d6dde9f674dbee4f374a37a8fb9adff13e97d7d643f76993ebe77bf5ddb57627a6319c83c5da86b63e45eaa3d6fa785dbfea65bce8a6604bd45ce36bc7633f28a050ca3531051c3a2d728c31f1a1b49505f93a23848e84a250bec1c1caf604240191c8b2f450cd921eaa3a34a2ad5bd10bd350f4f2a587a238242dce98bc2654f7eadab12b72c38d2dd1391b41a631b55b37ec7e0d477b077072cb2d0d73b099cdf78924d8cc79e1bce8779be852c321a336972ae59c73cebe670b36b3b36163890d1f6c071b9c9dab4bf1b155d5e7935bd54cf12d362e1ae581857777340f9523017deac727211fb1c788023d7a5e59f5ad0d80f2eb187d28100e32038372e1cca54a9f8ab31ca51c9b93dca60ab3c4898174293e01378976448b2ec5f7a48caee6081735cf1d79d1d94c2f54f9e6923dc75799063bdf9e44a69f373a21a4c4c6f85871a84b71c76ba7775ce423d9c5a0ea5bc5493c13bc6589c815fec24696ec7ad6ebd717d37040f9a48b1b3d9091fb0916b93191ce310d07acaede4188072dc816e6706357c34eeb7412d070c0777d57bc5174091eba226d82af6e6b231c8cc2a51ad578342a3284772209583d6b4c3ad8023cd7c41410e58eead6e1ef2767c7837db9e1e80c71d6ca90610b4386cf3e19666d0b193eab76341c100fb65fdd4b42fcc4be060f6d327be5c619b6830c10bbcb249a8e1d34b16b155248582a6260539f2459fe93e4a13e97ffd47c943c14bc7c0a4ed3214496ff2cf930f980a1e9b81e9f7d6cb2bc4ab2fc55726d2e158270d27494649beec12f58eb5556378318d87991c0cecf574d8792a6a33d634932446649928d8c64f97683c823911c6c265292e571b23ca20b9bddb851826aefc64d9fdcc3829d6f1088b7971804e03ff8c6cd33c9db7b03e799e4bb0b7607d61d918ab14b1a0ef9a8039b5923d626b1461eea48d3815ddef6a0e9b86e8d5825464c54b4495a81753cf683020ab918d8771bb9e3b11f14502825429767cd933eb50032ca2e69933c932c6f9091a5a59f8922413104539ea8d62e75ff83020aa5884601f854154a5581aa2a5455295525aaaa515591aaaa73dd00e306ce43350f696fdcdc7842442acbcfeb4c60496085c849351d2e593e5e61df33219670c0e57a68bd3a2663adb0346847d82554d0f4c9b241967f3664dd7a423b5a4d9fc427562423cbb74c491348145849b2ecceabc32ed186a36fc1d08e10e1d825b60bcba4e9f088d62086bb74ee21b1902acf1147bc0a1fa0f3ec084fd5f18870446b70b9eab48bc5214b396469e12c3ec9f2d551d7af6384932c6f84131d499a0e20b2bc114f8c20e394b2deabef5def61ef75def3bc67dffbbcd7a44fd6017044ea88d40d30baa6e66baa032e6d6a223a87128b826953bf7374a9e3b31cd9aaef434a25c519125dea1c6ec773c1816488b15d6369d4859fa8d825674438f128b59644ca4839879463e9735f90329213d563ce1098157779877b54b97549ced9172483fdd128d23341d465aabc630cdb8650f786b931d815e9449f503e4ef4c9e6273ec442082b9cd1aa72a24f9dec449f3027fa746527fa542f27fa6439d1a7aaa29d151f569e97b28f5842a88d001cb4cb4106219d8797103e560d07c450c615d887a9a8cdc57a198be70a3d00d8ec9a82662c19ba9042195e19668833faebc25fafd4b23e3fb0efd6219c9044ab3ba40421ccee5ed802a6c8f1115342a50b372821c747dc289a6d5c55c43a7ec13a78d1492f2983a79803e8eaf0e860b350cfce5cfcc431461ed82ce4e69c4d87a42c3d1f49218aab8c237691072ecef950975842241e58961a67cb59e871c09591e5437d9a54c6df151f99cb795eb7029b59377169cef9ec668c320290bed2e75c734d763221390e7935d9a54b13af5c2047bc323f459e18aeb8fcf2c42b3ee66481bd393a16d82c42d9fe4e146aab9eab4f5070c09591699cf882514e5a59ae666ae5aac6055cd7c414b0a39d1716bea8865c1dd6c395723774ce3584a5dcddb2837d0865aaa8ae41d72d979a0e97dddb3927b5554fa94ff2aa2cd2ed33b96ace39e79c73ce39e79c53b6883deaa49c539620bbfb26bceff0bdf79eebeee79eebcecde11e9d9f6c0a85dada43d5be55e5d6a796524a49a594525659610ab0acaa03fbaff13cbd3b4aa594324bb8c4bb584cc3c3f8daa64b4f4a299f7c70e5ddc5b81e9d7b66017aa91c8d60b3a6c94df3e071a0fb01a869dc11ec6e6211ec7be6ae9046220d5c91e91c448a27ba4b10a34be77ed0a08e520481524a29a594524a29a5944b9604699068849bc912f94ecd85569225221a25c4e549edd44ba40481e4619678457e8a2aef8a0f494497e0cae8ca2c04e82e41bc76340f4579c0b791917c10f22e5c0822e5618651360823a85d92081a22b994faf4f08b854142a6e55aeb859d0f217b3921dd965bebbd3ebaa1c76b74833494a12c59b26c9144e41c594a29702591deb01189749823ba14fd113162c9a3d19547870d3f7aeb13fd68f427c299cba325447874e56824e5e87274bfa3fb3ae97e70e6f2e77aadd7557fbd6b263dd2e8dd0554e1ecc52588b7e0ec42e09370662fc240fc3570466b08812dce4841bc717617dcda44e328d0333abda3d7eef7208c51ca3929b502937159f4d6a766d1cee8580a3ac933c12a0b0b8a019d7c2616f3a181d1008c11d11f2613b3c8fa3dc4646016390003cd64828f98cccba257794d4c0603ad04df3d682578297a9d988c130d07bc08f7918603be464a69a697e6e6b008043be7ccf4ceeca494b9638cf9c1ab82106668bdf732bd2f4779d5eecef47696580fd145f2a1eb32bd1cb5155d8217859a3012a44fa1211e63463a10cf4a390e71619be481b852882b25bda307e95355e5108692a64fa3775240a08a06ce4a19a40202bdbacbdb123bedb1b437436549cb61cb3b2d4f69394bcb575a3ea3e52a2d12c3b7e4d13fb78dae953b97e5aedc19377bc9592f8102dea6c93e2d46fad47212ce86c0c0c31c28c610accbd75bae1a7776e53aa5c76a47e534ce92f2eabd2b93787fa9f4f202fa086749e46cf42130192404f4969f8f10080402812490df3309e41108e482813491412050088f0e0a921f0804ca92c8ef59127994723dbe2b437f387b1d70524a29a5e8a08bae0fd1abbb95818f5ea2fb81960c7af69169d15d612288bb1c4810b83d930b067241ac47940dbe7611db86e3bde100dd1eae0cd05fa8454545be86ca6ba8a8a40c8101e12130b97399f216969882e10a0d16961589490c9871d267904824d20cd257482ba4ab9270fd4a7dbc15ab2b2b2b7fef1ec2e718e50eaff8b82e7f61d8e9e73ac54eaf530c048249a2a6b0885ed59419a4635145a376525870f63f94cb9b0d81017d3ef4738a33ec9f4f86fdf3fa7958cc1b81de5814829507e10c06fbfc270ac1a23c83c92823ec17ca10988c61fa96ef786d5beeb95912b9e5108b59a901735d2d979b13665e4a295b5e5b92d8eb8a483a4f983cef144bda04bb7b49d32ca16921b55811ce48a4116e69696969c1cd3a9c5e82c466bdc4c9184bba60e2c50d18384d72c2e8d3932d77774682f4c98928f2b3409fa494f21287ae2be252f5ae1c74551e2fd07b0fef7811f30173e8b26d6428143a1613baaba96d830fc423e8b2337ae6941c31e3998bc2076c9e114197152441a0c7fb9e8dab79c2b309dd169cb9dc727957565edf4a5656de367daa5f7963312bb8d95eb955e6d09d0cbd1933bef2dab9a0f8ce0505a12dd0a74b0c9297972d128b697975368a2e4971f981875d0a420829a5b973a99473cedcb973ce29a5cc9d2b29a531c6dcb9b1aa2a0861ee5c6859d67b2f77eeabb5763734831dfd1a8dae725deebc8f40a74097e24177984c130d0724c5207d8a425cf4d62897a7bc352a8867368b84b8f136973b71903e55195ee556f9912e6c38e281b8f8c65644fc8c0a9a77a967ac47e8f18a40af6fb90d74ad9c72339a4567b919298b3014305b193e0a295caa489f42b5d61fd82a95b1faf9e72048e331e52b2caff17ad047075dbe826ebcbc4f09d147bf5913398a222882f04ae8239cadc88c2e710602bde526328804228148201288042281482052e82dab8c4eb200e9a183aecb2aa41938a482b326f2c8959143f7548ff1571341e029009b6488f9205d863e3a4806f4bfb712c23d5c19598441a7d4cdd952be182184f13dd91d55446f590576097451eb12e8a21ea18b1ec2b4e1005de4cac83b1ee8c6936e16fa64b988e5f12f620d7039bed20b74456f58034637035d843f3fb0207cec110b61b9080bb91e894410261233cb6bf578bdf388b31a90c8731803245e79c31890f2959720afc8afc4bb02fa1bad3cca83fe5256de597994073d914738eb9cc8cb2bcfe0a3b18269bc43e3f1d2c0199197e3bbb39dbff8cedf512e111994ffc0ae28e172ca5d4eb9c442400eaff8a824ceac0c1202fa27e59f06faa7fae773d008bf9b3591a55461792b2af2a107c1a27a79472929779812d53f1f9c819e92819ef29a72b37e98ccab0d93115dded15b7e84b367f91defc9db8bae10d069e829b7737df65c5396e81cc24240af24261233087f3e6df6dcac89980e565d2d5b7758059b8994b8975048a9ed25373db0d5337773c466ed0666faee33bd53e4200fd53434da4792a50961906772a9dc44903dc854f1886d257dcae0167dca9a174dd3a76885912b8e60d1a7249d45d7b4ac051029e52920c7b02f55a335405323102ca56d4e2765c7f82084efc5ce39a33d5e0482a53d68fb14ce350bba18c34e4f7ca713df5a8cef340c93699fced5b4cd8c81187bbbd66b8db8822d7ec2f6193fe1773c48a4ab2be47a0972ecc0575cb4ce55b5585df7c486677b46040aa1bf1e23a50daf5c9f7f31c6b709abaa6de6ad0b93b16f155b62b6082f6bdbb4209eafe2a4f4ba6ecb94da29a488597791b3f7798554b4bdcff8993d583db6cd7b6caf0e9f0db95c434f7bbc59bbaaf889c9b45b7711bf7b3e7717e57d41efdc8a1d42781d56bf2a08f10afdfcbb9f1fcc2157be8e728940ec7e2e6c13862f88c9cc0ba9aebf89b30e4c9a85a0355c61a6cf88c077658a85c42157ae4e277c35e4725ae4f708338d37735be478a745c75397e3e35deb74080bb55f2b7e37bb8864faead65ad5aa56b5aa55ad6a55abfaaaea55b5b26835e4ca133ff91ea7a0ee49213efe483622b72c30c9c9d673c55fee966559966561e7b2b544cd16c6309994c343e7dca1932b1ea90ec405dd4a39bef24e3cd4cbfd5fe32c3348a2f76da1b1a2327aad74cef83985d4169a93c619c2500c77c47c74402c11c259e77a2070d6224772331c8bbb730e57fa4af14ac8c23bdaddb8fcf3f63a42dc0e51bae7ad4f280cf061ddddba93bde3e5e9eaaba76032f1eec296b8b2f5286fc2d94b0967a521dc112182b88b7b757950c564e285549cb968bdada358f758c7ac5beb1d0b6743603ed15d56151673d19843b7856ecbd439f929a48856152d4846ceaacb2b24e525c8ceaa620a7e069de44abe9af138834e7295f268bd724672d03801c4e3ab945b17667a9d7b28a57a18ae08eb149349f9773c202ee8f8869e725b46b9d9cbfd4562e330a74bd643bd3c53ffe28c1e67d4d6c09965c119e933708e0a7e79c9a0bfd45a6b67f4eca57492a5b5d65aeb2783c918febc610ca8ef7cf00af6d0adf7522a3d3bc9832deedc7ae87e7e6087c064fbccfa75d0c564ec85a060cf21b6c495edddcd6786884eb93c617192fbf3cce5e4fe746ebd73cf75fd613157bd2d7764c6b210e47aeba1cbf6090ba9bf6e5d89ebafd677acef681bafeeca71225caccbeea19cea8ef66b67e3b63641db17ed52a8bbfb61cef2c1ba43dcaf694a7d25d9904bca09a19470ba1b7d6a5dcaae0b15c368596b755917cb93f6bb6a9224b151a224c2ead66c613ddab583305a8fe6cdbc992346ba6424c21aa344b9ac5be57ae33a1e44dc76d239cf94ea275d7a62ddb88d471c81254586115e588cf45cd6a519b3eecc1d2ca6ba2ecb0cfb041ba8ad2b73eb13c5626ea4362ebb498f2ac73458f700549dcbb61d6c2671ea4572e3f222b181db0643d24a9ea9afa4993c532fb9a9de20f5603168c871f60c336563d374341b377e620e18b6c1f8607dd3371063584c552fd265dd8772d50b6b724ea785adaf2a97751b56f0b96606bba341588cb4555555b731c7796c5682be101653e158065b2dac234f722af6a1ea41d791dc78b5711f13246fc9cd5bf270b07773635b975a8d22576fa5fae0ddac95ec0a368e09a5e82c4590e15b293a291b96c0cd18c3bebb2360c8c6db922e1eb4f9c2b62ebd08c9784f9e3c2cc6453258f7e418d873d2a51e83756ff31531678dee422e966031cf0bfb725e8efc0acbd59a8e942f5c16bc104318c0c0c48b0a3b8d85c625869c411b11b442ee472346e217bcd0852eb8b005234d07ccad8525466216a2915caf8a4e791ad0e686c98e224554701e287865a8e0854711505ec45d05f602e9786fb7dc11f5ed579fe489d8ec79fb3148049864544405e75104eb45808288cd9f67a41c4434216c0c3d104499af95e223e6033e12c44f8e12f311b3cd734e4fc6552b458cc9cf0628e6c3cad567081c9d18f31133ecd00e46a399228e24b9e36585f9f86703988f0fe86296b4a49c9694ceb22ed0bd9ea95f05d0800cef79bd016838e263ea634e003cafb5d60b746b5ea955945d584cad145bd7acae39af39dde59cbcae0b74adfceea7e188af17a51511ef2ea915117fdd190d473c0ead5ce063516b8620c3d88ae8ec1ce6035ea05b658fbc5c8a10144cca8e94b323a5eb58f7d34af1f4a6b4527ce7aab4523c7669b452ac6e33c59b8cd0002c315b11f1f356ad145f5dac95e23f1bf06021f0603edad3b940776679db23816b45c45bcc87e7025d99e5c7aa2e921b78e685870dec9a297e3ef602dd9825121b7717c98d7fac1b9f2817491115581e363ef3c2e3062803f57e5a11f1376cdcd64c28988ffe6c0005f361f3753f102fcc20e724087481eecb5186ec4c892ed0edfc4162e3d745326379d8f844b1718f8d1116230fabbc3335431b256de6152fe70c9cb151e2589d3d1907aece9c9907f2b51a0e287128b63ed0980f2b5bb14a1827684828e3151ff5f035945231a40283337006f401fb81fb019bab63b048975a84c11416ec3bc909512b227e84f9203527aa38cb327c0653b01879114d1192e1e7b3010ceb40865505820c631c412bc58b5e47a1ce7cab35e04bf69c746755446761790d7c0f106f11e242981ec45d8678c973947f44f7783e04b48136900bd8456e25ec510ebad91319f43a95f880566a1c05672b4bdc7b503e71b65203fbb8b875c9f3969fc8f3a0ef78a09b813ee37e5eebacf179872d8172cf12f6a07bee339a576a601f168370fbfcc7733dffcd400f996e4df7fc73d2ebbc1ae0b2c79abea351eee70716059ff4862d61ba070b31dd622143dc732210051381d9845b9784f86788875e7211dd2304beca3d380b02b72eb91c76c905672a7718038000e22d07a265b6786e0bca3fa0967be651fe01a2e52a2df7cca38070a6d222f27c7a700bc657c1f75c8c33973d9f1aff783e7756e51f957f4ec3f3f1d0b8e70abfcbffc42d7778c587e8f3a24f9c59b986901a67b9e82c35ce223a0bcb6bcc9b3d9167df0fb4791667347f0e6af9bc191198593ee328ff1da684e82c67c1598d3fabf1bffe2df17eedfdbca07f6e66f3e7f31d0f25fb7ce5f70aa9f114fb4f6cbbd4622d1652e3a2dfec8389c05c03b33cf41d8fc6b52cd973e8336ef6440efd588c0ac94926f2b2e823cc474a16bdce9881c58c2e924f526ee6728a2423e59e793946e4c28a9ec931443365d339e536a7dc29f24cf59363c827219b36754c0837db6cf28ebe56b059c47a5bb9a4177d6ab9412eac6065187dcaa4189c18583c97056b02c98d5ff7460d2cc6debdce99cf3d9e5f7d02dd83332270de3953850f863643ae67d0c609945f9f7b4a281f0cf3f51d6f62d69ce953c3cd7a3c9808a6c401ca28a38c3c577c609fc73011fc0198718379062671641399d372413cd3a59e291b26928b3eb52ebcb801a34f12cb264de2442ad80cda5ca725b08b3e6543ae3ca38d9db348adf5d69d3352e4ce5ba36ebc8333eb3315a760e7b3992ad2a5761895c2e6ea2e0be6eb3a6cd48d977ce3b67c67112cd7c094a087b706e66662ce151acac69c5216245b2ead541fefa7e1a8aff73a06e3a1cd43a1cc14b45c35cef514cfc8f51776a140b63e239e8752c809bb348fc406865cd874063147030aa534782cc6e5cab9c1c9dd6e96d8d6fef250d0264aa887931c23d376498668e455ed08e9852ba2be5b83c062220582c082dc58424409efd56c2bc5471db4870a35537c5f7ae1b2ce99f422f7adc010988f9be169098b89404ad80f93098b8133b73e4991abcf8a9b938e6198b018b9001396c4121b584c9531f1b04a99031b65e315ce865c3247e2481cd9c4c69d45dad43051e6d42a5f614ab4310c610c4348c065038b391a79a898d3a6a631c748eedfc0626295f76a94b479a67ed5270b3ed624918285978159489b879aa9b6c9fde2716031f0119b29972b9b5857e6481c1b9812d5e34956186224256c8c610863c8127ee21c5d22e507f30dec0512c1420446ea87238403b3d69217898dc30a0419dab8ae99e20180f9a8c2884ebad42f028b8938e644c15e5dea9cdc2f02a35bd8f66255f4e5eacc4f3181c062208635883ae9acac3aaf89753cd37e26ca9c734e5068b61b40474e212f8693a6d42e076154f76ef1faf030c9b04bf23b3ac618638c7109ae6231f041e73274afb12bc310928d310c810ca4f9972591e1bbe478b4ab4f0dc47befd9676a3a9cb3bea3dfaddb03f14a0fb5e399fa01ad04d3a71fafb0e534ee5f6fe835ee7d7541419c185535ee9ea304e3dc9b8459b092eef8d127980764cda6e52c4fc14fe3e38998039c109aa9cf816692988c13422bf539d04afd1a67dcb9bc8269dc15f7964fc183e5b2fc1e08cbefdd2f8db760297e1a97a2c55561b1165895834e7a2572ef941958e522b927ddfb06bd435771350ff5b71ca5c6abf75d92a623e54db3b5513c148df64e47b4d2e7ad9d608234cd4e8884b40ca6dc7b89e81c2db7812ea170396b4e9c106ce643912e0c33df3fe2e6e8d27c8d4b449be6218d4b9f699e6508ccc37a4c9906fb3e717b12b6198d01e13de7dc7bef3dd72743bf37df7b584e2105cc8161bcbb97a59bae3d834e1a9eef3d5bbaf5f9d644a1a39ce51d96db9e69e55295db9e894429a5209c914838fb4b17ce5e2c3c0426cfeaf2af7a500c2846b39942a82b3edc3d560b96d2397346a79439a3324608332af33a6332560b34bb57abb900336de79aedc92472a5d45a12e92f959600ad30317aca2790f2094c912463173d742b03e9c3645e03da143dc8d83b5e0feb1143afb2bd7631761a8e87851eaa7036054dc6309cd5832ea9e178ff5c9745f7cff42e4f3531cf47a2589c599c91487f294b8ab3971421d8a9929f0d4acf23d5c73b7d1f68c9eed92737cf0a13f1f0402286adfb79ba5db360080c0a165a98c110982a41a114e8923c540a0e510ab21685444ae2449bfad502a59f447aa23571492629cf49fbd361d1270be08c66cb257149da42b92c2cec923c81352717765231cabeff62afc3967bd67032b457a72913dcbb739436ea4edb33bc423820c58b771c7899ce9094527afa50286f5eaf6e7b1ee5cef950873ea31e8f07745b9baca753e71d72a17ce4dffdfcc062d8bafcfcc05ed87a95af845878c2e75e9d6221eef3ee13c7e769c945e580cb1de861d10ade761fee8589f64c118ba9139374563daaf79091b5c2644ad9274f8c095aafaa620eb0b018790b6bd768676232133fac47752963e5855d984c852f7655ec479114a4a076ae0beb11332beb6355576badd5e3b157552f0b8b994c5c98cccc181683823900ebb84ea7d3e9584b3fd73525cee05bc3513b1786c54c263c98cccc33068439a03d6c31998ffb7c3e9f4f6bdaf96032f3d53f588f9a27ae289787e60a5f16eb917de8fcb8fc286e4ebaaa874a63a873aebbdf753d88f9b8aa0a215c49a24d911b16537155fb61401a93990f92480ef0bc33016bab0a62f535b66bb453bfa3eb5f28545f61aed1d1ebf285c9a078de790a3e2b4c78deb905f2a92226f39113f3e19cc464eca4a13c2726e3a117bd0ef0bcf30a03d281a1329deaa257e67abd85f9b82a4ce6a2984c4a9ed81215b786a36232a17c5df4cab45c8f6149b45c5f5c19f9c22c142c86c9b85c6bc5da61ed591decc7b0c795911bb6c4e572c519915cadf8b088e04c56cf0abcccdbd111621fef2f019cc2ea3a04979f61fce4f9aaa1eae7b4de3cb8e7cd88c4dc5c19b9d3e9743a9d4ebd122083721419d05192c89fa334b123377be13d197df1c299e8b66692b7351c16ce68d54cf2a12b5fdd29f128bf4fc734d47e6d3aa7943142f85e63e17cc0f7ded79591a778ae6740243e954a1189176ca67e854eb00d5e9e22b95ee50c6cbd9503a651d7fb3b129044a3b05f2041daf4430696fe01b29ea874ad35b5452c9d1a11010000006314402028140c078462c180442cc9baf814800e8ea65a76521a2a498e534619460c2920020000000000000851de2194371f23b5d4780436c6d162a6808f0c5f22a5ec12efcb07bc765cd60b216612f4a8e7efb7db72a8adf378b8154861071d59546cd655ecc013546dea521369002b92b21f9e1e59880a312090fa13a78d10ff9de5b6a6667f85887cb43d5bcb1c94fc7f4ded8bae4d12a25cd531ecc0843c873947e75ad97a2fc74348cb7ca6b70624707a372864a30e4d4cd5988320a054b25c70cc1619bed109662c802c512799d9c6aff4d3c828147663124a3cd1a345f5703f73f60b94ff5bb131bed781155455d17006da196e2ef36621704b3e68e3576322d1c87e6f622eaa01f03efe89a4e6c6c7456072f919d10686a058796491fa073972adba3f56871eba531e30f759a4ec92ac465499646e655ebabed9a5e102f3e4d3026f69b13c014285dcbb780558514843cd92e0cb9c64661992055b651a6dcf209d0a0489394c6b69ee6db969e85a590f57ac2b89ea9bdd8566204c05496b40c65c3d362d8f36af095945d820c25ef27c38e1aebeeabde7d08a538bd2aee1ce2395628ef1a5e668a41b14f3afdd72a03b183781729b56090410dfcc65f6122d583a733fc84b421372a4c308cec2d602a22e4406cfc95a8ce62423147693f9541dc5a8d360aea391a79bef03b12cedd32b4266ce7c2c147b7bf71d191fc8eaa0af4267afbc5c534ef123a4ee9753103a7a869a258f547ccbb62d1d3f046c6294fd6168db6a59bbc0d7040266230e24cee273ebb7570e29e36585f93d6eb8258da5da4d0c6c612e28461110a3228f49070f72fd49057ccb570b9908d5edb92699440ba61de48457dbebf392a994c09ff172502a28c1109c26ffd1a1b0d5d3f70b0a1533fc0f0820e3906caf3bf2ce59b59fbe489239359ec7a12efdb2f8a659406f96a43544cb54d1764867c2715f9f8c025304c937824ce3996a891211371894ebd5d410bc397c9699a3747a022432d894f819052ceb318b6d4704c76dd8899fbb9cd360d6c2609f79cca86cdc466648dc2b8e257fb8e7dfeb390660cdc6094104c28bf515191b1835dd4e8846106c81c7ef67ac24e4b3a0df6dc2ba687314367c248a9d573475ee7e7a3feb44bb173acf91c11d5f2d9e20aab09f0ee2ce0002ca9034f003f8eaa5a4ca20abf6a432c37ce29ed5be0eaefa21977b812d9f565b145bb38e565f04d882eb0d6aa2aecec1893a6d28d8ca3390cdd41ac090d4f6835ce447c92cacab1425eba4f0d1fe3fde39a1bbcac991f0334e8ed8e35b0b825326b17701712e4cc41e5cb869b767889fdcc6ac65ca3758c0ac1cfe547d05567c873bc329b418c81f9e7e92d9d789baf065079ad83de1ca7d09f47fcbddbe661bb1478788fcb67f050d40475737ec2894b1846582a197351fc20ccdd37a597dbef3f9573951f9722b21926b3da757a1afd656944cc5e605f793714906d0e81d7782f3325c0de9ffe2931b9e19755b806a09efe2a589f6756de131c036661c1d9f02f691f77ca08a8f5edc3fd4da94011a1c4321cb77d9c7a576bca85494991ad6b9837469124e00731efdbb5042d6f168a2c5de42a56b1e1101fb60173d62026aebb49bb70386ae763f63a7ca60dbb945a4d68fc6d73b970766f66667fd84147a6710866e0af0f9d7a8635520e7e99b4028550881e85f029c0714d33df77d06280b47e3ec12b82bb099646c9e8f5e845d54ff5ddf943d00405bac6c97a052cbdadfbef133bfd16f166047ffb5ea492878a1f82dccf01dc2d5e16a3a1c2006ae0bf2b9f01dc4e96ebd5530365c12bfdcd57b1f38759fbbb85e9d11bebc0fb0fb8f50d5e4eee64789de7352aeb4a75747604247ef88aeb2138d5b04ea7ffc768bb39c0df725128c82e26de6c19a85a9bebe383805c7375829e855b09718daf6b0db4adfd5fe5c90a718bfb4bbc900a5d11aa22e35c662e84bfb1823215c2dfbfea82283a5a3d54c1c142d6356b23f444f3330c3965a0cb845ffcd37a5d0e3e673cda31f699d213ca1cd3ab16ce2db90c6c1f433e0f20876390a4dc43a997700bc406dd069a7f86aca1bde3134832229a1acdbc9954037e3b954d541ac5d77a4bb5e9f53a23d703b648de5bddf0528c188f59c197cce3d7756fb9e15221a73e26accc1d2721e1f10ad2d318601dfa4e8309e2a2e9b25c742219a3dc0790a1799806b66badd4c7ef72ab222ba4e36883617c06fbe562211ba365fadbb86444c9ba820bbf66a5f1158f71a3278af53d2e7b770b01f54eb1cf3119b5743708430ba727fa584d8c84dcaca7bfddaef101c1cd52efca7e5470d7af06bcaecab4e704afb860688ff50ea92d4ebcbdf306571be00c8fe6b85936862a37a291c856d142e2aa5a598693d9cf97c044c69ca7c962a080b0dac5961c5114fb253f0c00627e047ca327a92220af97ad6dc65af6ea3f5fc4e0fd7997d2150227f145d24505742124eb23ae15b04ad99edb1cb5659465f4720459a2e811450ce97e43c9c2202ad6999ecbe77f52241bca81d26083d1cd6719fcf1b828b124d56277be48344751f362a679b94876967d53061be6542bbf4da5f7ec3ad672e737f95a7bc879be33e4a0f6d8ce100f3a4c8df30fb72fa7532cc885a10f2c5ee87e95000219b23756dc09a4e057d405a3ee64ff4edd8b1e3cb855e7269714b5e149e18de5efe47bb4942b06fe9f37449e54b1b0dcc3606bcd6a6dc0ed1b71808be88264842d12cfe75c52f695da43ce1953f6bc64aa671ab4e4ef6880d78f75748fe100e597dc936a2a6b05770247a550719b4f1cb5d09928e4e7fbf19e8c290a73ef3e6f432bf15d954a007f6d72afc1c9720f9622142163bb2a4931e3025c39c34aa414a2cb8139ebd0a39d0c0dc71387ab46a6abafd3cd9bab30409b7bf88da84241f0effa3d43cb5071ce060aee1ef6c5cb12396e181c7fe0e8de62876e15bef6ec7e41a3d5052e2422292e59957e90a2ea55341f7127103b2ad192d8bbe651a083ac113e770a1f8e1d771d4a05fb81998fea4e61d04a193385a71f78a3a6eb4ba771af4599c990cb272934c941eb358af46d7e762a5cefc40c59733550a61601663fa5649da88b6a0f85c7a191a0ffce68153607c08a469098bc9c50408af2a7625ea47582cd1d41c816db1e183a0e1b33e00142688012fdf460f119c10e4aa72eaa31470d32d56eaa70ff5bda1ada2fbba3406db9188f66c3d1be535a9c43d0268162d663b400a7c1801583f68889106e104dd5429e7a1e2e58becdd0c6763fdbb39e838ad31e3f19593414b97303e429a16e6e329ccd22e89065f7ccfcc6c09cb4600b97a2dbfe7ab64dc3d0670509022a0cecf4babf8788e9160d8accf2e2f0f78c01258188f7c1012a7f265a517e30cfe4d1f53e460f03887db567122ee71d8526c91412797537327df7e02e3e31e469a30f22047b97258c48c7576bc25038e93d18068d119e8668430db00d2712d189589ea73973485327b94f5036bc8cd5cc804d01f042abeeee678e0231236e047a5ccbaff67ca894191c03567e7e6516ffe15434b238ee98ed6e6a6927c18d0a581dc3460f64564a4a7e08fcb0f0c9e84132b3e9f06ccc6fa57232906e91e463cd4270f9e9e8ad56cf81e341ebcbc2b8862063064ac309b10d695e6a9b64d31712b6c4a7444add06714f06ecfb0ca6e539f668dabb5482a0757f939245f8a6ff1a4c02e73cf3e1a4e20f7a506e32e8ed22bf96630bc3c4f62332b65f5802b4f0c22c92f5d811b9ac4422c2c5fce8caec81e4a23f641d4971973b516d024514db27bc24b9afcf512d489118ae1910057e4329cbd52493f33f47a92490d9b396a265d9e3443a7df3f08240afd30ad3983a18d6bb656104f3025b9d84aa495c62a793fe0c86cb4facd362bdd130a7bc4cbd3b24f1f75655c2da6618073c87a1b8245ebbe4697d5cf4a937ff3efc013f128862ba818a3ca40a908506d177ac652a1ee1f4563bd7c41aea60cc5b153fca1407fac22314a466a2ab85cbfe2b407d23def16a8a0ca6d6b4becfc5dba54cb7ef71c3d5d1c2cc31568cc8ac91c1b826177a3dd5f906765f0cc2dd7570aab3018ab2e3fa4d27c62f83728f1d75a302126ba3697d1f134dd5865f2931959b9b014567221a359e8e1e9f5f945e8d5fa5d4194f8c01a91747a541ed890fa65f63aa0bdaf6078840e441dec6922b53971502b9a3c406691304dc552a4e5dffc2ac53f8ec7ea203a6d9b55bc265dc7a7e2f0843060c076f84d5dd9cf6ec87424b0321b5a84dc4f17b6a26a8f062dae7b3965a0aec0cca80fcc8bee634ea9aa06678b4280c4f28c2bc4c9b0e9aba7e61159f144b6050ff90ff178b98d0c819dd5eb6cc5544cb3a817fcb38e40321699464d5b823b55d2473ef13bf8da3c26981518b1d66af02dd00d3a17e3d5bea1187446ab6802c3ccb1722ad1a4918a76b07b8cfa5a4cad4ad5b6d2e46535d48559431f61cbb8a1a62605a7645961337991d294337c2ec83a60188b531a2d7e9205e3b1f0237fa48deec21c6ac1d3e41e9195283206175a8018b6dee25303020bcc9c50b7dd7f7cfd3159ff3dfe7b5357b9cb666ea8b0f788a443219108cec9d6391a0eb27fd10314f5ac6a886801efaf6c907aa1a8a67a63accfa54ddcb12f3f540435d762b1b003957492423d982d0a1522150699dead2223920cecf94d636fd4db7e559e2ac07119568e7b617b313d2822957a3868692f59d6a1a0676dc71b169965fcdaa09ace9df6eb69669ef58655a925f603ec2c49f57d10dcdc31789549bea7a1e2198d4c013e9c8a2671c5327fbf4848de1eb716288e0cd60d91567cd57260ee4a3efc3ec0eb028ad3bf5fb1f6ed82a103012a7387ae517607ae1aa2ba964655b34323a9041063561d221a5b133bec75e71a9a544a5da089726db14cfc377a127ac3c4d3b985c9306b13db83c3962eb3b258c089d16f3c6edec9c7ac54dc9ba088005fef3f227b211a0821f510522dbaa38ff1f7370b2745ecdac5a39f60054548df71fa751a7a68b0dd6465c589192378d412d1222b5a4860894d68512f1244d9c707517ff40bc87acb64ace10e5393db9b814ed0e3b270900c8335a0c1e1fc1654c00be5f8471e09843171929b25cdbdbeb079bd8a4b2f3db27e8ebbec1beed62ea4876ebc91ec52ca8e773b6db21131910c1c226870fe911a1d35a3ee9390444434a42d77bef9b691cc7572b0acc140afdc20b1dfd01edbb9eea3106dad2047620d8daace8ec920882ab60fb1fcf9766f9b99b96a1b7344465ffe9efaa7e9946a232ff9e3e8066016bb99fc7dcc42c7bb1fdcc7f061a4c86536fce07b62fd0ab796555ebf6bddbb2f6e5630e3357c7eaf156e1b133ce017effb70c0cca6b98bc5d1577cc6527d73eb157b7199fd59da733e1be95eea129a31a5659a60e9e1e5a125c3df6ae290b9e3e97c33a3aae865f442965ca0db5bad708e9c4ff61e65d181652a2498ebe2d773cb4f4a4920f81686e18552f2f01ec606521f89382f0d5edab366af5d6d785616670616320242ad16eaaf360b28db0b708d4b3b1a574d65f1b14e9b67fe3297720e763a3d1d511fa2f1bf035040ee46c183975ed828450487d98c94aa929d5eaf0558088a26330f8b46a4fbefe207fbabdb8defd66df2ddc91928cadf1062652abcad84eb9355a8e41df39130f5ea963901975df6e845e08d24a8b20ef6d5b9a3070ba6e7193d29c242d4640cce058ae6bcedcece858e5f2e604274b1d5d484da9727a96e698cef30fa6bb1b458be643e3b94592cfb0f767b78cb686fad5233d97aaebd2a4708c980e3cbf4d0316f9f7e2daa23ed703aac192530ef1ae27469dd8f5109733aa2805acfe27f6387844159f08128c67667626b3c58b6b352814771847334978075d75a75d371db7c9d3047862dd59707d3bb0d3f13b2d69c1631b2bc50f555afe5030895aaf50e6f141bdd08361dfa05a0888be88e4a48a216601bddb3d633eff49a800d6acf69703f114f5e6b5192684148d7365cbcfeffbde0c590ba6ea1c2ded590a3d0ae629051f0d865ba612e78cb716a5fec391cfe8109969efb9b83aab5664372460d6a167dcfa0856650a4223d615f287ef653184955465738d0d32f462602adc4ed0b9dec85e361086b6855f58f1ed1824432b440970580a75fde8a909b29179c4088f7ae3dd517c913a8a2bf75c080dc468e79dff1dbe2c43e3781ea50ea8281858f94ef83c30fd5f8aacc132d48a0728371006466139510ead79b97cb4e72a3c43717da0dd74d9f9004d3612b2e5ec29e0af949ad06e0d3a7f63b2a4b583ba5cbd6358f3c4c10ff264d8223cc62a7232d98877fad9f8b220cbdd498629e2d54ac7a901777288bf2c990958a7fc0620c46458b742c6a54982ad195315cb83867ee37fc3f857ef1b1bceb93b7da146c4d446e20322a5bb4f0007148775544a0a30ac278a91a9159779ae49169d68a00baed911636e23ac1bd2ca66641945589bd71f664c700680b28e20ae0add2417a9549ff377f68efa193860caf96940ac78d79b1fa0821dcb8ab27da7b1bb480fdd037dadb35b010652925544bcf75c4c2694988afa7ffcf05a1848351483dc524d277f85bb3d240500e025923fd92e1e09810069899cbfe219a029b0901c5c443520532ade5795ea2bb78dc3060e7b42d2697eaeb679c6be9de52022947239eefb6afee81b9e426dd156e78e4585ffa798706aed36fad455298a21febab8dbed59cc27717a5fc586a2c0a400217206ec33a18f1e6b262aeff1f390d2ed2597d0c03d9ff9ceb275133fe79b459842a6f8bf1cd803f4ce789dbc895a0157a958ead98e48fa02d3d7aec87f688d7c473e7c7e012c0823c1e73eef5e67e3f4828d879b8bb3c58185de9630ba2a643612e1e15c6b2e2f594a79d40bb81c0fc7bb489b937403cfd0962fd85a326b11ed12b796022d85cfeca66438e07de25e20df4b32491b337169ad23d28b25bd0e44f2fe0af99a75ee3a9168e6a1bc60ba3d9d5b234442a879bdfd718ea3adad84c5db32956416261ffc711c077c0ec0c0841622d78963a7a98dffe8fa433f52ac0da25d5da7f54e28d48f0b6ff6e8252fe524e48ecad831f51e917f25ba06e3168babdd7236afbcb6976ccae227d41bf93ffa32b5c4b7670f18ca05c1415381ed746d8733c0cfdcfb66cf41cebc17f0fe9578e42b013e53f2a20e041f8938b0fe8a2fb557e0738c87e78ce817c16a36533c045d23fc8f7da70fffd2e70fee1e4fc3bdeb3ebc4ca541c896ee9e5bd298b58ecc575c14d80104ad83e23f7f822ac290a80a5cadd44981ce84e9dffd2fc002689b1093fb2a08663a3cd3c7fe8fed5f1dc844ca668a33296e4a390c3063700e3cb9d4acd8006c7c80e258c473d440bb6e3064f12a12a6d37e85817988d3a20f75731dcb888c0faabe52f9c45360f329e89b79cdd8fef31bb257e5ae2509fe75d3d00e8514da646c823869d6b8b5fc129846231275783e4b9c3b10c7a31d8f863988ee18a8c14eb1302db7b6bfdb2c96dd0df523e0067f7125c009e121ccace4653f65808d623fba920e7bcb3ea26afd4ab833f6ba56d79871ec3fe4cc4a76447e7a3e9d2f79706db5e55e76af8aaa88e16552ae2d5c3c31b3a025706c42b9d159aa260a47dc5eff9c014ea71d41fa1c7cd123fdd3300b1c9226a4564e6fc50957d4a4601a6c82a6700c8c13000616e50c9bd5b3ce60c49095a280bd0a22c8e760dfac6ec923081ac8a3dd14febba90091d8072ca3eb63e38819f2a871e9504a69e000430995e25e0a31824c6e9498c65d69a174c9b2ce7e76b15b73ec0729ae527415fdf48efb21b2283da80750cb76d164c17512700bb100a34e422b9984a3dbff4e8db7eddaf60fdf7c942e38dbb12fd10d8d5ec418270509d93a2bfa0f6bfd6790e8acb4124ad05837c18d0604fcae7d746d845cabed91eb439dbe25c8cd606b9dde81ac34da45c99c0923b79088c4ad4be9fd5e0c5d3c87cb26482b8a78394aa5ac1f7f50e6e10071f9514387a2f2c5cf56ea56f0e1497f02192aee71e3ab8304d3a200c4b9d56bfb9ae22e3803ea42966190b4fcabb59b70977d4cbb3627b2e8d54dee96546a7fbf05cb55fbd099a89932f05518ec9150b5c7399e0775dde9a7d2420077fe1d43d9e50021a195ba9e66031a066bfe8935057160fd20dbbefbab4e9654488402da67c603651946dcd4f536f53b9805e4170a1a47884f863b10816334fbdb5d7e762e62b1d72bc9660f02d02ceaa5110103610349550e9687445e9b1b98126dcc8a32429f796617fa1e1c7aede1fcb6af09f48e2af0ebc917d2ad018eba8e66afda236b31ca5de69aa84066827abd9a3264bad0b58067029c90a2a8d8a5a85a6d2616f097bc0e41b120208f32807e529575a48bf3e0054a3a94231503dbedce67a1a9cfb7fff1fa2d858b2cac2804c0b4edbabfc9b0a58978e9f6930fe0d54890e1006a748927db72c2e64d36374925c4766efa9eae39541243e0142af94d518067fec00b9f34e915be4933e31bff57dddc34265773a3e38c90a43b35aa6867446d530e0dfafe0cd02948b618a81f20b3583ab185a30f56f577c2e8d9c5bb7c5ffdee48851413e6aca587174216044fd6fa0ae81e7811f0c9f912b92be9656158e24bf8911cc54b8b8b618d8808d4266674860211855662fc917967416a906bc9c307825f3fd21c6c182611844f91bd28b01ea455bab788d9df682d310f931c89ce472bd835c768a549418f52b3839c85d816e4e9c410b51fdc3831fee80031ce0607d972fdb90a219e0e8b5e0db77a3bae93f072bb507fe11217eef4a056c3cdb1030a7078de237f4fe6f5ddfe552305bbb9ccc8b560a8af5f46a620d125cd9e013348136614bb3046ca61e3067dda4816201398d849ec6a85e5f4567bd347c62016191ab1379f01478d80d56c0b13c1b5f8674a81b5e6d9ebaec36bb0a55ba635e27180324573e6c233291895fb0676e0b1564fe0734a54fb66556f7f4219e3b980738da0fb60e635365177a2f0f111b21022c4b5d203affe0cd866bc80bd22a149dc5e171b88ee9202ff3bc582fdf299387507c01970bb7104dc506ad5b3a3434a02851f8427a38b00c74b5404762003c5b92ac88bcc45b9dd290a440d319a5f0f89d69017d924dde140c19a78e52f0757853ba2ba19b2bbe39ae18650deaee60a6b7b5c0fb45837a18d504ffa791e5c0a587336c17e685ff0e2dfe5460abdaa36fccec2181c1887c251ae374a5ff444328942a4dc0b565772fb1dfcc4fe32c11d4593e7e6cffc6b5ae27cc26da2c4fc686745436de886c261c374c62bef6af5b3e8d00b3db95349c95dfcd1f331001a049d5d8b1b1ed9c63baa5a8822f710f01fe173429d0d03802213058aad21301bc860877244f41066bdbaa4ad2e39a4b902f7e3a0a523fbb780b880ff07a0db03e9052abc496e5f1c8191cb00258be6e5c245fce75b4be094da92da707ae71ddccd20a4c71e2f599a8084a75438bc45061e2370cb66946ee3aca269f32b2fd1ce998f447e0f19436b722593246080edd0c2810a81fb5b3d7f1e7b93eb1c3055e5f33d611e95e9e6f8f6e2e4a6959a19d28acc6e562d02aa447749722d7d75ef561e0ebc096679b718b52d4ec85b8379f0ec2157514054d2d453a23e819dcdef478fb981d49b2788116eed546f8653ec53abc08bb3b3a25b8f74d3805c60e6529600015c755abef5e6eee41bafa4a78ea02ea5972550b32af3336001310b9938b1558995e18a99f2cbfccccf2ab29e14c02b9c56da1aa7fce175370d1bb5e6221ae2b242faee38e2e62c4244ef869c9fb3c7b55eda0880c2c61323c94ecb3eaad463ab1d1340d23b9a0405e407ef41218c00220361d56f304792d06dd79e6915535b2888e417845e9bc743585be624df1bb92de463206cf98ee2ef8b26384911bdb7d92ce40cd767162072152d23f1f7fd9a614dfd4899a85ef7408addc6fef4f080620d5f18b0e5f638a979ca2f0e69c777f426ab6a17287f0e6fac2446c43e94089207b98b2365b3b80202f1007ad2b8f8f3a7f4edc2ae0c87bb776d9e2caba6f884fe79dc70e0ac3e721818fdb1aceae3daa26d79f7a5eae2af675a05e6dcb41e7ce5b51fa6295361421cfaba4d5df1463a9bb6a5945bc30a1c2c760b83f9bffb3b97934bc4b313bfea14121a9462d4ed2e13fb2d740309f6c56935dde33eb7312d42ae894b7b10222115bef7b7e92a3ab2396e60e62bada8ac09f5aa4ec404185c1b016df237bb95a2a9af1b11ef49292322beac60e579bf9aad239c2dd121991101b5d2538873fc8b5e307394e4acccca6008f32c84539ff4944a34adc96bd8aadc631228de25c04ddfd3149ece819803b4d791ac3376e0bdfad57ecf8fc7666f1c3c7c422b3db4696cacbe779268276ce2e086e250ed4cdca4a8ad2d1de37a47c5cea70a7d2786db20ed2bd056738f878c791811208363b045f30b2f5fb7eb7d005d3abdfab3afe177865b4a85feb772da3568ba57e798aeda2a125c663bf52526c398c597ef8d9aae6bcd8ba8addf070e7831483879d54339ae2b24a9a89b21ff1ffd01233be7726c219ccfd76318e949990ec41a695ed9b569ac6ca6d4765a936e15846d6304a1abd234ed2301a06cc633fed59e7396e940e077b95844c334bb2b4d1bb6f45c51d5c8cebc774ca6cfbfb3d7ed56aef70de671ccd77ab4074118fda5f31c4b1fb08e23f98306ddb5ab27fc37ade21ead73a39c0c4701c2e882d0a9c6e4de177029167fe5651e2887a42db80685f9152c616aee6b5ad8fad25111fc02e94f5f882773a9d0a3a80b3521e2581f67b298a8390f23b9e8ee10cc68e378af09362d75084eb9fcf194bb7add6d6ffa2d1f950830b122c76575b8f4434233827791b218d4fad0cf90d49273c3dc4fe9e46cbdce2b9d3cdafac6a2b078f2cb99aaf1925586224bae8e980cf3a622462671c7e0eca3a506ef68efe90d1a75466fc7714b346b51d2f30cc282489b0bf4504bcc26d494b202f6d72707c9332b81afa7773c8e5b1f8b81b97ac08d800fb07765095828ecc1cca8b1b3575ebd5a48f8c08c8a3df87ce0f427626f12b291aeff20d5abfdfabf00aacf39a257cef35706194c59c9072c3a2ac15aef27e9534dd0decee267600b5682cd2a5c0949e7c1ae4f74f0a6a13392f45f27aaac0a040e7c893bc59ea6036e8f3ccc845a77aa34f8330033dd70bf15386db2763032dd4a9888e4871cc7e5c0fbb652d304f9a2d857f734bd85bc005f669e30203c9cbd5957d0c62e0cfbf843f248d7abd8953f27bc7880f342c8ad761ab5d6168f686e2fdd9c2620f4cd07b0745f840d8f131ee027b73e3d8b5e9fa79e4e3e285ef19478a2ea32a2f6850443dfabd0ce77d6f7a986d5b3da54bb5fe13453704e8a38bb43489ed833190365c26f2375134b57aad444ff5a957fae6e9ce295214dca5cc9a6f5dfc61f98aa335b92ccfa990d6120ace76927163666c5b5040af6c19cbc7e0304b9c79a21d30df7e4143e36390f555e4ba11c27e9c5cd26d99e275284bb0d7c6c718e80e45e1406ed1783b1d90edb4309c1657f22a8df67fcdd3d3a74ee2f5f2abee1d25e63921319ffa1f39d58a7f0850effc751f1e923f238b06bdabef3d700b272c33fc953873ce45fd8fa60d2112d3960923057e09555936fd8aaf6fccb5324f94842dd8324d949377ae2c72fbab454b9f9455a6909821c099adc5491f690a573fc5f809d2c8aa49b6e467978b036ef7e2d88b3469d2596c11deddf16095a952818aca978b9c215f6bd52144e4827e90da98cd61f7c3745a8cbc3237230c4589250ba32c7b07ecf88ecf5a082df990ec4d9122ea8bc146f6902f5ed2cdfd4cbcae8ccfcffca083f77d4e1e4963bb3ed7caf2cf67d1acb7757c6eb94fd2eb7db7cfb4e60446d0e03db014abaf90694dfa56dbe561b6477f41b298c55c126deeb3a65409e3ad576b132f8ec823d268d942186aba7736dac5c2991f076b2e92af265f821f670bfbb2232e2471651581f23e419719402d86e49540c3733f0b479ee944e4a95a37656e60353672720b201cb973b22dd868d169af23d18657d0ea580f2e316dd4bca7d122f15ae28832ef09fd4b36b8462bb08368dbcffd9e702c561890dd989a980cc3c2b25e4eecf4ab80bc9031cbd00e2666fda5d61fd30ebfef9c2cb0657c67830714fe5ba7ec0eedcbf4aba0ee5b836557ec18ce1d4c6150941369d257c07401cb1e015985de76ac5f5391b3607f257dbe5d8d83847e735d00670dbc5986a0c4cf224c7dff16c4185453ce00b432e6e94d418499a3c6baf5156e2af7ece1fab1ed72fe7e421584ee657a9036274209d72f054bb4e117bb23986e136e9fc6adcc4444d59fc671301d04cb4d301e82fd29d85c82c9192cbab5c6c23ffb0e3e04b549836a1b78d50b70fccf656decf6f54159157149f537a135d64badb1d0d04b716122fad6d8cc5ca62c2922958146c55d4d7de85d7bb832a1c40da36d488481b233a4cc7a9f6524ae1dcaab2aca144d2aa9489bce2e4599c43ad558da4dd530efb0ebaab13c041d04ac0998b17c52cb4073d131d9b91aab19d0d249a6aaf655d259a76d7334b1c7007fb839c2bc64d0d1f96342ac283ad55889a2953ae8dd23c7004bb88a0a0632ad49b383b5061ef46a4daf8c95876b61bfa2f1f5af635e2e32cf8943a41a8b3f7d409e2b76f13bdb94053215900361d66eb455daa8c632b5aaae67d3c0f313118b97d89d48a51dbdf39dd70b8f2e8e819af3421fd3f65be2ce49554d55221112d1d931eb974bf6a2e30872acc3f49a2f8df0a41635233a8bd9c62e07260bd834d19a7fd0e69196cb3b8dd98c499a26bb37ed7d9962403a7ad9dee8be079badf441844d6f56d6731c534a2abd9e061be9a0927ecdad0b7449827c47814fd961de3859665e5e592ed305d44e6d8f63949619a9b76ba3e3e9a5221dab4ea1e65aa98d671a7e09cacfb64c901a40e9512daeabd0c8fee1fce665cb95df8ec8cc5e77f287c272df2c1cd6f25251be5e0616efe58dc5eb1a81775b1bc813007a0c8be20c917fc743fb98e1f7a4e438fc078cce50e76f8591f98e59e183535355d94fb88ec1c152e8885bd0d9d8fbc00fd5ab46c17c0d1ba08c064b7042a5b85c747ab561f2949b1b6c7d7b7263ad669486bf7ce46bdd1d844cf6cfe018ff5278460b474d5b2cb05134b746fc2c1845bb1fcc6cea310d614651e9938ba09d1cb40cc0e595471b6c58a10f92e33ead0f8f9d283a429513898f588153048c5c53ce25a06d41716b8c4d85be1ce30aa4539d269e1ff03ac5fb04647d37fe6725bcc94e778440a5236e906507f181ed97c3e79cd2b5683f9e491769bc5e53b845170c4d5faf3d3349d5f33c1eb06a33f9099ff85fe7b65b1ac4f4b919c5c407ba42f7660b76bae4ea775cedcecb56841cd2109fe580449502d07b22401e275a42d4154ff403f3d232c8dba6b97b4f737476575044eefb9181772d3d097cb19206ead53b8a603c28d34ee69c9081831ee31d07ba08467cc970b18736543336aefc9e7958ecb4dcf2dcf7bbeac9808841ad25bb9b7aa938e45c60ffefa1cf16c7624a00d2ebe466240fd8bdcb5dd1aadc38b32a6c9eec84a13cc698877688221deacd5b7107be3da46b3d5f852a59b6083a4e1084d36ab5d418948b6a7ae3c528dd37d71c96fb0c3ac326e10ec511a3440154c842c97dcd128adcc0d242ee37f3e364b739041fd792c0eeb130ba2796e5de91c43da6f8f6047bdbfba0c5339c52e210fd59dfcf9c634d3057d08bcc4b53b776d102eef416967b734946ec40c4b3c17d47e1570db754b2265836705f9d6886b1822d2b4d4f5051d996269875e1ff10b41c18ed79129d341394a7f05c1f8c38b024dcfc25828054c050416eba21f439d8c812c96cb18c703320b1848788e16632e060471479e910a08681de55a37f0dc05ebbf6fd748af4c543a203bee7add07bf72f478c03f752bf070da493cf895be1a3c88c98b1755ab9b5e0ea354213e1a8620ae58250797382bfbf443219004858e797785d0c68b9e7aa572b8ebdfe9263f1f3477ff1bce2c10742cc1e34bafd6b99586993cf2db4190beb6caea173d959bc108b8f8f4217bf1472cfa97030be69155588f903a9c0dc9427df474ee0776bf3ab1e178757ff7d2995110c1bfc8e1e39607c5b3e92edf066b8c59470fde914a368ef391d6619c812c16928abb6d9024d9ff1017e75513ee5355097ed24387115c9cb6b9b5ba7bf07df315d88cf92ce112d61d682c3e375a8813ced69ef66fc84750bc236121cc496a2ea5a14f9fc1874957fbd3ae5756ae8af039439a0f76495575504346625d0153c1fc97ba054db8aef47da8f005eadc804ed8ccbebce98c2ab5301f494a520a257c1bc553a1ed706ad40a125630b817a6c13914731d96bbec3643ffa0e26e9f357cab62bb9101f0f68d6a9e6c98bb636b95c4f05e4891889c1be012bb8c2768d657c65cb7f1ca9aa0d2462545baa52feb8b3769035ff942d38a58a7999a452503dd2d6a7d4e5cbaaa8fb61f53dc4d5685df37df370c3ded986ab89999939ad0a5dc59686f0c31eed99722f987e96edf1b3ad469b35330ce119943433597395b688326af61b1855cc57fe10c13c60a5b9c19173dcfa813c68680d9409b058b94e6068c720d4a8c78255a57b6b0701f4526c562d9c73e943aa9e89b574b6546a76abe3a6c2f8b8626414f2d554d37163f34b4f2d259e3355179ff1f64b0a4d3bc724085209b248183c21f06aa50cdef104a9dff4bc9143fb500cd7571298c65d1db2f758838d44a70f8a3c60c2ee3a155668ce62e0789b071cfa272139ee3e4eb046eab628464b9f2e8c3f8658ba3b06baeaad3af68c9417a871e88d4f1534144e8cc674755acd06ee88abc8fba8d9210f03ec8589d14adb4803cb819e5d04173ff1c81039e724697b1814b9ebf79889b132d45ea6232656ca30cc7eaf38f1a1cabb6b8964be30afedf1db0cd56d13f515e5bdd6fe82b971439b70d4481a39d71f6a8f7f2de635059f0b45ea5287a804648e9b6b1394c92b2ce1c3bbda6b79ad24ef38eecaeb98312ef573e8cd1dcfa63ef20f33ad97eafaf457f6618bd3df193d9ec7690728b5036b5cd4c497ea01837a5e8730b7f4b4bd21a6b6b9c5b085f0e72854171c7b4a0e6d011d5f4e59c0a9e17d5d1fe39038cc35eaffbac5442b2730a839296c66097ef21d372edb5682906100eb9b846d2851d773ca32520175a444abde2ab5707576ab05f7dbdf745c53559f2d566ebaea43e0fa4a90e45fc90cfd2dc06399eec287a3e7645211ac4c221000ebc0647300fcd411b24b182caa20d968142c2a00b2051c4e75005938008ed1620de8b0d50c412072664605746f633827dfa51745930793c0dd92310b3ae877cc6f573c4ce0b6ca8582cdc1776ce3b7dc38d26746bca82912d787b6d28c60e230b2c3aba63081777129f07002470be13aa72f9298a035323508d29f1e40ad84e659b9ee4fae338e17b261dd501a13bab3624fa5fa2f1b73dc43a6ad19d6793078bd2460745939cba76b6ce6266a1162c224b6cadabd41eb5be7aa511e9b285544ae5107141e33290dd08a565eafe455170aba68a45464eba53fcaabfa13ff27758a03b47baf441a387ca9a9e3073e389951ba7aaa30c84311e49fce080c85285117f9f602db74d9d43bf15e58b013043620fe7f50faf7da0d06fd21e8c441e8546d2685beecc22c612a0b3933513c46134227931afc21418d9749efd71818912782319c3386be54fdc08811b3c07887dcd366611dd299862f4764fb9f752d6e4b67b2a5371b6e45352a163364c542265409468ddeeb5c21a6085cb42212c9f79069b650e64a726d6769752385a08886c9c8fa272013f24a5e3a06964e94270cff0c87dc102645ca9d8355c4d212651cdc19d3bc5462c1eb5b05215f7555af0ed840c3683e79eda005baf0014a3a632c321406161ff62a09afc6c63f2351d50eb78a4353d656e8bf2aca4d3feda4b63d08fa0b919c5f9b56a79d2cc91c3407cf2bd65c3a175d31826e35c3d4cb541a5624880a0cd10df46228732f19e5fb3d9cb745a85828f979e90a3791885a91f379bee598b2bcf016cc9c3d45e0b8fe1097a1c25d840a428fea2ef69b2eda457f6592109f101e41156032e8d5ac4b08e1eeb6e5983ae5827c2b815ec3f1a3ea165ec9e4d9cddbb0b34511bb25985700592003ca1e0e7808d4c4a3221f953aa513deb67920d3e752387702d2ef58fb863d63a0ce8da9097578e598eff6a8055afe0a402baca703defc06c505019ee87f8a11355502669eab5c0babb00729827129840a6549a2c28d5017aef0473e1f70a0d7cd817c8303a6ddce54aa9258254c784aa9ac2050b10035e31267bcb329a23a10e282560aecb16564ac0cb59ff81c3530bc6c27effbf458b38dfff14fc7ca9e027e43251d0aab6a11360e53ad0a1576fb0c3c925bba21da19f8ac8548ee135575b2b62f1480d896b95fdc82819205980913648858de4a17ce29d1c96550b5df2288fe0db357e5ed46e7e30f819ba2413123fb9a26f68cb1bbb0e6624d622cd743825a07f7480ef0057a6d74467bbc84d28856157a41c6bbc8e9cce8d6f35e227eaeb36d4f7af2e04cf7763a442382f065f12ace475422cd850c3f9160ca7e40c2c52a3507b707d0259407d71f6a54a3483ec6de60fa231619c4a682511314348f5e5a0cb7ee5c654b9d08364041d394e690a304d156e2ec3258e01ff56283cf386e2c1f294e5bbab87131ced1f83fd8bad2bc8b3150cc58966e674ec1b62662d0c00e6dcad1006ca0bf9d950e4154bfd1535b2da023f985aab4422d60da5fcbef7151b95ea29f3375a10e01522e001ebfc0a5a894a81e7ccaf60fa953e01cd8dfe276bc971d812b34823b0292d4a853012e149cb65dab07ea2315cccea6f4d183c7deb50a02abe6e53e485e31faa4a710ea3cab33bd2dd2815608b28e66daee05a88e0142efe2afaf3d9b43ca0b3086ba65be42e02881ee05063b42a5d65fa0134ef6d2b8fb53e5282a85deedf58907b531cb4ab1e63b690ff6a170cb7ee222ede550b5cbfdd7bd70e32f5fde74f6423eb9a6876e8c78d39bd10b51a0c205d0a50cb19f3795e30489864979f76c6e82fb3898ee8871029064624dbf99116e58902427ae6763c07b4342280b3ac37cdc22ab8f88aa32c055b8f0350b549acf99247360c9a41c349fb4478834e94276676badda95ab3f1fff0699b83c4706fa3e8071b6baeed2e003ff810216e67eafa8565d4151dca9558baac8d01f55fd77c3fe80b10a8fde813e20f9ec826dd4780cca49d5e207ed1cc571cc4129164106e0ea1bf8f44d9d86e28fd5682cc5d9e142e4d3db8802fecc1deb6f07d1558fcbf8637b9e867c68c57fcb579ae20e29dde56e0ecf84d2e9381aab49c06d972a79f418ddeb6ca64915baf061f65453589993a29a19844c82a000d5a209c49c22297e64d87fa39abc3d4608dccb3f1239e17f163cecb06a668c6ac5d5237c0edd32a248aa42b63394458e2e26554ba6c60cb4dff278c0aa472010324bf2a32ff38a22fba2dbbb75c47d9e9e61603cf255ad3a1f0d28f88bae8195106070e7e61cff17659c4ce2d10062faf174ec168ce4f5b198d29902cc579abc4ae6548e438cdf2a39125a916c6cdf6b1043952ad13749217d0d0254f4cb36dcf3479ede739cff10b66f9a3a266f44f81969254635c10600184e55b31ed570cb40fd9975cd08c92c5d88dc5aa8d90890bcb56bb6eaa9aec6ea9f6ebaaa7e78f4d4ad85663f894a6a01116cc72011f9edadd90da6e4900ac20d4d206b3f4b93c04f2d9f0b642ea1764c0493ed3bbd0d490051ed8ff072e747fb16aea79692c9a9ee0fe2f17b82776358a9fa1b065b98cd5f80192a5b024f1b7b1cae15c7f12a9178c1b51d566af1e1476c1ad81fe67b749d65dfb7b89aa303c54322fcab4f2771504ec40f3717d46ac57c3dd1d140d2726226b8b297895332d331257522f84c1cb3b3288450920665fb56b7f4dac3983edfe22d66ad380ad4fbf32c204aa4436287b3f9df25b905c306fb37601db870a6f2dfa0b93867caeebc896234e6d2116b22d6b93408c0711452db143cb72c68a27aea5f67eaa28b124c6b90dd779465d7db3d770e11c180dfe5bf60c800fbee10bce939d2cf64d34f08ec8789eca968c08b1a5ae1fcf881069ccd8b1a957d51a83a5f37e69f4b9340c40054a809423181cc0a5b2151834f3e42213eed1203daa4807e30193e41979119bca5606ab4f60d8708396e8cea6ea03e116ecbe5fe384971ddf9dc3758877a8f2e864f06b8309c21d6f1305feae9b35c0c3ed83838d5188ff3aba514c7538c54aa7c0c379ecac852ae1f214efd8a5e08a0d8590ed9e4ee424a95f16f7bb015f0886bf6a9bd11f496b982d7f1e0322e909938455dc3e69197a061204bca6ab018687cff88994c59a35022688ae89b2ea5d774660ead99d6d79fe6d070074b1a8026984a073cd62498ad5b08f3009e34bdf3d61dd2d2f0391f035e330f1a6eed36523452345fad049f385efe019647c340bfafa810e14b7a2233829633aed1675455d38998a7be4b60f7f03e894a706bcd4d071eb9a74f39305cab9e2aad1791ddc8f7e21e4a79c8a9472fae6c7a9577e4dc1e16dac7951b45b382208881788cb451e5a0dc57b959ac018641650edcdc2e74f43053436c0f4701b6a6be21f5317d8aa7d78dbe6ddfb0b6fdb147bf2936431ea501f26392eaf310c5248c708461c5e5a8acdfaf348831d8853d6b55b3ac412aa33673a4f3af77d191ccb30d3cc190ccfaff1d6e3f32c1f1bb253b3218ca23135de963da0f08f6850a88b08ddf58bbc66a49471509c2a6dd26559db64378a33b34693ff5ee040665a9c0aac1d8b03444e5ee147043b9fa66e7d628085e0e9036097d5d1d129c2e12a5913268cc0de92a036c3930cb3276eb4bdb13e50a9aeaa2ad0fb469b5ed4d5739cf7494cc3498b01d934a011a37e71dec0c233f502cd2d7bd3ebdb2f420576a553bbe9d5985195ff0941a518d83b08162615893690405752d985bcfd88978ca728a8310cb48cb980627694a36b6e2c49d9a4e2d682e59248c61f836ce33661ded98626ea394182b072d45614a7b009535d40fb3d5a172369615833637bab0e243d0599b7ab5611c958bc785aec88515b8cfcb25d650018671822217caf1bf0706957a273b5b4d82bd14193ceb075e4982db007b8cf1ca87e570bb75b5907777e4a6fd27be03a0fe2673216628a72f9ee4aaeae7592709980dfcf935b0d0070003d7779325e9a72326b7bb71259566efe1aaa9a180b6360fd46107ccc9c281f70a6620e340e31a20383e36d4a6af5bfda49106998e9b3250c6ddc254fa79d0c71c9be4778b60f95b3f2e770d54b8e850bee82d2043c644cc8b4f71860e29c96c0150ebe5ab8232a68e05a3336669379578ecbfb8c3d72a5ef74f39f1ac4b432b0a47bf8a5c0374026325f69314b72a55726c06a3d8c252ed48327a140bdd443c50cec8a957e6606aa51b0740af704a2223b0d231fd05fd0b76df0292770e3a46f6c057e9316d587718863db855b5ba891f7dc7ed25b7bb5cca8bb5cbbafc64f3489d248096a89375a082e54be1dc9301ca23a7b61d0e21473e759c9e049f803b19ff4423a1e74888551a9d7f8654fbcbf24660a052da7d075e3e4d61741ceb52ec1752b0f4ae3536f84cfc36768a94bd468b431968d0f27655fb5081d5a93a3391f02e1c3f85b44c90bbd303e8f73d3d570ea76b3f1f1baaedb89240c7b640f79fbd726787826a1868192b8b9d90975d79486d893b09824c3748cf2fdb509b9540d1ae360052342af72696e63598aa79b86ef1937f510ac0b045441a7c5dca842f2ad65f4095278345dd6f28716186c5a1bfc1bc60e2caf3bbcf7d024655d56d433140c060ba5da9b59ff6006015f98c1b0bf1165a730718e6c155c680a8fe58c308dae68715d408b8fe5976c4c291fde9224ad695677ed7037757de51a39e99575eacc7842e3cf9cc4119a27024d418c3059ff5d111f61b15a524944ca04b52880cf6dce8a720f98576ebbfcd25631237d2ca613776dd14bae06508cb9c8d2e4f6c94033e365a0bdc7da9e79f2795532011c5814bd63519eb251262d12ebee7f9703606ae0149d32be1771ddeb103595b8c7f7dc2c9f699428de4cc6d157b2b2bbcc6a301dda5dc343bf4a817aa870456d05d5f4b22d2a1f0f6ffc45189203c2a990ebf259d9aee1b2fc53637a248d8e29778510d2ee4a223beacb8b92488589cd707e5b24a97ae3206b83cb22036305ca77b0edf5cc6aab42369fad98f3f85c700984b0998ab9dbf790a5915a1d50bdc67e451893ced9c30606326ae73a5786f9a714bea8aaa40dca06e045b5b4e1c45232c3a647fd0590fd6e4c7ba439d9d8deadcc3b002476c26fb3813e206660a80b03c9a61117254fbed207330df863e5e44e593b0548662d4977fc3cd93f9f3dd0eaf62f8d942beffadd1f30c9c5aab6b64a0fc6a716fca44a1e34195e174813949b8b21ee28f84e81413058c02d10428330d734b06479aa0ea241573e7b893f640d18a6d6319de796a34f0729efb5518e5fcf563987b3321a842537c37b3e06ccd1bf9ef3cbf19b9ff23654f5921f651a4bc5a962417cacf9866a1c53c57443aa39b47e928cc7f3a233de24b6c7db50091c12fae7ec71ecdff2ca8ee3a36be7ef3a473986dec122122e3822f5246cc4d4eb04a0255bb59292ee92cab31bd7fd41d9a3652c6bb81fcbf1f57de57788981a1db522bd625aa5093ab822da622594a3ca2fa24cd1e32813a5da78ec1eb3f9cc6476fd69e1e6e054babf6ec5b02d177fdc8ee56900beb88b654667c6e63173001b0da0458af002234f6f0fb4581a310cb7c150e9b43e9f756554618cbb59cdbaf7e3564cca922071572c753bac1ec58cc4b5803f98066b223f1032822bca55ce10aad867e586aceacb92e0cca23988b29440e160a62eec8efc1beffb4ed449ef849c38238ef4a2fbc0645c57cb644e723c25fb0fa91c54902127df98c1b3eb586658f6a6ae5ef85a6b62686d16f76247950eae2e6dc5d13783d3160318cdbd268b050f178e84b6e2f74a5b91f805312cd963df497115ea30e6ae11fd6e172aead40fec92373d1aef3071bcf258831181aab7f78d33a8e4e6e310440db4a54c039390714eff580609ea143262119269daa5cd5253a81a35096b2bf39147bf37a574f58b7dee42550efcca0d18cc101b3535812a01c0d67fec93f8822fba17c07dd64ef5548841b2574694d378e895f8aaacfd3e04cbe87119814698d134603ecf0e6c4e2627d48d6a455966a05a5a2a0a95ad7b319cff1491a485daa94fd3458197962e7c1e27e4f5d8f116133996bc2c64dabc26215d885259e49259037d3be13287ec1b2d8f3ba0fec1bb3a0addc5761cb5f2d47cb04ebada9706d12cd771fee954171afa66c9ad34545264940354f21e9cc82dce286fc0b622c82680efb7adafef5b5a3eefb76edc23fd63721693366f235b84818e604f3223983e67c6b154847f5087ed59849009bbf3c168f0e89db4b4f491e58ec7dad596b4254bba305bf4d3dbb2e2986e60eae5c97394db244f956a26aff921bcd1da47c4a414b64851252311c1a91979a411583555eb8b4224035e11f60305f48f6d128fb508b0e7a90df901a3a913adf63f5df1af5cece8c9e60ef8bdc8ce481339b38455ed96a08fa4c0df2de231ed9152767d1eda1f29380a9f4168be5e01a02fed263a07daf00d9343be6409ca57a7d30ba77d832cc923ece69d18f7b455764c2055dacc4043820b86485e89d2b1173b964e50009898a9cb2cf93bbe4f4c338b34bc2ee754620cc9fc7ccecee87ad42e913bfb219a2eff6ff77067e15e6a99aadb0f139e2781eee8830b4bf4abdb65312c778cfba45465f3c236df6d23df9f547f4a24e24e19c5d204431375e23896c2b9e1c91fa415f1484275970871900cad43bfe549819a5d14b4c00175edccafc0f522bf6427639e9062eccd1b1690a0b63ffffbd3477aee5611d7f75e9307c42052f1649d64937395b4c7a52d205214102352dac800f20992467f5a0f1d10a13b0e797605611956d515a98d01bd3aed5d28510a8a2169d28a8abd2519ec5403929b20ecbfcd8629740b9777b483fb57a570026b423aa0b1ba896589758dc1a68f13b85498d99c8ac8fcb5a0c1393537710e71bd4589e81d043159b073c60ba4ce37cb78f22cbc6fb86b465e2a4c2003c71586860ed8a09cb6edede1097aca67356a299b7a8d67dfbd2c9fe3c63b9b66dba8f2b906e658a2adce88b8c9802271c3b955b33e60514cb3dff123ee205a101c0e6eacbab97bc023982da33ae8818c13a3258d5d49dfac3447be5e498f4137cb87fcc6b6a2be26e214dc696c06a20ebfe68da88baf2c90d5f41f207d11c9627d2ffb1a4a6c7ecea390e628f1d96fa220badc7a54e7e4c8b2f5e9d35ee378727dacc1cd6230d86c97df20043f129cf244d5f389856be0adacffd9e8156402f061c0940d33facceca81085116ff995a62382f01cc07f521867da1fff3fc774094fb830e83224db556a618aa169162a4aacdc08d293aaefe88140370c4268886284fae9303b96d3da938b3a42b0f7190560cd46e192af1f598e13d053860b129fbeaeb78a462d1bb09922b9360b1614e80ce3e6865882041e4b028b289803e8d07e9b192c73a00114a00e0bff15764f98a0883bf7621b15ed5fe455af9792fbe5a6b69a747f49f42802ba2d88902ce8e5514c5c4119945c1aca43aad6059e971c7c7afc033cf5ac3c493c6fa45506c8c3110be419252989cde786921f3c2c2cfe47583bb0003fdeacba28a31703c2fdca5a4a5ab488a50ff4683a6288bdec93b343009417e62a82a0821a6afeacc032b8920d3403c4ba0c78558d98b5fb9e62062157ee8866c5a08f7eac34a825ed3a4342be3ca75948e927deb2deb93c6af903cdab0fe958f4bc314c1d8a86845ee11d65e96e85e06666972fcd12ad398599558c737ccbb772bdcc9bbff3fe78458b065cd917340617eaaf815f504c773fd3c65fd44319a25befa28dd2f631a63936a9e5466d003f7347fd57f59a909a244b388ed430d8b4656663b5733d855e5237f6781670b77958422c227cdaa5063f84273530f22490f13760c401a8695a82f8b2750a4e96968ef555a3395d12029f166aa6cea2d51c70f22663d8ab204113e7ad45ee8d754bdfafda0aeade212910409571e14d51def4650472057f567e25035fe9c9272c9e64f54e1d1117615699024933d2ab3eea2ef51bf8b69a1a8f0cf52b608cac153db25a934673e07c550835298f75b7c856213ef099f6820a6f49d9edd8ee2f85d73a0e2e52ec2c61952169dc2f131d1c777a74b539062ca1e271e72107d89a563b2b3d81f51936639637bef3179e6418bed70b18b3531050736b064ff5cd328884710eb0338b5d311c3ad6068fe719d938156f79c46b6b01984ad74e5c8406daf6fb30fd465cb59aa3a7ce87b4d12a497f95690ff650e54612b31cd6b472dc3c2eaf1fca25aa2b91e771493f60202053eaa8bcc5667a07a7d58b5b6721933df17593f933c0f20eece4a9f9b20bb1762c6c8dc0b4a950e0466a6787828b9e40b0f8460c470805090a5d9cb7f99de33d6d53dd4b542d1830bfef9d6c2a261c5ce7cee430e7fd4433d8c477052cbf96176b03c5ed3fa41ae3a0edb4e8d4ae9e3e1003c1bcc059365e06b41b81fc8c40743eabbd8547acac1a0863624bd346ab4e283121a2327fddd93bdd1510c372a22740652d599d2de5027714d90ed74fc9637eee47025ffc402319ede208023b87a580e17dfb242669e8ea0e4278ddd07417f89a839cf0ec05312d4cb4589ef9d738ec6cba9b284903190252004506d4338366a49f6533d0b044560f1f2852f32a012db1ec92e7ca4aab56a151d49ce7b3f76a245581c5dc4fcf8e913cd28542049151fe0021ffd2288260d21f4bd1f040a5db03ca198054b0097aae96181a8511f8d2130275046c8b6ba8e17b400a0c7d3fce5e87997510edd5131d7aaae12bb72965114cf75c37b24013d3ccdc0f43812a910924fb2107d50c9888d8866ce81e1aafebcbaf92a53b8e15c1f63d8f54447c8c76a8463df7e21d33801662b3923a676f23ef4c828601d613acc9732577a2e0732d7891fee468bdae4bf9269ce20d75307487c5bfda4385a48875f83f365c87204b9e96fd23a7775ebbeb9ef2e48b6680642f7d29a7968e57d950e04e961b60cf5c84c3657e394e5baa56f56584fbb461a6d3aa36c30484011c9ba9e2d1cb0d1ec784eda77d43989cec47a80c83b0db424b6a1f6f6b25600358d58917cf98a80f0d1f77096f9ea95d8befa1d320a5bb320103ddfce4b8c447b00b071236522f9bb10ac922f02a11f09c96c3a921a8fec90c1dbb261270d714aa0a8d9d099dcd8dc647339083b9d38adf80db8ad1b407a2e1cd820c75c16b2a987adbf5d40a6bec0bd10767ff06a6cbd4dd77731760f5e72e273710e8be48267b9e310ab191d0ad289fa6b255610746ac07ce31c7e20809f4e0936fd0e81354024cd84ed64682291461ff3700c7253499cd0177a94f70eed2f3d7c4bec2e35a3311da45bff812c28e362063f2f03bcfee308e6448413518c6ee42be485ccfe63a4fa041d420b22b06b4db6ec3ddc3363fbb9be0356f4ac80e4987a9dddbedf3ae04548a2e4e183fed0d40227ceff4fc4b66f80f03713a4b55adc5fa616982a19c1da78e67057f298a80c8379e0c967c621b294f0edc7a836b6e38d93643a0a36a19091dfc12e70ae048fbfdd54ac4f949f74c94a2cc39f43f2773cd76da89bc0c3e81f1128c14cb385698354ba7909f654ac997027573f0324547acf81dddb698e1195d749413eb81c88484f9026e23143d6d5c40672419fd73a052913c914e016c4e908694226bdba0c7049009cfb799c207dea0781596e517d5c1ed492c127a789c71109ccc53970bee50bc9379a719392e8609da5d70e342cf8c47036b22b5d973df489f22c1d462e4580c11afaea6c085ca1c108d6407453ce4bb03070fb172fefaa68b058ad4cc31fe4ac47ef4b80136864230b4b0536513ffd9a6395a5f0306e5167014ecceccfbbc3b0edc18b13c13d6c76a3df880ee18451b01b950467989277eb3bfacd20007b40b7b9e9d22484dced979b9d039682ce7a28c8c5c9f20889afe1b1ec25819f10e334405440cf03f47c51bdeacff4425614cabba84d09ac49298424d0384b2e66eab9cae3c6a04eb626eb70692e96cd02785a42e157b9a6842102d1fd85e1e47e3519add4d993c1832a4b51e8fb502f0d3d2762fc19bcd8c1d537879d285ec6ee992b8b09a3434348f8d7a8fd50238c5fe039b0c4b904f0f995371fab553ccbfb605d85cff275e272ee4859bc7c313dc02ec53554af8e200c48a2b85b5b3174b46771f5c3ff1ab6b01adbc59800c1ba38e46906275cc2823415ee47c147f029c66bfaa2bad16cd8104cefb420cdcc4f6f284232703debef58114a60296c26636e9093ca4e67707a886255046b3cdff77445a427903f10155c0bcdb25b7838bc687084086110260d26cd4448ef048f78d9a593822c836d360649ac9380383d13d47e974be4bd0c3e203bb35882a71b537e3dd768a9094bbbfd51047f5fc4d25357d7118b70000227dac3bf04cfe34eaa91036dc2503a66cdd3b6cb4810c2dea3049714be85be6a229d53189d120c6be1ae708a2a5abcd525ee9365024b93c1ec870932c74bb203756bcb3f97fb87a293e2b45f4eff636cd6983993e713f44f83fd92ed0f94ab496d43675817c30346c4864dd48e82bb830f07bf62e3908b23a6661ea16c607b11cfe2220d77a06cea5b0ed60ad92c64f53aa22f154574f54924332d3e8f81cba22e3963a332b8b3c1e3c29e962174b09ff84bb38113b3653d688d7d0abb8b27dcfeea13490b57b931a54c7184cfd4641afaf724ba10474b57cea0b17b900278cb155ac7753436dfa00d6a0883c27d8cb97112bc3aebd947f4eeb0ae63277bca949bfcb8c1ec2bd23b662f74470257e247e1495b393d7cc09f481788108faaa3475d8d03c7d5ac6b56ef107cfe46a70a7bca02afc82a279700e226e709be8b8102adddf973c0798b8198938d9894cf3b606119267b6851e072221b7c1431a8e3539a5592b9dce2fdb375a91bbacb27079f8965224372e8ebf163f39dd8e8dc0c583dde78352dcfd7ca07abe30387719ab29b4d58ff31370730605e5c7a2fc947ef24305f47e690384689d0dba2cec4b6a315883b39187ddc95624ce10fff4c3972e9113d95c6485aba201181c1812a64dfb8f400f2326960bb71163f62c6b373775cbda992d72bf7d1cfca9964990c6c4e3b2fc985fc7db48c01a97bdec4521de9821864df886426e135315d67218d2a341a6101e09f59c32d303c0b256b1502a4088d33fdfca0317416e4325b9c84b004daab90abd68a81ee750d276d72f4df69cbc7be09f601c3085f0c3286629c1f6a924956b2e4e6c9e156dd4d2838a5c54e984286e73cfb3f5296601c7e1b003c0048ebf14ab497ccc6fd4a5a4948b6c214d502319654ec3e8c32586372ba8ba8e4cb12b19a44ef65feb31627e4375acb8f2eb09b6d5a70a08eedfd48133a88401e2b1a260c2591715a60a80fda92c32ea852828afc94c83bd7978739d6a988b45ca66ffc8680e9747969c06a842a3dac224f07a0d739a08518808136ed50115398ade45b63a7958b5e691d58a1d7270fae3f60c6d5018f8f24ee4760cf63a754531826cde92b83a3b9775b88f2841e669a196cb9e79541ade748700204400cd60e81c6c82d14fd0c2fa41d4cc8e81996b712411931ceea6b2962e225272e325b148b050760edee1bbe025e1c8f80fdd33690e63264e28e364607be43f870342a799be1781e6b4735d959537497ae6807a324af5e6b737ea85584a95dec7a0c99464e5b857821d9e6a9f88948a89fed1ede401deb88706d1b09c8b93577c4043531003d20f4eb6e88129303776f3af661ac41031555eb5c63aab1865a7ed059d272e7cac48c7010ed4336143cc9cec0540296abb9734d58ea6e703a363338bddaf53833526fbc72ff80f02a126c83035e4824c46a6319e745b54f757ddf9829814d785ee422c5bb7923522e563820cf1bde95c03d5584537a2b8d4c71e4bba3467ef69fe7539d28530da658c0d0cdeea95122bcdb0f245330c9e938de44346109b270aa7a8ca83ea4e7decefcf0c5710c965637c2489182a69a26762c7dc0c704f2b5e54830f59818d1fe2394ca24dede5943ab7eba2ecbbf6cfd1483a86cfe2cbddecfa001c019b2d7d165c655b21eef7c25b732ab359db33ea200232bf5e7f7256fd6210c40e94a09743c9f199959b52323aea1830fcdad2a78b6f87c344887a599b8c3e32924c4dc1b819271d110e2d8f9f0945e1858186b6648cf8ec80216696e760735427ad4734f35d9d7f15c9eee5ccbf1754a96fabf744fe7eb694f63b11c611e006423914306e563682b82b56a7afd0fbbb6f6c3190b4d57ed6faa5ad348bc69214fbc4fbbe05abc9133ea6865a88db0f33b4be9acec8df92b8ca297a6a053a75f34798bd011a2387a3090b17452492ce74a93d4e07c85b2baadd7fcc36bca4807875c21f2fedea41eaf4d644f786d32d64b9b713fd9bb92f18c4d425dccedbfe53b7e1a44fbfe7483204e55a4fe2313c80a7fb2c6136571f5cfee9d2c62e9a930063faa9614c3076c09bf4baf3ee4b76e88b42b778dc66160cb336425a2e0002ff02285c1e1e2ca6df183875b15e3633c6c5130c1d8ce27fd83628a6cc979d05536bff9e5f65b9e9308f2cbb2247f8ab701d98c581546de848c2addcb938a8c7b1cd4a74f296c6c7db9963a207f45c779c045006273e68398c43a9fd8be0c38c62f2e0cea5a82c29258cb86841890120d98be9e550df257f7ac00e72fa0a41847df864969bbc22d58665164ea1a7016dedb6870bf0c3686db1c85521772a6850d5f6b45bcb714f1de9eb5a97cd6775a284a184170940f79fddde45b1d143b0d7d5a01cd507d0e10fa953ba6fa2df01ae081f9b0572b49b5a68aba259be8168bc48dd9c52b81a35d35352e28acab988a157ad545bbe5aedba101b33c91bdaa73807adc82bed6a7afec9fe1088b5e34f57468e4e855387a806f1e0cf65194e436a7982e52836d4b8d09ab9370021585aa22e7588e4185fd000e36533078020a21d63e5fc0c2d446be9bbe412c9fd4c35601ce0e041df5950b483c62cd9c84814024773c21d9f87746220afb5959616ccbb94b006129071aa4e2c2a4a70990ec87507aeafbabdd9e87fc01718bc052e9547ac7972ecb974a41b7add5fafe97e64211d76d484f1cc13900d5fe987f286e022ae6df472318678eeb0fd99645707f3b7cd622dbcb2106dd37120852f7bc9beeb839b79155d738d4a81c619728acf7a37ab338e0662161ac2e953d0a00d3b051117fc808b78cc0c60420c03781cad0c1c7758194ae2a66ecec4924b321ba9c0177e3a19119a3c9e7d77e53b1915d7e80e3a9e1fa3e4d48ddfa558e937152adb159cec6e22dff7febf18ae407018d828e53512004f1bbf2912352b6a66f87f12e8e83e54104def4b7e0b5a8503096e8cc8a4c58aa0498c21b6c835269b3f5be91a2ae9f7511ced1e873fa54b758940850c427bd0b77d038130db46b63baf7dbf55be8f625470d70528e87e91934f3eae895be60503a1357a8989f0236d1c7823a9189350747320b2c6a3cc1c5f7008c2e1bb3fcbf220768475dabed706f7ab70f3df738d41945b160423aa7a581effbe6000b7820b5c3e84e441711dcc2f98a96061eac7c302840bff6035e5c6a632c8f73ab2d47b51e2882aa372742ff82d0edd279f6fb84a82b0039101173a23b2c3b51dcbec3690f97dbd52e4068d2aad7efbf0c392e76d24aa9b9e248649d1b1fd789176e99ef69676ebba8ebacb5c88cd05114f4128878c5ca51fa703c1836d50ef2b7050d707de74a1a74b19df75809a29a49037f66538493fc4ff86a8e31c37b8c120a5e489facf8c69b2e5ae4a748d46807ee14b255056930397a9951ab3892e2a47076e925a2a3201e1a0acece874e3145b3561312d2fec9c47f70933e51d339c53f63c21454cc20912714298b2b1b592c2c5e86189777a7b6d2484038d448dbcdc2d47c37445599506dd175a052b5440605b0599c665f8b44af00d8c9e084f10825bb89c67addcc2ba373a357d4727852dda5a0d6c520b5d40bdd4c8352aa075542b83ab39b9a82a5f3a2a8a2ea28f6fe04de0108f7c129198325ce3725a84248cb575108060a1a2e289f32a10aebce8fc6a9f24d8de6723bb124100938343ee3bc0aa9155db01ec9222a9b30baa7c774733244f907015bbbb43e033b799ae65add16aca8c0d0a5bd7d4d3c54b1b7375010ba261570f048194ea78664be1f33eb5ed8c0a238e56307c79ae61235e82ee2f8bdb41302e17ce4df8f89de2ed7444dee7c2f355569223c085524e284c0b572c38ad2cb49a4daf557fa87433ca20f4e2f5bba8b285d716add1c7f8c0524881ad887a7584758aa18e1187d908cee67321e577a4bc174d1d51b6e5febcffe6ee5737043f647e4c90e590f9eabde12cf95d5fb6210911fdb600f84cf998b7ab3bb172c46cf9543900cd23fea6d8387f4ee29fe6ea85be12ccf1531fd56ff666054d233721e794c62a912acdaeaf4be67ba73d119554451370806dfabc49fa67f96f592c831f119678f45c346a882f079fe52fa0fc7208878d712fa2cd4e8ae5c48f6a5995f8724042f556215eee892266f7c31b70b59252c00774a946bb001893862f3e20f7080e2484fff7e65e7789ad523400c3561d22655a5d3d487c06db2fe481d489c5edf17151c6723ea458affaf71aaaa2501c0e28ffa5e05d133f095cb0f7126d7c3e7deaa1567cc9e9854114f73e42cdf77264db0a111fa0234930485ca503afd004794374a382a7ce9d44e4f23fc199660a2849234f85d373bdf96563b7bf6688d1f011195633a593e6f8c7106451ffb3832bafe099df7b8832b88766879411470ec2d35ea09eb11fbc89f9d01dbdffe418a482198d44aea23afff25b8568a1cfdd90eb41bee8d537b1f9499c35ae6a86cbc96a6b55adfa39724271d69c2074576bbf36b8dd2cfbe5173387354f9a5253f676a90716e10e6f052001f439d6729406addddc3ea55d3e2180cda00f814491a505125df0f928a3439ed9065db1aa21032734dfbae0eb412fd617707a11718e8e3d0ee8504ed2ef5abca468847be3eb41ce9b2af4140bedde955a7a73a50163d53b7c76be428f48154d6c894fe47cc318d299698629fd8a2c4dfe9d5943d07b5f8465640647efe139b98b189395631596c4be1dc7aded3026c1a6758f8af41e8884aeb77bd8538b5cfa19a1a9a4a8edd4c81b9fca34c173952bfd2de1b06af2743b13b917b71662778e7467512f5e18f4ea49e78cd09dabb2739a908a88f8229887d394c7b4116093994f75d52e580ca2729203c375d26968d69286d3bc4c063cb7db7dc76b7bbdc999b47faeede3d747e5a37901720ec500a054fd9259f3552b1784682cf4a0c0ff090e1922dd0cb02a297cad1b6e5596e79e3d77ec9491a037fc2a1084944b036a68bd491c8a9c768b4e35431fed99705a01efe327e6c3bdfbb7368484a2ea09ce48bbb389d7a42d8974a8010c2c066079552a5dc52c591715d6e0d0981840ac4519340dc195ce8040f5a646f80dba8a8363865b7fa8beb076314f6d42366d9ec50ad0d391e5c892da293b55b72ed984d823bb95fe9d917ba14229c8f17edd0c3b953bcf33320ce0809af89d4bba59b00225046717cca07e7c8406b34de347038baba57ee00b38fd53d075af5a5ba42ca627694c7d82c0b34948e484564c2878928b7283cf52cc279a61713f508bb752167c3c838a32530484a81d43a8615a938cd499af75253011377d0774931d8de1442e50a68956bc7e90bcd0773e5f31245c9fab017466d5b124fba8df9153485062781edf213e025d05b31ec8977537d8c8bf7fc0ae9e9439f0e74d3899e7440736c095c63d9160351c5d5c1ac605c4b6fbc2392a7db48596f12b2abb7ac5b784a1a37f8d0229191764440e866e6d336a841808634e01fa969e65535cd0be3f758804181fd000e3651b0780382c76a66147a08340096838393f4bc346edd61fcfc6965872b625c917b2cc3a4c07e83871b28d83c31855df31edccc57281fe8b9a642209338d625f0f0f94fd02cf60fcc9e04ce3cd403798d0696d3c933aadc208b624abaf98626a131b9bccc74b6afa656ce6b6de690020a60d78bef0ed71ccfbaa9933a3d1b30a67f2896298307caa99d7da1e2716b8e883073c6a5a59311fe049118ebbb7281b370f4ebdb4c4fdbbdc71ed57ead917d99821228875aeb650521788510f5a520efd0b2e73b706dfa9385d10fe9135f43708d778ede48633bf280e07c4c3a47465d49e47b0e6a3d0a31e83adadd207d0ce5226a9cc8058668a62418dd52bea1e997a06636d3db1ab77d754f4b8ce70efa5ab7f35b7bf441d36c56ba81d89bc0f037440ae64e2bd2bb8ab9b00778640486d4e509256877eb4993b36a21cc3604ad4c28e6e15317d5ab7336a86b9eea53d2dd3c3fb63c618679090e211d5ccc17488a751856857a828f5bb90b7bf3fe06ecfedeaf3a8a5894c583f4ec9cbbe10e6a0295d93caca1248e190febc52fa4afab0c58e0c57f517170553fbab52140314f8d7283bddebbd4a9e71265e8cfdfd25810fccd60c9fb7bdf1c36e08619e8c4f19b9f5557035951af4aab31765aff5557d873dda996a8a7e246d1ba9a06204f499b6faca9588c7a7a38904f220b69b9d1e3ffa7a11ac3cb32a5d8be64839008612686e5eef8fee1a2b074c20ccf7a158598fac06a3d360f9fbb21c9263e567726d7a06f8d5f421621baac04aed304449e05ea3512a5041a7c8e17984ba288d39d2f905fdba8d3845e5180a318411ca957cb45cac3b5b537559b7d512d98dbaeda7843529516147d10244cab4e383d575ec0464a365d4ba6db67c262919a224e9f79f69ca9984e2344b78d882ca27fd9dc2f6b4f6c65513caa707773d0ce4bcc3f7643e86cab5f093f849778aece13d5c224d5db2bdad12bd66be76f2a75da3d25b18815cf602a194640c81c9ab98b84f7ea5aabf259e57d9573d5f1261108b6ccbb73cda6dbe51f68dc84a626d57b9cea6fe7c19ae046c18d1a947d400bff652a97802096b1b2af30fe95acbbc369ed1ba1d90f5c1f8c8fb81f5a1b2e70fd481acebc9f1f997c08e8f6ca73d833e7fe7aeffc045fa8bfa22577917b7182ac314d823ea86e82ad5cf3b775faec84e05e238d1a73b0f433f1aae666790ad18e3902808eec6f0f758f57a4580f1e66bc8e1aad678b80645da3891968d49cf542a8fc0842ceaa5c842b8debf598112572dff66f12c9923a8ed00cdece525f08e8658372b457852d96a38d9454817312b3be3d14f8617ff7c89336de1a4861a5d06b68751f43ac01471453c9c243816284993e7364f1d311508182c0a2c2d57d231599885907f6f5ccc6cc03967c60328290fb2446487b2df6d9b2c0be40d57ecb3b0c38f54cd3097c60b69edbc92127178f764fe153faa606fc298f23f3e55440f140af84ea92b3aeddcd1302dee3e43323929b124861be0239b858dc90422e5153b5d85f0a14458004dbc8f42c09d5bd3e986e88eea016ab5a589d7d06631201fe20eba8736c9415695938205fe395da5d7d37920d61a19874e8c3b825eb730af4eccba04fdd3f4965c1eeba3730ae05dd0688a3a4d104aa99a6cb6117d1609c8b90f50e0c879202e830257300c8c17aa6697977f2ea8421a3f864ba27c94bb3595c88e51ad34a5d051ff808c6ee31f8fa6b957d499cc91425196447c072e8cea0a8edd30ef23dd56125d35301adddc3c4526126217c1fa4ce2c7a2d8e2dd34fcd317010a468dcc8ce2ccd7febfeaff16f6711aa1cdeaeeaa06fe06f82752814351fe211a7c26cbd9dcbf49078dd9f7390b93775d99c4cd894432f6fd94a9bf460b525b19871faf7f8d77b0a19168e0655f6bc0aff866914ccf0e1a86c9453d3b1585859c3e637bb20c5c4111a07a7b8ca9438d5d70c0d3f07d99898d8a9c88830f64142e706286f2fe46eb77f96c2141e86dd8b70add35ff6560b5a4ff00726e4f03be38d378d0478fa749d28cd59ac629ab9136cf98a9b8c90687b68edbecf985e3c8e19a6d0f414522767cceb05e43d5f71fb9d6a0af020cf9b94e112bf7c0b9f442b526d4c5fa22d4824b09317dbd30466cee570fc169b23c0f1afd081e209fb5203a980ee887b19263b4e9a87267526b0be574570bf13c67ad40c8c29554e98973863a8c2652e673cc51c9081ec789ab1fee1c6a1ac5305cd2b4fc73ee514f633565cf2346903333a533756cfceb46c5e1c6e822229554b3419547086eb345ae8407fab5920ef659a9ebdd53880ab17722f47d6b80763963cf8afed68ea891fe05ed2ebca480ef83115db4ad78b8e3d7cba0043c6426f248d8f3b60167800bc163250f290bbca1f5d3e00fec10adf4c96326366b65c960602184af7a97bf0a030b9c40687719fb267c7b8a06459e8c590240a668d7bc8e45c96649b7a1b034ebfef87fa6ab3e1cb8a4d844c5cfebf7ddb8a9afa6a774bf7caaa865bcaaf5d65944a96b40e120fcfac922d0976db39f226386029a90d6d73006e82dbda615d6e690810a5d065769aaee760790b6a06d9ea157f1bd6b03fd5a64f5892e8c2a39696605ffa1c97d4341387844e1070af49d17b485b0299091766b88bf50247e7d6938206dd8af13adc4a705d89b1e3b6ea811f9485fb772887b23a41d0f4a381384f541e136e3d7956dafea3bced0e59d577dd79df13e076a017da7370a2e76c96964707deb2303d687a251fbbe5d93baa2683b7f182b9354730b81dd7ed810a685e6da4a6b38c4856a04f5d236504002a92b3b955bfd717fd5d9a9ba3136e7bf7f13c83afcc86abf2df63db2e67bbb28c538ac8314ee3e6d5893c2cd464199e4d36f711c281083cecd2dc3b7570de72e1589112cb0f658b02b1e7b845d37918da09e67420b572dc547e1748ce0c0fd6c15e368af0605b089f560b67073fa0463647ab94ce5884436b5f068efa4e13a98721476a66208ad96047266e80aa238a1cb2b515f0a2fb86819b5914e7cbfc1ae5a045823fb3798e268dd9514d7fa0d1ec901ef70be7124008d5fe369091bbe8c6cd9c3b550dbb53915a0c4b01d07b9025282a29a2f537ae1be0822130ef8c122bfeac956534cdc918afcfeb9b06bc19a08dcc96853dd20db3d1fb6bb2bec143b2e743a851ec03501deb979add33ae644f08029e8a5c43c8eac8f8a1e1bd5858dfa928d163924040944a051483aafbee95895616687c6948c92b48d3832c997a7ad0efd0240a163cab29ea68d56e797b80319d3ce5a9a454f7383ef5fe9c2fd0d8829cb2b29c84896dadb3babd7a480037ef5229811d255fbb30fbcca3369ed3c9d3ba861466e007faf95b68a65d5863066114c909dbce3314cb97503dc4f77de5d4a60f9c1ebe91e6825659122d2269b6ba61104c823c651d5dc88f395ce486642b67059b88a6e924d8af466a4e94af8d9d9a387bb84c4efd5fa226a99870eac041411265c1a8018957fd5532c9671523b5fdee3b88c08adefb346361c05f775a778ea25edb39530f983520dbf0c6261010ce35773939bdbfb95a1ffd99ecd24f7a24484037d539e63ce51e851d293ab259626501443826ab20d8d5c765907fd6c5fe161bb9d80fb0450c6c1acd4f4066c104e589096aec9da6fadcf337a95a4336342ae0bfa9eef61a3c183ddaebc61c52293f99b5e5cc0fdba306e6c895f23b5ec3f2bd87c4add6c8d1474b3903750180bbc8bc844c47e39d2af141c11c3b443c9a8027a0c91710c71189ce2f5bbc86387e2e6959669e8bdb1b1838f71a6cbe5216b1c6b2935253951e432717fcda2a35474715a8045a8fda969994f9e0f2516ded0becae8b957e6d49f62ec5977be0321c59edc37b4c8f2d36280ae973c3af61f508946d7c781acd6449a621f9fe35491b4b5f47c970f64882de223e3d0350f5752882c3ba66564d0dd40f64787f3d6f622a16c9643228c7c494abf95e81e46ef6709c992ad0a34d87bc8207c7cafb765be2cd734b828db887e08fbc5f9ce0381c4f04477dc79f9d65b8d73b5d8dd40a6e5d0658b3293a5620a78dc8cf07530caf497835994a8d63907f54637902430cd76c1e30c189f25810ad158a080396b923570344deaa4d2e934ae15294e7af11fe3902a36c6efc39a522d9cfb0883f04a0e703e0ec869496c021f94c21bebdff15ca1a4c0959a5d4bd81830096def9ac9948b5b8195abaf1fe53691156da7611eeee1602601e7394de0645855ca16f469481fdc2ecf9e349004895a6b2ee3cd2ab6d6110dd929a14a92d678f86a39ae4d1dc5c2dc4ab495c0136d5932dfd836b52274ca011c9071a38f4a029ca31b7c88399203bb1fd2140847d4ea27a6fe9ca5a81ba58c10765d78da8926386257a81a0060b94e4660f01d2ee8ef0abc0a7c9c254f71bf20fef8976afed0002e7361c6628dba3c9e98d88a419da8f061f473e37533a8fe296f5b17a91968133f932592c2108821d41303361b8279a36f0ac712713c5fc2fbd15518ee000f89be77a32e6ea7cb59dd1f0eae02b7b06e92b3252b5e22a2b5e6d05abac74c53bdb2475038f26ea39f1e54c8bc2c842e013d8d541bd24e86bc61499483d9d1426723b76f4ce8313466f200b646f069d1c46dbe54123358f95e22d1e7e993cf10521b3c06479236570088a90f42a8682838c7c3dc320aaed2710df5d6386eb58ddeec26dad308bdb815bca1aa0ea812a9eb5c31029bbb4a962a693c940c1284f921580c444318a322ba5cf4357dd9a0310b0e79fe889a659d7bba8c34de3f8f7333cff25c3591dfbfdb3206878943588dbcb8ff8608dba02f6534a7b98a772555dce46992fffca5359183c0f9c51bda0248bc38f609d77f97787cd6d541a2f1f558046d0896d42039a4e7a208e2b178147b2b5b6439b0a30fdc24f017921d0e1c55a08dc240a5e34d9647489046911764d08d1f4c4078220d21b98c1f7e06ac0ecc350e3686f1d2af3d9a7fc0ea7e309dd1811af2c2e0e6be840700f292831775019905a04f20ca8f1f8eb15689090eee39201e17b8bc803751eba6ef576c08959c019a80b1a2486abb4a88db960ff0e0a18a8181fe0a10615964720f85cc1e001445ca3ed283fd291c438507c09563258e62017f90b99e6854d30d5a6680115664d41b889c48f018e575375abacae7293800cb53cec3b6cc5cf0cbe16fea286804a68714f65873c9f5bea01499006cf08ce9c4c0d25453d7529771b98864eda238b2b5dcc784493164880b0fd013ab2cd016c0f9cbe656c60390095b96848f204100d417cc9bdaf2f1c9f606b257ca1d22a1ade7788791d216aa6b163f92c6662c15680eb0d6078ae397b668c0744ef2a737c12e9aa3ee38b0276be0e530f211961948c665a1f72d059193bd55ca728e23a938d084a42902e3d710c3da2a103b720a4dc14b0572da63e52c7d6f9b7b41827f9975735f32be033cf3735f7f8413aa56a46b4ab1210b6b2ab9611cdd77be6796aa41e8e794aa07433ad247c041fdf3e5440640ce8c8c42467ad69a69054a7a1426382ab7122645cc1eceb250c24608dfec21b0c4adfa1f9888c376d4c677e3dabbc96545e9eb49b597b605d894e6b4f4ba48cacb10ea924a8ab3b0a324c8a86e7a880898a86149f2171d2d45f14635d7d8d7ecbd028508e4463d7a4345f2b211d00b45e2be01b6629d95c194acc1a286c3b3590138d28431badb8e107575ff8b18ce16138d77a02c2108363437a3675954d3c1fdf6214bf997985d1da7e3b5e4e9dab50a93a405027449f4b929fac955a8b258534f9908cb00f2bf82efdd90927a278f686364a97239810e09a0a9a9c6f30e0784aa770ff24c1dc3a1872437f0763cb138a713cb869aa44133ee359ba62bb1c11937f2797e2db287aeb62728d3496c4a04068342342e96393f41e98c6e6107ff2a16e5f8bbadd71e93b0b5bb0d854f908f618903d2f495ff0721227744bf30af5a2bd3674d03068f202cb1828004e962604e97ffd5afa06077aaa1d6b9389c58e1d87339ca18121ece6be748b3d5cb27610cc5ccc734c72a6bd2fc2fb0369a5991be2329361472887aad5453107c41bc4859148d106ac3d2a331ca7c652035e5508830bc6b9a0b18ac66915dd2a5c28e66144b901cbbe854c3c5829047ed30de85d2653727f4d85b9ec800b802bcb3689388b126d2a3593c94842e00b1ab4e5e307aba0675fb162892164aa87d9043305b7ed60288c99436bc2aedfb768a93c6cf98813dda830126d82dc87c01076d0f6672803b2fc385a5700cadb17f2ece9b7752537d57ee0b806ac432cb69ddc290a0ba79072db4b3d1ea2248239bb400c2ce77c0e2f197017a879a55e6e76f1cb6b8717fce17c3704731085313d330187fc43a22cb6a8944b0245bb00d728a011679a0e521273b3ecda8c3b7c088c146104062a056401483bd52365f9f2e2c59806b5d7d697ecf2acae51c0e041a8264d734b5cc2ba9713d678531cdb936f03e7a331e9ffb5a0d27616327cdf6f87f54a809f2cd2b3174dffdefc600800c6d87b4635c5fd49a8612c4bda99beeb6d98ec3feda72f48b99f408556f5ed41851ff22d7d0d833d54756c4a01f229deb6ebf89448b894f2be8cc757d458660129349e1955b3951939bcd8afbd52b338304e78183eaea2d2108c9a5e74ea5d1648733ae50af76b9e9cc4b5eac4b5bf42d593ad8c75f1a547f4f8a751f5e7241c5044a422b2e474fb5c928e78db017b9ab5bc95c1e284ce3705cd342c822f1fe144c8dc7ed172ce4927d94226dd6f564f7e387e5581748580ea5d850aca48b580c6141afd6262f80fe619f9ebfcc6092392e36493f2e297013a8f7893d081393ac28b9b9a016bbe3ffb885e5bb369667bbc5eb9ed48e5e4a1094b1c38c20018309dbf866e62de2bbe8001abe4203ebc403bd0ff0fad4a3bd39c2122db80195549cbb5289d703dfdee0588090a623fd4cdc1c86b142f9e355203c3ffaf318b7d98992e21129d278171adde4e23d8a72d6d5e541c46c11c8f90b5681d980308567cbcf22c67867991cb2fd99810c2aade3642296f34c29d21a01c7ece3dadf9ae8802800e287e2129170e4808ad36e3bafc2c2ad5dc051be92f122ff56234d3a239385670bdfb094a439aaeb8a0ea68e054a88f1125141d4f1ea1ced33b032cff7b46603acae8189ca7ab3eb2073663cef6d812b77bd7656eb85975cf74a033870608294d3649e022f45bdf8bc044c145b6cfae7567e5bbac91182aa022cb4434df5f7dd47bada8bf25db0f3d1727b3637648ee5d34f783de42df42881613869cd5660ccafc589273c7d6a21953e3f40f712521ea0289dcaef37de9ed19630855d710761318978a669ba49519a8bf4b8fcf20ef2766a0e116c0a500e766c5fbf37c0958333ba7d2f6eff7dcfee959fa724aa411ebb6b3b6c31292863f7f996bf7729f73bebd13f644bcbcd61bbc125a9323f23ed72e8064a333850d893e35dfbf5ee5bd609f65316766d98413e91b01cbc49c263a9874cc5123076719d80fdc436770f37d7a9b813f01a026f6aa0f302216ff329835004481f75aa4bb19a62511d325429c17b663b623bb640cf9c114049079682667d4aeb72322c80a5d4d449542cda3ac7c41b5d52191670cb62077f2aac9ab817cb50b9d97dfc67df7bae79e9bdc7633227b85e3fde18b4089a7b44f0921461192bb7290e9560a44c28d167555717281f477adf6c0b830148f31b35d3cc4cb24414f829fcf924582b265136cdc3c674330b022b3419229ab0f8074e3be364a27890b8735b5f82beb5e60a03fc0f4a1e689f5aaff097e75a85fe59c193512f8a14c044b5500fc57095368cb043e887b2221e6e5c9b28c2bfd59ae2cda8b8f5c35f221ba6858f7993f5d0d9f61e301fb99be9e6b50b1ce923ce44a344c0cf84a0c6662151b635a89c23128d8859fae941d17da0a9d38d05469a1918e77be7972879d1893a85a07ccaf12494f33a489120cd2d431a359c77b9e8fce591f1f896f5712ba750a430f44d620975322323aab66a81be6a493b2a78bf87422cce0fffddc660099c9e555e9804f8962d536be2448cde89e2b234bf5ceb4b486cf36a4db76af1a7c002eb16d5241ff0049982d611652ffee81a175d666731bab7812bfe4535630886916f0800558b230982a222984b5171001db55de3d8c1a874155b69e001fa71ffb0798b29814f2179afd4fe9051b6b155281f5e69aa7c8bc6466f0962f2bc258c2d5c1b19bae840a398f0216416798d4520be5f99d73f056e7a7aa83bc05151cc6d480e299adf02617e857b43b520e87a48848ade328388939c675262f98e0483d0bb9491cdec26412929986148193d3812efa6994e231c53828e1bedbfe317c0f0efd48b45639bc4243d4000268ff2938aefbbc2dd8a958a3899c40562dd0688bef6f47ae5008f8446082fe1f07bd60fefe5a70e33e0aecfd02bf78d662f0b0414ba15a8366098464961605add6567fa93a8380557f5696227182147d27298619b1d94562ad08c1d3da9bc0589901862e7820035f639553151b59417ed810e584e482623a99964e364d60e05282f42ab363f75509700429dc3b13b1c53284114f70669728221ae0b2673d1e3ba4cee475e998cee75f55487135e58214531f272ec50a420f9da193360c18378a3417a50090acc32e7208e4cc0b2c70e887a02e9cab13c7ec28aa292a11e8471833a91620e0f87c4f26b1ba527720a0eef5315d64c704f849a2f9ab0bb66f0d08557bd769882aa0283b1d9fdc3c00e349301fd1394b35fb80378ab524a084da7d963da9db6d45d8f9c0541dc178eb0880c9d96f8127b11a9cd4ff02a29163383f34db10dabf58b37e609cf95b7e328efba5dfa2d03096e9e51720a74762f5abad6695d5ac8895f00176c72102143cf84e651d79dd64b88974b5318a2db6d8c7149bc5e6c3e9cbd773e2385ad611003f172712b2da44d502218b6a61de7181b957c6e9b9d58fa56c8390ad30ae8b4e3e28dcff7290fa03b762d08e73395ea76e5d5ad4586df360f798bdf4089ef3a7b78c1229318873081ce06966cd0b2f8379dcbda399bf573c8077a07e00b9b58b76af982e8b0096a1cedf7a1dc2eb4ce6cd08da312a041548422899e44bb738a006cfa452180534ef75e5b2b132ac91deeea53b2cd568da01ff69136f79852baebc85cdb5f7891cbcdbfdfe9e831279ace5ab071ebcbfa7b1d5d962bb49d7847e56631d3462d54e361e8254d35c013646979638650a7569ba9604976ce98d09b38385be2db08e00a797a959e53b0c8de9365ab34ad7d4d4db799eadae830a3ede32221a1e32f87571ba3a020756aba3442c92e314810ecdfb27a1da4ab177bf53bb4dbb5b5720ee424270f368f8ecc94daa5cbdf725b1b9199125124d3ae4fe182985d1441a5bb15b2067a6b6790c8519d4b0973cf6c398483dc921fa09693b22c3a4221c3d0aa256a910ee478a3fb8c866115dd3ffa4a90be984b65d4f8c58422f9cc2f75fec4bbcc6dd56ce80ee27b5f81ac8e3cc9f19f15f65863579e25a64298015b24b5f2d7f74e9f955f7f1d07f1c6a7f5210d0294adab3eda5cb67294ed4b63fce44cc1dfd57f09744ad4523ec843eaa017a8b4d4a021c0a0e688ca0e42cf46bed0f06af6cafc1f7e590c95e099c24bb1e89036d38e41a6ab756f2718af2b7a3c88066f4c9bcc11595405d39435c7971155c95d43affc49486559cc73e30bf49766d8828ad27ee70e5d150bc1e5c33c18be94f3be5859ed8d9fc167069f6a0a49512bd9af33ec28e0a37bf515b14426ad57e643284691d925c079b741c188483091896178cdf5590e34bd44a70419d95d3346058089cc2e2f41e8ea838855d7a16145a70f2e6f8600375d7eeb66f636a8e7ba4ba06cdca2d18ba0e04a8d77479b012189243fc76a1b5db55b5bb8873ffe6b4c5a826e0ded0262de2c01f5e2fdfbf6fe9e3bd10923b697c57e16464062c4c3d5bc322b994be09f82252ad4f2ecef844f8cdd63c39fb272d4098b79b22fc01012fde7c3e7a2f73d1002509070a0dfb1fd1506fa4618ebae4fc6fd7d05a35b816a301cb2ba6677e7749e842eff28777c3884c0566eb47d33a2c6c4356196896954af5e84dcf049bf6d278586c3f9b85fac039f0590b084118e47b2716820729b402fb9f726f8d86343f91854fbcbf627fc3dd77a82412aa2f18b7a13a798430cb502234cfe5b6f2130c3bbc9d577f765b997a0e8fa86646101303a49fd10936b700986630a3ff162e73ba6d4523e1c2be1dd0e1b99b7d5058fa01f7b78d87598c47a0f5eec0c9cf13fbba95538efa4894eefaf6ba61a662b9642b4129a5805dbe51287269100caeb87b69f1c1386bb141c690e1a990815dcc54ffdb3d3c2fc5f9aebdc8f3cd202fd2bcadfb7d26e99fac8bbbdc8d580dab67761ed626366295512fe3c8a3f7b050d6c165818edc0e469fbc99370921b8144d04d5d22801485468309fa22c32be8fec62f8be3208503fef9e37bbd61a64b8eed2ad3e999c4b887783711925010342bc45d42f53662c72404d20349a945f4a646159a6ff4ffc578e3340287932418676a6ef35c091afa446f120a21d3bf9dd1a5cfe13644f06751306cd26a08a003bb59509050192080dfab035b8dac25d1eac689a99015f34e97a7e4240415c00747428607256a93c96da15ad766cd340f07870555cec9a8968df16026f1d44214fabe8fc12fb7d590802ca1cc60268b141f7b6671ad30956ca730da9a5ad50941b818a44b0dd9595186db8b513d54fecb508a68ba24dd2598726fcd8c061ce796cba2c6e6692418db98627d2b1bfbada72948e7fa79e10141c75205c285db809436eca9e59d57c46c1e2af398f555ce200ea8e9147bdd01337e8316ee9016ee801eef50637ebc971479284072099f61f598bb29355da075728049b3b46a5d08dda22475f78db759e9cc8c76fced7a03b06921020d3bb8f8258473ffa78146a0e7508281cc282a9aac64981a5f3d8129f75af5fb80364a2592b1dcd595d60dacc8742003807a05cb21b72d1e2189d6c28b1da4c5e993f0c7c9a6d8342daafa0719e6b11eee98c60a9ae33ca6816b00cb768e181be59cae11042c649a8d056d080dec50932284206d39a6873bae0510761243e25e63338a61589898f2b01341099c162a2bda31cc51c4abac376cd70b48fff0bfa67e35c4eb2ff5460124bba6e01d3b4372775346d6fc476418315d60c7c8beeb5b746cb13416eae4ee5a0e2fb826e9a92de05d38e92cf622085172d7afa9f0db3cd5fd9396d3d2e776b77e35219abad11e7a47eae0782828ac70740247a7a7c5c0e8e4b4ce2bce9020af96e5c0ef1a12cf81caa7a70668b2aa79739f34c7ea0ce22fa0e689067e7d4e1e2394ec1573bdac12cd4808e086c41e1f83bf8fc056f6dcf6396adea9cc6ee2e9daed981f84161cfb7704d350ff337abbd66d673ede3c62fed1b157221326cf96f4e6b4ef2aac7f4ff6b79a80b25b2415536dad760d1ac1bd0e62c7e54510401c0bed2049418ac4a9193758c0ce11fe686a2071d27612ab426d391ace54fda12efdd1b67736224f0764d8162dabf93d75b3702754805d02746d18bbc1b9e995ea70e9c036b8fd6d872578e8627abfc67260a4d47a22847678f8bca5e01c6709dd967627950a439e4659004053e6ad51d844ef4eb955678f21821e8ab7ebb1cf2ef4995858337927b88e24a9b94d659215a4eba8d34c451249579b640661973e4588ff678bcc6e4f5b62f36c02d187af8565659af65f9e9e6d432e1e6ea86ee8a3dfba8618f626228115458d344e6cfa46f1ce8afbd17c76a2e0bec7d395d2d5a3700febabb4d56f2e6d32a1fe4fa7f1977e69d299b392a9e7f183f83d4ce78d58b50dff73f6b6d5f5d7ca6d1b31405c38f859975208efbbe89724361184c4bbf0a1a602888f0e3a8c352a69442eaae527ce96b8aa914ba54e2bc524f82175ae04ce591f2c319caa7a96f8b2ec2293562a8f47108108a269c8409e74d26148c560469d9465c52523d63380d168a950c4387bbb1fa0ccaca3100b5b04f714d88616deb540c4657632d63cd6723478b251eed023c5ba9521fc0c47dfa57211c29b5fb7114fabbf283036a1a1add2cdaa9c255b5a5f1ba2666d1c7c60dc57af41aa4cd1605f075f53eda9b106620cef1ac61aadccc25ec9305d585ea2c7b03b1f9933788691693b3ff14e131406093e3d1ebd4d8e3cd619173e30452b321b0c71f798071b9070831e7c4e22750611867caa2d909c8db0b3d596d520d3f3f8e690eac58a088dbd7a4317810678d98d002dc3779c2323d1ebf0dbcda240551797761f5d34dcb53a64720e57f863d45994938683ec2736d8f1e11eaf85d107f67c75114fd3d6e1d3d424dd403d4e4c168b82640a9067c6177acdb5c9515b77610431163b54d639cc7d8df794b0fa79337d470034f9ee7c99b8514d5dab7b908c7334ff204eb11da4f0137456f4f9c9729418f9ef214a45dbf5da6687914a03c14f444fa4d83bbce99e4ee0464926cd8887e203fd0d2dadccf00bd97fafc275a952d35361475d3a5f106a8021a85b815a0a55315175f05d5c42ac0b85948242859cb768a3eb9c96389a8907e53860da55f4d714908b6123b38ee3916ca5e4e6861d64cfe10c6dd734604517020ded25489de1c1f262a5cc03176d21402ecb53c65b78a42c4e329e60e2891e2cc84e17f0ac8ef9bf0da18d462f9da2c622b000044e4bff9844a2ce9c947a4c33014780db6ce028e93881bb095bfd6f9c6961e5b56520f75155c0a801e307927fc415be47203dd21c86e349f1ac8bd243c7eda7f018da8928cf2dea55693892970358c04e0bbbac14b8181cd2bd34e211bb9d418c5d6fff7c1e464e29e2a4e12691d7c442a156cca2377ad0032525041fca103aaed629659205a55550719bb6a1411f68e25449a4fb88e05b9e02b04ea11470b31192020a280d82a1469eca0969110215f93f8d24082ed48e222cc83c496ee2c09aee3caafeb288ea2bd3a3aeea4685b146ddbbaf6f7f6df7b4b29a59432e8085e095d09da64ba48b7e77518d245da70f777fa4eaebc051313728672516b6d3269933669da79fa34caefb7b3315d320a8d461e1a8546a5364b70542853254fa94b0af599c8d92963610465e8a41e7bde9536b9e36e754f3e177649bb930fe9276b417561d79d2ced79b57eebaa5a9348260e6ad044672ca4683f7dae2f39335552391291a3182209d9d741cf4470ca9eb8c0a9ad59a8d6883dd1c0d9090b55639d2db66e7bdffd6ebec277bf9bad20f316af1cb1ad309704a19acfc58e75b916da15532528b1b10e915b91231b5b1b6c0f3fcb6057a78576f5186c1aa8841276edd319c1e96833d455c1daaeec1b6261d589e814b919d9d58fe47645b22b10362d77c006b99673b2ed9a9f0f15caeaa250ed0b22d22b8b427f8d02bbfe21c48c814acf4b80faf9b500ec663fb78f9acf6935e7bb0ebab5319fc619678cefbd18e79b2f39c3d8efc62ed7a4385bac02ecd46ffea91602e208fb8bd68ea163d0f1783189cabe6e7dc47e4b4f8da9b5a2cf37b63151d62f8a19fc489b708f267d42495d67c05217edfafba80b5856aff445fbf7782ca90b89c2b4d7dfdadc3a013b87575aaf08d4b952175067ade98b3e1f9fce35856e3d03a08f59bf36cfa0a45eafa54027d01867a1b4d96ffefe7e262de78c04bce50cecd5990705da387404171c61e38c2990cfd5814853686556b5a4dc3c9630f2bef7861fa6672822b1bf73fc408c43f52a0143a988c41f28d6195d7f60aea534987cefadf7561b02bf94947baf4f15d662f0ca44a4ea6ca933daa9d310ed50f25565f69aabd3d81a5a60fc4ccfb062200c4f7ba6b8ce159b18f76094b5dd346c4c6f9a9d868de9cfa418cf80ca6a7641a42977c42111d674062803ee68bc6cea2e7486466b85311832693016e150a52e22f991d847118770e8349c061a367983260d8e1b00d8d8a4d12134b4687638b2e63184207963cf9630cc2c3675189530f45ac1cfc4a6d5828f0e95273f55be525e92ce9cf5c53a7df9b495b1679d71a12fd67b542f674b8b4f1562759babded9adedc15d2921d66a435085ab0ad3b0a6f8a9aa332e199897aad5ca1129d016abe8d49eaceca4555facf695ebeb95fc4cbf1448ebf8b6a8bf5217f0730d56daaa336f2d0a75695dd3a98b85424969be2dae615c8072dcdfe76268d2eae720c22fdfeca1a7a48e2076761d042e6d0bb08d95a14c257ecb8ee3b74e97a45d7ba97de49ff652e42215c1919c5d0fff644f91575287f691e8494e94dae91eb58b77fc4ae9488eda06d04fd65b5aebcbca31f6c0fbabd5ac34d731b27988adf65a6b2d0eae3f2a1555acb5d68a84a903ef91381a0971afc86bc969e32e697897a2a82ccb2fbdda62a5972fa2b175f4a1f926a7b6ea0193df4ac5be2e8e9e268eea88bdf4fcd549d1929e74d12c49176b59e671f4f2a6e4641e451efa929fbe74d28baa8fa592973e3a8db52979c8dc4199d8c2f2fbe947a76459c7df417909857a6c61e2d78cc341eecd02a95bd411bddacc91d3ea0fb174d1692313c7eed10f9bba45a2491bfde42517fdf4a5929f4492491bb74872d14973741a8f71e39d6f76948ef768ee28f9583af6bcab570fd49992b963e4a38fcc1da5e73d66523932ab07ea8be8a20f5dfcab73ceb966c76ec9d1acf973a220bd92b3d129290405c71fbb3459d10c60f2144051347958327aca512a37099de461f8a18fbe0c55aa564ac8491e7ec8c5a7e16c71c4aac1c70e4944f8d822b388d70e4d16193a19bac80c4d9c4d7292f834d1b38b5a14473d5e95d441f23014b144b3061f3b64b242be43e4a287442eba6834f2d0cbd0c9a7894e47178d1e7ae93714864226890525c9e431ded0dc31bac8dca17a1e238d64f218f758aa9cba094a65627b96989e42a14a272f9d4aa35289e4a558f290e4e5a954f2902496c2d054324d26a7b1e19b4c5add6159965efa1796e114401024812008925c2481e0e869387bb4f291292a475efaca696ef9a38f9ec66314710d9135f820957cf4a2974f1b77e957e43b462eba68e4a28f5c1479a9749a4b7abb4b128be43b4a1f392bc7e8221ee30e99202d71788cbb475559510a788c4770c1115ec06354e1fbf98e1cd6b589494e94d63d47dd11a98d61ac33c658639cb5cef95a7b03d156129041c47ab980b149dd7e154969fd734ab357d72668bfef69dec18387e3fa9302042988ec30d49e1b1f5bb7736a63a761a8427aceef0c7b7cf06c9a751ed467dbdc7290ce60e5a849b6761a68d27cd8a436ae426acf571fea72b383d66b924d03593668075d3bdd9f0d798736417327045a98758bcb5488d4026d4ced398ea20e1d32bf3f95a50fcad1f38b36d8d841d1b46df0c3dadeea5017ec3a0afba385d8410c521770c439e79c73ce39e79c73ce1608df0067ec34a69d461d8bf45eea34bca9991d7bc6f8cbdfe7f933e9850d6107860ada980f16352482e8e373b2b85d9d6671a6a012a9a440402318d1a65ec2a0acee6363e4a68e8788e088de7befbdf78ee0f581ab4d824853689fceb62e42612ffe546468d0dcc001801c6c0cf4126c5c02ea372239b6a9d3da220a0ab304b0327c5b51718e8aad7140350eb4be5d991e626156e3dbaeb5565014d532448ea31e6204290c399578ca0765dd293fa5ac1884acb75b1454867d4031157526f3ea8bf531d7ea229e399fa1897d70e27dfef14632c7d7c71b3faea2879cdd8ac3d11914dcd457beea2e2c57aa26d448e98c71c6cd270eb8ab188658bcc569f4c705dfa62e0394e90cce8d0f6e9d6d6ec76aadef25b3e3cfda6cedc2a270f1eb9d1ff75491c32ed8d6f38eccaef316450ffd484ff114ab6806b1430faba9f3f878d76e88715f76f06f508fc70341327b48ded852e47d35bd0381c6b79be55bbefe10383e3eb807e2e32a700f16e26361d6b4fb33f18ebad4689a07db7a48ceb287c81b3beeb478fd1e2dae81ae2cdf2eced599af565facdb96af2cdfb353792e2c0a95070bc1432cccd619bc03fa8289f4c0a485f00e0aa2f86951c427d48ab3a86460ce9c825dbee1dda5658c0e4be6206dd38239481bfb875f6fbdf220ded5194a5f44b73d5bccb71cfedd2b2ca44b0adf6e90e5690d505943a1ad34147d8ec50f955af1a0dcdb36f3a8972b9f83f054aa7ab352e8a8d05d950a5f9c2a19299d516e2ce6bc71aea7ddf8c7a7a7c78950d59f383a75bf32165ff116cf3792b892a20cc71dd2353c0efefd68fb4b27e9e96860babf1c0793f58f837fa67ffe387c66cdaf90ac7a466e78cf79afd913490f0bbc9b7ff150971c6e1cc7711cfda56fd070e242196bd972141416a3caeb70184f83c7f81c1e7bd0657f83cb3c0e6ec4f7700b7c11eee371fc85c65fb7f1ae19fe86bbf899c3bcfb8bb7f1980cf8051e09ff5eb4537ee7084739c2cd1a7ff7139d7b816f81a762536902c78df9283f47fcebe5273a46dda8ebf570f857d00b3c77430ed7f9167098aebb315d679aae7bd37528a6eb3ed375dedb3d9b5f2161d566376800514014f067ab5e27ad9c01247a14914301fd45ceb4bfc81bbc6dfcf51a0f3a8dd73ef32df7f145b805be871bf148b8ccbb3cc6d7f8119f845fe033e0df933838fac4519cd6bcfcfb5ef92b39f9d518a88b75945f856185e4593516ceb3927856069e85c4b3701766bdc7b38a7896eec2acbf563d0f94b05136d6789f79fff1ea61c0dcc180e93a17666d985ea361bacd9ea91f3a407cd78192da33658c21ee2cfbd78eba588ffd4b475dace9740a994c2693c984b211f1abde85b1727ee800799670a33c123935533cc121837019535ebbf900f06fa3bc0f1608cb838c0015bc7f1bdc7fd7f0dabfd71be66911ab5eca56b259157296b2a56c30453ccd8e0c8eca8f0d776b4dcebe961698ad1dc6d7788c9f79ec6d5cf6d765fec65ffec4673e87d3f896d7781c6ee3b3cff03478ccbb3ce541ff3e6ff37b80db955bce732c24e9e968404f7bc3692fa6d34e9aab5e2e2b94a49e8dd148b99de35f475a38fe65e4c5bbb19925e9d14077c334cd37dd7c999f49c3af7a35bf4272c2820539035d8c1953b6db78f7d7d3c4febaca6f997f055117eb4f6281c8ad9370a2174f8c7fe172a350f9f2729eee23526e3422c1c4bc70f1ac1c7b5a9fe1593618cffa41afffd531e30ccfc26d7c0baff12e4ee35b7ce659fce467787e192ef32b2efbecb187798c3f1dc6af48f91d1c3fe2fd02ff46fc5be01f05c75f14e12e7ab81963ee14e16feef4706fd1e2249c8da9d8ecc9021a536962d4dd2a5099d780025d99eb2e2cc8c69c47f2028d3916e8695fced35da52a4b528e96223de82dfec573f997917fb1fcebc80b88ba58576942c566adc3fe75a32ed6cf7fe95017eba3ce6ba0bb8e05e78d2f2fe7e9ae5295a5259d96b26deb2c7ed55b21b1e7c9cee62b578592daf33bc9198a8b305aad083cd915c5a4f9d83d1e9c7d2c8a60e1bd2b5bf52ecc3a089665cfe665b36ada8673926e4f95bf19a6f277e545e56fcaef10e12844982b241676cd55cf48595d8cadc0629c2b545250ccf718af13578bb53251c52849a1629c4c316284e0f739cc46f9d7d37dd27299341f5f0b643ded4bb2adaf9ef6016deb26ab1e4bc7e27985615b47ad7ab4970c68af1dd0583daa4d5bf55e2b78d9008761d3563d707cda4b04b4170a68af166cebe1d3b0154234d60ab131d0ad062f8fd0ce060a851e30b16f68a7834ee1a39fc9ca41fbcc9b243d37497ab64e2244dbf12649cfd6e64d9221f6ecf92ebe9755ebb1b255cfc26ca6ad7af86d153b7bee54744e3e84b055052fd0bad01d52afcfcf45b27bdbea9e7d79eeeed660d34cbeac3555d7e836edabd1de570be9ac11421f7b4790bf13042b9da1dd864076e7eedc9dbb739fbbabb3f31f1fcc0212add6da16c651ff5e4ba1b3383a4316e668ddc569ddc569ddc569ddc569ddc569ddc58535eb5dc0e972cee7dae80c0cde7b2d126b96ec6c66207be62216661de6cc47ca7b75805c9d0c54eb0de495a0bc97622baa6e6b2ed9f4a66ffa664febfaa6b2d58ab4d72c85485368a3cfb67e751b4ba1b3a7d5b57b816c5a4bb4a9eec3d0e7863ae12e046265e313a18fde853e7a17fae85de8a377a18fde853edb8eb8d0a7bcba5067f4c95b105b25393b9180d27befbd18536caf88b6635ba0ccd3b79c911cd13948a806b22d0d0264d34bab69553b0775a1acd6b50eeb42dcc598524ae9b5ad18be37fd8485598da3d6b3112b038f58987522448a143162c41e3982646b1c18644f0b86a0be41ec89bbb71087bf5071a84193bd4b706aa3f04761b96aadb5d65a6b0d3eadd15a6badb5d6fa027ab5ed7741f0662ce82698d03affa9c5ca44e5bda397a2d6e9a4d2210297749e5b1c4a949a0a9191c13e469b8b20d2149a58dbd65e77109434103ce153cbc66e98b3fe00e8b45c846dddea26fc669b4f5bacd9712441495365d979dad382e0bdb5de7aeb3569dab3e7d192397f4a8b8dd12e14f63eb1ef0d7281ec7b7f8cae5b245676816ccfe47175e0b7e81194201078815417e8029dd7f67668de9c084a6a4ff042b1adad15c414b8ba219a033a043a04b5088f8782db0990d4a07a449ba03c2d218fa156944d03d14044b9eadacd9011832ee26c0c567dfdd3b8061f9b25fa8e9083ce0a813811e03186aadd818829cca626a557a7b431dae3e1f1f02a499253a4784a3c53a450a512cf14289453b284429dbc4424c2ec1293269e48d23c9924e9550a720a1e1b2379e40935050fea419356532929a64879e549a578a9295028d4140e7ea52c04f7dc2aecae44c596a2ced05d322b4fa69578c84b292f392d7ba9fa2d475e864e2a79794d1acc2eb93d79c94953343ede3494979cda7124b1a01c993cc65d86dc149ab41232e424d2f12ecd1d239197a49b4c260d66d79489e3b44c9a628a3a232a3d548650268edd2793e6e3d6908f4c5ae5d9a53a457d29890f7a09c4a249ab2538a3b1a3c7f60c893df0de417a764ada88bc96261fbda8542a9d92b3d2c8452413db93741a3bfe8eca471f9ae0e71d5559aa1eb4b090936f499beca127b9e8474e7e28278a31748a83b749a7e0d93436654545beefcbfee173080cc3fe61fc658cf5f7895e63683ef6fd34fe72aed56c145763ea82a3b8f6bbf6b3d908b6e29bf1cda06b5007f60fd39afb55d7919a906ade22386a8d5d03bab6c09252999b349cd3adcc2a1f5d3443a67ff4d3387fe0673f4bdaf04a928495437b766d8e3df2a6f6a4a2bcf887c6bac634c61697cb01776b0fb7821ad4a3b1ddf5d420bbbbe96cf1cb3a37bbd3d13a22b8401fd6e967e1dad561fd374050b83a57047667771054b980ab2bc88116610ce5d59f49c7505eb7b5ac3da776b21892907bb967695ab7b55f9ed2c67aa9943309ebd56acc3fba91ac3b7b9ad41ceec2c0cfa45fb54d5f981a05b92194d644ca92ac3a190cf90bf948f6028924d2a252e72e642ee4206db2d227d24364880c91213244864e3aa49de96432f95464ad694d12331544bb5418faa0c30f103f00f1589111d0200158640ea66fd72236a679a6a7716fd0e896fe4c562a3795784a65527bbec65a6a4f99348c3af9899c9d5a75af9ed6b8c81c01219873f6cfb34981136f4dda407757679dc39006ca1b126fa974c5f1d3a50d01b5542a2a74ce5e731428740417208102e99cfc699dc9f069fc969ed8148ea4907e4e7102b46b2da646b0470606f626e189c749671c023f9d595c715b0d73d2feabd58a6849ec8b75489bd507b4272664ddf5b9422cec3abde40ce54bee7f72f34dfeaf6955072abb4f91a0b295d8cbe98c13c76ee94c8a63c714a4b194631f69cc1d7b49632ec77ea2b1956357d198e9d85b3466e2d89dca4ec77e52194cb6c2b1cb50190bc74e43632dc77e83c6583216c79e0395b554dbfefc0ab1e71db281f273da15b2afcf1d72ea1293fb97dcfc21707a5776c1376960595e2f457b4721f6a4615ee965af5cfc33d12a2eba7c4e14f70917bf389ccbc559bbbe6e95bfba7b77e4e5b127ad56e472d9163708bedd74cb3e49794b5f4a473da667e9a907e959baeb4b7a96befa133d4b37f9163d4b2f79a72ee548cf5245cfb2743c723c7271349658f6573a1e392efd034b2b407474c0d004fb61b385a1d379736eedfa17125163e9513c3f0b23476ad996756e417a1786a4f789bc151bc56ad92363cbb441aac7389cbbb0abe3d9d988afc2b3ebc13e78c8e396c7401746e21b75b925637e949cc8e5237256626ed5c90a719dba3e25bfa3e2a362e2297266e252795a63625a22f6674545999d667f9ee472b15ca32223d20259206bc4f2ca929ce5ffed7a7c0bf204d6ad5861e2dcd5e524e55942b9899ca15ae7d31a540e6cda2acaebf7dde66ebd4449edf92a9136b0ed32314e03b7fc272dfc6be1628bcf89c25271b23c2754369133ed3a65a185cac2ca45c5c5b43a3bd67661368bbbdd6c8ab4397bde9cc9d64f4d5b23776a4fa552d523352848a5ca42fe94899ea1ccec04d628aa8cf94d9bf59417740449b6659d7cbbb05cbb3023f6ecb5beee96af3f3bd587e52bef56207bb65a2a95fb79c2c0b0764a885c5c31e62f6d169f6db90633f244ce9e4117c6dbbaa65279cbf5a2af9393fc24213d3dae93d1c5ead45faffc6515bbdd77f2125dac4fdf9dae8ca3ed7acc3372e4c464e56c326954165e1e72b19ad4fc176dd8e79c855d3731827ba8276c0c0a3ae3732a2a0fcfe73f862e56148a72452c8c792639ab351f318259c693e9fadff3931bf5181b39d2b3a7145465569daec4da276dc88d6fbac632e61f77eaf1ed310e3f61f2188ac73c17a6bbb020f6ccd9f3baa94bd27212b7ae50d45c5881dc1ae409b2e240d4d71ff7fab771820842e2d61c7b5e5f41d61acc787a7755a62b4aa7afc4959367937f27936a37e597c3c8d9ebc5cad39a570e6c0220e3d06127870b3b3f0217769d05f9c38f0d779f9c6872769e2f568f83e8d3c4462cec621ce6d99889e9068de984c1c8598ae6a260c6fc78977cf5345c66c6aa8c83c0ee4efdcee9aedf5171d863de8ac741b87761d75b9f6baccf39a7af4c340b95b9b3c24ddf03dc25e60e0b17cfcf898209af397d85b40937eae2f32b8dc9bec2e2e1c61f8b2f2fecc2c81d70c53b8c5461de956110bcf12ebead90362f1be3caa0b2e262cc6f59f2d7ad5b62a41e07c138728632f12d0bd7c5162c30994c569242c94e26992c3bdd9ada18c69ecb112dd7f675721443bc8caf90eb738754dbd7032804555bd66d8a9244c8876975c8808eb2d3949b244488d8fc36d0223be79c69f66c6d919c79d9da5cc45abb6f92181173bef856dc04151d0a1a013f1745eb634f5b2be8748815624ffb09819ef67e3db987ca6a8e5fcf3b2aab1bf0eb9987ca2a137e31e0d7738eca88f0eb19476555037e3d07a1b108f8f57ca33120fc7a06426312f0eb5987c61ce097c6725aae9d61702ed03014eee70386e082b60b3a711ddb80c6c0db0e3a8387df09f80571dbcea8c1af5b3ad3436c88ba0404847840107edd69ac027e3d85c628e0d7a4f108edac107b0ef9517ed6c70ed13ec4abb810ffc28378175e819fc129f0307c021fc3797ccc77bccc692fe312f81a1e819ff1cac41be175036f01af39ef03037f0127e28ff0bac4e74491e255039f13c58b9f3804624c7f008ce380fbdd016fc371c0ed0ec4d3b03d3646c2d9f313028d915840cfcfe7ca48b90b0b019591aa4061f6ca4840176663a4207b5a921748b9cf8794fb7c48b9cfe7f3f97c3e1f52cf06667f1e80477100bce936fcfb7e779a7ff98c3f71199f5d14f3080303b3c54a8592e6bd985f80bff81f1ce615e02e3e013ec323c0fde9b6d1008f3d033cc6bbc3781fbc86124af8cc0ece021490a4a7a3c1cb96f9ec0d608012bf8067d57e7896029e95806721e0593a3e3c0b88f56c6ff65cc4dbdc8ec55d18cef2fc5499073d460b22ecd52d35f4f096beb45ce5313d5bfee24ff46cb57c8677ead20229ac55d2b3a5a267ab05fe166b60d9f9eeda025b9ec999cb45d1ca388223d826c9b03cb748148a41831bf148f870398d07bdc6d7b88d6fb100618262475c1a4641bba405ba70399d48da7c4da83c0e0ee36f788cc7e1b177b9ec73b8ccdfe0467c113ef3a0d368b98dd73ec3cfdcc5db38ccd7f88bbff198a7a1877fbfe28823fc75dda4c1bf26494f47032438dcc083c3cd977962aaf28874f32b2436b391eb8238e2ce29bf57a9d993d4bba8de45f52eaa87eaa1563d6a4f14ca4892e40c74a9c614dd7217ef82f1d9dce6a37c4562cf5ecfe6d8b3664f2a6a60cb02d1d1b141ec4d2452fdaef12f2447041161baedd5abd99327e7620618af1d75e940b942f2ac5a50558dff743b2b87b4b94b98c4fcf517cb46dac0f63559350dc4fc01fcc51bc061be00eee209e033fc005ce67970d9efe0b1d7c163fc89c3780178ad394aad1da0003c7cf61dfeb5d3e15fba5a3b80010a40800108e059404ec06aca277fb23f9044ce74ca552a19555a3b9bc8d9f5dffe7a9aef572e88306bcf85d913b9537717b6ab3f3e954756a01f20939d2bcaa652aedaac54094a95b2d9186dd4e960bceb66e673701a7f83d7781d6ee373f80c5fe32e9e068779d05ffc0d8ff9961ff14898de73f8eb86243d1d0d2cf049788faf353ebe9ae44ecd3f497ccd5d18ee078743c6eb69fe6d40f900788fa7353832f08ef3db85e570838e1c38a4523b5dce743a85422693c9646ab16c3f745840489b6faf7a361efb1b1c34de65e35b2efec68b9f794c291751849b60cbe53d7f9da06413168ba5e3e35937d7b9b01f367b7a8ed77ad42595d2f5426e7aef657aefc4f41e8a994def7da6f752b655cf7683869ad7bba790dc1cbf87d9b56cf99333ed4fde6095cfe1061c5ce675e4c071633e4a0e3a70b821078e1bf3cb8df22e1739d3ee226f708d8be798f2351ef3d75f3ce830afddc5dfb0f12dafe1f299bf0187cbfec6636f03e34f5ce5b307b62612f0107020bed630e02b6ea7de2ecc7afe81c0575dcdd993562baab1c3f3e0e0db78fe99b3fe86b79e06777d8d03f1b4a6c603de738ebb309af71f36de6d5e9b21ae82d87c9b556b62c5d8e265fef232333ce66bb88b5ff90b19def2317ce5679ce5630e2bed06b80b0c9d951b50b3e9dc70a6dfbcc6fb0fb7cd78af397193d1892d1e8be7e2651ec8e3e9b06a9765fba103c49e377b0631af49ce504ed2878242ce524e7e7b8bb73183c33c4d8d19322d966bd3cc60c3895b8d19322d962b85b4c99bc55bc8598bb7903778c35ca42de30ecf83cbefecf0c285eb6c4d0c8153521a26ebfb581f2b538f79cf79af3971d3b5e0356103499bbc61a6cab8a2071a6ff135fce5affbdb70989fc115f0407802be01ce80f7c15dc2196ff998af7c0c677999c35e862fe01fe03fbc035ecf830cddcd8919322d96cb793f3916469382645b4f416263b49431a48c61867ff56cfc6b57433743a6c57295329e558bfd60e9dc1c66fd000700d1001d6993772d63bc053973f116e40dde2ec8fdbfc383bf7ea70777f1f042a707ddc205e3badfd5612d415d94a02fd6639e95c3b2fdd0f941013a063c8ba7850b93551bb7cbeff8e0ff3b3d78ccfb8f77d085e93bbc0dace9c1f4db85bdfc8ba7c54b4f1637e8ffeaa12ed65f7e4ea26832994c26132a888d8767d52eec870e901b4c8befc3edfa9a53ab3f6c051243561d9d079170411ad1fbfedbae17af173856ef173be4f400839cb5982c1816c70ecd4e870bb30e83ccc19e30481beea6e13460c4c490b39d1dfcc578f2da5b7ccc5f5ee6fed7615ec6ff438ff919eee265f88b5f398c8fe1b09ff11d9ebafc4e0fe0cc4ac6cd09109c31593595dab64e4b419282a48719ff3a22e35f414edc64b11a34616b992cd36566f333633cabb67a56ce05c31d3e1623672f1759e3f778c3bcf0cf08a36ff1dfcf1541169048655996655902027b568d95d3f22c1beb870e7d71e17a96cd9ef67bc5603c8abf78d35dfce931cfc277781e1ce657f8cbab788b4f71f91d04f8eb7776f096dff1c117f0aefbe19d4701efbb04bcf720c05d3b384b0fbee283b7be07b861e64e0fcefa1ee0363d7f0f709ffef9d8984acd0834a6b284f34e40652a2150b1a9dc622a4e38efc7793fcefb71de8ff378d6c5f35f41af23af15ffe22da1527be152fe75e3a984c0766594aa3841ba75951bf9f2729eee2a55593a6f5b91d3523adb7c560e8beebf5297cf595ac02f839f0f5fcef4ca4f0fbf625935564dc7aae95835db0e2fb3df5b99efeb0665ecf0e02e1e4c56ce0c727662b26aacda8c4b8b0c16d8c962854a0a8a0c5346490a25e364922183b5c35e99341f5f7869acc9d358399e9d2bc1c2d92008b7570b76100696ed858215c8c00a436c2cfc21128636568d5513d2d383db142509928f03d87a8224a238aa59b72f7945a48d26c7ecbafc46fc812290acc147968115b9186691c845e44c081bbd452737390f2793079e6d7df41b2d8a9c92365a93a157d246889ae486e2a03b344507bdd65a6bad96d491daa58bd65a6bedbdf75e0cde30c639e7acb5febed02c6f40963708914826e9207953725289442289b039d9a5934c1bf1e66497e453fce91bbd45261dfdabf94674300c796aadb5de91777978d6e211bcf1eebd99bcc9f8ebd91663acc91b9c7b397fe4cdd5349ddb9634c1310765e8a1d1c5d0f891367c9f83fbfbdcb272809b74709334da0de9a3f973420bd9cefc837ff6d38ef0d93cb28e644f64c8ba9a831de820eb423b21e22ee413ea09fd849810eab9b210d085fdd85828c89e4ca0b19017423ddf1702bab250efc2826c4cb485bc40636228248a31a031a228364163a218124551d4b9321da228d224883232a2288aa2b84365278c7b09ca601e75b1ae23ee6a30722a627cdfee0c8af56b28874d16c63456cc1b977bedd047ebe06ca51a8b6c122e79876210cad1175019e8d633eeca405315a2c1be2a9ccac848978350eda1334ec09e7c8b09c2a6b546556585820d81b0b53c467090caa3fc952a199db0ca150b0b98abd5e2427f46e59b9cda99386ba230a94e2ea29e6ed4abf84847940b593b2bfc5b5959b122b52275f2759f2b2727b62445bebf522527ac950a65227a915680e8e8806109f6c3660b43a6f3e69cf0aec7e787883d792eac24955b916ab9fc7acb7581781756bb3f2a359b8e3d81bccb63dcfd41198dc8196ba57271655a2951fdcecacaca53e46cd55ab14e4e5627a9b23439f9fb7389dc2237c8c4c2bf120bf3f22eec9ea9142b559232efcfebc4bc403f25a994ebc4d2a8d39bbeda2bbe5a59b1f22a4995a44e582726af2b784a0be77452d8930a7bde1e9fdd856128ecc963cfebd2e272e5ee4feefee46a2ab0c73d3c178a223c552e777f7227272c48afd759e6745240914b95a460278f73ac974967e1bf8849b4591ef32c4c0a1610d6f1a48ad898cee9a4800265bae93df5b8e43114580a1eddca4495bb3f2b257f7fec79fde42fd02d728ddcde85dda00bbbbc1bc4822a49c14a52299692d4cb687af7fc7af53b2b5ef23ba7eab46262e2c2e4f54a95a472acbf44ec794f2a282cecfee0d84ab74a398c9c95a430eb699c983232269708ace47756fce4775638cbe39ceec27697b5d22613738785b8024bc152278b1ccee5721768458c0b1897c8054a99f7e7fec462b192142a7632c5621bef72b95c2e877de80f0e7da0581d5d107dd05cf06b356df407fa2d7f507e264d66830e8a6e53938820f8d9cf18e37cb5b5dff87d18fa3e10f410fcb249a98b493385a8496838360f996ded05b112aa2d63d08644f1f412768010e7acb5d60af82d6e711c4551941d33715db416679b31feba4710acf8de7bc17b6b8e5bdbd704af082b01ab60e83487f2b3d82b5452423ad4a598452d7e222886624814c571cccfda2269b2c591588ef94bb648124d60e8a221348561479139c031ff698b271125a6c492d1164dc83d6e31b4c513707f7a874f6b445344115344957185b8023b45d9b1a62e180331f0696fbdd6669b9164190d0bb34e83f6c474e8819ed6451c57f6c385d9206c0f3446c468fd92b31c72420eba256f74e84c803521ffa1da88a0b1da04356bf8350634c6ba11b6262cad2f9880a9a1348656a7b031ac2781c262f0d5276ceb655973b6b43105f62db7c6f5d8d72b0c579c0e798d0195ed504deea83ead7708da28e07a2b8d1b306034d05786511cbfa5fa42772beeef4f6519daa328636321a711fa917633e09269c622eda1befbbc32d2840183cc4508557ec3827e611766e2b031ecd66f0080ced034ec696574b6d609f105b4592f515efd819a9c81df97f3282a9123936357b5acdb18c9f1b93398733e4172961d1c45e4c8c54cce40922e774c2a13a9248dcad1939c28f148ce48939664a934f22bf2d0c8a422937c5a33527b86b4d3ce0da3cd9c030174c001a1c0a8344c58eb92d42945020000000000a315000018100a060463d1581ca8a2e43e1480117f9c54604e184964598ca3300819658831841803004004406666441592259a8b57f7a4033afe6bb10fcaa4236fb53bca081e2e5d77e53cee8575c86820c25429af2228dc690d81ea05b1d2768fa6383dbfc10e25b5d72f0b49ec9ba9874713b9e7893f9f0bcc7d4438f503e3fa27bac62e6b8aff042ccb0685232650b23a0361dc20befe7fd24eaf28b2a05798f1c732e6c93cb90a9664e955779b447bc68109879ca9ec7e6f558de88f2eb7b09ce44ac418ab78523b62bcaa198b655867774dd69068a12f87f00e53f0228965d84e1e22e3a51ebdeb405c00a75c9ddd5c26e997f22f53297e4e731551ffdbb73254051ad69e424b011e16e9c30938ca0c53d85d7ef8ef251b0c91ed4e76864c69e41843a5da8a6765b50d5855d984b8a75179fa58abf26e8930efb20b752f1d83fbe84edb71d7d34e29b82b5afc6538d5a1dfd887d4c7ce2bbf4b487cc30bcbb7a34e88a0b8d44f51e3426255f8a6cd22e5d8032f949557db04af9a3af5fc42be425e93621d25d9de46b587a5b306b58e99102cfcf4d8df49cf0e7ef0bd9ee23f004b0f2116fca07f0510d0c61284e238b16a58c81045394144687563d34cb6f65e33362e6c6d6e76e43f07a4d2ee26d006cde6f5015b16b14f552bcf2934a98a78a98242bb520e260c0c2396f7d1e886d1e052605fbde5b0c0e434a970ef04af8eee0ec820d12ae11fc4c0a78395ca5ffce85c2b1750bee50cfad7759e0909caf90af239f4d016501986010a6313406e84fe0f0f57ff889837e23d7afecee3e3cb452b037ce7bb8d527e7c61749242468f0dcbb234a0323ae24df2d01ef3ee46a0db3ae7286e62ba5001588ce6d6fd380a0ece1dde5f62360aaf5591ab9ed457376fc70766d080736a590a8eca06a595836100bdc2883772e9544f2139fce52e5801c1c08677f32258dda896d1cda21eaa515695f2f653f53db0f32e17a7948055170e80dbe394540460882ff5c02fbd0314e2348714f432e3320ad0094823e7fa434f72a3d6f3aab449aace6e2a82ff1510a3139b47d5ddf029450098528c77749330cc1d08c946368a1024590cbb65b47c3e7f4f66754072e2c940b4b3a5b757fb39f331677e733c1d12a43e3a763e3547c49363cca3e795f2e72fe74381ee091643e10c9c82fd87b0b7235598de4c2ca54ca0ddc7f46e8e12f0a7f63609692140e4645f689454f02664f880791b4df1aa8ff590dbf17c0ecb6480bbfe069efd8e42c47b6af6270aa28241cef74480430ea5ed9531878bd9903a32e56ac1aff42030149439864402ad15564e5b44dfbd094c3bb5e1d3c5d2f5740e0b20fb232e1ebba2d576b7701da938014e2e9f80215ee77aa82f5e5137c6cdc2c00c5d222f82e1265a797eefd9bb716fef851259d4b6ef1a8bdae438d1f8c1aead1c3338bd0872b288b00b27ff9150638a90060814345a4c67a8a646fe65499208c9a887a66fedf36d20e3389b1fa8dcec29a81da2f7ee99722b338501be1bff60848bac82c82cb4850c798440ee0e43488f47fa2ffe0cb8ec9198213c1e41b01ea7cc4143fa9888b3580010ce993940a7044dfc2faa2ca4f27f69aa01016b44bc1e7a2a003b59c414600b229bb05321a4c2b27cfba7f0836b1e850327be1ea46dc3082db145d21b688a6ac0c4edcbeb4b9260f467a58b34f58f7c7186804ea66ca568aa8f7afe90008584e61effab25879eeb18aec23ca973c5907dbf013cbe4574abc1ef82dc83a476733b8f7f1928bc2958817d71ebcd876bd7b050bf464f15ca3cc893afbc89af16c8134f30252b7aae0dda6082d333a3adf7defe8cdb27252853e2de845f93d26e294921f8a57b83ead99450bb55f02c90891020615e0b33c4a26f203b3b4fbe8e2fa84c08c93aa8dffe94427676ad5f968dc89e5e8b63ba0b8f148251d2d1aefdaa9e6c8a9d3feac9ed1e0c7ec3720cf38975126c48bed1a663a5566ced3b7fb47ba66af6c6b40aec3b25737543426badfbb199deff82217c700ba2e6371085f9767ef5fba50b2e552743f0cd058036c7f1804d06ff446b086ff067e4287cf28463d1b79f639442fa0eee1196beef3d7dadd2a7d4f733677f2b1099ddcf1cbd2b5311db5bd24a9ec6eb1b0b203bec1258925d5340b26191d0866e92b0373438ef9d62e98c8545dcbe08de0dd0788fd1d31ddb05d4db0603e741add328c6f161e6c12e60ed1492b390122ff6bf85154905221ac21b9bf2d3314f73de603160010d0d39ce297608a8c1196ef64943394b7e7817437ce37713f81c212aa19b2b4462faafe1d49669d88e26293e418f1c5aea65eedb640fd25894a8a28a00b5821289fecfaacda5129203265a14a2020080670a87f884ed410789a481442f5a500b0ee1787a9bc82737b95883d514548098741c5c673bf6e0ea381c00f2a930d19348d2145235b7bcbaefe0701b0d52587198280953d594068dba4f7ef41f9142b5911b6bf113fea89ce4c73a74398872572454f17d1c60ca9eed74c237dd1da24a6ae03c2b57193d2be80756af08cc2034c6fa6b07f08123aade67b9cf833737b7fd3a3418b919ae8404a769edabb7b56a99b162c68e662349d97ff2616eff137f5c1da270fd4483b9305163225b0efabbef41ff717950e10fd02caae83a3a51dcafe9d8781821391baceabc32fd02045c833a9e053f21121bc31ab8b780962b0b32a5bac0a6040369e8a20039e62489d0bc591348b417d92140f220405788d60150493c6f840546d8d869041b7ec312e543a63e4cd39c8b41f30abfeeace65beebdfcd9d5ad43086719b57a9757659a149af79171cc4afac65dfd3b3e0a462fb7f60c04d950fc5a03558929267821243d6b48aa2dd3453231a049e7fefd717559c89b817a0cc58f90f5d4433e6e0fe66ca6e1c696f147d4901737882b1697a8c1008e7fb0060103e97b699143d4ab05ed64f367563f92577d6f51fd3ed7d467037d3ff1d3846dfa6f82e12067fd7b50d2555f93eebde7dc9bc2198f82a87f418d618f1b8fe01475f7ec470e2203d447d41f1784b8f4a27ecaa9d47ff23858db2f4ad108a6a95ccfddd44f1e4e5d2702925e1f4288ee898b5f2508eadfffa0703d76f0610b336ce052874b784c4358f0e3df7f0d4ba20f68400722495a949adedcdf75092640dc1000904bb309fe6839d3b7183e148f1c2dd8ce5f2dce0c927f60eedba21fae92432d763b12d757d89286e39307d1a3178086e887437566df9a1cce35bc5f0f05a7b2853e8700c1ff032a01f992ad9d737021d3c0bceea178b0a40003d9ef94a2c76c5eefa1caa4657ab4ac33d6aaddeb704a4fde5b1a439dab374c8f856f5168afe2471f6bf4340a9e85fb40c07e1a1db6cb372bfdc06c64d736a49f4e09aebe94f75ed26fac66f3e5b36a39190ddc4d1eef74efe5f62fda9ac528ec56aeedc3f3c4c95341736c9f8a095399b775fa6161fced97cc5a7dace50ad14a417fc7159ed0a15be3498fb22eb68c5407f838281b492110c516cfbce32f74bab36e65819e68fd4914ebb3cd217f414de11d0aff809f8343c684f6447a7a30061201f38f260781cd3f7526245dbf6902311134ca701d307385fb7c890c90345360f89e8ac9c7c02eee8c133616207d0fad0b1c107fa1d63313a17508c1d5a40f776f6a3b58975356930fda99639cb172946c513b651d058af7d496ced03c8191c32fc133deb693967fb5bdb23b007733402e4b115b6ed94ca62edc4160e16912cb0112eb583df86fa247335467e3a942470905ce0cb5bdc14c5078349a499cf44dd8c8592255c0144679cc69ef910d6aee5b34cd65aa0c67e6adcb342b24f9d4e3af34569b264c9e83d0c632dbf6590860a5369767064a80eeb15d057420289691aad427c637350ff81636982495993fd0f1a45a4497174e9e4b65226929cbf652adf0be7d5f0f6570667844031e3e001353430edea862007e24c082c898f4d1e7473287863e46415aef8a668cdbe2b13f2c113a83434b2ddb27cc647c31eb4beee4990b4ac8e43a4077d16e05a0e00a03511c41bc858235c64a23826a0d1e150b4dd7cc50be02045e3692e1a96b9a9538747023998424c6ee5c6f30d8d85e936d42a6a4e8d79e06fdb79991c804ddb6326b3de4bff77cefe816cc51269eb80920259e12012f07e12cb95be187dda98224fc13387d8caad8fd90c998c3f877e9e2940f08c80fe86fe60cb06967d6cefe32a399f0cd9dfdc83c46e595852e3b38d341a9bed51e12ddcf32e09c0289827d373e900a07eaa8d782bb3a0327624d44756ca80b64e5af810b91b427bf71cca900f6c7a190fbbb004659e3da025d6e4a6e29a47ed369d5ca5b87d169a734269f64ddf6436a4677f735bbc8aad728fb319dc658b62782aa84c1edb53255bad96103471963994664b23ec3abf79548696f7f38b0709f4251535bf93986d613c6f06da760bb185d018200d5880791fd0d98d0c5bc88677175d3eda0fa4733c001ae2ee672fc13b15e3cf1a8d284cd3fe3102e5284dfd67b4aca37fa31b2f5cd028169e57226a3003025d3248f36df8699c9627fdb50835d68a7a428e95a65319c637dd34602bdd9c6015731e614058851fa9249ef3425bcbc03e872db118534355ca9558c02e800500307d7fb3217d86d94ebb207bf567e7b8d49fe40297905df3c090f6b62c2f1ad2d3eda6fdcde6f603fd065609218d9cdf6f9c1fc3556f5485c7cd64c802ac63ac043f1152394566a195faad3af8639087a7d5bede18a3ff2229f3792467cb9ca11490e40ae5b9830432cc0a3a340b95a29549df703e2ce351605e0b43078d13f207892b37fef4f5f8ccdf725a35d9608b1cd001c16efdbb1c81e4573177a9b1b3544f14b2c9878f9486911507e8c1ae6c46955e97a804afb2faf6499d9ec37e83cf0ebbf84211926897426454923391cbc504912b61b05eaf48a0b8eda27ec04f42e66a6f61f740c77e7f745f2184b00ce12e6106a0d1ffe62085af08530343723ce4bb333624ef04611a81f9d6c3327f6a4d508737823efb3fd822efa144a84384e00554980e1664afb7ac98a2cf2b279d75a5215fdf5fcd19036e50b4be61c4f0805b4515ff697e62ea04ec79064238dbbd2fb671d2442bc951b6748a78be6250d42dd42d77f19e5b5dd8cfb53ee0d7e1007e87a4aab7f6310d6f32e947ba51f02016177c9e913dd70cd4deea4828d88ab32b2aaa026cc991bed0b9c419651fe52e4d03a04edb04bef2bc04df1c6de2e15f55375cd2c48f050f324e88b78dde475b1d11834474b4b4e129c0845716307b037b0d0636647fe71ac96c02d6e04d73d2310f2658d7b1718c2ebd0a70f29e13d319715a71a10b12f4648c9ca1603353cba5e3e93927356b58f4a9090984d91763aea24d04902beac2702473ee5b96077e50adc5331717a48261e5814b57a5a4f0b46d914e15d46589e2800964cc71f3f37c1e071ca2ff4b8d74c8865dd2bf78d4730c8a6f48fb0ce7e523642e6178c254c3682b460df2846a7c7151d758d34a36c3731cb115cd9ba064d4b57838db09303c1ac02490ef60272f4ba309db5079729c13f04e00fc296ccd179cb90c8d93d12c6c62881ac18775614738d8d453e45d3946c1c0d7e8a39c4368fa59318d04248ef3da64e748b3f4a161d34f3bca6f57a6eacab7f8b35717e993452c822799e6ebe86f263328a6282e91b086ea084aeda8dbbcd8f6cbaa8c5c1bcb0a566805f9b0b1ce15de50a19cd0f27968317b3f51fba2b0a9ee94339bbd8e75d7ae097f8160272813207723b0a3a4fa4fee659422a74544138a6ecbf6b249028fa690ea8bf65bafb224eed0b1bf1c1d4997fb5d3b3b677f1098ff540fcfd7626f54de5b90adf1043cd5ed0a8f079755714705c365a0d317eca753c187e98095a4714d34554c3e729faf882e2fbc223ccad637d7dce1d407f0b0806cd6384d3d4b436ccf20d6c44d90230592e408db9cebe20a5db935ee0294791c70c43b56b550833caf5dd37386acbe2b5e07dec36cd6516982642a564cdef6f7888587def5b3a3c37ff09460e12d741c28223b79756832f546e6456ab32b9bb051feee9ed87e8545d2687baacab54661745250916087bb890421241442e6a94a0923561525690bb2818a412e940ae9afa0514794ee6fbba3a22a92854311804b45b623f2d48e1e6ef8ede9c4c72a0faf1c0b1d9ebbd29936e8202f5b63a17bec2c5590390ddd92c734abf90417ec75eb02e2e0d59b3c69dd65c732d245e84673b9c9ee8a84573c61134009e4f662c38fd6aecd97e1549f74573a2c86e1bb00900f5ef3456dc52fdda49c052c151ab889c220a0d615e7a44bdb64c00b149a16d35e0d02149bf885a9dc9e6ac1974811af456e24c1a6ad4c7e8380a7677b6319e1adc54a88c332f30d59382157501db71bfdd0e62fc582d93d066448172a68ee112ff58a76090ae8938fbe4dc633b2efe20f6d2fd6ea769fb785ca077b12b766cdfbce02d1993cc3293b27a411d2094197be1d2c579fddb8cfe2e8d126009ab67f3d80213ae13f172e009a1c7749eb91f24b327d1ee371910fd5f86b266d93e70c10ac578c61496f9d287900a2995ce3f311f293e30e6e14346d4a80ecc30714aa32f24e3d73fcdfa4378507dfc627d067e353652cb29ae1fdc7dbf259e8d759bdccdd4752ec884339055e2387a9a1d4e54b21a5359c1b94b687ec29f1758987bf3b2e7135f17326a07fdc28f9897a12aa69ea28f90124108d8f32f809aa92007a27439b649ef1cca04d8e2ef9fd962d236145d5ffae7c9bb3cbf39405d02ecd4fa088c3029ab7849278d1d1470353edd0a8bacb1b6792e5f9bec67db582bd9a55ecf9dbc0e92718f208875290326896ce9da9225599d1f741ee0a7c2c2f2315fca924993f2437285a0cdf03d385d30197c85e6a47963b165e428667658b6112d60fef5f572af9f058486ee05b5c2c2e9408a522a38d556d7c2c23e08f81c883cd58c7f0b32d1a28a7fe0659d5f6fafef3959f8b60c9447d6a3df9748827e3df56c9e3627a9026ce110c858dbb4640056a016afec433d96608e0fc3de06413152f8f58cfc7aec07617984e5da647591e4d4efe4a13a98ceb8af5bfb8ca8a844ed36e4e5f545aaa48c77efc45c11544b4966f42414617110026184c2c88dc3290ecca29f3da15271ac60df0129447f1c46671e04bf63744f6c46ddd69064fcbf40ec56502bafd85ca9c6e248e113e2d6c8bd0439f295be0cdf6e54a611b38aa99dc4ec55171dd92b525145a28c3b81f273ca24f1faa59bd1f2b2e4eee35f58a99fcc982762cd39984f56dc64a867061f864b1ced5510e010c34e5a4baaf69c769e14398922653ab79338ab79b6c55e29911e3b2100f10968ad82b851060d8996b44d57ac457b8ec48521fdbb32cc48787f9e5a4a15130773f90eb32e0a016dc30c573d6294f090edce0ef62aaaf2e10205f0f0788bdafba59596a4abfbd589e74471af987103a03a860c8dcc6ebe2f80c154d35faf56eab0bfa3aa7ef658ea54d3be4d2deac2da559f2917989f6a21be3061a32208c90a84bf5e5ddb121c25ac31f296b682bd52cb3b8da51fdbb1aac1a08e40bb8e22dfbdd7abdd213773cfd432d77d26663b145f31d3cfc5ff9f063b9e755921214c44da4da48e640290d882c32bed62ac19187e031a24f362cf6b7f709225fe13c5cbe6464ff0faa08c105188611d8c1687f7a3eeaf3f5295fc1458e5ef0f5c626f49702892813b8fdafd341ecff8649476e455178a247b45b2ec6047081f44e9476235a623579484350eb607f70a94501802062bcf1e8680d4ec99e525217bc5bc99993be60669e16b4cf1fe727d53de20d13ee4a5acc0700ecf4fc128b0b419ceb08a63195da7f0c138449f736ade706b7432ed2284d70cd6195ed1fff9723d0cf615247b029217d40eb4b752285b16778216d4c0dbbe7ee502b10211dbcfbb6aefd13e73adc5d1eaaff28000d22eaf1e4a7dc88c58aad9c51a6d8f0196264391074490d34dfd818ee6dbe9973a5c35d50a36f6eb686d49517ab6b0fb4b62e5003038a50835df422c60341de4429adc24a9302b9463bfb0ba3654f983d020aad14882eb1e0564a2fcc4f5ad934d19fdfc660b3a3765c003ea14290c9872e7521c2b708814038714d5ecee5209bc18ecfe931f64ed66e55bc848f69c2f8398a3e687ebcd95aa0b648c2588c79656661f6e0ac0dfdafb177e00d4a380a30dd765b6d8d4ad041d441cf78c0bd34b0d1a34933db88a7236ebe05848144c7406be1ef695cd3029841402e2f121c0e26e4760bb8b048a52f2c88ab340ce926a7c1ad76b87e62cab0625beca5f319394e9a82c5928ba655444ce547b72370e68e280b94ceb017307929ca49f61dff55755ba5b4160e72e222b077a3486560e805c5309af8b923160bed33d081e83cd566ed99f4226527c21bc40ee199d3fc4bbf0cdd61062ff6f3182ed63069f45e43817584162234bd9440e9f40b593bb48b62718554cadf14c4984ca3fb614d13110ed577854bde69e541b3e627d5e8e426375521acdea8b132d566458fcdb20564f4e44c52283f8efcfec6db34d02585c1dd31385d516f0f1aae38b7d34f8e109643001f020f2e1d85957941f5974d59ed3a4477924286cb84c5ff4215a883cb9745bdf4608f36f0280ed5e276648704218460c09c514ea83db780480740054a508013d03339d0cb47ab416882eeebd05f34c7d5cc105f99323731d495b1d1a7209c11aea5c515c8726cbb3b9950407cea7f6b5df3c448f65de4ac4a7cfcea0278346890e098afd93aabc072e2963d4d0701613a4581d37253112cb10c865aeeb489b94114613336c48c4a8021d5656d2d01236789b1fbb8280612996360aeb444c6850d46e5b41d9cd2978e85401eca92bb0ba55767653751426bfad2be930a2033ee8390ac59061a4dd5d940fcf0d984c474344e820031ead02a0c41172c9dd4a70a5ff8e904400ed4ed01780bfcabdb790ba840d75936b4d77547fa2caebb3f0e80b499da43066280caba1e7193a87074d7592a589d87d211796f65ecfc7ae5e574c456e0adcd176443597b817d61eef9164fd611241d01ef5be5b0a2f58a98c328ae1cf439f81f1d15aadada12e55bcc1a966160b0fece66843d02b9524cd3592b4b2ddebbf663b64dc87969f679673e5c37e5355088e8a4c85d83d12ecad6c6a5b2e8d760c7e8544485df5c1738e481fa24f7c4505836bece4ca3ad31422bbc48e32a8df5b20737a508e8c7db5401ff4f90c13ff70fe11831ae42af842f14c6a7fc61fec5342941665787dc95ab215e4aaa48187e036c5c452002a61cb46f3b01d123984e01f52e091218f87804d201bea784d6f096cae611a864c69e0d0701a09ca856d5376c2733d108b3d2dc07befcd753818a8803a2bd935189bb3fcd871a08326867cf50b9332ad8fd8aa9c09c5d287f239b1453f04f39e84665c7019800ad90fa230c8deabf4377e1fc52f53509f141fdb60737f7c2e0929c53e31d7632832a0e67580124fa55773c26a71b13f478cbc1db8e0b56e9056ec632968078d2446c4834010778e69023064b5b373f70d659e85b11dc8cf45b9ae8f4510c55a6505d64d1b6b99b023a5bfc43e1ff0392dfc0ebdba1cdff2401a4617e2184cd154622732469f694e478aab225f3494ff35444c797819f737ba66f56f6b4ce80b520b4f259dede501b8fbae030160ae5c04936f26a834a7e240a4dcd736d00e0fd8dd12fd2ec3e72f00055e4a5539471c651c400e3f454858d0948f293f01ff52a85d695bbf502ca43d16d65e0e328b60491a14f7aa93c4325a5fcabd3cfe4dff2d6cdfb9c0f72552680186b021ab11c3c5e865c4f35840a18e7c38fdc0aaa642ac53750b20c4fc500645bb37faf12d9d9d25f2825c46393636934af63be8d3e2ed8aec272774bf9c72a1e45b69c1409f4ce537317aaa52d9fe535b69d0e00fa7193401699842a453ca243b2a3ce25706a0acb219d5039c4e861841f322d98976b60b96a6f69c40bcf615f797bf6b7c5a51c368463bdf4e02b5b3b4b26ce324bdd51710013ce0d59d3d96f41e0e20f12633ca9390f90bcbf2b8cd17b093dace0efe00fef4961decfb22d3220ef95f530f2934ddf3200beee576798f1a250e66097b7f320194a27f3846384604c2de92c93469f1603c2823f61ac456ee0d5af0978b9be6a76316c2f1fe3227d4236cf6cf9ae5f37159afc503d108e301277b9aa127f0a07cd3043cf2d0a7e8417fb2ac5c4f2aaebefd8f76003671199be0d499799f3b36b0759e99629f9b624d9d404c7a9b272c9b902898b1dbdccd1cbee03ecbcfcc741ecf1008c23838a197e5e22c907930d72eed60bfac215b31f79439bd841623eaf6090ca9da70137359f0fec0b679ce58748bc5b5927ab725dc5ef38ecdec890dbe322877e959754897263e9a1a392ef52e1085096ce3c8f85d1c276a229d5e78016c1004d0507423f8a3133c0a73b987ce86bbb16f58cb37773a9f4a3142816dc28f961c0cfec5bf6f73e243c69d51ef71d82e2f9f3380bf9264b7b03ecc4eb04746804ab7c815aa99b1d0f569da11b97922844dd6939643e4997509aea8c4ce89ee4016d568145e7587a82fb41f04b2588ebc4453dcf529ac9702f845f8c15c3904775f00588d9181204bc51136c90e890061781024c1356600cb823b7bf1f8b93e0cc36f7823e9bcdb3e4664677c786ce6a6d19c88d9418b9ffb0c39a7b205a3c230b05aa486f38480a39744c6c9726821e6c97e1a245cdb8c9ac93a0408af65dbd32d6906ce484200e41ac57d069a7e26efe12385107a5acabf7e2330f819881b790f91844761ca829d3f323e38bb336f1a31d248f706ab9972d315530abab6e1f2bb9ff9fb494a15d9b06c2d4d60cecccf47727e8cf8d15e7922c9e900a9a6a5c3f94e6cd9893f01476cb3c3c843d01860955a345f7d7a2dfaea4b5455a2021edebea1b411392348e3a095e828e83dd6ceca9d46a412d04029c7a488fd2770dd3a13b5829453b4a87ed17144cd2b3d74580124c58d6fcde10a2b3cae25de0dd4583710ab83171d4da016424ef15b84e798329d519001c17ce1e278b5c293920776da84d91bd8a9c9839278c726cc0c3c9b9bc95cfd2838af164e0e94b426be6069df64ea08eb391cfd408bb39d07500109485adc4cf30d98d063c8839f3bc96fff6870cacb310407880654c45906c3694be995af5cb44f0c21cf3c14c3989f45be7c4b96f8fe38edac77e51795a37858add04f47aa992a33a371b83047b6a07a34cdce8388630e3971bf8b17ad4eae6e45c2d6d595887436281755de38389f4e1d471cf9881f6a96edbf5ed0894f6d1e032d097eb799fb4b2f84fdaacb17f17b0ec8e23598cde2b9071f74848a3d2e0a1da1de8aac5872c7441156e9e0f35904632d873583de6a5245d50cb5c9f8d1de64fa6e5eddab829e4a815c36a839248526eb8569d11aa62e001d2b67e87ee96043845e13eea1245c351c116b40932f9a8ce39dcb78fbf17d25e601b9ee2784973553a336970161413f6881268424474c7a7fa620e18804b76753528c08062d6e15f1212eb09ca9a28cd2d030655c6cd75605de3dc299e5c8613d89fa491c4fd3b8b62ba846981b6e90bfe01919426177d3eb9949bd8ebd32ae00a20580e0a19dfd1b74440a2c66689157962455913302063ce3bac72f3a7a4cfc259c4c6184a5eba617ddd5e5bda999cc45ecf935c1059735239bf1d802b0ab89657d0c15088a0448a16466741663d99d06d234be1db32a55a3d3d9f62704563462d6f7eb6ba16215d8fe6610e7d7ff6c6fb4706a52ac1c5e648871e7e0ac9adac6e6a8e5e1f7075e71c4f52abd18a8c80593d710eea2c3be6721562fe5a132cc1bb1a54d0fcf95545536723b57f471806aed5055139b487d8c70e23ba473e78f4d448e866e0738005be36bd553c46ab2bdc414ea42cf8021a77c2655db3e17953cb98aa01999e6eedde5f4746e25396940c5a5269fddb32547455b3d6c81abb81c839435647b76c20ed13f5e13a4ab398c0bb5ad06b56282924448d2d2f5b04cb6c53be01f4ae0a7725039a45d781e89993d379045e539354d1f90739f256b5bca3d53a5dd75992e5d1e4c5b8246f85b3e733e55eee13c0470c2033a2230dabda8a2128858462b1492b3ad97278945508e5ec1385192d0a114790915183af10f99528664fdf13bdf3a62178613802a5e1204fb05e2b4a3c25a65ebb1bf1b4ec729f6e9e72e8d57c8ab5475be3bc391d478fbc1fe70f0ff030bf5d01976239399c1134d035834cb86c121b24e0df4bb86d59ef35725ec499563ace7d7e8403d73f57c0b4a0fefd1057a5c0a089da7a4803dd1d7bcf1b85c6101e9a94268a14fb69cd63a8bd69c68a91e697e616bb5cb5af0dc263fba5a58ae0c0d46921f662a5d7e2094eaf2818b65990e70f0ede1be7fcb7ffee2d103ce2dec891e29bfc3c6f52900f56299b7b1dcc86689a13e58e8861f3a697cef515b753b113b28769ab7d3110bc3ea62a5791394990667ae1d68698d2d6359329cb009dfe34546075765a118c303c462dc0a4c88e98f1b547bbf518de18c629e4edfd530f90d8dc1dfaa19007c3690c08d2d2278b2dae0a0b1d67deb0e79d3f0a730d5f98cd9530be98d9b62db87d42f704b33972554ba6cc6fe018cc0801fd1d8a8dca2d826dbe30676731f6e973151472963ffd4526fe50d926a6ad16f14b100d80d0ce5ec99e1a35fd9c34b8d7f767f3d2d2db679fe81cee2c98a51bf538fd8d8ce24e26f9dd5c528e9ccc8997fd6fe038a0339d2b9d495b839f297f6a233008a5488264d32498a1d714a01d6d65795a4efff482b3cef05dafe38e167f4105306837036552f9eaf61805aa6d0a61d7b722ba6400cb601d3ee6dc00ca57db1856b876391fcc8fc2ebc6df9a210af6a4ec1bd24dde981410324cb3d78b18f60f92a200d5e1ad1f7f48fa54578d3b2f8b0c8d8993dd46d35df94cebf9130c65c9a09aba7c4df29dfe62953d32c846c4085bc8237bba53846d557c058c5842755e57d1128a31043a2faf1288cd2087cbd28fb20a2ba0b6e33a135373626f663e5db53ab2dfde88e17fcac3fa7f091637e73c89f42d5b67748fbb598296190768bc35052097b92791a50dcd3085d356d6da0caf01df1258439dc6c9e78b66616c9624e8151e4d9244c77e2dd14064adf6a6b3853dae13be728749e82918279e3390a9d07b6bc3324355fd2be368e459efc0004680ef5f0c80596c8f19624977e404fed426535ace2b12cd495ca0deeb8a9abe7849a113ff0cc4186f89a3dc27739676567a2437fe6f4bf6a1a478f7f1bf0a89d19373c6c79f05af32135a9477b30f74b0a0114c2ca239f891ca34a00e5b71b5237ee505b80b6bb457b8673d3f1127249d4fe619fce582a628ed321894a2aeb9b05c1f884ae740fa76193dec2bba083d1a848675810034957ed0dfdb95b3f9250888c0038048a6248054e215a1c4257c00dd2228a20a6b785d70a6c675bb981ed86e1d1243d9da06d2bd6480126e76bf3a53553095b9f821805a502f44e5d181462fa6d41ddb383b011d9d75b70122440a6a948c13ad257fd0eafe3c2e4bb85954f85745b189373014cc6dc5d8d138596e3cebc414ed558fe3544c8967fecc91a7308e24771e8735ca0dd11da0c5134de1e274c72658da0082624a70996ea4758f67750c2889abf0fd8428bf53d5b76a88a7b3674fdbcbcf80ccd930ab530c988bbb79ee0639f9ca1636897db83dfa124b78e2970572527692184b7429bc549d38f9f9c8d08e5614941c7763ea4538af031a1186d1b20b4befa56ba13e9f6150a8c38b7a4429ec764323a004d8b3074c290f8bf7634ea90b8f3d6faee06ae0667110c1b60def7d063d94107b80927e8aeeab650f5f80f9473cda63d11fc49ab2955c25b0e6958f7f2280c707c312d163ec6907eb7beffe3617ed87f397350bd3ce287d57d260c5dd88e64837e6576c45cedf95215429459638b989b4a259d2851de6783dded7b5b20d1fa87918a8a210831ae96a94355d539f0b0f14f2e77631e3b31da05e4bf4b93a393676ee8930fdb579a42062f8425878dbeec3b760395969e5516ec29fbf083308e604e3b21fbe8721722aa60e1a4b67510793ebb942731549e45e377e64aca6383758e97a4324bd32ce43fc1e121ee5bbb4421fb5452f7c9bc7357d5720a70fa84b5f9ca5026fc1f5d742d83abb85e28e283585ed6843c1f8a8ee1073a53b1d7ccf8660fbe0373a6fbd76a79a68ab2b05a847b27332520b20d830860452ab9d2f103cc098f48568366517b9e122553ed727f4a270ca27bce2ea3cb022629dc97f32f4697f9b90236ac73d1e10bf30977999e81407362f4eb3139832b3ab3f7db8fd95c6d240501e74445d0e79231c4365dffacc83bec1c02aabe5b1325c1696649253cefb606857b6c2b116b66e11686ea1ecd9726e845880c474d0bb56cd7429936218013acd1436e281ed753ba036449ce56d42d3636999d7c768dff04d81158dda7d2e33d2052ebe4db34fd6da78e96684f3823c8932be1569642a183d848abf348d8991b91037b27b13b4de1825e05cffb7f16ebe7149ec4622fa023445e1a3f4cbceb64fb20124afdb2f0cb9c472a3e7bf10d8f1d78520ceeba065497cca503cd009ae428cb931fe3f2c08632ea0bcecafc5a0ed9b92d71c89f3529604c3c1db2e553a911e9706b694b42b819d450409052a430f59f99552271d520c127afe3337a595b4907836736c88b8dc54fa717d69a16fd9088a5c219bfa23c0dcddc6369e876e05113c17cb9b50185dcc252d04fe3878cadff469236e1b96c0ceb0f9884673d63d7e36c20d5a130f885bfed547d38c6f6ad5242c973745edf1360372526be264d744a2c3376b0730fd0a83fd17ccc81e7844a16931b5d4c53029242eaed1454d2516670a12b823fa64bc2c485cfc661620cee6a98353206c32c064194c54e7b894150aaeab0eb5cbf7d8ba5f453f4f79aee744431d3e535ec00de73c54fe2bb25941a07799f0e4df5c74f9af5420eabbeb0a3134eeb36c43fbc3c1754004364f69e7e18d6c567565d3c636ea007061384ebbd7b2eafc08a67c94a79b04f819ab71870630286efd419a40ddae4649fae0a284d370ea1ef6b074b8b4d8b604131db61105689ecc13c3d0ba8dfe5d0b6f9ac90493dfdcde5bcd0329c59ee9a5df2c23db3561f2cb2fdb5d22dc17316008ba2e42faaf523de74596a9f06c1a846cdf8aa4253c133faacfd91551dcc1e041cc5506a71c6070efcd6383fb7d91d490957ce7077ffcd50a0154aa18a4c341418846978dc9ca46e74e10eaee65007671910c2048999d5771892324aa520f6818cf4fc573fe49ff1d239dafb7c58befb0bfb1e1c1c10e046e3edf746124cd7beaf728bca49a79f0df52c4f6977699591188c785245191c7bbb27e31f5d5593ff02e36a6af29eebc0bb61608ac3e6aafdd1a88d406b45791972cd132cddb150d05b66759318316928a4a0cb3965e43ef8e2f9273c9db5cdc9876764bacd414d7c469ade4c544b47427600806c5e703b0018c03e9605f19d7b817f0b224c5fe3354455d72dce0d4874e6c4b7784dfcb9e2068659cd9ac289803feb98f0aa70455845dea05404c3b2a7aeaaf9cf62fc2111892fa67d4bb5d96b1fe4f03659804d6334e41b09dfcfe26a3c6fc89144be28a62d3e763c93c9cffccf6d0df45cbe529b0ab1101b041bf7720924886b4a754d911182497cd4ea7b32ece314381ed75b8cddce133044b269fe05e0ccf559900f0dd74c5864d8abfc2d26928ba793dc68575edfc4bf31d2bd5f771dbe5cc2be81ceb52adb66f9c4a58f3f190d55fc9460f7ffb21580cdd0e5d321e8eefd47c590a41e0e89e756306edfcaa46e7b008865e04e75fd1a0024498c599ea532169bb5c2e5718bf1a4c7ac521073b68f8ad4cf492a728e6fd78d4c637eb6cb429338fedcc616a8489a79c4ef8ba6fa8c6bb03f1197a2c715c1e4b653b7eb03cfa8483f1f3c1fa8dad2bd16408f1b2386367e57539afbbf073f68edcb31e8f6bc85a9e931eb1eba0c8e8f90a52c28b1ea753105155e281e1193513b30b5e3e22a9bd4960331f1752821e6c1458e2f70bd419b6560ec4457497d44345addab262ebd647dd2315a9143ba90bb57148fbcf0b10792a0c667161af9355b272fc9d8281895dc2498980b568e8d684fce78570422362b63786c58d2c86464e072261d47d21864bbd4e3abc014a3da071e20e9aecfed33ed168ddfeed35fef2a4393b4a78866bd3d01cb7289a86cb6c903479316497059694d4af8d25991ec975cc50d0da5fc190dba0f87e730c200ed79ac8a02824104bed8112ac4e59618b7500744895021d5db6a7de89d71e190e53de52195debb1b98376dd335573cb7c88419a35e99798843ad3b02db59a4b0179f776324bed7a3db63937a1e30d4503b342bdb9c670dac68c7089faf3a1dbf0263bba57fb7ff94f4a91da3ef7b98525a24ae16a54584ca5e24deecbe26a8ceb6ed0723e13fa23f1692b3b2e0d01d57bd1a977816ba9cea5efa3ee1a885ffc151be693dbc426e727a1d6475c174c84044fda5a61c077bab63920a85840aafc391d5d38dfe90ce5da86aca8fa6d15247af77a0ae5525d4d4eba450356a515648ac1ceed2095c8161220f14a514ab09895696e47549aca8eadd356897dda0ff0a85aeea4d3e20ba8e2879a35103dd7eb73c987147489af0927a35a3fa702b5db06de9283a493176dcf1a5b000479781c633d4cf8da3ebc81fc1e9aaf0bab132e81dfcb10aebc128d03fe2b2b0e08a2540affafa5117dbd490cf466c93a517a5f26b12db4770a786ab138a7a5f6f3570a063f9ec7760de6eab8d9f1acc67bc89bbac79fd1ae8acd5cc3f03e91db61f43b52f107ed8d55eec2db8c1f73e3eb7f8bbc7df3d3ec786c5cf9b8b6f862e3ace2dbbc1f73e7ef7f1bbc5c7b1b3f8f3e6e70dc7451f6c0b37f8bfc7df3d3ec786c5cf9bf36eee0b8da4fa6ef0bd8fdfb167f1f3a6d40de84247abbe1d7cc09e816f9b2c6cba60a9ca96c19d850f3409dcacf70fd3961109f06840ac6404511c791d1f61018ceb0b800c2d0c502ed378d7aef699287dfca8a227d92a6054af3632ee137215f8d2ed44d272fa2a72f5c6ab902ace2b20eae82027d855e048571b92dc53f9ca75d3dd41cae2f42572f5beaa70269c6756b5cf44d7c747157d92bd02467ab520e39e901f817bbe365163f9fba7862c72927d058cf56a47c63d2117819b3a6dfa6abdc3d6fab12fdd6e242da72f91abff810a01b1def95b91b49cbe885cfa8c2b43e5e330508abe045c6f4410c5d816c35472fe15d794a99d9d3ee65470dc7c27876243b43c262964265ccabc1b904c1964e6e01488af7d4bacad9a9c47b61b7979d0212f4d2ac77d67f4d8980d0ca850fced0371ba050f3742ccac05f9463cbbc811fb5fb9ccf974e16d1a2b97ee369bb3913f4b571debed7401c0949859af6271a24f8e02ef331c83f3195f1075d5f4b22c11e621c0e8ec220d0a49cf66c5f812e8f4f09e850189cb79a0c96b4158492a663dd59f49194167a3f5d52763311f18faa9705bcb69dc8b3a87548298acd1525a80239c9c094e733d93908d64b405ab7f5991efdf60997b4946d258bd12ca98a9b1ac68755c4250d3601aa64c50cc5da72883c4778df0563ecd594c12edba2063b7f694e6de15627f678a6dc1da509a056b00202a9963e8eac806e46cfede0f62ad8f81d2384ef7920033e326a803a6dc1bcb4f193d5c094a8313b193b63d2e3eec3239fae0185c1cf0de3f55bbd553786fd7a827c75f08f8fe1d8e1b8053d96244b8d852f16694f43f83826f31f4ec2f02bae8050472eb4ca9db5a7f402852135b3909da76c985efc857ac848f5fcf92530e12749835cc0b5fefec3209387c7a7e6cdd5644338142ae2c5fb556cd266c00d52853e315db98b6a102af626c376a93f2b3ae30dafc8eafb3139448b5679cd79bbdae8df7079c6c5d9d4538ec4e554bb4f9e7526d14495d730ff1f6efd6f34177ab8a145b6a878ecb30bdcaff7357adcd63b9fd604ce8234efbee7e9b74e76291f186140ddd55046a8d629ad5918b149625837c487201ae5a8029ad03e0f14a809066e59d94d98b486eb5b4b1e4854d6e9ce0ffddfefc44c9c1f94b9a4f872b9d598a56097e344a912395017a717c1a45e9bccbf9687c40c121cf489d38bd46183e1e4773baf325040807d0778dcc05070ec3f0f138f765d954933bda4d35e041cbe36caf1eafbab04235d635c33261585d349972f7f138de2e950071b2ca4e8c7a4ba3c286664571a54093f0c5e32c1e8bb2a89c4b12c871f5978e541067cf2d06ccc582d286f001ba069149d851c7b1a5f3cb6adf98b62c497088ce160611d9a2ddd3bf09c78b6eb7d42b26a359b01739bc600cc0f52429c2e9a43cc87e93459a9541f84490cc18f424f0ac53ef66058990fa06db5ed85a7034d95a9d8cf0d4124c7f495b797c7444809caaa1d45e5fdf8672f78d16ee49404119b959abf0d780b9734c10ae064a0c92efa4cf72df7531d1573d69f4eb4d86a4b94addf5f50d2fd1a96c12933cc58cbf1244acf776de75aed7050a1998840d939988f44964e6c998b2c80cba68c8022d9eee3256807d9e69da9e254b997ae5f5e62c13a0379c3d0a21541c433feaa012c62cf044c704b22559c3bbe2ce118989309b5c616963ff68ea0def15420e1fd3abee98a4003d512d6cf47b818ce80ade09b4853bcdbd9da09486e19e3a41911b939e66edbbf23fee1545a7099d5e794c1c97bb4dc195008b18656afc8c7dd70b5b2b46c4f432e01109b6d0671f13a3be30c5d76a8344ae6dbea274006b7a22091ce93a24bdfc5d92d08d11c84f39aba7c72596fde82b67118b27769d0f749d89de2a7d5c67690e8e23c0b7376d219b88fb1589fd57c9de3a4bcb586f1ddfcafb5668a431cda0954c1375fc712a791e81294c4564573babce124d7b8d1b404cc21129925a9282d420dcfe2ed2eb4479cf3a9777a8671dbf1de0496ec1b41961a29dbb1ba74aa4acb37ae0f70f12651d9844a7c7d6c2c71306e8f5ec94d93fc53a01316bcea298cd858bb66558204b6a192347c06888a281dc32856c03a29415777ceca2a9a184769257c75c9413581a20db1816b0125685e51d763578d2d479605c869de1e033fbf553f8d405c6a005d99cd714231162500a2f324421f17148683500eb10410d32ef07f98b9c40302b61e2f30af9c1fd3b94e8c5fc53b374d3f7df2e3c7a9259ba1a4af45630bd9942c746e905f6b2940da28d7e2a5bfa586d63b107cc6d37777dfdfb1e0fb84e79a5c58ebc88f5009afbb9979109278f32dcb19ef58d598cbe71088aa407196dc4528092e44a69b8765d62af47781696066ceb400d564a383945ba74f0e62e6887b09446a72ecbe73f042b8e2ad97c072bac479882cb2900e692137bed4e5e953eb56270799d2a9ebfdf2277e30ec5012ffc0dd2b115d9c5817ab59a5f09de8e6df6be7dcfaec2a99bbe52862b72a748cf712cb6d8966a5fcfe21ddf2b7da87c8ba157715fcb2aa6a5575af10bb3fb8ee728ef4d7238bb52cdfc663e676f1130f73bc04ae41d854c067ffe74e27f02577a19952bf24a38e69a6ea52c0b079204494472fd1d6e9d7740bb65f0ee9174ad74c2651694354fa3565af1168b24bc301854f24205e3e6e2730eb91f0f248578021b2bfe88a150d7361f8df14b8d499ee6f720449465e2998a57fe63f09a34a1bc223c557d9a8c305d689d40fdff1dbdc34bb5c7dba2cd137e94776cc39f42ad176b67c3dd18973e52b68091807f266dca2a3de92a3d725839f48f90e91d571b56a7cbe6b0be79bc1cfcc74363ad62995948ef37907d25d9704329d9414a6dffee5fcc327fe810e12e4a5cba038e4d89284e910533a9aaf4285a96debc4d4e594a9f31137e3c182b57ef9f655f6589eeaf2fcbd2aac770f0cab4086755df4534843b34d5b7981021ef30c7ce0fd3c32cf3788f29f452c671e47378c52150084b0936fe2bdee31c7f0e6a027c9fdc0e4ca6e5eb786b084bcf7dbe6f61470c5351188babce3c546c129614aa1220864fe1891c77ecdd8f5175831ab014b00007b4e62b3d6121f18cb449d7771ab8c5306929b5cd3dc23340aef4d09f2d35bd426ba586592702860c1937b2b637a68eaf82b54397ea439099591a6d8eccddf160070003a1f0f5b78fe2d04dcef3392e6f17ca7444ed9ad387fa435d2c009b204c93a1df9dc7c994831d333cc84023993c50d881631647c49a3adad45fb9cee86d1b5885aa475ebd0f0e1377333eebb74b9409d5a326cebfc7c8aaa1de7c15b077325533bc1026d6f8c088e9c337bb00d8e0ad44a7e99ea2b0c30c7ae95698c953bc72a8d31f9169b9470a0e4750e801fd84fed7d3ceaab049536fa8d8e3c74593cd8e2e8eddecb834e6be47a0d78d2988cd6ee73bcb5ddaf364c9fde55198150479ca970f19471a27ba9679603e72c3463fd3f48e89dd7cf4f1c09b5148edcd748f4446667e11b4afb31729b42b062bda41777a931e5690161fb29abe714332b0ee3094967d3dbc45df4b3a8de012b12327fee094414908a30f9b5642acde414fc4703297b988929794bb3dd1a6d1ff96ab7c1987ad8c522b0c3555dd444c95b31c51d9b8229c33ef51ec2862a2c002fd9f3ca8aa6505bcd74da3b1bb8a33b80e9437ff698153583a8355d5d835af11cd7940056d521b3bf8cd7becf6ee344b5540172c6ed70d129ea87ecda432e09dbe56bfd466bc0cf08a479196d86092bb859bbed46656f8f4e5e15ad7f5b8cf04da43647b0d059a98aa9f0bf1e7266d62e6d86235536a338bcedc5a3da372a79d2edadf4dcf475e6c11793b5f95ccb86eb699d7a529bfc0798361018d08d44ac1c9543731ae24a54c576823b6074727b0b8d28eb095552925edac27993d053fa39ac8fbc89934b0a4049ec48b1e1ed8e51e54d0091e53a08cdcb477110ab0c2cca10915246a11c09160162ced5cb9327479d5b50c5b2247f425c5567ccb7de0b2f704a51a602452a2ffb82f65069c58614f5ea6e73e7b295f43ba43e72ffa52267a92545a0981c1d6241a12109300ad191d55a2d89df594fe0dddf4326a162b3a02c8c0b80b057384448b0926b00a622b9bcfda55f1108ec16b3da4cd3bb9e3e83626805f1b3be462517da7f599624f28552425281240cbd68bceeeb62fb20a2ec11c00122f22e7d088f1362b132dbfb84b69567f1e5eb7c529fe12bca56e4816b344955b90c1fe4b8097dee1a5951ebf7438aef4fc15e79cd6fbabc633adc453c564a068552a04c8249bd1751a57191e5cbfa87c8fd69d284a1e7c8178f5468f73c75d93bd93b37b763dd41db2eabd2d0b86f41ccb23349ac669d79c5f664c7ad148189045fd210e051934369b2c4113b3034e7473b29da1ae27edbc02cfd41bef5e66559d980ee4d6610fa07677090da2f6bb2361da8a3e07019300d6d60f1432ef3e64419404b34acc624a094210ecf1179d32295106d5027248fc7f02efc1de552d4ae1befb013aa95e2cdf34edf56a320ee0c951a5c440763d06cfc0417582724686a2eee10a5ef7fd39c4426c3d4145f4678488b89cf8d9ca4657717bcadc2fd6755015acc93c4ebe530ca987e1f512107ff3eff0b1c9f3b742a2f0ef354a45c27f933b18993e2f48414cfbcfa4722b48c066e6fd75e777ca7104a98e02f5bc3a0d1584020ef4f17321e828ab7024d70f0b78197c0ceb57f3dd572dc1d5f462ac3e5e46b49395792cfabc1d3779764c8a4085c43ddf266adc732f461277def32f7fde886b82a14bb968f70346ec8ca6cc8a0cab2463f568c623e889761cd8610033c4078a9a3d6c17222ce6c22612981fcb30b2a925dfb22d8c370784041adcbf6dcaa333ffa53fc35a40e6853223e541a56e0a9cdaa9732f94e8f3d9ebc7d8c54abf1bf6a7b9703134e5ba15a39c7d10092b60f885cb22ddca6fc9edb87e8989993a99fa44515260cf5f8fd6e0352e1ccf753453a5d82e71e367dbe4e6109e9079bdaad6288de812f43ed792f5d48fc4921d35873a9bd7a08414ba854b35190f04cd94736ec7cab82676e15353d418d7a0c635c3adc61a3c55499a362c1f2cf4abe8a222801119f8bb44d898ff47601b8b38383ac31e5095eea47966fae6e30f0394bc535deced7402dca54c80f69ca96e60e252266827d0fa0b313e20ab8540fd9f756481fc642bcde6201fea8608b514d88a834908e8ed2097fb4bfad8cb1b1f96bdbb5c9690d57e9a9e29ca766837dad84a417059fcbbe297a7bad7cfd2d691439c218f7bf439b422a2dc6d9ef3cf65a9497b505a81ca58b56c094b8c47ba0b46318c1dda282f733441c2113e78218652f14354e1300afd737a47a797d23a0746e992dd682ad2a9227f06c45971f5b05e6b0ba19b78dfe181f92da99d5d0618cbfafa5adfc647ae10941b91635d783092db01523675203ce1d9e4a1bcac1f71d12f25c509cbcebdd85f298679a1b4a1779f0f55f585fc648e23e144a10ac08db2ed5ef0cc6d02153f6bc898edd4a7aed560c91fdba537bfd20400a6eb7f1dcc5c222fab215d11845a8045775321afe09c119ec80f36c7be57169ec6822a669ff23a3ec2ced896552384a254c0a8e7f9f4c7788d38098ce389663b1b43c4e85f2c82f922086426c1163e79047dec0c0367a396b9d855e9a5d6d91f9cfa03664201a0fca96a50e8142d51686277a65e840422e338e9d640719481a6b32bf1ef224f44a22c5df72fd613048e9238418498fe34082b9fcaf5242000133e1a0efeb41a555dcb21cf55db907bf38c6e0da9e0c9c78b84daea31c4d1f3055a46aad84092d32f3f90e9ec980ca9b75ed9604a1de7ddfc4d9bc2ccf35787bd7c559e2790b073865e8864b874589e1312a0938643387727d8053d0cbd2c5175f74f041d28688b9621ec6585ed7ae5baf030e885f71bb3c80f6c98670dba3b4bed4813e7b434d3a677760a8095287b85f8e3ca44b1aa906aa6cbf89316df0f876f13cde5333e8b3cc889bc782c8ff8eaa783822240f9608a860074faca373498809e1db1b1ed562a64e36f69d94989cee3288f6e088d0b0dba09aba0d62398233b208ab69bb64cb2d19ab78b6f26f163a43f8cd7da66b261a241fa213b10a57606535369385f961152bcb3b0c9f820618c0577d560b9279c68cc05c9a333f07bd2875408e8db3ca74d1c9e239c57c19f3d5eecb6e8bfd01a42878e1948abcd331915cdb3945cbba6dc3f89b11a2d044c4bd05cf467df21dafc4d02daa7db48d8f201eaf167d3e68b7b2583411d35184c3433bbe9650dd720499f2ce10ee264c0d675adf6f8a0d746b56fb3b6ab45f65f18ab1607f1fa2887dbd41e54be91779b9b7f123b2a1ac838abb72c1e065404ac0fda70dffd70a0cdc75801fe21dea03340101186191193b8e23815b684656b546d0c966672a3acedd1c4eda03c4edfd5e6077ac002c32c670c34ac97c18a2f755131bc0468458802ce601878bc84baf398d0934aea1f873945217425ad64266bc8b94d3e83fb268d230acc6ac5e431aad8331f879416411ba0d2404c7cf612910e8a01bcb9a0de6ea574e795868273c90d724fae1098d4389d8ff4680ac2dbfaae987b04069c768121f029ac692e4e39cda0bc3fc9077489d130e4050100ed74ac004406f5d942f075936f1ea86a350022733f4c6515d8230c5340db2e487f79d7ce2a62ebddd730450af18512793160e0fcdb07141fb334933e7654f66f440125fac5ea2660d61862a8e59943049556c53592ed4c493218e65c1b0c3898a8fdf4528b6b76b7a59a3d13a18535502a9738424c01df6886abf1df36951a8fca64c452ea38ed3f2e4e944b8e9030560792ad529af50a06debae64cd69840900ca9eeb976c57bec6aa938054d7e9752626c00b78c94e292b94456ba266c3ce9f0342089cdaae22dd438595a81cfe1dbdd80ea5115484de8268882b9f060f127be435f24535e0770ffe04f6a593e0187756e79242a3bf2abf790ccfcd52cc5d1f0f8c82508e0f4076ba184136a7478a25967a0f6b8eabcc99bb68100f490013d495a3412b50118972744da9146e9982b4b633e2188781c6bddbebdaf39e799794942037feff925ee004cb93f1586f8f27d474584a5c92349412b768bbfb2ab872bec79301e30ef4e32f0d3fd9579690936109d2379619b422bc25ea4e11a204f384968622b6262e0b9e2e88289563d355c758e5752a4e62d1d155acc2997fa5a55157241fbcdb96a0918910c1793a797a9d32cd2f5f6e8bf1daf97c22674921728b1c44a3bf1387b8ff4bd2cf0f619ea5f0f08f8c4c9de8625b0909c905de54c201397adb0d88c4e27ce25ca5e27d51c35496b0995e9a097a7240779ce9d91d09e9778ead9d458e734ce848c4e5e7962dff9f6a9d00c40b8e0859fe542e16e2fa87edb90552a973bb7148c45a43a07756f72e758473c74c628cd6e333e5f073c8ec494d802fea6d28c8fde605177ff0fc0de9a19b046799d5de808de0c704e6e4255a3f0a2ea6a88592cb1d563c692d222cb5e33573bf4f51468dede6771eaac930b6ab63fbe83a51d54dddfb6a21e14d1b166dda8159704dc0bd262376f1f726d2b02dacf8b0beb46b286b5b7ff4696b431b02d38f22e1c197638a21d8038920369b11a2539cdd7dc1c0e0266be3aef3cc35d800c22dd7c5dc9914b55b7fac2973624fa2a131f731d5c95c0c9692271362816950f71f8a7bccc91cc80bb649783f15ab31bb439d4fa7a0163561058d52e055b2447245006ac56ce4574cfc5483fca3c1755d152fab96876786e6cd0a654a36f98efbbe7cf455eb97762c38c0b00103694275a51b7d0bd54d0e4c81f15e9b5a21525c2b1825db438ce4560247da92503622eaad0915c0d7e307c551b91dc123eee0f47d5255a514dec75642f0b254a7ba9f788c7e525842ff57f01f7a775b8db705a5dd97c87f26e78b3809c9001ca7a442b6ab48b54f1d0e4a07324bbeb1912843f4e4dc4dbe3df235e02e53ee21f0a8f0f30ba0f834e51bb282f3b7d1cdda2a5f6460519f5b8c9b77a3cbb950f2b12ff1c8d0c054e02e2a0dd9518ae04c70835f9c157fbea4a5650a7b526a34480cda348eb23cde24bf835ff7a5b8c505d5d8c94a0c6fce23fe54dc4929bdf645bafb019b4d4f51cee47fa88160e8dd7cc73940050344242c15b98c13b224d58544416f1fd5eebe7de533ea32e446631f0f95a7c809760253c32f3e4ebe06a0f01e84cb9e9795e516726df14e5354b6a4bc666b95a2d0ed6198bc54cbfacb50cd21dfbbaf308143c14b9659012824ca92fa3b467193ca0290a6065de3fede3ae949a35f48e7fca98d2b7ff339dea68a89a3428e51278422e4798a7d09627249355cc2019fb93a96dc5a36f682b1e717b228dbe6e796660b72c46a0ca9367e302fd82d4f5cf0abcb3351f934a7bd54e422b351315e889cbeaf0225c09e84752e206bed6ceb90b8473900d160a5e3741799b10403bf812a98c97476d1075b5e19c00880ae6129e0eaa40cc8ccacf9598f31052a5b1a4bdb19743cdcbc7f329ff1772c6ef1f1cac92549eb8c0fd851cc2f462f784c8779a80ec3ed8e4d4b77bee3f3eddee1908bc5a6c1091e672d3677c09041ddec5da1aadf96e146802f135d92b062c5cd1aefe235a7901899936906b52544dba579a1705afdd61166ac84201698e2459084e6ae141550c260665093f199d1fb38a66a945fb43b1ad8c3f29cfabfbcfd7f967944c44ff9c10cd280ba443a748416766576a2a2142c3cb4936de88453e82a0b9f8540771fae416ea52db96d9c18e47cf76ad1120dfeb9b19bad50dc5b1015447647f4067a17ccc4e3397fc9abe68e9404c14b09a9c2684300393290b9f3c81062c61c5194b8f2002eef361fff12c8410839a2e0672f61301a85102aa69050ec2a492381fc0b318c27885e10be140897b884105b65e0df959a473dbc4abb9b302c03c161dd83a5a31e89214e708f4c91639cea40a9525f9952f5cbc44bd80e113cba91ecdaafa12c5324859119c5e38d29e2f974ebe2f29cef54109b7d7ed2699b1c6c7fccd0beb328d6dcb34f6ee413883ceb6694ed84913062905cfa8fc22d83a2e302bc815485548352415a415e40a21a9cb43406d1023a21fce1b0e07c684c25893bfd590af286efa637a2c4249926cc78c978a9660cf55be28133a7f02bf53c904859574481a93e7c599175f802321270a836704bee4442a6e8f882f108cd45df42bb31be025efc31eb8f631e3b4507949f11f6fef0688d1f2a00a6de4d72342dbbe43c34883724e152d1e03d30e0666818e511e8c381824b39be0c1ecd2011a89c9fb43d6e95d21e4e28f3c6d62e0277b0082d418cc5ba709c9585f68366ca0475101261d72d301c5b0a194bd74fa590675e5fdc1fb2ed4c80d893a8b619e1c09285dd34d23b39b53fcbda47346cc2ec1373151e2955dd5b33ca579cdcea6aa9c355136c82cdd849895a4ef8b0c0ad3f6002980e2e3b065a7a5e830c5466d6fcbc9e41e5976cea7aa7b71eda3c3263d54a911f2191499862d00a9ab11d8b2fcb4ffaa8e5431b5bcaba1194a98ad004ce292cc386acaa93ca01aa4fcb76c09652884120e887d7498451b723d03a374a8411c29a468d6ee3d1a525bcb22c5b8326b9f897b8f52f42d786b14a45e206cd980bee9811fb358a026dd2faf4740502c23d638820bb7e395a8966181b63fe5cf9c7b2518b16352b45a0c3fc43559ed6f13078637669d6978d599d8bbfe48116f2e9cdf9c7bd2b492d31c4220509795d39c18b6ddd2fa5c19695fbd48f61ea4a0871a80841af45a20acfbfdd3d3c661835d1221448bc2e65e30d0088c816774d0eae85192d5cde6042e73aefe2cbde6b61be265611b4429ffde0585f6d50b16ce2746fde36d9dcf210000c59bfa3d5cfd789dd40581e8b83e31f3334c1a045084180b91591b13f21ea29da06e1946fd0f9d067eae6598247d479db313fb922bdd3d5a10d254c0319c08cea17f3d796f28e82894579d97173e004a27ff65e87e933ca6a086247efdb02e9d250e000219cc55cd3d04662302b16ec3e137a9e47907afe057fa25a3663f1e268f33e7280a5fb581af3cdab3a09539d63ceff136b35543900b61e667c731ba4155cd0a902e8a36f2a6892fa7e561ae4c6f2600da1800110ad69d84f6a4d3e135525de78799676018596e180fadef59c72231be0050fc7e226e1ea0c978d42564574cf4e4c71af92488e0d2fb32ae61dfe51e236d5dcab1b5568fd22ac1f38a7bf6398d700c1bab60a0b6e843f39808e55b11e456083be404c13147ef13006a8cf447ba0a00bebf92165b476bd2e6b0b0f09c329bdfe7c0d5f37f38c8f415bae3a3dba0421753e3cacf40b621f46c95bcb530b14f6e03e1d588d15886c05c958cdc8849cb2d971296cffbc484f2ccc2794e01bcd196f9a417a9f73f7df7b8c7b94f585b22af9b4aec48fee674cb8939bc34b7d63653b7559917c54fd6d0a122c84f878a47ca954393ff6a6551d1be97cdf82675861e5163fdfcd2449f5c5a39a1377749bc433c8e46a26e79d8cd38ac6e8cbb811e573922d007223245f87e42205966daf96606522ce225a97005ef80ba11301867dac2fbee0aca23b5923f90e625538b9685a1bb1f60d388938634618cfa9edf19f02d930b791756f7f2ed9edbdeb3c588933d208392b4ff123c4363865105cc01f2d241cb06a22fc73ffb03fb8ab91b362f49c605cf30c260680815716e7919ae8b6d7ff7ba58bb90b93db2314775a5a02d50c053365404d68145f8d2a119b733d01178bd598d77b06598e834d54199169f910215b12e3251126381ba8a071b6fee3534774230058bf3e08d2c51059f4b9d1cb65dba6a0c1fb30b076dcf5f2ac9ae5904beddcf3d4d4b9caeae668faf754dcf6ba3926952d18629a3167c805ec519a3a3ed6caaff6bc77d2ca30317d1865e035bb4ce35d6aee802a1df976153cb77d70ccbd95c0db382ba0b289a9ce2bada33d23187f3fddee96a64478bfdaa9a7dc44f235725daf32ad6554c9cc80a81bd61a68fe89a806bb0b08533cf85dd5a1dc5d6cacbd9abc191068eb81f03bd3638bbed35a1007e157aa00e751531417833272dfbef105c1c39061cae7cf91643223de172b378bf6e5d02f6960b8c881634ab4637cfdfed8bfd02cbe952fa3243b30229b79f94358c64605ddea3ee948e8226784be3c516b200b685b1b6dbc46510da4b6a5423682b19a7505908f875035be9ebcf80800f4620e5c8522fac67c0204b8b194eac37fb2f7567b111fc5b8f5a1a30ebc208e042acad05ef12d202af89186e5ab820737e454e474a1955343cad023af0096554205e914d07b356705d09f39872190b9a8cc8b7af7bbc56896bae57a72d35e65823cd205823ccca296e49fda472e662d2a5cc405b434bae8c1ec589680120c26f1b77824804bf598b8896b4bdf7de724b299394324d06e8055306403d8da89029e4e6266cc7c155c9668d6ae23789524360d11c02df4ef1560a293be2bdad82a9c9da248dcd1ad96af607993a0e0e9813d2da73be22d1bdc7a954df3ac87cd1b629a37e83f0f82588d36d156f978e50981d038dcd17560a29a36ea7903434c7da82e8705747477a27eb3235b2190af53f384009e2cc06acb2c7f64cff8135b2425bb845d12485222832c49d59834371557be5aac4d3b64aeb4101b6ce6db3a1dccbb280d1daa81c19d05450916dcd636d28a76ea7903ca8d1222175211b808602b0a0ad79fa26311692c7dabc9ea0ae20d36bd52069a857a5e6b16b9816a979ec15420f6e4434cda0052857884cddc62153a7d422ad72cd2259dbb5812dd393f5cb59a14cadcd666db3dabe6da4a370ebbe3514f3bf1b1d6e421b1e8e959d0c25acfafd9484556f384856df6a43918375425aada113cea0309ab413d29aab3d8cf4d7272c8c9d70fee549836873df9aa72ad55b6e11d2aa7f3bb04696094184586face15cfd4548b3dd2841288c866d6ba130eadd5b246c92459a691b84ee5499f3c74ab11e56bf2dc2595db85cf4a87a427152e115a1bc519e07504f5fcc6cbf3e416130944018218ee1753886f53bbb1151e22904c54ff43a2c7257b4a2288a626d914e9c93752fa41fa041ca88698d90524a29e544c3156ea8b5d64a6dad265cad235db2429c7404cd99cc1a741cae19739d3187b999b9cee7f4ceafe78915832a0ba87266b36b6ddfec9e81c1ea0d455b7de2303c557c6ac2275b6a4d040371ce9086128788359c6d74c724d38904d0bd20759b45b162b062a0ce6268a38f00f24420cf45d1009d94bb1b0988cba2e701c9ecb937b6b003c1b9e79873cf39ef9b73ce39e7a4218e307bfe514a29a5b4bbbbbbd65aabb5d6de7bb91083de8b47889c63100c41c719e44220120f49c230e440e81fe832fce148fcf45c26f9206616a91188cba29434a8b1d647b94f2e8a27174f8e1a979ac256d91391a494524a799b73ce797a250a848952da1648eef6eeeeca546bb548d3de5a1dcaed35791a4fa7179144cef109258ead209c45e74006bd158433ca71468d350e04a1aecde867158e3fab0c8ed708d6c348fe69a22c59aa683a842131e816305a0cd11bdd3169718ddc29ee65838c65216d6e13854d21776e1a248cfafd2e1b6433916927f513240ff7c385643afe8042e67e4caf7133ce072744a6ce09dda5e6e99b4553d15d29786fb72948bc4db789bb378bcb06dc71dcc97244570649dc51153ed952b352fa14a2734c1521d67a4457da0a5125219dadeb6cd30bdd110a85cfbf9cc6bbbcc6b79cf6d67f1e7b8ee7c1e9910b22a5809032f281010d70c00372f0e8b071316379cd0af978adb68186d7ea196a78ad8281e6b5ca859fd451ca0c29a61416a99bcb6a488438180250e94147662626e7c5f56e3c72bd46a1b08df4480fefc3889597eb781f46d0b810ee6304f61cefe35d08ecc383ebc47c07ce2e7f81d37217374b48997aca88ee70462810e40e6705093b6a1ece963283e4c1344831350f26c2425258c81d5c840ce633d6604e63ac394a8db186421b53473f63ea081b9108d1efa36083aea7217e970341705a21d6fc28f60870993f80c77c017ce60d80f30370ab00977d02dca6024ef315708c006f0d4026cb0a484005868620fa016400df0a72aa999d5035dcd5f1f4a8881a758c9e428a4461a89bcbd538d7ad977906860054645e2561d7671e45c2aec7bc4bc2aee7bc4b9a8b65ec8a12766fe7fd5f0a06be5d2aa4b1fc43c59c4e9c18cb28144ee968fa44b1ab71e10d780938033e02ee03eb014f01984e47538e5463174d1d8b02df0222c4e808690525a0cacbf09a6fe1b2ef6278031e026ed31170ee5f72e8c8e182d53a64c4b00190a4162b187231b5985e4c96093331991075e3ca51df1e745c1f2ed8081b61236c848d4e5a42dcb3a0c43c25a4c9f837c5189ae3fff9b81ff3eba90f4a87a0301f31634b88d262634b0808dd8190d72ba4ad7cfe2fcaf180f7d1873a4685721029bd5ee1bc79eba7b3ca095e2b422d9cb115642536b686627fc3655e078f7900f8cc07c0733ec871dec6ec81dc1f87cb7e07ffc15f3fdcb0810369e8876f09b574f8d61001f8161100bef523e85b405a41bee602fd58732d3e01b97f3d2747569ef9221d3e4e231d63098ba652c794e692cd369b2693eba5c52f6752d14472f1c0cbb9b840ee4d5e5e20f72b151322bae3d263f333fce66538ce772c7fc04bc01df01370ee4b589d8c5835af80685bbb650fb51c37bdd6f6b14fc5bdd65adb755a617e293125a2523a509e1624aa92944baf417744976e83eea05c3aa63c581451947c36877448537949094915626d0ec94518b242717a72e2ab139be253649df8ebe51f760f599ce5e4a37f0b76eec38f7dbe3d718cbd4588478fce39c7af817c276e7d383cc79ccfb1d6fac6203cfdd6aeb7fcfbe6e41c777e1dbbfdd63706753e1d3bf8b5ebab937727c76e67b8c3cc7887994fce71e38e9ae232c471723c0271f26e04a2c577546edc51334b8bafde3b0cc04950cb58298c657496e3b1368e92c2de2b85fd58dbd179de700f5d8637dc43ffda0872383dc41f726e6fe8d84367858e9f3a77c71acb77f4cf89d72a5e09c71567ad38fe95b1f6b1586eb1b3dcba0ab658c5b1cf31f439b6824e7cfa89cfb1e6e5cf81f8fc05befcf3d789bf5efef927bf06450de4e975cea36b38f4f9b51d35bfbce5dc7b6006d1009c0481fe1a6b9f83147c7ded7390e2e86efe9d7e9bb3ee72ef81f8dca47370865d3702f1f949cd8e3b6afec697ca8bad957f218d9572e2336818b4ca27fe611cd250fcc46d265f9bd9641e31713c271444c4134a5bbad16c325fcc264f823c979a6726756c26ad9cfab451c963b5e2c03944f6a0302288b599f404dda9cd2264eab4086058f4e2252fdf83c648fc23791e185bebe058231122791ed86bf2d6e37b013f3f9d425a0f0a9b8f7978df581dbff4b956256f77310fba43226db5d82bc6ce8d2e3c7aa0927ccd5ed224829a4c2e58e241772676a5997b080d41846792f5e179f86be67e4a89ed14ea91311e6b9df300ea4161f4149e401cd843f069dfe90bddc5cca38775cf2be579a179a314672f1863e7307610bfe0990ac35388c6e44d49a9266f4a995279bb354d12b450af8237e5d74c4b36238d85d287afed3c1195ea5bb5574949c9db40109d85984f9d838d4347f5146da36410ab57ce438124abfeb15f355f607f49a52a603f09e6516baf5c10045550cc24d68641d47a12562fc7dd7bafbda730565d45c66a4dae2fb90639090bd81f628cfbc1dce1dcb89134d53bdb4dd7752e60ff97719e2715309134d54d408ef338ee7af75aef05ecf7f27c922f91b2eaf657295256ddfb96a471452037f64eded77ddcd799d44e8fa5cc03ff642d682d075ef049de842563d54fa38c558fc9d571f61e4b598555effe2465d5bf17a5ac3a090642cc43563d0c836818c35d84f20ff4ba2f12c7a1990f6aa432860a83c47e8b42a1509544caaa8b28310ca299449cf1ee4db52509836aeea7d9b347ec929581d829bfe1db31505853ca414f74eef4453e84107d52a3a4b1a1998f38aa6c2a58596f71b1b6296ef788a32108c18820f4ed02e1fee0fac0e5c5daaa92a5a26f55a90ea943aed1ad489c3de08178ab432cfdbcfa0773777a564161968900d2c7da3a46fdee401c2d0b1196b093926e4b11e2f476e9979056c7ab03717a95557f0983e8ac39107b084cd8474730ebd361604674d231ea1b0851c788da4848cfe638ee7297ebaeb50d6b01e710f13a0cf87d58ed7c979076bf17580cf83d786b6aeaa116f2af16067eff6518dc160616e3d98c18615a5a5af16a63329e8769c04ffce9937a8a7474a4d4b1240aa33e60f855d2802e435ad8237fe087ddf3f04ba55a19f07b6c67c0efb97aa78b06bccf7d20b74b58f5191a59434f373738d64430432303bfb7dda3278f0f23506ebd9f06811a1d4194d2a66975046bdaf67df52851c750435488adda8ed058f8d319c925b3e9968b35036f5c2036f66f4a7a73c0ef69bed5bb42ae63ccddd11ba2712c9a05c393cfa03876ba45b91dadede2c04689106b6dcb36ba53b34819f5f6c8bd81487d50218c22d623ea11b9476b03c39fcf75f4864eecd08df5d91223736da6d4723272a6ab5255e2c6bedd6e99e66e8686bb2d982c2ccb9bb5ddb8efb2b5ddec404271c7d58bfacedaea7c21a50c3badf8666dfe2c4a7c0c889dd215b3c97a47f35ddb282cba44b24454258b64837c45a2f78f7309c554346d4b10696e8b80d2d084ed359c9291a424eed6dc6c831041aba3b5f1409cb27022cd4059d83e0b8168c6f7deeb971b67b3b0dd2604a235dfda76efe4aa908d4dd87e130666b8d7dab663ad94881127841b42bd465548ad5748ad5748ad63f55babb5b55dceba97ac1032923d97f3c06abb4349484a50406a1ecf8812ddf196a02077bc2e2081ee7d2e04f601dd33d23c1ed312ddf16e5d903b1e1612463d0572ba80a979661d9b42148685dc99279030ea31813f66a0437dd63c1f0d64bba073fae1205317458987a690c54258084f17c89902f07618fc3ccacd6c12321d7a953c85a6d014fa6c1bf0a823669f10ad23ea1312ea96a873c95a6bada56eeb686b5d0211227d6ff7ab6c77adb5d65aab135cd5d61637a89736786fad9cdbd1b96bed51b6f6a8c7226aca5b5ee5ff25bef224ee2815969589bf58a71498981798ab25338342a15035e5271892afc5bd3967cac5eb8db9b8b854fb82899d3ca4d5d09d058542a1502894a72a0a85f279f279f2ef546be5702ae6071111ee4862430c0d755e09cc73c2a702533fba7d98242523b623148674446fd5092641307ab1505260625e604988262f564acc0bccd592994955150a4d82c8745a82158bd127623ea968ab92228fb0261534e582594a695b1fe92abaa96f242f302a94bb040cc90ba66d4aacb61d69a65e62a27e342a8ad42898a7d206e5aa5545d59290269aa46ac9bfb372cc5360622eb1a74280c0a85ea6c0c05495546d4249591dc141cb8b9512f3024bea5810905c4e08612f3129262f960a2555574540151598d4134a4adfca0a4c24929454c493abfa62491594455d258a7431315f9986b05215a522ad5048a822f89dc48d6a105e4814568f4e641193172b25265555287789d4cbdccd1f4440766880e4578a626ef24530272531af29967f31540cc451fd5a14949cd84b1f944985e8028342394c4813fd83c1569595aaae42b938b029286fb72893ba1adba644ad5596aa13e59ad458cc0b524daa446a0c26468f502bea56d4adb366c125c624555757099214cae738dd4a0aab49464646d5c8486f0cc171140a10d479e1e2850b9d9f8129b1a46656a2aa2109692525aabe2149d594d4cc4a48babbbbbbbb6fd0bf5e661318943351c5949480ab58ab54a149af56a713b0e6afcf5ea75b4793c9d5c1268d4261e9743a44d8882643c5ba3de850853f5f1222cbc5f27215956faee0f0f07a3a435ac4c3100f3dc6f849488b71e1e1a54f4cd31f1d52a2221d3ea91075b4c4622e3a5efac4461a040815c2c232e6d0914347510ebf4de4703109692a2f395efaa8b084413dce37b084f33676561259567e629709b105a64500f454d2b4c3c0307e79c1a8c05a62b6c944613019199571868526a4a9b4f0d9cbc8c16f3e86e3fc9df9171ef32e5ce6bb1b63862a4194a1e9e9994350d8504c0b9e9dee850b1dae09e28c4ec762e9c09cd061753dae2835110361b19a8eeb1f9b63c058488b9175af8e71e2e6e6e6a6bb5eee263633735ba7d3e97ef48c133939393876662f97e38408ea3491f3edd4d8080d4da2b1058e8b15171ad029ea21e7eb015f917319e268bfe38ccb84b499183dbcf499e909837a84d15334a36302e881d1c3c3e30254f9be2c1dcff94e87884e47decb9a1c0f0d0386947137305ecc18e167686e4f19191d3231aa143142588e0c9d1c786684342688b986268799981c5872383159e5a02ac92107ae67f58ed2ae3e012489cb71d7268954e972dc4582254af24aab0c52f7daa3a983a139e79c73d69e3d8988d324db6a7960adad1c7755130956586beb1d72c18b84ca83aec343c4e9b70866a8ddf7de7b6b4b6839aef33e303c618ee3b853087e5e37b6519298e5d581bd9c7f1cc6dd9ddc3ac871287d0ac1709428ddadfac08fd679a7973e5dedbc8ebbf6626fc773da20a1adeed4566c67d870861ef8851e09bc4ac33543d250214e74d88a8ae2b202772d0219d7492832d84c515397b2a61d824c9b569f3a486adcb1681870c75d1867f3c54ec950e71cddaf373de7f2ec686e1051a80aded5f33caf2bd7597c419774075fd87d1415a8c2d8db04dfbc1875eacb7560681d759af1799e77e1fc3e70c2903367fa1248eb1344b7412bd6ca85605fae76de67437086c7590d967e665cad84e1ae86c0c3b86b713f673683c16a25aa3a68db579c41edab443ce2c9449540959024a7ec992f3ea7143ba5f493a0378ea0278869d7d12388d2a76339253dd57abfa75266dd03adb5d6ba94971ba7acb6059c160dd4a9743a2f501b63ebf85ece8e620d663467abb5d79680ba6ca9f9d3ab84bc4c90b708524eba4412492081c4bd4112905028d082277b91708479c51095127cb28506ae9355aaaaaa131ceb655eb95250602e2f56a8636368fdcc3231ad9613c2171718caca95527292aaaa22e0ca8a482429a9882755d55d5f9928ec55a4835d9112a4e4a4de284c0812aa082ef930abbe327d1d03855d4161b72694139322abaf405c2826f5a8e424b552c5ac54aa9995aae457485c545474545e2f95aaa6c008718d15c81898e80e4a134a15a21a2b10d54a354b69579faceaea8b60dcf5452d0efbca549b6e1d13b23e28ac535a1cc5c5c5494cc6a217ff60605430aa17979655aaaa9438592126262626264bf454072840f1048581537efb06bec583f81bd7c0db78065e8663e071fc029fe316781d07e277bcf63c5e8187e13f7c0f8bc53533598c17ed03783be3dd73f81577f12adee2f167bb7bf60ff09b7780cbbe016ef30c701931de7de721e03aef83e7bccb71be0787f132b3d81efca2a679fe52176d179efdde3e2dc8f3d76b38602303877234a4bd665a6e6c64d8996c723e0120936d77c7802046c5721876220bb635979bc976743c583e9dbc9ccfcef34130b22610d8c8c0b19886c7daf7c5b95a7e07c7791a9ef340363a705d06cd659ffb5f320bb6359c4fb6b86dfc0a1290832ba00a68410c36683244ab810a7a71ae7e971b1b1938762663dd562ca02b080564b92fb7c9ee3f03c7fa08b95e9403723aa17c86d1c3836b62bc98c976747264b31b1b19384d88d6ed8cf3957c632303c7b686446e6c09cd3e017ef30870d91fc06dde002ee30be03c9fc3779e07d77905e03c01dc5e121517e7c2b75f2565f2223971d97e5666b1b137b29991fe146be23c33d94e0e4a7613dcb2ca2c96ab4d609c7fd5f09da739cfdfe8791cfee26d388cdfc1633c90cd6797f9f8ac24b3585c73816c5025883f2d5ce55df8cfb0f8074f1c367600bad1b41a347c6e0ea271cef3402f6cc8781fd98c24b3585ce37a0559dc4e04d97801fdd02c6e570d1a3e796596dd5b5219e8677cdb3876b86103e8677cdb9873a25dc09617c08d1d9ce771d800fab136807eb2c5afd72bfb0703593efbec39bf7997cdd38861a3e76fe0bc8ab73cee5750bb8f3f7e7ed61b58b7201b2fa01f5a8d9576d1f061616181015b1e87e3bc8fe7bc8d1bce53f3d77b388ff12f19355cf69efb4f99c566a01fdb36807e6cdf3cc8be2ce69c70c5c018cfbdf8eb3dffcaf9dc1feed8b1728d7856097a29692c76bd58372762e00e985960f4f0605b33bad00b9d5f39324a43aac993723e961d1d3b93c9662d1f4310fd784e66e446dcc2c2c265fb3d28a0856b9901809b652f338bbd99b9aecbcccc2ce37cf69caff1e335afe23d6f03c863bccb65bc8fcf3ec859fe7a07c95c2f1a2b7e1344848d1790eb875683468ff9596f50e12ecb5ff79fe13172d079ec35f3cc643b39b26fb16eac3750586b6808ecdf12ba32fea5e7635ce55d38fe16cef331df790ce338efc2626f6c66321a999abf4e3323131383c1bcb8e071c5e8c2622adc84e9004c9502465b9e73ccb1586e64dddae2d946a0e8c64492820c49dde0065c0843129ff49e220b68164c20051bb24ace6906f9052e4c21051452c045a494734a8144f641644971d449297ed0dd5ebbe7f527bb452972e075477c73ca49728549274d11a14d5b89ec8398926b48f490aceada35044f43c835ec46594561150b457033f8ba1bdba04f2cc082102d9988220e51a4a10b0306fb3b2e701cd7277ba47621adc341cc2c7aa2447185eea782b46a9034d26609b589a4162091a750963c25904ba4610a7906e0bb3f547daedb3780e843822cdb5b415eee3108542eba75acc9b1bb6344be76d9a29455148657545eae162b05e5c464a52a214989a853087e5e87b96b6b53f983f8e51ae8b5aea0045935f3d5c294f304892890a80d7e267dd3272d2206a2af8652763d416161ab356143f6415ce59a9865196c5ec8aacb5d4e944cd8b8907d1055b9f659fa9dc2a3c2acb572b8045ce2de8bbb0f0959353baff34832f51e021a799ff7a532b51551c32719b4f866124a96492c68c2fcc04ed2d07e1fc42c99886289ec8388cad2b92c99b0b540f6c81ef965c984ed045925fd0b69492c289255141644cdae9016c4cc22879286fa17023d0692197c0a88a74c43d923a7ac2990c2ba2c99c0821bb294de0e11057dbb9b526b6fdb7e82387b9c75cec971735e260ce172b63677adec968e90beae34cb963e6eef4562bc3256472b69ea155cc55e87bdeecad56f696e74ff72f5b2d7758b1c1816b7bd5d9df3ebf9f555a2a3f60897c398439975cc460d1d60b468d12fa895b3b45adad6a4039b7aa8642c1c38355533020000000af3160000180c08868322912409125d9c1a1400126082665a562a144863912086411c0632106390210018008c31041965684a2b5044f21971936d96189fa0d60c63658978a1e2594459aa95675636f9a096b245dde85537ce538ca1dc3c94afc4e81f147dd70b632971da20ae76153d0d90d1e32588125e310c1f018827b4440160d7048250e0f366c4fa27eabb0d9c70f9defd5f15a0208a6c003e692b0f5aa0b6e3b88a5397e6fb9da41c42c1125a2a36ed9bc626ecbe729e7dc996cb8c5f59a810325f98fe78ac203111aa1182347688ea792dbbbbeaeea222d59099ab3cc69b13a1904f349f8d8c680359c28df0b28b11aae51b965949065d3364118f1f064a79a9da78f4d97c2171354bd3cfc5b13a42493ff6369a222d29a583a1be455bb4f903f08779132bb58e50f4e326990dcacd86827d4731323c1fda9209356874684a99504a8bcbea429f7fe797614635e5aa8175ef8cbee18f3f0ac17c314d52bb0a4536accbef231aedf055a8fc2f72bc5ff8c5b0c102df60a6a06241ca599f80a2582d11ccb4352723a56fa361611f88cecf1b0b4970995e5fffae12160afa1e86b76a299348c20ed1a5a729bc15d5b920b6f36440f5a1114c5d3449a8643fdeb80eff91f36ca13478589060e5f495ae328bf4b073dbdb3c908382de42e178be887af916aacf58a2e765b10aeafbb1c04a1b055b7cdd0a51c25a9ebe4785c55072372099df0ce534d11f753cfa97ea00527c4ac8d3275e23f575fa3d03290cd88413ae29d439ffa2cba024ce1456c5271cbaa40229384c42da92d0cfc5e82edfd8e50fb3aee98467989281580e1448b92252651ce0f2e9fffdd51407e87347c1e8530de8f9bcea83209580b7eb04a99369fc586541ca2328f6fdf3adbdb3287d3e832e9ef05fe914f0c2fa35fac2d38975bfb0d09a2b9ea0484aeb4268a1246d3221d66b4811e804410793cf22464f0ccd0b3a251cf9af02f80ab7b5cea586946129767089ab94318c9b64e88a6112c5063c624d114370d20c50e11273cfd893a634d409aca829dbc06d49939c0e784b7c2661a028a5fd34794b12a03556a48ccd94d7121ec9d233c0f9a4b20ffbbe53504ae396a5b70d6bca32b0570a0e8fec15d5812e44c7e1d67a916af2dd534911464aae9e81e508acab1ac836892b8de3b4ac6791ba24b656003a42b5103b597c1df0aa64ca1146aa8e02881c365027ae55e4dc6b7c18a423fd108d413e043d349f0039de086ef2389f6879325260b0bdc1ed8c1405e3c221b2271c3300d03352f8f4687b5a804c44ac231c746e2355d1a73e04bf6fb0471f5e7fb72c1e2f9d5388798f43db485555148c9a178e142f41dba8718416a71c1abdc30e82cbff86d48ed46e29002f52ce2345d80ae33561b07ca4d6b684f3e6fe48bdb828feaa7ce9a2caaa1f1aa9cefadf3a440ef8744192049a08d8539054da732129632f0d83d600702292e2d10b37148ba47691186d936615d68887a22c928ab9e52b8a3e378ea442cb01196895c39ea5f45bc4d36bf274e807dffdb2e1e70b902b92d4c0f76d0f3f3197466353bc2e310791a438006833c8306f29fb358423b759325f034a52e85a47f6f8c92dfbaf80a9ae98b4e137f4869d2cc63b8098c532365081ec108e9447591b25351c9a926285c32b4e2575f624052b295110eaa1bbc2bbfe032ba9855090693284e1833ec9261bb2e3951486803c2134800f700fab4b2e40805c17558f7cc527b15b5202da7b26e36f048acd2d294123952dd1eb96d4539f25d5440cb6cbd3010aa5c1013e3a951f6e4911372462812e297b516aa69794641711132cabda11ef9577d16672edd7af96b8bda4006ac5108629118eddb1f33861523331bfe38a49153ac6d339981453a078a557b2284de2594a60f2aa7ccaece1c0b4085eb5b2885e0e5f6f4cffab1c8706c7efc006d919594c6a56e0032a55e27effcb88048a2503c21a02d5868c83391b193866c4418dbf3662c7400ca61f40e8cdc2114a77ab7551eec4516444ad93f1d7da687693c39cddbc9ffd04aecc8cad239a419382f9a413f99e81584310fc5da2ed0f9b5496cfa8005bff166a0d2e330391b599779749c5cd92343215739372d2847837b6e7be8e0d2ab8d8a4ecfc7ab1bd849e64eabc0a3046f27bf8bb5aefd9afd779e488d7ac4e0179b3424638dda478092a68cbd01a9e4d2a22dc4dea39f5c5b79cdca3212aa926b5fbc4ff0783c3ecdec90da397c56922e24a0773bf00ed26657d5e5d6741de65c4437deefc53df199dcf91abc986d12b6552468197938225ac27941b94d584725237e3f8c38f2f78c65db417d6c8f075e77708dc7c40af33a8b5cf7e474b7af36ff2f74237b59d97e9e265b5e2b8aa19859dfd00f64e90516d27a5a25d16db6eaac356ceead90346da4975d1db844b4fa99e69c6b01a8356a66327b7dfc6d3d323101cccab35d0aca856271a79e149ad1e601ebeb4278c6109972dc3937ac772a5eb00f8a506195e47ade55dcb3c29c5e74995da481c470d382fbeb1ca4f6f45033761dc36f5c8f57f52cf3a6da6bc8863920a2b502a5510470af3b089506aef1decb155508af10103a1d4ec39e36771a19422c3b0303894dad64a634429c167d883a2d489bc2871fbb94d37e2d4c362c2cf0cbf06948eb08f529531c568b65ed1ea2c0eff7f4535de4829c41eeaae377392de32b0d06b69312952395c1209b7d8f489d34f311a330ea1464ac14aa2caaefa4cf30718679569f6853c4bae94c2832d6b9c7e32441bb6c9875c2935a4115b8b9eb04d1be69d5e2eead738a7b62224c566af0ac71680cbe138b2d95b30a033a55cc4c1f84da953d903f0818280f34a7a8aecb1dcd18f0e0dc8c737536ad16fa466a5eeb5f411de1f80e82f1ca13b34cf31f6004b00d19c48deb97e520a8c60534a888cb934231aab0d78700a2ad5fc4b903fbead161237c04b542acdc076ff5dc4ba9112950a1ac6bc8bbcd20d58a2521f232abb161fbad17d8af6d44911955a8f2fcd4b75cb01139987362d952a26af4a610767452bb54dd01f032626b895da8bc0683de535c7e24a45e267e94151e96932f03400a3335738dc7a1af2b15ca1f67d853a3e10fc0e4a39517bd489fa649c1577a7f7684ea232307c4aafeb27da7fe19d788967dedb2597622c2a1fe792bcc0026e6017cf745abdf947dc7a8e7bd4847c74da2dcdaf6294428ba90f513cd94493dad4b4b39f750679947065e496c10655a3607b61009608afaa9b4cea42565d92055936860d3928c29e2985b5a754988dd4524a569bccea81166111a3c85837af14c7c0e3439ee81e229d028f939d2f879222c1f0a88a3858749ea456e5a290c1ce593a3b7bf68d2946aae4f7029e4152c1fc98cc5ea947e0fc07889bab029b35cf447ab8cc0cdf9d038c68051bfb08fc1cd912d0b0484a4f7cbc8807f91d6e90b879d397ec7b35078ce8c90265b8a1a67b62972924ababaf7a081c50180b7f05f9bb29c5cb6502b8b333167a5ca19703ac42d59719fafecfb00b5c82b0bb6901fd7ed164dbbb061e208408b387f8de9f9dc80118bd1d7688f4dfc436c6567eddfb50f7334d08c5ba7520257e6f45f40df7db0fe7feb43de4664b21b240178051c48f58ca5adffa2962cc2cae086d5c8ab50d2db0ec49b89d44b16f3f2d0c84801c8b204eff314db1e5b5a0fdeb96584188a68895d2fc4b997ea9cc3fa33cf60d0454487d2806cc89ea647876656499336486b907c439c30b26da7846fd53b78bf7c977f996bd0482433db5c7609305b7e9bac617b2ba91692e80b0192e98f0c8763d91add9e5f7623458b23e939b687d10259c98462b3248c1305699490283b1ea0c52d88c556790c030ae3a831486319529431bd61226c946b2a75f455d2495941f41cff29ff9e2b7ecf73b0cae1020312ecaa288598f2b6abfba5783f38747b420c96452f279b5ce6b997f83106b33f8ebc168829ecc946fb90a6929d1d3e5c75f1309a060784e026ef5dc9adfcb14b1ff2770695cd67d1fafb431be301c92abbd67378bba6006cddf1c840a91b50a42c61e8c689535495f1d9bf6985e80776c22d29c19b5e48ac96ba5fc8a261f07b444490c406dc1603706f415b233fe2677fd14f5198c8e3b2819bff31d167e469765e7002fecefe9a14f207f3519224abdf02d4b30f87150a2c378e288d78e1c604c68aa8a76bd50453faadacf3a424a1a030ee895bebd9a1b4a57902c1d90c27dd8b5e20f343746514d572225479c3eb45b88621f43c1f8ad59166d276747066099113f1182d88609840b8b2bacffc6f99e58d7d1097dcfcb0bb79b3d0a1573bc9156942765c77ba50a7f9b157b0dd7e5524332e369f6d18d32e5f677ebf6b080485750cacbde54227187d395e446815fb4f3d736c29578c965ef67975070880cdfabbbb660fd26f158012b5ae442c09354b4bf442276ea6f5d3d24a135e768b688a756cf470d0b77d5eab13e1f06a7a58e559dd6e47d368426b751f832eaa32e1f6b8eed2745c8ebe429160204c154b75daf1feba7ce2abec75ad663dc39702f75d5a3d7eb528f539882e06dd6e64356ee8638a4d98c5176c88a59d44d31ae77455000166f5fde87d48aea8421dc51c748b09e57b3f189f4d3ccf7e40ca2f8a8097ec846fb61ef56150f649d31f5dd50a9914c219bd642f75cd25b358f0bc5c0c321f60aea3bfcb3fbb6474498518be4d3d9aaaecb6fc49e505ad7770cdbf59eb458df2f0ae1d7b715cb13df37dbb4bef1644535193a63f9c2be79f0e6d863097e67cddbfb78e5cabe5fcb0b3166c6142f1b7f3f97380e90e9c401702c12ecb65975f25ab44505db5502007363a985686ce3fc669bf85e2e72ad5d88e311135424912fad22024404732912386e66847d0b6e6e1c6e2ffac016847a26310703a5087ca954c28667e4ddf8eb4c43c91709d3bfff918868c071721d1349b00aae3ae70e309716ea4a060934e39b08a07bec5896bd67c0ded3e35d2102a997d2334a5cba7a059d958242a0fc52b1b1fe5cc8fdca458471240aa5056ec3a59fb01718241ba0a8c2942c828db694084fcfa375529759d514a1a6409b993cd85325490893e8f63b0f94a03361add0a2a3b02390ad8c1c7f0a70a71b9a5aad0029eae681f26b3b773728d828ac6e2566d617a4d171e6e53c90d9acc876b248fbef81b4913e717c11a10b56ab36c07863d8d18209d0a127ec1339867d9dfc2b9c228168fc0699e8e1cf3501c6b186dd49037f9a889151a72b45b51dd378c56840c6e73dedd8f767873ded83aa3bf4b5fb17dbfd6b9bcacf8a3e8baaae9875a48154617103894091613df5ba6436b53df7958756a286be69c38cc93d6a4df4492dbc5b26c47578ee44e5416165d41fe79214653d8b0a5f97d888cb2be3c4336bd1b08219358817089d89a889ca202b2429ea83284a665854f13543556f4f9218754e18a3f299807a83094686843ee87b6e3286a18854406819c31d494c7452d075dbc3d353144033260696ec1aa20e10c37805903f37a63e1131a7897a2a014931400cc95617cc46f36645126b4318e2725d48625abb301fffa9eef0d8e6798f6460360a12e1fb9b5410c928c600c8cd27075534a5abea9e7598c9589d79f230aff80569e74863529da4d67b7d6185ad687f999f142607ffdc1fd98b4dc2ca72e275018ed24541093c5618aca9a3618746704eabacec3b8d4e75895c402fbbcdc9814c65a6ea706692b1cf7311333f149f9550998127a184979bc54cd701ca645465e6a3f72c7f0dfa4c689799b78b4dae8da3e0f480ab38342033d37c132cc7fd4b715698cffc3d0d89187b537a9366a627fbd3d22914ac7e648d33a365818bdb798645a1064060a4f0e43b50e7762451ed69947b3ad2c6508cf176eccaf4aeb70331a829b4f1a49a4e99d6eecbd63adcc9a85c4fa56f574ddd651d81d2e24eee4389d0723586d83db6092d6f59e2ce9287f2275c2f2cb62572679a6d6733b62bcdb7c7e1e254c7ab943bf534a2a533de8145d5365ad9ea3418457fd652a49911ad4b98b8a52eba4374b9197c31c279a53b2997e2d0bb75c7d82973856d30358d1e3e8a2652d7782a0042f9f3f4ded5a6f7d636bdb7b2a87bc416c5fafd45263e6da795bf071197f0f25524c51568bb3decae4c8a036bfefa97897df52a700d2b60d47d7f2be9b179a79c50312bff298acbc5db97cc0ed0aca7a9073df9dc5e1dc0bc1b3e00afadc840aaa0f865d9207050cdf6f4b700eead3e9799cf354bcf55cf962914dfb7873d238abffa66d12d8aa788ae3ca3b585e81f741fba07837468b475c0687713b21ee1a1141f37e6143d6265d15b599df47367d4aab55aa517d72b7a3b2fc58154a2cac3d993e2c834c14446319a1c2b4806d95d11a31d567016c95d43469d5b168a7f28e7db287781413e752ba22d424e4247ffca11000e954bf0fd1a2fce08aa8c281050501c398284971e145c1123175d29f7bbdcec9e70ea2fd397ba655a097465a2fc899b1d2bfa1b390b6c24f0e84a062583d82dae91c0557844cc0c2a4c8d8e2b455d393f914aaf5d572ad8a848ef76b5e111f00bf9e4899a7b9df88246abca6a4dcd4993e876b6d1819cdb26de44543ce1c4b71ef925483ab610dbc1e8373d7a50cba9f089ff6e80183ea6e24f4e36ef4e287e71f08d50a82741215f1a52fcffd513c92df076d81407cba58aec3dc5779008493815533cc5195b05d86e15d796e223501104cbc71e5502837221098ff5be12447843dc14c7c9736a54bcc6e471590c4bccf7b513b8f4682afe814d0f544915976a7a2e106926c249cfcd70abc10e15272b1ce3cb0cb9a3ce20151f01e01aeaedd996a11ab19e88457d530e6e062c9fff7cd1a838b05e4b020290f75f30cf3edd0804d1a4f7da6209688463d6d1f49a7cf79e23e60ee13e155f105e559c77a807cd6a157f9fb08f3696593360e6de40382f5358eac02afe25b2f76276f5be39f1df7e151fca1fcdf0663b17c82e491fcb5a9db333d64f7c8fbf34d48aa834177c838918496bd28a731d0bdbc1e463f94c23555ae2a35ef1ace21ff6aebd8a83bfe63865c547f555cd7caba8e8dcd1e7a09d29248ae948732868f43c595f147349b24c8abb0aedfd00310d100d2ea0e02929d1c9b2cafe2ab4f701c474407470815e07e26a165c5ab267646c1e953063cad25044ddb6d5891d6b1f395616de39eb382ed8622b542a147825ac6d2c4b6cc82db3f27457f1ddb16575890ae70997c5232f6a30fb057d573a6cb29f4476b1ab38942962032de126dcf2db651982bb30f0159ff22a1e7f86b2219c6130c2ce7e2c52a2217b156f027009688edc903f38b3cb7d14db0328b03c9e644813b8640d314b22f1757951c5b3a29b40d914f06f07bd86090979551cb0956bcc55fc20d2581d2b0e77080837cbc5c6038cc27492e0cedd8a034d575457fcc064f247ef2c49037ee65705644869944cdb22ae7c514cbcd24fb260323badb64f466957db41a48210076659bcf81c3257f14cbb96c0563c383a573c358c74e115673d88f55f71f4fdee4f8d33de062b8e052a237ff3549c96c6e6441bb6e3a7e4aeb1e64faf913bebe3b47c48637129b42f45b6f597d74cf4e56aa8e5f881f285077b37ec99f1527f0f0d7bff59165f733250f7ab55b1aac5e54fbf33ff14b438a2646a6917ab7ccdc2174c801677c8a4491c22236a8e708acf5e1d6fd5342f3e218b1b8ca68acde2b88622c26d6f428b03b7300d1f6bb9113ed71d74a93042fc6de3513df6df862d0374a39029c902ad25c4542acfb7495169f124e055ad6560c53d06c004f53d2ae39f425ffaca11b1f24701b9f82a3ee0b6d15278ef01bb2664e3c7b7b81fc0af1902b4a5b92c01b70c0db009c62d204d4e09023fe83641fdd39a37be064ab689e6fe43fc3b1446db2406274c0e4b347a798a47ad9455138732cb8c88266c5e24f3ca82c505cc37b4d89a99c741889a000c17105e4d6087481ec635e103c0b462c2ea433ec579471cd989ef3996038db38b134fee45db29a22c56a5a01b56fa276ad8c6388ffccd09e2cf3ec33b38cb44e85819d38b00959211c7fc1fd7b2b0a45b2832015fa4d28d351dda0b39b0fa68a8af379507bf14eeb44e602d9d40d7f4339ec04559ca7b617176a41932efc33de1553e3de0211cbfc0ac2c0ec06bf58700ee694f6eaaa309e53d815166a5ec06cd1e10e5115a867cdd67287bf213beb0934fa3cff88d7f366b811f425e550e475aadac266a8ffc8476336621ee3ca01e0afc0951520e6db757e1ddc8c29a71fd3f212b4c7ddc6028341a5c9262b1ef2e20b679ca70e40d11169b3c8001cd500b14886f0814626287d8ffc542860e65685343332b145801086fd9274884eba84c31f2ca7a4e816e0bccd01fefc7212d21983d68ca48a7096eb68155c1fc7d0601318d60562eda2ae104e8180972227ff19e90806725309ccdc3f735282ac13e5161d2a518af8295ea1f83e9edb89c580eecb17260a80d80821c7f04dcf53a4690deef1b9090edd2360650a30c4c287793c10e03f679a105418256ff2c5db85c8bd3df6ded9709be83045c2a3b25fe2296f1901d0d5c10b56591008c85a7e2e95cf351c72261f598914016ae6be248386aaccce0e0a6073f12a4d8bfb849501b07cf51315524417dab5c819df6945a64030af93b1a089b88a3eeebe84ef1129e5c9584dce97d3a650f8f73492269a49260f6ba24f960e6c10dfb2a097fb3a3d1c8065a12c08cd2f30b5f68969b521426812f3d0ce8034a60d6300044499854aba8394fbf81f4a9350913003fd333adf439bb3f6ca47f47e9e3ab3cb04df606ecb004b437f46f709f11380949554900fc9d136ec570b4922b8a874d4f03ff78fc8699026027e101b2088a7d0c48f0269275d7c1b3b9539b4473fa57899cc3e930d304f01b5707ea5222184ae8145902a7bf81e240f541e6086448226cf0524252f187d9fee1d2c6252024366cdc123ecb7bb7c6ea1259ae12fa1b2fa0039580bfc3b6450812b1fd16038c12595009e0e0f72107623d0eca9c3cea311a2ac1d98a7f268174b1434e062dd84e58098a70892ab5cee33fe18f9dacd387c17b4bc611b0045ecead3100470771861a8d35cb80c16aecf6b9efdd0caf2ee3b65902e3489a962081c09b624b004ddac80a8ed4e75b4226b741b9043152deed4e0fe9e225ccac2bc5e01c1c7b09d1b7d81b9abdae6be9f2b7bed773199430649e99ab294889694a86317f82c3f1f3d8d97a6eb826e3ccab65a5f3ffd0d18e84267bb73af70892806e4a8c2f03593b9270cd51d34cd4f9c946753185e664cef8f4b860cd6c0af5aa85c824b839903f78b834a8c1d5ef46a441b52fa05ffce1f08db3ca24089d042550448ccb8f1e49e455c49ee64b889adfc2e362e51db742ec2cbab6544bbccb02f04380a72ca184c701f8865c9915bdd0333a4625abe3b9a5a20410998c7a8d76a466e040f5a2845721020fa7a439475fd42ac8804a20499cfd185980ba30c0f06b693a9530fda50c07768137c8fc95e62e9520064ba0a6124e38fe4a6260893dd451c2411c2dd0cb8b0153c21ba3e17e80958061a01afbfa0a3d62f4d2d584b7843d4540197db622e693ee0b959718877209c96aaedde2ab347d280642286a3a9469355710b58eebade9094be3684c5a839e80638f60d3435fda54da69cfa4083d67361d5bbdd32698504b15bd5e4856f525549255d32d6c4a1ff10781bee950aac171e097d2d053f42874b31d920e713ae977b9934fd571fa4158945a2520194990b42c7e20a559b991926597f0a0b7f430d337d8dc64719bb091834f9646e57409426ceb05fb7c596687392633598d200fddcc33a70324f3c1ae0594ec9fd4008701c9081342a4d0e94f5dc78456152f9f892c0c640bb4f4cb78c721e4b4f0b0e6845de6cb4e6fb5ac1832b92aee740eed3b5d038e70a44e39371625dca28089eb4d2091ec0b9076c21ecf25d537539f88a79fc9272f1afeacf74f8b0caacbe30a4db962fc6b96b97697587458b74f000d5355d7dad35b76f7d7c955f0e926106a7a76d35556396697f0d32b53408c40713edd73c0e4f72361d82943dcf1e8239fc2628d9f411344d8a2febba793646ff9d818705b558e5b30dd7628b2f9bf15d8e0748037c836fe1bfabd5544ff9bdd2a55ec8d8ff0954f84c9f1cfb9edd889b18e4f4a10ce9dfb71f24e6def78c1d9035a1f6ee774052b576eb51c5b493d6a8bfb588e9631a4065fe078b01d21804ff8a567b70dfc7203f023a5f2cbc4397a745d9aeac42aee00ce022d8b0d197e9d4a2fa88a9c25268e5e6982d50ee03ccf4183152a0904b83ce89182b91d7eb586fdff9da48cc9f82397026989ebd12a7af493aa361714f4b299591a37852a3b7b36d69c655645f788eaf6e3ac89efd59c37e79f34d86ceda9c00abd7e17970c62b4a51c9526d01e6949614c71ac5ed0f628b72d73f639eb4a0f4603b43d727875ce1edceb9dfb21b1d7c0e0c202f7e8dae5f8ed774cca5e5db587f5c5ca66b887b5e55b1f2a71cf2bc7c4bc4202996aa2381bb8005fe466b3e78a09bd271b6e76aca52fadcab9079baae869f884ee01aea36305fa7d696823e91ebc6798189dee5971b62db41d70455f30c27a97ef9e748ae4b0a0b6c9ba754f29db68ce4cd0f4ec199f2178cfb0013a31249cabf4cfdfab320e9ccf3530bea6925195074cccf3e95b48d2b0df0bcd3bd2ae0a8018ca4c15df7307e92acfbf71ff4ecdb6f9b91fbda23ea23095e34ed4924403f2f7d85f72e1b320192805ca3068ff3d5befc9b30e5e1ea566d61e395b3d34f03959fac65534083ed894762826c79306f56ba7aa9cede043ce08a6761d1b3e90544d9d217bd42fc07a411789919248d53f9f87ae46c341420d74128cbbdfb0c3479cec89997df8b08d5b6d6e761c9d33fea35ddd5573ae9d699699611e041a5dd019d897d73b521fff36d44adaaac6d9c661149c2c685d18132874f1ed004cc63ef9997a7d97efa4142a4890acabc9cf84531a9403027f1b15cc887a920423a5669f208e6cc07304724e3171a4cacc1abeb4be29413e821065179d19138864c8a304995a31202790b314372bcd2aa04a4c673d4ac28c61a63843f3f41943a2e8d80c16378021134476d6b448169e893661936319bf1a9a0c21d61c8cd58f962731164e5ec86e68f8602906883b119746196aec30e21cc4d2707219a118d759f5c134685a118408032044a04466a0803df277ecc398bdcea8e33d2e66b1d2b415a5cf2203a047340b320162196fe82693a139177aada20eede4070792f790659450cc5716da8860f9cf0c8a8b39e63c7682456a979db671d32152c7661ee5ba9c75554de95516b1f45409cc4b2a8125b0573e5dafd4cd0c96fb9544a9965195264afc8cdfb183e27b81c36daded430701b9f43067410c97aa6cdce5cacc9c5a328a6118cf3b7a8fc7f4da24d8058f4a7766328a5d3cf84d8f279959d9bdb18279c6dccdaf8349ee529c02cef14d13ce297568b36ed46230cb325bf86a1f43f61a6c48372d2c0d6a5c919c7f8f71fd171a568554a0171754b7030514b304d1a64c58ba1e7b915c1ade34478aa453c52c8804dbca1419a53f525d2c21ba5f5606220b057109bccc228347b8849c5be1cd2718adf84c89ac6945f2fd5465b36b05c2636acb2e805849d61f1f70e033b3a04f40d9df215bfc279646dea5575567a7e75de8cc2c5664aceec554ca8066f2cbac0ff66696636c997deffbe44c7d39c879a6bf4c635f6e384b0ccb53d6b985037416264e167e9ad874bf2206741d07c455766b62eed40c2cb567d19683ea1c572f165d50e18024fc2c4f34cd31bd7ad68156cd7d7f57a7afdf672cfa7b1cf940cb6a1c104af9f7649c17b4a847848576d1092d5e52919bbd191d74801eac40b4e047c368b26821b3f1970604ad67710be971e77199ac407f89bc7f0e7d2786ef0063754bf01bfa4323f6e13694dcdac6f6e72fa05d82427c1eeffbe6938d43ec2606de5a2269736241a3cfb9526ddd366f25fb53a08bb83dab7229fe958c042d99959d6c73b0099ae2a526b464ed01b591247d36c7a66ba1c6ab8ab2667fed07c173cad634a7f557d9f4ced5aa88e50921297bd1605f14f2b48ac5af0c1e58551795a9175879c20370d403190e63049969287b981483f7e942aef3c2164d063df4ac978d1c1c55f54ab81c3558fd759c0c5683f7792586f3f438a8dee4014ccb7f1311e31bea015468ca83bb628b1e2dff1c5e650637afbcc93c26f381eafbbae4d80c6b29843c9cc6a218a3d82bf481c79945e5852fa2a2f0f0d1f896fd49dfb34869abbc4601f2ae1406ebbfd08240411308015de39a3c2a122e08dc40261f3e0fd02971a4c97c41a525066b9d10c349e5e885daf468e1f1365040ec20fd19b8d2b66044c86c20f6ccbc2e609a3d5ef5b6f47440e136ae2a26c68479add601d94c4b9e1f87db464b87c15961997f6bc3fb9383705b08ceb6e812e1a77d114a37ebce4bc71c068a8d3c26390c874b0343ee380c8702e0e6ddd452d88cc3480748f6b977c8c7d5b8c3598254b64bc2e582820a2d67293e40c640fd705bd4f4cd8aafd9acb7e4c762dc610499d9ac0f81bc94e387b33cb2fc9ecf470eac627b69a55e71a5f1f737bc4dd686acbe5c7916a71f5f1a1d375aeb0ac66c449a7faa5b9f1ee6fec04a2b9461a19e2b8c0a0d45844d0b4634b72f86eeef85e9ad81d63b0bfd81c84c9efc438d1724f54d67d964d0119cc0de66b71efe17b8d8e2b97dc15f0f2049031a8ba0f37a91f14239d54e467638cbbeb877bb1816d60e03e079151509ce77361b05858c103f9c15a124875bd465fedf82943ff0b736162d3138e84876aae2805bd7fbc8febb460c554b6c75c30d57951436acbdebf5538bc8df7d813a13b9a27ca701ae8baea57f9497835e7c84ac023600b6f78a79e75a846aea0e4503fc39d444741f965a66726e3529a1db9534c179489be0fc205914cb258ff841b6d51e01aa6c908beee8110b952e90917f534e645586e6e60aa693388b82c4be91063b689fd0cebf1581285deed7e482394e232171161ef7629fadf3a4bcef54d02072332189b3b65187e10aea4ea2c2a0575f8fefecfe45f47115eebece652dfb585e9a5114048cfd5631af9b10b8b015ae4ed8b2adc10a0816113dc75224028aa3fc1925f41fb87347a3b34b6a669cd5d61622f020bbb7122efa597208347fe618db7a4125a26723131bb1987625e6289cc15425448ea8bd7bbc48775bb814ad992f6841c513b531f602554540ddcccbb1d32582ecbd7379f28f13f355b7de4daeb5adb21f63886513a8323a90aa2fd55633393ecfc8fa79a673c65ab397f96e0e4402b67401a84fa9a6b5747e55a35911ba0645c3c23ea340a3be36207e69faab3fdfe195374d0c20b6259603c983cf74af96d7e25d39f74884505df43665d9e709f44d2f88b11008ff89cbf9179cf56f9cdfcbab27217fbb8b8f2ab6c83acad74a18918c139b43e883eca6727d60c7215b31ea5fdfb82438e4db2f83f3a4e914f46a9085c4da2628abf4865154611d0b64858d6eaab3904995f3d9775a4859971161b779b6e5b781b0ce62758443fd03a6802c42942821d467c5ac37e19e48211392724b77eaa1ed16110e06712107344dd5632e76450373779bc86dd63d75eed18882cdb19e8ae2db2c37665e35f14896629e41e2f54bda097202b82a4347387b18bdd6d795133f2858fcdd6065ad6a4fc173418affa38d6396e4d31f49164d6051007eff0483b6cca26e46b618fd1c07e28a6687bf58d6c168d471bcc47600459484989e55d2488122e8c1266fc4ba5b484bc6078a65e045236fbed2ce7ef3281fc73aa0a68869adbea8e12a5e50f604cb4a65228b105cc3c9db352474891c0baf2648db48e3d0c28a2bd947ecceddb1d236c37d9c7892281cd5012f09f5247ea65b6adfbb7eda53088eee4fd259ac61bd5d2f5a2b750e220a5e987fe32af1142508b72f050a4093a4b4347440a908130dccd74ef112602949ac4369e6508abf3905d1237061f473ebfb391fd16911b6d5244af7005154194b77ce6546c955a1ca1e1082541895d291b86a9c1c156632b2a0cb84f6a8885080071d56228407fa391f94844454a4c344c86319ae2181e46d0a8514d97d60555e01500ecd3b463220ec916ab5cd6c98c132fff42b3ca374c9c85562492911cc0e9102acd2a53b4f94facbf829ee9018ef81cc16d319bd8d88c56e2ea0f01954d5a88d56f026e1bca321640a7ab72d4e7e98303e39650a78fcc0330f1e4870ee54f74975795574f74cb301f3bcac69a5a8f71fbcb6b11fad85d9405e31a0c07f9bd135e301f2d7a72b87b23a65085e7340bc70d3ae2a3e5e0badd54994143d6c3c5309ba906859a0a0504c39496a604b3aa4ed61fffc409cdd0f270264a7f4d0afa60b920030ab304bd51b584ee9e99eb13021e43c47c66e4f9d8d915363e9c5f55a3e487aa5b981a3f1022404013ff9a4bba263a28ad2b2ba8aa09b040d1d95a4768fd53975f993cc553a89e8a2b8e426ca8b0d7e931461e53a0746bee135a1244995138532547423b7a58d23294a4f584f30baf604301aa8dd6e1d90ca528a304565c609e0d6b43ca364f320d81a9aecb1a342be0ad7c385932893246c6cf9dd7427b1b6fe9f654a0c1ab39a617352c66bab10c29e687919f5d3e3d0ebe299aef6411bf683bdbfcca33f70c6f9b21abbe2b9abe4c9995dc518c9819dc76ce382e19c5c315583cfa0c0baafd35123e2290cd5fba2dbe61724199bb705801795cf2337edd77bc4130ea848966f3824aff16fb51d4729223f925485350a9886f747250908e467afff2bb780a650f0aa1aa5c74f61f92be7fd2f9527e89349041e3c6ade9b08a921c30f84906645abec407f95cd06f5d163139540e8f2d1be3609a4eca52fa9a17971431945c4a4860859798ed4906c76b205745035d68f292292bdce4b9301a4be160b40a460de6edcc20841fca9e41a6f7ed7733ab62ac33dbe5e6ccd75578e121346c807a32ca2a50fe57b036512d6b36e16086463c85455f4f8663685fe58d03c89d87aa72db1470f79d8be42c5eed0759164430985c8c9d802e18ecc1935b35348210fc9638b97da0eff4429499d122d811b0dc501fd7a8b32d99b44b29325e21c18a5f7edd97d37be7cd9c8b61bb7e90e6f60a0b6a2e73550fd2bc1f9403be51059140d4ad7c87988b563f6f1503a9e3c17054c2dc41d2a1924b1eaac688e4d4c3857c532860de1a065a1daf8c11d841fe048dfc9892bd9bb10ef67809fb87ca80581da4242a2395f265dda993c346649b185fa40488f34979ba16a510fc3b4b93e2baa953fc4dd4ff5ea2ee1d5fae6fa90a376e7954b447c81bd2331e778d5f27882037d307d0f194e59db7721de5909a925eb077a6839fe4497ebec9a180c353ab10e2e0e1c349e1369861f872117d143705f549c7846687478da2dc1d026321afa2725e6425409b00fc86c97de7617f0a562a9d9256c5e8fe0c5182173b18ab6c5df9c4ef451105f0e5559a2fd2828d18b61a5521723002ae10a6f2dcfaac919633b5141542307e464759c953bac8c790ebb882569cf610e448c572de9504db7c6e3d40dbb5bf3a978ff045dbc61862667b133e13b9e327c19cbb36e719393fb20fcb534a31847e006a044beb14624e96068ee51cfc360080c38d49d26e12aadbc57e31a139807927a04a7d5cefd000640d2b39b726a824711a0b69b00ad5be4a70204f6b7e2ed59c457e1bd6cd97940349584ed9f970bf6b97bc30317eb512bf6143eb0416d881f4ea3c1dbd8964267a022fd49138ed3d5f669229b64ebe7b63ea4cdb7697c21c844a3a423aea039e099a6adabc03ebc21590d2ff279b9285ed5ad9e993c7f561824f198f3739116c6c7ddcc0a9f0b01a99ae5e1f99ae3336b6fb64a7c67bb544b6a3ea7f689b6118619b3d6a0e7a43dfcb9c13531a9d84d7473a5a75819de0da034fdecb8461168dcf305e1a4fe8e6b56ece5ad9bc02181a0328e6be6f7f450f5707682386894a2dc4d1981dde86a406f756d07ea5545b7e2bc34948987ed2da723d640d4e3d832e29fb6795214f853f615e20091fecb64bf1348010847199de61cf5dab074f6437c512257b34685b8a6e077183103b1aaab46af6b20008f9b8830c9971412c274576f6080c44dcd7e4201a5f936097ae19444120e74795676ef125387b498a4ba4bb2b6176d73c787e9f96b4fda8c0017b52fd03b3a948e567401c79925fff84ffffa1f8503a85e6ea1df38b8ad3c08d71663a5e9fe7753e9c3a2ae61c43550d46e090c1e1e6c3b27e6b26c85b8ec06043a8263c64f8e86ab85061c14a210ab056eb2ae53250591aa5b1d04980839abb2b55a827920116dbec0d678e0feb4530e3a65624a3c91e97ceb5f3be14151f332f7bfb3b0294e6a46601c7e76680508bb3cf12327d6c14b08f9121ff0ccb4bc1902c6da71962faa332e9cc935fceab2ea03894240810fa84a6078431f50bf8963504bcd4a5763fbf6543c0355eb5cade8ca2c0f287e04dcb15d3c8c1de37e51591c258170876518e750d6568bd08d7d1584d4e582a3d0d6c940fcff454e2d89667d395a1682b74d30bad08da20222a023f473015b327402f6730fda369718f4264320694535daa57d0c9de02d61124a1d5dba7ccf6b078aac1fd02a37a16b933ef021672df26c18140920d49144506ffe0efa5fabc019100d66cf92a1b36e2efdb889ba4c523a738d421a2489cfeeea1505e98b06a177470fd9ee70576988955f90642c994cb57312fbc6de1a9a124ee920830c2a5abf4e84171dfc3acc1938f00d773aec9c8850d1550bce41db1ed62b170ba2e8320e749f74fcc3e18dd4dafbb155d2bc16298128fb504eb4842e8195d807182d12e8ab7d5cfe26a8f3ce7755055ba53e13baac6e760806c093e340182645de4acb66a0334b092388dd9e4a94687799d1d80a9fb550d0099e56bb02934c0ffef568c2d9153457f1042988c289ad3c53030bdd0e1115c1e9245bf3c9828229049d00a08192eb9faefb855bfce04c18181158a59569e7ad73c59b44ab92409173a61d64ba948af70b9d5050fdcd9370cab6804a317a40470cb15c7aeeca179d0004af711ed0202d72d149cb688b506058e4db694d874309d7e3c14609f69d4ed72cf1c14639124f1f759f0dfb702e716e5cb3083e8394afc73e989e56094d34051c107cf993e2860f7363915915219d48094336438e457c525683fd05dbef0025962114f1ae2c5991e78975c7bf265265abc08ed83b0809324bfb3be33bf10a6a284d5e59380e54ce3951522037400a0bba1acb6745d5923e83e420993a1020055cd40c489880ce2912fdc2568683bd7f8076fa0feba24752a2cd67cab172772046cbb8ac42025fd3919c14f87ac79ddd85ccb58418f76c87a6f4acfa64314bac8f1915ac1367054d977248020808cef0413d4d8096a0fda0d8df1178f7c3e09e94ed32f45e45e7f2542f084592150233d76743368f5bc160438006bd3e55b75fd5612087530d3d3372a62c6480aa6151e38d7a646dab61b7f3c841ac419a59c66a5e1cc81b9d8b40fb9bf4ff03047a9b5401ce4ed085c505cdb8ead24416db2bb7a9522ced93bb2d1bd95bc2df68fc91c4f2f774243fbcf2f0f7428a0ba2568a22d983296881ee33a24aed0bdba5cf0881eff17a8f3393700a8fab3d6e7587f5cb205ce63c47b982ac9a4e7bf56c4541cde3a24f647259897a64b95b90ac635b9add1a6d45c35ccac973ea3d20c0ab2426594cc6bdb403a72120a550d801994de95e0175ee80d8a8803fc14037385cfb3fa8263f364d9790e68f92876577cc23e599956f159602f3eadab027bc8af7f06f5afc42f2c6290ffd3c946cba21df8733e931701c2048772ee162bfda6d009dcc969693acdadfc72f2064868afc910b0c465ae84f8e6fd85aa1ff2f5c752ce2944ac6dc83210be2a7d66e60a1188ec6847163337e70d5337784585c8658b03b8c10676a5593402d26d10fa192f0c219c55c3784e9af576b1e5e3b58d381111f2f7afdcfa6f9c9b2bbf5c11385e854369e63a00c2eb1b0243e5e4094fcb533e7c66bc1d2e7219802d0fab46782ef83076c857b078138a7c450dba8f9227dfde880892faccfe684d9720604a5e24e10f55c45a2f1a4ef897403fb08907d583451c83162cfd2bc42bc444e46b394947932a011b6ca9871a5a01166031361bd1449241193ad9bba34c179245ccf43794f4c92033a078f846465c686bc0195bd60031ca607a376385a42aa5e231b3bdb3cfb1d437f38ae3dbc4af2302b507890ce1303480b6b89bacd74ea4ea420fbb84a7149b228020ed3c28ea02f473791b935110166c7f719f8e501410b7aa4fd9f9445f237e282827f65834b94b770f19be537f0c775b7dfb9feaf8c5fdd2765a17b3ae1ddda928ef9330ed5bcffe8eff9683a4375ae9b31dbc515326f8b07a046b12b1a9c287c67ec08e956b235cfa7f9c30bb9d5596d5d75b2c5220be179e7d61159908b45f0b4c7a81cabd6f81538d3e2e9b75aa6255258b3df1e1496feeba811963cebb6d684736f93ac664df413c0b7ff6400f1e6c5aa37a5fb6225873b5ad7a7f2dd562376e1247df57ed4d989c4b5d3fda5def6f524fbbb1db7f4cc08acda435eff638dfb102c5127f8915f40d12ca52ae8f4bf9d1a9da4331e04bee71bca60435a780cdd40b0313919ff8085a1cc93694897a7db3bdc85de8f18995952e218a8e501b6fec171f128efd8412202179e55a80bed3816602df20e4747f667f3de7fc6e67fe93ec74b47f8159a2673bfa87077b8cba166ef9eb89e142db020284c557d0854501852d2c58dbdbeecf1e29b210dc8104752e99f1912fcfa29098e9c1f4e18a0edc200b3e20e77c5811bba8c10041934ea177284cbc946408038db93eb258594c9b7c3f5f198be45bb36694706bff2e0d0378bbaef55ac3a2041cee27738bc6d05963e994d417c645c64018435b53dddde0ef76d1e8ea3797c8debe1b50a10841e63536d23050c1253e3c0bac21463cf435c58bdb4d8c3767c9376b86e1c14f937c26b87286939f3539f1e25af895495b01b132b236e331f4e8520a81e0af1e38cee3fc50424cb54a14960c95f905a8d0aa87985739bc4a4dbf450d0c0dc2f399a9e27f3180908a5a4735947e18f877caa2bdbc075b7b4fe5b7e52af347e9b800c0ee818a8f85a9df00455e3e62ef5537b296736e8f429024f563a79c08068fc716ea258ae7d0473c66a9c17555c717e55877ff88f7e2734a9bf412fd408d4729b4a530abb910a64e241f1d82bd04a66985126095806dca0f5de26203bc2241db69f1983fdadd875ae621279c29a0a05e8c88497ad0981d36fea20bb81d2c21a89b89dc141c530bf2f598e3bd9fea3e9ce3af7e634b57302de0b170369279e1ec8c8c5fd95b2ba65682c981f9101bde31f964850f1ebd75b4083ee87c3b6f848a93014db7f124a6e9f4a2b070356551b5b9cd186c63cd46a1e6d4e73c6307a9cc5174490c86d9442920bd8b9ce55984b61a19929e666aac4a15402f041789d8cabc4d852e2531d6c8ad6b03655e057a689529545f9e30df6ce15701dacbf7658881d24aa80cc76e72ab6741d4c22f26641b73cf4b7381149940fa9a371822224135c10824b605c1dec28e1b28d7ee0678dadaa5d069c6fc0a661e78d7bafeb7c2dd69fc8ebe561b2a56467df104b97b0f228b3604fa1d6f3a5b4454d1555f4cf694e82cfae6c2b5b3957f0cd4b80c2f0c1f7ea717a10535135046559ab720d206b56ce88c1553856e2b15773c2283b6fbf59c59860f1e7d9f43827c90932b6117c7d4a8cca3f44d0725edfcd9549a07e501ce7d976bb023ac5c6c40b0b749a559c2ba80d897125f45c5b8f22e8ceb854a6d563b47c9df38f3c13260e8904dd7c60088bdf3a5ecdb88603918a135e762bcebc170ef57c45f140b2e6561a82d4935fbc7660cfa3f0b581d8da8407b958ab2e5e8ac31c27704477d3df9d54c51316f76deef0715a7a6c68fa143a148fb37b3e4e3ef6bd40462a2731e1e328360b012d95f3cb7b041b5895f83825b7814ae7b5e9b8815a8d4cef38df88fa9a5ae6c8d2d340503ddc9b4e839493f9add332c6303fb574277ca41bbb982cdd019bb62a06996678d88a86ee3c21d362870fad4d9d54bd56e28edf02749e5353c44b7f36b5144dc54bae9aca5f9721f49902f4eaa3dca3c46fab906b9a65ae3acd9f545a0fdfb2e2d55dd5f4fa0e367d391f3dfdf6275083bc6f7f1ddd22574076db07ec6be594dde26ad5442b812fcf6981d7dc026f6e63716ea725b3732baa6ce49d996e6176953b09840b65b7ad13399538f0f03210f2b701812f2fbc7dbcfb9c9be7e1ad3ce66dee8e05104e86b7b7f33614ddebabda87f7cb771e4fd27ba55a9813cc1bc05800c46cba7609a2fded1edf287395cf77d14673ace38cf7fda1571300d908486028c9add4707e28ad1ed1341b81688967c53da0e15a1be402d550a7ea86e069a9e41f582487c675c43926717205eee463a99c717a453faa8e54d7168bea012dbea24f415ee51b19ed9d748a10cf7d7736959e3531c90cee94d42558adc2fa4faccb97a2d26189a8527f95038411408e063eb40f2162813cf7b29877613e83da32f7789fe9102228e2a3f54b932207cfc5a2f6b45edc11ec230eb5276782501d1121e2791f8a98a9d0d7be9e56286ab697fc9662aca32c2eed9870ddc6cdf0ca534f4b643593edd3c5b81def011a4464f9ba11c258662a31ddb8f08d58606a919aa09131143fbfdeb40ab7a444541728449962e5c8322700758c302594482dc1d52232bfaec3bcda26341fbcd8e513d5922b4869f52c638cd4555a4b17a367e2bdfd07ada5ad92e408180c22646df510eb8a888d40221b5accadc54464064c38f22a3e0a2e55ad717ad263947a98c9505ef46655ffd445210481123939b1a5759dce7a7214bfec95c1d205ec6cd943e24c64106a74a4d4dc2017a0d872b5c316160693542fa8945729e31973e39e954833e213d341cdaba31b800a7a01a32d5765331f93a0ffbd8d7f28ed0745bedc1e4d9c257a76a953647a1b3449c63e6270c7ceb9879ca234d5a613cbca8e8d2e5761684e6a2601b0fe2961c7988ba6a926bc4414a333e166bad7c8d6881ac8af1283089b78ccb971b31e10aec9ba4c57602861f01d38ab727720c9d6b146124ca6fba7edc5d409d835e576036646e2ba1c4c9b7faa60d2c59097cc0214130a9667cdbdea3aa96584cf0d485293150281924d4307ffbf46207e32be4bb5771636ce430441a71f9f381729ab9febee4b9889eead1c4ceb4097f5739faec7bfffa7fd8240fb146a8198276de3f0db166fdd999b7a1a9e06bbcb727592b6c13747bd7742a6de97f2ca0b58a3ae998a6eb6c7867cd98fc5f8bee6ebbe1141e5e87594e472babe7594a54841a38612993bf525fc3c64fe9d4a763877db9f6bd76faf00198e33600e581bf6aaaa9ef41deb8057337d479e1394aeee850d4236189b81be47ee625d43eec85556077be5349b41b0b634a6f168f75c405b9b2938188b89b6461466b52546e71fe036233431cd4908bf5c3afe9a21aaf5a31b77d9d4457ce9602022e0baab5d02f78fc91977933200124665806b5b570b29c60007fe781e0dd89ed3ba1e975022a1ec4459f697484dacbf7d470a353ef7fb71f6f25da36ea31ce7526f30b2bc96136620e8ceffea5ff89ee1d1d237ae1744bcfe043e7d44600f501040d44e3a8a15d63a5dbb5ceb74ed98b4715dc33404d73a8d592cf5568ba5460deec3189e7db894e91e04b7da2edfe5c1eee5a726ab0802dac72bc1fcfb2dc0f241b6412cd984eccdb67b6f29a594322f0eb60e8c10437edaac9e0f3d5d7b2e72ee9ae643eb023de7dbfaf8cc73a19ee73306e03f7de82782157e3628f4b351bb9f95b2532c3cfe089c3ab4f47d3ece31ced1e8875401232f828f7e4811f0b90f9d814d7da7ce225821c40566f7fd8c7e2dd8a08d22f187a80ad5f769b77a57c88cebae98adb5d68afe4138c8c531c8f386b73e8af0d643ad74cbdb14148483dc2fd0bab539bdf9bde0f0ade17507913d446b256105b68e906bd30aee8bb87fdd711ecb8d6d7a4d136c306842f5fa9bb11811c6697dbcc07a7d1c471ff38fa288c3d03f0cc3d0814c3e17edf59339bc1d77be0520e47b89e7fbf73abfee39c64b42289a733ffb8e7d74d1b7affc85d7280487bf1c7237abc055a55ea97d63e00084af1ebcf62dc28f41bda1ea34e225edd72b5386dfe37dec4cd8e9035ed23e96e81e773dcbf09be9352e573dc2cdbfb3fc8df956b3376adf1e7cf6ed1c9c8f7f38b73fd1ef07ec64837849fb389e9d05f51efa503b06f1d77119ed551042ef702b3074f257f6cef25e294fb5dbfb295ca0f60f58e3156b59def07883081c9af21e4bb0c1267bc736ec5697ea07a5cadae0aa12ce3948d02fdfa5ec5614cd08e40b0cc75ffda09f4d71f61c757997cef302b5dfdff8e5c4e5056ad187fa2e50742da24918df51c47dd147f3041be88a28920968465d703f496f5fd2e8fa9617a87d643bb17b2662b3cd194562c07d6cb5ee5b8d94d17affcf17b831e78a265510aadfeb79c309c2e29cabf8e2b423b4c553dedec69a4ce9724d1fecd4f52bd6b1b8a09c9d1c9d13848873d13b5cbf4d41a44edb5f9095223f88a85d91fb90cbd5aceb648d52e5da485c2e97a343e272394749b29a246aa5721ff2056eede6af0c71e82651bb22a8082ea98e503d8885b1ba6971b45b06f6a2b58220fe5608718176ea2e59b7556ffd2a3875ae108224ad33597fb2ee408b9593605b817e81b704d1c5b9fd9fde8678baeebb5e3f54ad73d6595fbbc24a7db8406ba7429bd182a7de0500e13507af31bcf6a1eac4025eb27ef6ea08e5f9abd7babeb7c5797d57350f2b5ca065013b59af2cd373564457b8407b6fd876eef173d8766ebbf5d683eeae81ee7e0a3a9b8697acdb34afb4ed81df936ed3c6f13c6dda933e824483ec1ec33471eadc15edaf557b1be236d57bf32f239980fd3a462f8a82a757c1ad03b153074fd68ed8c893648592d4fae9bbc12020b81297982cc911631f47c798c49125ae0c22490f224dd3be0d5daca1e730beb7748d6eeb38ef80ad0a76e8220af837ce5930e24b100cc0b98eca697f204cb7cee6662dba41601f3dc48526846ea21b04e94196b4a457b30cdd9aa4873f106136495b62377fd8ed6fc4913eadedc7c1934beb80115aa310ba46b7765c6842a8bd0c7f2042af660885b3f6e182da6d1afe6a5dba771cc31a563c4bd4545891b28211245d62e18526c694902c8052eb153b2df5d14366ac0b8f1a28e906513162d04982042caa7ad940c1cf5e6494d363cf1b629cf5e3c7e1c29f2856f413c544322fdf063eef1aebca7addd731265a0fe5b19b2c8fdd8670f090a5a53292ba4e54f6cafab05ab6ca5a592c23c79569c033f43c96389e5b13aae720a82384a036e10a1cf2ec2a0c79cee02bfa21af43645d1a72d2adf9dbf508ad19a2f5b4e691878eb37f9ed65aec167581fdd34d9301a78f38cf3eb2b4b294ef9157164de5f29c3ad79e7d7cb63777e93c67adcf2efe72f69de921f412ecdcd54c14fdf410cd2e6432e0fe910aec8bee82fca1ab40777d74c1e90ee2f4d1854c0f2042abb3e8b2ebb481974754d7ec9edda5146ed38966e7991e4018b908fba287680976ee6a96a97ed7640088d34558105984fd3cd5ab37bc1e5a0565ab9c857d43e8063aba472b7571465accd848e7440f2fd9cd729772d69b6e7ff66ae867ad7eb64a2a8721e3d84eeb4359eb3a451539f2ecf9ea36ada0c8b3cfb367acece3e62c8d0797ffe81764030fadd76fd10bcf67ff2311ca6d32720ffe3e2ff29d3fc446e8f6a1655176fb2e38720ca2d767d12bcb995a9bf8265585a5d5255686b686e7366df08b2a121eb908e5361d791e73b2f5a1273dc0fa11bad14f72a29f351f2076ed5e48641e411939d1ef3e2ec480d61ac24ef2a11a7c5288123dc07ed10936c9934e10bb2ef002b31fa12294d766e9e4dc22d767234ff29c846ea29ffd2a46b4deba752f32ac289c75cc0916ae2432e17cb76ec9f29a48a80a8cfce8571f774ba10d5e9b1e327c88aa20c38737c7cb7d363de8741ffa9115323d9caf02dbf6a10a6cda877ecb23c7e16c15ba98877fa21ffdb60df447811e67322074eb3df304ebf68910f0a2e921011fa22a48c0874615db9b7346280beebb20fcd07d4515842128f645ae2b7689503ae0a11fcf7bd96de966b4eb9a4591769e5f7fe8b63aa9c0c443b3550ecfb96bda68a27002aee246cb0af9cf05f6857cd72cd9b4519fbdcc56db47fe5620feae6949bfb39508fbd855c04eb5eeb10229645f8003c69a5c89e8f6b9fe8cee31e93669f492781b143cbaae03579576a6faec56c58db224d43edbae7043c067c75dd8ca2a3bb6c2f82cbbcf775a8d699ff39a0fb7297dce39dfdc9db39ea823dc6f40fd7a8122f26b6d9a2a6073d46efe46fcf813a19fa7bd03c63efef0afecf5b0597ae98ec97e6ef5a6e370bbd29a38748fa86f9a50a6f378bd1e8fd7e3f5ca299cad66af347fa38fa33d4dc7e6689a8e7d1cdd344bd3f4f1d7018b5f96d8fc8ddefb998e7fa5e74c289c9f2694e949d7c976e5f19e39cfa47f1e79bffa463d2f6f93d1af3c6baf01f5b7fd8d18788ec1eb6dc2e03b5b01e0bcf76a74dba49f908902eef1cef490c193b4e7aa19365bdd26eda39f26d408a51d5be10d5eb153081e00c7e1306ae4bddf3ebf378e98410d7a3cecbc9e77c03da31f8823afc1e3dfc6dfdb008f6ed473a391b78191f7bcc3cd332c093c1fb11ba1fbfe913bbaef2365ab1fb1637474de0f87e478c41863243f728cf1038ed03c03ddf691907c44918e9c87ad7e1b5cc307de8183f000ec23ba4dc03efa38f2eeaec7d9731fcf33fcb6fd0c7e9a1edc479df31c5b7db06109dd23eef9120ff772a607ec207aee26e6f5b0f3963af0aaa187fe4a32a423a47144fa8d23ca1b31835e6fd3e047efa19f7df07e208cbc063ffe3646c2bffca3cf799eab2c09d87968bdc07cf5dbd74332726cd4eba13b5bbdcf45dc1f7b2e22f7408c6ee43df7f57a758ffbfc5ecf6bed8df8971fe937fee8474628f65c6543f0f9063f0cde0167c8f0ab99ea027d59d8e99ea11a5c890320081e02ba814beece1482332d8580bae37299f38d47e3b845e43d6a404160c7e0a36f9fe3f0354fc0bee448ee4beef37b869d02806e2008e80602d1ed02f00ed0ed730de83e7f67034037a0fb1400fa01ba7da3fbbc5e0048e1a5eca71ffd34387009ddf53845e8fff916a15f83fb1c8397a6879f83d0d0c1cfb19406bf4074dfb4f7b907529ffd6669f0fc43770718343807374b832ba1fbd430bacf51748f189c34a13058e9f75ff80e83c76775ba5678293765f0d1736d42f2d1c7dac4f3d1cbdad4f3d1b1f9000cfe4345689cdfb5f67dd95efb79b5dfb4db74e4daf30c4b827d9da992323892f35c7b799b7a6ef53eeb7681d9917ef6edd7fbdd282ba111dd00b5f2652bec3eb7261492e3b009d543914aa8df730ff57b68cf473cfe6dbbfd47effdf6e83e0c5e4d0fe388e7fd44e8c780e6193604ed48bf24ed86f3380a59dcd1d1cffed9d95991d148ea67e4da3cc2a3916fdf399a0ca823d4115acf337ce2d1b72fc86440cf7b46bb1ea7918f6e64e4d884321abda8c85754847944bffa45443efe46af260f87ebf9f8c3defb59291bc2e8bcdfb6cfeb8047eff1ea8f3f3b7581a30ac4ef79873bfe78aefb5953e7433f9c8ff57ba66bb79be5d9753f0ff54dcfe54c34ffec39baedf2ec75c4683ea3ceb12eb2dfb6eb3f53817007800467a77c5cd2444187e672be2ba52c09e2e9e358da15763451c0fd88da15d6c3e838c785e3cf97e4617883bc03d69df9b76df9db76eab593a5c6fd4adc18c239493b359a764550d00a4b820ef271f4a0a01f7f2baa5d1164a7743664637754fa6ca94af70e0ed7ba34fe458364116aca849dbcd6b3baaf7aad3ee26bbde0a8f451f1bd245cbd4343c01061f25a435f0d43b7e16fc45e2ba971e83e4fdf6bacbdfc85bac3efea2234fe813d7b918b9e67cf67559c166d0c3155dada75f16a6c75c35ce27cbd70882d569bdbc5aef396cdba47d5c7b4120a0e67af9c15b556041cce9eb5ea2ad649268a3e1fddc8878ec8f187334d27d239e9b95f09e209b89c99337366cecc9939df4c6f229d4ee6481fd19ddb25fce8bb8427bd7e093fbae9a7ebf187dbf978929ef36003bdce738efbeda7713c4f9fcf1d08dc4c8f433a5106d840af43733e7ace47c799befbed93e73a9e93264e67e67e3af2b77339d4b15713059e9b28089eeb5010441ee269e7d0104fcf23f2ea472691896e231c0e2744e2469ce7489ccfe7f3e14e321c4e1475e66f3fbd89f3221f729eef92908c8a86784c8ff3dd5191e9443d21740399def4d3740cbf8a974cef80cd5fe9b8df0ee13a6b7ac0e17e3ac738d7a1fbe971380694be9f9e9e44c5b33e95f084744f179603a57bb107aee401762560078efd76e01c748042070e020804ba5b57f2db842dd002af2f2bfdc23556c9e93b496943d299f437a876c6346a7971622f3fd7114c8de4fc913eaf23d4af18c5be24df0827b69824456cfd0e51cbfe5eef707b75047d75188661188661188661182269cb7c3208b9eb3cb7b401060dbd2134c92883cf0320071d201d01e0039d4ea7f38048c8d10c453ccfe1aed0efe7e1cf7f3f1c6e8d340ab2c1b392e3366ce86de8252979909434d4234b0cbda124231f11af4857ee300801a08a8a6a0ce22d4d494905913de0506f2d5bad65ab35af21363c3a68d536d4cb601df48e8e90928c8a7c1e4439392803c007bf9c86977845bbcc2b4a32f2111579e0e1909292cf9741e957539f51521286a45e6f28e997adae7ce42d0e784543bdde063d5f0fcd5657594968c61aeaf5867679e86883d206a5215f068be706494a1f804919134623015aa44099296c9004e1d265c3e973105d0c4a68057b04b5ac5843c017fcc1ef0d5e5c0210f362f3e5f5d81d08e6c2633f00d308213ba2d0f1e3676aac4a93921c1e2278d648c5e1fa33b6e7be2d7b494a53fe3871387b8be4048cc59a356dc4d072018e00f199996dd163824d15aa50cf195299df1b7cbf458072c64c9427525c906264ca8ac76253d83c76129ed01778183df631e7a61132fa24cf67cf190a94cf6e007c44cce3de63fb6442e1289f9f3ebb9309955b0023460d1992363618188bf018c9d66319cc00f4c7ce16ac144b9a4c244ed83cd9faec057821cd2ee7ec22d80dc6fc4e7aacd47526a6c911b1265ac49c0079ec04d0220745b60c890308aa5cd0c0964c8559a2e6b1d892384c9c74cd78ec02d062082d2e3af070a91183c68929180c9a20c09610a4c72ef6a4304bf185878a142976155cc4ba409ba57d8b58a20f310b8b4ce5e7de67aeb0cf643e2bc1f159c9da670fc197d5c20a1b606a94b455b148f7f939a70583411469ce79009f91d4f89c7dc44e950d969a3234e83c01a39166574144c52c114b53e500e4335e35f3361e7b792cf602db633fc51ebb4f2c8998c7625c5c8f1d04262cf18a7de8357822dd97eb4e5daa0ffd5ae1f8d0f7bd12c0efbb55274896a2ce1fad2662d27db1a050c4e872d666260348ba6fd6db75ba5959511f5ab3b3b4db54ab448921feb66a4cbfad5b054425040f0d2fb02bb574db35177de29009c923478b59ba6d9bd875ba54593eb4571f627de836abeac36db542f86dbd5a90a2ccca9a34335751d26db72010e88a13216e4ea896a4db767de876ea3a895877c97a18d6b50f9d05b10f1f0dbdeeea66832f52a1398954c1bb81692c0cd58701f81b418e94c832c2e50a8e140573f088a9a0c3a58c917457b20fa93e04418a1c1d64d6d8303b5395863a72d0302b73064c983be216def235cbef241c16e531f6f174f3584cc9e331128f7d0350dcba6f7f8fbfc5adb78ffd837bb5ae532ebb5961578ff37c9b7e8f73008c4ace3a36e5e3abca07f3f224e94b2614799e8f1bab13ced3e69562079e3e44adb7fe45e745d13d30a130e91de4aa2b5e8d3d005e3b07232edfbe98ab1330180c96f00a06d336a5320a8bc12f182fc267d7604251519d5917b982bcdebaa571eeec96464651728b44dab3eb1e8a644216f27c968e512413463c896e23f7f98817c56c4592a4b52f66a9cfbf6df4f3fd3626222222ca4137a2b6a222f739aea8a868cde7f3a5bdfda2b3a2ac8ce5d5b5f5360bcbeaadfddece798edbed76988ac7e36129decffe0e07f1924e57f642b91c26fb13a7d3e9d676bb9d7ddd195eb2b9329d8eecbdf092cde5ba743addddd2d92cf367bf2449d20d87c3dd36dccf3ea9b5ce64a2287a619cbbde660d1a3c6b40f3165eb2d65a6badb5d65a6badb5d65a6badb5b66dcdab6b2b2bc4faddb22076ba5416850f386672d811c2064fbacf0f379cd82d7d0164e2edad8b44551a8ee0d66b4d860a78c1538649956020b70fa4e4aa48545941a58cda911b1b787d61184b704df9ac4d12fa33318fddebc863473a45ec60b14566c78b282b0014013494e4adcf121245c49c00b2f6c8840aa79c78ec19bb5107a6b86041812505933a4b47e2088db881040e1a2862c2b029abd68ee0b352b6c03cf622ec1b62c5448a1332359850a59b69458a31c60ff472f3d8177062b11e41a014a96233c32a15319109858738a8665d0c50c3fce6f0e57715f30abd899f0fad883979f3f5240a14171f3a53fd8252250a8e0fbd84db54bfa2b47de8bd30ae39e416af8916219c444d8d89b13f6448f0492bf0e13ad5b660309822c5187bf0f8c6630f5c4093c40818301a6129761534de9950b8acf2bb27c2ef24252cbf377c02be623df0431fbf98f85e7ce85ebfbac23efc6ae2e2433f9fa86c6121260e11234f8e7450654758a8011d6fd02c6163e2ec850d5dd43aebef5ca65ba2c6e1b1e7b2921132f2431f8590253d76537fb1b8127ee863135a2e4101f6d8711fe012a788d5d412185d1c80b930ebd8892b397760606db9497359999d3ab788f5d645acdb54b3d975caa975324809132e8f7dcc4c82e4d042c3c58a2d1a55fa32738e68b1a3ccd711b0207fb0a442b48b4a6074f0d8c3246fe7d763cfd8751eb162ca8a17c07899ba0147c3912cb8203f6036d0cacabcb5b041b20d73d91a970ef4b1673497f1a01859e3552615b596ee3397f96e138a444aee1150860697af1758ac8849c36c95abaed58f3397bdf59b55075bddac32104869b99511f1a15527ddbe0f7d4cc9d3c3c717ae3b6be966fa30f40f578512b0d3cdc24b36f4d16fd3ef437fba4dde54c3bebcc40ffdc44e239294e1a366224d0db13069e840ec54e56489b9e5a0625323270dd11da2aebd46af15158fb3febe546fdd4a39772ed354b9aca6da6a4c7bbb7359761b11dc5aeaad67bf5fbf9230f9111ebb1dff525d2b5ef0452ff4e61e5b557eb0bea2229a6a5089718971e598d48cb2b4d6dad22cc199614c8a05c6189b39a23cb9526bad73baa2af6329cee84a511445dda9e1eb9858d459060505059d3bd26c57e27038dc4e682cc516a1d2344d53882774a5d3e974bcded81d25bd72b7dbed7a4343258fc7e30d11eda210954343434344451b8ca5e02a2af16f2c45d6109eb22c6d8976c0f6572fb0032ecbdcb6425ecd9bf39c5b7b736e73e8bd1f726599f3dcafbc1fca0fb7496885dba9db74a184847ed7da123d871c57e4e4cff4dcaffc90cb7dc8e53ee4721f72b90fb99cf55cfd1ccf759ecbf90ef21ce9b8e7391ffad5bb943bddf4ec22f06ee739b7bf5d8f934445605cbad06fd7e3c4a8089e890af9353d80b09e3fa320c82d023fe9a546857c07a14265894341909e4dd09f753b54c4fd93b42599cb79872b7aee774f5c16fd7a6efe48d2715efe4674975f964e3a4e9745bf21377f380ff2de6fc8c91faee71d30ce962351e9232a877e3d94a8fc918e1b7fbbfc7169f471c4b9a0fa79443fdc1ae41142d74411a2a0c5bc24a2067684beb60d03d66dba150d4f4dad90fab0624ab45909f647f7bdf78ad5436c842dc638dd184e7b55f2b7e8b6d8b3938ff69592bcda104ef489e936d5b13b697fed73e8f91d524338f7f917b899fe77ff3a79faf8ab9c51b39ff457c90a517bbbf6a9e79cb5ce39db2d02ca866198fdfa0c1b4276eda1b6992acfb021d8d02ae7eb575be1aa52bd7e879c1c5011ee6f111e7b18e8faf50a81db1c5e3b4edb0ac459eb20a208227eeb3eebd5fa785d8856bdb31c3d144774dc2138bcf59aa3706358c7ab71ded86d2eb3a875e26d436bcbebdb8656db50cd6dca5aac35bb1643d18a35ceeb35a93a70c3f856a33a0c3d6b1743adb3769b5bd8bfb7de025410aa68758a2f603c09f9b0e2c2d3dde58f5ead88e3dc4fd79b724157e709f696b9e73ec79fe449191cc98f3608728c1dc3d32d3d93bf2de24912452af28c6e24144cc74845a80926ae2f82748b51289d746ca24845a809255a2fd0b10ffd36e9b80c5e66708c6ad7951802f633ecec25baeb71663483631444062f5110181c87281fa321cacfa03138ce3738c218924ec7e8463a3a3a89888c888888b26b91c8713622f2d34522c79944f749847d7e5efcf3e121dc79623f5d3bcf034fbc3a83dc7ad0108821ef05792fe847061579bd4eee16d5446e7f3b277f2ec8d97be81ef24ca29073e9fa87cb2b447ab668798144260c79906f8d8628b14fc4a9fb3d71185b783c83c7fd9eb4ef270ed871ce6e71e933f8ecf6b3eefdf8c481749ce3706305ea728b789c2b30a9a966122aa856a01e7346f30657c80bae329db58a09285fab98d0fa9de1af07e06b95126f9fc2189ca9c71e54bdee20cf4e7a364fc08ef32027c59afa6e53900739b6a6884d13460731ba2fe85660fe5d0314b20bee8fc1e00a448c2fc2f7f9af079980470f5ac1e8bb4df8835480df97b3170a3c5fbd5204ff7aef36218da80aec675f81fdecd6af18fe76ef6f95126db54a89b62f7fa7ef3661cd0387838256aa5a2cfece639c245097b0ef085410b0e314e7bd6ce778666721e7b68c339aab1313d6ce849d8a708e00d66851f60a420e723fffac8f0bc46eb1826c103b0bd85b08973ef80eb8409c2863fc5acdac082ac4aa73db2c5f7d04b6b64fc562d5abf40f87b3dadc22ac8902ee73a6872191aade341c0357dd260d652b8efc0d79e5ed74a4cdf9a669cf2046afc1eb5ab375b23a89567de4360805d26a27d17d7f0c725cb5d368ce223ca320827c74ed1b671f30a23886ff82b093973e236bddda5c49f2c87126abceeea7506fd743d77d84e65cb353f5f9d012d5e866419058d018a4ad57eb155baf184b93b5bad6da33b6c295d4b8ea37cea3a3415e490dc2fa9057d7f8a2b806913ff4c354d6c390938e7fd68b7e3827c2f5ef0ed5e5b4d63a97f39caeaec7205c514c7ae8daab7bcdb9cea148a357c7eef87fd5b7088dbb6a57ad3a8820b4f4d144a1d438c64d137155a87f84c1870fd04ea2db6e1137fcdf2ebfbe46710c1b02f65fbec00bb4daaf5a8cfccb46c19b86ab700c4c657115ae3ae34a492f8a7a1c45d15378d143d75a24937c650aaf3d544a21845215a533c8cfa08a4343bc1874b5079244491f77880f4fa25bf48ac34eea32df2514ea050679c0998043eb0506a13bc46b1fd1103df262193d250ebac3adc0aff75e7d5da3bae633eb7befd5f796f7a2d95625cb8613c14bad749b7210d2ad6f60ba4da25b17e1368d1e846e6052128348f952f63bea270e6f312eabf6db018b79bd7dba40eb590c51df4975da7bba120ec333d4ae3d141d9b235a6f93885aa60dd8baee83ab1638ab9819b3bf626ca6303640cf7746e0432d3b87723ab17ce11cf1a20398b0d313c66887055ca79a8ea1fe2d8337b5fed147fc8896da9a285278fec2dcaff4a19fa93f88cfb359011fae158d00c636341d77e4d95bc04e461e348aa4e70ae4567872eef371cead57bfc0ec2390b48f788d6efb4917987da80a78292399a0d18d379c3ea402f6d3419cbec26d3ad1adfff49c7fb743f7e943a80ae76f8525a7fed3774d7b10272a823a427d15d29c874c38fd443a2107837ffa8982d0a1417c9e83c1afdfe1aa30846a748fe767df862272e6d09a669aa8f561758158176845c4eb09a920821542bcde1511f17a426775ddcf7aee577de867437f252c60a7112fd04ae0705383c98f3a69f616b0d388226754568c913336e4857484101769a89ad4e013a7abbea9c1044dccd40e3d68d2dcc37faa30e4b45aa8f511afd1febade7a4d97dda69c9399f8ad75d45fd72efcfcfd9ddffe7a0e4695f89dad48dce0ef4cf637a365b59bd91ae0834c1d296663b2b44877963a61461c3975d68c6c7193ee4cf5b7850c265f5ad680c94a77c67a00121c4d925ca1b3e52bdd99cf0c347578e4604353266d2236c643ea4c9fb67467af02e002047afc8403fdc6565bb80ce3341998cd09861b1d7a6cb4017a926eec258c1937aa1666586fd28da938a821fce120d0dffb3614e8ef90fdf3d7eb0d4601c2f9bd6a37e8fa35bbe9be6831188b1104e4c4499ca9745f29286bce4ccc9182254a94745faa6ddf3ed05fa7412541d710fefc50f34a73a34a5b9af44f1a133b524a042a03946e4bf537459a406d48f6f43132b5838d4acc890d3168523e56fed85082a3cc2a8d6187870c2e466ecc48b7f57a9bf6d5cb9661a73165db76edcf6f4bf6f6d5cfb5c1d16d067584dae72f9fbf6ed75310c10a21b8a6a48842e396e64b9bf4e2080232a1f545cb8f3fe93e475051f1ca91444a0a8c3c2568b2f683c48b2b2b40d20d7cbb41428a969c36676ae93531270ccb4896609054a4e29d5a4c9b5a03c27a7d6aad79680574a959b0f35a6badc7bea479bde7855cbbd20626fc04f65aa7b590152b9a94989366cf8e5463275339a8946449f2a63516a0e09fa7df2026d479f6c83ffd0231a14eacf34f971f269489659e58a65f1f5f7f667cb9e14bbf3d4ca8b234cbbef4cb23bfa5791ecfef8e51c82fd6395e1d26944e33b5005e2751f35afb789e660e134abf6d090047edf2670a171e3ad08ee430f57cb53983f2f02052c30495183ef5bc32fdde30a14c3f60cad8d024bcc046e2c9912f6e7ed2cdf4681eb028b831696629c41cc91383469a639cf5ebade1a70599d555c3e44917133c5b6d785e0c6960058f2547ae0069e1828609a5ef8c3e56c46494024062793ca1aaec021f3131cc8618618b83e7853507e0087bc1c504460eaf7433fd1d3b7a46049cc101870d6d8b96914aa70c8a1940487c79a22485a1a9f8007951d3c04062040d9b372ebe8c684245e448599f324cfed469fb6a223efdb85a810547ea87971678f132b36709121d601cc733793c211726943efdb6b05f7ca2be2cfd4e9950258f2734c246202f374ef0e9f27625ddbed7595858c13d3684044937d3eb52fb88e9bc9ef3dacbce6b7d020d880e315c7c584049b51128618088a095f82195f2dce4fdae158f27c4e2f4bbc2843adddc60f8d2af0a13aae4f178425ab07831f3650a10979cad136308caf494399265c80b6952d66d0795147584893c3b5204a92187ce1db6608a17b0401367cc559a3f43d2138555938013a7d6fafcd50b2441191c5d3266b0914124dde7c7798d64c86b1d34d10747558d2c586954def3f5a689f23c81933081b4b6dc029d99705e27697badc1ae308181a24b992f244ae739aee495e5a96f89bcf6a6e99784096596a769d4c3cd57203e69f49cd16f8c78a9801d37305f55a06ce949b5ab70f2b419b45f7aa47c19681483d8e9067b26c6f75a99b957170b636ccdd2ac8a7e5b35db86d71e638c31c6189769f198c41863ec4cf869cae680629ce3f1f918638cf156cf3493def47ae44dcfb7a9006f9a66d4de3ce3e44db7804c28d3ec9152d4c0494dd3ed1f13ca44eb796e95bd2f93beb4f3a5e7b24493f2a519aa2fddbe7969a276c6b454a565e9d6cf79afcad07821cf426efb9850427c4ca852d422d3e5cfd3addb589afea5db3d2654596ad167faccc86bfd7566e66bcc902f3225f4681d4894e439a3ca20aff7bca4e77997e779e6f9c8f39307068febb20e8f386c77ec9850f8064df40b8db5362c66ea50f1d67c985b6888f8e1d146074f5a699698adce5718201fb4995f50b4b4f5a0ea728405cfcd0d9188461e22756cf00143c444af158adbe4ca734b6797605abcf60ce6cc9cb30d3b8954546d3c9224494db2c0f624499224e915b84e378b24497f42e1e3490e4fd6b224d2ab9fc73de9be4a92a4885586a140f23c129ee7568e09c5c3e29528cf2d9b09c5c3c24bd677ef040a306127cac4d13c748b599ac509ac546bb770f42f49c97f6f30616562cee32f3132a25e449579b376ba31a1c8aaa6c55b9726617234b1ea6105e9fc69b1840820b20d1b3539412fe409a20129e284075b0c6854cd590164cc8d3069d986cd2d71e7b576ab6642e99d33ed76bb33bfdbed763bcf66190dec0bd7e335230633e4b15b35699ed2b4e855743b258a6a9b052d2faa894277dc6081d243abc71fd14c0f293a4f6a6869bb12b144af80288a54a228fa939d174551f4da358ad9ec280900bf95cafa8c575efbd945edb5971e6940b2735faa6b756750e402768e922b33d0e01c28a135b040ec0409a634a8011ac46871aa82a906d7809e369779edc8de935ea59ef44c867141f3645912343ebd3ba3453159c8b868a1a145ce163133409d8341b43226949885c14e9c1f314ce410e2c7d75860a181e6e54c59ba997e8d1ab5355dbda0b458c143c61e143a7080c694fd78e1c6cc0b9224438e09cb02e4c5b33446b2b4de89c1b227cc6ec491a9255fe0ccc0fa5233a18f9415585b7ea805d2629ab435650926795c088bd2414246599db4afae2d3bbcbc48f1aec85bcf696d6eb7a98a6ec1d8302c62043023237bbb2536447ec912058297a328384858e1f1c46a0f89868ece0031dcf8d0e1c2923a2ad22eb6cc8422b16479e2a269b49052e6080b175d803196bccdc193230a18f28c19265d5280ac904013c30d171a00008d2943c38e16253d76bb2da4df3ac2d582b150bd28bacd6242895a4b4f0e352966f090c091ee13edc88c0a684cce9e207b581c29b323b19850f8ca1b0faee85d599fb128556b5ef449f7f9658c2419723a7371644e11ad33765251b482d6b302e3b567ed56e0bcf6f30a15329f5844832b4b0adb961245d2cd44464f6f0494154ada9a88dd0973a38aa22856a14246f5dab3f6918c6dec1445af33542cac0a9717bfc0c81146c09a5099da320205ca6e8c1ad759ebf4c1230626c575254beb135fb78a0b1cbc34b9abbb1fba75a31c631ba9884d39f50e05e341922449e6dc24258751ce92921c69793df6e3b55b284ef21a4016a68a5699227596a49b89dc799da1b130060c971ab1acaa21a2c843f7dd7ab273eb442cc7934fba6d32ee489de445897722d9357a85bdbd6662bbac4ee71b74ce84751e68c8eb5ea7d3e9c47469faadf4d6e74f16403d00e159a245255c26944e4722004c6ba77592174c2832eccdca8b4894a8c869adf596e5537664c8469ca8302d8ae00194ee53cc0b805a084205c9922d6426c46023a39f3123bbaf2f122759e46af9997a9188a67306870d2349f2e498c3f4ba301ca889f5fa5ca17571e356a4068a143b506bad774348204b08b96642c8228089281640ce84701902c6089a0da8191132a64f90283ca9d6ba206518b13dc1b03d62dc88f021c1474c9f1b40982ad89baaa92b79b47c54e9ad31af756e2a4a952b7e5cf0484bb516c9b0db547f27296df8cd21ec4e189e1b6178f684e5e932e3b11e3a8fddfec8d29511130b226408db8d385f8efc199b9acce9e2674e9a254faace87ede04753989b323db4d65a6bad7998503ae9b7129b151cb039d28645581b353bac744875a864040983c4cd8517232e7080ac8f0917e2e0809122c55887357260c2bfae7ae810b586d8c82aa386ce903b5d8ae0c08dc8410608d513b03b28508839be6eace1902ac08b2f4e5c5839f2862add3ea65af6fb0234d63547eac8c1924605108c143b90747bc585eb45b01bba8e5802e7889c31664eacb9906ea6d771014331d63872cca409b3ea91c54dba4347b0616b807169e181d50766f274052a62c7cb992d485208c54008db550fac29ad1e3a4dc384d25cb818fd56d2b2c4b584d9f2036c0b9e19a2a873818c1c33bac2aa90e4d1a20527ed8f131947cab2b8a2e864e4a72c47b800aa3ab506770d3f9d161e531445d1da115cb04b58bab6644111e3d4e20b764a1d0c302c3636a0d227a8a89c5ca1d2daca622407994785169f3467a24c9511f10bb02b7e32b8684157648d8975b6c559b642490056ac9912759a6bc90e5b89a28e45efb50a27af3778adfd5ce113c51dd6a15f55763bab42e756ca8aa9a8f1a2e836c5962b5a7baeac2c39b3d2daa7cd5eeb255bf264e5b0e2a42d2ad59a14751a45cf0c300510325241a92aa93a40314ca3840c1e1e7bdcbae82b49a6602d575667aed49809ea441b258642cd6b31133f15f50245b3b230255d46afdd96f8809d442cac9c336119692e07f639cfb7c9f739f7e58ce480010606869832690e4b1118594ab490d326cd6638b303fc56da5075a786a1df55ade2a96f51db56591f39cac2e80022a60309d6092cb01d32d888edc01315448c0794a0580f2427c47ca089fde07aec96840985b1b6234ca8dc903375cab0a0b3074e16d9568b8ab6e74f951b5913144a48b2064548ec344983a058ced966a97dced94ee5bc5920f1199773aec065c24f4b3e73a865496833843ebb2fe79ccd321a9ca9273d933e03138a2473a4cb208b54970bec8d14d163205289a2c3208b4e0ff65afb18e8b5b7a007f0da5f9045ac5e180dbf373c07362fcad8a079ecbe364a1ebbb7780ce666cd63b035148fdd052614d6d9f102d3021126540e8a2da48d69f1a304cf192b59570123a6c04e172b24435014e19362748720d16da9488c45169850e20a4c282de7737615985019fb6123e74a0dd5179917914a99061115488d1b2e30dc9891280ba2a7c08412bd20bd7614581d664b199ab72651d87c4937d38f81918d3f182748b4a9d922064e9a73ce270801a626e4b5761019d7b0a01b98979e3d7cd0a49b09638cb13fe1b3c7fa31e6baba21c40d4d1d1d6eb96d022b2f7c065b93f6d957c8598f17167168402912634eba99acd29c73ce619f73ce27a4a4201b02a44d589434a33974dfadfac4e467cd5e02132a934e02db7bacb4c1a2f82d02878a7f5733b4c76c8f2b9e0dbfebdb638cb7adb2578fad8fba2d17143379c6d3e740a63e8ffda9430911484bf1d83fa8c0e4b1afc0c2d7636fe1cc966016a9209589c76eadb0d2de64a589b2d5759b2a981a358f7d045e1a89da993389eebb258224af3d6b0f41ae7efc94f50023e52cc51bb017649832b8da1263c896176dd468b48200cc4c8bcfd93ff09445e86143cfd58e2839dc52fc5f4562e04e25609e78454985d1532f10ab3d7615b28895749d72996fc03913c679e5f1b8c7e170d9accccb59521b0d2ac268a0855985d540f1d83dc0e41480b6147b0738f0849d2e1599644790fe5dab0ba4d29a4c014cd28aa630195e6133647cf60d903a071b953f2a5e4c49b950bdb87ce00d683662e420b2e6cd8f146312bd56e8f8566b20ac4a4d064ca8ecc34e2296c5184996c7187f10c3d2e573961b9f1d03be179e185df113e602e70886a8d971a2238c0b6309d89273b4801964578660b153c44425b3a247cc152d9fdd0248f0fc2ac0e1774996e6b3e76cc5c967a7c039622b8b161c66666e55fc2080ab4a51d592e78b0c1c5fe484c9b2f83cb18f1338c9b20cf0d9259064c850d6bd11a88286c208023668c0dcb8b81a1373002db49c01d0ac21028645064b100255907cf0001fda973624c054bc7d39e160a44e4f843752625ced414b5124c538eb5e0754915a3ae1cb6c009534a00945b24a20e1776f6c00547e7c760f3e9183972a1f3c9c2041a3858a04ae33a7549a17b724686cbc60e766518954a2881970b7c6767cf602457e20e48b0b26c4ec08f3123542913610f0b0c2f5250f1a2d6c528cc91393be7d38d175b92c87ee1187ee935c402ebb674961770ef0d9c7536cebb3fbc6547c7605b81673912d1b2ea694e5186300b75d99c4c6db9e321a675b699890c7571efb78fa1cf84c28d02983450ac8991c5e4f49b210d5400d172737f46c1dd1ea6042e55e5569bb18560192c48d123956acd0d9c213f4c4e84afd4236268d8e94337ab4d2b0cc68d9ab6724d28065a5e913d55605898fc778ec2ceb31efb195c7580817173379dc54809548319ad1de751a7bbd9fef2e5927fa3a7616e3770fa3192155e72d0999163ec4bc4056f4b6e5c5901e6059c0a6acf931b3e306d71a5b05881340593aaccca090fa1143cf98303133e9f6edb0f27a87161d1528553548ace0f2478815d2d72a51263efc5a654798125cad4d39e34bc2bd27d80761d1bc02fbd6566b7d67d7f9376e382fd635d75ad16cadd75bbf75ac54af2518bbd3e5f3d7b13b6b62d6e1e8e2584dd1da36bf1144851b33f311da04544942e5b1678cfd0b9f3fbf8e7d792386bb3514cfbdb1678c81a3bbd63a0cc333c478c44b392807a175092ee86549204ffc534540d6e56daa4df902ad36b1df7b315aed8c6a86b50e3467c5163f365e88a9b204c9d80949c0dab0b15ab3baa1fb4a2550a0dff9bc59a36f0e5fcfbe7e7eca69d5da479dd1f302c35faf090e8b05698da24ff45ec55e5b82415aa3755c68b95e7b1eb597b7497f4eb5339d3ad4b9ca985ad46ee0e3ad2b746b473d7fbdbb64bdfc3a26e6cce3be7e6dc118c1ea5a105b901742d4b530e3938fee4fa3bb579acf9f7c1c9d2c6df4349f8f3e7ad9d3e86bc37a7a7a7a7a1af398c7343b5a3bdad1da318f76b476b476b4a31df398473bfae967069e6ec733fb4ea62c7bc7313f017d199875476b473b629b7df7bc773cb3753b8ec0fc74da71ccf68e99c99781be6c476b3330dbeccb3e9b8139cb3e9d633eb34d1bb3b55ed6eb1ccf31333df9385adf799ee3e8cbbeeceed632019fb2b53e0bcc4cd6979980379765e369732d1b9ff238663bdaffe08b272a09b9ac8660bd7a49f1d5667d758b05682d45141b2d3abcd26dbdbebe2d11f2e62b50922f2b73dc70a999132505ad3a0b125d76cc68c1a32dddb64cecb74d0bab5eb71476ea20f6c5cb8c9139744aa495c49b5b1d3824b8c0a865c160b04505ab3e56af55ed0d9818655c74793b4b47749d39a951e5a5041a206965aa695a5b5642dc9889494bc04e754d1e2e585a846c013426ad2ce2b0bdf1f8b302cb9d74d7b5bb6448941b1b6edadca4d56d541d21789b50f0f4204cc779f519b4f0f5d5ebab77b053befa59ddae6d05834117aa57ac0f751e7ad9bb4d461ebaefbad7872170c38bb09f3ef40e621f8a55b22cbb9a85aec29e35b68ac706f77c588652760ac9b7adb212f3215198a595e4db72792df9d08a7d68c9b27c88217c31e4435c68d72c1eb70ffd06ff7c78a3867c5fa9a90f7ddf2aab0ffd62d1f8f0fad8374b8beb7a957d2896e543b30fd13eac61765ef8b017de35b60f2f9eebf6a1e3e0181cc5f38da5f0d487b80a5b7de85e40be2cfdee31a14a28419ec7e3f11c58e43c9e3fd9785ec993c2f30f29f02a8fc72392040d47203a3fdaf04a70664b0f332a2f64baf076ef8d58597add227ce95526ca8d2fdd87e24b2974be7460d894245ffad5f3e40b8302e57d3e9fcf6f1e13ca57e475277d9157ab2f0afba2222765bee849952ff28bc7842abad356e7edddfdda31a11cade758a7cd13113d51942772bf4da513b91211913361a216249400910283ab888a94a88e123f5f565ee470c34b7a5edbd9f378bcb640cfab03e5797eeb9465d946e709d06badb52f8d93d744fa430aaeb526aafa699e2e72ed36cb45b5d65a0dd5a3a8df3926148ad6732c2a2a2a2af22bc7842a42ebe969cafef7f3cb6642fdd07a8e44447ee388a569f1ee7ee198505e966559966559967edf9850659ad6fb7c7ed74c281f5acf9169089a1e3968bc419283c7e3f107caf378970a0e1d47e844492992f2fcba31a1786d4c288d26cce7fce4b3bbd206119ed23eefb2139e674f216767a1cee75c565df9104b8bfa6cb52c99cd727346fb3ce5c69833566cbce0080283881b3166b0b0b4d214a4eeac283b13d2e6cb00f498d0d2f27102ca5bbaab57ce44444444447ed9985044683d7dcc0bd79765a9c6e3f1783c1e8fc7e3f95d6342f1bcf053d9ebd7eed368bebcf651fb556342e934663e4306bf696356d90f0d0d0d0d0d0d0df990676131a1f192e3b367df78c68c093584d6f3e9eb05d56fb0815f34136a03b49ea38ba8dfed76eeb789e73b57ca3b7ffaf3bb5d93ddce53b8bbdd6eb763c99a0b291d5c6af0ecbc62270e02b920cb6143ad86989dd3ef9e0bac0e5c5079edb74cf9e5a2c69765e963e9970c986e431561cac5e7ece397cf7ecaf8ec3ef7f1d9812dcac63c852183840d11b33651b27c4dadc85d239cd8b121762648c78c8d333126d40ec763c0e0378c0985e10b878beff5dcd7ebb9d2edf57cec9ddff38a76c19850daeccb5395a84ff29ce4d7cb48a5ed857a2fc4e485dc6f937621571212722615a9908fd8690238c674d1222586b6271552c144aa8b98af324037d27dbe90e72ef94bce90ab5898d7511899cf62493e8f457d1e13f3794c0f952a9ffd7631a13299d26baffbe97593d21b26304c68a12993476b035f7b059b23f55a2f0993f27a0c94d729b86c9d506186c89c54fb2d33a13497a71c371ec9f36dba5b46188fb19276f23887b93076154aace3310f27c13ca1b01c538fed0b597a6931e8f8e16304cc98d42b4813b11a5a4c80a4fbac64bd3a765c38abf1830b9755d989a9225559ae64a4db0677385280c501abe1a60c52963b6e2c88904de9c2c1e47b3dbf5a468b24e79ce5aaec8584fc6241024325cbc5151e6d54d27d3ecfc99ec743f2bc2230fcf8d1f1f5244ccaf37b25ec0aebcbd2af952d493764dcd87aed3e40affd92b179bbba4af2c5868d8bb01b53bf0bfaddd6eff660e9f2e39663cd54baf35bc5a99850580e930ff21ce4776c8cf3a4e7234f92e4ce4992cdc9933cd208e91fb0981c203b4b859dc694744be61d37c42881a3058999584a4e915291654995386cd21153fc10e9cada2186e6a74f9aab13612eba7aa4bb9231b16961d3f3d9af1886736729ce551c338ffd869950586bf78d174c0c0ed9ef767ebfc6b71fa79850235acf310c9417995e1445dfc0f4a4e4c50f29b09ddb4adda6aa9d28fa289e22d8ef767ea59850bb166f7e68c4a161852c7fb110f239fc5c040268fe80bdc538f1e32acd7ea388bdb9327ad22f14125c6b5178a66481a5385e78ec59eb7117992e386af8b9d2c6478afd3e115b737badfd3ab94d72b95c999c99cbe5c4e40090f33af539cf391fd9c67cce4f1f8fcfc909f4b939643e979be3e67374a67cae6dc6e7fc769950b93880fe3c4f3f5de93c9d099fe77962339cc3f80c9fe19a652dc696b5b43745c2de4479ec4038301e3bd3930e387b1e87c5e1f2d82f13130a97297d7efabc819f993efb1a89cf39afb9f8ec63f6bb44c9939d3732f2cb6542192d91f23a1d91d7b9ebbeaec85e87d3d9213aff809dc654f7baacfb40cd192f72c86e1c0972825a183f5eba48f0b91aa14a8a091a6225d05ce9e4f859d1040789213e741eb604cbe7ec370956d24549499ec77e5ff021a96d5bf8871d5782fd994e426dfbd9747b86246a8f50104b6444e15143c60b272b7af884c80048113d64f854b9d27124d4ba3383c490b41a6554b0e1b22ea0a544850b3c5a2fc4181193e6458e39468488095ba1850cf2a133853a70b01012a649091f42d2d0bd888fe0173e623fcc66ec910104ca0f112754b4d8a86aa345e4cc4dab48202e31e50fa50c044a5222c81b173229d2d09d489dd36643878a2f26ccf6ac4891f3f1e5c685b0305e0271093224d49b29ff7ed9b3d99e3a49d8c4a1ca9344abd8f3a1ed817e1816c40e922e7ddc3cb99286ee57880915662026b10ecd671768dd447359d6592d8fcfa1dbf7e18ec7a19be9c3196d637aaed078f9f84a3990644a09b32b6b28a6d230501a2d25b468a133d625d5e8f60f65a8a971e18aebca559abf563cf930f49b55769b46114b48c412fa4325d4f657c86d00bf8544aa9d48b513833b31b81bd122089b1d64f80ca9624bb710049c0c412b9312766548ba854a1095870790395bb65e48b79089386361ba6429d1822bdd4215cc94b23e81f62cd9d1966ea1375c677e38311362e44cba8584d0feba90d9dd42424265b74963fd16d2f15b28c76f21abbfbf85a2feba5070f7266e9de2d6d976b6b95d24626ce48051848a9374ef70b0a17892e72c6b2cdd3baa9c0fb022526a6326c8a47b8785c20b202e44facc29ab4af72eabcb485515272ff4c448f7aeeb6fd7151e4129192db2d2bdf3fa1dda5fdf99eddddaefd4fefa0ec7ef1dd9d5efdd8ddf3babdfbba8bfbe0b2efd3e75816e50b7756c7f5d87e7af9fc1a8b7f1fbb4aaf1fbb4fa7d92fdf5f354dbe7dac9f6d74fb313ed0a581b33254a9ce1c327dde70bc07029b3e70b903d52e93e37f8ca62c76dc89a3d4ed27d1eb13a63844ad612376dd27dea39e1c28b1c6d7dd802a5fbec9a009d16806c0c59d3842ddda717f0b7ce4cce4c2e2db7736e696ece5e7023c36a4f8974eb5c50a28c0b687474d8b9926e5d087450f4d1a14248151fe9d6b990472d0f9c1d47cabca45b97f5b7889b32359e4cb1a55bf78615052dad0a188921e9d679e9d45e87f6d775bab2dbb4731abf7564337eeb64fcd659e9a2feba2e8803fd9d7bfbebb96054d5ef9c950bbf73317ee7c8fe7aae2c6776736839b59d5bfbbb737d8e58a909616b934196ee9c14e9640a8a2b30b2604991ee1c9506d85c70c5d8f3c50b9774e7d4861cf9322595254f8a74e768d8f192d6040eda0b70d29deb0243e6c50a204066d84877ce8b8c49c6f4dfe636d9ae8967ac1c2bff909564a5b965c2f86d52fd36b7c8ccb5bf6e9a661a00c8dc30a3a4851a371ae936a5a0c06022c54b541a8b749b30d093c58799193781baa4db247123ca1ab5215c88b848b79995e177f9a6249012dc9f2edcc6b9fdf5b1a6a5cb93155b27d25d4ad50193d2d366861a2ce92ea9fe6e59f3c2ac4c931945d25d0aa08b6bc78c333cdc82e92e655049f111a5ccea899674975d7f85f829a2a2c7141a28e92ebdbe4cfbeb65c956aebdf85d92b9f85db6f85d5afd2da3fe7a19dce037eeedafe38253bf712c7ee356fcc695e1d0706a63bf716b3817584973c585226e5132d28d33c1eb0b0c40447268214b37ee4e178f306041dedcd1926e1cd6df2672687411f2168626ddb8ac1159686626daaedce12a926e1c17b43253522ea280b5a51be7f583fc41fa7e9359e4268351565b2449a66d728d94112423a8e8779055d00e0a46596d0505050581f91db4f63788cd9ea821fc3911e8ef1edfacd4e8f6d7c7a08adfa3d4ef31c5ef711cd3f6b8f6774c23650c1d2625dcde7ca47b94fafb9626450a3e33eeb849f748f5378e891c48b014011296ee114b88c8d6169a1e6360b849f798a5420b35324ac0e4f9f396eef1dae9a2e7049133c137e91e5b20e611b7d8822806a3fe8a277e8b51bf455114d3b6b8f657641343e122108a36527286a45b94fabb25ce9539507ab06549b748a5d4428d1a163ff2b49d48b7b8023564309ec048935a916e514c9d2f657ec480bcf1936eb1eb2f9085c5c7d78a185d71d22d7a8d20fcc326ecfd0e570877e806465b407fd06d3a18651592d5f91daefd0db77eab63192a9790dbfeba41112366c52503ec496aa58d060b3029f00049b7ce0aa9f4a8548b17ea4335c9105444240004008315003028100c870583c1681c675916e70314800e80ac5a66489888d328c7711832081963883144400444004666d3002a723fdeb659db35e7caf883c3ec87641ca47b88737992f84aba08bfa31a496044025c1499bdf1d1eb90f00f4679060583aa92c87016546e452cd0c296b248a51345fcaf807c890e1c28fc9edc7135110e0b5442d2c634cba9177c6642cec9032651007b0c351818c48bbb7c66619f56b8644597435ac0b5093bc5df65720553b17ba4069b682114a19c654ce2c7ff86c0aff52fd2c81ce6f6c9e19f8b90d6f866fb569bdd05f60aebf57633eac03d82903a4d8f9d7e5efbc42f772797480e052ca0383607a3483e3ac7474c57108be490d5a84d16360498c34fd93da0faec94453498e970f725c6aa627dcc39b8d2b3c1635868aa4f68cbdb23051fb2ebca85fb2c079e41209e30ce85022f173b6c4fe83cef66523978fdf46712d1ee11362ca9eb3670149482a77d339efa4623c769983c92f5a2b2ec349a71b9680742995b4db691e2dd0b9c524655b4afbf03e3664aac9541f437582e5d22cd6f5d2eade6a299b2870425545fb93bdfd3c6eb20ac6bee4caf2efd8b4563056b7eeb523b093fffa4a8fcca001175beb74e8bc7bc16498f87460fbc1b3ba87340c70627188a38e046e33d5d0a8d10f0debd0bc0129f56643a9ad07b3526965416da7eb40ac2b354f3680a55b1016928bc11f77050881ac45e90dc71b5f752c322e44f6e94fde13e80aeff5563b9f7ae4e777740a95092c12337f70183fddd44bf141a4d00b3c9886373288eba0a33f00e203e37b2d88fab30a9440386638ec7b3792bd8921c85040d0ecae07453e013fe7e401889d084a5ace5da5c6811d5c918e5254718beee20c96c72944e04220e474354cfdc850fc48bb79989e383b72341ba3296438bff46df9c1dcb8218c53fc8e97b0df892172ef63dc347e019e71601ce5172e78bbd9fd3a335546f44fc0d8980de43a6dd5bc547da297d2e6dcf41beba4842867a95e84b40e2963c85156b05eaa0296344393c4c5c13283c81517ee29c25bf5ecc2faf2d5c33ed1b089239ca6e21c4548876aa4baf3724b61f0bd0a33dd12a341713e03e33b841ea8a35106a6da77821808e1a4da16eca0481e452ff9a6430d14a6bd84f34bcadd0f552f34dafd05e995103f74fd70a9c02e78e6260125fa753857d39095e4838ca8a1832372927bce98d09c7b513e3bee1d6d1914d1ed5fc85b74e8ef36a20008d36bf3c16f58d02e439164f31eb6636f0ba92f25dbf0cee6ff1340c2a4114a330a141c98d1f90388bc59e490bc67a6bb4605192575a1651c6d9d3dd3999ab568cd8df054ed5c9174901bc634c07611c0064f87e8df8e8397c215af3db8483e0201b4d0bf99ea3d6628c886b01ba87c28b9d5538e13e08d3d7572c2d2270a13bcd34c36c3dc0c67e3726696c6ce91ae2a3ac79eefb73df3deffc77d75ff7dcbd792aad2b42531e0bc4b4573557190a4d914d732acbb8e1d488bce4f404a461a020392e8384d24a695dfa558cfd3da7bff8739638abc6bcf4d1ca3968eda2aa694e95b656dada9660aefc36d96bd3bdffa8fcb8f9f4477e6cbb04cebf546e611e70a6ba639c6e731d47bed33a5840d22965852d2e144233415e7f2464bc738e5fee5ddcb7eebbeb9e3ff3d81f00a6d3361887f414ed9dadce268005baac19546c5455059fe752d90dcc3a6241a72c7a34c95b70cdee62d90818aed8e8ff1d73aaa4a4108e9a16cfbd275bc0945a68938edeb71b31558a1bf77529d1c434871c40b1de36631903e648fffe64fdd328766f5821a2a7bfefe8d0c3d46fc23aad98b8a481f64d7190523e28e4313b3b02ed112bed89ff372270838dc184ff509566a20a40a7023911025668725885bccd322926df997a5aad6e44776679c6ddc33e8af3bfde4f23b5c2ba760ace76d5d78c634ebb181d14d942fcc80942456beecc5f99af682487568bee347237f932637f217b880c58d75da46d9196d76e0a8377cc8189e2ed09f07d65c899009d44798d264f903284c59e18fa6190dd8e1c0f9ddae0a311a4fe489db28a2f48e5b69ac77b1fb0e5459796ae505ad2cbbb38d4f0f94f443ff6168bb21ac84bbd533db11f6fd6f0ed413df9a1aaa1febedb2bec9163e3ec4ed1036f47bd9f4a610f7a0c17d6b582e8a83b335e35a7ab4042513b0a1853baa639904095991c530dcb32052deeaeead796a7453cd2dbb37d4cd44abb74d14eaa21e0059bd02632c36e736bbf16ed1ab14889baaaba3f580d539c1b759d2c42d58acb12320867b8767112a7010b04b6142f5f592ac1a1e055d57e6e63014d763475be83015fb8850c51c827de6e042ec0ce2104f00352798bdecceeb8f0a372206c2fc3fea6895cad90e29feaba69b7353104605c53f842c666988a479c5ead56662f2949056d54c5b86139e8f65feda5227dcdb7ba9f46f4fb82b52514388ef781a2182e8056066f799370e826f22982b35f08145ad52be10ef186543de2583a5d4c4aaee699dec1381aee156e5ce1b46ca46b1c911e4813eecfa65b591c51d8ee0985ff2ed36f8efef85b09f77fa9e57c3617835ab3502e06c472b0c3491d505788a300bccd92659aa6504f8e77a3d54bb62608b43d38c5e608657563c081154ba1853def99bc8d6610cfb5d8bb1b9824fcb3a61b64e9e874ad1f3647eb928354547f9770008ace858b627012c632a32264bb8ec8f79e1f194c77d642645a00301ee8a5e9d9c0d7adbb5a7884e809a1d77ddbab994e273f3bcce6e179a925e911826c2f12d5c5ed6cce01627062226f882dbd5d8e57de8cc1de57b5deaa91c89a7c543c8c161ab8c016e25b2cdb83d33a0abb3a8152424d85a351c27314ca504449d2e87613a9b045f9a4ecd186365bc9bcb5a40b469b6e5b0e0cfdc634a46267c722e53f5d7688afe4a24136a62ddfd2c637300d53d523517726409b8b1b263cb014e71529244ccd6889494044835ab2767289e09fd2792e700ad9a3f0d25cafe73b91d1028e6c966ef84f9ae905dda634fa8a39e4c9bb2d69d044fcb239fb75200cde174d7d47a63336ad698e69c0bbcf1827e34f6460ca948976696141137ccedb82d1b73bd4978a27e342297b2284724b072c61dee38d3ac9508e1641fbbd23c539f28c6f77c47c88417a6334645fd4737682df2dd624a331f4d562c71a9b849a62546ffc2e4320c44ce2adfa638f504f58bf1f3a9b869e0d548da7d2bd0c038931c1672cc8ca29359d07d05ca769d40b32c1501e0807b9026d1a415d854ceb06163dd4396fb0ec0c472df26204d90064bf8eb1fd22da38a38f9266e8f5c1cf719fa38964e4f5a96eb9557ac29a2d75d4daccb7cce9b5fffc151097c6c67083980de6a4c0dc6145e5d0aefa19619ff6586994d44d072472411a9f3ab21d8ee0586e5e16694f96ca921ec880608ef1746e479a72c6b41519e08b6b6fcf3d30e8af9715bf8e283ff68f8bf63d7012c3e595f1bf595b05f5767acac40a7ed9c1609cb5487612005248fa612904090f703e0577a79317db4098ba4949a6b7a4be5eafe5be8daaa67f95ffd0a8751572896aaa5b704eb949dad431ba35441a81c89840404a934b968e81c8b0e36616582ccacf24232f8983ce1d55b1f6acb253455f87be656dc72a57adca03daab283fb93d224728e40d4a335abbedeeabe3a1cf33ed731e2f68304eab9564dea7578b0d84d0d945ca320542e7570ddfee649702ed97852edf30c8de869b8ca5bf1377e09a6870aa3c346c5666c58087e36827066001881cecdd7643fa00b0773f8345da707c9a1a1a4ea679363285dea001ff648d24af941fe764042af149da6bac2020236dd2c8064374f296c692d871faf87bbdf164746a0d426b633f4320492dad8ed2593a4f58d85019b480b082c7109f083ab8e96967c21994e7fc2a7192473e3003beb53c48c328e5aaf1958031645a7eae9e06fc7d4be1651e73ee90da996d1681c1564f782b413747943a0b03858052620734167abc0d87c5fe198e044670c6cf2872594c7bd0d2187ff30bc733f9223e121374bed7a97063cd908f90147bf3cc3dad5c980a06b933e23bad745df83b760e70b8c4a8cb9f12ac8b6fcc7280e595a01a4d4316e2b53829203c5cc8e97ec0b267940c364bac800f91b3ccb4c1edde31ada848865a1407faa349bb3b50ce59e9669cadfc2813fc33a126c78183ba28069f4809fcb392339e41d1129121a6b92c007ec562a5c60245c54b51dc1b2629a59f0b293d7c7d7c1d161e53bace79a997e2a23d049338111c6faec33bc6831a831d15fe1abf4c1a2b789e137731e71d058c74721c132b1badd335b3a8bf833d6cef0034107c64ba6247500affdb128a1f7b632de90e5631d803a08c6cbdca9c471eb06403d44fe4dd04b96882a20c9128b7e00b3e62af75aeeaebbe29a8f5a8b5beca29e8d78dabcc54bba85536b80535b291c3655fab1d69af9bf10f2d7623ca5e3432880a76a0a8126343a2c8fbeaacb055948a8ca8db1ea50befcc54cd4dcd57ec1606743ad948f4f519983975717b61e92d78514f3dba7e57c29457ae5a6c32e48f272fa508f041f99fb93c120337abe67dc6224b390b1e9034c794a190c440e1f2071a411b73eab4e82ef8b61bb3f7023f59bc19ccb1a1d458f275d6fb944ec8a20927b97f3a4ab0fc417d00c03c62d3de2b2b4dd82f12ab05c2aa00ac88d533419cab30f571951b0006cfb44a4217e4a3a600b57c6d35f77678f7a1aa500c16fe444bd226a34af65cc790126df56baf35ecc898d49efcf2d8d1fe783921f2f455d6d63bf553796a8df9bf6dc832b352c948cdee48d5f21755b091b45f9b8d217d89969944b475defc3ea2c3e6dce6f1f943e45455ec354a9c72b5c89fee56f63e7471419a185912fe189ac58e2ddfec4494c84359f28a46bf331201d1e5e9825a9bfd7e08cf4694da61249643613c5926bfacbcef3ad208e3a91f6a202e1575c4e0277a05f3ad7c1dda8b904d5e2ca849349cc4aafeeca1f22a9dbf4cedf219b5cf75a7a4a533c82d01d2a19938579e9c85240f4a077d5a90031598b3a6c5d2a0e9345a17fbf5121e20ea006ba34470ca4709fdecb4e2d1735ac7ce49e1a4ee4fe7c2579155d4ed718f78a5cb9e13041cbe129c4f1f86e04829b87094947ef9a4ce003ca64158beb84a0ea20ec5307985b13b7f1be74cf0629e18bab1eedcf55799f735934742fe52aff509365dde743536dd6ee5eae6fcf74a52106ec49a53ee756ab6185fbeb98792daac0611f8d5ac014f5c9a35874fb4d7f4987996721b95b5dcbe2070c5ce4d8edea6526ff163a4ff49a21cda370172aa0a0a5ce8ad2cbc38b365447efc76b718c5b7b2a62df4f9c2d380ebb3849dd08eeb6381063e291d835913afc9bcee4198f48ce51c5f442c455756ef2b1255376c80d32b4e722be4967a6589748be610bd704d81791ba77d7aeeafef6c526c564e775cb974232de8af21f26696259d9d5fbf567bd16da0bb11c0b6c71a1ecf227f2964246a660a2a8d67fb7b9454b999dd2c74a74200c7d797025f1c2bb9cdb0346f90af6fb622dd5fb1e384cab91f6cd0b5543b019f570214649817ab86ea9199feb230f47d0085984a0c01a686ab3797397a8eccef724b86fdba004327d122b3febf815e96aec414cb3bd2ede141e2d15bab7dd05d0fb88ee71496591461bef94ac1c07bef83894ee866aefdef8db5b70467e983bba5096062504fc573c451adebe1a5cadc4634095829c54ad7330150370ef17a388bf9ea3a4acf453b685c548766a0e09cdc89b407ca4adcbf2be55dfe21407333e817b7af958f4695f36ba8d177baab9de92b0d07b06abe4bdf23a30a26434bc9982bedc9ce69ecabfabd3048996cdbb11a2528fe575c7f4dccaecc4c96404761968dd5ec062e75ff5bd2f18afcb295d26129461098a82e90a7462393979aa8b0b9d0d463fa14934b17a4f86f3fda01af5456126cce80292458d0bd4a75bcc4666fe7f49f4ead1e917decf046d157129b7823948fa16df4336467229121c2e61dbc9c631341a8c97afec4e06e0894e86b61458abbca9a0789432110fc9f921be3ee7505cc4dbe584f82e40ffce21f447eead11df882bac5c92266b519f3c47d439a9cad4ffa6ee5932bdf69afc204e3cfb6108000d5b7aa13a2affb9855c73e652a79f30b578da8cb583dacefb7f6e1f8b9a77694c243e582f9cc12dd3c987ff1ecc656e254fcd16086a82c253cf327125bae561ddf2e4b678b2532afb92053d1a4f44f56a69e66b2beb96fc7040756fba2618dde68a241d78504b43148ebcfd01fdeaa6fb44d7f2a6c9236bd61eb7f8c18c2dd7757f89e3870e73b2a1665b515e66a69ea4c9dc2ae63552cb5e4ec3a16a56539bfefccda30f6ccaf4b08360223ede8cfd34ee1872e8766429415724a4a9fee56070bd5955f496c7726517e08c08571c80c4bc238a59f522f53f0d08ef306bbed484d69d03d9e46be12279a6cacd805a3eb8b6a21f92ad51d7656242d68863f3287526f630b66d0e7ec487e9ff2063b0ae1667973b34a19e870266870dd0f83f2f5c5366ff47673f704233b2b64514b425a0b3e6827dbf9c77d307c87a5028ac0f42329ae899255bc0393186dde79a11f5107db8a6cf7dea40373998cd50a10fc776dbffd1b80075cd57b81eecd9ab0cadb1060d71cbfc5c75de1e50db6c7aabe38a8e139a161dfe238b10648fcc07c4606614d437c11601fc5b08a8ebcd65d48812cbdb2c5765e25965934dc6dd01517593b902e8176c9207bae692c9351ffc08b597be56df64af2cbe94d476b09e27027c440be0220157e172141e362f69ebb75cab5d5a5f5c1b470b3eefc6d66f3a54d96a496d207c532b534f063a17c283b743b0aadfe6414b4b83b0fe8d20a48fa8234d0ff4c93f8cf49401fc7eb28a906f2e695ee75703482f64934dded45d2037633c2b13250ef82220ac2f1104ef8544bdf573d6761f6e76cf0f205b4e098459252d2f52910db70c2794d7bac3e49641ef40f280061c121a9443e14061dd87abe1dce50033524ca766c46cd409648b73053d4205232a32cd4adbefe056801b21ecabaaa775508c027bb377b278907987fb89969e9c0492df0621205fb2c05013ff8721b0becfe57480cc54234ac2bd347116902537e1efbe5f0fbcc17ad9ea3b446b980a3e78e8bd0b0f9956664985441da8e6d8c50b3f467d948c57c7c754149fc71775d6b83264375a429d8fd63f11ca4e10638195360e5bc7c1fd7dd92b7c91bc741193cf292b19f747c9c1be46784148dfc7dc5133ea59b44d59c988bc85de28be2f9ba7d99ba32f45aa0e092241adf43995e9fe0526eaee44666a1374442ba44653a61e673d8e4ccc0d6b91cb76b2aaf5cb9533317e3a14376337c85cd62adfe473089526d3e96e5a7f750d34e510ba808ff2faffbeabb70175c3f21ad09f50a929839acb326293972e0651091569276060fd046bc40a3fcafc25bc0f7993121cfb14afa37dc66edafd4d5b1c975263436cd9e3959c108873945c1c0b163933bc0b0b1954436d1622933d137a6cb0f13063ff6f0354fdbce2ab444fd2d9fee7107f32a9597448df8b093e61f874618a4cc8f73e35684aa08f06e9173c86b6fcb2603dfb8f0111e46556313655b9251a345c68fa825b018f41554c2f2d3c8199bfb46c249135e306a58fc82c502061b4e3e5acb74cfb6948750a948f9a4dbaa010f056493a61b5684cd301e600dd613e1d5bb25ef51e430bed74d362e1dba917b4f6b0da71788d3c0325321e575f81fda10fcd6c1a79dc849879077f0897d07496f346f6184ac386ee0a1d1a4bb8a64acfc2caa52c48aa4bc346296881c94e303d30157f598ac6d56a878504a5058ada4500d847fa3f0d70ad934e9c088130fc40e79cb83fcbfeb887480630d9addf047688788793797956afbbb36de237a19e4b99e054c1c40bd345817b17f71eb5a791e9447bddcc6911d15dc48454f4fe8c12850a2eb0a9535453f9615ff4e7578d601225afd66fe053c76b3b05ed8cc8f129dbe83674cc32769d0aef167a332776cd7b250971255194c518bf984248d80c1a3c81a45aabaf06e539f4a2098ea252f188c6a2bbd559f9195b8236b88d38f05d0b545189223f91ccbc80ec29941286c8b9729776ec6b2015c393dfa746e97fa364e727e6257d3814ff420a0d555db45e5d955c5ca213666125c482a5b9c296fc2a0f3b82b0c6a8895f5972dc7358426c2075d4282980c1075a4441a23ec229e2c53ee42c421931e1dffe196abc3caf8fdde60ff9aa0f528091d2b3b780184f97705850c26b4cb553fa239203673512050036744d4ab14d6c0897b46792ef7a960140919f81a5a8a3226da27aec89acbbf2b666322aa880ee52f640abcd312412e0d156c9484c20fb4975d2ebbb1e6f1accec35dc0950f9cb361a0ff32ce89b60a2c5f33459e60c448feadceb7310fcfa1236bbc5110113286a3c672ffe784d53d29471fd320dd2de808b176ec797acf4f859e2b83fedf03c625ccf6a295c5ca73e017cd79583f026aad3206c0e6c7f71e29d29ba2d9ac481cc29794ef1664db7d170eabe758ddc8c08323a6b4ab4d2d92342dfabe494cf0a5b780870834329e0cc535fd5a739e457c3440d24b2d7cf7dd321137f0c55bf8f2a2275db90cd52a85df6c2de43ec880b11ee8dc2879ceb4dae01b21a7d38632f6c56c380fe2fef27406dd84d7d2ddc35497367083910ca82b53df859178f91d64d0084218768558593f7608c52e58b133b30cf472663c6e1153196d9391ac55e017411cac25a4978f9d291a10f64a22edc9f4ee02fdf2f61601f70951a056cb33c080fe9b2903e2619e45e4a96568f172164783e266a11121fe1b1673c07510fefd7b2a4e00e8dbb75968988e254fde46f31b64a0eaf9474e3ba7bf7309100038f75411d26632b4377a03d7caf802d5c033955b5b7e3c6997102d1ec0e37e1600e2ab685ff1459d5192e2779ac60941b8854b55ec146a05e29962ad67c2724738dc808181fd5710d7934f7d6199f0dea5b51b0422f05696f7aa62ac3962747b02fa00694b4ff391819dc2d6229950111f83c7a8e77077212154873f29b5dd4d053568845a81320b3e80d0a22d8953d66e98cc2237f45fe1679273976811c0f5c05097c5659f303cbf3ba5bfbfe27d8cc0cd468942fa6163093f68f56bfe6ee131f5893358b131120bf680fd21ff2193c117cc8312c948def9d243053e4341a11a12ea9e5b3589923f9efa6b056771e3ea1a0e12ee0a152bcc2eedc9a1d774f754d675963909c75bd6e297badc7328f84edab8315deec4bec3e3583ffbc34a700112d00beaa4875cdd127a16141d2fdfdc6e817b6b69e2a8c1a5491ac667bff864ea3a9cf87e985b85fd0f846f10002ce1120fd698db4d07804e0f13960da040a7adf9c28938fb40b726df4200271de122080fbaca751b51d77c0c2db03213381c4a0a21f2ae79912b47b5c32b8bc204ef23f30b3033cbee882dbf6310a352ae447e579bbe3366e15e98bbd8b4a183219a0ce3abdc6c4c2e553cf43400870161c2b7d4370ab13f0ff1ce1af7127e7eae9c8a23fc7997197c969552a1a11088ed451ad2033f4ae02cdde76f8df0ee3cb0826539f2f82f5f54f4a0b63e92372c22cade265aeb80f0e5f3f0bd4944d0ff1d11ea4028c4308a5ad0d64743bccfe80d296c912d0f7f577ed566d19722e602c174190ace531496c06c738dc7dab5d50fc08792a4437d185e8cc5572e001f8b5e7f01b9124597415d1c4b53683e474e4829a0e18ff93a32e8a1df5836ca008b0eb65d1ae35e65c14832f5478fd40e5a654f12726e639b15a070fb12807cd13eb4d19541c7c92920b60aa08c11d1ad79bb3058562a27716949b35ae5b16d14a42ba80e28c2c8a2697295d4de42b6e00cac955a432812a31a0695c7cf5c644d864f5fe058e506e9a520b81d15951b0175af88f967a4b97c8794055339553cd75a410389d77fa6a7ea70d8af0f5e0872c9f1c9139a1eee21c6562d16758f6d4cda442d98c99a38c8dad958c78d0ee3dabbd5ff90def86e8e07e3f21352abaa743de6564be181232f63f2c194e154fb65b01eea9c996e57821143d5f155c3c7265fff1e27063f7bed8913574f8082224f60b9c7e16f096c5631cc24f722b85aa60df7343c2b89e3c80db1859efe25846d76b8d59cd19e8e8640d9f049ada227338d82d057c045b401578ee92d9c8bfe54e495038bb25b0a13f818144eaee77c41d78aa10f247b40762aa56c9e29e8336e958e1a5cb746d1dcfcb8c917bcd9d46a9b83679513bc178edf8f2b62c9b60acc349cbb27e489a3631d4d43d4e5307c8dc6c0f0bc1e22e700e4c7ffd6a9c183a085b8e4a2d712a270a0878b6ae3f45c51a355cf19d8ca243c0341b5617dbce8bcceb06b8d91f1b3c276a289adc6a092f2492aa7ebc9d977dd96b2fa15c9c8ca4d9922921706680d19d2a82ca2fed1c6a4d6d3a8f768209a03c577db2a23ce6e2f18ac952be634542497aee458796c962f4e153b6bc8f046acb3588131c5aa444eea7d6fd42f6631aa96ac4587a58e67ff8aff4d9035d21971f9d6867a0f94e343d00fdc52e2316d849ba0eac16dbe386cf5f3f3b829891cefe2f06dda4cf96d3d916368ecb8535c06c61cf0405391caad68f0e098b106447bcff4e05fdc11de04129cc07a4eb4353b0db8d28e5916dde8465b5440d29a811cbf307bdb60a797756975b99c2990ffd9738040457db38ddbe3bbb1dfefedc2c7fc39c943ab4e0c13f81aced1c43e59caed37071ee646e1530f7d355eb74799247eb894683b5d0df15fab8bdbda84abb91b169ba9266b5b18cdb2759ed86a0c88ad5c1623d1df4f730d253db7a45134c336a706f130370a193d28c74f06fd4c65b305bed16b111d27d14b6318de6074752c43f6fd13afbe39bc22f3676083948cb912d4b66cfe957e6632ee5b8dd3c8dc3600468fed88b03b0e6febf73c5b54d3f99f75a0e1e11560f7c18f585ec251190b9850b320f5bbf8095bc572f37aff539de3b2c57d9a5186d9224a5d89f7793ea4ec9be5dc2286149d56894ca0a8c8d8c6da1c0b384d8790aad347c90f29426f9b9442a0a644d010215e1fc9c8dd2e2480e6b19425269dde23a5303dda72e26a30395d3fa59d6aca75b972e4912bc9aa8c7465b9c41ba234ae4d07880f1bae79bdd5367543b658ee365ae625278d1d2089280a8b9406d9752a349507986fdea8b54bc05c0ee0aa7385431603e36a09972675241508021d46d25fd52730fd561aff4b83234e6f2e8279e54d0a1f65a6c63ae01446108215e9023eeb33b211d8cc601fa889e75e0be3aff01f7832bbd4ec07726f8a78257f60e88195e50916d8056edcaa919c911ed062de1eee536a9a303188e8701a0ea4db59fcca0c9096cc80ecab07da8f16dd775ae54a3ad34606ff6bdda8d02c2141df524eaf2cbbd694236c2af66c66bc219c86a54572b8a3c6678e2a8c8fbca0069f3370f9e4362c85b593720fdeb795453232b843643d3422b35fec6339a322043a0ec4de99ea97b24a435727ce296dc1d8da816f2d9fa8d0a9a4244352f188428f413adf3cab7cc659ba30bd9c0bf1cfbb4b31dbf936982da55e43e5bb52c1b1716b11ee2e9ae922f29d8dcd81115977b127e38efd11d75f7cbb8a9e2ace61c43e41b9c11569593c3a64f72d52e737e2be0120b789472a089ca19e0a81d56e68797c08f51e00e8061f930eace4215f0391b945ab92fce57416184d23bb6b2d3a8fb169c56779fb0fa172e50a72efdd72379aa3133fd740d54b85252bc8c1ccbd9712046be154bfa335a6702d1cfd9edad8aab141388b7491c08185b5f18e8a380c0365ab1f9e9ebefbc4c6bab6f6f0bcf59f99c96cfb1395ade7665acdd9c7b885c887a361492b6900e5944f44c3e86b74bf6ba0f2b00d1a8037cac477aee10c346adb6a6cb346305bcb22f84407f2316af1706629d4f763474d8d2676e01ed69a141112ccab9263e7c6725ff3b04c95a1385be367d32e8ad70ee09360af0b6b35f8a8b094f974eeae7cb38d64db3c5f49fc0998ba2e0e340e435efdce750fdd829099005ced9f40088c903d0857af2b4b76830b94e68e9e6f0da8e384230f63acc49f87754c6c6aa8fe87ee9ced83f99e1c0b70fba0e72feefb10d63d6a681320c8de50954187e3e2d6f874ef4a15e665e91604a94811766ff9e286954923e9011b999e9ab7f2c8cd8a2fee062a206d1c84b3a1cf84f1078b393636c8bcaa9e34d1a1f00e86bb5418bd0d962f427b8fb1861493478baa80d18fe8cf2cd15e1c1622570f7feba29c9e327ee753290d72d26e433fe1399e5a1865b8098ec2f2f7a4cdf270b7a68e29741a8f2f740b6b55d85fad12dd0b4263adee2c2fe5ffd0f5e131e819c5807db8ae091e4bd2604571bf5440f9f4ee7f5d1be812ce28902d233789a5d777efdd3022249e7ea96494cc7728379e41fe0fc684aa5c6253561050130381bd1caf209e09db6f96020629b5c7decee7582b9e844de0456a2ee7d78c96cd2768ce79cb4bf0ac1122418e7dc2d259273704cc7b2ab65399024c895843a49857071f11c50dcfb55ba8b2f6c3f88042b07b5bd518542d5dcc782a95b4d569d687cdf8575c64d40b74bd07327146ef5417194da504888e058bedc2596b9f54685ac6fbcda1ab78166ca1e7e315b28f9565456d98332729f92530962f66ea53d6826484f4b80c4d13628f88fe81e9e9bc890ab502840b396d0b6d1de8918d1997f0cd31624ebccbec3138425315452997e8f79f8ea839a7dde6f9ef4d1bce40a1166fff04a1aaa0b500b03f7ac6770260b66c9d06aa7ff238d0e25cf8d33fce436f99620eb8c48ef319748b1d0489f9c21614de8d825bcf452a372690b82d8f4ea27a5dfe6f4f69f4efa0f0cfde3977550f24b62062d1299b93a8b2d20eb423b38e97f560a7528ac192a73d725c830b2c82f535bd4957b9341248f3809ebaf1e5b0601512fd326933ccf0fd625d322dbfce920045a54f5181160804a762d51c4ec18cb54529d610b48ca6b07d749cc027e5a2a7d9feb59b9aa6fa9effa7231cd503c8aaa88f5ee1208b7b6652cc47a5c9323ed9952ec62ce85b8502cc97713d86418db5929b066a08e9a6806dc30b902d9f003671528f072651ab9250bbcb64f3da4bf4a1ee3f5021e600451ed7e5667d874a535bab058aa503c7e9387eb9df11161cb363ab0febd0b21dcfd84ad8ddd0b5e4fc7fe0dd29ba880f529f9f01a20eb6effe282582ed52f5f4d82512814fd4c85a704246cdbd05d26f7504d1c9de309f3ad05c8411795b50fee852cb13e6dadc990049b135e234960e49f5edcaa69fec1874b93e34208330fe388a60dcd18b2015a8c24d93011c4fc2f77209cac6b5afd9d3d00b6fb992da48967ff9c9e21f75818918511b1b4cb84fdc35204700ffd297054ac9019d1de7ac449e74856b2503c626bc31acb7bf6534acd0ade072036841662627f3587580a85d704875f7688adfdad0a41adb603203175da96764e41f772825482501f9ce59663c6a4a756443f09e0f773b3c99f930e2b4b2f695228b31f21aeeb8aedca9884ecc8d0df6736f749a064eb77e27504da1c66fb993e9690a48b9280d368e182374ec479903a5948e8060c18f10f6fdc3b6ea045a0e2ee5ce825ad31954593ebc39c4c22c60d125509742ca949f1553674b3e057a99e6b587e6dfb7e4cf1d96c2ff54ffc7153647adbb074f23d0cb1aef5e0539ab552d930017c92c852e0af28b3a151feae2bacb2e054e73c1c508711fa2e7604274efc5e63c19d0b489063d8fd8452e89aa81847dc4ca8152a9766c6bc2d3e72163439a9df419979944023ed8214474d98fe6d05ff5cc057b665542fc4376ab4fb2186af43366babe025948be8d520755896adf6795b0fd679d2e10e97a297c3f8c7f704be07a05bcd7cb59ab5af5e485ee2c6c6a9f74bfb92ba1f1acfba2304c36116d0523dce223c9802135cb901fd12b01c180e9b27cfac79730edd450fcd890d2d3e7333c8fda5248b7fe2ede4dcd10b4ad4a5bfef8133b8a7b23e6a21c897b03984903a4ce39d31865d10d23f6a009f29bf3a8c5383fb6060d965250343ce94ad09ff2f351bd3e7b71e668605028557c8e4cc7406a4d7c4f044c8afc700a67436ed1c65166e3e209f7c73d1930663a7c56cf35fc82ff5b622af945fe2ac4157ac1c33c3c8db186a44c5409fe878101ab10147ff0d2980c68b5a0027b7d1329c9c74414847f5c7b743b1aa92039c457fb356ba10d6998ae8101fcbcec15b00dc0e9303893250af0a07f3d21e4851ea7374fd7e3f32a6a032829feb2edfcb72fde519a6c94df2fa8f3f423d07805a79b6ddec5a471b90840418905c6d202bfe430373ce7beb543d2dc8e8341db572b3f891d9a044f777d686a156fe85ca6a938b09aa446666674e44cda61563dc0622e6751ab1c6fb52cfd83a278e4e832e2b4e126a03760aef25325bbe0f0a61dd1bf20cfe252169cdc48f675401f35169e1153514e96d228e32c43c7da03751b9259225bd943bb92b6c460a892991931116e08698c9471f8b86b897ec4fbc56786718d084f14cf0b1a0c1abb2220115ba83be4ee88ac7d6e2e41cf0bae78129f434c86b60d04dbd62855b30b2211b435e223301c04b77b3e0d04ed78d0ed7f82ced0a4c0637c348b7dac7119b2c5c73eb9533844ee3776c94fc820318b971834f60542991a274bb3e6d3ec614fc90ac23f66a939322a6b6147ae19d340d7d748cc83eccff7fdfd7c4c231da6ddbbdec35824aea2b7a13d80cae87132a6081060b18e2aad0d3fda0fa71e88f956b0f80362033465cd9fa3dc05c7051e0bd1a9abaadcf3d20169e3546d83c13684192f1d78bab3cd4ed539ec1ad12dba8226a9521076ebec692fcf1e2b2d9180eb18b90a1b9ad2082e5f1cdd9806bb347ec7127f866a148d85f1766aa0e3557a385d5c9b6e91e5814bc01d872b6fbfd58f98c32e2840c94de169035ad44f9f5a19fc12e4a60cdba960dddeb0f9266b54903c78d10ad42008214c20271b32a6c801a1a738eba301db01fe026e601f07bdbdaa14aeba9a64957d1f04dca539ea7543f97156465efb518d6bab78f19db1c17caae8c88c3e55a237fc0c68d64955f6041332cde92d8f511d055954dc2e0438711244deda2b134a43d68231894a833bc87717ff166963470cc0f73c96d49a974881501f2c4aa4fc671924d056967a417a023d229ef830531e2de057e5b72b13ea87e98b355dd4aa59a9f0942a0b200b90f641f82c60134a81f9a9670e2a720f7822f3e83f3827e5aaccffb07c7526f773fe2a023220030ba8a61a2948e24d02d62922e628e2c6f95dca0aff54619a96b51279bd68ba68bd6701ba822c7891cbcb4aab3e9151edaf5a0bb974f5ed8af9a9f02b452e6910cca5403c2e0fe57e4cbf7fda18cb9c909b912c34024982982436d1e588bb24cd79c6bb753a1105c6a5268180325ade83f8285ad2ebe9570423de1a464e944b532c008c027f5d511fc40538635e3716f59d1820b1d0b4b64617fd8374095e89c201a8a8d038a84c8cb135e88ab3417f50fb14fc801b19f9544fec7f9d8ccbde5a8f7f28033c805480c287916ae4111011443420816a0c5414e7e8f3a738fc74bfa46500bf7b39a441f7fd637c5b40140abc06ee2166f49a646346122bf0a62db89ec7a5d119754d3605db7d69e0a6e0443bc4c5dd8e4127499528698ed43e14a49e1bb0ec966f7d580a949af193cd4141bebd42b5e21581ad04e7d3690736b9c5e442c29d34d8a567f82c50012173cafe9382eeabe8f8335aa1a1b9314c7524badf9c1cce6ce49d57d81f5124e55226366077bf71192625b47f769d8459838743fb4e8b8dd0d79f84a765189a71a4d2256cb6f82603ea20a386c9b763cb0c2035094508ecfe158910e7d06e3117cf843805167680e8e09c745126d2c53a43d2583f7d2650b1788ca5c10ae471ef23764d3b0928b3823817ac18f7f12983ee460a616b2e13ecdb2420f14626e3445e357a05e8a8db0d1fc37f1945ecec9d8716098a6ee4c4558581ca181d2f8be602eb242dc6e63fbe314c45b3d01054c8cbf63a8fac3de0b81abc2b303aef0c6b020db33d20acab32c633b89aad4783a01756c6079dd5ed31e0acbd76ea191fab9401153cb2182e3373e208cc211dc393a9724c622d79fb414d929176dec0a730ca4d262585fa6046faa7896987f15cee19a67411de90fbbb0e7e0a1311643e62257676d70869e4119ccb2d638c46e30e3186ce0670bc98712515358a7d672d3f6b4f749ad24bb26b0ae9c7418673a38d947e8434fd9f3f6ad717867516bb8fdad814ccf2d8679aa7df87394ce05f8d50f383053118acd407713d28c7e261819c2bfe2bbc3facc7bda9a4c8ea711a62952717866910ac6a041a37082cacb332c834235f044c68b79d66669c10360c29ed2258cdebd023c966f0e156dec8eacadb1300dfbd9e0cc33969645319af5e7a0e45b582f04aeda5a146e869030022075c2e8b780ebce6d779640cc43cc21d7187ac6dcef9c34d3832dead98a268147b7ec15e913de82ac8a0440ffc370e0f7078c1e266480fb48ac754467f89641787fe0b1a158a942759664057983b322a28b9092d826671ff7211dd2e64fcd1e59e08c26be81ab0ab1b26720719c4ca2f52f444e2da44e8fbd6d50a3a0e45832fe835d625edcec256249a4d161c4d106108f31f00013aecff71628ac43d2808b25d176e568285348c51373f9d70de676e6a2ab18b849e099f908529d311915e9f8f24b1e58800372c8b614434fd312f4e785e36fcc54528d9e3435c04a17ae430b1f677fa0004596102c13738ae824043470aed74d6f90fd939e16d8726c42536867f88b75914ca2eadc8406079f8cfb0e58e326ee83a98a6b6e99ab2d8928831e267fe882e361d90996026020abb1793affac70fd5041c922efd3ad0763890790d30b73a9d908c628995912580e618ab9bcc093d3cba583f5e8ec763cc4ca8afc7917ed566a4e4a3461687ead8e701db2f98e0f752413349e4bf2e7a2a847af5fab87bcb66b7e38e4834fdd2de4d2db4dfbefc17d266d9e27da3885bc2bfc24290d0b2890eeeff07daca95a0e71bcb34263f26e8052ddfdca5a27691e53390d30a78d1c11415e596deda5b80d883caa774327b89b82eb70312d6160d81162721ec4c0e24aeebe74dab050e3f32111c5f576fb28b6ee3d3e5f2c6964e0f15ea9d1cde5ef49af5b15ddfb5cb75e8e1981254faa8771fa26f99ae38305aff1e4c4a0c2a5eaf1b51b29a18f7713517768763d252187c0c6c91ccceac0adc6e459a160d328a081fcdce31ecf3d4589a91d39f18c4560468af254ebb4f5191690ddc6dcbd3062ebd6555e0666b92d6f7f424ab21f76d52da5d9aaa4c4be87e5b4e2b68dae589d8876901dcb5cc68f76854843ef9151fde6a4bd10a81064d24f6615a00772d335a4b569248aab4b312687f0b8bb64707aa109a36e0667b82761293a4840f12316586d4d2546e75aaaf28301fad1995311399fbdc7921ef876d09d6e85ba5e52fe5200b095085a0a40baf054369ad4d402f4c8a0bddb55549fc226c339c2d6937f92ed12c976ce3b311ea4eee52419bb325cb6ccb11e08ee6d5ab0e225e0a31337759d3f78f80ec93742442e987218772094a7e80b07794e025b963ace3977263d8e7dd8fba37c527392571aca155979307485bb0b125295e59ec1e19b7233cd994a0e55d67777bb837827b6b7d36b62457cf14d9d8129eca29934e1c580a4cd2bdd2055eb3d00c917f1ba21fe0a4a7de40834243c5118187a48c624cabc91fdf9a040b4c9c807b29b20350477a9bcc27aec9a1584c99eb607f9e5b5e974330e9b584ad2609154d4593e4a4a54fe05fda0e6ec6f05067baf47d54e4cbc638a8105b1223b45ea1ab07c25085b82319a3910daf3fec41c1a18f935367af60be6ff52e62440cc3f7c10730899cc229a94d38f874b2fa6b11e049b87c488d004c2e037c81646879de618c9200407c111fb1acb0f2a5c1ce1b80902f17c0c6383afa1a10290720b08de15444b07d02d3790310bcc3c2367886a14010c78b00e2259b589bb7350d3fd07960cd44c2a09361ecd9d70c7e4f4bb34bb2bace9221538cff2dba5eb71bb7809149c96378b3cfa3ce167cfbf814c1b307326f58d43fc85086b869d4329d61ac9e91c4d6198819b2c3c24a4ae9c80d58b5a2780314b9462fc7d8141cffecdc6857d388321f12642bded289dbd900a179e60f05e6cfb0bd31474fca4c7fb3529bbfbf084712af8c2aa2240173236127bc480a1dca70656c61c8df4fb8e917b4861fc651ea206061fee2273690429fd92784daa297195df7ff19f8526556e8dccabbc2faf09b1170dd6c451b628a7521f7a9408dba44f1112aea216c867282f694510a475a62d4785097d2e1bf07c0715fab5043a4e253eb48f8f27a60c8ba3259744b00e8cd4680a60600f6d1c4a5281b6a7b74b45820e7e59598971b292780c7f3af665540e1da6147253d90c4192d972d44ae1d13b888d5b1d0a1198d6004106569a2fd8fa95db17a281869115340058aeed756f5b68a3561181d93c57d60879b28eb22ccce4fa2b249c11480e241b0ac62b0226811634846fbe30117a26abeee0c5a77eb70d1d18e178d7d01328e1c1d9daf3439262697ec1313ed4f37e91c40e599cb2bcf098315a3850d9b7101ec68597b67b0f796b4364044d82b688a9b001bd12c4d527b2e865c5dca8f72c9bc7ec407e8a85747b7e16ff284c73b01b549bc1f84fb86166b20a3ab9be58efdc7a843070b9365fc007f4de77a2cd394357750a1e79011441398ec042ddf4609aa7f0ad1fd266bae72f54f36725fce0ad9c08a745ee5408bfdbee051247ec2841987005dc20a0524905a34baa9cd680656cb2229381ccbc21bd456dbe918f04e27da5f11174233d0010b61fd1f3e1e2574832be010bc4f6448ce4884bce41d13b2c0628f592618c1663020a49bd2e21c00bd920d161eae5db40cc3f54120d75343453b52f9f38b7628855a9493a02956b6ef04f7734a642ba57c0a6aa131991839d6f09cb9c709238c08328e0d23089b82fd48e484e64a675d7e069d4c7aaa3d8b1c1d288fd05c0230f6e15c023087f01432c1a803f2dad6d2626651fc97aa1d6d70baf86544f1c97da86938e0174d72003a997727d1ecf44a1949af2ef65f299cd9dcfad08d56ec8d9bfc10fba6633a03bf2bebb90cabac844fb8c59dbfe822695b0495e813a6400aafdcbacb9f93aed65d5ed1c7c226ef7989557b709f11f4be4e04c898ceaea0f0e3b926e2204f6a36a05cace99608be296494cf4c994f961c430c55de17e857fa7d104578c3e6d58aef482e68be2623560bc49a211d728e67ada398445f9a6f3ceb9ee977d3055282cb408e4a000d049b6c73411e5fd74ac835175b2a9af8e5e24c2259887656b4a22da1b1fabea095b8e239b22cf0a837359b70100f83494f764419608778416fefbfd6770926c19f4925558ab25c532510c53cc69f326057ac873d962ad8cac2b640e7f2e903b6b73f616e54fe80049c10a102f7689a901d782397dcb203871bb9c11d6932da015bb4f5e0529c83138f2cb3056b5e44c9174ad27b4c89800ba98d1945cd399bba28217104b8b5a26db038d51e36b0af3dad70621df2a40a77846d2e6866685a09b28078c7a64354e1b95becab810222549f226c31dc05dee384c54b8ba2cce95653a82d20a23ac48b0cbfce177c8a4b0ef32a34ecdb2dce2f12601101a5d17323c78d5e7d373ec20cbe4247a2ac21bfe298202280cccddcab16fe188affbefbe0a9db87263341b4efbc584f7e8b4b4f67df0ce8231b6e5fd30f2d60cbe984e3a3d00f03ed41e71a469b54a8964b45bcfb7ed85e06924ad154b86007358ef90fdfa0cf524074326399914a99c758ee2464e4b9ec2e65ff272236031a9a00838c184070cf6f1988c86da8e99f3155d37058ba91e18a384618e0211bf5bb6fe90f431b3ac89dac970975e38d32d2bbe71e6e78cfde9c415caa2a043598909ad21f2c07ace2b53a9141530801a55876cb2d3cec40b6ca1b12f164ac0f6052e81e9da98f2f676224d86824401875693507722db7f407b4c69370fcf648eb3a8a1b6d938fffee174eff4eafc0de5d9f2aab15f235699505dc5b12fc0574c82e06e8eb2fa03f92f94b7f10f08db87920c4eae1d46fd348880ba53e21aeb0a53ff4f269e22a4baa47779c25af504d904723a927630d39447d1ee90f96504728135403b2f2a00a925993b6e93840499efa2bbd8fff5aa53f8ccc1c32430f0498e0e4d9eb773b7899eeaff81f86071d9c0192f9afbe8ce45a3ee0a405dd0104ef1fbb5367eabc4297534d32215e532becfcb0fe31ac766c6a432a74a4dba6e3b3650936e375792c6215025665ea8cc8365bd4a3a25ece4f10a484eaf50f525d1c934fae5cbbfe210838f90f439ed42bc2918d50885d2c031f755f88fa4fac779cdf5c828cf9fa6585df9e91123ef0272d12657febb40fc8238b72d3123a4974ac839027287614898b68a281b8da24c07bf028ed10114947a571aad1ef19c213fc4a30f38f8fb8e24874ef0e4b4eabeac6e938bae464fedc4ba87744ddbb7bbad725f97e4077e37f50a97906ae75287938098b3c40952c017140a05d28cbe07eb89a0cf744bda711da9959d2ef09f17d24d030e2f10195fabcaaf34cbcec5cf989d6c25d44351c9147eb68cfa61085a64db5f753640ecf6140a4700c43fe473a28bc4142f705d45c545584c2421ee7f94e26a9690d7a5e88b4bcef1c47d47c5500e6603f39f457e01064b9435205262ca211f6f0a850d6f20f865e76e1dedfb19e8895cc7070aa014da944176db210efd1638478ac7c71de268b0a38ee7bd22259c5db6200df8221b331cd2b0527aef3e0f0412ba47c1204648152d345e9e570201115e16d76a1ac3409edaec2b39d87f9072462174877b639d345e84fe8b77dd210041255ba4a85b8cea6270a8149e8af269e6c38e72d353d20109c7dfcd66b3c38b4528bc43ee73f7518cca227684c2fc017dfc4c0ce799ce9a0737975da2798950cf31063c94b4ba9658f03ef487b30f17640106b951e660e38833faee62e7bcf23db07cd905f1104653738ca0dce01bd5834c1464c927c4943be7c906a5e405c2e850bfb643625cccec838b653308d3cd4f7ddb38d3145d797118fb062f65b66416d83a8ac1e58c8fa310bfec8c6701a21fbd61c2621f7a4ec8ac8728f3da00c7820c4d239383ba2d0001b9da23e786d7a106c562194ad94951988b188f052e3f00b509e469652a17a55b9ae175afed3aa4ed59c80e04794bf8703a241b36b304b3b76814a911732fdafc68dc92bd44406f1d5199cf0ad86056e208931a272b3a70ab383251b8c877544f4706d9ed511f7551d947ea26d18949280fe68f67923f54ae1f03fe2d786d1eec1e12f1b974aa948de1d8674fca9945ca38ac2b931df6cebc31af5f3a58674498e2e67953e377da2f16a16b1929b5dac80e8ba422152784e68a396c4edd7db68dfd405e1a747d80c47005eed405ab934ecfe0e366fbd3f8a16b3d8385d2a918e30ba62ff1475392e651553cf40d6ce483a33a4989782e3adc4987e176d2dd913709c5361764ec5c20ab310d3f56c00fd4aacf16f03fbe0e8931e9d4b2797c061be405ec00a5f6f5aada1a2ac0b8ef1350208e3e873cc94b52662e2147898864934623a14b31efdd717848838335215d87191ea35e386272373890c81e58913b6e62bbf18a3306dc547c3127d3f39968b32dfe476313249b4ac390c9693d2067e43836c4d2121eb0b87cbc5ce93d386788f766953cf93c3805eaa0fc7f71628dfd70bfed6e3da21daf8b8e7e1f6813fcae27ec8af9dd1689954be4bd740d61ca50c3503f6f639017dc4db17845ee0bd5a1008093f8f1c6d89ea610b760fc95d45aa2df31e82a48814882e2ca137975bc49ea3689db357352b85b7563324385e42a0f9df58143d9004656fa3512f94a2dc102b767e193dfebe0e234a41a5a3c97a88c4d603856d4282a33bb0eff399871c8215a252619ff62a83f1e9b56dc9249fdd9c2129046e5b0699a0f34cd401f26d9cff00d5285f302268b969f6cbb6a443aa0c40c5c07af280f03e2c3000ac049ab72e797a5b17d181690939055370b1f78a2759555e10798683bfef63e46755f40a80ff42cc945ef63cbd6d9733b76fcb6bcfa2844edbe024bfd3c13c28c9a6e976a3a3df69c7778ad8ac7398dc3f91e7f6e72e60cdfbee245a770a08716e7dfdea283c4fd68e42231bf66ddd70890a5cc7a3712c9d6ca26df833e11bfdc0cbe47a3c96ce2ffafc9679161774e5ef48dc6398255eba4a3c16c6d8c6e5e2d43d49b0c922189bba8ac4b0714dbb9acaf15313d2d7ebab540460d93091775980c221577edcc4adfa9b38b80b6ac107fef39eeb7df6694e61f8feea8cb9d24b037505d32385b3d6b157d02df0752b5488f2a1f1a511048213d20cc799d8fe81e068fe29d85141e1ab159e4cedb52dac3a846ae280327f1f4f5d7245aeea4d725a72a5aa84f817abc92084b374f28097150988b4518dc66c0fa928c91cdab1b25629a8999377c129469c7c8f651098c040f0578e2ceb3366430c0241c17629ff4bd2837fd7fd125c830faf06326ce09a309bcbb2ed51acb54238610e1f1e4d8755282c40b3e4f067d4a4bd24d3faccbf5e750993501959cb7240ea439881ed82a5b8a0020e398accde9ec31fbc38c7bbdfef308aebc0d9ce893317e9f19b54eef1280dab5c9f52773ce995fafa09bc20c23843fff5b66e8965cf04a3142ecb2906668f497c99802e35ffc68bb93d307fb8abf5b48d1f45a8ccd2a612be62bace2150b6237414f155dae9079432230030aa8722299bd0b2dd138878ddd3704eaae4b76f84d90191882364eb2d1e5d7bf78a9a3e0537e8ef11c07dd55718baeae0699fc80c7bda88654b7b7bd1bf440c210d23a739bf9f736af014e9cce54c7ee380ff006c7f54f0ec791d0e5111e07b5634fa5f8f1ea10fd53c5971703d42ff711c4a7aa5bbc9e4a0f8b64135aaf06185f44cbb83337d09636ba4c071b2279bf1878b99b13107b0d29bb277733e0c9063d6618aa5a43ce82df072159c7279e9611d18434c677f8f48de3eb69f164eee5ccf93875b9831b609855276bb97b3cecae8e27a4e1493e136e55df25fe5fe9a981f7e2b7df4262eb82da3ca128dc4db0c48e24e7921e8692ae14070d80b73d299729390076051489c421583934a3310436039f90f35c28803433815e70f843006472a5a08b5a2787d5918b950ae016fc2d076ed7dc14fcbfac2880a2837058b660092e884e179e2cae28b020a36d897d6a1d924c826c76cd2d8889ceab347cbf678b92e3bc46752116f3c33002a18698b920535abd0aaabbde222e4c3645ad57d4d117f6b1380072e7fa89ca77cdfdba7eef3deb67e7918555d8ad67f3ebd71a181407e84619be97c0cde9f851129a5141994a29713866dcfc0a49e2b9a89030df0036493f4eac80ba8e6f2400181eeb7ad097e1e1089f5aff844b6b7bb93201f3143dc076ecf02c4a42f5e04c787c8a0d24279ddf2af158cb12a3bc31c4971328516bd01a0ab7922b359199fa494c461c53c74ae2701798652d4851cf99dd09ce410753d4d94a4af755cb010e39517d0aa7bb2efd68f267f64d2c08bbdb230f474a9ea5109426c62d2b670879ca8bcc30f2746805079a079310a3af5f62690c80b3248aa62c1af44ffc5f4ead75ad306e7f5c6c1e136b6ad9bde7600e6f7c02071eb117353c613205ca2e52626d9a73b6a417f5e193dec469606fd8615a71e1e9c7cadd25f99ff503e20a105182560530da003040818faab78438074d802cbc72d403848c53545b926313039f24fcf92e6813e7940ece15ea1e2240e1d31323a2d719446a7ac276fa63bb90878d7b3123aca4861025d0f875389352eac8080cddf45601b1ea2f0fd64ebc5727c57d56385de3c43519410119c8cbb88ff0b5bfbfc19969b3f22f002151cea4a756b81efb4bda8b5d128f7f8b6a8d57fa8add5754e6eb262b80007876d67ceec342b968596a7699e49bdbda308245cb48551bcf7cf0c06106911953b346f19d0fede97c006bf7f594dcb4a7fe5ce414636fb105c4d3658dd1955a3d7f4e96dd2152209f62e5ae1e5536df46de2b8d8ce983892440dc36d98c6f97e2ff5261c49c642f4ef560461eebe6fc4811d61d94c62bf53f2698cf1b4b50a0d832fda8288b8f6a67ef9aa693cdadd7243f363c6a00d5d9d7f442c90872320000728cae9ec679679383df335f4796929e7ba24c5fe6e72bbc661fd801cfeb3ab2b7ba42ed0cc16b46e83e18982ca9896f13fb94de97180b14196c42f22df526c36e28e34f0c9532e46e7ce865f665796cfcc77c9e70802556fcf947ce4e7f76933de63032c8fd75460ab47c4072234d1f9f45b941e20c8805db0eff51783b21eebc799cd78896d99673bb3aa4169c8a236f6dcaf5b716c8496175791291f31fb184ff6260c33533b00b230062c7a2c9aa8b33deff7c8439b757b7cbf182277c193a1122b45ff3fe8efa8057d7df51ead1a6b1e1a0edada2cae95a58199b49a2eaf583b67c165904e316dca46cd3fca34528cefa92c4c8fff2f93d64995a74701c2709dab228a79916f194af667ac4b33a75df4178aa2b2663ebe78cfe93430e1a523549e493354d9917bf660117a2a52a899dec026088312ffc2886c5d513e8b91a3b39d5426849defba5bd681420eec0305e5d5b2215520cd40db2e73f829504084074dd1e985aec089581a6e36df55d27c22950d3feb616eec987002963801911f36da6e94ad2c17b5346c57a9f8b2c8518f8556c7a34726887018b7579e6c32030f2a3823182e6f78ea388940b6c66d435b12b1ee1330b7da0807b28886586fe02c3d8bc80316f2e430c111f907702ca275ed3c7eaabc87174d642eaf5234b1d91c5604c9652e82b7fa314523954c669bc95ae7dbda20ebdde1b76a775f85601c562c446c2f188c2d011715d6119b158bafc2e4c097354b496e58b1efbc6bb5fb052394fd6a66311043430505afe6d55eed50fff14b59409f70a53410de351b09c51170a037c0f81c75f4d1ca7a62c1896cbe38368870ea6400137b7ef0459a97877de9558902661f003b84e73550173ae57f21066107e54f94fad1ba8d54c1c67040a5963a638d6bf0b5ce3d3b7f1d004f72f02e9b331257419c7c0245b171cbd1911b8ab297251d66b41ea15b3c5b4f113327a523d09cf5a1e639a1e1f103ad612f92170a48541121fb5ab03206122a5dc9185d4c22e075126dd8b1423c3c2a737d2f983938972f3a0a3b43323848db7c6cd1b5566f8a0ab5fcde6559d6969c62531e491a9c780d2facb9649d0663dce6bf6cd328582a6ca6a8faec9e45ba1674e2c01a52ce72eec63af810b492239f11fabcd48752085b625773f98d0f7a6397254ccc26c958e9836a80cdc1c6a74d39603bee18ca0a18ab139a43d1b224fc1a293c42c5af0b0eb925ee185226262f4191c497c314f32faa83b187daba0f836f3b1460480c87579db0f8382931c01d1ffec5fa7b5992af10148e192688eda9b082f19b4fc7e047ee54eb4ccff0223920591f9e20c7d990956171093c927702a7124168f24920bdb03f76a964f4823a727fa00d48cd6ff47b1072ebc80032666e6acaa1a6543a8eb8cd1ff0214e918990f5bbd85e75f4602009f3d4df88debfdc90e94c854d133ddfa4a4f982a86f0ed2860f5ae3953a618e23f72e188ff5a93fac305cd31890023a7d604b41ee7ece85b8196c33f6aec81bb4c020f6cb79c91d8550bce42533818500c629acd10247ad64cab16fe056ac00805e00e62b51ba0c6d58309057feac21d8c47d517429c2c0cd83dc114a38cde071e3c9f190455379bea7326437f148284471964067577a836bfa7d25ee070c235d63832019364c385db1a850f0c01a6f10ddacf577b858b4fa074a260e0d47598410c3352e8445fc5b15ee1b30a3c38ba33f70f8187df0c0f3b097faf7ce4051ec00c37f35f6d5a06b8b9020bbb4af247fd3b8f11feadf19447082dbeab7216329177c6acefa80a447bab4a78ca9f838f9e6c0425c0611f1482c6381c251b7deb0db95062cb970419a85a60d3ff5e3580bc0caea99e5816f4cabc2ea27a47018724ca3302ee5bf34e071a0de973964d399403b6a871b84169fea5bf78c346e7872787f6b25dfc95b3e02e8c8648e3c92d84513952bcc226364f14a95027ec24aa67d3f9dd4b4dfb24f1b7b373f6ea98d66fe683c4a07add0bea7d4cf0fca37246c177cee271e1c99ccc29d8cfd5ea6e912d134a350b73bc9dbf93b24b2b7f25df5b26ae1a0817276eca2cbea146c8f12d22340d574205b751f404f7b6f78eb78c6b054dfeb33c12e14d79c95bd974348cb79e11a09115d884f03a36be636468fa387e1b0832861749ce6b3e88754742031fbb24feafe92fecca33ce3f53769648a2804a19f90b9950cf9f7f3cdc2bc317a80ea559919893cd2a0156153d03a8bba120bd03f42a2439dc02c5fc4988aa6622d2967ac62f0a9a934c22260c5cb9a5fe5e1ab9a01ef89e1d7308315249335a888b7e0adfd7204f93fcadbfc81323cbc2ad9d671ab2bed6c9eeed856cf81489e9a440b5957563bf14ad648364fa3104c75ca14328a1539a586d47551daa2f57fa5480dc89deb0b8a3266d733f472d15160118d8985da533a322e013d130b0e8db3a77cb59f67ed3bb1371ea3aacc2c6360a6932b670f5bd9884a019f8d43275927e06324dbdb07bd0cbb62be82485d6655407dea0b6092b159efd395591afe30fa025ebf8d2e6c06dc462679803478f6a9da32bb38ddf15051d73ac615e55d8167a75dda3012f31f7bbb884c13c10334566eb1b0fba09a3c80eabbb4c36d5cb6b3b4efec11327f2f5e7c67ab576e27f845a79d7cd68865e279cb7689d35717daa627306923a50932a8835916d4a2a177f604536527b840f6d1306d32032055c73b7b41106e5ffdafeccea633b41eb603e440210141b5d8c94d3778e6e883166bb22cba14d0a6b63d10a4b38fb48bce6663e312d8814040a2b3e34cfc26b53454b4c657cc5110c26d8d4dc08bd68f674605342040366a573ccff805d5fb34294ae660dda256c0b3ea9f4cd77386327f8201c5d7b7ac2f03b5eaf6482f5a4f01f8363606ce10e09a28217fde74bc4cc79f361dba93f84412e3487ad058ae99652b04aa08035b406d27d396f802b9b25e2ea951e9e55e31cf92d52eb2b14a1eadff5d60bded95002f58ba010bd01ec0160784f62616e7370dc3ec913ea86948faa865b46ac099623f0802681f82855bb2490cac2f3bb42b6165ee597d0882228e6caa737c13240fba65ac9cf6f23318cb7b52872606b374279f88e851249168239d3d726ea91fd0d944916dc41df9fb39fb761af75d8ee01046a8cad351b82d314ad9e5b21f1f6cc85c95a7cafb6bce663fd39cad34336787c6053757e66c2a0358c2f64ddc672a67779f49393bee173a6cb582880719eff02ee81c33b432a8002fc8329fdb6eb3c4a3455092532d5e43a0200030d07b16d98f18e52a87cbee86606a22af83b7fe3a4d583bedfbfcc8a500f4350e589dba40e8c281bdc3b2a5a5158817c7b30b3a631494f49abcf13876d0917bd97e5b245c6435e9d4b7543559948bf52d344b89d5d9c77feeb6c99d31b210605ad280e3e4dec1a5128476988a4639fae98814496b738dbf3512e409b9a0ff3f46f9c46ff6af012779f499ca6db77dbdb772576ef4c7c8b1816da71843de05bad964b716e9077ccabf34f7b3ebb6df834577ad421e5b38a0cebccd52de59422fb72625ef168b3200814016ab9f4b27296e3d600fe390f28bc1c20640e8b820689053d91d29593adc882c6f93348bb8c51d8a0b8eb79f6a5fe07c26e019b0c4b9f0a41eaaff4a153d4971421733c3bb56ec8d114495aa90f3aa0fe71ed093a4b7a063c2cee70bc4acddbcc8122fd9cff0b412a0b8d8418ed7bcaae31a7699cf5bd074e8e27c43453549a05c97400c7fb1eea7045daec069ed293898a188ba3ce178ed811c850c2f67d018e07fe0b9a92b9b5414744fae249186fc8375a694aa02774d1a55f853517f778270cbc6f3a6dd658714b554761aac1077f8e9f0f6a97e22b2d4e2bd2ee98ea11c8138fd217571fc4261676ce98e05901be640dac162d0b32e7f92a23c72a001f83779af23d2526eb36818a406effd2a52effc356ac7339bfa824ac13cf87f3b54986bbc2e7bf7da812ae17d66c5b64851a540db956731d454f8089886450d083053b7559787549e798abe1a652616b850d701b67305aa5630d14e78eb9654163655f088ac0e61808795008d3f69f800e576d787d0a1acde5808947b1fb43c2d0d94b0840e0f6e7c72d0de0c129d3fd7f089698b24607a9b007f7e012a0cf83868b40b41012faa4c2590ea8f33a02d94876a0075a4b36282da6615ba04f2cfcbb536b78f6fac10a1fdbb42a532049a24d1ee0a41621931b94b0a2c6b709a30126f3a7435e59fc4e4a566e7f2289dd0719cb2e19d918503a40749e4015457efa9a81b4d29b707148aba64e12424ad270f817c26c31a4c1a89e0b77a2030974a4e52783f8689fd39a9357d4c4f821064ad33843fc71ac124c49f14fa3ccf6950108aad2cf5c689dea907e3dde58b0918ce79833e72f9cb1318e208972c7c8770dc035538979459f7a72e97203a7654d09b8374255d752ae9249c30f2e3f9878353c888585841d167ee7980382ef0e03c0b364e8d5f6b058450424e2650cde441fdc17f0ef974cd99c242cb1f47b7326e60ec4bfa67859f077990fe4b50ceb7009e5b6a17276664a81b0adc297af269fb09d481d2200ef56560125ddeece0933689e89e2d94aa1f3eeb1648a5c66ed41680f5134d51dfe3fdc297533a66059d134f19fa9dc9d4d5bd47ead967aca67c8e61eba248d69f269fdd190b5404552aa4d1a91117cffedcc49b0753e9b8883f30c5f8299c38a37aa32e620bdc92fb031ef3d4de4721fc65c2bfa9e9382af4a3697790182c43c5bd9e2ad255c14365c95e1f02857a6f1fec6bc61414cb2dd31dfefa1f8e16491dc601da5e3628eec76e9e29a623a8ad2e659a3b9351dc95228a0481cb25592aa3fb332da12f87e1143775d2d4029c9006850a8d49a62cccf7fa70f0b34cb14d6a71323484d0765ba80d4e64bee5967bf2c5168663f9475e78c06ab4f8a8fd7d779218fd8b83236af72827950c427d122206c5683ce75cd8f176552e9d61c1c9a706974cbd3c0189ac1b00c6662f56594bba3686541158b9f92568de832c8bf29ecd3efa77bfa30b4c12ad69d66209f43d6d64201d9f477f816594832d1b1a62a53009f7a55ffb3d1c321757895be40c09941cee5f412a8de1b80b7af7c2fb4a5e33535d156a048a97a52e7a0aadc4d687b2b7b80d9f07bb63d0f08acfc2971dd64a29cb0bc703688241c5041b16c5455c707d47c2b4813bf8caa24fe50946ad406f3939c553514fd00315cc796138f8c50a8ed4390ddb48cf1334f89cfdf1454a4faf8477cb3b39aa1037d536a89f5451e6bc5cf5cc7c8b6f83a4bf06a25d43e451a52f2c792c2ac7057fb2c63c007dfc594edd62c1307d136991381676b8eed4c9e722e5f3554671ec433074c15b5fffec730d40740c23a465e4703d3ad180370d3c2725432e65567820aa62dc65f00f0f4c724067456b24308c2f92fd0b749bae007e7b6a253e124eea403a9e954a821a7058d4ae3284ac6bd3aba9690b5a32bdcc1ff64dcb1775350139ba3a8204e80800589c16cfea3a01301d979cf4f912f956618193b659ef9ffc11c8f2f385ab7fb029698f14c815c858fe5d0c00ed20a380774c3498a504f30595eea80ea06be2aaad0c21d066288e4034890466cbe2dd35d234ddbc2b056fc7db54a19fdbc2c35382cefe5026a647cc6400941e8c7bc56fca7f50d58e5004fb6721cf3b84d956be2416385492ffa444d0259821b60123afa6d43e7244d4eae81b3ba8e168f28cfa93b426dfac9d1e334c05db14328c57a1f24cbb1df303126fa6eec8be19679ae13c38a8c63f03d2de2eddfe0cfe9479a7042b413a8332976200d30646745fb770607ef1ce5ccd393ddc5fe3e2b80a94155bc04861d32a0f791bb4344df8d101c760d97864ff2a02ab10bdb36a667a7941c95408380036895434106d222528fdad5a9882c57bca9a1ed0165d823ed541253d6d562f370d0234a7fb515f6c8d2a9b648077011430ad36d38a350f45008b564675d9a9b7251cfb4940a1f4c8350dd4876d854e292af5af10ed174388c3cfd9733e204aaa0ecd418b05df3b1ef92d5fd770e28f4943ba04d2f78e3ebaa6e1402192d58bd80f621dd9c74e9641c82d16a430052d2f0759eb54cbbdbb7341115422b761248eea14132812af46caf167d3a0611759034824e3d17242403ca66d9beb5e7095308e03ab8cb927f16fd70cae104e597554b65ea06068177285287559ea80daf66c99cfa149afb4cd6a5488a526a1bd00a0e87128c8bdd120a2c4ee7caeb51e05c989b0c88853c567252feb800c00556aa57617e59db4fa6c4823c1e265a75ec898fde09a5009c0b05315cdbc85a5cd2778a610dc0c69fb6b74c10fdc606b9c8d14a4005fb90d5da83ba4779d95f225f8d7159d40e60ba44a5f662998f0cf611a0558b10d209f43d1905306af0a2ccadaf6d475dadb253cee60f42b06540447724e5ea0232a9d40c184dcb485f82377a450f9e191d1593dd638c116d720ea4c4988766b73e096941e643fabce970c354b3981f399d60f55f888997eabde3e6faf86cf89319b5565c611cf05a7341014bb90c1520cf173539ae368cd922b71168d24a5fd4b84cf6115149db78df78d676506ee7eaf932361a7dfa85cb4af534cff2a510409941a1e56f741fcb10882b6965818d01e5411f93a767f24a2dee7403679de8ab91fcd98cfeb63386707f410810d95d853d993ffe3ee6a2cf1e4e8c32b440a637ac993a6048aede66454768e2681812fcf4d4045a4b0b6f6f1b07a2964d36b95ec808ca6d9410946a445029ef4545b4f4c969341d2327a701f6ff6a85f0c1a8738c1691b8697beb2ccbdb9940c76bb974156925ac4ece4850fc0d7d67721fc0813392cf42b09d73c78d4e43ff9331aa3a3695901a523d404dd934d9ec5c2b6af5ee16a7823285e94447b392c4e2d6c7983fc5069a66859d75e0afbbc4eab3d75eb70302fd89eef00749ff2c5468f23bd697e63fe126dea33cfa1ee51f2c5e568bb34559d71095630320a7c09d1b945011cbacc6622889aa08cda709d687f0f8cac908368801cc02e4827535e5cab5dcbf2c77c01393644e3a066b8c00d82788dc54d8f0cd441afcd2099e871b1de797b8f8b6aad7d70537c880afd6880c6930b190d907137c920e3d79406edbc75554cc04d5431cc7a7dc179666095990c23c164e61328ec33aefd85fa0d49f3c8bcc19adab3d18cf59092f5370bf59313f9d626a5e51880b4a1bd291b4544c0e5b44712f6c250d0111190665ec85c3dcaaa789e12292a4098602c711c823c6af0bc5ccbbb090655d7d19c115c7090c70410505d3397f8382123cbc5faef6442d32e505fcd198cfe987abea8084b938237d35e9fe0daf7ec6e68b5222aa03be95fbe3985ea7de6410b51ef02df74825b6e2301449d15e1b419b2ed8944ec2d85116f2b3f52df35537dbf7ff2dc9bf6a4c25b53c9acae666e30cf75bc885da203bd881da42cae2f01c6d541d34766591e0fd4418ef90c14fe7763c6adfa7034684433624b65f9b28829963ee7d95e0c9acde93fc51c77e282893a3367193155bb1780cce42b0ce19acff3d00fba4816caaeda5287e9ea44b43e3b323ddf63e91b125053c17569e79a2e898cf2fb3c570a77944b9e6ffc4c2641daf6f3947ff210e7710a7bdfb86d8d14b534200155ae695cdbd19f421ca199e3cc361c771ceba3e0fa38d4320fb6603a3671a85297e7871eaca8e3766921565046f194b44aae06ce63b67287f6cc870f40e16ae765c3eac5cbb412440b8125b9c85800a457630e85d40a123dabdab88d84ea07a76ba6a1f62508a7ffcdf5253bbca5c343f3819a5e74563712f38003b216429e38deb4906184efbc6d4278b13acfe9c0629b1fb71bf791d5d9c4eec75bf9bec287390a7e0d69aa5d12a1c4ab230a64182e80468cb60420569e752c45e518a697d5c5a15a87865da4ee7c474eb3313947b3296ba6eae8bfc448afba57f307a40a7fa3bdf583316efce249249ff8f44840050837bc2cf785a7e40da4c28eef3090a7db3af09a2e0bdec8935e54bc5a4a26d2ee05ce229f059771b31fde6efbe9983ff4495af72f5e40729cbcb8636cbd1b6ad23c8683e0ac2832b1870602090fc1deae5854062d2fe92c8e34090e5bfdc3772381cb7b6a92ce12b30bcbf79a6a07915e75fac410c7e8258ba7c76878a769917021c34c862d3a4f7cb0fc4750a5e33eb3a8d66029511b1a439f6848ef268201a94a0daefa6704c7202e82eee46da06ca88f314b7ad1af5c6a6932b3ba02eea380dad8b0ba13f1baed3eddac12174e16e93ccdaff3af4b06e627b5a01c8f0533111167c5c5868e9a40d5c3c53e7d6407faa9e0e71a0863f3d4db4b5fb0201459f2c364525cfb6c877692aa473613067f0083129a3179b0f5941c1d7a39069dc49ebb8b4200e77e85e8e5a13da3051c9b09add813392cb2b5541685ae2cf6cff7fa52f3755c4add95f8d59f806d5a961563eba8a41626fa384df7c457ccbc87fd0bab76f4675a648ecf160aa0c02039b09f8f1e5bc05301d5a060b08e2453eab47ff09b88a74039d0f120813db66e2870ba2320a4c09b95c63861a4efdfab9450a895d9ee973af47e841f2c41f15b850519905fb9d1730c9868d9a79303a3f95c357ad48c43c0dee5a4ce277719ff48ea967579f211541c937c5bfd2deaef196134183168175d99c6dc341a880ac66726741a4b7740f7e40735a682c5528519010399222c450f25591848a91194138f5696d3235d2a133dee0dbfc98597de4cad7da24e880c14c517d73944ef80853ed6a4f1bbaa30bae398c851ac499d8e04c27a15a3b8331ec494b8d7da03492a9f7213e08ada55983d5c0a455264b04b1c27014882f0c80fc45619867d6e9a17a495f3807e6a9c6c83f1dd0369ddbff318ea2e25b725d35a309b249ac381e82901f014a4e18256b676e21ca602628a3fbb207dfd5c8b7f81c8d8c5a798aad3c6be6408c4e62ffb1fc7732f64c9bd8283c16406e9e1a3f19636b84929e53603ad2d1323f6bcb3988eae0b1bf1f104a85203da7a94925b1ec078fb7738cea110aa39dabf0585536580cf53a6f050d2fedda4d868b88613188696fa1f1b80d32dc161da3f56c7860bf3be37cdd117da1677d677b17665d144063619e07d88ccf11f9a9c96d83a2b684d003a42422cc9805f440f3bdf61eee9c5645c35385e07b49d06a847ba6209d7136efab29b38caa3ed7620912e9d3a413555e8c00b9c41203957ec5a65de259812a8fbbf1c39a98caf1c8a42e9e9f1272ecc3b9e0a3e89733214fd8fd9dbf61c3951109466ab08d64484af059ef0ea342eccf703a044cb8216a41257f5d98d35a753688445058216e6e96ed0df497b6546150c300952c236fe8264a7ec8103459c2e8e9c227227e942be7a511cc363b1df85e2df318074c20b92a661d1ea5c83027854c11a91677525686c9ee961db91d082867c8b74ab654cc82123b30fd2fdd347e20af0730add21dc01c8597b0be2efc0813c2ea6001f4f160b725441687b87c851cd57b120d79923c7f61e90187ad57257e540c32d6766075cc7a336c62b339ecae83c84265e35723b7b90dbce0f1758bdf48d4d244686fa516625ade27f52d08f306f607438543660eca54c83e908a5359818004273aa821cf799431ba5e04bdb10f74050c564f47470acdeeb730440c1c6d55cfab8b9fc829f750dce89a45378aca6de6cd806755afbfed705d5cd9ee22f89de096eb354540539163863ed7bd1b407da221a19aa626064d5304dc794bd74341246ee61c2c8a6270ccac16388f0b208011a32f4421ebc71d4984208552e6301626c608d1d0505e37d83bd2a96a6ee599af870d70b9a60040894265320b96fcdb8a50986794f5e38ccae6b698241eabe96382876bd464d5e7151aaa860c025e6fbc276d0599a76a90fe22558b821a048646fa4441fa4dca42d9e464e4cf052e78320b7d5419cbbebcbf4a36c5782f13ea7c9d049bba7a4d80d01e88327b386b02cb5e9323040cf0a7afe22380aec1e75ec8b58436449975aefcbf13d3a41b8868528c9e72b3d09001fa81499cca5d196753b5a62da92850a856515568e72dc51ec0c2e85ff449069080d7d8fde1ee5f2bd3433e06412bd405537b5b130ef19cca1c315d14f02be2430102cfa48fb8e27a8a87b0fa2f37866e9f23d50445944a69c6ef9a8b2ee6ad8cadd570a35c3246dd5fbad61778a4ad40652279ceaf04e3ee42f42956c6bf36cde4f42ebfab1fde5dd4ce6f1b68278c31c288c31386c1bd03583d443cb17c87d75e7d69b456ccaf94bcc08f8194b53ce34b2634d80fc73c9c861e1bcdb3e8303c86f09bfb970c2dfea3a935e8495bb8d4edae38540bf73468ab587bbd05d1ddfac242de1ac4289d2a18a5f97eb3af590bef2ac5ac49d68102bef87219c2e50402ed982c73a6251f519ce44d06495424c9ac4f916e49f8707b947e11e4f0a3d1550b087bb7c403303b5309a7ceba8a31f6da7e4d35a57db8e1253f5348c293e460cd4f4988b7ce322c017df6c1df4172b060ab25b23bc50133b4a128494450683d42a501df22f1e730fa471f4a43a4c3bc843c6da8a7536b166b033310d39c50d8cd02f90ba07d0e64f1db07b570ad173932b55715b83bc87bfd575e83d6b5532c6aec9b690f76b6279303b8ddb42ba5f171d8f3faff327fe1937f576abff0c761f52c8be4e8e0e5b005f275c602b8eee3bbd4657a5281c937a5b50ee101417c4417c3028828f719a3e0cb7b0927b194141b5ca47ca94dc19294b8e0f55df10593404df0fea103ec86a86cd6c18414d0df4dab9410903e14b56556d3f829235eb93c83fdd3dbbdd01667fa698d1c695d6c51eab4080d8d9b14750d9c1f0a54a12545903eba04c1257703272aa5f372987f2164849503c84b0425685f1b19a6d4fe85163e2e20880d4378363f2afdcab7fedbac58eaeb9a1f81424c663185433f00d05b3b7f107a63dc1348c4fa2e65c241d110d83ea3d01a139fad1f9224ab480f141b32b5f637ba224181f8d5a83cab6b19df7b12a6ee423eb0ab6dc0a0af8601a4edc5d791c1f0b48ef0639373aa3832acf7cdda3696a9db73f6282a82c5464a5f91fc0e8ec304f28e0a21fe483443efdc78362f1262dcbb229f7cfe597e4711d444a02aab7896156508e58cf01c2c08ad80ba7c05116cec30e6e42ba3091a2e096156155f844f536ad1dcbabbaa4383dc2c8e911ff1e7308e278e690e3d9675c02ce0ac54cad6b3a099461501109b834417531e60d9244a694524a524a191d060c06e3051a8c5a3821a96afaf24943472ae3842ee96b4d8974591b0e87d8379ca08aa45e89a6f77d1f454e11fd93e1dfe8d2e8aa947a71a3f236a2647448a188025b13a61e4d3d4ffdbb82024d6c36302dcd0b536b4896111aa6aa56d8d1e448c9c8145d282ab22bf2c5b8c9d014c563b7a49b2ac04793c998cff1d164538da39034f53cf5af8a9c3d3efa7487f5f1479feeaa52112d970d0a133968567ba947d57e8a4cdb6973026d4096a4796b4c174e412c372a25a97f53ef0e53a510d4a324400016d65d870c33cee8d2d0b227101e682cf562e48158e045180dd1d305ac0e685d2c3a8c81105bfb8180e4b00287a54ead0d860278dca0e4be3ac85c40a7408e40d08e8e8c8aa0090079d2e952f9f5d7755dd760d418dd5fd7750d4661fe51e5988b62080d27c2540cd1399de5659b991207230f4018c827a74d86f9d466a681b1942ba920669cdb4706154b24d2824a689595b4d040161485464cb2b0428bcec84c0ce709888c830e47c70b4618ac5658a0a911422c86c5a8e314110403ea68ea02d805059835652589c12159c65af08c3b8e5de879712bba2a5aea8d33066977c846d916538e0f87102f8ae2b4d80ccbb28967e755d702548512d0147800c3416aba6a7ba661457019e084105106c7610808f82e8bea4e1cff09704521816207e4978fd51d1551e9b5f333fb33d807c09eea9624a25cc4357dade8adf7de9bab85bf5e793fefac33c66daff2c51e903edbc859e4a3ca35135ffda8720d0d448b753ea1c2aab9a91d7d7dad2889f278fac502b2bd9b24969b0f2f0f3eba244a33e2f9e2e0ea7a92ae2bba8a90a85a6bbe811cb2aa6af2e8e967df02e0a34f757bbf7ff4c94e890025c03251b6410f0d2e6fcc0b9d5af1ec4083cb54135c09ead113f8d002b82892bf1ab8400928d63ad33857aaee88647a2fbed63a430755754a6e403d5810f8272327c221cace5f3dcf5f3d57f9479728361cc5e6a757603ff79f73ce04f8a8b2e9f23b3eaabc9212913508a46c883a6b2b9c21e282806f478f2e0b228e94e62eb0f07098898379d13250c6a1f89c427e824a389708730fc4204c79289f2d7e187c54f904f1f3795ae1c82086a808860ed0d051966bf6b16fb9303056b31c91c226d542eb16e86c39511ddf7ca6461840e9a43280ad2b12425a19728a36402db3aa9c69953a1ffbd675810ef8a8d2298493dd3f7131a0662b2ff450a4407d7138b2608fcc8e9f5da075772fde7696d29a9c207c747914faed4797c79d222d17e061889121940337a385d2c52c8b317ea8485c687a9232fa27ef4f7d9af5d327a9a01ffca94ff15cd573a49f5523f0b774f66ceed9a7fec529160ef1afdf4a5211a6e8ab7280dfb5064d662c055a144e8af5579a2a2d2ce38e86b592956fb9faab2ef2a743a4c6dbe9678f57bcb519064d69b0f991aa0cd053d10143de50565b559e722dc4950a9c8e66a038de75d5a521ebea93cf99aaa17fe2eea010bd877c789706b0c1de4b2d6d2290502574829454796e3ffb9f9b1cd0a1998143024947436b0998d81b3b83217b56959cbcc79b9f3d5626877ece563fe76c0167ae83a10b681e32a494e4ac33c6caaa26de808f2a9bdafec6479d8eceecc2044fb899bb9aa6124a55167e6830ab5e5260cc5af0bc6aaf9fd3c7bef5cb0f0b4419aa508a6c4c1f3c22254c844ca9263871c94821a6f5288f412dc618a3b9e6e38fb16f31c65867ad895e72ee47bd8f7d8b31c638e3d57581c7b5bff1d1e511ec9fb8acdc46751eca38e38cdfe58910f828c58a22d98f2e4fc87c8e8f2e4f18c30ef0e616e20dc5db1d73cbc47ae2c154bf9211c6d6c665c7b78a27f4bae7b2e1040d0d2a64709948fad8b7521f634ce2c2a8eaa52ac4998912acfdaab3ce1a44c718e3eccb3973edb0463c1ffb16633cb2e4c08f2ab7748affc4c56c3eb4006ec6dc5d27a009d0eb5015b63f638d57bed714b419b8302e30c8bdabb63887485037c03973cdb5cf396b1464dff293f6bf2ef72af0ca4d7d8b414232b8c009b6f0778c0f39c2315c45502ff4afcbd155a469414dd7acbc89bfe5872b7c00bcb3ce3a13c57cec3127e2f0b16fbd701de28c31f6fcfd28d3516d434f57dea522a362bf62ecd3105cf73551fb56e50095e05108a49f7b97f3b5af3d6e5dfcd1a01ae56afde1ebf56badb50e795561fa5317983faae47af14fdc34254bc0174111d657e85f097e299477b82a7c87420d8650450c84df5566237d85fe95e09fead60d15f5f7de7befad85c257f8d4449268d1482a08108109a99f1001e190c4ca3861047f74d961ef9f4c0840b2ffdafeaba0da75b03e9f75db79b3e9e37befbdd98ec271ae7bce28c7fccad8f7ca8abf3ddec1ddbbeeba7730d3bbefbdcf7ed87d5de07ba5a6572f76f5aed007854da1dcb33f0c572bab0cc128ac963e5c3970572407d79ef569efbd37b36773efbaeb2e02971c95acbda1a595e2c612e8e8d78213b6d441cd3148aead640f7bc866b23afebd3d6ffbf65e15a6ec157315a9d039c8045598fa34a3550d27322289a08d45f4f7f65ce86fdf62f87bef13776d52355c8410a154b2434686aa105b090d27289d301088fc7533ab6aa59db3bf0a6a1110ccee395b117b5191463f79910a4c8e3aee193319e70c7c5b56115e56a3f32ad55c3377953caafb5239a9d4a89eef504eeab5ae62563557a6133b7fcf94eced81ea065bd85445d0ffa7ba5411f49f700e3ed47315413f66914ac69f3fba34f2f04f5cdf26c160017503e5e5b24c2e9186b6ca82660c0a23caa2b3fa7d5499a5954556d36ebdf56edb03ba9570b3ced885f051a6b6187959a7b7d2502845bdbc1115c3befe1a56f6d775a51906a3caea0ac959136635b6cfb2c61963cc3db0502c40014d5454cb3126930955c502d20a0b891fb023a70f97cb51de574f13849ab2810c95231633b532a6ce410c4b7b2c56a45043da80bdc2f8850ddcc6a09a3338c4358d31c618639c33c6ae0bfc8adbd80d0b83ac59e70ec2dba48ec15a6c5d71c61983b5ac2b589557defa6e4492f10d6b0c6d8c69c2555130dcc4f060c55223369475d6b92d0381c08f32b509a9780363130064d5662c9343127aa3e1e6c3a1127d21a6400075d8eb60c564e19ebf37b49c73ce6f586cdffb89cc59b725f70fee87f5f9f6c64799dcb6369c98367a071fe31e86e3eaacb5d66075ca30978f31c638673037160c66014ab0b2ed6341c555da0aac1e993c117b3f59329ed896ca3e78802026e2c5880c039133add16ab96d2d7d50b82d35352d316f5c18d7daf43cb0210ddd90c0697e48d138a43830a04c9b80648d379b310c3e284a1f72561d792a5459682d4aa8a570bbb041e788d403936109f1e0c94e0c2f036f1ec4725ca49a70e472bef6badedaedece7db7aefbde39eae8f498eb811e2fa98e2a6beaa7efb51a638641b73870249250689a2d8cf4d041266613c1be430e8d891987b010ae32026b322823d18463560c0c83b5b02f9a947794adc7a002c30080d99187a4389d1e3d028103d6629284f0e2ba4b2ce3a47f50ea2b3d69a98cc3a67b5f794e0c1dae1b19952828911b33e86f071ddc7186350e3acc6c571ae064609c619073b7a36449b3e92a6bffa1120f18f26893f1b5e16c2d4a3a9e7a97f952c9070c36b021361c7c602899d0c40d7809fab98115d68cca627ce52703eec24638339f77308671a61bf7a8e3f9a641e3b11dba7bab6daa3b0706aecaf410dde292c96d7bf12de9583e0d20ba9127c83c1a0501549fdd48aa90fff24b8b31c13c37aebada97ed69962f122459a9a595ec9c90b55e37af819e4671a18c099f194480be24b2e1399c9cd6a557edd413925a158feda3f9a64ea7523514eceac4a498537830421b28ada5c248996167062e8edadc4e89015e75029a632bbae1d172b764720a99c08d2beb8aab05ed2b2d41722559b94b32982a378a7462cf47442c4d461e8552e13e252a09e3d2eb8f43cbc485641e50e19a8d64b3fe396aacc03886aeeaf00f828928ac932c43dd569577f5dd71ff4c260c6e8d25f3de67edd7e5d57d49f08d7750509cae048e142845e9806e246f8fab4991bbc7a101f544552ffe0a34a34b57fe25fa686b666e811b78a35fa89ca29adb0f0883038d9d460886a2c1f462c6bde3cbc982da5f0d0c6a12969022723a9e7a97f533f447f698c13e10ff9a94779ea5f5fca62acccbbaa3d8ba37008b073a9ea09900b861f25ad14b929275786b9310026eac96384a5a2469ae4c039474da9e59c73c6313ae3ec2ae59cf3d40b9f57856970fd9241e28dc5531b916d0aae454ee9b96d69c9231171ce2546658f0c270c570efc5a43a64cdbe90088a86887ca04066cc3a5171d3a1d0c2d575e18f42b0743a71464d15239896ec45a8c129a083c17751ae9a20650a5d1c0979587343aa2219fdee57c4bab1f4c72755caf76c85c709651707b2bc403b538a5c3b5747921146383b7ae20a833af04ccf8bea02142cfdc6d79ebaa18359bbbde03fc72ff4af06a99c37857febabc7593561110dc577e6593559e425c45388ad286fca6c1e085665083a030e8a3e14454e3a08022d4ae186d6589ccf60a6a948c4a2caa289aec394750203a391cf318e73ebef111d2cf39e885c128df34ae18796482b3190b7149d34a45ced97d812e6e6a32ad5a1ff4c3cdfad2ae37a0c546b06c885b3582571833e2ef98d20faa950094c05d1215f802f1851d15e7827fd858b0eac6627e4aae9a4a306e0916d27d4b9a75621cb84fe734c4dc7be73b4f1ffb414bb37b862f73ddf7eb025f9d96eeb453e72bfbd0de15faa050c7c975ceae7f5de0bb83dc4f309882ce7148b4c1afc391e18491e32a8256c8bee8e3a1b9ea853e98e3cc3c29b86ba6a20b8474a7b8ae33751d39c435028dfb6b756b230700cefa320727050e6a6ce636655c676e4ceac391615ebbaf8308fbaab50d96bb5da10f0a8d5d5d67940550a39e637ef3e4fbb8e1feecbdf7eebaebbefbdefbc7c5de15faa07043533bedbd6d6080ebcd4f16f2b0fb50bd2bf441e10d13ab75a47be3105711d4094705abb3534d17ea3d850d4249b3e3de7befadb350007799ed1f2c584537cf303d9a3860981d256c36688e2e4b4ff117f3c3c1b282d31a37ea627c5f3c146a9a481d111c28c820a398371466ea7466d49c565a6abae66c281485d460347415812f8518a60ad30d8d9a93ca914683517d413eca74b314c1c71de60cc29d3e7879e4dca2609a028833ed551eaeb50dfaa07702c1c6aa64b5ae70e9578fdb908f32dd880d370ae7fad7b218caa06bad65387d326c0ab2e89066e4c4cc55b5dd75101faacc0e92da114bf3a14ab2c8e9e06c4e1ec457248b17577b57e8834219427b75abc939e371f0ad7b06be47add7b716a31c73b6963c22e79c33d8c70a7cdb8ab86a436d53d35823975400db9022eaf45aa88c5656f0dc52b21af382180c2956e4e272d4f81615662a73025b7825eebafad7be736bf9c1cf5a6b4de78b10b7b238f94c035d3d2284658819fa03cff8008c7be4b500b73a806f7315413f325577bd2bf441210da687bbd41cae7f5de09be7d4bbfbb916bcf3ad37bcd00785479d73ce39ef3e87c47f7e069343caa7b77bc40d229fde6f48b3c077efd8ce05ed8ee7f4ed703a23bbe63cb761ef639f4bf1d02ef0b53bb363eb18580ba1f50269459632e3678f5b181e565c99f96932ae18e2bdedf25dddd65878bae3921a45bdbeb12be64fccb496b4a6719d73c98ca2d67a383261d89bf69eea70b983c738cf75cc5e52d77475935c57ce6ec99e1a31a66d6a7bb27aebad73ce39e70ef8f0cc76aee2e283fbc1d5b0705dad994c8f7bfab860b85b1d9b4cceecb8629fcaa0e3901c0cc54d16da423158ee476b5891192ca54605be6fd86d43c953cd295322d79441fc4c33283a7632aaf2007c9489a64645f1be964d914ac8d517e27255c84d72ea5ee2df1ef394bff7de5b0250154ae02ef07d3f8a6c01038849b89cd7394fc8507001c74321eb872b87c2d611899c61d16a518bdc4ddae814e59853d07aae4e44c71a0a58cc5504e5245dc50cc3bcf9af828aa283f5e536aae9db2c0a6240e5c95861d41281726cbd9c5feb0ce8d698990e0a201ea29bccd11d0cb8d65a7b3533c8af42effa5a6badb57681c930a3f6adce5a2fb976e252e1fa7581af5731ff2a64adf5bafb1a43476bad99d85d9b5f6bcf5badb3d739e7dc656441824e5e6f0f541e089db6928cdabf5e5378515c45502face064faa0e7e0d238386b54c8b0599771e76e1daab263261c949753b83a6efd6ca7aba41f93d1ed834213a90ac9763854b5782b33c34aabb9072f79e9082b065594b168808f320905fd6ef40f59c2e7e5aceff5125e09fea9a5fd55c82cee7ccfb34ca4cfada3bf42ff4af04a36ac6333897d732c1fd73d6bdeba4f479edc7b0b871a08359860d43deb04fed466ce54db48780597c00a1f1e0a35182e9b2f68c85445c9ccb8c082fa90a144b878a006c6f2a9b777422b262f4f2b1a93a21072c644c6994439165d1318a3fb22593c7d28b9bb6b10ce39f740ceb7ea561114b7986377bd19e6d6b792f1b43cfba2f85993e51d244877018d04531c9d0a3bddd4e1e38d8f814252c25aac6e3610c1f226ab69310e792b9c1df306d19c93b1c4e415632c74ba19bdeabe2ef0352baece8fb16f31c6416197faabc09d4dec5b17b8012e2b961931ce3aebbce28c31cafd70a3c8b53af87aef1de9db9bbdf161ad3aad05e35bb59ab98408ba9faa32aba48d52573ef8f15a436d73734320824d5a295d2dd92aea4ce3c7754f5da8755c36e7b35f2f61f9f62c95170cc2e5f7e56f890b23afc03186c69216565272cb989bb67804d0a3826b28850611451ea6cede490304d3bf16b7c8d25abb265942beb56577ef47ac5b44f58e86004db0ea78168b9c81125a221f72cff9afed1f5e562cebdb2dff5945ba3ce4ce967575a83fabc89247e7ec56899b034ce89725b677ce5908e65c45d0bffd4696510f1143fe5aed5b9f5167fbe6aec9d70f677f15b818131f407b97ed644455046d291ac97e3c999070a8c1d08f8c988475f1ad935e412ef0d52c580ed6c8b169a278cd58e52c98af3fbee6d11bd4c8f6809e846694e8e1c884b29db2a0b2112665d86bed71d6d4d7be25e308311123ae5a6bad87c38d1093b0176d5509275ecf7d524435dcc882c8b031ef625345d03993aebcfe26a5648c6fce5b235411d448c964cb89fb3c0d471a2c262e8c6845132e67988bc98b23178b899633193595c1cbc66bc79530f5bb735db727ad70599dd5debb5bcc46ccb3d90e3c324f5374759314ce64d2ceafc544455175f7e611100e278c3cd94c60cb5cd7cd20697c5fa09bd60280e44c84175d18243ff440287b9319721e90fd4498bb019a7541785bf908ab7b6006a353e02b865c4550be44ea7480257d34356b5c183f1e4d4e301c61c68e26152f1b6346b72988c3cfecc8d15443d33abb369a56647ccc1fd35d0616f87a31bd9aedf385048659dd564c579329434256975c2101730e199d381a48ce8a342d24683f4826960c5f60245f6778199cc44ce26c7141a6b8cbdd77c47ddfd77d5df7d500588b79391b21aa0b835f85cc76be4684e03127a921f4c6a8e33d3f00be175a56113402f742d1ce17c8315769f6afd205c18d1105e183467115411f705f8c23a047ca3105e88b21b4d1f1bac017afa88aa0c64c82f7f3f1ab908580ab981ba3e641ef9d639e47cc6bc92be619f37ef284f28e1e3a677d8701078ad0473976f0bdd5d0801b98af10551174a585bb2e8a9593456745cfb283922737f90e082aa221123e4fa431beb79a55841f5d93ae8b6373adb99a8a073db77a6059ef2cebb16dbc435a2b302aee56e08e3958494fab3a165a20a9e444158f4ac009bff2ac6befbdb74f6b35123f1ff04d79ae22e84f3f5dfdbd73fede5b4e6deffdf36349e6d45c7eef9e03d50db6effe557b7fdd9caa08aac69fae5bdd4bf42daac87e2b0e47ba1d27c2a822a8cd27eea8542179089293b2a281a1c3e8e27cd033e3ea7ad22bc195e6b181af9d9d1dd2edafd6879e715445d019499cbb45b6a7757273cfc057ee4c8e4d6eceddef8adb078bd2de7bef919ff6229b7bceb9a7edb92bf1dc31e63284ba8ca35b6473d659e79ebdb536f15b812fdc13ae2e73d408e13ded10b121e170d5a83b188dd1e0b5105bf278a828c7fce95445503592e7d35d12e34b681a0773dd73fabac09724af2982ed5d77dd7b44248d289a818243da2c50377fef1d021497bc21b267918a929d7bce392f9bd27c5dbf78e11cb446a615bb27a1c19c60610547c9c3d1d30ceea8c57e02aa1b1ef07367e7dc29811736e2852b70728e2b99b6c54af26dc8f9d89cf7387ccfdf9bcb068544ddfe2ae8ad1abb7745e8a8e7986b1d7d7b375308a06b0e7c85748952158b151a19289a69ed5252b5f93967be41c68ca3598f89a392dcfbeebbaf5438ebbc7713c76fef0a7d50a8d5f102a05dffbac017ebc9b9551906f94a4da983cac3eaaa03ff282573ce23cb179c154c28b9e51017063ef6536b6892a4ba748ab0b47c728edaab0b665e6acb39e7ec8424a4e6449a384bf9d948ae9904a81a865a8e7a66b075b89055144175816f5613cbf9a8f0de56411cbaa72458c5bea521079984a8b44c5c499542003b80048318000000002049b238cee39a92031480072fdc5884a45c6858248d43227120200ca22808c23006c2208061200682310c195a0513aedee090e7bed561a3efe6926fa125530bcd83c7dd3ba762518279e76edb9ee518e63b9339426c5f7385de71f6117d3b3c5566f87df3b4123f0885760cd41a73fd0102906708e796af051900d719a38ec54f95c737a8105ec9d2f9b52216607f0715ffadbd0adf3fc927c3ce451309bc536d78f82a21563f094a3901cda60699a06d7e693b97e6b7aca586b9c75cce4c10ec9cc95c1b3bce25df54e2e9eba0e7e1b365622687f3535bf762aea430496c7ac6cb324e113a68789002286a68f16721df1d239c86b9124e1ebd7258be7d30007608e6cff5a90b2e3b1648c2bde919868370e4b07a1b93f899e56e1f285073660ec49e14039e0079aa0263ca3f13713932ec1293db7c48468f67717a25e5688ba11496e7f8de104452ff1b25ec58b082788e160089b0bffab616f837c8c0190dc7eb16bd25a99e17880d33d2485540c402a7937240a3e06a433eea412a1269743d3bc8d526261621096c128745a38dd908c6d4ee0736a90ca164a7b42d3c683fe2229ba2172ba24001962230843b2f726285310bb04fd3548c7fcb8d896886e12aa61bc2f4d460204c14ef52b79d113c5670bb8915bcb5671c0dd35efd427346c73601da85392569dfa0a82ca4e5dd0e64457ec30a5dc0cd9728b292006f84a691aca548d0248af0724e45ab50084f217e2cd2c38e89012566429ef909f373518bd74f3f4ecec21a4e6a8608b50693654962d55103b85106735e0739b6002e431bbed6062140ab5dc11c29ac521af203015053574ede2d05c496cd5988da385cee1b0dc732f55ca2c0a504022066cb84b56c656e0c9c59f96341bfa1560d481032a19d4a6eb9682eed4f9a7546fc01901dff00a1710c080e76d0f520441cca1f459db0a800a1490cda0ef165732e80fc7c3d798483da09a1b49e1d2b580e83034b6ac73f899d9448c12416a87dbeec4ce61b945122a44f1c05f11db145e1071a79f2614376459053b9437e5bdaa915808b361f4d81c0a17a2489d2b81e2c9600935f394f50e82baa2f6dc50fe9d38c8af93cbf90ee50d6ec70a81e9ea3e7c4e3962d5d3d4fa305183f7ca0f14eceb7160d6c49bad5f930320a8c447814b6ef5593d9e29da46fb36e30caaea4a7c2aa233c5ac72e8f572a702daca9754ec23edb0bb4c256d3a67fcd760a385e0109cbba89d915e3d8b10cbd93e736c3a7a11b13f652284f6bee016e7c2f158298565da58b5fbc7a9a672a256c609bdb94530c8aa46f46501cba9d3647b6cc5e07e306377f5ea26e9165ccc4b21bf756eee39014624fce1b3545e1cc8cc57afa8708e4bb749b37f719a406a8bed994a9f38475d7f6a090982bdd30fdefef0d2c3845f4618c505c49f5c759227a514b1f5c52008412a61f95f0f104ec25e19ba8418a90ecd0a7ff2c06f77393dba29a540a76032397e121cd205243a88fbba1f77f1d0c6dd64f691881199b8160b3e544cd779ac9b5607e0778c5bad619000df067805764366f8686084ac58241c68e1932d35db7f593beed4a89f8e207352b47db97d5b6d2cb5de000187de7d47f506798aa998341b8c923fa950f968686f146370833c52fa37c2deabfc6a90b1f528eeaba0d4dff9c773d443b0c2e5f936016180788e1ae3a052878c6040c7de4dcac714b5100abd3b2a6066f661b2d4e4841cf93ab7a2d7b444038933e9761d7b89dfc9e50bcdd9180aa1c65bfc55153601e126ec4c01d7dfe268ff1e54acb329370d4abd9bc1d822a431b8d1b8c11682f1a5c8abc7e9965c87d274f41066c52a86b35750570a184c3326579251de991e1f7d15a110e46c393bfe822969cbd3a76945e85c7c3d0b39182967047189a070dc7b160bbdba7b6f1334fa9476cb4c682458a94eab31f8cb7ec1126d8c316e24b560580cbb7c040fceacd9239f33e9f128078abbac97cf0ff7b31fe886c5c65d137e07654676e15c1817387ef970cabbe2ac45db806d7deeb0954c8cf42b713e525da595c5499f8e6268a321632638e802d656091f3a06733872fafef8ee996038919c86a03c9b12e015d56d3b5f3df8cd74b398c61069ecd52dc9e01631ba69c6e422537002238ee8a6e4c703ae8e81c8d96b75822f80a811ed64edde116a4d817d23a9b4ab30df2c77033cb8e0c97a7e6b33e0ae37ced61fd8e4d6be4e6846e7117b6c73c7a0b0f5eb73bebb1119b6e9b93da9f8e278695d8e8b921c51fc812c564c382035708b859ada6d22f1d7e2dfbd04925ea826c920873cb33ec5a6854ce2b394d6f022d81857b71fb43aa0405b7d9c45c4ed3de30c682c548b0e9bafd26f3bfaeb7e7c60750b00921ad3004ced912152cd614203dc8b9e51e6a51c1acf2bda3613ca07a76160e67ad5971acb76686e45ae7a999ba911c49496bc51c5f44c0efef8cfe7d43624c8f04475ebf67c4c7aa2da6f2d8e69d9302f674766600474a7ae46de7b6b58d05f05e142c9692a72226977aaf60da58d8aa3a32a67d0c576e8b7dba46268393e79d997d5d43504f387e8785eccdeaef368ceac4b1770925a4517244daedd07a9acb0df07dadaa5fe2a89656347398c84f5630d685e6a679c06edab2629336f8fcb5598ae0335f7cd3969b9fb8621398f0793673892f9bd1fa78cbad367908f6f76b539a0402b1ccdba3282a0880e2e55af7782f8f89fecd31dba257bc1771ece20898e2f6bc9469de3c5ffea3139067f4e7f408b2f29c109d584069f288c1f9d44cdcc56510a2b2069460cf01efd869d43386f417696dcd1786d6d073f93416531fe64694d06b8dfb0d8bab02f313d03e4c047615a4069f6d3b566eeb1e833d27b11198a10b073dc1f1e805a8463b44cc87698fd0e81ed4897079216824628ce5ef890f0bdefc8c4a6e07e3570b3cec79de587dd90901e5e4e61f548210c8ee48d023ae438e4545d0f5e20a2ee57e93da2e25a2bbf18b4e5eec4df371af50271ee0f89408aa318e729212a4360a1210e08317b444429406857b643df361ce7272eec712f0a6b3773612dd4fd7ce34f6ba9af40ab0b2e0c0de46483130d670c2a5a5dcad93388aa90a1a46bcc64543af505989a8e51492587896ba4319719c7f4816f4c944c87b2f00e14eefb52579a0358be22fc562ff6ee134e42fef8a9b467ce20991411707eb334e0a0a141b2232ba70284b5fc7a6a006cceca947b935d3eb36b59d5964fe447c099386f6a28f039ed8edaa682fb3d7459f4893fb9b9325296422eb4e197d062a98bd2bce676aaec5fbf588db79d449af45f69c635a71c3e0460ec4a9e85c5155eef1adafa952b240828111868740c7058aba2af6dd0d2726346a2fc0127a0a8bd5409d427f526a78ffc1b7df270d503cc606410ca015869eb90626814258ccc0da8458d72a8b4c00c5f69042d0ceedc51773d2c98041e3176e1a77d1d1863ee936333b4ed3740694536834ef9083935f184eea5eb4396456bde1355a18dd2d8ec3dd7363420d869554c4cf9e64700b2eea3ed1557766c1751b8c59ac00e2adb945b6a667f2545e50bce620141ba249fb04fb1e640fc62b7fe935f62b12553e0ab25a37faafd313f6d8c4c952b1c1b1ce10db54e924ce20f46be474826e0477af3b82ab8a9b2b1fbe662952b25e27649ebf56fcac611d1c3775f084c4894da0bc3e3378de73df5e85b49ca07d008f107479b0be5cb047b203527f9d142a99be9420d6747c50a4878a2d2f5a0e447047966a212ad8326dc8bce7a66ae352dccf79c68cd72a0dce3b1aa98805c22208ae50aeb487026c97a72709198112718c3c67528610f781620c21c07ce5439c8bf0d5c1297a3bbb7c00762e0e85f1c9535cf8d37f66fdd2ad65d1d20098c41af4f1508d54f3f6717dc6a173ee7fb62804e64ea30e9edc896304ca8e80dd87a2d482536d387882eec09bf6a385faa319ed435c733614273601a2d75cdf9c6bae98ecfb2ccbbb95d3be42a6bc57d8a6da86fae6bcb1abe3f46c6f04bb57d2625b480275de0bba748ccef6097bee50d9690096cb567659d8df02266f4644a1e4d160fd4a4159f4f348e9cff0e58c601c2292dfd929f2d67c9329e7558c97a925eadd239bcc0ad477f7078ccc779165927e46b9e5239258d9782be9d8fee7b4a5c48de7a6216e384a68a14bb5470a8276ef380fd5c96d04619934c2794dc563db2b1f3ac6a48d7a781680b47bc841cd82453d08f3c7e03c9979fe52857b376be9ed27230bfe4e5747cdf1e951123d70a9820b27ce5fa6793e860e69ff9c51219f4a5e337f0ea2f7a0c0d1fd09ef99ccf88813eb447783d7b5dabd88bbf68d0fb78c5cd34e65035e4900c68be48db5e4789a1926c7148309f86efdd74c47fc792972f71d023c0828c9d43a6c4c5cfbd61a9350f10bd591d4ae9079201bb201493d958cdadd4197c5d892528c37b9a0cdee1f2f27da90a4e38a8659124626a439f21c4624a99f92c84b00d5043f81ae5476b9f9a86dca503fe4abe68a5839740fd674ff35d1e1dab7187ad39e365bad63a85e8918fdd0d2e4fd6290acb7f77f5a7d4d6edd102a181da45e0e102c559de6dc38d6af2e35a98dffa17ca6363c6b4e57b6a2d437133818b616e48fe3d1367354808ce712e0b8222b833b4efdd53d00638ff8061d93cb071d0ea7633f0e6792960b173c328341d18af76d92b798f63197d461d9fb3285bdf8b5fc83a7333c3d684af8b3cb1d8d2034383364d8be0c302e9b7ca3026360d1f3cd34cbc0e741c02103c442b0a7a2de066ce3c438cfec9a8de8a1409bf42a90ab919af1d95d0345f7a331ede60a74894df74e80d0ecfd476ec8e9e441827aef39e562ab9f136b1f17b82cc6f74a6c4d55b0fbd5724e5ee08ef37bae3ff0169c60663807935ff889f6dac747cbc3e40af2345f29040f061763211fd9968dc6f24847526f5c0679d69d5483529196f234bafda523ea507e863432530bc99d7a0e268244c7de9f48a439df4d2ba2fde47586412e4103eb0beaf441435bd71e4673060ed8d86701c84d83559ad7d558433e6cb7ad4993d9b1e44800800c3808c6a4a20ddc142a8a2c58c2c5a754062e1e067c53cee7a2908b4a49f9ace663e2ac9c83a3dab6a09a14e944836fd47b0b8f8bbbaa8d9d4a62ca64e638c220035d1b665d332def587d4d9f461624788e86acd2f45ee1b0be39484fa87c31d28192bb1e9319821a4c400d93420994f11e6016f85e30e23e669b1d36de2ed7980191c62c4d61441c58f20e72a9b90433efbd2f81e46e800d8e7aef513b3991a3dd413d3ab664193e81c1e970a66a83cbe381f21b2ab2789d9bcdfe1d377134ff379e7dc2ea0d884d1cf1085fa73033b1e6e4c6da98a3ac61591c53595eadf67fd7422a39d7e5602bfdb44a8157547193e40744af258e748500d95966b7a7973d8361b75a2a7e043dc3b1aa6d6ce58d06bbaf30c679dbae8cc8ebb8a1983d704a0928493b20b5afd835e3c62cb96801b438a6944ff80df519d9ec80589eabd2f8401e4323562d130fd8c4d30da344d6187d458c0c568e3bba31fbe174a05ed4fb9de0f65c4355a0118efcc638574d68c64bc120b3dccbeaf04bf481ee9c53a762590076e42386dd0e64654ff3a8805740fe02a75fcf438444f80c0cfdbbc1e1149233700a43a3b30d7135510565ea622162e247b76a4372efba07b053e15a8adfc862583e8adf6b07ca7a2cff6990c0c7715d69df67b2c8d7fb7f1fbc199cc44d10a138a7cda2f5da28a292b38d76155f1cff41592d352f06d8111b87dab83579afa47fdd6d1cc7a3d1ec44f96fe6bcdc72882054a08e73f92525e0437c8642baba14b7e98a8f67b18a94d6aa30d5339395ac96d946962e3c93ea7a0e163c73ba34e0b0861ce295a5528bf0bf2bdde6f79b267d19545cc02ca86d8895d25283d5501805aa88e13401fcba56b8a7d70279cb6de72faa9d4cec2204e143c27249b33813eaa4ee9e396989f3e012f3a764c9a5428c62dfeca95b4bdd9db0560a499e0b7a3a8e66682f13901c7a30c9221121c41d8d54a9544fb90c2930284f1da4ba45a1a47848c9331df99aeceefd0f252f23284b84550d314b53247a5369ff830c4ad81314b1f1ff418e8dc07064a26c18afcfb29af8481478f9e6a93db7287bf998c6ebc4b2c03b480b8caf7468d0a2395516073a64026ef01175ca4f1c6492094930443e008d170c0c2ed5b52ba2c41a7acf302cc9da75311213a0b42147ad5d912a250b616dd816b8e776f1b5e84d5bda5520d862e0b31b0073eca19edb03ea7ef6bb939e5f19988f902d9ebbd1dc46f04215da49cbc5537ffec1a02f9e8fe52ef5f345d9f9c27b5a703f75b480f81429d61d194917c0aac124bc362c8c2193f851df13fd8b1884c0dd42837af964c6912c946e23ab8763fa5b5174aa50af01b52896c12ce47ca5fe46da385dcd75c6769e9c4169529b301b6bc28feccb4e3664b2966a57ed90144445a342a9930182a5beb3c281e2bbdccd8af3ec4ec8f9002359bb5090b575474915444863b4238d786a586765fd2b5946f466171f0b4a988574a37747840f88606efcb40edb8e47d8504f025f4f50c15346e9797a5aa170b5f15b32a973c0f472970dbaa59b441928747cf2b6a0be37c716aa7461b9a8f956f3e6faa53559fa6f46b0ab40cbf55561bef943299eef8a75fccd0a8ea35254e5620e16b03bc74f97d03861378bf7c70c4a936e2c66ebbeeedd28c4cae49bcde69c191dadfbf0e51298870f0fedb00d43a6cc58663e9c0315e04d02696dc66aeeaca4dee420177f9b9196ba812d01ee46d6d700c837375749bf3121343b77d36dd62f7f2aa8e923503621ecd1c3f9d121e7d33598722a87b3c4313c38b07437f2a1a6a9689dc2dbb50d1c6baa0c87ef4a658084e8bade1fde8922307ec5ad5423b5846180e8fa8aa0350244d0b55befe369906572055bf935d21ac80d2ce1b5837ff35e6672a15c2bfbefff24e60c28b8a07cc169b09d50d60c05c01edcca7cb012499e4f5f28b0865055863eae8b6a7a92c40222cb05a6fed6f480d03f6252bc1bc91abf29085e414f532544d2f17c4d96acb7ab33de8b5018ab5502ec9702780dbb17a64751544acf9db3e7711ebe2b5bc8505e4cba67ef31f114de63d410a26d5a081b08a90567b487cd8662143a03f53a5075631948b1d70d0df14eeb55a25a3e74d99db86f35d16ba80aaf064bf2f185e64f8dde9e98d9e1edacaeec0b78ffee62f0fd7c08748f5c1d169d74deabf8f655fc69b28722e6d4ad0af56d02c161399a089ab09ec190204eabf6efa13b702d6f2c2ae003e634d13ab40660494ed8d7a79400629a220354b282934caaf93a565201cd0a2045d1baf493cd604533b2d4526a1605411f52046b6ef65b39c22845113b956ff827e66da23636dada41e78800d04bb0505191994438c1202d55f828adaf74e9d9bb5841653fcbe7e76204a7cf7d5d26aa12a2565d0951b5e43723fa889f27550ffd221b1c9da2a40869123f924577260e786a493953ad4d3a66c239f1eddcb3b4f92d4d77f6f80185e635eff35eec6fc2cd6b28738dca7a8273d83293dfa6c3e824b890ed4c6e7624c95da7b133f9bf29164ad94be2ef8b85da452e8058cddd30350161518eb43f0090d1353c65c35b64327155dc9b46b7934c64de6e5373f32ec8a66ef9d2dc28e9765cf26404203d9dd3c428ee081e51f73e3f796196c6ccb2a688497df2243f634a4a11ea8e01e25719f67a7593a94d288d43981a867882789bcdc92326826a4f21a6362c9df0a70ed83b93f5bb6211f55faec96e9f3ed1dea90130e76de615be75c28dde25c2e4ffa61844b9f3f6e6c897feac2f1655b3572efa469a0403b974a27d36c1c68174ef6dae91650b2d556590d4d358bd1a913afe71a871286f3a99367b736a15b282ec272dc688877ceff07b12410f5f7a01cec383c313d456ffd9174031adc426e503107de5e61b300dbd12d11d4115282a75e8ed5d7042fb9e21f19aa86b9dee09774e3a722b88687807af08d7c14cfb768529e3a3b55778f3fbc15b9a9a9e9a1ed99abcc11ce0ada558348fd07fdd323ea892924c50d534105030686b5e38ac7c1f827d271c453256b38813af54008367e3485a35156921c9f84cdedfc2eb8ec3a542de5e8d0dcf9c7a816e8ce0b18f0539cb57aff61763864998129e2708815c97e41c5884b081c7cfb9de6880797fff44260fc0aa27cf8779467a609e5e9fa2d4a21ac99bf2a46040c2e7a7227932cad4b767a3d00390626b97e5b3d6bafd3d2363dc6e41026130ec2fefe53327a9dbc23fe443353193692a63e2ea10cf4170939fe1255bb4412f1d839f1605f891a9553114847b8ea9b4b6761f3fcdb9060bc7586169d149fab876de227e3f0a408da4e75e3c460571b5d131083204cfc57686e2f223942256847cfccf0e0e514f4c2d05675e81319b9cab4d992e2108c1e669c081bae9eb92029f79f31218ee46ae6b4286b717b084d8e4c51bda25dca71add8f5e72019e92962673e143f2de6d9f09913cc867e524b2ca65f08dbe618e913d1dd3cf42692f061a9fe0e60525eb0155532353d9e9253efafc5395946459a83b4666753061d8f2e3ff49b9c0ff65d015a27e66e00075be1f08a8797bc7ea42abb67cd01af16311647929a99b930fa108025c170386c9b83dfa911875a0efc7dc1d617a6d94195b0e2c89e7754ed8655638120f78adec48e67e973cb2ab2db3dae776653ca00e54cf8fee54afef0e0c6d3af1503b11c8e6f180d83c96ba9ae90d0cf13cbf640b1da6e826aae174b40994cec94e25869132554bacc6437d5360bb636f80a00c19297ee7269da82e242cf077367276b5539e253c676789eddf897fee74673bad7221d1deb523ee3930e0368ba37b6b700f83c44282c6f9a63a4103be5d0dab85e1ba78c0ee6fcccf42ec01c3dc6c6c5b1c6d87f1ebb69f74f0f30cc3bb7122aa2ece869ef350825d372b35abac63fdd6931ba6b933267beb6f743f65b12ba1240c43351066bc97a8873bfcd540c6414dfb27fd396caea8fc76d243b62746c79c7836007571d31b69958204ccd517ec652a07bfa8ddf24fbedf0101362a8a44d6e4761e2b16cdfaeee1baf84db448cb4ad4b5ff7f92b97c5971b40b5d91469e396816749b7f5610c1f4b75ce569a5d96f515e160e17bb40e76f99bf39727681630e71230f2c8e7df0cdb0a2640f4598431be3987545a94927f863f9b806ab04fa36205c6683df6025cb08d5467bb90220795d0b28a031922109bd6418e3c88e999828ba921a81f18f2b3665288d5515812cbbdcdbef16adaea49c2315088b8dd725cb651ca6efa75624f3959b4a140764ed820a8132bc1ec0ee2d9e2f84a0a5b10af94f51b4752ddaf39cb11a9954ea35a9de712695cf7c3a7cc94a6d262c231b2763ca845879b2f858cb728e65dc05b79289e966372e2c4f4ba27350a8dd56da29438d44f5413193dee90e2c28846175cee9ee643d18a4630edcd496f7b5020273664138a280790b40ed6d74ca84b973ffa8942137d26e85da3f8804bb9008b1725abcb462b16524dea4c8005aaef965d4999a4955f5513e9964f10009b96086b8e0ec18281c226dc82390e124c08ad6ce99b1d45e994bea5d946a6899f9901cddab8de2c6e5eb0e216491d9ef671179341168ac8d118683f2ef4d566b5e8882626f20dd60821bee9d6957e255c23945dff046e4374a17d6a9eda1e5d70047e95307d6e1b087fd1e3da7fb1d9e2dca2705899bfd43ab7a588039c8313cfe619eea11dc5bdad34e3140659bd94551af83ba081ce162355d75e34749ed136a33179d364eb5802ee7c1615c504a914b20279303b7ea355ecdc291412542f113c8067852e3796215bd0f6be3e06ff22d18f5a6245eedf0799d302775a8052d0bf37f618b7fa4836d1989e89b4e5eb72860d0710bfb547a38d296e8e36b18ce6a143fb094abd51cb29d28183ed1ed17edf20bf80635c3160229ac10636de6bac25621a58764193b13f62648782244f5973b5fa11f7655ef90701f8e9adb850720b0111e46e9eba477474ac3deaabfaecedf8e661c801a41a4b96debb21f2e05c4701ce36a2cdb9690ea21a300cc937e3fcc852dfd66a47474f33a03158401e17f460545d10eac9f7726a76d929b78ea6d0de1873fc2c4b02f7ab517a4e0c43ac837ad6359317bc6035633e0a8e865d25a5090b0f3f543ec2115ff9947687c9de7bb9b37a42282fed9212cfe14ba35fa4fb61d21d1f79f09f0f3ad92c5430b2c2d3987b355238254f1c6039b5f95fd12f755b36e9e4840f83b6d62e2936996e072b064f178ddd1d1c1ceb4f42246be7a5a41e76638fad47e6f23c5ce69613a8db36343919ee93a060f18a8f4d0a5c0595a4558a0ca1f92dfc389f9cbef164abce98cd3240ddf04b6fca3b9a1f1b5ecb35a7e4eb6f47573a80e99b158998460cd2d1fdd921f8c9b82b5ba1799ae6e7a65fd9c95deca54b15ac0db8b842f8efa870d2b925e8370be69ce9468668c411e1946638d394f2980873989f81dbe38b465cdf8680e1a16ab6b8747cc6338a200213b2cf501a2723380f7376805f8db23ec6b1e87032202c16e3575e3974a37910f1c049d00204c8eb01a1a9b58d60e0ad8cd8688c7b609095eb9fd4ca690b400b271dbecfb6707f01ce7adf70ccbd0b42815889620b31a4850da60b270ac74edd0dc635ea319c8a6cf02ea391f58efc43acee72d7a40959437aeb5462bf5c3344652a84594d3c1eaa70854cbca8e1af484a303e7ec98cf9d468965d772bca5a201ec2de982a74cc140f52a95450ef10d47f05c686ef0d4909c7dcc4b03d849eb3f14d9eed3d4158866e806ae2475986a48d232017839daa18b40e0624664b3b11099438f2dda9afdddfe87e0e2129a1b2be67f60ef8bc0cd4fd9d21454b3789edf8a4d70eef4b7d26ec1bd19efc6c9b1f451b610590afb42187509e48f87c24923f34052b1ded9f178360927ba94abb7bad546c044d3e3df48270f792da9da02893d552267c147e052aec4237fe2e64b82bbca2e7106081e2a64cc1c4fe2a6e4ceb18301e19ce038a6637f40a8c47c8586e92ba60c04de431150f167479b987eda53e5e4c6235df3ca13447f3c425d1042010bd4b64abcc8a0fac254241260326eded7d41ef90311f7139bfd075ded55aabe9247fadc587f8212ca2ff7a1c4d72cbd5025856cfe6973993edf0ded19eedc22c8ab6f27a3da5f602984eccf37977a7e288eb5042105abf543e4a1331696d1046f89fb855876747406a10a2c58619440edd0d91ae47c2f33039f977f095b0a7e0889c6be489d74e66ebec563b328b344a589179ba26c6f4cf6b422a37e2c496faefebe673deb4d97aedf71e79315f6f0d41a536b12c9aea6bfc3767ef3961149966f4ef8a2b508f97bf855affbb4dff77ee8068dadcce3aca106c90e020ecab6fe203c38e7f1da4461a511e4c3a68b1e10f481c359b7f5f697ed6e1a477e7689c706a21bb5fe98c11c4d7b792418003d0bf5d7412a44ce2ba4cab0f8ddcaa9c5e2c928ef8fcb143caa4605124fa360f396bb87ef50cdec4ecb4370d9d273d1a02c278d44cf05644e374783294f8ac995253ef26c3aff36d5dc56fbcc18dff1d5132e3bcada201336e1b36a144b8aadc3a1bf251938e0ea20006106dadb3ef290aa595747076a0067ff07d3be49b09f9129c0bad076c39fec37bd6cd2db3d9b705252cc0324848d278025116436eaac3d6bb6bb24694cad1bbb212360e4a6adc4c5bddccd9c291d9ce45bd879d800b113fd5600d1d1650742619b1346876107e391236687ff50d1b4336305f0bb227900aa040844e170691e7c10b51e281a9ab5f4582eeda5b8b6bcff810743617bd6188e48fa684cdb511f52f3de656efc7c412989af19fbfd57d8bfa39b04260d12a38d2227acb9ae85167e8d7332fe9ceecc7d73527da9710de547e442613b5cdb37f1ddb1c60e541fb836a11e39e6d82d65da279e4e3c13bce3e50967196ff166dd82a43aee3b20c07250e302c53362ace34bdf18035b1c7a8005e4198d2f5f3629aaf8ff552bb9cbda37aa9025e81455ff5c58e4e52eb968a36a5887948b8009993b0baf43ab7df8b2bb368d5656b742259d9622dc640dd0c3bf682a9974af63f1de5108c2dcb206cf5731e7948430fab6ef9f4084622fcbab38639d8cdaf14b7f3872988f2bd38d3515949a6dfff1095a60c1312bec075cae174dc0e959ab865166d4c03f7a933d4420cfad062f4846c280b3df7ef01ee47b8ca6c09138e19d4a6e79571c7f0c4122d5f78329d7f1af723e538118bace8301991f068b35a35cda2b13c5580bab4a9fb0fda5bbdf582f982cbac97d7588a09da81e2bc0bc768de54fd8f2be268a4457a30713035fa6e27a23c7c40a41b83f63bd801ea444566fdf99dbd748f9a3e628dd90ed9a48416eef1b2e1212e6217af23ed81c290d117f9d2158be2266ba647bd832bc10a38876c7d81962e677399bbe6f9643fb64661144359e818c0416162b3dd216ea570ba3bf9cb5c9ae181163127e64fb41610222dd6b7409d71e60f25c8b492c6161fac57d22adde46d179257169612e9ba60ba20ae78d11143b9f5726b79721fae3c64675f5ffcc1a7522e1313ef584abdb8df579d0e842a3515d31e53a132c0f3332e6bb0ebec69c00833383c4fac7da636fa2a5df38bb8441d10732d9191cb59d6179bb1d4b6c56d74808ad4b78fdd3361c3f5d37054becbaeb537a2840d8f59480aa607d5789dd4bdaec527695e3f456062284b9e7754faa3c1312ec6080af9b9257e42fd2336fdaa6c49cd69bba8728dd9e8812470e6ad6299eba6d7c0644e36ca2cd5c6fc2813568acef19310cd9b4819ffaf6c69a08011b67018ccf3424400421be75200c760b668ebe1e16458311415e1f31c744b9dd22d11b7ec359b819ae2021aa7a3e414bae595f1d7276c1acea30d0c55f17c693ba8c998504af172b722f25cc8012abe2322c852f3f28ab647366ad37186fe6fd487773ac419c7396f1c2ae8bbf3db72ca0d6d08eb1b9c8180e12fe74f49aaca087f70c636900dede0226ba3b9ed0383559920fb01352b8200cc2e2c449822774e742d65ec7f0e9c0e98f9cfcf45008c9e791a3685ee5b275efc2de64fafc246f9f8a5887b40e99b071b6da2176a86f66855d990dfc40b3281e921e39645d68433b7b2e43c121916c5770570a484abf4a4cbd4be6b5ae19259f3712278df93e8ce87fc31ca97ad7d75e2e80484f2e9e7dbed56999cd7f2601190d88ce3f49963e66fa4b5031ba54318e713905d247b283309ce6ae2a80597cd24beaf6e93a7d06a563df3cca83267619c8f6b077853e048b3c0481f0dcbd0590e2dd6ae1f1a4ce51d94eb9f2ad2a8449b7338ea32caba07465c0fd4b877ccfede28836998ad65a06dd33ff03485740ee9badb2bb6a9c584fed892bfbcc1a5f517d029ca2882b3a912806e4d3ef63400c6a2e8b26ea4159c9b2b6f2573d0ce07fba613dee846e5c6f6f10f9e864b0fd9f8f4ac0a33714e9ca83689cc9a6249bb158068fbcc4b25ceebc83242d929659c18bde68a3b2013760436d5a7abb865610082394e700bb213bdca5e0d5d95014aff1e25483033e648021d0b442cbaf736a2489e31d98eb58e57b6d9b4caccfd35dc2bcb0455fc10e6e7186afcb62f6aa2a64d5d9dca5e5dbe92325fcdb4d7f82bbb6c7cb5b83d3d2de4f485cb6e5b9c92f5d6530f159880c3e0498f3a95eb3e03a45d44831bbf9b41fd9d7c4e94a8c0aab8601037376d1211bf1a7d2313172bee7b0242c69787baaae4de6e8ffcea6b87659bd3e59f2be6485113d8eeeecca3d4a4327952127b2fad0a0bc85a3de07251b40b3fd6cff7cf24d58553a2e695f59aee8e08dac71f7fc4b3aae0ea4b88d1ff026858e7cafe76c939031482c7ddbe39c609b7fe42649e63ca59f38b3cf398f457ab2cb5d49d4664745a05fd65ec9f85b1e2d7b7e1e3549ad960e768ea80fe7cc8e2616506ac6a5393a79888aa67a6842e784c2cc2944aa542fd6c13a29aadf49bd393dc8c979ae68fcd1c28ea48d9fa2d475ff30f6485437e820ca350ac252fae0ca8096023e66fddc4f5160ef73189e115c2a993de5c121350248b12a90ad23e0e23c6647c1b76b7909774f82dc9a4b92a9d651a8066c4a73cb5ddaed790c775290be9fcbf6d31dd0baf8bc1b0d54e8e2a0a5826b573cfdc540ed5f606984da15ed9b66c196f390cd6c975078787110e2e989a7f1b1488b5790fe9265805e3128d24e69dfc7414959bfd1ef99aa3152d2f8319ba3f7c2e092ec85de675ae0a0d649838784de38d281c1b23bb5e3a897877af1092f331bbff8bb0500335f69432c77a5671132e927460f5ceab3d8fe4a4ccd22814ca5183ab2417078242aa6265247dc9eecde8141fcfb74f85aa5919b9753c249e27e7e96387f0a6ac8d08fc5532b046e22537c322ff63acac00cc1e79a462f044db3bd2a75eb833c90d84fb0e60a2497d7c452cb3332c2e00468846a2dbd74d85795bd83d19d13a6f93ed588005b4f679fb452f75ad782974b74a12526423ec6653672d97f0363beb54bfa32c86df35393b8637d0fbb8d291791bdcfb8f21b289d757fe8e42257a4aef5e91a3b7165b1bce730911ebdbf6a4877e6431f5d20b934c8df7c9c6efe0d567295139ea2708ca2734598d18cd46bea8eceb3ac0587744c43fdf2a387db8075174958003c5e0fc23bc7ab029964f8b8438fa4155a530fa70607b1d5246dece3adf06e9bd2b3f80ea208a6177c5e750f89706194a63ad4470ad05e907882414d98d06c8b908e2d82661d291e50b71304efa787c6f493e49103b3a3c71f46af032953a52ce311b40e649db378bef730668087e9c2772f2eb175be46eafa001d4ce0f5b077b2c6ab7888afd4c37f15c42c5e31eb80a848824e3df4a4904ee1cf8f473556ed5384adc766936ddf37d2b1b7a22d0c9309021f3ba2cdaeb2ff20eb11e16308562c2323b9e134b503913a1be1b732720fca8e758b914d125bb978315620613d17c33b195d41d3db63e2417abf4bb9eecae708b62efdd0f42fc0251241264c99affd9c0441f5b091a30ecc390aa3177c1771b8cf2642322dcf5b7a96d9656c946890a1957b9fc0141bf4467a58084053a2c8f90c41a0e840c832ca57e01e926d038591cba8c30874bef7208907dfe3a563d6643745e15937a40f0e6c3ca9dcc0b095b771531ea97da5c310d7072975e3900e9d26dc65c44cbebd3aab4ad9a231a4e660bf70f73809c81d144acc0843649123d226aade4afa199492804a0b624043088622f4334420def3a70516869bdb8039a52c55a43c27b50d09c6b8e106c58952c6b788f1c0562a1c631ee80622e2c403b698617a2b8f5b71530d059086f4dc27633ce5a9c2667aa664541885adbaf1bee0c41cbc51da786345e3f52ad00bc4e1ded9561b5a063a59311d038a29e1e78a4be9ba6ccd1536c3e4ad242945cf216e2b8993a184b57580967ea85dea1876f88688145c8f571840d4c01c965801014fc0ac1abcb3f8b5ce96341dad89b0dc9a673522caffd1d6841205cbab24733dc809d1497b2e0a3678356dd411200fd67be27d0ab0f8ee8739bf25fab8e86f1fd6585a3428b734bab2fac37f612d17845f536171d17dbc86427d6c4173ecbf4a31c622c19e34d67f8a55f64c40de275831f208bb091fc5e11ad75b3259af58f78b5d40a5a03c1a56960392670a914e6a2967c04c1c6fc48661d8c52207a7bf86830b6bf615e071b9ba1cb0319ddb33a1b42ffd172176310cf83a74e0459ff0b48338a3c8757970e4e04829a68b5b5d270a5326b0bb1437485637f39ee99dd1e0bc2bd5c4d5e696de5f8e070896c57211cca5598c3dba1cf2bd2e01661cc65d98b225ee473aea0a757d5d0227b0b644bdc0eab41c153a569ae881709c7b128532208b1082454ec6403507de63d6819f2950d411650de42cf94e0d80478f423270011dec33c4e791413b07c2e2af72593b4e84c15096a3f08d1d4e3c2d796cca98dc25f2495cd864e2cde75cd78bd5a72a617aa58b617445a01ed4749d4b9df54a77bd4220a1fa10687442e4526e69b3c5dab6dcf5ba3ed31aa5efd420b2cad7eb510234290f644fe017de33e539e8b74ac85997301df3691dd23279264015656f61160ead427774900060d6fa02a1694a4004c89695a80a260a762014168bdeeca59e0c8deb00e9e50113320fe0033f000a802d5f243451729359188cff8a5880d8f31c8550e12631b52b0403ce37adc5a7842b9810408f4aa975b0d8dd1881099026803cb3013a687556a6c8a4a7ec097e8a55060a82fe9e02b1724a0cb10e060fbc004fd249aa2009f4b019fededad445574203141c5443a50469e16fe85d83270031ca36253a6bfde2041d6ef4fd4d28efd9d025de70375c4ba785d3c4b678109fb76154686cecf0378adf7662e87a7b3cd76035c275c170b66fc4ebf280265423b412a978424a62570c8e3ae43407f730c17412872e965e076191af0db33406fd1120f020a4eed0c42a94e8ce99d94df62cbe3458090f997f4ef84cb94d05874f1175d286cc0b986226d641b2849da1b161c30f29d24436ad3199f80bebcb1ddc0dc6b21f572ae96a5ed8e3451154c23234bda0eb4fa1cee250837ffe6bea4b08a33109be5239753545d285013c6cba3a32e9d82d10520f3a92741fc71c7a164ea4982eb5bc16b677209508f0277730491cf7d62a3b5fadbd551e9ecc6cb719bf0e6be6f238ef60fd912d2b7ff2eb43843efe04b334409625adf490269bdff1093531a616800a1a7846d342515e9d613a58a10bb315bd3bea32fae6ce7d2cd8ccee2584d119591ed0872d938855bbf392a5a7c032426afc1cbadba5cb5a849bde9751af2eadfc7aa36c4629d19ef299caa362a4a09037334c3f8f5b04b3ced8b38da1148ba56653323b93843bef90ee3fc767ebe24ba07bce58b25513efe95d8d0229b1268f3bc8aee462f674e4547a3f6715ebfc45cf1b3650d00fdcb6eabd57c28dff929b1da9f5a775112c3b77bbffe550d4fddcefe43ee1e0ed1b2ebe8c3dcaef3441d16823c7abf3a8495748d419bd82a46276017603c8ef62e4a03813c56a201ef2251e430a9f0d0587ffa502f7dbd3310154d5e2eea8a673de4963af1dbda22594e4be1e514d295ef469823291982a28e131409723949e77be5608f2744a5cdfb074f7ee3aea9f25d4161a29edd41fc195899012270ac56d39559b3e6b33548bb07f26460ead59eadc00d97ce125d7f1741d224bffd16f7cbf2b2cc7616efd9a3e759a512e67c1885a9170dfe0ccf71c1ab2f52c871d0017b48c3ac7b3e4b04c5b02c67bd4541157676077ef7c6d209c745f91d456a450e84ed139fa7af36ed5803186af6aad7911dee7ed23d8710bf5d41975de188659657127e292fadbaeb044732026f0053b503c1fa84ebdd480c08da518173668c582568697ebfc4c364cb6001788ea36fea7fb1207a0e9e310cbe7bf74796af5bc0c91bb6580a97211fdb722fe6dd1ee428e50da11b300b7b5e0b408dccf7c8654cd3caa1fe7ecb79ae5560d5a4b5b463cc6a9d8abc60f31131103db68971d440830c3d5e5ca1e85477f1450dba054fc01fa6825525520d218d7014e042c90023f298d0ceae00d18169ce5b10f5b95e8d880e658871d08b878127758087c40440420027044695559555555555535eb6bbdbb9b333796a62fc7c654ff859a5c07a51f4a2332a59452925206cd04170516054cd32e64aa0a6f605e115f7c4c9ba92bb49c0845023729bc101d66047a277e3f5120d05b1c1f30d777aeff3d1e0b79be037a27ff4ac555f26aa80171bb9d5d4964808d9ac8bb4244cfcf70cc05f44e3c1c94450443882802b21ca1809d0bd51242bb1200bbbdeedb3104b1e7c64400b489ca735a1ea0270781f20f38b739551899dfd2825f3e9e2fc6f93240d2b100523702d85c89ec7c5238320ea0d5cb250a364df0dfb92e1cc3be78695265040265f83b17fe3210d893e60aa077e2d9762af4206600e49e2efbfd552801f0eb5ceee55fefc43b8927d8e0fcee8b758e25dbd97d5044886008114b137a27be7725778dd240d8ccecf8fe49e607eee5127a4955129b11bc8d22cdc306bc944edc1cd9d4f1fc2c43a03f51bef667cd4a2d050caf31172a19f893b9f0a7daa177e293ac7a516e24c8f13aff393c9ecbc09ffc030a8dd03bf1dae8f6ae646a9395f7bee189c707e7bb2f4e61d41014112228249a7e3908947f40a6959213de5428221adae4f94db790a5654f98e47c73b831effb0b717878bdc37916693bce83b28860081151aad664d51246bb623908947f40a8eaefbdbb2ab4b0f2501354b7ef56f44e3c54e97439e742a2aa36593d54445ffadabdf7de838cbdcbfb352128c4e6dce81c92ae46fe4e83eb1ab5c9baa177c2776c3bf73365c8f0035af9d87642efef2e1f49a16ad8def53eb8f3c23c19b62b332202cb31ec8b51a82372d20a8fffee86c840f9073cc271223db92ac21bd14343c7d17b7df1086748489d5bb6396f7f678f77de391febdcddf962146db2bebfc54ac584180f1f37353cbfeab73ed0a41f714a2e3c3f5bdbd97bef72ddbfbf8a92e77dd64721ee7078d77b3ff53d8cb274b58a2edc7f8be23d867d711df513f7d2e773103fc28ad7b9106faff2df7fc5adbb5fd9f31ee90a539831bcce75ddee76375a83668b39bdf7418fe3b6320c947fc0e956d39dc348349effcec22a6eda641d61e3d3a8fa70be732752d195852b471625284b7364cd01743e4d09d3764f192a2f9e733414d7c74b9f7e22183ea34d3d5b711b7b993efbe25d62ed8cc3b86733a656cb7c46e40181fd336de5ddae9b0385d777723bed8bd394da64e5df7befbdf7bee9eaf8727b77735b78d6b1e4dc7befbdf79e7b7fc6637398cd39d4745079efbdf7de7bce3953bb6eabe386f74f1c5f3d5986e5398deabdf7409298d7b94c1171671b69feffcfa6e193ed3817d3d0bdfffb5399eee69ceb77df63d8177f79ef9ab99b732cbe3f8a17d35b3b3ae7bc6ce9a578db1793293bf7df7f1f349a39ef3a28022b8488a536f179776edc52a97fe7ba2a5cd777fef79f6f10b50dc78272f1283a0a0ae242ee926f9bdcf1a2c5ce4d74fac385e23b8b4ef0994af43943713e6a57d5af3226f859265d4102321c594663344f31bf25b78782c86655c4bbffb754dd5d9a2f6ed9ae77bdeb7d93fa5916883c3bd7bbdef580524949ae44d68a2e1c223d66fe9b3972c4520ff247ced75b91ebbaaecb39e79c77b7139b38e7dcd9d4f27ddfdd96a9eb72ce3951c9b95befbd6e378a71ce39e7bdf75ec2c9e3bb18bb2cd8fdde17d32cfbe69c73df84ddef591a14df3b114acc9a39c9cce5effe3f655cf2dcef7b09a30e9786c939e7fefbef9ddf4fd15871dee1ecff0faba0c5f438577acdc07c51d5b82dc9b030c3147a61eea063a198f6ece2221e6baa2a2b362cc428df685878a1b601724cb27d9f4183b33cef3d1a0f993229b49d65d66b84e4c6a30608e707d298d077ae032dfe6e4f218edf9ea06b42316bd6f2ff019f4516f33bafcfa2ce3cfc055f382cb687c59a91b95f757f81dc5b4b8184bc70893befbdf71b1e78e7d29d230d254b8a8a8d0b210d51ed12015c46c52baf382222e1eebcf7de63cc68a8891fc0b9169c888b94bdb7d6d96f0aea1debeecebf3fc0dc6592614ca23511500c3a9b73147e0cffb705948e14df24fe724c32345d4391e3813f86ff2b64a666937c4be22fc7243bde4c2c77328b116d259c7820e22fc7244126dc62a2ee871fc3ff55feb0c180790ef19763122027b5e2c8861fc3fffda1ea4122e6efe22fc7243e5e6bac8a4d6fff18fe6ff20cae0ee9eab8448e49b40fb6205b64ffde812b56e2e6faeef12ff1c8e3dce5b7ffe87cc73973f3f017946ff81de5f917b6c2609c6e567eaeb69cf8564a910c15c69b1a2e7c5e38ef12e812f0d0240df34aa573c4bd568a62c2da79918be6e028a125fa753d53a40099022bfaa87296e6ddbc52e50c31db161caa37365c8282486fda1630a03497cd33123a604400f8434180911a8b8a5bc9a91b12812aa618fbe94ad22a769d9441fc6125a72c3face455cb0f6b236d2499f3109e73be32ecf25dd4dd7b770bfdfe525b5aefdf12ef3b5fc07e5b21d60c8a8e46dbb4c64b180428aa66052579a349380cb26d0f958496db2815c5bff8ddd5a7023027a2c376be6acbac6371cea52f6ebc979777beb14aa6cf97a2b9cfebf34505b994bb5f350f92a2f31a75de79dfc193a6b46ddfbc4a53c4e6212cb3519bcc1e6e442794d39db23473f96d59cc9c7303544d602d5929bbb084fcdd2c52749260bfd927d6c9d9a7d6daed8a8d959222eba42842d02b1eb3967f100c9c57e855d59c615ea15749f370c3597e5ea529459439a0a2a25953f17e14bccaabe7bec42e450812efbcf33849bfa8f4a417e2ac9f2e69339fd7a74b59dd6bf6f6dee315654f9ba099a70673df4df84fa2a4de7be79b7d12cdccbb797dbab830db410c33a062d0cc90a172d3a6830ae0a28b2b068da956d793a8cc068ee8697ebd5098d767118c4b4b0a4b333cafcfa28ffd0d30afcf223297a66ed9affd33f0e10fc31f7a18c5782861854c0722898d0c09440f3d5668e269871fc5118c24b8b9709821c6344c6c28565d5046b8aae1c29a2a87a68c06192797b1827910656859fa78a4a8192931d5c0c3f8021b33f020124548b88dccc584109d70dc9b4b8f9826a2e3d28abdf7de63983cc609df68e191e0e9a978d9b1545f2f17b7e58b376df92ecbdd73c61b938433694245210dd5eb6ca1895e22460b8d4bfe8c638169852fd44d64853047ddbac570d6f712446db2fe0d530008faf0877ffc61f8c79ff75e7778026a8387cfa381df4559cdc01552be70c2a8038f0b27488dd650726090a5f0d945554f507a9fa428e353f4882442caa965d03bf1d027e50628941810f7930983133f3c1290d51734d984f8a62f172cdd7a46ce167a277c68d98213c79078a7cb0b7768b000f632f027ff804ed415f44e7c95950a4eb8848cf0535053003d4af3483c28a873a19c27b8a966e070e43141efe4c370504488a0970e49934a3032568485405312f44e3812750437671a36f85445e0564370f3d5f3e55041f081de89779d4c0f5c8968f0c528783ae089941ce89df8de352c1137f0a3d4c07ad304bb7f9761fdfbabc8000f64ac1dd9905231b5b344dd4b663090994e091fb213cf20b6a08810c1102298ac30d03bf14d2817d07c996681207804c95381de89ef436914681e4f8e2370326d023421c229250bbd131f3ec919145c97b8f33a956283a4e51bf4abd60aece6a7063286b02baad66aad0259630272c6a42116c7caeb67e5782aee0c69f5b3c4a6d54a5f1014044608c98dc5edc5c40e1559cb8b68b3ad22018bb206994ccd10d5777fc987dfffba30304313baaa833aa1884e79d128391346a8a5962f15cd8d7406a8d68c159d1a90b7288f0a87528da3b524b36e06acc4976dacbc7eadab48f4de6dd480d58d813179a23fde29b72b8623b824b3aba55de3e85a60cce054fd54a36c2f946ac618b624a2800945c794da271ab2ca19d4b605f36c9f27248fe66658e860536af923b53b9649629268d4a8d567d0144b483f508830929c4031b11d6fc76689a5b0f3dd6e8f0237078d09caaab2aa5a2135f7ded7b117512356d8b88660849def989d57a952dccc9b57a9925915cd52dd4eaba0dfb40a663d12526f5f393b9c3170287896320a085c5e38666cd0f1a0e9592f9223ce5a6c81f1d03a6ba1547016d4bca1335363b2728ba316477a0b06240a31e9b249b516c43fe5b8d0619a71d6349194a2c804ad30cebceecd2b150e8c4d57e642cb536ebcd03675f868b24ae91115c6d6366bb043866dcb8ac454dc17b2d1db11123eb1a8919604d298108682f430aa28a3228addf82858d53bb12b7cfc90232a752175df8ae58440c55eb2d6bd9bd768980adef7decc79efbdb7968add3ea33070b48af3d0f78323a196ac14c4e356dbd4c7c2a62952156d3b2eecb06ad931c5f2c3da3680d798dd41d4f2c3da333a3859d79e0e5ab0f3005b3264d795007a2dd952738719869d59cb3d0aac36e6b564a87b89055618e6098cc1ad3c5ca9e656ee01dcce6b5516d5ccca439e2ed12d70a8e5555e41afbd0eec9221113c506095e7155ab6a703208c50494199d715b8ca1c0330cceb9a02976bb0caba44074498877a5ef514e79c73ceffbc467500019594f40f2e7288b5d018aba8535dbda91b27305920818a782c21837454648aa9a784bae77befbdf7dedbe380aa0963c58822f48442b59471995a406dcae0be84d48062cef7de7befbdf7e6fbcf2b555195c3d80ed801db3bab17b0fb50eef270d7a0b3fcedfeed26e83db7ba97f4efbb1eee99dd5f254db2ffebee3e5b54a61b3c3e50644bf28c0ef54a6be954f4637ceacb0b6c009c77be61f637e5c29854028f1c93201d4972bec98fe1ffca8138e678a0d88713c9b7e488e947e3c403117f392639cae93013753ffc18fe6f9c890b98e7107f3926319af1a16564c38fe1ffb6301961248322c27ef8bf7f69836e39555d327520ea07f8f0fb5f2662093b1c05588d44c53771010227c70397981b6e926fc98fe1ff2e99f8d52c7772fce59804aec4e8c403f163f8bf5f1d64a2ee87f8cb314991c90b98e7f063f8bf4a283610a9231be22fc7246f262c7319783f86ff2b4561e5ef623926d1494a106c8a889c0180f428d2d8dce590627c78f2b4f6f31a65f2695b3647e46d15708378ae01cb5c2a798eac9125b240d026ad2ce7a005b2f20ac7f2c475d4d1f4234bd8ca2c2dc4ccc861ac229183857097b4a04d5813862b759d5768d915f310385c9dc3f56bb8ba01cd4376c8f204e992e13a9d59b92d19ae69332bc32c2b7f568e5939c8ca1660e516581908accc1a599955b2f2da3b613b0f9f39de56f160c9aa491259924a73ef1d0618268b5a4c0b14a23a61df3e719efd3fa5a6c7d80d98175434490ca8a39322c508b964f9ac791ac010bda03042d19143fa8332f71649df709625b5bd9013f329f391e199c1cddbf16299ebb7bcdb7cafeebfa11342320625bd9efed106926c5e2e34521473bc87b9fa6fefbdf7452fddc6016febdb9bd81a8b18d94b5511e0da5c2069cc60a145f7711cbd891dbfa0e4943dc2cec2c67a32d91263528c5b7ff8fd6f0e5c6a8832dec4b8748a704cd114a024aa69e162c19a2e77b21c9368211dd4148e0c59138f8b0e6730a0b9c1c273063613c403b1618645988a8c98a456338359019e6c314154cea49a6fcb5135542deb91822cd229a12d5ba927ae7a6454ab6f3d8a68dc27ef57b5ec930b5c3058365674a7615f0cc740732f2d165754cb8f6ba5088398d728d70e178c0ffe75776e951080e63b6a0230f3a65a0b00d6665886dffab7d67b4b6b4e80a9644a9c5c4c2082917d8a2052b87c70da9028c1d922432205e4c5032cc7b04f2acd440729193524c0720cfba4ae6062a9a6cc085242460ecda9bd413799607c411a9a38c60ccd1799913a1898878b885a3164c64def69f316d1f09c7866764e2f366e9098dfd436e38b5deac686cb31ec937281d94d481c0dfb5c8e4cba18268fbdf7e6db59260781325e206381a6404bd26a9b22eec84298e45882aca2d48c50b827baef775590b9cb6fef5dc5b2c713cc8d182ad6da446e4c976f2d754a653a6408c8819b53e65825c1a08ab45416d01595e1a89b624989c4b8b999b5fc831c8a0ce95a6b97c4b371a1656dd94035819e682136cca8532c715054c729a1e61d7a82e7bb9661301681e150adc062d102ba0c408d0920df982d94479d2b1aafe32fc7244a21502b22ed8f6117c69a322f293a2ebca07a7c630c00b3fa311d63e60411ea4ea7b5f65a6bad53f83dc98df861fdfe3cfc0567989c2da75e00693a169f2b901c68544085eb479b8fafa397ba2d8d22673dafd2273632186cd05482e6de5c4ca981e17c2953cd6dc5623002033a0639d10646a3b508e99752e598ffbc4ac15c6a04f78ef59a77afb5dffc69486f56ee49afccb7de7aff7e3f8ad37bef5d1a5579ca9987bfe00f7977282fcfb5d67bc75d02502f8a583e5ffc44424d2579ae89f69fe0a906069a8d16423f61118883225155b386a57303695d8d26b220472a600d78fa9211e3c6915af38701cde8718a81428aeaab07675d5e74302c544aa8f1dc63ab83c2d75bfd5d9f51cb544a8b399b2c125eb3f79e057352248e28a42c5684bef396ffbf02100a1cb23917432f7488662fbf3366effd5cb54cca6cfaa243e83b9fe3fd80efbc3e73dae6e16f8df763d8f231e284798d6e756d49c39ec4b026e20f6b87fd7436ca46b9ee413fc07c742499c9131a62204d64b8557f6c5ded90c9ec400015ca4a581cb3455916e7a16bcd7a9b69031a3194a294f629d4c8f4c586054c895e088d1062c33c843b89a0cb0201c9fcb05e5e201a171e50b1b8fb01d2d3dfbbbeddb90f8e6c5366d21791f8e395a1e5623932ba344939e7845bb3d8fd15fedbc38b2a0fd6092ba8314a640b08fdb1d592e2e3a86745fa70eefb0e8b891f40564eacd9209376314a6899312606d53425e5481b632f81912e2fbcfb7ae44a70ce77f4bef78661dfe63fada72f41d51536cc76f6eea131ef767a02b11e732bccb89c80746f422bee92dee11e1c3070bc4728edbd37dfbd7995f62ccd433983dac6897194a6a8c5a0dc92fa31e85a183000250d1d1115514d9875de79df7befbdf7deef3c84f79a891e6b4834b31e2d65fba285142c5b294c412e45ed8a0b2e4ec53034a318e45c76622c21ad8b1c53681752dbd973858dd65a6b1a384fc9cf6a4e43caf7de7b2fe247419c7df3cd37d75b6b9f2f1e0b02b6caeb0b2aa85025179dfdbc56c9d5e80010ab34b5a3949b4dab45b6b236a305851a5d960e6a84516db9b0b424b36660a347c60e5792546908324c3e586421b36060b5b0ac9ab93136db7a60ac5585b074385f685ca934b9966a0296c0a8642d1caaca0c8c0e280063190000000018477224c89214ca1514000720ce606488506c585c2288452262481c0a45511c09310c04210c04411c096229d9d9006f708ba316ceb3cd74f3ea5df2674bc7965f7a64cefeaf0aee9f40a631fad306085523783420e88da51e45cd852dea1a4ac94d240b494bbc61c8d204b2b65023d1ad705d8f92353a37593055663e248275378a7ae07ce36a6cc0ce3776632eb84e0e6f8eaae7da267a8bced59abc83152d9da10b598905f3e49d3a2ce20d42d2cab69d5d941cd587f28a02603f3e93215a9afd71e689f28ad82eaa44ea701497aff478b1b71c97b470b962995609734f9753e3e5a0a2dfae483f43a2290a398050063885e41e9d5937d33058e89793ca5f8eed1f839e849ca283d452879b528b62e82659f2c055edcfc8c138a430ee44e988bb570ee28b947eabd8aea6506169eb81a184f113db726b57a9d7714f9ce57849e3eda0cc29ce7ece56041b0d4dce1ed988088c84e3e1aaf5be57e0e49b356db0f4f19bf7a7dde8accd15871a788b612e99246067b0965aed29607994f2da15d9f77bf064d2a1d1b8aa2a946f9089820392bbf01515d398b459b6a369b259ccac3311da44f5d4043d58b7ff3849cd238595769d254cd13b8dcc936dfb3e49c3f9fb88224a665633691ad2df7b5a16438764b147349e3279429463f526bc0079a722ec6e5e50de18a48b3ac971ce297bc1efa5ecaac9fbf29d543acfc7238b448336e1cebc250d6be10c34cb8d494f4bc0abf42aa99d8f033a2641263f4febeec4ab73e48d57fc7cbcca2e547d85b540c49ad8dce2b6aedc2629898e25c559804de40c4e337666121b9b08def65b0f01181eed691b9aebd0ab0f9d86da894b6f09f0ba5679d70eafc6ebd0d3de2e26b52ac04b6a5fd24d83d7c7fbea69a6bcd8f40deb9c369e4d51919eb38fcf9ca8ce28b61e8c470c9e3f0fa0ca7c2ffe31691c781da66429ae26edf6c5b7854854b0ceaa2f5916666420ea14cf462649c9d86fbb4e5509d117fd8abe702dddf7dadc08d849b3687bc0b72c47035cf21a686284afd02cdc62e4b12a0c1e6cdab3f82c22db4f8f791a45dd72d63f23f353731530f437d3b40b12ccac50e12a884d7ba2d05df093e950845e30848e1dfe0512531020b94a52c7a399801af0ed560dd9911e5cdc3d6ae3288ee3d8308479cd7aaadb222812e8548c704d090049f8626401b93b6703644e56d1373cfad0eabcb6de9d65c6f92b79da830437acf3e60cac854a160b7eeebc1c8da52a3d643758b08f478ae62f1cb11c434ccdd763d82d073774bd59fe529a1ada731b05703542238bc0273907f80837a3a26a468de47373b29f3c6ee43c68cca2b3320762c026cb02a8042d5a9dc0264a86a8cf88d613eea434ddeb47077ee733e061b1559f724ba78d4b3be8d584f00d09fc112a44b49e3b970e6cc3508833c9f606b4e424590e4a0fc42cad477c75ce020f7fc03d5388c81f43889fbce9d1d76d815df66911132157698998be238c469ed466ca92b97ee621a44d1f175053da83b8571aea58825f3f3a19259bd1a67a085f47a9f618d05f86b21986d11a2e5e024d169828f66d56be71ce59f516fc4231546a66640c3aa9fe39b986f41d7116314c52a9020b52eca237550080de985d822959d1b5a79f3eadd287fdd6f7fc3d94861f09d8f300b68d3c799ce2318109f3a36392aefe3d0fc56cce9358f03a12eca5071d4dc4b9816e762c70fe0cf438b710b2aeba9626e46a42f7081444ecb6e17ad674977195a8bb0662e599c52aa9d908835b5f5aeab40cf6807959f11ecf65d8799a3374119b7fe3475c5d91d0abad9bf9c1a97f9d34b6e2ca7fb7c10db715e57d4b6b16e0e963a12a971520c54cfa0a587125745fc787d5c6f730bb1bd4bb12c7bea156a6fe7a132ce20f90bdff74248b9f8e8a24865b8bf2a1e23b29e4418279a974be90df6b1de1e4280370e8b79061dd22ee468ecbb1857e2beb17c25ea6cbf1fce3d8296dfa2b0f7f4622bc9d4a1c2fc62c089040538c8bb96994b814f32bbf9d390d91e08599eba7b61a4906c3b299a8f1dc8a991f1897df3594855547626fa45980da89491745ce2a66a9873563968d58fa5add0b9dc80231bbd1f0dc2ffae2ca9618ece000237a624b7d10020375e4d76b24214d175f8c116eb5caa911e91c86a72abf0a1c27f18497a459658fc947fa3433ab84cd33a735dbe42c20920fb181c8c87fc20673eca86320c63ba37844896b277ce55d8140d9e949e50ef2a410605caedef8199d8b353338018a1472608bb373211603399cefe3f441c3ed21f8a51912b1c7da1923a4e45f72ede38af4a1fe73686b4c0ae7bbcbc74ddd1d3900f0758e1b38133cefa89a9d118d33a15fde503fc18ecc6d9b1ab57e1275e99279ff54faf649474e98efe8fd6d87afac6c7c97791e5bdb67cc0305e22f4c4401327b15acb13aeed2b982fac1934b7aaa54ba0c7c91fe0b80a7d521a20babded148f7aa25119aff9ba639cd6b37d4fead5a9675e8e0d470d94b592332c36010f5fa246e837af782932307f2c021e7b94a25f292c0e0ba6ffb617e0052491dc1aa24c6bbdfbf808ac5d7ec121ff989d0232ff32d6aaeff4ef90c94ec259f1922e8f455712487117b4d3587b60bfa7f627c524b8fc3ec875c4905efb48ff82dafe8b890bc83b6b27455a6a2a8b049e0a30d9ce019a6108deb2983dc6a186a766f0c188855546a54e46cc0bf001ec22ebef9d31e762c1689ccc85aae2b4c1b0081de78693be49bac8e00085b432432486d955e7a4018e60b607d447dc6abf67ae87448c080979d6d492b22c8456bef81b69ea25ee09cef9a69d59ed5047350c3d6b54582e483f7a98aa61e56421890e5b475e4f55f51f7fc5a9e33e6da58ffcc8e73504d6aaf897063550d045928064f6f6ba020b04165bac60658fec773301dcd503b9d17297d3fe6303ba02342855c708dc855d196907ef7c1d7187632101ca0fda528c9ab557cb5484f2f9e7b01878b50d1c9262631003ce3f38e6d907a464b810751550b67b07374bb407d3cbc26be9ad6f0cdd152f5da4aa4dbc06cf70461445aeeb391e5889aaecba323e60df23a3c40cfeead1090d302de43a3a9e4ab794d6d48ff717f1a60ed4cb4bbf76d0612d47140b1b1359c570714a2ef8ae2336229f786f07ecce8a6499af91100e82b51c390e95c44074f3390e0f29f49ba1341af43a14d502350bcc687ce15cdfa2750a4cfbaab34a2db4da825799559939272f9ff3874a960581826678440d96d8132771401e3f0853b55fa621a8f70a10c1c047a656c23ff3750e877785f1e98c36696883732b13e4c94abb535d4b012450b50bf404fb800c2dfcc732d332dbe291912edc1fa740ca39aae1ac5c6a30b83f07ff098dd4b065f793a04b7363c49b3e86e582f8a75efd4f740b9972db45c488bedf0750108feff7149225eb0d225f92b467dbb4ab8347a793822ca74365259ee024d02225ed392e80eff189002fefc23192b8b0eb454f2425e087a328fab18fb0c9ab0e257536a8aae83c13d7d9ab03759835d8251b665ff2a966f47018af845c6a03f4aa78d4ce12edbf68b27dac7548d5a92d0478175a74c97ef2094c622f1cc1f8eb01d3cc5f8e73a2138f4b90be248fd7b73c79184899d3e7978ef6bca5c8c87252818586400e724496bbfcd221d0789c8245f335528e85260df438460b93dfcd522f4c0fdf86eaf4993c02967ae8c5410d277ca805da5ab3027edd0dca11ce65275e3e1499026f39ab0ac6ed040d13199b9545dfcc30d5b7eb1a6bb6ec55c5b538a6162ada4e955130883afda30b98d2cd6494b825eabcab0092a23d3e9cc3b93863ca831a6a03b581ff9c712a761d39b47373e549c9cd769bd90d4af88cf2ba4ad885a4dda76cc271fc3fb9ec094a28fbcfbe261eb8bc36a48789c9b823007442357284e9fc5632ad9cdc6d2fbab6266624f83e99858390e0ce90cb537012686ec39d3a3462b7922beb51fabaf4e80ccf9aa81d4006fcf1a2c09f19863ce362bee093ea96539b31c6e4e7352d107647b91082bb0dfe62db203e83a41f26e5f69a2ab63b0e51c26229f864b97b767b91632698d71d25acca142a008cbb4a6354f6f5bc777ccc3a171566b858e8bec83878045ecc7aff5cc89e74403ac6a27a7b43558ec495359bdd6936e1c1a3fddc943f42d021e2793fc64cb1b9c90c026846b4f18df55a6e1b105eb8c403bd1244a29ef1fb699b3a482e133f5f464c3b0e451058ff61506f96bf9ce74219b2337b89e878ebc1bc13d0462b0afe3c5da5a5785685a444e1983ae3377f89da3176a32c869ffca7458ffe41921a761c5838d655209cc4fdc47c46cc748afc9669764c326ef4345c07a6d1c14d24e38b8abfc6291a4c26f210eb763335e08b6bbbadd432cedfd0a3cbbae8925f75ece3e96b41f1a316ab498a41ee7363bf912a3e1b652468c91a3f50a8b9e94695824d7002f78919c6c9dd79e4b4b198803d0020f297245632ed8a17f2fcd1a492b3c7788021bd1f86c5a193ae8c3d8c1b34698b31bc74f962216f871ca7b2c3802d6d75eea7cb366450a368cfbcbe8c9c8d2fcadddc9b58c0c77a60e8394262ec40407d6c563d7870eb105df4ac616eb9a14bf9e0b80e7720a20a0e2adc63a28450c9780593642d79e8b82215c61e12a6ac72a482a97ba687850c85da7b99c278e0978f2f2493b4952b3729084759141a3ebb7ddb50f31bdbe8cea51513b9bbf492bdfab99cc2c293e06a4dd83dee324018ca9ec374af583d60d92d830baff9b1c681cdde1ebc829403b50a289ecd72d491a770a7fbc0762d6a633750d20639a228b1f33c349c30e644b79c75e23753510728926f4457814990ecc0f17ba656b5aa8161e84bec5a36841d0ad4886f44fa8b5ff415afd1f886463802d4dadb4d5716d5f2a2b41ff75433987dc622df0c6254bd9815c7dbce79181915c2ce3fc5cd8a0fbfef417facd4ad5d5fa6817402038912b537a6834c71ce694db28fa5a9b45ff37b4e849701640fa5dbbb8d235d96ee174d5882b9752e316223ae6668946ed1591943c4fb4125f497aa79767c590445968d812858f901fd17ae9ff14a587c845df66bfd87dd45e75299702abe622df71bcec35448972600f5644e18c411180898124eac382147d5f6dd8c18b6668fe2d441f0f25345a5c85deb1cf51e8d243859e87a242dbc235ccde84e1c4643f79e1bd8fbe6c6ca4c24be028644a5a125dc2ee4d5b8842f27013bd003176a060d9ba68845b81c5109bc5016caa69e903e0de2615f16ea248735f3b732b6212799fea1d51e8528ef2db8c11a31b17e291ad21725c7df4ea9e91bf6de5d48091dfb67f8a5a300557f08ea43ffee20b2930ea634c3433678679fa8755f9000269f76fbe4ee7219a53142efae588c122cfcb5766f3831f0fdf2afaa37d3db0a030c3d46571e6bcad221e8e6417696408fb17074220914defa1eff2560ddd939494d0015b7278576e33d56365f4fbd2ef741fd254d30b7da46880c0303a222b4ca541d5271a9b559de8678424ca89c4bd2a9b41067a7e1f8eb147255c91e8edff4d7ac98be0877fc36725a2eb25cae843fdc4447f8e91e89e9912811c19666888176868f3b85fea4c3b24b40d0309ede82a232769f1564649f7837eb2fbf613a59f1a89cdf6748b35629b8e3ca923cc17c84c67dec237956205dd79c92fcb28ba44920de9fd152abebeafd0050790ea7dc1b08afdea022a67718c78df77efba6c2f20ac6a1028633e26ac32fddb34457913ebd4cd3d9e8965531ae5c84037dddbef515666bbff9dd9f074ccae5ce43e4658d16b85a84f496ce83695b50ae3a78d4237c4b614ef9b5415b866c5416356d9129a086c702998406760522cabae48d755868b61c27e8ca2c654c0e9117ec9926345193766c1694d46a183cdb6c2acb277fc2224dd337524cc71a0e110ae416f06c7cdd920d3a0fe39c74ec74f56958b106427393eacc974de6ce4b2182e84d032d3e31c807898e23b961625a3d3511f3cde13b1ec84ace3338dbb9e4e7ceb31f0aa168b6df0b8b2fc304986f676b24c626e16e4929107b8881e02c8d9891db47820f3b0e75b6b4423bb905742043d2198cd204f65a1c6cd4814c6b619cc250feab8495e981277860dc9b8ce70cfdc7127d0dc2d9b4be3684a5eae042243286924f93c2fd120e55b9d15fc17cae57a46074b61317a6bad0603aff07c702c0f64d2be9757b63da7a383c269d9c8fae0d592e53c0fc1d1e8ef4aad4a4c136481eb8850ae7144426056f28a6643c05ac0c26a98fcaa943063f4273e0c6d14780522bd95e5014bc5eaadd2007afd787d6040cbc9fd080d1cab424edf59870dac1ba4af8a5c81ab8e1d66cdd4ec479ea014421d0582cb020fcf1b1b1863e5e0d0ed0d3090743b85e85a26f813be11fb402342f0319083060fa53df25c6b8ef8811d85fbb90f774b034b8c1d1c659f1982543ef1e6125c3e419e4c0882a54768cb9f254a6bbf592a552782f0e2987a174443efe01138f4f26783c6ba5b864bd9d921bc54444992e8833147fbf3358ccd7048c4696f6ac272111adf8748818489f4ac087a3321088745cdd6c56e4bcc11ce641486c456409c50af98702e4ece54207bd46fe66c784239545edfab6738608bcedc5becc9e630afd4c760cb3c715c967ae6865f741c4522b2fab433b54805e66080f7458bf14991984d2b94548482ca5041730040bad8547c2dd177424c112aaf40b99a96de7a8194bb169a6eaa6b61f2efba5f0d7541f14a5d2fb69f3baefd95b56f2c36a60b12d2fe377972d97b561a32c285e04d8e3a2e197a6ab1cce8e246b745aef4df501e1a7af55b22d84bc898bc70e4251ce819464bc9431c960282cc76429f38d77a7cde37b52ccc77df661911d84aa0dd0fc496b3ed9e69d69637b5b27d336c459bc9b31ff0af963d13392df61ed172a9d08500adb3ae565e15989865bdffcb01775b3543f7b654f57c5b59c3cfd6ef655e2b3be554ebdad9d24aacefa0751d10ce0a3ab82eeb65dd17328b7dea2ebc6fcbf5a50b5184e8b5fe0850f03da90c80218222fe5fae3ea3e424bc07a83670b27db39302a1049d1095118d5bd6d32fbd3c8f14f879a38e7a2bf45fa4ced8d858e4b01a0600406e357527d7f3b09c32be03dc141a74a66e40786db334b9f51611bde010268cffbd35a418caf0436563c5de3b53b2ac64b522baa274c2d7bf1e4a4c9a5d0e874c9b05c8412651ccba85e8b3f9c36c14c0168a691fda84893fdc207d440b885f885600ea110d470024e6836e39464a75db4707ce7526dd0318268d8be53c1855528cf4c10750a4e24efb6699d1835d5538faa5ec656829d8fc8a369fd01fa49699062e18e132dffae312c7f684a0b755dc8bb77dcef860675560d73731163c7c0b3a09148141161f545bb6f0d918aa887eff47c5a118aea2d26ba03706b2e5c0e4f72659ae1ca88f411278b277e07d2dd381cf2358a6f4c9e4afb8fb81d32ef4c971ea9544a4ed2136709abc11f5acb5490063bc3e8c9ed47f2153224af510951195b27db3e1d1162f9fdb6c8237ee120503b4c718223b87d56227da17b2304db86748e403d26ffa64a44b39eba6da9a1eff377d24245c93aa56caa0901b56d0d20a8e0e903bb618536052c76652bf7d3d4f6688d991d20d0cf41fabca23c47fba9a2fc7288919038c674a3e4a9e5a516427ac94fa4fcf4ff63750b1a0ec177454f67b36334f297281b8f400e83e8da072cb584f8d2ad548a355fe49a618806ef310e80541d44e5b2a8d57ee64a273054548abc1b5a79052795d79e62ec6e2b9f2d2248ca538f196150806aba38821b796dfc2f9bc77b6720acb7c90acb7e63a5b00869ad936441c12792b160e09d410bd735b33d60f8e1538aeb141d2b3d7b44ebce3ea00694371043711aee7a23950316a27d1e516b610c335d757f7dc8862eead19410fac7d43011905d16629e45a0ed1951371280c5708493109cd3b3957f729f6d500c975e9d8e13c4c8cad6199849c775c0b00c4e840041ee14a62f450a5a88d5c5443c84236d7bc5e1d7221880bb99eb81f2870542b13ca1572e9e815af47fb9d8843395e25520fac8d145f05811af41444db15d76b09236e7211be635e93133dec7148e293f7c85608079f609f926a49f14b605bbb1f5a3420e3eb635a243606bbbaa7796e449138b0392e064a8cea0029a28fcfe37fb68d2a6f070bacc8c421211a2658dd1916064df3f5456147ff89178321b200a52381700cb032d2c88da6f4f70ef2bacb55867daaa79955508ea671c096c630ffd06f43fceb2a902291ca883a14ec704b09c0b00c9d008c79fdcbede938f1d3b7f01005cbddef6133527074e724594cd2eaf7eab2a1c0b280c36d2b1c7234afd442c026a91199cd3b0f1c288f580c825a5f30715f885834689870e23b928e8a728e6187adba36c07c421e9c8c1f41106b0b1f22416520ec049bff4089132dec4ffa217cbca830d31922d39ae8146850d2b166e323e9d956550e9416670fdeb54953580527535560dfbcefcac9865fe1a16a1f37b3bac60adf1ebe602c1cbe9c2cc23e525d2fd4b4dc3901cae28e94f10a40146baed80f61bd4ef45a02dcf76b96cb846cb5a8e94d63bef21970b1f5f1b89c51dbbceb56561fd4218d94c9c676efee015e13bf078f5c4f65317a22bcbd063316a1865823927e9e7c120a92c9a68865c362e7eb5c6f494db0f49eb10d7315cb6ed31576a2c672896713a0bd9205e8463e44d358685dd154418268b8f5587a322feb6469990d83261c406da6194292c4a169a73c484bfdc6d259115acab1c87b0fca5d0acc2bfdf91c5a110fed79802ddc836dc9a0c752016de43934aead5fd105787dc9120b10e5a47dfe65780628eaec66f90e0762aa832c2b3fa14b1b43575c378f6100aefac3c829833f01ba6371fb981a3b1c60ec646628f67f1f1332543a5ed0751fa92e2859a1299c8638262bbe8744667e8157f65e5fec3f13f5ba5fee9008efa41ca9a6194435c832f4ffc8d48bc9e695e03fe10fa6d76374b19cfdb139ff4065360d4a78ed80268b0c7020d46d77052dfaef38838eb29d2ecfb9683a40a4d32c7090770c9c168088d3ea00df8f49c0bbc3e7af98a79ebcef6cb2e0de4728e2712a43a1ac594becd95cd6c94622a64300a24890baa14fc9302c45a869c0c03fd3aef9264be03217f4efa51ef49e9103efa91893f574771311134be1c57730bd2170e85e0bcad9b68201ceeb2cb10355f323d6cc50b0357303c073d8cdf530c7f3c3c9e00034d591d4bf56753d2fca4ccf9c13b3b35e64d89b80f56c6cbb048e7a24027924179838f29e6dd934294bbf843fde91b567db6a0bfee7f150c4d1efca61d601cf36811953fdc95471bdfd1822c69e7fc396750fc76ca36e8b27e1fad2ca09f1899c9fa694d470610e643a7d30d9b5799a134625e5e6158e72516c3ccb1d43accbaef95aaffc50264cf2c84bf2ab367535935c576a2421dc05a4c5cca58bc9a81625c7f57cb1d98843f49a4d1dba4e45411c97af8ba852abd93c9092f9d3c749d33b0185fc0b31290272e4988c2f4e40aa9280688f08487b0d36a8ea94053f518662e5ca46e6d55edaad6c9eab3a65b99678457e07a69584a0e55659693a88386a3c62993892c74b7769d5909aca47f87c5297c53561bf7ccdc893aacf0b939f3fc582b8667bc2f40afdf2714630ea8671b5f0727e5136fa14aef121ca3dbbd9917becac879dd83d3ca133daec2e35b168ca39532553379d71662a355fc6638cc84f2eefacc5233e0a807f6cfc8df502ea0f63042411abc244df8a91405fb2a81d811a43b06473d2bf70e4c428d2f465abdcca1b96b89cde0f062fe80ca0f351cc756042ba836ef584b402b824f380e0dc8f072ca41e0832fd501383f3b22cc919bcb40b5b43243cb28a8858f417926bdd6626c60a3b8922f029349c007ad386394eebfb729eb7a698aca15cc2071b29491fa005f1ac1cec38b9d35fb1ef6b8a6df8e0448ee034032d363683d4de4eac3d577251456a30ff86ea5b147e80b6d283bb942db4c5aa2677a0c0fb34e3f616800c2956ecbdd6a3abfc33828b21da5b8fa1d59478a9bc27bb477779a4dc507baaa34785c206fb4dada0f1f21027621aaca281ba4ad768357636a656a75c4b2bb4617baa17c5a909f57395890a92ed704ebe2dcc4cc07c5ed492eb084201ec421de4a0a7be49ca79609ea8bcf9726d147a989daf5481bc3e6f9c48522557ec2aded369b328c27dd699a0ba9cd3e85b9a878a9fce61c2b02d9b6c85cc116e0c0908a0413cdfc362814d67c9257a02559dbb8c726dbaecd81b28dd34a4b97d0d8f8e80de59d5527c0a75a663f09417d84e0ca9557c210d8bd31f401b5b316aa6508589135700dd031e2bb381538a33806699a8fb5fd8989ec66d958dacd70cc013bf01e38fd72daeb55a7cb1394c18ee7b80ea78d203660ac161338c2bf9fbc297e028c741a47646f3b7beb3d54c274bfeef611d2c32182627c3f4c6868593b3017f3177989300227d434f97245ccaee11d6f1625cbd57f7e12d9d01ed456ac3d193a8255d751f0d225e9b1c0ec7e67e439f6c9f3e77ce799a5c1389045d14e738b1c70c90b7700bf7cf7c75dd76bbab0f41d6faa2a1c3a6810577f708b28f7ef0b6c63a038dad9f693028d3c20fa95032ccaa1992957a9816bc4135505ba11ca7240bde68688ba3e1b733677f50c87a1a52e1f9337a69faf231159abd90468e23b6e800f0ebc5fc11c8a2b4835d31a858215a4283cee8a205b53bc51242afc9d933da8b2c187e51ad47dc308d097c4015dc7e1d99673586698e791444f85b7998eb048d5b4aa694416b080a7c80fd74c226e69acf2e6b8f561efac3af87d4377a9d85ea118c9919a646283e6771718d245749b3217c08a55f4f005c77da44e0c3a334ceb69223c9f9b0e6756be3a11bca8f477e278c313a13e933d32c4daa05aa418dfb44ca987e1489a3402bad8f63403a684df9009bca0518d1debc60aba68d30e499820183a6c380967218b3a3dde7f48f7f2e73a7ff1da6d010683d318e7157649f2288eb0c28f855348828b28ce4ea07d7734144ff49cea89d4fecb84a3c03fcbacc880c2130c05b5d413b24676f2431013e202533be887f4a513e3376131094ac5e74c900e27de882094420b213756d3e30f250b3e53176a8d212d387fd92d8d1c732252db324c8925056e5ed74762dbb78dfae9d3efae3123af955d787882c4d7a1245254ef013a9dc13a83083f36b75dadd05fc1e750aeee7f0a385a68cf5e89d7401555ee6d7f00fe1ffe65adff6b67a961471bd6468b608fb0adff0105ea3c5ecc4839299c772d3b70501f6dba90f5d3d946e43361b707983696005ad866ce9a2f624bdbf8099c187d2fddd1a0b91cfbc48381fa3dec0e3269dd0376afaf6b87e010b4b490a2c8a4ff8227403111caad5720199e72c6044ba4cd58902f9bc4fd4a5bcbf2e16e95e13dbd16ca24539584f7c82c09aa9abe50f7729cd6934f26c117305ca2e07b143da54c9fdc7a6211ad3f1ac95e42f4904f8acea4602e4e7fba1d507eced5a4abd28b498c09203a922b06132515249b6700abdd40ba28b1d8067dc87608ef9e226d84139dde310ecbd7a5cee8f41fe3cd58dfaae03412ca0439d202ae341714295879e58291003ecbb1242b9fc549fb78095acc5cb721657cb7bf9ce076beae578648e88cf97823842a344db69c266ddecf3bdd9e913a45d125c15294f2eda1f63a6b2543051d49cf6aa966da3b0987ec13680f5f91805cb04228b1d2b49175a37c8b4f7a900c3a04dd473e3fa7a19ae86fae6dc558e0996168ffedc2ee1de70719fa707298702fae49fcdebf1fd422d080a9828f82d3e2bae25ef892288fdbf8cbfd46b8957703143b3e4c12c1d7a80ac8d29a342227fee2c8a7ae3f90b8283c3033387a08194f310ab13384d4d67af72ca420414a07c7e54ba9d61307df53f7b5fd07ff2a0319fb55a73c0900649e90ee66fb9a7014e8b7570661abc40c9cba2d8109e254177989e09f426f66987df86992ccc8da879d71b6bc253dc3ebca5ffe13a31130154e150fa173de54fad47d6295308e693cdfa6ea9b7478d915f976929a216d73011c248b1650fa927bfce433c9681585c520eb01384320a9ae953a81f531b34fbfd916e3f0631f1db75c85a1313b03f25b3cac7ad6c28491414657b11efc222ae0614d791a228bac5f4b8a41a963916b16a5f582f225b4babdf0d7a266cf59605f9c606871b6c207fa173cc1e868263cfeb2d3f8c1d189e489d8c039099ca6ec40cbbe280675e37fdd5efd3208b73636bfaa777debdf1f97e03f643887a5eb56811805ea8ec2064e59dcd860f193b56be3a28e8fb1363b4561ac34f5aaffeac1de5a649c88fcc18d15293f8ac3c50673f60c86a46ce555026b60af65ec710c9836a2c6a2b8ea20f162060285e108859a1364ab5933a093f9ad4ddb36026dff547fc699b2e4ede23690427a6f09fbf7e0eb41a0475613e378ce8117a0c0098dbf640b9b8f8f0470ba9fa30341283a35755af1b93f10fb15b7c9bd255130bd89fff8287668203ff2f88c6e5a18fef60a5298d9b85239a4f1dfb513ace4d3d423442c1e6acb412f4b58fc65362044ab1ba164222b7d477855b30d0705d26cbdb820429d9c83af6cd74eaf0a98b238e4d22ce0a182a3c0477d715903da97c69f34bc911129adbac953c0de3477881cb41fed82f5f3de2e804dc4014d03715378f29c3b476a2ceac7dbea5e676f4badae7b9afad511bb3bd10320fc315be2ec89f36eef6807aab9614b28d13561658c765e8629651d88f7aa5469dcc5a47a7e2842b4767ce848a1825095e4e52bcced12d031db11310c9ce2785039a2a3c0a671f2cd89bd1498ecdbe50bb56aca78697ee00d6d5d0e68a0277794ec0d4f4bff47b9bb539a725c04364f28a1419d410bf2a48dbd3b4519ff43a6551f42b6f64be36811dfb8ecfa7bcca163c0645cd5a5cb2a7a001abbc0e03e2b8e721e02fb803fffc06991ca0625b0bd020c19f4229dd19da3c8a896f87de0f5b82aed82533d772c6b242a9af1c131fd1f3f120e6aee51c8996e0ca0809a392e0c616838cda6a4853f252110fc43b2ee344d180b2a022d61695ee2ba28d1f0fdadd553db860f6f763176f270afa93286452af86f7c4e844e4161ae1a146622636e227539a6a24d5c058dc88fffec332af33822bb6c88911a2f09ba5244a445fd0b8ae2de59e3cf6af3827f15b47862d5aad7fbaca6be03d3076ce7d51f646c619130f015e07e2b23e99232764daa6c7686943de3f6e2a6fe5b3a6c06b7d9e37afa69fe3f1c3c80143f51c18c3426dd5973dd4de9ae57ff9ff215dc1c95871ac24e7cc78c2a0e27600d5eff1545f4a110c3220f4eb62cf299d65cda591dc7ca0dadd958e4af3c2812a616d5a8473a299b52bd9df503ea736ca063cc1b5d1d214ec155657396e04055edad144e9f03e5928065429e7013fc9d5a27b3429c39ed0c6dbd5a41f8a1a078f3cecad9018b61083001d1c196063e3a52d94a718d6544ebf260c36f53e63d873b20b015d48eca5ab217e711fd230ce4f08740df033cd6bb28c10e4fcb15654d53e630e30deb0fcc4a4e302d5a47763ee013b230ec28009edee849b8e8d18f87c3981ff752380f1e8fdcd6b0da28437cbb789395a47c259f12fd3d0144930508215e5e9852f51cd230ce56a5694166f6a584ad179c9d496d86eb96f926a9fbb1384051ff482e6e3fa51b8d77aa5c857cc0c8e221c464d4871d87972e60c48821696401828f25e3af32b376ba6a4f3dacfc3cd53e5ec18074c93f095b78adca212fb8c321f10b5f4510f5e44e81d092b5801537028305db8dd56f78ca2fd25381dfa64dd541bd950300b158712d254340c9514d2cf3cc6a5752d11c18b09e76fb48ccf0140d26adabb58422b9bcc877d883d7a837d3d613955fcd50d355389b6e0e561ed19381641610eaf19b1ed4a2281d08872cd1d31883c556cb31cda8d040c946d91f84de97f799a35e728af108281eabbe547df6849563ffc337e6831cea674271553d259564ab4d994064bac6e1c0d0e85c004d54eb02000a642cb30b3749ede871eb088b05690e736a398ba6292b15d3ef02b4633ee1220f55427121041e5ba32e715c752970250bf6f852563f8b4be21e9cd6d303601c7d296d0e65305b43b9e78670cf903874f27c728a63c5e4980efdd03d2751bcca4478a013c293cbea61af2a59d6586b8253606f0ae41a12fed9cf58c684c8bd62c532fa25ff9d40e43db7fa870968ce0275f1105dbcdcd8a9cc2e818d311bf42e9be40e4ac95806e1f313eac14dfdc8f04614c863ed751b90f206b9c2e58194cd2220cb4b0f693caa40507adafeb154cacc42cab61d3beda4c24c2a1162b12fcf30799d084228f557437e301690a7f8b2fefcbeebe8d0c383e875a53362c1eb8a5dd1c93a759f27682015f3a18eeb28785bf88238542b8f8516a087345428235ffeb5c825061dce781a0e79c34163c5079e48ce4b82ed10911bd2648ec899e1bed78ded3288119892ae2182dd488ebac25d8c715d154f9a7032d381fa633b09bc6385a8a8cc1ae72f6cc1bd9743250cd170a4f5d45c20d204762f9843c1497952095c65d066f0d6a384fe99f30bac6801f27fec0f47db318834cd920830ee8950516269924759035dcbc4feab53b8992927b7969e68b6e8048ae86bab6f19a1a7f62cdd4dc6afaffd8bb34a929f4b81a22b4bbea8c19731d4bd14eee19ed224b93921a9ad4dfccea6abdf1ccae7aeab5f5c373a3b347181012ebdcd31306664c7f98b9085ac32cb50c6980fb2326ce6c4c4419e2420f5efb544057640d00914b671f7c371a49af2644bd2658f73ad553a0dda1007947d560c2a7b8b18e8a8bd82a23d823f987b67b3de4c2fc357336fd61bead472170480e622fd3f64ebcdce93e5fb62ada61114b29dfff0b28662d4f280e6ea051dafc0c5c00bc6a6da15d9bd012d52de2499c189716eafca92265f83c0681af81300c7856a44574c46e49f1545e95fdf0d498bd6b4ac95f4f72f7258a1b98b18d356efc261331f4b55ce33149306ed172590f9c62fb67ffe9ca1e09491bdfa46255045baf29c5a3f92ea5abeb749b9fed138d8193c98bc1510781b325a13275c1a2459bd370f2d41458ad416f23247a0b6a5739809a8c3e3d5a3617569572da8511252b04e4b4785c4d93bbba0a57eb55c215bb14d1be3647aae996beb267a868b00faa6eac5b5c46e275f783f1ad17bc0907843920f604692b3385675c2fbf7b150b75128840187103c493f9214bcde1321463f8779cf34398421000ce1cca755d43396d128e1200f1c99d59246970b6048aab3893d8fc2d9618542df5e5b1692d796b6ae49f2fb9a9748542ddf4d16b930c53d2ac306c819b4c6c702b5f2d7f497d129321eed8c1826fbcb8c305eed3c0378c9842cd6698426ffad7c3a9ded90c58a59bb064177cdc80dfbce9001badc827b10263026402ed02602eefde4df82235e021ec011198a08518cc805349f0dcef9a202244101ccfabf4066ed6f330c48cc67daf9bdbaf7ddf9bdf8c0591bbe8b28040e79a7e2ce580aa3a3e6c7adcc0f0b85989fbb1e30d2eedcd86db8c36176c546b4db5a3188274f0e43891662383c386050dc8d90e331d6537c8be6ec0a056d980aa913426440329861366c20866a2e52b88178f196a32cabac2b8626c59c5909a2ec168f122e92285164d564d11ab06e5ca87159bf4ac8a46948b0a6bea09653e8b9c3f52395126a0685e9e68549a724e6e4d38983598642c69294d253921191d298d769637452562884a8c683137042794830535c84bf90228faf3e4839464b1a20779ec31cef01849ecd0e9c4e5c4a0822c05188a298ef4187542e966c86685091435332568668825ea8c3d66d664cc62c460b65eae5c9c452622518b0f09152c3523645c56645254aa6c4a1b8b82563716a48b2e0b0874aee9c7520ea8aae3c3a6470c0c8f9895b81f3bdee0d2de6cb8cd6873c146b5d6543b8a2148074f8e13693032386058d0809ced70cd62282b2313bbc145cdb23155a339864443486c45580ab09aaf9717af97951973327674c5c055b62516836b9a0563ea45d305929650d60aac145735562e2f529795aab9e80eaa18a6caa062cf22d75f9d5912988a401302480f1072c08a06a460408d88e2cb028a2b0a984bc08e103120a0ec00622a7005b30c30558026019052101ac00a145298d400892f0220ae04600e003b7e319c5056226602979c0562ea43b3042412210f2b3aa420a1266e7919a16585c3dc861dbe18349465101be182b344a6429a3da45788b7e2ef54b8365fc69368e92450b8dc06c641600a703a06ca31490c2db005068129f0cd62d6dbf6fbd604b89587ff6ddbb66ddb07847840889685c6dcb6f22bfbe2560ed1b621768b8c31a11d4a195b2b499eb64dcbc14b5d0d94c5450c586b1bc786b179a21a42f8f69ea7e9ed8d80fa8242c69b09a789a914bc370d24c5f0155747822d878788b77f7f63d8d78220461b270dac1e25e88c11b71394c8727b4bae003bb1797a7a9b27731828ff78881fb3d9cb6f90e7c6fba02c22c83322c3ef6e90bbbff7b22e6266736cfea661fffe7f3e4477f71709dfffacb7ef0d7706efbdf79efecdbbf73b301134e2a7040db4af1f2c0d6d4727aebc6430c5ce9efadec8260e411834355274c1d0f4ac5c3d2dcd9e4d06316c452dc170dbea7af2f5edbdf7de4b95da7450440869d0c52edaebdfdf7bbf77903dbeb58f0fbfb7f7defb2d421a0c11f4defb92a10d4474a054fef9ddfb730786432b03e5dfd6f1b1018e615f081d1d3d19cb7befbdbc79f3fad4b1310f83ec4cd987b127204a3232d68cdab5a29823133b8a3b441bec4e315621c19d47ab88587cbe18e76bcea67bef29fce23eaf511c3fe6e12f58b463b77444ef9eaf6bc8ee3956e7bedf7bac33028677eebc3ed76c62107bda7e3bfbee62cc1131ff7b27fda26235622c29587965e5cfca319b06809995d7ff64d420e457fc775ea97446cc43986bf9fa6ed5d83520453312692c985ab51394e2e894295ecc20ed14b74cbc60c990f8ed1436a9ce0e197528aa533168d8ba2a71c336c36594bb5fb995eb23e4fa24f956f810bf5103e76bf34ef2d0901c5b9134f2acde52c1e366e645c6cb8a351d73effd5fb5902a7558d5400abb4eb2f03f5b46492d6e9e6488902e7200600aadcdec4cc556553cafd2244732436147b0d4afdfd6042d771364b66dbb09ecdc76bf4d20422b0f8930fb92e1e6810dd8033bf5c076b5402eb3731b570120b440ce8ad480f93bf30008014ce8ef3d9e4ac193f6de7befbef7de7bef2d42baf7de5b84f44367846db5ffc3ef7fe79c5c4b6d405a2f3e5e4056883baea25a5b44bc4fbd1c93a89042612654156adaa08ace8140e133f622ce4545e54577001c0c13b12a84f3a442fa9180132f335539542fd6b4b8964af2c78d39479683aa47ee072e3138d1e041daa081b57f0cffb7771fb0bdc8d924a150bc48a96632b4d5252337b12a1b3f7884ac74fc6559eeeca659c4120389cec7a621a30509ae331e3154b53f86ffeb831d297c6254eabaac62e8c181b8678b8d8ab01a9430aa968dbf1c93c4d9cce0b4cdd02051630a2c43cbe3032b3464509e86c074fca45352b33b0f7fc10c41b8ef9df530afcf9caeb937afcf1ce93cdc70ab2673dfd956b45e9fce8abf2ec3f804e3b79f9c4f4bdd4749847beff7eebbeffd13f559fc5e80eec3e34200d8e7f8538063d867e413c3db7d00b0f789e1e51bf641e9f18d020c1762b23fc7c103c2beb8af35dcceb700d6bfffcfd2f7a1e2de2763f40200438f5ccf54e50ac74629a374e3985ae860caec4899bea022fb7700c8365745122b7cbcd0a8591af177ac6d3bce8486de7e60fd248b6a7eb29c4ce1e327047d889d9c79fbe625eb2f9175446a787c07e1ed1f9bf79e1cc13321889b4ff6fe0c84f760ef071906cabf17bc126039867d2ba22e494f9bf741d906cc3bf8e2140d7e93207baf7b64ec76ec4df4df7bf7db7bdf93e57d10ee71f2bafb390463d8e7febd7b8f91c806a0fcebfda785db938cf1ad3dc7b7f3af610deeffbdf7de7bef51f04263549d36d51ced194e0ec77c5ace0dad98be085bc1cce08b7dc2bc07028ff4b31160df579eaf5edf5c64fdfbff8c79df77325ecfa90a18418a90c90d1a268c8d2ccce7c828acc6d737e73077b1bdf7deef18de7ba8220c91118eb01f2aef1364837e19418d34450eb11523ae3cd38ea717af7f0e7030867deedf221b641828ff7af7de7b1fc4e202c74fd60ed19086b612bc74942cae8ed0a83726d0a302c6069014351d2e3ac8a13a51a36d692aa944ce164d0c2c62a84ab6ba98267653f7c5336783f803172e5a70b411511569e2034a38a590bef5c4a96c75f570c1447513c30e07ddc282688646b3f9a36b296a4605848282475a9d111907122b008bc1893a5990e05ad76a705479d53d4da9b18cfdb8b1022e2a069d3202b43de16230724271c16184d657d80c124fa74bcfd6004e56965610a38f900eb48495af30258c97184ed4b0f05a15c1edb25cc718773c4ce505f6f1f271fcef7d5d83b5fdcd6f90e8ba448c77b56cf805090d6bad3558151128ff6430169d6bcfcafbfba7ddd65b6fb0e52bc3603d2edcf986dd7928c32b785f73222ed6f6bd6fcee67e5fbce56e288d9091aa4861f3b1e4f6b50adb3309aac318170794b4744667a2e8884c6b75749dd216a6a3d8034886d407fe3a2bf6dee1af183bcf7beffdefffb7efbdf7dea32f8f61df6682bbfff92ebfbdf7aebf94afdebe38a9779b90def6fdd5d47befbdf7ceb58e2c19255ecc95f9108a326a949024154a0d96b5ac6ab0ff7065af8321a67e964678407b7e85b4fb7bce59060439b61053c12633236ed6bab56a818243a66749e519a3e51732afd2275a376aeb50d8218302b9b1d8f154376ba3ad151bb41a4b492376ef015659b48c0753893343aa996af0821441d5d0b1c643c748cfc09ab5d65a8b90fe194e26d69e0109a7a0185e4e49a9291a972e085310e28c969918ba8a8fa8e4cab869402000070d831a040000301885811c8619546d011400081db240587c3844403c48181288848171200c0884416130200c0400028120481c6acb611486ae0000141480067e851ecd32983ea8b4f9a1f2bf2048521bebc67b8ef7069cc41082fcacb580dce4708302a25ee5865a066c01c6a15f023284247f78be58aa06530f943e03227a802461baea176cd93985488b01e5565baf8ad8d1185240a149888424f1c8bfe01010068748134936db7d31cdf1f6a4c9a174cc89d690f3928e2169e91e4e28686a44e657e1534892a33e33e2f74da0b79a480e545f53fdec73a2e6fc38681e36ec04ae6b0a44e563e05e00288a1b8fd107dffdf104206edba969f074d1760462c5fdb70e07b87a7aaf279083060b4b9523e77b2945638ec81390e33abb142ae862fe7a027a5d291346c4b452c36701df6ec847e61ea2369b1c8156116f3d10cc601a6d341a6721022b0a9bb9676d691b016d73342b21dd3e1a81489c4d3d0c18b573a5afd5c89b8df760c8f60c3ac7243b36ac619cc2dd74d7747e99edb8088d89c1e40bbe2ee6abd8e60d4bfb05ddaefdb94a2222c0d78b89d53052e982908a278e004db76d4902d0545862d25ebd23a600fc3fdca04f1427a8ba7e345bc4c158199485d3d16967a185571132de4e63cfa1e02e8c741bb62855ce7666583d4a4930e5a7d3b219cf6ff1ec53810324722ce54999f2a0ae653e6b80d0e03bbe3c374add08b0b90a8ddce96fb8018dcaa981ab9d74c7763be5e65c49b268e7dc32cc8259aaf581b14eaf64bfe9b74e4b6c20b4d30e18b112dea481aa791d4f75fc2de2739e90db3326874ca5ab7c04b0df72c56799b645732a60cc4b7b15ef0e81c345727ba54be77ec3087f26d5b535cd84edd41ed21d15a097209797f81d8304e5191dd57bd9045cf99a916a699464fc66a1bf1b3f6a8b173a9952613d99ce8330f1d6e66a9edb888efa75554cf353d474064ad78e21ae2686f7f99710a92ba5e779b93e470b7548ab953c18cb55be8f1710f05eedfeb895b54a3d4004b714f07d259ea77cd5c6a739d5cf4ca6ec4e558086602343661f7e1a367bd8104e0789b11122ff56aab49958a2dd754aee9ca0352a2bcaf4a6ef6fa2e8f0c8e80c17dd2298e81166182d8885d1ec65d8c5f7d8855c8d1ef9422b6f33466db41a84dd3060654001763aeb3ecd9b69ea11c2377d2c064416443fa3ca76690a2a4e9dade571505e1581181eada53ed379de91cd0b8adc8ca3bb56a9d87aecb88550e233f2db031cd8e65fcbfa6ca46d73d7c6b0f26f39514de808b980361bd07b8ededca69bf98ef76c6cb4e167a88bf758bd05293667e27263b20d40ca3ddb1e36f9fc6d0fc3afd76565d432d9b135bfd7daa59d8d1ff7e29b7130c1d062cb9cf92a1d57218f39ffb26407f81a91926d60911a5aa35fefaf913a826fa763efd008682e0b4a1f5bd6e5ad7afc37dafa4f2c28d01941d6d2b175c5c75562e0b5de82499f4b656a20095185ee2edccd09f5abcfaf7585fbf5014c05368ab58da2162763875aea90cc13580b7fed1f317062738d6407d5c29ff9d0ced2431f187010747041f4a038fe0926e3826b509d465deb88e89656337e08b23403c9eb992132168c731d5797742f8e924d47c14c3474be35cbb1f25777f5ab8472d151147d06c6716d9c98909b3d64c5d176981e422feabfaed14dfa6b343a3d6c802e6191aa0014d2a970f4df6d0547a308c10ccdd5a453b2a151c3c32b2b150f8496dd5e84178c5efcfe34c08f8d185b73e1ff2c578504a77254b4deb0c94ef008d51489ecd249b231527f0cea13adfbe66ee4e79636d2d6235cecd1b1948f9c11e328af5adaaecbd74d49f92fc10cb03d5ac9ca9e6a27797512f51c7e79aee208ee49b363a43988fe1c81c85751016ba8baae830381c7419bb4e5fca67c58b453587c58bb9bbdad8283a980c34c7c36784b887379586b1a7fd09e306c161ec43f4c5f11c9f6a486e7629ec4b51c0c960e2a11d1519466050dc37067a10745886e02ba8acc0d15e9f7bf7b3d6b5f2127ddafbfbf069ba8d3816253baf1400172102646d10b095f694e258b20d37b9e80fa1ee74e0558ee375dec3fd8bc83d2852e4210fecd22f58bcb7259ebb868740995c6a4e8beb22a193df18e77a26e0906078057cc74a508d2cd2648253c2baa9ad2117d36a1a60f29623d077f8347616791cca952a40ac9e0e77dd34a398c5aa1737431c61b1a2e8e680a8d2b9bbc843abc4a40791c745f3d5c793202e743b1f961887b496a12fc9f07e00bf21ed77d90f4344c1abf30100779a5c2dc257da1d003b613f6ba523953660aa3f57ee0253b6624e12f17fe2ea7344b8157475e44410aa362c5618905e7a3279ec349d9c96548c92793f2949d833292a01488a0b0d432be53157a0342496bfc2ce2570850aaab16b493e6fbb73199459b35907efcada8f8438a8c6186a14ddb4a76b64778f06d5800c96d3541dba38c23cd148f1f35f96daa6f0995aef52637ca1c812c8ca275823279636788a9bf706457807637655cdd037cb47136a1e9c7b0c917dc184cdfd071f7b1fc963157b8758c40781182bbc6aa24116c234b94bf1084491c7f764942e897f584ef0a6704d3fb752bd0cc30cd0fd1a2635814a238f764c0842c8a60a645930680bad14864afbcb5a48da975078e654a739c9433770b3e9e317169c6909ff986c85c8c3a5489ba28f232132b9cca6bfc7f12f38922a359f302adb9c3de3a7a36aa81f75a55870a7424a7ca3e774931a89dc523745f08b3433e3f43d8eba553e023e70dd5fa857ec64441d19ef254cd2705ccafe570e5b4660566ab2e359a4c16e67e5b8fd35516669acc21e7e7ae88b007230d10548cd2cf05a0dcf1727c02bace665ade8a12098054de5491d95e9753fb3ea2225dee8b4c71031639e5e65669b6cdb09d19250a3149994daa8325896eb801c7bb9a29de5b5a85224580ee88460bef9d37970eb00cf902f248ad51433d5cfcd6c23111368f4779b8c1a08dd96a27397f898981dffd0950cd8801e9e768c2e9f52b1db737ce5d1fbb2414ccd51271caea5065efa9f9a15c28b22f4812fbf07541277b506e8b6c0344aba853540acb029a2c5b58735bcae2b409c6d928ff3b225aefaf2b76fdabeade0ad49f80089b2063c96cc9c34d0754f1ada551c4d1df4cdca208ff5a7f8f2b9c62c8a7871cae2bb953b7f03067ca4e114dfb874e9206d6f26ba92c04106a665211a03c84b755e0064034903c188b6943c22bd155becb1fedb189344344b5021ce8b03fe84d462777970f26d2d3adde229968402d7926a6d8bb0c7297eddf7815f2dc9ff86f45ec86711af504944df4c35c4a365a1f88c34242c04b4c3c89f65cf85d9026d5a5ec8576b8751decc38a9e08d8d06bf25cee6e1d662a169b00d7a4e93cceca4999b5f0952a7b0a02f9afcd6cc952f4113ddabb24b50e6dc2e874916eab402b3fe6910deb2028441b70c41ab584398058701f178a895292018cf935ed30b41922855b22cd75e4dfdd5e4c6f28413461326a1d777da18f55b99ad7fff0fdb151442731de23c1fb7b9d5294080f7eb7ceb6e94c1cc6cc5fa892e52ef8b1a7b5c22c18501a92fe2eb459d29721c7c07271002a0891ff1629e2bbed5696d37ce9477c8dc9a6a41ff656adbbdd16a6ead409efad8fcad83a08752e088ae4d4e97b61bbda06e70f13b23a0ccd29721738a32108ff12339a45b3a37761e1c4aa74c8e3ac9295dd8a4bb0abe0a40b42313b9d39611d3be4d6bc5b4cc2a34144cd52f16d9d4466fbec17e7a4a08eb9bade556957d2898539e29342dc7cef57b0c2f6ec2b725ab9e74f63462b726c1785fc7466878a94784315d9f32e4fadd70fb9b3357a0385709718e1290702f6d2a92ae071c16c221ba9d3a0c98607a521ff78c6200aed6d1390d0b32786d09b35729d291a5c51b1ca33a110bd6ae2df643dbda9f8bdb9d69b4932c2b975cc9553b0ea653a334b98e6a24fe2276285107e45adbfb86059a19652522662b5030e2226f6528e6ca0ebbe82001c6c02fb295772ea5e2f7a4298994e813b2a4e41162bacd8b9df0313f34d7b6b41d6148599a5192da24b3a34b02f260fc721967be13e86e8a400e776f3beb6637ac9342f45ac6205f5c0154343725d80253011ad7e7869d6fe75a22b53195cd39b4d90e2346ac2a452aca0c60f1a877b7f7481736d0d760a7dd973a88e6b90f3eb84220b2c3465c14297694c40145cc245a76a80d565dec8fb1184880bdbdb57657da355ab8545ff78e5cc449cd99cfaf7696e4545b02576e0ce8dbed33457c1df398158175ee161506e1d10ef104e3dc1f1f4b73ea7988f572f5eb72b8c280c8b0b38be863980e9125318b502dc8fd1059c223185b4716d5282e14d5e9c81946ca8eba58ab2455179b843b3da6710e45a7505a84544a212b3a6cd88e0481c9f21f7172be6b95f743f8f058204cae9341456747fa5e5213a144c75d840565e21e4438ca9b2a0e57b8455b0446be1475a3cd61d8b3ea59991a03890dd1a69b17462d4f0a235cf1cc81a2fc6a28765e8836c66530a48cd47adc3cb17b52a7b5c41b927dbd379092842b246892628702c7de4bc6cf4555f21abb12f3748bd00a4c053aa388fa0c7888c8187ad4091f2c6d5a244fc39e061106460f4c54c4c24ae67cc27fdf395f6472b09dbd06895379d28843013c8d062878476b24c990610414529731ccc66056868c6bffb9c32dbb268dfdb9280faad892ab9df3c207a00ac0f51d3ae4e5c8ed39898d21a1ce850ae737e5d3782280ecf5ce0c70b4259c7baaea2cae7aa005fd372820252727b44f05989c0874a50e3cc3841bdca5b09e3cfcd3ab2cbcb99e6c414b836475fe5b2bcbfa2b0cd6bf5286fefc62e8a44f5ab873802ab3d4a149f585cac4739767b14c8c29a43e411cf1787ed271fbc5273e80cf963967253387c9a581978d31b6ef4e9193a44f4deb950988dcb67807260dafccd94ea3793419f969b7919d84810f0c66648004d46076078a4f2623840289a15b418723520d097a2529b0a6af84ce6bc636f62a3d0f916bcb8f1dbcf15e87b35a6597ad2aea0c4573c20e0257a9bb5a1d6bc27dcc2d0ab95657da3dcaa30dcc6ba5d361dbca47a35dab2dc2beaa7974308d963c8438774ebbf9892d8eba3c34e62ea40392a7b3d54f0b77d4552ce9144e4db3e237a7bc8d9c2d24c1d4a0bd943dfb5940171ddfae7e8e250c2ab439bb7fd0e3aedc88d2d16ed9c73072a6b3924db5b26a0a8790dcb632fe96014eee5231b8ea157b61bf914899837349241489037f2e1fdd4318428c6c97005743929d425b732e479ed7049a81c58607f6a7d693aaebe34a148a4f5a601c9f3eb09851d5adcd7b31e7d33c3fdd1ae14a6bfbf92f3390a90e51117bb9832c8bebcdfe0ae70cfb791763aa33546185ff856038e54b4e0c79835b067e2638f5e909c1bdad522e2faf549d208ad35dd94c861fbad470f3322b223c51f41de0f5de2edbda0e773434b3520a0ee1b2347fb3245b56c942b8bb6ac28ba590db258190dc538f95deedd4b27d18eee113d8aa89122e9072013b1a947f469ecf76385ffce551b7d5cde96a812622ffd249adeb8cf733eb062881b7dc36201d906edbaa6a5c506de3532eb592216918ad7fb23fc8cf19289a5e34581b70b3a588beea177d485f4469b475e738a1ae985e4f8c4aeceb2ab79c7ea26564d87de36cdabbfe6ff7ca2e500588143fbb27614373475143d9c9217519c488a23e10440213c0a696bb73e506a57a9da7fb9605f7d130d0118a6420599cffd731babec0edec74006e97d4f4fd9ff8a118a333d272b758ea7b37d27e83a8fc4b9846966eb9bf43b19d5791ccead3b81c739a64e2d9cb3ea4c3aa7b138e7e1d49e3374de3ca26bb6e1cc1627f69c8dea3c0d67f99dc0e3b4927389ce59e224bfd32c4eeb70737b68065ae79a9c65744aaa337bce2671aea7b3fc4ee03aafd4b904ce6439c9ef641534afb3cda57782d7b9264e253827e54c7aa7b13ac7d3a99e33709d47c4d9863359ddc49e9a8dea3c1acefa9dd0e33412e716ce49ea24bfd35a9ce6706edf19689d3375b30d6e4aaa3379ce46728ea7b37d4ed0759ed4b905ce6471b2ef6454e7713ab78e4de06573a64e253a27c59975a7b138c7d3a9bd33749d47c45906675a9cd873b6ca9b4773cdf69dd0e3b412e7129d53e224bfd3589cd6712edf196a9c63eaacc1292bceecbfd94ad91c8fb3dc77826d9d57eadc02675a9dec7732aaf31ccead77428f734c4e25ba39a96d26bdd3589cf3746acf1938ce2b7296d199ac4eec399be2bc9acef23bc1eba695b8b9c4c2a9e6b172363a72bac1b9664e263aa3e2ccaacef339b3e544beb3519d57c359bf137adf349234b7e09c2527fb9dd6e2b48e73f9ce50eb1c13670d4e597566cfd94acef174b6cf09b86f1e299b2b7426ab937c4ed645850b26cd3cf04a786a55607a706c212e77984964c1bf3b51d569abce179c55d9c931e7af3ab3eaf4dd9b53854dca3b6de53c4da7ea9d61c7b91067179d53eac4ded9569d93e1acde19b44e1b71eea29b39fa26fbce26759a8673f74e90714ea97307a79c3a53cf6922ce753877e7041be72d392bd066aab6997a279338afd3d93927e8386fe454a173aa3a39e7b48af33609f55092ef1c0474d636a7279dbad366e6dfe4254898e062baa819cb283595c3851e7ad4b12161a9660371d2a90d8ad2c01b1561b92016337295409c7e988def331a6a4727ad610742b0ee47f6c36b98561a43ef50766682f784de13eb20e88265bb70673389afb6514e64006512499576ef5191096bfab781f4b6ae26d5a325d4b3930bd2169b154d882d8f00ce7d792779ca5fa061f5849781f5d0f59895a2ec1db695415ed4c521fb7e8fb61be023328f80c2508415694047411d8d8b4152a0f4e2adeb0c7c16022aadc9575b308cca4a079b9510f81a9314ffcaffa0575e1cc41cd3d8185cb761d889b95702c38cacf2ba6316306634b867611fbb35208e1d1d3e7a1e99c55bdd98854229c709ad1a0020574a68cac3df008d8c3d4412b2f7de5bee2da54c3205df0525055805de77e858c7cc5e48e4cdeee9541e7778ee7ee6fc6875a266374310dc7f6a0b89a88b74c87de73d91e5512e45d1ecbc4f390dfa3bef21d10e12ea683ccf73ec68e48cf951e0bbf008d3c1e3c5f91cfcbdfcefc5716f9fdbf1707e5a71fc6c77defbeeadc42fec02ffd0b40ffbd6f77cd7f7e41e146586e11106d3c139b8c3dd5c0d0763171eaf1cbdf6d96517daf8de43fb3d2567317d560645cf9c38ca17b2fcf0e84f637b7fe93df38c466ed0d9a73294bbbdd349279df4a7cb72f7d5d698aa94a8904cc92151514d535f9eaa642f146b928d42994e3a29a59e8ee99f7574b649c5fa53cc21cbdb7d20f91f1d3f8ff573c8b2632a0289d476cf83c7141180fe07f3f87920cc03c8c3630a54997e9152083e4313486c9a8b9d7fc4a671a20e1e797b2a8240f3a663e64d6cda8fd8b40eb72a0a79aca97c394462d0831430564410441a2868f2a938018ff50b31647929cdf46f6e272153b99b88c6c4cc405505081dda2c19600b1f3d88407162a60859e4c39a223b5439d2e30889abc499258c3cd18205938ecd3d801123af4184e4c47d3a132149f158e7cf72c8acb1011caa48e950831810b440930c18220b21aa60c0e2280b4dbeacc9974746fe137647cb8509114c646e38d202171aa5b5aadb799435af4532974a2cf4f4c06637f83083c4c8cc111ff7beca545949b92821810193e5b7edef0cc86ff9563e4c0b07468a56fa9a6f5f302f371060cce4f1457b00a381afb375abf4764e8c406ab941428828ce36dd3ecc754fb4a7d65aebbdb4e7c3b23c9f3a316a890ce6762aa2083259388e0ad1c2ce0da2e9eb7464b0ce52bae5d0a276cbf9ed721c07c3a3a1879414427058f383c907b06073a5872c2aa459fa2d09ae4a0ae3e67c32802dac5cf1040318252bcc2562ac420024092e4a423c80859012fc30aa62f5c42979c08a2cbc20b1c40688d31911aa70a1694b10255344b16aa8b202a5258a36565bd8b06ddbb66ddbb4dc1357eb986da3b586a9db1604a574d249e7a4934ea529485b14e16408285a2869365b6a80b2c409b298200d9b39e7953144b8f93160d472b5e5d7821298c2021253cd488a1d5e93062aa870d861c9072e5736f9b01873ce392d96225ba00861d4e3cd961c5a3349d4192b7890a207125498acfc8842b7da23130a0a4276b76a6108d9cd6e9b6f4c8cb83fc088f1f144e59b4925b8d004c607244fa2923c487a3205c48f1f5576f066985182373e94d8f2849a1e386e091258a90b4ae7dcb8eba276dbb6277668bdb5725061ab2db54d92388ec3a9944529a595562a86d6da2300375ac3be567c3370dc065b8238d1a20d9826a33b65a0a00d0f41927481224dd5074e8ee36848bf3fd2a2248488a9129091220749085f9e1449eaa189157c345101860e932ab6ad87579d5cadb4563134a41cc7c57abc3ce53826e1acb5d24a2bc7713ad5b9d8f7d01c7961f7d5711c4701216d0498374dd46005cc93971846a4226c5042c48a2a8c506edbb66dfbe8f68251212f10a8f2821227b66091428d0b8635607c0c21a6471b2e3c90400b29caf556a1304114269650a1818529be7984061025569a20412105b11205e5967c81d281c819264420e64a129611d9102e3708e1041a2735db06bb52a5564a9da627bbad08aece69b927aed6315bad61eab605415f3629ddb6edcba493d249277dd9acb3d6dae5d65a6bad73d249e7a4ef5badb5d64a39aed65a6bad95db6aadb556992c48cb120d8e2833a7172d6bac10d134df4a718589d20b5da8488306835924081a1f4e446da1c29399399d9230e2040d3eae704802d2c4ca9bd624e267a660b166cc91102b78d192c58a151fb51b017eab82e553eb177bc1b65ea2db2a0d405b6a6d0d3160c28d9526901041981698ba17ac5112552220a28722ae5a1730e0890b912c9c8c8182690e6902091359929e20f1a50c5801a5767bf11c778ff0ec4661dc16fb9e1a04e4f58d04ac386da9dd6acd32c5d4144512154794a051784286c810a1c5062e55fca072f182ed5c8ee2b0c090e3386eabb5cc0d34e04025248d9b18ae54b9338805a20802071c5648a3c64d073fb8410302325ba07899406e992356b0880122b52607af833d863bca282759be8c9a18bf9e8a383f4517ef4854e62dbf7e0b3f685d5d5de5d73bf872f5a4f425ba4051e6a16945d7d38f5217d45a1745aa723b15999a3f23b753912bd208294f96288d5ceeb3a3aec5ddac39943ff9176f92525641d5fe282613baef72e998f9e2beae1912b99ebb46e1533b19e9217778b1acb5b9a3a478ec282c773e2bcb5acbf0e14e0f65ad65cc9f4c77eca811a2e6c4120af674ad1582c9629db59dec26af29e7e8a8ec72e1ee39bfefa55c21658decb6d31423b99da618d5c8ed14c52abf88b2268ad48b175ed017f47d40323983be03057d41dff77121117d79b9ffb82dfce67bff23586bdfeea8f985f49ad378f19286445e02cd9d105aa24882cd932a8eb0b3a748a364052c4de4807444fe84725ff41379e2f083577ed175d6addbf930def1389f7befc5cf6f86449cccdd7cf1dd8b97e18d17af33eb17ba6566f7ec784e99e7c441d5f5dd3bcefb8ff51d8f4196fb1d1f5befbf23ba9a5c0e8f2ebcc3b3ebbd1def69e6300e57ce733878e7c78a77f04873cd13477dee3b8cc3fb9a390c2467742dbcc3f358943b8fc36350762039c3bf77910eb9bce107f98741a05dd75131e73bec6c50fe092437b0207c1dd4b554153f3cca9c6f59500d897272443abf13650724677cdf73ef62f5c476f77e687a3776befe48b9d0c6ced7ff2c2843ef391d32bb8bf2ebdc403b41b9dbe2cafcfaf097a42c39a1dbcbdb6a00cfc360df5117f7c177b1fce7774f45fbc2f1f2456a7e278e3cb80fec539e051465f7694251e670072cc88ee7cfef7e6876e2c87d8cff36908a76e7291e75d07c0205b93e754c7938bc80a25ced7ba2d81e73b1fb1d71e43efc1a3220e7bdaf610732e7fc1447ff0ebbe8752e7a39ef6157933b310839df611c39ef611c1cb6780c9f25cef083d7cff7d0031c4c5b3ff1e87aea315703741aa0f39f8e38a690bfffbecfbe776f3ffbaef37debed473b3cb67ec7ccdf48a78b0fbbf8968b9fa20b3ccaafd57ada7afa15d00aba2d1cbfc43c1ebcdefff58e472f7738ba877dc0f3b087c1c4b173b0c8ddfbef3d24d2d11080c1be73a190ed4ee5bccf799defe7bef762bc4bd491f31eda9039e73db1b38e886387e71c7c82cc94fef7f5f5b087e1b15b40d1a4e0ebfe2562d8ec5c81783305628cf05d8444adedf5a107afccf3df4bf4e7119fbe3e7c1747fbafef253e8f38dacc53cbf46993ed28b076955e4d31fc4318ef3a66871e7079be157570d97520e0eaea2a8f45f9c5f38845b9f10ecf2f6088ed3119bec00df4f338828c49b26209ab333e4c600a354c503c91e2841340626cfaf4ffc8e694991365673964d6683359aa5c4042081424548a96fc7005d40e522c51d1830643cd1444d2f848c2e4c335ba1204d4510e6494a049fa53a42f6fd4a43f87dc7dcadda738359d4545101c8d9c214e2bba94a39133e8db6945d67f12749f62f994c7a80e6e8a2c6bab94f298e4fca8f6dd4b2d77475e99355a0318adbf9f35a495b2367da487e554545496b73372dd782375246b1e231376df61083f3fe43f62274aafe85adc1e4be162b9f5eb6b2002899fb8238ef64b0ed98dedc3b7a2572b5a35af702a992d5e93a7b5d8a75c4dee8eb53feee01d9ebfb7d3b32e2c8e6dfd7c5d9defb6af81b8f34062b7cf8fb8b3f3dccbdacb051eedc5e3bd3a3a6fe78e9a67ce73efddd33c318e1c3ccabcf373dc51f3f735fb0ec6f1fd7cee65e8c18771745ff3e474b8ce7df4a96cad27b2de8a94f5ef73db89c9483b312149a49027849f9f31843cdfc51ff1a7cfd754dc7917ed5f319591e4af82a108caff4489f4f3a305faf16aa0810824fe883d7d72e84fd1a3013f7d365148e63159074b4d11983e1e93a364caf22593d3985826f19814a7e17889be3c3a924f827c14e48fa081e9f3cd0830347029d851f3ac55e6167bcb275ff65452c4c7d30f662ef3346e2f50a2c8ed050a163f52aed0d8b24686d3863c520bdcc994476b81fbca23987bc9197cd5df5e969696922c1159fa4129edbca530b71728561eb86ddbe67d5098dc60adb51ff884c993f99aa217262db05c6c5a60188661eb3af1b2c48a970b9ce212285c802e97cbe502673631e2a14316ab5b46ffc7e5fbe4657ddd83240996bf74472b8d640782080f5dc2308104123bd01c86312678618a2053cc5045f327c11f057fa139346bd86b47a1ec9f7f8ce551e8c7c63c22601efd984704cc637a4877b45ec40899db51b357396570ff1efb9f8342f2723f4322218ff93842de9e03f082df0d620e3c86e4da1f836e08b9f57c0b721a9ce4a92ff109356f1b10a55cb16740710c59f8eed2062adbfc1dd78f390d4a6badbf51fa96ced8f7c4b6ecdf960d96336860002229aa6bc2c295305b5451e2084d7e5b19dce79cd2dd5d12910495dd9d929eb283d9dfeb71e9cfa424b99d9290b2bf01723bcd6044aef27b3ce6b13103f940966439c398c7bebbbafed71fe6dffe56c6e4724896efa97079fc08a1f148e1158536657e0a3849d05acfa3aff0c11445e391c20662aa34d15a9fc206831a10d05a780acf07939331501c650643c89ebb7bbfbd8facdfc431841cbe27e690c5c47f72bd07893cffee1d77d0fd0dbf27f6ed3deb6568c39f82df74964b075f82ff499005e2a1d9e47ef256d84c023a38935cc93acae10fb98b33e976f8fd902bc045507431dd7f4f1c47f8b0c7c2431e93df81c76437f17cb0bdbfe3ce1a10bb639facfdf716c44b24b448c871018fc99f33dcb19b9a403c5afbe1ce9c446a51aa70abf89a32dcf195653371c7ef91b5d1861081a10e58ee354129e5be250fcac3c7a2ec328c7f963f85e6fbcf9f381ccbe87cff21f73965beb346510e62882002c9cb920c6c6828c420c3133308893202259afcb6ee0408833dec1f160376c105185c7001be3da2f518ec258bf9bf8638954088cc092a3620b16108066e3b1991927b723b1939ca45988a285122678890f1a62cbfa390aae87e42226b40d494686872d24a5424152c14e7bb673def6a7df7ac6701f89cef9ec5fef311c0ef7cf76c005fbf7b96c173df3d93f1de77cf08f0dd77cf66bcfdee99ec5d36830032321880007c6201c0e0821e000ce1225faad0b3d7cb973d7a06be7ce9a367ac9e853fdb5ebe5ca16730167ac6d3b3172f5ffee8598c972f5be859bf7ce942cf2a78f912a967305ebe04d2330a5ebe0cd2330b5ebe14d2b3175f5e3cca17eee3e05112c9f25d7894455a7894465aaf83477944e773f02861c889e17bfadd3300fc0e1ea50c59ce509fc3a34ce29278dfe151d290a5c5a35462dff1286bc8d2761e577700f0e5e8b45c38177f2bcfb7808230b78c0abe3cbfc53c3f86985bc67c9ef9214b94d12d634c371dd15465e490284945bb529036b206e4e9480f61e20508fa7979e79c517296ff7283ce12e8835e3ec50508fac1462e454d03d1b60fa5d8bf97df353adfda2bd008284f6b9618212d41c10a4d94a1412a8d550ff99d5508d745f7e6cad7cbdbd1f91d1dc1bd9b73de9f2ed7a42e57009c64b0018c923623389a3b546199028aa92c2700130514526a5335b830a64889872a42f0060458485dd124fdceeaced7792a4a2929511c87b2fdeeebf79ccaf1cf77dcf1d8bd4e949beb3f16e5ecbc8b345b712caae51d5b7ee1bcac4d1c1caa8cf31cce7bd8eacaacf37aa7a1f3f2a594d7b85467eab88eced79048e7db07e71d8fb04929a59676b4d2f163b21612aaf6f35a0d8974983c263fc7d6befb56eeba0f2ffdb891c79cca0f961f9301920a1621ca45886a4cd311425d4646492a12e024450d165046a0c51134b98497305ab8b93a12c5a5650dc8d31116ab755daedb627d72f2880086228f08e1b7be8579b43efc225a8bd56239ab755daedb627d720a7da1f86141d585e20662aa343994dca02705edcb3bade862bab74af42b9cca63b24a26d434506c9a0cbdcf0499895c4cb79579bee6d24255eef0462b2f1d3d0dcc43b25d027f3e07763ed5d5eebba679d0e1186b60f999901c0e5a03be7cd9ace150208672a8e955d347524d9f5873ae1b6fa63cd6b9284bf0c367bd6cb1a884e0eca72451aab2f091030e567c3a9557d51c7913721a8e39a7721ff91c1e73bcb290ece8fa8fb2208fc99df269f657f64ab34ca82a7d3e44459924658c4ca52cffe57d9d7bd779d779d7798e579eef79fdd44f505150503fdf5e235af3e7ae918c6a21b74c96c79b7f2873268f6e5586cc3c1a72e42db9e334e229dd1276dcec572d43bebbb15e0d5ed53f24b143369a475ea369f295bbffb66de338ce5a6a3fbc61bf5b86bff7f2bf297d4ecf22b946532c9e463c36937801dcca7e4fb0db43fb9fcf1a35721a96ded0c869d49cc628ed0dbba66e2beb86ff79a01567ae150c6fcc0fb4a2674aa99579862ea66bbf3b36ca1818de90d97a94d52d63e2b1fbed3f236ff2120392dc5d59f31895475ee5342886794a2e0d177c2fc9fde4a55279723f450ec8aa8cc39ffb6fe23185a35676ab9621df4bbaf2e9f3e4979a03262dc4f2cbf4d9c4f17678f4a77f50e46087c79a2af7ff60e64c76ab2c7f304346ba95d3b05f954b3041e60e97e0bd8d2f7f6ffff3441bb27380d33a3c6ebee11cb22a574c3109335c4f86db5329c704fdb19e797f14ec496b5aff85c5f8fe9894b80439ef83600b7704db5d52d65894bf2786c7fa2571a067b244216fcdfd904b298ff526d54454135252ddb5697fed373c7c538691524e3aa7e4def284164ca594fdb25bccc09d52b63c218512f9da65151df2c30f59b56d9fd72a8adbc6a396a738d2a62e3077972bab2c6bd965ff7cb73e32c5b4cbec644c0a75ad56ab35d1fa69762885ea538de5513e3d79d8874c9ff9424232596c8c51993e1306bb79768b683ea17ad639e9e2902f6bb9f328df6bd96bf098329fe45386c17dfd5af69ae4216bb4a1e9337feee0f2266bd9b9bc611c448e759cc065c763110bd95fe2b1d964f9b3dbb48a658d36d9e491cbde437cd06cb277e0346c5c75e958671b57603ad6796c21f2fc517ec953fec89dc76e326213e6ea881644bed0b2e8a0e6090aca0d63b2d038b0d2c30942708511545168454f96dc2c3da9ba420a2a6833a98799177e28c306aa06da7cd9ac618153163cf86066852dd4d0a612543a347921a9ea0736348a1bc24a4a926fc62ba8cb1599ecd9a36477a78d20e821038a7cc8b633e0fe6b0edcee72b526dbdcb96deedc9f69ae978bd1c50d52ee2e5656d97f00b9bd2c6195bfef1aaef7ff1cace103de8705542e4cddc72b70fb136374cfc01f4d28cafd0f766dd67fe068420ab9dffb10fceed99571f1f835f789a188c3c327c85cff7e871e78ae61da9cc9b3fcfdd75f7f77b94292e10706c8201efbb9eac6aacd9adc5150b638cadc7586dd32e87fad2e6dacbe06e176172ba4dcfdfd0ffcf66096fbeb873930cbf5b9fb436e431bf53b9eeeeb7fffe1d1c107f128f3377e571ceb27b2be7b8623c72c37e6c02cf7372ea17f87cddd3238f013b9afdf12294b1cbda73f4322efbf0ffc6fecff9e6bdc19cc3d7ef861fd9d47d8e8fd091236b7af453166c50c3cf78fb17e8b33a898034fc8eda778ecee8a653826732c83ee2b7337814de60d96cbc77d7f7ffff4b117f6b1dc2d91784c8ed249964b3d7dee0d91f7a874ad56543d0c2a24d14004000000a315000020140a870402a150308b52204ffd14000b78ac404c542410c843711407312044210c03310cc23004186408328829a74629000a970be6102be5fac692ba2b261058a3b4d35e8e1c90abd043ec5c0fdc5cb83b40aace515fa310c87ec1a01162e53fc05c43f30c1a425a5815177d3c8158b02a2655100358e35bd867de9c902be864c5cf26392d2ea5e3b052f230b4635102b244356698f203a96a6b83041b7a07897c82ccaae640a8a378f973fee285f022640d01a5f2a59df0cb1785d30a701085b4ebccf6401fda74df48994899a5243402078ae404a1f08cfe032e239a978b56b3e5cb66ee4c3968d6517cfe4e84465a688a62bf794f91b22cf543d059e0eb1f4338f785a1935688645242a4c63d47d4a506d6cfc27b4ab28e67e8bc4e98339597877998b6031da851cb28ef86e961992335b63bfcfec48e6763f4a72d4696c0a0458b230901a44e35423ea8dfc6f65c5803660f4fe44293848c6fd8c0f200a4155b89d03bac328ae0e43bb34ca7a216bc7b0f2831f9d6294a147146a2f5c21ad2f96c52b88f51ce728ab05ec801888f9ce1e50b67b9cf50311b3f0671ef9540bf666b5e6d8c0e15c26006a2e4278977687120d1d817970ae29bb3bb119cce30a9ed7d0b738389441407755c9773090c95626d09403d4bb3f5deaa2fc6ea47e4b8a850d3cb37670d428cc8417c9765aee509893a3928ea9acb6f4ea4486f8ec6b3ba1bfd6977924957cd5714d6ecc9501a0190402b037793056ef43f5c985dbc7c8361eb7d6babe76b5d41702513ac848d797208b8883fee4ad736e291dfc2606e8dbfe5d6632201d4fea3648d214e669a32722e1b323180da547e1e413cadb479496a405a64f29b3670ddb1145870d3123187d17a41420886920cc7c2e1b3e2bb2021522f02243be59c0a715e18b2359e0d92f227e08758f38ee2f4da111ad00ff1ce6097788ec327235e074b20e3eb2fc00699fdc1be6fe4b6e9060305729ce1d4280af9313f601b0f6ec70fda573ed074dc189370eeb5fac077d80d475c3de1716f3180dc8e7b9a8639a50607a58ddabb89ecb9e6550c5820380fe4fefb6db618158912b2c16cc0c8bb733c90c3721ec89edec3e6b00a08badffe0b79f83aaea08038671432ec2a3b503d66f019c29eff9efb18bc12952c44d22cc1d3cc07c67c7312f435a8901ba3b5fd121e27956ba6d2d61ca4d7bd4c9148d806d6256b8c82b6a2e5d4aa91c045b8828a49ed1b03c47261e65d3eb4a2da916ae03bf6780305e7e374dc2da92b416f116f0776b178b82be5513f59c7a9e8c42f8dc265b1b81bae8a1424961e9b8fd04566f5332fca2eb01c55ea2e5671f056bbe01351165d96a3d99e85c4dd3c39bf1d8a2e9eebb24d9dadf4fba92601c47158f7716167f041fc242244cc707a87f82aea3989ebeb93958b2690f1262cf3f86ac82d3e711289e4f256c7c0a0d737e86fe8ac2c620205c4baeb83d4f5429ed7dc9ed26f7c7f50c68a774d2c3c66460ad94950abdab83d47df830950ab3a3ec2097262cc8759f7718980db77e727777b64fa1f231aee852dcb560033a3bca174f595900f7526081c099a3a5f972675dca94c594b56ebc25feef001153e221b41a08be6f9f9a8f36ee689b47e13fc2f20721ebe99709b20f69e0c08c3a11f8c9d84ebe690cc308d5ad4edaaf6b1f4b694630f5772e628a703d0e66ede4d07f2d5e9bf1c5203888692506863e575665a7d62e2585c4eddee712c3c828958c09ec7fc40113e3776fb30929e97637e2d828f7b8ca721571a72fd1e5eeacf739226ee537092eaf35ca021b0a692d1b5d5247b8b841a5282c21ebbd8b0424577cdd97307cd20289ac516ca8e89fe7c8c850f4f6edf35cefa6ee6e767ccf53593dbeec981726c7e831e8ccb515aa38484447f88feae8f2ad7352f1224377dfc63c21ac8e012c5c0f51f1fa12a04ee062403218efeda7f75351740f4d18297d11a900f3c6d1678bda37232ca4e5553025e376d4a01d34a15a34c25285d09dffc7042fad2484a668c5171fae4f2b8cb66b0b8d2cd4d2c542fa087318fba2ec8cd8e80522f68e8bbaed6723afdb638cd55dc508aeab5b88dca7562ca6b768933924b0bd63ad29ed393a6354f5eb59e7603ad18aa8e5672021a2c109b20ed7530435feb08a776859fd66f2c65563c0cf3e29746292093cf5b0799c43e45a6afd8b1c28f65925d7e58873589d36c1dc9102452db7520969944493440474d14f28b7e67a7c1c9dbf5ad43b451146376f196280609eaca2e7a25c8c4b200da768a3b60595e1b3e02ecd7194f8a4f442ce4c198c9be8b40f88e369b61d4825b427f86c33030752390bdd991ae4f054cfefe618c4512d0fa43dacd6581428f975825e30bc229c80c582b36760555dbfd484d0ec0cfb4d6437fe7c8d63f89c6204e9293f4c3c6e0cc9f257dd58a540b8c4cd9b2bac3328f4610152f60ba8308775d935a01f7fc157cf72463f353b041d2001aa2ac27de9949203864bd6f3613f1b3b9ded6f8cbb76172080773ba28cbdaf718b5978244a0af25ea810abba91a10c79bd6cd914e8d343a2718f1130264c0796e2ea71a38d1a20a72fe7ede9ed21a2d1910498b1a41e25d00ba477f87dd4a2c0a89285c20164777a66c0e67ced8f613c60241db66a2ace381029f254149cbcba763dfca5d579cc165cedbaa33ad8a734646b9fd9cd2dca528f6b395c07fa1ab3c5017a6dd1e783e0743c32006922944ed0c5fabbaa1f3cbe057b3b130cbbb6ca2ffd57a35e3129cf61aecf416ea16817a324ff9327413dda1c7b0418bb9fab23f3aaf6d6c2792a2ac69ead6e712080c6cdccb3bd33ff34e454f01b7f3767aabcb9c1a0ce05931ea7fcca45a3ac41cbc2eaca5ca58ae4ee5867406ad9b50cb4ae2699c2e22a7d22e546b8a0c1c693120292eee7c5faee438b850c3c989dca76ef711f4073e0f894116515a62b09d7a298523cb449850189cc43172508e4c56206c037c5a4998448e7543d5b1b787b837640ea2899f524461b0e14ffd2a9fc5b667779a80408abd1d9dab2a302271da69b8b526185604aef08458048d454da51a26240ef1a82a2fda7a5db51a94a0393919c826074340ab880733a40806037a3eeeb2d48a15fa5a6741b7b0e05abfba480d92a919373ce4e9f73d66734257bf07f0b89c59f647b82ab6566998a8cc2d0bd93fc9b17ad17eedf24a816fcb16b5e0d20886cb1e3ef4eeaf9cf8a73b7b76530f574dc7552c13ef4785d46515b8809a7c6274cdc2c5234090fec5f2389da16ecc409792e01c1b38b8894b29ca0b9e3d2412157b16bdf0d3e610913d7edd960c080688b56497f7505ad93b7e2ccd884376e8babaa83c7b21833d9ceada4d737bda76d896b9b6dd179d50268c29272b34330f1e25f7b2998296a4065f7f89bbe5676fb67dae765599708db5b3dbba8f5d1d85598b4dea064d8d37ef790295320680def466f04a7b7af7347d7a3c7e7abebacee3a87e3c0cc4e708608d463af84d5e8d631afe3a6df7d63c203388b6e841ace09796aa0600ef0ba9221b129a28f595668be52503c507966baeaccb6518982367308c0d2322e544a159476c2070e997420e500c3e4874716e7bac7807252f2c4cd7c47a215e060ccc91bc4be6fc9513fdb785c6b18fa1512d39c75706ae5e50247b6cff44910c0886649d057acbb31991b468ed76758cf67d197ec18ae8d2e3702e2d29aef852f7eb9570e22325f7a5559bc248e3857b06dc0cc14b2e795ca8f27b9b57b9703c810df4753c784700cdb41caa09a7cc73831685ce83746a1349f146232cadea67a5dc567c8e57cb6e52cd4da634674e113f10ceeb817c610d2bb14696bd296c8d01d607d6adefe224e025c672b48603a3c4075b52cec447056c132ccf063853984892423bb812db3cd57f2d3f2592c4135e803abd033b8a6a5593096fd5f183cb8ef5f1923c8d4ccb4db391b427400ffa05d884bf57214957173b717a0148f489cd081a0c8823c961e5544a7881d2922bb15fc6a2dfd03a6c7d22eec2b00ebe7ef74679a3879fe46fb28534a4e2e8e86b5cf0fa9016f22612236f23250290fc4d2ab7a81cc5076e7777cae843ee79990241ba21cb46c8f365e828b3463d1db9c546e58a07f614fe27539289d111d539f0d74054db387f9263d0637476bb0e6abc3cc932991e568cc89db5a70b82a4ec7cd1115d7e926225e07214467e368be89a627400c8f5456cfb0dac4563bae382948ecac42643b182074216c2d32fa01911861df72aa085f6595500f03be6ced07f047c443f592389e541b988b3112d6d147d989d839ad73557da48c1f2f08e3d8164bce3b71166ec695a9338e07336d955370c3b83b179f383ecf91a1824c2a778fdb4a57563564ef5727a2648026932a0b7c40fc8d3fe72db76b29ff69bab403aa004b93d13161cebb1487b2a672b7fc14d67b976aaa76825c886a15adb13c69a7060f55ba291cbb817b8d75a5901925be219ebd4928d5825c1d542870efae5229e8788b2311f466c7018673f2b08cbd849dc54473bccb987198d9be5f6965896699159446cd087b3b04f2a6900a88588a08077fa8876fbb5d8487d33b6bafcf02cf6eba9e97a5803bc1d509cfe46e6a1d91c088da37f0a65369bf4c725e44b56f2e7786278eb72e91fa17ec21f5b4b3d465d24428538a2261609a06d0774aad0ba85b50bf940efda7f6cc8cb9d41a6836c608ccfc0cf8000217423b2bed8f2eb8da16aa4862286c70715d2580d075f2819459a6e46634c520a38ac80a987ba48ffdafabf66483a7760ae39b00bb8f738e29638c4ae8195af44d55222d19a3f4c0904db48a382c4401449b5014d881c2f38dd83916cc5c3001eb80dc07229c1d622505855c42cb2a0297bce4b74976d0ea2d95c14e8c290b960d1edae621c99b650268c0e6d1284a9a02033517c8ac88bf6408f4a342016e62db6556b437d30878c34a4344f011585e544afc2c87fcdd5a8a42ec82b1232210d916752c0a81c25ab306b526ae59a87625421afc237c2d430bd5f71c15f3ccf47b8a97f9367c42d61f7b4b9b44d94d36e023b1b77448b10f898d752699e2950deb0782da90d849d1b877206c9900c4dd20520ee263bdc818a342939110756a129567f00a68ff3388aa664f78eab546ad39326c71a28fdcec13ac39a3d1be68fdb9eef4113f5f9ee07a7178deb2f6fad0f11e92f49b9f3e4cdab50f95b0c564c52e5c1066d15201adb8e84e84ebc5c77d83ebb83bcbb435be6d9ad0a835963afec3598d968ea2323260505b2dadfa99a7e4367f79fef57a8a17e1e992b32470a1050a1317e79fbb98ec7141ec5da85b8530aebbf4ea39e7a03cdb45e610489247b92b2f4579d7ede938314fbc6279ba2c825d0f261bb538aa840515ff4a7b6726ca6af8f5f25c0f33c32812027b65f10da2d9b410b01f0522c8fb6853758f0031faa5a992b0c9aed4fe1451758a88092415c7277a8823926220bea61d101db2b41553a9474bddb0d7c54572eb4eebb11cf0a71b4061ce252128d96bb9e7d58bdf65077fcaabb9f96cbdfaf82d7cba35d23c46b536d0ad4f555129a7cbb5fd6fc5640dcd059d5ce402af31e07a1a45696808973fa01268e6aed45106f04f8f834f14dbf8339f9e1c18ead87a0054dd683c521cde1a284d1fc17a7c3324373efdcc4c99097025ffb1c19b76e5459de2c0c7272961452700957143f624324c4309f3dc9502e6a68aab3883f3d2d7543f97137262627314c5f8e847a859bbb0818ccf6a4ef431dd030fc8a400ce46ca56a94609f95cbe2086bc3e1e0abe95b5d76825c2bf926552f9b118c15a6b7ab2d2377e590d865a65ac8d225e0cb27cbd7811ae02f070965ab0173044af82082aa7ddc118c1acc61755659d085204ce6bc54164e2a61a06a256354e8ee90948c42d190d2aafa524c0550da409732fed83b42e9ca4e31df2eea7be341907a093accb80ac4207929dce2773d337049f2a81cdbe634a1663dbe445626d452fd5c230cf16a82ea254236503a97dd9b87a50b18d74146818a3cfbeb63e2e5cbc36290f0bbbde29c28eccb59449553e2e9d94c298cb146c4bdff98fd1ffd98ae401e6978c536b0df2cec1703393ffdacc87daa3cee32df4d2c32255cf2e3cf32484dd92e860205409c883d8336c2083a70174bc7dcc9c0d9ff9e5320ee6c02c66e876393b7af9339489b7732e2d78ace9db321148b75f80785995a1f22ecdf0ff8e32e7bc12e7457343fa01240700acbe0b61ad17da04325ef041a95478cd8734d0a1efaa32e2188a03b41121af137ed826a54bad7f4ee13ea43fbe9848eb03f69c223b69ee684e349a6b52a4473890705cd56e4fac769cdb3b40a7a468cf109184217769d308db24511230a3de7e2b9b5176dd50cd0f5eedd6271ecb3c53abdf9445d13643caaea0e5d66a7afb1935b869567bf66204bb0fb1b74a860b14f377d068026e44a0f5c067eec21b473613add719acd2d5060264bc22105cc4501e6145b0b151ddad47efcc78d6b325ef45e981045696d5f9ffbed13f57517a23b46f1da26fd0b2a9df360b0dc5a62b5eaa3f43008004a210ee7c72cae11d8684efdf557ca9af50eec619ec8a0ba7a51d10eed0cef5a8cf9c21ef4c4a996d519dc01e64c2794c325ce841a7f7b98242553300b69cd34b11c16183d4e687922a327cae8ba0e2f680d44992ed5afaa46cb81921c2adcb7a4362fbdfd6c84744f1025f2329ee783b843a773bc4cff79ddb81f11a9541d9cd449d56119113c480be335a1fa7724916286bd65f32c2a7aa19b62a531ab8e00f8cbc6737bd60a621487b313bdeffe8183c57992ddf9068b7a31745c3217d081bb5c1228a1fa48c873ad721027800621c9a8a7494c1db2790baf99b1020b169f0319e0cf5b948fd193d1610cb4ce7234c2bf112c596ee63e6b33361a9d660ea5035f9c602268a00d8d4c84b01649e8236af54ae8cd1c76570e86d728105b1bf950da6d6003988af28467200a37897359772c65497294f42a917924bb1af2be96e80b96176456b46c03bc0952251612856eb2562910ab6cea192b86cc228c06975f4428a6e8a9e321cb44f2d22b5ce9f06ebc240bcd147bbf34a8e18994749695f9b955e80e1177cb859df4efcabad6a32da86d717f06b0c2ad6198462cc216bacdef72c52b51fd8fca4f1c1dc8da14e3c446319bb338176bc7ca8c60ad5db2770a004b84b533f08eb05d827480b8aa53ceafc78a08c6667668a4f4b6293a6a0fad3e0f2f9412df7220ff2aa4b0c9a19a20ec9e463941313e052e281b7b7a5c692bd5b160fd7860d7ad2b9e07076a9cdb3d625e1b0159d3732d15c729c4a8cce89b12e4f1c172a290c38196d8dfd0f3a689fce9208600871670ccbad71232db2dbfc857f5f2327b5099f54d053f77e08c1a9411e2200850442b96b10f2c1955d4604888caea29904147448ac1f0b223e662e57fea048806fa0be2f67babe3191fbf93937c727e4a42ceba5c8141aaa38d64a257c6332c0cca07cd21e7cf5e64914955b2a14d148bc7ab33a41328630309470220afd355a2609dbcda016b78478eea75db46c40620067d78755f8947700010e2c9fca0da6b8b38ab61fd45dfd0f16fd0d9529d55e0e102a8e36bee8ff9c2139426db440c82e423083180ac61d0a5419fe5104994ee46e27259349c403692fc2fddc2543c762dfb6f674ef4a7febe41347ef3923fbed631d8362dcfe948a83d4d36263e0faaa68af0a7632174d89ed494be754e5a10d0c2203cd626233dc2c8572444153e30d7d7fb9862960735f0aa26a44b59e2fd540410b8cc354f7c24bd50c99e984ac38206733453411617b1e1dd8f7858f95eec046696721c3756a7e4beb118845ac4b0eb5c1b5c3c312089c80dc13ee75320266c619bb0f744fea26f6ba11f7ee8fd6d7073227c7d9a7293f8bf07851251fb99f259b2e8fda388ce8bcc2fe20e25722a8f58b8470601063f2ce4da5f9a0086607b4739e50417687f0f5b1ea13c3b87bd113f6727cc19516a98f6770f813e5248b7be55189a857710fd67a522e828f2c318c222a31b9eac5f85ebd18a7a74360791efa08cc0c1f070d78ac8b6a542790756564a11233208c8b2a768a8b29adef9ada91e1db690721713d7029f4b7ee8b4324ced6edddbbbfa911cb40e129e00f7daaccbd1aa6639fb08cc8bca87a4172324f1532f7b41692fadc36b185f1af9725cf32b6c30c72f9c373087399f44ec3d8c8a44eb28cadabe546e85fc0bec1a4475a6b33961d92c49eac203b33571529cb795fbafa2e503045a770e00d1ff2224a6c38c33911f4671296755ec51e86113e682238c20da05a1e921aa1e6d810f3e4412670e6904ab253491300c55530b492f6042bd22371028c7bb1380b8f4ac1a841ba9f473b6b4fa891e583570856ff925f4496922429f1450ce2253ef9ca049f7537c20c6fa0e5d1f95a05a0e388999890f2a75d924222de39b85e238e4061107a4bf58f798d7a1526b7bd92b163c12d66c5b277b40be2353c53c9b84c3f3d61940a28ece5739846c5d19e21d694f59e69f9f233968e20f67a6ba725f5785c8dcc53a56068b5490db9c3488c9d12f56b29b672036d192dd63d209647fd82ebb2216b7e42ab29d11114a3f6cff669adc6b8a2558a4c29cc04a4067b38df0286e305ec240f6a1ef827f5b086676cf2706002338def28a16865798117d45820f0a190bb13e90c010690652cc1b42612832e8da8443ed09876ef590fb21654d2bd5a4cdcb894c025607f26bd70b72e708e2cf099a51095545b00f64628cfc546f77c3d7c438c3b33ab6b26fcf98e3d005d2957486a0019483794b992f0f21af981bd24a454201842dc164f2670a6a1734330d01f18fe9644572dac4bfa3c2e033064adfb762df1618d6df0faaa61e9acbec42c70eb47807487f081a599e408146cb61dd190c07506f80d6f53fa3e85cace9f540a3444ac9830bb68435f8f3755e836684ae62c839f550dcf1e3c3af3eeb0f8d2131798e6e8a8ddc350582cfd43cd5e0839353335832009f6ef2259ef6fd75aa8b13509133c3af5a873c07d0a2702c7f7e806134db2250f1e4d5f46ed1905dfe058061845b462c1845520086d132677ff985b1c27ee279fd5f45a23e355b85f5cdda0c2b209522d62d3bf5c808014abcd71fdbebd6b8ee0ffd40f7054dded04339a6d5424614cf41553ce427b7ee26105fb1788f204a90af9bef0ec368f9a6164a3ab3ad47236ec63589b195972e971bd1b38676b8f2cbc562939cc5c28e82c463b0a2f3307814124629a514c334544c7a982ff318702124ecb23924c92bba6cfef8c6869fc330e85d2640db11a96f9e1706746dc91c0ec3880c40b82a3649f0461d18ba41080fbbdde29220f708665ae2494a2388c1b8a4d3e5f8410b64a3c33092b350290acc7cf26c8bc3308697a8f038e47bee0b2ed6870c83537939132c09c02160b309fb41be1784dbc0a97a61b0e8bb14171a7dcae68b5365ae81d59ad1dd5af72d805d18a758a8279ba460a061f85e46f094e5aca83bdaa5da297a4d3aa4627647e4e5260bb64b3c28ac39083496052b8c2978730074586b0d57619418050ac4eed3e310488541529604c5339964626c7036e59f2693dce45305f52ca0298ccb349eb5f70a29e7b899952785a1928f05c0bb0660c5bb9638620df44541e5ad64d304437f04803f3217b2b5c773900ac8ab30c2f01b1cbb746b041e9e12eca04b848c08b9d646869c37d6594327635a48e62a5f8bff3e62dbf4b7dd2b1ef0cadf95208cbc280c9d29775112e512712a8122b71f01ba3b1fb0b3fff5a0d0634c06dc20a703ff7755decc9ce4a60d608fcb133d27a4c92068b5caccecb13566827c5388ed79e1f18b0c98725ad00310d5c84a29bffabbe6e9ecb82d086f516008a27290669b110e96947b1508c949acbc288579935ec137733b1029c06b157c392a6089682d18717942df1ee74aefa8998fb5022693e4c4636d34c4d128d332c8beeb11967e7b4e3ec63855291678a7590c409a8f132f2ba6a5e3afa2abe240be65b61d062eea91d8a4dba2777d9e6a5b530b2f65be1f1be70306a902e7b2e263e2b2bb2b503b032157ce9ca83ff10f84718712522043c6851f5e153cd17a2a2beed6345ef96287d8a19e386937bf7cc78515e950633c2819815a9ad85c5b12d593d31eb3b367dc1c49248b70778c01239294e466d5da86fd716dcac071a57a51a7f79a4ef07bc3ec21dd48e55e2b1b688f1522a3540183f131b62a858b5f22db98ecea838acfe42eb7016504dbb623fa72ae3667ee1f3db29e8c2b64bee35a4b4a306165a4515f90291264e51f3c538ca3037634a747830dceb2beb06a41b83881318a0962cb618c23939ec3d63fc5ecaddb155af449ef15a89e5baaf04e714239e03792b9e3ee17b4cf3328d441d203a5effca12b7251117905b569b16db63ad58a415ce871c6315e34a601f7e332379b6ef4576f7769d072d8042a4c538d8ecde2c6a2c91920362b085bc4e99bf8b66c622328fbe5f7bc4cd4ce0c9488631392314e039af2f96a5e31f6911ea6099ad4891de9f789c009366a65609872943fdd015c9b6caf25a351d5c37f9232752740ec69d9fa409adb371be6700f04285d8672ab4d3debcb9c19ce079faa126f6b7f47bac7d02351789a640b240e8ac6e2ebba9bbf592640c652c0a47ef54296bc9ea26c05a56faf4ee1cbe28e3ccc54738c00208605e0cf6ab0a0af8cdb1299f97550b71dd020f631108c07ddcda14b4e0a26c703cddb06eeb9c1c29bdf050ca035658f1f4685ff9e682450988a5841731c57581797f837ecaa04944ed0a121f02a17a4c2fe35fe64fabfa16ec8e3ff208bb354ee1090a3af5a6ca32ff8cc381acc981d56e22ebf1b270929135f6903b0f197c0c0dc76a0c0abc424ce8625d8824b9c959a17fe94c684124785b17f4b745a73ccf5ec05313576e326743431a1d438d21d75b9e9ccaf59d06e7a38ea3b5171efa1a53b240b2eca7749686cb66ced636592c19a84c546ae1c83e6b8914abd2ee64cd3c23983c33a50467184292d19e88b289aea8a8e7553e2f46320513f9a9341667146ceaaef03c1b03dfef28f1182546c314f9a68e3fde95c99ab3468c036b4041b0fb1e66cee4fd2303fe09813b75f0034258176506d7ab918f92b4374533d82ab60cc93aa1ce63a4f928bb192b9186b5f517c0633984a82c2d7125dd23f7c2103bb45d87b5d99f66ae334b5419b7b131f1ae46d9991fa988b5632fe1e39454a3b6694d2999218c37f0b1d622c370e7a7411fa8d2461431ad90f579cbd3a7e1541837841c880519fc7d0d482c6e9fe68699397c47524c3593f43f0169ca3ea1024bd12d2f9055d1b2c7185918ca6d0d41bdc7618cd8f288f35564011dedeaff528f90441e82b3535fad983585b9166c611f88699fb4234f84a7af7a76f189aac0be2e5464a6e6de580046262051cad6f5cf2d10cb40ab1402a2ea53d2a57aa2a03534850d8c4cf94320c679d898176f41f65d3551d0a12f324a8813d021b91019f1fb7d2bfbcaa167a623d1fb796b4c4ee73e7b994dfe3a0ff4c0a2f9a493b8073625a31183c515df827e033eaec71cd3c5c8b0b863ca7561f337dfc6626ee06dbc204b93d77cf86b1e5b80b6365d9d3c1a3f1c1bce13cf1a8be2e11ba5966d8f3d7049020a92006caace0eb198f0d893ae3f1725e4bce789495368ef738f20e59a85f6ab3e4aea69d20392e0c19115578dfdbc89fb41db5817e0e98102e5792abe9a6c23fe9ce0346e6e47ee581292c3b317c59bc2338bd875fac60b75447f0e797fcbdd3f0c067a4a8fd17a576a917d44284a016e0ef870fcb30283916fd8b9637d2afe088df2c120cb082e304e78c29ee5758608b0564abeb716bacb47dd9e147ba3f829db1f0ef9a50c181517b3bee47c201bc72e1bbc86b64c4338a237cb35c5954ee208e0d8366d0c1cbf6b376f0a78cdd4219d65b5f59a1993c48a3b66081be2f190258c9f55393ba34ace7c2fd7b48387d5c8a64216f039f8b760da25dadab1efbd0f89858b8005c8a5486a80ed68f70066a9cf9ac80dd1ad826f4e78b5134991a8cc89a7b106f0fc6371498bc1c4efdab740c4225964557e63f45dc0e4062d36e4547586b3073747a94476dfe7f9facb0c836ff3e006c21d7e6829704d54acad3e79ff76f389cb7a59e2786089c05b163437c4274fc867c1252ac14269688e0e66d296a6a2f848a54f0d6381b2baecba38c7d68dde03fe52beed6e3b9b4a7cd697d68558ed372621740349c576fddcf7d5f1b4c6cd100cc3e70eeef1d58b6a513dcef814bb2f2f2b76393c999f8e7010147d8cd0fcf2023e0c200d659014ee1778fc91e1f4c78cfdaaf1bd44849a9ea1e8955c4fa7b229ed434381ed202483279340bcbdb0cac760d8a8ea36680d61755fb2ddf27450ce089d672c9badd73c904ec7ae759f7cb61a2db84990063d7e065079e769fa33485adb421abe96bbd75a6dc00035766888b7d79c36e6afbbaa88f5c627842966c1b644bdbeb223a90370cf646c28a25d63bc66bed1dd4a9410c68b802343df55694f8557ede545ae8aada2d06ee1de808adff59e616568149a404b8a4915a0e8543518b14680c945b7cba01e32c2450e946172b71f24782ec6670d92c30878dec5a08f1a3cb989dcbc74eec8aa2f7e2f7ba4c20285b17ae26ea1aa71fbcb3878edbad0c0f532d99dddc5befbf2cc568f5425a0684f535d126470f0ed341806f4a0852ea22ecebce7e1093af6a4849898901497a8492a006e9f336c4e8356a2cb15aa3ec7163763ddd4ab160e0c1c050a32cad87f0adf3f9b6fb584eff736fe1f03bfe8d3426ff0e7ff81646d887f1043eb0766fd90f5784e9686d20479f04ca272d85cac4aa9512f2652734bd720103e619f7ff30cf5115edde481b44b0b5efbe4a784ebfeabe79cffbcaa1139172e18b25bb5625ca7dd928ff739a8a0f194a4601b74ed52b29bf9591585c59c394c623c255f9d3ad4c6ca27a76ba40b4ebeba9e1330a42cb95b58c25bb1c4545a9857e92151a06c7d84f7921f7a412187d82b6ccd96ec4a30c3d1bdc05e85e4613b0ee795689f30563661fae1c32404ad448fb06602a95c5366d7566262fc135718bbe498f06c8852f92618c9658462cf2878f925927ea5aaa1bd76d83b4b447a523bb8ee6754414eb2cd97bd150db6423839564a89d59073de43cf21c4c18742019017a21e5873b489da750db7f25cc18974c671e333bdd1ff32d0c32b8a194a9852c32a920ac67873b0e117950ab6596ecd0a0f6ca31fc226130d72f67cc4062414d915d2e8b331580430dacc7b70c2c8d4c77c2198fa0d6c7fc0cdac4a1e4f52749148014d4b6c0efba512cf659b9699e43a5f83919a20f5bc345a6475ddeec73917395d257de472c74f240d54fab1bf5de7b8ecb7402d1a903a47bec58564a24019fc0f9f3e0a8ab03bfb6dae3ce58588ec3f29c882ceea3669ba9e4c22af003ae32d5b8accc7325ce0a81638de5d836f1f25c55c17b41d8563ab75c2e745e495ccf22c60366c56d4fbc5abf9efb57645a3ebf59b1695bfdf79bf832281c08cd9ecd53ab6fd2308b2bbd0949865f217f9f70701d5f9948cab48500c7239638f497cd96f2a70849d676a707087bf259edbf2a9af738484ccb3553abcef954ac3813925132395c3e1ac9e7194c73e6d0f339b6120f196b9b7d996b135785a3d4fe3ad64cccc4979cd5b193f7cac76d86550e5140189d77d01cc80e0ff85262ff5d60430cde9e1a15a6f4797980ac1c618e6a8d1c21b8ddde56fa674c73d0efa3c155a66d25bce720e551c6a7ee84d4f897aa03c969f6e861221384cca13ae660cf4e9fec07389ef007997197846247f8e4e16b72114de361a5bf82f081702a0016fab50f574f38d2ccf32a1c6123e09f481c37335e1d3fc0d9af2ae04086a637aa69043585b1c2a357b93c5c5b4ff388d923c59032e6399dc8f862d86fec76c4947837049ef82388f2680ebf783ff9fffff0a6de1b33e0541ca410734dbe1f9db0a8d34da585d2fa9587b0fa7171fcb72635a394c76f8374669d921c673d018d52b92555af5437f5b6bce634d1c1074addc47aa6934d8054058404cebf9e2806aa9b7d51b84695bd5c9b273ec6b93eac8e26b50174cc45e2ef39ee25ce6ef3c2dac6179a18d54d4a3f04c3f5355145f3a31e7ef01f034354d73ce276e2d0e1b16a4153fc5403e7d057cc45c97c96e1c564a6214b020104d9e72cc9fcc8977f4bc409df7bf82212afdb026770fdba7117e9b2d08833afa41fbf59d02d166921bc2ee2fc6b665f3b1089935959e6c4b3df51ab1eb48d77c4b96e2bf9cab985bee1b2429ab41437527d452025715e12b5c4328d291355aff016d55de28cd5e2c7f2ccb1452390b8c409ef87f2fa7a45983d7d50e3e1bf7ce924ccc45a1d1f0761f05fe9382aeb5ffea816fae129aee6ff393d5b8e8a02f16f7ff4ca4939f0d683536729dc1dec101d20bfe7601d09294044091f8efe95de993fe455f1f56823bc0d2af9a376371580572e5122539e326beaeef86e2a22b9742b90ef99616819e89075dec4ba456978abe327c0a95e9c738a53082bbc6384b784abf38a556880026aa4b8a0131aee113cc60d3308d50a253ea0b67c28f32bfa1b2f5c6eb88baa688ebf71217f83b29b0bed3af40a50e48629f0b8a9adca0a79a9ed626926d3264f423ae1ba73f2e49fa3234f84ec6e9bdff6dcf08bcc363a5925874af95f0a648672c358298e670361e39321878584ba0dd37997d1e258881bde803f1396a0d6dae5e6f9d97959c6b9e1336be383896d289ffab2f34551be8411e28a889d638d110cac94e608ccc250b8b10944231c63be0365c3e09cb4e825418481928c9599f5b7691441b9ae6ffcc54b3bfcd3ebe816b2e944ae3daf5d86a4a5892469b99584c6e5c6d5a0b5c307c8a4d3be56ca45fa76c1199ae3d2915d47f9ea53483343627124bcf95102421ff20a527d60cd02ebaeece410562d568182278f187ce6647aace2ff61862549044c03a424623ad6e558bf293d6dd25ce0db98e998746f45b134b0526cdd648b0358b3eac137c7c83275500d42de5a04d3e144e019e01de79359605d035b82dce6739b93e2cf7c335d0ed7cea523c09547cc8656bfca571a236a825b3655bd333900524af17b6c47ad484e5874635eb34b8146cf15690018fc7d42b7785f244ee4a56de4a316745a8bc38b3c5506c7a24e309b13482c20bea3f32776f55cfea647c01cac1d8b9efb5c77880006636b9e711deaaab9995bf8d97b1c0118ac1308b1d4ecd8c24e1bee06f6b419b558e3cab31332c8dee3d65d7478951edfd4e5f0becb377390a7fdce55f37a2b85de2bc91cc52fe969c93de79ca933ef4d9deba2725b5d5192d51b2d7afe216e5c6866b599f9e908ef8dc3eebc305c89af86f363d922884f41c40b83942677b0f323252e269c1ac3aa94532c9d7370d18bc8282a5b45b25a2c13c9486d911c40d6addc72e08dda0b31d4cea546e786cd4c316f982e465a24ef7d266127e8390a7ae757248ba074e42d3d8e9a188be4e1902fca27eb17d33456247df02c7d09ba68e596c124b1056b39c6f09112d30101e89fdef5e5d4b122f9a5d7d008cd8d7e457212caa5a41a1f8be42c1b2fc050423f1bd867464e67679771d38b6448e0bfa932c3b477d1c54872002a30b91f47d919c9d1091ed1e9530e424a7aff935c854d094539c3aef11218ff89824645043f728a0d1d621ac9bd426f9740ab9f0ae5d943d198173212a5524cc4561ef8b4918363484eec32cd4652c1f719e97861bed76f1e822ed6115b1e754011de2a714a14ced6679e6adf5b61d848e8e4fdd98d791ac9c52337b2ba9265df6f426f1e4b9a7afae0bdc5f80101b3f5e2bec6774c0ab8b2f8d6919c511f6422588bb2757346505838c8045215187d3d6610c7987cc963fd7c148c7af84fe348564697ab3df4418d77cd9e8ea44d2613117aac474350382760b5bb614da6a12476321502e525765d550bd38a153b1cc9947f45800d9b1c0f712431e8303381b2f5347b5730d94a473c1cc99bd8791a9871423a9e15de351bc99743b0c897ae13fde3bb558025249975cd226277cdf4894eef7bb463b8cd0e8ea4756846e4f61164df54a9e74f98ca3e3280019c7b05eefcc4a40f57205c554d3ada98c419d2386c38c5c219d2b45139918c1aee30d293a51b53d44e037cef8bf302683a128de4408010200073358c21d089f7cbdeb5e0342d4ad9ac86d16454f7f2614d8523fd5b23db08516bd2c8de5bee1d3410fc0e510fdf6e417a7b480933aa72adf7268c87b4f810b1fa5c26be7371a5ecde9a5d5c1f1dbbd6850bf9dd9c8e00ba7c3c11fd17af8f8eb5fd76bc43051bb648587e25c5a7a213d10c7479f8f144e4327a79b442aeab4312e5f0f6bb69e1f00458821140a10d64b094196a3753ae9cac9133f6f4a6bc5d2b6487428bc30bd8d8acc561de30bd0d1cd60dfb9062ad957b3d4fe6383c44fc2626a2c5ae2700c38f128967e508248ee020c5e0840c76da06b022cd1736bcfc1210f6406f0149947ba068b14fd500763bb88f5209b6422b00476b245b233dc3611fbde121e2fb3b44a1ca3389ca90444df63aecf2c41891c1deb154c41365bad2e27d5b34f31174514d004ed95d7c146f483fe352e6e28614870970719ae7103f03ff6871f134f847119d1617ff63e62e2e65dd06c019a799719ad3c85d93b13ecd392359c3498b6487684c68064b1a6b81411aebab80c0907ee63db290e21e3a2d3e8379249634761aeb4b99d82d70117a2973f19eb952d6a227dbf40cd2a28f02a4acc577509a16188f2ad367d220600775adc53a02b01e07101717c31bf5f4145b40e6f9e168f109d67aa12b654930b27977cae89d52ac17af95b17a17b77efb7250b27d5792b38788afd72269b16b22961dabed90343d43684a5e700327189d400db23e1192a6a708486883124a726003216990f53bd88d8141f6ba3c930b4040624856c40b9907e89225b222f55668d23039316954898449a3f2a04b9664da7197f285bdfc389cd379a36d89ea1b264dd368ac278dfabe81a55911d80ee499a4817c5f8dce7607a5b14ecc587f0951c86de711195b5c9360b78505b2d79d406c302292352d25258f4d43a2d1aa9191446204234b1882421b8e1c21ebf750bf6bfd0eea53378001b82de3daa118b7a7c3a9c248bd16a78a7a7b72fd70aa30d2a2ccb55227c0d7610feb793650454df6ba94c16e58710f1d6b0491ec759daa44153cf091c1cec3012a18d1842419ec52362915fdf5506b1535ae8a23145751ab62892a96a882488bb28a5a154bec903533c36030d86177f19778172f11cf5e1f6d11ec15f3e2ce68021c63bc5c7f39435f2b111122fd06bc0ebbfc12f03a0c77108de1e85a195eb0dbb40cf6dad146bad6ef3a93876408106d08898522f73bcf9bdf4d0f034c2e481ebacf03c095493842123399fc6c48a41d32c9eb1588021238340107553c218606bcbe1d8107000cb8711cc7711cc76d5bdf6c16db212658dc1abbb5226b648f369f8db6d5b6a04d6823da8a6834810742324888d2c8d29014b24836a9ad50a9a8542b1199e5d4a54d7f2aa7cebbdcbb097aabf9added10f8056a8674a29a0821346e4be1d6a9aae8d16c9766da5369bcc394d6eda4c30fd569fa0ca74e9e5776323810c361200e56ebe9b37ddb19eabb1616b71e8437b99ed67b65fddd0e2aee536d2a269c9c93bd5ad4a54b7b72a19853cd3c42776666257d66eaf49a63880f6634dfad893a9091eb9151e41157ea6355ba1d43b750fa76ec2a94f3ccba99fa87050df9ed4331cb783d2bcdec7277fddcb582a758b6352aa2b339de0c97772af3b9d5ebf9b13962097fac94f6ebf9b931fa025c09435ac9baa9826db3663861592f205bbe8e2148fdbe78c18f17771c50bbbafbbdd8472ee9a7c1b3beebb99a793c9cc2a7756eb1913134b37cad1493daaa22b4a4d8ef20ee55a2242a0c9474bc42e61b2528de2c4e3591bb698c5c2427bb7f2e795af8669e5a2cec2417d85d5344cf166836a1287ab518b7dc2d529aa11a53911191dc1d648234d24159e481369ce7c72c74a45eeb3dcf1f3ceac8272b2696a89d8259ae34010e51945cc28283332caa54479ed59de41699a469348148f31336a127d4d4a7de57eabafdc54eaf2f3380e04f1c8a2f53485169bc59a482dde99ad90b556c85a212b34f190d744a234d5a81add9c8af089a8c53e6d1a51555d53bd3832afde9d900ca95c0bd4620d5a6c2bc40ac929b8cf63e6edb576a426bda04ad4c743cf8db924877b0f74c9121d1c494416f71da2085550420ed410052358f80e5e70c4121ff8e9c0083aaeeb20cbe1aeb9f061b3d7b50e6acfbb910e6a6aad14da0ebe6e4f755ccf39e7cc87f62387529ce77d7a9e779b46797888cf652d5e4fe1707ee6d43f49ef4cd2b19e495aec77dc4cf254cf75c64669d29d484600ed93746d060a1e67a0f01863f1287e8547d6b66db5fed9c36310791a8dcf26a4243d93d4335345eb55b5de84811862cb1cae53b4d83f18f5cc87ab92141ef2fa9d39756746dd99bfdca269b3fef4e9efe813d15d1e35a63d8ecc79880cb0600517d8200e334002022dd84112a33348e104497452cc7d24c90f28b030859a115da0220d1300020b8e64506bc20d4a76a07cf23c8b2b65b12b65ddc90830c6886cae61056d20927513acb46a85ec508b5d933a9a02b0b3cf94bd0ee48802c85ef79932f13c3d329e223ab08b7f5d669d9689986707098c900319ecf20b71bc7058ffba94c9ac934a83101564301c568c433cec52265e0bbb76e8f680fdd3342bd4359a504d9a20479b6881912c802c9b680151aeb5db6addb6ba6d75db2af79ac4628160d788d8d1a28fb16b4895e6b27e7f486a74eb61c3433a50a4fe753b742a0238831825d28e9e196b920f1d3dfb35491e29795d29635c8b5cae2350c218ba90eb47b9d33beac83a4efa87bb9d945493be83d23452d76a920552a31c078274c8eb4a5aeca6d1fab9674a38bc5443113448a1088905485ee811851728a1010a72000313d06b855a9c61007b6a80c4089127dcc0094ab0424f1124212892041120d5600429490c09020ea8b0c2cc09520a2df898210a54f84c410a21ac508324841c89420da69080a4a323a070031a82d088880310848ac0852688a10a0e60c20d889024a40a4667d828dd90c0da791b1ab6229857ae2e3ba2e4fa131b3332b542b66b6700c7aedd3a44f311927533875b7f8290202493df4dad1da17f7dc7eb66478b6d852c912db24276e8a467454f1d18f18aa3fe0703587a6dae8d16ebd893a5c57804bb8a836e148f27b97bc9d433d6f4d17ec39dadb6ba68b15629a3934015a26766534f082b018ac7eefd4ec749a6f6c6503108b167bad7ae5a6a3b1d27991e07cc0d92d0011624b1e00d498ea32ed14414828083283c51240559bd4dbd8dfa771cada693015aac9fa0ddba52d7d9b069b1b246ce5a0314016d20254d66020692956d4e3700eb3b4ba40e0abac96f58d6519e6eddddf336fd862bd757b69cb2a26ab78d5b969d6ba6679834f76c6a2bed496b6fbfaa24c0b9cdcdd25a233fd20cd6d87fecf9ade69e6dda235464566bbebecc8f32094aa6c87da44ecc63e6494b421c8672631f9d31c0ca3ede33e7019c28021222840925590a0521e5711a21cfbbc8b209269a9085f28b7c611d819226460e5529c7171cd48527692a0ea21d4444b43855384b802035de91048e0f5892e973de814ce5572a79997b5f13d88fa11c874da0cc408a6c3b88e8138e974b27a277b448c42bf6d1e26c2c914cefeec8bdb404c8dd0711a53a7a79e6d22fb39d4becf041448bf3271e80b386279149a49a4ca79a29a69c49f69d9348fd388de4996bcdb6ce9f1f22f367fe9c98004f35d008d024cb2698f0415e198285239468820ab240449e0149122df88192206a50c19cb31d4408791f4032648a5c8b900c89a246519a81632522a24494663611d31223a12b8821081cbaf0012cf080015c888209543802179448e2618e1aa529bda7b1cef613e6017924ed09bbcff3e974debbf7c84630875dbaa573cfb1fd847fe01f45744e58d21f530ab0f4ed619fbb94858dc30498ce3d87e91cfef1ddf41c5d034eb31be2283d548094951ee660020a3bf8001544a614a0f7ef4034366926da0e40290b8db2b044123600cd1a9094a98e98c20b66309ac9c6599bde95a2c361bf4726694c368be6134c9f32d37f14d1f1de5dca7e785c87c31ca773218ed3152065272c692cc796b40232c0000643b3998cc7a765df8b389dc361bfbbf771ce0094b2981f19810f9ce08429663399947df84711273c33e1b0718e5018e20067b33cc4848338f73186fb9471388438930a0894b230c7949d3e65a74b7a550c641d0e754e37fd7413ae4434763ad158d8b8817ef25889bade6e6f25dab2ed766edc44da4896434a2fcd4a98bb2919cd57a2930ec0ee6404c8bdf450a774d423e36ea8c3f14ca41e99fc54610d89840b44618e13f7d3a52cccb1fd28c98ff3288f5fff7d77280e734c72df64c7e230a76fdfb77888ce3bf47dd3f59a647a25122e0029ed30c9f2db0d736c2fbd847f98be71f2fb0128d4e17efa89c33d2b7d3f987e429dd2b97398a77de84ca2b1b9cda412cd36ab08f2a71b80f253fef332db1e2394000308a4f8401b8c20824c5ea4342b224b4260548612100941260fcab3e43bb045f99694620fd96ed37d412ae7a7c43b311d52ee7753d2006767c8bd1de5de8c4e3700e765b6363de716f4031cb71f5923802e489a1a24632d6becb9e0535432a212b921371a72739b18e47cb192334dbb0a9435f4f73ef1383fd6a0ab928fc83a04595367189890db0849b6a5bcf5084bf637f5940d1a9bff467b34655314bd41c07133da924ab3924f8948a956222a15958c4a4725a452d2cc87d248cec8e4d3e78efa1c522988c611d98c4a52669a25110d0905e5aee5121014244c77a87f47e1701e3ceaaa7b57e170a29ebafc7084dbbb8318480f1fe0112cf02aa13ba330c57ecf2a2091bb31d1a5b44b7d28fda1b3f9a23f6f07a8076400fae09512c698ca6327d11610c9fd3195c759446790bb08485f8fe49700474ad49468e2b0c9008e94a84f93f44c1426258282acb1678d21f7e5a45ec8cd512ce42e6d5b69dbfabba973ce5c7f28cd44e2369616ea1af8ee21522069686d22f5e913343089dc7fc1098f5ca9f3248d1e3eb85c06702cd5aecc41902ffaf6ab5183366f8bc256286af588720fb568246158008e252360add55a3bd6205b6b500949ee1fe94adc4ce50ce452cb3e0085078c325833bd7cd3260d8a6b50a340d64c5c8520616c0df056221a2bc2828479d15d446b94a6b320637d10c4f40932802d456e5af366694915b35cc31ba56fef4c7367f2660f1f60ae42089a2f5a96c275280720fd38858abe8f3508a72b3e29015220d6d6a0d9ad3e2d26f58c929ee1deb7330b8412d5234a933ac78120250ada6e7ad8d74a6bb13920d62748ae4849b92b488b58e0599488a3459922e54eca5d837ac08a4411e00806f912206528966904d84d70de53aed5a5c5d50a5956582a292827262b1598427d5e773271a5cd56da12667e491e92ba6461b051b7e4f393fb1f90a4b1224a03722088fb1d2ecdba09e0dca6985d00b7a30d07607db7c9bc196d54dca05b7758766cab412d3657fbac51147310e54090d6a0a62580ca3a5c8b68ac4f242877929137a44332750eb38e7212942cf9cf8f2eacc560524cb3a0932fa305aaddb675254a4b255a2ad15289d2d2f67a0350e69311a0a4310f873adebf7f982775af69104aa33f34880a51237a449168529d559f4aab3ff5a822d91f4ab32262c114333a54816a10a5911488d24cd994329af5312a221aaa8134368f3ad900dc4e35d8de99dc007e18a9939c9200c7468a3111f4c41252a8610750ec98e940091b20e10116da3083e8074504214347318802053f2ba04086300861568416ac614a2d98c10641c081174e7094240e47624002148c2064160406135881102f9c810a233802156a34d101282011628323d0846a20816a31a2b8810dce0007246ee819011b86c070c40c960044061d734976a5a41ca79fe2e2c263fd1033a7bc857527be3d4b795d4ec2b47eaf49c2b44e6f9d2f5a87dd6dbe68dd86aeb832e77047efe58e3a3c8a0478217a66f5af6afeeb77e3efa6b73aa6261053212dcacf2868b7f45b3ece1a5292f732050db6807404118a44d0f20e0c71c8c83ccc7129731977068dc9cb5c49632825aca0481c98a8c16c269371997754e64a2a234326737d5c80248a368821480d4cd0df0dd7eb6dcb757839c5758798b97b0a1e6b4eb92b661cc70a441e85c8f4d47579f0b8c82d3e54217aa6c5e5f23b7aa6df725b489400cafd98fd6e74b4fac64e6f6bd4e1e5d85b6ff98e9e895db6b4503abd965b33bdf2c389bdbf137bfd289660ad2797dbbafc5cb08e16658c069d7a00c6defa386b192949bcf4fddde8c75270ec5ad75db525b4efc9b1d89db9f5588bcbe977c4aecca2102dca24b6d2969217739117afcc520c60b721b9526ed33bf0f3386b3a3625e0288f7608a14376f53db927d782ea9d494052ee4ce2ba5389bd3d1392a20e82e0811790e0082400c3d7782211993fb889e860a3e5cae953d7291e658b2dd77bd8b116873816ebd021a7e091bea55d5a57a74589a305e054d2a20b9652f625923934a198443d135299e54442ea983cc78123c84a434db2ded44504ddf1e0ae932da63c8507cd29e3cc2737b9b76790fcfafa5af10fb58374bd6d53ba3be5b2b09cde7b6f6272afc9efbdd7242585d294a6f80e91394be69debb65aeeeb5d6bad15d35a29ecb7af2faf1f61aff8fb6acc2ce3a3ebf4e3ebadfa5a5b8eef72191f34b7dc9e75658b2e23ebd5857dd0ecd2baaa24c017f6d1d9e5e3b17d8bbe6617bce3c22ef4fd825b1f61d84767d75bdd82775c7771e11d7a9b5d30f6d1f9ba6863171e67905ca708e68bfa94cbd2993c16169477ddc9b833efe457a3e52eefebc2a357efcc95b98c2bf396eb227367662e7365b0665a2fd9f58e7a3357c6bbd775b9ebb6de725d66cb656e00bc2b3b36829915803eecceecba7d19370097b932b0cb6d3a00ddb52773655c7e382dd895d9e5b6bc73ddd1cbaecbb8b5639f5f8dd65db0db343539ec76765d94b35c994f504c4c4c5647591d48e51364ad1e3e7c8bfe7dfff29715c7afe760bf7af75f41f2d388bce1ba7d5fd753eee823a7708d43975b3c863eb4bc43179cd3d2f429b7a129774cf90a75396dd753de2d1fb9161cbae01c17eeb7ee987214d85db037ae5771b50b769bb62e4fa5f10eec2ebcf37a5f070ccb165f5e5f47790e78f57ebddcb3de785c8131ebdee4dee49a98f4354931795f93b34cde29786499acba6f827f56df77ab63b1faacd7b374b3bc85987ce2306775fa536eedb41edad5c3d5c387e11d5b29ab87e15b77f4d17297cba691b90b1eb9962b5b74e19193b93634fcca53ec8dd5c387786cdd146bf138e975e5d0bbc6fa1393539314bcd3faea63c53abcdcc2e151640ec17c7257505ebf1b96ca6af5ced321d3937cc3ee54d917e5f4829714ebf0f26a851b488bf233c99d4a6ecf5a9447dd26d2a2fc777b8916dbc313890ab03bddaf74f985a172474a9a4a669216e591e0008a2c85b2448283209936856439915a9414892c8fc4e98fcca510f2729442f273a816d4cd4b6bdcaeb5285fdf1fe7912cbbc6ccd5dece32b7697a69ee3b8db4283f6b9466d23a2665b06c7939692d78206456031f94a10d6990ef997cfbc84fa499244f6b323d717004a45cdf05a1c3f7fa77f3870a6038754ef7b87bf7de58e70777ef3adc3d1c4e1dd34f9e5742a9aec23f4a3dabcb069c1ce5395447c13f8ae88057fde4729600ac579d5c308338c4c152992c161e1aa43f00d1623dc53a370a82d24cd94afd577376822265a194a56262ea8cc6386cd4205aac2fc2c854d52068acd6727db7d719a95eba8eeaa5cf97c0a3304fe9e0795057bd4756bf8388208400ef6778555fb9e06991f0b2be7255de558f5e995970c8d36fe258c93112860896a572964f7e618347e520244c95463d70cc2080a5dca3e610074be5fd858d71a8ae0029533d07f81f2011944606216b4ab9defec81a1ab924c749432940ca563010202837399093af4ebf3001aab3aea33a0b2565aa37d601af82794aa7a39ee37414fe51e447f7d373781f08e403a9a7987ca5fa0455777572516eca95b47a33625a2c0294b2fbe93f7c97b2128ed26d7afed058fd771e496bf7ddee86f3a8f7c87824adef70f7ef3addbfcf7fdf5198e7c342d058eda4ec0b82c6ea3c8ecc3d5812669e3bfd66bfd33d2c6fa8d3fdf40e73dda731f912a66d722425c862fd5c0efb83de622ec7b6499914737f64cd2b6fef8fed47fd1250bfdd863a76c3dc0d75a6c5f552ccd1989cb3a911d8b32c659bf7f91cfd0ffff8de9ff847119deffd1ff3dea5cc4bdda6bd944769e6254869bccbeff2ddf66d88ea43c08f272a0c3e75c3da37ac386c40eafd1ce055cfd15fe11fa9f755f847119dd4fbe0a5ec04a47888ea360d5e29abd76b51c6519a776cfba692b2de8e63fb0fdb6db6db48e1d0749df033e368ddbb53d6fd00650e594af5a5c5ed75dbb649e3a60feba34c5af94ffe136eb3b81aa0c5ed366c5adc5e0412f3abb7d96e5db7df02fec4e4a73b73eb1651809401f9c07cff03dfbda3fce42dfa498e08203d6579cb0d3fbfee2d1ea623207d0d54b61902483fbf1ef638b2ab360820cd3db69b1edc4313fe015a940349f9c97fa03452d6ed3628cdf7cd46d67079db7050f91266fb0c02d82c6ffd87f0aecb0f47cbed8c96eb6af5803a582c43c617e26009fbde6d3abc3fbe7b67b93f8ad8ff081330dfd799ffee1d3573ad28ee8638babdca7128ae545125207deff64d5df0aaaec976d45d5d296bd4ed9981986b712b02a42c3308a41387f5fbec1fe62182c6b6cff7c86edfa3b0fe7b8f0c29ac18f314a958676e9fd8068d6de731cadb1b6f52366dbc2b652722802a0953391aab97f465c33b9628cb154598f46ccd1ad2f5f0c18d1b50de5a0890c4f387caa359bff629124d92f87404949f77cb42f4e947702b9dc645ee0d8f2fac16153a6921cff4973ccae0b09014c211437f381a925f0e6a147698871251211aeb1c3607274da79f30cfe91ce63e1dee26cc633a87a911258aa131db61168dd9214aa33f1329d431493ace9f508733dd69f41e19bda4311a93548822f9545afda94155a81ad5a38a5493ecccfad07e288db4b33a04144469a4ac12a1345246db7c8c8a722d27b9140d340df345239d8600ce530c52a4bc016ded4d81c889126c1cd1114d08fa49a3b1a499449b73d2e69c2dc4e5d1119d65f9cf76b7448a9c84f0839e658b6ded5a2243d9a8886803e7cf555bb3fd52adda1a15b5994a8f9400474b640601c7a651b3b5252cea5386c23e9e0cf52632e75379a23012e0ac355923fba78b406a676a3fb3cef99d21681e122a400ac93480ba065257d5d9ac5e66d4e78671a4b0a4b1ef32eb482119ca6edbed86bbd65600e9e911a51900123459bf7f401ae47e034d1a160f413141d250a44a1b9a34ba37cd42a652c84d6b230d1ae9126a2db78a48272109e0c392a1deb7344aa3c29bcf3f3cb6d03d3c76900e3e336428ec63896c48e48bfea9d228cd06849484dc678120104d7ec00a14e90914298fdb1172b7376b4b246f48c8fd4d855305528b326f546c53b448f1905027b564c9922532d5c76d8acba3fa8f0ea0aec2610ed5575fe11fe055b8c8bc9481a71f0e94ea06476a1a016e4094664322637d28b829e406daa238b9009479dc906c3e94a6e7e6e393fbed0149a343c6e6a40101f9020e72899ca177439211e496e20d5d0690ca9cc8e304f2832024cc9da99621799de2336752ee9356cf8cf4b3f583136f67e256e54e58adda23fd9c60cf4cecb5d84a80633dca5e677afab1d2733d7cd43c6416e698b2d2a7ac847d3c59e9f361fdac4fe5211b2861496394b369fa0dd7fb50bf43cfb5d8f30379de6ba2e79442b97a74029130f35b00c76a4469094fae934a2788e9ec6f695f5e172f621e5f72bb90f656ca4951d266b0cfea4bee48275fc693516e1dd85f7f619e57582ff300c41c0087611687619e6a841b965024e3c9e1451429e988871d86796061c538625cc6618877711798e7c5451ceac4601e7b8f4cbea349e058bd26862a153d33fa60014954a9e0364b4d35d3f6f9d0ba0b1e6776f9eb863aaf2e62021e14c95eef91c16e28629e170f64b0f7c83a16231d9b13093889a6d0b2fa1f268d2d57a028663257914c49ae9f47006b99badcf5be9d42cfc8e959ebe55a3f5fd49bbc5b93c9e49d7ad51e31c151bde2ce1ed9260deef6a749c3b347ae35622468d218b973f385bd9daf2ddaedd634b9ebddd37cb1adba19d3671d757896488b46b6edbb96c8b54bb478e4840470e6ef2a1feb604a27bf1c217afa89759483dba9fd767a4d9933556e7e3bdd9938eca1faf61c395fcc172397bbedaa8bb3e5cc7b575d9c79cfcb1b7747ee2bbe947dd7cd2fc77bc595cecc9d861c0e7b98ce3d87ebb89b33cfdd7471660ef779d3c5e13eb949efdd91bbcaa45895448ae99652936f37611d5e0ac53b269f7827755abd7cba4d5de520ca97c2d507cd2747d5a3eac90ab5dd722f51d44b1b8747d457bbeea8ae7a28d4ed5f5e4e4800c31b336f9f3bdec461cef7faef158fa7eced785fd9beaf7c5ff9cabd6fdf57de492056eee56ab256884ecca27a5df98a73db8d2f67fb0a1e3d53ee6d863d56afcf31b1af37b93ce892253926af5f5d1c13bbba38f53d8fdf5bd863bb7d0e375fa8ce61395f8c2759759bc3e170b8b6a8ba55e55c1caf45d5e597e3fd1b275eb9ca5f2e98f11d9f55bee28e3eb2ca51df0d2ac5fbbe77b6d6331fee49e3bb0ab644be6b6bdf3f9c9d79d9cc1269913a31cb56e81bb98c3a79c5e335dd0e11c193b7cb4943f50d8f379ca79dc913e038b3054eb24908c92a078f3ce812a4ac5281299484f9bcee2461ea470a98244c3d05e6a777c71fb2bd2799fbc91dbf7376c8e4dca431b10e4b94b769fa4801d5ea04e52305785080c75c924f37b9090bebf0b2bd41b33dcd165be024f3a04b94e45147feb08e93dc22f7d3e5240c07c31de59e240cf793db4918eeabeb4918eeaafb49180e86bbe9a6240cf7794109c3c170a8d74b9d98654b84dada87437335029444199f13725de04e59f1fad5a4d1b5f9a25f2bca6b7de77db2e67b3d4ad6b05e9f9235a0caeb55b2e6e5158f3a4e32fedffd5a21272420fe6885e04963355fe0acfce4f59efc94e5135850420d0f93a3567742d6f0501d41d6f0f08e44d6f030d927640d8fc99df5be4d82ace1b11d7c0d0f7b15fa17ac9230f57d950b4a987af0a6244c3deb7ef79330a7dba5ee09e59a505f716bcafd4afd7571147e9b702b93eaf6a857ddbb3d4ca6cfdb8343a5720df333ee488da0996181d45308c01d4d539071476a04eaa37147ae86071b770703c418519a90c5e2b6cf1b8161901627380456eac57827730065dea53c7a1b46fd746afc467e0dc0f90e38d4d9612601640c49b21dde23b3e99b1beadc9c87f38079a4184a20bb0165ec65523e4f4427229a675ee131023935ae40d6e577b342458b530589d565300b247b5924a956b7dfb15761d5eda7eaac8fd6aa6e7d507dc75ee636cd2209e5b305002e2f1e7365e000ac9879a15989bd66e42000580d0b0b9146e8a285ab05f3937728f7e4b2409232323f39ca95b9caa4645820b14892c118c60f5e4162dd9523183429e67d30cf02a96746183416493d33c6d05824e919d3e759c0a0610be67c3e8646a34600336866022023e60500605cb46011b321c27278bdacc0f7f62dd7de755b21cbad12c65adce08d13914bed940470b44329fb971d5a9d45751648525cd5ef46a69b29185920f950b3cc5f00c91a2b64d4bf5acb356eb6d8a5d62800612031ee380c5acf843960b67827c6698cf757aa0be332b73f7d7555498032b757bd9b329f8c4a060fe1e12c9078c037efaf46cd206872f9ddc4b84dc378d731de39314e71e813020967316e7255498031c0dbc530c5e818309284b31b02a187f1b17bfe000c67df097d643e53725081b1c495180b8bb045cb85eac200c0e61e5172bfca9ad5f1c7937fa4b94793dc6f5963f21e55b9c715cafb53d69cfcf5c6a3cc63bc93b9618c1bce42202dce18f63231b0046d386b9ac922a945189705920f663d33be8a7c7a66fc432061909ee95e4507f8fc6b312f0000e3a2058b9808cbe1f5b2025f1bd848be4b8bab15b2acb05452504e4c562adce00d6c43f30e57ca6eae94a5ec509e4785b3b132914716dd6ba3974d3068791e20e7c670934a8ab2dfe14a998d2b6538777692c1d4b8b3938c0552f813028544c2a19028440a935ab3964f8bd6fa6901b588b4925c331711978f8b1616d55a43612d0c9ae1ccf583746454d422caa1509ebfb952566281c4028985923c69eeda33c0bd910dbf368d401d4e8c6a334e8c246da39ec92753ccda5594c552c2f4901dce22498bf32c9028cdab6807fc6281946751f8a2853fe12cf49939f5c8dac7b68141007124c410fb791b946686c522c842ea41275fc61251b694a65e4e5953944b91d2985cc67029efa7701c5010cd2773b3cc716fdab3cc9d48e6502e8bc6382293feea86db7b64f4b23b7dbb628bdcfbc6d0188d71733e0194b2d54dc4cca9be6db4557808bd4d2b6991c3d131ee1c1d39ee327a6d2d88bb25c2dde4dad018f7d5ad5180a10e4e0a7556efafb0a5d118f7b64099fbd84999bb0d3a2589431ba098c9b889648f2c12a591b41f20225b2d88fb26b40dfd702f019586b89788702fd56c12d17604442d770b62a0141e4b4125da87c7928f87c7d2acc3e39694b94bba2165ee263c5a23295f38bc53223af53782ae8737cbf4610e8ec6fa3e66fe01ccb9eb2b8df20425ccecda501375d10c8888d0a443948816511a49a446696450f531a2495d336aa221a01f9a4f9eb38c44276582cc53d2f066592641091239ec6a8982f42c7ac9d19a5763e60eb431e595dfc1712358412095962369441aab35dbabec42aef20ab9f69559a4343668ac9e05b638e403cddb4b57e639abde9430f236e4598c56598e279c8333dd70d8f53c3d1336e631b37c8f59efa367241ec2dd1d3e88e839ab1c3e8193d2a653f6ac25241d486b3dd99ac35bcfd9d69e3afbd2e23c6de286b916b9cf6f62f7b436ddd86ef82216bdd19ed62a56709e35dfb39bdb1928a5b44a18ce61fa009cf132a382e3679cf4cc18d39a514302031094723d78539f2761eaed0bcd619a94289de338af9402d06bd11e75ef5dd3cf5e950dc051471e4fb20d024769644bdcbf1ee8123864148e71d1a287c516ab044e3c00bd1310c0ef9e34aa12c6071531d7a2e5e8105ae20cd0b1fa8ebbada592b5dc04755aac1567b3d133f5a3492e5d2569208026256b50dc2db6e1ae8dea03721fa590015aace7317377044c1a09902fea2b143a8fd209b93ef55d2050e75e65cdf7ce5e205a2709683fca29e0fcd0b984ab84e1cea1ae94228767748d9a4b3a783a3df3cdc8efe6c3122c95b00f7a432e59b264c9e7dddec3de1034ebd0e2ac3374a8253ca3c59a6bb6cd95de5687162bd862ad9fd1342e3a565fbbab9020595ff9b15aac2f89e048054948822004234f02178a3c20042c108942561f84ad428264f4ed75039a8a214b08c9661f09ec911a9450d8daaf364f7593c9f4fa6db8e298debdbb6953b754e0e521979ebaa879faaf74c7492bd1ca9d7c70f2642eddb1668ec6e4f5db35b9b263d3be74b75ac1b64bba397bc6e8402528cf92979c149a525829df713d33f6edb78fd6628eca797a8fb37d821277568b747c299d45f502b0542a955cb428d2d3bbe04e71e56274d0c91c40fb9ea9a8cb1d2dceeb6871d66aadb5d66edb367d3a86e50cf7f90229da1f4fd2a06eed0c0264facc9f9e99b417c899990229cecb148abed0ef2f994e5ee7a53e1e7a66ae5f8ec52dd6c954aab2664381ac319d40d69cbacf77a87f1fe6b197993beabbe1c08f879e6c51f6169f78f6033bfb93bd494a181e6bf3f68ea22e9022dc3db02305b2e3e999917b692b611eabe27238ec6d1fd7e27c2dd19ea552499a50b2669e9ee199b3fe6e360ca4676a90ed7492fba7ef864c0ba000838b933cc516a754c2d3343a84a0343f746ccedbccdb988f9901f4f50783ee6e8a87d457239d7c395d2e91c7f983842428b29dd9ce1af014d131a150a86f58e7fb09f37c37ddbb0a08aca7ed26a8a7eef7be4536dcb1dabba679d475e6761ed3e737ac93fa877966d0987dea26e729a2d337c13c45745037611e91c6ec5158f214d13179631e937b206b25aa2e6556ca4c523c4570a830cf94a19e3a787fd8a031fb7a8ac23fd098bd0ae8074f110548996ce21fb208e5cdf707a6ec16d1996fcc53244c40bfbb4ebfc33c45b08f4eff847984a031fbc6d387c6ec274e3aeaab62209b1fa78f94c917dbf5d4b654e8e4cb486b592251829625122570964870104576c5c088b9a8ff40556e5542dcba32b7ded9f9b5acb5d68e4564aba2f2561d5b97debe7569ebb6455badda6aa9b45a554545a5d5babd2a311775f9b56ed39d14c12c4c81baf7f4b6c8278ef86419593e2104a26c7fa43e48ae82cfcaeb5b0fe352d4d7037de5f0d77b7267e2c1b8f5ae1e1a87397875fc7d372929ae3bf66497c438a8ee7a5d2e3f9bb62e294fb90d755d96a75c93a32ebeab17ec395cd61d7b32eb5fe872bf77addbabd5aa5172e89506531f8ee92aad56eb7dd477d31583d9b6cbe5c2ae7a9785dd9dd78bc8d55ebaf0d8935d3098eaedb2697b170c8f9d5f193fc84cbd5c7807fff5fab19b3dbc3056e1bb70f8baeb2e39f5fdfa76c12e33ecb6ea2e2e1cfb46b95c2aec4241717d9eab3b825faf5103b3bb1bbb7a78ec0fe38ff9e3ba3bb01791bbe24f97bbee1a272d8faebb58d8ab0b6cf5f175eb72d7f12dee15dee9c36e3fbe307e37bdd4ad84bd5d18778d6fff05c3d5e5de5d3d7573f8bc28e7eeca6da8e98716bfeffbf8559815c1a4e1728b778e5fae1b29af9ffd70087bbdcb5d5cbe7aadbe72658bafa3dc1c6e6d11bbbcfb70ea772c1ee7e9f341049346c5e3057a727f65fa6e567d6d865d99334c038ddff7955233ec4e7c9bf660b7d53a103de37aab75952bf314c1a43173ebe14d0b4b7006717139ec8e3d19f6fe6e6038aedbf7e47a53eec89372f1e5f77279caedc97d7d74c6788a60be70691d76d37a8bc7f42d2d2d2defb6638fcc2df7f4767d14eabb69fc03eab53b79a6afd4f707dac3f2da6d7282c79e1b1322ec6dbabbd6ca328364131316934beb4d4c4ca889890d65313161b94d5396be26af97e5f2bb39f9f6dd98b0b84daf5801ba48493112245370bd9db57e055dcc1aed9916474aa248f8ccaef3fc5ebc27f7e429540b7a71f9b641df60d29825982fe4e5fb039266d2644c3e26c25c7e2ae919005cbe81c81a99250c40159080fed0eea4c91a9d27141246e230271c22e3335b6f884ccf646021684c9ece1c0344d674973b7a06c6e57df44c8c8797df90408a47d07af3f381cba8cf205d6fbf1bd4e9ad7fb9b3f4bdd0db34eb0078bd30a73832c39c754398cbfce21df560dc18ae4bb3fc7af81e03f77bb20b751838d6b5aeca0def4cf201285f6faafca4cc89390caca3452ee6de756dee2ebf1a2723e08b2b8116e501708368511ee602d1019130f24270dc91104076501a2993389d730906a0bccae58acb1542c0dce2531cc92bb24422450db28b3b331012b02dcf5b39ac054ba560b015b09195556e3a7d3738b4b94513e516efa60a08e6149087ca9975b44acae52157bcefd8cae0fc6e54567cfb6e6c800a4a500128b778cb4f77e4b123b738f81577889a5be01df02def5a2e7d57eb10358f3bf24edf35768d11b4e9aeb7d5d6943e781beac23ebea3459957809885ecf602488548d9fafc6e60ef3ad8ef1df1ef5977c467bd5e2d2e2f2e18df97cbfc7a69b5f00eecadb3eed872d6ef1d5b7edf554b297edff18e8d77ea5d4eef08669a82472f7b5c0aa5b6e5f7751bcaba630bd6e123c37678f0e4d765c69707cd2f1cde98997e668a75d05b1be07bc39cfbfe7de3dcb38e5d4e61adeec6b0bbc8603c7299c5c263cbccb745e6f61d616fbdeb5db239193c692cd8ef859d75471d3e72ebf72e77d2e865c594bede8f13a907d85ba7adcb7cdf9f0f5d0e29ce81bd75d85b975f0e2b8fadc36ed3b77518de699d5e7e3dd8770b8737dae21d7af08d7750213d43f18eabd3e123bb4eb75af1c8e5b1e5f6d6f523530ef4187b4693ebca4c29124f8033af583141bcc265f5661d769fc35f2f4759f182948494440952125212253baca9aadc1b5e1f35bcf7c547bd7f5539ca6bc5cb59c739bc5e987518eb30160c0683b160c7300c5bb182e1d5f1ea7d572e1dc6f8f5a7937d62e52d97afe03067c5e957b8b87c65c50a1797152ee08e4c5b5a3e6a5eb969c55756f0e8027aa0d772f98ad61d2bf651b3cbe982b93d93ca4bdf0d0e7350f28adbb44a0b8f5e6ebd939306add4cacf078b4117d6e9875baf93c67debdba4017bebf5568b22c990f130c765e0cb5c8ec6642ee35dcaed737827e3ca58193229354fc69599b58ae98cc20d94db1f210d432d144b996f58adc90556986373ca6d4e49799d34899474516e389166b3591e62e699e4430bbecf02b863e615a7acd3155fbd5b7157570827c0151fe511ce8a1b8c7b48b91d2273d80deb6197f9deb0e21af75d7b8d4493ec3744e6d2a65c74dfcd1099d7ef86c5f5ce2ce3f2b73c877732f79efab428af7a01782fb3cb39f0dee4e3a1275f2973b93917cb68519437313135a45a4502f6c749bb115b94930be0487d640b9e4982f48c6bd664ed076f01a46fefeb0176ef75bf792bee2f3f9c7fc56d1adfa653aecbeb7569d1e5e3cc2ef5f62977a7defe7002207ddd711265fb72814ca30e407fc505e273d90bcf293a263b00e3a422dfb8562b5775ad5c2b1707eb32d44a33eab6e53a2a3aa36e93c144e70e0f2a4da6efdfc9eb4c3799c21cd38723b590bbd33db5019447080a92e51334a0e5d9f9542bc76ddb56eb66edbb52fdacd7992c773a7da7532977ddfaf3a1f2a09b95a3778eebe84d3b76ecef3b79a7fa6dab37b475abb572dcb5964a6b37a9054a297db779a79277b269fcc3c2e7708fb8ac48cbe74fd00f8a0de3cc1348eaf2bbc0ccf5f975a52c0152e6811e179899fbcdea36edf2efd24f10fcb7f281b769ef5d176edeb6759ec956cf9bdbc66d5b51775a035052e68e7ca8dbc7792993a79a99f3baaf66d3b91b95cb0d48ef2949d779af7bef8c62c8a44bf16610a599431deb0f057960c7ebb3ab49ba9a044ca21af2ba2d0dc1495227495292489b5eb9337f05a733eaa40693cfa3f794869394f73b8d6ec00f0ddfa752b36c02052f005d2e7dcb9d462aa48f15856a756547afebdbb7c2938a59740649f19db2973b8de4378bccc03209ef34ba49e159540655c865e9c418cc90576e52f4b2fce4bbb933b35001b29c9061e6f09ec6008e928a995b1fc52731802a1f8f9951deb57463307d353aa3ced28da1cb9d8b8a0937ab872a26a872f7159c9987e0b7564158e5ee7e4be0ccac72d7a722027e593e01b4c4973bbc72c3e3934f00c12095bb15dcb671dcc6711cb76d1c4adeb64c5f1ebda7a314ebf793a294bf2c9f008a82bb35a7e8bb151e77b9ec7d09906ae0415119c03002269cf082ac7b29712ff6657b31bdbcc8a62f33851a793287e757a3f32c9a5184012cf990af8de3b68d3b799da9d6cad5aaba320e3570b6ef7c74a2bdc974c7eda670b32c1c6732dd6ed672a8d7a35e5f39ae72288e1b6be875a6ba6d274bf369dbceb2613b37d367debe1b2ad9844fab8f9ed9b84f1f1dcb5743c621db77301e77b92ae90b6acc40b63aa86aebccba32a360992fb38f99b773e742bbd5cb83666b39eedbc693c31ceef5dceb667950bb15a12ea5f6fbbefbe8990fb75c7202c3b6dd86d58676dde9a3f7b1fb680a4fb8c629871eae71caf461876b9c7268c2354eb9f3cc325b1e3cf9744f5f00e5134724e5712e9170a821b3904df7d1331ce743e541737d9d453d63b38ffe6e78d4d92c05d9c7a692373c66209b6ce8289366d6d133f420102559f6ec3d55e043f1387327a17b01ce4b245ea0a2674689b993145fea9b4679082fcff751b2a6c79c651e05c8f37536cb33079ce599e7bba893f9d405b0eb64e67a46524ae7bc3961620b390252302d01cb16cd5073d31d20414912242809c3e8e531744850726482554a18ebf9939bf74e5af375ce3941cebbc209891448e4f185fc4c260fc9d1511e59ac8d063481b8c5da7098b3bdf491e57537997a4ea3691b8bc8a76953a6a3eed9d4787a89a27eba634fde4c3b289cdab86f2713dee62c8fa7d31b02c81d1e4d2f6d5c7bf3a71a9b9430a6dbd09f3a148afbc63dd5dd744fef6e4e4d369d3e6e2f3d55633b17deb829751a4da79fc6ed7e26d34db887a984da5ebf3bdad7994fddbbd1f4d34ba69f3088b991b31ca599b24d7a9c18e83bf7a90aa0c4dec5531138c66424541124f763e4eb59acd6cbd7c3cc14bfe4fecf62e5a6975d450866b96bc2c7e8942b2df787835790bbfec91d7541eeaa90dc6d5ebde3968d68620c5164fa2a6b4ca7b7b2863bc55bae97d93444cda673378acc23954def360f89dc840f52d3533d9d4ef674da4ea7d3e45850634f0d72132140412edd8eeb5e2ff1cef6ee3ba8eef3c3e977dd519f0d9b2ee5f5b0bdc3233d15d984a584e1ba14576bcf54b97d474a17630fdb7b2bd974e9cefec4f207e0cc94f698e62604231b2d6e2c3f746f33c702d1e2e4ba621eb6cf6f73829f17e74156146a00475904459eff41072044709e352f392316f4a96716a2c549292844c766a7c3deebee648328993010dde99463710da28100a2c5c9d3121042479786a8795e3caadc0672aded2f3d335b9c2fb3ea38c9d6b604e5d6bdab17bc5cad464738eaf306725d9bb8f9520c0d028edc04bb3767c263f7ed5d7741ae9e70ad3c39ecc9d8bc8b3cdf1ef8915ec749b6b4d6536e4957ff92a9fdc8da2e694abf2cc9d8cb4b965fa5b49b60925c6badb5caa416655b6badb573f6d8d94884b27d17936dfb509a12f70d286606f591211c8dd198bd7d0b01dc46ce1ee9192e1bc99abeb5424cb6b6b1e948c2d8d106e5f046f769363542be589f9e09d233a55b2cdf7d3b672b0b87c70d20656b83b468378b471d968601a33ccaebb0344bcb72454f69360b4431168b89a228c644b166719a3ad0c92e257b66f6a474266bda1a019b0d20eaf4bbf9ba947cf988e41a54526dff8efa4ee9dd0deaa6db9d5eef6d8ffa6eaa1ffd3e3c24e5b5685396bb79e7812714ecbcd2bb9cd2abd7628fdca9e575e31d2b44935e3ac8f2f492b672b839bca339bcbceebcac164f5b680a3670593801dd2cdf4d1a7bf95c3be681d9cdeb550b44273611cd8f16682661e6c927049c51396905fac12c75a746bd9eee23e7d877475d1c8bb7777814226f78e450f4df9d79bba38fbcd51c4e885c5fda91eb4fb777bba4a5be95e3e68b7a714cdbb98bb3bdd479bb8f5cf1a84387d7e3cdea824929a5548757bb67cefcbc15a69022620b02794acaa4316b82092f74f501519c4a5ce5b839279d9ca4342328dfdd2b690ce7e756f3c3b15fbd6b6ffbef89752fc6a1f6a7cb7d7569ae3a004fdfe4676232d9c0d16247e301870d1fc8219cd33d9cad06cd26cca1001cb993139413247e7a2614b2f275e1b56fb5eefc11326b34dbf8a80d4a236515e5e425938e1d42985e8b80282caf9f4682e6919e610da13a945b7aeb9e9c75e71195943b8db0dc59a3d94655919985e6ae6bad6013777b3ab7ddd6b36e62fdc574931be6989cbbc97bb2e9aebc9ba08d16eb0c0a0e6fa0bcf492ccb53469920773ea843c66a593a24ab9846d103d13e694ce72163cb65ec2610ecb6833cb7b724f06a2c5ba80d25d8ea084a3ecf2d0e6ae76d5fb61a7f512fe21bc517af810ebd4968778d25eba13891ba5bbbcbf9c96bbe0317c0b9e3f2dce8904585baf2daf9f48348d95d54fcba3454ad175fb5d0067e6d65bf04d0b5709e3c263781b5f8d9a5b6fe19d10873941e09839e64711965f1c93e31e1f639e1ed9c5e2bb92eb9c9ccd5554984373eb34b7c622b2eb292bafd7c1c600a5b3409046081a9b604bfdac4d23f5ad3b8fb4582f44052b38b2565068968d67103c81d440caf2938f36b7ce7243949fdce5c293f6d26b117064addc1d2d1ee5d4991199e527373cb98e93cb8252f1a4bdf43a0421ee8e2558b09462ab4a98161e591e621b2d56161ce6bc74168ce3860470102ddecfdb2f070b73b6c80b8a8656aee956c70645bdbbfccec223885330ade6e0627c571c639efa0221c856e05fcc43801104214886514c4c27580793ba03f0f4cdb22aa762b15833a84dfe706a9e341c36e4d08a1cac393f9d97afc03c72095790bdcc99040e52f8c82e963446b3ea823d6a1e5923f75dda289358d6a4956e3ad0243269f367fc81df4d90abb4f953ba538812e039cc9ab4d376fc0d832f9f972f975f0e90c6e6f1e5a7b3e22f982724826c85fc74ee31e6914bc8021166b28b4dd64e6b6bdd4ce7b6d246aba226e46a581233b48c73f9167ed75116491d04ecb7289560c82befba966d70c1176638620e674300c757d1101efe2aa29f3394425448c2cca27e45d1332acf624e0a7156a83291e96358ba22254cafd0185208061d5bd7616979e5dd090a70e695b7562678b2f29696ab287893d359c2182b29a1cf7c08648641f294b93dbd3257dd710348a51b31de2b18a77685736010b101a4dc57dd86aaeea8bacb8df1ae61bca90faacb9c8630708e8a5e06c758dd51f5d6e932a75b1ce3ae77a52973fa7c389de29dd365f04ecae975d83b5a95c7c0296f3d5c49c1b54515fc93533cb2e0930641103ca1316e65a8054f683f860c1e4f569af5938ac7099ebc4fde7f1f8afe5c7de23067e5f62bb7783c65d58eea2dbdf216d55b5aee78655a5aaeeac93296661fc3d264fac64a4ebf058f2a99c632b717c663c4380c2c5b8cd139c61d63d4e82cb3ba3dfde4950cde517de5630cacc3d2b20ab7bc751b0ae67bc71491710348b9753a6712d461697988995756300f9845928ecdcf152ee3dc1d5a3804ddcd95b21dfaa724400310c0e732037c6ea7f9888aeeb5d71a501b0a64908290188eb0625118ad90864269626834366960d0c2bbf2d665f9eabec834c6a863f33060c058b92c922e8b24f4a9dc4d0fc66ddd98296ecc2a45e5f3306828292a3060fcc0c0306845479486074a63e3f3af1752cfd4dc82d6220b241653bc8c5e453db3fafc2b8a9ea11faae485973d23638e6ecc1453b038a2364e6f9c52ba795406197e60f4031c5920550105433436bf2571440c88a609c016b048b23e00c718a32107788c51cf4cd13347b226c6c9a5a411439b2fe64f2ebf1a2d168c70f593166fb8c2354c9962188f71189fe04f14074048c2cc8bafa257142f2309331f43535df5b1f32b88d2d8e001046f701c96747c05e5f9031cc3994b90ac9991e7fbc3a9d96425c94a1288b372b472c47120180a913533cf9f8640139b3619ad4f1ec3d9c8e5b1e611cc230ba416b4d1451e59208d261006ad3261a206b84078380ece3de2321e78b8459a7e4b922715dd7cc3132330faf1c28993bf20226b5682a0bc850fa501c2c35bccb740a267543edfe2a76752a8ca8488c6e64dc2cb5c16952b73d68b6c7978476f4bf6f29753ce82ca5da5b56795359591f859b93099875b65af224a23cf42444116a23c637c7e00c604c131408cf2fc8909e0c8022906088cbf00824163dd18245a9c31428c28cd8dcfb31c519a037c9e25890589d2f0f019538ba119011c5990b0489235aa8e9b9ea97a9ef5becd437d3ca4ac95b9cc599034cbd0b49687db1bb707b8b5f652e6c62011d3de0463a8d86290628c5a9c3153d46e7a5a7e673f1c536efb21361e43a33436f0ab88c6262def702591101a11254b88a1f58c29bfbc3fff0249d6c87cae0ee3b5c62f46128606e0f82a128b244c0cad676290e819d5e7637e648d8c8b57118b2209332765e1b304f037ee0f306fef815a8cf171e5c8a5266194008e314631314079dee48e2c948c2e4eeef80207636522068c3b562686c02a13c393b181431d1b930655c8e047666387ef8082185c8c1d4e8c4e8c5668293792124325860ba605002e2f1e7375c00358410096f85280974d0e79250693b1b460d10a5dc4881123861723c68360fca85c18b494fb1a0c1a8d9ad764d9a6000418800e312f0000e3a2058b98780396c3eb6505be776971b5429615d601524502f8894faa68e5289ced70a58cc50867e12cc65d6a9fc91a4ec65b66b2a67ede45d43329f167b1baa689310ac0098aac51fd19e5ca88f9814a9542f3191f61d0609024cc7ceac2883f087216bf009230f3ed03d5bbf65229b7b725c71851cff3bc18a3192fc66806e5b24892a4826184da0838c600498901d233e32ac6e7e42a5046952dde9139b5b763c4380dd96107ebed706d9c7e383232323232329b8ccc86fa78b851740001a48a72ac6ea854ac3316b2a0754cd1c800000000c313003030140e888462f16840242b22447e14800d99b44c6e5416e8490e43c818440c00000000000000002000180005759bd20b52719c0bc031aa37fd50e3716742ab084498bb5263a05fba855530724f717ed0caa59cded7c021fadea32df8601aa5f21d93fb57222d828fd3c4505dc8941e4097ef919713cbf2b30749afdb5734fdd84cca45c9275e0b49d62dd47fc4c5f571fa4a9530a57772abe12687fb54652d90ae201baefa6b9ed7db23aa02c5705964d96ea0543a468d232f58d74cf50fc5d91be939c52c5208e9464899c2324516f46fbb4c21ca4e2f0ee0840c2cd95749ce41ec6adc10bb3161a0ec4e24fcc62a5ab8ab7480ba69cf2f2a921d15d6eec220cf51e6184100fb0a0633149100abb223864d960491ba6014c797c4b179d5ad3be10a219af198ae0cb2cd544c4996b287452e2ba6430cb4f52e698143a64b3b02574ce670d43a27d8e2df1788d99093c8cdd677d20971ed9ef5c2a644f2bef89b3381900fe9044896b9b0723e7f922954bcb04c31d76e4c22283964f2fcd304b5e22f861c8be8bf68aeed168b07cae8b2090007d1a4cfb58f1763f0880e9247c92f842a6be17677b03677ff05897f43b5efcf426242607b2144baebcf2113a0dbb33ac9143abd0a9895a532415502608cb0e0c7c2807799f8cb0947300e34a88b48b8d14598a56995dfe67721d743982945cf339b76476282412d5d1bb04d65114788d8a831042855ac9dd56021337940233c4c4d8dd74f8e4dcbc2a919e5bfebc23e31a828c4e89951189708a4e7a33c52cd8bca958fda145dceca588661540e719ed80ea2b1d5b3e7561f5ba36f82b2f18091e2a05203639d24f98a3e8274e64864e35ff013b8805b7026fbd1e6747339618b6454928be61ec10b39271fc62f7fbf8e15b22d8b832fae7b0d1bee5233a5a326e60db4ae07d365dadaccad30cbcac8e05f7ee4070f4d5961931289e9836aedc8011b8113af03ef299a61dfc55691f44eaf8cd866a794136d17c9d8ff20f8ca8e56c0a5d48d9b88052fb30a43d62cd14467f44e8630532f2f5cf1843bce6d81fb285fd14737379f251671d9f0b2b6945ae072b2441abbf61c0d88f58fa87026008b84d54c546300c7dd5e9daa3405f25e8a9254b376ef5b23dbca108b7e8f87c509b63d6c62ecf9064295c667b6505c7f29f3d4193535c7c21d360a616ac938a4b9043fb72fa060869af7806952950e3e54bd69af5f746350687bb692024bc1f8a52c3f9558359a075f8b04756c07203e926147005d3c1760402e5006c54c01caaf31a78468e43ffb67db831bc6add04dbc1009b0fc173403e560c83931e9bc83ac0254e1d7f0492e7d9a5f49569daac77d80dfaf5cfa028f5405cec53bb218b58c9252b1e4b2a2117f13af7f47c625b340374d9cd7464106b6db6a7ce1ce6fd4da202099e71df7089dc5fb33b0d2029d0e2bf5ce95dd93f4fc174793bd3ddf7997c9ba941bd1e19ef96085b327bf9a89c20ceaac37fd0afec48ded1d40615a248636ae12512d06670e38e87894224b9afa430d39d32cf7c92c5510cc13db8358e2e47b82e3dda7ad65ec64c4f03f2e90016eb337aac77b30513cda988a68f7bc6b285dc993a0090755dfe75458811e46e2711e62238e2238f375dbe7912e76a0dbbdf345532b9853b28fed2f32d1a9dac7ea6e558eb2b72f2838129385c06602c0956582f323930f34b93afa988a6a9b99e0ad12e62ca526e804f58092c4796c0865fcd2db1b57ae097b0979f1540ba2f62208ab8578d40f86e64ade1e870e4e4bc9e0f0d5911b0a5f9514c178298e93cb94ed8ff7db591c96aeb66c748457169cf7da10921bfc71c2c4e60679f89ba9b100798c1e53fe97a0b81de89eab9934415ccf1a10536bad3ba42f747dc2d396e65f12c151e60b7d7aa08734c3f328d53a2267bfaf28253d7338a69000e9aa5e140e7cefaa175428e00d83a49d3b1ce6ea2238d85570971c5cd9d5c7745a491a910196bce2981aa2889bb9f816c9c0422ac98e939169680c47aa9f5d0524e3c0a49196ab56a926d4ca1b28fd31a19cda388cd2617af7b65a48342eaf7eb8a691536c6490d68b17e63b2e5ae43aa37a6d501abb9512ff73e26d4c935b744abb02c3dbb4f91daf91c95f978900d357a54ea05f157af4de4b5accfce7a1cf281210cb03d310db6df51dba23db47c667f7d0eb890b0485ae7d7af1ff247f74000d8b3bc533f025292cc7611e10586a826e05cf4d7f7049e30ecca78d950575b609b96a4b9e958f961394dbfeb3fedb736014c46cc7160d75c39407d4dc79caca8233a1cade3d3e661aba5f50f63b43b59b6c1ef8cf7ca1e127dfb1a8de7c0e61b20fa392cea66f869e0673120a2ad31fb3db8a8f75e11ce2ee5ab6098c949d684cc364b56abe3586146a3a73dc80c445e55bf9b1bab5a32ca8365048b655043bd25b485cd39f05aee5bd3e5dd5dcde3483b8b81b682942a76300c439309d6d69ed13dfdafaf7251a9d4abf60f6e604919abab4fcc481e6e8bc081210ea23cde179509a5c3f1cc38b2f7fe8f0a4fa02d5f76ea0db730c540ba0b6794bc980f26e3df2d10a41b3cc6440dd9e93816b1c407c2102f03ac3141ebb81ae3b11550c07f45c72725048ae5219416a807aa43d4c306256fec7f1fa4cda0bc96a7cb816a98c4bfd53bd74eb25da8b24914be7797cfbc6fd0c346d650e1a710c53727b252739e3d9660b531e1f43c6ab04a8f5daba1f17a55a04dea4397cfbbc7ae7c9910bd787bfe02791700f7cbb7f7010357e1eeae7853038b3eb7d58f03b002a739fc32852f0fbad23d00cb06cb007689b147c105b069ae8c98868bd9d8d2f439f3df554be8824053f9eea66186a6d69ceb7919b5c7ba1854ec11fd27c37585f51ae4c7bc6d3ad16eb14fc9480debf0e99d3559523181cef3cdb9fedade5c9c0c0b95c6b07bd53c16207ff4706092554cc566ad0bc9556e1b11c9ec69010864a293e226c6fc45dd6deedc13ab260e8a6928a72f0a5ce667c4f7c776096ab2ab866715c5b39f24ecefe46e1e2444e502128665bf8d28c393910b666cb1a7e4fca724be6106e846213aeccc1c71cefe1e57b51ae11343ecf0191860e459261f2b39e67470dde846066f21dc49817f35e8bcbced35c5e1bc337e658cbaf25bb7c57e5b02f295062ac80b5b03e04eb0efe4f3711dbb8fa4276407c49189a6ccbbfe650f9f2256d71005da185a4d74f8191f47ba405bd414e7221aeffdb2c5072a2dc80cd7a4586311007a2a0fd64e95af01c5ea28cc06fd0b294f3bd8610e3e84d3b17e17f45e64859f1fe875d205c641ad26b8914664d15ac59bac5a18fe47df04b62683048de8f3dc08a6f58541336b3c8a1b570c104199358d0c9a9a8bc781208718c7c57f6fea6261c918d334f37a507314aa250418fe2460c7007fa9843696887758133b7572385309d810848feb69dc48bd10f7324a59bf96a8caece3672807844de09b94ff95853ed2ac53c4e33f66814a35b725f83f200e99c4e7cc0361059d68feb8ef68df92e59387cec460dc9291f309736ea43290c96aa8f33fd9dfee46e8e3fcfa01fa8bdf256ac146773b002c851d9304cc68d31dd22bbb2e56dd9a65fc0952b8b660e580004142cdfaf25d281ca235d088012d773055f01311369fecd6fbf1f68862c7137b11eccc499a3384721ea835c0bf06142c481d2864a2ff0b10e87814f867c185c9b2ad4343a80412a6b2e3734229b3d03e4819117d9a8b7fa0558508ac87336a7abd4027e12bd8f663eb59259bde164f6565f031d45711f68247bee65050f7b597783946cc71c83c0ed11e7d6e0000e20b901ecbee932bb4f5d247300353216575b5813b1d7c390c41e33798549bbd72c989b7f79d6dd319e74756db96d5cfb98262641106f7c14c4f9b25fbc6d124fbfda7355fd3db79ccc6827c1923fae3b980f711e01ef98af7e5d51ffe3ab9af2229326da7e44e5479fad6ec07fd4265041cc0acf79fce690c35971a3a810241ec80b2212b20a91dfa04a62464cd126522fa15cd597deedaa77fa5359358a7e937bbd8f04ad5738bd0df02087d4ceaa5e44c0328255b2df0b3f04b1990b056ae9fbbd0da569528787a997574d307015657079b79a2ece98fa5a7d5dd34d74a51dd6cacdee0b5dc89dfff6517d45a132fab6053425e1ead06ac67f42adee455d8dd86dd2c888b779e6bcb4a4f3eae6a5abe1cff34252e27d8e7e54073c86e61236eccf63d43a760dea504677010e17c1891c30bbc288b1a31a0536d0da1d7463fad555d4197d13424ae002b8fc6e7760be0022eda7b040aebd2e0b3b3ffb7e94fc28ac11cad9d2cb981301e14e5f3e952ce4c9360c94ab0c21d1c0cde4a5ac002da2d0b567025061e630739485a72628b3c5618f241f33478f94aab9e5425a3d18a9052a1513c077cf00f946ab9d00d95a6bd3cd4894860d90d9e6d1123fe2a4a4929b6509c12a5b99f234d2977d8eb82092f5208db158b53dedee11861602ed9194215cdf9874d339b3c91997969833398ba1b662d31a1b4b8522f6e579cd48aeecd58e642fb1c999a0dac064ae5321a29dbdaadb2fef29f9820e31dc031392bd8fb77278c346137b9a1de80f63e98d36a625bd183525ab462862d1f26a374563a0e68358ad1368cfbe369e339320eee86b12e95a1b7585a85fec59feb9535dae9e37ecb3d821b1da95f039925c56b3864e51c33dcaf3097de3788f1775a4628abeebae1b926b3bec6e6c188ddb0e95e55384f8eae37679841a69d2f497c1272de27fb76378c98824f608f6a440734ee380a93d5046adbe103453a246426ad39a0b017d20ec8763b7f360d0eb2f6507d955ed09e6131b2d1368dbbe1fc07d27885d18d84383b186dafdf81268792d6db03cbf70c24dd622ba19e4de2c6f55c29a6ed70a3af4b01630d67aadb5837c4edd67dd47a6f0e2e94db0ae1ccc0eb746c83985428514321ef68dffb9ce326305fba4aaecfe1fb9b2feb65148406c60e788507c1a083ee941837465a5e36a7712ca0cc6658c42537c9f3de1de393c4b35063174a9c539b6e19e302907291946d17ce786e6fbedc820b3ad125787dcb6d515ae623b91037a2ceed4298035489ffe980bf8aa2656e7d6784034a8217c14dbe598015cbcb16d37e2a52cfe6eed3ca16e7d0388bafaf67a94052f3ac829ae0ae3569977e9ea3c9c8a857b6264ce14997be158844bed3132e6e4ffc83d315024ca594ffe3e9f6766d93ab8537f69bf98786e97f43c93ae9d825a5a61b772d59142af6e6d4a7a52368f3b0f71df0ad26708cbe69ce66d53651385b99ec7beb285f484f452519d4e8d0a13721a2131e58a26f76439e8484ff5343d114ff29bc449d8e1d255da587d76d17b13e189f3b6dff6148f5f51bf671992193ac78a4db52efdfe570bde037f568a4f871faa3f48fecffdcc005f9939e5a04d33a0204831ea54be3569b3c37e37f3a08860f5e031b7925ae46ce8510d61d9f263f50c1b8307a362461eb41641cfdce886d98b176955b7623aa541af721b7088d6241eed0c24f704a74f4fc2b9ebffec24c6b62d9e2abf7eba7aca822d1954d4502b987a6dc9072df0d1e8b2591b9423d79824ad9d7d6f16e46c1120de8b93d68d3758796a505777abdb4308f12b09f595d2e011ee0b4c0b1b26b055f52e9121d049baeb221f0053204ce6b304495a7dbb1754924fdb2d6f33ace0ade8a81ad0831a6b6383bcfd8ef41a7d4f9fcce8abee0c3a22ac789fd084a8a9437aa8c8f6b583845e87d62d70ccd116bc73e84aa711a7e403db24ff3cf1581cbb44787919f44e4a9bdd1f653932b589c394b870511c18b92f7d088a1f2fc1d5d2006e7a1820f0087b96d46a4ac47459f7afbc99926f81d72768c490455230aba60880156d6e4c77fd592a66502144b5aa8a21628653cf60a5283116ffd708628d62410cc248c193eba17b921950980e3d5b57d28ad434683fd3d367d2d0b3c2ec59daa0abb81f545eeccd9ab09b606ef718d5eb8d88009af0553a5a0509f004522a60bc22bf94862bbc8883ba2189edee156a7a4930c71f6eefb9e00492651e083a6b81ac6804463e066aa9b3c06240c8abf269c48af7120b951e1a1d4c9a2043f4c5bab55b280f33b1a90a4ff3cbdf5b19aff7f1b7beb90cffdd2fbd1b2e8393ce4bb2c25e2421f0ed1924ad8d5d75cf80fa43a6fc4509694154b0242ed49b5a4a6e87f4a49b81b1234ecbcaccacde91956eef9244bf146f7746b9c36a553ed53a6b35568a40a47a812405352c7d18df8c7b742806057350a95212e43c5915547ccf56dd512f240385681e240a4f7b9f372ad7ba4f933f9e780a0c50bc11386fba66d218632bbc298458799b601e85e3c1b373c4c8e0ec1e658dd9fec554b221fea41287552e77f5e8d43ffefe66549fb8fc04c3ba1a1b8e30d1241bc1f80c582d804d0a01f74d13589d73e66c1f2c2ec418d13bd18b1aa38230f4942c698c105a7868f6f9512266dc468d16cb829c387acd0d34665220c2ad10e165cb8a7382b611354e40af5ec54f93e46bb016c8dda19728e1ece40c9a22ddf73162b03351ab7b6e6af92bfb5673fafd789b00186b2174e552ddf64a42ea5c449d29e16040a00eee62b3bd570aa5925d7dd3c2d21c464422bb2d76c00bc0d0221f7d5b05f8c2179ac5799749d9c7be6a404890d83c88a91fb2b272aa048ea4e6169cce77b9cc6ddb0157fad9168c9ed9df0b6a2ac803e9340ac3b3100d6fcf77556cfe98a52c95de4cd4d043538c0ac06cebb52aed11d6ba0958b9cf5be8ca924b160829fbb0d1f0f5d987ae3016a013b749b11f5d70c0a6fd16ba10b6e1dff871e02080e4886b16583bcf226b2d5a2184883922fd156f305ef9b43449a7d27c048596ca5a02569cc905eabccbf71acbeab07b0e59e8ae7ee4128abfe5b6a91fc6d007738c139ad654c30e0569a9ff99caff9ee37f9e2e1af84205a7482c4a0fdcf8f5db7ef03eeec971efecbc5e8494466e4c5e04b7b3fe2b89eebf720089768768b96d78e5b0b907d5e3dc0d5d87f919a8216b5ba12ad66cb01a915414d40875e06f3d73f3d4790eb6b6fc0e2968ae65615682eec66a9ef7bce002bd329405486e13e4490f0b768d4badb9fe7b12ce2c756189a97a41df8ed2c6c62222599b7413fb3179fe571ee5390942a4973a21b4c400027d5ba48c70774ec0e1aa7e6fe42994d75a457d0a091e1aa4f9997d88def6fbdc3b53bd72818e23945c8e1c92f84fef7563ccb75b674145c55d2c5a7f6847c959c7fb6c7885f536027b41b1be4d98d4f148b28579e067183c36a317e2f2dde1f48240e422cb7107add2d982ef039d658f6e1d1c077d85be50b29eabe87da3d454300d12b55d5d301e40b7d9282cbcc44e7412b30495d96f548adab3ed005c24e8f16ad4c0b93f104121a33bece3ce3536ab7f804226042d83e545a6e0c57c9a9312b0fc518cfd1a8752b7d007680660784448bbc9addb7ea43a8efa2510eb67e8537f51e14bb5b3fb725aee5ba4c87db90007c4d79083b120e9257fcd8e484c2d023c008456b1c9f646271d38c719a3dda575feb4384efcca9b4206ae39ef0f5ef83f4e368113b4e18d59a1146a75673f9146d8ca69b3bdf97787b8ab0a92a3af23b6f42824399331e03f928066977c8c56fe831c7d615ac1ef6a90eda873e07e7755f55d5d1796d7437698637c290c5853558843c10837af1c7b43c182638682659f8582c147a1609814387d68456b923ea82095b96a51158a64e319e371a24e67b0aa8e6b4665bbcb26ab5b66b437b9c68f33185aaa0684328eeb80b68d4ed816607ebd4a48baccd964971ab5ebf82aa703c28e5a51bc5f64d7a167507eddebf8a8294d1860d26bb35a1539a66f810611abbf0c760b0255aef524cf40f6151a3455eb403b9a86cc670c9d378246abce81be45ff505c8202fa2cf4a4e56cc9faf2ac1071875d878b41a5fada3ea1191547315accd0abb92362ceba7d7ad6c1bde9b8dcd39a020d894ad27abee2c18760bb3f8ce59a4971841adf462ec9cff1d5a60e2af9b84fcb37f593bdc556affb3f54770a44b40c513ca907708f90605c47280b37d2160e2fb46db69fec7704da1b6ecb56a17e2f456e619c24674100c3ded775b727036d172c4ed7e792b37cddf5811250ffd1f005fc7716aae1d02c4c344c8f30398691b528c6435d4d25864b96053c702dfb9b71eea8e99f98a4c65a02e32fb8d90bae65267ef304d728a7620a4a20993bd9ab37cd931ba124008db81ee9721da6b590efe09b43bdd089ed71c3a60b4460e4d02f3df5996ea29296a2976c98b07520823d1944ae02d55bf63219c3206dbcdb04d25ebc7ba886d1b2244f21ff8c9bd07336490d7bfca2c2a45ed03c2069587bb59c2bda0025775b9b88c35b8872eaeb1c68a15c156ed817f928ce77f726c0a943efcb3d02f401e267123b091f896d26a6b06d2867bf9b55fe341e860b508d2fedb1a6a1d3102f070eeb850efbedd622f0aabd1b30db4e843972ab2b6dc748ca47a641524455d1c1d8308a5903adf72f50bb9878ce13a8bb2d404894b3e7bb486ce834ed556b258d3ae5f3f368f5f891c086c163900594ba7b729d10bcf7c8648d0d236ccb78cb70dc4394bf4dae35444b539e960d3a36cd9a7b08bd7addd4c097225cd16114bbb76d75bd0fa02e482e20770d2442b03068644c3493d1ce6155723b2c8b827d382a23f6ada1b4b4497e1cb4d677ad2d8bf9a962bd61e8035dc7d1b9dd01ebbeab5cf982e6f9bb89a2e8b0bca1b358d33d94ac46ae4293af1d76510d5aed017078adfb98e2d37eb9b812cbe08cd537419ce9eaafe329f6b9a0cb81eeedb846aec2127b41ebc244bd3129314f8da7fe03f7de9ed6a41dee780c0f488ba031611f0762ddafa6c19c3d32ec972e95a0ba162b352032bbcc4408c21a602dc3dc148110c2bd5517fcfb262e2cbfcff4ecd7e05e6cd735017ee22ec1eb5ef08a46a5142be8487170d17a1cad6306d7117c5f68590a5dd1a34066bf43cacc2e36fc0202c19775147766320f11dc3300ddfa9703650f9944b3c6be3de02cbefc5fc69f5edfcb4b3c5cae22c964ca69331bd870b9319a8ba897dfd1908926f049879eaa615b9757ba876d210b8f915a5c9d44dbd18633846d73c93d6c64bda97fe25e7cea5f8e2f370d8132c4e96c21839e4d455aa89b06cddf8f7a4cbb228d6f992bd6beec31c2c1b6f8478dcb3be67cb19c468ceb66107a3820548fef94392cdaf528aa17bb28f5010a85952dbd0d1764cc20829cb5668b8e972308802cc7b064584666e5194b89ffb9247739f26a47106467b6471a0e3ccdc080b9cc86c6c4c3d30eb109006212a1314f232542759695dfb8389430162c344819bac618a230b8dcc5b8c108528d186b9811ff07bc903f3e80ab708cadec7cfb764c5d53000e18d687952c66705b3f120db7173d82a7654065f0202602baf1a7a1b244ea735a8b8717580020d2d7df53a6c7c6fb009215e8cfbdd84096e5a2df7709f4f5375260b504f356665e3bf0c7167061e3006b47830ea68526e8272fdc6e6ebe0305f72873763acabaffcd5e95f18d6d802ae57a86cd58d0f8b8bcc838daa9d57a81208f25a86a44c996aebcca72847c71fadfd51ad71b2c3ec397bd06ec94f55a4da443a5d94b57b8f4770ded4d70f8f43405984f97bcbec0e8066d875c2e0096bcee61d478afc2f8a2651b7184b115cd184d3b018d4067887156bcf0535ad1c7d78581c2783f4e565eb9443500d9bc11c36628d1e677c510dc95ddc952775dc83e44412343f8713a98cc063e9e90a65f77ac3f77957469f0b3c32c83ad49f65fd895c3bbb68e8a23f00d7b063e1a2149275514adc490bd650529a2dd9c949c86c6b811bbb5d9d2723d807cb6b5ee7f21cf33d6e2b4cd2c54d2812cba41b3ae0f41aa241d8c6eec2ff351b7d9c397f6d08f9ea55f263daf4eecb2c1fbd6705dffbdcfa42f2634aed5193a6e6f5312c2603db63902e7ddac55dd88468ee21232adec121b30a60bb6a6a461a15039a5d75af0484502800d17172d45f12a594d2e60f3737d74c7c2927f670e39e8901c0e774de01ec06df236d99eb2906ef9b152711c1ecd18c5a2b42d1d490ebdbdbfa0eeded49d73a00a3edf861843b4eae5cb8ea24847a5677af6e075dc3d4db462553a89175463d8e6d001c206f49552f9d9f5976f3409dcd14ec841c68216bec2a5526fd1eb2f55045f16ad629debb595b3e4603cf1ba42dcc7b1d18dc73dd989dfd9b3215dc32119a6033830c2748cc4f6ff9c0801f0cb8f251ddb268eef8ac6b4efa9aabddbbfc2a2e0c86a6b2cbefde72af893a33b45e2af6e016abbbf6cd79327fbf27b9922e6d8a56348fb282c8e5d796ad3d0d5334b7d143b4a3d68f132756e61ff649b36a291ea840e04e6d7a20ba60adcf207b41d8f7fed65dc6ad334a3aab591ab6b942cee1e7a15852e5da154cf5a1ac0d808b92419e54bc877a1d2935532d8b6e2dba8c107fb9f847a2e4c02d1fdcb7df37b91b04bf3c7d37ec0d05fb3642d38a3310a3024887250aa5aece984d71931b2f036f4e4fef56325526a5a335f107930e9ef0584cd86276412cc0ad34cb5be3d77663951df7a779c382baefcb0de007918302d4082af3fc3bc6ef358f961f3b68d496328bd63cb2240b80f66b4824b83334fe06cc0a5fd4dc68e361121375ebb05cef12586b7efba6eaa61f3d9a46e6ed7d60127f0b27356b2c4a58147159cf7b28ee8900af983e257157ca83301c561def3eef7ff5fd7f6176bc36054c3d29269da04f829fc6d5a3196ff8d2ba39356a55ea3f21412364b4637f338f1b4308fe943da9f94f63dff29c781ff1a14fdeb472b65adcdd9373deee22c66fe498f2895d75b49e10a39fd8353a7a55931731e0b25e2b4e00cfa850e50b8ab43d1e66c934998b2e714c7c5b580d2cf29046b1140fb5a957f3f603cdf39a160d167892fb1b1ad4deb15508f906d012affb3db17cf285d62d304f347393118a63648350a7727bef8971887a3eaec8002cf84b530667b2481d1ff6554afea74255ab1ec4529e99595afa243b20c9b62072ffbb3845111599aa8b2c1fbfe62f06ecc703287269211bc257b7a0e7c88c2b3b4f8efbfd7bac2a088ae731dee023b7278da907e1d560e21d0299b78a550834ebd485aaf9030e0e4413731a595c1a537dd88f48485cc4f2f2b52fb8a0ac6b8f814fad478a1958c68e1f5e4c4d87429e080ad939fcd78789ceb440ee7b41cedf340322675cba4dfe000e9424466b629729f471471746dbac19f93c8e7db94e87abd2de4502beb48f23f6b88bafa2653df24e570fbb2831c7177f2a98c02bdf50e7865458a54862b974ab5c583f1e419112decbba5cd30ad34c73a09e2b7cd13dc859f9372643649d75bf3263de351fb83ff689143835852f7269f685d10a92b0819490813b2b41e705aa0b70d4ab5c36b590115ef4dc797d7006e945266ebde185f92dd8786742dec80be0b60692759828ea9c312833c6f445ec946e5dd8131a5a2507f6e78632922e2b3d6bf774c0bb315e862408bc50776eaeb32538809faa134e86131ee2d9d7a46102199b84af5123095a0e3d0122fc03722b4a78f63f0f1bb5732eabd427d879520f49abab2c728491bde5b84ccb8735b3b706c054a6d76ff876f9ced1896dbd2a01969a939ddd95d20d38e8836ff28976e905da587f25b246e7345bc08fd9602409aa2a9d668f047523da5a4d0a56f94c84186541859f4f4af2f4609bf2a8c627317507d71e9aebedd30c5d8bd79b08b3620cf20778226709d6d85559a43d5e962be5431375b160d2a5ea613d7b9e6060a8e08dc3e5579f185d8316c109dfdbe0c48c56e08a1a1e824564f68f12412f73aaf9cb7ccd3b6daf2795fdf5d598cdc7a8309ff84e2725da90355e2f6aa3313239f82fac3a1134be95552af5e94a02fe5943a3c4cb09f9040c485ac1b7aba8f30898219ed0a83bc056209f82245f4e1dab568da06b2303e359621face38a3d3554a4aaa3eb15892fc4bb2a04daadf5936fed30f2d639c0c102c21ad140b9b1d68cde643b18772fb882c1d1a05827de8714220727e14254bab43321126a983b3612c4e85337297fb62ab1fd43ce93c753c87503cd44abd66fa15d1cd1a7b2e3b63a8c477c93cc0387694980312e9014655072247314ea36e7871c457c1502d2f2c4d100369a391166e1722c9ee7c9c7c98b82e624de9779ed120ebabf327a4b833d23242d0da163ac42c762b2bf268d46aaf0ceabb2d5945a0b4bd0af3dfc412d921d04e828940ad9974fbeae358a203692517fb793610837bd0a537f5bd386adf8b200392b839a2430ea136da63e2dd174a79408a7ae6b7fce312e817e51bc1707abef7b43d703b1d7dd2534c04dcdb60f8ed6edce33816fe6bf8c86b4285c291203db8241f6e85d8b94a86572271415787dbdf8922150c62e840301085dc1d09ba294582c14cb8c52d1fa44ae2afb2c9a5eb2f5ac5ccfdb203d2858002740bd5ecd7baf51b175274cf79294f9f21e893f656d95dd4208434797a9a9f7680b573c993c606f3f05e667663f014d67c352588d0a6b8674b44d264784026b8250c9a9931a1369f653d1a7a5b833c3853b062ae50fcb0b33d99d2cc693c9706d1b5c2dc6d109583866ba9ef68998245978c2ab24896974f773f308a7e72a47c3ed8a18600095394f9076168b76a2edcdf118a0ed689d3c9b9b1337a848c0665696128c9d308823d57cbd4b5588b08cccb9d0028cea8450a74e679279e11bed8c64364a0168a2fa5cd31373efccdb173ea8883ffbdeccb1506156f5103c166781477d4048e020cc0967d95263a3bec821c9c1d6cfc46aebf9ca9aab71f206f3ac0b57876ddb881dd78c17ac81b66b3e93cf4be9b263b8590d987bce137b89996988a07e24d1e9402b6a9c501c17e2ae98560eedb2ee17735f4fa61a1336f2200c1ea900f139087ad75560ac08f2139e3126fc62d0df9173fa9ab579c099b5cafb1ce1576e88e6bddb057b25e85fb58b2ccb5edd9e532dc1727c5871b68fef40dbfd89543894d4ba4f277894003caa6666a8620cf518ba263e28690ac52a9213c639552d1ec4c006ed6fef533878a286ecb0a5c4136a103cf5227f712a4e52a0082a2810d6c62eca7857971aa719db4aec15fc4db90c331651dc24703aa6a43e7378f36a09a87182558a145aaf5d0f8a438ec7ab4e55ee46f26cd7eec50321a6ad42e2c7973ee36b5eadb839ea22a9d87c187510b9152011a9352d4f435be31245db9104554b83e310beca68a205fccd3c9e9880b761cdf7b7fb1a95263335f1fafa771318e28c9a5d8fb8545e6a5a881d2aae9bef52af9bf6a82035d63f35b4a897e75c8f487fc42fd0c76ce79a712e652ca8cff004ba9e266430c7af5b25a799fe1ccfa0d2ea5a670eebb19f1410a55c3bf1e7320c10af100782116ef548400e8f3349081f927020991c660281c4654d9129cf785b965a538635a38c0e83275d111ab27ccbdf6da9a41ab4abe045ceb571892ea7e6bc824f0ca48d02eab618de1c65032b8e4e6798f83989770262b9c3331cf0f9c46911e8d9a1105a4f9dfd602f7e006556a895fe0f1f0ac07d689fc6779455bcf3c181fe2112c17cb8c0c04d9b3d911aa0dc0b44ef3140a3ea34c83c09101e315e335f5005d99a571c7e1fb0ab9aa637e78e5f460a417b50691c5edce23b33d849fb267c1875893878c3f043859f6d7bfa00613f665035029c54738ba6e8185259c623e022bbd5316cc15482d63bb14128ad97c6eccb05d58141348b0acd2119e5c29ebcbecbf58d9d2bd7b6f2a7c644ae5c630387c2cb1c79d1a38e966791b5c505aca539e518d8feb4790877515fc185aa06437773ebaf133c826ca0553483defad32bd164ff1fc7c6727c162f530d28a13b35f31452b89fe52f57accbf94ebbfbc102b2b77dbcd16e6e252c832ee41b790e862d6904d858c59125d1a880c89a22f8cc8404a740d3491e17a856ae9b18a871695b37c8bb7691333b95e79623a8a43ccd84c433dc89708eab7e8195762ee1402d3b0c708ef94d6cbb03b778cab2664f8d703fb65354fdb2ce0c490d3568ea535ae744f59c850a1d753472cef9bd9e4cb961acb094216a653f81865309b2a9d067608ea6c2a73ba0264c42918d208c4e40405162ce1b215fcbf5db621dd1bdcc10e4a31a78a6608772d878af01b1fee6db51ead92b8c87becd080eb6c446d444e9783a04e67510718516b3c3dde924ffcddb4938fdf6b97616d0fb3ed576a5bfe7a7fa8e63b866b182a1d291ab63bdedf2a1f6245a8f6e386d60d8fefc134ceb2c14298da6276ddfc2e1fc8f96449945cd30c1eda0c9ce1b2b838ebe1b35d113305cdacabeb0eb8255f67e26b4aa5a6a6e36903c128b4eba4e4c9cf1e4e6c9aa513e7aa1115d3d958c3f73455b0a51078ebfe8485093aeff32eb38d6c57ec86c5f7697487cf525dfa02e613903c359539da6920307d5a052de46cefe1270071e1e4a0b1eae7586f8369b59e320b3e45ac284f936e580bd70e5635461fe85433a46dffc8d3eb03a7ebc6e5624f1dc901b885b1854ac6fc12a31af673f2a7a076d4d53137d58d39a5e2c18f9aaba437f2e0bbd7c0223dda46062430666f3198e55bc510a503854c4abe0d338449e6fba93521b74c2e165ee52f6f9a533ab38b50a8d985f4d9e08d6fe4faf7da242910079672556a5acf11fab413f02bfd4b395c9b3fd5f4b459811b05bff097fadcd6178921b51a11732af2a07629701c4a9591cedf720f1f2aedc510e8ca26fe7ca2c3f68bd085009f3c9b6a9cd52cfdc6c6815ff529e0629b6baef6731de845e1af5bdc1cfa4ffbde359a510923c27c772811c1c82e6067f8d522e294c1b537105ee22588357f11e353e84f9ebdb8a7465777865fbe346470ba5917a8beaf0c6b33e44ddf3eef370e7cc00140cc3c12ea85cb46dac8c76558635459fa528fe394cef4e2150add2744ed52d4c4665aa8357e969a1219f0f63ced49f5efaedae4b4af7e65590511e8b9aaf788c3ef2d00e014f5cb583684de0d44d103eb9e7d506c524b9b0f41e5985d9059a1268c6ddc3391cd3de3fc06701adf862583ac35d20616fcc495a7134398169949d543f3468c633932d09866bb2b52abc5c55b65e05c4c2caaca98def471a75119e101e6fc953cf12f0788e9b0381c5636a5810c7b6b5bef7353698df14df892cbe3c739fbdd503c3e0ab38179e1a5c4175955b7c675b164ec76d3d04c96a4269ecfa1766ab2c6596e2dd19110a4a76ed02668acb0ea96ac4ff97eeda34c3fc4a8df5a711fdbb8d26b59e9c152a1414db86302ff6eead7347f7646ca0cbf8f8042777a886d8bf4889e63e1ee331631148fed1130ca25221631571c4c0227693e8e6a6d9ea44d80471047ab1f1c9afb9d3e7e12aef9f40d2e2e6781d781a577940d3684753319846dc33e37376dbcaa0b4f48db8c1746edaea02365696d97568c8a1094f091d31b199c28c09a69b37551fd4f875be1a2f4e9619ba30e0ddc418226c337628901f8400850704a0d9c819fae5ede11db0f7222a18932e76ea52e14c91c6430b324e6ac270b99032aad18e69f1b11ed6d23daf5b4739fd6b4615649de99f6df7b5817a3f535230357854e9f1b9531174f87f4d026ba8719503e838e3a8d8b165fb4ab4fd3e7a195f151d71c5b0e6df29343c76f58acae6e2d3b65d044477dc6fc1602bc01bdbcdf8bd8c79857334f4ed523362fb9b41bdbb649ef0ca3cd0c99161dabb70794b1da20c4a32c7e616e4e18e00d47b59d9941d2dfe64dae612f2974593c25c356037e76bc89650dea6a5f1bf5d49dbe69ef3affd3deae55e07ab732c25eff3d1fad7a79b8e1b58688d78a83abbffad98cc3f16fbf8230ef8f69c83f4d94de99cd752a2ae82ba6caf3420fa7c093b8f929297ef589cf7903de075e6f3dcc6c9993b1ca99a3490d1e63ca5a5d67cbeed5379f097cf869a99ccc890352e6472c5c3e67fda81583ab62b62b7b2d9722a6fa5061f212932e13e538a4dbc4d85f58e34c78b23b116af0a125ced11a5cc432c3f4b0775510f7b15b2f0f35d4eea20d73afafcb206312e71c6e828ace55aadad38b6228520322dc9196df603bd021d50f297f081bf9de4339895355390fee47f810b3f37b5d1c6ae0d9f9bc3d9d249fb0ac8e1f6ad793985c6edfcef57e52198d02a73911fa6c0af475d86ed32bfa1510cc909beaa92651da5872b682794e2dfa480ef813c4ddf59441c12228bf997c27a2e328f9b22b715cafc89af60e3c59dcf8de359bdf4bad3b535a236bde1e8a02dbf01c55baba0c885a39653ba68372e678cb20676f17312a990332a969d0e1b403c94aefeea8b87d6b9e195138cb58ae4594ea6cda98b088495a2f423eed8a459c8d8e4a4aef7d921b938b20644e6b4a8a97e21687d438d2023fe56e825075c8a44582f266ee4a520b3004a0341ad2ed0e54b4740434b9a3d4b9ee6afeecb55c4333da8b35f791cb6448448cd4813eca655a88845859f636a4e68831b025cd522b7094d46043ee8f26cfa967baaa868fc4ad184c194437008fc7134f3c4baed36389265b769d08fd1c268e4939bd4ed3b3036eb3a6805401fb51c2c2428a900d09acea8db9c26ed7426660158069d23203649a0bc6e65e1d85a66f692bcb360f2a3df728dbdde2f1792a925514bb71c2cd4a4a3a439d829625f1989a080fe4227b941d9aa928910f6af4699486b2e3af8ee8fdec3dfb30fc9720a1b0e4c6066d87e8b54c7469c6864a0aa60d350b29b62eb13886f7adddccaf92139399778424f95ba67d60c8d74ecdcf57bf806802ff9e2e6e40ad3d16a97806a7301cbf297d230541db06cbaff6e38208cc0d715b43ec5fb6413dbe75e19f828993d00702586606545c9af8f4cebc78937a85120e1f4ef60b64d5cb669b70fbed388b671da875aeb783e421d30daa80882df8520ff22d2ed856385044051b7c42851b067437398fa809d43b733fc5804c056b97212747f78d9fca5bfca0c0a1443ea37e33a08fa596ec61116fc310281a55afe482e61efac3173cd1e0cecda73af9addaaabddac455672ca077f6d0257505847421b0ef1a44d092b7c04dc718e15f10b12e89c17a31f3d4f5eaee4938ffce6ba7d2ad21a65af459c6cd7bab37aada38e9c0eaeeb369885fc286e096a1067b058463c9eff075d83247065e80d754ab375045cbf553b789c6b97e004109832e812fbd608d9c6a314447d1401588567a1b52b0ddb7cc49cfc7d0338064cc8ca6ea793df299a172c7c20297ea214c05d94ae06f58b87660196327f8ef56412e14bc80ac153c15acc22961814324de4d52bf0ceef53d3a1ecc181322c51f5fb2fdd75e4c0e0ea7201862a12c6e27f2c1ab67787efc55887b702ad7178f3c83025cf10be9a76edf8293c7853c51b6585f1be9edb42cebdfd728528694cc09900a894b1c27fa1861f9abf11f455607fe19dd8b35c69b86c082e9f46380cdc414109e33901193e106abfca785c47bd9b5a35ca2529eda52be86d6524b95f424b92ef1752df3410e169ee650de89fc62f4b4c3fceb9a0487a129bf68848287df8909b518a344909a1d18b39b746a66758b0a6676268c826e7ef7b9335ac54287b7f9c8c1990d7ebbb6bcb8ce41ce4186f92f858ab74cc93905d2f876781750206c4448871bf3aaea493129fa011bde17bbd34fba12ee96ddae25ab48fe6608a882c642ff089340166fa6b5ef7e537e7918cc2a0946bd53b1c564ad6d99595e37b2c28f91d90e8b02176e4c163ebbcfd4a934c55e72baebaf8c5bc790c2ae7e7cdbd50bcec040f676204092180a3d8bf58cdf8778003436adaf081a196a15b2acbcc9fdacc63a3a3306b36a46a6b2a7668bcc581ba5495c3c603edb43fec8fd6ca1eb7bf7532a971036f9e3cfd1c9cee1e2cabfe815a1a3e3011ea649022c629731495f542987c5a95d06b4c912591d487ac765d6bca9c67790c57cd01480739155cf619bd3bfa397e08309c40687cf5efeef6b1bd83ddb36213e5c367973c34e791e79ab552f718ce070fb2e26a9d4b86e4010951a63d29278cb45a6d64756a8fa74091e43d975c16bd23b62abe359a3f21e504ea54410934a478ad8626420d3deab47769a8529adb01123f891c2f8d5abf45fdc98b0e4b2d1db18be238888f362ba846ca961e4371c60d1044d1a97c846500115fa17f669640fdbb87258261ecce9b7f4cd2191c13f6b726524d2a44e61648b928fc205aca05342b46d45c0f7e85dde4ba72e82c5386a7bf511ec31aad2e091c920f9e2521ddf712ba11c97a6ca666774680b7e1fbdf2da48a224dab17718ef3cd39d4e7726c7a5a0381348dd3b6d05442780ae407167ef7dff9477c6b2a3134f86706c59bfc025488e5ea7805e799d021a1b86ad5b16a4b4cd9a7c57e077d102467afdfbe85a142a4c99aeb2415821c514acea374c184bca2c0bd7a32249f3c52484507b611b13ffbd8438b6b9753b5680f37ca4798683516144f89114113ad38219904edffffbf410b7ad6e1fcb3eed273efbed421d7b6e1777ad5665d3fce4f040b41660cc95d93a417076bf8ee8c0ff48108bf45c6290b09259ea881cee1f05a6251e0704fc6a4067f28febb703ac8f402dab82851d8a1604191563f11adad1ec514cc0c7b33f45fbe89e26a832a72aab594de1263ea287effe12aa76be9c3e88c7662750cd364b2ed208f3e06e8eabea5d576a9f263a7f4d454225402606bc7c2c310b9887d73e9f6c4cb0dcbf436c3207d7367843346d7c69adacfe62f57ea9727dbfe1a9be8dea869eb15f15a6778d74fcf4971f471b15f531dc81c6793ff5688cec1bedf5ed1b7d487ae1c36c1c5f58f2427f1ef9e835df20606d2378dc887488fa9a1827eee99031f0d5875248a8880833070ee53fb05beea5e9c006f13f98225ee748dfec0f7baeb7b07978446c9fc546cd62449d4e00ae553abb343a1f2a288392e12c23cb28da5df5a62fe79ceef8c8c3d2018730beb18196049afa673c03270c9437feb7c46de718cb78c254beb8bcfa64b9e0adfacdaa99723131940e115297a7f49f4cfc83817298fc76ac0aac0dd5d43d863b6a6d3d4a8c8544b07bf9479789bbd2b86b372aec3d7b3fe14b070061373b37a7d8bb832543cb8ddd20f4528a89b4d9a037c13fbe627ec2fa9a2930b380e7bc51ff3516213d70362fec3ed60f830d98e37db5b93926a0926421a559db0c25fd0ace1f6680ca191d1a8437865abb723ea0b08feff235ea06c3496f684ce5953b216de95c49429ec999ca2b19c8218957474ec09f1d3a36d918718b6d36bb2f60eb0cc5449f05bd4a3ab43f7ad2d0c8bfddbec84bfe47986512da47df8e19a3f7a06beab028cae04c482c93a015d32106a3da4ab4565558706b857631e169b2829a3f514adb95f84d7d95803677008d9040fe9f24aaea68c7db77fcc28d43a1eece39ab411b97fb32750f274cfb4585b8502ca7c012bdb588bdc78ccc6cdef0353f1fe03779bba1d4d26783fa49a476ad9e3c0e35532ea20e78ee707ca9e579a10d2f1f7817e36698dd32ae088d9499140bd05c1f060fe6f529b66440744fb804263a7eb1c6e6406cf74a14d31ecd39a3bf4925d9a5fe52c5f2c28d6a9ad21e8c637e712df11c9ee47350579633efac03e755b644c375c76945e7a91cc0458eabd7d1ee7599bbe789349417b782c77370ba4c6f77d846837bafe815ce2426476f25995c0862110da81c51b7a1b0a553d74eb279cd47fd4eb65b7107a02b4823db024b25c2e8053d655b8f90b272b1f33a97f91131a2a81aedc82aab3230b7ce8daca725d2a17455026ad6c3e310e2fce5a64a0189a653c74dd23b4389eb70ffded55aa580d5baca8bcc0463262ef559575723afa6a8716d07007d1b0c7d1308e9319d12a2f0ef2e62a6c2b2c4547c109e37613c660b6c01f9d10fbc121f34a0a76c4b2d9305b76bbe4cc65ab4b620106b82a9233a6fa46ade6f9afd6c148894f693bf959ff1b6608e0fb4f98b0da0589bb82d901d65515f5a892f6feacb8b78ebb68dc15845a0653eaf553d4fb1e280de4b0c14ef341c987a808c1d15935501f2df879edca6a73adbb86a188ca835d043d366055dba9c698aad7d2baa53d26b929c9ed0608adacd7a26d4259776cb6c800d710a0f48b0940943424f557944795c558fb2d6d12a499592719073f4b64c141b4802041c3739a6d4ef369a541162b901e6146133284a3100a74a874671e40b1261e3bf6cb0bc4f25789135aa80bae71eadc03f14bc263beafe8936377bad99bc6ff9229152be1375a9745a178b0deef6c59f01daeead651a784b38f50371ccf407383df9632f7066a01a297618b6270ef7c59fe6a954fec8f76193531a1a7720302b4fe4429ab7b0a2f02f98da7624eba87e87bc02bd73f96b1488aa9312380f100e4921e45579b316eeb39f127be6d05dffab2542451b7586c2b38c8040169020efc5142302721cc06a52d4eedfb5c4a56dc266dd81c5f3b11c40c8c765245638068952553ad96122a734171efaf45c985432b9fd10ffe25fd4773c184bf3e0f3292b8991eb2c88209c635ee5ef66934d42c9216895e881af4821d6f25faa1131cc187c7f96e5fd1f6a4cde22a03cda38a7d32c0b428933e705cf20b65319838b993c35525a507dc3ba68af8aa4b7a011e17f70a67b0bdb48ab8fd8cb796e32a9cf5a1f5626bd127d78d7b38b5fa71ee621be14cd460b2a45c5ede0dadec5880bb2aa709fe4c94f3a13c5ea03147663cc1273214289bc82f865839daf9284b8e344220200e34c2688e31456b928ff045397a83c000639ba4539ee56779235b7ef4bfd1c0ff60d624dfe16b925efe6bde3d0a8c9c3893a7a7649a636247889bb9e05e008ceab442b03a622f84351a61c9930367563d205ed7680f47a054187eb5dd40beb65978752facbc41b14955c7a3629601282380d2a489b389f561864827ea8c87e920608be31b3fac9e3cef2075df8f84b608db354ab5ae67e1a6e03b1bcec1d07bf147980830901cc3c9ecb544bb9ab1d0340c65280dcbfd9dfdae2c362831a863351298c9b5d4bcdbb73201e73bb7cc120eae4953f11850ef84bf8dbd9085f64d052ab7b58df7cebccb29d8413f26f04946978629782d701357959f78e598ae23a1d131ab92525a3f2eb2d1b929c4140439ad7c0221a59c503b9ed7ec471f580c6c3eb2496ca2e6fdb059c192148c68f886b86e8a5b6755681076f4830e42a0af2e1ec7d4836e13ce6c9bb20e525dd2123e4a53b7fc900745b43206a5970fe314351f81e43e882a7d2177f169852f360c72699e622391729e18744aa8025105c2090bb956394956ac9a8262e9baf4756611cc0815f20092b477d7abca9d27491488e4d762a85106c2328eb794586d913dd0e03cff9cee5830523c00eb34c1ac7782fe721cc56143a7575d151cfde3536faf491cb4d326e3843a9b31245867367435cfad6868c88bbb77aa3c7f278c16d364bbc88ab613ba3438c02040e9421fb4e52adca70212493f16971cee32acc38423599dd6f2aa647a222481e0cdf8ac78944313a23ea15fa5ff799c1d1698c2529497445ce53d00b790520ea41b58015242a299e5458c8b91aa1cac039e190f7c9ee1fa644793a0954de497265b2082f34c484a6e89607128d8ad313d7673ba62b124f413edf686b7aaa27d388c073321b01cde34a42ff593f238828dace0807d44623401cd43a44822d2b45a10651f150d0802fe6045490affe4f7675f14fbf4b270951cc09bd2c70522fb45947245891fa48912e2435d1503a907903eb4ee1efb5c2d1ca96f8703740b862b639bda761d0ebe2ad6e2ac8146ba78c2d74e1fe5fb6dce64af3cea7daa23e4b0835c58f1dc69ff57558546461deed3437875f6bca132b730edf3e5b275268c14eb7ab0c2bf251b315ceff5ae0d2ce5826a8f4ff4bce82df803cd2c8b14c10199b43b2e5d73e5bfb5154103056650d90ffa933dc90c32ff9dc9602a016424418031883ab6a53b8bf5cdf07a0a0cb22d87584030e29885a7feb6d8699a18a01bafc36281ed26627d463750e835514e200850851188c32968a3b946225092ca8c2e521785fd489e2edd942ae08e72ecf4da9a64a5ca40ca1c75a9e95e73f8c5d4cc1766e6a2da88d9609f234afed0ab597888a9f91feef94c8d4e44eb1452303e745a03541a5eb81ba55882cccef94d6044904065b66fe03d542eee04f05ffcd9bb77b2a700166b2a372adedbe79a6e3472d6fd34d293a4863614e3a5a13441f8fdb2e24230b1eb7d95137d39e8ac7a955abc578849932133d88cfa8b786da8f742602aaf573d904d5532daffe0687ec68a68c78acf88f09c526a3237c12e30e6f7a5240ddcbf5c96f53e538a3ce95261779e4d70439759c1b8fb57a9b8d8a791d773cf0f02e79b1b0e02772bb8e61712d27548fc904a2ca7b4c138600e2ebe9f1f46e10d1c7bea98a435fccf02fdc8db7af8868c93d18abd661090248827fa13e54ae5801c52688f2a70beb3acce8cf1522f1df3a4bb7c6653b33464778c5d574d45be3222fba67e6c4956c7a5b362460e3f118ddf1b4cdf3f38f8350c1d15960feba90041b39de8fed8750cb4d87a4dd4d252f91245788f8b6b9a44e54277ff27f3ef4c05916ba2616dbf0f32546ed00fb102b7653accb4e551c9711f55f70583cc49e73d3c49da326d7292e6cd81adac677d62a193252c5c557d5fa5b22546280c2d9785bc1b722020fbc8bc18a4841bc3eebef5c6f940703fc69b0b2404e2efc56c340e982f6d661b91c9523ed8d06d99dfb7a9b82deb69954fe08ff79b3172e2337d7d81221371543466d812cd73e134b37e39373d8d0f7ae21d4529b040f2889a295b06171dff55f8e554458c2507943ea8ad1868e1c947970f63612d18060369adea8bc0d101b1d00ba15b24f9483efbf0d79d95063e9fa28ca35bf10b2233dd488527b4cbcc6007063c5c4b5e69d6893ce61119c45350bec4315628b6f11a9e59738458ad37ceb27b9c26d5e247c10b0f310adf6d205fa9adfa9da9fe177e18c59a46ed71c501a4fa19bfec9aaabc041aeb2464b495bf9d9325de7792c6dc3d15dbd3e06453d7e032f29abb06045d2f027fb10bfdc677209f205b2be266826c454feeb93cc84b522a85fc7209a9358783e859dae4eb14fbe0b34717a404987372b5793c29d06745693125cac0bd0c0b3da0c7f055d71ea8464d0eb219634f37e67a762fd5f9715d894f4da559b539e4a57c8922cd0761e71a4501b8a380d765d318c45583092024038451b4ce6219c1d7eebef2b826478339b2f4986b30ceb69288501cf84b5340212472b53ba3ca2ec8859f5aeacdccf5e3ab3880d9ae98f444cea33e6cc696702c885019f0e56248609d81c4402db562ebd0c62970e7a849592889c39bb8fbff851d402abe6c039d15fb832298f2412e18a7e90e20c34941af724dca0b7bbe7e9c14d29b53b03f07d089794b4b839af2554e0e4b374875b32fcf6231d44d350169fb1f706d6e85e8029bc25eb2a37520e2e2dc2e3d7568b2b3efa87e6a57cb2b452531c30ab22f8d7b0551eebbac9115059990bc55de8bf9bb2e64773b59a357b4b370d7dbfe51ac5adfb1090033e049351019d3121c47012e628fc5c9163f25d0ec865aeb3181453a40de499670d03e81b004e5d25c2df81fbaaac6cf3514c513625d3ec4e9e93c36ba41aa117a85544918db07256b9bf4ce6d41d0aa50f612187ccc828aea1b0562a81bf432064cbf21f820b3629a46a9a3ed79c99f9acc898ec1b12bc7d2015e014b5849e220582b3da472bf39247c97b4343bca3dca64400d93fdcdcc5739fc89bfb1a31c6a6f41483dbe5e06b4d1fdc5aeb36c5311f93e72b6ecbd1f037699ae6845859e3e8dd073e19e76228ea6f34c10402bdd7fbde633b36d00472e3fc364b665ad4407a90d363560763638ef4279aeb7ca5a7d07f0ed814bf574ca20060e0f663d0f29b61e9805dfe81783e43eec0860732b34819e3eec504c0267e3d4c75cf5b4b0f3eb533035553fefbe0939f6764be2ec419c932847e9d26ed917499f644dd5be5d15ceb505a7410e89ce84ba0a252d3e68eca96d108f6b9547e3e0e30502a03d58af609d4a34662f495fc3a0a3e728949750f8e96c89ce8b8342a5cca5623239a70103d70731e61cbce09b2dad602771238fbaa08649081adc52338b766c54efe54ed05711e51e71d0535ca77692a652fda90c8073ddbbc106a6677c3d5961916d510b8a69749ba93931681070d587c0fca229a2fa3e8324442ddd0750be2a517b6df5dc19113e0534f87592d8b911dd506866ce95f8459d1744908fe8d6cac410282c04ada0542b64c323288a5c59a9d878c56447cce7e0e51cd8b572e890c881476ede2224499736c12523152874103bb302db7205928132e045008fdedddfccd2a4a0972fea9a1cb6c5a9b23ff3798bfa63381d1b4b6ae1d8c7e26aac1dd3c9c55cfe2a035cca841be81523b77410739495ef227fe20deebaeaae9b96f02dd5e94a9c2c970948c3d1f33cf054dc24b220e97bfb95a5cda2c1b673c322928b9025894b43823cd60771c4419c59ddc6a8e7f532cd63dfc59a00a36b0acfb1be57edccf85492f9866e2f5c70bc9875b46e5c63f7e00e9dc7be344561b159fab51cfb694e35c69ac7f58ef721e996a37bd60f8a15ebfde67cf3289dbfb61da234358a6b03cbc0404a8ad3d6519383d67cda9418d54f50bed82a2416481d9a176f30c7529c12839305e8d67f179b9d7ca0ef1b5e8709ddc30df620c4c251a1a5261c6f36079f056c05097ce02aac75cfdfa0888f4b14e34d7b43df068d978d00d437383e22f48ebc31f0224e3062765e98c6d6fecc75f3fa99453921f9846efa8a2176a1418d6acd6cd74a6965b883664ad2f6da2cec4191219b83669aa77347abda4546c200552d6f9644d9a840bf71302a19b7a2a3e3ff34f68e006e9a98e890c8ee5e7ad17b5413f03444177850a4e0f499a2a061cf34a800b353938bd1f5113761d0c2e2c520269659db220826b07642450c1a3e1382cf616ac27f8a4ac63386e93f9354d2d3975eb12e3ee2dbc4e74ddb371c31c4483c399b6f2cc1263d084317dc0420b914038fa1e9833dde30b21260d5f25eb46aa982cfaacff790c53ccb9e8d35e4cffca3e1e1d4a2991b43d01b7e78137bb59a7df910072e3948f9cab8c01214d7329ebe2200fcac099e0e56d8d0703faa38184b3aff578d6a8ba8dfacb53a54b286ac1e0c7f040430b7664b13483d3d41eb54bf2488ffc996f11fed5d0dcf0072a5ef6ec8162313755ec7e4b5998d4dbf3033ff8b51163ec5ccfbb6f189975900c2725d8a794675fe411e72502de6c05c12d2569b53d2dcc433b8fc3cd019f7db80f7c1514a9ecd27927d043891683569d6f11c9591a91d6ad73b85092e7428b4ebeb264ad3909ec185ac515fa0b05e8c1c3b5bfbef9bc0585d2aec7c2b687a5a95da5c47d354909f0d07d1e2a48d96589c3df2f6b40c095472af0118010d8d9d50d7954d85aea25fc4327ee65d75fde57218baedd5bc0ef13f39e5f67e1f3dc1a226ead32e2b387bfe6ea61071773e7a764edd640665de8b2ea6f89a2e5aca8ab28083cdb81fc04121e6fb1c006ff1ea2396cfa913ee8e2114b122b5d3392da0c334b70715d3c175749f6c71494f55542252e31ef36462367e72536268b93b50b0b1e60bb6cc50d4395b1332a10f4bd846f4e85e3e463c7d3c2ec58f7785ffa1f87b40ddf37a86ea48ae3605cde84d9b35a4dbed4f61078e05a2316887e587041f4d821713099f14d3ae41980e3c415a4308989751dfa63c0f6abf9d2a8804d8445d5e226422c09abf3e3d29bcce7d2815aab082400904bfccbd13b6e6afbe8d8e2785b984b025f4ea4784cf8769a05ab820ef54c11ae0d3c40ffbf163859c1c240e134fffb6b29cbfed6dce27b24510f00b3cc0f9f06fe6661c677f6eb29a8cc815b1d969e986974d015ffa73709890d87611dc22492b6ac8ecde8e0300137bdcc500d39f4df87822965eb50a3432906a435591a49cd0e6e1e291074ac9e3f3aa4369edbeb4c815f1c6e6d9d065ce5da26a0765f477c922ab7ccd47c4e571bb4bf6e9a5e24bb2e80cafdec4686aa51b14ffef6e2260ba72e4d614000799bbee44396f115440197f80e27c68e59e02fef4b9b74df48094a4c3eb9fbcb263644d3b475a4945228b35f4b20148cef0b52ba34fe451f3ca4b48a8850d9c6ddc2f27f64147060a59900de88e290a9e2216b5b9c9ff8577d8981d984e1995ca0ca2dc23987a62bebd2215f59efc4b18b36a5529d4868e1637d231cbbad9b9b1ee34675c5f626cd55de675e168135a6b922fe58493acc480624e940550ff962fe0cf4ab5c15a89c74ce7e52524c0ac016574e5bd84df6aa4dfd821d0acfe43237cd8fc253b13184e5a566a5a3b2400d41e9029fe331f383dc6d02647bf85f50ac3509b96306fe79da4da821883ce212c6d304442eac053050f86922f68d98c200319585a2c055710cc1af11dd3a7a3ae5b3f5c3b215d1449c3c131061223de3cad3655d682733733a2daf4c62adc3cff0fad2798034c80ee5f17f034120e810a0ac33ac1e444b8a14852dc10cb9b76e101793a1ae12bce1f6aeb2c3ff7b7ffe86c303e08e7d164e7842368c86467d7c81a56369929a2cd86bd831be5b35925b78280ac26059249de95ae392d37f969ab05cc520586fab562c9bd4c33cd869fee324a7fb6c8d5a68d4a08a7ae841c4f44374ab7ec03cc5b758f36230e8c01a1ce4c5434e07deb104e7e0edfe42728ffeef9642b62714b655401bb33148dbb5f873febe80835f6031d7b25f56ea29f09a8a28ecc86615d45e1ac66e5744e3e100aefe7705507b55f093ee140ca03c4cf67025e5831f76565c7e79b1ebe658a4a8d67dd836ba5f2d6cfea69b801a21e433a2d4e3ce306934d8e783309ec1620dc427840ab56da9572aca4f7b26471716b6953bd05e8250b9dc9a47c1c4a8f249d969a63045086a7c63f4f4182c72577360fce5713e0ddbeda16e87f56c8355c9e878bacc1b7b136b3212e2650ed6def5d0c8e51dcb014a062bba8a79fd6e8a09bee8b3f7cb22b30937d984bd36728e5384ac68206e7c91a229eccc797f1959ec57fa0b2edfcbbbe86bd1388074617470024f747ae5078e45c0790f126cf452b9ea1edfa26d5f4325015fbc4ab009b0d9d7cb9d2e22e1992d973d8300abcd99fac93e42c4e31b6b0465467c7b675c5e39fa538c1d8256c7298a369bc70b8fe3133bf6376aaa231bf79b47b9f14fb590afc8fa87411d8b3d75e67db5ebd851d1c8f52dd1e5243e15dbcf26b216f2440cd6ec1fe64bc2b96b26806c956062da9c7e74e074dd07146b4153268f537f3b3727d86ec74474fed45ad68e661ba4d6c0aca8745ffa2d8b7290a4bce1083cc918f0330817969205c70fb28bfa466451a2390f1321b3d11e9a60b6c1c79ccc28e696898a70401c18dcc7fa17fe1f331f0a0898653fc756d5de02df3bc3988a63cb8cc6052db01e037fe71f98aa1e03ed521eab50d7afb3880683095a4c925e4a0a3c3cd166a21747699082a37e1088dd2463181b2ba90b77bf33eb5b959e8489e75b2aba6c93fdbd7bb57de34c15dd3cd604660c48241ae62b4e23d9af1d34809d6d36a0a76c44dc63bd599c352f6da1bcaadb5101c5412494b954b8b98ac40d90ff7f2500aed0b7c3428fdff55a52e4b5584625c3c9e53abc336f59c06fd05b6a245cdb335c7c5c81722e070b798fd9b30c2d28e483e31fa0e31f83c67b40d9e9279f50f9c9263717ab33fc14e9cc996f890a948805f53b2fa6604cc48745048507fd3768d3c3aa8bcd1d7a1318574cdbb238fdbac1d67b95f86bc5d26cb83cd5e3e1e3173215b9817131648c8e6ed3ea3dbe2023646ed33e6efa8ed537a7d33d01faf128c2aaa99f05a5bebdf8ddcf60b8b0fe3be104794138144a39929a09d284918fb22c9ca94862f6cdb9f0f799b82b0bc19be537912e80ff93bf04ee8fcb0cfca69674d709635e882bb0a72c555d242cb87e26ddc9805884887c6699e3dbc8f130586b53b245d9fb2855144772f95acc4eeb70042405997634a2eb91eb28a8172ae37656a8c194888aaa2c64ddd37c180db45162053b3d0fb4a2d592eb9a20408b7f78c44dfda5aa0f51a972016f54498a8951768388ed98e6c0feadf02b60ff0d56cdc52377209e923a3d5f007d74c621e704ac839506494e199541c9a6c1825bb0180bf5c34531d169e79401b62b9d28ecd917642008f579f5d6f930b094c759023c95c207a836c363a1591845733094b5a971d737113afdb8c9cff0355b963b0bcd7415ddcac7b9994d0deab55ca9bfc885005a460b4d7758d61650076c89d76b34de10478764b25d49aaabb9749e53b2735e38511c8c97918dede03a8b1ae25a37bd523842f35976eeffa6bf31481a07a1b575ca90d3d4b9be231e69cc2e2f1560597d0e0f6939a006885248318e10a3500e6d0f0126eed30e7a6ee37d1b4d90369773bb113ab4211e80725812ab31e326a8178fb584f0abf507d521d1fb9bd293b021fc185d177e6a336ed2e537341983b8d37265c1cf309a3334b8d47c0c496b0b4a2828a5dd71453eeff2a7d34aee31a4b6dc47676033c9c6ac0a7e95e572b44afbe51e83fae328e39d4d336ee2744b3b210004df74370de331d69c2601ee0466830083f16afc1094eb0fa45ab8c955803bfd21f247439e76c6104cb580d091d11e4486db91c8116fcd9644e1120b566d7daf5353337398710cce1af227a0af051cf8f0a3c4ac62f7415c01933efd76740a7e28c40df903d586caecde6d36edb8532885e44d4edfb3744d829e4a5bddcfd9458a99efaac2e44fdbb9d109b670d650d8d1a41cb13a16ffda7922ae28cc4be5404078654844a372053e9b46d13a575d99f5dca31d8f81089ea7665013235060fe8ccffb615d1d60b58b0889ae5a29306f7b78b64093e8c2825c2b4db189887b28b94c99ec6c2a4fac9aac9c88d591331b15fbb92a5b39103b84547d72ca49ca3a146b2aa50b5de77114074f3fda100d2f0eb68819f940cc70b15b878ba83a268edd3a19747000716b834c5aa2916655fb7cd008591fd92b3a4c028f0a5412b329f0bda739d08314f27fcdebf8061de5bcb7d7ddb10c39488b279796c2eafefae948ae5224461c361ed1bfcdea011d33da7df42036540a78258dfa3061b7c8f7a4a0d54808243953aede4a98fb2c95259a5b461c61adfdcb682bc64c64ea31f1d35ac3bd9311ee908904f97f31466e942921c08f2381af0b6dd8a29fbf388c3664c49120a31d57eece2ea6e06f344ccd7e66cf4ad6a26c45e4fa844e8759c1414379d21803b90ef7d6cc4b1ddc98e4e3cef6a5cb86f127b7accc0628eb88bf13e753b82cf90089e1ada0bd1d7f66f58ee76b7e11d7e7ec0ac54574202104702535fc83c0b7ee948e5e59b530ebfcfb69d1443f8ba8e60da3eea20121138f9fe57cc5011d8cf959823c85832d7603422b8b413cbd73798f04d3114e703592a4417153aa5d06240216f57655bf7172579bca3437ec215147dc4a331ffcb5597f26d03d6392721a776366f7d608f81294869c514fb7d70898b07bd8c5f47800e1d2f66682a74b902fd706a70712a4c1ba461bb7c85bfb8551a622c6ab751eea24e1ff4ea8124f5bdfa2aab32cffb7a0a0955bd0e92def2cdd4c367286c7733fadc4a06b584f28836e0102c94f1334657fb50a687bf8064bdd10510dba22c00a3301f6e0be123a7833baabfd129dc109dd8133d0853e65f6b0c4e2a2cf9f1d0051712f1ed5a4053350a9146f850245565f3b62b84ceee680c4ebd279b65d0c8e67aeb566f7b3503d0426620c1f3638556b9fac92dd294902e94e06e8b611d65977dc913dcc39be55e495eea6e3fd2a91d90c9d596b47981ff641909bf23e73f09a6c09ba34729d5040e6052d2f70acb6add8c88568118d2adf7a2a01c52c5e5537d26b9fedab51302a62bf0d3eb45a2c39fe138546ea9e0f170068d8b884b1904fbc642c57045b2e63916693c788b8a27017b1d51e5e948cd2cf6453d4c17b7f9946d24173c4fea967eb8beffba6a1981c2aafeae1fb81b6f1feeea3c14940b45eda947a234022e1305ab258171761ffdcfaec4a41f6cb3368af089daf19c777577ea91d63cd3ac92fed29a3552c247f3b12dcec2b7388011975adf70fac379a6415c42f1305bb52af264fdbbe621ff5199ee7e2a66b4d20f067d54748a9bd96955314e200d1ce52d8774bf427e87b289d03062f68018f176300cab8074c2bfb5df4523da291e4390d044c7921341e43069faa32d300513df9f23f7f5583ba5f55f29f6a32e4c7c6e5e04a2be6462850a3b54aae0f3758b0569a55118b05cd712b0331298742dcda54d2a112fd3da43d430717bd50e5b1b5cdf37b95bfe0e9f3e080457b9ea20cd5ee88529884369541a0d9bec7ee5616d64ac1b6b5589d1f88b3b87a40a808a2739371f49adc2917373c2e2cc71d0e1a01dbbba0f4c8599e3d2791480c6c25e1dc0b9a169716edf1d98a7c609a81141a3fd288033443fe6a4bed45046cc7cc8005c57f1de263288b8321f117a8a43638bd5ac3c67f1d0dc8f6f701f899abf3f6489696bf47a4c857bbc78f9ecb5e115e9ae938d101010567c5c6ad84a722cd760adfa431ff559f45b3e5b9dfb875f2688e2dcaeaecd10eaec5a2f58751532889339997206e10b33ca9c0ed93f9d9d001b749a5d5eea01dd2d3f656c5ead5e5a83c325162352853de97d5501fc2fe1109aba899dfa71dba3bddff2b182e49d073ae188426e66dde3cc89cf2519587e7737b544ab0eb73f361e3c347b7091cb6f211fba85cd75fdb233bbc93ba62b485ec2c5e2457a6045f84c4e7c4e186bd835fa9baeeed247a5559428348548825b8b6986f3f510f1dbf5fa4ceeac8e461c386a7dceeb87f8be0e30c82e6726d768a555f796a6b3d70c1eb0f2bcba02f79d3d450f47b3872303ab4087b2c6ded981d1f010cb74a69fd5a49f069c8966aa80f6747ab7e0bbd91121395dfbadbb0c2bf7f554a6715faa40e23e8b3ad3d9d06269d1dd9c02b274690ecf533807e5c5836ad634fb662a911cccc202555918794b4b65551448fcc294fac7a794926c7843d49c8b419e5e6e87d9108c4d8aafa0e61e467083412cce2112df9d2e8a5a41441a5b21b4f94ba4ff54a94463484f08792480b6b23772916c955b762707f3969febc273d7da006c0754b1ab25b1f7175ffa51312c746803bab4f3601557f23c1f5b786360941647131c4ea6a196ebe4ec6cd5393a300b61c26f5e6c36ac49227b660d2ac512090b8e59929c13c6b7b544da93d4690f3a775b64c8bafbb49f2fd40726ba759cb4f40104511415724d762178b35f9b52194fef2d9b4c08224b428004908ea1257d0b10864e1ebf756eac82ab408a2910af09f9976eb01f271847c290daa3641e61e807d0e33805778d7aafe10421dfdff54a893a0d5333c6a2043d3f2f2796cf61b7cffc2d1fbfab1215b8e405682237171580e55c75e219940f7bfa32c005de9fd44fd72070d678688acf1a4dcc578d8748b2742b8a56962884531e025e7e0b97c1c5b4a8a9cb34b5c25766c3aa39d0038d81ede2c1d20b245f7d914019d1aedc67c6d913b0f2055596d4c9f1d328eafbee2b4b541ecd794736b31df29eb5ef00c9dd6e171f2688cb7768491742089e61658ec9f1c29a0bad6a6214a777a9e21896af35854887a41290a2bf35f853aa2b53f9c5575a0e51f0a7d047ff86f83c4d5cc22a14efbb1697f75de06a1fd8eb16c98f3ad44592f096e2698078935bc7d71c8860aac5074f331a5e48b950effed8bc127f627ab1d0acd1c537a8ae4a2c25b8646b1a8949b2f2cc8d5a44254d3410e45c001a877fc36782b74002a863ed1b2341489eda99bf8aeb79eac2f7c97939d4c5ad9245bc5d54c00cc2a3a486eb61947e8a34692eb89c11881cdb562cc0118fe563fcc82e95aa5ec96e8216ffd592cb7c62afbace345af173ea044dcc45d908dcff6eca52dac4d35d77d796e912b18c246a15a9f869012987edc6f28f0675efbae443ec90fce3f0e10e517005ee47f4c0ccfc81eaccbe160f46073f3c08414eb5901b01a4c5a90109ea1b8c3f21e2de287d593f16f02a80138c1e98e6cddb02dfb51de979ec9aca2d79e3d30bb873a492383b612fb048c79e3c93fdbb46544fc3c6f9d6d08c278c4b9c4b70d6c4038eae9b0815787bbf348ede402592f95637b8deb6759d0b348cc63cd71d2840086114acc9d081903afd48516dc82443ac2742b26e6ace5742b97f0be72ba351fd80af97bce9d94824c66f42cf48d91f243ef10a354c1144d716c725bfbc442315ee1549903c6db3a35f34f325038489f1b55218ab5951e286a14c5d54fa85677442647c5f028bef67f6612c1d4444138695c48d8b1025bfc25026274f10f318cf297d1248164b33e464a334bdba16c16b33c53dd210f9f68dda8fd215cd8685589ca3cea17795ac024ed7272aa181d86929568dc909f47e6a1693f64afb9a0a252a5b62c5ce88a14e19f153639f09a18f346d67ae8cfb3010e27483d43058486075afac7c40f41419fbdc737e8575d37daf3bbd8eb48b742cefff37d10564064e9a4f825406100d4114507e7f9f3a1ec11fe1aceccff9f29d4c87c5650342aab19cd1a1a852037e516d73132d16e3313e251b742f7cbee741e4772b8370352abb66bacb04066d7ec521c605dae2cef77842c841cd4c2f8f4553bc2149fc63dd6bfdacadad3eead2fdda7868f36d914fe86d7152dd97f3e44fbc2b73a39b889146bc2e10313104e5d6f9574b12ad6eedd88068777a1c154ce3ab112fcded75216fc5652810464244d7ac58a193a33077e6d9add3eba6eaed5c730de76b7e9561b64fa72905474efce56d7215acb750f2285c6a130f656b8139029c9bbbb610447b3144f587c70f3e38a5884659934252427b07b7e9e43b1d3489ca53aeb3b62579e5a9a97b18551be38c4f447034ee1b35fbcec9d4f6e3fc313d7b33c5f5ba98be0ad07b4b67592bdf28b8c3cba8ceccb253b7f673fc52144b93c4334f88444b931261c6f25df19ba3c8ce68182ab0832cfa1823266c5eb6624e1637fa896315e9ea2d23f3239bfe2b8ed2b7a94161311980b5c7a666d04c075efa227c21a3a0d4e7f79739a138e7ae7871649ae53f36c76e2ac254f02e4bc57d2c9bc635fcc90a09a182286600e25dc6385a51430c356e93eadc89bc03510a7587b1ec06cbed03756b94627439f4251e595be28b88b23a5ed044b4d6a8cf6acbf3e12bb89acdaf4c2fcd2b4b74dc7e49967f65d349fd71ef1b0ae8b1bd46691377678d67c25d045a835c359a7cbd1e078d211731d88510636d327e43a8b92f754da4c9d40c808c9cb28b0c9ef79c11d0966ddd8fd385a1365aac313f173ca441a409a8b82fe711ce87e4e96475ce9af10a01030b9b39ab9870f2745b45719080e1e5dda79ebff5d5702e4ffcaf3b2ca12205721dee7b3543edd6e3503d778ec31be7f090513f182d2ba3e50983fe21462fc08263452107e8ee0c235a8a3db5378ce895492cd6c64d17c45168af245a3a38998f3996cb4e775c8a7be5fb2191c475a62e7b8b432699aa06f06d214c8829261a31b9bfc0b1bfffbfaf0f109f760dc1c850688e456967bae5cc6bb71359c876f8f95eb536d59b67e30a3626ef091a7465b81415b65dfa993e35d2a74f2024af2e2aabf5690375cc23808096d4dc25c846e43a135b38d84d638b5a49c3604579a3a1d62113a83499a438bab97beff7696a53114e9861ed3a175d2a4b43512de5e4a7cd4001108188baf4e50526366224a7cdb7486845671127dfe4bc33e8a8d58e01ca55f876625b94a6db4377d8c11e3dc4583abc46a7d904698139e5739179483b4c099a8e7f7345a794594f419097d7ea6d4668abe41221817f31c7e072c94718458eb9221530880ea08220a902be61c7fa9e85d62d321093d74362fae7779ecbde03e5bdc33de65958a4f06bf6dfaba0fdc65d80e63952cf968efa340514b6352a0fbbd30f7fc82dc8c616e16ff3d0fc9b3e126a9bf6b3f21799ac4b426eec9dd6598a67a56cc6c59c64ee1b6b0be2f7ba380652e6e8399526a99f4e1e091e1d97fb61cf104d9b523a3e1f0d55bcd98122c35814ce0337f0ff9b7447647e5c22ac5f77fb488540586a7070a2057447a7c67f784f399f8630f072ada12aed1ca9d1c548c2b7f18542262bcdac9efe6ea75fe3eee6ca5060c5fab166e746e1b970e8c9bfbe43bc93f8916c0cc5f1c6e0484a5e8868673fe6196cf20823b37dbad41dbf5ac50d14aeedcc76cd065b1102a312c44f7738310ec9787051a22c2147eb92f026de6f148207c2bfb13d9636b68c60ac87dc5834d15c40ac3f69f9917538ba4e9ec9fc86761c2481d37199a6d545e25985051e1f280c747aaf66428c3f806db4f59bc46bb10a6e1a004cfef29b8a28751c7e71a47825af98680024b34451b7117a219d9fa087098c63dedc4aecfdaf83323f3b75b1161db70d7686edac5cef437de90b3864d6888a7a4931d6546b5c18d9050a1af1f9307cfde966b7c7ea62720f757e9983c41f7e31eab11443fd8e562557ba127a3893c34b11320554908e696c11fad30b72939c313cef7c28cd5ceffc46b0df0d54c4c46f3572b2565b52b1e1309a247b4d928a8278796304847926a8eac11200e8c24c7301b3ae6d18266ca4f478340fa18c7ee9f13553207023b36dd716ac08792b0604288e758d05a2cced28a1f7d6fe9276cfd25deacbf08ee7f4c60003d2aef5e5800248a4407279ca93b60d2336409be5f9e57dbde390ef74a2d995da98b5bd1f5c7a415b848a91a77d6b19571b216c948ec336a59f3463b0cdd78a7c8f602e5136a5d55ebfcce66465ed7dce3456d2d66ab48cbed1563d4a31c24cc37b930f89104f21185822386060748b2802de10e5a4032e277fc3891045f560bc70fd480a67875980b68e378d823ae320689d5d7bf037e6e25fca9a47b0c7d9880137478775d579428333dfbb514e2d345fe41725c21e71c5e9fe550f88a4ea090e564801a37562c53ba7dfed1e3f8ca9fdbf1e43e86bc999b2bf85c5e5cf9e3587b1ecce5910ce47961c76d8a69ad5f1162a1192f9eadc2b8aad17bac0d655c788f3ea4a8c2ce74fec4abef045dfad01ad647a5a1c1dc1b970961787c1aa3b9886962c43b5299fa6ebe8dc0606ce556d822b8b37c3fbaefef6640a05fa1c0c73e26156c70da35213ebd886eab0d5b327ce8a7a9410ffddc4d436b13a30cce801e973e551434d5197f362c080806461415ba061ebbd98dfe0d9cc582e488aa6f2afd681f3ae923945d717862309bfc302b6bf2a34f7d8c623706d57ffd582e54731d51388f83dd173068568a524a4b771b47ec9d33b526b3845d13312fa31fefea2e51100f4d3bc6061c4d418dd041c150dc4093655ef28d5977429b85671ca5ccaac549c1a2d9feb93f340b9fcea5cf00ee8418fdb80e0269ecbd98a431a14184b1c0b5a26e7ff771e66a804a28f88ead4690d3d2c6385fcb00367843a8cda37aa8cda511f747b6bfb883aa107ea2727eb429716785d6e6db8c24db02d2a1713a5c0c2ec8c7cae460084cb311f97428a5091e91d07c6ef8bf874a2a04d6777321b2b744f2ae0c59dff0e0e90dbc74cd261c0b0cbfdb37e8a5d146476202965b4a8261ca03f1accc51fc59600e7d94e2ae7957e2df02508255e6362f1514b908a1b98e59dabc7c1155d4e55f16db88b50d5bffcb269023c798db148d431a8a005e8694b967dd905890216fd01937dbeac0d1d9cd3d598926158707e3c63bec418413e7b06762152fba0092c02614073b6c176bbadf67875c2722430ef8e5df73a29de26cec0c08cc8009ddf1e3a41585f0c6fb4987adf051380fdc3254b86812503c13987e0fc87c5bb22d4287937be484448ddb9cc8e0f46dc8d95243418285d34ece437aaa70847528bf0b52b1ccaaab38c5597614309ee3d85bf5f70239616589be24efc615c88d7130db8202251b483f74eca84a12e3040a32486e87cfab8c34704fcd90bae53cf972808eb1e28f4ff2bef817e8d254f7e9c678f6590d9ebb98bfc2adde866a5e7687efb91d38e4933571500d0364769cbbf31dee020587777706a8ea07a1f870b886dc156f50ba9d325f47ef463fb5de81e3ec7a569cdf015ff47025d5e23a7aa175713177ff5c0a9fb226fc317f236a570147531fca9b3d0051a12eefa3d54ee72dd6ff02056f6fc354a7a487c5176461cdc72ec27ae65f4a17014e4904d7cea00a80bea618cb8f7b3af3fe21052d9b1c7093234ff760a12960dd7605a60e00baa21b97f884d6a87afb2fd6f03200995767aa5867217a08b66740716c1d92914cef66809d9859782a5014884730bbadee32238159c36b4563e2651b874106278ebdb78f24a5af6cc93473c1c375003640d0761659081185e4c2929af421c6e6f10b8498e34770e05677c0556ec50f122332231022e8a29cba446279ef839aea980abdb3e6fe59df685ae019cb3e2750765a74a00d6ad1708c41da780360eb0a345b51b32aecee84f0e531e17a5134fe9505550a3a329208692b736a6e4f81ff18b0ef84c55e0aa2ee81baf2b6b7e412502fe881feb68b6460413f76be8e74af2e94e489d739a5dddd66a14afa291bf49ba6584e6d07cb9ec4329bf61d3ee2453ab7ad12b6493c6205e4149ea84483655e9d0cfc09b42e1396003c2116438163352ee57d8bdd83890b1d6ae74617ab4e678a4158e06a5595ba0483df9ae168af96a3d1f9301609fe8868af7b44ca3d73372a075b1ac25193a76d5ff4561665b48d4dd9d1879eee1c04cde24f429aabb16d046738acacd51b8f2b87688e68b2a30550285c514d7bff6a1798971c79bd10dff5a16859776222b4096c2cf663d31e3d199fad391675ee2c7bf16e0c1099588c82cf305dd139ab906778fbf66fdd0b5a71ffb59f93da9e75389f463b37d8795024b47c3ac66db414731f71f823b3733ad56e34d518d8094651c98018e6077fec02909a3d3a9e598df7f5bffa6d1c8d49b737f58f06d3ac24d742009801aa50076f7474c3fda6ab0b4d3f2ea9ec47f318d43516d6492e632d69a57bbdb7f0b0b7c72f55fcfb41d9284d729618e6fb5cfba96873def08c52c4242be60cb6fbe3308dd025d0ae1d59c1ac28214e05b0674cc283b8fbe956c476bad6b86eef7031e2e18164766c2b2e551a671177020f89e9bc43467823456bbfb0b550353f36777d1ea1b12931fc2a340cbbba36bdbfabac686788bffb6b935aa80aa7d4fd4c4bbd714e394b39cc73aa9c889fdff0494b4a32cbd1faee7489f70358eee51bc4cddcc4f90cabca2f36230e08044de072c7670ef8d852edf3f3704d9debb77a5e4375c990cd1d1a9390bc23a3db201d4e450936681885b2fc46fc9858e5de52e532749045f8d5f0929c9b1a150971d297ea3d1840157b64b3eefe996ba31c71ef87b89228c8bb041a0bfaf307b546178400b3d7ccfaada1a84a1885173a79b3a0e0cd8700d122fc58d102f1bf4bff76573277115c0882021fd7ab40fede00bc4faf692a6e80c32f3d4b8661e011a8ff875e7bfeab2a4fd34a6a33eb0278eb504146190db3889dae5d39827a6b9fa0f356e281813e1af868c8752d7bcd359f9af52fe2b8a0c0033e7c06afa9a012a5bc9dd1db4caf70c23528959c6ecb0e49fbf6565f42beec94c68af302178e84153101613dab762af989f131eea44f81d22bd49d37e4a65f9e087022269373a1614b4816cf5a2217842bc93d729ae603509e5617ab8fc7204f119ef5f499bcdb9e5ae103efc8fa92028fe4636e077b0cd879dde93aabf28a98d84dcdd8c7def7609eb1fa33521f53a7767ceddb174d682c22004572a9dd3bba3e6ff06a1c9921ffd997f6d9492c634447e475126b040a99c044f115e00909c4d739a5acce4f6c6e4144378d0a27193cd1ee1df8dd86d9648ed94b7ce48b5934c2c4817e00c1da5d8a5eaf3c5ed3a7db36981d5663305b3061e791aa61107fb17d981d280c11e139b1b3bb080f8bdd9e29b31161e6458b2650cc812b95f1d38d0cbbc620321d9275aaa2014c4b5426b64ae08db4dfca534ad0923c83b4a60a49d9ba9ae931f79de063f62b3c7e1d21f048c38502a65a4497b5c959391005e1a1131e957666b682f0ddf31a8a8f5c53cbc30df6e729e22e4107d97539178689f5cafdaef4f237cd1fe6680a314cdaca05dda83279dc444a74b6d63de956b758e46074ca02a0b53066bbca30fa078e78721873aa263150f1a5d4b4733f91836994ffaf24c5dd5664bcf4caa7a6296f278be74ea38d61a55e2ec0010a81ce29b92e1e2e94fb070ff77b47bec5b5cc841be4a41f436890c47f3d1227097014d896ab0a5a82d1405aa18a8990e6564f103245644c50f69b0d0c6a69fe8d4ce07bfd08d50ae5765c6a84d89904195c3fcabffdbc189cc6990d8bb0e5b84d3c6a5613699b88904c7f10b27c47061c05d4444b3c966e2e8337cc2555be2eaa3272715502d8f83c2cc7845d2e3d9b3648da4c03c92b15f90ca42a20a01989272ee654757e504886a9eccd2400e226be4c7c6198a6c9d87232287d047778943cc67d2d9bdc7298dc70e4d1c18ba0bf1b23ebd9675e3c8ae7778ee2bc58c547409ab39e2213a5037087f94c95d28bfb2ad13f7659ca4f4ae837124ca3d6e7220a6a38abfc786c9045d924d137813d8fbc015e6b270b315e7abe1883e853cf7c1e80537301c297464891e0dd2f9d9703a0cf1d3742b81dca79efde1d3b190f4f146d61e79553ced1fc6e7bd2f6ed4ee18e8983390782cb6207e8b97081eb9f444c5115a48962c0183d8d24a8d864861fde1cb440e3dd166f22eb5d20e90ec6f85d86e13686305e9601b6ffb56ab953e86244aca9beccc499ef882768023e15db999c35a8741906209f5b719d4b8e0de4b9e437fa45ba9effb183cb51f1218387139f1d5cba870e699a30d7c7d6b0c3429432d14a1f93b9542c2c9429197e32eb27b80af527a4f68c6b405c9189353787165aaa5a5af789418a01a4440dcd76c393ee92967596c08c08a12876f1eea59d1e63352bea24cf86f0af1bb95c2e071366e7b39e2af30393f88d32829edaee75fe55b0a2912cdae0dd1b226196ec0c9321f190e77ad9702fe2731796092455cf8293405ca2b7f9714c19b919d817cb1569279bea091c8cabf081c682015aa9fc2e5e2e0d7fc94545109965de9a950392e7282a31d7b9d2bd800dbca2fc2e10c776fc90bbeabde1799919e88dcd0a6d2cfc016f6db0681921a1d283afbd662f16cd792528232cef2c0a4d68ec886b20e3d23d1ddb0abf345aeec2b1cf132ea7275cebfd6c7400fc8737439c6c86290e2177c22a778bdaaf46064de868d594cd29bc1ea3e689757818146c62ec001d8b5ac437a96d4e8e207cb0038754004e3caad1ed862a72280ee229fcafdbc77838a309bf9899b088a0f046ba6532817cc55dab216394ae4eab923cf85769d02dd510bedc1f36d73fbf7d4ec2057fa13ca99359ed97e6868ae43ed9f309cd5f970c77856553482fa31696059aa61d61d74f799c19159848e0f0abf2941708b8f370233afcc4c5fa3c83d0e10ee075fb75c9194b93dba81b234f3df30470d34e7f631a3ee9fc94f9d00210779ce6118bdc32a07760acb6705a808398b252087205c44b77aee372ae8f5a2a7cdcf7456f08bffab99a07714abe51631fb699fa3866f0c6dae5baf589c650cf09c2d388842cf219820e5c133acd258cc8f3eab4e14d7bdad014eece4e05d7d4da83bb93e2948484a87c78719ca6bd9b9e6bf444fced5e41e3ff9a3a633679d56778ac6d2f1d652f472feba256da8959b89375412368b2eb14c22fa1d5302b8300139c74640890e6e7d1e91f8401c6e26c506b94962e4011bc7f1865603eb6c3648af95df92a03b5bcf5171685a1e1cf0eca46a8c00a2f35628f98db9f84253cef0fc219185a8f2ee0241c30dc9913bb608f3c1b08912c52f38750eaf7b7330bdb78e54e5b8ee586d883d3b139a05b07f57d4f22c53e59884d14912dcce4968b9dfd085b939e55a2baa1fd47c332c59bae7f82f2d53e1a4b4e14aae61c46577d7e0fe4404d975cb81a105a83f65d8bcf190671c0cb038760ad5e3d84be1e3c1503dbd86f907953573b668b9edee75355fe4039fe853e58fa95567cc4afd598b7bb62289621a172d1d8cabad3515b6cec915ce8e37c4e207ad322207272883df1c9e5352ec76f706298e3ceb469bfae6f33847df37ec9a4d74d00377d6e66f7cabf93d24800e304964b83cef7e6d813a44a006e2a084b77f7cee8f0aee435759e2e7167826d8c35a80525fab4e172de7fa8fffa9db071a68c2338562ee051e86f9d6d47eb428b703d5babeaff73072544bfc92cc6487961462a3b5da836d1a159e98a0e171b15cf291c8179d65e592adc82152eca84e85e80e2152943544ccc7e2b3107724e3380a5e29c83fe37e01748253b900f8111331517c2492b8342e10ba041ee978c08838aeee17989b0650e06c2dba2b21282129c8d8b6174017c46a40b8a7f004b8b3f70256e910b1e71be13769211f7785354265d9813b2bdb144070d52859e346f7d03262f7637d293a43231d5c1ed97ad63226f8c97dcee5e1623ea0d1e194a52dd3ea8aa7e497bb021577711574bec8b2da2f6ac9bf9af2555abccababdbfd2ffdd47c04ea7f87a854305c15a539998192636baaae90c84ab6da3f47cbd96d76fad80b4b8ce15cae5cc5eaa66670ff3bd702c0e0dd390b00d05219a45cb7987fb4e173bc6d1686243808df8b12ddbe0ce80da125d67623dd44448484ec480ab70a8d0a8df68008c3d1480c87835710e9c1b99101f7db7b31426855f3c527a594ef4939aa75ce7949693debcd292f4a519725db8e045513539bdb137cc04b9a29cfda8e94ef49cb6a3b7d22c9f89e73ee456a3a091f843b5793b4a0fd7ac45e501b6ea730a8f9059559a1821fdc6ae0f81863841535618c31c60affd6c06ea90b6a7e7db2fa8e31c6ee0f95312988a1a7b7a02c8aac36bdb31175ceb99cd95a08ed3b11767feeb35b06b60a8cdad321e0dd11809d32265a4e736d0bd49d2ac13b5c7325702598c033c53c133d8317b0daad3b1d8c8b576c8fbea58e86657cc52dc2c8e42d1353b43751d1d05b16bb6a929080757a99a0b72e014643ef142d075b570454b0001aeb921c8cfb1d8cbb75f5a070bb9908152c80869ebe729447a5570da5d6ebd313228783ae1d284f0074d5c8bfabffec8e36b94b4b449bdea542a899f53476068cc4319c71cf6aed5cb3374f449f7086dfd12622bcb019e212d126f769f30316189ec1cb627c0fbef6248cb2eaa2c27bf9e8317de0f9b68811c21621eccbb77eadb51f4ef68887551845747bd5459d97883e35ecf08e3ebd4ae3ce2a664c7e2863332686b92464b106250f8a12740fc2a6a68ccdb5ebd7ddeebe3b5b06949d7424603530c1ed1a8d5093daac77577dd1cdb6075babaa12d55e9aed25d99c7bcebdfb66b357aaf5161042082384cfbd67b50a6e67edeac1224723318c7af680f6a9096a4ccc0d2a7063470576aebd38212a53c6e728aaa2a895474d19df7bee3de7a2f401757fa779a61d1a88e48adf1170b6de7bef8b27f8bd9717862f785ac22726475bd0dc4b6b97b2b516253563abaaead54078d990bdb449b6a0464a5bf9508ebab324854ef86077c9409859e1c4122c9d6b72245fe4a1841525e78c8f8ff2c9f808a37c941232495149a184315ef2d0962e07217c314a171f3b4639b17cb1ae4b5a2f9042277c707ee9b66207277a58c0022ba0d802bf3b76d9502ba0b0a1f00fee9061052b988212b6a083e1dd29bc74bc1c9c810a6bc08c99de113150f60202ed1851058cea519e62d5b82752a058967a37a6cea2768836ed786f542b7cf96114c29a52085643b690de0eeaa08437479b5a0a95b38b024da37277389826a208cb1a082aa4668662876898a6ae134258d40c43c00c5b364248411535e98e3e9130b5ee5d578dab945a4729106887c3ec0a2fb8c0ef96659513cba2d72965517a4a596e87e8efa2ce09bba440798e76145e353b8640b18d4664a540f968f494d115721a1415384bc45573dd1d43385129bb6a407dd95c97880a224c450fe53474bddab5d6e6840bc3abe60a2f444f24123108ca4910b16308cbb2dc8e5941a06aed68d38e1a195b42635d73525b7d5159cf053aa8a2e615ad1d39227d8233eb19eda83d4309958d565494723a19d173c5f5b50649f9e4b20c0799e2a15c8472da282ab28cc6d1d096922245bdc80a398de828368813a7115dc869ea2983d3a1889e224241b977a2cb44852497d22e05da6c8a147dfd5a0b82a36b9645b2aa8b5a57cd8f781b8691b86eddfa93d6415b39b91113035b1019af04ccccb409cda063d1cab26cc343ece851b1a97ce0a5431eca90102d888c16a31a45b53661a4d2d21454026096c5932d449689298a10bd8a2e110ea6ef44afaf6c4de90229af2f02e52294cb5b44caeb65620af994fb0107d37d2151443dca65a25ee6608c703014963713519fd94f45c368447f31b32716d39c9327d035f4b6203448ed0bde2a0df5baaef0c249ac2a4c299d5585db25a43dd18280ac2052be17924fbe50c39765599f97552d99021f9c5b901624880c38d0aba2e6d5d0b57387b67ae25e50c020a4efc56bc648219dd65503a1bc6ae021b528f50761493a4acad255cd48515252124af9eea3112d14b8cbbab3950fbb6a687c96597f360a6a788229bc20d0ae085c3613d3b89574f1b48a31ce19e5e3454978d0e17c8fe13867cd8f462d69613fc9035e7e4e675dbf2a6ad2c3538bd1cf499754d46ca0c682064aab3a5429e194925651ca294faf1f148410d253365ec2bb57d6fdbde63d5a1b861f059b75c54e10cc708b4d3e96646baeb5b777bdc7f04b9f483f90b07efd8a97cf35682b278f895a740fc2f9492b0a427819d9e5ac55c9a136ccaee82182dd5f6c21bdbccb86e101c75369590dc7ca87b2ae06695bf08a3a2e6b546d1e75d9c478d7557d51ab306a9bb8f1d09a73ef7a319da05ef15669a8edd45d3557f438819fc412dbc8c34f2adda58352dc2ef7674df0be5073545d3631de1bee11033f69e1264f3d47cb577d5165fc8b1282e669252588c5d7d1b9ebba3efb74bdbdba6a7eb430a4754942708bf112be495b82f241489fab675a5151caf76e6e58bef40962783a5bc607190b1b8ab8c7189d631663ce96a684cf394639caa228d7ccb966ce59ce8dfa44c2cdc5b7abe65073736154116e782039e7dedd1442e7a829db557faf1c1d41d8a636c2cdbdcb26468e76578f18d5ab579fad7ad593cade165e1e92188e79492a10f206cf207b7c1ec5c858649045f6dc7ba33ec1ee5b73a04dbb2be7f29b323e47511545c599df196ce86ca69e733ca34ab35f92a5d88f3df71eb30d3ff7d87b8c1900d4cfb10a8dd0f666a9096aaeb84d3492a06109eeeec01b94d02865636a8d783086e372d136dc7c16ace2252dc670503857b73efb74a356ef2c9c20b15e5596550f8f54e4dd59e8dd691d8de4291d5995b5547ae45401833070cea942470727e190e8e077f66e7e3a3a585e247a74303d904a897ba28333e3d1c1f4ae341bcd861be480654babc26a90423fb53daf58950dbda1b26077e6b0ca68c5361ea9bc571dfc2e1e39550cd1c149e44001890eb5e829bd3c7d3ce47d77922c4a2b2aaddb9255bd04ab97a8eaa556514a7f38fc5e8f6ad4a7918ddbd1c114890ea6f7877ba283dfad9a0dd76cb887dc505bc5a432516fa05215b6def083410f8222080492a00902812810055520ab0850ce00a66f59c04107d32cdec08357ac2f6af5f7f7aaaa5f555596e167550da3fb066af5189fbc6aaa3b6d56b172c394728f073cf5d9a7ea66aafaace86faa3b79902cc65e3d8f5865f39493da1f0ed39b99c0b4b219b6e7f80ace97a8529b2fc559d986e9a33f3eb2b8c0d6696e72523820c1d63d555986a9cb72e3f79c0c3950f6ca2e77591de9a0eff4b136aab55f7e889d106d72a78f35ccfe45edcb78f91acaf9fc4ab3d45e378439fa543d3bd3260786102d430f6f5468a8d9c237f2a0e3e11c78a80c338a552d88d6a1d2a2cf5675a8ec1518b5df72301c1576a7201a26d319268cc3bc5613ab0b1a6a2191ce009203080e57b55e7587ca9ea34f970ed604bff7d804bb7ae990b7d4235e5e0e1dba7cc4cb57b58a555d390bca393f60ad2d50ce0096f0f13ea68442e15aa7cd396fdb71403ef043cd6d496e3d5af4c91901f7db923e312bd640456bb89901f79ca517a19bef33c6f8d28bf3071318044120e7e08aab4375fa2c77bd363546d1a176e5728bf2fe5f66fa14ba10dfd1a719ef0fd1a73ed5f78ba880c9c9bcbc9d0fcf31b835e0649a9029803beadc9c378700479c36b9dbfaaddf84389956c4c1f48b74775b47de62a510c0674871ff84d266552e77b1ee5200408a00543aadaa270e0e0472eed4458aa2fa72d781400f2441d5adf70dae56275d75d505e0c7d5eaa2ab8e894d605c0c01f717d8159660052cb02f88610c76603d3a26c040dc08bb9b73983006049001012c805082320f2c78c0ac70051b5730c1c1e6966106104c6fe821055710d960c60f98153a26c0407a84fb660f6cf16240f9035010d5e03406dc36b4898ed905d7ae02651028915ee04803dc1007b8771a10894c2ee07e8eb671513cf7de7bcebde79c7baf5d0194718807370edc97e5b8267fd013b2dcabd3d6e6a97973736f02cfd0aff6f7ab5df3c7bc79570977e94ea0f9ea36ed8cd588cfe19af5694b3de841f3a1536781d8c5a3726209aeeefe7073adc4c4d4a9cbe3dd3c8f8303872e4ca27302ccae07301a1728dee9b01ab0baf3edb56bbdfcb05525119c7b4ee483fa5e93016df799424be2b384243e447857ec40d192f8f0a0d9243e32883146b704126649d060879e6f6849d0e0c39a0df61950f6d282e8bbc1089e6f4c5f0b22be05d1780038d238c325af645094cf8d5f531dd4d84ccc06b3c15a66a8b80bf7cd92d99867cc46eeb79b3e9c97460583da178963f9f6838591071cdf36f96287841211cf0399f8c702f0bc8dd5c0f445c6d3eebd40515fb08353d0e3762dc20c4e07c35810266c25db8231c1dd5fa24fcd9e30a18146443bfdd04c33d3c05ad0b081fb79009786111a685377c03dd3700e42e8200d1a349e7ca681db39e79ca3a16359a1eaf4633fd7fa654a2b6a76f773743fe7a3c23e9cab53501a833621ec41491961ce6b23900828f57170fd3a9b7dead27cb1e56735ada817e36c2ff67873d4271007727e6e70dd1e34c4d007a05f8e009965a1859f1e4d4553e1839c2eb488430ad6d0634488eb7d3560038c09712101c77b139f44bc2098811f13dcd90b64a27366bf1938cca490841ff4fbdddd3fb8bbbb55f0b3034a8784280deafb3c8d417d8f2e9eb19b78e88078670e6c8d8a8afab4418d27820655eec8f4ef1456d5b4ae46db6565d9527c939255d56665c91ed4e74b49ec78976f80bc37345ac7a9303d95570fc9be38c20db418827d71841b54615a958f0ad33b3fdf4da680c2d378655bba26bd2ed02368527a5df4ba3e2f0931ac01a541cdefd5bcbbde4445e34eed9c0d7a57a0080d8d010deafc9bf37a7e185eb62423ed39b3557a0d14af120f79eaf2d4ec39a9cf0b43d0753311d89ad4de506f2cef6c137b81910beee17e73adbb15101d9d418d118c19d52100be3ffbb039d75ad026391899022730815a80d158b704f48cc68a971602488e00eeec32a8f4143231670f1801761511438b2f8e70032dbe38c20d68e88b01a4978d61f103a62aca87cd44e0f92625944dc6185f0ff8485d948c41f53eaf9a3aa432cc68fa4d4a29e58c2d5f6af912255f7ab2b529a92df59dc442c70f58fec9ebe3b558d9400b5bc8c777f66251ef53a9f62914d89de5ee5d056639bd7bb40d6b81ad83b49004c76096851688e07631be6b897a03baf50c7abb5b0d04028140b79ea329eab2a99be5e79582e42e1b869ba868a6a0ee2afcb410044727989eda02d387b260061c5feaf10e3a7c7c02bbcfbbe71c4c5936376c65c18621b8f76543ad6a35abba6a1ebd6caeea1464514a79d0b33c74f170b76ea60edbba7b7bf57dd9c8c350e83ad0cd13b3bce2276df6807545e04ac80111bae08513b23042c3188ce8d6c56362ead1deb0dc9d5aa2d3cb6a970e961e2c777717d9dc67a96ee4ddfbbdca547e77f99de670efc69dde4c51f6063e043ce2af5314bb72d99b14c66a54972c8f978ff7d02dd0592c5bea017a75d0abd379bd953f4b7f03fa55835e3ee2a99be11f3d75f3cad59183472ff14039e828071d441dc552ea95a5bf6ca64e437d4580d1c4786551a410c25801de498796ba37f4b0be5e3ee233a431549ea35140ba138c1520d3e4702ad626078fa635ddd0335ced0dfdbc215bea410f3a3de8ce5c3ee2bda1b73520070a4d34202707bf1bba86c881c265e36089c76302970033eacf3681a91c4ca9f7550189983aa52c123f1680ad0389f887c48cd5085925f831035367b4093c1b9083ab0b02120642c2147cbc76e4c08cd1c8f0edb6472f10540ab32cd4a0056669d115f45d610818845916568002a67db7c0fd96d768de9865718538609897c0401c76eeb25133098e7a07f715aac0ddec89e4b5da146f16576882e11d75730ee44ce0dce80ea3d11d28290fbb49a4368d4e501b8fc7da80e35b6c0e07458a4823b29fa3bafb72af7ad29c3c71ceb91d9ce50e1a183d38e605ec6c5810a3bbd3301c287767003bc5bbe705602763033b016037033b1692643241d0bb37c351efeed8099e4973d2a606c60faaec27b799b41127e3747ab8995463dc5c577426e9e6592be9265375734c6e23b2aaaaaa7ab5f7d4da3713e7749c8c23d5cad34ce6ac554747c731d1714c741cbc1113732dcbad25dd3171320038e937996266707e332fcfb3beeb8c952abece980c7330319e49f8faf3713200b8ef887bb9200793a2e2789c0c84543543aaa120ab71a7ac0dc33f3f3f3f73a045b4a94f0453e25a109d30741a8a2245dc108e1ca962e70e3b56637a59557bd2a6e6f1a88b6d380e713251495472ed690e6a8e3f388241a44f393609d2a72c89e0227d724ac07d29248221756293767a6a68a67ebf34b035b01afddbd7a499fa5109e8a45a95e07e3ef4065506b96adc8d6004a9f2398281fbd57f9c4c1cc2581cf2c3e2909f087f9e8b75594f8bd6432b062ae0838263848f4a0734c0c401f980cf12ec8983cf00a01c02fc1ebc6c6c98b44b473b2b3153811295278408b9037eeffe6861504cad7cc6477d5a91b7ae9a15f7a385614119a7cf72968b6268f942d9f837c35a6d925fb1d6a2645cefd228aa3c7d44860ca970cbb00c3bead98e92d0f21b77476d92af6d9216f5415d49c2c31365c4e13d368928970ed88588850a2448e4a5839d612487111c52a23072876664c243197f9f6ee5d21165c8b8b9552e1ff031b258d565e30edfcdc178caa684b2c926656b000031fcaccb077cb74a4395f779efa74d3e2da12176f4bc2d9428e97e8c67323ab25c2c2cef2a082deb5a39b436acc6c1234e0652b2c134b0d3fb6bd226980666ea63e813913898663822843d0ff68c50ec6bf2c36a340b8e60248711c9df6511890fab51a4e6a8242a895b849ec8aa6c55872a5f8471b16449c337dc90aa344c261805c3c19af8f840e75e14343045b1aabf28a01998c8e7c6444629efeb29bd9e1e6ee8316e4f7b6a6836fa2cf635b18f0dccd47f4756aecacda4947704a35cd1cdb3be343c9f6704f78dbc28525490700467b983e7e353ab4f0f967b3e55a9ad67730c9c9f8f9306c6f3793ecf47b6f6e083f0f94823b685e8623a8683c178684bf13929258477cf39e92094ad5d7a4aafb4343075d69beefd689c73523ae7fad43646da2837845aa50968137d31c2f85e6c0968535fb7ae3baf5bafa15b2f02f40b74798b08dd0a5d9383e947db9a75d0658264cdb7bedac5444a734e73f41dad9d6953d5458dcf3310be0723a43de01f151f63499a7a38c79b83de99ca8bca709e899969b1b547dfa34e4d095f55d1aa02b5245108f7001095540d820265afa5a007e716dc4fb2f7e4e8a4e71a0a81aeea6c588d7ebb5a724b6e710dd39667bd47490c876c69e1a13ddf409b0b6a374c67a144096649bc0882fb329865818522b59de59a0086c3e17c03f72b4908f4b536f59b16cbefbd18218c32c625978e18319e1b1a93efbdf725dfae9a47e1941052734238a184b0a5258fdc078d6e113d8f64509c4b41793198c6cb196af5fc62222246498c8492aa71a797059d08273367958da74df0b186ec07e6a343e8b61d07d34298d04ccd180c7dad886c45dca5036b4b60353af9d8c5c5ca780f3693b04adc19f2424309886f649c5ec669581927007c426a17c6e68661ce2c93ecb1d07324f2aa6c8e358aa8ddf5706607f0149b49d884c4ab71a73480cb6a2b0dc03e18cbb0a909c0529eca9e2311ca531d001ecfe489110269ab1868538cb1b5d65a7b2cfa482caf848bcb5deedeacfb6d6ef8679669217f1c4cffc60ddca085dba8b5e07633bbfd652514561269983e8b9554b01a53a7a50eee9f906d18e5e547eadce74844c7362c322d09519e3a8df4a9cd223b376ce471301d95cc21720704923bb2a7ba258db0141bab68530403e7871df562737c82fb3e58249e8c02f72dd9735d66d8cb6abb7098126b1fae883414f1482482fbb70c47214f9c0c10bff13ee431b253a4e708131e8864891288c4f92821b1f597a204c437294f395539cb2bca45af1fb54cdca9f5b34f28aff554645d8c47cc6078d173f49580f846d2e853e8ec46c8d2886936740d60c62e1088d94df2be4d6e06bbfbde0edc9660948b506a9b2aca9d6daa07d9d7a6facb5a6daa8f3b4e66d430f5adf276d5d47a539ec3e5e8142be32a36471e19d4cab840d8f6c4c1f45dac90ee8143603862bce58378ff2d713238de7f3f5088939929f5f0517e46de7b664b6014e7793c37d4abd3917ddf3183476f3ddc1eba8718b6396135fa41e0b00d0176c636250e6609a92ff3d38c4f65db9d73cfe1183bbdb3ec54f5b81395f469f4144905c3b1d3a72aa491c8e36410f07e5ce264640ec487cc21b2c7c1f4fb29eedc883b8fe769d1a78c33e35e4f9f1c4432c465d8a7c81a247b1c1798e52c2b57f6a028d92222c0ca58e6606eb446811e0fee5f7127ee64d604e7b8831b88c4ed54bbbda4c51de85c6bad359b6398730f76fb3469537381aba88d094602371e5436790cd015c0c39f10e7dc8470c89f75f2cd482349933d1df52a48af1a774a415673aec6b9a657cd357946240bc2761a6d8218bebc60e79c73242ce1e143496a9ec1f05e51f39396e59c73b33d61c5780333907865bc19c81258beea3da47a3d64be7e413fd16c3821fd02dc43a6b33de487c4734e371bd55b28a1371fd3167abdbaf90557a750ce39638c31c6f79e8455f5b7a90282e57befbdf7dc7c8c2d95142dca2a31032791e32e90c6c39d8ad7b96e13c7c2efceb9f65c775bcfb9571dc618638cafab8cf382dd2b3adb44fb340399614a30750a63bfd373dd48b407a4add1bb83907a9ba83a04ab419d3a7729f7288b51ee598f72cf51a770282a64b9db9e98d10171ce35eaeffda377a3e02c46db1b8daca8d9c2ee2368c1d782dd3b471c9604bb100fa82f673d0aab48496bf4ac36b5f5eec8ba8d635aa3fa70079ecbd1401e7e4c32fccbc114c2f82763e4019f1610c3439873f0fb9c33263f1ef1491a584a99719812fc07e11f74b6c4c32101e4e11cd3c399c16149700ea6ed1e8cd2624be00938993c22945354ad76b689b22e62180cdc0e07dccf0408e203cc463fc360f6f83c1a9d3db71ce717ec42b3a873d6981932e6ad96c5e68aadb3e487592666e1a92a2896f2d41591354778ce97281a7892e6adcb669cc58e5eb2312cc9e6184cdd149b7166de68c6adb74c29bab9615165627e004f200ee5f5391ac512d1a67a1a857a45a7304bb147b027f886fafbb4140bcb59cbe4193c27e3c9263c7d1c4c9fe69c785a788ef0249d4acf2d78deccd298b01add421aa6db13d7727df0e8aad88663309e233b56d4ea8d49a636c4c1b4112ab20da758ca53731f615aecdc251c4cf791f624146a50a89969f1a6f44e0b206daa4eb0a5a67c0f483c25158e6449d223a4822bbac0f1e1218ad0403ece1133736d13d28ae0f64aa2c170b8bc7f8f98c13733fe6229cb366bc6299be7c599c1f3339a8e6567dc25645817eb8365b48a3a9fc3b1582524ce393af8863afdb44d07cf57d4cd34b3d394186738502e7ae9fda6c5124e4600ed8893f1e16d1d3973320130dde79f275c1ff589e5fdc9f2218e74b7bc9be0f91073126ab9b3d426d23c8b656d5ab1f32a4be653502c18785e0096750000f0e2c30c9ebf96354ca61ee54336bfccb4604a98582012c357360391f8aa918d3dc170e2d8ee6cf3e159c1020d32056c773ab54ded2d040b1a7081fb2dc86d3a4d48ebe8087918be3ba24ca899c4449f620bb2400536e03e690935371d1ed4dc749c8e1020638cc5c862643132169d7b2d3e5bf3b5116dea409bfab96d61862dda12266018e1dcc2684ef093d113dc275d07b763adb5d61abb732ddd9460551d3640a0692ea7810e1861bd297132f50df4e6e36442a226d352d060d4c00bcc8ed31b60413422cd469f957adc9b1d245a176135fad008b5bdc9e0fe122d884645b3d1af958adc458ab816841382fb54838173a342645b0a588697df0bd4836e13f5421e4d10d09d9834a15fb6d1b4ab884753af132808d180de34b989906dac00a01780de0a4c3d0a4f6051685dc4cdccc4c4984c3f2b42312b72a080abe7879915d629a7e3823418ac46bf7b9aa65d43cc1f2c0ccca633b589b63584b297760fc6f75a73ce39e7daa57ca3d869f4299ee453992c21f5d425337326bf2c11c3642ae0607ac6896c7b45a6913e5d4560a61e429b5a8433c2efd2489b8abcdb0ca14f2d8a6e4560a726053359e65e7ed7af85447a2db26da761fa4d0a8683bedf80c070583f6038400c47e87d78d55ca30a491002599607c4334893825db6ed54d140f463a3a21fafd9567e6c5ed6a61a6a4269044e79d5c848e388d14d4bccf9643e994f726078eabe022452ad0ede6853cccccb338cc13f066ad014287ba981f11445ab18ab2a5655acaa182beaee35266da2288aa2a87f7ee0405a2604d913260dd3efab66be9d9a81521445bd29a142a7eec3694f68e4a28a418dcf8d0b268e899301ddea5757b71c137a7b9e1008389ad075489090c3c5c970df47bd5d3dde9028086157b4ee11ed09cecd097bd2a44ddda8a8ed4a241b68a3612fb987e07e55a4e62604f7e0ded9aa4d080feeb7271a912b54f704b32b245b4d489b8e5073070922a465ae33f340e409274ee3fe5e03d140f471b74e82aa018a20b5e11ccd2c8fc6ae0808dcc033f65ee24f6df0cd269183d91790ef9a801b8b191cc1dd3b5a9ec92a38331832131b6a7e736730ed96dadb8f25dae35071bf2a0327b83f6a9962b2971c738231c659476d6aca0281a4927bc3ee6dde92bbd80aa3de54490e0c9405a04e8c850c82602c620006ee763130a1698d0425ccb0e041cf0b41c86c6edd586befbdd77f6fa566b29bc1d618ebf6fadd7a505517755a3b5b0d9b772701f07ced3d47575dd4e7a21222548c30bb420956b8020936c062054e42cebde7ce4aae5f4f19595be7c3bd3bca75b3c698e302930b8731e1517121085dd8028df1a240a8ecd449d6ddedc3e607dc7dd6cd1873dd2e3af75863d8c1f7f0d57f570ff70bbfb7cb01b32f1e3edc5fdf431805380c7910c60863842cc6e89c6b9fafd968dd458072061a363c83af21a4a68c8cd986dbbd183b4658821142f79ed2750f57af8ed9a7be7d6fffb9fb5a25032a9acfaed94b869b498898243b4c378298ef47a005415b7d15f54c269335750c003b1dd4570168a76dcc0633c19b9c8c6430f00d0f431852f345b4a9a98b8136f5bc481c4e4739eab6e9dc6b77884a8836751115c0c033d130cd39e79c7386b040af20b2248b2ab0c1bdd96807684cc0f9312ba65024491e76b8a03c5c1879c891e2883280000c1e8db3124de8ee6eadb5eed6dd0600e59c235412a605167067f1839bc1210db8bfa802f7c9b08331dce18b328cc1e4189c59cf02fe869934c47461fa4216baa83906679c1b99f56408e129ad4ea1cdf149e46048a955556d6a43b3312fe1a3951152d0c6f7d326f8697fc8abd2565440ad6b04b628f86b1ebe54bda23e6f04890852d5ce0869005c08421748ae0b455e91578347e40d79438abc22eed76acb0e9b38e79c73ae4e1ef494dd15d436b32555e8e6191c7ac1540b6e19969ed75d154b79aa451262479f52ee3e449f46770f376864fb2253f7cd21108984338333d3ddf12d5ecef7d8a85f1ea87b058d547f3f5ed43c754c3cdf985551211b83f3643c2eb31ea6a4ba8cc9c4b7dee8298aa2288ac22dcf38376e6e17bd75d9a0bc87b7f4899dc5f86b12e3a49f3ec5383dbd6ae8c8b63cda395aa9a893ced8a9f496d6ad2e650367e6232dcbb280b4b43791892c4bce782512552ea7d7e5e67e3fb8bad90613d317586e7e16566e264d6164845e4ae9ad6e651a83abdf1bf9689d368b56a7665c208de5ad9b1fae6e29be7d2e79570882feda2c6be5f3f9fd58b4d5ffceb82eb7744997e5d24f96954b512db6ba6caa9553d42b751075483d44fda258ee5b99131a9151ca1c265e930706ce53245f93e7644ad1fb796d98ef2706c6c610cdeaad7ac6b9f12e9016b58605263d5fe0c9c2ce1490302b7085005c192900ae9e6370453f2bcae696e395328ae6a5b1e52956068a0d9ce7719e160a6b46ba924acf37cd78b6315b6ec48c9b6d985ebaf92452e8fa58970a51a1aaa26ea9f425ce860d9cdb92934875528f383770f58c730387ee427a7ea4b75878d954bf09b5fc4d27d3588c0c4c8c35b91877228abacbcd31b85b5a4db3202e455c1281f5dad0828847792e00a667d900f406a537e3dc6037d643a7ae87f5d0499675ca3e5c0a1d64b13ed1194c1380290ba5f4515a2917f4a4c770a09cbe000c87e8f4ecb5a1d9e8d3f7fb89f1cde61c4cd92df570af6ee35e3d878910e9e69783a905d238745f1b9a8d18e3cdf670d925b589bd02b0317df52e82a9fb842c4ae999c46d8993a94be692b604c54691a520a6234bc52251d5b4f1949d57c2e1bc04b6521e9f72d5ccc6297f78641f6e96f2a05887a7edc69332b1d4b25c3a4215899aa8ca7a5bb974b4531fd9235ef0cd3c7dc81ef142dd4cfa7cc1f494d11816bb6c7c50807d3b630910721adb34448128d129944bcd90bdb905d378f308d3399a6f765e0be7058feec8b6232d0a235f34231465564f56a31f9a1415290f7b63e27c66c3d037a94df43434df43bfe845b16e0ecbdaa43284a85ef6f0b4f30cd5fd399adeeb0259d6cd405e2b43bd7c504c852e9b7af8fade98f8f4e99d1e74d5508aa2d42d4add8af626f42630655943c224c5aa9ea32915a232459f7269c89ad57ce8940342d505724ba15b970ea04e6fe6419dfaa04ead789a479756e8b2a94e419535ba2956655929577573b32cda456668524ae9cd0fd35c710e134d50552e01a6af2ed59ce02c0fa46fe29bc0947a98ca5b6f4c5a10d4ad9b5b931f0ee796296b3ebffb60f9ebd56f75f375abe7772bfaf84a349d0c005e55a796a57a5a4a1f8a976a4c9a0d79147b05c0fa7000d897e770b552b721a13403698a52d4b44e455a86f94cabcf53aaa2a8f7d5a3ba454fd90ce495e24397f492b23e4397b22e7ffdc53217ba19c803352ab0bc75d950bfb16e6e970f0b53d4cd49e460faeb7a75d55c15c4d1462c02cb5d3daacf87abcbaa3ab58f07cd15d35b8d8a3eb532b4201aa6f4d007379feaf2115e35d4baa51204ec5f4e817b1ffe725370efc37330b5b9628a3f80294ce92b9b83290be4e1795b199a0d78d9991d32a37578a1c56047c9085b158da751815b13fc432f28e714c1ecd2611d04fa358329cb8aca280545143a2940c64b31ede618a5d2670899566db125cbda74cb7a460c6e3d5cc69d388d8b8c182119d6c5b2062286b52cb667948222aa1102fd81980f0ef369b6cdf93035637ae848073a9f94ae8f98c16cb6cf99ce33985af99d2a10ac2c4bad938f878f77f66de2e550ed5a40599fe4e78badb5d65acd6c47301f7cd3ee6e76d609390d35c29351b76f9ed886e1d6d1b81ff3c17ddb40196bac7b6609f3c1ee5b2ce969ddba0841a668bf71f692270fee331b77e2d9b37b73770920ece7f12cb1c407641a4de4b1376c6ded4bbc97218e374626d4dc3f3dfcbc2a5e0c581073087b44fa24e3ddf2a6d1a7973709c9a3e2ed3c237d22c0fbcea74ff67dd7c4fdf4e9ef3b277d1ac0fbee8903a34f300fd2a700bcff84f44900efbf27fa647aff0d613862bca70c6680fb348b1ae7ac95c88e93219431c69c638d892be50f8725bbe2590f91b98172e71a152ba31ba1638c87d530d147ef275e201a9db217341b4db21a18c533e2a0e8220dbbfb440b8261777b489b9873cd544471277481381c3af5ebca401c16dd852ecf72adc80775e5027998d5cb37959b2919ff30bb3795bda1342410b7d0bd8167976f170f88d9ed1788646c6c0876ce8e4e2b0b047a8e6e47907076f90d3b65afa7ce7ab63e5bfd64657e2abf62ad53961dc58a7ec3ca9c5d50e56201e259ec2c567420ac8c75e1ed759165b98c05c246e5a1932ecb806012c5badfb0a78aa26243a1cbc387208b7507c29ebe2255ec33b19f6c6d18c6ea576c3d6321fb50ec0d5b1be69dd9fa07c451ae87acca997da3339a8243ead1fb052d08867b08ced1344201f7b1a80111dc1a08b743c17e6215b87f4629abd5eadebfb77286f2aa22faf51175107b3c6396bd59c7d8a9c81377fab18a8e49701b8165ab58de520392c8c1ef82600666b714facd3b7be88a8ed477dbe3a5bc0f2ef4a6c40c0cdfce6ec691f296de6d400e86b7047ff32effeedd4336cb21447f87d78e2bf241c52c6417c12bf2418d1787243abb37a2bf7b439d1d8784d9c52161d17537e39030753ababb7ab0f0a06ecad9cdd7689482f28af28a522bb335dec97ae650ea53ea599437a754b652efca5356ceec0a6b8fa6a4b0a7dcbd07c6d8b1a8a51e78f47655dedecdfb1d9d5d3e587e2fcbeffd231981e308e54675f5acefcae343a14b491fbe62330e098f4e1d8e7ab0fcde9bdf47d7e697bb01398ef6ad9736f4267fd31e2fdb6fa6fec3abbd79b7441fed60b8147fe34447aacadb55b9bc2a58746f9e8acdd4c521e177efe973b81e6cc58ce11fac0f361b81e9abab260587849568925aa31a6f17cb6b58e9c4c5661276b965e513eb1d1994cf45fe24a91349963fb89dc42dda34a990375fb61d7a45cd7388dcb148d8b239780e7173ca9e21b26788ecf9914ee4933e351c0a7db6cc0c85fefa141f0a5d56d96b1846c1b97a0c800b41e002cec1cd4767c61d26d3e766d212dc978eb5da6ec631e1c8f3de6953bfdd7945cdb2670e6942c4a74f0c339a49c2338644c22f48685897394f83c673348dcfbbd81a77f9ebd301eef2d9a77b975b7d22dde5b54f2977f9a84f05b8cb497d8ab9cb5bfa64a3fe506badb55aa3fbe0c3476f76f4149b1b4e79b57906d75b36efc0d6d914915afef21c89e0bce0945f941529ad372711e71c8a44b9bc6a288e85457f588a2a2a72d1a71551f4894dfa047aaba8a8b4802e1b23b2a697b7e987a75886adfac37d20fd87c3abe6a6bc60d253ae1e2d3b6ff002931e4e21ddda2697bf36b9dc00d66a93cb0b60476d72798c25b5c9e5366c4b9b5cfe839d3535a60da8dfa8b44cf7a4492d199a1100000010005314402020100a078582b16840aaa9ba883d14000f9ea0506a4a96a8610e530a19648c21000200000020009120690040398da8027e9ab6d25b93c4e5c2b4e13377065ca055b0963ccba58fff1eab12ba2fd4006d8da8739c6df029fddf7aa43968568e73bef063a273046e6f3bef258815f8e5c0d171a4314b59d1a16b256f274e7f5af38619419c94c484ab2e23b5ed4262f7b0e176b283fb682be23d9959689e54c7db20c9d69a33f9d8a6e8607da24cc08a3694b71fb4c59fd800f94df5cbb471fc6f52b2341fa4bc65b410a1beaa880a79bcc743767ee40a5e57d0e24279944731eb6d9349329fcd8d485cfaa2163efa375ada021585d19352fe0da405d42f7e12ec7b6915a573413c5227ffef1ac09c57a1d5427cda35492b0e6ced8b2508b51e020d8c7edadf34e8744844dddcc223104462619d30e22a01d614ce2df99aa0497d9d7327954ceb00589a949626ef1897262c0dbd1afd6be2066a2efc55ff51ebf131d55c40e07a5a5098b49b328c8b073a5d820325379ec69e29963eef759a0746a512fc58dbd4730387c329fccdf83fa5eb27c8affbbe8dceb666de1e38f19eb52bc4b3584e987b73de5539404d32a2d60d342b4b34ab1116f2d4acb17449d66a29e60ccee9cc953ab3fb4f35f6845a777a257731ec0d35c57b32bd17bd44c291d73daca351b4c27113ab3d33b2448b98a38c9b171d96e42c4c1096de735d6f6c92592fa204a80dee25390c1f54f7e462698e9ea9a7c05e19560d813014c837c1a2e4de3e1abab3a56fd18bcadc6249c12687397bf60ba56dd58ed9d72a2bcce5d0847e3f372d3f6f39b197642c3b580531738d5a4aa3c17622ab2a605dc62b25c3a54b008721a44b2d30bb1221f234d0c3b8f64d3c991a31541c99810d1e7bc5e0da5252b9225223d639aab862d98e265adc403aec9641872f6395658efde5ce013253200753eeb536ab8cab81c465442482c9c93c7ffd027a10bd4c69569dd56fec86cca4cdb07e93d14c3f6eee4177fc40eda55090ae20084b4330b28aa0691d0187d7f313762acbdc5d524c7b57d7f68f66671b7c5c5d524b05c23b77dd5efc75853c54249bdd9dc72fea005ca1b8f64a9d969079d7d4e8d78e0ec0b1fb7e8ac90400064725f65346ff87ced283884db05ca6b4a5d5315a48edd6365bd4cd1a30f37a059c43ed4c52c630c11fe0bde2bfef001c025bd74ec31d4ee131f837632a9eed527a2f783012d495e3f1f0d155bfa7fe1c8dc482ac65ddd0c22388dd3c6457f5d446b3e7cdd122e387cb2094a7f743719d897c990f3954cc71c18f2c96884b2b18e511d6d57fa2b67a2e6bed27d57d3d0d798c8381f86d91d8dc99d9baa6dda1b67a5cc08ee67c6c5c1369f53f42234df3c7136bc7fe90394019228d2da1399cf48e01295269d1bf054f6409332c023b8636863d52367b6a05aa5c0bc574beb05ad877ec41a208135dadac39928bacec167e46622a43026d318266e995e08875a9d52cc5ec288e4e85de996fb705fa82091c7ba667c54ae175f531cebfcde9a3ce431a44b66909e3c55b3d1314b5acf8ed2d03dd33ecc577db4e3301ab3ef416b387775b568ec8fc0a141db7665d3b1133209650658c31ffe4627435f4924a8dfd709c1e2142c410581f44885a74e33a110c4d9818948693017a04027f5402927c0e0aa333f270c183564f44fb90a3953da53dd6b4ce520c917c8e0a3b7ef6d581da464ed38c13e4a0d0b3d34b243ab7135b7147dc587a278574de42fbd9f5987063cd90a8f09486ff3224bf4c82c6f78bfa8f2773f5d016dbd9e50e4635067ae2ed38c7931822f18c11ed4c71ea6afca6476e8a84ed80158038b65ccb19ad617276aed19183631f48c08f62b8e510d378ec4881c474697e8b4631bfe592e504dc47e5d0e1218bc795159a4fac063849ac028c6cdfbbd185c8a534a61abcee5cc3c39acc1a3d9d5d0fab25916a3106884403a5444de54e3701635ee9839df12328ab765baba43743d02bf4fc37607ffd3d409a158071dfde5e610cf4c39ceaf965bc4bd179a2657104d765f10017f987f66c14ebe4f846e7fcffa6bae18e8a9187e701d968ce1324938b206718672ab93bdac95899c5bcc579f2ee625fc4db63bd2fad71dcc81ed8e0ce14ca4084dc201a2ec47cf677128c6d9d325d5d0d4a1fe24bfacc41413a537f15dfece54d25f36e29dc12b29a51845fc804b62e419635f60b68cafb85a4131ba92d048c6085bbd32ec9dbd9585b058a4190ab9432d40af558845ff061e1fa944ff0f277572ff56e94c165e8071a010c153e31a38690892b38a6a8767b43f89bd562b78e47b6d480e454844aa84d3bdb895699c18bd6fb19f31b47a48339d1696d5f1a8b6be502e7de3b103b834bc800df5c2803a506615f3ad4b1fd73625432fb8f77682bf54288c0ee7eb7ca8244a179d57ed7bf630a3ea1ca08c76244944340b15d2ca8536576a17f78e292ec6463ab32dd581deb7b9c271d921102b8eaa3ca49b0407e403a7810a59101edee2c9865bbcc46a501e0a5424d2d3f1003970bfb957207ce3e3348dc186057effa498bd71ebb5ac3d3f6bd80d10eb9240f3cd7c452c4aaff2a79d282ef4c75508a533fa868a014f619bb496c3676cdb2f1449705b3cfeb6999aecc9645575ec4213b5a1287d933c910fded31fe3e244335237fa770ca17bbee11549e12c8aabb6433ad0a349c32278da2cd83f5fc0b6792a9d111ff38af76942f69db64e1b66d25829354879a5a175121c9d5133ff78a7f62af24d25fb5c478a33decdb45d38c71b19f079d915d4deebda6215e2ab9a26915a6b720e4830c7430ef63182050f61e1e3fd85a085136b01ec9291c604c9f57fcf23bbd9a1e1fd7b48e08a0521e3be37c4b2ec1b8ce90397e8db0968c29a4fbf6d3e07d958b50aa7be6599bb392f617353a4e2a3c388fd0997cc205db5ded23c71b72ee322db385e0eba25b75078a77a13df314baac7c975f8aeea5fdd0f5ffe7fcda4bf1ad8543157531efb69530d69e73f729bc82d139a6fa9652e7fde0015f3ac549b450f86b252addf8a3665ead975248ad7cd8dd7a227aeb6f5b056c57be5f1215a2a83903d1cf722a4eed5aac39adb638971190a9e9da3e59857804aadf387140502c991158ba640bb40edfb9181b183dbd9d57a7a763764c2adfb25209859375be7cb813ab8514d390ad476820fde81123f412dd9355f80ceef4889a493c7a2d358d68220124410c32c6214775566f591d088ed316af1b002c2233302b56fbab96a3b3143c29db91d73d86cf0c05d64a7a0026cee621d32e37eb8d82723aa0fc07631bffbef8188bd1972818263a8868f335024882ddb716f752a9058b22c2d57b3ccfbe03304324b7f128fe07be99422422db4bc36e90ad33f6c23e2b686562a1493394fe083230c2d3dcf51cefca474635318a4b002b650800cfadc590cc0b08831661e2cbf9f5a14f392cb6515aaf9973de27c3e791f8bd56284a3945b88dc9d3ecd401a9fb49479ccf53d93bbe854fd4aa206a3232440b799addabc98c62d0a57c2bf14d31827db8a75ed4aa4c85c50dd4acb9b6f32d96dcd62966353547f3c4d1066dda535635427d7f81347d47185e8a029034e5d9d9c07fcc6b3663a0397aacd61b6cc9f4a6ec540a51e1cc3522b53c09cc5c82bb2530465a1200706ab9f7a71cbb6482b45ceb47402862456fcd868e3d533469629ee27f56612e119f8bc93d0cd9a81b467d288c014d191bac37273228f721001a10a6eb4793ea6d23603974f6276e11d3affbc6d72d62c901575dc92841b775cde42bbce0fc847a6ee2483350f19c3440178f0ddaaf34e5722d4ee0fbe06151e64bfc470c2a93f79d25a0086388331970ecf81ce13a57e460be681ab3218c8cd2f6d81a09834e4dea100336de9c5c598966d96005840539ea642ea5188cdbd8ec4cc476ec9b51484d51e5625e2d3fa8d981f24cff86266231c8f451ae724ca007ff19dac8f48e6c009b340294f7954bd2f6fce0cfd1ef87a80ba7a4ea6c636aef732a5d17556576a0ea23db77f6af40ff45a1e03ff4187e6c3575df52e236046f13151f88069aa9a7c9300f6762f4c96af34aff404edb0a7e88c9e841550aa43ff954d6d2690da8e2e90b537142de8210a0f95963c3e543e6cbea5aa815858879569713cb13bf7e103ad74825bb00d0622354d57113ffc4f37a3888d9eabf4cf72a6ae724cfee7304bdb63fa4773a56df3b9a38f5623ea5b352a8374cdb8475b0aa40528acc13f02cc5a90b0c971ae0c9a9f42d525204e3784439dfb3f3acfdde58139ffb78313f60b4e3ebbe3374cf4f97f00b098a0b9b0c3a9555c59c772e4051e50595aeec19fd9da2b0ccce2e925ca452b021618053f50d6ee58bc802e6ebc0951ebeb410063cc8b91e7d36d051d6dfff6e0920b235aa41fbb1b7406b55154e4f988e82139f1715afc7c9c0494b0199b3fc25d4674a6da4de600eeafc1d054ab7ed8cb5f7a8b23ec0641d354f29cea5f35eeda55994282b041ef6e3451b0bf7b1b312bf26f2fc44aa5c020c11f797411f339cc75b2c81813465bced9c4ab4ad6c5425c9351bd036a508ffbf9c5b6518d49f5ab9af2406b51b8e4162b148a7afa4fb22327a08d98058023e4eb58614e15a8acc17530f10d7286a3681adc9f28fe1c21cb3a9da024f2e56cddfa5cde6e79d97a66bcf23e1416053c856e93efff8a8f55fc78553c3ad685391495baddfe7685997c36c5d0b2faa8aeefaeda3dd3bb4071dbdb19e4944c0dd1acaa79b1d49ee0b2f8d4339f64507c995a39b67bb021fb7765fe65db2ac851cc274217947077ccf26dfa663e13ac3564f87e7cb0919d10be131b1157ad1fb41f50eb533ff2593a2020e62e7ecee774600d3cebc9533578519295741af8b7dae6196aca88abbd43a19684f6b66a227af7a090b0396ec92ebb226c2ffe7b62197ef16c19eb20d31b942eb3088a924305b56e746b82f2cf200feafe1c0a3767a55c6b2e5aac8e21734926c42503a2be45e478c394a75c64808b5656fe71f221ddceaa74d886e73b1ad62d0ad00dbe4180ca1a66cbf72b72330cf1518810b4756fc0fbd2c79315693839f3ef16eaaaaa8635826ec3e70df3ccd9cade14a1b6c6c7075322784f9a6cb07bc8ce0fefa9da16b5ce4b3035ba4803452809ebab38fac932ee7364617ff32143b7510160c22cb23407fa1b4644455971f4c7b486a8fdb81ed19b6af71aa1b7645759e4ff6cb508acf8ce52809b768b1ad2697e504d31afe57592e5a82433219ebdd4882450f978f207665c40f2dc9bc66317b0780466014bd658de3b52ccac5bb0c425b56bf931b962a4516e63dedfaefe54282f35333464b4120f6537fcb78734d2b9b922450dc6efbe82d691849c76c03f62775f256db7284cc622a04c618914f7fb68ac5fe5ccfb5555248cfd4c4947f083b56eefe041fae58e569813303d52fa45be92e9e89b108f3334a531dd984659c81b57c85de55f3706bfccc8ccfc8165d29cf52df4a3d8891dffa2ba37401f1613f23a02453d62aaa33ac0f9b3545ad1c4641c571df4cd228f8d395f07cc994c54f57de916cc31b11d955ab5d759f366395546f3416056d25775f0e585a0da9ac4fd46bf24321b06d2d470e20b2f207683454900443594aba49260471e3b4c7611d661737c63d30835ea0c9b135026a97f5dd16383204ee65379ce83626588b2dbb8f3f81bdf3587886ff496cb399d075a3c25d3a26e6f4bd2bf14717915e241a2f6cd7f5250b634a75d06733649676a5caba47bd216ec1fd629c1573439b284aa17f9a7da36992b1a5da60659d674c899bf020c595e8e0b5d546f466fb33cd1ad583b2de9f7dfd8261738793207b09581a10c5001a46b1c7a7a4cff0e474b1dc9005aa895ac1f8ec983b7632076ab693c0b29444dddf7631150064b4a25a6ff19faa7bd242c4c71d2fc3ea693dd90533840ebc39338a1fb791747a9862156de571735055b0e53c454fe29878578f035f6f11d86dd471d445eac90663f2c6af448829ae5856efa93a17fd35c0c0a6a23c0dad9b210e1633c944babd34bef44dba70dab3c930c377442931b26ee10352ffc09d80a7ed1aeb160bc3d9927c7dc157d696d1356727bd4b0dcfb54698d3a1e6be41401d5e3e2afb9612ab679dade095dd00d96fac1a345d5d252850996bea26623be2a71662e62cefd5afce779f8e620998857ad9cd5b2a3250d8029d9dc2be2f97c3dd646a7a758fe4d16a1a482ff8cd3e9554b537f8a4c0561ade77d7e0c4f16ef315d6a1162b9fc7a72178066169df2e27a9e445cc1fe63bdb2fa00869c4445f2e26758ced27a1c2b107012a913791dca99db33a053c6c5b796d2982efdd21ff48926c7bc076e460972a66b4fb3fa04d8889ef7254808c054927b9b01df3394dba06de6d06683e1d8f4178d6a4e6e84ce4544f36d94a31f606fc3e447f4063095661f3a0ae04550e5272e5ea99977bb48b2ab501334206808582226b2a6a1867cd267ea21256cc7ba3fb2715ad66fe1cc507f320a605458c3a7d77a2e58a99bfc3331d9595a43ea2bd82ffe924fcd6a19038873fb5752efa3a8414dd7967c7163f4131568ea417e30d7bd7921d658f6b242c53a94556f248c90ecd78e2b496cb8926ec06abe1a76c5b83a0441f9a7db75313369ddddec0807d8359f39aa624a843f22e98612b9ea26f186f00cbe8f9cfc7bdcb33f708740b7bd0c31002851db00b117407c60974a607416e72dc5bf85d65ebbf5df451e202f115ae0c1ad63644e684593471fe5c8075902576f770c9c341481e5bb84041522bd444a1ca8bf0a76a97bc149b2a2b87f8cea6d43929900c5c9f8a9f2587b1b80cbca9a3ac7cf9cb6e664b70d8562fa32aff48d712c428d352c4edcc1aa6e290e10ad751ebaa0aa32a77a66bfefd3d05f8adcf8f2ca0e86834b171b7c0c985c88a32a7a801d5fae166e41248a008a32a27ad46c7c1d2148622764376b6e9a2d465bb25fb5b94c178df3ad16a0e1228121b6c1ff6caf2a2c081bc738b46ede4e83b6661d4e82e96342c95363b32b7a02c46b85b4651913a16d85be1c9520f1f59799a73d5c9e044518f4ee5b6342828d72eb1aa83d0120d7cd1ab420eb2a58691b8cea9a249c65cf930c69d3c01a0ccc7b4454bf8fb901696e7fe4c4a2c1e7070974603340446b3690ad1fb39f62fcb12f09f4c9fc34c59fbc6e888664f301e844f9868fd048d18dce7a6de6156744928347f8d4a9d9e589462738e322fe312d055873d5040e5c10007035488fc380932c72746c5acbc596045cb7d38bbf2a60c121b64496a63b62b90bc269a6b717057bea478880dd1b98c7f1596ea1dccc0806b9b210af08005ddb48d979c4905c4f3a55d3f85612bf5eb159246e68172d7398d72c37badf6350c3d04f62d01dba8cde2bbf8c2d33f262a165f8686a200cb70ebe13ea3d9a9810be35c05422632d91285810da7f46826d3e5fa82597138cfe16e9328cf30527f78615161e590328481b1e5ff7a87a1d4aec250bf3fbae846f4a9fd4f5e6ef92c2c40db4145cced427894526c0a28da8a5914920d73d4bc4c9d7603b73922a0ea5fab0f7d488d16971143ae19d7267883990928a6b075afff17b7847ef2163498f018614f3bd35fda7428771beee0c4064a306f0653f70d86939f93289bab71579819e7500edba5422dcda15c97dbd163e2ad16d51cbce958914c21a1164eb9095de2cb3193391a46c8581726095decb2200b359c4314441062ed2170eab601d6faa8977d6385f6cf36fd605356a01aafdbff5d0528d8a202f7fb9115a8d84c44c4ce29a226fd8486c91be0ea97e1b9b354202bef11700bb1974bb12e6e2d900dfd2251c7d78cc454641efa3ac8473d940b2de6a64ba8ea28d58b175e1b3b77520b97ce1f8c83ec17bcfb58ffab462964d41ca786ad5c5b8c5629624fb9ca662781fa562d54f0d631920395621fc800245b9bdb06276adba5441baeee9d7f6bc925fa5e5ccb49df1d2317e02bc3056d19782385d3d8635ca428297064d1121d71e73d355dcc9f70c725ef7ecb903d07d0685baaa9a955f2c2fb13fd072cfca7f3bd7350ff38e1992f4f458692fa7779b7ac92b3a65f1e4ba61c765ec1f61048a2a47cb8fc7e5f256f78800437984aebb892173103bcf682aa4a0e18e46d30202c8267f53550efec16a7a38c1271d2bbc1bbe426469439e5090c1b40555ecbb3e490a085a9836a391fce1817d40daf23a342e2befd4ff50195715978c0726fb8708e11078c9156a8001900a56bac5fe2f73c3a3ab40c19c1b296edab05826776c835ca625951329d920f3dc103275b6d38379c0e40cc9f238dbc09243fd9cf10b37a1d360f1ebf7ce96c076eceec06c30e467f02d75cd2be1743c4a647dfc27fd01fece71b173879fb4931ebe46f04aad84bd9f64bdc364683081196c34fdb6a4fa8af39f8e9f9c1ab21117a3575c41472c4b0cc5ccd98a810b3ecfef8b3dee8c057b4ccfa7f6ebfc01209bf3f91fa19d3eeabbc37f8ee25f83170bdd35770275428c2311cedc79afbbc3067e6a7938e0e070da9ad6770508d87d16d94e70440e5b32f275f802ad33f0934444146f9bfad26c1a2805700583ef49db2aff012af8b0d716b461ad99b7561bfd3f39214404845708b4d81e0bdfe5b310586f65b31aeb597b38e827d812697be4c3073ae1384b6f158a660aa6545a07cb13485f0394bcbb32a5b1990e47db00819ddebccea2b769ec2094be0088a5bb31c1f893501493cb63e699e76c4d70b6b94b586d015b50c11ad0e55d60e219711bb7b956c8c0445ae4db568236467aca4f84758480a36d9d1a4de32cff03fe382cb1e40ffba1f6a770bff630d3eda5b85a5fa0422bddc9ab6750ef993a895ebd790d295f2f91d78762578136689e025465027deb61a2f9693f93c83ff175109efa8556a1c7034f54cd8abbf86d9948001a739f8e61d9ab442256d3961b6427c22a71a57cc3c6fa2fd2f32df477fc2e2bc140fec43ae0b7ba9d09c0890f09916b1c01056a60a7422be9ee8b988712a171ef26d0f65a5822d850b250879608f2d4917ee1684c5104649fc8c7790e27ad2f957a7cace368fed98afc282e2340a11794c67a7e2d441c886d1b69ce516bd95c1c9bfdb54d2eadcbb09dcdc5a25d81dfc31b0245517e55cd3c4194a3851968c04dabd15eae42b58d136d8f84eaeaa571e0ebd14a57312ef674e6ed0663b614d1fafca210e69190d03e4a1ff5339229ed749ab186977301453fa702767bc6e8daf95b7898058bfb971387e9570824cdf42fde304615ddbeaccb770f04d8fee00b9ff7d1223053c464bb02acedf57d0911a96b75a52b2a6090aa51ee378f7ee4705ef309e21640b5e45e02b8bd7e650412e34b572a4a9ab304f395f5e66c247f7defbe9755a683f61eda0468e1a22b7ab7f1acad3988ee50d64bee0b038ea766b51185e554a17ccbb43ef0d7b8f2ca8681187fcd78b5ca6fc84300e39fd4ae73387680ef888f972f39a5491e7497467aeef20a1ef21487a45b38fc5bcb217bc3462d2719703ff5051404893fd1cc1ff050cad7345b660ed84b2ee7fe81b6758f907aded61a4c94aaed96a6528d2c4cfebc1020820d396e7911b66e1316dd8e863df019930a422a3233486d7650a0c339e3f385365225dd3a1ed958dae09f953513e93bb922b9a155de1a688b86669d0d9033327948a59c25c3bbe5b1e5ee8a32fffc55497b085c1132f82f496f4a9aa246c7189b0b9e3318dd6558a21c3d6f2d3ef401ecc35920a8730e74a3c5f3de89b3666134a88e78ea6c76e03ac8478012250bf26f0ff89ac23d195e1a03005c64da247e5f9f0b2e122b635c4eb5b3b6d204640f0fe0ae807ab4bb0ee3f199c21262b28eba50ce0269b10a2f3834cb483b56a95805729dc660815c14f2221ff117904f4bafcc943205072a2142a619f7ab1d2688bb001af1fa98a29f3a5f7383bd0d4b39464c404f85871373fcca692e248507d24419e99bb7c285c63929a98b878d32cba2eb4396abf7a61ec75f38fd29b24b667eaf7a4c2f28e0ddf42b47fd450f85c226fe70648a746f83c4a5909a0f0ba5230f42cb067c482497574b0d6285f5f3d52c32ae963ba91d24edb07868688a9157f72dd2c205f8f6bbbe2e94f0e91ee98b083d4f476eee75c28e5b4749ff15bd5d358ac23ca39e2679d1d5840ebb62022df0c57f6ff6ecdfa6116d3dffa7e5b881b5092898bfd1245b9220da2dc83ab8c1946cff11e3b71eafac74d9a5d303d565ab94047303d7ce76ee1943fe3e6ef31a2823e4f830fac956e8bdda0309b952dbe12bdee0178e8b2d9d101dd72c91235499d0ad3c06f31576708647a11968fdb2633e627120cd1c49e1ad76388db40efad58446f94559001ac3c06cde89f18a03391b7de0ea85113215d140c1116f1cdef1582ca093673a66b88acb93b3587f1c4b68c5c3ed6fb09e5548f18c13ba9971e0944b74d4a387a19c098eacae83811a3e7c45f9d26f5a22a28bb56298a76d44860e4613c47bc90bf8a9dba225a4c86e91b15f65610453e5f7aaf161e549fd44fafe860125800d02d6897e2b0fc2e025214146d4f13257241e4b7520046cc1ef1658156931ec23855fdf5ed2773fbf0c6429a8f3855d036c718895c71c6cd9309d15f8fe2d6c82790aef3726f13794e4cffae376e49a8883c6fc1ed9bdba2528e433243d661168f0dc39d1b6e864307373a449c4e30a655df51c991a87f5ccab8f45d83846c24f9a8d6c214a21b3cb372e4aa87774690f3ea9ddced8ba72d388c493696737b8213e5573b2c3fa9686708e4dfa546f9a59e7cb27f4bc1b73238b18e78f8389b91b052f3ef154f2c573c510dba0a7c50a3b7c8dadf2b92c1560ea4267b7c206a90f1966641e224adacb71eb368010eac406afaa1e970c9a595a293ff5d355b87fa5fa446af549183de962d6d57b300b10966555b063d4f35014ef4c1481af4c1cf99148f2c05d932561af098098b102cd8c023b5a3752ccddb7efffe1dc54140958dc4f4bf06c0106a0a2ca93f221b6f585555405e3d879e82bdb9e3a342aaac4a49902feabd766540bf32bb2fe78ee5aa4bc4e476d6fc49fcf2c381b38068c221ff988d26945bb49a2e2efff7f71ba4ff241552bdf27d1cedf4073455270278ce7198a7ca74d3ec3b328b04ff19078b6ea13e3f3874accb0e11557d141405d393dd012edd99628fe42914c44d9a4bdb53e79b7dfbe520201b052a62f9d5a40bc7c68258421156817c6137006e101a024dda4a347783ad786abf12fc237540802e8cb33e8a9a2d346c1111fdb49b230bc217e67d00125828137cd6f29972cd21334204e1d6adcf8e02076ffd6e67ba27824b0088be3014d8283718a5b651884e5aca23a67550f36ea0dd0adc21a0656a7ac2f059a51483bc62624cd5bd56525d2613df4e8c12dc2943da7c77d925908f7c742bbf2fe75ca3a12fc9d6165c20dc60130f63f451b30bc313bbfe103b803109594e92c62e44004e7b3b83c0b98f2321a9872b3cdf48d55e87a15e251e9cef5f452564b977528b0d20a3de9b46cd15420b8027b4b61eb3620ae4221e82c27eb8aca81cb6c7a6fce3456f2d60b20b1636f4d7871f6065c83d0ff00095b893dd468a3f70751afacf8d1cbdd70d0dbdd70d14fde78d1cfd876fac24082e1370de0740d4c7eaf0d7f9b5d0337f9911ffe926ea28067fd6c922fe4c20edf91abff0896a012b60582370c87782efb3a1e0e92d9e230e46e1935ef5c3b19c08f1313fe89c3e3ebb1d22341a038f46e99ef83356ad3d60786781f33273207e552b099415af7cb8cf828326c32e39d53782069d4e921b43ad7e081e53b8ba79c3380edc9c5f3fb134a292cd4460aa4fac48ce909f17f1edce849b1a9cce3b48afbb1dd811e4e1adfff8fa110797e2f082474dbc48cd420d7d11596446477f7ad69601b518149018690e990ef950825b4345d5cc7d9e3977eef9d8340b031e9d0bf7fd5a8269c216a9e2aff7d53427d00665e399a3e04b02bf4a5f41b66fb1d61cc00419a73732f7d65139a0a88a7cd6d81258f460d94b0775ecd446dab711853d64e1ec90a9bf90aed4548ac27a4e7905d234e54e58b42361e130dff3f5bd09422e6b57779f3da3aed72a960d885e65412a4d78b4f9cd8722105ef22ba339d6db293e738da2bcabbc68c571f09edd2a231c158ff7ccb263c7960eb478aacb51baa26a9e4da58cb84e0337c8da197662dbbaf93cc2a68c8367804730feac252e030c6e1389b3ad84508ad704e94f6d92153df3bbf33610867fa948c3ac57fe53049939b0a624b83183b558bfcc5a747bfdbf40f6ff170173f9580c1085d4868743eaa1a8b05c20fd2a4c7d57f110540e02800575c06c7b7baf8c62a6a4c937c163d249bfccf072262f7ea7c08d03e4115fdc17c548aede7833a2bdd1426efcf645780a40927a7f2a566a5763fc3c2bf34b016381132e58b362baae69d1996003cc17eb61dd2fe7294906279d27e920eb38bf81c9b9676b52af164f9a70d3c17688ab5472250b8d08c4508acae54cb68c9a2e01e7de111acab98a1053172685e31163b9a016b2f47e96d44ad499c32d1e374e9223cfc927b770e63c73e825cf184445ade2cd7a8396d43f7c59426edf428eee4e5dd518e432de57a64deb4a39e23054985da9b011f217a979a8e80ffbaf5e85b1537166574a913a705ce4763d3763a36b02fc94db4df1a885279560cd5a1e31459fba62fc5a6f5480ad6a18fa7eb23425874c6d53bd8252c91a3f048bf47c9dbf9bfb1149fd8cc7d134e152bffd28d0984fc775d4d28e5d0ad905957a3db1b24d93529108851c39d6558f3ef395622c2cdbfdb526da4fd408cb85f371948fa5533c480117e640e024bd6fce128a5a583b6bc0fa4c0ce0807ee80deca2f38511f989fe3ee22c59b34060b6182bc3705e6ed6fbd9d45ec48f07dd25be94292564092b3850e8ae1c62acb48777a44f837c2ae5978d7708afd6e8cb823b609dfc2cb252a54c302e79707cdd90be156ff8e452fa1d5ac676e878c48571f63cd1984029a69ed152923c67a7b57bbebbecb29242bee40ea54344404315142c47f00fbf70f026a457ba483ae91a5a2020a683917d247389c5204154a198718c946ab4c37fe430198e2d6a8debb527a8c9056ddc94981d013c12da7ab1bd63c4ee7f63157e1f16e052c706751d8cbe48dc8869c37d6cc23cac7b972388e8a3eec871788338fb76c9acc21661bfee53a6b0680ae14064aa8b9d55652bb85660f227300deaab4e45a29bc45214bac274e6a6b3085f0fd6c4fe9bd2b8465f05d738db75dc8c257e08897f27e6b9fa251e2264dc2caed419bc225fecf608f080b02cf7a47c145603acc50723b4f8e9ef834478a5818a304f7c02208f505626edd87c87fa3f045c14fadf58de674d364df7bfc9acc0393ec8680aac8e3747c3638ecd1e86a4541ee59865c85c826f34c6654a94c189099bb86563626d75b7a41fd6bf51d9b734aab9b974c0e8bdd577e0bf1e9a400602e07720fa0d2cb90a2c11d1be9dd1cfeb9bb09e9ccdecc8bbd050d523737852fe3e79b43a7f20e601be78731a7688edc9cfdb1bd33870cb7fb3eee79a91a65c0b1cd3d920c3b8d4d124a4461f1c1a1357c0cb0499d7ba5a6a62a2922cf3806263c8a684594f89a80a9401bb629e3b0f56bd938711e5137fd80866167119d7990c25f8232433cf696411de15cc6246795e2aacd8dcc08f60106439775cdda05641daf71c7503dea9e4f28a4cc50f0ffb413a1689da2b751dc74d483c6eccd082d868691997a57ef9113c97362cdf214caab72bfb8bb49f5e71ea8196ebb85a7873a608b39729a1cee80a1514d64e46344d8b39db9c7b451f7ec9450de582c1e6c281c0bcd04912c7eeab4f48593d6060c6b0c97761871251f13474ee46ad9ea38e423322e0cadc22fb276e76e92cf05be641ec3904fd4f3e8dd547859f001572f124f572337b7746189f59f711d384a322298c315aeeef949853bf00836bb82f9184cb39e4dd7350e9973cc9bc2d1daad8c06dbebfb3a3799f3d26d65612704995221ae92ea45f937f6f65e37d91edf8e39c725efa64b6e73752b23d760df05453241e00b451dcf4f8ceb3d2f0474f7b0923e221269b08afb7fdb655e7eec243b3393b5157cf33c1f5f7f8fb70b37daeaf1d08c7a9b98580255100443b34cc2ccd0e02b83af2478dbc2b3500a54f6cfee3f99bbaca3203f2cd3b367e24889315c15bc0e63cf103e79d6e72acd40695da13206f1eb30d98b806086194d771ee037069e7cbf4b891e0d9ffcfc15efb6c2276c81a813bbab1bbbf1c364b12857e1f11039f48ba8b5660fc8ba9c96efd3bce92d7a25c2b0f2ebf71422573af4aa141f2c366e2be55ff171e5da9326b6c7dc0a0f410bde14b44992e2173719de9f2d32fa07da864313d456f3c712e5b6789f97a217cbd3085408349ae2981dd7ac2c13a1c012fe3d717408026fe8f3cdf70606f2d74fc1d58f5e6760412d1c9ddea06bab3e0ed50b5710465d5ecc0da1907ae36a947d49aeb2daf97ad23b0cc19073c9f59ee7b69c4568a2d9759466ea7eb8f5639bb7ae17e8a3d437ebb345f3556c07778f41fd4fc13b7f8951c4dca8b18ff47d9a16b1efe480fe84b930f76b67035c2ddb75da8cf54d61712514a74b82e694e1d263d61be4000b6d05d94938d4d9838ef1f2122257fba1e697d8c5be138322c032e385516a72f59ea2c7999b22b40cbb6107f5876b4272dc39153e80d4a1b926b1214a57f6451a8e3c765bc7b218b0101000f4d3e5e8021eecd57fbd5ce4f44d3ac9d067ca278a47c58f6bbc50cc24a2912f2eda27a5e9e48e9441df1fa1ac9d4864e45cd59f4b501e159342769b25c671f253dbab871149773ce14caa04cee2865ead40d3370f7232c7405f5c9c5834b7adcb031322d246f0d40fc98e22192bd80f62d811e73f85ac2b9722cf512d2dbdf216cfc847d67c3639c178ff1fb4fca0f443e413d6b818dbb34e9126f1588003a1f5bd8bfef42108ec7d3c8e2d146b77bca9469ce0cc8844672005617768d0c44a36f13750717b78acc030878c611c5b80c4731246c7cbb4e9867edda22c116e1794918fcb11ce2573d4def175738f86ad61450fa5632eced3e8a2886dfef6326a851fccd2766ae819cdc3c5c976aa114c5e59519f8f131bde7be99a1b58cbaf4e134c71313eb74493c4b381fb46a82df2236a682635f4bdf6377bcfc53f11981dc2d09c94e07c4fb93484a4bd1d1dbebfc082e5175a68ce9569c94ec93a58990a9b4590545cda36082c68296bcae11797a8d95ecebcb8e82f84f65905514db85760564b2c7a144c1b78dd95072b79b9c2da104d985ca2b35f774e2b9f3b806e74f67043d64604e8db41f9cccd031656ee2e21f8d48483b22ac76ad227d266314cbe76bf843c915d9f4e20477304c0e2ee522795ffc8f65c81da830ff1172ca2a6f08f9a6a7c6aac09532555364724082b8eef94fe7c9d04c9f39c47839908eec2e2c9a3c6d76bd4e82596f3b307f0dce75d17addef2cc719632eededed4f34a5d5f060cd81c08e9112677d2ef270b76213c4e2832e795cc0c57d274f16a9b7c48d205f1b619203b7c0621c22e7241d1bbec0a842826e8131b39f9e3786fa6d12a3760142d401727edb5b89cd91f1833b777ae2c044484e547341d2bb33b2043ab74c6afde3a248db4c6d87bdc1a862448aecff2b2bad400f0228d42c97eb5db5efa6a9fc6be2460ba81fcdd3669ad1e8b685c5aced90fd40678851339371635bd378936866adc7b98ee2e2bb5520e845510a1c2bf4201e0a28129379a05532a054248abbb6c92d3fbc86ad1b51050617bb45f3947f6203f791b5862fe86419f1d8ab8d563816a241604231b47dd69d284fba59431e8650179e7ece642d292489edc1a8e1d41b1e3077b26c6ffb47c03131cab3503aac764ba3c7a480e92cad0f006aa30307c70a6af6e8d6695b2a4c4f6291bac31ef6ea87ce954cf86a79d0fb62ca468e96f5e0025cc86682193b4034b8c3913870709fad36ba9a531c6baa3ef7d6086974963bc85fbed62993fb9399c302737c27537da6496acd0e09aea1da22df4a964860a014e5c47180ea17362670ea00f0abb33d8ecbedb0aa85a0b31bcf6cdfa0f1b65e589839767255fbf8fcb52b3948d0fd9c66dd75abeb41e00ab57252fedb8a00576d8ec05577a878a5e35f3c42808612d1ac5b11fab778442f6b13ebcfdd8f80eb46d3807e2a44429498becafda0fcfa37ec9e15c7a53b320f5879967c927092fb321762c68940e5b85270c1fd2f5a634c27fe6971cac90db458d58c6446b19a52d5373eedca250e2a45fcb9b4bd9168b9eae817969874e41d4566187665ef643ea8117d53bf8841a8fcb8fd208f8a319ac08220ef142c79a4a02ace2af8dc1fa062e0bf3e57ce9257f7d0e1596d80dc9b6467b897393c871f8fa040c3f237817bfc9321f8b8cc85c1989f4055d69501b7b6c844fa7345d31238e2344b42c7818745a89cbc2ba1aaa7401d9ecb7dd281dd2bcf67cf135db7511cc6d7241ae645acad8f46afdcb7c447d32921acf24c4baf1f240f709eaea8b2c8f88106a306eae4e4a55847be7c920677193672e63e1234edb0b43afb1df96d0723aa07f7f34cccf03e22c9d6278153ef09ec4b22e1873f800d6576aa2fc6f447caecfbb9006bb1e6c24b9d74e63a09c2aaeb830f0c2c20f752159222d64b67a3eb44b13fe8043797f1db5f8e3030b914a8aa1725bc8a05e205ce08cfcca998aadcf70814359054cddafe39eedd1dc03dfd1bcb6b553507fc60455ef3137d961639fe9c8b8e323f04dede35ef6c12efa460c0dc09a5cfe5e2543c3c5c3d9a203cf587d893db0978d3f060b3d9beec6089ce62e05f514742035ff6c0a234cb296b5fb49f8a359bab8e7ffa498be6019e7033315360156c464e733cdd802e4f8e48bab18078cbaad2be7093bc89033b71b910c712900258beb09c9fbecc24dbaa0a8d51d36a4683b9ba71c21d249c0981add0a4979d31615316fa863871b83031897498a7b56e74413dbf8c66c7b6883ad791ee0bb6c81f9096b1d1963b7d118fa3bc9bc49dd986b4a5a1a998bab89dcdfbd4f151be8057c193263a85d033fa8b02f4830cc89507a07447f0126da69c1aef2104098fcfb394c02107e7457b29f9c9503689080c7248964f8c5eb4dff40a865b1746e70a691608608405c3ca19643cd5b833f092ccaa9de596229bb0b3651ece554512044eb9b38477da0e1879aaef4caf6ffcabd19b749ebc7b72de042ebd24318723989905c48842a27702462ff0d80f8f0a5e526ace117c2dae4e8983ecca13f5efb5ef841e020a7da872a4d40c5903f15489be5d26e09de1d77382eaf073444880adacb7d4e478efa1d0f1103a4cc8928726120f21f46024d2620fd524dce0b254cef23ca758b44baa8c537273217c182180260b9a1d5c56f6655ae201dc38ddaa36efa0d4e89d937da0f6ee543c6347bad123e6835a28c2baa8a81f449ed6dab207596f8e07b664c6c484265620c122ec208ae4d95cd604d6798017e7660a49f9f6ae55724f70fd308d288a1ed5845bf7079b96edc1171370ea5ee00630906e05b4dbe3608cc8fb7d004ddd9101a97f1b390adce686ba99c3b404b868dd4a430e0bda9a85047663d002640e93b51a01a3bb6990a2d2d8c00c715d9c318c22370ed30539e0da28ab55dba19e59b735d502917e5150bf4e8ec9dd92bc928ed520005e0558d8b46aa69ce2e4e3b4bb0df8275125cb93340cfb8ea8766a8949aa36384fd29136c5db8f783ead93ac19a7f3bcded0ba579a04cec97a988d27599272c873804d0a5ad45641224f8ed9003e5629d86a9087fbde59c177075a4db4f4429e3b4f6264d07c8c6c23df0e63a8a7d7f1a06df3f8080046629e46afbaf6f71fab177433c5f227e844e22bc6e9a5f77df13cf15799d223c84d7eab36e1e5e762a081b99eaa96b155fd2dd2adb92426d6cd863f997c580dae35b83bffd0151278aadb928ffccecde1e82fa1bd5ea2171ef95ad4663f67ca9d8a76a618b49d3157e15046dd12b6b028abf232fc524fd57fc7e94baa8d69b2eed522acdc987c67675d64dee114fde13c4bd78a6eb7f0f07a78db088546491abdcd17dd611e92f37d4c076bf01556ba4efc40207094619504b4a18459955fda9f7d45d86a18cde7a763704cb4d37ef0d1de7cb31ce574a9cbb588e1c23c0f7eccff2e370b17e493fbbe794cbdfe2413ca90e6f669471c46568ff0832348e70dbd42ad840b7beb6fe4c3b37098412def636281d653f46648ee03083fa570785f496a1c20f001ff15fe2f7b1f2be8417c4abcd53b015c503b03306e94fbdf6153ccbb2fdedd57982a13d61a147ca0b49253037cb3eb5123e85ce0ba2d1202c4979352a496e19bcd69c24666d1ccb9e39bf95f1cf32da0e5ef65c5173e8f8ba6723db12b8b58757ea5556f46a6546c7679c45c59c382bace05771d676d6bbb35a37bc7782520f429668c6d7fcf4a60ce4cc19c637d9b81a71dc48c398a18b6af312c9f8032d40afe4431229977e152c583b0b47104fee362c761cdd5bffa3ef018eb5a99ddd0874d84dbc63e472ab143827c8376f71ccf6d64ac9b9ab7fdff4e08e4381a10841998c6145365d0d90ced34ce4dabadc2bf2d64bbb422c1184aafb29f7153f474ab9183e476d889d02a10345e8473c9991ba86425f3a7b1e3386b37b37191dfcccf91807a3fe146feed67f39b79b333f56d1dbd2b66ba4251d4d223f142626112babefd1cae82c1ce63ac169db7190e885e4d64898e039e1be0f5ba71a77fd52ebc093722852da17a84a76accc4da707976219bc10bf887278f505a9d3dd3b8b6a6895029eccd6c78d87c5a5535a855bb6ece5697421481e86696f347f935eb08a10d1f2be64fbcc119d2b4f4f52b6ce17b00a5c250b767d56a0944583966cb006fd8a5d515d8a073621462d3a0dada075385c91bdfcfbf7b6487f10e24e98fb38a7919de0b04452b67a3a90696ac5c8dbf9f09d61d0473906035180879bed4739ec9720d325041c63d58e1360982774a9af7b1f10f3e6b43946838c914cf8fd250959849919de118e98f003eae5c99fa1f70ea8f491d0297869c3bcecc16a01325c8ad25bf1ebeea29d2efa6c6dad8357bd334dedd64167eaabdaae609ec50a3b49fab4d483e2af589ad08c0e18f0a7573a8780ecba666ed99f0df0472ad8c47103b047b2004af67d2e8276344552f6a95fa5068e4a312f64a34d8440ce919c070126481b868a1a9e97620eb347176c8b1de664db10ccf86858784a6f3d1dbbc6e249136af3da919947327055d012949c82cdea8dfa2fb22bfcbc48d018d3441cd4f57ef2643d41eb098437fea58d0c70f6a217a5dac148bace970082fe88414eb7225e8d5b0a8606bc9dc378ca21bf0ed521d3ba0fe8d0a6c69e50b88bd59be664e7e81ede57c3340adea2dbda49d12a634e812ed015a6e33d3074bbfc2efe5c9e2feac8a08a200dd7fd4eeebc2caee993edc562a2c70606e54fc371a8cbec9949458bb21d16049a35ab14772b22ccd4f490b6fc787d93b4931dc2f1acf6020f44f6798d2328094d59b433425e57eb2f085c8343159a0baaa167d20dff14ee64210c69aceeff3c092d903f4dbff94a33b14d47f8a6595e67d6cfaec52e7b76258717ae9f348ea8cc0056250c72bc3feca2395b34041801c31ffc6c831513a5d9167a6201f92a0c5835b7c3a65de42a7ea04055ce11b46557f5b0c758b2d5a51994368d79038f8c248e1bffe8cae12095254f075a1a42d8d3002dda8e90743a53d8133729f24bddd85f9d3374cad95db2e4ba4b1629aaf29b309f7f5b30385c18218744fd807e2f31d87e4f6334855aecf157c172da53e718e0f1ed3f4dcc313060e76a223a93bc689ba4bbf179c48c6ba2650c8fa808986efa84b8fded5493f206ffaa1d63aee6356900135bb05eb231905fddd334b7d06a0216750c88086ec307d6e9e40c9667d6fca231e6077136ecd023a6db2916e58f9c81c51edfb936e9d0b6b018001e3db9fa4cda4e1e355376cd2f5676c1908bb9cdd14b5a2d4a7ad483eefe709f3ae5897ff038ef36e797091386a6987978a63206b8b8148e56ae31c2b46f71d6b470974b0979b910d19a4b8e974be583ac191504e8ac102a4e696c8ab11623addc043b5666313fd87110077bfefda7a46ce9f14053c70ea7c79c6336993b8054a0399ebca38ec40ae7132d3ddb8f1681b5d731856c78c270dee34f506d48b1dfedb7e31621aaf1a4128ec8e154cf58d898b153165f66e97357a1c058036e0b9f13760371a1132bff8777687eceb24eda9fdb1ee11653a3d5017bb515989c0efa03f1addb12689bb9614320c28bb10d98907f95353d357145e25dc6239ec4f38931c9da5db99f2dc6715939695d8567ce5451501ca24164b2f44075b561a8f301d2bb84b6bfa3c5e520170a1cd38c2f192b915b6199877f23c079c4156149e6fc8d55728a0d58927ef3b72b43a45e1f96e16764601fd7980e2303eceedc9a50bddda317474299889401f473dbe0158da3263242cecdd7fb207c0f0fee6ff6781e9308dcca07147607ca4566a4f9a9977fc148f3460c5a77833e48b13401603adfde93e669d20b494816b4839b19de663b884b7adcba8e43b103985d570f0c2f459632aaee41ba753563b8463fa419c7c5aff10d72b780ca0d073d2022bd24f0a59690e8a52005cc13edad7ec6860093ef42a2a8d3e4ea28ce315b4e718b195714fef922d6bd97692c90c64a239339891f5110786e943b59f4db8aed5d152485a0e2238bbf8d903f51ca642741fd942da4a1b118b49884e68ebd06c220d86212b84d35b1be5e1ee7360c1cc53a1250822cde4d915e098735c499ebe9e5dd7cb38a12d51d9e97118087c1006de1fe98297cfc298a4140409f112a142dfa45c890db7ace87fe20a6ff9059617bfb97d39593a15408d0bcad7fd65356e3ccce4a9680696e0707facb451f394e83a25019c5b75eff65ddbefa49fc867d747183fd37da30c5d53de35b9bf243c10325e6ff2dc49876984b693520c5c4abfb5af6ac4332b4decd7db66fc0e8a273fa60ddcb51a403dffdf0aa88edc11ba306654e3a70f79524ac092a5929f0630ea12cc417b22b3840ca0dd1d3e817b3d5d3b8800a88b4e3f4b331d794d2a5c54ee3adfcb233cacea740ede77b44e26215f249f0b8d38f6e3d8d12f7605e7f984927a5366793874d74506fa412c4e30b32c7256aec3acc68faa1fc378954d9f8d80256122e7e32fdf719e056c43c4a9946a3251983bb20c7f5a8f9db97783ded8c1c9e3a2bcea40d0d858e2b5a3441e41e722b33d54b91a7c1fcfa4dca4df7f88876cdc383d2ab32d86bcb2354279a5a46e6644ccafad18dc3d4de0643ca439415693bdfe387e567b7d907982efe5acb6bc4a53db0ec453c7b22239dc84d5625a99458a9356732778215cb0b13dbaa6836a143fdd9d85f4cb8716e1c02cc209371ca6c30531dfd58bff1d27c519be725b6f0f971da6c94fc7d08206abe6db3f01436e71a96bca23145c4d83d1d1a83de37238e8aadf2270610343dbaeb3ea3b06ef2dfd4077ddeb5bb82e642b3d10c72b1d61b514e11b24df4577d218c5e6fdee43fcb6f87ad6451649973dd72f483607b08facb682e3c8c64247b5c7c13c74fbf2fc52d25adc747faea79c2f13cf6191f5e773a397094cdc510281427d3b420875391e9cd712bab646e883d4f704b292173dad8f5354e6627c3a9065971ad28bd3212d184b7f9890ebd3ca71bfcae5021efa6914f15fed3d441eba1b78d211c97f763dee07578edea8ec1b6403cea4f0251548fe88e93639aac48f1a49363512cc4bbb116f33751d91dd7a923e46b5a12e56859ce10292e780de87e5f55d3c18e4f877fa12e807ced626a171ef32593d5910fb8d0da8dc6a9552622fd9fc57e49f9cef603ad8d99b54d5cced790357105ce027be123496aec38dfffa838a4b939e2475e983f2c7719a5a502fdd22d78558a4d2fafcd4fa76ef12dd95259065ddaf0c765a85692b39406512d4704f1c717a65e5d6ead9ef49be6c92d34e095cb365b58da0bc6ab2ff4f5a3eee951aa281364727a66f34a9766cef45997063c7f0f07d0a30ab813a4b82091f8e551fb9c683b821e3704dc71fd699337f43e9025f019b8903cb89a339325ea5d9db68ad9d3f71a202a9b30dc4bc106fe4759402d027ea4fa2bd9cdebdbbf8a36fc142fdedf18f92e2afe193c6ec6a02d873d12e0b471b7dd3acaf2b83fa2158f4be21fd3de9bc09cd9ca06a1697d88c78435693b0bcd3976eb8a18a854df6c8b167435250e69525322d930c3c01afae830c554193a0ece2eb8bfd70f7603c961991eab28293ef7565ef05ca2d6c61fc8c313ff22cc2692ccffb840d4a74928111e4ee22ba5ad8ea60a967c3c9be51d8be29b2b47215d8276d2038058edccb199b8bbf3f57859cc8af1b179d9597f25d30550721d8f5bb7235aad23e192833abb72cebd321026a9da00e358545905a54fa365c51a8a528b6f174eba907f5ef197180e6bdcc6517c3ef507c9c3fd0180cea88176ea004381fea08b7f525bc22fd3a8b1d74dff320b41f67be0244c19b7793d7a0b9c67b7f080726f754c79bb2bf3a07df660e9900928d1812749503a852620cda0e40ba12da519632931cf16cb072c805f0069213949772566eba807c112e4c62184398ae063c97fa9ac29a8fec08b3bac49c840c4cc48161750574619bd05a4c97d561e3a090aa0e70937d5d2576dbda5795259bc89c27d680bb3199e6134ba5981b98298b7db0166b5a8e77f4b21363e5b9320fd7c97b3bb8d3d6926da8c7c6ccdf22f98bff72426151115b9ca78a85b6db4bd2358de408a06eb22cafd15e04f9d7dddece882d1186106bbb817dc692f0b11e1237d8d9a4dd455e5e359c7b4c2c0470b69642e97e4ed517b9fdd2e5b4aeb1b73d8aa5eba9dab9c0396f523c909f684134964b561be2f61c4b52d4e9e629856b89bf6821813bed03120ea86f97248e9bb7052f065ad8a7afcbee743db1d1ba24bf7101442ef803982a8cdf0287d3087e30a67653e8ff22884e8b50ef3ce65336cc4960e164282dd5e9b5db03d29d47a01ce69c6196e2e154e55762f25284587bdfe3a02030f47b99db21c9cc1fb285f803580596c79fc3aecfb956a037985e67c061d0fecea7854af7d40d888abe143a85fa959aa9d31c479e32570353c7ee462ec7983af8c6286c24d27691515aee32e50aaa6c0b28c20aababee1909344254995898cb31cd95b082fbe54eb0a87316426ad5bf139fc20960172477ed8fd66f867ee59d5929321f88942b0bbdbc527eac19c8bafb0213e4008392797e61b1c1f4b6b01cc94d2e2ba91f79843d79495f565880f0710d22159df30414d72a09f512bd49a95ffeb2ecfbff774a4c7a5125a92586d9ca142b2e9c163b5b332b26fef941cefaf15ba96a21bf70bae889f59a662dc7d7f4fd380450a8d842e5f557ddd0c703d405dbb943b54f0dd11d794923b0d97b03424f1c3c758c88bb00e8361b7be67a78301a5ede7f8cf218277e295c1ab0b6526210ceebba3e6c572e45a074c920918c21f6f6aa4036d6c8ad7263bba7a268abc62da35551fe2d3830636279bd3fc18ae2157b8b027265c5ac7b8c296b84a100acda316b5cf8989b36b984049bf52e0b58de6a790f88102d2e0240bebf4d0b67a0a4551073925c4f199330cfcf0a96a2886380dd1cc492889004b5c8ef38c9ec58095856b116977ccc1565b3566d6f12bd2ab40c42124788b0c901995c112f3981b56659302777bf2d45c12a68330d9ebee6b47efe99e6904eaa84f94e83268bd7dbefe599ffdc4505dd353d191be5d49ca9c0deb05328d7ea00f37390bc418b1a06e6ce7aa72705ff0eed84b32b96f59cdae38a8624c62f6827bc7cf337ff0ce032212ee46e2486295cccf205ad2dab5c05cd926d9569909b10f7b3ec5c218cb2efa38c76b1f45e08f603bc17c1d361336dfc86776529dfde4468fafd7e6c39675dc773168876864eddcf951811f35f0e24d6e3ae97df47b62aec6426683ae0b9a8d296489401b1954f20e25524b84755fd1ac906bfe26925964c50b87077d054c9208e9cc52e3b0fe63f3a6ded6959d32f76aa250dbccd8b8023e1ea7fa7c47aab1438d94c937aadfea1e238c314f4f0c79338d6dbba07214a411a53d75e4198107c2c400a1484fa56aa9fbbea5c46985c32971924468a50cf2f60211d3bbc6239846dc1a94dc42e33d0318b78b5c303b052feaa0b05b4fb9ab2e13f058282b184a5424800e56edc6ee54a202c4190d7a996d7a5f611d210770b479a411fcce1a290f3b4873f19327062e5230b40d748192c3834098f060996c29f6c16b36c53c010cf9de3bb4353bf1087626cd48c2918c2d9e0b797c9868f89e08084a503fa500281b2ebb9f0596220658db6734fd8b692f7203b6550197a66e5ffb7430f148646e43b6e7a77e409ccf803c6c44265c6289efb9f857d62d852c1be1b03a0e3fb368626b74c6822de63ea1e875987321af157051d8e40baf8428eb45b27fb4e0b90a83ac4df03c438e8903970d755561f8a37e8d0925aac9e6624518d1850188d203ad92a0043de911ce8444dd91dd1c026529ab198bde7d2cbcd3c389ad66c8db583c0f87742fb620d99496cefda0134081a92fe3ae2be72dee2e4e3f80439123a7093cc32946d45fe769be10a812f20cd99e2342a5714702b46b6da02b4ad8125abbd7cd35753a4f1fdcf1f3f7f169220ccd1cfd2220b85e165aa5a3b2acce9b48a3cd109b6232ae8e9194db5ce30e65def044bb04c3f69af081bbda46c1f15b9a3c71d470595cc94cc36bfa817f7c4ef12a5197c5101365d506508683aa5630e69043183256eed21370e08b6a8591e3ada7afa3848496e81ad5e2f5627bd14fb6adf3007b5d56d3cca68578f3dfd1c3e15d889edb828b737ca9c339ae2757578d0c9e6b994c6c4379bb700aab8a9cb525a004fc027d07e1c3d28419f3dbdad4f470174c05bebf7cd1aadf6e5602d91ca1490332477fdcb702f2ab04d0188e3982b1640e0ff463b01427d84dc1128935580ec945c71b3a7ca38fc0aa1ab96273169e085a74346ed0f81f7dac24654ca389081b9af67eaf7c12a44bb472d2765739371cb66a1017296d64626964e0767fadabfc5804f8b7d990fd210b4f9e8039113e5c671bbacfc5c4266ccae6cf9766488181bc4ec3885dc46291e37781974a42918372e406e29d27e0251a36d26c0fb104ee43ad0eeed0c61e4fb4a030b4f7ef2112a7e43c96731de9f98f85cd6d40cafc6924db7d22e44ce61348a42ed8e3f20babd2729f55fcb2586a5ac3b669b17856c6a74856dd145bfa4e4ef7fd9442aff3ecf0a851903e2aeab116a417c28f58ff88489e1d4a51b88815aa4cbf20fea95196a3e95c75817a4d997a10471a3d75e7d16b78eba3b648acad96130830ea45693b7504f1639f23b001d9a5b937dc3643008784f7421bf060dd9f8323d63373d8a5fb243cf8caee062eddfa13626f21b52a841cce5ebf56bb9a0c508656287be9fb620ef8ad66633d004af8901bde2b6242d272e78df37f2edf0feb27087a6a3c4c815f95f62bab5a5e7aae02d6b2731057b3e3b23dc448cfe967ecc6b09d8430ed58a1ede5204f2c8bff5d978bcd3344242b020ef03fe92cc488ed11ce218cc9c9dd2ad20a24052f518eee5d318c6098d917cd877f0441689da50145a4c125019e383782cc95f8973118f682fe69511a023511ec6e0ef7b7f68402258d6a1d228cdba51741b7874f47f7940e0e18f9d70c7b5a110d7e22c94dcf9b3cea42c1228567d77534d52216d836340332440b84ecfd353601d934631245684540fa25c1db16f1f6867e60b76428e07a82d2c2b44c1b3e0b29a696dd0e724f246fc89f7107bf612ea22fc2f2215f1aae705f7781117a791da01e1370f73c311c471569dac9b679e6e627f2774b3b87fa06ee0fc1a911f2d200ed4a52272a30f3b799e824dbc37934e87375edd9d3cf767b5aeefbfe2ed3ff4f51b166a1864354e149703b72475ef42e06294bb158014a5e44769547e9a739dadb384af77c9e8392cf3d8d387b6d36bb972f5d8edd39b988b32f060f1e67d046e3873a9f9806147d6949b3f94389c75ec5e1e66ea0af26e62d485b1c5c0ece01f05869a49fcf77a2d5b58587ab4c10468a98009ccabdc299876ac665143f29bff6682fca3525e0740e9a88b6bfc5bc6afa6af2b31e5810a8978490eccc9f785c80126c7598e88a11f38ca07b4c6b10e84c69aa93af39ad7e3c2b0233255688db2ed7af128ceab56e0c7d33e7ac31af7551b0d346402faef1975ebe3c6ab2dd1890e9493d4f1cb5264ee4fe818e23e89d42aa39bbeace09a3649b80fd24d90d8807280b079d5f093e4d8ca0c34fb27cbe65ea79b9e6a8a45bb6dac7fb0dd17ca91b2dff94c0bff8c6d8d40bb9cce874154c90a152da3dc59cd33e9d0841c9ddff5a87223db1b027e1aeb39e019f3929384e504fef367bc285699a6624aa29f82469e907dd721fda6e2a2a806e2b24309d2e0ed140de39a83d5b7cd05af306005ba520309a0901444a4e1781475af15f954fcf2d238896e403ac7201f4fafdb8f616f1b16a1ca6c64560e080b6c7f02d4caa586a49894a7988773bf63c8934876a906b56b71411da782e8eba022bcadbb53a0f0b7644236216c4b93874a84370a40c6aa738a3573f0719140ca35e47aa8e444e4501b7ae954c9c40ea63a8f5e14635682d0ff118f2582e2b31986c72afaf0bca1e8dd173e92b45c0c5dc471be4bd154ccb8250ce89627039ae413a21a594edceb183650984dfd9e970986b8d1c28a53c765d89224b1d588160b8e8870dad5510e73042382127cacc95a3570cf499e85369e1849890c8986fff77ab413e4fbc7b22da6f4a5aef2dcea8875efeecc55a40ab2ab8bb1a990b4a962eefbbc1f261c5fcc9e395144dfde2786b5c4643ac206741f8874a2acea3bd27ea9c22d78044c61ab87a676cdfb6d072df756ebdea73e08aeb6cd93485461111017aa30ce6e1d93116a5438a4aef2b71283f4f38374fdb2e7498b6f55924b8939cfde310a10b81dd9496d8f1775554acc16b87a5c00513f2c3b04ab24ae645c0dd1d20c026fc4b8ff4cd556ef629567b42a6780667339bd28d57fe6a74a3eb1183b1fa6af9111f6a1f6a3aad6fe091307d584fe9211305dbe2bb1b2741947c15a9daf9b1a5a81ac54a541d0f43b76f49980625d718971bb9fe847f4326fe360496ba4e25ee9841ef1513dc11c160af03513f0ec067626a4ec4ed189169ef3c8a585f8f3c71d7b5951ed2e096e8bb59b0d3a1e986b404b53431d80fa7261095163967ea5c34298e11f11e9d00dbe15548c5925a991079ab5aff5e17132a8c813a65d51050d7b52f67e08c6e14245c77d44ea66c3502d547c42e4b74751554f5a12227befc95c97d5a55c31f66e020f4ecc58a0ac98325f80411e98fe370b672ff789f7e87edb52c3f7a97c93f2ac9d68d509e40878291a54f593b8be840685c98629652f98e8b958bd225e890f4ec510c7a5db0f74ce38351c9257c50421e9c58f0ee422b9752c85169668ce958b518cc3fdc91f0c1460317ff0f630a1831792c2983d919b3680522b960298964d81c766ef980ca9240334b9381fca590dd7952f7494c95256331b2bef410ba606a96b3a609de2aac6f9b91a433eac24639459c2c23c6e3dcfc2bd90ac95cda7a327115089505d701cbb22eca446780e1d3668ef1f7be7bb0b2defa7e6de2f52043e7991cc74d3241cab81b02056b84c96dc22afc5e065bb497eb7f0d9608656fbba07c90d068302b582ceefdcea41fa97cf4bf9ae2127a4047b3f2b7e5611ae07fd3cbaf64f0dccf92248e042c130004775409edd40606c47bb1377c7bb8783e02b0cedbde00e7d8a4a288131bb2d3b23533511d6928769778c0d81fe9d0eb57bc0df2fe6b88ce9ea322061a084925d0483e916e1f38bb5c7afe1408aea6e86c0ddd946fc97457eb92978e6eb1a048a0ce0acba8258117258b76c6dfa80a4e0a9a7f55dced9a730f217ff546971e2ecacfba5fb2f2831eb86c122da4a7d389ad6ab021d3e42c8a8a434f5236ca517ce8dd084e6dea5a14c1eaf1060a92c322f1711ac3c1a91dbfa55921e076a6f27f0baef7c932911d4913ce860a95fa2e50e6c56e7e2a968d52b045fec9b57dd7656f554f55dadaa58eb3dab4e2b2d688ce1e85983432030688b7ad399df53c990f03ccf9a3131008358f22051c2d66cb1f796b04706e593c80ca91320a289e1685a16fd31c32256ec77465bf7b858ec8034cbb552294744facb2202cb888d224641a6d026843c100febd657acf1c455c3efd7662c7704c7a1f6a358f2abb4d23fce15e1b278284e34414b6678722c20b310b8ee733f9f6d99f1fcdc683fbf6674f787907729cc9e6bee4c1a876e1b586630de150653f87b4bcc0edbf72dbce0a8ba36de1fb3b39506f5edb7c5bb2481b567e1607cb8159c7d0baf2af6def9b22926b89bce8c6abf39efb8b5d7ca56d032890716e302121257c7265f3a7b2c8a9f1651db151949cdb0cfb6b01200c42e7d317438d0e1b8118bfa8565115e41db03abb8088d72347d9ead785ad989cffdd9ba00ba7675a27bd412fdd8d19c89d3657369e9bb10595cf017055843ae98f0ab2f303664e031e833eb9d04038b9566372b85318ee773da87b820ff3af85effe5e58850604a21522e6080b2ba6287e0df4e1d7b96b2f005f63615e68f3ee1e6798fcc260ae163500c73fcfb0d177db6d80392fb270e3f32e71586e2ef8d1c5022f4b9d7d779c1c7f9db0c71967c9cd8e7202e2f25bf869f00554cda1fdc077e0f832ef6d43343d37a9e1b425ceafdad85b5380c8eb6f6abd1f56d3cf075d43c644832e4a6cd0c5eb485612d98f0aa2400a85e796f42c190c5a4df8e5b6f61d91ba1efae9a2808799a0b2a7402c9c81eb0bea785499f5600e4f6e2b8bbfdbde58bbf42a210391838f959e5665632638e7153bec0352bc6c8f3dd3f0f16b0f8549a20f6171a9b246152d7db666bc17c4cd0ffcb3f2ae1844d5b75f67e18274f7f6b5cfc5e6a8cf21db00ee7255aff9670a5f20f1be1e31497f8ddbdcee3f5190a6d0e277fb1ed9ac0bab212da9bf55b4c01b7d4b1137b0365bef9df63004da3bcd1eee2557b6f2845ad51ee4698e15676600efdc89251870cdc3402bd71c55b4dba4efe21a1bbf0e9a0d52da32c2bd0cb58e49d960114b6e8be9cfac5ea2501fb40217158c8104b07319ac6fdf3371b3948d9a30f0073366765808dd39615f977377221a1075282a5ce8ccac11f89993d9a43df26044af4b61dcadb8b19f93eabd43c30c09d986f6bc621737a80ac6bae49942fc54a09adc7e5d827719d3f7f65dcf8413ba0f8fd68ea989140111dc4b7c059e0aaff59ce21f422b778f7322bb186cda9549f683fc814fbabfaa699b2dd0133a34907a10ff48c272841628a153d8970582deb2cf794284535f99effaab5d78e581199886c3544d84b19f8194f4046ef6543cca61e88275f99965cf01c71285e58b7c5cc4e13ca29db3466e942e97689849497121f06cb27d57ebcbd259c3398436f4080568c96d2a2135cdc8b45dac1d0f7e4e944b0e02cac262d1fdb7a17b53a087017833dcb224bb254ebb5acbec479d0c5ace0645097746d9a31a23a2d4e7742000b75472226a00518a2212875949b6259e7994809cab31bac453fa40cba4dab6a72ea26d0f3b7c370636d5228ddfe065502214aff7c9ef538061d029c30822be1847709d7f5ed0457a3c17f5a2d51151ea57bcf0d433b08ff605645fed6ca3f8ef8497d16ac51fe3a248b7c9eb92bac8f1fdb4ab382a4d8730e5d5557113126608cb7224f31f0738aaffcd6c87f1cf191fa2c48e836287b5019ca6aab75bdecdb342dab24a6e57d228311f883536691c8d01bd412a1d8102d1ac486a8b7610c2628a721bde4e2aa8898f3442cda349b3efc8357d6d5cf16790241992684cd95c845f86021334690752ad527de4620b84724e6979564595945d5898a76ad316da3df4e8cc1d3c6784098ccc09bc8f8464d3f6e9888251d3ff01493d6e607002936c256db30984042b8e2921d47496e45917373dc1eef8c42ebb16fad88fd84f3042912d60e37e90c383e80ce56d7cc0838a6f50b6271e76117303e6a84dab142acd83a69fba138377c65668f42d7dd59ae5b8e519c04f7f99d21c49d425d35828b72780408c01f98466f0e1d161159f1b51e4907529f9504217ed6b4d09795f7d9bf0715a049c847eb4c6e6cf977ec31ffa6973ec3d9ba54fcddd90f9b19933b9b9b1b41a060469dd8360b23046d9be5ffdf14e45ff78cc17bdc987b54519e92c5a0b1a074de5cdb2e0321e405adea03f99f60c67b51859b1a21e8832cb0d551d2e5495670bad4203fea45b34a0aa6d87b68c18270b511c4062a84e474338357443bbd9a91337238519fbf0908af928f0728549f4eaea303c0ac7b362957b0855c9442d6bc057cbfd8ac38030e6149ab8f22204199288e2321ac78f0e9bbb550e0ac71ed37edda957462b19ae591e12d1c766defdc33b870296ff116b145cf71527378d544c48e29c360a73f241fb3eaf205333893b65cac113d1b8141e129933f4c7f889d888ea2f342703aa7ad8588cf32aef0c2d1b148e0c36571eb3729981d2e4d136e22186963edfa50d46494cd055c37fbbbe292950f05a0b3aa6eef5816e0be2cb98247fa9089cb6017a202abe7d11f5c4d7308f521254b35024b83903491e277d0d976f6b5956701494b6df7fe056a1ad75851db37d672028c1c7ea429c2ad956fc4621debe94b5ab0c785d902766de7be566e6f6cb362c1daf9345eabd363fa4275038f1032c6acacad41f18cc7d65eb290f1664057777f80c8aa6ce4bf36d9d76feb62cb276b738cf0f5e6b550610f4fe99ceed2db70dcc23a744f413cff24bf9af71c4d2d8b38dc0d1bead76bf760fce7ce477da14f80539533196ce860556a0b1265355eb7e73b1200966f950f399130d8d828b9d5e06378ef6317d1ad09c00b342c1e02f45a89e77c7fb7bd384820e510a0bd24d50b4db1705d6e4b239f4d358153595a017082c1e218245069b3b6f534eb025c1b1bf188fd0d95e04613ebc6dd62cd37697735e371e19ff225fc0e0661087fceb26f534a1fdab6b07e1bbd58835810d09b649263e8e821a37bff9729e5b7ef79936a7aee85539994f808d298bba2149aba8c0237d002dc95e071af9b383b93d971ceecd3d9ba0499e053f4317505402ff09fecca2dc03195304880f0fd61cd2f1b9594054d9ca4ed4c2974e83b552599fcb3dfa805f0edb3de12ef9906f23fdb4a53e9e1c4c9518c4c5414edc592a505e609f849e1647f386d7b30c63b6fed9edd2c7c204939e4f680c8aa5f64297b4d2c23bb7663878abb8713fb1b49ca71b8a47598ec6c35030456bf7c22a846c1accc1aa6c408cdd8ebdef70a5a5fe2933b21f6a93a8523e3abf1a61dc22842ca1269be6735175ee884bf04e17b20e60c73b5ec1530760399154449a636d086dece0c65685c9a3fc9794d8db92caeda5c6c359e8281baefae5a6d123b9cdac1ca4e6c6e96cc61db90906fed0bc9704ba17459a460e10a276c5de9e617c51042ad43660245f13912c40d435fa598a2bb1ab82addab5fa7283e560b3784f70f385cc15bd1bf5b947f7ce15f8aa86f765072bf3fc0165304eff7f86786da3690354c164b298c1c091dbdc05243220bcf4ad098830c954ac7a1e0bea0fcaefb6d6b5c1a1b7b1e21987dbf545058c595604dde0fc1b09fc2d6c63801c14fe88bbfcf14ea420121bc8f69a1e02a40b404cbcfbd33868c69807077dc90c0a48ca078ee39c392f94f048094ffe70063fd5556559eb49d4bb9c170eaff42a3089bde4d7f040781fe2d6f71225a44f8253c738d72e3e76f01177b8a887c8685c4ab8931199261488ba0cc4e284c35a0742c3eab4e132245cccbdbbbf5d83043a5141a164b57bf41ea8c2167e4274237188f390f49c587a842eca5df08d2333ca2896789259216929b65abc792eeff6f5d132c1a02bbbd4b9aa7522e90b1a386c9545c22523221281bd5401fd2bb4ef89c9a57761abc4c81b728c805e93647c650eced8c24670243c17ae97ca6308859a51f28dcdc6a7d6fcf91e8999695d8e9e556b24438d1d229a66ae489c2702850013b49a0728b0f04ee1e973f463487a2016b0f8dade9943f592920350ab2dd345e6e6363ee2d74ddc6a6ff5be5da115da10a11418a0fdaf507091b7a97abfc2fad84125ee284de9d0838c9ba48f5bd5e6260fad6675de0ebdfad0fad0afd4087f422c096711afc0e3ffabe6e146ca0b7811b890f74c038b017be64dcdf1d53994bbbaf54942d736e48aaa8a2cc71135107f088ca0e384bbc4e564474b9d5340c2664573a3a003485c63017ebbe4b267cc2372800f3be097ca5e7b31873f14b30e8256556443551647f703e7ecea0e18762dd675f66a522b6889f3f0d33d9c9344eb943a52436348e5f630500d78fc8e6173fc8df5ea6f23233cf13759f7d11a83628b7da969a3f67e1be8e9ce199fc689d006a7eb6479c1b3e82c4982823a3be097c25598b6098ffc85eda23efa999c0b184e84163999f64f7865feccadebd114bc97203ea18a1821a1e611f4128a5832208f5201b46f28df9311641e709ac41da795a5d8206575fa3f75e6a714e2670b7ae3dad61373ec5057f2c2f03ef4229178daef921508b9f3449e6a9324c4e3d536034c945cccdb76d2ccac72a561bf5dea13fbd9331ecbe11066722f953d60fb49616b68aa5a612d577d6f96e1cef2459e4205e2e1e38210508e679683281b46f124f7e1e6111a507a9546a387f6cac08240c935eab5ab289771049a9513d4ecfdc55f96d1ee454d27f45f689b50baad0fd6cfd25a047e4f2496fca8398831890dd200962efdfc535cf5421062912ef5ff9e3fbcfc7d1420f40fec4cec0d862375aec17fc6a8a5e5f24682007addfdc29c8995e635e4811da1cad917eddd70084ba915f70d8e70f7877dd1f787f0137a6eef21b503502d7996a9ba215d2fb66c290e6e1061ff4ad7dd28a320f75c62efe54bc25b4200ea74611d85d45879eee63a2ddd3c92607b1956d637ce7bb5564ad01252bc3dd0c2d9ef49fdeebb8ddb0e37834f9852732b08619f588bb7d3d6296c22708c1e845205630a45a620f5c6a3903a7b50feac2baa2083f488dc99adf91383530b1ee7d6ad34d1b63ab1b53f2103918d49525488dcf2effbe5a9aebdf584356c43238cfa805527d6d812bc2d73c73c0d964ccabef7ec7a209ad371b7f503e5011a08fa7ae68bdb9b4d3b395ea7919d95dd097f59ebd3c37bb449a8eda37512ebe99bf4ae14ee19da7ca66a94cefb6e022d78f9a4e483fd38ecacdf4c97661dee3abb2593324b769f9bd737784074446538c5531f840e33a146199ffa74fab22cd7c840850b8e0f5863efc184a1f2156d1e7821227c16b8557ec02d156a798a1c1db0f03b037958a2600dae7bc11c72226abdf749a366604c4e0d4caa7c6e1cd3a775b67e78e873976a3bfb8f9c40fef1450a34607667da8edca295cceb656e2c45a648b681713298e8f2edc79f811eed9a4f7c412ebf8069c0a5adb5c33866848b627f7112e425e2fa40f3186d87d8ee2652e124188bcde87440d669d3102fd860522a0c757feb5095f13e3dd57101c705c6bb44712ea3d29ff06c9c3d8f116e1fff9c37caa5fd9e7bfe048e85a03fe0bbe9b336cb44c5ac344aa6f4912591217304cf268453ea8f8370a789bcc106216e8f2593f358853dc00dfe7468a9d5e3c8334c703e69e49e35b223940e3d8b9f3cc738f267d23603c18b39f9193f2f70664dfde4cc7ea001a5d7d04241da32e3a2ec353d5b485b3320c763264e15b88f8fd50d79e254b274021ce21532aaa7c1ff9a2edaa7cf50112407fd22088af0a94f624404074f6d51b06b176b1426f6f2229e710cd8de66cdee5cbb08c53be3d759531b40e60930e603a9f1a4d4bb54cf308d64865d8a01f816b245d2c43af11bdd0054a4dd3347d1e22e115416298cc281f323ce2c79eff401dc789310508dab76a43a833948973d40b540a7a7f81cd6de5b989171663e24567cd1477173b2dfc0f09fea11897d9278761f6f5eb9f1e9c84ac2be016f4dcfac3aa312626be454547b7896dd1b353ba1025f8eafc4cfb376024fcbe34a9b2275288f9de4e79f1dc62d935464bf41b4578be02af255a3801452edb4b4e1bed4c64de3b434168b1ae6bbcb18c0e26e933c3cc6e7eb23791c1ddc23ad4ee5042846c7cbfc0a451f2d16fafe886dae7c7b76570ffcb6af19fb05b7b11f1550a31bb1de9c00566a6d7b909f31642f64005505b1dcac936d7a59880203b78e69b5225e8bbc862d18ffb88792be44352c78d708b78dd4b9dc32e0a0a332e425e2ebebbb1f56d5bffdd566fb5f55dc65698ef1805d6f0514830297551e7506568f7f0c90fa9f9fec174793b7b440224de931c5263c7d00a16ee3e168330c993b471c943a04ef1e9cd896f1da30e2428ecdd6b298f85bccc2463bbdaadc882e2b6c00d82d8b33b33571affa56a6e16371f92cf34dcd7eb459258d573a028739e18ca6de62175e3a0eda061b7b610bacd9ea977d88f061dbc4a9ca450f88c6e8ac5289b9cc3895eabca906e0f6e1d27988d33acaf4955c3978802e3c6565c1ec782b50346b400af7f50ea4b7bf72993674513090764088da3b06917fc93194c6645125d14e4b821f446b07d47d2d1ad5d096cb73d3c87781a9caae142c4cc7145fc7b86435190ba0937df9e16b5af3534f354803083fdfdf1f9631f74d90f9697a4348f10daa72775014320bcb16a76c2c47c4fc46c8dd9cdcec3a10648c124d65a143df72cc02b5114a4b47def0c8d92eb2766b0a2b3ee10f5d348cb4895206c03162e3df39172bf4d06549758081e3dd14fc60b62c3a980914176bae0424f30ba3125d8f9b33bc40429fc006a991c61e907f26689085c9d151d2536430599d17012ecb42de15212524243416c40e695f880a84ebf3479efec03eba0e1b20fb60d1c2b1282895027e67af9bacbc3bda5af8a0cee8d05b902d2f26eaa4240ffdb262bf32c4d3597284146a14067cda21eaf2e6616018161d525a7bc8141069a59debe29a721a93d8380f7869c2fb6aa999e63c3dea83c67ed7c610d7f6560584aff2b083854cf68cea37c6f9a20fbfe053c3a5f38cd5902c35896656dbcd453f4db24a670aea5c34948bafb8642e39bc3ddd8cec20947eacc07bb6817d96a25a31f0d21cbcb4a9f99eeac7fd7284300d2bcf8addcf44f4ae6b54f2c8b3574e09537a5aef0a85ffe6ed001462cbffd83fd14467a21d528e4a749d6aeef6991072a2b7d91bafd0e9fa5ef817843accfde33015ef7409bced8ff5a1a3525d8f95c7843478824479d9ccf5be48428f95c23833cb78fcc947ea01efd0664c5c7f60e72a1be27e50e2c7a0808898163c09fd2732b24bfddd6ff1f8231731406f2469245cda04f6b9d39bc53358b6c17f7ba88829bb7560dfbd2d5168c162d5f5a3adea0e83968307cbfc59a2c79d6aff3387c879794761220a128fc7d4801c864e8be80e4b0afc1d93e23ffc4968a3f992bffd5ee26bb543abd976e8122dd20a5652e0865f4380ef19b19b40ea8dc6382b8eb8e736365786a3e3a2fa707e649daa03418aef1bf40f6cc85130e369dc6665d092e0df56e4dca00b13c2052419157aefecaca58e04ec208b33ed2ce6d9253f508c784e9d52c98c0c82643bfac85a57dee5a4310499aa1e72e6a4c3813975f5ce35459e197215b3e9c6c5790d0bb253962f19d306ae2be41fceafb342f1cf6bae1176e0773d9d85d01b6673361c7cb755ca1c18ddec44b75b25bc22ef21f7ad05f9f47833925e69745c6e36c6cefba9db27864231ea8be7fc51bc17b692022d2c9851d7dc8420fa69ea272ae2af31c581856ae02600d20afd68a8bcc271d4cf8745a3cce38230f2ea60b0cebc020227ca77f52b89b90078e4c8c888cc65ed4aff2d62f483415e0d6780bc0b2172845616188e2ea9516997f3a2fea8d1faa2dce4cbc4d9c753ffe2102654e3f0c54b80758034ad4efd0880b822ab30bdd63e53c3d9aa1f46ae5534bd4fd9840eb7874a0b33ae1c39c100f617007c46cbbd49b308e588bed3b12e4f40c65c25cb5c63cbf9678759514bad580b9888eef6545e406399f9f121315e93da6cf88e9c30702c9b67188000b4b8a868a6122dd67831125fa77c2d43168945e525448da698d5e31ca12d7ca69e88a2e204339e3c491a201d508ba772564eb77a763c731380970a83be293a5fe0c966fa4e9cc4d4e49b67319b65b0e6a41ab97ca167bcb6b95c502b9ae37c0e1e68b0d42ef3ee7c4323c9e425874e38cdec992a72ef4d894d49a72b620ef5a172cf4c743b215d387e85e3899ce7d09b5e5955ec4bd84286fe6f5523a1a97ff34a09b623fda37e332ffc682a8b73a37973513bd8a7bf9489e4d7ad39545a2eea0bf5b29e5a99b5bc1754e6e7eb121f4dae7e2b466465f61efb65e46a602dc46050e3cc4200d55301e554d07bf5130b403a4c035c730de981ad8d70ce662cf34382218fb1f8833808d6fe38456b5f833fb8ab2e001422b9df32897e68b7cf030a339fe641eb13fa0231751d34a1d6e232da4c9bdf7de7b4b29539201f50c5f0d740d31865ee93c278f4798d9135be44bf64ebbf04bb2745cb021387db82717a6cfc0c7b7afbc883e28237cf0e8f1a70f9fc718ddf680139d7bf090dd416797299e9c8a0ee5a9d4152216a316d6a909e92bdd121eb013d34a7642d9b414f0f3669e0e4abe69308747a73874305e696fa66ac6c82b3cdccf5bb058a18252917242393119f2319594487624aa5ec76d5a86d1a859fb72a5b92118e0248321eebe1bdb0338f5003a52affb3aef629dd362de7d40a2f3f53e9e3a15efe6a1746ab227adc1e9bcc3ba9cd825bb0c167f09fa38e6cf2844839ebc610c971f1bbabc9ddd4d6f941098aaf8a3f39eb226c026861a1d22f31184e854e822440c2b839e6f377937f2ba2cd898793c595e4286bbe836da6aa3b3e661f439448c21baae1b42888f31840bcf8a009b8f1ebabc0cf5ed938917459ddfa553adc948676fabec1de77195918e7d3f3cef3c76ad53e1ad619f6e837d0696294b1b7ca717b945d7475301b386e4db3d5396937952ce39e79c7366998c3c6bc8c4b36b1ae6d9e98509c9628491642fccb34e61585d2162316a619df4956e090fdac9b462d2c3890f9bb3fca1230ce74c5211613a955645ce327e75ab62bb886055dc3897da233ff8d0c30a0ff7f3162c56a8a054a49c38070c2827dfb39b4a4adc28b6785f8c2d5f6b8c0446c2ce04cbcbaf065bd503680f4f1abfa4879a100db6671913cee1c086ecb4d260c7a4b39c2ca5bc4c8cb0d06dce79a744fb4c7c30b6b047957e899d739ddbc4445f59d95456565454d86d835c143673cce78d0dd660b7b372a7bb012247917562641e3b62c461e6bad3a9185d5e1f31fabc5c5775270a36ac2b8ede83d69dbaaa3bb2ee3408f60c6f781f9d395e9c9dbaaa3b75e5dcc78464e1f8d59dbaaa2b7eafae3a257d32f181d934e8f1291f9d208515c7bdb6e78bb2c11e9d2fca4638ffe67cf7f8deeabc34fab1cbabd8d2de714ed8906331c1324aaa77c2561cd4555d45981b4418f657b6ca56ab08f3ea6e1053350a925557dc8b7b71afbae25e75c5a2b7ae58752559ac5b5930b075255fa25015527d629c734eee25aa5526722f2333dd7b591d624b7bf66218917371463821ae0817c401bde81065306353b648094ef2281ba39f1f33568489f2858b424c6937e06ef6921eba97adb41761b6aa9ae659db9deed556b1a5aeb2d7b7cbc8dc8b53459b2016ebc56a0105b986220c3b61c3baa2defe812823d221b6b4c78fab03c3a03adfde834783dd8e6f9e5dce7787d3200ead6543c97aa18ce0dc26a693403248ba220c735fe74770deb97775a0d8c1ce75785ebdba4d8cc7e0bb0403628ce8eaa8d786c6a0313166e4287624244bbb4dcc120c8831465c1d35ae4d8ce7d56d624835b09c8b9cbb28236e4a9c73d4119d7bdeb9074403ecd1630c8a5e236e445e8da85707dbc48491f52ace49aa122f79ac46945cd411252ff1d2ad3925e798d2cd70244bdbc4749f4d0cf7a18e2039e724ee75b39c2ac3281b432ad5b78f6a87e5eaaa43a21c918e6825da11f1887a443e2296ce6835628d76da473cf5d512b95ab202755df5e4e08c542fd1d0bb7c4145f73a957c41c58b5a00e7247f40472239e7b1bdaeba2f0392a59905368caeda4372aeae240bbd95873dcc70805a9cce73dc8adbe178b81ecea72f27c486190ef65cb957122cfb74b9865e1b121577c3e1482e27c2f03f67051bdafce65e95d932ce0a1673ea5c95a1f1a262955922f3cd638dcedc902346d4557571adcbb11aa43994b5f56c3ef205f5801ef912592da0a008c33a3c17010938f72eea013a38f72ecdaa11dca53d9205088fc06e381bce96b3e96cab6d8707e8db81825c43af4da5ed683b3c5a8f0fabd5b261f6ca5e9a8afb6c62341c2d47d3d156ab08d3dfce04cb30a9be1d041186d218638c31c618638c31c618638c31c618638c31724e2d77690ef5afab1df96213d35e79e4cb8c69af3dd5475616e5912c994e6c692a5879431a24599285739a437340c9e25e92255997d5d515d755835d7dd49d9079381f36fe1c81ed977ce1766e388a8186637374be454375158ec450773a1572af475257ac6faf3eea13dfded595e8468423528d74442ef9c279fb2806f185d3110dc9178e350ac28807e1e806cf4075c5b1ea4ab2ea8abb1837e4ae201bd21cd637cd61c997d3897578b2c735d823940e45c9e2cf7773bd3ee45e9e4fb8b95edf2f2fef742ae47657a742ded98c5c7e6214a435015e2bacbac8e30af3f40006d0dec59e18b9a753ccd320f73077d77533a412d9671f7eec32fae48b84cf90646018d1979089de017ee9ccd3c3197643ec6faca24a84c9bc7d4584893ed692846812fdc23c92a5a323115dca441e538a7b9640a2bac8d95f60431b359775666673e7fa803a72d1a72300433122e7e9bc13d920221ef922ade411499e0675701a7862446ea583f6242222fb2ccbb62a834929e59cd29b1e57c31c1f5f0ce8181ef6d1206b18cf3ad37d8c6113387f835f1f79d5a0f4d1600c3b48ef38f374904e4def2031d8f1ed2615ae0a373f77fa4506699696425474902ad8b0837cf38aa783f0aa83ac7c68d2a7eb9110cffa466cce354ccbaea42cd80d6f3c45e286c9877846cdc259dc172d5f74dc0b84e0c142cfe3bb8e29a594f26532503a553e92c71a14345f7c6a77523a9d52ea4c0694cb8f447215e72024980c2cd429151e2a64d8b68db6f8dca9d3ef078bcd7be1d2491a44838e3ca541434f699091a734885e166a90b2d00cbb3ba9cb18281ee30b0b0f4f4e491efbc58818724621d1dd5c858a3bdd08152a44aec2eb4db9a18acd51fc7471c84f71df5c6a3e3fe5d69cb817def06291972e43fa52b4694e9f6e9b26f4a89169fa89d34f03a6afe1fcc4bbe99dbe4ec5f703e77e1f0bffc142c48016ee3eab4cd7823af54edf74944fe42cbe8fa24c5f400b779fd194fbf1790b15d76b16ce698779dd899f664e9cfbc1c2bf8ec5e7551a27ceb570915471eaf94975cf915051f128f4339a0a96bf7aa5995e36fae6536b9d2da9bac94d7e22553845711557397194a7789c2e5d569fd34f43c4f9c96dbb2804d8fcd43a60f35d78e3a587375e73cd372f4999a3c57745683e39378576bb28ee22c0e6bb4bdab19af4e9de8973273e2f290776ce79a269b78813e76ecdc9e70d9366fa937bbe22a5fa3c917cde109592424271118a8b5044f4134d91530d45e424915392a852aa427455384985537ae29344f239dd844e6ae254b0289ad75cde9373b571e2a68bb2515d7a757943ee4fbce6c44d5a75d3c989cfea26ef621227a6e77eb32fa54cf1cd316781e2254ff94214ef34cde4a63bb52b4d2ffbe517a2d088270f4d7f3af11aa2dc1ba63fb926f7acc9f49e97bef0c67bee55199235551b2631be211aec548843c716a38a64c7b9ac321cc71ec7bd7fd643b0e89716eeb5901e39faa25371e3ae3635bb6d54a5c1934af3a00327561f9ff0118a1770e19985c7958c999951cee203d2044e1231dc350f6344977827e04220f1c36e28e72fc68d4b8c1ec0741122460c19c9c717d8506be12cbcc5d51180a19816cee286f1a23e95ef84dd53c721b7f86264e1fbc37f1a6c6ff1c518f6f1163ca3864b0c165f8c2c3e46683df8d1a70872f82ebad8e86384a08f3e46e069f9e8538428bc0b10f1c5a547e70750980111b07024a65f484ae994529f224031e594d1db6bc4174f691dc39e444c9d383b12f188983a399b382c3d939ee31cbe3d14a2c5f6f0acad0845a3e72162cae4ec3362cac4d90f105329ce6e125f9080e1e74a9cbd469812ea9a1a5489a7d349c53b33a81ee5da16745ac535a79546acdb666795d17c7e359aa35ce36a43739477dab7c239f0d3aed8bed07bbeb14115540c952f74d93ca262f439513d1fe2c8b6e89bf3177dfb3808c3e0580486c1beb9a644f6996f5f76f288e22abe1377d15c5c80a6c9354ff9e2db2dfb4cf3abd9baed9b3498b39b38e457226a70b0a78f7d3cc1e36353121108c3b718be45950c527c7bc73a6d81c8e213f9c60a7788c3b7afe11b8919d89079a2d04fdeb6cd67e26f6ef39109d28e85e20556f868f3fce1909f4d7abd067fb078d162e2b3b8ec233b15ba088104d0b727d1712fb0217712d10789213674892a9de2c4119d95c6cccccc1e8e4f470fa09d6bb57335b034b03c02cbf5b0b1b2f7143a8fcddce64d8e58b6799af4b8aed2689792a71730cfbc71beeeba28d8b0719ce09f117d4e1cbdc4e91d33fa0bfb51a4d8d2cedf8f2a3dff4a5ecbcdc0868d235b54da79f36d6a9c20dfde3b9ac71a2c8e069b03b1a5319fd1dc98b76420a079430e0a2dbb6cbc210f7d681b07bbb245041bce9b79f3e2decca15378ff305085dacb79a7773d6d7adf2a16f4abd338ceb54fcaf82329a84ba9cd214ecb384dd33ccba4742aa56b1afdb8a8a2b1e5d1348e73ce6734a679d7611e6b947a3ea3d98535f11997719452ab39a669ae0635a734d31cfb385965bacb5daf41ae55e4de89534a29added56f92c1fa899ff88c167da1cd8b4e3c6a218c3771938997944876b47157d36c685f0de798cf2125b2f7b2d7b4b0bfa354734c86761fe6332467f3b1dad8fce4e337f99660e608c325b4d5fd23558fd1de91adcef1c5c2645e2b769b5e14cd53d19cdf719dd13ebb35624bbb952f36224b07940811463b35c2b74f201a24b6b46f1fe5b14394b1797bbdc3b7673a2c63bbd92ac341a653557c06e59af3c043b5de9570224c0b27752492c7f85262d595124e29053145bd4f4178685d3cd4fefbbcbae40b103773d1eeb52d0c73aae2b5d68387f674ea3ccc12f1b42f3e89d56277f7d06a9a691b62492c124bf4c25fb4bcf87c6879f183fbf0c25b5ec078f10286a35ec080e12db6cac068b921eac50b1f7e701f5ebc78f1e20586522a61dad632dd8d456275dcc6e22a11d431dfaa0d0cc31cc3304bc412b14302e0a11d12004b24009f6ddf449506eabe3061588ba699bc45c34c32260cc35e4cd0dbc11e3c760f3df4a0395db1ad70e12cdeb1077aec978d85dd8d85b26d2cedd664be39bd251edb132fa93296ab8cbda1f79ed36fa381720f004e3f156fbe1dd22f3326653f15b79f0680cf7e288f7573adc4922f40b838c73a9558df0ec4e7f2491e5cb0ac00516e381a42e2ef0be987251f422b57be8c85136122d71afc337102dbc8e647773a41577898adba0e896566661d1f630b5f1e3ede466ef3221f9d9cb8c9c98989db3cc94dfc88cac79f1e58e17f7c20546ac3b7977cfce9811ade073d867e7cc0e30708ae6ff9f803849eef62670789b384237508bb201e3ad8b0ba62144c305287ea11e9543add2e602314d0f0f3f72314d0b0fa9fa123bf398d12b0f1270eadef220e1b7fe490869b234f9d4f7a3c753e7900aa4c65b618866d1bbda1f628238f2d7796da2ac3ce7dfe1ddb5336a4e3669d07efec970df9b21feb61f693b11aecea3a9d9c74f2ac519ebaac3650de93382a29a4678e2f954fdfe69d69e43192bc064d1e5657758976e488788874443d3ac51b90f62decb7f0d8c24d2a3ff2d267f323b7d5d4e068e433ba7eb6880d62977cd980fc7ab65d0b2449de763234f2ed1bf906245f628cbe01d96e9bf19fce5ebfd9d969f2cde7c76d9b6b9bdb08f3b974274ebde3aa0cb5d15ff2ef5382032744b0537a512728eaa1c4b1c17e7251f44a9e1ddd9541ee88a759fa47103e3f5b9aa69393924fd3896996463d417c2321cd326ff7b2e106b415e95458da823a555372a0ad0b1146c5db3b954f89d19f78e90b8ba00ab0110a67d8f1d4995de58b5ff2af1a79552422d59783bf74eb9192377aa2a463094f5168f346ec0b17e82e9c3958d474d4bc34e0d30b565786a441996c480e76e4d2a5fde2f3f0f1b7f08af2c5c1a27c8402901d1f7641b5f37088c784780c5b794ce5b14de260ae459fcfbe6a44e2c8973ad42c2d5a7d3be9862e2e20e8277a650edfea3a62c32ec853752aa43c1e4ea7c26c15d42faea17e89315d501b783ef46ebe3dfbc986742a92762c0bcf56998f7e21b1244b7beb896f125010124bc8b7ff504f886cdb56e44f2c50832c4f528d7e7c8e580dee68b084d3606947b3b4977c04f500fa128f6f0f495d133bbee4a3c14e6dbd35cbe61c5f4a1bf8d4a56fb588ed8e868c5a70b035f5087f07075bb3f9c94fdcd7c2330e959d3e549639f827e7b2d3f729c143a41b9bd3e7a8937f9773d167813ed4e9d2804fbaa943f54883318a7cf32eb34045de60511b6a73156fb139f8998b42d47669c0cfae123c44bae994a3323fb9c8e967811a3cddd8a088067c92eab7965444a56803aaae2012d0874de4fce641f2861ca04decd85cf46d37c4fcc4876c56bad9aac12ee13c119b53afd506f58d52a774a36eb0d9aadbf8637ce982224b8fe6901d0135d83cb6da80021a845e3a951745039254451aec1cfcf2926e1aec6d44a4c17e5169a05cf30c888f7c1950d6eada60af8759eb3a1b2ca720b6b4c459830dabeb7e19911b7ce4d94fd44ef0a94bb2b4a77da894a7a4a7e1f6f4a973ec2a33223202ead44603e5279fd1271fb5aa575735d2a99f116b34048752fb22719aa59d4aefe8f6f98cfed80ac1df7cbbb4e4dfa7042bd1c4cb926f5b097ce9f2dbbe38bf8bcc1d2315897c23f2230fb3a14ea8c1a6375a97af2ef7f6fa922f31c6b51b824e5f74bb202396e2481c148f8de279d9cadd639da12f57269363b75383a5b72673ba79585dde37c35a8af37cfb79d565fa50e24cef824cd535254e381a12ced025a43c269ee2dd0fdec93749aa7e891950a762bf30657537e56920a1cbb695786cb0c4bb4adab125be5db9a3c15be23f82f0ae069292bb6d5e2b033a86bd7e254de0dc301180d74adab1d5257754577555d7bc1247e6b46c185f5da485be9d622fafae0625ce8eae0c367e17d405499c0444d6a8ca4c27b148acf8ddb6699aa6699ab66d742471aa916649e9d2f02308df82b8a521cdd29d4b104098380bc08560ca33f21bfd52c2912c4d62a74094b1b1bc021998408429f906f4eda55689b5795862958674411b503654c2912f4c481616cbc85a275109e7491b4b1bc2ccbc8012ab4193775c17d0312ecea52ec83a8a866b482da01aee82220ca973d2adaed882862e68c80249169691ad18c6edda057dbb05aade16a80ae073214e252e4b4a3f4e2e1b9258262e4138104038c7001104100270972080f08e11c01723102b58541a364dc3050807e28b1188d0c4519c45a521f989b730397114f7afd2d82ca1096f0205f3b0d2ae138f11c3c50504dd4fa7d09edcf0c47da8342437f11f2a8d0d13fec44dbe3042f1262e6b4e9c3472a09189a35cd2906ae3c449ee439539b921bf89c74ac3e45e52abc12ea15fba6ce40c2497af63484e02ea143b69080f9546e4235fa932a34b02baa4568cfa2dc1ef55d712fc611754629586748a3dcec97c00ae2101cd68d00c3624b1ea119c6aa40e555783ed65b021c9f5ed242024e4cb4a0d3984102e128bbd446d02d00cc40e1db3cf88061e9ff2ae9d6fd7523ef4e6745a435d8b3794a4d8606c90c3d9299f5acb4a8474ea76764ab3316f8c604839044c1b20bdae36a68da952cd1c95081586d18ed551176c7fa8a2c232e26fdf9ea33f6b3a431af35a6d8a067012d1691436f0e163143620f2d3767c43a9ed688cf3464f8f2b245e16c201c931733e3d3e2c44e2984f7d9eb054c55d6c73eedba647e71e1f1fc67cb84788d4b8c7877bd84748f4907b32c0d247628e495476f986f172a0c1195d42ae95eec90ae7fb70b9f3b9868c1ca9c1e21e1603bdc817ea439e7b689846022b1f6ba8b373909d6a83d284e0634dbc1cc49581666997c286ec8383f8e0233fbf25d8a30f0a54df177d4ee05291784429c48b15fe7025867df1de4aa784a467f2867cbb3dfdc0bcb115700564305c992f80c2c8d04728d460e4617c84420d429e8b746a6e5d162cbbe4f1b1a343a5d3837f98d5e01d86641c630a9322086960c3cfcf3ce49f4c4ee0ab408377b04326859452cac8524a6666669e1bfacb2fc4a0e9180bf1e5225c176cf4798c9919c3be0006396307661f599679c6b7463af73519db3073286fd8c4c74a13a5f88939d3c0e00214499e357a6b6ec42ae454e186f2ab90934929a52449414a29a5741ad21af61fbe86764522cc122effa3ba7cc860709b267470e7b15eefde9ca025c6739c9298cedbe58b98bee48db8f1bc83095db01b4a295dde1f6113cf518a97f707c76d087b47eff8f6286ca023e5f700185c802249cce6fc853a9e6b6e44a190f4328c4f8002cfe3e0c7ae06a2d0cffb43044dc42ae4c4705715ab9013337a794376d36f1e2b0462157262b6ab83f38f430f23d8c0083c419d8736c6749f6afa80053920010e94107373829698cd714a62b89b13744ce7380588d9dcfb700a10d3e930c2751cd1f97675b8c6e2e3b379185b510e2888c28f3578a10763c082dbbc6088126a500328808400879818c31de12a1555c267e003034f60028f83725cb05fb8d1d120690a0c74b9d5601369b0bd2b0c1b72916f67a11b2924a8d52f1c533ac21d86fcf00f83e1a7411a52de2f482064c4209e9757d6d4275edcc10e3ce44376fe19c23fed3cc40ecfce3f9d6267154f40be441ff6918128a4c9177e82837cafb28e4142ab8eb4aa6f6ab0633d7a897a5524b21ed7792aec8dcdec4ca8549072105a8f9755317a8cb1e3789950c5172539abec28c6d11755ce844a87e7f1237d38e68b461e6fe8d6491e5a67a24155185ff6b28e069b34fac2cd1bc77cd10def3b9bd7dce63bb6236b49de914824128944228d4676f4690d0e3568c4fbd8f5da3e3ed2385dabe40b139e8ad3822d7d3a9aa59d2362c3f8e2b260392cd890af602b141d959487dcc0ae20237188839446e83407b2bd06cc230ccff0905fa8e89b0b2afae63631315091fa119a5f1d40e23d82fa7675d0abe36a1a5f56f108b2cb846469c72e0764a8c5189f08b3047f50fbf40f0d78e2104f2e8289b48f4f6ca142689f964d8fa06280151524dfeea0c6110a572aa436183a80abc78f9123ad92ce6e7f7eda277dba8c8e3a82ba747a1bc82571648e7ce1219ec843af97d8c2c989f3257da6cee46997d4912baafaeeee9e973b3e448327201bc670913f400a64630c4157f404daf4187d02f15f7c891eb27c98125f34e98c32826f84e249b2096ebe42386df08dd363c70e1e2b2fd8507b9c36d243ed52829d392e98382a6d460b47a5d2705aeda13657dced84d07e4f8f376c979666f435ed364a8fd9f33cb6446718d8eeeed6e69cf346c9c2df2c5bcaa18b2b61262bd0a09c406c91bef98c563db3e4cbe6b225659452deed52964abed0a15eb974823a67aa54a8a60e70aaa6d07451d69547e86baa321f79e4f53c346710ce9d9e4e4d9e1910092264fa74409647835247e6a0d8339a011d18f601a1d833b789d181f9f423309fce3ea767971543b23486c918e1c229c1c63b7b8e10135f443bd6454e711e9d1d966592c5d33ad3e2b3ab448b9f4eabf7a241897d2a0d4a97f5d4a074ef08365c91b339ce961886794bc6923c27c96864de8ecd9059015eab3306f8ecd2db8196be02f2d09094278fd3fba402364b6b525293063c6b5d2410b29ca6121369d55bc10a7226cf1025e4f8c02f73357b863c4685885101d30226d4369bdc75b5ab9ea6712e64434ce83129a814422493979438a9a4b31d8c833395105fe81de21cc23228b32686f885088259b8831458a0ee9a3c3827e7db59583e5ee9d01289a99c2c9d0b004c24d01736347b727e348e8b524aa763d96b6808933de144c2f774adceb4d5eaf46dd5b3c5b36d753a27835c40405c9dde6d1e7dcd15d66218d86b87bf7e171fb300e0e333b330af00542468c7b5d38a2dabceab3293ba700e00de7d39b4cfee0f0038362459c65c318c06c0c73c3f7847b2b876269129d42ccd328cec6461ae6886d56a32a12cee22064ec4543d78d11dfa6d6f9b4e16176d3f9bd8cf6f6621825c88623843a43b2c63b618c66cc3f7c402edc1b753ef28cbe7e2cbb2a9692ebe18b3f558e9d2e464b2501edac3726a1fabd5bb747943cdb69afefcd99a938a421319c44af7560cb98280a80f5a1a2667b6b9600100dde93aedabaf7143b0947ac7dece6ad5c3c353bbc7e84b72124725555227a7c19cd1a473fbcec5c73100f8daf5a383825eb2871a1cea978b2fc6445b65a8f6a42ffbd246bfe9b5485efa8a2dd897749ef6d197b359ba088dede76d202300d19767e2f51b6c880d69dfa4df0f16df6ef7c4faa379244bf3344bb60f3634a54995a14538a9329408ad160d629b48b75a2726d98e2379da274f8060a3d7d139a767ce416ce65dc9d3be7ee90dc1b2cc9cd1285586a27829292c4e5908b683d02c92c776efec508e30518602c1b27729a2ae8aa8b397fcf41f2e9c593ec9f2f981f49140b2e5fda0c53ca99c939fbf9ead5e83a5547ae48cc5b1e78ce50b62408c992d20961e19ca9eb05233a255e9727dcbd0ebf9c0b2cbfefa29673db05248060575ad1717765e42429dc29e073b3f764085b4acf5ca02ddf17440777c7839f0707083d54e84999e0dbc1aec7834b0e15cad9a55e8eb455fd24fe01203a4f39be927b031d1b5086361585b823a0ef74e7155f49e0bf1a293d2b39f894ecf7e25af61f62b655a46d23cfbd9dfb66df4f772dcf4ec277afac51611a006a790779d67bf9a619ef4a6673fafd6550daab5daaf7bd19d2d11b6c94c344554643feef99bad6f5e21c2e04284d185d8d29e850836c68db2d168e4d96ffb0cb3d24e3b5b93c8049a451aec20ed49d886059e5b60b09d84dd4922d92ffb92673f6c7e3f585cb860617171715c6258ee6cd98f7ef6fd60f1e9612e5c7e3f6e4e6063581cc725c6859be86c99ec047afbcd3b5bd3b39ffc3b5b95ed5cc94c1f0df6fc7eb0d8181697ddf703c72586c547df6cb57c344bfba9cad0d50ee7e10bdd697035573ee40bc6751bf66143b353f16243b18565731f6243d8d0aa53743a9d26944a135b9fdd7953a76aa278b695c3fef4eecb6173d8cf2412e9f568318cf69466192a22b788ded93a7184c132394f2991b2f0d89a38db93124f41cdcfb31e405f711e7cf01f32b79e65cedfa8c4b3cc7d9840b33589ac58e1fe851c7877f619ed28b7374415d1c2338bba365a6496dd7d86f42f744719b170bea1f5ec8638e617b1c2ddb3507b14eada58c1a3cc597ca13b09f415a067d6476e927d2bb21560687dc525e5c0da8ba308d0b35b03fa8a5be38367fee1989f5d1cf3c1910f4ef21f7828f1cc871eae9f7876c3151e783851b9ae725554b24fc5fac8553c1b5d153f51f1ccfa0d4f544ab2ec53b99f9f7c9e7ddf0d79e4a31b7627dfc8d99ef8e8c447d928cb9e85f3ad415d948d12672f41a13c854589a7a03ca5c453521c351ab5687157f86cc91537d47ee4aee28ce2f6cbc1cfc29b2b4d89a7784c0951a194b508c9e25bd1c2f9731f7da1fd9177b5c1ee374a3bf293b7f86a505e5ae12c78c58a5b83f292d14d71524ae84f7294ef872a7332a4526d987c09c95b541993976438d98e4e85f24b9e7976437f6c8987d94d89b7fa4bf64b9fcdd3977cc186b0a1ec26c369354b3bc9bd2a439148d9c2c3848c4c2233b0213684a4532126c56347a48830f108237eb870cd858b8f22c1549a3672ad0936092480662b53699ac83317dd0ab0a81308c2863eec08f66ab0e3557d55862f7db580be18fbc9d2a3914ec98b1d696c88426187b854378b742af4b119124fc7578ffde2c2eb0d35a72f8ac40557efc667bf631afeee4591702e9ce35c7c93c8d04b6be16871a04565624a2dc4172c0eb1255fb02129bdaf4e30c496190666e938c497c986d734c3b7c7d98aae6ffd60899348b3b47f5586ded9e29b16ab58754a5111a7887acbef87f91a9aadd99a2d49b30c05d90dddd9c1cc40773021300160adc1b27df661288825884922488150c75410312196415f0c23c4ccf0ed2e5c456f88e5682f2900aacc3c0000ea8ceec58b2a43b39f1f7dbdb21755460ef1a2c68881b5a4c1b2d37f354b07a0cacc9ee9637ac15a9245de70facc1eba84d93385602df932573d571d10405499797aee69b0eb5ccd1576047b61432fe8ece9d4741f2aa24ea5734268e0f43501a82e3060481717fa6a100910d59381d53ea41489aacacc4b5f020882dbb4202a4de643a5017a31c2c4ea8946d62379a512936772e2a1789ee779a714af390851e6b7fba1190654e8e24ae840348f4032d7be25dcc66cd66e8cf62d7104ab542a2db274a5a1f1c0f653fb1aea9df61dc1deddc053fb36df795b95412da0bae70fa8f7019144831a1caeb789b18969ef94e024ff4defbe9bceed77e339a9875522be3ec660185769d0184313c467de791e901c6d63aa5419909a390eed1d939ceca4945e156d37477fe634a36a437e0d119586cd53b74038fad6191a24cdb26c933526a64e729b67124ff14573edae344bf3ca8a26f262e4183baed248e0fb29e977232f46186ea369e862a7b4b6f92ef3b42f9b4e69daa5cfe9527a365dfb6ccc2f472f01831dc7e96ecc7709cc7168df71188d0eaedaa844b44bcf2a0d9bfefe0ceb8c251ab22492e836ced3e6a494524aa9b7d5fa718f66e94dd3a4f4e24b7529b76dc5a5ca695649b30853653853908f89105b8a105b8ce0c9c0ce0f39c877adee496fe73ce9c580cd60636ce9f9b653942673ea1e0d79edb669739b35166426ba8efaf4acd248403a752480806e383d9b42504d36d348e027d7a31591213c2c0f863c0f1fa1e0c1cef740f5df47287850e4a18841909e1d2d5c0108d0c71f202c2a7cfc79e2e6bba01ebc7a30d48321ab9f9d4ea5b8074224910fbd2f0d693a28dd36cd375631e1c1c086b3e789069be781784ed850e2084598f8f1e303fdc0f0167fe1eed75941f1e3c78f1f3f7efc151e7f26898ab7f0cfab7bde39e7393a4178ace2c73f398a5b3f7193928bfce3473a7211c2027924678f3ea3af748ac46a9014825d50e7ea84b460c32e880b622dd076652d825523f86dbbdc059570e4cb0624b5ab7ae6b0c09c8ef55a16c8b37cb3b0c4ca6827546295582516bd5d50e7b240a9edfe200110f6204aac12ab53a66c95f990a9e1128ed4346b4f27f7124e09c70675aa4663be71e335679e0fbba02e68e7db3ba1ce486bdac622b142120b73a69349ac18315c5c40d05d5ead411bd460b7e44b09a7bdac25814a385dd050f7ea823a17c7b240d95017d40975ae06b321ca6387cc56cbc3fecdf9fe00e7a3139e10f21f7f80b87e03dadce40429564e9042a785d7020a35e47c1451e8f1ddf55a3e0fdbfdec10dbb24490782fb0a1cdcc14adcde659c6264b810d37a0ce08cbe06fc7f9b00b6a51cbb001b177419202a5c196f8e62d823ad51db1ad223f3305910667a628e2f1b01bd07667a62892f1cf0f749e7d8529653333454bc5cc14ac4e310ba83bd7b7faa50bfa992986fccc14400dc6b7899d9a45880c61a5d49929583f0dc6210dc69fd128ecd950a74289333345f6621951851377f844983832d2a988d3476c8f15d23c563f12fa1eb9be7d2649904ec92c7c7c18df4c92204227b5864aa8a753120b1fbfe59b49d2e332a93554ae55a7e4153efe8b6f26c9aa65aa3554ad9d4ec9d6c7f76f26c90e5049ada102e2d12969858f7fbf99243c7e4ab586ea47a753b20a1f7fc53793448745aa35542c9e4e492a7c7cd437938427c8d61aaaa09c4ec9211f5fe59b4992e333aa35543e499ee8949cc2c76ff1cd2479a24884e11aaa223e3a25a5f0f1bf6f26890f22b5d65011e9d12919858f5fbf99243d8678b5866a88914e49d6cc14467a4418aea1ea9144d52909858fdf7d3349543c11866ba87892ece8947cc2c7e7be99243b846cb5864ac814af4ec9283efee99b99e2b5a3d51aaa9da04ec99f8f8ff2cd4c119493d51aaa1c57a7a4133ebefd66a670e94418aea1d24972d329d9848f7ff2cd24b909426b0d5510a14e49283ebec9373385108f596ba8780c754afa7c7cd33733c5d02ac2700dd56a8a239d924cf8f8a56f668a233e220cd750f94882d329b9848f2ffa6692e0f44418aea1ea892df167a640d229a9848f9f7d33532069307e0dd5131f6b0dd513b125fea440fea50b12ea979e3dbe278fefb9a32592ef23dfd2486c5717bee7208774aa913428831065c81b861144f6748ae4ed5248a77c3af5d32956a7b4273ab54518eafc2f31e66608b247d0c965d365e1a5cbc2459785cf14019898708ac469249dea82fa86656ca39144f253defce61247962e8b44540b91a52918342a344ad1568344684f8342a80ffda12c3a048865048d3545c39cd376369d590a4dac59e3a694b6e64d4aa91b322dcb382ed3328f2d886459966d1cb7695b966599a66959092247d728ed48276ba7e631539e51e076b19a464f0dd2171ea94f7e3a79d644699239a7c934e7a473625986516cce39d9270ebae883a51e596b108b314a52120d62a176ca5662e4cf6cccb22c8b4c9955b02cdbb62dd330c6dcb331cb981d3b43a7cde8cccb186bcfbc9d9bf3ba6ed7d4a0c61fb3a6695566dbb64dd3b8aee3364ed3346ddb36edd6382684e6ee2873b7f48c72d36edb2c34d3b40ccba67ddaedf1c7ee1a7a173f477c82fc8b8f51f8e0fc9452466d487664344c8ecc24669e52ca399939c6a6b465478e57901846c2a89403dbac9b49196890f36992d2b76ddbdabbe79c526aad4d4d4e2a870da31b866954532191e24f9714c336d6b46dc3308c6618c7655a8651279c0635c695523b6012c326c5300ca35fd3d9340998c4bca58d9c24975262f4528a6152caee99c96fd2d9b227d06753c64eb5679e656fec5b823febf64181908f9dcabc39e7a4d8c5b02c9b734a496da6cd348d62544e6b038d4ead6a9aa631098906310fa7945c95c94c27954eb1e6ddc694d22a93dd4cd328a57366d8a48ea9ba8871ee3987b231fdd6709e79c8dd2d8a25b07ee563144ad0792c72e1e438d27c8cf3f8d94bee6632cba69dcf6d8d45ecd6d82574f16324b6d9ca3827c72bb261e6162c018991223ddf431c6063144c787d47d183e4354b00a1972e893ce6f4e7e3536f3d8b8f501803cf7788612866073f738c331cf3435662f439e67b8e63bee61dfd36cf9cf38d7a165bb01b320d7609b3448ef9913a8a067ca7281af0690d8712455114fb32ac318f32a81c18b0f9f8931da539f8185f9476e3f685b353147366ea28be8c7df30d363a0af3e8fca1300f31075f737ab14b03be7639c6d1b3ec58cb81d44c1fdd3f9a4ccd82519f9fe904061b9a3e3481d235a7d3c1ef1cbbdd1de2274783db308cf3507eed1d6f5263f989027fde211a9492ab452ce7a14986e55bbb21f8a1e94de0d315b9f14c421757c26ebdcc5e6067ad37ce97909743d09c03cfdbd75ce455e475e455e4da26f2bab926724d85d7c1c186fc284ff3503445d5331f55075175d3448e9aec2291a3a6673e0a51534595114d5495a937860a0efe9accbbdb4205a54285b5a7aa7db66bb657f3cdfaa9cad8cd316ddb6cc96de992aa125ce221c9ad77db47dd9250d6332f5907dfe4a48bb297067cd32d216d1b931cb579e6a5eb913c446d295506b55d1a3086a7d54a337aecbb152f762a8b95ebd7cfa3d14834aaa22ad23c91c6719c7b532412cd4c91ab563755991af6cfcbf6d0a382e8a753a28b1a0d29a9445417892e6ad43f9d42893cf3e8cdead490d245892e0df822175d91e8c610d22959e3ddc322d744ae79dd5cab5bd5912fde8a9fdec34fefbce36164ddabd647b508915791d7ea9b481bd591c87add8a573fad41914f9f9de8ebaf5fc89546f4dae8b5500415d53f72f9fcf2475f0c91b3775e9541d180dfa0e813b948f3ea9de8a35e3fed7b83cd5023cfb291835f5d438d5e24848ed73a9df7b29975924b3775aac6fae6d2bdda95684e725bfaf8bdad84662be5e0b7b7fa46fac2cd47ce559a6a63abfe7ae2a31a3efeccc1e73b175eec14ca8b2decf1c3facc36e4874d3cbf0f1db7f9e00315b5b6b5c8de5004bf5d6d4a8c4eadc1ea9d148daa8bead5bc2fd4bad679e9fa1b36ef75eb230f3625be62e8e24a88053df52ecb7c240be69856b24ec26ee6d6bb49234c8a361a7977f2d270e4a7a378878a450c11f2f30c4ffc746ce475e4b5a2a0f849736637d161f5f10a1f7f5e439e07ef401eee0d55b8b768a1b2929282e22a5506e5e4282827140a8a83afe2271415540a4a65c50a143f6a854a4a4a4a8a4b4f4959e97cf0bc1f3b7acf5b6a6c940a15fc27a39163b5d2308679fde2a3541b239451ad1c7774caa41fe5c6d3631e23064af55addf3939baacce9a2eaa501bf7abdb1c1adaaf09377f5dbfcf4a97883f55027f73c36e89d1c7c94abb8b1c17a51373688633e4a0c948bca311fc595183d8ad7ea28282e516e0e7e13072b0d132ff1ce8587f998fc74b2d6e73351e6a58c09369c443ecb1c0c4426d0cc9c74e2395845f5ceb39a3a59a34ac39a8f7c546d541f79ac18e6a31d99752e1e4718cf0936ec9c9d2cf391772feb85274ff19a93a344189467de3488302a9e79a7523dc54f1feae3b7b50814af285e4f5f45f1ea331a75aa5f0efe93f78e4e99dc50859b78c641744278d583a8343a181e4798e8da862259af09b3e6e438f8515cc5f59a60c3cef9cc5ba753a79b72c393779ea1dc9a93a378e6b6d2682794178f230c8d1a13c7c1b109d28322cbbc7d74aa7b742a3479e799f7aa53352667cf7c5469341b26db1c474945986bd8d5aa7718e65e841939d6c3632b1ef3184d1ef31a33c76e58ef0dcfc776ddd5a2a669d3049fcde999f74da7764c134496cc57f0d90b3e73d20deda4c1676e6f78ca7cf4cd9bd8925dd1ed51bf5e3548ddeb6ef708ea1e0f364863341b13f49433e7fced6799c61a96c2d7083c245558eb25eb85cf0ac6f31d5f30f962a30bd12f3126f2d0efc81776354bbbd69a559d76be9d276b041f6adf397c7b87c7041ba30022d23b3e7ea84d9da923558fb57ad040e4e34bef46dd0bd4041b8c3146182578e851ed5166ce8bea4b03fef4e998bfe85496d564ce9da2015d663561072e3b2bc135ec1dbdef0b1b8d250bbaf8ab31048d61478c2419b4e7c040684373419d2e2631bd06bd3fe641cffda2d29a6f9ea4f559e6d345f0b57ad75f0eed959053a89e3a12cf39fd96f870f0f7f410f32ccc320c4b40a7b0ef315086fe5ae6e1095bf1d7348f5214b9ef06f8dd0ae7d98f1b7a7ee5e38f1b787c113d327715a41c58cedbc32cfbb80896f3ac08ce6bb21b82ef83551a45aa8cb7041bcef79460430dfc4e7137a51469bed2a9cc29aaddf357a12b7273296cf550e5e5f58458140d1afcda45b56bcedf3f9f1f9b9fe8d33ccca55b5384d9aa2b317aee9bb36edc22f20cf4ecf32709cf87e04b95972e7f92ecbc14e2a5a58e83b9179daae17cbe7421228ce6d20710613697de6ddc568b988e4dc7b4898d3c2dcac6385291f4b8c260c811149d2c9def628cb76653a7674bb2ccdb6d44df9047b5886e0685fae4119f7a631e8f04bb1313928b3cca92c49a7ad659387dfc69622e3defec741be5f486fd9e4f9d6feaf4863866d645139add1acf353f312142bbd389be28cd33e619719b9b4aba3bc364937260319dcf1ce5ab7506e57d6b5019ab3af68b5d715de586569bd925e5c0863868a55e83a1a8f374566114a522e5ca3bda589ee665363a9a983993473b367d7cd8496fe2db631e2c837a367b7c8803a39977379c3adf398ec61c87776b1cc3b0ac3d4d5efa4d1e0ca3f3d3577d8644099d76ac922cd34f6ea859bbddf044bae1c94537f4d20d412738ce8a38b7b786fac8db9d60199d76431c336cfad5db431cd467c471172572eb9db34abeb0f0c9e21a11f2cee7a187d6fd72906b5a8bcbe246c9d239b0247b390f71d01f79e7d5b9ad16e13de71c34471df4dd7423e4e46c6def660e15893ef031be4cb7f165866499314622aa73f4a977948aba93905bcedbbd0e728265e44ccd9b3abf7dfead7ce0f7e2c5c535f0994fd163ab792dbdf8d43be83bcce32a3b6ae39dc430cc67e26397b463e9f785fedd55cfdce61b07fd7aa7130ca3f319d2fb32cfe5e4ae26299d1348fb8c74adab0ce5a11e707064c600062a38127bc6227ae43ccc4728b8887c37bd49b39849cf289d94ce97f59e8e79e8c9223097ad65f2458459427a888a98cb78694010ebde6051d2a54bf0e7e37821a37719c7ee8c8a5a8a51647d7c57a7f8d9bb390dec62182dc33eedccfaf671b10c8e30628b84c2b794524a9fc8d22ed909f165f214be5b9260316f5a65e46354b2abc1f6a65376894e563e95d5a38cdec1ef6e00facca7bb34b75213ddf0f4f5e39f1d9ccb96de655e1b407f4a5d9145bac6ac86c87078e9dd659fd822dd4b82c5bca3b145a1cdfbb00f7603fcc93f2fbb38ca2d059ae6ac79c6a2614df3ec63d7fcd3fa31cc1973ce32d7e65326f2d343cbec18d36a8339eeb296619853cce98e1d0d909e09492273ad0714a4e8f1d431528944f21595924a837d3ebba1376f987d374042ea5d632b0d63d8a8daa89b53ee8fde69c565881a474ce0061337393d76fa4dba7a6440e26d5a0de674f3d85d69588a275e7a9669d586e6994ba73eab0deccecbb1a9a8a6a18b2b212301093ccff9f44e6673f35eaa4797973fe3af810dcaebcdaa7d0eef7a881a474ce0061337393d7682f80c01eabf01c2c94a8379dff03ef70d4d9cacb6bf238c707abb087e361381cd3b571fed2bc18f655aa5f14931969508ed862f22126cb8f292d2b47396455a6dd8aebfa8346d34c6512e9d9a110400000314002028140c870483d1784024eba2ea1e14000d92b45272569b88390e53c618838c210022000000000034494000cb39646c351c34ba7268206b62d2221e995e6c6348d69060d32389f457349f44a3cc59e91a5736131e9eddd65050a5061943401f151f8f2d8b2cbebe39582792352e43fc3526a048d32698c5779a49be6b824959cefbc64b1f59d5198f154e4cf4ad3ab4ffb91e35f4fb6ae55148c9ecffef8b084ba22bedc64bb809378602d5c83b4ed3ada1a3b016d405814815a52eeb3eb7ae4c9842cbfbd0d5b9810a14c5809e780029460afc9f33cba8e68104f48fdd356c6fdba6f51f56148bc9ac3c364c569fa1b7c4cd6d4a0867c61961200927049429d529958820edbed2515a5415ffb4db1326e252e336ceddcb2387d77ff3e506374ef632cc87e732316034b04d723d76d17387c509ab705c4120ce2c145dd12743c262e434be909a85dbe7f653b6927b1666484fe4e6fb6d0311530b55f14b7491a05c097d5138d97065b93408a1965d44fe2ed404d8d32e6a4fcc2a2f883026d06cbec971794995522ceed4a67393a6a32528e0706f4c0d495144af5e30532df51efe8566a5f3d4ac9c6f6ca3ab8dd633e2b689865a9d785f9e373ec25d12325e6b8638151f1a866f230e746d3f9419c5e1f87fde2ecbcc83b08bdedc3b901c0703c27520d440c2140762891eca35d9869aa047d98f2640fae3291073af186413c3cc65a17e81846d68adbd4f369727b047b530f6f277f660b9ac6b3a03e6d91c1acb89e1def095344c139ca1187bfd4d7bfa9b6dd542de824d4a6262263469d31ea19d049cc95ef10d73254683a3699eeab77bfcea0b10c876ced0be00002e95a07ebf755c7a7e8a08c7c9c6b23a65917a87dfe8442462f101ffd058f0df71d1ff6217eb8503f84da66fc534cfb08bac147a12c3a1632fec8f05e58a284e91c75967e41ea50048c1323cc3238f9f3f59239ca71cc676f1d6992913d8c25c783437a106a318a0270e484249095cbc84ac4f54a5a8e464e82c1d93dbb3b3eccc33f6e0bb3b4d9c820181698160fb4ad7c5a71f44a3a053166c7c982ec7180bfedd41c55c1c6f67d335959e60c2fc67668b8895c93f3388856f3497603659907633e27c7e5027ebb2d1adfcd6ee0a868dfeb63c46c6a05f5abbeb07cf9c700b1bc90b6de764d558be65a9568be53837fd1f9ac776f010d81d1f1edb8dffd34dc2d55f155af23234c1159f9a5eea9e7f6e9610d45c905bf0cad1022b8db8d9949b6019e60b9fe536263434b7d8e8cfca9d2c25b96e78807602ba3b5cf463180ef7fa08a0fb0d8a744017936bf157f9d7c20efbf3cfdb559bb124154ba128a30888e910e65562e76e648612a44965ee2a74ef98494d40b5beb676fb844bdd630496d24fad9317befba568088e4bd71140afa8d33fc613fd84fd5aa04f3fb15a572a1eb25e8315b504a240ccb7b83002607cc127907997b88c72af805c20402fce09c635560326b1558f56db7f64eeb4e8ff93e594beaa5a31b64a682b7c9ec2bf9b3842ca1d3526ae2afcd25df0f6ea5a404636a7f5339c4095c200c0663608296e111834cac5512e112283d499f151e209949ee1ab2c74ee6aab673ae34d5d49fd7436873d021f3f3098d6f9e2900095ee8832589a32d9c813f0b0c0ff5aaee7703d373f3dd55fd00d536daa311addf0af6fb0d65960802030c1a04774cb42fd82022f662b64522acfb30ac2cef44a3a8caa7440addf446db11c26d637116d10c0ab6a0e45466aca6a8e0338e7e4c0d6a190ca2f54326ab742092e336d671923bd92472731a42f74ebc6e89caff2712dc3f2b2251821375802a54c684a79fa610f899e020cc7d6d41591102b3bd3d12fe39b407501ade5e9dc194d091f2a71f18a409ac832c193dbc54021e6edcb056e8f55d158aed35e1ec5faae143d10bf10386af0fb3a7c3542acb2f6f441904071b1c0c198a2922161a0594a2f5ce720b88be66abb1b1bf80784412bc6e3b48e5f85ce8d36a807041613768fe3538d051299e4bd88ef7ea06e86516f640031a6d067fdc7d8c12c4cb086ecb8cc7351401e05917155b97def93a3057647d8c6f0c34d08cb528572b10e11f8a14989b22709bb57b37fc8659e6f7a71dd378b0c8a3d56e168d9ae3f1b66d5419e1136f979d817cdc8412bb257d0acecb8a3f551daed87c8f68d47d2e0ff338e2e1d5bf59deee0328c03e3785cfccd3dcf260ac039cab485b6c62042629f99b755f77297497c4d5748c048d5a5639205a6fd38b23850e05ab63149f2c0271d93677536011b130f0b83781402080cf7bee3e6b0c3341ec3c011458fc17658e153b59e04f54169889dbee9c80b870af1d7d1914a236c2c57b061123aacfe1cb2262576b12856a4b31ac5819778ec4f91810f59d49c713c7322a0ed0e219b55b5538ab2d43e7fbbcb0cf87862ecd517b408545800916c02ead96281465d5e8ca65d4ec2b49b5557086b6eceee6288ed1063b9ba369ba86a0bbc77a869fc80f1e35d78bf7cff04076a248c54f0c1366f3e3ae38489ce255b37aa17da94c1b1d90353168b2f3e20dee2ee0c4657833bf0999ad9d6971366ac710971ec7267423811106383b9eeb1d7a8a06fb97e3dca564ee95312cf20148e0f953e3a08b4c14b6565ba7f9c7adbfc3130e1540ec91dca413f3ff9069ccd093acd4333486d3149e72374aaa5100b1e4427642281abcdfe198a7a39d126c82e3358611fc2946d9edddbb6106af500fd312881409d5ebe3fcf9acdbbad72a7508957798ea9438414f8616dc30bc4a38e3519a2e763ccef5d8a8f5365835c1ffaa4b52a2c99a9b1f30566b0ed778fd33fd19059c29c47bdc581cd79fa275515454d49cb73681cbe0a4fd95742d8a634d50bd4964b97c1ca8e74e860535dd4136ff6ee62590efcd698dad13469032cb3261895c0b4372186664635598c5daf4df5023a55588959f06322ade93d180676c9f27febff13561fb14c89c0776db9b4a6ef5e4d69c389c44ac54d9a3d48d5b009af1adbaab04fb8086fa1c063ef5529fe04d56bde2e5438d6fc268a19fd01b5b20184397391e9ab1856486b645edb7d51f69ca873af902423bd38d2e086b180ea12d9f5ffa0669ad1ae51136d308c51312d942c78bfd23116b7edccb6a766ce9456edf451e3590f24203d734724418ebe03b6c97d3e26ecfcfef44dc924974f8e26f5f0ff0ca6cd33e7c4db2dc9e4db2bf4f46efe19bf7a6de632798be34ecd9e9bf449e2201297d7beb3729ddf90e0a38bc71a3c96387826e75a7cebe94dda59dba042e793bef780ed8c5dc4f2f1528328acbf7f1684e33b1e7d94f6b4a0ed0a544729a908c88168453f661ec7c832ceb3ffa41b956107e0719c702277e2581817bdba1a557274b0c12e06864a2deda5393c77d2805a896d0354716eeb450ca5b7935646e6eafc36db2a2691cb6155e87ec33323e1a21079b3a805a13eac8173c327a38bcfc7f0311a54e07248a909461bd2971424b13125f6cd6849092969c41cd67b108cbab967b90c0346495348d19ab6fd185c660d884e77b92dc866a5be9d85c4f31fba9b7451c5e64c8b8741af4ad2cac68da1781a8b820c0200a7955e69648e7b5b3d2860aaf37e11e83cf517e73f4b5705afdfb9902daaaa3a88354e119389682c7aacc04d27ed41d61f49476878f874ee2198fca8d4b72e4f033c03133c5aebc0c5e0a90993e2915dff1b107274b3970fdd7c17f813e2077a09a9ce7c315fdf2e74330e45141356c6a91d2ee99c1495fae24c7515f7ca7140bef1866bfa8e2bb1860cd342c6f1323bc088d5357f9619b0dfcc8ed1ddac52a6530b1c84ececf9efbeee527584c34e5abbedca6057e082a07b936ca72753eeb2c0a72a0cb43c4a0b65ab2cbf68d219deef7c236cc03035d3aa46b67ae63ff2adb531d1dac9d485a39757a55f84594b59900e9b92776506eb9e5047f85209b63bc19f2eb4f5f79c7110e5de7e20f5f7ce8329c6979868c1326602991a54f7a787544331c86a3fa66a2398ee0f61b50f03a5ad176178d1cb2460b8d89188dc46f9310db7c60372eb60f2fbc7b156c797547c561ab4d40d65fb115a5a59dc912472cfc22bc84dad78e6c204524a494a31ab0437aeb1a4e7ec7f175602263e57bcc75f5bbe96c898adcc88c8ac31253314544b2c31e3234a3f9c2d6d387162a9f6f58d226e3a6a5e338b3bd62c236aef11b7f1419b828744fdf260193b130bc17923e13d75ba45eddd84da653e24038954d22e9b30d3ae40b5844a53fc683f012a4b055f176383004d5e6ee81f8b1435db517d72734d5a83fd108c7411a17b3214547896822bd2e375dc449942a64de5c8ed7ebb6be8a02eb8da5cbf34b6a6d259c0a05c44669247b27943e6b94b20a3768a184315ef46bad2038a182efc90cc9ea5f36d0b0469de4cd04984ab98428eca53468295bf1894dc3579c1a51ee0f5f668e9f3850c8b81eb98494563db9c96150adab44e79e8de808a6395d9b7a4edb081aca4abd0fc01080f9d3ee41eeb81f8485f3a6305b5268199f9244b1fe2da8a0d98a6f72a85dfe4856e39698be9a2183704675562fc7fa7e07d8bb0cf3e284879672195f25c6d26c0c6a2760a2b11ec73fe9533ceda4446d57b219df817f3c718f74e160936dcd15a8280f8d78ce5c6e58a36a2a44880b2a4893468fdfdad585f457531a9499c1084a4d5dd9a1cb91bce4f8d75c56a87eba32e39620467fc002c696e3e9709448b132784b2367ec41fdd4092fb464527a08cf1c51b5f34d211ab23f25cdf02ddfb2004d799bacd550f577c210a5f08e84cff9dbf3af3278787981a515758387d0dd474fbcf19a0456b2c17e5fd2157a5cb95f94af1b10701e51e40c42cad91083d1a7d50978aa18952c82597a4981185e4f8316d0f0c4535f18f6b5dded58d2cf5ca3379fb6b415352c39f9ed7f974e07569c575de5a4a57e05307d5decae8dc731a0156c1e6ae4222bf020275c90898660b5f0b4aad7761a0bd9ed8d3e8d4869b15877b99468c5abf110ef131361e175820711f816c1ae755c35730433f3877586cc61051e10c33951b0f66313202286ab8c8e16971260c7d311fdbff01c664f828267c8063938c21349aa062e9e7f54d0595789fbbaeac85b2e1c9c81b6371496c02ba8aab586377f1c22e938d9f221eac21615d8d88801d1ea0c625e30172411cb4246fe08329ad7549f6837cd32a2ffced5954d34642d25ea7cfb2b2ecf13589c553d9b8698db8ab48776f6600da9aff951fbdf26809fe52c463f630b19179dcee64229dc9622f841289221a564b2c8a6fdc7ce0f901084e5fdd3805fabdb41fe510a243f1f0e5e2f773d5aab744201c4706974202129f67dd58fdb828a4ebd1b9ec757a96bfba1d858fb0dfed76e588482de644389f8ccb7299196525f088de8cc048a3623f5c343d42e26caee4e60b526c791b5209d650683a9c95d89c9e83244293d69827989989e4a5a76c1e304061916663a7a6dec9b57d7dbd3819e5dd1432c01bdc65c1a1b13995f14e6d3a9bc4659c53326ddcc6e4c368cbe68ce843b9fe88d5a381609e4ab1d2afa3205ce7721d16790dbf4f56c3e3efdfb8b6155e45df9017626f4d9d2c3305708beca836545781181751a6108ea1505c5fcb02ab44bad8d54804309c77db22d4dc78931f9b837d51238de240802fab338123f5c68a0b2e55b4030363c02c92b9a683e8976027d5da7ddfec29e37b3266fe1bc0cfc79e863e1570279c24fbbda821a47d1dd60aa0180290fbb57a7da6ee49182995fcc2e8e53423c39b1102b7750df25d40c00846b5432aafd81e510dcd4c3791fcb8b2cc241ef43e945aa9c01dcbcaead8ead7297b54279c16597d2cb2ad015bb80ef7845a341ed15cc596fa91312ca652114bd744956a8df47e29afee5d8981672282fccb9b3cc03a3fdf52eeb833037c874a37209c1177c2000ebc24b429397bfb0151792ea26726a27da58e10ad47a35c200ecd48e08fb576310118de18cd10d7430006fa5f0260a3e4a536485a210529f87c02e6e60ce1d76d583713cac989c52370bae770218b44082246f5250a492ac2ad46fce4f7bcb7db27f722dc336a6929694dc23ac4d68dd2d96a3cddd8aa139a1cc763f1a54b79119c584fe1779da52b5b81a7b78ad96ae5448144c5cd67bc4dbf28d38faa057cc3fd299aebb798782a0d40dde0105237011e8432df191c364156b861b6be90286826bf610225aacc51adecf871478d21ff474d279fc51748818260d61a18353eec4632c593c30b232cc0f9e479e0c631ad6b56ae0618ee063ee8d98e6d99e9b767bbe485be451050800ccf74b083dd36b431eefaf278aa6ccdaf461cb31d338e1d13d126a06e46939f3685bef49292daa16f4a93ea4f51393acd14437a1b127c83da830b58d3013b9c974a7ec519c93796b6249b50bbdc06f8d2a3052d2774bd68ef0fde08c503d33acf2c4faa9ed6f598647bfe7a867f503ab90e3dc100c40a270bf9d2fe06c4d906e7eede3f8f0c4c31c19df4de24610fa56d863636141996c7ce358f70105ec708250c96c7585a22fee89a27a9255f70da35868efc7b70e80a508fd816746a3a21b138df2dac8782eb77cec1eefce7436287dce7b5513b3c0b3feaa54b09da9333d8eaa14b331027f4ef996561017541a598733370e5df1a7574a5dd6c6542d0e8202cd8f8bb1244d83706f01d45e7785c5c139c1e2ef81a65c624d75ad052b207f241870201b3b211b9bc5830ff21b071bc0eb1aa30b3cbbc15cd4a36bcc1b281572d3aead9127bebef17a9604fe731430bfb01c680c09e380b399092c022cff7b6b3644240f36a83eaa2787c8d658aeafd791db68cb6b7244f53330506876291b2b9feb5fda4168975b4fa466ffa626b87bb38d302c2c2cba4c13f789f713726e9338ed699abbde048374df6f6ed1f2f0f2982b5256076a810bfd02ac1a510be2fe3b5f72c7880b2b3dd8f746237c1cfde9c6ee8bd877b48544b1b70eec14621967d249a0fa234ef021ec314932311888ab6bbb1d48ce36714fb51692b9f7f6ebd0ce3008023eeac60f1e7ead6274449aac9d08e7e7b61d71961902a7a73ca05d9fc18e935b57e8374b219f16f09eb9a7883c00be2d0dee4a1fc0131e2a3ce12a82169733e702963689c9da6eaaf0ee478aa830c871c6324cebaa691c9ae2ab582064282d4da5966d650a30602481ce4ac06f21782392a6c8df1619e71da5461c38615c535f4dacb8ca3caedd41ab90e28f7d7888652668d7ba0265ca929fed74b31b686a60d41bec89e51d158d66b42f1a64546b15b77f9848bdde8b7f7ca60008275c72774e85a8b30cf94f0b2e245035ce4a5a3f7ae8df6a84075427b81e7540e5e2b28a7e262bdc32082e0ff9ff4850a33ad981c040b6fdb7bcda6893fd77bdb8502aac4396ea0e8ef410da45edbeca84c90f3d20530d37464c34c1dd5ce8372cf34b1f711f0884346032a29896318362267fe10e254160d3a4923ac73814caa476ca5b026afa903dc866943d64a7c3986aca621ab1f818e52813893d5ac69011b691704f7c4808bb95141006371f518a8981f0d922c402f78b3c46554c8435acd477e5fe4ab72b82d856b2f401df3813864db67bd225aceb3b2c4dfd5e6db472a41270e2c15773deed4676466f8afb3da68ae91f8f42732550d161f818b88fb69685004ce67ec4eb87d6f92af89301702a14c8997c7a47e695018ce1a7e83a524096ffbc4e5d6b5db53ff2689ed65d1cc67dd31357156d9af9b87bdd580cb191d9d8a9a56191c8ceb8047ec0f76766621546297e88eed8b86fdba73ba432c3e4d7762b6e0c10f09323c3abe91be6e42ab52c749c8fd84a494246a0ee95b13adc649e39bf2760d0efe9dc337c0f078a1a65b0b86d94708897c31e61170b45ab819ff130a3ceda08492392a37d1b039965b7ba78589bb849666d46ebec9c919a7b496746bc904abaf9ed2daf7f8ac6a40d7382162a0480d2b76908188555761bc3e77e994e72ae33e08a70fc3549c8657dc464af2b4e5ba2d6c26e00399070dcd62c7614e97d700ac255df03dac6f214c4503deccc8bd6f4f3bc90b65a04a9a3adc1a8a954a277eef97dbad9058308f3f8e4729346318a14bea022a6421dfe40de9e6d5c6db77770c9b42470fb9dc8d85f3188cb97024b6336a5c6ab1f02d48232be069ed7ee04b5802cbb65a6c5f2fd3cad6eec204a440c46f1c5bd4eab18ed6b0c190730d0347bf07d32804c647dbc8ce9597abe9a266a39e2d2e51d0b5dd4e4d2e75909ce8b916673b31e28a75c4d14a959ad76aa16f626192f04361ab72592016359dc4e40a422d6800ee63e8175715a356e87a27ee71b593b986f5e2845ed66bd96ce5a3dd318179de81201faec785b15a148be2fd1c9d3866d951034197e8555bc25db3be4e2885f307a67fc5d479d39153d0ef2fba518cc74f7a62fd142d1aca93d41c41a2da723ae022395375b228c68200bb7f07c09aa7e8f824c0fb0b3774149469290a6da0c2c2c4aff9b945382b4be62187ecbeef8a2b146d3f004d8ff908499505c3c3c66a01bd23a01470a4bcc33a20b841e55ab9c82121b1b6e6d5b9a92713f28f1108b2f15f6327efd9de9457f97a2275e153b104774185521ec1c260728e08ca07630804270c58e1bad19a10c288e949e7526deda91777bed547c74e69d58b0bcc22c42cc8a0a5e1a1ab62b4d77e1b857c7fc1265de27190757a0fd82805d8f2c5f9d29836c0be67d2468902a3e079aab6a95620c01124adead914b9b16272fe50801898cbc0be3821ba9da25a15095109fcf9f8f28af9f15729c76e7db34c5d428b7f93e863595b780ba84a7e5cd39a4b46c117d50c368a6ba409755a0fddf0db260dbe1bdaf1ac835dfe4b1835fc3fafaebb26e4d147a2065dab6dc8e1102d062d910068991ada155b725d7ff5d0aad0eb5e9f7307c5d2d9b25e87e2492d4e4e003ef4af232e2a34c8b4e702d465b9c5d92217162818cbcc43b5a08cb365e56d2d219ee816b4be5ff3fde3ebe2c1541aaa8fd42a54dc49592a3e0b29e48698f15b93e630919823159a9538897e946e700e2cf31a788ee36cff14d4bd17196bd01f6486a36cadb3e7179ef944bedc1a004638299b4fb8bfbb3d4ca33004d33a87cfde094f99484c934334d1f42f7fcd87099e0bb9fc43fd5e248673f02f5365de86c39379f24c4279f653e39e466ecd9b0e747ae79b88a534057af79b95349e13bb986cb80ae3ca2fa15be547cfbc53fb7e7634b4bb3ef049a5f7c8b68b3066ad744d88d045da16b963e4030455611facd12f1fcc298c7a27d168b89c548b6d80bc00af55e3b07ed23a6465f8bf6bc1f31922b28d0c7364ab31dc2ee49e16d77a5650330afdf69996bbeec707a96b2695a4049aa94fda1410c99391b97ed03f00d35de186873769370741e98b38882b27e3ca699ac4d7af53e691b51d4d2498db177180a0c414d783ad9a228b83cdcfcd9faa8f6778650b52f26c5de9faa208ed1eee3548dd2f36c74b578dbe09f4508b9af3d60052ba3a867f27c94c371a49ce3000da865769f3c2d197754301cd64ffaa92e5c0407fcb26852c885cc5ee682374d86bbbb4916a8f2b2b2e6b7df09a21e816d172ec18fcea42732b4ae3e9370c40940bca1c78d8bb8f7c71af42f305988eb9ac66df96e9188467602d9f5d11daae49159103ba53208ef345c5e7940efac9fe9c3c5c4b8c5daec9df26b5d7e6a1cd9b8749274e11e301d1baa161c1f71b31da8ce4a09311b811f55838db63972c0b2653c483e9507d61ee76ba79e3cdc3b1946cbb50ada60325f1af76ecec0f2bb82b730be4ae52aef568a98fa1748a5900da8502322b6671bd5eeee7278fffdd3b318815cc7020f26d237ede53a02e673d95360a12699543134f7cc9c05e32478c81745798edfe8f205db4bc8243d3b38838c943266d14b5bc50f25421b1c8beca9bb76753e3a82e538d4099545f20cd88593c086415929adf8bde77356b123d0e4d761e544e7bcc0cdd7808bb59d7b2967d83367c086ed165bc661db72306106ce881b5b00683fc3599e6ee3d5ea1748523783395d7ad94ed3ea95aa2c6fca4b21d68685118438a282838cc649ab28f5d32a98964afc369c0e68e396bb5da642dcf59d8245f4a6d3668f388a316ecfaf403a1ca5f1c2e2cd3ff3d306a0b11cffc6d20bcb43cc52b35dba63dccc86e7677a67c97ab6d4980817e9aaa3386f80c5034ec9ee3aad9d87ef106f92c8ed277acc48b19e2e846c6daf7c740c918bd26a336038c454b4df2e0430f9788d5d5094f9bad85dac413e0ed8482a7ae72c70972aa27281508290b9e1448157c69712134262837ed788297e3135a989c09d1f92220777c125131e42214a8c208fb23dfeef5aeeb5f520a2ba2962dc85ee05424bbfe8996bac3a876e2f2c084b7c9566a2f0127c26ffb54ccd7009ee2d3690cf67d03682a232a8973fdbf258a79fb01d21af956c283134f985077c6da41fcd3ca29511942569a65f00f785af44bb81f51473f035f5abb0aa6e571e1ef62bbab7de5e4a91ceeeb084179c1d7f544851df20f3c09f9358fd5c47bd5f6e23a8b9600ab40b029caf8f51b143de2a22e8da1d6345df026c292cc49d12b0e18a95179c74a1795abdabc022c3332311d7d5c55791a36691aa8b32d119cebe176553838aaa526f10fb22368543d64a837ac20d991a566ec12f33edf8d3b3f93c712b69b4514aa998d720af491c8117070664ff777fef880f71fe7d12f4e8497ada8e9d3cec8fdb856711436f13abd3d7aa924b56b6f1f58f01a1738d7491dcec0a36c04dd4f5e2a9c00782dc5fae4bec6cee7b64ad9a2e291baaa8d2d2801001845cfe15b23a86eab8381f33466c15639dfb699de2bcb512d6bd4cb1a195913eecf8790a9d4b3cc5242978f3ff7e1210d3d57f561defd2ec1dd4af40b62f5ea2ab151c7e20799dd057886e87768c4c9a85bb9179599f36a8cdb6316217d569a81a8ee3d6d6dc7ffe6ff278e708e2276c143cbba79813876962f1006783cdd2e220b2d70a08b8d770b7387b9d4fefa65f2b047bfae122d61191cbee1d8d5618f79d6bf14a4a8267785f4feaaf4cb968555d2f1f359661293c46f21540255daaaf43c5666e59ceb1b352e8abeb73b00aa4c1a2faf12d1d4e1816f4522645ccf894409084180483cf81413f16ffd09a83a2883287f099776adc927d576b29953d4de02c168f2562d094e1246787b2476932533bcc884113aeb731838baa385d5b86115d52beb8cbb7f0fd41af31375ba91f281b153848d279c795c224f6fe5ac081be738f217c3c6597d2fd3db292d461d17778ab7b287e40f4d9c5a7f31b5067cbc05c245ebe7268c1f71f4d5785dc0cf0abc0f0fbf06d6dcfe6ac510ee366edeafc473a712575859383a2977d5a8725cd601c0e6198bc2df29fa48d059a8d96f25e9c9e0b3bbeaef06f020a08c8eeabee2514880a8f653d272fc4a917f8b6543403928b8c58564792b3352ed121e74358311ff8b465baaafed7e00378924118bc03dd13706f69d370b9d5adaaf1670a1396c8d90eece2ec6d0fedf2882a969f764ebe97410d6509476d7d8ff892eee2516204a92f8cecc44aa2a052599118ff968c21e4db5a5cc53c870b44eab04b1fcf39ada88b8aa0b6af6186792c7cd0487ff54342ec052688304bf1cd404b8cf42db07ee9502ef85a2dee3db31880fa884aee9acf73b6634ab19e0748f81ebdb988089eed4a79f2f35b0d0b87ee57b4e5822a1cce90c45bf7fed005e1f7027b381f26a31e36346b624b26d3acfbd6b77850bd7eb08ecf1f6e00a4d3b0c3ce1641f051ba8aec619f5930dd639fd970da762afdf0c509b4d8fb2e84dda28524f6984a934171f24f9f7772826da7d7735234d14f60b926c20d80c139bdf5caa729f6dce727c555621f2b0ab5d472cc9a099e01b77bbe079e435bee7c707fb2e0733643ee34f5117fa37e942475013ab65c83600bc288df222d141a1bfeb9fd119d71596f7f46b437caa9295000e0dc8465a4152b63c46a3f56df63fb8e232aba660aa76c880381cc5a7fd8b6c530e38ead029eb8db7b070b307075d4225c09a5e675e1a2354f9aea1da24ff42a076e4411737f35684bf49966d4ab8626f58f99692db0d94f3177750a0502a2ab63acdb685577428717f6e02bf04b7676f0d564b9c074e83bd7e7889058b36033db02cb02721109c8033802b6f65ac43ea81b306bb9a5c83a9a3497cd19b143ec582a1bcdb476df9d350f2c469438f84fe2379063dccebb7c18cd66081f890fa6b58edd120815952b3ac7d4e367ae1ef86d165a4437de3363c594d1cef9331e4727f64ad266bf1f3a02e7638cff41119d27fecb40b4a822d71661f07771ac877f1541b101bf018837b37a9505c577013b7bbd6b3e6ffb3baef1ba84953f3fd3b3e86fedd34d0413e85e5049bb0122b5b47910e4225aed96d9ad7bff4a277d47fc3c9ddc77630512846ad16fc11999717fc82292179df983fdc4c55f97ee61e4255aa52429d87cd470014c4a200bed80e00f449716d7b44d8fe892ddce97b891a648ce7154c5e3bc573b1b4c541bd8a041db7887ff13a8841fb3c3f12485575430fd308e434e7a7ab872808cf5d9d7f1dd047b8029c4a03495b4276fb1ece2fc97c3bd4e362823108bdab07c721b461d3d9bd2cde4de57ecdb8e32a0028b6118a69aff5a7b33de901f78dba4335a518e1ab8ff79ae25c6b48b269d1a979ff986f6c7828fa61156af426a7f9779b54962d14dd4c72db34636d923b758442c4e2eda208498e9aa4b63879ffb49c1bc49a08860c2f170c20f345af48fded016d38e2bb65ddbdf8d894d286e9f2f3b9896585674d7d9a10aa2a12d39e08f2601245a8cef3031ccd49b243449852238a020f4467a6bf0cbb027de7be25078f11b2c7d1c2e673c53828187c4753d6af8b5c98b9be21d109ed823ef3f5fcb690ef512337c36f1dee8a98f6ce0129e1234532d8c84eb313082490886338aec5eed2ca79a50d997cb4680810b17311fc533dcd5102ce87b3cb977c7fd320a47ce47e578421c37f9c0d5c85202a483496c4582cf2355457fb29d3fea9528a0c5e9755f6d5d2aa6069511829bebbf66ddff68b91eb07bdfa7dd5d47bb917e82d83233a3fcaf86a66b52703ade7f512f9d7ba94f54774939d199f54d12557ac04921c474d6500b7f549830ee1f4d841697986915cc7bb0aa1ff868192fa87423ee2bc2ec28c877c11bbe22f02f5f379737b35c5601d784809b1cbe633d3cc1cccf42e6902c697834cc91e0d9a58040471f00c658e0e892bd01d128c2d8183dfe73201fd3df794a6f29f10dd58e969f542076e34c1eec31f040bce2da7ef209268668d05379db530197e2145779d2a19ac0aad717d1b5895903b69f186a8be1d6a0e921e88b0c06703470939b6dd7436298618b9ff8adce73f8cdb275f1f26de537b3ba27e73aed42849d73cf350cb60659f545b11ac73bcaf15a03ce7cd605c70b6f324a1377409ca0cf4e74a5c2e336d85e195b5e4cbb8c5b861c24aedf6fc636b06e03755b62209290a0e377d14cf49f0dd49073dd600212856895cd1861494dd1a28a1e3fb997d9807aae17a5418115351d8e45c2121b00e3915c4045d9c671f014425436e3df306b1281725210f4343d3b6ca7f38d89dfc857203c3c380243aa95d1c9ef98089b8c7ed9b2622a09c3720fa4a94c6898729b848bfccc8971784400b62697fddffc1f5fb7c9a8e702d8004ca63da78c10be836e143566ac45d521c38a43b99814135d2d01aa142cb727ca00c6988fcff549e46938dfe67cdb23f8e1d5a7cc358f9026c23029928403e4c16b79e50a638ac48d6a5ba7ca9e040d24cfb1e0e926647dce49286838252aafd07406353f48620a951bb5eb47274fe977d9a0867bc84e01dbc642b4324b8f7ce388c77984d8c3c93b3c3641a7a9bb6aee62e506fcdad7d1ad47f90c38533a06669ed9000c67d1ab72086ad0545e58563dfcbb3b47910a6be9797d4766d398882b22219f137c0dace141fa0a82bbcd6d65d128d624c3a241cd14a39835b267dc808d6fd2fd15866c495db3feadf3b46fb3461245da099d2097ce145f2704672b8997e6f63b50cc90cd653e509ff20b034a6f2afcc285c319f66c915c18198e3ba23e05d06d7cf9758b3850c7dc6de0d3414606009cdc103626e3eca909572205028f6005bd40b71e74a47920ee89f4c45f7c830b7450ed1be09e58e421bc79cbf8bbc59f20e60425ec0058d76e19e6f60b84688419d3bb4a65df0f6e192c792814cf265fde8a92ccd5fdff2d7c8ec228bd206db1985eaa142478cd572ce6cac0b04b8c9cb77fe6a3789c3926ace972838baeb69e4449483668d50885b2eae10a48db088edbffed238574cc646dd44bea75f003c9f39484a63e68e7ca5cc5d0cb84c3fd3c7e1ffc9e1a23e85a2588bca8a1e6cb14ae4a2a19f7d57c98cce51b5672183a2539c7f90e866d55d2038aca97684c9f014d0e18803d7b2387fae3673308a82c29ca9ea6f88cd91e287ab1cf788eb1cfe549ed0b7f74da37b815ea36935c6e2b9da537502602256155231743fcebceff721071e814e1f9999d6f1efc2b1b7b1d1330b9576618b9d9ad7fae6b55f4a54fcd3460c29a39e28f2a60ed3a5746659374b0e0cbee0893b95c6e07cec42420a1230edb0ece32766a17343bc82d3998d4928d58f90e6f9f7cc68f3ab5054bdcfda76b8a620ffdda45263dbc125b8787dd79976c2885aebfdce570605056e08caa9110e783d949510dce83bdb444e064e371d99daa34ec7fa0e0797189ba04dbbdec4dc9df61c3a7c5a06d162c88048ab54ba1e6494ba708db1224df501105003208714df0bec026754a29282715cdd102133412a3061198108e7dfd79bccfdf8a8797eebbb61ac6840d34c5b4b9706f4f14eda0f78289842d979e25d431e345ab766c8bfcf0000d010557d5319095f6580c2d3b1a78360c7f0590c6a907df2bd333a1612678ccf52419b246ae281268baf6ce8bca158daaa7066d616f6a32254021fad221630c18095d39f65751383db40300d8ba3daea62c08abecd7c5c4d1ae812d9de9baa89d3c6e81406909388a950e6ea1c3042c7e67c5663eae2e82c9f819923dba2a5ec200f15d1045d1c5bf8707b4a8b5cb2326c4a08c44b73451ef24495b960c1cea7bb56b4a789083e31165a2e7e2c3f088c76ea749fff75f3e40bf0ad66c1fa826940dd8c5642dc346709f47d43b6792c21f056ca8595041723238fc3a36c21ada0037e3fdbfb524675ad3b19ec5fbc36859f5912a238e9c27ee35648be8c59316238e6a8cd080bf0d4e8c46db42e82cd29d17ffc8df92b6292228024677153b8105dea236ea9461ce2a48bc5ac3c5e6b14acb23ddcd6ed33fdc674214e7426aac17a700783991961016a1edefcff2567d5e771b44e76716013bf0309577e531f61388e217c44e06008f511681714f5507d4eef73b199dfea8290f017cbf2cc338f00d9060c682d790426006a07ef1d52ca5d59bf910b511cc9d943a40897cf8e488b3c70bdf81da6a79b120009c01a176b4cd483a7c31e9c19e6358a3b5b446566b54f62358a2ef20147107c480020c2bd49a0f33892bb8e8704561e4babf7fd19f370180ade5fc5e31a2afb253c907cdfe4dcf066d6afcbff4cf4050c1cf9f8e1212750d3dacd909130b13e57bddc7eaa060e438004930004c514ab21499fc791d1bc0485e93faa16e113fcfe4e3369ea3eeb3c2eea45ea2ff13b404883153030ac18303ac8871822018eda5804561f7282b60f88abdfcf0786016b557631f850fc66002ec6e362967086e0aa8b5dd3df41e12699676a1cf0ccf244980ae08c9d09077441b9dc3d7852e97fdf1a0ac9915367c3713a4fab4dcdae31155bec3ab1c7cf3ba013b3614029ca3d944c25bcc341ff7ccf15e5e47d9e6fff9edbf8a4a88f829242e09d711770c761b39591922228bf7d5a43dc80ec52eda4ca2edbb4129da7535369b076a495b05acd4e9a024caa8f10d19752c8009b20f027cccf3a96fb5188db182f920bfb62e02ddf64b5e320b5f5b53d266844dfbc1e17881d6d04dadbb3bbf0965bb2b079ee845276ab4ea064aada4eb20abfc7993eeee219cd5527567045456d3805b4a06baf8b7affd870f7bd8c1a7f1f5809de4da94b4dab5c9b57ffcacd71380aeda2553304e5dd5e72c5df598d80b133723df239819a0e80d464dc189ddae7810cc5a3d831d7974e14a69a61f307320f81b63bb4b44dfd6d193240608398749bf4cc41173f0b6abacbc3d1de829af34222a7194ffcbbe7395a3631cbe5714682096b1cdd67b70235b041f00a645e1f4b378971a0ef350d5ca0491d9a4193b486386f12f6b0881db3a6f86f8871b847a627ea76954bbf6a055b8812d2e78aa4ea54878310142cfcd7b21b70449d5b67cf702b5bf4c154d00c6f588f29c59430a0953e74c3b8bf8ee25219e123130f700f7c1e4d119d708c328c6f203ae19c84661f46aab28810e00d619af623a357f65bb15322aa79b6be02bffc73a71e9e440190ad04dbc888cac614d7333102849ae0ff7e6555869533f03473f81f469fe36a703a871776860a161a0d08fcf6a079f13ef413267bece133c68b2d2a7329c56dea9632d799d41e1f5fd903e20139f832a8e41f40ab0093532e85e4b14296fd033ce218aa65cf86df63b9162232ac38c80d026565e270ee5d93d7956f28980afcf0588e87af17916411f4cdb0401b738dfc740bc240ea82ee6b37e0c61a800c02d13bee413e3ecd7734f68845ebff125ecc700d3755da1aedf77f781b62dd8c06c701b0573bcb3c0f8907dee5a2fbd2d6fbf7ac62c6e18f7ff6dc6b78a787d5d1a18c2795422f703d8b9d752c7af65b2ad8c50c8d3afbae417bfa11ea239852cb7eb090d2bc6ae01e3144bf7826c97f01782426133d230f72f4e28065ba2fa3383c371366982376010b1cd3dfa89273a9b9142e88b91b5d09fab914ce0abe89720de4bab08885593a9d9939a9b5f81e9207146ef563eaab5d3b3753c1a5216024542eac05b7e4e6d70c6f6716657fbd2f613f5bba8267dc2baf87fadbd731bbaa2570856f0710a1534534ab0b7630d8adf893081b0c4bfc6fa0684df48bed768b864657d2957cc5f58b9ac04d594118b8d8c6276a34f6f6c2c224f851a7ec97f88ce9d7fe5d2299cda8bbe57568bf4629668a78793eb114315ab7e3389ea768d1f0b2add1790d8257f3187e3ccd39c7fda41d73fd3fd1a261ed6b3d4ed9e46929ef43d8945a8070773eb3313a2a9c86663c2d1dd6da7ae85a86ed5aff052e1aa2d5fa151d13cfbf1c2ac8a6cf64d0214e5594ac5c56cf1cf3f4bac7c3075f8e3981bb2514a6b4e1aec80a5ea355cc929aeb2c793cfe52dfde03c8c706c8c1cf6fa2a1ffe2d506625002624745eff68a414bde5d34831ace73dd54d3ae4ffcee0fc45ba6180898741d831a25b8e898c8c6c0f585f8b10b39fb73a06d40d61b65a8c3f9d9489307b15907f00381ed1ee6aaf390120d4e0cddec3868762991f54443ed5a08605c448e10021dc2091a2f242c21f824db482aad436d30ffa4fbc1230229cecef37233945a9845a68309eac5551eda352bddfbce5926aa4c3ef54a643aec02dcb1c66e7b5c40b23c6ee532eb4e07d6c59d7a7c1974024ae523387ec4e673d110fb4dc8e46885596eb82833265a4ada93ca9d2309d5971a6d68c6ff48714657c901b27ccc2769b7b99b9072506f1812d6a62db00139eedc07ed7a02258b2172ef7d407977b4f88da2658f22b07bc088a716f28cc58e115b23a1e81980a2e4328f5104800588908779f6e017bd2efad6b3645a45d414af74e3af65064a0d500ae53b6aa1044215e4c940e0a7753d17a819de5506e52afeb9756803a7176a5fd3b198d66344cffa3d07b005777e4b7472517e6cdd4b5645ca886a65b4d0e9e90804778e37a5233888124075e94b29298671ab039b324d1e0b2e16d832eb06520efd65e07bdf4d92793674304f298a565d265ee78d5038948eb75c182f2a273f83fa714c59c0906d0a2c35e92350092dcd04af9bf9a0f7adb890761243dd79958493e3e3639945f3917f5bdb9a239c6d9fc8ae58b7d5ef62d107652ce66986866312cef6c0e05dbd49428f45281808cb3515d09cbf9c4186b838bd85cf51f3123d5a99e96003356d0c8729f9583b20b585cfabd4cf487aefaa5275ebdd624e5aa35ad025f816ab0a4728180a5e0b54c5d8b5c33c56cde5f3d24da89d960458789be29773c5ddfad04e04981533c2078daa81253b86034fb430026c3bb98dbe4d3a337ba25dddd98ef32dfcd2224fb43d52effb3eb3022cc96d7e73c82d5afed447ddaf98c2d1938c21f58cf6691ef7fd775ee8a0e68c36df445d6e125bfe2bec3010aa1b6ba8e76d9866b3b1918fb446eddaa17edb9538313bfc783947cbd5a411723b5a89f9d2cf8740d6b0b21c207539728acb6e1715163464a3364f3a2a7fa16607a49d3bf36fde3affd2a8b3d8bfd8651fed0e6ed3182cd27e0a564384097bf95b2caa80b6868178c2d7d37366bf8a2cbe3e8461529a94b4b8d03c7db7735a840c6d462e9b60c63cf8af08a83f0b3ff455acf40b3490189bbc69e16ccae8dfcba5cd7257d94e962aa4aa309798525295f5cc664128e0d03edd95f3a87d70f586c709da573aa87be1f5270d0e4524225350b228f5856ccb4063e03d42bb8f94e29f2f49249b71962bd3887c68a491cfd8d80cf475e9158599de10aea3feb29c1a2b2648e6d713202cd29373a5d7f167b872ece24948cbc6adcaefaa0d1392a386ccc1390944095638686454aad1dee8676d2284494e4b72e7f78d3b1099c24c412b904f046ff6e73435afc2dae0e9b9f233caa254166a22a248e30de12e2e50452cb521b96520d34eb449060b40f223f9d141bd2566189900dd575ce765a85ad8486eef00384fc471dce09c42535d4b06a29ad01856aeaf4fe68f490fa8af15cced23446a0c3be00f59298bd361819d6e3adde9d5ae730c8f3fa2a75bbe9794f621b8fda55ea95db7b2824f86c0147934944332b4f2a9cafcb210404cf2c03ee920ff3d9a59d65492c3dd71c45c1511e06f94e82eb07cdd0c5716de038d490b060d44884a3a48d1efe09e81dc1a000b0249084b101358d93cd79dcb95190c49a07da48a242069dec23c3e8f400fad3fa9d79cb3470a42ecfd0e52eba455059d9e461ce6094d9c58c3097bde545c8e41473ec9a70408e91518929e7b61221ff53f3db3515e67836c234f006f8711b65c3afd850fef12267004a3e50fb040728d62ed1fdfd2bab5af6554e6e40e4c6b866474d463b6b812f778e69b318d16981a57d5c7b4529cd025e52041b4e724197f0bb854daf948f6fed661e56c581084872138d9e920c88ea651205821d82ee3be02387501ff5283afea96f564cd7693e74983a3bfc44fb557bae8996adcc993c25627d81f2352d4c6b5cbf1516e4f4c2b6a62ca7fdc887e7b48cdda581aa8087ea2d5543b6f2e3de49c3dea51cc28dbdb6efae6a993be2e3a717871546a40f554284cb0462cd9aecb18680ddf627d4ff501fce67f3a0ca673f4c8f6b5bc16f63a5536f2df7408d48720a24657981846b4b45a0703817fe0fe5a9cca0a27c932c2fd05c1bf13681724fa87ad8cedfddc6b695f7e02bdcb1e86d4a086f514b7a5a2deb724048d2f17a89d20b1b747bfa1ad19e8b23fea383be3ccc5bf0f27722de05d3ff7001027ff44ed3afc0f4fac39635927f2ff9b74fd2cd355de24e86f1cbf99a30c587cdb2d7c19fc317dfed4a9db329e50211785d5daffb2b4c848bf1d38cd942722e42bde4fc5d27b2005f245209fef99736149b4a93404730d0bc9b215879a23188b5b3fa53035d75ea3b952156e44af7160076351bc7c1adcb4145891166cf73181ad4525b05d6fe88e8f502cbacb3d67569169c484be23336fc46de95f2e832265b439b48b1b587bee1d722c8950c10858d82993bd621ee640dd10d04389aa6a55c154e7cc8afe66c1cc41e7d2c5ce8d9ad50a6c833a483823277a115ea84c230ed154b00241da58083671fa962def5ebdd823547de73ceff9e99cf944ea6dedd4305c4b8428b029befcbe37463273203b23e6d9d4260c8a43908f59625d8c041f0091a03214bebc32d0f949f0accc0a3947d5cedfc99272142dfe7ba11f26aff5af4c9cd5fa1124906d7df21a8240367f89196d819bff0c34d32273718e8a53edac1cd71adfe05b4d6e5d66d176e654c99bed01a68d804e848287c4e8429809141814cc0b4316796046e11ab8aed249ad083ecfee0d1be85845ad8e46d55cf5e87a8e6ecf14350f81153e1d8e5ce0545205656ef967b0fdbe5ed21b58892bf6d0c09001b2d1bc2c3adf0634be2d360567dd16099e925ca775b66a8b4245f628eb3e233903a2223f877330142bc35414beced574af549b48cd257fb7e36b61ede78b637e52410ed7cc5f9adeb4eee42f2089be5771283a03725ac613be4ecb1581d1766a7a0df13bd2557626f7f008622f4bbe43aab4579ed41b900fcd01b36a094ac89ed50d6805596b854da4a7fc53014301060a429f5905bda9c8af5657b4883fd25a401e4ef1e13a0d0f6445e103ac6078302b0a1e66c5e2835971f8302b1c1f6485c7cb3e0e6dad2c8fa593ac6a7962998c06fd9ee482e48812915a9ec75fce8805915e9e6da2de8755e4fb5a9eca2ada65acfa948f11c55691ef6b792aabcc8eaa5aa58aa2307954f0b72c94c7ee51c51ae428761ff69d4d2afa5a0c185d2030bb6f14dc685cc9db277a1ba0a8d790669e52cad7e4bb15614099e3823c08d8c4004bfb410ec8ce27c7f692535da3798e1f076129cd68c92c23161bc93f10e9737b654d38fbd8c4ae5df0d4bec4c89ab05b2bdd874ab3b3bc8f27ea840622f524c2c1da162fa3f979375af46afe3b2e0848be78444c64f103a3d9e59958c3a288459bdd15d7480b7d88e6ce8e7ec1a011791867e254c9b17b3f71282188df3e591a2180df66d2a687ee0c777d21f59b8b837a7b1ee2209bc65a9b1a32b434f297a30870b9c082a3b1ee097fee48150c2ecf291698e11a208c1b7093522fba1adf1302567a189c67cd38ce46ed071da72d9e4a7304bc8aa0a50abee8f68c812d52e952ecfc74be74524ea69f1f9490b34c3fdb130fa8f544780e4cb15bfe962e5c6018a332ddf84de8341ad3ad2d0b76376dbb5f4ef171c9b3b7a5280226a555e954cf235ebada44d508b2c3b59d065219b7d72f8c426b04700da606cf6cd1abc4c0f89608126d80b930843f6e01750143e586933b5fdca08963a70a7003006ded367efde510b6f9f31a19d8e5e57162384288e9fcb31956ec9f418b8c51b4803988c75337653c6896fb3a44ba4fa7c37700e33056077eac0f7fc2a73e6a1fcf43dd131dcd364578c96e47697ce710c5393fd7eef4956b10b4d5655d8a5bce3b35b01d7083fafb8038d2454da1e412a40c372faa8efa9d76150b1865a66c73fb96d12e0408b1ff6baf1c45c46314adbba3d02dae86d284a1b22ba77afae8f8b2032e65938666767f0aaa8ede779c7f729dffbeecda3ee269973ffce7660f63acfce9d8cd3e9ff19f5607f0443ad11b281d9f90087aa374c8b2c603c06707c83f4f7f8ac9cbf24f5a1533e023e64fcd65a86cec2c857deb56500b42e929a839e44864839aa3f1cd6116145d0489209b111b24f1cfec7644f45ec79e91fcf2b3dfdf16907edbb85fc9422645f85360f16e677d4e0980ce0a738176c2c077c32a27ccb946931b39d5f1bfdab4cc63b1e67e4ffec8d51afd48594d9539471a0c826d4c7ed295088b20769aad2860bbc5f1725e335eff5dbaa63917d4d753711bec124c60081fe8fbeb9712f77ae1127094acc265c4f0dc23ab131f78fc654d79ca3e681b596672afd34ea98d602189307794b53e7a52c10784aed42a410fb1ed8d0182da67ba8cea0a76910db98cbf855effd234bcdd26653711f805dc7692915e988a4d66819a019609797f46a0bb79e1e5db556f8da635a2d97d2afd40160f37470daed1dea082c3f324ac413fc3c9939d388013e7e7166dc694a23cc9bc9bec3c9fb9a1663c6d19ba1d7670ea672fe1bbd188864dad08df9e554c95c090f84d2a173b5e0b8a76a46ce7d406226fe3d6297052a9609f784b43997c9fb28b951e22e7af778d9c98385f086b93e2d8c6ef7eec681b0209c2a78f92695197fb3d48d58671aa929f45b5df1e17b92b092716396912b6307fe8575cd10848eb528940d23da8929698fa3f99688dbdcd5c97ff39fc812a41859af3a36ae586b96f7d8c9b46a3f1548064bf54777cd068a87c0e987ee6a9e4dc490cf473ab805a1bf62003adebb1cc7d4e15e0144602538b6cdb564c490d29145a2fda0c1dc31f69c71b20a29651e9afc7f00b2ad15cc19e9b2c1a0b36ec20aef995bc86e467b8380123e38ecfbc292d3a10ba0016bcb5486efac2c3337c0d457ede7c14ab394fd55f6db6c02756188b7ad830c1cb77b97a785ed6312194973b546f1b04e02e8b0be33f66648343a28c01cc7bd467cf3bb3af96e8d219f6b9cc02bfe0a5fbb589f00a2f6ac70b63f4da37a1b6b0bdeb7932f58033e578d6ff05e5b06ac3c04ae279be81be7061a34390dfd9d449e5ca0180434b8cecbf5193aba80d89849061fecd86b2428677d1c96cc68b4ca6d97235d3dd9a166e9f47ebb19e22ba9b2b336bbc01e92d33b85d4026e93c39554c51ef04aed60471ef1d725b8517d83c8999a553b0dd0ed583bf8b9c657810f1f228bbb1ab05f5ad1f5580410b3dd580a661a6efcb1c1507f55bd1d0354f4d5ee1b7eef0804256bc002fe5735225903e5450c7762817d8efbb848fa07bfed0cf2f6394717ca6b26d49db279353d17a5a857fd9fa7ca0145e87ce2303335afb760f683951ef30d2dfa5801718404cb9b8866cd71380aac65193cd0b7b34774643e9da87ea630f3bb3f4ec06061fe8a47fa240f7138e442908f5b438cde093d9f4d8708a11207e4a22c42fcb90651d93e39dc846d3682809b65fe787b267a407d3527bb92283865c367e6d6d9f3709fd98e1de5c88819d38c65b84ac1262db3f61ddd8075867a7f5b954ac96fa55d950cf07461868daf60d5c1dcedcaf5f420c777de035afe22981a55db9f898dd92b56b07d0bed55c7ecef15e6951275a2e4eb35b039323de2eaf77e7f2543723c29e5c7d1bcd497ec821ad2b27491402afcfaec07e50cb17ebef07a09b81045c027ad925c8a880583b0f0db1fbb451049ca208137d17113c6a47003f5e55a83d2761bdab32b987e2743007b55d7f4b3b098e02ebcf05d30c9e62f4f463c2d8cda82feec9ea1458c0686d6387d1bda592cd4744cce142a19e0af4301e604eb992371659eb1743c21817c6ba6dd21354b9b1705214e846aeb75b3e65e418aa538873306de2dbc5da62bae8cc98cd5ba50b8d73e3051d2f1c4953eff55d26caa4ecf403025302e92fb2917154912d60d2f55668df6a9cf0b51615d42db840792c14385a254408c127c2b67c64298da5b4289cc13fb16fd8c5e671e9263c6c634a6c5a34816f941f93dc8a997463d8f5e91fa8167d05a40c1631701a099a0ee93d240c7dee70294748cdc10998438bd19c7788c006a8669687cdc577477a839264179fd28fba3b6013c6a8e294133f076164b74143aab6afaa5a5ff510a29ddee392fd212410164dc0aca9adcc02045cb81731cae17ccf8b6a0190cf4ac78052648c0cce87406dd23a467c7396b79403743a8f1ed78cd0355ca4a18001c4ebf263d70a3eaa193f73ef30e4b635a3521b959fe09c0de1b8c1ffe1ae74a1ab89078977513ff2c22a57e412a54bc856a944a2f501fdb1d43c9d825faaeefae3235cc2270ce4a11727ebca5013d0782005d0d79108376b96e31b333e8165136ea056f5dc6ef03a61c858079e465e9665e48d52bcf22693ff23048d301cc0fbf29d452c0d884f58212e706061b05fe2d49c444666a7d94ca4c20a46efccef8b96f23e2faf517e45c7d51f5a327fd51559ff8cf2f5ead2d774a89d2af2e3b7267f6d83f0fd03061adfde81cbbe547ebba0181f926cc43142a230c9b00d2ef77315f3a3d54f22d480a86839c1f2cd0d502c5e4a4d00cb7242eba11c5585741d03813c00d00b32f14311dfc2f1fc0b392680df81360e5963dcd56acdfa51d18c1da3559afe2e618e72b43b9f19c76858b8b90838b759ccebfdf5c1f168d44ae2e3605aba29b290705d8b26360a72355542555bb625047980c968ef3ff744410508ca274767575a0e9042ba6ea59bc03128795a27bfce2d19b82a227b07685569fe9d348a1afee185fe4824b65582bc8f7bf053c8a032341da8c508b40e145efbe5ddb94cc89b29d4441db5414783f6a5178a36dfad128d8d7d4cded516cdb4e650eca356d6e7d905edeb7a93e9737d35d025d17e9c20fb5461446b73a164c61fbf55945d256104b609115c167ab00ca017645154b2b179194cc3abdb824aa7ec997e0bece6abb95cda6a45834b7547673353173ce06756877db720f1373882946e3055d826e30db73f4282ae51a2a7571e1e4b7be5e8fac53d2acec2ebdab9f459f4c7286bcbae295e8dc4f3e300ae3dc05e3986e3f4dab7b1e5b0787a6248081cc46f9f1c45c99a4e4754d752e1b420c735eb9f815b7626578c9e0d773384e30b794155ba7e69798fff2fc37030ae4c2dccb465617db2fe122500a30ce10106b8d16a5b1685c2597c23e6fbd648b06dcff02087d0eea5e566b2cc82304c5b87384bb3dbbe02e208d5dc0cfe7bc3188795048881c480ce0848c24610e83bb518eafa0c7f811787170eceb94fe1f619435192c8076b709ab89c09502273bd935e984f8fbcc055b0be8a1903828c7bc728da876512589d75b56d91703bf387cc915b3c9055c2d4863a2019a5cc7a5d2978f864472182ee440a3828b2fd834766b246cc6bc752c24762f38b9849097492ed26ff799fe368b7a73c7461063e505956809856ce9a9baef3be8f9bae961d010db5a3f56f7aa4487950475f2eadc4d7a31e7ae6fbcdca5ffabc5ad6b0384ab4a35a8e9d7880747986724171c0929e10b666a23c5d10c00ae36b59f8b5d9e21217dc118e28cd28771ed21661d549efeb4adb1e15e9a28b67ad42b5152c2dc990651bf67cfa5ce7badd78d213196b07729d8204bebd5b0261f2603d7df45ff6f40c66cf07f99ba2a337b4fbb885defe7dd647d6e05b40eeaf8c1357b60ff19c25cb1e8d953a21fc4a822f2f9947536f7fe6818010af95683b4bb2bc06016532a358c54a8c69fa150b5a06f1d5d5a4b973fe9241223f6145989b18bf6dd006319a5a949132d0cc0fe4af537212ceab2019581dcb0ea0037344b56affc45df40501a9bf9ad4241dad28a46a480c55e09a53d807ed6ec561e6fb898597b49e64ebe845143761ca22c7be22de47aeb66f82a8cd886c2f0ea79e4b85e7d3d3af1c7e52d964826a1d89fe548d0f831c5f395f25e186d655e3bb01b8d45922080537bd5aa34b54a053f92a882c0e34879671e2f86ae5baed44e540cdabaa129035867cd5c7848382952a6ed79dafea5e0a44aff2afaf8c116b9852b813db5d0be15ffc146cf94034ce29f85a674e0dc7b8c309c1dda81819d8253d7ef52f26004f7123c173059af2ddf70ecf4f7c55f5a0df157ad3c30823c7a90af129a85b79385fdd5d03111194d29937f04c43d990eb9e45c368b728d2d0bc4c6752acaf3d2c6dc21cec8aa8f549d1aace6388c80902ab98bcf1f64aa8d22d7e302a7dffa1378a772b528f2ac04e248fb9f678c07659c44178199d17e70c1d76c1f41848422eccbdc21ff7af7b7cbb0007add1f5d330d00cbe607ccf00bd4ad04745184045e1a4c531a9e59711c1c84c4324dc78f3d65e7581f93f720002a8cc55eae4390a16508fce0fa1fd3c66d60f03c0a7b20e0a5009c45a1069de39518caa3544783c59463861eaa171f2b000397d3dd85d00cec87dcd0e1b28be8b81afc634089f07990ca0df59cf5416237ee4d9faf145c6fccaaca71823a16e01c23db5174a5d7d16f9c305005006ce714e3bfddc45ae69e0c029e4338bab096837fe6f184c4c99982706af60277586340d760732ad98bd48ff63175b8c2bef308364efd55e0556ccc47c4b488e9b15cf94bbc585ed18806af5c4fd43cf8c6c5ee60427be1366c77415c5d067cce709c6e9622df8528a56c093b4193fc61141f224b1bb91a99cb53626dddb7d4eb8d31c92a04de28aad3d8fd5b650fb4b80d28b6aac46244f7374936304dca02720db9509773abe8ab9e09b7c2ebaaddab4861dd0b846d05cbc9ae9ffcf1b14b9d463b007d1a920ee857b1396cb00679449e9ef8e997bb2a5ba4e957bb6639a1878c37ea74a6c4fcdecf3a99379527affe77ebed7bfff1ed537601a4c6aa3128d75f40d5f86ae6d8238dd24369c82b8a3ee6a1728e939ad9a9a824905e6e39fe26b83f071923d5f6835335cd9d62e439511015ca43522516161e000b3dcb2c35932e47e4ce0f9391ff06d9a92fc1647b9125a34d342cd1d6940a78a25ed16cf9a5c53e42f472b1cfa6284a1f142cafee9ac9b22674214062870caf5eb9a4805b0aff17e7066dad10902047e3e7786e8101a5bd2d3be2e8bcd12caf2eb891459b9d1cbfc1ea6b535471e5ba778a1450bbe600ad217ebd32f7ac423442f68a634d2c60d150443667e8d59b3c601179903a90d4c62e15a61d5300d437afc51bc079ed20173ebeb9befddb8724da90ca8c88667cca6fde30ad32271a547de49e0ca6895a5e44d054163402f2acb03055c71e1d6d8fc1e5ca11c3197fad4b3d54eb9524be794343bb4b06a2e5e2620c35f8d4a290205a5d8a8136381a24a8014f0c57d73b619344136b6c7103a913d406ae801507f9480c5b2ecc435928c3cbad5851a0851a519612e93ee2e9c9a68edad16a09ae66b2349332004dd93480b6bcee4226bd2f76d80fc6fe7800cf05740546e5b739b6b71d92d27ac2980d25336566d790e6044572f01cb7405758269f064e3f7c7839a9bfe52dbcc0ba2ae8f55e4b68b4920ae2ceedc5415cc7402a129d86e1497094392d3e138491a69aeb176dbf64b540c99146bb7d8e0bad552e1d073deb613e9a9ca31ebafc3f2a2acfe9a01abdc586e5f0fe7b11b0638aabced2ae5e5b939e9d3af2ee99eac360beba6939483a59d5729413229f87a11761550d67a71386369507c8c6ae490c8122a466b78374a602ec809334c9e064ba5196a1849fb279a84aa88b16e194cfb8a74747ee2330b07fbf098c2032f6f3e5e529dc9a9ad51b14aea54ee1fc430fa75065a8f5c0ce33e9879b0feba6abb72ddee4289780a3166cb365ba0d9d6aa5ca7e65134dc2269960450d1147322a6ce4c352c9c0d70a2c94decdec4b99207e837f067150864c593dc67be4e0227d858e67e32404d48e7afdb05eeb94883080137004c125bd6847c6838b38a7e02d4d019d003996014d8da0e565a77f2d54b91cbaab3a238be6e386fca505c171a55cd5191496f8ff1693a36958be4ae4d7328427c8d2d506d469cdf138c631cb28a0cece0c0c96af0fd0537ff7928b1cb72cd3ac86fe3bf652345263a21154f7174735d5f500c985ed0eb5f5638d28e204e3793b5b71610b6ca120a683621ce43145a6024484c294f8fd73ff4b8526c4274583529fe302dfeb23043eb2179b5d4c40cc556698308c09873542abe1f516705781773ad7ff0379d30e94ff31d3606f0d24ef52611959000064ee9ee60b09c9631e4714b4aea1f01dae2783c4016e7616f4bd42a31fbbdcb887624251e08d1aa950f6c8b993b87a1b4d43d8837b537a76f3f2250bf777f2c05f13eab37a9a797092aae84b3c4839daeac2d0cc2f8973af936f5cea1dc14ab43a9ec7e1b04e95ed5c0ebb5ff146967ffb7010e6b25b237795647e57b799d2a7d562c538e64c1031de50f0647b0711f28d77c63d7e78aec65a3fe3a94a8f64aceeb568178d84aa715516157b9dc725f610f7d83fc2cd199e71dcc57e170ec8571f1829eb8e818ecb06a6069ca32c4c5f0a61257c1f13cecbb569e7c971c2014db186db4ee4aeb95dd276728d8f175a9bb207684a6ebd07445bc15b9dea2856b959ae6b7a381b73d8b989021fdef785e7e1f409584d440dd869427a1a7dbd285d7317406159ad550208b4eddcffabd6a90f7a5e3f046c3ba4cc39f435f113ed3e54b6a59a5d4da43baa96b2320511d3e7b5739586ce4b9b4d5061aa5ee5e17a463c9a9db3921e4fe708d947d4983b43ea7e85ae58e4ffd899224fb83f904bce19ce386cd4c8493da86ac0f0923e7958c17dc2b34f0822c07561b8e73a4c7d7d29d43415514095e402a47180ab1b0dc808e72c43b303ebc301dc3abb72821c063336ea003b75d46190856370f09e985a0cc988e79efe16dd73391531540b79d67f37f157e24b2f402b6e1d45088fe88574c2d077419d1602c87e727dbda5726c5cec2f76c3e8d68dc04f2ac0fc84f2f4c580710cbb0ae04945ad3b5526b2dac344b15b0f0e878ac0056cad88b52abadf65940345c2966607f065c307f4259a596d217e879d325e6aad73d22fa5b96a7e6c0b61f9764ca3f88748e5ab51f2ea50b5d45c0281dc40de3474ed9a2c12b4ddee5fa8177fbb1e92f076d19681a7ef7f50dfc65bb29593334de6524e05be59d192fd7e190b1209845944d99701295a6e61776faf080ef1e95dfdb4bfe1b45109d32b0da18ec1e3d678362d78f95ec6d6e11d1de96202010f39581100e5e99b9f0d7215e5c2710034596ff40ddc22f3b95f427e8bae4f56f52ea7f16fdd54b2aa3d3cf9ac2c4365b5618701039cd6be4c2bbdb2e26db2980781538708ce2a97260ff4e28fd0bd2191e0d5f0a4f8e53d559171ff3856008e83b734005251741fb871f52d38434feda02b7f76f540fe5240e7081279944e1069884fe5b61906dd5cb550410eccf64529d1c38178a83c697d2e457cbe329cd5a55ca0cbd6804045e27e3f9ea787a0a1e736b54e343e24e345d7b52fe2400188a8a25233e104480f9372c90631b4bc23d088e8ffda4998b85e62bc1db74818a26ba832be4a4cc230136435baadfc749594dfdffeebfb886bc7d65109b7d8f22d793c4182dc595e29d3d782e848da09d3b9884f579e3d0e2514ea9ff20c0ab07fb29044e6118c032e74c57e34b005f655fb9ea44a7632facd735ddd019b77019c22ceec4020f38f2099805fce50e824291139699df9bdce3648d2c62303c385473082b1f7beac877c3440cdd1ff5fb56a2171bcf1cff5a3a2dc2ceb81ead6370064757f2f723d4367d74cfb844bc70a30a0257117921e1111539a9be4723567109da9835782a9f20bbb806b9170756af646177f4f03dea0df36b690460d08af997d0e9444485bc455dd903f319cf5662de26260cc4c72acb8ce324b2da208172429a495db93770a700c29f2b4f0987622b3e2d9f38ff5d1c772faa0ca58564269bd738bd86084de7bca50cec88e40a48b59a6958a775d1f44276405fceeb1a01ead68d1669f0cf8a00a549cb15c822f0abb440a1d3c6c7fec76bad23c3378bd828350a4004d5b36ef71c3fb69a6a3474f7d634fbe4b0f6e9d37e79e19d8a68da8fabb7058a9789c328b49d69a16340ed8945f6616591e772dd6b7ba7966e000e541156d1e0414b210d0585a5f00e02d5df36c52a0e4695964d2e1de622a1c512ac79d46b6268913cda3940bfd871f242a44958c49a21172ce5d4b4e4c867e7e5baf292ce38fb3de3a9656d235fbd4e8ef7286a18c48886756a61488d57aacf620939e2d7eb9020c987711ddb4d5a5d49cda39c7950f87a51370afc44be4afe17974d0cc398258b249e77de998242612684d80560295086a0bc019d4bce5ff4f79ad27ba158b0794e4c4ea955662b7cb191b8d5c3664172ced66904900c4a3da49175eecc477f0ad48e1defc5b86e32419d9627572d11b600e6e8372dcff9b5bb782c75ad76ffda84a4c98a80fdd53a260b7d64180bcece3e2ac3a0ab5d33fdf194450c2570dc11212063ab69c4125d2fe491a1d9ba7e6205e9be5fcf033581f800621a1003b7e2022585925f6fe8315fe9b518ccf2c2430c570020afa228322b66d9c8e439b3889b7537b08d3a96a92ecf2defbab41de674d2bcad0f1213949b572fb0262a93192150660cd2a20a1620b3d4f964c5a05cf875628ec36a321b4cc922f40db21c5a4460545dc1491e63138f6bc0488e2b3a905ea35b79d929f973c80133f9ab4c56b39173925668399984271c3fa5b91dddb061284d13d6f93916807c7c5274679aa560f7a3bd7af7211b67589998736c1589905d4e9a168b0b8195efe5b62ca4cb3d7adf4cbbed0f1fcd73d49659fb2ca40e1b531503690274c7a4d12f692ef2804d0fc4dad4fe5e325518dbc6e4b2b0330c5a4af457b8ab6b7500e8426ea4e598189fdac0fe21f5394316170d4f0c0330e2b6e9fd910550d89c5b5f4207592f9f8a00ee289e726b2d29f83064677b9ce1c1741ec4767967f4977824f0fb62a95f0c396c5085bd1aa307b4afda449f432224ba5796eff092c5adc3abe8d58c630d552b8116eb0c4f1e03a666a2e128280a433d64549a38933acc6c8b3f7a84018378e4b9499cfe308224c0c0d38062f604bcef9d569403cdbbaddfa2e22d1d54534adf595d892d69db0a32e64ab79bc9b41c872159e8a1dd147154f920c4e22dfd9fde17ae53d451e26121634d893992e26349ea94414078451c8ed65bdd651d4b406d73d5ef57bf0f1356d058eecf599dd1ee0b0f1b099de643b9408b509e5d237fde778846a8eb059d5f1644182e7562864037543ab4a9e62391435601f2cad7def6cd941ae629f22704bf0d6359d6ce1e02b457905fca60ae27831c9a8797d37820fda9ea32104ff18d04f0390b27675b9fe111ea65389d1365f5e42d354b777ec056cedcc7f2e2bf19aee120474bbd00c6e90fc55e509aed6fabc5be1342b12ae9b94e16b1702a295bb1db8a34b3161e3cafea8301f55e5fa87e999cc78ce56258d33bb27612a4721bf97f839cfee17d9908dc4c837b158979fa36ba1d77246b545cd820401f2e765e3751e0095217d1d60497bf7892253a3e4330c024dac4ef537df0daa830c79e0a5ddd8da7593d05bbd826dd6f834e90e2231b3568083c52981ece22ccf2cfd04ebce6a22ff3c72d96d82c227029c7ee78e1f8994f021a886477ce086866946d12ccb94edff8d6f44261dde5558c6bb7cc26122f3c7adecde4d7dc645a151a8ab37fe08ca05c842aab2c0b5e8e7eebed6f3b77d21f06573308fa96e46946163bc9a26a130d4b5b6f58aa6437982479dcbb15460bed2a7a8dfec467a91607da1764c929730a09ae1847be508ba8befd296322664ebaf225bd6819a34fb03fc969908f094646d80067d71056750552bf82ceac6fb88b1b1bb55c24eb335a423941eee558dc617e5112756f75aa469863b2644afaccb273bea436795af8e20f0ce0e86d61c5fa80823efe1b7a29220756f8c60f59008f3b1f6d36e8f88781496348b12197b8053c1609052d2bfd908a155f9b4cf4307791d3a78b371ac421eaac69ff7981682f2157c82fdb82291b0a5500add78e0b24f282e84e22bf9c35ed5ead2a7b66cabb2312b977ef764e071c1798a9971d97b94656e0bfd365e0c18bb89b70f4f6e08a015c057c1dbc728426295b06538a011498308809e5d7eb5ee034e8c4af5e54d121f9778f50bb40e27d899570d7962a4c2b2af2586ba907f4e312348396334b5b669d52ee03bd6316742883174e712640272283b633fadb1171a7750b0089c0f59c9c4945bfbc108aad47b8914e74b647508d3354585e4c12983a86646b0fb7b962e605ce10b6950049eee364c816121fba2b6ba1fabdda18502c6357bb314b1d45b677fc6593ed214b21906c1148891ba831e117bedd00a608209d8e30f50bdbf7dd8de1ae8d4304a83cb083fe1a55ce9c1c2665af0930a159fc8c7c884aa4c6ab8b3c3484daa5f1969cb039ef231b50b922fe04e7c8a950e2f58c0a73985fd249ae4034b188a4a55b03bc8557b797fd8a92fb03ac11f7ae23b3e0b25a31a85814fb4dcb1c4f4709fca56348df66419cba2ac174dd4699817e83de845781ea14bf064e66d2649e02c81be63e9cc07d9a99050ceb05281157d948330481886fa0fe5180bbb31aab1b7614e62513c27303ed46f10a8932d78d9f10db569c6fe10d015892f0198bb18dd0649dd74b5b26a4530d308ce30966128b2cdcbac5f2374ffbec8d4b1022fa64466a1bf7f2723ca1ff63dd9702ac3ad5b12c935ce3929d3085c57320828dcc84437a993052ac557a44f6972ff6b3fb863a650528853392765d1f511288e0447e6e868129d22c17154a2d4133653196f0b89690a644d80b1ca27500c7ba6a4377eb31590e0974cf3d2411f9f591f585884ec3316c8616b9f753021bde65539eace988c9886a10b868af88554cf11574ab61672d35e4bbf930a91db9229dd09c4924b5147685c9507d71e5e932083491dc704ef46841300005720d61aaeba714d47bb22a46bc317133aebfe3202dd53e6e8e42c429a90d0e15bb4fa7115b97dad808d0c9548ca09aee47ca553a036be8d3e78fcf05519c1ae66526ba4f9b47721c5a51a5c482236ad43440707523810039fa21267ddcd38004a8817cd4f8287f1f01e20888c7348fbbafc31d352e33aeddbc6f17bcbf609be74f4b9f65cba30d629067edc8165c2581c83066b21c45a7abc93665fd204c00e728bc36e781a85ac913b34075168d17f11cc50d12051406071009a3467ebd281765cd232b2ba31d968cb3f875a3254acaa16fe29000ec465b5d428398c8e07c4cd65e581376515cff57081fe28d0627132144a056197fa34796959ffc413461c8c526e1aace32b7d40a2d55ca7181442e88295b43caea10169cb60bb495645382fd9ad6466fd0d382908bc91ad89510dfd3430f931fe71ccfa19a8c8b1a9afd6d61e9338eb133c20436a106b8f2ca0c442e1964782a119a5899a2a60aecc2180429ad76c4459a1c8df09cda686e7fad0423f50e9ec2be6eadf039babc5e0d9480d3f5bbeb24311dc2e28a0a89efd657bf57bbc84ed7c2cd9d447e18d5366114d4e7e74cccd71ce4767dff46f062bd705a020be2921f0df3e5cdcba882569ed39660307fa1ef9600853100a2f8a91c543ceb720194e7df62d505789cd811108815431cb8afb1faca01e732e0c81f923901bcb24737f7cf337306c0145718cd5e9a87c7837aebca63057eb86f6d8688c01af5ae3b50c58cd26e3793051e2e24f38f49e5038bebf429203ac0696d196973ef94ae22c2fc3cd409b7a1af410b6a75399255a01cbe82ecc38282fae88aea51e21e5cf5b5024730865e07f43b7d392a248587403fcdddef280c7d52c26737465282f0466470ca1853d42f1b09d4e0971f314bbdc42c246407d148572f6bad0a2a99b8aae3947ae32c1620a77b6f814833f09781bf092fa7decf5d0e1c5e0557e61ccf280f19e7c1d407475342cb980cdf27e6a48789cc940ca21942c4417531ae6ce97dd792cb33e4c0869c30a190a8063cfeb3201d89472075269a5873c21708069101a2df33c1dd8724ee8093ad5db20ac195bcfa3cddad855f7e72bc20b7685593c40768d1f9ec18a8788c8940f419b980bd3baf2f6582ad62e1bf5e158395fb9f7e72120c0ea7c598ee31bbe967a450d118416b0844e84725cb5919898fc234da8fdd01328ff0d8f2a4a688f38c017cf17a29e52df8e56efeaac180b79140dadfa22d07efe457ac2e5362aee6435184cdf0967c716dc426c2f2a266b8180d26185176cab95ad9d47de8b8d6360146cf5171d08c2fb644c385cd1617df0f25aa39054166dd91d01955aff02af59c213a30e864e8d9ed91e5bc034045b126f289f62f19d2c8b75550eb0877c6160b968e6ad2b406a7c9f6d196de1effae5701eb1c19cd6910d67f893a520cb2bbc6b49b039be282744d0d072870872d8ae36ac20570f819c0ad844faaf3efb1975914d331dbf90046396c4fd9a18bc65656b93f5f115f18da87668ff5a6274dac9fb71cb28adeeb70e8592e5b0aff17828c6f6fc280e6e2bdafc13b40a4c49432e6f70c6d72358b0c99dc5452cf869101315a352252cd3f388b24ddb2606bede44ae71f17e69eb19a8ee57175664a237891533f744d8b801298493fd7acc70003cb01154c62f9ebc30e15a6f15c968740659c50b29378fbadbd2c70345970aef4dc089f60060d141140ce24b00ee91b214d75a341930ec2e8b264c9f986d064c3df2cc6bff99244d03d26188be8013c3a82d3c07358da9675fa7223237cdec4901f56057cba593c1ab9980b739f4cd9b0c000a637391357b2ae84dcbd6a500973fa69de41dcb00ea5b2b04993a5bbf82ce0544d74e19b3a364ac644ebf9214751aeebe771b639bb04e1f2b0ec740ad11da56cd1fc3a403ecad342d77900c67eb2ba9bf9353000c2184c5709c2c0a6e06b91c708825ee241479ddfcda511a80d3e06a6c0347ee795d34591b1cf3a4a87ceefc7b53f69e1c88bcb5c7b2ccd06cae88efd826769175b98dcc45b5e024cd25869391a6f4d927514c162ee83c9867397155c9bb1d6395d154a389c389020b3f1261eb239d26ef9baaa0e5e08dd877d4227af215dcdba9e7509de84d80eeac94f3d32c8b1c186e1dfa51a30b0b593c53403b7054889cda74f8c6ea2a4738a39be530016c312809be4916ff70a6144b12061c8e60a4f747a2ef25661b41536df1acfd16250ac297304638503e085d43cb090c1d6d7ea889098548d078152578ae4981aaa027cc43e161ca764de55aff6115c602e8dbb2957efb918be09a6bc090f547ea2a5077ef2645ddff671cbf5352cee8817ca51ab3e8eaec63e7ab9b4f4fe0738a3340dc6c50e8029da3a59549f7606b20c30ca2e3a41580277083ffb3b3b0c2776e447356dd5852fae2bef399a8354ce4066a219114fe26d1fa177c59ece637dac5b6b5a9dfe83a5d614cf8a3d28792f82ae5e4bf70b5b495a69c0dcc55677e2c5835d70578a92c5689690ae98c760d26e6a36163bc906d0d358bc7cc6e23e6007f9803dd2023be12922246aecfd2624f2808349ffbb8cdb547e70798658fbeb00202f5c611be276cfd0bdeeef482217b1e68b23a9954e1cd91847c88d00237ed8d89a33ccb432f930d2c30796d595c98a04a9dbae88127d784dcaf92edaed414961471307216d4173124988793c1ff29b04a7b2c6fc82473f96c13621e9b9f9f5d6fab7dd671abbb86646d709bc3a62ba467dfafe321cf2b59ffe540fdf5bb9f7996f25ae1615740386c02c885f8d6086c01c73e7f1e46a09f0c10163c579d80b150557bee3ec4169780716d001cf25d587fcdadb15c7c1238ab18b5d732bebbd728486e8c449bb5958dcde6068c229fa4a5f1d0b37cfc8e93892c861a93a16b67f4b6d629c253cfc12116912a7528af695f15f0630dcd22dd5aeadaaa55ab55db534abb669bb66e93665d12cdd154e2e8c907aa6f2a5ccb2008a3a05a8ec893bc70e950aa265ec070ea7231fb8511d3c179222652b2602b00be6365565fe137537ec676ffc1b60f2417830c16a414f57dc2fcc9a5c22ac88649b3997645eb3f846eb852d45480ba131efe360c1ee63b8d7b62f262bc24a22dfd3110d408537d00e7742a11eef2288c35e5887de6d9453f1dc4abe3c257fae8afc5f2715067ff6e6226c11ebfc1801d609f13608380bd1b8f871481a2f7d752cf2e36f70daa81fbaa8d9e9c3aafaa5dc21c711215cb2ae583fd5ee254251854dd3169d5accedc2dc7606e51b9102d99677733afcd824a9c046d195de13547cfdee18d494a8bf5402e2c95ee1bf0faa8777fc7a7d81f33ff43cccaec1455fb2b0b9c64d20447cbe852811d3b54a1d1b6c3a18f35ef52dbf0cfab66a96db78b67f1b01174a0154dfa3c5526b376ba05e0b33de9e70735da16c1a67dbe0f55b655aff146843936fb12713e7d6529acb6649efaf2625c0987d242fb8401b5202c790c7e9f030705cc48a07566d6e3a4d10b578da4dde64b75c6ae1a11bc4a71e5cdf31136db81ece6b91a3530eb3249a78003edd090bcee91102ea4ee20020e73ac92a7af10a348c9161e6ce2a6cb848e560f7b2a36d8820329b916c87e27d456c04aa38794014c7e0c75f25f0eaca91b8e4ba23074c0a461a9b7ea090a7daba4344c0a4e714db56859c6f18c8efcda4250626ba3587fd601dc65d140a31a8addd42513aaaedbeb4b394d827d1e4c23911d04a646e37125b4c9da9f14f84422006b241cfa89c94bda674ac2e79597ec0002d8e5a0a8ec5c7d4df42bf1b8dcb70815beb1a5b7238833864d7b3f9a9d242a5690b72909ff7eeebf0b224595a4de046d72b227216019d590348261bd3b8c101e6d3321384c01b74154997f4a189fc6b89f05c47b7895869eca6ed9c07ea2fe4f745b07eea9cc8a21de7ed59a2297d56801edcd2a5d4b42d053f94b0898f2f91a4ceab0e2748756356c3023d9b9abf66011f1f86e40907ed6955ca1e46107c59d250ee957969a3bb2bdad0d9c88bc88730abe86ed200483e25619224251c2feba259ee36d4c41bbaee398d4112525eb4690385c61a06925486880d324b59936a14334933fd466e597842d4bacd14695d121480a8ac5481d9df785b5b745e1d5be9277e0adcebf6e892c064e84c43e7682c952f16832fe02d3d04100e03b2c7c30072411cf36760c4600609f700f23a98761408ae64d0fd6cf815f825c991e9a408b03771b6dafaf14501280abf999eb97fe92284eba46f61f0050556ab0b0f0b00ee19def9c384f251d19fae21365943c8d5760303da6687bcc79ed76425a600a7a4d47b6bfa053c0ee1df28808f8058984be1171e603a551d0327c4d4f900d4d194222354de5c9740f916e0af29bef08b4991d1355bdef8eab4e56e11d8009fb6989c34dfc26f54b5bfc4c6fed3a818172ee6fe4b3f43cce1f1460e48dacf8c168011d23926ac62a233cf22ccac05846883eab611c481808d738110c3bcd33fa009ca4b9e139320fac914faa2662163814b742830c2a4f6624fb293eaa2512e3d44e184a28268138fefc97969e8ac9e1ca263316d0bfaef8dcf16431be1e2611867e5f4c2859a99d4d21c4d245aaccaa80ef5f3f8e03b7e03712f3df87e09d051fa2e8cd23b3d7bf290170d84fd91ccf2d95a2f32a0266046acb2a4f8e0c9bf55bd5e61cea116aca07d348e9b3c25b221cb96212c43b2482e4837c0cb821b81b8c43a4252a0b85d6aa966d0b5a63a338bfc41a1cf2a26f002795fa356f4b192466d64114082d169d90253c1bc0749e15c8394f8313052a44f22430f0813a7850f1635f2bd5fcfa382bbbeb39b690bd3eea64bca28ab7e73eab9bc5f39587cb0c054b8e2e3a0ac2afadda565b8661c45fde8cd5d10927897a67369b99bdbfbaf56404afb408c7c9d37774f2a4ecaaab2e9d19bfa2ed2e1e0a78486cab242d8a3bb3675c80cdc820e293862c7689c1429e98b1ee6244aea099588123c48f989839dba2ec3cff82dcf4e7f2eaa2e9d15ce2d8ab4dca4c7bc311acbc40579b4669c0c58d5773746104e1c40019fd559e55314092e44ea34a314514069db5a891e30d834d8f6d17951b4eaac7ada193c18463bb6ddc81243adf9fa6594162639a4985b4966ea64f84a9ff8735f20e9bd2284ba0481814eefcdd99ac832f3bbe26684e50f5a1b7c798bc321bea86bcb797e5df7c6ec237224f81266603b938bdebaad59fe74665daad944e63cbb35d36f26fe4b98a8bfc388231e8a5f68c73108cf0e2cec646aa23fa8e9a618459e66fb26099636dfb7e77e3de972d276922c67f6ceab3dda434c58591f9e9cdad48641a5dc79fbd237f1f77508b4f7ed34d883229f2b1b5dbf992cc0276542f599efe53ee119a281c061561c135efaa8437b4a646a6bfebcd30df0faabcbcd7616049d4498aa02658ba389defa5c29a7d068f51277e9e3cc8b3488efe26649682da6bf9f4e3aae1173ec1da63994f03af378434bdf5dd19028039cf250a16ffa433903d39344c502661a94f4f316b631660444dd281314d9e4b9b26a88fad1f910b5411abd79ee89a258f25c711ca209139e5d630777b9f3995c1ee6d853f180dea723300306b0fcd4c687db76b90876125d81d4d20d61f45e73130d1f52d80619389f254318641ff4eccf557bf7a84c52f9c63222b41b850ba3546b8a8966f2e35058c830f86c86c202713c652a4d128f8f7361b4002d4a0b43d058c2ba33639d2ba783b87c35b6b98de4f30ad948b94c19cb30f578867fec6ce7f6b7d943f33f0b850568f85ecb322e1c4f549b02983e4efc37abb01e6b8e22bfd9ae682ebf1714b534661bb3cf6dd43bb8833ce340da85c2e31ba44cd03ce98d920b18d2625360ed3ae1416fd4705d5818053d26314e00706816f063aaffac81c2a840e6f29c4c047ab879e6cbdc7ada01552da5d686f3d55784558b4e93cc436c19aa4bf1fcc20dfb3e809f12de99dd048b9753d216fa53f2facddf6e9c781413041e1492d09c4ef03ba364d5437ef185af634ae9caa1264d7d54fda254ba87d15d24b6df8a1095fa02d62d2f89ecf39f127e861f4182c426b36aec5f29e6b5f99bf7efd5058a53994993753761c8ce800fc1c1a5b655ce2447f03b3f2792578c8476787a816d49c2c4e19c8cece6ea827b1bed4fc85102d5c422ca20554fa46dad3f0547811a0f2f82e6baa38b71849b959e9879a106d02dc320052f884d395f243a26c49b4cfaf0b21d8d34c51fc86951d9b47b9216741b41014e9bcf27cc05c2b591e41b9d5d97b5f9f3885f9d13243a48b9285694f8730426990bb19c7f901ea8effdfafe5e9b7279e22244dd3e207d5b0e3ac109c1802541522509e5b9fd371d4af0ec962494472e6535718971efe16e4659c6fa42f78da6dc61e60aaf66f211007f8504e4c49da82b10cbd0b3cc0e0865d83331f60232deeda4608a3b48f11d8baef4897327e2c016e13680cf3b1d0483db380d5eb9688a8edc0716c5a8c92d819bd3cbb59a68fce9e4d20dd85001a9e21069a87d7b0f0184a19d0b7293e0a055c447dd5b1d2bfb6986476d9fb56ed25bba7d5332a26a30e78567aba061fd0bd2cc6a2687fb819286739e9341fef4f08d3cc32db0d8be6130b7bcfa9d1ceee2438c61576c794635c57bdb8132053e7c6567c20e4471164286a0d989b390e72f4f08654582d98f48bdf620abb8f3b05df9ef470f48b47a07a8f230a24562ca5fbaf9b228056ccc1fedce1be56171e873220b751c8611366ca8e3a1f93c33b467034c9074044ce3c300a28fb594ae44cf003fc3a01e1fd953f1fdf3eea679896a4da75c75cad2dd7827922b19f72a68a6e376f6cda897e060aa6b6d41d11563a39a90512abcb1be24518853d6d2819dc63e5d76b2c7991b4286a60352639304ad2c80d6e88ec2717e108d9e5179bcbcb8915ea5acb137f6345f435c8c0a003c45b345d8b2c88c2ac2e804034ee5f3e80d5e2cf5ac9c3cf4f30d8e7de97ee1651373a9081fbc13f0a6ea98b77aeda56bc7f9345aa7ee16b36c2a0af27bba418b25a1267d66adda69802f7c7ae51e247faa6e0ec8567303afc6f2b9ccf1b63534733f65bd8da31a995f42018de28972976268177298232bc02208c92c2edb0487b4fdd9a04b83291bc55b6704e4ad89d669d72b72e087cac6f22dfb171021635ff34cd7b6a0b72d971d3920a0aa23ebb545acfcdf03075f809e192af0090852d0bbe3bff22416a4f25d0bdb6cd51e9901b7d2936b651d93e9c08b509abfe5d7226c45ed77514dff066b5c3cb7d77aa949c7ce50f1f960ab5f3df69cb51fb9059a344289fbfd82b34c7e36ac1d06c6706e6c325b1f965d4dd395247416f834cea05f4438e9536cc403ddabf86086eb7f4440e7ca480f109695b4f1cbc9b0d2abc04b825157836e25a7f34b4646208d56486027fd444a0186deb5fd791c155c6b01754215d882daf4f73cca77e4b015ca6d8b3f18d9657421b81636c91813f7b355972842bd04df74361dd9dc913e0a20e9eb2c482c88c97c315ea9713723caeb2cc1274b4754ecb3ee2dab3ba23d8108231f656e4f1b538b25225398fe82a73a614a36e43c8e4fc5c4bc9ee3af621430f1765368d026e93ec0f4c9c358ab27e8718163c11a38ca72585e0a00278962b3671b2e5ce71b37200e9faf463b1ae6a9fed3e2e1db55930627f1d289244ed74539a1b88f39b11358adfd2e35d0f17e590f0850eda6b22cb7561c9e49aec1c5b9585150528b5e3d594d9bb52f62223a77cf61261b01b90288ff3c05a0a87b56228c741dec86a3b7fa44cff4b8755b3a3415cd742b1b17a0c1224fb2faa9529556d191f92560729a93586a0f73a5afcbd0607cd013fdc6440fd231df6b62d234594834282f54a2d65e8095cff8a7825acfec098bd8c78112336288ab63f3011ce758374cd252e089ac4c69a7ec285dcd4d228fe530e0302f03ddaeee20a085122b746292574baf34afd1ad3b5ea14483177f2c876910499055b18487730d5b7276910a2ccf94d7422ab18493e7302450c3e4a69ea59c0310037c03f205ca191a2f22c7f47632fdb32180f6ecab5f8fe0a2a4a33239e9da11a811fa617c402ec207eeb8b267569ed4ca92c717d5759b20f314b60ab7c47156744e1395175bdd545be579fcbf841a0e76d8de5215b672d85ed2ede8afaab9ce6832ff6675151421c3c4d293f326191718c306514916c6c1f8e2fd72387b4a18809adce8d5b0fb65aa041edd322002c222dcb62e60b87513e13250099cdb342ca3ecf005488e7b8f24f309d2f111c0da192817549de3a8acabbbc6e2641c1c78ca42337408b6e3bf15e2e65f5d0a458134d317e25e1a9a3198e13567a7749dbfb952d5c1db7221ca6fded8be18f6cbe3110b70c9fa01ee78f74b74fa0d1fa0e9967bf1919f3ab8e2f8a5be225bcee9cd0df5a6eb9bdc5448539afed8458f944d55ce20be40909ea5d4a4a6155127976cbe16692bc305d3c3fd1e73c80096692ae64e00fe660657f729cee370f1bfd9aac0ab642ce3fb789fabef5f069a3cb9cf4929e67a7e2a7f9a4f3036c74428c1de9eef867d87a09e8c1fb8c20be004d9444ae03e2fbf9281d702735d658b5525c1afe4a20f083bc9be2f0d2e175bf22e070d3627951fc5b335bc4d34a46e7f8f6da193e8dd6219c04d946d788de1b65394dd4a5a04648809d0b746c2b5aae8a6ae87b4778f6933f77e1931dd8f241eac7429d2bb05d252cef7dca4c452670aa617558ded6b8d4c6c5aae0c1151130e09c2c3040bb52040c58d5f1aff96847189b7863084aaa95497b058cb9c20678f2f66d9ceb8e573c086c7f9abde1ea6689ff76186113dbff09f621124075a5b8e0b9878c6ba8b24c2c16886755a1768aceed1034f6d455b04294a874af654f3073bd32d7920750d15a0dc0f16da2bf73628b0e9dce9c8000077bc36cb661385c2d7a040ad7b8f9a709e8a227c35aa44fbfaff078722c802bb1a1f90c9405754978d24cd0bfa563d09d7a8577f6b781b94239e658574bea6ba0c1ff5049304666ba1c19385a0f4dd3555d7b42522e72bb0020a7196c936c8502163a9eab288153e96abbb8737a17aaebcf94e0bbaf3dc077bb5726d159de5bf276fa003cb70fd8d408752399b4cbac7cd58084673e1935291b8cc8b73c07c3dddd8663c53d037e685fd7fba9b44d796a169c8fc444b34e70732c7d397f82ccdbb5e3bcd9594f6be5b63ec7951778f34e8c6c5d2cc1ce0cd6ad86e0743a96af89a81421dd57ee02050eb880f230fd434b71edbf2ce9daf5bf7ae209a9fc48871989410311428de71d6203b10ff443533e6cf4fbf16ed777f642fb4fa1533af78e8f28a03c51b6047ab42837cf443aeb8aea0f900e27298bb90da6ffe375c9406b870e75551035d4663f55c54531ea53fdfab38a5f5d86d1d8d2b7b4f2154dc7c7f6cba2e67249f580193be9d0e5f4d6c1a050acf4bb856305e15251db9592203b7d8bc5740b9a19465d468472c3995e0623b350cdc0120ac6104a8dc2cbafc7e11a5f767450a98c909253d3e0163003b8f7b567507636feb377338e8ffa24f486b6d93b6c9266413b2f7967b07850b4d0b590bafa24a8246d945db036559e8d8b5bd1cb92bcd631c334f9fe46d4e74ec55445dc5f2c857128b0a8140f75eac4d202b13babd6c9777fdba92b4cbf5e9d6c64cd96bcd44d7eed5eefcd50e13b5e9a26da6466deb60d6e47491769192e9a688ae1da6a7a972438455ae24b7de77739a735e3c679d5eaabf598de97622d1a41dbb202ba3f209cfd8ad83f9f64ef64c255bb9575dc91e8964b784bbab8233cbf2a8759a269a26344dbb98e40e7b8e9e11dd893c656d73f9c019f3b7bb94e40ed3b2f9ee4a82dd631aeeae2419bb767a0d6bef348a67a68baecd8bf4ae776094beae21faa46d77ca4cb7697a15e1f9cb07bec09eb281481bcad691b210164fb4130dcf8c3e3f61d88447c77090f2c433ef48a3cf93135cba171d833ce24b8c31f64e9e8ebd26795e7b26c221286e878304d2b0687a86bbde91b1a73dcee92290a64dc7de51d02b1b031acd7cb797a77c439047aff20a7dc246a34f9bccf7a28b6e5defc8938e3cfdc9479daad6a75f57c01932c90dd58f6c8c452bbc30eca0cdc6805e475b0773a6bd6a176d77eb48f98eb68e94a7576d93794558d6357c7f35ed322f6bb824fa8c16d2b9a51adaa96b983a3d4d1e6da13f3b458789d847dbdb709072085f57c017d8efd65d19c3b6eba0cd6259b72a5a92a2e68b2a50081d8aaa5c8b76918f93940fd2d82fe65d5fb8539e2b793ecac8f3de7341000fa878dccb5d6e1df9b1cc88855ac9d0ab550be9247410b8d349803b425ac87b17dc0177c015401bb84307d5a75a5191542baa4ff54903acf83d21c7c5051c1714ae24ae0fb2c20b63840f6802d4ab0af735071f2c4244c7878e1a1f244282e0f0c082494f911f3a363a92f8f008e981f38385911e184b260f08694c4f911f3ad246ea48e2c32324f688383f5818e9d9f9a124c9101ed8a3c98f91fc8adcc642bc5f45ee7b2eb8194388fc2e8568eebd6deba44c631965941104e3b978af707ab1a9092ad598725fe6c6d71378e8215706d902846ea8b56de2ec9b394fcd29a594d463a434863a916994336ef1ee902fc78d9a53a4a9e0dca9f58aef750c849889e6de895c49ae2b2e9fb6b9ae689b2bc995a4fa514951e9d09c4a0a9a53fda87e18b9d7c8ed77f76a0edae40ec76ba205da5c096a8b765902be2b75e36bce127ccb4fd950497d32e6230c427d0c58c28026997a23314391e975c6f9256adcdc81be7c0e98a3ac6ffc9e0bd8cdc3535bddbafa17f14ced539f708d3e05a71258ee80b437a8b7fc00cc18bdccabaf4e5997f6c6f48a3f00f3c3dd8d49e12efec5537846ce34114ac02c315502e69634987f5da297a12e4f23f370e90332bf2b81e5876f1de2921230c77f40667825309afcf007e08d3eb428ae415de68079ceb4056113189a145b00020c966ef6e47953e1e4e4f92e45e6485d1879daa44faef1824adecbf55ae6df0f4b9eaf459eef4f4224ed1261929a6521fa797a59d3f3517933e769c30c4e31f46d3375e4f9ae8a3fdd327bb6cbe348b96bdafdee7b795364328f4bf4f28d4573f36d63c9cc5c7164d29ccdf3550d76ca909f1208599327eeb43c3fdb06b6cc9348f73e2679be8a2118733e6eb781335cf05e409f6f163c97eab3af77180ad536f171d4411bf55aa8c7cd6ed42f8c6a1bf1bb3032658da0799e26aa9ae834c5e9cf524cc5387ba8be8e44979927e3c9987f9f1dfb8de9847008f5b1c4aeff5a62ca49fce41fa4c39472bed26dfec6d4a7f832c2b332f2b9984a6099c6d76e1244129c0199dc15d293d179bafc8533cb1c5a9152227cf36569e3b92f94d11d85d112f10884b8517ca3893773ac216b6a9a6a8a1ac17c1541e8d1568626cbd305641aed023005fb0e587cb0e7abd2c4589658092c431a0ac22822cf746863229d2fb6f45cc9486f36758a29757acadab84067a4151b3e64914516f09a79864a9b5993a3129f4ce42727bf0754b98ee8ac19d9182977e4107cc6109a35192577443288cf1864d4269f909278135f20b1e87332e3cd6d273069434491cd833511266d90b6794831c31be3650edcc1c524a5618e853a4760214f2c6349beca30c31be3159780322719e207b2e2c277a902c54d3ede2a672f0843189020894144224d0ba164d99c55761494d3644d4b49219148a1d1898692611886a16428d989360202040c5ff002292545b3d65a6bb58ca43dcbb450d5b24cd3484cd490bbecbd97108f15e22169dac948cb0ec4910b47279a966559968db4d1899661188661d8cd50b2a3a06427da6874a269599665d9485321a58c4e545246271a2914229142211229142291b4ec279a9665170359f89363173421c03668dd83125017405c004de1bef87e03680b20232023dcc546a318a54814f2793256721469a3d169720585b2cc429e7ba5e4a8f30398135be26b2834ca34d1dc4859135dec8a4e507aa058880371461ae9dab9240b6fb20ba405ed0265e1e4026101e502f59048292aa5140cbbe6059a19e80a176405950b5485520fa339c2d94d8847a4591ba38b9ed918d1c908530b6b78b8660fd7c42a1011108f0f55558198010c608b440f3fd82336d188464c000c4b35036ed293f5744b3ce840d898ace7aac17d73f16483115be281b05c7311086b23e6d19f0b92b511fa3c8a2502084bc4e8a1d7ed0215c17834128944225168044468249a1d29db5b7b15501661941c22daa50dd1b5a3d8184d84e99110ce7aa6f0c30fa391482412755c0efd104468141a81a8608108e29a5b070127774d0ca3267532415368d18272a2b564a39696f991e8190e7d848910e14b2112291bc7b493674e8fceb433071bab86764fac7932769e8ce9fd59d3ddddddbd3d5350465ab3513b58e824c1417233e10a24056a554d6191e1544186ef1a09194e1dd3e661aa87c87def664daee8b4c9560dbda92fbe4c41bdfa7badd406f336c5746a7a0d991bbe19f90abfd702822c2b5a81d894cb344354a76a4c5742eaa88e822994889173c4015430b193999e5a1ba33cbdd63a5d5757dd6d4d10c5d6d688204b847c9fa2a6806f4a8184436cc0a756ebf68d2d55c2c87679af1b243bdb8b8879492aa1dc6086a91bccd526af23dc0703af2ae355b99bad0d6608c8c1c78d08a800c880e7029e8b2f375e0b3c14c3eb429e0e131fcf7c8f9125533e150d150d29a8d7f519a9531b43dfa26381d7adbf5755086a6dc4eb7abc0e3fad57ebba713d9e5edb24698c943ca01d6b8dd575590c34ab7a591830605897b541a594f430ca085bd218c9025fcf041f234551aa5ed6aee1c68bc6170c2467fd3b0bd722e6776ca3b1e58136d2a51ea90d665b6fddb236a8c757f571ebaa7aeaf7b24e6d8d7aea147ded5b587235680c852ccd49fcf922f6cc3557cf2454394d1aedd2f93d9f0cd357901b7da0146aac955a20f96450eb8fd12f59afc8c7036f756a63ac532a6140075da7ac8d7af949ce577beac2b2b9faf9685d1a44cc4c318c1104acc03c17fd4907157d67e16200e01d06103146fa686d5c20a767cec9a2d4558d20768c6e21c2437ac1b568917b4850df03ba1bc36ec3e96f9ad6c6083a2ac719ea4dbdeca2e10e62541952a739e764514a5f1e09be9833f453b63ec1193cbc17fd18fd5cf45772ac024e34b9be07505a298aa2a88a06cac650b5fa646d4c7fb0f36d175a61fab631d4192eb4a0fc011623eebe3c94333005d38c2ba495fa9eaa454975a2d676ebd32b6b4304d3aae86463e89cd5e32b9cc5fce24510f175b970ea7bc054efabd19748544062b25faaa44237b8fd97e70df9eecf4c088bd8f75cb47c904e2dc8c95bc895a42c6d875ae1fd9218cd3d1a319a838fe54ea8dddd2d65655100c23824c618615733d75cbb48ccd25cb7c8f3709a302d8750949443a28cf209928702f20972489443628c924a087127c9b23b2e91b2e392aaab9886a824a601be809f8f4baab8a43958bdfadcaa572b52ca29af22b7eb24b9c33169f4a0d183860d68e0b40f0d1bd0e841a3c7bd682c883de19a024c73ef3a3946fb63be5f52b8b87934f7a470676e7c11b95defc81d8e186315bda37540a0b97e50b88de39bfac852274b8c5b347745e1c2772c195ed8b8477e87fdc610e782c2ede04e7e134e17183992b50b842dbba6a6a62647cb928d17710e981b431886fababeae01fdd12bb44448192bbaf679a56c3a528e820f9182a7d0b49fbc35a9bd42c86533c343ccc44528289b75d1565f29cac6a09cb231a2de4250f479a08d41b12af8ebf4d4a7fa0b4f6d6f305aa4df0d664bf4be0f1d07295b9f2eb631f3fdc54cfc2addeab7ba2eaaf57a76cb6e33b9eee10dd57ab8357c35c25779e1ef363adcfaa193c34d7b68cbae68abd6d5dcac3fd93498ddebca422125a87c399143a351adf7bdc1df6e1b13c2400f6d718bb1873666097becf5baa0959132f6d9ec9919c86ee79a9b571bba2ccf48297de8d469723784dd1076ee2ecbae375c49f193198c9430d4ebe59b55db7dd9daeb82bf3678086d8d8ae52b8beac1a597dbdd2eeae37653cc8c4a74a023d738a9e6d136cde55457a97264fd55b7cc0897fa93bf53d63a6db07734d7364b8821e34dcc5e610b9e0c7873d1e0529fb6be037c21e1006fda0e422e7ccc69971f70c64dbbbc9bee7a699bd82277b4e0c9a02e0f9f8033e8e5a18d8ed66942c2e2e5e4d88b76f92320d02ef7f21420f54bbcb9fccdda65742ec2c79bf89348b5527a73b3c58474441fe169833d48ee16daa08f0eee642cf2687b194a98e34dc4c932e664294f8cf8c0175dfb60eaba07f07127d4161595ba31de0bd64a5fb2f6b656dc1dfb5922aa5f7f95bade25b531a2531b037a080a48821a263ec488e8759bb39f6fd0f67265a998112e51a0c30e0729539389e6eaa52de2cdc44fefa9da2d766512af2165f089b606cdf5d56e33f6f5d42a41658acad5c6481ba97a98686932b435aa15af10bbd731bb85e8451b759858ad8d811784e978ecaf39ec3848b9631a9722b631737cc44c34875d36d7313291ede1067af5b1152b4165db39912b8c15097c015fb70ec644f8beb5314b80acc38d367737521bf0db6473f24c6e94cdfdc29b830a25097624e8b9b8e2c629f3f21b0384d1f32247d07321860e94a3cccbb2b90b098c9a78a5e17659961de38cf2092517369412ca28e6414ab8345e71b8d348a6625f70b84db0f7316bd6cf5febd1c6cc67a4ebbadd3a9a6cfbde7b99972feefec54d93a90dabb6d0b6d5a6c915e83a75d9db2eefc210a76e1dc4c9efd6466d0c4551d5df10a28be42b4993a70de6b7809857dea4a35e69b8f110a4842b3f77e0922632d3e690dc9b9f135ca0243fdb479e8bf7264af26f08ea0fc398301e7e015250e55382bd2aa680223f0bd09a76c9321f5eebadcf95eb296787c4dd5bf8badcfb420fa9c47b5dd8865b5f7d2020dc7a5db2ce0b74499718bacd55d6eb55857b6fd55a65ea4397ed5292549c76f05e62cd3484947a37a8d39c843f8664f914dc91a08ff6116db2843ea4b8d7a9ea34c693f15ee06b4979d58f4e793701e9944aad1d047139a44fa3b843c8f241bc9b9090bb89489653913c19a1ec1235b67c31d75cca595edf16c23011f5a18770ad416c1dcc298796089a6c6196e652da055eb0af94d73be94c39938f286e75fa145c3d9e657b59866eb36c30c39a287d6412a9440a69903472937f54ab866aeda11ebe97298793ef567ab50b0dbdbefa7068637e580367b05c1e96009ae0b90471d922037b47a25e4b8d8fab67d9deab6fa9e76a85a10aa10de177ad6a5916f66aebaab358df5e5f41d805404b104184ce823b98ef0b02b32cebc6760c77a199d0310b10af9411ea080a101bcb26771a8be664b748d95c65a25d42f8429d1fd007f41144907ee1788a4823ed02bae4e192489647b27c10876909440291413a6335f40fc85caf04962bfee1dd94b385fe2c11a1e32e62979f76daa50269172bbe481d978b0996872e5f4333403c07cc419c055f4fb8416cf247e892419a135d4224901890cee5e1f620ccea203c139176e1e13b5902c942b29c8664794b44e8d7136e27756442782674fc19b9d39cfcd19cfc9b934e962c6f25cdc9735b2fe9169210180402d101027754de62c1d087f52a81b40bcba54aad179d6e628b3c65c153ce74736fb27c55830fff614b62cb01f386736cf57a37e54c394f868f49a75d7cb8fcf4a35dac4b9a576e5e21e595bfb772794b56fc2e8c9c135f60cd9453e30396409a93b707bd9340a2c869978639be5ee64c3eda45a7befa00cc550fdbcb3c6cdd5392e557b6ee66b99b72b21420599e421f599eb4a16cdd75b2e52c41652311ac691172a92e8f040e987ea1b185c66f0b1842c88b3b7a3b9225e7b98e656243cd3437d91cad616900cca0f2c83d7890b2c7122a78e8c8d6c6c095f6894aac8d4b6e624b4fa49b63c634883e9da4247b597612f1e58e4e4239017d54b53c6d1a7faa6da6de892c5564bf9a5e3555a95a455aaf973c5c563cc425b9e525eed30ec7d5e1b824c5331445c634588d4bf53489dbc3b14bcbe854557109e5e15d79a04f22bec094ded19cf2d72f29f7a107bc823b4a276be2e115ccc4c34a095f58fbd01e966549a924fee46e3e47cf547722b794ed1395c019f23432e9cf292ec9937e5a322ec9d3fa64e1997ef5e95d8e39c54a5a75621995c017f32a9b4dd9bacfc3c496f88b3b4a2f0aee2eee48240d77c71d37c21d17aa42af169da12edf732e49d23593dcb8c371493c43fdd5a2d465a8741d7bf9e393882fc737b6c4c7eea4b89dfe8061ce318dfd29ab83301c82c2cac8cf54541ee6c4df18d30067488be3ea2419e6904837c7aa7d281b63a98baa16ada84f8a7a758b4e365d27c9fd47ea34c4169f494d72b67c961808e95434b92b1cd3409764681bbf1b97e4b925d11c134d34173fbb63fcdd4a40850f98e4fe61228cec1f507f145b99670abf6e69d1dc1586db3d222dba97058e249664f922124083043482d4f0f4842dad7c9d46345784eceeeec6483437e50491609281e6e6a439e699688208ac99873afae50d316ff2a44005da65a25b115c9e454c4e521e982798f314e31c5792dbb23b43cc447373e67858c09c095252c09d3c4d46343715313d0c792a439e2638e42902af6582c07331411fed32e968179907e18e97bb3704de4c873c9ae40eeae4e94c343125a05e65b89d1c9280767927d13fbec013bc96e92dc8d32ddc5119e409e2209332863a9e8be94a72a7c31d2174a220ebd6046d14972c6951eb94526859b728b5dd1d638cf3515e578dd99aece9d6c96c6573168e375114755dd7655ebe70c97ee68ab7945691265b1b8e2b57b89202bea03ea81e10673621c1cd9cb3e7e79c73ce1963f6ecd93de7fc9c73ce391bc7782ee6af2bae9c308ce6e61c43bfc732230e5a702ccd09d19cbc01f2001e0cd013ee330223cb438002156897d23c063290a30978c9e46f286b50b343a3b81dcd92c69718b1459ec6a0f0bd07697c31c06b9177c29542963286186e8c2c5bb4f0892cd0c11e4be59a9332e68ed19cbc1059bec4e81629c465863b3f25a05d645e8411ed5262394227032e727b7948ee9ecf0f6a72f794cc1ecfc55506967679f575055e0b7c927cdf73c1445ea1089222b9be0bdc57c50f244030925f93fcaa880249ae5847f3ccf23a854314a0a3904ef4d3a14d9e8e8354a2d8c6ccf414d7e4e9b262d6655eb670a97ec67abc85234d9eb6eea2c974ab56c017f2d3d6c589490c776870029bfca050939361e437240b26b2374ac3703b1af25d21cbcbf7258dfcb2846f092384bdc1c795e6a43c921bdf2cb295003f3d52d434e10e89dc95261ca43ca95f7208eaf49edaae0f2e9da7d73efa343f33f53bdf4f9699be34611b3353a730131513cdd16bdba85ebf5e5bf4de3151b883237ba35a99da3b1e153af5908da15e7ce91dd0d5344db35ea569f3f74eadc233a35b775229372e4ec15de751d73779620a539466dd86655d7bf69df802714011ab319d3a75a875f730f152cf34919581a742f686f614d034af95993e337107b16962184b3c51d7403646344714455158a36962cef70eeab37be42ebbb6cddc3b91a9adcbae69cd2377d99caa4c7b36ca9ea33315638c233c43c518638d7bead9b56da228ead6c553f6aa66539bdac4a5fbf9ec300d71e24b83709e7d6ea257ab775aebe81398e86df3049c9155b5ce8c0eb20b181d7498065dc2aaf613f4a64a98615b4793b1471b83051d4cd293e3911c63f77a60cd9351a45dde903bf4e4173944ec20099e0a72842fa8418e3c310a6183919c8076e96811f388f8e2c357de511ea20f383e1e30c542b4981846732c99e5176c9f941e401964c78831a7534a062b23659e280a279ca8eee9c6076d9a83375d00f81d448831462343803a601158243661823be1520dfa89620804439d1a5864e776d0a64896a14d7ca141a91b49a49fe360348d2628b4e91618636c5cb2214b35e2a93c43612432901b57a0658637cdc1439b215868b3733b1af0341260040426869101243a896761863637383007ea080183468873c0dcb742b8fae50dc1d202fa5c3ef14179e1c883dee0b5bcdc613253ec782d2f4fb8ce49a2640ee48edb0b1c0225f73b073c599e8ae276241d1d1d1d12e4c0ab6debc8934814e2c8431c263810073261c2041a8981add3405aa77ff4cf93f1ee146e4723cbb78e8e655d4a6ed73f13ec9f5e021ae0bdf4cf6b918fe90b81090c347063b8174858b852e8e7843abc1788d3290f061038287e03520c2e0b4c90e5f65ab21cc0cf91f8d23a47748e407c44477e073b5104e1814c7ebafba2147791e67a9a33d247e24bac411459de0e21cb373ed23f4d244bd9d12ed22e90c239e77cf3689779299f1cb2bcec600fe8a7a675b48b4def803db007f6c09e2c3f872c7fbaf7037f32067dc01f3008e4690933083285b975e20b29b6c89348f7ea64f94a8a2ffd135be429bdf7a704b723492066717fe2cbe8928afef393e547a2ade61ea637d80307e240264de427b457a113b4d3c65415a594d2377d9fe23e06edd6e5c8f6d8f6ae4893ed86e3ca17dc608f6dda986ac22bcd21b910dfc6544eb724b8cd7335c906f5b174924996ffa46f9a8ee4ae9b487ca1b27b28bd9744fa394e421eaecead23e579e56915214fb90b8314e33c1c111d3d768adb45253ba34651495939175f9ae26e54d2372bb88351c2ddeb49c11df788a8e0eeb87b3c19ee6234ee2e8c1156c251d3ec41c2111f791b041de983f6503d534f4f7c8994dedb33491f5247feb8892f3d84d7228f0427b414b2fc8467106e277372da454e1d691b4280024a2a605dde08ae050c21625c97a7615d4ad7a72558349135ddd246de481c224f86e5c3a642f9dc86b40b0877f0d2d1d6367b823638648342987041efa0902c799a93541457d43aac296e078964083437e52191d17b7807838777dccabba7bc23a99c083d912cfb06460fb883c17d05773f790aee4879d42ab8bb79444737dd223f8a4a9a49dfc41749efa5f8262727e7e522cde5c41729e54bc12a52f64892a432b3366b82db491e2559be6b1e394412a1c9a187ba2f7774f1a66b36c81eeda264496412b1883fb10975492f532291f8671179169167599bd637cf85fc95e4bee64ab87b4848b87b466e1e79c41e3eaef59393935b585e1f7e42baca96b295a8bffc2ca904f2cd862703cfd7c9c6cc4fd50f4a51eae509e5f3f328372a29e08b69ba354f4dd3aa7e4cd42dfdecfaa6eb2164f9d1d60920cb8be4435b2765c62c21fd22879013bc91efd13a9acb1dd4d13e601dd706779aa310673e9b9b2c9994fa079b4a45f1e2b5c4d3f8228bfb2247ecd575fddab8e6aa5715fdb5bdebb11ee55a76721d05a55239e8292fa9a01ce52c28a3d153b6dbdce8275b088a7b5d7494873699974f5ea38d41c1ef5e284d9c9c5cd32e4dc3a513edda75458982f2f8686b4814edd7c9c9310cc37e7282728242da5ec64828b56abf36ecda751414ecbaae1d05c37e5da45f97125426910ed31a7614d2cb996c6e74d0d6dd3ca2cd8d603adbae38dcaac22aacba3a62176655a32adab09f6ca1437b6ff5eb625575f24a24fa6834424141b9cccb28b844fa0c0ee9dc520d946347c1af39946327fd9e265f5b77e5eb275b0749dbd6d17c657f563b4dd632d12fd1c8126118b27eb71014173b08c36873fdec4663afeaaaba5bb1aceae271ddacd283b6aebe7ad44fefcfe85db67527af150d1d45a397f4a30d0a81439ab38e623ddbb48f7e323a1c8d328c8394315ccab06355256d48e78ef047d5efd6d1e40b026920d0481b8d40a2572311063a86551f55d5b11108f4aa128d5e5507814418e823d013590f5970a739eb34f9aa2e6817103386d43add5eae96d5219d1b3b3e04a915d5a22e1adc2afe0074bbd5e97a360d730c73ce59d1061da669608f7a9adcf852621dbe777cb44ebf806ef568cec269cefa81cd8700bd6ff523ed96c6948d012de136e4e91d7bcb525bb4d65b064f86bdf59e019c516fbdda9e2d6b6b18c01756f76cbd71bfe0b9b00e1272ad1ed9b2ac5b5696556a8d35dec233cd43b1810a287ed4d72e724ea9853b5f5324de831333d14864139484fb4ad3f49e799e7a3f132e3566221ae13a86d9674a6db416b6376ab62e2bf3decb56c6d8ebb562b5d699f9aa5a312c56ec730570467db4a1db79618b2bf6f90ec7d5590c5700d336e2d2fcb56e7157c3babdbd057535c31df114742b73dd560bf41b5f7e23ee6065c5882f85ad8b0ac12666edadc537d334611fb4b18f102777f4206b61b7a0431b38c33a08c3449b235a7007e814b3e00e1b313c635f1f8fc5f85b50dc3099b1cddacf8a6db5810e13e15d81adb562558551308de11275d0e96fc4d79e5eef64067d5a19ec331057d81f2fb8023803b30781e69429b80238835a3b537f658baf5aa96a59a05bb77654107e769ebe42100874999741a0c763a0c783224db616db40969e6e7484857c1512ea3f72c5e21f4b177b32f67a5df13dd05f84363f3294f8615686ba746ffad12eef51764ff5d1067adcaad747f5c316f54ed19c4ae79daa82584fda5769c95b3b91b278c6b28fcf8e5e7cef51959a39f516502d2ae2923d7cd53cef117735dee38df7083b2a6e5df523439095918fd6de80ef9e185fbd4bb332ef3354aca2014f45e2b823ff70d7012dc371c74232b39dac1863c45d8c91e6543ab10a92bbea303eeab0d28133de21ae767257490acfc4f74a9efe00c16be937e0bd24118f783246973804218e8ac29ab65b3cac628cb7b43a4cebc017f19595a1afafb607ba68b360cdc3342789f8d23c1104efa541e7e92ade4bac02fa60d8c39894ddf52e4f61182ed15b4872d73d3eb02656f15e600aa0cfd53df12589eec92d43505c1c17683be2b9b03ead0cf5990a7750da1b57a60e5360bd1bf05aacc72462254507e22fcbe239655a490167d40ec7f3b1aacaf2514921e5dfe6a39202cec8a97e641933a8e2a31af1239e8c239e0bf8f748d9573816182d62f0bc2117cae7783d30f1080c2431d914dceee6ee6ede4a91eb99a7d8ddda36663ac571759e9fb9e1c31484841bfb12976ccc3cf158ea97f516b736ae39ead43507f972dfda5ebe7e6e7df5d1b5df5778b30ec07cc9817494637f246c63e6d15946dbd51ce8a22d6b0e746cbbcd819e8d2efab5c9bc9c89a27535916dd9354df4696344b89465cf34cdcab25b2bb2f65926da3a27b2f66763b293ed657b72cbfa89fde8d6663fb2ae6d938db1966559349f5816954f0ed3f6c45edbac8fb693db1ce828dbdd5e86e99b84a52c4559f15a6b594abdc3f17ceaddecb30d3bb4d42545fd9ea2b25337fb7d28143af98cbd667f72d069b2b57557b6dee5c8a39f6c9a956da23f3bca369a3c12dd5b37440fda42505816b4687334b9aa16655114a5e829a5f00cac5820c910686e9aeaa3d7a6638ad893a74b9d523136e4d15c84dd9718122902633ca80957be09a70912696eaa70c0b92c32dcf8f98602678337cd4d8f1be461844b935fe010d321ce4dbbf0b8148d4c0991a9161d4ba656a653971d6384524222d05275ba892fb048b74c9f3a3884e34e1a32e1c021cd4dc7e276cfc07424a6e3783d49e478496a78e40eda1c71447c8143865c65b8f088044c2fc288768912420156214f5b98c290a7090e792ea60fe91ad014bdbda4fcfdc1d0efbd30147ae8de946edb53d3a6b42b6c1f26f4a2db0842781ca41c7a0c4188fb18167aad189561e744ee6872c4fa7d1006bd370c746ceb8330cbc660d50a508cd2c6d8d777df8d20262c5b83e6198aba42dbbd8fb9b51b51ba5524a153db3d4c0c6f88ae815c575c3eb36d5ae7ea5054efc85424b54e8c91745dc1c3a46ffa89def1c44d8eb6b120ee4a2f20c04a1de29bfdb8398a3b433febe9619aaaaed709b70b7734d4b32133c530716298e303eae4401f3aed323d3981f0b29cd50af862d624568a3b1d429d76b151e440eaf447bb543b4172077357ad802f2a7c85225dfc91e3af308492335b57eb9071ea9c0875762a2baefc862801034f902ab0c8c733591cdc3e063280c42996798e9a762941d92d7d7919b9d465e7344e0f1fb98d5c493f0412d94a1416690e1ae917bc190d782f6eb490e1bba7854b083c0e7e6e14781c8ccfe708882f1f59f6797aa7488f868fc20c478e49e4584db388e6fab2b75b55104eb02f2ddc8e7b3e2d321721bcda85e6269128bd9459ca1849a4dcb345b774243d688304069ad3c285d0873261895cd81123ed9df84271e7c47e793b3927be4420dd024f2f7189c23b3acd4108ed3cbc91fd6207a9e2421e39ec18f151e16d2965c3d72f728877870079211d4ae48f941d8ee74323865dd18270bdddae785d8f52d6573fae2b6ef4d606a5b5e22653a230673a155124913686d281c189048b1969e555e0d124f191defb083d12236dda5c5715ee90682e624027528a816e8953ce908803319083dbf5cff381a4dc3ff10536a15437f9899f624f4dea1ecd45082145e10ec70561146e079bd81cdc0e3681d5d6471e8d53aa7f1907b7d28dea668910420871d79dd3e3d6c8cc9f1bdcde583206e229ed78c4c7c747ebd00977f73eff744b6c96bc12a40d64f8696ed2ed65081bff547183dbc1233f4794c012129f25edc2a45da0b5c18d36cd451b5cea5db4c93153fdd34db658a3a37b47f718691d16ce0a2f23777ae5a326234105143f39c668e43635c448ac692ec8bcf57e9a8b3ded62e16e52fd94a8a8a3b9b823c79d76794d720777722491ee8d3487cbe141935c80fca8e04115b942c8a35be2df90dc3d1fd8a3737e744bfc1092901c630492e3e395c585f9074e2c37189658614a0d14f28302097c3214741ca1f941a104445870fb2508826364073a4ec88f8a9c2446b44bc9c6cceff188e722c7487e54e8a048eea891dc50c7b4d971c303e2f48039a5f8a090214df27b2eae29dcae45862c2ba4eb4eb0a239bb6694573681c19515a498c808a59432ce08a18f1f3f9a7b3e9a0642086447c80f128a502896935352cecbf91989837432595ebf00f109c4167d624b9f481ca47c72908d39c1a588a34f64d964b74494975e7a25cd93a294fd4494b89fb032db79b86c1750fcca7b47e96d73336b8ebdd6138aa2541ea6a8939389f14cca554e663c518911aba8a448159553d72e314c479f6c2425354f4ea2b66d1dccdb4156e68747fb43bcf64e931965329eb278525454b6975352289a26e2a736bb07b5cd9cdc891c53a4764a9ed266fcc9c9b14649edd88cda658aca898665d48e37d261e2b669c7189e939ad4c9e7b5c3b40fb8bb3d6079ed73d34e3a4561954f7184af3dc32aa437e92425454bf9e829291f1da653524e460781a4e86630cb6863bccaa58c564b9130a5081289441aa56ca47e62e5d9c6032e6d2594bfbc825f73a02ba350944fdb9c9ce02bc968c4d39c90e6668dcf4eefa8892f2ca7e4ac9970582e9fb6f9b9aec0a249f4e9963e4dc11dc5f161c4e7c8758591ecbaa2b4f251d47cf8f8b48b9624255bd93a98575e7a0549345fe9621e9db2a54b96e4557ef2d72e2a5449aaa8dce8ac72d99ccaa145c125d9f58e946b9a06514e4e489bdc3ad226f3320a0330ece4e4d994a7e090ce9559654bb9f6948d269350b49f6cdd057ab68db00c6dd7056197f4b150f844253e160a1f9f5993f9e00e400a2a5593fb3f84d81fa0a03c5af90352bcca880797a270907296a333e9d3c664299f295bec892d8d511845c989634f7cb9ba65ce9eecd496e1d28ca51e446eefbc823f7e80fe5c6ecc15c273419b7b35d97a177b8034b72395c4887b32892d9bbc94cc192325b13cd25c37d5e4fe64125f624f0f2152ad18127a0768b28c528b33a25f988e3bb85d0b017339d22ea3770be1c97850fb044f4e8e6d206deb62be97b6d4dc68ced27c7c863b9a6c8499f8c94cd8984b0eb7271ae9179409f74049865bc88f0a1f37395214759997295cca3e239fdde6c87134471b4d9e18c636d0250a8e525268a30b6e4763d722df1871a6cd95e2a75317c60518d1dc7b29e6885823a2436d1edc3c1bb303222fdac6d827eea319d22b4efc927c0fbaa1f6a1ca1587db43daa51e16e99e36d247da0549bb608787479a4302856be4b980f0f9e48e25c308936cd3afcd3ab4f5393ae091a9e0c14e7e54ec20488e911f153b3892eb74416b9fb83057960c2b2eddcfe090ce9dbf588e52c6d722c77b2f0d782df1544fdd7e5c50b811cf89e311cf459c182e815148926147650a770f0e10875e1896e29f9c18a7396c5b70616e1f2a49b52cb816acc2a7497e43ee70240b20bf2aac68922395451659d821bf1fbc2b6ef2f3ab620c4c727d1af0b931e59e769efad46f6a9a72ff35c914fe01fdb34e5c434c212d11f2539613db9012c72b10e19973cece893c5fee38c94a6793393d4f41d98499fb062ab8f2af5df0665370e7fc24ffae2b67ddedb2fc3eb18cdd37b9719a47e3e4b636d7cd4832ef87e71e8638793ab529b85b090ac97d2824c32179486e4c41c963e57543ef932bf6de419b5ad157af9310db1bef9895b94e2fdff779b4e9bb5e298aa2ea36333d8ba26aa5aa157006755a3f3d3b6d5df5c9b4aa847a40bd47dfa3b5c6abaa4f577d64ec9fadb0374e7c89394f8e2eba28b6af721473a87cb7a2508e75ddd469caafa269e221a17549eee273f4cc25294aab57243549ee22ad3ed56337eeaa4f8ef4f494be5fa7ef115278fa5e95afacccf55b315f6a059c01c2a04aa3154d3a1c0f534a312e4daf6c6eaec6c1c9f5f62a21283a99e9672aee20a5b11e52dc7580a65a5161f5a689d247bb004aca3c49fc2e2f59ad803360f5c91d77f2fb816604519450e3cd7ee76fcd36238ec0f7374233f7463417b96e89a377a2d061e88aee10a2c31b458f2caf22e20b8b111dcb686b713f9a09fd7e6674aeb918baa88574b1ef46a39e61df8d463daa7d8d469d7419bdab67a9f51dcb4c3dd7a25d6a673796c8d22e236be30079c4b5b8f5305d73541185903c4317855e1fc58f7c17701f3a4c5716386309b875aecdf2644898597a66962723e678209ecba854710d38b2352e686f3c9e3c7a689b59e6502874686b744d56226691850bd1855c2bf381cea12542f0bd103d072967d1bd11c2f071a27b6a6dc41c8a1dc2efb910e1229a8bd711f1dd7d11db11303f6b447337bb4f84b3ed75cbec17782f2ecd7a37267eae75fad03b963c75649fe25ef439ab59e3539adf4a139386e85872d63d311811cff2643c11be9a2b8d4a237cab504874c893a9e3b8b2904c9db227b8f1dcf5f8cac2752d728421448e3168440b02814422d1655e16e1d2e833a2cf8fde16daeed6e5c8f7a34d849d26dfed8184b09505b3f5628cd43b961ca96a9be6a44e294afa845a93c18e9452ca9601e47703e4f7ed09f15ce4df0a0fef488f079c1303bfd8d2c1c071f861e51df7b2823b27b6c4edcd680cb1802fe2df031e179f849c042404e9de99aece892f13782d58c01947b021c81972bc187274401c72bc7572a16884375be1c6692e36687a9eb07832a60ab70f7b842bb7f6f18c7047ef39293dee9ce722de16e1569d33c2545aa7db1250b461b104dc724e36b8a4b9f86ceb72480be4e6daf34d21c7daa012c8e45ef7376aef2ce58f74945255e99c1cdf3aed12df39eda37fe438bd93684a0134b9e5d4019a4cb1077cc88d4ba3fea893c83209d0eb5425ee94b8f903a55c5de20a97aacfd09697fdd1d651b744a7a2beaac36ed11bcf884ef18ccafb52661156b9f5d2666dd4f7dbd650c1b2b9147c8b8262b32c935936a9ec3d4fb2db53d95bdae78839eb646b19d66eb5f7a649dbb79f0f7587de1688e810976a5c5677aabff5f76e5d35aabff755129987af7c84690bc51d5dd95eb74c11e854fdfdc55df5910268a6e9a3d32dbbdc8a78b94469d6191b7d9ae665165d62d15f73a2119ea95e297c6fdddc20eb958db1570d2d570c994025422e7c124dc43311af09a884ad55c54d2b158d08000004001314000028140c07c462a150342a9786bd3d14800d9aae54724c9a66499043c818430c0120300000020000c06010008c78502f586b75588bbc10d822f450c62711065e684fbfd3bd016c22b6f55d8ea64413026fc1c58bb8fb9ed66553c9f342454a2cc188084a8928c0278711eb55c55bc1b98937d7f2b22a1c2de9859b402c3767a25772a3108349a8ad1b1dec131cf4da8993ebdd94f2745b7fe97f406dd14bb84e8068fdfa0af60064b924cf0ba91efb859cd5addd1199b3abf09ebefe554afdf698a3405f3e98cdc9b4ace2ddc01427e6c754fabb2a9bc089fc4095f8f0aaaf0e36b930b4655177da3af365bd4842c6dd85aa31f3337e0efdc18c3a4a8c1e3cf6918a11709cace16e4bf95e2b9760b82c07fb648c6830c38198f3849e7a7c0110ef8264ce4ac489ac66e9cf45af714785a4807b33093934aad58d7e894093e15d8def1cc93c46c18f8ea2185e9a0115f514a442b832e5ec611b9b829757bcb9dda25ab34002e7d22d5267a774a5eae61e71860b9d2eec967d7b1e411d4cfbf9011069f6f4ae61f33d82fa4aa43632dc3dbb05e2f5f76616fb24ae947a2a5e4be11f40dfec6e00bd41611da7f5f4e3b4a157301141f9bc1d7b9439561144c953eac27b5da620f4c96bc8a9dbea2261a294ad1aab24dd05d971439c47abceaa9e688a80a95ef009d5b966f2e494585044b5e40aabe54c99e825a1e34fc7f9d17da37ecf49be47f9ab170f26c1205ced2a980a1f50731d3b8b5439eec82e5822e30582ba448cc5fe19f88f30513acfe2b20ed156f1735607d92ff9306114a8ae7a0fd4d580a28ed6a103416168db1808d61d173ead28d82bbee65094ca6f1d08b4801b35f37d9bc3a7325fbb8f9476f86381e6492aff2de288c0896eebb561296ce3c3e5fab76b293dadea3b558983c93b3b1b9cf0c26faba5a5bb5dfef69dcbc7c0b1370ed43d35eb2c9909dc4976466eb66a62c05b9d54661554ae6c144167aaa93e1072eda86d4bafdcdc3223655dc944c2e69602b676dcbbcae77022cf364d7685884a395073f6a65100c0d229bb8689f895ca8164055c5f7e7dc42e33b036a249655bf80b0adab0b5f92e599b21a8af68f99451d01299100bab27be9a07b249359d6baf376cef9786dc2cdb58bf2806022d9e56d9cbc0e688192bc8e786295525470f4e588347506da1cb7802d008c422a2818ed8183c02300960e259c18c36d125870deb3c6a9fc0a14f7b8e92959a62c3e3fc96f1db362a834774c90bc91162fefdf241dfaa026cfd9c6270c462b81996002b2084eb5cbf4d1a88f0440bf6a13b924f444b7913f85402f4574b42516e044c17ade12d8e83556a3e2a0e0ff9445e6f094066e26d83305800e231124dfdb49962e1d33c5a17d668466a3d9dfd520bc9a31c9dae6724e39e76aa7011c34fb63c59064bf1009199ae3eb283bb50569d69a845e6ad54056318a35ca84a10fbe9e58a51f57499df14ba5a9eee0489963e757c408dea6ca025c12125af18490067e074bf756b3dca978d0cc00798a25add13d067d613dfb305d0ecb167782e0eab3b58294591527854f2b1abe21a2da0f081a01d29679aac1c41d03fa883144481d032aee0eb7cc5589fb84adfdcfd02c19e071ec0617afd56cce2d585083d319335966200420b385ee57d52c24c1677db16f370b6a6d3d17da1ae03848cc75d25a19a086ae41f3c14a3ee4440979d8f2a45350de0b61a6b1c95df411ab759c3a185c1c52097b7d77797ea895626c1aa9ec21760aea838e85b1434b5b9966af56ddcb4a4a18df921130e502f717df3b6550179e18e65852ad11ba5c0273b8fe3bc153920cf2c4cf35261ee292dfaa70f524d6246a1df54bcf7317c3f5830abe6d36bac593d4fa22ee651eb9db72174845b880e45e4433a27f2a6a98128b2a613f0239ec5f6ab006274e7e53ed27421ae0463439fc881b5792e669f27b857bd02685b1e89b6085e1b418f3573216a502c1d2c5e33ac813c6f092c02016c8a8e92697b4c1639bfb8e7fdc80f5667181da170da77f089ba0ed63e1d394f444b30460e4187db6c225c0291779a6a4091ffed24f9bcd233e52fbc502cf38c7780482e789fc2150ad3bf85542ce8762286223dc14678acfdea6bf3c5e65504e7c3c1ed0a3b8096cca74d440818b68b800e819689fa670d38d36aa404c4cb253ce5d15d3bb7fb29e88a54de72bb086276e500ca881df6260a18a74a3ea6e0d637e41035ab14a903ff172694868617a5368f6a61ecc317482f7ef3c4e5738df73026597e27d6bd01d1c73ea034d8dc7c4b6f3146415821cef8713ecebe81d16091b35a47d59c583ab9a4c132f004318d433810bd6241d86d238dc62ddcc85cc0bb9abd5d94bdf1c70b650c49ad99fc045a9489ab005979e799baccaf78fe970010f3bfa04ad05810319513d22483c3f6e3cf5d2f9c8a946a9b89de3a65710b538b46632468fb6deeb310181c16b085d7a00e52efcdc6848b6c0c7fad3cf9f1943a9a439f27906d2906a5773934128612d035c2a4167184f9d947f9a823d805ef62cc53478b31c3f6963d97b58d840d1b3a6c7ced57348f124f6d0c4af13a5799d4d041655e5f412536279040c09fd4b525ba948d1c3dc4382ebc80784a8208a158338385ebda69f58fdf7c895e10b2b0a0f5b641e7651d16e53f918e727db58ba17f0d42929891e4e97136140f03d434f1060c7e9896a4322328e317ee81d5f56a63e64d11708ceb1c196a44001fc6b2996944c40e3aef66185870b8d3e63c6908ba21746cb9433ab0188cc3d0644e0e56c26095b7ed208a9efe646eca53f525645344c547a90d9725e6f4b6b5803a8f6ff29576e04aa010b32f47f2ea5f102ef94cc3c7fde2b35cb1e8927db9b87e07700772104a0a1cccae0cf4b883cc34c437f38b021f44aef1e0ef51a9d6e7acfe64be6c56d8352cf38b96ba5922bac1fe232a362bb4819da6f6b276920565491137f060aebd71242595e66785097c61cb4e782a136a4038a720342342782c131faf374498cdff41b87194bf839b2d6021a1ecbe9dc20c5364c3ebee6e685545484b8b282ef762028b23ad52dc22a65a191c2821c629489cc1346c5e33a95f045c5ed7a8dd2e477fc3b0c109fdb901cb87e4d4e686fbd6e3dff32730ccdfc113d3c88c8631137bfb4dbc84c31fca25d059ee1f7b1474863ff575e6f36a870b4d6874515b83402c52e3ee5d237f0b2229f6ad31d9e6058e455f5eaf318ef416ec9dd47a1f745224c50191285a457a10c035f9399e1ecfa1763256e695dd067cbfc6902473d2a77ac5da22f111577f0aac86b90d8f608638c552a6b0a957046ab1fe2146b40b664c3d5a625569efb12914536dbbebf561e34066ba12cecfbe34b40481dbf2c0141d851b3459aa84d71e60ba151da05eb51d48e42d14cea6dc530c29cfc010eebcdd7c46303d8313edd6966a0503a886b91bfc53c61e34062ef0a17948e058b55cb6470222df8ebcf403d87526c9b03fa67c20b8112482cc7d8172336609c46920a5cccf7d06d0a0bff363d02093901514ee301c6c3a9e3a7c74b9ce2125434a0b92f1b8b6cefad5c9fcd6fd7077a25f90bcc89f89e8f6043674ec3ab2f0fa880fad20825ba8e4e43a0207126d38ce03670aebc15618adc19944038e2ee9c6949f2b9346c3c30db6c391bc838bd101b939765c61995c22356f301a0585be13fa414190e27af22db59f984724f1e5c5059297949563a43121f408f57514a662cfd9638ba25df0a0311784a05e9c156688179b9747193f68dd333f26ac68dc7d152d875c9f50b4232ea3d302f45652eefd8202471632d4ef3a1339f789d7e80f46e1ad4888007629138f3668d26ff401914ce52eb7182174241af43b8282f0efd035e148ed218bd90571758e89703cd26e2029b6765ff7adbdbfa020548b7d92096e7f434c47ea16c59bf6dc263063731bfe1cc7f318eae0df61644b8331991192f9265cc74e29601169d7dec00e31cb84c49eff766b2358ae9bd5df80e438786d823130c92e570650b28f66ac2a8db7d362e8e0d984887b022519538824fe118ef546d043428cac3c2aa9c0ed94695d247ebc1ca65d82e2d38479769137b4ebde4299d1fe0a544ded112c5173bf1e168d87a0a4f2dc6934dd566b145b82f6169eaea8f94148f0b4680ecdcebb7414a3f43ed40bdba7b8e5d49f41ceb79b31995845ea6b52b39b81e04c47717f4d1751a77ba6e2aee8c2cc082930f3c88836eb7a1b2ae37411a374dfb92149dc9f882fa3c24871cf06f8381c87f2fca1da3e52882aa25fe5a2badec40e900687c8ec8c86278f615468acabbb01c8bb48f01c536813057b339ab238f1c68950b078e29d49dfe352421e52fa89df339a934c0406d1379eac1c7fa9e4784c4403065e0730da702ff5b917a64a8a2713cda3ba2024fea92605a036038bf0d32b0db0ad80dc968cc116941551b16a12c4b0b468b0381aa96969468debf36ccca614afd6c7d5b5b71a3c14ab3fea828a508ca4186db50bc0c412ad6e7230d628011c5c95a10ef4d9a3c981f86f9e44e4c80009e483fd8815cf382132a4cbe569f39ee0fc0322ea17e8e9530a287904edd8c6b93ea8b20b0d023065c8521891366a483480c19d40609afb4c1fb65fa465bb984400b9e1bd28278b759442862a74ae69b65f31f927a5d60e8afd8afce82b4ec2d7ada7052ef84af2e1c7c871bf2f4ae848f152bf21901a74543424630cfff35f777552bebbfd96a21983a2c1d11f27e4b233b080dba94cc4aff8ccc3a264447433ca9af3a7a37bf6e539404fd599545bbd3def7219372cec0a61e13c6588ce3bbf9336af57beca1364e9f0603187ebbd0302c5ffdd9d8b14f2524dc876d369e9c8015d4fbfbfa88fe209bf092ba0aa05cf9fbafbb5736930fb09ba2699380fb974ba55ae965107dd7cbc8b28771388dac8d75cdc26f1908725c02956bf96bc078e6fa4f169410f154a1e8b23c6ff82f20a8349b0fec99c923cf0106d349905005da5a4e165091bf86b1c0c48775a8656799239c8f1d2cfdca344a292abac19343023c0e766a7d1eb8206b08940061cd94d7cb84d601a01d3dc0f89de60c8ab6f7064ebc0305c11ff46db744cc11d822876731b5304b8ad92338859fd410100844dfdd578ebbc1599717364b83ad95d6b9b496c47d2a4f919b7931b34afec3171f3267fe6512a897597b184c90c4455e5bb564175e8daf20f8e4f0d74f1ad4163782ad6a2313d8b0745ecb8fc27e28dde439f53c9fad660d1be684b94d86f3f04c20e86326d2d83e7c986db37d5ac339cd38c22847229f82c9fd00d8d3b9d981197deb591087f510d5dab01c5aa0787091244b0710912cfb6468806a25fb47455653b6b4d21bf1ac406b2b75ba63869ecca448977aaa5aec34da54f6f57520d954c50aa310561561932d45644a0fd5b715a8bd4884e2290662f0107af7fe16f4c73029bd269ac886afd2f23747e97b30ebaa8457123a22c1345b4169e20dfdad91158b98a0306df49f1d21a174b194c08ca7968b1b4558f517fc8eb9076d32beeebb42babd522ac7912cd46c148533e2d65a5f1555b3815950a04fc11f732fe30e9a76f5c81db28130d366ef44034638916cca9dd5870182b85c7beac0387a5f28d33c9578491fbf6300776a7bc29b46d907dc39038b6975761512b88631c2d34c6dbf95cf8bcc9df50e3bdc376d71cfe97e5fd5d744ab31b85613ee0a85d168b8df51e4c30c292fab86e012e847f14bf7bc87bb72888121a9ac136ce7074e38c1fe466f21080b2b6129ce5f94c77b12322068e62c05e3bbeb0c562107e59117825e772eeb85ad38968442d663e934374d3f0f38eee44979c025a15fc1dee61a309084280bc5e206bb5e829b3d43eac7b31461230211f5b21de9c90857fa8ea66bc9873990ab8d5cb80c1530b5503987a0bd4241bc322523ecb0a60da45a0433f6c1b543639332093ba2644bf07ccb3acf5dab317bdb702a6accb2c5a28942387f71d567b84889aa9e158ff69e541f42ad0509e369081938e79fd5dd95754e10f09da63f7f8d78035d7a5a6ad74b4c9802cc84cdb2a76bd3a20313c9fd4011451c9709a927e6add04246073b033354708dfc01439f8e38fce45bdf6e9eb979327758b766308f140c1a1b9e80bbc8e31b29cd805de6ea69f87c28c0b7e1340aa94134e4ef4286c14a9c47550d1e539550f28225bdfeda8f7a07243f820933c9350d9e9cc2e4e05e04b41e596db86255d961a5001ead7cb95f242205f07820ff43c0721669281adc7e0224812a9c75a03a4b02d445b60641f020dcdc8113999450928f277062f604c9682748909e16fd7edd20ad6e3749608f81b3c4e7653f07a6536c0bef9b3da174958245332fe56271b91b6d2eb83f27c1fc615ea276b532711011575cc7342e99c41b0a73e7900195a1395a32a681f857f50017dabdecac1c76867000539d07d9a1e56181600de8463512a90e2d90b4ab3d00caf35fdb7ac2c20fa5a466a6c10c24acd51e89797c9d1e37e335b329fb3e09725148ec42ffd9d5efc81fa6321d330bd27144e2d113434ec9487899f8fadca778dbfd2d0894801a0341f85b4d1eb28d6049a6a4ba47b0b099ffdee5949a400f0d7804228a8ecef4d6383102859b7dffc440227de56c58640ec89e8c5b3e6ee23bacce8a9b22ec45d60b320ac4fa2f4073899f71ca70a48645ad4ca1998cf063c768b0c28e5c673f14de2ca2f1278c8630bb7b3414029572431bd4ed97d7ea46aad2feca544dffb423b3d9ea107fca6376d4e3fb8934bc027ad1f2830273f9ae2da9322e943db7e1fe0b44889bca4f4aa8026f8e75799784b2addea4b265dcf4cf83900566dc320b1058e7381038be2c4b2db64295ea79a615388ee9113c387be38c8079b54c33defa6aea5d3e4835d5dbc9559888839395e2979108c9773d68ec38b5cc243bb58f7dc117fa4e96f58aae2ade07aaf851bae801e390916303d85bcc5eacad3ef203e1fd4c7889c7c43fab2d52fa561c895a257767fbfb60d42eea2ded46dabc9a915b0d17c35500158635f5e094570b69c87ac0d62b5c9588a0d2e981e6883d72c35b75ea8fdfd6f29fcb21df3c952a017e570d4e4d7dd9614019d64a1c4433566123fcab8912324837d769dcdfb61044f90882d751e0fbdefde6ee555580768c4c8766f68f0b94b775fce3955618a33575ae63a1d97b99efa3a4f6b1ac465bb0b00425292e4424120d432ee70d47d9eb77537331c16ece3775fff236c7274e2ceb673c1756432fe2422bbe69fa34513aeeac10a7e431387d25b3817a7d4628601b022d729fd36afe417345795d5fddc3075ec6533dd82e9bdf62237e4951fd545a5701dfc121ce1fdd962247dc9561967025a04d9aa7d53d41a22ee6c7ff1ad8d5182f99d458539f0ae67f2ea7475d181f238ebc5567e394745b68511b9b1d503208e6b5c4127142a7328a20e5768bc04342e6bc3d0a2700ae62a8edc53b73aaadfbb8c208c0cb40181e9cef4233314bcf80100a91400d51919ad278106622b5b67acf7ab0195450d573969fd210e8eb67afe461bf8f55c286a9bec1fcea6e5094aa5018b5740492fa79c232cce5190a81e32c8309b3e0bd44fc90fe631a47031ada91534d37dc39075d2d9292768d04eab9d2be89afb0050d5618d1dca3ad05b06770986d2e62b99f7e45141e4b9a6e26340b96c97bff9e328836204e5bb353f0c76d2bde7a33aa55a913fdf380ea7d8a0ff025360ba84a59df10cc9f02f4e31bbfe57593339415a6ca68505759de3185fb981292d3604e7949626c2c9f0b54736d70b466b57f291cc610e63796214b01a9dd2d9242eed738cd62b3d82a51addc2fa56885d107aa6607baf8629c40a7216e071f2b5a9e90a4c68b431bc140836f6b83cda9e51c518eddaecb81bed3b16818b164b9c890f4e8bcc81c8e007d05511df3792a51174a3facdd47d3f7abb9ed41af80d8d8fab7af25e0f5ff5c446339b0882ac44ab467667267777c84840d71500410f587f3bfe1fc1928821e821a97a5cdcbe9576236d7f55d8f05e15acda7c92c3a499dd7a5ca10c53ce7a4e019f245089eb0f420d26dbcc103494c63b322b3cb12fbde062e19050606efc7329714736f5beb964627b93e5789304c419514f4e605ad58907700992726e772ec33f2a7d530b15f05cce04ed96438e0fd7898054c68ce5c115b4ae1f0eb4be48e6a8f99d7acfb828aa88a1ea97c00cf3da3c7ba50782045b3e9f31d46e0db0b49597050edae820e5e3de0e6cc1ce9ec464414c3d99d482ad2aa40a79f2982934f797ea331f712d75c3229b6a01dce4eabd72bdf5b7c2f3eec2989100aa1315e54b442ad698c17ba6911d24213a30e5d226fdc41185f4979c58d68c0691ebd195518f9717e097ab5e935d8a31eeddaf99c29678563d4ac4ee44bb992dacf1402b5145998167c42a957552b488c6ad5e448e0b66cc201488c3a927ff3e893ccf57e8e8937bca2058c83aca9114caabf4fa91122b93026fd2d53e446a3504dbb70a137665131e19246d7dc9f342b2d9233b814d4c19b1dd81d2647821b6721fa8b199bfa24a9c38ec63c7925884e565e07c2adc1e74b8b3a568dbc0fe758050d40c08f2a32458e1c693c35261b27ff5ca375267e36fa08d786120e242c8f3c54631537b884f5231e772a2656f63797cd4a0bb3dfc2f4a808eb55c14374092cdea009c4017eed64c01d9ab93f44046fc3be6a6b0fad1207469cf23a26cdde0939a76d86b0c04bbb6d5ad7482146bec528956470bbe1dc28fbe8dd01e14c2744cc8f64551c7cc38c17b09b6058ecccfc16ec55d1130750c0c2a2588dba9c6a5a9924027758733d8e0aa66cdce8cfdf67b7208129d82f86252d12d89bd57842fa075ba7413196abc3fd4ec8dd74cf4aa0b279ab38f0c7b979c29ec0609c16d2cf00b648d13616c39d07670e0ad288c0f1cb3214d65302c40fa5dc731ace0886b754ee8a5fd28e08f51d0d67a45191f9b3d633bf209bfc020127c7f0c24f691b25fc5c2842b9c4b516b004fa535eb13125c9e5d5744bcd707457c04f7a6b93cf105df9ffd21aca4838588b8144c7715f56a0811ce5b7ddbd877dacb4e150bf20f801f2e2811eaa70678e3b511e173abd2ead91f636dc12044986d328a4d256bb4bcfbefb8a00e0c5634cbc0d7a63b8a10dc929b29595e9dcb3d7873d6a0e19be2c418722b42b71236654c301a0269c0a1079a4fe6adba5f7da50a223e3686b49ef133db0f025b4b01a8cc609a47c6891b7b32ce23e88606338188c8411a50675945223597f83142a9df21a92023e0e113e9a8892ac228878a8f6b592f924307438c7baa23fec9f7284a713504c65c870c6b248741c143d9d0f86cb82a72f15e3fcbbe98a4e2fb69dc7f083707e950662ad0f4827a9e66edafa6204d747968b214f8d3626b9936c72459b79e496bc9f84aad6257d42387dc19faf1d6f7fd0b0ea9a027d88836b42bdee1a5e8248913a5ace55c85e7bc35ceb46d2b2777a6c4c6fd63988d7d1d2e049c302656dd33f76c60c2cfd8d048df90fb9e17aa08b49518746667a5cfacc15e85ed9a55232cf55fb91839f9d25fedf9345ac80b722a75f8daaffb3df455e2f5aab359f9381311a531521ec0be4a52a9530a3dc4c37b213663d447e19ff1f8eba7d0c58005204f78bb0def85a45a1518e018de7a2b4e1700c96be053a1216c4428cc5bf6e5cb129ead0a5746ebfc6b0cff67b7aa8e1c8e8ee6c2088e0201bc0bcca19a878af3e84d24520a4602efea3e28744cd337d634712a3576a18acc675585adf8e3c20437ccbb52ac17203ba283f702515e00db0f7f0bc7a8eea37ff3fee7a914e8eb3b22c3e50e0f5f846659d178b0b754d48ccf82125801bab0da54def24b12c50a2ce299e2e977278cdc2136ad6dad987a034e3d917fd0d636fa89dd303925cf9877cd3af2e44bc5731d1209627cbf999f5529d59e5fa5bcce41404e08e23432c0b0b50b370ed221ae254a80388db65fddebae27cf56dbd514979ae14494a298b1c9a5e1baf5235c7a024284d65f1d0481e439e8421f57f69240d43bddacaca68ff7965e602e1c268c144cede6c67ac3c3ca5780628cefe3a0ff751bbf709d7aaeb327bd165ac23bfd543df6a7fb149def14c2a3c1301c87f816ebc6fa00c25113264c160a024e919a14e4be895ea19711728f63054e906b627c0e2b9a8886ced010829d7bb0faf4468376e02c34d8702391926899003a7375ab98bffc040239084d754e3e00efe4066bd8df635751922cfeed80b1122a2328d755ea83f884d1023836082fc293dc16318a0f13b801216eaae2a78ddf53f05ed46f08bfcc2df83714f7a7d91214872d73dd08e1cd6bbe89bdd15a8f15cc520402824b082d6197167440bb03e1ca8ecbc448feb531d18a66a92681fe03eeb6968a514071298f9328bd8223c962fdfde752a9ab0f4021a8bde3ae8a5ab8db844b2113bccc512d567eadc83d45da70aebaaf98036f64b7f5ce880fd5fa0b19f290d138c2c9d3b14e9ded4098c086efd4b001e17c212df4432711f12df86f44a4e740929287b01f45ba10b91ab0bc6f477662539d7e1ed298b92d728f089e9d0a5b1f911c3d2e6b501fe0e857ea6c76e2b2dd7ef442e69e1ecda5254bbd1d556aabb3b79c3b8555ed8d3a4fec44ce07acb6205fc5b3f3357d7b8289db91841dfe14f16b298c3700111072c6019d66612006d1928b05e57dd71af42ae898855f07f4196c9161c220cdefb616fd169fd105b68b37017c498e496d9fff209b7d03fd7e5ef1e6c58754b51c6b43faab1906ab80bb1bf2b7da39a020db809e70470a7f2050c28374fbe2859d9c65892ba5fbd7d81f0ba81b471a42eb668b916c842284afd93431a7e60d10085d2af2b66b961903e31f6a70d5903a467776fb779d832cd8f4d6679d7dc2870a36bddc36866648d583837e475af775f8475c46222bc4a1a8476556df8c57e3b057f9c53bb8c991cccc0d1011e6fbd7ae3f8d65562fd6b0235b3453c270eba41c928c3f03e3ead7473a8d5516cc770cbb4bd7ef9827046cdfcc50c8d70c44e38356c1832669401c62d34bb085e1518e7f0e745e375220a45f79e25cba865e88e08f5b1382d3565806a44bd73f3b0c539a2a41016a3ce74a858eb745028777c8c265788db0eef462fc6fea2771ca17906f4e2f1b79961cb3ebc8c42d49374b30dbf4971a38b3c241395dc13b601ce3447d0f971a62cc1cc2438c70c4eeba4320289a789afaf77508f7aa8ceb5d4558aed4a68d6b3b709896269f05d1e253006c47883a3da824f9d67c0779862bc270a2e6a3d36be755b7a475475ed2fdbcbdb52d0394f40432c0c623aac3656330d878af9e7f97f9c12e8f8c0ff25060fad6760dbe47a2d835dd6177d53789673c1a6026fd17725995765bf87e068fde3d9992865f08df14b640a3770680c4b6230e2316ca27eea0f335ed130180b73402ac597e0289ef25cad75646d43dcdbfd9e1c359e55f0414b435bf06f1c135ca2df4367e743a06667b48de376f5e48d167c630fab546482a1d73e1fb600d3b5f87ce1e5f6ed62677cf253bcf25e84da739c0a1cb247be0ceb043c18f3264e60ecad18a7b1c06a2c0996532a6cfcbb08408907829f0a11b4315f084c314df65261e2959c645ded1bfdf07ba2398e3aec9598977e8b752da50d39a9754f2bbff0352d064ee266446fabcd95e5e9c7f8374a67d9c0d280c95256adc034459f59b1a3229c1e32599fff304a1202f5c5862ec225a9c34f306b23e2fa74c14069b926d8c03c489ecb09a0703e5d0256a27cdd26ef209c18ee1ef8d0fef84c757a4cca45515191725b156d170909bb7e2353a6ec779f78ed379d6ff24e88e916c33fd6cbfdaf36c0fbd7229a9d7b62e34f642673601c3303c3a331d8284949fb6814143e0493d46d424098aab238185d78e77672e9d1be116b3017881e2bd894039572cd1b51c91a10e6e55456e9008568e8e9599906250b741a60f5976e6ea60ab00abe439931fdd3ac9a5d18833b22f5bfbd73287127a551c2e53c7dfd888b470dc4573e892c179fc6f43725fe5fdd772c18ba28d3c4abc0a03734bda33c24b83e8709be6d8f79ef5e4bd4d33b961505953f9641a69a92bdea844f7fa421fb018571301ef87d6d866917f20af5f9312bb83e67cca4caf1e74c351615459c420ea7653ab943b05d8b1f9a1473c165cb9fb27f7c8b8c0c0703fd07eda8ca4e0f34f8f8f5678c29b6d09a71a3f27ea2365f3f250e08bfa02d0443f8ae882370d974f4e2c9b924b623ef7bf020bf9c725c993bc47940049577050ee057f400e136f6825a30f68cb7b5703269b40533dd46736176b1836f62dfb0e916c27d823acf37645a6c95727a3b5630f0df6b0f4d272547b607ac66bf6e73594f00d3e251288e5237e819cb06a9585fd063224741f2b0832a921c072d0e6b286cb90b691a472e304cc179f0a9ca1ab7a3610ae41618897f80631749624485897c427040b10813161dc12f7c6f7284328049ff1ee714f9f0473f4ddcffe2bf4ec50ce4838fd55dc82ed7237e00f7e91835f542f2211ce196a0ed0b40a39e40d1f7885c9e095c8dcafbc48ee62900ed8e97a5bf12306280ab7f13b9827563605398c54c00b3b85a537aa9973b001fc27dc521314104f1c2b5c8fa947eeed5fec2ba45f9278c28cc8df5f4767afb1d7962802d1598ca14fa903a4b43d76dcb5a7925b95138bad078e5398e12ddc00b4e3ab8f9e1960969c901820e132a02c7c8a03eef5b37ce1a2a49c00de5de4ee4d167103e5a9f6d73a9b2def844075b82dc0ae0cacedf332b4f61b59d7e03e8b092287b67570f9dc41b14ffaeb64a90864a03d241816c1179c894c0693a379cd4326b6bd80b80640ed29ccc78d9a9f632a35f1b13667b76e22f300c3c918eb2fe74dfcbf404ece845ea95b1e9c62b56a86ea4c5caa8f5213974c6920c3b3a321f574d0e011e4792e1a96a45cd10c4525dc8b72cd1c930c4770f35a73b07f99cb6f86507679e3f9d0c5425140c09b734490e01b746860041fe5a3afad71332e2c5d5f1122551c78f2d45ab458e5ad45237ef680c88c5fb9fcded3dfb22ea37c0b9c33981780b42dd60aaeac2b15ee99be2617c45861a0674a6d6b3d888cd0aaaffc380aff1228b825d2f15c94deb6b663865ecb2278e5c87b0a4dd29f523bc020ac7c364f8d74a41b06c3032c57202175b6eae8245f47acd5e63b4cb0bdc23aa9ff8d826248a8140b249a4adf077086620838b36b5463f8c146e654458802aaed4fc3af9946919fb4a6e86904a45f0a02c0e48a94568b05f80770cd234a950f2a4b2cf03d922a9f33452acfa6b5a1d6fd0408da321135a1c45bc7667ad9c37970a55683cb8ab0931455f2df740aa3112dbdbc807d1adfa8ae360704612329cfc87daaac90db5ca768f03fe876169c5c23562eda05731903ae0e98ecc1eb00b995e2c6f41d48d6b24c15413605e9d5ac4a58f734b8849060780adac3f2a1b48cd56bdbf1912967f03c44bed8e5a00fda1f8458551f2ea55023477a621643b10265e3ada54911749e91967aa39e82898a20202a445332a5c6ddf6d1c31dfebf41f5c07d96fd81d9a1918cd112a6c18615b3ad200a6ff3880a9a3277d49879d10d839d25a26411f2604115b46fb7d9d55344e4e23537200db84732ddf4c27c7beb275a0a37980c8233c2ca76820aa1ccf126d2479f7c4c470bacb90779a80280c0605dee5bb024b6a6ba2979f87c8823ac5f47daee138458079b520607dad693b0cb3a3d5de707fc34b62c1507b0d4a63277c05843a7bb438aba35069b158ef73ac465a644484c670d934e80ae866b71f2a1f1bbb594cfd58d4a0f7b65a9671818df4718630e2334a5837157e416208b2b403326af09551e5650fc7acad7c6f3754288f6060c5df7c59fea1a46da23e1a945db54dc7746785d5d0014e47be6c9f110b11bf995146719577b55d816dfed0c28f4302b9e1f0f96094bb6592566f2933cf956305fad3220f50678dcd4297bfd60f40e7716a71cd9728a34a3c3303d694e64517d4945f72d7a4fcf1d3db116bd3c3daf9a798015d414f19d23f16d4da8931880db42214774de575549e2e6f2182a5e1cd366d93bda92e5d586ca76120e0f3b64127828b362912ace91d3abd84739dfd4a63b3e91b0ac5461411657e2b4e476539a05b7f30dcccef323f54038e8d69a760b88873288dbc245af5844abfc3459c9356c4529f10a77d3b7a5e0fa6c7e22751162e81ce3b8b04cb9db4fc4ca998e85707facb345e3a9ec776c7ef34649b709e62022a17ad8aa6122e73da3601c959c20f4de6ac5b8a667c603846ec976d014b4a11d44776eba818c6f6be16eec0bcb4bf63c0ebdb904651614765dc0fce051bd5020aceeb32ff71b49b1662c5bf8e499cc9752b6fd76446d3465ffa641bf72743588ce449199715d40cd64d145e526485f4b52025a9e1d03aed1d8b62353599b855be49480dd241a9e9116cefd5c224d6955c1bb548590e68870a3e5fe3b099802e04b8f761cc9c9429e8f16b6221104157eb614ba65aa158f47f0fa55ecaf730142feeca65ee2b179306a659dac57440fda91379a95b621faaa68c04071c2bec7fe512319b80f6ec9ecb420fb51a1e40a7af201385b25a41a37e5a4ea2872f4aa90033b404ef4aa5d60cba7b836c61250518ebaa251704ed6159cfcb82d7eb8f344207bf48ef710947ca562c37aa9b4b2576c395b8e7412f91f73685a09c99faefbe3f8a82fbb326d1413db38eea29b65024a3253ed7d100ec16b32a366b0b8183cd187c32df1dc52121bc776e48c50b1279d3bd7bd21ac89d799a00729abcd9ea6c41c29e1fab0b3ea5f709aa6e3a35eb0bb3baef71fab069c35b4cf0e15409bc04c973adc3b906b290cbabcb25650982f852cb223cce88e3a4867e688154e7c22675056b61e07de8b5fd1276ea3bc2a110b12e1a3ff70460f9281dc5e0689472b32dfd1c80425f4bf2d477666532442407cef827d4f577fa8ad8fa7379a524bda4f27f5733a6a970ed27cbb3e54cade90c83aee353472f623653a4c3e615517ac0d5314abb19ad1763876d77aa6c064ec1b83582f1d7dae260b318bc0c970ad4ea18f8264104a73e4b0fa249c582a030bc06dcfa703e56a39f5a212eacb66979e177b6d26a868213cee6e364837860dfdefb4d80010b3b19471c7f6b892f040b23590ea1aa57dbf5afa5319a58a2f662b3bfcff4f0eab2fead8ab1bcdc1441861d8e6c714bbfc840c5bcb293ffd2dfa6d7d8122056bf1a2317c929bcfbfe12d6cd6dd96b6253d67751675786243e4fc66b95e18c24ec88c6fd9a925e14e546684dbb91ce57480703b128891f17f033f14fefceb0aac8a994233f27f553587f916df3d138bb2557caa0299a973e8155f008830fec15dff1cd6ce8a9183bb40bec7386809df95980eafa3f7a5e8e8815e508511b0e2d245a598a04a352c88cbb3a3e4ab170aaa5a9dc9d6f8f242d765d20e9b958f3d859e7318779129863f1adb90b8eeed2da920686a11865802239e9197ef3b6030282f955cb3bcd6cd2a229402d7752b8cf13bd847d64f8976a5d73efc044c4c44f8cb342062408e09c553120f67425097a38d583588fb5ec2c3cab945ae35dc63ab90c9b726599e46382a6ac0f4760c25dfe835ffc84b1739a9acbbbfcd88fa04d395ba15c47fe8c51513027d5ac53869a9524bd50c9483ede4911892d3bd5d4e4622922512f17a301c134824b885e8d8062d5560941e5ba9d88b0798906944d8039365a8d80e5302739953076b13e2bfb454801bae8464204087b56e469b977b0b5b4c49be4ac04f5fa60432de8f98e0e620df616b1a4258f9c1e7812ea63b0ae7b0be852091657701030bfa667dd2144c29ab8ed561bc8be203b19caec45ee1caee9a10fc1ac8e79874c992498c7d49867eaafe4a7d220d183039b188c88f82b91fec87c8698b472e1c3baac17f74040cccf01da923afb49b7602e5eb25adfc5081cceb7e1ac061afc57424601175fbb5d587e98468504c8b7ed5f91d6f981342922f7b815184fccb2f17f3aba19f112127c050b2241337da1c967e2e9e64a43f648c1413d94dd14011c077beb10308e04291f484f66b40915d5da0075a940143021449d96fd650040386303149ac348322f5f3a03876ec031844332238e96ce68f516660c20874cdfd31d802309805d930db4d02a53740689ec1f9ff138d3a07b1c6e8783aaf3ce4896131c8dbb335870a8afca820bc9dfc1eb9266589ba51ac16080fc40ac31ca1e2b97d465026e8b2c648ddf8e4e3268cbf3140689825c87c1004aed4968809a20dd462a90712d5bed6169f587076257d88d7b1740c73dda51b5c31f2183b4e6dbd693438a662755f43cc7ca138b7ea4df3d9694964ba00362408fcf93fad2f6bbed5cdabe29005e6ff2c1dea7bb89d4d3427392eba232acb939889af86253ae25aec24e18a1223904e15a59a05ac32a486ab8778d442707e5f0dd0dc24a0cad5069c7091a7c1375830956c5f7e31920e5e56580e07c29d463408318144d70861655a8fb58045eb847ecf88086012ac59b18da75de7a803ca941b9ebe981d957473ed9b4154d7ea5cef125c7b36e7f24a0c8063d29d30035337a50e740ac94a3295dd725ece9844926b5c82050445adcf58e5791a750848b2e13867f50cca64d9b41109ded800fac38f1c890e5a06afb8e38771bf1a53177cf9e2bf799fe26a5088e31708bc548233b591260a93294e02edaf3a4ebc54b629100092fd1db22e1c84044ed241b45a983cd21ae594b8ca7ef47d45f1319214412f69b875609026c0a1f89f2af6d0ac0420eefd7765895bdf268099193073c9da83ade4b780a90d602bd030b5a888f19f889f6467be7824542b7b6e98ff084d26b3ba37fd9a13e4b31196b02a5a1988365a757c9884dff196c02b4dd306f75e48dec99058b689f00964178eb6914c28c732a5be4333401c0378d0a15224c3af9eb351f2d414ee82e222dfa7c1ece24b3804a4186c7e680be4fe5ab6582ed3591a9bf65213263eb20087042351c1995be5d00d3fd41b6ac5cd01e359b0e8bfcbbd93daab40a3dfd0ea10e83ac8520e49e74161eeff678360f0449cb010bc26097cd610f5330c065f311e2c74ec2b1c9012a089a191eb238321e1f51bc4e9afb490ac3d6673a40e08bce76d5ec96024fc0387e101e53f509fe3b08342c508fd62550f1bb9baa76a6893b64fe12a06c1d6ccb85a223a5c0d19a6f4e1a25881eb83e491ef0c97957f834175f89aa08f0b144abd836ae92b1407ada4b6f97a13a0a977069b2fa8ead770b91ef22c54ab5d17ac0c2bf698c179a1f37d13d748ed7cc25913a178e51a977e4d8b32623a0df8e3b199f8d413e487c12d1ea720842d17cbdf144e1f2fae34d4f571bcc50e8401c55e739460919d9a808d962956a4beca7e0e630e927d162253582ee89efe9c0b822c70f99297e457904167ac440a0c381de2adcbc0f8ae40d9064e4cd1a69be1f9170f5c26ba22668f2a24288b89b21a35d03b80498a4adb9fd01c5ab33c0e265a88bec7356b75b476c43582c18dd957a101098b2f9f2d5c94dd6e195fb2896070cea6c5aaeb34fe55605a09614e98397934475c097e51ac0c0c74572760169044eb04c02a083d351a2f80935a054efd3914ef1ae6ff67a3360250c69957e9e63ff54d52e38416a293b3c813a6dd7199a56dfd517f1817a92459ec20627e0ed234c2c6a47ad50bf5c5e702d3efd7ede020f314c14e7290dfff9f08da6d4b58946a9510ecb7a9b00c8a3f52d8dfcf08fd7116f721b435049044c3fe5edb7b7621e4db0bc240012a20d2f10f3ebd9c21280924227cc2f022545cfb423ffb97bfe8f4723f9f45fc4e1c7f1b58d872baa35bcac12a85030036bc0fa6ce0600361858cc69c1d4effe55abf1a0f24f87a5560467f9f2387e4b757a271afddd4f34c5e2be9910f1a07c57cd0fc23bb12ee13eba4f8f2df9075b88c1298a473c5723456222e0eeb5ba229dc454b73e9a05726e606ccb26f7a7f0c5e1312e375a0ee7453cbb228f36d3c69b3bd780d7a11e6f9015b3839d2c89fa049fc245bd4c834ebeafac27479e5f9148734709f25cb7ececcf3feeb72f917a2d5e828f9f59f523454d43713dd35731893d69458a8ad263188eb08cbd1f946a244c3200259ecbd9201ad8ecd76c1c1bb871495fa9159865355e4985291bb27b2f8a907a78506a1d8b4fdf300b4c3b523673b14f8caaaf7d18504a8f3f3753437af5640bf7d711c241938152da3070db12815a2c8152a4f2685f6287fb47b20293d51f78309e469874f9b9d80423359936dc94702bba5be171b154e0589994202020c414beadd752c8c8c6a449cef3c3d018af7e1e75403e21bbcbddf071ec5365677d2733f7dc2bc495d726ab31d35d88f42e6ca0571ffc21b08384fe81ca3270ecb8b4328ae559749174528d46ef9e6f13b2486de286269f6e2d624cc53bca6eb2bc6238014df7b29b940cca60360d6b0bc336c3279f8a15bcc98915566705940252508ab0e43a4fc1b779a2038d53846d4b82265b8a07d5408168fa32f444d58ca693376efb8b0109b58f206d1e10ea6549d0eab1ffb5be2c0907c30d036146fdb224d843364ecdf29d501d084e20c3d215b960a04e5d4aa8ea8461db411d28509a02bb1ff06c163c1d533d6f7ae76b9c83b843eaf181c39fb9d3c5411bc8a07901b5da5edce573d82b961278a089fb70f6c58891cfe98f6d1ac2383b3f51202d5f8d216ad209a706a2101d653c8884a2db21ca9474b955f116479bfe195b76cb58695430c15229d2cdf07b9b216123b8cbee92e61f9ec1f202460858f2b77d3d8c61a5267244a43332c8f649bff66e0760beb7ca00be6e2172523cba26a96bab074e1af6aa1326b21735b8c1a4eaf3299d700cc2833868a70a5e315ae0f68f39ff90061cba18f7305422cf20cfb9267e3a8235dbc34192a47ddd81b5d872036a48bbfbe78b0d3900142f369d8c612c457e344e432beebe0d90cb211b48ef65493e495350f6c2936e79b98f665ca0e5bcec563a62c0de91e4aeb2a28b8bb8d51ea36b6a12ea799b20953b92c6a5e5a94a413cc6b51072bf5be92962d013c8c60bec2a445a02d6fcbee9297170f74e6bcd43688d57b309d504883cbb45a42ddc9dabcd7a4838f51ec30883f5d2bc6b2ce6df160022efb3be4e44578c9238f0d793851e2b4a5cd21b014504b2b8fc79ae33953aa4ac8d06361ef7ba92fc68b91d9579032c050004a7b7a2821c067792eb22ef165c64ae083720e6d62e694ea41f8404992993dddb5d3bf8f034dc7d8fdc0b3a35740a2e499178ec52e6d6feb01def4cf7432263dd88046b7f79dd068e4e9da33c33f2f333da7c53c4e5522d309cf3f806434ac3102d8f3e663b1de6306038e58dd3152cb247fda1ec2e2eda9c45565711d66cf33b7e7b076709e5e45e3d8c9f9b8554ce2c43bb8a1edc59d185a7056af5257d0047da14b7098bf10ce1d1c37c3cdcf4513389504a2e4c3d84f29e689b4cbb63ab3c1994695a3c0991280ef2a0e6332c4d694befe72edd0818bc5911f5f9bf27b331c252af6c8d004228a46cbc8221d93ba07e92c0f4719d4d4b111ca81e2971e34aefe05ba3cb53f1bf010422ba6cf42b69185fb62e113c0c6f6e6ec05589386a9fb957fba44634d1e4c0c34970f5989c9f926799736b6f7a3340da3788a439abcecbf505c1670ad482d35cf9cb4b74c2e7b0280af57c8cf27efcffa49c3794a778667afcadb670bbeafee4ab65141dbd51c97a719761eb1565d7facc2cb995d653cc0d24fe6aa0697a3b96498f96f0c3ee249f9949e327cba6a83b6338285d8bfdeb6e9f34677fc71e81b075167858d14c5b340a4eca55a6758e3f2ea7da34024091866ecded37d6d56c3340016c1b56be6dbe02670da7d8fccf50405d0b77f36626f0c234f19fca1ccae53d54647d27472ab01943338abd1a8b4d54940e417b0ca55a00ce84254e8045ec70a08fa194e93426c9c090b35c6fd7b964e457468b44eadf4b13607aa666f3272883a8e2525a87c609e89f53dc7ef64b80537f9001565b9c4fd4a48d3b23c04fee8f8bcb3adf7dac1ba8433ac06da523e98e36bc78a3eb9157e2b17c7cec29e3f44bcb9775f502dad365b04ec4efc6f5033f04b6698592b18a644a75118ff0942074882d8380363a2d03abc925cdafc0fb329ba8b3f31f70e6ee75fa0d615b168aa58e9c50a240a294084f6bc45b67abe193566a7f28b040c200856925c2b1ae97c485d2414edccecc5f9e879ce42f2dc3923d7a0c4177e0c27999a72224cbedee6b72ed088ee48cf4516cedf942f29d45cb17f4f4ab1bd4c31d135211266423dcee2619baa8d02b4501f3371b134dd24754877088a6ed6c61dc2edbf47672692ae6540ae4b36a218a6a2450ffb42817e5d67b329c84584dc1d00793f33205ff769f8a212618a64ddb122718354af3d4cf6e5fa8461902befb1fd6d6bd5f45d5f19e2229176a963679232a8a1cd0b4d1cae5c19ca9297dc81814cf2184b0901aae8b745f435a01ed8bfe0af8bcfe86291c17fcc024efdda21bc6a24ed4273fb110a129f62c0fa517fc7652e79cb486c9a5a59dff7026557b0e1b7ce4fade0eded34360c39ef62e196d0dc37a02c4fbcf0e170028086bc0b1692f2ad879079e7a606fc87da1c89a9ce808460b7ec5f5419c07b79a74d93e4a3d0ba9227d5e8cdacf2b77ea03d01079c9e75b72cd8c4cb7d1444b0f21def3ff0cce7b0485b5871f3ade5e2b9fe48ec74cf91b28f1c2f84675933a9fd43d3f2b69e221cf5fbdacb5ba7888ada3a8c75ff4818aebcf98fd17eaf24162d9d28442a22e1262931e3e82fb458331d3a3345affd2f0df1dc031ed0b7276c93d49e9298dfcaace0cc384865db77b5b0cab37967ac21d7a4d99923b3f6bf5390b44fd974d35a2ce88513268e4bcb3ec15a623309d10f79ba317db494eaf8b18df4b7cabf0fbc8d11cce74f9d974cb2d02257c992b3e516039af0db8745f3090975575b8ae0189392fead53bbc365115e80ed83d7ab8c8bd2ba3805d934c2a5f9b161016fe301ce37b38aa9dd7ed40f749b19a51ade875d0ab34cd0f4487062127a56b1fedae843a11d121b668347e67ba5a89630090516b939ed161414dd6313fecb2e97a05991a0dbd1b0d0ed95a06d441f6b45a4d016b2c6a31d619d9becacaa061c569b3ab987c5d9a84f30b1a510c0e312c960bf92f264464e03dde0758f0a42531fd5e94e8bab95ceb918560e48a6d2b8d00815d301cfd88282a3bd9b858e21922199b5d94f1541025aa68c65baea21a33f597f5bbf0b31a60e647647be5d8d02204be612bc0b8d221083e684ee75933232e3148331168a5e9c715429af30f342406511b74bdb3f7a30c00d6d6a46ffdbcd8d6e860fd44e0f3c2b24f38d93870f914de08be1696e24f5bf0d8c79cfcd5a393f53025fdaf862aae71d9537670f9648ce79408e212a0db24e716e2ec8589becaad42c123c11a550485d253d10f41a5ae80c98ef0aa6558cbf6afea6aa20b837476cf3660e8cdea7938b7dcea850c79849c28e3ec4c17ff35ff57db7f25a07c2869c778a4b7e8ff2662dd0bd60ea2d9ac231d71510cee84802ca8c31aedb8a3999e0267f201869410cb3758b3c425a2825eb5462da240ed7c08cb7603c2da1d76fba363f8c54b3d5df89383e438044056ad869b0c0d991ec2a73756611a3a96b9b9abe3acbab9d23aaa25e5aa1b3b5659fb245c07775d388be2d896eca26713505084c668c72b79703c9736d8907aab43cf6527f0b6ac7f38239352c06b00095a5ecf6421ac7da4aea201970924a06a85c1891c9c8a417ba803d397537b83002c2a7de8e1928344873c08f7e810007bdd342f83a58828f3c88d4d42e378a142b3088acf688907efd68bdc36416e9555aad306f58a4fbce4a320440bdee7a36dce16b060c05e63d1b5e16e14ac1d2a05a5cbfed655ad35b30657751d7803d6bf5dbc46d023e138d05f143a3dd6e4965857a4d9226f9fe7fd8c64dad6ae10e53c7f8908bebbc460677f287a307f1cb69bf9a863adf60fbee11d9f04ca11f4955f4b64ab9483c1ebfd9a39f4acd3c6bf821b8aac3e01dd0a99ac0d2ac46ab5910b7f0e4149a64d4172b8a2f80da2236815392f439ccb6f09ed9babe6300e00db970a0a8f3f7d4abf146b7b815af800b5f461626164304a2359bc5af105f4b59435f02b32a2a8435f4311d9e14db454020fcbe180076034816b285d01ce63f0c0292a8962a3024f01428874a1b073b9f19cf9b5ecd413962739525d0eca735447d68b58b9ca6c7695cb3e9e04b94969908a5e046a434cb64d8510588eaffba46d5127c87d95252f36700c51121d5c74aba0fec544da902abdb9e8045db451f82eafdc942bcfa1484d2a0dd634f7636d27e15bcb16247863eeddf5e6d9621393782a833f474dd02ce37db930680c0996f14e80f7b708831c1ac4ad1187084b065827c7e761a297108e459c046db5381c60b18d9807e2e9ae8a75783c138d477cc4c1418ae3d270bac2980511a259c495086246ae8d54fc3853eb963e43c3cae83e01fb93ab4f70a00deabb295ae583399a4abbf080d5dba5835c76839d39064710115dd30dea07117c6368aee51bbbb70c46161b6e185eec65cd03057510d0c51e94d38716ac94acc740689226381b3151a0741232b2ca1a240cbb7c3744ed15684ce26953dccd31a377186dfba679dda9871faae503984ee4a846d54e7dd46109111556043b7581ea547f4bbd7d67fde37a440ca598d8eb08884082f1e739b44b1316f43e895eff360d6f05e29c7c0845dbbead5a7c3b76815c280ed186ed3825c5c844d128f6707563a4e2003dde3307005933b25ddf934c5a7573982754512a15ef3bae532e851e7899278dc86b6614b829ace6a667c44ab6e6de2f281916ec0e159b5aebfe8b4a6ca5cac782199df2bdf1516a10ffefb46afdfdcda97e14a1f8ee590f015d0e02c647ef2d6e787899863deca9dfe21912060cbedc733891d85e3be26a0486b0a2fae54abc97305e3c280648fe3ea002c4feffaf2fc1feef8285e99adb9b98e81df12b93331b48d590428589eccc51fcaf40c36edf12dcf8e70e22fc9d48b2e83b9f2a6493b9a49c6f1361742674728b82300ab4fc4c63f837039d1bc0328e058d2c97aefcae919d35741edb59efa8688006db1c5fdc502a8e24f06e21de81dd948a38b19ae4933e52a3537d3ac6e281e7b1066039883c2a15f21ebb0f8f982ae095df8ca9642cbec428bfddd3f58f324caccb5ad2c9b15e34c15f52833221e20fcddfa73234bce83180a3fa8e9fc8d35fd8101e1aaaf80fc164aa5285abb8f4f37343479aea0a64fc3f143c6e8bae2bc6abfe4cab5eaa52b6a0de6e455e9459b0e165c98852f817fb44aeff7c1842ce0a47fda7d1702a5cd648ce64266b030f739afe6193b30c1cc5fa60f026418d8e01e32400b911b422afa403fe4ba99b5e35191dd91aec12029a6c8b2615f04f46c4b55b4cb3c5b07fef638734a8753afdcc5276f7b547b6a3ec16bc1658499a7c00870a7f3938ca6b8893011c0042fd0ba21282b86c089484be52aa5778066f079b5720bc55d890c15f9a821428031d4beb85691b62507e4ce0787514f7346138e35bc257ad3d09f4473c8205467be0ca285528a3c97b9326c1a4269851f6003b55c652abea66020fe22de3d9a3405600c0813b94663a6eed127c07df30a7b6f6e004e0185878bb5b61aeafd657b3c5cb07db29c0cd24cc9355304ebdc9959292cb568ee4a81e508989e779098a707088ac1c67fc22acd8b9147e8c18fb8db230dec8894f4bf680818e9549b599dc2e155508100d478c52a5a9300ef8a9e8d1d9dc6fdf4b935f2adbbdaa7981540db896ac0d43d7e07de6f899228d4418cbce8fc83d8f9edaef58e96ad838c993771b134373ba51cc91bf38177eb89cda48d51fae07929b1da7c19c8b0d4f3d93dbabbd86478e87389426f21fab86512284f9801a9848b6fd927d918da249f737213852975f21ac9d55ed01381ed3d0276e78b49c88aae9f6e4310b039520a07807ce3430d50b1a2233aac6b0c2c9606bb405f66814b3d57d41216e323dc60a8397267f3bf8f908c5f9ad7247eb6dca1edd9a10cd49f2a60a3a801e8fc426e583e53752a53af7e0c148e2ae8ff7a5131a837659b091239aa18629b6f409c601ea5a2e7a915a99dcbb7025f8ac0a39f3797cb7b56071903d40eea4e8638ccdb758045e86b88e6cf5416e1c644938f48db8b135cc23e94d630491b9196a3839d1956b91946f862ddefeee7ba966bf9f10bcf7e46fc852a9d298cf7c081c0ea1bbae405e28d18aaf422794143fa50a1a80432de62751875ef0a2292ab79d002cd94abdf4d6803bdcadc3100717249adcadf25dbf9a6d2ad15f6e21c7d003913920085cc3f7af22629c605902839062bbd78591d3bb54ceaf4b526d04e7dc689a539ff624d0142d4c7966d74a1368888e10f35972a34921fa98856d188a3a2cdccc1d5bd630b67963304f6cc73075a4757dd45ed54327545a954930d5c027932a12d259b788443fe1e147ac6657fdddb297286914e1292609d5e5800ea418fb9c44305b76810828c2052769c28ee2d150d24fd6aea3371c80ce0340c27a861107e8e50a17d4a11bcea9d9aef03bef6b71852ab7e83915038d3a229fb2cb6517b9d8c3f63957d03ef526e8e63a9ef9f7becf0d9f4a655302d235d9b2463d6a388045811a0f4eaea28b56ddd4e028d80e2aab81e482634119813250fa5a3586b8efac402aa794a5aa38211b079428438b4fcd1c63c94970cb1cae303686f51e7dfa1ffc6058d1dbd132022984fb5184b7d5ce8b0f3f232ddbb88dd86fd468f5c7386f0305d65fc192400c03aa6aad8b3737da202aad7d585de5f4ffce006bd3d3e9f1f0d3f9f241411653af616429891ab1af55acc0f65f8e4617ba2873da760820eb4111e29f2812276a2d8fac0acbbfb8c49c6aa202e487a4ef9e8ac22f4f5b21503cac299b70510ad8b1f4639187a7e6ff093c3a88c9c54f3c059a8ae78ce474e54090d3d0c61ef55f5224685c26d0d74846be5409093cd0e2623e823da70052c8f3f2ef69470440f64a6f9a48a694d04d5df94c55043d5394af69c4e32b2fe1ddf7d6133bf75da003ba6f854188f25f06020c7c72321eeef047d9fd2ab54bd036810686415e02e659391e1313008c18180d1885984e035ac3de90ebe70de20a1e7b60a8e69c33b307bb0af9d833240101fa0a98a155399c8dbfd6723b09c273ee57113a74eebed3b5fcd0791e1bf58469e0bfc4a445d601bc22d4e3cedbc0a5c428eb0cd3f17cb659b219424f1d5135ed821ba65bf3f52194ef25934f5077d1368a2337d1865962e40ce6bb082f738490c850b73213c0a8c342e52e56a2a5103c64c2f1df42ec329eb76ead27d1e0650cf93346990c9e0ada07a3e198880eec687ac46b63985411478e80ceb375dcd1caac6a73169fcfe0d8a83dd4e10fffb250f5134d79345584e4f964659209cd2ca1e099b407a6816189476e240a1d4df0f9e6508cc6b95e13472e6c74a6223d4bdad01abdaf8bfea39911c5de835fa54612b250ea9b99305a0f1e6414f7aae678594041aef626559c5bd530e31cadecbe3645775bc2e8f0dcf16809f1edc6e50ecb754b8381389daec088150442b12f4a3098329198e0f6e2020011587bd952ec6aebbfed1494ebe966e9736897e9873889b8a32507a2c0602a665c31bbca0d6f66073ffabdf96db4cb441c9c4f4fca15f6838567677941d5eba585f34aca928a84f8197a692e8c76322d397f2fc065af3298cf43ae9703576d4bbb7bd67a2f31988067183cfdc7b05d752154243cb09a8a44c55b049ee8bc9069a42a37521ca7b4a613d324930fb49c70092bed6bda525ebab8881c8aaf216b9cc80c99737ef9fd6091037402a843780df4493297e8d398b022585d6357748e1462393a98c581ce2d6b8f2e4f404d5bc93c3c72af8705985b523f4d2ca24648e5c452716b99a1a2f8c7baa995b8c245499b8bd9d520f030daea9e5380a1c1b9557e81255e0b3a4272036754fa056846bc019b0d6f38d62761c1b0ab3b56206a022060786bc6ec75ce60d59930410c35213c66aa2125e3d80c57d12a925995eccb001fea5134735c606d4084a7588a387888a7d4e06a724e876f6006b7b16cce2fcddb1861d735b3a589a714cf4e9214451b06ef47ea276afe58cb0f25bd7c9db2d47dfb1fe716c8ca841724aef6afe6e75f335104b7ca92c846c1cac077232228d4d2ca3650234ded05595d672b04d2cec9520d4c599d9a27460be142324a4bdc80d6b273f860e17597950ab569781dfef5031253999f672e4f804cb076355c0b3cd6420fedd53f0cff0fc28c729c490cf8cdf1be8e56170ba4786b020c9895c01ca970bf290557c5e2180e810558cb2a1b8edb43fed33c7e203d05add7d1d2b053f9e062c5a8c8da4a32332a40226e2a6445e3be67c8ac886aeb0359d0649ab6f20e360eb125b6b70baf1083ea62afd2aee93bf4d35c7d58bed2a5c873a0a8a4a75d07cdf7d17cc564c8ec3417585d247d6556a7a79c570c672a2c604238e2380ee20cb3f0c287431e2d710f413ed173c0a359575fd81e99274836a2492236a443a1cac73a8f8847f0a36349e4ca784ab788f0caba46f3c1ded72874b3f3054de4dd72cbacbc38f5a3e21e8d2cc03509569d3b1715edb0b5c7b4322b85ebe05e1ceb120f70259ddb7156f81f7394c713c0849942986b391d4632d7a2c0c7304e25132473359808f8a86fce9377551e5752475ae813fb26364212a3a2126544352d01dbb898aa5367747e60fc2999a2d2b3c5d0bfd583697b421f470d981939f369a4bf0518810ba936572c5bdbb5d16338811ce62823eb3e134c964c491ce24bd1a786c357ac66c5146e77d1105856cd6a336c283d1a14258dd76e6e3b94112ed10a4aa487b6bd5ad48927a0600da790a566a505e940bb36432caf253e02876c57b4f93ab805bac86022e111d4acc419af7e0b48cd2a20ab3c296c1f3c53c60f903e4b3012a289d9cd3d316bb3aa49eddf1281ab042d663e3fea979086a59adc652136a27a45901879d5396fb49a167056c0b196774e883c9695a880b352e0c8ee76387770565c9473518756e876555adf948c3024016e0054dacb6ab4c1e21d75c2db08cd4b975dbfe7259f956a6e78e74ebdcc4ee66cc0328314f71d749852203d80873938a7117572401163ba3a5b7b5c685bac9b2e9aab3ce08cd2ec0fc67d0cac56f83a311349d4680ea999ea0463d853980bdda24bdf58e244f76fdaaaaed51843f810f48cf04994446c25f0e79ba5e90ad9729dee6f58ecc6b6c25bef2e58bfafba4fffd780f06a8db3be01b32dcea447abf4f47712bc7cad68758cd913126d3cfa7c8d083d8b046b0f352c132be7c0f66eecc6438336fe5a69e3f19839dc4a6c563a85d2049f5605fa8647b180c438c98005337b5f57819f4efb19bf133b6add27ac7de0708bb0d5989d141cdbc5bee35518a047627bc81a2c882a6cfe282e225b99e04f440b0037eda89e49030c6c9f98508bb7085342b6504add97c653d27dc68ae87a4eb5df6e0019fe62f5cf5abf74828e7f138fbbadd54213e6ba1b3af2fc6b8d6984ec6486685ef90194618be32db295757d0a22f9aab23ae48e1f49c9015311c879e20542da6faa67f91bb52197622906fa787d7784af2716e6124dd2f785c52ea8a2ed90a071434b2d1bd33c902e35664ee2e8091a5fd42f91b1f38ac55f80be264ce827db401ee0490a509033806dc7e53e6b9bd235067cf6fcd4262c0230f998ad37a23f40d0fb870b842ce7a2d129d4240ca7facb3e01d4f75fc2d055dd5f9faa9ae48fdba1648550c4cc10130e358806d7554c41e8e7ec60ad5c6a92da28290c675c465ef805e2423825657b3a241a0408a5a5091e3e05d898db2ea3d1991ad0a5db2b330adcc239a4b8a80abdb84fefa788ea644948609b4b16fab1d56d493efbe9456c2b160dee6b22f820fef7a4a15359e23f38e6769a5092da894b036072ec9deaffa6840ca32f42b91f8fd7f15846ab4c24f95b1135ff3aa467d9c6e101a16e2e9ae800bacd4d7b387be07583cca27439d5bc44cbb5c7ec17763431263030e35c51c6ec14d09a310c4e441397ef9e9d94f729cd780b4d561af649d9688d5363996b306036e179aef10105eb85f79df248ad40b78203ce36002e7016699b1493b3a0f5cb29a2e356a712f35d8081eca3d4c63d6863bfbf35296dc6589d7c3b2902b358ddb7b00eca8371b9dd090b1d7f8fe017b7aa7d27976e540c57468ddd94506f6590520e63ff253477766bfb1a72adf943c8cc4af5142af75e739e1dcc492098a6c4bfd265cb0b2a0ca5ce45e1f30e20d7ee75a87e5667fbba72b9023a7acd690cffcb34988c8e5600ea4ad77046a39a699f5522974bcde8ddaf69a705293cd325b1a432e74fa7972f4c7a3d1eafdf9fffc917dd853cf25bc5257129f63c045219ad58f511ddf89419fbfee981a5801a4d8a5875284bf1d2ca61c4fc2a60ed0007ca7152eacae2d387bbbe19ed6c3a4096ce6a05cfa7ff321009ed9710052cdcba2902aa12b4660b9e27418257e084bf28711f59ae08b942dd95287aa525667a9d11d40461743d6f2e69e98b92e014a455add172865fea974606cc1361065c269bfe4c8595755b8bc21b9895add571d6d693e0c629254a8157572aeb1a9295561e30a09852bcd3782e772a1bf0bb8246b7d14340887c408c995250f15f5880b12174bf508ee3cf9d9e1a3c6403f852d199ecd7bc0280def4d0b287a50f567bd25922597cced48656303c4f21370cc50a74292c3018dc089d132c2dd91fc60b8794500caeacd0742e8fc04fefb6aeb93679cfe08a24f0b500dbe09301b5e941e0e5a30115a433001dc401dcf073da28779c83e5093f96500f2b83f4f88ca1d47081d5fed166e728ad4ddc331f3620fa469da97a37acce094668652a0bae0252201898f490e4014480941d1aa837ed637a21b742ac75baf4f4e5dea0fe82056e3f4cb87280b0e60b9254515cec5286bca36f197d15c9aa743508419fe8a5ce01a6b472a6f6cb21edc8d773528ee29a593eb40e37502539bc9e1ab35e8fc407da69d75fec39670a8a46ddfa8a029801c7502bf5fea26d3465f1d72e8e9ffe06b3e52b007b86bccc9c6a4a8a2ab861a63e66fde8cd52e5b15611aa7e58ef273a85099ef097458fbf76c6843e91a46e8ec8d1f1e1d39b225aa8b58ab579d670ffd1af7d4e59480d3b4cf838c78b2f0ee626f79433b8e94b020d0b198394a1d3a704b8a04b3ac676af420ef6e584aa8747421c6aba6b68d280c2075da7246860caf17a6855e396335e3650a761d82982e7ed9fe45e0f13719c0ac9bbbe4ff48985bc369e5931b2ba795ec1e4036787dc50174285116bf5f8a29c95ccbb775052f30597620a27c3d03ea34ecee8db42c07abf4a7f52519ec07436a9be906092c89c40fade5585e513d6bdc3ee26ac6a0805869fa2dcc6edb088cf0e0eba1a85c8a059660f679561a2d3f5502be42fbc746c2d71c0ac6a8d7dd6b1dc68ad8707ff300fad381f04da9a3999ca69bc415a6b7c1a51e4eb5ad12a6ddc61643a056bb602488ebe7af557420ba9bc3fb168b69dd743db0a4185fc55a4e3a69ea2d1affe7b6ae90a964a2f1d447d4b9c8b5223d87151a1c6c16ee7969b960e0973e16110db85ed91a4419661d1898e36739fcd885fda528dc9189ae377cb2299b2172d98701f1bda1e2019903abd2d684a862e5ebfcf3dd8646fb6f5da7ac0d5693c80b2c5a3fed335e41a8ab21d450349aebfc342aa6d3d6df278fdf23ca1f734b6516a235f4df0e7c344eda60b0f7ff0089353a22d60f58d09090e5d7b0fee245e421507a189f49c43eee8a05124877ca879b28e9968179c88b5124015220a810ff28718c85a181ec0194e97167b90930130109a6c7f375d72e490cf925b517d05b0c228b9bb4ff62e0be906a41597ef3930869378b87ba682504198b2ff25304a82bccf20f39570dac18f7d6790bd32f8f857f0d9a61a6ac002130a4d9ebe5e7b78d53f9b9261a94c14ffbf4a04176a7c70e3c58291b80bfc83918078bff3ae221e4c6ca110a969a52a94af1b4b312ecef5beeebaaec971c6cf2a526c84536915a16b89a6360ffb66fe942c2e3396ea7fdf2099742421fb6af2b05c9a47954478c7dcead7003aa76e9a2be4e1a6c0de8567e6a58fa06e763fdcd8ed7b0cb5586f24eb9f5b867e535b79381d3123a5619a83eb63f0e51fa1c7a8afad5ac6005da311691c4b28f6e5a9918de28e1fc3f0bb341c60aa5742c6ce51ffacb429765aea6e6660396c3500cad30e606dbc226bfb267883f57be9c5dea2494e3f61cc8c2e1e229a1959829b1b372572510e7db8b8fb0088fedf259ee39fd0eca9c13f368d1b42fff7a163d2c4c9a0a0b8d51ac77032e8a1c7c440af3cd4e17c88f11e3de8c8e32f29bf79c44f49cc4c077ea9ed5ef4543d632952c2df88bd495902163c543016686d43fb86d3d3526ef1e33ab285332101162e8cf9c09f2c5ce631c61a733a86b5f2d9718a8627232a635891d3ab8e6a099b883e6f42b36f316b6f54a8a0548e67cb03ad612388f51e380f73cdb11ca798aecdc530e63cf58816d4f972254626732cc8c4c1a4a3de0d8a7acba89d37646bf386b9972ae9f2ae26dc0e941f913ec1c0e20325868e14796de53dc30d5e37160017cbd2036def19c93a940cfddc417a78063b7909b0d22d924e52654320028805fcedf4fe3b17a70772eb38a2561c5176193c074d38da5f8c4b52e080ad423563ba4547630351fcfcdb20c11af46e2f625c3b4dc385a439c2a442cf52740a5abb86f27fd295c9ae8e224e984cd33f0edbd34096efc85928268de869aa92344ce13f21e310afdba549b5a20ae02f21e8e5bb8de06763669c30de0ba22cb8956ba85441a95c9b859975a629bd101e90ab056842a53fa09ad7e0c290a750b54f85b93bda61a9dd6813831d229596da5a0af43f9ea72226bc2280229a7598e4ad811713e04df51e6eb8eb8b9b990ac9484d26aa5faf2ff3169fc992c9d4856d97d82788bc59899d92a60c1e2c3673a790e28071d7a5ef4dc3f9b9f938fb3adfd2cddbc71c29c797758e95a78159c93e4d7f824752cd552b9c95b1d8041ad7292da8b5112309de7f65df1b59fcaf4652f8919f494b39533a802ab59cce26377d2520529c8b2ca056afb46640c6bc230bf305a1b9b069406d98db237683a3370301f18611f2fe0630aaa8cfc1d0ddf9fcf14ff22ab9c11dd9270adf1188c415b72113aa7c3ea77d6c0efb093621c811b4331d3745189efc45222f1ac5dd9c8ceee1f60f413a165f24274ebd402c29e512c30f65e67855ed37ea76172ca07e7b5f5d36404edf3c3832ed7d45036c9bbaf72a45a1a6ba1a2749c4551fae4fe3b5a86317741a9ab4803d1b9dda5ec73f05b07caa5db11c5af64533fc91cc460df8677563f648420d5334c9d1113ee289c68ace4cb5cd23403e6b08132c4cd04a29028b232e76bc7259051ce5692531fc866e7a2283a8c50021812e5721422f64292721849fe3384b0160ee6ab2911f81defbed0c9b94ad9cc38438490627387e53b5412a637aa73079ac5fc81ab01242faf7950ecc77d90dd612ff254b3ea8f4d924ae278e764fd12c243ee6c7c0924dd2cde3700e3f239244361010bb277092b2492c01df6259457a18a924d7f4f0f0005db5b2f839d29f813c6450d92491086ec7767ddc2d5cbf179bd5b9c60710f085363f13093844dc1b8d7cb9b4742dcd8124083e862f6ae78b6b9d9653ad23f9f40d20c33caa490e302621236d7a57756d77da07fd9ba681600b96aa131b961ae52e752921e272aa34ed1691a3f18ced14614f67967c52f23f34571fb212c425bc18812cbc44953c1863056cc3e9a5a51ce04c014637ba7a8abe2430aeae4768085e5e10ada70b43202a4747dd760e9dc7cbc88001d33624173f3610e74d118adca2e0f12f62d6a84c253d2afd810749dab6b765eeabd2b554ca80c6f4da820e79e9320c9b6d10ef05884cb68b06a9a6f8587ef8ec1dbf961f6aa85673ed5f41e1a98485b70d2675dc69c2668d7f9532bc0a4cc8761f66279cc8a36a5cff0584fb69e669396598d5c66943b498561ad6eb5eb00e64b1deed8c6e1083c0ced716c8d98358af08c1455b48cb1c12701634587deed815087c31d4426356d37f6b93c96c1bbb1c3f8f22a06cf9d54643d6eaa05ce1928e75348ebf9a34e41c325a3ac3026145b1742a0116ac860a8bf89b753c7eecc705bf817cc2877bd93b91fff3c6b90ec7dd7179123fc0c068bb4f06efa10931547e82beff0690a0280e193263186397442ea3640c4af412da6838148962b6db1fa3a65f24a844018db88ea3e409c947a0373d46f1186ff30c68744d85a2b89b8e1d7bfb6066603bf674312c753c01d9540c2656c97ce32d3c048e49d935113c3a3c4aa6cee3b5e6cb5e17aa5bf28eb61065bc27132da9a1372e17222c405d8573a011cca025880aa5eec5c2ddb06cd5b353130e9db35a314e2c07e25a4e71bafb8e12f163fe1e8480d90fea1025462fdc28e3af7e26067c30e47bf43045efb39beb01f2fc84072742d1d829584dea9841d3b39b92b3d0ec487fc98d20c5397040608fe0e9edcdef68a0fbfcef4a1924577aad0bea2feb04ddcd60696b06ec827aa242d3b1f6cd1862ffd3e9ffe80ab129ac9fcab0622b901be2095b3cedff8f64ea8728555f867a0b7a7413d54acdcdf49cdf78c506fa42fbf49e7a73d890f3f77ad0fbe8c34b11cda2ec750afc2e55d2b4d14a5be49f31204d2f5f0ff27d063727e55908dd0f4ff849fbd4412ca1a0f406627752cee09e7f4c01c5cf4e0b18795f1dfcd340758eda34c766606c8271dc463ce082e89a716cdc96b9bea0453969c4d8a1e5f6b8c1bc73956b2bbe68d72f031c409f13e87101150ea0c10168b8010537a0e0025438800a0750e1021a9c808613d07032e0eb4ed498aec64642c71d1156e8648302996319ac7e604586509ae9d705985a2b2a9f82a394a165a9ded4b87d1ad76522077d37aeefc66119e6709fc6e9dbf87d3456511421f158e787cb97e3fb6abcd23442e62cef1b18a9c2ee6337c67205277b3c149b54aa7d412eac946d86b87690656b4e2e65364476145f985e02fc639f858657cc409a352bff98b0cbc73af8b993c1fc3fe625800451b65b5d003f416099701b83751aedf75f073fb0f6b2c58006fafb8c55bdddcf5820e211b3ac3f49f506bc8dde4069ae5903f732250f0698c6968aaf7e71ca344ef2e37f99602f47a0884905338dc22fc1591ab3e4bb18de3625699d58d1b565154c3201d1e2355e97066046c4b281a13ccc49fa20e824ce75877929247ca56ad4496c8fa1e21c7f2c5d06238d69a717e7da7b61a7865ba7eddea228b18ed479fb3ced1af958dd082720e4d0bc8327ab4db26285eb1475f7a63ff81a8b922a51a7f2d6458286dbb92e933a8f7c1a7b60413ec24fade41e1f6e916ff0edd95d4de1a68d05c81e3c3d5b4ad6fd0a2bd9c4bc07b981872699ef6c63b9fd03415f39260135213db7d14857e89a1854014530151b0c2c6ae04f7b3b7d028719b0db4225d6e265f2127a79cd7bdd16a86a38c702bc26db34e7212571aede48196430f116603dce6ddef97060c3de085c265e1fa2999be0f0b8634dd31b37b0596ec644bfe48623c0f93820b69fe0e9fde67769a0f3e8dd9532e2d54bd32b37aa596eee40bffc4627d8b93860c63ec1d7bb4def0140efd1b7973a961ca9290cb29739e834a16f9a032ab139f035e7405e71d0c105b24f4939823021015dc8bf1712a6369160d6586d6ada48c85f115ab02b3c4e6f5eea1113c70d51f960dc84960bf7f2e82bc8771b2cd935b46eb1eef01239bf3f642fe83818d6ef4a0799b9da43f0206e10e74d89e139c8efae2080cb260a8625624bb21d83b0cfb813fc0767af522323d8aa6eaf256eb54cad042f3823a384ff65d14cbfe023b747da43302dda88f3ffa40cbd034c1ed1bb71782d9e6c58702bafd3a43b36848511175823c93346d7e99f5220b2a06d3e9cd2f0d1894e61a174c671e10485847cde4b644892b5f27e2c0420f75912673bc54cf318585fd58b8a18ebbe52949ccc567d29ba46b3f995dc1c1cf234944149797a8423db5caf76f04c3879381cec0569b00097e53ed86ff389f1fbd663d382bb31344a6784013e6033768141b02ef06ae85da57d146892d58f1e80e804ab72eb609103013a1f66f6ae8bec2efa514b405434fecaafccfe00d82d0f7316b105e875e6c6dd0075f25e04148927aeb3e04be7ccd4adb39203c057ff2489926e934d995f140c03dd625faa6048f629c9003cbae779cb0dbd766f42c7534f1ca787df84efccf0f74e9dccfd0ce67c369eec2cd8c1c27778006fbad871ddc03d76325a61566eaa305a358e6875cd254d1e459316fbc2253376af7ca9b6ac145b06a86ae1431bbfad7f2fc1bbda566e2ba55c4add1ea00b80a80309249a410ba4fb8c0a1255224627bfa48893bb5dc5873876fb4a3a3e13bbcc311ab731ef79f2887cb61a3b4cec3765e1af7c4ed4b90a85512602341058392b76c299541c7255a199af923a3d75305feb2c00674a6d276b9b84fd2ebaa58a503162a95addddfb8f3bdc469503e1182fb4448c1b76530d2a6199b0546d516a290d759bb8ec618b407a897a21c035cb3b41ba16b6040c7918288634fc524efb7a66b0c4e530b0a6dbdba85454d39a1f95b44dd03ae6b4a4d9b3df4aaa0a720a55b4a51f0a76557b63f22ca879e2207641da5ba797908eb092b37499cb114302a0d5dcb5a950f6001c0dd3f70cd945e7238fce42802b158bce04cedcc3012185e9a41512dbee14a01f92fd16def871baf038253be7d105acd2134cc9bf010a8c42688c8ec39ec9514877a0d60e87e99a235a8d97f840f3a5d760412d3f8c161b7f5b2d8b4efd600d6873ff41a9b3742472a6690739f2eb69505ee2084e54d2850039e77ab89bb8fb938fc318e8e21d56612fa79112487f8aa7c39ce7601b8f047e71cd9276214fa4e2636a958183bd710a96c596e45cc05a4996548b340ace47036aaba9f2e41756e2d9e71af1d22eb0ca49dbfbb6ca29d5b0e5bff515c0db7fbb3e345d8fb2a8d3bbb8d5209fa8966df02f2c7d559f98b3ad14863015f07e1d6e49e2d24e67fa390072396456fffce06416ff53c7c8b57a94c30761bf0e90d8b43b7ca616be174368b1cbd52719cc9cc346df855efa9cb551ab9dc3080383508e207003c927e32d30b99220cfaea4dafc39a89399bcee380efe716d88a3e3f34573bd5c907675211cf096888e0b8d2b1729f69c85c2807b520e7d8fbcff35cfc09c8a05ae76482c87be3e04b8cfbe31a83d09dacc1688b4f33030ac7ca9b3d720410b88cbaee6d46775979a7ee0dabd062009c95f8b9ad73ced1a8dd88796ad1644fd58c8f4a0765c7dbd240de28836a67ef156da1e96e105b3629b799e9533ada2ef04be23eec0283a30668b4b9a693e01f2dc3de5811d337f8608c97dc9602fd3e002b92c30c00cfb72d3d05e7373f039c70b30b0dbf15b2cb6d0e59328908fcf6d735aeab47dea7f5337670ab1da6fcf9f651b4ad09019dc04336cee67cf0c43b94550957a7de4f3cadad98093c1d4cf8d7b9d27a240468c900d481fccb7b51b5dfb978dc23112a8aab2dfbbc2eba3aa1f9df8a4a8b3b1f77a0fca4cca1aa4d5ca05ed2ac2066fc72c01f289061f9066feff8a291b5d9ab0e726f2a85256c76c742d91f009ce6aa1ea1db803531a0512e3beac04a5ac91a59734aabe60321faa235114370f6e9c924811a8fb956d78966aadb9e17daec763d7a7e1d1cf304cf85a9f7ea183abf0ab345a918099fc9eb537078a842021e97a36eae81b5f78415319222cf1ca5231f143cb55f01e03acd05ba11864a621f0480385c6ec3abdd7a337bd06ec1431ccaba330cfd10def2907e6b84e0cc0833225f303e171e276db6931d293bfad305feb3d54c36261c9e8beaea89d66dc93e1661bd2153b6f21dd5a09a826a254bbe5a09f57e09b29bd5863c58346d41bc92fba0fb4cb839b1c1ca293bbe77ab887403b741e06dad7a87a7412447283b2a20b3678c5835ebac4efd655447d06557ba8984f85671c8293572f5d6a467c070aaaa0da51f8d1f726ca1c972e135579ccc45b008a6423c6e35866715c8b60d067e3f6d08c91f9911609f2548f39801fd12210d5b7984abfe80b0a70e8824afe080526c97ab597478c705fd24c4a686fc0e99188559d00e9d9bad809d0b8357c874c045a50884286ce74467c6800c4865765a3bd79dc85f4e11ad11213e320c4cfbf9b92c1688c714250df352111abae7cbcd5249e893ec8afa32d38103d476ca6832d5dbf52e72aaaa718e11aa5dedee11310c7aa84cb4b02c3aa77a9ad274aa4b23e885c51925393deb494980436e2746d0463b7fa4abf921dc5b62205a8d27c82fe17e4dc355807dd567e47372c3ccf4d1b376feb0bdda747b654174fba1688a9a0920d0d15786a0d229fad9e009bc9747bb689a17456046d1ffa846908ce221dc61b9088f9e1466191d634f9b8e6570ff118e13dd9905be3d3099cadba85aae1e2d1a711d89414031859ba6473bac0664eea7a6356308193c90a6e0d5df930c029c324252a874b959294f7fe00747257f0f48afc28e022d26b2280826f22c23d73de43437b38bcbf1fee143a3060f1fed08be127337eb9796715476cf8950708ea0a785e0e052b61f2ca1ee48cd5eeccc8967de0fb830350434df77a45c5a3407c33203d669631417a7e8cafffe3f385df2cf80453c7d7d6fbf38ec072e125fdd9f51e991fc3ca137937761892809501cf3e1fa0fe7a61cfdc6820b1aafd94b99ad092a94ea249e3db505583104affbf50af64f9791f124eac4845a5755e89f359c46f6b36f7f510643aa2e38b9ca43c818457aba155b61d0fe32554d19dca8ee77d8079e378bb723697cca4a39dbfd0698012a0c814c442a4831ae8b0908639234063004aa602e3990987e3a88810190ce64041639402415010fc032003e4b824d767b7121b31748e7e1265508dc019301a0cf0a101a1c1001f377845a0fc26e77d53f09aa7cd0d5cda28b940137d8de1f79beb140e71c312e4afcdf968418ae7de8f7d973ab2b7c8e8030f436300a2dfb4363b0600fd8654d0a7857aff5d68201f265a3212b66e25d13dfdf9d175deec0f0d7f0fd461987f048eda6fe3dfff923ec8d56dca2d858e161a71a031960c7e2001ac6719e76646985632a49bf3410eb522cf5afa462eb54fc2646449de74c26e95505838721115dd18358e37a528b75c5011d8e09b30387d2017bdc8fe6342c16a955ef6b6c5011a473a4135914133196d0c345d83bdf1aa47215984cd17d1c79763db4fc58ac17ca0554d504b34bd34daa2370b5d8026b1704ed0b8538897fb6df612f1cbd0380e6a29dc7ff1fe18f33bfda143e1c3d04243d019f3fd8107a53bdd74a7199ba527122ff23c9687ce8e97235bdb78832690d38b732118d0abd8e3f9f65b7b64819ca991a78fd4b54b75f233250527706307c1aa9e9deb5b00807da8095edaf7662c0679616093a280fc4af87d7ad72d83ed724120a719122382634f5deed60512b2a7c0f73c97ed0bcc07cc0e02b9efedb00936a5e56202ffa47387c07fb6529fc5e59831efcac754855caad1f12f46aab12842af3c95ecf9c208ed333aa1214059809c5742a397953ed5197ba1d2382583932b4436625063ad714190a31901a93a94851416a4fa820bfc1569798298a7416311b503645844c2f84ab91c3a054438a7d1e357e166a0f949cb606c07724e658a41931ea04eb3fddec9d34c63e1133c66e1cb818a35d881dc553a46a9df9aaeb98ecf142cd2e8275393070b4bc9618a8026b82c3b90ebc3e103e5bb4a23d8d6a7e95d69843c4efa3e7e7bfa90718630e4f3b8eae917d249b9438e312175df09668ce2aae7a2742af079e104d07b3682e0b3e637448aa5fdcec2414c6b38f294c002390a5acf4505b1ea21926a3399542077edab17e66e7aad9da3025bff36a53ab0efd7b8e71bd6f45526acce3e68acff14d0bfb849f7713fe72f9dc21afd3e8db8046421deb83aa8f4aa7f0fc240508419e204c227c438a8057b8e067668077bdfc7e75eda41924d24b2754015ecb90aa658699178294a860644c9740c45a91412b2d3c30b82874eb13419e519793eec6d5e2ad8ee8a0eec7172b21e17d785a0946e03175c8fbd5f3d673e1b9a83890689446e058eed923679599adcb41a3817a4200a6ab1e2fa26b134aad190713561ea7aa356bf6c5cb84e8f240cd2c69784b7f1775aad81a894955a20be1b728c3241b3222abf432cb42f472ad11f6d0d0784807a90adf74c3e6aaa686b58bdf870a4b2ad6edab0c3f39a58a53412d4d3110acb7580b26ec8a2d2c114a034f2800894b524880391284942cc412c1ea0ddad3fc1c8fa11367321d7e3e7f96fda54b9716466099b8e22ea20c833334e2085ed2060078120060415b3797bae471f08509250fb4626b402415c1415dd09aee6a244c744ff8ac345e95f5f9af2d99701ca89c4c3e14199ebd9be3aeb25fe60661fd105639b7065d76d4e9ecde6e3ceb141f95dc2f445a4794ca5243bec95acc8de9bf4c55d9d15784d8833482e1798ad4640306db51e469dfad354fe30b414de1d7242c73f45ea05794e2e65f20740138e59003ba27ddb866e71a1887188e15601fb819f3013e3178ef1005810cb08fee4ba971d07492bf768df252f0331e4210f396d81ac5b8c9f86b1d3e4b0e49054226f0727e5177838885cdc9a3688a4794ca8f3d0136de371ce8fd7b40a41f1e4637cf4d04fe6ad5737535e6a72f89e844c7d81ad1ffebf7481d3b38549523c5f3c75eff250601aef71d2bccc559569ce17b7a7f7595dde27e24cce91c26050d5817f30622d761a59ca531f5d42e55a405b81639a1ee00092de3d3cf72c315fb8431627c5fbf285a66e45b967927c0581e2f9f964cfa7197c08ab40ee9e7148651a98370dc50a654c6ea5fe8f40645e1512aeda115e08e136058aa6f597a44411e32c5e8a8fe6f338e6381cf6810151526a09122d27642edd409685f8875fb2655322e9429f23a92be579d17070e6590a702cda997aa90a3db13e484a74da91c25c4b9c8468c10d25aa59b7603900e92ddb633c93f6669a5ad59d571b7b6c62d97341a9418a2a22a0d6091ac21bacdba28724f820646b72531d0056efae619485ab67293deef026cef386f4a5fcff4ab77698db53a06703a7ecee306b74b886db217ed9810d1e8633a8f172c7ddd4c4058bd5e5bf7b9683faede26546e2cad5938153761b1c51e47307d78e497c208e12b2b9782b2e55800f6783c4d89ae188b2cc378220ca2113387e69672b24329cb6922371e97a76358cac5d779c90f5ffb3f75ea405e6bd97f4da2b10b5c675ea9bc2ce6f8f85c5168762e9903167d1f98b0e1a2d5d488b0634b3a1df0e4f3bf4f5a3e8d1271b2fbaab5a87cd6c86782aa795c9d07bdf9971a87487371179f8438ae5a3cf677aff1b3446d0f27f079a85e130eebc247ed54fed88619defdf3d6141abf535ec0daed1d7e9dea3ee813a1559e74c182a885e040c522e988e7866b62140abf665a94108a7c65769c75a5182c3de5cf80e692c7eb62aa435387bf90ca424bd4774ce356da1925d731f118cb4c616285817af631625d92fe659f011986e165fd8562cb8e6b4d5d2bada6e31ada0514ad0d5255a5fbf9de57049834090158caaf7a9f5edd3015cf5fa5c0d2dbf7041cba89c65a0dd9ebde9a10c4e74341ff2a6c052127405bdc34116e159b8cd8ecc26f9ada96a85b1146b41f5503d6b2561f39ebddd3868e0c4fb70f55862d0a032e5b247f8edc9178dc7f70401e2e7931ab576bc1b5aa5c8cbc5e5ede9772c524fb19a14612677abcc749cbafdd6f7480d810883f76399a27a56df21177ebb017da5b2af363e1e3966a9af7c1b41dc3e6473ce8beaa1683fc09477bdc8d04bd5752253ff22b75d5489eab114b1df93b88f579a6e9281c22521043bf0e6528f5ab61b58a346726e0e1ae00d086252a7cc801676e9b0bb17f17eff2ba7bddc077631c47069b4cad7471bc690207bcc1b253f3aa0bb5fbaa6096375e261829043d4980ebeadc1e712143f562fc23bdc6064f49e67ba1523ea594e4ff648cddaab8d772946d0359f8f824fe62d7d381125bbe5e801510f4755d5514dcfd3681a54f8894687158266008bb5af85844e6d125d6b4b25ea81fa5db28a3328612b9810cec27bac377cd6623e144f6db0b080b04275a227656341c9021144577e453a6d4162c4aa203d7c2ca7aed708ed2a78acb14e95fc4407aa2a303658272b03cb594948a82471efe369f8812b9276c9587c6291abff3c79fddbe93d138b9191cf68ac4ecc546aab98952303b37850d7300ff1a62f9d2ae42ec1a72b9a01eccc72c8c95d453c314ca14379739043c67783fa29061220b3433f04108990d1af381931473b91da73625f8c6845b4a4a2714dcfb21c5af73e40b7e70df323c9e5b4fd8dd4485a452aee40814ce4ba66c3215a625de45600915dd96803f41945ddb3589674b991aba2d314a0ae1cf8a1add4a574c88ae1d5c935ae82fe7e828c5d8acb7e22e397f3372d7f7f8299839440728f989545a812ff91372a29d7896cec37a54ca9197bcaaddbb40151567d2ae2be6c3cdf2a104435c62e10f224d14a7827ecd1ef0784c000f8536cc6f4f896a352873790b61b6b373c413943cf3be076973c9b0d00f81cf58bf7cf683d733a7a33c7769cd279eb300010945a9c14a20ab0bb60eb0688ed3ec8bef82aa3d818775ab47d185af3a5af7dc4b45b394fb18e67457ada7a792558d148a6b6b7e677a2b4586b6741c9941fa95b9c13ff1e13b4ba60eef39bd481131caeb86518607058aa52961f40364c523fc7581c93e65d16c0f769dc24202049002a79ee616f96d04247ed0c4affd93222012e9c38219fbc8f625ce17d5ea8366968770340611c9e6ba7338de5ec4ceac5fa58b03a66451e1b78ff38f23853868d21e637dd7887d50747f94011f7a7678358ce51f07a5f1606cfe800f4af5c701c20fa9385c3156b41ed3ed70ea11af0e2695d28b9f98bd3c70b7d241e105ddd85ad5821cd2c89077b857c0f6f0c46a4b12ecbea8bec0a0d7d644ba3ec4e5d84d9bda44a226e8e9538e8af7b62dc5ea7ca7346c6dcad7fde1fde468c0b994115430fe35e6fad7870d874adb2928a99e79a28854f230d74454fcfef8b36a1f540a36768725450c6faa9d0bc3ed9cf2eb40fdd48facb8722e512aed25b9297e396da84aee80f8e9fb038d95f5e9d409715f354e18bbe2efc338089c6f9759a8288227b81f273ec852490a18ddde0aeb920cc06530ccffc50727c33277293be09d34c0ebea8ff651ecc2edd0836e37a06a50bbfad55b14d349f81c3fd9d8597fa9c01382eebb81901242055ae24d3ed18cf659756dc0619d461d699041c819a012e83a8aa4bc797cf97ce4128b9daebb4887a763fec0b45cc3262871d353045e63149ec096f719ea8b9f357a46b976a4a52a94c46438f8186b2d77fbd17075b0e04a75bf826c068b1d4237345eaa16d9e0daba712e3834db89f6ad87f6c8084ba2a7c1b14868a2d84d66a8bfa7037b617dd285b1da66d29026426f9c5b3fd64f7037fede8944f77c9419c3980207d2b6cff9f5c06ff30b640854fee3c9bf111c02afea591ca7be5d081bc06e23ebebd5df60837e0c14daee885ed4920c4ac51867a9eb502051451bd60a0b17e93d928a0ba579d9b2f4d2b1f622bf51b394ee4c5b8f2476f9666efd24558745138510aa6fdce61609727eb9624967f9bbbf41fdc46b9dc3f06046ad286f433169001a831559fe2cdc1982136203f88b78886abc65e2504e48b78ad738f31ba7331a52a786368d4b1a2e705fdc080ff316d598246181010976c72a65a5500180351396c4d69c1709d05e33b468461d6a2af3980c3cbea2548667f46c69da8965246d3d05d32b4807ac933373a818aeacade32b51b34fc2036748cd826f985679194b0adb1a5990f365b92f63db11ecaa960a69a040f07efc7c8c0694f5f531cfca5da81a466c70da0c0c247c641ebb43ff25c30e15794993bd180b9865764bfb956ecaa47111d3c401965d8b4ee49913630b9f980c7834a9d5c97f9c3b939f47ece0aefae346e042ab367ba54201e95493a751cd1ec48d4ff45b323d795eab0d1c55428f66747876876245a9f5757a7e68058fe5696e0626991bca8e6b7657ef3ad70449b86b03c367c1e8b632fa647190b865a6b8d34420869846cb2f7967b073e0b340b570c4f988214e64fdbb7d30f298644219820d06c4e6d5e0cafae3629a54b4ca0c17825301bdd145f2b47962716a37cc9a306a54dcacdb3459e212acfb3b85d15be50d2e483e0ecd12e4df44080685a9865b327a6c86b38890627a61675d2a0f60cd79b5ad3200ea221a230bb3e26a6b10b67d24ca23559bee59c7822d59ae9a23ca73a7990209f4edf24fd6d2288cc5976eab3d58aa36dd77e68473d6edee82b7baeaa8731b26692b553d66c74d1d7676cd9ae3dc6176a2457e4357cec8822bd8cb84b150e599f51ada93fd145a34274c12e5f6bbc96d6f60d4fa3d74db76819aa85fd66d6e6b1eedf0d63648b9b90dc6d429aae8fc42ec5eaa35d14be79d32e131625267803388906314c1b64e1069c12acb3c257e431e44127ac3ed82b4fcc64aca75294f060d487e7ce9ed343ca437b1a94f39e30f56950b672489a65ce1ed21c9e2c4f75bae534871ee9961d4a84e862b7db0d8792def4c8327ad3a09c3138d448bd35a753e84d96383b5b9c5220e9bec2b367f668339fde7838c311c3b3a741195dd810e3ac16a83c7bc289445fb9ea744b4873b294af39dd228f64f98e0adf7ccc217d65195de22bec409975d9c1667526bfe963d4a06c826699d360ad3f0dca8a1355e499f0fdc01e4466ede144ca52fe98136926519a7530999eddd06213a6af06a53667cc349ca72f0dfbc1300502fa429ae9ab093a7de88ffc2950b7cc9efa53812ace74c938c414797987ec894f05591e0706f2b367c6f97d3db387ab35d566d296d1a88b92a6ab931053e4b50cf585dd1323cba376459896eef58593ce1bf651d3d60e9ab1d38ce11879450e9dc8da9968903628bb27aa482dbad02b7228a3cad45ea3c189e11fad1dd881c050de238a704286b539316d01b159489d80124bb840d9e0bb22f72751280d726f992e695a26cc03cc2659a4c1d77c42749147882ad24783dbb90d539ee862ea9ee9ca7e16eb5996c599f504e597d92357e4edc3ce36286bf2253eb2864bae13446056dde1a0a62756778208cceaf4863d918aac5d62a163d04e0e8144a12c82d5639e3e567875ed62ab3b6f380219054498d58f90e557f70922322f9c1a9a1913944006060a2230188d75c64f600242aa5611da22ca2631968cbd59e28c5c54c1c09fc5fab0094415ec49047d219749ecb248068632e6b231532e105f18a04474b1c7feb16c3000c3308cd6d74c4e8eaf199b31f4e4388531e8e4301665ccbebb6c3a91c32d5710c8c8c8982087209091915141ae8f2eb30683628b285b8d4e899225e3cdf2d8123385fe8b2e32cb25ead1b498daa8388988c9f664976366896b449521590351852a61852fac71c444bbb299f2a3070ec41714b9428fd1d4882e33d30dbb32a34761c912cc52aab27cd843fe6a30346c5b57d7366fba18135409da4033fe14318364090227b27c114df8b6c84483da83e83062b31b76b3ac6241ba0504417cd45a332e8b42d949f6315dacec630981a026a936b559802baeb8a2b5437e7ee2d003acfc631ec7bcbc361aeccc6a908806b39b35383922706c5012b1b1baa5735329afa5b8df31e10b59b9a5307dba4cb8595fb35821a84db1d17f2dd68964160e656eb1a56ee7161b867538b0635dfd1617209f329253b7f4a6bec9ef437d0f518fa8d3519f3f50f1b49d4e271c9e4ecf4e3f2d3dd3cbef74e2b6d3773aea8419d020fd11ddf551842f8c41a7874056d93efe88764998c8433ef5ee769c9ec2a1f564eeb4543f4ca552a9d60ed65bbc050e599848de52b773ea346b71432152e34e97653b1ca7a36ec9b78d43dd92a7727cf77459a93bb30977baacc72e47eace8c3a3d08cddefd910a5367e1389d763a664ebdfbdcf093638e79a332b697c2ad1dd93ba72561ea70c4c8acfad655ac837bf7185f4e0fbd14eeec7de61f4de88839935c7f734559f504bb45c9408d868965abc1d9e888f0b28e986f34481fe49475c45c44835eac717a9d51b5beabe976fe587ca6d46536fd48c50c09b79bcee2b676d49fde44ea2537461593fc6e0c2fd77b5edee4eb8aec3eafeeb3ecfaaa8ba33bc7e88ae248965344e1532473ef36cb7957cae4ef4a27e4543d0172ad5d6bf7a9246e74121f4e61edaa2b331d9c774ae110484ead72f7daf54075bf314fa1f7c3c3d889873ccec1bd7b365d11866607596c64faca3ffadd4d376c1edcbb296896b2f7c68e65f73ebd530f7b5bfc1ea666ea13f578439951a69fa6bde77d7ed7bebb4db9d345ddcbf1dd266454f11e84e6d34d77a39e5763eefc5d794596371c52822c65a630049cee749cdef974adc371ba46bbd4b7ed1b8dd34bfd467fb79e8b9157648efbf13d75ef863766486b47eaa737f11df5ee9bb73d77b7003072ea3060c457ee6ebc227fb7b58300397502e4d44f97003976588ccc29fca3efdd7bc6beec39bbcf9ff76c7a31f3b4eca70c631be7bd0c9f775abbbbd7dad1fd7b17a3cae931aaa45237f442efa8cb2e87f7cf6bed389d7b086465af0756390492310c6495e5ab3c0bd952ea11946596798b0bd0a24092b30ffb8868504edae5901905d46af2dce4878486334bc351227cf20b3421cd21102edaec5023a409d048a5a4921464d28f2a2585576d4c264d97c98f7cf956687cc8f331a4524a0aafaa529d1e7177d5cdaec2f248f5135d541d96495e552689df53a954ca43a5bca354582675573d8c2f99f4752ad46d427a32491e613e3e157bc5ba462a7b5ef6dbf6eea44a61524926c92472a9bbea7dbb7b5e97f250a757a1befed747a1505ee85d4b7d9dea8d5d2d0f1f8048ee70abf3de79477929eff574d4e9aa1baa544fdd76dde9aa772a7b3a1de5a94ea98a6559ea5b2a533de5a99eca541e0e332c4ba552d953e7529cea3bba6fdd8f4ef5d885dd877deb52a9ef43a152a99f50ef0a915975ba7dc36177d53f950a7f47794fa550de511895ea9cbaa177d37715a54f9d4e47e1d3877f743477787bfd72dfa8d5cc62588f113ef91b461c216be44db7845fdef1612448bb280c8f0e4e189766f29c47399436311ec62cc09833a6815583621a2c3b2c4f744bf86e14d12da6f78d38a25b324b83a55b253b1ca6538abbef7bec3c140a8542bd1e85eb53b7df97427df7f4b512e44ac7e35d2aab111663236e70e16baebbbbbb7b9553125b4197d5ba21692931ad4d449c30715e737dee467b19c77533e3eebdbb9dc7795dc4dc56c556850ee6b4119b119b119b11d334ab59ab6956d3ac66b50dc95a6b4f354dc3ae691a0f32eee459d35d9c3cefe4791e3ea95017954ae1907e38336d18485cdaaa5871d9d247c489ba21d5cd682bdaaa381171624372426d484e9b116a3b9d70b815499aaf6e27d4e9439df047b9ad8aad8aad8aad8aad0a9b440b433892cecb8f88137443da8aa2c441b22cb33765ddb5e67038eca5b8fcd1fce130c3f1ba08331a0d6b9b8966ab62abe26b4bc399342cabb5d61fa13dfd902ca3edce26eda9996eea2ccb3253cc32cb4cf73c53e6fd46775b7b5967268b754f2f7b77aecbb0d9655c167ee0d9bbebcc740e875ffefc66c2916638b4d8eca46dc2168ab6536cce491fb199a9cd2ca5449c681aae2876c825c5964dfbf4286686f6167bc819596b5927efd8c31fadddc5697b7798dbb66f716ee7b68de3ba731b4a957a5fb59251fdf4d58ddd57ddc6a18781b0b276acc3198e260c84489645b81ff2f6d88a3bb5f6ca1e2f3fedcb449c18929b862bb232e4927e84a65b29abe58e307a17a81d98b4daa18838b19d2b92dfb8a41fde6396f4a347d90dc7cc4ff6f050d216c9da2b6afb36eca27edb5651f25e639cd1edf5decd1b0e4d78d5a0b49c1572a5318cb906a527b31acb19695c91c62571469c51175d74f76e668a7db67dca703864356e7b72a1be6b29a96718f5ec294d3beade148dc319ce3cd339edf3a276f06d38fc9c53725660ae6b2b85978db546b2c59fc5914a61b76a71c6e97c61eb64960755dba4acaf5c915cb19c6c1a9d233b3a47767aa0f39282da1767855cb1dc91ed81ce0e4f8fcf6b87079f947587a7c7e7c559a1b3e3a373c41538cc3a1c3e4e2061be7f387ca0f013a83b41042647fd56b1b74ef770e8237badd3e9a75a3d1ca33dec2e6466294480f281c24f3831e40a278cc10d74b8031eae80411d0a2230280c85ea5f8763e6b94845968ff447910275d51d22619e8857c0a4304d0b18148e02752886404104e643a15028140af513d880417d080acfccccd0d880f94e03c27c9fa161c17ca7c960becfcc9c208379e2a42423c38279c22ec9c8c07c9f390108f3c4cc830cccf713d880f9308be89b2e141c80210b344128e2822dc0a88a583145910d9e70861f182239335798d141d052198460b21934610b2cb022095f8802a6efb5890e1b1c5035c06cb48b3553ecadb54184922768c44ce936ee446be44c3fcd596bb78c44b57b98d164fba869a7d3bb5d60867641bba05dd02e689bcce73cd93ec63e92ad668d84dcb7d34988cc590fd34fd86bd3dbf46a7ab51cb779576e5a585f617d85f515d617689475393a5fa15f9d345df5d52948ddd2cf5ae97bb1802ef49ae0cf62757777777777777777d7d7566db7a3dfd1a21f242c3a0ddab72ae601e689675077aaa6d76a7af7132522da4e4d977e812e85b4a8857e8927ff90e3cf124ddebecfbb31cf9c0653b2f6d6de2c389bbbf0851307d3f141cf1eda7be2b4565f9428aad8ad3e8156a37ad4d73cecde3cdddb6eda6eda6eda7ef2bebdce6004e4e8fd2e2ffd16b17777769d9f3132e95897a4e2fa6afc8285ef47e5f00e0d0b395dbeafea7af43d2c04084e7e40743b52729d69d0765ef8fad3e36ec5b8067ba57fe69c2653e795743b325ab14f70e34cc7a1e9b2238ae69898539ec74023b76115f9b0996c6796b29da9f1f3d5a16c310cc3300cc3300cc3300cc35ed2e1c0565d8fedd3bb9cf13ebf3d9ce71e4a9a1d1387a7af6ffd77ebb74bdf75e10beb0b6b22c897b3a36ebadc4f5b05b2950af9a66ef9a940a98ec776137785c8cc61d49d39882b3b882ad6064b50783a753b4e5888ccdf372e7c3d71a24b8773105d629e39dd42e74fe5681ca5bb1bfa6647258f3c82c924794c92c724794c6d327561d660d6f538610e0b91b9c3a1e95fb7c3bbe907f7e37b10d39ba014c986ebcca75d1a442c36a812b8fdb0e5e818f18dfe81ebaecddba544f40b140c45546949a6412392646bed37ad86352a15826c4d7a55caf6a66e4763aac2e58a061a9fc17af195e4d8e5f81a5df555a3d0dd826b78195861f8b6d03dac56c8b9e98c4517882e1953b4db2b115dbcbf450b142a869ad584d0ec3de694bd9bbc9b753dbc6f58488e20327b980b69956131e1e8a5485a701b2da24888a851a7d813859488fe745bf8b467b929919c4bdeeda7d2bb8b658ad32d28ac93550ea752d3191af6180eb59bded51f179ce9d62435a922d5a35b81a28a3d772b15a28afde9d62ac895a02a748564b9c3f5c788e9aa439d622f93d17c35d91ebbc1706c7785e862b37da5e9166de67facb05df535a98c2f9448aed8371094dc1242f3f79853d645e17b45979fe882cd242396183e2e6421db87958a6cb310a7c8f67328c6c8bc3dac484958489f51b68f712249caf6767b4d4a2459dfc4f5952d0e6bee13658b6204901a1e22b984f3d347457686a6527431125de8ebbb31aad0ae4777add5e568715bf62e8e79edd61fd3ad40a6a04eb1b7918d58900c857d4e6b81eb4f54b1a7b7beba20efd5126acf1a9c3a3449d45d12750b875bda3b3c83b2bd14a95b13964275fbec745518dc79f5bc845e70275d8ec63fbc07911c143e0db7b47313075b0f4f9c062d97ad3e160dcb6223f7eb0362e1e064fb8d06e7d577cd9ccc3c1e23b376d674d59f4eb10ffa108824db872cd9be22e51ffdb0fe68f86bd07e622ed2a965187b6dcd23055b44093b7651f86451f75152d3fe6274a133f1459620ae4417f9449e58ca44152d7c618d2c29cd323a337a39d3384d339b858f9332b90451ca544a250d383a44bb456ed9b9977e726b60890669cbcc392b656525560dcecbe388a1580d32d1555aa2ee0a1d151d1a3a2a8c3a37746da0c2a3bda98993b76e2f8bb8b8bdb4e99616b7ac5b935b16b7973952471ee916d56deaf69247f6481ff9923fdced65d0902492486451bb7e7b792491dad53433c5be4626b959b2b6f518adc7c8de59965191bd7384f1ed6aeffbe29462d8c97ceb36cdccb28fc6c5856172593fb9f17f271491d87e1565db3d44f6ad9be55993ed7441b6efb0f0c5f8c9c3fe37932b732bc64fae753d5a8ff1acf51826adc730897185c86c02e34e9e1e9f1797ced0748abddc341053a24b661fa78dd6b64c6ea6712737e6d6cdf27461dfc29e656f62cfc2bec47e65afb24fdd39348926923b8bee346ad0bebbf3c81eb3af7726994a0d2e3528d3a0fd2f9de914fbedd2223a64966faf043f3367da4f1d1ad95ecbb2c79ce130cb324dcbecdbf64fb64782c2a6226718eb7a64efa0e8d2f1c8b20c6796d6b4e85317589fac1e413e197b638f2ef37651f89a983fe9969a6e69ddc56b8bd7b7916e61bdbe7158bcbe758ea85e53afa8d7b74fb77cafef57ff748bf7faaeefa016eaa1266a245df43eea96ecf58dd4ae599324d779b394274eaef5db8661309eddbebd2fae69dcddde7df774d4fd9ebaa8ab6eeaabab7ac95d9dc52db989c969cc10994933b3afb6dee2ba38ebb6f8bc31c69d09c28b9fe03031de097d456aadb5d61aa30bad940bb9bec3c2377f529fc560dd18264ede753d589fe7589fac08e3ce233b3c2fee5ca23234d1056b42e6931b2fcd649fdc0c6bdd79a4c17a1777ee34c8d3603debce9e06eb4deef469b09ec59daf06eb4beefc69b07e75275083f5aa3b831aac4fdd29d4603deacea149d460fde94e24b3681acda33b9166528349a6d25cea94991c147cf321a5c9d408a95b8e66ced8537ca044831a884b4fd22d7355e91a1d123367eac87c21a5a199393595ba20633db0374d115a135d220fac254d953537b9b694527675d1a9216cb25b7e2cf2934311ccb13d1a55382a3e941c1ba5c1f8d89252afb523a2e0b0971dfd464d3436184f23a68dbb1cf4de27bd6723531dde447d4241da953af618e3f7184f345297a553b6c6dc447d37fc32f7d30d59997b77c31899c34dc8ac81d8bdabe1d51bc48c681083c39de896231aa4c3d79aa7adc951eea45bb0a3192fc292f64edf61cf6ce4894f1ac4be6a10bb5dc1e79dc87675d04ffaf989693e82086df5c3538ee3501ac4fe06b192632b4c85a5b0925596a9be2f851121b3cf8f667556cc6bd14cb3d763f58486e6a23018d62101e6fa6559966559a6d9b36851ab1f3b28e5300ac5631c86c3bde0e6d4cfbc27be7eec30889d0dfe68d13c7128a318b6cfed73db52f0c9cf47eea1b63d44c5387cd8e5bd28bef0d9b6666b621e60966d38fcb23561b0413abf81d145bac4c8a4946cb3da2131bfb5b2cb471470c3adec1906b30bf17169eed8f0617f7c5123d86188e5c70e4199e62a879c5cc31ab9bed2dee873dfd094652a4b1759ce141955ea6bad36707d0785af9e060a0b78848fe8125b4e4fe6467b967d1f8b154350939718343ddc6e2f6feceed6be811d84664d7bcc49eb41afe11b53521e32d763af4164a6e0fcc2b6b988a7ac5b6690c63f70ec9098f8c70f247e4ccc7d0b9fc4f40527dd1284c617a5bd21895b1549a044105144d5304bc4120d12916f34d81856319011404044dc2862da67cf6816a98d06bbd2241e98d446f2899a16b6cf50ee23ba4a9f18bd4e478755b9e3d37538a274c5ce43fd644fc4891a6b03dd1fdc87e4ba9256de466a2336699f1c5f2ba60f83504f9a4e236e71a79f7ff6451cee8834c6184eda753a4c1e4ddaf5c76e61516565b1496c72d3af8409cd58e050f2e0d0904c261395524a2965030dc9b1ca2b77ea69bf64571fb60f0edb27c7cbeeb24a19a58c554a1e13d73dddea6aaf77aae2ab933b99876946bb53d395a03d0c424d268edea4c48f68fac961d3e735ee9b768df39ebdaf84a995c0b3633b1c9acd326bb35556825c99973e92a7be95205f76da27a905127ea0f084274021d9b16e071623eb7f548c688b28e1a928d76fb227ad98cd34d3c675dee943a554ab121626ac162e5aaf9ea26cffbcbde0a6942d2526e537185c3c8d2d27efdde30bc987584139de00b1425bc3358166ca8cdf2690d14948aed41fd93861ada24abde97e51e5252721f9828a2bf52cdf7712b247f6c822b56be562a75e0f9e0f1ee8a5dcf3667828f7b6239a23efdee3683c19f736202020200fdfdb8c3623cfdb74747474bc17f7b69f1f2fc6bd8dc6f33c0fc6bd2d27c7f34c474747475e8b7bdb8ce7b5ee99808080803c17f74c46469e67d2d1d1d1f14aee997e7e3c937b261acff33c16f74c39399ea71d1d1d257997484c339ea7baa70101010179a97b9a915ca9469ea7e9e8e8e878da7f3cedc7d3683ccff372bc7720be6839f6de99e81679ef40a2cb090808c8bb8f76654033a51a79df115f32231d1d2274bcd36857a673c4bcf7e37d467cc97ee44a8d4de365edca686696f125cbf1e83dcf4b0171c8f2a187191d4a6786ef74378e86ab39ba47471c4dae8721c3c34046401708a8fec5bb179bcef6e36d3a2f361d9d9f5c7f128383b1d16c39de46f362a3d96872727deb646b613ada663cd3510bd3d1d13693eb5db44c2e4c402623cf04d4c204046494eb5bb0b412938ee9c733e9949874747e723dcb246361a231e578269a12138d892627d79bac2c4a3b32cd78da114a3b3a32cde47a162a2ca50169469e0684d280808c727dc957354d47fbf1341d4d47d3d17e72fdca9ae1a31a8d96a3d168341a8d9673bd4b2cbd69036404040464d49993b3eafce8e8e8fce4fa793b6fab69f3049aae6fdaef9b5fb67997ebe178ee375d9c117b7424d71cab865cdf197d6176749421b52b88e7b4cb1efd00c48c8ec6bb6c26a503df9dcab4cbca40e9a1f3e19d25c21d9276d99b1ba3ae769de5e9ded32e4c49e955bbda75d6a6eb3022a269a476b5ebb024dd4952bbb09e9e56aa5ded3a6ca80b6a1776733384a4eb301e9e29fc4417964ebbaa92d28e524fd761365df79e6957252a42d4365d579374aba276d59e9ea39ea4aeab439d4fbbeacdcdcf4d50778458bbefdde54dbba89292c451d2e9ecbb6a433453ea52f70ec4179aa43b13dd727a7720d1451e7d45dd7dd4ee3be20b1dfab921a246ee4ea35df4e60823a20b7d77b05bb6d087dc7d467ca13cddb3764da59952dfe50e25ba78efba777856e1a399be320d7b94cdccc0216bc681c0e1f7c3510ace66727d04735786efe483b5443de01928d8f6c8c018d7abae07c35a0bc35a9b7a1703b3180c0cb3a8179c0b0cc35c6018f69d6c2d0cc35c6018766a61628161f51e4b3351c26c945828d57725598a2809518a88a89e5b5955ed194ad56f282cab3795e7a6def455ab345ddc4db561b13eacc4d11325a249b89d5c591f517d56866fe6d022a13d433d3d3d439f99ac1e0dbde1a99b77e9b7244bbb2519dd8e94ec19e16c3853a7d425e16e389ba54ea946fa26ec926e3c9b5c3d23b956ec464fa4993493748be566a7a373b74493e56434194d4693b1e829e7a4d3ae20ba25da29758b952b571a754afd36b9ec882bc26265474af3a87245727de76e89b369b03e3b9a2eeea68bc817ce0571a5beeeb058dfe46a8e38184495fa906341ae37713551a5beb3e2e34e425ffca250fd4928578ba45bc22ec91ad5675b24756a97d4256997caebbb254fc69bd9ecbc995ccd9c46f2e5932bf5df37818cb2ecfb58ac77d88c36827dae66bab6f8357703d54daeade3d9d68e0c9fedb0f049a1f2ec12875d925cbf652d67ccaa372f871aac0fe24aa24ea9cfeeaac17a95cbea947a7a8f623d9999545f59e06597f4217136ed9a3793abe1565c4dae9f3773baba241dc32e29d72fd74c7197d460fd1abe2e09ec1f35d8e2769a6f6ee5b2453365be0653274f7b2357e66dd17445dbd37323b7788aa0ec69498c6639c6a8041b7b627cec91f59ea22a82d224a6d0cf15508c5d8cbbc9194db7d4e4799ac9cc6733332b923b8aa4810c6000e5023294b040053005262081081c023192788003603480010b50c049025a3e7a20c0051247f038006b8789113a72b0c051840160565975a30004400d2045c48bcb2780930d574b370400025043088fdb58568250f901081a9a294b017de86106663590010c5c40090b548002139040042090c4031cd000062c400109f0d10301481cc1e3003b8cd0910347110680c9370a40800110f1e222001bae96216a04000042b0ac04a14203881f52401f7a9821e3c68c1224e3ca8c12244485a322222bcc98018475b0ce111efcf8f0488182922323c68df93331aecc9fa12901ce4dcd133264c8c0288251642486b99404690c3f9218ad1bf3894f3ef1792581480868093162f4b8b871716324063c477266707262d332b931b392c8cc4aa2f4861a1a9938b45a492c8458080d51816484040b2c5690c9eac8eac88e0f805e3d403031d1a141d1148122c7880d0a56ab99d4edacca9f91cc9fd11119649492caa05215f1dcdcdcf0bc72f7fa6182443214e484cea79839239c111c1af4ece8d8e074ba51d294e2921c6c8accd081e3926443d9105116928e8ab6b06d422c184b0d95a01a2268d89ce862c9c0437a04030f29cf051e529f1bc497239478487190fbef5399e8f261818794a6020f690d051ed29b2ce3fd5987f80264020fe71d72dff72792e86242020fa751041e4e24083c9c49607021bec822493c9c5e188a2e273dd1256b1ef070be1cf0700235e0e1148a2119f0e2fd69135d7267010fa711053c9c3909e8cf9ab982f822837c3c9c2dc8fd5924bab092a24b0af578d84a0878386590e8561ae28b443ae261afe128bab4088a2e99c4e3610f1de06123d9f1b08d72b39822be7411231ef6147ea2cb4a27baba46c7c3dec9f1b07b703cec9cce417ce923453cec1d449792e8ea1d033cec22300fdb26770a0ff1a5836e3c94572c4597af28ba5aa8000fe511011ecaa4015cf585f8d248443c9461208a2e289fe8eaa49787f2c7e5a10c12c0654fb71c21becc227265da78289190fb26ba668deba1c46979287586f8e9351e4a18e4be74417c99478244d7dc9929f3423c8c4b007828677200581e4637e47e07e2cb0c9235d1a57b9f0920d1255b79188f8278188b54ee23baa6d04c99341e462be4fe8ef832531ec69f1f1e1201c469cccd457b830f7dc8edc3630c5933501ece9967c4175a83125d2ab5912b3366004f0ce0f0cbdd72011cb2f211f2c52251c2c774d9220b085540880238646520f2c5124d00879d99982e2b011c819804015c44bed8a1248ad44c97bd79000e3307d434a0e6887cb13c0c38b2335d98d2027614b093809d20f9626d7ce0b0e7a5d07461443d709821400a11e5792424927cc1921c81c39e58cf4c99cf78e0303b00de814356c6868cc06e74d4e4a8c1517344be603c451cc9b32a19008719ccce7cde09922f98cd8da03cdf42d35589664a0184082034001cb27223c9974a4423e5398bc8975ae711f9525f3ac9a59304d049368a642e1c662d38fc86c03570d8992acd20f9526d28d144922f34003b00d811628725680587ac2f081c7e2a3470d893f6d4c8173a94c94c17bda13c72651e08fc034e4a016bb20f3864f5806760146c8344becca42424bf31632199b1d0504ea25450248a040b593e9c704041092a222a2a2a22ba3766194764967164c70740af1e2060ac736fe7f70cf5f4f40ce59861c80c83d2d022148a2c9f438d501b8a821fdb1bcb636fec8dbdb13c2f6ecc318c5e5c9963181d91414629a90c306014bdb89d4f94ac8d929292b561dd985dbc5cbc7e9890e591cca119349d7072327d300cc330acc58db925736b1a99389306b367ee4c9d6903172d3a6f580f3684f5cc19330b25164a4b729845e60c1d58ac2459de603cd80d76336f3224b3c9105116928e8ab6c0820516cab2f3aa62b556cc26c79cda49dde6e92004f54ffbf41056ab3e429484888828498e59a5ea225dd351e8344edfb40a52298ceabcd59ea19e9e9ea13cef1dc9ec1d2199616629091abe0fd71b9e7a536fea0d4f9ea79f1fa02714110945c1f370773b734ad5464949a9dae469923839f2063e3c47240e380e13252122224ab2b4540779236b24cd1d3a673d433d3d3d43797eab441149e4421224232fdc4c572633298f7c89acef9bf426ec99698d1a4264f92944936700a6c52c9d37132773323319ceda7809752693c97459f8fa332d13d62c3f516e4e6af20cad15dd19be10cc926381df63b556d8ccc6f762013d93892fb648aecc8735cb74ca7c89a07cbd0588a07c9c2e03c414593f3b2bd42289a33bc31752997a9a2b0e87648a35991c6510c180943078c316512cbde931da39ce7b8663e215598ad4c3faaeebba6e5ec3d445f7852fc61899bd8befe1186984157bdabd9b5e6f9885f55e96634c093d1c336fb4ec141061bcfad3a9d6572e37c6b5bbd16bba008eb10c1928283366f4d0830f3e80604aca0f3f0001040d1a2a2a4104b1b2c2c222040002506388215ebc754fcebaadd535e9dbe2a95b72efa68e5deff73677b30be072b7f7bee2d857fb9d5c7b30a6af1c193272745050748ecc987164a7871e76787cf081a707047b7c52527c5e3ffcf0fa0102881f201a34808254548284820842686865e51811cb591e368644882200bc1e330ac0510da4212e04120014e50018d5381a0229d763492d495c4a3604d092e44a624349002d0470c39aed6d5cd70dbb6cdf7287b86149b6af710370c317d91e0037bcd95e881bcec8f62c77e5862ad93e881b0a91ed556e3844b6a7714301647b206e38806cffc30de313b27dca0de314d91ebc61a442b6f7e186918a6cdfc30d6316b2fd8c1ba2dc307e21dbcbb8611443b6c7378c64c8f631aa4415fb7bb3a862ffcb4515fb18f78b2af630ee2aaad8bfb8aca8627f724fa28a7deb3eaad8b32e4a54b137b96054b15f5d1a51c5bee4b24415fbd4ad1155ecbd6b23aad8639788a8629fdd1b45181155ec4df788a862af5d1f51c57ebb0c882af62c6e1251c5dabbb84a449538c537f366ca71c14c20ab4596fde0e128afe4f8b394246fb4d21f1ad44a2abd30775aa0ecab9e360ac0df88b24531a57265882e698498522f4346aba552e550166d399445ae29d329f531b4f1bda60c7d3568445f2052ae8fef90be5016b584985256924515cf22a997d46993abcc74cdef63b15e3f79a0891da36ceda0f65366be64be39e9949932260f67d0a4427b6132343235a8c12ad429350731a55e094c3a0e4e58717c40842f094f78ac383527aad479b4c3835cbf94e448ac5a83bc30c599c03a42ae3508b1e24495ba86cf3eac91b7b8001f253c10e18127636fec8df530d2b73e4b4639362b75f999acd7e1a0af067fa64c0d7d75cbcca4892e514497194818c81af9822dc9214829240e6ab2b5967b0d24e6bc2d7a931676ad8549810412b8e2f8ecfcf4d497c9b56f9a8976ecb4c54db4164d78da293635cca3b7f4d6de3e521bfe287990d45357bd6becebb1255b5363ed12ed72a4505cc96d748b2a75d6d0f62d12d1a912ef9eb2f4aee7ddcebb9c7737ef9abcab7937f3aef52e4654bd4b65cdccde6d8f05a6d160bfa491682c38f9995e23bad0d7b344170c9432576225d98703404d41857d3844aedfa83db5db4d9296743a3e533754734a66e4e843d61ed2882fd9585ce4b8db5d0e8a0204e57e79bba72c8d4415d34f79bb9e9297b7db0d7579bbdc0e97b7bbcd225bdeaee9c894b7abfd6879bb59e3d8259bb78b116179bb95e752591355660612554cbfd1464415d3ed8c12554ce7e4278d8a34d83c3b0d56aed5e1987346a6e6549de8f2bdbefa20baa0a19621b670f2a58fd43a9b0ed90d7da4da737fd1f1e06eb9d05adb6db5567f3746b6faf6b678b29e1b36cf9499295527579c211ca006e9f0f5b38753a68fea90e8631fa5f8e7155d9e105dbc57a0985326b3d77dfb1e0ffaceb2a8d5f4d6a0a006a9d7e1c82a0ea5ae04bccadc487c3ceca11e0f3b080148d44f99e94a00ae3838823efe1e2c1602be0f091c3ba576c5a93962f85ab43dea35411fc344c6363a7cf6a6871567b31c0d42338dadec15e7b6b287606e651bae400dd68a131423937276acc341bf297df5f4457fbac5645f616298c831aaa8ba1e298a6d8fa01dcda36ffbd6d21b73c2de0495464264f8012215bbad9a75ec1a2b845c2f8bfac52aca9505d3ee66b128718b66dbb7958811edc414b688b2c922bd4483b57e462c69229db9e9d634b6177fa3e7125165fb46bd7f33a5d64f080cb7bc7afc6ecc94aafa4909b952b99294bc32d7daa9e19bdfb0afbe6cf4ac562b95ea29d553aaa7ec4b56a7abd3d5e957efbcf0612beec64cf5d93dab155e3dd53bd125f258ad5658d513a8a7504fa29e453d8fba14c75d1cdce9672ac5aa6046a3caa457a5faf671a74e07e569900524815edddd5d1abea4d466c2c9249f6e41cdd70467cdcc803ea1c9229a2f9ae09149d157e3cafc8d39e794b912f3a92f65b1e6245092a442744597d3bf7a095792a492402a09a47a8852015d2028aac79cb20a3f1ed5f5b057adaefa4a857f9c545f9d54b8a5fa4a95c2a82b6b1a8c9d924aa552a994b4e16eb4d13274e6fa9a7993baeae1a441ae57e1d860d743f5548dcdbc892e91870a67ac66e99ddee99d68f3ea96d58d7c2bece149386b7c4aaecddcc531cf2a798b78a3721c7765c9b59d8e9997882ad2266f9dcdf6c22179e2691355ea69cb7409e6ebed595c19534a9eb56cf62d4a1ea24a1e6a98514949c9634eb9a4e4114b9b064f48b9feab47d5a41ef625dd8e94ba99c8af67fac866c2a5ae902cab9092d4e6296a243daef65142be34116a501b215a91b35c827be7e88bd105eb6957cbcc94faecf501b18426d1ac611de99c4aa7cdacb182045a3d85696d999e691a2cdf28c23a394ac9518f5d8e59336fa64db7a4706bf5d4ace996d6aa8fe4fa2628584b502d53c4a6658cb44c4ecb1c69199ead447eb1eb9192a74f83dd3495bee46147914b56a732334d135d3a1eab53da46481121be7c443bd145f57a12fa58257775290baee4d67ca39ef57d5dd2255dd2e177674d83d839287cf5a104ca15ffc0aefdc7ea41644ecda7ce5d996550b7582c058b57ae5e7597882af5f3ae210db91e45e3034f2658dab0c046b29cef088be73e9bc96c194daae761ef347b1dd64054a9e764963fd1c58473683888cc2e28866712aa0970832d76531a34a337a3ad797b2ca311062102e6ecda0d93c8f560a7c3872c83d02cafdd7aaad1e82284e21605431a6960614a160a84d7fcb3cc3a9ee7bb9ed6cac93ae71b0975d8c95feed820c7715c9e51c58a872c79b2e0d97dea178d3032ed13b9421f51e8fb45505e6e5ca10f25145986444196f8f3f592c6b84d56cb28b39e11c41ea7cbc613ec3158d831ec2477bf6395a2d6539ef44d2b6d23be9e950fcc5f22bebf90fb15854deedc58064439a4b9c76045c6c0d72257312746e485298ce18a298c810e79d5a09cc218d090575f970025cad9623f27f66d727d9b9d7eb396abb43b00915c11106997a3bb55411e4de567af618a2f1ce56f0aa2a51ccfc5557e01b6d8c3171fed8612be0bc3b7c50e0c1fd62d3ffa5bd7bdce3abfd4b76c666c36c7e1509ab27bc761f6ee37667689ec5cb169db63a88685b4c8da63e83ff023fbdce8468f7dcb9e7dcb708c869252a6ee762044764e323946950f8715cf6f73fb69abdf1e4aae7e7bddb09998872b60547f82c6c24041044685e34cc166cc8c91a18e98636caec768376f0e7a13677a76204476f2c4b28985b4c8dec3994d4cf54cfb9d5385e1180f4b1185eaabd56ab55aad562b954aa552a9543f810d18d587a8f03753e46ab55aad56ab9fc006cc0ab33aa24fdef4983b29a511d174ce1412d9c9dcb7badd1ffdd60e2dcf29afc812ab43c670a8e10c4ba17aab7096a9076cc6ee650ccf1e8d5b1689d68e2cd303b119c34266e354a39ed8bee99a73ce1885082315391eb3d6da1885b0df361c32914d16c3300cc3304cd3281339d486d45aabb5d65a6b2d7d8c292108e69cb31f638af645610203c59c73ce39677737f6211543d1af94523ac410a11339d46e8a01d03e89e450e331718c4268979d0e994d9387cca66cd2b0eb04762886a838c10c3e80821bb2a00322983a8488145e30811d8060831f94400b3073ce89a1c070104c38ce5a6badb5fe043660eaa170227b142630500cc1acb5d65afb13d880b187c209130e7270041ac4c00956c0817122c3ac99223f2412e9e0018a21232ee4210830df4c915996655996659642f135866118866158c550c44ec1d94c9173ce39e7fc096cc04c0c05263287d85e0561db6208a494524a8982d2097df46144e263a6c8974caebc58363e968d0e5feddc32aad496730e5bccdb0947444191605491510587c481d2f9fa61d6208e54b69452887e3b4dfa7e4885c8de21e9ad4fb6c7e8198ee4ec186561616161d9628c99065f8ccc356268a69143960fb182bed879d28794521a14d322c5ba1edd0eec9623a2218402f49a2c7dc11cf3d849748b44ede0fb7c4a96f807f6cc763ce803a8d2a8d4eb174c83a053866604000000048315000030100c864342d15014c8c266db0114800d8ca44c5a581d49c4248581c8186390410040060000000000a00100a2434aa49803dec163596551263f045bd048b77b22bbc8f18c7274931f022d34a4db3d114317369b41bc687dec439ffbec14ad6dfa14c16077b447eb66dc0adcbc3f34fe876ad68b5671bc417f81d2fdc8ca697e4a677e6b3a67b5c8c132aa784d6799402f6036e441af6b2bfd20c9ed7632c86cfdf906f7650874883bf627a9a3a3bace0588151354467ac3dfc97b9121c7374147c5c26f1a957984f69c84d4cc63908fd93f0c43b0aa856bf483fc79e0497f6d0700b77a67bf8380110f801fec7f7e382c5964ea5cb90dc141116c391fcea54f9cd3c26d5a591d6b8c4af38306b71265569868e2e613717ec710c79b3ec5f9d2899e1abf6a03c49a4e16887c29bca660ec90b7e393a76097b4667c0d479bd6ac9dfc5d7a17e7af1de3d4e7974c10739e32b7fff4251cd75a339a3fe6d3de77c69e54c26c482810c2b4854f2012953cc8bb10b980f382ecc4beb6c0fb767bbde86ff37e228b4d7b048cc66032273b9c0e901c35d2ca72358bb64f8d2f8c0300249e5f643d4f57f0f8be165c02bf39a917e8e2a5785368fb25074aba3b7eb887297fa9d043dff25a3256d885ab8744e7e4c39fa9cc21011478bef46d6412dadcb85a80c6c3946004580daf2ff4d5070c779bde7bb1bd3cc5ac7b3eedbb96c18e90de048104153ea294a9adfe4784a6db38663b0bf744bbaf2cf464f36c61f7aa423971356ca466dd6f1058140f28b657573bb028757e2acd5823ec12f5e7d689b3a9d0010451224a7a2b5b393a5b6c17a47a0571d000c05594d234ba5eed45d24357d53824c13738764e6882ae91ca058cb2b6cb7220bcfbd0c093be86dfd52815730318b1f0181ef185211e2d908eef68e865465031a256ac7293e20e9b69c27d7ef59325ce057e821730f844c4b804acbfce71ae4388aa289b43b1ab8bb9872c24fe735dbd19cbf032ea1fa6f306c7fa1d9952441f2360624732ca2140120c81a9cc6c59a2001bb3748e43c02fc2c768b35f49ee1f3d9b233fa22e8206e1caa7bb4e50caaf748406e3925fa9086d2b303dce8028e3d6063993f5f5ee1de12d3d4e85506ebfb7c16fad406633fcfec473a25df1adc425582fd8c1e633243c70a52d864067eff303e089887a0d1524d6ee145cebf717fd0d05a9060253853ac3d798dad34a0bb8d94b27bdd6de58903acf0b6359c01d0bf4771ca400c42689c4adb9d2a15d6cbdcc540fe3a11540e9d701f60a22bd047be2e2d2b49de4023e34941d4d57cf908a5ad3205b32f3307906fb195f0902edccc7b54412347f11051ff230a1876f1f84653cf0ad9665ec6680687bca895609b0bc2bebecafd2095b9b6ef6a48e01423f0f0b866e692c6a63c55bd18a1fd26781290ddcc8733b237a240f4aa6dd0339cb347a71a95387db2c3414944c118f98a792e61fb1a883a8bfa82161705befd2d2e775ae544283e8b90d5d8f8504173440cda451935e72581ea3d8e4db6762f8b3cea852cbbc0b0e391aa6edc9c559c2cc843ecc91c4aeb8d48440dba0ea0920d3d2d21d646d035c9b1450312a1ce4dc46ef256e854762432393c544c2ad9487d506956cff1db2eb43bc70c6fb1912dcc5d97836e02e169e2ee71bd677ebc9b2646561bc320008527852a3dc9e77e97f32ccbc2c3db393e9b4de3bf0d3be7a1c54b8ce167363b5b1a71174af17b8c6ad35a38bd509b376a977d0d9d3485f13a5d5d2ede8e551bbd0375c70c61f4ffb76e61a5df4aaa7e6642002627422f31b6e5f16d545af3cad678a38fec1f9fe942e0ffba7a3df930083d35f58a4e2847ecb2e6e8ea573ba5ceca76667113fbf9e46a17ad84406ee79ba84150b2108ada97f5e6467e5f0e77b6af0620b4d94148720859109dbc6a1ec465ad5b3de3848efcf35ea5d31293fa5b236a6187b3592a95f86b8817a4f35a6397117a0a3535581deba78e9fc70f54e0209846ffedca64f79aa6eeed426d70bbff91cffe11537b9834ca1dcfa4b0e9ed85017d61ebaaad64a8fd003b4adf50a813039bad931567cbe5c8559854afff8f781f621086de07c4eb05152923764693a4d264ac8f9612cdda9f4cd708d456a46181f07842f424c33bf9c7b817f4fbde0ee4fbb519b4e78135828211caef909315a51406407f9ceadd3e970d1534a8e12db747eb047aa3de756fc68fa9793ead196ff0e1264f02c0a531a43a2949fcc3f1e8ec7f908ea74efb05e9b65410af9127a92ee89696043a6ba4c06f00d1a7dd2209dd410b9dcd234608314b79e2398825937f99c86aa550b82989036c099c4a576a164ffdd534fd1bc7dd16cc7fec7f2448060ce07fe2539893a557cd8bc08c319067b16c10403fdb97344249e66317c46132192e6713072449f34281ff8e2d099a2f9bc46be95a430bdf3cc49afd1436a01d9a827df9e4e2d9a00b7c1483b067f2bf3dd0ef2711f4279f07de0096765381c6684b7aca9f91301c5901c5c0f085a97c5b042c604a7922bc02f0391f74142bf016d96b375a3dfe6259fe390f17a282691f4a61b340e3c6ec96a6685e9b90783efbe253416503a63e35b103c4a066d7d9db95884de4bfc1befabbdc7987d4ca28078a9a8b5e36f77b266977dae393eaef23a45d6463bcbf98d7242c13fb3d853f497a3ebdb7858c65c934c8893a6395ca10e619b6a7d7b07303d4bf96102924b9b55221102bc18d0ce5664c6834f9881256177d2f5aa66617cc5709235681f33fdcf4b3f3ffa73e85748283bf02f4b1e5c70807dfc99173de97cc90e0a0c4621f0c37867c158c8a1e21ca9c31f188203814fcda3250e1ab8c6794a751de0d0d6a2c138ca5ea085b2ee2dee3c050c5096b7e0c2e0753e650df27b961e8c278fb8aab9db01653c951698c3a0a346d7b019e22cf35e71d6b045fa90dd469ef0f6648c5653092b13752be879b9ab17168d00b7b557483d2439821c0b7ace12667901ee62509cf8052b606d39c88f2cbaf25bf91824ea1e718c2e37e86481ce68183118c7b35fda17a98c07a2d6e8f5908a8de990d42aecbd87ea3b1b8a5608cc1f7ed049a4da593df9bbd7664b7e525fdd6b969c649faacbc978f7675c1604709752b9ce927f9ee2b058eede7ec391b7a75edee860ebeafc1bf988633caeba694ebfffd1c9eca4bd093ae2dd8424ea8b3a1f518fc50225dc0c263e6c17227d1f0e3e643a6d36d24de0ddc9b0859db26b8a72a1df9c96da8e027c770c61648ae187b950b33ea1bf25ba7c2177c58c69923c6f2d079f4e81364922d0697e0b2b3323cf5172e740b056f2fdc0029aa4df2e323a854a13d49068b2434ad293cc51a58974b0ced84f734624680a9685df905c3eafb459c6dde38fba7b0a0f5020741b4d9cc2a566c94596bf26d6ce4fa66ec8e99c936fb0116a3d48f747af56a64e093f82cef823d5a2930a92da2e485a4dd753adc6adb2783038177e18af2289a7eeb67c3ce19ee63dbec8a5c75b823d8e2a3f45533f6cf0d4c08318fe4cc89e82d6aa3ee87bc7f85caffa787d53aa0e0eee7964c59a35113705eccd94a69002e8f9b3b742300e9ad9e4be81d04083dd398560e261c5a045b4572652b893ca1a844917f3c6d27f12b6067867e318b88f890c2149280365eddcd4175b31a4c8c7373ee1b05331428633ae83deeb8dedc4f4053690b0a4be03a2f34b5639455aa26d5f0cf7d38291dbe1e2ebf128741a9863fe8bbc656c86c2f68ceb3d8c0fdfd86019b73a94dacc76631a7b1708ab3a81256e1dd188c23956070d03d3fcb761ed6125ea0e72e003fd784d0bf26fc63d13475f4368afad69ba08102ed6ffb1ff2c3226680db78a076e0c49e3de587865ef1d1f0a9579944282f8a56fa66e232774b0d2c79b688461bdc5c1090717a0209f250b4445b5135319a3e2281cf697b7e028b2c16b3cd5afadccf133ec0e8615ea3c2437e5d8c825543eb248055bbb7a0dc1dcf296a36d8d83bd46a7e3af6e7d66d7bd185f74631b97055ea4a7e0c29a4615ec008bf6e235721ab7c1ac34137861892fa4a1efe82004621fee7520c5d2c0c5595d98a6b08f05722f0bce39cf087a3d9943b8e5b7177581bea72173c52c3746aa4049aaea0df0ea4e3e23e706044adc179aa568d026c6662bbf862044086d6cc709ffda8c0b456852e237df10309d401261696ebbbdbf0a17b102f3584a013d6bf2b85c6003b364818999057f41270bd36d7051e653bb319c94998f47f7d76bb0b0d8ff9591e2e72f8d06911d1b0895b93e48d210690c2ca50578f353479513e87eb36e1c978476df74e91137b5c40b089cdb4a0fde110a35c081ac11e16438c2735862f71a472aba5102796bf8ab7411e1c2123ebb73a40e55fba155d857f0b2339450a374fee7111b48a27f9868b81bfa1ac3f16b045a880e3d7762d05559c901869fb65b9c54dbcf28d0d2dee531502115baac4fbd95b00bb4bbf109380c034ea9949f8478d8f8bcd5c37b9807b0be6db74767442a7fec36f2551312fea90dd71f9bf238608614cd6815552cf9f032ad8376c70429987a9ba03c4152c5d16a7b9c05912c04743141a93417015738c186822605c0e1d32c70fd944d057f2aa44313461fbec939bb6f81011ba6f12d254fdd520b1fb217832ac5fe1d7db1c97edd488836f7af9327820f83a7150473470bafa6817fa4235a308052ca0bd9e1c3d42b1d0ebde34605832b9181693c138493e291c7ceba34a9a232d4d3821d2eac18588284d27d4979f6daa68a9eb04c21f0685784f9305512a4b159d09ff572f707fd0442e74faf9aea3a2e623f35d4567d63e0cbec08490312216b067298e6c71b475ad3307b5e21e59f11e1c1218709065345ada578a2332ee90f786d8ad37f56c7049cd337bcabd00d3772ebc8ceef87ae42b043cad6f52688de3cbc1c80b4dacfd75035fd1b67ca22d195192a61c19d31f0f513c28857efdb4c5e0b1434832c610b7cdce35d74a9b48ef1e7bccb0ef272f2c99e3b82097454054e8e885de84e96986291a7cb27e2f588d1890823c09c0dd0bb1a1498a74136d58e3c173317b7d47bef584a570d3876397b10856403bad7c8676b134212c8dd3e2dbef017f399c6c21b2c8f75e28cf81afa7386a9596766c67c560262adaf010524c85739f3a12b0ab824a0b57c3d4c6cdd83d94e091ff98629fd2ba8a0635549728ffa7ffe666a8d948cf927fab28596a9b9bd3705cea6dfd7d1566f35ab23466032755aa2ef737b9ed372641ee6cfff9bb26cd5394b602c8c1877628cb7ba7a10cd653b26d9fd7510541efd1fa79ab17ffdb098e7598b6a444b4ffe1c3042a61f270ee32b2a941bb75d9dd64d0a6fafff0043a5db8c174da261c86f47ba2d35e0a2d9df17ecc0496f03e8a1b971ef220653ee8dbb09a3f529335b888f208d5eb54e167643d403948ee8f9fccdf87ca9de93ad43ec4098d5797ad2b19d3ea76d8b27cb0c825fd6ddb1f9aef29c16cda3e472848eac447d164e744437a2b463c5e8aefadab6a42a3a8cc5715cd11e02f92ff08fe9fae5fabb9f54b7c4f72b31e4e89300f86c7251126d050500e56ca9635a2086c52974d9503d72052d9958d7e3af56ce1161646c1685658a32928ea99684f3ea43d7260d5ed28dbe4a4a6afe1ce156a01c0e09c210945a07a3fa2a47e27c57729b9b97f158c578b9013c680e69726422e0a09800d1b5f1cc76b791aa4e1276dc639b27ffa1d0cc6b6175507c5144d0d765c31532c656c40de0a1341b5e3bcca274e23647d6a4c2cb0f0bfb238534fe3f0ee462ed9b89a5bd07149e10bf3264d5247c0e31a26cb84923d79b1f8564a7d39251009dce68732dc26b64b3563f0060d9764d0ac31204fcd777abc3b5b141020f70cdf15c36f305d76c7975c807a9b0f163b92cabd8689a819fd0a1ec83f2b99d3e8d1fe2de2dc81649b7298285f678b7cf16ec219c230181d2a905c1441826a31ee57801130b1a04c30a39c73a333b4c470f1e2702c9234fa35935a80b4ac88a8d8efee4f1811d4383191a787659868a6132dcf47f95830774922612ce354b56e934837bec7553b50d5120c9ce0c1232dc1e08ee208c87ddcca3363988512fcf0326c9fdf530d0de1ef0531974e6e0f54c6e10ed8b9fc558fd78023b8a8a11417057f2a08ced6d365fa474751e7144bed1f26f58126b670c8da594c3b3794ea8d25d211e4199074b9da034708b737e509d1ed06d2fbc2b2154410c04ab7aa1d4b91085401f20cf289be4d7f6ecb3db9cce68c939d9f110e2a9ed3605f696b4ad96ece7d2094398ce3dd6e7f90b2ad695293e1b679ca274d1a49214fa910684b8b39651dd5e9ea51a5aa5911730f94b31d236858a4cf615430ae9b729b90bc27dc279713d302144fe59e516999e9d543e664db437e5919b02d7ea5fd4ef6b87cb41b01e09dce6d3cead246cc53b5089d01415ef90646c37cbed0e2e10ce9c5f888454b7912bfb6b75e45ddf4ff0d98563156f101740f8ac1e36f0344aa8767497c2846a166b371f6d43fdc23ca1eaae6f1239c228af4f587835079e89afd5ead581b79fe6fea80e70c176d5fe3a9a92a822c3cf152fc0f6e5b609ab0f6c2588daf64777fa619a83e0f187916a9fa8a184096b2d8873b99fc62b37c0d6b3c0d8cbf774ab5ab99c7045c820dfc2ed7b528f1e1f9edeb3055c4842f1e680305529ceb364527c8eba1e3057102a0c5e47d74e5ca892d3e09d400c410cfc89cc8f2ec8413a6bb1de1e219677af0d24b1ff5c7f4e55f7f56bfe99076a303612fdd26fca31ffbf8fe811f1fb64d19eb289f5c000f8d86297460b3971a33f1c2c71ad4adc8a9c1c6a1428549c593a9925937fa0887bcca5d558019a663c9c897d505e294ad156f3ad1ddd757fa9ce1869e547d7035c25b85beea5c4e6576fe2b3834a388ce612fec9a56599344dd8f0cb144ca05be173f7d8becf3619c4a60670652dc654008a640d3a366b90e868ac72cdbac1b4b53568f305421e84ca171b8237cdad36340c8cf33018a0e55dccfdf3069a5be7e8bf81c29280f1c8e7117d55a098372b4d11e62f0482c457f3361042bed6f24883e9f2a9fbb5152fe61498d981d3cece5771214791484de006172e8e043d459062bd6f979afdaa3cf6b734b8a71dd30f7fa31c05a8a247ee34f63867d0fcc23b4dcb33fc39e5462061c3a1f8730227faf446545e2b08dd63efa755701ebf99c2502aca0738721a789f7dfb899e959c7f7d7401fc20cc6bbe1b0a258e3e99a1964e52b2a004cb988cb059f1250acc08314e8c7dc83c872c7cbaaadb6559a147d04f405bceec2ff10c65b270c50c97c71de66852f819ee0e403164c13c52464130f786d28f4b6adabd80f3424f5112fca35d42854698fb7c9b8bc0b7ab3ae6a9b66b6f42c5e6563994d6af8c2efcb73a3843c01647d178a1c8556830b5ebb572c6eb193fb689e60b4d32290c7815905d14b97b81694ca67d50654def3c035406ae780b3dcaeb6f5fd1390219bf74e933057d0febd4e6f7c29c2a5e1baf156062bf8fb95ba68eef3c1f162020afa335cb7f486f746e193e1e448c7f26203b9b418979943e088a50dcfbf00895581e7fbb27d6d2a05b53a08e98584da3dab988c9eff49733032fc74b5a7093416844e4196ff45c0fa672412b7d0896b682956116152cd09c6cb959f327447326851ddb0123a9c49096c499a0b01997f6199e55d29ed6698751c799dcdc0b0e05e55ee801e2029921321a7fcddb767ea9cd884801e571c7241a0067e5bba362cb1ce78ecea535295e1fcd12a8a0f24fedfd18886ebd0e27e5d69c260dce4378ead69ecc621af02c1f3b92bc0118a3758142d70a75ce3afc5b8ef64128e882e7cb768a3433d64853498702e1ab16d950a7e71d63bde52e9279141c68f08f6e9ff758c6ec8801a0b6dce87b120c21449a92d36eef8977316a7518825c8506537bbdb6511864291cec4a87c335c20a7ee19be9f0c612c4c4f6aec611f3354e61922dee936e9665325e6d8a36dc502dcc86c00b1b9748c61ab79e082513e41406da9d279a134e0c0a33506811a1208c78088cdf51149e6f7ecd5c0058dfa0e4a3a6f0ac2e25362094a42d0c0c97a650222bfd55467da601eb32888a99a5b9ac1dccec799c4f82737a613796f8abe98202819cf39266be364d0258d553dcdc1b4167d330d8249651dbc5b6d21a1b902b03ad054d26973d070b606641e2efe4ac33bb1fbc219b145d6c46e8987204080ddb83c0f227ac3bc79e0bf0b16434a963d37b49bc0e9ef3e75d5afdf9eb85d5b26c4306845d40b4c74fd645419e0f50c3335697c05ddc05491079316848ca9cecd77629cdbb0229757f07f4c0bd594ed4086e38c6165905fc2a4caeffa88ae27680dd01bb46a7d80be5a839961a56e1e3d26992501b4202af761cc41686d133cc9efbbde7e35affc37a92c5fdd3d5f7a22571a78c8e52a63e2c97e957732235f066247d29313fa2ece8eee775c3b4596f4dac091873f69866b1af4c0ee97a1803c807c3025c54d0c367203702ef613f861a9380719c72d236197bf072a81f36fae0d40b2bb627469f943d622311d54328f2aa1c244e4320cd4fb871bdfbff5cab747d905bfec623a977ad3706ef66cb74c57d56e48469d8d52110a9d02d91ab3a48eb9af3813fd252322bf1725f9c966cfa04d17f4316cfa8b20023f303d5c445a29c239f7f4d09e7230de9d60c2230d083c880f8dac76a029e8df5ae1debabd8874d3cd195fdf585a1e770cb8c18c52a5631c5544cb115536cc514abd8c52846318a2986628ba998622aa618c538627889d12d0292473defb72664856f484dfa4958a0fc65b02d937f998969a59bd1b4eeb294bbd34191343bf36d28cf68b1627ab01aedc07967b441874b6fc2460277eee6a4222b146a8b0291bb18c0e571a8118eff0d6f95994b05eb4951222476dfd221144f1fa64109c294c11749729d061527f0e5f8c1bdf7a754641cfb7261a34eb4b4c55cbae41db16a23095f050523c7deac1628f8c9b0dba8a96f18edc4ee2485384fe2a7b5fc6cad4fa6356c7379a0ed27b516af2d9a2e1005180335cc724db98e7d34336a6fd484b3f5934bce143903383afc5d8bedfd3089c949b8c5939aba6f42175d47064481bf73bc429377e4b197cf1e21917acc6f1d5fda792388d4c85ff6c0ffec61ff7e392c88a631a42bd520826d3f585e7ea254fed86a5c41d45eff00aef49d021903e2218906b314af00a0289241a476ffdbfea2203a14bf4204fe160efdb5b730ba067c01f04bc62052df7fd8affeb22bfef9ebae203adebf1084cf20e2ea7f3ab4fed949ff70ebae203ae8bf9c1d31f0cebea2534602220e211385f41b1b41c4a3ffa27c471095fa75a34f48e8a6190ea95514c52fe88a8e497fdfc35bd0b7205251feb31ffcb973ffffe50982e808999d48dc41c44dd8fbb0dae11eb74f9b04112fbb87e640215510ae219d02111c71049959241944fc1c92f0f8c520ca34784fa24dec581b3b47fb777436d525888e19a0723b88a6a5f17627870b22d8e3d3e5a9a0340e27114447f34d26e04afcb1cfd32ee02062851aaaa642b8b7d452c4612cdae503fd2b4904e4965aaeef74065f390cb41096e5f50c5f7b9714cea3f540d0434751d58444b754ec58b709921ed247403fba2934dedb90eda09329005ca8d9321da78153cbc9733a72db4fc5a0d6baa82f9d2a76e735dba47704841cfdf0c1d075c45161ac9414dbe41739ed4408759b533178a63548f064e4a0d9caa3abd30b8367648385dce5e6e7232834720086748cea3ca640423a6dfc6393be302c4b167c8eaf325ffec9c1f6140cde744d08fd98396f76ef28e9f5cae08dd068219739f96904228c1e882189aa86a72198800ecdc30950471a71364133a41ff837b1d07385b814fba9e2ddd8891c7433d3212f7701b916cbd4dde8f2a45c13946fc76a189794d7e931316af28b9a6dcdd54d230194c41399f43123d33b33b4eae9c17f7016f3d7eca6f52184c2a8269fd2e1b28b668b01332fb92bed7e8a8595c315c8183b1ea99056c718d6b7c82d60569f6b0479c50660c629994faaee8885a2313ae4da7d0a510bac1d789f8bd23c0b7fec60d22148994b322ba76d7575711e64e189e5476473ccc19a521f164f83742b103968ef48f64b1b651f5f0b2543a6e40f890126c67138a361007e7c51107eb3b0ae1ce0daaca20d0ce896ce84e07d0195aaabc6d752acfca3371c21a708ac240ef2819d0418db3f82fcda24041c2a2411f0ef20e2d06800d1b438d8018416c004fea10b08294c8070a771cc61a7d3fe50551c0e0ca0ea358e1f938b00e4f70f0e033145013847b2ff4e89bd914ac6e1c1ffbdd6e330900cf5dfbd7be6c7208dbb7ff50e3208b0c0939e59c019fc2d66102325b2ffa614781fd4a2a6aa03fe4e3a8800827bff17fb8daee07b66b0fda927436b0f84f0e7cc42367112fa29fbcf8f0c75aef937d11f4c07fafe7380219b38167ecaf6e7ef4339f7fb2fa080701a90e4e81484b4f70fed1f6a3aeddf2c656868798686ce008ae8b22bb13f8a694bee34bb8f212a614d9fdaddf45704538cfea7ad075b4a57ccbc43ff8977df4615e7239563e40acf313f4e83efdb788954bed0ff93bffd3dc8cddbe77e112c6f36331f89c12da6520d880b78221eefa7c317e21f18a120614f0bb91528063f2f8676ec1cfee4b394069829b03f7f3a59319bc8d32d647b14654ff32741bb0d1a94fdfb0086a1b50d76db16e8dee2d9903edb28090f645ab8a832481b81223d98a465bcfaadac9e369d36aaa8980cbf3668dfa9599ac80ef90e72e7e90f66f159dbfcd399aed240ee88483d19ef76553ffb81dc1a1ead13e25fd5f4258b5d7909677acc61e9e01a34fb9a0d4627c479add94916baf224c8f59cd3b2d35568fe373bc1fc901f5efccd204779f97b8b5e461edef4f2691ac68323954bf748b91c5a3c86c339b5710e966f6bea5d55486393c1bc178fe0dd7a1fb2df1b3790fc4edcec4c4fe366b75a8d382b4d3224d4381471a141ca9386188fba5cdafffc787318bc6b9f043353c792224919291aa66f969d9912651b0a517580a6fe01c1eeb6d834b0d3e9dd5603d3b0d7f56f436b7d3b1171b5786f7d487701dc20c8203699cf3f82d39a3ae6c7b1fbd0ee4c7fe6cc7a91b8af57d9345b31443cae2a870fe8e0be2db45adc5645fc175b9eea0220ed39149afe87781a9360c3c452f4c31a11252e209c72151a43e09479289531ea3545d89412877d5f18ad4c0876eb50266898db2aeae38d31cc96b50ec43ab265a196ac7c7c2cc20f9c89062d37ed5b4503197fd18c4565b8d772151063bdc604c7e835171b5a3e2d1428eb5f42a0814284d2ea5faf28b8f0a8bf59db3fa34d370d01687a21dac04b007ceffa1c20ec34f948d74d4fdc40c7406459298101f2a4bd8880f74e417ef22455a10428fe03f0fb02b8444cd04c3f806b02b61c509c22bca476722f3d07502ed959ee4e51aebd31d0aa896e8beee66cbac4739d82ffa083903530f3c1878c8affaf97f60fe44b42326a3160a6313bb844a18c7436fe872fd5b02872baafbf486c2dc62f04790a65b6e11424c25be826d8d480782949d01bd9e10601c2443dacd9f3cf5bd87d40f95e73e4278b35ea970dffe457c0c5d93f2279e329464ed6242e3a91a994dfa431b22237ee50764fc61acc3d61e0bed28ea370efca89dcba62ed42f0c8dcb1adb23e4f7dd54afda553b0eebaf112bebdebc2a06088162d758328941d24b2b9382e9c90495bd171fe43811ea5b89ae79294c0cee892f71b508b80f072305ad47a16cb169678a1ffe019a7d771d055bcb2808c516d381cb16a353a094d241aa7509d3e13bddf1623d0e6732cf4aef3924ce7f6dd0b259269404a49f9a4a5ddb4b6adfb85365553d7ac3bc024469e8ca0cd09489cd4149d32dca622f504301ea46819e1c64933c722c69de298ac42f4b2a2147a2e08d43d4006ed080f141eea1013290f8744d9ce3b3c5344cb7b3984c92f9066c640c3b52ccd7e636806a718c455600e91acfeb9952a5e1a2535263bd9ba641a0690ec942aac39d5b8dec5c9d9670172ac8041fb0f836986d7b2302a81a506d026bbc20ef15f1110f98f5812be0f740c570a6a0ef64435d727c09a227777f7192ff93d8f0b5607ca1a3d204c6a91870c6cb2997d875872db304119843b6f702da10bc9dbf92ca3ae247631a0bf622e1c183cbc1850fe54fb42ca81010a1bba624d5b9ddb195b1c54de1865bdc60ea72ee13d23e34343fad4cf258ca26dd475b31ef2cf01c609ec19a162e53d30ef9d1609ec1cb5e1520749da3e467e127539060c940f234cd91e19420f36445b1ac9de1fbcbfb53a4720a65b8138c16622cff30f95cb65c55229d2c02b2f9756536507d9e5623a90cb852ae159ef08d92c2d809216d5acf67c4f4e87da13544b03e781ef935a36a7124215093e8faa943aa5579b5509a1b2e497472aa54ea9c566aa215491ecf36895aa577ab1998a102a487e7aa4520815123e1e5115c20a894fcf3715576a7542d116dd4b7e5c314524af71bba7eefd2f70c827fca87b98f87a11f300f15b7c4b89def817dfa5a2cffb79df52d1f7febcb784e87b1fef5d2a7abc9ff72f153defc77b4b8a9ef7e1bda5a2c7fb78ff52d1f37e26bca545bf94e89688ce524d7896887e49d12d2dbaa536e12d15fd25a2b344744b616aafd41b034ef37d686227a3f29571ef25dd928a221343d0a6b6c8fbe4eab55e46dc6dd5f49654365da0ac96deea3d461172f9c05b109af6e2e7cbe5aa7a47da17879d6b7c37e951f31d995fdbd2b657ba2a4d5456cca09aed62dfcff5aa7a0fbd1639195fb6c0490f32eb98f9d92cedbd4fc7a5a265c708a2c916f15fb9d0ebc0214f88d9c9e6dd6fb36b27a404d11a0443dee7ac3b05a3d2472db441ad1edf1a4f569a5ef23e3ccf8b48c049e2d5dd93608a01133f60b293f1b7da84026466e99efb99851422800666522c869bd97871ef5d33d735ac21404929c26d6b0dc148b56ba0089e4cf065ef1532ac249e062a5b0c0e795dd80b04a5f9e46dd34cc183ea26a704d91a447f09b1b19beb450c3d6cd5a3cd91e512a9b6cb7b2cf8269e9c41b0d1945a1aa16e160a7159713d6a1bbe09e4d8e9f5bf9605401a0e85adaa205f58d7686ed473a961b234fdd9dcdd0b0b3f8540e63b43b9c996dac31c1adf2d4eb885e82791f95718c45f6388189fe249fd4d116d2e33bdf411fc0f1a8a225cc21683d7fa25cee46d97b8a27c1932e6fe6c36d51cc9acd0ff7f60b28f75c4d9b2f876e2fd7d9209eb38df6f7474c7f45eed5a80c64943d87518267d0ce07a3f3dc99623f88cd05ef823e45d2a69c525708d2689c65d91c26880cf7de31833f6898c0df93f90113f351e06d003efb3b6c3c8d856fb3e5a74bb7e78e98208a28ac7b17a70c12e9dacc5d44cd6a9b25b524960fed1001725b25cb24037fd4666bfb3f7ff0f3a0006db690432222e19cc2aad9e925264be69256e104bf9c27a2b8888906b175b11b5dccb04325298bb3b2fbabae789c7482c7f2cf0def2d2a9e399b8b68a7526bbf8690fa5cd4a5cdab5528aa9c057effccc35e33cb42bd97779f6f5a3c310f32cc66be32fb394990abb08aa650eb23c8b5f9aaeea7e229d849bf9cec9c323980106cf22c0ae73c4328cb4de2ff888adf8c2c394fa0139753cb946c60f00b3155f66330c7eac946f614c5cd9cf819694b21639162b3eae17d153feb44afef7a5a163f7db1ed2f962435c455740936bab787c7c3c4030d4c25bec6deb6bf416314693db80035b48cb6a65d907efdc70ef7d3b745b5172ce04932e25cd642aa60525233a608ca53813ec4613c175c407af81f86907b774220cf22738a5b88c0665b6a5cc4e812dc041f21cc581ec763f0731ad69ea42ebec6199d355a2b3b5b0f615cbc1ab0a5203833439db5e3de13390715bec6dcca6a19197dfd301dd163a9510c60d2140c501e82a9d4bb9f2116e5006b7767ad6c51ec06b35b064a9d4ef9bb0d4eb52ce8c037d8c4199d74d2da57cf6118d4179cf74f6dc67b6219903fa2a5343b71dd87c413a980a38cb413d08c906aaaf497c5260ca8c8634aab3033c41c3ce668fe3d4201420f54d4013f5aed8cd24d33347e6605def5437c7b9d12f21b71fac407c051178b4f1be8e706fba46ebe3568f9ab08394ebd8a3529c9fe995521545aec3eba1b40d55ce504af6c600119586b23813422fa99ca1e21121998a5ec4468b924f3d91533d5b3d79568940503811e7fd3fedd2c7f06ad6be33d7e083fd8b8e777e2f78b38c1cbacd7526820806e26ad82dde202a7b0c50cd3791a7b73d5bc346c57eeb36f7cd9c9aadb9482e5c32b5afd0f42d2194ae27bb46e119cd5c87e6897e08dd363392f5f0846c3f08add0b79a058cbeb5a9ebff8f18771468a64db87b7c7f73292aea2ef79955bd82c55b69a670be58366b8835d7c0756a30e164c4558fc85d2e331bec925e6b2d5ff42150a912cd1d27a396229deb6cd2066c965b3847663df1ca7d5a0217e47e93b155b9069a5a99f6cf33759aa914df42602a13d7beded9375067453170458d137aefd568c516e353d5dc9f93b585341454852db7d1082ee5bb2ca54eef2a6b8cc2180344e6da8078234610e74afb361ac1d41d979b79db78716fa85cacf1f1cdbf682e0dffd545de1056dfcb3488c2fc8992f89b8b6bef6e2e93593d97c82fbb70ea9a1aeb83f71d059cbd5ad148b15e27f66cd0280aa5eeba42151d88b88f3b64fe9a5dd237716960c91a55570294b80e0307d981fd604c35c743128d45c4b12030f52bb46b68edd984c0f6dbb4645e3d0bf0dc498cb28f2b0ed39ebb05a28daa6f20fb2f77739b4c5b73e2cd91d6966d44e90b99c6f1cc9b302de815ddaf593a7028f437adcaa13bee67164a9c2d3770aa50a55f349323c6553d464c7afd5a2cf750a0dd049ec4b438f885348c4883cd79b7f20eb9cfad335bcd96a583e0725adbd64d34c4d11cf01f56789e51cf654661827d66cc39ec3186f1e1f9a2159bc4e4724277a22315c92ce9d2f783c14b49679d724182ae08c8cd47c209ba0866e023485cfede23b335d4836e8f72a00e1051c9fdb5ce86aa291b87828604311af57386071a26e8e2797c15b31a9676361af73966780f53f945013a2a1d78e1390fb7152c604cf4352ab610471daf0fa1f1e53f010795d03089985a4b009aca9a5489c913a9d749fbac410ad7fbc86a1dce9cfa4c12a713c79f536c297521620136a835f142b362515cc1fccea1b3f2c324e4b5e56371b058ac6159e68d78b1f1859e02d247e09dd362cd875d9f5a48784ca1959e74c3ad498e51edc77b196f7030cd1193a40ff3088e85e6b85a958c1b052a47882ec676349b38fee0166ed5a6350ff21b221f630f886291b661af483909df9b8f75b651f36cbec279bc7b1b3eed1ca8f394e9b459cdbed9fe94be2a40e3ca36587eefde80f080bbf8ccc9134c24dbd11d7756c5d88b823c92bf4aa71c58055ff0661e827a880f91e584ce5300d481d337857805c6268548d684518f533290168a2f34913860edb99b1b5072a96099b7fe61f7f04f5abc49cc0b8974e9b4ae6596ceda0b552d30e83401784ce4dd3b9f2402f93edc0955bcaf96f5f5c3cef9974b452fb5a513e479fe87217278d92f66b20ced9b053df77375e1a2f505859b379d1f19f80152bbd961d5f1908dcb5e105af2350764977135e211518eded76f30cae95162e0dd3fd2e37aa619210a3d1b5e59aa8557f1446314560d3586cca9d7cfcf20e5ab0bd4f09fc900b983f7a15054fa6cb885274c6d97db97c40a92cfc87db081f453ae31017f72441a4657b19bffd4bb0e3e8075154678b83d4dbeca72afbe0d5e16abe407572c243c8b321fe4dcff44880b6061cd30dc7a6bd9893e3d87de90a95c79efd790f0abf887be57c2ba8b649bae574e9e3ba96a50e8e892922fa628522f57c461896cb60191541bed5dce58759c408cccaee6ca4af46a8907dc73b360c302367b6bb46086f72236d3171d5b5ad251a6573ebd0505f8406d976b0aab006e536b9c725dcb44b642cc8bc47ea4904cc98465ac4c71460857eecef7546862d37dbcdd8b44da28b450eef6b6e6e4e4255ca8864cc952a9b8130921ef6356d1ef62d76c5e3bc4e8ed21c2a02baa3216acc7db07aa60e61698cc43130b352c5c42bacb519374301a8a071483a0235067e0ca99e02b3a6811b24b4aabdb950a4852e02461b45763d769d483376c40d243b91fd0bef716893c9369efd6e574f02d6260e258d839b4d61c4b4cfe439c54dbd7d19e9007213178473ac5430b4c12e0d6810541b0e5dd9e0c1ba6066ee710d02e659b1b0e61da2987919f2b8d6c04722c699d444201c516a0ee3fcede3739e4ed524cc014849fd3e9cb374d1d4588b22b884da1983763376467aa287d0a5a5a5402c836fdbf52976c78e596f52d3a36cf5897f232923011364c8da9291c3618d0d20759f86d10529b799163b37fb0b22385b9ba075105371446bc64781deba25920782bdfe63a5a3ba780863ab6dc564fdfb7cc4f682dd723fdc39fac9907a73c57b0a22a1093320a367cd846dac106955b0502f8896068583c48d5df298404c4157265b9f789d79e217dfa3bdbf4e74404cf671ed5d478dc6678d31444f0f8805d01dee2e8913af18803953a63c0d861ac8642118c7db9991ac3ce4b981e382dc9520c1040d2fd46aec28797422253c496fb3bf540e8be92de4ea16a0185a78993590e02e06d39eb47323e261e09ae8bf549232800106a0bfebef7c8080280d868ac343b8015fd084a13067085c682e4c3dfff8b06f891d864f948a39744e1fa3c87d84c404cf533a9067d489a4180c5d1404d6ebdb51c675a2fe110ed8ff35406c079442b5cd7b46c8dd3a922730a9e1c1776371b84969f201ec4dd16a7bba214cee8493c7c15bea7219fd25ef00dc47e75332d748ba0d0990c9fa9b9f0d945b1c2189a012aa7ea35f8ec117e2d795c049a5adb9216f7d814609062655e72232e5d6b89b8ef21934e1b9b96fd4e0efdd70279baaef945b32507cac834db8364548a34e05b399d9c0e3106292bc2e411d7393a9d3c3af2d4dd54dabaeab1421332c0311bc7d13b53da30ef59e42ea4b14fd2d69259a5dbef4c6ec805ade2451d9c18aa51e316b34dd4a80f2ca3a1980fac77b521dd7e5fa69f90616d1d052ce4fd4f25c7714dbf42b29ee64d265f5858d8b24d37a1cecd98da7ebd6765824dee29900b63ada57bde6b8c3e7c80358d4ecea4b6d07bf94a7faae847f58409d97ab85d90cdad53cb487a76cbccd41403089df89c7ad457435ffcc4e20640814a546c6cdbd92873090bee8a3948c7a03d412220d8c1ecf28f20b05eefc14bc6610132494d30659d8ceb0174652d33e626d5d2562551d6796e5792f78963381cabe8e48aae68e2cc48a0218c3936885798a169fe1bf3ed0ba9bb5f5bd460727b0c92c3fb7053380d17725191a76c3172b809d01b03c04140a04970f0649a5c77193a865f74ea89ab570545b239abd91b8c8ff0c260f4005ab1f304f2100227e6b5902e684f52380d25ec1c7513cd8f80987ffe334d9d69ed55c0977ea22bf015251bb92ee9fdaf3fa2cf150dac0ea4941840e528e40be814ec76fb27879542d64659e0fc293b928446710afce356464628a216ee92837ab891b106437b7219de732f71be89f3db0305f5932842affe6fa68bfb228e840df9e8d49306716d214566f5b716d400d2795c11719dab8934bd40b7f98d8e09f223ba9935e23859e32758695b687c56c4c1de927bc39aa9bfdadb8fdc88ccc95a7b7bca97087914ee358d0b869c2d08d6720654e01ec8e6b8b919cb36e65292bdddf754377884c469d0057fa7fb297ef0f2c557f1b278d6128a0efbf490fd26bd7ff3f38b86eba90ee79ac28381101be5da385ea60fcc0bbdec545bd16230dd8c37ec3c2f0cdf96e84471d5155bb4de080c4fe1e1c389f8da1d3cd70faf22f0b35bf37a0b0460ee0321191811deb6507c85ce0d7432d154e3ddd966d0d614be0596b59827e0e4e2151b302712723d31e8dc9db8ffe90ae1514684188fabab5c8f6ee51a4df7d600ef417bebfa4e3b2811539ec27e90e74c39d5eaae13d01951a803b730c4cedfcda67c0b21f869ac565e90107102849210ea1112f412277d1885dd83e1b07b38c16b23118c036e7d7da26ff478ca273d1d71a302d529d938958e6d7a556ea3326bd5935c8ec6894e660867f022e8cce38b4f03d204e06bec6e4d10e28d020c775b06a0fdb9f379424acf11b94e84f5a2d279331cc55a775138a1abf3c313b58f1d7cc3ec93160995047ce65292698bda33c73818807cec39d26ff07ca90167c4ad9d78ad510fe713c5e308140d9a1bb0f027c401b74cccd6618e1e330cddd9986749775f4015df7c9eca684c9728a4590fc5c3052d4250b7accaae23fe9d2a76394cd62b8462d6f813544a86211e9c99c9a035b732d1bae5787eece24a2bcd3ac87175c85e458a8ead1e0ef482806f747765a9601d2e841b543c8062d050acb8023439c636c329bd853521894a6cfced1db16af1498e8da410cb10a55837c5a5be3da318070d52939adffc85ea007e5a9560bc23074c92f4c0b5266f4b3ec57f9acf9740169b68195066cd8b1c54fe9d9021036fcf07292b49fe3936597b683ae9cfdd80219835c5a07d4b1a2ed5f7e92eed6ef981cd1c966180cf129d68f9103e60198331c5d7c1f6c46c0588c1b731d6c3a28fb763843bf84a5e0f867a50312ed748cb964e7c0c7d30b992a7c8064e1dab2b5268aba9e37470af533ec870c31a000cd0a9c9dae11ecc18e495501d56bffdeafda22f0189a0af7cb149252af3b4d20fc8980a8be53263c4a4a981423c7e076363a9520eed69b470dec1752b6adecad4ae140b8f5e3d0f158a605076984e653c4ef59d1d53551d3e5e034bf0d12d8a4a1336156a076fa0bceb85493ab14389e393593720b1f3f400f1634000ee2b1cec97e08d0d178a93003081ccd49d5ee3361a3411bd9640b15bf84d39f2d9a2ef8b0b6c49aaea5ff22f49ea0efe4a14680dd76e510112a15425dde8d647f40273c237f71f9f694595c31b167fc3e720ecfd48e2e9229a5ba88276a87a6814305f0305fb3efdc33f562ffa94cc703d123e8b4106afc5e150f3a9a84cf04be65926f4deae716e95a91cf1ce0091fa4a87cf9a3b8382f44e5896c1c1428b546f29b5f3ad3e0d0b52ba69b947ab70a5c68f3d22cecf3442bc48720d928b0434ddf813a9fbc81726430e49bbc576fc3087b6e7460835b1c0f3f0222232e879b8627686b25f3418fa904a14f64a90eeb0e45f5155d8a61dc98a3b68820632e8b501e674be7e822154ca52aa48e1c4ecc8e96338998d828d6d786a251b214bea39872c2460d7500770853adbfb03f56c3ae3173e50e71ee2dc8aef5dcdb0d939ff7cb5a16dbab2276645abd3e4b7ca7a7e4ce83a9081310322879c1d0c0bf65dfd008a9d92de97b40d30bccfc0b61a980040307742dbf54a32253072ac6ce8896f76b552377687d8e1f6b28cdc6e0e9d34c5776c751780b03d2834e2b981d9ce388d122c0a5f9e9776fa51fc7e74df0b26f92dc8b3d94c1c1da206f274c83cef6e1bd7fd1072afc1c006f3efa074ef5fc93dc777c5bdc051f69b98c39791cf0b7e6da33d32da2a165dce784cd8bf12729ae84ac9fae29342225fc1e1ce10c088ba89d1669e82c0fe260990ab1116f21f26aad363e9a2dd642458ca02e57e0754366f2a4b02facd6919392549db39dac5f1a1faf1209960ca8b29174f7af6d2d454dbe377de274002896420ae03023f922aa77fe1f6e388ef528f43ad4af2d6fadd25228f7c9d5352a4220a7ede0e5ec6fbb89860f5549d3d5d929c4e5599ec8bee9bdfa3250a72a0bcc99b82e7347c036324591e8a14fd11bb90510c20e4ca8a0f3e53fbb036c508bf6bc38a62582e2c5309ce59a81524dac0939998d785d6920cbd0c4d97471b689a8f5ab5caf4cd82949394e3f42d39b219a53cf1d6395445a1273c3f2ebc210b09307c90a042e9722284d7ab00c8fd983881da5cfccd3ba69e618c3c89cdce5baf7d46af19ff20c44886f3f8037b096f673c0f384195bccb29b3173a17f2f8da8c786a1619ade4fcadd9f7ca615c15868487125f1d2521e3cfa99c1fbd6a94c3b2d5a9652866f0af57d2bff027d8a47ec15af608a16bac9da77c440d993ca82fcd5425005583ba428a15730b88a85ad21d0e630e3e29770b6fa092715a14d50d4dc7fb87c1794afea34af12c0a7a34356942a50859c856588559847f10cc5885ec2e830467e66b01e489104ada99592066d0303e7e2041fbfca26a532fda09ab9f59bc7d6de717aca6007d9ec1fb4602461c664ceec32e1fbb0c3419c2affc203a40cc19bcdd5a1f28311cd660eade575801b37c10308f1dd5b3a9fb35a6cf23167dc6a3c16a4042e0dba94856b563b7fb86cb01b28b553f6a6a513928f28fd1e80b1cbd26a0cd26af1921b2fcd38093bbc9c87108f85013c03315afd7db709de7ef7a4294f0c44b0544027c0b8156e7f32a1f2125bada5978b3ee1181ab5941d5e16578845187d99ee69b02f316aa6be3ab6409bc6eafa29ca6389a8fce6d7c850b357681e80a54920c01d50a7709f0212c4f3a08be473449607213ea126e4578c20f89fb551b6f1b3bd2de10e13f0838cd49c6e7e52b42b630e2ce4239e0624c74602cb17a5aa04f7c4fc838813eec5abaa0639115a7f9f3589e7f9703c9d0f483c42170eac0c3c372fcc69913ac171b0679dacd27fdc6f9e24233e004321e66674f2f6e008c37f94559b79de215bff96142802c7f13b30dd54e208595018e110238544d84852e851309f11f94ecb5f4f5a342349ef2623c151d3f9ad5623135128031737cc03a92aa082291a88e545733ab63c9c506df9932e3c0c0a5a979efa9d655e128cebd10a13b32461ed11354da6b64652ac0c143c8bb03db12da979521f62a5ac94825a6fbc6b70bed73cee032075aff4faa7b4d84451c886d946ef9d350e1c28b22de5ce5a083c2fcfa2fbed47ad4a5a31b1c06007048f48b927a7adb5d30dbe6f9bbce55dde5793f143fb351f7571536b19074d61dfba26c6912c1e97c86cabbd4c7d018c9997e88794cbe69083b97a1c37cd454fc952044d6e0204c522251eff04cc50c9c5f501e0c5950ef45a5be5da4721c4e37e2a2dd03945249408de5f9edf699251d30850f1ccf47219ccc61556f034de01db0bcf0e6991115549c3f204d5d6778e2a27bae688e4e61c8887f81f88151e417f308f0eea449a1a5d56555e46ee73ee3131f46e53b2669b49181a84dd9426fa5019ed729c3cc6cba919ab6f74c14c350940a43ec445007cf45b6473aefc3df19649cb36835e3150289724cf7785a27e0a2c32118a55cf33f607d10d56196344a85f37ed4d4816daa4dd0e5c7f8f5094c19cb0737c496bb18af553532828252da06a0314fa2da9509a34995538cae00761b0d9b85dd03b270970e90f8e8068a1fd41faa4a807b8d0004ea78ea31f102fe97664d08680922e0d559a168456478f2c5aaa0c55375bb7a0e867dc8519a26f907c4622902b2c3b6597c527ac6952b17ae33c73fa586b8cae55b4f9b1a7fe197be9d8a1a8b160ff08210f2226e7719979a6bfd46e1996b3c3855624250e7492be9e71c1a263ad70a519812ac64f33c2f475ee4508fe81b036db15e1eec6248eb086010add1b3b0e6ee75db0b27f5ea109bbb2dc7ce345fc2a9fe0adf95cd9c1655b18828d56679f1d390702c21a7be2c1c875e435df5ec2c2e1b66d1fea1d8f387685650ea047e035502a3dfc5359701e2099123982615370200d34c76387d79cfa950f00770e2a64a18eac34c9061f72730211b4854b124b6ecf5475729735cfe067cfecf273cadc51a4b25dde35ef109052fd7fc7e1065afbda7ff33a4354876071ed187899e1ba2506809ba8443742ae15b074e32d8832e5b69afcc004b41a2245eaa2e27f2ddddc760665ffdc4603f1e1f1fc5127e7ce87c01ae5ad60e17e70126757f7c3723f27a62653451e6ef6eb446bc1ea551d6433328bd9a88281e36dd193f5bc42d648e938405496b530b03bf5af1e1315131c7469609fd02943cb18cf418db6d0a41d0b35f89cd82d449fc8d42cfa9e2776333e02e0ff58a185c8fbd53f18a0630d650a74e85e2a19103dd835cf19a59fdb2cadd49e8609ba23cc57f6cee6493a85afd9971af06c124881ee34e12182f22acaaecc7480c9fa6a8b1f0253a42b73959877d19b7d2541fe46a0269b7c1de06eb4267b2e19de85be44b33b31faec81b3f34f8c7a31bdb45baacd721c63f3051268e9d7ada7e0926760dd3ff369b78156d5081593f8f6e12c26f3c3eeac2f164477bfe768fb380a0b80149d526bfd33c29cc833c9b34da019b93b70a1cada8d79b41d6c572baf492d53e704b23c28c3cfdd5f4ec6ff8bb746c113093f8191f0b706bc580ed5fc422874e3524ffa59dd9d0bef85ea209f6f7a2ebb8b9113b13f03232e1fb042809719be51c7cfb3a192cd5bdd9da8e652b0cb5c04999fd6a47eca11b13b4c440e69d23700e1c2d4f673211c411bc8991d28109abafb60c029f18a65ca67602ede15e2e2fea15121b9373cf14894a41fcb85fbc98d609261a5ee0333a7556daae9e186af513e99674c60b0b9223e0088585cdb36f7af97569615907131d0bec5370eb29e47126c98ec04836fe123808fdcc87a5bd4b9783a2b661de2cf0b8e184b838caef03d77ae7ce0bfb5a549f6bf8d68e71d7584072708c23b129e38962aef7e4eea1c48a5b44cf09fe286c62932e21a3f3e42a6ddb597283bfe2e03ae9efeb08e87a3d5d260aa18b364490121abbdb2533c037b27d35bbd24b2a5741cc00e017cfcd69d264b5bb1fb85f34558ede8045f8790b88e3be633ab6f5c27792b905a191a07a6792cc92af13b771bef01e05fccb2da9ff80448361be85c20a8d7116f842da6b4e6215c768b64b443d8b00da09121edcd7f1602d107c0b77ef0bf0893bac567dbcf46489856d473fdb3efdabccde6b310891182f3156eee2d25926d4bf2981e83a4bbc86a45d459fed38fca8d0f6c57c457c31fd72d5c52e41e36dffbe4aa452bcb777ec926bb7dd3a88fbebf68d4dd9e569509ec114f7b0153017a1931f5946d1bd70ebdbcc6aac6f19835ac5894193092a3b1beb788691feee2f516224247d970fe6f399986b888417ac597f0df562f8e1cb3f1c1c9175810873a08015ab4d51c7385babcceb70385b5082077d11fb0f30801bc09f49f39147400b7a527232e6b1a56200c85a12eb6abea890114b1a471f4b5365dfff7b346f8910ce3164438174f0341571fcf0bed9fdf75bd41c97be43725adad504cd5b6f92f39892bf8290b454751b146605300effb54e72ba46c6efcaf9ed162817c60505edaaace7c1f56f3612cf6e92cce91bd45e84f51ab26c1708a47815a338e2697f631dfd3a6097a7d12b2f59dbbbec0e3b02aeb11b226e751919233409b8ae88a44097f66330275a31300491f3e09163374a5f3697df114fbf1068d1f177972dc2a9d17b5044b658ef6c71854bce3d445decf0175c94219eb9ea17d0b34080ab2c8e0c268337eaa83f037dd7dd57bd409b6a74d4cb5726f610ddf08d87e52cd353bd3478e852d2efb588f1b7aeb5b6e2be1f53d4385166e885c165f7dfbaafb6852e5044b82b9ba17a6d9616523f986bcbd8c0438561b0ae6e20446a8f29ff8b1eb05fc90f1e6fdceaadbbae7b6f18f0b9bf37b89b3c2f84fdf82fe09c267ee82200c1bd866e4edfec763540836ff60458d8e595232cb32cdd8b10291f637d9c60a6cd919e18b12218ef252cec626f923ac0a1a274dcb0179d66abfeba33238608f9ffc5904a23618ce173cf2e6091754041ea8dca5a2e1348cdb22abcca4e63d7d10f58a4fdb8fce01ee1b7816d18b8cfac743ba197f5ffb8b63e33d14a2807934d7b1881aaebb4dab307c5a582d6fb5a8b6ab16767a5672821e3ddfe2d34c31c3a7ae1c2e332d6d9499b92bb6c8f0d5d9dea6dbf233b77cc81416d5f12a2b6bb569a262ce6c0feec892703bfb950b03d501f27fc35042b1140878caba32aab42eb6f227b233c9583f8c9c692c610d82f24ba7f5b30b87b83f26f3f2098be528fc00f77ec74c73a76bc0c172927933116f70a04d41fcdad8e1d9e93f25c4b5224555d9a25effb4b96e98ffa43abd2cd6231b068fb06f79bad3a21d6bbc64bc09da44cf0aab268cb0291ee62ddeaa9fffd3fe20df15f770dee4b0098e81d0ed240eed6d6c2caa08fcb8cc5a0296fbf32af5be09d18d05d470e2f20bc302b6d644c710d600d07535b913b95f85d7d22a416f0842e7182407b8ab22c72898060711110d3e970fe600610f9ecdd32a73b075444c37017300af9e751d5df17ea621a551dba0d5f1b5565c581daebac7b4db61f5ecc36cde1651316a72685bb053e2173d9b65024adbc79a42416c1e691b9922442e590cc8263b54fc5fb5c086b3d03024c225b26d7d8dcd25d7af3d57a76f21f150e09189f58b89cfb1f089a9d8e23cc875496a5dbdbdb4e0c0a6c5e61949dc6023c7dcc134378f8cd3589a433fbe218ebd264dfc65b49278e91efbe0fd827c4ec9b1b21d87e4bdba383eb59e0d8072aea9db17b19e0266bf64f398979ccafc54dc8df81e096435327054590c533b1a8d05563e288839a90d5205bfd6c13adacac61ad04458427e741bfed549044cecd4820b6fd310e2136a1d1bf2b767217e4189a3e9b722997c63a760b44b8ab58616404a55c9149b50ffb6b5f7a9e971f0d385186fe287bbc47273fc59bae9c665127eb8d09e1aeb32d4b84682c224a80252143968b6fda723f635f3d0afac9e563d34008371fba8e3600259b803bd4e64323011626f8e3d8fb56401eac6c710d748ec1f0455e699b70b00a4a3ea92032ffd4d000fc88e669f2184e05c6c3ee6fbc19f1a7fb0e315f05527476cd454c6b4379646503597a550270320d646854190b19585eb7dc54d816935be0187e2f8122413006b5eec57a3e675764e5b7b019d76f37340a6ab9156ae2f7ecd7593a2903b104ac056d75ff2eb985de376257a1a94da50e3404d4dc634118f9b59991f848901f9048a65ae9ded637347017b04eb441bb79e13f7c25dada0c9e9209a543f0113966096dcf67c1bf8ad084163518c36eab2e08d3548970cd4a0db4eda15bda5d95b9f7088e76d26cd387d9d5ef6a2d51a948905102820e168078e3d9c701692137eeba057b08dc6dc96c21209165aa6328a641b3c483676101b93dde974e028c64f618a9d4615382ed4d93b7baba296339af3a9ea7e9d4abd78ec692d7b038204a443f4612a5542c96a4bed87cb281d1a633751b6168c09c5d6568150a8b2e2e372ffd37b637687c88dd452cf992f92a08a6a165c6f0e1f6107aa3390696dcf55d3a447bcfe7efa2957eda19dc1e97ed026a279331f1b34ca45e1c648a1ef06d011ea627ceb4a56fad956efc8e2d3c890679e3e800697cac86801724ed85703e62025257f27120d726d1f11dfedb2ab8e168b62c3b75dfe6ed8f51adac488db2858730d8a9ce32572c74422942aa7dc977b8f777fad5ea97a56eaff65fac73a9c128564aa0acb8359c6fe2e5a40525a370b804e8396c9b2b42e29246475923501707211d424884c7245f38fb6d7047e59101b830dd2980e7b475dda9c1cab781a3a9995b4d8f95c4a42185bc8eb505f3d359938f5fd3a57944d305ad56b95a62d15b600bf5109a04359d475d22d1d38ad1110b6f5b908f9711a38e42a41e5132746ad93528360f851a931038869de6d962c32d9052bdb217d2e406cab5883df7480c7fc712add142705746bb93a5c1e7236154d89b6289395c9c4098941b2a9601f714e530ceb9199455b6e231a0f682302f771fe11e8700d407c1df420d292c2d443cc178901618ad2cebb9aed7e44faa67101cf2a1205abc43f767bc5e17914215187712802a15657077546c7155404a4b49232936aa8f5b5b88fea09282ab11a46602dbc6eb6b9cc9acd507af9dbc8b9efcfb18f370a4bd117f07ced7707d21fbeea1b2302de16ff8532234135f47af9ae44a2b40c5fc6b7cc3c0709854be7ecd7a5acb0822ad650add102144ddc836afaf9a4dd84bc7ed1d7159526739d70ce24612bad21d4d2865fa49d26552010190063c84303a86828206b2c23bd1c9d1750babdfd42fb67831592ef6cd56a3a826e24e0cc31da304aca5ce702f378cefdd349be597161145aac32a6034920bc3c4420137c2a4e30338745969d2a7570788e4ff5867213aa6592a4c1f3b8489a336f58f3d80bb3001cf0dec71efdaa91e642e622d4bdacaa8364d5a4970cf5df29c4b6465702dc5d45b00a1a11c44138ec104146488fd9a179a4106aab1d07bf7120e0f1a14d987d5e4b59e0d417d9c63035cf09bc90c87941a6c466573c1fc7d5d5777c1234bd94ece96daa4fabac67290902d1c2e801318125fa57a299f7c7b0b31c5e2a41f33768782cc9ac84f354957202d50b00f9ef0de636508c4feccad1f3bb8cee3bdd6d7dc37655246d360ffdba842f1f6cacad6ccc5eea7aa0554338ec94f400636bd9c872b9a6ef145f8c1b9c168f4c6c5ab7b58cbf92bb73f07a62226bcd7d675d477ea3bfd3d290f538b9c813cbe1489c3866866dfa534a80c675ada95b802bfe2feb735043b6f8f6e168ee0dce1a8e65b3b2381fc544b3a2dd92c1b41bcb43433cd5f701f2a02bfdc353a43754c8da886ac14805b0d886254c2c10b96ad270ec12b789f339d1df4e1344bb853ab781c81ce3d9fc6a61796278603b6e78f49d3d15062742f549de960d8e06dd1132560b5beff221aa82bf62989aabb74104330c2cf95bf7241e243871e5c7e3a35ff722d149a361bd45a0d507ae5f0a2bb2132b9a859cf2f6135cfa2651499f365d8ef1d3b54f3299652b8569e1fbc724fe3ea8323d4b0a30ee3b00e5c7e7af739c93d88d4c24dbe8fc39ce2e0554d9cdb821d517b872ffc5da438c03f307fae71821a3ea303844a4839389070115d04a43c2ce07b639ca3f1d2de35779f90eedfdd1175a8efd92069a68333068e5da13e82ae02442390b3eb72e2082986bf7096af7aa6c645219bf4fc9769b8a6f9b38b0eb7f52c54f764a440d20a4f2789a1d88ad7d6bc90210e2fb904a4099795ea20f3478ffc22947b1ee2cb3f8aa64067e05696e8b39f57d265c1867fa4d79f4f7475b496c3270fae6f7ce4b146205d027e7b11e80106396f9e66d1621a9012a86b0fd043a10e6038f2d11aa0e249d4e25340ab2181a2a4ce4d6a02219d43c05fec6be600db02bc5e5f929533e2b186bf63991230815f670dd14dcc7e12d954bb17ea8dec7616f2ac8490c9f982c77c7c86d60d28af5c608751a0b00d6c5df752908a4e16919cec225fb61b3086ada35606e259faeb9f3e9817960872eb87515afceefb07603b7cb8acd56e62427e6f4f8844bc199f69d4f6e7f4d111ad5063657a0ccb25100d7f73536d5fb871702cdbf583a6b06a4bec09750aa12999a8189b8a095fbdae22bfa0e0127f6d72d0908ede1be447ef4ce0d136fd082d2898da415dae54c4cfba5558395f0509603828f9b762957033eedfd01c8b5e1fe098d4c9b6ff60405583213d8f2dbcb13f2294534cd213a1c645bb286eadb737fd3021412ed0a8cfd8f4069e9ef98e5b28364cd12dad9fc95417e0d2f6e8222f5c30f070b00af40dc7ab1926f2170bc6f2014ea8ac7ebf3285e824a654bdc9b54db7ecdf0e61f30f1cdfb162ddf1743d9eb8428cfea67a2ded9e68daabc92f64dc466b4389ed7adcd56ede143b4b5039520a3ab1c0e8c64c1cffc88c3809195d93645ece2fb72ac074695ba962a9458cab0ba8c623388e0e124fb92d2af217ed11bcaf1327c4933fea7e5c363692e79c01022394585e295fe33994d3fe8beb0c071a8d5432aae5b87b144d7e798bae3d2c5e91ce5b43f5a0758b65bc7b2a2ca70a39f1512a66583278c565097999f77de3e2efe5316e02d5d91c0230304bf672499351665b965f9c92587bc51921ffdd10791e0a3a6d11fc6f9c9df92b99ca8c1a0b21f32d32da59d0f51664835a3a152fe5584575a8a4f7521600d625c7be3a77e56d6a6eaa7179d56363c2e452453bcf826657091c76af32f3b5553bbcc846c6dd968ed3614ec61bf130e29e7e0524736086f85dee36cbb2b524e9d4d534b79305649ce17640699bc47b9e594f15724c15ea366d33c5c980256a9999203cec725fe02c31d73ca5e7ac62669016b76be96f9baf09b3511bac1f80378b988c332188c1a05a231aff50ee5b0199eb1c681a9235a07ab398d77cd202db37a5b8e8a3542cdcd7e7c9ff9a99c8918c88b9ae2b086971ca665c4ccd3ec3de4c1c5201ad627bf0f962819114c2809e6319fe5e1e13d3c9a956d832e9642dd2723d940dd064f4e9025317376937a0bdfb29633520513db8be5a0b2a54926849802f80f7a090cfea20cfb1af522781d401a2fec0d216e7a34975fba0c52843ca62dd27ee78b60b548f2f4684009a66488d03098540bdf419eac576a9ca8335156bc86e5afd93726dcf52879a660f4e332ba4a2ecbd56463ce347b81ec8af768b1eaa4a82748cd44e67c3e0be69dc65f85fa44c08155ebcd24790df09dc5960f0f8aaa4f190b51746128fb7f3f4667c12e202c277a2bca531e59f143f74d44067b6ed2cb26eb04ec539e71278b02b30b6cc9de4a39fb079118c18e93815723838cd53d9cd9f9cd3d401124479af0319d3f5967142859fb45cc6861db0d1b5ea20003982dce4b645933082c6a3d0ac22135d16e11ccfc69a162d5aa02abf580b9fab84d44f68afab0bb2ef854746448efe40c1ed8e432e971f50e9015a1810f79a94000ab6b1d48780514ad29f5fd6dd8cc66a48328d5fe61a699f873ee7df0447b754b1318501f88e6eb5e3330ea797d55f6416d4ba2029f924a7f3ec113a97bb24722e3ab6279cc4d2b640858661df830b6a0c9826231312dc5c7c91bcb28add179953d2cb396979e5d6b6c3d60c02c820439dc49d02ea3da8b83838a1fa576670d61678928fd9772ca8296aa06267ad637dd7611360d13c977ee8b7405d5a0bb8d8598715aa1e352eb6bb4c0fe47b353da2b0e21ceea6350d0b8c73fc2899464e3adf54230f7246a9d45ef8056a7fe777cd4c034e29e7ac6519668036b5880c61944a8fb2a7a017bbfebb39e039e0b9de67046c49d872180404e8b2367627ba124d64cbbebd57078a61abbb4f86aba1d1af885603c44363719525d76a5ef2e34383ce2cb7def69a2bb56373699b47740dc5760a8bf6bf2f34cd827cd37417740018a9233ed463a4e55a921242a022ee6e0d59bcbbb970b363d9c3ff84367f1890877e7c76c4e4c43ba7b568c9ae7c80e7ac55a107a72846b24ddb531a0b42f1ba1721ad80cad0e0c9464a369016b62a7a96b6a202bd5dc0952b7d9ab1de8e4b2260ee48397c361ab8c916d6b2991c02fb3fa8fa3d5491b9058c1a31687f3c1f16271910c1d3b80f14c25f56293065ad055954360b2cd629ce578f44b9b27d8f87173040f1b64bec47b876bc34884d484c9625ddcb9ddf2218928d4804b3ccb06735a71f63484065b569dd00d9bf3640709a3347a40525c544d769563c99714b4f8855eb2ed94364aae6c1b06590373821a089efe42618282b2b74c353501d4ebccbc22bab809c06344bbc7208fc8f96848c0a6e10558818356ce986bc4141165b4d3c615aff38ff01d6920d205ef45d20aabc9d596d4951c31391143ebea3ed709c529a9e1a20ce12d76e49a0b933e2d7707699257beaf5b00bc2d01c6840e56ae91c0ffd43b710aabd2154100399d1d98496190fb8b99fdee113a9f7535ef1e0974ab955bb5940941f827e6fa639724f25c542d735a0fc3212b8edc0b3fd340e4586bf837b33bafd68a3a287c1d8a27c260275cb5ee47aee2abe37537798230320b87bc11871ee75d633cac7cb46943695f16a2775dbccb80dc74ff7dc84e62bbc4d91e1657b451345916c7982f11ed43fc46edc4cd9da2fa3da4967e986f3f3c8055b1f7d46c79718350184606d9846d067843089b271440d5e048f8ef74904f14fa4a0c06f898a948dd31f178a494832be265ad1eaf1f173f8e7bbccd37ea215141b3aebd0aad88ea313353ec9e313342c30ad1caf985e4466f5cc5d9fb7d08aef35ed449a348bcd817f4fd1883e8716fe0ea504cbce8d8d5356f084fb8b5616192de7d020a7b46a61b47db9bda07d91db3737a4d5d55592da7c3e7096e94323ad427ffa98f95c3fb616698505e66767c2706997b44709845e22f8405a8d2e459b38a4d8e22a71ea5e918c523d9b3523ad2e1f805c00a284198b68bfb7a8f80ecf4a445a01cc8ce9c38531b7a13080b1fe7ee59d5a6ba41520e3deeaec6d141ebce22f23040f19e4f1f6ac505d25018761c8999f58c1fac1500182d4f330d2b519c61bfcd84617cb2d7dcd79713bed4aeac254b4b83d1fd17a985d81f1c972a4a6869b5df11a809f590460d136bb826b0588edd65051a5506cacef7c21bf0c587bb3e31991496f1a4419aceef60d41428f6671e9ecaa8f55b08ff1bf7f14cb405ac8d662a0d0f9d28908c6f9246e44faf79afafecdae78780a1277431059ce1e18441ee56a04c7d7d915103e62c09efc61a28b1da56c47045df5da6ab7cb12c9c1423d036757888349840b0fcd4a0b2efe7028659e6aba1ae3238a1d1831a61454e5d9d5dd6ec38d403596db6deec1eae6366b726513548f076ac7c47bfda98612a5a6c8b78376665706abf76e2e967243cfaec05b53e61158566657a87bf17e8a987d3a3b292c767675d7f2823f8b05d344e0b29fbc37c12188edff0e1f82bba40f0ac2b501a09db1cdae321c29f26003582571c262bda07f7605309874c7ba9aaaf6b19c5d85aa564aff1cda2b4c0857cbc7fed64bde5771d57725efb51aef56956d5d615b09bc6f37f7ad7a9a02f0de7629a77243132c60df60592a5803350feb0b9631392a813d584ed98d96099d61b38b7d2685b5d89e7cc2d29ff3a1f124cd15a5d18640b270d18ebf3eb063a2543da568e14bc2851cb2cc80909b5dc9fe5a397c50318d90d66f6d8893835bc466d23635f8b96922af460d3aae720c1a74fb737f66a6e1463e05d79cdeb10ab4c83006a34d1c448cfd151e5a9650ba3c96e530f0d7fc55ecfc91903d8061828bb58ee2b0c96c8c023cb39a4683b4d6860bd9c74094e75ccb92bdc96de070f3d961e9e9e35f90fe19c8f871b096799133359e3611d3226407fccc3a24fe11ffb5d8723b1078756b06ae4209fd4ea5677c9cc92eb8a1ad1d762d66d9d867f450b216d40ddd0f30bc3960bdb4b61eb8bd874b3570ac6cacd8bd1dc1b393ac3c4ed3dde9a38887befe0403d98149ecd2af79b1bdfc473894dc837b9168245feb27e140eabbb8407c5a82a0b3d1bf919c3008ee50f589b93521acb10267f65da09ef093d8e06569d56ed1fab591a7283b650dd8f1aebf4842df16f18c2620918e7742a3c88ed79f692c8986d777acf83521b915841a38417b3d3425712432fbd4493beb032ed56328783b3d5bd07e6c21325de81043b2d0a667fd2644c543f160b095ff9d866f26140a7ecc44b60c885d587f82dca16d06b9c20f7ed0dff567a8fa46d53333fccd637e87439e1e29e3a7aabdad5fc2d5716278b6cafe377ddbcce2f487d8ad60a5b596b5aba47c9ce90071bd86451273df66d0b7115853fae563e7c6519b1932967778b715b8ce40bc65521e3c40e113159876e60ad9b778c6f33a6029d5e1434892cc07d5e1f0e132ddfce35946f7573fe2081d9d4ad45ed2abead9da1ae6c53139614d7309a6ea27d657b82e1654661f8b19f887fd01b339df6894ce1d93f854d5c39110d38a18ac8e9c6b0d2e911b4a4e483d48bed59a481500bf76ffa3254e3838150f88804feb6301d8a5f11603d841e3402f3a04301e50ca3e85a07302281b6330530fec2f7353352cf4d46c50a9008ac6f886213efb48df0508608ae1466e80272da173136c142879df011811b60cb98d41581c397deb44ab0c73eaf801f8178c6b439c7fd560ed65e6f301da45b05d6f67b9c1ad33800a13f115def7491bf18595f9c7fd99026e1b61b2134d8670cbe7cb09a77e2a3c832fc4409d42855fc6eaea2e049e50ba69d1c277208798e69dab0616ff0c32fd8f64e776604c8b60c002ec37805bcc48bd4edfca12881c589cfd782913cbe418e9354edc386aecac3248e5ccbb6f02d3e74ae4a0d8dfb3e30bbce178add24cc84a979a90562b0c946e691e43d8d3ca2ceedf1a74b429bb0516cc312bfd5bf3370fdb48eec9080e29d26b14e962e5e61d0be879ba52555a2c11676c2333debaa3f681ddd7a70efb6f2c9609036d7236336858738c127d74970880c9049d2cc80c2a615f3ee8980d0ee6cd018fa9afbc9d0e7431989d2cb9172db0041d37d5e41a56df8086aa1cc9202f73f15f268d5e70824ad0d7183f0d1d41d9b6362cc60bd569d6172c7149121c4e3091650689f244d0ebe0c7ae9690c3f8a5885d1f14e1f3c71557cef7d5605186713a344b5830ce4ef2431344723bf9cc18203c8be0297ff199e99e4e12386fa60294d48c6a851d8111824f157e6628f3e524c489c73a26e4e4957bd393636e45c274ffcfe5d38ab64f0cfaa587eeae968995449c90ba19127fd0a9564c9e25aa451abd23d08af444988465a007610ffb6fcbcc56a41d87a3d384654ed86a05131c987cc04d7387175833588aae61633feb391d04a8da71ec03e33f3013b3153c9c975ee731fb716eb76ebd19e4dd8201d43fb76c18eb646ab543d035dec92dc005d00400ef073cd9fb42bf465225da852b691f75a92dac00c638913e90ab371d439eff768d2280353fcf3b8d2f106ee36b506bb232d9430b2ef5ce9b2529cd8f8220b8460c030cdd681eb7398f2544bc63a039cd63d9a852b956983a2048f66f21b95b2d4bfbe8135c51a8da5fd77365880820bd0a1ccb531d221539e5dd4f417db3a1417e082e6263a29f30f98553166ee23e35ce30421d1575881307ef4abe612670b4ec16869e7195058634ac3256480084897234918e39e4e754df4b9214f28e846774568da26518ceae0f3009b7bbd1380c5e363a6b31a02d2b1a0d3654640612600d766b0463046d774899cbda44e14b9df02a4654c08434d3d052826194ca8c258e55f3d127aa1945463e2ecd6e0260ab60c2511b72e8ce236519b4f4e766aaa38e377e5f0bfd01392174d83dcddf723ed2c369869bd505094c6a0c9b7ba50ff8b37b43f352bae694f53e094801cbbb302c0e3e5f3175a9638a474dec192e6c5751c92c26963d33cf004234dc46e490cce790312798c9d3ecd7708d8fd9773fe2945ff92694369ae8aa047aa3c06f15ff07d4a385e1c7cdc36c4209875d249ed54b8c0d13461a177f8cf326c4c6111c311d67adaff6a51cb57381976fcdba9fec91cb9139062e5bd57ccb0afd124c55c85be53869e064e5facc6e0c15ed84ef3acfbee03d0337d31c979a0a9ed44095e1e23b28824e0c7db4201c38628902442c0e5e7c3f6267b9c0acb294c492c261d662c40d0bb03027a7eb8616cdefe85791efa10776205ce79bea7a25c4c26aa6e368ee2050289fbd5b7390aa50f62dc60f83d080b8418e5d45f0cfb7f3b619a0c0092fbe30b72fdea5a379594918af2d5032857e4138847c1775e435b1f37e3309a58b8d95ac93c95b5ab601c03a25cb1b2efa070feab3f3dc490c41d8e979df35fa55c7e165d98540eec945904fad2aeaff06b4026fb258741b9655676c4837228cdebcea26b0f3709b3f4c0696a0a6bf4ca4ae9633606da196d053625e2d1222943d6f9503865e54ea10ad7666234c19c9fd45ebe35aab53c8f938c4dc040a8c4e8ade147d4e977f8fb959ea0ab90185840608591d57311d612675944c86db5acd09da6eb4350e1441481adcdfcebefd253f96457a8b5a6c662655f5a92c82bc1b41f5b12cb6e00b847223dfb58f681558c4b909bcab29916a58ed1e6d79fe6cbd3bc58d8f658d7c5973b86d270e2ebd229c51f384f2bcf216a9c5719c981798bfb7bce305ca809047bf1802379fc63394e072c262fe2a8242a23c38d54dd25abf784aa39d590558de9db7b037b481bc6a7cc05fd4417963a67e2141321e15bdc18424caf2c5dab2e75552100db44c44f6d26e76ccd31498383960bcce557f2bdf6f7157fa445767a6cef7d495ebdd6e2fd2b27feb6694d96958e6df1197202629dbeec8735e9402b591bd440703ca2aee6958405e15a503b9414b80c2f1ac0bea71e42f71edcd403d38e3ea4634da699a27714b61fc4ce331ad3355193f870eee19571fd45243effb96c56e96602a34b57de954af1eadc9c57414811cec3722c9de52ee2db79432259902c1064b064e0636fc310bdb52c92f6de295e76332b5a0de70ff4aad39eb3beae570da4bad3dbf49622654324449e85d36db6aab2d9784f5fe5556fd6ff0fd9da5c2777f36d5454476e19f6e106d7f4b44a0eb94f3e8bddb67c331decde9f1307991dd44cee299fc0afb4acf06a28161fa1f68874f9baaabaebaeafe645be2c2eb1eba769b0eb7da24dc35b17925d69794fc56f2de5392f911ff9212eb477c36ef793cec584995794fd3f023afb2ded3da3be23e5aa821f769ed7de867b4cb42d68f5021d5117143c48d45f9a77a0f895e7954487d16a5426a5ff7ef275baeb10dc78550b4786ff12eab8cd4c7b0afb2ad62d6775a7b7267480b9e9cd9a61c3d32f94b0b6b6a539b6ef4cf10813dba51b991e726cf02c360557611e1deddbbbbf76f07d9213d721605429e1eddb80bb87a1d5ed4c226e1fcc6fe2bd2a3cd89dcf7defb8b0df53d5f2a84baf9e95a433d32ba7c725459b1cbc6ca4de23922ada92069ed3d1e8ef16ef87bf0dd87d78061acc71eb39bb3fcd4da7b24fe93e4bd7fef2713b7d6487af4d3a3ebbb05bcf2fe097983ba83fb8070bba75fb8dbb4f98efb3a49239920fa4a4fe7b9af2e19f72e731e363d2a3921ad0569ad86633c13f0ca7b1d5a8842d5d5503a5e4f8efb5ec7fb9fcc77b4f678eedba86018ebdff7b4b2b69470b067e9be9a1d3d9296a5bd1f85446bd2c5dd6a75f0d91d4277906645f73004248af1c4b9cb037a54bd943470dc1869c487557c2e006603546aa85fbdac36f815843e5ce883b7a398aaac6c8d520392bb69bfc9ed84c5c5a5dc5c4e4455e57229f97d5596abac249b98a0dc3f9784c78f32946d142afa37e5efc6fca9db7b90612aea376a7d655976b72f22a88f54a49470ee9f139950fee659fcf688d2fddaadde51fa5fcc6076837b4a972fecc9b97cf9ce6eedbd4c3fb428cff97ab63d0ee9fa0aee9cdd66a8e62b1275a516473bd70309210ef851bd833888762e67b2ca464d51371cd7693846bc7c1501e6f9630e1977f0b8f023134c8237b103177ea4816b60d8860b1f26816860a8860bab6078860b1f2281636058860b1f9e2018188ae1c28747a017187ee1c2873e700b0cbb70e1c31e9805860f4dd00a0cb170e14323700a0c1f1681506028850b1f128154307cc80397c0a448845b206cc2850f874024302916e116f85009700a264523dc021f1ee1c2873a90084c8a266e810f8b70a1f6f0611098147bb805c2215cf85008c3f0f0f0a10f98147db8053e04c2850f8330cc0e0f1ff28049f108b7c0873db8f021108681f1f0610e98144fdc021feee0c287390ca3f2f061144c8a4818e2e092e20fb7fc6098948737b8f0e10c981493700bb40fa1b8f0e1133edcc230fdf0a54ba975b4a05ab80be4a0ec6b5675f8900ea11c1e871c70407912ca6f7d49cffce2635efcd637e6990f7080674600029e39010978e619339ef9de67fee1876756800216f0cc0b90796619209e198867a641a3860d060421c433d778661bcfcc80670ee29985f869809719c5b2f82519f62bb2923f39d132d1f39069bf43c6c3c3c87678950cc6a7642a6fb394efccfe67fd42649bfb24f941723ae2d36332528408cf901d9d92902040727ef8883d6e9cbb9c92df5c58fd486b2bf7f2a9eefa6f1027be926f5007fa5c088f549f58591f1c6772a6577aa557b2b1b1b1f1f171f94ae0eec32bf0d9bfc02fefa4a1e0c22702d1eb403d9501e27089e2a054b284035f4acbe2b8333d652f9eba411c980a21182e7c58ea27b87063005d3cf47953fbf008a94024fcf14efea87f22d13bbd9394b596da6e9e23441644c680cc465623a39101916db1e7c297c916906dd1c885af80ec876c8b44666409c810906d51678b2552b6c5205b041273b6f823fad8628f0ddec8dbe26de6395c07c780af92f98ecc77c878c8dc8663c0d732bfc992703d649b3771e10320db1c04173e4bb6f9083637c1851f806cf3145cf82dd9e62cd8dc0517be00b2cd6370e10f20db7c06173e01b2cd6bb07914177e01b2cd7370e18fb2cd79b0b90f2e0cc2e644d87c8acd91b0f91236a7627328f8142eb4c2e643f6ef66fd704438d5713e93d77b1ce9955c0b7cb70293628f1e5830c23026536052f4e1a30a17be176118160fe38f1f7052c1a49893f3041e86a996c0a40804481386308c850426c5204194b0c3306f0a264521428ea0c3300620029362a9548412c3d0203029eae80c4108c3481f3029eeec00e1c2f720ce0326c521ae05fe901e5cf80e24f2f0c09228981489d48049b1c80c98148dc48049d1e45a20c3acf0c130273d701846f4447060040af8ee0226c51e163029fab816980226c523aec5044c8a27d7026f1806e5450eaf430f0c8eace08402ef007c52fc712db00926c524ae05324cf6f09d0926b90f84493e70e1cf1c321c5e872c8737c95c3c0b16ff015b7b77ffd6fd7c0d81d9278545c1debd5544152908ea7ec7d5726f62c28e871c2c0ed6f4c2a2587f6b43b1a127aad55657cb0dea7f525816921016c2b1017f86408f4afecc7337eb675eb7fb5772a47ef7762cae7d83f516dbede95c4bcb5a84d8c531cbabfc961478d6b053858cfb1ebba8c533671dc22cfb4a2eb2926f71f237642c4019cc6a4c20c02ef7f170379792677f29a2b21b0fffa290dd44d56eb539c421e7982d0aa8081efe45a2caa6c78fb15cf7db112cd639f6251975d1707f2364ddf720cbb19b09f676bb008ecb5f723d04e0257355d0a6815ba5702416233aec8dfaa0f767d507cd787de7ec5d50a5617e1078523892a39100478061a8771dfe76df0c048eccd9f6cab98aeb0c86ebbc85eb6c85eb763b82e5d6c730cc39e75cbf73a1877d05613fc3b16cfe9551fb5a93167777df6dd2701b25c74c05be70296c985455559e6df2665b062e67337ea37d52b8169f397964e404477a32abb813d7ec012c04180830136024c04a809500230136026e1dac0633015663c274603a301a23603a8c80e930426986923434343314e601cc0358135813580e2c47472addbcaeea6b6c372f6951496b95989452caebabdfae5a7ffebb6c5cd55a4fa1f74563bb794929a59492565f795f34beeb8e5dbd5b94a9b72a35792c6895c18fd97b47dd594929a5a48e446545a994524ea794bec4beeb4b57555f2395b2aaa4dde8cbcaa39b177659164629c564fd79c57961b69dacd83563adb5d65a6badb5d65a6bbda4bc2896c177d9c31e342f29ad97d27a392d394198947f49ea48f40894528c524a2946e9152a29095532a3ae9b57472ae5064b15adaaaaaaaa4aca23482aa594544a4a29959256efc7c56949392dcbb268dd62bb79498c0989552f31ebb22ccba2d5b2aabfa494524a29a594524a2965a52fabeaaf786926d3b1f2af7d046b567ffd9c5736e32e7d57a447d5a2c8a7a192a71e849584e85b52fe55492a29e42b8968d20616300ebca0ae63be18d04dd077f41d7d37c550fb395e143e87a16e7f238a7bd72f9dfbbfec2665ad33d358be1657eec36b08f7f4fbf9557ae43ebec6307c23b5d34d5765af2f3054f84f254661728f50faddb3bcf7efbdf7de73777ffedebff7fcbdf7de7bef3d154cd77409b57b06ed9337d06cfa98fb67b443790f6fd8e0b74a5880bafdae0d978d30a7abcc0fe7dd24f9294204488ed7f88e233e3b3a3d1aa769921829120488e3e16a4e470ca9a1c231f8e9900784c92a1b4673fb6f6e0fbc3790c7dd2445737bee3343dd280f23ae5dfc857fe87726dfa4f678509b761eb7ff3ab9d3be4e749d7beceeec987aefc5f538fbb01f3349fd1e5219ba8888641d494fde8efb2023da683e20ce6d6823e9dbd9b1d9b1793b3b3b3f3fb4ff95ee262592fa92bc9d1c7007e471f9df917e793bf7fdf80fb4798f75c6e0036d28680373a00f22456445a408883ed30ebc68fc75458cc6e8fc2f34d44dde394ba8ab25978d95ebd25aff739121a38ae8c5db5102c768fa90c02dedd74fddea35a134fabaa7eacbf8be8b46e9d1cd49d0886bf1dfdefd488754ecd9f80b0c62c4912011d7d297b5ac4d658ddc7e908823c1222217df0ec7e87f3fb0887ccb6e2277dbb2c8bd7e6aec19fe32be7287a5013336429c29878f217de211c48dd0bc1e73058dacf9bf1d7f79bce2df2f9a5f91dbf4baad2e1a0f6d585cf1061a5f56728841130ef274fb19dadced5d35f05c96e2b28e1a76dc799da13aeb44cc5037d7e3e4462f0d789d955ef295a627fd5e7297d48b3891dbfd4e9eda0c9355ae2aea466ff7b34a6b73f603b9f1638fcb97794c776855ef7a7a513ff3ee73b71ebe8cfe8b4958c09dae12ef3d5bee59251cca56c1af647ce8a443f7ac5b16ea201526d351ec1b2065adbe699779c58b8b3f9367e6150f9969f053fcd453f0297e964f321406fd7c6de2e2253664b75aadc31cc5be2f19eaa9cc2f191f5aa338db28e476e8607695a1f23bf68e603fdf738ffb2d71a9d65a6b961e31f514f5eed453568359f5fcc8501d85357eeb2b7eed52ecfe335a094959168ab21ae6d78c868f427d44a1ac055c1b92e8cb364ba2af0596a0b9949f6649b819b69bca65cac687b2def8f546af2270a98de5f2e672d9bd76fc9ea33171d30547b802911719b97cf90a3d97ff0d31696ebbd26dbfff6ebdd250ef63ce646beed94a863a70771f7ab3ba3aa94e6bd731bc92504b5256d677c837f5b80ed19fdabed2d6ede3853b843f666aa7aed55bfd2890b28f6796805001a3c1b7dbdf0c27e3d8f966ce3de05c92eb3ef028e7d3ef5512c2528ebfb8230e733a07fab88eeff40bc491ae0373208ebb6c4139ff7721ccf195fe23fd02815416e6f890d63ac7775aeb9ae3ae035d27486fd007f7e5f408080751fde3d6686bce66af660a3eb9ed5ea894be63277e478fd0995ffc857aa7301cd4ed5fa55f446eb9badcf717e6674fba4b30e74b0662c65de7d5b726df7a8a9fbeb3801b425a25bead12ce2d4af5f2a9b732944a5236624fe1a373ada7ef29cf66e4f5970d42a31a102817bd320bb821dc7bca6d10f119453ef5558622a9c812ed0d485d1339c22a93a7a353f2fc233260835f44be327f3eb3880a6d0a777e16ee7c96f3374672671257061d978f5cd621c38d5f32f27d70d790a1fc77e5fcf94c854e74c8a0e36e313b313ddaea9da3f90be851fffc1a2e723fa93c992fae9b4ba8d4cbefb7d2faea6bcc17624eaa9eb0ca8c47e24f8784bfdce02f2c7ede90395ef16791adc8e0bfc93fcae4a9aceff54e614f65eeb18c06f58e7af7ce6e0e52af99887f12db0437360b6e64175f89d15da89f4ec576f24f74bca85181b2357f2799e59ed47722ae13bb517f837a8a7a475ccd94b2754e4c25264d03b29bac2776abf6ca286bee3a341a5a55ee08954b5522ae77560977a9c7dcd57c7c23ec57551475d3e2bbf88b2bf54afc7741a20bd25a7ccc065583fff13717e465c5c76f1d3b9a478f6ea80a453a35dadcf89b0f36be12a38f1b7f45d6005f898f658f92c19a3f911c1b1d9c214c243acb5726c387d6dcc27ed4ed75153fa20e92d37d377ed3c41dd4a918dffd5d5a731b0176f079f3b6c46d9aa6e91e3d72d03b97d69c8d406b51d2d0b34e196ceed6342e8811213d8a312251f2f14b4ea058f1a0a69971f7b214682dbeab41c25fa46f357e11feb2c2c68f4003a2e4e101750e3a9377a8d5143fa8b9d53f4ee55c8f5cfe1672321ae175baab9cab5c7c23186687b3a900bfc8f015f9727335576e8ec77537a5315cf91ba3e14af99b63222ba235f92ea3406b52860c29453268fcada8ea277388b28f110ce357fe11f2290a0afa27fdf25f7391cf3d922a57b25cf90e470acedda3469473b235c7d43d469951ee23b44f05ae45c6650099df7b197dd781fa7b7d9b3e17f137eae9f309dcf712c22dbbcf573027a5ce5d64f40b123427a217ee1d66d4a173563d5f54f73b66e798257c0799b6f6dc7940b9c46650b7775d52f87cc864951e3907847a225fbc8ac63265baa918e35fddce753bd7525296d67e173f3297a478a2fa8b2a8f0aec89baa95ce8fcfd8330fa7335badb57a378349ef32c542fbfb2663416832a2d6b553f5d70f595a43a421e1a7cf925bbf3da5b94f129ead95112f68b61f20645ed07670d77e9cc73ff86d45f4af9d7c7c771a167db0c5bcf977b7604bd96ed1fb81607e44278c95096b64603d17b2267c7954fbdac15f682ba3d49a385ef42c651f63926f0b3c99cdc1afc9ea0986d7f6311f1ddeb87f03e1cd13920ac78fa436e7fcccd4599f14f7eb629c6a68476b7dd1c8df4636c9c88b969ec9271d4ac3e94953cd50f3251b70464a2402607325d48ada46f51ee2dfad64c4b9a31156363b9351ccbc4de90efd4cfe818271cc97ab785ec66636eae7b4aad7b8b3a4a29b52ca5d4dd53f9cea2b8e80261f49ddd6cd077ffae292be626e6e6b6bb56340bcb5351bfc2869ea8db0ca47f839a945ae1e244d1fe4759092f6b0d912e9d7b489d738e7e9b626cdc53f46738cdb6181f77ab3ebb61fd12d7d17f72eb8fb17124fa1d8373b78ada62aaaf28ca6e3137b77a964fd1a72acabdf5d4539594d6bbcab977abb2f467748c4d282b7993cce4dbb4c2c65f5cf0f80a7cb9c2e642f82e78fcc585a856f82727dd73f21fc4fc3e39b128d89b3c250a72e1bb38f94ba5f115f822918b938bd3851fe3c4bb083dd1261d2f1afd374016ba0f551af8314e3852571be3847bea4d305e2cc6094772ced9ed0878036f2e683b02deccef7754e517e92b7054fd48fe88be9b81f35dac7beb9e3be3cff6e98971a24df39f9c1f73e3442f5a732f5a833004352b931965adce1b3add536e06decac638e15aa89fe132a2d4643d40c2cf8fc4bdce95725edddd25cf7a37f65ece69bd8bace4b1cc722f6af12e504276936c37d175bbf170dfcf19aafdb5fe2bf5e3096537b05fe236b3e0fed0877642ef9585bd117a4c0a47aaef8dc3638f83ddba5f5814bbfd1a5cd84d54450b2bb2dd6dfd6b36b7fefec2beb2696d53dae129622a954aa552a9a6a6a6a6a6c64d393939393939ed23a78374a97744a7d3e974baa1542a954a2c6a6a6a6a6a569ce4e4e4e4e498b0bc9894dc0ed535a5524d4d4d4d4d8d9b4ea69fa6691d5d6352522a954aa5504d4d4d4d4d75939bdc0412808c1257236d2a8ec8c7e714512a954aa5528daf744d4d4d4d8ddb713c454c3e202ac2939fb052a9542a5db400060815e12f10877d7e1ccd3b9d6a4aa552c9d9381ce7c3e5b820f49ddee99d66a9542a9564c0541729a396443b8ff34e4568dabf4854abf4a927d1d3f0e8c0b1fcc1d00e5249a01b7aa236cff51788e3f244b7a78cdbcce3ce1246bb3d8e05e2ba90070cd5f54f12c6405c97c15063ae03d0e6e9d10aa79186061be67b8e9dc839616250d4fe19238c9657006d2696835a513c273afc04c90a4f30d288b49720cbba91e8b786f15ba47eb3527ec3507e2bb9fcec46d66f2c567e7301339f8df01700fcdff02e5a3c00e6f7307f653e2aca54deca5afc84148e814722ab626158caa65816c5e688a2c57be07f48113d6852a6a84bc62d0b9ee01878a4f2ef238cdf6015f7a121e537b80694df2213a316bfc5266e0441b4b9cf721747ad96f51608f415c83d28ba0ce8ff85e8a452a9325f4a19d083e2a45252521ea5ba88107d8af520d0fc1bd657e8a7536bef678c2a3f9f129d54aa6913342dcacfb72e22440fb24a00617dfd99f9a9479b9f2cbb81ec5bd445df75c9cc0b0887c39a735ad32d2b7369cdd25032e6f92919b3a66d31773e8c8c79fe146532589b5f80f9a01765325a9bef436b53caf943e0e9c124745a737e75c95813f4ef82ecb6048c6c73170628e5e129f2e8d1fca772838a8aca83b214ebd21ac8ca68edf1a3cf3a5508d9e9d1631f9e1e6d2c44ba488f64852618195f9a9db456bd4a96848362e56b36e3aec80a6184bfc81b5cf8b8a8c58ab5b627ca1c6ba0f95426294a564f589bbf92897865fee4079201f5f5f12307880e9a1c3834346138512089039cb34883727877c9e8f0351c29e5df3320081ec15839e9e1449e9c3c8c14d9c30a0804650a0fd60efff77ffecfb5feefac214dd3341e78786d0718307e468f52686872e89030a46dcb827ecee81982292a3fa91e3d82f1ef291ffdb2f2efa54aca4ad639bdf27e87ac83082981fe7d4ae6ee2c81af0346bc0f3c18ace0d13c0e3c9a9497b2d694df447787b7c3a7380dc3e40059fb443c08f459efdc243d9234397a64b94ae7b4f67e8719290ffaf7d324c552292a0ceee1650500bf55235806d6dea3f117005878065e79ff6c096c7a881fa859b16db8ef9d5ccbfbad211938c6fb0d9ef8aff5a887c041324e207b03f4d9dff01f47724219a63c8c77c36fbde36836d0da7b9965e024528137c51af152fe552ebec54f8b8aa0e8532c3c41130a8a49c68cbb6f635a7b8f433699e90922813f30499b744987faa5860ed9cba1c3af7902d99d1ceca38127dea18168f879109e2012f84355c7e1dd0d9e5abc4773c37b16d94657649be8fd49960425c35f58402c35fc45d6ba13061305a34956e0a75ea8b626e99346288a4a2a4c9ecc0de56563e5ce68cd7bf4e8a5f1bfa1bb480cf1bea3a8356ffb82b20b90ffa3b22aab6a9b9fba758fd83d1866060ce3de7fbc86ffe0bf2844031ed03b28e60eeb876d386e8d23f5c87dcfd2daaba1895ad42dba8fb21a35c30ccfc1c2745ffdf9f3a7a55afd25fe73ee1597b2569148632bdd25c7e87e439cbbfc660cd0803ec3330cc3a61b81d6de3fc071bc26e4e36f1c0fbf64aac7865037ee714f0385892031d32e47ff7b4f3a1d936ee1117900bbc87e96f71acbb3331cc3bdcb91c1748c65060331afd22fa0f7c93c3e337280de03ff03c8468161ef180618a66f9cfe22c301c75f6af88abfac55f4afe15c8f31c619edd6a747fbe81fd3005304f131678cb4868ba6b977f7d871aec89dfd031342f7e891fc487d0f1fadc59719f5d37a6a3bc2e5c2fee17a50f2abec5d8cc2ec0df8548f59d5235c6efc7a05b1c20650b041fb68cddf65035e43549bdb66dcbd71e3414cb67651be288afea0d13f665c8fd6bc0db7b3c031bc6715f53da494aff7def78fac7fb4e6f0bdfb4a5a1bef1da4715651dd4f8fee69cd5fda47860c17174dfbefd1e3fab70949958dd323ef97a1340dbe499a86fd3b878eb671cde3fa7b2e02143c7c2e77e37cfca54d740bd5875d11d7e3ef8ec65fca5adddbe42d1d039ac655c68c23661cc95de6e70b761678c5df0bd7c750d1709d6d9b684ffde7b471e8c26415fa53df3b25a5fbcb6ef55e57137552d5fb25b3d10b452fac69b21a040281404f51a0ea715c296b0692d6cff013abca625314c56f04935532d0a32712b148a46355dca37e17a127de75d7a3ae20aa680d017f46bbb7e19ea9fb26452d192874fc0ff36106c5ec871710fd019c67a8e4cd557549ebd8cc08000050008314000030100807c482a1602c1424ecb21d14000d8da44e6c549c674990e328c390410618000c0000000000800191290101fb8b3414fdaed73ee3d4d4ab288eb2cefbe362bdc168a89e3de3a2c265cb32c6cca6a8185511ca7a52961d256c4a9c4558410e7a20c79a4dd9126135ffc9c6c63c8b98386594b25dada14efaae54f99fe809ec84c7e20ce69103368cb022628a39320ab1cbf7892778626e3d6010340b4cbd094f9ae029f0b5d58d350b3982a552e4fb84266422e099f1f7a72c67ac32ca7b83246d5e6e339d6a4f89ef9dff6c013130f44c9f6477722bc96fbb1d93b90443983d0466280d6d9bd459d0c412dcd765cfa9e70c6195c61e05847602caf5eaec772be2cc2258f08f97fa67c8d1543d8cddf06011098d2b91570af94dcc844f02f6128f3c48f3082b22a0c895239733184861d77b0a399efff67fec3f3e2d059efaa0a7405cf6dd02da839f16cc145c31104b8c3781bc343a8da024692146904754c882234e826e7fd1661977ebe5fe20ac47f50f699f6461a50999e38f8cefc2dda1b880ba656be84e19549034d078686dec5d3404ce8df8286615de70ce523fd01f1ce1297597bccccf10648607a002e2358fb08a9013a24083c1bb1ac49a2457a018958d5149cc080349fc85fecc4679e14278c66c0f828bf0b725a994febd487a1a209ecc28473d79143d94a21ed78aa220f767aca75746f4491616ca3e9379b930d66d60b58a517d772232e7e92a5f702ad9720f9b62aec822302795b56bc211df49104b7e4c78e22672af6f7f14655804c42c37fdc750fdecf10362a220ae8c983d3dd9b36e1308783af04e84a40d51933f3c346e38e1ac4ee1c6c423cb1600d9198c133182a2e3a62f0599bcf2117fba3ecd6102498c3b00b8b816031e60423c7d2d212bf425618c60289ac1adc34a312aaf40c0784d0fbba01da4bb6aed387b2d1ebf8a8e8dd2ea1abd911a7f79eb18e72c63258b348ee573ef43cf1581995817e828f5953a10e5978e45208bc096d1d9530096c51e030e5392780b24317492cbc2035ea2982372c2b4dad6f0815a80125649d07072efbe5fd83b3cb032c8e5b7536905c15cfe1dfea6f66711531241bb93c8d7f7b7b3a5e5d16a799cf8e24e644059e11c0ea121659e28dd5dd0ec3a7e6def96bc6f25c09135942eef52e6e1990579626f2ca77f478f08971aabc4205647e676479e196167b24997e7d231c43499b429c9192b8e1c938b3dce5c629f7011a7a3d9019f76e0942f933f400ce75813465dc1b1002b2e60420a849fafc260822f27a3d8b1d414c6a7c056bb1d129faeeab8af03f891793ff219d69f40c95438370b20ffc3eea109f82eef05ffe6f74a2417cc12f66dc05502840e3e4de94c4141194bf049ed9d60c8f65afdd0c0b25abb04245f0e9bafa674a6e68b0c3fb0ef4e3132d0b0825a9a9046a2fa1488bf5d28cde0343cca735593674b002d7a7c97c6bafb4a9f3a1849689a40b4388dcacb14a9f1adb38939f370758e5a42d278ff90090a5e5e867217fc8d1e49904dc3a14274e207b8fdb658e21aca4abbb0cf9cc76574b58c69a3a5ab0e7ca2e88f29955e97b84f7ea669362015ef06da82cbf1936287e7d3568eaa22e870a19cf68feaf0b911353e561293ed6bf95c8cf8d5dd5e1f2052a47c21212c7b2efcc6e5a06d82921729d8bb29e7dd22a515cedbd010f539afd9f4a4cad90a0eba7e79b5cf50cf94491315dc78c91ae6586d8ae21d013c43fa5bdb2b191497fab811ca0a045f8a5ab1099e184c7871446a6a383d843f2a2cbe52b4338443da1c99af845c40bfed35b24c50e166ec236d3a275f385ffcb14f266dd6eec7c0b4df0f063e186bb66290e1d2273392ffc4f433064066336c9a2a523858b9883870e66568b2bc34797d1335b69d6fb3e6a6a3cb65db094c277dc7e54e0197b4fc866d5af673622f5b49fbfb49c38854063320e7a1e2f65d028e2bac295edc766c280527d4e45f867da45d4e784859a7b401007fa9d018b9388c5a8faef88f4ccbf50ffaabdb08ee39cefa73eeb950367c90a3942b118c0c070acd513742ce8028a33b6c50b0063f72bae6545de03fba5e4c5f47eb56a6ae590b625401387ef8bf619ce327abb3d629dc7cf6bfb578fc08b9fcd1a80130a99137143b963f4ddbdc331d9ea6ad549e89e44a38e5f86120de0ba5fd07b8df07a50821732cdcb94640dfa9bdc06a8fa91447e25800c7ccb919865fa01f5d4aea03e88f4eb573ce6ed4aa51be84037c8f7120db7fdf7f7e5ff5af5a9e382652bd1d8c9bce33de4f62204c5c1b91838dc9396da9247e04f8fb1be919a3090a8deca2d881ef1956af63e2427e361eb6f591a71f0cefad9cc4a78be36e217c802bc60d39811b9ec0aae73265fc12cf5ce02d9f344ae4d485f591503ea278cd25e747ad395288b2ffa3149cf0a8a0f2b20a4ed3832d0182b529fd055397ff7be1c242a9e54606ca6a9221cb06070e6a585baa110511f69f4089f0f40a9b4fbdcad30529be0fec76abc1e1909c4e1e9cd676cb6a0dcecd63559f98fe9bcacfed424524e9b907c8a6307a773040658343125caadc0e49f5f614b50b35d94104a3003f45fcf84d97bdc5df7e10a500e09ecb280e2f65c299c77e95bedf588a7e3b665cabe4190007588a8d07a20f6a12b2aef07e05c55c7ddbc6e61237c03c0960c035d8c4b670fc70b23f0c0604b60641d5241ba29817c849cefe4d85f2beda33fd374fd958332d5dfb91575be540b7f8695c38fbbf87ff8cfd5057e8b3be8398c0b34975f58c218178f66eb101bcfe3d639dabb171136feeb08e15986a03f9b5c281e890f2b278c632180ddd81d1f8a3073507a8a6736ab2004a32345aa33fb1e7f2f6a1a7148d0f84df038189f66880da0cebb4b33266cd85d692d3046fd137e41c07e07627f8e33c35c3d50bc6ce2016194e45e4dafe31e780dc8611fbc9b7cf0e89e114df0c72e3207746a60669bbf29e7fe4d4389ebe2384ffd15f83f6d1a0255378ad0f8adac38f21c8acd0c6b9eabad798f07d70bf7a3b774266ecceaaff11dd0244547132a6eee4ecae90a3fcc90aa187147116725274ca05bd02330d2448243f45c394982e5e1780969c5804ee531e16982fb7186b8f0bc0b414e22097942688274191f78e598da97bb5b20763b74d3ffe9a187df446d1a44fa1fa0c2bb1b1d60c84e4440267715ccce6fef1bfb2f4e59dc7d964ac78cb4c537a230d0706131f8cad9a253b317f4302b1be4323c5f3815a78181a5ebdf4234073f3678f46fc8828fb76697225a537d0c9cb9b6f9b8699acbbde888cf8efb8dfc8cc7e1e2613cb126a00346b078c235f7d7faaddc86e4a6f6623335b2abd997d4da389414698c79dcc0c89ed95852b41cc666ad0515cec8ef1a3c235a178379e4c8d2e53d75e26732d40d046754971095677e4d8802cbd593033143d7db3bba0830321b17f1ad8069d7a8333f711e9cd9ee1cc45e4d41b8b30c468c7ca2ec0ba6bed98980b68322bc8ba654037a8603150439f6fdcdbcecf7874d9dc673beb2a303ca883b44c5d29d412bd53e01bd74571e1c9d03dbd42c80f96826dfa8ffc343ad98a3f5666d54db6c0c560f30612cf80f8d4e1e6534879eb2631357e70f2e5c82e86f81e71d08e09455401863eb2bc9885d1d3e542ff9d8323626c1c6747cbef584a86120e14f45efcc859bb30301236b5f9e887a86e4899208f20f918591cece122ed16f203cf5915a2c9169745205d15f60cd17a2c1830ce3b8c6bad50de34e596e6d1488a66a4b35586f94b9824316451565b2e7d60b27a3b8848f3bf12828b46ea54dcf06ef8f48173d6cdba9967356d725730597cc6e0ccc88457c5fa5537b260de3c5999ef648c081500e06a699cf639caaf721f0d38c7898fb09537b4e03979ebbc8284c89cede42d5dc2ae62aefcf2b75418683679d421ed800e0d62d2a68ea4a46fe0a1e95380624ba0202028af7f44a58f07b68f377f7bd4698e06f6ed604180b789a82e5461a6df3d823230f984353672ebb821892835805f5950631464102904aaa016519148eb4b08c7ef997e700a4bcf8d5b55dc82e3653f6a35c4ae18b19d9cc452fd1b4d0ab8eddd3c657956afe2e70c258a28a336fefe7ae9fbff449703e22039910837aa574c0e5281875d06011fefa491c9fbc3f9df6dbc8c6eae5e696439d8bc7f643652706767cea3fbf733cad7d283bcba4091d3f70a1deb9dd0f0741bbcb6187672a5b4bf8ce982addf5099c6dc6854da6ff661f53edbb55cc7b3d94282f8592d2dfd65c37c3bc09b2d761e850e6ef4135b34af9f97baad521d89d224c0f30ef7b0b6f1a5eeb0982f200d0bce743f08cbb84acd04d28189769eb9ee9fd39ae42640b33fd57757e11e38ba8982d4a72282c5aba4c3881dc8b6b680438ad67d0015d5f49014953f903858e786d85175a7487665c5e53439fb07b9500e30d8016d7bb02a67a866ac1eb380557909d5c34b204832211a65e1fe58c37d154b3bc24735ccbf4f8506eea0c4ab02d6f0528c3850b82ba92b8077c431c412e1a027b3896d359cf823fab83b9661b78a1697991152223de42c1bfec1a1563f23d7b966dc3fd4a0547f1e6f656b13f01d7446868a8dee811deb0e836ad5dc532fb2888729741a10ef98eb40b1161c49c392db62e099ab7f6d95eb15e0e250844559278f05d48e387aefd8124c232cba1ff8aaf1a83d152651fb747bf6808e130b5b2ef21b0de4ca0d66e06419f59b4a83f8094ad2d2a3350b99873c6d7aed76bbbd8428c10441bf1b070a0821991125eee994a744a385cb6160173646282e647f5f6ce713b6731ae000f067a8497752866051bc700058df9c910fbb95eec35290c873b79fc08d47be3217d27b7aeca9f197851d14d0ac35f4df1d1ba2cb0e8459d7f0c68ee6fd19966903d4a16ae3c0d8156fb95a089d0b71572fbb5405a9465e6e298dbb05f00f591ea2eeed434cad09573d189df6a532aff85d9f42ac654531dc661af83031dd17bffb6cd3d1c5af79ccbfd318be20adb9b9968a86c24083367ca6b0294eb6f8d097de353401e08a361a12e56e286ccb56a76c1d26f136d97e398486cfed53ce42edd3bf2b8be810117014b0c61f7a5bed1f7625c28ce982dbef0d8b98dbd91ef5452b1808c3eb6a7ae39203183a4ef1424d2c21089151d093685bfd1332bff02ed653a8d4a65bb944638e43a8d03508c47d0583f2bf1d3c38bbb896f19a0903030f9b0de779c32182f86e37419e148d278a3bafe4fd980c127923397f2edd7951ce3e9cd911ffaf35d038eb2871fb6e2a9946fee4dc4db1659ffadcdef4db0265304ffc78334be5d9c16f89184026142d6cef2c507920f2d014798688d627e918749628616a2850122c63f0780267580e7f880a6145f60317471219cba1daadd8f614a678055fd3d4ecb88e37eee1ce52ec14264bf4b4f9e64a7adf14fd92be919c85cb219f42c6b23f8e5644794e80e7b0f3186f1f42a0c81388d7afa760b70a4b80621e49ee38f8226c89494fd5474b93799053c3c5970ad2ab056d524081ebce887f5ce9f946da1b084ddf7da17603efb0ee7407c12461dad18131837d23f590ff12a2c006ab4c44746851b956c7ec67252d61306d224d6010251eb7968cd8d90c4b1d7dce7af10adeb19638f5d466ecccabc6261b71c97a31d55036c01c6537e4a1056662b05ddb4d0e8b9a73c78a014ae8aa7ad253664fdbf1d2fb66086d9109ae75ff42d2d782be3b3703c6d99fe63120b909f120401a6ba80c1782e2360419b93e550e3cc0e9d2b541605f0dd2cc6d092fe7a7f093e0919269b25b7b40860dd7f432882eb05bc2302727ea2823c1455dd50fb8a350bec8b30edfc5f4632272bf5d070e5972bbf89b835fd0a2769e72778e02929b31ecfd680dbe671c3a502c5c538a19fdc2caf244c5f5e11f6982d84612fed32d20a99208c9d184236dfb34aeb7b0c56d1cf2047ebcb51167bd0f5ddd68968bc37b645322d68f4ccad610a9e7289d8d6f4ef3ec8840a8bace447f7f2b484718c20303d14102ad2b621c77b4f1db4b8503ff9e308f3e2cfa7c90aa5fccab7d5131d78280cf022430dca2a74d71e8f4223e8f01f17a49b05a658b266315389663d31d406676c37858d1b21f6314e8f94e9879053dafd17da070d20330116a21daf8c733cc4b229fa3520f9e99d9b07ac59c96dc5fe46704a437336c6dabe1f4040bda6785eaf935fc88ad300f2053fc89b06c2cb436ced8c7e00256535e422243dc63998acdd34392f037d2ee6a00cb42277a40b605d0b95dc1573289f8e0f26ad2013ad772064856a38139ce068a289b57058df023b0687515f2496286bbcdf8aaec7d174d3c0aec8295cb28dffbbbaff681e0246d542e2a92c026a75de723c0b61782407d0d4b81912c0eac787d8941d858cd12fbd37ef8128278980ca9b71282d0ff42109d95e150bfa1959145beab980b56803f6a276ad578cefdee7686cc9d53b4b507680be13046ed42312a8cf1dbf4a56aab6aebeecf3a2a6c7ffc6120e21b772fde7d8aa0300aadfaee075f9357b908a36804bc1fde7dfa3be0b02bcc8df83e0a197a88b510edc12d9edf06f6ad51d5948146cebdbf0934cb23d5711b85455b7e1246be7b52071f2c338264a82e684856423d91ec8a8f96124187fcb4114863e1f52f86aae077e2a3079309eab74d011681266b0940d5664aa6ef3f22147ed46ea5c9dd580934b6ec7ea0e935a6ef7b7fbfa8585fca47bc2872f99becf0894507592a800499e229cd1acc3a6dd136c92d8b1f351a7f3af6578bae4fafe7f7f2d4ee63bb0fd6dcfce32ac8eee1376f0dc70983fdc6ca84af775b38e46b7416b72c38a8d68896cd0753a55eaf697d9cba3b2a99022205925d80fb6389f339d2bb862362ddbfa42b46b92aa86013d84f481f761b3e365bc784a010fbe5ff8237a485343c6c022aa7c64a12dc1e47a0f399a5356661e8286616ea2e838137ede10691c9916ba8501e32654cfe5b7aa0d80063402858fb3141d994bb9c09f8d4b3c65d81d805521d64817d8847dfc58368d26512f6c31cddfe1781b82147156286128e57166162189b06a5afd01f2d0583798ea6a70813437e4ce9df167955e0451e50c9b230b30aac300e32954a183cf881045fe83a62447573d622ce0e2bd511a429b239a4ecec577fba107565a5845f4479bf50193cf5bd404884d28af9a0cd5f533fc436c89440743a3360003b84b519c22df01841eb434f28f1ec1e499407e16a328769d992cdd3c53feba9e419340023d8f938c3fea19cf27bb40079b00b0f0986f02fc29f93296b480f11aa8166f85ffd9cbcd9060f9725a52aa920be4512f8eb4f69c8dde1b32e86bbc11181242831ab59fb34a0d74f87cecbbcdaf4b5caef5889be90dfdc9acaa543b6bf74d1d852fe7f9cedb043a1428c73480e5314f2bf3eeb50c1ce597905a72d81340fa25f92eaaade5e63ba5f08aa433b2bfeb64cb96216a910aeca7a0e65aeb0d24d5f40fbb1e18431942b89be90207a8cfbf8df66277b5867cb3b2f9f5682002c580b3ad2d87e23f4f5473006dea537ce47e099a6c93ba5aca667ae30ee773472f2e3c35684b9e47457f32a3122effd2bf848bf5b13eb337d80ba154c1653c606c41db6a49f250156d2e8a5f9951434c59ed4e2d52538eece61e0511509542f1198b93acd6297978dca0440ff1838e4819173a128a91e86500a8e036841597b768149e42f99c750709907bb09b11deae7eccaa2ca082c2926c87b3de44ac9a26dbce94b0e52f398b228f0b0cb0029bd3eec30809112e376f4abb47ff14ebeabbafd2cdb67c0354a3041ca22a0c9bbc555ee46bbec1b4d7109c9e19a8bcb4cdf7a5910118035a3188f062fbb4335f21e8565a64655f0ef15c784de6231ff45e0c57f11a7470fae57ea42539194cb1749690e492d43e975a7238d2d5cbacafea271e50617e8e0b1868ec3278595d93e0a5efd22502f33820db4665153cfebcb9201618bb95c7131e6b6300f98cc377e74978d24d1cf0f3b0ce7d7040bdc65a39c84d90a4bac5a6116d4d66b53f5378a16ef20c5388014660e64950e6e4aba43fd32ea476f84f285126c3d8a26d8055678bc8aae3b9c5d135ed7f2a45ccb02c7d552a8fef985db579230a7113325266e3db83b86d03f38f50caa21e5573c37af046b94d001176fc378451c22d8853d73036e2d0a747143dd8f3c57d1955daf38da5c0056b8ccb774aa154d2f546d403f4bafa8bcbe4254b93de239e76380683f70e54f28f3a4235bfd9f448ae970595341af789aed15bf756345f648dfbce6317b30c8996c7e76b317ac0b6d25426f6ed5dab573bd0c6c0abdf8d58ed3c8b810808264d0087833a46b7d5b4b5f1b76a445f7d2d7d2deb6f122f532e2df5fc7ebcc935c298033a16d660e271f3f46a1591386165849e866b290057c061a1fd7d629bb6adfaacc80f7f2e19e5567ef517ea36e39d61a3e0d95582d92afd3c878be421180b1a03844edb892100a26f876fc96464ae32126f59098fe3f9af5d4c0a0a3c3be47b340572755bdb0de949145a1d151aeb630d75f134513164f9a7d8da19bf102a3bfd9c27eea243a3c1cec4abd0aa5b8b5a7c6c66020def89aafdf893536b65f5d3754bb3d6a348b16735d647e8c13d3f739ead6acf16d5636e853cdb757b9ccff580770ccff18f428497d27d10effe3040e4e40c50ba49ac8fc468b9c7bae171a6b1e03002abe301f94285ec0b8382af6153939b08d548c141f993c6920313b26b0ed03affb9ffc9fe3bf46eed056dd94afb15f40a3810b7c2f7da13df2c7cc392e68c2d3dee9ec3d80e01d91051e7b5da520db95b5e03aef41078463dd8100b5308ab980b95789e9acd2faafee6db485aef61c3e9c7b7d18b8e0c37024147aca4f29552a3c57191179ec95d19cdee973d994b8cc3305b89ef3c655db3f5082d6299cd283d074d88821ad7307d7345aa37bb95fa7d003acd9b2c2df5689eb66b8bff2e91cf321910d0892f91fe17cef170369293c331f17e9e11c6a999fa04a2158d0ee608b243294a24291323fcb7a6db4d61c683fbf579c2e75db61470235282d05dfdd92a7500312c62c5590e20ccacb568c57330db1b80f25ca67062bf4eebd0383d7a8baeab20550024bc566f61f8364e0867c0807cc0b3f45b9cc56cb8781860f637e26285fc258e94a801c8945675bb88cceb463c4ee571a9646f0cacc2ade02f56798265525a5fa08640637a8ecbdd33154c812311e0e88fae501c1147d5edf17513204b4267bb76a8517ea15de32b26e0275e9ad14ab9fced5120966c631a7612962d2da42d09f503820a6d7f933da5b28496c097c999cf2c4e182b56652e5fb51b927f422370b2cd2656ec77345e936f28724897d7f027672ba8ce852a3e92b6458d3e5d96a3a308cbe4a381770a0f3270bdfc247bdab4d19239641b6789cf974a43f4bf64dcba248f67e25fa36b3850ca8d1244bd8283a99722cbbaa4b488a97de7cea7b75cf946d7259e8e81ba195668cae584e4df643e62a3151a9ffa7f322d92cd66a426214e0cdf148a37b89ffeab52956d089ec6725ddd6932eb3129ec885a3344c0ff0121ae2ab3aa54b796a7dff551e10cb1d57ba43804d74c412db52f7d6124d372797b854a6908dd12046b79a12414f4bed1aad9611c09e07515349c9f5f5d53a7fb71dfe0738841e72f1b79a32850016f2df3462ca1a80e65d71ac72ceca554b2913807273352748b9904356419299234068ad2f8b55df4e4f9ccb13c0a36a6fb47166757bd0a76d6c616ef802d1d6a58e19e6871fa2894d726ffc37323d968bf0321e73c3f08b1d450c14260950fea701515daeb0d3725f336d80e63abc886e723eb989776a4204e562a31948828916428a5aa344a9ca5bebc6064889c152f25c1033ce4c645ef3d99b0448994a68d539a5b4c5d29947684e1b02b557a6cdb0171d13703ccd4f0bf66455a54ca1ea776a0d0f693098789e820cca7570b8dde09091231bf9e17385541656adad0695597197125ddcf4927063af66a17835639978fe5863846c8f170b0a29a8c43f45b433ff3aba39d496607439f595a2457bc711d655d76edeb58f53dc3fc58813c3d08808a506506abe0d042a74455d76630f8ab6adf067bf36ee8b568264c08c6d400b194c3484083c0cfc847840b5df4b0fcaee671408315bd696a0acb302d50ecb78709569490f2783eb1e549345a5f79a665ac0f608b66fa792bad37b5936cf813134aa27ecea8bac8076acf28a98dc602c476ce40f4055ebf67131c1008e6fb867d35d70bcc8c63cefda53d742aab3b5878af104f8bff6c67615dd26044f706780e6bb9866cfa48cf9c1364933ed0622a42938594e651054a0199b6acd3e3964ef2fc07e2a7b0a1a9dd33a83e3d84463e817e0f5a4535e1374cd963eac3a5c2b3eda88057b8a6c484c3dcb3165fc069703046f8f5c80560e0e2aae75fff75d24606748f280a84fc1e3d3d951c2548f6248cb22353ba6cd69e1efc891812821f4cbf26c5bd94c07b0ab565e8a26aed8f57e40b4bf49ad4b2b4c2cc9666ee565011b733f04f7f4f561f4c3e523955861c47a71681a9ac5fb527d385fb432a99c53991fa9b57b24ba6e1068d5d4a92e20cb116d21e79d03cfd9ea645fc08251eb994f1a65d647748b0c0b7fa13b6ca01611528741702d0134645904cbc81f74db06fe871b5c4b3873d6b510e60af9f5c5e79b3c9d552f202eee5d98b1a71fd39e58d40d48d190307d12e000578f8109e1b5002076744bd003f0cc12e4430e29e71e4d0206a8b3a79e3100f05367d448f026b45358d8452335b0f9e84f816c0a302d2c08282b644ea9846a06b89b8861269c9de56add7cd99ff55e43662a750f830b16008053f4ea3453a574ba16f661d18a2a33542ff150aa4328a92680e680e7a905536380ee8a050dae9f9f26352cb9c80557c9afdff534cbc1933bbb6bf3688f098b91c3152268afdb26a254fa331c29f06f9ae3923070c2b472e04c889cd8348b577615646b9544b82aece47319c1300f41c5c77807ed1104402eb4eec2ad2c6b55bd5c8b5968d57a8ac95086471ec551f216b41c2bf950562167ed3e199db956891130528a5272514360c25ab752d582737780caebcf6d0d0d3036b05921772c3261c83ad20fdccd2515df2fb52ab908a78f473d9ad307c03d67998774e9f756da8c4c3be4777825e4611a41670abe1a80507a908ca36642fca977929dab0ccfa3ebad4e58d62045752a9584d2b7efadd9a9eac533bcff360e929583deebeb89745c7697003ac6f02db76bd995c87f18e27b9a505f918cc3dc80c63328f6aecaef03fc218141e287868f3e2e6b64d15a330cff83a5834ec144a01d07bb8143b3baa772bdc66323e0f1fc2db7dd51690ff7304133d78ef7b7514436560d7e14f462e7143a39af450f6fb3aae1ab6f5d9b15cdc2bd46c4fe1573b47590a9a9f7141589c50b9a83676fb1b3615d211eea9888c8869d6a3f9537876ae0c57deb72b0206ca154808f6c8fb7540e297558f146925e42948b0e06905928baf7ea1faa38793e6a69324872c172b14bc7698746eb196ed354e6fe2d8fae6763f6888e6e360a062a95b7e5bd7c2f45a2b91220301c14b6862035e93392ca1a4961c7edf0ad2c329ece25d40efddd77a54bcd28fe4592676080b22050265d046e602e5979404d9a7667a1540b0293358d58e72e3a5b3c859f1f46f16904286abc54b91d0077ffe17e99b8b68ad0b91621933a91d9cbaa67996d83578ca3909d6eff90f86a98a4d8c235cbbaaa03390b6b1e2158028c1774ac2b48668da2d73c8e4df1d3ce31b537602806090a38be2fa20e62853ab73b47720433230243c943802025b62829857e523eda3f4ab550dd5ef522facd70a784faf693c51abc4dfbb05887593fa2f37711919110d2e9d54d80cc1f04abf77c788e145b20d361f6c7f3fc8ed92adf726c8051533680cafc7ce13917b034b775fe4a7ef8564543e44e2923cd5a3ac212e003f5bc57b56904b7e248ea3f9a01c70d84cd7fc28f5ec9f9818e9a3cc0bbdf621a24e0812c706dd5b4aa25de91929f94ebc1c4d1a04a9b49a4fbcdde1b7a21281e951bdf3c7744b0180255ceb2efd1ec34af6ca9c3dead4569fa58ad06e4d9a6f1a2a348fb332c18cae3c45df170f805f68e981317fc3e1ee52cf4fa150bea17e9ef15d95e8e3c69cf5c069d38b0e0dfdabad7a897d3d6e20b7553abef72039bd0a38fa30bf003248f012643cc36805d84f00b83d8967adc28ee04695a811c7d223057ee7756acb9ab597e518e099cbdb5f28656334036ea79485311293bd013efe2c17951b2ada4007a8c81d94cdd7df5c0e5570b7a5a6a1b18856f9dfb94e97411fb609f1f4c1264ab85a4180af3d9d48366c8282142f2ca16f1f88f615a89d98be40ea9ec4a1b86ce86b1221fadb20d55299fa534013595e8350b48d41816012b51339699d728511f88cd12814680a9bf4e825af34f9c3e48a0f7893c5f933e840cb69a329e9d7174f8711d4d42dd905b1688368661cdc7d937d715f60b659872786913fe5def0d7f7577702e6c35caac8227bea70efa1b940a5be5504504387aa3afd304b65b6a81e6a3b08784a56ea2aabb529bb108482f4c8a6708de903f1361c65df4b17b711d8cc2bc3d73f9f77861b03ddfc4c86c0a03fef65ccb214be7f63f4ed34b76b19ff735c51e85e9940e5bc8727997dcce70326522182547bd7992547bdcbcf4460b1f64951c9b1597d5823c7ba377026367b3be69d9313fcbaeca5c2c8fa6c903809ca62d49c9edc6a81d1cf2afa95e4312ae90bbb00637a17161d12a0d0a06ffaeb1c6fd8a816438901105403f0b8d780cd060d7e2382a8145858134adeaed83e8469fc396b5ae1b9feb43ad6139fe41f40107e57d4c6f50b0791c5428a4d00e084e279f067d14d90eaa20ff2926fc0a8f3a2274dc538da51b391c437dd9352a5b40535224903d0fa54e7e8e087bb7780da1986962c79b4bd4a8eb959c5546ae540e8f8aa45424d089888b473e1cd17c7b9c208c5d44f31f5716176f83c9083598e2da3ba0a711b07dbafc14a5265dbe1a08fda0d82710a06033f78bef2f5d9fa168bd906085ba67d5be4ef6a24a7fe6b6934d7b7d4e222869b9a811720078eea98608fd1e6c3e17a96ef0126ecb777c5cbaed4cc24ded9df411feeac49cb76c5f171546cb2f73ded21405c4fa889243db7e9cd243b144381c86d09ce36b8f7f74971757f89d47d7fb3b6e0007b726015ffeb7ea9ac2b5fc77bcfb37a314d4c4707723594a68a1e5800ee0d438fa68554d24656d20642b5b2abf7349f76e116303a15d58b227972568fbc4102dc4057bdbdd3a7d6da706035a369525e7aa606317782baaf23b2b8f70ae524c78b9bab14a676ff152672ba2843c2d392496076b2de9caf3c69c9502f2261fb66493907a61604bc221a8959cac30b9327910382b6b3e42fc5d1120329d7e06578c2e3ad51b3607e7cc708e3a62b63a30cf94a18eaf9a7186a14b88bd25a118a1d5bc0977a3237a24ff2f29164db9e68c8320a6d94f11532fbab86e9495576a9deb164a6360ac6f1cb7a6e00bbe72779a26dcaf054578cdd0e8d3e3bdd6b9980e76c25522fdbeb1c8f01d28230c943d833928b072b5a14201550f4a8228bfe158e32616c25ddb8753eec876fe8bea58dad6ad61088bc8eac534a6d8c1fea1c8fc4480a5d1501b212b71107cbaeb47e6279369cb0e26184aba6ef399cda65618c1cc94072a6b5234eb1304e7078e02ee04ff5fb6c6f5906f6b939353d1272a9600d4b1c106eac41accd8b239a50e8ea826bc0ccd8cea6c7650604003352b614453ed4fb8cc5613a5395448fbb0533aca30110f3c3157b1918c842d4dd01335d46d6608acf77215d18d3df2e0b4186cc85601001686d718bc9080decc3b472c5a7020fce7d9c4e8844e1953a29bbb32ff65c2b89fd98721026464c0c1f10733a1840dda4f5a980f993cbb565e8040656c8bad76194116417ea3b047854550c1ef9c3b695113408bda79e7ff876bcb8c97bb1f2cd4f5a61862b5a67eaa1b2c59abd66a7ae8a716b1701f420c0090e0cecaa6e68b6242ca3f687ab0a91afd66413210da70dbf55d480547680b435e1a56aa8c042f4b82b0b00180cb7ad89a05130c24ffba3abde7851a453b992f8c09e3d39bc8fa2a519caa37bb3d6285b05434a9cc3e28b453e43b47a75860ac0918fbdd1950f23f0da221b1824163c21946264e5b45cda81030058c756b55354eedcd2fa53a46bc3c093bedaafd8672086c23cdcb9a60c4660b6e5c009753ab50d06e6aa1c1eda7bbf2dd548479a1258cdddebe01967f853dba6c7d8a53cec898f296c4fbb0d8637fa0bf094b67f3fc973cea53bcd27000d928481dc39230309d5b73b965175e316a8c9e0b3c04ac31e56f9c597c581f8adaa91c8d8a7966acb02c566a6350c23f8a10ceb8c64fbe5fbf850ad0e0399d865400697a9d8890e3a3db8202900672d218eb92baff9638273dc6b04f62edb60e29e5ce16c118c5865edfdaa802a2386be3a9e18de19a4dcccb74085a12b533d7cb390384881d2b29ad749c0f9a17691b0d51fca61de2c611a140bb2d51bdd225d8f8fa9942c3e2a3ea07ea4a77f2545f80ca24e50ccdbc965f3e6ebfaed95c3d288992879e18156e03676e6c984a69680dcaa1c2367ae403a89ea1aefc123a49cc8297b8aab4712dbabb38452b7c3b26f1dd9686e6ba6750ef3a4d0ff794a39af30965524f72980fe601b9fe7e31b7416e5e5e0c2828343c56ad260dbf8ca11e04e1f0e9108640afb9f2a682b6b89a580761e0a248af147047e92047e1772cb6385185ca192363fe911952bca70cf89832e7d2e309b9b11e05448f8f30da46e3214e11ec81557347e1b9ad4039fcf8bdc35e6f5d809e43fb57ee5e5486cb3329f266f6ac3b4e2d32a474bc7110a2788c03ad1a331470a37e35f4f4a1261e7c4971509e4abef0f634a45dee99f616c0bc640f1506f22852a3dc0aca94611406795c4aa109e27d5e62210de3bda1b9c15ffdd798ab698139fe7bbd4225d5c88fcfe4b615ecefe20f0b62cf8acc59ceecc0e8649b62c3e2d9738b07c614c6a6552659ab0885e76dadf6e82fa833515114908ea846551162f3717b81b186036f0ee8992d4dd6aa5d25bea555bc77a1609815a6f8e7dfd50536ef9b944d2827fb3d4909e2115a29e17dd2ecc143d537dfc9ea1acda2a6959b94e632465d7c713542f8a813614ee140363f84d57b0992749b969290ac83b7aef08b79a63374613099db8f4ab65ead4dbee3266ba4bafb11bbf104b780bb541a7f8471034ee8d113b060244f8e75e3953dc7c663df6bbdfe6566e90084646455b6d844eb124953093faebcdf457d071b342b170f8bc9f5b1d8c98fe146b367f8a48dbeefadfc5ef2d27b0572f96e34f51b0042da7f8fa4e79eb3eb3590831e73f37e3e7ccf2ebb1748dccf2b163b6c4e8fee7028c2d0d261c2e81589f755c7fbd8857b1f8300f6e2516aef8408f4a11c06d1ddb762effd76b6978f95afc6fcfe0241ec7cd1b389517afffb3d45fcbe09d4d8c3c1f723ef45c3be2768bd582858903bb00a45d17fa928a487f0268e8f2cfb6a7ae7a036d111f4bae8864e44e412cd21f82ae5db004ec46c950034a3249d3a06d9c40a0caded8f61964980c0c85aa70e836c624586d6fbe398652740d064b5047ac9983679867fa6e779c88fd6bf05191219da457a6464ad53c3209b582143ebfd31cc3209101959dba9619049acc0d05a7f3c669904088cac77ea18642756d06895647a0080f6780680b8f524038fee2510f428187219f07d33844e745f1a96fb8dc3677bb38161b29407150351a15f258335f1208867e6017d9491e3f8b9301e3cdcb08e48d1023a6b9b1d2f60e4c629ff78cd7628440084cc4321df4fd8f18c16f6689ced975be442082d54fe341841cd585475806564ce2dbf8591fb1752e22d1a8aebfd59365136d614e842cb8ff701f9b9019bf669f560b5509d301c6d6a64886718f2dadf050d5411fa5efd440e83bad9523df30a972c9c21cf5be22b00bf5bcec7cf1dbd4fe70ee3164d0c79de4379279ac89122c49da071284f2699ffdb77dc19a63eff4d988c3b0105e7433befaf72144f885754738c5fb5cd3f7975fd79b2a0d4c47dca4b064ad7cf712f3be44148f18877acc5ab32a8a0c5058cf126141707f470e7a7b179bb78a37d9dbd1e1e7acaf396ec3777423de551d381b05923adc4a81ddfbf9dbe319567dd7cd07ba511210d84609e9d27cb7b6a538128b18e24bfc6b484c074f1a302dcc1f23ed84a59f7fa1d20bd1e7505d172f9a65deff22e55558886b8006f149e53413acb061e2084a1933e0fbace9fd4f2a8dd91f10a46f44bd05a68607f8ddc2cefa9c2191c86e808876a40f58c9586a4adb6599ebdff416ff4fa54888bf7c1d845917e9e5cc3ff1c3fc4d7de9ec5397d8a16905ca3fbd98a0f76796c37b2ce1533c6c197375494356f0831a3fa1dd04f73f18f0b0a4ed00c7ad05cac4f9765ee302f605d841dcc5d570746ae2d8f58c0951c84014a1ce67df02f9f26f115389d77bc63fa6a4f2da1dabf94c38b22a665c35eefac98f7fdef7eb76e524d52c197d9d5ceb4cdd8658fe15a31cf92e08edfd72c64beef567327971a14b2fed7e28277c8a751cceb717fb32646904ad74ba37b2c563fe5279ad1fea5e9cad40ca302d8298a71b1733a68fe3ea2e6e69931d8bf5aa862ded2575bc6f83386f0a3ddd0d3f97a14f33e505f7c3a69b03951c2ed99763ce89380b0b69eea877fa19817942f66679ed555cc331a7c602a5a360bc4c615f39e0d1339963c767c7b2b0a59a87299e03d5e22496d20bf6b1ad75d4545e259d1005885c9e0a577dc65defedde4bae64394e80edab4bc6c33a9fdd57f6aebb2b52e8189e8511570a85ab2a836bb2daaf759a65b8bc7b149dc4c5df30e8ae6d68bd05528929b78e80b91bd8153b37100e25691288ca231cfc7f3baa81eea68cd0dcb2daee3ab59c74aacadca5c18d07951b26cee592fc6eb164a06d4bdc91dcdec705b4e2501ce7f501490574a9bddd40419567606cd966a768556b27355f7074c35184ca477684cfda3152f311d48ff7b1c09e6bb5fc96af6c5e93345fb28faf92c0a1e80645b09c507161a8267d606985f5f679d05e7a10f301368233f3dbf78cf428392c1022bb8816547be27f91cdb3fff42c9449531b7302da7d9afee22bbfe21f5b5d26881fe0de7a93de5fbd139ae556d003d4adead5320c4f62dabee9c6c84ca47828b189820eb8982546fbdfc3158dca81110a87b9a1e54ab3e1790d27b2d609a2e563632054ee54ef4f74f8ff2210832a7813688576e11f564d5c9b8fcb0c4d52f4a01b457ee03b78789091312f792467bcf0109cf2143cbbdeb5bbbc3e3c878036d078db3d338fb955333d49d6ac94e0bffada4f6d077de1e65f51c3a7642ad095385445a7dc2fc1a598e6cf22892be17add76410bba34019f02fbb7a333703b181e248b72fc2bee20aa3f5273062462214629e14a03d60adc73c918f2c19940a3d944242e5c4669c3f001776ecec726b462a7352fd2e66c93e8e871f824d8ffcb47ded67e44b6c50d8764a28381664c7fe1cad9c5695b5df951b342704132cd7f02a86c67295dac704c0064c42240d3da9da50f9f78a0673716b1173a798107aff1929475a65f7496cedb7d50f13fca1e5f8f25da4cbe50ec23bf6fcf899f1c765dc6bbe77c7309c1f198a42c3ba715781835db911ca8ca618b6c866f91bcedde59d218efc8c1c0b97149f6254067563c20c1dc56dee47c553e293004b154f6415e70a2b17a9bea10515e1d25ddbde9aee00ef19188e37d34940f2dd33c719b0ad7c38c3bc3f789856083bd70d42deea475805d52df1782e42691b224296646be968ca690f0542bf8a409b72412b818a3ee9514dd3bfc3ba7cce6c4b4348114d59df5dc534f77a389e29a076204260cf518a4c56a2741b192ea366868d45c5f9b206a0c789318f420ca6593cf2cc6d54b6919c2969c90c92509bb6c16fc2b9b6fa51a2fa9ecdfcbe1b2454963a840166890878dd839a9b98ee1897413fb916024e9048e524c2edf17e7cf2a6a6d145a9ba3c56f76156a9e3b9ea0441f69e40bcb27aa93691438c5eb4b666047e353ec87603c2f64088f54ac349abd382fadc467bb10a295841e4bfe9ef11d01205ca2c3c046582a75d3c64ca868a2e9ceae5dc14b4569df2cc1304b73ef554c00a4e9ceeeb9faf2aea3195fbea179c26ed6202ec655c5c0c96e280a2e56445172c8d92441928d8f8dfb379843e4970edc17abb03360392de7660931ff61907f19699219e6fdd86d21a306f1bebfa858ab5aeae1ad241f3499c0cd366ae7ca2b5c773ffca0cbf182a87d516d4fe22e51ff813657cfeff2010ed4f40a4891d25e02a76c38c8038b32060e32c69b4e13572e631867e5872b2ce60d7f64074eacf4d51e076e3640e721b8633dde19a4dc4090e13fd056ee97117db67b4fc3beacacb5b986feb520c5e2513f4ad80063ef87c7c739eb56bc7a9b49eda50213fe532b77f83a8388f30c25576e8dad744b347da82fc2d504732d233268448f4ea0d99dd351ae56c9e66b59c37c9ea6eaf860a20d05f4ea4c7e7e867721006f550a02f7d16831b5914663c1770d3a2a155e448b30cbbcee7b04b04f35d63b0dccac87c7125736fde87e497657ea5849575c227e08d51ea015be533332c2081cea25c069165020451147e81c65bc4d5e3b35450fa01001d48d934e380e7daa661c37cb987ececcd4d660c867407677e97488497e7480f2511cf39ffd1299c9584532dc49f143279c64b31717b5f6ed419592871ae5aa7ee107b9c0f1b500ee2d9fb1e99eb65b49e073ca40bae222787f58cf971d45d4eeff4d63343151d38c7bccc2540983c4574f78891f186a9fef5a3a04429c4038ce7a09c97ae2ca3d274cb3c8a0080cff7f71ecda8a827b84662f97f100395ba7d228b5a342df390fd9cce646f869b868a0e8f7210873a39801524a73ce6405bc5258c9eb09bdac352424b52330722b1a5a415a6464b1bb17e014a7fb0d54060e7cc89510ed50533b515562af1900bdd56e6937358861e5a7c6384162f05bed75e2d49814894500f807c098421154b102a29737bd9536f09a68de6c3d428844c9496cb1cefd1188e6d5653368bdcbc4caaf83e474f95ae2cd056d27b37f1c406d56c5ee1bb9bf3743718d6809867bb8dbd61ca65d31b2238383a5f3a1ffb3b373b9ff4ae3ebe6110ce55f0490a6b191fc6937d688010f47aa2d1477e4a64bc7ce5ba4d6cbc01f151f65391ff1f3c37c63f85b5a3a82b86daaffe4ee9c0d58303ef0513c93ac2d50324c1db1affedd15a7e89e72d1ae9314084083d8870be2e4fcb13419e5da7db4109e70f22f23164ffeb05061c22875173d663d5c3973c7184ed9c85819d6eaa3c81446ff77e0d303934914cd5f6768aee911584217ab0f9e17c2fc910469f11bbddf738f2906f78ea78f4ea0b428b53d980a08efaa80cf445ffcfbfd626263896084f74c0563df20679ae596b665ba2bf68414a9b382f8abc07e656a2a5505b2155cb94c8fb50814bc19548e1575c6e9c3684f9cbe7582e94eb58c0c4aeb7b74e26dd2578c833e6120577706ea13799e4304979b7a112f70d5a3d194afcb80ad88653783d58cd489b3b2eb42935d28e54ce76e3af4cc58e0406729681a0faeaca012f3e9b8c18d6cf59e1e13591ddcf2ff9f97025d0c0cd3e5380f7c32ae8ce5b8692e0bf5861fde4a40b30c3ec8a682edc9bde4fdcdb842395d0a7769b048da1f680cedfd0809e615215bb89caeebd781590b3ba44adf0db2ed09c7f3dc4df67f937bb571867258309f01542f23c637543e819a05c13ce029d81302b587e38cf1a87d010f9e219a97fa1658fc23662be7eea54bdc3d28d7faf22d8c37844f9e7be8a4877f0ec11694abb83397f549579dc5ef6d4667174597047040cee72ca784960c18590f57855bda325afff2c73b43b8a13c16a950f60b7afd75e515e853af0d758c1226077f39554f3338c37b4a37f40bbcca1946400d2ec3fc181dc8cdce1ddbe725c1f9e9f04369fba69efd5b0c43471900287aba283a0d3373a104deea273ce79cb92e3df987f752f91c773de8f20839bdd31d1d7de41bbcc5697715b7708d06a0ea1a16ee14786e83b1f81aed3bcf883d5156a288480e1e5b84ec5fc8b446b823a7dd822cc3a3c7af137ce84ce565f8c020e9f950965af119ce304e07adef4e63e2d1c133d2cb0510a4dde3df2804b9645a2672a1f61b763bf74b8ffa581272674d255e0c673b3ffce940020ae2d14d11871c06fa2ed199744591ef8033fc4f7f2705ea7f1bd2cdd34fbfb6037317db74323f365ff1d43b81218784b1b3cc551dc7a8e6c2585df13344a603c4444d4dc46b5871cd47d93afdf3f39e41a168504104ae0371df8aef6d042027f40f7a1ad36dc3b180c196f7bd08238a68f3646803124a832079b4559b8603044ccdb639ff2e4e715682f435486b19b4358af3015cae379b530ea714e40cebe966fb1e450603ccc6b6f44836fb81db3516396a3002b73236e38cd843792b1c4bb65aeae8d8d5f05103400485254997e0be9871672617a33c10c19f2e3d2303c4e53c5a684e40b4f27b735259ea6e210285a447700f62f06d8d307f72ee03b387b028598e70b9df2cf2a568a006460e8f23b166c4c64d2bb5da71f96f35c3c7e1ef88173ac81e33a7316b733ab9b7a4f5a68cadde74fdaf8a8ff90f58b81af2586c36df91e82211a807aef1f78d4e8c2d2e252dff129cb743dc2657c0fccb4b4dd7d025fc6bf9b485504387841d0b1ee2e5a1d5a13f8eef6ddebca88bfd969561a913b61853e1be028ace6ae687c31d647fcb97f7b2e663617251174d817e2117e4cdbed66ab8a104513264fa8a327ffd253d6adde0d9c323256f52a9b05fe6c53945c9d2b3b7d53a40f75fe2cfa4c0dad66f6f520158630f61155bef42d81af5f83fa49c572616134f573f5faa741635a8600fe095086663ba96b1d02355ac595d0cace55b8fc6eb9b73bec202cfbc81eed298ff8b928ebe7769da7387f39ce26b6d336c744b16e3d60be0d772c4cac4f6c4865d6835d403cb718b604df00ad2dded8b0cc199d7cf0f50f42ca1a221da4a715755e9c56ba9d62141f6dadb5b218b558880fcafb2a4198ea9bd2258f26d60b5c117728ed07fc889106653edaa9c5b3263dda8bf4aca99f9f3a228eba064c4dbf166a53b4e02189017285f347968ae46a4a55c6427edcaeba4542f7a367f932960f1b54132b4d8156e917b58f296e91580a5bd3c4ba8b9518ff083b45cee14f50406cf969b0cb9f015b9ec8fd5aa85253c1848443ee45694212f20a785efd0ccf8358342fe545f1ed6d39f76003c9967eb63f5eb003e0b762b6025be87f3a0f8ea42ea1b942a3339cc1cbe3de4bfce11579935c7485992abcd4c0225b449c9f35f4a1b5eac735456c417cd6e629f42f9c9a469808eabfd204fbbd6aea65918f610bafbdc296b7de1a9f16c08a14d431419a37c4f5120110ff6ca4bedf73090537510c2b8cb837864693fd9edbebbb5afceb227784ebec2d8f2d892a4dd6194980676e6e7b845c2dbe1f0c1319b0f46cca2a887cfa5004fc8a4115888df6a2e8505b2fed495e53d265f42b041945e0c44f2ba5b6b1ea693e1d93672f681ebff61eef2225bdaf983f49179a558ae6c1a474bd84d27c363e25ea4fdaa64256932ea33190b6265a38a46a2ba6991f99508c11bb568e4c6878de10482213a6d20f18763088a98189270d07d1d6ab279b6acf9e1ba444b59447991e259d31de65afddc8c543b5f09d5233c62a5048d95b21acecb3a28241954427495482a0eba08dc9dc65663b5530aeb920f78a9fd9890b0c02d6e8f0eda9a05b75b12eefedc963ce5091c28be783cd8e42364881fb8f35bb5f191bca232d02654a7d698610eb66b6679017d7698630a4e78a685b00bb7080ef68fcfb62232980b29886a44d57f3076b3534e45e3c265ad8ab143e985e9abd91045e2c8dfde25cd817936c53771fc7f983a17c67947f594760d38450867339980c0ec8277ed5218d3ba32b0170ee5900cf5e238a09088482c0e7a4c2fe8fc5d2904e086792cf785e44a6ceaaf1d146efe925123b44bd143da543c5f64351c4f7373ce36c61caf4fa14d59c9bb69efe04431d47dbfae6f34255bde24fe88076f1821bf7c7eb13e6bc3c90afccf5c1dbd2437eae4ef7d32b58cebb4ff77b17d36ba6634adb6b02660ab22d035f3a57206ee66eedef3d4ac341a0a921a27c38d091feb948a5b35cff18ec15561587c129ecfe39a0dd18f22376d2c5ffcca46a32024ad6d3ddd2bf4f61b018e026abab3709eadc295ec1d398ccf2061bb659479f0d301ee2e17c4318d14574b7969bf54a51bbe287d97fd24596edf23ef6459f8e442c18ae07c50a56e6baaad191a539c440b403f8432261d3d3ec05f3f0bbf6f3f85f2d646f9dc37dc8a6a7c9faa787ba5a8b6d15da2ce016010af62a6e3b7005c26c86235572aa22c41fee10e925da32554f624da5a4c4f17d827aa7b29c9a583eff6da77ccdd7f41b97f46d1e13bcae4680916d7cd3b74cec25bfe3ff6d18e33476edbb9b1107a93f165224a249ae1654f668dae1d5eaca922c6c01e440bdec1f9efeb0510ac120d3b87c0537afe0ac64803a013abca7e7ed4783e0ce94338199d7103d705a94d70dce6f138fc548a3b20e4137d8bc6b2a93913668ba4f8c5fdc7b13fd56586a06417eb932ca760dc6ec6f90a566efe26658be6054cc83807c57b974e8c73905eb9ea8d0564de6cc54e8ff385b4e164bba513ee2f7969ad4c16b41e3bb71e62a02ce732057e38097ffe2b3c5a1a5e65a7eb30b65fc17240dbf3eba5628d916eb4bda2e67de56e39506738b00b19b4230feed1da75950f370dc616eb9626e11690b1c962dd2324ca18b05815bd7e0f0db67d3fcd9bb04c1eb66aaecf5c0ba656e251021a97129134797230a94e0828b49d6555b0c1070d2b9f9af65f5d9d4040d49b3727a5df078f83fb837eba6a860454dd15af8053ece9d86fa132b31bd4333b8797af5095c722162b7e50c3893e706603ce2508a109ba6e8cc10563f09c2119971f09a9866b72364ee1a804b07722eb9a240446eb3ff637e4717e3ab42cab5b413eca4498f010878af082db0d5e80bd024ad27777e560823e7b6fbf028fb80bf6248885a3e188309c4153ee328ef8ff1f0a55303afe505ecc5ee10dab338d99d306430842941bf1fb06a1baf3ef98fd524e183909e1240f6768da60c888e9f597b859f6e1ddf387c37f14ae5b76d246e822761c12b7654cf5eb757ec8fa585e19b13a1feb10589666bda4f249b5bb8ee0856157f90c127db8255690c1851f51f815df39b7a26220c2411d8783e92c99e1e76f98c087b7559eebaa5885eae80799f581bc189a36f8287b04c49959b9e13c165be2163c0659401d0be24e03fd612b5d3d463791f1081a14eff24fa579df1d5f0f00f63d67d8ccd9d5ee3662f888703b9d5d1712df60b386624ec62b3d8abef855dd4f0e90fcbc9ce32eeff6fe13c410fd8d9851fdea21138bb50063332c2ce2efcf0168dc0d985329891117676e167de6129e67f4444ecd2e27942bf15bbf48d7758caf41d1125bbb47a26696fc22e3de33d2c45f78d881cf6252de907c3fbd01670f479996ce2d379ae4897fe5b2a4a31255ddf65610e842d20f5ff60ae0cfef332a0f87fcb03c56f591434678c49c28b4a4f886e072e18d0de896b7e8917038c4ae8b4a4b551c0fca922f0b55d913b87956fbf5e15cdd7e890f5e861cdaa0a1d019fa0906abb34e3aa42dc9e223a40819b0ee2764705222174ea42091614fe146e5dc7b38f8bd57d3431db6c40446f0611fc1efa4eb947f60c639d7009e1553c5be29e8f635e19c0257b3328b4c73d4da30c6686abd28437fb52e58a250533188b7c01e54cd76838c99e1b4a84f9ec03a88f63e061c66ba585ce41274c126708f25c548552a48f9060163e80e5fbd16efe91a180b50fe40e59f12e9e53ba67e927c07efd8f66b63e12a23a314fbe81973d5d6622d0db0fa569ae4bc090538fdd44d3dbacc268969e929e3979f1b6a68cd1001097c18b2e9a7f230d50cdb9c15d2681ab086ec48cebe47540a7f524e9e52da8825ce591d01a71e52787841a4fce7869e6f9b5432370e10d2f8de39bbc8b7582ea325a8416269dbd0039b974542d7b8b0a073825355a68474574421ea8f0903f541fca49368eb28f8ea80119d82436cb7c1dd668c7eb45024a0192ce27ba34d0a2a4d19d97ee261f239e62bdb83b4ec45f6d841950e86a1bb8a814a0ee470ac37b97052f1812974a3dff1bac9b96677d89e47ebf98b4c74f0b3b92dc3d005f6255799b5c07c976609288641bf46d32e4e5b5410d13da6957a2b94bb169d91871e49b6d38342f49ff4a26ace00f7deaa50c280bd3446b5872ae6ec692114e1f83241c6e579588be08e9e8b468e8ce4e07409a0d3db6eaaebde925acf5873dc9c6465bd51a13545d7c19cb661bab788ae106fa8cc8e7438f65653b5cdd2d5923530c371336d68b9225709d6a0b838c16b3bc1751f5b7df5d4d4cb720242f7f76794033afc696a3ab4c6c1d24994b371f24607a2fb588c73df475ba8ccf5da35f42b38060a58aa015c02c1c60f6046c20721679d100c4d3f96929b694230600dc6813de669991ed5575a1164c71bc447715143d705c72ab8bcaae611da8f38f420495b1746dade0ac582d2f5f81a0012eb26fc7cb9ffe4b9ab16bac052a6c4b3fbb2e5284a4d01d91b19fd8948f90eb2d767e1746e5a29ab839e67c1b51d7ef896877cc8dca9f64e6e42bf84494834f2c7f2d210a5f10776f9d20f984696cb86dbc1888b7fbe09880973875859b167b1a15d0e5e70178c14780fcc92a4d6941c638ff464f2ceaffca13f4f7bfb8c2a5e7b702753f54aca8266d02d40584ff045d2062195231000cfa2aea500eff23d7c3e3622b1cb7260274927390ce898d1886efcd0429a001186ec7bed0de0a4022cb7c70ab5bf390ce7b6bcd7c6c0c60ae752ed6bf1373aa402e09e307d456c45d07dda12932831ce159fb592c9ec5f05385242f12877f95bd1fd718128c1f554ec22e31fc5719f9b0f3c49721cb905c62e04228b261e827c6d30b580e7c8107f793f8613b17a8902a88e82df93b09b6cb701d2149be4170f4b02d7e5c2d92bc77dbd435a24b84c00b6078f60fb1ac243f640da5cb5921968c1c49faad86f7911311d2cb050a6ee269a17147ac18e89f642b48e02355bf47b13d35c8df8dc1e14d21a242f3531a5969cb13a9080c9c14d3d0b088b6c1677f5dd202ccf502fa54ea7a59209c5151074d55b3849c9c7414de8a78004526e6f9a6228a26b63c00b91d279ae1f13c263ca17629be2992b8a2693b9b26b13cd433a136a05565235bdaf15eff2490d01c9eaf776246b8be916858b29b6cd964efbda59452caa707b90772074440b27d8b8a54aeb3dc1e74f7b6c587ec8280ce942a2959e1e35449413931df7dc07ca852253e50243e7c745ec3e64d96c6b16402ed7ba9b035435d670e4189360e8ba003116c9c3125b20103a05b22d0a9f069fa721beff21bdf922963726cdcd0d961fd4c0683e1f2d2e2e285bf604c182c2e7f41d3f27226c7c60d9d1dd6ce6c7b1e8656dbb05dc8ea4edafb5966a9b4f73396dfd064f901b8cb0bc05bfe067ff900b88bb7c169fe71f0d913c0659e6e87315faed60d5f12b1e14b1f007ce9842c26e56487b7b81f0b64838252666656aa131306658a18550a45dc397131637c0d0f7b9727a1e7f59757d1f37acb97f4bceee261f4e58ef4bce68e1e7e779e22eaf02d048a5ef99ea64a565258fe5f25b64dd35c39f7c9c9c9a9655f7accb35676389aa1942c94dbdd807028e28e27859886fd0c97fd0d8ec7bc0cefe113e032dff9ccdf1fdc87f7e1deabe8b0830e2fcabbc310ab33e366099bcba865f432ca469f9151aa2785d5f1b0438ab8136a41b6b8cb4b8b8b978be5033a4ff7d5eade177127b5aff0fe44079897e94ab2b84cd4716971e1a1ecf57688b53ca2b5b9a069216259ac133e30eb32a2bdcdccc8c09831351d4cefb93198113923eac0ea8c587335e7254f597bc20ccc2c9d1077629bc52c6d59b03c0f77f919bce565f097dfe12e5e87d3c43c0effefe1337fb95a5ffa944ed8c870d8dcc8feb5bd7fed7b62d6bcd8c0dcd0bc78cbcbc5c5f2a21ad9d3c8647f55e8a706d5201824bdda2b2a3064b4f7a91833dafb121d98753782a16f7a78205ce665d0fc75175ffacbc3f0967fe12e9d1fe07d9074d773027c4ae039709c6d0903bc021c88af3908f87afba90af80a43ac405506adb6d4fa1bee7a1bfefa1c209ee6ac3890df6e8cf56eabdde0c20e84f1a2bc2b2529c8dec6677fe3ffd7631ec7655e86cf7ce934dfb98b7fe12f0f7a0bcb61cc978be5add2d57add94aed6eb4b1b4f0f91175ffa38013362f442df883a2f6698bc17e24ede2f441d1c1a1af6db653f8386c77c0d57ebe56abd70c49dbc7374255d3c47d479f11c1107de2c9e03d3a299717dde5d17714776cf5bf211dce633ef3558ae04293e423837f21ca42c916273233772a3afcb1177f2663163c4d81af6355cf6327cf62cff9fe131307f7de63b18fef235def2a0bbbc8db3b8f972b54a57ebe56abd6c6abeb4c1f8b287c805e2071f09e02186b89377598b422565fc86a803e337441c78cf7868c3fc1f1ddc7378dbb783e7571633b455de9581f9d2c673802f7df8b2872f816eccba01be44c09737c49dbc67ccb216051b30ffc3839bffb383cbbcf3bcd77830bde73563bacde7c65229c791a050a18e11a31ceeef1f6684be589f3d2c88bed8908484848484a4c4099b0e5fd66eccbacb0b119f1dd97e7d1d52796cb68a43ac3dde7fb04f2287684468e3f53e7c281a02a6437c003da279ea620719449d17b3acdddce4f8a9218358830ce28ebb63788c92b5f334bb3b9741dcb9cef210070e1d1af6d7655fe3b3b7f17f96c7fc8d9bdfb9cce3f8ccbf709a2fddc583cee2302f57ab74b55e2e2f9a06ae96493b5f26cd579f69b4ad67822565755426eadc19f40c65ccc372f4c5d2b867849779449f08be9e6f05df8d26233d22d223223d22d223223da213cd9744ca97163a9b79fd4c26ea78f7763ec30eede2513c96c3ebe031bf02e32f2f9716174beb24163b575452ca5a39c49ed65bc49dd77e1336458dbe586f296b658de2505a6de9febf36696b3caf3c3cb9a373cf5f441dcf6411772ecb0eef2ce20a57d670db3a0f7147b64b1b1472f8d98d59e7219ee70dedbda541e7eb81c3fbd1c15f3a98e5101bb35e83a80333cbda11c8eab412002f2e3d5a4e7a982f57ab6499ac7aa852253d50243d7acc4a9ebf72789af33ddda4adb99d9726b6276ba73349f3abe20808daca5a59a3c208e9de7b71e7dda16d6f2ca78a9f3d3fec39d75eaf767354a89170760b2145a181377ba7f7dd982d1101e71e21bf79654fbb1ac216f7c044abb5b6e8de2cee3ab2830277388cefadc3dd5b87bbb77beb70f706d63a1cce18df4c45adb5d65a6bbe5ee7e3e393da9f91157c2efd529becb2aaf3f121ad36b55e878590a2d0340e8a1b74715dad66229bd62a6d8a03abc8e090ceb81302873a2170a81302873a217068db6bea1b38d43d0ae37b45b213027b88d0096dab87ba9e90a2644bd60f903472638c31beb7c3175f5acd7cb1fdecbdedac763e2a11a108adafb36ddaf5e99ec0dd8d6a417a379f9bcfcde7e673f3b9f974e677543272fb3aff7c7cc05bbe79538f8767c16be399acb62aa776d869fc25fb7bf2bb9df7811abf6987248d9fdc61a8c5d20e458d5fdc7a87a3c61fee90d4f8499be6e007f7e77519df1dae74b962b14ad824e98bf54a5a17d6aba84940e2ed1d6b93c2ed99640da93f5b536eeab04d3dc49df879b6dd15252a08410291aabd3877de0792422d9646d274224195a4542b1356f982b9ae15dd6a2f57ab6499f8bb6ecf2d0f15ad54a91214c99b2d2b74bb3d242713699e94b5a73b1a4ba23e4161d51e4fe8487b282926d5cd9e1495d536ad80c4b85db4415c516a8338fa62bd74058853edd44a6a531cc579916a2535a85ddd69a1a351d770b7a887b4b8fb48a5389a484a7ec56abd54fe2485e5647991cdf49dd13017ba666f16c8e2ac91a3cfc810d1c5d5ec50ad56abd52c5191d151eee56a952c1c0e87c399d46ab55a6da552833afa72356ba3015f12b19dbd150811a567222b89be79cf61ec14e468c51d94ceef7282f23f3f64e0e12b95cd3c890c0d334645cf6b92f7fa2d752843cbced72c3dcff5742ce5168b8989892bb6592cd68b74eeb22cc51d6f4bc1c5e71cf113a8b595d95110191aad96ca6929dbed7c6e40b894a7a1e536afc36f9e871ff1403e9ff15ece041c892fc2f3ab0409e2b01c87bd4e5c3a34f0d07173d8ebc4359a703c6b8b1d1d57eb7644b858b996ce9f52d6ec69cadd92dc2dc9dd92dc2dc9dd92dc4eed2b4e4e6468d068af95e3a18af7b9ccb79cc6e7b8cc5db7a859db16ac9c6845eb532aa9fc960123c8cd8f1f3362c4cc6c6a5ccc62666468d078272350f1edfaf1e309e675586923af59d6621e079f7902f8ec07e0322f00a7f101d8c1afd3fc0d282738f8939eebf030a11c1e86ab1478160e04389d4868b5252fff6b9bac4c28ae534a8b243f4be60790a16a7463d651622d7231d9ae1f3f70a9148c0928154ba958744a89c9dae2de804cd96c0d4de3280ea53b94699a6fe138e2957018cf43078dcf7199b7e1b31b1ef39e07f92248bcdb7d6ee453d0b831e47036a0a7959da7fb6a459246bc1057e26b4eadfd4cfca95a0642beda5b8ceb5ff8eb71dc06259ee6c0fce63e37f6754478d7464e0b26ee785b0a349f53f3386e3e87c368b98c4fe66fccbc8ec79c5c4080b8d9b9c34c9ecb01ce680a0e7b9db88cb64959963db5bc59b92878cf8d398fdb7c88d760b9256c38a01c89e439582e7762e65c662e9b9e4bd95839db0d1b392f463218181913cc4ce79f6d996c46a73c0068e8e1375f030f1d39cc7f9d00a0861e34f0d091c37c72bf4e642e97a8e3b94bc4816d7858a351de86c7ccde7399d7711a7f8387c7f81c87f134b874b8cde7f09ac7e12e7ec769dee529ffb90cdfc3738ef7f2dcc32c61309395b3c1cad1f03ec46bf6dca2f5b0dc148c72e07818d0cec36ee3184839920d481c398ee338ea571e62e389898971a153be06a7f91beee27978cde7b8cdd3e037dfc38ff822dc8807e2b5f644b8ec3d87717dc6b768bc8efbcce3f098b7e1415e0947e227e0f94b1be57f82f84910376df8bbbf3ca017f8158c526c294be8c861feebc473db120579580d262bd7a3e4d6697858108f87ddae60a4c373b8e9ef2f3f71cff997b61b447b953f97adc707c8973722be048a89020c26ea780e1371e0197f5dc6771ee33d87f19fd7da037123be083fe227e037df72179fe3415e8823f14a787e910822609e4d8dbb3ce7b45cb9f33e22842831812280d8e41fce93849ffc90993f4998de33c3f45a0cd3634c2b30dd6a5c905c88e5e2b7ebc78f1f3234fec589e999d70c5f3aff977202c3fc19dcdb27cf030e1eca104118fdef70ff2d43b7674f81d0a46c33205fe3e7e6c66e6ab83952c41d777bb7e52c31712745dcf1fcf31007e767fbeb5e2ee373f88c77398d566ecd5caf1b3093957bb9b2a971a28d9395151afedb677ce7b0af51f39f9ba05064d282e98894c9ced37db522491390c969a6dcb63efb9295636d4183877e1d8b95636d51a3e1ba99080f82c411461001a4082045785acb64e7e9be5aad3c2ba7f2ac2d4ea093c58ad16a4bacd75e61e558b9225680fc6a452489701836c6caa5fc76c9d0aefce3c70d96980d1b3654a9121b28121b3632ddafdc32aba8e3ddfb0d55f17d35568e952b92821212015b4df084490a2996205272420dc619dface0bb8efd669c0b4c9ee2b983a1a852af9275b6acc45c2d979754cae4ccab142f954aa58c71a92b753774b874a32b99fd46d4b94336dad4a5f20945a2e2f776559ed21817341777dd685fdf9317f773812ed015bae20dba41f8f59ac960523319167760b86cd853fa4265d4a327f6d78ff4c45e3e092de9897df530fa82437a62153d49ec79f41ca3657bf9a9f7d16021d2d32383f9c01a311e9b0de60524edf30eb9b517971c6dfa13eff28904954bb9b4e413892985d2f6e8559ab0ce969598163674f729355b0f118b7d5e1edf5226a52b6ee8ee4fb018459dd2dc960a7b5e3fe5ebaa21cb3a62ff16e9bcb228c1a1bb7be466718f8c6eec624192a24e892d62cfeba468857474f7be73f713c87c2231a550598cbafb178ca7603c84391d6583eef9a4cb883b4a8e3d46dc11821277b2973c2cc158064322eee4d0ddbb503a74f7ad7bc49e2556cca049de74968a697b7eacedc6accdde7cec69814c76fe393d65326d4d25fed45c6eb59a4177bfaa5ba84747262b1ebafb140dbafb929d4da9125d03cf431b74074514438f896e4ce8c660e0f2d5e8c68aaccb45335372c20dbafbd38eadb4b054afd224556a02162eed618551d8eb25001315468cd0ccb85ea187d5a9c36003208b0809e11999178cf4ee94007adcafc74038c84b8c4b56c0dca4e67f6582a4e12c4abb8555be5429935597718d229b352808c7ccbe5a3314f6bc0e037bde8d4d8c8346997e7af7fcefdd8bbbc494aab8d54c26ea648c3b6b5fdc11f7256a028983ee5edfa36b1a99e20eb8ef1116a4e9e90e5504d05d4ad5fdb7730eba4ba90aa04fddce4f4d4ef240bebd3257441d13f3128d80cca105c9b222eeb81b06237d4694591177b0974a52a992543e91dc227bbecc4b64cf1a60205bc3f2eb1897ff06cbac41a34278464695b242954a951440778fb7971fe3c6442646d4c918a78ab078b9e2f9f4d3ffd8ce9cd3510fe4db26e6cf8a93842cb11c90d56f4c8cb8a3f3ec337147c8c69e9d45dc69a1d59646707c4a5fce8bfd2526eee498f8f3adbcdfd8f598b8b2e7c540f71205b4ba71577b36ad2b914f53c2a9d8437492d7b0eea3d34e4e9ab4cab33b6781fe7928a7fd2891bc7392343b7a841e212991c6ce3750659d4931aa6e206353892a84b4de0ac69cbdcab369365f2149549b773d9c3d9c4193d33ab74e0bfd8b515b5372f2a98dd17edcf1e911ffb27fb7ba05cd1f76d3237b03d92ff592cd3608290aeda63ab2d376a84671b0d7239b4692249931beb7070b357fa1264da653f5eadd9ff5ecf52ec88305cd5a290ec55f77981ffcb6d7ed10ebfc798759e72f57272c2eeb8d48d93271c9d6a0f41301a8810e9590c01aa49b9b9294c638951223a0d3b53c140a87a299cd4ac612a9528911d0a97e513be3f71bfb219d5cce9344d4a5d5eaba49eece7aabb7ff21d19c0a54719e495bd9bbc31a5e5d9fb031ebe48d3485246d82595df759d20761ce5d87bd0ff43eb0cb7545d7e65a416f37868b5de80e5da2dcb5b94632798d7447b7fbba235b73bd7bbb6e0c9d173e307b5e973d7cad15c86a9908294aee5664761cc5e9e13dd76835310e56bb53600ffc40ef0b97a03561480ac330ecb93638664023f410e8dadc5cf226bc5d9bd96c369bcdc230831feef22c0be12984425e1370dbe68a73f1e37cbd9c73c68f7528e8bd062d096807b6c1a12990b6d210e76bc1b0d6fa992b920db6adabdbea08dac377c445a1663cc5a6b5f651f2bca28345389c1647f842904402c34f5f9b8f528ad3518a9329c5b9f614929c4e7eb19329a6c3db5104b8bfb114ee101596c40c05b6d86685c2b5b6b189a9edaeadb764a90835796d86804ef26f756d42d2d39c10ff8a4a0a8a874f92ba936dee77d8cbd5daa1d6f84bd60e4b23199a4a36f8162099e78731c618638c318669fcdf0e5de3d0d418638c3ba739e0d39cec9ddfec39f66ccd79ebb53a94c0423adb5d21a437e03c620f04ddc30e7ea0f781d70a3a034a846ddd32615bb77e2bd125736ef8a339f5666baa903d858440af33a036a05baf3f37d6893f2b0f9b1de96607dff6e57c26bd56fca136fbc538df9b71b6df1594e27c315a62cef87aeedec68f0269b67dd2063f863dbfd3cb6edd034ff03c290eb595665c023d1226e19215a4aef33a28e0d5ecc672dc9881e2e06bedc5d6f620947530359e407ab6e665fbb05e1078f4ec9a44d99a1f9be7909eb3b71cc5d694ce207c2841910f4d22893a3e30ceefc3079244fd43927ec61b668decd5b379d2cc7cf01104cef9dc4278e20e2ab4af190394915c36f53ad9a535623b47166475991e59f668d6b031eb36f6d91a99d74d7131a699cd62dcdce07c51dc5d4e7b5ac7a8d66ae57d61bef7f3aa082f7835c623bea812daec8cf9af4c4c1bc4416db4db4ba1b02d65c2e8346ac5269d4689409adf68922513c83cc36d047dd1a224955269d2446bae53296ad8a0361a536d1a4185b0b7112526e020b4069b313ca5f2bab2d6524b2a65134552426262024f9bfa97a03cd3f3ebe9f0fc7a262c4daf8dfeaef8e78d59d7ffe32c8a436eea24a792529cf10645024f24e4686ab9b4c9e463da3f50ff90a4a9248eaeafbba1e0cc3f23724039a01cd005caad6c5a05ba369bc6ac4f512b820d09db62418d2a0ac28dcd1a63a843f105a3142715829fd791447d4956d5031ca80da645d4881e3d1e612825aad4ab34b1ce98ca8aab45faa5c29eb78a0b90e41d3abb939bb0ed3b31691f492357a6495bf99b341f7178f5388ee3388ee338be78916d37fa54ba788ad59d291ebab8b890e3488ee39872be663298dda566322ceedce87c328da46719fa94bba7355888f4f4c8603e70c7786c369817909473dad0a73ff1fc2b37205c5014f6f4b9b1944b4ba8d23a87888ab4482942055191d1d116581ee7720d07e53f31f76985a3c04238080be5d0f97fbf1e0745a1828ddcd38eceef4f8061a12c5ebb7bf1d48b6924472c832171a164d0f95ba7929ce2724a7149a1e1c443e75fed93c92a7fcaa487ce5fb23b96c6c10d3a675b0f117b3a61cf0b840bcab753e6c93e2d2c2e9a99a06c0bcab6a2a000e8fca7bdf219e8967d2e0f8ea288919e1bb3e1a06c135faffca6dc69182c3f592474a75f9e48ff454a3bf6d9888d1129738f3d6ff62931522453913b30db724f269279b22d87eedf73b6659e4c24fb9c720f0e6a427ebd558f83ec898570113c74c251602378080b1d50e1eef283fba4830134eadd4db2ca490507ddf374bf41947e361bbbfef98aa8936dd9a60233f98cb863f4ec32a4af883be75992cab603948fa3c83c560807659e6ccb3d7846e68ce998014e263231388ad87dfd4f8ac7b24fbee527ec79cb1467752a2b1e9ee7494292242b2ad9766d7050b605651b0eca362c9492dfb61ca0734980c6519cb0100ec2413ffcf0832a55f2038ae4871f48378d9824c77cdbd7451d92b20d13655cb5793fc0e2a8daf290696fa081a5c29eba5e00031948e2870516f0030d0821866040037890c0902022a000083cc0013bb3ddb9043ec523f0330e8197f1073c0d77c0d37803de8533e06b7c88b77121fec6692fc317f030bc66e08ff08a8137c2eb05bed6927824fcc707f13ac402ae201400c40fd96d70b942acb31675fed947eafcb3afd382a4f94ac73c027ce60fe0b3f7c165be07a7f106707fba67bce736efc36b3e0105701915a880c3f82102013ec8f6cd77ee2301157856ae76001f78ecd953803534c7385f931cf1fd3eefd2933af62a04b6d7ac1fc6b42b5dc718d38052eaed6b8e5090d56928f69341185651c7052c18814824a4806253114af1c40eb51892bef1c78ab105630b5840525baba8c2c62e4dc826a2a72621f9be13ae16e74eb3f6ad413f3513e18c8855c89e1f8b5502410ff569cffb4829d289ea138eb6f109518f2b50c1980293a988c924b4494092a07aec598b28ceb8af97844a42a3533a9a845445379baa22d49049dc596dd5ed66d2230a5043b6a68e2720d1a313644a6bbd8fca37e20137d510c54195c252580a4b612944f554d6571b6922d65a49eaa4c71294845420c8030e443e7cb859d89afc05a025d660e27d316e6ae49f41ccc1fa9cb505c54179586677957bd94d3ca532571ebaaee4cac4a4f64cd5b02b94ab7c9a837a5dfc12dd9e97f512cf0ff5a15ea3092a89fa3ecff3462748cf437d2e945faf46950a58e888e298f8fd3e92a4b47393aa5b09486acf94674a5f52a687aa0245843251437a240149f252d451798b75f7f56a746d4abfa8211135245e470d5d9b1898f8751491ad49f975d4115bb3f2eba8a26bc34a7dddaf1ca4d2d3f395a823efd49becf0ead4afb6aacc3af5a95d32d220c072893abed4a376f8e9d493ec10d4a93fed90a4536fda61a8534fee50ebd48f3b2c957658d2a9177738ead4eb1d923af5e10e4d3af5a41d9268d6d39c54ea3f6f87253af5dd0e533af579872a9d7abcc3954efddda1894ebddd618c49c92aa5dc3b627f1dca3b944943c2e42d3d3d371175e05de2218b625b42790dbbfad4b32c7df1dc44d429f1106b556bb3de54c4c6aeb3449d95691a47602a51ae7aba535f6e2a0445573776bd042592aed70b06f3d389e520c81a4790f2aa54c9a348fe51fe094199d423a1fb6422c792a8c323fb6251e7ab557574b2811a5652565b324b17f3ce6f0cc10a09d4f82429a5faf3d5392361a6d3c985a246b4ae1182d36737ab13ec657218f619cd47712157a3cfbdf7c4c1f3130244893240895a28b9e5de7bef4a0464f5ab415fd15c1a1c821b4b9d7cb1b21c3721b891d1811ade7c6acf8dd12bdbb47bef6d02c6be6c1aa594ae562449fbaa49bbb4ea42ddbfd29796ccd2c5bc9e9ef3eb592181a20e75da040854f448244553944da394527db269f7de5b792a8ff54073e540e489f1d716601f3d00337db653d08be4745d9b76efbd2824724f26b9ad4dbbf75e4a6989bef7de9b52e9b1898c44eec92b9649c92a29a5d4a575ee2171e913ec6572980fe9fa3a7df9c068bec63da4cf2e99b6f1033de2891e39e069143d3691a202822b2708c69cd45a6badb5ee5a88102209618024b4a9b3340182b9458f4d6424724fc6d8458f4d90d56f55ebd71eda1ce0400bc8ea383c9356795a2810c40e7a053d6f8873df9bb1bda307b4c61863330a283675ad33ee4aa58e8e001bb7a967a07d615e64303324724f96e97bef4c06f3e2d2c2123b57602fd72cc617425a6e1aa5945e16a5d6e4c377b569f7de4b559b4629a55d4e795d89871a3950af900d34e706dd180f09d875a79064d2a1c6b7db26454d8e2591fc3aa04d8156a56e6442c43e7aec4048e909bc1f0ddfea99863ffd55ead72be6004984acaa23ba0b74a915694feaf866a7dd7b6fbe7956e9b10364f51b524a7b36f58b31c678155e9649b96aa95ca9d7674b602827f993693a2151c694928ab8a2cf304662015b3e17efa583c9323cbb3156668655c25e8990b8a42c5bb3572264ddb4efa3d7a4fdb0b149edc901b23abef96399d89255ef6d692a529396c4d0c5edeb230f59fd0e7171d42b8fbd356cc5a408298af5b0fa1037df8fbb759c9e98e203fb3afe216e7e5417cab7d382ed0382167af41503890be013c8b3a2e8b5a27493bd62216cac37c618637c23c5e73d0a08474c642168d3c82f07459b76ee31c8800a42225082084c7044fb3021851447a8420e2ea0ba422d0c576461892664c184910218e0411559d881179ec8a14e81283285529123e3c9a6402832848ab55626b4b0000f186c30842ae4d0c8bdb235f78a4dbd866b8373708e1028be808422b62d8e88c00515920a25010a3f4dcc8088065eb0841cda6a7777092c4842ee7681dc1886723a7355738f6cdacdbe45380214527c210550a4c09d8002161839c1a8033eb04ebf4d0122bbeeda55ecf3835b786bf57ab920050e58b0efddf7de6bda14083e38b2692847021d7aa27bb7d021c97a9550472237099b3261fbb0eb0e3db2aba863b3e92cea1c197531ac0dcd29ea72cd99da7c4f4ad56bd891e2c848dacc44dd18a14219a0625ba7c15f770cdc0da1b5b405724658da42490b6458ea0213dfe7ee7d5dd775b5d65a6bbeefeb6e288edd9ef310c40b6af3dd98e79e53e17ad72b4237b3a7079a2e5b20691fcd657bfeddef2349f0dbdef755bf89d1612faba062cf6d687e39eab5b57a35bc4b897675eb41b0356025738831b6b8f3eb4a741887d8c352fe4007b57b38545bf51182e48961e89e07bad6a04822b9478e2e66ecd6148a6e124bf488489a3f2cc93d330ceb067aecd17645b036bbb55714b38bd6452b661ab98524a1040ed526569faee27bed15b3288a261690b41f3787a6e8acec344bfb3a935637e9764e769f772553047d7cf3c7dda149134202bfce338540690f88e2b0242489ce4938545be7249fda55b0e2ae23794eab3cdabb5a852451bd44721caaad23919c069d84a894eb1b8a7a52a1991100001000006317000020100a868382599824511805ef011400126592684a449e88a3b14892c22808a23006820c21c6100294318019848aea0495716458d7ecb8bb41ac18496ae668830a5c566ce3ce36face3dc21df0770159bedefb328408df92d8e3e67c2f1c70b8c6f83204b6f402abe67a020d9a8ccaed4c08c61b6cff73d0fb242a503b0e6e42cc711966b5341d92ab8a25c1c9d167aa97bb9dc6f595f9d0550dba777b42235ffaaffb080e567405a6ef4a7be16547aafbb3fa91a1f5480e68f7be2d7d9c179a8d376d29af85bd49a0de3cdad72ef2b7d4a8a8e4bd7c8b86284d2fa6ab4937b5eb11c3efcdb844df8a8136012abe908c492b101045b1dd11009b6d5cdddc561462c9a6db43df759706a7053a2def411c8e7576f40b9a6a13ff9d54f64f3dfb3e51ff06a5da2a8dd6940b66bfed425bc96debc4d322aa2782d9dbb47e1bbc61d4aab3a3d82c71fad788c95d7b4b97f039889270bd95c4a6e13ad5380c281414819d6483a125e3f71d1288e67038fd40cb6ee757800c093d00649b5f2b9963f9e238950b9070d739c01792fd967b2802061eb55f33a2ad84704b0ce81ad5350af45ca9c6d16417ba5419d2f85ab8b73953c3f5140895bf703dbcce5c7e6e02e9d372e1fa8df1ac78de1730715dfa1c82e5a9cb3227c18c2aa38c1f5f81352805bbc702d2d0d9cbd34b2253d62646a5af9328eed7f2af941a5ab8d45679dd21a9cbc5a9afab35648b4f7f5163fb808201b3cd42d67ec5a6899ceadb53736d196567d54301c1586043c9c8de0e377a2758e6ee6f187bcd0679578a19e4a82ad0549a39ee822c0fc9ff5369c035bbd2deb4d0e959461709cf3b3a989a1789cbc6ff2ec1c25d67aed18521cc03db3b5db949c7918ead367000f218ff5a47e9e9add2a8b6cb28bb695140f693c4c2100cdcc5c1e55047438e57ad3eeeef8e2bed754ade34e17a1c19f09b43cb21f5f64a3aee9f9e17c548ce7ecd12510d29c1de638533ab0ff4dc475683004584c0f56cb8ad46f0e825039299be13eb5fed6b3e9d98118092a25ebc3d6e32cc7280fee2d3209a83985edf5ec51c548210fa92558171f3a7e72468e76ea786ef76cc90f964e18db7d99c8c4b5a5ff5b5d72093ef815fa39255ca3ed91cfe72e464b7db066b945d26cebed2a1b005359fbb27fba7be31c454753c78678dca23b39118b4be72c61b1136a65ea0e06f9a0888533fd81cb66b045ef981546475cd1b5fedf94405ed015770f6cab32f193e50c9d526ffef341555450b31d82af7d14034e71ad9ce39ef22125e484140fad04dd694e9acc8bbda6e31ce867e6d1ab219e93bf5de2e41af0dc423f37b3393fa4daca45883eb200548b576e484d96c3aa8ea1936e2eac519129f39b63ac85c1c0366d2c58840fce5dc16520a359a0ad4b75adbb1bc591af5f26d765449bfd27ef707925e2a4ba80bd99ca7635cfaded2385617ddcbd9b864f057cc4c23ccfea197d28b691a646219ca94d0578bbe2e02e546c03b783a04fee2318b9802cc5ad42ded7281b27cc779e4d1d844c54f02f5414cb3c530fe423285ccba7995d8d0182c72bbfa73fefbc4ad143b5ad3b956a616b9768b1e9835852b54c26a132df8c57a4c7b6f223885faccab6f0448a2040c331ab95b5cf83c498a6272c3fa01afdeda350561e407cd5b5f60026f3a7543f4ee78abd7d5f7d72ea85cb13e92670ea78c025c2c4c3a6bc9c04c49485e92d86979c47fac63b9533ace19c66cf71c01d1bf16b8d7c22cd2757c34997e213d1103b37e8e143c36febf06e70ff7fc49f8e629ed9836b1f317c98680e5d16af8ca8900dd4922818e9ee0862017cbd2f3452f3f57807ea69e0dcd288573bb45eff9b54bb28804e678cbd13c7fe0884846646d209bcf407f7e3d70c39439aa20786a37232204435f5f40e80c6b762381057fbe26b897239a1301d0552b447bf45a376e40ea054cba6302e89e7abb51b66465366164ed050d28bfaf9aaa84880d375d1cf359f9c47a8e3f68ee422e290543c9ef40efa1b12c8ea00c152946dc16f6bdc899b8b6e777413c08310f2771b9008b2210f4e47960eba5fa57c576894ade0fea50057eb5716d54fabb93daf9c902bbcbc85b864aa542e3514ddd3c1c22f5c5f0c4360372b7a3f9852094376099765f6c5a8ab652cd8fcfa73af63fdcdc227c287b66dd696dd5dc96a99e8f0b0d9b839d216dbee76f565efa8ed23f79f302eebdda0771b7909c9bd79e30563255ad1d207d1be8bc958626681d7dc34f8a4460b1f337436c1949560ac377f87cce950438064ed149f0fa3f4f53c49d1a42e5358cb789015411df76fd9a4178bae1cccd28f48d7978239f60d2fd29a4dde0844a9fc8fedb6a19a52a1f1eba0a45dcc98819abaf88e089402eec6bc4aa94e38e6b049c37e01bf39b88f23aa96b3cd371f0c3eef24e73306af0f637b349d85822abb394a6c7173e2d6b2a65c14e1fcba83670756ad4698eab9740dff650b2cad0ff75b0d2f1002a3ef79bd5b9e36865a260dcd5fd2b4efa4af77fe858564884fbae83b6211f0186c3d53e9807cd4010b19546a0ca1057c95677254212e6a03185819c4061a66f006686e16b23a4f4028dbe0be4e09621ec18d8097260c22cc8245ac3540d37d10256009d3854ad92dc702c8e2c6ed3738128e16d12807d7164f051aa6076e48cdf1d0cb0056504974858dc984788c05be8f76bf76493d85104a566151e2e49ec42a8f9c22b07aa8515d51738763c6794dfb9eecda4d09eb724c33986fa21576e88fb914fa98cabd05425a85c3cddc7e5860256434def589c0823e4d0d2b2c5f206333cdc3a3166a85397a6976f1821e69f30f262eb7ba417bb68851e07aea7d9edfad5653b7bfae67ddd261382b8907334f642a9c9cb52642a717cb43d57969f25be8098b48ed080317c57e4da1b6861da034eb64de353e28176d3f8ae3182a5c90316654a14f1d0ee6f3e9fe26e942c987424ae647c9ab7cc7b612d3ca02a268754728a970f1715fbd0420fb10da9d644e6a2457a53273adcafd9de2e159af5b6c715c739a1c02719aa1a10a2101661ad01e210701fdc5a75e96236d94fe07588e4a386e1852766a063c63d688a6d60211e93311dae64db1434daff7e0887059f0d810a5608780f8f9e4bf7173123f67e8a2fab7c00c8d748e634e9dc44a37300566e40e8579ca812234232ec0989040224fa4d81fbec3c84fba57a63920832934734510d4685fe0db4653ec44907e03d0cce8bcc2a6fa694a763b455ef3499e3383c8c6953695e94c7842e4a6257b6f93f37c36a130388defafe20609d36dfd14fce2f854e51bd01d494b56167a3137f9671f087b942cf3353c441f9b72bfc03b849c5e884f9c5d2744c5ccc43006baa50709263fef4f687021b456733cfbae4b5652dd39d47d8e9b47a0101bc1bbc0d5ec01da33fc337a86a6c8b54d036bfec94bdbf2e4f1003a70f7d3ad25f15428a0382061387ddd43dbea4eaae77b5f2935a2f65b00d6074a4094080e5c0122fa9e0a8c073ed092e9f314b3be6b7da8565c22023616e171edc13bec4cb20fc47adf14b6983fe506134429013d9c6936e6219bc36cb6bc50254dd6231e2eeaaef5125e2418c1a0c3d1e2d2dba4c3fa042c4f59831a23e65242fcd4be3534ed1df9ee6248e24c848e9c9127b457ced872c5c1a2de140af660e1a5cc11a4b653f0acc40d442fef94a84ff9bde1976dc719277a42a99939ea2412198ca7fd3461135f895caaa5f4ea6a996f273415b15df993549d459b67e6178eee298d9cc5461de8d32b17e042bbe643c341d95766e3793abca21f92c1a37b1e7820b0c23488a176a477f4ab8e27d3f93fadc0a3e1a7f52ac97c822b794789860f9f3fbe50097d4c88c9aacf7373a3eb262656c012e28518b5311037ccbc1b52b62d4cd7fea692ecf320a722455024a47152f187e98e04cfae8ed958ab01d680698a77c5c19b6dd60fb7a7314af952ed9641e0765826b0397ceb0a25c38886a94a5423b71bbcf24411e5c5c0ea7126d0c945dc13da3b3942f424eeaadd2de1e5c2b748a56dc425627c2854cd4cb43748111f5f32c5e60a27e3c4817d9c80f2fe11243d4cb53bc8489fa3c1614dc13882114ae0f497ba694844c1fe50e23ce5b819070bf1445c1cabc4e461146e9274d0806605ee052c1e50e86cc9b4a88abd19b8f6300b137e7d240ba6e3f31754473b0b230c5dc60d009d40c84599b0b0487a16d1fb1771fae76ba87c0da8daae9bd0d4051031407d5e8bfc529b9e6f7a3ca4b119b610411af1bd292b8959e256f4f1de16d051bf6128be7233e9a48f8a687fbddbc50d684d44e49ef218be2bff9b21099a4dd29679c0cb3206dc33ef2db17bab6d538c80f8384d7decb61641734f2e110eaeb0118519fe644003183fc44ce440e25033dce91fa627aeb3449c4501379403b7bb3608c10dac682f96adc2577bb616fa917f8a4e7bb63ba563e9ba95d244b91517ea5d0dcd814235a3a73848dfa05444d0f1ba9e50dce6cb04355c7288aa90d3a0d53467c582376351e0c0094695480dec02361f16231f8050d8e3c0cb60bdf800c80a0e6db734ff40598c342004d72d46aa004714f5b8d51c0f2ed0614c25bc4a56d014bee393a2457698018052d069281ba44e9d811d81a7b1a8d208881ca4dd0a1a1c0490249afea71564eeb513cd860921f7508c8ccb020a871ce97671af001053409388a09568403a2c9e31cdb437a11ffcd6caefd04037b79aa6e344d8e3b86e803f61feb8da21bd2e7d2ef66f80eb6bb9edf6be239af6a00d412282de5ca1e8bb1788b8eae5ba589f65824686ac88cea9e9b206730356e88e6bfc502736e528a44c8aab60976fe375950e0f9bc9cb4158ef8ae41368d09fcc52f9cf566c9128619af5dce5d7ce8eafc8ad36060cb73b3e6b283b9ae27b4cb351bdc702b54c14db51dd8f41c0309dedcf67886857bc32a5cb3d91d71219388c25a31c3a2326c2f47a0cc0b2549d8d94f25946cb8267abad911cf929e1ec6d1208f0ab933c4f37beee774745557e5873022f4aee53ceadce754478027f72120f4cf2a95ad53da8f3aea5db0e911db52a4d0621bb73944d0690a1875d440fe6692ed8f2a5207de4cab755f79a65cc0a8026091e07411e98bae30896db2a903f9e053ae9555a8e9b5841dd740e20f40442a7814b07fa29c46a6487bacdc30aca6c65a0c5c5bd1338186f0b960f112850ce62262789bf49b1b965a6d6e2d712dab185c80a5cefe3cb76d7e3ad15ee70794b35dd828abdc2a853bf332f672730ee58613dddf5ed472609c61f0dd2b396bd907c0a55c1187abfa207fb9615a1193bfc4abfa7f903c57d57580f81b937c08e925780e6b010d8879c5727e96cb23dde3aa9f11d5cd8f297100466f7a3b64c9a05802d32b961068b8699e645dd717a9156f33ab8ca4f592223b30a513fe4e319e522a564a3c16ee6299709d88c0eace33e78738b3b376e0f712c4277655ae091d7d730b3ed78ab11eabc614b72c5c4f7074d03e9e9184bd11e4ea02cbf3a42e1da26ad3f1f69cc466cbe2631d0de70d24749f88d51c4fcc1bdc2f9d9f2ecb11ddf6435fdf3063c370b9db87ee9d4a75059122f7084043d390d7b2936ec1841bf7799dcf66f33400e3930b402a8f23cd777df6aed19d11736ad8bf0cedeb143e6eed34edcb8551271f6db4bd3ec57aef999f8d00048ad6fa9cb034a6b2ff4006282235b57fe89d2e08a37b611e78d994714552c364f6f3f8e5258a675fa4fa52cfae794fa6acd971e8ba8f488a0df4acf87c02764eca4b5a96f003c592083f8971ace06de5e6f0161e004d074d36ac56da7c88f12f3732bae92062effbbb736d7b8a266da30cdef3f07080269c2c7465e55d99a646e0dec9146e9577f572af467085af014af8119c0092edc77828e78075748d44f946967775bfe30a43b2592940b9ec427375e31e44860bd78fdad159805146996b8005d47e9014f199477e92c104cdf0b26601d263467aed865707037a8d881c4430f1a80d7e38943f96690a2fa669748e3fcebfae9d39e972fdedb96473edd827b90d6b9babd03021a1d61fe1553911717829fbc2e43f8e90fa5a2f078782d7355b432d8b95d47719d8dcd6317e7f22a7f50f5d0b90b604b43f63a416dbd3d19d8bd328c70122e69ed800b3ec0524c3dc59a5cdf8bd46a7e4fd468f78561bf6ef9646570099472f4a14650ee64dd2ab92c8c2ca5652c57589c46dde4ac62be1482cd720665e6c5946f336e12b00cc6756811d4df9b914495f6cc69d73e95ab9378b55fbe015f00b2e7ea1cdb879aeb939ad30a34a3ff7b19bb0e98da82dab5ab7088261d637cb0d01d603afb7a5e42efcf220c64fe0372bb0c8248f953c24915932690e303d5f5b04bfcb324f9b0441193b9fcf5d52b9f22272235bba35abb65fb31a16cbc488b21ac0a56cfd1b99c4e6fd4e03f29c58b5be158a4ddbb2b059c41a5731c353c44ff8660fcc91553b6b015d4c67f000d95c48ae12c65c508447c993a948a4afa4d6f365393694f767434d6124a93b9787581bba1a08bcf87441a7d7a1558f7e8b09e2c4a7cbb170dfbab6ff350025267c8d8e41bfc516cf3830af14b4b405dda3b62333e9d6239a62886f2b3ba0fa2dae4f8ba614f1aa4939ea11d11509445178b82e85b2c3e2b8383d6feedcde10262ce4f8bac8198b25cb5e8305cca32a57c07ca646b35b05cc3516af79cc63651242ebae8ceb5d9449e530d5e1abe6b5420d152c714c9f807e7640aacfc3d862cfbd569f21c318c26e08e603d9a581e3ac97726378d2fc2b4f95b7c155e597f80da18d79e597c47ff47772b84a1d8c03a2af3dd0b657a44ac531d02ee9e3805bd71ea0d7284024205880e90fcacf370330b218c8e12a7c23aefa4ea7831171ebab8a6da8437147a6564cae823fa1da0e16840c3181f5eafa8ba1d2c99452717c5f12d2476cb7a890e755bd33dee8092bdf9191df09b998d30d66d0a214ad13df6b82131f349004afaed66949c76ef2ea4098e4e4f113968fcc712e87646dcdbc30e343ee18382f480bb6a065928cb1ca71516ca79cdea1d3977076cfd495d22224214ee4932fa7516dac89303a9da5382f82b9cef6713dcde915048f904bfc0304380da8657ef8e117b6a7cf09e44a286e6922eb57a6f05267a294029d78ad4c040543a721c6443fb21cd2214c64d534910434264afc02f884a593f22ee33f779348586e518de776c915cce9a56c353ff0d40f23b6ee5cdf886336755a317a9c66abe3a27446d82cf7ebdcce0ee871c9705a3fc57e532052d62fc43404a5e7e5c5295cf93151fb84e92c0bab38e5543f7a295090ea53ceef0b944178328b1ee5365917f82126244391701d7641b22d0481f51c42546d3bd7e73d7c46eecea1414d3f0063821ef3c54766706e9eab0d67577703f50c97ac1cca1146845cf22455b295fe74014211f97ba1f08dc51f0fdabdef50b39603ebacc47f1761635600d1dbde0566d93ee8300e284f654a95483463bb5219ecdc3a55967ba8b8504dd8e254c9efdfb07e313963255a586c21c53fd5852d04a2f4ac9008d7ef87988a512a3c0594602c85ffd252946f3067a895424d362650a02b5f7018b63293d01a914eb50217a382818c9af0234403d03781886fc00ba5f73ebf9a8ebb7d8c9754eb7650f60ebbbe65fff426c05ca24b504aa18934d2b408113b1b6856c807443c38505f9c0748eab8e43d8428a6038c01d65077e0987a6b097346b9da1684b4e0aafa28f7b96a2d3ce9a2d6d502ce2c6b32f3a96d3ace008b3eeca23d34fb2a3791a8b2c4d691efe6ece608546848a407e113300b0a8c9daa8170cf06102d0bc90abbad75cb2e45c2ded4cce00fc11e7426e4df7f089166effc855fe50063c9dadf0515c502dbc1c6e41feb1c999e62d1c440f293ac1fc2a0daed842f114e0d1b69e05dbde038d93c0fbe38979cf560a0b2f752471633a0acff2181a0da3cbb8508b88b4d8275a2de6f4be5191a69e76cd51df7b49b00d15d71fb47b28380c9011649a4225e8cbc7a84bc97eeff499e2f30db11e47784e835cc1da3968f1a2889eb9e709c5c8b672b549233c93ccf9ab254e7b95e12a2f42b89a0eaeb838d86d60d2bbf1e2cdd68fb906a35317d10dc71450a24c27cd00c01c36cdaf47537b7be2c64b1787f72c90044bf7e54e5f70806500dc1aa424d06ef26a26100af5a99c9347172dafe468a167ebf971deab491385fb86724f40e255c91d42f115182cc45818ed8e400f0e52433f63be7df496de5c6e633b8bfa7f251813e09b523c03ca13427744bd92ff450833dcd212c4a7e18b0a1a8186d4f3f2522a874b146fd7f0383cc085e258bc9b01a5e792b550e98d586acc68d1c446e11b452ecae2702626873a13769761014890fe13ef799d4544f54f281ca9e70f1697137f08f6f36374462a80943b956b9eeb4d368ca8c50412ed4cbe91f02d5182f4e5834d9e99d26e6f5ae4760219f5f919ec754f52f54aa554dabb80a2d05dc802553eff44bd2b066920c9702f68073e317ebf404491d441f4773c51f086a7c74c71c238628ed22f9b244506d56c5a7cc1900ee48d3ad7422ff6325b8aa356fa3b4bd0dc770bdfe1ad2f043f4d22c314da0631328389079aa7a6bdf1434807cd2ff27e45a84c9103e05a313ed01a782916df129ac0cdc09d6afb1b68f1da0934a60807c2f7e3490e9a280b2f84320fe0f9019a14ceb6e89f70a5b2e7cff6b0a8230ad2000d277f7fb009b4a389092d67571fc7a643154df3eb72e9ed8546acf34ebbf66e2595200a1391c9f4533110713ab1dc636d5fd0fdebadf70580d48d81e0846cae2e815c2ce417caed2a98eb2c7ce579f2dbb12a8657348cce6c03fe0535bda1cdeb5398885c333b53b9328e0b7a15762e3930729b6cc504ad5861145af2407fd3da84005e81d2edbce1bf740471eaafd031f20fd98207330fb11dd2cb39781ae545ad07c856f0ca7f72fab5e01d3e845155318f5b0f5232a0c241f80b37b5a0f2f2a88e83d6aeae3c3b59d9c35029ab42a01e0e06ff6b19c4d231ca1891b8aaf9c26f83cf875d773f33127b68144df20a3485e82575716b9b9c9132c8e6e1cc65040526345c8e462c028af53e60bf7e7e2d94129e0ce0ee5cbd48d6e1eaa0b7627f9fea32004da3244bd8c18bd36db99b3f130c897d951be44a29a7e17e8325ea6b7877eaaca3388d10eb80c922cc414b2e00c46ad9875bbdd6cac315e783e3e733ff3709013758507f72db5d5ebb2207d9f983c4defaa8f97fc9f51e3c9954312068c1b0c97592c2832680ad8b1da2f525e96794b83831f7f2cb513541e8f73d2a29bcf8e9a96cb0c324add24cc5c3d68f46f5a8e95e475623409398ad07c34149dd2930f46107ee04afbebe6021f0eb132ee26b25ea3f007519ceb3bfade4aacf05613a4ee4deb5445601cffa08c343a81c40781333bd625ae83d02a526f7c707df990989d8ea58dcbb1804be485401603135673fc0995cb9ea17952e7fbae8009beeebbbc6ca8a8f883d4cb4fa7b15dd7bb591eaba97ab68101c500f286f18268f0f89d5da41c3d1b740cec48901a53485d0d5ec1cd2e1a22143ed5ff53fe64aec677e04ad6c46ec790cf1e833d5b2aba184eefb91d908e9e26c16e760c829a6fba0f54b903ba26f36824d74201694cedd93777393a14080ded9499126f4c4e68445f516e851d3fdbb5f75a21803d0db840b08e8381f8be0994c4e8c48bbb41d822ea176a943283b81b744495edc6640a7621e4679314b5478cbfb7276a126c02e6a7edcda1e649c3f81cd828c86023a7da2cdd5d1f29a0f66bef9fee8691b490cf607c5d43e62a8d22009651cbe17f7a37b9f22514eefaa204e5b8cbad54a6dad9b0f0ad7fb8cbe67fea0cd7ba89783947f80141d8190b8a29d0f5d125ee998243d13f8a05f4fd0e159248d3b67043305ab060a2487f3c14b1cf83461085225b0391d6e8dea8cd354bef35750574993712e4934668e073eabb41203568e414c6ba84125d3fea368db985647b847ccc7f2bd7b03ce33ecefd74aa14a9ecb040d8f73fb41f8450c6b1fd6a20e6e1075ea54a4ac6a514af768f15bfb8468fcb2a51e6d68500913dfee0e9614036590290c987ef36cdf57246c143d326725b9af2dc5f971e86d40400169a09e71c9fdcbc171de7676898952855eb288ad5087507f24106bcf236bbeeb0b02826dff5421f65f68a65efd0952a49168080b502c199a8ad8b1faf10d54dda229cc221bf4c86bacd072f21368443c7526343a0cb3e60aaf8f95c60d752f093b546107cacaa8953954d3d4e2d238ecc4237aae3be2c39c87176b6399011a9283b11704353ac8fe74c4415be016391d5ca0f57548bbaea9f1b61490d89fc01ef87efeeeef93b4e869a7afb43fee892ab1b182ed9652f6ef777cfff09536e62030796330eb50c10b1242d26624f651d5e1f9202094ef09cffabb5f69f4e518449817c35109ef33e5d82359cdd4fd1325cbaad8f924007601ebcccda32d82b1d7b15ae62428dd20a70433740c2e07407d8293134ee904823bc0b1c8528109b28eb9fb9a2d5099e2abdeaacac73181bce7da09c3c4d78358e9afca648695168a25aacd695225db9d99eebce08649807920b6f6769a0fccbbeb658b1961604d18003acdb746f967d701fe3b660a66d7fba63471477a5a447c64b419182a5fe0292a5c3a5304a2418ddc1cfae8cf2a00790afcbbb2a421d3559006fbf4582ebe5a61213da07313cfac361efa8bd80e3e7b002fb0cec3dc57e4b75cc4b9c889222bfab6eb00a3def1c83ece3c73f0a2c0f6437b59c411a9550eb1e370bc11c92650041b1e48fbdaf180e583accf205edf8c9ae2533cdeae1c97e5a181deef5332764669c1bdfd37214363f49e0e34a29209b4206fe69e628d42a24d66ce3133b4148ff83f10471860e9a88e6a34364dcbc69b6d43477ec5681ab1a373bc369094814b6ef6073da023c18ba63e60595b6f1835c5e0159ee4801e69739c0b497e44337168ae2fdcff46278e04e19eba9ae9134c457a7483f159b404a10bf7881bef02321bb2dd139ee6dfc769172faa45de0c0eb9c5304fa2865c1dfd85e2752d9e93043fdc3f9c2709083fdfb920453e56f3e0e2b5c404caa427f6b62bf252ab2389e71c1f002e962c5d6593dc5850c232e452f082e34729a6112f62d4b3e327bd0cdf3433096119689136677b0ad1df65214f8b5cb411eece6510823c4be5c8ea5feb06faa3f5b7dc9745bc495aea2d989032637ea5902f07cbcd4754a9571330ab4e9763b544506ddb03141f5611599604aaa68758e05116a957c3fd81fbc9d099a32a59c0baf28c2ca6415230156b17bfcb461afec0720ea20bfc40ee46e24cf7545120866052954d307035089138d6db5a3ea0983309aeaa059610b2e48fcf0ba7f75b3c21dc966cfb52e310ea93dfde17d15e30a4c36fe21fe80427d5624b7cdfec10b890f8986400ff5123ca894c695af5e606d16ecf80877ba1301bd5c007cfb55482b2e041eef0105e11aef203c056b5cd9f2af6456bc7983c805d5e25aecd7ff37127c66228131eed1926d19f3fb567ba9f101f51de0de6eeced46ef1e3a1b667dcfc51f0e2fca48fffa592fae0705fa38c37a3dd12fc4d494124bb61d17745162d04355a6165e1ccaf98876504d91503f52d69837aa01141b07ef1f5b8f3ef64385e880f8314e2707db03d7b5bfeeafc25e1444cd80b272082172ec1d538766a776563aeb353fa0c304ba868e50c89a7fc0430c5a434750c87e2e1d28eb0b7861b562860e3589fca5e28276c256e5c031c4b63c869b1467c2a583500b01b5b1f224d6152ffb93cb136b17a18842fd22794fcdbc3d4f9ac74e87f25c0a3553071f0f3941183a2be429e596eca01cbbdbd4017baac12e5d574ec1d18cb43e0a3f481c14dcd4c148a07336782dac1771bd7558cf503581366904eeaa35db40fea0e2b2ce4fd0b14318f399289318d40ea2d497c5c155408002395c034ad51a1ca8dc3e6036b583ff250b3f04ea88f8e582e1c5913e76cadb784453857a30f95500b903f6d69384e5b3badbaa31abc81df0f100078d2d97535d72870086125c881a1c56f58090acbb2cbd83047adc7f228cb906f50e38c675772e7ec05564bd03afec600a8760f59b4df1f2e202466f5f9d6e94f3c84a747002812c2af180a3e121f71c95dcb4b4e316c1bde2a1f6e39e810ea9ba17c840003e281c9eb33433c325c70db23bb5feafa72c9d7aaee261cfbb24696dae8224083f301e36d83ab3e2254b09b7e4c19934cbb5932f2c9c41ea6746684e2b6f9dbc1d8451929bb4b5b231a27d88637f030a9fa6a58ace2b8ffd5e45691e60d12f5b7add56ec42c2dcb077ee54951e6f08749948cdc304c865a8bead045eb83d7d41686fa3a1b728ec781e6c9e1b4323093a3e00d5d11f2fa7c32ae5440f369fb551016ffd13d03f9e7cb19f01e3f403cb0410b68921eb91a829982dfb644197b6d7f490189432beb0654a323d3cd5e00d062cadba4ba8a04ee50bae965a5daed582917f61c945f7eecfc5391fcd0e85ebe651dd63db72332604db17e1cc794dce1200cfff72d559f5f05000d38a572a48e64ed04e1731f3c4f5c06ed523792d88a979025303c1a9afae0f5bd08f071c23b804df846e637b48b75ed768920486ce22645ce92dc204cd0d0bb939954acc21375d1bfcba07a91af317991576d09c6c740f8f42f78720a351323fd8bcf1a25d1a6c0a444752431d3b70e2b450703a7e7782c7c223eb7f71bdcfac4e94a9d16aa837bae2b5e51083e161dea16a2cb2de22fec84248b79e0c0860a1179734d992ec9a475d1bb368796e6a09849ac3681a4c14fe523196959af8d7f1c787b9dbdc73cd6161b1ea4a7906cca2735bf5e02b8529b60ec7fc4dd776300dcf9886c7c05fbbbc395b0e9f7feec5836570189082c359a738a751c6ae4820e85b85786be2eee19050ef3984f9b943d45c3d2353696307c74e768156d110f84b001bfb3d07efee2ecd496168cb7e0cf101d69ad9acaab25a8c961d74a018d226ad860172327deeef45ff13624da953c5c89e63cff1429a344ba2cf0d387236303c6e0e613d45dfe2dcad4d23d437a431e8f0b4006d93d6a5af9c0098f4114935035bd9dec8508f38c19eb5042a0cec666d5c07f8968f8548b67cd273b28da08a6e62db260dbdbcdd00bbd9f3ed82abfbef828f252b26c3d6badad0831f0461e59a6bb7b8c92506c697650ee2a5e03584547221afb1653c2b1a1f2924706c8267d72b2735f63b2a317ed9dde1ad04504cf43caca40aee9fc449db7484eef3b186fb71df238f7e180720ac096ec3ff3540ac4778bb29ef15826d5c599c048683ab2618a26f144562c4fc86438a6415566067859d81fdbd3fdca0a47db487c68ab60da0c074d41e08c89137c84e2aa9645077ba37dff0d233a8296dfd7516958a583b9d5b78206b334372af74f7f9e00973e89b97e2eac055eb8ed1e025b4faaafecad7833daea6b851502e5e40de1d420698c38d923e82b2f804728fc36604a18cf0d0dcd6b0d139724511fbfae5b2474c34a99ca5b73ac26974728cc869f61ca1249633bdc474cb696dce6a45a986719427dbc77c47a77431d0f943e858b254c4f454a8d2a00b19414a47c488b5881f177382f4d07277769ecd7a168d51ae7c5137b257f9881dc6c907fe14bee0fa581a3ac99744a049ae907a8eb8e0e1e2245e1cf6418e01a75dc871de2d01c3bfaffd3ccf7cca60b7806e9e1e7a11299c942179d208e78ce38313f27346d2f82c38993f096e3e9c860763938d4608e50c8b7e0cb316dc881f6e2790591a71839ebf56a3e16d93a06b4e87c2bbdb741642b1d3230d051ce23b28098a4c992ba945329753b5cded9dabb01834389df448c45732d59d24b68358375bf536029af414cf5b68590e8a43c52a38ff27b7a8a4f0000c772f753fc2e73ed6cd5ed2c44891a1aa152d385d6d4c741c0033444777f8cd73dab8fefcee4c737e16a59ed703af789f0e98f101dc7b48fd6190c0d94afc1b3218e8aa551e5afa3ec479fd0ef3127290cfdc924e0495601590d7120c4d4086938107d535109dc5b52cae3f1583fe2cfb74acde6698b86edeb25e31b95d6c386063081249a271617399808c78e3db4f9a6d0c107e6cb20e6645d74d07af95c5dd02d9fbd2f71b75dbd4c9d70d53a260fbde87c99f74679b11d3fc07d63c1430b51555cfe7ab1c805161f852dbb92ddec54bb4b4382dc550dc7818d9757148b540707e8a64eb07d3ecaabafeb458c4ea6e8f27a84a1272f69b37edd8f33b8d631ea57acf15504932415a734262003705435016770952b73f1129beb1d69d55bc63e0959aaf9b8718711f2e0c541a10222b35f485908dff2c75fae8a02a5ac1511a8479e2bcaaa2ac54d77b77b055f3d9e67932ad4edbb01d9ee672132b44565f025cd65ec30512b790abe7f0414d2f10cbcfe8b55bd115d4f1a04c8c930d2a4028a17df601e225d728f3f81bda15b605b97cadb4bf6aeb8629b850eded85c0820977a3a2e3a1f72e2a0749de74cfd42dab711a2a049adfc9cca3d3d1bd5e7db0fdb070e21cc45c2f9c974c94dd74f7865d736b9490932ee34a62ffd7b8b9444248a92e7a4bd9795bcfa7992a47219cc74971c2fba82e1e4cb96c07e2aa6b09ed4b2d8daff695d8686850ad4281ba5e6c36280090262d3553e9c3ad51db066aa818d67276c97fd8b75826e46cd9c83cb54fc81cb23dd2ce744d72a92ff982b80ef90ab58ceaa3d0e954a2ebc8cc61d320b5870b9d33771668388b5920e14465815c4066861133b076210bb07052ff836278455104220749b2f92ea4c50a370b557ff74f51ce4e3b0387b67305e628acacd9d8d8cdc19071d72b3e012d715c735e976bc49dee39dce08da5c37311a2b758c8bf318c58bd37b0bbe896e5fba8ddec696046a676dfa7bef69bbaff738e05db620599299c9c21f88ba75405db8f376f0d035b934d31184eff2502862872d5ad285122ad1096e387efb134ec6aa3fdadc41e0cfaadcad96c623d220a2f076bb9ea9029663949a7b7e39e16e35e383098bcb92c300993242b2b2b2764842d6bef4e4720ada31eb1e991c6b9ade9b479074d29b69b7101ab7c72f68988c528b974a4d7358da3fed4d22de1e1df9dcc5c9cac097c533c618c0faefb2beeee61824455cf44ef41b1f2177f0b03e89cd5bc2c7a0091dc8ce88ee68e49b0c50c7475d72833bb5d8094a7a53eec078517a921a29161a4960b9502f1026004c09e4b7ccecaba7eb89b0e8d2003dba8ef4764a42bc4e1e88368c516b0b71e57d0b11ffb98f3ed287c00f7f6b4eaa791f75d8717255cde4d67ea2cd798e4389e39323506af4b71370141f78d0f0aad78a7d3d728bea44e3e0e9b179abb298c7c75de56c2046f7e0bcffba590e346e2dbde592215bf9118b0e8164440ecd7988ba40479085b5cc528dc35c2a65e9d11f34101b8c1855e2d08bed510d225da6971ce754680d307af32620c05af398ace2ac5bfdd823883c17c33bf337afea7593b8cf76292b976155d42441948114b5ab4b007736f186330745cc0ee667755ccfde6dcb970475c78e329ce4bc0c16d9016572015becc0daaf0241f6df4860745db500d0b09d51171ea0009dc6369ca93c5d157d8dd447a01e77603511d3fc51613ad37f2d891db778dc9ddec17a8c73f1134619c37f71d18cbb4ca400cefe66d67e54e1a19ababeef09872329cfa893fe7ac0187d1688325f04773d560b121482e98d515b799e93879e998a1b8051ec081a543c8622d82326607076e77ca2990b0ca1cfa6c090059c4058087dd24e24c6abf0f83d453ad77d315020980b3785d825d5e54a5899572dcb85d62759faa5142659072ebe28d1212d0d646dc6ac91eaca8313cd2bd1aa6454f34e3a2eaf021dbd8bd7f8a0618c23ceae335cc6b222251828c411fd320619ac27e37e37af456d6f131660b66641fd923190c0874c8dc60d5081f4917d33d81be350b0edc3af9bb191bb77cf8d6f082436dfa7eba3213551e6067c6f2e5d29f2f212d8e32a59cb4cbb9ed785089b57eb708b893bfc835f535a56f947612f8fdd45f130bd3cb2433bd6f85445d20a48368c571202a56cd3d2c5eaf5008e2502c12567ace1ad28fad3156decf5ecea12e428e1032b282471acc1ea45fe5e6660a9872d2575902d82cb9ee810fec0895c2a1ee9af35c6a9b94ec262f809264c78c4d1fac6d1bea960cf20963f136d4c1a0085c26a3e1c39f6a90104f639908b27b8392501238201e4ba7db50e7c21861e0f7f56a750155a69b33718fe079221c4e5b8944b61890b91943a26ba66f0898c03050946448b649ef51d02e07408eee971fb6c0abbf968ff6f1a8be7287c9bccc7f1c972ea8fddb94a1ee74097875263a0bb5bd9f30c01d714161cf850101fc736c34c069a0dd33055308c68a1b1b80befec350bc3b586774a55b01a9f1ad48158bcfce4c6097d1c2f49355ebe8c4faf50f395d0772c5148bdd910a999c72586262e678f29a89c085f16ee6d98d6cbfbf500f7ab318eb5958c33cec318e5bf308b178d64e434dd450822a9209da4f7dbc4a13f6b561c768f70b7280416be8d04a19f70b3a44406be851a50cdb0f53f0ff2db854c17ad0a6db38721107650c38d8d4d0f21dc706319c0f634337380ba526063604129d5b8819d66b0c824dc40917bc01a4ea761c5951a7aa2e0e124ac65d4e216632d39bce6d59318b5a38c4158e91975913564a9cc6990beda0c3c0f4a6ab6c2ac26de1c343db92784284e600389860ff3944c500e3205a264d0a36c3df74d10e0288770ddc88b2a42224177990fbea0c9666337048e2eaf4d6c34ee969d200fd81393c4e4fee76bd3ab2b14208db0e0ec0b1d5e9509694203454961c835680534059af08f6ed9b9379da5bddb9b734e67a9f9b6397b59a062660f3a399ff673a02a4c76bca47b4c6dd8c787d2988bde85988a41e562db79ebb8b5895720c59b13140cecbd38bc4d3a175f8d1c17fe74edff9f633d68d4c94d0de4a5552c5876330e83423432de085a2035001e25f8123a721af0bb84624971cd6878243b32e7811696ec35bba5911da016d7e995c3083b364bdb293a431a9578d18191058a1a16afc708e77cf2e9c6ba43e4caaa9e77400e4e1803d3fee1abde5e875902a2e485ae6ae261a97925b0b3aa51c8bb27e6d8a467aaf24da52ad38c712ebbd84d383d862ab45f772a494a39b2e63f29c69ca04cc12bd08887dafc06d6c34e62fff858ef2e93c04baa8eaa5c553804b20c7013060e2379cba53dce956d5c70f075a0aa1812094808ee67ac42148dc6c04baff2cc406422801dc81b8a95e9c3a4f3e66337038c79bb7815002b74b3d4e61016d4073f3ab22d2ca298f9c721bc228bf41f8799c95c4efe3d007b9f1dd58b01c37808a092abb11f0f67c4ef87a5937184a5c1bd5799b294cc50eece8a12c5c54fc67d5d7e99c751822eb138fb38403064e896e8c43394339d2540827c7d79110c61345096b49750105fe9162425e60990b119c3394632996ee74b9802377e607acdf2be9da5b48dce185f8d64bf046bb5e6834eee2e0b814fe44525c881029b020431234f6599280f73025c0f5a51806d07d9ddabec71a654adc3df3213c70f2d4319ed8a64e473b665ce98ac99b8328ed7c1d5ffa62929d3402d15b4dfa58e392043df5950d9caad1ad1d948e2a1d89162330cbefe198bc827fba714c965694d000884afefef8c66b471965e4557889ffe69b1605ad607c57c7cd9458663946d71bd69dcd90a17a2172ebe6fa0eeada3c3d44d22bd909f77e4e8370a95a7184f85d485de99d8ee433e35d68e6f1c6e462e5ae4345f14ea81d16ac8b6aec723f4a30c5f133f3d305a71e0a96771dd1d0c40e9f43b2588ed135f5d9162a8ba0d811aa3587f1461ca4d2138319c5926b8dc99ee2ed9fb81003f016ca23e07e7dd81fa15b42359cc2e1c8d4267d6ba0b3e05324d195965885f2b301c1450c6a1939bee983fdf9dd5deff0f284833a2452c9b55d29326cb76ecd8edbf71ecfbccb1b9275ec4117b491074364065f8cb444310189ea790d5dd0ee13565e10d8d1b312d8f35dc072dcbdd6b6682c31005e2a656455ae82e98630be9e2804d832f7100549ca10947946406148c93e573b733abdab517bdc18a23d191a524a865e0daa67a2eb60c676267752b9114c2c35ded09386548b2e09fe767dca91b20e5858b8f36806836f68b4eb5a4ecc91bd30ac14df097ca3fc112a77d10b82724af65794bc19e67448d1961909d6fe62eaaf27b250055555de02a7483296d6a69cf60c8aaab0ca03e51f86b4c19b0deeed071652fe050a13f2c88053a1e29d72138507ab32a9acd88d164445a37033f2a6bbb4a67cc26a8ad2898ee3ee1508d2df8879138212ec6a191653ed6452ad82360bd83df9a97245fee1374fe625ab77c015d2f26b080a9ec3f4cc52c4f47c2f75b67275b832ad7a9ee3051270023cae901644339fc4c9fdaf19df0436aa86f20b90553189fe4dddd7da69821f2455cce0cbb13e760141cf4290048608d497e9999309bff73e08c7bca6f958562a527b7810fa787ce0d034b3e2a9c52923e28da6bb8bb11fe8ce716aba729b29874bc84d2693e464bb411657296f26a08a09a054050505a2e0a25cd18f82deef6231af5318c48abdd633850526e5d87eaa4587b0f0c000c3838d8d6ea9ec1ebe42751c20fdad78a9f202b3987303724c523e12efc5a4f1af75b1101acacd07dc158294e4967194764a073f2402fcd23b0344d7fe0e084accb17fbdf5dcf572979b2906d78324b4dc2ffa1a31b49caa3dddf5a1e5027a838556ca0fc201b4fcd7abf1d7dc15d6b9e0a6f6753c5b65b0c63084bdf76014f9397cc002219175e73086e896ddc07f9d1f545fe60aa0449543de152e32b515150cd8bc805679a7005e4ef0d90db345631571a7b44b9c02cd751b50294cef367463de6a6c7f31eb1503f6a543e4a3ffaeb058b1f2b8e84d36a41619b8676d0806d9fb91d8526d60212ec7e1823a180aac703f5b31a9dc14d63ea3dbdfea70210ab47b0490f943c68722ea3a96ab3bbf29aff05610a776ca2b84f7fe10de2ab465147ff1ed94e1b109df49b6e425ab429ae22db7294efb327c3a059e18974376d7a12601d2df4cb2b10251fe0ac5dfc1327b5a7078ab162bd4d5d9656d46183d37178f2f2eeb8f8186c92008f6f40b70be9d67bcf914d4362fd7f6e8155653dca1776b69f8e505fb3d31798a61dded9cdcc9670056951b7689e97488cddf4100d13dc98b7433050b8950319d2eea2e804fb317e6741f7b85f7e449b90f6ef3ddfee00461cfe514bb20657264f78761f334a6bf901e05ff31286b019cc61907257207af3122319f02dc8a490a1d2e8c76afd3447abf06f90951ee0ea69d8c9bbd421a78d2f081678f2b81a21457d85cb2add816e7e2776bc586ad6b02c35364aa6fbc9eacc768f4ad3a3c0b7deaa7cedffa4239e6a3b93ebab488ec0ddb3ba89332384fa15ab0aeaf84a4f60a297d3942c829a02895af43b5487d9048141ae03754b4e016e130598dce4ec9cf76fdf72bc46b2ece8d038ac94fb08a826c682d5cbdfd0cb6fb33cbf1d915b20d734fe780130454761a23fa2cc8c808d7b08b63d1887a7469525c86be429726b59f8116bb68252521218db8227ee5ace596833efe1bfb64e06a14850c7d2b50b8515acebfc1e969192e9466e984d0558f9df617efb784bb9c5c3815aaddb79e423575ba25d8dfce4efd6e44a45b23a27acb882072bdcc2dc73a5dd1487eadb228b84be564c0642936e884140886e07a335f05ce2e2cca3ece60cd69c4782018a5122e7c2967a7966b90b1a3ac16d11b0f13e5bb53518307add32c60eb1e94b6f29039997ed14afe3731073109fd52a7435e2a4327ceb8bc22e1007739796a9b811293f548d3e3277f851bb4b2c70ead7309c9fe465cfa797883022c7411883175217fbc5555b4c1e26190719f1ea1cbad6ef9be7928fa372cca18cf6416f90e6678ca3f677bcc8dc549c74ba4e2d180436a5d73e567fca92beba4505b8381072c9c1dd0678b5b1f9d4ffac3b1da07c69dfd8316053d6c5141ca604f6c29d5a2cbb76d328efcb85640835e6ec94cab9d19d23c442a91f9a9a156a37cc2bc6bbc281710ce041efb9bfe9daf9fcff88032bd317f57e6997c054fbe90195a3ad98810294254c019417c78958050fc23819a7cca88a1a244ae1c16c4e435a875cc3a7ae3c45ecc4ea1f65a258fb83e48c6bbee7354e58e6159d1e4e1a30755b0c8f851174e7eb3cddf961a6b43536350f83b8f147513c765ea4dfecaa206dc77bab0dda50b38f75a7e5857977edbd1d9e9175493f0a00512a2d363d0f82d5226c3417f3c1dc28826e1fb526d318ff6b12660269e9d5cd00db251c744b792f915b5a5426c7f5935350d28f5a6b1e816415838860bd01fc0b3bc8c76e8906767a670bafb421776bf39f21df012db0c94df7371edae82dd9281599dba1837ef97f0c506aa5d48a242a406abdca169d61af8715511e5e81e4dde43d422bc852dbf574f74f3e54de727cfc0e742311ea5d5ce6bbcadfd3622c60f06e0d6e6180e874b27d62770a5731b2fb7a41f5ede4154009a44924c58180f7551cf4aa33e00ceec9ca38bec782d4261e1c5c5c7e8640b147b185c7261a0aa82c1420d460a1fa3b94a7f850b0f3c3ed64a4ee4d33851653376093b17fe983d710d8771e001b08a60510407313d566121b587cfba256c4e6f2c837b5e683f6ee9282104c3d3581701192ca537e03a5debd470911d9a956d82383f626736f6a4c0129eae513dc538e5691b4834a7381d1bc5aeca0dfe27bd2d0bd5c3aa7e1d4225d8e7f679c7aab359d5b9821803b7d3ad8c1be0964626f56ff0325bad5325ba1ed06675b40eae6ec48b6a8cf4d37993f7fcbd2daf47edba7f82985ce7455888578b6f1d82d36bbd43cc8872e16451e13a0956d3ad4ce8ba370c40a096acbfaa280e6581bb5fa885b35c6a4ecc54ecc3f6fc45fabcf331a973871865b67d2983fd419f0644085014a0297cff83f8a904d2e9d00ab931bce92efbd1946d00e96535effdebe9841a146d05082735af0e08db8a5122e8f6d7d34265c25454d7a694487d5ed63892d0c6f243340bd0abd868dd2e7032dba243240b7eb0d63cea814339e6bd41d47f93912c4d755f3fd4c083fc5a58f94977e3ab01e064e376fe96e4d827bb0706ad968555aabd10ef7402b9b3365a44f2a832be7e9518143e5e1d0a04797e0b561eb7050e3e2e75b56ff594972f5b5e86e2fc4da20e3d2ec989c185f3c8d924865efddea4130250920d346a1562973087684eea441367e287c21a25241abf0ed3160cb4fa0d7dca7a1b468fa97bf865a902277a438cb4d7ab11afb65e310c730d6b02a6ef50a69a714a3779f9d11a853b6e9bbd566ae19e1c4efdb2df4101e085d1ab4ae08c28a0ef9aa62f1ad2ad8c09bd890a3483a29d156f1e7fa009c15f6d62bcf3503279ddaf9f8d92c731d833e34f9e2fbe65d3a01355b02d27ca9a4a962a1a9254140063f2ec3887cfefb78ee9c267b2098fc8e9cffa7cea5c23d17dde64449108bb0d0364c1f84e0e39384969567a6d828c4775c773106a0e00e79e8c020d4ec1f88d190e54f1405f9a62c10e542daad58363265d7da7bce4f8ab1b1e4ea0c2dbbfbae68c1219d82bd793458b9f8ca89c8245c0d8bc9b5ce5513129b56a156b83b9f37ec5494b4216d1ef9b50f1013ea1824d63e13915361ca92f1a2ebef8b59428b13d5ef248973f65a16d0f43779367a1b2b705f46f9485023e2853dac693a5c0351d450429c81712e56037e0e7881ad66ec4c3ee6847cd86129f229625d375938f04152f05a7c2a17451d85377931e0d1dc6436a704fa5200f912b3824910fdc0dccba2f5537e97e998c21fdfff7fad8a7d4e86e13a11ee95d32323b2a302b4449e8859799f370a10deae7a0825971e17df283898d14c1edc988ea1628a84ccaf040946aa736a238052343a68d5f23e6b46523d717ae3116370daeb33ba406678356316e6b0c93623856ffb6127e8350444b5c8f4b0613a3e7a65cdd92d4921e92e9737f2117a8f96ab5d1de6040989856e6f84cee3122b299e9a3af465f6609fee78050f22a3e1cbe7a45ff3bd3f8c906e341dded5c879bbc275ba2fe2aac70070e4fa3ed797b8c827fceccd71caf3bfd155c487e6e45d09e3b6dd9698e3b25d95edc0dc0dda86b44eff2eae89cf68880d1d1bd8d94787f97237c95566d528778198a436e954527f4a90194ee827cf51e30446923483fe97ca48330b413e4f91542c9c19eaf490c3ac8c1f3cbb496c1968ffd7fae61427f995c0f6bdf40c3605207edd7e5c400ab75aab687ea61f1e3f65cb7ec37a92ee95ad7b84b6c5d1e0b058d547e96bb6ac9b9d4ebb086b2bfdafb810ee802544ea0392f678ace10a721c4a7e7c4dec8e13c68a237a9aed7aec176e946eb34aa109f6fb0ace901d4db68b00c1775e05d9a13a84980f67f8d6e88d7dce3fbe11c86664829ca471b273b7393a7fdfd80d9c34856ed10c114437de23779cdb50375897ff1690e35aff441d243b53bbe55e08f0983e95fcc29a8103d60dc37e9b5e48c9a67480abf759b4417ccce7657c71aa679e0537238824201d6437db49fdcd7e1439d3df81294553d40da5094fd056e129e54f6284a6d03843b66a1d471fe51e8a8af11db848ab1acada1fc7561f635eaf8a9b20d0f26605115e67a8a00ed7c5be37e6026d50c7250c31f8e5793b41ce27bdae4a0c01cdedcd1fef5b9c179a044d51b1cee9ca8d33eb5536081e4632a5127423a958120d3b041a912fe283499d7cc4918d2db21234ed63b3991be307e8c43040ada146ba38e323c8293dc1c7ff44feae2fbea02ca11ab8883ec39d33bef0fe0daf320204bb67bc7e30ad29beffb47189f7752e79c9fe8dec69f3a4dce3871e200921769b81aecedf401a19bb674a0d6fa9f699e0590d2f8c4f73a223b6c21ef5aec1037794b229b552d9d7ad9f1894d3d8e84c007c6f3c83c9207d6b39b266a355474032aa43e8b592014ba9a0e1513ee3467f573f2658018692543cf827d8b5b8b544986a71f036a6f1467be164722eab3c71c4f800b67b067e9623cde393adfc2ac694d565bdb8fcdf5a5b27ec4b6e29832d02163516c6b7befbde59652262965bd08cf083808b77cbbc1a6569de3198aac42a10f1bc970aa241414141414d4766d97ed08e2ac24a763e85091e76584341cff51b1e76748ebf19f0d78758c219a088eae54989896a8d2c3a9c74ab5d9683c4e4e5dead3934c16a3a16b44603e23ccc965d5460476240b6939554a25ebd7a52562efda52c3655b0223c7c6637479e1e1d103781c5a00dfa381bc093a00df4303e079e81f3eba859fa15df81d3ac8041e670203f8e182861d05d137535113188076390940bbb60440bb9e80685717006817d40fedf2b2a3a3054de70efe9d9086f3df8dab03672c896ecdceeb06a76fb609ba56e4c75ae4329eb046a75c56918e946a52d248a5a270e008690f84c304d854f529f54ddf6404fd68a107d22c3c0fddc19e011a02bf001d81e7340bd6b10095002d817f80a6b30668fae424014d6f5050502b0cd1443eebf1af8ef131adf330b48cc7d1fa1fa0e76c8508685814ece6b22d9574b21dcd1d98cb8bcbd6830e9dc2efd03e82fe47aff0401af63c34fe1e277c8fde8f43a3f03c0e789cdc7dec3a00460ce7669bd313d46d748086413d69d8169853256d3ea458add6f7b1582c168b55a443e1840d55492fa38f212d0629132314ba3b4648d3197a1d9a8515827c0c09d1585821c807cedd381e28a499f0403c36c0219ac8737ab573e8da101e403c24f9ff7a8922d42c16bb13f6a3615660362d4e5262e6196714f919e1902d01cc59e17768ff199a85f7d1b497413fe013a01df00dd03300e96ebf091a85efd127f068159e013a02bf000d011a445480a202e985f051da496b09f2012386034544e8a884190166049a8655993b4573274a085141a38f5105edb2a1b0656bd793dfeee2ec04810738608619a1d0dd3fdf23a4e5f81e40ffedd028f2384378c0a69ea428721febc0f1c1a9c1dc6162f2d4ffd12e2b39b4cb29137141b96eae2897724d018d2e1b0fe24e0e5d9be169e85a917f5d23b2c536c29e5c0634c29c8ef2acc8088372d90e7d337502ec08ef706386861db15aad8fc562b1582c1a2f4e44b4cbe6b22d4f5da050d051021526a625aa54b19242486d362ac54748979676a8934a9f24254509a992128f9e1e4582429a0912a8648dc2408d06970dd1f428a445950c0a81f89ee1595048e36a437280391abf0e8dc2efd029fc0cedefa37d3c0dddfd8f0e7a20adc2f3d0b0efa14f781ebd7f480e5d2b5264abe0a4e54602a48ffa1fe4a37c948ff2d1de412c35d4ae5fea235d45c3a8f8d0e29482beb9a1a06fa0f44d934023e99bbee99bbee9db0d36b55d369715cf5d1e229bcd7c34ac0acfc7f21258910e7d13958fb0d864e62465787848f25f1433948b47bb6c2e2b2ea71eeddae27a9a3b5c18c8e5e4b2b202b85a81587e540f2d7b1e9a7c207de37ff4ce0fd144de47dbf81dba84d7a16be4d03505d466f8ac001cba47c328f2b17b0336c500fd512f55547df4515e327d740ff9c87f3452c6327ff413d9e63fda293f551f0d95a5983e9a0a1e92fccf4747faa6614c542a596549f7a08f4ad037b71afa064a23e927b493a6424369248da491349246d24832edb2b9ac541267cf186fa4b0106725391a7986c6d996287333e8ec325c2b72a13eeac3549ffbf55feac5541f2cc3d7d745fe9380bfb165d02e2b754bdde11b8f2edb929d2d83d65ff4d3ff7454f5e1b8d8679ccf453e8f9fbbcf337cfe57f581f1f963d527c6e797f1792c7554252bf7a5be6dfd45a705d087f42d863376af43eae89961861147d78a14d12e2b55e6b24d115d79642108460b7709b1065516f44d7fa93edcd7d7517a278f47c8cdfd7d0a90db6eda1d6158c2c68ee17c69e924632f14feb81be75d369715d716d793cbea2740bba05c567f2814926d6e743975409c95acb165d02d8434fc03c6cb76ecfd27ce730f2336442bc065f5570869382b843140dd60818786830891d16545c865bb615cb6a11d1b3c78f0a871d1f068b178f018a2e7cc9f9bdb4697ae28d7544d118c09d7eda60bd80e2ea89b2c601c80bdc0e57493839b2a6e86004b411802c94d6cd7b99c5c3697ed8b29a9182a3541121fa6b456daaeefe3ed862631dc70642fe62ec6b72f5e30c085a91295f397a89b9820a98e863dbf0421123129b97952df6d4f308cd49e4f449592a83d7ff5c59ebf0a87627b4a9451e265862523b2582c164b09d49e3ff5672a5646f82a88cbe595127624db5b2832965a57aa96e36ac553dcdddddd29bdbe7a42a95d31896eab8afeae250e5bd3b973bf5efcc2941b2f15a732e79c7306f9a44f5c5412c5ac9eac94564f56472b21325e0161bdf8bea9f5d453d7a7aa2465a348f326459ccfe5ac82fdd8b4f6a088c96f48b695946a71f660e14a8645a35f37319c193a868c1a648d1d9e1e1c2b2939fc1625351583d96c369bed0609090909c9e6c5c4c4c4c454e35a49d1e19292929292a269b1fc36e34c325276784d92116d369bcdb6b2aeb22ec5e716155a07ad7fd6a5fc38ad2225d559f701575280ac67eb2b293cdc5ae75647f0e8b13aa2c709f7a7db2edfe7d65a6b292dc1ca8817e7cee5b8b9e31c37ba5beaa2bd4e31bed7dd2fb0ef576bed1d27c6e25b39112bfd1cb5e973f85aafb3d6fa73ce59e9d7cfcf1df1d5d7eb3fe752f7afd633e7ee5e47ead3dd8eeeee5e7bb82c9fd7cd39e7e42abe76ce39e79cf373fccb5a6bcd2eabb5d65a6badb5524a3fae8aaf3b821ae1eeee73ce5ab59e3b135fdb6ab18068751f449ae7cefc0ab4a7bbbbcf9508e8fc3612777777dac4f39238055be0b449b5d587babb5fbff7e8d2795f0317e94eeb81e05b39a9b5d6cab4e7cfe7f0fc6be7bb1327e5b64c7327091a744695b1eb7fee838e8d7147acb9cf391d8e07e38b81b0f04665b37a893532ae993c411b5015825e97397cadd79c69e44caaee7398bb63ee8cf0fde75c716533e7d6ebac6fadc5bb8eb65a6bc7d2e659496badb52e04b5ab26729ab9703f9a3bf3272e7dbaf6c563b5d6d29036df0ed5ec3b3af1ad9498b5d65aebd34a89f9dc7c3cffceb75e574ad45a6b9d13f663d7b1b4c0ae4f959ccfd5a68fb55e4fc04fb7115cc358e75afe6fae92102b98560d61a845b3fcdd789467f92baee50f73b6fb20c74079ff5e2336f8ae65203f6bd710065b5414c240f388ab7761adb5f8f5aa0198a333ab3e1a36f7d54b69ad97524adffabd77a4948e25fd8bbfbcf7de7befbdf7de7befbdf7de7befbdf7de7befbdf726b19bc6be3be6cce55c5a1feb95d6136afe9c73def43f07f3d7fc35e79c3f8f99523abeaed6b1815a35c45821032c5055d82aad191d30124e4fa0b6740105156022c0e5c9c90f983031b584510c7ab003265cc08227a45c31c760518413276410e6ca1066f3a7042e940ffc892bb65d6dcb8165069f4082fbaeb558f2acb5e9161cf846d79e579ed8428568492a0b971d8610c4960e7c993e501a62ca0b9200831f766005910e441881c40e5f78c0e2685692dbadd0c0c909cc121045182208220e88008826c24851020637f0410576e0059208b4f430c517b3f9330222f6fbda178b0b60c0c9b8760447235146ff8a16476cd59e57b480daa5ad35afe20347589cac28ca61d6b4fd6d15db7b80030f1081081dbc6822c4ccf19e585860c3130b0b6c3e78d3db84a5f86a31c10e74eb64b972d3c1b7ffabfe4c9d2c36dcf38a9625244bbddada84ce393b9a2be7b889e8446c759973776b5b2d56cbba0f49d4174dc2dde9ae619839e7cc95a496decf5e3477e6cf3a832a9b3a7d0166090530499b5eb14193fd57ae7042a1077fe9eeee187fe9eeeed8dd1db3402c5fafd8ebc05cc83f370cb568f6fd37433cea1af8d97fbcd12807a0597e703ccab3efeb8b9cf63eebaee6759a868d1d638caf1dbb57326db30ce4cf40f7397685f9e84237e26aa350a998544ce08d3dcff37c709f52afcbf7c71513ae5c145e6bdf47c519d2dc2b696957c41663af146715ec47a764d37136550dd22abe8feaea5e026dfaf407d1715581959c18537c55b01f782c0fb07ff06cd4d6770f2fc65c48cb39779d149ab7f48160f81255aaf13e4972424bb25b9c627d99d638675877a9d5a2a1a9a1a9a9a969b1666a6a64c49a9a9a558d2aaca9a9a1a19a7387f3e2b3d52d10c6d3f662eb9b14ac2a5bc950a8db201886e26a258ab6355b2c16fde163b15a2d1a9a90e6726550a725be622df107f1e63aabab603fb0a5201eedebbf9b1b182ca4bd62a50803c64a056249e2e4e4fc036dfcf40711fb0fa29e3f8e630e0e8c186c1c6f6c5e35a38ba6358e236b9c9119c5711c478e67e6326d5f2d89f9af6d629bd417471dddfa19daf53134cd6bcd59272fa3e6256393338323ab5102b9736342edfcb609e52266477292676e3e49deae97692323fc3990b3291c8ce6bfaf03afb64d9c58a4a54abaf48cff416ce5d0f86cc3c67f34b4d114ff42e3bd50c8db35efdd6e34bcef62abe9966997aa79549117fa944f7d36365d48bb37dccb070585bf90765773dbd82f43d7c933f335da4e72e65f3a4f72e66db438c999cfd1ad49ce3c8e8e4d72e661fae7ce0c38c999d724675ecf00863ff496f94f2c61abee8c8c6ac5aad1e5e96925b6645b9c9c44191ad28acd2633e3025b5ac746dba830628a8e90929e4cb96c09af926766cc30514e85e54c4a3832a62aaca4b9e38f8dae9651c5e6b2a72ed542697b6bd9a4ab632cd18c116dde45451cd8b86d9036bcc90cfde8c89d38920d241c9ce94f3c296709f1be6c6c6236ae284a4a5b4ae84b4b353521edf51fcc4647a924d368975ca634ef18516653f3ac905603a3a6c68d6a422fb279d5e4d8d824f17ce6f98f471b4da95fc0ead4940c16bb37210dc380e1988dc7b14163ac4fb5ea546f55ca6bb2b1da6ab54a959c9c57a5529998f0cdb9daf5a31ebbff66444989f9e21e91fa26b9ec16b92c4c25a76ee89a54ab482e43aa4b2ef3a7a1120cb2a7c7c60152dfa3304fa22c5552ca655142e1ae19936c54928d4a8aa1a3fa8fce983364c890c934393aca3a32684c1a3366d410ab512d9231839c240d1ad346dba83095fc11762f77395c73813083866cca48320aa7da35f45daa323139ae1b3b5593bfc0239d9aca3492c81ab346944c16d2ac9498303170b86bb48daa6418315352951443a5a46051fe63936c52146993926cbcb44dcad1368a942a2e6372d912d3981d1aa692fe356854d4d55d97a7272f50505fe8ed46b750a7254aa0549c2ee135fe3bce698d6b36fea56b32188d8dcf2dd767c3ded08cf8b9d1ee2b23c4cdcb42da8d0e1b7ace6e34dd33b43fec489bd0231afe3764eefbff4648bb9687272a4726938d364c95d9241e448bc351a3228e47acf99e90f6cab986a795a395d88c18c0f65afbc42a85b41a1ce04a056269a376bc74cdc6dbe81a8d282be532ff9c83834b78ae84778db51a4f33d64a7818ba26fb980d6d3405a4d986a613c7e5ba6d6f09fa6545f216f98fecfd6d94d494ff90efff5d7d234adde16f422894b4642787cdd3ffa4b868643233e4eba606f6f9bbfa4aa9a45b21c4fbe58db27d4947257d406b2dfe1d21ed3e76d1c8ccf454d2fd6b260b4135929409404d26b34953c4fc16061764a8a409374af5c1ef52dc265f9b831b1da0804aba5fd75b1aeb7a1d3436c93ec14c2ef35b6393da3ea9327f9f90867f5eb26d7fd2fcfd170d2ef3c711d268c659493b4e0940e53041470e1ff0a5ed13aba423a4d58c36e90221694709322020a01a170d508b0504c4b566de8e25d196793b33ce4aca8cfeaa10fcac7ff73604922bd9c4664c2f934e3d800aa4fc572910b11b79133faa64d55f66473fd5cd58d27df35ae3bc0c0de37574ec63e8fba3ce4f440f796f12450554031220c3021840a4c88f0a3e302d4327c6789b31c14cd2cc0a669666ecd0c1347b61061c26f4f4d86ee44ddcc88fbcc90c45b4d1941c44680ce1d93c5400fa24795f478ada351755928ae993974c321fb909e64fc63293fc27db5cb6547df2d3cfac60fa642926596163c943eab1245fc658bece2873cbb7f106c5a4fa2ae8200c2d037320a73f90471fe0716821dfa361e8a10bf03c340166c4f03fe5e7a0517e3ec0c708c0b31110437900d716d793ab8b0bcae5e54687cf0d4c07878be87aab5528974155a91a55a360401c78e3c6e726367b210787093d3a3649fc3df4cf1d9ca70c8b93c4afcb1960e10fbdbbff543066305635542a4e94edd52acb1491c2627b9242143b1db0974143e013a01ff00de81e48e3678096000d5c448a888cd372a75d50b728a9292f14e27ac8d12cbc0eede377e86e8597413be07f7c06912244548079111a0b2bac56453e60dc62379cdb0d350ff4ba5769ef41f0af4642bb48848cd4543ff7111b76cd1b57cf3df89e37537d371679ae6bf07f61f5dd7fae81581b76adfb6f8642c6b0c89b81631843381679b3d57b639137f380e0d8650dfc23444f76ad0341212bd57b63d1fc320bc3c0eefb86cdb7dbb76bd81d5df07e3639f1c586cd71363931b567931344d81f065dd78e54980939793177e616729a9a3c73cfb1b45f56a71ff867d7755a49f74c8866e20d5382e09f1fc24065e6792e7c1f5483cc30861c406c9975230e0100c30220b6806101105c66dd13ed190e19a9753ff7910dec5ad19d75415c1b7fa815307bc207dfa624a86777733e893f67e097a24a1ca7f87f0abbb481b58fcc2c453cb1f11b998f7ff5d3654a6818e7ede70c9cda5e39af7021b5af1120bee7db30b38fd828268a2e1217bef70ff50ddf874f73610913a2590e53ee13cdbabf21101ffb869a4a698a446d2ef33e7c52429fbc9bad7bba5125aa84f4255552c2846836c5ff4b3a84384b14b6111b58fb488e12394042c91418c0577d91925a344afd9c8550bbac45e0685467ddcf999139cebfa39121a23ddf86d63e52002298ecf9b3a9044f758eb0f917d8b2cb0b68d973099d79dfe91ceacc1b8d72515191eb1a7ed43ddf2701e6ccd3485663f6fccf69f6d83100d1acdb53d78e74ccba9fe10b4be698a925dc9859376697cdffb89cb92031b944f1c0c945041f971dc0d9c485896ee2d20155f662a50a23eed9b4e526034edda48508bb3543a580a23fb6ca5854d86c255b5ad06411256b1eb1ac4e2da5ea539576d4ae4d5b8ebaecfad5367b5071e26ba7573aa3f29ff4aaca1bb68ff5c6559c293e18444bf3e57cb52485340580b611ea4ebffb7dadca874c09b6aaa83f9be8321d40fe23f360f6acd2362a69295949b192e2f78d49eec64f4320378c1933c609bfa7eda600d0bea3115b57d50641dd6badb54e9ba537287f63b003ed67edcf951d4bbcd22a6bc5508364be49ae4d6255b46ef1cd39e7c518e4387c9fda3ca748ab61803890bbab9f4f670f99eff6ec19f3bc2f75c4e79e73ecf7f1bd3d9b23bf4fa539bc55fa6e194deff7df0693d41d3e1802a163c68c1933b387baee4f5b10a4db75a9b3bde5d32ac5cd71a5dd9cffd08ca20c1451f5acd7f95548e35e6694c9dccf9dfb2cddaae4ade49dd173f5412eeaf0fd884e48fbc62972daeeab2d17fe2afc4295a85bf5f5459c1cbe368b343ed2e85c65dca793d8edd9d8f51ed33c9ab51d7108046fabed762d56b2b26ac7844a0b983965f66cd272032d4d4b9c16b93672dfde3188854a62ab59a824fe317bc4aacff7f47b1810fa1fcd7f561bb94195c4e2fd4aa23de35feb59cfb9a7554fbdfca5d77a9046ab7e863faca755df0a83c4aa0f4df5b40b838c9468b7c6f2fed52a1796d019f823b3546fedeb7cb97afb6fb9f7c63048fe3b9644fb7e4bf59ff7f72dcd7bbab4cfd18c3020ad577deb552d3d7756d97186f5ae30c8374befb977b5b4f82c5dce8c25d14e427736120a116dd1b5d24654e30e35a881bc30c8d7655ba95757d91d88f84bbbedf7ccf0c7dca1b3b6aae7836af6a09b3e5d59badd6eb7efbaeeb929123a46d780644a1515ed2433bb7b4f02ee8e861a90a8b0ebdcb99f046fae06ee93e0ddfd44928344858d848ed9d68e73dab8af8dd4b7abd85be7feb37aee925aee6718001c0ad55af57dbab22e5d5fc7e9c9b60f0352df9b6c107ecf794fab89d5673dadf9ab575fb5ccc7aacf4ac8430f42e43a41f567fefb4a3a34e74ef7370c62bfacf7ef08ab01e2fa9977fdcccffc123a8b551f979e35045fa7fa4c2474d78e5eafd2aef7c2a1fb577b36af0a7217fff5b1eae31160ce6c5e45675f38743f976ebd9119ee455dded25f156a50d7300601aae4631d141067930da46cfbf5cb2100886850ff864321901cd2ead86301ba7d04e7dc2955aeea41f98876ddf4691d4b1cdc29109e299818b3e9fd7a470acc2ffb08111252db470a4c274a25638dfb70d8146b6053eb4a36bd230d3ed694ccc761f5b43483a21937166160ff107ffaa87e41345272605ee1e2894d37b545d3ce9f53ec9ed1bfce317bea1108e1082d2144b166ec7945084d0881c9cab0727b81d8fad7c81d453bbacf1ed3ce9daa839ddcf832c03881819a4f1b638cf111627d6a8498abb5d6dad7eb3f0757bd2d5e4971f3ced5e72bddd6e25a71abc502e2eee59ca35188f5afc53f2b0984311e4bfc25fe8a6b4f7dfb9cc518e36aadb5d8ce777d643e6d104c1453e020678ec3f85e6bdd6bbd81489fe6b973a1f8565da4e812459728ba4811858ecbe36244093ed0c40d3e300515b3f9930242741cd277a54b148cc5bdf85ad1c70b172f9a4841530fba60b13d0749d4b8cce0c90e888032c5511ed37d098730bfcc7081859625a0488182848b031ca8a80c81556061044e5954a0658b294bac28b67020c45eed790507587629621dc66b65b56793173b4011d50128ae58224517dbee79050a24d4ea61ae75be62d567ba7deb5506ef799dd7755ed7799de761fc1ec6393667cd18638c31d560929b8dbe241b036eab1095b4716dd77d9fce95f4ba2e731ca76fb576eed88f55d2be7dfa515781c8e1ec63bdd27a02c6d87b8cb18731fe4f4f1c54bdffc659c99ac7ccc5c48c31c678b4af03621ef2fb787dacd7cece3929b5737a99c4c6f09c18f76cfcdfe3bb3f07abbda0ada19015b2e3ce632d7536fe397e25f15b1d7307cf39313e62b17677773beff7820f68f79095fa1d33c7658ecb1c97b94f52b375950d2f883fcecb5d973deec3e00dadca57b5d23a55e1ea5a1083b489c8d15a873e30df88429c75f0c569ba5bd5677e8ce3f2a60fa4a36312bae953fa1cc7658ecb1c97bfa494d29c33bef9b9a71c57392e7fce39ffdcf1defb5c49efe69c339733f765ce397339e79cb99c73ce39e79c73b6de07f947df7b1cd2e8535aeb15b182d5ed0df3b6eb73f8e62f7bee7c607605a36a028acc3077ea5b7d1335028610993bf5432dc3dca1794fd78e806634df659ae7ec636d8368c36bdbb14633ce1ce504c204e68efadfa5dca6d10ad09bfe91ff7c5f182431bb1e7d5f28192ded26253edad5c9ae5fe22a48df4d9c2296e42e6787b4ebc7307bdc23764969ae3e20c83453554d7cf5bf557d4aa9382be9b33e6d1ff2aa4516885e34772c2044e3637dd25c16d5ad5f6bb1cd76efbd18638cc523c45c562529299b4d3c420c05c06dfb5f37b30af663db4be5b33f27a535e7ea74ccaed6c7396b940fffb7129318fab182b53089360d693ec230f696288246e6d349b46938e4cd991193fcdc3381bd909f7b18f2088337e66ecc351cea86c21f749c23cead7bdd5a6bc3218e00f9b9bf210c797cb9cc651f0e316e4dfb1ee4864378dfff5644fbe3427fc7e1d0fd3d447f8c56d3319bfb4a77de5dee26ed54f6e99ea1107e3b003cde71d65b39a86fd21c0e09a94aa2275ffd4fc8c30a823e845f78bd2c087aab35945bbb95b31587ac15fa562e183191315971e1d0b81299c42e1c0aab2d89760d87c451ec663774a95d8266f00556e7aeded7623c8a2b2a03855629edecec61e70e8d953aadca89d9da1775cfadea948a6fbf5a3bff6f65ab8f7d254498e6125ca9f9b58699757eede2f3eb53f5a1566836bda311ffa7d9f7bf74d3eaf6622e77de0786aa952833c36ad1b86a5e3637b05849bb238cb9431f67eed09ce93f77cbacd5ca2eeb17bb7e69a34a55524c9db255a65b3477a895aae19ff41fd57f5e433d67a0cee16753e87f184ff1ffdc0b4b1c36fe36be3d402aedb43d3d6d1adca036f23e6a34054ff19fc2fd67bf061b5ebb9b93a7a4d9f493bc6a6688767f4ea7bb8a23cb1b36378a73477fa09eb3d00b690efbf1f4bb2cb3b59e3bf4bb1dfae77d5de7a94a1c361d813efd75b9e3b03777e803b9cc22c1a168fb68b9197cadd74c3b15123a666f3c7ef8089f6dbec618c46a3488028b1f72b0b2450f3af8620b264820210a240c0116c5a88a0bb6d8a00825ba70394116b6272168e07b6261ca8133e5c0a1f8e60cf153e0d1032b56d084920eb4144d49225377024b0ab6bc9def5e7a1e47836ad6449b3372c723e0f6f7e2ab3fffad3a8c6dc7716f3dbf17cc1c25da58db23e0b6ee392882083a1491858e2d620aa4e7f095218aa0b23dc6767707c2e2eed6bdd57a7d7b623981975db678d063bdeebad72e0b67dddddddd6de8bcc684e0957f28f6f21f1d2c27c0a289bf8e8e8ea7492840d8a5ce1019ca971d3cbf178a1074f8628cf19526f9e27b2f0db6c5dcb4ad97b5526df0c2a3286628467c608432c407a088e0080a1213283ce40065890e58881863a493c5e6993db110c10544e2728e97a0e860ad4e96a511f890977240e28ed00326420eb79645136b75b2d476d06442d144a776a509969a124828b082082abb14bd282420624c952e6e70051731906ae21602a51584c0083d08813bce61b02f10b39bb74e0f908e2c3d3a7afce7fd1a2971fd7bf008d43377d9b3a98884bdf7ee3bb65e9cfb5dc27fefb5fbde2c9cfb9760df3cd22ca48e4e4f359242a6878e76467b745419fd2e05a2d192255decb267da544b6875b73744fa9322f1cdb79574c188c90d3c60f284c4040b0fbecc986c289208c196a82e8cc0c46c4e994a92f473ee6169db6c49db839193286c705a193c8295bca3ad8727dbcee91df86410e9c418b56834c5de1f6dad767cd157c838833c883922f74653ee0bc1e17a106188303e21ba6330ce5e2ebf068d449808c3e36b7c97714fba8ce3b8175b53870be2bbb111a7fd5ed5477dfaadea5823d20faa3850cae373d1f0c7e5386eac81d6e857a56f6291079146bcaf8303f0713d882dd604b78395b4ff7dd37f747c7c2bc4128cc1acff0bbf4f7db015ab7864895eebed13a27b46e69311a77d59cf7fef8b7e65b2d3d2e9632db51356ef63d1481445981d5fe3bbec3ee9b2fb4653681597884f91be95a8fa3a205541ad128da6e4baa3bed19479e36b0e9bfea49f97d00012104734d5a2b28081107c7490022e989ce860cb1520b2f0410f628a1044105004610a285b8a80022d9808411519bbe600c40f6c25145a8670c54a1460aeb0220301015f387182289290028a0e44296cb067054430451544cc008b0bac80a0884a4e1822229cd8a2052fb89283168c510db1bb15a4c04e77ff194eeadf121b0b0eaaec96d2bdf75e714f2c453fd8784f2c452458c2f41ec1038e2f26c2b647336badb563792467b14d5d6cb1ed0e336bad8e28b6c23d9bbab862aff6c442c40c76291ec1bfd2724eeb3e270c4fafb57a60c4b9a98fd5074be7fdd2ee4a29c55797dec33afab04c1fc6517b9128b14e6ba641d53ad1b6beb750daf72b3da1ec3e89dd25f74932edbe6ab5739ef7d36aefe7e78ddceebaef46233ba87e4e4fa01e98fbdd637cf1bd5f7a5f725fdaefde352c7b9cc55d18c4ee8bc42fb5991bd324c6b63920b76230df11f155494ace1e71363d3dedd9f4c4d32e5fb5a7e9074e76fdc1aedfe3d446cf2a8ca88000c02001198e04d51f3aabdf42f5994d7c5a5089edd9a44592164cb23082ce9e4d5948b1675316351d7b364571d1dab329aa073ef66c8a3a41940e2c31605450e09619a8988660edd984050f60126caeb8d102dbb3090c531398a4dd24f5f4aa71d1b45833329887a6278aaad252952a36a5304ea2d8d71fadd3a94f5ad63d3397c75943dd36e4ecfbf36dc8e9f604c067c49f6eee3f0e745dda9f250e1b06807dbf679775736ec4bfee394f985e9836379636fb97b75c7911cb3996f3bb793362977e130ec0df8bc88d65697f7676aca1ee5af7576cee2f5756a75d7fdc3b96442dc86c8709e966ddd35dadf03d43211c16763af1c3dd3314827d30c1acfb292405231a70d60752f29ea1109e2998e8f60c85b8971f84c0db33142243e9082c9f981a50f104b8672804860f28706282b04231e2220b0d547b86425c3c406249d46acf5008b5e2082d8a0062cc9859f7538b7b864264aae041114958a2648a7f27b32f10bbeffbc384ee4642612e2ca1b30ec90bde775f83058836f70498b34fc848ee1ed42a4f836117d6c00ff2f003a005a884ecd8c97ad429542300000000000316000018140e884442a12809b34892740714800f74964e58489f0983b1248c6114454108196388218600421031686868a80362c38cf62dfeec04d62ee8ae287b1cdbc2f81cd923d940061804abb7f1c1b1cf24906d237bf60ba5c55c3e83ce4a3f02bb6bc86ee24c7eae5d968b16c837faedcdd339865271366525defc5e92aa367290b9bfefd05127db89c9920ad5a61d4529dec40b8b770628a0c560b0f0d27d3c310221ff1f8d7edcbd7a9532c5d39a7e633ba53424a751852c7387c611827dde102f1d085d422d9e10a5118ee51c719f915e5a41f07148c853268f486f7e1750b5bed7967af9d1b65d874c6727249fdd8be65e7092e32382921307d6a58e957e0211583638ddf8f0f2e80ae111c7f734f0a2c6dcbbb5851144ebb1297722809a22887ce6da9c9407a03c8d8964acb6e89c5021cc27dac8aed7ec51a7d78da4ae0fdd0916d8fb15e0f44013606a65facfda0ca02741c81461456a7e2df002723a5a459e9dcd5e3ca05676587493837abfcce19d1daa7b1173fdd4bdc468bb4cdf891022d70f2d8b8a380e862a071a8157db8b687a4f3b7332bfc352d27d801ef45be0dca2a2aa7711977c5a749991fd38a6af65115be52770cd80048c04be011180f6ebf3d8cdfc3588828cfbc7e44165a0bf4614c5d3567e60f4a9603daa72c03c230fe1093ab4fac6f0ee9393f039e7db881989a85cace016e353787bbe06a3b6e9cf3f7d8d36c2953e9571e4d6da536ebc4531b9723eac97577636e2707d5e0457476b1d2b87736c8773533b979be19b07cb78e501de2a0166e7fde671d2109fb0e6820501bab84e212a5f82cdec0f0c8bdc86157efaa3fa9b8840dc8762b0331a06f1bca4e4f274c3fe1a98329af2b5766e43efaa03f01133fb7a981ad67cca52f89ba0690c41f92473f477e8839c046b0c3f81d709135abb6835f5a54ac54ab749d0044d4262085da65e435336732b857cc2ecac069caabeb11064e910a896b82ee71db72f4fa71007371690be6ffa4bc1d8d2b866fea997a66e4dc0ee2944462c6806fe1d8f726165bd874e3121ed58563c36d4bff601d1df98481ec79c70a5acca35aabab37d3a81fdafb3e6ceb68b5d70e7541cf626a1128e43da2631a335913b8799abc08842da4b7d3bb2e5efa595a92877cf7dc96cc993ba2948c886f2292199038e93ca68b3a09c4561b022d9555185b991a18de2f960a9602d2aee08f9620e5f227a257112dfd8e625eddd855d5f3bd199f47cd953d56017449241d734f70c267261f2ad581374de94f673af7a3dfa20e1bd2e74ed5c58df216083fad72114fd5a4b4719dd1032ed2550dc1b62207d596aa60a0dbb72a8d9f8b39c79fa5d900916c603e9b195e459e329affb05b4bc0d5294d30ff61b3164b35f3d3201d604d1d48c0024211002be333c086f27f658b77400261f7aea9f9917d422b31ef0dc7c3bf36a61d1a4b33e66383b8ac1a80dd96002fdd9256afe2c632b09a10cb0bcf44cb019215c5a73d7e408232e94e08c87987d18fbabc476e9a0914c708cf7a00f9580de2cd88423540d6f0d99f30e4a7617b03a2752c84ea4d80c15c3a9dbdc780fd385d5ac2533a8e482ac81aade70eaa31b6c1de33e9558211866872862ea1a7876b0ef243047b16d9f99843fc26d215e0c4976169e5b50737dbe5f26e05ecac4a031fc9fe73d029a7d831e863517cfc848e22644b050450d9c1eecbaa475ddabf1399668966a2ec8859dbaba78b33ac0c40ec08547dfdd3ad367d48afbc2fbb5f5a58a40afc1000d56354f52f651aa200f4a1c7a0bdd1d1eb7199289244dacf981e07c43411b513c2c52bd586a961d6e8f261ea8382a6312639993febfd80595720b8bf1664987250f771a68d713143d728ce9253438193a76f6d34f8af22adf3f531b943c9d0cddc889e71dcc3f74f1455e7d608c0d794f1d7a7bb2bf429a5ffb730470a8b3502cf211620606b5037d1b6a0bda16f21dd42ec8ed101ba8f69077a0b620ee43d8f4908a20d63c98145687db512a5ea06822084c5387f6e379d407e3f04b8ebf5e7c043ef367ae7d92aba9fc5dd2ca792641376d65e0d33a9dfef451cfbe572c56c2d47269c0ab2a745cb682c653ee450936c354bcfda1cd38371c81beebd8d6dc439800c2287b4dbf86ad0ce58a9ff0532699610ab5f4af65674893a4e515215a1468f26170738a049f98cc367697a15e7b6fde11a46de8c7212a3e4de12ec8192b445cf9bf6802eda55cce25a870ae9cc14b4afc23ca6d84535a29fb41cfa99ac87eb0482f054457ffd28f6a55014a5d2980205b8854df006ec9050ae91dd1d7aa697d1ae513d4e2c4bffbb55ae526c4d50560b67139c69f409988c637e2ff7f83234e3d1c6103a615e97d25d014f8d4de0d663442206ae893a6be9af551643719633095d81822b32b009f49c759880112f151dec780922bb59d2ce1ee246639e35fcff225defbe0e6e9fb82752759e38f7dd84da748607ff0d55b7af66ae8929fc66bd00282904f77855c681d87bde2f6b6d7922e6af1f3513b483c7eb1f61e34d9b8496edf3b00d8bb49b21cc32cb183a46335a41dc26ab7009ef4c8c7d52aa91a08ab8c387b921ab19ac4dd6bdb149b2c8bc6475ce6933863deb316ae5cd42471794690d3ebab46189e933c1d11c9ab8e622197bff48e8a911885095829b183a63547742ca7975653a745bd6c2cc67b36c59c406d74a725a2c5eea33c2dbcf9a1b7a4b665ea868797c46c0c0eb1bdaf96bc1022f6eeeba8d36bc8bfae085ee9c7d1f6a022560e9336298c97ccc5f0b5301690d57d03a3b7343bbd32d083858ecb6342022ab2c4906486a632e679529f34655640301b79963124300adc688b9df7b87f1024513df16dfa42e37c7a51549b512e7ccfcfeb0fec8dc6fbc11dcd7249640ed060852987c74be062d09e52a565fb8476740bf2a32623cdf83849df3f6ca4abbc532eb056f71a06711d8125e00b8ee1ac8318e1c8d9e81629af08a039551d0856d5b026bd449f9c0af48f89853192b691211ed0b0e86fbfecacf92b296626fa57ebfbe2f74c8f17b08b07c4d4b6ae8f6fc5d06b863b5d479cf54026c6623bd208c2d7b92c076514d44a651c272dde0ddd3b05fea70bef4647edbbc96c3600b7dd755f73ce8f406b44b81ed7a1b0ad41e9a0800292858dc00efb53fd8e9a9ef138deafaaba659f6aac9c50d34c142f64fde3455bf96d7e9b5aae01f68f10739451bac338453c2f214150c9ac7affbd5cf215f37f4b6fabfd7b5ce9caf62112f47aff56d7204a903b8ec3e275bf59a54191b5fd049ea21a92787b1ae40289f04448b600211fa930122aa91367ec8f9c1cb93d0ecf54dad9f89593112c8b68d371d59e8c1181166f144a052b174b107a81baabf024e25357d4aef5822b7af6067b7a04ab4facd49878b649993bf6ad6d1ee1971d1a4ac6408bf84a84276ce3b45f16265b6298bf4e8358e9266d593e868c5e5ae314b9c01b0a91f181665c3c1dcde73dd258e0a6606a38620006a874312ea06f58a3f5a664e698442773f1d6ca8769beff242dc706692cd77a2b60f10a22c025c2fd474dd617e70210b1c50b9c4742ce24590d68264ea059e4c30ff0229c0390628c1bf02ecaf5135f36da007992ab68633baa8b965fb8287d6aff254827bcd23785c6e0d017fa5b8db81bf62e3170e9e10abd6e799ea3b76979ebfeebff738582bbfc0b6e73c3392aca85fc7f195158579f4e786645c9fd51e8ac5fb7a4142d77701ab5a80d6da026846efe14e78c19bb4a8abfe8615ca9ae88713d1a13afe3a787d18530db8048b897e51e883525ad3c2b757f963f0c08c7a8c5ab07f1d9d93a10e061432b3f6e209beae18328d2ab9b6202d4861225939792626ae670673a827371a19a3ca9f566d695b2bac512cc49335e3255a5c3ee6d40c9ef93fb0d007a5cbb53f3bf3305a22b8a5249b18b6989ae30bda5310886d8e054c3c5c6807f41fbbea75af30190877fe5f91a8a8e3be2c91f47a4cf06af2441cf0a2edc70ce19ae2cf1ecdd57631d04b48781a4ec5e2a3692f60d593e57e5b168a6dbd673bd289604dba9045b7260e8fb2038caa9e072877059940b26f238ad9a4b5cb6441617bca8dab1518d63c3bff6092c5764c6c9ca648db91d7198734a57573c09461c93ccfeae01afa525b8aa18da4e445a0e53ede97da179d5a6acfd09add130b7d4901d4b1edb2b0e4972eedf85657de743ecf974409efa5f6d67ac657437270f87d403ed81352aae8135bc1e022c6740644c3b4d0f386a5278925ebf80feeef5d42345de430ee847f8f9cb94ff27172ff32cb6479e8df784047b4401238b5fe102324561cfd874884a405df77e5ad847d36cdfb4f73342859ab9dbf4fdf10db988d7ab5f20c06f347c05e6bd98689b6ee98a6bb435d20848dea14dbc7db2c76f5a95ccdca1e48fa3c62120c1334a9d932ee881056e42a97a04f649722940cb9de3b6d993d11498934ca4da12aef8fbb4d2f871a2e8e8e59ce0ad81c0af160e81fbe3ec0134299f076d7b29dcced8869c548054f09cd10084c3f2de9ba34ffbc3ffa33c091a74be55a3a8f81f8dad07afbebe1bf3c83fcb61efbb13987facc88387dc1167941f42b181fdc03e0b923a48b3874ebfd4c7321b6c78a7e7dcf4c70beaaf87e8202206af4b92efb858416f9830a6d8da5f5a8d9e6463866391de5124f8abafed98f32c9f9230d9a13ac82d4af5a7104235a1064ed30d65d100324b1b47ad0954e5431d697f8d2586720e4bcbd816a4ede8844e7aaac43368fdd96c2083e0f1672fa201a606936d866346ccaf9246f900d95b0a3cc74f3918d0e04fe629b3ee75d07872f9d28753ee3d0c71fdb20924c6f5c3d61990c5c85ce18a8824bf76cfd00ebdf8bb616510282289a326ae54de8b4e470478b0c3481eaa16e94c458d99ebde8bfbff7914752891544abd9095065828a23e7bb8f984f571a32e52717ea69596521e3a35445a7fa56e04152eed3ea2386675b21f81194f4563cc7c42868daabe74f0c647ed7f344c32d4840a3ad1b45cc36282183a647745a37fc0a23943ac77c85115397acf5aa33d20688286c3a8fd540c845a17dd7091da272ae6d743f46a519e6d5e48678d5dc93ead0fdfd3fadb911c64e0f9994456a4d1d8728218d3d4db29b727caf7d27bea67178a0143eb6266d19e77891fe411e3ff8aeb566513317c6a30ca1922fad81985e5a7d6e4b9cc6dc824715b8a9217aaa83520af156efbbf0f9491b8fe81aa35d041a0c7e09247c3997be31716b8b3f1d0d8ef593492660a59306ee7f02c1cc560edb0dd437c25cf1529f4c8faef0165e076beb84a017331380bd01313f228b0f7f88b696ee06666cbdbc29ffab4ede910bdc2dc8c86c77b4aa45357362de101eaa86feb72cbb5ae19a4563e647bcd75f4023f93990799b6c9fce225d18887cf5485e550ffb94c1573828690736832e488ed0a5ba7323f4c5453f40d10995f355b430a4901e59a53696331765e45c89e7f6bfaef6e4686bf2ff3d6aeba710b0a5568716c158ef6609f9c07a18565d83306956cb368bcccf3c3c248766e91194cf9f13e2fc8fc79556bef1e388ec78bfa43774efd91b58108597a59f282ce2584728176df95f3e406f124d3cae3abe9ab62f66374c4bed08f3d74b33fca6b45468853ac51b1447726f26ae7028866a9877b9be0897904045bc6a67db952fd0aaa600c9809678468c70080e2cb80d72091bd9fe6fda969f257d41139e0160ba0de178a68f270b68c5ced59d6182d65848e4107c1c854da7d450c5ed416027ae1d7f99edd9e4bd0aa62d552259cdd51528f3a3d2ed75fa9510eeaa8a694782f0dbd1592cae7ba127812070dbc1e2ba2cd48fe2a453598b4f272f3c5fdc887f86ae821c8f7ea7ab8743cbcca28194741fb55062be199ec676678745ceb5409f6df647f493af38f53996227ceb25a9588472fc4ba815220d0bfc8ae68fb39b500848547e14bde8d2bea772bc2a39a8f8e2cd1315f0a7689c530fe944455f9d0be539da22ca44641732b05149cd2804851bd7ee9deeb51274cb72e49f41d6a3e739f4c6686ce672a63547433e59c4c3318ddaaa51cf5df2723bdc33d56186f76dc784304c6b5621dc81da56c21664495b47088bc4bcb59c5dca8c2ef9ec64c9dd3474d023166272f194e76ea9940aa2a165aaa584c147ce7a71e36d37e3bce3f90365b648c6b213d7d49aa8c7ebe91ab3a7d528d2c4c38f4b38a54228dd5a7137dd484038d9e917721de8c425c7d9e1675fa5e58d5679babe66f6a8e54dc8a86c89a3df135439016d39a8c4f6e2a1bbd7ec83d43f43bfafeb221f8a400ee8540ad9176d9211ffffdbf4884a45870be897e6442081493f50d01d286502ca432c21045c554863821234235cd109f025f1e076deaf9ff873cb6522390c8b0c87b9b90e6ec29a5e1f5b8c5352f859907923e457528bc899d2e22a4140b765517ad393aea4983f88b948642792652cb14f4d0d6b8e4ca4902d04405861b4ccd012de4cb95054c6b905125e8459c947a1d6679cb2a5ef8eeae13a4de2164a1cd003c46d28d16b83cc3490144cc676f5de2df75f0e133439a6f2720b88aca82a2fd0ab1d55446b43eaf080d97619aac2ff124595b447e37c487b148170a84cf71db6b04a192dcab81027a8a1d0199e77442042186cf2ddb361e27e8966bef577bae34144184fe610fca8403f38930168035abc0db052f5780c38fb5e8025c65c7679e8b86c173232c6910cc8f4714782c100040baf1ad57d9602b34f87d9166af450112e5430f4a5f6a462cf7205238576083ba70a42cd3c9de8966b7fd3e4c1fc5d505cd1f3935f08849ade84b2ce056620761c35411f1c255039a40a2b702dbfcb2a177240f51507cb9346f9b3a8257f7ade0891118406efb705e6ad07d2d05b154b8f1e1dbb0b36c1f129629d5ac91ee2e11570aec509d3f091d5d68aba187cec3592e6b2fd02b2d40538505bd441bc664df822bc629f85f1d5f0b964850429a0fc90a34d40c5c7a1e17b8d3c2dc7a32029ea162087dcae00d3a077f0bfab547fa6f69f3e0b691e2322bedb61dad989da00c6ded4b620039b338beaf31cecaa1ad44773e6589b94d8e8a6f62c1997857028af74a63d46935f0b86779b3e421448ab8ae3262ecbf53d74a34f781e897e355e929fc532c1154f4133839ab6a8c8cd3601612e6495e60923022b9172d3efd1c4d7b44ff35ee63a46c6702004075c99ba5964fdd74993dd71a94604246c0c3a98e2131ed41240bf1c11d12fe8047593bcd12180a581195dd20b8c4c5b02f2d8161f72fbcf395b38e94da9c46f7fe9f69913992809aa3a745d881f67035a2c9098ee33a888d0f473b19f3f0ed970385fd2e1c83726dda2654fff7ef5252700c9254533666fa626d74732193f51e1449f27caade82b0520766808f290f1e67b4f4e222229f07fecd4cfccdbdaa04a8980c9b4f5751077c6269869ed077264e0cff72bbdcdca6dc7fbffcc4e2c18a25bb29fc74920be0d4be317a6e13c66c344eea2c97ebe11ee5a0ff0056e7d19b9631c3373f82c9911d38761effaee3839e70e4b55962a4d55ed8be5b444c06983aa4be71a5900ebb2bc826cb222f345d29f7b1763759f15b8fb29a7e6f78f3480469e154a7b28cef1c2f95cf84b7dc864b6016a514320b941953f7005654a48b3e13126f0ad07516d744691875363379b3b82fc8103ff2d0cce3e73070b345fa2937411f0c3aebd4941e635f27049d5a88b9e3f6329f7400eb26a99bd8135bafad6345b15fae1359f3af6048468cc151a6e89a1ab3a42429b3720960feebc85ffec0996362acbca3b60eacfca262379b808c26a94a7885785a3e436500a3136c7df8d37c8cae719c53ea5eddb8737b49a6deba1c2d9e0a12763d6247e798ee72475c031b33edbe34c849c15e3aca8b038710d71a429de362a3bedef0318c5e26e3ae9ac898d441e35c01be4fa20c120d748d91f15406ad3f9affe90b38455d384b70a01329d80daac29ee7e38dbd798b07b4667c7e916e1a10225d087100a599177f04dd220fe979a0457fce738d251f84e8f46e3f49b26a0258959029b14136c8a23bc57c36a5851081632aa184ca51e6088f07e5fad92ac9062daec7b5259f7cfcd9b1c25f40fad3545b3c22dd0c877ce914a8b5c3fd38cb1842edb149ea89df6da64112df2038d1d6ccd01d759a357ae0a80bd2c48787d07d85f030fd581f8f69aa8ff9e1cfef03a71e6e2f3b3ac947e96bfa925bc3b5874891f05be9d5d255f1d9e889aa440d9c6ff2ea484b39c83f44d34b996cde512db6e1d8cedfd32d12a086d7419fbd755cee5ae046f8968cc21fe2b87f542ae1859d8f8d22bae5407497e7c224f90b727fbef344f1ea76b53025dbb3701aa2a4dd5c2edd12fc55b4ec3dc16ea30818407c9d3179f7ea7b1603f5918e02fa99b8663be73736d91ef56621140c81f4e3c79611d87a054410eafd30cb8ad2eec45d46c371fee3cf2712860db891646d30ee57504cc70dd3a139ca57b1980813fab68d275a6df41c3064a31ec82bf26f1d6920724f8dc53cb1dcf6642d00d89208009aa89b6461b314417771cb65be52a0cd79646b85eb8904bfc85610f05dcedead7b836a443b856da36d9a0c3a4290936da301d72ad28fb0700b31c766d8d674fd5d2bd03f963021f55e170373e8081778169d8b43b150601028aab6853048f3d71f888aa7f0b632490e1fbe5168d6214c8900ea252b00ae92802608d949d81691fd0b6020c296b4c3057ccecce2fc7666b6d7c4a2850d4f0155f98e47c17557232951338ca8f5252d11b1afded11259c24ea8feb847e94d269222854830447d33a3a9a8e13f34b5bd4e9e608a81d2579650b2f8f5ed42a0f78d4f02fb0bc05334aeffe695c6d1e56af617ec22ec2ec30bc07cac2d25b8943a7521ac3370ab044a735b124a9314ded92f08721fe98120e714eab17fcc832a5b080ed54d68de776df2224298de6800aa62332fc0e4eacb220f04a9fc010418dce02a38bb32fda9e54c137d0fdfd8c5caee9dbea687649dad2a59f7c2f6a7aef82029d183320e6ebadd1fd3b071a391cd75451991bda52fdb5ba8beafb7df7239cc11d95b9e687c425f079944286e4ac377b7e6e9525656c4274b8349421ea3dd9b41b84f2651b866b1b985195000b2f8906a67a3a2790d8727f51316cecfd55ce3531ba89980c9f07270bb2d42c8274584c7f186d1b072d04d586769e0af5533d101aba263593d9ce85287dbfe34e5ec67614d01ae092ebed5f46ff88ebafa131d12aeab7faf20e2838590398fe3c7cd4f5545ccd928d7458ea429d5e0329de387a3c1167b217a16cf49010029c5a313b8d95bd9635621e6f8bf7d78be89606413ed4b01f3967b35cd514cc585e81586f232afc328ebca1487f71ca2698672992bca766e29c4e5d586433381ad9987083b69b1d5948c90c1e6be07b64249ff1b90f55b62dfbb1cff0d7239e98b36843ba8b906b2479762e54d20ad2050363c5b62237a825b1669689496d77a6ea14c196f9d3cdb530a73adb430cb122c9c5dd8931d7a55b16d308b3a6288e715cb1900827ad4658512ef7d07d73a360c68161f98b3d79049f96473c06be5b9096bcea358e636663462bb0d6f427ccec28557c2b5e67f91f11f3f41466f8c42b30d2299ef03fb6b77fbe88dc22c379c4f29e360d43cfa70be8f87bf6e46662fc281efe4cdfaba3f7864c387c479c583a5e3b3211662e88d8a6fab0b3b20017f7558a3a3629095c437cf63a1c455d7e5d0fae5ad6a0ad388f8b6b054044f43269625c330bfb6896f7e35f797c5927b38638527dc4e3b3c7739714bbfac572f4601df68ae3449bbe9a42172a4f436c2690d5db508b7bf67285ff2d178f8ae073ba3574c685fc0a09654f287854003eba4a518b905f374e7c322b4f14ca81e6384f120f0d569ca68d2ca1752e3753d30ca9885b716c01b7a0768b12555441ac78fad7f989fbd8f192de24a8e6058d4447080dea1ca878fbe7922beb78f0bab4daf5afe57dd0142487ca85b93ead51e9cb46f7586c3d623fbf9f63713ad19c006458c0fdababc56a191b42a7f49941048d49bee24d5b78af8ed701f775947b19112bb1bc412afb341e20ecd4790ecb714201d7f1086564a2f608aa3426572457f53b4eb7e4d6120a86e8fdf574749ac5c02d9dce6bcce3a8e4c57ced6bc1fd05458b0b8de479063d330d2d5d149c71fd420168b8227d501715aeda669427ed8e09ba2b2792ccdc14faaa220b8a48b1cb0310109a4126829b56de65a9d3e3654d8206e2f6089c7ba8a2dda76a1e1d0b2f749ba889c584775d5306e98a9083840f3d410806d80c09de758b1790a96548395b79e0b02ebd15d5e383ee83e1070d1cc72390c1550ac4913428bf31e63623391a75a1396eb628e60ce59ae2dcd6e8eb1feee9bd7ea10ca2f1f1e6ccd9617a40bec31710d7196a4ddd8df209dc1328d1280c6bd7f1050cb55303d5f8b318124f3f33981d642b90082bb77b3cda3abbf91916b0413e1e4823d02f7268fa264790a8053140cc259e681c98836bcff75e903501852b822c09db56dff84aa58f579efdf335d58f62d269fda21501c63b74eafcf0b1212086bbc738b9f2dfb05d8240b4935471ce1bc45c50c628133e0afb63afa013bd65b433ec0c8ec594f5b6c5955b83f00c655dc28bf0e9dbc05976a7f2266deac1eb81dd9b5cf7f2e28ae6083122b22715710fa67f1e43d92de2e12895c11f0841910e9b99e19670473e663fdaad5f37899dae5a1332ba15227cc1f277b9a9ab70fc0515cb0fcea742b88384aaa7db371347d8aa814e48a8d97515dd219e45c5205b64eda0a65824366481a983d2645932e16f0a23f3bbd5a89cfbff89396e6cce086a28d816a3cc90ae7b0fc3d9ced11fbe1e51f0bfc5d5622a6f8a68200b72a691bcbd216ec919d79caca09518e00153819ae2900e2a034b74b63106c6ab583598bdafe95209082835f3f753f139a18595f40c10d141c711193127669535d2092478ec8769d54c2e3135e95f46be0fbe8e4a30c1c3923041e9528d491f32ce28f130a8f8641ac1ef91d7ffc5d3693b0f0e58704dd435a9e48947b429eaa4aa4515fd8d96860b224ed6233a8213830a7ef9bf9354ad366b132e4c50f3a1a92c207b0e4407b880b57a0af5fca2189b24193f764a73614cfc8587ad52c08b455fa8a0d3a1dccf35b7ff03dd5cff3448c44e96097d4da6ac4620d6315ace47f844aff0191dde447ca03fc56b8f172de48bfadc42287bfa1b7157d0d4331bb60ca6b03df8fea3f54ef43f577d4f71a3510f13fcd69e41cb493770b78e16c937110e8e51819f57e38c7e8f3e863a749bd350571fb01eb9c4371decc4ed2f379d0664cde91d78c0aca37d916b265f74a420fb073014d1878bd42d13ff5da5eff68afd7d1be50cfa25eeebacd216447a8854d709393f55740d231612df2746ee1afc93661eda0233c636e20257b12a07baf09aa784535e283999907c83a63c211b589e941cd3d302cd0bdb7d8ccab63b7de30d68caf1a129e9421ce892019a4fb863791a433261ce011c99a953771b461d4886eefe2dd7d87ad0cd77d468960f71dadd3e9d31dcc20d83bcc0b02e0c8b9d38db7ed8d9a1aeead5c8811025d91bd3ca418f803ec9c553c06dedea192f1bc8f0ab1af21b12ac32d1ab93cdcd1ebe341b97871be3256190773429134812e0eea4f688e24ce1edb7d22135f3e7ac9e8fdd4e989e553a23fd292f4769397d09eac5907428fea74533ca6d964364ed6ab75198cd05302b2cbd010b60df2b0ac0a941b55a81a05d2458350093369a0d6b0ed5ec9d109751aeb48cf05cc56de57cbcc1fd42fbada819771e1c98864e8f54754e35d33f59372eba328717307b845e61fbd472fe5dc96629c5e44c5a3a36c8bffcef13de450c0fb330a65d9c063223282aa65d331fbf1067c01e020bb861e6552b5086395e214251176cf0d55e6b84ce1979902c0110a9fb2089015abd733b1f8b587071b29176a0fcb87f466bbbae32fb868f6025c8e9c2fd82454ee61885708104b51597546634530074066583d7f337f37b59ff2ec05783b3b9484ab1d626704361dcedcb982160f6a3b978789b48d9a9d7151b1609847d21fc9ef898d53e75eef3f6a3cd6192d101596abb5a4a1b7f2e1a9ded4544f10a73fc034d233e19e039ccbc62f294caeeb7efab74b474f8d55181c36fcfe73aa53502971a0ab4c9599626e088ac63d6abb0eb33f5de106b8becab07927642c5d648057c20884aa054078e9161048c3d99e0167de907677da295a678ea2e7fbcb8f9a75a9587b4b8aadbecc4177ef31f9bb88e9c173bc11214b3ce30bd445bafb91a2e5a0d94eec46e88e8ef6049de6802af043cf975b751db92f9e3945092d60b4386c1b2109ad18b271674f1ef70da95dda50ac597423a3e652d83d69340dc378f148e9220c71c7218c66e941c92f01641227d6bd9ad9b3bcc3b8eb2ab07d4f2bf2e682a71d14b5c9beed475081977d8e88ec9d472e5604c0883e289fe96cab097301bfa00c9e8074264a965dfb1e17e5043700dbf2662e0df8b902aff0b1d029257d9924e0777210a35cd79496482f84f03002094e0e1c28ebe0fe0dab6fcc9943cc9d760c8b5232f09d416a01a11b14d0e43f88aeb84d20471eeeee0f55ed3d5ec3690669cdf95bb21d3143a0ef55892d0e4bf50ada37beffd68c78567c2fd2d03d9904221870502dd5d2ee21a18a2b2d1de3b16704d26aae5b2968602c6747c0a579a2b4e3a35b29f7e6adb90ec4fd88d2a5613c9eb14da1aaf3136e4c9bd3d9cf97a08f9f017f29c35425da4f7db30be9a5bd3e9efcd2f6686ae224190553d7c2b785eefa1e539317c4cbc79e4509cca6be09eff7e9b46c91be6f2acbe70571a944d6b539baae871e53c080024fe186a4c611fcbbd2d0a12e3660ddaaf1ccb2a8c0e029529fac5bd25c0905aa2b0ac12482022d12188615016247800377c403550bde4ea870077258979e0a6a12c950f391555ce2e2bc10241ffbb7bb1668e0d65d270d4d70cc970d4be202d3e9dfd461a64b2fc3577c7866e4d2213b35d252909616f929c84a8774cac8a5405a2ad2a7219516f2a91d59996dc5a26b646307f8ec5a20fb7b55ad955780bb4bfe70331e8cda0adc57d49fb803cc0f08226ed042c90780700f20efb916c4e990fa4ebac10b528b38c0373bc5f81f9cb3548b290f6cb75b7d3235de8e1506033759ef032843e7aca700536268bc31464aed4303c5ffa148f16c61fc77f89612687f5183b92efb422f76023eff7e41daa26b69d61387aff2918bc9aadce26acb1a59da4dfdb3ba353c97d4e5dd3632d68f25b27f5920554e2adcee6dd5c273f2577df9857750d9b714cfc5a26c4ed1e19bb963ee385a9b09552a09983b54e452a8216ee8ff2ea83e07f7516b28703bf3f19400ad4b85f98ee01b83c111469ff42f4e18a42e40801bcef1c9255ccfea23300c0b37fd1e892ca2186b526188f98a53e2cc39cc3ec4892adfbcf31f619adadff1da4e839e4b9c378ed88cfe0d69f19bf969685429676f2e3dbef30612e5b9745822a8533214b1231712a40270710d99b08b83fbf645b29b53592c08edddffb278c89fe80391151116d91fdbff08fa5ce2a768ae7b3bc1b5920a543d65b6f8d02c2695ffb978ba9256a78c92377c8ed9ec70dd1fd6e92b0125a1955729f7462ef303e8bd79f829699c9f25eb0d4fcae83a1a0ed4de4d7ef6dede2a82f6b931c5da9d09c34b5592f03e4a662d107ce27911e4430baeef1d909845d659d4281f3ba26eabc043951f97c478bcea7131998f51be4bd54c4e743e0b1294bf363bdced9d389cdd7bede86bd8e515601a70ab8c72ff3aa5725c7b7dde4906168c4851cc0e27511e6f70278edc1b9197210b944a38c4aca5bda9c60a39def30b6a167148662e04ba5b73cb7381fbcb3b259a85df96f835364f15c91a85b0fa3784c72c27e59496408974f76d6b0df109f3a27fc77fa09ec776244df3aa1b98d33f4aaacaf8a8620869b6b797e43af65ca523bdc649c008d8ff4abf83883b60388a41cf0dacf70ce9e74201e03352a94c1b9d510b213e56c24cc1acd987242ef153a3abaa849165abbb2c469b97bcc9603fe630f0652636566ae4763576ecc053eaa25601975fbce0aeec538647839d5a3bf6cd78ea5ec37cbdd55957440f69bc2edf6ff523b3b9858f9905617d15de61e0a3232a060bc6027c8cd504498da7424ef5d393771f3c75043474ecea4bf5b56ceb8d73ec3242aa130fb54a973e905b555c6a88aeda7faa2619c7425fa39a64f06fbd72d7999abc58b1d1906545740dba912c6fcab9b40d7cf764303ff4309f13d2c7f938d41760cdaa08c0c473f4dd1b5d1abcb047f1100b658d9efc5a8d635af96ab329a03d5a7c0fd185c926f2a1a19461c432dfaebb010a47c753a3d67a374361288d8fe97e061c8066368bdb562f1af686344fa39b9071d9844d624de9ff93e293c0fb3b2ef64a1cb1c8423064a69b6c38a589625a2161a72c4bbd1cbe87d2a8a9ae02913cba600160db18ec286e4bdb15d0a8e19a50150719469f0c8da5276f3ab7e1e83156bc79add8347a99b5d2dc9c7dc1092b35bb8c912351086e28f4cf040373e2228cd6a85580479225ca12f7efbf225dd1a068afb8684b37bb84906a3fb0799666311b01213c3e8bbd17ad4ff719adec5026463ea3d63ef32e78d3378401ea5f210291e5d8e73f2b5e1a411e1a6da6afc9ed994c2d96f6c12b14cb5b4c973249c5529f1049f2040b23a6073fa55820325c6015d77f2751ddaa259d18cb7477c72d8e5b4925ba1832130d503585233c638b3fd5c4c89a770914ed21dccea5273199798adc8163c7eddb02596028d7f68dc19bbce0c1f7d94d61e7959373f853f0b8f84fec5173d9e32ec7ac54054165a445e1341e1f86947cb7f003245743bc77310f85c4218b6bc6ba2a24365b33c6c6c9a9a6f31cf4c15841c8e15a4e1f8415382d78626d9466b804dd787a5d1dafd33cf4d00338fa1fd278f3cd396ceeda161883001cd739ccfa07308453fc2816a1ae14474b42dd8ee9bdd7abf9ae445076d605cae8474335adcc1089d3b5bde5e9d546b456cece76edcb11e202e47d07a63cad38427e7f37c7573f8c1009f61c4b32528b7b7f2b9bde72477fd31f0daaf22da5481270f877aaea41859a09fc8f4bcf59043f39ae6ace91e9178ae03ab25c0dc58970c7f7711fc525c58c08109f0743cd696e04fe9074a7f48393e05c423f219ca3864c536fa2c1819ca0b5a12b970e2b2a30abef9f139ef18fa6338d50a7f25c54fa425b1a7b1be65ff3eb7f5b2d4ec3cce1926a3cb5871a53911323a2dfb00aeb17a46bed06f3bc90d32011c8b6e946824aea87ece2ae471cdc2940941494e5d939dc9fee80789f193f331e4cda9a8a7c0fcd9df4c7615f56746cb7dabc39d7bf609e9285ba0843ef14f170432e9fa87932680639cf98869046d213fd345fda5cc425773a17c02bf8a866fb85361c3ac5a0b32fe70e541faaa97de9431865bf4a8323ff70a2d5ea554dc50c96ae58e4009662718c206eff223046f4b3a586909110288f17f968b0fe6df5aff22d937a06e49694a4adcc041da614f8a65a0f3f60c34a914a6ceb9b55cae040dc09afebf80eb95760e579aff0c646c37b07723ef3eadcfbe64a240850d34e5ef037b84c40aaf51051d4f1650753212fbec42b96692a76c1233194e0bed1fd5447b01121aef92cfa4e20511ceacbee4321ee7df2095323b4b2a43684a25b94aa2441c90247705c749fe9dc849a5c76d35a42839a75a8dadf169cc0ede7230acf54422d28b429b2496d1923cf3d4bbc0fd54da3ac70c3520471ef92dbda7d3c2ef7725c244a3707af58419ce5e3e5e899b49944c5d0f92988607b2c1450c40b2814a0a8c327f875a6275100c30523e4f71f4df06c6132ee32f139e150ce3881409a60bcdc57a9604efda03c84084e007cbdc31262a916d6ce9bfe19d0e2203285d6871614f28e905265c1ca1d4eae62472c9f0f3e97168091143f6dd41d217aca4dbf3753b9110a831137ed2ad00d3706cc0090bd785e43fa6c2ac5bb7723f5befd3d00e9796c4e3665f06e088d8887ece6ab7be3c3cd9cbccf6e3193910c6c6f808dd2ffcbc5aacff7b67b305e2f30bcbc67bb7d8e3cbf43229248b52245b4f0366a01d285a0d92a96a5e599ca29d2cf0c6677a46d9baf950ff29068b9f3aee0614261929ee367ada836a7b89303b8c2f4710d0ade5e0ebdf91626ddb070ffdab17c5cacc528e8702653d52c4d1be96180475e55bd2571ab52fd9501e89eadbb35ff12068e0c60de145b863eca4d231ec1c05065634b6d7bb234c591be57996d414cf3a2dc6e5c2f0b8dc234ce2f197ade6e9d6f9e2d5c9125a9be5fcb59447358a0b005f36168e2557f064f8ae63f1b2f0ec6872e9f5f26ecbf9c81b092b080083eab678250dc734b64d0ae5d0b8d57c0221dbbb5b6bdef9f3c898a841cba8a09148fe833332f7807ff928dde30bc9ae178d69b4a09cf0cd4c187724fd8d733a80d0db613d3e27abe6fccb5ad06e2b037a90f894956169176051409d6965f2316816ed057f69fe2d51e5028aa445b2357c4fa05982dd538bdf8a3061c0383df88c8bb06b50c1f955272df4ce785cde8bf266d7aabfe06d7bdb4a2d26e4cae874035f820126ad91196c4a8ed413edc1907b8b1f7b0dc7ac65e7a679ac60ce8d2033781b34cb98025dbc7985f648265dc432a4baf9025e5a300f64e9c6ef10d6be2a73bf617cc00176299ad461c1e43be22673ef750fb8bcaa2a539539bb107e0307edb98002df8fc87aef1df1c1ded41b849d6b9852f47ff4b4d545bd9d808237200804ea4662c37dd5bff5c5c37ae83d60b401377719c92b32629b3f9a65044d9599b94b1492f439e93caaa4102093f8ca5a92cad3e200309a709e3c4d6020c52e2dc8a32b333fee1ad10b11aa9e5d8b726901b2fe2051a8f0ee1436f65b48111b74ffcf50b55198d139278ba9523be3b4c228c94894c5a22fe994a31148e7a85a43bfca06dabe3073e28db2620702660750d554de5581c8b70fd381896731ae16267ddfc09b628da179ea1d670a7659f0927f75c6fad0a67e21af8aa072958b10c8f9e9e4362dff7f547fcd1699594c5a94254336aed05b6afe24e5058a0e2bd1b252f171fef37236e0aae53deb2ac0bb4b4012f0785e8d8ee9e93a655a539bd7b82ce6719b35977d3f01c02be9080158fe59964f93e5dace4a54becbf22d5ae8de272189f43f85e0817b217023ed20c741a612f09a6b30fccb5a1dac16ec6ca8ad809cfa554cccc75948e54d077e6010585cbbd698ecf1607079a1b8825e8747486a8558632382e019e6f101a8ea8c0006adac6b81d2e609b621bc4b07cb50a71eb4923bf36d830fdc9713481a917af5d8d7f25365b32a8d6c4a1c14d1f6e5f88c3ca94d12b3c44dee3e34f0e0473c468a0475588f692541e2159ec25daad2df3246fe334dbdcb01f47d6476178b18c98bbd9814cc9ea21274b847bf6c175db0ed29176d0671f1821102aa2d58ac01b61e3323c39b7a3d95f081a228ca22ddb0c7602a1380182438cf1997f2050b52c15102c90673ebc4f9281d809e4119914d36930517867f707f38b9d968d980092dd153bdaff9c3b4bd8746a37563b0c340b6872ad40b232128937249284a097a49877cc542f3d2030f6c538986009197da440019d3567b222ee94c72d2942d023f07a45dc497ab8cc22fb3c1f42826cda7b241bd35648a895859b7a9090e792e04ea890ae6214117de01644eceb91087c836c896bf4973c2d8178c4a30018af586f50a03a9e5a1613de64e4b36fde2471c847f95f09d0778253a44dc9545f6125b2ad80c5546fc9263fdefcb482ada2d2cf22f0500b4b53238f2a5b24aeb3d30986897cb554bbecfcaf50207dd3860b5e99cc6265d6803e364961892c040271d38b5949608c35452450256a8a2eedd636c3ef84e982e05155a0782e135c31eba651ab3aa6d6b7ee94a2e2360181e3d8beaa94315c7c65183c48c89209662134730c684323b94727a728b1f575a5da40be1d4681af0d3330f10f45dde1a2acd0f9fb120fb636007fdb2b3b2034c7044e59e82a25bd664004164981d738816b0eef530308c7bcd4ef85cd5c57b4828143581b8939613318816f3a151126362cb99c29fd61e924211b8a80256d19806c2989da632c795a813c08ac7199b0e3e1ae96f23233bf2e335cc704862fb6c2fcfa02449a1e630efc87c12eeaef349a0244b98db62510b4dfb169fa8a3a5fd5952f7de6870bec39e07239eaa4bb82958870fb1198818a730fa9560708b5b05c555f5c9f59657e7843a556dd0328fcd5358af513a3034e66f969edfd5c33717417e195265be52983517d38f9ed022c6bdf3dc4ca93d510fcd8af1db4dbabbe0e0da255224baf887b09b123d8dc8e8afd95f52b9390b531f3b361fba16881205b4c775cf8d20c092fa084ecdca0091fd622eaa659234dfa680aefe6122d8ee448386c31fa22efaf16c1c9854596277965fc4f1612ac0ab950271854cc7f0335ddeacf3e10f7ebbdb52a1f0256896c7508127ed687c72e1e5c8e54d5fb9da63a96039623191aaadda9404d3481bfafafd11700ef91de30f9c65227b2db2b3d96bc71403d859346da0beeda9e8a231021b5e887e1ff6788949546712cbf9918682659166ace627c30ec9edf7adc8e5fb9df42d80960a9fb8b8461d2daa134782a94b4bc7b01afda1b949b655e449ae66052eb3b0237f1ec585f4d65f0ddfcdc35af695e061ff78cb40d4af326107338c190b7fcaebc255795a90a3f3c02476a94a66106209edcd06f543162ae40aab72b89dbf78a8a1d322e3c4f28cdd7f523eccb412d5177065f790cfcd1154a738bca1a2733fbae6bc5a1c52c9881a7931f7657cdd56ca978a24308595891b46a51ba2eb1ab7a2de09bd129cb9900f6cd9c5e1765ce9b12e9d3419fd779589a8a15829599b1eeb159c0880693e6f5a1659b0ddf2c3eac49834e7f0fbbac08789e836422e9249a34e73b4e192d0c2ffb55bb57b2ead2a4a99ea7865f2ec85cdbdc90a7c742322285c70f7e3e515a90696b17b5d53169c85e30a42b6043360c1620a8647ada1f914871c2631a2a4818a071368ce07bbd9bd79708dc72d861f2638da1ce5c578b7564bfbc02844f2699bb798dce4dfc2227932496967923dc8e591473cd10fadf67eca862cfc818f2df8689905da649a17fab023ea4b367f15b46caa24c62bbd3f0c20a28aeddbe2fcaeef2bdec528065b4136a2f45f5995744e03f7e8bf2ba1e86e4d32622834fe1be5977aba105793d2781e832bbf819dc26cf2c2b880cace60f77aa06a49c8c7255bc3b10e19d7d551c4d0f37830869588220e976879b2ea4470794eb3d23ac4f1a6aee94aaffa9e839519d36c5b615d179804cca7692e815cbfc6043463fb3d823091121ab62195cd303d3495523816408eaeb74c6f9bed99404e1ee6555b048169542530aa18e56e5778764cf637621ecd6dab41eac6414dc28a0ba950911695d630ac033403b0282c18f1265284444984d8844fe9ed881fda4d6e0882113b0d678f095b79c7d95c90fda637b3142cded6e306331a52713ee5e240dfbcfed4f90d43af6fbd1ab881c02234d05fbb0ba4fc8a435f1b89a489421b1bccd8c7cc5bc2404b53edaa59a948e6e113401114f1ee3b4e6b8203e1ddcae163e997465b8291fb933bda52eade31556f3a92a19a75efbcff66bcc4477e0ea0ac531120aca5311741ae27c7b308b7ec0fca03e3d9546003d9dda5bd0083128629d4373259dd32422df8142c6508ef50f8c95312746a8292510e79cc9224a3c28c1fe1b464d8f2a7d4fea8b3e0e518a5ca178fb8dcc443372a1def353df5a8e9e92c122c41de821f373cbed9048add243b78f1d9131e40f6fded28ff0c96a8f7cd9133ac3d1330ad52adf2bc710aceadfa4345682dd0c217fe191cb11e59391b7c339909eec2535a30b1894fd788c8ab6498a63f9e60f2ea9f96eb89fc55ca081dbbf97c51a3bae91a6762378c75f30b709ffe53caf2694b26ac225f32ae805681de17dc64cfe32e5e336ba7ef03538e798f48ce5be2a3d6e642f0f7377668d8fc13a57177722df92bde806a96075d9c8202420d29f1266658c5dbd0bbd0b742236dc75a812837084292792559988501ae79033f2e176398fd4214ee4761a033e268db64217f8e51e80974688d967f2c599278334cb9a48eb80eb744d178dcbefce69222261913061859439975ff3b4dca61d7998c5f8ebd49e9f6c72769b0a5b8f936e0041a9024fc6a9d7912927eaedd91ca0947cb8a349caa8084363482341d224f7ac32446cdba8c8761025948998721697f2580c52d73b9ac6d4453b756adb319153b78f89f9d0dae5418624fcfa9d9848a3fa10646da88e9aabdf86d3f78fcfa9467de7d5946fc89dbe0d3f77453bb9537539bd21dc614559571e7fdd9a1719a7aa81e2c04420ba31c7583446ba75dddcd4c177ff6a77d85f61125e226ddb606742d45d0a8a94416ddaace01d65afdabe38c5db2d49853d9b3bbf7d241a7355b20877e819c035d66b8526de9c59226565559d432c3ca459872347e4b386ac7747bbb11af0da648b06cef1a2d84f7fe6856f3420c89f03b674c64744b88c8c53ef9e0ed9a1eea1ac3b3bf3e9d93ad5e506664466fa7a2c9c8170d95eab0309d9ad8d8e316cc97224875aab604e95cbcd00f91e19a71ad7a830da44c31381e229107a75103aeb33ec0435049520361e095df30d562642e3c09c10d4db89da5df78b4d6eb1ad975c0b0e7195acd3c110123b587583a245a75980e37521a071e923e354e6f2401a8364c191dbf351f14f7cccce93716ab75728d4c7621853c9e099e6ec76f7aaea16cb6706ac754aab577855c28143159d7df7236f5447a824dd2265495b094509abe423493025354fd0bccaa500d2d9ac21d1447d277a743fd9d427ea492aa9ac62a5ddaab730f1c21971fb040cd9b51731e97811cde6f668f03c8146f9c40f0ed7dd1133370d7164fd5435ff9ee255f9aeeb2af4051bed2baa541d78566ec1909270b3fdc0092a30957dcc6aa54a8392e9ff56370a24527d99dd54f3737722f7de20c256d258ba138a21e44624d3570617d1c287aecdc4446ddb50bb4704cef8b19de2ec6c0c278b4dbb52dd88e45c2fcfa85acd32c1c0859fb57d9e6574c1611b516990f000575fb9f10bb11e32687c25e6a404f9b97cc2839c9d52c057768d515635bba34de96dd1b276d63b22d23a0365ad112edb7a16f65b13448ceb847e9da6719e013f1ded7c7bc771de235fc1ee2f604db305aa74146a500dbcd10d1b8d56cfc9a6d74182bc8e889d8c50cae717186601d2ea1f33998a024fa4d9489aada9398a043f44f14c36e16c992f52c1120a044fc90193cd5b7edc2fad087d3010542bac273ea0e73dd5092c270c12a0b85b270a6d87a0a2d427ee0e241fea0f514e2f0c36c50917577cf7970e6b2d0e3d0454721a4f55d82b9a48382e699cac80c9827b45be9141b4ca831e89df1415b10af77afe6494a24178a31459c9bae807387af0a27152348b1199a69d91a139ac377b20b83e88bce6f51b5a17cf643827855b0c82c57c7a8599496244d0a728b42a690eb29f889c3a7f562bcd0583bedabe50a8941c5d82e547c8cf59d5cdd3431a5bb94364d2aca72a2fef89888d535410ef69bcb41dd9805cfe817aa4cbd9115e9d84f05c5a9de85c4a7824632a01f625a0110a1e347072750d9654181b2622b0a3ea4f983b8f4e146f283e898c2839dfcbe4235a629c7b66d4c519e10da8ab2e9d74641b9984687289d24b2444bd052d79329ac393889446d8f45203ca80909d8693c1bf96241788c87de883d429618708b200d8912bb2fa3a083b0486a61591c91d527dbe49406aa2232fb838559142c800c20a036b4705d0e2496830f2c4af5c1cb1cbd3a31c28d0cb3244c96040ea3230c87696a6d0bed842482ca42f4fbf99374676d26eb06fb341c46984395e63289e81f3871cd29146213ea65d0c82477a86c3cb178a2a33d26e172b826aa26f69818b65b0d3567eaee0ed907055ff522e29241f015b8fda57c8a8b24c9c1ef281c01097b27196f13a51a03fdc28198139ddbf0be0c732b2f1dfb041c496565e43508ee919a2d826e22cc82b21a9b27b91296a746b157a1c81c82b172eec04ff681d16061d19942a06c708442051ca825001e2e3f8ee40002f254d4500df0c44e9eb65dc1fd9163a8e46a622865eb95c2cad81ed623a1cd833da7bb7ec12db3b8e1dc901e884e997cf495cdec21a156baadd4f1ac7f9dac5ca984461aa5ebe333e56224d4802d597e360e8471e4e1bd39272b3a963a2733aef0444fd4d053ae9bd731c9f8e53857e0dc3189e67afccda9e6316ed98a9fa26f260e2a0d46861a0273cd37b42f11a0b6c22d4eb5663988819ceb1f0af5eb2cca374cc9eeb3f1feaf11e9f45fa983ecec0ac1c070df30e0924fbebe558abc6911131873d385803d7c42d8dd5a5c4a9babbb40581177238fb220a8963d6aa9e006eca23f23a7847523598122d60099c5737be8574ac48c21aa2bb964fe0ed7dbfe9664435398ddfb64f662819258c8956c89a0b6ec2d2f7d2e0fbd3aaacf7f488e233e736e0863cddcc036178f1e801e96935bc9e02c76eeefb3d3851b256eff648869dcf1959071c40e43be7db4649740ca43c977d6f248d756a2dfdb8746c12448b1753597f9ce0ff2250459996a0124ac3429f7f6b87a64c11e6e7b580ab7be78431725888b4cea81ead80c2f96005f7debde973ecb033ec2bb683928e95aaba3d06a8db8a0da2c98a88d1036d198fda248a84a70d50e7fd0703b338d9e26c595540c7a0e70eaac92b830f13ea428478f0916c83577588f9cf5ee8e5f3b1b0bdf951710038be2dfa9a7b0242f20a831566200b79bac1511d2aaea200124a43ea0118fe9b84d7782c1bd505617c6d26743f9a71819ed224028e071dbe103281626fa19272a48cf42e079639044c0749060cd2f1e5b32892916c633fa0825074d4a403e773817d01a7d6f0be6324930c8883fad705160b10bfaa054468b10fe9898090889cf9394a9d1e7a9a331a1c1bf27e7491444b6657447fc5561b116d160ddd388e71f146d8acc235dea8f47264abecb461110814e8719ba349909546cc1e35bfd2a1989d080ab77bd67c0048f03678f348585eab157dbaa1e2ae7214bc157a839e931ae9119864bf0c63405497047c511b215fbefaa74273c7dac395e8b627e8d1efdb9fef0d39202854f66bf7e58d473289cf4b27e040bc2a830b5597254afe07f072859756e15430eaadc1c55ff2cdc826163907925532b9f1db00b4b205c115524dcc20e127c8d640bd5f355b53431003351063df1aac7ff49f1932109deceae0989295c28fdc0decae5c301288ebcc52ac9584d01b508875f7eb04b7d423760c8b640d03ece154de6b8c64a687caa63707d8befcf7c6d5defe968c49d249594078204a0c855cdf8bd0685d701c17ab96e44d078391805df8e63dba3de784c7b859394f9ec34c2471094dfa5309e2314d540e520d95488ca6445356b9f1e1d1d39be0a712c105f3568125116e539022595dd9d12b2329e9ba877808a90c945a7ce416ab2c7b76a995477816668b2d7902311e8226b776343ab2e687107c3777f3cbf1f1c82b650ce3e41f50e5f1182fb23ace1dc4fecf61252ed0f6fe9a00b1fc9a3126bddb1c14ec46cc449441a46c208f491052c21bfa5d6b794cbdfd11bf5f816a604a8998df19d9802b5045202a8f62f27b25e3d800dd0a88e0ba98e7c3ccc5f2e09983fbbcf0c831411dc88a20d222283e39b29af692a107052f40441a0a557a2814eacbc391f08bed2850941efc3e97a61ff07d13342bff85c787b6eb52f6335f2404e434aa53e3220b6648b7ec38bad5c14866a6cb9149e35f5ccd5bf3387760f45a2c795311769ded696e8a5bb02801d32255be65050cfa1739bad5277033ad77031bddfe100826badaefeea906da54a3c734df1548219ae0b4a1610c534099bd4aa47f751a990ffa0f519a24296137c27b718a0b344f01af0a2dddbfe2774476855b3c9cc46b39494fff999fd68a9aff30b457df39637f94c6de9b6ce32127b903839b116dd3f7507703760ca4dc3341d679255eaa9abc4a98a4689e0bb35e61567b711202fa9e2d8fa9ac67567b89dc2eb3cbdcf411307e8c8a052da249df1394b608c3ece6abf507a2b05d09f95df0854f7c7fa0b949deb642de419b86cd6ed8fd1516d1248812d26c2f64ab1168b6d7444361fff5d82434f59a8a68f2b5432ecdbe7c288f809a114d96bf5cb6257877577cc207df3f196cd47612d104331646558b7374aba217a48968b2147a08cda08e48928826b9150f032f72f1c37444939f041ec16c91b0a3c72cf0fdd2ac22fc0f428868c2dfcf61e4e6c1f2832857ae8474d7f8c0a7f1e1e2c74baf41b77db1f28a683277a7e1e64ae5d39e2ffcd75b652847878868a27fe3d958de5a96a7db992c5f83d4642c8e1607784b7df895f3d46b90099c7a344b8b4fbe3ae7974e13b753dd7f388968a2cbdb3e5d95310e949cd6f739114d5a2366627aab649b7bbaaff6403c27248d15e696ed417010606a584493d29b0f8dc51dea4a07024e78344a153ea2c9f131fe9c3025aa4cd11e1dd51f9cd48897971d9e5d4416d04890229a1cda9b64c71d04c42f839ecd8d1c0002269a1a859026f6f3c80c413f38afeb20b6799930d5034a59c8e371655723d60092b4ace37b355f30d9f9d6436cd6a6079a64b5d421283682583686a1443082f2a2253ddf0bd501cb915e62acc4322bc6697361492c3a9f88bb61ada2a19720e6d14b56f29b4204da9f0e5ae41591bd9e7e81a2527918c2bda5b0d6ec98bc3eb359a9e5e844acd221f1241e5b8e59791420d6001f9ad465ddaa8da8e2d72dfd8af31199f6793cbdbcec38780e53b296fa2545db920168617cf60868b2f9b9cfa9a5a15733d128c6a6dd3d99eb090f5e68a0091f81846a7ca101e0a63be810a1fa9f7dc6b645c69e1ad0056efc1b7000ab1e10454a5c8bdf1dfbed9c617efccb09b4d28b322d0449eb21501f788c961e9727c2f6ab2fb6f16d7351f3ec86bb1cace0f047ecba8a1616f5d2657d49f4abff41033ef530e615ebbf1cb258abd3d3205b564969d73e84736792e0a5a6f44e15cba5fa8e2d5c8a70dd436c7e10c61119666035cacc1582732d3383fe388f0bbec682519d0038580f5ca7cf2f78fb96b7a4ca525707a631a02b2a20f408116e8f53f603b499e7e021a18f71bd2569a40cdf80a47370836b1b0dc8e02791145c6dab58caf763a3236d0b04537f410905052525113d5e52118a8a3914e6dc505b08a47256b5751b6da974f28b3b7f4b7525be0fa19ba69aca909147d335bd27dca396f1e24506e767644b6259b3143075805ea779e6bd4444a3a045bc23065d581e41b85e2f0e11e8fcb3d697a8cc70557f313f882c177d521c0ce4f283d723af1a5c53345cdcbe47658f6d619fe8722ee1095138ead5df9bad1b3cd00196a65ed03e663118ee7b64c1100805836301517608602c0263a471bf0612e612f7242c1332a8eab38882068e2ca69c0ccc6c0d58104c5a85b87e069b8cf6cd9520df8716672b322082745eadaca75be8483eb61bda765580e277a584c61b15a795f75aba210aaee217ffe7138428edb189028841540c778e07d3e9fbaee1617db04dc009f1d2fe2d7a04d9f4309bff3fe7d37479f3f17eea1ce754742dc378bb4d881a6ca93b2e7b8f5db2ea427e1693937c3a92e434f299f548ecd758188698c3ac2f43c501ee0db0843864973214bb036b8ac5afeb046010138c9d18e820eb3d6c23a2a271dd08c7bb9c4db4eaf20cc14a1856d6712b11a2fd342728de1eb4b2efbed2526c7bc2e62288ccd328cee7b71c559a1e2574ad02fc309fa377bfa5905e8cd32992757deb0dbc62fe46297eb04e54f3de95c9efa10c7fbd80852982b5b050990661e80b1abb6a2819f9d6bbcdc011fe6a41b1d08df1908d6e3f9056fee0419a792f1dd0a4fb83d1332a3752a9b0a5fecb061387df7d038898d04397783534ada24e34c9bcaef81269f8f1beeae702689b88703711e0dc55d5a8db42e590c84fc5481f8334bc068558e6975474467ccc8cfcfd6a146f66e2481b09375fb0783bce1ebe7caada3e2315919a23b2d4b2437a9f8f57e271f56e0f4aa144f696192f657fee8d47ef321a81ef06873772fef8f6212791823bdf32b04ed987dcb46cd252c36cd256bfcf9e7349438236cd319c36f68151dbd309559bd391585be83cae2d7dfad7d67eced8c63bb9d9a6b1481f446e64508166d7b8d97852080b1bdcec4d2f6dc339ffe528c9ef627acca716ba2d1dd8dbcf374f9c9fc69068635279e476055680872785fcaab94392d9c450f0750692dd6599b747ff8f11eff510f9b673769091cb86d5875ab21d72786f520e26cd2315c85cdf66a9e26f5ded05b2606929a414ec2f368f10e6cc95716619732c662ca52a0bc27155c98fe031dd991578a3df3f589e2c9a875ac4aa145ea4a24b05087fcb5626fdc24517864fbd64e9e2b80a74eb575a89e69d1f5143262ed14897e946d460b124810a55f878fdb46a97e3d8d116477a49030d117bf40704b903b474988c3475a64233b66d3f5e4adfae62072047cdd26fab2608c548fdf86892253e500cf29b760c2acc9c98eded37cf24c66908376845401ed451842c350f2dff9cb6aefdaef992701939516e805696683ed7a8eeef4b7f9b91beb339d60e428361830c2643f8525b9902213b538682ab0ce83a297f926ccc9580f7e08a155dc0131d96d3252160a253aa67c62a2afb23f3eebcf95b523257b8ad4b7c4f1b9388a0ffba7b5c0ff1ac07403eee617e89a95386e48505628428e96026ef19cdc78ce089ba8ce8cbb5a1dea8f86dcc32d96e585b52b455467280c3756f33b85306ec39a79366e951af5c256afc992707d458c0e4cc24a6701b04eecb0d6b662627464ab81343ffcc49b5a3ece95bd4546eb92b20e558cc36ae88bf2109fc7bf0dbcd9bff510545b338265638afa2a0f31086af9716cb8c38a71a94c7107972f53928a30c46f9a9e079cbef87da3073604e6f4e4c47c7a064f018ab43af7b992fe09f9582e7565790ea0a75219009df86eaae283a154daf79cac64c89585b17ce84e075a631924061611c9a672be4b2af85cf7677a2c95bbbe773d7e377e831576e54830f10fca9043e8644410f561048cbb83902203361621233899982558d0078a3bc5dbc01fff27d3968842b3da19d4052bcdb236aa265266b8bc88e2ddc21bac91288879047a0b7e46b7ca2e865098ba4d76ea015a5ef577e9e186d64bdb4b48994294c10d40ff50d6f7a2476c712f94e29254d502a232cdf7b0a55dffbaa6965c378ab1f37393f2c110ecc7123c23a1aed709e0d63c328e2478e25f280b08e463b637dd3e9b5376289a05ee3401ba60241ad4e279e0eec0c095381540bc604d62b401bc6f4ad6654364c15136a5ea0423703b4a62040ffe14646174384e643d524e1d5a4421d4a8446be868f54844734cfd53c4d2accf135b526c7ca084baac60b6bcadb469ad53646abde6a884a95212a552c11eb9c9744c879db980ac45b79354884ddd7d1c8d7204195b0b64a4b24f534affd19db4a96c8cc36a60209373234349a03a1e5299ad5e64605c2a5386f1b83856734e25e6319bb37e2b141ad8c768c6e4c36dfca28f4beb09ae0004110959a41c3076e0a13b081d9401b13d0bad82eb68c38dcddcbc0a07ef100a8698e05e85e6b7d859b11a311aa3201d66ab5cd3dd4e77d4588a0d6fa99883043d334d389cb07388e3b814374c0f33c0f4409b10193c96442a582280304c1d40c1063a452a9d40c8dffa04618751333e382042860240a758c46dfe8262882662685024fa6cfebb84db3aa6dd3b41a80fe55e3362ee4a2d6ca753e7814d034adf3348d0a2a388ee3bccf468d072cf1bc2f65d25060c950c3091316b6da2de0e864a061835aad16021a3170d7d15ad0c3c6c3383a1967903112851b0246a39b33c4d800acd5dd5df5fdf8a6858c14607103b00e119eea1061d0902df26938d6ddf037bed7b63636326ea3b88eadaaa02e5a91212d3b26378c424dc7dbafdf79a01682e6a56ec69d51b3afb9d1a9bcad0d7b03c4aa6e59552e5db422415f68935a19fd832ba39b9b9d711b5357b8b2f2b6311548ad5a0d97d0c84110c57b1c4918467c1056234b3c873d89015694456956d3ea157505d7d1aacd68147aa10583b4223445665e33bd6ba94fc3f94e0fae8caa17e3e9dd823fa3728b03ae8c2a16e3c97b5baf005381d8556b15a4e168a69591a7316a1d8f2d7225b6b4b4b4e4c3c3fbd8307505fbda0fb9b2fac25420f6ad689dfd1a2242a315c410f1ecafe03d3e6aaf1511ae9c8cc97669189da8cd8ab160ea15368c182be68bd0863972d8d7aa166edb97834b35f13147cd6fa81c3c3e844740ca870c3c3e841fe2b1aaf9107e68c7aae675fcf7bdfd1eac391efcbeea79b6eb348edbb68dd3b4ceda91cb91e3ebc8755fd3bdb53735df3dcdca5d47fb1aaa524ff348349f519d3c636ab58da9402a1315136dfcfea46252c7ef4daad075b4f75421a83eed73d8b0d058ae07454538200b2322f0041a60a6e87630e1036cb060872c44906185ca053c80400f2e40060562b0e980258a2e3cb0e4050db87859d2c2071e3840a412e4e08c2f46b00232b4cc5a004607c618e38305a61023031a9625e26001103de420881a2c6d59d050820728c8e2800c1ce1830c14f1a5861f8a98401933b8308202f60d2c50f4000a3374d0800290f862dfc0b24515330023c413646c9146189fd7719b666d0e46e7388ee3b80d023c285102279608a2054de8605bb26308c106983252588102387a76b0012eb088a3054790a0023888030e295cf00302c8b8020540b82560a30a2338e0c41309d0e0a85a9a5040067858c0103df868ef2ea6ab4008c6e73cd7ba0b18c1438610dd057c20030eb0eb3a2c4970918006f460812c50a002313ed82e3081af3c088a03cc0f4c3082207440089fade3b80b7411c3fb620dd4a7f9b7bdf7de7f71c669d3e1fde03c8d2c2cc0c01716f8400b996ddbb66de3b42a38ce3f4d4c17361ce0c50721de084110ea124558c1003576e0a287d04647a863dbb6d7c8f81db66dfbfff10fe8a28d2f6264c0c40d903881a7755dd775a90a70d1be0dac9ff6d950c6160fa081820e84890110524058b2c1113288a20c0bc008c2dbb6cfe3b8ee8b2e5027208288534ac3518527088db66ee4346e749daa1ab9ed67dcd78cdbb66d1ba7a3d6d5576be5b1aa0a8eb51bb7d754db58b7144650b3d656d7c019fb2bfb7d268f89aa699aa62551022fb40975fc20f3832b4664e08c2e6ae4a00c0f3e20059cc08b133071c40d2c1046f341b6428d2ab8b031051c4b3ef82101111c18e30499312820c6d4450e8c10a1ebdce8c1468d1cdae7f5f0b82eb4e9820c23787491816d87b60037c608820f4300b1c5082e3431392858a2880544c005327040175b00a1a38b298408814b8e2e7e10a2260e20421d2480c60d1f66c29c91442acc05904085b1a208308c97214e617e40c2c4051c417c5cd86008afe3b880810f1d171d5882e3a20b22362e18a0008d8b0474b15d1082d8d28387911b9d0c2c1ae0838be9035305b76ddb6642853fd8a2013518a0003014500232c004a1f560dcb6cde3c081112ef08103501c61019f8d041b6ddbb66dfb6143c60f3010d8e1c70f304d80e0872d3f36b0810902880907b491011f7ca000161f1a360093d8020a06b411831f5e500608a9323e27c8c2075facb1021d24008d18745dd7755db7850ab4d3b76da181cfe4adbe1065d2baaeeb3a8ddbe2029f876509073fc040105370608c32baaeebba8edb6cbcd1c93863031508b528b375db0d1726005cc785c7691a05bcedb3093f940ab270400b40f0441438f882029fc60311bc48408c0a6c80012e9e50838a4ef37850e3019dfd6cc20fb545145ec7d96824dc8c316a5ace8f1c359cf0c1c7e8646ce1c39802c268f42306689420c7a669ff7961d4689f4df8a1c2211a37040d2cbe6ed3ac0dc76960701cc7713c373b395ace102fb421da0d1a5f3c8ebbb1d9b137393c9e8786151cc7719c9121466eb42243d068c0c87143b89b214378bed168c8cc0b76b68f4383094dd3b4bff9f1680421c487060f3d78706ce972f00317ce607b1668377f060a38ceebfcdb344dd3344d0b354e5b693ab41f5da7699aa6699ad6dd9c11022daffdff8f6e34fa1d1b685968a66efb000f75ab261863cba66ddbb679f146c771dcc6719b0ecfe3388ee3388ef33832bcb8c1c8ede0c3711cc7e9308d4661a7c31893d675ddb66d5f10b494b9001b3ad8020409d2e0c14646db010076f0828d194c400d0a40e101c1c1152ed0800e48c0a1c40c3a1dccf0c6195f2891041a548ce0b58ffb6de7e67f0cf9c1174b64e982030ac081c406fe8d1ca408021633f800125f80b16962a0c6ee3f54e72131d37576ecbaedd4c69836b438c109102046d771a19d60b3200e25c0f0a0840312d0fdcecae84b6387b1ebfeebbaaed361b39d2186ddb44ddba2d801056a5440076584e884183b2dbe9872e08037c2a8c005596230050ab8ed8788303a195a00317ea393a185169b0a8046751c8dc06a6db50fbadbcd47df34edab5ab5a356ab8f208dd151c7fdacfb9a6d69697b1fb5940f5f0575e18eba321261d442ad568efbcaad6c7c30518d3e808cb8d18d0230ba511ddd1bbdd5a6aae3575575ccc162d9ac0706e83d08facf09e8b4faac67b4c3d5caa13ce7f93ecf034f2088f2543f1e9007a6521b6a66c6fbfef43429a0ef04943a791e8da79d52decac7e951284f3593f27e3c8fc6c686e6a77e6f643a3d48636968686868aa7f33a79fd4f79980527f7a4ff5935a9dc0d3e9bdd3077a1e2af5f38d566a1c5e78fac21450ea7b552af5d3d1fccc23a0e6c3f7940f19687ee687866ac299d40f575337cfa4e374dab1034455140a854285a023857a5398fad1c0d492d383a91d6138737a7086878d0d8f991518d6300cc3d0ed3773fa1fd39f4e3b52a84fa552a9936965a5c6815a3101c7d3ca5de7c7d6a068524b503c524339523fde88fa1f1f4fdf23d5c4c7935158e3187ba4a4d0fccc833435d07c3f75443da8a3ead0a143870eb7df0c6a47eae7f4a8f75475e4914a7d4dea8432a1de3bad988023ea533f750477a03cd5cfe94fde2aa5e3f374a456a895bb0eb832addc75be9551f7d6c7f63f1ab7adfe647338a1756fdad19a745aa7753c39befbaf43753ff38563c8ad8c7e657433723be38e96433546c861e1c2b305e1c612318dfe5a911d3dfe8dc251cc68390e7060b832ec0d0f15b7821e2a0e0d8e034e841b016706b7024e055c0abc07c59d8053833381f7a4e13d68780ff79623c39dc19580230137024e045c083833c8706c18713018ed736bd8233cde3e58a3329d40546a8686fb3832dcaad6e40861070fd30944a566686a54a61388ead1a3c77f9e0a895b49d16315f22841041e5b13a10db2c6f87d3200b90739d5879f366eefbe69bf79dc36c39ddef40848f9183a99863eef97e89f9f6edcbaeefbaae7d9aed3386edb364ed33a3b1a7d461f8a537151847534fa4c4639f5e6c6def86bdf8d566a1c9daa1b3b26b4325fc46ce37682cfeb6a1bdc56b7d7bc8c5b2d53c7d15575acf594c609c5bd11ea9ba96f3731333ef8b8256e8bb781e9d668a30d4eebb25931b60c4b66ac61190f6b991189f501e4cffd8fbbbbbba66926ee41ce56ffacfd3ea0ed755826dbcfb7712b95eb58a971fc705846cffd339d4e27d0643a7da91f1e1e0dc774e2401b1b70c8eb3894c9c4712720fb1cc86ddbc6d98d33a57eac3b784ad9b72a295e4585212a25c5fb0e951af2569f86a3e1a4524d7ce4fc9bd980b8df524c4026a0fe01c70d1cb995f6a99f3afe8029ff52dc6a8fdb2afc01f41f4660e5f13b4c303ad8450c04636fac8706150dc75a222fb00b27729486a6f2c63ac568df2e51d18a8060341c0b9671e444400e8060d2d8a1eac0e0a1eab6701cfb20079c485701bf29c312e9aeb037160ceff9a2b340e745d785f784e9b8f01e30dd16de03462be25a745974587415e8283001ef09df7e7785f7d43c08260ca36e8cd17e27c61ed9f1964ccd32daf7bae5eb810f7e30da379d5070c4a1e950c9425021e5502595a95159711dfba12ad51bc5e3411e7f32f1f8cfeb78ac942a026a0f4a1ab78a75231aa3d18905535c319ed6b00f088d6a97d116c9b1b1214334cd6a9a75323ca0192158d00d6e7b7053b9fd2d0cbbe77eebb65aed6ff6df6afa071cb5ff01479b83c5a259db0468ddc8464a35996cf56fe6731dd7713bdab7355fc26d34aab1a1ebb88eebb040db4a657368353f29a0baaaaee33a5bea27b49667fca1e97878349ccee8fb99b116e5a39762b2c3da9d1d53ca4ad84558b555fd4ef664b7d55ba9718cddaafe2a8ef105a05686ca7b3cf04fe1674a81cfc3e7a3a58a34dd21f7db66f43e7dd4d7d0db7c4c3ade732aeb3ade579545fa3cb5e5183fd5ab00e0287811c78161b4de73deffe8af1a3d4d158e9f6aeb3c93cfe7037a2850e5f9801f0a54753e9c0f784281aacd070451a04af301511eea34a3634ca95cc3a9a119add5617148186b2ad47cac0f0856b7e0363333a654a00f4ae53e27958d8663356d04adb6cd6c1fdaa0c68e03bdad0b61fcac0704d047132cb55a8b426ddcca7e95c9c6fd70d56219391ff58f3a1f3278dffd90e9bff756a6d5f7ad3e2df5c369dba869da1686dfb7a57e341f43de772f45c3e1b4df34ed37cd81b41fed392df563474dd3ba94a6d2543f3e722b1fdb1f6940f6b7d7543ff699f8f8f12fa531f9fc34725fc76dc3b2d91312d65a6badbd41b52bc623bb5aa1ec4dfda25d81baa28c25c2637420d8229d18d780187dc6dd48a3a2cce723a48162c26fecdb104175b137df89d18a7c3956465f082b31dfd789d9198d3a3144822c134e44482bd26dd170ec7f5f18dad8fc4e972f424e041501bfb12ad3138e637f87caa484e3d84745c089988cf09b2f9688898bbd79c2b400ef3939d184f730e13d4b9814e03d5d1725505db4225f122624bc27c7db371de13d21bc7d9311de937afba622bc67e6ed9b88f01e9ab76fe2e23d21aa4b7d61cb476164cb8e8f8e37323d60b46ff2628fe878fb200b462e83d1fea71529530395ab33457c58200f34d94af4a13c5b65a85fad9aad5b6d524bb02d58122c683dcb55adda6a6b4f2dc182d6dbaac669b516a95abda9a68aaab5ba504db027cdabdf566dad3db5763cac8ebad9ca6db5050b56cd9a5035cddacd6eb5056beb08f6544df5db6cadb5a796604f9e56b76fabb516f96a93c267445381ab5a35d5cda69a4c3d60017c985001b0556b3bebe11aeed8019bd46aabadb5eab8e731af014b25438031fe0480a20d3308a062c30d1a6e0b243085056bf8904a0d1782220458e882c0a540e185135254398a0c50189109ba43903881c2841c34b924ecb400850d9016ee4c048ab020f5a388ea5489b0a00681482b8e051079385c6cfdc0049dd6179bb3c60372ceefa4a082971c1b9cd07ad409df23877b09c1066f7144f86f3bb86beeee007077a29a32ee079055d1a9886397d4d8bd8a07b93b0e1ed650b9fb96ac148de643fb62690b626973d2a5f0d5d34196f0014b1c87f204a046960d8a205b0f541411e812b0b43931f1389160b3c39289005b0d9a09e0ee501f938fa73b692ed89c380e2c7d60967454c9622aa2398103d40a96b8389638d408672ca1f6ea8b2593cd8cf55ce08070476cd9018aa0840e1b104b342a1a95a65303e4b3a98943074e858fc733a2d16846be2896b427418074a78e8a250dec46d872c0205add505bce8909a78247806e84eed419a174a074986c4c3c3c026841d0a11b41bb4207ae8ca500186db06705a084ad0745d3d56c55d3d1926c41a81e9df568f07c7850b81d33b503356e43699a66354ffb34d389844df3a6783968824e355ee755cddb866c40b6fa89a0f9c8623a818bc0d20c15596abacdc7a744876d053aac58ef71c0110313a4110233345086ac4888082e4b7c6078a148466d3006080a21cde715a0862850e2f800094470c2103b5d9440b2c40ad0000119606c6185144044012421db43e85407372083821290408c2cb0e460802a35508902e587c90926f4e0e1451758ac90400e38b04a2021a327ccac400556604b71c0c1831d5429400f1e35689031c605c0d8428b090c21840f2c0310808628508040f081313c60812e4d4ea00608c810038c2f1e10c50f08d8e10664d02801185f7841012d4bb8045a529322f3023656a00131ba0883c5144404814b9601aa148006a0252ef4e0d4a440f0010d38c104115a70698001003159e282bf800d107c6003637411068b094c5184105a6c1800d00b2ef4141912042747cde671bc800d156c40036388d14598094c5104114204a1a5052c1baac0004404c20f9cc44033930212b800f103151a761810c40f33a52a4c716870d820703fb03ef822b041c04e61a5a8426c106da78aa08ea682f63c4eb024541fde089a08d566eb51799842c891430b371ad44c981a01250248c2a9c6e47d9d67bb8ee3b4ea9d96530038b0e4993cd336f311f14c5a09a8a12c5056df4d77fa7836144ddd501d6b4bd2525acd96c60e4b2c7533d6336d39a9127824b0749a01556e393359ec101fdc94ad764630b0f4821325353bd8edb439c1e1c1120c7448c18c2c95eba939014916bb8da0e9c4aaea08a7420996baee84202d3b687c10a0fd64e9614904130d281d281d3730d911fbf469074b46b6e9a75544e899b41477b4f90044966f9be94aa8342b648901034c299ca1e52ba3c48c053924355e0b5b0cb80057e8100277736272124057654bc16b41072ea0f8d1010243f00877b4a448270908630994b998d8212584a6ce4082e6822702912c27af85eef4cd6845807eb4124e4c76b074f28052425f131f4b989c4c4d5042a5112e967a6c39444e5d4f08a9ee042e5919e0014ba7af8909443f2c715ac8d54e86eec4b9d0a570c407949950f89a74274f849412d38f0d8aa9870e120430028f143e15629022802ca74ff45648ad500428c8436dde085c8f46c484da5078249ec93b6d40b818361e2495f3a1a9381e3ba68fd45a58e282cd77e2612a9225091470c877b3fdd87e7410584a616653c2a9c09960fab1914013442b4187251148d55c9acea671075819c0882f326a8504cc1073851510882201587050d2472e4cb60c50a5062a334c110a723280263d3c2bdc08200000f86d0c31e2b0811b3180e14800562388e079f14007a478800c4b60e82961070aecc2f0224c155fa488a20150787162ca0d0a4044269618128a03086f10d560833160b0724d114398ae232e9cbc2f4470296232411a537ce96981480f1de0e9f348f0b1851655701905ca0080982ce91912042747cd4c6a5b80103ef490630d162c60850420808586198a10b1d1b185c08c1ccc70e4052226af9b000f6128c080248cf8e1004f2c600143448172c4051450f5079a0f6c998dcc8fb16d6c31b02ce0d6a86a5834ec19a612a0486043604160bdb013d0acb0479b51fd514ff84ae0484889607bd81d55474d085c0e5b53c36dc682dcc99abecf7a1e67b7aad5dab9fbc989f80d1e82484ea2bb51338d01c165264d5496e35e4d2731e9d6272edafccec3d375f7cfc31301dc5d001e9e56084f37de7a577e9cbff9c7a5f9db7c1766e94def8bfc6bfe9e1169119a7850b355ee3ee3a14906defa22d4c4afa4c7b979c1c8a3661126b24114c502bc8abc6be1c63926eebebde64bcb37cd7a55c1c34f86cf086a6e8dcb7f91fbc27e67f435cee5e3dc60329565fd99f07d5ea278dfd75e1b258a434f0b2f8a7fed22149fefca8f49f3d49f66577ab77e5c84ded424ba89858d0a77c7b274637d5e579d410b41fec8a7a98c4ce17bdc4d778f79d8690026436d38e59c6e6e70781c4e39a703fc1fe0ffffdd6d0aee16c7dddea0d06df99e2a4efc7bc20ea7cbe1eea1879d75ff9ed3f76c173eff4fadfd2a32d3ffedc2674bdf175e4041c879e1fedadc32a27f6de2d7fe1e5da2b24cf4aefc5b96dfdd0ae0d4f3fb7e898f4813bd316ec90bd0e3ee2378c855f193e86e198c1bfd7b4a4cf4b3f2e2f4bc5bf624cd69ba2429a769f6e1487017459d8a658601d930174e33e979b8015133a60c7f23463ec8cdbbbbc9ddb5bb53f1705339917906d1d178cf769a896ee8aeb46dee3b55cab87b95269650d225d448e0ee2b77b71e6a65b8af88dc6d00dced0f770b00770772df6a36ad66f3d8957d777b82bb35c1dd96e06e4970b73edced0835e6a07bd5e2ee357868ddc0652671b923b220eee8f0b0a08980b882ececb010e412110911521609e222a2934d51e37d53529ca55b9b453805928bd24b5a2f7c9b674c7f6bdf160f0fed1077cfe1a1e5e27e5ea40cc3694d165cdcbd8787d600eeaec3433b00777f410997a899628d9aafcd9b47f1f9461e137d79caf24b3f8ebb0b71afd9dd51af19c386bb15c1fddd6de9ee300feb111be6aa55b87bb5369ee634c58fde2f319aca364e378a61f88cc1ccdfe64df717a1e6de179666d75faf0c70f7eca137e1ee290febbbfb0e0f2be8ee253ecdeb7a8df78ce8df951fcde6be3f4b330cc3742a3ae76e55ee6ec543b771779d8a244662255d329fe705324b6f4a649e40c8540321324f22f30422438b749464a879eaa049193d42653a4388b088f028e9ec882c14118300d1a8795fe499f30612936d2d4b81a4b83c4d1911100ccb2f20eeb687bbe5e16e77b8fbe6ee2877abc3830308d0c52c2d8dae7d597800c11a29b407b5d512abd51840b7a271e7a745872cd5beddaab66d5a16604d14b5d6a3fadeb66ddedbcd37edbfefab66a4d5fa9ba6d92b46f5bbdfae20d9adfdf79ff65df1bed54e35a9dea63aea4caba36efb1ecb6864bf3bea5656ecfb5f01d630c01a7def0eb4a51b695359b1198fbaf7b1aaacca8acdd8adb6369abea69ad4f1dbbe7e2b2b57466f75f4409cb6b2e2fe9e8a1262c0267cff8fab7922dcfe399bd1532af701512afb3e3ad8ea63bf3ea82d6928944559ef563e9878df1d792b2966f6bb951433ed61187550b9cfa7d2b2fd92f6f5ad35bd4d05997e5369c101fc6a4261595a02553cc0e0a3fd49a5654bf5d19e07187cb6d750281db4af9f526949fda7d2b2a47d5d69d141fbd3f3f03ee06a49fbd34acb96f741a996b4b78f52e99092417bed83ec3beaa4da52b7541fd3832a2d3cc0e073fa2dd507fc0d855ae1006af984dc07b5c2a18a21f0ebe3707aebc399baaf3e718cddea488a997d2966db8741f66bca870cdbdb1fd2befe970adade5341da6bb6db01fcb42257aee4605ffb1cea6f7fa58a21ef4f7f45cb96f7e186bae73e07d37fab2b3cbc0fb7ba928369c57db7caa1fb6fb5e57db4f7563974f5b995f6fe397415f5a92ad5964dcb966dc5c3a715b1ef3c546105061e362d5baab002c378f43c6cab2aacc050534b5c0c0d60cd03c858830b0db49060f4af618cfedc11a3bf87c5c891418328460e74ef41f2c12df1c1ad54ee1f431dab7ba927f509b732c2e2a3d37c6fa3f7c47b57e56c5dea497dd2b98fedb5af39a37fce68f445a96fdf7e57b920c0930a54d1d0a07e6685c3cca3c2771f1cc04ffd0ca70f5738d0fce9532b1caa18a2f9d3e3e0e33ea0ca475dcdacae545157338f5af9a89f7a2c3e57504f033ecd0f814ff3f5694e9f5a5da1f9d35fa9797087eb7cefa3fe6b38da63f141a97cd4553a84faf0b3497db8ba7225c4e243b3ba52859114343f431d93c50668689e6695030e483efc9a9586fa6f15ae42cbc2f7334ff3463b0b9859056938355edc0c15161f940a8b4f0c9aaa2ea13eb5ba7225a6e168dfd270b447ad94341ced5329ee63458afbccbc14f749d525544ab363f552b978e9e2c5ce3c4a4563fa4d5557485654554c2a1da2f999d5952b333fb3aa342b29eea3a582a1d168de7d66dea86a342ab0a252d5c75375a5c3753ecfc7f6f57d4edbb8fdb66a5533be29726c6ee4e0b81cdce7e872e4d8dac8f19b1b3972e4d8dc40e5c881ca81fa5027ad269c497d39500fda1a1b5a1a3b638d6e50df36661bb38da9a9de981e3d5ed3b4f74eebf1a0a6696e60b9e246e79ebf8f3d7cdbdc7befa1b9e1f5f8ad0d37bcf71e8f44eba132da80d0c3ebd1a3478f37dcbd95d1466623d3c3f33c1e1e1edff578adc78ed0f3bc9d517bef5d2b22c2eb78d78a8cf0393efc19548f3f7d092ad7704850f5781faa1e3f82aac78b60a3720da7c7ca88c7eae419777c5e686d46cfc67a6f4dab6dcc36661bb38de9b0f0b0a6283eceb423954a713b4ea914e77d9ff236321b996dcca7bc1d3b76fce6c68e0d08a351caf33c2ff534bfb9515df0b63746a314cd8e1d34de8effd5ca682333a64e9e93e7fbb1763b56461acb7f3a56465f08ab1c466f745369562914e86d63b631ab4f8cfd2c9819ffbe9999cfeb4ca73f7d2aa310cb956f66e6b31d3802bfd4f79d1ef53d6ae69b419d3c8de651e1a366be0f77c5e24b7dda0cf87d2af5bd4559950d53819c4cd5f3402bc6ebc00eecc00e046d073cd0f340d003410f043dd076c0f36c1820085a3156cc12f07d6f0e00bbd740cff352a919edc3d487a0722d95fa1d2ad770663c1bbe178635af43e516a726a49949a156276a34751f428ed36a6fa3c986a92e70afd9303ab4d5f7458df72068c180b6033520c8d5d830402bc686f1b05cc901ac31c201b41d188dbcdf7604dfc1b05e013e8d0da36666e6c11a1af0695623989ea3799a1a3004af6201862b23101582bfd930368c0d63c3ac5033d6f301e83f8cdc8c8ec6e45b8d1115f5d5d5873a2234daf91e101e999e1b8d764654455b67186b5f569acd146f14482b5dd8c647a4b9952e6c8a9259a238161b37164af159a2b70916d2b23396ca844a54e6c25266329f22d42ccfdc046fa52552504c6aac24bdf84c52849a3a9f494abc639824c7182c6d82e25894240c25064b9ba4d8854d9d635849d24dcbd7366938224bb746818c9078062143908e188191547a7a564082915458e5127c12c9b2123336d210453463f7537c94e62496cb95c53fd277bf8ecb951f4a13d7d8145b2c34b71e357f63ed2d089f50a12af10da6e96c5820eebeb9454163738f4af7494fcfd0a31a9f8f89b0fed906baa9ecb2aa9727a6d6cea75092d6ef7cea9ce21bb23691ccf2efa7b8dcf79491e7253fefffe15e35095cdc7d9317c5657a936232568962cdcaa54cb336d63a31168ba51383914a3118a9c462b9e600774fbda6b5e46e849aaf6737e9bc8fd3fb1a76d31b2bb2c20a414c3dd33d3d7a2b617163fd79632dfb9c568a8b2e7a9fb47e46746628ee3ec4bdb240a567f8489bb00f3243b5801575e833ce20200847f040087482bbeab5a951f37736d637955d1e7147672b611d2d3b653019995da8c9bae98db18a50b3e86ebdf3a95978df32262bcbbb51bc519385912e3ef56595682662cdc87d4bb3442fc93a896e8ad15386849aac8d750f4beb198e41346357e8451c9bed9fe1a357e1936e6a9e2cbcaf489a27912cb6c4c99844e84bbc2f8af725d14c4a79b10835d3adbfc5e3dab2d6df1263749b4af8af89f425d639cdfbb5cda4adb1de79868f1eef9f2f31d62f7d5fac8de2f4c6b62cf6d2b7c9ce39656d8d8bccf2a56f1328af2346483c835e92e2f2e22647643e897a7a48d3479b1aa3f80793292e512c94535c039aa1a01836bb41b828bdaf24b36d9e77a7f989d2d01189491c13a2614788901592ae14255ca225d0ede961c5b4d6382dcbd1dca7ecc9ae925641abb8aa1055a9526555c5dd91b87faa15dc3fb103dd9de5a192146b1ddfb8f8b684bb1bc0c324b12041c41d31880e9ab5110b9729d649a8b863d7d53092ca79659bbc45a83963b1942e4c63ec8ad2d3d3d3032395302c935b965ffabe5efa368191544a93a533c93acf4bfab47cc6b18c8b5ac7f2163d1cc5b88ba36b0cf53661e6286ef34b9c6634bf92f47d210183d38291544a140b6919deae7c93e2a4d71833417203921f2e26613427e5d737e97e795f230c5ac0d0f27d61d871fd78e40d7777f496189685dc9dc7c323508447a8b8cb4e12074d33d1cd6f5367111d8ff0b8b851acc717beb8fb0bfa85138c94e12ea23926fb126ff27e895ea2bc3fe773d21b000f8d24c0c81017d670b185f33925500ba7b27dd12253fffd22d444baaf4765ae97952eb4cef32669fdfdbc51f351990b0b7077281eba10e42ec2fe7e9a9f34f785e52dbbe8fd57912ca7affd2a324bfc1a72c1c61dbdefcaefee513cec11e3a2d6b2a7a127881e9ed736936e0b4070bf52dcbd050f5bf8d28294164e992ef1c645a50cbdaffd69d16b9307043c4a2e9ee72533aacdc7698b858fee6e15a1e6d1ddb3f296e825c1439e24ee3ec5c32263bab8b865f9cb347f4ef9d7dce6e7a41809a3b317b92fec62a29f5dd88bb7089522d60a222c17f29008cadd873c64018c8b252e314689721a7b8d62a4146ff4a22946ca457f5e197a9fbc58e2582ca7e76926cd4e2253eb1c7bfcda5a96535c84de1227ef2f2f4e8b501335ffdebc365f43226c766a593691701afb19d193f78cfd2f61e100ee3e83872c04c0ddc5d979ca5c5a97fabebec4481986d312c9c4244e7f865fda444d9879cf24e60dd2183341a748b95b4886d3bc4c9e0c09251942f1d11dc25a4a894ff33251126556ceca4be2981246a76c140b8dee7e82872bbc5c341fcda6bb17f170851b174b6cb65a8f828742cab8e86ae2a1902f6289374e638f894e22a46fb59c7828246886de4fb34b9b8f0ab1293189531d0f83ace1eee26b147c7818040ca983663448cbddb38e0c1e06f15c3ef170e78bbb8b6976e1f49e242e75709ac4dd8d78b8d3728c9ab0146f5c3e26ca7177251eee84b2d72f123535101eb83b0d1e02f1627edeaefcb39bf419fdfbda4c318a8b3e47dfa421204d4434ef9736937e865f1be73cefcda34939c568d20b1e022951597615a1267eed51f47244e6f3cfd3dcbbc4982465fa88cc272a7bfc1a125f627e7d44e673ff4b4422ce760c86378af5003cd471c35ddc18c3d2bcafb9cdd2bc318db14b6625c5b1fcf83514ea7cd1a1e29e62974b4684c91bd3efca7f44def3efebd87da5384844cdc72942cd2dcb692e3f6f118be6cd63997eedfc1896f5eb9bf438c5af219d9d30670d11e749122aefcaa9a971697e89b5c6694c096ff3b1965d1213bd5824e29b271fc54866d1e3d790bb4bf13067c9e532cb7f6d33c9040f73a8b88b3ac766865ed8e73ca4821b30198abf95e6345dd27afc1a32a2947d8e1c39729e37494fcf9124afef0f19310223a994b89ca5d7244d174631116b6f8d4b1849e5c8119c1b2330920a0c6f9385b1eb8852f649c10cd186968d87295c21dad0daf13005a5201ea6c093c227dad0527988938687385f441b5a384a403cc441e2a20dad123cc4b1b92123dad04ac1c31b3036b46e9670d186568962ddd313d42ac0632cc42af13661e659b260a49266ed12c5dadd937888021451dfd793a646cd742be17d63da2c3fc5b1dfe8bdaf51f36e342749319a94d38dca32ec1ef91c1c1e2141649f736384c43394b84465d947935ae93e4171099462984ca339499966124b7122e5c80c292bc5e5111c1ed9e7f0c86e8cc4a2cc589868766118c9dce46569136b34c7344eb72c6398b9f79d95174b49b1e932778652849a258a83b46cdf2d344bb14c0631cdafbdefd6288e6999fef312e5f3e7f1ce309cfe7d347f898fc87c3e4eafc627915984ca98bc3843efbbcccfc14577ebd728a445262c95913798db4cb399c6febebe5f62fd22cd57d2e79478c76078ef5ba258fffd7d53fc2d212bc85a8fdecf29f1bea479c6644a5eccfbf19179263d4e7ad1951f865ffb4b0c4bb30b351f27bd463189d3df3ac3ee9f274e7a7d3f47e322f4bec854963fefd78fd3bb71517a372ca72eb3c48f91eeeb3cc7175fbf966533bd489f94d1a3c749bfef6bbf76529a1acde4e3f4beceafa4d7287eedcf6961344369bd0be8c5d7a62bff9324543eefdfa7ecbab0921771cef36ef35de607f9ad65463f3bcf2bd3b29b2f710cc598e8f57dbd365ffbdf953fc54430198a65e79de1c5d4bcb1c769e9d69718e973f2cdbbf2bff47d3d111684bc107c744f226dfe0cc7f0a28edd74ffc65a5f6d2a618dcd22d4cc4568166729965939cd8b747f6bbceff9f835f49b0c1c6f7cc660994481d06c2e392f999de812ef34c762328d4e913265e3944473929da1603d05052a515966b2339423323b418b4c9c62a42cb43394511f91d9894f5276b2d31cc3271edab22847247e252931119acd1d33535213c984321427e5f541b3a9533c43797d50b3c84ca394e679915020bdb1d6e30cbd4f721e4af38b442f969264b663b025f82432778a9150a09da12879824fa28b4e394d2638959de66552a258684a89adbc0bf80653c3643053e9c2f2fef3caace0c7449ff797f80653e3f4b5f9b506ee6e83873ec8388c546215993e390f9d1845ef2b4986729e322658866532bc8a4c9c9462a4ccc25b4662259cee04d1c127d63a69def73c33c9c2247a655a9bacf3eebc595bcb8ccacbda586bf2b2cef36224f3bcac18c6472c1626d3ec7aed8b4b56523ecfcbdae6696e99eee9616d146ba251892be734e8c4247a491646ca692c7683b0ca33bf344e5f9bc5a271f720b83be9610934b81799dadca70c2664051d2cc3322b3ab8e86a8d6137955d2bdc6b1524b87b91bb5fafb94107dcd16c6ef26af4a643288e45c95086883b228f0e8c5442e1e6059be3eed5aa508fb87be9a14d15f7129726524e635a062b71994914ffecdc244ed34cfecee8df7dcbdf284ef10b357f682776b786991b17a5b2989ee123d6c61acda6d65807d19844ef79a5a040e3cc65ee8c6e549649164e33c9da1acbace0f4bcb3346f6dbeb68cc84c379a49349b453865c5725a6eb3c429c9c2321423e1940533ef499e39c7d02253eb8bc97ba2d9dce64e6f2cc52e8dde74276114a758df1799ca621a9f57b3b0bef8646dac5119464ab1c6294e6545a60bcd6411714727c547392582e99bc482101d4c5e970e86991b95a53a31cd23442706bb5b6398b9470f6d4277c769468b80ca4d62239c6e14c33089ca328a5e9cca62a92cc6c2fbe294d4d8c4acb2bc33a59cc674363ecf1b2b59b33316bbb8bc69514cc6c23798697e6dd9dd2846c22c25d385d3d8799a47b8e8a679eb2312bf48d696e5d7369358b8cc246b63ad71d18db16217bf581beba3f4c270ba23b620440786b79e691d0cbba9ebc7c31d68b88b25d6b2c744bf338a5ef2617803c1f246ef2b88c5fa1e5c66f2f149745fe4c5292afb12a778a3f87bce8ba678a3a693596ab907f37cf3ed85ea9e975a7235d5739acaf1a833f513b21571ed88cd04cf7e1fb769b57a0f2bbaf52ac3064375cf05ce69baeab5568e1b6241ebb556cd36a9d5abb656adbbc1565b3dcb434aad5df5dcd694a8d9aebb397dddacddb8d4ad567baa3ab0d5e45cddac866b35b2b5da6f8af561abed365b69606bed6c95a1f6a855b35f0638cd9ba93c6aadd5b660777c5a75a2dadad95aadc6aa763b998658543df255ee87f642f5acdd8268276b2b0e0d917a802d08c8440bb2beb97540ddb49b8db355730e89da82ead6c330f4ea75abb68ea99f4da156cb59abd5ba420552bf8ab2d6da2e4945c1dacdd61d4d0445f80450533946b04a54ce8a50b7aa55b741f64f75736b76fead1a84e6aa0c54473286d56a5737afa6aad6c5daaf47ab3c5ab5767b8b32dd54ae566f670b72c24eb5a7eeb35ead3dd5da13685d35d94d43aa2b2bab55d3a926d0d6cfab168935c19a604bd05cf34a533b6b6b6a0bb5cd8a60adad5ddd5cd5f4a3829c0d62947131cd2fe431911857b867540c2531907c12767dce3b0c322ece6e528a4b5496f3194a184bb8e7d7ec44a31cd9ac30dc3d03698836b432f025033728dd27a2de262a13714aa09c9c1b5756e187b45e3ccf4b5e9d949de43c4483d27d3225434181525ca6515c51b62c0a36d32c948499e43c04254329f1d0130b1cb9478c6cd4cc310c3387d2accf3b2add274f6039759567c63875b192309a371860dc4530b6c0c0e049f1be271836e21769883825c6a90bcc175b88be7889fb8b10352dd08605bc8838a936611658122dc093f7cd976f7811012fa8b8fb46314c56945e266226b1f602852ed2707751eb7cfe96e59c4fca2726fa2d23eac24b117a9e3257ab8b201771c29421c2654eab15c68c9cd3305dc2e040a699498993ee6ba8c4252e5193d4580a5089a5f89478a3e69312bff43d85d27d6358ca948d85b6ce4eb696292971522ed1255c7c29325f9ff3e642c93c02c2451377b1c5858d0f9835dcc516982ea2894d975966181830e74db72083f4e31665b88b5b2cb9e7fd49f9dc82c891f2cc4d868cb8a2ccd0faf2cc2f8c53971112cf70f789cbd42c7b7a86b428c3451b5a5a74d1e2a5058f1661166d64914516a02c5077ad749f88e87965a5896496a8899a5be377e594bf3394175518cddb4c6519e9ba3e2bf91e8c9ae7c3f2ded9e7c59ce21b4cf353593691ee0b136d5c34bb302dcb33a01785b292fffb31d9a338967b8eb499a6b23cd39fcb1423e1a4dca455629cca48ac51b3851fbd644e4ef10de6a790a6f0b23c7b17d0aba2485952c343199b0cbd942543e312293fbfc4e78784a63c7911c5b18c9ab0c7af210cbb505e3cc2a9ebcb1c22a1f367e8f8a2acd5fafb1a6b99cefb67e92d42f379bfd57a8d73b4cb957179d30df369b5649900df6ab51e87ff23775f259f93067dce11d789858cc0cc9750ec3ec145f785ffff03fc3f3ecd182c93196db55a4b1e009ff719835d25fc3ee5dfadb7a8b789ca728a6bb8fbc44aca4d5eac0448e31b304e9994676e72b11221a25ba238a6b464090aa4d16c6229b36d96a6cc8a5934c30e58ca58021d91d9894e8fc8ec04c537e4d4a58beee9c23875f9acaa7877bf9fe611a870e3092aa870255250111389ccd40154ece45448890878e118c98cc092bb58ea08d4704429fbe84be2192040060265787187c0121508e8bcb69974cff3b23092894b96be2c519fe725f7253acf9bc49b3081ca2592e9b0dc628a26dacc50a6b811f39734dc4598f91a856d7ed69f8391ccf3378ee1cb175702f4f733942f4bf848ca972157ce694fcf97976207eee20c1fa9f0ad1208c7d09ae1a3bfb7855fe9c527394b2f6a1269f3efbf9292f4ef183e2231d24974b55992668902bda851c05ad3a0bfd4d87ca5f93536491396d14ce22f42cdd999e272bfa833143dc3316428331c43590295785f93cc5a8f198a550515a1e649640a95a7f94ac29295784a14404471a40165dc459c8ccd33bd3aae13ebf33493b4d9800634d18020b101360c4081bb8b0c8800036a60c027120d3d86c13209c515eeee2414555e647ab18662c68b181cf1cc681411effbd8cb16773127f182c4319197f08932dcc527987011a739c9119c9d1d2245587045d13bbd419fb3510c7b22e809175b287e25b51650c602b62ce0051737895d2eac4d27ca38f1e5719a87ca333bf172776dbe133c621334706fa2012e3611e44dccce248cbe3699388389ed2eca5073a3792b1d51c228133c4c84e21265f478b8c4520ba7996cb55a4b4c29cfbcc42ba00d773129a30af8a280ac15d0854c9732bae0808feedeaedc0596bba0940881124b1945cdc7422fcececf394facd19bf43849092a527694f85c2c93304344ef79511396d124bc24114b82c745f3937024d270175324ae70246248f0b83b7ac9f3ca36127e84981417a1f9fca123ba1c1173df473471b13c42047717a59467fef2cc4618b154e2d969841417316c9b4918e746b392306a84bb58c417772f22e65e04127711951515a126798958639be93d65efca9924e20b114b317848c40d1732af910b98248c728979116a7209811ce9bbd3fc18cde3106cb8fb10460c81e4c27e1ebff6102f9628feac4d21da108ff415e28bef5b0a114baff9d242ecb88ba5796338a87913441b41741183888d41dc9c2946ca39697fde23106b00f14524ef1802114bef110f81b871d484c1ce5be6f407119c9734719a93e852099acda224a57983607803a1b222ec53e225f84c82cbfba43c730e2a710954e2a012a7254ec2685002dc45ccc4431fae7017cf9c834a1f5ee6198bddeb4388232bf18bd4a8ac3433d29634b4beb1596ac694f0162eee5b5a2ecef6161e34971ff6404644cd22dc0317f78d3769a63bdffc6b580f41e8d8c3096568d96ba3381bcf6e7e67f4653c58c103157c5ebd95306ac23279c3c343410002ba9428def7cd1cfb9d914c04f0783649bc11f015a16646432d34d0d2c545d22ccae72d373e5f4b4c7cfc1ad2d244cbcee8d00e6bb8bba7bf03185209bf363fdc41c977b871378bb4197b7c5ebdf1ec77b838d5a104ee1965256114355d9aa57461a509c3dbdc19c98ce9f065b29891c58b52162a3b59bea5365cb4a1b52466a9cb6b896729742c6d602903cb9733e71896252c54441b5a58765ce93e11759252e93e11f58b650e9add13a7254e333954a63709a78fcfc767ce411bd537f63a69e3a2f2e6f328cd49b9fc1779f1a3f78c3d4efaa33427e1941895dda45fe217cd22d4ccc1e7d55b13c9307acf1393da84bd2bbf9e91b7089f381a35ef2bc9851de9bb6f5eef5cdea33307a5664c694986529ae79de13ccd2db4510c1b755692874a74cace5030cc1c2a42734ac3964529cf2c54a618298ac6e715ca50d07bc68ed24cc38ec9d2344969e6199496cccef42ec1fb3ac9796867243328c56852949da1a0d92c7a221401e7084e7312568ee534c63a3a654431988c88755e1293e8452a2f2e65276b764f2cc5dd59f050290840a094590902eea55902c1e7fd9385cfab959ce0f3ead7e699f5e3d77efc1a52d2dc45d7c5694ef247a7cce75d7988b565f93cb1669d1797667966cdd238cd6489625692152f424d9d74f36536531cf44e346abe8658a8595e7c66170a84cf2b549a3756a2580ade17c94c6347b62ccf6e8ca59b9c3907ddad51208c67379604cd2626cd3426652c315a640aed9ca5245d293d2c16942840425296ccc05af2334a893224c462f5a8421910742aa63876e2178b2544c70577df6c8f8b25b6f2e2519a933eef37fabcffbc661a8287322ffe3d44f9247a28518406e0b21a3289bb6dc1ddf2b8db22ee9688bb65c1dd0e71b72b7cee3895c5d2ccc2f995b4dfc0a96ccb5c7783b1b7b858a2f7ca8a4c22d8d566f9dae68c2895c57edc2ff7bde362cea619a594e5589649702a0b2ab1eee239ef1c97f9399a8ab9c443fdb9bba871113e4d24338dbddee625353ecf9b245d63a674df7562fd65799f8b46e18e2992347f8987521b2b377077d7e34bdf26e779936c257c24c568d28de99e9ea12123ae2831d951ce4eacec58f9d68881f1181733f68a21896532b90cd186965724302c0bbd66159946387d1776fec8bb50e29796c57e6bd9007888b45efa36697d4eabf5e81571880421cdd86cdf7cebefbf2e1aa4749f8867116aeabbef0d8a4f11e7467c155ec80aad3fbafb5b69dee46592a365afa11775701afbdb6abd2b6f8dcaced80b59a12ccbfb298e617d7dc4193e6ae1dcb832bec1d4ad1b4c7ddeb2bc8f6a33cdae19e9ca337c74f3e585c14efcfa1c9cded7b1fb4429a731d789853294129d824fa28b4ed9198afdd1a388572277473d34bd1022eee8e812b3582c20b3d85966188ecd36deb7089fb89cdd139738361b42b30b2b9929e534e8bc387dbdf47d8d5866c54465d9859a654fcf509ad314b3c8b45a2f336237697c79f19792bb3b9a1f8df2a2e23beeae6f123abe4efefa268d252eb1147c9e660c49184a89f72db5c62429132ada22165129f1de268c48e62a834d17132e78e86ab9bb98e66fe1342739cf4b9a4b5c4670193109a3248e69d8c569b88b250c1e622e2e92afefabc4a5499a3221cc5394ca6039cd29be41070dcb32eef85582c08596685c744424d34766f8e8c80cc700c3dbc465266738067717c1c332e66593f223d3b8825c126d6891545cb4a145f2b868438b0c713c244a83488a201e168484c47d74619f376a125d7db19417491cd33fdb298ee534f62b263c2c68bdc2e9f3b02024f425c6a546013537fe791a889488f82823a1e6a397bcfb962f7d9b88385ba7a62c8dfdd6b83cf3cdc7303e82fd9317f525fa1e2d807fb1856159a8f5620ba7afbd33fa2ef3716e1eebf33279519bdf6a65fda52c45712c765fbff575e56f61d8455b2d9ce62df4e2d6f9d4b2d72e2a32d39d95309a4997d942f327bdcb6ce1e41c193292662637adc7b1d97e69ecca2f7263972b6b13bd2f12c3c89b6e6ca6fb75d14d31123ecd93d4d9af22f37c4d9a5b9be7391ad1789318e92f8a354e6338bdf9bf8f629cb431d117a1662c769fbcb8b5797eebc8909116acbc384533d6977cd474659d2dcb9f8b7e675429fbbc886f30b50e6a3e2e4aeff977861ca4cd24a0172f4eb30b86b7d9b364280a9417f5677ddecf51f26293175b1b0bbd48e634f645a889891e47a380c26e5ebfa863f7494e8a5f1b17e5fd5b163b2f0e6aea3fefce432f2a014aef2923ff3c65aed8c5af1e744a898b50f3b53394f3bc49302c27413779d3adb4240fe98b531205ca43bac4180a865d28248e096925782703776f79c8e3e605bb5acbca0c059799ec99c572ba51ccbae946cd9e97be4d7a7a865efabec629b8cc493469c6f2c6fabe621bc5484b74aa378a4dd274b9641a936812179672f755925d294ef10d2c34a3248e69a50dc3249aa1f4f40c6112cda84e459d62334d2f51906aad90aacdb0824ea28132ec717afd0727d8104e11e34b4cd9a2f119fb0a8453aab8fb79b1762ba6a43025fc9effa212c1dd1ba0faf3628d9aae99bb1b79d86402eeeee3e1500cee0e434b95c9149769fe2234a749ff397fa5c8c61a776b12f2c2ddc512c55b9bfae2f3f77d4c347b6ddb630423212deea2bb0de2ee9fdd396f8a61249534a3260b35616936ba30d691a49b96db34dae84d2a51f3a8346f0c9da2af798ea419cba419cb431b0be1323fd11833d958089f44174f3922b3939de6f3ea142399e894f43c2f8963b3cdca1a239901a420a8f40ed0754d4d3ac69499111901000000d31300203020140cc72322a12a6a29937c14000876c05a6c549ac9c328865118a40c3284100408800130003042439800f30e5225329cd904683a294b9c9fb94783644d4126292cccc23d4672b66d193a768d57145c6b17e5d00a96e24d3c197a67896b198d7eca3802bf878b013a076aa0bc671b098c165da6095ed807b6c8619420e926c3308bda7be82c2c10ddfb4f3a2692c66b759e4b569ac2d50b05f88aa542f64f01182046284726499b255031995c6780d3d6d265b9ab115fe2cd27eab15ab5bdf4597249bcdeef16516b7ab454a45a2222527478b8f0c89df34abe3259d57825c722748559981768454abaf6f13affaebfe039c90b09dca420111541e4b5a769b8d87b63470bf054edca96d59f1295d159217866ecfeef482a1c96cf52090e35fcef42c813380d1ffd9c61d36a66a49285515900a18ec80761f8a75bc0841d4c6f05a26e73e012076efdb9f61a6d8cbfa1ea003a46bd1f1ad3b9ae56a4686bc9874ba57c6a6240ea400b2dca45951f664ceb5c84fe8200542ba6f022b6cc1f2576f787e3704518859ea94ab450aef9c24f136b903c64e17b06b78574303463820865db1804ac5ecb66eb39bb4f65a9cf91c1030d88273f5ca8b864d7116301070fc8640d046f6bbc6a6c4e354f08373322ca0f5387fef28a0199474ef385be61ac6f54622765a2566fba649c71502506f95baa01c6b47ec280d306bcac33c4ec0847e6941cda281b13133b335695cf7a2117dab93ef6f94a9c9c73813e5b988c634efb00716a25e15d31c7411bef00c5d8076fcad667c88663760e0e32e5176779e72b148cd347870e645e15e1ac86acb769f4058939ead2c62eadb3dd917fe63a2aeed8e810a7a39dd640940bc16080d61ab400c51ac3f04ea024e06bb8e1e102e94b8ca8111d60af60eb3693e5cca8b43bf061614a6811f1e88260aef56639e8bf92de7d0cccd56e895270d77cd0427a88e739c8f051e09c62cf5021ed385b4adb5ad02455d11ea056e883cfefe20af8be06fbad7a88327e1120e3b7d19801fbd9fc35d2d28eadf1a43b75170a70923a4e742373342f1784f9d3cc37a1a519944a476eee005a0d20735d721df6593f172779601d6b9224d5895a09c0b8c7d514e3fbb11831b929617ecc1848ac0a8f09729ffeb9267b4f1952aca316fdf2e83b119234d3fa1b5f769b149b95c08bfdd4820a804249e509eeac4bef54ecda4af9e467bc6a64300f6a63e85b88f900f56c0f020395ad4db70ab1e50f670eb09e388988994b1b96c9fab75cc6cfb6213615a94fda6473c3bf8d7bb95652234d4e7192c08402f915926b69cdb52657c7f5a946c1f8b778bdc54d090d94085e1a96645fe38425ea66b2f1b5635e38124e32b3d00b34e5c12b2d2173621ebd7c11a1aa1aa35de45b59a0f80fe7f39b6ee46e80c0225b9481747d831cfb315200b16746ffbf449edc145cc0044049d3d2208262e0fd1265a6e65bc6bb35e5ce4b32836879ba72b2fbc0978bb764d77a1ba6e7088eba7cb5f0bbbf04cf0f52f061f29b90c8654b0bf27175216553ab8168e1104a79776015a208d9e16793c74c187194a0c17f5894b8089b8a5cc9ab2a597093d7229ede55a6f98f4794e3ba0f7b6633c00ea2a48febdb6151484846421d0d32ccdcc01d221de452d8f6e5e6e84e888377352a050a047a7c08c63dec4c509338687c5b925624b84b22b0beae2786c343ff1fe61c13b90de0cb106fab62149ed719288415ac9257612da566600d6218a69fb50d089251b460ec022f5fc62df07834d9aa9d3614916064ceeddd9f58f4fbad85077656456bdd46e089511a5642f1a5e3da6964b8b2ff6f5407dc56c84794e18a5f8b53c72f2938c98a23a049778e818f47475f49d876084b5b13192f401a79fa055c31a86a8d208e9f0129c93c1374374e8cafe3a0907496e6a522f8c12583863d4067b5490ce29605da8ce6d3406b5526fa0249f191ab30cc03b35262311f2b02c2189360687231588cd784ada2cde7c514e15c1c3a3cd8e56277dc91fe472fb5f6fb92c4a591a6bae042a1a0075422348f356f31ceca990623a9397912f0851a97bf83bc583b65c275c86f0a7e46e78867594dd088880c5ab9a03ec6c7408bf9b72b226995e8cae6d5e809e3866f2dacc96ecd98029daeb860a9c08f5224189cca7bdbd26ef120b259b76ebbc903a9a5289926a3494910a0b6471398bb072240b6b4ea115d60f3c854dc19c53a699c66c05c5db503c6b6ff50823015c8c777c06f248996bec50c3c57c3816268fa6d0f568ccf4ff1bf99b707bbc5085756a1ac73bb556412a1e7ccb6458e786749d8ca3c3e830ed03c917716d87a9652db29136f895bcbce002262dc3fdd52ba8b977be2d1322329fe7d303359d2e1620ed810fdf02d0141ffd9bbe672956a62cce509b23f1a38d381dc7dcf722ac2a07ca5fc00d8ee41867fc03628b45fa9e5db1daee7fd018166fedae6b387e3ee5914f41a41c4976ce9b13359eda98295bd9c80cee56edffa29068b0fa0ef9781f95fddd811fe76434bd713e1c4077eaa36be0e48a8cdca3147694b4392cee385d855ca15231d10bdcc709548a7c60eea7b4281481b20c8443a46a2f5bd1ad8ac37b043a5bfcf12b95d420f1a651f73176170211dc61502fd5253107eff5f5f01bc7d75f18aa4ef1fdfe424f02e1807664169c8c8ad39d2e00d61af855850b79b9961f58f13dd7f4875df85f302cf332ac1aabc8edc2a50edfd406f0362415e457bbc8666fd70a964d70e3c5aa1394b9bc7be650799ef8d2d5502e5f1f11007a39d6090bf15c59255a0218a264fab908832cfa119cc8014c3490d62369e0d9dfcad6b01cbe2851d0432a8c2b7d8ef59e53612c3eeb0f6db2bfd939accd7427e635360074932038abf28d3cd9219655bd18304f4a93a48feb29e952663aa92029c0754d6d1b6760ac1f70d38ba7737a3a6845a86e5d410cf21f4a9719221ca05b916f68fe58e7323004f9019c8f8f65dedd505c60155b63cfdf646de8d9c5648844238c4b5d3660ca4b6ad7cc6ddd883fb001e092d2689e9fa5a8392dceec70b9c7c5ce2ca07aa1e96d7c6ede76bf6e029c856c31922bda6447edaa07f0e936284d9797aab09ed20d2ef23d38e7c128bcfd2a4945d5d0a1d40b08b38728ab36a7c030074ca1c06f04721fcad4eea5e3b6cf062f5336732fd5c81c2bab0a87454d077c52ec7424bd84413f71171a887190c4eb7e10608f8334e9d3f77cd136ec242985d2c5e088acf8c008ff7330833b1857942934bc76e3db938ec17ad573333cabb792e9bc4fdd6583d132399931046fc698a6cc39bb735adcafe3b7c194905a7183c737b7dfb7df674bc825e24ccf252e4587a8601509ea100059d3ec3c68f20a33941134ba1075a1c51318a25f9c1bb6b5bea5076db5ff6e08a81c742535e9ca9ab7209c1df582690efbce808bffe04abbf92be8e488ef32ebab249f20dc4df8fa4ee397b241c501b424dee90de4f8cb403c83caa8421c15f0e92cc3fe01fc39b4a0ec67c0c3bbea847be7f9bdba667f533c29ef3552a28c3a3373a218130cb0b1054bcfe70bacf5e2bc40acd8bdd3d5ed956fc7962d670a8f6cfee35b948112c2a90bcc526928a27a84eba45e87bd3c7a05a9318b11930b0688b8984c976b611b9ad44d4c90988716005a2884dece078f15d21a85665d91efdb178099129dd96d03789cce2f40d6f17896a623af6e943c159ef089d9aba2206e758d2333a908a87c171e5cb4ee543886c9c4513940f8129261275b8f8ddbcbd5d88e2cd05e641fc2614653ea990f844ef5f275950007aaa96167a38af44673f4931eb6a0a6bb532309e5c631a97557134dc8f9ed5106e135a322ad5472f644a40539f9fadabb5d2447636172f469b24e3feb4bc71dd46ac134364fb4c884fe8f179a8cabab3015da0beae2509aa1a3988612a00523e058575ad04d8472206cf2072fe7faf74cfce789ae293754e14fad0026bd638794b09db8a45c7a1d528f4a1020bbb5e5c4f0cc182da3c59384c804861f41a8acbfde500876c8f5cc3daa9a7043c4c0a83d9d8bdf1c43966f62d21bc309a6dd82b18d56345d63585007bc953462bc491d778b0d17b85d5578856cb42ac59871ad866c86267fb39f55c39bb5906de2bb0020e73fe748455a9960a2856de5c0475111ae32079ac9af7b006cdd3e7148d9a99ecd865e75f2c337301ef5de2590d5aba5205a79104c3821258868ff11dc8fe7f2ebcfd6c6698811d4edea9b601778486eefe93eb30da27a05d2eb5ec7e43de9ac3bd9dd5e99d7ac8e639bea35498bdcb6e4d88c30fb15e029c5e8e954cb775ec216c46e7c7835ac9c6a7e9f382c01fc3c4d3d8e5b7617189aea1761b14304e90a2d83e44861ce1b4f5f63971812c1191cd30e89b9d4d66cdc9f523640527c903843e4a2195c615d0df332859694b91ec59c5d18881899d68a8b35bd35a0bb5bd5a8f9af7c29c581635e924466689b9ae86271b53f292bb8d4fc45e1cb67278ed09511fb4e3f2052bdbc15a916505ae08f7e22c97caeadc19252340851b3900c67dccb53cec701cfef58d3eb4668f12a1e56149601e7ecf4b9f3a18f65636056b951617ac2a212971bc108fc2670d6101eae39e9ea72bda360b70b4151bb7437618b0d9487247347702c698fc01b0fc974c723d183e59a4d9f86bc5aea66fa5a05aa2037b0557f86854b622d63b8bac640715ba6f92749d6b6518414a6f414d91e0e0e0e62df23c10c4b09bca1dd20a59db118c79ff9067fb5e093c1c70ed50ed5372597b5e41a2e1da4349ab10daee52eb976202f5aa546f6eb32b915d7a7940ffd5696e0f2b62a20016f652a0812695fd6c554152d6f3a4cf7d31b63434b89eacc120ebbefced7af35a24a0ad29db75d8d4e181bff56d6a98824843d5a5960a712795ba89a5a4dddb19f8ec5ddd64f4b6156420d9db182e173f50af4bae674e912dbc1c6ea48c3a9dba4f7261a250819ffe2eed2e9feea36277f5bcbfcb73b6c440ce141315a10a450c62e5bc050e38d5e4014a9dbf1979f0a6717f95e5aa629b9d921caff30f951bd9011346b1c411c341574d162153f910d059e73b3649686ba619f2f461d8d1d9043a532d2c4b9dcf738eeef7aebcdfe842104c7bdf934e974ce2f3c0e5b475bbd04984f09990289e8332fc85ad8dca93c268f2a176d2401fd779831cd6bf9db1c05b3dad5b58f0f39867219f220696e2232c1c32177430801e0af8431fcc241983704e998121622cb38dadeedb1dce1bc17a01e5c8c4cdae05501b016241789f69687a3402780f4cee0c520d274c81e305b83fe97734798dfac7aa99c291eb063304a22fd40f1619683100e460931068f654a190decdc52809ff91db55b25538cce6f91ff5d595252e7ff01c831d13a6fe9f44729febdea63d576390ae4923cf02945bce07c205225635c404d6347666e65cb8b3b5ec3205e1cf115ae9eb0677751e967eec6f456d4fbf2f4cc2bcb0c306d6b6fa9bee1db85b61ff8f2eb203400a84f5c2b1bf9b3c2cee025aa47394ff255770a0c946f469f5c138f11c5499d3af6b9a3a12f04e7fd8e9ac6d5ed2552ffd4dff1307b0e96d43d2f9d1fe1ba70fc23f22767d96494a9f1a6218b8813a06e83c83a5ab21cd31049d1b89b0b52aa7adb43f8041b0b23241c778f141525716761d24e7a698f93cab0314331c22b0b145eff62d8f3cafad98bc391e1cbca27df63afe3068789beeb45da554d7ee4a26b1bfa42d41a8db1ffb5f2b1cea691e70cc101ce199e27168cbb0909285b4da1948b07f7c98cc218d8c27e083828c890fadcd9a4b1294716b9210169a18b980c5aed5f74a6247fa1da42339ef5e9407744aaec9074a525d101fcfac2776ec7933a1e9aef7df1d10485eca276db2c5e9aa17d34ae909bf9cf46e7ab3a153a345e6a865ffbf605bf280540ea79916f121ed4a0a8af4f9da664e349f10719c6d3bd46f220c024dbcc1dec3652889feb193f5175c93459e2820e19912d7cdf68c2c486fde0881bf985c31fdf53af333b5d7ec4c9c52da0408a23670da9c85755e214084a9288c384314f00244c1cd61799fc7996101b1392607dc1d002c1c22fd0c5ec25587d809ff27506e362112a5b0c20713d8740dc9e63712192432d12196c176e88834fc2e678918ea132428eea2fc7ec74452460619d0202682eb69c529c6592b2e68908f8b86eae7cf9e1e31e1cd50782f1a1eb2098d87e4550e53f6bc6f02f64c3a09adb235781862c216c6419997a7c104570e270663567e919159d7eaa20ba08ad8bbabf076f2106ec83d4285bde40a29e8588f385880d9d4b895837fd7a75bb0d95042854082cbaa016ada2f03eb2c4f1bf47fa3ec9f2fdba914f44e4e15cfd2d8c71870d54a2a21ce074b0a9008a845cdad8bcef9aed9069641eb3a74d5b1666a8e9c335a0bd5c1b9ef719c880b635eab634c9b8ae68e89f0368e95f2854fc68cc167c27bba9843d9f611135bafe268e2220f861f1bfae735855c89352b33d7274faa2b49b36c847bfe92f2e9a6d29c29079bd836d7118f7f186610c981f9ff31c4ca278a59def774ae81b3b24c4435e9b9b63f164b6265f79dd928a0de9219d23773d3d86a1277489749c2c480279fab0c689ee849b971084b998c94a209cdc8acfe8aa23d3a3256834eeab420c75cdb0b7139be9fcb997f029b4f6a0564a7f3bde998dcd6e17b928b1634618521e077fb085f29c0e538730abfb182d1cd475ee5091962363d338e187f8d638726cf4a6617bf181949b26178cd20136080f84c1d68d3155973c97b62555caf0c3d56329bfe58baf226659e44e62cbb1e5d31a0ef48c09ca9f3573cf2688e0e9912340a23de2ade1d4095cd5a6dfe38bfc33563db8dc8cde29a3c6ca5f2529df3f0a218390ce04923ab16c1fdde53c98f0e8acfeac86a07fb16b873684d682b38ea533ad7462dfe010dd01942e6fe314b020032a6b14125e74e22fca92d539d33d2b731fa03a18c9a36aac3ad16cfc1ff80f92d28cd35c621d2c5a3d16b08338e13c585090e673d4d611ab21d378b44ab5e017993b4333331d017a0a68bfff4f7917891ea4980cbf65893420bb3285683dfaca34e9d8d4424ba8e8438bc686812310ea603436669c798cd8ba3da7dca6df265186f75baccff0a0c76460f57ee4470d5efe5b9d470b2d92addece0c9ba444b073ad95809df5615188b3bcc1d24d6f72aaed8e3c3d267c8b816257253f968e9c3a86eee2081dde068609a307cab6bad3a8215fa5251f15a9846b03309f954413833f2f2d23c9cb66502c74cad3edd5c52b3727be06db59b1503d97360c502915f274473470b9f11e62ed2c361a11075e60404b92c231bdc07d8c7be73c10ff866e5c23daebf677ff2a9614ca11928e5bbfcc7e5ef814bb4c4cfa20349c82087e687837d04c297e4beea5783f80483ab7d10763a84313fa9e7c8ae0707f008734151542ae738573826262aa164277c42530e833aaec494549f5ccfc97d48932de35114dc5007fa86993241f3519a171b3b36845b78f9c7b4db38060fd6c3909472ee5e56d0c7ab3ab8ae4839ae3fe12d3dc2e0666d635aa324388607346a5015df19b047515aff366a862449a1dd876bcf273b3db445c4ccd4e0b46720cc5928ee37f366b2828b48e32d6ed6633f4425d7b0aef8ea1b8634fa1a50c257e818d93dff1b413c3520f38230dc46551266fe563d983d4a4fbe0c538dd7fc646efed7a36895d6f6daf514a92dead81d19d143e0ddb047db67fb8228b06acf3efd941bd3bd3fd2253d950d11f533187d029cfa9e72ab59645d17aa5c32f5819d2c92d58c097d007cbb4815cc627331518d183133792afbd9b73af326ba568647d8fd64852799a8278896e83569f85e90eaedf43f3a0d760ce2fc8bd88d45bd2bc704568515d3447f6ea2859a8b1156cb49e632f20570e20bdd60dbb86bec2ba46c8e1bfed2dabf66aa71f981033125a3196d8a4571a8911855934c604e4c1ca65abbd073617e85e30354f496da6a53b6d4176b8ca311326190a4d819c39e29a4236685d8de30258575a729a5268aa4a4d28a1433f257cb1d424975a499da7b0702b1eadfbf47f46f216239444d9267f03c84572af54026fd4a9e0391d578028f6acfa9ec3097113f1276dc0548341bcaf9c6b180c715e2bbd521197f7146ac22502bb01671c9a10f00ed7ccce87bf0163bcdf414f0d000c26818b630705f754b05828d5c445b129640b30de7a068426dc51deca87dff33314c0ee7fcd5c594f93425fa9831e9912a4111ccefafd62647a9fd5940aee8a5a047c7488b1fe06d34712f9e236bcd18b6412aec61c2ca6ec47b28ec99584e6035de9e20bbeb22af35518e2fc85d8371b3eaa1c4fe6ef4117ad8584257348ec8f18251b6c8c7c538511dd957e7c515108863f2a43de2f6c974d1a43e94f08c6891aab6dc55c377449811e96026661a0adae678cc234d7708a6d46d29d6c71400126b99fcb73bf0e9f8481a1d5f861eddd0a1e02bdd46f19aa506051681f248c173c28263b2ab3877f2e5d8ac8e9d8a200f60620199f74da8585a7c3ef3d9fdeeeb808bcc1767432e0bb49ad728914950e26d851a3d629de444fec288eb6102b4bae071ee5d1a2aa18341266bc86f191a833c892da29722a30c371f5eed21b68d9ad1bf4f9db66bb727bcf8fea87158cd8d0cbf1ee53aed7ce346df3d05d3cf2e1e786111827ae5a3f72d7c04d90765ec8fd5a56f4cc6890fd0c32f28faba36397c0da147c4f6b4694b244ea6b1b33121280b2bd5f3f0f8cc41cab50d5470b2e2f818dbfb151c18e06005ac6f31de4e2020490dc802c336e71784d6168b2db1c9a1adf498636995eccf0d92f1912be2ce778b3469a08b888c4685887f1125dc466e49dbbabc34f9eb953aabe14233d3045663748cfefe953fe211725da207c8bf307ee2b0937331f748b01b3c6e631e649b61fdaab0910521069fd40a60f480425395083284c4e3c478e72572dd8d556c667fb8af271b63633af7a9bb4ea2884a063319823cc300df4a86c6bc4a47c41a34d8197b39d776a6893048b05ec23ca8749b09f7210503c5341b9320cae261758b934f1e5bcc8c04c87649a8bca84e3399fa186e935cf454843e69bcb8cd8b119d06fc3fe7803b2ddd110466a5b78efd0a75bc820e95a1dee998a88451c772f055af9a855e798a842745ca8205e1f9d61c0022037bdb4d7cd789f557c0602a48f38ccb84fcda371fc5612658e06bafb791a414ce15103ae2d7e8a2792d0e52e3908c6b2deab20ad9b2dc4fc2e16bde57be5b5238b74b00074c659122d8a8b438209e44d15395d1ed0b959abfba0edfb60d4c0382faf8fbc3aa09603c85d895eb929b81da1f34a6bc1c433bb12aaab7d95ad837eb9ba66652667f1788ac98fdf8f5cf591fd338136555d3e458614beac60205ae49c53600eb479f23ee57a815e760d36b0da4f66dd9c0ab39a89c57645d4d9edbd0fda7a119b6475cc18d8e36490f5c9d5e28868dd06ddb13caaf6d2e3cccfb9f7988be9f86a29a0c6886d927164e403af2e775c4e5af23e80128b4beebb9addff5a7a9abfaf57c7aecf754d1be912ac6e2807dceef5fa271cc0ef3624fe791a74702baf9471475d4119c9b3ed32bcd25718e639878ce30b1f3dbdfd437d9818c93718a04fb8d360e6ebd32a76a91ce167c9be76898f283ae3bfc6459713b83274729badd6dcf5308677e6c88330db460327a581f4c6d2abee26a2a2406e6601ce2cd21e9629adeafd669768862ec55d493fd3aba0bf5c7dc82b599c0544adda288f677a52269205a9a83ee6fdea3a63ac8558a5714ee7818af879c0b134ca32c89ce422f01bc887c45c7e511216d53db1b88d30417951e0806f5074c0f62b1ff892e8fd14de3f0849fd0a5691c35e5252a54b39f28035ca45c6f4c53322728a24ada65bf6d9b2ae96a32340129753aa0d4d698d9ed5d83f33f4853da0b040e23ea1259420638429e00ee0149375c68a4fa061d23aac7409c070a1efa4434f431e394d83814a49be4b3678dfc48e89ba44a695599169321bec3ed7ec7164d57fb77a6ff2e02df3e600163c3f3e4e9ab96802c7bf74820390535a3be47447477a9280a24da30482efe5df0cc79f134ad7d69ccbd2f7e348d069534291be22022fbde7c9be5d3d7cd31d46ca2cd2bac5980981de4c695349e78608d706d35e26aa79587894ec59fbc1264d7b079a073502f0cbbc7d6506c1bfd1e8ff1173fde0eb820a8483da662c95d803ba284f529c4e6862988242aba357f80e91f3c3717b3fc5a0be6dc062784ea625ce0a51657497c82b503e3b6f5adf9d9f1a3a878e556e7081f6c8d323b4900ae4671a9f09197f7e995ac798b9769f999140688accac352a4b68b6eea0d86ec5115910acc83bba08a45aca6cdf916dde3c83ae72e866920c296aa58cbc1cdd641b0afe44f61351587b1a2765d73f3952c5fcefb2c15af1ecda1b56737833a3ea679484630d752a1c16ceab7d40f6325d14b042fd2723f005d8b7b4523c588387cbf07a951579720ec58b504ce13338e9876a712f4f47e6a6599b2cb593da4341e6f16918e6d74587b9b8b35cf9eca499a643f5582c196607b4fcb0b204582f4a8aa43c7c3c9d471e2faecb4c0801b8dffcbd9c6c0452153814029eef5dda4e669d07f30182e3808b6f642a3b5c2222d9291c6827944529f99d05d81ddd4b8f0cf437eeefba6f4fe3fbc2a70f85e033eddb01c6d31e84e6b6fc31325a28a85866b2afff6c2956246391f399758dd9b82de78d978b4b7647d9e80de626758edf7a6aa8281ce00407053a23e0d465d612a41d54ee696ff36e7e84b3527c1b6e48db4f19707f268cee3f262febd03fc6bdaeb69e0d8307ee96b6dc50cea221285818faac57739fbdd6a38b7215963083fe934c3c58e9a147473c7a73bf348de87da595bceef2d1b7772b2acd4986e080fc0d83b91633af808a2796778fb1fe08b7bf4e1d882279b3167fb936f8c73d45c0c98590e94e8c42da24873ec793b0c9cc0f364bc3804c5098d71eee992a9eea8de7096f101c5d4de889a416d160f1c8423077efd835138c27b5a5fa5a913062cabbf7ecf4ede3a5e19ce93d3d92d5cf6a7d4195895caa7cdbf18c18cd91cc2c8c5085b29bd3c97f63e0a62c1f6fc0084109fe7b99c7d771fa1d9417b918a3c9f59d25228792590f80c5c79e266c0355332cb74f954e2740b5a7c2279c2c9ba5528e20629d95194b0ce74b1169333611721bf61e6640223e533d97e1a40de1200d7402b145c3767c4e3521d48e93e72e20f8f5e0750970f64d5774be2bef95c3af3987d3680a247302c6c349b517d21d60355326761c16782a227aa62cb2c5b7267ced9cbfc069182c1d47eacccbbae59ba245c1b54323a928407d7292eb8f8884ac7f8bebfeda994b60296885a4b9f4341b3cebae4ee71d389d769f35c072732cd9b8a67c490c7e2fcf26136e4e8569fd9dc8c8ddde8b617bfd45f764cac2c6138f068329127662f56c07b45015fb155241b1df178a2bb4be22715564808af2fe54f8736536f479a15246fce52c9a98323051388c4fbc9ecb076efb64d20b8e3e5e6927c335a22a6d1221a7f4dcc88e940952110e49a32c90a53c4c76c329ce65a760617b7b8adb5a51ea97bf718db251b598246f3af42384c56b786c5637921ad82660a49b96ee4bf5ad50d1eb80618b94799fb348888477977137a97b9639fd68734475eac7bb99819a0f7f7f722401e2d3c25f71be5f1271a6af13c47f75e0cbc5d541c2378d4ebedbee9b775bae817cd0666fd63b4a1508485984639fe8f573898e2a18ab99abbf20aea58c38f0ebc62dbb8509a4b7a0d7d765318727753ff742540b40e4e92e330de79f1cc04968783671fda5c6816ace29a0df4954246fa5f0028910455f7dbe6396aab4a3296ee4d17f9c34df15863fc6b53d3f62624d79a6167db787b3b0bec90ada2f5e4329e8371d9f05b5970d4f3ff44447de6cad468f1d42041710fe6671f7d4f6f76c0bf9450b038fc0c8832078a8880553494ff3c76a1735779186993bad5248da22132de3576ab5a0eb84817d15eceebd296ada906cdcdf5259b775eb65292024658e0bb9fb3b24fa26ff959331948cf7485018e8801a45c74b29713f876492212d5481504820b7d2e70acad983937aa72a69ea41fd5b17136e6df7a79b6af6bea47c1d5a5439f269cc544c4c5f6e2e3195ff4351ab732bda33598c5402d115674b4ca2ed069e2aa3e8bafa966fa1014df7a29ba7c3733c7d8489d970dad0d16cc143208fec60aff0a8d2a5ee62eb9f44bbe8a0f0fb52e48e6d92623d3562d7d6964609733f883e7799ee4a778329067699b4d5241b0fa04e1e652306fc773204a754f94d3da40803c5255b9bba38cb11901700b7423385f621c87c59ce92b342034f476ad9c347a7a7d07764fa4b76622a381e360be44862684c2383dc3eb5d978f004ce441f4f0d4c06a653c16b8e36e5f0f83f24c9b030fe517eb102ac310afdf8a2c47bd871516abdd141e998728ea92743a1ddd7a677c0d0d704f7be8ac18aecdc6a7ae14548e1d57db2cff81f073a091315ed8f44d4e3777b3130e6e48a8b9cf95764802775fae0046ed7a61f6006c82b14decb703e35e4660fca9dbf6f84c77cee12c1e0f2bb52ae4f1ee908332252c7949c505e75ab7f0d1cbf6d0821d849b1752988b8ebc3faa45af6a59a891ad478a28462b7c4502454e5e342b418d18d4fd1be07d081ed3f8bf1cb2636e40a38338d369505f86e360577b2cedf39d3c23401cf859a6efc5a15f7499e87f7b4e2d7111620f0f342a0cc585751e5963d291eb3f0d18bfc8dc3de7c98100eaea6cf676882ee202a0cc093f221e04159dcdef10e2e993759be1792398cc507d85abc68f8937e200de67580b482dc5c960fe29721c66fb2f99b0ddc54b94c4950d86a7e62eb89e5a4404f24aa669e9cf88c7a9a670f909e791405d4bee9195da40dce32876653ff133d46faad8961944a0624a8ecbb077a15917134a30bc785851c2749dbfbb4c7d9339df461b4da4971b6e87a2056001dc018e7b47936a56e9a2cce4c7243b0515cf9c8b844861b95c38b131e8edd2f8986bd336ec6e18b2c239bb97d8efcdc48cff6fdb720f6345951da1da361d2fa0b1a84b04335bfb74af0a1c17d351f36e423cf09cecada32d573bae9609bb80856a1458e1509d627ef206bc7b3f0848d5e29ce33e8e56f65d00ccaaac594339fcc7a81855a01ff6d1bd8b4a452ea090c5864f12a613fe3b545fafd11875221268e7f4e8a260abc5f1a84870c196600bb3ccc5a29bf483bad6804a305ec660063d30a0730e4445b16e65f1f87e01ced3a43b607c39c9c0be59e0e1040ee87d3d42c7b13a12611e5f11265a3bb14013a62ea3a033a2a8b2126486a5f9beac2aff771021afe1546cabf1096cbe6614a490813903460a27cbda55a3923c057055f06adc3f15c8b9ee9737e00e52fc75f004e19e8ad3b52c32147617555cec66ad5c17b2aa1a54fadb482905f4edebd9c038600e751741db6f6b5e340a59641eda8fd674bfba45df41d6aa06010103b9236c49216a4671e594ab5a8d6ef1052c8409e18bdb04dcf1e165d81ed99fafc12ed022e4b48a1e3a22657a4a10f55c57ca75c4f214eb21e99ee31e4642aea7e81280889741e09a373f62a8c916e259e54519ff37c69d24e427fb9f2ce7d78b8785aa8e80c19f789fe1fa7180150352f632eebdb81ee0daba2fadd83c61c228fbf238fb826599302d1783e9c16c167e7ec8fc6d0c3cbd841f0d5d763f7ebe7f708b0c36d2c5a522a736cb311b4a2cfc31324824f41f6f1700550ff48cf0a171be0149e90bef9e58d555c7d593c1c3a66c3661bfff45758823824cc31d92bf3e014d2ed5fd2037f087d385a9caa33415fe4a81eb01ea383b0b90b7fe19ea74b804dfa61bb1381e859610d38b54acd39a7e121bf3b3c60ac0421b5e0aea8e2a615540f1688441b7b8964474593501644af264ef8c6ce9398220e3a2dac7a5ff54d9b14465cc34525eef606db3373354ffe09f0189598eec67b6db93906b7bd7f97668c4c5d8e2cfcb5ee34302d2971b837046e57dcd0d928778cb6e0fa320856c581cb63c14573959c11c71049a6df510692591aa97562033ec9ff51463cb8a65bf03b01db10206e0f66dc8cf8c496d960b898aac42eb5ed4c78653b259a885bda316dc797ed790617ce9b98bb337ac17966a24c6a822e7fb89dc6fe0ffab7fd750dcfede224b3ef52a98d99829826c0bafe60d9bff0134fd1c5c5cecf819d8629f0615d56b30f9e0e53d3e6f6207540430022784206d14e1019754c1dd34da0ed1971ee5e783643b3e206874ff5f904d8590d7acd8c0fe5dfe8868c58477e26d78bf1593ab10638f12fb62a4f8b4acd4536d5b122306ace40c213d82b51123a5b34a7907ef04cc6867fad2351e3a8239d801d877075357e8605594671af50a145f6b04201353d6d1a371445febd323d6e41ed50880ed719b0e549dae515106095178b942636f1669d56a91f1cbe9f339e049af6ad004a63b9a884ced1c8e2e9064d84f2e9e7fc830f7c1d5d0feeb411ee4607bc797b2dc1fb33c3311ed1ac143ad901d9ebe9c10c383701f3074381b61767f8a7be2d2c95545f39939ad3a23b1728e08f5b0d61ce505a974573d1301c631e97d80e97b1d5cfda964ef35c3a7c490b01e530cd4593161ddfa0a9306700aced82bcc1d6da0d48b09bac18d7c241e67ae5612d623a693f405e66ae9415fdb5331ca814c3add79c78a237165a134db4c86244127896d9a7aea5a113ba80ea77f104c139b51e52f2146919fc9cf6c60060b3f6534e01f5624fe5ac7fc09f35ed60dc5fb309cfc9d1fff3de3d21f277dedbd847c3146f63c7ad139aa3738f04fc1f6a8db508d28f08f4df5f6efcabbeb54cbe44ccb0d58077798bc5496fe3e155f3e1ff5422436f45b3db17148fb1020ccaab9ede04adb719dff373ec5fdaee802a4351f60c5f7ab088536df68849cf741d47bd27638e0b4314ae523fe59d751154e5716810156b8834db032e7facc75b525b87a0efed5693f13fdd8ff5acf60860c3a2cd2d2ee0f9b075fa330c70d80d04c3df6a91c6ab7a7f04794ec98fc5cd500c90555510fc5b7c63e9fa18c5b9bb080631462d86129ca0161b74f6fb993040bb7f3ae4c3eb65ff3ff15ec8c3b5cc9195b1c5bdd4c7b126bb70d4faff57c1e633aa72df3dab4cb3abd6684a51db5b7bd90e7e896a63ebf01b3546f5221711d02131f36bac35610f992ee7638e5f99a3a2896b80d30cb31cd0538c33ea70fec95e8e815c4d1faae363f05fc5c650f6cae03b7872fe9bcb3af06fd6cd4184903b4a73d8f0d11a915b752f717c0534043249b139f5cfaa0de1b18d6cef05ba5dc5ddd75e0eb9f2cd3bd34e3cc9eef00f786f9ffc1bcf8d300e545378290d23507fefeda71ec34566de689256ad96ad3e23688ea83567d99c7c1b7fec31663463eaa0e9b6d5b6eae52b659ac47765e2f769cd1d09d190c96233e0f00e0635ffe1e2e5ad0a9dcba27c3013a23711c4403b9bb6dca9878c30b0f53c1d8c16abbe1a00017d4f122727e19a7cdf4dd1277ae1c7068d6053849f6a9074a5477cc6f436511d331d150460ad6562b6d3355187f84221b6793694e9cf8584fd5c76a54e8463847c8c847e87ad246ed0f0ea4f3c21cc8f870afc9789f43c29556c745ae005672206d903eea64f901b0cc37c59bde3ba8cc5bb1a095458e112988a82e258f8363c171704b242f7216219c7cee80e3f99223f9cc3fc75f84947764f719e99cb6a2f6de4db37158ae624c5c0dab494e51b0180aa1fb8568d48d6ad875761e89c6f7046efbcac6b3611b61e47b131e156ed775489f04fe54ef9624fbfc41a655195a51edb2136fe151b4d41d2582da2a286521c52edb0053fc54439441ab18d858845a3d152bea2247cead5a3dbcf81c996b5bfe56b07ae0f8dd9848d8135ba99c4e985364c49f28fe8b8ed3729df39f933b71e3e65e4f8097b40dcafc0a0138ef1eaefd26d108895abb7e9692b0668f00cd56257d98328ef8f205da530a3b7c00f718a8a74950ee16048ff0da2c3ab92c5852de07608cd760082cef04194977fd4c5fb6cc99e055f5241af87f4a6460745fb110429d3c2eac368950ad380146f9963c38068a4317ced9be65ca63b66c88d64d2219839e08c2752ff9c95d8f301708ffe93b70fe90e0a7fae412343dd2d434812941e35926150698505512c57736b72225204770bf569215db25031dc244217ad27c68b0209fe4f077a4698532d0138494b10344d876b21ed87d06d23b3143860f2aee6edb4db9aac731ce76836d662dde52986eda249be1062821e508d8f6aef5819e6e054872ca7d3df92d18b51949195953961b177e5a479a6bdf73ffbc4db55b7000512a15d471970223257886cd31781338d5fdd71068f4396175250a7392bc73d62648c6aa493a10cb7d2f004d3d485fd370079dfa435baafd073c1474c262b432a307107a9bfa8461d877c4cc1b95b5e6b94dac0284c88b4113ddbba7960429371e96fbf337871663a370d37a497ec0ece0356b2b11909afc50d0a601d5225a7a0ecf0bfc49ebb975982157837e65e89e53e3aafb5b38c979e69aad0da13e4f7b1a1d75c91681da6d7586f9f42588a92f31fecd9850d792910858b0410791089175f69f85ba6aca1b1461a7a00306eac03884d9c5f2e92e14bd4630024b9a5a5c20bc0adefb4bba95032ba27d02d317d9e0c2fa053c768300f927ff81532d22a9e60f21f6c623c0ba1ad03588ca7588c4f0e143cee0a40694eeed1147b8bcda10c6ba269c261d836677e1dcf49f52ed5e16e6befc40c949d8be8aa05a28a86a3e4ec0087705422f16dc112367775df422ef8246065bfaf8f4bb0266f06c477bda2429ae0502d54cbe072454961ce7f03bbb35274b20678e50d2ff42177900ec27107a8197bde3a1390c46c76f4d4cc116f254f455ca64d9513a483f69a368b3493b209d92cc47031230619f30196b514dc4f9b9b7170f6453ae83c6b518803b038b58a5b4e9e2afcb1eb632e4a831e0b0e6ace621e5f7a14c97780ecd24824b5034207535cd0d490d5b0c038c215f85587a7134a6f7c7759786b6cc2304041a5c9606472566a3cbab51b2a28c7de13ed07a76f4e06fc04b7816275b17a85160d4fac03fb30d66b6728eb6b962fe591c9b07c7fe2949d6ff967a04276789a38c361b8f12a644fb7c25ecc509d942a56009482a6c63c1a879e81fdff87612c2b0ace4a20a104a0a9e4f5b613708b7c79695c16234f4b579da5001a0bc188cafa198c998abd684fd46100c7654040216c641c370e2a1ac9506f19098acc1c84c7a47bf717204a25d321a50d8e853edc144c9acbefbd2b68e60573238f391d595dfaca501225cc0d65431be17fac03c86c85bef467b4fe2dd48dd3b597caa931cef3f5e79a9b77192ebeed808e068c618434ae20266b24c3e2949244f7dd4f2d88a00c7848219078fef9fd410f558e02d1d2172b33e6bdb2383c211285c2999e783c8291b5d1f01351b69133a3a84738f267777ae3012adefdffcbf2f25a1439f95e7446a3d258378cb1926d20eb6295c0a3f4fcc3a59e8366f3d30f6e32f424897266bd8d559ee491e15deaa3155934713919dc1504a5369c827920a57ca2217e66ab24c7b9c2263669a83489a4868a1b8b1a6422b0166a54007c34b366f4007ee11db828a2797291ec717850786ad9f1e67dd733ed9f834c3136317174ab9fad6c5b1390b29ea356028d154a8b2fc84b2164f5e38c7fd2bd05b0f95ce3a458313c46532d53287421d62017bc3d4ca18224493aa74229506c1491a4391bb1b512a879896e4a4d0b247a3c115ce3aade1d228446fc49a06c72b6fea9aef3d5cd8bff735e602762170d2fb0682806ca4519f1297f531021503e18f8c24103317222a0e4c3413de796a67d1d6d51bccf5826237ce53c84f090cd7369be2204a15edf5f22f1c191f872728648f59108bc33374b340a4123a71bc2ba40284bf8b10057241eaf8f03088d8f7464247d31a31ad29d40f88613dd5a8d95c1f026517158e96af2b6d6b2c6c9c34d38a1718d62f9b74b65591d41d2f4b148c72e90dadfaa1efe135199d9f052db89f7baca5e10621e17fd998670121fc75089bd55906d09bc92bc55a583a4d1537c8fc67c373924b0a0d10b12905017cc50d22366b571df4a06fd20aecbb1d0dedf3d39820d4f8bead73d7278b51d7c3415051813f0076df9afc2de8cf97b697699918b57bde13665305e21c397183acb835057c9be59474355c53811c1b450e63ab44e480a181c2a4c883242a9079bc0cf48dc74b7e7c75097eee617c30ec738f42052e3cd8f0e80c04abc0ea12df2079a945164dc2c14989d6ee902cf4f6c03d4a2e43842bdee8dd822810bca2359f5e760b4ae3b1157a432c75a3492d9b0da5950400612880cd82bf9de3f3ca0bc34421dbd7deb7430cffd902aa14df209c7c114718d5d616a564e4922d854d668a55fd3b6312ba87a599c8ee73d7a5d01bc6bf73f33d87ee01bf2c406dfa6b07b91ee61ed13a6adfd466ebb2c17f19dffeea66b5e5ea8007cc1a0e425b255db8c7f15c91be41f0bee3e2e784de46e61ee135fb06296c2e4fae003fbd1f229c495a3691a6793fac8a2773fd01888a8fcfffe90e745b4ad155d1b31e038d6951a59fb939750ae38fb8c2779716e38027c528baf3ba7b88c06c90679b0884e2c03b30de6b770ff069da96bd3fe83df2d95c190d15afbf5d653d18a6d52279c5a0f770b4975cac7790b248592a38ebad4749351c12990ebcd37a12ba11b71e1d96f37c0fa8b830e94e9825e9ee114c347c1ac0f0354f10dddb546e2c73f718631f5b163ed882de51f869b1839d1618ad0c0c73a0689de792e766e45753e1e89c6a78404fa62c6434ee1be67d009ea7d4969c910a8937f946578bd3380e1d7ef74eef2099892b1cb4b8d0fea0ac9501bc65eaa16855110381a108ee0648f1d52b07975eb3c6c191576da32660fa1e12db22f2c375d6daf2398263a3edee514e8cb82439d5227ed40195e1414055d3dd83c86d091f001725670b74507fb97b080c586421c8570a6694f3e4da3f02c41e565a3f7ce80e7a12e131e3440252527799840e4e0aa6b9f02762d876b0116821165f8121e65a2d775518cf6e128c74e42ba92832609325c3d696048d376e62006202fea1087c3bcc2c01e840075d1fe899792d3790f921f5e6df7c366e350fcf0ca151cc878ccb361d84ce0d6680fb724cdf38330e1f27db87c1b1e6cc1310f2d109d3871595b2fcccfa78579b07228088a656bab6469255770f3848343be7cc6e58cae18a75a916f974f1a2a39a29353ed105b99a7904fb3610624dfff3d3cd9f126fa2281a951416cbb91c6e0f1f1a774d349529aa03ddd362fa6c70c601a34a9b9b4848492c6f5c660a03abdf8c1a52de622db95118458a6d56a0860a85780c0f0ae2c025b89f395e29ce4911e268126a9518bb256ddaf74f67bb52bc0a6d36dcc55121e6861e620df8964dcc8a25f82a7c0604f45a03c79dfd19641a9c61c5fb26c6f5473c2e4c49a177372372f00b070de2a0f0622d1b308f86bb8ffe77f92374d53476bf6caa1dd336c89c2874a61a0bf8d1bddb68a1a5f1c2433f87ef5cfc47fb75e708bf432bbc53c5286dc5a9fb56d92b889674c7022dc7fcbcf83ac39815ab4ab2109c5a690ecea8e6973f3bf1bb7c7769dfda0ac12748a95d0a94b0f5904271d061006303116720eb9ab1494b7de670547ce1b7e8f013214a398f72218a96249a7a734d20786bc01ae478dd3901b587481b70b2e38af9b4546c0fa1161629e1b9559a8bfb91d3707a041b20d5029d8f84ed21ae99fb9879ebfdadb35cce060a1f106db28f46a4a8e856078a3ea01a6a7fcb05a3e7c0837915efc051700ed71cbf663d0256c3b0c2949cbe2abb61ffca16f5d09f9c4332ff6a6cebfd31decd7785ffab439b2f58e24edf1d1a4fdd8097337cf0e67da834b39d6f7db229a455f0420afb26fa641fe96fd7c0fffd42564f08254fcfb2b0e94e607b483c3bba53467a220e82efe0ba9761b3b2459562ed742df7926a4a31c8cee3b1c85196923c3dd853ed61205346d80320de7280644604094eb51ef8d96c26729e5462509e557594d4559dc608883ad25cf301f23ffe2fff83f0fee23305b59c03ca852b982177c03b38f6784769aa98107ce8b988df9665900a10f482a0411f4af72612ac0bf08b17fbb2a1879fb56b89038c6a500a11f222428b3ee47dc221efda4e09f8d7aca045df3294e0906f6587c4fc6b5ed0a3cf6ac46db0a94129a4b017012dea33e44ff3ae7c6a9eda801301af1458493f62590ad1ede19239fdc4736148842959d7984e6714206378bcf240d3f786e355119fcf7bd35740cc765c1facf1b552374d1e9fad46ec5cdb46322bb36a4863d3b336ed4dcbbab4330d6bd2c63459875481c606959f8f1197fff4bd0da9756645389e30a9dd8c518439d81a6836a9c3c0a92fd4037cecbc1c0dfd6d2eded5c1514d1c5cb88ebbd28429e8bee887e16234dbf12ac785bf56c0306b4c37f2b677968eebe48ed1389540107fcb262f188e5d4938316331c45fe6fd6611d25a38faf8c1ee5f4a8de24cf888e20cb0784ae95c5ef8cdf40d7eee269b3332b1529efe7e91cc09a76f7cdf2c9585c88c82751b24cc9ef5d6967299f836f1cd3bf5f5dcccd89f6e6867d0c73f14d21368f95410262cfa804c9f66d68a4d250b19ab47d6b5c8e9479647e3b43b4d728ddeef9541b6dbfcf637654c6d5670376a7be2fce9f51937fcfae255b3a88eeaa9f76c1fd2239f8f0371b1ebde98d8058280c4ed161269ebd2d3c3a62271d1e7992d8b219756bbf399e0c186b99e8cb245c7b78c763e22f4ba32772db5e3a2af20a74e2b2f4cacb871b9a9b365787e36e6bf870d5b8655764e1c8bac9990fa6be2e0ae9cef4e5537126af2de8df9d45be11b5614b6a080326d4f9d21ad95890d7da51f2ead52d091fcfbe2dda40fa15720a302cf58c878170b22ef4b1642183189314a10bd2b7400b27adaf96815fb5c4c7ab7e093ab28a1b8018dc64129ea444e1046d19d7e35d8482dc15113dca6dd9b9712e7287a2c6c52e8d8cc11d3d24d611b17991fd92324695fc836170a5c81fc697e232b297c08d49e4491b74c7a571ce97ce3f09759d36e2d7156134ea35ee5d6ec8a8a32dbd88f75273a75013b203108594f56738f43404c3b6cba97456be2d0982b8647796126dd9969b4d21f0d242a16f7516e551335d3c041c08b45c0d8c486dce28dc0956793ebc4699e288f402b01ee2e0096bc97a079701f7abd3f65c88b426c98b27f292cf1d3cc5af202962db7e5dcc31a6a99ffb5b2e25240747be45c82bdb5c3e0a621bf3b63e0a6505e735b638dcb049a5a86cad92f640ce268b67211f11fabae30134f6d6f3e2c5ac19c724f4d97b05a6f63e7db00f5cac04aef8fe1d47144630be1b0a6300fba0650ac988b1e0f2125b7fc2b7a001978627d51fc57d33ff81f5393827c94c0cad9fdb26a814fec8ce440e5982677c90f75b13ae1c2e30270c35ad8ec23ee44b24b9461c819c3db9e6e645d9745aa50826cbd2dffd371c5c308f7eb8c38e50468c8cc8bbe7b41a74348b4f986f2234297bb94c7904e53f005a2f6cae1c1d9c3dfd3ec542990ba717ef2658e5a5f8ad2751830ac1a291cbcfc61f4b3b2029352ba788c5b61d2934d4167fb0a2dca383458aeb578bc75d95eaf9707128325de4f9a47ab460e613134de44e744cfee83ee002bf377558f05e0bf42972280a3a6f98594d535be3e51bad64b59eda31f719bf80b7b01b056ca4ca601ca5792d7168f0d7ee4ec58d79ad99db65b526e888e36fc865e4ed1b0cd1351044d4b0acb997d0b6042ac53855eacce524fc17139a2b193adfc4e204fc41cb396a8a8e274f3cca9c43af7596fab104e33a1dbf944f0fb03b0c4b994c615862a2c12e47d3a95a4bf2ead7f8067df9acc19c42e5944a41d567311a42f351468a5bb6525b0ec99b436467f3a2da24f10d310026986302895880a630e374a8f573120a6c38cb3528fd3d5ec5713478ed242eae62620761195170b486face382721504c23dfc6a1c7010829927d53bd9dae466fb1a2a71c6e57b95dd758362f0244c93f5a4973d45601dba15803bf5769f27757405044c398e9c8e2ba7f3e8ed38723bef1d2fbe71a9cc395011fa0fd48ab78f3058cf8f029309acb719d84285a0154228e4aeb8d9f6e24509faa1195809524931599cce511cf02d7001c4810aaeaa65dd8efea21a0fa33e40453ff80360a4b1f691cd3d8ea7bde28124b45a12de95ced59b9599878b5c92f68cede40d9578f8f71b3126c3e18954570a7e539748d07bedc10f3f1900efdf72786f3ff2411d61e6f1537071bb453900fab0e79ec91a6952776bcaf8e93c21b6d61d686c58bc0eb712d1f5426820388bf6407d10cff61932efdfb81f627c43f0c36ba711080c592d7ed6e31059b9579af9e8e0f425432055d3007478ebe97e50b60a9c9f71f00e6fdcc307a644927471ec6c6e8787e2b99cb162275f9acb0e7f16c1fa2b52d77b8d2c062f9c80e75de8764a3ff366d6cdac9b1937336e66f4a679263e4481bec86c0e785b1eda29d1c98f7f329babcb43f7a7ff23febe7a612f4eacf9e6fe4d0bc52045113ef7687a85891438002e2d3d73da0f2aef7356cbc3a07ba93d2eaffbc0674e2f325fdcf0705d0ddb0f26fc1909a12fc0995f1fa53850d09591851927d7d894c5db1de2ef0db5ab5c26d919fdd16b8728dbc8a00dc2cdbb076f052d8e5b663e46b1b7f43cbdf541a0125663710da7aa685770a605bff7dffe36cb3ace3fd9c2b0e146fc0f0cf06e19bb610fd9807e0309e83c1769c1898c8251a9fbe0a45b42c2090254d0a5c6c97d78d13564c537b79e14075fec41195e339643e6807c9698edab307504df2171b9d5bef0bb4dc79a7d06cc5ab91faae4ee2e6427a5d4908e2d621591f474e73eb3eeb18a4bc23b061fa8b0763ed9b05448e19c398ea5241e9c89e7e4b171cbe2ea9ea114bd6a7ac3394e75acee8df602199c818614a2b596aeff180d92bc22fd19960e938cceaa749f33270bc7831e99858a363972e7d529f01ac14edb3abb4ef4fb08ca9b75fa35b2ef8f69fd6a01f44229c477bb843738bcedc1e358e9d7c1df809fc0dbfa5117f885b465eba31c9ab658c5bc04db2277d5335c2f86e90b0c3f7f66ad94cca51e02953a13e62eb9b51458f453aa99dc4d90dca8daedd17cbebb09c6223324b9cb4356fd6c05c7b96e0067484ab3d603354424586b95badb57c4f59702d91286a89c629fdce31c5b4af1ee26481602c8be4228dabdd77f969de835b3ee2e739539ce94fa74ba55a276f7670774afb08b4b178b9e6c461a3ca5d4b41bcb9c51ba08d9ad009ca5750671b8389cfa54ee2f3430253877e35314f004bd46ec03b3f9fba51c6871e8581450629163fd433681477df3be5de2f4eda6844c5dc080f021f57698de3b2e6f72ebd305dae103f5da7c656d3a55fb8715b9dc3dee2559915e003d9addc1082a301a586189d9794b7faf22081bbfd2350e6ce53ea3a74a1ec16a5d6fafe436ebc73156e629c0ce696350c7624538cec6ad799ce221eb26eb549aaeeee78ea2affe251508808e1c5878d53b9a96e2a08459988c802027761a951c0c42b2f5e14f0e67a1f18c2add4a7f1ec0453917d1927622c291508cdf8ad2c652945a26676b6d29111f3c812d999cfae06fb3e815759cb278482a58ee64ba96bb9412e64b4668c96554304205a6bdcc42ef805e0729d7c7278673e28dfbd21d8222e9b924db0b2c30cf6c2893c0f42eaacc05a5195996f697b53b286d06c68c378ac96c59c187d376da4389eb18a823e12ebea94988ee9f69bd6c16d269bd87fd83ce03fc3d9caf4456f0449a3d2ef2f254c5e4f2ea11fd73c979183b3c0309be4af82d0f40cbdf454a732c51464df5c433972380fb3b370fdfa871c51a9881e5b550a2771a874412db47d662233c3bbdb7f3381e0894d30e310a65299112d087876abcaecb50b6070253aa770fcb87f971c4ba44164e6f2ec051cf87b5e9417c44ba1e3f78aaea84a5f87f4fd62eb51d9daaaf1f1015427df054552787473e8891baba02a5672f86b83bb68dfac4a9462c50ccc9488891aeee2bd9800f0f3a234760ef925b5375e4c49cf16cc8370795c804eee86e04c4bd62d9940f17ad4815f0ac8e3c5afa81266de5820aa24aa3d4191171af6836e6cb452f428173391b5dc449887a0564f929138222e28da2a07aaf297f6af455f0d90ca4618fdb88b75190712397cab616256864918142f0e29065d63e2b484e264f77a62b48f0b4796f43300bdc923866e09d6444da6a534ad3ac3cc5d63e241caaead402a9f2f4214b745d303b33ef21ebeea3edde8c9eb485a5267c0aaf09b0e8b968c99cf4bc549ca90e2f63c569aac4527ab023db8512c4de58b3cb4abbc5be08b318d9ecce522c8e19c6367f392f0cd692660aef98ca8cbb2929381197f8ffd86ec5c34c115381557ee376cc8149f0ed1687fa1643033f5141a5d2aa405cbdef35da4ecb5865710ed4fd203d7f8bfb560548399c975aa23974f7a99f600a2ed82556448169ba0f9323aca45c9f2f2de6b46bcc6a9491129de294c6ab547a474575b6793e1bc4e4b88a278d39cb65790603d28ea0c38f3a4dfc414ed49d5979f7de0873b0c69ea7a9e0690263ff338470d337e1d2dbf33edf934143e4d649ae0948a555d6f0433444beacdf5a3f54e795c9412daa0c4e84416418a682e37f348dc2ef39582030ae6622ae716f793bc4f1510642681ca7cf2b77d66fde5b290d826b0858500b9fe762e5516ef0cd8b2cf2903f9a166d3e889fc329e466e406f27abdca23748047914883e1bf3452a41936fb4ec6eea749f687c8bbc5f158531d37328dc15f106fd4358326bfc8eae62fd28d1847e6c2c651d76c6542011999a48d0e8b4df4a70e7cc08883309cdced62567b0a4f255544c5751064b8272e60eebcae3ce5c434516fe84a38ced3ee3c92b01a618c20b600d27e988eec8f79173e006f89bd54805675286f9845a958bcd84155a8b9b240ed7ddd908414dc60d6b043e5c5fb5fe67a08cf2326955044af6d686425386ec4afb997d79090e5607eb7eec10570a41ac419d8c599196061ec360e277fc5d146d1568682e009f440f50a44dfd90387c4dbd2a4d6efb3f19647725dc3a2f1491c653148bdc2b53668f43d3f8c54c5992d75a1bb043e6cfe47e26c18ab33e9f357a82ebb921d55699d72bac81d223b3919f2a07cb8b18272c186652e021f8842ab78697c4065c92873c6a85f63244457c6b2119f1bb58805ba391b59c43ace977aab99099d0a246223c96a5aa104e9785f337090fadc790faaebb86332133546da973eff4bc741d78e9a4a0ac4857a5db6d3b13f26a1401ebe4ebc91235b680c230eed27d9a61967eee999d85d1a4c7290076e3c46e46836c5b06f484d7a1032d70f94039d8943262ad10b0278eb5a46ce060e71c800cd3d86efe3950ee6c7fc28afa48af8fa65239c602822d11e58245efc3d8ac1705605a778187123d9518c902de68b004175801123ac9a2bc12b53f7643c43c7a948f9d61c4e6d250cd47d701eece7cf6da870971010689a109a39b1c070b2d0408c2e3e7608ecab871fb090cf1c58e8294efac5f897131772188bea9205ce07a40bf8b63a0e5d452f26927ac57b84dd1cfb37f52173dbf127db8254a9592c0400ce9be77d7cb95faf4bb88b1b31abe7a7073fbe9348d217cb8661fc60278e246bc5d369c0ef44ff4cf1a662868f1d46814d0175216a3b6139520fecafb8f6e54eba23b50db7a70d0a86468bf739a91b5f1e902a1a5d1da7c695f600e2c4b2aadb79d74263ddb0dcd099365c0df6caf28b3bf5a252d5d72202d56dca986012174093fbe264906917f239d9b87a664faadf8f2c027d5201b308eb7ffdd9c28cbc53d6f9b392d60c1b169435c8cd7f7455539c7854bfb4f69b02977866cf372d521c60a4b3fb07b28c43c24f08c33b8a865c3a21ca82e19efdf9db5423ed0610108d30bf35a191b5131fca233b45e996ee7deb58459500bb7f828bdb4711132aad8e404728520eccb18be7231978fc178fb63ef7c9578c6a330acb2ce9549760e575c319bc8de910a002984862ec1afc7f4431b0a727184d14eb8dbf1bb0a85ca023b4f84aa66c94c30332dff9ff1b3600424338e04d41810a3d1a00b277005428edad919eb0349d2c0d7597dffec7922156abe9a9a2e9523ff22eaa582a48e697a1c811d5c03e92eec621ba7a6ac46b74dba4eb0c466c8f95624b75fee651fac38cf705f1f55d9ffff9d6ad39d194a5b0e853d4e045215c303a0fbabd35b0e3c8026287c7e66b5034f8c224303960d55f43741c6a0184a435289d9b67f4f99db946792d50f432371d57c6d32a2f3e2bd25439061f0d89f5cec1f36a3ad69908e03f1f860f7b5ee63e11d8eeca6db500db4853a922dcf9a11af0785c58bd9893c68c630a040d23c48f89c428939ac7b40b0d2716ba1cfa4db881c22c5669aefef09c149076ccd49b6f9eef060aa8c48743984459e336a9447d3249c2a488041950736f5ea3959068d6d8d7696d4d6d6b109476daa295eb62d937161623e1b9db2289b5f5214e051dc72a04c10436a0fdb90b406784a620546dc1a06337fdf3bf7c317abe25574a6a3fe26c15d520635d5e506abecf32b16d529a418c698f54064411d066c5f3ae95d1938c928b204fb096889f18918003266192afa7fef00a008134815c75be2f095c1a608e804b49f2e1b84b14008895c02646839f24a84eac55530bc494b40dd7f17c354d36036fe10955788b9b318cc20022242fdd9f5da5ca869398e3d7813ae928ae900d943c7c72efe6e0a2f998497065997fb17406c1004f6fdde26112e45bd5492256dd7e1aabebc2a7b1732b82abd8c02d041451dcb7470d96639c2ee2ec9ff9193395a00a6bf91bc1de8c616f26e6f9d547c31991b960dc57971ec0e4bc7d2816c42ca023dbbb440223d9a8c3470fc07dd5af1e1a0cb6a0ca91509c5c78f43a872801922fd267f09240d51290dce782217de6f84f5583c8a63f08c7b22904d6b180c187527c7ab8f4f36abd67f9071a1d89c366074f49b56c79ebf756088b9a92a12878b01616c229f2b287a592847106a94511e4ce003c9b287974e91328275c1950ebe6ce047c4668f77e4fe0d46e9af98189b5b8c5d8739a8f1ff3d5f2208d76184a0fc1c061dc1f8b7fb32f30d1bd7d29b798412fa8bf6102f955c04c8b6c63f6dd6ad11694943486b0f708860bd6c2f083825c294a12e15d1890e70d92ee8006e994517398288a424e5ed4fbb9af96f1793291ee329d2de042607c46ecdcdcc955062127adad5317306324f602ab66bc0aa4aaf228264e3bf56082be977ff311ef41bdc90cc743b4f4cbc3b708d618c34a991a06094e7b634bc6d287f4744c0913535fa749dcb41fca2e61ab21bd2505972f4cc0647a04ae5b9a303273171512bb28f13684d6479f445f398b57d9ab58f5263ad28950021590cea4529a818c27072291b6ee251390e456bb86f1602b804da2820d9e1d158a2713d7774a55b1370a2e4871667fbad731889b5c0e57a94541430f8f44dfc85c4b7eef0882a691b9845726999333bad52a019fd40ad9c4b660b40332cdd8cfc5cec5d0513166040fe64e4b8845c8e32d844cb9e8548bcd853d2bbcd68a9d20b18e66934f0c64e71c79f99981407399d0acc664bf50dc726b34079326e9d23457ee856b7bd20df6a32d71bd8ec93a7b35650f8eddefd2190dd67c4be41d3631b4196d081471b22da94ddfc2a9294738a9d067bc616c11976d425cd58e708bf6bfb2a81a190ed3bf551489b68b98d468c2454e18d415085bb042a8049904b01a219e6b27ea9c6f47503eba49f3f163397a838e24ce3f89fb84726ac95c8e1787b31e488f42c89a7e6583bed5661299b7879abd52b3a10599062c83fa912298841fdfaf404cd02732b9822dbae0d7ed8e78d9757e5ea5517fd09e692f7274455fe578a7417bddc19ea72f6d4b95bc2bceb29412fc742ec3e268f2b1817cf56eddd810452439bbd83033cd060b54829096160d373d3f2935e89ed7e2d154a9ca6e0aff7eb068000fcf9cc2b10e04f18a187b4b6fbad1c0f3c2e5c9c5ad740b8bebb730d4a444f4b8d4b44539410cdd306c5491c416c2bad99b18f584bbcbf2f48bf947d36c1cc3f128f28eaf286fd01e85ade7ae3783d4211efd420841bd61ebb80568f609784f9c3c1a81577981e0bbcdb6436f656376d67fd55ce225353cea5875a00deb2b9e4f5eb5562cb2cdc1fcb168e44f4e2d1729515fa9fa0a59473e03ec49637eb7b0d79a2d3f37e088fb1f65404aafae2f0298c2406314674251e795bc9086d343b706576ec9bb49d0e373931ed6bcae51e79b600a4db24d533918a8a6b43f455b5fc24ff7601864779d37488a0586b0a1511e806d02ba84bbaa69328858ba0b161d7b73097b8ac71d505d2d581d6660724c8550ee08f038ba02912b0adf2bee42a6aff9ee7b79d7dfc17c43393c3e2d52899523644df394fc63ee8eaf8c6fd0d509e4d1a0a10ec240b638b74d5af5100d7ca4088243368e5b0bc8fe59580a4cebe7cb864f9dc353d52e6c38d59d85e92ffba188187b481b888743a8c0002c66aa7ba2346db9ec61acd804bebf9fcd46253b75dbf0798e6195ca5a42b6c1f7cb5664729edcfcd90ebecbaf0526bac9b064c7d2b5fe8ea0c6679214d3787800f7ab48b129a01035128185b7b2c3e52d06cc6248b6c915e54804b5ca35f6cb1204573e7d5e3835a16777560b24c4a667f6cbe7ce12cf9f11d0a0419d8c097906c1b529cb30cea1b8326c9e0a3ad597be700a494029d1ed597b1637013099c95de2046c2f73a7473d1e1c19888992c08786c43ec8ddb536467231f589cf82cdfd0b77a24e9f07a6b5e0703525cd80c85079188b03bc296e701037e81c767d0c00e7769ef41036b80a8f4466b8344c64e6381a951e02167e63fa9ae032ece67c1f90ae5a69d13f958e148df60afec06617f61285c10f06140468444461e1c5c9eaf0b3390698780c7c30ca13a591ab53638897ebf564917c6b7b7236a3896b7fa248910d1721bae300bf9f1fa0b36303d1c3a07084386a967bfc7a863b481594fe8048330e417d72fb684bc13f3bd1a4d9a0c8875ecf53d4079b55c148f44a8af3d6544bedfd7b91699de0f2b351022809a31375c758a6fd46f67927c0c6ef6176aa08abc85cd3028ae1636865bf0827435b7357c8f5e5e3db69da81408d3e4fdc9fc93bc7b97a9d8f131b62b35609798083d64886b018f7caab6e73c0bf2b8a4d45b5d72286af2df642cc97bf1af2032d256d8f1ab4701000eb5881c3ca6e0a303a99977fc79d4247cbaf7feafbb6cb032ee5ee3669b5da897cd6db93e67d9bfc4a87d559352286bec7c7c7bd153e75b510fa0029867c27ec6d4e1c59ca5eaea24dd0172e28728f81be6db3b83b52e4e34d730af0e59b6c8d93c201ea657ec0b23cbea2d1c4f17ee83ebf2e3ebe87dc3472a72b054d2a0f4880b689d8e655fd0ad838b7687b762f4c05e9db279485cbdaeb4ad900d7610d2461c2b754c2562f3843c36fcfd1f7524b64a75f3334555b0fcd690ea5e992eec9436976ac7852ac8ff84c5feec5dc675abda0259b2a7a0696fb6384db12c995f0de06f3bf754b1cacd041f99b9b5b799dde1ae052aef6725582397e6105ca82ea7c59b72815b4fd518267d7cdd33c0786a169f8d482f99358e8cf15b93507643d9a2158ca38df0c7328a8f8780f5beebdbea7df3df6020808125b93baf8f9839359aaa132171938c0cd2499f9a1c3ecfb63d4d8484737a546ab98650bb32ac369f9a4d544c2dd5a1043704b502b2fb546a82d574b0509551a2020aab0a73a5e36265f8b49a5948585bd6272164962cbde85fb8ea8ecdde8b43bf850fea080e67bbab64baebc954fedefcb3c0db124053caff01a7db99a7a84361dbee3e87cdd16be7fe8b09e6acd15a6626110ed5695f56e3a339d33c0fe2166ce39e4b5ee9bd2dbd56bf26acc9ed36593b16d67a4d9d7b706492579563c1ee9747ebdff9ba2283ebcf1f4848f259cb341fcc1b11542b1cf05d61d99af29217f09200ffc42d0efa6decee76c4d5250598fdd8d40f4a259efc49c8c5d72f47cab066c666ea72d5da793a203b16206d4280d580cd38b9806cdcf68c5983b5a29cb003d51e49577217f2ed5c0b63c568ced3d500c173cfd48851ed197435c569afe5c59d8f4ea367f6a2d37c3c23c79c3ddd912de050c32208f4f11b9ce4e4c1bac06340289c7356252c85acaee09afc6b6a8cff6411f34490c3ce5ae03159b9fb29414b19a39f15f1456af023b3f3d087ceb975e08a0f00112b62c0164bac4305986b40e93a8ee8fd8c7fc0ce8dc44d63f1a95cdafd1bd860ca420dd9e1a75ebda7a845ea35c6dff655d39ca02b46ed01023ee8234cb57d6ac6e05cd7fbd5f72faab96d872b8b7dfdc2f11f3d4cb4a9b606033ac615aa700ac2f0be695a5bfeafa3ef15eba57c1833fbd8a7a697bb6b02bca0f92f79bf0031417a939d974c392ac0160665ea3171a1912c30acc2132faf0f5e872be48181730c01e4f3693acb0ce5c26da65436da31193872e0bc394fa9ef17289d592871d7737a38b7f37eaa24891c470e523982640a6c0a9a70bbdaced20cd7e31272b716b91b37fac40a0dc912816d414620e281ff37967340051cd6be7537155326f51443429429fdad9593145129a0fc3c5361e62b7bb141557a232aa89c4b83b2066929f8373e22364646d10ffeb7718f6927f48a2174761c6ffa2e4025491c3530a08b80f57b0b554d7a05b4a48c1b5c0487a8649c085cdef2dcd28af01cea5d8dc00e781bced838a7603e1d42520f28adbc92908b7003285db944d53fbd8f1415d4222da184cb1cfa91a24c8bfae8c383c56304147a550b878f15782ce5a175108d01abde47020e4010bb6285d9e3a4d1bc70256675ebe0fced0e83439c2ff1194a224c20f16c34fa2587288b2121788605cd9f8551842565850c8b27a0c5ce2aad4d718e44b9eebd825f7188ea9900dfed56e03183d6f93982db1482643840bd1795e19d16131c79df07ea022e3424719854502d7d5a97c7f683838ba3d336f6f6cf0d31b4852c082c6009417efb319afc5b9e8712687360e5a0c1d9097b60cc9956ec9b2c102a0e81151e9eef00655a23501f6c870f71e049b12da20217c2dbe6104868cc661dd6ad3f1f6217d7390f8554803f75a662adb0c51822f238f920a1f404161ff0ead898e18fce23bb44a554ab72c3603d8ba6bf6cc9b23263ca8f0cbbeeb48eef6921816d625ba4f4dc8ca2d66bc7b64988313c6741e377b231a5876498d421bc7713a253832335d683a3240905ae556b535606a12f985c5800baaef05250023a77fc2e0d5298496cbaf77b365e63f3ed57e6064e699c0bc1b53fc384f399a82b03b36cac6544dc464f57c04249cd73628934f410200008ca8ed5d137de4957669c7034b4d29dcc90682897e5b774083e700b77656af8206930f1b6d2daa519da20d7d1569c2c4c9afbb3ef44939b26ee1f71ce98fa58a6ece66d89ce665b69014e0515a9665dedc011665cbcc2ebaa31bf8aa52452facceee361b468a9bda0c927d50b36c34be36e9f9edc93dbd7eaeb170dda31c3d1ea201e8e8967255f252140992134ed3aa6ac466c30e941806feba473c1c3d1020b6b601f1039089480308a21c18c219393abe544166e07d7cafbd166a683b4aae5caef6405cb36d16dc829aeceeeede9b3ab0b4cfeeb76772909602f01be420f61b743a829411ca91a2a50bdb922c1c5c878483568575f23f9265afededc2281d2efc545097f4ee2148c21e270836a8397da7f06081b3d3644c8d0c0bcc98dfa7573108a8c1c246a3542514a19199cd17fe1e0e2d7c4459d3c494bd408715068a687805d42485410a486a525858a0ae7b62e94744c85aa43f2c38116a359c24f7648e212e4b3bc4484145214e481e05dac68a32110d7068a1f38daf4e1714a9e64582f478f95d28d2e3559b3436ac221957c6810e09d78e926e4f01357c6284e0eab86972f4e505a7c415bac8a737b4201198113a0001cc77c0aa1d0bb8b172b311b5d584f764813c5b9354c151b581ceaf81a19634bc08ea507865a502832a93a6473314e05b47848e52f9643490444b059a41294945262c32a2c46bab47a24d7bda220432d2287d0c1ee01497810e89a514230248a26d126e39c8119cc083a3af471490322171e9e12703045395045a9ab234d8f1a8c3923e78dc196512288082ae4a7902a19260a6447dc2c19829c0b13a1eb850ac2a55610a0252e2388952af623442aba822c86a4086445a4c065405a214e246d7d9131d666e716544844840da690406ec90638d292e61fb16dcb1e65602862a376b823518d47c88148f1637a75681519004c31c481c4a3b44dea7221c4c5576ae080e64a26812760ad4fbe59710d5060c63d6924815fa50a1e489a417108dd5085506430929593f5269252df1361859a4460ed106536fb254a86fdcb0d12716f3e2c2589f2c0c6d5c0d1dd4b16bebc03b7708820c17ba149000165a0d065881b81e01ea130737bcbc62120d695e98d5999466f7230ffb53536aaaabc498fb74ca89854230b8c45ce08280c314b54b834d6ee6dc12e89a2441c396583e85b5e0eccb862525d87cf91dfa8d75f080e1014c6ce21f8d1a2022992bb9aa7c339524e9b89167ed2c512032af27af547b7c58d84c0141f94958760280837d0d64f1c1a32d0b0f370e2530b94d60c30b97855666a8ceb048cf68b2bd3c49407cbddc2a18a02f9a606451a5290f8c491dd8f0dd422a59027166518813c9081af024036c55e952c306281a0bcca5ea12c22852064f86390bd2ac3133620564aac7111c71894ef87e7e3ea9e90409d30a3820bf3a4a46806c5d40cbd878e090a442451c0c30d0284c031934f091b2a680311a43cedcc89071f6648607d80d02707c1695a92489528f0e5e6b3269756943d34542e2200d9a417718295a53a14b899784372963066169abc0049324907e1dccc4493181401a1e0acee0412198273cd22251c10d4916e85441d030c07f5812d400432956b44f0019a626358ae0420adc1d071c44ddc57054a7c3282b810c297a13011a27597226181538a555034f9e4b3d3a756203033ce3095d8a48284eace9c292c053a3868358a6a2161e446a2ab80e5887fc5cc0926586e80bac46dc03766cd47ee2b4ac75b8f088c786f561c78bc41a0bf5047bc294d900e5489792572eee4d16ad1973463da9f083d467b8c988e3627445fc31aa3107ed425aab31253ab47f9e24e0e0c20b50212669b8c4428229118050158b4d26452a138ad18f3882441d1c971b0ac84827727271b0b802a57853230c893195102ba0fa8c8559a0a165d5258d9da61808505265e68d1508ef0fab0bd9132852da1c40c84b1090d55b88cb2c890061c03a878e3c61eec4ee6068e185a50c9d09ee2a9032a56650a441c22e147c5d985861958666238b9a1e24843c0097d8520082ba3b1e74ac613180fa86078e3b08649020040368ce9c59d258fde110c78d89a0cf7df49d088978a1c20187292aa2324cda3a93e10a949f2f4bd22f37b46a024c5b861c3d5c99810343ae4f182528bdfb819c07371224c0169761ec4dd28dcd9f5f84225a880a584dadb030a8022847695a3e99a1d2e5c785026d0a69e169333328c8e7b3a51d4c294a254948a43424d880d0713384cc98169c1f2d68a49cf171c38a5a1ba219230ce80a83e3220b011a66a2e65c3a63041329b70e6ee9c3d063d30027640216c13ad608b332c5895061cb0c219286583a522929a30f062e612658210bc18346872cf115485ede70403268c61c466bd232338b15771496f0c8aa792c6254a6064ca720a7d7d0994d01860aa95ebc703480930fac254800e4a0b26a032304b244729207c55009a44316baca66611de0a5930dae2d1f4e99b96462489fb20b49b62c0983620befd3910a01a8033f04d820c28f108dce889f3f214e022e1e5198e097458b91b04fbf0c44489092c093124178b85a1179202963093a502a8254cc19b14f1a82586a00929e3b741eb5111a29440302991f5082a7118fae20c0298c47c3439619075c492998cc28aea52f75c6cacc906634f18264aa803c079cc13131d356814f00217cf800a90223278200d638814ea1b53756105b13c8699249482a895f454ac31263991aaf1513a80d656065eeec882084101c0de083d51895328055272294322c461a7c39b075f7008c365c19b46829a05cd5f3ec974c14b433ef9a86c7d85a086d6f178d75b44ca4e93868e78bf53f068b4863d0ce17bf4c1b3f3198acefa0f03e7e3968e78b72c6616c4cda5e4c6ca5b38bbef66c64b131698ff96060c1a79314211d28e463ef051e20a61a71b1882bf4a8d2dd16169d52b9e073c5cba61552d6d4113cede9b2409a070a8c22a23641d2a8044eb568b3a9506251131045555cf2013b0e42f2aa659ece44c51b45a9331c660e16b0f930f801f6c64daa0c2c07163c44052c60860b1c00c627475ea5c5cd09029ba2c22046d3e6d1d2526607180a3ec45a78081680645dd5c79107485e13dc220a04100156e1b8e533976ca294088b4899ea0f9d99039b58cc7825259289422944acd07025ccddd8084395dab0d400f598127e1c92e0c691f01ff2f86ffb1b83f5bf87c1225dcfc1f81fed14f1a7231545461313fb325dc6e67793e989b839e7bc64b1a22cc5e2e2cadbf6c732261ac76cbbfec37fbb3de9f1ab7bd48ae8fadf118d44fb1ec2e53c14dab10b5c8168585858f21ed6fe58b7b6ffe1e90701f727967eec878d847f94f2d1d5d100db976068a5fded31f917ff8d56fc379a7d0fe1e47f1f91b530be3dd99104e7f53b37e3bd89487b181bc7ba8ddf4627f9d12b07def6979343da606b757fed260e6f23b2f86fb43f2423d2f417d6c9686c65c57fa3cdd9bef86b3ab6877474cd96bc65b439dbbfcdd9fe8d48d36c9f28a3057f7178f3307ba9a245ea98b37d31f86b3a16139bb3bddaafe9b257afcccc6ee32fde36d2873c66cb79e28bd81eaafdff22073109aff335da816698b18eae61a1ed85c4b83a9a3897a5d0f6679c73ee262646cf4634db0bd95a04eb7f9c8b6922d1df740b3b5fb46d4f6c71a2c81576be68c7f1b1820f55c4056b3aae06daf7b08800cf5824fafab3c96832f10f71c89eecfffa456c0f8b6262b6f1cfd1b798982d26f6ff1cb493fe48cf46b4644ddf5e367a35dbf6c4323be9d9c4889fee13c5e835fbe310dafeac458b600b31b13facefe0d1f6b797e5eca29858fce9c4c4e4db0e1eeddb076fe3b783413afa18b4f3c5b5b360b0c597e93219ada61bdec3e2b0be8d7f781cc6bf5e3b32687f3338198294eeb6fb713cfe7d08c1bb66fe8b35716ed7441fd366b81a29563ab087fddfc2849c3cace1b1122be26f2318ff28067f1465b77f37b483bfacad450926a31dbdda8da483c7622d0c1e8b4839bb183c169164f2b76b04c5c482dccc2fced407db48dfb4912eb6f166f06200e7620fd335bdd62028a8178cc2fb056f70ce85f1ed8bdcb46b600ae0fd6dba1ed219df08ca685162000031106c1a84a681153ab81a10792027c24f4ea22a259ebb9ef1d49c0d4a32d5116141499a960f54289c58bac4891366aa6b802e440c18603684d1db13160e34181527c7d92492f56dfc5a8261c7622decc2eff88f1744379cf70ee09c2fe0bd360e0ae09c13e1bf08de38ef1961b3a602af72c7ae819f361a3fdd6dfc7474493bba3eca43da8698583018414cacfe44a22f73a367235a0bb015354df465626211c4c48276d0f86579280c0e8f3e78b46db64cdc36dbd87cc43e340d3fb61d6c32d85c3630360e9cf306fc679c80737ebcedb054cd00f39b61a2e2a5d85a1d5e8aad2529c5d24ab1b5ad524c8d12e7a598da1a5e8aa9d9715e8aa9b928c5d416705e2a2ac57e6957d2e24ab1b412a5988c3c9c73194d4a3199ff646c88a1a914d3c17f318afc629c71ce4bb1185b9c9762686ed082f0520c6d8b73cee32bf8ef4cc79916ce39d0aefffd8bde2856d2b7ecc962b11476580adbee077d8df4c8d938e6e66be4d86df7fa1a39762cc6378af18d627ca3ac464f8d016a38efa5e1bc67001ace7b67cc70de2b43660ce73d31616ad9e88bdfcc38a3fef59fa36b3223bdf67b9b701ec3c739e7bd768f46c18064a76e01569cf31e3c644197ca24c027ce39168e639b1a06b65e9de29c2f4023c600362d3c82780058d131838a932e79a080f260a266b0420de7bc97f602b0090a0928aa38e7585c531489ca42401e469cf30605609980e748cc950bce794f53aa2a412ac89289e59c2fd812e7408bb0900f4b9c73dea740a81613490f24ce39cf117c2eb023801f95789898580bb6e3718c7e1313fb2a6dbfc217bd8d9c0bc66f039efc3292b55ddf2992471e868781e37849152638e73cf8cfac03ef4033eca6e95af6ffccd79eed3d16eb33bb2f1bd1cad08ec5fa8ce8db92f56d7c65ffdbd46e9a6ef302c6cb172f5d7a5cb89b9e3ce4bd1ac06fd3c4b8b4bb91726579a46938081180f22f5f408800b48dff782c16e9782e891e078f37e2062fce4ff1c0ca388f15af4125ce09358ac4796fcbcb5b2081014a8fee0020e49caff50a78f58a73de33f67c832a3d6e343087f3b0241a1b9400ca19e9baae04da30d22e85b1d1d764bcc1992cac0e0b50992811b487c0e49f0b7ee869e1bc47c003076c32cd792f0be7bd01b070debbf2854509e390681cdae0dd59a108b8638c6719fafa5641f4c3fa2ebf902ee122b28e8536f218a46fe33078e48e5ddac5da979f8e86d1be4caf9199fd61fd56ca462f26061791751919e2d0cf7137b218bc6d4f8cbbfffce948fc3a3152760dace9dbd7ff1ec631d453f413b3e3fc0fffb96b78d2e8fd47ca9e26027d122e7dcc794f00ce7b56b692f7ed65a14c1bc5c4e46fac9bf1657aad5785f31e15de981d6e98fc4a959cf7793740fcfa988479627a157ead4fa6e3e014ce7b527a0170de8bc2790f0ae7bd279cf79c70de6bc2798f09e7307e905670de5bc2794f09e77c412f09e7b148808ba953fc12e70f70ce7bf0dffa4afec3fa3e8166182c87fd617daba9c5c519bd7d7bfa2e79c4d9713a4ab0611cd0df1f58df368c748bfb355d062c819cf7901ce1724dd7d9b66713de1ed9aab69becc95af5db9e4cf6643f5401ceb904fe93e3870c2f7f6893122cee8706d938e7366dac5193c73d383288e001ef47b7807336ae26e1bf4c7638973fd1dffe857ddbc30a467a45b4f8af47840405640fc459ac28e561b13784c74608e7bd209cf780dc71ce87c73122d197a5016fe4918efbff451cf27823e9f20befff67e09fc16cdb13e3b21c1ec7fe9f83f41d0cfe3f276be26d874cf6ecd09828314707ed21d0845d0631112cc1ec122382946025927f2e988483c1a071b8a0130b16658d8c1744e9e06b7f6470c216fa3a062a7e619a38e7b491c12f4c0be7fca68d45a431d84268fbb31f45f917d605fc812902ca1fae7f603fb01bf4fd032b3907a200c481be347e37b3b117bf139e7e27e8b5df09bb21bdf63bd175fc9958f53381066844d6257d0febec61697be1cf041bb246fe4c70cec77e2516e0bc4889b3121b803c7a107e241471b39e89b1de9febd1c6618f6d04155e82cdf41a5a49cb01e3fcede5e05dfeef1657ceb41d976366e517de741dd00b91756c6a358e357e0dac6b1f97f6a7f376291bbdec69a26cfb3a9b16faba2c127f2db48fdee84bda8efb4039e02fc1c0de88be04dedf16de43613cac7ff10b8f1f28671c0e8ba5e71117a7a3948dde1edac631004ab812f887f56d93b879c4d943bbfe461fdba0e3ba6f241289431eafd98c3231313bf9e7824122f1d7898989891d6d1d3c74945f085686d172a5fde98672469ab64b7bac04cab27d1b873efe47fbd775df58a304d6d9c7ffe778c4cdd1f459f21ec6fee8633b0ca6e9e48c724dd79546b412e8bd6cfcf24daf8dddf49abfbd59924cfef7101e0ae99acd9eb1c8e69c1be13f1e49386f3117fbfaad85ecbf708c86212616f4415a2e280b6f7958271b3d1c94bf8d6c71e6bf30e86b7f8c8d63aae2e27a759cf7e838ef2139efdd9cf76cce7b35e7bd1f9cf78e9cf768ce7b46ce7b45ce7b44ce7b739cf77c70de1b72de1372de93e3bc3773defbbd98f31ecc79cf73de8be3bc17e4bcd783f31e0fce7b3b38efe9e0bc9783f31e0ece7b3738efc171deb3c179af06e7bd37ce7b6e08701ea88d06e7857a6c33384f1b7b5b9b9103ad6dc6d96da4ef86352d8c53abb1167c618cb9b9bd6a41b3b63138b61ac11b636a71655ccc391dd71a0e9c1970ce859cf328fcd723cf8f6b08e75c68fbdbf8c338e7d9f0e241fe103e24eb4ff74be3b01c1ec77e6c047ee11b70a6cb193f2d54bc93961b1e57e1507e5a746e5a64bfac50b4b02eae4cc260ffcfa5301e82c595ffcf63f2d0b3fdff0268d3b77d1cdec7e290782cfab838f95844c265128c762b8171c7e14ddb441ba9c2048a524579a2445196285994c7e11dbc3f518589e3f02e11137d1c645126ef4f4c91a204bb6d641d171757028fc31b2ec14c1c8777491b4b94614962ed89c3a2115987dd46ba8e5b8b2bbd6da48746fa38bc4bef6f38eeff3918171757d6439a06711cdef5900e44f96fe4b148c771443f236eacfc7f0e123d3d1bd13ef1ff39f86d0fff3f07ff7f81f6e7e07178dbff98bccdfe7fc17bafd238e7b29186ebbeb1c2d9af4217e7143c71208fb81f853afc4781ca8f82f047a1a5f0e03781525036d2b03c0c0639e718f86f42130e94bf7148fbf84d88ebe2bf092ec6244ce0cb24ac8826fb4940c339e763128e9cdf3f09619cf31afc1721922fce28ede49f1bcab61bfe8b1000f0fef6f1389c7333d264757fadeeafc9f297e531bbeeaf4100c37f108e10ce7e104a52bf0775d27e0f1e98c6df03ae88037f0eec8e9f3814d6953f07673f075df74f9aa195bf068a68b84cc6757fedd7000d07fa18fcd780cd2661f66b600f39968435cef903de333907cec51e1ecabf581c96c9b8d236d6b4fced862f4a208f381d49dba795c0ba243cf4a571680fe9ec3eb21867c7d97125d02e4dc81f2c790f8dc862918e4b7cd848d7ff58820d631b4d36d26445ba7e71dbc334fa0deda6d76cdcf49a5dd343e2cb3bf1e39102f288e3f3e335e1fcc7bbf1e399e0401e7141a1ed853f5ec78176e9d9d4dace4ae3d86dfc6e3fdec5edf9fe6eaf3cd5aff400893eb679c4c5e9288dc32fcf331df66515493f479ba6d94bd0c2b212787f399b38f4735923e72491882c0eed245cfe3f97327dcfb65ad98d52ce388c87456f4ccab47d0f7ddd0d973f4c283714965ec537d2f5aca2aabad2c6b28eaee54abb88842b81717165dcdc8c3823d1237fd075374dc71f2e67fa1389be6883fdb0fad3d1b52f0a63e3874b1b71257d979e2626fdd1ff635ddcd1abfd38db267e239b5ad98d7228ff22d2fe6db227b3a049858f39e76f9c63e1e09c13b94f060dcee9d98856460783c09a9ecbb8b8d29795c3e398af9163f0ed6be4ed6d399a38177bb8f425d85dd3427b1682810051d6c35fcadff670988dc63666444b1289f4b134d24764d0e863e04cfcf63d2c3fd1f6bfae9c8be93aeef6250b16659c5d22ed8fb4eda127da377188848f65d213c36c5f7e239d240e8b48dbf625982cf789c01a25d097437f8cb341b3c944ba8e1ed6d9e5af33fefb1ed6bff6c66159dabeb43f5dfddd4adbfe729ecd8e6f987a60a3be52a8382f9622a4a7941b2ecb469a8c734e81f321f775f12915c739fff0eb522b38e79c9420526e38b77d2d17f68dc3b9fc35ad56023ff2873fd265f2be7f7d9463fa0bdf48c5a47ca3fe8cfa316a06e71c68fb5f7ed848c7bfbe69a89d48123f91b64f2489bfe86d7b5489510f445de29c8b1ac391c5b28e3e93bf8d0c8a1272cee356f50cc6895239077e397f2c8a7ac023401357d37172ed637b2847d024021c6d5fceb3bd6c1144085587730e94897439ac4325e172a810a03c857d5ff4f13d948d25283040e3d0cb814ab387f6afe5e8fa58d2c63150e527429fc024ebfbd7b7fde988df2ed2116930f9ffdbe86b8facbd3046bad9c34f427b58be7d6ae57ff46c3e083671fee9dbf8ef7f37741313fb72fef8e5fc1182221c821c70c02431ce1613b3e390743249fc43b94f948dbf3451a2943fb24c7e30e35078c7c61925d0e863646cc22e67dafe72feb679c4cd338cdfceabc5e92893f0fce5b28e269649a25dda43a22f0effddd03e7eb9fc489a962bc7ca21f1581c7e394fdffe68d7952692f7b1f8c38cb4b104ddd0ae91f16f93bf8df46c9f081387b5afe963f1bfc9f4da97f36cf4da27c2fee87fdb4dafa125e1f22379c139af08e7e5d8308aeed74739cfd6a2c58a35bb46d2b0506ef88dc1a4ec7f7ddb9ed8a2c5bf1bba95602b4eb4067d1bd14ab01679f45ff8ef866e47ffcffeddd0edcb79364d0d38e7329afced32e0477ee48ffadfb39c9c7f03268d7ef88b473b2eeeb68d432fe74bfb1beff8d7c979587fba1a691b6bff89347d2c655a78ffd2ee6ef1b6e2fe76f0fffa86c5c482f2ff6effd76f6435fd628ea6c96c9b46b38ffef666c92fe3b6fb6bc92f43feb7edd3e088f61d7bda5882d932f10f3d4c13619936b29540a45ccadfaee9bafe3411cc260efd5cd674897623bf7c278d1ef8e35ab4c815f1b71177a3d9bf948d7e58c695943c01d5ca6e504a44090ce7b1a3a41484920cce398f1d25983c2c75ec00f6d4263d40fc65b787b6dd81738e88733ec77d36c8f0e171ccd7c831a0af91bea66dfbc7df58a2b18d95c0e04d136de0ede9122c49ace9b9e4bc9786de367d66fbb4ff5f24eb4f37247e33dbac8e5efbc4e3b07ea3dfe49f66138963b61d0d1bd1feed6f3739e3f0367aba4ffc6d35e4a1997d1b3fdd5bffbabf76dbc334b3a427fefab31d8bf5d937a2f9db9bc9fe9f15e9db4696f9db9bd9665f1ed6f5a79b712cc6378c686ec5f8c66dfc45b9ef56cbc98db9d1b311eda6896eb64ffbf277938766dff642b663b13e3b16e31b377246b2fe74746c0fcdfed98f8774f577b34fb406fde6ff59fc43ed47d1ecb67d9a6ca4c9cabe4c97cdd5be58ffdbc31d8bf599b18e366393d1d8ea3f241eff7f71dbfdb5e49721db3538db93018301549cf39b26daf27f1910248c6f5fb487452ec6808be02fe9d93894fdaf672f646eb6e39c0bb9cfd10abb06de763f06e73db433ce7b3038efbde0bcf79a71de2be3bc47e6eb8d71de730186f31e009c730d9cf3c2f8184dc063e3b7ed1f948d7f2ef630e77d22d1c7601020408010c1e8c94ae0fd93773d94cb3fa334fa7b58d795635a8b0c016de13dac1bfadaec0d9e391f82f01f03377a623ee2162814a952afc527fe6b993814c6bc519c733aee4b4489f3a0fc932b0a34c3be71288c7d312cecc842fe3f4a15c77fdb7347fa8df76278f4651cd95c4c13c982a59dac3d1db004deb4b1ace9d2fe48629c241e8f63e56dfc455a4d4cecad8e361e8afbb683435df48779100c1dc039b75bac48c240bb34d2be468e81bd2889f0d0b691b6f11bbf4d0be3b246d2384aa06d236f5ffbe3d197325d1fcb1327ea7cf9c94aa03d47d3c232eedf058db4f1cb49f88efbc8fa8e2be9bbb487c263d1df375c0944fef876e939efad38cb7f3744dea5e75c8ef31d9c73139c37e1be4141ec1af885b18f837f58df29e6629ad8c30c60f3d38187cb198772c6e1a0071c284810e7bf48db8208181344acfb6b82380796267e4d174b9449a3bf4918ed4fcb81f870602021e781cc401ce8062e6f12c6d20614a702504913eb02c42441586c480345a8bb4b7b82225105225b0ec28017a87c516145100b1536006861c8c7404f025914d252a001635660f6ea1f272c9209d880498bc88d1a11200c0162d21e98e12007060d64867648c023ebc4666d4ca79a789615443dc6e82127b403576fb053c206180e02348193c62c73ebd8b381823e92be500c068899783b45870ada772368cb16047fb22210f4c1e767950b313a7cc004f1e1e97540739176f2a2438baa287272609daa74e912d3f227d49003da04c728091522d43d440bdee2a2e71c2122c30c2f369084a0227bc07a0b6385e4a842070203905ac4a84898ae4474505270c131e842093b3e672615e0a5d5000a3151846c8171604920be04ed8ccb431f4b3eeefc9d025a91f951c011e9024406b94da204ad0131c948a4708d50005ddb72eb70034c0b289ed8862deadad6293f7c6443d8a4b97ae46633f960630b0020c50bab15a62d42a49428296364b33ef86eb612b95aab7bc0c7c7221a22e07a143b8cf099f912ac14673c92ced0c87a434a1328af318e2cb11d1001d089326b49667472b4866b462522f61e158bf0d0a9b16c0f956cfc26bc39fdbc8a2ba4580055a229696fb234c030f26911015e846458716713025b6b48b81821aa71df75c95b26962452e8caac3fe48f4a1208d2425296e3b746eaf1a98a86511b068033a3c40b231372be0290d31cb97023939a64db0222159828c081c52710bddfa5392002dd8a7e1977e8c6d59b27de8602f42ca8df8a8809930ad9a9d59b99e1054ca6221d7487d63aa9aab2442eabf396b516801d2418a1cc92e0192f73b80840c72106105014f434628e5a26f4afb03a7a30180739b982aa8991536cc6e4400207c855d61e0761ca2468b4c5049c1c4cbd355f3a0757f5962fa5daaa4cdae364d8e592ab39185cf9b9902180496730bd0af34186d7efa175a60edc41c2144a8e16b5382bb8386cea30e74eab2a38e6b66af8e18a004cd4002abaaca4e8635b350c702075000e4e8459055a6844f4e1957e6f6ffe6cca5ac341d1200f36bd25bde289c991460f385c4a11872e8389115c7fd2b87dd942a9c19034531228b0558232e3d2848cd305342f858e7e82583eaf1a8a84b8893ad8896da20310a66165f893a788a01d43b28c50404c1a97bd66d11697010e152f145ae3014b0e84347e489df109797f7c65ad7082c09047981a423e4bbce007721a20b96201c9a4413d106369042e0d6227e6b8d0d5893239483da526c2f8305d119547088a2913e47ce1b184ca87350d0b3e08a1c05b9201a389ab0a221451d1b8b874cac2ca08119a58246090187e22cc2f469ba50ae4b4882005c7c6a801ada1a6214d0734ac9632c64b0426b4053a88ca74e1c31b3f4ffc4890d326891c078a3641f1f48b234555818856004a171e5f24d1587167c3db053c56327172f00ac262888a110afe5c3040cd20b219a0dc0560ea1e49e26119667db021b6c50671050b8e0059673cb3370ebd105426a8c3bab91e68cc69600b98251852085c005ab500a53004ce2c70878913a32c2a770a68032d0a524a871d1f82e428417288c3e38f940947fc11301d0e5018a54214863f4356092c542f444e3275491031088a56af500f5a3e01249271c60b9a861142071f0eb422d2204d908f9b2190ba8ea0a1e9aa41a49f7378881cc2f12aeb8ee76889561d01a84ad848a1e5c796a10a8278748c3c88e8b3c40ca9b412714469c568604b29b62e50bc56490010ee9cb86181de0ad28782d6a8348c25e340d0874b136e54320b387ad8549ee168503790c8d02529c03827d63224c9d0e86e6eca961916457e24204193165bc33664826c4cf02571c573bc4201e6f4bd411182317b647721809f1902c1498a576989c2213152752a18314bbac4428ab1d5a90b12243847d8004a3c7015015ba3c257e7d29a356b6d9e38a068531a43a49c0cf2ea2377c726861b07fada0a33205e7415b8e494b0d2c3400e1939c8b4c2c2d24681483f0f5e605766672bce90b4e252b707eb92864f886d254621cc45a314717b08688072817a0046e80a2438390b38bcce4b0b24f8356904f7a02e6b4d5bcda6cd940c5daa6ca8d0a1d499af4f6cd8e8048931640a7ce4c20f047284e2d0e4899955a60a026a39ea0f95940342c46824c643189f146c4a5051b5e18e904d0ccc9428ea980e65e0a21067cf0556593ef9e8c236d0e7080b36697ef0f859b0255178dcac02c24b5d7d35c9f1a603071faf34058d4c41a17e18008ca413715a616862680e02882680a0d2490d9c07f0fc6995d5e8d1045324acf0648772b223ce00abdcc143023986d8793b141b3457de423c11ebcaf0b9faaa4e53483d89a08cee8823565a3092f850050a658f60e009971e897c833a446ab4f6666b81fa51238d0084347542d3c50619a96c4a19883ebf1a650fe878b8a3a547d5a575822a476eecd72b06d3ae781800c79ce7528d5112b6acf93823e08e498677abcd8453678a3ee087283049565fb6d8b2fb941f403aa244d121420d0873f281a9aa4c08bd1c30664c100e906ecce890e1928d1b642e5a6d62f405ac02287c8664d98263f7628b5c4f8286089c491f3ab37c5304983b40499f358273cd883d9074907911697b37894194c0190dad1fa729145db84e34ec274f657e8333647c52497112c397ca2d38aa4cc2c6c883b0801e12c23cd000a2c3ab4dbc511c24ff3e61666d71c11567939624dc001eeaa73f6fa7c8b80efd7824b953c4990851004fa23a133c351134086aa40a4e2aa182e22a19a526a90ed45d102b039bb2e3510c25ec910e2e05deacfa0952f50020c46e8618283f4c758aa4c46db09d000bb13a854017353314ed89838177c18f231174057e52c5186553984dace165a974497064e9f16020ca8e08753ed890e300024eac44a92ef0a817abd2f051e12460585b036442e28d06535f8020501e96566495b101e54b1baa0b3a1080b23665489ac98101b8b7109d50a4acd079631031939d3054b2340721488a0f32e823cc2b1cac3c6861d8344a0c0e09ce6393a84eaf80a448eb10654c170f503f0a48f148c6844213c860d3753c92d49427c7037b1c10731c1306014e2b0015c836c0015eaf36adf139f2a468c9c3598d0b9de08654d162d424c796617a95a1411a3b3b5985ceb031c5d666858b1c02b618d4088b9bf4c843023a6c24d905556c7c0bccbed482a8492300cdc4892daf955219c0141b60f2595b2326217d13d0348c6c15816be578dd9440615280820051c652dfbc268c479b3f994679e202c900165c95178b4b67583411bf7072418129347ecbd7962bb5060eb0d9e044e310162911786142e22b746424c3b6ab33f6c3ac863b93b37a59f2fa94d596838f508e181b94334d6c701139c3333609c8a1920a2b5b4ca862d6ef048305115a0a486a2e06999811e209524392144426346950da20aa8066c897325117b076789a53b258012592043bae36252af5e312c34d014e59e2315a2bae140235a1cf86b0323b2a224061e44549d81d4b0edc25baf084cb95142ac654d8c4c20982d3050390f54048d98d0a8ed46cabb41aa462a3e16f900433d011d605499c3e75248068636505062e0d6c90af213d55bcb8079ea0a031b3eace56991cfa96090e712a2e79548ee000e54caa0c82660451051983e9870d2d90308809a5c016180088484068831c127640b4b23ce919a6c960680e3eb8a0aa0d90204a1dc65258a09bc2e648c0845250e890b905e84a459499a02e35e252841c8fc09050416aedf8042aac041f509c8c07fcf4ac14507460f5b33b1b4bd78cd1246306961067665d82240102939e0831876d0500698e8061b51a616a8b98c03363810915bcc2b3054ed0839d212a4eb6409a1108f04fb0aa83ab0cfe0315aefa1803054b02742888db44c0965a1c1be5210a8215758500f94e1db47c2d4ca4f2f3064a048356d18b3a85eab290a19585515d3c59c244c94f1a92096b4ea56d11b2476088808827375b8ec247a4fc8cf185495547eb6b76e313044704767cb6ccf1e29207471d31166d8704f8c32585af0ac115c38401e84aab49900c103a2001a5e0c8efc1882f8c7c852ebcf850be113385d5160d2e581842b2f6d3c3827708820519ac58e132e48a851aa982d96a8b8452d11692ec772c24a3d06a114096035678b9f0f140a4a1939a46761d080511b1094c02439c2a1072a16d14a5b8ae301580e2a0c70a0b250310fa4d3a7501ce8b4ead9a68ca82a6b36a18d820408727757ed829c68a7b6c23a6d634b940a9cbb80ad50e11874a7d0978524815b3d0d888b8f2270828092492288048c2a9271cc8da8861f20568e640993062995eb4d561104291e3a689c0da44434d909c4593ac64dd81c023d09103173a770b311415d0c83848808423c181afdcb0d3ca840342c8b0304cc0c3139b1d6b95b402b5c2d325a789b4c2304400274482260b8d3a9c84e04f031dda446963caaf01938186a72e532811a7744119b3a7c45a083830ee3b18cca091aab5c440f0ed44da3085c8c3af51e2e094140f73162098c01148c6252cc3ad0713ea68ca00a22ede69e3422852c7a4cc1d1388c396062909004b05123b04465403cd6935f92e482874a30f31450427a4503440113727431e4b6afaa8494d950c2862f648cd21525b5932d8484f04fa14431467b3424820e1b37be0f7a706110ffd65688249335678f0d2c19bc3a0c6dd0243c2c04065a52beee4e22a60820566304b8091063cc6d864e8e373804b80b58b86209b940106393d6d52af0a46d120c5aac72b204b8c501a4821a4e4ca226212891444ce41ed0dfa922942457e2f1d4c4af61090aa0888cd08b5290f660d62f62862e0950e10682c1e788469880de9820643677e5ab8e43890e3a8f1f44d247f073c0a5561ebc7e30b923f79ec7c627265431a142d343b72600218310a34a552993b17c688413aba5245031b24926863a023286b83115595cacea0c15539a1a7842540ee060a8651b0b812d044d15087a5c2f9c80f06e09d479502ad58f2284830cd0f3faf300b8a20359abec45f7ead32d42081a84b041cd6dc2fc408f822437025558d09420601c1a0c7c422417719383049c3a3d2982c8ee0ac56782ab8ac60c46024eacd900d493a391d6005324d99a0fed110e26950a0127a4675cdc082008055a8249dc91281b18d40dea3550f99cc9e4a9b50c9270908508ac3f7c00159e6c8c5ebcddd8e9f192a0eab475d9a7a7038e5862b8720b433396ca84ae18016049a34f939657606462cd4d96b250a021e2885312ea8531ce33d5e487af0e96e4e06216aa5bac4c1c9a143be6c351225c8ca96dc228726b5ac3aa95c6d4a5326a238e663eb98d858a01140d5ab0e1f12d1f84abd3240e02343052e42ed71350097219edc08b61e60d2646bd0a127e89975a15028565fbe38446225638b0725504d7a6952823e79dd81b185458849a1c29b950770bc26f9b83c23ba4aadf844f851690ccc94b3035cfc3454586088ac250caa373c35008a38b8861e431e10129b326462644b9b42984a70ae4d1d4c1841f51d46882e88a03d95fc9784049c386074084243c68124389614e11b1a9409f58602a220298cdc201519ce2fccd12155b6c3cb0f2071d8185461e3fc370a108e44426404500115170b6e179c6f40e091045d82ec3285c1d102e64e2a3b052e818993938009187004f1a080f5cac04955a137770798d844a93f3bc8ec516327953fc2041597181c6610ac4ec441d4e8c485306f3a1c819b50e980a14e19dc50838ca5485291aeac55899225a639431b1399af03a91d41c1648a27455b3e450a82651789930bde652613881783b8c4b151c2b9561d397218182fc0496001e71e0218d5e4819bafb6416038cfd002870b260a04931c15e15bfd12059c207d089286731f894e293c6419319b709ea1811f9a5c25e17572c1b7d8a0a27362a57638f741390156a247e50ae75e7665c906bac42939e70aeb057a20860445b88f54a2066a0c58e15c8397a6479846b171ce7500073b39515cf0df0d4d71555870aea14f516e4d10e71752382591c070fefb93642f15e11be6528d4839bf9047810e5438cf32b96c72c139785d11c33986333a4f9c678109969cc3a1cf3906484938d7ca52c47987244578970fceb59a70eec105cfb0c539e79c73ce39e73c4bcd85287f886bf640b8b14a469a848030186a504a810a062451850e60bdf0ca244088030a3715a5701cfa34640b0325472c008364a9d8624017a944604a99c9fe8126a4c285410d347024a584a513820d6c6a5b28d1d81064c6999337702ebc1a13cbbed7e8ff0ebd09c086050ba282803a74c81346010f17c638905263a51104aae8943133474825a161d1273eaa6ba20959668aaf411e3f3f7eb025b941043952063149fa58a0ae62c285270b0b0701c0a6804000a78092b23a4f1a4e08998076c4738057263672cc5ca981c9478114126c3821d58e88d2aa34d920a70d97dbdf6889cb0273886749cea7109932783119c2e1551d0c689c0c6e8cbc669225df95368cf634aa1000181374803a848230b7654712133a10a3fe00755467e68c0440193cd13021c30e203d315c0cc242850d511d5f3fed247adbb0ae0985b4ba3b8da05b2c8808cb4c8428c3d4eb1224d29e0f4532a45922733b45dc9284c48c5205511058f200064396275230bc7e5f17b4b2d29081d352a0c2dca201c08e31e6045008541a3374bae464355880159d283ce4de82131636b903261b4deaeecad0b71e1652c0889111a2a546c71563cd998f468217c9af2f3388baca460574815b0480161a0943314cd1910e261e183163b38094481c1187b3a49998ac06cab0110ab52509831761a4268310270c542a906975c60f1c017cc234b8e445cf170e77d61a8b1f02110c2135e88c0040c506594228474e282c38a26d0839140cb2e00b43af8d9a07398d064101e3e0828e0e06611bfee0b82437e60c4f04aabea86cea80ec7e147481b900440179dfa1933405800d122ed87961d9545161b40882ad2a68854c15365c586001112ad2c19218871c228cb62cfa4951b1851d1b7ec171d5f5a3338589b94a113ac2e0f7a778a99517ae42949ce4d160640162898d140d070b065b5a345a83e2f7c5491520d5253690008530e2c04cc6162ea3073f139cbad1801a9d351e8dab8711af4167e0d03153580823224b724b8e39207c093c50d43684c350013a43d6f0bade30b015019405721cc828a06eea01c7ebe1400caf12112c5064138554653de484ea33074b251f8e2b5b8e534ad889a1a1c35995c521cd16bdca4f1a02a63a7109e3aa5465a30c570628139c962c1d100609212106a8606b393c889200802c90b638d1a48783d6913a4f4a2b158e4e0970eab3022538c1fa932e6b972937be0d981f48eec049800e8b08cc907848b1e3ceeb2c004d06c4b5f9148458c86809d16288ad78a30d049488af4a781e4cba787000e4266d2491716bd2c254328ea70eb78b192cd248aaa226f4b176401708105a0fd0f4254f0415a0c893fd08a3b96c6020c48885a7b0bb3e49920250b02324490d073d4b0ec16d033f366551a5e851ab2a36b206b85df08899744a3184024c4b7adc3dc2b0e2c776e7195e62d5c3ce1612126480c2410217992aa092e0105b85bc52a7be88ca1a11c19249e849470198c763dbb25417dca0f154e5d5ab2fe7cec89892066fa636ec6804620e9157008068e043154e303e017f77b0522160e1151364a038ac528432c5e3428924a73a08f06ae8e68a71597902a2d2808099149cda5765681e4410748749eccd6fc6994aa3327d7982c6a0819eb443f2015c63aa303047890971d28b332218ae479286097431003532e02c0b832426827804347c9d0689ca63867648c29aa72b95f81537ae0f797cccd5d8e1620d84983b5b2eecc879f940a1a4c109386c5e8d0ca116b64e7d7c4774a02124b9c96221c1c28720232a0d6c8929f52ad4a21d170ca93182804e20d54286426d887862006703110f838c083bbd369f07350ba5b0a6944ac4c510a02c0284b9b748946e1198d9a2ca90bc9a80859d9345194c4f424f58a840e0487e2541daa335af0721209080b893ea0b6d0800a72e4d80b3a1d546ad922a4e032b1b519d26203a98334097163f12d8202c24c1e1238c044c209051d1810f1ac7c227013ebd408cbb84210a31b4da92cd89292e1efea4b5265a883459eb6a50425e43979100a00dc4893d967cc01d1c2020041214ad521646a491434332a3204b814452cccc09456780dd89379f13940d18e8b06a36f9cc15b7472a8f3d71619938b82559d32464515258c88f9c14adbb23ebed7cb386480ca80788e078c3024908491720008087982332cc3460c9e410255328451bc64c51258070800a151b157c91dae069c18f936b6444aa425e39561e592e64fdb02e04033d7084c3e212a93fa82a98340096320daaec3460e812051c60a84cadc80a2276e577e7a84439e1015c9e0c183e9400c874e16ac0c959c24284a21a0f3c5a88fa4141010d33400d4120eb1004ae4ea994341468a4bfdfa9142964f011c1c64d91064e9cb5f5e1b24153c0aa839b14193684b1704b92fbe1b546c22a3b9c7688598a07b9b5fd786a3e354c826ca55845a690171e8eb4628051b4f568a823838a0928b852920aad8b03da02af09586f2c3d91e0378444bda5c7d796d707e3c80c14731a20242ad299305e8f1e98b08503c62401192a2cd24859e4c447d1b29681c6b3258e5a1c35ae5309283ba3f688f15028cd9130fe435c0e2224663473073cd1b214a30a194a7128b553ecc09828539bd30589c35a410b93d60b383604a1573e7c7998a0094915022411d0150776e72269a2a825acc048ec55932f1656683024946147531759d692417b7c006a2401c49e233dd0f0e8d096a5449014af1d9343a0685882b63beb9497a45a1728736f97e088e8d2c0292718dc2cc1106681a81727ba2c8d62c0769ce3c0e54c17272f4c408af305c3274064a22cc932e2c90fb290a4118a32194de51901c9110610f029ad168adc28d910e380393300411b3eb13a2052852494ccc43c74bc15bc11cbcaaaa4d6098216844eaebc7048d0236a810b59ae84892b0467c8b702336a8d8d0fba0d2c9283eab80adb732704020a103716d0fa992176d0f24229cb1a2922eea4aa030276c1e74004014b04d093e5cd0126106000872a0d571e887285a65dd3ca8b172a0f4fdc207f2b9460099a0841ec7044512401e6b441e38262868239a7883046845052a10e191c93bc4451b123bb817163d49ab96d3e746cf331e0653b200a2c0b96427b4e157131a35c11bcef910174f400697100a93836227cbcd256d598f026628da40a3a42d9c95fdcf88e1a182011274b940767abec422d3221da8a0282d08f307ae8083a58450954e0e227c301288454880046c89029060a4460a5cc948f02106009403a5cf1c150b6650b888fba2d5f03ab105065cad591c39691060a78b93270f9ec3cc81995c0842f1c62d8f8a31c1e72bc0d4062cc1c9b2961c7089a78124a691170578a0428445a32c8dc00519133755d43ac70ada95ae321cb24224d8e948bde3a78590b1023270b09218c823ec418c0c0002d1098ca326f86d8b51903444c1903c63cc100aa00348938387041525a0e2833b62610397032e2d6db54830b154b3f80201ab0c024cb8dafd103896a189104c54c1e0602192007c30eae0792ca4e60a201a44294e05e01c101f592e16b94aa804d7729930a0e569dc8028094f15392649144c43847420558ddb99028d4933222b23c80052309e1880462066c40d289cd9ab155036619e064648233c8edc7e8688806831e67084d7934c5c8c6c3d10518135efd177368e8410da1689a90681a222902a005013127b0227b5c6ce06165cb4fee0809261e5ad09314d535f9dd011286ab0ffc46d8a98204460a60f171c18497130d1d0f8f3fe5222981907714d802c7a3f0bde2f2d282eac8aa15065cb9f300db063c5c2d2479173fc6d081d26815045ac884f8e42585ca2a2a522694310a9a40e614c034f9b4786da1e046a04e9fc59616451eacb0b0b5c7934d206ad5032d02e8552823c8d0ca30ca1580ce893a38a4986455d04ca804c9a722a9a0ed0e0e3b810326b6407810e1cc169926567219e218a8e28ac32b1483025b06372f622e2cd571704ffad06bb1810a190f6894085a84c10c84b61f046487c6c439a435c8adcb913681166824a30fe2b38406efc2832649a61c493a671c5cad30cf6c72d1e19315331b7a97082f11420aad58e40015adb62d6716793900830967fcd2000b85571709b22a801ae4a0544131c68b4048523dd0a16bad2c9352575434e11229299fc291e5c01a1ea63812545046851dc8b0d4d5856100b89e0e38c583e8c81d271d1e39c0810390507e4c89f5f9e427c410c51c054b99aca2bd0a926ce7b463e3039e12432526181e289a408d452722726ad298f0c4c111041b0a3158e302f0c1b101aec48145c408f1739569ac821b3b263571b581941eb8351b178670c90262bcb3e65890010bc5e603a80d1dca3078c5f861684081424b22928ff96705025147638c36b1a012655d9dc88a70a922e36382934a382ab873ba59faa0556a40069064ca9a3737403c25e0e91104709e7e26ecea060ac511a5f6a38ec6121a8f4a71d98fa6506921c6c4a5430c88e8c4298d8d972243e8bd16230e0e5e0cda5bb214c9e7870898126e44b9a1030691922e284075da3ae5a1c959e9c48e4d4e7a2416d0717ac02b45271f005cb951750045e666812b60b4f87890122397675097006e10da0009a2296e0b492cc453c3aa471d1286bcbc7670b0cb6025502b3f172858e7bea70473eaeb910755c95627973a7f5e2500f434288528095a14ac690140985377441e55a221440faa405dabe0d4123d39e2f060e84a994a613f567960d97c282b4ea0e5f6d849f46687a84eeb88a194d0178905c04072f4e14a212311ba62226315b0e9742050186462952bafd62148300b48a4215f8568a8b8ed84ac02a34501cf5c00726b8f5e652d50a2d05a9e0518169d7871ec03224a0290e86a5720e6187058e08e34a1d45c0a5101bc59d0a38601a0ac2d43070f2e606a95aaebcdc9a32799b860202b3b23b4618b9ebac7704d5a1817241cb21c795530c6cf1a44122cc01074b1c664a150804a254e38d6f070f891b20589981717e6c891c315248581e7063dc9e4279136c831881c74426df0b30100578c5ab191f24b404f2a3b044e555945e3ccab3207a2242f008bf5234b6ee8eaccfc5e6d3d4a9145c39d0789a264e172856bca00432449c013e4f7f61aa1e3401f4a012413b07006a30690cb001b98443caadddc440a13c00bc789a406ad35051c9056c153970aadaa4ba390187ca1645c6233c5090db844a602426131200517891e91229d9a2b7307ce062367f068dd79fd58a758305f4c3111cc24e66740241cbe257e320c878065484e12f5ca8840a2dd42537ff953898e87486d103cea62e84d830c8ca6c088c3c05727447264d25e002ac1f085d012651103d6f7000774801a189fd2b6c0889062f0220903195c4ca063800c9a2c6560bf846a40c08808c12a6b0d044c0f0c1e9430e9f4a0458a28aa90492c78354176d1827393fa232ad5f132a07672c48276a40b4c1bd8902396111fdc12a13074674ba60e82663a5e26dca10d40e347823d10904dd262e1e2f41308951242109292d8528306754da002809d2c75660594486c0b885aa1a283853833d86e187f12da2092550d0bc5c81aa4e88d15d68cd0193517afbcc478a880218859250916e06a45a3acd2e28118661871d06183eb0ee83cb3ff77d63c5dec784d7976bfccfef974d7df53d5dca1033d816feaa6e73fcd75fd3f76d1b8f539deeffd67d7b845d33ebb729cfebba15d0308a4eb7f67a48d40601169c4f1b6e7efec1977b93de13eabad3de6deb8f1a2ada9a6a98ac61d3dd56e9a690af7fe347555df76158dddd634e5176d5f306cbc671bc7bfc3bdedf05f53d9bb2a6abce90a77ef9ee9e9e7d8fcee2964bbec8f28f0ed753bdac2e6caa2ec197ff3c7b2f1a7646e6fff5f9ed1d88d4f996555f514b2fd7cd1f69a2babb6ebc9b2acabf6748d856c27fa5aeefbe3d9eb7fbb7771465b1aaf57d3584ed9139dd593755d54c8f6744506efe2ccb2bd3d9653d65459d6f778f6ae2a64bb3de34dd9d83dd9156e5d349edbb315b2ddf889c1f55455b3b5d74cd7159dbf477d8755765e856c9787c17f4cde49e318109834fab7155dcb117cd582c1db46d6bfb49785fd29c7aa899eee8c9aeb2c64fb8f8db4fb63e30ce38bb5b58f342ae3f5308aa2a70caf7037d5b385bb19e33563b7c36ceffefff66453183dd15e36463bdbf6783653f5abfe8c87b7bfedb3f7b3d79fa99cb2ea9f5b989dd738755b18efac9a72db7dcbfaf3c3b1290bd92ed3622f5e9645ddde9aaebb76758ed756a6df37ed5e6ee10ecfa8e9ce1f3ebb69f67a369de3565dd5d43c63d57721dbd1b3ecfd5e46bfc9c6ae7b9adeb7eed93bd9dbbaa6da5b3395d1f844515315b25d051b7bbbeb7ad4bbbf95d773f56917b2fd48d7b2e9ba78bb89fed4cbe839c7ecfc5357c876e2b1380ccabff642bbed2c00ef3ac37e86cd58555d164e6198becf53458bd785cf74f5ab4f7d2ab729dc0ad97ed734ec43b0787d6f5bf7c7a76f61f8fcf32aaca389442fb4d9beae783f7b9a73ca9a669fd1f89f5dc8f66fa48971d0f8e9fc4d17e9fad84f752d47504cc5bbc2f2f9bd8b9af329abdfa742b6b7de064c96f6752d4790157b65d6c7ae39afae7cb6ffa37e9ee9a09be6bea69767954d61d9654d143e55b4f6455776f63feea7db9ea96cce685fd71e7f3a148d7de1b665d1755dd71676cd160602dd752d47105e5f333e67d89f728b9e1d565b58bd8b33aabeed0aab3e3dd359f632cac6a690ed421b790cd6f4bcf6b4f4ed262cfb368dd3d8354fd5cb42b6d75e189b3d88be671aa7706baa3d757bef1e15b2bdbeeda0fbef610d07040281adba9623c8e37c5dd6c72e6aba2a1ac332ac7a3924fc6d8faa6b39826dfd9dbbf9ff7ca21e364fb89fb090ed41b4afa7f9fa595d579975e3d545d539f642b6ab2352bc736b9eed575b739de1f8eca990edc1b3af77714657e0fb65d9554f55864d5796dbb60bd95e47d772c17e86bd701aab6e5fdbb8b76c57ff2a64bb6cf4b4dc4ff6eb0dc6d7d857d9d7dbd75bda57fc6dd4f9361707d8aba27d956113763f6ac271cccac6619d11491b836d1743f17a345d65965d59d5f4303c77f4eb0dc6d789226b7a0602efe20cfc324fe417f1581c7ebda57d054ff5581ca245a411bd8b330a9f78e5d9b7ab3f5b37354d74954d21dbefe21c94330ee7dc5fd371ba9623689a78d1f4cf716a7eb63ddd7fa6b290ed41b6c79f2e58e76b565dcb116c4b14693a4894eb601002893a18b4917530e835a20769a21c4dcc20a2fc0211020d9a20487c285196f000d6810487131b4c0d26bc4864b033747961988b3d4c24d2f5890bb2ffb517d79f0bde76dfd861ab07bf5c06ad6e6795f89d4710beda7f62acc142051114ce093d190c21a148c7c15f07837d6e55cf63fced201be1947f3078dbfd1310badd176e7830dfc8a083d81e16413448570e0c56f55c5062b5670fdad1757750ce3814da5ed8a1b781d783c5604ddf3ebeed7e07fe33e0172602de2f7ae3829f98313924704145a88cf19e21ce7b8538ef11e2bc3788f39e20ce7b8138ef01e2bcb700e73d0538effde1bce787f35e1fce7b7c38efede1bc9700e73d3d9cf7f270dec3c379ef0ee73d3b9cf7ea70dea3c3796f4eef4d2f89041ec8559431dec003e763fc770814ff1d4ac37f87862f3c8ce018dcdfa136fe3b3481ff0c2de23f4308f09fa126fc6708e63f4365fc67088cff0c31e0bf4286f8afd01acef98d076c9c73b69fa310fce7e802ff396ac07f8d58f15fa354fcd70802fe6b5489ff1a2de2bf460bf05f2339141a4cf8e561c57f9490fc97c7d4035f872ceeeb3081fb3a3860b0d5558affba20715f6981ffbafef05f979b1f561bff6191f11f1690ffb03af01f1603feeb4dc07fbd49fcd7e3c37fbd34dc57e68cff7a5bf8afd784ff7a37fff584fcd7bbc17fbd31feeb993e1f050d1826fccad4dc5786c87d65823edf2a42dcb7ea0ef7ad5ac3e3f136bde1be4d66b86f9314eedb1484fb36d171dfa699fb36f1e0be4d70dcb729cdd7a00f1cf7f531e3be3e2bf7f541c17dc9567dbab8af0f16f7f129c57d7c2e711f9f44dcc7870ff7f171c339b7906541c204090f7c3e8e709f8f3afebb04e43e1f46eef311739f0f1ddce7c38dfb7ca4711f90ce7d4042701f102eee0382c57d771470df1d29eebba3c47d7783b8ef0e0ff7ddb5e1bebb2ddc774785fbee9a70df1d10eebbfbc17d7742eebbf3fcd7880bf7ddc171df1d1bf7dd8d71df5dca7d7728b8efae03f7ddfdb8ef8e01f7255b715f925405085b122238b0006102859f96970f4718eec34185fb7024e13e1c48eec301731f8e97fb70a0e03e1c1b9a30f07d60f4a10cf77d80c27d1f6eeefb4073df8798ff2e69e0be0f6cdcf7c18cfb3e8871df872feefba0c57d1f18705f4901f795a4b8afccc47de523ee2b05715ff987fb4a35dc576ae1beb20af7954bb8af0462c18b418409172a44a0c0204b42a256fc978813ff2542c431246ae3bf4424f80f5129fe434488ff10b9e13f4454f80f511dff2172c17f883cf01fa2082848942c1703179c6399dcd72609f7b5f9c17d6d62ee6b03c77d1ffe705f9b34ee6ba3725f9b12dcd7e602f7b5c1e23e36a238e7102a700b18b2b85a9e1b24bc4c9cf304e09c57c6393fe586b5e001560fcb41af8103099c7ff87de89c771abc9b31813184086f82668aed8b17ceb93039e34aceee7aa846e68dc352c5598a288d9f68fc44f514253a1612a062c30fe89c6ba1c2a7d8e06c009842c0ae8144181e3e307b60862c8ae24520490f2f8f5d6b69511e7d1cacfb46440d44d97dd938c6396f2355a21dd8c3e24f4724fa22b1aedf982612c78c7243a2ff77433b6d8d831e75fdc695c608954e1893f64f94a0fac7f518959f281a11e7fcc1212e671c0689bec32abb061e7db1bdc1de586fa837d21be88df346bff1eb7f76a26b6fd3a4afeb31f91b87f3978d358cc3fb138948b25fd365c6211ddf433279182c225f383aa663ba4d36fedbfe70bee86da40ca1ed85f587e76afa453249661fefda1f6b24912d4934cef0b797935f46f2cf9967f2a7abdd978dc6135d337ae1dbaf6935b67bac481bbf5ca48df50bbbfe70f1abfd7848db48d648dbfffacd382cca63df36fef99b11fd301ecac818447b28f7d384f17f7beb3f3734d26af7d058434643cef2f01769b76fa4d7c4f41e061cbcbfc6608b900860602c5ab0284dd8c9c312f7fcd3c4daea19f7fcd3cab22c230029ede461f0cbc93f586ce04268f080c12a422c5acc9f3888c50a14a5f113834199486355a2c4c5c186db964b162ccab8b661b36cc1a0ab5312ce39182ebd0c63510a815f4efebc08ff712283e30dad6c8c6dacac5c51dac943ce3bfe3685e2298ebe4882731e68cb8811a559b2f850dedf9e67da04e70c5a30081b31a264d1a2948d9f2ff0c317c4592065418c05680bce16a8f86922d6b49de2c743a22636dee6f672433a6f4c9122ce4489a3afeb8c4831b1381bb5c5c452942e45c5c44ebad3462a2686d2c968a90dd4c697bf8d14134b79b4ecaaa6e8d982472f55e85811d7636262293d1bd15ad0b311cd6e61fc695fa6e1a4579391f59b5b0be34ffb45bf66e7d5e8d988f68bde3817fbdbed13614fafc9df58838d5e9b8be9b4fbabddf49afdff0ba2ff66f49add2b139134dc2ffab56f13fd8b974844be903f913866b740d186f297bfb1869858fd8f48bb8509b013b58944e45ad238568c6fd4df46d6ff887473fb74c3dbaf198732ec7be8ebfb58acc964a1b1c6d1d76f9f6e68d3f49bfdff0b39e370edcb74fccd8a434f44d2b5b1c65dd347b37f3774b35f99489f7d22ece937d993118936b2be8d35e46fac3143260ee1bed98b7906913846248ec9c4215c8b3b1ee3b1f696470ad344b2bbf66c49992693d192324dd6a2c589ae38d11ab76da4cbdab3235b240ff34c57248f1395d1e66abaeefe6b278af4212676d28989c5e09c63f19fa4519234715e8ced8c4822baadcd407b2b5bab112378634c6d187fbae09cff752ddce24ff786400333b85d036fcf36e73fdcbf87759dec7f3dfffaa40b8a05e36fc31e1ec7ece1d1cb1989c7e2f068d7d12bec2fd3c6a0cd9b00921baee67f7ddb305ac8b4d144c5c4c48a18011284014d9cfbdbe65eec1a488410c148cb466fa4c738ef15d072a412ce39cd7f8e4ef0e027d26b32913e33fe3bba7ef16fffebb23a9af8c99244e38c1a652fd1277d1abdd6760f8bc334b319656b6fb06d465bdb1b7cd36a98cd500bde18531313f3b61cbf6e2f4dc3fff672fe48d7c734ba1672fe8d8de88d686ec97b58835eab654f267b32db7e85773d249b69ba66933dd9af9137f2c53d1c33fe39facdb6e935b5167234f1a6e9b6ffdbea9ff4c492e88d63753471368ed935bdf68948992e969eec889ca3eda12f1a69248cb4ffdb3c94bdf03622cb5ffb1746a4971bdab68a21b02c6dff614f447aa1dd17def5102e7d69844b13259246b49b36fafafbfa5555555555354dd3344dd3344d51144551144551f43ccff33ccff33c7befbdf7de7b374ff3344ff3344ff3344ff3344ff3745dd7755dd775ddb66ddbb66ddbb665599665599665d9755dd7755dd77555555555555555d5344dd3344dd33445511445511445d1f33ccff33ccff3ecbdf7de7b374dd3344dd334cdeebaaeebbaaeebba6ddbb66ddbb66dcbb22ccbb22ccbb2ebbaaeebbaaeebaaaaaaaaaaaaaaaa699aa6699aa6698aa2288aa2288aa2e7799ee7799ee7d97befbdf7decdeeb6ecaaa6e8d9d588feaee962118de3f023d73f05da370ee58c2fd17fb75fb315ff8dc67f7d1670ce6343fc75d1f675257d26c7ae81493868dbfe48f4b79f937e8eb64bb01547db860c7948db9891ae328f37079a5bd0eccd81963686d6f6ba05dfb61a6f636b30d0dcdcbc2dc71f0804f2de8d3d89f61c320104024b946f1b5babbab9dd25edeae890b75dff38d2c6e29c8fa1502e078e1b70366abcb9b5d1605b534b9311e30cc68bd7ac8c6cecd52bae2dadacdf2bde4cdfc7641dd7741c76b405e0bc48d72f8c9f18a4efe011196ce7bb0691e88b6e34fd46c6a237c40fe7d931b488a7e8a7e76876d344b79b26ba058f472f26e676553d6b5b4cccd748dfa2be6db1a2edeb56d0f5cf91241b9ac9c61a44e210ae3f9b1dacffb13d7b0d300f02c0e382732e26163cda6559d3731e309ee701c7e388f3607158fef018c0f9d1ae8141f9db0de7f40c8b87f72f0aef61edc38e101e60a1e1f55cf44af02071dea2433c4163eac4d93550f6bfe6597442d5749c821ef21dc87a461a6f18397f3986bddbb2ab9aa267377b167a127a3d1e2b9eaa39258844a4f1378773cee3e2e45ce23f397138e7c7e4fd93b364881c3bceb989520c0cacc44f4e0d3969a5b18824d271597ee3d048d7b62f1669bb2f94a3eb1a697f234d34311b8761295094355daef9b5f2a6e54a94ff1e1a8773797b9a38dbffa6913f4ae330f9e7927fcec48b6e9ac81d61a6699ac81d25ca3810427880c589c595f1f701d3a5d1d7fef862c64b640d100f2bd6dc28113a419b0885a062820899180de39106ee10a1704283a60553a80c81f4966983a25ad210316966c470a103d39062251969b8005843584d2b9a70249721581b5ab95a54b91182e88aa01d26a2a40921a0ae819b0f2c220889adccf1f1caa242480ab63533955213045945c1461d1b55a0200a445003e8cf89360895074ee612bd511004c719b2175d4c2408f2a5049197bb064120a4e624bc61d5a601b9636609098a005e005182c5a9e7840523206c8940a962592601f1e2f47e5085a3c7dd26250b3480c12072f7865d838420fe3b20509ec4b56ce8bb1710541409838b72f70353c1fc64cd3149290d14a1ee4e2d6986ca17155604b148d614d252a001d3932b306911b9d12349071ac80ced908067c728887a8cd143ceae8b9d5c1dbb3302411f7c7e56d5b942739176f2b2a34e9098963fa186b8a91300dee2a2e71c5117c47a0b6385e4585722111d94145c72d09d6a0085982842b8e8f6f4b1e4e3cee3a17322b74994a0b514746f6e1d6e80691185ae241bc226cdd523e427ac5698b6089542c649e46aadee011f6411335f8295a21c32c6184796d80e9080e49a518988bd67c5fdc08437a79f57f1ad0686914f8b08f072231921aa71df75dd63c81f952410b4754b18b5610038334bec473732a949b62db0c35c9a0322d0adc82616a06741fd66c45e31998a74d01db27b6b01d8418212ea436aea2cc6414eaea07252c37b1c842993c0511de6aadef2a594db0f55aefc5cc81000a51f7fced4813b48997e489973a755151c733f6e5849d1c7b66cfc088146441f5ee9771c65d35bd22b101ced9818c1f527cddb314909ca8c4b93b223db31c39f3c4504ed20426be232c0a1e20543b41b16f41dfc404e032457e85783d889392e74349871d2820f4228f0968c65b874cac2ca0811e30fa38a341dd0b07a8ab1c187377e9ef899505c742c7279bb80c74a264ec5d9003583c866802a9e1f6c886db143105bf5425099a00e4b0c04886885ca9d02da408b883c8824fe0c5925b050e74ef50af5a0e5137309f870a015910669e69ad420d2cf393c736e7504a02a61c39cf320a2cf1233a4d27c7802c56b950410c1079c5169184be6810f22b60fb424191addcd4df131bcf4064508c6ecd1304d6989c221b152c3bb53172448708ea18b3a97d6ac593b6018a18fdc1d9b186f840cc82961a587811cc2301ebcc0aeccce84739f10db4a8c825005f5008cd01548425e9346700feab4e40c55e850eacc1728b9017e209023140727721e95940342c47024077647c82606664b66095865f9e4a34b3bfb812d89c2e366d51c808f579a8246a6cc703388468f26982281c517e521811c43ecfcaf93e173f5559e3e1218497ca80285fa6b911aadbdd95bbf8b0d3252d9943239931e5597d609ab7cc00038e63c976cc8493bd98c2dbb4ff90124fbc0545526845fe2062ed9b841e6c2554c068edd8b2d72677c8cc588b4bd9bc4248a19c08ae02d203abcdac41dc11fee9e95a046aae0a4133c205fc5efb09d000bb142e547f8712482aee04f9ca9383d714ce2dae2383000f716a21341b053254b731082a58270306c1a25068744704894315d3c40d5c1331d41ad005420db0007f4b07456e3422738223d0c6890c6ce4e96a11e37831a6171931ef570b1c0ec4b2d889a1e10c0141b60f2593c1c21798099d784f168a3000f1f2c2e9d61d154e491ba526be0001b1c0f5ee8c848869ddc41c892d7a7ac361d3bb004d9e14f305810a1993b502449416442a3a643021d7db8c470538053161d51c2caeca8881045870d1d201e0829bb51c1911ca124c10c748479c94127c791bab355268733871a9433a932089a910307264f7a86693218c2d1662c8505ba296c70d8e128eb83a302ab9fddd9987a2392204980c0a4276e8c6984a92d6202cf0ddace1015275be0863b7763815a1c1be5310a4e510b13a9fcbc8902a7a59585515d3c5d829309d92330445004ceb44101973c38ea88b1b0b1400c1306a02bae6c547930e20b235f211b3a5cb03084642dcb86881aa58e8564145a00d4c0536349db284a715d626ad09874ea029c179e6abc717a43008d8d882b7f84bc097983f1967507028f40c70e6e952440c291e0c46e6726e0e189cd8e196e76188608e0844c706bd1264a1b539e8ddb032863f69458fb6a6b2406826f271287b62f6dc3b65483940480a502b5711a83ee685cc992c1467a42108d38bb077e7f6a14699c00c2968aab80091698c16c7cd89e04d96a64113189440a226c1f5e3a9894ecd13203d48c391a0c9df969b930c3c88cb4196b98d6d650308c82c59db05607bcf3a85220166b645004a9d1f4455ea3a006494d8c9a51ad9d81050100ab52a961d54326b3af92968803b2cc918b863402d2e2b4143256c950404b06150364e41893f1852806a9187762288941a38018689b6cb4373bd082a0bd404b3ba3943c33e3cfea4e672cca9c3980c108861718c24c30d017ae5e087a21008617c117263ebda85e3eaf93defba6be6515b34f6672cc8a98c9302b7ba04c4d195dd958d904b2476462c88a642c596fecd0a13f96055292b1780c98a4888b097c70177f9a7017535cb8c0c15d7c7100a630b84d183f3158f78d2592b50fd65e1807ed2170267ebbd76b50a14105bb061aeb7fdffe98a2be6d1e01e59c1ff9efcc25bb062689494f3cda43b3386b7e6d360ec366e3b004fb9d498b7bb0c9cca12fb36e079ac01ef6e5fadbf7301e128f769fae441affd117ebbed10c1b2fcda477ec6b2f8ccd7471cee3cafacbfddb38fc957915571afd27d2349cf475ededd2ab85a8a9944952f31c65b8f0f6c714c9bb03cf307a360ee1b495c2db1f4b22714c4c6c810a359c011d06744ca0e9baadcbbaababbaa98bbaa7db5dd375dbb665dbb555dbb445dbb3edadd9ba6ccbb2eccaaa6ccaa2ecc976d664ddb55dd9755dd5355dd1f55cfb6aaeaedaaaacbaaaaa9aaaa87aaa5d3555376d53365d53354d53343dd39e9aa98bb6288baea88aa6288a9e68474dd43ddb933dd7533dd3133dcfb39fe6e9f6b6b37ded6a4f3bdacfdebbd95db33559733555333551f334bb699a5d7122ac852a0bd266f74037c69141e2d3faa3a2b6c1254686154175438d4d28c983970590e809c4a0c91922373e40e0489220838c456b272e283a9040870e6002c8045b2bcef4088014d6132204143bec3ea4a0c0672ad9d4020717631e4720dcc479451194a1d38a30ad768409a12082056a3395075c6cd569b526a3e97105c3ad64da2818e13e015a45621373f535d84d80e48654c0ecb5043e05a74a96072850f161f416e5040bae7686891db75d231b3ce42aa4818047f6ad8a1441262a7106fc34b5d51fc2c0733498d071a1edc4ab80a4c1273635d10238ae3b079851d026d722518bc7ee01c0bae6078b5024682cd409401c96549a5ef520a541d10a232e8649085ef151a31c152ae475c1852937df0924ea1780234a9a156280fc0c9d52024ad097529f1e7880c55babb5411b807858b1e64637a8c1e2b1c203d4745f10b48950082a2532e5e9c95580650f87135962348c471ab83363d09625719a57319a7038a141d382295488a09900120307be19050c6f993628aa1b7875276ecd82379fb840ca4a3323860b1d0f68f19c4861f5692224c9a1928c345c80de142c0919be70a180450a064d2b9a70e496325c1e3c901604529a485a1b5ab95a541d40c78d03af3159b2466975b82268878928693832905145fc02d5e5a1abae819b0f2c205c7a806d01521c9a5ccaa065658e8f5716155e6a92d853311a71baf3c0b666a6526a8213174c9ceae0800748273250b051c74605a8c90f4f894d4388587adb8aa006d09f132d515205251d02e6b432df03277389de56913ac0f4024b823aae19ce90bde8622281daa60c7fee76a8e1a4674b09222f770d7a90a1032311960ba34011f2cd4978c3aa953167550300d2d8ed19c580979925242802784b4939fe4a01bce204820b8b53cf098b45522404d02106a457a0d67c8940a96259244582c0e20d03492d4e2478717a3fa8c2d1630432c591512552a1c9e252b24003188c214a4e4411ee71536507cd8f5d8384207eb6068b528b8555de4d039427712d1b6302a204a525324ce979b800414591303828854cb97fdc6094d992f60353c1fc640dfd48871f5a0806bcb08af6f8c36aec61f73483a95a63a179d3f3abad67d1f8745954f6718a75e6f5a6dcaa30aaa6261bc3b2bb0ad9e097ab7fd1ec774ddb2996997786cd133d7b2ab35d86d1382ef3b2ddcb5e465d773ed5b4f526f248e69de1985d579585db3575e1d68f797bef33eae7983d3f1b9b3d02b0c4bc72975befcd763ed7f85cd9142bcc2bb3b2fcd595fd3d8dd353c502f39ede557b8bca6c9aaee9dcbfbc731c9b32bcb61ef6aef9e7d4cb1bcb2cacca290bcf6957d5d8ecf2c21e55d31656d1f974e5f98cc3e2f2ca6dfb63f8fc317aa29f8d5b21dbeddff6c0daf29a5ded6c1bcb1ffd2bcaaa70012f1ba72ddbb2addcce287bce6b152c2defbaca3d4661d63ce1f89b70c722e0457d6caa69dccaace94d35ee58595ef4ffefc6ecff7d4dcfffd17301ac015e188d3dfb65154edd198ddfd30d0bcbdb5dd6cf2c1aaf739cb22d1b0bd98e74cbdafa998c0bc0baf2ca6647d3d4bbe7bcaef1da4d21dbdb7ffb1ba9b6d6c012e065e1146ee7559e7b9aa26657b1acbc261a9bf21aa7b3ca9a6aea63639537955b3435bb799e5e766177c6a2f2feb66dd1d97463f56461d5c59af2ae7367511555d7f5bb707761b7ab48b0a4bcbff7563dd5739e65d76c652f64bb796305f0c29d8553f78c7b576338edb390ed6977fb4a032bca1bcb316bcaae79b6ee1af7f40bd91ea4e5f5bcc382f2b69f4dff7a9eb3774d38353b4b0f8347bb633d79bfdbd396f5ed7caae9aca23dc572f2a6ea39bbaa4f65f3fbbffeb4fd7a8321d365f777c36af2f6b6ff96457d2c9f660bc3a690ed41a38fcf4ec462f2aae6ccc2deff386ed9f9afea91aecd80c0235dcbb547c22882b5e465e1bfc66a1af795fdffa3339692575ed77ffad5fcbf6d67b6f542b6df345df77e622579dbb89be80ac7ee1a9f9e75bda9070bc92bc7735fd358365bf99b2a8aba81b08ebcf037571646639795cdeeba2eda07cbc8dbe3d4c7de956313ededead7d40f5691f734e7f38c63d85de5735dd5386947d7c7572fda6113f5ac0cbbf3baaa9f4fcfd59bca6bec65f944dbafc2710cb77abfdbbd2acfea19c32b1a7fb457f0ce5fede6ef70bcaa28ec51363d0df558bd5e8de3d934655595e5d94c7bdb29785dafca7197cfd884e7335e7f5ff5b2b2da7ad5f4b16aba6cbcba26da9be04dfdeae3d874e37faef18cc6c6a45cf625afa8aaf7ec5eee267ac26a47d1344525783d3bcbe937e77f7e3766e135d5dbb668dca2a9db76b98ddd98eda17ae7b48d5733ed6cecd5b39b6ddd3bf5a6f02ab36b575d6f76b69ba690edbd9b7a5d379d65f36ce5d3f4a739a342b6afc65ea9774d53f49cd3d5b3b22cbb6a6a47930181f2b7a3e19425f648bdec573f8bf67435cdaeaeb22b64fdedcd7c5bdf47bb37ea85d1d685db5655fd3f5177fe4938789ef237d600026551af2cb329ea5b596d6156955d57c8f6085eefcef27cbaea77db533dcfd30df5b2333aafadca9ee88cb2a7290bd94f847dbb962308a407ea6d3d9bc62acb7ed45cdbbece69fae99d61d64ccdf8747bef41f0ca691ba7a96fd7ee6558eda7a7f7fc6c9a9abd3dcd336ecd15fd2a0302d11eec2afaa7d7e9953f3c7f7356d919fd299ca22ea737fea679fe18eeebfff30ccf9bde955dffaaaaa61aa3b1dcdbfff596f605046a7ae5734e5db4fd6b1aabee87cf4c6fef710ab3fe8ccf133de1b3c5f4aaabfb5dd9ab1feef377bffbc06bae6a5f51d53461b355ddd5ec5d7a5d5365d93ec3ff6ce5af9e5f7a965e556ee5569ed5f57ff46c61bb2f1bcbd01eec6707d473e03dd735fd70675d148e7f3cbb291078f4c5b6d21ba35d6d4d2fc76b8ba6de85814020104a8fd2dbd1b59f73bcfe3376bfdac26b5f655f675f6f695f40e04a070406fb4a77ba1d4f6fd2eb63d644599675e37ea2a86f7b925ed66c4f78f6fd777665d38ea27468955e036febceee29fb9ea6b26fdbee23bd28aca6e88f59349d512fcf2aa4b79b68bbb2ae37bf1bcb265b0777aee93d7abf79c25f3e3dfa61578dffcac0ebdb133de1396d51996de5a05a77a6e9397a63d8c3a7baaa279aba6e3aa3307a8dde786d673776d3d34ccf335d4f253d466f1acbec09afe73a9b2b0bbb7e7a8b5e559ebd79b2a6fb59975d5755c8f6b5efe9297adb546657f6344dd6bbb0da4f057a895e7fb6f23ccfa6e9e1efce2e2b647bdbbfde60d875690fd19bc6eda99eae9ca2a6f9cfd30dde5f8eedf78771e83d61d7cf27acce6c87cf565e856c3fbba1b7cb306aaae9da3dfcd1f3444f0a7a85defe5d2ffb76f66eecaea64ce85d6198654df7443dbb9ea63755017a83de96853faab2b0fbe1aec6b00a0402814060efacaf919eed07f404bd2c2babb21cf7738563ffbd19e84dbf7ac65efdeeea7a0fcbb090edbfaefbc6b50b6fcf960a6f7f4c93f749d603f4ae2c8cb61f75e51595d31eb3eed71b8c2fe03f26df80c020db62e92df0c65d6e5db8ffd4ec1e46db5581775e7d375134663d1caba86bfe1a69d3c438d89e445f76d6e9fd79bdd97676754f148dbb1c7f64b1bd916ac6176acfcfeb7d7b76d7a7fd84db35edaa90ed5f328bfc2a0e853690ee0b66915f66dae74dd7d48c59b475e5343dcdb93efbd0d76f668fcfdbe19565e36fa6e7c9a22bca0ad96e9f7d357b7bde15fee74f3f9bb22e6ac27e5dcb111cf612783bfbdb9e7635464fd654e7146df5bce69cf6189ebd399bb3caf69fe73dbb3ab7309aaa9d65bff965263d3cefe9677746e7debbfacf794e7b77deb585e355555358fdae0ac32a8ada7953d4fbf8ab69ef6ccaa26e2b647b9d5736e779f528abf63986fb69d27955d9bb5d6dddb9b76d6b7a384de7bcf2bac6df644df4cf6b4f3f2ba627e7557f9caeebbaa2abf9633fc36a7a715e353e4f389d5db6fb59ee2e1cb93dfb8cc2abe9db183d1178d17866531865d5399d537535d137ef8fd5f5c3e7a976198edb943dddbc282cb3a7999a6777d58fa6ed79c0ebd5d48ddb55fee7dcaa5eee357a6dded5446514354db7a3732c9b1f65f3aeaaeaca6e0bafabecaa6eba0ad9bee6e8ad79fbe9d19eb66aef5ff5ae89aa793d7c76f77459b6fbefd5cfa6695e555e61796ddd3ebb2b3cb306bcbdbbb377cdd365e37fa6a667551d3d34ef2c9bf347e3b38ddbf3b3739ca267deb335e5753effc9c630bca22710989a79bf9fd114657bca76f9779f96794ff6cf2deabf875997edbf75d323f3c62c6aaaeb0cc7b39fe3d49ccbd8d2bed4047a63de19565d9fa2728ab27ded272ae65dcf164561f374653986cd763ec3bc2e6c7e8fce6caab63f5dd7f444c1bc301aabb269c2b0f94d53f55f5e5956ff3fe5355e7bda51d6f5f2a2a96cfeb665fd0ca3ec1c9b4d7a5d5eb555571885e3d564bbec3f7b82e97179fbfce1d87567d477538dbfb74f2ebd2daf0bcb699c9adefd73bcaaa85ac0ebd5d8bb7e9ed713fd29daa66e2fa0a7e585cfd9b769dab673eb7ffc3d01af8c76f7cbf277ddde57f3a3595ef46ce79ea2bdfb768ebd37077867b8f7b835e395fd6e6cba698af6b0bcaa9cc6de8c638fcae78c9e72efcaebb6e6b9aeeb09fbef4ff88c856c978934f0c557d9171a1078f44520d0f64060fdefe1693ae909f07aff7d1c9b67aa9e306baa67003d2bef39bb332ba767cacaaaaba6b090edeb6dffdba719e9557959bffaef53d377d5cfbdcf684ae535cf793ddb796d61156e3f9c9e535e8f9aa9fc6357553ffbdbb44d51b50fd093f2aaabe9cd189ee71346e734f542b6d7778b26ebb7934c2f80f7a7301b9beeec5d1445db15ed4579d1b68dd37945dd59765b554e7b50ccf5ec409bee3d79bfdc5515fd302bc36aaa9abfe7e485fddaae696fbd0ac773dbcf5e93775e55dfa270ebaae88ffd3fc7f498bc3d6e57f44cff6f5bd8779fa6617a4b5ed4ece69fcd0eafe6f71ef54060bb962348d753f2b62a0ca76adacee939bb319cba5e7a49ded49c4d9fa2b1d9ffe963dfa6597a48def8a771fcdd544e5d19f5a9dc3bf2aa6a87bf09b3dd847f6763b667e43dd52fc7a67755758e6339fe2801bd222fea3f7aa2de8cd735fde60927659a2cbdc37bf5b6731a9b5d6d6197fdaecb9afe4dfdc373f5b6733761d865d7d4fb8e7ad72ca83ec06bf5b2aac9f6f35c4dd985d1df5921db7bb75ddb4d2bf872051eab17563f3c9bad1b9fe7f94fef297861effa13fea9ebc25ffe72c66152363b7d1bd1d4f3e88ba8dabb0edeaad7cbe91acf676acea91aa3a88c4ef0b66bfc4db96555afcae80a1791368cb459b5afe6b99623a8c653f59a6aaca232ebe5ff59788d5d9e046f37d7b69fb1777f3ac366ff42b607efb57fbda57ddd40609ca2a7d95ee2a57a5558fd68ebd753f56a3cc731aad7a3e6d95d0fb76c3b7b16664fbd312bc7aedacdb68d7dfa4f18454dbdae2ba7704fe1f94cd1798667142df5aa2dccf6965d7f6cba07f048bdf1cc7e1fab3e85d9df9ae8799e74e7a83745e59fa6ab9b9ae7daa6b3a8d7b370cb76d39561776dbd7cb611bc2d7bb26ecab2ff8cd93446cd50efecd57eba6cefe777cdd3a3280aea8dcf738d4fb445d37535bfcb06fbf9e99565774d555585e356edf247217855148e639fbaabd9e3f67f58c8f6d5d3dbbf6755b59557f85c3feccf4eaf1bc3acbab272efa6eae1f84439bd1f357d37533f9feecca6678a6e7ae73636d1dfb6bf9be9eacd7f6a7a4fafbaaa2cab68dca2306ab242b61391c560ea060402813d092fd30bc7271c9fa68bbabfede83f31bde9ccce7f45e1f6b72bda6f3cf0aa319cb26667cdb9ab66bbca42b61b3f31fe7441b7bfe05d7ad72fa3f2ea6538fd73abae5ec8f62faf4b78965ed76dd1d5afeb3cbbea1cbb737b1ebddada8fbe68f69be7c09b9a675f51bfb6a70977d3ec95de3696cd936555f7bb6c7bb232a5d76ccd1465fb4765168653d80bd94ecfc661f0fe722b3ddf1f0610588837e97557589ddd14f6b0fbbdcb7654d2db5377ee6ada59d37f9ffa7e86d7c06bb2acead5f5c370abaa66ab0ad9feff1c149a9d112fd23bbbb139c3a8ab9a69ac7ad614b24634db5eebfb08e93567754ed3d45d7f3fdd2ec742b6a71dd8cbbeccf78b2dedebd12bbb33ecfb99c2ddf41eed75417b08041683ffcfc1b3ff5f7c957dd974430ff7f596f665ffffa218df0002e58cc3ffe79355c463e0edf0997ab4cbece9c2b2cba2aa91269601812ccfd1ebbb29afe6099b2b7aa6f18c1663bba0791ed5732d47f08cd7e86d55944dd32e7f533559f8e4317a4fd58553cfcaee99c6683c9f660ff6456f8caae79ca2a68fbd29a7ec2a64fbd98fbe8653f4b6663ccbb1b9b6dd4ce5f98c652392ae83493898a2f7106ecf1eb4d39e8397e8854f7575d5558ee5997555b7237adbdf63b7af688ca6a63fd59677e83de7d975e3d3cbf279b2706a9e3c432f1ab75f6dfdbcfad6afeeef2bbb962328e4157a4fd6f4720aabdd5de19eae6c31be41e84d7d9bb2b08f65d34c7b1c9f42b6b3835edfb2dd4555d9a7b1e9b6f6ff7330ee5d8e27e87559584d53136ee3d874d1f6eb0dc657fd8dc61ac27b0807040281f5ef9d678517e88de7b9fde7875bd9b727fa4f40af5fd1f9645bf3a3f1ea9e3ffe8f17083c1663762d47d0076f817786e75465e73e9b737aaa662b647b31b66bcdaec0ebcab19aa2ea1cafbeb7279cfe7967f844d9d8744ff67717954f21db5bb431f554c3f3f37ed6fdae3b9fa7dace2b8a9a7dde3ecf1d9eddaeaead5f4fd7ecc1e3f37a993d4dd6abac3aafdd65e53def8ac6ea19a39e3d4db5355d2f64fbbaaa6d5fcb11048097c0dbcef0ac9a70cace698cb2702c643babe7fdfec371f7aed9aa323bbb6d9e37763f3aa7adbac2aa9f4fb40d26ebdbec5a78785e77edf22ab7739f531366d953c8f67ffb1b595c6d7c957dc9f87a4bfb3a7a35f6ceebc6683cc3dded322aff154e856c2fd2f59c9e3c393c3baf8ca671bcb26daa9a29ebaaac90ed728db48d5fed6e5f6bf0eabcea87e3d46cddf37f7fceab4b84873152fe356b62e1d1795bdf9eb2e9b2fd8cd938564dde9cf7a773bbaeeceaaee6dae1b515b21dadae5fc4ffe80604beade508f294f0e4bc7e46d1998ddbd95de1ee7e53c8f6b4be8f282fce7ba66a6cfaeec2ae476713654d333c38afd97ffbddd5c7739755145d4f37d8cf293c04deb3cb6a6cb26d8bca665f4f94f7e6f52edbbae899a6283b7b5966ddbc663cab327a9a2e0aa36ceb4d143de0ed723f4d565dd5d9a76b6baeec175e9b575e7f7bca7e354f739de5fecf93cd3bc728db671946d5f3ecf3e9a2e89a375dd5f8fbd58ce3389551b40d76b49f6d786a5e5635cdf4ec6aeb5338f5a67a76d50c8097e6557b7cb6ae8c9e321c9fa98f51d4807796dd0fafa70c9b737ccaeeda83ddeca7013c34af775b7576cd734e531636dbd3ec675e1955fb7a76195e65b6a3310b04a26eb0a3577866ded36c5b2f9b6b87dd3eafaee99679d7b8ab2cdb5d549e4fb4c71e7583bd45e9ce303c326f3fd1b3aba9cca2ecdcc27d15b21de58d79e7183dd11335e1155e511585d7b51c419927e69de1794ed7cfc26c3cbb2edcdd804020f0ecc11e7fbadedd3ebc30affa65d78cd3ceb2a9faffaa1e936f49bbd605c303f376183e5d98fd720bfbd394ff9757367ddaca1f4dddffff47552faf3bcbab5f55b69f666a76b50381f7b76daf767961f764d7f4fbd975655346bd1bec5cde56edff84d53575e5366ed576cbabce69daa6eefabf3a7f349d89445f16ec5e7805bc72ea9e3df6322bcf29cccaab5b86a7e58de13335dbb37fd8abac9a76025eefceeedc7fdb5d556e3dfab3bc68bc9e262cb767bcaa68aaae03bc262c9baec9a6f3da9a270a637957588dd7dfae71dbfd37bf39c365d772048dbc2bef373b9c9a3e455514f5ebbc9e6b1c4f80173efdfa51d9fd7367d7d83d81c013088c3f1d1088b6489e9517fdb33ca3eb9ccedec37d4dd978555eb3f5f0dcbabdc7b0ebfa7816b2fd8badedeb8b4d5d631e95b7b72babba6aeae78efaf5446d20b05577f0a6bcadbb9e299b9eaddcfed3954f296f8aceacea5797f5aab976d97581f0027861d8643f3bb3f179a668eccfb7b4aff9b701a3f0a2bcadeae1dfaeeb99c232cbb2adfbf506033dc9f0a0bc33bbf68fcaeae9b6ecf9e50f04f61eecad1dde93b78d61975561589dd3563ee5930acfc9bb76f89cd7158dfd399faed9a2295a00afc9db65d7a7ae797eb3cf296aa252784c5e36867b8f677956db2ebb309cd20181ab1bec29ddd9b9f096bc2b7ace663b7f3fa32eeb65190804026d37d85d02784ade933ddb338d67afca1d7555b30d76f3092fc9abae6abaa6eb39b7e80cafb071280cfebba1ed7ebdc1f8a2672010180c76b3077b3b8687e46dd5f8c32d2babb3373fda6521dbbfde601463bba071b8b6f57db4e31d795b53ed6bdae3b48557ef4f13c647123d10c8b22aaf0acfc8fbe7d5ed7d365b788dddb6a728da579979a25ded6b3982bd2bbc22ef7aa2beafedff71acba6677856cbfbf1c2a1b91ad0a22efaac21d4e517996e31535937f2e78f4c57e9afde88b684dbb6c70c8cbce28cac62d7c9e6eead51f94bbaa9e7d2d471029e49d51198d67156d7b9fd7aec642b6afddec6cbbae685fcb118c83bcaa87dd7535cf336ebfeafe53c87639e3f00ec2489b3d653421405e3765dbaf9eb10ccfa75f5b54c8f6a091eee7d71b8caf1bfe6633cabee42410380feb6f030834a20181402010687fbda5a17de2fc96f655c338036844068d3410581c0281c61a4906040281bdafe50842c873f7ba1f565bb7fb8ec6de6c5973987c57d4345157eee669fab3a7bd752bd2f50b201008fc35bd1691467468f7aa9e65bdbcc2ab0bdbfdb3fad7d1693dea5ed8cb7137d78f7695657faca62b4cf7ce1e965dd645d7f9af7eadfb46b4fe6ef5edd63b5bdf36f2355516fef1eab63df6eb19c341e327b23d79a463f54b56915f6f5fb08afc72cf7fbff0ac7a14eea9ebc6ee975df4cc7ed9df7d6cb2271ccbb10af7d90b5fd46f0bab5ef5f399b669ebb669fbf506e3cb4e46fb7a4bfbfa7246df06047e39a3af8140fb4877762d4750fef1ce2bbaba6b67e5de9eea2cab41b7d7b7ad1edf133d4f539ecf555ed9d6754fd565e9d74cfb3aa36d1cb72aeccf18eef56da3c67756e78ebae869a66cdbc22a2a64fb6df7837248f8cbc1b57fbdc1f8aabdf0b4d9da0be3d4adf8a22becc2b37ac6693ac768da6f3b5dcb117c89af2bc3b2f965d9f59f855dd424d2347c36f7b25dfdbea7329a9ef09ad2b771184c5764f0dbb53fa63df5f1ce27eb67163e617645fd6cc6edd98b48231a1cbe333cab1efe67dcdd1396dd2e64bb7adbc33457f8baf09753bfa66d8f7daaf6ff8947e49b29f7a62eab9ef357d9536dcf356ed13ebf72aaf675fe6b1b77384dd9ff7e94fd283bcf310bffbea2f1507edbeea6701a7f73feebdc7af3df472f8fc99e0d086cd7b51c41b9f865d9f384bf2cbb7f96ddef6121db55b7deedfab777715e01bf6a0c9fb26cfe767561b5455121dbdbf946ba765bdf368afab7453dba7acfcee9dcc2b20b0bd91e34d1b1b8174e65565ebbeaa2b0aca6a72a647bf03c89c41fa76ef045d5fe3bfadb1856d7746ed5752d4770478f779dd5194d65d4ec6d8757d4050289c41f9beb5a8e200e1eef6fd7dfe51f9fd5a834f18995919ac428848c2104180c89040024a31100303828188e470312c95c40b8051400035f9674a04e1b4aa44918e4304c21638801c600400801100119a21a070ccf197fda13dca1cfe05367f856a9b4a40edb4dfd00e3dda5f6968130c61524ae65a9907dd40e400cb0dd6164256e6533f35d54d5423dfe9a8177e7289e313ccc891b01044e009c9b4ad12ded6e8f5b136e8d968bf1a17f136c653a653354203f4109b99dc742e152c9b31b0304060098d56b04f0a5a4da365b1bcda7695b2cba5d7518d91a183f78f3e6979ec66a758ef9be4eeaa367088b2c636e8cdfdaa700289331e64258b9e512d93aad5911a2e5c88455f43f2678e675caa03b0d332b2f401b7cdf6673da27072b79c771fa24c7be92f35cb7e212afd5c76b46aaa0db49fcc4e7495ce6857616df8004265ebaa9bef57216b7c94b6cfbadb2e33e5a0d1168263519ad0d84711aed68b0723d0570a3a9bf1568749d8855a14fb9dfff5d2878c9af1af6089d6777649b6fc44a0714c0536b32f7cacaae4d88f7af2bc32f53c4e61a7c8f00e0bd9fd2d56148958e73dc86025c6ead0201782d60806dfa4ecda7a2e09816e68a402a06f6d065b9da7a69baae3ba6e7448904d967b54c0aede38d190da1d9a0dfd0caca21a5d356a3281445c5293c3112f911dae7c07324168828f6be8c200948ea16724a2a0eced8fdf12f517008236b5c496274587e699c9b9031412c714dbfe1ce6285232606258b7b464a8ab3faae67f6ab40b14041ae6465e5a8c6b3379464485174f228355da118afd3b949f5419c1c554f60dc09ddd1e64c9956abfd22ffcf7178cc14ac82aceef8a1179529ba771e513ab7b7aa0a9b5f86e6a4430bf742dd94baadf9e3956ef2e967a950a5a407e597a90a4fa3e5cb322664278ef802e352884a5c539f478dcbc398e62a5b8e100038936451b1b8d17042fb5cfe1ec2cd0fbcf800079bc5e0ab7c05f4580cb353f91b89a105708a54a5c55aa15bf9cd701f14be5bb680f8e2032f70dabc84865577fb01aa9924d47524cf60568def4f2c8780194f125507b22900dd97bce1386824071af7ea5116118fbb8bc8da3007b355a32aee1e5999816c53052fe26daa715aac1d3545fef8a36f8ecd6381997533e9f6148674f07326329d4549910ec94b1b5b927c8049457e5a59a8b4bd3d2d384d11074dba413f2082d4841ad26c2b83f0ec333d3069a170cf0112a0d5d0b693d3f8cf37d97fa441b39c62c6b7c1ed3f94b7f94b58f3476907b33c931bc4c7fba98f5f2f6e7479e95ef5518e73c67b3fd0e1d89fad4e0e88060be40834a06ead7506851e6261cd718516036302e6350614a118b3307b1f3faadbcfe020b6c5a36574a722247ddb53ac9f81e201c2dc0b9d18b77580f1812cd83e7d5a64a9228e15d00744e2dccc200f387081de40b49f70e73c8fa9f7b9e7a830d74b91dbe836db94d1483b15f674e7e2521dc4be7917527147a2512b217433c552d6bf116a845494765c75192b1f1f8443adbc80d6c258090840497640a311625a44af00612038bb04c65bb346e974f73a0c528f0064b87d3d87002cb834aea1dd0cc53f61f449c200d98867a802cf338ddd4e586b6eb570ead15dde894752991362554dcef0613f06d57ae2f955656eb761da6de9e6b8078ecb27258d5d6fdab82142792a0b8659ca649ffe14e8040c4bceca14f12e63768e7ebafc98c822564cebcd0c9c10f9a769c3c44e38f97ce9c563ea73dd76272e27f5c259bddd6348b7a39efb6e99eaede2617cf3040f0bae13638cfabe1b9a3174598a7ce759bf3944cbb81724f5562143d132c66cf8ae29886049bbe1092c8efd3f164b32101f765c69e9730e230542e9ec7ab48fccfb6b4befc6e4e0de8757208a9303e912858cc7ec407a336753323382110d500d314aeb0fcfdda3c4ed47f2dbfa837a67b1f57cd806ed56fc8c6a68e750972ca234a963977fc064f19819dc8f7dc9de38c90e97d04eeb290a3eb8c61d47a95df479d73fe98e861b693fdda1617d5e6c7a4841d1a0b178e5d1ca3295fc154c74835aa461dde6b2a722da5994d50bf4cfbe0c1be9b624497a8dc272d590a2b4d95f45b0518ceb1ca900e3877e2af43f5673bf7c3c418f893d90b8b28421db09ae24a1b12e3b36b5c09c8855f568064305607903b118481148d8b157cf5ebdce1eec2d796e20c229020c11ec29a7678e77b3e299e69d44df361ef58f2e8f78ddcc36b750d38909ff581546723e39144137d8db9a6c3860076e525e3eee2d9b5a28aeaeb4ec8cd7406dcc04db0dc29e1393413ee0149ad1d2a4703a2b55e79d6beefb9a8fe7e194fab047d380252ca1ba5cdda23b24d0af8d1123c9f299c1a0816b62e405520f33313bdf78d0053fc8568602c9e1392616dafdbbc4376b42d3f7dc4c14da36cd72d0b4af6565643e156f8095d6f6c6470e22c3ca02b8672c13eed133dcdb4762a5ea3b0610e951f9a13d3b1692097a286cca75efa42ecb2bd1af8d55478a917928a3a5842f460fd9aaa72b6c9347d7e65ab87703f4d81913403df96ecf73231b73648dd8f9e4972e1b951813c9706ad0282f1fab85d05e94ef452871a5a5407d5ac0e34b3744ce10903f8d656f8060ca074440843ed5ff1697cc156dc07568ccd6470fed8a5c37965c5d321afbcd8c865271d644f318fa9ca18b46b6b72a4900d3c892d65c135bab9f21c30f1722825592cab74fc0fc6431349efd87f6eba010b99667f60717c7b4f957f1c5e744c09e6f592bd0f16584b6d198dc07506e6b5938fcd7d584c4aacea42d90e11fdece1edc4f9e311512e9ec37d9b52d23a1ded7276a76421345c6739059f73769b534db649b1c65c0b7434ca85bf207144fe754ce4cf8599f143f52aac61e6fff67c076ca6504d6f582694101f8127b7bd41772e384d202943af1e84b7bd7696688735157fdfe79f13a502d09f353091f0d2a0abfb1307102e1f2bd2f0dfcff4891be42af8b4a6ae017229f69275097648090d68e52d04a0b60529a02034ca601b897fcc99f245c84211d5b61f9ba052ea13f82171906a715f2b8b1f60605e05b1f0cfb8d9ecdef923e2a6578309eee093a5a6db1b1d76bc32ecc6a6d2c5d4acaba384d9382306ed1c91b9d32e7c4dd54abcdcc39acd82d44c448d19065ad15a8ddb6111b89d4c1309514a2022aa35b9321b26fe9474465d27d8c2f57079844f2c10452412a979668b2220003fc221c75a222620465f8a9fa48d59414547d472603764410c40e54f5903f179323872395a05c211c91430c8a5297dce05a1dbea84325264a88d0b062171b0cb37f6ae4d470f9478d7e0fe28d6fca4e79a663e9399f0d7ad885a6c32280f629831992836a8cb24f116bf50295bd0bb6dd9f23425e181f361d225d808f79b57bdd9f98e96006aad990b59da01b7fc26fb3ff73fc38fbb67bb8cde52a86c7966063db5f650c99c993cae5b76525bb8ef8f3ad512faa3bf66f7a7235a8cef40c01dd07568e3733d419d019ad9b2cb38c72f683245d65ad60cefa7b58344bdfab0e08fd917d96fe37d44393e1a2214f7f2b695c01f672f321c3832d5df9b52f66ce3917ff9ff2144c146bffd9873ce4fac7b46c90acf43feefc24336423ec3371f1b00c52777148f44617b3d5fa12147d630aa74e3350119082ed83d1812590f3961f977625d444267c8580b13a683028830c09e6c13ec014ba77c74ded363e188abbc932ccd256c911126666689065735d00d0b2097a07c86dbf68b5a7965fea9a9570b2e9bf56aacaa203c3f6e13c064386f25ae5008c57ef8e7e0ef4dbbdd501620a9f9c46a45a9fed230809a7f074f9088079a5c26256b66cba5170a70e6c007c408f5744086378c0b08f2275a5ad7d4bec2f29cea91b1d698fa9e5ad359abec83c0ce66696dc4d0f9214f1f6ecad754ab5ef3a3810a71c412f88b90e4f262d87eb4a40d0cd1a1171809f1ea5393ebe908432fc8b19f2c23c36de5f79f45f0e358060bf58e3bc28e99f4025f3b69f3c7519508c10125f4f78a070fce8536c9d95bad03d90092da0325d5dff929aaa1a59abc9e4eb21ee0d38fee7e60def782244576719a89a6450c0e13ed039b7d6fb93aac208785d5999d9dbca4d8089694f71a9cf33b485cc601bc8ea9fb764d97ab1c12e2092bdf718abc50204f5bb9faa9e81aa42b07057c92c40260bfc71ddfaa88c60cf714ed0e83e45efd9a3e679414b07e9566598c0f2aa006a7cdc83347fbef3e9fc074a822436e1e50064d85bf37d3a0b19c9345258d020b4713b1354b2b9048114b3d795386b3041147dcfe75d20ff7ad3a2d5c00c345d94f8fba2679f039dc18dd516f8c8f549b230785e096619cddf55c8a31ad1c61f251690577a18451aeef3f8779f3429f5a1c194069461348051bba7b7342e372044ca487fa141adfb547d810845d2cf597078bbb4a03efdc724058c8d70662cfff4b09d48c6ce2e4947cdeb3d1a229320937cd3f5dbddb87aea94a61c7ab386a067a708cbecd511363d023c8fc0a089cd542eefba9ae7a33086fbdb1dfcd0b826afe80678459e6fbcda93aaf361a0758e41de87024325f59b5c9da01610b085e2c2238465fe1e5b44cca2e6da8dc2173f2b35f4e851e9f1cedef76640774848bf9052f7917825baad73c0ee661a2e823d944214a107256acf1fcfbd7c1626aa77624d6242b29cbdd59aecb1b62ae301af08bae8df8356a984c9b70b0e64bf162e0fa356b62c6cc22ef2cdfab1623fc04adc804908024615149a7cbfb9d96b8fc68b3f552fd0231cd833bc802fc2c3ab678093b25f71e1a38ee8a41a435012753ae9d4c2e0100638ac0728c82dbc1bcf1db03f63ec3139a0c6b27e262436c7f9408abdbe4e66aeafd9eff9178a27d5531a21d63a47d8f494f8f30b22a5bbbb1944261aa5aebbb8b0d7e7b1e826fc2ea9984ed777734510a0c854f9bbb826affb9d24ca0b2b9d290f3e3126a9cbb125c6e42b87c8e08a1acda51290fafd0c8fd581313b61ac7df7b2d8222cdcdf216779009551b59e49ccb2b630ac14e8fb2fd9ef885512faa012396872386a44487ffd09e228ad171295fb5aca4524b37591b54eb8a2f323cb70253ea1748b9efb323910262b83b595831f14806c1555e269413e74cdda13bb0e890c14e476ac9c940c1f711a35624909bdf75c517da15a6160e4c2f96957a6acf997c46c4e4b1ce89b012bc5094600a752b76a26c615084be5a6cc0817577aec6094ba367b9c0c767ecbedffdd931fd8b6ece7792520ba55ec33f17e00424224528efad54d028dfc8fbb98c16843b5ed3d11e227d9c284317aec2d6ffb8beba29cbcdc588f65399b6f3a4a9df66614f5ae1356a9013148e3d7440fe330aa402a3362a75028b0a4028c76da75913b3737aa350b11e065179619c1a49ffbaff40866eca3f220e9658c066eed50d6c8437d76451aaabf2748d2ca90965e24e5c38c33d97920122a9703b7bc238e4ba9d212fbb034534e1381245a42b6dee5e5ba0a953fb2a237e03106330c613afc1e35c6e3c5b2b024727d66a9af8f19dc8e39a8c84ff84f3845f40263230d5eb13878ce401aec5063c353e0fe40c22f0364ec92e47d965ad0c5a591ba04a1f071a80c969d218b6f7f8070687356f1f4de8cc64a5fb88af38165cc20eafeaa916872dc54b706313132a23876afb0486cbdcad4edfe9cc4aed272ad0cc54c5a2592e3c828c0eeddb35599053e8eb4c134544b9b380db7841d241d1f64fc3d3ab53e85076e0c2061e42e50ec618b99e54958f9dd90f3544e6cd76d7b864b4ee26c4b67091a807afc09b8391e76f3dd0f17cf82b3bcfbd335ee1b9319d4183eb9f673b1c67a71fff44f19b0374204cbe7c29a65a30957690b0a4cce3851f1931d2dd618144683a4e4f426a1638c4857a4dd94d76dec88e762588b7c02a46ac7868fa7eba68ebada105df3ba1d7c9f644428c38d16e26a13abdf792289e74cffc76255eb43da71a59aeadae16f9398b27c735ae469fd1acab97cab924314e383431d980efc9c383eb48eb4d2de03821179c26716631d38bf49094e72b07d4a333fa7a6a819bb2ba612677ae49da74be29e5c10770b0a55ab3f1882e797641bc23e02ec2dea27771d2caf5d3dae3476fae1754456917c93253439ef2da6ea87b08ce32abb1c34cc8b02a6b00d4beded3d0ab2ff8c4cdee56ada61c0cb9bb02b3128c50550006aa2f3f17adf0e74379aadba760c277ae048f9a1dfd18a0fc1acfd94dc6c23b57261137844f2e45603a8b320e8e7a7dae269e9c15e4360fbc353cc7cf22020883e7bf8f4f0069829aaa2e12aef3f72c18838e96b498248dd0c5de450b26ca054291d9f57e167c5c3871eb63e6db91d8b213224ad1f263f4aa5ba094705cec0d81a1b3e30c5c02b453cdd1972459f22ec2a743697ff8c15b8cc5ca0286c401f84510e311edd14ee3fb9872009c5e48547afaef122098f586bd71bf86fccf85843d7ef17c6ce59a83633131fc042973db618b17ffa1b92c57cc7c61dd756f654b48d093c71c7844c5f2d986fcb488e2e701a29c74756900dd79610504e5123cd005d0d140fea7af65143f483e699e0479de1e120505a71f8b3dcb00a83d68b501b0381ece6704b81ed1199bb62fa221de8c61fdc8bc55b1dbbf8d4e27eb460d15e3d00fa14472a757898e60e1a4a4035d0637a59113d916e394fbb00c941131a9403259d0a534288b8f664da43248ac62ce61e1bd96534460316bfe6bef210d1e54c468f011388d7e358e2c18bb818269bb7863d90013b3818a8ccb00528778041ab74b5caac791bc7418ddbb00654006bc49b9e0393ecd1b0bc1c361ff00406f107b4a59c295e9c306ac9ed08f82b832334f63e94b2294d5e614c54e38b69dc6aa915466c4013b79764aced1a6bf1a47a0c1dd705d7a40c2a5e64f4a0161595e1f1bc8107ad350edab3152d3b97d520cccb6b07ad798d7a41c791156610e04307edd4c406207ff236f6ee6f15feb1a6dc558c0e6e0535f397fa2403d8f00fe87fb2e8be05b0e502b66d0e93c15d9b14c2e36d5c4b1825aca44bef3201f8288a4418540eb492c24496a14aad30c0af00336880aae24935e644653b170c53f4c84100ce18316fcb4896bd07fd66c4bc732c444bde8368a4ec77b2d7959e3d7539a60999d0dbd129853353dcf321df5e5ce55de10cde1ff2577e87bc8d08e20a142208475b8a43b2a60ae9a10f663d84d92e7dddbfd1b943e8f57e8054f8176357d2d7725c7d2d6b069116da2eec7d02bcf2fc136962e08b688ea57160d29ffc853a9584a64805d82b2b1c36a7362d969dbb412ed94a0595b11981a3191ccfaa25631e19cd73a8db4d078cfcfc966084e3404407613476db459449beaed9cbfee81e282ffab32be467344765e968a25611f35f0c12fab8881c748deb9d558b5fc261154ebffbe746467b988d3a06b8512f66d8347366e8145738b9a340b7037a24c9b4804b377bcc6430806ea9905656bf88311d2e8d0a9773d5fe986f89a4486e1e491b86b85b3b8e2b30260b233fc5652bb5b53b90fda25d1862c51a6eba56df9405a925e150a2af9a855eb77b5fa1e6623300eb16cc174e24fd66ed7308ace581a2582899cd6da7d39b52291f8ed0a3dda490320ef47d384faaadd62049f95e75c039809e75035defe8a09bddf6efb518cda9b9842af0df6100ab85b35a6f90c6a106c0ee9383b22773d1b74e935c5ce115e94118514a7fbd93e218bacf64a2e59a520d5c8ba95b75ca44666d16770d632c12b24c9435a02fa57ea07402de6c702d8a2670b10ebac9d68c7d94e6353fe725acbc001887fc32d22d9aa2edd3929680f912d80297041431be067c74491eb831ac4ebe6b06d7652066815fa549fe3090263566bb05f15c995395d539f5f24ce021e4d2c1dbc98043d0520464ef71aa1af43476269af7af19464c637bb421ef8be7e36c2f9cbab6bd2ac98bb3ab650708f4665f669586ac7c0291364d2088625adf0851a212679a07b1e7faf8f3aaa611f413fb9c6b4d32ca9c9e6e2930e6de1025855122e300b939e6050a7ecc80810542bb18e6d187079df968274fba8098be3441147b6fa6fd0234f603b1cc56d41f823f0fe91204e5b9cc23f17cffe3dfd7ac4de7a9495fb6a02c477f557f076971ed2487600b1f5a33d0e7cf38fc79a65c4290fee7e4456baf7dcfa7c7d003161bbf518c8db453e930dbd64685acb5573abe6fab8d8c7a5c42b3a596b7b46d243ebd2b9cb982e918caa6bd86752377bef785027e75510dbd7dbcb304831f7febca81aaf9bc4052ea83f6af872dc2023fbc92992361bbddb37164f27fdae34a4e43f6996fd4136c076e2ca07bcf6c120704ddfc41e7cbac7b7a5ceb3b9e7f656e127814a47b64c6be664d0dca92834fef9035881e7b20ff73d8abd3ccd017b531f99ba86c3be00b8ae009ba06d4de4b5d1e82e4a07de073a9ef25f4bee462f1a89b379e68cdcb6b658f7c86e8fee7859f17d4860419ff862abb070f716cf10ce0980e1cf160d9ea2f3c1a1e20013f754e13f79c3167b31998cbb392dfc2627a03c677a4a42ed48434fdf53f5e9dc59031be637ff1b9e447aeb45c83a64cc1c861ca84e5362667abddc58a0710c4702dc487a429cf80309ee399ea1cc2983976918dcd254f3fdaab71d921c0e0e0dd466501df26ce5fd2da0f0679db172119d3fe250df2e05e7f81f1e2a4a5cf2717972c930710476309390ba4a72301e34594a9a4e296989af4c525ed2b2956bd2b0fad981ccc84ca99dfd038df7900c98297798cf9f6a376f36495043d138fd553e86137827c926b6079ea035e7699693e0e3a1a670f549185d8d33ccb891697379f994ee1c50f37582b2ccc708eaa0fadd3ba17cac1ae3d2ed46e9e64358dd59e702e19f84c35ef301097b8863a2a9cc8bd990f98fe0c024dec5041f0a5211960e0dc624a3a339b0f966af522713bdf90107ebf89f4f2168c876cf55335870a7d86e65d98a2e5bfa1cca0c6fdaf32cb8d50c8ae2e39603f1a5ea4ec653be3edc30e7959d865c5f8e93725c852fb343198d7619633ed0928e922c5f6c1eeaddeccdcfd75048dc03316e5787fd7c6758be8074df2845ecde87f615ec2b548a93e0fc3607612aff76c4714fbb080a6c65b5d27ff4d047e33ac81e419bdb37a5652ecad88d5690b2e2c45d47bcace8a69f893ba9e652a61b3b5a73067ddee7ba22e76d6be0cf96f6f9cdf449a1832b9096bc80047945a318a6e79c6fa33a3e3e6c81d71258b6bf1dd5fa8e1fb8edc5fa0817f8539114e568ce7b4f4449f5b3210e804822ade0e16c5b6cf0b201c7211b88f09672bfc26698165a1cb634b9662fb4a510ef64385ff30293dd93c6acfc7bac310f3bd0d71998691b2f18fa2dcb34e50dac2f5eb3c314bdb7f62d382de660621b8d1e22d02ddc4be9d5a869da37f2ecda4f9b4fbe338d767a014e768f97061a2be877f2a0eac7d7f3e8006fc67d4067e9b55bdf25fc2eb2ae6549b2d8e3030e8d7d4e8fffe5047886ec018476f262f3c2b60042c8f299dffdd54f1d0ebc17f0efe32ce7934ffc57bcb02f0cc99ad63fa1d43ae001c8ddc4a3e33d2d8aa7a4beb5a2d17ff3bc6d763043f50a43dcf5b991d144a49376b204066d89ec2c176e455103e5eeeb913fe177487addc147fde91f63a14a23b30156207908da1e98fedef323e33d0a90698883f8180357b480e728785c53ffe30ce335391d711acde6c69efd1da473fd62ecfafd6b857f3ab1d33d612d76412196d829be4883e06ee3a1bb2fd034f63d5d6f0b4d38de26ca3dfecd475ad63b167d3ce502a14d04249be4c6e4d30d76e142a2a1791d06eed68e27bd548449f3684e75046313f7b275700105316041b8d4ff8a4402fbfdb228e03db2fc6c69c3b084ddaf7e2f2cbdfee260a3279f2909c1820b20e116e3646c03edc59daf276931ef3761fd2adefb9758a755124b09e2c7e7b25673d010e771d624989852ff23c6d9fb61a752114bf8d44b026545437ade46f87e2f54f05976a5360e4377494014cde35fb9f49525b7a1adc4dcd82a25d844ff007177b3392d6a801d17295ff8fde011f0c62e8f7a1484c14a1b2695c89ec237cb97d24c14d078d787e0517fd785805b3fc88e44f5be56635b1241c886031bfbb4649226704b33db289efebbdb884147ae983bea44db721c3a7b533563a56ac8dcbefc3e9f7ea7e5074b701a6f1e2e28c3855b603046e3d82eacc58761ba3717d35229ee06a874ff56eda1afc18445299f96b130ba7ce01b4ef55e573fd1bd4d9a9315a67eb3c9b36e367d7c08a251f6f2ed9a36dd78f9e8880dbd19da60061a2f1de25cd2239b10de82be2f090c164ae585e61c4e2b9906939a65a5403a9aecf1d00fdd24415790d851107309766a477ac64568e68228531533ac5e4d1344d789764a4ddb61053aa303ab4c73189680fdaba355ceacd7f24c0da1e34791a64ef8e47007c693640057c10d79ad6ca28a7b8a0a53a6afe455d8057285b3ff78c38c06a1a07e926baba927f13725c39359ca67f22807743081de97b867f9c37dc77cde8e04464070b00bf63a6c6faa3c5af75f9517e9b6074779ab0b8d245b2337dfccbb076500091e87543917f9381bd2e09ab7edb34642d95835fd8dcfdd75077ce1586888b203cc20730c2a30c7e8c16c1b1e9eecd621f7c97de9d6329bad16001ca6d404d4191f743f3f44bc7bb6b1e019496f87d3935d8a3da38b85b41c2b336908f7697394f52b790bf3219e18e6c79cecf1e8dde93e73487753ec9530aa691ad67c6a916783490c9084bf4df789477bf3491df69fe89fd98692039ee35976fabcca126bc86abbf3fbb91062deced8b560abd0de233546e54f5771ee1568f335a5185f5588e6443813a985265e1f08dcbbfde490c5630f243fe05fc833ce577d37dfb748383afeb3ad53e6a224bb7e5ae5291eb014a2606a8ff5750a7c704925672f012bb027e42c7f1295097a3253df3e90217560cc62d04dc41401e8503d7c2b4f49d202c4062100b2086b3aff23dcc16fb81e213e6255a4b57366cd9b053e2a7fe203904b4f81b0bfa92d2b14576932c1b2defb6bb4cf94438c18157029b50c820e4d2f5d91482b375e1646b88cc7c2930664e338f25e832a6fee260666a39ac0902062325522fc09169752a46984b13a5bc3bc42e2bebc74605314f3d09d0455c2c8536400f216edc5390d10e983d01b677521f5cd124b3ecc53b4bf3e8611582fb1de8115ce9954140c2382fc03cc2685ec86d12b7c28aaab5c77b3a09f7a20571989bee34cc8247da2b14c0e0f48964595d8765237c40e50996dcf52834f5d250518b84f92475fe0e528897bb7b7a31d49e875fa7771567b84d1e3cddc1857ebbf4b95be0006988d721a5a258c32888a52d0c157bf9df9f39c8bad1e76015b85995c82324652bc1a91e09d18b9d7c346a9d63720aba563b0a469bfa39de5829f94a481df13de00d3be8f22d23117238c041164354511102683ea2449632337affe38c80523919171589c43547d12cbc438509dd2e8f36bf20112305301f29ce47fc5190faf10a9f7c8e164288d1685cca2d7bd94458a90d945a254ced0ec601daa5ff9feaaf3b73a8ac53ae7534c62ef1881860710104336461b0a4a11b326e6a22a1f868754c6d222079b60e8a1b4e93e77169983e73f0dfe5c483e847130828c21387a5204f07f14aa80d4c4e08e680693d658152e71a07abd1d6f4c032f9eade85c03ea8a83ae3902df1065744a41b767f2fc902355a24762da6a623a21ab741582cb4e8811a949c535b8a9e97de440e3a801b4ddcf5990622e86d688bcda7654a5ab3ffe34e8a49e40697a5f1ea0c7a6bd87cc4aac1cb52a1a7bf647d0f523aaa19b98f6731b9d1a01ebe411eac7aa29ab3235523cdf2f4473bc88055ef188a7882414328ab8b201a6f78c56b5abec00ab97092e05e50307b2b45cf4be48aecad2fabb38e229fed9244b35790cdb84eb7db5601c299ea89e6d9a3c353bd2059ae2b46b3d548b50f3425462caed7122da376fdfeca08cb69512397778b5a87bbd225b52c93c463599d6f752982992eca67b5abc7b79638c13cab24b054d7e453b1d86cb655839829d47fa54f7e06b7b283fcda6abc5027298b59991916ad149f29923bd2afde4c973a0afedb48166d51b29bed72512d7f7063b02d5ada7c6713069b55d7166ced693566a8c50fde8960c13eca0beda998a6b735840be7a4b0803e3594fa5c44a2d8b6c585eb5844919ff5c264665c413cdb65ca7b5a28403ebb623233d8a0c6ad72e124325c309fdd529d1c69283e8eb9e213182bacef5e591903382b17c75c992a4c0190088af287c87932e5d0b8c990a16cc9ae81d5a2a8ce2f6d44067b1739de651b036430e88d4a7cd8225804dc4aadb1bee8c36a7e740701ee32ebb8b4af44fab7494344b51673b6480b72577cd87fb9d20f55511de64effb66b21206018f96098a33b2439263b411458a7d6e54ef5167cd9606ee331cc200bbec7f8112afd6799dd1835c33c7e6565870e92af98718a9c19c35d0992f1d274cff80648b1b6d65f3b72b83101097de2c6f91716400a0c7289d78ce94a66c0eca085c04c9a170e46aac6477a48092f6943f36c6e97f2fe8b6900dcc9e18f325a19dae04d0aee75382aff251c9567621a023eebf803cfd5762134732f10ab5db1e7ebb079668edcb62578f42f63efaae8d1125f28f6ed4919034904f08d0080e8d998bb0759a6b9ba07f1cd2dedafe481cf052ea574b7701fde67a7728d90990c2b5d3e0318ee50177dfd0cfb6cfd91d374b4e75dcbbebfb92b2c70f4ce1bab5053db286b7ee3c9fa8ce2d4317f921f8d4ff0c41bbf664797ac247d9658d37e0901302c1ff31c55e4e15c28bfe64e718c9a5cbf2f78c8be9d30cbd18bc19080fb15c0e0919582b8327f6b258ab3ecb80ca29e043ec53c06422ba3752a363b38adbd29fae1ea3f9ce9251803fba76556065f45d3d239d6c5c6dec333f0eddea711da9e71fb8e891962d9aff22ebe3ca2a19401807ccf0e637d92254b7c128fe1fe17d11ba801fc4c7ca808c1189d355fbfc3f5534d93cac964a01ddf2d1ff7acd07f33d40350be7c644086919cf797aab1f0fdecdd0da9165be634615309ddb1257a576e5b97bcfe5ff4bf8aa206536dae95e33adf3f824438350ff12188d21f64b685ea8f4d94e664f6c90aa8f649153b16419d525d00257cb136ed9273f467f37b4e60213a3e0a347e503367f8bc1598ef7a911656dbd185636023cd391dee6b14c5a8d820b6103c38d32bbab38129adc9481a291d37ed97cc81cade7aa8e009606422361ba4c76f7f65dbdee7d2ecd1e64ca25a08ca47acc0202ad1a8af41b330d4da0da0305188415dbbf6701083908967fe3bf3eeb3a70dd5d637d705893a282cdd5a6a38a9bc95f809216d4ad844bf9d92a1dc4d35e3aa7f931365272d1f415dd65360823b8da1072633a9bfd6d0a005b5d1f765e74449213cb27e418abefdd3a4d15f988294265a599b32d589a02c4f1a05eaa850289944ea974a0d2d53311cd229e27fc42ae53fcd22facaa513c4eb74e897ba5fc2de32151b2c6451d52919f53f390bfd4bd328fec2a65196b69ba89b1c96b7b70adc4ea20a1761a5a3dc52179ed8d156b5d30f04efaae4e97bcd7bd7656fabf085533e02a42f7aaa7d04d53f0902785d05945625f0af32b84007632b84b429614e29a4500ba52a8687a8a16a72f8891eae2c88c115915e49cc4c13092e8aaa54f144591459173f268c33943168a4918a36662f8ea4a8a344f278a03eca2f903f28e44a1219a246122692f15492e6322942278f29949a2ae57ba5729856064d2c69a865ae5c12925eca08e6a514538c643e493327443330aa49816c26d14d6209a78cca797802a3ed279e6d8b0c950d5bbc3846432e71402e5e9414046a57291bb8f92c172af76f8217d8fac31ad22b3ab6d626dfc24eb283b7914edce079b96229f36471f48d0b3d99926a1a74a65e241c43ee030ee4193f6c85435df4c1532bc4038bfc98530fffcdb968478d09449f39de8fdf89b547c5fe23694ff6191d6bd8859d3043030ec0a3345c803c801d98ebcb95e91b7abb935b841ae14e5e2b6f51cb1658fa9866e99ead14912a7bd760856e87a1cd7ad48cfcf1fb16c5d8ca4ad2dc43a451034f574fc8826b3450756be50a753058f3ac96faf5d1ed565ded45e1e43c3e36d8cfe3bf58d00db2ba4d43939fedb8ed29bb538e75149f5dddfaf711c7372db7ef1d99035a16b429eeb0e3257c805c59364d73549d4f78b2abd90bbfc9716598dcaeb64b96ae244dcc6e4d63182bd024c7cd30298349e8b25d7557a3f128fdb5809246998eea3211f888f2a7fcfeb9d64cce079246b28a642536b5586bdc93538e84c3cc1fd0eeec75a12f4b4fd9ee3c0f8fcdf965f5c59b9393e7ba580358d186ecd9611ae02cccc580c1b0fcd0b330d4c1377d76f72f9ef768dfb441954868dba59f93f0c1b0540a8b57ecf68f3bd3f5b6c02bd372647be040ccf6bbd080a52a36305f8e0794b435d9532e5aef2121403bc90883e147a59f8f348a16c7c4f68d23ad3d03fa48e5141949a02bce8f1e116cc6f6b3864d2209fd8c302a4bd510bf197172333e9109ebbbf9a5f13d0633f11f00a164395b03f50fa11ed0a5f47a80cfc39da82d484bded8aa330eb30ef7d92163990030d15cbf6ff62cdf8f56c92cdb8993291a78f34b95ba55ac734e9e0548421db5b20a5f87bb77ae9bb36ac0a13bef3e8fa8911a7bd4625ec551d4ef6524a0b7c65030b42e3df472612f6a00c5c1dd9f3017048036ef3e9a740230941ecb0283fa4df3da59635ac19cb0542f9f1be4d9431cc686b5370d58ca7b0196d7a6f66c12fa71cc3172efc48b5f3644beb226527cdc2eedc9001129b894871ca20734980feedd35b718db4dfbe8ba42f309365afd37301dbb75b5e92666678d181051906ce93fcc4224ea6554d1a4c123faae8d83b35985c27ed54a688c070946088802b9221db3fc75ce2b13959e6910dc345b0a1cecab152bd39f6ae7ee19cd43d7861978d95cb3a494d9499548e3432d8a6ef3a8f3496c608668fd3e7507cc91594379ee3d2034f64537374c2e97f5a779581f2251346d7239ded19e9bf018ea4312c55e24e46c10f14b1d8e4609241a5fdc1da5e1205c0a4f8f2fc43c630216e3dea0885b12bd742fd669e733e14a869360654bd74411da81697ee0560bcdebf06befd8b62db33f02dbd22af7a42b0be029fe0fe18de44454ff3e846cacadcbfbeb2d61f76c32a515a4c68fc53a8684327e29409e7fcda3842154bc6e78b3c4c67c37fe614abf77e34e9b6af75c3f7ece73a1ba9c4307067a4fd29142512a5aed258f00151430f38f205acd0ea5ba4ba40d5c7066a396020c34610c5c0fe184cf912dfe275405393648a682ec833cb7692a51206b198c02bc9ff7abe7dcc5433b75395162ffde830ad787d114506dc1dc99dd3f6289680a06ef187c8f6e68b58b91b953a140f39279414274ab7dec09ea053b1f81579e7ee4528a1d0b1725d1c1f870775190a6e298881e4f381f552ec0a321e9635b4afae37bfb1c336c38014922a458faf1c4e4cfdd49b72587e4baf857b87676fa99632c9f6cd4e1db2d070513322944239704f6de9b6b6d99946de4af94361389ad44b9906262b9a0c23fe5b18c4bfe9ce8aa64a5f43f79488b67b166c8d45d3d8f03a68f183790b9c83f00df841ee147c7d9af20590e8e77ff513ce0d62188daf8c133c145a4885929f511b65e7278fc65814d38524a55d6f3f462f0605fcbd7a03e8bcd7e7dc41760e09f79801071622dafbd9184cf8bb4da42487b7818c787b270f6fd63af367814b49bef9051bb243a27aacad0cb33bbfa605f7cf52e82b274ec09d167645752996b1bd01729d00c9295a22a7a9e4806ef78db6d61306103da3cbc7d726d0ea0c2742c96a3508b31af540449865609f5b019db360ea1934e3979563a517cf17f848cea42d069cd0dbd54ea199ff9d21e8e7270c3833e1c0557a2db32beddff1bd72f1adbfde474b47ba7cca0931451b5a33ea46b7f8ab9b0ca216f4a44d4c85d913ab19522bb971e5eca813806b847e6b122d1b2e4f5768c19b02bffcd20bca4ea2966322007f7901c1686d0ae72e1b92f8fccc97667dc06659ba40e3f3517a5f71209ca25482624c78d73e399aeba71930fd66680e139a9d81a310586842641673ce17b9428e7f3a149f4b56403fb41775cb8097cb28e4a0a1ecbbf31c80a6c323e624bf9fc2f47480cae63a312cc7b0929168000d2d947230d96d1e045dc1569895642c1f74b15c391b307f668a222be216a29adbefa9322e04389a44afafde9752841306f6a77593fd35289156f2819725a2ec7001e5f49156705dbb3ee7cca998e499d1c8f98cd2ea14304ae7a0f3f87651e1bb6221cd5b7e3c336608100c5ce964a14526963392fe57dd026e7be30a0e05cd4e3b749c7c8cd5844508996ed7127a3c73f2176e84fd235bac00ba30dc50154e990e7433ca990bf662452e0495f6a59d4d13f20ff32ecbae6b0660b52f20bacd3cba03a043ba8df3cccfb3799662b8ad321a4261812b562a0470df0095f51da31153318131876b104349cb1f16bec1562bd5bb0757433cbd199791e9d03af61c2972d62db14a2bc5764d61336ba1b6a2f5014f7d5aaf0084191a7258418538c91b89bd0d7bb11ae69bfbd5fa552206e84863307b8e6c825560eb59815727626f89f44f0b9360ac11a25e9130b76aacb1b14c19d18e11b4f4a294f745b7e2515c688e6153ca0cc007a2c164a8b2f748099343e670fae20d775328d891193c00e3c0ceab56358e78eac81028ab0afc9634fc798835b8762ef56b3397889a170232630a4dc97e8acb4db1d79074de7757905dd8e0b027f35087508620805ebc818a067d9b9b2486c936c8dcaaa93cd71dcc04e0c5a071421900326cd0aa86cb01144b4636068f251978ea9226cb7b23c45613a42c9bf8703818d017347e33df3dabecdf8513aa5a9375af35369ec5a206ef211e67cdc70223c6cd16aae60ee04ac08220fa078fb4acee105adb4d5f927648f65ec70c53c146e0550c4177eda36807753113e6491fb5d884e5ac013a813802fea73e5ca25e2bc52ffb9c49dd74608c5e8d244593514a17efffd059204e4840e3351f2cbe7eb598e847a21841b9368a887a68fd3f09405f5310161e0d70b3ae8d73b0aef67bec751dd32ab6aa24b1b1b2b3f72f47c52cb349396a58397ab3beb8ea821644b404c09bfd4c4f21b14de8ef715f320f27d3f299e303520ec32416144653e4ed4c1e7a42fc27a0db29f9d73fdb6e1247e02bbaffd2cd65f1f6bf0bab9cee101b19cc6f027bc49dcf489fb03cd9c73a6ebb62037eced9ff21bdad1f078f4b9dce35f45df677572d6bb5146ecdb86ed871730dfb934d381262a923a97284b6759317318987f96eadd88636bfa4f898e55834e0dbb90dbefe5fac5211c799ff601ad9019bc4c6fa55b55d06672d61f8cd51c95e9dd5155f6fbf59d5cbfa2d828094ff4f191a58e8c4ce7dc79aaafa9b1c0d38177719caae5d0abc3f43eb5cfbfee2bc30fdc9c91a8faa6bb3a73cd5de473959e739ac1d7619f5aaacf7ffa591473f9a33519b1e730c9cb625c010c241b8ec50597661997da3cec949ecc6bfbcd51d2ca65cdf2ba7f7f3b107e842efc87e1573675a98290f4cd8a9859167c6c1b78764ff6c4691b24b63e5d895f5a5b1a28d5bbc92a8a2b1f880e38886215dd3094894b751920bbc4a94734887b4b8ccc5d0cdaf455e6b9175e027c3eb104859d4b7a1cc85fd1540e9b1bee3f14fba129fe9de2f516572efb34d5bfdc18717fda1b49e9fdd04ed49b89d851877603f5d39e1d23aa4d0a3af0892b5f203d136977da0880bce32652d6a5c4540ca247d77e0d1d74f69a170e0a9d35f06f0d63cfa72abbc8c861cf719ea50702f718936bdd8a3049f59bf575e149abb6befca4ae0cde761d7365ab23b79fa33a25463edfef1e99523ca5873b39c1c424e5a7806252243dcb4629294ba03e4b14e3ac74cc5548a43d321bd0ed161a0a5bd7f3bf1a5fe49ce3373874c98ba0723db452c4e2399e6c47364e58b86867d867e1e3482432245c0d45fb4597edfa0582d53e367455146d77432dc5473f4a8f48aa03523a5bbbc72731f112916109f7b1c241a97c3de26390fbb96f2b5b8a5c017e5130e2888c3479995ff2c803674d2fc7c973d80b70abee22c6f91d839397a54d0a9a6c013396cf6f173e288fcc75bfeed9b7184fa4aff38583641c710916d82fd057b5268defa7bf4eddd76c6633260ca3d8a9b5a6b5094f6c95479fb5e434545c1e016dec582577e5e7f457593fdb0f757c8a9ed3ad6fbb7c73b316e7fec50c74976cfe6cf394ecd3d88913195762aba93a2bcbd94ee136f68cca36e5e02207031f11bc71a8ecd1129a2bf17a05792f78408d5ffbabe523919895ac3c504e2f77e2f0f7bd74b7fddc72ef3eba3f5cf568ee64cb7ee602d7c7c513719f71d68b48af875fd8bc44e53f6b412ec77be3ee6a5886f9e7a7361769a5349c21bba4c69ce1a4527857ae85293c4af13ff83731507197100af3dd9db9f2b8cfe7b0db8201404cb58524b112aeea6f01bf82919c1c097a007fd4893605e27e065ffa392738f0a5da8f1db57535874ed5306651784034780c00de7538cd3f4edf7fff32713926f0158c08a205f9aacd1854fed6bacdcc78ada3f967780db20b3f26e94e1151a833486b18a58c363a2742809f6ab887f06c0115b34c701f2e1263a1cfd6ca0bfaef25ee58f9c67765c53961ea312d2625c943a48831d726d5db06c4efa0894f90f57f1aab0644d8ced06377698505f153b8bf06224f59ae5a9dfe6351a301cf71b1be4f124752f6b8b2790ca144000bfd8e8d9ee84eeaa67b6a3d2010c2423af45bd46ca098077dd1d43d297ab97246fa5675f84458c9fc47c162c09b2777b8ddd8f673c6b25877a8fb3ceda26f763431a8d6e90b7c1cf7e2e507ba4e84c1616bc0948e6d386e46cfbb5e6cbcaf71c9892129d40db243d62fee42e217fcfb5762c47718ff2b5cf8ca327474d10cc4e9b45b76dfe9c7ad209cf67319162fe40e69bcc0a5b953d4fd23abd43c427a84ec7c87972813536aea1a30c846c8471a35fa5b833f1f9619d8df453a1636f76363c3d23ed925a1a690ab328fb869d0ecef22e421a3275f304f01c3ccb2cf36532301d602138c1e648ecd36e5ef0c93bdadb92e3ee52d23b8fa43d29936353acb60d29224f1df189be72a570aeeede0be083c920a919e910b84afea7af9be65e4e565df02c8ab13c7ee612991ae50e2faa394ee28ab2c1b090e339c1b65582c7d35580013bfe6c653cd8c39a86650d2f2b554cb0a283ab7dc7018e08ad101d57e71d6e190e390ecd71a341e323aaedb5b6c74e37a77f799957b084c099fbdb4bd6a1dd58c4cfab4b4c8a7b627c6eef12928f2ee0002c1652c8a4090afa4e0d04c38681928d25b3241f8f00b33cce553dd725f81d70d48e0e6ad9af6d217ac3d808aed666161d075efcf0e868774bc2f99ef3ed675d549d3748c67b6b52eb14c5c3da4ad7342a53c5ab02a72021da195aa7d38ba43f9ef1b9c1f18ee722d9faa487916724a39376be501228586575d757ef3f56bfbc7b467b5360e28ae247f6104213a38f9a7dbf88ee34e7de9861e42446cf3f20d165e4569ba8043c960b86ba96422f700432d14af3e08d41c778a75ef5b4cac95494eda0dea75fbdcb65ee0481bf406eaf85f7b867da377758aae8044209a49aa7cab8786f2150e871fbcb5852ec32b3819cab779927739caf5668243e9799f079dd4350dacedb261c173060bc8cf0bb4dc125b1a89718919f611405d78028f809cdac8653499f88dc0c5954e060c838632e209e6e734d7ec382a1a036f74e6f88980c3001c79912ecbe1cc49cb412c1decb02aca2b1f0d8ba3e131a2e8300aacb695d14fde5906f80a640cc6346041d4f037af7f7eaa5e9338ecda5f288d93221f443cdda83eecb295197aa21d5556379f7593ce6fd0036daa3ca2b8a92dbac78e7c9ad29149fc168bdd988cd3cadbee4826c265cc5c97577490e7874172c2366be660f90338e5dce549fc006f8cf352ec1653649a100450d89ea7cbd6cc5a907e2efd74109c7b16ccca70eb659fe069b185caadbd70a0c23f30196db298f612362f1959840bf9990627e50883edcf9a03a5da430cd7e935ffd0f224d379927a19a528c1e56261502ce523b4301e505b8bde4c61a34d682d667e165fd7c6b68a448a5a73934d6f8322e960626f2abbbba98a31fd449eb95d20c7f8beb69f4387bcc98da5e6fa5f6577c1b065931f0320bfda67eab306db883a73202f6819f0fbe3bd1e32a7569de10a75f12f286148033a35c590df2cc6d80acf8cf277ad85e00e28c3e6ff8e0647e02d416a4ceff083d0ef48fd6ad11f767734823fec016bdfe6c101a818f8d801d182d4920fad9d146c76749eceb332e7e44a50d38195e3bbc1038f60d968a426a6e5b1081dcffc00077b580b66e3d5189fc27e718b58889f33ed38dd0ecd13d1cd074a2ba264b16127131779fff15a016f9989c872bd5bd737b31f0c45cb0708532cce1ec1e12b61df6eadd4404fa15e417f852428bf4e95187729e3483cc68506a23d488b20fe226bf3dc0065fbd212ed8b8c539a01d8c83d327f9833f46a087a6c265281b294590589b6e574c82b66e657fcfdb482ed867d020ac7af0b724d93e64e917c2db8a1d8525d73f29a543d822e8fb40bee55f1826a897bf0fd87d3acb480a3463f6fa40eade7feecb41f3de0f30c1bef7f5d89c194497a8762a056cd2f84035be275fe7c980067340edd848b1480911ca790588223207428d943499378758719f9916784f551e108eed6e32752588ec4d66a0fc0315fcb8d9f40783a73b9a0b9417906870316ff65d7f282028c22a7eba149ec32cbe8a76e1f52eb7838ea4c9a7364b9028f065a691fe322b290c0553c1cd3831ae5b1d162583c00bf70bf75a638b56be22a6222a87931104ac7ed7bf99780c8541f38b5531486b4804620ac76219a24a2f59c8b91ea413d46dfdd2d36b3f93bfe308c94d9cf9a4438e2225d9b68fa9085b4a8173d45bad656050ad657dd0da262c247fb61aa2be1c413caa10ae7a2d9db50450d6807e900dc7b5d61eef912c7a25dfa5d3ae02dc6413e1d9da68f0e044cbf45cab1b3db87a52bb20d4b0ab8005e58edd1aed2fa9153f14c1ef0feae3d781ec3c2563b9f2e1e32025b5dc9d10459f1dbf7811f8b9f6793f9bc7001fca3c91239b623910c16b4bcaa61ded4fb37119c150ffba42b4c5b39e8312b6886cd1842b5a2b7fb5cddfaac07a13e834e6222640ae26929e8352884916c32f8b120e844b09e231fb63c5125a89bc01913ea491b952efcdde8b8811b8c1f939ac7e9fc36bbdd539d9e4214e1f19f5f629dba646db90734c14b59ff037f79a2f243915e22c827f4cc91461d1569f7dcf8f8289f4c2c6e19a6a0e3d4850da2721acec6a5d05149b2aba8a4d56adc6cf5c2c5a9963fa43748bf7bdbdfbd100387631bc69c1f6d9df8bf7f96f145133b1988a420e848635a23dfe31d444179b3054f7a458dc44c7844455557f7ecc4e3616f16c78fbcf4b2f7557dc3016dafe0a957348a7d00e99956d7485a8f13a6cae7a4f0a1aa01d215d661baa30f9b2eda2d39031bf102a74619ada0551652c4b4c91cd89343e359da2a6da5a317ae94e08cfa3fb2533a9681388d46518581043caa6fbb2d191d23e4447aaba44263a9d362b3a0708cd3dbb5d14de54be71a0377857084a0051ebd178573b9c77869cf55f4c8cb157af504a8a47b67d9766d3b35735eb16276c4aa613d1c68b59020547c1e430d58b0dbfdde834d9ddc1e64b6887b36b1075beb8bcbffaa7f536afcc2f1346102f8e805d04f5c5dcab254dd90f0c6c294fe749ba63440f20f89296bdce5008381c6333f0d13439259940daffb85af0a9edf800f2ea44c1c51d5c08026e66bda5a194f7e41c281fc47122872645b6fc06339e6cda2c6c56189510088da94ebd802c0e815246a0c933f7fb921879ffd986b78412d96938dd733c2e6a9b3035ec5ac1a34326bf3c09e36fe893b23de38effe0f77a3c873dbe873191413ea87e0d085f3e723c57c726ebd05cfe79685f39dd177d5a14dfb9ae4b9e6e3bdd6af195980ca8b1584201f60e6d702ff1de070a7751fca6064c9fcf5a8c40ab269127afcc54b8062f250b6fb0018f3a93cb0321e16322af37d50c5c262cc4b8315ee65ebdc2a7edc819b865ef7c1c1dcfd9b00da2de6e83e59b04a8d99f17e782cc75efdd7b2e06f91d1e0ab88a92897f63641c014cd5ec0684e3b23c364cee75993a8e4a7e981cbebf46d70480fb6776f1889309f001b57813f938ad91ee661e85be5b2503fbc3c1bc067a6b1c1f45841ecdc1df583845d8f363d5c2c1d90ed52cd9335253cd5de56341b5a3f08ee94c8d7257753ffedb71d5e57f67a4b3a81d63c10628dcd2c31d9261bd88bec7a1e2bf52ad1b167ce73c59b3f6ac251241d1f501443b8fcd6e9d0198928594942f04860fe6c2dc56e4df69ad8d9e106f27f07e848b225c3afbf1f1d6d0a020ba18abefacd63130e38aa4027d6867a66ed704deec680654c7a229759d137bb63d1268523160adfd2f12303bf428fa592ec9a75771c875c8000586c5b8163a168a72b8499117f8f2a0b7bf08da809321fe980979080c0b685b8619428d0ab3ce6488b2296db278efb714fa58978566d76d170b389e50953bb2ede70982c6254f5842f8a82563b83e5afb362e1b37ae53c408e4c309ac05a121423c1cd45a575e454295e4bc7f73b7d40277ab66363cc8d3d584f0cece1726d9a3c1c2b0abe7f299c6ee3b43cf69afb413c61695c7c61f0ddd73dc7f5702f425989b812c467c8083890d245fe7aa4a6d51267fb6b5662f070a62e843d2bd953d5f4540c36dd301a9c68b68b70dce6745a59eac3eee60b8c395c8b4c610a1a9046c6044078931436925622bba7c8f114b6f4f302859d768e2c73bc503a21fb53c732bfc834d65c9e149a9338c14f502499b83ea82722f3ffa9ab0a351e4a046849bce4d0e4feb85f4acbdbc614f3e13211207403e49569525380b60819f7dbf3d4e5dd001189ff8f793fac60eda888bbb8fb2af372ad84098ae6f50f1737bf322dcd71619d5f7aebc5fbfa2771a006c45b4e53a8c342edce5d0c5cc5724eb7137796807f5373fc61f8d24e8abcc7c6e62a1bec248b8e11921bb09f934b17f6482b699742532f26facd775811b1acd0d965d2c1840be8f0ad889db4f2843c88b70d2916cbe5c9020a9388c490bf80a5639225d3da42419351d9fd57ecfa3ece3027aca2e8bc3810b27ffa3a4478920c291dc6c295161540ea24fb1093ecbd97edea63744bc83da76626d8b1c03666079f5b03f6733df2229739fb76f63dd85360ead47f54021e9794e3c75c0d53ba5c964342499ea620aaa9cacaaf9799eca42ea385133e325690ece7881a08e6a73b8fc0e7190568f2fac98d6ed373e3f4e4f784d149e1b68fe89492f148199ed69d1a79be96a3140a26b7f361f283c4a8b341dee05d497c126fac83873bd45ef780580d7415c4ce103116b04c32ccdde010f4abab014a43386241d5a96e280bc111c2a6ae05d8068202bf5b988a5313a5aff24b8e061ad14d9771c1fbf4ff1a6513a147fd7e73497151a41a70f4c9066977754ee35da4ae06acad69b9117ed969a513ba7c6dc232cecbe3ca6d3b13b1cefc58c29c73c8b5546dc08a8846ef2f76ee2ced3a9f2c2c6f890645d7bfe33498ac1dff53ad8e0073e60180418ea6f73ea3f7584ff4f096571d8386f92ffa825092cbdd5d298b444e46c4c8e51e644140ff59a4458c7c5c09ec12764e6f21531cbcd16239a22abacc7a3211086ba41504c34ab2fbb409f3851240d77a81e15bc93cebd74ecbe4e02fe02f7465385d8b99b6d7bcbcc32990df545075d7e97251603f60156a3aa12837d83d6a802d5afef482fde171de583a5d9b6ab7d5ad5900ddd60a7872f01809bdd0f1af2021a8de2e3e5b1066ac805df4dbfb5193bd9978a6dfc7bc7d9af3899214c66e76972b81b0fdcbc0491a424ecf9d2d1cbec8735bec2fff80f21a82f988fb84bcd067019bb3006e2cd3d5879a581847af746455569b1d9f1a888ecd49d489432a3a051cd974cacf936fe5cb907a33300861e2200501d6943f5893cdf1fe473bb067f00f8747718334352037454423c84058177b2737971625051e27ba0d57acec8e33b7b2c0ba146ff85039da983347571d30f91b9f176e3c6c1cb4e5a0e4cb9c6c898a11dc400f82d5e4967650d033efd44bd24276836c3f5fe22ec638ae0c5630866259a2933df887cba47558258fca6b2918eaabb94ac6e9dc7fc6da5843d95135f5c3ba59d80a4212b75e1f9e64b907d93c6b8bb50b85d4f24891400615d6069e700268759989c7a55cbb770e68fdf54272d27fe58aa8fb167b096522dcafa00bd3a89568edeaf3d4877d276e159cbf81754c4e35b80b06c8a23e993b26eced1d0d4d47bbfd8d3909fd1311ea48cd72cb340b31ff49635a842e80339a6b0e582520c7eb26355a040e2a623838b1100dbf682b6fa778f84685f75270e7979a243ef011890df77df8e176e442642a20767884b355bdf1e6fd915498eab7761063fd9582892c321cc2d4441a16344ec8e6b1aa5888a301683f2f9007b02fe43df2a8663b5058b0403d9a7ec14d17a134f38893127426b8daaf0d70fe332bf263a28716efbb0be69f5098d7080976f097aa4737f59643cd8c160467830da5bd185a3950c9574fca98aaa765adaa0cfc18d95cc7f61575fd41080d75eaec4b030448b1af2f2221c45727a14af5af54497b1e07a2a9bbfc56393bc0da22ff93a41f1180a783f5e5f1f5880a0c52f73ff59825b16d0906c26ebec0e338f8b2310fb76320c45eaac7e6ec823b056074468d8de0de546c1f37c24acb30d34065315dbd4a5d6f110669dd9637f4b9e85950342895a18bf80fd38774400a168cd37bcf868596dbf82ff4a889aba279444bf98f3e9120b22f2cf8b0deb95189aed713bbce401f431f188268b6e4a2744302ca4e5a55b7b7f2805fce11383be20afac1fe53e424ee9ca0303352f0c4981d1c53d871d23b4c4454386577b6670ed2ef6217fa4cdc7cd631cd4e29f0953eae4526c3e672c4c3bdb6492dfffdb6c32cafb15045f19e10d1e1cba15358d97be367ae3ea49948fbd7f7a3f7542bc04d15f40cd3f07fb6a34b98389661098de076a995aaa79d43d5f7987b262d602196b61f19f641b3288ed49a56dafd6e2facfd534b9bc66e66714a56d2fcb282c9b59b47460b6b3556688c42113f2b1ca7249b0904dbc41ebf8040cfd5b581b4035f101732cb637c054f17e33fd61cdc6a0a1ab110494c499e268b85978ea6a8ad3247771d792a69af794249c3577360f50ab5c7602200325526951969bd10bd1798477ce64da818ae16777dbdadfe55bda01bb49a4e5f77795067ca5879dd4c6223aec263b86f51b7ccfa7aaccbecaf3d9cf160729e83fc397788bc61007479fca177d6a773df95aad34f2834dbf22824a68a09dd262a99b9abe7eed66df0cc125f5d49467fb7f5f779d5cd8c6894bc6c46e7bda4e2f41ef145375b5b98f18de1a0ffcf7a6f1c5ec8f8a911d409b4f9e70c3542a67ea4c3f1c2b5a18ca8183180dbc341539edd043207a126579d5c9cc74d010f1058a5ede316ae7d6054fe31412ba61413f05a94a888b4cd240886d1ae9860ce42f6a10a7610af4cdc6d6d5fb15a7554f801cdcf20ef7151aa83a9d959a276c3aa0f3a3082184c48174cf4efcbea781991b7a5cd1c0ef5309d54833a9d82e3fda649b2bfb77483ae7c7d41d95f0659e2a150dd90906192d86ce4be677f0c1f6fa12e402265e3280d68fb931d6b0f7442c40cbb6941ce4c27daa8e3df2e4745f91bad70ca158307d13939a5509d87af4a131b41fd43b955fc37c50134805ed1ff19a91385f795bb620cc29c43196a3ac799b43f6315393a6e7a2c406822d72faaeff6ee4f717edc420000bc2d7145be745c8b7e7d8f72af476573614a710c8b4614e44a093c063b3bde697be3c8e5f40695906312dc921ac4ee7d5585fd4636ac178909c3120b268d5534d8eed0cbb5844c03e5947f51628a45ee6f59e80f840cf1a56042cec1d498a918ed34fca138c73d94ed6b0aff5ab450f1ddb78ddfc578bc87337530f7af959e0056cb6ca4895c059e798c87cde3906997e405d821082316fa3006f6ccd4496f7f6cce07d5d7cdf9fd2bc0e622576ec763a044bc2b4dbaf8a3d1637315858b53489c1655ca2d6f6339a897f1f3e5558242933b85f9186a39d5d84a9085f49f3d25fe0320d01c160211fb1aaf914f9911175f7b89f2d7b062c387a13a6612da24cbc2a3cf79acfd3f18128067d0ab6e8fb306bf3064d625c968396791120a3fdbd28c5700689a3c5305064557a9ba5812aa20141267043f824c8d06b2ca1a49bc0cdcc0cea2fb2d5093ada0261e29fa4c81fbb8f98e8e76c621a9a4c992ba11b9a482976f5b40487c55e71679c644b190b4c84c83af29d812df3cede2901e6b04986cb5fec1fee8d9b1968de88f9102db0286b0c957b0f3f13ce288de49b277d812ca114f346f3127c27b023e0b1f9a2e54414eaf1d8a78449106bf40e2099573b11f5639ebc3ebde19b421c7466e71f600e83f83af018910e308263650e1dc6c6710f06c42a2cfa60e9ed828c28772765a111fcf77bfbd1d227b384006ddd6e10420ae232ab4cc9d00c7b1974dea27c3e809370806467b710377cea4746222e25bbc6a09cb3d1228211860e1b79202dcecb895b847b53e3f7d4566c7543d844d7194f7e32ac39543e05106ba97cb81a47018081b87dafd84e4e257c5d77815048a1d7d2bd2ef8028619192d948d5c0c3c5244a73706a2c759280922fed9b005b2c47019dc1c08caf2684c8588a6258bcc0ac6009a18eedcef51c292d576fa84ef6f6e6ac8864bdcb80798c6bc1e74c169473fe9eb9a0784d209d8f6ceb365811f347269c61097b87e081c4f1647b2c3658b6357d885fb6b597ff52832fb796e7d5e1de36a3351860d4a6d48b65dac2fc309a7dacc130bf89a681aa2079a39d18aaf174af855427383e338a59f4fcf907f04a0402205a5347dcea164982e34c9d8dca05534ab1583319ad02afe138ff461166c17424aff0a2e5b6819f136c7fac71c1b35fb5a92eb622c4891b02df7571a9a9dc40e2afde1321c0c6deaca738dae1bd3fd5096a90e12d95ed915b50f0373fc048fa8c450a61e18ac8200854bd15411c73b0469ccd1a11a846232c170836ad37851a3e8551c8d4f3baa8dd77bd0e8efeaf7b14624cab1c73c92eee6a41aede1d285e2ecd997e11efe0edcab01c88e7b9f0846808c23ce14dbc42a0c000260d20cf90bc532d58d1871ef726e2845427a08bc534353d7acf47f429f2b8440e0d36537e928dd35b8aaa8d44602cd71232e700ea09cdf1010140ca69ef99f5518740dcf6120afdf5e72d46d39409ab5510986d16a3eff94a485899ac6706ad7b415b048b6b725deb4bb005031c3329e98cab89f476c2e2c242d9da1142e3bd641d165f91ad8d12c7d4509e0a53b97220923f2f5b213ab1dee02ece19a4c919c4b6c6b62daa2cb23ea923f8efe9d213dd15ffeea45313cedde812e84746a27500222632acc91b839ff3b415fb1bbac18dfbd1d49e668d2eb697c8675fc62186868b73e9a36751d523cf5a2a217a4451ad3ea6679be552cb88f36ac6f0aa217fb4bfe250ca483302caadc9df61af51cf28643ecd6306c341061d820e2dcdc53aacc072ddd2294ee730172d839e5d9ad0028ca71cc961040f278a1e4f233611d9d4c69301b23c3784752ae760eb58a77dc3f9f75105dd1c0f3407f820ead14725fafda428124958d2cac262e18436a3b2add1ad31685567ee5cbbb455a043872207654d40270a1b20a656d075e18308e868ac0fd64684693c748254b268f7d5da94bd3baac58f54b3dcc0331a5ac6b8dbc53ee966c198e24a76b036fb55162432f1cdd30731427723d4e89905b1b0a35ed36522aedc344c558ca216860e8adef8fecf433aa62ece0ed2a47623bd1921d8aa5f8a467141514336ade6885a3ee1fabb3d2d5d98a13cec00073006f74a58a3a49d0f9251a6473051bfe1f7c2d8b8bb74ee3b07ce167220aca813033ccb19437ef4696b088078616c8f583b9fb6e34b49459259a0072c746d5924ecb76a9e611c1806b8639f250274c90e50eaa19a2225190a3f1eac7d497807464feed2a75b84fa32d952d6e0500a1cd07aacc5cfa53b553f2ed38c2a13973eb55b086b3c257bb1d89198b1de5dbebba3c677a02ca7dda39ebd7832d6fb024edf1d77d4f688211688f03165fc2f750f28413c65fe5cb5d3d0e1df01e53359d721c41544e14a551fe3bd6e1446bcf017c14f21de0e1df05c5cac36616a8557c8b8fabb1351a620100fab0fb2f992e1799e186ad532417734df06c7e3c13f35581186d55c4dc1f1e22848a293b861fe97751d7aaccf5a8b5ee1b1d4c956efd8d06e8567d89c5dd4e4308a74cb1b1aad5a8b65f3c840d79d4387006f090bb5c85eb6e6161e5e4c73c9bf8f75fa04b76ea19c254a448738be358c72e85452a0eba3787c2f5ec81908dde00e07711a4f5df964f7036aabea9a5d5de88af767ae401faece2b648d780cbc8c5747905f6540e4995697bc5a91dd4cb432569f19c9e51865a94a31dc0e4f92b00c7bd1452707594298000094f6470641ea8513c9b2ede4f9dd0ebcbd133348364f03fe55d62244ff48200ae6beccc1d029683d960e325c6b125f0a4cbe6c5a2fc5d8ef7e0f85f79257b46d869be498c28212c6d0e384e9da0c1eb610bd3374b7a822d2fb5853bbc21de951775e0cb6646b9eb6f9ed820570b4e3ed65362c9baf9cdc899182dbb5b5ddf2f1f54ac6ea967fde6e3213b708b8f5344dd755eabf0c6f125fbf1198aa94db6cbf10691b3a7b150423c3b44c6781714d1d5ec6d3dd2d197770e404fa6821188b2cf790d3086591a20ec2f6ae40d2095875b19723dfb52140a608c284e76f922d012b87471f013f682a23d6d42680ab6ce711138fb491fdba4882cdb5f2af4285185253502b26af69b96e86f56172553d7c862edb775fa442beaf1406cc5129aaf24db61aa37fd11325dce9a212848b3112a3b1d93600cadf1d065de1685a04988ec90d696628727552ea5c5046ba659040cb16749d9175fdcb248fe3eb560b25bc8096cc55601aff1d7767cdd71980f80f77a7b2036f9cf8665b47a2f190973e197c7599ca82b69daa2b0cebd80468a60203531f32d32a9b285b9386b2b9899ff971ead9586cba319717b1fe60775c7994cb10d52dbf2daa1db03d9cbade6e8240ca76cafc26e56803919335ade96a5082ac56c0a2abd1cf70da8a92916ab2a9838f17ec3088a317cbd81a57deb516fb3c1c0cb2a1be3bbf0ac60a75a7697da99461798b461d6028af95ca27a2d42fd118d5e479397e1593f38ab30eae7f4d2b5c0686b6e52ea5228a20c6059621fbcb5ebd6662b62dacc1c5d5b4e7cb3e80317d19e2f75f6d6c2636693d26b9931906e4ed023ea9841f0c3a60b0a6d0013033333333333333333333ab6a1abfb54744564a32452e6d8c1185abc42453923ba529ce4c7cf845daf01769c35fcc662d919ee102400cd90b150c666b3491021e0871518517363849b32eee796ee2c08b1a9cc6f22f3449115fa3794183b368952849b4b9d955225acc25f06206474d2a43c8d3681f3e7a2183d34961ec549d7823d789a889200421f02206e7aad3e6612a5a52d2106fc00e5ec0e0b4356f428e527f71aa3243010f84b0a0e31507a1b4cde8b778494b82be91c591a06f4880043e32825c71d224a5ead478195faf15873b314929cf5caab4d2b1e2f81deac62b4b3f0501295bc53156d4850c27bb6913a38ac38cccf053ad5944978a93c997bfd5adf86a7259648168304024470d0e5876a0e2946abfa7642fa9959244d4b69ce2a8c14bfb562ead0515253a4c71f493fd2ecd4b492a742be828c571633a51547ba438c893597e4f33059f53c7288e954bb49bb2365db213c579663b66cff48d8916117d4147288ea77a1634ea66a799141427add679f9ca64ee1309508eb2818e4f9cb24f2c3badf45fab79a2adaa0a42c54a3012e2366e64d198dbd189b3dd2561de2a8805d58ba8a9053a3871d6984da6f94dfd5106ded0b189e3e8ced0ad8baf723abb4b347192344466b80a25db2311b564c347928e4c1cd7bf3b53c59d86be44d470a8a00313c72449921283865a58371d23173a2e7136cd97337fc24b8b96748725cef5172ae893ccb4e88d889a8d0a8080d8b8a1858e4a9cf2b64ec6dbfb693751e2a44eb3d246cb3b6deb4de29826e58c897e5d49b288e408493690e990c461944a4205f3cfd00c89a8b916080703ac231227a949b76d5027bcbe17511bf186c429b4c84df5265ee955a2818e471c4f8f0afa2fd929d15b448d4b301292dcac60a0c31187bf2f3b39e38efc0d1b712c299ac949b93f080808c8480e1b68197192428e8fa5b065d1ab2c46702420ad6da460243140c7224e5256722b3158fcd3a42451c451dda2969874bf7164c4449c6aabc41893c78d976a071d8838bf9b54b18ff5d19672888392f242c9ac747257107618e270194b8935c913d133b41d4147218e4989676292f1222fae88da4848b25182771c8911e22ca64a651adf7427c806710a16842ea5f39725e95a4e1067d1a64c8cb944ff9316382a10a245a320f1d01188d37ec8144c12a2554d36dc98c404c7800e409cfb67fe456d3829762971e4d8a2e30fc74b269aca29a926f9e687a38c7c570e0f2d56f7e1a4043929c8eeb5942be7c3f14ae64eb7b1630f2729b6324c2ee3688bc90e3d9c57545773ec32fd29f008a82d3aa0230f2761f5bb8409311e0eb3f9296f31ca7d2137920141c71d0e1a374c123332c4eb49442ded3bec703c316b52aa3358509708928bc0468d7275389f795e506adb4aa5121dce27d7644aaa2455ab267338862f159f57fa649a12391c4fbc4cd94288fc8b8b889a094810f2c8b30849361081472e011a33729460023890169e6e5000a45c00fad01187535693b2f72d7eff9788a899d5a0030e870f6dd17e2c55bb6544140424b12274bce1183559ebcef8dcc69605f21c23c56ed010818d1a7b9e6ed848bcc30d07a1a74a66ec37d1d67b162139be86c84848b98e369cee04b358df4da631dec186a378b696858ab163e51a4e625232497ed152b25d2a821a6fe346bb6144871a4e637a83a8641627ae2ca28623c7888d1a7888373ad27010da9fd5e3e2d61632a1030d077da7c47819de15468ac3739400033368cc90c002be02c9198e99945c6174091b9e273683c68c19584860c648020ed3263acc70b41275d49458b3a034653857981284dd9ff81963c870ded1bfd9abbdacd2348693244951998426f9737d311cf6548432e5fe362637b608c9813ac70d1b3368cc7015d4c800b2801eea08c349507bf5314918cbf78aa86d8137e800c3c147688bbb6ea95f7fa404688b90911a0bb295e8f8c2d96212936991f34c5a23021b37d2928d0adcc0e2060e1c88022020366e68a1c58d0e19e9f0c279847e6db9987032425d3845afac1517f35c386cbe4dd25c088d7576c7164e195ead3548bd2052a385b3cb9552f22554ea4dc9c239eb34868d3deb14190bc713257dafd2a6a4d55f415382a6d3f4d2808098223aac70126a5285ae3476212c0ce8a8c229cbeb684b666549dc3aa870b62acd55259ce7858c88dadae898c2299718c35f37455a3691c269de42c624f3529512c70b4147148e36a2ba2a7e3b4428b1d0018563d26edf9753c5843889a865c7130e42891353265d32fd9bda4287134e9ae48f4bf944b365aca309e7eedc205312635f31165103010101010149098180180620111d4c387c9f986e34863e135ac261c489b39d7aaaebf71a8c820e259ce44b3f91c1b2891f2f0987fdadca1546a8996591705e93b2c9b793d42513b45103e5e840c711cef91733e512ac7e531a0d1d46385c74fd983f2fcd5d01a1a308e73c31378911b9f7a1abc00c2c243023c78d1b18c80e221c4597bcb989ca971c0ee1b4e94dc91fa1f269b184703a4986f6be332997a406e1bcb1191b7b5fb632d70184f3a5bd4cba2c8844e8f8c131c9fe8a31cea25acad8b8115266f674f8e05c17bc522ebf0ead931e9ced6b764c26419a383d0f4ed2447e9a96c5ba0fede0fca22ec874aae94453e0d0a183933093927cc2fae5ec7370902585929a34fedac975e0e03416662e9dcc74dce07c326a10adf1f32315289ea0c306a72a259778eed9b97beaa8c141dd6bc8baa6d5999e06073532be491a53c89e7cc70c8e7f627ccffeca73b364704ca16664d388f13669470cce3a5a7499b6b44cd93b60704a53f2492749f21a7bc5e9e46f51445d719e115aff2d4d4aae5d2b0e6a2a8845bbd2547792ac38eb6f36531f5a92c622e06215c72f2d79720875131daae2602a3bd6465f12e42ca9389ee456cace4c66fe101527e9b372d5735b629d051a0971b3324282ae91a32c052e4e712ccb4cca52e83cedb3290e1a64f0f5d3d5d4574b71122efcd62a0899f32c521c67b4250d61a5bdc4378a93564a39b522cd54d44571ec53c25a52b94d29af43719817a554ccbb73cd04c5592ff98d6ccc0d9fab083e7150bae354bf9da0521aebbae0c21387d79372d94cfcd01b75e214f4cd4a94cab21faf0b4e9c5f5634e8535517d6e46213c711b6652276f28de645d4fe4688c8087240a289e3fbc92409e2dab72fcdc429c46f54760d97e49163e220eeed7531378961c64b9ca48b316a92df997194963866d6d2a3ea23fce2384ab0c5d955e270394c85f35313252a2e28714a32d67f55e998249cc4b9b22925b79aa323e51bc99c085c48e2a4aa4a6a13e533d7c573118993560c6a4bea86b06c042e20710a939b4fb8f0a969541781193466d856c1c5234edf6562da5eaeb9a28e389f361393a73b76c281c343b6405aa88b461ccdc4c5e9bd6513f616d1b32e1871122a467c968957bd5a5a59c4d95426319e262d13de89a8790e1c37922b451107dd8ad7d4922419ed2f0c2e1271ca96a926c6b4f8f89968e0460e1b0fa08007422ce00211c7a4d132af2873bdd2b37071885352536d26ac04fd176388a3582a95bcc289db5ab935b828c4498a307da6c2055d13218e5a25833699a74e261d059ea3045a8488e4a87102633788f3997bd556bba8724b444d057150d2fcc95d056b934b11b5828138097772a2c474ff975844cd05208e1d6a739a8ac92bde1df9c3f92a9624c7c64a7da62fe6042efc704ae9336f0ebfa04f8e036de138b658d3a23be0651570d1879324bbdb296d5eb7c9e2820fa7103234c786c9d5a113514b1a13a031830337dec603f670fe4b164adf4e52a54911352d4250e0c58a1e8eb184f14b5994e8d868115ce4e1943d3e2d98586781fa4616862b708187935b694a6a418bbc688d9011f7bfc351ac2f4668cb8b41dc24706187d3883021bb663137001775385db57fad49b941efc6e1bf7438cfebbb98e0266e1af14fd0052ee670165de29820b233699ada851cce3222e324d50a198465e40a2ee270b476930415df3a7a747038a7a6ddaf14c49a7825eae20de70c97cf4c3a19a52daf00379cf532e39f4a3749b4442289c80872006a1b37682489821b27c002044464048998369cae844ddae2e574f5323103b860c3e9d4f7492af86fccea226a77b586b356d6f5afbeacae4b0d07b1492affef6c7b51c2349c464d5d361d4a8ac9d8a1e15c92b86023532c9394a488e2bec0c5194e49526d0b3a6e2a292d262ecc704ac24e895767b857d019c145194e5146b52965597de393e124a537415bde18446590095c8ce1dca2444db443759b24226a213792b1e1420c27f1c4e83dfb1159d1ba08c3c92da8c7ff7c885591175c80e12ce7bba74caed8324227b8f8c2498cd1a29f12cc3face485d3bb9baca557e5f761178ee322738b95a01a4ec985f3bcec462faf68fad52d9c729460999733e82c152d9cfdaea489fd19fe3b15419f9689ed8a93da4b176fee458ca515a724e3f4c8a4c64c880b0424c434e1c18a83721d95bdf49bd0513d5671d8b3d323c35d0c42095571124a56486d6b8f71640b2d7088a0950a78a4e27861d9b2749e146f44651ef040c5f9cc8232e97ab62fe514a7d3d2aea4b4881373f430c5f182b6ddd924a6d251271662c62ee1518a9305ebb7a05fab72ad07298e75bb5a52b2d1ccadf118c5e95ded84d913e3218a83e95845ef4ba24b5285e268165bda4f0a5293a01451d3000888718407280e972dceda5af213773f719ef1b70cbfa33b5f0f4f1c936852c80d354ae59276e230f2f4c97c0e0001611a3466241b4e82460af01a38b000010101390f4e1c46a49a36dda4b2c9aeae4ec46313e74df917f4bdaee48b3d3471ca7dba31fe82e5f13113a78a1a43c69ccfc9c53c3071924de9117264b6d6fd66d098e1038f4b1cd49d689525f94b38358d1987e9016743f0b0c4315c1431934f9b7ccaabc429994a2b72c9eef2c8831227b9f7be6257ef3189e3e9baebb4a0bc5a5611b51c23288b901c35b2d862a43c247112469a64722dc3b7684a4063c60c0b60c002129841c302129831c3022539247844e2ec795aa54edae09dbf889a086cd41871678007244e2553b29421c4892c298f479c426c08e95de1cc4cccc311e74b91db159f5fddf810b4112dba036aefd188a38e7cb86fcc4b9b37234e493a5b4d624528bb7d11c7b8f771ad9b1571d60a15dc432fe610fa441caf34558a322b228e2637a3f4bc7488d3e8aa0c26e3c6932e6588ac3390635853a769423bf349529047218ead31c8be94efc5434688639dec35a6a74da8d406714c29b5e55c2e2f5dd1f610c4417e74655c562ba67a930f7804e2246eb6399997c4125e01e294a167a3088b299a9b7f38ac8ef80ef3d1c30fc7f2ccafcdaf2d4af4e8c359fdf5459870af1a631e7c3829d5ab376f3e053c10e21e7b38a5133bd94325e92e9c20eae19c596d36c85fdca09220e6e168ba7253e3fce55bc5c331e5fd51a1ad153399dce17c9e4967123e5acf7a3b9ccc2b6b984c21fee292247538ef95e58a86662df1eee870503d152c7508ad1b4e10e7706cedbfd1d34b5ebec9e1783f5fe9d2ac94ca0c621c8e6752f3c59dccd491c1e124aa46d54dcb74af718f379cdc2ab97bbba8cbeaa11bcee27d3e76628511226ac3a9f2e93dcb1a76418ed870ae0ce6735f4a6b38ed8c5237a9645c91aa1a0eca4c0cb30e5521b3958683fc080d7ff964461bd170dea441976e32214adbbb331cec7ef42fbcc9275b6b86738d09e23586d18da995e1f01b84093d6ef3173d32a8a1c4bc6272abc718ceadaec1f485fa8bb1cd8187184e6321f4c6976138e54d27a355f5463379309cba4d2a154e2bdd64fbc249aa132b44c678277e79e11c16e62f9f8951b3fe5d385fa5d44c31fd574c31170e27f8c6d9f426c9d77f0b07959f757a71599450f1d0c2a94cf68c792b5488c51e593825bdd87762525bd6241e58385e0a95375dd03fd2f21e5738b8c9d7743529b849620f2b9c4d924276f35e3a39496ff0a8c27954868ca6f392664d7b50e1a48489999b5cd453725338986cf924b9945e0a878db1de10be89c249d070a57992f08d690f289cabc4da67c693abede2f184d32653fd917bf170c231b76c97c956f726f64d3889778fcd244eb38bc5830907199a4dd6d9588829dac16309a7fb17f17dd192699087120ea67409ef0d4af68d3c09070d6a9394829e9da04a9070fcd7607b95498f231cd48dcc74cd242669818387114e2daa33986077f93bde15e16ce1bd92ba2c9632d69d133c88703eb9b6acfecc338fec8670ae132709625f9bce7242389c5de83dd1435c38fb2e0887936f540e4b3196c9f200c249cbbcf26e379c124c8f1f1c4cb788f9c9964ead2d041e3e386912372132dfc512d51e9c3289d97479598c49361e1c33d5de4f9811b7d8a2153c76700e712f72192c58890da2870ece2675ef66460d12c1230727fd35d14653fed4d9207ae0e0ec6da192502a49274ac9e306a738b22f8d306969734f21c90632379218f0b0c129eae8492127931e5379d4e060aa65524cfb9bea1e343868499fe954a808dba4885af198c139d4c32a65d497596cc4430647cbbe924e0a7372c80c16c12306279574f742882e61b52578c0e0b8297f9b0c9331e9682f5e714af221dd4d4513a22c49e28a83ec8a056dea4fdc986ac5495b55a87cc99455095971d6501b6bf3a4ab8bf32a4e3135f69d7c7739a3a78ab3bf97084d42d544ff527192eb5a67a75228ed3f2ace37fb97ab2479529de4298e71639f29459ac8209be274b95acec2f5a538f87909b1af30f59991e2a0276ab4e0ee280eae156337c38593a4e54471ec73cdf1ebe2553587e2a0a6e473cb5d1b2da4a038f79a6082ca275c4555e0f0e21387ef12cd84679a17edee5e78e2e0a226a992a4cb74e294548fca5192b4e94f1239710c1b7dbc940669c9fca58007425cf0621347d13197629acf4d41a589530a1bca7e834ad598c9c431ef9ac5af8e32b97b4c1c2b754d8ec612e456ecc5258edb1b2b29395a9409fb0b4b1c47262db1da66f482b012c751492a9d1647a70802929845bca0c439f54b5f360d6e72749338d89e9874a6552d45f34212674ba17de369b7781a338717913826a9f29bda0d53317e0189d36c52aa73922066ec2285178f388b4c796bfaf20993ef0b479cf2f24cfc5692dc42f6a211e7f88b6994c688539292a08449626788b52ce2e8a5c5d7675cf47e7ba18863fc89729574938863d0aba4a25993596e1071da3bad6cd167115e1ce214dedafe44dbae5116439c94fe2fa94d105fda094212db620b8483032f0a71aece20b3578a51512f429cf54fa9ed33a9b54a1ec439bc7f3709afd1a276419c3747bfa437d9e22d1588e35adca668cd57b763c81b5e00e2949b4b12d524e93f9cc4d8f6cc69273f9cb4cb6f8590a7cba4ac0f871761c233475bc4457c38ed66330d9d3e62d9dec331e68f0915b33e177c3d1cef52bbdba8601ece9b1d1b3457dad00de1e198f46dc9969420e64647c38b3b1cac3d65638a675953ee851d4ea3a4ffc99982129312abc371ad4ec54c526636494c8793d279a26df9a93fcbcde1248e900b22a39ee86bc9e198dd5e93984f84a5c53542f4b27811877326bb3749b6941bbbf2020e2755932a59e89e0b6279c341575a859c54f2c20da7f0a1c76c4d890ab7bf68c379d64c949c2b9bbec7176c3885babb202a7cb1869360ea176715d3a98abe50437268ac245f5763c4a4e178ba43b926d5f49bc268388f4cd1e1ae3fca1452e30c27b94fda26c1ceb62fc90ce7cd6f172caafda20c27d1f95adb342645860c190e7a7fad6153c812372a8a1763389d2ca1c4f47955beff85180e3286d0eb332553ac0a0d1c3590057c64e454f1220cc7b0f94ed4944b1026a96038e8cac95842888c31e72f9c4c9c52174e2ca3f0c20bc7b2d257962ab388a65d386979cb5fc209e2c259df2c63bcd25a6513b391175b386653929a60a675d43c2d9c5470cdfb4d514cc6f94516ce619fd9e4e24e185362e16c71ac3ee49bb4ecf60a2775a124dda5e765ff0b2b1cb6ecd4c2a560361605ccc0420209500a782044e445154ef9e4b6786197bdc471a8778d2c32d035b2184940428583daa57a99eac93ffe8b291c544d9049bfdfafc9165a34e2a8c003520ae75bafafebdc2bb14ea2708ad39ae4b24927d5e443404084f0020a873139a637865793f26f2ef0e2092769334549532944b6c809a7984e5242fe8413adac098715ad14fb3e79cf9209c72f91c9748f8c2749ea174b3808cbd2a1d7a43a21b7e485124e3b5a8248117acfdc0fb181da092f92707e773335fad5c48725b811b24978818483c595c78ededd243e928587e0b8a1e5c5118e9915764c584d93c7712344ad181c9ea34642e385118e7d99e42a5e899cee8bb09abc20c2412f75349f5c23b6c4396ca0461b30b705d202435e0ce1989b16e626ebba7a498819b281a30223098042bc10c269d34c8ab72ab27bb7201c749b4c19197d54cc8fa4c023608070b2dc54992aae173f389c9bfa931b4c46e66ce4b8f0c207071574a9b52b25595c5744ad78e1450f4ea92e636b92d0b754e71849b00b2f7870b87c9edd5dfe5ff9bed8c1799309b9d27bf2ee9988a8ddc85158bcd0c1a95b354979bf84d73211f0220727a975e93257959cb75ee0e0a095928c9654b052da3fc046094432d0352a072f6e701613d39990eee12eb2b7512301c6cccc2cfe563251a1f286dd89b36b2c0d4a0caa3693cf89a349db79d79a266f2d13623380b189d358f64e8d7a6ba9945580a189938c35f3b6a56a36279938dc660d9b92b6fd265701100318983867df65ccbef5250ed2b26fd3bb59688a25cebe4932ab9bbb0c318d4a9c72747e695162e5939450e260a19254c1aae35cbb49b02633b229752a8983b4935c3b84a9a04784118983a9ec7c8c3441e2b03944c8b71ab7138d19603ce220d2ce4ed413541825c81127157ee156eefb2ec368c441995ffef42e61a6368c38653f493c13f4476ba42020c9224e724ada8712de4fea36024311479353fd5e479e88c3c865b659af0ba3160c449c82d5a953dd3b5f671fe29ce5262821defa4b8c226a35466a181bc9a2468e12140086214e292a1bd452ef45a485b8449fbcde5012e2143474d6d86b79891b40c018c429979a5e865222040c411c764fcc7d5599620c3ba4c008c471c46dc91772b6322e188038c639cb98719a5ba9ca00c61fce5623f3c539d95452d80fa75367a62e09e2b75268fa701247a6d6246b3e214c091f4e6f9b4b12cb7b3973df801934663080c68c05cca0b18753de91a244f90c1f3a82a18783fa6ddffb5989f4330d30f2703c95c62c6d107516e478389728db9433b88abee60e878d9b9fe9942cba6187618753b509422625fc92ea7f068dcb038c3a9c4fb46b0af667ba2e498763daeb8b6d294749959bc3d92433156ab252107f228753eba9a6b1ccc6e194c468dcfc172edb9ceae070d61c7b23cc432f3420203980f186a35da9585a4cf525992232821c3083c60c0accc04202202022e986835ad23d9af6a15a646d38696e0da1eaddeb6ae300061b4e42e6d59d8da7316f726b38ec2955abefaa7519cda04163061612d0000808266380a18663d68c8fda9a143f3427809186a35fd298f274ac010c349c724d454d739226e9ba1630ce7054b54bcf9cb1a2c9d0994163060e4fc88b19cef66652e77e58bc744d190e3f1b84b6f7d020fa2a0c6090e17426a56a92f48bd8288901c6188e61b3525bcf0479133c6b030c319cc26bff68c83cf22cdd364c0d30c2703e792c84264bb9e5570a72d428768001869318a55a82e7092ffa041262233546dc868b00e100e30b87939a5ee2eb1a6239120f30bc70d0fe4cd125c55ad4ce42cc981f6074e11844cc5899a0452c6d40404040ec46ca0c01830bc7ca57b198f7fe90a12d606ce1209324c5b2545c0acf68e1a435458e8a88f413d1e0106064e134fba62c6fd60b8bbb0a010616ce39bab4faa5778553ee59fc4dd1b5c2495bd692f2ca86b074a9c2e1b36492b3aef2769f4680418583a6b18af14ff41a534ee198d456f48c1e236b7339020c299cf352578941c44f8e1885936caa4a058d278b7a1d0a67911151cdd7b436499e70beeb36317ecb68c56c0205184e38aa4511dd4b29cf5f4d389750ab6e4a93250a3098d0b78ec58f09309670521572ddd374abd243634d80a18453950c966413da6bc329092731493245cb7bfa5ad60318483887d234b3f5d35dafeb0807d165a533a5b52433698463beac2f9a79a2e5138b70eccae4a1c45758d312e1aca57ffe94f8a12a6b4c42041843387cc9d95e8d9937c95a3c802184931ad73649f80dde9d29028c209cfa37a5be24fd4634a4051840385c900b336be94bd6f507273f0fd3cc97732df55c80e18353364de9d582b957c97b01460f4ef2a6bc56b99a47890c95008307c72db92944e46c6a6b07c73afdcaf533a5a9c49325c0d0c1419e14ca2c496f165fca1b6fa3c61d1560e4e070693e356d0c7a2fe60c0930707034490e256e75e95b966e7010db73278ba8cd1b64120d306c70f65eed0df5559f553a038c1a1cd6fb7f4b4dce50974b20c0a0c149b0249ede767506475dab71b55426c9570701860c4e792c63f210af545386980b60c4e0bcb984abd0b716646d2a0b306070f8b7d210616e955bbee218a4ef9bd6c5654915579cba47fe46fac9dbbead38a8ae14d3c26e4cee222b0e4a995232a52406d1d4db2a8ea6fb2666f454b124dfc2872ace956ef7f9b77e154a5271128b2327c8cc702a48aff0818a53988da72491263a1b44e30b1fa738bbed9ea469a66469dc1407954be6ae4befd3da4b71b293562cdcc8ac9d901487ed1a25d37a53fde533c3c7288e494a59e3afd7d5565a1407eb0d377e275f5a3e14279bff90662b325616288eb6265e9292d45be28987d81a3e3e71ca2647d659ce096ea6278ee9b4ccec63aed2cc9d389850f99149888c3f160808274ea9de84d266a62aade9386ef4c7264e7929377f9a2e8b7a061612980102a28983bef92539a29289b3a9af4e79b9b7f20f1327315c95789717bcc478068d190f3038878f4b9c2c63374c344144f8b0c4d1840dabaf259b52f25d89936d34497989277949529212c7b694b6a2f94c3ea54de2d8736695dc2cfc7669923897c86a2a338d259e94267c44e2e4a13395246f897e7241e29c1a6646491a3ee23897d3b5cde424b35188691d3e1c714a929856bf152e33798d38ab88d80d35fbaf5dca22032020216668f0c18853080f69f19220c39abb88d328319a9adfd7ef162960068d190998610109ccc8127c28e23ca756c62cec64e82d1147d16ca76241b4a79d883825999214632a25a368778883e9d125c6c5dfb4d810474de12ecd49e9429cbe4e4f7a886c163f11e2248bfa2dc132ebe4ab38828f419c64d060d962456f9283801c123e0471f84d67e1eaca6ba34920ce779b41fa657f4b620b88d3550ade7f2246da5fc8f0f18763c69f95a59261c9f4190001010109b194c3871f8e6eb9c9af5f9329c9c3420252f8e8c3f1c48eba569b8b354a4ac087c3788ede9b8e9217fcb29103c3c71e4e17e629a357ce4328f570de39339d49164fbf983c9c94bcb2986ead3342838763fe4bf2c8653ae9c265420c93f07187932055932ccd1a6452e9910f3b1cff52e65279529c4d973a9c7545dbda7c263994183a9c947892a4f3843641e58b161a3ee6705226bb6fd07ba76564391cb48eba57ecf5d0a1bf389c4a8bcdc5942a8766ee6fdcc06101341dc2071c4e1fa2b5f9de4cc6d7df7010cd962a8956a1d3a44c0d3edc702e7ddabda277f6d18693f40c26fc5d529992cf86c37fdbdbc971620a155ec331989a923abe4953c371f4f5627d89d1d33521566938885a65ddf90a6d7ea221f6820f349c946ef9cc5ef147c6dbf8e0e30ca79425083b3929733ff830c3f9448febf451e2b7e8ca7054d354269b9651d7350808143ec870166923e564b9a079d445f818c349beeca37d835c454d6a88a5e0430c27994a99f81b42f49b6c09c3417358d2906fa2a3651d7c80e1b0b16e1e5baa2f8ffb85f35dca11f7b2621a745e3889dd78a6eef28dff8658760d35c247174e42e48da86c3df96309b1e15984e4683b077c70e1a0b4491b17637a0819db40d12d9cc3f7926c2bf1cb1294e51c0002a221c5b4703449bcd4a77f6366d4b370342996be1432569a287d60e124e858537ec2096575b9c2b96b936ba99d5a2a6d5248f06185a3463d65256a49d229c9037c54e194c7d372c67419767321968e63061f54389794ca84ac6c563b95b78d1b1458c2c7144eff39ba7159a6e59e144e62512fd9bf8611b94688999e8f281c43a624fc6cec5753b2c6830f289c36a9333d9aceea7c7ec2514c9689bb92ec4a962ef870c2492cf115150d7e6be21f4d3865db2a91ed9209a7d25557cd6c19ffd512ce6de24dfec922251c4e4b0c9536b9838f241cbfd652541831275ff58184839b2cf576fbf3934a0a043e8e7092e554eef9d99896ca8711ce65fe7e964ff35184c375bb99afa92432459111e4001a33b2dc8d1360e12440592840010b48018e1b5af80440403885a4e9e18308e77151eebba1a4cb91171a15984163c6d102c78d6fc3c7100ed2e4adadd3ed87104e7665622ac5ec9235ff08c2e17d73a56eb4be5c52ef1800014920205d0304061f4038c795c894d371d15da9467cfce07862f30595bbeee29f2491f8f0c1f1a4c5ed9764e2fe941f3d38e92a9b2bd5733a540515f1c183a3e9ca65793bd4bd4909b2402608a9f11f6233b068c0165a3c20050a181941160071c2c70e4e627c4daa379f5ac96f051f3a38f6c8c6b592cbcae023072765e2db75cd28a984930f1c9c2b8c66889213370e888f1b1c73689272defff25cd006c7246490bd932a35389ffc669543a9b4f7ea070d8e264c69cb6d72ad3df4318393b696d6930f09a9010252563ddcf02183838f5413ebaf579155033950160c0001b1e13972a02c82f01183f3d76e30a54de8b313fa80c149cb7f78cd49319b6e11354f00c8c0e315e7ccd91ae31bdd8cbce9cd356723ce334ac8bc39212b0911230e9a596f37c996e43731101053467811c7bcbc17ead76a7e7610900ac850c4c9ad33adf777e346544646426ee428d79e6ed0306524031b01198938956e5f1b3741834cbf889ad9b93365846520e26c3fbfbb317765d24806404070241c2ee310474d259ce9122b5d5f4ebe05ea110f7963387c044b86218e49be54f724a5f3e4b81067358d49949153d2a509218ef1fc4fcc7c4ac9e9d3208ee297b726f9a668b120cefb9f7f9d1706e2242a2a435aefd7890b20ce964b570a1f292696f41f4cb1272ca21690c08c09d02881e1c8b105c618830c3f1cc4871ce131a74605918c3e1c948fa524e5e3ab74c7878398c6f82a1af4c9a1b28753106ee2749f2cf7af530fa7b0bca6b1fab24949c6808d0ac8c8c3f1946db8adb878f7c9ccb3e035830c3c1c2be6ba2af35b8ca7dfc861e3014a010f84e090718763d021bb416957861d0eef268ea5efabb815acc3e1774f05ed1926bb48e970129a4649d28f5e1231cee178322dcfbce413f43e1972385aea9b2bb9fa4fede6d220230e87f96cb71c3b27ebbd0c389cc692b4f297f10dc7a441498275f96f6fe78653780b6a845cd5f94e807084e428c1165aec40461b4e7d92ccbbab28725321776c389abab832f2eee2978c885a48ade1585dafa9bdc49860bb886642861ace6f72c34e9e20fd3aa36390918653f5c9ca3342a4a706a1e1a42db4fb48f598355dc619ced526edb674944a4b926a84d8b8a1e901362a7014f0404800e420c30c87cb97ecc43bd1a42c2732ca7092d1547fba659bfc36194e49ed9224ecca848c9a8c311c946b3c3158d8e02baa840032c4701293605249e9c7b64c18869374a2fc887f8fb9a632c070ceeecc6ad2cae95097889a096a2413d458401632be70d813dd196fb252ce464870e3860302c007195e38870cdfaf999496b99876e134b3267be336b23423a23672638b934d90c185c3e7a74513dff4862bcf10938c2d9c6684b4ebdf1042e9c5ee6568e1342aabade8fa6d5b46168e25fed56de1dfb45f26030b27b9a4e94b16a5de576f838c2b1cefede4aa9ab04169df0a47fdcb95de4d28499ab0881a7a055ca4414615ce97a14e9cb45d9a4416512b1b810c2a9ccb64861255593fb993318583c5982461b45c2691c249b4f6935464acda84a42c6eb4086cd4d8c29d042124b8718343123721230a675f930471e41899c1000ccc60830c289cf264af53a2ea785b58c6138ed17dc5af4e2ba2664420c309e712b446ff5556674870e3868867916adc952dc868c2f132c65862d9f49b993c292890c184933ca34a5031ca4965a1828c251c4ec986cdf8b260d2af8473c6494ad44b2ae84c56414612ce792755da755ed8341151c30ad010c95183032359649180193466cca03183c68c19584860465256a420030907bdc14f941275a3792da206023292a306ca38c2b9cb4e939c7b622b3e1135c591630b194638f8cf87f8a82e59d369ea9620a3082793ee5c4d8950ef2123c2d94c53994a292cae960a053c10a20119433869d816ad273256d989885a020119423808a9fa558252b14e52cb08c239df24b1f246bfb72045813b000424a1c0456400e164c25b89b96264ac45a68c8c1801c8f8c1a94ac789716137988565f8e074ad799258ab6c5237193dd83fe334e789b68b800707211b4fd2569562bdb583e3cf5594f1d3bca1611d1ccb2e493f2767decda1c563a600e1c0818ae3b8d15ac8c8c1497bcd87feaab7522b0ece7a2ac534cc9a3062bfc1412fb6966cded8e098c29da0cefcfa5449528383bcb2e83d6a2e9420cba0c1714b54fdec85934ea949010f847c40c60c8ead7f31975f16119b89a885545595cdc04202336894f641860cce6ec265caa5444b5c2f230647ebfa50dba07a322703062741575f8a777f21478bf18ad3452f35e1f45e5cf55c716d9b24a93bfd62b4e278a24ee9db662c8b9388dadd0c2c1a50108e12a0108bc18a93a50be799afda6e6b11b513b80db3195834202dc62a0eead24acab929a60e550c551c76b57594b8e637e918a93865bc693171f52b6a490c549c648bac983abd54c90c2c1a00023242821b3744629ce224469e94cb64a6385b8830d124614e7b2ca538052d6d1a94b0d5393f294e6fc2896e324659a81e03e78318a338cc9d9d94c2e829134f44718c934ff7ae4ae7ef1b8a73678a50f2fb59e80ec500c5d99289dd3e62b75c2f9f389bead59fc99864f7ec89c38c50befea9232e8977e2a8d1ec4accec54374909278e9bbdf1643a258495691327f9a4696ba5d555137e2186268ef12dc655d634c9843213a7785212ebd8ca3e2719625788818953a9946942df05d5695fe2e8afaa6169c4c532dd12a7d2959dbd6d55e2b4ad6d319a899546bca3c4612d5cfa6e1265c82ab1f4ffe64e12c738d9aed48eac1d153f28c488c449664dce672a29a8a6ee2071deac739a84aec8eb7ef788e39d05216e77ba73c4493ab9e3224eb72c095f234e315cf80b42451b0f25461c5493fb65d5c6dced2ee224bfe92609d69b255c10157172cbb79b7ea39dbe869888b37a699cd013ee041dd6126220e264eadf97513d445ccc28c438c4517e4bc574b726c82a211a82554d52978a4a825888931eb5361ac48e2638429c0493ca44e8957c96db208ed1f7948a21323a2e9d8238b928b14d1e37e5f61926c408c4496f4a13eb4f056d1e2302e2645be1cf527a3339eb3f9c7f748d5227b64831d50fc750319a9216f564bcd687b3464d7f797345dd6cf1e114fb62dcfd4b269fda93640f277135caf23ed3c351636a290fa7cc50a7a48626956412443c1ccf33680d1a3344acbcc3c194ec57b2624f7017ed70feb73071f3dde226d43a9cedde2e479d0a5a464f87c39c50eae797de24b19910c31bc498c3497cae9fda50829ebae4703465caae1871389f76195db24fded92e8310030ea7b0a27666f4ce5598450731de7052828929ffc88e13743d420c379c52b6cb2f57e2a9254b1662b4e11c2ac3f6c5f82b3b411b3522703783186c38d7553659adddec7bdd104b8010630de76e2d4d33c94e79996a38c68dea12b5e2426759e3c606424c8b1869386b9e6b892e27f3448d86a3cbe5910d3fd2c53fc3f94daeda24fa82127da1420c339cb2a55d934aa8c625b1b1321ce4b9fa7f7889be3f22c3c1e72d9412a37a731bc3298c0adbbf92c208d9300d31c4705eaf4d9b2bb4a5e5cd0531c270ba9ca25263cf64f01f0cc7f0bea943dee9cc178ed135e7a878e1fc7b66f9d737edd63c82b2a0b14688d18593e993bfe2f7a486bdb9701236c6cd2735dbcda8b770304198bcbac992da64da32c4d0c2b9d692d41b53bcd5f19318593826d53369446cbaec86701c101084c36bc4c0c249be8ddf2689caf9f75ee15c1a43ead749b71e7a2b1c7554aee9305153291ea30aa77427fe29b9ebec664f418e1ab683185438c6e54e99d717efd2838090600469113285a39df42253caec27bd278563d674425fd07ad205a1289c6ccfc4a44abded26998318503849a2c917d4a4cc355b79c269f3456fd73426c9a0e284c35f12c34273e5f4cc36e1f839c24d05a997d562c2d93289eb16c4f72413e6428c259c45e9e768592f21a3e9410c259cd2786d961126cbeac783184938293196d83a19128eab72ea7ef7cc33fe231c4b50923e492ddb6c0e6310c308a7b7b89de6e56e629b8883184538e688129745fa8d6c4884184438cbae8e922f4f50e2343186703e0ffd27456b897a199ae068104308c79e516f39414138989cfd96fa5a77a68070cae62d626ed64e92f51f1cd336679498ec0cb30f0ea3fdaa2c553a398bc5e8c16934499f1b83921ea9a10508488fd4d022e9420c1e1cd62c9be613993d8450093176702c25e554dfe5849b500727f924f9c43caddfcf33460ece79994cffa51cb335c2c151e3d77de953fe1ac486183738bac8d1d6a0e49262e3d9821836389fedbffefa8cda932c428c1a9c94ca57d2932c67f00b0d8e5627dd9df598daf262cce0d82683ee0c9b35c514951fc490c14914bd162bb216448b1b2306e7bcbc235aba5d628c890183d365bbf79eb05f712e3ba9e669192cc66c5c717e93a6a499941a74a9b4e2ac57924adb6b65e2172b8ee9629fa60f6162ce985ac5e92ccd5c2c19454765aa405b3a4d2a4e9ba559268608d323a2e22449492ef1ab7f0ae8290e7aece4e7babf4488a638c97b9b269a05dd3b2ac5a935af6ff6aff279498a93e816c7c3ba519cca82bed8341fba440618a238dcdf9518c4a7286d9b0ac5e1ebd2eef3fce54d0b8a5338513abd927293d2fdc4292669f29ab83167578a274e82028fc4a81452c6a2501c0c0302411083000424bfaf0253120000000c120f860332a1542e90f3001480044838284a32361c2c221a188ec9229150180a8583c15018100ac431104541180d9440a63e9abcca0b01f330bdda343407612c2a34ca67d3c698ca6589624288b64e6bfe540dc138937c4498d2f2dfc1ccbd401ecff1eb31ffea839ffc2cf4a44e3e0cb71f76b83668988f0f2fc04007aaaa29ab6f81a29bf2625465e5d7cc7b82c6c5fd4d7223f3ff87a696cbba9adb245a5b8fafb0c7ab687880b902a0970140690023aab3cae83700a4c4ba556c33b569ec0d1c00693719809e0a2b2f033388875c6ad8cbbf4c27dc05ba75863e2353a1b6d2e953b5a136a0d1ad0d516b0935dc9fa825c49aafb9a8e562b74baa7c54c748143e8d00ba3e8fcb8e4a325254925075059bd90314dc75660d5616386c61c7552b72cbe0c36e2a14b3f5102a8281c41cd8809bbd773fe1443b845fbe878fdfa139c08b7b1396e72ce30162f1ab59bc36ebf30f6b0620fc673748321cabd6a75cc505e04e1188857903fc29c632e0db9cb3522216a1cc41adf8cbf1087c32b58ccf26b985714e36b6460ec7e90adfd1d4263bb1d8ce23d7e21c159bc70da5880eed5f59ac989dc31182bd97525ef034b1dfa706da468ff2fe98a76179033c82b1182c8c4e3bf39d87e5e8bfe124107c669ec57ad43603c7377e844288fb30c88141349d7c7ac913ddd718e33e3cd0fdee8186349e644c7434a18c1b66496f4bda821e4c9f20223afec4670c06956ba6e8bbe97d560d9da8ddd120c57af4b9298b869d30f85e14a507cd521a33965659b69810754c5e544a20469258613a5a9d67f89cf012d5c2f6562a189917330e9ac2aa2355d4fd82b9a7cf896d28573879d0e20d671eb92b04a7fd37d074e4e7c8a7a9fd173ec00e1eb0cde3d815392c45001a9b6b0e501b408678820e7695e56165ca89024270091c00988f152893b49cf4ba865fe99cc4e521104473faf31dde8f4d3e5d504dadc9bb70c7f77e960ac1d33e58cfb8b8fa5f57bc9e3c5aadd51d0aa09d8ea034410ec0c92992073d91375d05caddb99cb3c6dcb5687a44958817cd8500eb3c153f59b8845594d07a9fd8fff1808dd82376b435610113a271d75fd2d6b480ae6c9dc05c50b8ca1b3b746a57459a8848e3a0ba362fa9acfc88e888b48b1a985bfd9fdf42850fcfb5d261e0c76230a54934c0447b41d0d102beee85a5941c697eb0061bdea5f0ba15b062a0a84097c0ec2066fc0f82b65ab493581c4ba04899a31405275fa4898013960ac7b55d1094df7ed48b2fccc2eba2afb8472dbfcfb52345ad60c5dd464be730d8d2e22c66c4a838a1e7b6a2ccc14c997356658e12be1cb5d55f909a20e016d577f4aa1b07a2d54df8ba706ecfe013c2aee5a7607c324a09fbe00878fbd84e7bd10bc2b3ebf99c043b5d93d1e37e363bc720fffb05fb3742b2ec376d9ca345463421ebbe6f5e868fd816a5f7286374cb425d57e232ddee33852a2fbe4e69f278fa42a29b30a6ce4ffdf9d5964598169c45550539af9fa72ac2b39621a2c26aea6ac163ee05c9993da52ef56dc75c3973112e6475b2892d5101628694be17b76ba9790d1fc443d2224634a1c27e16a217dfb81cd43bea53e37926d5df1a01818603fb1084eb0514ee818dc79432b1997fc7a0476393740d1b2b5dc9cbb048e4803f33cba331e51eceea84bdef384bd49dcc0d54e86e1068c566d3c5a97b5e7274e34bd983504146858537b26dde025e00e71062fe296370bd92b4a3753894ef0efa95a2afa7e7db83db2f35d72aa7d9d44d331a99c5c689791aab619ed23e5cfd709bfb66ce81db5484a809f287e39f30166f0235f5f67ef89c9d5fada36fa22691b1f16a46c353b3501afd0b0545748c8ab39804a1ab91acb25fea414f151ca67301c2af2fc2bb70427fecb8c568a24afbf5c260434f416ad0d086b9b9022e8e77cdd83b4ac05b614fd2f5ce78b9dbd27e4c569de3a24895d1058e4039e0194b615d106a45b5418bb0cc0d49436727bc0bd7a05d2f26d6140ab8da6f11134d1300a100b8419184c7e0aee15df07cd1086cf47e5781b94ce00d1e65200e912fc84969a23739f4600cdafce0e4bac2ceb76105aa3500083082554b657abd7116acaf074646f41ae86dcc3379563453d2473dd82af353b37ecabca0485082520478ed44ffbf858fb5bf20857cc15d73088fb8be153401bf54b029e09b7b6abc2d1f7928380cbacd3c6d8cb2da025cd8bd4b9f4e7dac227b04c5044ac852862da0ce8d579fff60ffcc819adc5114c4533461fc7fc5f3764f46626b14bf84433fba298262f8458561fc8927d074d43c4799f11a03a6e001bf89658c34448636d9e91529b1cf06e21f443dba888db6f427165855faa86f849624d548faafff37f8453cbbe1ab1b62084422df7c4def4f0d097fe2cee0432142589a11034c55fe9ca26cf73a71c051cdf33885652f21a9d096ccf3d52bf56aecd9f843c8583ea8cdcc8cea03160142aaf4a36ae4a85e08958c075356f81b795ca464342817c3f80fb3947782373064a7b05a14a03808ab7d2a6243c2671c54475395f1747d738ee08dcd153e1fcec3706e291ee1dcd9a2f1d419cefb7d434224f735bffe5569c3235abe3e97ea69226b76f968985cbff0225a692ca1d00bb63632370fc01548e991e762935f4c02d005702a4a76f73d74c1157f6566f2cee01d32c51bd189a3dc560ced83c93ea0f42b92592c4f870de17be24502cdda624bac85b94c35998fa4fd704ae08d6296bf81832bf56c863128e61236884406fdbeeece937927c7a2a83fdb0810c699f80122ae64e7491255a4e997ce1bed4e23892fab79f0364cc6aace385dbddb286dcdc5537376c2a4aac0c25a7f97683a95a22f0da3606014c6998766f1cb96cac58194adda436bed5939f8cdcf125957cd880fd2867bc7731c21fe0834a4a70ebb4052e15d375c8892129bf87a74c29fd758924191c1edabe8f1a7e62aa315d4cc162f582dcf160f0c81fc32e15dd01ed5c81049a8d8a31e3839160b63244e9d2b049b05aef92f6775ea59b825346e75e1ac18c911c35e41921c6eb176e598ab022499c3244c555bf78a1de8677133ecaca5acf5590451d9549b433371cbc9f5141344ceb163d94e43f5ec6358bfbe4a12b6ac94fdd8fd862c3ef238da69bb53b4c4da719fd69d3e8b7b4095014728244cd3087387425973900c6f27586ae7890b7487270e9a7871397487ad9eb87c4f5f5f315a8e5184d21e25626851a4224d5ef2f2084f1d1003abe48c2487649d99eb259e76ac65d5cadf4d73ea34f5c11fbdf4733a0dc016097172ecacea1e731a16b0271f19d161905aac412493c488230fc1c5f9422657ca51ceef5baf71f8dd42a50e79049aa1545c43984226d111b69a56340330b07d77f766682685ca31beb81b1885d06d70b58e2fd26f5431867a30e62a04a81a046fc262f85004b51983c453035c527a0564c4b62c410b9531b2d7bdfc19e3f05c1e8878b7b50664dd92da7c18dd2d15d7a6db8008e3a06fd8c9620384da2f49ed41f758ea6589bc8a9927f92c0354d98138fd362e0d0c62af2fc697c8040310a2c18b9a2059ed1bcbcea617f56c963098b5d0bf229f7e7ff372a985faf3b6ee70178cd1806e4960d40f289850f6bfa00d79ab582a47262413ee2c141eca24641f1e9a2f668ded9967c7c9962d0f6d80f80784864997e7922b4642600d1502b227b75094abbb95ac5cd85ab85fc1950015e3081cb19a23894a4c54b204bc457a38c32677c59c17e5f4123a0cb5bd18d55951c6aaba34afd6f81e1e008da60957c172403033258e0e8143feee5b6130d730d0e7f369dbdb635e48d2abd2620d327b071176e9ebe808f6d62082bf46cd440dc2fca74c04796b0a41642a9ff2511afb199eec57d30631af4346d88e7bde561b2c8449ae849d54ea6dd28257d731a068b8e17977fba000f8dc0208c122062a16b7be5de8f5631aedccbf689bc3e8d32490ac7b90a9eb144cab10324e6eaaa2c61ff681ed42eee35595e4f58ea92415fdf30d4fbd5b430650e3d1a69ee011903da84974c8be1eb8560d5cd7447af4f4888af12198c733eca56884aa3ebac86b1ad14b08131967c8e79e1938112527af4219e9443bfb21b168c6f00110339042b21e7b834602792d18ab3bf22851a999cd413cb2710d85106e2914e521ab9ffac41412785467c6c92d2e2f5e2f06d1e161103f92a98779d048d1ea1a7af86289f08157812834fb7d8ecd7e9a8a4254007db341ca51ae17446a1413fdb0bd4837790134dd9d917831f60258cf1e758ce79d59f1ffe24111f71699479514440cf082a8819505559ed0899005e12f267c591cc330e33042a286e76b02ca11bed550d283b97f89c3291fa5ea7d79b8a0f539f7faa28111c3dbbf81b2a3124bee52dc71011c63a05bd20543001b49aa252ab3b66504a2f167b3f2092c5b942b902fff2878f3dbdea2d65963b1de357d3c9e2f6f90d0fd93ee8a11bbee35daff187a9cccd4075c0260cac1ea8b4b09aecb8d13934046f051eb4118865531addf14f8f0c7af148f34e084d2c3bd859a4e8e29a7a903f405801854f56a750dfaee570555bfca5476626295b39aa987af79f88ce90f5d3ebd8b35b255baa347c72df6658d934ff5c76cda034cafb5a92c72e3cb8c410785bebd7ea03a45230b588afaf84481ad2718cf13d4d10a415408ebea7801c3ca8940d9e8d261c8708e4890bb60c71beaf720ece41838634cf9e9a93df964379475ed4e7829bb8ee66c86467fe64670c7b4aa394980cc1a433e6ea0aa160cd2f1b459c37bc803701dbefa52f1537937167c4c28059e23169e9b5a9998ddcdd80a1d792a3cf8437dd80b21ddf0824aac28280cb056a4cb11b169918ad38a727b14387752a903b7ac1e8f023581b50f59d0db4ed6597e417c319a54eca8345a1e77de7fb9684395aa76dc5b8e4e320ffca30cd79a697318227dcd002c7477ad981d15cbe2d4247cc93f423dd5d8a8b76efe1d78303ee65660d83a40ece1c720c94eee504d0035b5c6c16b37090ee290487b34ca161b434a6ea76308c86f121657abc0c17394d18d0e9c37d075ca60e91aa37f8184a6cd83848023838b57a5440162fe8f8fec701fd0db2b264e7dbe9f5e197c2e3d2d705f04c8925b0ca020f9952fa690db79aa9bd815f8bee8b56e4891e850ac883fccd0370c25fc46a0841de67992a2a46c7c054945422d73ca806960dbcb40708d58da37321984ffec96d5594bc72274c0e8288e5c694c1e3dabc3280e149fa16d8dc99990744e5680002f26f387150d8d9fbde504b629552d112834ae9f0c881872fd89a03df03b840870648dfc70ddc82441b62db3b7dd20a1cec24bf8724db000ed55ea316882a58f079f6d7664fd7adcc28db2f5952f957d0e68b43de07353d3faf56a9799838143d2214b264fa19b65e8748fac1ef531dc7aed7c7d058e1917a6497b88a542cd12acbd3eea19c7fcc969cdfa3551c543f19ecaf653c0e5f3364545cb40ffc3496054276fadeee8baea2856b5220c676d6621c03a5ff71e53d7e538db8b4758aca4de0083d469c58bcd6127da38134401b482935604f087afcdd64141d5852dfe0aa53b9914bebb3d164dc72f836818b458f5e36706420999e7428561318d8117b5db56a5b0e915657ec9c1d03a8aeccc2830da969f2a97c10c24bcc2501822bb2409dc38d2aad08755e8d8cec625bdac13aae49794015d1d38b9400d79ae04e411505087651cd12948acd8ede567311b0e973400154f78d476266c880f816de4285944688c4c420103e7904845143705f11a6be1ffb4ff5e84c4246a6a4543d35d7a3348fa4b0c8f2ff9a3b8cae88092f3d05654611bcf06493326c3c54702cb0ad68ca892e7cccb25b70b823d5bcfe2a2019c3214011b43cb4abd9315e26df00af33994c69d5ba385647b0c7449ce12cf5a0be2fdee3b002e20f85a0165fcf5a6ee9dc097284b5f6dc252ae7b629a2f8b4c7111a96c88694402b36824e3ab59f6660467dcf71a8b10a1921cb63ac1fda7a5a447477d6ba2b5a1d7c80031f48e9d17d3b4b60685fdd650673ae5b5616f59bf3e93ae42d89821fd74a54041b2d355ea1cf294fea3ae8a84302468a8586151ccabbbe2e04bbdc775e3f762c3d0a34be65814709ea9f66c0c244afc25b4ffae14ec93c54eae8ff19ab4b5a574ae4353c692579f3abd1f50ed52806477d3639d8a66862fe0d8b897026a1099fc88463b3a2daf1394b675754015f0587b3c0078387b895f5939b0d43252f18ecf59f4a1db45b54b288e627e0c63be7781edd191454fbfcc0af2f00d0ca8969bbfa3166adb95094c31f86eb9f751a638565cb23dd1c5e306f659a53d695c9f5f498d01c5cde5b1e3a36255f3427b739921e0595365ef308c938e2012c3a10c19073c3a5c813430b5a15f9474b1973a729c206236de8dcda3ac5120980dd230867929b93d6a6f6e24e93bb76e3bc179758333d4220a12aa600c0dc61a17cf568ca0ead154a85624792137ff17ea051c0647d51f34b291c3433b3228a5511619a93695f21061935e5040aeef44be121125196e0b6cc917ad8f4336628151194b22e8b56f4e34562c60380be22aeb805c84d768f76546d32e6a42576c9c828166589104c25543821d603c907b1cc086ec21d11836c29c777e333fc848d4d7a99e8b85665614ea4aa7dc781713cca8c656b0fc1faa20e6721cdddd6335625cd6fedf9ac596ce42e8cb3b5ad54ab5729f0a2fb3f24e28856c2f7de342c59111b8605d7d1b18c2e8b2a029eafd5943672fe21c43545baa89de4936d49a613275d26c4357a651963896c6840d2bb5f0ddf3c7f7244609a17c87c1854c06e04c8c5570b36e3a6c46852c764ae2ef7a961694043e4f5547a92fa4c858208c927b1be83a9033dbb408109ea088a2dae51d18be1ac8eb1081a5f027ad5dea1d3f647b1dcd1dd98caed332aef110340d01cf3ec0708eb8a7e6127810f2a5b7f86e432b3be2f834200672a52fb2911f1e01e6bb96847f4dd29f59abe8ae1a731327814eaa2d6d9b9bb4c1f720d1863db43676c5a7943f071289b47567f25514c7176baca765f48bfebc84fe335dc1a83bfec45c0febb99c7780967e4bba1389b48bbb3d3e0c235f6e2581010acabb92a38af2e6637d8836a76020b120318d1a119922f7a650f9870611a011581aeda2e0862994aacc74adb4a2aae391d911aa6ac4749514e2674b05ac0f47811806e7171ad5852e283662e52384dd0b9c35dba924621cdbd73684c342ce987a9b41377af7530338f2d5def2d2c13630341559066c14cc699e5341251cc41f6e785a2a0e429edb8a72ddaf73784827c6db1b5f0295f28bcf2bc6973bf4e5a36b7b07733095422ae3bc3ab6cd813608937cb353c538062a2aa2a19fc2290a1d1675fc612b5ca9a7e364c5f729a13cf8ff5660c0b66715cddd3355f10422efef0b93ff886d94c3578d2be236d4ef9fbd8951ff726dd1481c2ec2b9e340aa26f017c67b1b983653c8157e3e43c1fb902b22dab1d9f2ef74a74d95f5769fd732afbe9324d7304bf8577ea51325ff105b248f49462680a16e121bfa1f11d223ca60f0b8c53512cd3ca207b6ea07df0b850b720f5a8d0712753269440fdd23e2c617bc5822f08845f861214b83acd4bbccd5a13c2df678d9484e5ef12abc0df7f7f74903730d731344301642b382798a170bfd7df8aa2b4afb984639c9bf780c33a69f3e05331cc04d52807350311db7dee182e3ad82b4fd8c20581aa90fb4231e1f4175fc4d15fc7b68c4d9226ee03c29ae1f696525c7cf86bbb216e143135d328305afed0d58dd0605b0fa89c720017094965465d2e16dc883a66ee2878f54b788219976fe50a50425088141fd415a5cf98018b673a270333153049cad1c87cab46cd41833eb8307822095a73ae50f79f0d5bdf5b00d2431236bc0c834e363a2ef00316f0a4df1d4b1630e1213fc2b356840a22c2ea701eb467eecf8c60b500912d26eb1a6342aaa3c1431f0c90cd741c29b537c71b671c3ab82d375cb57a4eab2843d26ab5439258bf8d4b561cab8836fbf45163d1decc2149ad2ac5516cfb4b1003498397c7b2eed075bdfd1cf3868d1c4e520c197ba63da6f83004427416fb5ebaa0b93469dfc0ecc760ea6928831807565b526f84c42adcdc0a0758e48208f088b8f780efd58251f50ca7e15d17c6958ccf199604078baba925e743044338dee427ea1c6314a1a962d1534bd815f31eb55987b119230ad063426f58ea7c846594073c435b7f13e0f4ba6265554ad7d716f4e94fea27f886f190e1ead51de35722f95470866d962180717cacf08995407574769b65bc7b11b9711f9a38d8602ec9f53255c06b17ca1e1b4139ad5a8864bf9364954861c319050b765c89af93ee9e9f26da55339f3b9abd51ca4a66bf7571941182a63db4caf89884e9a6b5e8838a37bbc47a1e4e6490bde21ffc058e607b108a330a87d0200621fca0c5c82878e5fcb0ae440afb8bc3e1975440f0deb1ef52a548dcb9a08ad8c1f872c3fd53c6ac636d737463014e894cde523753629b5a00b233d9b418cbcd689d197951be09c9e951af2d922c585204144e48f32617bc9c60c6e48281bfcbfd174e5e930168bf508f7774e84e925871138a8955c192f0d1d4dcc71b909a102d598d8cd2415d5c73c3cc706de2d8c31b72cf4458839391f16c626104dc14ee3de00d17ebbdab45ddb9d07ad6869dbac3bb834447cc0ca03225e51bd8c4b14a4d6e484cdc638d2a61e3b30d876dda4ae0f4188769e374e72aea06c9c0e199bb9d43d020282c50dbc3d2551e9b18e39b6ba5d743aa3e39c1d08a3f8045c5764e7c0409323cefb77aad02d40c6ce72adef3eefa2246b86177f31d2862f29c64daa02d2b2d6a5a2ee5d3e7c2b001cefa6647de502f4e088f6b86ce5aa0996ff5b08e4050ff830d257010bec67c84a59f55748c05c651878d3115f8870dbec82453b6eaf1267cd404a33e7dba65c67ddb065e58533c99e84691947f4bf9186c04219403ea175826d1751f1b7f4c290dee5146faef7b1f5137ef9b5c8e247c39baabdf1c45eb682e49d4ce5abf2caeb8b8f85ddd71d2a634a86a48e79bfc3a97eec767ab7c30fe261c52a2b7e8f34a2b15aeb3581ea3e8ca80a1db1a4fe674cfac82380f1f4ad369f1cb955c30a1aaf4fb880903fa43a161b6440211ac4687ece29608737d8d755f834c2f5feea0f0ea6cf3124f4c0777b2a1d7ce36bbcd9b511cc489febc88fcc9d1d835390b2add086d8529f896b1c92c1bf95714bf32903832974def9a3f84065ea65a824168c841a4fc5dd1c50b6292c1a24816874497308fa282e3e2986597a7dc094056314927e58261baa857b9a93648aa390ffe29192ba7a91de02ca526a381fc81153b8955ff4caa500559c90713ebd4a763c1511d00a2bf3ac90fdde9f6288957a36690db670c276116141319ab543285cc557a369c898d8ecf047a143186750d5a50393ab002d6b5249171372dfaf28a2d5329a13a68976382b9ca6347f5518f0a4115ac471d076bfb3c128d56b44d1c0cd03a0aef9443312e041ea3db9c694c2ebe2e075ccd0f0bf9bced7d1fff4949cd3abdc796b3b65ab35e1c5cc002c2ab6951a75407dabe8522acee624f70526c7b9d440739b941d830738929b8b712c89b4f0579b2336e3352f8e23ab4ab79e649053d53c11ea1320672bd56227ce80662cee6678aafdb23f1bb62e49173d658c9bd84d73835e10a6480a007845d04e6ba29853e6c0f3175ae115460b02205fa5b2a0541884ebfc7b0211aa0e3edd4598d1b5929a4a834b7b808b2632cc99b8850f9fe66f36986b419fa91401affe78a595d7319779dd494f9501ef2a0656415e8bf8f3629b577fa4787a220abc06d56099b669f22aab05684d71faa7d36d9d2a7322a5d3459d0c9dd32f974de7d45437ebdb1ae59685b612fd88777d250f40cf121820fd603e1daf7351ec25ac085399d430ae8f83f5c4acf82992ced041dd8f3575e76c97ba1318e799fb3876140c0fda4992958d5cb5d11d7591b41c8b1247f49f94747a0bc689fc5be02fea7d79303e7c84e20abc2685fb3a5693d9f4c0053df4aa2366618ccf04ba5e7640a4fe45e5c4543553db892955d65e96fd97c1893008c66ea1c817f1ba7337db7db40905662b91119fb0f00d053d333a739845f98fa852921e48c2a4141713208514589a555cba79480dc1813c4ffd74471c5ffceede0f5c89d8dcbe3be9277309cd793fd6dd882d762cfc7d6a65d92982be75bc92803efc8cc07176cc458b332ba45e03a27bc2d81ef866aa304369b98d7aab699b8e72cb6a81bce2bb3d769aa8c608ec06ca07502447301d129f6e02f40170a489bdc0d43d1f9c00324ad6d81e0c5e288835413a8e6dc4a50331020192a62287b73320642556a2956c944140f4c0169267bf5fc4936ef60736344f7291d3c706bf164f32023848afe570afa32f446f5a1cb01db486507d6ee106cd4cde36e0374d8b3247bcfec7eb08d6a54e1af3e03c2897a0066d88a6f04acb85764994ceb6577f1930e1e88f38da66bf58e233d5056a4368c18b8906611e41dea716ea5e8b73c7454bbfa2a8a6ef0816811e27088689ab10a098e9daea26b035b69171b34ccfe26f2fc9f4fba305f00b31ca2fda28ab40bcdb387a32b7a1fc8ab4703240467f33a51d5cae19553e76926cb535f6310780209dcdfe76c30ff6a1457ffb0f2b6268f78336491f101cdc9aab8f5863c00a23c017cca0b9e2a328ec9f31fad930bce91aa5fda08b35c4bdbd2554de9287520617ccd501c8dcf2d4cec8bc6c2e063adbc4ffe125b2d41d0496f17b0474d04ad760040e04cb97197f66449ebe1717eeb8c485cb381d986a717007dff857e92478026d1a8389a36f2ebf1537b55e689f5e47637265a04ee97692de89024e17ed3ced79082d338713bd74fad595306996870cd8321c95f06ee6eda1ce2039aa71cac164dbe2cb11755dc81fc1dc1cc28e8af6d29465fc3e3d21ae4a7adf7fb9a1c6605e7c7e9a4095a53a04030af2716ef4ce7cbac71b938a3b584cdf4f3e0f9967c9c07bb8147a7b8dc57c744d0d4ab79185387589b1862b9a89abe57c4deb591f630337cae9a3cd009f46a679dd6cc62704e994da150bdc496c4e1f47c0ccba13c312f2131b7a041e1832f77c65fa7d00346f0ce08e4987b0c85cd498376c32b7e23e487e00a22ec008455a59c9f95a90656fa32bb067c8c38617372fff1550fb24f3d16510dac8fb186a4a6cb0ed1626ef35a7013ffbf11b51f7333ce6606d05a00fd676257269c358414828063288289c2630aea4159043a6473b02805781b7930a9473d3730491b3a6b0b9dfa1d22ba0f28f7b7fc0efd12276ebfa40c3d41ab3be9932fb2a9cc1c7407aaed20b5b706026cedc3e68ba79a459123370ca9d9bce72e5365c07861d2d1c1599c38fdf152ea41abdaf0e7b7a8421f902a62fc65c675d46d96ff538a6aa7b7f5d3d871b6072e304ab301ad41c6d01cf087f2d3e8e693651dcb6d1695906101fe0469e356ed148315ce78cfc3f1f8662c98829c8a3c612ea02cd36c8255edf17eec88e5b5ac10d35cf502d967a730d9b12803e4ae56e6e7dcfaefebf95644d6745fc83f7b1dff4024a23ddee4c0af28db4ae2da5a24a2f42c212214b61953b536dd210e11cbef9aeeac58f3b447a6f1e79121135776b200e5e2f966bcaf68f9e2c23b8e32a7b832187b3b61c5f63fb48d5a6d4f3c9e5325ded985f489c0f606e204e86b6ed25975fc92976d3f31271dc21f3f2042e474f0023b2724f5929b2ac288b9ca09ec3376839ee4891830959d0905624ef9490aae75002260233ca2002b68d5c883074e1c77f58c308bb22124c522504bf7ee2856e8a2b2feb1721f5b8d632a65c7fd09dbe5caf4d42c1e4fa4968ff21eb3ddfd68c727b3132c3bf6aed1a1ac82c2ea729819a599f6794b8aaa291e7e25ea777ee15c9240a411dc47fda8177da5b5968328a11497cfc8f00df3b5138bbdff3e7576786069448e7d5c99700871228bae813e265080f8353047a0162614c7315b8a96c6faa233d30b056ceece4008d1b30d05aafc59ef325ba695ef166441207d2e7fdb8d05584e6339c9f1403ad66e5281eea51c49c9a9288118e9a33c71b868c131d1ee382edf1ec22d5ffde4a50f58939774a1519e47402dd3b8bcc0922e75d47d703c28d6db5881c3da5fdb7d6b672b3181b29f44ff271a65ce76b75544175e1749b4e4ba0ec33a4a7dfcac9a32abd2a082a559fb52c6ab2ae93f38067cc3b459942f48e4d88bb5c358e7b5f41c377f7126a16cc34530eb0b26708711631e1b3c50afca81c358bbadad0654a237c95380b14a1f7be42be9e8c5113f00b385ddbe253980c6cfb4b0024aca15168007d2e651e4ded54b67bc8c42e9eb1cccaafa79fbefbbebf22f8339ffe81b2f9d29212a3d33f749058c4085df803c7cff0186bc7159284a7955395f3734783c297d2ab097fc5cc78c0258902004b592da798642928488a118d698879fa1da22661e07266f35e7e6c832696ee25c348a729a8a915e013a9bc1a6fa44d81c3cfcb4f89fd565a6ccdb91033227f8f693126c01e89b0a7070e7ba5e309b333b0cfb6aec8a5bd1fe2e001e3f44af9e285848707e747845f721e02f463ce5c88416b4eeeb20ca5e1c74e565d990c94fa8afa689992bd86a5a4f710922e99ba5d7d7d29d211cd5106abf46df3cc697bf36d1a1135a8d4b53bd84b8210b785fb50f8a9d52cdf741b1464354d87f0aa704883437b63118e7e3064768e83b43d08a4df522d3f1d83d41b299be61f6912c075e74493a1e5496502f1a7efd80959447287a72daf1fbcf29d71c9040a8d3e46d3aa642f879fbaa138737567eb5a6453c70ecf8c31e74763633e1315297a4b8698000fdf7af8fc5efaea5c609b71ee1af0ab131d45cac6b45400a52c8209a1fbd8621dc68afc9fcbeaa312cd9ca2110652e5e74489ffb3ed8b28ceb33a7803521ff1742ebe7daceea32fb1eb3b192e6f332213f2304a18a1f494f3854c502402bbc41ca0221bd37ded405a8628ad30f4e79971a120dde190eb375de48b483d016b4529af711c607a5e1fe3bea766f3b829e4db580a60ea4d50b350f7621c2415298fa82bf6ccca08b8d5b05d3e5ace0926276d2212e0146a703f7f1d645f54883268af380922abfb3af9b46713cfeeea9820daaafd60bc6eb82ddce5bf6037f750c9dc8c0060a845e2af5a7920a198109e9a5f98b1d068f99f3d393f1b1c5830cdda236eb07f914bf75396e9bff48963373ad4cff7b30d997849ddf6e7e241a1e07382cece108f3b167b2ebd61fb4199344d95d2591d37664bd1aa32e1aafc322aed4d8593965752bfee1ce709c7b683764c4242c34b25d3d68a601be852832b36683068b3eeaaa300754174d8098a3f515f8549efc8dbff356e5e40017100492b302c37485cb9f4198a5003d60c432c7cf8c236a60ca52246edc45c13625e2ee4f6f1f2af8548825a36bfa3c9c0ac1264cfb7cbb75c37b9aec5952b9326ea01f728015837a5795be7004738b32c0a3a39c12532226eed4cd230c7b1d2a0d39cd8453ac68bbdc0623d0b41abed2126ffa74b3e43ca0a10f37fa1e880907c9cc3001b3703cd5c467b734c98fe28f8aa561f34d28b76621e906bd9718b81cc0274af54d481156ab2ddb075b68a8c6876388a4e433d9d9e634114251768f4533394ef12778194687c635aa184bb33ad21781f129d32699a585998a5b626429faca4a89b642c874c30a212fe70a19371871a8e82f3ea61157b025efe7059660acdeec78e5de073599356a850d000f49b9ac4c9230ebadbc828bdc95721029cfb4f8822f2ccfa81b9a541becefe2fa7441ae7e7b00c62fb321651c907efc9156db4a3571a05c47b4b1591df0835b5e38b223d026dab60ae0ca830b655736384b5feaa5e1eae9345773a460fcbb0f3defc1dbe9e7eefdf2c096f8ea05b05c345555af53112e537e19c31534d0af19707554d8764b72d4f6bdedf5c26aa0939d10829fa76af57bee4328e3ddf14a0e1de94b15404db623a90aa5bad456c34891899c88f99474535f04cc9cb60731e0996db70bc90cf2f08f145e306901208f8c6b9051653ee76cc0c317970d95dff6cd821b100166996106fd18e1139cd530a6fe74432d6d836ecb2c70eba46e501a9e5c384704ca71a642d60ceee19b1b151b7e62503f503af548db3323b69d43b5598afe06dd2eed239c2e385d95eb0a9aaa2e7362c08c163c1762347aaac3a1797dc64edd119b17f38cbb89561f1d7902381129c86b6232b21ec30d293b341abe9d949d4aba410cde8616b7a0ae84c6c6d0d7101fcb0b768e83995f53f1931eccc2159c07fac3d0f78123e9f5b03cc408278c42a646dd034bdf97abe84010784bbfabfc056331666d4bb1036ea764978cc5ccbfb5fe1505c9659357dc35e2cd7714d3924251d508ce93d885c2e5ffb35afffed87a746973d0891b975417d9c6d34a0394ee16e7bfb022394ed41bfb046d0bfc38d7e062140c6e45a6da5d6406e0a937a64b3c6709c8c7119af43faa34088ac5c016f66e2ff83149de2480a60733cd83b21dd808a0837525eda44bc5a0a1482e2af3a22d59add130ef4c3db5615bfad6ae695b5d3024739c656024fff4b4a64c490b7dbd92b1b066a89b4e0e88c6f89c19be0808948cc0ad2f5e408b72020d0da2fdcd46977f5e1919d5e993336bcb839bc9b5bccf1c89b451e01b70a959d6835a2a2f08abc699b50f3224387d3912f57f548bdd3c9f9a8538a6c9fcbf3e4ed895eae9f1e94a959c103ac0a97c559c1e8da4fa4c839e26f891db671217d9f7d89afdf7130aba1e7aafcaa8f45cb9897ed51bfd89af0d76bcace30860d40241bb88c80690c933d9d618f202fe61b5960bb04b897a21ae0871ce704b47ab4d91c13ef6f04bb0f9bcff56b27c0b5975924d173285b16e5378e8816c760f9458cb049778a4d7819d40e89012a089048fe39574d512ca4d1d20176592b94b009c92e0aea208b125d0e4998051860ca5d4a91c74568410e80cd32face166ba431db10f19dd298c6bea361db13b8222ee572b43a33d9f4121c05ec39f5378c7003cd21d469f7ac8b690dd9b7aa1705373161540f6f2297d2543f71d1e4d9c3aff01af8760d4aeb5c411f2dc4e891e3f48721399ef0c7283bf510186131dbf06d777a9002eddf36ae573e66f09ae7efd4f2ced9f04f661d85dfe367835cc6311797cd43ef2a513d8d42a751c62522ec478add9e8966065be21031c90551df1c5198c38f0eb3f2c792d9ff43f6ec85e145150aa3d654a927db41019088a358486e70b3fad7b9481b98b3ea88c7f913f48300b522aa934380bf748f1344b42dfc68b945711c66dfa74b6fa46f2bc07c9a33618b959b55a60071ed0b3722693bf10589342ae92deb553c163ae0597fb72ef457f0e87b94f17f3b0a84b6243dd7768fa5930cdbdd9b28e9679695a8cd5c19331bfe8db202233a3278150fccbeeff1e94844ec47f57ef3c08b8edc23c2af7c01591c5ac3a53a8c716e4490da12f10d70ccc3280252a0786b17f2ac5ed9a32dbc35ff3fd37ac71afae8a48a093ac27a71f757b552b162549052717d5244aaadb07d01ecffd31ee5c7ebefa5f35ae73cf4a4eb04ce35c9e37afc6018df7d48a76d0dab3aa94585afff0e0b2cda89ccff11386ed169688b72b5f5705d41a10f986e03157927e709487fce535a09a6fd6ed610dbafb2cffb1b79d90d70f2bb3515fdc15eb990e7f1e0ee94f92ac4ecd2617362eb3baac1b8111dc2330c33f3a76414c9aa103fa781a440fb42a893582970db927d4dd55ebd6240a2af78ddd04d6cd4e3160aee36d1de51140a2dff915cb2ac0c5768410722fc84e202017f6af4124739f1825bd2a81e119d0cd80fc2a777b207a41c90aaaecbdf7be3c53424d4dfb22275b0024e9159150f5c01c5e07acaf7613c5f33e1873ac36774081cffc1082d2ec8357edc802e6c1f629f94c0044aca0fe62af2f19edcef49a7d82f16272c59ed850612972e2c8778dce2f1622242e81203c40a755190789d3115da7ff081904b2374082b846994c865b40582a2b11215204cb70dfc1331d598fe649240133c18621b030687f6790344a52350efeff67fa22baa95c894191a8ab0182ba1b03248f44e31bfc0100fa0868071e900977d132a5410f56f787066893e8511446bbd9af1671a8f200af8b215bc7c0e20cc62bb603968e2723d086ff3c1f30961212e4c04f8bc51a249b7270e196a03a56c026af43fa63830ec34e903300cc3300cc3300cb34c2076fc56bed91faf2999e49609012f1c23b29e0a9494529232a51473eb0220d8068084b046d6b43e019c0a500a080a68ef87e93cecd0e7fc1a4fc3cbf14fe560f0a8431f85d62ef520d364cad0a155423d9e9b72398ae77368a507194c939766395b1e7268a308cd7b2a2e2ae3ea1187366a9f7069f2a355b33ce0d0a8e6ff8c4976677d79bca155fac14fb57612fd1f37744a8955fe1e444e79cea30d8d98cbbaad2537be2ce8c1863e35c9d5af5b905a84a6e0b1865e78b652beabc3e39c6ae8376b7c0be39e73f692471a3aed66324625f59aae88864ebd5566e1e5d25a76f90cadd8a0b59c548b199acfabc3f8860b21b3aa0c8dd42e5ebb705a501f3cc8d0a8f6868ebd61be933a865e94500fd142954e0d8aa119edbf2d2e83879a1e86fe7c46a88cc945d52c058646c6e41a5b94d02d3ef785569aba4cad94c8c30b9de61c7f51babc5227198f2ef4820857a9c2c5dfce7b70a117a4baa03bcbdca8bf7a6ca1957ea619b2529a6ac9430b9d94b1dea9e3e68fcaf3c842ef22c4cc9a6a3958e8b4efeac60ed9e30abdef494fd9fd34538f157a9de99bb4ccf2e7ce12d201f0c2a30aadd8dc92362d52bfa8639e64713144444444fa10e0081e5468db74e6eccd8c627226491111419382c7147a41462d49f1a2ec2185467e43bcfecd2562a4a2d02af1e269ce3cb19d22bc1b7840a133253727a1e595f35a0bf2c0e309bd14a1c53cc5c513ab77c22bf56bade59b37a1f1182db7fed166a2954ce8b7539788f274d9a62451b361a3e40cfc81c7127a713242db434d85c72f071e4a688494e13bc8fc2f87075392d0af16155a7e519f569791d0a7d662739450da3b9647e8c5cd72f64fdff4c5d6f030423ba734b84e42fb945c91a8a10e3c8ad0e61c750b2e1f3e9e0caae141847e44c7ac5c469ad4d89d780ca14dd5d15c3b4b0aa1dd2437a7d477d1a57804a16fd157c49e8fc72c2b7900a11d25a59659f75c0793bf8d656d78fca051291e4c8cd4927841896f78f8a0dd53da79a5945ad462961af4a25fd94f93f974143a3729c98b36afced2a46e511294941312dd45bfab6387ae56193e289168186698a0a443176d0c9e2511a651b445975cb4efca94a70b325cf4a22ce9f1fd1bc637abe316bd7c6b0d5f1745a2766cd17e7e5daed4e7d4a32f2232860ac210110143472dda28d5fb37cf78a8ba246a69380ada0a3a68d18feccbf036a92b5e25513be33fe5cca2f370aa6557d3d72ca7f1262608c30c13a4e12af80008be04c58cbc95451fe275d4b22cbc9c63fa14b761df023244440ebf8d944a4cd2061db16883d012f15a6cff98913739b1f3800d1b7e2365c980c108093a60d168f71d17b2752623f68a56aeaf8a8f195d3e3f1190a4b80848529c448c30c6284118628421820e57f4720bcaa3e716635d295bd1e8e688cc527f7acba3931c232ee86045f3f24757b6fc19a71aaf4c4ad850f28cc5a06315fdbfd2ae59c3c6975d68e236ca787542c6be3a31394a060c46b04315bd4739d2d467c3fa8649d44cdc068ea444e0838e54742e0b225308f59c91ab49072a3a0ff7f477f57f9d321da76863962d1d640891d9e93045e7497bbf4a5706a2a314cd0bb16baa323dcaa811a18314add4dd2ef6ea959de519452ffb1b3f9fa648f4d8b10e51b4e6df6f62b5b0590a3fc71a49cf64042928688891f239d6f8003fa12314950e503ca0e313617478420c0c7474c27470e26499948c6c421317e8c844af834bb2bc656f51478b890a745c822fe5d13bf7e796e8dbf5ef88bb8af824abc448090e0f9431810e4a44a0631212e890447f52ae97a8a779eb7fc4648ddc48f134461e3112296bfc19296b7c0928d00109943f03e5240d0a743ca29562b338971142c69779939274e364394b478c60a0a3118c68e5bfa8324ad91efde145f433a7d9fedb3af8788a984047221ed08188b65c35863d21aab33803a2e3102310e83084033a0ad12b997596165a3061c245444444240a1d84e84d66cd4c3a89b77069c7209a3fa54a7c3d66d134d4218856e64875f99d3b02d1eb76195d298fa6251b03a20dbdadfc472a828e3f74a644f33783bb2c6913caa3a960fdd0e910d3112a2f76120eb41c28276574f4a11f3d2575d2f8f18239965743071f5a2d7370d15d0697c5e6f20ca2630ffd49fdbe2f9efeddd293a899d48343a0230f6d66d2929767ff73860e3c343a85b94857a144b3ccb1161cc38188c808504a468ee100514a4670a49c8e3b8c80d16187c6d3c46a162efb68492751b3e1237a385ea9d151070674d0a1914907d52974552bf7eca1630eadfce822cb4b7e736374e89043bbaf4fc8d0d60f7d793b74c441011d70f0e87843af6495663dad41a3ff1d6e18a940471b16d0c186110674aca1ef286474d3b1ef8228a9a117f13a6e18f1725ed199f892928646689d97420a215acc2634b4a1e1caf547072f1d3b432fe99ca986cf182953666873d2524cdef44bbab465e8e514df767163d442647490a1179e4b09df0faba7aa8e31f4224b75b3bf9259f1c4d07acea05b520b5a33f9c6cee80843efadd24cb46c90fe2a30b4fd9b5ae9d5ae4746ef0b8deb95d925ad4934e693179afd9cb5e8e8bf7b3277a1d5fdf8b27cf92c779c3ab8d07f74771967ca84d28b888ca4a43cca8e2c4a49c18e2d747e5a56cb46b27720e8d042f3592ef72793fb9d62165a99d917f76f41aad43bb0d04bdaa56b39658ee9cc92a875a0e30aadfe9847acee9339af153a19452bf1b2b4ac6396055bd0518566e43b5f8f4b97bae5ef58d041855eccd244aa8be2c5f72c14c771724da1d90dbe5148655a3c29d521853e697f2b0feff2893cd1be230abd66164c7f94cb1e75550393131b9b820e28b4529856a93fc70e538d3f27e878423f2f8bf6d16d8d7abd1b25cb2b2734ebe287c6243ebe5c494a090e90063a9ad0b8eb9ce6094dd0c184b695f6fdd3a82e5abe90a89de1378ca18e25f4aa77b5d6b2a0353dcb8282374181191d4a68d5c3cbcab3b8c245e125a10d3e32684cfab3183b0a09cde7ecfca79427df4c8fd046d3dff1928e2eb5f290a89ddde057c0db6184d65c94ed2f655d7bde8bd09aaccb6242cb9dd37d22f42bd67c74b91e57253384ce75d442c76cc105915a247408a1ffb82bf342cb603e6b47109a4d75b1fb5c92dd6492a81da231822c071a37c218430561740081d7a6dca51c1d23514b1974fca033f34ef997a2e5f0b1c3078d7099b40ed94aaf16a468265ff4a215237f5bf2f9d4d2a25250bc8c335eb4f153dc8316f4246a26236b9878eea251a17410b2b9a48e56cf74d1ee8b9ac40539dbda8596e48b5cf4a942c913cf5254b5d817b8684c8ee7a875164e6946d42859671cf8e2166d9f0c9f3d0759255f27c516adeca85f482de467793ca716ad7019b685bb98f78d91a83279ed2f68d197c8acb1a48e5adcc5b368fcc7e528f5b96ea02cdadff032b9acc594f65c2c7a793529fda9aa32430e8b665db5522e67654a48a557f4275a8f10bf7aa3271957345274458590b956f4332335fab6ca8a3646ebce3288cd51afb78a66753eb9a69ba13bb3a8a23121656a4e21b63cbc52d1ead94cfda051a3ca7e052222af4444c880c1481a5fa0a295cd24b5887297a577123593131b27cbc8a6e08b53f4493c275126a31164afee0b53b4e3b95a84c6d0bca6a0380e15f8ab4044a4149d78dd314bbe5ad3a386e73059232511ca2f48d1e8d9245565c76771e5246a252367fce3501580c0eed595f1c528dacf9945e1313f288d7112b5b316d8585e8de048e10e2d7c218a3ecb629e965992d318e750b41ae36beb76bf201afb0214084da4dfa4a58cad65af0baf7532bff8c44113f104a289f8179de845c69b16a3c9139de7e1441fde3e68c54de8203e6b597ea9d38b7e5d4ee6524bba0f5e34eac9c4bfa851e395c90844444444523cf0b18b76b4c8d09b3367b1598b2edaf0e2ea52367bf6ac76bcf8c845e7399acf894da9f426ef40f0818b7666f563d0aad2659c246a6938868f5bb4f9e26f3419cd7c356e1ef8b0459fad62b51ce219ba5bc4f81214330c9e008ef0518b4e64653cf5cb597e919ee4407b7542c6d90f5ab41de465efa02d65376666d147cf8236977ff794d3872cfafdec92d62dfc3dfa1e8bbebd25ad5cca9571b935b0e8646c8c9975f3ee4b3a26699ca8e0e315fdc7985dc5cbd1a530992bdad82b37c6172e57828f5634ebb21c545dc78c3f58d1cc7a299d0f79faa12251b3e187ab683b33cba7318b1a6744b3fc5045a353cb578788f3788d13941c29af34157dcc79dfa4b86cba3ee10315bdd0d49f754c7ab34c5a87e4e314bdd6fae921a3ee7e2ed52859a6e855a6ca2f2dbb7b95598a566e962535d931af564a73c41843056140e28314bdbe1c8396e5184eb9e41a85415fec52dd363f44d1f7ce8b06ed8cfa08451b22b4fc3185584d6d4139193922f800452f274f5ade54a541658b868d8f4f74e69b252d661429e3c713edc93df553f9a23ecf7c74a27733adb5bb373487538c0f4ef4a2ccae5df628b489369b679975b38c870f69a2effcad1ed7b3ce2c74996864347ed0923d3325c56be428b151924a6cd8f031ccd270940d7c60a29352a994a92f328e8c3dca3133d27015d8a5e12826f8b844df29b39478586f490991a4384992a438890d3e2cd1c78c2f4773348b6bf8a844af450819474a97db2ec7c6c98852a2175e546acda8f5ca8d88480e346ed4e06312edb92057c62bdd512a44a2c692e8e5f8154aa8bc097d2989da488e8f48f4323288cd318bda59deee0312adbad43ca7cf3c680f9aa47182f0117d0e1e46e9ec596290a4b808d6118dd4654297127f42b72c1f8de8c5ff76fb66f9f566583282820f4674c23febe4ede5b25b8e16d1bcb62ca1397a5875a5227a51cde41d724f44af75345b27172df98f88e8bb35c9921df92d76f4108dd232e88f2366f2f46688dee3cb9e8c14edac55883e4c472daf99dce4324c88deff65b72856293f1937c6069196b5342153576fec43106d68e9a7b53ca63a640ea91332ccf547203a153ae91d99dbfd736ed307201ae92a47c7ecf9bb399ae01887e0e30fcd9cce8bab336a5a74f9f043a3f93d3acb761dd3d6b9c18360f916d83d1a377835b23c0eb88c8f3ef4b205a93a6309712d567ce8dc4d6f68ee2cbba8d93df462871663903959b25f3df431c8536d1e5e3ec77ce4a15f1f2df8490d6a6a5a0c1e1a577285682df90e7d36d1f4a8753ecba6b543dfae2b5ed0903fead0be8b318a93f9cf9246d1a1131ddf92f897f325286698e0630e9d165d14fe594572e87496f1c5e059bccc2943a2baf91187be57e6d2f82e46eb5a8292c364e0030ecdb676b61c352de92cbda1d75a6f3e13ae514f6b6e6843cd3d987ccdee1393f0d1865e664fadfbff94a7bb52f8604323f5becb39aae71fdd9da4989c2c6679bc865e5c525a4da3c878945243bf5a102933a3965c943a6968dee499362d5c79ea090dad9b482d4a937c8656673cef91e17d98a1d5ec282fb9d092d86f3fcad0c8a85d4913fee235683ec8d09bd0d3f2c71cdbbfe17f8ca1d10f3d7fe14ad6e51743ab4264bb96c53ec2d0e8a09da12e6860e86352d94a9c3c654ae87c7ca117b5cfe6d8f3f795621a7c78a113a5ddd9336659e8f074a117f39d577eb3fbcbc25c685c1619dec447a4b8cec7169af1d24a974b625bfefe430beda99812dea9794c8c43f8c842b36e424bc2e76379e63fb0d0c7963db7a051a97cf549d43e8789d7e00a6dd2faa4f470d94f6a7cf0618536ec6ffc8db194528546a616a99fccb529f34b6c7c8e1212b4207c50a1d3a5ae51bcd6fcdce6c7141a59aea5921d3ae49b4cd0381951fe281f52685d50da7b5ef856f59f442d75f011856673c91c5a16bcc465ac018ab20f28b442b3e09ed977b48ba3248df3f1844666d59d4d6f38f9424de34d1ec5700a1f4e68468e891784878f5d5a4de8959cd7231edae473644227fbf12d9bcca174f46309ed079da37b76a6ce82f29cf0a1847ea59ce937d919afbab91b1f49e84ddd4cb7382f6736b750f840429b3fa54ca2e5f0ea4a3e429b5fd2a0b46f39d03801133e8cd0e80f339774d0516ef87c14a1d3552e29d9f2c713fda26bc207115af73ddd4ae613d7827262ec66f031845eeb4d25a26389d328fa10422fcde5a58ed995cb5bca71728282858f20f4823e7dde1e4774c90c62326030721f40e8b5a45cccb275ac5c293777b24c46c0468c8f1ff4e1c28e66c94789f5f0c307bd164b868db2a414df722f7ae135737e3ef395bbf1a2152d6869e926336578176d96c58a5dcf9266d5cd2f6e03872e7a615e10d9a54a29f1d15c34bab3e479ffc9a03dc545afad74cee2aa284daa43a23672e30465e528b95162035d5a0e351e61e0718bc6f33f5f8ba3399ae8a02dfaf821338ea7d07ccf7ad4a2d351d5528ccb1e7d9e072dfacfc29ccca5e13c66368b46cbcc7d615d48d46cd828394316bde4aaf478fc50d172160e1eb168b4696b1da5b95382072c5a9d4c6a292ba47099cde52368666c0f1eafe8e5489562fe3335844a0d1eae685c636849a185a8d21a7f8649b6a253114a9846d72e67fcac685fc6fc8c13f7aca211dea27f5ce5c227f05045a3517c64c754325a96c354744a8ecaa48389d4061ea8e8b3fe90c2450d234c8b6b093c4ed166e12237b869cc723e290f53b4d93bc346a945ebf0a798a1b54729da20dcccb318cbe37727c7d7e04b50cc204523bf350be37234544b25258251f4524fee6b7136338b19cbe1218adef489d79acd25081ea1e84de95caa852ced61446cf00045eb71b7a3ebbc0bdaf2f8441ffd536370d73f22bc35237878a2132f3fc90c6d8d9ba34e74a2b7d5dc84ba244ccb19103c38d1095525c5aa9241e8ce42a286f223c7686e139d16175b367d97b4d23a231e9ae8fb555c79969b3bdb814726facf2fe8a072747a5019a263b5f7c044ff3a8c5c7122f529e6be244709123c2ed10817758cd541849031f9ca129d099d265a5734eb0cc2307854a215aeb3be0c5aafd6fa43a2a64a46d648232338523e90438d1611c9a1c65bc183128dba68e1196314ef529b44a76b529e0ba61e93040f4934e225730fad842eade49168e7339bd419db5a6ce185c003127d76b94fcbbc5ade109b47b452c69bd4620e71d6c0c311bd7231782e31f3928cda8836534f89114275a76cdee0c188de25d7d96d7af258449b2fe4b5aa6cd9e52052449f1e4e27d15a7aa5983c12d178965da3976c17f3b48cf04044af5dc81229548609c26883c7215a316df2c289b7965f45a2268266f03044a35eda5349f790a94485e845fcc5115ace93105a3c08d10857f12ca7e2e37986443d06d178522e55cbe6e45a5c3c04d1e8d0f02db6a0a2128f40b44afe5d18b15a1c7d5a88e20188c65fd0976590235d634301143cfed0ef7a6657d9ec496cce0fadca10d3a36599992d49d446504e46d270146424f0e843ab434a193a8ef6f54d518c191f5a4fde4a875c1923bbf11e7a5955eae0ba4a47d5d708ca490edf3323f0d0433fba95f0cd3287d14945810a443cf2d087687751a550265226f1d0cbd562fedc79e40ad9ccd8e30e9d760236464e4c26d1cb4ba9c57d75495ceb25d127d35e26e342ebd2e291e84fa4aa122ec92f1d3548b441870f524e8b9e21741ed1f7e6e4d2536917740ad111ed7e9c923a75d688464a156f79478bd1f9614427264cec0bfa5402b2887ea3ccb1a7330ca2883ebb646a2a756ea14527116d0b7a5ec9585ddd302d144010d106f32caf85d33b2345904334635ab590a742121043b4f95564ce332fb916d3cbc04234d284f894e9caf4750c84109d9cceb95cee9c41f43a6b3ff170dd403919e306cac9e2130388203aa58410e59a1a45992e039040344ab99c93d49e63b82806441b4e7974735f7d2d757fe825692ae5851c97739001f143afe3bbc96ff9a7956f7de84b0699abb7f4e80e1e3880f0a1973f876c154d1aa48e5240f6d06a97782d2e3eddb3540f8d4ba273d6b2deac01c9431f45887a8e6302c143ff9236616eee32c808efd0c99754667eecf6d4b23d80d8a153a54469d68d1e36e640ead0e60ea385c89ecccc591640e8d0a6b6ece2cb713c43447773e8b4cce6d4beb245b941460e9d3829b596fa052daec8e3d087d4427c9b74018143f3f35fde92cc535a902e01e40dbd1c4ce8585a89188f0fc40dad8ef2b26f9ed372fe541bfa4c17b4b81957e9d2fa1d081b1a51d76e55e6b39eba35f42f9fcea8b620446e49a2866000a286568bcc5ac797b5cc173c98865ec6cba25e19b63240d0d0afc6f19cdab15f10269ea137ffec97ff5a90fbe163865ef78b6f8c32b44eae2c43a7737233297d103274a262e489f81e2d4c7b03640cadced9556b793f65ccb2187a713c5da5cacf6bfa14863606ad7546171a64b4090cbd54e2b49bbcacc385ee0b8dd6916a5e2ebea0b4a506102f344a955ecffd5a167d65bad09acecf46b12dcbad74b8d00b4ac828a3a5d7c3847e00d942a771b390a9b5687ae4d5421b7b3c9ae7161e64aed20092857e35c80c2b426ab640b0d0fba80bdbf9c26b516b815ca1f90e2f572984521a47b642739a84b6e9301ef3a973aad0beac5a7566a9b9c5d3b2020815da97795ad2297c3dca17069029f4f15bc98fb9e849b6e50b2052e8c4055f53beba1a540a310aadf77616aadd2f7ae840a1d372fe79984df9a94f204fe85446ddba635c6c9d7c4427f4a93decb9928dadbcbf036942ef626c61ce3d856c006142eb2e6611dfd3f1a13d4a005942e35aabeee0d9f4838ef10c204ae893925afcab740149429f346ad642f3282575048284be65c86b2d9f944abb0be408adec4fe1a5fa6456520562844e83cc2befa29663e7fc9c22f4e9aab32008111a9d75eb98e530212f7a9021f49fa7cbf39e0879cd8008a1119af57c6878d54a7390164082d0b7f629ef7f190408fdab46f98ce1bda566417ed0798cfd306f1dd5640a15203ee885f51d5f9d2d6acfb2547ad129213dc8ef4e8517bdf05dee792265336b5576d1e80aa5dfc388cace4b4517cd6a96f3aa47eb9215e7a27379263d7c952ab8683ea4a8ce42b4f8d1dda291d94bbb7b7ceccb6a8bbe83fe092da54bb2757806708b4a2d3a337577555a09dd2854a145df3256c751d9dd3832b36833cbc153fca80b9d3f880e1559b4e6728610e1a7a243afc4a215db416921b4f8d2b2ac028bf6a516575be8bae913565ed1ffca3c5adb431557f432aa65cf6639e6a6a9d28a5ec9fb686b31e9efffdcb1a2fdccdf1a3ab5bad0f46e156dcbade639a6b41c3b7aa78a3634a8e8f3173d68b84c182aa9e85dc91f0d2ec8ac9f16c9504145a705ad95fa46cd11f3413c457f1e5be6597d219aa2d5a9a25fc99645a9f5432c45af4accb398434f77a9428a36e89c94a9ead03126af328a56659b9807779da3ceaa88a20f59f239471f2d4e59094563425b8ed4a547c4f70a28fa5511263ae39e8b33aa7ca2cfc9bba3d6aeb5d0912b9ee8e794abd6a43d4e3da8138db896c578d472963486112b9c684e8a4eee528716f5c56ca297e518a596a38bd144af51e7ba5c224a6837136d0c26cdb414d5d9b962a2cd2c2d7db17b73d2b14b342a576a59c89b0b57254bf492aed2ca65398c5495a954a2ed2cbc52a9e54fa972a444e342f4e5542fdd2dc3ca24fa4d993529efa85995ab2289fef385e6cb64241acf2cb2a9a3d4aade02895e4cc72c45a968ddb93da27ff9c57e7fd72d8a3c39a2d7b9a59c4d33bd71d5bb4a239426baa4bf7cb2c2885e7d8516640bb3f1bd5516d18b7459741d9458f141e5878a225a8daea673a9eb9f5d93504944e77268b159f49e15a35510d1e7cc9a63f4cc51b764aa1ca217648a78551aea19d28a21da2457c6e8f0b22a791deba052883674925ab7d862ceae7508d1bccb72965b16a7575e3888466791aafa2563e43d4134ae49946aa6502db94b20dad4e1524a7f6d97a1ad00a24f328f76598472a9b5963f344aca8bf243736ef252c3ca0dee5adb875654e874515f6cf5a84a3e74a62946a3121b1aba2751d3bd3db45167d3615a75d42994bd41450f6d7f8fd614e9e24999a9e4a1174573501173bdd183153cb4f2c59c7a37c568a1f5ca1d1a35b1328b2dbfaca4ec8250b1439b3f3ffe726f5ed741e80c953a34a27a4a693f117b3a4a874eae08d7d62e79e25099431f7fa556d56526937a14ad2287d6a4d48ea9b1fa615b2a71e8bc5d16472aad4a85bf77a8c0a1d7a2cbb965eb7f4126d3869ba0e8bda1158fda55bbd849cbd1191537f4ab95dc1d131d7c778546a50d8dce2bbada7f9490afc486f6c4ca4f1d2fcf62d09254d6d0b72ceb9c5cc968dde0ef068d868a1a1a315a5b968496ff0513eb19fe2ed034f4ef49dfc36897656aacfcc4469ea08286beb5e626a96bc27470e14063e48c93131b6b2908430cb6ca197acd151f5f8ec91867153334524d5d32dd723de457865e7e595b5c91498bea520cc38c108cb1c6970047850c7dee29ad5a5adfbbbf31f449b3d631e55162e8c50d975bd0d385a1ef951f261b32ebe7c66b1a1530b4dda28c1d4fb3bc32b998a1f2855ebb205a5e63634bb68a171a8f51d159d14d2694952ef4bbaea1e4e6396d970d47f91b4f82a3d1b8d0790b5ac5c86b97d4a654b6d06c6c6e8d71b468396ace56b4d0cb29b7bb745b9451498da4b8b1140f8811c60740a07e711c2b58e34bc0834a165ad1c26619b33d152cb4e52df47f66b9ac65874447504e2251b94227d48416a48b2e771eb1a1344954acd0f89eefc78e41eb721d33894a153af7d2826867cd42c79d446d0c152ab41fe447359654325b4ba5bc3a31394b54a6d097683eedd1ddd2a48a442d73a08102117c098a191529b4dbb2a4da73907ac5aa246a765aa844a12d1de31d37831528b43a675966c165ce6b722ba93ca193f3951bc4fc09993b4e688452d3e1a16ba509ad7f9febcaa8c1cfe70a13dad82fce739bce41b6ab2ca153d1a9afc947b4ec5a51425ba2646ba9f8d33a65246a222208f1a19284be55489d23b33cb2735441422375ec1452ef7fd0f892a072845ec7ea99121754dd57152334fab25c1efd6496c7e7af14a1d75298d63842b66b9b44e885edf2511a26d364a83284de536a17a9456ecee85684d0ce86cc5992512e5b96952034db51c9134246355d88446d8c0a105a19c46541c7ea102e3a0a2a3f6844491512a31217b0cbc05906f0cc4d60a935697f6b81091811a422168125470a1a280508c01a29031e014841f9050d75828223011c4829c1e11e013803000200800c6c0007201f00404a4a122180003c872b910204c073b83a411139000006d08004a0fc198be7481919010140001470001c37ccd026f1a0abb5a8747d1c379632b427bc3dff66cba32e92e100608ca1cfac1bb54793def81b9a6088610d1c4b18da132deb5ea9239b3d22515b03c772e36fe48dbf81c0000396e4502737be8025397050a2d018194900185ee883afce9d2d7fd41d4312dd3334ce6e3cca080e4ad4885a1e470a5b0e93124c3129c961a3048c2ee00802c0e00296e4402149b13132920030b68025396c90a4f8c84802c0d0428e4fb9f1370c004616da4ce9db27d685e91f0c2cf42f5b1675bf9c3805c7c988d9001857e825d562ca4f422b212be3e04fc98d1393356c9c94f13fc65eca186058a1fd1c57a36f6aa5a2f555683fc36af414a29e9da442ab2be379d45916bbc33585d66484dcb032ea89098121855ee6a454a7761e8c28b4a2849a67bd331850683d68d32ee678e59afb13fa8e528a4b3a7bf4d825184ee83dce63891727839bdc844ef8c993b31ab3d28c097dbb206596436f0e9fcf25b473a23fbf1c33fadfa58436b6ff64a92909bd122926d385979e5a0b129a934d13af5f95762a8fd07e799beea82b23f43af87a6752faaa6f16a1552ecbc8902f4b3a0939115a2d96d0a2698daaa58e0fa18d177590101aede7a74346f92fcc29088d96279b49537b4f0b0161f79848f32a56e77e739dc5e82c307ed0ea4f9d34cba0328c6a81e1834e6a19d13a2615d9ff662fda74edd41e735d7c252251fb33dc8c105ef4fa4a85792bd58fc2905df42d7f16a3590ea51dafb3105df4d95f54fa5f87a76769482e5aadd3b4a40ce579b5741221b868b465f428326bf1516cb7684bb6187d7eaa5f6e1d5b3423376bffd231b769c1736ad17ee78eaf64c7efe6d56942082d3affd5f93bcbac59b46232e4cb496368a94ab2e825195208393b32b3cb8a45df63e27b56e9a628132c3a8dfe1b64c3854aa17a452f688ba67a43e68acef574ce598d193fcfade8a30b993b56e82c8b4acb8a5eb7ea345dd9ace9e62a9a0d25e693988dd95bcb640d55f41db5d49d95596827532adaf8d94cfa768648cfa610828a46778c8c51b6cacdcde613424ed178872993555a37b31885105334524bcbcacfed21d52b459f4fcdfba4929d2d5e4248d1c9c7e99b6e595dd522868ca2d5a2de5f4d17a4ee9c88a2e844cb3a4bdda3158a3e68d916ba59102228da1894870821425e920ff1139d7639e64931c24dcc86e889ce85cbe2472da46a7e87d8893ebc4c32eba3943e9de3447f5aebecb2ac235d4cc24df42dfe37557787a889e65373e8ccbe0c324b2266a2cf973b67c163d6979e43210413bd52ba263d44483d9b74894e6941ae88d559e55f36c4127d940f95adc346d7f32d21a412adbbb0eaadc4c3ffb94e174228d17f9eb91c56b618a7e4c8844ca24d623acb48e1e185fb9268de05f9820b1d5b5be8dc8544a259a95bbe56d959c33b2b8440a26db95f12fb265e265a218f307816fd5745378ee837ca876d49e61f8434a2198d9ba4d0d2d4b1c41e8430a295a3cb34e7f032b3700111b2085c77e6b0bffa3d1c5c88229a13af673fe308edfd862422b92d3a534b9d8720a2f1d7172e731ea3538a3ce0218768b56949312ae61043741a84123717a485e89472f945dd6a2a36ea09d1eb90ef628ce7ddd32893139435a264840ca2d54169cabf6c390a755941342e54cc88d19b5cd67a0d4423ca05d12eebd7ce4f25205affffac1d73b88a77e80f7d668f09253a2eac9b8e1f3a2d0b7f79a51b6e42847d68339a9a9059cc1e373fc887e605f9653edfae5fb9f6d0cb319fb532b9b9f3327a6853648be54ae67c41694e481efa9871543f690de2a1d17e931926c5cb399bc33bf441e918ce4477d693fa103bf49a39bca8d45f463d87d4a115dff372f2a815428746c5446ae1e5f124c2143287c684e789c6cc3a86ca246a2925c84c19217268e5889e9551e3978a9049481c1af12b8347a97154b82b040e8d77ce209f84e816f1b284bca1cd115a68d6b9f3851965baa18d7933b43c732ea40d7df6c6c80d7b1e5a9486b0a19d17de6263d2fe395c43a332a79462b6d3c5f9500b216ae837666cc1b7f40977244de0810fa0c00421484c43ab59d2feda3bccc6900a41432fb666f1b339f907d9869ca14f2252a94e2e7533f6344ec4101149e3040525082166e8359b16224de458082943e3e1da394dbcd872a42164685c778775315ad070791c38d01843ef7ab3a30bdd9c5576232347b2a0f8a7a41a42c4d06ff6fb08ddfdba3c64c3811012865e3e4f725e561ae61dd34108185a79e23a62655d3eefbfd08f0b72f5bee7cffa8222226d08f142a3de829716cf8e580e42bad06f26f92cdd64d456a5102eb4d14c698e5ce15d5a2c25640b9de6299121ba3cb77848d402215ae83dc669544acb92f6a025240b7dcca022dcf565f0fcc406167a9f9d7d93f19469872708b942bf9fd3e37dbe94d2a463566883dc7d2d0bf1dafa9f2af492fe78729430fd8d5d0a15fa98a4ebf391621ada4da12d313ae683ce98a2742934ca25e5a2f14aa7c69c178444a12f69a2b53c14dad88296b37916b1fa3f4fe8f59ae8865697b2abcd20c409cd6ad920a56bd4ae05214de8f4ba0ba1e5312d8cfed4cc086142dbfdba7fa374792eaf294b68b4b590fb26647849cb4ae8c524b57efc53ba202409ad472dab8596b4b859c94868b7633fcaab708c9023b4da7368066da2d58488042146e865ea152edec9fdef9022345a9658139b255fcc3184088d10d3f0a24bcafea4afb1206408cdeb9c938cfdfd4a731742e3fd7e22b2e4cacf5a4282d00a21a370c9c5380a4280d06accd1f7930ea6c5fc412108f981a2153914e28346cabb309df5c7dd2c5d2379bde8b4164d9856edf3a2dd329da3651d36bb9477d168d9a1cf5fe975d1c8d62e8f901da9b318ca45df316717b34bf2275c8b8bbe579b9a9411f275cfab3e0820b768fe5777092965ab7cc6169d3ed961fa596b7d524a44c453d4f2a80720b5e8bb77830ed25b8bd1315a34427a4ba132e2a5c818c82c7ab94fcb9a56fe51c7670520b26893965bee1c5bf34c9cb1685746c7184f653e552622028b5ec7f653e22f27e52d4ea22220af683ca8f857993fcb410b22515b273f82726220ae685bcea2e3de3a478d2741016945ab73922d5de716a49bec021056b4396b73159dd492122d966ae6a03f882a7af1272fb9f89d5c450b928a763f8fd69d592a8f31064145ab3d3cbf2464ffafa64c4e524800728ac654366ea81462da3b88297acf264c6750223da5685c906632c575bce008c8880208297a15f11a3ec88ca2cf4ae74f55528b32d9021145ebc9ff052de31b8084a2ef3d25cae7a567cf16285a1da5d6627468b195de7701f944ab275a6c996849ffbb487278192222243972388827fae05143feaad2faf7ec44a3bb0553327f57a48c4a4038d1caefb8427faece26a32226209be865c943fe8c78eb1017899a794a4a490e13bfb189c61a2848060c463a00a289ce4db830adbabd93f64032d19afc3cffb9a576932211111191c4018260a2dfd48ce1fa856fd172705ca293dd70d9fafc57356c89f6c3876999ce2ad1e6a8fb9b59a7de75414af449738ede38718c5ca8d43006f3601c0c868281400cc2301cd6bb400073120800202c1c8e064402a15054a61f14000452422a48422a2c3020160ac623a1382c10060261602010c3401443410c06623c48c464039f4c69829a3886742b11a5dc5ce8e2335e93f88f556a290615b07e2566e54f5ec9eddc6f0be29645b1ed82cf82ca70704fb020c104ac903840aac14b1cc43fadbcff3ded33fcfffbc38f7782313377b1f69c11cd8c300ed0ad986986e3d763d609583fb0c91b539685ba70f59a85e38261f95089f3cd9490bc930cf45fde6c17963b3bd6f991186b1feab83b8b64913c16f2e2c8371a7b381e7e4861a5d82c675920be1c140f95fff30e895cbf774dc517544153c37406a9991f94bcfa8beb0a16baa20b0c576829285adc592f259a1d3f0daa2368a068735cf0da8a8f9188fea0c1bfeb7e0abe873766d99971b869e0ac3efdc79e734dcac54cc32b4802a24cbec9adeb1510816055769479ac7a05686d8b64000763a5986e08aaed2cb7b7fc03ffed796038e8929cb0218bd77d23a03be15c4390e743c52b4fed45b128c9f793bb2136a163788ebb2d6a4778829dc102cbf00252aa3e103e2826902de0d581083578f993a38906461bb598de5558238a3f1c442558dcef3008b7966dc996730aec782c5b8d846d74bfd1ae98fed1f361cdf3e96a84b84648898f67a28d3211be72ea3e9d723e24f301280a2f8db78b60de1f4d863ebedd24b3b513989e6c30c5b66a59ff40324084b565de384aef5a5b30e95bcd1006e39b2f584b9d8f8b274cebc0333a7e0a067d8180814f28df581d5fcfad71814ca6f9c1736f936d4b9e37294ca2af72c69e7ca4f2244edbe72440fe9974544c699e003c9f0000f31b3b68c4679f42acbeba595f36418174b70bd077d8508a7034ef01ed7c3ebcaab138e9eb81d2a1b022f527a3681305193e759cc0379c2956946d56d1ca4be0306f5b83228234d3dbdd70d62e7cb9dadbc22516c79249490cb096ec017ed6875e71765d2af481b6dde3aed0d086dee0f3a623aac08829c1766af5e7f3fab815b28fbab098d297a22eadcf19c8260264cf25e6a6544691f0f32937ab3dbd29b766cb9f849e5249ae5f5cf72a1b9f72238546d7bc85d009fdc86b2c3fab0e5ad485381596ec04db80a83380a6cf6e382eead11f093aa0315a066cd89ecb0130cc8daeb14bddfdf9252ed7088aa59eb99af4c3d77d7778ce0e9e635d8fdb9743fecc98a4ddd28a99b036aa087e442c485eb391a8463c15aef75e0aea506f05ebcc4f617ad85b61769de823fe3f9dc65c5691ab5b321b5f431ea9d78a0d7f9166312bc81a0c6eadaa1c31e42b80c1a1c8337164c2f165a409b472ae278e7672496b3f4cd913c100d3e30b8ab3de3106c5f166879ddc4ae360b95d11317e1e73b8a7c880c3ca6c111778adaae8c18b17ee0c87e34a96111b267257b72b95e761028a1f15797ba1cbe6f38c817f7ca0bf8e8d3ed2975b839762d55d549705bdb54ff9f695728b98549953075449e7b65f5c66a7441ca0d9bc1ab5a005ecf70aa64e368340972ca156be1e95bf1d389971329dadb25ecd4fdfd3b19556d9f9367a257d9a591920e0917aa57e01c7d902fd5cfa7412bc93b924e74bdf191d83e419b4a585395578c551a685c678df282ed42c7156755b7cea3ebf486ce46df105757da0eada021211f3081ef26cf844d3f9e971217e6b452e794ed635ddd644327d1e718e500dabf7a280358ccf3061d99ab82dddbe5519501d98c3ac05cc1592826b158d864edbd3f4f753accb956ae46e583d1f5ba52f37f34c833147812e1ff106fa7cf206c8134347fa028501cb25713a2f3790f73f214e4f324c1a39bc5082b683369402215bbb2cdb5f516b207aeba211c38d7cdbd7ddee180af6be3002bdc3342bc2958880685c938660a36ae0c185b912bd83516c17e778b2f1b1bd0a00865be8f8c908d6cfcab9337c6511029d6a9cd294c506101d425ef63b65022d638e2606015d955aaadbcab202e4b75eb4a0a10542cb08a004f9c096e211fe2aa2592a1991826ec70c180f6c2ceea51bf7673888b6f49afa1c0f4c764567efb93996bd74f4d0dabfb1cc82672d9c3135ffd55551947691fceeafe889c8346ea040a6df112e130aa5858da0890495d42de5a070cfb4f1ebc68609aa30a1a383e62a92d0103ef51372b9fbae33133461b1efb72ef1959026ecf81d8e3fec517274f1523391084365eccd24d4928ca9f9e2411f00459a9e2f95c766aa4127fe7d8272ede5cda022efcfbd30d48f2b36cc16cde570feb6ed9020773585574e7ba0a01d369e626061ecafa916629972d84646691aefbdd8dd6643c73e225decd41d0c1a16766dbcd66163acadba48cc80f7632c5f99a2564410880f794e6c53915fecc290c5f46227f9e56fc715f12b3b79ade94c49fbdb35d2b53b72962b483d1f651b805df0c7e50b4bd870e54217361917aec66a948529b08159172e0f8e03ac5477a8113d8165d2624410007b6dedc1274f9e6133913e84e9c6f3f8a6da997046816172f064f959db56f0e66e30c45fa823c9b5d5c4b5a68970d59c4a6d3f253a58024d99300751dd267c0893c472bc06730cb9cd54971b1428f6f7f74dafdce04e83d4dc06e6fb938549c250cdcbb61e7388c443beea464b5db874e3d67581ad6a92a69d877c3a1fa4f35da4bb97d585b0ebdeb00d3f8c202d95968d0c85319811bde5421bd09ec2d4731d19b2635163190ef527ea00cad950fb126b2478c8b49199bb14e0b3f7136ac1b27a61023b05bea31570e80223437155c92804c3207312e4dc12bf42fe32d330de866a93144c4428e7b0b42b3de1ceb4d4be62c9e66645206930e23558ff7092707f8f29eb5ee7e209a14cdcf1bd27e553790c8936d6fbecf6fd7a64d7206aff581912a1734ab6ea8f53b5f30b2a5a419eee6753417c5511395e1fcd6378f428ca4629beb9553e3fac21d92d0030b9c96ae5aa65da07c3deb35c9ee1c94e2b50b563d4ad341c78317136dc617769e397520f14ae52f56a6d13a8bf45be2f75a66a790bc501dfbc50b618c50d33b89823c7bfe3a56d40a3f93082ea762d673255d7a026daeb914428145da2f4fa7490da3aa7ab4db4c8dccfd40999a9b704834aa27af22a4934c52440789b048549d581a044958f0329652dedfc1041159102462e6b4545370f82443386c8f66ddf36f0300233b21c368b42b557406583993296f7ce13b4221829f1d56cb0198ccd8423a1a15418be0591b805eb5b11cda015df2744609cf3c44d9f80bd42acd8b4e7176f0800588b4526bac0be629c72d955eed0a56f934bc839c280192e68b53eb07526a3a3776584e82c898c3514e830dc044266bf184704085ba2211036b5e571b69f9ecaa2a0608b67f2c66d030f8f0f16123e9e7f6c5d0036306b6a1ed64c8b9446e039b12a834c6ca927f66974c6fac02e9d6779024a636cc01c4861834fb10425d02ef4e5c081ecebcfe7b89a797cdc3ae60059a5c61d3cbb89b6f653f8a47baa92a99a0491a04978409a7a7d4a56477930eff60bbc8768fb8ddbc7274cfcc18271552bd3b4a412e048ac58cb749271eebdbb10dde4d54346f305a36026bba9991ae7371f8baaa05ce700a0d8aed159b05499871a48122a46284c17f1d0ddf0a120329a7ffd82e99390333e4c613cbbba305f6a8ee48cd56b777a2daacfcb5c79ed405e6c73c7e696760c04942bf65ee5dbebd8def43a8e00a4061055b8c5dd7158791fad1797297c371668aabb4270cc02d6a8f888d928e554d374aa5eff1685dcb325853fa3953e7899c038ea98ba5d49828946620e9483c909142bae8e2269c44084f16013fde094e1d4899951c6095036f42b450d607fdc7815cad156570025efa3b3de87ee7a908c77d288fc0a6c14ace72ba829ce050a3d46f95866d8a7b3fea09223d7e94a8356aac80365631d380a785026e2ec556ad92014a479dfb4ad1aeeaec29244b6eb30d3445b63526d486af2aab6aed7c36c8139224fca4342094801e438c44ab10d6d19e59e8dacdf8de0654a5bd5afa5b262dae965fb02668c84c1262b7c665460eeb0a7c9a344cfb28890ec5ce7d51e09b81129c17dabfe5ac7c665ffd2e9bd6fa32684c83cdde3e2bd27cf35b8176ad58227e93fde476cd4f247607b61ec0e307cd630c2d38e3bffea64c926478f711fe10cc745bb673a4b9f6fce39a5941632e864a67dc7604165556a34be39b5700417f935784351d8bf785c053199051d8b790983868eaa32bed2bd06f95ba15e414292566b6db47a12c0a7780bdd05d7b84349255d9f0c7b27935b7bde34d1512a2428c0235850850b2f66528817d26cd869fee02f6fa1244e486ae0268735932139aaad08b5b093b73f9e6b58bc6a21fcf250ec1709213d186883cd33db48d9b8dc7c525612d631f358bda7f3a5737a4a02a828c039d42ef6934b1ce09ce92a484b1582b8ed153c73a86437530edce1d534cbf1d8b588743e3bc05fb31b8ec8fa7e148d63005c8ed5a4ed792ffea19e2e58ffd911b4fe23483f38400324d87da2f505fbcf7c7f23a209b7f477b0383aa5173868cc921d57c7b0e45c0fd8c95fb027edf75ab757dd7aa130bc2eacf23b00d1260009544a7adbcf58b6f20161930380819e38e6912d30a7211c665aac83978bbc4ea7d751efbceec2291f81e8ea6f863bb06f1cda35fa2ea334f82a5692fc282c1a1607e8ae2731cb0b6c0fe6bcbac7b0d7b905f9849c6f864e0845b89414bcb03f50866be1d94e4f9ad2931c9942c2049e10cc41304b78debfea3ea264dc4d2adf04858441adda471f26b2e73e599f8fb3619f8795d28ed8d600fadc761cdc37b448c9b422525d84c2b9b3fa77708fe2a11e165bad45f0c7918ec4698b6c14a27b32956f72a689a32d76e021e008185b415631424bf188bdd0e5470c85becc6332c9ad39b99910c486c2cf73158440dbc722159f64a04a05127c1b5a3bcc1197dadc47be0de374ce653815b63e64cf5bbe4545103eb93112466a2bb20e31c99527b22b4fdb25c0d29bd9916a79466b295101cc7b066bf8442ea1b0337bc8a4188cc7cd71503f4fa7cb681592c9b90ca64e1710f905d32a01fd7470aafc254ffb9163e361fad39caef81e03908ba228f4f2d042dbfc7710711619e5de6f63a74ed0be8246421bcca5b2499865551bf356dfb6a73dd25647da8d7039167f85d835755d078aa438a7a2cb4d63c7650b31c192a234836f65d63d9a8d6fac9500923dc381efbee111c66e5cb39fbf469bbc97cff7e7e1e4d5effbf094284185355bc5cac1a9dfa682528b2a3965c7420900a0cfaf1f1c2707119f5c2a4d11a538e266b25f2d5d078776e9152bd14aa585fae5203b4129603fcd8509509c8cf7edcbc7017e928944df15c7de46088130c0d1e75f6dda02741e5be4853ba432196c74884658bf7a0db061b044288c6828c116482d7143e78c44119109fae84f80a2f113eb3f9976dcc7dd5ddcfe7b45a1bbaa4e83418900cd492baece00b1f29a13ae8d6169df5a83b3c8120fc6427553cf0ee055dd74a58cee3fd65032cacb628af757b5069f946c2e3b8be058c00eda3dd9f8bee00203d1b7cac4ad2e3d982b0fd7d1702504d85fdd1e14f79aa5346c04fb1d5c3a586361a558888926f1a3fd2cdbd686268663382f6191ed74e22b73dec5425e6fce917032b83d9c426b323fe61ea32d2e4fa46118839c800a3989443d3b46ce5e4a225d2ae294e0839ad045b997d05218b596f169e49a37890496e56418a80e1477174122bd4afbd56df7ff7739753472cf3395255c561c2ccd3fee1c5c6124176c1bb40251526a77779e0baf7b1edc614f31a2a2df682acd71257ae8c332f9cbb71b015c59bf0f8efcaa3e5311fc1bddf40531e645d6fc2a908edf1c3193d10c147d06c293d698a8331ad05c0bf33d90a7598dcfd44baa5aa8234dd736d73c67892cc4c71a7a82c191742a4216c205e48e64f9fa1cb72e39678e1bacadb8751d9b5aaa879381df08e97498fb7ed61e55d9708ecf77c2b80dc7ac0c9c0833780b9f0398901bf4152bbe06ce9b4863acd7970e49fecc8be8c5fa52d8cfa87f9d7ec794425cfee5896cc6fd3a72be8808909d653bac7249d7da8195894b7ae926736e096837ec95e319144a2d25eac5d7cb80f35e359faf505411e9cd9a3c700eb33ca7c80d4366e047c3a9eacca96f86a28aea443b4e88a9a2f3971b469fc433d49b75fb58584b5c8676dc621b496506a5072955071a5cd97b8e8192eff150528ad53c22878bcbda4ba15b83addf6389929c552c6fa5f28b68e53bbdb8de8f3b2e22c15d9a1abf684db8e17c06524efbc5b50690d9cdb7786d2af9fa1c5b8341d145b62cafa7b0a9c63be9f002099510d582ebb4065d88a44fcdfa35658513289091d6bdd1faadaebdfb0ce0f215636c9239840a818456763c793180468d475090b64b6d985834a55124e5378c87afb611674b9bf9d04260fe58a534ee87fcaea7a1a1120d262851565bfe5c7f75b94e1d7fa160eee8c2de801c2b2b58c8d082b71fda721f2b778171eb57c4ac56e439c06888d9c6b01e4eab67e54406955cbfb6bf7009400af526ea56fc50ce1cb058210c7359ab26c4351c4bdd1d3afcf194e758464f5874ee63dcc34b3a435dbed6034a6af0b0f653e4e6f8d222e0e574e894cec1d0c04b4a8251f116a69b793a5c1816681f140b1ba0923c2b17c7224780a25147b504097e8ad4e00b5a6c9200244454f2d9b7348272f9bfe234cfe95f0525db4e8717cde89f349b44d4db80d8ce0eb9491a2767c334e9d4f5e70842e55d7dbe45ec637308350cc9f79b4b969ea644e208dc999f6a18ec838e22c0013a97a85d02721b74889224e2d5a2876053eb5ef8cda1e9a5dff3e384ae63a8fda3309291eaf03dac7c02a99585c5a055764ee7a0d3c70729e5dff657f5f3e6072a7b28f9610c3d61b0859b4f93468ec9a786a11d8b3cd235ad763654b2ff97eebd0932a46cfd868eb16d25a5c0b5d7d54c4f8f2b8a969f81306f02fe1a0ec64e4990eca9c93921e123993c119211ba89ae8141e4a630f56be9ca468aaf89dbf4fbd9473eb13d66c468cfed75ca77b7ce7ca33b2832f666b2aace5bf2215ec2a4bb96b814e42cb8e2de141eda116730c7ebabc986e64826c96620c38ed55d976728058c3a4b5f63cce541ee34ce9e0fbf5876754d33ad0ba51a4b8c3b174a809deff86c8c78be547cff2a0be9474e90b50b2c397db4519c631acb87edaed9f4ec75d63d6c937ed0c04fb25c2ba9e100d02862f42c58ff2c92b83fb63583edbd216128a23141a554454956ea6b43271c777382c99cc0e4900f6687763af39866fd19eba9a4399608785b29aa46555673c9f4f04edd78a3f1a43c9501f185645211b7f5de086831af0c15eefd12c508ba4199e50c3acea181a9e45ce5a4f42043e39c2f671926010da9721e118e51a84221fcc1052f251ad3f0991bb6acac5744d0c66ce7061520908b0a30c72902305062a05210639a154bbcbd27ea0412fcb45afcc69828a2723194bd109466d6a6a36d2dfb181cd345c56dd8bda6ead431e72ac9d83227f96a41081fefe7f338d0d3318466cdb0d5cdaba01241e65a2367effc2541ff98104834423312b9b67570bbe80cbfea8d5aea3add245a38e1a599590fa2ef25b35539348e4de76c2a57b6ad92f8bba71ce11a67d16c3474f35fb087d619404b9af9fbf45b2d3342ab4b18358585739ea937cdff15e79bbec3f2394f28c4f2e62abfd4dbd4f3dd9914898b515f708681fde76401b91443adc28f742be55fa81127a987351c3b0b9fee761f9d5f321aaccc3904e875bc8cce4b9ec54baa009036db710b48921441932825182913bad2ab284b61cd08181768a4edcacbc116d138d7b82c3a8a827022af537313732ac6f4cc227837fca198992f5658d399c741dcd9bb7c683f66c41b7e8000e7270473b9d247567716fc4c72f7050cbb2e0f7d909d5619a8369086435545b46482598e4e131058be54478405201e6ed9aaaa1c2773617ed95839965c2d9a3d03459948cae8dacd0a337f6b4111f4d3798d2be97da084e9f264c8c7c481887b7685a5fbed7ed4276c8d4d6140a16459934dec3d6673b6bf791229c06a3368afb48f827d8bf5917dca66e55d6285860290d2d06f298220d456735a14f2f52b1f3219dc70427dbe4dc73a94debeef6f238d81107824867b110788beea1c361095668fc30855c03ebc09bd725f18dd5eac0e5de9a9a21ee59032af0d57b60f8ddaa98d5e63a248809b8b862702813f56519f12c8a1a22f6865dcdfeef5eaaf5d76984cf082ee1b2cfed9cfc4d259b460b6600a991a01f1db88f43b775fb10b4d2e32385fe81a0481ae0c85f4e736ff58731101f9c3e9749a9b5b83cc64799d7f98f56691e0be715b01ddc947abf05f09233c84681b13cc2a66a8c015467eb90f431923c1513d96a61123337cba3b8285e66ea5e341deb57fa60b256e8337c44f1e14d80829307b5cffc9ebab66822584dbf930d0f70c06d0b456df61055c8aef183550daba8b6fd505d9df60bee970f39d6fa036eb9fc7632a665e6d4f8556872d86f2fc1b8cd2d110c282459e3498e786660f86ad02a9d03a62ad1bd30c550f878f15dc7125ab6149a391eb247d5eab002e8c2c71b8bed33cbdf3cbca9b2fcc371e815a5163c01195dce28eb5b3fab2110c67599c9e7d72c9872f4d6b60b37694cd9d194dff330a1c0dd5a6d2635660ee993ff6345efcd5ab0d1d3c64b8c322d586542d846d0a4993c8d9f0d8a3492c4c8607297ba0fe85c46a0bf6043812cd1ddc921378513b583fcca5982a68b84aefb2eb11193f904f9383cf2f990503317f1cdce10178ba8620e41da0203fe188525dacf3a7cfcd2b08eafc88fa328339efd4ce07804f3872dc3d91d99f81cbd2cf15e9735299ea96ce4d7bc9892d34c230884d270c30762a255a8c99c92a4018f3cb1fe680546504271b755ab63514d77f16fdf2c48ab41ec26799d0ef5014f2aba4f3a52673925f5402f5cd1dd871e3869baa596d0946baa9bfd2f7816ae69c9a36c478dc33584fe7b17284375b932d35993710442466f477ebb485bf00cc7051e2e081298fda29d7e380040a39dbc2e083dcc82841ffc5dd9b7d1b7e44b1df68799016882eeb763cf291dde048ddbc25e6bcbea26d0a07def13454d6cdb1741f6557aec0bbe4803c285f4c03eefa64a84d63c5f6646d1e1273fb2d0068a3ccfad697eb23d7b02e5f876e8040de674995753b56619d462ebd595045451c745465aefd6eb28a9eebe6177a24c62dcbeec2709640634fab793069f59df3299aca8abc1e7a728a6518e09cfe6dd124ac1625af32b585e3d20a3250e9a80542d81034f43ad1aa15227173ff220667a557417a6408b2e3a74677baebccd0acf23088cd4ea83c02df6ba866ee42ebc9a7d020569644fb0d691b463a48e53300f36da9d01c2bb8b02efa369901f346bedb54e92971a9b25a71450a0aed698caf1c14cccb09d0762666b0b418cf0bf75ae4d904dcf928a9503329dde3a86067f9beac240a2c759a64bd650d769719e1dd05dbabaff57151fb28557ca31518e3f3da30744604f618735f9792120ca302757c68f2e0412e94b118e9f8c74dde4c2447a8741442e2358ecb781f27251c81425e25839b0bc195d09c9c15f1b639cd95e83e18a0742fe7e52ee38363487dfb25a1199308ac739fe320a9064726782e80c5c1945947d460ddad35a3030173a8fd16acd64ed0ebc4a553f99c3c2e4ebf9001605e7b13454cd3f3c4bba6732d48c7c6d2753854293274f5445491d0c6d516a65fa965922f2fde2ddfa97c3443ab53aec6331505d28cbe0fa20754fc60c280ce129f0eb859e0fe7d2082b9a310e0d881639f1a33b1ac299628ac36f3fe0093693352ac14802c52b254ac275e2313db96cf4453071c5293f69d494b43bdad1dae92078534e6f9f93596298d1d7eafc6ecb62ace74c4bf368a30c07f74488f07586456d50e601c77f82482d3c03931c369261134fba567563433b3c71c3737ee20a3b7d31def9d3c573e2ce1520b5feb753f39a888eac38e82f0efbf6e3f5e1ddd22a1050a068c3f35dd03cad8d2b8d86b031e1ea53748149ee355ef0bb64f4ba41249c9b0b003facadd83ad6fdba89e0326cf64083af807a533c5dbccb39070826b74da550252130f9c1ed811bfdf3ae290b9404b733fa21e4cc23f2f0644b95e18632679fc83a458c5181063a6ba62c6e1ffd522ce08706a009421252a2009c34940ea246069cc5e2b407c42b27c1258a1c755172aff1846c3fed5768f8fcd8b526e8a7f92f4e9d05dc2036b400b389d367ca9036cc07f73c69c47b69eea984af28e11e52484617eefba6f074788cb5d171ca950ad0eff6e9f01366d8feb5275408ddb6030556c8db3dc6bae953ddb186311123a31750527e8843f5982d9878e97a21bad484db62e36b51f57afa9264a0b8a489ca067263a1d66190458e4e60658952b1b55f25a0045511b3b0821e7e748bd80abc96b55b9ff9930d0c62e24b7446d57a887a4e479552db476de8c5196911a388e40eb7038f338847930c453a865cb3889f009ddf23443d57563d8bb4aee6c1db11756a154a1b233ab8ed69c8e597cf093ecd48e933e86b89ad84c48c4c1a8c35910f93418d141bec026ac878b3d6939a62050748611bc10e6c8552b27ae16f36f46a67fb0d19c676f11ac28da210eed135b6bb7c62909ff852479bb44bb34321651782950bdba0c758f826ad680cc0af308a0ee517d6b25aa2a623cc926c921362601dc13d0ce6c21a746c33a5b85f5207a3ecb3d52c865f08013a47024de3d8a5ae6c8cc12f5d196635cc38714a4cad2a837b6644fa5a8c6267a6508988dd38220f8bf0dcb6147c984819e49420a194fdbcca406a56a79423e7d079fee3d4dcca90aaa910115ef2f429b633773c6ffc4bd2011c00400cca2e09f0e9c1ebab29f1e54555ceef36a2c1a7f6ae3d34183da08c2e42163719c5ed669bedd922b9e11a078a1b996b0bc53bc1711091329b38bf50a169970bc7981bfa1aab346881ddb7ad70607fc7dbcd3235ca99a69f3ba2a435f4e732a6117943d5e25a01f91e6b9eb51b32b85a3d9f1de264b90e94e01aedba996e7af52076a584c7a050302ea94af8e7691e0075b00eb51e808fef554e046d0aa205b0f86b577b4b3136fce526bd6e977194bb61c241941494dba55a0abf9c55cbeac889e49eadcb0c2405cd34b8c08d711e49539641ea7bbd8e42a20d3c9d28f48e848f9c478533e1ac71ad9a85fd025a05ceb1499d680651c228259e2bed134da1295a92d8cdecc3b77485ca86e49fb03e344ff70ca0631d9e7443891089462514590a1497eba6e4f1f498d946b959e41ef792a532223d86bfd8eb09a981bf3f906959bf37c4d429e5e00a0396be66b532e90d4cc7208d684c54183dd5037d01310bca4ded207d237c6c12b374648b2c25abb4b31a75801616b97fae8848cddbe38b27479716abf03f932090ced973017340f431ae37953d9e302320995b6a6bb6e1bc55bf6f1fe9df93674b224688c0f4c63f840877ca699d45b026070babd2806ea4ee4db179511f6fca964ca02ae31741c6ebfb2680ce4fe6ac1d434e5c11a29dcd6010e17ad6f523ea7b2931a2ecbf5bcf3316ea38d1453a2b34c55b0c29dcb1043ccbb4444924aa4b2252224ee719a5fb7b8837fc2f54e897ddfafba0700c09a022b6b0e296c641c7ef16474ad793322e003141cec5d961ef24eac8d02c080bbd18e2f1e2ef90117a259d444a3e13100b77ff478574c3ca55e873080b5bb180f8dbce337a4468ff032a1fa7ae740065b58f1015802a1b632e4686b414d0473a669e4ce030b06ef3736582725ae15d83cf768e12dc0550494ec761523f14d5418272a32e1b2b31cd852ac289a217a492b8ad463b994ac5dcfcf02c06c8e7082e6744d2f4cd6356eeb227b814f6930ca4b4c44e6a0e17974a5cd7162e6c23b4bd83c9194cfccf5e206d7e374e8e592848a70ef2f49e156f83b75f20d297e34818a6a450bf4b64333bb8b9a5d3b8223113c8a4396666fa1fd1cc2b88e7bbd28f8b412c4413249fd264e793152aabac48bb16c8170d601789066d62dd93b1b77f7a98d11263d4c716f50618c4acad10db14a687fbeff004ad386449285a1bf2e96e52944349740977387e0fd194235da6549a944618db99c8366a0504264f8cd7667f0b8451e0ce5a765ef99a460c84685c9d5f9ef667731b5566e186f6dfa9898fb07043d4c3a64b81dcee50db2140d77bcedb0578058e91bab05d7966c6e72366badaaa4ea4040ca16945ecfca9ac0dab57fde546db179050483dc246641fe3209e2b7d76a42bb16d0edabfd1242b63b0fc05613acabd8dcf98c340f20c2a2f074d17d5bd511c67ccb11256cc01c644ba2a6a4511389de57babefc5561010165832b8665c9165fde836f744a0ae2f93ae41573016c592faacd834d53933fc3cc1fb6f7f2f0fb216ff61d1e4899b80918176c82e920db4902855366beb596de1d8bce3d22744407c7a72bad5de7c97a041e7e7c3b16b31dc158901afa8dae260fb99a2adf372e6ba9ea12b8b35c85ed4aab15b0cdd2b7ee2261175a59ff48e002764a2dca2a1466054a3f272cfcec9abf1be5c4a5c67d2fd68cf80e3edf5ca6934b6708f0b45f6aba47d34bdbbb317b11b759e38c5a3c01b68d5503998b27d5b82cbc4f5138f558c202baaf76003c5f2a9081a4420c2d5f8ef38548f62336c48a9b931557746d295ea6778cc9851a0a6416a216446bc02eda11d0455459d85038f799d01b64f8e0be2b8c773dbe68bdefc2abc6de2b7681ec07a5c4b1ac9157ca334f8f42135ebcb90859adf3d12fb207fbb2e02ae2f6218f82c821300c9d539c6a71da17abd7696228754c8bd579e15e162a2eb45179e41acfb4ec5eb507c757ff05717182ba17d0fdd62901d7c8079f80f19abd605a8d47d2a0b4822003dec2e4", + "0x3a65787472696e7369635f696e646578": "0x00000000", + "0x3c311d57d4daf52904616cf69648081e4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x3c311d57d4daf52904616cf69648081e5e0621c4869aa60c02be9adcc98a0d1d": "0x20de05506c73f35cf0bd50652b719369c2e20be9bf2c8522bd6cb61059a0cb003304e3a3ecadbd493eb64ab2c19d215ccbc9eebea686dc3cea4833194674a8285e064842b69c1e8dc6e2263dedd129d96488cae3f6953631da4ebba097c241eb23786b7889aecde64fc8942c1d52e2d7220da83636275edfd467624a06ffc3c935cade3f02e0acf9e85d9a4f919abeaeda12b55202c74f78d506ccd1ea2e16a2714491cfc3ef17b4e02c66a7161f34fcacabf86ad64a783c1dbbe74e4ef82a79667e126fa970a75ae2cd371d01ee32e9387f0b256832e408ca8ea7b254e6bcde7d0a2cee67864d1d4c9433bfd45324b8f72425f096e01041546be48c5d3bc9a746", + "0x3f1467a096bcd71a5b6a0c8155e20810308ce9615de0775a82f8a94dc3d285a1": "0x01", + "0x3f1467a096bcd71a5b6a0c8155e208103f2edf3bdf381debe331ab7446addfdc": "0x000064a7b3b6e00d0000000000000000", + "0x3f1467a096bcd71a5b6a0c8155e208104e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x45323df7cc47150b3930e2666b0aa3134e7b9012096b41c4eb3aaf947f6ea429": "0x0200", + "0x4dcb50595177a3177648411a42aca0f54e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x57f8dc2f5ab09467896f47300f0424384e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x57f8dc2f5ab09467896f47300f0424385e0621c4869aa60c02be9adcc98a0d1d": "0x20de05506c73f35cf0bd50652b719369c2e20be9bf2c8522bd6cb61059a0cb003304e3a3ecadbd493eb64ab2c19d215ccbc9eebea686dc3cea4833194674a8285e064842b69c1e8dc6e2263dedd129d96488cae3f6953631da4ebba097c241eb23786b7889aecde64fc8942c1d52e2d7220da83636275edfd467624a06ffc3c935cade3f02e0acf9e85d9a4f919abeaeda12b55202c74f78d506ccd1ea2e16a2714491cfc3ef17b4e02c66a7161f34fcacabf86ad64a783c1dbbe74e4ef82a79667e126fa970a75ae2cd371d01ee32e9387f0b256832e408ca8ea7b254e6bcde7d0a2cee67864d1d4c9433bfd45324b8f72425f096e01041546be48c5d3bc9a746", + "0x7474449cca95dc5d0c00e71735a6d17d4e7b9012096b41c4eb3aaf947f6ea429": "0x0100", + "0x79e2fe5d327165001f8232643023ed8b4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x7b3237373ffdfeb1cab4222e3b520d6b4e7b9012096b41c4eb3aaf947f6ea429": "0x0400", + "0xb8753e9383841da95f7b8871e5de32694e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0xc2261276cc9d1f8598ea4b6a74b15c2f4e7b9012096b41c4eb3aaf947f6ea429": "0x0100", + "0xc2261276cc9d1f8598ea4b6a74b15c2f57c875e4cff74148e4628f264b974c80": "0x00000000000000000000000000000000", + "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb334bd1b4448aed1acf00168a3d082a8ccf93945b1f173fdaecc1ce76fc09bbde18423640194be7212": "0x0a2cee67864d1d4c9433bfd45324b8f72425f096e01041546be48c5d3bc9a746", + "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3558b17e2d0b3f3f1026d79399d627961c528d648413b2aa54595245d97158a8b90900287dee28216": "0xde05506c73f35cf0bd50652b719369c2e20be9bf2c8522bd6cb61059a0cb0033", + "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb36823ed8df7d5f458c46ff658221e07564fde2764017590264f9dfced3538e283856c43e0ee456e51": "0x786b7889aecde64fc8942c1d52e2d7220da83636275edfd467624a06ffc3c935", + "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb36a0c0593a5aea5de3a6a0745688c52b4709f65fa2e4508dfa0940ccc0d282cd16be9bc043b2f4a04": "0x064842b69c1e8dc6e2263dedd129d96488cae3f6953631da4ebba097c241eb23", + "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3753bb535f9a5c087d4e6d6256f56677bcdbc0543f1a2c40aa82497b33af1748fc10113b1e2a1b460": "0xcade3f02e0acf9e85d9a4f919abeaeda12b55202c74f78d506ccd1ea2e16a271", + "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb37e2ee72825a39eaed6a941f3a15918925170cc4e703c0beacc8915e2a04b3e86985915d2d84d2d52": "0x4491cfc3ef17b4e02c66a7161f34fcacabf86ad64a783c1dbbe74e4ef82a7966", + "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3895beaa2b05beaa210a59d610a39fc102624c8e8aa1096f0188f3fdd24b226c6a27eeed5b4774e12": "0x04e3a3ecadbd493eb64ab2c19d215ccbc9eebea686dc3cea4833194674a8285e", + "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3e71f9b191f1e16b3e5c49f7bc76b9e1b91566945e2eb539d960da57ca8e9ccd0e6030e4b11b60099": "0x7e126fa970a75ae2cd371d01ee32e9387f0b256832e408ca8ea7b254e6bcde7d", + "0xcec5070d609dd3497f72bde07fc96ba04e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19500056f33349d9e27d61757261807e126fa970a75ae2cd371d01ee32e9387f0b256832e408ca8ea7b254e6bcde7d": "0xe5c49f7bc76b9e1b91566945e2eb539d960da57ca8e9ccd0e6030e4b11b60099", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19501e0cc33672d676b66175726180064842b69c1e8dc6e2263dedd129d96488cae3f6953631da4ebba097c241eb23": "0x3a6a0745688c52b4709f65fa2e4508dfa0940ccc0d282cd16be9bc043b2f4a04", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950282569fa857682ef6175726180cade3f02e0acf9e85d9a4f919abeaeda12b55202c74f78d506ccd1ea2e16a271": "0xd4e6d6256f56677bcdbc0543f1a2c40aa82497b33af1748fc10113b1e2a1b460", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950b666a2ee6f1209d3617572618004e3a3ecadbd493eb64ab2c19d215ccbc9eebea686dc3cea4833194674a8285e": "0x10a59d610a39fc102624c8e8aa1096f0188f3fdd24b226c6a27eeed5b4774e12", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950c9c26586b5e6d00661757261800a2cee67864d1d4c9433bfd45324b8f72425f096e01041546be48c5d3bc9a746": "0xf00168a3d082a8ccf93945b1f173fdaecc1ce76fc09bbde18423640194be7212", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950d1c26d664a1c2d476175726180786b7889aecde64fc8942c1d52e2d7220da83636275edfd467624a06ffc3c935": "0xc46ff658221e07564fde2764017590264f9dfced3538e283856c43e0ee456e51", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950dff72361bff547ff6175726180de05506c73f35cf0bd50652b719369c2e20be9bf2c8522bd6cb61059a0cb0033": "0x026d79399d627961c528d648413b2aa54595245d97158a8b90900287dee28216", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950e7388a37187835bc61757261804491cfc3ef17b4e02c66a7161f34fcacabf86ad64a783c1dbbe74e4ef82a7966": "0xd6a941f3a15918925170cc4e703c0beacc8915e2a04b3e86985915d2d84d2d52", + "0xcec5070d609dd3497f72bde07fc96ba088dcde934c658227ee1dfafcd6e16903": "0x20026d79399d627961c528d648413b2aa54595245d97158a8b90900287dee2821610a59d610a39fc102624c8e8aa1096f0188f3fdd24b226c6a27eeed5b4774e123a6a0745688c52b4709f65fa2e4508dfa0940ccc0d282cd16be9bc043b2f4a04c46ff658221e07564fde2764017590264f9dfced3538e283856c43e0ee456e51d4e6d6256f56677bcdbc0543f1a2c40aa82497b33af1748fc10113b1e2a1b460d6a941f3a15918925170cc4e703c0beacc8915e2a04b3e86985915d2d84d2d52e5c49f7bc76b9e1b91566945e2eb539d960da57ca8e9ccd0e6030e4b11b60099f00168a3d082a8ccf93945b1f173fdaecc1ce76fc09bbde18423640194be7212", + "0xcec5070d609dd3497f72bde07fc96ba0e0cdd062e6eaf24295ad4ccfc41d4609": "0x20026d79399d627961c528d648413b2aa54595245d97158a8b90900287dee28216de05506c73f35cf0bd50652b719369c2e20be9bf2c8522bd6cb61059a0cb003310a59d610a39fc102624c8e8aa1096f0188f3fdd24b226c6a27eeed5b4774e1204e3a3ecadbd493eb64ab2c19d215ccbc9eebea686dc3cea4833194674a8285e3a6a0745688c52b4709f65fa2e4508dfa0940ccc0d282cd16be9bc043b2f4a04064842b69c1e8dc6e2263dedd129d96488cae3f6953631da4ebba097c241eb23c46ff658221e07564fde2764017590264f9dfced3538e283856c43e0ee456e51786b7889aecde64fc8942c1d52e2d7220da83636275edfd467624a06ffc3c935d4e6d6256f56677bcdbc0543f1a2c40aa82497b33af1748fc10113b1e2a1b460cade3f02e0acf9e85d9a4f919abeaeda12b55202c74f78d506ccd1ea2e16a271d6a941f3a15918925170cc4e703c0beacc8915e2a04b3e86985915d2d84d2d524491cfc3ef17b4e02c66a7161f34fcacabf86ad64a783c1dbbe74e4ef82a7966e5c49f7bc76b9e1b91566945e2eb539d960da57ca8e9ccd0e6030e4b11b600997e126fa970a75ae2cd371d01ee32e9387f0b256832e408ca8ea7b254e6bcde7df00168a3d082a8ccf93945b1f173fdaecc1ce76fc09bbde18423640194be72120a2cee67864d1d4c9433bfd45324b8f72425f096e01041546be48c5d3bc9a746", + "0xd57bce545fb382c34570e5dfbf338f5e4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0xd5e1a2fa16732ce6906189438c0a82c64e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0xe38f185207498abb5c213d0fb059b3d84e7b9012096b41c4eb3aaf947f6ea429": "0x0100", + "0xe38f185207498abb5c213d0fb059b3d86323ae84c43568be0d1394d5d0d522c4": "0x03000000", + "0xf0c365c3cf59d671eb72da0e7a4113c44e7b9012096b41c4eb3aaf947f6ea429": "0x0000" + }, + "childrenDefault": {} + } + } +} \ No newline at end of file diff --git a/cumulus/parachains/chain-specs/coretime-westend.json b/cumulus/parachains/chain-specs/coretime-westend.json new file mode 100644 index 0000000000000000000000000000000000000000..377870f9e2b3dd8f9303936cc54668a8ed830bf4 --- /dev/null +++ b/cumulus/parachains/chain-specs/coretime-westend.json @@ -0,0 +1,74 @@ +{ + "name": "Westend Coretime", + "id": "coretime-westend", + "chainType": "Live", + "bootNodes": [ + "/dns/westend-coretime-collator-node-0.parity-testnet.parity.io/tcp/30333/p2p/12D3KooWP93Dzk8T7GWxyWw9jhLcz8Pksokk3R9vL2eEH337bNkT", + "/dns/westend-coretime-collator-node-1.parity-testnet.parity.io/tcp/30333/p2p/12D3KooWMh2imeAzsZKGQgm2cv6Uoep3GBYtwGfujt1bs5YfVzkH", + "/dns/boot.metaspan.io/tcp/33019/p2p/12D3KooWCa1uNnEZqiqJY9jkKNQxwSLGPeZ5MjWHhjQMGwga9JMM", + "/dns/boot-node.helikon.io/tcp/9420/p2p/12D3KooWFBPartM873MNm1AmVK3etUz34cAE9A9rwPztPno2epQ3", + "/dns/boot-node.helikon.io/tcp/9422/wss/p2p/12D3KooWFBPartM873MNm1AmVK3etUz34cAE9A9rwPztPno2epQ3" + ], + "telemetryEndpoints": null, + "protocolId": null, + "properties": { + "ss58Format": 42, + "tokenDecimals": 12, + "tokenSymbol": "WND" + }, + "relay_chain": "westend", + "para_id": 1005, + "codeSubstitutes": {}, + "genesis": { + "raw": { + "top": { + "0x0d715f2646c8f85767b5d2764bb2782604a74d81251e398fd8a0a4d55023bb3f": "0xed030000", + "0x0d715f2646c8f85767b5d2764bb278264e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x15464cac3378d46f113cd5b7a4d71c84476f594316a7dfe49c1f352d95abdaf1": "0x00000000", + "0x15464cac3378d46f113cd5b7a4d71c844e7b9012096b41c4eb3aaf947f6ea429": "0x0100", + "0x15464cac3378d46f113cd5b7a4d71c845579297f4dfb9609e7e4c2ebab9ce40a": "0x084acc970c28713ec93bf925352d3023418fdf89933227e1e2fdae8481103dfe28bc3ea120d2991b75447b0b53cd8623970a0f6d98fa2701036c74d94e6b79252c", + "0x15464cac3378d46f113cd5b7a4d71c84579f5a43435b04a98d64da0cefe18505": "0x00a0acb9030000000000000000000000", + "0x26aa394eea5630e07c48ae0c9558cef734abf5cb34d6244378cddbf18e849d96": "0x000000008277f47279c4", + "0x26aa394eea5630e07c48ae0c9558cef74e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x26aa394eea5630e07c48ae0c9558cef75684a022a34dd8bfa2baaf44f172b710": "0x01", + "0x26aa394eea5630e07c48ae0c9558cef78a42f33323cb5ced3b44dd825fda9fcc": "0x4545454545454545454545454545454545454545454545454545454545454545", + "0x26aa394eea5630e07c48ae0c9558cef7a44704b568d21667356a5a050c118746b4def25cfda6ef3a00000000": "0x4545454545454545454545454545454545454545454545454545454545454545", + "0x26aa394eea5630e07c48ae0c9558cef7a7fd6c28836b9a28522dc924110cf439": "0x01", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da998af9d0b9c163cc7caff71526e1e20bf4acc970c28713ec93bf925352d3023418fdf89933227e1e2fdae8481103dfe28": "0x0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9d834c58cefa69bb125bbc8bef14e90eabc3ea120d2991b75447b0b53cd8623970a0f6d98fa2701036c74d94e6b79252c": "0x0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080", + "0x26aa394eea5630e07c48ae0c9558cef7f9cce9c888469bb1a0dceaa129672ef8": "0x66763d0040636f726574696d652d77657374656e64", + "0x3a63": "0x", + "0x3a636f6465": "0x52bc537646db8e0528b52ffd0058544104aeba85d4125110284d291ddb4a3c50cb1bd0b174da063483a55a47260ab964ae54d7660813796247c0bec7d0f1b338b9c2280c6160568412ae63c3a7815a544782b1d1ea96f47ff926f8d0da2664efbdf7de5b4a99640afb1340115a114f7dbbfcdd2d91be3a3843eef26f979f4522f5a9bd54f4a9d7cb0d9bcee28fe9e3738e1937a9166f6707e9b5f46edf77febca5077e3ac8b3bb558280dee92c0ab13febf7e59ff5341265ce93916b5180787e58439561514395b06f6fd71165cdb70f35547f3b778f192b9116a00609dec11fd56143b1b7f3986840761ad9a7b3d7ed94523adba39a76fbec6eeaddce22ed7e7af7937c0d995e7d7a25abe653b2368cc9727e93533ee5800cc2c835da9e1f1baa6b28aed1f03c7bd850b307c7caa167672626a7fc39c76c4e0d40be609ccece1ec80d35793e3be8e286e267e7866a2fbb67af0d359d1d9c470b50238777f083339c773e8bed6087d48f26a03256a73e9d8a3f26c933680169fc348cbf9d5e6e18759086f3ce6fb19dc54a72c3caeea947358b3f6ac3a84775544775544f9101b36f67f1c7f4a88eead99c330c90994a7fea20076004d982911b568e4f7d3a8b3fa64f110809341a2dca4f073be4869ace5e1baa9d9dc5ae61d4a37adeb061d4798ce5d0536faf5e764f1d1c6a286e183bf5a2869a4f1da9a1a653076758d450fcd4599c1ed5515def93a57732fb265f43ba6fefbec9d790f6eaed95ac9a3fc9da307616854c6fb26c9f1ed551cd4c949cf2e71cb39e330910640e5a401a3e0de3e786b1b3f8a3368c3daa19090499831690864fc3f8b961ec2cfea80d638f6a4602b9416eb01ca7738d86f5ec2c823cd38c5c3be3e727eda9833cd38c5c3be3e727eda9832e76662a27eddb41be53cb38c5ce5f4eda97ecedfd5c3b13e8e74f6f71c8a43d25cb497b76904522e357a7f749fd4a52cdaca7ceb79c3d3bb38fb2fa4bc8f795a4723df51ecfe34bcefa92bd3d8af2e5a79779073b3843be53cb38c5ce5f4eda97ecedfd5c3b13e8e74f6f71c8a43d25cb497b76904522e357a7f749fd4a52cdaca7ceb79c3d3bb38fb2fa4bc8f795a4723d75bef33cbee4ac2fd9dba3285f7e7a9977b0831df29d6fc6e9f3992d609f22953f7516a9c6a72452c3a647755447755447355f6e183b3335393569cf396674f61d70ce19a773c3d839041983713a3b7b4f564c2cd4c8f33d9df1f4e7c9cf139ca73bb0219ea27872f3d4c4539d273a4f443ce1f0b4c3530e4f433c31f1f4e66989271d9ea078eaf234e609cb0909272d6055386501b3024685531930269cc880d581110183038be33405ac0898113029606d6039c06e80e1009b02e6c6490998164e79602cc0528089719a03530186020c4d530db025605f602bc0c2c080683ac1a9052726602748e00706c6c90c9816a7349c02358dd1a48593144e6a38ade1c486531b4e4fc0cc38dd716ac26909a73a4e4738e971f2e324c7c909273a4e28387d71c2d3c4a7890b98104e6838d9718ac2e90427289ca23851717ac1698c130e4e679cc838617162c12907273330139cca38c9e034c5e906a738b019607a9ac86832a3098ca62c9ad468c2d31482a63e4d5d3479d1f4a7e98ba6329ab068b2a1e94b93094d5d9cb434a1d02443530a4d58b01a9cae9ac0346535a191a00b09c468b22241194d5b48f0c7298b0461345d493006cc8b045f34016a4aa3098d26319afc4840869394a62a4d3134e5699aa2e98e930d4d503449d1a4a7694b1315303c4e4338c17112a2c90aa73730289aae34618145e1c4a7898a939ba6354d55c0bc70a23915e164048c0b5809b02d4d7b605d38d560779c8870fac1a98fd316b03c303f4d6a9ace38e9c00488290d263098ca601a83890ca62f98b660f282a90b262e98ee30e5619282c908a6384c3a30e5c0e4860907261b98da303dc174039317262c26354c6498ba3095616a81a904261898d630b9c0f4021316262e4c26305d3189b95f7c0f530a4c3130c970694c3530cdc0748509858bc245e2cab94c5c3a77893be7d6ee1057881bc405e2fe707db83d5c1eee0e57879bc33de21a718bb871ae9d0bc5dd73adb84ddc3a97880be7beb94adc2a2e1557cf9de24a71f35c3cf7ce8de2267167b8692e0bf7858be6ba70cfdc3297cc6de18eb95a2e1707744fb85b6e949be576b9265c2cf7ca03f9184e866739155e854fe17a5c0aaf791e27c2e3f81b5fc2e1b811fe83fbe03d4c1d669c69c66370357ec665f02b7ee5519cb614c6929ea526969c587a620988a51f96725862b394c29218df614985a51296b82c6d59d2a294a5b486d2194a642899a154c65214253f4a5f2881a1d485d21e253d4a6094c228b1a02446898c920b4a65945a505a41898bd2094a584a5e944c58f242c98a5215a5ab243594aebcac78a9f14ae3c5c64b8cd711af35906078055a1ae365c66b8cd717af3290c8bceebca27849f182e285e745c64bce0b89579c5713af33c0aca23cad34dc9ea324849e38a223d4c411124b593c09f184c7688a9215444d10915164c5119a2335de134a583c3d71b405c626e47274550446384611202317261146568caa14f131ca62a4c5088bd116a32ba3128cb81c19717404d195a23ddc15474514e1196243488c100c457d8ab2f02a447f96b03a1a96bc049109a2419c23d221aa82e807222188862082822808223b444010d588b8200a811702a52e2d322d168c6430c2c1ebc304c6d3e2ca706330aac1dab168381a426588b08868445e8e6a445b88ae86b284c21071212ac18333d4c6119c232288a61061116241e805a230b388a01c826a1042230485d00f426b5a68847c10c20aba21888720218286084a130443109a201b82ce04ed10e4264886221d8a70081293b446919b2124b818382a5c6f966018925314c6e6d9a6e8d67c736e6cb991c5c5e8d204e9b004a66313c4c2b7449118b72248ca4867cc1a9918db18e78c4a8c498c7ec6268eb25eb451cf9865d47264e568ca1195a32a631ea32b4654462ce3d558c518c518659432d2c629aeacb1ca48659ce29a19a93052234425c887a21b9ebc28c2228c4224056c83cb82284b51152d354266845c408078159211aa110212af846d885dc412442e2216518bb845cc12061269e119e294300d314a58862845b412b2215209d708a1089f08ed844e84688459a1192296582544214c21fce242c29584501dd71ca41590c020a9809402120a485f904e403201c90b12165217a41290b8206d41d2829405090bd215d215242b485590a8204d11b212d406d1164c663a1b9a0271575a7f5a675a6b5a34b46a50a2c20886a440621df72332114407c795d315477598d2f819e2124251969208ca0aa708d9790aa26b012683530f620c4e622c4dc1c404531da624c23c4c48846088b48454c22a445688aa10f92024035197d04a2885a88790361448088c500b476f846268cd20b442911e2132477184c6bc9e08af6041845796c068d9b0e4e70617ee4c510f37b418d960a31877187910aac2c9f049b1f40248c35219904d50202129a30edd0ca21ba1294d6138ed6064c6bf30ca6189cca7c607e83b23a807a23e45360495099a41c8093050eb05212e2e2236295a654638de0c482d787196f87844e0c0b224c6cb09a336dc9dcd088fcc9398a22994c6006b00db80362cb910c4068705d319a53698c460f2b334e5d3a3848612a0a0183822884c98703a3845528851885088764427c427b819bc2fba1b96c61051e1b4604283e373a914515174055194a52f96bae0d0883d0889c16486d0198e0db7a669ceb5b259e132420805a21d8878f0deb46410fa227442d4b6c5b667fbb389b1f1692db15de1416c58089920a482cbd9b4104a61cb626271218cd62cb9712c82d6b4ae08d1827e0852639406a94c100e4c5a2899095ac18f083242298ca0165c6d2c140e84eb082616967600cf00e5b4c00455b164825318dd1c5896560b5bcd2886a6283a3a5e98ed8d111aa333e0114b347862c612bc3162134a3034d9615a2108081007223a4c6896cec0b06c15d78b1804131bbf41fc42498cae8d77c5e362890c3b05ac07ae886d08d00ca72eac1437be386161a443b744501bd70f412ec0e6785bb87c087aa1b5c56be382e35d8d3d34b5e134466b05cf8a088493174d337834387d0173628985221496ca80fd3004674909d18f52154d59b63b4e3e38f1e03934d1b958ad314c2a0c1161e4c66d68fa21c88c111babc76806a52bdc4aa7c67130ba012ca3c8078fcf520bcec3a7048c872636416cbe2444219ab8040561f120a971fa033be304042c86262d5e1738b27435048df1fc783534a5697202b6a6e88b110d4c67c0d4785e582aec9d5bc57570374a250451318f984a4c246612730b14d9942381a9094c1b924c34217cc003554a38108139c3dce1010ee02001441ab0010316a08020407e680000d8a4338dd031810f02ec78a260039d18e07c9e4170bca6524e9068c0880848a4423062049cf4832552468c7c3b76bcc6bc5e621884241b58c244aa0a8954130f9c247122b5442a08d32b8c0746986c608910254a9820a0ca0329254a98208082d70a3c5e60942841e28112254810a0420855202c915292024b496dc008932a235521809044aa034f2f14d889922448aaa43e302225b501a7d71766b28125498c78a089d408541e40c281bf4e60290f963059620489912422bc94074b9834a06ac9084c3cf0e0935e267cc0c403a90f965e5ed88907a4a68c3871e201a9214b982471e2440a02f785c51d4822c237919a6ac2640244eeab0b1b911a416a040714f9400a04109014a1e055023b99f2402a040fb8b093aa25524da4425892c45f5b9624d9c0eba5853d48e26449922655244819f1801211444062a489d4074a928c109bf280899218d22b0b3b397a61612446905e57cc012348aa907c80a44a6a83a0d7950f245182244955922549885e5646f0408a0429a157156ec20401e18b0a2f6122c208463e509264040d185982c403234944f8aa25521c00410a021f487d3082120f9624591201244d4678a7d714762295a42a49132621548d80e4c64b0a2f6192a40a4993113e3052c544891323494478244d4678a2560f3ce50113251a30225585e483244a903c69f19452a20124554b46d880912a0fa49a24f960491223468c6e9787db93841a3bcf33906b34dacf1935daba31ba31a60893ab2f8ee338ce5faf66aeb6d9b6d74d6cd9b6e759ef76b3b5b5d26a69b7672ba594d6ba44b9569e9e67adc7dc2d669e3cd9329dddade6f6badbf6b4cc936d579eec596bbb5a4aab6d6bd9f6646bd9b265ca5c2957a9b55dab999976dcb6d932b36506bbeea363d7792dcab69d687bb57ad54eae75a3bd7db5daadebdaccd672edd8b2b595bbbba910b6ddad00b66c39cbb6369d6d2dc8cd69ad05396b9939e656c7d6522b766deb51d7b5abd8cc4df986ad5cd74aada5dc9452fa715ba6b4d66eca93a765b66c6dad96d9d619a42e55ae4d992d65e6ae636bed9cb36933536edacd6c9932dba6b59b76b4e575f41bbb6ddb6aedba6da51fed5a2bb3e568a5cc5c7976f735c9dd3d5ae6aee35a29e5aab5b67274d25927b5b5da5a69edbeb0295769d7516e6bbbaf56dbd5d64a9bda6eb6d572b4a394d63a9b562bd6a6b569d30a93a0bdee6e8ea3d4923870e0c0318e5ddbd66a2dedacadd6327365ae73f6e4b6d572d759bb76edb6d6325b6666ae67dbb6b6d666daddd556e6e6e65abbcad56abbc56e55cbcd952bb7654be9f731775dd775b5a3b4d5a2ad16a5fd7ddd5dadb5d2ae56da75dd59f2e356ab7e638bdd5cedf6686d6eea6adaf1b4d64eaf6366facd8e765cd71cc7d1da51ae9572edbaeb2aad1d534adb7237c4d3560f88e7791c672db7c8956b57b641ccd66b668ea3b59963a6cc1cd390b6ba9b2b8b2df2edda97d9dace72edee4a9927a5fcb99832739dddd336cf8e67d755dab5ba47db2d57fd51bd24e6cacdec2580f6a4cc744eee9abbcea3ad27da35ad5cd7ee2a1ddb7250100e4aabb547a2c8f3c68d1b372c775dc7dce2d608a81d830d35edae5dbbae2cd4ccfcddedd47577d35a9b6a9db36bcfd99f2b8afbbaaeeb68eddad559c5da1f336dd767958e9879daca2c8aac8104b567655aab57bd56aab5bdbb52ca89dd4dc55a99593c129794447a80393434bb6eb679ab957bd6aeb3fb6b6b2973b7ede6b176f7e4dab5b97eb3526b5d963f97ebfbe6ecb6dd5fb7adb5dad9b9babfb69c672767bb9bc5b6cc3c6480dadd3dbbbb999916a0766f6cbbd2e68d85b8999bc10c6a57aefd357794bbb9bb6b37a78f6a6464645439cbd9e69edd5d6ba55dbb9b52da5df775b4eba825802deaba5a6bb596eb38dbae0130f52872d12228a6223ae7b41cc7b96cb5185c600590c3e6985c9ddc7459aeb3b655abb575ceca6c6d73d6b6a5ad00749576d552ae56cb6c375b29fd68a594ed275adbb5abe57a6b5a9999adb5fd64c5d315f406b7079a30e180140736902d907a22a5c408094838b034c41680c0448911109624010104264a8c04a0444992291e1638f18055008b4047044e009860078fa00f942409c10323554a4640b201a90f9e9c04a90f962431b2240992103cd8c006989001c8a1a30a4913a9255220349120e40048397122d544040e30f1c04813a9274c3c906a620489930f3c903262c11414060110c10329273d923690a489d4132304b000030c02f081941126552278a089073928f840aa89d4074d981881c2200052499a544d3039c06c8154930d1869c2a40a89074c9428418274015412094c3a50a5048541009c280016180980d41412251a3002c2922421384112824b712049d592119a904203d840d508494224488560a46a4992262218f1c049120e344152e5c429c889d10d0e0013264d8ea63c40a201254a983499600224524d8e3c203565a48a04a9254a48555220181139a97292840429a48d2d58c224499507489c2c41d2a4ca4855120e7080092c020e0009493620d5440452a8091229251ebc9e2c91a2416c8191254c92386922f5c4c8074ba44410018911291090346152e5c448150952484f96485158a8453367653d6a359b714766f3b3b29acdba236c6565357956a97864365d4766d3caaa522bab7a6436adacda8a1e994dab59f711ab39b3b2a247d8b39af511b69acda86c568f3038b3d5caca6a668ff06c6665359b6d4778666535adacfa08cf66df91d9b49af48895d53cc256563deb8ecce68c3bc25656b3593d6235f908cfb623b339b34766938fcce66cd6f408cf66b3593dc2b3591f99cdd93cc2b3796401b5cf64e6c901274838e5ec67e79b48e4f372fed4f4affbda67f9797b15876ce20faa2912a13ec94dfc41f5633ae820174e11c8dc1c9ca27b2e7ad7b1d3b36dadb54e3daf80b885e09d0fb218e4732317bdb879ea9fbf442f669e7a17861e76de1110516c857326b95c2f251732be9492c4d946149344f126b5ac98e45e52cb75e3f54a6a3baf97507d390e7fb9c670cea1250a68e9f5ba62107d891e818b0e8af7b5a6a15e6e1d1c6f4c1df9e73cfe8608e4c83fb7e210ea9f834261779884248a4d84844a1e8e2ec4e59d874aa187235952b9c49b445259fdcbe72dc3f0ce477abd3caa93e6b7f8e3e55424d2bf39d2e50fdf822fb72fd18b5c74b0fe9c2290e99d47d16974cbf947a21f5d23a3cb5f14c1b5601a661dc7a56534ccba77c57b4bd907dd52f642b794b56e29a38028a0b76ec13454d7693b6f9d96d1509e5b07b7f0bbfca0f8912f21d4a7bc3ae72c2a605bd350a25b074551f416ddefd5a5c0ebb93604192f71bcd8c1e28365072bce78e5310fdd3f27651ebe15458f6a500cc521f33bcf5bee79cb37201aaae5d6c1d6b7becfe563183611f27da077fe7d9f77640986d755da31dfe51f5badeff2bb5a2d4f1c02137dba48ce350db3ee7e3f12a058b9934e9234f77befe5d8ecbeeb97cde6ddadea9f2e12b1e20fae69d9f255fddfd34f7203a261d65bdcc0fb8f2c3bd00798932c65778a3f42b722e1a7fb9d6ec56332772b190c5ffcd062d769548f175f683127a958f1987b479615f48d6abe775eda3193ceebf977a983b724e13d677103d87b42bea71ed5dfa5a51df3d63720ba4ec3acdb327c3bdbbcc580f5ae33dbd8e9e6edd05b1fddf9adcf356e3dec03b8db2a16b9ee4ec522ee32d29dbc6ec9a9adf69cc38ace5eedd4455954849465cd53af6190d97355d52959560929654d9e74be5555dfbc4522b02fadde9624502d7de72c12b15d8121a43cad800d9dde7a5457f107259f742477ad53d0c5b67a54db5bb657f5bf86cc6f17e2f5522dfd74d0fa764bd96fd6b7926e96fd5271088cfd89fde92c12f9683fb949fb64e0e8b926449f07990266be325ffdc8d9bb9901f7e5a91fddb2ffe5cc3e78bccb8f9eb2c697f3f872fe78795433fbb0e0fb296bdc9cc797fd9d4f71c8cbcb7e717e3bc82210023cf38e6ed6bedd12c8ece776673fefcb5db73cf2e60a206de02e47424242a2484a480ed21009c9a37a1c9594941c9ce1789594bcc51f4a2e57abd5727086aedbea4285022d079902498e2324ea3cc84676e4ece7ed6e397dbae82eea87dbec96f9b59ba0f8a3e5aecb3f5e7e3082708ad38bc02936c0fae62c4e5201d6c12e904df2a4a4a4249bb4e44b499e94b4949484e42d476ab5c069e6e896f35f4e95bce54a258f47f2f2e5ed9b0884fa6b3e92b78c8e40b045fdb45a60ab7593ba45be8644e0491e8127959d74f4ba01b6c0248bd54a4a0293922e18267912f91a52e4a01739e820d26d521fc95f48439b1b97b3b8c1fced6391c89391bbdcc85d0eba2ee848b7fb5926246a799293d9b7383cf3935a975ffc010e41bafcd3bdd73df2287a74f98d2e67a761d58beed6a661d523b876cb2d65ffdd52f6e5e646c638dce538c80e50c3aabbc859a66195e86260a45f7278383c5fbd0334743130f6979b9bcdcd57e7ec3494dd72e362609c5f5aacafbeb56928975707699f860a0afa3e178738fdd7a7a13eaf6077cbf9bcc51f9f779c869a5e1d1cc7717416a37af4280dcb69e647a7e28fd1e7e50fbafc23d9711a561df4bce979f5ae83b3dfe68d6a70c24a28e3773cd74a88d3c5cff778ae757183e5e6a19e6b5d0295e0a60430255c7dd2738d4b9fe782e7919e6b5c7e785028e41c64100c59ecc852f69dcf5b8e3ffdde2b8fdd705e5276ddea8b7163d0750e82e1bd1c9bb7fad64dcfc130f43c055870bbafe9fcb37f0de97cf3201d59523f5f7d96932c653f7df653fc313d8adeaafee99c48e409749783ee22ed9686815e1de4c4214e0f8a0e76384521d33b9fa290cda7e87323b96193acea0fbdec02893f5a0eb2e8224bab77f976cbee379fb7ec7eba789b0811bd7321422e926513219d07b990d13b17c9727321921b26bac80d15449654f345efc8921bb6f9e8ba214965b55df1f2b72ed57c1074f1f28720e8e210d883e46bc8e79e7f24edd3b0ea5ed905faeadf9886f2c859e6a88371f30e3ae8609c3fc5397f75ee0803e354e7fc25f5d3728e30304eaf1d39b93bc2f855e36fe4992b8fc9da4d99255ca0c5ac6a9f3761e0c4a07840368b31f9151e312b3c626ca6db2d0d45fd34d4fc31cf5fd23fdf72be7acfc941fbe468397d801ce534f3d5271ab2e390d34c1f80f4ea474f59e304f3fc65f7d56b43bd363f73e5b1ebfcdac822e3f5fef9d5b90f70bdfabc45b382e9f61eb18ee956dc402c42fa752a16f1eb2d3a806339c8913e4d9fa2033846921d7d9acea203387649a64fd3bf3a4bea0aaecc320de5392527a032ce325f2b4029603f07c1197ed786adcfb6875f6f9b779d7f5f4704f65f77a77f37f4ed72dbe6dfb5e4f639187a674520a27f4e6fe7e1053d8a76203b78f945ebecad5bceaafeae4037ddf3497acee28fcfe7ed3e2e8a527e90410ee715ddbbaf21d43da79e83f472b33a1589c09e92a575f0cce8514daf7590c5902c651f7ee3bdf2d8e8dc0718499995cbb931f85cc68d01f5d1a9579108eca7fbbca087b77dbc1c735d36a183f38a64597f7a78bbef7a2290cda7d3fb39783b8fa25fe7d5a3a8c7dfb7aa7fbedd6e59d55324f2f4d62d39cb3c658db3ccf3539f659e7358f52ceced0ad650317413aa86cfd37e4a5decafe7da9632ada5cf338d7bae6999f3ccb50a841f5960ece79a1637cf3e82cd79dfb272f7ca635cc871a48c73ab0aeec0a1c5388e9faaab00ac4c59d54f87383df5339d47755f2b049e873d957df5beddbdf2581776571edb7c23cb7a808e94756ec53937065d037d75b0c3beecdde5188b44e8b757928a666565653d77b93128b94666ce57f5976928a6449e9e92b30c8b3f9aa4e2ac7a667b0303e406b94190c3193d02390323d7b28c79fb5cc302c47310489d994aaef3ed20bd577c2a59cebe3abd200de99719368f71000d558ecf8e34b1b8a1e28f79c2384b1e3c06d03d9c46a3d162ed51ddc363ed0a68a8eedb19c03ea80b09cb7c1d0df5622bca23cf2210d6f3ec200d6b991a5a2c5736dcc41f81b8702b40f7e0d89fcd5aee1c2d7617fb60927907f5e63a4f184b1e513d003bdfce03cfb75fd050737e01be9deb583e3ccc4a764c32ed0038646c980b9c4546161730fb5ac93913d003530418a16898db3bf4161930fb2926a9ac9ebd6c9f4c0a71c5c373ed0a4cbde2e76905c1c9220366cf0d2bebcf7e8254fc613bdcacdf1a64760df502327ff38dec7ebabdf399a99253639b0187cca9792798322703610bc6f0eb83aef626a957bbb537d40b483b75bab9f529ba79d750fd5bf8511dd5b35964045d579501b349760dab5e1d7409a1b2facaf32ba901909b524abdbd564a2b7529901b8a6b57e43c75f6f082dce034616c3dd7ace8f9e9dc02e2ab6f3d380e8d1663a73de8eca08b7dcab383cc3e5a0e82b3d05b9779474896e00faafe202059f6833e3dbca5d587f35ba513ab07bdfae7cc3e3c6ff18e1659824e5d74ef32ef10c93274ca3f2f15979595d5c6570f6f390332bf7a548397ffbb53957c327f7321fd9b537148f526cbd9b7f3833e6f397f3a15816cde72f0be84fc148384cebc637a148deaf052cdacefbc755f6210ce3db29ceff977cbf99f83db2de76f2e7a1589540f3daa41a6c0c8352b73befae620831db2184474902ceb83b49f74dff216394521f5370741165b6439fb9687f749f7a183b79c0f3ab38f902c4357e2e39977800e7a14052f757086e0a5ce628ba4a23fc51f9b8bb7dc8654dfe2d0a43cf839fb1483ccac0f49e61d254852cdac07dd3a8b0ae00749661d9ed3eff27b773a8d7758e76ed93ea37ae6cd4d0ae8b4471597bb33e75570f8e63bdaab1879cb0140bd0a96e9455e8133ed51c5889409393df22a4b0e3a7b477b54e15125023772f622daa30a0e5286c35d2e370a72d7751c2ec341ca8298dcc865383c749757a1a4aceb7c2465a373d4659494752496e9b2ce953cc845671f698f2a1f29fbbcdb412352463a97c39dbc39377259bb1129b3d64752f6f9e8322307bd4af523523634e442a48cba47ca3cbfa0cbae83a48c529781fef21be3e82129b3d63f52464959927f3e521f5d16fa48caec0d97597f72095c36ba04a46c68c889481991739c2b91b2212527e2885c0297712e012953f2a892cb3c26120bec0629bbe14444feba4144447a8eef73a5a4ef033fef1219e108a223d7de8783762091755d1b766714e4eaee72231d3f8e08b4210e231cdd7505d9cff32838724441e188c30b8d82b8eefa735d4b442d9111ed9c2618c1765dd0290892e07372ba610452efe9c965ed4f4f1e0e1ca4c3c6ce61e10413b8ecf30926b81ce772d29fc2cf9f2c0ce6b2eb302758e7221a9df4098c827c02a7c065389c82a7279781fe24c19353e032cf3a3981d74987592287b59393d3042ee37c0252e6e414449d020924487259e8499e93fea4e449397050e04f2e33f22718acc925206530cf21813fb9ecf31c2e1b4926bf71a38d9c74a7a424cfa1a4e42f4fcae1492e0bf2a4ce9d5c87cb5cae63f240720a5ce6720a2693e7a0c075b80c87e77059e74f302424d2919e1cc965d791a6cb404772095e2fcfa144ca92485992e7f09792bf5c16fa6bbaccba040e73d9e8b0d9e4e432ce9d4859939393a4acc995941ce632eaa4cb3cd741ca2698c09948d98b94bdfcc60d4722654747fe2265487ee386bf5c46e42f5276f4f223978564143f4d67720a7284429e44ca8e48d9912779183ae9b2cf49522694c3499781a408fc345dc82970d94792c04fd3292065139058e613e81290b2eff3215236e4a0040ebacc233b0049d9073a1229fb3cf43c74d92539e0a7e9482e232215c04fd361a4cc89c89b481949ca4897e03a1329cbe14e9232ee824a1a73b25820c384abd86de2ca1726d408234c95266255ae4719911d3f4dbfa4cc49c741323f4d5f22993eb12b25193912297b15f911299bfd80831775f0c89086ce0f31a399182952788193270d3c6462462e0b228bf869ba11292b22993e554096b06797b9c8919fa6474076f4891d87cb2819023f4dc741ca88482c335625c8874899cb6f905878c4aa50172265412d7791b2590c67d8381303a032be102346798a3f38c0e0450c203869c4aa5077b96c2407c04fd35da4ac45327d0200590ee0d9651cc9839fa68b64117d62973579849fa687a40c24b1c0625536ff4859017600028c1aca78e28f9a984762f15895a53767e430841456d4f02256a59d735947c2f8693a47ca3692e9d30eb2e4f1ec324b3a3f4dafe4489fd8d967d4eaa977648153871f6ad82c6ad8f47eae9dd9e187a8ea23f18e4972c3a847358bf3ce20fc5433ebd959147947df9077b4d3dbe6cbfa3dc35b8d5cab52e7d9ed73ad8a992f3beaed22159f6b556a6080d52b9fa9f3430d63b236ac9d45aa99f5f676bca37df6d4f996f3d9a794b17e7b1845a3ba631fd6db3df6c1df6e2f734161c3b86165d14f9fcf353354fc50c3a6d73b9f2f378cbdce59abf22510086353a7d429a5739e524a29136d42058d37547b1d1baa74262a58df1e3614fdf632fcd23b5686cf234c29f35c9352c697aea74ec1734d8a9c075dd46b43cdbe6c9f3e874c4df235a4fef4fad349a0d168b4ea4d96edd559145292f0d52b4935359dbfe47e3a9d54407e660267197ecf09cedb35d147399fba00c62094ecc00ee7ad1fb28f26f3cf5371ff44c805d2705efae2932ddcf34fc216fb6832694fa5c14f6f679148a5d1a62864a4fdf450c8a4fdf49e8d07e4ef1aaa3c9a80cad83ebda4ce0dab606ca7cece2291f6294a760d638fead99c0998aeaeef0454c6e9ed94cee9e00ce924bb9ef5a40299a91cb96165d74f6cc1b8f97c900330820c82916b527878ae49c1fad2f5ed0278ae45d1f32dfe28c7e95ca3614175de5e1b6af3f60e6cf147b74d9101b3df1c9ce17c708a9b83dbad9a543f6ac3aa0b197ff3292a807f73167f70c3caf0a725cbd9dbaef328daddb27e59bd8a3ee72cfeb01ed520c822254bd953ef6ee9dff9764b6e1809df79c90d2b45f8cecbcdb9616508df7914a59723a96401734eef6a7b37e7f4aea968374be0eaeafbf2beafeaf52a208af3097638390e08d5cc6a52158a20e4c8771d731c1aad73b03af5c82654fc8746fb2aa1ef9cd2aaf03b22227cb7099506dfbca37ad5f69f974d3eafda861879cf97a834f8c93b6af548661dd54520d637b2de8ebd49253bae0c6a1db477c68981d44170f6dd2cdb3b7a69734e9ba492b1d3ae54f4e7e49c0a8973b06b58e739774bae738fe3486e58479655fd54d3737a4bea4fc657526951beec9c8a0b1425eb9f74df4d556f079d23bb1b725e761dc979d9395547454a946ff264fbe94fb877327bcea3287737ef2e3fdf928afbf3d6378feaaeaabfbaf712326bdfbeddc9f9e67d9f74e7fdd63b671108554927779d639f776a92dca5dd91e57476ce85d02f9dcc1e087f25a72839c5deecd3e7f605c8dd903fbb3314588ed3856cbef9e6b1b3e7ecf9e7ccdf1dbd27f3b76d92ce3b189c21177ef3c1cf79bce7736e0e7e1e72dc90cd41d2e5f9146797ce99f4c8a186f1e69e7f6439fb6fbae7517482e0e775dd4ff72eb7b18e765b594703a93f492ad953f72e6dd6d15e2e6036c44fd6d1be80d910cfaca3bd8fbd3b4b18a90b19c3a6aaa5f5e9dd7d4d926a3e4752f0e00cbbbbe3d9b7e99b10585ac629eb4e5f5a7e7e29f6d184c79f619ff1163e9d99dc482a5676c436bfba11dbd250435f5dc95be7f1e5d053d97c5e8de5dca2c55797b18ff4c98c313b90d9a1cd1e1a2db6f904375a5553020c525e082246c5ca8ed8f4ab1b31762a563ac6f9d50162d3b77b7580988c4d91e9320ee853f55947c6a608e71b298ba24fd53952c6a6c8e693946d240fa64fb5daf492ebf019579038f3851469ae7022c6319ea1302788165a7883e70632621c632f7914711a2d36b73494d357aceeea0238b3d0271c33f099c188f7510af9aad76af5d4279fafa42db7ea1cb96423cbcd95501bfebc25977849c952b639bd74b07eb35e5a7d399d5a57321bf3dc12a683f5d6cb0ffcc6914b98cfdb6d8901a8d4de9275d00851c11d386449c2539f5e2b7046c66ee5cacaca1a13f3ced092b8c4f0a54c1309cad42087562502f3f933b40aeec0a13d3100951a0934a68315632f3ff0560af38979248df9c4d84bd95bb29c4eb982926b67daf8aaf9676838aab0610a17345a8c4919bbd592165cc81325108d16eb485a597d96223c2d1274451532b44185468b6d70e39b8649e33a1c1469a8768ef57c757032c174f0f8ea30ee96ee4cdce5ea1dcc0aaa176958750e38a03d9ceb5c80ebf89131a8f4a74d5be5ace33e702404114898344b0668edd8509db33bfbe08454d03a8b41ac57b7b37f4cf77cf3167f0c5d5bef93f9e57c32bf56079b27776dd9cfa7a653a75ef515dcee4b08f379d0e937f8025914c2f57990e45941d96fb7d94c5b3c2bb04eeb55127ebdaf21746a73eafcfc6343f17876eff278ff36b7777a19a717358c7d68f3aff32952758fc43bd8bb3b368c9dbbce3b9864b256b20c6b20d03a3395dd1f2b63d9d56a0dc579f52e4e43b557efe43454e7d5cb6ece57075f30f3123cd75c08f4205dc3dafbc158a977dec5a935ac7ad931c07a4776722600ba1aedd161f553f5dad58c8cd6bb5a87d5b0ea1a182df912d234da53b7a2d17e8a2c89fe49ad834584d9a8bd2595587f2980df766ebfeac5183333e0af9df8837a3f48434035e46ed9617dedb06606fdd5bb2f667cf50e4c43d1af0e4eda93b6fabedacf5c6910f37cbebdf3b9fb6a7f59e75a96352f4b4280639e73cd85329e6b2e90f142e85ba76f49ab2ed887f5ea5d1dda03f4ea1d1eda63c6aa777b688f9657effacc0c3aaf0e6efeb2de8139df0125be755fd667ac63e07d59d2019d5b9931d07dc6ece520f4ee961d58e237af0fd29e4c6bab9cfd8b83cf5f9cd7a7ff7280e82f8ee44024a7701620cfebf7cf8f6afae19d326320f9da482a57d69fb9ba20e6f91457561b312b33e63995ee23a770595959fd2c22993e8398dd9fe71c56dbcc366705381d9cf367736200b24f29b4d66b7d4ecedacda973d65a70bb483388da3558af3fa866d657df48a45aeffcdafd0438bd631f938441cd0f358c7ac73ea83310b3f28e26b9611d9dd306ca0e5a3a69e77473ba39f501741b75ba39a5d42d52c3b6f6a1dacb76f3b9f9abfafcfe57ed6173cb91480ddbc8daf10e9e5f6f3b01b657f6d1aee9957d4c926a66b5e51d5c79c79c02b2f5ca3e3667b7ec635ed030ebe67934cc3a8bb40c656188d43d3eb75e00f6e1bca373eb3a1a6a6c58e7d607f0d43953f7e8faa92b5f61f718eaa7cead33d69717bcf517fb986f41ef2235ac736a43547be7d46508f4dd143b7f712f8e73ae9d59f35c3b53c30f35acf3edcef748a48675dcb5bc8377f07c9e33db940dc836683a90efa73f8b3f9a32ed9e44c0cdc16d8a3f3eee8a6e1d042f90d997a17f9c33e7ece12db9e7da19345f798708e4b68b9773efce07c1ce411af2ed5ce49f1d5976dedd66b274b0c3f07eef1f4841d1992c3b2a12a8488942fb266148523999bde76507d66023eb9d701d345fb2bc478664c9208336ec6e835ec12dec6e3b8b4186886449c283ce21c96e45205fe81fffd4e7cc2495ec4bfa9fb328a47b909ceabccb6e487be779148dea1938eb0f208330562f8bde7a4359bfa0a1fcad179da1bd75247b79bc2d7aebe390b5ce352a603932df00d90eb90238d053493bd5ad73d69fb30ec2b8f90038a8b21b8f3414e70568287fce3b6828aec980e639bf4043d1e718cf737700cf3937d4fd92e770c3ac473512d897fb33c178aebfc84f4fa6adb1a1a8733ed450d539ce3967268e9ce23f144d9a38df43d8a194723b7524f6c14f3d897d00a9d5867140a50a942aaad4c1aa7244157c624c9faa7c13379c30a74f1a68bc89317d6ae70e0a1b5649186c7af74c7b703f95e37b3fd762a0f2b52b47ebb59dc71ccdecf9f621580168ac0cff86cc056d64d8304b86cf353380be92430d9b5c7bce31b3b30181136be4860595e3d3ae84e918ed3cf521ea5d680170b619bb86e7da0f5ebec93cd77818e361cf351e5e105235e5cf973320b62f47f062c4b3bb669b91c279aeb9d9f333ce730d8731afe3b976439c2906f996d8f354479e3dc8f7a785a7b26a7d598545154564beac424306c4e2cb2a2d58d82f9de4c981021fea7ce984873acfded16895467bce7a76f973a300e8ed1daaf9d5c17a6d25cb39c521d49b2cdf8cf95a7dbebdf3be86d83b5fdddef9d2c9ecabdb4bc5595959a01df341f4f9fbf7c10eedb577beefd24f31887f7bbd4f882659d5feed43c0bee50c32b3a8a5e44bc874ea41a653b20afc1a98afeab764d9fe643ef5d9d3fbf4deef2af0d96776361aa08f497bb0c38f7df8f89e9d39039e155477b10f66a3c7369fa657b2ecbedca28430c33baa8bf5398328215ee00af82b5936595afd937e109acc9fee0d7d2318865c83c1cf53b9fe49b7cd0cf869d95f6e4f7d8a4dc6e9e014a9c6094e3a1ce70755a5d1784fe5c1ead9f8f0cc60f6d1f3ec3d7b708cfd9b1954da3310d6c3755dd76ddd7574765d6761ade99b9da539208cec4c0d555630d45025d34f57fae9a119343f7d6ca8f99399e606ade79a992be0730d86403f840432ed71a4478a33ce1083258d9a184761478d12f62891060630b1e9946bc366756f58ddc8d27ff38e6d506d185956d19feef95043811cc87d1f5972dce7d441eece07bfcb0d9b6290a4af0df39caba2ff39389b276df183b086d25122fd9c64b9b975ea209d73bbfcdeed34a8b24fc26fceb7ec9e3bb64155646a1875cebd611cd95e6f399f6a6eb78a4ef10793961cc3a186e2a7ee8fd450fed475b00ffad499fe9bd60c730f4a9956e7fba43e7bbd42c667a7949def3c8f2f39ebcb49a3e349c6e9652dc7b18381cfb7874349a29a3613902f0e6318c3d5b70f1521cd0ce67c334e9fcf8d013bb740662a79cf5767f6c13e6677b48747adb51664b0651fa5937df4b3835de710989d7b0e5a07ed15f27177bc1d7daa6eefd7fd68ef728cbb42c0a73e7e5367431dfcd16439ab218bd6f6d6dd6d6de85d286cac5b75ee6d937dd0670741ea9e832f21e58ccc5bdf66784b36f1df7cf61be95da74fd5bf5b449feae604029f7b2414cf3f8f00c73c928df52a3ee08a06b18f84d1a7ea3ce853f54e2442dd92250713d0468e757e458398e79e97b01f1deb5bce860809fa910d9ddc93b6ca087cc3f0e54bae7df50e1aaa2c80021aaa643c17682828aebdf0e7ab2780e77c651ffcec53ccf1a555011a8a7a75de53bb6bb3e7c9e79a0b40bc0b6b5cb8fa3280acdffadc50d54bd85b6742f27e16eb543bf572f472f3f6269b92536315e32ddfa9f6ea54dca0e9bbf0e7cbf1ed5089f4969ca2de5efa5beb61d19cd46706fd74031ecfbc63523620adce6ebe3768a765cc7c3b2d13e7dba9ab86f496ece373cfabc800ebd5ab48a49d7abd95c77fd4bfe9168036b42211fa390d3da4fe7d4ec13bfd2ba94fdf4409740ea523a174be39e7e0165271483b75b00ba72881ae025666ac732856666cdb1ccae69c4775079d43e93ae89cab93ae007e79eab24d2c43e5a953eb9f6f413ec920dfee94ce37b7d7ea8b5967f6c1f9465a7db1cd4b91888b39b8f2dcda3b63de6543a581cb83f1732b9cb3019df6c5ac5777393f9932ee92ef410faf90afe55504325d28f4f24e29013d74d1697897802e7a149d975fe896b30f9aee72f97843679101937491238c5f561a6d7acbc1fb02453240fc7daeb5b086cc9a677aae91b96a01900dc1fb6a89a2287221785f60ebbe4051f4a8b622270e119d8c9cafea21df0338b691533a52368b7da415ce67cc9eb9e24212f4a8b7a46cb3ce791b6965ad6f2eb3ea7c23af3cb6f995c73cd2aa23af3c66492b571ac4aacc62d6ad731b05c9a908ccacbfc06a3576b291044bbe40b7d6e7245fa0256765bec51fd4a7b524d3a7ce6aebce0a904918b99625d0772d063dcfdf851980cc54f268a8da50ed72ab0e62a30444b71aea22d18b8a6eb8b8398b1d885e7443073bacd373f60e64506264918e8d35e486e22f02e5c8438732fa91b358e4c84352d6f2d13a8b1d8c2c047aea2cf8b162911b1ee4e115bd75a1dcf0965bb102462efa768bdcf02052d6722267f6e1a00d7dc9652d231749d90d0f5b976342174ae846be74a118f90d27ba5064a1df70ee96b3e7e18d9e6b2cd47990c51f9cdbbbe47bebdc15f2bd752207c12956a0e544eeba505aeef2a02b6b79908f57d6f2d159acc00d37f2a826ba32972f7978670ffae720175a162b200b72d1652e1772168bdc70235236bab874a1c864a28ffef28e095d283259c831d795c9dc953ce842b90ec51d8a92cbaca020b99013b9acc865385c36e4a3158bb43cc8add8c1e83748d92ce6f2a32b9b3117696f9196f52012cae8410e7221152510ba110945f49673e24616b9e150427779d19589de22ada044e04b1d84e414230fdd455a7db12017afd5171b997d58b2e4f167ae5a1e92565f2cf4cd83aecbc72bce5890e99db328819194852e92565ace6623a79458e77cf3208f6a902c793ce71fd92290e9d4b9bbc4fae651744e31f2205236632409e545ca8e5c16e44beeddcec33bc5c8973c822b2bf2081cdcb89479a683b57129f39bdbaf3f06cd73133f918c6551cde227cb1a16d08c0134a64f0b5b5a183306cf1839637808437b5f1d39c4fbcde77fcff579e6c3f5f9cde9f7b32884f9fc66002ab58a051bda6fcefdf6602bb4f765bdbb2f4b0af9cdbdef9e452115dc81430b452106a052fb8d0e56cb9748d98cc92eb934bacc979446d20ac9454f22ad90d8703e3a9147f5bc63fcf4a07be5b1207fdd2b8f85eeba562e27f223d22a74a220d2cae52e17dde8ca66b11ba49516c9864a839f2a79565072cdcb9f9f6e9d7fc68aee95c7649dcc65571eb30a5df41b1ec195e120adc2d0895c6625e444e495c75a3e445e79ec066925445e792c24ad04915334880579e82239c595959595152bb9e6a5cf4fb24a24c24dfc243930d2f9d29e69f34ab8cefbaccc7b61e82dafceb48757ef4409b4dce523ed31c5e52df22a8864b3f92c569d232d39c5911198c5c68eb5bc5a8d9d6cd26823095c235fd65b6ec5632ddfbc14e137f265c922e3f4f2c84f9fceb4878b84227ae8d5bb99c1247d132bd0128b84de22652d0f5b62c8e339875504b3aec71ebc7c79eadf567bfb5179a6c0a4e1e6a1539108f50fab8ca73e1db4e1141b30c2f873deaaf13907bf16814c1e6fc1b3f8f91643afc3951065ba3f74cab498585aba13c8082a2bf0a006ab01539899d3268a33a09001ce1a7fdad89400238276682c50384fd82e896d03c36b17d3ca5519ef4650123d5c49d3a78a324acc62a002062d59e09961882c98c00a9918c3c60b0a2b9248a1052d65e4b0700496181ea880c184156a9851bf4079a603faf0d0054b0e3ac490c59675c21156c8c040e58b10b10d882e7e2b630d5f120616795280620d27aecc7a90f2849a2fc4f041e20a0d2d35ba2ee401ab33418b28070c47ad1726466fa8088e1e387636f1c7365a137af8b8ab5d1266ba24462f7d42ef82226ab50a3c21065680a1f44d126b420c92b0dd1a31e88225e49810e59bd3e7823bd616b50281522e6c81e50a22d270a266f4c21938a410c68f963d21204a63c80a3956d4792ac17e7f62376011b1c5eca1cf0f5788e0fc308688e3380ecc05377431451b50b06046192b00ea689f0a30e8f0051e38410c01688fbde39605037001a286374e4ca14495a42f64b4f451a28e0e637868586b6d2ccb9fb0b3d67aa8a586b7564800dbb66ddb9f0068dbb2e0388ee338306a360a0c3923c7e9e1c0e82e09b734c41989729033bbda308ee3ba3b35ac5d68e70f65d31b18672678c41cf9600124860f7368501344cf1a785c90c306960f6748e0b5b9e10934c260830f123eb4e499028a3f61d4c892a13363dbb66dc3439fb8a378a0881c9006167a5e2053c2137c92b0b2020e538a4083821577bc32267863bfc811a4c4d2eccb9d3743f8b132069e35e42c11484c135eeab061c61a3266d8b66dbb02a89ff8bd2b5a376e9b1795853214e6058e0a6db031e20c375dc4caa22b8e38c14f175df42c5184123cc6d869f8bba0e130ac3831049eab2e725ee8e285082804a1062a6a609c19e3470531b62f018b0a15eba1b5d65a2e4e6d7462806033840b28a8f083151ca49006971fb6b879a18dcdfafe30953e436357c60327b0060c52c874e902893eb1b2080b0c5957a408d1064f6c83b3049509c2289282a986258ac8418940808888e2824415668099d3264dcc6e6aecd9c0a8c551c2b3839487ead9b6087edbb66dfb03a8ab5c948f0fcc5afb0015b6c840840f6bf4194301265889e1cd1653c6c8e3820564bff8c268c18f116c60e9b2e5ea846ddb74e80963420b6ab2e02286d8e6a7e560f5114e5c90854d1a36c8d0020b59a021254f9b2ec290f2a6081e62b6931326c80b1b4bd3c6f3c20faa68b2a1d5ca3f048dd21faec6a271a8284f9c3c73f200513462d90931782bea787a7a90636d51f7c34473840a615e80020713cc50b2620b186fb2f85153a68b2e46c35514319b1a4360a094c20e2778c1c41a55b0a8d1c3842f6eb408e28a3163e07001830b220c7c79214d1a5c64e9c10427a81cf1021524beb8e973860e73cee820461c3b1d7803c55518294af4e027049c9c91092fd80a1e2b7ba8952cec983f514bd466342966aa6041c5851b84e821884e1242b33045d056b861072ceaf4d922041d861c8ee3b82fdd6aac50c5586b6dd8d903704438c503da50e6891a117f8e2801b6edfb6ddbb6edca5557b72965fc36858d2a26111454b9a0a58d142e74a1020687406ae810854d1c1fda90e2849c20aa1637d02b3552a0d65a8b4219cf13734268adb5dd1d1004601031054d1648bcf9130131d8102184195a00c1c6c847866edb3c3836749bfd9e06301d00f260a140a50440324ca982068a1e4a1883c60c2ec2b0e9c2e4d065c1449b34ec0579007180c0d8580f57b3ab26aa54d1a5872a687001ce181e42383e0072f50a60a86922501436c260c1dd098918b7f96b805913468e0c6c8c61e7852e88b0e28b2c68fa88b1478b2e2a9f2296aea042b864e1e2093a67b00122043e50c9428f1d30ba24f1c795c5b487e39c03d9f09c57ce09381e1f38540f17c5588318175a46f040c59fad0a3096e6c9f19ad8289c2c33140e177dc29f0ae78b1c110d77010a344ab53cf1d56cd7c5e9c46c2bc809a2badd98469ff8c7d6cd24b238a2091fbab85025c8183f9499a10b397142d08585b302ed86155ca3d16854c6a271a8e8aac31ac114fd1686d63eeae0ae7658a3edc1075a973c6ab858230b156848d3c74f192cbcc4de688144e3a95590450dabb12f65ac2ddad8d8b66ddbe205236a3384e1c4963739ccdcb04697345d8081868a16845228f3c38a094de0f963070519c2c0f0bdf1628527064dce1531d858d3c31d3d4a415ea800c6891cccb439e1823953e0f1628b174250268a15a229b62d841378c8e20207159e80b3e445072e5edaa0b973441c29c49082c6aa8041e359c1eae250305d08c57a643801d00a73e09c2943c90b6118c1a70e9f10600552c27b13c80ed2e7698eb332c3735c0e6d050c115c14127236af5b0f2d84cec0dab66debea96c1986eb3b54d1f6b6763b88013a60c2a9a089347853469fc00e884187688e244adf5c6093a43789eb8b21d07049ae7c4e7eed4a6b8fe0b9a98192d5af890040c6780618217464c37f3810c0d4ba4b96244183d77bacd06b529632dc78518bc1ddbd1f190b8caa26a6a4576131f07dab6891963df6079e15db0f1a0d16853ac77f68ed6cb2eb4e468a65b33f6f828c6f413ff56f461ae6a982ddb057f041e243b667cc33181021f2c4e18e326893159572c21658925c228a289285e18a57867faf413f7889df9d34ffc6537f2b09161adb563b409bbcdbef9a10eed82072a091af6a440a676831e3a333437c470041559646419014506ba2853840b7cdcacb9f345873066108186952b63443b1c57bf9855f45183884f8d25383a7ab834e4805d121b0fb40c976d23c2f5d65a6bc3ce663dc1d5ac6460f305203d377861c64c0c0eb52c940033840c7b6841d4f1893c2d1ddbb66ddbb6c5d0ece9ea0d2a26c4200399335854819306ce6f1b1728fc4684f5849b22de0871f5841338d88926dee0c0a7ca992a72c8c3c294ac1e86f0e28a36028d4d2c71006b8a1d2d7cb4c0e28a930a56a451a38a0f3aa04007853a550d96d0123443d001038829e860d92a52ac49830e17658cd1c69db74c042961abfc8980892a69be706941cf10575e7edbde5ca1f01b4d0514b8a401031617c888d1d962dbb66ddb7e05345d1553c36fdb057cea126a709689335d8d891ac425b41c599bc5e6ed8db75b06d65a02b8912b269c91a58420a840e3bba863e68b3f56e44401478e10bf1dfd36c7dafbd65a6bc34e0c2d4260c4943c6c5c1db16789366b30c1c213213013a58db75e8394b09623428a6db3bf6ddbb6bd0a603c8fb9f8cdebb66dad4510d7861dba0616ce004db4a0c5092df4f1220f57faf1c282942a45b051458cab4f7449fca007071fb8f8c0420e6fb0e0236689326ac033854c8ce3b83753b83cc72131563fa0b5d65a6badbd801846a000841028a4a181c403c61425f4c1010d326216dc22be1c232c2d75a8c883460e6b2435a186cb19698461a68798058f18a27738047bca1eb288d3460a25d0b04620cb45940f96a508148e58c10e1a2362d688b7d6766317b212333891860a38cc59e30a6b54c2132918a1821337ec10b3d6eb9b3e7ddeda22b6502db2c0c842678d305dee0cc101ce165a80e903464c203dbf6d71c8a1b16152c6b8c62840806a40244c78c106cc161dbcf0504495315f90e1a54c9b1048d1a1b2118523a245e0428d24a40c91458c1bac4cc0e28d1a448831538585c3b9306f1823ce0972be3c91658bd915304ce893250b062b6cc041224e056f66f0df7ef3a2eec131a93c5966a8c1fa220b3d48d42143041453d8d046132b3cf85b4dcddc346021079ff1650b3654c819838b2b0ac872c20830a4642903cc1b295a820e502f50210826989022059c2b2b6248e30a303a4cb1e70436d61832c019a32dabf61b01388ee3b8ca0dab1b9cc0c2115b8cb0d2c61004d8e3041e16b2ec6051e54d1434383570180b40ff4a063354ece0c294134050060c35bc69618d26b8e8f2adb06540419d31b2dce142cc1458cca8b0010405202e69b858418e095d1ab5ce470f80fcd04962cc165dd4c04cf819034c9f2b96a87395c6145d1a597004f08dc6f5731cc7715149b4b1d6bbb5bbbc849c5614f4025a79ce1a2eb26eb8420525b050c08b1a5e80a344145f44a14366a313c3d000c6a2f187985a90bbcab4c7f882162b27b071c613719a48c0092b40c1031d3464044147cbd7e7bce3f31c8ee77a3cc771e3386e6eacb5d65a4f7c14e4785ed8352c015e7ef8c1cd1a686c5144ac2cfa25f28062683718808605336154f8c2892f31a88de435d6a803031442e0b9c28505c1183a26a4a1d3650b2c6216092a6fed9b30657cf81683b7d67990433cf4d5b3ccdaa38b591fad75b7d6da1678a04f3c81600bc6eeeb3bc7715ce7cef9c8f95011c7711c7742adbd1b40d09045adce15953e53a8c0c49b2e4a2071e70d2d0d9be58c77413776e108a6cd1cda9ecb1413ba206382164c10c11d00862e42bc30850a3429c4b8da11543cf79c96209ef3b0a1849e736f28013ce7b086b2ceb98eee31d268b428316ef3a186216d5e0e7d51c3aa6f2452c36a8f58181ee813bfb5dd0f213153dd66cd02a178f3caf9e6614375becda14672f68183e93923c6cd677799f698e1a0c61914ac4cb9d26242ac2cfacd47daa3481b25fef010c5175da410db9ce1bc71e1373fbfb93754007e7318ed51639bf3204b2503784b860dabcec519f9cbdaa38bd5b1d11cf1e5082a4694f5d98834b6e79a1164d4aed81822ceb383cfb521c6f09e6b437051c1684a29a574de491bb976a626c40f716d081fd80c33a594569252a674cacc8ab1614a2ff38e24234869656e582bd1ade3db8bf8ea68a810b8e9db79cdf74b50c4038521f8b422308bb543a15e8592573488b53769d5d3c12900766eb105b53a7d39bd4b1e33db593d67713bb7570215dc79931563afd7521bfec43a92c674b0aa97de532776162be0f4f3891e3d4a7055aff5be36672a575dacbbea629cf32dad8a342dd6b977ad0c20c6bd84cc326fed4672c0397f9131d66d1b49e57a4b9ee9664f3d8a7ec75da64f65f7b61bab470bf55ed558757a8b8cb1eacc949254ae3f5399bb271931946e308605be332b68610c487b4a9693365900e79591ab8cb361932905ec7da9e6cbe66cb6063c98f6e0bc1c378ee953e57c73eafdaa80e79b17e99cebdc92453cdf48191beb1ee94d8a6cde91b2913ed1ea0fe058117da24eede6a53fe538b65d8ed55bc2fef2a04d5f00ad8c4d75ab2f66c15a81cd2d2963539d72aca34f318e59a75648d0371bb0964abea75e9d9265754b9ed982f09fb9f2181bea541ce27df5bee76ce6a6dd5f40a9f1730a402a27f33d726abae73798f9b29b4cde61bdaa7b2ace0a3fd0faec7273ebdebde106371f825edf72d62c76e90da91efa148784ee89413807bd1b7a1587743e7d92cc3b66d9a4e7e02ddb7bd23d156d835656cdd936bb8b3a3330d61696781bfcfce6b40b3b3802a6be9dce410736f0405d0f85f178eb1c58b7b02321345459c47218d006d0dbb74c2c27c797ac878f7fc97e7ad85869e79c739b3c37e7e955dbf37ca686b24dd8abb62146be7d6be7d924b38ef9638a3a039ca9cf0982df5c06058a5567e5b1477664499dbddc806c4e876c24146fa8ee8d1c32bddd3ad23854abe1cf6fd7fed850bcf964a38d369ec52cd6c1bedd99f52cd258077b546fb769cfa2908ef2d39bfef1d2802e179d7da8a8a140676a28ced9610db5f9ecbf2b3a776720f839f5f0be38f75cdcf3d5bf3a5fdd73902930d58c5caba1cd3305ca7c75b10607bf70bbd5417036a97bdeb5e00c2d157d17e853af219d5bef3a8f1437f83aafd5710e7a9ff37b1f098473cfbdd0b93b7f9b403eebdef711a9fe9153d6cbea4e66bf39271299dabc7a47969b87a4e7dbfccd75695b61b660c6a8b8dc0ab3059bcf58140def4752c9a8bb2ec74030745d8e7d97bf9c3d778778e494e8f5c7045246d1a92804f48d2c4507c917e89d5b6f518848be407208e7dbe71dd74d711b50aef3c812bc65e82fcff9e59140ac830e921f82ee6d539f836439bfdc888024f30e926a66794ec16dfee7ddf9179405788eb177e1cca0a33c7b8bc7001a8a5acdd9d7211610a44128d944660f2a9f53614341d0bb5ceb063ba4a177798fc8802a12a11c6beea70b9875f98e080ffed380a8ef9c8a43dad52aadb01410f59db71864c9535909097fe9b916173023f31d905999a73af29d83ad566955e637661d65e77301b321369fce75e1d7915ef85d8e8942da37f22bad7ebc4e494a96542452a9e84f518e1ca1e8ab8a7ea33ee9d4f4e9f5be86941e107ff4d616d09a3e6bc0c4b141ec5823fb74906f7df189904bfc907d3073ab452275b2f38f261d1aa7afcdbc63e37c63ffd807d71de7d33972faf7d33ab7cf5b1bd65b3ffb4704243fded11c7727eddb9977744779b7e4e8d46fc089354e07419e358c754cf3e7a73313582ff97682b3450684de777a78a7c420edd3a7f39461e49a1ada7f42a0f9ef4307411a4e3148e79e4f35d8f725b2e87dfb452eaccc3b5c6ebd6fcb5db76c2f81b4b7c872b608a47df4283aded790f696b7b7c8fb1af27dfbf74d1ef10eca3688f3a63d3846bdafcb5be548e4fbd08fd807752b1279f10eea2179d4f2a89eb46731c8a49d09f2a81e698f20b2f61375ea22cbee379f6affbc6c6706cc86f8bea8066bb728a4fd739e6af10eea2ede41695f79071561acb4282f3ae88122e972e61d9ee8f25658d207bd057ad5f62df13669b9428f6a57e82d3174ef96f3411d20e9f9e77df9996d10478e0ddb48f22d39e4ade6c480132b0d178f35dae75a1a3ecc3b24e8a694f29c96c99284e7be9346bdac7c27d94514453174d0455114456726b1a980200882200882ce4c201b9ee7799d73ee799ee739337967701cc7711cc78d338cdbede014fbce6f679177d8ae61d6a775be9336d6b7d645f6f1a3d9471f8f7dfca0ece302903b30729c832eea94524a29e52d08cfade36b35722d8d9db70eabdb76836c5e3daa39ef185c2e57cb450f1d7497cbe572e90141f073cf3be71c0441107402646666e6c9cd85bc83f379adc6cd6dd93dc779c83eda3917d9073fe77d9938ca3cc027f6a9bc3ed5f8a49faa3ed20d3602ad831b5986bf3948b93f2b2065f7d7822ec2f720b9e42badbe7a97ed4ae6196fc9255f7b25cbcfbbefd3b879fb9f8335eced3f921b56d6df2cfdeeb496b4ed79df9e156c0ed6591bb6753bc8b56fb28cfa76d00bedb5ceb5e7da0c653cbff9266bc3b6cdebb8a7cedd5249f8d637f247f5a6cd020ae19cabce79ee798b3fb6eec97cae5ecec16ee71d3cd56dd0f9e61e59bb5a2fd8cd39ab77339c0ea8c4e955ea4381182471d0213353339a049000c31540303024140c87e3812ceb3a14800d8ab24c4e3e1507234994a32086611886611086010000000c200431c52cd20240f98d80fa372520bea03b32db02dfc3c5c0646f1b737b5671ab412a4bd3d0b46d8338fa132f40f8f97f0e6842a284a96cfdd1076c01395441522d3f82a6e5d29d49a69e6cfab01634d157934db4c0396e954670f0205056eb49d63bfc6974c9b3a92ab1d84b2bb7ec8f3336c46497d4e722abcfb4874887f6508536fc821b4fa23df3138578013124db10b427a358fcf9a2cac1172f72e458467633bd79682c41ed91b536a90b4b31d5ddb59f787cabb1f864e8fa938014d16c4299fcfb881cd59999483f8900b9ca283b8bbbb9b90451068fa0516172a669c0b9ff57636a0fe534bed582442000c630a942173385851b3a1f23115bd1187bd05031642f476c7ba424795252bab50139b366b1a405306c6f4ccc9719f1b67f155d434e3b09921dcfa2e435087f9f8b7118c2b44f239196a50a51e8c719c31a10b57a80a4a83dc42045824254da68bf187a0a7ddc0006a67c81f8d7b79a5171320507f60b9825d30ea3ad38a751c169c4e5be36f60cb1d66c30c0eb092870fa0951e872814f3abc3225b81f51ea6c868c0cfe5c27dc12181a59f5f1b78dca9fc2bf341c594c3c0e3b01aba9e9ab10319139370dc491baedb28c27ca48d09791302eed9c8014a33b9d86b6ee4ac165a5058ae2fded93bec92352d0696b16a8a5bf502c842c3d6f7241e152d5142029d8dc388879a6c5dca08eab615a483e87147525290c16f38434eba1662fd488b6243da065b71fa4f00c76499a503193fc16a7d8005de30c26316d0a833392e38913ebfd7084331252c47ce24864338b0960094bd64caa963c24b9c1beeabd95ecbb6121697eaf734b3391c6ac9af1f4d1731ec476f3131b16f25c8198a9af8489b787cc6cfe572ab340d2382d2e508241d27518ed748f06eef1af2d909abafae0c5b92601d650e0ea8204838611a26f1c6169273853980c39177cc37c8bc09e1dcc129303f7c9817ba7fb910736e3ac80937278ff91180543eab0068180e8dd7a3d5ca04fced799bc12b078702614291a96f1da2323c3660de1f3bbd6263617a1980d2fa29d96a4250f52632363131e6a0ea090a415967ad27738a334ccde5a94338abfbd2382a7c33d9c3d6c10f0c38b43037fbd3c18d1374ffa8645cef65febb6c2fb11069ee80c7b970a7e8ff569295292749093c1263a56f1b16e0a72eaf490e80584701f5eca3ac1ac0b356c3ae44249a42314bb8c0d91cb4cb20c86bd8e0eebd90b1da7ddf774a632f289451149c6b2dae220b2c8a4ece63fca9bfc56ae532a9ab4f1e2d5eed41abbbb3a8ddf0c0f33830ac31982157e4fb8d9d7361b2584b6c1e8a8b1c1d677cd7869aca31f2e2a72f8c39ffac0d638db85105cf4e368f14b511a7508900b6ce666c46f84846a5229e83b3205c87b759de873182ba204ebebef8e0b4a298737ba3d1af644a9b36cfd1edef8500891e781fdc9bafca08592d73de6d2e2c5573fe5764b929d817b5394b756da5276aae8a0f62e647d259123f98c6418c900d0175afccd67c6d64bd222a487440fc5a6c6ed63f3fffa346859bdbb17079ca724ee535f0a1d1af0200df269c898621df1815527a4274ec8dc3230e863158f6b9eb96525348b2e3444a74644eaa9cabcad96b0e12b7b138115bdc82ece7d4c62224a569448681384e8738495c60946fe9caed286a639a21aaed28e5ab463c9453f47b1b304e359abb66e324edfaba71ec50900ff2d4f9df249147b65bc8b12942720b846abbcfdede10186b14c2f46951a6fd37ee65d0bbd0820ddba418813d07d62cf156bf30610e0a7d6d842f3f76a35064c44b32a06227df918c00c7d08d7097baeeab8c624d80670ae83d966f7bb11a88491b95f3e87e3ef13a51e8fc352da9ef9ed75ba4446cffff645d5bbee462381938c6c8ce9dc25257b7c33860a3f79a160867317139858ea3472b5a8960fa635d10e6c0284907c2204a9d3b974e105a12dbc6d741ed924e107eb2908a1655f1e998451eb12a8b0eaf12716d96ccfb70fcdfab0f3253cf5f9e5ba446facc66777b63514acb870425899806ea596101d5340c813baf06eb94a7f42985cf290a2036c12bb4b744292fcc8d896c93420a8dbb990b04101904d8c52f909439a3f6b1bf1a397c75ce4ff4a10bd321e32f50c896e4cb5f9fe148fcd9700c7e3f38a0871935d2d3c9e048ecfffafaf2587ae45bff8a2d289dd8d47f7b06fdd5268d4a3ff289ffd04fecd8f6e8c5c9faf11d6f6fd4330fc59920fdefc30d27b85f5d73a876193a657247b1116a4d88dd0f0bcd59392629480356ab2cf17a63a8ca37ed22a32751000335a3d2dcf69cea7e0384e53e0e8c6b4c79366e36504d2ff29d7a91744bbb37aa5c9d12f9c640496a7b6cb1cfd0451cda9917d0e0b97fabcb8683f607c9d1b604eb4fecb4aa48d52b0360a22c97aada4c7096c19099171f4c07a186d381f51b4cbcba01bb996b9554e059b9e0478645793aa30a3336925a3eb1c7705e637f72ed2c613f5f8072b87e48eea9cb45e2453a168bbf559b39059b0b18098494b0515cb35c830a7cccf3c6c0e832c6b61788e0722392361a643dcaf9bc185e774cd28dacd887daa4c327592c72822724bf16ca34680c22a181f9b470231055ba0661036fea389b93a9664a76953000e59ac28b1333357f4735b530d2d7412f224b67834c5832090394841e306f96038493e147d6a24c6611e268bb8b838088c51c0c7c42f282de337ffcbca009c4be2a3af655b4db8d0898c0396a8846aa9aea682b107034fd50b32ba44fb083a12bf0cf76bae99f4d95c07ef9a60a147d43421ee19081971ae9fcbafa604b49bbe7e14e997149cb875bd5f637052c804cd1b43a4e83efa7a40ed5eb2d26436fb374a685b5c2a6e87b44a7678d66e410ca8224db1df70ce8890106a802807a6c01a86744db1ce270f35865543cc13e0f6a2ec7f2b829377b660ad860382f4711f0042802541809ef5ef222bc0ce444b424b658279930de78ca84e7b9106fdf4e6210f6f294485d570c7a1d70ad9ef721eab3410e4c801ebdb406ff20e262a4647624f95c4c651e5dc463c434d93181cbd8f0d212ff7a179344b0e62015964adb30a67cfe6cd92186507ba3057a7a71c4bb711b15c3ba44426462bb43d3b9e893af6b2a8bcfc4489d0b0054aeddb146486575b6c1b4b2a970fe4363934c0f15ecb6d9fd80211f87c575fa023b685c0a32e2cae30f679ab7ac5a2a4d938b117282a896feac5c7898bf11c3e9c2b0f6dd224d4c9df4b84395c4f16a6ab5d8900f834499202c9f8c7ef4665882f801be5c7c24f138f0233a75f8702b105a15d9a4e94bdf56973c654393939f0bcc99a588841a9f98175bf69992932d57828c18daf7ecab2ce2131f858a69fa85e9a08b7f29b2376d6b159df51798bf7c5f139214d59a03f304cc360dfd6305b810b12a5e98da0432cf78fb7170a3765400dbff9c7400560453eff4c900e827baeb3f5af08ac51024bae4a812fa35dc8e4a79541a323dff7c4be8030a69a668bafa66e961fa1f15e6c825cb13105224e745582f280bc154a7be6d0b98205848678e9a11906fe4ae9e5086021a75314836b1930ff10eec9d89aa9be8cc143d083b2292279758786ac9dfd5d3988283d82aae45fb6dd02c613ea0697c35ec5f5846db8eecb84600a20a86d947e3b57d992f00d6de082449e12fca1e6848d8c74668c266bd9ffd673baab27c7749ddd23034904642bef4590edca2d370920a194335b7767a6522b0b16f27aa1a5d8889d0a18cdfc359fd39d7153bce269b9b37c90af5f08525114706fae6e692740a344090492472cec7eae86768cd8e2406efcecdf4280e3a03349056c2ca247cb74fd07730f5f02988f4bf4a9a3562a409b7e15690c46a07e717bbc90c7631f9f0a7da046d7c4442d2e9ffcf4c6becb6977f81700bc277717ad9944768494f2e30183f4cbfad1d317f9088051facbcc162fb2bbf9b6f90f6e7b055b7801018070376b1fd09701098d03052f37dbb647badafa142e5eab0e19ea516e033274c089e05b7b1503a10e53275bd4727b8f947d7b9f6c85a18babf01375f81bf474afe58fe2fd7e15ac01e641b32b85b246bf593dbfc18436f6dc97c11ea030ed77f13d17536840a9d077a29216079042caef39c25dc35dbc5f28daaa8d31586111d9c2d642463aa2f17eb562d44600eb18632e76e35e55d40900c18bad152879a2222d28141289879a94d216e60330d39d51c6fa955699e949335d4249566ab436265e40b7863b439e1a13f6d99e4e0ad8dc77d2f29d0ad3c884ca8332ccc2873ad907064054b704227c8f424b8d237c6e049861ec6fd514d973b879a83ac4e21475d3bccb1cc567e32a0c92a50b14012a487a4504f79d1995b9a1e90ba534b34fe4586711a81fef40a4277d201ac6655b20f9c4c588bc89133f11dc2f0aa0ce71e2739b302f2ad54778134453ad8e001841306f36455dfe1a0d165fcb08502e6719f0352a9e6f9c34f10a2a84404b7b56704507cce052864c9b7dab7023c4f3d25ea03c4dc434563653857e147de5417dda63ebfc3f349eebc2e76410285b475c4e389ce740a4c69748e66a3b098158e91734ee7b2b355ad363857250ea1ce18733feeb2f35cc4a7eb091d9163d22e84b622df62bc56ae3b228d1de11c20871a16d4cd7b92d4f749cf46b9bd1ee0e15c50e370a75d40e86b86c7dce10bcb5ca261a917e68c4361b9be4c7c0b57bf9a8b88d7c9b15816ad1e99339c6ffce45489152020deda8343eac8da6d311679d90630a0e19e5a552e708050afb20cb55c18fb3c3c52fc1e5cf776dec2aa5d3677c828b07213c9aabc43774aed044abc02c3e00dd97d01177484bbc0a1c97b80b02d6cb5aaffa69a15cd5128c3f6bc958b20e2626b42a3004790085beff8a2da2439082460f41982f6dc9b3303e3e017c8e00bcaa3002d80d6f41c5b99ac32d3013e25295ac25d02e3b37b40cc95f3b9c28717020d1b8635dfe40823927e64455aff9d51e501cb995ee1132dbfd7da1a96dc17d4e19cc66a57e42ccd4de2ae266a10b9d9987b5dc281128c1e053ed6623314c81aeaf6ae72059007e68229102fbe986526d62a058faef918a58a98b37ea616dd2869151fcac13f9dce68974d25a9d1086298397b839c5e08b30ceb36a4866a278ff817b60644c4a11c77f92572e3886e553a387447fa019c066c061494f33a104882db20c5f2b141c1a73229675b2dfcfec9adc9b98e5dfb4884b72f5b0a4c1059c47e6951518b9b85c51b06c62f30899c9cf1d8f80e7009188651d6440866bbc4c1bc7ee8c2143200eb712e8344b06740459b9fa26a8a033dbcc618a1d906a6a31749efc012ebcf63ab44e2e6789b25ce39a98701c1f3b935127ffac6f3b284a92f3c045e86191415ba0eeec784f5d4791cdf00592b775c387b0bf40136d88bd503c525e524f204a62f80d947ec2e1680363952d676c4916064cfcc2511b83270242c465447176770007b5cd7aa11a5c3e60a86e9eb1b0bd852832e84d45b5dacdb4db25b26f24b0ff059f486947c3173495aac70212d857fe5b6185d432be8902b51ad684749a43a51eee3ef8b51e94c27b8270928e3e0b19441e07644e0745139450f5337c8456b285d6493a0c12449554b83bc2407741f3e4719ad1b90104fbc59a24ed7259602e2cb1ca2848007ff295f48b803cbc68cfa36f86993c0a612360f2d7400c9ba93a62c8510e7bd0d28e8271c28a397c8f9f19206430e01b4ae4d088809a4991f560517e29c1a6c511f9e6e66f5e0a2bd566bfccb218f3a10a6d506afa99e5b1d077f427f8e6eb6c13e1af4e69836b66c4db9707227386f3a20076562385eda75969a717893b62b83a17f4067bdd7b9b14cca728f0d4683a3ce85cc03c48613c97e2ecb7486f35d179567fc65778b7030b4083d906c3aad875f7e91b5ecb475373e4362a5399248dcfd4002e41ccdc881210b7adc8e149475f0266ba799902298f32739301b76368ad94398783a0d444019799e7d214300e0833b0bdacc0b4acae510f36ee89c06a5c000b3a1b495daa3ecfd8ad1bc3b4dfe8355f54b942b5b935076ca49e405511142812e54f0162522ff2c8e86a8ad6a28326442fe2651a457075d77bfae2c1d9eb382cab346499bc929bb27da6767d19a4f93ec279b339298f87cbc31a4ee256d9f99a97a35ad9be6e2da34e5ae26493f68a12cd96351c995cb20ab06ea6e8acf14f76234f86bcc5eb5d244775f31686533986d7a34280735c72646cf2139831505c392a1155d7ad63861226978241714cf875d98c1b71af188cc5a5679f164522d2d4b0dfdc7cbb573709b0deccd0cea01ea4e6d63a2e0cbb5143037f089b28306334ca18e9995e9ee94574a477ff245a918f6c1846a676dfb80f3b800f334b9edbe5cd63be1482c15894bd109c7195602b7ccd45de9c58efc97ff7be17726f049afec455b888ee2189fd641a801a90925f14484ccc4d28202515de24edf177c6c1de88b0e8aea25c749a95700ae098c0313427214a0816d2b661a68248555a41dbe69602b5a9dd43135bd018f74ff162590bf075c5ece05841fa7a5a84d709663833a7152403c88e9723e70692fe9a1f0175ab1f232148bbc88e766b82e22c6747e793ddd19d5f72dd1414480d3a7202f1106c7358fcc17efec17380c62964847c951987d64703e14f9f48271ed47f1457a30f0d53ed01be5ca322b33253672ac47dad415d028748cc3013e2699c928f4f664e17ddd40c2293929ffa786268b81e223cb07921c7ae9549bb1e53e8aedcab387b32c9a7f11889d4383ff4d9ce40989d960a1d20e749f41e178b133e483bd80ed4478aa0be033d55d61826a09bbeb1f10e045e8380c4c6400c04bcd870b8a8f39145376721c824b333dc3527e3610b7a8c481344b21d6b8f0ac8b735b69df22e3a7e9455689c304221570c6d133705f9368e7d01353033464420ba862323521942cc23f1a68cd322c6c9f544ea4cd189af0dc719285367e7ab8359d55959336b914df7ca26c7e676cef524586b5a01ae9baf34589e7c2b581ad42cc622588e996d0e809b299171c9452c91a69fc65d611c56baecfad5b239e18b5935b7fd9f575a2371c72bf1916533f01203148d22d8a08a5fe1a7fc186143e4a5424799858353231a9826a395079b28e75e7ccab9e9b8bdaf4263e7b2dfc89cdd827c7cf3efec50f86b5eb76094ff4268d9faf49e1db5075b10727148f024ac9af5326525b2d8f26de68c22c448ccee7db2faafba9653ecf7c65862650df08a6ed1ad2e231caec1562006463b72a60543b10942e6a8176f24ba6815748ef0812c8482b50a54410011c88e52f9c60eb05a1ea9444ee5747038fb13f2eff53d27ebbbe8077b1b18736b00d43e90c26efccc0e7e538350ca3851f210f3cb8086cc68cd9038f9695e1e4b3f1c4d3d1e884e47d41b77034125352f118470e1e7d53a9748a934d03e8b4477198195c53328ac33f0c210621991222115b9696a2c81b10f55f313856a0386b86a003acdd17b41ec8523fa3614536124b5acf819bd75eb5213704dda829bc85d74a65b172bca009da1b5ec54f514a9d30d0c0ece781a483fe752f8fd2ade5a42c84e4c0a1300e69441a3c0850b5223dad0211e14132f9d2da5e16b46e55c8ecf46054060fd40725d16b145d37c0f2cd5a1765217c5ff1023241cb30ca03302c9ca45082f098815dc044bf1f516cecd0a07379554562ad950cf26f799840377d603e6f3482eb83d13d21061a4bb419a0b22a2ad52124aeb7b1f7e42ab326163eb697a93509a820e83eb144c9be8c735138020195047101221bc7bac483b5c99a6f196f34aeb91c809d0f1360cac89f850fd73bcb23d3e9c2634bb4b8f7aa836b29215f08f601f4a834822726a47498e6459a431b2b31ba8e204da5137be156c666c94fab8720329256292c7d93ef4365a7f258aeecd2116ad226b962a9e8edccbeafebfd07f9782e80e85d0141c5e8b2d3fbd20d2516519fd53126ef042003ecbf7b8394bc9f43117c911154abd5faacd33b3ed31d47c5d8bb8dfd3d323e8b8be55901c9dabcb29a2d2b3e7787136ca22b8c3253b9d885543adacc0a9181c9d421d90756fb5e8afde4bc27741a71425a51a79bf5207664690feafac9dc066f990a8055760e0aaa0559120b0a053e050a016f69dc4c28ed0a3d55f5078d96b136d4f823c1c0f74093c742800cbfac1c614f82cb9f9e04eadeb3feaccca46000cd5291e24918411a0c9d8231d4f61c5e7beeca0674b722c934d53236f480fae3f3415ada4677e5b6e97df42f412d25fd2c1748c8c487c9509a6243ca1ce2a5b2622891a930f06ff221462e7209e6c7069504d4107695fdccb1801627219ed3ee23c3dbb42770543e6df2bccb2ee25c56ea4e65c632642f6ed0a729f4eb618e6160a7968c760b77f41050505cf29739ae30941e25667dd1bc7f28ac5201414cbd55948f1a38b6193cb491e6c2cef62c226026803d417e7bc5b20311d653ab18d0e98260c88f7df7aa10ea3f9a1e4a0761acfb6c96f24ac1c04f935c0f28b2457232c958dc766eb16e0b2b09d9e230fa769d49997071e4de0362f9bf9caeb58497cfbce2d8ff694e6f6f665aee96a30c13f882016f0e4e07dcb78d3d00423230972b3d21f1c2c55c682bba906ffea62f6657eda4dc3a28e542b091333b24dad6c0ff63a9b994d663bb7d4d28b29b3053e47a182e12e9a443d73839966d924ef3e8966d7d3ea4621f361e517b26aa8f110d6465724fa1b89955525950c2e668f1a4b30ea053578381ca8a19c5ce62c2da349f0aa900a335380a96c215e43a636c2600f58b89538887fa6f57f4647dc4dcbff5caa8fd6471ff492cfd41376b1821a9d468a5a2d40143b428e0f2821448c8e18d601e3abf3c3f3a722a8eac8cbc3ab9d88000b8efc250de3c7d3e785637230269cd67aaa95d9a0cf3ba7e8743cc89cd630b59e6d8b5bc88714e6c6f656d016dc1beaf8ce5434028002398148bb403faba14017507c71361cdd39517a16693e9c8cde19216c4ec87e46477328d4f52365e8abd882715dc7f960dbb9d241c61298b0782521c9de6c8d66d6c8fe6adb79dc04729e8b14cc6178e05ad90bc9f879952664fd1ca2a1adabbe51e856c7d1be40cb6a1cde605237a188ac6699ffb09686dc82a8991148e1688e99f8dbd38d85b40dc86b333039b80792c0a6001edb188c156e7f7b0d2c13d8447fe5bd97786100ebd1b24f87992014dbfdcc78875d745560b043cb096da79f33d3bd40ce29a6eda0c39464c2b823118aaca132f9d9100ef9c991119c2e4d1636948f005f25d878478f0f317387f37bdfa3b1c7b74e51951cfcc1896c112786ee4f965d2b2491bd611c49a36044cafa5666bab4d7c4ac4b0cdc3f835877437ca65f552fea781c567d4c9d2c0a1afb827f50d3a9bd6620e1dc285a9d5a2417ce7adb52669cec27a421d6f4361c4709427208a4cb0a634f7a08cd61ae4de26f5457966fb48ed84d3d938eb025c5e3bb8d1d445f0c75a9aee019a4189576ca408873edf34a301f053162764e17151d10b0e54659094a3bea2a93502da86f0a17d8181e35b4b9fec02942e47eb17b74a5428b3fd8eca8645524a8a48c497048d3dfd679d9a99e2267f10a2868ef000e7f85bd3869a72280040c237bbdacd3c488c6c038a93ad9f0583c60b68e6b4446670b2284231c11842d0aadb929d1431a0febb051ec33a4cafe22840c826295c0f542eac265a8689daca47329a983d0de1f669ff9787fdc099937937233a8412be838f77807b26bfa2b949ef29343c0c7b5afa9be4149221764fcc1a52b201293934c8e69b787385a3a98c364e7afd06c72c594889763a0f84d3e83a9ea1cb9fb06220ef1b2ab4c16ae5c7909663f39ff0c470a404db927152c05889543cc7005bb6f8ff70d4bed81b5147f1fbb4f2700bc6fbadc80148f4aee289ee8df240203b25c7cccbe317c238ce6e8f77a4e44b4d7f2b625ac823ceeb2d553d9c2323a28531fa7b70cd526c0b1504c0145ea0efee2a70bf8ce46aa1584f7003824a7adbeb746f544a1298b2302e1bba4e07a483de1714a32ad81fbf05500a70c6aefcd662b6791b18d0734ddbdb64f283a4ff409fdfa47374aaafafb3465289332e20f74c948e707290159d40588722ce4fe61a988062734e47a4f1e086920c2c4bdf157cc206a670f1cbae26a578801da111322a64468708973e3780d668dd90588add099c4840ac5d54afb40e047f3bb9bd52e795327a7a0a7e98583df8d80f50240d15a76aba88e7ee830c30014aaabd2b0981a8c50de13c4583d0e39451d516be6310ba87741789434c189e32b724924e669a69b2cac9a228a385470bdf25abcf379cf5a94fa84fa0bba2efa3a384c0bc304800e8636cb8b6d24abd890af55b8fb4d4499b89544b22336bcb04c4820fdc5dbc8a428770bee3936b1478e36cf55607d44f59688fba01b995e54a24d8bd7f875f0fd8a98df01795e115c991005dc8e2261113687d610b445a596da35745c68b7dc150548ec81a9921950590538602dd85a5dddb4001d1c2e37ea4baf625868f8e6d8ac9119e5484a313cdb8eeb6530557775e00c09272135b993930f412ed0635ee4e65924f293d8e7f99017ec37cb41e5438d2122d2d4e43c7b4e289aba261e82d73e6a807dc5ea6e01b14ed9f7a3cf83c4abbb9e53dd12b1a9ee11642da7747cb71caccea03c4820235cf99498540e25e5f12610799d31e9b0f17d01d65eb10b24aea2d8e71d9809a54140d98041b4b8f1bcbcd082141f53541902e7ea5a1d32e967a8e711caaf61c1cd2cb5d4604532e2c69c7d40047afd6c5c69df593595a3236eaec2b481f86e0dcbd99e857a9dc24c99262597e76363947493d941403b2cefeb117c6d79fe6c663fa93bcf154335c28f6e65cb7c802c502fb69640f9a580aa01d31c446d9581d09d2cec45f596596c333bb24999e266833338bbbd621bb28bd5378ac4742e2e8634d2f99269c5012e3420deeab6c98fd6a725c3d44320bd46b3d84b11e234a41f1f6f4bd5d38b2cafc89c1e4710080a89a6e14d93b1809d9d216dfc4a83b29512fcf20a8c11b1197c49b42c4e3040baa8d5faca87dec1ecea146542fa79b08d976c6359d2e530253ce3442367f18e12e2d7b00ce1581528b29f87ca85b006c675192ed1d5d7785f723a939ef911a1c4c2fb2c2aa09abaaa8fb52fd3880616566e85842153da86ed48f0a36259a7d2cd4315a05dbc2217438ddd8c069f42c3e6356a2b8b0718bbfce63067b534baf27250e4f7cef252430d02adaf35c1962edb8116aab0c918e36cefe05374982753ffb80d0f867fe2ddae359062d234836b5332156049fe0e2ce210d65c7d0679d3455febf877908058d75a33bc34d1155e5614b002b16035be28fd492e284ff9b2543a95252fbfbf3405263dcca5495f3f310d92bab89023f95705c100587c35b222992ae7002d8d68e1e33e9fd1ad7ad0fa7fad9b0004c76e7d0f08311138b1b319b385c9693c9697042e82764946185b668cb5122acc0d826e9f6f8b4685becc55c531a38222114199f4f77946855b98181976685a4cd82627ceb4110366edc9343d1094972f09582a6766a05010abcb193d2deb2d37af155d28eb8032e8b086193136b0804621581e681371ca80db7165710bc4a032a1841b52ac852454a9d9b1609066daa851f34c766cf1c5a0c15fd844d9b8e2944fa64e4b1b0ce07785c4eddc14880e5bbecaa66a0fe1da81cf8894dc0166fb6ddc14125a34d9306d808829391871ac4919142ee48c40e8f3bccd5a06d746c0140ae26291d9ee330557f7c5c5421cdbcb497bf27a5006fd147f63eff544707d1e599a6d3cdccb52b13e7b3d654153b0a69c04831ba602224785f67f61153dc60b9220712f59f97a386e378010ac69d032baa2894957c9916c63c9aaeaa24175fb76a67a830c442b864e1991730f114241641eb297f133cf9e290421556db3e97fd04757f88904e27f4c3215523fbdc04a2c49be1545d3ee52eee72c6d2f4a3110938c5b4d0d277cb8bb564159100ea1f1c9a7ee5463cfcf3f3ce963ace93f6fa662b9017f00e4a868f8352a99681e38b04115bd01def38c7f6e07e1fdffbd6a8d22a065371b395f00ba98f954f74443441d049dbd9dea1083100ec143e63ab637a5339c23ad43f820653f567d981afb92f4fb0c3c3ebc3181fcf16eedaa7ff8bcbbc1480acda5520dac104d03dd4b1af0c97210e31168286a591aa889f09966329718f0d36963c71f9f95173281d69f94df3462cc6b75b42b9fcf85aee96164016e5d14dd4c2f300700b7ac4bdcde6a65f989faaf80087d6d355bf466b2db139001aecfd1e333006cbb47066fb1b65d2ed54026f71d0aadeeff602d89a0ec7200dc0658be932de10f78b719366b3d4ea514dfad1b145fc28fae03df2e919b4c311c04b1aa5fa8df46979bdc13f8ef5944b5f0841410a603e00c04a570e0787b9534037232078765c2aaff246d8e00d879e90f44bd790675ca399f0be2d076c27e607dfde8b5c1036f9b5eb4d475566ec6a06772988f9c7cdb294ccafab8b68d1029ef4b4f943e632b9ca6cacb1d78de13ec3f016fba9a400d507ad084ebe518a9ccf70768417e9f08a295f419bc3326c75f86fd34b357caa3a23423e01bf5cf55093051e58aa3f17d7f48606e0c77d0da972b0245467065ed236edd11d70c20d84e357db1cc50fe37484826580929a869738a6e612e4318230741450c96c2182ea25c14fdd01ba03f14335dbe9688001ad334bc9d97fb2d56971d7a9e14f8ff2fe453933d0f67f34ee0da2e39e39df3cb35bbe24ed372c9d9faf2b7f6f8b7cee4be22e3a2c8d91a144b0bd60cee21712bc92792a02f315bae3202def9804f6c406701d7605c004a3bc1eca316367e4983f8d5149f93357985dbea27ead810ea4e95e95a63b65e22001fbdd713ef207dbcafceb5603c6ac59026f414a5db7150036b52067c4a865a372d325e2883e4187886d793e68345bb250360eb3944b38e17caa60871f72b4e8e88803f7f4dfa8c0267bf15ad50c47e1810b57488ed5a5fb12cc28870f4ef9267efbd4157be6b14be162632c6987933554ed791c86426b0cd8eb5b9b6d368ed715f13ad858d40ea35cd5262d3901a4d83f2584bd5601f1e77b2f8996d17eb36061f7bcdb810dc7245d5673d1b56078ca7c2238f6bc5f7ce097b7c481a87be064e5ac57144dbf9c21c580340ddff2894de13aaefe32d9cf396cf0634bf382d20fa6695d154c7197c9b8ec7506e247d98d3df1e99fe02ab492b34d32a26bac2ce32c90c234ad18221e587a05ae23e5359ac0284039a1bc0cb1d8f645a75b464cb545c2d748940a6885b9c672b35a4641e340d4488201dfd4e127993de473e4dcc83c159fe57fee01b80f18c36bb4db41c4797f5abc90273d967800de7cb769e535edb4e7946fe5a41a483a51baea65d3c3b70e24d5c3940a809f239c88097dac2997a6e87dfab5f27d7f24901876aa2472ba3d69e480489f91f9f34bad28985cd01fe617d6c7827a13dc488adc3e89bac0df29abb54389fd666868b784e5cc25079c0e20f6548aaede97e0125f512a6ea302a581571664aa91fd86ff9de97f27bd78730deee2af36d4666c07268490cc49c62b6e3ce5eaa256f08b39aa10060f86e8204d9287480e4b621732055d762bfd7f6b227a658a76b1374564be16a35a70ee2b2a7a087b241e4cc1b2de8fe301a902befe769b6b85ad03fa1437a7127f2eb15668648315f18d6edf703d65d94b5de4709ee70c54c30f5d64fb692324427fa37e2884b40457c3d9a9ea070dd32d642ef98a95bd2d7103c361ddaac2366768c2a4588885ca84ef49ed30a620bd5b0fec9e50a8d9e98223425604a6173a597a0e0c3520c6695981c0b3830224d92fea529e93106ff9f5fc3852cfc2ed6a41a1a8fb5da023e05ade2af9b9bc498ec31638be2b226e3aa893785508dd3304f9974b92c31da26a78604ab35472c9056f437ed387748c23196e9ff1193b0979efe9130d33344160ed5621f20509c359ad0517ad96883f8faebbfc795d2d062783819a3496411bc5ef86b059accc2eb5e034da126a17aebd366d28938cedf084795b3372e3c9bae5ae0a1164f8494a409b81741026647f8c37a54ff96c342183a89a31dcb4fb9951154735d3d0a3b3611192160bf5ce69ad7b09f4eac59573baded954a3d5582dcc52346d30036c5d930a8f0a09b68cca937e181e44df5bda0e10d9908948b365b970ade749336c0c0f4f1c269c5f93b61b27e5cf22de3310095f1c190a2084e1471b60a22ae41e80c5c2ba892a076deab3bd75a45d04593865604cb6a64ac15635e35de8bd048edb6f0d38554996ca2146f663d42afe548c2393070b04c5e8e0009fda196379f0ddce8e392026f5d116dd889cb9058313a532d82d117a85a86fed278de34ad703c5d633010c2a8e18f2474c7d4eee97994096c1e0108520110d0e06a208bb224f83e88d46185096b3e0bbfd44b74526acddb4fd824b4a4d49cfe5b73817b1ef9e33200eb09cc3dcc61028528b63451c01e078167ab04f50dbf70e8f68e1629460e4edab7b7e037f0691cbadc5b9c36655bf0328f992cc0cddced284c1faa3e1dfef43a9d91dbae9dc3a64486aff7434c39ca5e6b8051d454a9806c6c23790748a0f1eea5e7f37ac3044ae3c21ece803ae3ebdcb964fbd27437f463469659b2e8c2aeb8b1c70e3a7faff68c7956abaace1f3bb6e81184afd2fe354327d20d818ddf78f4c7c81747ce2343afe07535e65ba9747b6b223bdc7d362c06aa75f962595041d408f5e5a65474db4cb7a755d349a1917989dd1949fb80630b14236bbd60a313ac405f09ad227936d8be98be57be68d73fdef061faa7848795151594f0d040571ff44776bc9d79dda81a939185e67195f67f984c50258b8a70add15d6e8ae310b1ce0407db687fd739c9e5fc90115044195f23f8cab77ef195fe3a49b6862b4c590de31d034526481795c73f02c3568002ea85d445fb6b1e4dcb7321087113348c84f384b34df16a7f237e17cf8c543f463e9239f3bab68d04590bf17f0f58ee9434c1c29ae782ee3e5dc6f0798773ce79b82ff15124356fedc7f96edb9801eb4e4041a2021e312073b5318744c1a1c6b14e86e2cf99ae5de89a291e5b5293b484068ef72cae436abb4c0b6d03615690d43b08581bffc74019fa8e3444fde35f91045daea9fc478468583b6d571ad30ddfc2304cb15bc04c13a46803bd805e660316d5300e3498e7c1f4196761aa731011d24d9895dc2927e34adc7237ee42463585274bbd5dd711e3a968798d2ca294f7b48c81ef16878c0854ad9bc449d81fcbe961110a57e99eef1858a5e8d9f62d5fe5d2284d9da4aaa637daf150215b06736ab2c5f0723d0f68e79ec41521a588d670c2ad0dd0349c9b64c5496c466517e077f52a8c8afa0a59e551efb253fcd3e554fa1284166098b06529aa97ec918ec4e479388e5e18dc864850e5bc05842252bad4ad93edca857ae6ac6ec5e1c658a488c1b06d692062ec9a63ce8f87e2ed2d1d493ecb3fe8993c42284f5311674219235972ecdaeb1efc74feed50d3086f38719aab3991c3c6cf5211741519ab863f6b4d5f4299e7e832a52b30962c677baeccd79cc823cd155146d08eb699d7e6bf7a089cd5a1eae84708144c64578d20102b1010d7f4a42ac0a21404b02243a01965efe8371569cf7f59c1bc894a2b59f7a30240dfa8157f02e3af0effee7b2b03097f7e0a3689abc8b5a3414c921155d29ebeb873693092e0de1f15ea5f123ea24dedd0d159041f65db5867bee85d56f9248ff4b0f57a5caab5461fbe5ecc1b9b524413685db363589780e7daf644d28ee37f906f38fc4336b4ec0a1b7ac4030f6ab9ae35ba7cda6c672dc764e3edbb60e9d1be58bc870f02bc4c159dd16cb5eb713bd132de1f23095553e66f028e23b0ab0d6fd0193fd3490b0e402287e32419e7cb668d689d25d1bc3c6d0dd9bdcd841c087d8338a7f4b12aaf06c61e799808b5a80f79777b65e7b93b0ef3b66d2a6aef856777ab3c020cc8dae28b6aa6020ed4de4cefad58646e4ac0039b6f0343469ddcd1681462cdc593000ed0867d67a46cc718c773a4f652bc4cfe09d6759737ea995235285b5e7723ba9dc52ca15faa63cd342999dc060f6323001778535acab5afa40562dfa4894a71bd5ffd982136e9844c7955ce9792926896b4344941556a26edc827ec14519845e723ab0a3717efd5c7df22915a050f4959bd4923116b6f13c9ce68f87028926d5fe03a4376b690e63d00634b9b380ee79b2c7ac66a063a4f7fc086be5e874c61e0ba692cf0b1e16302ba1ae2bee104630a9c43c4207b7e99484cb4dec0915783306f9a08049d41cb2eb2ba61ece541598f02df88062c75bfc9064c4da8f3c87cbe707324349625404a352275daecfc314927fa5cede5d018b18e75dd5cabe6041c6874a8c48cffd838d4302ae0fd29be986bffc7b9f450bfbcc1e64134a13dd75001d42062870067017fb05469696e7071e45d1628fbd024e867f53c1a5910fd0bd8c95ea23ae11c2f81626bfce1fcb3070024762417b450aab1f82764f8ac01ca74e552882862a3f897b0b1d3c7a44a00a7b48e73c4e9aa35a9f5b39ed7600b76b5a7f8c57c742ef7712d3bfae7c0377ae182ecd6e8d4e5de5672fde51d42413d1bfbd573f1344a213bdc896f70c8c84709b70e291a7c38b4bb23c49751d7b429d33b0e164982313aa64d236344af68476629c4d127b071a44844e1ec6dd6a0a1bf91ae437db1ed61deeba9922ea642827d0e32321d3163ca075d782bc311028620cdb5de10b8e4d45e1b62abdbe853ad875c157f34c8b67bf48e2e651ef3284a7e6bb356b72849a744d7869033106c2e735d3d3508403bd52c010c16a41b579d0b822e808e0c583f4f4ae0452a78686eccafd5664b524ca77548f28ea33cde7006ff27ef0db2840ecb521fd2198668e6885f4c5719846a7acd9803ae99246e15e4e79cd8db39a1b11b5322c92ea6cc49dfa2f2b1674a0f35ac9f5e63b8a0452cbf80041406cc969dbdd3985daa9cf92ecb216ce5a81d9ef0cba09e673134d1e33e8c5267b35e1358ce2e49696f40af33f4b5346096bdd3c50c9123431dd1339df1771465ce71ab145e6cd0d4486549e53330d74a4651c0869382df9951359a6be34672d310d29c88a6508f11e073980935199953a71160af7e2a5c751848ebf8124e3f623f59dade4f1b947b06965c7f4d6b79b61813fcde5e8a27569f8397c3fbdf70ed4b576486b44e9e4a1a385f4e0593888c4b1afe3a03d778e2a7b4bdf70857dc55c6f03504aa56569ac66f9a9f8049eef5db0354c167423ec69359ebcc80f2df28420a17a6690be3cb9fc58a99501b4d043746a29a8eecfd1c9276d2a53eea1a8468715697b081f2c8eb51c66193aa7f81739e89be6be28c45f092000c912bc22918440a6ef3e798b74075d18ccf2b9dbc055a4498012801edfbc09ffbe69baf4d0416f247685d0a3f94766dd48cf45653559e7c7e5a261af00146e4bfc7143735e534fcb52d0ad1bec84206643fa5f3fe6028cade8f5c8cfabcc46faf22fa574ee86737144a5cbe668cf585375438e6c32d0b1ea19643c12da7423e895fe7bae83c5d10ef0b21c06493eb8931850a4343a9e504b709e2472b39ae4f9e371d20b44b38b073fe8dad5c9d310da7424d7e8be2eab5db1d6ab85cc8dfdf1741200e54c67179fea4075d9a9c7a4f8455069f059bb39d020c22432da124a9b823852165e79cacb30f6473e8afcf8be954e5c1a2894a2c68cb9ba8f5458cae4d17bc89502296aade703cb8493029f15c27ca849215155e7e5921ecd46ac42052507e99af3e0e2f8e4747b98f3339cbbff1f0c457b151c3103456357ecf43c97a0ad8883387ad6d550fe7be8588096dbc7482d49df3c71a68d4feb604ba1038e7be6d37efa4cb9736f2c7b2e84acf9c90bae2f6b490ccd7f682ad6cbd19586205235d03f7545d2b36a04e84c9d61c835ac5a58aea009809b46481f1c79c79a4583be8c0df45da1900dc60d5686bc0f1e55d053ab1ed27b5f036933eb20e24bbb6e9d580eb3f1920e62d26bfba1b8141788b6606e5232ed1f1d356b10965e5714a1840894ecd0748eea628c33608b7a611769dd776143aaa8641f6a5196a7c031eb1fa88fd71f81fe2c79393cef967c5d391d6bb4e0bbaa4574b1b0803ab045256bd37a1d55a82401560b221eca45fc1b32d073cc941c13af82170bb64210d45c1d824a9b10b42304a1bf411e113d9631537283fa843acdec8d9fe1b4947e9681ef5e8af04551824a544eb097c5727b11e0a88e3466aac3df86ce73d65b65dba8689b9f9082b343dc7290b96806a059477fc88c7ac81ba5fa155b91a14a81b7c177812810d1bc075e79b38cd0de2b3ed5508811effd043ac73479e1c7bb43d47270de84d0fefe0b6ee706a219b588404901cde4aa35280180834a662292ea4e635147568b88260c98ee610c5d54797b9375d4c8b5677e0d0b5e4bc4517a1d43b242b8c87352b78cef161aaba0c8622b08323398db9eb18c5357d969321ea04cb6e90636b94b1bab3e76f5b77370708b8748cb291f30408c91ef13424894e1f2e76c3fe4c3a152ef732f082e17d1c1f7ff118299d491038e8ea66f87e00f87eb443050eb8dd41b05adba3ce23757a8a9216fe03598b3d14320b7ee49a978334ccaaa0b46501b5d53c7a30a305243ab6d4c5da81e41ff554dc8620ca0e1de522c4b8895e272effde43973649b097b1cdb206eb57a7bb976344d13a9c5413cb83fc99299770265c988d5787b93603652d303723477363853bee3ebf3cb69a5b9b2ccbd466b5c8207d0b072d75ec6291a8b4fe59e3c138bd1f18614d46f1d73a0055c5b914c643ba73bcbde0a89e324b989050e3c20102cfae9b0172f9cfc3d159847ee34ae7e19f69200ce3ce0fb376c172e49a5cd4000a06ee4ce868c84a76d538946a0812671f518e6b32c49a05b1a38518c63b1ec69a82cad14298e39d0c11ad41ee6c428871cf86b1c66072b011e471c786496b90b99a08631cc6a15c3b98397046961a0bc344ba893c2ab63adad5e0a180d401a1139d6b3dcd81ea8b7a0e977360ab17879d735560476806e28f05d776fd9a53c8050ba91a64d865f5fa41c90a41f903d9b4027cef16d21e414674b0f08510c8697a2f69d20cc18c5c438c5587e1dcacbdbc952242d0021cdfb35b29a0e9ce97a18d1cd927d3f8ffbc406141e802c5196f06d1b10c07be45448a90e79d2ec7d0b2960687133bc97be6938ea56217946b898ab16964a99bdf69f06faf636551ba557f654bfa1192222124cc7b66922b609bd44b3380c72c983a55508ae853a82c5da6a6aa389f771e1752abef4a7e83e9292d19af471e99bd6fb1dadceeeb1e374acf57737821423c60e9f9bf881f7063178d353848c7a8ba2f6ae096ddc17e50cbccf9c8308f8e0f967627b2c013a4d687d4ae7dc192f4f2b0245121067c67b43f41d2f21dbaeeb4c74fb11f52534c5295493ee17e58f64595b66b4e1ad3ed464b540333ec33559f721682d1080dca7729ccecbf3c6c089c161ad5b793057f1863b28f407308f433b210c57740f3e430c63442a1a4fad210b29f9bfc83d9174c84649041227cd644f2652e1c1236e88573567fba269700edac9a452c4babd3b494099f23f18413de25ab1f468d06e75ca2eed4bf0236be6c6e4d6f04b1e714b34adda427dad5d642d1ae5c48edfbf4888fa8bc0f87210892d8adca010b5e0aa1e1750dd34806303ac394f1430a9f4d143ddcf346a7b13bfa5f52361c82fe1a7ed52dc77849b5ad860bc547c1fa07424dba848608fe9f147f1ecaefd759cc1abebd424cee6b98330ed10ccb87166384cd03ff060e654ef4ea7fcf6df6a6566e13642e5939b8aa1a8c4e8c53fec2231feffa0c2e7c6a6ba9084acfdffbe862b982ef25365d1517b03e9a468409128e4aedddc6a51790137b793df1b6fbcbd27208f82dd4690be57e6062b1772a61f502ccd572e0eaa7bca992c31f758de65acd63e78b79619dcd8f5a840723a019958b7828fdad9c84b33a12ba7fd7ad2ba861fab98cdf07f20d8104acb9bc75191d895b34c9b4c1f5cf9c56bfb0d7816fde5e33135aa89e445e5ff9c2b30eaf015fa0e1419886580db51e490a0f9b50423f826b1e032d3d83d2fd0f8ffeedd50650f8bb71ebee0521b6a8259c60681e2f6c32e1c92be19dfe8e8779d538e7dc11560fd8fccc2056400ea343c412b61c592cd9641c521d1016d208b7bf421af809066905c057f5de0762720e601acb3f8373376f17a329c78f029c682cf14dd75d580824d06bd765082509a02456b2cf47a289bb4add18aa608171e69fa1da29eee2c42d046bceb592fb9ea002f4bd4ca6d5c618ab1c502939d42eb9f3ef618be2f69858adf17b080e9907e129f461904a3c9eb2494d47d9e90938194420710b2ddb1b48be0181ed5b2d099a5bba744609ceed9939ff39eff6a14c486c4ccc951a7154071d80792d24b9ae4a9da9cfb9759a4daaa064b6919308ce224937e375f9eef544e9796a621604ec487042c7197088cdd3e7f5b7f971140709c3b7e3f60114a16cbf3688d617992b688b9fd5d87e795d843f875d2f567b454f27b212473d8ef218808b57dca7c6a01d9286cd7ad54f52888b411bb5809505e4c3443dc573d35ad2c23c9f783ad6fa2ceea787a9d5c187bff7b6b590ac56ede50dcdc93ed982fdc516cf7c03d84d7d199fc366810a9bce0ae67ca8c9c81a4f8d4d3a65a5a946adda1a1aab0e10fe5f5b03612d3018a2a25c406cbf8c2465de332d816dcff18003c93a668fcb714c02591986f7b33d8838a7181469702d456cf5891403cefe0df4876c0dfe86bbd866f8028e9a2a094cdbaee704fc7547f0823299ccc5258c1771c02fe9a0e6d7ff4ba58f0d9b8d851b2441d0e3c089115e3c0b65c7a367a3e9afa9611d17714481ab5a56260318447672e5ce06ba58afc44c628c99d747cc21a590794de69b69268448ab9d38d5125d95db75af62286c922e014c22280daf6ae7f34b9976539a74e0fca294501703f21dd5d3cd18382d8a30cff5953d99b80ad050a5d2f1daf61b9c178e374d1940fd2e9f3ac0714156b970dae85d295a5eaff81aa80f5fa35f14f875d79f43bd9ef3f1ab389688800070997f830ebe04240a055c17207bad9564f587a814909fbd7d80c5f31ba5ca154f55b2913ae05d74a5e3d6a2444004d183d5af56f6b7b25d41a713ffb4971d21284481f492410a60c9f39969b8f93e6090c189700c4a1a50dc84fd1a08e81027214ade42750e7ed32771667ba3ac9ff1ae8458dd1a9296eb21f78cbe6ce3cac8c10e32173f0c0251b9484c8e89668e24976d6364c182b54aa6c16809ad6b4c9e33b6873802453a39c617e4da1a71e698a1906b26c3d1016b20f3655c6bab5f1c80414a327ffd5712facb0f3c75fc5085f66225536038307f8c2c4252fb01870fc78d2200ed2e3a3dfe9e9b041625c0b71adc9b20126951099399e1a18969138f064fe2564a483c5ef2b4a1208b71ee0e46f01d4789438a4fcce813fc04ec596341ef64cb9d2e4071c0e66ff2a2bde1132ed62021b51d94fb6f241bd35b065f133c5f83b7f2cbaaa612cbffcb60511e685ef3783292f3ce5a1c11518929532631132b0d1a29e7e49a8fe1eb30c493f25ef05c096959d54d4a73a63827f8ad7ff1ba5e0764d28ca4ab003645fa5b07a53e76227bb517a8002cbf8e50dc353ee25ed126617336115cb723baba81e9242006e598ddc957504a35f6f0a948ad9c3b64e9c0b8380dae0f82d51f73c8af822f4e4031590addf40a6cd8017a82d95359508a2cd51cd4c6c9278e218716747258403bdf9f9f64a31ed52b00b33eaa07f6c2fa89d453050f63e21c8d2eea320395064100f0180d0000000008861c74686bd4bd3f6fa5042a51ac5bc98d33de31763711112152e4962277b405af05aa04371ec6536739cbb29605aec753b50cc920a5594b085317b141d4f50105db1423375e105d89112d71a2612e8b16109d0bb1caafe4945a6badb7b24f2473f6debb8630fb44921caf6e00d13ce7546698932a4bb24a6badf91a06380c908a52024b95ae29503008c285cb891b5bbeaa22c0c853843a8b37042b914b31a32893b160752c5d6a071354e4988c15099a25e15c62b40885c05a52050b0b39250df7451eb7109a31012cba34e90032212d9100929525258ab48cb6709923af0ba5cd44ef0a23aac6a6c690c6a608d140595c8c1447aa2c21eb02e1e89a0535c8429c736e42987d22e73bfa4899a37b927912923c75ab3d95d7eb11c49ccbe82871cb5ebfbb9286acb278a51d718b92b1820bd92f68068249e80cbd1898170c778e5a8b536baca277d86e71561de044baa57463489d19e1e2a16b868727aca7235b9eb850445d2318e29113dfc18d95e5dea605175a6bfd43c937331f4c6f603d9e8469fe63e6cb8d450961d817b2db426badb54631502d25b1c83103ce838c9029ab1e53183c359122b3773cac69adb54649924b6b7d1271d39199db3ad1ac9810b931cc608acbd775e505090d9e4220cddc206613f11445ac4491ab0e2794846d46968c70e11882702fb8d1522a7594645ac203905c4b9c738e06d468418d26d41ac8d332a7925c9c73ced73827b9c436309f70403be7a12fae93814dfa8ee93bfb9cbe5adcf89203041855082556535e4765545959516c97c5b622be05ade6dc508ecdd066320c97b4952d39482eadb5e6224449adb5d65a6b0d93e46ef1aba7aff4ec4155a8ccc842897b8b9af224a40d4dc611dc111d62716857458e02b0829c22976684ccca392380c906505c5a59b478405a97c4bcb8906dadad5d15640feaac43ad611525bb96386a814ceac84f4887436afcfada393de444decde8456bada5b24fd45aeb1db02b5619f418220a82d35a29909c4abc695145d1a0bdccba3640d72966da96585870912d4038b5947a58ca18f689c3328314b41e4a6aadb5d6bb6986294d5bca90e6a46a6d9246ba51e462e30eb1db46d0180a3242085c1107a240c93115250a598bd14a4d1157eafc4704f098c4b851e5cdcb4990589b87163da24e6451fa9d4029cc4ba4b270f32addd2536badd5230f780c7391311d6aa14b88afce500b429c46275b128cbce042c4891230af200fd0c83281e2060bac1a1fa6fabe40ce391f6acd39d781c98c9a4d872a8c84931811312f1500ba2176e40356dbd552df4337cb57d9b38ca943677c6ca18a318951b64eb91e47b8c895a1f87116ecfbcc8584b3ac3934a196a8267157489f5558c4168abbe5426badbfb24f24679818f448bd9aceb44860998bf2c2818f2745866d504d5c377c17c5de7b9323d788364c3361f28674406af25643cc040a2d1d13a844f16224c90c0f1bdc1303e0ea994a44081664022e0a921e105a303410b14528d4e21ebcca6b02cd0049483576dce842925663e4c2c3706e0712b0847066c812066fc02a2c613f62b4bea0d831b643480cae221f891a293721d2d19b198f195d8658741971c5c59817b22ad38a8c0b009dff9e04bd900c6744722493485d3c967d895f19484ad4984b8c4d4034ac58bce032923225891557901188a6205d57ee88db25c5af0c284a4490d12811266ac9b25584c30aea448e2e1e57c4d2de7bb305b34f24c9710b90beb7606d09f68c025a54116d80d564c690046001124246902126b8aa9a3608b186e58dc9cdea8b88ab1bb01b545340265f55479820dc20b3c7a1696de69d632cef1c5e0fc9182e737a902dab2f23dac6f0475388ae214a529819fd18a95203aec95c9a8c0b42a34965adb5d6239c4648a9284964430a09b02fc0ababab9f94142a5d6d349a049d48d2f0416b4d6291d05aeb095d6badf590a74950935b171d5f8ab07030da8005d88e2b4d6cd74384240dc6809482441a640d21914989f10ba115b5e6bb404c3bfea16c94e2356e2be3cc5600c7115c22554149d6932d59597a4009d281b62c28403956600dd142aaf205c6abd425590f3ca80ce1b042b2c6c5c477c513338968404042b8e38497a823271b8a20e150e1042b0c88cb8795124fd25a6b2a4e65a9d3b6bad65a670d09eaa25a02c407908e28b01f28a8b01c7999d29054a6e1a8e23c9b3e9a84f838d20445da4f0d6a48b464ea45972c0d9c73f25291731c01202ef03bb3a2b286e5618371abc599d0cad987221f5f825c262773009c0a9fc34d4c455a8aa8485ba1826cc7579c980c10e50552e5ea80b164092e05d7972c1b398678fd483204cafd01838c0a0201929952957d22c953492edf9614711f9c6819425192011652721eb24e68192952e663096f146e0cfbc4211c9ada1bc5bc252ae724b9c2b65b95db96f85b7252c92af88bc4f2030b16962e9eaa4506ccfe11d3e49679ea1c952371426048433d2860e42b4890998c2767409c462b20505341821b4cee4bedfdf6e29c733527ec13d5a448150237e0588890e1e2aa484db735006a05d04510105da634f01e7c8d2cbbd0c8ac90384b2104c611d16d0a2ccee8298ad25097d18dd4de7b93239212f3e4a4d020b7b17443854c708c6c37b9994122317e4d5ede664c41c2e636222908902d54416e1453d90b0724ef1af26e78bd9baa9b2f77849cd49aa8010717ec14a4f22ef4cae984c939e75cd54dbe0d586d890a538a9a3285f4854990880fa7b42525245c1e5a6badb5862aa5ec9992f32267ce0524a22918406ca400ebc0e34993d80a28b032332d38740b48ddc18742b1382d7241293090226c069b93164b34b460c8683d3d80e24d0b5077d07602caf9b9d8bf19397f69ad032467b9f2871073cec925546e46a5dbf0c72b4d4e84a04823e2a1a109181298d1d987282155daae0e0a7a5fe1de572b7ea39421101090882df24b1deb0d1f0d47c305559bc21994d3a4da23d368449036058332234ca6ca62acd8b06409657975195932f364138506649cda1aab9ccc1e175d4f408890646d6100945cd205422530b610c17273286528c21c4090d2d0a86c65192271f242475a1290b2ebc45b227b812aed256613226a5290825f9cd03acc28b205b8620957d50f29122e0e9c6dba691b4099a60d480cd35a82db62535203469a74c5c55397361249ee0d02909a6d6c5ccad1b58f1e5d975d05a5f60e1ee231c1cc99d9a7b5661be3dcb04f8c9323559473cef9da6b1c5843d298a973fb50a821c7988828566647538a0c31811a9ff48d01545993b9a0141b2a57c138e75cce29fb44724fe9fcd6e09c935ce35826d45d50c55e59c1d5508abae00ac293242baa0cba8a5435ddadb4997ee618622b8adc50178da1383518bf24fd6b4a834c2b84aa30a1c5dd0c4a33333333b3b33371c417e79caf01d7826bc29e1964d4c03476041535d818d31b8c9d9c73ceb994d61c65915de41927b7c6d70d1839a7b7c5e0af2c9b7c2849b192624b6898648fc1741091b436d6a405c70e104ca3909c8e0865b8a4b590058439356585a5a022b230e48406dbdc5395131af438b4c197b4d61a051a4a6aadf51b08664075d9a1f5c16ce8c6891145ba700cd980413a60517a954a157221e88262ca1a0f284d563acb0059544a634428b27cdc24ad35b964efbdbdccc019a071ce493327c04d3e41d35bfbd81ac7225ff98814f9f553ad96747cb8896991003e90c5cbd3970624c2989aa00d15e1028503c88bc6d2cdb682ddb24f24bd4c952f9158994ce562dc6dc416a2b5d6426328a9254c6bbd4de87e06fcb1256840b60032b2d2398a9b988f2daa2b222a5d566c3d9921a7e3458caaa6b3b3920d691c8aa0f264d12c2e460f293b9e0851f1d4c012c4a5048750b835f6358373ceb7b24fe49c73cec7b42bde100d63caad840c9dcf469ef834369639da0a286bc839aa83b65b1bcbb036e4a4d9022474c8800b4494539915165059aa3c510ad1b61435e343cd95c1246a25e9a0b2838d089136116c8bc9b02d48d9063562947b97d194596288ecbdf7c6b0f7dedb0d080868c4de7bbf8d619f3824d154b7de9bdc03e1747de5877da2c6d033e035ce39e79b0bed774d4e18259108490d875af00114d8bcf9529065be7d986f717a2b0ed3b5e67b34332ff330796dd50e1564f3335ace727df716f42bdedc8bf14d8a6f32ff5d8e90b22deebb8fc0b6b8f3b58eef5f76d75e7c4dd687ffee2fc6acd93b54803fdf9cb39ccf7d0b3ace7c7f9a3fcd6ed8bcc96a7727fdcddf34d936af61f34d33ebacb3e6ac0ffe9b654c996ff1d92649f345f182699a6b7a7bdf9234dfaa33d9a777f833e78f591b08bfdf7c0af9020512fec1bf83f57536cfc389b98fd9f601f7f130a3dd1dfc1967c0588220b5cd6d5eebe6d7acbbb467f798f5c15ff3ba9df91444f896ec362fe20b36bfb2ff6cabbe04b625717e09664ef3ee510a19a312d8169fe91c64fcfb1f9ce906743caa593184d50218473f5f3180bf158797cd6a38a3f5fb3ceda9c17fb3a27fd77d7ecd2a769bb5fdde8ac31acce221c6d91728649ffe076c4bf6d89674c0b62a0ddbaa3ab6edcdb06d8fc7b62fc3b6df63d81607866d71544ea6eabdf77235aba59fbfc5672d5eeb986d39a0e7eef1a38f75dfb13ee9f337d16b9aa689a62c49aa6a4fbc208a59ed4777f229e40beceba7401c13c0b7cf7edb03c0b76a005e00ec05669ffef603409200505556ccbeb697d55a7cd6392b4190faa3fbfdf647f7f4f7a3bb0be49fd5b2da9db01f7dce9ef57d81bd5eab762dfa7ef410fdac86a2798d020b88437198d5ee8d15a7fe5dbcfa3a4b22ec14ba7885c4ad7f85f50274f1ea48968a8e76dd6314d8c730b26ea18b576148fd0a0caee374f10aacab9fe20454f12a2ca89ffd9ec3ecd4b5fa62f9e78b5de4fc1caab91d7b665b0e6c7b75e904f7d3b407bd62375fbcf7cf21d631ff3e9a6eb8791dd30d2c19cc2bfa679a73fe49571f1dfe1dc629fed4cc3b5e7b6726e0b12deeba9f615bdcd373d8cd3ff3b7d7bc37b33ee9ebfeeadeee0e1558d0ef9b2c36db11f48edb73adb7fb571ffc16f4bbb6b99b3fa60fc83de57c15cdf3acb73f7803b9b777821677acb3cb3fb8a7cf39db9ec3be9f7396739eb23ef7f1f3f4cf8bc67c7b7ffbf94db5ce7cccde359bac8dcc65db07e0bf7faff927d9ddb96f660982d41fdc6ffb83db73d8f9a3eb2eedd1fd657deea3afe33059c8bb9806ff4c9af6e0f73159dda398260b4d7ccdfb332c2f0b4f1488ae77c54199151f6121c6d1afa3e255bc13da93ace3e7690ffaf9f77a7fb7f2c7ebfe0c398b3d66457b8b8328a9aa3af2af7aaf8ef521df7cdd9f183dcbee8e389a2fe66fef6fff5923010854f7b84602102a07b4a3ac8ff9fc53dda37fde5402fc75e92a0153fdf492af63dbb1abac4df9fbf9af4571305f20b34fbfc638e66f914bbf9ffeeedbfbeb9c0307b4a78feeb4e7be4fcab6b79b13a0fd8a5c7acb41e4d2cddfb1edfdf5fded0576fd64fafab26d073a74f375cf53b6e58076f351b61dcbee8ed8f98fe9067e0efb6aae38788471f493ab8edae2e003ceced9b3ec4ed86c768ab9345b6395fae666925c403a189b060fc3c939a7b98043a34a15545b0db9a11e2b19312e78cba2c523aeef3b046f69bd7574ceb9ca4b5487ad40eec30826434044d828a9861a0c9991015d79210900d6b375cd01811e5e7051d2b1446e2dca1a932a38d82b84298dcb2ddc4aad758ede9c735e632b0b915373b4d61a6b8dec58675b6d02044384a436411bcb1cb25faf4984b2b71d4131610c2842e690043da6fdd1e8eb2e6b7e8a2fbffb634af1798cee0e3651076cdbbb976d7fb48e6d498ea61b509e2e1e23fe33fcf3aa7e611cfe3aeae6b8fccd13ec89f9f3cb157f86cc5b772fb3a61f13c3bfd5529dbff9952fa8bfece3df92ad6a9a5f30ff37ed21fbeef96abaa9bf7c415dca3efd3d936d7baa8ad91fccaae33c46473def937cfcedbd240cc963c4d3d674ebfad5a57c414b659ffe5e4f5597ba7e1e237dd4eff3d7a59ce43ad8dbb1f31d077dd44d2dc56394b23c465a4a4b712dd5358fd14e37a03c47ea96da8571b4baa56ef118dd097b66487321b8f130aec2c05167a67b6ffde9ea83f7b9b7dee98955cd5f6360bf67fa699a9efbcfc798436f974e705f97f6ec3efd11eb887dbf1006629dfdf7d374c34d37deebee49990e15a427527cd47d78584dd3c7f8874fdc1dfc1cabe83b459fc7b1908a310de73d0d8a817dcfb02d49c2b0ad4ab2b7f3d0e76d1c01de666d605e7ffa986d2f867ce1636430fe619df4f7e3139b73fd2d06f694f7974579e9d38c3329e6cf59de9b180bf1d29832dd70e2aadd8a8530c0ac3ce89a0163217ca2e327d39edd7d753d1fafdafc11c5429aa729dbeaf4ee58fccb17d2e724dbeb3ee46ff275e8eb5e4c23a0636dcad77f1ffd7c0143f68dcfd9564d592c7477d65eaf3f893ec730e216431f5fecf1c742e89f8f7f5868a71b4ea089818763c08085ee04cd8aa3cc95593b6fc6ca2acc47d3b4cd2a4852679d71ce69dae3e0f3599455a0e986cc4fbc3a78714606e6cf736dd5dea1023ccc407eb659d8db1f8c571fdd5bd0af48de9b6b3e7312e7a2bbc33f3f38cf1eee65153dcfc8c0b0fcdb9cefb33ee4eb32cbf39ff94f613ecf35677c3e0e667ebe88751e6c6cf3ad2eabe8fbc9ac79d63c6b9e9e36ec0fee29eb93ff3eff56c7fe8822e73cb3692fff59c3336b5393c1e6e62164b6cdfccfcfc0bb93ffcc39b7115474fe0ef0f999f5c9af3b39848fb9791e4dfefdfc8cc0729e9eeca3e7ebfcfc7c08ec0d7bb2366c9a662cdd9a8bf29aa1666500b93a207f2b561565a083fc0fd6f47bebeeefbad177b03ac89f7dfa695852ed31ac4a96afaa97647dca3f3f1791e425337beabefdd1e9eb589f53774f129fea7396b5313f5fc8907dfadbcf4577e7fcfd774d2f99fe6e15310ec9595d06febd1eff56edfcfcfde4e7a2f3756c2eba13f6a78f87e9e7a2f4c774439a558c6b068ca3df5c19505555d4a1e63a30c35b3ccbd13b9d599665a9ff07fbec922c4b8c35c9fa5c71ebd7e69fdfa29fa66c9bd3f59f24fb83bbcf6d5196fc936575f9e5df11e38cdd7c0a77a734734ab6bd6a3ac10ee3dfe5532877851cac536eb8eb986e284554ed1d2ac01b3f05bc5bb1aa974fae3ee756f72e9f7c0a77673f89a1b7325f6295f521ff547fe32f778ccac6b02dcee9e5b732ecf9e49fe43ecbdf64c9dac4bc7e73effde553b83bf74b36a7b732afbfcde9e6a3bab4079f9f9a5f41b7322cc668dab3d309d0bebfc2ddd9d84c3798e2598c8e9aff52e841bf7cbd9a7bd5b7c2ddd1ed569bbeffbe4ec7da90afdfac7077f6ebaf49d78d9e15de34bf8299338e9bad702768f5ee54ecee7894d7ae10351f7d11eba0f7d73550f669b59ba63d356ffe8875b2d8876b68ba21920fa8b40c590b62ce18c51100000001b31700002800088683b234d10335f614000a45ba90a498501a8b47426138180682c100502000410000401080611086623196ee706b24bb86af8cb951f749e57dbd23f830dc0547252728c144e4aff9753cbeb4de4f851d4f0661944eba0797013593b8d0641e5cfef5f89cbda4b1d905624a450bb6e927a63fad4b85ad3dcc4544420e2864eea051610dc2d551afb24cb17e03b471e0f2662ad6c2c26d41e922297d75f1456e6963d95e63572a676ad6f8f60c8d9dbb205ba78fd6cf2e8a6c2737141d1c80b00c9d77eb1a94988cb8926dc1555ce6304ebe95069bb3431c29e66b6f7591b9948ecc42599464e86bc15de05b9109530399d9d9e1dad18c24b3261ed66133f9e78accec9d025c3788cb18b357c8f5b9f8792a1e2196bbfa8afa4eb2667ee4b050b01530194590eb029296fd6f553d09aa49e1e54f525e2d05c7f79ad572edc19a7c89701756138ce2e021da0c2f2ee11432e0356edb228dd6ae3fe2b322977529723b786be1fd4542129eb4cef15cc3d5b175a643a5c80a2611fb2cb3dfd6cde077c4b8317836e520b330c84e606fc1d354e21e90abbe792bd43ea6a3eebbfe50221cd287ebb8461ea524a5755a0920e9a2a0c5997a4b3f301af1410aba3a6987972599fe894ad74872bd5cff0c7997027a184b3ecd0f5ced8ae403823d001975000b7c84e4224c38bf5839095941d5ab20c146fe1067fcac790035bd52c8738d6bfe3ac7cacac2a624fde8ce203756c66b0badeca1f04a04f40ed619cb8b4920fd16447d203e7982bc0ce05c881063e6eb78bd88e05793e5f74835726607bf24264617fc0e46f3770c2f8215370e9eea7a0038fe09a21c7d2f362f24142b0ebea63a8ecf686e9ccadb95e7a7e4ec6f54a3b40e2851dd1af908e0664d5e69bc1e3dd0c3e83f29cba773a13c4c24a3804d2af3364af28bfaf17b30c8daade85fd6644b20587500abf369d7cd4c6b87d4592225c411f5f9ca14a72304b53a5758e9c07449319db1af7c0b5a9065df98b42acb2a0f7a3a3db607fddd1bf4d6f343c6d46be22112a9feb21588858a6f492c46a98c315b6a4b75bef4329955a22c9ce4da732e6cc4e8df314b9f8c919a96228c988ce5f4eb8d7832c4dbefffc0e9e7e7a4a0528b825da28a7cfc6427bbf5b9136e0c49520da85996387fdc6c0e1969ac24ff12e0af8863206a47b665cf7f88ac15e8827ad3104ed7d58fd660d864770e72c281c7aac92ce4881cc0276989a66bcbe9a499c081ffa81e7aa809a4940622e132dc346a86ffbbff6b1c08908527dec3ecd8a03256c277e2c4e14e4c586d484419d45788d48470acbd97a346d1877912bf1ca06e2d3c7f11548212a5232b45f46eee012219e04c2256b98f54db11aae2783d40246f86a8866a7105c5787d7e789f3a32c79463a21c7e96138a2b456d4736bd84d09c1675ce6b5e46b8633efe26a73c2d7a2d8a6ecd7fcb11869af7e948da6a3c7eae4247d3430dd5c961a2abfda960f43792da51f71c720ceade781ef5cd3281eb4cacbb14530989f3b5efa227e636a6175b59da01c7a8f399caee74b87fa8e485fbd3c6dc2ed3417745a588b7c3c8c86e0d1d9a21a83816d8608b0a2bb82c0a583d462185f32a40ca9659ac42a860a2b70cb44fba35c09a38b3ad8e6cf4ecfc041876a1429bbcc5e510c3060476150aafbafd01e4c32956896bf2b30a21228c7bc8bc74124739dc59860e06e96aeb3b2b89993cbf213f123a33eb486b073087683758b01b17f209610703fd70b8330939ee00c9157929c63d60944d14596ee0d7d9acf28a5699c7d8605fded0898c236213c19cc656fbc9d46ca2074f55dfeaf83f74e5162a69d5f54e639574a89100b3782850dbc47ad8e98d6f28d2814900a74680358b763b8a7f6bf8400eca16769ee5da0d0cbc6d2edbcd6cf13edc07df0c6e90606f21c609f034cbdf022ad220fa1518a87b48c16659edb8c68b19470c00cfae6c075275059944211fbbbd7bed3ea5ad8795d178263748ecf521723780dccfe47a3f3532b6eeb8c2fdd4a8413ff868a41418fc8f998a4a886172be22896040875832ccf48b2a0ce46a95cdbb921f9d20c1caab5eca025510e60d5afc3619c445db4eca630c8a1d737bdafaed6c0544a13ee2b1ef6f9082b7ab30be0d0e6edc0e5c66c7ce27ed7cdc894ca1a4a0f73e79005ee09545ab976673d369bc4a7b817da3901929c01a2f3676d33d3558a59da5467121ffc89dfa53e20c7458be408ff96923baffa33641b84f0555e484f0420db5a20b7be5e6a928a0d3e68998e9230f96a9abdd800bc19f6ad7765bfe9558196ce5e103c3081a0f856539561e7b51a4254e3030686c5d3c5492c04cd0e0c007fd5191a8b12dd8bee11bf838aaccd54637821741eaf090cc39b14acc52ca6c46d1451d17c1139d1ea665c254572e4e33ce513bd9e389d072a7f9bb0ee4966a7292c4813fe67b57fa8b99fc49681a36b0001703003c3f3405de0e2c776da18b033484ae5d10ac8d9125082e40a1073bbf0c28bf7e4a146979a913f54e53e6e2de007e57a516bf264ccdc5106dd488bb20be7e54a6ba47c898858f26d347fa98a1d581955c5d8cb518adeb093d24167915624649d41c6b25e3bcced7e62ec93ca7340366731beba6e9a3bcf59dddf09cbb2cfeaa29850253b8a7a57953ba7e536664a67c63726f78fff27c7a69c10b0584799b96eb1f91fa5c811090be48c1ef4ab231e60805b882affaa2532824075ccecec9d1602ff4c8a5cf819a47440f6b575b2aa7244bc1d4fcc74d7e14ebc26332ef9ca035feda29d5903f1ebd2dbc233d29a97c86beceea16cb26c5253bd9486c79926d570291e73ab7e64f22ad594239751f4f18f32818612681399ed0a147b4c393db0de22d912cbd9ba4600fadd5c4f3761b46115358f5289549b76611cd40b9227bf236cd7b2b5f909dd5df7fbed39830ea4087ecfb6570f9d76aba35f6479cc3cc060924d857d67090c5a1d1d60ecae6b2643766dd6cc2bcb96a8e5985c8149edff7114f0c4dd02027ccb6f2eec561124abede3ce73b9c44c7d74a00dd59e1606ade37b7d1ebd976da49eb022a9cd8028712a2d20ae14fef6744f47f457dd2de16b4d249960a8a6ca914646de9d41f1e9e651e0a766727c6dbad1c7dfd8f8865a3b539f14c857de4f12309606f73e05c333eebc75debf17b23fa3fdbb4e8f733bf3ac2ac17925c95ac7d7a4c18024e8f8dbbe23cb78a9e3d30dee3eac87ef915ff1ce40040e2bf218cd009c204a2ebc9963066b40034c43fb457a81cbd467472e502a71777890b619f6ccf189952ae552f859083e6214e6a69c891fa9ffce49d6fd9b8771d186e70a2536433ee9758fc6fd5194b8eda1f7d650e36cfb823bcfa7a0653c5799e55da2224ae1fd97050bfeceba57748e9e04c496b9f09854cd1e8c8fdf2ea306c2446648a2a8f9922ce97a3b570eac6b0078f1ea9163c01bedd094b041a2de827a54d8271ba6827597983bd9be5f2d7bbe8604ccc5f716fb12910ca2ff4bea038c6b2be5637543c3e91e7c854620d4d970bbc4e473fcd91bc547535fe54526a4783c00243add16b1e990a2732d1e63aaa7a08b9609868f9c6aa5fa2a32c46b3e67fa27601e226a2fb9e915321423ea267773c74b2e9ae9b35bae0d75db2f9d5f2e9644b88aef0b4808dcb2a7e5edf1d6d3bbdbbca613126dbf6ea46fd44c63b0fc093ce1897049d3c379161a7a14fa63d91c0be9b5ed818844c8ed9dc81c4b49a6aef670601ec19e2411278e98270d19cb9de188132cd4cd7e9ee6c4e44ed693417ad89c56785e6eeef745497c638bbf91b470b4aefa750263d1141d87aa9f135e1aecc542a712a1f3ce9bff76f0ccb684b78889dc3fa7c46e77369ab97363f03c713b12b95cc3955c50640a47d4e67c07f429f66573fc03ec58cee88eeab2d0451121e37a656905761f40c9d4886fc1348d438667a6532ec2584c9953f3028e406444174c45c1003e1ad82345e2b560b09826cdd19fe7ba56bb8b6c2e2901eb7646cd051ad7c7ea3fcddec2db90128194e204ea2423613c9699c949eccddaf77bb2d4d0660c2c37d1d79e8927c46fb2f2b0a7399a83dd224d9b369a09d866c27d17ddad392cee25aab8389a4f1667477fdc382e95195dcd77268f5461e7839a0cd052018aed1d5d394b524a88d252767129ec6b553232d96fd88cd123b5bfabceb7b930abd63a6d14bda2ebafbda6f6814e7a6cc182c7e37396b5eb374f97c208905ec936bb89195814f9346e1b9bb56b1dd69093b68639db412ad17520b259dcd8c1a5323e97842cd68d271bfb18e46c9ebd88459d7c83a951dbcd962b46c7060da7d894e87ca215a37a57551c082c005b7e0e01b670b3eb9c2f5785a625def435a8c25cff04ae4e86a17dd4a77979abfa80f19314065a545c405db15cfe0c90fd5a840f11c2266a0b4c7cc6ebb67475fa55eb6110fb5222539a05b5f79c60cc5a94d7f2e686ab53d73fbc8314bda99afef07cb2ac97c53290d4562bb45cb6e4736f1198d5a8e8f94a0d325a3c589cd54a4c715c2a6276c730a135005faa99f130e6aff54c022d01b2db940e0ef6e21df2c48e0793c5e74a6b63f2e83b1732766aae9db2f0a7b8aedd9d9a8916113673d71ae92a5713dfad49a97c34510191af44361c8d528185f67893ac8d55f9c436efdf2453c47485941d7b5666ded89fa1cc0f9225cab8659d4df833c087e807f17fa1219c1ccaeb8716e9612446a0fa356df19c88843d5d5acc1e7f6abe4568e4cdbaa73c8055e1dbad21f9168b5f35b3577adb3307fbbda4de561c9365252d883baefd6c668271ac024a5a9de2f5bb90a791cd0069582998c8717ceb40a6c391f5a9b7a71aec4dfde39f103ff5d686404a2bf7905f9d4ae820893df0ceb554dab736e3d3d773bcb3bd427d328c38d37d0e770b72afae10209a27367ea7aef37400161e90ccca759b67f573c8b284049391ee4d4d8d1a0640d6a7e966464d4d33a51996c61c3e74d2acda62a9f5dfda4d13982ee48294030fcf2de9563753ffa7dcd80faf464779a99ceb4d0d1d777eb29f0dac749aee6d7b19c2fcbdeabc84e91184505746d18d03cad9b6160e867cc99abcc2c57f93f1b9b1e95692a45a3fc75a7cf580addac1882cf131ab10ee379b7c0e22234ba745a9406bfaae0d1a1e4ee4ce28c072ff25c5a6ed3d87e21157307c82f2ff48361c54a8fe9f9909d50aae91dbacf152baac26314fa0f64e180b880e2b6285b717552cf22b1f56533c1048a6b046fe230d80786e68a70022d0b6427399d9c6c7a3259022aea4a4f6fdc7de3b34afc19d85b98f00407ee57618c6db2a7ba9a00ad52a7d60c171018f7168c47cbfa5e511afc895456f806792aa69fb5d7f857a2ef80283d37e88288184b96b2ae00d3ed4704835c2d0e992b6a24c0c279284f9d480c3f8085e1eddae8f066e414c8df3ddec5ae795972ee11a473a45a1679d5273dd93d20553d06786e2325c25cfd6fd4ab373d448123cdb1521e9c26f3aab260192d9ee1c93c8e021fce4abef1ed762ccee92e71c5e92d77960fb856c479c32c1b0571d9c0560ad0e2324a444bef6eafe3713c0b852ad0ff5bb60dda7de28a6b5f48a5e80bcb3b2a45e9f596084971aaa86ccead4151eb4b7d8cd7005942dd2a4555ad0f17e77b49d0c27403515223918de91a4a268d0707ddea0432eed2e2a9c78d6d6c378dfa9442d904f14d6fb811db28b57da5c09a169a9f7a2316cdded16c2bf674165f021bef0766e5110d6f38315a4254e7ca3026d6865a270f91575107aa606d20805478d2e5dc741f96890d181ed8459210b262eccebf6bb0f2b9b4cc6224637d89ac84157ef0ad74affda6c47ee731655328f3618955a18f1940afac49dcb94d9b746a0c5ad4f86d142dfa9b5906cb21daad96113f3873dd06825443d1624d098e305d687c48bfb6e4e8eda47555a00921dc0218d77b3ac8533afba1123358535697965b6d20eb55665ae29f47b6fbb93893d1e74d3686ee3f0a2de05d11ff27497e7c8c54c8236961d774328ba8ebd09a7c3862ce5495ac1cbb5dbc529481845609eca2cc9784e3da52117d9b6946c925d068fbc92f68ae9de5c3e810d7be50e14d3bfa902b2d771524f44b108c2884602a925983a8791fb28a1077e2cd2626c6d805b53560a26d4d8d28e9f03326fe204c45129ea7bee6bdcaa15717acc744f530f2a0ed3a2248e72d38e4575cb4f8ec33f3467ee6c15104febe44472f940bbf7a3038217c0f35abc0c6fe4d0e64ddc577e4e35887ab8cd97d3a1410c88791da5b8afe0a3bd8570e2b5264401d0e484480ebf15af1d30c5af309bac83f3634a42665f219f543f95225e825d70d7b1fb37a545630a083feeab24b2fcd416516d33888e401c18eb2e058c8e8586ec7450a6fdfcfda03df3046f50ee8874065d32bee7ab04ef527494d46c6da403183f9db292df2e97d95075027eadfd52ea5ce8dfc8e82876097d83434d8de267c5dda69aab532d545a2122bd145eba3e5bb9b331b6c67a1c1975b1bf8682e5dacc282510116a32dd9e226ff23600f34910c7c174c90f591acc9d169c96c4da3f3b7591f2b40c584c7dc429d33455eb34e1d38139335ad408ff8c505767762488b27af431daaf44a08cbfad30820c3c767e402bc4a60be177b0529683a5cc8db34640f6694e8ab01be1d17289544eaf6b7492b2f71454bc38693109b80e8c25fff3fe17a2c76edb557401cc00fcb6c12ddb17504f94d519020b9234c9e02678766c9ef0a25c8151583950a076a957957f66e374349409b49516352a0eaa47fba79c44a2d515922db3dcfcaff86cfa6736f8f0ec2326eb5a0a8bb6dd1796b03ac074a8ed1eb6e1719344e85e8b6c1688532752eb4e5340cb6e1d62002573e4146c3517438ac79155ed6024642f66d47913df842e2765b24b81b5fbf77fd017427d8178408686c34836b93371fbf18a2ac6fad7821b8b1f9dcee8afd090c67274400fd8b482dac61ca6b65e5e76904c9812f3059f9f790bf278e359f2f41338cba4e829617c79d09c862e4c3d720b69b85e50416fd16b377044b8be08bc69766e4b15a60096cca5c88cf046055c84003db853eed7e153c59f5dbcc26e7aaa9b02b6e40475e0c5c05dbe84d025d2c92ed2f0b2b2606565dec9493adea72fbd3eb0d753921e9df8274532cef9307b37b3d51f97128e8440095986a378f3057c7594241fa44183962dbb648bef6d3810470aa897ac3bad3ebed8fb63914550be05b11e9611a8fb3950c8211d3937e96c1432817d802172cf0ca268df4beeaf1b8ecf8d1e906dc41654d8a3e616136079bfa7721d74b81e8fcaba8917716a1956b8239aed39966b668ed378a88014d95e02a268a503b25cb1ea845f159dbddb1e7266ee2158ed48ae019932c83ad258194d8ec953ea4c50d834ad10329cced6789b53fbcc5bd65f29f892c745558e08dcd47a98cb3050aa28c02ff04039904940bf1b032aa76282a571a5d104172d0de2c69b87bd2ee7ce5635dfa892c5c15090f177c8c7138a839d4b5c22c6a3045e06630f6695507904a2f4f58261c0633218b50d409bfa92d85ac726c99311f83e83f7164f238f1e547ac401bd03d39fc214430ba89ae8aff05326e8e4efae50e05dffa8f8229ca26048b83a2d5621c6d80c86722dd4cfea591e2ac1be8f921b4dd0ae8a2d28024cec64a7c38a9a2de045c54226381717eb905b1a42d38ac4c9fd23e2aaa56731f331937c74113a67d367bb37a5dfb95a15f6152b6f81d3e59a19d8de4a1323d4ea21624c1b76c63b5cb3da7b9d1b612135fba3a63cf980d12315639e98508800319b852f805322237a352a00f2ee9cc830bbe01566de5b1bc9fa257bfe4ea993a0066db65c138d3d2d809fe8f68d861be9d5a94751db4799f832be1e58d6c9d64c985fe5776923810adeabb3ec1c005fccc9e64db891a58505cc72924033b92281a41b1b856496e83f7d0fa2d671d36412fb4c8d1d5ac84d27d09b7a477da7f86f6d1085f2604d5a2686adf949697d04f0a3312cbd041438d2b4c58721a3f800bb9261143bdd7807bad5b5387e69da934a4ea8174f98b27305060200b7a669fec51b91639cf2ea55fd216c4666e5c42f6da13dcf01625064b152b2b769eeb48c238fcfa939d2fb9741abd0d88b3db52051ae345e0f814c4b9c8ef3bf9b7429ab6078895d4f2634fdddd4cf7450501cb5689fcd1e266fe5130314b2b652397bbc10d6d9aefd8aeac87ccdb7ebc7eaa1da49356ecf2f4633bc27090bbd76a0838c5bbaf1b4ccec73ae64500000215c2046337250981cc3a3eb91df95a49ef4680cbffc2bb5cab591e6221882a9cca21456bccf97ac3090917c9d7a7902ad12a9ea4e37cf17297c66803e770e5ce82472413226481d0408e8cdf79682cb9a03f2da36f5ae80d17548ea01ca922ae461546c6131689b4f6595ea0493baac51104a9e2b4a52aafd0203e18381d2aa804b99bb45484637f507fb475348c23cca44ad5e5404986aeb4e6dbcdace85bc36112d5c80a2a6180db4ab809b60e47a0a2d47baac2422e156d67293d276eccba21e09fa3f94cac1ae41c5502a18db51e8c5f8ba76b62b799e6d0a2aa406d92b2147acb1cdb366d9425ca3b08384d56147c09d3793677cb0454776ae3e74d85a65eceb4ee4597351e7a694829826daa8fd4cc11cdb3e23d3850f07314637c8c3cec0a66e6ca88e48723d0703e93de7cb3584e97918e23ae2adcaf03dcd26a60ddaa930cba20c96d8dfde951686774ab9145218fcc7376f4d11790468eb0f51b318dd2b5a21219bbb9d6d18cf031886c54fb0bfb63f2274314fb067fa4447a11920c6b9412833071ebe6376e96a7d5fd769df53421702f19e178abe2f9af5b3542c5cfe3d140116010d26844a668b0b9526b124421bc5a4e0ba88d2a5f84aeebcfdd199f7611d253d56e5e5a26c6ceddfac5d0c5d8119999f23307028248c2058389c8c7f36582d5ff4fd07c6e6acc39cd10053dd0c05b250147b648c64f5adb8de375268effd72e756bb744bb2ac6bca5ea496e0dd804289f895776d135cb862ea6b116b8e846e890869bf81793428627d80d36214c324afda99317d43f2b75c9a11cfd85e408d8cabae6a94b74cdf8194aab94a35e79e1f029400a231dfe9c6e267a7ee61ac7c5e14c3a213d2251c42412f1d1261743454a64ce510c8ff45f5d1e5d2e2459631bfbfa60224ba9ce3c2e260be16e7b0f6e802e7a5314f1f1e6b11da08525b05fdd5326cbf2f2d7660d39deef7e5e1638cd72ff548522c56c20d3328259d7599f95de98d0e99ae0ef10693a5884bbfd9d8ddeb1c09755b5864412fbc83344ac4402aeaddc8674bbfa6113a41232805fe92ee1ee5559758d6e0f49dcc04c0679006a5cf709238fd203cea8651756a122e07e005cfe26a2f1431ec0405480080928028f546f48322054a851ce42a4eaf718c80c53dfcc5025745b9ecdd14783b44b5e1697c94b18e79527ec856023e0ab6c858b4ce8127c3e88c6839af407ea4ab51d808a558b8bfb16c02c4e051f3f255e200c177c33514cff357d9146f289eca57de0b977fd115210e05a13ad48f28cb2721704b505167035e672426fa0c003b64e879a2d52685cbd95f38ecf81c53ce560155415d8caf918df78c0e1b8f9488a3ed6344edd1380ca27a278232116d213d10c75bb56df460b6461800acc14a800a3c78d64f4245b7ad9dd03c8666b0ce77d6fe3cce961d5949fb962a2dfbfcf3f8232c8f14700c53e82f6cd2272570f0f6728180cc53fcb21b3baa3f993a8628e26ab20580762f96a38c31b1cb9ae863c9d0fb0df5d876e3a3a719babb37cf731f63bfcb01653e418c7120e9e917cbe6e7f899987af5b568459299e44b312f948c2262f3c66b06be2e8f936ac63bc179d794658c7c24a2e05f71b71c049423947244008ffba41dec5960901f2430bc4554baa6225dcc5de100beda54ddc09848d50bd3b1904bda579e5a301dbee8107c98c655945dd7d126aa09576ea6dc38922988838faa9911197018726195142128201ca0d21af23cc7b11dbe5904b00dba4b5ebf32ce250bb5b10aded79501d497cd6112d57e5b98ba8941c839c74b5309414450c9062b5053f283a78348a7b9701ea1dce0971ed0a56ac9d0c95eb1e85a0344681fa4a54a33c49849d4b5c48720387d27526f11449da415c90d15c6041bfda48fa5c998667077ef05c353a8d108ed6c3505fcc99d36046246d594d60162fafb8230e72e7ebf3cf2545df23b348a42a738af67cca3bfa3059ba960eb1619b688136af979fc3df7c8804d46ea8287618287ae5b3c4564e0ba6140ea8d1090f7848e3cd801ec9d42131a1a884277b66909b0862300b9db1f2f7c593522a401b5908290d66baaf9bbcb305e245dbc33bf1eac0fa4735181f919630742c68787d9986322a5e026d93d21309055b17ad2214a5004991d62cdaa4eb5209d0f41b5cc99af318633ecc92d54cfd577499f6c4c1aa557e3662964def6969d2224014046d4343d33723d6b2fc4e262b99fbaa5beb0e62132f842c9cd8783a871173a842ba23959f9d5906c64a56ea0a05945a38ede7bcb492118ceda2e574a7b5c8aca9e5f04df010c5caeef6e0a37462d716025adb71f7194e107d0948681cdd972af1b6668de39959a39bc80967804e314bb8f6792c62d3d272d0cad9037753329a6356068f8ec64cc19bd14aa9991f6d914fe0ee53eea9521d373f2a2195139af6b283073329d235301e8641349b5c789e1477a0c72690d3c48e9c80d0516fdaa9a3b792146fb78ab48be2326684c9d98ec890b8e50776711a9de88a13d57bf3bad540cd2bf86220d7645ab9118dc1ab44c39838bf86647418746d9ccce36b622204e50eaa76a82edf346951503cd5d5e8b3c66614bc6f62ff3df8862215e9e2c264d1ed7bd160c55190b9b3332053241ea8a3dc0d38cee41ffbd39c6517a9a2391767eee87b34dfa6223a6662451ab28ee7c32d6926328adf37e3697f41ce28e9b315fcd10847f6571405be820133698da0436572c40dbba0c25060f50da124d38209d9e00a8b3fa0a7cab9a58ef546936e0861fe49bc411ff0fcbc9885c15ba7448ac23f2980eb808ed78b1bff52a289c1ab93d9fb799430da8f94020888fed6f334f715ac8f0ce47427126fc20aea4db35e392c319707d19a5164cdbded34ab91a4a522dd0d8ae1baed6deee3d130605b6ba2bb73bf3bc0adc72daf63b7444ca5af52ab84372b5578581d116fd021efbb2bfe54c37bf1be2c764b1d2ae9820655ba84b405d93496b8cec558120b8c6170013ca81fe1021f777cad2ee99743e579ce8773d54738a57dc40e5ae1fd4a4e9077c013df0c4578c551505255798725cd66e32d16aee8c543ce750d6cc8f947927b177b1ff955e910e512a14a81611c83e8e0969fd74726914f632ea655f962c6294ad4259a50519fb1c558adb4bb5b9295864924ce76b9b13a24442d514d0e7622e88b18c94150b354167fa30095a562df5aa9a63baaf3c90972738c11b58d14c7c30dc1b3e9d86bfb7e8dc71ced9d17ddddfdd5dec4c41576c93e7eb43780c50acd5fca9758da7bd648c6eb3a899112939584ee8d0e600dbf0b5e4bc659f6c0ba42d14c9d5341582d112e3e825d929abfcb9050bbe7e2415d4ecd43b24e8a478a76d09062414d29898f2411e7d79812e4498acc76691ea62055d57ececbbb8a1078615b0c111b8d161ca558ce93c9a60bcccb8b8a0608168958f0a204653623e6d81baf923e5e0cf72770d9442e3f9552b3036a103f157003e69faeacd747f260bd24e2174a5b432be054803d3e0c7d0c07034a6c549d9362b6e4ff5dc00c5e810d40af7c01de7c1c47ed9da20405da64312002caa3799a1feabf18933879e0c394f5cf3c3af956b077b6c8b52fdf526478df2d35e802c0ea5068c1b3115657628c6b04cb1a3e46fe036ce0a7ff55c4b962fbd007a9a87578b7ea6ff9eca39149bb19c93a064e38bc7832c93e198282d2ecfcd649e434feee4cf18d15f4407ff1a1694984c1d16964168a5b548a5c9d789b93d61e5074d013420908e20ca0453a219834806aac6f650caae38f59249567f9343c2a5589dd8886decf49d7e0202887b27ba77481aeb06bc5389f8f603f7fb36690309845303d719666e12ef56d99b3343871d46a1e3bfbf735cb3896b09ffbaea233df64067df709d355dc665027a8bc7e70d820543a1b2996c61d24c0be2cc72031351fc80e6f36691c0cd93571feb4afae752ca80d28a90cb30c6430fe0b67123a91545e48f11e52969c774794bda8981f1e70a5674643e9784561891023dbf66e0cdd4234a343c7bd7052ee8c345568a483697b9e24a94f4af85d8007dba5238c704461ef9212906d2da2d3a8fb782a7a5b6cc5f95a8e789493d0a7802db34a8f64d67ebad1b9a8091bcb9440b8ea7e7dc8726e2c59104dcae96cd7431af28c90219b510c4b6a5319aba2252cc3e535c300a782575231cbdc30a1dfde6644e2fc02a4d1721ca8af22f5e5fad04d3247a1dc69ad702a57d8a1dfb04f16eb1045d610177baae8f041eb6e72ee24a3dcd4c35b1a7bd11a36beee76a27f8bafabeb0bd8c0fe45278b596fb06fe7ba6b2d929ea40812522d5a1245820dc247adde667f60bc37c91abfeae88dc5e5e1f8cc6786a2c57fec4570326d8c3be78d57162db8471076bea45b2882fc653d6df72aa658497535ab5f94df0794b2ee5c5a4db87acb2b4457e768ad80e316f4994b313e421c5682a110826e9c9a22ebdf46977dba86c1b85aec2a150fc99423e8f79caf30bd68b02c18d61d3eb5870ca47b0be348f4fd1964e503b7037031f179aa5fb9a9b8fc6803fcaf20afa9fab8522ace75e2b5952a74fe9c7d6ca5e9d54b293291441fcf4879e86951906d6a18ba68ccd4538bb4aa2c11d5fea27e32bc6006330e5c408a6ff6ee53dee40c76c88b500df529012c326763088af42f4f5ac57398b3915082cf34c4d0284993cea49495c7ad07728108d9c70aaf52d62a11a699a2ec38652213e2c2b3fd4d8dc4a2cf536adffa9cfd10e69ec6ffd369d1da17460b45d0a61c43f9bdacc8b161beb4c09b5b032d2bf68394946850edb19444b3d6b8ef132983810e8053cb967adc0b285b8a95adb610c8fde24e47d67c909e80085bac1000611bae24e7fe67b3e8f524a8e53a2117ac5642a066c1250b6af190d2a0e12889dd6f364afc49247b02fb18da54050ee450cb40207dd8c6cb11980fe82583820877a2800cf70b36928267f8b1124055ac3c00c994f3af9e163922780c60a584ee948dcd25c0a46948a38b780c31f03aa56333ed2465bc498ffe3ff534af74f8057ebe59c3b85cfce68b94ca21af9d51616144655f247d181a94720003145ab6cebd891a0592d4e7895884d18959c3c1f833024bbcd6189e29b1857b0b59b1072efa08548ba671923f6f6b235656f6f739abcd7795a77eb258943dd2c2379991285f1818c46517a816a9eb10717eb5484afada0711bfc02c7229f6eec6d8387dcbbc2f6d29b32d56255c71a38c4d54d1b409a3903991228fdd7815d917c9726060eb066f46e25e3af89ea9215cb1778bdfb0ec716ee0c9818fa884cbba2d8c4c7f5dc7171212b3ee8da1161c91080c014e67bf417fbb379fe4fb9ad2458c2e6533054c48d8eac89484187100289f402f93513a18c3167b310963aacedb83efc0dde0700b4a36f6815e23c05a32c42d047a8f33ab54305e19a503f808a2d062e0f54f717eb72298b102d7294de80620ba28c3fe4e40834b918e06329687682eefeea600c3f0a3ba04b4864b6712db3b9a525a9c9e357231f83294b5cf66c9267b4bb9b794522699920c6a0a750ab40a34b08dc91447ec1449537fb3f1e54529a53897fa4751caec7f5d1c9fb33ba3eda354bc6e477f6558f95786ed183118067d2abaaeeba22fca70ac6fd72512d1abfa7096e56d1acb2e111687dffa17fd5d79ac5e19968eaa5bf9171b6157fdd196a55e10e4dc150cab5744dfdfca62300c5a1bd74bd5180c4356128cc130487de25763300caf14636885d9edd039e75c0e900863ec980324c648a974532006a2e9508c910a758cb15482d547d1e59a7a17f34acbe99c3fb169cda773524ae7e8e7b77a31966ed28b26cb8b9e246ad1f7b3ac88eabd6a8f92a51e76adb2b6aca286d020121535f5d3ed0ebea6280a3a98b5acd98ed175ebd6addb2184cecdb0b75d5314d6cbf22f9df547bb84240a95304511e7a673530cd982d016a0d818b631d9420f4541ca51f0ddf970967ad68d1c2b7ffac7ec62360748142a3e45b9f70ce7391bf963f4f83ea9eac35deadb378aa228f9d4d329b29eb6850327562227faeb125dd785bd88e53b5ed48ebef5cab3ac8c30516d995567ad530a898e5a66d163db275076b11c206d46f169c5049a13287eb5e364fafa2ba9ef1d57c33a4ea65ffe55772ea5b48a7a6c3febb89a956f1ddbf2316ab1d1e8a299ac559c3ad47c5aa959e9502a654a9952a6941eaca34ef44b85ec750c7f3253dfa46ceee553207ed99ca5e437dbb24ba958d72c948f0afd68eb54c83a29a50baba6799c4c7c497fbefbe671f1256d1e1bbfdba7fbf6dff6b151f471f454bd18f6d48f9aab597959472f7fa55e49fd28938f65b24219aa56591bfdfe2b13401198557bb42c6cec21b3de1e258753557feaf610ebfebd7b1ac440c8f83042af34886138e7637584620b3b520cd929aacd65484185f5c1362652f848d1630d601b132856d8d9a6b70a7380789b69efcec20cc70710ce6efb81f5f2fbd6fe72ad5786ed87d60dbc81df2c38eb75011481c1faa32dbc3938ae5255fef5ef8fc140c4fa9ed6cbef6a0c86d193bd499326cee33b4e6408e8876358a924a51fd1bee347384f13df7122ed45fc081edbfc5c1b087a12bee344bc88f3f811cef3c3815880fc08df7122cee33ced1aa8891fe1473811df8912c88fe81fb27e38901fe14730901fe147fc7020dff1239cc78fb042e4da8a6ea251f1a10d8a7d41b40c7313b6aab79d0bb34f2fe926aca87e4a33662e6f399703a4629f56527593e85a0be7985bc416a26872d9ed262c3b572f73c5b95ef45595030476131ce7b4aad84749ec9f8ab6e825b4bb09cb4fff555dfa2b4b5fd116c7dfd56555bd8cc47235b9786bc5399fa6a9bebf957413b79bb0d5bb4491cb5fd5dbb89a215ebef58be961967ce5fefe700ad355d48e7fb80543695be192f512be3206f49256e2f2b14546df6570be0bb5ef5fb24b5dd8c7ea255c2ff958bc7a49576e457f7f5c0f2b4ef55144e95531ad90f41246420d1144d5a0d8c8993b6524963e6cad7b492ff9e1487a897713360be825544a5c8ac215d1fd0a913fc13f16b6582377f77ae3cacb7a7fd418e57bd3441ecee489a6e19b98b975c373f69bb2d1c7ac9f662ff25bb8d00126fe0edfd60d51bd98855c6fc9eb7d1bebf5c142f71c20a2e82ff227913e11d6493f73acc8bdff3817912a8e7b6a8ad7ffba8907cfae3f61e30e15a6de9f830ef596da30e3df9abbd7dbe307917b7417551ce79e5dcc7ae700218204d6dbfaf527f6f6ff681c7f226c641efca2eb4da43f7fd7eb4fd8fe53d66264e5b37cf7d2559c6f5370114fe6d0a40dedc7c2bfed0c56ceb062a8997132f06fabc2ca6f8d86e9f6f841ca17790b170ea03f9c09e6fbe5f3cedce1a90bcbbe94c33f7e8ccfa369e4f3fb0f03115ff4364e747ff4f527acfc17918523befc254b9fd5eb03f65f7980d4efa043751da4f74ae63ffc71441edfeb05418e33895f8a8fc5bfe253b1ea507fce2b5e3286c99808f3f4093e0d16bda3ffd848bf337f1b67ca46ef2263f916d9ca9332d2bf60d9955199571e7d9a812f457f4bfdd7077b676cfbf632662dcf160e37fae66a8668b93efc9744f596a04b669a4fbfd9dbe387cb2dcc14ff6d61c2404491429815a52bee67612f1761b9c61fac553dbfa8562f5fc42211bb882a7fcb8b6a4b35cd8f4ffa211cf4c187ff5209ca8f3f58d1df1e3f58ea3192e859b2951a7f84435da2e71d57c34da6d1b476ba2725643e2d8c8c7a2ca47eb0f23167c24088e45f6f3d0f6702fd09dec998489fe053f5328f85505667c23022ac380cc33bcca1998a421d793221f3f5cc511eb1b12b1471375e823ad2fde47a287a9ac5f780ab69f146cb0102ab469d933d9411ca07d28a5a02d2caa57a17c8cc95f51072f5fcbaa9a694d84b35744bbaa78c503ed0fa764fc1e76f4d1db1d4b756338226f31e02adc6034e884683f4b1b2b87e8a3f46e866530e52c5fee9289accfbc7dc431969e7ee8fbed4111b5f9459385af4575c713e2e917a69eaa2e8874093e9aef0299f8e75d617ea5daaf39954146a897ed2509a8a3ebd7e423d650487e8aba732be9e66160b071165adc703aea67f46d06a9a14c4beee1f57e37e3a8a56e3a28882510c63961f9f5aa20159f7b74703a2a88a232996235925632f9251eced273fae8683b8285a0dbba0c9bccb40b49fb81a0f4420cb2f7af893fe954908d15e58a27ab10b5aa38283b81a083c6940363e907def016a89f857a596983189f7b2a7699698933a52c5ac9f34947ed24fa82518066cd18408bb2612855e268d4f238b23b916277ad75d1b0d97bf6e65f49873e19a0707b150d3b475d3eeca5c7c2bfd9cd27d741f79340d5094cee41ccb218e26f90c00e74c3ba449c8b22bb97ad9b173ce39e75c741c7380346ca682e3dc026220fa250fb9fecb42b259c8c2f8d1aa381d638ccfb22a8c3146f7c3c98c86e96f84f90bad0e7fdf0e3c7c371affeeb9d1c868d477fcc39962fe03e05c3f03b5942c2459c8c68b6300be85eb213a179f3a177b084013e120860163de5bcf550e6220eb2e0064f46bb6f25936facfb0e72173f91d32d1eb90b53c4c467a53c6f2eecae6bb70c1e3b5a82fccf54552cf2fdf5a8d0fae5f38a86513b272be94ced28ad31f5f5a2cad96596d353e74e52086f1e22cf52fdf0fd9392b5d5a9ee52741cbcf92b5f662256bed05ff28e3f6821fcbbabde01765de5ef4c7c791d5baea6d513888818856e5201e1c44290bcdce3e463e0ef2216b31af768972133c6446347380bc79cdf9e6c54358c83567bd3cc4e7cf36b38b7578c8756a290bc13e46c84278486cecdb1523eb44e6b9321c3aeabe9e752edeb9e2a8e25c4f57580803111f76935648432cacb2c5ebe9d5b4b290cbb4f2ae0663794b8787f0103b1fa3d853cac2cdf2d72dfdeabd99c5e226b08c857ccc959d9e85b00e36c258c89c95e78565cdf295224959f497a89a28ccd5bc8b2c24bebbde2fc84258080be1211ff3cf4246bcb2b3d2359cd428d20264df4ffa357830513f2c9524d71a38b0764cdb168e15d87050a348d35837b0b26eb8a92765a28719f5335b7996ac7a081f8f93810f27848de190f11fcfac3c5d6fc9de39dd9c3578660d232ec3b11acb9ccf5c83a767b2d4c081eb6ea951c4c2efaed0ea86ddddeead6f5851394028f85cc388bdd4c3ac6776dd728d9e0a36cb7cca718d2296f2aaaaaaca551cf87d7bc892aaaaaa1eb294dd5a4df5c4c944075453cb535f61462e1717ff02e1c3e7ef1a3c0c047cae356e8d22b6fa95ccc2b162bd68a58a317e74516fa9458cf0a9fef0dffb67e9b07484c056d67f46ea5949076571bc62925482793d483a0c80849329cdf26acaf15e39406a2298e86ffdafbfddf8b773cc3cf0ddfb74f35eedeaffde7bef357ccf7c1061df63fb685ac67da394dae7fe322a07ecfd751cce49ec0bd84d3baf3f5c8702aa54a9f2effb5f15815b1cb742e802cf9549d8db83f678cc2ca9237df2964e1d89ef5d6d0c03be6794112b7b9c5a8261f84ffffcfc2c51c23e4b7aa7775aa765e0549c8a53712b7cc8d1e0c46c0f23358d1b1279888cdd2cb7738e2dafcd3316e23c7233e99d9681483a9955effaa7cc6e641575d9bc321ccd5e3f1d950f70ffab5eef7fd53b6dba59573531a0d9eb71347b5553f538d7c3afaa00548099725c0fffaab24f39d6a6d9caaab771fc3996ca7a94acac2d677247f9d119b2a333812610f5f353bd833e4e2673eb52ca8cd2a6941e234958477f7ca4cf18a69429650c3fb1a1109888b7371250a13e452ae40efdf97bddd3dd975c0d7d5841a9c4c9b877199f9dc17f19c3e87f19ac97f93b63dee1dec7bad213eb9e95b89a52cbb82f29b1ee7d0ad6180da24153b0fee6d23da11a7261b69340469f38da27a34fec23bef7b1ee68311806d7981f9c0f61fda5ae01e28120418204b1d182b711830dc0ef9e04a43afe1b48c4cde1acf5e90d61186c72e609ad51be05a65ec0ee6701c3a1fed9fb967ed3c469d1c79915bf5974523506a904432ac1b42df89b410506ff92603c0b18db8f39fd3023a369bcfa180c63d6f9353ee687180c8363dc57a3743b591ed1a3c3cc3a5c9b4bc133f28b825de6612891a2f3bdf8919f8d7b3d4918e949c248f391c2df9b428f0b187cee9e248c1cf131028587a74812468ef84c2913e83d9e9e223c459298526694d898e7d228a58b18f348ca3d534a0f18668bb9eec7ba672297796c2c626365f97336652bd6e653c4f93e56f62a306735ab050c47fe9b8fa2936346dfbf6fd68c14bff86e65a5418e63ed9fac9fe826fdd34f34691ad83c4ed1ac473a64f97db82a55bc0b187cee9fe96837699acbae058cf9df47244d23957013fcc3f6d2208691c3440b3ad735c1469aa631d14210eb9e8f3012da2c4981d8773cebc355a942c45e36e2e227bad37141c5fab77f4ab7c446a28c551aa1410cc3dd0fe586268634011fc2772d0a0b81cf63088ff71e8fa611c2431c7c3cdc674a8cfe1afda4f1a708bef7de73cf83752a0fa99eff5dfaaf5e1ee257befbf651f4d67cbed7bf77ce5ab112d5dba2b8776b551c59ad874e424b561cf7cf5a95855c55baf7fcc69458367a08a91b652b2f33d8ac1bd6db34cdd8ae64de32147b2b9bd44a19f993e9d30ccb64cb60a4120c112ec76a0b0ed3bd26fe84b3b0d6b06e867555469f1c6d973eac578675f323fc86fdf0636beffe6e67c56933fea535d6ebcfba8f417fd28ae3ffecac31bafe687b5d460c8601e1ab6c1acec8808eba97c16f32a0bff7fc41e71c7ce7e0730e66b25e6f3d2b7d9b86f1a5cca88c2fe7d36cc29b59513202a9ee3277732cf4e7ee722a9e5a509264a424c968341a2161252b2bf5f6a0499228e1a1992bc3c224489228191a25513242c24958090f7192c6496243e2c4c66f489ad8f80d09921f1bbf2169c2c66f4894f4295e5662efcaf3a5c449af7a517bebcdb0f03da9de190be1fbd1a85eb7573e7c160114815575c6ba2befbd57d1e856cfc6e7240c045671aa17e57856543909c3e0ea554ea2c4424ee25e5d24aafcd945e016879f7aeaa3122c31c2c73a6631c6883d24c2c2c882e3bde8a757ef132b41fa973552952d83510b7b9b9ea20ccbbc4fd5b364b265aaeafbb164a4e7ac12bd27b1485209e6297ca8248992249d83f5480c3dfe8c7812aea78b381eeb884cebdf43ea8894fee5afc44ad4e85a81a5fa52d52be535c4b764adc98cbe610f474f1a3dcbe8faf72bf1c7b3f2bd77b544efa938923fa2f547df91d05571462f471527feb3f2d53a1a413a1a8d462347e4492c2b4f1079c206468ece08b7e38c70449e18392346ce0847e40967c468d4ac11352deffe5d4d4b1dc2c9b86ff951bd259787f5a592ea952eb53919f82cb5a5aefc7c916359796af4d5bf7a63ec1011e2b8d8b6eaaf21dcb3d42b4b31f679cbbca792641f8c7d6ffe133d965dcf41dc951773a21765d7e98797cdc87035b265f831e9883823569ab464ba8f2f0bc7c25dd154acb715d6bdf690a4e450ab59f92b5dfe962cac97c22749d2cb6fc15a5ebe4bd69a8cac0d7e4b46caa85fc95a938155004560b4fe78d6fffe78d123f64f561cecfd29cca9e94f451f9ae2de433de478da9555c9ce7032ee63bd3f5e4f1162205a4fe9a19ed2432dd4403da5871c4f4f69a0290cc39f044ec6bdaceac5ee0ceb7e62a51286f1308f93918d06dfb7d1d5fb96c25e7b8d8a4f0277094005d85beae3a8de5249545fbdd855af949622817c39b1b00e3a086f54cf56a4242525f5b162ed05cc46d65de62995fe4fd6cd58fe3b635d0ff514fe7939a25e19120a120a120a120a120ae20124d4a2dc06c4127900f10812e21124c40388479050108fa039ca58de9aa20c56d925c187855fe1a8b4156ce1908dcf83812a0bf529be876fd57a59e806db0ad62bbf7d6b35a3bfd747f85413b290053e7cf7c3599959ef0f8765ad65669df3af14401198ac3da895f3392bf9ddca8ad3f19b3f0751cfc6277aecf5c18a926cfc8a7b580f34185b91ecedc124eb15a7aa28f557a6c4cacacf7a49363e96ad3cccac87580446cff2ceba8931be8d9b908a32f8518995b7e919a995c1af20307a96c7b2951765d6cf2a8bcf16aca3487db370505f55d925d9ea59322b937daa7e25a32d533d5b37a8af7e3265c946bf9215c1041332be12d8c7ec669479cbf05b192dc17c8c123a6f03ab58cbb0509050905090509050d08f964ca6333276788c99183262ccc49011c3fdf42c60cf624d23c3d2f8c7f7695d4f65f2e78cd55938e87543c66fd60d5ad95a19955d195b37e4533fb971bbcb7ada24c5487d621931285347729c0b466c0bdb987061889d8ebe1e2fe2789a8875b7b1ee58af3ce4cdfbea8f7ed60db6d6c7f6323e15a997a9eaf548d197adc977db2aceac4dca7afd59a72acefb96e3551cf8cfb6ae9e851de337ac4fced56c62feccb0235b583940ad571cbec1300d6b625ac6b1901d35d45f6a634ccbb81bae598c9187340dfc266c9c5b37cc42e090e94dc33a4278c88e69ad1bb769696f4ccc080b9873ce954ad601a936ee0d11c2303ce745587d38fb5efba9faa20195ef512078e50091d56575f5d75320eb9292ba4bbe6549f8de494b5279c96faead2ed1201a4483681014cde57bef399c1bdf9f08cbefdbe5f7324247555f5129a59452caea7f34cefc7649497f46a964f5e1ae39bf256d5a45f8bead7692fef55646ab83e0ad6fb569f5b4befb9951b25edb62dae2b804f5a6bb7b3b7cf74440f7e93f6dfa7a2d299a0324ce9f693f3855b462a43f4361443cfd2b7aaade1fd76aac5e10e4fc95b53e59f5d2faa3a9efafb2180c8392b15e2be23707510e9047a93c3a4485a8100da241a31c20ad43812895918f9e028de8d0685e2ad443443d64f4d7e988326c527f1f66e768cec74a348806d1201a4483240f4625f573ce1c20f1452b706ef5b055ee2fca8f0f7a453d29f1e714bdcfd9667c5186737db3ec237791bf288e2ed1579463ac73bb082b1a89aa63a3d19b8f61d57bd0e8f3df5f994567bd1525618cd99402eb94927371cc220b2b00db9850f1c452f16339d64fa65635e5a02feda5f4af7a85b056651c79e1533915c338f83be79c7bce39e79e0ffeb1fcce55f2537eef4c8fdb8148f76d92fca6c86f82dc6d5fe69cbf7b771eb4bffbbbfc6692cd4efd8d7fe1dfcc44f59ba209f69bbc5972cbd8b28fac71bff75e95efda0e586545b517eedd3f21acbffd95ef2f330e6febeccd5d7702f6bd6f4dc37fa56cf95d258d4603beac57f64f297380b5953ad8e2c80fd85811c00fe40471e884c8c56f2f0c18bf6c62b01f78ab79bb75e33893ff046b7fe563e76eed78ef2fdf2b25849572c7634b007b5580c5674980283431d858618d695732ab9fb469e6578f150023596f0294c5748ace39216d4df36cf5cebaa948d6fa69b22c0562adbff7fa363593d71b95e5f6c2bde9aa37dc5fb7f05db336ceca7c0081f227cbf9cfd2117fd62b7a6fed85f5adbdb87e66a27af9ce7f0f65d3bc7f7b2bbbf3ef7cea29ebc6fc7e5ae1c86ad211df3f567f7f985dceb1f809c13560577e13db4eb4008aed8ec28bd846c18d4fdbdd12001f086b8fb91af8fd5202187c2a600d8a2243f6f27080e7dc00f86773cdcdaf06c239ce3594d9d2861ea0b44c01024b102a2f9c94e8210bb7fddcd64486bd27cbff6e5d7b2166b81ab7d11e6b1a0358fec62ff94bfcd2368b9f980d0458fbc9c2891dd9f623072a6cfbb19207cbdc9e5b4da9c9f0b737b51a9b96e1a7fed6684d6c7362db0be16aa46bed17d034ee5b9f2e006ee08fb280dd92e512ccc7344ded31c33e2380891e211d3c618a2bdc50829d335039b204305049821620172043a14414059512cb504541a594be0463e3621f8147804cfa6dfac4801f1c0be8133f3f5feefef605dbd37614b6bbfb674a7de226a365f86136f33025378282ddf663f96d16d0346df9191044d3dcf6e3f6c6d89e61fbdb605b86ed2ae460fb65ff589bb6e952d7481bfcdf35ed87bff50b016bb631a9e28835d9c6a48a2e58681b932aa8606fc9b627b22b28cc2705d6bec53927c3dcb46f4eba75e3ef4118a3941445393b725319a9e6a4d46a587bd138f34b7a17b1ed5b8f6ddf78da8b8b7246e486c7b6175938dcbe9df6a2fd1451ce30eba68d1af3af28c15cb5e9365ab16e562ce798857246b26e943461dbb7583748ac8b0bbbbccb94035afeb65c2f059e8f6d2c24524b8b8b75d3faf4d2f2f2f2426259797919612f2f2fa297cb7a79a1b3a2647c7981cf5d73f3e1e2bf3163b95671983525cb9524038cf6a925148c9deee036a254c2c03f764b509cc01dc37048247bb12323905204edaeb4adde0e58f72f076671aeb46c833fc7998d6036b56fd674836d5bb658e36776156b9be35804aee635991158f7aed97819db68d60ee99a5f703a817b05dc1b03c140308cebbe5b070a6c5bcb3bdae2b87681f3e6da7b6bad55ef16b8b77bbfe3f8f3e71ee5bd0b76ce9d3be79c73ce3d18deb3bb51039640d2a7662fff7b5833ec3ded9393fae4589ffc52eba5126d8c04afc7a1fb73ec1435763737bc6236c7390464c02cbc1042c8af0bb6f5a0897f1f95b5f75e7edb1b33afccf1a38ddf0db3fce6abecfb7eef7d6a99f520d9c75da01ebe6c35f263cc1a26b2389cc96c4e86cf0f6b4b12b0ebd6bde62a7e1ffffb7e9c57659f9afa426d34ef2f7feb130f52301c7e6f3fdc3219a4c4b0190590c95a946a587f890d9114239148561c48926235463a4ff8a08613b06143c9844718e1eb9682be9b61082c60a0f40814232d29839bc3132023744b119e40d96850ff9e6a34aa7fdf604c38614422da5630424b45f8e27b104688cda0074e2282ef50ecbd962ad2d217d603605d07eb584bab1182d468c02741114290c0d5f0c083946d61fda1bd700f4b2f2846725f83bf57399c7105d5c3b651e4c3c2776ace3bed7b0f818537d47f55dbbb082c7ccf51397ccd9b9004a6ea81922aaaf0c2a4e4ccc5acbf272c1365cdf598895760f2af5b27ad8cb658611eb0f119b3f1298a87999625a45842ce58af557b0f60aa2490f620b214a10c10c658a593f207dd469630f3e20425a4222871862a1ae1794565474a2b96fe347367c029a10c824949fa1356ef694684cdb8ea9d315a9955bd2f84ab2155965269a5d621a4a4a1e2108fca9ebc955004ad57dfb9fac1c18350ec3dc6a209596f43d66d0382407313ca54acf310033115d69f9fb826aea67aafad84b110d23b8ec25cec1dd83bdcc4de522b8180b35155067232ee454828f110c5488c85ef30d1612c3cc863c113c2638333bb940723739352ba8184549c8f7577db5ddd076bb1ee884bc2157144dc10ebae08ebdf59748dfb692caac3c2c536b89fe97efe74b2d7fdccd8eb7e6c63612f86858b85d5e9b02ce186389f2e0212e703a94023107209831042f8de7a940efb6115c1b3dea7b7862ebc1dea8a35b83869542ce145a8c4b3035f59027b4163e11e62d7dffd61bdef3d1caf181446701b3cd9683c1d6d636ded05e7c808dbb16086b27583f5bf9365e607212451acd1785f5a41c9d5c43424f529c60698f729c6f6c9d957bdbd70eb27b0afb5537c0d32bf210c416708987fb324b9c14f692486d20a5e637f6666e6667e8f04f3de37f93ecaf7cdbabfe7ef555abda578afab934a30dced48bcf79e6c01f6228c5404e260842fbe577f380b2174d69d0c5cc6b52d815435219cd55343587ff6870fbe079f6322adc8c7ba9f9492484fa7d1c0f7eb46b0feee737b50920b28468a7f5b58e73e8d8a75efa875b363f9e78a0fb642048cebd580fb587ece2889c508c90bd87d3ddc970fae624d399cd580a59eb4176e87ebd8fb7a32fbea45054b0fc67f2b23d619c1deca08c548bd13c51856b0635de4a306521440a712122d8b49229560bff760c348654cb8fc17dfbbe8ee50a475d3ef482598eef604140e85f8902da9c42fdd87fb60120c9348303014098654c29a06def7fe54c684bfb4ac1c2f5a37f2a115448e7599c32bceab9894d414a4120c77c37e3c78026484dbd400f4822fa8c1b630015449b1841440fc24073f2b4bb88d0c8d0ac982364523c30b4fa3626261c90d1a153f8f87b0b095302af358058bb159d87bf5beaf7e62d1d2e12f2bb47460c07e4549eac7e3a14a952a56be6d96aca6fe5845f02cac38af6255ceb82a151577f7fb1e0cde8b2c3e3a9e0f3b010a4e783e15959e35c4c09a36c9f695cddcfc6aed857f0f927db04acca5c430ac51dc24c55a1389ec3d3d0b2ba9bd70dfe203d207d84a8a7177185a76aa1febbfa204f3ef5b61a1fa896ea89e506161868484eaa781c18916543f2d3b2e0bd1c54a55d3fa781dc4441fbf1b8deb639f68fc6f278865a2eccababd786f65de5ebca7f37df59e8a39dc3a29a3f5870fc6f8a8eb740feb58ff91d065245827ce815dc048ccb8048175a21360a0c23ad6bbe706940af4b1fe2b4930bf100ad6a18f4c012c82857f211460ecab947c80edc524853edcf3c408f4a1549c0e804e2f06c67a35e3f48619947cfb6690a220e9a9859329483839c91e855c2102e66fe3faad97accbf95786f5ffa16b18c063c6130ce0e16adc6c22ab7a2556ba8d0aeb2cac3348516acc5849420a46c8199683b814fefefca13f7ff8fcfde5f05aa50a23f1e6246a1d9e1c0bccfde46475a7d110c93a07c8e75e1280144b4851b2de2725d15ffc9751ef37107bcf41da64decf2a6b3bb3d94eef453eace77856b29d8f5bbbabaa1555ef8cf586c0facbca8ac0c166e5a8ac3b8cf13de8ef30f8d7b8df73e68308eb2df3c1b2625262587c979e615960ee486fc0fcf92fc9b627d6abb7454981b1a4186d522c21c512de6e03d2c37f4d7cd0f348a42bbf6bdedf93605680f95f9275afc2bc93d4bae12cac520c18cf384bebf506d64debd395360d238d19ccb38ffbf1a1fead01b3a546e372b36e1e83c9da4e1b3d7cb33e70b3f220607ad1d6340e731455992a49cdf9524a2ac2222a2bfe2512322d242c8ab981629919afb86192660bfd7f9ba678e5dbba51a287af6e5858be5937d95fd90de96306d93047b4878cb17032f0f989cb439707009599123dfcece149cbc087f0e1bf29d930e513cb549402cbdb3465ddacfc9c2bb639118320d84b0900b060d8dbb485848bb769919016900d18b4cd891814611bdbf93466d6bf5838dac25859c064730a98b7e9f912c494b1fdcb9a2d68c5ac1b12c502b32800dc3627863821bd4d4f1734cbe2f3b062ddb0c038acc444294c171a33d157d64ae52bfa045f94fda00560649b133150123375a000c8d84600321e7232f063b2e6645ebe590cd4271960598b7583ad1200f8a903fd2cfe0ed98b75835506ea79993ed098413760d23626572861af8c2dd5038dd96807eb868132b6a38c857880c50780c9bac1d6c5cf1d7cd02263eb830e960fb62d7ef24063167b80c58f1f4b19db9315eb5303c631960fb6a59fadba9a05ed05fc6f79468e18b1f0e70e34c222da0bf82d6bc078a84ff0e1ef60dd68cb402cd427f88f05ace5f9e508f624d1c3d68d6ae7cf2aa3b266a5751379d8e1a9df81871daa29c77cea67a52aea7aeaf99d0ecfd6e930afbfae1a001a65b46ee2941917e913fc0cdaeb679c3f7ba055467d55796bcecd0a93b53565cdbac89a6dd1ec0b7c0064cd864bf60187df925d4849cdae64cd625fc92a635b6a342e11b5e65bd6ad5e9aaa69ca8155d5e84d2391754d1f40ac893ef5d4acb0aa9a72544fd9748561b4cae877114d439f9fc5ba29351aa5f6e2a5df7472521425fa6bfdbdfe563f45d65545a65a502b7b69c09a1342aeb0b76760e18d26075b7941324b279f7a4a66d4cf2679ce7a4760abf854f5da3b3af48d3578fbd8fed9f2f2e55fbebdbc54fe71d969c95cfee5a7b36e5e9c89d4604d73f9c752d134cd56b0fdfca4691a133010b1fd0ca56932b61cc5f633943edd583f62717979a497ccc5a5c5c55d5cfea5e55f5c5c5cded4e2e22ffe2dff92b1e5d1270bf4a93f0821624e367d5a409fbaa50c1809a3d2a66948dfbf80a661f97e0634cdcaf707d134a3ef17a269b0ef9740d388be9f47d35cdf6f81a6b1be7f085753fafe1fba6603f4fb4bae86833899fe2bc3f2f4a98b6cc0d5b011c73f5e2f3664bbe5bbe5fbe5d9b6a5e3c5bed43b0297b7712e190fe9534be59dca444859ebf4a99f25eb217dea5fc97e9435917e51ffd56f659d449ffa4b591b7132fd34632a195b9131948ca9e028465c0d5fd1fce36a18a88be02c6c1be987fc63fb557e5205ebefe7214db3c344ba06ebe7241a0d0ed2efede3d2d4889de6240806a29fffe46a82684e4eeed49c9c5c75b2621b145420d98161f0372741748d0f1218a2070980864e1cc47bbe8083e6043ef94213f636212a57d8dbb2e0224e4d737fa669ee0e969fa94062572c57e1e49c733b3010cd4a4088209a13176648831165584111234fb08115a1640a54e818018a1776e27b4d4ae73c4ef99e94523ef94fbef7de7befbdf72084104208638cf067b618987cf6c650046ef94d39b8c7f21476267abbbb4ddffe1cb85b6e2d7a89badffbbd35f58efad7b73ff0a8e783ab0421a5bcfd3fd846c6e0bf9f6da00244158ef063e365cd467f0d06822d7fc9d5d46832fc7c6bf45facd4625b142c3862bb5ecc470d1002147b6b8cb03e99746cffad619bb4a0c7baafd1355810fe050861810de8582e51692a5ec8420d5bc4eb61a231e98211f64213f6fe6d5658b671db150d188293ac014a60913540892c9a068a29ac60a5e587691aae82e52ff0587662b98a4987b3fd389cedda80213ce953b339d6a66fbc9f05a0020cb30be813dbd41a7d621f356009227d6ab686e52ad0008425082188064357d8e0390c91010a2c3ca148902136da08c307530065666666e641695edb10f6ed60be5601779052dffe87a6815f1ac280ac10ad460827d35f6a32a361edc6d8f633ad6686b61acc5119095aa67f2801e37e219eb88f0d2d1d4f0706acfb917246cec838e39ca4a6c0f8b1fee6baddb763e7ff70dcfde087858a5acd8c6c332fd4f2538c549a99218308314c814194294534a18402e89cc1064338021a7e88e854465c549899312363c6d5d0e61e1804c852a0f41443c2689b9131a3c68db13c05288210032054c1840c98b071319b5304291409c28113514882848d9c2254a444718624a8c041156cdc192ab014b0d042052a5c01064c104214a64049d48511ec3b42d9f096adf7770feb4872c02eb55d6a4ffc96a2a47d6af938b26254845edd7f0183e98a44df367ba96dd928577fb0fcb6db0a22c7bafb1e24fbaab42e33e5700ff263bdfef0510ab3b91d33574d39e9dd1fed6defcdbfabcf07e18b2e1dd515bbf7e6b8a2649c97eb6ed983f9d73976ef4eed4563777f9f1e639d8b8fd25de9fd2ec3fa24ffbabfd2653c48c1a475cf38ae4a8f42bb3c7eafb5d7321325236ccdbdb9736fddcdb52a6c7c475d0dec0ff86c9da5e3c5c27a4760a3bf7bcec555cec908dd5154455155d8f753626eddb4736ef2e7dc6584fdde73fe2e73f7eedc73d73025b4b48b9b83757730e6ba23b05e231c2053ddd745f85c4b49496965d38898d97d73decef96377e7dc39e7deb9b716e3ba23d8e19ae29785e7f720f40761f5a68a92d11d3abbd6ae88bf0cacb157117e840d61eccc545192bdd9f67bf8cd568eeaa753cf4eaf66fe3bb54c0c16b0bf31a42760fd336e67d08035dba0a721b615325af7d2f2fac08039db9878810c7652937af6a860ed9f0a338d4665ddcff822a4d7bd404b27a57c9c5d370708f04524b07b8bc4ad3d39193e0206d32777bf3fa64f0eb36ca74be7f88665d61ccef8574ac991b317845d927539dc6bd65e38ebdb0bf74f08bb24189817d61fb3e1fc5521487b37b57bdd6ca26484ee5c3be7bcfa8ec9fed839d1e87bad392923747ecdb17bded1fa9df26ece91ec86e0b798c9923e2bb0f6d3c51c5557cf62bd99b36ef8bbc64100dbfdaddd3784ef26d71a02b1ce1f6592ed4db1bde9b566eb321f406cb70f67217c6776af8372d0dd59392a6bedc03163bbfeabced089f9c43045ca3138e8e037f82efc97f39891ccf9ed67a42c68c292192bd06cd08a82f9cd864d4fb62527e39e720728b90138ec95019b8f63bee408344b02f3e118e27c8a728bc20d0258ea6d5a561f5c859ad915c2ca9f15f5183dc2e8103ab5c34a8ad1083376931a03c5c48035fb166d4d43b167ddc49c679347c8593f57f14d547c938c6feae8ceafc3a23333f5e7046936a67bd7d60d02d8f86ee5a822fce8168e99589fcbaed630df1830f71b906334c164c09d261030c01f7e031a0842c083851567bebfb769f9f1a7e89d017b2f048eeae5cfec52dfa3b2f3275b3aa2a5a62001092741b4294840820a765695a5ac1df21dacaa87d59d4f559969c28a81f8957fa3c94dcf24e19b22ac66e603888d55e4f830be4dcb8fcec6afded558d5cb94bc6c23c724668b3980a91f07f4e9b78799293ab7699a2a13e56f92ce11b633846fd36e6920870a12b4fac0c22eeb4fdf15309afdc06a404e7303b8adc91374ec0f67a18e4682e407396070c2061698a149cf02e8b7d5801ceb2fad0cb405d04e820501ac21e06189fb16f380744e6cb78244297dac69aea7367de1bf2b33417abdec5a4f992cfaa649df54d13751f46af6f90062e195f970163ecd207c43180e7dc7917ffd63b32e05b202ae628389f744543674bc082061c37db378b47032050948389982041e1bee8d01a3efde148c3e0e7d6f7f3dbddead9b8bca5e6662ea5dd7f514f534bbf36fc54fff65a649bda9a2de04a93731f5aecc07106bb17d56a859a8e4cb174c9bd829443310000000027315002030100c8784c30189a80a26f51400118caa5060461588e32887614a19638831060c011001019011daa4019cfec2b25db599508915818aebe07b478a4d07421aabe3004a299cadfecab867b531b92ec46e6e358cd3b07b68ca4f4f0fca2426b53a863107765629a9fac1e0e324b22e991696c8ae1977498a9b3e615ce2baf94cfffc9c4db5e12c98cf70f6a7a51d78fd492191e7dca543d02860a989e455c503209a40ce3623b415000c2c74a7b8ca2728392a301218a97bde0151a973a41509a0c262e624e5a32644fcb4f2b89e794357558dcc0fd346a2048325bd6102a916bf653c30bd1fbad41535e879e0bea4af6ead2d5950a52bac6894fcc87d7388535d39840fbe7584eebabcaabaebf78b051038e07ae204998cb3f73fb8c44d484eb494bca76233627113390bf27f9e82086d404422c957dbadcca081e2d66e2b2a2df4c55234584cc93e72ea922f4bd481f6ff165e5d7d10b90b5632eb71895e8ff7210b602958ee97d0523d5d542f2633f9c0ac240f7cf84582ca7f092209f83ac3a86d0914c3be4c485263edc8347348a3d81115eef44e6c7a354e3a2807214ccf1f9bf6d53c01f2f982952bb869c6d019a73739c98e5e36b9d6db87319ea4b5ede49804f2aaa391fa8dd9f53fe98fa4bb5bb5b5fd3bd90cfc10ced3a7d8a9e719876bc1f9dc1f6aa6dacdc36c596ed4f138500a6ec9967f8f54c35d490989c799471aa158acf157492119024d2287bb3474eb8c4cd47e7d6e421d0c58206b6281386c1a52b121bb6089b3781e483922de78f71d51e9a7c880e978a550fdbf71e3ea60eadd0f2d3b7408d9d27ef6680fb6748626552d054cfc784f50bb720ba69821d7e631e1aac50099fa404708dbd35047d695dd8b716e07c280f3392a0ccc6a0bfee0e7bb3cc216857898a31ac056ec370d2cfd3490f4870e42fa11bff079070f0b639d0852aa032395dbcab695d36c83345540560be43aa2a6a9965cfd01602ccbd4bd3838b152fa238207b078dbed55e7704865628592a5c40369f2c8fa359036ac0e03ebfdd311c627e9a9bb8ea265269aa1be32091b5b9428932a81ca4fcad6b0e43770b85042fdbb14a385849fe947ba12db5c689c21254efe86c1b0d0e1032ef8886d917512bf5328e08f3f6d0003ce784ab43f095753663fd77854aaa4f0a78d1c6a00922181e065cf004392799434bf0d97b3c9aa1b91c3945c20cb3d2ca116741470ac19a25cb5bdf21ac54cea988f92417efbd36bf41c559cf17e2c15f96eca61e9e504befadc4c7c71a333e0dd5da2ee40ff4529a569685e669c9051ac3d50811645f105c1749e7fc9e3abdaf82c93fdb8d80dd83975316f00464d521a7b4da487baf6b274c16b156dbc01d7276b2e2de521b3f05cc899845d5046a75e2d18cf60aa438f1e16013e19770bcf5a943c667216c8c13378afdda36cd58f23d775e4e3c0e5c307e63b625713785e3bdf53655cb8ada1f92d5411f78fd3d85964cae332a5ae88a765c625a2fd649d5d602f93fa7e71c3d3a81183a03e3a6add5049191bb0cc6a991aeef01e2ef8022249aeb9d4268477f7a001223473ea2651d2bbfb79371304f8c061974c7168b3634494741ede3fc9c9849234b52c11d8fe2e5f590bbbac0c343279fb3e0e15482ffccc6980dcd1906c00ea8bdf051ff84798cedb4ac8950499f51ff908901774204603dff911877ba1177f57fc73748ddf23df045a70a0c2e7252e92eea42b8963e52cba41e7db85a33c9ff33ae3c0fef0ab5d9e4102d3d9cd8bb8346bb51beda3c7eaeca540fe0dbc533bd0ffa7cd65d4aaa4a74a99a94a95eb1b24692afb945fa9b8ca25ade7d984e480d3291cad2405bbc28dca050d47a34a921c2956cc36bc0647e954f22352bb1d4799b25ee1e547242e560b4781a3f4d8e169043b8ab2ce5d0b38ef122f34e64997b7ac484fc922507a82ff42c156d44ab7bffc71183821192fd7a2ff79a5180ee65bf5d18ea33bd5141c5a7f8064ce2f6e8f5a14b560dbd711873d2010170945bf2bfe9fe1561ae4d9e6e53df1c472539e65317f72a84358328d846826644241dc4b46aa68b42f00910d905f7ae0ef195f34ec13636258b264e618b8d0e0b58f00f686af4ea8af0e1248159035592625dd1a3805f429788b32f412aa35b90c2caae9a2687a4652da9f3a4e4217b93db098a919c28f9f658b8595f210e32b7383fe7ed0b13e5e4e4e8c3ec2c14165c2be524695244bfef1fab58304115972093d2ef13191c60fe00a200172c5c50b3ec6585efdaa8552dff6094582ad1983e1c3f1dde885cf1dc8a87c5c86c4dfc60219e2372c7528832d48d728223645a97336a0429215754cea391603f04205d3e3074914864c1758ead8eedf2c76f4fb7e8b913ac7d1451e9523f5abda93246e3f6edea7460249313869536061ac32c6362e0fc0205ab5900f1fa58f91b7cc9a190d3f770e33d0d3dc212c33cbd6709d539d10578f39e9ae609a8043a9c041bbf82c7635502c03432d393c318beefc423639f53d977f275c519a0e55b714923202d2f047d048b0ab803fc22704eeffbe21ae396d6d5ca1de9cbcb135df728338ab2b35303e8aafb5e26a1a8ea99c00e3d3bd22c10c8600907c39bd9c4d443809c13a875dff54f859999aeceb0c753769e285062d876d124390a34af2b86e782e0d7d8175916c91a87d3948d68d6dbaf7544242aa29447b0d0aeb138cb78c8ff28ac4bc9b420d01e8104ac5775474b7da3b4a6fb3d064ec4569f6b09f8bd0cfd65b41f682420044551e5d13a8b1a35798f71a3c41455528852065ae06f882ee2b5024c759475ad31943e96902bc5374d16c0434e32b4a574b38ab0af9cf694065f5fb3508f127006c9edb84ab63e42a8884a0a5c21f853cd07d9fd32b0d1d9ab4851a00f2bde3a60bc2217c0cecde13c4a53c5cb5145b4a5cebd68a7dcd66e8c174dcfb35f60538b11adec6e3c81202480c211239ecbd1083a1c7e514a6efab10d3421afcf0aeb6650be907ef6a2486fc483d491e3e8f40dd07341b0f1e7f1724f1a366b22f4d9592ad45d7fab18376caa45d8b86278da15e1b2adc1a1fa64f6b9b3dcb3c3df966c7effb211f89a648c49874576e284795de1d98c93f5ee8d2510b5ee8f4a66b1cdf4d2dfd8d17b97c0525bc242fd2b004628ba2da234a74ee8712ce5be4aaf23e88b2bc502cdbee38e4212ac67e35ce930deb89f982b695f8fb7cbcef0a757a2cdfeef87cb41a1100d5872e28ae08626825ad8f642b8a6277f13db1551f3595e732f86fa23784a49de2be1eed30d995855b9a864f53cbf5c0753b81a1b09f0d2202a5d0212d1b83028dd42c91dc9c62232ee732ca674406087250d3015d97e96a9d1698b168cdb20a7189f55d0233dc7156baabca96917ec63a85bf42f7fe6fb3bd640e2944e9dfa04a99c66e24e0420ac680af9cf53576cf54346d75bbe8878bff972be5798486c9e4a5f7833b8e39eab41d690f33f8feb78bd632ee3332acd7e89bf0e2ebdbd06702529caff9b356623ab22671e49025e99a48836bd08d66e4399f7d87f4893ca938fe9251d547d2b3479898d19fb27bd0372dd89f0b5c028f5423af90b79cf4b62405795c3b9448b57ecacac0199b32573f90ec9ba9484c0716fa5901cbe99de1802db34971a8305ab54cd51632ef5c416c19a6616021c53692a43c9f5f6f52dfda726ab7ffdd244a8e6ded14fd786bf99b2ee06e80580afd46ae176a46dbd0428a2da46442c266a4643d24a66abb077f36432a3796df963605e05e7592ab6945b0f852f9fe19f3dad306e3a51d42f0baee11eaa33286687e069845e770c7b14fddefc9e782593eff6e6775e1c89e31df15e512fab3c741cd1c421df33f7c657d889425981bcbf98e93715c0495b6eae1f62c10374ddb1bd9467b42feb3f3bdcca2b7b42c6dbca6a7702ed7f27c237ee986f25c5e3b92dbd01f75895e6cb0facbde69f32dcb2695847c00a0115a268cb55b19b0b8d09c8f8d01e13ea3b377cdf6add5637d112e235dc84399bf84ba514b9fde676398eaf471b8c7dd4ea421104daf1024fce76b8ad3f243a6de82d3deef58c7be466d3a15f7a54c83ad257ae9ed2c7a6b5935170a278b5115da6d27dca7fb3e2811a5c908607784f2ac8c8b0180a4096b89d1bf497b02f60d60fe06271135e9418612b848891cb8753e31152993f816e83f8134573bc0cc2bbcea35643ca6b9bc4e05f4c433062c47043317401d8e1bcaf90d7919e60c4059dc5ec45f876e734ebf6ce7f6a4e28e7463952e31c44cf91d941c328dfe03cb47c2663e3c2095a5af784e66db8bb3fd1030ecffcc64613e37d8370d5266ff996d169d0b771f14a2f1fc51426be19b40baa14c7960d5af6b3a6542b5d1ff27678196f04f40cfb883621953b684b3ecce5941d25983f34c40b66723fe200186cc8cc6c2311a3bcb331947272fc477a0e52f7e0476c7081b99d17e4884149e29ab01c234c7607936e9d44d462af8d17241bf6b7c6eeed8b8f183b54273324d7bd8127df400ea5fd1cbf57f43887daa85859a43eb5517d58dc3564a5abefd2a7512ace33067d983a2ea816179320049703c02c807f265a5f26e6d93e879d992d2e82aa93990f8ffcb2fdd7501e98ccbe100b93c25ff5fd4d15d4174ec931550161c43db0e19e4b5ec3984c18a465e0078980cee75e96cb40027fa9df2f3da6f44febbc3b70f1ab889f332d0ccb37546678a3bc977abfcbc430bc1f4ab76d565feb1be416b19462e14f428bc946b514bc417fd8266cf1857654a593b3bbc9ed37f4ea8d6a430392ad63819a1b903d8f9fe75922b8d7d90bec25149f9907283a11db2b9b46523820ed28584308f3758f823f6c1b1b11e74d90463e176d762d4747bf2ea68291e1f5a59c389ef472277a00f29402bb30f1aa6450a4c12d09401e112bddcb715081c6fc1cd105ce61f40cda0359a1fec7ce3518d5a575dae0888e9433bb0c1380f6a6fffc47d8f268e899bf12847bc803c19e754173476048dc2c146ef9c6dd3f7b4346f118dcc42400183c55df5fdd0bd2d80a3bdd3334e0bdcec952080ce6bb6ba89332bf25f0bba7d97b23916e76b1b4fffa03f97f2540e8aeb7946345bb21469988257d196ca1b67cbdb5a90d235e83ed32407975be891ea3b464205d63d9f6d60828ae85a4add0619fdac9b56f54b2116027b4b44324094cd35cf9b12b4aa22bccae6e27c0b83aad84354644062df69b36125330fbe32585f9020d2ca6ad3ab05c7a9742b3428d86dd9db671e0ae87110585601736363d4294c94420535795be1b2c9aa8c2d4aa24ba6761fe8da75a4ec56a17c70da70d5898a318edad957cb4e1351de914220d627af329db40afd430a403cf68892de9835729930fff6cb7ca32f20f38948d9fa61f8546d175baca56b8286cf89f260d58d26a20dac04b786782d98df4bfa7034a6556979fed283062b23d5f25acd46aff33e9ef03f5c5a1febbad08b1ceffb70048605bd578bfb2b78ca47d7505035198550013fba3df5fe725447f18e598565ea76dcbbca802b9825c484edbd0f31ad23337c2aa62cb852e082d337f959e172ee6ea58d96d34bb49631b815af38de81910815861a0dbc9a184945290c7565863698b8a5d9bd5a0b3c85cacdcc20c22f287ea9aef6834679e548d7cf33a244b22fce7a8cd24b98149325fa9cc935f196984b098f0e9a9f891d404bf90bb8d5adaeb7e75cfa706d33a19b08ed93f7c48722919eff3329aadc9c05d08703f366b241d84545fdd631f3bdf74a70429944829bda222a9b5b621ae80ab650fdc3c6b6b386fed6d99cbe5d341fc910ab35d075b93b5fd17d0572ac454e9424a36ca9f6cfc6232ae9b7948cade26081212435139bec4b9fe918a4a2b7bd918d15865ff7c5db8e8a57c9b509533cc6f9dbc369c33594205964ef047ed3032480f57a51daf0f50898532cce9f632b026f03ada662cbf2cb674d429a4b01057da37ac63ad80cca8656d30c98b0b30862ce6fd5e6d9b6c8ea013a1d3a002e2361bf80f831f9afe2d19416130425c4653c9c0bd15601955d98e9a683e396f35861d06943780cf4acf14d0f60bfd74d7b38e6a2f9910d264ab490e397c4225a7778ecc558adbf1643892aeed80ad5ff58321ea645da1b7983cea071faa7aa0229c9301c97806cdb3a0f1816914797e2a40a0cdd60cf39724154e8d7b019be4f8ed3aabfb2cf2e57bb45fd91ba504954643d926b6cb445e72f6fca556ebbf829fdb261276ca380ba918784a3ecb57a538f6221992f8dbf1deb492d38d684394e1967e88c9edddf75fa0260c05ec90fb85d18edf66124efa0c7b9be74316ee259c59c29e4504ce9210493254f3bdf19935239e383373e78daba2ebae1b34be290ab10cad114f2d5feb5cc91a21a5554483a399f0a7e3c65aba272033735920c0505ac2368071a91ad0362813f1f9d85acb68e322525f9e2e283d6306caf04331f4a8c4cc269f48176cf84f20b009f1f04b44ea3ef16ff9bc5f6bb32c718c465f152d09058d23faee9623309fd4780ed1085b307933f544ed547c536cd75fb0be641817479708c43a2eb89762eb1b9badb2b1c1951f9d04238908f342fae6a64b15097d621b7676d41c390b8d7095bd9bed61ece6c61a94f1c8d397be96f1e4b3cb45066ba476aeb49c242b5acad77635f29b624107725a87f625a56c2b82b885591e4317f2e5c6609eda1dc12c53aba8484a20ff98e164aad449bf3c2c120a184a4da60a1ce36a33e42a1e205b3e9717a014982065ef7651f87e40a41006103cee135290fe95affe5ab92143362180a32895485cbea8fe01de534516c6f0089418d52522c8702ca9cccb131c652db6139159169eb4c648d2809e2238822de9bc7b24dca62515c14a48659ebc5391ac13e56b93452f6118be74710847bd141f37e015c17d2c02cc0251cc3ac37175939add8107d648d107fc5144455026b6b7029187841ae63613486b7d9ae5469d1496e6a8684b3adcd404c094ab9e4010124d3dca930c8d05d12daf9b4ef219500a66a48512aae667e27ac4845bfff9a67b22cea4b13d9a412139221c42d82e4c60a8b211a2b847f7bc436b544ad30a6af65ae6b90c9545d59911c0ef867021934f5da7443a33c33b0156eb1941640a1b378d37869c616426570922458a90e610e468fd35d66c067fcde095cdc243e26b417fb15c6ca3260b08c184efd1c3c8cc9653712ed35eef44d34179e892eab5b45a8d3bc53855ed42e4bffef31caa3f3a8d17c70df9cd20292712aaa4e73921954a36cfb468fce2c9c4e8beda9042bca173fce9be524f9f2fc094bad23d3de37ed096776d9138a23a20b6c0789916d970f42ec862512a959dac4690e93cefef7b952f0fe2058c44f150c570d28f8a5d0c07bb7981ca264a988a2cccca98c449ce7aa59d3e5b28f337f46502d7d78fea8102b68065f16871130e8731f171090cb40f2eec39408a89c75418543752e87bd5ab0a2081e803a0ca141b47064c620c15654c7d4be212fb582d1563a995c587ed54f3a5ef12922c65df2b853859451c9381220626a7e912a18549a4242ee95a26915ed88253e5bc1af85e617e15aa965de3287c9a968d833ce6502129b7224a643d9bb1a01794f86a5b802b5cdea433c8fbc68f600b613df2bd41f4615907e308871254b23ef85e4ef9abc4d9dfe99798dc0aeb97d107fd542123a11b9aa592c84e2037e5ec29186971a8c6dce4e78d95922da1431f7c0ff28683fb5442bc64c6a267c07b216647693c3cbcba1279fad01fdf32d695534e49eaa4e86cbb52aa993854fa6e44ca54d3ed305e2a084b0718f6a0178d00e6ad8ea17050af510daca3afd2d714b6d2c553962d01d2ce5f168697dae36f44b47ca46f4c64de0fa6b8dfae0b2091b979aef9b116bb0cfaadaca5773fca38e8dc290a82de2002fa7cc6c02b23181c58431a6a99dc541727ee077926de7707fdf1e0b62a2978b3cdc463aac40d311f840e42aeaac2cb040171c24bd2a30f886792cde82c55240a2d0b5155ea02f92a47b324920f7b472f62cfb46f332c12c7c2e672f4a41511d9d11eeb020d95bdd494eb1b10afb4e65cb8cd3a18b1ab40066c03321172c42f4140353866a788852caf0006c957af148522e768279d766bb4a119e0e07134b3b17b04483f7feb45239c19982e0573d9ccd422cb00f52f20ca38ce3f7b41448c6ba2ce114626f31588f9b65124cb1b5800a0af29b8cf335d091059ead14ac5838ca1af54a79fc66c069e4d580d02d09443f4271f097c2aa332716f93ec3f53445ece18c16dfd03292c5575fd19f010ef398d8883b0c48809e9710a2b381f11c05cce06463a866460624a0e2d1709197620df4f6c2f602f643f023ed728df5b3510ca1e5d8edf365572cad7d2027a699fe8fc2fe74e008339a39af39087303c463846f981121ad7f05b26d9d90f06213a43eec74d473fc05f1aff4e217626ac68c8164a426934e04af43332f456ae0dc4a68d91d46fe5d8566c6fef467bf6608ee472808f070960e69fde29c409f142f233eb405258db8a0ab222b3e4cf6972645f59fe54c38f58c3b623eae44382978d1d5f1fafb6713f1e2eb520642022215ac9db28113a070c6bab209826f78da6c7bc806a4584507aacb8c7810afbb6729d80c161b370f0d89db7d04393cafbbbd8bfeec07bf8ed649cca3798a6d3ff53c2c169965b237629b2c5f15250fa6b0b34dba153cf8d2092201ca65fc21c4d10cdaaa46fc260f229b803dcb84db241403e1246ae5c8683f2df23158841e0864c574066cdde8e87aa4faf1906c522be92aaab1d44ac78f339a4c70056c8b6b622d22c615661d118a4d8507e90cfc5fd9fba9db592fdb7f28cc277d46cde02ca40a26be1b4938d77769256d9354fdfb6792397ec2a8c5b1818e5576ee83cabf445ad4148590890a3f1e5c43a7e51abbca0fca7a35239a67e7fb0f5190848ca9f610251d238027aa9168bbb0c88592bd10d99c1cafcc5d1ac3c2c9761bca28624fe63d17e2df1618a4d70bf73828b09ffedd886ec562e8861333f5ed01564996705df23f8f1adbd53a50d6f2cc6b5b6cf4af521395c060a3988e9ff9c313b027656dd6204e8e13c21a4df0ada3a9510477637095104a833c351f2b5f557c0c5905030dd6628222ab1d365900375ede0f8a72dc4191a7abb3c391aa951cd7ba34b40c90ae5d172ba63de98dd269bd9eb469564e4bb3632aa460893c553e7ae0acda13e96958f617aeb8e12318c8ae6b23501a4490ec5f68de024113bb729b9ba0a2352036f22ed279c4d88c0e9b04b3484c5583943977d161f6171c5e13d7f849a9d534d72d013a42d5818d6abceac463d06691cdf8da77a09232b2c56657d985cc49981b173301f3ba4c077c486a2ac5c3c9f1f3b1c7855b5c5ec2d9e5764a374b3c37ce0ef5d8108f08ce4cd9683037fcee0cefabba7f240021c2567013ce973851b294d156555dadef26711f46ac1e128a5299786ad49fe6a2288fa6985423ec1914b1a918beefacac8eb0d0531e753856d51b20899d1508753670a2335b8698498666bd07aa27149af5eb610779286d62ee85d207fa239dcd1669e61833a443333b28a0d6db6f1df8071895b16852022dd4e3d78a33137749f6cc0436bf71e2d806488e206faf1a8af7315222aa40f6113895ca4511361f1d1f91b8336b2a1ab9a1adc40dae0889b154a6653ec221020cceca2cbdb752fe8f194e78e668aca00bf0ea3409045bc51ec442f8dab980eb7191b0169e492e2c56e65c929a7ccaa5ea94f7739c66c1c0fe4550a3f0746a3987b43461741ff7b42e484f40fe7e6b424c413ba644a715259262f1b71fa80277129bb760a62c5f98991b2c4d6cec3ace91d5be7831b1b47c22ac29d21600485be28d4327cbfae15dd433b2de582717fbd1b0f0538ee668f88080704ba635b3b8f76639e9981a72fe70f8d2fdb59201f9cd69a36d18b8c7a29cd1810470fd9ab19f74621101a0ad822c69c5cf79324b80eb65f120c1133cb23511c7dda91259881e6cc56bee5005d4670e60c11d8470006d2d1f530fb2d7dde4cdbb910414cbe9c842c0e7ca4deb0c78864daf616c4500583932643d85644d76d4adc7870d0db3a51f31e127a23feb3ba42a6c2e9269f5cc219fbd3b3bf63cd9f192a783259a4cad6a91929e925e04946f6185ba87b1a3282158529f7c8bc113a219d1b5c963c2e0a2171aec49f9fe5294e56e00b77844a3f64c22ad1267e90761a89e11b9358e6c8cc286337e4c962df46bb5b5a39996c9347460e82569ad42ac872e3aa620f4900b1faf4dcf256c1f8d05b81aa68a728370a02c365a705604661bcee782f75100625dc6c711c1fc99b3a567299d9c19a5d346ef637284b07ddbab10da19456b84c44c60118937078c0f484aa4d348e971a90652d5a69b576f7a55818899ca1112c1dc30ec3d84e2a537445be77781479f85d43b58a87f464bc761a2fe0a575001cc13324125eafa786e14c1257a45da4c11fcc1e449f9fd8ecd1297d7d7254135e174e06f2c371f6bb5ee1118180d9a5b8b0f74517d10e1c073ec66aaa143091f196be9b0af03f115d2b812f508765fdb62c4b6b5adc71d30ba4bbcced166790505e502559145ed681806d3586084d94fb2351b28f11b078f45279afb3c53d8e292733e283e23124549ae84ffe85cba7703b15d161585bda2affb634c699c1935ebfaf2f5244e008fd03e0c637545890440708d0a8143f46a707a0271236fda05562e6143e26524d251c45b44bdb907d001e4b3e652dd0eadab133e5a3b3efa6fc45a4d09a9a08f81092e0739ac48b4c1e5b7c2dbe9ed7493e845a176ebf5a216f051e61e9357ecdaf4351cca4d1ca773b1ee3d3e5dc49a35ff7584f2c6422bb6305088ff8c02ea4c57803429c00de49dbec6b333789149eef1fee484a34528e1181ecaec326311f070b93171fd7dd1b9cb9e56ced4024c7973818358ba22d3a26f71036784a12cb6e313d10736a932f386420e1a0af80f34ad8827083805acb6108c6f3b95f631edacb1e65680e3e7cf84a8083440a04824a85b82870a2791ce3aca38911100a769449c77c9ede91172c403cb4bdf6420bc199833b2378cdca0ff0341e8e868448e1b2a033732b1da6ca60d9c7e64dfa541e40c239d9444684e52e81426534efa9ed624d929e8b842904b37f399c1cb8a4a0d9ce766221637d4db48105855d15b20644012d32c85cd4be2a1ae14f41c4d14d6796b27c6e8c1c0ee72e0797cb6f76625fb5d1ee03a29c4805d981a7d13c226774541562d8ffe522734eeed1763abd24099fc532fe0a507fa98322a56f39a87aa6dc7ce9d7c01e005b1cfd27956a41e7aec392ed358e3b1c2bdfe98e6a990434bd17f8f12590f08cde1ed16d75ef3f8a16fdf230d1424b36c67e4c6b5aed49ce7f959be4b4ecbaf4a1a0492a7e343e4f1d988ec0b5f987ddf18a0bd491b6b4a53c02d83bcb43b4e2c29b0d2f11bc72c7619d7493206934f3367f6f3aceb3f93a9deaa8181adf7eb98983120563dfb8e190fabfb13e0600ebacc9df51b4c7db53124774de234276988bc3a7aecf2ee022d40c8ecac6994ff325176c58a169b44daf1bf1c817de23fade073608f2020ad500c48fb575f9bcfdf48e9cd2d349d3e0dceb0245b114934b2d8c04de5661d27769ca3f2ed1a118750108cff90079bb90976fab8cbe58e0f9f00fc234fd22844a42e215db8648dd55da30f4bb34a59413c384d7a8f6f31499d72a3acd7f1fbd99dcf44986e547c9b2022204c3a51ecf4fd937e4884b42dc3b83fb62f12e19f4be4319c881c150427b7e29beb552f48af83059262856623a714de22bb4ddf94bfdcb08fbd647bce37e7404cd00f92613ac329549bd15b6d66edde3d315aa933a61ab9614a7d8e450887dfc985217dc4940397f33cf0e018237807496bb64ad5018a42ea0055da5049f730175bd1b941c0a5bfc8fdb12d6ec6bcdfab46f50581e5c5d1d18abb400d2ecab95a0a3a8bd32a88cb496fe383a5042b47a68334930639b6e37a39cc2426172750828f3f742e0f16483a70772e987099877d10572fd344703a4cc9254b9b3d3c9a6748e388417333638ed93f5600044354d4ca964891bb6b0f49dde6a865745db0eb1f347bbefe6e4197d63b15794cb1f2f472714382f9d87180ec0876127fff3b637481c00120f1007998a3f6958eea2bf69ff41550a10c40ce1761c3a2f27f4862f1758280e6e10b1034b1d1db90ccc90ea558e00229282d3e4e9d90415e8198d8534fc62fd5b737a8e0d19d890640c7bea423924f06695cbf2f788e5dbe55e8eb53420107dc34fb7cd8dde4f3bfec3fd2e87614ebaddb1d41646369138acdd9685d64be14b829daa360533ee65157113d048a642cb4a9a03c4e6f18f08f17e1ff52233fcc965205362a8412f609d685120f3144d6ff88d4b72187837cc18038c55214e258099fb80a0b160c4ed2abcf9b6eea524df3f79e8fa4391f7440f3712834002d5e13918f900bfc39c16f97a6d559461e430f7cf92cbaeee7111cac18029f7799ceacd579b0d42a7c6635aaca1306713921c6916474c4f524bbbbfb686957646ec918a06e3ec08591b01c17f1d8e625c36fb929924ec4a88f95d2fea6960da11b844bbaad7c03ae5860791dee533c245d503a46b16866dc31b825b893748e14b4720224a60ff4c788a6a087e6c6cce317af9cdd1a9ce6fcd4021acc60b20c5f464573d17071ce9ad3ea542bc9534a58ebd3ea68d3dde93942adff0c97e9fb6ce7702ef360586b33d2649bf0c4ed774af614dbcd3aa09b3993ef52d81d4ccab155416159ca6110280c97eda38f7ebe57fc70b81990f4091673b70c6e22befc5da54da0f7e2225a0fba18ec7a9827d594c641018cb12342f5bea5cdd2bb2d95418f974203dccc9e8af94a7c447af6d57b935dbaa976ddfab64c962b526cc7a59f06cf84a90159ef6ce0eb3b92833d2c9491187ce4530ec99cfb4cd038ccbe0c1803b5c06c251e8a7a8656a91dded5828ec55d802a0033cfb9747edae1f3a0d72608b85921e40d9de34f7fc1907e2c1610104a7840ecdf2eab0ddc3dd64f5dc6e17eade384721e0a62ca5eb0003d54b018eeba49e23479cd76af894e3d29d6f00e3367676f0505a616a75d05f03f1a1322addbeec039dff1c1502dc133ce545177e018670890a35d64e4bcf103dca5a596397cc792f578c66cdf06062c32085ac3738b6bc9d6691dbee16eb164a85b8e7f2962aecbb9ae17a820626d07ed2cc93ce4dad485d31655a23de02740627725e3a2d5041ed484ad10cadd37a25c36d86db58cebb8a5d571651d17ec314d02a9230933531ab94289a6fbf2822c4cf062f624fbb6f1ff8a23e831e430a4b78f44a0a19c4dcfed2eddaf08fe8e00f24f4082d883a46b4a81da8934fcfa9b3d5551c75fafdcf68b5905350d033e55906591a09917c1396219bc4413e30675ec4fa6a49f8189572d40381f1d53fb9c443328687e403ba931bb9b7dc72ac89802383a68eaba70290ff2c1be6fc88ab32d62d8232db3d85290d4949699b3778ea04c41134403ba5ad8936f33413826a9b38954cf8af73305635e1f7ffcf282d2371c2117b0be0a8ce4b1facaf8d76a8a967be7770c3de309c111a233af287dd8155f10985c033c703e41c04700f07deecd3f5ba6f5af2e20624ff2c73b04da8caabcddb10022c8842c21e9d06065cb20e7f3df9c0a7e78be50ed35b56afb2c582837538970467853189e05377f77cd139b0819b8605d93bb5689f510b42e25e36b17a0721bdd13d15b129da3b82e03c9ec9935d625c2e36e1095872f129b25b2f2097d9bef24c5b2b7b26808f8315e82d0157a9c951b7542addaddfee165adf59a87cf66d84c962a5302d8aa3e0c4b79b8eaf8fe2af92ef9bac3c7c89825b6d416895e2203f88a9e025c906eaa9e33f9874c11d0c0ed3f908bb3a4af9221c87709c3318a9d250e4210bc7b01d4c2e61de4b7ddd302d95794442345b7b01ec1d6e5a6a71422d30707948273b9787d2bc16c7cf32ad2494bfc2b1ced293157830ba77c965f5f54141171553e5fa0fa10482766a523d061e1c5f46e1d20d70428461b7b3e5463c5d0f6d46d64f7ceb88186580c6c56884b05b5f0744bb2165f6ac97b93ca650ebe70a341e6fd07032f1aea03581b25b2ab3c0a02f91edfe1e7d2f82087f079393a3efa0010709934df362eaa15e20be81354d776134da862f7d3a607dc93c2bc0a1a88d45737523b8d99c4b24ed27a8e0756cdfced42d24d11d9e50f153c9914e7376d61116630add58d10787dab5295170dd1781154f80580b2296c7016f0dff2fa0a7dbba351dc2b848ade144cce2504be810d4540b80380281c60dffd1cca6f886a47a9f1ef3801e90d151d1154180892d25a063d2a56b96ac783c12dfc62413179d9fdf33d1818124e927c4ae1d4f9bf8f25aa276a462671ef4a11cf0b4222e1721ec5f64d17d41de39fd885a68939453b159509d8cc334d8ab00ab360048824d28b79da9dba7da8559b3eb2cd090ab32f9689a2e0895909b40ea807f3d59bd98169e723ffbb6c63a3c93722138e23ae30f86900d918ac5179a7db8504920002a4605612fd8585700d4d62c836eee76831f0b888db59c58ffb77a1180fc505388b343ab353926dec99f7fea957b04a1c32f10c2674ef0d206440ee1e6fc6d2dcbf7a112043b43414d267c6631037324cc16e465b520dc24379f3aa35506ae67c8a92674f8aadc5f132b52c8b358b2aa2a6c4ca2ed6fbed9df484d339a067f278c972ddceb603affdebadcbe7ebc0f719a46e4dba8ef5f5495c89a8aecf94cbc7317f71f0742d3cf276089c11b8304c8c70981b13f11108f5c60046a268072edfb7d1ea94216570d854f5484961ddb377bc17f8ae0059f6173421ddfa9c5431869b0d1cb63ec5576db45c986d59cadd423a211b924568b97f99ed748bd4009f758ce23599bc7a81fa6694ec28941aa647675d28fdec6a33daa33fe158d6e1b7d5e1330d2df796470e1478b15be05eded45b03dce11d681e5d2865f3d3d070c9d711a22bbf702eca0359f6c399e36503a45437e2b3b2aba8b0145145e0a04587b01b88a742e7d64433054679bdaa28b1d31a65557b09052df66c4165cd424f03fbc9f89ef59bb010b97d974c2416367ca3cee55266ba0e9b11dd4c8ff7b4c338b8f6439bd99862a07dee9fa1319421247838cb70cb2f97474031e082aff9be88831fce1a8656fdfbe944b4935dcec3eed5ed0309769f67aacb29c7adfda679040d8589c4ebe56cb33ef7141e7db7ff3d4bb6941415662cd6616a7e7d0b9f066475a764e58a17f1310bb9dd653336cfc9d2f9cbf2b6aa03485516574c1e988d8b509695278aac86e37061b132b546b9826839b33305ccd196cc9a7a4e55a3e4dde815a3037217750eab75d69963b5a85f06f29e2e3aa135494137e47474d32a0174bcb8b909775e84490dced7b60b44f11c5dd2c8f2e9fddc03674782744a128584e9f921f0a5d35209f164bee8cbe4a1ea9934116d605e53d536aa730a96911a6ded5b9931c5d9446c0e17ab04ef6814a6f2781f159e5b24535993060b06964f19e4d89efdcd7f0dd3177cf0525dffc45435417a00edf01ac8051d211258e28f61a76c82e3eb751d524ae292be8746ddbaed3a0f62c2c2760ae4e2bc8ef97d6c089ac09709010c72cecf29a720bf718bf59fe2709729165115c0f9fa1d4daebaf439326d1e1e142e88088f48146e8d707c8ee4aae1da9cd0e47229feff049d0601861bac4b6ea3ce095a9ce823e7ee05da1b5c9d6f7005bb4b305dbcd10014f241f3e4e5cce03946f5ee11482844f992820fa64344464c8d20148fc7dcc0a4c75fc465e910d96d8a822440840e1a8365ec8e63319c534236eafd7387fa04edce1d053d51893b9eb95ba4a40454b4ae7f468bb16a2cde7df4ce72f1721ed57859770afef63f504784e95f7da17b67bed0752750f50a7641032d40badca62f008278ebd4ee2e7b86944fd62385a1c77f6617fca5014fcc95155a6b284da8f640a3c278bf7444f5430b8731fe42f628193cbf543c32fedaea7d6bffed24e65e947f67bb08ffe586fc25d78b45236bf5be19953b926764922f2113df087d642fd3e201d78ab3abb6e922a83794dd0a939744d00b359bc2d5515a80013c00f1d36bfc00c5e2e13f78ab060b6edfc8150b253bb18e8fdeeb33aaf06898d29ef6a7ae37ededc8e31b613752dcc8a2f9fb9a4227786e2aa631714610514e142f50c6ca161c42d201f005426f9fa7e83e7d8854943e337bd156aad34db8a6b6d2062580b14238e7a029c01b31aea228a0ed832cf65aa0ab9e8abfa81a3627a0abc5d9850c73b5c0ea8602b307a20aec08467b0f8207cf2ea52f96ae1b179f4d0ab387f57405ddad42b84307a1b47cc801adf4b9918300c3bf6c1584001503a624aeb07942f1fc42e47d5e003d1c1b0f658da4f501e9d9919c7d6941fc903beb062c18c7ba0899b8316e10907ca69936288fda1aebf399edc3ee9e315a75297b5c4e10cba3c2e468a60c079f66928d038b300612ea624818da5f301eefd79369c0c4373f196428ee8205d1a5766b7c84f418464c52157a62453c40f2403e2cc290da24effd180f31f8f571a63a0c5e70c3b9c5bc0a04f1cd67d1e5c620dd82b8bfc15e8b90fb0e4585457ebfaff61762092170a1cdc6462b3aade4de42744f99f8201b5f3d5b3ab571f55db7a3ff392c84793afc6a388406ba84aebce604a75972d2613bdffd77edb7ae89fbc717cdc7c4c70c84d4347f472fb34c96abe2bc9d0601270592d8377408d2c76d3440c04e1f5f416131538f896369c3a80dac3afaf127f6fff543ef27e81cd075554adf27a67d7ccea699a6d4cc627c1c7a101d08c455367d9eb8f6294bbd579b253834211dc040cc8e34ac72b7b2ff45516948962c93d74f89ca24e37f0c548fa8911aaddc2c40991129d7bef38a065d814b014cbbf9f41e232085355241faefd65e140fda53cd3befe86058760ec2b8dbee9729620e333239228965c7e2994a5cda298824119fff613a8757714c5347dc3d29f76e4558ee505ef4bc034c298f44ff8453398c0b29a797c3b1d8bfb34b8dcfb0a3af8041f77f35f0eb709f0d850aa9fa53cd16d9bbe45dd75ed7572bd505f36d62deef78171c2690a5a6aa2d882e86ff5135b9424bba1f511f73d931d9e8d224943d2e4f9c7dfc78ba1939dd522601bd80f254595d0a8ad27b6735cd8537ed3246abdce5ea074ff196e66058b2a1eb2b14ed06d75f3474df8ac7f4fa8786ed7dfb75e3c08854cb73f7933e30852db0a2060628579664687323bec6a4d795a6dd072dd7a281aceaaeef6b996e25563287e016e21f2eac476a0e89a37da5b24b1758619ca9d4fd9654a215cc8efd61dc49314650118028c90468dcb7dfc70f609bd6cb17e80ef929c8931ed5bae485d3f250b4c8043c8118a50a7366d0c150cf35b10f3206217cb9397f80406ae932e79031221436ba58290b89de280f7c0aa141da824bd7e1330bf7d5198575d0dd9857c09432ad97dc30db5ba7d8f719c8ba39c00614f10e9e445161f849748a51e908bdbba90a81f0434b2bdb8a20f5f8a22262ce20e4e888fabb229cd62b9770930ee4aa44dc07f650da0a538a85134be03ff4f9c5723a31c2984f53d6a2555f2b9880bc28a5707ac2a88022613fc1e454cc60c08726036dcd16a694e806ad4e7773bb0538fd816a997ad295dd4be28dc39d07768e1ebdc827844c51634af9b7fc8f05b82026849b2267b604cda4bfa840a843f66769aecf08f482951f3a21b882d4db971aaa5036eb5de65ca0e4ed3620b9cb0c6914913e2ae6cb59628106e9a4dbd8de4bccedbb12d9f540123a4bf9c349450e0e10272f2381f262819d12c406da1563c0db61448db497552f74d61c18461761a0976d6f7ab6fe20753dfb5c47cef784e0ad5bfa62020cfefdc6468458560e114484ef22a6464075ca0b2591545292ed3e30238543f3b08e30a848082cd4100858898b14dc246d236d97d1050c520fa7627c768d8d682fdc63db9ef4608b2b0d1008074a800298b5318724820c84d9c1e90eb9f0f8bc574e1691f0ac33457bbc9bcb7149195fb3dce492dfd6a61a31ce3e3a069d77d818a45312c94306b23dae1acfcee74a258b701d2476d09c564390c8b926c46d99999c0423fe0f669154e1a139756be4bc353e73b0d0a7703a47035c4a80f8bd8839739e22e2b830c7c1cf9cfc7442fc01383f479e20f4e8b4809f3f11fc7aa3932436ae92b004676c74a8a03fe395de86bc2a30179db5bb4c2c8e526edbfa83a7e63e428768dc2a1195380a8ea4b90e3e77576930fa008433da3b1d1d044fa7babdfd3020c2773bd2d93619a7b58878a5c1d8d54e9081a654c0e920bcce90a233d474121d3b5ed22901d5834128a392e3e30918cfbd8f756a223f5303f61685a0fe058cdd27c4efde1dd77f85ba1074c796df37b3ab3462c24c9012e08fd3ea1b37ec981426c87f965f11879f0cd9076f2c26afbad9b0bc96d8badf2561ba6b014a632453388ff3148d3170b60e0a7f620e030fce2df18598981510c4b05a122dfd01cccfa0d1eb3132a7ce5812869e7c1cd613fcb78d779c551cbecb4288ce059d4e4e8720da1da87c69d366b373014e05b69a028b249a183fdac9dc71afa336fc1aa0d855174e09b06318edf085ea832e9ba52380aef1b5021c2bf910fdbc7653401b45b1b1ffd256ba8522f2a80711dde4daa7c66963926865fa6f699026e83c37d55c17d734b3f06dbd3e53ddc4013d318bc76dc19b4077b10f1370a548bc3e3d6be3b458b9ce39a1277ce8c825c64b1d8797c117c2b777e9dd1a3e1652606bbb9f07dbbfdc0645d6dba36b204a40938e7a83e33ea3b5f98304796c29ecf0ac273d8a3fc61894ea38ea21da248d4172ea10ada39d9bb751fe1cee289b0804a5cb8506888b3f92202faf492b17697cf299528bc72e2a08088df1b3a800f83e5684ef2a3d90851a935a2c9eb0f0c970ad6f085db0485e6129396624d89f63704e17f56529219366ce7ffda18c4f8d17b14bfee5707911a72b307204fd9763c022f6898669d6b14a98e12f08c7ba28c3bc18c5a1d53d14904679f1e46d0ed2d8db733cad26d1d351e5244efa7068c687143ebe9561b8fbb12b7aa68af39d124b537b677ea76bc60d3cfb474811b453501ba26a9f4be5935cd9b3795f5fbf7575caad2feaec345a7d0e1831ef7207e93714aedcf17d125dd3f695376a9a7301e08984ed2ee38e76c2802b90381ac03591fc175d4f8572353bb60f217787c7dccc5576efffcf5f63248596ad3ee818d6faa7e53af7bce91f31d630f9217cd46a9597d4ea87a5ddabf17a0114d6cfde0df2b059987d36efaa4c5db8db0fdb8a3bdf6bb7ff40ba688e4dc08d7c45892a523281829ee882130ea5d4e39e602926fe8742beeaed2a0a1d2c90c5ed0f5716d526943e0e1d98ddc1b8f5b60b3d9a0c5542025646a6d123dc19f3440741dd292a092b6646469477ba2826307c0e01f2aefa2220c6eabb7452f65377401a89a1d7f4a55cb3ff7e20eb92d790250e5f468ad37ae0c6a33b79942455f7a39a8ce01b22cd31b0a15c4e49c4d70f78af92b3adbce15b7122c36fc50054c9121cb95fb703588da26a4a1621e1d5643f7d90f63b1266725f29e92452f7d627e02b6a9788265e83c2a9faa3e6bdbe69c38716c07ede97ccc2417682403373228af5f9723d5e0f6f45e8d2acbbb178a07927d0ab90f5ac5df6b5a67b410822e74256f8a44c27452a327d86cc86ac928ff8e44854892c35d515222787bbd2fa87c56738ea7f5f8ec95f63c109709fe309e9d21b344701f18825abe943b2b72a77fe2f33730baff222452109b50807822d642b8fcf64dca9df9aae7ae2914501b65fedb8ed13b9a166cd7788076d9b3229933ee7e064da6cb38e012d6908472da0611c6dacb1b734ff7feeea0cdf4d9bef31b7e4e03bc770d5eef722254a174aa5f9d53831eac5917900996e63eda06eae2a7cca6448cf7edecd0856658c608c0f3da4a1358d334d4f9d07d81266e6d0cb4865a44bfe7dc4392218ea4e07e1b62ee2de7595cba898c5de5ce1dba76c3a3f0a20db2698baf0687a08ceb3b9485dc60035c6160c2411d9ce7f0940d86c8a391b1d932546705b68bb418c30d422b8a68ffd8323a839a6683979f31d95f19929fe4a133ae262217dda6f11504c7f22011de72fafb2e5df5a0cc1785c3378c9ebcb563a61c56149607c7be1558cfdd968e1b340f6f5a3c0be4b3477ad9a09d09f025feda475dde6d22f382acb2afabd97b097bb860a46041bb892bbc3e1add8d662b011824f366dd5148f42e447bfa213478c41dd6f2b0d247fc104f4adaecab44ddc0ec035145d9ee3dc4404d75063923cc746a8d04c9f1a48d989df3e3c475e4ee2e68b72c22f0828e56c99c14f53939b96f178b17f8866f619c4d9053ddc10c6833ff0e6fcd1495c31bdedb438b1e81222e88481799d41b5c9b0eff3824a7502a94e692d9ee6139482aa7fa508e48e6aa20eed4c952fc0ece58efe032c12921bf59d1f6cf40d84d8c5ddcf52ec8644217df88431b212b015c450ee622c64cdac37c9ab1b548087848754cbb7c936796571307c48b1535e89fd2e58f8249f93c1c6d931e1b0e8c2e822498a49e0adc3722fa23a249fc0933fbbb881609390deacfec077753c8fab01e021763d945c6f62730dc043a58ea85ab8608bf9652096ca7d3a5c7d00421f0e71a61d61241c2657451436193d273797667cf17dcf255733f88d2e27a6ec8dca5c88a860a5eaf6d5801ecaaf9933a559459fbd8fe685e3b356b4b7599909d13ffcc442410cc4381610cd49150b02346d79b97d0a4f34f7dccd1d377b27f7b7c64a159be28129cd5a279b9226ee4854b079188ca737ba461395f6f243aa80b992c7c56024a1a017d99cb8e8772bf3bdcd07861274b1411705bb0dbc3ab369086f11bdaa1118929603200010a5f76d2bbeccc526321777d251b9f9b7a513f2362596b93b25a4ea2723419e8256f706bc047241087f030a3cd8299a95bbfb7ec5adb4037687aca5c14e88e3a047a8ec3742b367399830bb1c8951bce310139b831d52de51bf215672f53e47cbe208243d49ac13455993b9a420872e8a0a8a1680a44f825b61f759608852b9024abd0345c9d03289ca4b9907b09573422067fc2917b4413443f40b5e90aae5488ccc0febe58836a015e59511bc0e23bb6d44375f83471ba8f146872ef3adc27096f8be34c37939099326dcca450c6eed6cef048f33e064310a946e02cc1a8685fbc9a01292bd9626c2e59846a48859e4e05683daabc65627e2e3c2bd5de471c12e04e945ce3b9e7623a49af816a8d3e622d98b91a3aff59b9a836b490d40c0f95d1a1f30cd16b0a203c9db5806b94437bbb02fc74de9828ee6aff134a6a647ffab5a965795c0846dd98325025bde53ddaf2038e65899da0439e293cfed5cd88b56e779ace5b403e85c5a07371f837606daa6adcf8e73e5698cbb694cd86a941d1a3df83aebfd0746498e7724011305deb256c081610d1ed5d071de90c1937931c673875036d4248b8aec2c1abb09b4a5a321c7256fd7d8570036debb9f1359887204abda9d853927ca300bce3262038d976a4a33f486e95bc1f82992e31fe5dd700605d626262d4ab013028b12a3954db650891184deea9eb0a28bd4f5be3ad88a0d211c37ab5d29aefca456e2758159fff9dc193d36a9fadd7519620c3bf3c7e0ab9d589daabd80741153ab415d323386a0aa4b481af08b302034731b545fef51607630367155a2e7cfb4fb7d096808c98b526c3e0cd7f27125cd38bc24ef48d0be532f4058acf2e9c2d2e4cb4439aa08300203aa2ef48b9c4ffc7e5475d03fe21a68684fdc650aa916de7d851babd9999310409e0f15cedbaec864bf8cc4f2afd25785dbf7aca062f02e8433311786d75be35346f19cb1c1c41627f6286252dd16cffcd44b3f05b0b6f7aca3fd7ef3b8371861383b7efd05821484c0cce6f4e7be6a8b497fbd65c9eb485b1a3bcad7092505292a9f9c38f4a6f0e7a88f6edfd38916c00d52a2fedaa931c01a4fd3f7f86d958cd8301c1fb093d65322778799eb28108c4903a6b4273942348630205ba474640a949749cecf3b24835c41fd0a93da229bddf7d0bab8873c35558dbe7e642743f63512489615c9f72ba825bbcb9d7ea586cdc5dbf1a6e072c90080a7a820509af1f72e0dedb949c37de849caa18238e9e2967f57d971b5fe2b4be2452c6fc89b2339fd10f6c8d21ce49002598e9cdfaabe475f9347292187c8460e41841f4cae873abfbc85c02d6b3085a34d9f7286fe7ee243773eb6cbbb6ded2d0cc84c12b473f8afdb50c2df47b53f0795ec282fbc0eb9c785a4863ed7f23cc1ae18742447cb2b71ef3cac9fff1ef6b48918fabcff4e434a6220cac3f2031846a05895a97ce3c4c63672e3f00453ad5a8b467dc8f7eff1b1757155e414b960e87979e300fe4780ab04b86ba42d07840c32e0a520409870507b4f4fa93da0f5236ee49c2952838520b6933fbe5501a59e07761d0717e6e00f0457f7bb0efac00e3c7980f61371ca5ceb0136d207ffc289bffde1994b3f673676a2a991fafffdfbbb2e864a7c4870ca70780bf7a6b3f755516aa0f0adc291f955bd38a6d88a49b6c6a42ed3dc390c31d5d9804708b02dc6e35f0c1cb57da48088dd8e91596e49344efd4969604ac59a4312245668d9ac503d4d521423b56972c710c7b88232e5525418f37c2719d943cd7bfc69cc81bf7c2dcba165dcf83388c33ef15f5d08a048780391627878c714211b71b53176404f2cff43b04ea6c3723240b5697dbfe0cc9a3fac6f67bc8dc97af0d35eefb68f6b93c0fd5e25e1843c609c1a9c7ca78b5c161ce4df6d49edba7797094b489e9bd80d37eb20a461bdc09da8594109cd5d5460aaf5bc8f61a08565f535f0bca958c002a57ded9534d71d10f2f49980fc2728a51312b0008927c581a687f6cb7d0e3cb3ccb033032ff33199d8bf0a20de616e851034ccfd51f8405bc603fb5c43bcd7d68834d3843577e55d07773d4583440b019f37cae21d2561224bd92f7a35cf481daf3527a0ce4379c45530a8208212fee940ab9c95d6032f5a8c0d2867f4320d48a2833fbbf3476730c96c989c0128100c01776d9dc7a4c47a37ab04c1c9c36042abdf9238de87089135fc7c3e609896cc036a556cad9f74454548b87461ae584772b7b57138f07a22d15c19758d9d2909dced1bd4bd58cfba01b2d7374d4c1104dca17d1ae16fa6f871d5dcfefe7707e05be8bfbb278567becf1b544f73b56c44d2f542342c408f32fd7c609455e3c998e8cef10efe13acfbab899d3b8b1b99ac88913eb50e3b60372bb26eb2c040e175abbc904971ede858f5aeba798365028ce74c3a7a22e552428055db2dbeb883ee37f4a04314c37c6d4c0741c82aa28694cc0849c0adf0eb8cdd9a322ec53a92a265f73db1dfab00f66f87bd5d82858a02e7b232ef6c33000eee45780985c958de9e4979ac253b60d7963927a8def81c92e5d47cdc459ea596c6141c821ba8a5e22996f12b3299ab799dc72083b4f78ef8e0cca79d8826c1a781028585f0b155a2a7ea8cb8329ea259c5737f7593b1fe4d9a96dfe07f59654f5d130c343ea53a38a9a9301f3cc596f853796915a0af109e4287b7080e8b37f085ac39a512d4f494507adf258bb9f1f7a3a5d4befecc96f8fdca736b0bcdfe406b4ae19c43de01c097be8f4cbfc5f04992452c06272ad1e500bc63d593ba02e32fa4cdfff4a830dd6e88fe326487c3704c51f42417961f6b411585177ae0f9e7be13c7121e3cffdb973c3f1d3c6dc559dfbe16b2dabbc9c34b5c3361d098c6daad4cd1154ef0225e2743df24f09aa8ac4f2f5a55c95955f64d40951d72163d96b200374a4c75fc8a41c4a71bc20a1751259d95313d1693858192cbc6f9c26de0e544376a45e2c64b5bdf88b16ba374b8025aff1bb2c7572ba030bc2f771ab3bfb226d8537b88365074663ffdfc5157b83cdc3f27978d02a2a16200d26e8c83151fff465845425fe8dd86b8c7773d600ef2ce50f6c75f0badb28f4912a21769b619df0d460f8bd3cb9e536a6569705d838e6da6921b0506c0aa65d5982613ccc04b104cd388d06af82932414a7081be45b070f18c2055d80ed69f5151494eb72a7e66db3f1660791bf5da4fd4938466a26d83aea3535a43d6ab30410d0cc8f0992441b10306f0bafcf4599ee9b7804bdb1e4f6ba2404810484226600775f4bc9d8370e46876ffd20078f1b242231367a04d3404d92ecdecc2eb643190237bab89fe533f293bc62c7c685f4dad40101cb784a8df534068b3da274458cb0bb1e38d678b4061e369a50d4e47629c404240064105d96882c000578d60a003c76fb2b6f63a86e9ee405650c0f4b833db812154914550015689d0988300edf7f75add8ff6b59bfcd087ff10f9a72d0046b6abcf300ed2795e7e9f727987aa65f343b9be49ff7c13d752fbacbb84a1386acd1ba032e4c2e620f6524a95235b0e84a40cf68f2e1a4acb04cb7c1124b67bcc470e344089099e377074af8bce7a6b7b3c68a5761df7c1a91003996013d1be219ae26bdcbf79836a44136e376e5313d7195f8d78f50eaec287b5e84dbc3065920d55c2387f9f7beeccef202b3eb8980c22feb61ab3ecd09360afaa1e26441f50617c5750b1226ffb140f4bd090bc1bde405d54886540993af696fe80583de1be557a64cd2838575a99a6ceeddb559bd7b932354717830c821d9484d510f3e2f9ae9ab8abda4a468c94f37072235ec12b118274928ba03358d97ca80bc238fc3530afc7e1af805362722dab86b23ed5ca022c27e44aed81d31ef1bcbb400c7a99b8300d395f442b3f77f16377e58c23a250eb22d2fe26af86f5e092857cff21438f3df3617c870e81742a20e031fb21eb438d8270b8e7852e87511d52b40a7d54c8e31ffebcff6a90ea261297f13f240e6fe885cae1ffa29810638f99b668ce9a685e13c814800dc7357e97399c546813c04cae2ffcc315e531e597013634426c7344d2dd748868d617e6153c3999408c46792e3f12781642c09c3cf2a59a0cde911fed8540c4e97d58de79c3d243925591e738ace66803e0bdb1fcaf6b00501af1449601587e37d12e5df09a33f7b8aaa79e948ef0f148bb8661fd7b1a6b5ebbe03600c5c63933ffb85fb11c11a99daff88dee9f151cbf1284c9197ef55068011c5cbfd2af3585da0410aac4f21d41ce2d0e3ffdc86f4881fee241757f067919faffa27d1c6e146a973c35368798c9fdd64ecc506cdfb96066fe80efc0307f30156845354474b89f41aaefa3e03a4631ffad5358ea5d7f1f8e52b76f4947b2f803a7742acd202ac7c140a9bda15e2a8d565cfa74cd57857ec090b9ffd415abe6943abf93e117a63f126b99bbf0b421dfde6bf316bce2beee03ff9e03d0492b19ce8de7f4f9608673eabc7e580b10de4df6c7198d4fa9d7d1730388cfc149527233347890e039d961f888959e7794eba56e106022a6f4095ff2f9cc8233cef8a51dd81637bebdc83945e70992f1ac1b2a46705f0fa22652a8e69b4a65276ec41416584602aa0ac41cc8423a5f19038ad67463c8c9bb1471aac683f062e92817b24c569b42187a8d06e34fddb527f1ca085f204ac7df615756f3af52b1019ffe330f44aaa80532198e4f91bc43bb3c3f530844ec5c42388c899c410c7e08823c74944da36320d9b56b924da3cc139c02d944e91189b7d71c0365becb9ede664cc0ce49d5062aa7576f0360d962444747317ef980db89f77b66d6742bc80083a0acc3601979d21f8b67406b099350147536908c7c797db8972a6c75f1a17399200a4a8d2d089301292f46fa983a2523b17fc71a23d90b38f9059ed90b8c1fa54a71cd59001e77ddbe27639434167b5a66166ce11308a9291583758ce1beb877a652848ba291563521ac72348ca29064644faf4212c7e6d0aa718efe2012717e62c8b54671c74dfb8add90320123bdb50901f0eaba445cc7c95df300ac6aa64cdcfb5bd21b2bd1e6dfef48161d9b039e0971aa61e2883a92e83323c18e2923a7128ffd4763caa2fc0beb1bf64272d1fef248eef8d6aca165e1150b1b3da23e4b83de2492b0141420b4a26f1cd1958dfcfc0f8d7315f569e9ee8651f6e6277592bee0adbb7cd1c3dad7f468ff745952b368e17832c22405f0b0d4473a505d0cfb62f6b5f376fe994de8d8eb64299787d0ca80be8c6ddded1f0d76df598065e1b8cbe371928ca3e551a60d5478d5caece54f834440e11b121ae07f6106bc32bf948bf1a2516b0ccb837b7f6405eb8e597ee31a0248b9230da68b6a57f92b303eb857ae41f6c06d6c176d931630b305f068b975017647ba6306706d6c1f4aa98d32679f09a661acdc1ec60609c8caadeeab00dd8c9197ce879e48ba6c05ca3e9c7c8717ce99af107312316e8e8fea6ce61e6c10e0de0dd38e5dabfdf10ffde7a9494dd03effac68d9e40fa9eeb0cd410c3186d126fcda4f77c95a26c55182a365494051a0c7a46461c93331905cf1c851c51ac541997092554fd93e4883ca29111c775a63323293488e1703b15e3a7721b758555769b108ee204f64a94d95672c930b4f22a8299113cb23501b8a27b72c0f9ef2053d88c3c6e418c1eb4378f200efae682dba25827eb2521a01e9b412de35524a1fb1b5393421a19cc26b72515521d2e7ac72e9a42fa477163385703a64a380284a5eae7ac0333c978df5cbf23c07b0aa21ac035db763224a5d5a1b6d8f392287f82b71667f49b6b948b4d80139088f1b96a8595f1dda5baf13612a7f4f58fdd31506781468e9a7256491d08e08f67e2480d19b99e92520c5081df67eb53d7cb4afd4e1011af3420eabc1efdf1e6ef6ffb1161fe2b523887729840149d27dec84711c5542cf530c9c792331353bf046145ee41591adb4cebfc197b55cad207ee123bf01f928e31d2f063ecac733dc84341b0a5d104edbee9b20de985067d098a74cd02202c7ef0b37f66a61f029ac182f94f3c69f0687028c43a9704c216d82822b4de17af5a19e9937417c98497635c840002b0471a0a32b56910183c1168ce5ca30f58ae335c9384ad07238e41ee70824cbc8dccf1dbb7389b86fa720bedb35c874de6b55b7486e798653d3dc394d3ab2a6546b1e0a03256cc9b80aaa79b63f13e7add14310f777232c442c57c442ce546d449f627855bfdf2b9998e15a5b28257c04c616fa8238caa610027c5d889d2ce3d55644d06f12d9f799c7d4246e4f5e10ff41d5c7235106e993ca0140da254b036ca422a3b2494364643b0b3141fa9caa30f77068b3e4899d3b90876fa5bbafdaab07968b36ddcadc961017e1a37031031c0e35ce1e26630c54a9dbeab97dfe0cea9b334cd834d5be1eb0e2606244cace2ffea67bbc3b86f8c8894553b52a86b234155deb24ed2d82ff296878f26e0e35103e1b9ad0b072f39a97ba425118aa5ba5a9fa0775cd96de29323a5baeca4dcd320fba952f84a5fd0417385ca28f8a01edfdaf250a07cfdb9508cea29bbedf26512cdf41a12392a8e461ee36fe05a3485c635cd0d40c4955242a23c7ee02b40b4d7fa14fcbcfe2f566f5981c29c458b94adcb7d513c66e2e4be5e124f04e263d6dd6aa7ddc7b61cecbb9eafadba8aff0e8be3efa82f5063ecf2b861de814941237db554f5545979900cdb2633cdeb08bc4358e04e8494d11bd4a7ef3fa6317529923e991c4bc80cace4fbb1d376e170da9f46930062986ed050adafc2ead92c96b281bd7a834e3f827e7f521c4ba88f12c5d26bf368c748bd00a31527416ff02929ba3b1468215813e5c56e67565ce8f5c792b5aa09d1446fa66f58238b740a30e26c701d91e056c08283cce61db4381a0b1e60469ed7d00b65ea22dcc027afebffe8746f9076ec959e38b1f2818a3b1e3c5ea9fb4bc370d15b5976f002c88232c20f3adbd272b604da91722e668d5636d57e5964f4792b12378b0d670b06fec4b72c83b99d3159f3062d38e6d834cd3fa09b8b688dddbfc24d926cd08aaace802859631c43118972e16b708b02f4397b8501333b8374d07b6175622f3798e32e3b70583f51930e3498e7529292026a419acc60a8d8e17bd6eb1e90a6089580e6f4d4371f796749193112e40a10b8df3027e233dd01a4b66b0c572e7be9b797f8d65e7f877d8a688d157de3f36d85a29e19cc64986ebdbcb55008eb379d176d757bf528270c0f6b41e9edaeca341b7e68a0f74ae0e05ce502af5c275a56d5cc5fb8b77cdc87aa4b61c586a985fddb29e0455453143e934363d9fab03a74a80bd31f09f04b37960fa05ee8bc00df1cdf2c40fffcd5812d438dabb2956b4b53851298f333d9ce99aed2ea2f262405b6473b0510d5e4fce875d01a074501daa94c57b91828ea22b4589734654ec46097f053f2bceddee82e278ef26b28a86391ffb9bd5750842a00d51b6d00408a8c850ace1357e42727ef345a66a65198db9fc25382192387caa0912c097ae923e4642c4e6af56459f017ba28708587585c7786cd2e504d7e1a8f925e28032992426c8d47514d0bc07334b64ac929d19fda5aa3617f1fa55422e772b47b234525767a0d26187033e38f96187b87b7446700f3ab69fb70197c2c36b65d86e87e491c951ad777968685c155194bac29cd67d01725d63bfda30f9c69ee2b05432d54aab1f0ed0c61b2676ccd117035ac19c99ad028aabc5920fb6f3d223a1dc1ee6edf1bfd99745c4291ceaf028ab56e183c04064c56a3edbd2dc607c6fc70bed93c4963c1374762847892dc3999434e4b7049dabcacf09beb670c36d09076e6b66496237b9caf248e72556007cbaadc408bac478814e799ed7cb285f849f9d2e7c7e75415df2e5f42465d2b294f7d32671872a2c21c1f4e502057e73d56319c41fa6eb7f6905b38853e3458282897e15e989461722c9ef35f7182be46d04f8f8a9b72513e71d684412bc591e673c08ebd5346228a140641453348d3182278e7cc65392f65405b96364c2b83cf998e25d1512e239e1a7e23abea869217ec0560f1869f1ae2a27b1786fdd511f1bbe633882542f2959b17a1e031bc00bbfc4500035324f62987b05ddccab55dce6ca37e2342a6c97a3d2bffb3f58d70011bc731480110f9ac379eefa500609f59ccbbc195d917a20a48c83ee2878fb8c2cf7a3c769d6495e030841538777972f57b90831b3c33bcfc2b6ab22038618d90e318d7c01b673188aa5320a8a7719635f5609f7b0b626426d88ee2d49f326850094a875a199ef345d78239ce12aadcc5079dd8a2a0d7a1f1bbdfbb0d84828e2904be96a396375de4a58170a03a5fa6bf4c11b4fc6bc99e8208ae96273b5b58bdf5c977e6d833f1aeb6866e3b1c923831339f76e673eb9a1dd8a36b2089201ad8c4cbcae92232474673165efd71f534250f3474c980d93ee909393b8513bb17eca849fe41a0f153cd62856f5de9a2d98c49423481809b464f6681d39925e9372ab55afb11acc981055f272f8c0eb96e3d89b1fb302c0616970e0abd58bfc974b98692f5ca65bf64be4c082b3ac19f8bf9f87e3f08983d38af6c7597cba8865b21d68ff30d97c34c9c8e957a7e9df6b8bbb24eb764b9b452033aa330ae20dce07882c5ab53f0e5e8a0807fa97162e9965b25460c734f2c9f89fea5df8a84e53fd80d1f8328add271227328f8c5a63f6882b2e1ed17113f3a6513dcceededc2e9a11df1c4170ff9fd4be0cf0e99e18f08cb86421d2927c7646d8fe5d2fd396a8c070556288d669b1e1b51e428c56f5820579f0e8826210422035239a080a1a7fe893e9165ac07fcadb8fe6f96bf6064243061f0a8a8822d33cbee804f313915f4903874032815a2d49d8d2a6e35a01d72687cda576c9b8ed5b190d8be83c66e2dc187bc523f64041e93313a5c76e16fb4d8f4291e33a15c626a2cc719c6cc8f407ec9dcb9de7f7603f84f9414a3af2d481cb130ca41d3810b530eec52dc5220e2631c231330903b987a58333cab9fd48186efe058fbac2e327a3b092308e9878d6778cfa8d315834729a3d4fc4f93579c7a80b80234c5b57d16ff568f2ce3eaa1f6bf8aa53a3912984f9339d77002a3af52ff2c8e16ca0b7609fb5f8d566b8aca477c51866630f0a66e4226e6730d1a5b530638abdf3398513a219edbc19ccb5d08cc3f9addb9a37927e9d6120c1ff34d97b8da4985923405b5706dabe87080dd421cace11508e9f85be451ac5a07663c18197ff25d46400cfaea22a3cfaa61dca7bd48e50071cebc8df346f94eeb2941e7c4a99eaf1413160ab49de76c8f41685ec34b2b85694e03d6893f4ab0bf8952306041d7414ba52288220855b1a17eea810fbcc9cf9e32fa51231661b798926c2746d4c6a6941d8164df386601b3a615fe30ab6384859412afef5c3b319f8f3731e6551c7f5a371396f6038b4b554881cfb3eb8cc3b4c32e72aaeb6f1f1cffda861df90417612933c1b6a1fb8072d83b8cf64d6ab61395805392ba4111cdbee60b591dab0a0fe637af4017fe005331c861343c9b03ea749e15bcab7a79d2fd800a73726fca4d0042020bd35e01b097199b0810f8ea5ef28fc7c15a6b6daf521e612bb8f52963dc240ac60f94cfcfa269d887e2dfae7b1697b2e594b18a6cc31c8ef75f3f3361fb2eaee8e2df6af8fb0e67fcf4c867e51a47d72d6043c38dbd28f9ab520986d93fa8a16af7cb548309c55e237195f1221cfbb70229c87534112d98f060651b09b5c70bab5dbc1621a1cf49904590081715412cac94363db6a0e19c0d67269ee5c3580fb7f0016548d2c5ef7309cf28e7b3fdcd7a54cf448d0070a4010f590815c846c50b02a07e006fa40fed32d680ef295b40898d899f4534a9afc1889a87cd94a59ec6c48defef385eda0cd850a6398c13d8a8a3cff1d4f414a5afaa31efdaafd27072f9f456f9f1102830932522f5f992c8925cf4763ad00a042905a377a21fe01503f30a87aad66c55a542eeac275eb23a355acadab3ee02b022ec0937a3d062854a26b57fd65b6b9a7935d4910865b7e09c9a81b729614555a1f97d8fe82981646563a39e6f9f479a898938411bd861bc5ccdd19a60ec8c6859235da5528e5361c20818446a3c4f2176c219669721641c22db50a0f6883b5d82d33f0ef4c73d96d7562e6e022af81a15aea512fb442c5140903b7e24864c8f6554bcca8df495b04accce70cdbe3dc6b025e2152071f03795876d1032040aa3a9da202f92f18af9ecd7986f0bac82027ada1f36483a9dc6fbb52dc2e4c4334af01d247e28b136bbf2b07e19ad315ca9d7eec4c07443335b8b10a60ff58b70f8de156e8464eef41244fabc00bd296a8f8f0745df93a7f3370bb407c1a9bae4d2e32b3c75e1afb5be2ab6d3e7c6c3a0dba0ec0dbe1f7706139d308563c641eac5b7db902692292def26fe1380c63e566322fbf65ae22906223a0c390b03518043e943c46e209b836dcb7edd50292a398251976b96414f731c584624043d116a7f8075c9e4791df164266e9b6492e58564803b215b207e7f3a374c103fd867ec654941ab4136f886672906a0c61fdf7f576858d20303dd7e014ad60d576565c41c7ac9b7335bb42c2e3d4fbcbcaf349c053ddae0367570625e4839fba2174095b0c968b6ffa1e84f32f0fdac4d788115fc2e1b228ffb4fc676521f09d2a810d8366e97aeb04c02779e94c0bb920849a3d9bb06d47615885084eade4677bf7e033e4f0be5f5c14e3d3c28d236071cc3ce8d343826c38305432455eb2129d98b3e6044678d3b5c3f40a5e0a03c52ff2b206b3365dc9b8196b18660c71936c606cb99efa3da9363027867ba5738f7afedea2ec4b0c9f060102bc965a0fbd31efe643954629ed127d9c2f56e014718b9599e718fead709a3f458723064797d16ae9442f4706d83b7ca4443690b2ab2b9fcf6b047812e32803db2b157b4fb6f6106483b8229689d48624d179df3890aa1d5c8d6483d3ffae285e4358e03c8d70160f2f0b4aa255ae68f2b82c1c61746c6fb83af6a1b5e440e2e8588c89e3fd54b5e245339256b5d4f35623319491cb386e9d16993c062cc221898c890fc8b6d454805fff18ecb26eb17c0d0bf0ead937da0867b125781a299ec8ccb258027b38f72bf8ceeb678c3e99040642c28e9658e77bf668a06de491c2a4319281d881bbd944faf1ecca7fd9591a18ee05c4a1b86d2e0dba8da107387bee066275a64bc15ebd20b4db1aa9710cd4cd108c318a71ff313527594f26638f9c6b631ab5eedfa9da00d267f34040c1e1d8b26599f26235d7d126c73316d0107beea2313041bf4b3f588ccbf91bf8fadb67cfd6e6f3017c8bed19aa0df40f24613d825d4a481e4e6dbd6f48ba9257bb6f3f215978506115c7213602a89be197a3608c680b8cd9114e0f1eb25433dcd4a1f4daec3cd39a83f62edaee450cbe1284b003172e9e2e1d7ad854be60b6865f4a8335d70381196739ad15105f2106467c1212237a77b49a9805d1b6ddb0f6d2fe9ce621a985085c71df3b4357dba226daa480402d23d4028c0b48581c7c1da45807d205067d3eb100bff2dd26e10fee1b04966411174f0f6e0d8d3be376d27b913228c2b6aec48e7cc210e4b0ae35f9a429de563de2a371fb93a4f36824a437045cafc52532728971ec5bb461c281e87cb8f56dc3e2079129624d69ae525ab9c3953ee7c56422d6645df32a4b562bf1c84da68d61ef3f772c7ac71860af2d15f13b160c39069c0164f403ca58bfaa59200ebb4a070d854c341707bf3a0476b5796faf4c957e46bd2c81b55a7348281486808004fb94e489a36ac8ea073317737060407001e4c75a64ce15b2643d8560ad8cc6d7c1d3ba7d7f8a0917ae6d92ecbdf7de72cb2d654a29f40a7f0ac00a2015f087cb9fb242e5f25beb71387a96cb6f73e566dedc48ef1b8f4aa3262a8d37712228252f5f94bc302d2135947ed251a0f493a6d246ee74e6f2cb27a7345045f87dec71f9facc91bdd049a9f4a6aee7efdaa59c33cba836354d7a6b33a354d36addb8c971d29bd3eab6715cd779dffc3ee9fd719de77d1f08a6ecb4567adb0f4ca5acb5b1b9c1993838d21bc77a6de3f5cd8dd738385ee7e8dc98376e48ef1b3a1e73385656a93cc681c3e30c5673b592deab71de9837bc0e31f880f4ad18781daa3e202aaf431c1f90be3683994106d23b830aae846c2daa2ab812526fbf07ae2f398bdf86e715eee1f73e40131db7cb99a5681256fb80b4284ed66a057d098ab3b8dbbddb5dca39b38ca5797487caba1cd7759e67c1f03eefb35eed3ceff3e814ebff7d3f3611f4c0efe7c60bebe29893ca49a97c80983b3936366de3efd7c591021e9d62476b7fde6cb1ac29964eb1f23b1b9b023fafb399d2c6c6c6c69b6f80e3d055a5ae8ba305eefc6ecf91f2fbc9e8a4d2296dce001c872e3707f2b9675e7fff9204c08cabe41bd25d173fedba3802b95344ba19a7859d53497675d2b0d2c515dfbe610cc1658730a0d8e88188024e62928a5480820a48806b74d658777216eb185df247fe4cc7ece12fe6cfc419faf838ab7538ab878fb35a8a0be01e8eb253c7ad97e7f5d15f87b37a38ab75dcf67156ff95610f7f4d1d3efef267e90be01ef6f1bb2e1ef1ae55715541c73cfccc8c81aeeb666662ffb6b06861e207326882f8828408081f52e045882dd488f55bd5e46f76efb68bec2c74df6ffb55fddc5f3980e38965e9d275d670771108265d762872820c199270c01145325c41c512359c11ebe7da51fe61769977f0ab9f99d9ddfd9bba39e79cd9f7cda6db40d92b52f07084093f7881e202505030e60a28b0b800c40a9888410a1a4660e840868816581441b4469a24317d458e6b8575588e58e7b83edc63a208ca042e4e986082bb9cf054a4a4e54c132c5c49b2e79cb22b7bfd9eb31c88dfeccfb0e3bc4164bdd79cdebce3bc9e4468beea9c72877b5aaef866e3bce211ef0edda1ebc35d82f1d96d7ecd9ffee26ac8cdae0f7f410c931ccad860440ace380ad3c40a5a90c1840f42c4867a70e10ba32d36ac31861633361821260b2753d2f0428cdbf7f6edaeafdfe61dfcce6de3efd91523a0cc602106349e865290429636722843ca1a137e8cb37347040f4bbab8029acf80dbba50782882892f653091c5286a0a1dc6b0c265053e1c81011563c498018a2e3448f1812515144da9c2044669486f2e64b3381ef158e4b9f1c4f6f77c57cd1c99f8b77fea44d9912747f338cba794f31ef1ee5013261d6848c114470c710293c1e54b1334184d41c529d6cf551e75ccd3fc95c753c2fe2500171b7a78e2046c6c299259a28e30a3ccd30aca88f51366cafc40f4a4030b530c4921a20541b46102349cd6b81acaf59c55a3d8e7e7b7ab7e8eb9aa6c15f112a60127317090018c333ea010630e54e1850d297a688309333166772539ce923b3b3b3b3b3b3a5c4546002222e4afd155640420222ebbe30f00867db0b4b37377549d976559662793e1eebc23abf117da31bae38ed1d5806a48c48b52c12c1da151810b2840c164e8072e556ce9a10a26c258112b0265863154ce6001130f212843430c4b616c31521303025e1781b8a705bbc9dbf137ba3f7d977559d52c32021091cd4866f5b6d0318f55a9542a22413749e49092994408f2978a7be45315ef002f1167c917410c52c18e2ea65aad6dd7e59efbcd05cb3df72e56eefa11d7a53dfe3bceca4256b97c0471f964485d96b97c7cf3dbb9c746b297afc9cf5ebecc6ec636d8be3f0427bb1d7f43b22eab95523a660f821ebaf23329ab6ca227662d3d16ace4ff0d57aeebf5f029b0fc81d274fdbb2ed500cb496b7cb9f3adacd2325b9674b9ac7cc25048fce57da595fa4a6ba962f3465625556f55b55ad6ed9c6f177cb99ce48222035c4e5a43cced2b1276e33de77daca3f56f2309bb21ead48a63add18f6fc8f7f5fb7bf99d5c795f7f3524f5fd3d849deeacd55a07571fd8fccd8760f33722cb10703e4764d9dafcedcf1f5d362f5bfd40d265b77d29012b66f6ed77e10afcbedd77a970e589ab0f6edee62b7023da88df5780656b7b96adf1db7bfadf77d2b32a30565e12a6f6d21bebddc223ae3b5f86556cc4bee22d7f9ff5b284d5987fed2bcef2f77f7f96bf557553cabf2d9dff0d971ccfdafefd257db80a8cd5eee8d5a7a111edeb775a3836905e732fc73d10be2f8eda8360e866af65997596ffe0f2e11fc4dfe5ef8345d7b6efc8606ebf07bca36f7f777b27e9eb1961fb880e4e3441a191018d18b13640165b9068a38931a06c89757b0d1df3743e495811fc256d22d04395ed3751255bf23b1ede01def75726e517912df9dcfb11d735a28dae1e96bef6fdfd707533d8be54ca1d67491e062f0ff7c8ef54602ce79f04d8e9665f447eadf2816e75ad2ab0bd2756807b962d1f81ae87e35f1edee12f7f03865d805bf2b71fe075b1480bb684a3a0eeb92fc1fbed4be89efbcd055bc251fd12b6f7be04eebbefb7b923cf95bf12a2bdbf8be3caf2cdf1a2d80c9861060ca71bc2e8c2892464f8d0822acc302d114505c6da957f08db7b1f02f7ddcac50fb6f73e687befab18c47df7fea240d788ffe8f242962d1f59ab943e2a3076de91c79fba1f716de10cab6caf92b04df4a957256135267d9c25a5b07f479f2b1f89fc25f28bc81f413e11756f86b6f62bbff8f592dfed815735856dde015ee76f889db307fb77fceb7f5d129643cc1047c860c50e658089f9fb48581024d4b060ca17596a7012f37f091bc2b266892a68b688716223e663a0c0e4841067ac60068a983ff3380d5b144a98c9628d14b4e00aae05556650a20b169e28c302cf0a1e96ce4c69e2a40b00a0008616393889a1864919287e60618736d04065e113830926a0619283172a8491c60b60b4f8e084082c47b1dec2883164c658628c1250b019629c008523c0c0e26486a1262e1091260a2598a26078ea98877ac837c9103944def92e92903d091cf42b515d1edcd343e49a350c6056cf24728d1a09f41a2992c000eee99720f02b9b279844de4cf4e19efeeccacfaee46c22e0431467f1e59bddd1e7f6b74f8f97301e1386090f6984185383090358c1531037a031c40a44c4faad84752b50b106982d699c9888e150912445114614356d8921258101e572d2175f2e079793be88728bf8cbbf896ef703054120c88eb3da593e3d46289201671571560674ceb047fc357253910c38ac89624448b016c15f3e1256631fd4111647acc0888828d6cc4caa7641c9263ae619dd480b3328db2aeefe406ed36aed544dd9a46a4adcf1d7cdf33f8fcf73009ef983f82b7cfe0efca5c1f303f92be7f983fce53d3f117f89cf2f824753cfcf92b00d9ec3adb590e3d0749d7b7cb9d0af0e1b3d314ad9017c5f85005f85f55d7d2ed4fec32a03f81a5611c07b6115d6876115027c0004f022eb3520806c5107c7125c6dbb1f1bf57ec13df4e31efa3e9cae61854f53bbfce57c614e8e1a04089bbc8fe2ac61cf2cfda080a652a91450d052e63e3d7cb22c48074a3e7d40006983b0493ff90236789eb049d1c73610fb8cb7e8a3f031f6058c3937a5a552a954910c34655e6ade8ecaef27c5cac1aaf4fb49111121ccb66da9d4a73efb7e522e1dae0184ede42d2b4ad169244aa0a8ec543baaec1be1c8d3b681cff3365f37759e4e1335a1e057bf9be695765db64488a3346ddbc4310417ac5ae77dd3e6584debbaf013b51dd0b09c94a6e87217276a6edfae6ab3edf7d9f7f37511edc05abbad829be7d5ba6d75dbb6ad82bf816037659639a87da236e57a11efe0e8a7756f5b1269d39dfa40ae6dba33ef0b37ea7d9e5f1fdef9f06d7b0eb53970b7ccac82fe6e7cb0fdfc364eb6eb9a43d2d24eaf1471b38596b12aba8375d1dbaa46bd4e7ab6724f96514dab35b56dfc1cc762eea647330d1c876ed3ef07070d7664a6cbdf2129996f7370dc603baebc794feed16a6a9333939f4d97618a73eabc0fb4a954aa39701cf27efc56aedab6d12d9b72dbbc3f1014c710dcd651d3fdf4395dfacde6dfd031cfb85db9f5b78cbf0d880fefb8fbf17dabcf3bbee7e781f9196f5577f25625c33df54701f0f02f9803eacf63ebf2955b3f64d89cc2ad9afa8e16a19424a6c915ad89a3d4fd82790d3ee3d669e66e516961a978c2eb32d622b3af3fad4818fd3a97a4d29dd4085b7f36f9ab6ffd398679f0ad3fbdb8b5d61647952afb7eb2ad05ab8942475414da8088231788629a58b52525a218c74e906bd6c48efcc7ba794b3ff569c774c255107d9dd711851680438c8a9ffd28c3dcfa43312d5c05694f9faee48f52e9d6cfc4512e09b509842062232654026f866d0b19b123ee87621eeb187317169eb022265482ae85d891cd97808aa12576c4fd68ef0270888daa5badd8ac89bfbcafa03771abbeaff9b9e5d67162e9e1d69f4ef6d6a9464e2f7532b9c490e19c1f7d8c9b1f1dcdadce0619de64a7f44c1c55ef503829374516e7475f923937a23789dedf0f10cbd60ae7478954add8ecebd730bc83bddcfa338cbfc0af3f99e61486c9a86da630b3f854e3302039c5b88fd9935bc7ccc9ad63d6e4d699e6d67966642f3e9170f6f9e5d6efb250ca2809935f30d4ad3fce14a4995b65148ef881c7a82891b210bc3a64ec28a374c4d85122dd5a5f22f10e2e0c7389a344b2e268a9b855d4e25697225bf5a1b4401c2b2de2bbfd11d17e5a91adfafc85407f4a912d1d30ac3779930a09eb1d2dc28e538a07ddcff79bc7097338abbe874980f06539abbe904ea444d8fe29d6f725d605c51ac559f5eb07c4131d4ad8dd6ef3ba90bb53e91639cb9ddc63c2d6e7cad8d1752bd04d4842d747c23bb6af0f24eb575bbfdbae43c97e936263e5d62b24f494c23dd59bbc55bf566b55f5bf88fee4acfa9de84dceaabfe90cf1e42feebebe3b75d9f7d36d73eb365147089b89cc3dd994c2adfa5ba731d92430acdcfaeee4afefebfb99e6e15f1ffc2f742767d5ff446fe29efa43d8714a19bde9d69f526a6f534ae67455bc438584edad8a46b62b9f6b7042d7bd03bc4c7f7ef77cfa73663658a942c2f6f38f16c7bfad4da06f159dfbfa4f5b497627fd2addb38475227babc76a650d1df3b49c1ef36bcea7f5ce9ffcd2c4d5f6dabbee14579b9824c98fec6affc3ffceecfb99dc4b5693e5629128f197fcea2c96b3b2f9fd645f07435d85cbe12c774e646f217196bf13abe23aa904090d05090d31b7ce1aebaa1ebb010058e7fae7f08eee905bfcad8a80cb0cb8cccc2fdf23c2720008219c86d0410a13acd0019834a288a2018da215c498e77c17bf0ffff3b37829882e8316e4bb7c9ee5ecae3d6114d5c4dd356666ae4aae11fe239ec71f106e0e467aeb53edc7a714c64e40b174f8e8a032bd8f17a525ea5af5ac1a4e6ebf4a8da5baa3699a3656165fb23767f5799666a6892861aef633c7daed7dfbeeb5ef38864292f9e682f51e7c9bf74c1c6b4a053ed28f2c5b6bcada4fa51adf63b1474e3ce232325feba40cb30fbc07bf02de836205beafe2c89f1d715d4dd34495670e44c447902ff4eae59c7631a7b8ea1f8a69efdf50242c13572d0235994f7f28963d0d8b844864cb7f8651d7ffcb78a1a3a0f9f4858e82b29f2f7414543f7b4ddc4421966cf9ab64cb9f8a2c5b33f3af4dcf31edc7fa1cd344a5f923eb7a26aea4b8aa40f6da07cdafa2d051502694fd508c63545cb518c459ee2161dd1f89ff12ff22236421cb9694e23eaf482121e1ac7e6666e690382d482a95bfbe2ada6b91304dacb2c85f7d47f79a02ddc1aef8872e8f59d1a53bd83193f223ece7ac90b95295195dfe01506147151fc98caef4b08af69c16c969a9b7725a9cd59994db3f725a6e7f7625d39249c9aca490948238cb87b3fa419519ac46c85f4df4c174be3f4807404a96f8abfbfe2087a964abe96b7235a4bb5cb81ac23df8a068a43a8b4150ac5e379dc5f6e63cfb6b2524f5e0a7721e14c7e92cfba038e6dc9c21e0a7fe26ec409cf71b9cbf1157436edee681dc88ecac1c1c71041f047d6fbebecd0f797f137a0ffa9096bf1f6b82ede12f10fc54d8371506e90b7e90bfc06ff0035aa2a48320a10f6f0579ab5febc167ae4b8aa38bde15fb77ecd1df50fa9ba88ba4e4b8a606d267affd50acd237c1506c0ec5561fd0d73e88ca17a241f33351688a2b176bcc7a39d85792f28235da4041164659c486887848811921b224c184536cc8042f94d9e2c415252992621c00f103104d5411c415505c4bc79e0a96bb9cf0e58e6da5caed1f9b876b45ca652e97bb9c204667cd3bab7f70565f11db8ab3fa690d76fc3b4295544a747e1f92430f3be0738d70473f20dc774fbf1f557807f7fd3bbcc36f7ff3c03b3a7147ec197672b0da2be11de0f71791b020b2d5db8f1a70bd1dd7171473b88739c8d673f9eb0697ff131f0097991395b670d4e08e7f55771c198d3ad6233eccc57e7b69628b0d39643105991362fd4b244cc88421cad042c309515ec4fa8b8c801446e70da5a388fd445bc212751192251df3f72161d55a95ea5721cc12e44fb1869095303f13637fddfbfd3b96301fb2e5efe33efcc4aa56f5d7592070cc47b6fc93ec7b0c4434f1c50b2cb0c812731aa6f80206335c30e386a898bbbfb4dcd352daa71a1d4be9cf4e04e846894662e425207f7155498c264a65ce5cf948fcc54a66a25cf94a263bc06e5d985cb91bd492ef7b207f7d747bf92ba0d4af40e058ea5721dca4fe266ca2b0e807a809544bfe976139063e41c3d10bb05021228addbccd1f05d94f7d4a143a5a7d90fa9b0f4afd8d2874e42fc4b2c5b2957a1b51a8ca96fc94c8922df95654712cf5634d892b7f8ead5cf4215bd243026a0053c4d0850f4cccc01245d10d5ec4a861c6099517beafa1f7fd5eff11ef722010bd711c5b84ebfefe2c85eef61e8e39eed75bfd8dfb8e535d77e77e86494ad071ffd1efe7cb66c646fa73ef0e866e67f5b9a7b5bb5962842ca8a0200a12555061fa20ea09852f6b9ce1c428261fc9922020ffee95ccf75013a269e2c83f24648aabf9435da7e4b6904fc8f6b79558099b281472966424ce923fafffb6f2f7ae406dc08a35a420838b0b3eb080d872020e2d7469810531f940446818e42c2253ecf338edd005140a498459212687ae88b182c60b0c51b82813938f44fe12f959c88ee4b9cd109d13e4f63395828ff8642209f31ef1b93dbfe8d2e4ccdd71b94b932bb74b31ad3a6b2ca53cd8197a5f6fd4d8f188cfbfcb5f46b497af7d36eafc30f78c39b78a23fdf997fad41c777f2b84fdebf2f7f17f7f5697410b96fa7c2cd68eb32c9bef72183771858888c8849808683c39492335c47021a1a1e58eaca446989bdbfc74fbb34939298d283051502e274531f198e3f69aa14bc51590bef43535567adfe228443dfe79c4aba27d95304d54cd5b256cc6faad4c42c240a043992bac68c38631bc88f50791300f629042862d9ec0d2248d58bfcba789a853376baddcc3c373831d5d5787bfa6e7d3aea3f6c840af4e88a185cc9a32606ce8e1c109263544d5e082342ee8ba145387b9fccee4622ebf0ce34c4e4d33a35a9db54aef4ab5bad58debbce979d2dbab1e33d779df123841507a83489cc7ecf107a6bc30cccce28459fe71de76b08b1f1cb83219f344ca1427f0e1288a98db4d517e58ea98a7bb87b3fc5b87b35c477f8ebff8b67875601c34d8295556ecbc2efb25ef88a12bc2aa7edadd5d4a972e59d765ed6e76253a6686751df30e7b97266a722e27a14165877bb8dfd61d156ce39e137776444a67e634ebec6624c8329a4d1e874180bdb097072c89d0052888c803267353189df4727887f6fc0be01df279a9c76e70017059876139f2bbd58fbefd7e9b7bb297dc0e5ef6913022b2e55fabb5619e8854a9ace5f04e0b5cf91d5e39998a3b0ef3e1c9f1196ac366c05f23af21224291a13a99355b8a53868a050e5d544183491042483124c39a2554f0840937b4b0020d2095adc5d47ab90b13a43baab4321db775b1f6f22bc3e66736f5b2c54fc35a67c65ea6933f76bff7339fa71453612c3f773929cd1177acb77938111b779c38f41593067b73b98b0962f0889793bcb861cdbc3eb38adb2dc597fa6b7fc7d4803bf28c3996a4944ccf239f41c01d394d13a63bb6932ceed84fae7c1e3bca954dc50562d810828d24aefc5703c395cf5233c595ef7ac1942bdfc7c70bceb8f283105df9406d185df9448a0c71e58fd086d2958fc4c995bf24094e5ac3c56806ee4274e6caef6282972b5b7646c5de5c864d2f52b444714516221ad2888db60bd4931bd82033861660625c6401f6acd7f3972482260a13d0f090851461c4180d355d9e9e0ca1431719625b8cd14410f91dcc98f434303ced161df38cb2e9caf9d9d3e729ae3ef0ef0f2113d9c5ecfd331a7648bf9fbe4b5e915724928ee6d12f9f25e5952bdfc3ac5640da83c0314dd4be8a26ba644bca7731cda3af7c69c59596240d5d8b235df9b2c95d22d131cfa819ddfadf3fc7aa84ad28f507477b6f9effdae7d10586f67bf0bf1fb3a8261c1c0a459b6e7d5a84f320700c470ca10a8e289ba893e611c65f4d8940ffe8cb7074a25b6fc297ad6ac5e657f48762b2295c511148b638308e88621c3bea1fffda2f225bf5e5832f7414f4bd7ca1a3a0d47fefa2d05190bfad424741e0bb28e40314a528249412e5d2734cfee88a4971459f63489fb8f278c945f9df87003e159138abfe12d9aa552e3194841971610a1cd074a146cc12b1faf249c24430630c2b6552f0031932b1fa72a93e1876912c025fcaa5a286225bf5bfb0b5855d057defffbdd7fab2298bcaa26891746a1e57fcd5b00634418ad59761780aa318c7388bbaf55b8bbf562070ac49954bb2557fb5024a3d081c0b21f55552a26c92adfa52cc184f886efd46a279f4adef45feb2d257248c63f5003f24858114e3d8d00a64949a94c048f9c2ec49b6ea268e19d4adaf03c68e72897e4c33d28632ef54d0d4df8de0ac2e525f7b0f41f0582bc9563fad61fd3043b1ae863464a495fff6433121a5958bab0fe8d70fa25fdf5d0caabf89422f5bf285e4506c28d6b5f703a4922df956d829dac438266bada1e51e4941d001c37293bbd4b274fd253373376b9ae4dadddd4d3d244a96083591c3367b25473979ab53b0939dba2905dde474c73e13d54efdd44d59946d5f9a5f7e9cd399db61f09991e066ef61f60999d74826afe6cd9a04adbc43b4db0c77293f27f3cc85861db3ed3331c7b91f354df4e7b699b9f3dcd6b215cf9869afcd6ce8be125df59757667172add3fb6f10d99ece92fea31c9aed5a7c136378803082034a6d44e1841429baa8428b3394a0550431c41254c0a892451a7e33c6eeec6c5ed871c73fc7ceabccb8a2b47065cc142640a920893066727628d1e48b35463de420048e2776545de7f1a9b386e561bd2375432e6031c30950a470c59a206a165060bc2ac61817b8b8e00c1064d8b8c08e39b029868e2f551ca1050b261aca600105e566c8072f30a421c411485bb86881f252460a231b8ed81883af28638d4d182bbca026892eca90c1640b194b50d1040e53ba582385d8a83a018c262cd8b22685a32315130268262c278049586078160021c2e2a4cb18589a60c8524316224cd8020d259ec034beb6c2f53baacad3a3ea7a17266c28e07217264a17bcdc85899a2b664e3592c052830bc2a862c4155dc5192b727c8a0c4c3c5101c2c9c9f3b225ec9d97256cc6dcdd0b7771a609c76082a0128399145660030b331568a44030634a0e3d8839a18ca3293bb8f1c48e7f5dcaf937470f155f1d3f19a0c0f2f86c89a53a8b4160e274051565b068028d589120971f44c26a2f5d993486962baf648a820a1a92b8d822871762521c8ff0d395520363a594b04dd454db268e55cca1e2583371b4538c4999e3b08ef94b1f7a8db5b99c244697c9458c21be8881025781ed2e278901450ca3a79aaa1da735ceedb756d8b1be8be7fa38ab7538cbc98516be368c526b5ef09a6801cfc8d059f9ba70813b61c9b38285cd84a62e8aa21a86eb52a4dd17346d5764a0562a191c66c898446964548861de3544344ac6889ab2ea2a038357db366682d1fc7eaa4bd6302f344f133e6d28c916d70a8612acfd3d87714ce5ffbc83e7b2b336916fec8428d9e25b6bbdd561b349d3b890c75bd6abd5aacc68a918aca05e8d25c35cdeeaa7edb76dacb0af3ec27373883c2c2b367539890ba32bb9e082c855d822ea4a186ccee5a42d9caa992bbd853bdeeaf750d54f2cf0e15c31b89cc44515775e4e7a02e38eaa4b44d74d79e305dbcf9476925e33278bb9b3c79c734ee9934d4a754c4ae99c3367ba171e0fd9fde7289f4e7166c059d23bc5cc2ca59472642e32ec5a552a7f76e7e9578a6392ebb46dbe7463872b21248097ff0097c5ee39a7bbbf9340c701dc164958b992ecb2b37c74f755773334020279ab8820fbedf217348988827a0631522c1359b684f4cb1d7a495092adfe6e2b21fd3a42588f84799564b7de1ece926c74b265cb9e73ce29e98f926546bfe953d621a564b94a25db480665d87ecdc7a505f1ed8bed8b0cca701e9da339e06f297586b0fd45feca39e94f0dae115a65d8e3d09552ece19f0bdabf9bd997f22c4ead37268ea1db0160a581a45c9dbcc4630e2a2c97018e1d1c9f4a85c10d15007e6addf799dc68e53c1fdcf277a48c0adbd11b18508a73a3f3fda0322727e7b3d6a66c3490329433a39b56b917e44f77647f64df9afa545a2cb783dabf2af7fd5411fc7e480878decc9e0e913f5ffb869470b3ebd788177e3f529c99a4731ed99f19422048d6c44e91fe643fa668a14caa55ee9983506de3bcef2703e79c93665ea7cdae4baec63c853c6d529effcd4b7ddba45ae53acfc8b79915f9bb6d5cd576542a9af252b4083b81708cb2ce386fdb7e6edfddf6b3cbbe736edbc2203a644c5e823bdf6f673d39676773f3fdd0f74f0b62fad0c17a481b934d0fa57ae8b8dba54baa75b5f33e6ef2ac55e51879729867f5ac8eec328bc8cd26b3ea5637715cc255e8d28fe7fbfebd94f7ac202e7fcdccfb36cdc572ee3b1189e3fcd5fdedbedb6edd3ceffbb84ef43a6e87fb54aacda6080b3eff4e8ee6215f5e7e9ba3e261a5c22021cbd60f900fd9c27181fe54edfba161c6acba8d21b8cdacfadb27645e2e9b24d8bee3b81dac9506f97ea838214073e8676d3307b284fb09c1f170be1ffa3dfc452f7f97437bf8e01e2c76721304421fcef2cfa8582ff31efea2b31d5461de56dd795d6de5d6dba598cced05dc1cae7e1f27b75f0bb8445c04873911111191512c7b244c6017f593feb1a3d8da3c7254133dd97079fc68f5c54ed39bd9d7ec6d992e377b2ee32753cd69a5fc92e3ca9ff22b0df255465c19861a57b2a0cb954e4857ba18e65f19c6316f2b77486bcac4f4d78ae5ffb49793c0d052dd8b62bf9fd56ffb553da5eb523e3dea9ce04ac8bc4da75899bac1923dd9d1cb022ea401c3a94932dd5103eb2ca5b4f9c27a51a8e0e58eecc5f539b51d7fb158ff2a95b539ceda496335202a71c759ae627d2078cc7bfe3ee89827be6cb16047af5aca2a6d7e3f5db78629d5348d366d5fd8e9b02647f351f8187d7ffeb15d16ab11cc0818e7cb21b6c99cc1523ef1c4134f3cf1c419fce59061fbd9fe30439d0184a73a07caf673b7f79037081a4afa4301050e282c7f430d99fe72470af91b8a77709fc1527a0ad08f4c058e282c83b95324a17fdc681c5158fef6261d27c0ce577f544affbecdb429eda694d226774c5dff7ee0607946479f551a779f7d27c1d46ca7dadd9a1c55fba07d143e067ed75e461f0c3966438e75d3ab927a302cfa18f8366c82c2c740b1e86329b1997eda9cfd75afb64ab3399b9bdcc7715fbfede3ef27497d207c6596651909db6ba1f69fec4f9361d6029bae1e45a3bd9452ce4ca3b56d4ef5b23087b392d278b953279be1f37ce735f7292f0b691adff7c335fa1d8ecdb229bb7e43705cca79ed79ddd3fb3cc8424a43ed046b80cb4a667eb8a9d0003130e418e82c172bc70b59f6158089fd6698dd4c74e5e0eef6fdf0cba2c2d66fcdcee9c3c16f088e3ba5f77990515a6f789a9d2f2595947e3f5f0b571fb755a9d1ec33cda314030cbaaefbaac1f7d3519ae58eaca6f4334d6a9a465fa35a6b54f47c356674f13361f9fb01bfd8ea3efe1a59294817547a090b304bd55c5645332d6b4dd3fa332b612ed9f2afd5950939cbbf899ce5fd852e5756e50bc1639fb884be8088848da05bfe4caeafd031503444b084978082323198eed83ad4ad3bd71943c43bda033fcfab5de2a5ef477999f200790794e5660afcb8eee66aad75e3c24efd16fed4e742205da83d90842d898ae2a85a6b98b560732f057e32ab9cc769d9e7814d6bc1cd05f7d0bfb1af7afbf61bcc62fbab16de2c91b086c20c258aa144759c4d779ec79f90ae6d3cbb75f5e2789ca6d5dad5aedbbcfaab54fd15587ff5556eebbaaeebb6ee6fd8685da55dcd40fbd1bada69936f7c38f81b82430332c6497f3fbc86da65316a2eeb721217686e77c3637fd9fcd675dbd66de1ca03bf6ddb58ec529b4d286f7f40988dab697ebb54f7a9c709fb723a9ff339fed211c7a1aba393921f10e622f3329cefa6970abbeff8fbc16c5c4db2ac5d6bede6496daf13e6b09094e7ac1eaadf0ff79cbaf1fafbd11ae7d3c46c0cdbdfe9785c57bfa31e4ec8979de56915075b5f7bef93f44dbd114dcc7156d32bac36cdc0e1d5ef47c3c0ebba59b31982e3500a343a6937a5dd1b80f55321dfda81d65f5e576d1a9acdf707e40753976e0a23c60b63e3cd9cecc67b2f057e36bfbdcd8d4d2a95e36d9d8e8d77b7e79efb9efbbcd4d71008ff68df75e1f640927ea87d7fdd6bdd8971561266d1effa2269285209efd89eaab4f416cd01fd2f1473e96fa197db5a700f942f2e7dda6ba8ceb8b4cd5cfa9a18867ba8133b72d4a5f49708f18ebea90ffc6cbc8ee98ebd46121dc065753800dcf88f195ce696ffe84ee4718f142b7ff4dc55a5f3974f7f72dd48b7da9413574232ca3b9ac7f623275df6323297cb0cb88c80cbadf0320e1bd676f93b1b41b694ea92e5302c1f17278e2e16eb5f25c58c3579b497e6c07ff49e734e8d6f966559bf16fe643f8284b5926cf92bf5936c79691e4ea539f0f771b958ac7f95ca5a2aed85fe0c333456f693844923b7aa7f16cbe5734769247b60982fc996bf8a8bddc24b58aebf349230bf225b2a2a8e2aeb578c240ccc817f0da50cccf2772acdc3bfb4520df7cb1d9dca751984aa75b8ae54e53a9411f7aca0fd288d74a4cda959289f38cbbfdbb4ac7a35d39ee739eec77fe01eff4e7e3f788c67d9abdf4fa67296bbf61dcdda3da09a26ba1567f9c7d02dff1bc2ec70bd5ba3f4e1a967b8fe7ec506ffd23c640ccd813f16a51eaefb142d4faeffe8535034240cdce3d2887bfc3515ece856acf80f15fc7e54bc4313c721693d9a8406893b4a30d75fda78a669e21882db371ef38e6e1e7cbd73b18d4ee7049667ac73ceee7d782b49988c49b9f39d15c53bba5b83612ec591646bfe7418ee7415ee7413c23471d39beeec445a245b921ac9967ca8f19f9a3acccd6022b9144991aea4e22c69c5593293c23d92165df97fb39925ea8e540bd207325689c699e5ca1fa9166ff1e7cc32b52051af644d1df3705bddb6add65a2b277f634deca6336738aa9dfaa99bce5cf9479028f1a56c4b6b5bfd5e5e137f75d93b94b3e4f793b3e4df8862475ff225287f752faf338511e34edfcbf733fef25e6a1cc7711cd1173a53f53677f70f5cebb88ee3388ee37e96f86b1ca263d8b19ffac95f7dc65f2ce42cb9840ba7b3b89f889c497ed7dfb5d65aab8f477234d1975660a574314f4c1ec697b235ecc869ae7c254b849aba7e28acb52858b9dcc5045fae3fec7217133ca962c79d162c7769a2a6dd7d1ed045852c97bb14295d035cee5214e5ee3c8fbf3458fdece507c29fa0011411111151ac8afffdec781f594d5489e34e8e673761d8692f4f86d4b54a635e55cbac852bafdbaaa6f1a77d2b21b46a5f438ddf56ed059df46a7deb2feeeb6bdbb6852bfb791de536f0eb835fbf72a9edeb6f627d6da3692c5ff6c24474557eadb3b20782c387cf6f080ef0f9f3a03ef8d5c14d1c876e15333496ab6a76bf859c27aabc5cdeb6a7f539cadadc9e7b0e579fd76d9459ab5cfdae32b76962a59968e4c11e7af28e9ea2463465e73527c65dced93de777f79c995579e14b551361b56f7154b5ecf9c939e79c73ced933f3e4f7237b6a1e75df3409d4cf83ec7dcc714d9c9ec33a0666b3cbb6aa6593e33a8edb3c3ba7cca494cd6d5593946619cd6696655fe5dc001c439089ae1ebed236ac44c1ebf7f7d3a13901d7efce19d142ff24507f7bf69e6af5db5e0bb7ef5a506bd7811ee86d42b410fcae867efbfb799e1350ff7e34277280ba5dcbb8dcea87dfefbfe7db71a779ddd3fa7d69ddf8f3a0f3eacf075e4e42f3e5d6d0efd7d19417324f6e95e0652f644c70b5af6d63b55abfe3c2cdda54d7759e57bbaec3f16ae8b776b57e97533bbf36e1f83d354dd3b82ce3c4aaad90c5bd5e55e14db1aaa9524a9ed212e1305180c344810c4f7efc90c188597c9959b3890b2873eabb29bd54ea7db8166668bc90e5ac90e7b3e227a521ba5c41eff3b80d044170d37cf8c679a9507bff52afa542ed6dc83765a5067aa067434e85148df7d9efbaf6b68ff5fd58f179a258ed4b794969a05cefb3afd355d0fb3efb5a48d3d8bedc040b3fdceefb290013db5d6e82052957bb9dc8e2be1f7ec194077ef6bbea7d077a1c0ee881decd6f7f8373e379def7799e27de78369ffdedfbd1bafadd5c3b7a37e53de7dd78a94fa552a0077aa9df3ec5e1e0d430f5a954bfeafb49712a2fc502953b72d0ecac811ee8f1e6ce6dae0c5ab82f95b36894cdd171dec1b73fcb5cd3681279352dcbb8ad769644e8ae863c7d3bdf9361953f5639c324f2ae84684f65c6f5f7e5be2118dc16c710745dd7691fe7f9f733b9a7df7329a5a6494dd33419d2efa4d675f742911377d5957674e950a5f074e5ef48cf1675d2c747c9ed9d63e69c33851f5ece3c738ccde16fd35cff1c58c7aa06f8c387c28e5306a31ea8744cb7b4454d2ac5684400000000c314002028140e080543a1603cd8d5b50714000e8d9e4466489b8903254a611832c6104280218018202000303244c206941b9faa46376312ff1a63a5c71b4fbacf63e9a9071df7b380c69b34fdd16da3b7909ede06979d6c0d6281ae85a7314e100c70c7edd1c427ae349df306b1cf8aca32ce9dba0849656973dcb9cc03e8ce604e1ba7dc5df41049232033b25b32d714dd718af9d4c2ac61a45fd4b2d23f2244047c96285ad220c6ccff90adb41309107061c5f317243a37115906b460931e54e710c50e60880b357865f246da1a901344a80ad7d0b0dab501432a9978ddc6d9162e52e09365f1810dbfd4e7704d333401fc7b7a94c2099353226ec48024d3881ceb4eeb8ad073be49281aafa0ce44f9929dc5f316fc73eb775edba78c19dbb2db8f2fc49611e316426fb0001700f684422949cf306f190c84bbc8566142827af98ea999c8c1f479a23d4f45b0147929290d4b4df0aa65fe94a531b941d0dce236274c6628e3e6d4151b9b1c1a2b1b86b020eb338df9a0be7289ce5de752fb840416b836549e33de0a036c8e58725ff7bed54d7ee02a37d7bc807f5fe36637cafab576efb40d46e6d7f9e9a7844b58edf948b0d173838bfef5d7b4b2b556fa034e70afe251bf16c5d444913aaf59f81b9ad064fccc99f70ac213294fdbd8847bde78c19a0c9d0142d53d041022a0374ad9160534cc753b33e029c14ab0499041317b0dc0c8d8990649a588ffebe3cf3011b4099ba42f04a5264958f2f082fb1ffaab260586d0d88c9e359b3d43bd2ba4cd1d142f85c757354e23e128282ccbed6cb1f47451f30b02aadef5b35a24798615558b99cdccd61534db2d00f714237ba294eb80f90677006c8741ff8a3e96f80056e61432c11877f15b0819482d145a98003fedc2acf134ad9962a5fbb77d899f845c48f8710a2b6035152370abfc199ff3c43e6bc581f5f14d8499b7de720b84056b7e6a6fca9e7ab01532ebfb033895353f3c692a263ca2e6f24baf10e6a68090654c5a044b9e4149ceeb7b436e79bb04630fc408767efea4225facd7624e0850ea779b279b52efbc0722c5fa347ad3f8dba07fb862af8612a39b7f94b34f96cd42f8beef4d6edde5a9ae163865fc81edf7bf7151530f96470f1960b6d58b02c13df9fa81cc1233050161b8896c51e2aae7c8e2bae7a8e72f1ca6ef89e8cfa8169a9b7414d5f40ea8784ef2606e4c16cbca59ab6929741e5b96b27e70f06701ab66ba40abf38fd8e47045a5fafebc80dbb461b805627274869d20c2c378428c8acacb9fb57ae4dda63c985aeeda0cd8a7da4a5b7c3e0670bbbf11c73e16d6a2631650d407edcc3547a9d6da4185631d26c937735a7532a0d9415286cf904e2c3963d25dccdc12a13a461b451a7931ab8c2ece1e4f5a5bd3258607854b969eefa3d4cd638a9aa380d3773890ca1861c419c103840d3e057cd9cb9ddf0c644ce90e170c7c3516dc73609c21290d30704ec75caf3d238a9b4f200b757274e111914d6ffbdd9e5045050baec1de7f06f5d8877e0c561ba7cd5ea379e1a04db2368b6e123977cefcc9bbcaafce1783b3c230f8131899c535ea63644cc37ffe734874d6849ff8fccacb30e5dab7c186078ef88277e0190c7e1bb0fd7c71420a3027c2f51257d14a4ee2f112b2cf61ce057fe35319557e40844d9741b9deb38bebe9c0949419581620f65eb05e2d026b6b51f8a12d01099febd25afb38b15d2c4a5792f729db721ed5a755e106671a03cadc0a2f4cc23e5686948fc58bfb44ef8720bdf95c8e3ceba67b1853f750d4db7dac1e3393daa3d51fe9659a2406ec8c3bdae3861b9dfd3c28acd484230093e2cf7eacd3ed6920e69609d11341e9eb9fb445344f114da2e70d77a40797743e96e6db611e2093bf8f7adf8b677c41d441d255ac01377146e6c52e3935b468a9ef3596154c9fc2e781164a87170010450a68a0851f3b953c49f8fa62ddcf9fb2ddeac306c7b6f3978382ef3f83b61fef9494b6befea32660e113d5d838899c51959ec64d79355aa0e1f6464d2d960536c081a58460c858e8394e258033d898cb2b9ede158e651e46ed5bf001289e80dba61149ed4408491223039689623a40dcfc16a1eccaf6b6deb207446fd3db741b7f6bb0b0786f09e4941b284544ff13f86687d48e72c51b54d544f18f89a2000a7be04d8ec2126b25b66749f709d5732809412b31231c4370d6a80dab984e5837f548ce08af858e8ba3961625ccbb990c6785498a9f7a90779ac7c43d79bafd705e9d97b944d32628c44dc0b346c1010e94daf7019e6781d60a0c87102eb56af399bb7d1c0c277b6d7a7aa6c027c99afbabf8c11b12ad567c8a47989bc54880591c1d46a18e3ccc0399a1cce64c809bf5d4de8e5b6bb3e246a052c9af69c8cd473e27f012a118dd7744ae4d915b4b23a78d149877e428977f029ce7026fad3e169243ed0bbb655f5faa911b67eb618805942e1109a5207d50718250a3db8b3f4de5e6a9e5a1da7877e552af891ac957af801cbd6d5f678baa757cda210cc8bdbb368e35266b27967c71ceae0f1c19752a3ee156b530206fdecb3e51302b03a930420e59edf84265e926db99c09880c7ee24e5f98509700d63e921e48cf5b9096d93d3c6e68d6d4db7c77cf5ed5cd8352f590b63ab37d7f820bbc4261d6856c02ced5e1c76cdedd4203e80e32ce2cea446e2d05ee8b9a72fa5d0d4e4a3cca4723fcac7c13256f4285a9600a005921a479bffb06acc5b8bd9239bcb24933a474c0ef2ec07ddb074508cc35006d1a6f924363ddafb888df5d77cb1d8e0042f40476a38281da9de802485ae729eb0c7eb989d3ecccb306e425bc3882b85590737da37ca20614bec5f669a33cc1276f9b8ee5cee5f14c0207893240e2137e441378200d6e3a0dc36a82b40e4e350ec9c56671c3d6bfa58eda974603512a0b75051b0c2f57175527613a9e8c0359d9daaa1b7c0b19490c4aa01b5a6f8c6337128f459629dfcd75c1eead2f99a33cb61e85a005e43aa6c00f507230b6441d6c2f767db5875bb5c793f9aa1971e6577ac6d06fe606a70601ee379c0c0ea26fac9c202b5f5d56a90c2aabf1bd4b1b429bf9e6a13a67116493b45ed850437c31c08687240e4065f105b8bb193d3093498c1d62d90ced9fa520775e15e37f5f3d955ba6c5fe3daf6415acb1f7080112b391b73216b69001e0bd3cae32b6f4aa6be7116a1177d79f10c1ffcbd4afe2655e29dcbe5de13044f85f28ac2d7384040ff808b8bbde05b15e6eca734fb3127093bf50612e3564f709287788f2557758d09691e21fe5bd1043a7f8c7072aaffbc74f107d2a4952fac14ac5abd2a4b20219eeae6d26fc58f63d83bbdb67340f336060339f711d59fddb810bcdd9f025686ddcccb037dcaa814ab5d86fa12487511af9ead81b5f84ce1300180503774750da2d8e4b3e8562f28e4483b17cae025207a7f737f833a6f58e4c8e0ceb27b66c5db252c04f23b59417e5b7e18db8997075cf64ce7f5c51432cde664419cd61b5840e829783e2ba5a6a34a918a7a0f77080bfe22e0622dae0bcf7ba7bcd83bcc3106a48038cd6788c68461a97f0a56ba764bcc316af112e29c364bee2a70be2ac25e6d3ac326ce143700e9b2499a1cd4a51505d219630e567c1337b21673eb062ff626d018f259c21f2b5a69948278b159175632d1f32f79d845dc4abb7886e1a08ee3b88040072105a9926181e818ca2daf203ff70a6562888fa3f5a9e6ef4c38eeb65dd3a6ca8fbcb9fb549ed56df2335029a0614b9100052b509b230ad9a1cb8fb5932e4ae32ca8fc9c23c8067ecb0be654ecddbc4e382d998db6794000276abbf098d6a790a11dc838ecf4d000715c357ffe50aa38e4666f2e0a8ab14aca5ad9482220a88cd2cbc4d3db53f4388617aaa4309e569dfb303a9f67223ef35a3a06c58fddd0b41a23fa72bc75c92e87081fb8d20967be2418c02ac28de8fb340058582835b2b06349d2175dcba9e8e98d72112dfc8bd8190c2635ddcbd5e5f45d2d0867ba4d578f560008720399e36f0c0016db4b11c1f8ded6d469eefe43f7cb5ebb0423e77c1f7c7d4c9c8f0f6faca36136481fa58de5f16c1d85ec49f3afbd631064294977b6ea46bd406a8a8513776c4bf8e8dc5fa51a956fb4fae503cd196334fad5e7577dd2d8d80cf42b28a8a9b6c231e0853bffa0c8d7632a42e6f5e0d572a28cd112a61809ec7184bfbac717ea5b701a5c82398882526f697f14e9cd92e74680c96538cf10c830af5c9c025fc37957ee3bee8dd302378725451ead038bc19d15b6dcc13541acd269e56aa7e7fbbcc0dbb374a64591a049196cdac06c5072528cd936faee2543aed76e6976c988b123d3d0af907b0935ba63643aac5c609405494026470576c7ac97814c6319427f0980aed844e1ab575dda6cc9ce85b09ff34a0c7a0462e44f1d12975fa53a8f808b09176eec814e47decb90bd98eb7195897c92024e032f12b2619421f09d0cc3b049c959c260df7d0beff951ee4a7d0c09191775b9f93a56e489153646128d0488f242a1e2d2d13eddd57c9f1014c6fccb2d672ecfab197e314b5d9c538605cdf0450106c84026eb8355c51ee643ed6e139c7dec81c50363132b5a43b0e03292f604213c9a74dd5cf7812c6b1c3c7345d1c09fe022637c523651f45738aca92e21a5469a6136083db2093eb3d65b71d3c09c9edd66b3ac95507cb7b01b3bfb476cb7991f5519969f6e9675024464c4765d0d284d2b4a2bde2b92ae7c2b568f3b87f0d7687bb1eabcda4d6baff5d1bd1159911fbc7c1c8d7ccc82a244e24bebfcf622afab7a5cd71885ef59519d1026bbeab7bff29bbbe050936551d85a072d65e48bf63b4b59e80eac3e6cf47f1beb9ecc9d2729ffb9275e9fe493f33579b7362750a3b2f9e1a593ed3461dacb9043a7b54e7a6d695f56d9a72b233a8e88b78478bfeae62384cd2912a7fde98bb540b6b8667f54afc06d05b2f5c7377c2386d2fcaff74596173fb145269c229bc0b89e257ab08c7d2fa67ce08d66f582f74650732ed310888c0cdd439e4071daa714827ce15dbcb604c0f90e71e499549ee8aee15c1a6883c97a7a44150832f8630458db9654581be7cc316be3e439ec88a2e6ea934a3be3a858d19143565159314905920d88e35adedcd38574b87c115ef9c1887eaa9399a13a59011c2886013089823510ed006a4a0095560835ad29abc02f4155509b995acd9171d75667d1f82cc339e693d73aa6f36d9462f86ce2241a62c1c8209562aecfb69e29e660881fdc7f182c064da0e39426dd50c23e2f49d2f3392f0a5c0b81b966a6b150c79819bb3f8453d4d681e8e299c05a29173f0c4e836fc8c2477ff32178ae62c20f0dc3c4cb209e32636fef02463282071fcfdd1fa70d7e6748465fab71550dbebba3e1046475d687551c061db1c2c42cccda9beb7266272bf8a2857c6be3491f8239ebd3fdf49cb24abbf2e5132f52d63f533482a3786d8406ddbb1126288c31ba849d1fcdb6bac5e76a5e08556c034b6fb7701cd311c70be1106643d16811f45cd0427e12f73d6495ee02a0492cab80a387d9f1331f65a3d3252b9fa081bb16f79c56589e1b1dbbf0b97f8cfc84459dd9c3e5310a15e3f213cfee6bd404a1d201599fe45b05592378f1e5e2312788f13a4f282eec1cc0c514c8494028886ef223cc53ef158e0028f0b1428b9cb3b8b7b7034b78eedf8db48b33b8d9bcbda2acedf96a156c8a210390aec5d981f04541dc9b64b3679ebb39d278dcfb81dd29c531b9b756091a41c4d6c8de9d938bde653ae2b58fed99c16137fe798a9789fe25056e692721016ac4d4edc1b2409bbcea2799eb42e3687542252f9d861954526ea86e276df5ffaece88b8c02d6db0ac42b8dd338199b42ec5ae68f8f9024f1529534262e8da8a98de45539437618f83b384110b5ff1e08e2d73eb5f892f36405239b6415072f319a111cc6bf7ebac70e21848cf600555afb8d722dca12fffb9b28b7e805407d7bc8b682d088b273d2b713be2037a74eb8ce6cdc39ad3278dec6d06629b2f728eb09b15d1499b76a4f825db3ff98a85673eba75da82baddfcc1171dc707c87da6b0372044caa61cff99b1d6692ae52bd1f164a35d5157df1d232a64855710ea0c909d15aaade278c27954df94ebd23a55f6f00e6ccad916aafe71e6e1a323fd6cce072248c1b791252e87ef3a2c3b8266dccf0a7bdcd80f84bc21157f16b607326a740f2e90e75f469d8f960e08070c58ef2462e27777b12c9697e205d35449f488084900b982bbaac32ce2dc9a5790a243af71fd7d1cdf286aad156f32c0e34e9bfca28a6420c1c5985cc296459651c12cf6677c73c28e1f045c71d81208c27b0f8ee61a517678845ef5ff5fbe77f8211db21f0ff57e086bc49dde893c0743ad69b1dba439ca958d8632a3d6f12fa6638a41aec4051fe05f319ce2303a37aa9c87f599d6755116d77709f29c8889d00e4c22d169e08d8e4c2cb41f85c006bf7386f4668b27a105f2d7b7b2d75b62dd0696deb899a007cdd27077665bd7a89c00b46494138ca7353c802c74297071304ef009f920559af44f5afb4ea65e8e287587a471f735a7cf83df28fa5885847367a94900f25ea740d1e67cddcd70efa11e3e1fc3994c0647ea1e776db12ace6cce67d8ebd4d3115e582a662307379997cb02d3a237cf65849d1cfd2fe544126c1021f511b19f1033f7bdf8ef48408fb5d0bff22a5b26d9564b0610a65ef6e802667ac0be668acc3a40b79afb95a8127a511015e8a5ed52415b488517486afda890f7f49c0ad3fb32809cf34dc3fc79941381abb0052f03b1bad25ef69632078497ab16ce8a4cb90ae7cf148b9722a30c163f8d1353ca9bff602fad3405b27e6ed016b3c09356c36a769391dd8d64df0df777857f4d201faa95677f1ed5a8fbdef26ae6c9510f0f7302414842f5fc508d26df0c0168e1aaf3e473f93276da48ddab60ad93dc4c1dd3fb5e302cae528556934446700f379f16d6b21a31b5de3c1bc2958259590fcb5aaeb6ba26b3618512a50ff63617d8722b918371dfe78fed85c7c29f86c1590e0378dba80553692b1e8ec6b14bee89883ee4da719ccfb02e0c9c9363860dc5a38d0858fee1f118bead6be7a910cc1fbbee0ffb28011d919d42b03d6d89dd4a6b719ea2bee8adc2761774a15470879fdfb3c15c64c36c86d63233de76ab76f5b09c58e1e5ebef3b856036d8009142e0018ac39b7d85db7b22f3b80b59dd85df3663b3c73741490de5b4acbeb38ae599d4ef6db3e77e27fcf690d25be9114f76b81e2e44a268617ccd6286a4d2462c4765a3940091a882444f0414244ae4b814a910c8da668da567b891fdb9ac55d83b330b24bf507f8f2bba97914d1dd8a4051e9b4222d34bff2947b2b692fe7345b896aa53e03068e3b0c2d7fa127a4eebbd603d2b184c144ba19afc62095e3d1d33e02f91c16bd4c04b1f51b5e269a3522cdc35f69edd3a6d72e8d25a35cd35401420200f4874bda31bccc8f700da681b472191498b526556a83638ee08eda421b7e878fd8e223fd5eea9e33bac5a62cfc67afd316ece7c1144972233609e39e1b49aa3efaf79d5e2e6e7db78e3e516f02397ef2131abb6c389a7dc2ae692426868da65239696d2605d51ae554603c56704d7459f52aaf55d6be46ff01c217b896cb7c46677e199a912a350fb8ad0675f022984fa57448ee4e2b0d0e4b612e65d54736b8a58ba4c94a52c312d63137496b23b47ac4a654ab314e4e54fd27859cac94ba5e5cafdea1b26008822985b7011c3766a037f10fe6a001e053d69665c1116e09b04208a7885cdc2162885e7ab5fd4a2f49c1dceb6b3f33298a61e74386deb6a6a8f2539625168019037718ab3aa2216abc181886301fff10e4559666fb47fd9698a94fb04fac21fd718b5623fd870869b2b57b1493ab21f48f5b2612f5c180854e273a119ef36d307561d55f0efe5e2d7c8a0d44ad558845a5229c6c47e19f67e9e4665466b0434e87dc7f8a657f98c2f1740f94605b78eb416da9038f14b0051e722710ce7bd910c7052dbc412199af79196f0947e70fc970f40cbd1389c7c4ddcb5194c001a186687bfcefd88d72a9c08d01f23dc24d46ab19b30a16b3891d6347804efe8bde52b63018fcc29279ed6db69486399460074988502539f5f191688141da9dabdb0292fc0a619d0964ec0e8472cbfe4360a39bb91cc1ae75535683a1d7383288d36a9b32e4c26a18844b47c260fb9516ede85faf39bccd938a0f7fa00501c36245d07a87d89cd7cf3719c861024eb4284a522504a24da7b20d073508e0ba22094a407f1b7f7b4f58e47cb96af09a5dbd3beb46928a27adb9936fdb868d3c882938e38cbbe3f6d42a63661b5896044912c2ca482ac0b654e6bd5341db5908f9a4e0cacd6a659e392fc02136b6ad312ca0f69be9d66cb939f409b876dba9bde4d4f87938bf9b5deacb1a62f8438293bdb2281abf83885d778ea8046687bf649d024331eabd270baccb0774e50030476a5f8f8f7a7972eb4981b8ac998b22e9cfae0a8bfe9ef948a03fe9d5660d6e737b08330db4baeb6e9d06391171f73552560f665b6e90d095040938e3565dc6e72013e2c9bdd8433b7efbad575468d5e3c436d70d24635094c4b7c52c0e90668db8a7d5f3189a9ecd427c26ef0b8e84cebe5a44c094c048ee002f0724df1cd792a81fad07831ed916700a6e86604ca5c5101b8904e902cdc618411e2b1ed3a3ebf281843a504494092169685c13d717f2e29a8ca28e3ca83b4e63b90c90c46864a2841bb66a3b34a1fa7fbc54e2adc4843cbed95184271544ad1c9fe634730e6331f6627d6f93003998dde2c91dd3412af0695a7c59780eab8377b4aacdd06cb1a22634f88fdf604a828b06ed27248304a8d34a592636b60a309d6a0ebbbd1a10a894e2fb3628fb3da68cd5add5e6fc4a86fb9fd54db1edccf2f3e8e8f88e5e4b84e68cf3a1b738f2a846a0bcaba93a2cf2ebfb8e90f0c7e171be84cb5b949bad6b19e036bac8febb387fc8f773d7533cc0701fac2fa77e0d645ff2cfb493edc87e8fbf2503a961c1fda97b9d403c5a61ebd13ef218b0af0a0f36482cc4f506fbcc47daf07a6c525bf1f3dc08aa77d3c90ad5fc3d1f1620280648c19a33b191c8259fa1ae18a4bc8f4d44d0f203571820a1662680b5ff14151d33633bf1743c2c33463e8a0408762a149f55f06d0c4d2f69e2c25b6f689639a94ba484dab52fd6e1931835e517a0f475efdc235f50609a6cd99e2817b2d9e1afd4bfde743b53e54a75ba9c9c6c17960b317e1f48f31b07fb1dd878e8407f57c187c02d36e4a68644f601a1837c07ec6453f9a6b99db00b714ee93680e86ad204fc506b8903aba06f8681d4970999a250dc5c85f1dbdd2c4316ed115019a9e6cde7da92bf0c24da9159873379fba2a926fb4332dfdd6ff418cdf024ec9eeeab2668ad1a3c1d3e2b1de09b6ed19d610f6723abf25d1c8f0a852f2ba977d66ad80bcc90bfea283202a8baf8e7e80761196dec82277ad5c86a4f0b8e0cc41c947983fbadeaaa711192e7e161b61b594baa5f39701575237d681b79f6578cdbc74d526b2a0534071d78aa9cf49f6d818403e4d82a3cd1e4077dcd281ec2b0980dd46af6f461a18cba7aa4392618c56b415ddb936ab4cd961e999b3b0a5843914d6538f0a15fb0aec51ac2932c6d67b824f2172f1ece4166c82b91799f8eb5c40bfc3d4481d263e75bbc93dd6f22d8922633e96aa3dcc16e730332bf96f28512ec07367cbc8634b846ce63c825879ee29ea440fd6a31daa6b751e71a7b9b11aa264871387fb8892f06914b0a0ad5d72cd8d81f2372d873548e587a4df0747459ea1e2e38b2e8d6de5bde3572aa30da6601b1b39d9ea887e2ccf88382430831aa4fa1e04667fdb580308235259d827520807d3bcc5a3ef169d46a2b8eed530aeb63ba26590bcab0325bb8cce3518f90914418c2146587270d13a2ad53852a90ff6072f7a3089ad9254dba052bb00f0761e063ed9b21afa1258710ff433986a577b0e4b63875d8f3414dacd41438a8b196b35a790d0713fc90ed194852ec02ae10dd6a1019d61ff630a9bccd061c49f68057ab80b0bb1d7e9baab67778d4fa88b3d451937f73061b4951840d3e799182e6a1cfc80332f1400457234390e330bc35b72db5f9d8a33cf2a6c258d07b0d35923cfbd8a098a5abf8c5647553d071bc42b48329ba099b943272b135053d63951399062c1a7688f632417f312e84499c8c3c1aaa45c1154c69ae145e6fd21329fc8146184ef290367b1d90fd49d176d1b714a4d1974175801e2059ca0060488493d96726b6636525d3e20d08aeeb2a187a81bbb9b59429ffa928c4a0c2979b3a4aa2acd2d1cef448c884c8a465eec91a5293bf6a6a8772cf1aee24750a28651f881615882a36801cae01b57275551a37ddc9d86413b67b9040bc4cc871ec4faee1930b42c3c62c03cddb3eb04ff444a22110c00258251740890a001332d22e22dadffe1fb40c19bf99eee7fe203bd6bd4c8dd002d2a753b29e6832467dd7c7a6715f1922a1dbb0c3b02914b7ee16d208449fc55b04ee6931bd9fa6ca82c2889c28d0549641693eaef3c90081ab74efa6900b90a58950fd2ed454a911b8ac5c8b4e0f562b882f312a7be03eb963840baff3fca946c51b34c72f9bca90ff910c839852391bc45610870ff926e07e6ef5f9031b0ac9c28af888dfd466b486b1d404320380bd8dbed291c06d36bfe8a312e13596ac43030358b554c5a01231661cffb8cfe4b2111228010a9288ca4117966192e0719126eabb97ce01bfe46b852df3f65c26b73bb3b28251a4bb3964dc36aae8ef1e63b444a701dd6c4e31b3c55244de87e098648142683385ca3870a9908f9faa83ba8140a4212ba004b4f9a73060a25e98715231c0846c4b6fb4a9bc26d05daf58bfcec5ee4f970c2befd6dd9ea146f73b9578fe952ad1482892bc69f0c4bb88d2a6bb0fa14d4cbf2170ffa656186f4856a619fe9cb0ef3ee200e0508460df30a2328c85b30192feafbab1007b58ce8ed512c7608576182203f418a3d82245e2f229730a9fc436fd3aa19b6104ea96fb964751e5089d71381cd183a4370faded01970bf11d3cf9af4bfb3a34c3cecb315bb03ae806ac0992e65ed45e1f745c129d7428520c0b8832389a1195824f170a199c5fcb7ae6ea0f3f20c1e666d7d0dcbee659f790400fd3060aebb652e9debc51c8341b46280c7fe8016b8b3612aca83323ae61c60e6a490c40c9e60edb8823d48acc8a706b75fe8fb9c2946245bfb7f9b60351bcb8151ea0bedaca95de18e36bd740851d5121b4ea49b70dca3d4315906f6f2d5149b1b2ea45f0659852bd57fb3cec108646d8bccbe01ef077da0576a8a16914b680119c8c5348d25dae6a867eb3d94f89c0578908cade537351c0b5200268a888d00d62f74572d92105038b1a169e128b20e45ca24d7ad1d54344e0efd25120e1021b97b4df20c2bf90fe90f5e12688045fcb33425ef76dd865e3bb087161aaa82434bbc8c8655dbbb0d81acbb41a1efd6f5e11221046b4c9729e9fed43dac66d640e8a915290d5946d9f60a1dfa42f61233e5d75321c471958a032ed840a5d24763fb248c7cf7b692bb1f46e75c840bc88a6d0f50b0382468104009121ce7930f321686b124f24e043a7f1a10e13eee1b69dcb12da8be02786fe01adb0657890f5d44b07c43a2951926b45ba41181cba1b18b1e24001b7d03f40fd94cac9d6ebc2e23553692775a1002f55835ad6b9fc1d12c0884382f6b17cea47c732b8ce48d2461b16196dc7d12af00ea50af2293fa154e59933ab531ed7cd8ed52dcbf2658ea9041ffd1e0c3661cefb954bd405994a440b3a62c1d0e1438cdf0604dd45a8e5f4e28162bdf174a0b7d0b876dcd280c5c923222a9dc084bf281e7fc8972fbfc171c2ee5f03b5b9154bd130fb4f3c902ac21a0cf2f17e02aa6be69a11766615fa7b23ada6fc2e013ff8bc7134ba8f8ff078d2f83b5521bb24b78b484f921957fc1f1685b6233246e1eac421c893ac1b8c5d8ee88d8db691e9ba88d340dffe6338211eaeb7e9fdb10021f578b1e4e1faf1943e2da422a6aa2cbfcd86e7f738a6cf5cffdfc9d31940e982c02f8314bb691c9aa1049b286b813fa6c2ea7be9174b850ba7822855ac157ad755da38a63b64d61f80ddeea7d79ff18f1f039be81d8e0a1a1c5d3cbb1a2253926079a6cc6c6dfbca8c7bea601243802079bd29c75b9a50cecc85a31cea1200cf933abb95e26a59dbdb2645a4fbce1d11b73412e477c2390769cc6baac9ea232b4542a85f91d79bfd27943a7d9b747c526aeb846ae84d31acda5da4bf414ad612727e7c1c959475cd095136d8eaf0dd07766404a9d8a1211e1f5782de066bf09de42ac59c4f866297506face4df046694cf94814d3971abba3af18ef5582b8243f783fb477e99960789f5729e207be748bb1f6ec964b8feee88e2278bff93c7d162c9fe794d8f34c81d568f1000bf3424cb033336b9ea7917aeccc41b40577d385e9cfc17144053c9e648c22172964d3c471381c3cb2a877c3fcd562f29ef1de1accd196dac5772f92d400b94c27d8e4f1f6e5a92ca6c00128aaea92319deed46b58aba56579af5d3c7781f172c805103577af831042276b78c803cdf799b309ea184fe5d44371663cfcf5b5b4fb495203a3c658da743c48f3dc78e962a9699591027a0062515d46fe5d3741064ce0538af91a747fd1d0c49fbd7ccf81c552f46fcd75b99941675377cfe0865b3b63cefbf8313514c0b2f9a037fc542cb3a46d6cd29d4ed114796751ba168f0f34ccf8a8a4ecbe0ed52d69b649a7e875f00e32967f6dcdb44d822abf6c142e42580d27bbd25baa61a341131dd0a6a68a224bf055a4637d3bd6bf7f7fbe5b509081812522545d3d7f049d7ea93b9ca22527248f5094e4538e9c042980d89ec4342834e846f3c7c7d01b47913b1330cfff2bf9d07be0f43cbbd1453f4e42316954cea6e4f19683cdaefac2b75e1fa07a6c3172fe4009206bdb586759951d7fcb2a17a9b245af9330666b52ae46b63f82d48dadb62533744e7db1b67e0149ba30b62cd1446bcadaae12f94d99210f2700d173d230354a6c68213818b08de796044d8ca901ec043f570e546786870a366c923bee48e284b78b8a82246e1b2ae61d666baf90f96d8b6f6b6995b43329ac904bc701c207e82bef26f4bed9865966bfefc4731cce3f4fa40f687f0709b1e9fd99e7e06b1d0763b4d2ae99284e90b96cac6b44dbbdb9d6a059afc29010590fb29d071c20f4e1e41b7f178091b71f3f9098e653a6e294686b5c616fd6090a839b86d9ea88f911c12953f525719d4a41f177e893f9a7ac8acc5fe2bd09e57acf7122584b2b55cc30490b51d89ad6dc7de20158809e89aac40d6b673965784c0ead222d564e8f5b33cb51843bd737cbcbf53a90546dc84868e11ab170800f2a4da4f82904b75c862909a6a23b421146ef8d1714f59b4db966da56e4088872d88bd290c96de677dba023c80d553a1539aa10d80d3e5a7a50f5f6be924adb5746112803c4460a1be945472bc1b477e654de7760e6a565e0f27fdea477efb88efb9a77e00158db10ff1d1fa8b7c2d336d7f641cd1153a3af01ad90d6d51c7dd58eaeb75b369de120f79976221c495b0fd2175e7067c1dabff0c1082aba9569e5814812cd96694d076f017c345ba8a583955c7457d2ea812a5a9495d5d20edcac64b42daad5c18b543457d0c283b4f940a08c6aa1d60e2249d169252d3cf84445555c772f22dee0368a2d7ca841796af1907ab5941c6dbb2f8d0eb73013e9d5917ea07431f34af9d626e645b067519dd00f935eb09beea30973542024834b8b18e0eaf6444b171b753444f08fc5a272ec437969c0a489952fcdb2a09f37bb5ab4552eec9639d15bf6b9709df45a42bdb0beca85bfc01b6238f7cb450f601fa859a0dc689fc92617d0c314648463276b1e1df6040760e9f85302de4abc0e93279da28548ad036bbd806a4e1a4b5aab48db7e6a08412dfc76c97098cfbd630e029fd7f1be60b858e9f37fbe506bad4e29806a58b4b3d21fe5091b33a7bcb86b632ff3a09f7a2733452781434e4ac6211eb3d86ad151d3260815efba86ac87937cfed81d30087b7720fea14574284ee6b7d59c2c9578051c5747c1df0a928b5eabcd802b610eb936882bdf113a6cf6023d9e1e311e39bbd12ef00a0a8dcd0cb54d1ce43b0d7eafb7f2cb872db981145b02bb1a41bcc7817dfe4f8a945f5e55605f421fa879ae340e769dc1559d500be2fb690761c6f05a7fec8888556fd5ed02beb4438c2fbfb56786b8ed50569b414f2dd4746344dc8511809494669429151b1616d77cb78b8fc5d99a768a3f1356b40d9198ce7f6ea8c8058ad254948016bde7b0ab9fcf54c26d96e170a150b7fed4168d26550f623ea26802ed1785623832a68a2473fb27a45a91c15907e4605027178a58e032340ddd63be8a63b967735d545cb53b8d2307a536602fc45c39aa5903a9a0a7c1ea67bfe9d82cc52c88c6cca68fa53df8e2bcb85954c70f1dd86ce30b02df353c6931131d7f80a6b3c707cb5b8b061ed08f559c93f5a811f467420868c75270c366ea1d76b0b8e9488253aa5d0f9b9009fdf624a917a9cb2ffe033fa8f287473ec6f2f47ded260dcbe6622a00b0cb0e218ae15f0d1b8eef3aba6c80d97f783337379fef70a8aad1b1df0eff3188589c15e4d7666f41b96a58df1664d9962557ae6b3f9084a1de3aadb9407ed5013778713c372221482ac2eee465a9b47c4afadba01629a603cfa31f39b9ff4896eacf00c39260675e6908f8915a5737d28e55cbe8634b0aca89c94710d17a9af877de4b32f1fff5520b1aaaeb09a2067658654101882405fab32754d2856ed7f455094351eccd5da678a33209e63f09b50ec549f1f08c0e74621a5942394e78e8809b069f8c2fc47cbe5a6b602369c164c2c249337b0a9818daf96776763b2c00a980ae6479946a523deb515266f559dbb6c13f17013bfc80b21736987c1569ef23a09282ba7442bf0d510fe201fc486b771c9f03a66a57a3f0bf8b9b28803fc531b3813b067e80cef25f575cfd22449f58a8eebc50b5e39d599977cafd8ab58e53aec19770ee54c0437ee9ed03646ef46dd158886687d7224636d72db32d85b41a5e5db4ededa21170c4ecbac6b7fe8e61eb8f4cbffeb673bc11a0d5809d0e2cebeba0ec6fa1b74448d9fbf3652bcb9a7b3091747662be3aa9c9b60551f80e18189df2dac0d04abe11b198c8209055226fb705ac9cbdf0a6dc474aabca96d86f4415745222ee79b884b0ef0eaeb4ae613d5521ed690ba62249cb85f6acec030a49c68785cf941de45ba8e9f8242cb24c09007c9e311a6b8ccb90dda25b363a59fb8693aaf7adf2d7e934d4f5f537e658306b7a3bc9f0a74b4e0949a7a91119f36518a2400241da868602f06a18000202c13524cd3f39398442a850cd99002ab8beeffb1699cdd0719fda001a4a303e116f38a7741b91239480c9861a5019e990d300323aef2a029e8fa8e5c0ce754b34342486aee483b89f9117a7b05b755c332ef0f2292d99970d367df1ac5c4aa82ef7b0fb4b08483aa7c1b11a9b19d75213f7b7162d589aff9ddcf5e3ca01b3c1589e7cc7f086a3b8676b01511e998605f672073c2f37db956c5daf701ecfb6d8a1a0e2629b509c426bbe8509a52d510a32fb8d5870b31d92b8909ce9e33feaedcf48328435e16f1a88ffda92165310badd6931208ddbd000c60ffb0af303a96d6d9d4d7d000359e4777100b1f19f0062f5626d0a57723698b01caacafcf42401b4123ba383fb1cca6c4c602394259ffbb05d7e6d2efd93012aa37dc56374713786fa56b0b5ba582559255f0936ec2277d612492f358a43bab6eced8ee3ebbd85e09e5b47ff87217ae843bfc2639654238abdb5981235baca9e81432ed4a538a135e9b1c412a0766d4052fa2dfb5d5f46720cc4ce066240ae5b230ba78875a95d09c028da1e6829cc99941a6ee74591570fceab1e734856d2488ef8c28b5fd088356d65e281cb6b55957a1a3e65993e2f62a79ec7cdc66fc9614c7b5202d36be0d464e592b2056e9ff41b380b1b0633d57c8ed464d4a003d8cdc8c18c46d3a3e7fe4369c712a7839ebbc0ef759e71dbe3be456cb0d7be33add08a56e2a5d4fc7f56d35193193b3b8999bc468c77bd449d14120c40ef6064d7ee7de73305b99216ec9628c80d8d62c80b89348f50adc7462b036b40404163d7bd04592b24c780e471851b87a09a33ae381c828ce4eca60b06f62f75293fc011772bc6bedee7b6469a3a1614dcf48e578cb5b79981f1a1c8b13664c29858b5a53844a3629cb691f517d28bd7c624c36ff78e8b4327019113f1cfafc8a6f7ea9734f269873b8428ae843c09265553e22ea495a6bc7d2e57bd50db41018753cb5332b8831ca5cae08b3d1b84b834483a5959b1b11149ffe32d7557455dc1232206bdd3c091a8e3aac9dfed8c8114ed15541368c95da3888ede0981cdbbf8ac423e9dc3af6738db74bdb79370b8965392ed8161c719cc44db4ccb073e5ee4a3f3008b671f608298d0e1fb6cebbc934e2fac7bef21934a931a00d3244d8710b6e116ab56f91bad0b82f8bf64ad19b548a38f2b0150ac026ba223f0078a504d9550f301702b5dfbbe893e4752d702910d479dd9da820e718bd2edf4340049680f8f5c4609d6a9110fb878b918400158b390d2400b216ab03b095af4d8f767795332be4da14273a49420e3ab3e65b7f4cc6e0a66ecdffa2af7ea7e459fdc0501d74b73ca6bad19eb60a1c629ddd50f9471e2f6286419e94ba7ac0c8195de30e67f4996683a67b15607e3544e1ffcfd4a28e101433510b47bac0025669d3cb149fae2025f16fa487be1405ebc68b268e44109dcb5306733bc8fbdb36d6decb049aa1c370bedfa2a3143cefb5ca4e1f58720cc00d58b42cda2c0a623fe2936b18ffae79e5bf52a13382f81d3de2fb53a5f45cff5057d6414b509b142643984ac32323cdb5c6e0e167e06955830e17b809c7a82dae9157e38a1a5b1935b30d22c38a52a74b8c95717c17339af4fb8fa4cb884472375ee10ba9d7b4285eabfb063100cfdebb88ea49d05443e1dfaa2f2be6e9aaf404a3719ffc8fbaab90fb6bc67f2e5b3866c36d3591012904029bd3b7e20139e4e51d56a0cc480a93e5a0feef701d43941a60d5d1d1c1fa0d9a167de2bbf7a4006eb69447d51bdfb8554f997bbefca0dc5b610c572db8cf6d15abbb7bafe577de45cc762db760fdd33a47d0fbaee4bb24f4ce94bdf56df9d09680d8f6a12f9c91788070ed8f933916ddf7c78f8222abc4f18d7d8cb27c1222b5bab5e6ceb8c70f66e44c2e76aabe4241cb2612bded706d3ac4fac7b50649227d3c3fe96a4a63e9baab349707ccd0aa4389f599bae6784ff25927d9d41927be22ec2dcc092afdd36d4228f2d6da2227d2bf0a5e918d1e9cc9d8f0e4f7d6c9fc795ba63964d15bef708902651c82fb30a9c7ac98c069872544f380050c2c079d59b753bb66a586d1d03caa9804be3c5edb3bb99062bf208007539368016f34c2692b687ab9b6e732e7ee74275bfaf3f01b12d980e9ffdfcbd9e774b92dcd11a55084f8816646324996aa9271f9c88b780ceb55f64258293a6aabe339189bcbe4273433b99518e4dfbdabb6f96c5cfbd69e3bd03b742028e894c56a49fdb36d6f4c7e155ffa21f4bda1d32dcc1dac85a78351ecb0f4167137ab10ce18fe3d1814fa33fe07f3f175f86357d1bae2b57882b5e372d76c1f162e4016e1c92e1d37801a27e94f85b82ee9cf10d1f99cdf2ff94f58f765d1d537ed0a85273942362785c3281ef7a6bf0cdf5f26e5e28da123fcdeb55013704bd34996596e6ff99aa226552d53972d73ca00396dab7fc8cbab52d1f0ae6bf2d3d8419f96d1d3641a5728ed18aa29b2022478188a19c54d9dcc5eb0db4104434ff7427eb72088b82d4d59c16981e5623545951fe0b6f701a2e3e4f6a7a1f73054ea651efe529985fbf19406e2f8ce23c6dc7ec0adc7b75850392b66dce061866942ad575c276f23971c63f9a798f2b671cf0dd2f3beada409866563c827dfee7a8933041a0d1df2fb9e080553fe7902b78d6db5c7842b5787f05bdd8d84532a98a58a3ead10b92b54a6d129d7516be17def96c5b636150845fe0bfe31a06b3580f9e0a5a9d0db4f012e5aa71940bb6b7f25b3786ac05e109cb11efc913d033688f5acdc957721d701c3430651c97f873f56aed2efc9fa467d88b800ec7efd96d6ea03026f5c26be6f4a6d354b0d94e0b20dd62d747e50188994c1499d5c793a687900ae18152e574c57ab14b0b7dcc5ff5905311866838dfc51b06a27fa44d0785c74f76937e55a83824dc773370fc1a6a35cb0e5a54398dd79894eaffd24e1e238b43a9f463ed45a29cc7f5a604053e3eff3fabed153a69bb02247238bd4b29b3047d17daeda575c412be79ad227e31bd6f6df4ffa956ab214cb95a46dc96348284742a2490bb8b8940c23e05e795a2709d514345fd898b3a0b5383157008696ef5fe0ce34c13b995492f8c79554a23fe036c8ea82b93cccbf175a5e3782ed92f43cc5c843d2c143b0c56d74fd95304179afd7c0dfa8dcb2a185a7a6e5b2b8e442e45f3f66fc17946983a9e9a99fdea1e8fa946c82ac7556c04415c1712c70b03ded7d7b6123f6e0510bf5835c4407cc9675b5b4717675a552820ee58bad4045926cf35ebbf96f89ff48a38697d15ec7b24c1a1297a16fd1a911940c82745db01889c39548c184d92e33cfcc3617731e2531401ee7590a4a4a92a931d99cd93491fda89380f02ec8e1ba46d0c04365f372dda7b04a70937074862688f628e05cb387ad52a3980b00b612ff76667f0c20467631c0a2acd9d7c02e8a3a1b28edf9d0344e1f12af08602eb713a0476a6a7a50fde937000188eeaa04253f44ea8e956f3286ca4743b2d9d83dd558ae86e6ca8684949117b37fd6d3b8a8909fdefd0397760c94f34a099110680f631ffbd46e48124984464e4aab83067ce478b4479ee9130bacc787d0f1eb97340cefa95db97b925989fccbfb86e6430749af7e1b56d0e6b058324a4128c1243f5e6ad038fa91e903e76dc0161bb565939895063e1d258fe36f9230300dec879898d81fc98a7d99655a4bfdb6ff9d1d320b463a4a9c01117c96114a1d53964543e7afee0cac406e4aa069e3c6c7125196f3bf9f17a209b23cb480cecd5434fe08627c4357aad90f3194eab7aff140e18c3f0329781449bcf42448f3ee96c8390c638a0c2334ad749431cb121ae0b2618e39a92c6db842eb0b5b1f60dc7cb34b67e7164a83b199b02580e1fafb3e26fb44b15f4e36d44b6eae9c3256faa84fec364a8a4f83ea0493bf54ce926c423f71b138d0a4dd5cd1d76c079c0d73c97996e8545df6bfc85f177b713798481c681e8b90f4f5e0a9bde574cb62f35441c56e87dee76e4b09e90e24f2bff7a89b8e340ce8af0cbb7ef94bad9df15dab7d104f9a4f62324a420ea89277d6da438dedf3cb2e8a657c29df9318e13d042859f79643b3a265e720349719ec743e69a152061cc6b3b3da45c0f50e1ad0b888875dd23f5413ceb1660891eda8c4294a8a43580a7a0406248df2183249b19d8a1d179bdeeabb1ddf3ce6bda84894be20160209374f69fec29938fe217aa02f6b979d9e93e26f49ed5ae8c69609506f7bdbb21cb9cc6521d2e9c738224d20dc7a3bc4b8ee7bf696f5dbb9c3352aee739639aabd800a56591841dab86b49de22301d3de698b03c2eb1b310f84ca42e9bb6ab3b22c4b6c832e91e9b2ba7844efa8ef4e2be829401610824e33b440d704bb861e23b39345db6e394931311c6b6f5c2680911f0c83a0cb0b6df7674f691edc841f4da30dc6237e43e882e993586c44ded6422b2a9dc52548d52ec919dcf806472f48804a11ac7c511423f20f7ae6d9c65c8694d1e94d1e970bd3933396204622c33bdabc8050b35eca2c1d8e4436e429e4e83eac9aafb47a5b0f3654393023a643e4a4d61a2de5e945772601240bcc1a7f30076c120ced526559aff5d977274be355836c4c15819f25502116cbef787a69a8e48d06e99cf41ccaee086e5bcc1d3e55677236bf35c7540df936d6af2f831280ceaa735128f10b25bbdf6435fd6dba974042165a801a4a5f4db7254e0327db6afae2db40c02ab0ea6d068005ec66b24bba300e87adad2969831316af6eeb4a7cd8bfb602a72c334f1fe1b6c914479d22bb0e41f4694bc74b8c4668eb356a348b6bea2ab2449b17318777cffc491d084e44486e92c6331827422dde812a639441d2b68605096184ffb664e49a3bb05bdced10a816898807f5eacdae9513f41233b607966ada606f86df50b3031504e7f4cea8f2a6e6862ebdb92c9d643d89ac1f15317bd604c3e29fc462a1ba7ddf2ed1f4992694ac97f93c0bb6b2d612d6d7a217a1ac206cc64d855889e2e1309f472ec13435ae5f315beb6bb46259bf07b5ff90b09d8b437f800b7a46a7ffeddc11da0647a5b03157404a989dd7a44e80f96a5719c9787065265fbd58744ab273769fb22553700f0c00a5562b7cf3437631326a0e2906651926365742d8d00009845e1a294374ac42f43ffe7e399e5a63b7de715b22ce75f9158402c5d1c997f9df945b7c553e847b0467b46707a8302f19f87701031563159f50f28573cb8bc162aced081219757b3a955230c26f065a04e8bfb10aeae420c7e02f402c4205a4dd65c14deb4c340007f45abe6d81d8eeaca8eb2e33179f58f7ad880d31d1e10d568c2139f84c95436c72fbe0f54ba83a76d3b47d70f489058ff13f77df26ddf1e8ccc0d41591b5c20ea52a4e83fcd77014b94879aba9ece901873ba630dfa3ec60d9a3ba7927c20bd0b22de23456b93b4e2fbb1792ca303e6d37b02175838d89008c57fd3b1fda5862778491b0e73718f9084606ea8ecbf17a70eda435f7ec877c04d232c08d65d917386f6d6e2750ecc2ed597c6a8bf3685f10c43f0ab2a02b59febac7e7b0c7a80913e6abed3917f4764a432c5095569551268575788b22d98f87e26c0ce76a66c46d420483ff0e0e299a55eeff0c33ca41c70d2b27bd47c8de75dac1712ddb5c58559eff05874f90d8846c6ca7ffcbe95185c233282d3ab10a2fe83bda4906f4e4bde3d33471ffe0e1284ff586956c7690fa85c1435d73b0901772d413a502cac518437e5fffaeb5d2980a32d5a9654a8775a3772a3b7120f7bbbcf8727ce6bf1008db85571e4f9d4afe0b6d608de548c6d9801fa2d86e540d2236c052f9885f4218fe9988e672a04443fd8b9caeffcb50aaf9e86eefa66a30c8da2ec69e4ff58ddc6e64f8ad8b743a164fbf3d934b1856b0848a5dea6de4882ae3b5e47c5b7f9f8953d89d94359b7f5a34a50e74bb75e91b688ddecdd746ef6fe445426145fb1300c8451a4ed5da56df74970264c0967786cda6c81f9f387f4e02a97bb8199f16850786154ae57ea38b4df9d530bf9a85749341f831f2dc5853315a65f5683c31c6a40a67109c00d39878ae1bb9784009956d231217b2b9368a0499b9d153281739c7a80dee4172cdc9d2921b275ebcef1c8d2ffadac0a67234ae44d0f972a165413973b507435655eaf434716bd18ff321d0adb18d5bc03050fd6031ba318af09517e1d38d3e1030315f2085609880cb7dbc1da5e78353a1819ffbc9c79b3e73792bd84ed4e7fd344faeb1491377cd67895a940cf80b3ed33865f4c87bcae9d6d3fe8fed7d391006fc08141478ac988360b81716e7e49a4641c90264463d9a5d42163539bd69bd3065f138eab08d7ebcaa43521fca540423e19777f4d09e162f85948ec4d1422d0e1c3db79d650da8b3b18d8825a407282f67b0886a26948fee500d6512ac1cf16ac0cd0d96999b050f83873117f296a30bf83768a56a0e911645532627729a44a9ad3b8bad531b7cf321276234897c265081fd3f967815c200043434483bfa4fe124b986361ba2fb004b1cd4ed70c383443762923fcfbc0d00dc1c9aef1aa5ffd4358d58054caa5a916e36616425ee677745b24ebbc82fba500513eeeada1516c793941c6c8f7654b20fcceedb089c1b4f0abaf12caa2e045102c3e9487c52b1aac59f8a19ee576705d4b092a9ebfd7188914d71ca0e34d837467fee159e03e685bb305646da44087f147066830c7bd07ba3c170cc9453617f1f9fb07da5b65948322a733d897698624d5d2420dfd0e064dab1fe31414021cf968b5b06e41c7d80d7977b38364abffc68ef858a93f43b716a276ea40c914ccb22ae5f859b5ade943aa16a833acd47f4d95d8bace19d8854a06f8b108a40130ba04566b3b3125f7d95bfa0f3229a9afdf4cab3e8e051c945239bce60008ae7eb4cd6cd4798c1211aad38cccaa0bc7a7e098ad952b6f754e3efa56217729f915ccf7084ac22805d1b272629aa3751fe7624a801929c676a71190a9b0647182a88a40ebfad781dabc035a89d86117e9543ed478cce67426b7013bd9ed5f8949ce1bd27e0f35446a4c4e1a041aa9b3eb454a091964ca52d9b42180247e7b6a072cef508881f37a57ad482e68f3e1ffc0660adad216eff2d97ce26f47835661bcdf94f729b4a74e995d6bea74869ba7d13776a90568294f5446c0ae0785e174355bd0e926359e15c1a35a3f96845315170332e31c97c26a092d49e975ca02f0be2baabfb67979f7304722003ebd9761f804ffc4c64ed900051160174d91c280f6764aa573e19cb1872786ed871b1db3b72e319b6d789635b2abb017451aeed391f5f0bd87af0610fd5d957611f8c375e2890bfd60b9b37a911d9166fab96a5d3d017315fee08a809360d1d026d40057be88a165d8bc5f40ddd912400443f1f37653176bbcafc24aa47873cc0ad55312160f677c051cc5da4e549df151569db359e813289cc8cde7365a81a69639d8eb4f40b3c3cd4cbc31d0ccc9f8297e92513e5cdf79bad09fd1ece6c1e5d72b167e216c0073f8d060e19faefb8d3cdbaa1a3ef7c30f9647646620b7a592d8e771eefbca2e9baea48702d83d1be0b31afb82d91d89208640880acbb6545b16bd9940e011611c65de1263e4dfd2508359935aeda1b384803253b5430e85eb49d1e63017e5ad9f8689c206427d72c75bdf46026ec507b17a1089ec45e9814218c6c0ab6a130a3cdb7da94e43cd27b3245c73cae5e8adb5f38526dda695770711e44a9f270cb12392bf30519867ffbd95b84b324388f4e73921e15c782080e2dfc2f66e58571ce146eb1b27cd8020f30b47c0173b5cec10eb8f60e76f5e3120b77855c3cc9c00edaaf2b3fc7c10e79a437b8d16a09df434118a26715fd66e3ae5000263f0788dfdf2e30ef190c5392dd4b65f757cd55b848d2ab091d0586afeecaae5266d94873353f70bbaec7b94dedb99794c202282f5e179702a31b2032de44090878b9f27687c8de65458e28f2c506ad73d4a80ae56f38a157b6e4e641a60e9b4614ba5b9fec4f4d722a8b6f405221322e28f1fc81f746067963cdcee6316d614819dc92d103d8704954f4dd41843657caa2e650ef524359cba7ac4153cb8b408056f67c5188caa20165bc9d763bcd100cda0c695bada00376b2bd63a62b6cbebfc35c5bd01fe6b73b6618137c53eaa3ae9c7cdf610408da17628c744b92e0e89563b0e1a0d3a903f55ec03b93e0e3a8f6b44e3169e3cecc77ecfa60bf0ceba610c27e4994b02db437b7b30f20484304109e4a208b4825e003acb9f5232039df566a353fbc4c9b20507a3fb956eca5640912a1443a61197bb4935490f7b42e10754b4846d81fb4723da2438577671c44a53128c59dd015daca4dc48601c700f7bd5407a0fbb8a80240b73003a8a478e2e426af5d90d5bb15a2708631a3588e37c2bba452920d76181dc054d969c46854b9ac4526ade2a6d841ac012a75e68f1d369d6581d9c26a10c9933a2b8972c1dc2c5ef1812f5d772abbe053d179a753f57f04bbb3c959d90a8c451b760afbeb7af669233291fd4fda0d45ee99985ee0c7aac9e4ba3d5ad1d8707385aad019d1b826942464287a930fd5b45fbd0ca644356e87d4223d0636d2ada83b7228d2b424a0a0bba31a246ba452118039d58ab8117591a0e40105da2dda462646b234fb526c3de6c882cf24469b8b505ddda3dbc0e8f589c05703b0b420421702d239cc7052660dae3461ef9d61284faa3e021a69d77e427f609fb8a1dfb1313b0226ddc1664dce104dad78d6c21965ba5ef6260d99bfdba750179e9c6e6fe48dbe9134a2d318b51ce05316d652151254e88b19e97fe2040e98558602f055562b246dda17a8fc6bfd241c0daa007a4e232c24654fbbea54d8a9c693ba86eb989f12eed1566a7aa8b795019728566b5159659c8dd2049f2f38dd819152319554c508b15d85d69ac0ae9e5d551e84919aed41e195d4a78d4c61aacde19f8acb6956ae09e32c3ee206178795082549784158040ec2da298aa8ee88d37e8fd71f825e8be2b0830802867d5bb42fe8613a5c0169249078e967b17065b51803ff08683d59256135522152a422709ab722d65f6cbe553814f86bb80756bc3c3946c9f7abce3ea7d70c804ef531b17ade2f4f21f3d2adae2f1716ff43e940c080e7a4434e93062fbb6eedc752065f417757f79b0d0943da1f4cbc53dd07ac61338a6340e50f9ec2c4ba6db4d285e37e87765ee3ac1dda13d512a46ac473d6907f244ef2400745a200ec1c863e5416c549d4be7dcfdae03315bd6231a8c7e138534607fb45d245f4cbcf2582e74d3c6de6150c7f72203b9be5783e574df67826f3eee9439b3992d1ea1e19e40865a7178a54ee4612db2b765066d3435f2d498bed4172480bd20e1df6d32e1a689909f464a8213d916c53eb6cb73fe7675fc131813d213491206e286f06be8d8bb225028bcbd1224c3422c54f1cf62a0d6df43be502f16cd8174bd61b5dd802c65ec3bbb4c0af8f13d5bc3dbddf89613075094eb337f6a02a347cd369277aef60672510447024675939c78c68b5ec78415beaf2a9246ed29eb642c92d8129a0401363e8523e6195762b3e88dcb2a1b97954658bfb8c186fd98c63b452fe81f5d2119eb40fbd9a4018a3dacb6e6790e3930d9369a5c08023394b48278900221371955ccb3ca06802bb0232fe7241e27e42ef6c5add4ff062f043efb41fd0c51def906c0e4b230d19620677522564157626538a6be4148267142ef97663ce0dac12e10bbed816504f06b8ed0684d967177377ea0cb4909331150d42b92efce5abfefbc7c9420403c58aca25da72706ff24cdd940bb4c78ed21f56d7e512ad461feec04831fda26af999e367c9a692306dfa2c3e87e088c1990ca7baa75b615fbc1251202fe9f108674da82b51328db082e6ba298367a4af744b74b2de8df079e7f50474ea8be5638a639d601a3add439179448135f79e6bb6ca9c4e6879c90cb67bfda58b30f97ab2f6d22d5d731ad03bc28534a9d56820637dd50e60150e1ff10126399930686bedc55d77838fe6ff601f052256fe4f463e832fe0ab07af6ec8dfeda5cb9a982858650977ede035186cd37a8fcd6c3017002c0a2761b37c88b324bc2789409655a0e9563cc77ee91c3a515c8379e8a1bb4da68e4b28edd4a844d6d8886b2aee2356bb1744e8dfcab256d55d10f10551049ebf13ec0ba09c69e6a4a06c174b130963e6b360b9892a4816423a6b5a050ea494dd8dda773af7f0ed510e5e67c82d78d657118a9c23c1433ea0c333e5b743771444c63edc84c02a84a7e449be2eee2534add49cf3f100f50ae2d02c7ae237a326fefb043e4dab5464c81f6f2d933a0280b1edd4b3e38a4ec2a712d18d45f91e43fcc15255eebd714a4e117e8dff15a5136a0437d8135c78f7cb87f06ce18e87784715ee8489d41eec49033c99e214fbd8f1d7f0000efffd508b4479be63649592ca64eea62b382738c45fbae1945f24feacd1213a3fe8ac8b03a1b383cbf93811dd13bbe195644c30c000bd2215d98195a50441cc94f8f44d897d6611da083a7482f69dc1f158ef791a04282f8c24a8aa859bb3fdeab332e565e282a8b11a5c8abb93bcde8f58cf68117d7800ecbf84c16c8e458f06fdf6730a551d49f03d1032a53d12778895b8285b10139e35b68d96c11fb6e6b3f06d13cdb85c98543c9e2885d64862a71e19de692bb7b960c1a2fcc98072bd4ea3dedb22f5fc3a1bbde2f7fb753aaa287b3a0fe909a3d18b1da2180c84b662de646230fd8188356c6fab1ba2fb429c1d454c814228abb35cb0fa9662a5146443f1ff01508b1970876a083be050f0823baa6aadf38ec707ad40b98f2e711a29bf88ca2c32a331a4ac5975762e45e953b863e826312853eaa631a29982206f46b0e9a44d0c5b1952928d464c33a385d527ffde0dff2d3ac3d8a94c5b8ffe37acaac134b5d19c5d5223a91ffb30729ca6364d14bbe68b428de845951b317a33dcad4c586088f84660155502829fd9aed878df1ff9e2d57eb9a79221b9afa5afece26bfbedd5901e57c90a618d8e2544d0ca28ee5cbd22af637185acbe63d71c399e312815bdffad0c79a8e920bcb5895043c7d508d96ea3225ed199ddd57004d92bfd01bf4c3e368ea60c61868b9f22fcb5a37476fd724c8a70d6cd3907f3c2b60c9585f7f2cdbac0d1b49fe30578b1fa7f090945aec926be4cffa170db61a5780795ba41164b1934b71ea9e11339ed29652d42a6e74681a8641b6d4c9e0863543c6005e93c94f8d9bd291284aa0e6e183671ca15191893b22494db0a32193d2135fa6977dcc935fc6cc72dabff358c5476dbaae49439ef3873c116249292bd5140481b139d684a00844be00158a5e1f16c0ce3cd75a78d319c4496f2ba62e4d6388974c744da645ff2f5ab452b3ccf478609016876fee5208adcfb40afbbf015d42ec88f56644c5b5caf687789493edff44f68e85acc048597aaf6f48d6963afbb425f7d4f4a7852b5a8ab76caddf6a36b21e0fa4bc69e6538e7088cc4b87c77a758e60a63f1e9220aa1374bb9a86c1099104312f0301a65b2614994a44e7c7125736c4e6e180dc4f38b580561866e74dc2919604a2405de2141a3bf68817df40d3c8b43daabd131f53807dc8c49fe289069b72186cdc3c9d2842902d06162d7a64b21c3ee7daf0c608c2592c58c60229d1c0868cb2791cfe019df4d509d26f199794528aa712b1d135f229f994cdbb373f807412e2911637682d228236c5e6aa8f92114315b2ca2af9a4d3d5ed47a293dbf2fcea8b00d812e13dd7ab04de8ac78d0da7010d962ed0b5c64803ef5c7b2c262b4935264fea53d2fb2e19b549c8c69d45635c909bbdc9293f6eadc0de64c13d0b5939a6d30ece9484308347219106c5c646d0acfca7207668b038bd50180b61b8056c84f0a1e9f02cb3c95aa6e208bad3202ff39cdb933c64304f252f3070862921ea6171369faf4e1a57dd6b431722cc2ca517460269450d329dcaf0e0632005302351ac362018aa42e622f9166378a1621686f8db050e9fda066668a90c109941966eeeb5a982d73a8310a9c0d88aa6a09799a2b0bfc4489b90549677847f252e22af290979ced1755ced6fd97b6498957c1120d190368b9f01e6559c1e8ec3663b529c2c3e09ad053612e663a5628a2ea6fc046b418bf231d5d7c57365a9e28968b04330f9b2647f67834c96800dc9e19b92e694dd7968a4d12359d1e96cbd7fc934610eb172029c0f36955962754715a89550884fb77a2911e21c87838d1bf987a6f84754e4914f67bf269e984281e56a32b2e251a9e1af07312233ab9c3843c2f58c4e05db31c8dff88fb5e088704327473a200bda42e1fa43fa672823c488b31dd90e21896515c6654dfd7ac361474398be6e9cacd45c2c7b3b8dded4c60fe083ccce9d9e22418b89fd868913affb144a840ffb5e9ca97281cede2c1661ebbb144a17c7f0bace85fdee8dbfb45657b5dd8f21eea3c3bda57a32b7f1f0c5dc1d7a03909447e1a54796883c3582f9ed17a00a1fea0aad9a7ee391d88f85578a908de1885391048af06f425ea0c3eca24df0b501152a220f69e43c099ecaaa55c249bdefd30c84f0fbb23ea3b14d1db6206caa1483591aabf5919cd0779014204ba25d538e33f526d6e065cb00d3a947e1076142f15390f047b264e23183bbfe9bb917a4d317460aa2a5974d124058a2274eb2132374dbc079b61484081a91de0476d2f0801817119817edbb294af05a7645705365702b0334a46a607e7bc4c69ebb976980131a1cb0889757ac12fad530929d250feffdf23b927d00e022389d44a62df3f593cc1d9f4f17eba850e67a0770e8ff08fb6ed650e6f5e3789d2c31e50781e2b23135529b8a448bd1dc397cd0da31148fd17f04d88b01619fa3a437ad9bf0969bb27821a89704ce3e40c7c38b66ac38cfe13685f9fade91845f3d6b4ece6733cc16fd86e8e1bcabe5b6bf459e60fd4c5a757c07a53e2ec6efc5e6237f9d6c549f91414ebe6cb12d88cdc6a178115505a34b2a94524588c928f37db40f6bf7b37f4076ec3d1d09b2883f111ff71a1439d793c77cfb9f0c33ed45c1ceaddb20ae9a0432bcabd85ccd45ff0d6c04dc813a24e8681c893dfaf3e010d000f9df9025aadec73c008e3845f4fb0a1cb5dfb1ca9d1ff04721b6a46dc6aeef312b3055cbf9e1c6d289daf2ca40fdbf0ca1ad39c5a0dc480e27316f5edb6a8341aaa93e531357e8157e5b64b3c297d68632d83a064a4eb2049a3356dbdd662a115b2e1dba80f1221b3bf91e30c4c9617084d725b39c8da73be9d060bd488182cdec350f4c62de6fee4321624ab54de56ea9564923f51792ce7d955858792007717ab9e5a884ccf0deb87ff9de7f4b9a31480b44442b88304eb8853824fec1c85f3dc23ec7e30a4730b746d48a46788935211f60d7b0153db1c25f137b0cf33cd3d6c19bfb3ab0895ee3d8779797c46b3f1f595fb0f7c1dd3242a4afdbb1d8b06ce3443adaa36a8a8d15ccd8b338cf5d48c6c4d82a16d3efc30013efc7a3d7523a21251043205ad226d383b0a8b5b68a7e44cd337faab371a0dfc8cf6d538d4f5c082b36bc4e79e20ab01042f395808b76f19de364850f6a58a8937cf0f60fb01236ef16004d9c4f7724295e9912f591e21f0258176c830dd8a5054226dd17a950613a5850ae2dbf3c1a847ca85259268b184865732dbb0ff2ee9060b81a52fb81e4976c92f14cc42045ca049cbb9314db1bed0796396fe2c93ddb03a5689bee9d78a2526bf70fe98d50759962d13d93307521855e2052ee2428637aea59652be6a08bf701ae89bd03aebc697f936021e9900ff69c5fbdd1741c96c77e03aee3ee3304715d8942b1d697f97fcbac49ee8ffb620fe99aad2e6b7c1c85a5441a8d237dc069cc32917f8e84d91b092953a00309a36b6eabfa5e8f3d1fa9f32170700582463b551be6498094c1aa3c1350a1c24c889c8cd4ab5f043e0962f9038da8ea145f4d880c35e078588338b6bd29103ac3150e52c1dc8cede213c6609d04e51b37a468318860c7a43c9770b52b56d559581e1eacbb5c0152b131b9b181da220204076b1ae32ca3e28372fd8c9f4372698c84289b2be12408a17e8aa20c8a72288cc8961a3564e1cbff801a204f02555e1538d568b5a6a9810fe02acb427a7c5859a2bfcc0e08bba5d2a033ea234a92f119a228eb6f8bfc0b993b07eb2f68a475040e01bee8d7f6c792637ab252ec08be6b4b68662754d66d37cf6d05fa37e8858634550b51da33e330dc9bc67b7278e5185997ee8ea315934a081f8728bc10000fc36d6e3ca970e2f16a3d90fccd686ee421eb93677318e2600f2bd185e99946283dea0a002662f49e50b1682ede3096d6879e3114236a1b6d8482c082ee018ec3a7a28486b0e6ba5b14b12d36f522d38ff9f25611b8862ef9489c8b3038981b927b604bdd03b208d73bd723548bc2519591338eef661c1cba8ca2f4d3160bdeaa21dfaf440a4a742aa4eabbc8cc4c6938b991c5402afc7d9fa7a56c661b63170e42177325896c3fa2fba0865cb7306faca8bdc56b00c5feade2f30ffbe08e72bc11b260fc12b1ffae87a0a2a26fad64f7316ff578dd4dbdd9a99bdc60001828366a5916418f72ecc6b7a7adc8bbb5dad9bc1035f98552d7fa657c29e612d898cf07806815dec55c781460002edb6ac3a3060b310a663dd780600b0019363510114a203ead45a945920cec24a075f1fd00b3ac985d1d841d9c327d207938fe123091a38ef60b70ef480fe2ca167b287411a0e76d48b0ba3437772ead78059dfeb697eb128eb5b317df555b08bf1f4e7be234c0b43e210642364efbde5de5bca2453f008ef089c09417cfbd02aa8e30d9d8c63eca1715380dbd7b3bbb3bd0c4bbb596b619ee7d96de338ee529f39414aa90541109c370a285e7caec9662f537a003cd79644b5f3122848fa043c2f8182d983ec81db33a698acaa2643979f3550d949981aa8e4aa9f0d54d2191da281a6d34fef21d4d0d9f4230debe252a5f649979ebd1b10a69069187f59b419f119eb211a369ba961d37bec59c3e6f44d8cdb491a8847292c5461e75ab83e1fd88681091850f1ccb072d6151191273291b0cff418a29c48ddf07396f3c84c152a227e3a12b1239ca75bf6ac670d54cea379c4434668d03c3aaa324283e63c0ae2fa4f6f5a43f58c06f99021c6982d4c68aa70226d1ca520055d5c0942cb1139a99e9dd23a24c039320290de3ed3db3793f4f61baaeaad14f7e45cb9b334b261dd90cc3ce761776b654a7aceafc8f154a566a09ea35ec29cd5aae7bcecd853e7c41aab5031da51b58aa59e73b11fec90b825557acaf992a57aea5409ecba50fbad882a4b799655bd6e2273a5dd29409d2e5d74baf817b0323dbb35f3ec1d4d7a768e7dabecb4759ab8dddd6dd9ebac683a67cfc902167013974cd66db21e97b91432d8989f2a5a0c8762a8f71c4527e54a696d1aa452ba825ae90aea9561565a5d94c995759bacc7656e858c4e590e4685d7fd487d61155f14ac94d2d5ce14b7faacb369ddb8cef3587564c6315dc63ad3bec5ea6cf302d01b52d17bf0c66eb11b1e425b4c280a9b2d86d35d1d3f75f64386556733b8299b1bb029d80b5653ad8dca583d4e65bfda99bad4a98c466d1a8fab69aea41cfa20d54fdaba546fbfbcdcd170a7d7e85568a7d2dbe974a33a4c5cba8db48e3d40255748c55775efe7ef74707439ea69f5704534eeb81cf5763af123e7e7d88371f417a5e3b1a8f7b215930e8b3be7f8a58ed73e76e4f6e97e385803f5d390b5e496e1d307d53c15b70767d8c5833d297765dd308e762e5860f154f41847bb47e572547301724f39a99e7242406c1ed4498083bad1b60f8d22f4e175b77763f51e1893a54155c641bdc372cb290b52a4a8562345a2a6d32a3aa0619406b92a0f1e3a74dcb8d1336525cf97533699aa081567055c3171673371a7f3bc94524a5f1f3c1dcb2150dd954be99c8ed374a7f7a0ae86d12bc42defd34befbcc2715cadb5729b57eee15008634f7d3a7d51ca4dc562b11578603a68377efe08fda4dc500d54f6ec27ad81d8a7f7d39cc197e1ec190dda7c7a33d1a0eab3fa6a846db4d487a90fd8623999a6a55bc09286f33527a8445dc883200d549f3a0931a8a7524fa766ed1bedf4699a2fc35a43606e0c6febe9eb83fa327aea2114ea40a8ff0805c162b1d80a54b118498bc5be4a01720f08e3a1061947f5b23dce519d7790c03e8c96ae6723921dc643f3f6d8cd6e7b8faed4bba74e2be03ce24ea76bd3813be70c774e27f706f8e472cd8633ef59f15cb341eab96603d4b373cf351b687f9f6b4cbafcf4f00260ffe6a3d21228072a5dae067af1d7327ef310caddfc039b071932fdc57141226d08078a1c71fa6ddb98cc6fdb5635635c4f17193468882bf69b874e839884fd08fdb605a13e9b47fde63f9b0b6dee9bc3b607e18728905bba7325c217019bc2e79e6f7e69500ad63bdf1cfc2cf5713bf2277aa315bba9d4dd9d015128b23f9d7b16198a5252c368947f499374a48c39c194269c44b144b653291ac45d3ced5003963449c07042b6531a85ead6a8893dfbd8cd2e7b8ffe009d5edaeae5f5d2d9cc6f54dd58dee8f9e6c69267a36ad9397a23539f52c7f778e34b1d9386520ad074ad35a0ac86b0158149d0e7ea842153df0eab1ab249519f76d94bc8e7a187e311ee1b372aead3ab1146601ae4734fb4d467e4d0ad11b9f9c6297d4fe7943a68062d168bad304403d1b82e0dc435264f75aae4a87c77b49a9231bee498943c7dc93d7d7350df5cd4971c142df5eddb6490b2ffa8cf9b87a3a54242f7c6235bc9c94a2e566e54418ec0f187fa4cff4617f599541bd3469b7a33df6ea7f8f957569911e9892f219e7ffe8d472a12f559fa722651d1207ab72ad7f58d8a527d6f543488c9ad2a86546e545c12a5959cd28c63e294b8a599449f1ad64a502d3347d33a2b94c651718de385761bd7b5a777cd6d550632618ba72643ec3978ae29f1f2e0734d890d4cb3008df1de5cb4208303196986a891a5909dee1ac2c3922e62e0e1cb17723a1494174f5b66954f174d889145e1456a0b72ce90a50c2d9e62483489424e77715902fae93cdd569fd6d9ef0d0fb188001b487a84a1bc68410b52854e062148db08986eb540a911825481abad213b2e55635441aad065e142762337028cc89710eb9e7bd688ecc6d7089d7bf63582eddc1badabd02d51a5fb5a0b722ba25aeb484388bb8d08285d3f2f15addbf1881d8fb01266645842aa40ab203b3722c1863502e804b915519d3484b8948ea1963150dcb04992be3decad372d40ee2979012e2fc3cf59d5e0d960b058be123df0a007e825d3687036b4e17c90eb07bb8e72dd360bae56e1d7adba70ae8878300e0e6ceeb6400f74906e22088e421d4fca92a2e33a630feac33910d101edc3b90b8ae79c9bc1a579d093357637f0e0217ecead180694e7b7dd06822048043a282507b444d78acc0a5961af2010da88c181017237cf5ad060f12db7a28de7884755aad0b80183575272bc47afec8d387f85c3eac6412fcc1127d912a5e4b8cbe5355c23539f198ee464ce0884fa741c8b8608a461f63aaf6cc61e0de33cb8c1bb5dfed2b03f3a6e42fabcc50a99af37cf5bacace03b0767684123e6ebeac77c29393e57487ce7abe72d5666df39b8b14a113c38026918b7f2d18fe39f07bb01a301b65a2c160dfbd9d0412f07bc216b884cdae4884ce274a115f9bbaeeb4050a881a673365fd7e44b9e82a76e8f65cad478887ae18995f2c44aa95501254203aac8c23efccc3ef685aeb360d7cd1342cff3bc957fe2e7a068d97eee81111275ee75a3732c16ab7a5d188621cb57be0a576eb72f6eb882b1fad1d330aeb2c29015b25621087a6118dad0ce300c4317cfb7fabe958fd0ca6fab706421dd9e950fabf3a08337e14a9c1f861e86ddad42d079f0b3d65af6a6e7cdf9857415b244feb08c32aba732a4ec0803c170fee877bbb259fdd05985a0f316fc6e3e9c30fcf83dcfbdfbe5e4e8f084b6894e0ea0652deefc39c5fdabc5652a05141cdf0150909d450c9a685295c4130f3e90ed6cb7d9260674f63b77f0b398a81245b6084a41728d8913c8c8231c194b55a40aac841654948e742f205568fd40d2911b01ac050c104c243bf185136648ee8202309648900ba938936861a18a6cf1670812ec2cab34faa81ca450225be4718154a1e73c02e41ebb7d2e1eefd968d84c134bafb8397bde39524b79c44beb18b264b71d066b1f1a0456f168c6aa7cde5c58ed832293dd4763e266583c9ca6cb75dc8c27b7b4944a01375a41af41e1b86e04c7db3ed4614f7fc5825bf2930740b6e755152b47e056bf41ab6f0f8ab57da6c7511606178936b0a101cf6b47c7552387466b06cecdb561ad42f0f36cc76d95b614ea3dbae9c8ddddfd82eacd4ee7a4026edc302e6f58b6762ca7334ffff6f9d35d6a387a17e75c12d473dee2409bcedbbb9bd61d2814d53a92c0fe2c4261fa8bbfe7c401e3965787875e1fb47b8e82732b9fce390f0fad4cf8bc9d73ce5d1af010cbcb9ee75827cceffba0b801ebdb59acf7074506d8f8761b361e6cda9a197b509c59fe135f1f2ce0db17b08007d98ef35fddd85f7fdb0232df8030a50ced58b8257709ba43ba4ff0ed30333f1fc8dc61bd1d041b64ff793ffff4528399037ac90a0abde49e7df210e7b6f3b27e38c228acc697b01a4fdf470f19d70173c7e6edf3631c9c83f34ea49c63631f8ee7392f19c0ad9e1bcb1fe61c9f33e728ad77ee8086f57fa31091856b4714fc39ff41803f81d7a8f9ed4739be88c20973cde745fd2730e0bf71328ee99cd80fd6d08af547e0fa22d76fceb4fe6e24c16d90200d6be187909c4ffb5dc98d42e6e880cdb91dd04193dc605e7766b63c9179def2d4e54ba12d4f4a5fc3d353efefc9d178e3aa73c3b69f15db152ed76a80e24b1d3c5a4807f5929d739045b1d95b3cab07cca7a3c8c265e75caed1355ee7780805a63d09502081fdcd8bb8efe7a8cfe74406fc369ec06bd67c1d4158823273f0f7686f8721893aaacce496d6bb851a0d49b086f10b7a0ca5944ea73da659b0f926b56d4e29a5fd85524abbc7504a698bf969a91e4a296d312d4a29ed31422e293ae7a494523a9b8ae17183f4b4030f30b32494c8b2cd6655956971a14a6a6a4a0a4dad810618269a4dc6258ba39f5e448b284b814f1891c452b5c110691da0862e59106931c1cda652940fdc4c8ae36e2c16f352b4cdcd63b19897a2cec662b1a20ecc44ea6a54783191c22f53befc4024e469a0a2cab43a3589f0d407df972960befcb83af832058c8b084ca70b1643c03e1a535143c1476b019db5952198d0d90f8d295f7ef829eaa20e43574494d6392b0c733a097c6edbf43e014f3314004bf09b79f43193d01a466b994d35f2d33ead540d33fa49e9c8d30b48559b61ea07f05c73f205a8695b70aa073da1b3b445109c39aa53af28b4d36a1b16d229bcd5eaadeb7123dd38f690fd368c568e993ff03afe172005c11e4d60eff2f38ec5b29e8d377e2211d1047e960df368423b7be753e438aef5f36dfc441338e7f7c2d0ae44b65ea7b3fc7b502245df26f07fe32b84af23110a72e0e6d337e7baaf8e26b0f3b66dee7d2347bd0ffaa7ddc4522c3d08b05f6e55fdaec63b32378cab62f9b54fb1fd134b2245cf44c26f13d8b9f2ce741eab09ecfce0bfeaf841bbbe646f6757fad0801f8d899b61c169ba74b6999a0d69c4163898d93c432d65a1b5721c0d55744add045fbdd6f905b86d63abb6d3af7d2d57b7572d4f68dfed8d3f0d136a981d75346c7ae7610ccabb228b6e16849eecc7821092932a5bdc90c64c17275e3a043f1c71e4c41549c83085ebb9e6e4889ff15c73b21405b496991b6d68ad738fdda132cf4bc76dab3c5ef661afb56edbb6b9a0769e1fe1d95fdbdedab39d1228a880dcb37d9f77b57eeec15c97b7104cc09fcbd57305812f040cf43c6742577b1582099ef3aeb9160d775615800c63d8d679c90314c29e6f3cfb0d214f7b604358a2f790f094c74b78ea3c1c78da727de0a9b7883c0da90d8b9e7246ab5963f0bc157c37edd130201e58303a485d4ccf43a29ad1828e1d4fa0194384145d8cb04296ae77e1087461c90a4659ae54f9612a298a1cc2f86c8f07401cd0f32d04fbfe6902c6e561684db27c8de75a9325af0770a7aa75435b693f51426ff4f28ecdcb5abbba18ce1cb384d6b66d61156bd1f6b45ede38e78bb6a74230acc7e7c653b75a6b756d636bab1c477d736e9bd41b5647cb2da9d54614b74b5adee9a59de36d585b1710b889d7f257cb9cdbdb47159c23ec7f7e0ab5e89c1da5455c6f95735a044f1ec39b65165525d88c77468a106c460a046d5a7776df1f6125aa1c73dc6c3a7ba9a9cc96e8104cb3234fc7568ae242764b7bf62f9ceca1d2b3a3a9aa4a83264d159aaa46a282eaf2d4250aea090a0aa928da9c497369f2192a3455542580938710d14f77a59b525a6bddb68dabdbc6715cd775d65acfebacf53ceffb3e1004c30f04c3305cad562c16cbc666c562d9d8d8dc7b6f6e6e70eecd0d0e0ece8c19335aad160d5b5aa290c856a26e11e9541d1dda5387cba9f12db21b2009fad1beb72daa0822b020f1829a30a45195355e40b1c044124a8ec8f2e7b7cd81d0a0cdb9c67e73a10662f29b7bd040347e8ba10cd3115496c898e10ba32866a0a4d1420a1830c103b9d55abf59c3fa1b625bfaf6ae05b7f46f4f8a71e070cbeb49f190f88de4a9370ff5d3ff5c2062c6f1cc38ba2b9783222edb9f5a7ccf17b0d495f22121093f44ea963ff6e7c7fed81fefebc05a6bd9d9b2540586b017ac055311db6000d93798cccc4c99a03acfd61b4b0c88de4df6b1cd4e9a827a9e75ac6ae967678c3b9da3ba609269d006a35efe5467d1753b11e69c28f4e38d1187509f20d46792de983b7df6aceaa91ff0307951a6c79b5eac9d4bea1836ac15ded695262e7cd8b526488eea770facbb256a7bdc56e914e201c4248de73dd7988011031b52ddb2d54044845cb488fe0738519860f2d3ab4844e8c17cd6760f9ecb13bd615e377a56406b6d0e1c0f7387dfb12422049be3b7e3d678ae3121d369b999138b98ef99ce8dd2cd689c4e0d6b1b64a7b74f280d54d430a50e32d23eed3b4ee01cededd3061e1201e368b71f7645732c227581d0206f9f766bef8502451e9a3ecea09ee4041a276cbaefece0fcf412e74b9fdf4f2fbf2f9d839f5e72f0a5bff760af7ed077c6d13369d6c03cb4cd56692acdd9649a4a5b969f1e3f34d0bf929b3dc7b4d166505f6e491bd226db903624a4b925fd44da6661a484ce2fa463643806a13ed33b4072992c81faccc96548263f2f796a84d0bff115e473d099e45590707c3555c3a6d44f276ed952964984d2404a34c832f592ebbacbcedc4e4d251ac4e4d28c89f63da33ed3b5cc6c285244f5848740d0b4f165e40857d5c043d4414084cb7ca58ac5be8eaf193be232df2297f95813a424482d933529a7ec35931a06a561d3a79dfd744bb35076c604d2bc762cecdcd8d33eeddbc8ed039633be79689637cf227bb70bb53b6c8e2ee5aeae5cdbb05603720ff768e7573b1bad30050b14588144062b2041e22cad71618a0b25514690ecd705c436793210fb9c45da8d94d0403cbe6a08e5b6dba5bb25f15002be690638e806fbb4d3a4f2c65ce1fb698cdb801c1ce4ecc3eee59905df6510034868587b0d9a5fc43e50b4a1f99e341f98f0d4168392f42557f970f4e53c9a48e594550a543299573bf9ee2637bea78ab41b692fe1034d4203b11f6047adc9cd79e8073f0a2ec651fd868b02427dc8b265b46938c1d4529f29be84ccea9cf812c2d5b2883e75119a742adade1310b4997af6263345a6cf9869a986b177dd78709df5babbbb44758122aacb2423c5e18a65d34d65466588191527a6341d4bd347693a095255541728a2ba9091829a4a506694096552994b7d060d159f4953d53c9e6a17289b7b736f7066f8f0de1bc6de59cffb3e100c3f300c572b16cb66c5b2b1b9f7e606e7dee0e0cc98d16ad198d1343aa76bb872dad53abdb313f68ba7f2f0d09e3caf904516cbcb3678830d4276b18a22ed29ee842d96618b3c618b1aac7ecc6fd1c6ea878db0c50d5cb4a74f6a831b461d64d774d769edd8bc2ccfe559f9f05e83296cdc0d36709f6eb9dcd2ba36e099d3e55c6ec9e5b283ee95babb4f9fb6c31bb2f768cb73ac4c8c837d4719e739997d12597b03820f68e6fb97d7fefc940c3e3fe980829f6379b9e725a4c0f8f2e7d981f46007c2fe23a485d9a5c36d671d2e7d5e116d1d38c4fa4001473c79cebb0316ee7d5ee24bec5f60af7edcf75cbc1f276ee22a0c7329141043a158bc0775203abac51f51a861b434f2ea2203461d088f3d80d019cfb52525de05757f7c78ea3a7e9ca903a1fe23c489e1218a07a81e98bef4d9c3ece7df207a05e117428254aca2e83a49419e3a8be58fd22dfd87d020f6c9791ccc1be645d5791504f4e9451a367dabe1d2757d33b8ec3b600e9743174ffd6c0f55703767be3ea9b3ff70a57fc94ee4e737e7b1a371f6c8912a424207c723a087e3915005aad24829480fdaf126726512149924f2f3f36bbb04d8a2d96ef68e9d63df2a6dd1babbbb45bbd367d91da1810d271ea797d38e938e93cba986538e938d0d9c729c6838b59c6638e138dd386de04e374ed7c9c689e5b47272d169e5143a814e9f93383a7d4e9e93751a01e0649d3a2700f438754e3d01700a0007d4298d235a37aeb3de07862b96cdbdc199d1a29153c3a5b3f3e2d1c046134fd3ab69a749a7c9d554a329a7c9c6064d394d349a5a4d339a709a6e9a36f0a69ba6db64d3c46a5a35b9d8b46a0a9bc0a6af491c9bbe26afc9368d0068b24d5d13007a9abaa69e00340580038f860bdf6c5a37aeb3de07862b96cdbdc199d1a29153c3a5b3f3b2b1c19452acce6c68c0f3dad1897dbbcb450da84c698b9a72d5c8a1d1daa2be7d8638f228cdc0b9b93623005e328eaa6936ac5508809e1d5947a30ac1ae27003ad3d977a68f53e993058003d74fbd375bf9c8796fc638da5b46dce9a5c7418defe0e832e330e20a20e7d9415858673c64c3f358cc38c255085f8cc69528503c2ff15c8b92c486f53c64e365f85ddacb9fa7f988d74bf0f97b16e2d140349cbd4703bd5c359c7d88071d04a33e3c34c3d93d1ec271e66ce586959c4fefaab35375764cb05e8bfcac5567e43167865b725490128a8839428690c0810f3490cbdb8934500d77bd5ade725ef9b0ee79cbf37cf3dbf25abe596fbef597688275eabdfac08a9b839eb76639ff045e53549fbeba4328d7759c7942461392138ca1831112621c552dcd20862cba90ed4186581a6487739dced9d220170d428360f435ee8cdce88d1b882e714269989238a3d010674b9c47a210c6d18e234e8071b4df80f9f61be6db6d44661c2c31dfbe1af3ed6114647eca6034c802ecd39c864b185cf015dfde5f6e69e4375aa69ba0e7f90f7ecf8d36b10c7feb80855b8b72f46087dda4de15d1e7c659c5ccc15275ee4c969ad78bc79708d5371fa153a822847a6f9e8233599d49beb4677710b5fa7daee910e599812aac89275442d4ae9421250164b4c0420a7a8832c60559ce30194208272c2081b951907941131e920843071734f1c41349b848a9610c2334d470c593253f342929e0881a827c8099b50ffb00c3d4307e9fd3612d7bb7e8f0c41214539cbcb085acb76148eee4a2fcf42b91d389da5eb965c8ddf3470dc83d411e039e7a79f35c3807fb50970eb763314fbd5c3dfb94089b0f9bc46d1dae2d6d6c78e8e7725001d887ba8e0e0ecef7658ea7aca7391807e592c33a39798a62cd122eb0f20027846821ca89345864d093322d2de578ae4919e3719e6b2a2863d21a0804ae37613ed36c4929e9e7943552c3a611d717a114898e93991cc0189106881590db886473b24295cc8b16b8f00559c712c492a7be4737932f6129f89269327cc952b22f996ac9971349c9c7f0e56432c241aa872b5cd4c678c9822c9d0a1596a82a5ebac8aac8526887091da65e903d216506241da7142e9aa2f030554613d963c96612b003172b9021031aa460218d8eb43439a24c0c5564b090e54c02e24c11656267b620b1429673f63389110f5b7688010cc0c0018d12520c630b1800110412515c207d3c9111ab2931431213c9cdd0454d0c35637c7042b2c64802c60c3d6ce14316d2c8698ac674250c2cbec4d041196334e9b0c5122ac0819c3390806189082b98c4408a9c3e976890d10b6366556081a489531a72d2b8305aeeb2cfce2068185e3c410f4948c46c917d21a70d65ca8c4942892921b2e002fbe93cdd4e774d25b6d35d5c74e8a891f19ef2a3a25d56ba4bff9df9e9df9906ea59c3e610b4cbceab0945aa8a31bcb0400662cc5ee028283f5489d142104014e183fe9ce4c6d4c1d1dd64349be302292f489ee0e287353b57b03c3902ca0b4730b950685bd426b5d136a88faa2a81dc536eb36f7779b9d4594c3c34f4eddb96ebdfb37d93f1d0dcc00f5496402246460e515640e54c15573ca1427202755d56c40b6aca08824a88a617a6b024f1650b244a3421d1848620d2df3ebc22db9496da37d9963421505b0269498dcb0e3203f4d0430f538c5822c6096ab8de0310024a2c0a115cc8e00b18c040891b76a0a1d6248aed06842947950331c87285942e8eb60422531fefab0e564b7d2a110e94612a2c60c7f39ade737c89103af51156744ca18a90f6d5e7de370671ead3b9a42e1d53a8b2790ad443ef3185f695afc617e79e33b98d42da57e38b1b837cfee27ce5fd122174eae1dcd13d530f5d48574b7d3a1be672d648c33ad1457d3af73a0f97ee91b1a8619d7f33b83346053801237273ee29b728bba4e3d36b140fedf829fafcf4497e6e83389f1e049c0c75b439f3346cbaced06eb0873669380d457b9a1b6d5ba241d596f72be35872bfd76b84cfa98b522b5cc883a89f4b5d7488e1cb9e1ccc7899fa92c7cf9269b4b7a5069a3e7da3d240ad43775371517ad439e7b99500939bf7e88d8a088a9c5827694526ebdc66db926b5bfae9bc7946b4c31840ee2939d98f00fa37a630a65045c8f44ea1992df8a3e346247521d03f67ffc623557814f2b9ce78a4867f9f1f713908ba1159c488e8f2f086192b62844cd4b314cfb528c048a1460a5584d4f0e929b85e22b8bc7d488d309749707c75fe12327778bc4783acb3a374d98bd0a0975337425b4e7d2ed1a01ca75ece5851c3a891220d7be2aa489d0367c82356890093473baee32f91c91dff441d9f2ba297084624e8113022c1f1881179a48a101d077dc7851cd9a1c9991548703c726487266762a48ebfc4498247335edd8e8ef7689eb9b20e76d85175453aa887368f1a88675539a3d0d9144ef6a464cb97134949d24c9a4a5d650e898b35103f29913d75ee88aa808bcd498265324d020522c3ab5bbaec83f5451807753086cb5e3295f51f5c5d45dcfa2854145edd18644727c8d1110d9fe1472dc7717047e4711df1e52ed1edd2652ec243dd53df967868c753374283a65bd94da214741e17023acf78a44ae747da41ef46219fbfc6237347045d47fc1ce444fe1c91491a22932d91c919229338af203dbdde889ee788d7698836de1259a15731024c1e1dd9f8ca8f58af20a0478049d047a064b660b286fc9c57db18e4e808c9f5a3231b3f5a39e8472c3f0abd1aa13e345cb16cee125d894cf668a19f8651dfb15f2ed732e27a460b40eea9529d29dde8e64c72be89f68a94524a23c0e451fbf41ac0f971bcf158d65a2bdd2847ab4781986bad955e4eb41c57d65a79db782c3ff07cb3c59d4e89b888d899d68edaa6d43650093275f6c99672fd3c0bde2b46d3aee321f43db86d1b277a3f450c88dc175aa933a515c817243623be7c795b9dabf75bd87515cd9755183a55ef033d6ff2101202bf073fef6b0834040c88be6279de9c348461b15644b47605ef5c3d80f3cec3550826a8e3a534c01a16c6e67ade9c2808736f3c6fce4d863037389e37270d61706678de9c348499d175cc5aad4228c17fed5a734ecf9b9386303442d68a0504c83d254ff0d9c12ff989879010fd9e524a69ad9ef7936b2dc137ceeaf8f9099d9be774ea80864d0f6e3cc13acb6d2edc1e77eb6db5eaf2b85cde575bf70b6dbf655ac7fa6018320f79c03f3888e34621ecc4b7b32512d2cee0e7852153855e744c4b90886bdb5d8526460ced092beeeab9467ba24feef75ca319f153a35981816db54a66545c9be71a4da981b8f7b94693d190baeee3d8dea92f5d31eb2aedd7441218a29c647824a9599217a054b0040625254cde0525fbe3c50d6daf0d6f12a9245349cc5c57982731d06280bab51f96c4da87ff5f406a1ffed25e297b5ddb732d0b93b5c142975cd773ed8630d3bbc9f52268977bd3031d7383932ac30d2f6071433594ea8260cc2e6e0d3253cdb5cf352850541a2eebb90665891840a135204bb3bdade79ad2125f9f6b4964f1a5cb07b09c3ffdc10e27f5e982e1cc17b5c7745607b9ea53ac953e58697757313620f310bbc838d83dcb4dcee5ba979bfa74b9eead75a4b4e956e79cb39b99997396dcd969b9dc7d3dd0596fc6d2a86706356983ea96364f7d48439dbb01618a53c3489f3bbc67777d60638b3be3994b1a2e4cb0be6147b1cf341de49add51b1580c095936d4b7b753cbbe3bf42e1bcab7779214df6527f911bae19b87d2971c55836692324566f0ddddadb4d4c47739a9e4f0136a76692f2714dfce53627c370e5fce2adb59dc10440e4da8ac210309982b3a8a2fa8b058c1821223c874abf9420caa2a29a7318220998a2bb82079411661602003b29c4c4f684e54506112660af2883440e040451926a688822c2715104d645e284181171c66a40e2ecc344171c28a305bbe167cd9fa8fe779beecf96f06fff9f7f995f29fbb9008e3bf249480ede8e043f7564461f3f47c79d06b03890fba5d1181b0ef69d8e471b18ec0d060503f514252ede303cc54fb38c1f09e7bdead88bca01c61b4c448300c2a1a696f77c4d277be79ec6b074680f11bf753197e698db8a2e3a9cf2eb7743dfd741a4e447d47ad7600419e4debc6750be68c12b29379e42f57205951f3c21251c630da610aa4265c68a2a6852886c2c511373b5078a88d40f2d479ac06ba903561841451bc28c15b8c61c31449b4600a599ab6812a0a16bfc6262b9efa8eed42e69a3a3895363d41c65377dd2bbe084363d6f0c224e5a9e7d020d50316301011234389d10d6b909072f002c30a54e4132fd4e0f0108df9a508173cf5169d92544412468ca9a10819499f7690e254a5c915332491b483a6522c167b81a494d6f094524a29a5142700fd4402b8e4f1cd4f7fe5866f26ae6031040c434c41c4ecdb7f88d0a28625cbd78a4801518361e59b40b776f1d46d5644d4b2e09661d9e2f9e6f2c633400becdbed0c06dfee0a2288efa820aef81662f62dc475999d8047734f5660c0f3eda11461701308ac5aac2c3dbdb06ab9f6a443142b202e6f8ae9ad889aa84e314fbd52efbe007185836fe75644dd45ed6e1c65c553af4c45bcc005287ce0628d1259de0428295972a44353194e644f20d4a793bce001ecb25cd24e257e7ceab4d56ab731b0e1bb0a19528213770888004fab30794ac52d43174f8d8a98a1efa9f187da0f4ccfb51f96be04b3fcf41bcfb52969405a27f44951bbb9abe7b6acd465de68d467ba9db1cf74fea4e82775bffca47e7663df803085caeca99642724b0cacf9ea2c7c3d2a5b0aa7eabe3a073bda549369a9a8eb521b8d06d920d8677a1394123f9d09a99f341ac42454d44bd919e320a27e551d34a1006349c0a4068ad2405c9bd2a4d401ca7ef67cf955814a3f4b7029244b70966449366bc25403ed09940d51503accd4d19685aa81ca0ecdac6aa0d25a792b3c14a581da49f84338f574d1f1e5542253e60c0d5f4e343f67f872a6f97bfdba57f5c5ec4ceaa777681aa8abb2b1aeaaabeaaaba2a1bb34856d65505a109a8442d1755410b15aa190900000a5315003020100e0904028138301e8a9bf914000b80963c6e469f8aa34912e3280a8220638c310a10420c41c698192a1a07002f751e92c83a4bdaeb979eedb5c708fb48d241c945e54ff49a1368c555fe9f742d849a58b1a11da42ee0ab66e675d3e580d841d6e342d7e06f0ac052d05c128f187ee149acf001e939d7c0db5a7cf9c22e8cae595a53820d13c1d4ce347149e9b9ab68093d4f168743d8dd9fcd3f15d603def3096f4ea0336509f3234030b4c376fff5f16710549d6390c509dd7e5d589399562fdcf90f9acfab43dc511132a36a6168667b17fe565a9039888236966a7969c13c8208d21f24475183ef9496a1c112fb516b2439ae8afa7f4d8a6c68ab35c4f1d9f68e29e055b6be3027017cf18a1f36228f4fa9025b71919e82ea4c029ace74046dbd4921836633a2db83685c538024216c48eaa957f6a79768d966090df8d5ba1e60d2feb63f5b6052904069108e5d6bdda57810a1fbeabd8e532805ecabd8fb32e20468845f083f7fd9ec92b0b47b64e3772b6da6767fb8fbcb18f7460bc2bf80335b1c99722a04bf300ab1086a1752dbfb8aaeac7151deec0a33f02f331ee5877d3f3e830427fd88f01b7bb779bf5b0e193d1c32d173c58dca1c034ab7742c9d2723105c3409d88606224c12878706d1abcdfafac729d918dd39568fca1c61a247170d6d7b9157749d0d53d220a7d28895304d0622ba35fe5a6fc37576dc8f9c8294a3b94e95383d7fa980c3c9161af4765dda74d17fb8d6b346f1d4c5325d7c75987b656bd57a341b36c92d9966e23a5850c3aa83e5f7a985e8aca18fefc812fe15428f93ae569933902a44ce9ed909c6263a65beee84243a7298791958088501470b7e590ade2a9f25380a6a1b4281d45620557137b181695f582d42db0ef0ceba76bd72ffcf81018a64df9b1481421d79d561b4d7f4bf79c0cf3df50261cc1d2a0bee00705382351809414e8d44bd1f2567673a601cd7b2898206b642b0e113a996fb10596ec0ce7c4f9054e8059fb4ecba2151915ddceea8df6c25923e1d518642c09aea47f4ed5ec6311cce2e94037c16ed15078025b2ca351481b1965cc6b20b79a8870d65d310c6e6721bdd780a73a5d5ae6beba6f4f8d3123a52c39139d46d9d22d2a38444c1e08c428bde7b011c37c3459afd1d6774c9ff5107200f3a55ef5b6da55020decebab204c702ab964c0c4fa674bbf278e25d65f07b9f31fe8b65546461db0469a9743352447165b2d847deecfb74926530a6e434bb3575e4daf00d7e5d886fefbc4ca678483c4565e38096abd6d565dc1af2afac32646538b06b4bfe02c0cfa8059dae901bf1952ac666a9c05428b7c550ca2ccefd484516ab69771965a1459445033b37cfe1320d49376722e6b340c3c3ed81cc4c38fdfb7da2e873a351ecc144de01703523d4cf420a0d218d4e0141b5bd2b99e1ddf4dc9b4539165fc927204b1ff38af237a8d8b7ea2d743c498fb01c2711bf3adef2c7c48d0f4a82ab86538a273828884dddb63afed1e02bf8f774a752258f99616293844d9de934009d50747990182676fa1e9d85ee4243531ca5ae6dbd5d4298372b4a7483930715f81da5491e1624fb4901098045f290e07594216bbb807cef25f26fdf1ea5e91ed32938af08222401bd3fcec42122052503a372e11e91eadb9f5502d3f50138c6000a847b02cdd358ebb6bb0c0b0f5ab736226635c25f060c8b42c5ba9492fe26b551cb677550410921a29801b482e1c21642068b6b6a76807657224b247db3edf84499ca04f4e045a70fcf22e1f38ce3f34e67776c77f969ba20ca286b59539cc61257705483f413ae9e80ac709a9ac5d844bc979900231088e68ce3f60fa90af847318b40f717c7a44f29c93697cdfc98cf96c9856def347ca83b1b2838888258004218f76066c24106358460ec284d320785ca03d5d80f05c90c38f8541d0f1121d648f27aea44210d55e7d9a8724c54d19e4c43d2edad0a4663ed076eef05ae0aae06acfa354cc8a03ce5cf74f1d8e3223b43ed05e52e1005f11231b9473f5b966747545962d2b1b10929134bb1cea8a6952236101348602d7af94512ab33db9d297e1428cd3c39b866a7d6e693e3daa068e41218cf7af0d4a09006be841e60cee060ef943e4a35a5da3b06c0bb2286a861a8649b281405dde4fed8e09521bf3dc52953ec3cee2cae148ecbcfdf6391f935af0cc53ab78f1dd50692e4dcc1edc51db10ee1364ac822a772f39a1a237625b3a1e426117274e595832351357ac507a3acb1931b6b8c7eaa4b0e427236aecbd555d548ae1168bbb7a3e28e8a6b6442096e0dd543d2a8cfcf557acdbcecf6b26816059543feeb2e6c11832cbd20a1fe77d409f681c1a9317e25a52083e52a1111887da780bdbf0279b532288c109b1e91418e4effa995e2f4414580a2627eefbb883bfb8fd6789d027f5d1d48c4e6bf46bc758e1d1c7c0082dc6ae534e1717708910ad9f7583cf0393174ff4186548955ae0590d7f7541566008a814450120ca1cc6743416b45e6fa5aba009e4babd733c3ed612293d4155d1fa41cd86bf7d4da53caa46067a259f20aaf17d60efcd1e5b246d783696f5741ba4e5c30c398bc90657abe5445e91b2ec2b540b9b557f302c1b9d6b5dd483d6d98f80b39d83346f6a73f7b764e4b555bcd7a629faea5d40e85a8a0040529842a1b578fac2fbfe9b01de7803c1e0d4eaff3c0efff295f88682655abdc0e6408ac274a68d9fede0fd447bcbc68bdb8fca78ca1ced5e4f058e0c2ed71cff05b092189a3b464830a0f30d6692cf54962cfd0cd6310fa4bd5665fb1660e906fd142f12e3282c977b37938388e17c68e7b4fe97629e9f9750efd65cdcb149308065fae520153ecc548a1e3c505134ef47252d3dceec0d890a01ef3bb0b68590c5018c8b81032ea8220d00001d2fe29ee451cd1b1548be5007f0ceb3a5b589fe850d40884d13d01631ce5cc5ef21cc80f8996c283c6d5e676ea936fc4160f42a84202dcb382be863ec1aebe9a8ce68d356f0cfd45027ccd370f4334cd07cab5e26b614109ec257748b2de36620adbc0ab40c57dc516a8532e1527a8fc63c177770b0382ba8464665b8acfcbff22874b873cd241f82fde52c9d19aada7c3b9ec488b1512efe0b572edc0b9a7dc4c692f3459fd5450b8299bcc30054d5d20557d294054121d715f8e655e09716740ec6720f7117c46b8c5e64aebfa06eab62df1a55865c20a09ffda1c23a31bc37d7dd733d1506d6da4325e3c8c2bacd6d26f33ef3604dcf47dc3d219dc305e1fcc8d447529b66cc15fd06b7e195ce69834ec9f942e6ef6fefa66ca245f8006a192d23b6483a73957b7f1427d9b7ce20c79a7dd4d90ec692999d8326ad0b7bea4061341ebacc0e3b82662dddb8077fc34d3b4f3a9d13279e064d26d5ad922b0fc22ae10ba73ba167280769722fe99ed6d6ec34536621fbbf4dd2a3c667b8311f3c66810d128206c952efab12ee5112540dcf36d932c16b8813fbf2c76deb661d26a387ca21ea251981c532ace274402b50b57d181ed1204f3aaa45f778b122081722c88d746235b4603544f0e2fd273ad38291f49e8343c37b66abf5f49ac3f649dc18a5417f7f07256729c7b8c3d1e6869c6f2aa034216c061c7a4d55fae0f93eeea96d0bb379f9855d95f082ee75b8e050b26f673612451e6781a36ee238e81c1396ef6594f18077d16fa18f77165b7a5f73b8cbb9d4f2942ac992b8afa5bcfbca9c55efb0f7e90d5a64fb6af9f1a8c10c61e3182f2c9a56dda598bc4b3961ece06a93ddfd0f54904d0dd7e2c8ff6b5fa2dc806937cda5bb413b825cadac9ae47991acead6798bd872869c98c54a96ad29d788f9c6b7a2d642911bd3ea38e44c286bcb5c40b25ce4facea0749c2b9c3a2e5bae98a20f3263731e2234e96081ff51193a8571715f5dbe3cfc5fcca0a6e35bf9af36582a4ddcdc36691f88a9272a41bb222905435be7aea2e085d9ee1a2d9d3147ac5b5419c8abcee8f760a8f1a8534fe9dd0e24479f08bbf5d270b72a5a3ea8fe6842182cdd46fe3b0100430f100deea5dcaf197923114b6b60ca47fb9b78d148d540587317ce22624dffef3d1d3185c004bab92c54cc574a7be1c3ca2d7461bc2eabc1735e0c394af641776a1d5c5900ff16aa73bc4751818bbcbae21fab19ebe20a1226278ff4abd83d98a91066d34c989177cb47ec613fa93a4ae258a08398ae32d7570b7e5b0b2684ab050f3727ee7f737661e3f96a521d7ecfabb6c639fb2ce85da3aee32136878227f140e767e71cac7e5de07bde32d03f18df727c0fcfdd655bd466c73c7a9ff7c85411885191786bdecfd10dd783af82fdf8db0a6ba5efe842b0d556509e5e90e7bb9632358f16c5924a92351d9d9011d4a7b90a10b2e3e7382f05e237c6c14f7650426b3e79a4c224f4719bcb09727c9da23076886287f93563f1bc799ff05b78c82563bea62d66f6933ec8310246c7a53d191a39a549f33c5763851dd944108616acae6c23f5f5c6132331b86d74042e06afbb49e72a0bdca601ae6a519f469a1045266c2993173c1807d638cb92b11f4fae0600e731825cec06120e0b805270a24ae970526d8d5be1da73d49bd6f68cab6ff9474ab15eb0518893624d3b04c9a4c6fb0200b24dfc1f66e7e08fa95c1967808805c51a627004d9518cd57b0888508d9058a8ae7d2e0ed93566320d26aaf5264d3ac114c2ce802c3211be2ab9f7f1b6003216854a6061987b37bab82a48b68467059de3c0e2d5c4b04dceda998193176d1c6f338e3d481fbb009b97976b50eec2b26fecd7ec6d760427fc5379c5ab14003d8152340c5caa45b92ac71d1d9ed62a24d490ed8dd4e14ddbddb450a1a0546096a1e46321bed216e7cbae70a5d2d61662c486812100909d7f8e41db1aa3684c64b7efd66f34b95fec04cc2688343721bc29963ddf260d93b06c3dc9511acbadc18c734d39b8568f2db327db2b0d04d3bf828217d156634957362b28b61754cfb2675084af8a0a7283d35724b373f378a8439d522e231d322292324def12b777f51969f1a0484ead82025b2c128fead96bac337ed7c4bfd12a2bac9b0bd99fad605977b2d8661d4a88848db87e2305a2b7a1d93c66204ce4b626256866cc938a255f109fa1dcde9a82eac1567f3ac83a1732060e8f19669c1ff1013761050ff9d49c4d4672c5aaf857680785c48a078390dafb07b0895650a0dbe0b40aa56f827861e5b2669e5db0c2158f144f383dd10a1254c3f3a70ef206dcf06f876b845c1cd6b6c3c12a12eed5a4067325a70d76ee02ec8821b76bf54a37dca496f2bc21e0117afd6cf2de6bbbe57c3f29464409c8a9fab622e0cb9bd0d287150f29e028dae40fb0ce96be529cd331d0770ffed5630042d631cd81941e02c8016bab89575032e2a81415a4e58db75b57ef52ab981c38d10412ade7687bc14720e843e462c6db92042342900290d60d2c363986ee644bab407f38b0181a9cd308d8d33476494ec8c04bc6fb38bc8ec300ec05be418eee20964cd4090cf1f406fc7cde7551168a419b97d9a7d5aef3c1297e96b3a8189141168af7a9a2ba01eb11530537f7b10b90271b95c45bfe1caecc58480ec1d20b868dba5815a992134700e0f0d1ed51ea44fc1c51b2efdab16cbae5b64be156765e033988eec5697706b8dde1e87aa7500829df9b0f264573fd8f5500d609986307329a7a8e565aafc8748f5168cb729ebd80c7ba0a12d5fcd35cda6b6d0e35bbfe7f95bc86ee8853f84a6f395562ddb5edcfe57a8438b8ca2b69fc7fc73693f2256d678cf0147f9ebc891555f6b80a86f9c2acf8cfbf586ec395e5b820952fc9404a1e12cf3e166b0160677059bb10d278926fe0fc47e4e9a15b8b3996d17c966c5a785d9a70a51a562fa611c7150ef10102099e2528d89eaeb2ca8710c92059109bc4c409e6f65301045d7d5e80faceb0432ef4d200084459b1a88d3514804aba52875db457128b23cd8716707f3247788c55e0c710e0f1142ececf59650d6418ef9610a4f0c168b4bf39b3b51dfa611bc0cf51a507eb824b0499fc36d1f856bef2372cee5866e0f6819dc776c7d49e6da2889f4e83942db9d346b687e5d0cb4aa9b113f7aac1651ad6f98ea1a6965064c36360a4fcb88a3ab6ab82d2aa0843c626dded97ae744c75f9f33113072206c3517b982a7cb6d04ea12c051fe6d2026c654a5de7f162b361f18a2816d5b61b572e232fad55943ae3909a81bac56f8f7e09ab9322e66a8c29e8340706bb6ce4c188d86a7b03c6271ddf9bb6cd912ff429ffdfd28ddd2b032bb90d3d6382bafe633126763a621384a1468b3bf90174e7e1f02c9184a96a883a0b4f8fb56722f6c743515574937bb29c146ce50ee94e704ca34f4eb411148f17d2c81ca352c6248064786bb5f420d0b1e845ce8b9102fd16fc9c7210a39a0a42dcb10557f901604c5107c75149f43fde852657ad7179646001235d79685150ec052265f14171a4612e15c24e9ef9c5d140ca414a1786cd24c2a8350e64f0565646819b5e48a84818ad425d8890c443df7e4a5afd2740679f9871ec08394509091e9cb952f5f78c16810d5c2d670f8c71539348e2abb38d3e135f22b483084d3060a84c1c4b1aa6c3c2ffed6c660060f172c3d70c76d5574614d6134a174ff450a8930c8142a1447fea7923a08b13b02045c07c30c893c0204e010f88d3b501600aa9ba554c69d8a5a215859e503220d8887000de8e6032403bc1dc55b4cb5dc34073c7a40dca4d089e2e452684278d43bc2c45149b033a6dc79a6fb2210fe68079984d85b1ce5a5eb1bbcc679ee305ce4ca60390dd3e3aa05b2cfc68ccecd9610382b43fa790216e91b6660de5ce442b4ef760831a0f95ecf403df2603de5607069dc2fa81cbaa4bd4b5096b0a83d3f16faa4e1edea5d9ae6fe468ba7755021b53ee61896c844bbb789a758ec5a07bbab24a82067c5359dd90ac2357df31dec24b11367f0c05cf76663f5137c4f279ff71d3122ef7e640f958d3575b51a843dc8650b93969d95bbe1a627a9de8ff421984588f1348a5252a1b057a5e360abeec445535fc855a381d4b84732e208f3aa3e141e20c48193f9b814fe2941d10792a2d00b2c4a539b721df1bce830d098c03301a45b76734b658d4082bd3216fe16375d459a0e7f8e9b50645833658f956513b3b5a38025e3bd84b302a4d1db916b991c075e8bf32befdbf53f34294833159f301abc58498d4ca1a20caee5872a71193c3c37878429bef1063b8772f9ea84a10558474b1cd5227d448889694dfdc19c42e0769e89551e85e0ec277ea2ad4066127a7fb68d7e467298dba828e24c0548a1e26691f8edc5b46082109dafd49c6c6ad1a18d531549eed449c8a42bc31f7df13ad91ce8ef5fe3ca821e0e744a78fc14ef9a9b9042608fa3a4b2fdc4b2bc84f0bc755841b97d1874be20965b23418ef4acf8ac60599717dd25bb1cea870f621ee8f76c701a6b876b4a02548b21e718b779a969b281846563bce0b00cc63c0960db770c50ef2fbd255877f4baa514b4876c52105d27ad42822aa972b007790f048d72b11e0d67b224aac6a14f4521777c348121ac6ba1b5de2b3319f47ddcd65e0b450d63fe79200bacaa597439943fc0f02aa15473504a5d05b537b4199d00d3bac01b58c8948dfe56a499f6c9a99f96b1b160d973d6b1b1b130ce97633539096e0be47c0c5ab2889c5dca63d3a06bb3b9a14927e730b06605a3b765f49b7ac475e35e7c2ec409e52a6b9f5183bd4a0149d05098cbd9b4843324aa0ab770c623968fbcd01e313ea74ee49f29c06db2eafd48f4b9063e3e066a98ef4c9c37e555b465571171103ea3ab8307c911dd45746fbbf805750eaa7719e84916254ddbc20ed3c2ef591dd83f02f09c547f70217211282bbfc707f140d548905c429458e3a34dfd5c24b3f3c772e0fb64221b787fa4dcc812454d263f0708f4a493edbe1ed84083ea079f56413146b0729e190774ca56e9bddba3e762253c365d2ea2055868f1a9727c6ded3d7961a149ab2b20540fa6e658dd639610f46c691593059ae4d8735ecf45ac6d062d6dcd77fe2a8dea7d1ee53f967aa1a83812a9b4707551c49111766695845f9730d5fa314db87e98101a8578716eb0039c48abbbeb3c17cb595db16c114c56decf790f09642291258aeff494015a18fbd778d902c1f088633ad060d5fb870b1610164f0287060d764f23912b9042a4a2800785b604b1c238c05c8896d05592bd005c040441750ec8e0b35bc014e965751d33de00048a6197a4eb1a51d5bc4048ebd05e362a3db4396dd74b9f1f2b68cd32c91af253babf14f8053884451fed0e548cca5bf8f5242b1966df0ade697090239f8aef8c03173c27fdac08213e6bec0b0f7e9fe02c8886cab825768ca49fe1429973e56b666c07b238e5ab43e02a02dd431ed21e0f99e2ff68b7097748c0be289ee4a95a2c878ef4897a1bf3e75065c814ce71997db8e67ce7c3830b41bace56cca1600f41a26c2b04984ba5928bd08c62e63923481246218eb22fa568319a40c28790f623488affdadbd3314a2528fcd4107b2126ac3a714b02b0bdd952a4c1173cd92f6ebe25429040fd6a297d5357d42cdc0722483e41276146fbb8a00f994fac622cec974420de3744921f261de9ff38181a75461863127a5f4e4706de1ac6abc60d119a829e354ebf9ab980aca1dd88e58851651a0155b473d0d9b071a06c20b2e3e552ded146f0834e3aa951c776331b5a9811d0e8f8e7e16d83eef0479144aba9cfa058e38c6e6babb928174eaac3e28bb8551734d9e5ab04666c160cbca1cea14f232450138e94c69c8b2937a444497d326c1f6efc7b7a168a480f481387f293cad277540825056fd874eab1859ef33e4a147d6b106b5e061fe226b4ea9f705181aaa064e1830d0917fa953f4fad25158abdc165552e852686e624fd16886520137a7dfe53518405ae60b1815df12cc59cb82d6ee8f817ba392236a68a4cd1183bc6cb89964be4738e7ba539c389f1541df907b3c42290be8a149f5e01a18ec892b2efcdab83699d9f017d2aa1f92ac10e6177daa2aadca2ee61f136a654f00be921617beb2d476bd2473d57c834dfa9088de77deb99925e378db6569ff84827ba890eadb4641a5c4265e6aad86c652a22d516c66c4ab8722a5eed5333340c63d6eeec2baa92b1b9a296ff44ef8af80b8e93250b44f923912d266981343123bd50712e611cf490a150581e0ad8e225cc6aad068f9fa81cb0ec2efc00d787ee49cbdeae0c3e34ea2a147246a293ee10399c50e8f204133b9afbce1fd9c30127535ea31e8a5f91fea91fa87152e22d60384c24d6146da870fa90938ab46c88a8e53bce5ff99b3cb166c734ab956c2b95c5a11660deda83846bac956cf0543f7c275db01ad7baf799148f95d4f525949b868a5153e360de22364067e1a19e9ea12725f54d508b652210c8ba3980999af77e08ec0262c3833474c2406e36b44b5a12c0e9d3d8d504ca294638b2e77f4cb0b860ee5b87ee5b49874d1b5223711d0634180c5fe41ae1835dbc072f600ab25e684c5b140786429770d2413f7fef12a25e97d07d451afa2412f7fccd668b0e3027765608757d079b172cf896c02f1ed646d8b7497a8d2b822c0d09a23bc1d60119c1446a1690859d931577a866d600b5e8c2714108d4f090c376ea23fb69b5d1cfde2535d6a8b4c8dad9410e29580afc256c3540fdcc94367b62c2c75a818ebe0c208ed99e07fbc246d5b819147acc6201091b1058506f5156c5b74a535f4db47484da00de45ed81422b7cb3c342934973350ebc9eee78bb1e9ed5df5f8eb20b6a3a89ca0f9b41b547eb247aab8ebc7125195ed5a2b75be65edfe0ec719d1c4f557137ae25edac6ef4d0ae37410f4bc9b9558adf7035696751229be5965bd57837d726eb2ccab20f6e71551779db72f2f60d74a35f958893ad6eade4174a659b4c2a545e8a20cd0acd67a174580f72a1a3d22d9bbcf556511d99832060afbba9eead92a94b8d9240723c0523a1aaeae932a97e15116e2d4aee5635e2adabd9f31b0ebd5924cfaf52f4d6b5c95dab47b898ea25ea7d29496f55a3375d27e15009c9b66fe65631f6d6d5a41d3582eca3db4e55636fbb4ebddf00dc7155157f32d64fabbaa5b26c10328148d5af07d5426e541f3b5e84ab196417be436a8a1b179a0662a0bfb3b1b6ada509169aba380d4684be8fc94ee551d459c5e591fdfc010d9bb93bdc3a719d7a90d39832d75d00c2ad8e8eb5cdc488bdaeeba4cea06e6cebdaac1fcb746293e562e0bdba0cf0a629ed89b96eeafaeae6a46ec3ea2b9e5e69ef0645bf8eb94b91e4262ab2d81ffde5896f9dafee60d441a3d70ffaa5ecb417b5e7bea2142d1b74679a335de2e63a49d6a973879edfc8bf267b4c6f85a5d1b37fe411283ae1e61739824d1d3cdbcacfb0ea4c7da98e28195568c2fd8e552cfd75275f5cd5814527db4dd38976384b122bbce9975b9ee96d2b0b1af49e1ca4e1e58a9f912b0ec6e4779c4a11ed7711e441a5e23b6c9b732e0b3efab219d2c33765caa7a4e734b05059ca36a4a2f9904e5c77bf8204aa22f75e014810d109a515694bb07115c0a53c78ba0d459ccf359d0a46a7f5082133ca13bc41f9191094af5553378b05a55d2519d02cf41398171b501ee21466028b5243e7c5f103f0406eae48bab233ccdbcbca5d8d345612091b0243d962f6995fe6e389dd45cdca3984b45baed03ca8f7aefeb51c7ab553847d6cb14189f012a7eade9375b3c4743f9d67b89f764409f1b58140b36aec80dd3255fad705170766c42344d311aae17da3dd23601700990a04af0cbd394f5a440ddd5712bd2914d26797f38b5d5d498d8beb64f92d2d5aa00b01463611fde39a013b27d8e72b84631031c01f9390693cab5145895c6081072929e321243d9bd668f99c1fdc23ee294c3b03b13f548b9b56853f8bce5eee2927febe0d7690e93d348a2f0fb1fc107437fe45dcc23c82969487783c914427deb5275d3043b54ffac0572babe7c26c154fb1f2c9157af25db93df941f977e88ebeb5f69468df9a9680138d3f3bea0b931b9a709226247060e1137b19cccab433027c6b0a4b06b78934c7b5da1dbac9216a4392fe6e88a16ecd2adb4bf85ba553a52efdddf7d17f25c5e39a20ccf5e15b41d205da9952c4c069f85f4f235d2675ad5b20439b29e23aaaa93f60f2f2474581f6c712da4f5951e7aa25721ab6022074ad302a2e2569166684ea2812c9e035d14ccdd48be527daffa34d6b8c655f6ce2aea03882bc5868a9101b43aee9d2ff3516d0dcb5e8da246eb4bf83667f167bc505e105ff3da91e2666c434f661d97542a37506b3bd78eb3d0eb99e5aca0de2a1f7515616329d3f0b5aafb2f235ceca88eb8c69605de24279d814d0e1bf1f65631181d99b5115894d5574d6e1aba71aedb1ac42f63e9573dbcaca48f3f6958166c4b84bce5e0de99e6079f1e6444dc8aa0f60ebe8cd4432009aac9a548f16c86647605e8a584e41ed8cf5f035779b9b2e7d418260672a9931ea8c8680d99c51bad6f53c86eebf204b8692c5b7c2b703a5d690baa41b247f76a25e4f3dbea1cf1c39758def4cb43a3bdccfd9271b2f7202381ca7744328ab80ad34abe03aabaeffb2ded3646402130a9eb564cc60d28084b779ae10173c8d4432714828846c121e1571bb92a372209294804213db70f4517f06838a869c9cf424c410aadbada5fd46c880340ed3e260486540d5522b26ab5e590958ee47c9c748c949c173a917adfa75d6c45291175c08d711d270498bdbe334877a96e61fe18d5519e5ecad4cfe28dc7719c46c14fd44ed9621aefa5b880e4dc3da8c2c824f6e826ff6443c4730e270d86133067d70499e7e0ddb56b01a40a8b8125b023046c22402db527c007abc9f99b49e28b3f8cd530676bb7cd6dd2e8f96a4670ad7f6ace161cb161663a29e94f747fa1f75b3c9c3618c5dffdc8a56d6382c21493708e4e5707efbc37a3bd468353b051af851f45f26aff16368abb5ae0c5227e1657e8ba18df8a04bd7cc84863d58191f307ae39e74d59e36db04e6d70b6481fc1c98fdcc25a32aa9fb698246a4b1db809b2016b0c37c29674fdce70ac241d8127d9917ea45ddebc5b46d1a1f1414ff46151b4a29e2fe7ffa2c96c36f9c4419372353b71b2e85bbfd9bc26e2aaa72b7c255d10d261f3046c78dc0c0a85a8048b36adeb874edd864cd843b92bd6dd0d9a808f785da9c174693843dc435d0041b693f7ccc9aacf24b6f88d6d20cc997647fefb305dfd8acbccf86f89df9b2879b4c0c2aec8bae18ecfb516443d01ccc1e8e5137464b2c7c4d0511afb580d8ce026dd0fb479a372cfb5042a21e29193c30afe4767c37b7c587fb382c3f318fff581067c17f7dd75528541fc3b4241b6eb380c90cc1c605eaeea3bfc2ab4e316a9e14b6ba07b9ee997decea12dbb80f4dfb1b1736b003c568c068801fe48b51476af0d1982e3d4b5f2c7fbcafa79774096104acb0e36ea2e4a530f8bddad31547a40780e30183ecf57bcf7a7e5e43a35423298061d328a585a94dd0d93b320a9e3443a99aed49aa660447d5ec5c849e82e113e3c5db1569216008594285e21e55c9dbf9fb6f5c8c879768806deb1744b7788a96ba1d1f4862845b9c2f75356f2897585784b87074c0dc95714e96383a5095c69be0f641f3026d7a2ffc82fd5c9f847b020e3b6708c1fe643cc9949a46a0b258370d481a0febd691de253e90e42171cae5a29f0e0748ca96fd4c8e1bb3035f2974664305ceb87053aef186d48a6fb0719b5afd5565dd44d58b1a6aac03831e375845e612f2435ac773f5591631036c47af440e8e4c65cfdcdfe338a140fc03173ce2f46e25e8cd8cec1ee071cac9d40ca99593306d2938b970c0e08af05b3f85e76c85c240723162bbad7de80640ce17257409164d9346cd9ac2e470136b1a0af6b7bea4e36d11409635e95f6409d9a45715933139d9f6a886c1f3eebfd91406f47bcfbf96845eb5307c441bda3965ef88ad94ac9c526934ffd8dcdfe56cc2603ee8dbd6b5f8c989bbf62ba8e6c2af3d5986624d2e1ca1fe3f048a38b7704c26d9780edabae20e649d2f90169eb04b68539c318e86eb9e0621c5e279f99f412151edbdb564eccf1b1c22af8d30d80d6d447c0238cc404c23c624d112da46acdc8b8216caec5a4f501d92c61f542e8ad291fe9a01f960aad20c91b263051407ca607c4e244dd40645e459a709169e0d97fbb29ace1dabe5901f5a5c777728014f44372b0dc7992ce3bcfc597555e9d71eeeb5880b207390b00a4b93d6af5e55edc905d8b4ef730b53153de33d4390a60d019065d5db4cd0356b47997a60b4d01b955ce82c84e5b86d45672a131819711b94085c50b1c58fd2c84fc5cc0f350e674a7a8d18f126f874f84036631c6906a4ded7d5ef24fb8336b5725c9bfd68557048539b5b2c40bd79344a97af82184d9705006d96c7e98d1b0314e5eac9db783c96c9d700f5bcf09f29ff2601cf84720271398f49005c8d3436098dec9c0e28ab2a9b5f85dc97c3b540339bcb502b833203114241ca65201845859f943870314c5dba169c148edda79b2e8f84d461083ef63a28ca04af78db9903da2c25b69449ec7d1e9eaa687714380f498cc4077fc4b6987bfd19248b8df16ee9004013f3a49c5d8caf426cea5c8ef7849040bf4cc856d04d38b99766a3182dc05fa90b4eecb24378ce6bad33e6426a403ec34d99b1b2461e11c10bd8b49413d9a309ff756d6ac44a53ec2fa2821305e2f056c0875d6e7bae95018e438e95182a46352724316499a661cf96cf67398934013e5c61af89eb3ffd1837ce8ed594ddf12e4e99c100339aa676f76e18280b79361d3bf062741d2542cb08b563e2ae70d9ab61c66604717f23b8c8fa47b9845d77980e5dcb30d34626f8ef0055f1a24e4e6415c75e5e90b4b80be492df81ece3c385865537e9afa33c2ff7103af3e87471b18272b438c2f3bbebdcb91170ea572993ed1a3c2caa65a2a07c4a9b8dfa37e79a347e08940d3d7b1f253cb6ab7b398ecb4647025617861ac53c05f20ab553ffd9a66229114aa584a78a94ff3bdc73559ea4f02d0ad2584f5d60798c9e3bfff1009492c3824ca4b20ef753cd9e787cba9c087059508428fba152ea813a92c5fe2c7901f011ce7139349c97c88866fb4b2246c6a0ad9208811b5f38a35959264204096357487485df481d7a91d9e3e889260bed7a241a1e2a2c08df44177e7edf67aeff1627afb95dab6f5740012d3584ec7a8f5ec6090920bdb06b6acd1cf82cc577892ce845f3488a2791bb7233510ac681d13a277beef896d966282f82d8a40d3988186390405ad2c55568bf36db9eb5458537d3f4705ff7f7ddc2f24770c50e29e760fd2ecb9ff474e1a056185db0737411cf1230d7e2deab4cd5ad826b38e76039a750e1061d4f00cc281405786556a73903025315c2071a73403592e2475d3461710c9ff725c7e4b206f5a3ceb329bacf4f198432737c223e298d41e96b46ba54cee99398eab4d400e31c783728400111f0e97c24994aea0fbaa147bf443052e0974a804f18f78e00e7c8343fc05cd2751878f4b8e54f40f9115008763d389cc46fada37425f39324e6224edf161218d514eacf14d3824ec0d684eb21c1ac1c0560b1e422b9e7cb90beadfdfd43bcf2cc77f3c9461395301df9a0007d569878711c6f1de0f1766b7bc12e7a44c5d5bb1b3069ec64ed3154253ad3de9be288d6e130ae13bfe62c8346098e7f90ae053dc0d5cc08a2edfe61855b82e32368f740d92cba04762f9be936f0e2469463534cb9ada90d45472bc30985473d385ac8930918b4884c6e48acf01b41d0d2754047bbee9664dbc07a18498616a0c22796ef62a8b4351a2eab7b5b3ef9fdce028e7d1db5a1b085cc76d5a6a43729a8ccf2d6d901b085f6b41a2874225b19f535fb45a41b96dd72e31d916af339a611995c4e0bfaa9015c7ae0ea8498a1e4437d7937c1d61b498cf598217a72ed0bc5698149f5e0c5a53526bdd8332901decf8f038536729bb16c895f8bac87a58b732e059027f3320a200f23330ff1d56d7031dce7851e98e345b99afd043394c59ea18a03868ccb45f25cf0e9eca4d14000a7c58ea9c3ac5eb84b1963a22dbe916a3f13b1b3fc48123db596746395528f1ac9a6dbb82293c42d4b56be57edefb95652501efdb725c3ec0549eba3483f5a28828f634c91e8cd56b6d506569de1c7d0f47ca8b5135656717a73d621299c993fdedc60f02a15d68a2a8aa6583c3946a54e55a9852328078f357d43d0cfe1ec9009b959b6604f4cf8303cec9e423e45e21c820ffa65eb0fa0f7b576cb77be938f52a16e3cb63993affe71123bd0ad5621d28265fb02898bdc5d61b975ba9cb64d5df2c9dd1198f3a25efd706359f265b7d209a6830366225eb3e347821eb26a608750023d756bb47752eb855d89c25e85b21a425f5fea14957d773d0c4a274bdf9efc20d6285d2699bd9cadac758ebe8bc4564717db22ddf7343b31eefeb57843ae8f624313de8ffcb76db365aa63035aa0ad341d340376cc6c5df3c7f14c36eba91728d5b45e84bf618bcb2cf9cf2b29bd995c96b270e2afb2df524f2feec6a4854b1cd6f9b929f5ce54e6ab4676fa598285001d5d34054fc511eb5c28dc69fa660682d5b5d6416d2f4b92c2d77772939a9bad90044a26fe1d765c03f2149a1869ba5260072ec13617172a170d9175dc6aed5d71929639540ec3024571fa5ed4d1a348b1b571e58594e5f4dba8ba4610abe164578fc120c98225b80be736dc57f0ae2e893db3a0bfdb111a4c03f141e2930cf6f5ce8840be17bdd45e0224c0b5c7af8dcdfefa5db1cad12748a26c1fe6c69fe6989a3af82681a0de31305b02990b01bdaabce676f21ac8630c11fb466a47802a28156cd3d38b3e490e5a6c20be86387afc0b961b0d117828788482c47e971260ef60dea09d35300a0336295767b8d8619d48908f20a73532497d13297c1bf0b9ab6950868428a9aa9e5a40cc672f384302777e3f226bae0b39be0db81ff4c3b99b63bebd4b990db853210301a83ed956827b9b5db3a9986dc79fec3860585b619b7f2107d713ca82aa1dd071a0f08e805c05168ee75c88646219d0c75a541bf0cfd4808e2c7d7c62b50bbd2ee6e171e53402c464badd70041a7640caed574b86dbb0e752306cb07fb9ef55b473fa72b903469194cd46047888009533282e8afc7a36ff48247139a9639f8269670b96ef758cab3410b8f2dd423e2bd91f28d47a80bac66d9c571e9be5b0d27519d080dfcb690eae41fde17a48a94cb121aff95b79343a7000a460b9bc0ad96a5c9380a5b6e8daa181c77a92328820611ec0937124c550b6aed9d558d9148f497abc5633c4529e1352809d2ac9510a680eb8da8d07c4c11b654aa25569b51dd0e2366eeb9009e92d20bd8e66be8d702c1e075c46f4935727e32be955bfb7f0482fb33ff083ea99e026ea6611945fb55ffb9ffa18c3cfc6290bc13524109957048c2d0d0219ef748fb1417b6a6cb0afda3f3834745a53ca2946e11664db36b3ac381197fcac4b6494300e4887d065de3ae4e5e3f0ab272f30e98abf854141ebed4d4048919364cac315c284e45053e1434f82b5617ff3f5cc445a20539c02b8cbb2d06126b1ab75e071d41f03430578305aa54261704915dce14a30bcffa4eb5a717ae478cb005e452d5045b0e968e5eaddb56ef77f01e61a00527ed70165cfa04e8eff042127de058b54559d3a0502d178ea17eadfe157df8f0994a052314f9eb991196137ef0a2a91821688887ece2201bc1a0cb7c94d097123781f3d7a5bd175dbeffee2f4daa4b0e62f44145cfe9d9fe64f4b540f1fa19713404dfdcd266f1490fcdf0327e64736365930144751737801edf11ccb476c6241345e3e1f160e7beb6aadd19874e99c72a71fd3b4f1aa3125096d3c85c8d9860a2e944602c0582c3475b505cd63d2083c80c5c4b41254b165fc02195e858191c0055a60eb34cf04e95e7ee70a255c82e28093d6b3aaf92d4b62f597c0087da485b1d873b77abab3b2d55d056da414145e57706bacf72cbc465079ae9f3fa05a508eaac305f49fcbe0fb594cb2fd9b275a3c472d5e98d520a45e68ff160689116ffd4ac4a99953b94fdf1c15bc550afa7ae1783d8c4de6b6af2fda85ad4b9c0fa8ee4f313256eee5e9003a803b2787176b6fa6d155cec3ede2dbaa9f13023035b6dbcf46393a8ff5e7536ed7714d10f7a52596eaabe9445aec12e051be07237a937ea9360cd8b1340162f863b52665b29ddc17853f8ad3a8dd6f7083a4f4621abbcb1a04d8fd7e1d8e11f07c8ef09362ab45463a80d379c12f240f8d9acfef06e9fe9fa32239b215a58e9606fe496e26a086407fc8494e57099a4b582872f17b57e42574f1959b3e4e48a785f7063313f4e2d43e27081f0205ccce3a56194305c2cfa5a4184b5c96ffcfb886166ee92e25fd169d1f057066bde1649080eb8d0f86bd911a9781f1d6c51a83e217d5dd1bba566185001d6d8073277f2865f7f6b49ea76ab3b65ea887ea476843fdcf95e4722f1da4d25283a039c5ff475ab88b6b44d3836dd3c6d27af160cc12b2971950ab404d1d285edde6f749ecb3408ec12cc1aa5db89d9f20fff98e33572b73c29c435216271195ba075f64dfda888bac5593e9b51430e9ee1ce84c2c4c412d87fbecbb7c0939c9bdd330a4650e2b8adc5391d5a77a6aaba4f7753ebfa282b05c37001c38c33a1432a15ea9739421f7aa39636aba9d5301fce1b8d3fd290ccb829b504b6fc8bcda48f999a56a82a1fa064c7c24e2cfc2fc820aa5e14bf45ae46d267eb6a92c734ae126245cdd7f96a4509c9261a535a35c3038757f0ad10554d20c82bad27f432602035df6e4772709b0f1d0234998ebd6d3021e10ff9e6fba0ca2b852f5d7700393e2710c2854dc482e54c44b627cbd0f83c83253d29c01d768413c8978bbc049dd802946869ad3773d5801729f869f2eeefb551eebee26c6ff31b65473e4a21c6e26a7873711d3170e86f287f92b38d90158d11b0f7461af7f0567ea28ec87bb093eca40b8e26118762f0039e01ee36fe26e147f6376bd7add132e6a694145c2750457b774257a79955dfb00ca672141f140ed9a1ef0e9ee48a74a219d5b1f3c3b46c67287326789ba0f533c22670958f03572da89d39ca0dc44d9096953486421c82edcf3cf365972bc966ef40cf1cfaedea94855803fd4682b4d6c758aaa039240ab39e49cec4a9fd5ff4b64fd0d94f0b38a8f53abac9d6f54e444f33dd191e88a63a01fc1c4e316a8816f81fa94e6751e4dd106c4bb6f72129b9f775fa38a744a7cc61311c2ba59ffba8897c22e1c838d0300c0df80310268883ea6c36e875191507afe71cc14f7d9c1a4d1244e3f0176b3d4af2b6d3c4e1b7332f95615bc7dce29b7aee5acf9fffcf1fa0d364ed5c8401963cc7e2c3d03f8d533e82527cc7dd0c5f92cd46cd9c2dc514010e0129c1be5b8a608800ef8ecd31237292b86179bf6f7931fb21a5a55ad8fef039651dfe21d7e780d363bfcbcb9a365f9d375ffd577713d4380281a7caf1b8939006cda5fa607324bc08f567a199396bf427ca366cae4a281e4dba79b5974a47b9a7122c1484a15a521ac4895bef246f3bf6abe6ba471614780d9071a7886c5396c77b4227510c9e99c68a2a08748e38151990c3c2ccfe7fbf0f3da6777d5aa87aff0446693ce68235f7978cdf9fed07080d894ccf0c968d92f481cb6740e4ae8bb2613aa2d00454f26f5624c11637c6b216e31c54da173135abfc05deae09a4e4732025b687343e289096879f88a030aecba882788c551d25514ea3c1cad46472b9df5faec8560ccf90cd2c7401bcef5756e46ea1fa231b2854f1dccb5aaac8ee027b4640ec10b53f3599494b2a9eb95cc483e0267d59bb5faa5202cf78ff9e3876a3b3d42b78ca0ed7a4c4aecfc0fe6451db9a193bd7be6fa209b0fa27e7afd5497e639c8780bbaa55a4598846602280e4bde6c351dd3871babedc17438d0e8589b204b24987c8bbb3c83c35a09fb9919d45cf0d513c8316677294ccc47f076d0f29186f6527c527e70b249548a563592f2d650a10c06fe78b51637fb2bf549cf486acee4f3b7ed745024c50fd5e6cfa9b5199862d24443daa09b752690cbbd1a1c38d72e48e953c771d3617af0b8066e60ef40961b84af3498cd8f5065b7b2d3bf1f3c5de849f3f56d10266dba8fe34c8f811b3fcd71e51eb5b2e0e9ec376e4c6b7a3995233cfda67f072d69fbf46a24628f6c340950d2a60cb53e3d89665223c9f40cc525ac00f58472a5672f4132ea91445650cb197b4691e5d02c67e5c06c491fcbba4fbdaa2c811052236f57a71d0d4aead06107a382e63d14236345ec4c2b344a9603a6a53c645657d300d14a491ae18ac62cc94a3a30883b621f002b76f4160f894f03882c27f7ea86ef52093d755925a1bb1930e2a44197b527019379c263523a01565f42b38e11445ac9841e9c0b953486dcf0cc89ce023e318db9c6f72cb9cf8034d1cb2590e58a6343a44e1911dd4f190596c581972d31c09abafc46b52e3400593c5cfffe14dc3f3915aeab75ea9ba8a31efb80566cc0af274845aec5d493f17ddd7abeb887aa0b0f8743bdb1c4202ed2ae23e72291cc379e1c4374c17cdb87f2c39360be04a1ce7ee08948207fecde49c076fcf37751489d883666dc604e3e3f772250c13fb4ed2467dd7ff2d949be49869488bf9d36489b726c609b72e0a9dc3dd03a9191dac27a539db0f3edadfa14489a97fae2907482febe6f302490b36c7a1c21de1b974c2b164e40718e4eec9a8de34cc905bd8ab5c3848c2b27b5ac4c4e56ac1eaea47261312a2dcb0a8830ed12c3a5a181a9a97c2016bb4e7a93d5d726071b4b8754a9b980109396d54d44d856c9e9dad2c194541e1c455d77afc9ea34938185a1c2ead44c58885d375193a07e4736d278cbc25c9e911cf38cadfb337da83993e11fbfe49b4de2d7bc9726866cb2aa6f88c226d8109b84f34cd2db5585be26e60b0d89aa64693790185554c811743eebd384edca2cc726a182dd2e2236c626fea0f63fb9eb2a2e6a9a33554f0df26a78191db3461d100f02aaa172e4b8eef358aca13314ff69d5d0c7d3f565d4b3e5c5fef2a0bc5100aa904e7e61097419b1213f197a7f2912b3b5a5d2701df26b49b99aa1a654e4b0982712b9ce7c0c3f3d43dbee407a68fe65b87af9edee5006447415386a2278f15aa16abd3a437ee700e62845b661b0bd4d669233e85a8239b001bbed9a161d687da141b6528757d6fe38ed038b1433358ef82fe13d8e8bb2b22ad4b37cce09f243e9efeda6f0eb0bf3e53ba057bc5c5ea65f8002b0c94a14018f9837cadfa98ea10df2a75609d8a022cad00ae335cfa055421a1119ca5a445abd29ada1dd433a42b941ce6246ef0fb5839961082307048034c6100849cb109bf1fa4e13ef7703a019d2ac8cd66a7f81e9709e9b95140aedbba9528564a6ba52ac7934b242e532f9f5a9a673695ed4e85f3863cb8767173622a7ca03874fc65372ece96212420292a6be4361c753976381078273d75dc41224f380525592820c4a932ba4659fe19d9ea3ebe186d473c33f802f31dbdda35d2f0d22fc2bfa1990cbe97d07a5453b20a55bc0f90e04324645201d574aaf71973fc363c89a4a38b7004bc2faf117d2a24069aa90c9b1dc1b3111a9262abe89c25bfba7adbd161493aa3fb6263c6586b2280bd2816fe4b84e30f8f58e8f784b3f6ab59b36b6df135b12e98be2e030bd160080446231d4c38bba6ed09dc2c0f6e9a4d9c798bccae1498df59689455a64c66d073e6c43f2be80042977c5a2e4395600a5e82fc1047a8da7e7a9bf7c89882ef6e7db70ecf7d56eb2f0020ecbbfab1ed5e217adfdb3847099436b14fb791f07de3b2d1b31984e874d65c2145d1dd842ebf53d1d4bb73af49bafdb32262ecea02bd4424d6453c34a86dbf2fc4a703ea2cd454aa699940857be2f7d14953f3b936982cea5d22073a27a82df7df2c92ef057bd1d5eb0c07f889f5032b49f013ad1da171a83be0539423298b3717cbb8eafd659f842ce94c44efd73f0ecd8718dd4c6388af099891cbe70953949862a81b539c9525699f5f386824e701b920888b651d59031b1c60a13c7bcdd2cc09eb7d304e665474079e48d35b7d9ff9d407de85ed5568624d6bbbd1389358125968606fd235111bd78a87a988bb6e5a6089402ade5e9f1cfc580e021397d981cb0f011e7462c317e222a6fb144f4fe2f5139ee67a64a57de9c2651991c91a98c5e1395fefbe946a367cfcf894a3cd10e106a95bfeca26a0c73772393d501b0e80d6cb0ac9f79f3b4254ccd2543ccf4958fb6554d23c529abe29a6a13ec37085dcf477df231f405a57c591b7e36fdb3274b87e364cefec3cc6e99225777ae302ec994085cb9efd778b3efc692a812c46521dabce3617198e5a5f8476d1672839e5fac8fbc22794956f9d3807d884fcff9980b71a708ace3d61cfaea8e85e17a81291026caad070bad2eec2f589542ed2b4cf9a373dafe6037bccffc1c7c85bcd762c45a5983e079c0825fdeadb541163d28d58f2a81284dfe9471cfefb93cca978b95351c2f072ebece9ff337d4bb9aff2313e39595fa900fdc947540bfcb43746a0978ad23f3c0efc2f49ae6a81c847ed5f089d26421814c84d2b21b03b8fe8014fecc0f624fd51f525b75cb465ef93694a037bc06765882824656adfa58a8e0b836a0ffad35fe65115c6196c894cb8e38f0201ebd82bdb8192064225ed3432d5c4263faeccd68374322f6e525b39672e6174556f6a0a952bf6030594282bbcd09dfc1b45cf8c8f9c1883a43cc88c048ebeaf46b737833605ab5137c3682696705207e04eb0fa77c2f52e87463733ad6c33dc319ad6f69eddc91b09e0d040d2db39ade823a29d18e460d4851307faa27e6c03ab74dcbb317686bb65397902684d347919760c8cc1a982652e6bcd92b373d03dfe06a78f9e55ffd14f20fa52994b09b13a6f62bc872e064d4626f848b69f9a9e8952a9f26efaa0a4a6edad762e4bcbdc6a28b608d70e05b16864e00030b4538cab9632d1fd0b4f44257728c330ad8e84c43eca4f6d4371add9a13ab1fb5589594077b13460a920e2e493d15952b78bca96f66daf9d53dd0681aacd428d51377a25937eef17e7b8d2406ce88c77ef082d1227e1166f2a43c1cec040a2c79bc69649feb390e155cc7e3b16cd9d54d8a635eed63ab4b5b47d1424afa6708faa9bc40cd12558840f12613226cb3438c76162b44557051360a51cfbd01d4f5cf76a79f2d1107d05ada6f57cd11a4a04632870435abffa5664b2fc96667038db777e2e3ed15b4c684d3f662541ad776b92b13f021b287703f0f0ca6729239089723a88b19052771df657db5b5dd44f3931fe0010efb3877526380db9a606ecc8df19f7c224123b81dbc0a2d9cc068198dea4c500e4aad40732edc50c3f338a3fe183d1516081ad0f8894868edd8ea79861cbc1c96501a82926a891227e36a7a54fdd4318337345c7275552f9735a8e22732e2ec8abd688306e6c167060c1bc99d59238a4a57fa459040c37cea4a425705611e58ca246ee1b4124f2f40f240f4bea216708278c5f92bf1e57d9e9b49b01806ca8ce3e59891fea0225e77fb7d349eadab53cedc3be5a9ae6223a28309d76e1d27fce5743b679f8a00ab62d2c4dfb91a8bd184f2756900adfdb2afda195582c2772f32368ffeab16945c3076465900ec82ba7d9e294e1d55fd5ea0abf5175b478ab2b981138d12565f911435807ed223bb35c27d24a8b07e5ffafd92a69c5e8c10083f2d5cd91faf37f48d244cf3b2845136547ae3665bb8ecd3dfb21b033645d4b08395c4fe35be20772ca6d2fb671cdd3cb2b9c7bcb59e825dec2b604b13520fb0c27be4b687de4428e3620672aa27ad96737777d58df347ab90a80207c656a9b139dbfe1d5b7d887b40739baa07fde4a79b0faac11f43ca6331d10295cd135198c13e0f321d7711ad8cc314e5df2a3ad71380974ba298a19eee4bba32705d4bb7b6497615279beb73118458b47f8377332adbd6dc56bef9d6641a19df4aa5126a303d1b5762552e9628978b9be7e0850f688cfe5bcb56e32dd7ff8cb31537f78c4312c5bccbc2964495d8ffc680ca4ffcf4449f0232b26833a2fcfcbff1bd812e67eec3a6af41e9ae928ee7631b35f7a3dabb89826ffab88dd8266c589b96e90aab73340a1ef8cde0ed91687e89ed94a09410c270e37844580d4cb422665e484bae907c9b597082de1da808f61097f9fd6a4d0a8fc1a7fde3cf888098913175d709ac8e747fcb6e70dc1ac1424fcb0b1699a5ac019b017e8a3a8f04407d47b395a1bc9786a50ea4381b7f12261996f61071d59c09557b3405fb0812008db6b99c67fa0167702aa350d2d01335b1c39bd875f1f3595d41fd5a30368730cb035c71ffeff893602ae54d6e1265c7a259bfaf617480d216caf7555ae89a26121da226473d862b44853d0cbdcee12d788679145aa1484889e747fe5d38f6f3af2d0836605389be3d7df41667937cca1e09a720a66459a8b93de29c93971e428741c3cedccf774978a4389eecbac7931eb9ab488899c049f83370a8190569da2405af27b55f83549ec04290d639d224e4a0832d9d393435480b0a05ff27f009ff30c26c27169c5c757edfca4f0cf31dfdc11cd1b853464aac4a0c3cb308a9f33d8369989b2f432b273346840e70ed2181dc219b3ddf6dfd2fc9847b5894809f30497c06ac8caf998d35118ac74b00337a96e8ba0255e2e7e870eeceaf8b5fbf1134bbd85dbaf7d7444b47645747ea2f2323da34bf56263be0fb81b903c6fae48b571ca1084213c57a604040c906d844def77dcc6d283027796a5167f29134ca74dc21eb2dcca56aadf308a6d4b05c955845d8cf2daa92cec1b666ec4ecb1a474fc9a6568c8d43429a7cda22aac68fbe7c64a38784cd2aa88527a5ff209e4e0d445edbfca51cc8901821447150469218e1f7c3f066ed5528909985d5da49cc4bcac4d737f24b328226929bd1f9ebec52142633628b110862c750b639f70cb90167b54614abe0e03585b1b802820793de4d6593083ea57793790bbbd87987223261a73c251e7cc66b25bc9326aa2a1b0bf4fa3e81f567c2dc4a0c6731b4828ae5b5371f9c51310cde20065842b01d2aa577ab775644220796e52436c31bca17b7058c0b4751261adadf7a42705edd731f2607db23e131a48eed93f0d651ea7bc376d61b71b4625d79584e8fdb5af2d43b91ab4871b75df55105d24ef16744bfd78247a81a5890668bb4a8ebed0cde3599489f6944dde0885b521a93669f4deb13a62b0a0720d45cb3b0b96f077383752ce464f8f56a38e0ca25c5029f09d3bdb6bd06d18c6c1b6e88a7e8b843ae794da458fd086e8ab02db6a99427cab0580b6640ee87a2fff6ace44cc59f5d4a9712daf327409f6fff82d13b35b71d917a150edfe60d9b2b3a4270644f6e012394a90454182d92e4a4d7d1a6fa7e8b1da39494cca7970270770d95033c51df4fa87a3bcc96ef0dd5067f447a0a5a74b4c98a90fd8a4b87543509926d4ab704ff87ca8571971b1d7735c0e8c0cbda208f7189a14900a8cd66da1a2326da24218154de3343c874fb9e540c8cf576775966d573c3603e94570c74bb6f9979e855448cfa3eed96ff280cc8af22d8d27590374176cd1a07c234addaa3814913bea05530fe35f733fdfec3760e3c6f965dbe71d7baaa0b018ed5b5b73b91afdba15f7561c40fd5519eddc13559ed0d0dbef35921f68dac1d2bfc5a2e1ac718435b8d9e759980f40552b1a97462b1b2862fc972bded94cf679da3aad7c133142f310c5b69b3a04c0e18851300c181adb3b7de384aa59aa8383a92d51b469117162c85e0ac9b5aaacf248e4c3446378813e34a829cc49923e5f51a60d8df94af45a7f2cc140d8d00a00bf80d89adc9ba5436328df758ed945a73796245def250c38a87575a5402efcf28050b35e23c5752af2965c5095fc38ec074e8962983337cb630e6891307355c5ad6c88d54127dc135748d6f239c085844753da76f0c040f9bdad62a75dbd4c7776d139775b8550518af8a4d8f2b55872f9e66ba16aeebdcdeac9c448805420118d279fdbfe21878f691d561059b210b8158ac02caed2ef55083a5769ea59a24f15bf19bf7aad14403a082eedb7dd07a411401946315d991978547a313e28d177e5a9b5647e6bc1624c35e7bcb71109e8d7921e4ed576881194605581d0296733143d4207ad709a54ee1b0f3cd15830cbe16896998e7da003a87067b7dc6a4e65d270943fcff3487ce5a5d0b126056538a209e42c80645053a185e288e65b07188b364e7434856211268d1a0e9312f7b9030347283b338cc8ae01249e96ff9afcc6386042bcbda30b60cbb2f33ce4624706b88cf4e5fcdbc2f37d3f18834d8a378066382293003239fa7b8d8ed23c5152c3896df1ded8d047e5db851691430ac586ced7dd0f8f537a2f73338b95d6c8ab52be762a12b6e4c43c1908fc110c4ec3092b33edc0b92f343838f5ed63dd16e61e499c42640cf5c64c2699602f5d6871deff01126da61475fc71fdd89eb71fa486db0d25cd043f410edca3a5cd3a7902846c74b12b2c73158408bc411a739a54fa227fb74007e850006e7028a7971c8e27612dfac00b500ca9650475a2f9386953059b33989bf74945875e5a38ecc43daf59e2285b6bdf606b271cd55a6e436078f8c58b8d563b4e82e14d962bc5f3a795cfa169bf84c11f6b189608f360da988cde942d0cb21ed81b82b25d851a8a9620aa62bd74907656263e1293df62d3fef0c85f4c567f4ee5e41f7b00eb567c63886b796259a7ddc820a9bd1a122c41d28295fea3d018705d662f3d036493dc27e19fa04fdf09594ed0bb85b4b997bbf9440e80f8ccbec901722d46603b5f3082841247656cbc0f67e3d519988e60169ed7a9b4d88709ac18803cc706b2327c64f357aac45d01ee0a725a5bbb4e9c30837694dfa4d2dcac6a29afa78377152f5f567178a7ed7b91b1a4779f669d724ffbed9529b26d46be4bc65ff9ff1dccc838bf35cd9c93bddfb49e822e0146804e68a3f5ba8d47cccae6173e95434a331438374be27cac932f3178b31e063c5c91ee7b87b6cb2bac7ac15a172d510ca7ca87cb18fc51793297c3144908b39ce2c8a26eae0bcd3372fcfac88093eadbb26568bee2d36e46a806d52642c626ba458e6907744464756756a656b445d9f4cf9baa6b2ea3b4de677bab2e923a07990958dbe04ee121d0d737449a02386fa8c84bbd490cf55b4715a8446d71b6daf7e88cb7c84755b18e95bef012eb5f6626885805211ebb585ebca63e91a067889138c8e1eea2a80175db5a05e41558270a4acbf8a68f41f90f4ee9b28c4b96fea3451ee3fc699caf9c7fc10401d879ecf0f030ab522c290a4cf34ac4e82106bc6c566e24266584dae50ee613bd65002bf4e8c79163365d534acda828ad64b6a7d8139072b73b7ab71e04f51ec136d128dd0c75f0917f822fcb64249085f2febca9fde8fdd3d3afd3a222f63d97335153807a84d73851f1c598a48968124228a0851a8b24c869565e0622b69d0ab5664e1d2f09f7353cea017729441435a0de93f3c6d07c1763e84a630f4aa1283cd4771fd384485be1a9abd09431088db9dca183800aced7cdde946dd20650f55623cc3d34f3802ffee8711b9039083c768c3ac7715641727953c7be0fa98e91d9a12705a8eca0aceef250c3a8545b32a1b9a731bc8ec7fcba9dea06d922b2d46461be4f4a66d4c8ecfb6378d86977ef298819c35ff8fa6eb602105597444b00a4a492f4a22a669a67f02ccac07b2cd990a9352f0bb15905faef12d541f990c1ea5853da7e4bb223aca5221748093f9d7fe5ae82618a30232c4342e72fda1a93969ebd10836d40990368f08599ab592e3a1db793ae7119ce178785c19413c1a9bc2ac2d1e64d0d70f2fcef39e7cea00d9c2c440ff0051d5aae1617ceac0838f6ea4ba4c31d00e00798752b31b21dca04c5aba0c6e9a3b2e35a0c9bc47616370fb8c81075898282419f40a241a51a8a00d63b4d513af9d9b80d9b4e0e8f9c9ce26d9aed061b6f5e717b8fc0a250c536c1f099bf558d6ae5d30672d2d5180207131987e0d10e8cf48600fd43d3a5cf4afd1eba399feab2d734e3e8a655347996b593424bbfff162d5e9783fc7528f21d591b1c3027b7b40fbc2c804455f4414041ec922b1bd7832726f17021ca6e6655d02fc6202a67533c20f218f20ab061237f20664f58bc3f385dfda2266a013890a96d029e46503c75ba56f662debb4429d89e1e78feee4c3ac31de50003f2d64e72850eeb91b7a61346efc057140392aefb61f82fbd5bcab1a2526195dfdfe95a345d24fa9624093bd72faa58b9c908de8efec9599d53e890d0b95bb3c48961b817a0c51af0589b743166af5737c564cb1b7af15ea2bcc61cb6107c55e82e89035e9d07bf01445014d91921ff8d1c182a5ff0c0461390c854c700ee9d5f8e9a748cf0ef62acd82fd498d91517c8e6047c89774e9f98736272098cf02fb2d9f41e3f153299cb0d7ffe0ed69c5a2bb019a4f514baf947f5597fbaf82c02f0e7aade262fa0f5fff2eeac980b99f712e2175e3bec1e4fc85ff42d9831d9a13db4dbea55c65d2e15ad7a0bd88cc21f9b81594e3c9551ca6e29d22c01cf02152d100f927373f155150d036ceb0fce1609a49fe56eef4cc0f66987a466dc095fea4ac6a6f8af0646a1b25dfa778b7410a9c6eb6d2306470a1dfd0febd68b79611441729e7b72719df4754a587bb032396536c3d69bdb2684ef4c034bb0c8006c503c9c6f990311dbeabd7d87daf46ad9739778d2ba3ab812fc15da691d0b4f58f22f42d604edf3ce14c8590c491bdbcbc534075649253355b480e9432040712d42372d9a257c265770e624877d945b053829f295ac4c13901bca69ca23eda86cf0056e44e6c8fa96631a9f08f830467ba423125e5008651a9327a1524cf6f8b318d37ab81c21a7ee13b2c0ece2a8ac2f05511e83031ec144090f1aa18373c69054421fa01d96105bc2024997057219190104edbf8ef507cb3b2edcc8bf1475e7996b51e6ff42258c4ceccacf0ec945549e8cca67e775c02512c16a729e75808e2bea04336be7e92ba9c6139028b10dddb1887934b64d2585f365781059e90c0c0a42096c3864b682806a00b2ffad3615321fa2d92807578cc1ab28df3de370c62864f5de4406469fbea1685a37acd4d47571d29c6be2494a6ec30c6deeb64abb41d3ee2b3eb87548bd04f98fbe2d7ee11afb920a8caf4c86b64b449e329eff137a4f162116cc31cb0f588f80b9997871533ce20e7352a27c5dc00ea045bddd84ad50e7b963a4897d06622da5db95013c5107c9711504fa873bf2cb9746a3289c172f91b91f31b22450f5ac33441f0f65e062c03842504ea7a53b25920d22a4e3ae5603b0cc54767e4188fe85fb84761d92f5a38f09be35170aff3a8a0e731c7ab202fcca6a272fce944872a5d2110164607f6a691c3411fa2504557d1ee35a7ff7a892a8d15ec11fdcdd65a4208219becbde5de3b860a210bff0a930564bb489cee851c25ce7c61c6143a9a20e44b3a912d2aa9cc578f532c6990c38d47d0eaa1cc42f3505691e9250ef2543ae90116a101e30c656c0522992d0ac6d92a3ab2519d3e031267e6f41b88424a107399cf7b0f6319f5a537185e7bd3c3684676fc70bb3f3d8c6768473decb6bf3c8c3ee09e3a2a41779887118d09c8578c11903833202d326d54602c65d51416bd0a9441a517080003de7268b37c6f2f14e1409473a6941285b410c4a51051480ba629d9f110f7271968479db6f022c43d55447798d3cba028a48512f46419d0c61af91830c69a3e3dcca7c59a7eeabbb1a6fff265b1a68ffa6cace99fbe1a6bfaf8a3b1a66ffa3ad674dffbba2fd66459d217b214924432089feebdf7de4c798032a84a20f924666e6470f2dde00af1a68b740a3a774ba0ee01f76344d2ef66b9ba76cb6f66d9b2654bfbeeeeeeeeee6e0be6d0ee8efd8ad49312818b3e381984a594d8a249602d27814d5949772b23f5f252e2c4a27a148544284cff8dde63bfbe249f927e9540199b2dda20d7030e65908fc469225f3df248a82471be595ec9386ba03402c197e40976f54b9a4e754a297c750218dad78f40e284325b134a39036550aca1bf67e079d3e596637f82abec3d307a24f3267095f5c024d1e9aa6ed10fed988e8f4126433b988232e8d16502794c45ba456fca1e614319581989195f10c98af563b2288bbecba104426fc1114820b4532581b95c41162410fa9b28440a2920be64112e1914ba6450e89241a14b06852e1914ba4aa00cea167d97043ebd04a29750623f356671d14b2259450649214bb4cd6d0e13a5aa24302ac7abb0c4d9f27caaa84ee99e65599665dbbb7a72634e3a5fde331fef4d0ef3c0a19a655f98cad9b52f4c65ad7b9438dc439cbbece1cd1d186adc17259010e7ec977efbeab5d40130cdd2cb1ee3ad41b3357f6b507705fefce759f3785e35eb95cb830973c0b45919015798b79738a94c4fbb50394dcfe99b9f18ebe62e15ebf44a0f989e0216bc992c0984430944be7e3aa048ce64d1ae61aa2b72ce9928a448aca1a7d7e2eb84d8a2bfb929a18456ebfb6666c209cbc09c6ed17ad40181ab18758bc9a2dfeed822d3d78e0a7e8e77584172e30e2ea03cc901468fa45f3d40fc2029094b100eec7003469f435fc40e818b3ee4ab3b5a32c2f3fd2b84e955b40aa52cd7f562cc40483d309d9bfab9ba951dd7db0a9ea7ce47d810f8636564aec09aac2cdf40cadd319f2b8443699457db7b602889d3e5bed442e2745b6448d3668bfd89422214b92fbbf40be6bd813a3ea7a7de037b79f8c37c49baf529f9509f44fa5e3ed555dd0bf2bc3cbb41174231588449a16e0d798fb0a1d509deb57b46b4156495c9caf6092e92381d1812f1f223b28d25a888c1785c00632f7f015d18e2fef2bea442e270de397065a43b770e5c817b17b307aebaf7e42b244e95699381ab13b49edc302559aa9038dc2df7ad4002e9dbafcbbe28814820f22f5f6a26401ef5c40a5ef76577056f05fb80ecb6e35051606994b4051d47624c9b0692405ecc32d62f2a81ba2c518e21d4f0451d4ec8f185180168638839b0c8010e5d50c10551aa43fb56f431d77316f46ebf5095adb596ebee792dc8ec8123e8b20557e87e99dc77e7beeedab7e26eef3d5981c4c9c0d509ef3beec81a187a5f0952a09dfb4ae09ddbe2042414d1b4735f9198bd18cbbebd53dfa90579472e79d93eecb86c1f6e5ab60f5588b12634657beff1e5af1790ce16f7fee438d335fbee331d7ff2c964f5af6d097485047ac951c60e9858628a1a54a2161e4c5182063e315822d667b202895302c36dfbcbfb49fa757a9f3b7d2fdf492275abffd20343fda65bfda1d3e9a8fee9053c3d64bd3cc2500f5fbe081be298dc0cdc59fb0a56022df41db15b1c772e86572776eb26880d0c4204cece6580036dd6c92d26ab8bd87b20ca0a9647a0349aacdeeac0e176eed94369c47df7768804122f440289bf200324900c20d191b92787f8d503b38f9546c19748928b34924716a93461c8e0708c91011c8e99c3f115b33841858aa22c8660a5c9ab668e263a9811450e8e2802161f63fc8df1b101b4d67a31d56e0a3a51c896e9eb0f124ab38ad4bd0746b773dfd9ce3119b2e00eb7b2da996ce0cadef7c0aefdbe5dfb9064f40b1cb3f69d7b0d643264cfa47f77ee99cc5f7055c19b1c4a294da2d3ca5093b2bd3ba52d059d2884cbf6f5270ac129ddbe2279954bbfb8f78f98ee813c26d379b67aebc7ea967d89ead4c72c73295ba150faf69d12b8ca3670451f613b1cb8cac055f69db97d45c11b584eb76c12fb14ec75ec918028f44bc740bf04ae320c64a51fe15e027986764adfce633af723dbbd7b204fa9942d21a25dc7fb4ac7642a954a2ffd6a9ffd2dbd7b5cd59b3a90c7bb29ab5b26cb22b1ef6cc9c674ba65b9204d963d52129dda162efae0b40f75cef4ed3ba66fe04a7e7b0f6ca7f4fef69d9667e2bd2fc19dd97dbe07263d222d1891b9be0211b61d45446a9f85d94d56bbe2b60ca6693bf3a76b3f72ba86cf93fae947f05ffe02f268c7a8afc2380df52544ee75505fe9a4525f1dd1ae3d435d9a9d8e6f53a9bffc887614c883baf6179067680775ed3c2f4f3dc22c3ea15eb454ea8b302dc2b08ddc77fadcb7cb9fc9a25ce7954c974ea4cf64352c6adfe96be05715bcb09cb97d114629fd0dfde95934ebcfaea7ce0b44bd92ada497f4b348dafee6f4280ac1c97dfbd8968ba50f71fe02cf2e70ccf50480a16adc99781cb8d39d097e07aeee4d8fb0ed937986cc75b77d336b5f96bde373d4fb4e770f6432b49d097df70ddcf18e41267def3933bbb9563195ecbd6f75cfea965d5d50e7ddb202562a9365373bf07c58a9e8f8d0b7907d7886bccdf043a7cd9dc166b77427cb3ecb370c5cafd8186a9665b7fb6a965dcbc0150afdfb23f31ac8a3f10cf1dc37f7ed3ab85bf54e56fdd5f191e1be2f83f6954e832bfa7e0f0c5c51905270476392cd9f8cceb0d2e9fbfece7df78ef6093299d79e3357d9fd56d9ef6dc59fcefd62d71ae9948a94698c2f9f18e41db021fb2617e6f9fcdcc0bc37b9b0a9824d166c4aeed1a7c90d2ce63f17867a5819f07361310fbd05fcb06031437e6e60310f5fe8a7927904894049999c6651a4280427b71166654a737a57bf4aa7cf699d7ef1387d927ecd9cde64fa301ea96e7f4c1675b1268bda3a6cad32fd799a2fc2faa56f7a9e374f633ace993212cf2dd347afae6ab567d1bb8614a1dfa1d5caa36913d62ad5680b4acf4d29a5acd2afd46cd1d3148d39e0295bb1865e7a1f01648b7e7e3e4d0e8b12016129479980f000999e0359b1869ebb61496da19e034d88f9ca4b50a77bbe043da82f46c7c76775d37d781c9732bdb7a998c01d73d491c41c05aeea518f302432de513fe21d553a0fea289067be04ebbe08bba9bf745f7d29d577facc07d31df59c79573a9e573a8e30fc45d8ea8b301e5f84cd68a7c3dcc727759feede7d5eee837ae993f956f6f81116f3adec4dbf2bfbd2e7ea16bdf7a1e83bfa972f762bf5c56ec17cb15ba7aff34e474ac7204ff7d2eb77c4bbe9f643c1bb09e419dae95e3a8fe9de95e7ba6fb5a4850a4458f72544ea75ba8cd52dfa1a077d167dbc97aa95c9a22b7b17ccfb5616d461750bd67d11d609e17aa55661d52a15e9d473e74b0db4bf3dc21a5ca1909dfb11fb0de401798676b6dbf370cf6e4466f90a44d895738b4c2f270a52e79e933a3efdfbad562870d77e64fb0579ee8776eeb7f368308e3efb62dfa8edc4e1cee475c933c51466b95af5db9d7073a8d386d2a44dc7d8194c7736a6528e075415638cdddd7d43e96d1e44e263476d2ece9412480eadb5d264ba22121ff1a53694ca95b54229a52c9a158f19954c0c0c4de9e60917cad9b4da4e7e25642eebe4079379e45476658eebe487332a735e27bf9bb952273f9a39130ba9159540e27b64123277c2d854f23018dc8b8ca83971a69c12c8a9312d35a554956976bb5b39196b68d36ddbb44ee3eeedba9f042b99674b5dc599534e09a49b52109b32dcb44ff3a56321fc0196ef7704b76d05fab190ca8fcddd20a65e50276c2a795d6aa649eaa5793aeb2cd74bda3c9dfb54372c392abf138db1e6c65ea9e3b0e92b799f8cad3aedc6759e473579754a38c004ac8e76b7adb260939a953031e1cc166605ed6e9cf650d35621b871c668a7c8aa302be4bebc54eb3aef84d9ddcde33aea751f5742ae1438e5fad508a4662a909155272acb53e2c808a43ed6179b4ff81481bc8820f7252763ebabf3942b0972d7c8aa5576ed4b4b87806be5424ac9715ce7791d57a55e9b2b29b8cb755ec944c25327e17b216104cf084f4f900671b946e8e119e1e909801e349e111654ea2300011040288192e4481f86086000178ab3544368563dbc13f00058de0f166bc56a754849646b761e90f3f30712145670213424d6cc5f21648c478b005d9004923ac85792961b87032c7df0f07e0214a00b5abde4782e874dd34e5e14e04707d4adf94a850492507ed44820f294407187f84ad22d1ff2b4828b05c4d61c22444e2c1a92032ccfd5f098f18cf0f4344096e11995678404270cc4d54d89231f2f4a02998f1e9e02cb1054c978464870c2ae12ba3b6d64a5e2d2584296c5c078465850e90128cd19428580eb904abd40401843860c19121b105ff7f38249a217396211a5d82ed0044a62031c24251363278f33e46c5a53f645cabe12274649e73d65ca846a1b6eedda4f89fd680442eda3cd7405f9a3b22b3d6e8f25efeb382ab1e76ddb26a4fb91535187d2eb6cdb86ca42faa92d66995b9077c89e4ce33b8cd21e37146cf8d4c5e4f8d2ed64d7757793afdbad79ee9186fb3629a5bcf714ec08c43e469bed0a2a654251596ee9c27cb139f68d4a706aba90e51be7a87d314eac04c7749772319d29654265e612985e35737a699fd7e99706ba666b8600d81eaef27ce1ee74714ccc7430a917542a9b236ca1522251f1c39d425a9882c0208588700e2512b20a298fb284a3053ed062471969f460062cdec1c30f8248da82049014b0105f91445956e10150d64ea78d4744cbccc8d9ad4724dbb2fd81850a1918654a1330451ab97bce2b91b226ad1d715c2f8a6c14230833945025e4f938451509b4d1035212192f10238e184517330061e50926a61411840821e01eb047a4e518798641642215f1502a438a2ce8bd31e8c8f4d48b2892e04ea0c40e36d0e24a1a314c8185ae4c291165a091c3113588f1821391de5319641162898c070f320a27609ed73832a07023f7c8f4b70920caa8830654243147cc1272bcb1830e2f6cb1630ed1060d57460145115d670137d64822085464107a01169b10a28635ac3c81811b38c0e69435d0b0b50179665123cfd97509d041080829705851441111962e414fdce0081d888019499d6ec94f2192ecb072609c658a3ca7c032852529d32ff2b4a1541691691d9926894258a058606ac2ed249628f2a45dca08da4d333bdf19a5b4b36fc26277dfc07d4a6da535247d84241c76f5315261c4946cbf0853757b54145147b6df8451b08b35dd069e5de7199145e81fae3efab0b94ed59f647a4ef66b95d365500a34120808262bc90b701891327d920ec4d7e917882dfaf89910735b20be5c366164aad3af075c1ce4304691a3ec529b10852c892414894296d8ab4e884296641f04a29025f7a1ca4814b244034004a290259b0f0944214bb8004c200a59d209800251c812ef31d68403c8f4f40f884296943e42ac7921d6d0c74fc2106be8ed27638835f4d9277d3e2943aca1d73ed924d6d06f9f9ca1a3a1864c2f65904102352863b1861e049345534832599c0db82f3f04ac37c95cbf9511b9826ab228ca4a926913ba6e6e268bd21718ba26ebc6956990c9a2234814143894b124d3759344feb0543f240e8d2a0aa9a79f89af6b52154d16fd8906999e334df115a37cc1044aa06ec53e2593954402a1a61c91b8d909c195728cf6466cf5a7c4a98f9cc48143e2c4316dba78e70ee50950ac7982c3f8048712883b02cf679741fde2c0153d2773882f99145bcdbdf40e1c0a89e03830c6812e98cec3bd3b93a11d7c0cc6ee1e901cc20d427c491f4984dc2f7dde77b5609b031ea22f112056f2c0ee1c141c4a9fec2e08c5a30c24717490384f244e05fb2b23326b79843ac2a1f40192484c2ad24a16ed0cdc9dbbf4913f5188f6bea421da482e930584c8923edc3763dd6a19c764b50442b489b12fe788ac7e5f5026c59aee82b084024aa0c99acf40259305ba208174652281f45b281285c82e27c4979c23b6fa37372594d06a7ddfcce44099d4ad06ea4b21202853a8d04f0a0149209dd49f3f495deeecbca059a6c7b3452fbb5f69723fc6546ef9e514992c0ac310380c92a5e020d3868411563c66327da8424caca15721c69a5006658525afbc72260b29962b06dc0f5926fcb8912041e2b73222b303e62b46b6e847c8f42c7a170dd21d15b808983359946b8241ec43e2a42410da31b6e82da8d32dba051b65338091a6d9e03ccc01f29c947382bf3aa1d20a8394aeda4e41bfea91f44baef32a20fc5391729555d67bd319b83fdff5575afb22305f1156a3add656a36ec34786a25ce64fbf528fb56bc6662cb4b79fa57fb5888eb624d591347da4119738baccd8fcc97d3b6997a4389228a5540a8181638679eaa12b26c5e83572d3f9d3e36bfac8f593b1768263d2c83b71a96f5561be550557f5d935eea43a7eb9ea3933fb76609e7afd508079eaf508063894b19fd5230cd68f31e7f123325f813caacb9c07c833b4a3bacc795e1ef308cbeacb638e44751926431ab8937aea4c5e0e73096585fb7ad5875fbea1fa9576d57b602b0d5cb2f37215c824820fb1ccc30fdd47580c4c55653ef9d3ad7e89f5eb05bc571a751224313caf6384c6dcd6de2f54a13e54217ba8c2bdf65085eda10adc4315ba872a780f55305d85d2b9090373020a0c4fa92fc2a6cdc4f918fc4a9eb67159756140be5e4029740a86574921f97a01859acb6409f54b6e315b7d29b4a54a9f8b0257d0ae61b74c16e70487d66ec97d9bd4cf6278a2b470d107b7ca7d50e2f8a895473d1759b701cbcfeeeefe0d9149d554269b3e8d70e9dbfc0dcb1a65df3e16067d7e6e60a537b9301f9f2687716fe28275f76e02e99b5c58e9f3bd7d3f620d6263cfc8810c365ed1074b84d1860c72d0011c4930af0212b63d67e24f96be568c09084bc8f3dd176309e12b4f048409c8f3dcd661c1312c8d1061f5472381cc2af33777da2ca85a5f8a362388465bb45919b1ef3788d3af9ff11561159525d03503f7c39b70fa3f269836ab13ec5d9365634f9fc2b459dd2e27052c4c9b98e56317084aec27fb5638856b5647108db2edc9aa2e0af6f9646cb2a805b241f45688de02d15b28f4f66014627500407cd91d628b5ea57a79c9e133976f812490ae8a058afddc20a892c0524e1fb44f7f8993cad307f8c99a4960190ae0ed8ebbe66fe6cf9a70d4a06e4d2ecbdf695b90393bb941c312f4d4a09eb64f3b5375b89fd55a5fc12a44bf3a65b2e64c8e950dae9f4a02d3c74b1c2ff77db088a8c0212956dd26385541d54b1e4134ca3573f55bddfe4dff2c1f3f3a0ba27aa55f8bfa95a85621aa449528f75d3767193541cfc9223d6bac0a0cf2358298c4a19916e9168d6de810db504223a74424246c6c63c6e29f6f286351e28429b04b3fc856b6e4c34806fd7d21c75789635fc8992cfa0a466ec6623f40b11f1a62b1582c1693b108e81409114b1037bc807332259b60e6186bb8185fb6ce39e7b475c2a45e26aa4f139b66c9ebb8b969f366b81b0cbb158dc0692bed9b9e73ce97ad73ce396dbdaaee9e73fe180355e5d7986613d4c659be2757abd3adf9396790b96212afc054d05701fd89c662fdb98aa00e0563de8957600db2ba156132272bfe32176b49ba307be6bc42d0b4484d5e0af617e36bb55d29adad6989c1616a5a6270a031b3f722c5d8936f2c99b0b66d1a195946eb037ac2a627da75d36e66378d8cda37b31db5e184d2341f2f507d147da9d4b696a524e0192141aebf5f8871dba048636c78f94b4adaceee750fa82006ad97a230b4376dd3c8688eda904aa562686fdaa691c1d9d0b18dda10d3c57844ea63a80cedba6937b39b4646ed9bd98dda2063a45fbfc5105d2ac6a59766b68a416f66ab1320b6e8de79f5d28cdecc562757d2a657ca1b5bc6a8934b2fcd6c1583decc5627b66697da9a8951adad99137a6d7572e9a599ad62d09bd9ea044609a4d9d4f66be37e9570c9298c8167775f6edbc6654131243a3762b95662cb89f8dabe813226a5c8b108c48a745de7554dd3823ccfa3444230e4691fadb55aa954327550ecc6e58a75c923625fba78ea04992f191434244b58801ca1e4ac1571641409e43e06e59fca6641518282e6b51b83228fa4510c4a3d3ee7bad94b06758d38322681ccdbada98d81e5b35c99ac298b741081ccdf692485f27422d6cc5b19abb9416925d6ccc7dc804f37d334b9a5d80803c7df1cb16871a29b8b66c0f6a87ddd6c6da0cfd0fd7c130cdbdedb9b6098f66d035773dbbabbbb5b9b4912633addadf54bab7e2abdaf44c6b836b54ca7babba3544c8b74ab29c77dde4f5ff719eddbe9dbaefae4767c6dfb12fbd5d4e6f7b9c0eed75a8be8a46082eeeeee5a6b77777737fd6aceadaf75779da08ef69877641ec3bd7c72a63eee30a7c77cf8f593f9e59330fbc9ace3d12fe654f45ebe38bbbbbbbbbbbb63769ab0d02b380b3bb23c9d4066cc70cdd082d3b2c466c618593bba148b192d38007de5b0cb0bc8f5d70869079b03a46872fbf811c466480e87e43b06516e329ae426838cdc6550c9dd65782106d2c477087c053f8a7cb92dc2c82253faeb031bac327d06461837b432bdbd5fc829c07041a6148c2c99be7a44283e03a7e6ab63b1580c4a97a2f1f14336c9619021996689346ec9d4cb618ce3470e631d3df29450224105a55f647afa8b5567b9c8c8f437394574ba0042a64792c4874c9f829221327d0ab8a041cc0ba29f2dd32662e9028d202fac10929269c4725447a611cb1751647aea11a140f001c65bbc20cf4f0ac71af2e2dbe11b5f118605d083376e07649af33dcf43f3ae34abd32a593d3acf8ef0a292c1a899982ccb4c9b29dbaa649ba9cb36799cbc771f01638cefe1ee237c12f6f2f1accee3a88f676867751ee7a1b969a5fd48dff423b37add766e665956b3da73bb8f7927dbb60aeaf8cc5cf595e948e6799cebbe55fd08ef81791f7ef71dfceef51dc864a8823ba58f003259bdf41eef81715ce5b86d05b4a58a0b7218440a20949002081f29b9ad569936518a1feab06282cc758502c63d402634e0aabe37706705ae50e89bbe33cfe3f33c5efae9d475198fcc9eba9770878239e12a3ea577afd854f2e29d2f5162f7b1890be6fd07c3ba298f02559620113e4d2e4cbe0986f5c3ceb1458ffbe5f3e382f59b6098774a4fe7dbf3c0952655498ad458e99426a97a743c609e3a5dc5d01745b9a6fa5d936ae6a5f79879f7953ccffb8c577a0f6d2667caef73819e0108901565597d119d0ca460025a84b4465297ac76394a8a23e9a85f41821c05390a12647baca12bed0424108845518b4c2f8bc41a5ab4dd8416eaa5b764a5813a33251d1f9f98afee03731ef58b58435fbfcae5ab6078f5a86ac9f482f528d65c1466ae3a92d269aed3e3a58f67befbccc733f3d24d8f8f46f5c56e0d0183cc7c43da4b1f4fdfbb59f5d577545f814c86ee99f455bfe08ecc79804ce6659e3355e7f1c994beeede77c09df9ae33a7fa22cc743acc87fff2714f7da8cb7ca5c792cc5977999cfa224cc7c747869e580c751f9fd3f17d4aefc4982caa5332e113eaa72756a45b14a91e1551fad2934d141a7dfa29658d809c524a2adff2f600d3e75823604dffeacb17e9170563e36ec5c965c290a38fd0c6f276ee6e81b5df57a47e652a55f66560dbb6e42d1e2501850f599061048b971e9188bbb55dfb88b8ddda7e7b80577147fbe5398f0557f196037778327015c155dca9d75eefcd4a3c590f2cbc793b977d31592669ab660ef3ed29f40b7f7b0afa85fa76b965db697bd94c9b8cb283f4384fe6e3b67bf4fd992fc2e861beceb2ec34ebcfc874a00ea5adfa222cc24aefe9efd0ee974026316f701599947a60dbfb63d19f332222bd9507738e76db167f2b97ecf64734ed56035791477b06ae62846db75fce16dee46ddbb6edd4d3c9b6da712a26709697d06c82cc4ba807ea64194cf7e9c88029f496e56d3b927ec57c7becb845cee7e527e9ad50c84ebf939d824c86ba3329812beeb4037760de20931870c5812b14b4d31fd14eef79e8b51fb92fbd04f2f4ef230ce69ce9a9d331ccb9ed43b21d6f3f6d476d7fd99e326db09e582cb66de7b62d6ed45ba140af1d49ffbef44558f60d5cc1c6e83cd5c0451fdcf67ead60f72c7cd38f54fa6a02578f30f95d9ca4ef53e87b9dbe47d21883ab4ee61e31d39c36127eef53e8178f5fd5afcc6fd24ccc3502cb29d2d31e3d1d1487d2ee39ae47844daf02f83bddf4d15cd6e3cb406f3a09abf378f4565d0fe9795a5ceeab4e27d6dc7337e025de4d882d7855c50447bbe91159c27dd5813a271a1d1f9f99afeea33a8fa7708fa45ff4f73a51c8cd3756ca4362cdbd8a093c733824dfd37b1c09cd4778f47448a85c48f846e8d109e1ba0658b74cd6bd5bf23d773ad1609a8f87f20c75e7a9c7f5f83bf5f81db8436f5a7d1186fa224c5b7da8cf7ca9abbe97c77ca5cb7c30e7f19d503f7d2b1dfc0a4418369dc71761599565b612eaf874d33fed9aeef1fde91e75bbe4fbd43dcc054af5c4ae067eb2eee571b9c0b29efea27aec340121c2ec8e760dc4f61a78bbd53044c0d2852eb96a9fddd99e6d9fdebbd5158830150d789e3e54b140b32fc222855d29e79cf1540a579063ac913d67151b304c8e58ae60230ddc9951c7155dd45004e50a1c58b942685ac12f3962b98287a9c5153f4d059be6a043609c86ec82f117f3079f8aba087756fa07734a4839b03da2c88a28d305389523162b7ee60dd834470381711a34098cf2820b6cb39864e03bc51c036f4e483a3047850261ae0832aa0822081818555185b5da8401e38a15188f70831b5641403d8ee05144e3ba31c061c675e30a7263c49515161b74500101c4c375b1c040838cebc615e4e667e676a92146882eaa2d4f6082380a02490667b1432a29c6759fc082c38bebc615e4268a95285960f01336b801454451ea092176381901f4f204141b700c504f00fd98848c4e4fc47043498a10dec11c35783f1c9976904443170324624065b6620e2f4e63861f6236146d51439e1264c50c425469a205322052220f6124444326e2c787a0241c6ec85292b0ec000627b988203a7e5837ae1ce44628d6ad78d9b8e107a26e451e20c18051003168142f72e89a30601414b307b8bbc1bc037743730011a5e30022072d8080a1b3604f08f3094cdf6825b005422369692fbe00ca42065cab9048f866996f60ee0654075823923e20623a81b31cb1fc10b4056b3962f9e10530605828b85066c9c9adf391ea702a1aad4ac87107a81b24731e2e5d53274f9dfc5499436d91b954bca2820969e69125c8424a7e314be6646260522f2fa853662b6d1eb81871624f2981c47331d2b6944a39e79c734e2dbdcad3049a4ff39833dd2a2a5363c750982c75fb86d2eeeebeb9420331d7478f03979c80412226ef26225dc8424a226165b66acd553a1ce0572ece80c10537c061c3131dc0ea0f1974308428551081c50fb05aeb3ba4ee9e2c23d7d77bdd1781c9aa47c951eb7592283141ce000bf6294c1beb651988b7c919d9aedd848d03c3ec28d0a696d3f53132e0bbea8f69336d3290fa6005b9a9a679b281bbf1b5de7befbd5bbd96afab09517e25baa1b9cfd201acc317ddfbab81a1eade6d0c9cbd7e03433c421038bcaf0f2bd10d2d68826e21b93f26f20c2c433f3017e40d4c4441033644cf55a27e7ddd27ea578455b992bb978861cc008a2662d0431c4be4a08223d24032a2062e50eca05588ebcbc3dc81b3e774f68577857ef42c1816c936bcc9597c16f6e4ac43989b5c2bf863b2581306576293a026504e5819c99952601122160310175760b608aca45f3a462bf457d40e814309c5d5adfebd5d0d4645596691014a1619805cfd52a924a7244949bf22eceae0d8ea639584416cf5a514a1044c4289354b40e9cb1f2529f8775fc0e1cd4d8425e2e7300bc6d9a24b8850504699acbe09314b28ab2ba04869149ee6fb78aa7d751ff3f6f88ee67abbf2316d3cd7b459758f995b71ae7ef9f02107963ea664a12284850cae98c28b9ea12c340c495143d2141b4a1f0b8b22dd77bb283705763071a58932ac48a30b0df040063ae812a50b243736ed4a992f927d3f7c18e1234608226e50c41a5ec4ae88678cf1d386166bfc6c7106966508e16305094b1d61c01c1005961940a1450617ec009b77dd58283c82206bc71823555d33039bd1dd3d678c34968438a594d27aedbdd7d6396777539517ddd4d6309b8ba65faca1e006725fd68af1e468cd322e2a17b66e31bbd66e1cb6682a31c6b8d6da8dc316b5bbbbc034ca0cca6aad9946bbabcd7c5148983d00ccb4565b3d231c08bf13be7153e6e2970b2a59d1a4c8852173514c2a52a24a9a4160cc3be79d36e0538e597cac28820f152db02ac72c3e51b2f8bce043bcf45631ba170b9ec9314b0c5c620c465022ac0a9478b36cb3d90bf8de23285cee80d9000a172d31802dc1a5a807580db85cd7134de6c5b7c34c602e493c815129e2e2c30e30268e4c34dc99658816040168ca10863065cb0072c4428416584555bf74b16e54f2b254aea42da63cd5b823cf39e79c73a6b2c0f004153138c9fd4fc5c619332facd1c571c409020f3c6060801c763134bc78a189dc27c123d2780d187c73ce396d46a0436867891da145eef7c0734e36aa909973cef9a2c10ab80306b9bf82e30998225891bbcfc323d2375ee10697120acb8b76118228c08c0a8a8863c71c79ce39aff2884c35e0f064587664d1aa376280c139801d2ed8d2aa158aac0011f42387195e7c4007357431658c28b82051e28d36e69c13c60e4c456e551d3ae4eeeefe135d8a664b9ef31713414a9e5711818e3c8f3a123b8ea0b8800c3b7ed87204091cfc9071c7143c202272438e533c7944a8a4828e1e884cd7e753850ee8c0820e2184e8d9810b164adcf1859520fc00d6dd3d83dc6bb0913b2677774bd93bcc540f0a30c70cf2a4e327cf63d559ae1b2ca902e4f0c71086c8f343e822cfabba2891e7cf9ac327cf975c7db9051c544adddd2dc4935d8ac6c72bcf5facba1c6d6496942fb4e040099f2237dee876c10fe6b0b283306ae8c20958cf2472271991bb5f2402dddddd1e117ab40a4395c32063c48184107c840084108880458e2e8280459e376be06046f38850da81394c49118421387e90fb570547504a5279931b8e2472df7a44faaa6820c20c7e6240a207467054dc588207666c39030ad8d19c436a6c99734e1a20622af71b41bcd1456e38a4e456c537b27477d3f860334248e3c38d29bc480a4a6a22cfff8d17e479caba54d540102277777723a1472c7049a1a916d2641f39fcd1051b3d60438c368e70638635ecc8f3d3d5c61324259ca08183345a9003c50f5d880083157404013623529611c94422cf27f24c61d161983b70c8ca52c5e3898a0729205001630d1c721faff145ee4b9514f2658c1cfaf891860d5aa431861a4ba851048421ba14953736681f92ea44d59c32e4f9aa135bf30d86b7863c1f39703e4a95ec215751b39b755bf6ed6bc185ac0de150c64a9f6f03975e2afdf49d929d3ba563904909348137567a09bcf28c19a821831e6250128bc15c47c196fbdc3bee71b2c2ec2c74b9e3c090e6ee1ec759fbd8ded7c28fee76d62d371bc54299ac693b299c7d92e75fa5c07dfbd03e21808f3db77944ec8dd53332df359050644cfe74500765369115e26419a193d5fd15a549a6cd7c4918320b687452153628082a398c4768d491c3b885841c462e31298c71d0acbbfb26ccdcd49340b747845e02b5808b3eba548337d2efa6f4f426c8537048be60d84781ccf436fbdaceebcc2399cf29f20667efb52fbbfc26119d2bc17869a469910f230efd9c728909682622b63a2261f51256c19f0e56bfeacbbc3ac194fba64cc40aba63b722ae83b3e7a6903c02430a214d23a21009b6161f4f704881a2bc3d05a23710a24014880251200a84baf784b10929caa44fa116ea5817d1b18ebdfb06fe7e664ad0586b3f83a290ecd674fb2925da501a22cbde9ac046ba0a772981e10fd905e581e10d2f8764b105c3677b497f628dbd07865c1de1c137bda85ff108894b5214223f26a7f3c060fa095c1dc13c2726a69f40ece998c06f6815272b0a515fe9a226ea2ad65a6badb5d65a6bed4d4e111d24497c3cc1d6fef64b757b962b15cbf1934b9bbe1e18fd49b2dd25dba657b4e9c53450d3344dd3348ee3b82c3914a96ec8381f381c2cb64135ef9abff3f50c3b4a4094871cf2bcebcebfa59474981ccba59debefebceb2650679e23c77c8f3ae3b7fe9e2ce711bd881b40558e6985599052bed391fe58b1ddc7dd0c8a654d5612a1b3705caf41c125273e9a4ee4263f4a7632dd4b17ed5d37711d1a6bf88aca37e55b089fa0fef8f8edd7b338cad4a55a7e0d9f348e24cb08926185148834d833e4aa289ba7499b1f933812694195454647484c4254942e921aa7225724941490afa4561577e24d0cd4d4e119dfb7882c329448455fda2f10acb45d4d3680acd2ae114a24059109c8c1e88421a0c650c59e24850fabc16900318c0c2986548906c5e9adc5d303c2b4f0b821d48c15085f3a4d743c232a75f49c02b57a41097a45fd227b6e69d70791225c9f4640cb1664a24e41419439e9753f27c366b0fdc121370f65949f608db8edc679bf608d3aaabfea6fef5acfaecd3c96e0237a5e6068c5a0b6647e49c19bd0a4c5806baba15a336d87353b8c0499ec9710a1e9232d79dab5f1326c11c09c4de1e15854c10166baccbeb38cdf4a5a05b25d0bbb7c39853a9b6df5e5089d6466604ce40ef0b5c7fbb1575ec91d8e7d817b1ae2978fef6cc497dc04927ae6093a4a1a69e634d9bc89aef6f7eb1adb4968e00546bad3ff0c9b5d64c4a4b25d0939a53e4e27eade8fd91ed573bcf045774b347349e06ef7610c378b8f368bf5703573bdafbda6bad2d303007ae76eee7ef6badb5d65a6badb5d60cacb5d65a6badd92acb6c0fa25a6bf50151aeb5d65aeb118565960ec13a0ea8dd11755e9957b28d77daa4723c0f2cdcf09065b75455030e25950c6502c5f840afdd5e665f4582fe8acc326d680426cbbe3f7b67db401c597163e292b57e0e982c5b3b2f67b26c0b067802d53981a2109beda55183abecdcb7dba33cfbf34738f076cb7e7b837ddb0203cfcb2a13680675cb5a6bed75a450b7ecb66d27620365956e59fb9dcba09c22560a6596ab5bf67775af149a2f9a9824b2228b22962d45d93e8a91add11d39ecaa51163d18c561b31c7b3bc401b6883c64dad4cfdbbbfad5b757b82f9a9c410710d8c621441bb20e7c7f500712cd82352fda086cb39836c0770ada04be3ba03f60ad4afb802d0d6619d822415b30443771460c9c9ce1823ec3a7d5a043c2a1050e2e5ab840411a023ee2414b1632982ec795e8a0e1078d1dba7c814392154ed8006aa2056c74a9810d44515e90d728c2a2450b6e504387dcc615357608e2820720206521050e998d2bb8bb4fb171af2c815739629182944397137cc2228a1427c29042d486942957a4e4d03d9012c318d80d27882e8d416e86dc683192c901a58ea8242c980a9b182a4533100000a0008315003020100e874462d1681485ba6c1f14800c76aa467450970ba45110c328ca18648c210000600020c41820a9a26d00847b6b0128020ddb83f41b19e8719d962746b226f59aaa2f1baec8fbaec571efad7439ff382dcec3a0cb93b35207a3d3e90a71ac67fa6383a2037d13055532547de8ba807ae399f943884c38f1e1920e21f60abc26ac6e68422429729f84304cffed49c3260cd244c79d10d55ebf86a49426b6ac0d0b03f6e1d54aa67ec4a33e9dcc67e5116723adf2d2cdae1c6a0779268927d241efb5c250862325efe6bcf7d70aaf454b7d3cf410dc859ad54ad4520e2104bd07e89220157958681459bc4e0ba02b770bd81b911c607d831c707d98e345d92cf6e3387d045123f0fd174a47af91db47fa7d54b74f853d7e83c917e059594494840a6b807cbd5f98f1c0741719359a3d4a9be956e247d82cb060bd97665f14b99cdb851f48404567636ae15b7c790f9e0bfe33dab8868a07e298eb7c1ecfba5f580b32e8aa6e50cc3ef31a70181a916d2144f29c4f4dc4a11f25d1584cd8d25b93c22c677ab42515c482860a1781dc2ff276daa2f6f54d6c2e1c2ebd2fc70b567987cc6ff3c66a9206fe96b9b05bfce592ba28f2cde0729d862a0aaf8275c15b895aef932d38adfb4f1b68d3867c1504cd2b1897640a2844481e4e35ff225c70f6147d599767489bcce61254d7a50751fb9c533369a07790e1a63065c862a2e12251d30600ceaa2a3818b2a27b37c29b986c6cd0d7b50057c81283412283968f8e410b37326819c9390bdf82dcfe7989374a715f3db6f3c086e681a2fef8b8c4357f2999e8a0532d7e1fe40177d91e7db6a418aeb9d4843065fbd3e89706aeedd517a469123b4b7c19de14e4314571ac2ad718c152afe532412c87854a5bde1dcb6eb593bc9685184664541d4e8d2f2b5443ee9265301d852278af1cf129d09313e0f9f8724ca1043eb4dcc86f8e69dea2b014616d9fe47fa782be0c3b2c3cf298472de81e99c92de0b58b86512851b075bb1cd37a590380c56015642bce7f403e35d690e5ebdafc9c4d01eeaa31978b3dd162d56acce273e24d72609951f2acf15aba4117442f67fd71fdecd6c56815bc06367b9be34bc2d3ddb5950354eeeb51fb4e5cd55984035f5dec9f0320080d96652d15e1944277536895b158577b60a98cc11e344de02b3dda58b23e66e4d5e5580fa09f30b8dcefd19e6934a8108b5dcf4506c3101785dcb4e42d662c8ff2ebce2df821d4ea6a8d8b41fa55cefdbea06cad513ae55ebd6a68de5e5cb61c2f7c28e9978c57a5ce838c02cd661df29c8d4f5847e726f06c56db3e3e39a0820208c8176c803ce2ba89f2bf74605989309cdc6ed3e1eca5ce7a9e4dfb3f153426488c65a3cc81cde822dafa58272d97c6979544bb650227855bd71dde2917e11201135567c89481b5a958e16ede08028494c3cc18dea3b4b918ed1ee54eff415409fb197521e2133b6b192be82778f45879ff37878c2f175372a0dd5a94879ad440a4d7c9ada82819f5773d4eb96f7bc10eb757f44f49a8d650261a38107b6cd74a67ee718377f1669f41fa1f1d4605ecdf266a8adca197be84a95d5d83636d81eb4f59496d2a943433bc456d2019877b2efc731c9a7494b74d231d8ee2d3ecdea6d4cd5d18747486d0a7b0408c050723d4a6d6bb2abc63c05faf605cf03eb82068ece8a579d17f6c3d767b159be05eb414b7eb6f3623a84cb13814cde2d79b60b88c9eee893f53bf237521313ae28357f95fb8957c37a2d1a2d5b0efda89ae60ff9e1d68b43a74028784e7172a2ee8b47ef47b39529f94e484ace3dd580456e1f1a567fe207bdb36228fc6e22c9de4c75b00c87bbe0979815942aa8a524ab313e5a015e02f58514a651aa54de4628bb60b4892f6dbfe9059ac5218ff1448109b2a7fc1142370ce66d2389335c3717b0b074b41f24a3ac02e9f0d4e2033430991d81bf1cb3d2c24c18f92d033c2a0b26498b3e1a102b11dab56522a4e04fa6d5122e3e663f20e8323abff23e922cc493d480db50ff1bb7e3f12100c19325e542b8e9f65aab2f859aba2c3d272d7c409f12ac2b4e869e5735d25d635c10f5ca412948fb948b4ee9470228a7f88baae5a3c6b36c5b7a0beb69022ac8650fca09a2a88b92e9b52968d59a8be86eee706afb1834498fb0bfb1032f3ddc7030336f6b3fd1615623b42082730f66e4817c31adc8fe2cd1ce02446a370c5285233184556722ea27535c7a39d102b39d5224616cd3cf2b4c9d6bd732c2535c601f144cdaa7f6625b861f96936270e8e05544b5de440a7d34293d3c1649ee2b94e1da28de9d59a5e1e752f561a91b63e33d734655d93e3e8474de43e9fd21b082c682296c4e33ca9bf4171f5ca5cfd6eebadbc13ab7ed259837710e1aa8167d9d449da57dccdd0b9d184815bd1e66f833113e4d6428d8f552f23864ddb4fd2020461aa8854308ab4d4f17f17c2b2566673112ab813045f75f5a7b53c470dce66b282e06c7057bdead702ca23ad5574727ce718eec94fe8c69dd579a5f6089e5b176880f98a3f50c7171fa66f16de9ab7c3e6ae775d170dded8e62fde3ee89f59d6c7862e76a0f31dd41c385f542975b7d0aba48adcab569330ce0d8e1f94318335489f409bf11a14b69829f46dc54a0371225027dcba72d8c4eeb49f411d533a50007a8fee7ca1ab83eef12d15b0e82eda743b01553b4672144a121164ca48a78d8891b5bd290081aa9d84dcf30364b92592f147800465693408e7b352381d1a9d788166b44641fed08c1420b3e7cdeb36f0cc4aab99d2d94acfd9e4f1151d6730dda7c23ceadc56668736ff21a29e1f9de5222a6fbcb1a24b300360b35428747fcf3970346d9655ce086475947641561120e224e41a4964277fb568465d8bf0ae1c4f82f95cf940c72f7d865fbeea06ca344465ff5265b21ebdf9af22ba7c63dea76e6aa121009e6d7ef06480b818544a7fd578033fc827fb96357da2e49a67b64b20ee6c9c8b9d1bf875e150718de9443b92b52cdc9cfc0bb6868236897e43b3d7e31824ab3fc6d181262201bc85ab6509281376aa9c98f0f6c92440c5170baf135219f39298a341293d7d4989e1a1548f1b7ca67453cc41bdab1c70c9969c679c70b1864ab4e40174a2530d9ed3135417e63a8fe965de1b3e6f3b072c256415a385d22ea731047122694537262855c7b1237f32e19f2b537aae8e4a45402ab270c050d57973bb393258213f9686dc43fc82a08c9891c61fc229bbda8fc2d7bb258911496bde646ae217f2dbaba0707eba7e4f7272440a0506085e45963d212b570e0a9684b157a58c150581b5f458b2dcf445e0c8df41ef22b6bb4141cb95ba2dc8938905323305f2651d0cdeba796b9ea688260a45d0e684ffa525837103e67ddd0a1113422e1f5f7833779ccf91b0660ddd6085d94e138feb329069a0e69070bb2f27f0124c98968c023c5c5f9427d546c6fc19f6545596c2fbde3b2ac485cf9cfb27ea9c99aebe4236a1173bcfbac56ac85dd805a96caf94b81b0c9e0cd5a8de517e88260e1fbbb59f07946dff6d08db31999d182ecf6724141e94ce2ce6559dcf317de38287828bb9c1451af9ebc6019c25e814419a2f0763d5be84468db8584791c61f424e9c52fcca8d967d02b16ec10e29d4ed8d384a8ffa0bfe301205e6455ee798de14a562fe65d615b446bce63d88f06e2ee45ee49e87fdff83c3ccf159630431c31c4e4eff0eb83c6000f2dce07094afacb284a17ef2eaa52df9c0510a728e3907270f507bfe023600f187b8d84a8ab62c95cc143ce8545cab4aff640bc215052eed7b11c78ac144888e27049a740b91d0dd0991da6bba884540c2d44a313d7058d5ed9c8f6b1ff41fd3485b3124b06d00cdf256f620e004292c49bc8581a248f541a73185c8b0432841e97dd5ce6c786328812f40ff7f5f9e07c2a625430e98f4af66e15e3005de84fe1da5928713023c86c042357c83f22f25271f82ab1cc6614f229b23bb803bd4f1d3f24e23fd019b30c570eb73421e0923b7910e15076dd54e08dcf91f56ab7721d1d6c01c84ccccd5bbd58975aeedd5b52d9205b00ce67674e0fdda955e421fbc7065d71132f6ca35ee79262e4a5b5b4185f52bebbad82d555319f6bc7b919d5fe3012c5c7789080ae5d00ddc9f22460456d33a350c837f90a050c471fc1390038daa7e2629e496a511838f7cc4606dde0a1f58fd0251c310e28e003a060902ba1bb4f963319db6621b2164ead83ec4e47c990ffe3020ae255c1cb6b16773421b6f5eb6f7d488e36bd21dcbacb6435b6fefd8e09fbebd10c1a6b54b6ba977875244a9ffa4eea491834651aa2bcadc858da53be622d7da9993ad9e4b984ab887bcf06f2d991f30b9e9a8f11bfd9534e41b507a2d7452e0bcfe94eb3e8e5c50750f44d1df5dd9e754eeedd115392f70368c5c950bd081aea9c6d198b7a0c79503869a1fc149ef740aa97c94de69a28b28f449566c4e23e016721a6b3bd84422f28d36f5881edb61115a6c31ef5f2e4ee2d3135711ce1a164a09683949ca975072e1b1f492f8abaed120779bf375650f4285c5cb78f3821a49b6965c38c27e9d6446f2a7f0447de7342d07d61ace8c79a967a135edd5ead80878c451fafb21b9a84c823bd89d3331b56cc237f4fab401e194e5154b82b686929b08d4236491549f568daa1ccf2b0ea3e8ee73ba5760e34b7093a5867444be94440a9399b6a04200754d6fd44a3db7b8a3d245ae41f5f4fff4d390eb49274bd055b1ad899ec0518bfe492c2048318e08460441cfb9cae45bdb09527bea58e32428287153679a2c9b6df508560d4fbd38750406fe67ee3a1ab97eda2a3f3f059f12dd1d8da2f39a4e6d7e49571190e9aa8a9f093a40f10f35c64b5da72fc1e3808aa6000ee29ecc231d18a006fe8eb203cedde02f66c46977995797ae9615187922d1d6723f16e35ba639017334e9d992e1b3dc68278a6b36cefe0bab837c07af63f18405459c2d210aa2fbb0cd2090167907c27a0c230c9786048d176392acef4ff22a3fff48fb35c2cb324d375bdb2aebab18bf44b7ba52671eb33a0c25e6a1123fd329a40eeb4b7685eea885e9fce1f5a2582e630fe9dd35a5547b2bbd6546a594ac48a594141946b2577e31b1a78860ee89a56fe18c24da6b149c9a436225ebae21395e371c7e728dd9963310158b8927c7da97d75cd5afcf182c6d0034e07e8da5457c3e4f9b8b86acfb4a6323629414f09ec3b2e233a5498f01a543e10017a9c825a2a201098ad361e678c99cc6445c820dac609a05d13dfd9c9fbbd94012b9a239b6cfab35d8a9988bb594516f74ba30b43bd4a20a99f29f5ad561232c3bd4647f25faf0562479d7595ae2921a5a5462a8380dcbaaf7509e51d22a564c44f7621ce70538875f97bdc180949b93ebdf4d42c8cb8ec63c401145e121c690c0d0beffdc3e0fc16022f14e29cfda1ddbd543e02113a273cbe30853ec7de72510b2f9f4520c1233fae1f26625899e9679682b37016b9df3044d28f2d9b3262039b5fdf141d0c262e96dd9c9d513dcf9646935afca88f45e15cfad0ca44b315a804c806212209b50be7a6fc943df6dafddf3d7e2e34d57b290ee0d261fc4f60b7061259f0d8456007ffeaae4402b0dfbea0e0e722c1bc0b5776f9497253dc23ade308c5e93764ea6a57f4f444a3da0989d7c3779dec3cfb3929414a12a4cfad813b760cf8d7e3db2b81e23c3c6c1563a819c0f28cdc74a5d767f6109d52e97612db0ef2bb874678c4569829404e3fe12331cc5863307d37d1e9c064d20537b34a1596d6069d42c8556efe010f2e1d18a6092faeb56739d10f497894e1d02c83a4d74d217879e8a88318f8fdbfa3a764722b96d33fb28246e38b5515d08ba46866e070949de1b977e68f422e7849ba660f124f02dc4c369fa0ac8c3b939b07d9e19e8addd010e68a6add1024e17f88e610b5fa38c7a2876c04a83f1099314ede4fcf7d57127cb120bb433c362d4a6091a67d21fa783df68d00391815ba80e2798b331c6b47939a35cc6d4a2f405d3cbba5c6be75a0cd62b87519b6bc567b4be4b4ebfa588108b6339195a3880f97062b61d3a6994fdec27475f372b16958fae683b91f95b558f240e23a4eccb087d4d52fd3568e63ae22888bd2f40aba91d8b80d86d160c20f5c874310e8b43e9fd07c59aadc2a6084c2f51c657653bc39ec776d4df00877b11d00504b811fa827f5d26b27b03cb8b434500e5c8cc18dbb984613bd20e9d0259a1d4b1f2e4f7c468db50239c30456e5c8870faa60b1ece396cf76cc3cb39f172e66d516d68c33c90ba78c653c3c85383dc8a5b3307ec24e0d4f5a7cb616f4ee30389b82fa8b8ea726b32bdc08bc0016ada7b1b1a300d299d2325ce9d77561829b3211123815dc2ee2713031010591d6417bfd48b745ed8194b24fe1e1b67d26d6469a200ffddfa6ecfde2980256dadeb12fcb830d5d47e0478ce74351eb067e40ac3fb25565f00b373173e6547428b36369a697a944c514af595a4ecaea922f5a20d2857a48af8e28d73193d1eeb554d3a403c01c47e7d0bed9b8e1339a1cfe4b347a653722b3484ed2ab1ba5cf9635cd48c6f65a97a68d40f4b87d200caf4017c69c7b4c1c6128304acd32e4afbcb4eccd213c6940032dd3114e6824ff343dc08b34eb72bfcfb4fb58235227b3f79cd77685562ef7587f29132439d1c30a2c85e590b83f1a83bfd01b32f4e66d735c27027a1c208abe60c1a55a1a65371f00c508d4466ec4e98d479bf272819da0d60989524d3bd211e725d4400f03a146a2f468809cf404b640d2f69dfb021fce442d4839ddf6a75359927384288e4de7aec48675e8a9e8cafac7a8a36cc0ac1a2c9598dae8f77266453f60c1e3520317d105fc1150d1fb70305dbe7c7ad4e79c1d7325fbc1e8484f2a8640088e548063a3959e59692d07ff243642f0ed1641ef08ef68c4b80b5eb37c63ed4b6c4157d1cc74796329fa6928fc1108ff4851c049e79b9a34141375124ea6cd6eac3f6b8d736b3c370c8a78b91641991af87b0ea671b81a8fafe60b1d8dce49c8b79966c42f915d5cdfa375dad10c4029a74b6cf0137e6839b272030455fd571ccb0de1905f739559f7231fc2cf4a0f503ad91815f3bba8aae1ea6846730c8d8c3d737c2096ce9a428e1a0e93a7fdf83877ef6b602250f75aed32311c3ee35734e2fa90248937b47103e8ffeb49a9c19d65cdf54646b02118070f46f03639529e2138bfa207ad7e0a1ffb9b4e4089df58b5f14289635996c07c8771d4d1b071822d424961e4f0cfacc5de9c3a536dee1789bf819e18d2f1932404ba47993f74ccf06fdb327c6aa871e5b208e4dcb127155b6a9f51408fd9b0e617bf2cd706b0b80f9099472d7a039656d2a1e9e495c9a7212475251e23ee98f25c87cebadfce6e8298b71395a54e63836087b10c97a89c8c2b572927f513ec750f2c971b816e36003fb2b8930b34f0808af1323a28eaf67801004f550a495731713246d071f91da9dc2daf9a7b0fe88548aa62a1445aa6b7ffc93a5743879b35b23444da2e6149be041794ad7cdacf33485c7bf80702071f643f5c167dac740512a9d16e2e8c83f8c0151319e7f90a632addbd41e42e0127224f18de94abbcc1527f9084059480cd239d2dc33f0044ca50d2ae65da49bf24f776824f0e6be97e540ef065655c42fe069b1d0f56ccfe606147789be950b60cbf7d79197f327d9e6cbcf1e25e81dadd3372686f9c06ea54cbdec32062b7d29872c2b908b5497e48b545b0dc4c7244ae958dde4c794b072c89c3ab1d2ce73697e15341efba8654bef526cef5b8cdb1f107e346ba990c700c696af75654818d4cbc7506f374d8e88d929770af2a36ad96f42514929eef4beb8686305cf22a22c95759c71d4712af0dc2b8a605985bfceccf3ac638095ed5a9578a70aa796d3d1ad58131eab8eb66fb7b875af97f6167958e89d97447808528862a656572284c33480c6f3738010d06dd250088efbd1dce732ae81fe57f7eec91e5dc7e6dbf643313143e674bcb3c1a5db3e1a7c1f063ad89cb5dba7a43dad9dcb65521138e74373f5622a101ae142ef723d36c4d79f1a49155c394a70e7a726643fb8abbcc2762070b126268b39356b38efad7e2a6bd831a6a1a1a8efec26ea6f9e154049a476eeda6cb3023c5aa10f8d526e2e10c172a1acba591bb2356eb1c026df288afcf5342eab321491a2291974b9b32c7514007caa3cd5313de93840b0ecf032fd170ea93991340c4403ddf00b69deb2e2cc161497e4f2e00da33e53aec6238e355e359548d6e82e548487ee664840d71c1ef5fc70c0fff9f856850aeadaa9ac06a54ba656671de111217deb4cc50f68ba5604a50650f4b3378d00829838fc957ebcb2a2bc42c6e2d60d4c3d18fc511b4345a9d6eb28dd75d462e06f4accc2587f41072aab82a9cb14ad6dfb7d30599d33454c5dcfbc9f21502ce2ea05a459dc5bed2813131b8f5c77988dd72fc79218e1854a6084cb61bddfae63fa2ffa8b52fd145310d253648088459f15fd704c4cb7c4c7e97c31791eff10c27218c5ba25c0ce804c043d464bdd607eb16f2e71fd723ad2542bd790a797d0780ae5d610cbebe8e3d4c00ede13167b5dda3ced6d01a098f3973515c9fdcd1a2a717a5953a1dcdf02a05248afb52a20b931dc979bbc13ddd9ffcb5d1e72efb684a6cf5fd6543c7497b99cb4707f3ff0ce6b9b043119d3ab0a5524d797e40c3e756fde25b70efbd5897d58462938c54d8183611ef97594d6b7d8100c388943ebdd98a147e22ccd2a99e08449f3ab4cc440f52a043fd0a909ecdb939ae114d1a328bd23f230f7ea5e23deeeb9c4bdb92416b09f95d84faa68af474d62dfd1443cedc775964f2620f2ab8c069f8f111b3852a17e9e455e95b10efdeb9effaad8bbe2d0062d4ee9485bcc633f9cb8e2afd1a9dcae45d67c4cd5dc39a6f86a1d8a8f3420c3ddc2f7bba4e825f5a7f7ffeac5096280767ca3ed01ba771984235398aac64a4017751ca0aedf5bd582a636fff5fcafe76ff4c4091240bb1bffb2171eca474b47ef3f7ad87334f3c734810d81d66c04ee54cfef97265e6cee457b7987a631c20036dacd95f6451da9d81418bf4ea4dedef2afd7efcdfee6bfeecdf64379b1e39b6f83eb8d0c8e0bea0400ea560216609513530a59c0d29fdc595b3981653722d8d37940db0bb9774a999b66f6a3682d88e0c5e7287385a3f0ff6d3b6091e1c97be2011de621354974a2d9d7636587d0c5d3990e6f2e4caab1267e6eaa8a4195a53b565dec0d2a7542a64266e85cb1c6700b9cf02aa89284a3c97aecf7f8c8f963db0cd8ede12b4ee1e40cd71b2444315bc654a5d218cce8133a5622632ede0ff3b9bbf3a9b7a67d206fe6c7a5d8f219540455a32fcee5dd42a9915277ce9be5e3ed89df03d00a7f56f6161a9f3d0a1c841cd629ca9b640d99924be2e33dc8b30646fede2b35df13da7fdccd1f1e1d8e3e8218f87bf08719965f682ccfe0d91dba572f5ad720c4865b84d3eab53a1db0b7118af154a4c8c6569ca829b079fa5a627d3bb4dfdf81c0c3a350f8305020b47ecc0e5b2f8647a3901549b24f47fd5cc40ffcf5cb9a91e5584413a848b9612e1aaa836c353ce484e2a4387e7ce34224860b0025a4fcfeb4e3d9c584b30bb6c33174417f9f4ca20f7068f2cfe7df0c985818bb54556e0b36090f7013dc45f827ec6e73b50904821c994a27610c51b64020c75cacfa8da02f69e00adbaca3621a97dd796fd5c931cdff0517e5fb59add9fb8909a987c0ef52f4d470996dd85c3ca2e7d9765149b0e789426acc1a55f82e3abd32cec2f8e484d82f8f984b40ad2f16894693efc5b7c4d6f527562b17e692feb18062159f63fe94e79ea9b694906cc8e11adb3a65b6bf72bd6bb40a1375c0ca0916b745a2bfdf1c72b53cd4e3445f601f31b9f87115845c129941be550b65ebeabdeadbe164104a3a69b6aeaa419f54f1578f8fed84c79f2a45a7d6e32a8ab6ecb0d5dbceaa2af554f3f6149be659818c78d63f16dbaf3393acbf5deca42ad83d293727cb43c4b668ec396024ec4548f924bd16a306b8a695d20aab9bc5033cc32dbfb6a906bee5c59405efc1953c7ecad1cb147e0720a5614b2c26ca147bd704caa378b582ac57476c24f8ababe3a1cb169d39a50d9b1562327a22b9fdecc9841954b5c5c49a10fe1931009f2b5b55350510e33dce6a178814ca86732656ebc7cac4b2ab86459b3268470cde912c898f8a895dec3734a78a469ea8abd78f1d4b676dd7921fc294a1d054f598a241edd13e95ea9839776f85898b2e471a76a978a1765b0544a57e2a8d4473f995ca656a7a8367cf8131631973f46adf94f0066740637d5ca6b080ca3b4f6bc1ea3b2311dac6452bd555b7c9ac3e0292c9f70cac73826aeca9f1d513cc28824abe5d5e2fd63f46958dba25ee1d4c251d3d51db6653edc85a95191958e70454e33ab5bf94afe524768a937a70578bdea9bdac7cc7afb0d5bca13e47e643596d3409e3e03b7972a5379e4296f6438a10fd38b12439148d97f86f9359903c5d658e49ae9705187319194e46d8d32ac3db187939086ae8076773a6d0d24a3ff2577f457f9d5cd7baa8a5555af62fd49345d420dafd48062ac1024dded51173cc5e5d61dc24ae196d25f2034cd285fec6e6aa68a348a0a243dbeca9e3dd0f7c7ac82342a7c8784892023522136a56de70a724430e4ea77214948f0226cd75b110c16cc4fb1727237642a98ff6d024e69928b4d68d263109a020d76339d27333a08c274a1dae534c549757a401201d3443ee03536bd9960586a901cb445a4ceeb9e78806dc5ed2ad24045793ee652712562cade01743edb707df96ff78732551ccb30668b7eaee103fc8cc9bc2ae8e054a4f2ed53481e03727e3f641a609fc016c524604eec0ff810692e291942af70c2111786f69291ac85815f669a2ad5a793bdc280c0e396d9ad195c8db6e9fd186b47ff56662538d0a59c2cd4ab65fb7af24b0812e021a48283f8106c65fc1b9398bdba20e47fa821c07b94221cf9c63faf47a261aaf55af50e8e3978ad261750ed030c4b2332539a825bd7381a903a5d4dc6dbc0ee2729dc164568dce1ae1f3b89a10240b5131a0d2bd69e13f64462fe3a6fdfc17639ea840415a8064d78ee6c34e8490e85aba5e101f7e949b579483026f2a5c586ee5647c0aa0379f54398f2f4e602c3c51cb611e103713aa92c0aacfd955b2280dc1be96585485666f79918236c86854109e2ceac80eb86da3faf9dc1d085a66dffa75e7cf7b1e52af89b0e6a8730b6c1b948b56f25cc6ea6c74732440ed2085e5e31df38146810634bde6da1dfaa094b5a50bab7981f9ee7d0f4823dab2592a09f00de149ec79dcbe7a22fc56c1726e094cd4047e42db1231fa203273f2301512385bb376b65bb5c1857a2a81a96463e7d3c75f12441a0a21b569842ef630a3a54507ff632e16bb3054c34b4e761acdf742fab3b1399928e55de96e021b9510124c200a34fbff1450159c20c1fe3369a8609e2265c99bff444f0a4eb4241846bbacf1e8ded26261106f83ca64c9b50a3a573a660a562d93718b407e2cdda2586f316a2644469910144c8864ca4bf855b0330a8442939575f20db96c09cf3ba782ed2bee546d5098d72e0c3b8020a76a269d30e30416a046320bd5274e19084a6d3a2fbf085ce14d0668c9d44e98eb083481aa4b4dd442a3978d01f35b1e1ca68e9ee30a79ea6959ac953abb921c9608e71fc23c24c3489454ec47867246f8e2e37aa226211507f92d0d40b2ae74714ede18556b48495343aed328aebadf3d2e44a03c8077e5ccfc73913afe41cdb5518a467f178912d4be2f554cadfafee771fe23f669e522d1efecd1f551d220bb48eb1549f5dbd8e6228d5d9ef5cc85c4b5b5091ab111e4b64802f15a0f2f694aaf50b48a658f48404f80f9dedd48246e7cac8d8537dd979e81cad97bd4780c9cd6c3ec9017df4159029ab3f576ed83a57e902b77f7de3276dc1195df7ed1f976848d1e46eef19416b57654ac604080f152a20903a6788ea5ee49cf49cb255aad6809fca16edc561966f0023af5298a068dd5b4758d3118ac82e1b5d015d22a7185094db5c3b9eee6d538ac39976403eb600cb420055a7b7060749193fe222a0f20546daa0273ef00c0164b977102690256414a1ea7ab747150a518e1e05a1c7af569e2b63187acbf812b31113ac78c310fe890268fc1e5a1517aa849e0b5e05cc9a51b0b81088d89001d04e2d4af57dd718a81f575719ae0afe929286a8868fc2ee0ad3a240eaaf52bb9c841c6f509756923562c78f76816ea6b5c655e5b0efb9b7cacd5f0892ed8dcb76f2bff7b50003c3b39f3e3a579fc428679435673e7815efdf59735c0242243234236bf37c4a93aea8472fd7c5bd53252ad0f530ad57f265b3b84f39a591da6fe592db6742b1c942845c85dc7e6a858296a309acecb9dc0ef2164b6b8ca805a2e3e06e217341e9f2c327a627662548401ff895f85b6bded91d630e1f31fa3aa154f96d80af575bece692e33edeb6d912303792a450b4229408d33311de9369d0a53f730ed042ff0d315c1c5b23c0be266060947b3866a4d49e5d233f17dd0f158fbd0769f3603d6eb4c27fb7595ba40de27c4f72c435a67d8de56bb732df7cb2e845f9e396bec51c5f39b197f176fa9426e5bb60f624fdddfbc3cbabd8a283ab082c0eb4f168d8bc2920ea26ee279c3f6c32a18a9eeab19603c379590e3f3124c2350308919b8275fc8852e1a6a387b89f487c04496a69e4afdd0a83a5210c3e9d05c4c5dc6f200a5428acee36455c685f8e347ab4000fa093cf6509c542f33328a4b5d47320aff00a33ed210d55b0139d83c6252b4bb803f8aab83d8c3f157bd8c9c05cdbbcf18fe51f42ab116ac65c52c41011f827de0279563639713813ebed5b269cd09531797439489d0e7719df439327086b88f2d8482f175210df36472bcb23d2fd3bfb6667b9b17ab40847a852e0eef0836a2339a88341757ef3a816b57c891fb2db2e1bc6b258ce1ecf0db8cd71fcaf6c80b73543b0ea45cfed282992e2ee891966d6e8ddc0b69ab784fc80f81a049ff5100cfa617894959a208a380bf570b6fe88c6ee110455309bfda5708165719c10e16df67b2f428235ac88cd4c99529b0974e5f4610870d394edfd713658cec7905e7a0b254cb0e05d6af120028318ceaf6c1fe4cd31fbe60ce1b83e9efa2dc25055a906da73daa003045a1a01abce0d8bd1fd7e1d10094c2df9f316ec70bb460aa9492a58e61f821559276f0347f167e80ebaf73456caa0bc4eb3babe68f97b528c85ebfa135828b7d2803c7f45990c5f0228794aa0376cc6ca2e6e0aa5415fe77773dbe1d736567a1eeb6f1ea2313e8832535ec21b973635f9c85fd9f30256027761947f0d1d98d0ce9a4298bf6763dff263ce6b1ac69a853210847112832b7e25564414a9ddd70e0801d65f4baf855a6b3d4b10ed1f5812caf697c9586828d572e767fa2ceaa7ec64d519f8788a8856053db456f06dbc9265aea8b7fcc7ba564191cd3b0232d156213a687178655b66ea34d69e00e85e80797a7b00fed36a478e643c4f920bbfb259b626028b0c0a05436561f8cb29523b135659809864b48fc9852c1a8fae7af02b1445e65f51d2e18aa87d2015f27420bc8f03c271fc70fcc89fc8d69ae480b4501fdb0e2c34eddfc310f07387f2f35c80f10a296735bc6b70726ade9355cb0d7824ba0e225c8158102462ec466f6ee15aaf4f0826116e56fc8e58ac0d93f62a8209ebaf34427725cc85b7e5c5683a2c7d0541433a7b48f9e90c9e93aeb4717f4bd8079758a5e0f8f67f184c40c27af720640ba79769513fe7f189400d75d69243459e4082a32da3f9138bf22051c80d3535f8565f9c1afb64398dc0bcc72e3499576f6995e4aa8c4c27e6f5de94290f759315efab1f9c17dc60773de757f6899be699f931329ee04a36a776088af0b7ac3f2ed6900ab155bf8f428e786b672bf6bd202383936e8436f8aa0706a86ef32235dc23a7815348fef6079fd06534c9494372e2c818b4546fa4738897749edd3f8cd0178d337191b0346fac14401d47fe095048fbb1c48cb47620965eb57867a60f17d201501e32d6ea563bf080e33424af284d0fee82d546d104971c43865fd88cd3f3a0854181af7a2b390013d139453601a2df6f59926cd2ec03605ae4985c740ad1d16ae1fe741344f112e263d036bb6e2b6cf31c46dcb02ab3cc30b64f2da88e3e3a26c2c050dc3183f5d452cb81147453683ee119214d650389d13077eefa80b8d47612ba9d4183b072a60faf6cb6e0ed105d95de5f707857082e281d607e71002861196317527356c034b4f718d71130040864454f8c3af86fcec3a8bc0116f0341f3781a6158db02c62fc8df97631aba07ead233d06232321a4c8354803af67b60ce699615c2d5d5412d26024711e15129842f7f1113fbdd7df55ba1fa3a90e0d0d577b40aa1352d2c73397ad4fc6073b905254caa144cb89ec4f35c36d7f68526a206b8fe80871baa350b991e0480298a3bce9dcd4405402092770b644946cf941d48609f59d2ae9b141c462607682450df3dad0cc93f10760178c23003e254c4d204d9de88cd20d4862ad2327a6d6631c2507e286806aae6bd109976900b01edc97719c17aac207fa698776064a8940fec2b4d87701f2633831e714b2014c0a077abb4b2d225ffc46415779afbd7bcb68f8d6d88958190d4a7a0808a68a64e140f330c9740ed275cb1291a0d35444b7615a72f1168df1f93a6d9985fc50e1ab66f02d263f88ec3fb5d07e114db656c5a73412d9955629fb1072e34a24cc79741abfc043a70bddcf93b186b99cab3947efc7122115540bae86601ee4b7e8c3b4c16d6568ba349aacccb173b312084ed593cbc46d84e9eabc6ef265dccc94bacdee42518e79556e5ced649727ac21f2e8941fc5494fe5089fe431f6448856094581fe2b8707802123a254aebb5a98467705c1f0f934dc9d5ca8dd1045bb78470925f340da7a83bc39e43dc95d54c7ab14e244f8766902818f1ea346549fc548700d035da23ddc5569fae8957c8eb3d272c907c493c8a1768cf6cf87f525050986eadb6842671c6702bdee12b610387c706b01eda3978928a94d333c4d92073fabeddad9b8dec480b8ed06e26bb157a4d0e887076145b64d866378b8a2e205004885ed2840204297700d516fcd8c4530af887834233cc438fac533434dbc6ca954dc9670345ee2ae8243bdb9ffdc99f2efe1889da5cdf140a6a302a6590a90568f85749de91755158867819af5d1b9d8d656f1c5447f526eef9b684c69a17b2dd86c14bc992011d6a505fb4963e2e4b2097377fc6cb490d5ac0a6befd07087c956ce1437fbdf034b48ae2cb453ac5b0390745a8e60d19810fb95f9edd4ef679736ab7cb7d52df93fb69fb63ddbf9475687b3a3aa0502b279d61205514b10e8e3c22067ca4f53a9a52912281d5b42ed50ee745cac33beafd6cad30b1c55bd755b0f6dc4e2869019f0c5ffa5bfd8309d807a0d7c50dd043717cce9bd53ab23780d90ce96b042cb7f667d0d2149a79e7dab478989246a87a5859abd5d909c36f43e3a641936ce6765abdc4822280330eaf382cd6cbce6af39865bd36e8a1760d51e1fc727d98acb861e161ea6934407f561dfd06a4d8d2b151d3ed9231efa004518715cb92976d2a92a0b7629275ddb2adf99864d15631fad7e034ca8985fa1a6c1abac4be1f0d4c979c58aa99d1616e22d1ff401a9229724e3fc115230356373ebd2c0bc3b3fc352ceb3e8d187b37d650f4e9659d8a876ed8efe52e4f45d78778cbc32044b0be8b77ca107abdb712cc83d03dddbb4e906230e497d52a34ba675e4bead00dfff213eecafb95fe4be48d78f89900ca84b4ceebfb0480d4c19b1d98334d68cc56d8f0c08c0db5c3dea33de9c73107cdd8e0522a3781856eef151186a4ac4ac76bcc16c51e6c20d0298106d97bb3bc957f20524e6ba317e7bc10e9f1877c33d2ff75caf4c3538b008358f7ebfa1f5ca7ba176958ddd92dd7223957a561063448885f2cf25401b8ab8df33d12df0ba55d988ae8be7b5956a839b938586c0335ee66cee64281ee04dda92c260ca6770a31efff1aa842009d6469068b73053225f3da13deb3ced653635fbb26cb077c32611cf320040879f50e02b4e40140f68563a8dddea80bd17f51e3dfc11d56f5b152f457548f1b833b78758b231a09115316cee0efe4edba11482be86b8886d9bda6f079827c6941817a761c801974d5d0dfae50cc8a6a538c9363c624f1426edaf8428fdea0b056b510d358a83d9fbde6ac0bccf84d8bbbe74a4d10def9d3050237a42ad62775a0decc28ed3f57c90b446bc4a8e4bb88d096ec271080484b762516a59178c8908ceb3c5664f166be0e073c3cadc2dfa38521828523ad8915d8416c4a4bbce794844755531faf5cadf449b636085f0f5917bd616bd36b52d38a869691e280035356b909957aa1589b1bc86fa937244bd46d14ad9e92b788c46fa38f954e813d79500ecdb4fee947194367a482f338402e4b3faaae0d6f803c240e08473def478a2cd16029ae0cebc2e5e4e2819aef178f9dd601c8351bcdfcc0d2d077480c8df13d20fbc6ae202805a7e106204c45044bbe481c7f28faded83630e432b5821e83c644583f195ed8f1edab4a1f1a0e183ccd7e832c5e6793dba84e6d0b98410bfc1169079eecf04c7a58a9b9f26929e990b7fbbb46bcd39d90e61853cdd01c9799d2caec85595f5959afcedf140e46da5042a2fb5f2b7946bb51cd5292f95ed13027efaccd753092c5896ee3deaa85b3546b6346dae5d702f286c3888c8369266460638824db4dbb7f62ccf8fad5b1d1d37afd114fa815458f77f68d1b2d8a84df5642655c6860e883992c18f77b22aa1f56e7fdc4e7d4b2195273f825a3cfb8a0c06219015a6eec26983b8bc17ec0a9294f4cd7a79aa16d59464960f4a57bcf2a2cc8cebc9b11be172bf78d8de2e6f7fdc5c059984c8813c103b11b8a12e60a6df07d5d0955f0fd0c0aca270ee3472926f566f07ea4023f1a76a15828f2f7154b7030102ef35d10770ef5f35a523361129e0ee7a225f70b7fef601dbbc72829b48bf0a40f564c02f07c1efc1baeda74b95c0a6f1176a8e5a7e21d61a7ff9bc23b360ab72ec7c70c9864570050f30193de52c63078a351b603181f8efb75648be3cec4f85dadf200b33743b4c5429fb1ab51169bdd521cb762e63c2a30f7aaa77ab7bc15eb3579d0efbb8493e68c954efa966807a4914e6b3f698b0031f07371f47dc21c857633152957846232a5f2bfd9d6c44b441b74d92c310c19469253800c362444093d06b3e5e00b193d806b6cee20903da379eebe446e19de7f846d79b089a893039f084b49f6504d393a091978e12e37a12637c97ecbd992d2d7899345b91f4ac413cde22e51d539a1323546bea32f9755ff9b7581a4ccab34bb649e0446cdfd178abc0803887eefe3ffa71697604c2a9426bf61a94f663bf4bef5883b8bc14dc6eda673de51ac04acdb29d5a5535f9d74a6d2bf86d79f3d1f78feffb9045494126a9717245e2a527ea598ddc217e42f439f9527fa2342384584a4f818c53f4365a2ccfa6c6b32e78d994cae8598fd4e06e917c94c87fe54813b17028eec8341d9e734a2c6b8f378ae1418a8b6e82f841ea6d89b8c5f5b31ba9f7f9c32c74ea845e6279db3cd4b56a7b8eac54de2ae20c2ffcb63c1e75413946490357973d6eb985d1cdd8683c8b230d7d98d99c30eff4d45537b2cb896e9709a94059c1ffc1dfd5d4bb704aa0cfd1c830ad1f196823943f627b5e365f65d6a5de073e50dda934cdfb184ad1c656f35142d320cc7d089550149acc944f0453e4a9bb0e840036d6516288c1461fcbcecde789af83540bf9e7ebf8a20cc51879e9c41b8c59b275b7cde0aaf83974888d6be12063fff5de9ead265adc1d61979a01d076465ad1861b4768144d007ff4d1230b62dac34cc95b538d7c4e2635ad88dce6f4f9dcd02abaaaaf5db453922b2b034d14ac4ed3150f964989d78355826ceef4c39da3b62374f7030ad889c040649df169303adb748dd7c4c418f2a4fbd0e9ddc63fa61799ab86bae0d3dc9fbb2c8983ec31e48bfdd1aa3bb0ccb72899dca2be1c203d25f187590bfa55d58d1168690e7794257096105e7da7e1a8c716199b534807ce001f08f1a5066644965e4959d5f8653c34ee2355f471b828397538b066f0077512bd8faff085d58ab43a14ecaa5c3aefc05d5daac6504e248febbb6cb27832e33dd575fa237478fb44e73fd64f11b3973f15659ad7477a714a4350df49654b3d05f4f9cdbee8af3d55684449798bb97a27b98ff1a1045b89331691de45ae4cbf57bbc07a1752df6d1d4b8daa56dc0384d0a4fa697c2c60fafe44f2c518fd83fac81ddaf2cf8412fecb5bebdb28b6b34085fd42c3aee265f2b4d04bb53a665342914d9081308f00870224142a9c42ecefc873de184243d59dddbdd31f3c5c98dd1a69840c938b6b080ca175f76c63a82b0ae3ca0ca95d4f9456d8d03af776ed5f719bb140a6e761839265711a99d5db64247e8bded60dd2bf3c1f86c1e11a7ed7b0617b1a284afe471973aa0a93102f322c80c82294b174457d2dd28a2fb30b2006ba7355a59b57f3812c2a0c0a6faac7685336181dca29e3b4f71baacb0efc385d101770114511d9f1e731096d65df32756521e9bf7444cc45b160380232846b2ebd7f520fcf7503bc328a4ee165ddcaadb6acb06676621045f0c63eca8d36f3fa0969d324c5c1e1de0b943abf6c9b8aa2213c96e8d4806f17013efff67411d43e1a71179634362ce381320dc17f79fff5750e47d51670efe44339f8004be7a969c2fea2e3c5433d44c9e0a967e4bbad32b852ef20e5b4e6411afed6f5d06369beb935c3bf896c5bd2b0fe479306ee8f693541b6037f230e202078e192fd4a483b03cda8705ec96f56fbf3dfffce36c6a3f8f49d700c4703ab64a069ed610bffd28441c4239620b33e284cf15e6810c09db65c82b5ae26efcff9f332c7b76004e79566fc7b791f20d115d2928dd6c9fbd063bf9fb7b37ab43eb5aba45f6d0685b240a580e8d376f06c381e94c4f84d2a34792dbd1c399c6f8188975ece66c435b090e36837534399c1514b47aa2985b35d554df681267fc18bf3613dfbb99bea0e5586a46f526ba90116ba94000864718859257600e3dee827c9d30fc4446051cef8eaad1371502803c71209741768884193bda7eb9fba46af2ef08c1fc3c997aa8afd7a0ff98089d3ff00b68082d42938f0356bf0877ac91e64f9398b6a56a3e00a6ff07990adb9b784db4ebc90e1541adeb3d563be612e362248fb87e1e1d84949b0b7faa1588dc22d1ea911bc04e1dcc9f99e6ab83086e6badad288d9b97506bfdff4fe48619937f76873694145ca65af2964d38c14c8f3a777db482e4ff703a10a2edac4f74cee042debb1d1c00af464cf18b59e95d4ad26058e8a4cfbfbc5575fde13156b8e56c4d702251c096a95c50bb3dd01bcdea4d18a65a7b003cde36a213c649f9b37037dc08b07d65da1cd5486974867cc5b3a3a668d9a34eeab7f8bb74df75e53c8216414d1bcea2f3ff0c2b16bc0c219e9e146caf6aa06baf33169e1610b7d4e351cfa7bc5af6df1944efcbaaf624926e53b66601dfea26d00b0d15a0a8ef3f24ec63fb4c8bd369070d718d82d0cda09194afa3947b434388c48ba5543f50f3fb270ab83fe7b4d8048db736cb5d0732a0cca13f2360f3933f28441a4796cd8dd6b0eea03e77adb501242fa25e07cdef854b0e7d5651b830b74b1a75e8155794c31bc5d290c19dd44b18d671eb290b387e257c7315f4d8b46a3c0a87339502ab1819dda9aa9132d45ef00e78f0e957e59a7573f898fb94a36f8903556e88cd460a7c5674f2ea434ddc1d3fc519dbb67241e7439c592dda99a11694e1a7f19b8871ef6608c148bb54a878a23928f36fcf910ea0a4cee08349a046737db72591198547fbec06057c175b59c6b76b99c472a2ed52afa6431908fe6c81e51b97830e6e247123605338ec937025c08ff6c313d81037b21e82dbb3156703edc4f2491757db34b47a97c0f5fa78035efc6680bed550715751ca35815b17bc12c50a2fb5c7eb300de453a38eddd50d30ae1da77d1191923525b8ca28a3a2714139a4765f285c831f447460b2b6d3c38aee3567adc0003334ea1fb1ecc80f5f71266319d4bf612e71f4daba8c47edce5c88a33b6a77bc30677a50ba48ade925445dcd09a32b14e5789fe967fc614d8c9d5c7aa84b0090a64c45b553476f45ad37183bf94a395115b010567572975d56ace270007a218351fdd7b85762e6be87523596bebeeb65c7be1293c973c27824e751323c6ab2b382d8a7c54a72ab4ab090482ea133287cb76069014903efcbd55ac220288b6f8b1a08c6a99b329b3bb4edd791a98d3b0e63681fad14132f089fe34ec668044e0803cf06535c044e42f48c8b9b7ba3070f89de8310df3131a98bf9fed457279cd81e4f3852d3838c203e438ae60bba15d5a7e57da7dc42c3afd0e45296cd4b9ad3e110f47957f4e7e1703b8ed00c4350f1ea1094a83fcef3e43e3f4e3b49067d66b0bebc4721d7a61d6e1a0888629110abab2d15810c346dbe4f9a32ddb55791bac674d6572c473554dc8689957d4cd7cbe4f54016560d73415f30bd86cf19e23fe99d1d990c568f99ce25d5f00a33d10e6166afa5520afeea8098b34c86ca9d7b0bad45fb09e606ecf1041940abcba3a50e5c519ab6c9c93ad8759c9113c951c4671d09085a0f04f1dea5770cfefb8bb54c4822a86dd95d10ae02924ac5d2d92dc5a7d2c6b10b5943c71d61a0bb5ec05de2466afa15c02e7740da8c5295713a923608eae3d63202fe4303d3f1a5354efe720673b1a9846f3fbfd4cbd1d2664c4703b57e483f1252547d7a1638501e19a6f233a51e6c4c01dad3825f7d46357d9c3a7b2af04a8ba25c29c57f24fe0426aab8c7062ef2afc1da91111561f3c28840c87494d1441088d8f2b82014837f1bc57b8681f0d69dff76ca2f3a03a63c8472d6fc312c4a96f2d6680913bad1fd834a30bd7205c9e88f87dffe95ac3fdefb2a34d8ef72895f78004f123b595bcc6a482337b2da51d015cd0d9265d27291866cc360b8a213eac4a71f95868f131ead3be6cc45235509485a9f64f8d20323170c7553b6b0f129927267bd719fe265ca93dee3367bb644d9d1dea2c1c4acbe0d62bbb94b4cc2d2d435dba61a2a6465b0855424bc7d4a86da0abcdeadc8094e45d3e9a3767decb53701d085c9393fd20365a242a32ebfea0c01c28595a9abbaa65e3493233ffd599bc15937bffa9c0d2511e9e94b1b912162d02855fd8af9e5356bb80a0ad39a896aa232e99e9126c2f024913d5bb1cd3d363afce34a18396d51586ab9cb2f780578f445ba6f23b40bc1293704c58baed4918660e582599f0dfa1fa61bdd51fc68f4c91fe6f500104781f60cb8eca54265e6428a17aae212690b4e16d44340358a2db15e60dab3950b6b9b76ecaea2226a651d683035269656326c2287b4de5757e6608a2ecc381b6efbee5d65de8ec50526b70f7d82333d13fce525133f03d1d43f830aae047b7952257fed9004f54b8187abebbb544a65671b40c374dafab463c6481a26c11b4269072f3283a8aa6b59062e5127d84a230f3092ca632859eb952917a72951c97e52fb22aad8ba1521ae4f0c1272b1d24c7b44a29ee574d242ff97d869d1e19fe112022614f114be6087c020edf545b2f4dcbfe42fc6de34686b26337ff6971a23d57bc9680a76821f1969229e170122778eb401a2195cf976a15fe4c07319b0afeedaeffd7ed93e70914cc5d321f22fcc0e2c48497b78400dcd398671f34f20cb75b4290e642a0e6820b00a97cda989dd657ce5aab55ada13926e63dc59c0539d8c92e6c43561196113421aa1a5250b303e0f62789be75ef4562cf0c1be326f7f9f27fc7ce6065683ea3d4c7dc88424d83925f6bb4f73bb1ea84f532889e739b4ba67384983feb3405056535f9c59ae4d72db53db8a0ee01ec2cac203560d8712d533e09be917dccafecb2ab568e7b0c919fea1a91ad73b79dafc8c7885c704aaa1e38b7d7617b86bdbc027af569f846e1ec69f567c3a24b921110078265e18da3375b6501b6616186064baf3da052c65eaabd54b3f7766abf3a96463589d3539c0b7abb85cbe7df47069e3329ae202604ddab8081864bc3d30c3b80620f4a79bfaf80aa5d5631368e70121a5063164d7287aa7c3b41e2fdf60fce88eb457fa21fdd8774d641b6451b253e9dad8c4cd374579f52f0222a2b108fc8a92fe3f65b7fe0668fe38b61091947684f136dacaa560ee17b9d84e1519ec4f6cafc19a0770e574438b2758bdeaad5b15ca2d45da420b1c9faaf92b81124e911ccf4793f1a1aeceeaa120bebf70833f50b39cdaf8250c1ceea15fcf4ac31ff38431bfb16fe4ea0b032251cc93c9ffadc25e74c234be8accebabc8913d69a650334723e8ff84a27ad643d678256ff743bdafc6e1968632654b2709514266d1f8ae5738c5b80fcc9ff2760c5e564b212020afc86c21681bf2bc76e773a56b4690ec579c48968e2b6c1237604c02e108022a0b969bf8b322bfa7490b22f683c3e2b12dedfa97758b5592c19ed5118ae954b75531c9ed9490811a967bb3c73098bd9e7245e0c1a8c229827ac5ccec06a73db538312ebb040d0ad6c7cfd17eb3d684b4f6bf1ef46ea160ad029d9e3791b000b003910b8607e8d0cda91072a4e0a430117e2c9bf590d2915f9844d76cd58010decb5ac692ff75dc31e860ce179c1eb667113d7bd835caa63fb631819cdffaf125767cf0d350a5c211d82cc49f54ea268ec1de773f1d533760da191c28aa8a16cb9861d02f8c90baef8e016f1ae30071b5972da8d1b452079b9dc1ed2da6410e30c21dbe0f4e8fc0449e4fd56486dff6d3f9f6a89bff2a4e1a22a9a4e0174df3df3f6e52f8d774a042b98f9f5816fdac0ef6b2e3944cb9e77681582a95bb42086387b001c9c862c2dbab6d08c8b9be63483efaa498f8f9b0be161949c2f1e1a7b13d328c673368a9cf68c49b7698fd26ab5a8292c2582aaf123190d66b1502aac8f9ef3c0809d8730c69fa656b88f001492e53cf7b81744c1b8e63a49cea50123b44371d435e508e8bd80bafc42d1813525a460fcd866e98db6a0ebccc5b285d245edf06a72307c16d320e7bfdbdc2ed44416b9dc49f89cd86fa8a7f72d65e006c1d28b0b77db7642de1dfa1b530ad3cbef62b385cbc1c88e1a3ba71425120dec7d8f2ec2c4930dbb92253e1b9ab0d760f70a313695eb3dabb9d4718d398a37e568d5ed6a3b95a3f0b7f4a66b55c0dc286b3f64776785c859c5c55b1537a8751d371999c895eff104e212dea745d4d7094153c5f09aaa3c235fe9ee49f36f37f2e276fa9516b16b12b23e7155ba057661137144c128c67dd86c8963ba090201fc81661be477cbf3d0892179b3012150ab27c72291ad87dd0601ebb59b934385d29634e07f582ca0fcdad424d0ca091837f22caa2454a84d0e0dcb31192a1405106221cc4704ae197357db9172add3e010cf4dec0df047555a7d6d0901b4f26c9d7dc2d1f7041730bf2ed5a2783279c0b99b6a14ac774fd77a6d2a987c3869bb8ad1fedb24b632ef85d611438a24cea1327106ed851fcbce29481e8210796bb48016afffc43ba00c004ba6b60a3935e6ae5bebfe32180702d1dd633de637fcdad74680e9b6ff3e247c8176155df7ed1e69fd5d8c21925783dec7e3f984281321d8511bff344cca0a3b039a367fb5b0d98946d82d50ea248fa5894807034229ca31aa5ded468c3b273c8d21f4f615c7280096c9c09350f1cec072de3d711ad72c1f8d3e3ffd75ad038b69e2febf86991f6011cf31c827393eb04ef38e3a3e119da0e0c75f7478d07029f339fdb478e280a1859c1ca2cd690a6db35226d63e4718d37fe4219f96c31e32c60b966f51b597737bc555eddf6bf0dac567b533fa1bcbd5aa14d2d276fa7afd0054c047e163766437418b1db874332be201508e89404499fd6b25f3a4a7e9a538641f4c94e998f2a9d96fce744913aa951956eaaafd5920012ac1f800db1246cc5b2f9c83e3dec87844d805f0e2a70f005266357a17435381e88d1e12a620b04a4009a96763e9655aa9e155ceda9b66bb231fbee17a4a64034934caab239cef3a7993aa8d24529ccb9f56c60c3289330e6409109f7fb15ad0c310c851ab8bd156b4ad88bbceaf320df96d94274821ff39e51127a276e856f7fe5a6de92413942f50d99b5ee8cb45c88d52dbb3d428f123b186a74986306e255578609ec739f033efcc962e9894f7484316fa286df560c623d1969a57108e067c8ea1faf48a01981cb07965a46f33a48fc85538cb7150196222737f80bdecadb6c156701ba06456c1ff3347236fdc2cc8f23f1f640e807f010e442c30af01cd45497f206e0837510e5f30b12432843bbb350727e405ebd30f565f7202a4722870a5ac34d02d952176179682783231c093cdf277575a4444632807d5256d36091651c528fae7b07b670c7503cfaffdd4bef14d02410d57112c3cf608e73adccd8f62468110b335ed3ef8fc825fadcaca8e914d4e41b574452d1474ea36c8919012d52d65f3bf074000f830ac3e5b1b62c4c63faf2a2068682d4ff242e100ce1b26379ae1622d806c314091b8f4d5550d2e4665905e841bcec4131a0041857c5a319944b49f5683e08bd4cf6958068de99b6d7d64e2fcb43a11a2d2dafa4daf4db1b84a18fbec67c745b672a046d071f20520a27f80400dd7cbef73d78c871444cb2b28545bb7bfba9c302d1b3532deb0eebeaf670828ced338961255dc126289ed2d5b971c5d5bba1a1965e4a0ab8c702848b72447a4cc4fbcaa3a72f81d0b4bf26e80d558abbc04c5dc9fd1c7afe5674daf8725ec7ca798c4b8eb1ba1daeba4eab327f0aaf1427a9842d93b1b97aef12a9e7c1d4b02c5b43254a296c095b3eccb72c13ce3a63e25908296dc0f218cc2496003c7d3c8464459964c86ac5a07d7a3211a3cf78677dd0fe9f2d1640bbd15b921715bef20495f70ec9c923113b44d371c71c5fb10daea8c43b3569de896df111a79311372df3766924338203a1b296c85a20f12487cba596298f42c5aa966251161ea9752aa726663023751b01688e19fe9890ec615498e5ad8c8ec52936ec5127ceea00ad14be37992dd259bd2ad497e1015a9d8cbaddb97280e5198b7446a1a4ec41ce218d069ad46ad3a4ed82659ebb0cfc903afd3ef0a44e07ad1c5e37d1d1d9e020f2617510ad91fdf9e233c1601c68b25ceb1c205835d63a7ae2b855350f6304b95c5b5797182d9a9bb5b9f7a3d5bbcce0a183f2e15e783051b91f2bf5a2dbd0ab53f6df86d2988586c33deef07d4249d3c06a38c7f8af02e1317c933f1c1ec319293c22f14e497fb4e53361709213f9cbd6bba65254c934822a713c7ca34f34d2bc03a500546e42b28f6209d7800bd4d6f943e1da184a3a1c78c203f3be02bc4f48b49fa04b52846d66f009d6e60793340a4163c13a151f7525843ac4288bc4e8863296f5c667325cbceedeeac4ffb80d030f49ba7c5d4549edb78ac614e45e2129171b0e8f38f4d1cf4d3b57b53edc587bd40a42738f64f559bd158116604fc01428a7f054bcba1cafa12a0e79d648785f168d051787e32fbf22513db92ae15be65bd10cde664bb375307e6edeba12795acbd752da68f758065a7cb938511c47e9d7e028cc3a3f55c820abc95e12950e97eba8b41a3416e6437d0c7c35cd60f52712e788842f4866159596f81b10f89cba085bb7d006bcb71e23306753c0e47fa01f1e561e00a5bd14f82e2b2baf3403df749b8531f61470f4f432825d96c3598670db12828a2d5db695c63a47f420a04a07690ff8a9257687320b6b13ded6b07196a375f7d835b856ac26a7ad3dc71504767db882528838677c07615da721ee9ab45e953f698bf2c52c1d2c479948f9b1591048738d563f6d1593d314a62c36db348eba39007ae91b39ded8c84bd168a2a5d15f7857e9c734fb76dd52e07a8cfd59317bcb2af0c52bf2818a6561d189a04afe1e145ffdc06c6299d89b56cfbec614372d494ef8ab095205c09a7460f17c48495242d18afaa5b0d06e14033fb78594c051378a7d12ec02ca260cbc60cc2b05e4e514c9e8f52f8aef6bf452015ba48eaede0b466b58a0b939105ff58fc325a33a07ee7d0706fdd022b6156c0d58447755632610f33b3319209b65427118fb2b29f96967fce2abe4d0a086a5caf1d113cf4139f74abeec457764413280c66f4e9c60753f6e75ff6c9b15c5023753e73360ff4c3a59898b2109be4e88005089e814a603b0df99cfa47488425592ca5657170834d98cadb8c262e48129aac8fbb4c062564da8f1f34cb86477d756c2ece19c2309e96540b9252f7ec95e6821138d2858816dbf4f922764ff8827dbb9e5d6080b83ab0a09e282557e6db43b0ee9d4b8258dff8e205e720dcf42e848ba4f007b474429ff118aff83d66705287522675ae42e3f1419c47904e168ea4394e906015d582c86ce854f326e4bc0eae4003c5f7f5e54a7fbcbb3a06e080f5a310cd75ccca16eb1512e7335722e217a4b106a986ef60323a757e75c816b4f31ab1a4e2af356b719c0be72c930c9cea52a409b018eedca933f3d85888e71860e0416e910580e72d18e39a26531c4ee03c864b19df1da41f88a6bcb45ca6d82ca3c393a0edc7de9d0000d7ba82f6b6bcea2d930d89eb574bb5a49211597ed75dd297ae5b9dd60df90365b3ac95a21d50631367b603f3d43e661ce70e6b179afec0d9db337e10b5b9dfd2892b1230750f86a651a7113aed7d5ac02e1fe459345c2cc74d4bfafef3322564fe51133862b573f8ac91162ed8806bd79f9eb9557d8db5f41195f522f5ad119b08a809db818506c152eedcb8e0b0867016a9d407f8e44ed80fcb34303ec674743e1672706d567c78694cff382f7105f0b426f8d0954f5a19eaa8fb58c6188eb082ba57f7ca14e089c02a1c8564e40e7d17a0e0de61cbccee634cb87209879e60c69149a981e8aff1d6a133d240592cb34e520b78118a419a21da26c45db52729848457b094dff8c0fc469761fdf6cc1e9033afb6b45600622a098d727bc9f8b049d2bfac2baa5de7e9e1feb25f4dd434c6938b7b10b13fa4e9ddb42ba973ca142e0b0ae9f1799740f376b042764e96856106bbd02c88cf89af086e175dacc3a49cec6c95b1e53d94f2f6314b26dba2ab6baabf6d682086da7ab69001cc7f82f2dcf169e3e8e2b90c28b40f44cdd7b9e9af68d7b4cfdaa08950b51795cd969434eb24a6ba33fa3696da01631214aacf2edc8587174a9d424fac8d012965a16a954f31ada5161449c153a8f127c4ae59fb2b94ead26fef6a66a9122b22f1c863e6296667e34d33c4ef1022ce34e054ca9cd00a423d95911afe57b01848a1287eecdb0766b32e695ef765940ad7ed6358bf7a279beae4e0dd155ad9a31009219dcc56001f677686ca934f518d04a2b7735f69ea13d22eeab33789b17ce940476bb047afacd8e9ca31ad30c4ded917912860cca9eaa8442632fa29e3c7248135d43efa62b3602e0b8be6478e01c9a64536dc19acaaa1b4a19bfd0c3875e2cecd4dcc5b7c7c60e71e11b34c2582ac7f51387d02ebe27751819a2156f48925dd4bd7fc5d7446812cf849a3d6c72df7fd6c3457f4d95ae456d4915b9ed9c787a280df9b1a5aa7d8d72a7665e2ec6d3262dc40976ff9adca0c01c33ee03be17377e8027491f54e4f1a76d1be54771056443e40b2829818267d1189f854375ea4ace01645bbf656a454589bab0c009f7f3e4c6a6f0d30d4e3c32b1eda056564822419fe4613a946840e70c4b323fea4f1a023fccf925207810acf6dddb538e15c7cdf66490b0440c198494fcd2c31aa23f8a889c0190c0b3f233369d720d24a13564803e6778cf010549bbe64c55af8af681e6ad7ebebea7506dd418bc0f5181abeebf08cce0b707d129919993f0d11d26b0a1eebec7edafc4169f9260941c995fb5e4f5c38bc5d48590d5b49507708c34f02f554189647655bc49f53adb3617dc355526a35bf1da04f1a457e8da2e5310d98c20cde6fa03b880a263630f2d3ce5dc57dccc2ab0108815f0b6cae2f4fcad3b062ed18bff3cf0172764e6c784fb707f7e4107f77b40af63cd1eb875ed255bc9e46f2cee1b6c64f33809b1efaa4d7e63b22f01d078a3c2f7f120de7e1564c22962cb0b697392c7bf0e06fc5bbfbaa4bc4d7e693b9a2d34955e9306c1167dcf9aa665338e88103d8385462fb0a6fb4605813a4bac8c09f1a8e0ae02df114a7eeed067c91b98a39dde01e455bee3e555b3a806df3688a79c41c18ee5af6baa0b618413e39049bb187df22e325af4e63a90152c01cb230dfec0a1708ca06a50cdeadbb5975a8a6ad910823d19e8a0f7bfb575a82ebb902b72a6532c4a50c5a2e0029e8cb8874c3601f7dd56d1bf8f3ef10cca1934ea511c962da3d34dfc6694a1aea41d8fad33ec0ebf79c6d63ca422b99d19c0354218fb8395ef27e9e0e140804ffb2ea063440cc4b4b8a85b676118f8f43d938c596b900d850175b16ef88128baa42f73819a42cb9d8e83fe949874a877c42dba057b3a25e7ab8cde89304e406c5048de87422f035cf826398c823cb18ddcaf9dfb85dca5d6396dec66c6408782b779f0a64dc02cc550d5d5d9d026978a9b716c95337486c7f4dea2cc7182841a2dee157026192a00386082eef03abd90c0825c7a7932a9286e8e1678d1b063390a0adfc2dbf4e8f3b4d70d5aadedb63a9a613ee770e66bc4f67f13a934354d2708fc3b8798eee3c4373911c03b285b20512c31f3d419ef7172fba6bd7c768dd8383edd7d3b3dc43e8ccc1bae058306d745eefa2bf69cc2176137af14b5b4d5f061f2c2f62852e8e93769995895165636f2f722ba1f71fe502dab212c8edde39420250c9bdbb5443c3158965e7ebe3cf7580160c00439d9a830a2e1d67f39a6a42b7854d8e84d5dcdc4d279c5929f6ee7544a13ab33ffe6c2ac0d0cd352f2fa86e4037b992d3d58f07692c3c10b4c29035221f07bd7ca6572c05dee1236c781289d2938a912b43f6f6d5be3bec92f6d6a1bcab87ad3565d5fc7e680edc6a82b5cfae1b99b3fe6575bac9f25e8e7866e77cf01d69c4bd77f5c2fd7216165f7653f98c724e414ae426751a98bb48625631835a8301f979661921b69748e8cae68a428150abd40b056003863d094423e15024b899e1928653c7a5546372b5206114affeda26fa77ae2c1e15adcb0c71339ae4687aef44df6451f67a1a0de3c88880ef24888a9c800848c4f8b25130fbab756472cbf479bb65190c5cc25243f0e301a2c860d3edbdd94f0c08ae10e00a8120baaefda936092622e06252112b8c69e953cfd55671ab4b64c2bb2a9de49e391aabf0f39607efa908ccf46ee812794948f1e4412d83a5b73218ab82d21c75a9e1f2c4347ace7e6a1fa0ca8ecea6c8858d5a8f73e3bc2ed93127189f2b791c41d0ddcd6574102d4077bd5030804bf7cd9ae5e4fc8943f980c3f3567d14ed7ca1b64c1282bc378f21610a4644ecefae6014e0680b2fc030c37489e3282ea92e38d678c229d00dc1fb604b0b1e7d66e37b7d120efec03298bd636611b6a537a902a7ede8a476689c886d619eda3d2975b934cb73442791251fa608d688eb7f72d4b38fc2d9129411a20f519c8ff9a31b39b20e42892f2ac7e9c560213745a1d1e430da85490df21661e6a4ecbeda3c8aee19068c4d40b56d5180465cdb6a09372d24ac927d5d5d8e54301c650035e4a1b967e114b63e87d51b107049eb8e39dd53ece45df43b2de07e66a676786fbe61c2038d2fbfd29e3ff7532898200ac2eaec1279e2e5b570aa9fafed8cf1f8884fa1752e06bd90f016c2cfaa0c59f4471e9786758a0192492004e279630c71e747913e1eb1f8878e014fc2bb372b31bb4d57eb2548bd49077a98eeb386eb731d130bd93fc4bc5987369b2ea977c821bcf4a3a842d62c634fac5b972903140f738304504db08c3ae63a3b5f896c125c6e2184f4c6beaf32dd6378370d86950d40fc7dd7ce70c9dac8f020b207299ea000ce96a140be61c30c222b330a08307aee9a8b52be06964b0e8bba7db255b02073809530b3ce794ca81bb5a12f06bcf0a86d703a0f31576982164c6195e3ef7d3877c849d0200c0144167471a961fcd026a0d2f452d658652b278ed075c9328d323580ba8450786f5de46e61553bbf2744639805c0a12956242d6cc6e8193aebbae909c606ce56ae95113d0bad62f91a4d8a3b153a97df6ad45c3651c8c0014cf7680e9e3e32776fe7691ae5cc5891391f087d96f461405b1a00c29ed35d4b4f4f69ab860005dcc30da6a232aebd49650bdfc30a0819daf4f29eaa628183a75531c9ef2d5d04ca40cf523fad41adae707b0cf2d31e1c9dfd5cec2032d13dbabd825847c0ed523f2159a30761bf0a6e6aff37f9e92679e81ef2ed92bc2e98e0acf8bcf854989f2eefdeacde24c3cb7aad51898dd128c5390fbfd18d3e9dc8ba045cfed9a4760334aa7189be034a5f68c8a44676299ab651afb16b82c5722f7dba422779f5ab136451985013426cac99b97c706417b9aa12541a6081ff82da21835fe5b3e36f2c3bcf950140705e4b45b4e27dd7b400d9407d8ea85229cdca8f5a3d62817ff7845c3e2567f1433f775af25fdb61b13ee59cf7a4f91cdab714789f2269357f4a6e05698c40633168fed1e67e04566dce7a8b542652b23844894072c694a8ec8714bdd1c7fcbf87c557cc82bbab75ba539677688c8931e8c3d9b6b28c623fe80f4b2736168fd1c7837e8b188eb190cad146e1a9f31ece216865251a7ee3c5103596ae60062f3263ef2960f83544df2541e1b240a7ce37ef79feabcbbac5b2ef9928a96f5c8728edf091b2916842025956580118f9433234ed8e47c9d7f06f88f577c23a4b57d05bf4d6619d12ecd1ee50842fa3001722c4fd7014620963d33ed2afce9c0037ea6ae2285326a41d36d576d0da686dfedb440f0baa59bee77e68253a89394bb5ceb0fc2c0ce9e6d748f86c68aa2573a2fa0b9a1aed482f91d704c543d2469522671354a5d47454971c9f04317971c521b29e5503af09bcf3e68c4e6894b2d3ea4c695e7536cb18d9ff74ef6139366ecb0fc2e07056ffdf316c112f921419bcb5aeb3907b6ef887614244cb53653911454e83d17a982b5e57a511ebe86810dad389d8cb42c56dc6e098105455d7fcd528d047688f6cc88b0b9d151285b0fd75e274553101c05cc828ce2698944b5d7daa851d0c5c326c4920f90c7ba623ae58fa8bcecd44ad39082c81e8b957596c4df198e277086fc7cd37df8d8530618947b085595e9186fd407024fee4d06b73365e40fd18d46fe76b630241c4c7325b0fceff7fb09fdb90e624c803c0b95b0825e12f172f48e03b81c20becf9b28c07d22cc050f7fcaf377f8a7899dc7c126e4a96311027cec45b5ec9363414a53c71e34e9f09a0c18bd3c93a221afb1a51a993bf804180c04d340dc17c0b97b1ced318d1c88c74cbe4f8a2f610c9b55477da3c945f312a35230acf42f7c245c861302c2e94945f31ee21706c27fb457ba243cf5389dbc338307931b370849ba9a85aadc7d8c5c19038a6b667e5d3012bad21c8a66ec0b81e119bc54f957e3e5351d340db2b7d4d8f32b4cdabba71112624ad4a3db47c2db73a41b227bb7904b10711d1707c78dd7f53e6960661bcc3f8aedfc9a0ca8bb29b0c91acbb569f3a7595a2f2d2dd9524a99920cfb078e07b4073f56cc9ffaeebd7f5f317fbef76f1bcc1ff0fd1b8bf9b37afff6327f6adebf6f307f6cdebf71307f58efdf39983f37ef1e88a550f6e03b2c6980e806543920efbf10e87b0f087ca0d5d78440350f64f3ac108885816e643c0867be43d54d3867ae93d55f59fd21f53499d6a47d52300e58a669665454d49ab4580706cbfcf6a5167b61cef2d6e584410488c203114b04a48c179b37711ecd3b824b2da659719e7bbfe9778b251559fdfe5a960ae4d09e7e0e2a9655ac537c745ff291e94b82abd8b3261fbd9b82b82c56c0a468727142caf8ed09dc7dd9495a3e2236daa13771d80b94827a7682274d64cecb088376964819efad60f812ad99f1fedeb4f325f67cc0a4eb3c095fe2fa3a7fc33d9d9045df849f240921095fc22740e74d106998f13a5f8248c3921e335ee769d879127e925e6a864df8127e4baa91b5186df997309b3f5b7613c45942e84cb405dbf919afc5684f09efdbca134b5c42d8c41de6535c36231c610398457fe785481615817accf81d31688638690b0193dc29ff27a9f3e5ce0c7109fd4992104e724638495a9fbe50d6e2e32467cc101db6610c6beaa7ddce44430438a9c97c74ad498bf9586ab13c448238694b472c3dc6da318139cbcee4a3f370584c14b87458d84e10a122075246d89282dc9270e9b0aec1657f2fa26b40cd1fb267dcf83a60c364091f7ac04111224fa60d88d012648a0fb88089974eea21baa79b282d227ba7a0bb895837e919fe5cd84c4b301f957ccc09fba5e5888b94117ed003e93588c3738b5aac677827f9e84ebad5569a8041764dcac7f42d8d10e6a02dff56c8438b316c010021034280fb4508430861481de184338010b66b08ee17c33054e980fbdf3f46d82ffc04f76b31e7b1a2c3fcbf12e0f7d7669a152da635c1b0f741b84921222489f498c33e08b71f984849223de6ef4dfe0e7326cd85d08dcfa002850a578652252937142e5f727f0fa592e0896fc033ef498159f427b9a2ad26b8518081e0b2edbb0883bbbfe1948a1a4729a594a67e4bcdba0804b86c97ebc79d1d955bf12c2ad19d1ce64e303ad3e84c869a3929b4e419cbf38914af3cc5519e4fa63022e6f9448aa8dcae1e527d7f0b711efa4d8b52b8591367cee3e4b515da43f3ad825289656b3172830497b38b8eed55623bf9d8331ffb35968efbaab7797a8e8fa30fcd1f11cc1fefe9186db517e7f1be595a97a9d3efd9bf67db86f16ad53deb2ef3c7734f524b6e281c2b25b88c0186cc892ea452a50facda365518c30c1326cc1659f55b58d264aa1265a8198b250cd905edb71286bc893e6a8e91d144fcd37954aa52fb944c586231466ca294d8aeb0878860167d8db5fddcc41d1a4876b05872c51256a27a88820208061d00034411251ed081013e36907039b3943eb9e95f25b8a3dc3b0ae61d05eb281ffb5d445ccfccf7b39ec0e50b36721bf1b167c266f2563fa789b0a82f378418992139cadd4ab969d497fbdd2ea216d2433e76ff0bdcd5ef44515fa8f831c19ebba8bf8d8854ce32c29b38a547650084004218c303560d0c17333231a0c7f508d2debe1029448e22e088ffc18dcdea058d0aa7beeeafc8ea717fbb2f44cef746008c00b051332644084308b71de07e9c108310aeb06031fc301c9d70f931429f25f007e10d0fc21c56f04dc88315b6b005db84356104668057210cb4d50f239c010a2e6754ee7f11b68bb65a0aa6e99fe94f2981cb2eea176df5cb849d4405c661c362c266b25ae0b261293005f616a526ca86348b8150e0b26379465bfd5cd8315c70d9336dd3b27bcc161831a4986f89a1c2ddbddf95ba86d31e579aadfe6d23dac2955cc9979c67e629ce63c579e693245d723f916b517299cfdc29776fc9fd953a91f394ee2a729eb2b770f990f3dca63285a8b7f0251f1be64a3ef610465c09ca7184aadf9c60b5aaf9e6b072b9b25f2b3ac8fe32b62889edca0dd91f5b570c341eb27f4c7db95c2e233164f025c9fea9caa54341f60771d0b0f090c8fe9f1697cbe503b744f6f72810ed4a97ecdf45b95cae20ac21d586eccf6971b95c436e8a6843b2ffe603e7830c92ecaf79cce5721119a23341f6bf3097cbf5c3922a4af6b73a44d9b464ff3a2409d08aec4f8b5858382640e0726d89c921fbf7f7c26a88f87de44d142c4ad93fd615cf46cd5e4cb83c6045d3c5df6c4c62e35c5aa4dca0c805419e62308058acca8d8dd2e10aa74f06348ac8175ae4489d1581157171e95cbcfc95022958785fac0a25b12aa63c6dc1dda2a8572ec729580044eb5c0e7392cb514b0d5586549dd951941ab2b045515c4e516a502aa27db024a25a042529881b830204122849453ec8d459510c62332b86e89c60591a692ca96a626394cda390502d2dd06452442193729404a872bda80bca6c051606854a1328b3242c1c8c588d4282c196987a532bfd1bef8931c3d9b1912329f7e7b157141a2fd88b9ed295d2642c72e77edc3e56f19e9a9e92788ac19c519e64f0c4a5a33c61519fb6d080d421532bd2323e74434cd5526f51c0242687c53d26cf2856b6f8778d8957592c5779fecf58cc141c50cad3294f199195ecc55817343f73f838b707bb4dd3340d86acfdc8e0d7f9636aa61d175ae0550b949464444db995a78ce803d9f3fc6b1087ccb758dac8dd6fbbfb2d39a70e938d89a182bbefbd57a5badd54262c5f70114edab24f136e45e89cb95c244b1379748cb6eca7a2c0404a918b4c3df8f63f20989cc0e988082d92d881100980f4e0054989206400454a136d3e0002c750c1f7634296ccc77ce71ab264be3e7e6fe7be37354ff5f6739c677bcf7b954ad5e9f02d42592bb5f7669e0a65cd87e7199116e919dedfa00d53fad1790245b31911d7ce0c70b95add3c0e8bc7f633f770a28dbcc187dc9e682339cefb2decfe06a519066efb0b701f004eac5abc6bb8773b45dade9b9c165c6e194a0898ec4f43c11eee22376fa28ddc7ece1fa4ed4bfadafc09a6309f9be50cb9de7b5df0e1b98adbcff40ddfe6f53a445614955bc60496b3ace89509e0cdc9532bf55cc3bf9c734ea0f6e1f3eba473ce0aead0d1b13c29909d0a7e60f53c20ef0bbd756cdaf785a048815c6bc83a40eac16f21057e9b87e910487a5e0af6b5b2ee08409d735e70051aa67ee1922da767f86f604e4ed7c0195bdf8e368229dec45962dfa3df174ed2ced166c0e6fad910a8c77b5707d7b375df7ee2bd329f0d590700fffb1640f1fb16e68f50038e617ee17e4265215288f4f7cadebe70e8fb495b5d6b073886f925fba07996a0fd56bb30dff247a65f430bee08404f30c58932dcdabedd5b3f2f5ca25d5b29b52ff0bc7089a6bdb7a3766215f10ebac30225a7639b59286f5ed9dd7be190a7fd9c2594f66f47c11484b20571689c66c115689830d90b97749bbb73de57c192f39e5c4d61dbc40e1eb7e47e0d81eedbec3d9a137bb6ac3f97bd05a22531f86417c62c4472efc5d061f210f7372c89c127fba0255cdad94eb2ee98c9da9c6e539bb842ad1a0a4b64f0ac6995fa8f16d2bc1a511a43dfb355878ba5509ef52bb8a3ea787f176cd879feccea3cd87b2f8eb59abd2d7e3dc3b7b7360492c173376705d7cc59c1fe76fb92b3dbbd7f2d0e23a87f4582c91724524094ad6fbe89738e2c04d9aca36edb3b9036450bb240c38eeaaebd8f2d851536eddaa7e00a56ac9b8f5ad3204dbce93c544775b97a8ed68259a1c300ddf7b1e59e3af6db817454a0eb6395ad7feba8323875fb9656cf53c6446976ce0d155a7077aab4dca66c4851f67fbff1a62ad869723191ac25fa08081545903f3a0726a01c216a1ca8d0402c6a072c2f2aa467b17c808ad9bd028a115a484ffb6818e44a4f45e840fef89e000184a4ef3f66ac9054ac2e807e6ffb68e84c440029223d24a10be9713fb860c98bf4100709d2eb3e1a3610319845793650f264f47d349c4e36d04411e921ab09d2033f1afa912aae48223dc46182f4521f0dbb0812a49817f37938697044d230a8ab12841222c81f1d86f40e40bf873f1a4e2b504610457af839417a324970f9a2fa6838a1d860035a480f271727a43743b3e33444d30f6f1af326eda9d4b3833162690828928620900038451123690d83b422124841fe00395067af17f9c346112f4890f56918349bc81f330a59c525ac7ea1dc6e0511f963860ea458726b1834a348d242fed8d980510abc8a2ba820022369f85d417ada57c3a0ae018827f2077591d305507edabdcd4daf8bd31144240d3d2aa4879d7fb850bb179167dd4262da53c95947ead4a97b9dd4e7d439b2b6d2b7d6d2b754dc5cacd7524ac559eb9734557451e545bb76e254bac5f6943e67ffde3b7f7cf3717bca3d0deddbdf7eb3bfd97761b3e13ca58f0f0b61b6e28ae26d85ffb3b6b5a669da9d5387be75c7deb66de5c6820b9bddac77adbd7765e3dacdf1bd9b063077ef739c887dbcdbb64deb3570dbb6d19e95b7aeca0beed5f6ad6e9c67ebc4cb6d9b666f374513152848acc09b0aa8ef53b27f97257fbe3f7f3a71ebbe7bef5d2c71807c34176af43e7deb02a591edec922dc842687fd28dc67c1923d3982f61641af3654ca64f27cf7d8a1f3f7d6d52b1e438ee2d4743eca3a5e23775ece316e0fa9d4b1a997ef9d91bf387befd084860fed4b7aa4ffd7d964adc3166d5abc41c1fc19779fb36debe4cb8f9083e783b46be5fc6c8cd6d3404ea8c43a0cee55733287e9e7b9be7d6b2505d70df3a80adb55fce184ff97dce13d6497bd294bb7bd775e2e6a3a6559aa76dda73c35bf6adca8b2a0a7ff86f9c30c5b266197abaa74aa17cc55483548234a9f56bad150730f9731e190e5e32fdad0031d645ec3c4eddada8a36617bac8ca82c88220c95e4f2a96cb9dbc5d9c430fc7e7ee6bde31fa48c5af829b0c31c4bc87e5cecc3b3672f460c00b330c1521495a8a79f65438b4c4f31dddbb588af93e48e3650ae26c8170ccac3d8ecee027ce39a3dce13b68c8f7739cc75bc17774e2e8635fdf76b4ffb57785512c6f725631c0258ee7886329c3559a0bc05316444876afb5863976565007deb6af200a9c1843e7943075686deaf56f4863ee4c1dfa2a2b70b913c589604c420a21aaa89cf3396250ce08a30838e2cb10ff6588413f6a502922462eb1ffc1cb781962908c160042d0f9181f430c02e17544568f18e1c7f8ee4fcd3bbbc9b375dfef93e77e7b1d02288278b196888102bf306719646102dccf4ae9d7eca55e46cc09593d72fc75831cc4c89c17226584ac1e325ee775c4a0108a2065bc10e9d9c8c41ce1982db87fbecc3bcc79c0aff99af7d935bc4f2cfbc1f7c2ad67d055cd5310057005ae9e867eb4aaf95953c3fa1bfe35db7c8be5a7a4e463ddbaaeb17aea47d993ba46f9fdd6336abe06fcea634df670d49442ae7414d6ad67f4afc2ae67d0ecb1de2664dd848e247423f724e751729e49c37e4f7ce1db31ab7c50e052b322fbfbabf3d635e8b71bf9e8af46e2423fe972e2ca2dfa115512d8c8794a3fa24df1a297398f0bd19a9ce748d798d9bbfd5d87bbfa8bca065e7615d9dfcb1768b28bffe23caaf76f30ce43f3feee729e9987c1f3e2fd7bd655cc566c461916eae35edec5a17a4a5393a5b689433994433994435926876aa71ab067312f1932747440143ea7cfca8c8498d7fc01bfd9e6b465d9b6c862166ab531753a168a0b3ba95f1bd306357f9a784fcc91b7fcb364d9b26565c598d70a0688d4b01b1280747659919d7b7d33cf2361c60ed7428888ba881a0db5ab4bf84cb02f4400ca070c413ece604200be9b9585eac163c6801b10a905564f1d6b59267c1d0d0b65eb37ebc21d4dee75c28d9857cc2ce6c87b3c2fdceb9b71af6fc6bdbe19f7fa66dc8be545bd2e0b44e18adec5a31cea9bcd3e27efe18eb8970adc2b47130d10856a0560ebd664936d532c9485b250166a63e28eb824142cb521804f00200a570096a75b71fe35b45eec170b268518d98a360a2aefd48048e3c8e33d3e34b8c76700dfe6f37147dccb4271afec6fa13ea76ff6cdbc01605701448005cbaaa394d27a350d0b495d881ba8d5aea6615162edaa4a21436badb552eaf7de4a2be782d95aa9922e499e94d05a6bad945aab5d4db3f689d6ef45439f94c028add6d65a6ba5f4d65b5fd495e0c05e4dc3422ba548b7b15015203d3d3d3d3d3dd97a9f2ec5922b45aa97e36a05539fae7691923cd92f97d2aa21fdbd286c9a76933c49c1b2022c9ee4a9933ccd244ffe510f582c1d12dcbf715db8ae4bd7811f7c30eaa13bd2f1d019c1fddd0e345d91171d91aea8d3a11bd2e5d009e982e0fe0e871894c6f8c01e6db4677ea52d6f97c0aa73f2d1a995ecf9e616e96cea7cf1d12998fc25fb6dca9489f6c45090cb9af97446da7692c272a9b9e81724cdd5c1aa70ed395541814b0acb76eb582c16a3949b5514c870b3dd2bc64b3058d47d592fdec30d5d187d5d187d5d187d5d187d5d187d5d187d71ae0b7b71306b446cfbb6afd65a2bc55b752b57c95b494649d99f1a5124de7399eed25d32daa08c6252bc89537eb0175eb29489c2e875516a2497379373a2dc8c7245ce13e38c78cf77c4cd6e8c9bdd1837bb316e7663dc2cfb5bf17b7133da18c6157db31a30f539bfbbbbbb67759a2a5dc8aec5c7220b758d6c17efb1168c97210b46c8509ed788903c2f926b841ad9a8d7ac52d2d72adba89925af0a05d6bd7039669f77bcfec57992e60f18efb943143652d83852d83856f1ba60428a6eb29729905c72b7c8954b5a5494dd6a71114451d105b8ef1590a69706b9acc133cc9e1e6a2175a83615fb8b37714a6e7a1d15827f12e592265d99b7da07fc6df68bf368ef7f93e60f18efe18c78cb3f4b962d5bba74f172633796fd35912bba4cb7c95da249d9bfbc4bd99f265125efb9b21bbbb12a988b21e14d9c92525a8b7c8bf7b883e94287bc74c9e58329ddcb043373915bf4a820fe6edfb31282be3ae0dd7477cfd9b3678ff9d69b4c1fd31eeee7ca3e87b48db445c3c7460a3132153b103081635403de375984172e71bce7c65bbe126295032b4f225a9337dab342c2b40504f7cff7aef642dbbef9238e8f50b869f2ec6ec0fddd0670ffec86707f6703eeef3490faba1a707fe7c2fd5c18dccf6da1e2b4c0fdf3277355300706f77359e07e6e07b89fd341cdc77db1f9b81cb03e0e07b89fbb01ee9f3f3779bee7c1cd7bc582f613e0de107bcbdf6b676a55d3b4726127a0f9bca9a3042e57de4d17cbf5fb67562326539724285916a6d89499152d5ba2606192949692609306d38733379ad58f393b3e4c4d9c8929fb3331d5adce14c0e64f98bde932da973689dbde6631d2383105cf9cb56297a6d824efe9204516d6c4c66c93f3ccac93f34c991121d9df6af11e27fdb94d7b394f69ad3042628f9cc74bd043e0293382246f6f13e6ca3475fce726b3f2f14b8de666f3d1ed3401cb50d6b5e13c3439473dcd81d7cd0e29e81779ca764092fd6a54c9797c05d9dfa394527adb2679cbdf7649d9ffebe9be71f879cb351d1a7625644c90e49a3c6542c0eafd1a3651cfb82c1ee08de374b58a3dbeefc42056fdf1fb205615811030c9a7adbbf2a1adfb42a4f7db23e0fe26066de5cac79293c4f55ba0ad5b4520044c92c77d2172041729743b91d5e363f19079568f263b71c90490b6474afd245955e431d43dc80314839aecde7ba16b5dd6f6c42032e23cb3051ef072bfdc47f95edb9526c1ae12f9520167ad32e2d00c4d729e29638292ef5325e789c1b2de17bac097a99f7ad57b5ce89af96de637911ad1d6fd99ed9bdc84c82f14226bd8233565467c51894bec8321ab87cc832f23d257029ae4be49ee3385813fbf97f904a41e1469003ff532220d4b7a809f12599586d47fdf4f5226ac61047cbcf7372770d9ae54e802ff868362bbbcefbe1722633ed6628feffbf7fe5412ab6120f8df778b3dbe366a22dabaa038690b6c176d5d4dc4f53db1e3aa8bc6dcbd2842fff6b736b2a537684ff7f679506b6753b6960b82bf075ffbedb9f74416ed4416a51f647b782dd0967def8548fff6c22e9cb1a6f72971a42ddb89b6b3ffd40b2765f5f8defb4ff4c48dd543ec4a9f39edea2dcc02e169ef4d55d6bef4dc33e6e47c34dad23891c38175b7ac3d177483b6342edc615d1fd6fdfb9b18b4a4db444c5bda078d9a86a78e7d99a9f3330a03cad9ab558d66e55ebe1965c4a1c1df97cbcf264f199392bcca5346a42966858603ba40e001f367042816ad248a4a08b0a036682f8d944b9f19832b666c06a36f70ad6d2db304a659ddd8a0e1e3014cf3941181d2ef3420f224c772bcb59a37b827d4ce118d43f67f27d97fc3ab1f02df3c65445490cb7116f5d43f372201b9ba108e8f951e510e805aeb737a980c444517ad13de9cb557f7eaaec2d8d34516dcdffa71fed479c4003ccff9d353a77bbc5bf3fbc5e611dbc6a654e52ebbdcf34b1172bb3b9db32cbde3a3fb78cbbffa84377cf4faa54ffde6a9a2d32a96e10d1f1b5b077c401d0cc8f47d6cdc68eae33d4dd2f0d13fc0824b9fec3e369c877ed94f9bbe8b3eb33557322098f8d8a4f9e16d1b77c6189a0a5acd474e7fb8c54ddbb452285b91a5bd50d6f00af0f735f41e0cbb2ad284a07804d3ead35dab623665aecd1372c8844092e994d939411628a6e0198c7918bc674645055104c6542a4b82caf44e77ede70c4f50c147fb79ddd3a736bf19b91ee36306187cc426c0e5967f3a885980b7916e38e54d0c0c3ebc454b9f0f09ab10239e00854171de0ba210011fe97b3954104f78fb7809cb1af042962d3233305663eae9fb9821c8795e3c4de11c2a991918ab91f6b4eb8311ce3c43c7940a583c214b0e1971fcd4e3255ccea85478820a3e4e197e2af3aa9fd9688bbaf8172fc21a4e1f277d06380fcdd31cf3a91c1a2ca39a99212a26a4386627258ee574026badb3897e13d18781fe0cf4a74dc8ea61f34bfc6d5e8864852c1e355f23063559f342a48f19c29ab05db445df266ca222a32cc2e0e3128c3727f07ce12e9c48ed80b5bfef69e30d59f377682b644d31859a574b3a27b0774de0fa134c219ccf52a1a775789c275380e9b96f43886aca6e90657f1eb64e2053b22b413494fd697c4e1d340c985c75d8aabdf46a3b3ed96768086c32a2ce28bc705a68d756da2b26be3bc4003570028bacca0e2da001066040e440041a988204125415fe040a3b45f6ffdc89152b03db8155135988891055a44c4992c3152eb21c9db893237ee4c08503469c804a530894586dafcae41df1c4a3495ac0d9a0b4d1f071177112362c91fdbf95e747ec7849e2a8091d38500325bed8b00445033c9cc045963b3fb0207bf61f64d9bf3c653f94e087a4ee89c9d5ca756f9a58e22bdad087cdf36fb8510e9c524aa9572aa5e99ce2f412cf57d988d9bfa7ebe662e830b6767b7b7b23ddf7dea9513c201c1308c7e3a0d9d66a6bcde95208e97615cb0de38d9b3afd339cd99dba53778e9bfd33776898f9d569adb4d25aedd7adb97c3218402c56e573c6af070f159cd028d90f45b97f4e81752664094204566421d301291404074d52dc100229432090197dc9536614cb25e42933d221c7d4f76e0ded1b674d04f281b346c5ee426ecee8d744af3b18e02a941dc78bcc8026b8c4b9968de78ffd179a58dedfb654f7ee6127964240bde55bbf6e76cb2c1d4eb7f933b7a9d3ee7ac28452a1ae95a987e6cf14b8dce2868286390ea80d95492f817323878ffd5a1461390f18d7a00aae5c643d389163377aa882038c1b394ec841450f52fc0338264f590f2ae881881c685c0084113d1ce92b30ce53d6c30d38c030ace82a300805ade188129e04fef2941d794287602f4fd91126208e28c9e58cad64475e413a9c28e203c1aa3c654786f8103c93050eb8060a17de98702f98260a069904c1a0527de11779ca783892cb15dd01bbc853c6430db9af60304f99112f3976420e15563f7a5c5633af8a50911a58398ab2258a23b2f0a102c5061b84a882042a7685b3974ead7e610b9660594c896aa24357e1c2c20b182194a4c4b6408107ce02cd48135ee72933d224c7e42933a244a679ca8c4ca13e9bd239e79c5303b5a9134ecc39e746bbdaeaa2b53ed5a76aeb537db2b73ed5a7fba46db32a55aa54a952a5bbab501078a5b1b363c3c7c729c5f9cf196d6da7d5ca66cec9d223ae37d7e8ad76ce72ce39e79cbed56b8472d9ab5abed9d36af6380e9c5deeb2e77db4e7be48e33435a09ff7ec6a97674e9c7c819ab456992ed8411c3699da6aada5b5d6f9345fadb5d65a6b9d552c1d90a958997873ce39b9279e9813d76c755561cc7951983f5f68d385463327f744d3984c1678e6669af1c036c33d61ef55799dcce77df562f0c33129106f3729cfa415a5945e23a33c6788c00d724f187dd645d2e6cdc9d18d724e7cf5561817b85decc27e524a29b5afb72e92703f2dc2f5050aabdd1196969b373d9b1a67d9f4cd37c1299641b33c6199fe8c07282ccf67ddd81667e0d4526b2333c5689369a594d2d77ce26a53bbe08e0cd8baadb470a42d1a36b98a3b5c469b7c2dd7e171cc49c2f29a6470db7a7b58615c840b17239aa820054cec10bc6d5ad4a00628b87265d5ddedf692f70a3984337145e94a131925273025272f27a55aab5d72aadf8bc649e986dbed94524a6bad6ee9cb4949ca95a32b448e9c9c9c9c9c9c76a8cdc1c1198213aef015bc0355b7cded923b69573b7a3925d17e8fb49fe2ad3e5e71be9c5e575870e5e5f4727a399980527a658952292895a20445900036022296744a9d926e084aa953274497d42175417422e88eba241d10b585be789e4fa66177da9dd25a6d3ba5b55a5bedbd9ab66d9cb6715cd779ded779df0782a9540c988a89c1584646a59aa1a171e1e2c50b18abba5a51ef958c6a668686c6858b17302a0c18d41b868b235ecfb1feac1fe41903b3f2cac72868bdc93923f6a14163db9c87b5394f8c1acb0176d96a9b3b72ee884be25ed58b72a7b55a5aadbdf5757de3aec781293025a39aa171f1c2c6674d4d5adc8a17c363cee44cffe1ca971c168a20bc504a4ac271d1c5fa91bffc8513027714029794fd4308817b714ddc14aee9331261e32c14f76a920bdd08c98b8a36d88b1c1386200a9f93080208200a9f130e0054dceb4b146d3111f541d4f79a3f5eb264d9b2c50327f2e006447297bb401865ba4041dddcb04268e12d5a2c14cba6d51a41868c9c113a8b959c64a874ac5746412b95a11100000000b315000020100a87c462a13894a6b1347d14000d7896426a54988a644990c3308a8118c6186308308018828c21c628433536006cc2b3e3b141b12a1d4f8797fb6aab617846eecc6d28193c60c203843906d2d1a5b10187d5baf848afbfe5cde06b474f24139841fc203477cdde173d0b3979d1529c6517db8d4e5d0d1eaf49b7d361eec6c14c112a1f9a82b68b4db6be9c4f9fc3a01753e8852965fac68873aa80a9db0cb456f1e63765bd6d02b54f295b2a4e60ddf5ae0bd966db91b7cd853844f1778e73672a1471429fefa8cb74709e20718bd6e9b17fe724bbef9a1f00ea7c9d51ea8306b5564799c261ca6aadc5449631d829e0559db800b333ce3c2e801bfea12f07364f8cc0465d358f719129421d732ae15fc2140486fcec91d89541edf44c9af35d269baddad04d4c705b3870b627de7150f5930c5faa03f4e497d20b5f439909a664c7980c3a70669fa6a746ba0b8b7236975b3beac94316061be741e925c1c6f071d1ad2b19160132a82206b4e463840914d49250b6c18a6e22ea1fb81f5d9804666c422977f48407494b240d9a06273e8052af125aa01919ba6c76a2043ae3501a42539973688127358254e2de9db0439d624448a7c12bf7f029a06787afa6bb1758f893d4652cd2c2464ba5daa6d826b0dca206246f64ba34f85ee25e7e5445e66e705f640c8ec069d9aa692a6df3165ad35282e2986b6ebc78c63400d9f31e4b62e334553e6ad114bbf9f68aa1d700c9c67f8783af506491acb4e1e16d0c7c7ca3dc20c34b67f8071edaf683a1fbef16588a1c664a684abc7e04afe6ab72f2776b20ebca0f34fc3fd19dc02f7e6432a73885e1ddb74233f1cd54465bbc9f73b8dbc4e575df14641ef3e6ba66e558b0873630c519bbee2706d741e0e602a884b3348b380b51c4348079c14bc1b953412c5b1280b6824c44ac5257faf9dc3c3a1dd141acdf25012fa5a8e52013802c08556cb55063ae34c030fc376b1bd52f441c69d837e4c691938110a193f18ab57bba625af702275bb47147ee0f7bbe3f04936dbfdd16073264584b624c3b9efb93434b01f2660d7535918906dc1b4624396684314d943755dcbec549dbef4354323a3afa8dd105d40335e3c6f0d07293f4156aacb2ec8ecfc0560cbd76e46535caa847b593634a968261efdfc514707be2b136cfe0e08a513f3ce0caea52c726ceb989914e3853d12ff591b8812ad1bf9bf1239595a3deae4fbdef870fa2ffe1c4b387a1cf024f5e1084895cccd90e2aa8bd09a36814d568b27a62abc7ccf6df9b23bd5d5d380803a315b335c08aa88894c4260fcffc5355f1d3a8e5f0c5b380d05856457d44d76063b7719f88f399a2c37a15f9ecf54972f5518c5fbb3d96e8238be8d86bf529eab07fa0adf80703e1f30f4a1b02f0c5b0ddff0a6593523c8239879a2a154938ac62f4b7369eb4584f1813dfd86ac3821343919d2c6efd58a1ce0aaada33b4be6e81f0fac74f435b75c6a48625b2fb46917481c339aaad531a21cce00354fedbdf2fbdc5e4f5226dedbc5a577542f325e122fb845f2e3262c635f69b37de81d62b5ccdb472c988a2ca2031ccc139f4aae08a4546e75c345d4e1d14d1389a74f3ab4055784e4779abbfa51126a232e4bfab17870030dc0e8b14f7eef8032b5dd401e1353fb2707c4ce6a9a05f989f739e6c897eec5f1918e1eb81c41827e67d15db105cfb3b2b1ddcce88398b0b96fec4d1fcbcab97c62f321e0acf1b6c1a6140dc670399f166ccb70a61012036187fbb2aba189bebbd2b7412a7342dfec15a92d14e9c33e2b1b6de4f0f153dc288da840f7a9546b04b809f4660a11838c809011dd301ffa1075015b41b17095a053cf13d3c119c30a84cde4aebd37ad3bda694b20d4dd26e71c5b8b104d0d932311a753b9ab37fcce7d4ceb84546d8d493025d0f3c96316852f9070dec75b89ccbc60d0d25f35122818b641ed6dc41f3c0ec12f674344304d94981ae7c67c6af047dc5c316bac577668cec383b9c665148688de5a400d5c6eacdf4b6c4be59feffdb624dd726b4b4b2b8c0fc0844df44c474d244889af7f0da885faa123e54fd46adcbf40099c032d8a7fa7eca4277fa6c313baf761901a49de6157b722be7d256b5c8dfd9b060b960fd6c0025b9521eb9a8f4a3a5142162460d105f841454b638f0c93f0210e9910eb69160d40cb51821b3de3a537e90ba2b659e7cfb72aec57dbb4aded899a34c3a94f0249f20a339e82393883272e2d1d7d81c219604d3d13c4469508bdb0ef6cf0029440acf43b1163be709d7ffe1bce353df6a68350b8b8a8330b8c948bb0d337ac7a37b234c0db58287f21b7568116004a603436c5049365592d50c4ac3d8b5c8779a426809d64a69a188234e4921a6592573566121df3477d5bd48c225f4430925d9a87de15f43894756fb222b50fc51e555e4a1434219bb079b096fd290797b8dea8165a701f76ac821371999c15aa021ec886eb7ea3571b89e0f755ad3aa36df9f5aafb4d217e591965698854967dc0744ce200d44721c752c8f2acfa05a921f4efd3a5538200edb82b7c21d486684ebca71f400a5fd791fe85cd25e6232fd830b9f7224091298befba8c69827aca409a875db606f8b69d0a2c9b142fdcd40f64a5572f2226208c740188abb410fea9edffe845024d20c523ca9665c464dde366b63656bc327bf09c4a66f7c1dc624a5da6bd54938af4f0783ff8e0b432e869599ced5e7c61d4355095631c014e5f13e59e99a319bebc8d3a728513587c73b14a91296734ea3b76f86e64c8506e6971425f5ecb7c4623c67308d769784e42599e8b0608ea131f557afeca6749fc0ab429398805efb437b2dedc183188ba13261f0f78b5c8b06fcc29abcb473d2bda7c5ff6606cd88db5e878352bc5b670580d899aad01e2dde00a547fb7dc4ed0c9de7fb05f55e3e50bc0c65f81a87d615f1090782af231ed8eddfba1a16952edc75e7cd70ee633f906ebec76957459d45ea6dee0933bc83cdc6784f70b580bc56b193bce9d1f6d0009ad3e88ebf42234af9c10102904c15f4f512f61255702f1d4112ed1868540142dc9f5977c130781d55665fff0936a5b92dcfc752fb8dd9c75730b70a0f3f6a40acf0de987da8939aeff56ae8a1feebd70ce2d6f9b726977ec5187f09dde1b104f8c40aa85f7284eaf7f457fb451270ecb0bb9cac5d952f19fe58cb7e452b22ff8d36d6a284328d5330200aa8ffbb994c3a5801f55de1a908af68b407f182bb03cb40350f48c0d2fc8b797c825d0012c6b54194ee6ac6f32036e4024871d7713d1709ac550fb0bcf63a7949ff21865836c71e5dc1847bb3bc614313dfa391e06e47f5752f032c32506ed532f681f5b9d7ba52f39224a6a783b0d1934a6080e2fa069538b09031ccb6b3d4ee1598f5dbf394f649c0c9bd5b0ee67beebdc6bf68205655f5e052dc8cae815d9c5a1b6a469aaca7084a5b4c686c2ecc1939bb0a552cb48b553018ed8750fedf3056197cabde8438d55be98140544e3164b244643aaabdee4207819ace4205db2cab9a4d6ee6fc4a4b8a6ff09332af51832e0ddf11235677e7ed52db00e0f5511f26c5b16307e1fe99c64723e584444c5a12e83fc685e1fb536a677abbbe73d3b3349a3a3934a85864404fad58e33e5c24ee5501b20e66bf1958ffd0ab84511cdf9ff1eb3ba684ad83063d09de22eabfbc5799ca793cec55fa7c910a429a4382e119540dc5a0813a48cbf8059c4801a4e82ed3b012be1cd39a232f11e63fc3af8a3e563e37ac5a5790d3c66a04ede72bd14580eb569f24675bd3c99270605bdb305df92f83283ff78b079afb8a1da4e9a180acb1cfd267501947bf0bd8f6ffcf7c104d2f9f65cb6c2fbe2e07152ef3c15f2535d7a8ac51a539ff3632f2925bc81298813270a87a73abfea574919e030096b8c5fcb57278a31e54d5ccac7f27058bf8c722ef035626315d186d2bc853ff3fd56ccbe805d7a2218049a1b10000fc6161365014c4072272f8682e554f9b88fec03981481c6543f582e363c1f8665496573e118e0ba1c5c6ff4d7de902542d8fce6df6dca45ac9e2110e887dce6fa662741b650467051490fc9e38154363d0dec90e4b949e9b93c446f02ba00cc923f22b900c6523f8ab8c27e14a5c5dd1cd2c489ca24e1ec32b9a520d879783b1d144857059ba45cbbfc6ce361fce721fcccd6d156e0091bae97dd6ac27a23e789be9d43f69070fbb125328fefb562ef8adcc0a11e97c1e87d8b8f255d6f79a30bbdf86a0a2954d46d0014ca5d68b1a5ef2a6cf6715830ff17f4d7cd753ccfb959eda38cb807f90baf886b4af1e970459897bae9af624b4545c7f2204fedfaeaae9ad9e8eeae9bfea3fbfa92236b16023d78ef19167e06097d68d5ebf47b5fcdd29a266001f8d8ac3545829e8ac3a52ecf9a24eabea03897a363cbab38b4fd43d5790a5d85826c3bdaf742563c05d34aade2e2849a50b3673136e9ecb3a2020da62e2d1a8ecb8f80e48acec489cc4408eb3686ee016b90a365166794ca2820592c8e3039b64d23b09b2a2b044ef81acf026b4f455ef29baaad22499d865cdfcbf723608a0a2aa9490c07602501d2d53942e980d96303419f0c8ee962cbc07cc5b74b9ff86fd18849e91a0ce9c6d81f2c5343a3fd241546bcff21f4f85ef343a93f9d8d446bac07a187c66c6c72762d89a5c66132426ecab90ccbfcd9efad456c7967350f26f8922b62865ddfe5def572f5fb1eddd9606975f51ebf7ba606b41550be411f54ef1d9740506b9d8b2fcf2a6d502a56f7fed3a01b942642609a15237b00326ccc5e491505a057e066bd00822b5836af55ae66b4fe5402671ead042bdbd1492ce9a23996ac062d8ec34cecbc0d5e0ef547a75f45f120cf005ff05926c271222d31e83d54688770d40dd0cc63d90c826f6299f0ef957452fb30a2bf74e47719c5adf7af00203dbb407c517c87f3395cb55ae80ae02735f7ebbc44c9bfbfcfc3c4d405e0952f55dc7f42a617b6be0f0d06aa222a03e3628e15dcf9bb54c71a7f12d2174882f8b07d4cda475ba3095e318f0e04da2b1c8bacc3d75be256f0aa6458809c31640655d7ecb1c57928b916d8a1272ef975b15a5d1b1f316a6ab74059131e29c7cfe8bd2431412301dc2486b0b4c27bb8baa579acac162046442fb800515a6ed2817da78ba79e3ced4fc2ceac8759040214bc0ff80b6b860aacfc7e16b6ef267594de1a993c61165cf38159679947fb9931a71957c3821c911a328e282b4b511a1a4e36ce38b4aa16b12acec7eebc69f2ae10907855a0042607ff48791736dc737ec9029d4db864f8533c5258f626601da1953f6fd47549d11cbe23af6440f806f3ae0a94ee7f8d403accfa7874a9d056ff5b331b91501b5966bd3052994412d53de04d9a43b6463cd6cccb38130a4abd3f3f1789d18537fec547540b14605fa35af6e39bb27e8c54141259369d3d589dd06f0d8149baa5fca6550d3162bb2c3d1807c89f39c44bceccab585ee5c660cbad2e9995a7df9f87c8ee2fb38dd3fbb8bbbedb1dab4226d3f21f94790a39e525bc8df89405686c7213d1ef04464e173c99fd8e4f01cf134547df72b21f2af6cb87512d36b291f6601a1c298686c99371407e89fc2d9a1c9bdc8e902292dc26681adbe9961db4a79adcc78c8f761e9e68fa455857a735d57a6d35224f77f0e8bdf48415e48e507c1350bf8fad01ce8b940c9ecc5575a35a002754e57afa82a90cddb07264b43460b0076684c561ae5cfa8c493f56a0c6129aa0e4cfd15dbd7eb56934eae84d6824331058c4be9f876013f888be68cfa678a9aca454920bf37ac176cbcbd6e76efb0a2b0f5fa92abd67dc764e971652ee35f48b3cc1000487dde0e8456a95e31bbf9b04dcd69fe135cea9ecc4e7f2d9de7430f031e91201f30bf02740b5b799c903695ce427c78c01de6546055dad07893cea37626e9ad52e54118dcef605756c27781db723067bf66aaf1c11b5d40999b98be8aaad0b7c480ce845897e724f750fbccfc341c84d26b0c618ce73c1571e4cd8d82d41e7f13acba7e43a1f9d2c3d26f7eac01b7ba27bd961ca3b7d6b1bd651db38659b14b2af889f49ba65b9564c4730d13e991b17d6df50a97f4a378a30b72ce12177441f360eae8df938633833c350a09732c2aa4aedb8fd11f393b2f7073e967ad43f257a15297f4bdafb7343fb0e2694e81b27609d03c9e3b2adeae813bfceea76a438a5594f8e84cf400f479b4512e2c3cd1eb87c883f423e13e31520ca7fe8a323ba5fd76e887129874e2713cda8a0d201b29213bba84e199ce8c0798ad7b4648ccf47f0789f4b23b6a6ab16bc276c19dd0f674328d801ad80e96ac1a5ba1c1d4a86bfbdb623087e320736b359765f423d8b60f3a8e801c63aecc770ee7e196dc2a70d402590d7a99209974d51dd22b4a4c0ac94bac9a3cd67d5f502cf4d6be97a94a23c0839e5f1f74fc2a0c4b150e4f846686f4007e2ca10a7818ce2111c1290ec8672821404a5cd8881eb06cec8629fa8083865eb15ff02382b061c1527f3ff35f85dadcd4004316cc5d5deb92fa567649a8a8b43d7c30523eb86f3c09cd7fcfeaed0e0ff12a0418ee502467ba5c64d9210c3821ef45a1cd73b33689175faf5e14304b88e7b94475c901d5c4c67abc59f524ee8422629411836bb026abcfc7090101a5275caac71aa0bcf64e280a4e9a709c8e61580d3f9e50a81071cea07bcc94c68858910489422b25514b02bc11e68ad1101322e8475bc7dc997340e4f54842be253950d382a8ba04b52ae3f745d11bb84ec06347e5c8ade7e4eab2ced5aac26e34a17b473bae4c72b9f4860d5976479bb2f73b84dfc3115c28ca0799716bdc38718d32f7161ada45db10ad6f529da7f5695b8acfe847c8022eeae972282255f55920d4f120774b558c25111a0d9fbd21f4933365afb793f6c062a4bbe6337288dc51c51916b031212f35c78ee40287563388bb91126ef66a2dc1a99e0bd7bd2df3d5ed87e905489bd6fa58868ca6a8d935222f9b63a09e34ba6976a18d9789b17757def25061eb9447f47d27d7bf029e2ad51488ff085e4b81d4a5a4a3ae5da36ed5d6b988980eaeee1c5a9abd6609e6a9422c84850eda96d948b8430634b0c2b774221c8ba1dc9be00b874f6dcf5a89e44a9f84cd438005800437e4418531bc8a92c60178bf3ddf1df1bf83ae1497db29f7c246474b6196ecc1b7bb640f1b5e5cfc3d489dfcdd5506770559d96e7c362caee2dec38bf52a4848ad3f7b5535d1ee466a4d0075f57ff79cd27d8d1602843a6b4e2cacdeb84b842607687e8bb5537d5a6a935b59c2b54f4adb14d49ca82a2d814d3860384fbeca6f70542725c0995365dc000060a8097c2262dca47f547a590171da85e72394267b2c4acf93f9647e323273bb59553159c88c9cf8c1e2f0e0278464da19a264365b9f4b7e62c96a73767ff52b9cacfe060ca61f338253292db2799f6b80e2554023d198cb0a7a48d686f4db5db7e764c1bd5de0218a3f700b83dbc82ca0a9fc23f68ec12fd118f0c1e9f897cda8c9bbe05d1b3bed2f4d24f850be8b3f2b0539535f3ee100ae85dbc395dd38093066499fb6c189c30078d48efa7014231968ab57e086a02b39edc470aa7a656ff6609152dda3ad023ab5737939353b4afd4503312601a4a89b33ad53d18d154a4e5f1d73f37e5db89f5860f2f9aec82f5d0dbe08e4c3f572fe26ce4ba98580b0a74cc36d3c114e111ccb05f473af307722522c7d2fa70e362c18e8b10b71b12374b949f17f4bfa05672081a8f1e4b8b7a2c2b6274dcf82bc7504f2fff1bfeddf2658cf3fe27e1c95d82affbcf75191ff538d4c822304a005ca3a27f247d5b0bf21f96bbf1a6511123289a0a712c143dd28a6f17871eac30bc1f27324251d48bce56e4d4a99651eb06b8d08f717eb0ed193853590538121036d2f942adf71217bf0f4929547c6b15e18a513ca171cab3399773ec3ca7dcba9d019032f9f6c76922b073337395619e0b34bf590cc08f887829e0fd5ab90e365e9ca1a43607f3d0090d5a134d7e6c81f828994e37997da468449202821c5592583cc8f939a18763d772898ff0767b3fa880019569d9fc82d044716d6db8221be3e9f63fed67d7e5c5b90e7582b0f6cb6e98f20ed8a6a115f0b1504b69afc2ca900cc7315c892d4b59197b2836585de290caf052d62e7f56d4c56ef97b6c083613e2a68d3efb8077169b4c554822e8b998cc77c01fe1eb8d30bf45809118305a6002d414cf36944200721330243e52eda4a0206ad54da16010c00b66222ff17facda7c819b5030a7d79059b14b91968062e6e66e184c0998337448d861747f10074988838f94b4e7d298f8688c7c177be7a0c7398bc25250c9a1f7f7157a96e08197ed372b406dc47bd3694fc3664dae4828bfc5589c6f44fffc23fd3198314bbf04221f75a0b026a9881219d1bb4a612c2d6d090a6619ec20a339207e35b2217291404af136cc1f64e15411fcec319d831b5a3003743506abddfecd8458134461a4ed6b55e06ed05e978627447cc8e674560fe785e0f55d9be77ea110df2b68817b31447ea5978135bbfd676ae6677d956e05864406b425ca66d1a2e4a9ff12518d1d6673fa9bc16445021bb0cea2e94c84c482f325419ab2157ee78378ce659128bb5c49c5ad6e4617c7ea4e0c81eb1f8092af6a5114e63e894b45aab9f0afbc27d1297c48dea0536de5eef03171b93b9e7e165d46416ac35642ec6ff8154468f154fc0ed7a0a408fc3132bea6e4ea78c1ae36c57fe990be2c6b6046ea30ee758ed536c2a69d3eb166419b8e9ca06d2eebd7aa31c9de2b2f17fbf4ef17f2b73c54ec97a5bc011218f8b3c4891a0a86946aba4a0d8ccfc1fa177955697137e07b9e88a9bb8b9f963e63d82e3d8c5334ac76f66047b2451d848faae97170a3f38e27b674194b84e28f7af59f6656219675632ade868a9e9fa83c47f220018461bcf929dfb237e309a4d2a6b8f2814336dffe5ba13e9eba2944d91d356442c686a064f8a5f34ab39aa2268cfa1329e7c0c0bfd97beff217c543d02a3d84ec3df1cc42d027fb00275fb6e4f4e79a1c2776c738b3ee74321f0448d2554551391e3e5b3938e8ab1f6817339ae786f221e73ec3bdc5bae87a22474281d880b181905a64a639367e250febbe4b0c5a4245be1f2a75b93316103cdfd2639ea4aaa8047c4bc417aefa80c1207d718aa1165a4bdf11e9579efe1c5dae31ad801281a60c53991fd0640b3a8b7f657cb0383b3686413e7c7a7d898ce1cda5f1c93a0ab5fe581f83d196895133ec340e79b1b6b1af60fc4ca55ce27bc07c5f2e45a4dc18d171ed3d6516ae5cc200bbf6540a465130e199168c8148f0578a1598ff07828220b336138c168d5e0fd14d6fd49e0be71c3860ad6770dd7fa5310f845114f0f465f482939dcecc745c92aa776e1b2f8d3de5a98670c1514da3901cb37dee01ac9d653855dcf1b9cbe5c2087b7e468573c792cb1a8a8f0bcbd05823f5547ed94dc7eeca6402358d6414399af5ce3841950048d6e35c82559e570d5ca14030f25a2d8e1d6d0ad63345fb7673433d350d9ffd079370c1941f5cb39364ce396b603cdb65248d7eccbf22b153fad7a709345ead35f730b0da8f7f86724ea4218c703c106e306cff5e284a44c66a999f2360aca70a42c8dc168ab89118a2d06b6ca438a8f7e0cf7d802048eb6c2b2e496c8cfde4ac1bd91395788648036474a2613788ad5b3a380646e6443a460d0b312079303e8092a4cc435e1264fdf13b1f9fcdc9c9f94bc3e98b1eae3e1779f83b9ca1b3b08054fa0ad13ffa683cdf22bdb92d959230ea630d5e2632905609daac486d7b8a311bab00d34bbe55d7c49e0faf8e72fd3a867738ce0b57f69580c2a20fd43e06682843660ea2019b29385935dd1e5e6f9866b7751e147c37b5b36f0509cf3e9e88ad987e34d9f487efb7469428a474f23d3275a82df4f74b1ab19e27c0a1696cdf04f8c7c87eab9b7d1fbe94a8015a3a6d447ad10e907d90c7943360272a90a3f643f1b11a927b860d03fa7c67e010b1d8467e232d0dea847235ae04a9fc654b0e4a0fbfc10c22a390e70bfd00bfc7081c818a67d28f639932260850fbf321c11157306c867c0027bfd35056aae44093088c0eb55f7f0b1f7a6f0f003984d0e4753f2280607fc3ea45225e03625aa9358420a8743c0cbb1539ec907b98af00f255581de5d5931d9a5771dc2969abb08223a03a6688404bc5f7bb7228adde046e017812d53d70ebe8058aba3bfc6cec3c108c278be98108055dea2f7adeed5d83548fbfeb8c1b8050baa36f2727448a85c3185fde0df72ec19393be390059039d2e2e4630b1363bdf392700e738c07223a1b9a18fcca631798056b9227653a6fa1b267ce5678fe15b649ecaaeafa866995ea7760a3a8d5e89bfafa149ae541cd399fd765d1471bfbd0453d9b195a40f919703fdd976ee6e1d39f17c1754ceaca44fccfab44e9468fb7ad282ec0016fcb6b91290c3d31cf7a680381d16c65242451c44a429b8d889f3381f12152d14aa2ce191ccb5e2a20605367d450f6ff0e700dc789a4b9ea5a185b79e309db748536c1559339ce8de800a10a040cfd16c726b3c45b9823252254e35118d9dd0f083275f13476df3ffa9d7143aa80483fe50dae0c371b931ae12dfc3e397d7cf89c3a461bfb9a97911da8121e8d0377b79e0a88d4889c54df89063fca91a6ec30b83a9e8f4b5b9d78fb4450b86f81d129687ce0c083dcc05b083641bb2177fd4bec2f04d1ff0640b28fe0d0d62917649c992a56d55a97755616697407cdf11877c494416f70484cd196b32befbb06ac4bfaaf4a1d05245663d5619b0592de753bd88e9d2158d89c3f1bcbd61796a42186603fcf88c9e3b038a9000162a47486c1f35ba0052bc455542dfcc12f86692fd29a4b7371b432899812be838e63dacd2ab8b051de00cf4c408af924cf7b7414fddf07da81509e2b6cb4d6f79611f066b0947a79f50bf483274c3c2d6fd591584dba213c1e73be786459d2f35a22380fa1c0902e9d5c4534445248aa93f142b98805dacf41bf4ed097d008b89c991b6b7929a5d64532d0b9ff715638807ceca328d66c5ca7d13cc9b0cff79d69f10c57407ef326434ee18e5bbbbd013789d6c4900a3bf7e8b0cc03d7cdc6b3c28c2c65bca5cb472f768f8280852a0c5bd5d1f17184f3a6687b9053868fef547e845152f0d6b34ddef37dbc5b62ef0de2e5fd6473dc6eeb8916d61b6afad46581b6fed7d24b06f802bb03921a69d66169238ef966f1d27f1dce5bcea0ae6747183a20d48724a4ee16a9f3c8b04abeee883123570cd81b80ba79f955cea0461dfc149b8b255ee1a88632d41e3661e80aaea5f04a3b000839b72dfc6dd804511edb10b7c956e75b7ad811201e6903073c92b81695032dc76f348be54062a05e8a0f3b2a18ec35484fe41931e654350a7dba8752dd7903434cc3dc10447a6976b010c146a4fd3e1c1b11edf78aaa41c5d6c19a865c5d8e71ece8832f1664010be4905b8c5e316fd094ac9ab455490e8de5b43ed2147e00e9114c66b8c60a6b39ac58881883a77f15d694244cf24fa2b652efb546ad42afc38878bff7df5ba3b21dcaf4f8ba7821674f82697017a9dd6c6949ef7a12297955027f0fbce127ff00b54d9c5d4b29d426c98f120504d46cf482f6e96cc5a397237f688e6780f8d1a6cbf102ba5d2d96769ca3d9b229f94d363b2670a1b5069c469f8141114ce986288217fb2751259b2c45898d9e5bfb8c429be4545abf7510ccf2f5eea2d46da9693f0c54b8990aca4890f3f5ee41c570cba29199dac505d0265142e0f09845249547a1c8c648a09092945d0d7be3d80393c0b3c1d1b887253462bdfe688d0fee253012ef90d5f90e032774f8d1a2c8c9615331dd26af58b319630bb2da780405bae992b54816e4841a96e0e20cb863bd5931ee396e44e248027188b5c7e4f0ec6bfc7fe23c267762eb776eb022e2d54b5bd52ee146d4aa4d6e85edd15dcc60aaedd2ba79578d8e180eb6f23e8d4d91238081e5e021bdfe347ca7861ad91c7ac3011ab6c385854a75817f5d9eed393df17a9c60b698a96a753fd646748771bdef013e2683e280cac400aec9701291f5d4887ea647b66f0f4d4f48350dc661663e74fd26832356dc0cf25a1503de505724d2d854a9249b19153c883900a9924ff8bc33e263f3aa80cee8041ad10c8cb484aba1703ee3862dbd8487d1286fb130924c48dbfd45b21fd2d35f8468762a8459e9d95255f2411871d7d1bf883983f59cdbf74f6c60d1c2e95f9884a95d400ee5b3c4906a18b82fe34bf3a061136d136a8fa1a849feef6e8fc6bcd769dd50c0a298f5e10c188a493318ea0b6bd902f6984f0b1f9f531e55db2ef4283be2c4db97773dca09b22cda063c831f629a3466a46d2fc5306e1cd5c8587b953bd3d06eb69b5771c10bf07f611617da11760602654205ae02df1a31a601d1cdcc567f0e6cb0ad55543bcb9f0a040ada43df559b2b91664ffc6f8a2703f33ed33b4fd4ee7d3e72ef90189e5ae34ad9be44d12ac1cc0c26352e45f7f243d64c8262a237813a7e4f59e09299d9f717634a91e1a94a1e5c94f589234229c1e7d50c325851f1025fe3272d46fec667d5e5c241c88ac7e6d97403e4d30664953511202029d99487281a947b1bf9d38a3110a87a1f78d0b126691788dabd0d84c446cdbdf94558269c50dbed53842ba6612999b845587eb03a2280f784c386fb8a4d6d0624b11cda9eb04caa2ff0059fecf266986c89fccb760804833783d0539ed62e0df7aa40dec0d9207a78d2c091c07df06e845283736c05aaf9facb58622ade3a5323a2275354825be7d11bfcbab7baebcb3602189f15b07392874e231f3331cd2bc10e1ce4593c06598eafa8f0f15069f649f357a1ad588559f5945a5096f57bc035727e8e03f6c6c554a46ed5768072378cdd2db2b295f952a68c769f1281e2e32e638c5dff966f6aad7e7703259cb96f95185ed2f902f2408abfdf88f075c460bd216096861c8562f04f1c15b20e69dd66192d2261d5192ea5570277e2ff34f6ab8f1a676ef59d3d94b30b0095b4b6f350ec09078edd5e61e009cd15aa574b6aab77f004fe19a28baf191475b4f0b307a56b44555fc975e9e5eec1d2550da68cdef5236774b9e84035d4bcf5b6530bf7181654649aaa96fcab654c15826ccedb35611689dbe48f87f43383cf030c35a93356aebd0acec106d5d50fdb0073176f5dae9d30a667f6749a3458a7758e12a34186aac1109abca0a0ad685157819373d17626aa5c62edfa9cc330d4357af625b7e41c0313be2070d25293f618b034d459d99771c417c2e04824dd83bfba0c0cd1865055a1e89bedefae7901da2dcbbe5c1ec2676214be1005e9c55bd42d65f82fde5acd1eb959ef7905bc576660f8548a4e7c2f6453a524b9966190a3754b31f9fed7164210b2c92b69ff9daa0202e706f9115ab49b1442422161da6001b1f92f33fb85affeaf41598d25e5f6053dd47f8d7e5ffa15be2c319423f1030bc1bec0064909d95735eb116424a6c77044e56e9a6c1f783e7468b8a9612258b6ff6a5a4c02ebac808844aa1c7b086249cfcc0815f4892fcdb806df84f23559fb7d6d7341af0bfeedd25d161231365fd5963593d8e49f00a8a4d1e3c3641f5ee5d19b8c1f3bcd69301b0f9f2168ca0654a248e9f5ea8e7618e7dc69942129e16a0e1bd2eb5c8db31de92c7fd3c83662fa5107274bfe823b2893306402e6a71f77d28cbd3a2622d73526657c755e79e69862fb4c753a337a130fca5759e7f28e0b7db1ce9493efa7af401f5dc70ed29125c4aee35225aa396b304035687578ed98142b01c2bbce3e9485bb521f17c630a97cf302ee8ade1b525041a87259b4505b6a2e8c78ef79db5a5c7ec53533fc2e3fbeb054e98480e27f5ac87f72e4e24a2c638fb912318db7fd6140e8f400542f4c4340747a177e73d899fe43ccf44ef738857f9d1e2746b39f0245d526162abae1b7fc9c9e70d6e61cca3de89f174602e9847410044c8f80d8fe5217bf5492000509831f3e69a43044163dec479518999e19fdafe0871f88c21f7c052d8adafe6c19ee67d63457d3c4c4e4437f9d396e51931d85558a942d69f348cce2e70149b4a124ea380414c7363199fa4b475fdc2e3c55075004cb538d34e291f629fce7a5d5d10634131cc57816b490da900048f489b9198624246556e42a858d415a1c79c1dfec37697772c1ca2f19af2e1ac2f228ef9f78138669fb9cf05c7baa1780cbccc64cc9fa14e04312a25a764eca76ef3d7d8ee8cd9b2f80a6b73ac890fe71a4afa9d95d2b6a1707d3a405b65a4ba38cd81211847192e9baa21385eda1acd13d293ab0498c3e8e8e856d74f64d1d4a50577532490147ad1f742d744d87834acdbd6c78f9faf2e402faef625e37a4448cfdcdfa1504c818e68d231832c1237dde651a78865a571d4a50cfd070fd024ccdd93b5fe20ae1e4e41a89974488866c4928037c52bd3bd83a2d8ad676f7ad507fb18852f23bcea5dcf092c3f4a7ab8e59b4859c67826776668f208c112d6832f70474155ef5ee80b6c69af29c54bf9071596df1eaf53463367a34130799430c9ad3f3665f3eda858be0b9a5e6935d01275708141434b6f2c16e725e2cb9a100d47d09a2841982c8d851369a8279dc9c41d00a5c5fa70dadc64773daa8a3831347d50466401d688f9a4ab8c557666503b492386e9c08a27dbecc44fe2018a0aeb9d7f345c6870bec8429c09cad2d3b0d382f87ebf0efe9fe35c20777aad3fe5988e3be161e53df688e3e4156c1057e5af888996e9d3926884da021e851c1459510f89734a15244ffd9b3a265bf6c8dcf9f0f7e702504c296910b13d1774de0b3e51a693fd582e6f8d110ab7f302140015c208587bddc2007345b6436ff5d23db0ec2639f0c69aaab3b515d71a9f73b0db2f791d1b421e4940a23fbe7473c3a66a3ea87a0d95213ee40061116d0603f0e6dd734e05868dfaaf678ec0ce29cb690b33d885b3324b29b58ddfb93b97f30e379beb8c5da9c2d7367cae4ffeb9724d9f74c6c45a26cd189aa171389840a8ce73a1987a9255f0c6808b16f33d48c5557e07825ec04e3b053308b743c889c1058ff36e62a0cb9f6330e9bc2cf81fcc59368b373e6119b872e74ac1d92944d139177fc8e2aebba40db30cdd41c55b666bf40158b67b48a08822e3f6e2a0c4ae77cc11c1be29dea65003ae09185db3647d5a3a70d71f0f40dd5f237538ece20a110a62cf6a2b907a0d8b90f9a7cf4f669ab175b3dd04f31ad83e8fd60f4023d78f503b9d24614fdfe5c223a72f24cbe5f223dc7737d3aa05210894d78b1dd92f3d6cc1a8030b3aef13a63d4cc9e2d1ffba6d06397b562cf9a34a453b88859f10c2847831c83b10cc126c3a4bc151d68807e05eeb071e21cf408921a80c1f5ee10b26a75cdf90adeaa67410e0a54948efbc35628ebd9cfa24eb0a4c5b3456ff597fe1dfeef069b37f5ba96858b1a8c5a29fc7bbb72f302ed98b00a6cd5a7ae860625e2f0806a8ae75578e80086f17104da75c84a7181577edd6e29989dcb35a5f87202d24516b29a31903b16cb20e5f15a8d4414150ef52079471359a28fffb033b3d4edb036b08593f3204ae3c7a5d712ebcd573d6d948952e7d4ccd43a5aa885ff7f1025b519555d08120d7f2184d5372d6170d906d48000a72946cbc854d67d67a1d6885b1be507ac92a23343d4cb998e23790029f65ccb584254cc1d0605097d231855a3ea72cdfed19f7b01573263f26990eb9b7f2c94576ca0797f2fc95dd4c8ba954525856272192ff70c9a90b4936f8db86165a81e0cd1678e9f2bcc1597e62e8b2f34cd39b3dcd248626d7a98944fb96d5c2ddc779a8529e230fd96f09c2deea76b1af3e7c77f081b126a7b55868414220e935e6a63d7a291a8aafb75213de360d946571a95f062699730d9a5ef51669e23af014edc613426a26ed182980b7d94a61fd2104c1cc34b0a4b92b55455661e07afb5f5b51f99ecdec56c444bad73eb4592f8534ad3bd44f98352c2ad411aa228056000a2c687d4c8d3053d06f4017195efb4c987f8b88e0690e077f588f549d97468a506728b7e85c3a382600e6064627aead5c503d7f4a03667b9971874099a1a369a556643959e2ec799ff7dc7e5385830ad4756fe8a24ae075d8762bf5dc13bf076c96a73c4266390f07eb2039c21df9171eb0649b0449e88cfe426b12301fb0a7021d83f9c3fdbe42f67bb7c664613e9450d0a5caff4f5eadcf8ac641f9760b37ee609b32ecd92a8dbab4180ed25991b9eb849dfbaf638a8eee0e30e5de337482294c2e095dbb0cb1b6bfc43a991c7bbc226cd695508f89ba73296526cb34cfee1e98fc7f60d4bfb87e2d8f00a6c049e22c458c12e08c705158bd6e078cf1f8e6282ddadac0bc79f2a8340f4310004411204320702e68667d7a0bf32f86601fb14916c261c1d4b439a91108afe5c2206b0e2028228305426e8f4120aeaa0b8e2e02ea707386d6ac03bb2cf292037e4aa8844c355183db89ca0b2fde1f4a34ec7e0f1d78405fb82482b6b5c264ebf0c704381019a7cb336325b0ecdbbd4b75eeded28a2bd1393b634a010997807056f1b30ebc368b411b7cfd3c0eb039f8523e0cdcd14620ddc15248dc2b7f3d4750b0944adf3f3800ec442c8ed6690f4ae274e616de5ecca3a908d99f6613d1cd3e89c54e1d9aaadf388ef31c26987fad6ae855d4f3f513fe89bb858aa08581737ba96307fabf75e95705a30986c8df4ba6b4400085a8838451866af91580f960e45f516a3c2e9f4a077a0ba5d8e82282f99c9068917b17e6dbe7d78cf24d53394fc56320a8a29e67549c6f31f71dc1210c3f69017fcb06bb835d95a7fefded8f2268fc18bf13047bb01990b5ec560ab4a1a28423288dc43495542ba9d5676622e4ef7f836b0d5d15b97916838ca94e4c000387c870edbe8ba9459a960e49589178fdb806d1b15ff9087a5aed37621d4fab69bc5d8a32d020ab131c7464974c04d606a7950d1329bcd600fec317a13c6a9f04ccd3de5f3178f5ef24e1c68cd1d659a8b0b53d57fb71c7c793d7ec5eb1d799b6d2533723efb3d7a8aa91f310960c257d070a8465b65e6c267491a94dc55967ae6074f5a361f609ec91c077ab0571b6c14c434ce6623dfb00fa8879bf2143ad52aad5afd3be189ccd9dd507736a8b5e7565bf620477dc96979f9cdffbd6c265a5ab3f33db5676ee2a1eef60de5464f8ae9d61fc258d62e22f98e9d07c485f6834d2a8e1ede6a52710252aac887fb0530450e28057470e50a274b8dea05fe8cb0ebfbfe915231c9360111149d056ed1e52d1fcd27872c04be447bb3d846863657dea9cbd72aa285ec73459b254bda9590a58903a6496c10bda4fff88ab4828fcdc368872bfe7779b9debe48faad77428a5b2df9d042b4322e162664c9269d232cf738fd2145e0b605fe7bd07f5e9f0d6ba69f001059e550b79096ce116e07fe9966f80f3278ee439228666cb657ee5a72795b3ce972e216e1c15f5010c773b7ebfe220303a53084dee460c94fb796701268057e4bb5326a9084f30e3b026dc8e8445f20e9421a16737d6a524e4090fb91cfd14e8bc82a18eb84572302c153a6fe0027d6662dc296c3814c54cf98ad7c80687248821035bfdaef3df6ee6865cd72bd8ed28a8ace9b98d9874c66c9dd2d57195abf9121697ff91bf41edca4066ad58d02ae8acbe475a37dc850e7dc09173fe465f2fd6c0f5a04181191d7c483477447686ced22d0d05ea0ab69fecabf863cf4243b607b8b0bb38b96dbac9fc2d0b8e998d1851455e5f295fc5922f8e9ea80733391c8f75689aafee0bfb18df9c14671063e7ad2cc57093ba1b87ef04ff8554e355701e78bbe7352e553d240de10093f990d2b386f1aabe205dd64916c75d1155934a768d5a419df275e274ee208264bc51e64a1b2ebdecb4eeb444db5de490bd7bb52bb6ee3f64cb143fd64849664059bd1006b8bee221941de8f333990c1df5aed0f738c66424feb76a8d98153375c4e28c9d7620d67d7e650d39bd1ceeb2b98cc68edff8c6becfd4dd116db00ef8d473c5a45955505036805632f2f6c78e97c0534516db299b1a7de81e5fb6a12435a897ae20e0417004416d9811a173aaf145c766e1a2985fc06e26894b586a26060927db1f58f43c613cb4c4df91658a2d75c6cc36c5a329bfca2eb3b125841ceabd83ccde598911658dae9956a51e3c70ed8217f73e501e04e25282a5c59f78df0881d72bf153f9cfbb7ba70a12cc01105097e488573923b18733fe6cdf719c4af9cdfc3b86df2caf56ea17c632f2def79aa82210141db3ed2923308f2d8242e3f482a63637bdc6ce1e5c0153f951e27bb4bc077b0e3a8455a043a88a1c2d55c26f98dda7241dab9237923198cff1c6d079951b2033c4eae8bfdf3ef4ee7d20605790008540f3c4366bf098a88d33af0fe2c4872d39e4cc2b9beaef8efaa05f131a79059ec05e8919999a96cf5596e54297e9b1309971e0ccf79c32585a25cf1d5bdb54052bdebd2603247cdb65ee2fbb5cb354b87bbff3fd8ae2e7e8b559aa887d31ecb28d7f7729f4f9005e5d30aa2ffa3178d283c1426048b1905ff39018529d645106de0fc17b4a4b625170c50daea23deee0de8b7f6050f086139158c747cd7d648a5da9ab05b0c7ef26ba95942b33fdd74e7ca808e1921df58218410d295c497901d830d0e2799e04a38dd21be5ca212db177c5d34229cf6e2da59ab07213c2df89ca9095abd0f52dfb950d52cd19f03e2c6f8cc0b53c68e069528169382325df36016c3e2535bc0869d360ab37c40f80e195c1013b4f912e657af5b8dbec3025f0c80a2079073b786cad4d5124ce8fb63c9d8be59d9d2e1f1d3cfbd0fc7b704803b486701114be09bf19ba48a16d47af3c25498c8d7ca702653bfb31aacfc196fed116c598c9b195c6f37b6d644f07d0beeb0e36f7fde0926a9627f5ccb881ccab8d84e0d183c2833d6200764b3dd624cc55325e018ba61b56658afbd7c814072ac08ba88b4bd13d394b0dff569b4b68be80bb166a38d6944905d579f24734938a704fb27bc3955942402f082adbcfeb59e1401cf2b5ab5d31933eb1b20f97aa360dcf8e43841608d22dbf8165e5710523740c973f55d43cb759abbb279fdab78de709a5c71b2d87c6f13e7182e56ed6c8b748461f4e275c956f1f73ac4d7995b1754baddf538f0b23214815a0b1514af2c1f0c6bf015b65dca0a220f8f0356dcc8249487be7541ab3bb1667b44e01bec553ceed133fa29a8202a20d2f0dac8679ba00a00dfcf836216b75b4c6dd1f6abc718ef382947f939022aa70c436a451098f3268b31147e24e294b207d813845282eebd31968ce3c8be43a15461c9c7773e3421913abba79e96d14b992e0452f0d1f1595dc15b2785a2856028a7d2f43f84216a48e5167656a3635ab4bc46b1321a1218358a79c436b4f6cf97b5b6aa4c8d015dc76a650fa774f20a56f5b0abaf590182cf03642b0c2e512c7077f2a046b28537090b688688a00a5cccba355d18b969d6becf20c787d09cb908f5a492f3e46d61249899745b740a0a92131b654950cac71f5820b698400fe85b59c8c3150d4f3f9e875e758ea08b55c287a177a0e08f3f4a4fbdfb0a5a8b3480d0eefb16eb582b0af2a14a83a73887abc54b2273529d388bc8e1de1160fc42ad74edab7b0ab40a1fa8e6f67538d15eac7a385393102fba0aebeb689d311e43809aa7c1dad8739811b675d156173819ffe24d873efd4352fe7d48bdc9486a8df48c09c792643c6d530cfd76a0585d1db5921a6873c507d689e4d3a649f29fa99f1e8c7b7abbf17d05d1a0bdaccd4e49c544fef73715f008bcbb8f3fd20180348999466353d745342167828c7c042898aba0436d08b2c61e4a1d3f5894005b6af420ff13368b05a478a5c29821f1699a6f6dfe12972ed50ba9b15460c4db42546246eeb00d29930fd7dbc7fc5a40d9c27ce6dbfa477f1b62c4656be9b9b75321a65e3a27bfd81dc0a59be4f4fa3a21cb9cd246c9b7a41523781d15f206035ef87e71b4d8e15f501552f7cfe775c6e89494606d25c5967a3c1150805a6c29d272fb97a89db2ea47a3265b80566176b919381c16739cddceab3d177eeb90d8bbcb0461aee024c000a40ae444f173d9bf046921924e44dfe80216e75c00522f2109a686942afb3c86335d21fbc11e97a801772963255239ac132fdec5c8e7bc76287e007ff056bb9402ce1cd3cacb0acd866c3a26c6f3357e14be0aa38342dedf09ff25bfb0406daa077651960a00077b93479f176e49952aa2e579d2dbf807167a793e2263fbe9c3f14b03008baf20f48aa32e0072f4953b17c357cc5e34f4c0cd2bc19e00bfe318d8fe2255ff3336f48710da006114b102f48489e60c74ea502604043eb4f8c0239bd01fba9da2352479308d88df3afa48b3588dc61322368b83c0ba9f574f64c5cb18144cc4cc75c90f41ac1cb7ef532ef44044763f84c04f20a07e246ff2033655b52d33184a043558fd8f0a6d55b08f1b294f0ab868c81a3ea71758f129c25739a9b03270b412bd312b0262d1209ec3bc3ac8c9feccd4a247216ee2e6157a41f5057dac2115806b869a19a4094201a74baeb8b51904e034fffec37db30eeefcefc762e350af764e50afff0ec8ccf531c9219c26174020f751890679b25f86a53b47c2b5094da7c932914af50bb08e2f65253c5f4e35b47b574b16d5aa586413a7a7cf721fa5f08c16fca4210559ebb694a19d20842fbbe08ee3e49ee1b8792850cf824099fe531d382780fecd6dc54e441a6fadb23c3eb4b132fa3d045ab306d0e25255dc5803a1a3616ad835a155983dd55c062babdc9f35d3a6975b398df7e252b4291665dc3a77e112c8c64de32ddf5eaefe8ec77f4a688da6124de7738f32e62c73cad1e0275a7747d4b8fad380bb6112ccc1c98284055dabe58d8ba246b047215559f40020057e0f3562b3b537b095288470437faddf034e7c7090bbf2ef0e00778a19a56fc869a485c93ac03e60da46117270faf7d9092d10486fc8b6c316365121d887118d7e2c229a14076eda3a2ff1784ef5af1fde5f289a229a87fa4b18126db9e6c303bde7ad1b5c6a5c558755c310861993f02c631ba3858b82074a1e6209afda7908b4dd8a3f82f5d8dfc0022986aaae46d21a7d20b60e4f4976063c5dc0d0387aa79dd74879c4d8913de26ca2b31c9bee3e257be18cd1962ede3a2e4021a7d7596ab852d6865ad9c75a05ca28ab7e591fa6ec180cd1ceefc03e3619a49af0efdf3bb841953bba28aa774ff4b45de330dc5023f25219aec8462be6c15f46278795a7a612e3bf555addd197fe4dd81a014a7f2ffbc307de24f0748bb9368f09c1146c903f7cd3bbcefd321d0d3aff996ac0e74b904d31f0e57646c6cc2d084f320bf0b8cb0223797c82d984921188aa19822a38ebf41bcb0acad54d6c8a42a75895418b607c821bfff7e0ad978d7db16ebb6c6728a80d25bc893f14743d25dbdeacd50fe7e89032cd095c9af2d3d516c7ff7037d05959f289a5fafa803f7ac8f2ed7e7236f351749150a8e1761c63cbd4e822c1723fbd17a421810bd90b8b852d19e242ecc726a0d8100d649b376ef881bae0d008e0ba0def21296ed6fe5bc340514fb2116935c0350dbc450413dc3983d595c9c366b132f55951c7ad934aa7d8f457785e29abf8f9ae245247cdf5ddca10dd59098eecdee9a0deb6267577cf687c136c492fc9a880a333e62ce93f4dff249bc69a634e6bf8eb9fa7bdf4c69fbccf4c106a866b4fabdbd26fc5b3b030c3eda01bf432dc228f853ee57b86233e651b7ed50c3a46af16e5bfc0118533cbb1d73762071f5e332d31e23a51f6ee7ea27340e1168ab2018584f74168fca27c9b6b75cb96424fed60c53b7d0b6b6e5c9d3ede313004a05aad1fb06dff0c016e759cd7e8e97653290fa18cd9dfcc88d2fedbf80bdcbd1529521f1f622ccf1fbc51712071d42daab8255d2cef9cc1a4cd97ba6c0c93b1ca108bd2f2ca6deda97c9d6fe5f7228e12fedff33ea0bf2a30f4170bca7f5d8d93ff3c63fd338f519499c7ac5016ba9fb7610f07eb8d4339c201ca91f3de4d97787df367c7d8848f03effb989cb86dddd2e3f7f0e4f8e8e8e874681ce02c0d57b8df8e8103c21667f1f4f0f070f47ce27ce8747676344e1cf856b06feb076d37128b0776f3c251013bb8fb09d13565630803d5492ddbca8a010467a74cff46b88cd7d30f4fd992f3292088681506217de5d3f2ce98b3b62312667e2d7e51423effb73461ea329c2a9093a96eb7a42aa5893a60d00c155bcb78830d88006da07d97d18a7372708c179747d0214b40ab14dd74b352aff8deaabfe0893a21f8a33d649fd01e18508241621a94c4f434de37b7d4209dbc951b766443409cb3eaa1715c4c3ab827ef522bf4a42a104a70150ae8da96016229de5985997e9f6372bc93f8b83193643ce80a2d6e6b7260c8ef542a33146fff3117dcd46a16b09dea14132c9b3fcedb8fa45c7f18b65aa73df27d1f081dffc59836909fe55da6ebff9ac830bae9d3702dee48ba551a34c2165008704219b8b423c9bc8b18ae5388f185e49e87f25590ee0a94d489fa4a586561b838d54e1d8cbd80b2c1f8c0555a9aa4003278ea5b9a4c9f48e142f7a2e4f5b5ba172e377a0234206f5714df481eff8b0312f3fa3b2f911aec1752c640f02fcb3dbbce9442ab47df9cdf9a63eb23a3a5ab934e768c6216f54a4bb1e22ee7ef5f64d2bce5a6337077d8b8e9e31c1d0b9f267bfcb4420af61f77158c7c5ccfb6cb897067270ed54ce5eef40877149ad49a92a8118de6843f752f0782f767970de630e11b0d731a6bd793cb4cbc98a535c1fd520128b59c67081efbdaeb8a41313027c92ce1c6d55829ee896bb7b500676832c4d06b8390c87911ddd08e13b089682c4f791a1a66f1f45cb78ad997720dbc27d22cf9e3ba79ebded890abb199bdd286ef23ec2af0d4a76ad8d5480a5fe72dcb8d8ca56b15cf42ca0ef373155dd488276cec980d74587d372ede4e53883a544b8649d1849bd348e5a265583cc18f36095791af22891889460fc8ecf7a74309adead520f680589f3e4efd27a778e1931a7ccdea6d05a37497695a84206d115499dd629d16e44590f4d608321b6f313040ba07e7d363fdd04a608fdb0b8d26904fcf5b1222d5e0dd5e199173b1f6caf692b88c6ad29cb5cca81888e22296951f6f41e25e983f89d0fc3a98c4229573b47bd0674de31fae8cd9a912c969bf2d50f40f736f7c4e8b42203402c03d5ac11311fa4c4460f70f02785446b8e275018ad082b74828f3f71e8bc4a2d4204c5a0f717763fb00cf50888b9c191e0365985500893bc28d0dd93fbc805236cb517db2838876f4565cac7e2b761fa6314d10aa048b15dcb389982126fd511b7c11609961ff287239a844f1ab4e695056112636f68f2289771f308b340648ec205c940bfb3dd3afb5b6250a22c56d05a0e360611adcb8fbed316463822c95141360e85597cd9d717f20f5aaaf0ec100179e10752fa2471e1b0d18f2a4abdb7bfb4af72b2b8c6e40d718de1f0d3307a1bba5f6996d12c7baee2288a55fbe69cb21867e1a187cfd0fb58a471f554a48e997c5815402745191bfd1894855def027cd18c44decad90cbad09e43f2d173067592a10ce12255b205e580541ac580a2050feb05c40ce625778e2c7a6edfe92a56adc10675750d1e389a3d86443f2f37d96158a6505e42591a78669d2bc4cd78ebb9e177fb4a0d65c6c4b903f5af88c760887893b94baa949bbb19d0646c0fc349e03fa20c9673f5c7fd56b566c72e9e848cdc9167c1cfc8b83644f31da12042f488374afbb157281e39504ba8de2b8d1a583bdaf6355a806bf79861ef7cd853601fee296bb258b23b45c0170f75d390f8e9a31b7f566b4f1e68be6bd7ae55229f6d808196ed22320fc1e6c9d91c78a4d43887823e4144da617110ab8863e69618da374512a3d71eaae931a66eba757da03b6d5eb4e8a3b775838f0d30a252d9cc4828d02ffa096667e21d0984f4b44bb8daf4bb3497c2281e25e6a107bc081f7f890385af90ff059a30910693f77c09f94bd1972553ad3280e13984ffbb483e513fbaa8d203f806e42f05ba268ace9b2f7f46657bfb1abe6d6fa823d9ee116520c5c3813c68c464d9e923f1a0ef3e094dc38188e537e5c869a2c2033ec8bda9eb2d908fea3263350b6a0b448a29d02ecb15a8262b584082e66c71ce51681b9262b003539eb6e111eb377039ac8c16b82f83ff11ebe0b2103d4bc033acbe2925a2090329b0ea5089256debb18600017deff55c1888e5196e41dcac7d878d58bd68b2e348cc3a9341360a1cb2dfecbc243285049079773b2aa2487165250a1afec1dff8059221c33f5dc8703f5db979915b1ed6e7b4b29654a5206e008380926094b4fb4408d21a4196b9cc1c40b3658d04316361c914349d485a289d5cabbb1810aecd97082171b6ee058d8bbe1e18887252f57504a29754a29a592868ebd825d482b6432a3245c7c5029916195040b4ee2858c5225b97d5d949577a3a4058f2533e27ec0430c2f6ac4e890440ada04050d5d2c8993df0f461116cbfdcf3939438715c49882861b5451e44314143664b045962b3a50b981cb978406e344450627a921471228b8f3e9010ad29165cd8916170b5b2c065606dd0d77b9a7ee46124128a1f1029311153a300551012b9ece60c2a40627e8524555c3fd44772dd2e203ee723bacdc3527463cc93259d69cd4c082ee1304f16468808a8d29431a4390f9de94734e0e63168b2ec993e65da0c6994d14092152820a3b24e529bbe439ffda2a6bad95aabaf973ce39e79c33d69cb3f0b6ed02343a0a8e73c3167d23b36bc3167d39d1954911e2befb2129f785baf7c2a18e35c4855323d7b16cd8aaaffa51bc12b8dfbd9015ba5cd8a22190109914e8ed34608009fe5c78bb3a81f37caf95254b46a50696f38912fa8bcc9e5d4408f7add690fa5c8882bf841c29725f8a507dee85ea73d26bfd1b0e71a16847aee2fe98b08744bc2378fa18f21920656882bf0d67189cfdd60780b8bff786a34f50e67b825b6686d1249798a8b4d84f03be3f4e2ab97f04975ec47160be8b8c5eded697739c446188bff04531f708d306e550a3983f5bee32692ac7913e8284921fccef4099ed6a84279f0341662b3b28f499330e8bd3681215cdcc256107108df1451ea516364c417e05a114619186410ec4dddddd33151bd556b574ad52de1aba4be9524ae95d0f35ef08cbf760545660f99ef4f979864b59ba3765f9632d5a891f764a6b9dd5bdbbbb5d2b105c7486a32bff7c8bd2dd35d3a2abc57be7b546542778da6aebca08bb5ac2f34f209f8894f547978cc9ac0547569ef6fe075900f7fbc93fba4608d2d2b73294524a29ad952e84322c1cf02893655c322c9a2be89252887d1eb9cb3dcdc91da43c810b03bfa4f204994fc6be4b9998b103b9c6c4642c29476b2bb7808c35d33147a6e10932cec59333de0d9e0c404d428b52551c7198f592d603e31c73d8c6d98a60eee3b80f737822994547fc294729a5b488e3709c35c2fd46964bd995e6cb5f4ef0257b49780e2171a4ac37999380ec3f95640ecd3ea1984bcc23b283347bfddd7b9bca94edb64f705269d1fd69c045a61de56d75dfaf4ad5fd546a9c39c4d3524dd69a1ccda6713265afb41d94c8e374da41298f334b7618b7cd5bf65775d39babf932bfa76b3722454868d17d52366c1337ef4d26a60c2c7fca55bb5c3f58866bcc20a63ba5328fc3fbeed6181d9fe3f18e5007285bcc11ca80b2451c614c88c371d26042d9e24b18865c287e17f7396992a73cbb5944601a347d5aec69713ecdbca5f0973c679409a5451af0c8cd1987318bf55d9e83c12cecf45d4656cd40fe6a1aca7cd405380753193a32366b4f54904516590c993a4f787832430c93f797c97c502293d950a760b27b5f76c19efba3ec7ebdf6de7bc3b147b62393edf4dcdab5ca48a8f5fb0044f6a6444c6badb5d65a6bada5feededeedddedd3259d743cd0727b2b7cd8a57450ea699a58ca1d168b4a6997c0abe9d754e7777ffffda1330fee9912736b04e18e3f125d3b712c7ca179d3e2626a28c27110693c1645206bb81c16e6430d98c155c1957c993bf607e37ac5fed3077ffe9dedee1685fd6b01b99c36433304a61b0ae3d8982c1d2689bbdfa4fd9fc51467b66d397f5c87ac29b169d46e62f8382b2994a9d7efaeed46b3e0c21b3893167682ccd0d8dbd696be50d0d8cc6ded0dc882f69ba768546be9ae6e546439f34c160b5c8713ac7b91da3df212c5729c56fb17e37d3a264ad90b6781a7eadb625d812ec56451adbb2b62e355d8192aa3d45d96e5b727d3a9d3aa5b4fe4c7705c2051d6b913271420bd551aefd795722c7e99ea34d32a7bfd221e81079c44a79ac4660eeb073c251b9af1ae55a8d1a074fd5a3a55a8b922b945c95d6a092c7ca946bfdb13ae5b15ec9b5eb73d7ca27d488ca76ce1e51c85875b4832711e0b5695d32c7573f7552598bd6c3bed9b9a9d2b5edfbcbc29e1681de07e8e5778f048164937c79a59417a8c7a7c5f6f7e9019299f6008d361469770927d4dc5df4016a7f8e73eff6eef67eba3580f39c60b528d322d79ab37f504aa9ad284b1ebf16944129a5f467bbebe9cfb4e04aa62e7716fd19b25aa473be8c0c225b9cdf9986d239a369913e16dc851fa5c9942aedec744cbce9d9f1d991d2a7070604dbd9d9d1626767ba4ba6c5c744e0fe5186c3371de4fdfe39b99f99e35eda0abba1ac47fe2893bf1393b21e59d7b9cbf797f54829eb9137e2d3cc1f699ca66787c68746ca645226b381cb7626ab09fcd157894131d0f2551f0b70bf10912c231011229285088bc56211111a21cb084244848808f1d9011a01ed08922115b2c870c93b79d2b814e1c245852c2ccacac2a259bec8da408b1d590f8e2c6b4b466d5419f509a24142578408d92021fb3e8530c6582848c81521414233480868e7a667073c7e57829a84b608691a61cb9613aee0c6b236c58cdc4a70b0bbe353af4f50ad55a020ce27a81664837c806a403e4134bb4f500d7b38190932197d4a29a595da5ab3ac4d1943d62c17594f0f900f500f101050934f0f50a53d403bb6224d2474ac8413bc49daa8a43d4d4db52939c834944d9788a93ac256e07e4ff6146f76b89fdce47e9a30bfc7e7de9dbb93fdfa748c86eeeed3b333bfc787ce6eeef84c2e94dd9066a6caa481fb4758dee958145054943fb7b3b393eb9586edf874bf4f8341fd4041d3278806758cba7b904f8340b2d61f44bb7d82bae7c6bb84a99a0a2318ea199e40428b1e4081472a6b520a48884b91e0236bb2d68213d01f28cdcdb47f637bbeb5efb6ad6dbb7323bb997f236bebd5bb61373d1d9545a86f6e565cdc502b6eeb4dbffc527a9ffe7873df04fab29d9b09eecc9d8e71efceed8037f46615c4834c5f76b3e393bbe91d7a43223051a8c59b9b3064635418d93f0353a7df1f005cd0d16be3cddf38f51b96ac4d7122d370c43772aaa6619fde4fc187b7648df390a2d7fb1ead4f2b0f59e3efab054cca92356eebd75cfd5953060cdc55346d4a9bd2a63af22b05c3e9c369f7171efd68a8b20277efd1af7eab6945341aad05d70bd961376b74d96b50a4b2e3f4ccdf53555ac7c6e97d257b4b91fde78dbb8979058397474155e425145ba4451c87a65158855ea80adf3e0c78c42afda082dc81a3e8df170cb9f0a38eb1972985ca3c1207463ef10298d07f42a9619449253b4de388266620f560850653b3afe86bcee6c91160fa2e6b556859564b01955c93658d072cf928298fb0dad1d1dcc9352c6b29b065580aa072ff8d6ca73d9810fc019486ad07c819ed00533389040c49d4a085162b667d80a9999cd1afe1fbabc5dcfe82c2925c8a908a010a22a32448b3970c4d5e2841b2822b3998f5c3fa65fd474e59d68e96b20759d67850ca3004c81c8be4c29c49f1f7a8d0945198ab07fc593ec14485d2c0e2a4ac22055bfd3f9b60ab652d7a908faa0bee9b54a866e061a774d2a9c5f3a49c53ce091a991305afdd9d52a74e4731cbb9c59333a3bc626a093c6777af7ef07bee3f2fefd1283f20d04c6b5dbd67ed0ff7debd2c2c6ba6ea3d8e9b764a2359d37545aaeffb91df8fd784bd979717181898d5cfea076318fcb2c2313118638c5f66f63e8f7bf960561ef094b0b59155903ff3cb2a082b4ba72c5d29cbf724c7e99bef68bd7c37729c1e2fdf8f1c87871abe24cbf72432d6f2088917e1d07a4be338cd5fad7af90d15157b79f97d3b22a5d291261f91d23d0c3fd381539ffcd58e5fb2febb9ff7719eb4b693397478ab0f06945e7da12c5696543489d0e4928aa6dae1f8f09579e529d1fdcb0a040af33978c32b42926fb52a2eea251c5b4a6a1586aaf047930f4dd61cc963a5529364cdfc4e29cfaf51561044072e7c63e5604c3e00940dd4cbe900502fa7dcefe1f87270154472d9788cfc75e4afe6a1f110497dc114953b7081b22db29b0a0b3cea4ce94c71d1e9d231bbba3f6a512e25bb87f7a369a6e982af26591315f585634b4979e1d85bb6a8420f94aa9d69ca3d7aa0f43a563f3b92c00ec2e41e60ece6afb625b5188b12538a51892d71b12f624c2aef4737f21fbd686563b3b1f9eb36d562db70b15943672a05dd11a298528c8a8dcdc616360f6de4a1f9111eda6863cb4f3d8e2a3efa58ab9fef59ffe33db7e37bda2a15c1a98eb083ab0e44eac0d501541e13609400a222d94d36d585d545d6d47e38fdb8f2e3698d34b270c9ad33e5ae33b563945ba78beb4cf96b87b643b48364670917fe68ba5cd562f3540e7e2a3006153b8a418925c5a2c4a272c7b4c892dbc66663b3b9b5d8365b6cb85c1e5a0fd0872611d01ce8e5289b54114fd28e22a3265038b1083c4a289a685034cdccac7e54efa0ec3a0f069c597584471e5a770f3077a1f92b4f2d3135d59c5ad4e17906574637ca8279683c477890d8d83a76a53a76ebd8d38c2673b8efcf593a2a4aea25b4b1d9d8624a1e1126926d91dd2af776be47c4d5017c0358fd549da90e446a395dc902d562d41749f1d078888a5aec254d9076589a479335fd3a5c1a6747c7ec0e4bcb0e7a0722b59e05f2d076b4902cf1207f210f11016080c76a6b817887cd716a92bfe6377559caf3c73a95ab52b57505f81c6cd9671d9c52823377d3e76ae61770660cce0ce3a0cd15446a7d0722ed780c4e59335b2c50f607e36756cde7a0b491ea57bf8d4d4b55cadddbda5fbd037c0eb6b2e7e373b047ae2012eb3b56a803c4b0cf411eb982483b9e8608f81cdc91bd7f0f3cf060f56323d562775d17dadc6c00b0fad199c282471e1a4f51c7ec775667cad6eee67350267b1f7c0ee2c81544eae03b10c9f53dc059d1ccc85fddc1eb00897ee69a1d31913423ca4f394b86ca51d976673164a91f7f0d169725b6d40e401e1a8f114f131e281eac1cd0b31dcf439339ddf7e72e1db38ee3fafebc46e3c86eceba49268e60c90412d6926fd23728093062228ace148f91e388e0e4af9808502db68c89c085149b8705da9c215ffd2ed0460cf9ea17810b19b301438a0dd5311b5b8b67c89c1cdf6f6386ccc1f1fd3665c81c99efb7d922736e7cbf8d0c644eccf7db90217360bedf660c9983bfdfe666238693e38860b30943e6bc7cbf4d0c648e8d940d18365a6cbe9039aaefb7b1c91cce692a80e8b9ec10c166ac1f6d6e90fb6da6fa07ebfbbd0eacdc07a3acf590fb45b0394e526e25ca24f7631d723fcc0eb93fa649eebfe124f7cbf090fb71a420f7e738cafd7e83ace95f813e38f8e400d68c3ab03307fa2451813e4a401f1b644dff07fa2c91351d38730e50ca1a2422d8acc7e300918864b31e7f23a6c7d310e010b0720d917a8452da8cb2f643ee870136931201a3ac21e57e9f1ee407fd5eb52ff7b30bf43102f30d7d8a6437c78951e9573fd3ad76bb42cb42148b8a49e5fe310146363600c49498e09a8dad2e497f29d58a1c7cc91544723d758522d8fc558023b86f797c590b4c000dfc3105fee872731cd9edf6e306fe50fa41e5c712f883490df9634beeff3186749ae3fca8fd90fa285616fce34aee6e16a833a5d3e5c97174d638a263b50056bee18f261089e8673b7e003ed8d854dff7f320e17141e65c11456e41ea88e0347968224835ce8eef17c1b603d4e1d23f5ca8338505d699cafd3c349e233c441debbe5f6749e7a6c3d438390b0f4d76e3a1c96e3c34d98d8726bbf1d07868b7dc9f63b5801c7995c3a887116b05a455f53e8773182555b01a5d2879fea76ae2c46407a71cab1fee73ac40a0d995237b61168bc023e6a1e5289235fd9e8c056feeeaf7e08a72579a8dad16c99af99533ca75499e2f826dea24c9f3fb6dc8535e6173b04bc0e720e7e558f0dbf9e4eaf30c30138010ac74878e1def09934306c78d9897f93a403993574cc974095a7852cab7aaae7bd2e943ce316804bcd68e4d1c550e02827c81dc202cd84c7b7612327b3052f6a4b9e4f7e012a3d4698cf32aa814bffc752abab2ab504af1fb86545d48c9c05294a1d47b7ed3cbc0369cd5bb2fa53f0da51455217d0f544d1ffd3694dc163c43f028192c6941a41de5fc76a5942ecdaebbae8ecdb71dbd54aac0cf05e08dd5023adb104f1ffd3dc6c0b35dc0eade5eae01feb4abd5ebbaf7e7ee77e0f8dd776f95e5cf550837c80ad50209b242a6340c4f4a1d973fa60ff93d70c0f3e54e4eebf4944d1f370dabdff4bb5290c65d6c513e0dc39bedb4dacb75df8fe9ad6037b2a9a37af9393b53c79f0503e2ee5cb91e62e039237d0c4002d943e9a3fe5d01e9973eeadb15900e29d0d5159096a28b044ebeea7ba0b34a008267774d6b60c30f324a9e3e2229255cd00213962d567ed8804ad3549515b4918612307028b9414c14320c24162005e20a79662a6b7a3af72a9082dc03f9c89cfefb3f12a788bfeedfa6c8f7e58846bedfe03c226bee17b97f9ba07143bef7deff90f0bd61ff91a372bb49c01c87318bf53f8af7efcb2eadc57befabeebd5ed414b8e7644d81670addabc0e5fa3d9376711cec2f1725b53d2d3ea68229c8813b2db6867cbffa55c88214eebf10af4296bf5cccb415849ad00a926dc80199e70a48976dd80a624d6805b9f46f38634351059c6d8f8facf1e7c02021fd81ff057fe413f536059e593e0d9fcafc390e636fc29f7b5af49d9b2619e67fcd53c6eadf6bdd8e2ce40b845b7449c1415ed4f2e78445ccea21aa1f01fb6b7e6765c6859cbf561290516829729a714e933cd577efa940efdcf577fedd4f2445987bac1a721fe6afee67917984c8a72d20a1e026b9e3baee811aa7ebba19e42e0d0c85d3752f657d415ad1cc25753f89565fd71a72df7b2f64c1fbee2d2073ec773f8dbebbc0c4e1e4ab7b4c86a441ee5e4e1ce4ee2d089335dd5f905b8172f5803a5b85a2bf3a30f0d7a79fbd2267bad0843a55050499ef4b0ee62f0bd4e2bcadf9aef74c02c7f57b9112941a05535152ce2c37da3ed76e34dd6bb04759d65400254ffb4548a8214129f5377eed6e75c03dde7bcf5720dcf8af45ee73c24dce712fef5ccc120f1815fe9a78803d1e078eb9c48463464da82cf3890ad704e3b9c80dc78b3f1dbd78f8e1b7dce3781bf35173c9718a4cd09fc78c9a503138c0f9047a2ee2a424559e4bb03cbe70261d4928a1162d0fd89b2b106e3c91162deb8610a1c699f9c62f77a0b800cf1e7e8b560261abdf48ee709cb9c7355dae1a8a5c530552dddd1c08faac7e5a415ccfbd2b046ad1ba5ce1545af55fb0052434922d949723442fe1a47153c995d46211d6cf09de0960cb0333bbde487685e39ceefee272852dcfaed003b38ddc31dde2e1fa29c5834767cbe468a966edcf2cf62754c76e64fb33cafebc354ecfecf370d99f50665253b63fa3d86ed7632bd8f59e0b9c59c682941e0f86b221e0871f864346666008f397f52800be41cf5e95b32b7de1f19e79000094b9489116ed8feb79b86e3cfe171eb10ede3e8fb71fd4b177bd557900a503703e6569d13e0f7042d1eccbe3971df3fec6cbdc72ad56ae702685f30800a077c3b5c7f378155ab4cffd8e67bdab036bbf83702abdeb31112efb2d7012b5d80394e11162263c4a5b088221e72fac2446135d666028fdc502592ddadf01ba5a3ca1c5221deb97d7118e5cfe728423cedf8d970947569eb4699568ddb372f737c291158343989770e4f287846752388f6e98fb790486435813fcb9120ac087e110dda1ca2c0021e7ad0578165bb4efd9fa9d48bca99402cde38fd4c3a11f27889a9a85a15c35800b7b7c5ab42f37e0d1952dabdb4e250eb3fef377ccb3ed98ccd696d0a27d6b59d98601780fc0cbd510ec2fff3000e1908c428b191872e087e1d0e4d28515a219d8b1d934011471749b746c5e28d9ff897bd5fdee87bc1121efbba7341c1a323202a7114ae802057473ba4928a1ee5531df3d0d8586605ed525fb77608b767fd8cf428bca565dcc170eadc28eeb68d8724007f3aa6721e6bb1fc202ccab5ece46990456ffb5688b862a707e07e2bff146662f730907914c3834938c9692888c6e4cfca2227af9711ae5480a5b35147244c78e9733fce35c9a313f24a57ba7ec42307f231c9a377ff9c3c08443134a150edda6d39c509d5307a59a30fe18bc4960dfef1ff22d1b1751b8dce088469bbdfc8d972284a50879f58788b2bf9724e4fd8d70a8bdb0938cbc1f9bc8fbb18d929ce8d6c5896edd8505ee00af0ed076379513c97c43f9cbff87a408798f7f488a108ef77e6829fb13f1cc6e08bdbc3c0e5fc22199b09da0867a098639bbd14e312f67313ff6524cd8aa6f647695b23b4cd8aa466637a9cdf07ecebc7f79988781f9981782f998252118237f49a249fef2efc02437eabaa4ec2ca8c296d0eafb2e6c0d59fdd712d2854ed97f88ed82830c9c3871a2d166ee44d433d597a0fb2f6cd1d197b2ff2b0d2c6750504e4c321041051552aa90851274210d0825a244374ca32179a1dffcf5a34365ff3f821570a4294b29f24893a851f6a7469448a87befbb9b94fde56ca446ad2173a6fa3953bd77f1dbd7a2a1906b74e4ff31718db2ffa55d223b65bba87eb4b6dca221b5d9db5476ea94fd39902e81ef029633d56ce6912ee527da3b9a5845d1d44052d4c6155aa416505ea853a68e80a2a5861d98cc28a594d6262e274d2a426829e2861b6a30c56c64c9868a95c1694007275d6268620d25b6c899b125a22e8759b0f624acd90518aa18b54dcc982d576831831867dc3084bfe0491405c4683af24593194a58d080478c7ba0b07b1217c4061304e11484910aa4989d4515decb0f5996b47c6134c415ca7937133306366e70e249176870a183ec1734164f987278c08723564491c2052631c8995d8349239e7820820a23aafcd0b4e2d2031a388882140519947a962b9ea8407606961948614697267228810e554e70f3828c1f6c68dc2309ee6ac68c7ac203a594a2e1aa82f6cd93196262545ea085259858c152832c8aacc8018c0c3dd07040861033407aa21a65fade0d256c85c076e61b8e17c8e30a4fb429539713afa2c527ba8872a246132c5255dc80638244050c3960c122860d36c0422b7086143348b1c4195856209fb2a80590724617215e8032430c334a29a535a4b9f16c13cc2d9c88a12f7af71530640142882d32e032a5b1483086e8c209195ba2a88822c48cbea8048f323255065349ea1086961a4cc0061a33d8d25400712f184b7cb8a2c68464ca091e59b93db3648d91cc71d517f44676d1434729a55445abcaaaaeaae3e40d47ce8623ae3399c699341491393353265a5841152ac058524416d47b0a1d6e3612030c9ad8486a811456b4604629a5b40b27bdfb69d222429226d57c50c2d11769f712d6d2fa92da90c326c810cfc020e381163cca78a592d6ce72e62e3adad5ea5eb91a7ad005a597d65ec3cba9b53ecdf62f956fa5b554d65c5b2badadc609793ec9cc607a28ebac734a39d7e456c173665993c713e45396491465153a6349a50c1e69f6e73eea5efd29d741f660fa18c2d391e54f00645b6bf794c958e51eaabad166f9501ed731ea738a9efdd246ec9c31d802e32c6b3da031440f3148ea01ea4972b887a43cb2680f383e98bb0326e3d3c3512bc121d32c6b47502e8577a9e0f9922543d17bd2ee6e0864ba64c50a049bbb4cc3510459aaacc023cd6ea594e142d2bf321c0783c964ac2a9870dc0b18b358ffa24c96853890bf3c2ab5885a6badb5d67e9f8c9c9919a513104602d335eebdf7de7b67ecf784826f109915f2056ba625c817ecec150c95eda94555967ff1a62748266bf24942a99a9e9c3a36aabcc8355593ea4995434e61ae8ac0a36a29fb2f75ac86324cf7baca0644944fcea1ec8121161633957d52a42f5f142603922f6444e1cbd6dad003f74a2ad65a6badb5de77b9ce0b816296c0e34c06b114ebcb9c90e9a3803b9053c1b9ef3be3de7befbd37e85624f84ae5fbdebd773a1da275057aef9d5d027b912c9152a41c67836d6ba79d6dadb5ed817b635082ed4822456eb6041496b8fbeca8c982ec576494b5d65eee41ce5feecf42c2a3acf9dc00ddbf0f93ff4ad4092b1c3e40f6a7993efce50706f58ba2816d10cf8221b0610af7460e13748c99be7db74fed0d5983630399be8db9d1852307327d97914760c03d727d96b4a94f73df7fc67b72219e89e94006552056a9ae19b6ad9d76b6b5d6722f3b152800f9a23fd6c4643b236be813198732e57298aeec7fefbdf7de0bd42f7f595580ef8f33b3d219c20da714eb0a35049aef7dbf610a77e68e539ce9580d91b877592f28679c6d6b6dbbb5d6ce3a9003a5acd49d8894fa68f7e86ccdd9eeeeeeeeeeeeb3a9bfbbf7cf15a594ca10e9babf5f0abef033650da53f44de44c2f3633c7f1f94d5e28e9412c79b92284d8928ac4d093294a882e5f49d9b98d372b7a0ae81b3ac29b194c71d777724cbf21c78b4d6a75f80d9b1ce93334d2447a68f650ecdf44790395fa62f57344907fc79c4466a68f2440d0a0545507164365f741c1e183891318314254b40cde60bd69842a4650a1b5a6618005314288c28220a32c498c1e67b2190bf62ca32e4648dd7ab103a8f2b64ee8736a594ce96ddb4db5f8cf44c6166f72a08c3cfa4483a5b3e97a76bf694e9906210cb1c9f3c78e532e76ce69e5f573f5e5741463a1ab6808cd443d6095f962d1ac9465640da41cfdd861439e2ec5fe6642f2f704e39b9448eb1c111187e56dfbe9c197105bf6a032c75d480c79ff41b29082f1986d26e90f6a57235658da44c5985ce9e427697e168fe57ab5294e77320885966c053617ef5d084509a309f8626ac1a6082875f8bb706782a999ab2d98e689a4a70932c3f4a96a1e8044b28624014035a9eff29c15d965048a191e78772024a0f68ea9f0fc4ca8d006330c1128aa9a9ac9425145347f96609c51493cc6509c55418f921e0c9bfc1c6c465b45bb1a9bca02a2c2a6d924314d60abd3908c15969b24265c90a94a31c7ce858dc8783ca637284779cf15d255668c02b1a25898503961737b272843271e170680206479635261b66e2626693a31b1dd3e7048e2ecb1a1313c5a186cca7f4e12c6b4c471c531113110f2d39bad000ebc8b2864454d3e4b6d0a1246b4b8ca0515ec6053b90c8b2864411b659d6904041ce013482479a5559d690a0e12a53b71260593b22cb5a155be672c0ab283c74e0d0a3f54970b6807b4c1a96b52a4f72fe484399203c39f3d643213cb4c05124d1f22897f4286b525443eeef9f35c89c99fbef0fad50c55312a799fd0b0e9120074ab3eb843393981242a40415646be46e69db32d585ca76fa7b8872df21b5052cb32b040bcc589ad9ef69fb309ce309d3278fe37c565186e5f36bffacb09b16e5abc8c023b56e6df5e06816c164abd7cf831ab07c99bb852c6b4520c9348f34e37723caa791ca52d6c1511ba1d4d3cb520a004d33d0a47497f8c9c7f2658ad892251879fcba02c1dd7d4e2b93fded4b4f9461b9fdd91e98b962a96fbd002ee0d148a674f543a9c704b66da891b96f09036f9ce6c382b950464546387efe9eccf190ca1aebd6561b952c597e361a2a621ec5a8b6d567be3c5bcb37e7ec615b2a9ade94d2d456adada39b9ea0113a266b4648551a952d79946549c4924cc4960ea454965fbdfb65f00ff8f38ec4b928b8ddd0a57644152a33f93e12e79ff002ca852a5b2445cde4946b8626490697272172f004c40c6b787f91299567bc60065150aab480893472709fa25b4120e10213313859624412417c914653104250a1c1d65e4cc941a7ba49652175ab8571b484098824b2143106922442425a2c6a33e416336a6dd100420553b088e281872e6ea6688173a2b4c0640b173a38f961ead0177a3e4d410286292ba033e0a323538a5c58b01e7b1c96e1f0d7a2103670b3244a2a18f744868ba45f7249938e05840c99e338ee599ccd1cc7715c0d4cfd9235ee4abf640d59fa25fbd35032c3540d6098d190044651d1d1163114416581618684b602286450b2a45f32734a9af44be691c33e5388f0c771b521bc88212222c90af2086bc25d96b52447472e2c6cf0c69abbeccd4fd2b428ff956b720b48677f9b3b7b734e98ac45297ee720954daeaa1374d97c80cf60ad2033cf5419a84b7186524a296d77984c75a3474f77da7dd1e4eeee3d612dca27eaee1e1add17f80b8ebadc599352b74fd23d07ce53d1f608d0cb09c151039eef7f1b50bf9bee7d35046f8ba56bce564b5f528bc553554adbb097738ef321da7476aef59dbe676add86b27299edf4be4bd51c95a2b5be02e24dbb045fc7b26c4b82e9f9ad25a0b467dfa64ba2ec39ce23215ee06e68fa6568ecc8272212052b72c32073dd42427071032d56da30326256060da0dae09246134ab371d25ce3d7e35e5701f23893efcb36f2bdcf61c9f73e4b698c7cff8748caf7ebeae732c1aecc8932c7131eb93cad9c21dba7f68590ca96054bd9b2b89f4ab370e5712673f4f1925c8b4246a65296c8f49dc854a4345a76ef798de827187c944e144c5083c28b5b1b5c6081640a065048a0c48821ca1022849862835a932e8e90b62646c020858818b02c79141753c6a83d7c90f985ec5fbb16c413fa7d363300c3e33e9f3e80e092c320aa42c905509214311b613f9ed490840f2ec020098728679860871fa2f8e18b2c9aa64d6f71c49729a6f23019104bd8e4e6b82a3c39737ffab997b7611159df8625f8ebbe91d988bb49739c27721c51d6e2bddef5c2499b9836a9802a2ff00b388dbcf842d6b1ee3b598bf7650da22cf9409b5590ee5065a63a037b4fbfee5feede2bceb7a1f88ed31a626466c3f7d77d39bb8f9b70771fbcd96b39bbe94bbfe75685de0d1b9919998dd236d6dc9fcd28384efdfb45eefd2941bafa7eae54298430c283e0ef3dcd357b21acc57185ac0aa5c42d64e9ab9f36a105a4fb169059f37c23b97b2399ae80cc50caa290a8c46c18753d0a15d508000001054315003020100807c482c158288c3361f70114800c76a04c6c58990ac44990e3304c21630c2180000000010364668666db004c017a926d11c4130752b15a602131317c6e6a4bdd6fedbdd5d5e16cb797238b705e4ec4bf2adcdc0e0eae7e5e7490ca1e4c3dc2fda0b0a28590e934039af11f15557dab4adc8b9b003345e28d8e3af03ee2d02dde013db3a84b0ec17709c022b6e773912f663de7ccd62ecf8a48e21c907ee84d69d7f3263bf103d40285a56643ce28ea2b488998947048e7732ea6a833c311084b4ee013ebbac7a78e23838c13952dea58611784430c8aa0834c51a9f7fddd673d9a64cff4319bbca0022503f0f72e7c75ac58e032a7897f8c3f98e51519c54cc83f9de7ff6c55fb8badb0329ea7820032f9407be11de6d0c92af4868ff8273a2321aa14c5aed3630fae9421f1d729d7675c21500fead410d52de529413584a3ec0bef92257cfa60d8dd07cc3d0f48bddd7cb5e47599d650d364f6177669d8d7639fb59de51bdb6cfcf47a5f3fa5daba38e9627ae8c75138f24f3d4cdabde6e8eb7b1f26802aa06224f90113b5faef365f48b2a1fddf47ad771bf959cf960c909f8a4c1a6afb0e267ea2893ae4df3ad5b43a0a2d3171b5e71576dbc23e791ee7ae884c7ab35bf2ee467cd9ed31a2212ad5aa6b57636bab883d53eac9d91dcf306907d3d6cd678c22549617c50af3be4b66a5c29cf15328250ad7037d3613a78a83f4de9796dd4b36b353302dbc1500c040e77ad9565601c31d0a071a449edc868e57293a8e8dd58ecf66706ac10c6394d424cada709f7582bd228b2f43e2264fa399b43c7d4f4aadd21e3f22ac07f53a923dd0e303ba9cea8b6817e7e73a14ca4a26c6a875850386e9c840969d532704dd7b0a91b57f7db8e458cb8917a983a4ba1a9090df24b5dee710432ffd46b8f5676148313e05710998a075840e4cdc84ab881ee440a11f1bf8f8dba67046c517f0c2d9a6d005e24c58ab6ba5e9ee505e00bf930079c159bd33a293e57e9ef2203be3a7a970ce0008565cb9ed2597a5b215fb090b898aad0020af86bb4252117072469bb2ea4c19867126264c4787b7192f5ef6f100b71f451d3d08a2f43dca4acbd29b2bd614d1319ebb84879c855d46050e2c1219af6f0a60ee564769d75a910dc0e19c343600091a02913df1994fc869c58af395ed4231381366d87717f9b5d94b6ea8667e3bbd64d2ee654e35be1746c384f638c1bf66b152007b68c2df56078912faac660bb42b38c45e0f2d93053b3453cf38c54b41577fad46014c2f2f3057256068158a832359c26d65d04231a166360ee69685a434657240cd7f0b8d7f0ad286c3aebc1ec117092b44e93104f087293944a306d0c0f7421a4674d503754b02dcfd4f087ebf71bb2088a23358655741758743d972f39223fff673f510d516a1835877b2b61992d6af8b6fb7ca2bd55655ab098d19cca6b154826e89791a7ed8e274fe48b72ccc05a397e22a4f812fee25252d323fc3ed277932ec1cca62c2c1a4459498495217297183712ef00474981891374f0815fa8121afa132c745352e9952bd50495d334fed7a63745e2fb0337c4742146594cd34a77cb18603aee20502a81521fbb294d2f959881695ade4b3f414f99620e2c9473ec8da7bde60177c80aacf30699188ad9538d01aeb277e58eaa68ad0444257803313284b861bc6445c5cca2fe8553c85edd080677c6cc114af3011736bec038dfdfddac6bf5d6fb9132473818a6e29aa5749a8cd9d5932614ee8df262b091c226c7413d1cac9dd047499af9a478e6595522c8b060051bbc47f83d7adee0297f9a0de60e0b1de2b9d514eef9439bba12ebb5e704674ffabedbf20b14e6362755e693e586a2ca23a7f575c44ecacf5cd223e172536de5929f1206d38824743f5ffc1c3d5c776600c436d9ac9554de13d3be8e5d76b250616fc39bc71ab038503cfe5cf2890a72f1657717b04f41a390f6b9d204174762b546bf76a86c22b180deccc53e9a06bab72b474738b97685559b0ba0f2ef220f7a62ad65899a15fb0088cf0b8700674d40fe9b90298a0f07280a5f4aa2197b2c8ea1d33cfad4b1d3149f04740a9700aecb4298f5cb9fd80909fa2d78651d76bc083f97034d553d160c483f4b764b91500be3ce82b55265aeb202964cc3d6c6db02665c8d7164a2e78359a86dabcfce052448001b226979e0f19cd0c0eba44a73dce23ad60dff14ca36595dc08be939d67e90447beda2bd67098c4cd67e79a0e3c7080016800f14d38282d43e0c52587ebdc49cf86c3418efa90828df29b5be027de6949b63e3e7861465281c913539106a84b4d1ad2ab1168620a61693b38728dd6d8e0ca658a503b07054b1505f80ef73233528db049b149b8144336f2d8ff7a4c1b4739cdaef3eb0e4fa0005373620e21c209a49666f8bd516aa59f99f1369d8afe861212420ee38976b7c02af828851c3b07f15bb958a2ea513b0363785950fec0f4d2fa11de5726875cd9667b462dca1259f9938b18a081001852a1bab7266eeb1dcafe876220cdb089597606e299e28b2207151a2a46103f26727379f8c3e04ee65e4c03fda202d1432f0433ac62bba56b43c8c204bcb59cf38d94bd5d06bea452472cce743b002415c7e307453c671d5abca31f16b5f49c7b2276718bb969d5c8ea3d9652097fc53a48e56515ddca49ca0859e6de18fa96d5809896d7801f276336ccceca9406e949a83881a0522a6553b670982b629fe092ed4a78020bba267f3d1976d8332a6a34a711c618e9150d8e2503ff4793104245c6d83a694b7fa8cdd3677eb3f875bd93af00071c25e5d199c1d063a0c959a802b07eeca10ea1b9ade305f6662729faca631c883054a90cd28d88ede198bee83f7b094213015848894f395a8d77245faab9a6bb64b2944f92e5e711647adebbcc3188324480918b0a894f5fea43ee3cdbbd2edff521edb4a76c1c5ed2134c2e9d0891eb8e130d4a26729c2de5cf78c6bf9e3ebd8dd7b9bde8d333e772c264fd67a1ea8c044a80e021b2935af19f187b1a742b2ede3a46cd291e637fb75afc134c29e601b46feee37d71805d1c1f114a185ecc516ce52c15a6092294938354562558024350e93974693353788d82b114c9a40ffc49c54bd8d9f3be76f88fd22d86d3620f2468bdc4c1acfdecf0c5d7cd55358850d763c71b5f69e6f1041b1f93719e51e63b377fb80d6903491c0cb1c15e533578c39c8308a4e563c4ce89083fcac71ebeb16f6425f7dcc13d46a6aa425aaf0166eb0cb7ceabb482003ab5f5c7fdddf2cc2245b8882250ef40b554969da5eef77b35d06a72d7dc3d7bbe30fe0d21413979bfb24d6ab82eb578823c5cd35dcd6089fbfd20c71572d08b7e18f25b7fce1799ed72719e100e6c7efeff3a84edfbaa8782cfb2e7323d723aff626c518a1b57e08d2a06a72ac6c023be3473bcbd352a39e5329403ab710e917f84f2a6902530e002fac490be22e9c306873bc1a27d836d3685c8e6aab6acb39278789aae14c8cfc55232b00637c97c1b7be935af4eea83c318e7c24ffd5d0c5aad86943d393728fbe8c950320609110298e5e824bb697d49a8ecd67f2514f0644a9c83e619a8b0be15e01f0d2225386aafcaa6107bc8bd18a4c50248d1d93fd9803ee4ff6d83d8301be4b075e06c147dfc0397494e036e578be8f87e2560063978edc0bd0d10d4c45706e5d23388d3e34509b34bca40b3fa5b46402be816b8f51e0b08c94b3a903c6c8e6003e84cc41f43013f4cf1ee8cdf1d0fbc02d4035e3c23b207a4c05e1e384a719cf86328acf0a20f62cd001d94ca07ac1347884f6d969b0a033b3a54dc6f34f75871764f0066385ce2f876fab885800cf7cb5322ea5600341c142ba9080319bc4e5f6b29f789ebc4ce8b5b430a90e13c94c8c6a1b3ed14057bf9089475e539cb2b3aa925b7b8c341140a4c5b0ed350335a51db5d1262d59f9e928a8be51edafb581bc3e19a9ccb3f9ef0ed1cc78f2f5a6b4f2b385e0de044b106d1168e37190e2f6fddf75ed2cf8df1ad069195e9fdd41b7bbb40075185e892bc5a9f8e184a0275a14700de0acadf243116d8bdd5939a6855ed12f4ac4bfffdc71846e14159ff336a882f1e0ce1eb09135c2286191ab442e72f1350cca2d46b25df49d1c0f0d89759378cef2d2c99fba722b93c91a1f668a875de987fdfc2b6c0191091d30627281f3ab6c5d4def14eb50d49bd9e7ef7c5a45166810f3f166557195326008ce61d20bdafd271149cdd6d57ccb60cd6d7d533904c31e77d093f5ef31775fccb9945cebcce8b30dda364bdbe53c8befa3890365ced336991e817f8cc0d126a8aa869b936325f674313b7d4d1be411e13587dbcd3a54c23f09db4a6aac38fc5c9f022e67e7a6b49854a5f9c8bee1d178f6a9b2343d4edec70f245b98fbd30492c6d73054b119ae38ce26cf797806331f9c66ae6535117457e795ffba70ba4d78453bd7ea1bf9e7c02edd7fe6d170f94f77fcaee72d58c6ca1cdbba3e1938f745a402aee7c3be888ac871d91d90a324e9ff02087f53a34306065f8268792141b40ea7ff6c704080c8d444ba7ea4e00a1d908477902220e53980b2b5f1cb91849e63de2040e98f9c0f575146f0c5831c0fc5810c58d1c72034e2f975fb3c2f38ad01354c451cc46349e2157f80b1556533f441b2bb4777a00f5a8996924786f983d9d4b86a55c31a759080523907512a08071c645543093a21c1620d7fb0f0b2a1dd32db76e030cda55df62f92d40435890c7d95b4580baea0a73fd271d29bc9fe1e2c202fa0bbfdb29a3d643075108e5a7ca8fbd83968d7381b71e81aefc06852d3eb0dc777649974b6cce1fcdf1c87596f07f53f1cfa059ad22244b50594373331c4e16edb347d216f91212ea80a85213b5453adfde0b3c7c558e397416900e1e34954a69c1457db9fd841bf9b423f90f51c535d09eefb488938220897b6ef09b53b24ac6371a90d6666a9bf554ca7b104a354a6d92d40cf78175ef369df4f59b55711ad8da75cf388bf3a18332070d06f13009d016748f0f10de5aa10cb5bf3a28b897712995d9d24c4bcf8f8e1e8b79843aba9e5b35856194ccbf5bb1c2e1df20642b26b10f86daa5042493564ba741ed55d2910f58014cd33f7e39536c6f30f53c991503eb4e6e6656c05d25bd63dbcc112fc01e37db561b2d48136bf69ce350888513588dd10bc66e1f350f05082ad1b9bfccb57ea44fe0abb73932533d10b12e868e1353895114e25a5589c9d21ffa4547d62aa41053cce8b520af91188c1f86c11ddd952c6b4950d3d4366301177d2874a7be89032363151670d5e32be5d7f0c216dcd4b945793d579db606315aa73e8a2b40e888407677930f5cbaf20620f6db8bd23dbae14b5395922be99cd78d3c165772fa97dd79132b12fe97fd3c122b13be94edbc186a25543871cc3dc04d326168ae1eabe77dd6bfd5aeb429c189fb7267e0963a8876ad3967c42a99d850f4012a13a9b3767fcd8cff02bafa02ac5fbebcd17fde948abd72714d14d417271103577f5e17a92919ed54d847697fa429cbf75bf362746054cc11bdb12c99e0e30c9d642c165e1c4c7cd50fabe53349a76cd801d4b47a7b4e880b4135fde32db5a2af80f9275b688828d31218924a1130899d3df1d1a019cc617be01f138384e3f53077f9b2dd349236550228e196bb32f09fa2bb62971c86108a8f03d88e6218a32045de85c295d2eca570ba5889c24e58e0069f61fe7c71df9cb84f20cfe4490f55c23f7b9b5be86b14bb4e9fead0d7fd6aa5913f299bd0aff7d1162232222100156d4bef93eb971fce8da9c86e85403018ca543470ce1070c0f1903a4b4f81e3a4832eec2ca35e24d0af5ebe2c44445e67c9fb3376e57be0b019bbf932c7d1f807a98cccc7ea40799157291ad3adf5614fb3241fcbf774df85266827242395e5c6c7db16e43fe3ed1f0c8f45c4c9638a05dac9fc592f75b0b6616967b08e7ae212f5ed86e30eb165fe46106da8e89ca9b6735e87c0b56d0ddf3472360e6979f4efdad4c825a83e42b51cc102af56ae669461bbbe8b8ce62b7025120a5cb89ec00968da1ee3b33795bfd3b62331675de40d647969f70c20be0cb8ef85a6e395b46da489e2925a0048a90931c944425fba9f5ba5b0553cdae47c347cb6ff9f70c84a139a250b20dd13896fa3ab0acfa4a63620dce2038ef53b7588789e437af9334ce62318f71bdb3e5320cf1fdaeb1b4409209a94f5e845e6e2466e787a43653a45e699da00b24270d41c9443053a7ece2c445e806b734a508a9ef9830773401f87466925e23d4c8f8a426206b12b79e9d168a9feb96ca9eb2008cd67151eb7829a300a35eca2e457ebe5310f0099df39f5af407a1c728e5de5fb5d8aa1e39e1017225f1fb354f3283539a7637bb33f1b86242f26ba14f466dc3e958bc5eba056b83862d7320ea8b8f8275d3ffda1c2f393e63f51cab4403248b429984f3ce9242fb063ba9abe9a537481762ad615d85a916a7424bcf2144050bbec91a74010a490a0efc936508ecd3879409fa895e1c9a74ac04f92c5880622282594d5dbe3785adcb9d5aae6ccd484b05968b09be03f194270b6ec1ad91383150c3b32012d671f45eeee6cf5159cdd75b31566988ea1dcf71ff5899a463e18a491101d0583d9e0c8cf25ccba4a870c3986e40f3c5a6a9db7a4e0bdb606afe3b54278040bf64eff4df3bcffddb87c8e96913529a90928db9500f2078ef239c0784d8b098a4c107e512755aad461fa556f9479f6858ec1e5c3b543fb2ed84e7d3166f267897585f49a82d1ceee6a0098e1b641bd41696ec4769d54b20ec66946e3422b4cc84164ed17d80c2b1eff88c2e6c9119c5e21c79bf44d10a10c41f087b334b1cd184b98803b46118046dd78e73249215983105474b3dc4808ae4664ea041ccefea314ba107e256605c3251cf006943dbf3cd83d74ab670d73f682f3d06d29258d1191f8e27c904689c3e03598c205d2cf4e629c6833cb235d38b69c6638e43a5b23369ddbc179d99257127c096e2d0e40befd408fcc9e3ef4f59b1d0d8d304c91bd646c83645cb80638cfb133dbcd30457ca4a20794e0e760f0a90742324bd972d91d3d010920d4ed481f89fa033cee09f2cca7b121794e9683662c25910e517ce90488731969ce3039a41d5b3da47e89b8c3fbb675e263befda9874caf3e889128cedfa97f869f6520c36c533cb88928084452ecb5c9d6d96ea5a19539757ab7b6e4d6a2625a7fb33eeccee8ef73352984b58df8de3097082b3b3d6c17ad3a880928b12d579e9dd84b6ca7a3698784d2b97bcac69df9af3f10d9c0313658530f734f944befc9c36270f3118dac9d5c58345120bef2f4555e63ccee7cc2649b5009a4545197a357ae0d676b5866a17cb9deb94ddafa9da32ffc806d85a23478a39744bdf654d5d1f22bbc89e39cb1782ad4b7228d34dc3ea823f2f0c8348f7e69d1498071936121ef6b5c8fa5c65d36aa31800cb83cbdb90f361bff8f2c2f77723d5da47eadb10c94e495277f6b1ba6e7543a89b1eb92cce5cf205e16cab4d2ca73a2ca06b9f57d3f01ba3148373f2ac061d7436e536fbdd67760f8543c511a5a20c87a920e491205c80f51b9828bcc11b404b12f3a1c2ab6dfb7bdcb12e2afd9f7fc7bc34c1b4c6a4e6a2a0f0c214921e296273ab2bc0fab0c1f2a927b543599d9fc09f2d5eb966df51d3de3daf8db64c652e7323d8256e801f42b835347751c98bf84c0b5081d06d49756c5243a5a0f70c9b78d7e987a5e4953646c66198d82a77b5c056ab3fc5c8bfe0f36560fc09415c87ec2aaa6367d44bb15e0d1729a0eef1849e498a34d633a48ca79d0aad828ced8dc1272a4a26bb595166bee70787aa1683a8596f947d6ce811719c964f5a1d7d3d501879e606c64de0027af56ed5b280422ce1b7c3caba3606ff7da694858a767c166d41a090d808c6c4403ca4e684269decf29fd835f4ef1a2b3fb68f7392c9e34463d458b26ae4a499a5305ae680245dd638d9463b440f84cf8027d0d21642ceeb8a5ea662c406e2a1abd725f9fd7d666270b266b2f52babd7f71502a331f4541d7f146f5ecb63132261e912fc5d8a6c81054d8d1871ffe0fe9e42c0c749adbc8ecd0c852d749731bfdd2d454508bf17f54eeb41491e70320ba5c5ecc46270f469e39c1e6aef61eaa31ad082e570d9cc926c154bca27e101c8ed568ef07901fec56adb450252acbd1e42b81131e17698e88ae4f917b490f70326df19f170ea0381f4784b939961a67f7f7e88eb995b6651912d08857d964ea12f3c2ef5be033ccb2c4bf219225f7ee86ba128891ed51608996a512e45f6e8ed51d05294d5cb6e4b425620e3a76a90e550a086d762f8bd2f625682e777843c857b7f0328f800d320a24b7d3cd3f5cb24e0be57398484e445ab736c8e77433f5a6708226e4571903d1577139fb30ae5be3c717a1803a97f0455f1c0560eda7586e64fbf1522e15b4914ccb7fa9a8292894a9dba89fc72cbd88e19c0e39e425773d523f9062f9299ac7ab0f8ad6fe80805ceeebf15fd98a724f856ff0e7c0df547dd6b1c254f08adea0770665237d623af3a4bcacb08ff41756cca398cf7099cd512a7911db71788c3bcd1065bab756215bf19b16cf6d12d1de55a041a82d85b41afbd71f984f6cde1251b3683df9abc3a0f8bb925e6779b1190779c0568578c7f42cf1ecd889137369df11693abb9f8479c98645a7156db65b8594ed4d5aacbaf5a7ce113b97818e89e3b07dc2e3b89a25406eac687c7ac6766b9fca2bb191bd8e94887d72f0f2401b0834d01439d535828ea8562f98158e8ab14d8ec7e8c46f149d311c8077ccb7ecfbb994f797bf6158c6aa6dcb89e79b15bc0f102b18ab8424f56517615047594fcdb0740d50e18c398091a71f0cfab3a82d2e927554d75cc6e8e1c659543cca5d97908c08f517da2ea209497db7ec357e4ce51fd4c5896bcb1a1e3b6c4e1c053033aad76f8839541d9dc63cf2c4488c59f519f74745e5c7ac9b4452bbda09d5d8feb2d9fdb47461e5418086dc782e249d6f2a0678ebc05760d85dda602299e861afaf85063503a1447ffaa7d95be2ab3ccdc4510be89694ec662826f9cbc0740824d01c172188cface96c3d3539ff1f68e23145e00d53419f28fe041d15f76439bd0189f905b74b13179eceaa38cd88ae9af053d3619408677580e76bbc1bdf3bc7f50d64b7986bbbb1693b06ed7ca912b26d7767ef29e7e6640eb4aea4dc52576b6ac35da3601e7d91a0802428c1dff964cfd7ec4dea86bb76246c68e4ebe88cb621bc276c222034f47ea94c9f034abda214e223f2b14761d360b9bfc2d601ba2b79afc2b8a4a5bc4a38ca3b43a7f2bd65c5acec466491d7a6e48cd4bc968c118933aef80cf91a494df6a63c18f9391b182795c1e63486699943d26208898cbcfa3319b3839dad941d74e65b486f6ca87e46340b8068a994a6eafc66ff4038eff76c455523790438fc9cd904dc2a98d4423c375ee3ca35f0cdad3061af257fad6e753822e574ff35d70e315d9c9c1907dedcb1a582afb03d7c047b610f286a53972e5491904c096534645375343a0389d1c269e581dd1b9e62e2f4b36ef6c11d2be23b2262687252e0a02cb82ced1b483e3f729de7a6945b82a4db702bd8c865bf32c79f62cb40f67b2ec79e56904c02a7701320dda59794f164560b9a88dd8cebb55ec930e83b918d0886450c2d713ca464aba4495feeca9fa12b06967512dfabaa03549e0d42acfa4b36e5e12a888552a0bdad5de48feafe3790dc898745b67e88239983892881b711d5a0ae2a35c3b7748087d670e187c0c3b4de8691d82560a11d3ea96a4512352fafccf99e4df9885efd888719b8dfcd3111cc41dad3328eac01e1d9510457e6e1c8354e57c70f68024b30e4201be2aae72c3a7cc5f589bf80f269e32555db36e2d5170e10559f33a4779b7e67ea4f3dcb5a5b743921878d6118324ea090295b22d151d9ea4215dc55eeb0855186b7667c8b9326c842b6986a88d868f89052d84666386810829456e3a4b2e54e79c17ac5e1e3a46eef7748c97bcd44a224f6b2ff5cc9734ebb59f18f03ed87eb7942dfdc78570f9c6d030033c194e35ca2360614d624348999e252882db7744d8e89a98243838249d8fe00f31359cb2abf863c9eae258629744c1ee4ecf991ac82f8525d702ecb8d848558dc87f9f1bb85e2250d72f7fd72cfe5d6da74ba9aac906eb921b2c539158db0a0fa25805421cf4d99bdca1f4908f694dfe0253a76e94b0ebbea1a6bc5e44e2afb5e13c6566e19781d91ac399bc8ad63d2dd7798e6103a13c8742660698206e5547eebabc9b4dce8abd711be7b70f1b84611f984de9532aa0a9a6c4c1946f47c03da52ab633ceefcf07647f5afd6302b58bc5868aa3dfde13029b5dbcec2afdf06c29331da27032b7fdeaa106ae2887c70bd1b4290118e03f3efcc413e1453d5df5c1b84107b4d72038089e5794b5221f621b578b0b8e7f01601ac6ca28f9b5a0fee3c6e1304a0433bccb8ef1efe16609cbf93d8bd40a488e47defdc8eaba21a35ee0bc5a899d9d912a8345d27277b418b6dcf8a1741bac48643295c6391598ad564c59119a4b1f80c3d467b2613cb7e86d784999fc0da153ffbb4831f17ef4162baa108c144d5a01b2aabc67aec461e5b5cfdc56fec1b99f43ba332aa8fbf8fafb4eb0e3898d675409863dceac1d5f33bc1a83be68e6c192d634095c99e8606c643c620e391d7c196e1761b6be9ccdb4e47215ba8239254f65d298bce19d43306fa3d272f185bb6e364cabb81ed3be7b64fef67ef2a0ea9758e234c4e81ef7aea7c6fee2a30f6f1816b097c715f0db730c56bdf15f97caad7982c78190c2552137613b9432f38507993cf7d3a5bc0a9c41219222beaf63dd5f7da41cf6f0bc73b4757273e8b211972df4aa4c5203632b7e69b695d2faf7982d7f6f8a5845741c1c6ca70785f894c6e8a949897b1b1a762513881b50c2678fcf15e0beb343c3495627adffd1eba117babe4c7d63825510684f9d79c635c336ac42f76e936ba6263f32283fc2fbf0f504544d92d7b1b6a427d19f519478bf2c401a874bb7961b07c75f928d5aaf75476404d5da4165c3cd0c9be231399b44cd98f88a7d2ab508a4666df9a0a53ec189603a7f03da9b142194317ffeebca9e906aa393c2d60c1cdab03e964d5eace908905a7401d42ecc7c45ff3b2679e852226a5d7b6ee28b194f1a14c2cb893a4afdf44b500aaea1ddfffe18be797da81152306a74d94653428393cb9ce5934e492c7c75ea67435c358005d3ca93bface5466aff3c644504912da5c0772d03699ec4b557f1e0ad508caa74a6b83c940fb7af867d6a5ec86b7a4a86c0f4a22a389b931d704374dd6097cb4019ef28c40b10f2bca6067ab4def0450392794d6a8009dd75dc430ddf88e73720cf200d45f94a16faa6fbf9cdaec792111d09e85a65ed648eccf6592c33b421117e975764cd777704c37ee3caab3059ed1832bbd74d809d100c7e34eba8435831203b5c67373c19c60e33d05cb31942aa3aa69fff807a0d84c628a8c563f5a8d063ea688b896e71e6d2167244f37f2f90242b73833a227499a2d6d48bbc24d422474e4ce59711b708f66ac7248a793ed7a6a8d0e066f2be894d3155bb842108789ce7c6f4de5804dda8636c8ee73e9dddadea52a638403fa188f602b8b49a4020c442822548ec40d1f24dce0084013843132483245c8ea1b8e1abea3acfdb4f596a230e0ba9bd61b106282c007c4121c1433d5c599540d7043a437dc23807ce743a6a10e53e2416a1d49dc3c12b46e78c0356a84925f2f0a1f31a67bbb8cbfe6383c24472c0a95ca959ff3452f400792d954fd963ef994a8e5edf3a19e6c725cc5671ed411462befc9df16d61360a847791b60b0f9c5fa631fa14e83145d048aa3651ea9fdd463480204837ba53afc8bb628eb5bfa084021a12e6272087560d860f68c2ba3cc560644a407f25ee5cec10f7a4b96110e5a6d9b5d209995113a6a207f74b71ae442e413b8553372aeb9bc2d2212d2bd430b6cd61fcdb6f6af1086e3c5d9740524d216f0e772dd8eec979c1908b60d8d89319436b3871bf4741e231972ebe415ec1b0c06a916f8a1ac5c12169013bbc211afb833c18d72da16e8024880f96814252323439fcf10c749c0bd8f0f6cddfc8c95c554ff5889e33d480a54348f342c9f3bd646af3b94fb4c6a940be80a6b6ed8e53c11c3fe47cfa266b4d94e4a593614224936cea2b44dd5c08fd856db953e76a160392063b3dd7f53ddc9a92dcf4cd524bbb76ebc33a1b49c915532e630f949779d6b9c64c2f24e3c4f391d144f0f862c6e019e1bd72c843913631d022c3017f24c3dd9590ce7b3f7bc80ce1a9542efa4177493aeca3dd4baaa715c93f9db44ca5485c0b4945f461610d05d71ed998cde88ec42c4acb29529a90147a94d29450cd13ac8118db6038cf787bd1f40f50930d0268b0b6e7b48eb64719c9f6e426e2c5181891a6dc9fee4f2695a5a1813d17b713f32844b881355a24cc6793b018c5af6761540c175cbf0d514645283c6084de7055297fde1d3c0714b945f310b5d807e8b4ad3c901b4c19aa611438653a13b213152311129cbbae62b5e475f6856411b1a25cd9d20490bcc4c3da902e7fb163c0888a03d20eef58729c1d83091d2fc474ffcb8cdc32a85e32c22b20f7cd4496f109957b86d90aa6e3f5c104542223d17c24ece85ba36737dfdcf174342c1c857f5d2b69049abc20e1ca2f1a0529b119e7c5dab39fb55af2fdc41d1cc675707bb11870554051fd91b6119519988da4974a9b937109f0282ce2ecb8b8d12e8f90035bd4a428f511a85a3328baccc04a4dd78d13f27ac271f333786dbb83c4a2e480a5ae31d2141ca34905f7693eafbd601055642fbdbf3f8cf69895760db1ddf6e200571e38b0b5e8dce929eef322787033fa7b599a7fcf40c174d33c06042b141198406b88252188916cda6998573daad66dea074f9fc3443c659cad55d1f06323220462a1cc493b214a59cefdabb40e4bb7bbafa53636b82e6323d5956463f5d0c780dd19c86b1753435bf5deac40857f457ba0d713701596919aa32b5273bff40aaa89a72a9f192f588c1ae36e7f801ac3328bfaacd29f7c398a6eb9bef6a2b90dc6df9d51ed25b64d2cce305966a5027f1408c50538c6eab5329f0ee810a2ca86364ae694f01d1e950b4a340c33deda96b9d655c8c2ea8104a2a80c49d464a0d4c77231d0bdc4f875da6a64b3d6b1e92ce5de23d7247e55cbc18cfd73d0ce830d06b0cf8a851bb7dc4cc1a2124b79dcf9fa261c03fc41990de3964b96fad16452c29e3c86b29e8459f3acb1b4c0e4441f588e5470fada387439860661c977fa964ba9373ec8173f98f0eaa34e86f40d90574a009320caf809218de809f810232bd73de46e9b17b8670527629a49deaf5a70859ab525c7a99fa53880f45d5e0be5c8011cb001d6012e0de61c110d3462cb1955c0c906517f40c94cefa5518b4ee9b0c39dfb0ba9217f0b3882611644dbb1fb668fb5cbe7b1a97243da5c471f05ef44d1f17bc00c821391caa382f8ba839d3adb1042c69226425300eaa06236d29a2ffa5b314a995a747839279a2508f22a085fa6de4c9fe55e10f4a2e0af2b84ad6a39aa3d9e18bd4891c1ad123135b07a568ec84171f366875cfca3e2a76a48dc5c4953837bfb583eba42984cbe7108ca4c615701d6b8686732a2ed93188b4c78ae5e52af89c517a0ca58f2dad9551169917c4ecc6ba1237ec62065f1a11be2bf16963046f7bc7721f0ac1c6a3bf95c7e33cc7a3ed8c9a91fc54c957cf29333336e9bc5541f3fa4ecab2806ae5a9f2411d7a1f29acce32b80382606bc7b83aa9f2e114d162fa62b997cc150c938453b027872da5824d66c5d399c86b0576b2d2634740a8c83a48255e6307e2ee049d6621f98f809a5bbd3c5897106fa89236ad9b0909a07fc27592fdac3d437ba141d7694c60524ff51469d5b30ed45331dcc791a49cc8fb48590e3e64c88ac1d008586df68bba7eb5bfb23d4428ace187ffc9096b2ad89358e2d051cfbac4a04f9c1d31088dd4004d816601a0de651f85bd6c04d5947229d147707eefc0a6a5d7464497425696929a7aa509b0098884d45f6032c25cec2c8f69469f9cfc1d1206e39caa91d6409fa82a66cdec0de0745c83560a8db3b14c81ed05be2532b965b5b39a9ed917da9682b5563a79261f199425fdf392954c00bae73dea455576ceb5f0ea0ff9ee38e6617a11333e20617111bbc4b428d5373681362f5c7195a241a5f100147544ca3c5ea5e3bb0477e52a82c708f9cfc6d7ff8cff1c634254091b935c8617a80e28e686dfdaa7c0563aec8e8b1ba9c2c43820ef303372c745a19203fe44dbde40de7caf7fb598a332da1604dd35e9d75e7dbe9994f2d5296f6e3ed1505b5f21a79c6ded74461dfcd8a14c7076932d2aacac939436395a6f70627eef555c2fc87ed38135fea8beb35670a203e6a187354a7fe69fdc7f9a96bf4c49628fa0e15a9a1b0b0310f90a49b9faf3022b9c5d9c1dbdf88954a2161fbbb1238c51f765ddb0eba0d8cc56ae8ba26689f17a28f301acde996de70161bfd4ccc64a1f8b63adf66add88d6108822dcdab373eed0eccbe4d0082eb8d2e9cd9ba9d7a9fbfd56b69795257dc018965d1ab6ab03071dec5e1bbfb55500529ae3f87fe237e9dd2831c98aa4c595460437db5165066d6523e3375d8fca4ab9159e1eb003b665e6808ef863223cb168f706209c85ef362bef9000388bba851d48eaf6fb2bf5d7b2591214df8f7a0a10158c7925fb783df4a598d5ee7d146ffe9bd284aa433177776e0b759f005bc92a7b63771955ef5ab91363af29efbb7cbf3c642c12937b464e0898c1a64971d60aa17e714bd048094047c8d6ff4d939502ccfa4c51e875cc59ec35096d944d4233d3721b8318f96f14a72ff0612faa2d0c16e310b38e9abaffdb8fcdb17e75f28280f58ff92ea14e521e2f9d4e960a8617e38bd075a2c2899f3f088b255942b7a6190f602fa39333eedc702bb2403f930b21bcadd9b4f113248dddb63989634091df8852b2af73674c018819d333602617a34c33dcae5a28127e8881856f2606cc1fc3931e5cd83ca29b023226876736a5e065dda5ed12f7e7fc0cb2384414000c8699ff65f20781c65c44425318999c9a5a51662182e9bd74685e0fb28465059e0a1a8edf90c94f7bc42a1296a765bb0a4ec7e003ca59fc65a7f564615f920090e8aea3ed76cfca75994ab71505ad9b8e2891fbba6728c5c7618165941936f85ef0ca2989c5c632ff2d6154b4d142c3dc5241e7ebcf7fbe9567e008a8c0cd2bc99d1460d3985e853d31524c178df6faf452f7df013d87fc63b62f268af988c5db1e887141a081c5c66227c683d324acbc1809f221dc33aff29c8ccf94b6a20012378cc5e640260c4ad49ee6e8a0c5e152715a8148f790d8c5a10006eb8927257aa6c08d0b550524e0fd530a59cff0c37ee8054611cf6330a6381ac3d67a30943376e6c1eebf69b783d5636713bb02ce3975a63c253ee26669e139e9b76ef6765ebdebf1c84b32bbe6fd990f0318804993057d2a4ff62ba1f80ea0e1a4754b7182116f636d137b6de62378cbcece344f4442a2de3bb008229a9759c4ae789495a168df810d45ce598eae31d4012070779e9ad4707d3e283eb7678aa2b0e6d65500dfe197bb38bce87dd6e31c02d20e8952dfc92be73eb296b9dc6e5187ee617c337702660719f1fb7ecd693fba16271e854f8c216963baed9f395bea82ba2d47bf7b2c1cef3a8723a17569f79069f2dd9dcad80c436acdbcb8151238bdd5e1fa5274fb8c544ac14235c3d92447bc3937b81ca2943bef413eb152c08271646f3aeb82063e8edc3b3adf486af3edb670b0dfe8586d78a31c5d096a622adb483d6fb08f4d9233e8eab296d1048873ab60ba29368c82a9c461263132e260c1d99c6dcd95093dfe41f04bdd6966351dd7cb90c1d603bbc31a222d1de79bdd9012d2c64cb2d4625a565b4e42bc2f998890fda1cb60de84a774bf1b0644900e995fb96502c72f45d1a03cd732bbb3bb5722db6473168c30e4890d6c33e2a6895f5c07f9a1ead521b321f120518015c9da8962afff4b15cd4181e9af542997ac2609cdf1792b76ee2454b1abeb4941b409726a64535f828a450b221794aff72c5c18f593d5edad918c23c8717fcdd71704eee6f7e4cb47c7b5960af504258b0251ccec28a28895c4f974578cf713e288fcc3b9a8b004f38d5eabb16e11525218b784fe7ba96697896e1ef05a37b932b7105bda4016f18b43ff9bfa53893d37121ad7e4636a573cd1b8298e18dc8c50ed464f1358b9131fc0ab44edd2bcbece56435bbdb05f364375f03dc4109219ce78070babfc15e78a01f2d362235946868969f64dc5d0dd98a3c4694761ab86dbe0bf268fc23e520c8aa4a089f283387eabca356549b78d0ec89b0265bd8571adc27ca910e13d0bd2fcb465dc863e3ee892de4429e35bd6cebfcc25a8c0bf965b0af9bfa88d1d14b208990cc563ecdc1ad977dde2101ccaacb5767718171fe671a5692b848e0d0b5f459347301e4807d467606387f63b301715d18d959bc0132b0c580603daf1099e06f93a4bdeade87e5261e3345487b8d08765dcc7740ebd3880c377fc512552c930b5bb26015c7b3e59aa357385cde37120171ee7f7d427600139951114933222f29254d59ab03252e6e441a0133afe8c2416e705dcc59280f5470e22d72c695f803f52d789327867df1172e90509ad4a49095b3764a6f9f22051c32691cb0c4f9949df8f934bb67b63dac128f1cc1a098c376f1546aef74f30f66a7f1cc315acab3c2dcc74567f9362079f1ba2a4f3873a32b79e38abdc598a8cb2c3b83b01c73040ae125201205ccd972ce49421c6d97d73f13b0b2663c9c2b49660a5babbc2c786f36feaf8353b6d4a772ca1d2edc16a390be220f979b6503e3eb97fdbf58f231cb9003937ee18d67def3c8516b6b236a9b2f3f73756cb3c9eca592c064faea9369f27a5f6f37ca7393dc426caf85978cce3f4e240e160c77919573297a43230c206993f1632d4902490b16232ed840deef7a7b244fa6f8c1d20be77430cad060876a40d0b512c7d6c4f872d0398699504af026c5630d9da5e4b465c51aa42d27127e9a372259822948a1f8ba000ef0f414d83ecf287d6b6080bb4023cc53c83af0873239f25c16d66c61cc0d57a40f03897a00cf664434a3af9f9b686afb162907704438b591046bc8b58fdd0baea396cb7a67641cb41381f9687a3d2b26352e2df11fd7f156271fe34ecd6e28375064d8dd22ff8a49c9baf976df35e1be92eb7e8da67809b0f08713dfbfe0fc005189c00361a595659b768e40dc0729d29a5600be2dac5d1c5696c612d684e900c2228dc8f118ffec61fb389e0e7384cad7e6fb18ae059185bd66f9b550f931a03e136541c0e6fd00c26c7d355bf88b3e002ff5f37bbad73eb6fa078850f1c0bf3838651eca9e29818ce84d071df2f2e373fdc5249cc6a61b0b2203cb2503018bf584e8e95c3dd907f585de072dfe00bc1e62d053c68d60fb2ad97a42fc723105ce3a2c59a9e52b183edc2e18fe83a6ec1fb282f97b9ab3179ea730d3d618015b7930fc18638c2f0a3c4ec329486414d161bf055090eb28360f1ffcac4a20d20f11c74b35fd782e1a08bb07223a3d7a474360f5e7fb629873c2e08f95014a4f666937cf23d7a6dd24599b3b05c05f6b771ca16a4ac1d0e4726a0f4703e2a6dd7eaff350d078bdba3f616adec3dc111df654fcc9716873b3fab8990ff646617572eb93dfc67c742814138335bbc8c71e8e26b34dec2dc649a7a83ade8fe3fdca30d387b67964cd81d99f24842d660f6eebf6ac26716b3bb757f0d18e3245fa79d2bac8a5d17d6ba17d032ef9a3e605f5c0acb488187e1ca3726de24f657d90244a809fea7482b8e8c4398cb522c198140f6f0616fe335bfd19fac099f39fed9177b3360bfdef33891e374c078c246e0f899af60de0a9d9ab07225385f056b09a982953542fe9bd05d979c7e4ebc5d8da859b2eaf71262ac0e4f9239afd81ced68be0e52b35284fadb13f90d353b9383969dd34a211a8b1f22cc793084373206821c4073287fcebc3facac8cfec999641f8f810469105a310a73ce90b2535a4a0f7a5793f14d54004ed3de266dbb58c3c29cd7eb0447d7d01a742275332217227f40ef14636661851272e92c240247f67b61749a299722340e103442bdc42be055c08ce98b796afbc5a82e1150bfeba379d75c44ac7d9e176951c82fae8a482b5f3836c2047d9008ecab0695301e4ce20ccd15921f4e452b15eb53e5e25455c0081369ef0c15562b225424caa7d18c2c0bfcb28ca245fd5c86ff061965579ac1a01a888df2a425d7359bbab1e52b52905b17b1c699bef900a3306bd06b368ca15e7c5b9d0abf5c1e4ccf6a0b178366a5de706a723b9ac43f94a6bdb9ad40a30f5baf23f32b9ca64d827a88c3097d132cf3c7e7046f3567958e9ae462c5d0c2d3767f4528f8cb610acb28b2195315d887356297b0d13a982f5d6613426f2de094ce698f7b6c9ba0321cd813e8be095e800fe9afded06e162bd4177dad0466baaa9c18332a70b81ac2e69f61557a5c631e4e9c38fd2c7a82455116b21664170a9cea8806c6e8d5638a62e6c287fe1dcd97c113b58524f812bb65b34414b1ceeb1a33694cd781a6fa67855e60d53e230f74907e6db9978382123fc69aee6cb6630b527e53c1573a4b128dc3b718962acb148378bae6ba1185c952024203ee57cbcd3f962b61fe4573d05a33fc870ffd31e63a1e7e8e04ec2bda3634bc21de85460fb32474e6cd8e90c4e25c5beaa3eb4fd0d09f71cd13fd1b402cd92d1a6018f02fbf04542302e17607a36904849109773753aed2409e144ee991c09a15518446b0ee78dc4b0703a9077bf8f77e959baf07be9c58e4cf4b3518b27bdcc54facdfe787c3fb33ac5ce3b600a168c861708377180f8ffdecd4e025ca730c3eaa903869ff8a0e061aaadba996a481a6170ee6d86129d118959ebcc8971a3548d9c07a4c5163383993e173be7aa1d4b44f284e2ba73958df8fd22fad0be5e81f1080ba9f55785e789472484ddb05943dd95792acb6b6c55981fd5f87e3a4dfbfb1a87cd009d6d66d416b36988a9f9467f899366caf3c08dda1bf20ee79dd6456a22eb454a3970708e058203725ff901e5213e0b10dd2c75bc2fed86ffb33bb2f10a33de85bcefa819f12ec14c1ee8668c36d88052d150ae40b9c0e362dee63f26cde7dcb340e5e5f98637de3e0f9422300e1fca2b77cc38c073c0abb003e124b5ac4af0160d582658de0ecdb4375461923a279d59893c1b53fb08e725aa0cce559e441e9f6dcef0804d44ba81ca288691d11b5a1b9f39e66054e2b0da9032e7022376f4e8c5eb9aa3e849d4627cbb714af782181d0e281300fd2c80da4d57a9e7591e1046620971187b527f61b2a1ea54d4ee9c934b41803ff9f84b4b23fb8167e6afdc1b279bfd0266c0cef78acb5fee1ce13f62c5b600ee7c509e761eb635f25dfc0de14a3008596675a14fb7a2bd26bf8fa3c50a8252ef691077ccd4d10adc48f957a2ce70ceaab18828cf6e11b746b136f62bf7f1cc06f5d0f682035c4dec12fe20f5ee0820709dda6a4c6f1f0af3e333638b172be569b6fc2115891176c0c851bb10008bf0aeff12c20e3c2221c8a1a9efb9cd9a7fbad5bbdb718000222f47e5d913292fa83917d7401d1aa8689281711605b1e3b7cb38fb91c676a171a4ad42c02dc084a9a20ff81cc566e58e6f71b5a431db4a5c78860fba439b1d25ecca735db17e85a239e22be1405ad6120bb916bf9d7236e1a56235854fe1eb089f1675fc02f0963a4e5ec40997f5006d58178796d8fd2b4b833ea15485be3627be6c30bd0fa61e22c5abe2e2004da61c0b613ed135031d39924afbfafededf92b3516f28f86532c8e136e98a294279d344b27d0a9283a444e3e66d8e04d1714a49f593a439522cdbd4b430988dc05580110aec7b5fac42760e8dd2ff6292899c7a41de08fd8365666b2e33abfcc2a0004ca2bc10f861690a0563c60dc0c4159af5e1932b2672a84f7d3ee3feeca9f3ca8296ed04b515fb4e2c82b49989c4df38aff092422b96ef4237ccb2bf0957c3b5e93ff4b5f2847296594b23fbb87fd8f681472d3c346f313d03814963fcc237d7aea37eddfcbbe9efa0bf41465949e304c4a27fc26a693ea7ef2565e4a3d7a62209a514917dfa5d9c9ca08ce84f4af7264bd2b076e73e70afc13353c6245a5cdfb912e9d2884d8496c7f6787b2125f631b4b90090419ebdf746988c9612c598749b9d9ed52fe01acfe92051fe60048080b82d6748d0c6608c424563cd14a98d1c809559a476c5145a32aecd9937234716b42be075a706002db8dd75fea29a552e893689ebde4c01a2a12c2e9bedcfc8b6694d9c10dbcef35b9eda1d9d97d75f4a71386f08154f0e6dac171bab1f5e30e63cffb2f0424fd604d9cf676c980a54d881b8cf2a9068870e83c880ee5a00675266a7d547bdb1e8a11417306d08907c25e02a724dcca5850832a773202e5ac041e732d6ab01eafb4b7329782f5b5f68cf5607a6dfe32e64cf4f7bf119041174ee0c6fdc44a0cfd1430dbe97da11f439a6f584d15e34722faa7fa6e87dddbd08a279c32babc6c292e96c744df05d6300571727e9d664d2a9bb4502bbe6481074dd79259a018374a8225b3ade4b1c35d3f15d59167564fdb2506202088f6b1962cd12998bb82e6461396b8369520862000720b62b75835251a6241818efae61bed0c2c987df772022288816efe862628e5956213d816043dff88f4712da67437548599d8ec3ceb3dc1ba26d03cd31d71b9562f59c9a7e7d8d209103384d658206d983f1661ed213814ef5a9502d1a7b4f696fb764962b859d89e82a216c96b94088a73963c97a0102add0c5ce5f9ab3ab5c03ccb19c01ba28c31158bfbf4f7f90fc8f76c8da3795f03cd4a2ddb49e6738e6e65f4eeaf19bd3731e34c7a68c24e5a48c47daa135bc250b496cc8795ad494e614b15c06d1bb48905e70fdaacdf066e61c95b972188481aa943e45af90a89d34e0c8c4d2ab039159440a40924f087ec159061b663d2eeaa800d69c93b72f2a5cd4cb23a5ce403c24f8963e7cc2378240ac7cbc8183d56f52d63de183b80e5daaf7055edb14fb6e9ebebf29cc3c39ab3fa33188a254f4beb876893644cb9e11b28c49cd6159c91618f9dfd1b432f6d2d057bca22f731c04499b8c86ecf8936e09c4162144b82f2df57270ecdd577cb0a735317f6dd0413b68173f4bb7db773d1d9ecbb42c1e0d04a20a2fa8ee98e554709c1c5ad78f4b5795ad7d360b36b70897ee5ab4681d275393ef9c8cbc8b5d1f157280885ff00183fb286bb78df7b9ef551e25aaa50e423f94f507718792995e55100c0241580d62131ed0cc019a083cb40ff8508def866b560335a41891ba1a647cc500d1937afd17d51f357c421ccd6f23b21f94cb51572421dd6e959a77842d81d62ec3e401f66d36eb01ee2c2c16b95e2c96b1edfe93584a4ea03deb49b6a6e08a940f3b0b603e93a74106f25e8b7dc2f0690f1c7903f204e8098bd629d19893820769800280b8e58b8a21c9da7bd941bae8a173cd3226f511fc58b4f6b6a1014b262e10a90135df80ff981c4ce678b50ee6039be1b81b4b1c35b6dcf64b7a7f8649a0208a4e9c0d41673746469d5b5db3939e84d1601f554a02d487687dd364312c8f98a153e0b25c849d02631a4ef245adbc26f7ee225a824d9ba93d0330a32c9eec9c73417cc5a07e27e8bda06d6e4c830505fe6e67acf4aeb7bd5e3efb8f31d51a5c39c5671cb581204df0ac3570cdbfb5a119754bdfc62a8225f2c7798db5dd31d5d6a8e3032a34da3d1e5716ae9d059c35faa381852db7a683c068409c8edf9b984668fac2f079ff117a5b853bcf1c9b36ce52599ed84c8a3e8b888ef23b11584a83d707bb173703008a72f260ebb1bae69f8540873fb92eaeef55faf0b1cbb9209ed0a8d4f0e7d075bf7d4f57a886210e401182028ccf8bc3599800fdb56a94c47f40d75ef2216bc1848e83684a4735d70f980cdd7d496babec59fe381f53c24a942f36169a20212bdf883ec9b8a7b5beb95c6b20117f900c67d2d8437f62ca9482a68a9a1ea8ec880bfb3aed37afb573ad3c9b259354574f1a4fd654745e21e28c0c9fc26f9d9f0a38b8dbfd079f517a4815351efd96537be1a68cf0add5d638596ebdae729ba323a4b34aa59d11b0794a35980f5cc158838304e4a45603fb415bb0f2e9b0b7abb526d1e694c7ab10398d332e3e2c490f87ff9b4cf33365872f43f10d9e903f327b7065745562b1105e8931ecf2131923f1b857dc1b92a0c733d696430269cbe5c487a4219426e9516edc05abc96573144b51b6073a9e3345bf9e5b4acdd54b3e3d73804a2795234671fb8de12bb25cd40079ecc2a9d0b2505dc5536a0736e8d17392816eb090705d8c24cd47e0c154029533325e5e271b4959ea4b48b93a9e6133e0e85a36ab73046f8e2c7cdd8ab3018a9b47ababb269237e2633927f6403c422db9e9a67990294d24cb1ed8c9ec711e3f15cfa8caf14c8be59302c6b1497f4656ad76c04b431279927b9ca2c960b80cb038252cd70c115cc5564320312715c50b03da6dfb8a0cc49d3a5f88f4e95c652f3b399feaa56470b637598d9370c4bca8abed37712dc2e8ad4a215dffb3cceb47586d94bf6c14cf3358005d5fb0e0ad875e06809ae7aa02a8c385762200a640e823064e55ad39bdcb13c88a3a249c274013b2b62fa963da656bb2455316d8d8ed1e89068689a230bc6b9a507bc4e40b54e7a13dad93042cc31fcea3a2e584e1c9ccdd26cb4c18ba8fc7c4e1a3d07aaedce9956f0c740b21805ccaca5cf6dcaf57de3a0bb3a7f049d34b623b9c5210f69f0b2df56a559d4546898d01f1f70db35bfbb5eb6d3b20f32a3d48672f259fb92a9c00b699989190307021992f2c816edf2fd0053f30f01ae439caa9c90bba64b05772635ef2c172dd75c4ed823b3b53b27d63cf35895cd41b1b6d6dce54c566a78c52ab3400839548144b0496bcb6bf943f89d4a87fd47a0b60b08c90a10af9e1f880d43fda5d4c31515ba4792291171ff6a9f88706e0cc4be2402c50e0c2ac67ffff1445cf49990e392705175bd7e0a6fb62712b0ee49abb8b1b644c17e58950c360aa982b04cd3ac20c8acf68bd8d25d13d76785a28568d5258310a4f2115510bdae15ee32c55f13af6b17c76db8e47a579ba6f1ed274b430d94b663db941fd0aac1130be8452a0b3556ab4c0feb30ecfc2cc565fbb67e4d512670b73929ec4f576aa68b8a513e4ed71fd0d0a1c26fb46dc9199769d4955878ff217198f0af234878b249717a46260662e0998380a5b4696e9844ba879973d9f821b63330e1f97ef03074c127bd2d01a65fc3e3b2538c57ac2f80eba6e8661307076189d6ba6f885b734f71b37c8186ba96e02e71e9a3a122670eea685e77396b1df32390299d4b755a8470e3c32f83db440061e4650c12c3487f059cf7c47fcbbaeff5e34f5095d850057f6c6071c69b4f2307b9419d8dea05fa7005d8a14ee2bbf5072994fae433a0040eb23d9c182e4a9ae6af16d8b0aa297a6eea6d771e99954dea94560df7b8c7b68ff2a244b5b1f209830cd954957defae69c46bb6b3b5a0033c347d2a2223601630afabc1fbf95b41f3e6a8c84adf38ba0e0b33795de35229e241ec102909e7fb4562b31b247c166ad80deb2ee2cbcc3c766f9bd9685a5ee6c9e87a29d1715bb1359d2371656f658069b7b2d58502260033cb1cddef31ba979a75f794d1d03cfd0a44f8fb5f10e8267dfa297a12968d1d881656e2c8b6f1a9df2fefd06ada7a4b571f57c55c472266cc4c02d1d3a9e3ef95efd661563efb98338dfe4aba7b3bc6b586ecf9095797866d43a94dfb8f9638ad230b29e751968ed7319003ae232308fe1a4c94a74b24127cab70ee015b8195f45ca77aa0756649184125baf94d1a31cadf7049c2cb661403f42cd1df7344846571ce87435143e69a41f659a54bc8bbb44d0b12fac3c54695ad357ba3c0cc0ca878b09b8c27864add75e145120be84aa49f477da3dcc125fa9180cfa40816ecb69fba7c9a1c9769a3c885234c0dd48032f1dffdb25493fd91f979170a7df93d0d7cad3ceac1bf363e75a1d935fe1040ce51dcea587ed17c2c3dd9ab0a0e2125b7ae948f4da4b70093f0250b1320c54b63eabc9ad5bac0da9d99cd07fc6661a0780c8b7b71e8b24387741b1983bc1134c8c69ad60623089a9f29300a12158799aa2bec571fef9b14d4d472e16feed8d2f08286af04718afc0309bf00c4d560a3024e352944fd5caa484f9dc3c7c75521cce5426c0567d0c378f0510b30421529b3bd55541aa371a3b14af59825c0099edac915ec8a360d048bca05a16cf1d41e28c0ccc31340325243a0dd0633fe1744a28859323150e29a200127b0e346c01a230cff88d1f0827601b7afdf5391e19c8b60637c839601d0f30cd6b0655b38f8249fb493de113b1ad1f0802474c6440e2ac3d1a2e0aa8356e9a5b6970d7c7d3f56519d57023d33b3082a5f786dfb01dddcd0c3a97d0e3eb1298c3c4a03ba4e5a0bdb5c5689f9002692f34ba23a6dbf46c263400ccf38616af6b73ba5ca63562a68e92fed5783aa142fab02a96941bdaa1ac91e1527a79c6b2b9f87d47cd58c0d2023a8dc6fada70c39b6e23ca4fc41056ed84335996e2c46cdab5c7fa7f61ee1f5ea9d67275ca2e9041a7ada11ecc6870f54132e562e10c1d1547f96e2fd75a6f940db3cb1627c2b13381c6f603897b3b3fc6dc098cdaf9bc561a63b8eb0f71df4d12fee0bc8167359e780f4301e6134fbf8013ca9c825510bc65b57be27b440de09fd00dec2ee0d4f6048dd4e96df5de997aec7b7730cdb41f7a3a48c2421c0b2c41293dd2f89d77b27cd73f4c451d13bc67ea8e6d405cdce68f683c54fe6bd71e014515892510134c94465c1c1783d7ec8e243976d9e711e852c37c486cabdebd9c24826aa1103ee5b48dd4823f416158b04dea13b687bc4fe41ee9a783529c692c420bb7a8f6fb438b653007fe0f33c9995ae59dcf3eb9a274eece7e457bea49b628f3c43517c05c2027047260593d24926884ef2aa2de480a50ce5ab383ea3a8dfa8e1f70bc60d92e54bde8f37e8b089462d7a55d33aa8838d76d7a925ccefec1e09ed74fa9c6768da299a1c9382e368b3e99a22a72d606c084a1779eff2fa451027ea61727c391c3a78c7f23b697ba410325d02eadad416c4ab3eb4bce0c5819aad3df174bbe4cd313b64f266b20c2385440d1a0f853aa25bac320a6972d5d22864e39d0e108fec0593d60375bfe10747e99800c5af641a3c726d00e7c46b099b789885c82dd4beefff0fc9f4ad1f81026cfed37e864d721b7bc81f054f448263f06ec24f3d800dfa4d7c982356ab7504dea1fe1d539bf8426a5b553ee98fd59277640e87a607fe1483b005bb0ae68c9165f316fb8aae0f17f9a0036f39086f78894cb151f10171799f1cf5813b96327722e9827d3e8d2b928761ef93207a181507b9c17333fd35d37e737c5e99efcccc3c10d4497e081dde48f1d46530883b5f791ec12e3690b75eb3f622bf1cef93e0f7bed99561601a82e142b0e41afc58532c094eaaa8b494cb39cf61ee212439e829a64b06bf626ce274b45dcdc03dbb086c117f1a6ae4fb0110577182d685bc214891c106cc00ac5e8388e1bf3a5afd7515424556da1f863200f8e6be8bb8e992346d756fc14e15c19375dc759bfe8a8eb6228710e7453e1df33d2968c02574fd175fa5f2939b73a6a96e157f3fe8bbf853afa7ffc5899f33ea9f1b93479a5bc25b0dd4cf3aee321702273b3dd61d7a39202039b4ebc1fe4d0560866cc9b70a4a3c2f252456326f0a5baf350b5c0250c5ec8d5bc80411f4796c61a278dbfc747a29b29911e6dc6268d3517e9d0a6b92f2b21cc4c7d1b477f253a936c637437219ad023164662e26b4ef84ab0c2bc8d2f8283fa746556808d158b0736719098f7daa763be080ad411f29369da5a860afa9dea58ba1444e4a619f0702db57f091cdaafec18f3b6b5f7299b051027c467cf8524d8bf5c884d2957b45d1dd1368afc8f37b814c8835c8e620e72a9720f94c529a6dabf940dab0bb13f58a11ea739970f82309cc5bd7194e4ad71aa4678b8d59099ff0098e0f07bdc7e849c31553a433f08b40a74f3428a4780897d098101927865a0dd06245e49b0fc5ab966355694a4456ccd10ee094ebafecf4d3926c3bb91339bba1c560328f4ab72f0f044c964f0cef4de3f20294f6d4231700098feca547c70134a08e619933053e7da790e57b1372e97e30f93fd0692759693d6eaf26dd50949a2f46dd6e2781454643897614482c626cf7488a978648d792760eebfbae1d695525420278f2a0788e3260ee812ff32e49510308c06f984a9cf2f119646eddc07e601d561b4718135c457e11a84ef3b0745af88db8f7f678f0f8538ec21c940c9bbd0089578d4e1a7a2c4e9482187b492873dbb2207e6aa60cdb679205e41c4704eeea4180122742587e8c42da9169476d1b95ac1ec618cfe0b1f97d52594b3524eceb0511edb4fe8bea1c93945459998eecdffc6dfba4967b0118e37a778d84c20cf9d80c24e0579ce3ab94c51b58effa322cb81f612314c6f2dfbd4e903040cc55fb034a83c2533dec39b6ce264adcf06542120230d530732d7ca19bfb4e4f6b0a8ce0783534abe743b83d585851e33d1df82c6f87bfe8a0b26c10e24c13ba7822c3d7116c337cc28713e44b6c6e73bc09d2b71629a6e10b53aedeea644e14b9c5abcf5ea9ad0ba058e7176a306f9bb152df4e752f36aa4187c1271508b9818138ec0c593481434f402a10831bf731b6f2a4cae5e117cd2b85e97fcb018c23c9fa5b2366f457e5b07bef03b334a54dd7d22ff8c4b0fe5d2bdd5b99549424ebe81f33b40691e12aede8012060d99794f5e3bec7c479092dc1fd1d59cc085b4cbb9cdb3c36a4427846718855ed0c18f845c7fea6eb57d342f4e6cc6d2d23cf799c2fc9e849177ce8d009070e80c02ff9da22c995d1f17780bfaf4d12cd6d559b6ba5437dbc93f524805548ea5753b16c05287c464e8dc49d50046266d12afb04b27c4cc070b9f425b7c30a27759ea633a46664f2843ca657c61e436b1fd31a81ba815b75feac002d125dd925774c919b313c372efc5e5b4d9ed5a9856c1837dac1c419d29ba0454980197ea02258e0e58da293a321ff5d04d494e979de2782f373f6c5aaf2376ae7f989740894ca301f2e39fe750e3005c27dee1f8aaa8a7d6c6921807f9141b4849ca0f207663217768568524cc53c8fed87b00a0174bb5193d73f2560944f0e67bef8227c40c71c0097aa7ea4ab9dc46ac62a7fc09e117c884a360d9dac2b9723844c9081a8a616dfb15f9cfdf3996b18a727a5bedfda4ed02303e53a84cbdbd0d8a5c4b2ad7eea39ed1cc18da2d3f769b8928e858e5007231b6ff2c922b70afa50fb37eb5e692643105f470ff0686f2aa7d343602527a81358862aa8489cdf6f8b4fc5c2bd1d143410a273699e21f6f62705c5758403f5a29d945dcd8f1ea8a3cc4ec22be0e105bd6fa67d26d823b0df7a3a20ee3c13c9a4762ab644c1640c9551d6d6844119b2d868ae90535235fe85675a5947f0b156b90208f2cdd907867ce65102b722e1c400ef0e77614c00314eaeabe6c350b16158e2a593d4d9584f98e243076051d2e43c1ff569b8e8045ec7bf5791cb5bb348c9d36ebef82b85341a2179d0ba3f29c635912d053a1443dec2a0a5a203e0f04dc2a4f6195112686314930aec2fa397a11f1f2d6d2d5870dd25edcedaffe7549bbb6d902138606c24899d79e231f72edda06fc0069af96f8c374c7be33f13314d47ca89a8e1199d74b88b93bd6d26711c3dcfc658f6293b9cec3f6f18a53753e176b35b349d56ee12cd8cc7503772962a4ecb422def050e803a9c04fec2e7089989d168a4ce165ee08bc85977f09794713756c99c78f148cbd1990699faefca5f0afa2ae4d2625c34494e55cec97b830e7d5b619a935b35f7ad68dc07013c68c8779bc8c4e74bb05f011391ab38b348290a16b58de7675b41f50e7ae3629aea480d323028348c35d184a5349020335105f3449e453e3895f92316d5d231506125ae66412f49e5eb070117d052ae284d770d947a8cd24462093a2792040d95822c8293d7715a281f746026b2a5727faf1f2f7848129098e41016e62adeba0b233bf391f3e20c91e545df7c996f7ad2406788582ccb5381f119ca18bcc74dd5390e7e00af763216af81913ccfcebced47dc6bbfc2c16a8e912f0d079cf783ca335532aa9d32b740fa083a1efd70ef776dd3e519c48c033b4a83796141d806dcf6c7863d7abfe7be01535c8ae8ee6a894faa162536a99922ba7803ec5ae1edb7f93759cb71c4204fa85e98dfde1b0f6991be53ccbf4ea5e4e6ab38cc981599dad3b6e685b9aee28f4ddc8c8130f0f808416fa22d0354570c3c012ba96a3a1b242e3938c667f9c8f03a61aa6ffd4c45c500293997c14d162a5c41e05276462aef2e7ce4fbf962750ff5c1b02c0ae2a4d9a9c2a1c6102d1c79d8ef88096dc29d93af66634eb471aae05052947f373d46faa5bbdc72d5a86a2dbd4f367997b265ab1a5730c24c0e6a7e65754f624301c15f573968107795d1d20b90059abd4f675c10000f7bc5052f104c227215c04ea9d01dfa046155be8e0880435843b38c51574db3550e005d6cd30e0ab86ccf78a9cacd202665eac3946dcb6b59483ca4d033557a5b55fa3165968ad14f208978feb4d69fd53b3075bb0d9f082eda1b0b476d1fde2b35a14a495c1a69e2a6cc7e67506bc5b0ef1f4b3a2368b2a8643a6b9e3c782a1a1fdb9cc8a2689deccfa3dd3a493187b54f6bc5b029e55d99ff2118ce80b72a328085895b136e9b8e3f62cd84435ac3d79be475cf3383ab9649280f90e7b5c5c5431c795f94f5b1236c9c145aadc0652fb788e3a7f331b75e969988bd12ff12a0027859698865cabf0d9d6ece4cdfaf5ac1193da8a8e77da4679542100f31e3ca2284c5aaf873c4e83d7211211267cd3de4d6c46cd9f5e2b52bcb28bf87aa08e5a9dc82845b2074231a6b6c7c044e32212be1f68b05f240a673e154f5412e27bbc73ff12508532dee3336a0d62ad7fd996d0e2a8f8933126cc7702a643fea59090a79fbe994aeea5bf40aa1635fc593a2154662e2ffa60f59602e35acd4628324d123ea8106afb1f127e495d710931f7e537c910111759da9e11d3575242a06abb629d047105b3f1ee41f83bf2414281ea8c097b2e9ccfb8de57f1d09560cc499b50de20129aa1476597bdb3dbc9988acba8bfabd53238f75853a24b0ae275fc54603619350068f04e304740df164ba34e46db94288cbfe5e05d7196fb1e8d22d968a090662dec38d32aa711b7b2c33f5b86cf9b1c3985b72b810dda67c3b2a17e24a9542bd32be179096849ccd353aafc276cbd4a81fce2dea4b795e73457bb88217cf7ba621cc1045c6d98639277cead96eb2b9a67a11c9e499d7ad83fc36b5bb6905d9ea7ed611f46e80614bc02668eec66da14e4f9a154e03bf43639b51dd5790ffb4957e34b837bd8b7446140d6d70c2cdc050e23d41aae83434ec361e240f8aa78783fff790e5c41e6a7fd3045eec4a3087cd3b8dd266d0f6da9c991b836c2bd6506275ca336492bc09393dc77c5e14259a59fb73bf51a6f6782e7a93d9609e3a62877e6a1988d4f0a03304c05041a7193ab58309855693a7f79f6efd1ddeb6534a8f1dabbea165f5291e3ba7a8942646ebeab69cd1c6eb3b2686365f0fbb57a32636e8e832fd050b8e181a6dd6cb2f6cedbc5607e6f62741b03b258cb5f5b6bb6971a2d355ad2f6de72ef2d0a620ad90af851ca086d16bd7bccf8d7b38ee67ebbdf445f68933b9b8c455df7d5907e7d3f48bfdf8f949adb7d353793eee904c5c47472626262a299689a764ea471269ad689b4eb2a695fa954e2388ee3382b7497b9eb6c321e6d5e6cf062edf8d5455dd775dd8cccdd3de78537739fda29c8e8f834a48bbe286570c72779a267d8a3211d7fe4cd1cd3cce0df7b8dc8dc6566e775e66866dede9d8274e74e63a50ceda24f3b771ad18ce8a31a0d37c3e1ef36a85da66383da6baecd85c13fb88eaf2bacc956d63318f661d50b83c8d8175a8fd3ba6ebd161bbc66b2dbb026d75b3c95a042923b866b2fd3b19bf214ed2837d9b89332ce131d7b1d8de8ddd7bd351ea4731508491963181f3fc3bcee23cce3b8474d47e9d88761177921f7781eb48f380fc38e4f37d2312facc9d82bed07fc0e63cf38af7b26b51ca3731ee9ab4026bdfb31fa88a0890dea287df498bbd2171bacc9dd47a490c3b493bc9084518d8776ecfba17df4fdd88e9df36a48197be785a4af8694b50f6f8f3f99a47c473131e9ba7b7f7299beddc548c71cd69d747cb1ee240ebfc32613e699f03dc6183fa35a0e9c1d3b15469779f4eefb717f7deb2edf7d2196ef8f3baa1acdfdc5792129739924c217e18c317e777282bfd0e4a48b44dab9789257dd6474ed25af0899471fbda74633faf5b5c6e31d65da9277f46ce471a32f947944bac82bbdf3b2a9d1885e7ad466f04997e9934623af7336b799ee98d4e0f6d668f0b73d7e3feee5372fd4be1a52bedff588730d8933014ba6cf2c5278b3653dbebe0a91ad57cf2ccbaa18b6f5d7a3dd1285882c42d4b01c610a28bf34d3537e4fdbf14be7bceeba4cde95debdd278e06f3c4617852c99bb381c3e73dfa9f4d18cb677e7ae9b78e1f678d3459b77992ed3f8e2b010dc3b6bb76d3b8d8ebff0c443f4ed310b711a7d34a2ee9b10193f662172b7998e4b9fe9d7f7c374d1f783f4ab86255faf61c9a62fac6139dd4bfb9e72ef49f693eca47bd665272727ddf67af2abcb4e4e7e6d27ddb90ee5e4434141e9baaeebba29e0cb8ccf7138c3a32f1492471779214b167df34221f2f612f785cf5c77c235d885a47c72137715d317e2cc3568f2953c959bbcfb42d255bcd82d9ce83253e4c56f5e759217d6b064fcfb11c61863a9f1c0f8db394ff4ce0b5972f7a9d170177db1c1ae7387b98fa5c11a96f823440d4b2e42a2f4c6861ad290f2b0a837adaf7ed1a643235a26818bebe49808e528f7a68f484fc1c78eb157fae671187612f785af341ed831fee6c5463dbbf665df96bde485dae3ef3bec65217e864bc78ebdf0888cb9eed8179e7868cfb0735f78ea3e1a8d8bf988cc5d7b95dd635e88bdf4e5300463dfb3efc77df7fd20dda643fcd974de488f4f19d1903ed1eb68c47122918813d98be16cce8c4516e38e33ec1c767232359ace27c7bc136c3bc7611c87bd9ebbc5380ce362fbeee5b55d7edbaeabaf26a49bbbae19eda46f1ef64223327e6c54e926dd4b369dc30a4cd147dfdee17b2db43949944523d15784ccf5ba3c4d6a3c34ed9bd71d7b53a3d9de7db1417c99893dab358e66fb688357cbbeeb11db23d4906da4496a56f8dce401e4e8430550166315431fb956d565f85c738cd863fcb26abfa9f120248732398cb7a93ce44321b93f65d0c51638cb2454f44c31862c801c7da6d8a9599685369f7e3af93dca473fae73bfbe6d1e9e620a9d7c3d650a1c237c91714e11684ac75f48c47311295974fc4ae3c1fdbabe79e1f3b66d1be9e3414816e15f57d83d9e8793937e2d40e693cbf4f5edf407d1b95f5ee8235fafb41fb6e3eea1edbe130f4272774c3a3e57012199f4596025779f8f8c1ffac8dcb987ddab1d329f9cf342eea22f872198fb789cfcfa7e9c9cf4fd48f96553f375ec85dc6753f3c9171b3cd59cf2f89117d28cf2a9f52069523edae0e9fbfd628328f807fc85329b6ef2a8fd60ba89c90b37904df0b7679b37b389c9a5f643c87d7b6c30f491bb39b3d47e08f1b96fdfcca62fd44036797dd57ee86cf2eb077c0e48eebeb0de66669387b4c1ed7833f9b2579abebcecdbb72fccaab7dd666ec73c1b99af4b2dc76643f3f519ec6e814f3dc8cc5d66eef8d3de1a4d768b2f8fbf10cbd98fec16e3214f054f76c9d1878a213993da0f99f532ce93b7465092ed33d147f2c267d23b2ff491bbd24ade8e5fc25fb81223060c182a2aa7534a0a0a8ac974726262522a9148a39148d4751873dcb669dabd598661d77572f285366f2f95bed0666ce5ed27fc18634e6e3a7d6195b7a33cc58bf105e50bab8c6f824d5f4833bec94fbc185f4cbe90e6ed256f7b8ca8d2b7d13b107fe13de93293e4c5775ef59117dad4ccfd5ee415213377aad174e62eb51e2477fb85d9b97bdbb3a8cd488d072151a6b92cded67470dbb1d77de2775ff88c2f3339af33f6c27beb7d6e47cc3974003f6b0f9f351a19decfa6e6ecb38f9799328d79385f5ecce17dd41b22ac36b4a10d43d986d294b244912429b2d842e28178fc8eb8c1fc8090afdf114708a922038239e1e8073153a7291f3f0dc4cb78f99da69c1107bd2cc0b753c0218cb422c39e6d7588a625374e920683be807b26b98490fcdc799d90736f496f14cdf72ee18c7c6fbea67c59f205f37d6cd4bd9f5717b9bf93035edf7921799a6087caceaefbd375a5621220ecb248a3a0a019bbf4e9f1c958fc0249c68072288d64aceae9b902d6832463d88132f6abafc7c3136a40859d838c4d0edc7b3f43f3bd37423eb1dd7a277b21d9621d7cef8bb4914e6dbfd769f026d12056023f81731cdbfb9d44becfecb59ef5ccebcb9b6eb9af5a8efe8eb8e794e0fb3ebd9752449969a796434a91effb0431e6fa7da340dab0bfa7debddd259032ee97c3101cc990b15f5f9320be60e7c6801bc37e44a3eab1cb9b46d9639749481b316343701a959dc8f5b26bda9d57bb0d4a9ce6d17630b10ea6f6e25a65a53919d6c11d5a938aec1c86b4c4029b2072571c8122478d867322cb32ecf15a9665599665693d08817df3d78b11c4eec146dd2f3c22dbec636970f668706a1ad6d61637982ce09c2718032d43d501b6584016900564015940225555811508e30256555565d9b7a37a78895955252358e7bb2766fdd555619875495aa725e42cb1eaaa9295ecaaaa2a53ae22487f79d56aa55ce31440f40cb3abeff1e59f4225d3872a21e966ca92a2b1855251a351b1aaaaaaaaaaaac68d4e694fedd03c986e71e9a23a808d1b3b5c0850c055550788d181d53800f68533997eee98f33576647a93695e43987096d56854b46daf3001d698759b491c9977619dc561ad1c955e97090bb187758448d1d01517492c6fe6a6dd565b94524abdce72c6b9d1276cb533c7805a6badb5d666963773d6171b03b62f625619d0784c0b0399d2541e34dbca7e41ec6d6c9ef1e57a4f0dd0387b93f1a576e70dcc9634d20dc3688e912378d6b86159965503c605ac615996455f63a6ec075a94247008e669029313388c3f8f9692b39ce52c67398b17966559966559d3a5b4061cbae41b2535e030feb8dc60b13e7f23c6442d7ace39658c2f74ca1c481b8df12077481933c99c69b017ca73d0298c146e20576aa22c885690197c40828a0445b2653d1a792deb05a1a1f659e54d4a675f57b441185f98dd64fbe9edb836794ccb91dd2fc88cccd937447cb19f71c94f74df314d268ca93d0d281ab497e96b034c83e7a3b1d3a07d1891c0fd90c64eb6df21c660b7a8abefa4b5de4af321fb2e69edf723faf4c8c0c96265a7124a5c9315f490f2881aeb4e8c09414ced88406616764c2fc8344a267ee409327d0f7189c90a780b2d6eb5d5bd341faea5f1202457af327b6dfdd9f8d2971e95af69d4a93f9971008c2df4568299123018926c54e869006c805b7e70189700b131e288fe66621ed2281c2232a7514934aaba8e13456662a63bfdfe6e14b8c1202dab1bac0b593c92e5ab283294e56733738e8f04c850a4c0e1338a10b08c48c8c93503655a9fd1940654b3bc0f3c492650153f2ea8420e6b64f9e38223f207a8aa20c8f2f1d59327dbc5cccd36be5429636f34968d2ff130350e12b9e2c8b469c0e10d93ec39e7677f2a0d52531555745185162dd8b942476ad87e49849cc8550811c9b18a2dd45023c72aa0f045111c737d18b07593111714139bde05458342f2851d23c2ca184685225900395a31a44496da7c26611a25af4faa7c26b051ad6117e098abcbcc50f264923e41de8aa02b7072f4f9f9a24b90a38f154a7216b51c1806d88a9f1c7dac38924369822c1fabc8d1a78a25796a39f012b8afd81dc95dfce48d890e0ee9b4175bd3335dcc6df8bb0d529936657c0e7b3153dc7d73d20625e761cd33a99ca54150d6b8d1a0bc0cb0ccf4d4d603744a4a29c53068016602476c4a28ea6b8c3418a1f000eeafca2ca7c822de01d601a6591659326b13ba2ca17487f96d55e025a3d4100f7c07c1717c390cc1a3779f8fa3d1e8f3a2d798e6d743cdf3f333a241d16983a2cbb48fa125434be2c518c894dba6e5b0dfb41cd794390c99cf80e4bd982d2d87f79d9ecd7bce9339866763c4110da40c587ee57149ae31ce71df5e63cabfd572fc3b715f0f3573e73e231adc5ed276c41ce33b71e7e4ad955fd274cd3b39e6995c4f2e195a52dd7b29e568c66519a5f277c35986bf28656ca79ecc283da687a1e508429ff2ccae78b1418e5b59998f9af66d5e4e895d57c29887f1acde4fd38172fcaacda43ce59f96e3744c03d260cd24902889482f8c4b548e9d6a33303e73c0c8a4e8d21b7dc5ebb8cb8b7199696378d7a567cf61120c4fa5c17a15efe4812e1e8c37a34683f5289e4c83f5266f4783f5279e0f5e0f201aac277942345847de13df45df7d344a76ff1ec62cc3f53033a4fc9c77ce4b7935a9cd89b3cf6f5996655aa6e50832df7dde10db3430775c4fda5e334dd3b26cc39cfca6699a967997f64cbbb41cf3510bd2ddaacd6833b3dea5d372809acc0e441269943cc633eed0a0f6794d45c6dee6bda1dad7f3c2e8e3a3512ac0f4f1b296892b43f551186dda22c34630bd8856d143c980e7e9fc10ebb22ccbb2ece5e117e0beb53670352abcaecbfe621660ecea00cf12384ae7ecee9e945a1fa594dee6da1ff5013b81e729125514a9b5ced994523a6badb576adb5d65a6badf5b5d65a6bade7c880e92bfd583a874c9fc6208b98c76eb73cd18772f0153f4892a31a72bcc20744b24ccb217aa6e5d8a4ace2264e61bbb1519b683ecb32a9e5b0465a8ed177b2b279b74f2d87e8bda3f27a683b8801cf5f3e9a7d1f7b8d295bc7b41cd677eaaf879afbfd19d120f6aaed88f9470e1da83eb7ecb2c7bc7b79ebfde899eb071156be1e3311d695deb4d8f532fb4529c35e7a995096f3f2b0cb4c2c4b8de60641b992fbf4f0314fb3d66566837747a786900e82e3207d37c097a712e3cb6cbb7487cdc7273cc9d798b2fc7aa8595e7e4634a89ddad3537aecd906b1632a8dbaa7526eb237905bbee65e4c1efba6278f754b59a53623b5998c52179621e030fa600f5d7ce8d1a8ce340ac9139228bd1830a543b8b7351c013f81e569830ec8e223cb121979c66fe3bc80fb72cb3759d75430269549c406f23c11324f8984c643e14aae92cadb603d07064c7f53a89683cac60dd658e9596a1399262b6765c94b9768abe99204eed316f201cad1c7a727d3c3e4e8e393d3b2e7fc42fb85d6a541fa1529984c594a974e4999c91cbae497d8424f632220d3e9125fe8392fe0f9becbfc58e823900b324bb26f2f9c9fa941fbeb046cbdfac528c05f6cb03379e7e31547a098b7596411e700d3064f4850a2278a1c91a084911cafe588042596c8588e48508248961f036ed55424ecb6afaf8a551035a42f3918aeeca68fb4a75cd7b65d2b62653bc75ddc7148eab28bbaadbb4eb7cc914e0a6bf2f68db45df4d5907297bdfb7e64177d3f34925743cadb53469b86b27da16934baf7de7b5d2727272760209570de8ef1a9f4530dc9922c69b3597b4822e5ecb338926a48d7a6b89565d9e4ebb2d7b240ec16bb3d36440ee331d946f8c275611856c40a662d867535d75a1b9b9a5b73350cc35fb8aeebbaaeebbabaebbaae11d7087b536f41b8296b593cac7bb45b6c6c6a6e6db9a40bd78569d8e8984985851b615e78b1119661231bccc6c6c66654736b6ecdc5beb0e66a9aa6699a76ac8471241289d485ebbaaeebbaae2b73a3ebbad7647361ae18684bfb557a442525122e8c7e45379dc4a5705f4804cd45c0c8a58e0721b9f469d79e7dbbe665262251c783909c3556012159fb2cb092b30f137522518a8894322291eee8777447f7de3bbaf75e2e685e64d765814ccb62f55505d234d0c28874c25ef6cbe3ee35a9b07019e6aeb0db4e176d27fc0ddf63cc6da2df2bfa68baed3103396ddbf7e374d1f703e597e67bba97442a916e8944225dd22d9148a4eb1a91bed16874efbdf76ac15a6badb5d6c64ec1b888eb0ee35e6b71beddbdb8c1a3f43543c5691491f8acd6ca23ac39578afdc20c2cb1bc4aa4c15aab6a81a11cc6d7d41c4bb60a6a4e162e11e9a3939fa4dce425d351b073bfd7c3a6791be99db7915eedf80b8f390edfed5aca33cedb522ed3d876b563dc2bed877b7cce3b65dd372cfb68bacd880c2cc9f861b7a5685bcab7ef47cab3ef87e9584dcdc958cafd4c8f4729994e4826a51289442261f7dc8691b0bb61984824d39827c218638cb3705dd7755dd77571d7ebbc1c8660ed9c17d6d49cedbaba7befedeec5c9984ec6ed646049cdc945c89a739980abea1986d16a1ef364aee8e9fa0f7beb1710ea83f6cf1548bf4a1f996e3ab909ca53ba8bdee1ae3b8a498565c3b98853ce44ef2eced7f59deec783909c75f8ddafee9b17dec773d5edbcae13fd12bdf32aed87ebdd3de68e2faa8090cc7d1658c9f73b65ffc1fd3ee37ecf71bf1f908c0f248b2e7a783b91178abe75dabbef8776eefb81f2ee327d3d1b2afa6c68d6be0be5f1292634281f6dd0f4fdc4c4a4f451e9a3d2a8341a8d44efee48f4ae341a89eee8ba48a38f44225d41749945582402b2e1ad3b7932b3b3a1572412894422d117ca3ceabcc9fd07fe3d877f3faeebdc894ea2fff872e8003e755aa42c4096649b69ea8d0896b481bd1e93366ed43adbf7764a5febb36fde4cfdaa99ea0b7b9bd73c79753569ec1099de0252bdea715a989441ed2b2b65d0571ecd35735534d5ad5b6fa6ba65d964fabde65e499b80b142e997c935d24d3f3975bfce3dbbbcec9c8747adf1e87e554066d1af7bbf93e83b05d92eba6ea50c7cd1afe373cf441ecdbde89b37733fd1471bc434a219d1afe81a79a1a849bf7d9d3b35a9b0dca4c29267f6ce068b4ef7ddbde8f8c7fd4e4146ef4e13a58cf0881caf01324483f646d13d3570d05290b41c179206edbb2e2c20cbeb9f5a3b494f83d606d50b77e4eb196ed034056e1ffbce8bb3a5933d3bb267a8417b5a515aafea45b64aa2c87612c9761ac9a4a4b51a62a8a651fd816c73b5af1e0f3600ea699f46590f9b8a6cdf468836ea17c4063f8696a3ea9d78d3a0eda06e24f1c5bef2faa7b18832ec6b2f21dbb79049fbaa779206add00770d5415f0b35d86389d06080c34e92adbdf5216cc5d864fa41d007241dd4491a55fd415cb6142dc589e4e99f4662c91e19825c5d521153f8f61227c6a8e4caca31258b44ec354fb7643994320631257baaecc93939db91ab0645158f34787db5791ab4ef23378dba620c914e451c493891ed3412eab8f20c000e70d83b48ac2c12c261f34891ed0360036cbbdb4f9c9d4675b66f28e8f5aaaaaac739bd27b0b533c77eead8cf1bfbce6b2fbac5beb69221a6b51857b6b21fd85e341d438e41d91e8818736fef43a3b4dbf7c8606c5b8c6d5bd9b66f9bb76ddfb6ddb06d2cdba6ddcba33056e63dbd5e756fd07c60b99e61f5fabc7ecae64da7e4cf12fb899344a38a348a66fb09054fb633ac1294e490c5da1c4e9e6c718413bb7aa48fbdfc914032480e35ca5abf32090972288588e49065047686bdaecbe6d8a631824b1677007f5da677f41063fa0d88a948136da84819210b8cd2f5ddc503a9276d782c2730acd20df125c69c744e5ad360eb880d76ec79191b8cf1459b6169b09f837490cee16764a6f1e24bcfcbf437bf97a2b0a35bfad69a7e1fe24b8c894dc8fdfe8e27fcf064eb57b6cfae0912b89a01aec2fa45b5f30aa851d7b15baf82628cbdf5caaa8e64eb3d1a75e5281a75a4513a33b543eb64eb15ce4cd5e82f66aa2a992d96f5aa87061195f174054544653cf8c9d63bcf663c88a81e3c8db2aa85043e1121db90b997b2498e3355de2eeb5a1318b43035ea073668edc8da2f2fac91af679915817ab0b94783339f66e6bef0023d808831dcad99b787336337d7afdaf12a28e28bf59422e0b0c6fde68535635e58b35685bc3aa464a65c5c94684be0ac0e356855a1066d8e597eb50b7a352670666badb5564a4538c015cc97cb75baae6aa753d2a788f58ae7a74ac2182290902c82e40839bc35078985c4480e59720594ad2a875550b62a1c613594ad5fb247a34297207c0cd1280b04c2ba118daa0e24821cc62e4290c3e8054e0e59b28584658204c66436410263b3d6cfd05cab50a3eaadd7a11803447cb16ebd5221a21a1041ebd6337b4d90c058fd7a046008b8da99d6e3dc81e6071f628cac9a58424c42b6be6362975a4b4915e3f91a0888368ab0b9de7a8e362a1d291363e46be42274c8d66fc498ea01e105115faccb1e0d5aaf74a40d084419d6adc718633dac9ac8964a9bc2a018b31363e4ad8c275bf5e386e28b75508b8c6702c517ab5a9f9715812a507cb1ea4d7cb12ed32e50d8afda69d0ba919d6c619e524f261f59ec049237b204b3942859ce9087b962aac76ca9d5e5f7012c6ff8c4968a311086895f686d097ce5f9d5288263661b155a8f41d93af6b02606651660ebf29fad9138b9faf5b0267a360757efd37b8bb68cb4c100c800cf67a01338a7ca9c06eb4117e0500ec93527d71410dd525f7b0080073f3b7cb02ea5f4513f447d8ffa20eaf14c593bab95571359bc8696c0b26b15e1205a24b0285f38310675248726964ec536bd29500a1238344d528ca99fd5e79593c518341423672d6f39362aa3935a9b7699e632482a03aeaadc03882084a83e440d904665af5e71628c0172759b4ed5982d1557857248ad6c86df2dd56bcc9410b18b5c9dfbaa6f5f187f7205c403c2eb010eefc55d597d8bde3a08d328976c5931d7ab57d817adf7aabaf5f568b08a40433d516257c0f2406431e3e433d9a22ae02b6f8394ca1c2b2b65e7b495652f2cbbd6d5341fdefd1ab9a3c1069bf626bf533f664941da5d6bad550ec9b43b368893e9110dd26b4b602ce2e96d8c8831d6e9b3231ad52a907289231a158102c004b636c4b4ad5e4ef3a19332561eb533b54302400b6cbf4a9be972b4a2ecad8ab227ad95555d91c5925cad48a81bca6eb0e8509ed798c01226cf7a14142f94a02c892f284a660a4508c5a2088138c0610c254279dea0135f26f71399c0ade9f0f2e80bfa2532ea694ae0be75daa08d2fb1e27eace69090c4230591801ae47ea40d1214a28c49da02092a2613adb81fee67f40509e80428beccb354eb3b090508e586041423c692186088365084640c2531bc689485220531e4e983fdc497f989f508491bd81551c6fcc49220854b6d0c2537e8c498eaf337288931f41345499eb4fa62e8c4978929d17ae2cbac00980287580ff5b89ef832b725f165723f791eb132f6562fab99eb07c69799690c2f1a9c31967c319434388f04960f6328b9a10c19783125e5e82967dd4e34d503724b6d4625ab008736ce2d361e6d898d0777632670fcb42570a4026b53684c90729045c9066d092be8bc56ea00f3fca403c8d9a4937ab2c2b5be3cc125c71c72bc48a825c72a63b59d68aa07e4f9fd88d639fd8c4b11824c11c2ec3929a5b44e9da993e5ab2fbe884139450895137470294fc0a1d531a3ec496b65d9ad1f3f822cfaf464cb04b64ce0302ed1e1e5185fc25a24db6b4ce0b07ed1d79dc0615ca2cd74beae6f881b21d6d198c061a90765497cf1327dc471793277da12385c4992ed331e1d80a7ebddab27ea45efcbc698edd7af18a3fdf2702882c3ce6c11004e00b20070228ece8b38324d0538bbb6022cea66aaf6cc54f53353bd6511633400647b1c8a340dfbcb0b71f80287dc3bd9bec28127dbe3f0457f38e85801873800657b9d6c4b4338a4b103948a93c64ea364b65a13f8ba032a07d48b3e1a3b9d478367b6d897aa80c395a10c0adc1fcaa10e3d3974e8315981431625216651c2b224c66cb76701438cd16ecff2058b121c705894e49695242b425c96e12cebb24c9465a32c23655929cb4cb2cce680b3accb3251968db28c9465a52c33c9b2932c630287f8c84fa332248da24031e616c05a55a5b3ca96ccd96757ac10533af4e8f0c305d18854323931a11060442989d212a526949e506aa21485d2144a1f631a8a465d33d538b0ce2c922d8d1d3c7580aa1360bb836174608ecc008a312cd95ed3c121d681d1a1dce98ad00a172b4956821ac5ad4cc15be9a24125f1c59eae0cad6861850bb75a3b75e8d1a1a7ce4f014b568674e8f98648d5fcf0ca10661962c939a22d81431d7a3425666c7cd1e18a6803071da9434fa3b8dbebe0d3287c7b1d7e624c16ea90042f05899702145fec3be5a7417b1c74a48d942ca20c7b9ba245b60f7168225b9569e22697f203e327be608f45d37165ee7b83f6293f5ff9f9c208e4185fc417fb87291fca92f8627fbdbc6d21db7321dbfac5116b31c63a37544a2b4a2d4a2da517a518a519a597d2ecda9d39007c84c6ce457f7d65e8f268ec783478b880690e69ec3881431a3b3476421a51644be348b68f31e6393cc010876118c33a0c1361d808c3481856c230130cfbf09106ed714f7cb1bf3c2c4583161f3992edb3ec765ed45480b525707823dbd3d8a10184985a198a2df676250b3dd97ec50a31857156b880b3accb3251968db28c9465a52c33c9b293eb6a4be0b0d4a3e3caa59e06eded0e0d2968eccc54df9e060f8d28681c39c0508c69c9f6190aa529949e2855a11406a531285da1d4bad77c109229ed69d495ed330cbb36798c3353256a9f699aa604be2e5ff269d0bef4135fba977a66aafb6c56ea71010f101463e8ed637696b032946d8c4c3f969cf8620f6a81c395a1ed26bed89e46957c1ab5ddbef41363b2db6fde8c062dfd600030050eb39bccc337f1c58611c81c4f7cb18f5ac8360b4898e06407450b2d30e1312da18952cec9111590864c78f081914cd04fc9c230e10922228bedc55a2c215926b0a0130a1a31410429c05b88d8408413bae9c620822d8b1e9c851496d0b4d8e1b2c0e204d7093b5b16452841c6059096451498147a64a4f073710d44703d4149c6028b659143022b0a45ae2c3a50822ac98f5dc3072a148e5857d0a15ce8545aa060022999d5022501a72db617372168b644db33022620916182c5403dc89179820e9ec2117cadcf144a108020a0410a6da02fc0f80b3406f8248852815772f4910210e41af073f4910213bd041c230dcd0446a94217b8cb6222812d24482db8e04163017339fa706164ee70c1858e501634471f212c7aea10b2134d3f3edad08c9dc2fe4e34a1ccddcdcf2924cb79fde8f4e0bc02fa552eff889f33623b39be4883734696de41901610e105536822470760a0800bc24004212f6e962074cd13549d0e25a856d0a1bfea0a11501a370ae540149d206484dca69b5272f41152c274c12003001638b4b9a38c803dd1c4cb1cbf93cc33cbef442385e4acbdb033d91d813c3bce209d6b22508e5960f007584e2c64d92806b6bb7b04032b519df2052c3fbbbbbbbbdb830196dddd4db120359d9a1318acb1aa39b3a5abaa33535891d9d2395f8ed7d5440289b1c9a443c6e8058d159929ce62455632c7633790657ca9bd015a4bd07989dc938e82acab3181ad5f2d6dd89d1cc13983d8d8dcf1856a20d7f842bb9250c8fd5150c8ede47e761921f7c32b771cd2e1e5f955517a5952ac48ee9ef8d21f15c13d493cd81ab218634c2943d8dddd317224c04670cdd1472827d3243097a38f1007280ab095a3cf1668c026bcc517688084206cd14506d2c25a6c61c4905dc10b5c94e4f6b2c50f725fd37274b6451b323dfdb5b08802153e3dd0c10868b006277041031c5280051a58a0031b542106316707d3a71891517022003d40c3134f709103356011d3d0c4089ab8820d2b50411270d069822f68914bdd1970789cb238a250dfd0413eb9a1901b0a2cc80d8533e436a18185522194e96d900b32bdc55f3ca103991a21d35bd60c4eb0e246a6af6684e10c9bbd7509b451d60c4d7001ae827c904aa657484972932428532700654aa98d5e78810657da4f0b1ce47ec4556829f1a34ccf48ea94cc79acd1ddb485ba25c77e4074cbbcf5c974512401d6557a58196092fdecb68ef5d5d86ca95c725fc614c97e00f78c49252581802290a90a1cc69e9094863cbf03d34ff2f838a124db384dd3250bd9c9217d4d0ccadd56cab2685f627837554969d73eb06a8f920b31a57d4d440cb9de0ca3d7b4f36658889223ce6ca98d135fea2d1fe050fefcc89f0f3153d6f617626caa200803e61a43c4978aa3a489f4555ae5884a0df0d7e7c91d094583f5ed499e068fe8967a15151616179719213844b7543b2d1ee0502ac94a1aac97b55bbe82b3e2799ab3595024099d5c2bd04ed56a9d5249aeaff435c42e55a5239da73625070fe09af968598065b6aca5f1a0d2a82b574d89beac3c42477c306f9b4440c0f2b35bd20d4b15647d51cea64a9629a9c58d1ab27c54c912cc72c6ec4832c918639cd2caf6e4153218f9f9782376b19423e9246f1fcc3c8d98001c8b437b3dcc8c78433b0270401c9af6d16ea98f8d9aaf27754abbbcdbb31bcc6f1e088e437bd61701eaa747679687441c1147cb38b1cf8c7de105228ee95d59f3220e79b3c4b84149b51cd2cbb06753cb711df3ae2981594e9aa9774b85a9f531e654ca265576997480f1a5de145feaab96bd6af7569b3965d84ff79b3a6ebeea5962ccf59a2d1d37631fcc8cf8529f5204981e43a4fc0c6bae624c95e3cdb1071341167fb16555abfec69ad15bd953ac76b69ca2c9de9eb45696bd6a13596449e10096578932466ad263c50a92486215d151430e4d39bc61858e14a6392335cd9826956752e0f0c60477883137a6f7eac68d4e95727618623ece396769ceaad2094e7995374abe5a219b50a4c0b56b95a5215ab72005b580b6a0248771880b3f55f60555e8239da9b843ee108900cff7a58622044c1f3358293d1ddd504a6ba66b3892291aae5882062fa0218a52554318195a020fd4c8b47a7d9819a4fb306431e3aaa9a231c6b2d7d65b16a9c1aa62ab0885fb3052016bc10486c733801c904b88a9d1eb838831a327e42aa7c03d9459f842f7509ac1fa421a51d6ab9107ce967a1b45301b4a0211ac0f63cc7579939d29ed967519513e2c1c1f8d6a9d964044f50a22585f3fcd83e915e8f4174466d75d02a4c1fa2dc7cd93a066599b657196852dabb32c91658d2c8b04447cb1e64f6ca929ed75368e8ca9c6892df5d348b7f408e24f2612c2d348ef541c82b982f999a938edf5c3640d0a1b6020d289181373fd119d8a386a12b91e8c31d5eb7b00d1291fb325d6df1a82b91e20d768841004125feaab7a1f73debab262fa82c8ae1a27b79136d2465a27b7915cdff5ed44a79a48e334184a9d5c0f001ee0ae8d335b6c22aa9f884444541b011263eceba58e11b573727d7d8c31d66b3fd1386da473acb599b5d75acddacd5ace5a6c6df7f85512c63b4b9596f422bd9138408c20d9895d60628c7d556daf921029901951f2a7c16a651280cc54bdfc99afb37a55c6ac0b665627287043e08c1e6c08eb021bc294ccb0aa926c49296beda253d850b75807bbc5ba17d9c2943468cd39b1671886615876cdb8aaad41d6d6a04e4922f4d4212f1a1587600105911a5497609124872cd97a58e1541c619593ad5b70460f36c49255b5d68a0d615d6057c086ac1a54836472f8b0232a210947c8d677983e20a1345e6b671c40e646ec9961235baf11a720e11a8471b0206ca80661433528071b52319940974e55a11ad4a0f51a94adb370435889ba24ab31f2d5b61c69466f0fe1a37a1887aa0f6dc41133c6d0c87d1f7248a766c4a11b4472ef70818943497c4ce094e55b88181344ad2c7b6199a5f180bd58e24416fb5a8c9c753633da54463aa9b5c973399bd7091c56255589b42173f765e5911ebe6910071369d47c4dd23a4ee022f8061be95495c2fa40919b7424c6cc4092bb02f1d4281a3cd260e31ba1dcc73743a4bc9d5876116384861a454daf9567a64e3d240e2b0737393385a20332bc200b4252bca00338fa5867a684c8600ba0280089808a35cc00471fdff4314e3f6a561e8271f08d1630cd21bec90d13638262cca5f5c5524e966373b2d596c0fdc7ea5953aacd5c197b164540b8d565babeeb420aca936dcec93657575b025baf9a0e59e4a456af5a8eeb99091298ceabaabe79c3836f555595a3de04097cc22ef3494795b16f0ec9a2aa2ad5dfcc166b24c660328836b2cf06f18988bad77e3d6c2237d37ef220a6e417427b93ad10b2956da022db9f9e37f1c50738ec219985d8627f3d698528a91065d8639e1c8a2fb6a75becad953dd8a7e5006b2fc0610f2599569216d29ac0149b4332c58931b127c66040d39b3dd3a7c12993746a26d1d2083135397063c60c17171616959e79135f6cfd668eb5031cca9e21111470d83f758a46a492c9890965d60a49b7354102a39800dbc7ac11c9d167094e64691b89cf129264297d3ad543b3c5f6c8245ddf43d3ce2fc4d57ba27be585710cd906a179ca38e756ed5853744bba1dddde3a1263bc1cb248de883c23668bfd08c86cb1b73c308bbc385baaef4433ab2f0c22d70f650a2c7a288bdc74fdbced2c4b645923cb225956c9b24c2cebc4b24c9625ba27dacc95ed3322d735895cf3660e69548d31d94c02c81035291c77e238158e83c17131386e85e3ce711ec76d5a0fcd942c3265912ce5a40223c6cabd9b618cf16da5e3cad5b499e9467952811163e5de7752811163e5de67724d664e1299488373c8c49937277767472269d04a2498cf4f8cb9b1d5e78d44229364fb21a6b54aae8aa6c1d0b4189ab6a269d7344fd33e4dbb41d36ea60223c6cabdcfba37683e6096e9565e1891d8346803a427a8040c586a8b5a324524100000007315002028140c078422b17038cf024dd4011480108da44e6046950aa324865114e50c228c1062800c8008008c90066910008fed8ca9d50a679e83796a94c3b9986ab4bdbc3a5c50238467cd5ca33de5d5f1821a23392fa4f102e5f564811b217c136d8d0bd4af070bdc88c0ac987fc444b3994b0ad187d42b484aca4421a40bfe88b9127c45a8b5c81a6814696e31f20608ac22bf88a406095c317a29b28d504c45d5f2c81aaf4045e9cb486a4ca215cf47a051c11cc8fd88e4a288ce821b505fe37f27414777934dc27aa78d895776eeb210e9860856316b39d20d2b60c5be26b206695411b78874631456a1d667bce0cb0d7635b455da506a96262bf175ca9984671c6f793d37e5e513b31a1a2ef9c1c1871490434fcb78dc6ce41bc94623a35902b72db52b829a356c94e2b9d9ead719a14c8050c3867627b29dbf717664e63ef8bdff76fe9614668361b9efca8fbef1dc165b0e22fd5ef90661747e8410ec9ba50a03bad9497c163d3a9cb7379c75ae0387b450f438049e3dc80ca6c90684fa16d82fd183b535d195eb25524b86ef48dd2d92b095f57f5af4153c6348ddaf49685e1b3335eeba05f262a805f968b2693f2479d7e88a5b2e2778c1956a6317b402a9b2ab19171a54c54333d5b553369ffd92a5d2a8649c0acc4a7617b76683158240ce8ecbc9ea5ad12975cecd077dad2271153b2b5f677a33188b25dc7e7c89752f83b3e1973968b00ae5828f23d2e8a103d15bc6601ba9e42fd6439da32ea17d52ccc9cf751716e1571c0866c709dc98e716b02f83f2fffdbb6c759f5ad40cd70fcc9386a2154d78e5ebb1f080187c3c544f629c9c6e0bed321446eb4626454130b39cb1228353a01048f55c9f7db97c96cff9d222a23e4f3098389083644cde1f889a333f0b0a4cde2a3d39155b9ae6bf59b1559ac4a3fb6272e513902edaf2ef68471372f958bd91bc98306e1d24fef1ab9a9d03c6dc3b4df4e46bc3b0eb542254a67f19e3f2098a43aed14cbbff88ce2af0fdd82283d88d0b0e7e97bb0858f052a8ae70821cc89cda4e243d504da8fc49c5dc5af9bebd7f54606f933d4653ca31989521b320714b0599f36161ebbaceb930c4931cb8d901768d1f4b078eb262640bb28dd25159f307107c03906750dcfa31ab3ff801a7cae0a47ec9d9ae03cbd95e27b3a2b2923042606a0fdda58c3fcdff68e5b6fe38614ac77c9a0e2a56e98825c04dcde69c30b9115dec0163d3dcf2d7551fa9d14be88f09d7a8e00fc1b128bea50bb8d277c261066a0ee31346ccb422a438ba997d8ba8c40cd92e4828717c504af366cb6c5467fb7028a9764b55961bc1248672c901174722c4d63b910a96cd691209e22fa105daee335c1e5f2e8ce886020fe5f12cbb552ea3b75fe1fef21921f36482fd1a0a52a1dbc0e18853baf936394cca357694f979b9f9b5465895e5d614e9236f87c0052106783e5b61a466154a1605049b3bbc6e16476a702202136b02f6e017fae84c5241a4edc21bed1ce7d1cdb1bb55c7f4297c321280323edf8f5ccb999594cd56a633614fa052ddfaa4f79095cdb0a9689080e35bc44889cab1f1cb94d702f76087a1afbf0bc390fdc032538aa8a9ec3bb2b4952d696bd930632eed5d5817a16fc82da426ce6421a35b956bda70aa3ece222d6844b4860971b0df965d58d20708f3d848a7dc19c7fde931617db535732cd6eaa4136983e7b87129225cdf59dcf40b732862afc06f60e28016f4218e9b11904a8d103b04e41990566384592cbe57ebc51ac46d327abf41d88078159313e423f2008464128d71d9103b51782032c05f5eff44808241c18eee3bae4bc66ff003e6beab3852a856ba26c4b7f96e2ff1643fd22b2bd26dca08cbf95ff4e76fd2f9bd6c8672df64c3d4d9d9d44d3a1f12a6404abba8086d3180e29248b6bffb7c95f1a283fd2e27717690d2867a3b35a036bcde3db900f632b9634145d24bb53239d050af59f30a5bd630cf854c1aacc58e35e46e13af5aad2177629b4ed6c7c0a5c4c034599fbd149e6c4e50a7b96c7f1785695904c3658e5b6dd029f952e124ec067693287b8693c4032aff61ed927bcf313a29f17bb4e201e177d404f2b6c45d7e15380dba894eb4144a1267c826b28eaaff8061badb1f0942fe5b04716d5873d997192be15d6efe5ede9d5f41aa2a0d96803a3955cf657c8a6bc3d611b83960267dcf0295446618a45c795c3557b195c171a7749d8ed3650e0f25d0eec7e6e849d64849f33659671041ccddc68444e25d432032fb883c13d14f4b7e06fbbe0ac762d14069ee318be154359a57009105729b31abaaa48bffc74862bf5c20734e609d204a4f754cbf26b1a7818ca692c7945dbd492e72b9c0142e5daa57476c2695db1f3ebb81f44b046a1cdb93fbcdb06f1f48e991aee32c48618152c2fa815c874e157d9f664274f20e18f212cca0b48b325adb5e5773690c2bf80e620d366ba6a95a5602f490feb9883a214d9639ecc9222b0b2477ec4ff72555040de756e32c4dd891f79da1ba92fa55609119890b4c7b8ddcf29ae230fa75157d3ddb298eca15318268e6d077d6b4d434518d5ccc41c377838959023c1a6be0d4334862fc38f669174db6468f4fc38c9f2571316bc0b9569add6f6cb2e7a6b816a5bb06ec922047b34f3a1fe46c72b65cebec721c1d8f2034fdef89a88dac8f9bb561ddab2ba915390f6ed3df6c505a7239c9975e91d15aef868a56dd6480ec029f0e12af3b5c37862674fb4de0fa00446c2f701dd4ef006c42ef02132b11a80ad2c39b527463a097cb5f14b745efc7821e000a1dd1a8a0c2cab67b54705119776ded9c797267a193dc6f6507163b09db5589b0e5365ae996e8dce3dea933fbf1e4aec53cf3c7e3628ae9c1220606047a91ee8c3e8bff3383a72003ec2c309a08c2c32526d6e4bfada3206fa13e9b80e7dc4a206463ab0236abb60e8787c0e64355b53b8fb6514024c9c0d9ef4197e8762c40a82a567c5fb462836653933e369a7144a03f38b6fdda30b1be872d3021c6c6971e4e6973fcae4069ce2cd8ba7424472c5137ed588bec4be2f0ad49704191e2193079e8011350a1d260966f23d8fb7e57f6982fa7eb948cf2ddf40473eeb72b8b4d674f9311ec84a33673210034c285d37cffbfa3798020b339eb64b29147c04c282a7527b170d456eb0dae89beeaab4939f6a511bd608490e13d2f8d3c61315bc8761b93cce4a50605066f08ccc8c2c6f21943dce5fbcf547a522edd648cac02fdfa59182099040297a415a2de9961eac45d7454643cd36ff01353f62e215255113253be8f518624fe9a4c81750f55d7a95f6fd7646ec838d28f39d7136ba6417a878f1f7e940d8dc21d375d9901f400155bb9763f9555cd10ae929b81fdaff0a28c519032b7e4c6042657b8ab46e2c004deff0d3cdcc4af06dce1eccad45317f63e2ef991735a323aceda6858eddf0ad69c37cf976990dfc10f015bdeaf5504cba96aadae325912bc4a84f1609c97b412495ddcc8b65c6217c810cacc147cf41cb8900992f972fe709e25571dde0e4cf26f177c75429d334ffc79e2dae21154e1761537e5311014316687b133649ac94da484a1f8f3a023846d3ed185fef8736f4fc4d418d23c0d52e4327813618506e19ac254d52839cca9e02f915a54e4299552c70135e4971350a0b1f5d3fe140d3cc5d209922f94d418b880d7cf2a6172576fd47aa569304df353ebbf848b920a8f0cf8a2023917027817c491131e6b283acb9e7f5cd02da18935ab5e8a8a37bef98e3987f053f5a9f3c134c00c6d660d04072e97be4a3872e1d038abbfc11ac1c3e74e0230aefa39deb827de710d0d1fbbb01c007c72efdfc59a5b300716ae4d7e50d1198d6c7fbce737ea4c85e1c553a9285d351cdb8d2875c3076d25d0acf814f27b0ddd2ab4b39e997615db5861ffba9faf4b6b8af83c4c5b1d9c4e8a31a2c826239a53c9a3a165707dbeb60096e931c1cbf8998ef36f1c8f6288d7dfec300462e283cfe7f3cba51bd0bac7abd07d19a06c9b452f7a8f2c3039d73581721717385f35398465c3506e65d832cfb9cbca9723b534c8cf4efa5796908c97adbcfa33951a92d7a9acffa090eaedc6b8e677cf91830f7afa67f966d77b18c084521d70f57eda50754d5ddda3cb30133e8b8c4c04af284b84d92e81532198760abdc925e55ad2ca535d121481c30c22f0aed61acc14e825e7ea378c0ce45a078d6210299a7d23e71e0db0cc35e298d06e9e75c28d6771b84e7f76254593af4935c3ace9742ea5a7ac7dcc2e5d21840c07703e8dd4a8817ff857bba7d6a4857c202b458f814dbb6a43cf629c11b7503f3e43b12c6f1193d81424e6d4d44a66b84a34e59f94b92d75eedbcf811053b4bab3b0c0f6d7880cb19e1476d4bf17009b7a0b9c7c83b7cd529b8df31d9bebc36617542da4610a5eab5d2a2548d9b79ec7099a6eb07b549300ef3aaf25d57300d896d4f2975bba6f8b5babca5bedbdd42becd0bb66bd64f41d8b292f2bbbed96715cff011e15c1e0d5fdcc2982d23272e3c50de3a1d83efef20867b820edcf5a7d4a1522d0d806bbe5a32421d8692cbfd6f8552abe41d8f9a0039c45cbc7540121c4529808c9497f6ad983386b3d79bf9486f08584744f092dc2919f386463a1f61b328a09de843adf8638818922d4e5aa0ea3a1eb34903d3524ce10fb8286df383a8d8c38e86eb793f0cc7e759a6b0acf1cd9a92ba95a518db6f64aa91a12fb0da213d178cae6b278f8d51b58083c35f5c488b9edb80e8592065c4477ab9002524b33412e60546a9d9bf1014e41ac3804dd2546edc691bd5aa2cb7d1d39d5fd85fd903194cd9bfb0d9b9171f51c899b0cc62056bee48f8dab276d642befe158da23c9ab00b1890b6e719addd82476a1b2afae70e3b940a72b15a27e8985d3cad648e4ea7b9705ec6cd84bf60a2d28a1c751e1f454d17e702fecb3f6740ca019f7449cf91dc6ccbc6b98e2bcd662b60df8083e66991dea34a31161fcb408dafb8357dce44b423d15679f210dce1cd4fde3e1aeed1676a93bb53a16a8b6a4dd4a9b632a000e10a6083b2973c3120ec9c2d55d9f8d4095b2f3727356d9bffb40e46a93285f23ea21c81428774d656b53281bbebfcbb4df987ddee9428a902905c18543f597aa14c492e6828fcab0f8ae7e8d1e122e7a8ce81d8d92c38df04f066339a68080e3f2f95e590e496e61275db59f56ff1e4b01418b375b102274fd795aef11ed5ba0584c1284b60890701b97453adf565c0b8865cc39f81406e222e12c0dae7a855957fb247be9f3faad6c78a69d3d75d5174547eab16f8f68850e48fc52bee0106b65d61d85bba93085d71f63dbd3d6eeec2e9ca4fedbb8628366924afe965e83813853b03945f0398394b8a503331524471c1811c12045cbd28122ddfcce14ac3aaca07f43b3cf806721361edd6d244d179a8dd7483a4b08e6343bd2673b409e0116815e143d5bf85af8d243b4303d9fc13794bb6645ac5184ffeaede1741c885f525ab70eac22c404dc64bb5dd1c3a7b4a62822bf44a2d192c62826f44d85bd593e8fdc097ec83f6740543d4c157ccd0d160e1208769deed6c5494ae3fbd067317c5148564164435226538e6c0357277cef3e8883ea8a196c30b1646831df7d787a5eb9c67512e41991acbbe6984a46784f6b6b54b4195b541f430473412345beb46f9dae3c789a42dee904115cff6af229a9e488a973e7d54d210c0297232cb0be9e46cb4afd38009e1a79b513a7b406a97679a5acdd18a18b6e2e2ef55607fdaff55c7c7499fe4a381c7008343e486e4f0cf32573277ac0c40e8a1ffac36c6df073c2380c5b128857edf573842face340ddfbb04e25311f017e4c73aabb5e9c8ba46ed19f6bc763f3a9bb7d65402235161ecada045cb44bee807510838d922c3ad6431f6e13953bb92e7ad4215cb16dfa846ec798989e293f7054cb10c7af77f941b3761e145074e4b088bc674ba6236a3727b2dd7182b8abfa4d6c50a53fb28ac9e27aaf3af103c2fc9b7bbf776748177accbf0e5032f90b5124e8b7fab58fd28c2a9403ca2e19390c85300bdaf46d24921109b6a8421bba3aa77c1ffdb2c491478025c07e70ece75465a70049431928a3418e4f361abb15085b1d4f8d5a5f4cd0684fd1bed7e040035fd81db83e7343af293fd474b8b2e0f5a0a4a5928ac0d5af0207d79844b771e6366e404e6f63dc624afa7ac2d400d5382a63bb12f84d0d7909ea2c059d9c129cc239c70ef28aa9e20085d40835a9de816fa0f28ea7444eaf8a36c1601818c2cce707be211aa4577a1128435d764f55bcec9b74cf15cbb3c59546932ef9b9125b08966d652c996ee2a8f30ff715e9d262936f347d574c979ebcbf61e9e2d201bfa09472ab45cc3d82ccb6e1f8c9b182c3678bb43dacba773c002fb47cc2411a3af2b3bf0e8cb53a25e036ba8c655c9ebebd172499b4a381c0f21815440c3ee25fb4105b3e998cf88857ba682e4e10c97f69d85ca025c264e94c9d8b40e32c8c0bef80b872c26c473a2061ac3bcc3d5c34420b5312a6f6730bf95cfad68f56d3d8f6f251376def2ae14104152d7d5d0b1cc823e29e2135f552b7775bb03a6d79f5d77bf59f51cfd503e1d4303a129eac5b4865d6ce8c05c276612d199a098c29db91eb84db9e03b78252e3973bbb587575dd07904e8834b5b6c34eb6cb2ced8a78e73640d132595e799632c83c77e620add0bbb1f22763f1d31fb9f213b1e1426138ce29acb07a7f64619280bcfcd03559273e1e978ab6a33b75f0ab3e74f735962aed6e81721d8299f5f568b035f41140411fba17be167dc9fd6f41b510fbfe81866e00d094b08caaf74061a9e28095ba7e6a71b6abea43a4f5bac8b5eaeb1cc6e6f3c46f2d935b7692c35abd13d028234a7512a4eefc4df5d5da72f2e68c2747a93ebed2277008ea468966f069bd90ae4f87efdc5a94c6b4a2f44ef52c71b5c8eac348c57bab350a69b96297ec0e1ee8f2a16b2e0278716fae288edb51111a1f7c1c2e54bd62de726b422adda025f251ebc3702b5d6a9cfa6000cd4a82ed0b9ce11b5c775d2b317efd129241edcaad6308ea4a2672d4e4723962afe8c6221ab01afd4bc4625674f1a5a137ca7217dcff5bc90e218ca04d0a58c77819e01c74634151d433d959acf7964cac83481bbc8f96c1c2eaa0bc0f5a98b1d1e5e35a139bae6920f6dc577f3287a9cca7b688818f5ec304543f99331cc876a0cb389072640b8f52809e9245ff4b30cd6750171ed8234cb5989c4e5925755825e02f0153e0e34a9423cd79fdcf339856896cc5319c1da0d9245e317df878959a8375151a019d7d9753b5b83771dade7c7a42e1f6ac1a4eca00dce6e4f73c6fba1e4671591af67b68c454a1741a114e2ee568d5b70b6b3f48acc18f40120c0043f5b00134a8c29019dce6cd614d83d20b7bdb6a46b628ff8bfdb6f93a794404cc21e53df3107e1d131b6e20ae72191f7cf9d22d660c77ed8a386fc2ec4e90e5bf9308e40433e3e8058b14d50d9bba6b9ae796db96180fcd05612583eb34432a50858171e403cad1ee96fc9595c6e27474145102b06cadf1dc09cbf066372e2697bf127b922b8f06d6634dd7cdd5ba31af1c2ec3e2faf8600faec10eedbbd65810e28c1d13774160ef4679a4ecedc346c13d118a45edca5ea0ccb73efd0a6e4443337b95c12988cc1e5a3fd6d3752865105db1ee28f72361d7eacaf9b5ae861a180c741320b2d13d9ad8a86b52e34bc07ff73741cde633b3aea0906ea02473e0f47a06d7d84dd2646cf3f5e376a59b9379de1d4d4e7e1475beed24f2a663414db6148cd468da5a622b0b2f9866b69d9fd868e8940611b4c0a2558a4598250e8a8ad52453df728ffa23cb7bc3a492951fd6f4cf3e1df479b5354a94e44ce12030607b50487289df787ee229a00c222cc00dff3add2405b3de149c313b7101df2db846b48f90a6405fc90fad9220c2ec0411457b83e2d017cbf4f75a14a1fbd3952164d7f100c613a29b6252f4517f18514e1bdc6ac21458e75d49b3aadb924a48c6f1708864d0e308029561f92c04c2a78d4f74c9f3583e727bedb5c9302071e795b9d9d2d9b212e2c3ac9eba1c488428e1a3980fb46cf326cc39f200ca5d84da48503bf438b30159536d34ebf6459c79071de5f9db066b925e42c0b373a1273b6217805907e442898c98630656c35dda2a01fa0088d158caa092a7aa287cf5eb051b8acd7d0ac9e829469221a4b35a0ee7b6c482c9b57005dd54d2b5a5999d94a317189adea37fec8b5bd8a5c9d164d3a8aa22e8adab1a862ea245709c8bcab4ed1c2cf41b61834a288165d7a1cc72661b2d53f09ae0eb2a6dedfdff40632a7bd7d37246457f098023d5c5497616b5bd91fd597047bc3b7bf94ba3cad2ee12b0297a2aa88e6c31e4fc0be89548eb25a12d88bf4d087a7e9f61a57459f1515ee30e621d678b19563e1114e2503e6a707bcb284f2304ef688fdc828f4f2d91ee827701b28454e8afc24197677795f387c8f73c3a56f28e41ea9781ba6f02a332e1a276c33c0b58451412679bffe45a83a76634dfbc5796081985ed9c8eb63514f79b6019954f1e1742ead43b0a790284a8625cb3c6db21a9a348bdcaff61292e22bd6a84ac2f9b0be9eda276fdbda632c7abb489517ca12f31b4261fcf62234493a39807a88eea678f494f98bcba455635eab6ad19c272bc76ee5754701c6107ae2b1279a3cae55d5985e48655f6f43ca1a2b95434932217767024b5099a8abe34bc321056a22171fc79d1bfeebd01931b29490e557ded2c5d361960743b3c8531688468f3a01bbf70382d70b2e693d0ea9ecb62bdde77326351a7273cbb9731699e7e3f4fc3474fe7a6a76fb0ea2eaa914a7dca8e9b8fb7b31d817bfc12dce865e0a416941ee72812f5dd3eb7702d28a5ff40553b604515fd46f84fab546f966abd233b8bf5de9d31cac052ed77b26295757cf63b983a2e02a3369a1bc948e2ed80d7722fc8dd5829e9ce74af6101a3f1feac167e5d37920e02305c1ab435b0322a700784aedc27131a353621392891dc4912e820d1b4eb8ac690dbcd239adeeddc96677ef161892809da479294302aca12256e361ff9eef3f858ab3af147fc7f09a67d0d01815d241b392987563f3a6c2a2d156fb71c59d5e878ef824c2cd47e53369610f4fdb04c1edfe2ccdc0c1f1827ff5793a3f8f679820e569d4f2fa42e87c625b5f4aa6d1a4426ea8115e42036fa121531d2f1c43461ffac93e715d4876592a59ae3ed60571f52af5568f53f2ac4da90f31e42aeaab4839f9a8260597b37ec3c88b915b772419200b786e689f5ae9e9914aa77f226622ae2b289995f3d173a15ddc599ada13b6b32a72fcc416a826e32616c24201e70ee82bb0766382328ebaaed82545d07f7a8771edc9049a082d55024196c65bb8d4e6e5c6811bee260cbe931d95c5682203f20ecdb5b9223b86c6aa28bcaf06551475ea685967ff508c46997b885a0cf70361c486e92bc786e591476d1969b37966f03e53127c16fce13749e224ba8dc4dca90f16d0143efd4a6077d1cec8737abcc9cf3cca6bea45c9f52ea65164198cf77bc872763b58a646a09e8989a672db90e5c168f8c6cd204d999b36208b84ea4d695655190c0a3e295e33a805e774012e512dffcce3838d1f5471c24f0ce92571c8cc6e57f02d628466aec0ee3a31b74a7026153b7d95cd23f00433a0f178e214af978b80eea06da5a6a47449a32e2e126be2bc51deb406756cae9dd9becf078a0e9118ef611d0efed777fed694f6b74656fb169e76915ee032263363784b0692266c8be4d6b486dd95d6d2040ef8050d98626624d4be797aff0804eee9a67ffc22794f4de542d8d6616a06e6a2f1d6599876a6d951c8c574527d4ddcfe30af32edaa16816c1ff1942166729da2c02e358b8bde5cf0739332c89a12b9f8a455b34866ff5ad2d0674b43903a342ba3967362e2a18134d348b2618d8e9778fb04e39b1d214a6a2a0070855439f14330410c88880b501a9db7b995ca4606528b99b63c5f174e5da3ca28663361cee38d19df0b0e128981abd21f59e138c2c8bf922abd9de58f2f11630ddc819e81561eab4389e88480adf36259f3f812d3fae7a2934f25f9a933fdea5d96a9238aae2b0f8fd4c39e5ae6ca32d97f199a0b32eac2d038aae54cde3f14dc8ea8f8ab24ad65fe4bdb8b50ee928a04146b7c3531883468836a3360ed2bdd4f0ccfe46f9747b511a4093c770d0f83afcf42b2e0b7d67c01394358b9730602c152417b382633c5695e7e5708ee223f678f444625b53fbcc52271863d4461e4324bf5bff6f23c407a1cacd5d162e729c314b53a1f7f3e4040a6c5d87ccd479440983b089f2b9c87c3f1a62764f8800b4038bfb774183019ffb11fed17881a2988b117efc074c134f850f634450cc6b757d592c5dbb0d6631273e842ab8c40641589d418399cad9918eba94e12db13a1d140830186ac298b02e82d9ed76222b4a3c2c5f460b1cde70049d53df015eb6173cf6e2c8f370916fe7ed9be1ae5c9b236cefa3fd0a54e8419b83081508de00de0591bd5b1f5af4d9b156cb53d40ad7e6da22d939e9e7521e552b04b1b4d53bc158d49ea1725e70a08d5686ab41485efbc3a11bb953499dec42c27106fede58dfab855ab950a6d1b036459b85768d2cf8522d19e37d14581e7eae212b6b7bdb234cb81ead1e517410094f5cba5bc1749ed10e1e69c6bcc79b8f3c68c64765e3b024a39debd4b7af003a92598103b8448d39367699b3f1df6ecdcd0c32966622beb8ba60b92d3212967736a255e50d0eede9fdd9425d9986a36f830be9f9393678882b7f93fd871e546b2a2f509e7bf856781baf0b8346bd9a8cb7d5791b3fdd1d394e48a1312b00d783498cd6f15b4ab5181479102aa9ec3262198603356d0162afba85817186d66b9fa4783d2e726df5213c2aa8f20884dd5a8cf17086c99f9a0f04c87eeafa7c53cf33606d5e45ede3a549f3a454d75799e3fff071fda76c09c4b7662e1a6433a533c1ca800122f6fd1bc494721cd1adc042dbfb9c43f17e3b69fee1da17cb22d684463bb8971db144c37560a1bc8cf6f8de35122bac384d08c21b343f806fd9c0cdb32936f491cbc17ea1bbfa489430f1798c5c521aa76b2002af136e2428206ed8a34539cc916f537c57760de15580d1d985c730a78968200559612bf00a3b42acfce3749196aaf7d1da48fd506eb3ba7d15bb442ce45738ee0aecc61ca5b0e52dfb684df95f20d0c3c1440a81df393c5c9a87b03a4bb99194ff8d060b30b1cf82aa5bf793ac2a1f0c5cd81463e64d2983e45560fa4b448fc25a9a3420aca48545e71b493ec0711bafca2faaf23546ed148c25468e928cc9d372798e97a2989545f3b6fcecbd58f7f9196d23c8de420ef715f0fa65075bd7c2f2a65d3911331d55918da2bc68d308e456952248d0d43f2f97a3ef716f3c5b9ab0e3ee463b0cff157a3a1bb3967ac887fa5a94723be3570c3e63f675966c0282d5185a3e6376c2e80c07ffe017823f47a347420112c07da3fc0983aa4b5bf46b324399959f00cda400433de55265c7d08b2728f2e8e5ce5030f35dc18f8bf596b260e05f1292805e9429495feae50cc30d43f08251191b8aa0adb0cb04b516b52451aab02889260a42479af1e582bd105e833867490740e3f3ff814a1176837da9fff19f80dea8f48624b119559086b8ff1251b110de3c05c5bf2658dcc857997a6fa7512893ca9f9e38e765ab1139ad22410fa90ec82d178d6da5af32a744c93998c9ba132d6e2c3b5c45e33513e9ad9f9f1c173893a1a7f50b3e654b7c39092078e78f869ef7bfaf3941f683da74ce97a83af5ea20704a9cad0f786b35cc109239727372ddcd19ce87b1fe8b83352ae066bbe99b6d708cdd43ca8f8884bd97b10391e3dc66a07dffbd5a0e4c9c5570a78af7a0b85c91cebe4c880e9f735c5e140242cafd7176ebf69fc5ea10b8abf60ca6a317dc82374c9105ba69227fea497739572f6649deb7bc5b5a1c57d8dec4d360cba77cec528c1033030eb351c4a29b69e5e73045af06ecd8cef80669d405e524d4065cd35f59b143773fcaa23a4af2f8f92b1e5fa299781376121d2e9433225fe3379659577d707b246b5c1be4a055cf39a6a8131539368390f0613ba167c5fef1186005c133d14dcaa074cdd472008e1c6116aa8b3f35c16e2da19ed17ea71ec5a290ccbfdbc864bf3cc8a86d6cb733b707c27f16574c5a1750f6a0872dc7192199b49f60ab030feef6c8bf00302bb32d773d7fd09a9d27647ebb77e17e23b41fc427726ca0bcb3b4ee7600582b9faf65d649e9e64e1e8d52e95230b9e8bcd269ab321e9bcabf26f297d1856abb5ba90637d64fe6bed32a0bf32c43d091e8868134af56ca64e4573923ab321361ee11ebd3687206a85e2a93585744b1634ae7aefaab55ca37a1f3f866ae03136aa8bf39eb4c1b27f9f0d68149468a5b6d6145eece24bdcf5861f0b73b739447c1ea4148179a4158f70ed837682e660f49697c657d527d59c1a52a5c364226a283f86d118a6923b002b9f4db9ec9f7ea817044478a1bae33873c5da93e8eeb85a0c86bcbfce11026772788cac7077502836bbc2a77a3d3517334436de0ece702f382650ee228bb68ae8c50fcf385b3b968eccfd447dd16aa98161716b2db7a099d8c9ce37a9b7b22e78c80d6d773b734a81915a7e286a8f9a31b3882381756a630c0c72c3b09caa7c8f9d1bc020192b09527560318de4a059c2d9dda9e9e51ec1eec1320eab1c1c95f738f3dd2f03d50f74807bda0e88256d44084e9bc7d7561d4759729467fc95739c4688b098fe1fc42158cc6df2e2a3c23cbe2ae8dcf10aedb6aa131d4f8fe495eaa4a1e40ffe03fec6da27b347a464bdf42ff30dce7ea15004a8dffa5b636d0d21f4e34802a9bb435df3080096bf0d55b8a39e97699f16257d2a6a77496fab24c891c61d2de8be773b7551c0a1e8964b3a012d2bb30ae4e38ed9406248c9d19e521813fc91753d94b2b511ddd44b841b204496c4fe0002eb06895cadffffedaaa9ccb02e92b834c4be4b2b97f37548bcfe99b46269fb913bbf33630c57a35daeaa6a785b92b93740731d3cdbd7c33e8fe8b68c39ef5deb3bb1789a2f1bd2fc0be4595e19f5b9e203a98b3a676e99847325d861d1608538c201a621a6c03b54889da9111e0d41280281f90b76460b9d67b328a3421199ddea7f92b2a3722e82d66810c45449f6c9257e4b98e6a4a12521e011b3282298110dc5b82d2cd65db6219e24ea3f78d5f57b5a41b8e17680e43f703dc441a0d8765fb0fcd8623e745d03ffd495f724fb6b356b8b6e05060446fc80eaf810c0ee2e0657c18886dbd9f43a62fc35a9f212ac33983be187dddb34fd3464b4163e7be5ee277fc63914956767c249ec6fa3ae0100853937c34af14a39531de329302a9de6eb3ae2860ddc237586c6d8c9cc129de98b1c3bc9c1edd5b4429600319e0c1c7e5604f6c847cdc3d9f939e63b33165d5241813f10493850c644e976125fa81d5fa7524039e8d64e6c8be392957b8da8b8b4410013653fb287a96c1d59b42a0a4e55eef14a8fe808c6fe9e10337f013b35df41a46afc76cd5bf4fca7ba91ec643e1cffeea4bb23e1347d55d30e5e78eb959cf6c639a789ca8769a9aa905ecad6e9e2f204b1dc002b9ff5882ac3e01838640b9baafa140025b9e44ecda825bbf65136769e191477d15a163288bf49f1146e613bf36036b716ff49bffcd13d53b84ea1032c8009918193ef17707668e4fd62d660cb71336ffbe195f61ebae640345ff2771117b44dd0b93d733a14de613426781db2bc42c17ccc4f169cd72d9f4ae2e59a64020c1630c780186518a2fff721d1f4370bf1ba459c307ddc31eb34415fe88c431b1360c3221f4f729680ff7de6d393ec53bfe77290f0f0215e2a5e8eb9f7d5a1ca85e2bffdded0e87670e7d5131874488351f1858589bd8ff8b877815d396095e28f2ec5b6b93ad3e6f916f0d3c3946f9496d9290ef300038522cf5bccdbfab03a49d68053a75a0b5be70fbfc8e36c1f06c7786765abc0a341385eb3e35b1404170d36b6791cd73d2cda9f7b229a34c6ca092bf95faf2574a0044820d75ba0a65f21580e1bc803ceecddf99d013c85791f1e3c34fe0bd65a2b3210c9456385543f61635f7a9b22a90bda4d91720eec302ba738051e252dafe21569fe296880ac36730f728345ded9c44ab39b5eacdddc5a7f19d123055c4ad8351bfb54bafb34b56cf85128cfa2b1872a06bdb4e911fbb5fbaa7f6feb4a4570cdcb748187dd28d8dc579a38ac2af4d2678cbfcc9140a9c2a20f5b8cc95a1ee7017c5999a0b7ef9a4bde833f57134750eb7b160de70a11121a91bc2ec4beaf78312763a39edabe01685f6144f02b30f2ef4d5a8be67e4a2bb024e9910db4173875912af09569dbb563a79644831fb20b8a72f1afd57cabe1df49825f7aa730abf157e2e7fc8bcaefdd6e04800a22d0d776e4c89237605edee335233e9c51cdb42182551f9e8a81d5312d84710d031c77d61780e76429509cf1a55eaff100c47b9a4805c7faf48b7cc938f94600aa874d89f2c0ed0c98a6f69cada3f2629604459a6d32e5bc121522dbefdafedc36a3e155e01eb1890bbd19a9896af8475a97cb0a2f3482619d74c983f8c42500eac8c2ca43f9bec860cb7c11db41cb8b2f133c55b76ac54cbaaf07905ab94d61a417f6d1d9377fe2528068a3cdce41925fda5962c719a3f010f65b2171ecc925924e94c07cb0e28e0a557085155612ab12f2e5c530d8eba0a8442e40f2cc316428be4b3cf6496ca649436daf38d51438a2d7bf53b0dd87b2e57e3e4e994dcde854576ddf86da31e15ce71c35813ef16781fd9b3c2b1c4a72a043aa359fb565fd0b874d2cc61e3a892a29b3f636d0e981f54c3ca736650d42782e1a53c533ac0b9d3f11d3a8b0de30156e9dc8b25c44e4fa0cf67b042f364ab09579325a67fda7b6c88a54264b00ea7b97237ad2476a066e55212686ca3d4491cc4d991bbb6ca4df1b176ce0bc59cc2922d27d6372414db9ce8e1b1bf6360d1da8223a1b07c0d0e95895fb39d61c340d6f247f3b62c9169ce4c09c40df642c94258b8cc55ba144328887e233614ffffd5345ff249d0378ffcdac85801a2e84ff089c42d8ec540f5f0be7d5fdc6afc7b1085321f288e390cfc644347188702b05de34f54f5a5668f607951c05b599b53393fee986184da900f950ae8c7b3101d825c0a28cc667dafca45b7c68aca1a9094b30d54831ee043d879faa77b43dff664b0d7b390faa1f6dff028e9e490b5eb61a84f38c3d3f7d3ad6158e5d5ff5a0c7236296a6c38d80a33601e35338fc6ed5e62ab13d31246b54db228735e945ace98529e1942e240e827baea9603b2e61ec7e3ee9a87d3e2069cc6ceb8004d1906d7a96e6fecb60b0143a2637c4387babceb1f82aa0ae86cedb60f8a5aa009fde67e1c63c7d1829e9f9cfe6d2c03d4a2d5f064b0baf66d32b2461d9fece934ac737dd5e657e3b0da5bff699889ac44dcd87264154cb019ca94bc45eb8cf7ef419cc23c64702ece11205f236f7b64848814a23b2b2c599b8f0c1f35bf97d34fd10e49540a110828d682327c4e7dcff05048368b9ea798d091da14f364074a3e1a7d0b21e09ecab66eca2dcbf95fcc66438557925904980b257287123669bdeab3a2871d1c928300aeac5a3fe86809bfca082942e65748c285b30ba7cc7911f82a2c54e2602398ef9b9e61a31728fe6b2a06c056b72294001f620dbf7ecdd6a8e0a59640a173c8ad0b0dadd77f75fdb055605198acae855f96dfefbcc0c790e46f70ea52de05e4298224a0403cd7ac6f48cba0ecfbe4da2ef75b81d1302c22a0b7b93c90bfc0205b385551c09f197a7c1d3cf742e4230ec9c12f4e7b94c152ac0c0b1b5a2eb67a0a35c458fcd55840fb4efdd47b973c6d2ec254ef4576704ed9ba2841c6c56caf3908ae9051184ef35c28ee756da06b2b1c129d5d832ea4b1012ebd9aed83ec344d24ea8bb93001c457c9ca21b352e92470eda963135349434bc7cf509bf037ac28fb337de3688de8be84b3189fb27b61ff6c62d921e751d539335688a5e93882a8908abc3668724b06fbf8be8dbfb71fa2419010d47bda395a263d68eb75392a63e88d8c807c4aa094faf3c3ade347c10d7ff0cec4ddfb7069c6f107c04f3011e94558eddfc11167e9027b1bd38cbcdadc14db6830ad1d5fd986468949cfcfcd95cf9a896141234b2740d809a207746a95eac13598c2093bd8b7ac3a61ab7915d2851cd5203d3da924f676bac75576622dd73826645ee81a9ad25170c06f1bf5370f8b29b3575bcdb2b9369e906df4df57168f3f3c26f4a9870b7cf9fc762b66f9042e18f57e6f27217ad81c97a7dbb67517b8a32ddc59ebaece2deb97c3fb9bfcb40961ef4371336cd7ae804ba1a789137dabff42bf346363aff9f3653d3d67d3a3e76911811d26a0122c388825fd557710bca64681b82e35d65bbe20634d72f6e27d7291b289355e95806f4a2c2b10c105ad7fbf1001fc480fdc98aa9597f56eb4eaaaf964c7d3054b54dc47aeb04e1562e3b5a9ab8dfa666a2d09214ac5de56317f958eeb8737e1f2881baf478d456593f454f5b06d61bcf16a27d1eeeacba9d9d25714dc1db55febc1111bfe69a9a9b8c40c62ed533f37964ed041412af810a03113be8e56d269527832be87a0c2cd1c4d4d8d336b82317cf39821d5831f86a9dd13f70b261fb55574d3b391fd2078993a0c82eb872284ed243486b04284e324fb6ff1aa0a0cd4c0017e6ab08b3b6701b462582c30c01d73c406c2b2817bdf9c1e658026f4557dd175f1bb84dda06258ff75bb86e3bb6a4a74c7e03e201de1cc15312155273885589925a3de8c1304a03294daa6d74656695db74ea3217d15dee8447aee6fcc3ab58779788ae75ddda28a44f5b7b235cf955be69ad53d86a6f5c46d259de38ecb6f4b5a840c5d0760114bc2701d0d50fc7d3bc532c58480adb92889be1b841d51e84533b499d4314a2265566e4e21ab3afaa447c1422ad73ce3c6524acb9bc510c5446431aa14c90a6538698994c2b8611ffa79f5f1826e18fbbb7cd95c249bf614e448993d9dc090e0a54ff27cb0b3b015a1033f72794d0ca48b997df4fd820ced9ab40b0589b982a39665352a7434d85f7906b134cb7bcf950c651197c7b23cb86de5cfa043428fbe79ea943385a69726f0b8a05928c0573fc7837106d5e6ae4fe377848e999594996d6e180d75d07934dd1c1d54de185cd14e3f6a29d25f599e91ca1c99d8830510c63200f7dc544f74e127ab998c4a911a23a7f8e56bbe6bf3b1edc5f76da256d9934f04687613ded20d13d9d89f1d81309509f0faa4498c3220b03e610bac639fe89869101c44fbb9249263beee46c11c3072d29406c4cee85e7d37b3dde1e507898cbb8e7f02653b2c450b79c8569d59bcd08ec00e87eac97b19f588c7f22ab04afe199e5f98f78b91652f451391015c684aab76eac641b11dd43ac44b179643901f04e9ec0d00e92e2993dcecf3926e9e5939a44aa8ef65c2a05601ef319e2f24820340469783f37d6be5ccfbdf7857b90673e71ade173287eb06048e2634c4928ae44c0865198011c1bd4e34dccb06817fc9c8d129c6079465870f96d08759bdf19842a8db6df4cff03f7e60adae5f9a58b6a0735c3e8d5b498cffe0538f0ac0cdef52ba90152012b096611c1003c2281bbd1c7c4656a042601f30ca4d2998607148b419754a1d3ed87f32dfa93c9c77b4e81a02e6f75579bf12ef608e7a2a38e97013aa14b5778e2cdb31af0ed00fd627e94560ec96f31bcc1832d9428fd4aca0e8fd7b796707bf543a2360532a27d0cc9e5b74b49d14bd8922ddc26f13f217e7e30b907c8352c856cdde59d8ba89fc3ce080698d1f487ac8dbc6356f8ede8a9b4dcd4bd8c49299444442cd840110aa080328693d3eacb42d9c159556759d26e63251287bfe4425285859ed629cfe6100731eba757a4404a1c0b1f3b66bc7460e094aab19c7f212a1d95e65940323a36e2d259507e0bce9e65fca8888131cc60ae8420f0e5ada4fcfaf713f22c2237b1678abda70690ed229cffab97244b0b153b39932fc24c32227d2acbec2226f0d4d681c89386cb0c63a4a6f49cfbc68923faa36accf67026e6f29bb052ab9387522e1792b8d0ac0d0e86a95c74a800316606179354b2794fb0d5998a8269097775e42071a82268285c2792642c9f57f91609d0eed3b6e5015d1f47c72f24ff83d1c37785f9253d00763e58ec0bab029c75e0da54b03cbfca1cb073b48de788391e5c5988adb22d7244d5d8f11f988be3ab26d8ee25524d5aa854478367d62a62314300a518f51e2cea30a5c3a1c483cb203b6dd62ad0fd5a166469ce680cc2494086c9c95eb1f95a1edd4be2add42b0b0a18e0d520afbbc7a046b45811a4d94f02b1eef095788e33d7f071062160c894cbbe93f386a2507964abe5f51cdd1990a529c8b83a1a6d0e203d34e6aa8822abae4de4c7afaa0f01bec97ad046e3bc97c5da2c717831cd04e551f61dd9955dc124cff00a4808fff00366ce92aeb65849c37b1ca368c5126934a31c647244f7e060314c52b7090e1cb5b01772ccf43c37ab13c167f52a0d1da700a55be453d189fb3e83ad405c81641a0263ec6bf5d54c9535c60b2b15513d9af90fa031602e623c26b32db6384a5c1078a00b3cf011389a361da7f54b6d13234dd3b7ac28a7d381cb125d22c7d8ea60a235c75f18f05211897e71f8ff328fb0d69b601e56dd5b8c8280189f541f771e0707e796327aa07bfc9a5a0f5a965df21f1a9413ca1f199b7db3194ca7f7b59e61c1d369c7e984da0010920ac521b6b10fda717b4942350119561c4219052607837fc22ad95a2d96c1ff369aa2b84e9900995a17ba829b4d3ba670a50944abe163e6ddbc809869dd3b9018373e8ddd53145c49184a38924d969560ffb30c431eb40a842e1c5b82e938f257aa7af5d601da02ed7d5e97dc13426c79c0a683a47f34258e0c61094d1a7078bde53c72c61c3acdd244a2873a726edb1cfbac1537a1401b1358ea10d6eff36cf929c40ec645e2eabb224826ea2f840b40e1393787fa5f8c39c80130377ac13bc71012e59eea884172082cfc9011859fbfe7794f8262ca9764f11e13910944b78c15cc490bac568c92ba1afa15d27a051e8910b0809850df23522e829099e84d6b4520486d09a615f0525b57a5d027fae4e5fd331b839457cef61cb6c7fd278775e5b88478b346c6a338ae604f2feb39997a882878453dd24caf4ebb512063f1a98e1bb9d1135d1997c5b736bb8c45285af52eaeb84724160304d02e9c4b02ec48f20db866afad4b144e855847f90fb5190ae54056156aae76dd773167646d0e39a225b88d66819528dc44f042c0dfba6b61d891055f0002b4a7d077500a96de93bf726a8294ea0a4b8de8602148ae9152ed6f8783e3397972e67bab869ac6fa9a841b9b226f6be8f9f445fa94f0650100986c9bac59209303430c999971c068433facc8a1bf68c0a4904719dd2fdfc4bcb71b1b8388ca4897bb60cb064d7572c415684282bad3d601b4f45a32847a2282ff4af2e5fc4f11fff58c880ff976d5f7d7a3375f81c9af8494a7be5b6cd830b2383e6a4415a6883d77821a816f52fdf41f7a1bc3e909dfeb7aa15c048208661dd0c927523d1141e9eabab73cedf1d0ded359d1953b6c2fd69cf565549b51ef040d48687194431321abfad3f702fc7b10b074044d22f3a0002e3bca7a63623869680b0ced9eaee392f2281644d82f29b36f3aa88f5da09886e9006e2466b74c0c7e638bb016fee1298f8193096cec2d7cf4e24bfad15a91146bb4aa8266f6181f543a48f2e8a62d1d7794f2bda23fafa87cfadf18ba48c002a876997068f40686fef806b6c59220abdf315c4ab2264c0c13f824d4874006e5d82da59780c338b6b18392ef7fa1a8119073e5f7be5f09ec10153ca827642c441ddf0dcdcda50443bb1380a0a6532c71406e07fb82bb1f8a8e247e428fad8e46f2d1b404847f6b07820e820fec74e83c89fa3b068c5884ce859da3ac63922ea15d68a2c3ff9c239ab446e520f35fb102c6c09ea3857aaabf02dc5714d984e8768e22f9d2644b07fc5a78f68db27fa492fe57f572c43a38320c6ebfffe3576ff3a263d3c2b7cc6ba29929060ec9a21d9b3730c5cb34798380cfb639c96786e0c5597e008ed9ac973903e1956d8f3088713e0170e6da4afb4b8a27ce62d5e74d140263c817204dbe0c0f1259aeead629a679d43bdaddd45363aa91508584f8ae93a4339e84620eb71b1b3d65dc5637e0dc84590c6d8e51e18d6c4ccf86926cd6a8f780092d53fe130767174a82e369cc2b4ed60998d8fb637fb0187e38303df88fe046ff60fc2abdf5230aa1aadc02f2872b9cf546ff64f5c4b20ea275d867bfa0cc80077d2c896b0f460345ae82d3a34fbddeff422c8faf31285663f3e1d75861ce7d7dd1463aa490a776727086872694bb469b90395694a291a459efedeeef9d188e100ebc669319f0a9b944c425bcde767ea7d0a9688e348bdf63530fbf1df3ce810cdb3f2f90348f0b4e0018c1e6edd1a10e1c69b957223d732c8dece0a05349802484be2f3c59b9602a4bf84581e4cfc18069422cf67838940a11fc6983b778c4b4ba4f1cdd9b5eaf7ae11913c922293c19265ff3198c07d022b8c6f3f34a294a1bbec7dce08d260e8be47b5cbad7b0fb047374cd4a45a6fd4ec3bd093fb1b57fbe5cc78ba3fecf38b17820046788298dc76eedca49365cb01ecd13601236660b7c70d2b703095ad0eb5c5715755e88b1f48ec03bf85379ac20efb1d5f9301288b8f927e670a3ab13451d9349e68300c22077f3d9fe196a16c040bbe0821e1b500ef3b674f929ef9175b263219519e91a7238d4e56fd46704f004b1ff75b9b23d90f8cfc85e415cd3a589fa1349cb76de92b733d020bbed4881de7323a2737270b5450cb19d1b32b8680c6d1129cd00077c0e4ad83dcf0d72d27386ec85e8a2e72bda4e199610fc1fd8d5cb744cf279d4823cb8d3c836dc460c441a0004b1e5bfa629ad7a4b86e39891b019587fedb932590f4cea45221cdd7a5ba49ca12151aec22625567a2be43e5345b0ce2b46ae81431bbd165295cccc0d6ca26400e8f660a3ef24559a43b1dd497cae0558bb1d4293a1dcd4e9b0a41238999c5d2fc7a1c3bb641b5fc72f726dae53cc423c70a0dc8e663f40c347259d09fd0a513ecc56d24e29ad275d56354ce306194b33a775ac19d11eed8e9531cc1f0f598e30cec9cb5c6a145e44d7585a6bc509d71a5d5a0a40bad937a4f513f1b9012bf6993354d76cc93b5fcd4c16a1b1fd25f7cc96b763358cf7ed09c55885b101232b0fc0ec13fa4eabc2deac08a05d8d0cadd0dd255125d1323d30bb96b9d0c086ad2ec7df5e7e699f13e7b46e391e9353b1056239a4acc180a0b88c7317f53951992815da416601d115d56bb2a7c884b27059333708599d528f3214281a570c46a7c3980786f556c486f344ae292b6dedb06047c29f4b8e785263eef636122aa0f8ad39f8ed637f5fa036afb8058990ebc9172a66a5f1d02fe8674033b50b6ea567cd18e2b36f9cce5cb2e80b0c60365fc00ef539e9247f96549e3f6672098a2d5698c1f5627244c81b3ead39243085c97237c182b2c35e07cc47294b5a91286cdd499ee2d66c11d2bc65ce1c7fd3ff4e6d0e925e1f85f68d80cb45767c10da812f230a1acc2edfe5805b86d9ef9d6ad09e73355009a021f13ae0e58a1a36e710f7703caf8ce08ca6ab60cf553bc0af96e880ec41b27bc59a09c4ec5ac453606d9cb9b343132138526b6b9a2dbdec9f45640ff313b2f1e08e9159970f3e27efff38b1729e6bb12a4138fdbac4c1e773b6602f9447cf7f9eb45835ff501b3d252aea4b4573eedf78d5f62d1339be22b4133b18cdb62164422a946fa97003f1b725521eee5b6c60f1edea33da4e4f2cf4bfce4b83511457e5ec81412bcb8802f1bc2fe35f82750c4e4736f5911d4c574440c73fd2fc00bdf353798c98002af52de6f620c259e5a116e79cfffa00541771583056aa3c976eaa5a4d7545614505d7bcc35cda8250b2a165c30fdd2ef08faa7f381ce807db095ede804e0f0ed94ab1ad39bd5003f6de11d26f5d7e4bae01e6bab8b1d58ed420325c2414beb5d63ff64f2a594cb19d56b9ed9f664208885442c6eb5e7ef5874e3b9d0deb1e7ac110392204f9b1dc22d6b8ae83992893ab7dbe6906d7977f1906b1aad3f3d606db70e344b69bf241f9d3858d7423cb9bf3e2fda2d8d5e4ef70c8b6260dc3ac6ecebbe19cb4f2120983cfff56cbf1ec21dd1e1a7a0b7a9dc47e24e33e1c994fa0bc947689baeaaa0afd7337e12fd5cb703f1efeb0293a826ad2b3db157c6841535695b95f00293bad7f81de10eb0e6ebdbb33062fa8c3132adfab40601859131a7ca1de54f905d6b45e395fafa1ed2c4d3bea6b88fb3f506397389792d898c1bb47dc97c4036339608e1ebbfd76b745d989d2acd10244bd7d52fe0169a70b332f4c9131a34bb54210de226891224f01ffc77843ca6cd571f1ae73b8dc6c137ae7ef058164a00fd22e035e3dab27a711a094809cea435847601af055e3e4bdf2a3b14784f8137464e634802a890042cfa904222d937130f07f12695cf0d991aaec7e5b30704e2464f07defdceb36338e0b113351400f8b3b487cb7ef337d3d3de87dcf7bcd6bd952987ba22c373f400da3adf1b59b39c376a3b0f50b66e8f742aaf7d323d7d8464a439b94bfb724908289fc473bfe297784d4a043f23768d159e1ca72c31fe106f145966ce07c7c82be46ea55a83463c010db70a3397d238ceb2ccedef9b1810a0404441d7725002f0a2807a7521d7e7642f49faaede38b7d53ad27930d858196c25dec0112d999fbf799a4b8241d0fc049cf4a6fd2a1af826fb81c30fd6666500a28e442dcb93e6e765440f29c05fa7121eb635c8115d41b5e41f3f4a71fbc24b9f10c83f5391653067b20f58fae793e554851698d45ef3eb0a7fc45a7e03b660fe5beb355570df45060cae1665635d74d9bdb0b43fcc9b6ca0d933c27bc30add670f01c5086946bb5d7db1001d6605a22a0583fe99fe4939c3013bf2e76f0cc5d424fb63ce16b9db783f7a5e1625a6048275a77266be7a1ec2dc6eb41f4114255d77e2e0747cdfbda28942a2ec9e4cc2ba426c4ab60dd56793be5ce434b1937a37faca5ece715ae3fab7f78853b2b37519672ea825be4eec02553dda6bddcb23814ef91bd1e35b694588b310a70a32ccc896b0f875a4655aa8c17b667314fa1bdeeb3a984554151a0f990394eca6d03c444d4aaceff7f59b9552c3c28fc5bce83e25f9fd18a0557decc98ae4c1658d8f996e57391850eb21559053175753f71e8278068cab0873cd958d257dba2d4ef04620f050c258344529adba879a96bd5e09300737f5f104b3123c091c4242ebcfb5b463b4852e98aab1e6e717f02424043b13600c1b48816f7e33387e5de0aae4cdb99b9c136d45166d9500782fb35dc58efd5528be31489ae920af72bdf715848714a72acbaee2348d69621ae121deea958b9522e4f8f62f5c053af38819b718eb5461dc9811dba1333eaacc5469864db7eb8f12aba04fe52f96b71681be6ccb775e846b7d056fc47b90f21f809d8da9a3ea251bb56e511e8a31659c57b04c4fd3d6acd1cf4c382185a5c87a528393c1906001ca8e4dfa791a330bcbb62556412bf6188088d5bad3d62475605fc1cc99742b050522ce3603920a9609a537d750d4068071efa29aac42f55e1d526593f28cd09c48468428d02a6175a372cffbdff7ef4b63578c173d8d72bc44592e6739931c04c32089ae16bbacc0f5a7f7ee5ca45845a95cc848acff2314bf2ba3198b2c5b0e89fa8a87514c33e88d2c9705b2795e61fb7c31b949bc04f71a8a47cb95ddf98ca503be706dbe5c0f794692370edad0dd7c71dbc2a3872429ad0cff7f26a671e6e38910dc341c0f93cbfe05b6181a4469616737474b5946d90f673ad0d00ba0c820d554879ca55089477b54826dea5ceb0a932153eda384b5104b9f9af2ab1b3e7ea2ae8106d24f1e5a96720ddc47928aed969537985c21427d074a430fb403b16243d56511f3fd2fbfc1c522f8076de72d02e892b9f615e4864e5f421fec63fc70b2ac8a9d8600e4bf05405626d97b812fedbab0dd2fa955384d24656662541bd005805f78c2a4290cafa73efd2e062f1ebc9dd1cf4e737fc829901b20212221447cb2530125c979c64af15107b9a8813b89c4bff5b560a97817055899003337952f03d7cf6387f03cf34b065339938c5f29dc45d2456d5aae464f5d8db9a2204d1803ec5929f73659842b8476ab9df8226f9eba7635f9ba5f61a3ad391456434f179d6195567adbfe5de49f8df3c041c745b10025491f4ffee7b92841b491679018a04474aa0511c375e03760d1790b7ce0e8a80c5bf1b5394ff928f0d5d41d27dc8974690bab435860b6936d8d0d336eb5dd47510218c9bdc0a78ed5cd02b65a258741d5b57c7118366db4feb34294768dec493c54b0553d52632ad247f78fd521a04689360a86fbfbe53211be6830a4b6bca248301e9cb2d4ef0e0007857668dcfc2473f6adadf16ac0a1754b332f2ce66d35227ea3b5a1d0a312da7299dc3f4e23c452965d3af390c7bca517c0c3c64c9cb6cbd7f220f8cfe3d350563112f01b5ab0e0512ead5052e04dfd8d05c954bc03e972723b3af31bcd096dcf372612b7c53f7c9cc60055a0b4b96788a5471ec6ba6799efec167476cfe5f77efe09b74b1e8035a5c5109762b26fc400cf088683e8709c3e640c4a89557d181eeabf095d73c8663cf63ee855cb017f26c57d22f29ad30504a15b544549636c69b397d2efca6d2d224a273c06a543860e6a3bd3262a93f7a05fe6108bf844964b156a8af04939344c31a9eec40b2903358eb443ad9871565b253c7f463336cbb63986e743514a93e52344da2bbac2131a6ca0de3e04ca5c2b7c3457c0fe7e619d82942f8d6997b33287a51af251b52d5a7675679961bb5bd83fd97d6bccfd1fc74064a8fe28ca68562819aad17c3ca9b621d3cc1743b017ac8bae3e2793b0a7b8f1cfabfe32267c2a1bd7f3d330923e2ee67a09aa3087803bca29f285bf724970d0828705823e1ed96ae165462de5d387606e34dc79c5da04be66083c82378d2bd620e3a0214b335ef7215ddcaa690d0bedc35848a6d68953d8481cf919f4feee1916d2c074c6a153d848660639207973a1018560630e2a4fc38c1b63b9b043c86c1a20c13273fb450a061c3d33cba4b8109a929a394f9346b6faf25738fc384684d9e8519115f0f6b223e24164244841b894faad611c674b446b1aba283265f01fa0056158bb7fe6495ad671a780df9f0676c3a06f029adffeb8a86fe81169e623966fb88095803c97e1528d18b89819c7716499d051b8d89d9757e47b2e161b7071b9247ce39139382be39afaceddad118721677d83055ca55a6a8721d79490930b6ff2724f5533e5ede331417097f109537666e4ad0bd3a5c9ef6b49b48a4f34fdfe87d4f0a10214ce2d07702879dfc9ba6a4b622831978e7cf164a0a44a4b39a6b61ada882656268e6229844b22d6f88e7e0bc3c7b8e250c657a3d5eb2286cdfa4c95299c590e07d6f5564e5cf24df3be56c44bce82ae26e759f84b54f5ca7348cb97ac68d366d9f860161eb1baa15008002e3301422f947f09c1c4e4a6dfb7693586651a66172469103e4031936d6572725eb481c205122125ff110887feb0f9e005b956a122442d93bea341cd3dc8c080602e1b615dc8045e1294c06765fb1d3ab67cb2e3ee5f2e65bf40853432a4d64a41ad810a880caff40b5d45813f45deb8b03932ecdc09ea8286db4ee88c4dba89c70feac485ec6b0a16f8d538dff9bb32cb1c194f0c3a3be6862f2d5f6ba4943f9048675710a88d8d188f270e80dd68a2f8f8056ee0d82a3aeef6aa57725c0168face139a13e02ac3d6275c3a8949edd52e80d93b10927872461fbb7b1717484635030148ba80b419985a80ddf36bff2a2780ab6821a6dd83a2c5253f772f21418fa67e222971443f04c2b22cbe43aa82efe34f5a14a0d8772493542a913d9cc0693a0c30d8029b71a0ed287205251238d4ab3e9807f1f92f300ab110fd7abd72ba03da690ff2e0eec5fcaf8257ea77de842352894a7c7c4340d1414a26fd706f64c0111e2fc3a7ada6d2d5d6a9f3ce455839d09b292069fa0b7c73c37ac3f1e65a8986c38642e0f00da783ed0df59eb7fee2dfb011767f92683007edf33347c1837af7e94bbeefa3cf81df015b982b21265becf7046ef637c1128209685346d11470a3ea2e3268479cdba49b552d9e3a5978fc369b814f74ff697506c1f9f3cfd92e450ea9e129bae94789607e4c642bc4846aebea64a0198a2f252b00dea9c5382f0827fbe8e9c82024c883ff8a9306cba01f671288369241f3cc3b7b73dd267300863e779230d85d7e4ea613edaf424a0d580c9db58f4a7ace4ba0d82e02ece6dd1915bfe9e8ba39cc1400ce65620f336b40f3280c13b395492cd91096098706145d8b06b7cf5836eaff09234220e8f61485a85d5b5902e6443e211146c62a570fa34c29bfaf14b981b254974e0c43533200eb3d342086d1348e48046a1a2cc86e07dd3fb7a17421a1f8b58956c33cb041e175a6ec813ec3dfc0453d8f8082fb686263cc4013047c190472925fa7a1f0b30445543087594020741f296d7d50038990501271e3954a40a9cdf841fc7aaa84fd1c014f9e7e9fc5e0000ff61b9fb337497d7ce183517dfc70924f3fe9e7ad03103fb967f91ea54c2c0b4beea23d0b71fa20fd3b09e1022ec0e4fb345920ce5928017eddf16a7b5763cffc81445f24eb5f357c39a111384971f85081153414886695e2285913edb8adea217fb6093c92cbf0a97596b114da1a8f7fd29c94c71a32ba36f2f9d7834c5b834fa49b3ecd68ec1ba4b408ac8086c2aaf43142e70ac195e2f307dc7dbfce1efa47b61de9493c4fde43ab33ea086b04370a86b907fc09b3bbb45da028e1a83edfcb190a4cc6b81e18eb8f6d6bbbb2e9b187807a00cd6305bf626c59a8e0d86cce34a7a46be8539ef3af60a5713baa3d396807451584f6dd24c6088a8032c4ac5fb8e6d2db85bae79bb64508859e3624e52792d5011590b5517ee1c3b864b9815a8e1d566783e5b6406c687ae71198330d5fa1c350d2a242ebf998628a8c2acaa771edf83c5e58998caf4948bd06b752ffe0d54f868bdbc2356d10de56aeab98c756fbb511086c725d5b577ec659af960d79d9c325c4eb499d7d91d60d3413b5d60a9876333d863c1a9a6af844242df9dd1c21418b2a9be6f86f56bba8fd6914ff0bcfa5061f381226407b401e510a803cd42d381c141a01afb54e06234ed7ea0e107b4c6c82710ac5ff897409eef31cdea591fcc50199af3bae3e47464704c8bfe810916cda54e2e3029041e9781e4e959680430d4345dc5541e637cdff7a1d35fdc134cd39822d89f78b2216f58bea1efb49faa9506909cff0d633a12f2aa4bf98c3c5711bb08d0c81affbeb0251a189f84b5cc60d67537d0d2e130af96c8037e7597036be3914c6a138a7c53858cc4931ce0b715484e3628e15e5bc0887823914c5a13887853858c881228e8b715488f3624e153d52e80c272aff87634531e7c94467ae9c0d11aa9848db07889aa184fba64e4e59f2c481a67808260d078b06ef52bf5b43d24d3377842cf709058438a369b981e38aabac7467baa047fc721f7d918114191c4872c3f8a63943473c8a1f4e4fc2ca01afda14128a3df505bba6130400d3fa5dffe436459aae65c69451e96fc4af44e3e0abe6ba4853349748455f561ea2ceb49a69d5011704e6ba070706aac52de55007e64d9c1fafb6f19c49920e5f4ca851c0a292d2a25c9c968049371cf1aaa2419cbe4f742d6e729d58e5763a3df11cc313efa07c04c5a4e4b322b3176ca090c542ce797f9466e756b19eea2b4ae2c19aae0a4fe714528b450f1e46157b46b163bb58e4ca2854e48c00825c440d13cba403ae219b00723b4454e2224adb3f50afa4eb452017901548102eae101bdc10dc81359d588c7c6aa3374c7c53cd1be49b9c0206704470a667c89e0a6986c2874e7cfe3d2c153439a895db2a6f1d0d6099e21e21360d0bd96c4b0a5b83550a6d1c9967970bea42a2fa47f9f10b474600668308e7ac906c5835dd5eefe41797e304858a1a33caa0ebeda7800368cec02507a9ba346027aa9db2af9b413fa248b99c6a9bf429a83c0bd1e6b8ce1d5f58594da80139118bf24f9454f53b39126dfa3a74a8d063fa22016ece2de1d1315ca4d82116caab0043b8f00d74d09622029154c10c556d7a9bc3849715b8fa53a57139259e7490504d53af5032e64c74230bceeae163309e2f0bcf508f629231601f7c2983e4412d7c4b59705c0af43f6321fb261bf0b5b4475a0235dac2697d2052b157c6c297bd8b1fc7cbe090485cade0361d13452ecd18f3aedd64f4ac1a3a2c803d354d20abc8fb225d41f7347aaca1dc85415256b540b382cdddd08e298986a259ee56dce18c2792105e7a6f3a9689bc43c88c7e3853c39625652fd17f1705f07beceacb6807e51ceb2ab834d6189decbfda8018a9e9f66e9cc306d08d71df7db9f7c5a8f96847bd8b20b9cb705da0fd1ef2edfbb7d3012f486964d1d84e399c6f3e1ce2c369f71135ca7a75db6c62e3521e5f92228eb4b6e6c682e1bcd7f291bcdbbb614e2d1fb1db1db0981975c6a05623e035542afe0704fd014b5b0194d122fb2877c61422850dfdd40fdfc9a06e84a0764019c0cb26db00013ba169c0c9863b675db0eb98c6793163a640db70877a15cac8f6c3abb39228aa151daa9fd9823c6ec4a51bbb33fb0c6fb367da100d2f4ae0ac2674102105609551034a69034f298009f898c89296f7b9e0420415187def311a965920a479e1f7c3d80db9cfb3736ea0972e106e263352551401b2106e6cf1349bb9d632de87106f9076efb958d91badae7718d5ae5e92a0b1f171c7d1c06d2aa324d742b7f7567721aba62ea8e52bc6ce2948a598e9c195a93ae4a7898493d56cf4fed8a388245a1faa371441590b7f0e74304e72711160ec3d2ab486646be20e6c43bff08a8d1e3101ef8cd9387a33ad733306b50471fdd270976c45eba61842843e6ef9ba4044e1a28de07497975524d53f95035274d4958b8ebdb05785a25ee8606f6fb8888904c4a14f78380877bbc5ec815d41c3b4e145324ac399c8161d44835d1a5e4c938548225311290e54b3c874880bdb4cadb9c9612803b9ba7a692070e97023504ea4bf45101919e6729bff759c4af58bfd17093b6cc4a43d7ec251c6616e496141e93a3bc47633ad547609f7925697de50eab756d847cf47ab9e39f826bd1a374a69ab4ba4c9d4e8ba2ef3369aac7375a3a6f7279eb4822ab252a0317bc9a372c0dfe1f7579475da22f1e18926dbd209a6d22ca6497ab6a1b9acdeed17db5d98ec410f0d46a325833ae09528d1059b351af9c4e99f3c6fe0a28bd13949c0f65620152d28160d4854542dabc3c20ce9a3e1da27292c2796208e219af525e91d8d04b1a010e619c9411c8a48d309fd090f3c71c9909af74a9f0771ff9640cf1869a149654783285428261fc4fb9d8726279000120930744d39ef8291ab427c4d9f7c4efbbc99312e3ed1879646369933f111f83801e8a7ef1f078f23166660d93810ba43dc5cebd5ea3c90fcf4d2498880fcae35d9d5e27007968fe67c8c8943103373980f547d675ac5eca7da0be53002e5ce948f635056a139d30ba0cd01c75d4ecbde045a2dde8154d2eb1324371b91849c1c5a1ccc43a89b3b37261a8e96422f21809a7c63604025eb24d1a2dbafdcb0ca2eb2e8583f37bfb996f5aa85f0d29545403139f9569e98ca93a6d088d1760b6a8b013729cd6f9e8bf7e41283626c4d4ccff5ac0ec79ffeebc9e21b4fd444d33f79dec8041fbb73fca000c0df8bb7ef020756eb0d859ca399bbbf0d8eecaaecf88791e10cb98e2e8d1d17830f68a154fbca502fda34f7b8dc56c9de6ce1c70f386d457c40b741f736dfab9677f2321c27cba5d16888a9ce156a481662d871415dc9d109bbe6cdec09efd82ffa2be3bca4ce8cf0467e86012a2fb7004cd21b8e4d484b625a054176d2d03b57e7f426a57a8d148cf039fb41a014e837a542c149c1efa662a6678d7746255e1b43e7815ef942e88cb6ecdbc8fe9dd9e124744d6e87dbc613e61ae993ee0ffddf0d7dacba34ee821b3845bf0c54f15a5cd14f20c7956037b3b29ed59a0ef70803fe3e7a5251acf291632517e47903975d149d9d014cf61bf4ac1b24f8c2ca1d67065989ebc7ca5bc4f83b15c6eb53132858868707e2cfeaa4e9a9c870bbb103d047c3540fa73dca97352c5dd76cd1af9ae14f1aec8d855644e421fe159ab6fdfb48dd8a56c8d577a5a68d9451bc7f7202175b0cad2ecfa252284b9fc7b5d20ba50a62b3e3ffcbd62f5d0b4f08be6129da5ddd02f940ab7da0f51995b478bf4a68d326c6f516033f7fb3f9effc3915a9bfa744233be262c8c06b312a96cd016913c88dc13f9d69e09a56ded614b4d8c3fada88cd3c06a7a3fb1767c7d00f49b3a0cdb1a648df22f80848b56366e86569cf0ad05c663a845da23e500afc43e3434c890178075a2f9b1125ad1d82cc4fd40a071b4da561ff4b4b10049605009068aea55d4e5ed5239d5ee722ea5e99d943ac39d7f10f6e884c6aea37e15bb80f9c4d8296965a7390397fd90a7be6c8c09c030c469a4c6905ccf485635369959c040420bbb5c9cac40d027401bc0f042a0fd79e5a2092b29a0e1669870fa1f9131b2cdbc7e2fbc749ca3795058990cf755e3bf4a75fe6b5e17d35a61fbaa90a6d6006bb39183b01102b807a2c09d6915194b5898beac644eeeefe6b682fedc101e36c9090d6f6cab6e5de52ca2453020a8709040aa7ff71f37dfbf704fe9019c8a9fb1f3f75178efe3f3c28fb584323124ca6333c328b660c047d23df053c439638cc39270b9d23a75138895c947f61c06310d10e17fb6bb8e7119ee2d6b88136adeeeeee3ebbbbbb9bae5c7477751e2592cc03192f45abdce6eb4506937f652f6f61e4adc4d70a7b5e8d2f672c999114c6c401beb9af38a1c56ce2c415453811c51727b0d4f85205a594524a29ab05984a2453ca0ce690d5024c9b29b35c505d52960b585eb0fc49a7cfc97201964f5dce1964c4724133cd9e7353c19c93b35dddb62bea159488ee54ab132a4e73ce4b27a5f4631d55af5627547892884db60ea55fad4ea840d139bd7b22297dd1af1b37a7dd38ce8acd8a4967b76d4768e9a6b4d287c5023c5fde15963edc3704f5b6ed082d1fa5b408e92ffa2e7dea5fcf8382e97f16149f678756faa12a4dab45a54fea2b45a17e2c2a983e7da566ee5f612c7d3e19a2c0d459e9d35c580bc818f75ce8c361f2c7e6410cd8b32aafa5cfd67d24d0ba2f17777fff5cdcb44bc3a30d8521042d8c343a31b4c8d9144e866da8d68551173490c16b938b26b8232eb6f89210e34a1eb11403892cf34dc584d1a21e1152a680ce4850dec8bef1b7f8c3e00b700f1e2efec823fb69b66a5d18f00ca5b888b4b0fd085ea8bf85ae077023d89e0babb8ac6cabed15bd885b33a6872f702d8d29377564bd09b78a5459abbb8cbe002367600cc92149248d5a13f01bfa5d972144c0135ca47fe3460a1ebb690bf7f48d1cf1a725b4487f5c057191d217822191a5e460207d64967248ac659467c68acc200e1b5242c31cd0f41d5064c65a43e4d32e5729ffe2ec2e93dd41974bd0e5a106a47c971a9052035e7655f655760f4fd95d7a31f265a79e05816cd9c3ebb97fee28f7943b768f7157b9cbb873a1dcb6e0ce9d33d03c902e00818c232e1661d2d474a4086e2ae2b119a5232dc826692ca1f428c686dbaf51da2edb7e6207a56cc119ead1af3cde52fa6248e98b2979ec2d4c4d5d7349ad377770ea55f1bf78e8887c7d2805f94e8f28cb0cc1e0440d5b723bc1a486eca04b8606e81cfa3a1996ef06e687253e45297b98c4b3013ac7415519f9769e835e17f99e3c075554e47b3d075749e4d32743074f46a01a85ead139f4bf2cc176e28620f2dd3c07c5dc1f8fd501b65f80ce99e9c9f46db0f344a63fde64aa44a63f823c9d437f260c5ef158503a8f8bf45535f0f0fcf0f078ccc6d18f90135208c216ca6df55bf2f1eae485aac683253c28fa19504c441c0eba991734a62f50d48003ee024e8ab88841450d4b5021fb91c40b36b85294822586fa35762d6f7fa9c7ddef5fb5eefd6fd8189429d0056976f0f497369bcda2c04edf79d7dd8b73756fbff3890367ee0f08c9a97b6e296f1d38c482ede2146c2405dbafad898b447e129bb77795d0cfbde7e94cba1aca262eee3491422e0eb978a47e92fa2decdcb716c9e9bb97e0099c373cf3a63eae3b3b4c5e15af2c924d76726d228daa955b06cb088b1bc1404a89570ebb593e8ddc62694e1f3f3de4db99947b5bfaac0e93db07a4ea6c7751de8ecc8f3c1c942f03768bee1e52171b1004e5c885329c3051850a2c64ed37a777f00b476f4e07c71632fe091af1728ccbac02c51df503c261b057a96df1fbfe3e09a51f0ba8cffb4e3be88a8a3b5e5e308d8b14cbcd07af7dc9788811a0e88202df2a1521f71531cec85eee2b5d76984a1065cfae23f7153170d0a5062a9aa35ac270118394175a902445d7a04a0e5b58c0830f67445162346713ee26f795da0f5a04c1a35571c41526a60e596221c5114d6481831b907a90c92e5984d1c1164814c1250999fc96bfd0df17904a587e33c18124a05479c286232e31c846dc3904e96004175ef86003d2144c64fd8d815ab7fb444d8b252d984268b14c805d24d05c9fe6fa4133b062031296142031a1856c3ecf8cf9c0e10530b0818a920a6c90cdfff9e2fc8d0a1e3f53a5eef9ba71b63b7d422ea555fe7bcc5730ab59d0e08962c9d431e7ac72968066fb1e60f9f26945e29be7efd995ed6cb2c0a73f6d7ddbf324e8795055425d30b5983af812b28c0c444f91afed4ea8958bfd33fba594e279d3ee53062541efe61b233b97e7624b918e35db64812535c2936538919c643a7491204723ad641304168bb23c3ce5176e8f08d2c67574f7bcf238e79c93d6d47003b9b7393a1ca7102e8de7fa6ea066522d6c23a646b78ab2e69459ad6458aa1a3136702b3583baf1b93c9a1bc2094797c33e076e61ada1afa9c36da4085e77778b60a3e35513829f03470834ae1b332d11b5c2a26dc8d9cdd3acb9a232b5a52283569adc31ddddddd8e258672d27f343ea7362ce39674b4435fd2e0de803cfca6be1ad72d5d66a77e47e8e47eedf68be13caebeeeeee061973ce392db6cdc56caad68d5865bace913d96b686b0fcb696b396cb2a34b6b9c69cf3959bb66ea0e0e865d9366ab4502bc830d945422ba7f20c470a641d1de6fb3be8e2a9ce1ed29a3794d2097a764afbaf77879422d9e6d75a2b923a678882a210cb770f479991d46c24e987a19ca4a53cdd95d2b5b74f3ee79c74ce395759b09c734e6a2d47b71b638c1c078349e79421c2f2e9ec1c366911968f3debc9f480e5dbae9e77c5ff3ae54ed7b90e85677078351ee5c16373431c32d30a61466c89734a996384938d1aa18d116ad4e01419a2d4a4d434e409256ec56d32362b1c191c9bc36500f4cc9973db1a0094ea5049e9d5410ac05c7d4074c70a2b76bce039770460aa00201300954e1500ad127f4035e472c0320094bebc02c002487d4078f080e5a35662e03907e0cd7034b99452ca517a9de254ab85237c893738393b940031ef48536b11227e4144b079e9a8f980688ce35e350028c0c947f8fd808f2347081f101540cf175a889c2074a48949e80852ad47081f0f8d6be6468ff5f1e9b12203d3560fafb7cc83863bf9460fb07c03381929024c98bf3d4de59ee0035004745d0ef0afcac0d4e7677ab665835563f501d14f093c3f7b74723b60f932df8a0c5c5f7e8c2a532aa361e0fa1f50fd5664604a65db964249231b5cae5409f1a982c01e8ed4674c172cb538e54ef77b82ebdfeb1477f7aba15ad5a0a1f9d68035228823783b740460c3c3f3f2c843c7ab060c9fc7cdb27ba4c4819dc0cf41812a8e4af301cd989765077ef1f01b8fd9f70f8bf868c322f3060a71db685c3768eb03aa3331cbd34f8fbae716408695c84601a8c3bcc5fa5b8fb7f97874528f2da9523f8697d90777884704a03e7d1b1fd0b6440fda5d613d236ea38813a0c96380598325b352f9789f1298fe013ceab0a9fa8068c839c1f2e9d75a3f86568c3a0002eaea0bae151f55314330d7b012cd2a84801c432bcc343ca584fb5fb37addb3cd6daba0672bdd9edaef47e7d9e70fd07e3f36d98ee2b63052c070017f4c33076c9798e042abc225089f01172726e022349d28430a3c73058d82574cbc90c510416056ee2b59f4f0c5861464311303dbf04205185b0106563541578065ac30c114650201dbdc57988aa612f8cb7d85e986255804a18685195a6051c3a289c6cd60b1b5d8358513a256ed861839555eef43a5f0274445371a97442eda2bb0e7ef513f36962024d4981e1bcb4c18fc7a922b11b9be0c2246fe90eb8f5de7d44759dc0222e619ea00d39f4520918344ab3c4a2249b4034c5fe29881c1d414c60c87520faf5add451255a3ee91dd3992a84a49e4b18d56911c76c5617d050845b556cb6d34ff7225b5b7e4ba81f269fee5d5c7b54aa61a615cffeb677cbf83593e2c68871974910694211db4ccc0801554696a9a9da1644683cb030f9e1ed20c27b2bfbd620610663429f2ea465cebb0ee97dbf614cf9b793363fe35c438353d8892c0dd9d500a8447e7ec70de06d26af3165acb81a311cf35d2ecd861eeeefe2e4aa734f4a7d6fe58eb16aa50dfdafb8ac1f3ec6feff6b91fc3d62b06bc6deee5197e107746aa677577ffce91364ba794ca1b2c1955c6b76ff8008f74a4bf6d937683b26bfd6ddb727b0deedcba72e17452b9a90eafb7bb9d78d670fa9c435c191cea9792927ae1ececbe75bc72c7d921ce862cb06abe3a6c3c3bf315c1b360cb6e4491026d4a5bcdd327ad2dbcd912d88db3dde97a1f2a85635432abda37f5eb409e24d8ccfd65d5b0d19ab9e1a20901478e07c39a970e1b116e44982e5b145134a49d53bf8a60b690e7cbff8d085f625f89d7df9ab1d3775076982842be9c4dbe56c72bff6c40cb5a37d4e47bc37c3d30dfeff345e5c83785235f1c42be3134f9aa5cf9cadcc87735932fab956f0d1bf9daa8916fcba3202b5b50c991d94ca64231b3caf7864cbe2e55be3431f98680f3c591ca37c77ff9825ebee1cdb7e694efabcb5787cdd786cb57842d5fb1e67b43f31d61e68be3f9eef03ab0651494f98a39228ace1f415bdd9c8be1b6bac7398b57adeef9beed4d0072ff4ccf566bc4050002b63aa78e3318c873d562d7dd2a7c6dda298ab41d9e966d51630bd922c19d332d278a1e6b19edf4084264496b8b48cb52834ab72347d3b21c2dbab305a63a67ba28dde13195929013ccf882a67774b7962d54e2d7d3609aa472abde0f8aea8c06590efda08b1f509181cdd70b0dfdbf8e3c76c2f41396ccc041b05c81b9da1734e491df4c6ba9482a92ca0706cb666581e7778c85d9c74211161318252944a590c39848211666ece5f3e5b5c7ef37f3fb3b673e2b077894429f135ca56fe6bfc0ca20cf9994e78fad97c78acc1d920a0b3356a469260c0631d039f325158f5569258bc36a9e7de50c2cd3073f482a7972331f60c9a3bce20326524b9eb34b9e5fa9ecee22cf9f34e4e9248fde94603b0652dde33f57576e0f65eacf211561e7b496b353dc799bc591769f931fa7f9716b6d4b395255ee3bab4d440e2b721812d427b1d9c861f453b469a6a06315cbad92e97d41a6e34522d33f81d58bc7766864f2867e4523537b9b56b150e15388e523028f7776ffe4b0cdfb0fbcb3dfbe75061eefec87fcce767693b643236d85b699c396386ceb4ed7fb50a94f080af461c12040ad43dfab81821901dac703b600edd343f2740f37fa646a7fe478748f0fef217d48681dfa148a4c7f3c40a6de4c1d75cf4c0a199e8e3a87be38c5369bb4cea1aba6555ae7505aeb1c0abb61bb487dfcb8486d8ec042ddb3cd96e4fc9ec24fe774deb8cc6dd982357720cd270bce7c3f219ebd4f4827efa943c59654e17e490c2f136555ead3a7919cb5f6467171d63d4a863cb6cdee128709398cc975a17d76ae51a697e8da20c31f219d439f0383803e5ca43af4b7d98cf50ef7dd4ea634dbdfc2f0464122f10c62431ff632c9f4af50a61fc4457a8732fd219d435f7e40ae0f17696d1a1009e4ba903b87da3b0b7f5857d04f40f70cf118f6dc3eb275e4d3f7e130fbf48308f9e99eeeff3d954d689ffaf4a9fcaf752476d5e873930b256d865209289853cd4ea7d3b66ddeb5e5615bbbda6a247d6afda17b6c4dfab80bdeab091e25ed49c36aada145fade7b8dcef9a7d96412758f7ddad43d34e945c3e69316e97fe1b7523fe20fc71d3bb24d61ff39a342e31cb292267d6ce835a944f7ccd0c9e81c0ac473eda4c035e943c6a59ed766acbbc82813dcd2096b834cadc85426012425cd05b84952ba75387e20a3d039f46793293487261317e977e05c32672e52afcd9b1a8a327d3a9fd4866c38893a873e102ac013efcc585c301752a39d19fb9e625a8d664cd2e60d7d8a6d38628e69ded0a7292bd8bfe665ceb9855e733032c0a3d732fd49df6b1ea334afcdd914f29a83899959afbbd65a6bed1e8dac2648e70970c863d53ff2c85695036c82dbff91815d16b796c0fd9220b81d0d70ffa5d15a72a42e229b9d3792035db2bf18d78fbe42c312d7035ae67ac0e9bbefc2116c635f99c13f7fa9c20c5d24a8b2bf2afb2751c1037d858625599527d8576640221f51e5fe13e87a80777aef0123e0fe3be13e17ba8870dd735b8874c2c90bfd68e3ee8fbb927c5f92ef34c7529d9a71fb355aa3ec7f2f9eddd0d5a3cea94454da0df588ec2fb34d025330f3c61f8ca560e6ac0ad5a119f3889eb40f8743eb383704a5639c0e7de3bfb383835353e372c9fce8508047ee6b2d73b419eb03f4bc1939a4ecdf7142274ceb1e54f69013626981478ec6c2028f558aec53c908f5db51f6af65748c13aa758f1ca37d94ba4ad13df5bdca9ca243ab06bc29c91e0a9d91bdd5d45d183a143c4e97f5078405061ea752769f634dfacc502a491d32ba4786f2069dc305e1421bd2e484664c4ed137fedea2e5c06a817b909d13ca5ec614ae0a035ce6853e03a552e7d8a075fc3ba319d2d2b6843463a2f8df6a2d711b12fe0d691a1de5f1338bcbf860b2cb5a93f0149a3317fdbb60af088f76559b3f33e6bd8b6f3175064c9917be008fd687ec60b2fc94152cdf1a61234e2f739db32c5f4a774a29a5748e465635dc99f33fcf3ce71022f0e85f7c41e4be17ba8878a80f92852e22f253a063993792d6968677b895011e77c61da0cbdffb20d407c96a44ee7b610bdfdf9f2011ef51610b37f8c26b334618f5813f037c29d0082f609c5db399a062961d0d170d108327d96b5e1c0cf8859705ff90137e82581ae09d490b1264669a4f7fb2bf7ab970faeef4364fcee75770ce8e51d9ece427a15a93f52c66c145d9751cf733b953c8828bb295cab0520695e798788c0256d0c489294d32178e3b3b79b447799c445ea644f16ac07d850c2f799c44998c89659c4259be1ce750962fa514b42c7f16cd2859fe14f258ff4b078c2409cefe83ce91ef5f5a47be972e59cebc6c912b20ed62d7016d9be4381fe105dc7dbb68ed07a45becfed2ee3f20fd2ac2361cfddd5970f1f4a7772f0ef350cee690c34e217631e923037b6f97c097e3565df86fcf811b9060f29d23098452d9bd8c81e5f75269def8f5efb08061c0947da1c52d0e7c0fe4012671b16b5f8ef2d860b2945fa6642927d1e5c051660e4cf60ec8dc8548023bf288038e3646d9479b59eec8c0234b4989cbf15ccdd7e4005d44727ccdd7e4a8a9c901d68035df1f90f9e5cbb6e5000493284261e01c3f62224c7487728037c0cc9b3b64a3e395e3549b311b1da7daeb54cb71aa7da1cf529ab1568b8586c3e8ff2bb1d070d1cdc0544eefd2e4a28d8ed7cf1c363a5e3964eee2a287bfe4a26f9140f8357f3f09808f237411c1d15e944086e3836435a08b48cde7f81c610bf287a62c8864351f24bba71a9e3fd68c33a443b39102539ca11bac1a0eb0653560be61d48d817f69c65e5ff3a3cdf14bbff40a5935bff1afb139c2f61b560d47c86a26dd23b3ffe907b8f3c8aad22b48bf26046727596b76920d657f96147864d5f2833c7e43f30c775cf496e1005b1602d8328f06f8f3c8aa65af31f3af21e4cfaab1c0ec9c825c0ed4446b0825b7c606272fa0758145103d80528b01931631180306318c517df09dc0b71a3cd97c5e3c3b4459647f2b933b89a806ad13b47620c311a00a8e238014d60a8e005eee242225b664995c0e51e8c00a306870610a2d50083305144b54968ccc60c10f9f122c18c204494431e092887ac8a7dc49444343780fd846ee2b5c1c710105072e9448d9420c69832daed859e256da728e41748a7b57cb7594db4e73ab2450eedbe4b422044ee54e2272e135c3d85a4609a060d162080a181ea8280114a2c79eb516b7c0dc57c210c20b914709191e525661833cd2c0f2f8da61872e793a89419e3c3011615c53a69ea43b3b1da54b4db20880f71660fc80ba52a9090e79fec9f35a0093021d68f872c511404823490b19484bd400c34c5604c6d195b4d846df36cc7a493a64c9d35ff8a109c56d528728629e5fade71991c6174a4ce1658c2ace40400d8cba6c41ab52431599bfe8125b28d99fc757d9dddd678705de4165ee737a21d3fc45675a2c8f832b37105521c6d012383cc1418cec4939b820ef3c81473ad2b4153179ec51432dfb12494c5c70830d5e647fb1042cb841862a53575c9f6520337b379dd24a96ef56dae5448d4150e0510a49a1d93fda4dbe5bfc5cd88af5e704f3b4c4ee9959d272b4ab63e26cf14a99f651ac423211a5153f026346539119934c849afa0a2c3db766bb952379442342094b9fe046ac2cb0146adbadce91f3a8d229eeec9022930e3df48866e81bf9724af6500ae54012d137f28fb04964279878acf5c9a3ce99b1564bcad03972ca238fb990b7c82e594a59434af9b35d862c25cddbee91010246609ac4228f24d2ac066d7b69bd2878e4b27f8f5266f946acf7168e80f6b6d16ac4cb93e376785eec1ef9605c9afc6267fa48e35ce6a4b9d1aae1f65a9b72ab7337c1edb93cafb5cc7c0c499a6149f6eed2a3b1b496993cf69247a7c7850457fdcfdbe30d0a1e77f0bcd1fa82470fd504cb12ece3aeebbc7eef81f47b1f942938d2162e78faa0532800a9c33db599be942f7ce1560cb61d3f41767866d74f51dc7ed5efbf37d481d29cb0b1995c257cf7f563a0f590ebdf931455dfe021344b710d51853f6fea8f0003bed9993775270f99ffe31854fd758fe9eca9b3b6d3c1cc9e3a1966a0eafb034a81312a10bf12d8be14a197c9fcfd4b4f9e3d79dee9099a674f351cd5d3693b79f6e479a727a098a1a18b674f637fc125d7bfdce9747a20329f3e134eeffa4133eabd7094d97b99bf7a4412b94ebf93bdf7aae02f6c261452f0c021415630ab7fa43e0bf5bbfb23a27aacfafe96c8410f4bb2989722f346640d683534d1130d693b2a0268888bf54fa7571d814fff334fa0e79d1eec8cffc79708bd0c7b61cec85ec8c205a5e0f0c8bca95df3ee7b374452f3bd611864fb31f3293cc2031e9b0985143c362991d4c7842d3818216ab2d4e3ef1d28c970e431775a3113c242e51542441ed3bdcbca281d885d8c750e6a2cd4974baa54c55c56df9eba20f585d41f220353ae4fa4feddbaaeeb4e2af06e4344c163d7b2a3ea03e803269198c7610b1e12b298971f11d5a7c2160c50c483914ca502531f03621a747a1f0e3bfd4cae269f96038826a0a0916b7237018586ec34b3725d6012ba0f55e8504972f772a3639723c1d1fe26c1d1eb4690a5089074e7c8976397edcba7d9c3d1cb5d7778e5c730cb38b99360d092ef8cf9f9a5baa7d2c7fbee37e983bffb2e10987e09aabfbf721173c1f2a9f717ec2c1fff0a338ceaa21e0587390f8e668e2451a1eef57c1f88e73b9bcd76e8fdce1ee8427d7b8ca7c29e4ae57971a4c21e0c42d99f87e7799e1cc5ec2e1e719867e7624694fd59b85429fbf39852be5e2ebaf7de5b87c5bcf79ec354ef85238d07becec0de8f34f9c39709a91f28140a15feb8e8df02f07b31322ed6ea93c880d845172bfce19915eb2d8684a090827f11234758f0d894f9b35632e28e122fd99f07cf92a1ecdfc3656442171099653c55e8427dab76c01d28505459cf7e40312f3f12f0ab5e0674a15eba50dfd98bf1a1025da820e18f8bf633618519e6fbc6e08e1d17c3ac703dfcd16201a8f072ff92132504a61f683ba77b0fec3aa77b0952a9d3fd0537a9d3d9af019e36af098f4da33f34fe2f17a5496809080813264ce638570dc53cc11d32c0434ef809b2f21a49dc7ecdd89451bae3453db6e34ab1aa34918af8785ca4b4698f067928f1f28be6e537f377288e25f8c7771c267db83863413cfc8162d5034cc7d7df00f14229f5ebd7004c63b96ee1df31d24ec142dd8380ec452c0d478c672b4fa42226a5530a2121d1041762e46e820b30b9cb5b1e3defaa004fa5fb2ea9a4d47441c9f47d15229ebc44ee7fd753ba378906a42c80dc49342ca9d5db3ea0130de92b0268684aeebd7e25d81fb73722ebd71566983097aac0fd49be44a2512997a4d2d33f6981eb266916ee24b3b878a5032516eea53cdaa6b8e858a494ced9a4cf283b15a8d491445cf4211b28f3690c3cb69292142bf933a1869bd4417251ca50d2945c4472d125924f6b1993e4517efddb1f90514a69c4f380bc3794579c0b3d4ba429699c077ce8828a29d278d2032c64feb2491eb9e82d955cc4f3955ca6072c54694869c88552ee4bb9e109577a6d2fb52e6858115a927d0e252941729f3efdb77a25e9855af6242547524a8963c90ff048b3cba58d8935c3adddeebe49f711c4c52aa50f1779a60f1e58005aac5f3bcb4ee7d41d4678e4e1f1af5e7f05a67a48a97e8a83000345971698608623a4908d387b18337c1003252960e85286ccfdc91854589b3caef284e539935c9821cfef29f26cad56414a909098224c1542c84045900c688083232f6088428829b229676bce4994a7184879ce39e78c89028fafd78e2d55a481945d47764f4307d9c31c917d3694dd5b45e1ad6870e4bec2451350ec00f7cbbfdf0ef85df47e758fa42121a594a98bdd9d43bfbbbbbb694fd0768ef47e1a8fa594be4710262b40830947a3c83f7777ffd9d27398ffcabda919b76db750f577a84176e8f6939fbe76ee5abb3616e930f9b6c8288ac3bc3ff2a4cced34457e537ff4505b97af7fe08c0c054a267e530930ca26b3be4ba2eda7d4fa2258358c8515cca38d7ef2b7592d52e5ec45d030a9a4c5aaa461ddb30ab6ec9326e89c1a255759d40120f5768081545cb00c533826a59a73cee92a99182c23232323239f26cb7015c6ed086c290f942dbfa1ab32b0a4db733fb9962e86ef331851c97d650c2bd92677920f48e49bda7e024c49e8e3d504ba482db5dde94f70051264ff215dc44599c30bfca92b58cad0a5908ba2d852c252a86513228769c9144422733f53bed2a3b418bec8136c9a0c58727fb2ee80e67a29dddeceadd65aebb60209469a6c6717f69f402246e0cc852d247191fe90131cf6029648c8590d8174ee9ebabaef8c5da45d6749248bac78ac65425cacdb06244828c4ae90caf6691c46f323add40374ebd0bab8d1b4d21014889c3081148a849ecd429278e67e7b1f65e0ce3e3c46654180369ac473ad78d5a2e192c85cffb32ed688013f7d893b78d82db42bc0a395b4d30c22d05208dc4927d892f1bf7f40b7e96c5a8e09479af1db1f7e662c8595ecc2fad1c82aabbe3f8555385aeef153a098e7fec72d0af0d8349997d907c7fdbde0e713f899f5a3c53f62d57faf7aff805496158e16e370c4f98b09c756febe3bf6d337dc7ff7bfc8f2537f5b0268e4d57b961320b17ddb49f503f5aa14eb391c8e46325681e32aab5e7e4056906132cb7ffb16b00abdb30a832aa84223ab9cfa2f06ec9c7a16a8ea9c027fa0deff03398ee3b8d4cb802af8a7de03477faf3f13fc532f637fc0282370cb385538934e4025b3feb584b957c19ff5a3ffeae7ab9efb152bc4e0676b6362629e7e40312af033f72d607b950a447956f5ad025f4c58f553e595e09ffaf9511709f8f6b70ac7a0bc7a1538caac7a0c8eacf047778eeabb73621effcf8c01bd5f81322a9004d5a35e158e4656f97bfb9d7f660a6cf00476e006567934928dacb2ece752f2fbe1c6d856e7d0ced6ea5bba18230833c0d0ea393843c8729c0482e90c1870d1a176a08b883580114b18c96c68595c3a1068fb7bbb48dea411700ea1f485ac85ee4920a794014656657e90cc821d4877401bba6c0776a18b48d73fd3dace5c338dadc9e282eb8ff6b7d0482b4f09663b37ff986ebf466c84ad749f73ce20597f403a0e0c9251a3548ac5c245b80817cd29f3e8c934cab2b692130d711cec3bcd25ba447de33fca196a7222b18dd34a960ee8d836345b094ac7b6a15a93464e6b2a1b36308b353313d36a6d2e1791211b0fd97f9443db50dff86f3a748c1b2515d92889a45194eea9590a512d952e6fa96e71d163ba6039243cc155862c482667c0021d886436dc88e68d7f906c1b9a3741320e0c927553b024f29a8b3e5d736e431eeb6a1b51148775f6df8e3624b6a2ecbe59c9be21d1362cd9a9bc440e1b6badc8e9b792c3c656a24388780da3a3239165a337c9f268369bcd64a317652a47b7227d5c882cdf87ba2726cb6fda317082321f909c447969de30e1f0b08b88150191cc8676dedcf04edff6f754b75a7dfcd45ae775215ec32058e6df60065a08dee9937f4f92c7ce4e0f1e9e954c0eafeb5eff3b44514655e359d0752022099a8c0343a822f328948a94643b3668324500545869927160cbae0ecffbb6bfde26e746d36ad56089e0dd4ffebd7569c66c58fd6fede230b90d9d68dd33e4525ca24bb4a5b0b41251ede2a25777eab52ec990da2849500419e0711bda7c6e431b158107119c3cc123cd336c0cdec8bef150635096406041a526e340d71432a31e4c2e75d8a43c627827c8175af6f7b12361588afe8eea50b951d9537de328540b70101751d9c70d580533098acf6ff9d4ba30e59c7352ff5182a067297fe5208d09327b08be80e56f3fd2d06f39e79cfe94524a151044d35cfaf89b00896cdff39dff63b339f2fc3184dcad1ab951b9c78d762f20e097f4d97ebe756765cf913bc79f0365ebf85370b68e8723d7ad63bf5b67f4afaf823fb5e10e17a787481e0079850e9346dede412ef707640c33b7d9cd8612f4ed9b96b7b03ba7faf65e7db928c39d5434cbf447eec64d18cc8563d046430c05db3c6b4cca362d8c8668910f8adf9642a4bcf9f2fb65519659e6241fa8e46a420d2d0dbb2501dc493e30c99d3b5fe9ed289758809039e0546e2c615cf9a33cd2e4242846342d59f41cc0526b9247afb1d4867896e0913678432ac19d94c46482492a109de4da8871058c51ee57cf394315e89fb20add33ee04f58fb49b862309e8f78fd3af60093a552411666c214b23dd259320d74e7a822527919953c148d76028d370032f7fb4a7fcfd2da06b30943bdcd9e4ec26960062e6d986d19ff3b7bf144c7ab284080d22db73df1f03b6e7282ee2c73f88ff8e3f8fff9c4e67e03c2f7a33b6b276c6e4b7226287e7456772fb353917c76d398c28a534d3a4274899524ab58ccdd4e50b6eab222d4292c920c82078cbee19b83f22b4084936df415a8424eb8f888b31439599ccf18ccd198451761c4f543652f303b281c3514e507584270b625ee69870b40056bd7f24f416b9bbe00f7ad862c6aa49c1a3cb484acdbb8c66ac267497116d56ed86d18d5af7c4cc7ceb97a60e219c21000c758e1b5d571487c9bcbf6b4af7c4787667a8735c87d6397e9467c09112d162d54250cba3ea8dd4a19494101ef489a205348f8b542845f5ac9ac3464c14028863718654500122207440c51344948005773301cb0b18161a355ff352fe53ffb782f43128f36d026ba6e01acd37a6740f4ff6bf189c790bd30f09d0253c89063d28a51c86552c1d3236b3d6f78cd9ccfeaa409d8c6f2a959a01719ae010a57086c054d6519bb1cfe237fe595cf49f015fe906f85a6c667349cac6666623346336ef6f43e4308a33b4b47a0ee748479767ea9ea52d0e4be1942afc2cafa5737474d1d16483831c780001072c3356f336886c5e3cc9f203195c9052384d885221ced04fd9028f9f45caeb3fcb2b394cf5feafa57b5231dfed8333933afe317f55e06f79269c59377a06578e71cafb1a8e532a9cfa2933a623acc1d8e6a74cc9d6626c06de7e64d5b691e2ceab11038e5d1e3fcb885334e21c657fd668f37c0c7adec262527291a5c5c5d4745697eccfdae2a2bb8e12760a96614461628a0c0e11ce945963e3c80a0e920e96ee69a97ebc19e749fba87a3c80718e689f1493aca3f6f706e8fa1990e65ba04eb651f32ad00336bbfecac8c8d080364b401b2110956d66a9acc211c299b908ae1e83ac9f608d1910bf0c383f05229979995781a96f8139b906a4b216ce921970e5038c2314e2cc585ce01167c8652403dad8d03afe36409b590dd06689cd0ab461d239a8d7515b621dcd988ef76721b1bc66d451cb6e63c4bd008fac283844dd3384d3c461f8fd53aa97f9db9da6e751effb84608ffb14f0ac28ac299e4ad57c4ac7a75e9f4a81384b7084409c195ac773bc94149bc799cd984df84bf3c6ff975aa98712d064393e48860344e389d7e30ce9d0ba67e8fec966d6231c758e3885cdac66a97370660ec3598223d43df8fd637cba8ea5ce711d429d63a3844797d12fb984e68dbf8e17e89a81ae21175d4636378c3831186f1e716636b39112513406a45ca8246d7655512d11d50800000000e314000028100c078422a140249ce9b2ac0714800d839c40724c170a84490ec3280a4206196308008400008c3184c086b602722f905f137be5a7470e736967ea9711edda4f1ff7498eb1ae9a57449fc9cfbe3886807955925537a29cb78eb8fe54914ab60b88752af6955eb0dd38e6709abcbb9ecd67e24015b2e91bf1c6a1476d60444d8e971a1b9e6ac03911fbe549b3fe9ddbe3394b23a44a32e9336e4ca5af622193885f578e5879b4cc87882dfa9faa00e889c1a627fcb878deb74bdcf884acf769681f9c300b4c99345871bd8ed270d38fb3846eee4b12dcf2b8c3ee6ae0502c3e58dc79e79a5c7e24d0c4630e8266b2509f6f2113cd082f46dd7324c1fa0ea3f9302cacfcc6f0af2e6f9f45080e1035b5480d74986014d0bb8453be0a2ddb9949b1d37d4af98525af429313472b326a03d0a0266a0589c50892b435d2121f1f1ec8866c9d0fd5be8c14e928569dcf06be18db13ace3a1c0960e4bfbb8589956d2363d920dc99e796e0b87826985c2d4fe3b94d30db07ed52f9169215b7924b670ac576c357a511e11f97044640edd64af70089a748243f3753122a6722b4fbe33ae72f41e2cb7fc2791ecef5dd09abd80dae3a458a697558c4c9ce36d2cfc301d2522041e93ebdb76f629cb9dfc6e13891e84b3353250cb97fde514104c1ad7b86ad56c59ad85efd4724527487cf16621cd0ce9145cd0826f4554e0732a96b69f2ad0fb4ffa1048e946b4aa4096702b5d28e6e57334cca72c2f22bb4330b9250c10373597b16ba42026ccba9f248e3c66ef01c47c01b384728249d6d26761ccbf2b6c52c4d37bce62a5384ef8b1e3da751288805b3e2fbf4de3e892450853a0806d1e386eef69d39f001c795b029cef5bc29bc6e3141b683a9fb658502ad6f5827e8f4e9cb447a30b0418e3ee4763fa37f8d9813296a6d1a61fa1ba19cacf00b86825dc550ddad46b7907525a96dc7fba1c6dc4e2fa1d49945575498e447e71db73ade13b3c30ee562f3f7843df1adb82c741c80bce996ac33d3e2d21e5cbbacde446ebbfa23faa7820840adf6c097f842bbb3251d7475de715542c1cd96d980be1cf25985b8b2e9802468be58de71b624239a3a4a3ccdc1533e589b6175e0031c054fe61166cc92baffd15d57cd9432bbc51449090ba5b04001ce4f20b833de56042224e0e145be7daf84b46c6d1506f522a0e90dacbfd0927a76fb8a4e9b1dccb82379486bb0605f744c9aee69947bc9554d288e2cb38fee432ea106e399538c9aa0584ca5a3bc953c972b019b9525c72e79a6d4588d5cfbf33fda19e03006ebd1ca0e8a37de01966a0f2156c78fe09934215c1459d88f7667cd37f6d9d30164b78d89f2269a87810cc979fb19aa859dfed2eaa092d885446c78aa8b31b9293918c90888a3fd84738c8b535259ae375e79405e70aa1287aa2ec19b55abf696ed512299b3b1ee8973c069684df9141952a129264989dc54df7cef54f4cda4894e6a14ff817bb5702729e248a89fcd66fac019a66fc8a159536c17d5051eecb0fcd9b96d03fe438c182d008e6af5d78219f628e0e3f9ee9c72f56a5658d0d8b48ca8b084b31143059b9486b9033704b291204d9072679c783482242e44aab0b118d8c2a3d6f03197886fd429de824161a30e7c0d29ba8e986a89634625cb7752002ae45dc52ef80adc5276f3f241391ec9506d4ae6a30b7cc2a6a2ac633d69b8a09074a178b301fb06bcbaa993f9e9c7e1d057b192d4e157e76da3cdb744b56490dc6eb4f4adb5efb2c12cb1eee705e70e131855bf461b67ca8f4b80dd03857abc75a20a8437c805810e0809ac575717501324b23edd4c50950622069605a22813816d9e9a81bc65109b395e44024883e5ddd3c844159204396dde181ba210110d24b6c6ec9d6f974d6537e6fd4081995dcaaa044c334f5ea78107de9f8145f89e4ab7f63c413fed1a2df7c239af964448d72500c501000aa1e78e3c4884c96d1abf14ec8257f9f9c06078c487d9996b9feaef631426801565bd423ab942ad2ac5efb35aa4f117c59e675aca388dfc83775246c0645ccd164a909897d9fb80338fce430ee19d9313bb21360b9d49e3c454d50780801480f014e3f09191211c5a2a06d811d0911d4a842f9ebbb2061c387825005461dc844d3f482b6d4d03409dcc5d5f4a35d8a4c6399d2a74ca6c5b58ea00a7b867651f16bdf66e6f08f10991a910ec3c6298c3ee0e466fb8bb36a6b2a92561ae819268977e1b7276eb1a96b87eb27f15ae87f3396676482ec9b1b2dea91b2b307f562c46f5c15e8a8260d9474c6263e0f297d8a7d2089ddde27d640bc69958de74efab8e14a6c2fcb694f30c62d7348019e5b9cb4c935ac0b4c02b6dd53a91f7cab87b562306b8fbef173b6434d3f8830baf78727c54eb4b10918992a2b1157835431902a9d4e9f75b60a6f3cae252eee8c66d7c256a839dbf045b91b491ccc3ac91b97b78b8da9941ba5b89ea729d9f7e4ca31df6dd25798cec1259dc4633aced19b3757b195010210db8b985978a68512e83c20fe9580cfeb6ae8a04c243ec404a2234af1ea46215d22dbce5a55fcb1ec636dbbbc8118d24d9127f1cf4b5967160d11c2946a19455ab38452f5edf182794040b21854105ace0e4223b3950ced401f11f90a9f0e3226dfb71947a02d7672eb4bd0c6e2f6bf68bae1b1913309056e81b01fbc55dec02692977b0e7c9fa9d522142cb88289270b7ad74aad7b890e28e17db6a434f24120f83f299cad2115e62e7777ef652c3caaee4506acdbe8d412b09c617b06ead72840de019b83d44d89ea5ede38583cda42831c393ce99b8e739e03a2ee05050be466f49fcc3a08f9f058913a03d016dd0b83d8332eb70300d8902aba176419af32e7fdf40337c6320f8c7be328ca2dad08b2b888e6ebc0e6da9e58eff4036f6e29a1ae93b269d03f5152a40f7b3631b8937d49faa31a05266d55772726382a692e7d4e100a7ca238736f688fb752d6d6ce7dae6dee118dd5f35ff824c1be089e799c5f4344ffcd96902df5680a2b2662915378c39660355c44d5df24e8e44f7176fff91b71d4deb3912ec939491cf05b768ef979bdcbb58db7e1636f7be8c931f67ee9861aa53e34c2e1fd99542ff791fa73b31fdcfed08d1ba8c4b21b760ab86f4e1e96fee29cc95b8a61a684a3c02b1b0c3b044c3a9af8f0382562fc73c4ab1008f889fc98df2b4efc23ceefdf32010e7186d2278ae257c3bcab35b86bbbb0d885ebd64c4cc80d379ac178553a1e35cbfd17ba5baa9aba83ef5a7681c1edf2e269cd775795c0d3145bfb70476c42812ac6d34fbd7610f0eabc921d2b3bc65e5bc3043abda685a18751010edf394ff0a02953db571599101a63cd09391f0d40af4c385e2741e0ea9d19062beaa96bac6d18f49e2bd1edda16766e6cc173f884699f682b72d0995098d0ed9e628dbe147eae9b99e6d20e41cf122557522d5bbf61be49b0cbb2ca50cd6b9c8bd46892c14e082b4eb3ac18550704a7fe94511281dd62e9cf73b9e523a0c9fec6083927bf5f35d570207934079894113cfde37703f702ed24dffc845015eed19e01d3547ce3e970e7539536d81f304d70bfc49eb52a7ef068aef7287f018c9c37afdf4ff9fbaf69544d574ba9cd80f8a0f152ce75d114fbe111b41df44c44db6c335eee0f37b956b67ec0cb5953a45720624237bd5e3392273b4350d0230b94fe96682c3016093895dd8ebfff25381d1722c02cbda80f10f93b00008ddbbfa90dd6d9989bd07ef52d8977d424062a41998bbe4172ad440ed3c8dde77d746f442d78d97d4891684b6e8672511d843e8cda0c6dbc659d123ed53cbc2f4ac375c107cd0311b4cb39adca322db1a89f42c296b7970638a3cd88e0db425b270baf645b2c5fe02198643bb371eba8e5c761331e6c1bb92eb76f312e406b41a47f187c694e0af7fc2acbc23d737bafecaa4a4c365c755b78dc62157a23bdd99b3d333dff7c6fa402efa8d2d03bc09ee9be0a1a9ab0c0826ab449b7bb80e8834fc25f8a7e95287efa2fc9c92e8a7e557caede99451e7ba07e8006396e4a950795f29e395903a7736dfe10e9029de557e933e5740818b860437f13d3ee4f8ddae8c712a65a934cc9bbf004b8a695e1a31d2269f0a9cfcbb63f6f840e470bcc02738864eff62ba58ebca13bfe1042370734f4c9ceb9bc0533bbd12c863cc9aeae7fdc1a7be5bb6635657eea14b29f4c6768baaf9a19dcea6f0f703ebff97e6b3935426e404fff442e4a5592d76dd09848953da1f6d6335fa7587ce91e75b67f8a2ed39092b1e5a763e701ec82ecdb3d00f0c30322f069cb6b07401943aec782b47ac9eaee009f76ace58020e245c0d26e413268a823354b6f40fe3e433c09138446747980cca80271baa726076aa80b67b0efef9fd6fdd472372eec55b8516b569162196378dc9d3655ae1855224b0061e648f7369a31a6179cc7344aa17e913517d1ad49cebe93295b7e9520549c7896ec098dd535ef4c5ee36305ebaf1b964f8b66d8321211964eb46ab6d271077b19562625acb1a6efc17a44f76f5356d68abe56fa8d6c646bb6d2f38dda42b610e975f0920aab86793100ae6e5475e4c879ab7bb69e0a40034d9c5318012059320012de20bc71c6549f229e308ce170c8c4268443763468528870c424022d64035fd6e6e85277eaa195063fc371548e57358c4d5a4ce539470771b5a4b7b173a7a5df11e771c8b1966619feee80a02b57fd46bf0b14f8a16fba8af8362df6857a96585883888be27df52ce4d3c30b0c8633969742038c4c336733cfb028eca631898caf1fbb0c216eb740db0078e1063bef6582f3db739f15921da9846c4c4c238a80c5598b23f0d1d261c9f9156c8fcf5c4a20eb4a06cc25b5ee803604969b4a00bb39d510a4307c28111556e222c023c7f3642789cd0edcf17a1de0912b028567bb426151352de3a04edec2447abbc9a4f2118d2bcb809a0ee92b004e593833a6ee379365114878790d805a3f4dfcce0d38c796b78f022df1d8e3bdc6ec899431913bb66c4398cc66e27fe48bb87ef07dd89e993fac7598a3d599da10c57b8ba6b5bf178f4f13842573ace87a1646eb26f03c022bd49958ef14b73834df9c62ee813f72040387b0fd94f591e32e5641f6ce2193ad26921d962174c8e8ed1837504a90af669c33c2a5aadfe300e8801458b3b7a28b4c850ee0bcf9878958c911098973c366a8f052e12e94caaf8b91d4443391052dbd6617f91271dbf452d05a33b7d2ae0b4866a433737efdda46d16fb931f166d337552b659ae2155f067f2ed87496be51805ee2b3085810df78be40ca7460223e6f4deefa69c7bea5c8eca9f51512f9a83620a7e5b209bd5627ec9d64800be0144b1eb8b10c0896b8b119132afb1f51102b5782a5a7c960459f44a172839c923981dd941ed83ec63f1c3f2f7e755ad19bd1b74f7a8861e92f3bc9e179c540014c106de3ccee0a517c83c6d4c45246a4b40388ab7b1986700aa71c2af572862c0701eb909922742c6555a48a882323c44c9ef3c9137e027ebc0e301946d1b54176e6a58a01dce485ce8fd8ed5f830f49d5c6f61550fdb0f46ab5d10a94f0816dde8fc51dd831dc323b467f79210da67d44de33ca0f2ba597f0cd09768e453aec883810c09c2a3884372b025e3f48f1ddbfa4edeef9f188487296cf78097c25890982c743ef96a93a33a638223309bb2c8e6ca33d0c3b1d48878b88ec36b4ff6662c409974b56e676f2b7d47ca447812f1df15d5f92405ff93e6bcd08c8923ddb8e65712726bff0df0e4a546b9bf087308e86f92e6540d83d4cd0666d25bf321960ccd9c2684c9560002d6ea27942f2aaef19c24bd49dca9fd48927d2961f0eb6c20b07c41d9503e55cae30bc7b9a46e2ed584793371173d35b23102e91f2bb88d25361ffbc733ccb66ffeeddd375348803ef3decac492eacef165d803c8b66cf6067c86757c5b4f9758b68f41e7d5f8339a44ebd15d8664409a083f9d96900d93971f8b6787833a4110d03f69c4b88799492bac2f1fe7bf8efe7fab3cfd194708cb146099fc37e55fd4a9777a372593ddd24e7bea812a6584ad2ea3c33c7a9053319ed436f2d6cbb6a7573c6a491b975a04c08446ebda5ec520fba2830b2a16f3a7f6e5d218328495e383adb814b059c553ac1b45d17ca1aae290967b3583343726620d2cc68478be8eb39a3c6bf1e186b53a5538a4b84a9e9cd041da5a79409830840a17c842bc45481c032a2f716078b30bd8e127263fe55083903c749dc52a48e86c60937a3e3bc015d10400b3006c528a55e0c529f0aff3d0d38c1a1c9d2c914ece6990b2eb731abafaf744a19c995221b4d51b5f870540225b55c796851a2f295d4b2762814bd83142c2cc09ac29903d22bdeac7ae74cb34414d6c15e870052600e281493b430d9b6775b0cb3260844de84c1e8e0b08ff4b132484ad16da9d58f060a86eed50e2908d8c24c7d1f0fd5728b3859e076c26212fe43c26db85c9a7c9bc090c4af9865d28a6a5eeb367b08d7d81c178324c998b81351e4e8f0991ea447eb9d63fe096e989770338858e2339e50a1594fd12346d19b686047326a489efdb7a553966b413785afb67fe93316e445e1969401c0453f71862776312cefef2c645d1db88dcf0f503cd1544c1553f33935c17c7f5bc4e47a9c39628e654238dda6cced57bccad93157761b85b2dc76e82f720ff7cd9af7caf491442d1e949d4a38062c4b9e0d6016b218122abf3e7d11dd1a2167f017bad834e9d46e51c3aea6a3f529f58e494daf30f98b2d9dc5a9fff2114b935e952c3229ac47867a24f331b3e61e6e691166c8b6c769f5c083818d0acb2745a4b9692752bfffbfad4aae9953e8980cdbc6daad9134877b704c61a8d653a9d482be474e8cc0f5dd672ca1f0d8615c54092065ee2316d16ce29209b241d5266fe6e763f4251d8d9496e32ca47ce0412e499a3aacd83d9a30da96f6ec2c4083725dbb807cc282c7de2118f93a92c4975eca0e1773f5f8c9a76fd46efd5b6a452a1bf9d7ae4e9776d5f079841eea711af2e404abaa4df33e4f2451ca4deed5e506e3cf5cb4dbd55c16631cd7b6692621f51375a64a3ccb1b2a477e0aa03a0d1bf9f7fe3f6c12fcba5bc391dadea018e3b15c6e95a304751cbf5b1d0b09f1fbab51197b0226f3452b4c86ccef8e7ad604adbe534b995585925210cf276c6a223ed85400ad12004a1a89a8e5cdacea0d44d804f481f48ab8152582505e9802ae7bfdb08bc9ecfac3abe9f622e07cc0b3d7620af19cc4442ec5fd33344858771004f5a58629ab9b2c6238a53b2101ed0a93e0824b674fa7171aa5e3415aa48360cd07dfd17b0380cfc18f627eace1d2b9b92ad7846171666bcceac1c2cf1b81e4264090d65e2ddbe2c048b39a37a2cecce3bd36fd1f40d084f27d6dc6045485be9992ccb4715ede65666b6d7413eaf383402b3ccd675f0d75613be9595992e26b01c349ca3b018df11a6aa06a422009d1ef505bf247a3e1e76926e8de5c93d2232e335978d8931e45fc72be3478741b920c19051bc8c076bef6d35a282a3b46df40ab55560041781142b8ee8c0c61c12122512a127e92d77a2955b16d113bf5320c8e1e2834d724bd5ed38557412f14d687f138285379fcfe419b5ae068150f860115b297bf8a50a4ffdee9c0d91016aae92923fe0189573fdc08e1ee1dbe7742afac158e7de1d41eb979e7b11f5ed1ca560d3ca4a71ca539d048c94f156f1d0dd9a88603ecd60d7c751e63c7b22e4e4bb5ef878ee110c8d18ef01d36d61659bd07ac353c35f4eb9d0efb0b7abcc0c1dabf8b460e8ed143b57d2c2fffdb58a0c337a5dcc2401496621f00cb548f760ac920a5e8e2fd435d72840d0875cbff933a4a356b4896db47dd3c5904ee03059d3e9e445320f7eb3d96328e00e0653b822e2eac25afa62096c5a3d28c52fb7e4e8a5a7e2c017bc3bf90ec4cea8b5295450c6c5f66d4c02714ff1116d1cbf8c1da3bc05c3d9a0fc42614b7672a006fb02047d4fa73b8ad8dd502dd162ab2edf10a6d953231fe7917f719ca0f4fa6eb5d854b5a14873eb900ab1b6f62fb5d2817d9c5073f1be900eb620ea46ca1248ca497f56e2321403ec15facaa76e5cce455826d1131cc33f467c999e71ab81d31327975c7b2a6e5713a51060e0f9a92e52f50be06eb2e6f768b51e8bddd00d739a43d3b4a918f781dcc7599d79887dc8e47c7bb62101ce9c5ed4f50b4b2ce501c97054a2e31e2dcdb811c1e4147dc3a38d5caaedd755501b45c2d126d3a10e5d2b373f3c2927a5a2ba438a506c0055bfac4ed40571fa68e08ce4da3233808ddf525029c92266f30de1ae3f63cb445591b9e5281b261b5b2a22bda69ad2c1a502d4d54fbe60ac8eb5b060468309b2bd602f0464894f87e384b04e2de46c4de03e21d965713d1e0b211a5559ee921aa582b8ffaaccde846e9896f1f9ca30efdfce600bfd53f7b0f7a6f757be0cc93fd14cf26c73a92c2bc427449c438ac1e500650a2bd6c2c0dda13925a1cf3fe3f9f3ba5466c8f421a54e5b195215a695c7099e07f746d49510eecffe5d87d2316d099a52b63d732839de11d4ffa90ab055b5da085aa0a966a3565659b5da57098ff006fa0465c1fb00bf382e714564ece06c512d6bc6f216e74d5a47410db394a85c13b014147ca80905bc2f06be6555b15b508c03e72503b75c96a00d4b7949f1183931520954eaf0ed1e1cf0b2cc70d99c4b67a0fde5e1967244192dc155c98aafb44d90ae6f3e0393fc14403a08f70a730aebac7784f35f91206e8cb73ff238d3587288911eda5a289d86543e4cd13f7baf87448f88b63cdc3b3496f0f676e4d997ae2aaf8038593b3509ca9ed06553605811fe99a04201db4236deb22a698a29c68f36ca82770d8d14a7917458dd067472759a6daaccbb9f1ad3aeddb588a165ba0a665b8a97eebe0b69fdde3fc2ad1853344016712df630aa074b9bd4e81d2d9e4b21bc8b9d62aef165fc6005e14f900e388fa7d7c2c8c7624f9c5ad769addeecb1cbd38e109b526c346ef046a6dd574769948e71a1ffcc7fb94ed3ac398ed1a7eb347160467dd095f2ba66da4306400b5e49cfa9f96ceaf2901da946f32fccd191442045b8111fe95d6dfc098bdbe38ab3ff756cd0393df1f57bdf87b665beb2b9f81b719fa4299726d911ac3eb14b22b3304d1650a1e340ea46d7b3296b6d8870d355f77f0654b04ceb23c9e0ef75cac20e430cc3f025134ee9c7244a43d44e38aa604f48e3011f98c33a32a99c61000db28c84d82ab3f9d4dbcf4dde02ec4a8ab6b837451e309db76da39702db804873cfa019b59f30cf8306920744ea87bd99f5ea08499d7ef15959bb592a13ff61f873a23757a46f7c635f9ac8304d7a8f0a9c8a8f8b5929fa4756e3dba981492f6ac19b61774fd4bc4a2405871492f6122faad0ba8e1b103591288387ab481a0ea3832d39de102760058c406acbd9b65df88cb2a3b0f5599c4524978479e880de612271b369cc66ed1ae99d80b132b8054ccbcf44eb09451c6313dc524700071bba7e048ac4314444946c2d74993102559eb3573713c6d63c42f65a8bb57dd873ea7e0bfc1e1287c45310ce042c162999c84fa00989beb2691054464d2fc5c96158b6ad1b59a998b71b8b5adef26ad588d6d5bf206962864c217bec2c2a95a65fbad5781ddec39af36c088ba19c7a01c6cd8efd59d34c43cd6aba668e44f7c6ae42dcf2c3b01b6b8cf25bb4e87bfed6462e66ca256b136aa84276bca9de0120a3145312543568282582e447872081219549813ce1095b08c7462aca0fac286437c981e8c8c5964941a22876046c5c3a7802cd8779da1ad84bdd8a31d81c006ce11ed5bfa289fa1ed56492e01247e0ea9334010f676586c5a6a9d533ad6b21a42856c3b74cbbae980b3444184f21ddf42dec291a28738dd8bfc925b9b6baa3972140d4b2df43f205fc52301f3c43187e1d01472b31ff422d9d580e996a3f2a9bc26345d7f47a9b62b1bd7d5e756d50baac3dd9f73c7293da33682c31b03ba972204ca04d0a11065084770601c300ab7f6c403ebf0dae73d9c69e7b64affdd2a1f0c287a423942da89cb98d3565970723f9d6f695a04b5eede32d2d585c4442a25f078428d4e7540af9304165adc2f547998ecd0b510ae49f34720808829782894c671fd8f24e8bdaccc8ef93b6be9b67b37c5955bfd050e1e65e42903d3560c3423fbe9ee23498611633cd7d281d29f67a0be8a036c84e4113bc150bb9872373f83499e0808140c5ce127a14cfb40226ec24ea0168c6abcd7409df4432fd9ea44cce797c2fb89e83e985f4b3a62e0914ae362e39b884dee808931a080413a4c3d8a055b7c9f4e461b5875c0ba507fc2e0eca8ad78e7ca550e510a2deb5c4b3e6d2d963ba08a49d8fe1b3ba07281ddc234f46e5050a6c09dadfeb1283a19f02c81a042f606ede252e0be0a49f33883d269782f5faad65a9cd1509dd6aea5321c2c1a2cf300a4da6ddafe0f50bb62411eab1e49800fa3494838b30578d6926911e64802ce3756dc5b0607008e858383fc02dc81444fee824e92571550a544f92bfa860dc7fbcf96f0ed0d7ba011e788ab6e0d1f7f839d3f2926af360d8fd9e276e7d834666601243fbb098d22042e8fbf3e0a02355a106705d5343db13be5f040ec3c892cc7e3b6667f904b32a485b7a6699bc97c2e6be8341243f0697c32df14fd060a1ae7d3f28cd129d985fdaaaf0ecb972385c9251d05697d4a95434f2e84c933c35d672001fd2066023b5040ed1fdedcca6801922b301f7b2f577eaad6b00c3b778a96ab85112b29ce2b6d37a919d263060b49cbe21523f8e546fa0bf517b84bbb6a976e2123d5544f94e99b0400f86c6670970896445d00b966494a7a58b62027d0172b8ce0760f3dffc30e1bb133fb017094b16ed978422929f97b604b5df52a721909d4b26ea737a870efa1f2ecee0fe994e8b5275d8d634085c5892c22912ac64be5237b40f00a09b13f5698dd6eece0d9f89cb5d70c08bc6775569a0c74a999640caacd892944dbcb3336e8941b01a1175f57bf27d0e872ddb94bc6699c7b8b9e603ccd401c11ce7e0f350c3d38bca00e3bf5e0842057615c1e879cac89f5a73f2d2faef41ca599d2387c56c913a73435b643c90624d2b744eef9314a3add7b85a61d8022b0a6ce8164cb3d481b847252ee820fe17fbdfbcbb9994852f844d8ee5615723c9393e4a596d858347afe0dfd9832e5f0a80ec8f6ca61bf6841bb60e7ca7cadb057bf41c8b8eb4d7fe16008ae05186f5e14a6075f4e6df9a1875f20de209cc33bdb85a48b00684922ad2107076981807f010abc063de72f97ad500348c0176807820bcc242702f0c22bc000e8c558629bd037005b5af8de32d34c864bafeb845a5bbb621bfc286f587500c55c10fe3ae4a4a878eba0b06528e97fd75ace677ac0c0815b6e7a2baf21d1457e3edd35ee17842e5766e24ed9d268c51b88614f71b5540442f717fd35a002d3abe784f2012c912196e16514548aba933c22eb130aba5ee2955c387856f2ca0dea65fd01e6d0cf1203bb6ec8637be758bb44d7b75a31b6d66ad7c020ee30f4415ca37e0e05197b2dd0f658576be0ec21646b3e13ac1d515e000877eb876a8f34f51c35e94c20b4da188e5e2570c890eaeca4835615b0386057b4fed12d501e211257da9545b68d1bc782612a14cc1b62af5e469c028b6dfed1299ccfa9c7f0467db05a74772d6addbfa430ad56793eaf7ac4e6a6cbba1c7e4d757ae8ae0a24c933b57d5e05cea15c682eddd60187ddc207ce588497c1d948000f84d206e1d1cf3504c4b9cd7a538f573b17a84db640e95765e385a7bb082cb93c92957cc68fe944cc6826d4da81aaeaebb68831af4347b4c859b3a4f6192937de8ab240d33494b735382ccfdc4c6fc11152e07970f98edf0c8394be5ea318cef0eec4f8142573643ad5fdeba63dd0fbf0340119567bad5f180998b633623630385abd1010c5e4c5767cd07c0debfa8a168a9fab9b1719427990737d0acaa5a56fbb11c28551d43e7b18069911ea55dbe525f75660ba16cd62ab645fcf4bd873fd3c4ad3c3981729a22ef371a7ed9dc5d78ea2cad42c00ee198d79195505a5fd58013dfdcbec3d395f9d400589cdc53ac38c1ce0fae2d5bf93a906d494b82846239afa937693e9cc6be2e35323e0e45d35c1bbb3dfaf12730baf0764cfb15209244ba567e92f161f8a3096eaaf1211460870b80a8fe2d5c1387689e696a0e040a0bb4245cac088676a7a7b963b34a4d146e768bd7e40a6e840ed651769dfe32f61e0a518c34fd3ae75e1223f2d207ac169c82d1c376e18ef8cd688a38e242167ee26f2aae89eec9180e321204eba027ec4fef032f65a527460119ef46b4b0743a6b3515870a46166222835558b0dded55c5c8a0f9319d5b469577162883e69bf0cc5e36df91adfebd6fcad2e36ee8bd7fe3c605e2fa18a14cec503749b8b045521c4e9b1649df291d2cd25c40a17a93a13ca5ae299e6923be454b36a9bfc3819b1952a9bec20c24509c6640b0924d35e91ec8b824feb84a57920f57469a2e4f42d959bf16d22919109a6827cb46a78ff64d27902103e78543639e3a7b0f0899f26dc8cd3e1480ad58a2953ee561733fe1d06d102ce8c90479bdce2d3224c1b689479b76d83fd33bfdfc36e39dc7214b50759b4886030348bfbca8b130b05355dbb3fd375d7f7729192a72db4bdc207e8a664ff753f8e2b7768b0ff67957bc14cff790a566361cadc3367fbdbd08dd1c5e785a3692c3bf24a4778290a8522302978970e5480c690cd3db2e75bac7a712eaaf9ccc6c61d05d9877198d4a4a33f52e44294b349c1351f3fda863243492a9f3e9dc187a1d42c9196ca9ffa15af12234c4d254d0678e4de910afdd4e547fe4103afe7c6750d6cf0a37093ffb3fc25dc01ee955d57cf3af69f02c0215df68b2d2c1d318125a735d803038385373eb742e50591fc800b9a799731e468c8654a7dbf43ce86684f7c64c8939d7f4b563f9cede26fbbdcc66aacdecf603ceddafd6381331fa0ecfaa1440d500aea27805ebcb4133a74965752edf2d63d031a45c07771566c249f30391cc0663bb433920a18aa0e7ea63890f39512b2147b8c98aff7990e8bb9d8a24848507121c52875705036404aabff60b65e4d65c22725bdcfd97091293eef8324698e3f261e6894712daa53c7d49d8fec450d7c41d43bbff7ef6e2567411ccb9701d8fcd004dcb8f039d5ff923a03e3dfdb003e1bda22a866c99cf4e280b16eb6c0eaa95ce738356130de58e414da7710a6ca03a90023ce9c1d359720265f2c647248d749448ad8ab758caf49f11f2bbf5b4edcf6ab5dc00d4c2fde080e45981ff874435ba35a9139e986179848698b481a38f97aea635e5da1a1b082f17fd68917187d39df9e920322ba535cd1d01603606fab67594fc4d3565636f0fe020cfe8266c3a05cb0b2e011f2568d933a027739c86232423a39559489aee0d2f660da9ed0ef2223b1a5d5ba0186d7a6b630b147e0c6d21a8d65cf0731f8e9a8bc328121f7a96a60660ff27eb7fba40de49318418921725f1c37b0b1208689ae4f7f1c97e9b844d2c2f5684efc8722352469621aff339946e0235c7b8c619619b4bf477e1f7e5af4751027160be6706e30a573e52cfca2db45e007f46e3603f862513dfc253cfed582ebf86c04783a8abce33dc66906c6ec789c13ed3f3e61a6403edafe6b439a990a94712a8da862ea18909309f1e15da8b8812d95fde3b4595f624589fc045d309f287b5a5f22d8c50df6b7c9d69355a9dc9528f1dca2be79b24ace35632d002c45a672f295a85926aa9abaf421f6c9dc02418e68da3dd6303f6dddaee5068f014720a9333690e967c52541577ed438df38f8840c54e6044c7dab9409e271a4e0971f41d769a6855690171940aa8e630919007ca7d1b531ba2a28e73c8711ba2a16ec960591b2735a1df2ec8a5c4e559efeb618119f1949763f8d3ad5d3c1a13c2cc76c65b1247550fc56a98004c10dc4aa26c71820d1a268b7f5f1a8c9c28648130b77a340b8408bae9ebe062d14594a7af3a2b66135c144c1958109833bb5c082b349a0f88153a60f496253607689dff9fb5d0751a3990cc9ee5369a09cf11e2e6ef4f2f4fbc485c10d2b599959946722296741ec315d893d2ba0a469086ed0b704802be95535b4be6784b3033665f6d8ac4708d8bebb1499f56343eb4c018fed659f153996de7c5608778acc0e6dcae102b5109e4af790ca528c11ad5f22563cdff474eb3d205a968c5ae89a1ab5185c1e9a83d9bd6518f64f5f5c231188835a8076a9848d6bc6a9c3239432a4b3dfcb83d109dd851e4966d5c11ce0ed56579080ad984349f5c21fbacf54a533029020a13abfcde1e3cd4c08cc4aad4b7f0e8b70f2d26d9cf0f45097ed96d749aa52ba5f269de075f58ba5323d48374bfc4a69aeae59e20f9da4e0fea007366e811d44f89c0ff941915304ec2da0fd40e087b0b010c5e7fb3a1b15869328831e09b146f928bf84ca0e723913e65180268fa183a01a967211f516f44cd23e78fbf11886f6bd31518cacad4ea292b9baae82157a7f07a1f9c921b0124d6a1b84e0f4e94340e22ebb9540445c2242c26f46e121c44ca739770c21f0d79bfc1f0a21b08ac1a62997329140b9ac0ee2e4f0abd1841097c0e478cbbcd7d87e3692e3bddda51c6fe46172bccb2b49c988f4cacc467761e9bda6d8841020798852d4cb487afa90a66044843633f42aeda7c4634748263a826f7e6c716bebbc0282bb9b0a2bb64586510255f5610812b553560e9bff9216065f69ff98b329bfb08260a446c0f0392df4a000097c626b9704fd374798b816790d1aa980a916b2a0f5c81b4e84b1439685481d19b3aa951affd2a10164082260d4abc85690ffd88a372a6864b50e43046d78ec4543cca8236690f8ffc224531822318319fc74f1b5283e4a06e1f597b0e7d2f88ceb3edc721516626e346f0467898830e92e4e65f5930538fcdf08fd902f379e5586b39c844e126d34f96fa766ee72be3022bfc7dc4fe19a18267be10bd41cdd968144dfe318b7df421e5b9e790cc743530fc33ccf10553a9135ee8940f3de66ebe6be97cd9580f3292cd007ca8adc456ac9227114e20210efaf0b0d75381f7a27ac2d1229235b91def09acb551059a44f015b1ace6bed269e75b861084ba3828fcd30e61a1aad05388251d48a61e64e14a5ff68eba8632dbdd149123b8987169fa3c50e95b1b8a1e6d4cd79e591f51f4b595b6ee7f38a0601caedf274b853c2783a1e2def7525a03752d44f82e6aceb53d7f158256ab5ad1d4fce2ad6283d4d4a5171df4a09730ac5c6d5ed026b86dcb5bd25f8829f652155d813146d7b4abfc744d11c225d14d2a31220d3978fd5ef2175f1e6aacd827117c312eb12319bf905c0741cce21d6e438f6af9fe1d9e7236d1b317677427500135084c6ab4905e7097c006553ec031101e762eceab3cf011359045ec35ea43693a8dddcbc72052f1356fe819b051be42ff1f1de48bd39cff5dff63e04898dfb6aeb5750d93a9c5573e1e292c707115754b38e758787066dafe481630eca4e256bbe328f802c2d050270a8c69a6c96e9a14386c8d7936053cb37649adbec1706ba86014770e8a45ebfcead2b85174729a8e9f7eb76b56debe6d39075c6ef37aaa4363e8bfd7bb764f7581de99500301b92f67c5920d396762ad99c8b3c623149741e176c7165cf137f84131f57c9c08360b39e386eaf939c1610ec72b1d514c26fcfe0d4963f37da06af3dc152f6d2890b4abbfb34dc3d651d6188856fc9a8113890b01f3deda67045168e1f1dcc01b5fba8fb95df7f7d6c75698647deb20252d6a6ae7dd6065234d826682abc64f8da11c2c73cda8d4ed89a8b86f916417dc94ba2f7bd2a7a8e9100c8411bd2197dfccf0a5603e6506ce762e817fad0430511e5a13967482a3ffbf92c60d826aac19ced544d22d1288d07d9ea7d460ff35aa2ea82a98e79a9e2bab0c28604167f1c1878fe4b4ecf3bc36956798e676767b78fb3b515a75a34a714377f983100764b61358ceb4152961443ca4d2d334abdbf553550eb92137924679c852f16815af77b2015ba0817b9a98ddf3ba1d11879dc87b09ad52c8eaf6719ee3e654c77e924eb1a8b8369e58545b46c5d8fb2f30be78f4aa6424230e7970b50e303819bc7762a96d9a79f354ff7172d117fd0acd6bfd41377f5dcaa4a4e0dd397d8765b159f65492070c3657527d8e7ac95cdde897d54f34eac746bccaaf12b41f0c3254ed1f11a3b8fc2fa55d3e0a82e84cff29b5f3ff828772d1e2d0009c65225fc98517051c4b655aad449951a6d09e41f305190bf952a5ca77a11053bd161b0ead1330ae6d7941a8e07667d5a9311dd65879dc7a2857d6afad4b359a66943fab6de1b2e5651512a0a20cffc7ebcce74d7f210582d414570c8dd5ed4671e0088280fbe57f599cf81d4fe7edaaa9bc68d83f8946afe4d72c5bf4bbe105e0e576ba343c0c46ed69c37b6249e5730d8601fabc689b939f6e9111e782143dd390bbc369ca31f33de4e6bbddeaf88fb45de23c181f3639a35d7687792605f888025561aa7022d7f75ac4f46151654d1d90f902cfeab15ba5e58195b0c5a73b24931962ef7d281dacccb2ddb9b51b93461c5e273f6cbb926b5ff32720c67b3146e9e38a173660b798edc4c982f3c5ef0cff9f9d26bfc40c436ec346f1f728cc50e3ca14da161ef0d187f4386a308ae7e0dddc5d844dd73df681dd80949beac709d5780a6048bac8a36a0f008b590677a2a6c6a1626d30b4d074872d316ebab519bb9ac070bae0a8b03d9acfd5a1a83192e8562fc099638fa5476ec4e0877dd1b82d59065e97389b324b9d25fcef07eb24a630c8e295412caea10b9be9dfe867d9ae8857486970f7ff2e57faf7fca378fbef8a9dffb11f7695a9abb392e810104e39a22c239411d1fd4a05f7b49fac2117aa46247348a90c21e11289090921db95ea5234ba3ea04a43efcae44efe77016d39fe165ccf12a05b32c9e266fae82c0488cfb8eb68b59da389fda6593c92104d7726ac7c922c42dd562d0173e4eeac669432c165077823f0a8f017f9a07a712b4722873538d5985170bd6bed00281060ccec2aa9b306bcacb79e19851954b7ac143aa05d18f46d696492c46ed831fd14263c114ed5c8c78f3170b1c9e0ec46083afa31a3976d4e1720892927f21e28bac3a562a87d8460d6dad353984ec8148a28e0e018c107e4ff305026f312cc49dd04b4cf07891da4abf302175c6f4da4d407573babfbd286bbd215ae9f249fc533016d5823f1f7ca170113180534d4a0a75df0026a4208055c7dff68365e640386f4a7259dc9b52b64012268ef86018d20a16cedcf7fc2147ea8a61c818b65d8be736f9a33cffb6f4298c3ba464825364a771307f0e2245e7801941803c53406022d16d3e18ba5ec9c3c5ede66789500616c13e36f9e5e7e6535b6bc3e0fb6128b9c06c14b1871b6d270071a4869ce23b4783766dc029a976dc5e05879f7302b8ce1ca4d856836b92b479ff7ceed694cac98cf6da1424eec724cc0ca96a758c1fd69a7367da0bb5773150f11948b13152b162ab30ced998809be15db5327d7609c217d8506c7a2a9d5c7ec6ad8006da39e3c306146c814a2da24e81369f58a603fc2c81e9f940b1ab89ed40d431dd59221b69e860347044a18660d9ee24a4dba4582bf79368d883b0f208026e6f5ba5317eb5db45e5472a7793f568655597509ce5bd2f0b371f39a77c737774ee53933d32f6375001b010ee97628612073c7d503fba3249c7c892130785493b5b9ea1b7a13817b281e978c289df8507d82bb2e44dc798f15a91e5563d5f28115d590f8ea5d5f368d212c8f9661cc5ee57b68cb01149db4798b0065b2a0aa02222c7d3fb0b880e82f5d3819b614721cf56b335219c5e0f5994c9d3d9c5912f721aee3b184e4732715f71a2cb23dad766c571241e53d55e0af52fb1916fd5fa699b418faff598d3619583413a1e32556525c6bfc403136650f6ef87ed2c1c4de256e14132fb3b1e498a0cef87e2357e5c7145ec605d7dad4fa9723d174f9cc76412b1fa269de98042469845b6b2105cb64370da82a18e668bc4b182ae79053dfc8e8533d68a2026221e9ddc285c826fb55763d06e107f4b65f61f8bd7a6ed68e22970280d866ecfb8d3e3c6ab6c21f7f2a46e71b4bd1ad10e49d26ea8d221065cd3d523c00f8c09a6053ddd3b9bfe3ce5365c7a36ee2320d2b892dc33f72abd27436f23bd165c822a080cbc4811de8af64cedb9b4e2cad96a6ce9e9f4fce5432142cde43944c477856635a842977984529b6d43e575499a98dd7959cd2ac0cce6fce23a671b2b154833937b6381549b21f655f3890aba2739ef4bb2859ac5534b46d46ceeca3f0c5e1c949d834edf2b2e4a4e9ccb1d252ae3a02cc434f46adffe0f5ebd407aac94d0828a3974e0e127881a3a30a1d928a31978c47c8d7531edf7993982d0940950681bfd77bec4099d082a8ee80b107f7309bbc81f9d6954f147db17724d909f38cd8a34c9864e978e58eb6067c2680e61ee5a59d09f23c4990053173d8e7aa40d45175db6fb9010054a34e5329040a05ad68acd335610c611f812f6e0ed2c7c897ddfcf12734eee3cc31fab48071c08c45be4cb2fe1b4ace30e65afd0fbe76369fd951e0c242ff7416e2cc6b46bbe59a4ea9551fb01af8d4bc0303ec031348b49f77fd36d1444055d4eee3a778c983629543f1fad81c1958be999b160ca7a62220bce9c233963120cd05e478c9b1deb3a250aca8535e4f8ae3874b2415f4f9526916bae0296a46fab037ddfccb730ac923ce85231d051c9f8f64a37e43937806b68097f30cd22bda4e8935336023b670c4a508a61c38676c747053109ae53579894a9e28b456a817ed45e2e2a0a2ef6b1455a4c720315daa5378116de065c3ea456353ea69443921ad20e54fba92200b540977bca44d26cb0444a6d0fab973c2ef8b98694a09b1c44e7cd047f3c4da7e7a03846177a3773680fc63bba43f21d34b1a44ce8551f15cefab13af9e95dffde6e36f6e8e84e49e2b403706de5fa86e68a8a0d38c9a8063833c4b94464026d6fa84a857e439b93cd0e6a1b74014ce914a854549e4ded46c29b1b9ef4d92da3e6470a4a0496efc925734f34407066b777528258797174e294ec2857b1647988ec61840976dbf4da9fa63196eaff0b9bdf2ac9446e3518518346e63a96fba3360d769be52b6b8d572982b36e7a25a431cea32ba86d99138450c65f4922b7014b23f13db201ae224c8f06aba50f9712031445ea7240b6181df22b6e6587c713bbca22f8dc394329548ca6b17030a623abdde8955551ebb23e0712430fdfcbd3ae92af2f81fa104374a60cb7c4d3c50c026dfd3fcce877200a53dc0180a229a62b2d25d7c0e8ffc9eaf60db6fa16dd10525b6b5e33b681976dd9413cef4d564ee4c04417b5ad53fefc850eecd3a8dacc9bce1d22f146740e8c1d7472d14bbba3658e25802a2e8376fa4419e4f4d62d0f97562d5fbddaa1d3ad7ee1939039ee1fe7b22a2d750476284ae4d3da2d2337e40c77a9ff4783749f14a3f450475906b164037a6bf4409c4a3997d6323cba787fc2328f1909ae3266864c7be592d23a214234e23fc02362a25bc195ebaca45983df7022da912b1ca747a0c9d29701b0714b0a8545b39c1891a9cf1f4b988e86daed65a69886f146e6a9cee33674ae41634e3e20d119639dc965eb81806d3d0d68c3d5bc4720da27290ea35d41a513c4a6e0ae074dabc0f397d497f219571cf9f15c10bac82f14a9c45fdb8ae35c533b5f853460e9658bf40e99a81b38fd8318375ee9b6e546f550a2006e98b775725dcf1a299f10ab32ba213e2fd6b69f6c510b63b5b9622dd0eaa07b12494effd62e6b2a4a593bbdee706b2b53bd16ba2a1196879fa78798767eabb4ceae0b9d52a6690d74448abcb50a1f43f950815473015975729b60a487b11c02203f4889eb6bc3a48643bccccb9840aea2ab0e1efd70aec4528fbd6f2e852164a944980565693845bc04a0de724c2ff4a7ee03bb081f991070c9fdb0d506e1084a231013e32d06e1198d32c8c8ec448d8b81b4b151304179033aa66aa6c83d447622e9208ee6bbcac8cceb1b20ae522457a7fa9179511059ea396342437d2feacc51c7c4ec199ccff69bc0c0434b6555d44f75eef2170dc9972d68d7939c0e637bfb41f11c5d2384cac426827d10b3b9e97450b7261075e011f881347e5114cb13997ecfc60084ee2168de1dcfea59c9897cfe2fc02c9e347ded97485fee27c2dba843e6f4ec57e337b49f677cf3d1e9d4c42848e4a4d179ad0c1bdf422ceb811dcff90284b81cd7784d424ffc7f6af10f8923e9990016315b3fb1f50b126c28a2142ac98742a4739bc032fa0858a37fba741f20be0cfd3b19465e178992e11c119d8d3f406566147fd2741d91bf68b97478a674e19943510f5d4c0b081bab4927e927819196b1043792a3c03499228f8140a1d6439c026a8638328783ca9fa18e512a0bbf1830e887c7afe55b1cd8be895e1224a018320a384bf5eb0253564f427e9b38f25a94000f6ce6b9c1cc389e6347ff1c2a94a697a6c343776303ba4c4ff43d923dd454d8f2a05b715e818241ce46060d1152ffa35c2f09eb38635417f97ff9d106a092418b959905995ad31d303f6699460c79fa854bd6e37a186dfe2f8c39cc727833275c23eae2f2aabb903d1488597f143c13e6603b2f7448cfc28746fe02d746988a80fce8e7cb9b51f23180183eccd1933c3e3586e832821b410f4a9521dafbb40cfa6cf078dc3e65c71075281744fb2e6b6e01c5bca1c8cd11ae6b41d76ab82233c6ae6caf190ffce5bf557eaad523c1758f10a6137322e3bf8921140ff1c44bc2f46d5fccf4cee39f4de3a854ad50d7f3897aade66daff0d8b15de0d592b64a889d4c1323c79d8d138d0b805463450ee135cef3a1aa188afd7e90af9a9066d8e3088b1f768097c10f1fb8013594dc4717484f8685d25bcca62e1fad73d67956d566657b2f2ad3309ba57ce65a06a7aa98d8eba7dab0fdf96c947a48161066268cbadb9e1f1912044a62e872e5b294bf35a9143cca01ea3f14c436ee15ac43bed1bc0d072b9c45da9f57c16f89b24851427102040059019a1a146054968f867c276276d668b3c752d54c221e01263f21044f5f7027ed28456364200785b0258c0e1dd9ce1c635a80078ae2f62fd0b0f1dc5de404df74bf12ce3ff1d10a8f9332b62a1017b6e8ef9e2cb49a1b8aeed420a1d3422c370b03de8feeac3f0f4ad9f5ea45875f95178fc6086c2be660178a3e23ea3e6ff10927f0776b88e50e3a72e1027a9471b6904f8867d345941c7bb4b1816e9573258158e4ba392ead97e3eec428f6fdddc6ed0d9ee62b15398e8def8960e6d0d5f0e2c175894f7905cc8b200ff4ca0147c1cf85201ffcc97df085db2e9565d89cbc69ab354190cd22b7713a5603dabb9b1447335eaffbcf645960c66c46086e266554294108c257171b91537e751da80ba560219314c3f55fc6d05198bc021c0b3d2b84f3042cf9ba3585484acf53b9b6853876fd4b6de9813b8bcc8156f68db06b665e011ca3590f47e18ef1ca5980b1cbe8b6ab7fbf1f57fc9041e46930dcfc28dc8bd342fc9af947876774d7d2ddcf304a829f4632108745209f32829dfc221b13e8b4719bba50b5058ca1964f2b56a2036fc298ed426fb048285c98c2d8cf6f8f36adc3dfc4c31c6512553cb6a9c58247fc7834a48f2e402ecac58def374108b92879b77521de26076be56dd2f30559eb40694271d68716e921b07b680eb0d3d280e32cf978e41f24ed78c0f7e98f58fed6a8e60bf5e15d227ae1592ae346ca659052021080ac39199a67eec84233ff310d0ae0e9a7848552df9e3fd46a7d3f72c999a8a6019c1f3da9f2d1679a97d16706df92d547062a9974f50d897f2446148acb54b4f3ba2a07da7bcdc68329462823330d7e06b392494394f91dd53735cd1de3643f6306c8de2af3cec869d97facd3578bef4aed2da6b9633c632bdf50c1a24b325147fe29140cc719eb2018941ea3ae7f7bf681745261b2c0a3a9cf63769e1922df6a50b7cd7b97de35a3db74d469313ce4fbb1d48419c2231fdc7ca108d454bc82b58388fe75cd2e41b43b9e1067a3e71b6a2684dfc333aad0d74242d3b41eeaf3def0545b43d3514bb9e373545b405298883cd333b50b5a5a22835d01c5416424cb49663e8bd176bb5c4705e1127348ae67a66fd8ced114cf86e73198b9a8926cbd59d88577f3a0f926e9c6accafe1920660d683686185b70954b85108435fb13d5724b7ffa677129293a4ff6cca71bcf23115424ed0ac267bc9dd3b940e82ab41d68279db2df74a4a5e22e99bccf2c2f464c1a611f0041192321490b9b3c0fd7ba79bc58de2b35cb417247aaace4f342ffae5dc237500a5ed3eb69e1e6ac4748dcb2e1139ebe5612c011b7dc4fa639a12d66c309ce7c194cf489a3d9e4deab569d9fd347ee47c785ccd71cbd1f7f27671834e3acf96d46c00a786632af2258ebf1339359ca428a1c8b5d9e3d65e26f9ef70e787a9a5109adba7f3aeb27c79bf906341c34f50255e8bd0154c3a9b8ad1190f17ccd8ba68bfcb432189b080534e5768254891d97c40e0b4cb3d125283c63c368833c08da8925c7b081e562b6ee4c805fbb3f58f718d4fe75a5d300c6335a88404527783c459e42e1e2bf3da19f5e1e4bb0d06c6ed826db31f7e99d5dcd052513da566f15037284204ac6a3557b5817a4c143c3d35ee92106973ce6ca00efc0c38b835660920869e04e85b4b326f86acefb8254dec262fc93d0beefe919783b83c2e9a0b12da2ca3caaeb860957b0405a5bb6b4d3356a6064275f863548995f1110bf23ecd25984e3568aea7572ba476599f27d60713131a9a0e70dc3a5a5ba5f56f42db739039947a7e398ddcf91a5c39985a4a02cdfacbaae106c126c790babb2b09922732ec4d47d5ccd5d566ff8642d32a8379f275c2ec25d8eb5e0f2ec0d80c4bf53bc3fdd41066a7f0438f375f84c299c0a051a85d1c050a1ed3bc6dde315f5eb20061a8558810d3213b8e004ca7f8332e322ebde4f7fbd7f2dd5107f3f0c597e231fa50c8236b23bc6e902d0e711978e13cf20371e9bbf72b14d6e6145fa08c076c741f80387b2179c0d6d8f8785d14eefdfa7ef41ce864fd898055411b7fb8bf7a67a5ca2a7b3c02c29e61d2556eebdc69d42622123b3ce78ca952a2deeab6776c230f7cff2cef89e91c791479073eda87c0dadc68fc8947a24c535aba9c6053ab1fbfdd503330176354eb3be1b7a7a3f2cbd007a7a8292d15c2e7760325449d64507b4f41ffcfa2de31d40d7d0eba1419407069001d548a6e73bb8bece7c88a508b2a1ae02cb1d4032a37e902fb56168e841550cbc0b9fef9ea3c7186c84bde4da69710e482aa3c157ae6a5b4f2708f38e51b91a55827f5c5b01262f84a42ecbc5d5a3060c1f9c457f4d46390151832642d0ddaf3bb06485f1b5c95dab7b54501d0ceb6bfac441d939f8b34a86698995ae137b70bdad4428fea98dad15339b26bff97f6e8827d4bd583ca67e0f3c1b3e1d69dbec2d2ed46860ee2c252981956753523d45d4ee9509270a501d874cb24eef76e1beccf63b6a0ba0472ccc9215782a33289c092fc1fa41ed34df0c5e580aa74e6c2b50bcec6d787ff2d074c15f9e82411fa70f5fe5308fbfea3b0f485051fc99a29d0caba6fb3744f680b6fb82f1b645db7b5641c0aa8b4f5e3c1bd926229c18c69439e40cbc67e77369279ebac52174ea6d903b11d20698a32aace5b20a8d0bddae4750b3cce959eb2e67290423c5a1a74858c60177e5e33565c18c616ccfc0219315da6d1882c4a56cb6172c60f8bb0f0c086661e34701504aed3d7d6a5a81e6156e482c3f74cbde1156da3283cc3270ef9202fdd6e438e1fe9f35c611163efa1c703247802c5de878bec456fb27f81f71e6a23c54412cc6ee053b94f75918cc5dea341abc15da895082d8ee38f5e0029d0ad074a8e7c0d3845b8f594724266679c3cecfdc5a613872f16ec4b691ca51143ca10004fe85404815f469e566f89a83fa59212526d7b9feb62b45c898419e78232067b2776262e3225895877b1f9e189160fcdfb4837abc0df56238bb7f55c41ae34df1816368b784aa6d38bd470121389198ad0dc884da9278c10740635ab62bb638a8a539859f3ec874b7a262e6e8cfbe142aecd25937a3dd802497662e197ae9747ebafc72624c9c530a16bfc933d4f0b5f2e3ba163f9f36356728181c8ab2138b955eb01c88bdd1322daedf4141f307e186d0f05983143c178b8687306354069caf1d937b6c8086c440523e5a12a03b01a944110b89161402b73feddc5e7004ff7ce492ab87c2d5d24f4bc163e201df4773e2ae695c392d5dcdce6dc57902d217bc542645ba85e284d26c746c6cbacaa4415b71626740346df3d3712a8f111069877727f720deee0361da5ceeb1c0ea6e8284a579298ba75d1b985207b2d1879b3ed083ecb4e8b0b08e5e74c14310fb7e2b4ff75069833b5619361eed5ab45031dc27bd7987e412dbb7b39917f7d87c0af904dd076db1f88091211dd0b62210ae287b101971f71019e5898a925142e303dba0cd7a669d42a266c0f29c88e82eab9591c2294001e86c92378007b643d416ee108dfeafa8b57d76e68a2746c853712efb65ac315f8086fc97a420e372d5a001638b64bd2b44b383f5f21999b74e5e8c831526c6f8a40a6628891973553534cfb4d18b6bf2f41fa009e8a2fbd24e2d1ee0eb0b9cc1bbded316ea369609afe61aae588b40f4e79db8325de89743f97199f2a0687e639be24c5787a4848104c1649975e6eb2feb00b03061d811d87f5dd0be4da9b1be0b656efb7e9b15fdd43407cd4aff560062a2631b6a61a6bd787f453ae31827a1597238a2e804fba7dcf0fda9939f8f9f631ef53a189ca3063188794261ab61cc8d6ba57a61672c1f45cdd755e4ac2a8a1c3e84ef04756eb3b3e84f44722d14db131a6e54fa87f3be1b5a6fc1d43c5792272e4fbc30550d27873eabaf6d3d6db052e14431908541df7d99fae59b320b8ac71781f31162f15baa6e539a0a1af52704b030143e070bb68085055038d3d9dd62ae5941a52eedb34cc846666605ac6aa0fb74ab860176bae5ac08f2262af9fd0fe7afb276797f9559df36ecbd6463a3cbe52ab7e245d68ba0716e6f843a03b6041a0ca2d9fba15867864ff4c187f89d16c4296a8d736833c44be46f2eaf3d82544ccd9f8e7ef4daad51074dcb189e41f495e4021d9cfae3a67ea1a147f185a6d23bce5df827b1a01527bb7e1073cb5be2df0bc579fb1b53407a80fbba9ee25e18f76c3435b7ff0c800f00ddab191d38a61cbeafc9d0cb540b0098bde69771d177d787bae3abda7f50ecbe55f7ffba9dbfcec6530e224f7bfb2fa7b0306ead5f47ce4818548740d2b4e6a2ad84ec0d70617d09cd20d6d6cd6ac061bcc379dd64182604fa15db5da82ac77c81c52698eeedf52fcec0ad171f4e9ce442326a2987cdf712182e6e6d31b02d5edb25650cd3e43c374b6b939403315d3cd25b74abed79a33fa26f0bd76571c0aacb2da87628a53062f8ae319654a3acd1cf9fca1a887200deaa987021d39f95d4755cdca992bef28244b7f68b2cefda30281ec6cd4ed6c4ad84874dfec2e74e23684dc70076b2f9400c628ad95c1530dc32f23165df90ae66b25403efad45a8aef83eb58b656e57082790a31f35b54539b6bc13e196d52da139ac7e3dc6f375812e550a78a8c3cc03b58deb4e0e1ead5e53e613d6c3e25d331f38786973115f03533d3248a724b79e04b5a7249416abdf5b02de58054fc4cf8251536acf7f685c08458815c15e80e87420f727da0237157dda937791ee37dbf7abf9f7cb5fdf3410f05756f722db6fd2f3a091cefea7051e32fd76f677952f28f76fbb2b237dcc84671f02539e115fc60c295c9959dc3e0b14f3f6513686060de18f5ae2b37917cf3ce27e273a78849e53e59450573dc6fe82606fe16d4416373e7fc8738353fa3af662f6ee42dcf578d225e61349fe66daed2494b58ef36d8f4805b8732022e512e88b55635e21e5c2ff4feb6459b98a8cffc98605179c5194b89480881c9c002aa0fe94c8cbc2861c6b904e1df9e2a34c8ac664736d0a50ad5b3f47e94fa9a0738f559c65db5d11b20e14c8abd86f39d936e125125e62c1f5a5774e46a31bad445428274e11cb807537c0048a46c6186469eee4d460fe35f4d14c14c75f5987a26742906070713f8aeaef5ccb781c72ae170816ac147b2697abc164fce88150f397ea42542e60fa89c5003334b20c3577ba4a0813d39b7e96b9043acac0bcaa690bb2fef9a53e0d0236f98c1af45a81e2933dbc99a75ab90e45d098d7d25c6655ac53e3745e2beba9cffd16a4fbec5d70a5cbe95eb25f9022d9ab7b57915f8116d9cd41f2d729c0d8c177bff53a4169c08cb4b8db9cbbb78b4235d982176a89c1c205867d2099f7153e82718c0151b8f3443602a5f0bebc4ec08a69879f2c45668f5e5fecc91bb71a5fd33432fb5d100a553e9988e0b7fd9693f187014e595b423015de2873094a0930602dc84c42faadd4a09c9a4650a3d26f6468ec4b41d8223eefc9e8c1eaac0367353aa4c4b8a467e86f4b38ce369f02c326e5158e0e11898de34f63252b9ee353bf66b822beaa3dad78ca170430a1565afe413369282e4a649ed3ad9497a52182823209470202faf29fe3e676c5b66d49d07e2460ec50f27625aadaf3a8d1f8579bd5f1fc4d9e27c43cac2e006ea0665457ca216a03c171c6e0a292c4975302d20049473b6d569417e699043d3c71f5730e2e2951e6dc07b7f46c2d3bcea66294aabf5f709e69d3e1ab1f8f482b0d1231a2380185e3016e7da768be4c4f1b69cf0f8d6df71e7b923499d16bf46151d42f77d7a387bdd45f436ddf39cc02674b48dcea76747833f4cf4b78dfaa06b19e80c37cc5852f641c396827e22a7768ba2631640c8ef629cae0ce84d97e80c3025bd0182aac95565ba7e2ec95c8176aaa68ad1082e45bccb0918afff364bfe3b2d59a45ebfd451b52dc8e5713d9f50ea4ef1ec2430e819cbd25029a54c6600ed69f56cf49c4ca2c6f773057b1b00a0f37f9b8b1fa0848aeb9888340d54b944ae3ceecdbea14064d6ae268ad8c084c6185e4fe1289d33b8b09b279240acdc09ba1e73f9d961e5c44c2dcc629a64991431ce0e2bd7485e4ec35799b4b040a0c1bcc1c1c3babd3feba05f3931e2dcddd26219c2f7f3001cee6965a402dc0c8f07c461ae10a82834e60fd453a130d3cf756ce9f5ba18107c80618b7c9b6bc370b86c4cabbaa58dfae9e829d212a7ad8a7cf66bb914ae004365c15c56cdc17e5a64878533674be6633ef7508cad1cbebf367da261bdffce20c04c032c0f769299bdd63c2a9dc653d6bf48d37de5d1602e0ab1cd43db37bfb6023ff53a996cb4a4fe3ea2825d006a16ffe079970e8c3f64bdbc8973deeef3bdffddba6ec09c3c2306c7d3246c1a6df7a80316628c3a361d8164791267efc8793c2f27dbe6adc2fbfc07703cdcc725574b405ed11c9cffb623d945225845fe464d36a918727588486a30217abbfbd83b2b94dcfda69135410096458bf788adff2048d2b277f947a9efc41c93af95b09e9c95f49d8c99f7c7b38f957e7b96d88dbcd87e7172bac6c40ac9f4dad99e661551ce052d32fe0ad644a472eef459e7d7f9d31b7f51467928a8201553434a9aefd919b62fa42e962eee610da75b4dd8db79a4d3a7cf3f5a659984a65b8eef70033b0bcea3f5ac842d8254f00b297015cd080f6644c32d85bfd3dc20eb1798640c4fe73b690f59a5685e5918c936c7d885ae7b05aff41e9fd8da150aa4ba2c57458fc8558cabbb9a5eb015d5287fe1e6d86255f1d6fab7f8207183e631bdad03edf8907b4821193a5bf22349185096ddf86df999af5e621477a8bb61d72515b06354a6a4e549f0d6f4ed6db6cac0c75697dab6eeb5b4277e61c71b6941eb2529a2d4217ed81d085e641c80d0ebab440b3195feaa00d8b7511d7f415976ae11f691dd0782d4a257c862bd04a96a2d7cd158678ffbf11c44474e5aa14909eb8e21fd4fa8020961fb328556e3d1dfe02e32e5741f3c6091bee36276b88382f1561892c5a84ced8a0da45a24c09a5e1e425a7faba8759d8cc12af1931ec4befc38bbb68457e4e925bf1c1128bd09707e2b3ea1bd6f820002dc7091a3a74d68a4744c071ed4982d830f28723180b335dc21ef6a8873dbeb0d1d7c33a9fc025e2af4e721b0d83d13443afe14a59f76aa7eb5c6eb7a7c84d51dbfe38e10f1bd273603f068ce7427f4ec8c786f518e8cf01e7b9b09f13feb1213d06f69ed73a1b00789eeacfb102ab97301e39acf1aa4d62070634ae320c55d65e6d9ad5b7adead8ab0f4b9535579d66f56daa36e6eac3526ded55a75d651b558f75d5b0a85ef3ea69acda565ef57e76d6fe8fa03522ae9768d6f300ddfb3591fdff8379cce2f24b1f2cf116ffd790db9db9c0b6d223796081cfefece4e725cc7b4303c11e7d3fa139193372afbed43e6270ec7d80867c3a0742a76fac56f640e9dc18ac592a154c91cc6a36438e1c28d64cd15680c53b21adecbc59611672dd850fbed1eb95ff63a3e48785b711f0c5438418ee210a79f30f0b790965488212ffb98375fe153a5abe65e5c5a1c65df55ddcaaa87c79db67a8e5e136614c10d1e284dd149e08690c98e9e262b9a28893de092511b4a1e00319d837145c927828ac0a86b7953164ab5c55a905e984197a959ad70dec4857199689dffbdfbeae914ac5277af374be22cd896479d0e786caa1b206fdd813f0ee98f50a5b70d4252d568f8f4ef7581507958ad0ae861348d5bad258f836f3fcaa870b8b2cbef5685abc428f541cb0329d983227994feb1cd2787833411f5288c7a4f159227eae82ddee1bcb3041aeccf36e1c3e2bd0c9c05952eed317f51b27e686fe53e1573412a74c3e79f4bc40a3eb961f43071da8a8956faec00333f939d8400d75c1388d96d24e4b792d112b51e2e8ef0a1dfc10ffbe80b3dcd48e18fe69bc7c2b9bb2d84090ad03f060cd47aef2d75999f20fbc9c5e0038873231f691e8300f0d937283863c8c33dcc29743d0c9da34d40ae982781b3bb8d57bbb1e0875e51c325fbb428dc7b524ae4f28dc4ae25e6f87eb1dbe2d2e6ce6e639ba307ca531367ce6f7a290322b9cd33f7bbd5b186f916cd031b93fc49d217c23153148d081c83034c00322c93dba8aa2edfed4ce1a26c904c4df3b6a2af27e450bb9963c9755265648f1504355a8a9bfcaab2e2e1ee130e83669068f8193bc030177a3cdc505347e2f85331cb99f76a52a34c9bb67891b0fb2668a18de4f8ad00404f214c0befe54004e5d05b794e7e8906cc7bbb53dab71a6fa7d293ac5c51340b8a1bcbbd052d31491cd2be2579570ad251a1e4b927d39dca3a75b8c40555459e91c1146902ff1e840c723163436a179e34efe24ca188cd9529c8c95072c9037c13f00a0354c898e260411db115e6e0cbe1a1c6011e5a453deb2fe30ae5c5140937f0bed70bf0621ae14179055f22554eeae31e2d30139b7be480c897c36c43de0d6cdbf4db30428cb77656f06652094927ec24442460d41ff59a50a74192215a19cc0cdba2588bda407a43e49ab11bf49ac799d2c5db24dfc8547a1f46f4aa1dca84ec92e171df0d2a432e1ebfb935e8b5c2089cb717f1f27ae96750d4318e0756a8dcda69b5416e00e0b3a58700c17abf892f89e42798b83aee19344269f1c505e01c97049cb0d1420872d3afdb9fed72de9a0eca0df195453b31f2bb6ae8fa6926a4948af57d7ab0c838598836be1546c8ea14aab616d14d5ae6405797db1a98d683eaeff729becbb02cbe43bc0cb44ee7495c77cb93a0ce7aa63d251309fdca6f17ac1433d0bad2d1df5f5a5f63725ece921bf83bf6d1d88fafdb27debbf4cf351a38cd484546dc13494c4de5bc64cd51f8270679e89de8e5bdc359e03a4c107c2746c72cb511abed9ff3c7c89dd7c32423085991cc55b07adcc01d7908052748a0ac817313b35dd3e9594a4ec6970c490160e58d2a20638a5007793b1428cbb7fb0b3902d0edaf6c0ddcef58bb66701742ed555e771a73b458ca6cd211cc0d24ea6fd18e4013c4b155fc095aa8bc04ae282af5a4995a660ade8a0b125b663d85b80917ee16ce6a61b7d9c3f73779dbd9e151703946a03e79cbb5fc4b9328094fd755bf9a0e5968ecb6c38bfa4b97d7c2d6e8ebca409fc64b1dbd2197cb14a67baabd1363a12153b39bc0ba7adfe4078055c17fbca495080245b3a8d2e7e4b72806e750d46cfa0bc3116fdd5a32d326be1b4f82c212e1e7ad9390d221d68a61dfc39df3e3ca4eef4b835c47d2b9e3cb346bf2771778b869eb38bfa1b0cfe30a6541ae4361d8371230ab0c438e42fe903165a47ea98dc9049c737621d724fdf4ad0067a43cf8aedb906991d21dea3ccbb5c424f23ee5dddf49ce5cd8e56a666bfd19ef5cd7dce470640265fcc937d78d65f72c23bf8cd0d869c24418359455a488d36ba9c4f18757c72e2e0abc2f97bf5327b71ed42bfa2da8c8243ee825b332cefac021bd35dade4c3e2ae95281abd16758d899126ddb227516f9e44cc9082d57ede8463b1b356aabdf94fd2237517ee7fed14f20215e02ea38ba2d7b4dc1d90972ba234112bf39ea5c906ae7ef178df4a199bb94395a2fe1fbd18d5233675a279c95164bb606dd32896925587d8c2cb5aafadb11a281a302e25465b8fdb585b17cb85979a7a8af564587b7943547893c36f966133686fdfe9bd548d9bd7a7c1d0f7ab3befa4930d06ee0cdaa5cbf6f4917c7efd06ab8419aa5fb6a32a5c914934cf6fdb89c32f53a82dcb813015502f85611781cc2621d0225e486d01cce4a267ab7438141d1beaf5105587a0226be8c6bf4c447b3d9094cc9db1ed49d91a0a51a9a08284fc3068e8395c70aab4a777a1751cfffb998867cb745c7dc69ecef6ad3ef0896bca87302d522229491e45043ee08cfcaade8a8750382533d1a16a7712ff07b73ab3166fc787bc351879d0780156daf42a805a622d61fa9859fa8d10afc9d54cb014a17a587909586f3528ee1ec2c92e509612ef98f0e2309f58bbaccedaf702b443cbd2895d7e6657d3b7bd6601da15aa98e5f0055a2ccccadfbd12f8c211a61e20764986aad4606dca5811b00e83286f068a2aea0536df800e1a7cf0a5af95da8f73d8d89a918a86b5df5b39ab798768eb97d9cf3ca40f48584ca848130b0af1332bc7df163f75494672a2ebda5f364b7f44594c64b331d7d7604c861302d0d94b59dac11f372ba7e456aa83d9d2bec8c2a22e0dc2dc689d55d30c2ea7bbd4249f53cfe135eee78462de2c83e389e8e87da13b13d58537307d2d434af4f0bb75b120c8879b548a3bf62819c1214881c697232c2d121bc5e9029efad98ff1bb6423fdc8593faad54768fa49d75052c8cd06e4944038efa198392c6c2d6486422cdbefa0a662a35f0a1aadb681c207166af67ddba68649d59e8daa0c588a02a619f5fe03ad85527db56065232f96be8d16f2e371a15b4c253a74cffdeef4e8558ec44567d6856269e17da1ea895947e9a17bb61cb586ace373e4dedbcf8e8d4e1417dd1d463acd755c38708b0a77f0cce86cbac362ea0acbcb8f8db188a55cfb0ed64ff60fb95797efab79957f421803b648b00ca734e57703c6a5ae62c18e54707ba0bbdd34c72cc3d56ad3e186a508973f616cd2927879f6999aa5d7d4ffb97ee0c233b2c558cec9cee6d6fbecdd0588a12034d46502fe28a76305d4a63ebe31659f6aa725787033e08a8cd900d1f9132e7fa8b0fef381ef26668ad80a71448a1d74c9d4637d35bbeb3d56f582a7231d928b78189091cfddba90ec378d5044c581f82a20783817b88f0693e71260efa270f5577bf48fb1a4cd34f5998d98b19a5838c430766ef969a127b46334148de499cde245f19d73eabf3b424e9f09e7964d0e526ec7275510c51931c10ecf0a7c7cfb5110d27060d3c3d3ffdc01a62b7756e8737481152cd2337debab5c01df519da22e0e305dfb9f28a531d6dd22d2b6e894f662fc60a8ddaa6ec59b9ead501ad39346b9c13ff2870129ae59bbe1c5d0304a813ab60a3f855f291a042e7a00f86ab56c66422755aa34077aefd338b55bdc2eb8056ce03da00566a78ce23f15703d41b988b00edb34638734fe3ba915ee97672be46da3a389134fac5c351dd88c7eab563a86e5794be90ea1005171717429d159508e4717cc98853f504f1976d0d49050bbbfcdb3413e0e459dd6f42b74b04555fa3971335a8660032c7f6ac5ba29a6c04497025063a5b3f2430c7bf6d10c15c308cc037dd177f1ca4dbc3334e067920f078942885dad8136815eee93ee01451b3638a79db42a2169e90c0144a503ba6faa7c5a30141a37079d9c1aac1bf75499a599a3bd1333d9a4dc6d957636a2dddc6b0d63ee66ca4679f5e5bc41c866ef25645c4fec0bd6dc6800c7df6573b0784e66bd9dffa15b7e2ed6b45e44b2c446bdc728fe96365ada24b4899429a5aa07a907b20731de3396db7d99b590d8ed9bc69c26a8f6cc53c7bcc77bbca746d4f1036804cbfd0b4eb6c27096bf163cd7b1b8f843a5559565436ff5c0329f2cebaeb065d6ca5a592b75b356d6ea629f1b60a7deb8fe9e368475ffcb538e88e2329fdadd9d9da18004cb4ef6d6c46b21dc757313d6c05e9ef12f6996856ebeb065afc458cdd0034198e3462331c2574822d1605a17b55acb3e24fbd80efb9b9cb3dfd4029f5a0a2aa2bcda27870524a89c220a40695f6400a8eccb30a77f8e60c40a50394536190c01a58d4e8a645dfca0b2d149cc7c0ee9a8e560cb7a9dd4746cf35829b414db2ca0a9e82c5a082a803247ed88edb164327cc230ac62b95bd6b8be1bd89602c553d90e82a5709d6d7278c63fc9131538b93a5c7f250da5a1384dffa9775a49145bb68f92f6f1f1b9e2d33ede8fcb85d06dae892d4d26cf9dd26e10860e0b5b6badb5c27eaa5c7f6f4915f9c49f3ff30c17bdc7f008b664d70b318461183e69c31486190f9ecf38317d8d6db66fb07bb69c87fc4d4aebcdb6ab6977cb6ea5979b757afd3e2ea47dcd3e4dac9a266edbf669a2563531e3b84f1369a789d3f33e4df4af418ed3402ea4bdf6739b4e67a8b932e15524b3561bf41ee441d383466fdf8e39f647f48da0caf926d35ca5e6181281dda423d8f9620718f6de248207d56a6d18fe6b4f722d49d8c9def6cdb164588cc8e58da03cc8825b8b6d188aebef416c33ba2e12ddcf7fb8e4ff719c0ffb2d634e8b8fd17b4a74d52cc5f8207dcb93464fc5f4b73ce95dc4181f2feff22fa3abc6987ed2e83cad598ae9910647b9bccbe82da3ef60b1a5fffc7094dee92873a4bd151985435f0acef7441cfa96bde33d5ec575865d6ae9cf13b76c495eb7e2884b3b2cbef4a0ee0a5b7ad0f50f5961370faa1ee441ae1909b9680a0ce32e4e266fce9ecc9d83e31132cd1375aaa1c07a610dffeef628e3b2a5e97a6832997e1080982d1b093bd9b55a1b86ff640f8c5872eb3c91e43f4e9d2747f99b4c24aa6f8f259d637fc84a48c5bf37f3c4367c47c03ec7213ce35fc5b041d7df3b21d8b25eaf5ec37b33579b0b0bdbcf5858224e7c70cf4fa4fb7e22dcbf2c1127f389f4774f849febefde477ff773f4c1fdddebc0cffd7dfa227fb8f7e7ba691947e79c1f0d8cd2e9e7cf5a7307dd7af282c168ca11528a20a3882c538c5072798a11474e97a714a17379b290596ef38471fb656cdc2e4763988c1491830b809efcf0451358644f04ed2066042fa45081d7f5d7f43ff901c1967f7f66a3056520ddf9b57263997df69a902ccb5e4876671965947183b0a590ec4e127569414c21220a9e5b1ab9730a11aa4b5e9e4283d4f5c0a7ce5f6659f6b4e73ac8636ce27aeebade7ce27a544aa9ddac0451bed0e27bfe8c6dbce751bb990cd9fd4240b588dd0f88eef79ef641b91e371196a710c1da7c76b4ebbaacebb4aeebbaebbaaeab3442a59125d77b16790a1139b89de8d5923ffbd0975ce8b3a7cfbf81107fc97d22b0dc1efcd087c0186e22102af9b9f7d92235e33d8b65df9a6559c6bf818c72bf01eee773ef4f4108703fb99ff5bbeb5f4e1018a94c8d78ad6d01032ba00401e5226b910294d7af32a85cf141ac092ab030620951a05c64580ea84e81932b8ea05c6401098a882e584340b9c84160c23f00630a2b5e2817bd9613503909b0a204305411b0065074c1990055c4250accb1f0c5155817414ba2479079ea2c30488207657a82eaef187fbe62901f2f6b90213de6c93610ac5f55a3b2d7d9c10554f6aa46695fda981ed9c8d787a3b43186c798ec6bd07e1b8938f15143f6db673db6bf71ee20e29059ead7c48fc7fe187b38d9a679cabe633dc64c39ce1c3b32d9dad698f06c9f9366da568fe0b88e2733333328e20f71b6e219511019a1ed99a396cf65babbbc7c4e22bdbcf44b167221895e605e606060482e2d3030230b030323820981303030a6ef081818b549d90be8d840d43a3ac9b4df1060e7e74db5cfb2186d9421bbda6be39091ce39c5f058c6e9f63b3c6a1b9d506d72f6f46f0865c86ef6d938c4493a7e9b17b69b099e4743566cc6aeaff1950361e8bccf8644d5855d5a5a5cdc65489614926a584aaa2f4cc8902c2924d5b0a1157186621c304570bfeff648e90c1afc62a2460d7007c7732c71b03b8ecb658d0e00046005772bffa228ae100000d48811451a33421544981792288a2e62cb48b4a2288adb8d503f4c10301542fda60e0aee4dbd7e2f31f0d869fae4d12dabb53bbac3a33e5a86d73f2ad6eee77b9ab83d48df031dc0c2adcfd973200cd97b1e2883e952eefb6655fb8e538159a0ef8930cc02fd4e24f50dfa2dda02e4606bfdb8bfb1d2281e33151f9e253a299816507a5849b2c47ea834e151e96081b9a028610565b9f2734d36c2c892f4370c3f549af05015d5c102734109ca72e5a7d5c48fb80a088b14572b212388af849ab08d23d484a53c43fe6c49b0d47dc451da92904d3ae90c997886df6b8da76ffdf48672e0895d77e09329ed9fb77bce1962e2d567999bbdf7b494b9b5fc5b431bf692e600d23766a8095bfbb217da81adef75fb57e7a4d99d978e65ce659ea9d5e7e7dae9b3c6d03964fac60c8de09429edd7f92ff48df933942972ed7803cf88e6bfd0fd7c8e9bdd97fe897eed1796bee823e3d055e66affc5c860aff6f66a74d478e079b67b2ce9ac3c8363a66e69a2226dcba856e9b773f9371209766bfd2a4f8d1a402187b8b0fef9cb1385bcb01ee86ec30fd7696041e38aa661c5695041411a55501a5664f5d3401a57341a3ab065ad5078847868da130641d118131a998cfe1b63c0716bd2334fa3b185e0528bb5249801a3f7e726d7ff13ab0ecff868ac3a70c95f0549ae33b9fedb58c1d6f5076b60cb4ed59d79aaa9593ac2340d0493e00998a6590eaac016b89aa7518ae7ba3796e093eb60cf0559d77f648148f1d7752f1f0c0f56e3c6badde0a4bfb644db71d2e7a8f138e94f6baaa6fcd44baa2a49dda94d564faec36ef9654328e196953584eb9632b7f25cf7da73fde964398fd3388d97ef37b80f315f9873cef18629654a3fdcba1bc7496ff5ddd1aded38cd12b6692534609a0e82497fd776b6160176903ad2430b92b0cddc6cf0021f569d5167ff66ad36744a07ce11827a4fc039b656df50b1cdccc672b3010fd7fb5bc94eb35a9da36530c4660312b535f5b5c014db4c5005aa463da08ab278c66b84cdd258990f8e934286f8973575fd6b6a9e6a543e2bd6ada954cb2ae4364cf0b232461b943603b14db6c3013edd3013ae9341ce53894bfe3555ea2c79e85231745fb0d8925d2f5bd8b232d0c5c2960c04040808080808482aebc2ab3cd6016c03639b1648cd890ab365e6c4f5274b7cf2deb7b164e1fa6b238f954bfdee97244992244918100d69f5b79189e405bbb0da370ff266e36b61b5f24328b0f3fb6f9cebf80fc4d9872fe3343463923dcd9e34956c8462f9d7ce609aea248dc7a4ff2686fe3222934e83a3b4d1ce12aa4ab1760ad114a2299c64dd32337f562c8f22d10ed6da2eec17c26249eeaec2120478ccc528016042d52f57b84c6730033cf1fb4e6cd4a42213efaba8aa28ef452f2c8f369ca4945d3079c9399151212feccc28cd28fd8981679c131b55b9dfc184aadf456105f8f08c27a0ec299759289b07d73f014cc37ce253ff48c1a40ba88f7b23288f137b25366b76cf7d37f62aa69b15d3df8df5ebd83c63b76298935d935d935d935df3cbbec2960d639bee877148f27335710efafdd65f065ce217c628824b7c11d03798d422b8e4ef210fcff8c3fc63f8af551bc311068b7d3f54697087a6c39cf3e7e9fbe8ffffffd31fcaf8fff7fa3eb0dcad3e7687e8c630a309b67c8e39410441c0f7f9186af569f6f18921e59d01e13d1c4257c8fc6c903cd39f652de220a4823b42f7035d864f08ea9de30c3c799640c0226012709017135ce798d3799b7bced07c2a6a16d75d0831f08c3fc782c4623113cfe090e91c25bed1cf527418e0762cc8ceb6e3eeee5ebd6358ec0b37947ed862c4ec08ddf9eca7ef79e61b6f706f0c230c70085b86b77beeab2b8c76d9806301f1472a35436d4c919776a77e6ec794f8d1aafcffff9b4c24c902125419e670155be400085544e3620928facfafee6920b659c0f55ed9fa965c3d7105f87bee5eb97f9e7eccf99aaff99a2f7e0d619bf9fec4c91e1f01e7e824f8864b098e82b6c38f2043aad8ef961c04430c0dd9d3af211b6bb0ad76f9f8f7ca7fd542f8b265b7c856abd56ab5baf5e3dee1a0b62a1293c562b1582c56b358ff930536cf9cac56ef78e8fbc6927b4dcb3e0a665f4118b2394947b0f46fe62c8decdc0dcce79e8a25c3eef7a5919dcb11117d4e8c8f51072328f0fdc3197cf222b8f3150f564e912941200125b2d77ffb611b866234e6d8d1df3828c6f800dfe55d8ca03c2b76508c8f960e9a2577e119fd68f4951d9de5bd6061bd10c1961e731ff7f1d84b15b6741f9febcfeaa016ca1660f8c6728244640045092191512c506454f81d16b69c574c16abb63c0793b81038b3e46f3291e43fec4b86897f71867409f8d445e0923f126e9614ce84c160305863a971cbc6a2691af91e15fb950bab721da7099aa71eb34aa172458b56f29dacf708c3fbd34a5a89efd430ba73f574bb8603eb7f33bd3d879818ec5c6596a22e425c582b9674b2c5509db38adc45b7acb754036c82259dec1d78ac13e3e9739417022e4f89e2c37d02c5de16fb4e07f80b86c5499f3dd7759c74d5f539291deb9d3a3d8f9011e41e86bbae4bb93ea35ccf71c96979d17b45b0255dc5f48fde084a24c6ccb76f0445c988f908fde8a7e843f4966671d26bcee843df22da9c1c582afe480c99b0a5b358568a97fc6bb5360c3328604e2847f4a3508aed7eba57e7ea7c32203fb5fc774b1a03822d69ac95f9f8e9eb341f6c99b5b29e0da873358cc62a3886df58fe77598b1b4bd3cc6a7c604b2a856da6d028fad4b966c99ffec0fb925ed17d49b9a046985fd2245c20055c9ee2e2e2662db6d1ae7f9604db68efef699d6b9e68b5218d75ae4bde8eb3273c7383d83c6538e892bf675cb0ae58fd401545d6444ccc96540a95e2343ece00d5a35a46f6d293ace5a47f925b3a14ad0596fecf7f0d8461e41ecd4933d1ef038c7045091a2f4f714189b56e3ce6c796dee3b99ab8963069e9cbbd0d07c4362db00d6df9f9d965288a10e27a2d226da13197c7df092c4f71c2078aebcf77b6cf902a6b39e166ad79a231fa04ebf29428539a785def99a7ac35e5092c539ed082092f1e5069dd2996300fa8f05cffec4906e5fad71b121bd5a2df39c305b67a7737d7dd3e335cd06f0158e5e85b12d7a75c9ddee3ae9e96eb6766509c663ed348f1e13902b131e9dfb8f75590c7d318dbcc9fff52862db3d43d128b42a1601b3ad23178c6798097c6aad8d27be81036e634d90f519694c0ca2d6996eb1f4e61cbac15a3e1e61c59915cc2662eefc97ab21614d655b7cc5ad90da8d8d4afbba338a885ec3a0b7cb25cf21771a2eb2c2a4d220eea2141414141414356b40a9b6c3033576631366dd398bc8ec251abb547666d9ab1bcf96da2f695823bc8ab8d96c4699f06ee083d38963517fc4d0c1aa3405fdc50d302d18fecc8be68649aa79691bdc4b930a0e5e432dad08285b1d830862df9f563ecd6dce564bfa6698e849e7eaf9d749a17bb654318b6ac644d3b79bf1fed9c3dd670b29ec0765fd65bb20bfcc41a937d3796360361e0464a5e6feee06ab5fe55e1b14c29aa2c4262d3b29d79dac6d0b5b17687303c58ef96610c77c1906db21d26b6e3f1ce49129c83d4375a6c436194e89ab0cd7c52e710f9860be0fa97309e653bdc4fb7c3137a851d0febab2185d932dbb9e4cececececece8ea85585688f27f364ce7e76d7d1038ac852adb53689867517dd32311b4d0216caebcacfb26c766aa7837a49bbbab395d33815204ed31f7aff21f3f4bdf79fd8bdd775cf898c0299789f79ef39f78fdbff8d9d9a25d52c1920b4028be3a403b13aa6565a06cc5dca921603359525ae5b3614b2d2a64b6c7052b483dd5153a36535e4e660113ab68d0b2f2ca595ab349fb2675b435ed8d9bdc4a585cb75931d992693c96432994cb3566bc3903479405ae59ec57558739aa609c80464b22691c994e32c98e2041254110ec9112811903da144a39398ec996deaf5df78d8660157545f243615d504b96dba66cb96355657eba16375f48ab0a5c75af5b5d0bbd6ad81ccaed1938fc1257fc275a723a7023b369598077dc85b3fb6c67ab223b98da5a93479ec04b6742c589ca6ec18908d309c663ec902e914dbf0e53c86a3c6e4a4af566cd331efc17f15f355cc574042a368ace167c983b0292a4ed6d7365ad671c7fc8c6674344d95c73c88052ef9d728312962269e7999a82cf198c7ea0af496215a4878df9c81674c24a55eefac64e008304dfd2a537daa8f0f57b94a67680301d3642408e225e9a20571b2fb8797806033986cc8740e08902f5421bdc5b15a1f36125c84ad1b906abb1e9b244bf2e6851848b25b9b6b2e77ab63fb19db6f5f026073bd54b1e54f72dac832b16462624bd2a4a1ff9f4dfaf384f779dfd951546bc85a300c59ad3db195393be3c66bf70dee81ccd3e5923f57ed04dab6ea373ce3cf72b1582c1657371d374e368bc57de16962741c8967ba91e425ff26bdbcd4a7d6e285737416ac02db741078c66d98b66df3486ce39486506cbd2549fb9d256c13ea2cf8d42d2eadd8c6a1f889fb2aaf700ceb852bf117dbb4dc530c5cf20f9fb837f12555c71ef124ad049faa0ea0e8b2586e05966729c8f71228d647eedee0241027bdfbfdf224ae013e75165cf2976232954aa2f8027a01f9caab413a822dbb45ca38e3be629f1802cff56f2db0748eed5b6c2d78bc94b02599dd9244ba2114dbdc37ea6b608c270079bd5eafd76b76f7eba5c542477855aed76a6d1872f8ffaaaf202658e699155dad66ac6ae6c9e45c735d3535975f3ffaa7f2ec08c12ed79daef0ce39524ae7970cab4eb0432ac7a71170c99fe346a321b5776265d46aedff1776392d8413ad1fa08a7043f800d57d0e0b4850456850dde8a4ec57c332180cc6fd42f0a261482c8cb9635f10b661ae613ce32f433eacd5629b5e750f5cf20fc3d188d3b8da2037eee8ec5b487663b2f16b62ffc6fc3b0806e4ed8098b0060cd630186c4b85506032916418fef0d6010a123da8229b9420504e9eef9c3d6cb331c1a71ac54ac1548c804fcd44942e81aa97e8257ef8bd310ee8184bd2746c696b845a0eb60cefcac1ef9e9e9e9e9e9e9eeef9e196c0ccfcd99cd99c324c273e5071996ccf6005ec36a69ccc2fe224a65a61a71151485645266a824d71cb031c806dfa3f0a4ea8828721ba584d81722b331882142cc8a2478707943fd7865579534ba9e392d3885c8a1ef43dfc7ff8dfc4e0ca329c9ad512b0eb4488199d94d2e7e197f21cd9b3e1a79a39e2e81b97cbe572dd48d183d591cb3d40422501977b8084756bb5a19b4ca2327edaf5c978cf29d3d3dee69f97ff663215c76f8ae46dd73cb1af9c5c72fd7b2ced6d15cf20615ff3bbc1878441352f30b0ec426e08c2d2f71bf875691028b8a7b8dea2819d545ae5e2c1dd6eb16cdf925f9dba4cea8f97ab5d292f881b6fb2d137841999cd916783cdce4708c3728fc72b244cde1edb354bfe2e977705c8742b3664c5d2efcaf5675850898a0d0244cb461f16a8f5a63a95621b325e681c3f71d9f748f11390590ac34fddc44b2fd2c481e30299960613db414c930126a3300d8e936c03e434f4b9a0bf61d8208e33c0341f93fed958b9cefbc090c9025ce7691f08ce100a6f8f373e7565a968694162475b8b67ecb8b5b656b7cf4929a57466d9ccb21108a574b4a19fb3cc9015ab51fffa9e4f181eec16b262391ea2ff40226c8a95da627fd27c7c2a6b9eb4d72cf1380d578ff84903aa3a308d16e4a46b5160a7d161a5369d4de534b179ea23db6b9e3ae59bcf3c09c9e2c3dd2d36372027fd373098f4df94781f1812d9518bf78121911db5b4930f0c89eca8c5e50343223b6a7189cdd3c6036f6030cd660226ddb7d43c8dc62d082e7916bb1b0db6d4d6e46e48369611b6dc5a2f1fd6dc7ae6c9fee86bb5360cff6bcab4c15e5a74aa553ca3f3b3f9380d07da518b0ba96b6e14e2a47f8e38c449ffbee69620e8ef6e168b63b17e6789930ec383ad3a5b2b64c5965b2b02dc0d812af048147ce6895d7b6940f30426712dc8694015683ee00ea80428fe3cb98b58d00578c6bf0b1b3864e02161c56a9acc01ae7f5883a4851d18b67618665f8421199a9ad6df361ddbb6755ef2d739e2790c322bec7e0ed9c2f66a3b8dbebe08044cfa83de7310274722f5d2fc2adad04bf32d08482f8d989cdafb74ceaf8eb067e8a46b7724f6dcd0db52c8931b1a9bb59af71b716851076963db9e2ff7a4141337f2602a65583f668eadc4c925acc5dd49d243d60843d0412772780a2653b050394510e0c31228a0b42f828012447105aadb7440e568dfe5e05baec0333aae2b802ea0139d6835d07efb0a68bf8d31b302db73a81e4e938ddadb30c8101c2054cac9470f86350ef5ad0a2fa3d16ce4e093058065284c73523add338d9a4ca64dcba8b561ad0d53154dab2a928ac433a42c23b10dfbab48b70718c840a5fa81400c532357d3b1fe53fc2ac7829c3a35735464a8542a958a54a9361d1d3a74b40e2fb98e5ec23f1d59a6836d422f3787f67fbf3e1843437dee6ba8cf8d356c6fbdcb200cd5880f64ecd040e504103f28414d60071a9441043196e860069bc85b0dda73da6fda1341f56f3d56edb79c6d133514394b74fc204370804c066198389c6a85a48a98ab6894852dc330c481c16030180efd81c7e2d839265f54dff0af4ec536c172df58c1b582cbe572b9b21478bd5aad56abd5aa86bcb0b3b30ff96d7412173947f7c0377ce019ff52002fe2f0a7a52b02c54675df77600f909fc0adc2d52a0bbd1fb8a8822a3287806290c9078e3f6649c401324b44b01e03b6e95592663949bf5f6c60afd818acb2ce4193a47bc5334ad8b2e687051cc7ff6b7eac5eabd56a95d1b95a550ff5b49060ee44ce90472925e709038db3040bbb71e1fabf5ae5820b150683c16038ad96cb090e674dcd8fad66c82ca528a5b6fae0f5019ee9e76e8f41b2d8b297e89eb259ada46c9abdb605116b4cd586644d8debca0a7684b8eef95779e64d97bcee7831fe4368f07e7b1fde6fdf3de610e99efb6dfc3e87881322f5b7fec4d4ca7160cb4e1121b27ded3ea6df47fded7dc4f44843fded6ba8a31d6be8c656e164599665db4ac7c94ef5604b86a5623aa6c7981e5b1d47947f039807df740e1d7dc34f3ff35c850e17cd5ec7bf0e6d27732f891320274f605df48debdcf39c522c47a162ddf2af6a75fd65388a1c92dc1ef344c7981f5961cbbfd9983a400cd5ef69a08f1c157a50f4b31ab4dc6bc073ddd94109308a8ee12cf987848d80115e5c44e149e284104674308517ecf860091e44d16117810d884842c9ce1043e8005584162b86c4164e408107148f01860b9820038817f01043bd70821f24769ae04511c040f9fb379d9e28e4be6d21b727a272e592a61a9e8ec5aaa44db47def78bf7df97387c5da444a8e701d27037cb2cc2506e3fab7499bf44e6a04ab7ddb566393216ddb0644c8909c1a1aa3405fb4200486c02fc4c49e460cb03fbf796abce45eaaa9e1a9a9d9b69f53f453247a065b241a6f9822101b703ae5343fc5edc56ed5a47a87c5309cb90571d286f9cd77dee0e43604a7b497e464c9586a4227b7bf53d4ee0eaee2fc849c04c6d73d3dff9082307430eb646a9ff7313b482ffb76d4dced356b415148140245a391e7b5fc376a1965df6735cd6ad68a342d04825c58eebbdf3eb1a4975627bb668e3523efc7c463973bd16a771dd97bd9d7a66eb51880ef82a1eb6533f3ce38db42f445d7a324a53274febc73d26d6e74fbeae5e199b55a1b86ff2469ea3e0e84c1033ff0f340204256644521db8216bcc09060482f307fe340b86ab6b4b86c624ea7fc88d73c4e6a5bd8d2de1a6fb14df6348460d29ffbd20279669a56f2aeaa4aae9397679eeaf414074defba92d08a42e0e73dad65d35ee264bfd33a67af9498bc1ab53ccc935ede69883344204230e9ced19defa31617d20b8c0aa1672f50b02af0388d5faf9bcb14b5dba246ca5ee85421e4be300cbbd32e0d51ac2385d1b1ce89e5bcdd8843dfd253d365345d5c462efe4d0586f473e4c117e6fd1b0643a2898119fdc8cbe8499c147de5227aca55ae936556f494eb38e947445f79921c3ffda0af1e1c6873d67e2ac5c919f3d43e29a01d18cb573ca91df4f6d83dce40409cf41c27fd5f4cb873104f3f9dc15dc21ada735d7d8f137dcca0bdfb6c9eeff9d9fff6dacfeebafbacd3c23b438fda3c5cf2af48d4ef23f8344489eb4f80236ce9a9920f6dd27a32f2e00b857bff1f9ed788258c5a4a622b146fc6ca6629ea295769337ab01b0f37baa774e8ca93ccd0711a1c86e4d44fdd6ddcb66edbbc6dfbb60ddcb6d0b689b6cdb677bbbb15c79cdf9ce09ca1394573da394773b6ccefd1e43faf3672f7d43cdfc7e3739409678c21597978dca58227e08921a610d7df0b819fd771d5fa3f57b7f736f16fe598347935e454d9972a99a6fd601b67544d8f1f14e0d307fc0942000ae2334813967e2cbc592cc8dcd1bc5631fba4429db32ba74205b240e6e9e70ad5b442df6440f0c06cc346e70899fd6f9cce2a93e7e4396dc87cdacf4bb50f4c4a5d87161275db802ce0e48ffeed290f4c93023e851307bbb8895858be3d0ae9cb3ca33d05b8e4ff23f54aa552a95488230c71a452ad1eac90c06038323019980cce3cc9c8c06460323263f5c2fad7b45003ab81d5c06a603670421c30180c06c359b17e7eef958bf269246dc2c793024ae9143bc0b0eff77a5c5dbd2fc3d07454e83d51048a409128257a0b5a11113cadeb7a9cb6698c8f4f8cf1f181a1181fa2075f347a2aa67bf045dd8bbad087c0de8972a7a7fd44719fc7b988ca0a09fda1f3a8642e16253d0bd18c0c0000004314000028100a860322d170402e9935351f14800a7d904278589b4aa35992a3309032c6284318218680c00080c8cc681404b5b220f9cc5e6bd3492d34d766ddd02c8c3e5fa64eb3cd378e510d666d1b230dfe3827b357333cb6b240192658e0e40adc68a8da53dcc0ef3aeb9cd64ac2b925bd57efe8b3df3d2dbc1df83114630bda482d40e9e1b9747963bd8ab829dae53fa6c4e850e6f0e8038763e253f4534041e8b89b2ec538e2c7710d05ac49417048c945506497e0682b7cb2cb558305b36d020dfe0442cd6c589b98d83cb5928168f71069bc42595e49322875ab49e1755a1729a952358eb4391f9102d398bca7f0927416c399688e726de656ae55d349e8083006eaf9fca3fc09962a3cb3c1338ae7a80ac8e6f22c2c4485ce3b26257b273eab4bab644876215b5d49c7543c8589c62e99b76e538bc91cdd84935f78c136983a2e0f0f92645886b678f5c68417adc31aee1de48dc9dfbd002e7bcef52029a641c280b920a09a1550cd8572430c4e32e424f2a4f625cfc67b35627bff09844e73fb5ee50d969db3de64d32a84badd967a3e2295b150359926226f699b81e428533202ccea88d7c44fca73debe9b286d9990cac1909064ae6fa37733ec4edfb9360f483889a74f3f7062785aa73e81c596e60e88c8b01e256836902013d5095ec93e349fe6ce77496ff5902a8a09d68930d87c6750bee58e8d4e62937f7fd114528bc8c2ec13afe011a6b087d7d1a67d4b95dc57498d2ad83a113e2a4b9fc2cf5dab0ea343a9343309990c806b9428539b84df61d5fcc8d6a7576c96c22bfe4520d9d17b8ae171d25c5eca69f7633f2c83c4d4d2dbdee80d06c2b50958f9a948f8a1d488f06105eb7203496cf25394c87591e510a3aec8978d4b0c0ee01e25ee8c6a70ce548642803d21d5d00782cef316e80e3d55ff7f64c4dc40c0e1426a8d4feb5beb29c3fc9a25f817452759269314a45d215ce057716325e084db2414ba0c7019e4a0557cb24649159269c222f36ddd224944e262ce5f1c9d4432653bf413aaf2d49136e2c7458742dc2c92d4a4b04f8fecdea2ec63279ace4149722b51e5a2acee0a2f77030efaf01778e4631ca607337c04fcf1f9bbb595a589c8ce43fc6888a9ed9a6560dec997ff553ef856316160dee4088b4909b5186b7a15a80c7181490fb41f67c480888b974d4a1273388ef516d1c4536b5c9a5c139956d8b579f653ecc71445914fa1ac3a00e7c3e8137f4d50fa6841014a3d84b4764c054306be24302568e644cd1c3b41b30c23fbf3dd4f9c4bd50d5be0c5a0e8646846649f22eea8ca7903779fe88b25ee59c295f5a1fe74e0fb66f85507ecc6e7a8f24fd6beccc5f1ad72388bbd51620d3d0584b8068c2746656dfc0d468df97494768f935143a44efdb5868bda432d40c53bd399b3ca751a7daf4182fa07fa22b74dc2bbc3954d956653a3221c022d66e2427cf1116b4a3542f4d0ad54abe3b0a428d08d783580e265f872ff5415a37cd2c290cf0ab3cbc11dba9f0614cace9a8a6cfc2732b412f8f549490dcc598a78204bd7c5a26db73cc26e2fba11812c67582944b047ced9fc0e53a94022583108b3e6493e77195fb92c049b92c3346e3fa3b10a2ea307ea2acbb89336e2c82f7f90a38218c766726a2b3e56e65f3494365c02100b28bb8c0c40ad5e5c69bebd12d7ce85a5671d7039e71375566f919af789c3c05516778e3629a0100de9d4c0b8eb8bc15aede334edcc4e45dce45a80eed14f8bb0e94411b3c1a9a426b5bcfbc8de7c8205237777fd631ce7f2d493ced6ffc40ed7395f823b74bb58fb866c67a2ccba87e6d20ad94e54ea840493c026442fa60bf244ff9506194cf84d3cb9c66736044027fbc0c2a58cea051a34eb3977ebadbbeb85fbf55c063a4d99a49ad8ef100d32bb6d4c178585e02ec62bc71c472adda82f830c4ea6574786a30b55fc1fa6845e8edef03448ea162239171a5ff2436e1399c22b1b0ce5f3d4a689e1a034023c7bb6c71e67d1919edbc847b0a428f1402e4d85837c5d00d2c6e8330945913a058132eda3231634b829d55d6cc83bfaec8abf06240e6eb71319f4c4edad4c043e5a93925d18bde8e37bd5671ecdd472dfa7f7d9fae404fd2cab4130ae9db3d9a83a6c3b20df635e68d96fc0616306bbfe876bc7f62433b9ba44a1759a6216bbfb677201c3c237605936a03f0b80029e38ec1957166add2984bd5f5f6119db2a9cf1647d10b132b746ad72a313cde214316211d309b0c07168cc0b8a642863b05dff53d18288c33920979e68e12fd252b77c49426e8579ae15e23d660c9a5fc2b8275e72d026a8a667790e8b915c3fea82c56fd4da04782132a871225e13727acf4a14bb26c4dc6559944af29febcb46b0929d1e02df855836fe4e440d7e9675239269554f504b0d4c6edd59cbe989b31dba58dd7d05b3d9cc04874261bc8c6832b66a0d845095245f19f1041b59e8ed39f559d99f35c8b70901297295fda7fb6adefd5db117fe092ef20b0f1e0d74c7633977b691c153178c3f45b46ab2d04d51a390080bf51571d6e611a28a08b230317e47822fdbc2f8e580752eca87dc20416b0918791a6f0343a1caf112c740c43f9614366557f6dcca5a9943157e3a99bb70ca190ac526ace5a055caf112d385674364832b58648682337e17165d2215b2c1af89f4f9144774e1c135399f6eb018c5a6c49fa527af9fdc04b9b37fc9e5f6d6ec6813c334b8ade6fdb9e561efe564685d8851b32676ea0b145fc8694725491e8866e7de41d84e51ab884ecc48b0cb8094665b8689439e51aa1121ced1a13888c2442e823115cfa156b3f854c216171a64e766d3869c96a165fe74872e309c22f94dab696bca927b6a1a2847640a356dac515bfd8dd4e1b4573c3d670e2e98328db213d28594db5bb514b004992e3ab5f54eb324b0fdd74ba9b290eadb5b48140b85feb675ee4e965b9bfe929efe8e587f298dd67ffdfa291f248cbbb0f6049701cf6a64b57248e96540fda2f624513470dc62d05bd7455bec7106eea22ecac93ea14430a3321eb55faddea25b0a2103fa403cb228ad464b25edee9fea2de470da67139ae2c6cc9d9300880f9f5dc815f850348da410f14bc08906395d521fd4e52c486eb64c96cef7e3c38d575c384f09fb2b3361a1b75204e7f5fb464681b24b1c964c7fea2f46048da41751c2ba880dde09a48e886db58fbea804f3da3216a124da816811cf50534b82f3028a881dd0eee825101e39d157c2a2388e298425cfa4acc75bc2358e4f319b4f2ff2922e5b5b874d135efff9a564ec64a63f7b0f5a2b7bd3af6c4d1f51978bc27fff6f0744b587ca7c1cffe999bf6298c9cc8d5254ac1bf008fa2853c743f705fa88c8dc6f81c0028e4cd38cd6131ff14ffb58866cd14e88dde50e09b516e78eb5a7b31a37a90c49d6023d7edc20261524578857a907d139d6797b87bb7dec7e72e4e5154c3919a79c4f9c226ab140bcaf3b83c542b2b307191d187a7af02e1d5c444a680c55c42f61f3dfe5411bde8001c7bb065fc59020ba4e1de2fa0339ec9f7f67499efa0ff46000c3808019f7a04a01b448f198c36e9b8e251e7f3254acb7a7e2ad911d11ec74f225f6404c507766abab8481aa52fbb266ecc9f133b846bcc9427f7f2c9ce0d1c6aaec1fef4068e43525f3dba49189f67ae87229848a03dd352d21b7485a33c70f4243f575937285170b987ad1b826e853fb603a586a9c337b905c5a4446848fb1d43d454dd8270cefe6cbb00f42dc4fd4473f14cc7a5bb301caa190d9f18a95b27d6890d42b89fa4e7cfbb7e7a74d47400c8d9d61a9dd6383ca342ad5991ee506bb646ef2bf107a4d6404d5a0fa79511b4a3142c88a5b0884c626a5181ab542ece0541d39ca979e1a3c61d5fc98c6d2425575f673b1cea9670fa452834891cdd984de0933b2fcbcf20c351cec0340a9bebd639c501bfadfd31a56239f15157562df829a5bbb495708d0e5f9aed5c68a05d19a24540759b76b3c5b40d6e5f3e3b6c10456ed01093abda0189a28f5c2fbfe20fe55753529cc3355c44d67e032dcc8a2755756a32b1b1d6f230b312cc6dd319fc669fe7db9e468be156a14af8f8c4f87a96bc435068bfb4cdaa72fbde0829f3492d353d0e7f9300e69501b7b8a15502b74a1f64fbda140dcb703a8edd30986488fee286a3af049570e173a5be020c674478614c5be9a1ebabbfe2aa49051bff1fd0b3da17d76f501cd46dc95de8f323f6c3ba5795fd32c5d5b9b670b192eab5494c49e1638f93555c22515fcf792ad84f1ed0f51758ca0245ac30521e5821846ba1daba943fcff3f95f732aa65aa812d26d8cf2ed5475106ab5e732ef1bbc8d9cb9fe059a2070e0e34698970bb3291dc03a822f231c92432ec946a76081825f2ed14061e50e8528d5be0e5b0619517e9d9ef95e905d98cc97c24dc84e00bb811368179f898319d2aaf992baa73393ce00fe7c02f7867cb7161214dd761f597f033f1d59aae5309241c8d2250c532b37ea2bbca68eb2b71cb74aaffcd24232bf58919e5b4a247c1c939f534129583c2021a5599218e73aa013d73ea1068169102cb4a9c3247fefd293aeb4815859c1870de770af2ce275e1fecf0160855599892fb51f33fa3118ee08b27839cff185b0051a247a9d35eefa850db992a3dbd38e1024f9daf097926cc088ab191c578a23545c4bb7932b71d1ac33418cd43247640198a2bc905775d290c266dfab2751ba7c0a23703503bd16c2ac4deefd8fdc7d5e4ee4b2bfc147ee8d359b7907cb6a8c471528d2cb4a804a885c54a5975230fa1f25d0f04b150d0c46289e864a41b27ddcb2e1086b3534799f6b0fb2183e0bae2b5dc490e31855d569bb055d2da64f3eef297f7d9736c0b1853acb01e9e31ef7f6b54fe188d43e7fa8e604cbb6bb534175dadbbbb1837a17cd82cb058664756a71e68d9b70db0c4adf7f6bf7d2b22e752fcc0081be352a58402e472b463285d63dd8ab8cecca7f1f5022ef9c5619889dd7bcaf3f869506a855f5632ef2ed7eb7b11987c4a461923723983daec943d648c45ef421a6ac334805c6dac5bc496c83f043705385281f4d0d0047a557087fb74a7c1c18da86dd08131a7a015ccd3405cc01a440728f5713169c5d10778b0abdad986b3ec829aed2eef706daf42f5fda349eac87fe58628655044796c3ebcc215e49d934a7bfd57dabc49f09b1d12f011be0798da76722cf3889b6634d2f8c94f2ef82521d41aadc757f00632a48bc9587c151e2f414ea83c0460aacd23a496795f9a82a62385a87d9132be6c69dbad6eb8398df80f5480a71de1cf099d39e005c46f114910da7ad29b24689854c8f012cbf97c2db7b586a6e38e34e437afcf81a9e05714502b704c9c32dd84ab64fe0d360284f1c080c0a94a3810e0b60a7f049d5f993e9594bc7cf53ee35cd964d318a7f5f3c05e79c604046e82944c368f72b585973e184c8c9401ae15d57bf087ff1d464c9ebdb21f0c02881ee38280d524b22693bae9e902a7dbd414a16a25cabaec532c4fff0d8b6d5e90ab6fb688c902e7381d60e3a8fc49fab03e4080b599407b31de814cc1b9579f7ea7dc4610afa6a628be038608ed464047d0d531d8ec0e8264c17bdd463055467df7b2686ec6e04a8c59027aa86c46a9e5df0482f4323d20e2127d7e6979a550fec363bb19e570aaa6c50668f7cffc3c6a36a344431a5a8eb9abd56bc2dfa77de3801022d20f1e4e732707e796f83cf8f17bb68a825212575a0cbbe13653bd4aad488cc43673534c84de359260bc38ac4ef4cc11a7cd047eb51887044d75a016b5cdf83038f6521aedb681aa0de57bddcbaed920175c1bbaa86b67334124c984286bcd28ace9dd8d85b29f06440dd18dc35233633f439df75def2805dfd0799cf9f87c8d493448157927c073c8a20724d72b426c8824f1b44270e289d45171f126a8bb0e763f97f201fc640953805ca5ca681284a98dd32f10ef3bd62555a1696c45c393aaa0dee02f0ee949969280ce93c4182f2e4db8b8bd51d5a3e9f6f85c34e5086cb640dc7d2c8c439660b3eb3c58ed956d07b000842e5a572c6739db672943b6cafdb7b88e5a4905c24df2de942efae40a9f0c8a368cf1fb2399fcd0b4565e8f9922febf11cac81c3cd302b903eea1c195afac19f40d7f664ee8c1c2b1c467fe34eca5d2f0da2a0d83c02ce69fc166be5b68ae258680e95c8b73cc9d129720ae3e8bac0028bb2072472c3c68884c6053681e515c1722d7f3819a6f88054b91c65d0162a79255c63c95e39472a384a8605648c2d5efe43141073ee5b6ee9594e91fe7ef6a8201d39489bbdabe6ec269d9a4764465b0ccb274984c9e0e3d3682d018d61225ffb4ae14764d8c0c2a518f42a4384b514bc049e54dde2094514c0bcb8522d8aab855aadfb06e4b9f81107acc9456517d22031cd148d449ef204eb4030150641797512a3938b0bc9c9a03727cd0d7b280d46933b2c8e246b508dee97b60fbd0fd94e520ba782bb5144c36795d2cc86cfbe23c0dda84b6853a4313a15fb3ac058acfa771938141253681036325d84b020cc2a186b076df61b30e2564daf21ed95c5de7514252463b3934b4393a1a69e9c95c15db079148e6cafc7dceb86cc49066589653550af01a94ddc3700031578d0f88846eb75c750d791f70c3ab508c6a43084e82f5849132f2480a10bf82b177e5795bb4e23f96a3898caa3cb90a10bf42cfd9a771c18cb7914859db3406096ba12297f729daef7ef68721c860b9e2ac52aea3790ce907910683428cf9edbb902c3d0e5d71ad4936d855299261cd712b7b92c75250e11af43241e55b83dad873736e6aabe521ab418e0bd34c3ef67dc761d0dd544d1d45de63082b24d08cb2d6268f79d8433ca7bcdc97133f54625e6d0dc9f8392d8ffea88833cba64fd450829bbeb0a2e698786f183c4ca4fd4b7e741f41f56a989bfa9129a8eb79ff7fedae0effbe57601dd2dadda6c886a821ca7f498e4c41ab227cca9f3859f37c1fa7a2159301261c14f8e974b70a8a0efd63430cabbb3348875e3181c7359cf3471b9459e3bb1b37d8a8f7e4c6fd397501a53acea5744c712c5e2f89906953341c612447eef4c0e7b59ed9f2038ff8d093aa6e5ec1b96f1cd03de966b3fe3d8a908c69653e251ccbb09f2d3cb77e8b9d05ab38031f8180149c62deab136254137a07451f5690b2197392943fd0f60cb332c780ac63bb741ca6761c9580ecc10d0df4d7ab6f5ee2c29c3249cde8220ba07a440b54e723479f5e8dbc3f00c3dceac46564191c45a5a75c9e54bf8010d96071769392efd718b94653dad26cd21a68bd39d00ec9adeac6d39353753ce773c7bcdf63407096b7b78f11fbf2ba27d1a153f1df68419ad7fb2b9f32fe438aa2cafb18eed9fe9e2fc8a6c46375c128b53483aa8d7219e7b74ce49ca83a9da719358e2e75f43dfa348cf786b7c901d0b068f167974a71ef85f15abab42d9b613d65796fdb3eb45cadd2ab41c15b377612e7c70378db10289730e717231c6aaf4b1e8410161565cfd801fe77ae039f44b6eb4d5609a45a289dd644e4467b40b07a55f4d199c1d3abf5127b0a64db4418c32f52f93018b3338752146524982810eab0b51be033007614d9ca3c92af5dd449c9e978e69556c30c21f092a653508b37768f25b06742bad8b766921621b098b8d5daf815444c31425a38905e54b562568b96edd2d5e054480e787cfc6a011aa83db25833eb2c0d5577f1a4a66d8997311be975b30e56a8d3c86a82ace881e3e68c1ec6f04a27ead00af81e2374eeef410696de52c2e82ce4785b9e9e5cb3a72754acd9045f5e8255f1c5e8d0a128a9b19b477df0d7c6d40ca91b18a51e36f372c871e55faea6c408b45f46413cc397deafb28e6ef299fdca6f55ce7e6eecd5f004e334f97df96fd921ff6b7a5151d10b8d4efc0e512ce957bc56e6c0e7f721ec1d08fe625e85ec3c4d00bd1b8c3dc76757d6f116c33f6d508ef9e89f665c92d3982efab761496dab028b4c90550d72b112b74622fccc8b50401864c1830c2bc9398611c2dbf5b1e8af72bc254aa268e9bff8ce9039af739298ed003322c808ebaf34480d1c13a6c4f03a9f2d3cfb86253aea5c35825174781b7058531441590759e61a0fc7a13db7cd56f53830d9b9a16cb1077f4c8345ae64b316abacf9d1a4ebca4704b720fc7544e38df566db9c74a0579ccd52dadd0a2ba858bcf521f5ade825024fec2dd486942509838fcdd8f49dd9ba15a321f7a49d62d4861e683e31138a674ef1a2901882d1c289a5de8d830a0ecf55023966dcb0fe0378669460f5d5ebb6c9cfa6d810deca5618d5735b2e8e86744af37d0d4585e4f15aa9767be498985b1ace1e24501592ef0d65beb6f2e5e61a7d3983d9e4f82e463352b76520096610502f45f99307ccdbb2f9694d232497ba50088e3e5e76a5e26fc664ab59b1d0f81e49e8d54bf51f0fa1545f833740b4c4518fa86e437a6b9f47c7bed97840d6982a925bf928657b0ad46eeca8c03bb67f633e45a2e91ca9b9d994b47eec72bb13363eb30db9238db70a977494fe8bc4a878ed4e102fed583394986b7ecd648e86572aa081eb0df5d37e658ea4c90b347490d5bd00ddaa3a901f1bbff322b54afb6980063691476a4753f7e8c2cdde97525c398f52354889b712024e12408b64ef2c424826f7578d346e9d29f0c770798d41c1d28d4e8f1dae0c1bfb0e9d026d587021a4855c5dd8301830cfe21b8700e4ddcea802de65f0288a851471e95854ba8b6f43dca659a3ee2d1083c6087d31d3589b1e29af27c79598c4b7619f7ca63cfd034ae346ddd10ba8d43644b181683e8458ef9a7a05113ad8c48dc330e27864857003371aa91b5acf1e79ea87ff4c50b3042b9965ad4837bd8686985ecb24d89ea5e68f8d0f1d5ccc2c46b730fa11e94026d4f5a603b5c0da8c37e565821aca6f19c8ce5981ccdb6a272dcad28045a93475c62d2e270b38aaaa571f647c16bca172bd621f0cd4144b6eb56ce0d655889847767ed4633c2adea0e61d785fa16d01e1516383a71c12bbe08d73c7290cdb727b6af162020f25f105e6ecea13bec5f585bb4223aec4b8929a91382d6a68318b308ad1643a7789c8e3bcc748df1ef9c3d8317771109311395936e469cbfaf00fb0b7b5f495ac5f25eaba9af7052138e2cc04b5da6c667b222cfd931b6b8ac79b337d028a56e76e93c440f6416e2c93c8d536e6a4e9ee27c7410559964a9d480f5c693bbcad3201e4773b6a13714f253a6c4b3cd9afb493bbe68bfb615bba417313b151890a33372dfe06483875c0066cc7ce778097c66f372476f51483f1a827470654122db922082f6e92d339c60ad357b33ff03a35d4e5e4b006262217719798d30b2906ff1c7d335f5d5e19e7551d0f4c5a79bc3c24edbc116996221f5c4847b43cc03fc798c125c7229e656e974bd48376009458b08392a0de25a82615299be37f4304071f9076e375a597c8f05a1a4545c675b1f9aa8547d47c6d4a5807565c828c409d23fff6e94610835fc19b2fd3a4e6f9b6d3675b9bec26627819421ec1420d437834fdfa3660df53e674aba00d2b7e9567be14829d9013ae48b0aa56d60b15034aca8fa33987dd0eb878c941235993aa13741f3aafe5e1814c2bc63a510e3730fdbf641811359760d6fc1f67693cb0856df356bfc40f030927808576943851220516a2e89525b11adc67ab465c455a490e6defb0f3d8753e108ecc664213da2edb457251c42689f19c50c84b7d2e379309e66a793aa89d67e480de06daaec01f4f8a1444d8ce8a57f7691cd03af6d82c9473245230cb797540745ec5f9dd8ce1f4a0cfa04b8f093c8291314b098a88f4ef8ef3e98700fefd639ac1d97e49b17cc68c9472f6a4bba9de5d510966110fb0d464e5e06c0b27ca6d90910d20048bd3e123b9b69327733f14fc5ace278204696197bb5e0d4d4346cffea93356749be7b69e81f6f5000316efd449942c7da8f5ef2eccd4c42dcc49e99cbc9ac8512d32f70313ba53dfe32c760104baa3c735ec398dd6cdab46938e0afd36c09200f8109f6397b631892339d64f5a3d202dfbad638ecd2ab80e586f485792d4b3119533ededc65c5b24f0711afbd7154ab6f87d86437eef0342e58998a6ed48d5de90ec4aa054e92a18f0161aab97e89d9c135b2c3362cb55f194f0e6708d90b36d12b40c7358b7734e1929125f0567029fb2243bc1b0ce75657206815e31ca62c4635abc1a3917e51c934117e1be88bae0b41dad6e0553b77de79754db39496f12f71ceb7dca23e3e2f74704ac21cdd265f36d83453e705cb5298f4db5694960a48e6df389bb49fcbb9da40d36f43bf53e43eb6e77a0841b9e7a952dd8fecac89ce94b519da14393ccd9c10c107ab626f86d1403c56ef2633ed02e5f527be7c3c7af9d63417b065800aeed4cd6f63bd307b0525743d410666cf8f7ce6b2cc3271f04457644a26cc173c983f69944d03538d662e6d84325c5ca78a881a00f338a6d9287e4422682319c3d2dc38eeb2e37a42177789c9979ac762c1000ca2f1da35e466a73ca5e4928d3f15d83cab21eb80e89e1f330f5ef9b97916064a4d2e32bf8004d40aba154e408499ea528b6f897d1366f566f919077f00aeb712de4f8dd6ac3e2ab7b80d657776db871a979ed4860b357cc02718f1e52002b2088c28fa23193f509e2cd8ad06c41f1a0aa2030667868ca91aa94d9a19997b75d282e38c217e860ad8e0fdb5cb2bdaa56e9bbfe77943f9f30efc8b54ec34ab46bfb2fbf5c84d0d2f62688d84bc99f1639afaee5debef25ab74f7e4bb6448362ea59f3bf249c21b06e7f49f4a937b8a236b4458fe87d9492ae0e2935b45274ac00384758f49a9dc29446641804637145094ee13659cbb623fdb7b2316290e19649f12ac947999f19de34f4caac7f8a86c6d93ef95dd52188280d24e7f61e238399abc6ea75e3aa58dcdc9268838a07419b848d06425f3f5c18b3a6618602a6f49bdf1f3c30d999fdc7ded6d3fd65a74c5dad82196249e85b187d6ea1a58244c5fd3ad76cf7052243f595067d3847b5f6b38106fdfe3ce95f3e2fc5101b46c6e7b98407afa87f94f2c1838253c920adf96f55e1a257671811c6e18752756eeededd804638f45d551fccaaa2c9c049d98878bd3a842d1f68248a49c82dc760e90d5b8c3c888f9bbc6c4a68f1a0d406cbb3ab3314abfec1c6e2e0a4dc90e1cde9688018b3a2100bb6182555f4fdc1856b45d378aaec4be917989f65e9894be3d0878a2a8be32f71efbf2a072205e95793edef304a75a24c6ab6ec1900e509dd49ca7a828865b7e2d6ca091102dfd8886358a42f731e368698f8132059ded9668683de359946a3784f99ffa88cd4a7b4467eefba92f9b829ad934b974b41661a4539f19874509aa21b9e0e53c49f13f775b4d65015e91401e7f5023ca8cff4ae7c2e48b0f3603b26b692e8c357c6cd2f4120b388c40a9e2edf496d872aa14c75aac6c0401926c584e73d760bcbe13296fe49f47c0b9ff38d8b2d8baa69191e68ee0b1fa49f4fcf6e8492581af2090d610d9a2ce9d74634eece9fdea7db0edb9ba855581af035711f1ad5aa675ec070e1930594fd473093445e2e39ef090f30161a1b953f4bf70c17d690a9be5a9a3b2e6c94542d6f285b3e8f4b04604130a6a2cfb9b01827b1ccfe20a6df8779861afd355d532ea99e77bdece500893956ac257358023473e2ee2f2ba23955daeaa8ab3909723371a3f4525aba6fd5821da562edb713898419cb1ee4bb2ddd56d0efd05a04adfaa9780a0aa4d54e6a06b6f1d37b21ec094270185b585af17e832768d741f80592fcdf82276ed40b900003b7d8d69893290f32a2eafd495409af8aa3c28f932a4ad3992ac68e862c3ed8757baaf9d0895bab16a05c55faa752597b6b464340cb3f60c8bb09c74bb57534a266359cf9ca9ffecf2cff9cc7ad976c0a915c02b8e27e2cc7964df3cfd606124e29094dc91b7cc3754768db1e9686ccec4a1278797c2232fc58d990cfc64ed7f67cea084c80482d26ce2d68ee8a89cbdafda9d29092dcf65d5a0d1c5cd1352581eb5085cb53c27b427bfa8ac4f9b98f46d18d8b872b18744844e573850d12240da01477e4642e448d92413c670ae8a4a3f4d8c26e349752b46a7019f3a47d56ea0ac6a6d7b02ae33a0bd8df4ecf19d363a0f83b28ca6ab4195d215fbb35fb44a1cfd736efa4d164aeaa3d3930c5786967753c662eb4f264aeda54019e345d27485726413e812b93a0a3228853979dd9565c9457b08a8cb62e4512495ab044c89ba627b22e6b5b02746b96973346f7d03a21ccb2cfde7570d8111ed27f22fe5fade88cd256aab2bcd2c1329a0778b324b931d9b03fbd9a41ec161b860e82859943e64b28e800b28db506aba65c6387c9162702653e47b3b81653a403f05502dfb4bbdce7be4984bb1d3450326b94770dadec5dbfba5fe18097d7d1e850441b65bf7302ce9cd6b44e7210dfaf88a87eec6193b6431d3670f9dcaeebdcf4a713019430d338244abe3509432dd97d41862940c0c624ccb785f0b2424ddf59d203216ece1de9139c111d5bd3f90532ac23c8e134fd6cfaa2461eb8b21a178a1ea9c87ab905e981f90128c9bab4a4c1c40251fda8143b5f35d91facd50c4481ff3ac37d205d943c5cb8275a15d08076cd972ca228246d8c59257f8ea5b933a05e09ef06e62f108f296848cca9d82b66d733541c1768a5f21dba2dfdfe1b400b5b4efb94e15b1a255923db020c17cee8a8db3b800920cd933f03613de04d33ef5cc1e4ca88e63a6142dbff2c5da9bf3c340302a8f36b4c7521f13c910b2c6a0330b6638b4ce235bbc417ee7be721ba19876387b78ad9a1c9b44aff526d9c965860b404e46add946e6ad1df54845662db207a7fcf121799f2a967160c092036cf1dc73f45eb207a4c12403cff8e66ff4851e449872ff2fdddcaf84f9a7488ca34bdabc770055a34f1f0dce637f39441bdc7f728f0159e72c4a6287bf47ce2f572ec371d04ecfe133f4e1c7b02969b6962843468d012d539b6b51ccebd58db2f342f1b8f44d644a9ab3668c383f8ef4a45b4f67ce006254bd79537fd634978d30a6bb4c33a6839f56301521b05ca2a6d4e7063eb1c2d4ff822c0b4826f4c64f058010402eb571b7f80995ce52348be374f0721f206e39301cd30ef089733f0ab146ca959e9a555d17af546a3326a4c20123554af6f9cabfc0efb8f00408276d5f9f0d4b56a8aa019cd716891f47270d61f5c87e0bc63a036f36d7df1a18a962808678e0ce3a5fb0eb74845ff52950eaae3d5606663d24477e4096375ae12a05d21c6f79244275ada5174af269c7f57f97eed1c66d9be2fc3a6d8aff60e2c5ce3bbb445809847d2d9a99fe85e9cca4f42b487629fe7cfa6e82d10891c538ec3b8027769eac83fa75bb5a479b19d7fa401e7113fa938cfe4f675c8afaadbc9a69ddbcc9e874fc9cafb196c5e3311eacca2eb2bf328e228797ddef29273be545903003ade81e59fbcf2a11d81921024743f301eae1e90650bd8c3331f093f8a375cea55ee8bcfd0e788b85a25fb5e500ab64def3cd92b7f07be1f445ac683190a3002d9212953c8802078455d43ecdd5b0e6e0aa7882c1269184078f8328be6d485351d5502cce6fbd412886548010c32b43f47de36f9a5c2f0d281b2b6bf25b2e7014c60e7a5995eaf96855106f697a04d5ea492d8e87b911e33b9730f2d6dd9c7c44b18d2daf2cce4cbd6d2eeb11f03cf99b153a1d2552eade32298672658f5e8c12ccf50dd36957f0c09668c8c7ec03c56dd5885af5093ad69462fe7dd32f2417d1cd4a121b1b9c010fd7ca4db3d156739afc5956b0b5771e56c59fd67a635c773e4af3c4191f2f0d70eb98c454c86dadaafa997719ac723f6f65865835205752593adc8aea7326c71e4ca16461c8641992c3cb3274109cf515d99cd9cda3d065ff07ffd10ecf589a13ae6aa6003eef4e74070e3f0a885b2ea132cc8383a6f6784a4ed0e912c6b41b095000e2c8388f9670b5254fba4231f0e3f616ed2ca4d4559ebeda285f9f2c66063c27c2930c43105847b22c29000f43303eea39a5f12da726441509837cc9e26ff7e3716cb9117539e7195a7302bcf1b93482357de45b4f77a793c5349ad454e15ec6bee91b6c1700c5860ee778d16cd7a3af5b8a36e9768790440b1615f05a8991271d5d57ef1301464480fafeeab943d7d31582383945f422c2eb0d5e8adb477aab441077b34761da4b9cd730c08a2cd457dcd7cbe2052e439c17e8b41de898b335a9b0aa9e31a174cd9e15c5f091b3d02d4978ff90ab765d26780ab00fe4cc587f5edbf85b067be6759b8ff3212d56d3980616218db8154d06a1d4a163f461919026f3d742b1dcfa703d456f2fa34cc645b6810da965a76f16af533ba70ab78efd07f300147684df6cec0c79c56234794592d3e806fa1ac675f1387d5277820ebf07608eb29e360857391cd83c77682ad8e828017c425d916843aa0da209371b8299ba1f294e6d4825fe46080b730fb86cc060d3cc2c42418c8551241dc39b602354a1202b2df473a126a3046974c25cf8d05836823b3e9c4d843360fdc5fd5ef25cd87062b2b92b0e37674a5d635ff3e58db1024bac7a9ef7c5708ed0ce3d9846e5d1a089f8c31c859f5e656c892f212f416b4ce15eb956dad2a0660b485c43a854f9be623436971defdbf7331d571ff7cc815930b2c776892680cb1d90910c1c444410b0d8409f5725aef7c4d1268c89b6728f01f4648b73a3ad2c4a2c1930251ab8d5a12fd65d5673d05501b7112937e366ffcd9406435d19b6d4b6c7d592df665b0f2836be222b079e4582363586fe9db8dbed08a074c8fc9ff02478274a1a812489c359cde6df5e97481ac0a90500c3032b89027f2861b13ca1278ef10f9e602d40c8bfc57bdacda053db10dd2c6b62e2954857b1cbcb9829952a2e6b00628426f53b22b041f615726f82ac670598cad4d04ca803f4575e9c9fe6dffa8c220f9e20364d90de67eaf407eea6ca4f13cdb48240c9f1702e0a30a455338cbc068666f80f03156a179a98cf65529647cdf26a6e068ff2dae76278c8c85f56d619556ae934ac2cd92385fb5e4f4620d57ba662d1ece5cc2c30209b1e94a07c2239cab633f42aadb40d1b848bb26fef282cfa7ef57f76c61c880cef7a0168f351c8ccd8b425ce616b50791fa2da1760cd452bb59c2c60c1fc5845cb1f1b5e8faa7b0f8c67070fd582d2d2bdff8df6d6421c9d2fb564ca822a01dbe538545392f87ab8cf2ad3be1815efa8f41b58337f51ad1c67d1306b3d01fcbbad76aeaf0b3d9848d9f545a6c6827b4e22a005a20f097eba06089100ef949d17a36f7eb239ee40cb1a35780ee39b5c53e426173e8f2dbc3babfd008e7914f6cd1e54498e148187bf25b012d5c7f0eb2090ddb951f8f36a01a1f09537068a4d072ddf371ee6684d31b22c3f13469ba509518fa3a99954ac55772eca5cbeb22ad7e321fe96b09441a617cb61c157b2e1cc80f67ee1efeb616b2daecaab9707e5fad23dad6dd18856c012bceff01480b7934153f122b6ad4579ee71a362bba2cdf82509a8db4fd67ae36f8023d5b03a7a91efab38b081c375f59220a60c3a39461984f0502a7214cea89852ab33aace085e11a185665ee8e618ab3e7984d722faa67489f79a651a0fbff8035ab8a79645d737f3224104f7b1519133832721741c08b35622e63aeadc50361a8709df3006598259007d577a636566ff766be70844dd47eedbdf6cc0d7269c9e0d9502ff8f486142465ab72a4d7b5f6816eae59d8e33c4517f098551a52b63dbd556cf67ed7c1109a0a54cea89f697a9fefddd08b0f4e0333e6ac79e896ac1c195d45a7ac4f4e4d2681e2317f480ab471367a5995bb6fc6d19610c72d7ef0755e32139d8d8736be9df7997affa1e5afc5728d20fa9c9ca6409ba9587a60d099871cae703def82cd99409866ebc37d9c1b8f510db729f19a3f358478a3eec285ee8cce3faf2af48a285af253458ce95b8f0b9ebdf4d5b8b5d387b07fc6a6ed1f02d4c622206bdea0ecdc5a8b11ca0e7d0165873e303493eb9a6c7da2f3fec31409b6dc5f08641a42b53705bc82cdb06562e73c67573ea413656881620d1414647e1a2216aaf8dd1753b9742c6402751b5e26edfaa90525571f53d738b6951ca5d64530a0f22c3d1b6be0de0d6d4397b8766ba615114c4eeede03bad671feb6b86821d545575e18289d4123cd89faa803667809ccc74449f1e18b089a826379b784e21046f081e182caee05c653225b61f3e0f9abb6afa3581f696d7c0c7d046b3c0182dcc8688acc81c36826c98d534c754aeaccb0e3142fc2a890a36892b17d782044b9471917c90dd3a8fccc0b1cdea722debd1af90c6cdc1735f813fbd429dd75af8bdd77bb6e1ab7ac6ae786bad7027c8f743206e83bbf5060e2aaf8f4989a8a9b648bf0ca68e74695fc0606b276e47d5ffb2da06a6c31e2f7855f92e853c83673cc4c067679f25ad838f2ed690bd63a9f4bafc42006031e8c842475cfe711667f3bed9b1d85b3ddfc9dbd3ed2bb8afa1ecbc7e6c9cfe342ac5086d716572e35280649624866c4faff2692a67ebfeb9764425f8656e4f9bd17c60277486649c08289bc5f8dbe5bcaf443c9e7f8db8e31d9d294ada1290e5345ec3f18af0b598bc155d3f3b2ec75e8833afdda490e9f947e11939a5e122c301bbe0663cb5105a52a570ce08ab1ce5855424a08c0882aba1706473c44c48575d5605f848780813a23045f57a103c069d4d12e39aba7e6b0a9c02a652b6797a060acc2f8850e30b960dbf0b4b438304ab6fa7e0dcc59133390d8cc91f478fcd63ec196aa25a157e41dc1a710298b2a708966b0584e28d1ae1c280349a22c66b2430fbbd6557e233f989614bc8fb79ce5077aed9d804a1a8e7a387fc23d4aa81fb1ce117649371c91704786aa6a65e0878abf9bdaca5d43e20a6e7f01dbd8c8bce09437ee9fafd899461568145e2c37c7a43ac32e2486ba0f138a9670aed744c135d3687ef09357bdd1044457bd7ac52baf13c77c9d6baf7cfd55aebce6a297c692f6e65d77a1cb6e77dd9dae4237bbed6ad75deea68bed527537b5120596f9076d332cb515d877337d1c147ed27f9cec77aeeaed1d1bfce072a585ce39287ecece856464dfe73442df7c1b24a8df7cb7f48268cd9f030fc6005c36eb98810d712b000a3e0b26aab62a81c5f8f4eea2549554ceb9bd7e40b84825d6c552bade7293b768d0dae1f2639a9e9595418470f9cd4e84cb07e7b8af4def71238d46d58690beb5cf1c76134c892004b2ff6c1ef28f60570e5d0e30c4b5831f2104f6eb74ec292e0abe6ad26f2ccd0f76fd2e63e8f1f599a8ad5e9998d6b722fdc26ffc7ae81281a8210ebdfb33ddf2221ea6c2e689c73735c1aee759360386deb945068d65fe2ab3e8a806e3063618a791732c55c8b25e85e8b2281d85c494a34db4ea169249a93eee6ec2900f0a837401b935c4ce0cdafe0c99557ac103404fd07ac0b6f6ac073365234156b0cc3fbb051cfa4b7166caf34a2f0754b433ebb1b364a1cf77862ecd1a2ba063b8cb5b19ba21490daca4391c83d44099751d69ce7c30308acee3341f48f87680cc4c8a4fb84a263fd68e79d65d1f8d0a24021a5c643eb861bbca481475dc1634d4b003f121d4ab539e3a68e61ad53671c21d70a6ed7b75b298ea1617c40ba905cc95826fc6a95c43018d8562974a77c46b1ca33564950bf5dda91de16a40482db2568473973dc568ea8e2748dc4aca8536e80cab8241509e224550f7ecee1b67dd005087aac127194905e822f414da0c7581327fa65906674a9853c2cf2f19b517f5809efce85cc3dd150e5a17660f262dd4e43490ea69f19bea1a5606bf83e7a443a27e1eba1dd129b030f059b380830550c3798e6fa48c46bc99ae39623819129df09a61839ac945b452a81cbc79cb6a4860ae396c39bace4a4398a6108f2333ee04142ed46e59badc6b327d2ddba06220472b7028f308f4e10752d6c1e73fe3a500e11d77e56f2bb50198b35fe1c2f02cc599757a4788a3d2e99d1766b383fc9537c8771c963c12fa85fcaa6099358190aedfb6be394f33d0d352864aeb2e3a17b0fbae9131b48980d5608c22a4b7934cf5d33515caf807081884817013538803a45e7fda4d18587b69996c088ca11541d0d449604f521b767569b0f349bc2c84e2197f93512f671a5dee23f3b86de1ff4cd99624badee75c9d3451e444e14a51fe1e051beef3744edd0e0828beedc371a537cf9406c518b38ac5556071ec6907adb9848885479b4bb354098c07da6d0dfaeff973b528638c7f1a2740f14d06562f8b7ca085bbf373f54e957b956f56ab6ea7029b09dbf0d6c23e21fc05c4ca06401379851700017158edb9afa0ef507879d5109b7e65f0ddbe2948ec12fc6da51018637f00c1c526567d71a0874a5e5239371aca33ff6d1d001b1100ee19f2d8b03b53975e5fdc3dc5360ab3aa7a376ecd0cad9acd735da2562f140fa53bde46763c0bef5c7def1fbff28a9321fe6ef8384e37d0270347f0447c8a9a68c07b606911ed1f284921667fb220b3a6f7b50cfa18b4684b162d373726dd8320e3842709447a0542bec52e9c9255a77e57b9b30204de231f7a77f0183449a899a4290c82afad7199adea6ebbf6813612b74dab82d0b5027a9d8ded3fad20584e69f584271cc1c2d789b6e636adbf7cb780e3615dab7f9b6b245c7bd5ceff621c27bb715b37484fd71545132317a6374871a58d4c2afa5e71f99ae400e1084e995d383ab043037568c5896bdea1a29a4a15f325bb77a3c3ac8b1335715624b6bbe4ce09c2d1052f7f1669ab87809350c22f770d351f4c2531aa333d4620e7fa696872c2af81a426cab900544e129a5bd93df614ffdaea2a460c5654373bf57ee01b5a103cd86ca25433d0555cbc0e710031288d88d5f8dabfb31b07469cb691cd08dbf96be15b7cc7a73e4ea20b3f9dfbcd7701266c492dae64ac3f7121b23116a3156d0d81054be6f42289511992717198cd343479d44416485a0420cf522a38a58ba4a5f625ecfa5364eeeb4f3cb4ad7291a2ce96eda08c74005b71972bfc766e58b8521ff81e0c2f454f14e378ba4c061e2b58f8f4ce5f9b7ee127c567d9187468b6dc874f5acba749a807234b774473c238270f933819c447e915dd5694ab2ae0febd9ecc3f2bd98392700d9f7b26bd401e2a9d215880f28a6b29ee27737d2647399c1a011e10ba66aeee5b5f0f10eb9e87e4bece337119c961b1d73400671f47133060110b77631d43f8844333c30190062d4aae812e8c4f2703ca9fead86210e56dbf9637c63ee9a27ff18aa1946ffc48d5e4b545d739a1dfa66898c436e8711488c738aef4d1ef8c0da652fc7d9ab8010ce88bab2ccbe656382372251db130be9594c5cdaeaea66b4e8afcb84fe10e3de93203c1f4e9d8da73d06635702acf94eead99c745a9e8408b65b259e33579c1791c2686b76cdea8d7ec0f58da99bdbd743ee1b17f7e384c0f8f5538475cb0d8f4a076840abfeec9b306e917b86f85f7f844021476d496a9e4e754c010449a65ec335a3a26f48aa4b59cb2ef4336f270f56a07d62cf6ae7dae8b39b173955a0da2aa69c143a6313fa2d78ac77c0a141f28ea20acc1b16ff469f9b70954bcdcb25788c26c17807987a56b786d5347a54f855dafdd609182364bd7fa21d65af0df75bee0b31e547d007b821cd6a0266ff02da877322e370f379b14fe0fc8f638812e4bb02268fb17af4cbb1d9139442ddeab4d771eb90530f63ae1d68caafe927dad7c1b072a415087d99c7c0e83d2869ae58cdbcaa396c2f961a75db28d2874117b87a9a3ec035d6a28fc19ffe62c97e37a6056adc8e0437101490c678b5980e0df6ce1053c0006c6656e7995d7871d4f3bfad48dfc6e8e1d343961b3b3ac24543bc9ac84df0e482b233e6289a77bb3d711199351e814094dbbabfca34fc3823c9d62f853318b8f3dc4bda2c099843e0b7135500d2023b8b2e978cd7c25e3c32a7ba03e98a987effd21af6c8ecb6ba4cdd7885a69dff224115fca985f099626f4cca8e79e361b23dcbc6605427669645a942be1b0b1dbadd05be990c1b765740f462ceddc13509002c4027d31145709cf027a34ef722396f759352eb156f9ad5117c8e405e6eae8d18264dd40a5f2371f3b227a10e8053156a77d1f00fcc722709c868e6e0dc0f8e8e71a7d836e07a5d7962653a6a448152c470ee9987a99c846fea95a91270e16c5c845ae8cbe52c36036797578e7d187559455c24a9cd3293e88d187f5803870190dc07d0e50520d19a925ba20ffce9b944a6a1ae7fe2926b47c07f5394360c00d15df0df76c460b4bf7fe43e5e305ea26551196503a8d0784b8088a85cf9b7122a1be2c6b4d6b8aac6278121bcb6df67433bb8082486767328026f8d63f14432c8b9d115b229b046467776cc0e96d8593a4f0996da2dd44a3d243cdbc9ba74d0893d6124bb07f59dfaf9b20773325a214ca8efa59231f877de9de1c59b23685ab9c2004487be2caa590f65134ed9a4146e5c0ace8b1b27fd3d878fd076224f76e8c9103278c5cea5e9be340562d778d83d292c932ad6a7610afbd0fda0fdefeb6fa40774d4bce56a84c023961c3b162e5a6f7d782dd296b6ac8136551dc82c37a6948291e2910822f490c09ca8f8cda08c9089898cc00f62d2f0e8945bea351db5da1fe41c4b4e4949e486a4eb18c1e121c38f18630f447301d61e031b5799f1b6b2225b9c125fca7d5c4fe5ec015f0aa06b9fff76a6c0994986927eb9618370abbfd8644bc299df8a56249f290fc7de633187ed07004d7ab92fe8f09b9a28076aa0a73757448586731066c2df202cefb610141fac16bd0cdf1d946284113464d5d6d5bd06b94a12b7999a7254f593e88b4e7bc44d88936def40acd80beedeede25aa815656f340cfb0c092393362cdc23ddebd5478a5d14be8db0b85bdc414e917fd2520fe6a0c0ac02f2142c8446a06539ede84fb50302b951422c7786dd36206b32648004da3ae15d8b7b16682b7eb13fe4a4941554444f78e837afbf6c443436f290761930cefa64dad78798bb1ca3bef54dffb178954819fdf1741e4f53cdfd89c698e3a31c610f89dae29092c8fce941bd21b1ffd17fa833b263bf262d985777bef2b8f7c98c22881f8451b8ac9df03cff692570d7644dc250b4aa0dcf1496755dde8359ee17153309ea60d9d102b1c7d74b16b2651d264f0a3b775a90193266f62c4f14b1a31034ef41d963c736df4b00123ccf8fc008b262cee2317935ef4141c60287777341da011d5bf2ba2d23e2b3dc69942a2790085d5fa65116e885496502214365f126678f1e96d903b9bea8710cab4c0ac64885df61de06e700d507a7d2f22f865e062a590e5e078581a01ae0f58a3937a78611815a6da8cc1de712ec8f51864981d52612ab48413c62cdc885aec5b71a3931b48eefd9d708cb747a4fe35b3a0aedb3e9d7b26a9f1484a47a213867f15157e2403d41d90a3a8ff39e3ab738a40617a164e4bd71b1c3a75c32dbaec4717db7febe1653bb5d90c335f0bb82fc81add0c1fe613974446ce24bd48407f4cef23a60063e19778b25cd3be0af5393a298326c5b12c2a4b7935d50589736b494582fb786fd62316f6b7bba09294bae4a4b8224bf4102eb067e5595f095566c18b94932aa60638ae5a299d8ba8948c71702a356dfca6319d6787ab9ff9db2d196480bcf7483e6357d8776ce700b045f69a3b83c7690c54bc45931ad9142a9f500838c50828dbfba4829f5cb96816d9d38cb851625c397352ac666f2cdf688bb1eede289ace80d276eb225af4f4052a29467f7a24b77106fb2154fb71da3ac694ac3bc46906e54a7f695fd341297e586e5053143ae22600e7a82cfd11a7d7facaf1c23e2dc69544eec7f0e511f7139abed2f6d7d1f7fcbea18497f9484f5e0a38cc2346fafbf033ed286707bc5cc97a621ea77e3406f53a331fd4fd5eb643ec60df558eae1fe4de08adff937978c3bfa4d2f20a4156d952be9ab4f51e9719e9b33d34f2061d3e2f956255b4b0643851162494906402dd17b2c04d68e7ce5a65425914797640ed91e6e3d8d7aba0f4915fa4a355572013fa18abad8f70fd8645c27f86ac80b8ba80331e79f9e1901678656590c93096d635c4d64e09e906ad87a1d7c5a52d031d15599f01b8230f4737edb7f2623ae22047fd8c9074e9b9b8a8d9aae7538e6ecf1bb772545c8cd582f76994737d691ec8372e2d8e755faabf95d01566d6521b1c4001813a1ab0c46237373a21bd0f1236f64fdfd28e5bc23dc404d993227c1f98c202d34ff83526de75088dba4de2a58d1a430a089d0a745a0fbac706f41c9e9793f78b8fb72ef8903927fd72404a82a485483f00a60a78a58f8ff68f798c6a3bcf834204d7f2736bb1a8ed93740136929c01c7b789b867bd82fc98f98a6ac2a3d55ed0f79cf8ca360def2e3d80af00dbd51779ed732fcbd7a8111b03b4ee54e62e55a02e0e5724b8aae7e77d33b45a3d5f9d8aff55c988f66850c27898c244a96dade006d7023e2b4d03154cc7474b206bcd7436619a9fa207788bca8e7135b9918960fa77862db313d6b5df4ecc4a266a6d94e1bc08b8bd534e71cce7a9b96f63de77fcc5d03b177173f37d253bff66292b1f56a696ec3ebb9033ce26c7a5d2c6bd21f9460064bb072e353faad7f744275c230602f3dcaae68f8db2c7cc4c2bf89d486a01e5c51c260019d4da82cfc490f5e785eade26108d2d1b556156882370157483ef52011a157cdac2362ee5bf03ab90ecfecb1604a61bd72f97806eb811c1b6e18613b23548d57098079c3cef0bddac758303b7cdc899a4846b68bc4966037ad4282c74a4fe9bcb558f6c19a662202275dfed490b128b8eb1e261800a65fd32b34a42daee25859a1128a16cf86c9d1cf7fe985f2e130e7083f8b980fc1085d6e25971d84adbfbd179f5380e8a008326f9518866828f081e870ea8c2959051c59d9d2a18c09a5512783089f4f217cecb172b12bc4a6f0d52e44998c2162933044d5c9990226567513e2ae98e73f7de67a951ca41ea3fa2b9f56756c4c7f26e65f6f3eb7c9a20a261a8f3109bd858d012f94bc97c83c5adbae4a60a8623e91ed53b3fa2656c787abbb85240adecc25864256857742949a14ee16573de3287bc82a0b7afa77927aa5dfbb0b24d7f69e13fefd474bfc24a36ab909852a79d22e814b3b1b08c7c2877e6e827640a2f04bb516a68334ea184a91ed2ee04ff2220ea692a3b0ff63327800d2d2e2a8e4b04e60fed3e8be0982a0f8e5d9691b8530c1bec839063908bbd72bdfee210963e6f6d23dbb79cc95804922ede2c4083457fb4a490a9a494281257639a7b03926d4a25d8a92750ad6e0801427073545729249c0883f1d5820ff4609196d804533261b060b972c326e480011b4f2293e1eb847b41253e301b9aad19e34e448bee8edc23a9a054e9fb3f5f72e1d8ab2eafcf2c094cefced2a901d55f8b45cb225627c56787a487d435eeedb3b804d2da19371533fb831aac0f7a7bedd93d875c38bf8f6538da0d0eba65c784184d2adf2bee7aa7ae4455875e6f9c252956f195b848bd5982c58fb30da67e4ad2bbb7e7ca1e6f3a465c4e676a2b93c1085f8a80132bc7b6f7723dcbe239e72dc4fa5862425c7b12a86f53f5b0772614b08c4ebe9ab517cb5df3e0662c1193c91e9666cc3a6b9148b01db6bab5c36690f081fb48a552bd61ab73fe65d4c6192674f08ea8c764c4d993d661f1a52835ff84c6d68bf0599f829d77d4938449da80cf9d8853f9331117d4ce9702a03a196a1aad3085225d0e1546adda52ae909df79fb2658d386144c5d92345d52bb65c7b9de2c973c8dc5ea810fd1259ef7b45e54fb43aa50314931d8ad7abdeb9ce3da950c38ccb7205dc95811c4f0ead999453fa945b5372566f0ca3e3f28ab221e8f848911bc0aef239ea692e142f136b7f53929ac0b5bacd69ce6fe8e4dda0b9acc9f3bda2f5624aad4dffe8cf701d514be8a54745c014fbe8cb22f5177a146530d2de29dba52b2e882862a038868e0deaa235feb14a99950b7611f72d57d57944a7685f34130029d2c2c3d0d5ca9ad3bdc4f4610311e87258c19276bce586058f440be6a48d470f51c19c6639bf595ed02ddc0011b17d1dfd2aa729451092e3cfa3ef0219a66120162b3e9795f55232fc6946b0851c82a80efaf14d8369b9b7ea58d7823515f01bccaad2e71730df20cd8ea1bef4a5f5fb2abbba4f41664434219023fc591030e8fd533f0072cfd3668f2b2bf38a385a088c004c384f3ae8fcc364382f489c06ce60e8c337ae0b60f34eca2b8d124c6d312d8241d9e7df9598b1e147c3fbbfc8f2dc6a45d8fd0c048b4bd6e24b77c04b71e04a954828a5a330c97dddaed9750667e5fe7542920ac295ed4fb5866a0375b42a7575cc3b5cb684fbc0aa74bd0e7b62db9faeb9715b3ae306a35f3aa0b1193ca07aa710733ffd64e15224f9e2d42ca6c21a022578c55c675987dd375eae447a7a97084a51c7cae7c74459df4f873ebede1e72c68a31297ea5252289d28e6155b040509b739e6421143970584ffaef2d56ebcc1b1ffc310cd20a0fd7358fd488e83b89dfe410796aa3bd3eb2bc6d55fc3f2a1e008b6a6f933567bafbecf717caabbb01604a3b6de4e75b1fdac45d55b94d68e2e36aeebac012eb6efc752c35d70d633dbeb3d9183bf154f538aa7b92ba5742e2abe7af501064d5f7c38a364fc6eb17ea66b7621561d64ef0c33407fc65235f0e434d8630734191ee9933846be042e0292ff9d19c7aa26e70073879e3d973565d800d794459521686870de57888251d4f420577ce7ed02acc8f87752455811e46066c82c33ca536dbb89f4e70ff78e5c443f9bee14b7019f7e2ca701b841ccc9316ec08cbc825b1811c624babcfda0206aa85ddbacaa4e9c95274c5f6dd32a4e32f17678a0eb4989863ed418e4c77c5c4245d3a8dd7dab49385dd3e663f046a890c6eed0bea8ca312a6f49e939f6ecb408dd2b2900168c2d0c5ea9e88cba7495d39ffe9a2263ec651c2bb5a315f6aa708e2db2b89dce8160216a0c4c8bd14f3d535315c466b018210c3d31f465f869431c3ca9ec1910028ca80df90dd27cac9eec6c0da18700d025772775c9348f64bef1b49f51e879c4dffb8be41922f2e077f220f95b3aa0aacf89a07f82c9260dba7ac62b93aea6f1e1bb659126337b324d387f35118c0c1162af24fe000b441d32d9203d4106e5e4136d05d51d7490beb06768e8d9b5b2035bb8618610f79cf6a10694af2eacb57b740ecec3d53568a56c5da2fe2431995134f044a4564637d5c4aa0664fb577917bab48a6d1a57104f831b68377b2a9b5a627bc54a4f6b0fc263e4e1529b9c888c02d9aeac42549e8c5a69033ebe45554fa5d10af5336873cd23fe900c95969467384b30e5bea78a01c0e35beb13dea287bf67781eed641d5d8d2526a017021bc2f242818e29b872639ac057aa7e2e46ea196877d18205185fa157834eba6ad321bb5af0bdd536114cf928ece201ae1a2ef5a3af9d0085d7ee57627b12b2198f64d39bb0efd746a1cb4b0775efea93ee4542c9a679faba447c74bfe2b3b42e96183ce537a284deefeccc2bfb085c3033f56739068fe18411f7621b6a236df094aaf6b58f050c3b51f34a8c1476b00bc2555d60206e516de08af27a9ca62d762c8d1a3fe0837404d6708d77802cc1412de75d72e8f083353427bc753addaa56148b484e5b0e9a11aa9cf657cf452059ad3e53037c843048cd7c3cc09474f92d98a32ab9b2706e97b59af0e75d25d516481bafcc0f707cdb4d8590b9b93d77569ab2167620c0ca03bc97f74c249724ca79d174d1c8286f45c5e987fb4f9d9b1063aeb974a60d8d138c45111388298c162ea910f3e216970fa7d83a79edba58dbdea4e72a1ddb83c175639a9f7e14172e18cbb1b6b0bb86978d7fe120f34ca64999a5d28d9da402ef527e39c0a8f19f7505422a780ea8d40af437387032fa206aa3558844b3ebb7aca1f0e2a720ea28749ddb6713294c94e95d7fb2b93e877f30f2bf0b1a1397c5a1ec15058674330b27a23d02f1fc6904faf7eb81df8768e4f024da7cb486c0420131f72ab8dfe66b24b192800bc9af657d048f680d101284018a63faad50d7bf93053cd74842180ba4b844b8012b67553c0f3d6ff81247d43500af78ed6060cc6cc93b54ec6f5bf068ac8d7c22d260ad21e59895f6113072ad942ef1cb74f2cb7c4f54681d2777c9a2e195381b99ca58614a05f757f073b7d0d1c8919fef3fe2c976e69ce8321b7ec3cb7401b7ec0bf85e3ee5bbc857d1a4ea49127357b76db4ed6d55d43abfe978a0fd3232bde81fa9c95759f85d1ff6bed3de8568d9849454e9a695f83aa4a30ee8d1d9cbf9aab470121f5744a69bbd937d0ae1bc5c66196afa6d73720229d8288391dea2387da23bb31fd4ecc820c13ffd6711d07d6a1809f95a5978128c26fe920bf9cac61404d428cd6f81aa48eefd100324d3b9882eedf4e2e612a0412cbbfc4726bde32812011be3a6b7a6a7d9688f020e0865aa2889867daa37dd522de90a8e012a6c8a427ed90ae0127b46270ae16bd9aac28ccb58078e0d921a80b65ac7bfe782706a269fb508ffad1b14581af3f9e5d25cdc87a106a8ec9370e59d164494588a08b36af4664dcadc8f844c622365973505939799f90916c3855240d0eb050ff76e9d86b9945e9a0f4d635985b8642d4ed3904056358310e2a5ede0e17bf2115d3e009167bdaf3e49e15db9aebae09c60f21552454a101bc7a327898689a98521a494d5f4f40a8d42d7aac5efc9a455f324a780cf2f2e5ce50cc707847e7426d8853e26ec1e36bb514f140dc4b167a08656cdd91d5574b995bf402e552f112a1822c3f26d48a05f6d469118bea3afc5099e8c417150f5297f4c822d3e4d2856f87cc3e61935fa52003ee2d9ca2a6daac4eff6cce7d48e7d58b6f002a78bc7894cef7c50c8f8b1eea8c03bd66c8af5944d7f9bcfe4ab951413ae5e446067a2357705c407c93cced1d2eeeab4d8ce0b58cfc2ea586d9b75c72300b99254e30fb9f2489fc2ba69248173d9163c314e78c8e8bad6f99efd61fdd870199786fb18161d93ef076bb2c9b0ff7e1940575158d1242a9c67d9224f727f3141b7da3d828161dfb8d7ba048c2396e8104dc9f185abc41ffde9fb7ac4f14e78622cc614aeb47eeb208263048d0018bb17fefc78195a571c96211fb06868157dfc0263bf50d0880bff8966bae74298941f2055451c9e5e82ed69a1e6a56fb72d70aa33ccb12ae4a06fce06a41c4f4f978d7b9c9eb2ce73c7ea22dc2cf9c2a30b2cdab0aebf9d1ed1a291c898dbf6b9949aa17195f49f4271cd061083c11e153e578c7445769842d27e59bd106319ddb61d9a38bf2a795e63142fd9f38780277055685ac643179b98a3168eccf73d91b34fecf5cf3ff0548b119389c48ccfe81d3e1136cbd14362dbd60e74caa92debee5d50d522cc5e87f43c367b1c4e52c9e04f688736904dec5535a832f700c7899aebbd991e76afaf8400763ac6481d62cd8afa001f666ae5e376e31fceba6a99550e4531ebfb62f933554d9698f34ce45cb5a91290c015a36763bbd0e36640791de29c9110ebc6b1070b70badef78049508f994a296aa943b14a1ed4e335bcf4196dc1437e9a6f348861e10f4806b926dadadddafa197fad8dfe11de132d49d7a3a5922de0973d3739dea620130f111f4766b1dc63e0cd71730d77d5c5d04082de72b36676ae0e18d2796f41e766b6caa70d82c26fc2a6a9921e7e0822f6ea6de0a2c9973ba550a4a33b7b4fb21ef7dff05c318863995491136cd6eef5134eaed321db667e18d57d378c5a3adbdaf68d5a7286e6e4fb8f41641991482bdd056083efeb13be655f5f6afdf65285059c2ce9c994c2391d9fc869fd5700d7fed3890ea7bfedac3dee3edb0d7efb6f6c699c91a7fd66dd5ada0c1648e6991d472a23e936532b5ed12542a0f9279ffbfa569e7676e4bd2b853882d960561124c0b7602b103e31e98acfdea12f85dc222543a5cf2a0d1d416add68958224063163da7d891e682eeeefcbbbd16e6f3fcaf747de370c83450c5ffcc77bc9e746cd2e6b6c0e4af6c83869e66698a8ae686d7cca7032e793b0725cc41b7ba7a83f8b50f15ceb4ac5868d45b5293976aecdfb843e01eb21363419335903d84877581e899ee055c8c9611394f6a7bb5f488d55a630bb034a91f7537d379cf947c38016552a4330fd6eaa627e6fc07854db4127d0e1771e5f005147d3825cb6b9dd4767913ca4960c78ae1880f47ded302b56f77250fb723a846aaae8ebe8be67bb701fb2c46605f318219269fd9d1f936d07f9d0b3d9243a0cd2784e7e32b5e712cf8ccd403e604217f96920fed50287d8fdc28ba12a34f9433479529b469ed41964676ca95c5bb4e3cc5d6072a0265b81804d5508d23c05a7ce011b3870a7949d4ba2dbeb42ea6e1950f154c1d96ea27c84841988e1c992f573e43b33bf162b80aecc39e0e9b44e00894e67b6ac1a47fd73761f904cb9b0a780c695df2935a4711506bdec6c4e7f9623afe6125e104bed3ca06c4bffc59048e680bfc8de6507b20cd5eeb33ad1760a17fd0e7f4969095867c12b22772d7cac632731f3943c661913f6d5f67d3e630ba5e25ac19a95779f7adbc24c6ac86a37685eea61f1d8225fc2169398bcef1f30c5f79dcbef16336daa7b14f208780a6dad0c678395a60d5ae4e87a45ddd02da3f59efe3d5b48735405faa4be847d0f935b2ff2633abec608117d12fcaf4c63df8bacd0670906b87f6e35f49d7f629ef5b6157a4881acd0ec872cb602db9069405f5a1a9f77748d4965a650e90bfdaf92a97d520198bc9d2de7a0c1961691d04e613762b79eae46b402c55354f71f4744c3644c9c1c8f9c79614ff948a33a689fa3a0919676912259ff71853be4e315dd4b76435f210e789d1f58e2738d67f54b5c0a77039a521caa45a5cfdfb8196568dd4a845259d8439955545990c43e1f9b0b0cca4c293863ea38f295c2fd8eab38d9bfd7f464a68afb1e48839fe0d2ad901ae1218cec9407f3bfde259270553e8b08dd9e3ffa32544aff1671eebe318d83d82665db5844308d847498536d018c96c661613beb2cc92ed9630766d2ea9726080aea40066eb27739a317152ca94452f6fd1e41c0a4c3b87aa02c2e7cebf39f0cce2d642eba94542da773a67446b2aab4851c348214c8b0c51ca564909c6851281a5b35082a019b6f43379fbae3cb794d47e66a7d239ada2b6301f69d7b66fa97ca923f8277bb09a7d7bc66a9eef3cd4ac64a1eb22051180e761e324d90a0ce9f32991d10790b8177dc8c65e4eb2bb7474e2fb7a0f87bcd974771b15ca8102e124a1a1c9a3336e649cf8876c49a179f8338ec377252d56904ff200f03f0fe3a54377909f91b62cc9a61f490f4b8c09927dc3405a57bee6bdc9dd7ad5b8292b6cb92b4702f2c742434005ca0177933a230533314b8d7206ba81df857a9ec7ce82f76d8a3ba004e29db5e44f4e5b08670a1552339c5a81e7ae540c6964964e58d870253ab5b05dac986c18b010cc0377c78692728f4095e4acc57d95b08caf318c6bea42f643dcc6348568ce1966b6fb6d122495782850120b7788cb85bc45af115a31d78c3881744831c3ef9a166298a5b3fc0fada51837b0714cca2ebc3605f1bd54161404e7caa0ae0cd4d501bb2640570fec0a015d1bd07583bb7210570decca415c31b02b3580a1b7b5bd88c06e6e4c5849a9177439e16bd525c21a35f122c7aa0da694728b351dc523154a44435c3ce8ad1f0674ede0aeec9a2abb8440f19e5e94e0f810186f82f1402ffb3918d706edf2131c9e78201ef8b94a7ca6443cfb363a2d0d358d13640f0549cb9f7859a7dbe18e84b295dd67438e89827f8c48eb5d6cac32340c619be19060634e7265528459d30021a2233aaf940f45c277ddea98adae59717fe175541465196fe6fde619cda4dbb69ce977004b38af1c9e2f396bcc578d6f791c26eb8a854b2abc2bed57be23662f360dd9f24de2d1b282ce856abf93f622c5f4af7a21d09203467cb60c7dee314ffc52a47f193435e3a103739a05271d306521aa7f00a5b8fc3a9a57970a757d84a586a8d244310535d55120b192e7e954373172bfec598244248814c68b920eae265128935278f6e452a17b0d33a37015ea768ebb153beef89d247d5d48c31d95f905f278bf553ee791009b7e7a6a624aa3370ec58197da1f3e114e4610bef31411c264259bbc7879307b031e6554caa472853a0758560b778d86d051d1040db8ff13868c782fa8a8cfca520738193dbf8559f6865100a06321921d7fc0670c632fda66ff5d619970240eba08286f099891047884c5ea13da3e6f29ab5de91ffa269d09db9947e7ddb49f1ada721b915c382356d7bc10bf5c21701028a471a71a91f2bf0bd66f36a6d27612629860b24f88cf1926517bde490cc2c58b7fb778d9239014180e927f29f2fc29933f6b1773c698ef1cc5d86e756257daeddcd9e7845fe8a1116b273c4889b83fd102522b760c0362f8c3b8dd127f81dd4d50ce37560c3840c6e41608688edfc78c3348abf0a45de823d4a80388bc491d6a99714af6ab074f309de9f172707aa0904cc8abd161e8eafb633a141aabf4cc67c4c9632ce6e3a70c3ca648aa0d199f68aa2c244fefa4540ce9d593afced69d670a93ca463f410c89f6bf20e38d3e6301f4c3040aa52fb85a309a59a503022bd5a09bbb51269988adcc54adc38436d062eaa2f12e466ce94c03bf9ec512407b98e56f2fa458d4da5187c3f0bd59e78f54666733ce60f41d49bb40c85f1e65b94007344d22b0212209d97bef2db79452262903dc0b6d0b480bae769d9f1da31058fa0d6f9c94052e3d7aa63b3e1a94089803b4a6e6364dbc2d85057206293f8f35ef9df4a3b2abb7dba8f20b695844fbfabb381f3f212c9032b494b0c753b79976ba422c03186e43e20889a497f19c73d43deadd04e9bfcee5b0bdb003469e73e9ed34879c4fef5cfb3c9f6e33b92c70fe4affed87cc4324f570f4df9c0f39af34c8782f871bfdc2eb1789a5a7bef9f5b9b94db7f436eb5ae6e204702c22ca21da79ea9d739ceca6e7f98643c66f5cd6808c4bbd1ad7694b07f52b3be772d81e177297fb7e0091f15bd6808cdf7ccb1cd85cc8fd18614c9fd3a31761687eb54ffa0d65e35c59b3c0c59aea1aa40d4615275970032a3634872f62229468d3a0f4f97833bd5b33777f34b77000f23da9d7190427456f01031cb6ce476fe10396acf84fc0a114fae82d78a84208128a29c17c2cea81d20b217d2c1232fa50a3a2c8073a5f249453e4839f36c2e8617c2c3282e79170010f123be420e10224ed92a14da2cd596bad5202517119a6c1a64a2811dda149a494b5ee4c1e58d3f7647af2548908831505cc82020e3bf6dd4f1aeca346f289252d19b5f0f82c8f9fc327cabb78fc16cf19625242caf11952797c168fbfe2f1531e1f7b7c94c73f2df9ce959862b09da09ed7a47c8e2654fe7afc2c7e05fa1c4e947c539cf2ed8e2ac22daac0e155eaf9abd4aeb06153dab5f44d9590b42b160929b52bb4b029ed0adbe797e40cb15df1274d7cc5a021a376fd340d7db5dfa4aca75dd115bf1c663e9ec39b04861c5ea4177278a3b890c30c082687d9d0b77278755e727861df9ea3c99276cd233e7e8b2f4793254d7c9af834f969d71cfaf8ac2f47939f26b126b128ed9a40f8f8ab2f874f94a4a429ed9a467c7c972f87cf149f259f25a276cd1f7cfc962f870f9191d193764da18faffa72f83c393a6a6ad7f4c1c767f972f83435c9699223d4aed9838fbff2e5f0111a1af2a1d2ae59c4c74f7d397ca8f830f930f94869d70cfaf8f8cbe123c547c947c9074abb260f3e3eeacbe103c507c907a94953bbe60e3efee9cbd1a42927c7c992764d1d7c7cefcbe16489131f273e4e84da35813e7ef7e57022e464c8c9509276cd1cbc93244e789cf04869d7c4c1c7b75f8e265294949a5069d724e2e3d32f47132a4d989a3039f969d78c7dfcfbe570f2e324e624d6644abbe60d3e7ef6e56832a5c95293259d764d1b7cfcedcbe144070643d2ae39c4c7af5f0e2748767680da357fde095050500e274ada3585f8f8f2cbe1a4e7a397c3494f4fa269d4aef85409251f5a98dce1b13ded8a2f3f164159f261a61369e85113df4f48691ab744441aaa347fda455944c0477c7b8c4a45dc29984a689bbe2f4b4af9dd2ca34793e62a4d19a549d33094d2118c2a7d5bd8b41606ab0413df2e3bca1051a65d073ff8ee22d8ff44183e3d441a171ee3a1ad410c1e5a213e7b6873f0ed5769d2b8c83666871878f8ce79063e2c29f05b1896026ff9fa759f8e354d7cb5d0b77f14c213431fb26072c06e619306c66d4c466092e9abbe7d356491aff2e5d4914d0dc6bcec9f8eb54f83303e95a9c2bc327550bbe255ba4adf5da794e9349821f9769bc1be2d5368614cdf16066b7b041cb60fec832ed696bc5f3ca1c789181f308704da03660102cd01e31b4825dc7d2c62520379056ef958c4440548e0958f4541344d2860978f454140810a4130d18324fab1e86787125c5aedb458c59aa9897184168090650838c20747d3652b9d316a66f4e0049aab072df03e16158105155293b3a6b26ecb6cb2a89d73cecccad820ab523bb3be75d3e69c53bba91d58735e39b39eb5d65ac339e79c73ce4993d92b2f9ed315a976e79c736a21ce177184c2a94e9361c86846061950a9ecbb7fa78e0da4f04ae6752c59f659292ff0df8fea99aac56566aff3746c208557dd712c29a54b060364950ca972958e6a092d6ae7e138d2806aad35a334649a4ddd54a599b5b5d6fa5de09b9fda0095526699944b98d0a2658a315619da7fdfd1fb94461c7036650fafd37b78a511072ce9d62d51a669aa77f61fb813cd92ac805f3e161511c587335309a7904077807110aa28c2065d037cfa585444cf9c52c4cee401ab3e160535cd2c60968f4541522002a73e1605215101e38f454146334345413cb587cb82832376f00f3b2b38206207d5034be1c08724272062180729d8f1683084a2c243d793748a420ab8253d1e1149f8b02d41ea88b8410f9a12c7c30b6ecf5644440e30c85e3458d2ee8c1556602fbe1dfee126b56006414f92009134846406b0d84e4f8c0718d400a92806db21889d2913ef4dd00e0faa50e443a5c82788221e28b59c98be3443ce9842eddadcda4a2badb45ea799c665de4d96dd6fdb8c80ed9625ec08ecd3a5d174199bd60832075602fb31f1be6623e0ad525a378fd239718431674419fdb3c75bce061ef4b3c1460d0d4ea7323669b8ec5bd63aede7bcda74b9048627caa7632fc718656ab699f7e3807cea9249e7f463e265984f1ed386dab18c80eb8733be85363873c072faf6f2081c9b73ca9ae9a72c300bbc3ca41e01552081d773ce395fd42d3e22c00e90b08325df5ea7b36610964af073ce39e7a4aa17befde221e8a0c937eba3e0185007b0ff7e7adf1955fc2084279c481103a42982f044135bb8e2042b70c1abbbdbc9b715dfdddd4de5aa3eec7e4e9830c6054539a0e2a7e3e92c2012fc74074a0265600421982005195c01083a884f5ce1b3821e1f9e2baa6832850e3c2be0e008df4eef6f4ba0d6b2667b481b05d44024d3370d31a6b70322997a075c2c009ede5581c34ed609a4cb4db970665583dd7dbfdad5daf59ac3e9aad6be3b65f0cc3156cf72d7a0aabacd754eeaa29336d8aa76356e2983745537bb8e9406c1557d7e36ec6fe198aacd00f444f3a5726996f9e8a311ae99b917d6c3613029a594dd63ceb993346f4e0b1096334ca5eb730ae1f661effc9c54e8e1670d92730a5146edc155e2c3ac870a3ffd7eb687c60a1165369fec0748b0ac0f7e7a4fcfcf3a54f4737a7881f85983e40c968928430fa20cbb840863fa84d21a0d7068a1fc74db732fc62c96b43d3f3dac5b883440a2cc929c010351062b4479c552c8f25158f1530a58ba475bb3207c28756cd023c2906ebf1bfa7597b42892e96587fe821b6c29b30a77543a95523e951ceb08dcaef3334e19a65733bd4d17d18e7a379953cf469fecad5a76b2e18ffb83fabc7788d387dab8cebb57de3e31c118e575dc9669f50e69d54f357bb684ae6f105c8c09e9d0b7ec07f4cb738e9ea4807bdce0c37399c3363a8a512a7d8c335105dfd131106790485a3a286d30b6519491797340fef4b9f75e198444ced04924925377123943134919dab34e226d9f98a03c7a11902f542e62e475ca7467caf04c1a1ae4ace6a13d13c868c6e6cff4219233cc26538808a39f05042c3d9c3ede8e57acf2387428a322b10d119625bc5cdc884a88d710d28b442bb4e0c3d2cb483ca20654a078b9e4217e6c2e73cb7abc0125a53cb96cf1d317f27894cf0fc8cc4fe75abe1b80f88a87518af4995b9eb7b0c757b9e7f7bd6c93f21bdad5e22b2b53bae72d8e5a41adb4c81629575a3e7923f5d168b00588976d86f01739edfec9b94dc66f1f8c8337599ee310a5dc1065c8db51989d6fe9e85cbacc3f58bcf3f85607d3951695afc83cbde5f3d152b97c554b956f0022736013c80d0d4a595ac938cb9373a7cf5b6add689adf7fb7b94143891c180e44ec8785a49e50be254c26e9f17185336e4869cdc468b01d072273ce68d70a1532e76f87231254c6f87c58a37d1889987c9412c41351210a4e90a8420c8270829710a4d05112850972b8e2c5e241102ff891c10ea438c10b07e808323881931c1835a10aaf302efd9ce0b3f71dbeddc6051f8b7e64f0edd707831f8b8480e2573e16097124b96eae1481a3f7294726f1232ba0348190d2c7a499d155224de30de520699774b96488f634f1a1d4d188b0850fe50e118ca4ec7929a58cbd6cda351186945e83f4338791c9595bc051de1065bc0c8f6d9033d88f4c78b2849c5718937e49f4a68f8eda01962e67882f9d075c8c096b8c3fc819eeb76f728621d40db0ccf7dedb3344cf0f228832ed522862058ed72bd2648732263cf4183c555dada9691a1749363b6cb82105393ea5a657ba299e51c1ce03e131a46c1bb41b81c31a6ae79c53a6a646073b2ba0028e53686003534c310515173502992377e69c9d67e3d429241cb202a9e7dc05c7255183201ba23cc54212349062838de1d89d96a1be72dae29ccae9cde1fd9c62df32d7282b53c5b6e54d09c69f0dce5b3538540d9ce7dc66a2dc66ee40c91da2abc5b387d6054f2d0f9f87d607f7d0cee0551e5a20de3679ea2e3e9d2136d7c15f2edcb1a366a4b7c32a168cc754db61150bc639b73766284775bff8dcddf310f95f0e3747659ee7fcc7e62b49a74859bbec73d506da0cab58301e9375361d399a44fe8c303820311b0aa5720e6fbee2be244e9deea03245d22e3c9f8043b0e55b39872987b9d5571341ce73f6b96a73f1c58800260070171f974d81392e7399f23448398e9b91f2b40be5ab9619cf791e7a8ef3ef8b9173ff62e45cf5c5c839003e28cff9ddb6d557d320e7311ae468f464a0c0217dce8bac88f2a1dde9796984a7564079f954c9731be7d5bbd9f24c835ca63ab2d2d9d1a29c3e2a87467ea2dced0e50bbb8ec3166477d9e671a4465aa835537d5792cb262ca879487a75d21d551d2d3ae70c692768534c9fbb4abe5e10d312b5335a879b63b4c5cf8ea13221f678a24890df3b67278b14b0e714b0e592ef28cde32d569574863df41d4592c8c83b61cb354d7a0e6590a37d839128dd22ecda9d3242a850651ef084505a6e7a206702c9a02fb9f246220f49b7349c4e0c96fce85e06f7369f3d878f388f2cdb76df3e8dd6c362d009ddb5581e3c7a601805fe7993400c8bdd28af00c1b1a2f78f46e60709b9e4972060c4594114574b9d3fb2cfc2c0f59cff21869b228b339cbfd9b11dc1c7fa86f73007c9bbbf836e73e946b31a01cbbfb5b41ca6ff207c7222a849e737f2eb512131313636388c163dcadbbe75052e758dc51284c03ca711e22df73c8f9e63f361456c2f16444edca4e3d336a1a174efdc5ed4e121eca83dd858c4f83d463befe69907a0cb4b2d01cd84079408d408740811093688ce280c630a6314c6398c6fc9dba639f396f1fbd0d6ecea35d2a1aa3310a4483503936b8b582c8e77c08fdcd83a07e430d915cdef28e06a9cfb770ab645b82bfee6990ba7fbd24eb78b42bc4ce43556bfc880dba0b914f81649cc0b1cf3d87f755391f0140e322002d8820f5b04e9a00640b837c0323003079ea3f04cd6077ecce66c39fa3dde613c549af0676192770188d7e08918ff30fec42e457a0414a6153863aceb0962e56ea9ebf56d220f5f91675eec301c8e703f6e5f052dfbc1af53dcb588139df9cc6da85a2e17d95bfb8788b539e95d395e34c5f7017be50be0b8fca76472bc29cbfe0a1dd497576c7ee4419495e50c2e2e15df110c32451a08f063548bdf3b89d49332fcee1c52f641a9ba9ae41cf4f1e52cb439411442e718e92346cce39f5746c6ea9db2476730e0f918f73a8b90beddb379dfbe2c37c216e517ff9c2aec5b7c3816cf585d4c5ee3cf5962f54a968eca9df983433284b0eef4a0e716a263df5f6ee74d6c4197327efe3b2efa30dda4fa5c2c996bea64105c752e14e4a29a52c929d529a0017605054e0e921cc5bdb0dd9af934aba5a6bed22102a0c9640a930613d3a5767add465a78f8aa458a14fb12229a2d045522475d6dded954ea1ef763ce79c5ff696815101a63011059b137ab4a384a1232a9c6c0c38e2870a5708a2882b98783961084faec0a28a0b928a909ab0528484254746141df93441937e778ee062cc12eeeeee225fa907220c99a39028a35f5a2964468ed1e04c834998f2a88f454990c17ffd1129d2209d3432470039e0ead646cd4ce68743166a6c441ad47724e911918aa288c5a228723e8c52663ca9e425071cc6219b183b5a67fb0be9b4088a294f1d7c1169a451488421dda6332b5a11d83c462a46d0b9387faf76efe4e15a112822a7107b6daeb910f91468495f05bd8aac825edc7741cc92890dd625889650f24b48f958b40414181f8b94a0e2712ad2cc04f1d860083de80009545eedf7de7b1de763bc454a44211ec599a9848b31327a3b7e07a97449b34f19f9ea8a80b1749b4883c364a7a987209648dac10a2fe937220d8e1142b8c24993104028b1e2556bad3d3bca97a15a6b5502e86badb5d65a65ad35b662942f39b5d6aa0492afb5d65a6bf5286bad5eabfba895d2aeb4d6eeee9984207ad02e2075d7eeaf35c6d439e7ac996d89cd39e793a49f73ce39e7b474524ae99c34b3aaa539e77ce2f373ce39e7cc2ca594d239e7a4954e3ae79c3473faf438930579944a2ac252aaa70841330a1592c46048be0e38223939392378f98349f5ce3929addfff71f25afde4a78972ec9daa3ccab93bdfceeeaed33c87f2bae73387d72b4eeca35783d3380f42b53ca4c56b6eadf470dc0f42bd033fae9ffcc7f5c9518eba75eefab5dfcd4134ea2b2caa54aaa565ba8ae50b8b8422f8e9a92fb4f979f2f89ce38f3be57c8c3050393ce5e95cadce799dce19f9ebd3eac42caabc5c9c04b0ec7504e7e5926d0e6f952cdeda881f24fbead3e757e3a5dbae03c1897910cd43223ff39016ef7938efcc41340fad8b5fcdad5f9f5f78e774b13988979998c0c58fac56ab95912338be5aad565c8c050845f0d65ddca65d562e2e2e2e2e2e2e2e2e2e2e2eac1c63015c327e024b0f79bc7559ad56abd56ab562ad56abd56ab55ab1f291951b71c9476294992e2e2e2e2e2e2eae43cdcb251f59659cd8dbbc79fc4efa9d34d2e3e6ddd6fd686fe1d07e3a90ec87ccc791a9823597553ebcbeb9f46e364b4356a54a952ce0d0727899b8787b4c60fe72c946e2d16b88160efad6efd33fc2f4d26f9223485e0ec94088f31ac8de3aceb787e3f4360b994f43e7e4e4e4dce936376088fc2cb770dca70e247b9b87ccaf9966d9d27989a31e63b6cc294eeca5c7ef3cc8f4eec7c9739058e599600fa577cec92fbfa09e80a347ef9483c8a779ca743be28b5066d9f170fa85f7e9ab720e627d7a57432f87b7bd1b1e3ac857ca53373c5499042a2f82f3523967bd1a416495a71e5b28f706a98d160ae5284a5df378f43f824c0f4f3e643e1310a83cfe75c94395498093f3224111235580f00415576c018b2a2f951fc179a9f211163fe5205f8813fb2eb7ae4fdfb23778b30ef033cfb291ca593e233267a86707a693c3085e2488555e38c35abc54d9042a3f62e4088ea752a9148b04b2ca6b88ea2a255ebaea3b62040610a46812042a8e4003a457ca71982c21072d08d183931120e1a552a95443d01c238c5095f113d804abd791222658bd8e1851a552a9542a954ab1a452a9542a95721d6a5ea97c2404443002063e80a20a3ec45e2cbee2478c1cf980d2113f55f8208420b0f04ab911553e825d47470756f352390c7ca95c07c67aa91c765f2ad74131e5e4b05e24c89a7474005f249859e4bc54ae43cd4b958fa45890405194d4c31150207ab5b37cb865240c8c48820aa028a20913bcda531fd6594287064f9aa2387ab1dc809bcee5bcf493147a4418b2ba4d57d7917424a4a42425298d3ea4304a779a4a33f552eb3438e7abe67a3465260e60ed4232854e403c9132429db5ce5a6bf459eb9c73ce7066e6db5148c0d1efe760adb5d65a6ba5b6564a69a0b1a047b7b5d65a6b6da552b214d02ed306e92907983a5d41ad55e626f4ac2d4ad45a8764adb556f9d55a6bad95de202c12a594524a29ed224e2808abc7a61e80ff51f36db0e3fb60b2f9cc87510aef38468a5cbf9b96757480f1d21cc6f2ba33f453852c9f79f46eaa8759d54094f2416648ddc6b8859f5ebf08bca4535a9988c0485c62e715738e4b0f515f7348552f652e129d3565541fafa084073ff02096745dfbe2ebeae8d0afeb3005bca46b1f4c01af5bc48629335dfa1035687e73911b4586a8e1bacc456e9e353f6f148ac5ed01ffb0d7adb5d686d676cf69ad9cb2670eadedaeb76f6b53497477370a093846afd189287bd8173d5e488df9fe80ab771354d1ab6f21c61863cc818b9ff9cbf4ea1e0d35ffa8be65b5d25ae9f4e961ad744e1b16f9da56083fb2a7cde1b63d37bb6ba320620a537c183dde1eb27c1bcca69d76ce9a79cc6c666dadd46809e50d5d97f1618dd5638df1e5f404b787d6d61861c40260edc72590a8fae48f5cb2040e553c774e97b019a3df9f8f7e97dc1ecd49d57ebe3f15ab4807420df634c771425a2371b791a60c754e7309a47d5288096b1e24854efec28bbfc0e2210bdfe7b81cbee4d8e00b2e788b1c5e8d2547cddbbbd1a8834893a67bdca64780639480575209060f675e3c045b78e8979b81218733e04b0e416f91435f71560e592f646f19ea4286c9b0560e59cff2cdee9934f4e690e54340c1d26bdf6cba99541aa4b149d33d53863a8b75354dd334adc8d3eea1ddd33ddd036355893f9726951bcee3a4d2c414a314c6aa92058e455124f9b07b62394f9d73ad7b96b4fcc41ac8c5a9b7500fcda32943fd65b26ad09cead09cb934a94c269cf79c7ab1416f1ebde479d422cf23569e47b87b220cea282bf02a87118ac7bc88d1aeb8720ac2df4f174ef5b17cb741edae7c21eb531f4651d8fcb05d76702887421ac3113de1b28df85090da2593e88bba14e286a064ca87ace7244f266574498f60da004e82b82ba43f2608b87aa51ec606a35f1f1fb66a77cd0d84f5d6bb57f59b4320accf9c3ac1b1bf968dded6eb57cf22d3d38fb9d5441a9c3ce827903e367d2c72e2e839d4f51873bb1d2db85f68fd3a57bfea8393420d4697443662d3ee1ab24cca9aa3f51cab5f577da11c8a992e2c90413336d13d66fb58acd8a3c1e9493e7a8060cd8d18345eccccb0c97a90f4f4abe31660da8e728e76403e8b0abeeef9c981749f4979fa6ed651fffafdaedfcbfae4132221e090555d131a923e358730315618ad9c13e40cf2afc77b93b67661150bc6634e5ff44df36cdb9cfb429ce7502894db888fca2dec3f324779e6d8bbbfee7da190f73cc779afdbb66edb72b47e6f563b698b6083241b2c3d2a6a3182b1c17be517e13c666b6f23e07af56283f8ce9bdb7160df378d83e42b97d4ddb9b5f98f76fc1b0e5cd484298ff3b67e9bb59947efde0f48f759e69c2065a02f75a48c214518526bda9343841bece01d7007e21d1cbd48cb7a7c5d9f996930bee2940111d01e3da7b55aaf5996f38c182e3c78a65df66d749817edaad35560b56930fa107ac0f363d1112ca689267a607d2c3a32a20918cca08a9a38c14b3945ba0a091fc2c02cf133869f4aa8e2a7b39640f4d31de9053f1d449a62866615f4ba4f70dc044d0a25377648268e402f66028b2a7c302f08c5e89b76950541507c62caa78d4c3bef26dec4971c396d403dca9843e3120ec738d48414906ce10947988003093c11a5084c20f184931ac4a224347df4c8c2d98873768843ea2ee05eb0c0d31b7cc9229eb89726bcc2d196a15485733cfaa2051cd21570d1025362079a503246d93e240338df3ac06fef0cbac4b55d9e85d1c7a22c827e001f8ba6b0f3b7cacffbc7a22a489e9b2e001d6c2737bb168e8eb4669953af0e88dfddb1dd6670a2808b31594cf9d4c7a22c90fe5e0fade6f58b1f2a0b1c5bd5c1cfdcd60c3618e38c5cfdb22cacedb2653d5b079f7ef496cd3a40adbb0616b87aacfdd5876400e7e34b0f87f51f36b7ac570b7ecde01402d8e0ac6990c6784a63e02168b4cb86dfd8d1ae968ce15143dfd0ae76a0fe621aa4dc4b0e382646d2ee8e9436c1c518638c20e0a20f3a549448f96ceb3c1c324fbb4ba95fc7d7bbb93336f35a83e050bd0650cf5838a867e057af19a6c129ffde4ce37a35fa33ffd1366dd3786427a384c35e12f6922823f3a9f98fead7c3fe0982fa3a3d1aaed3eb54fb9c7addf1f1f886c8afb986061bc9a97b45e7ba29bba6a710e76f34385dc60a4c9d46bb5e34388d7aa29a70d8dafc7a6bcb3a40eb46e047b1146ec7aed486a8596687ee0a7694cd492cd1de4e4619b2c53b5f396bd5453943124a765ec6c7247a80f22ebe72ae45ddc6095c3fedfcc9bb93774adec5bb961677b92e9300a2e70aa28f47f8588485a5e7629c0b404c0c31842efeb9bb10b35ab5388c77d3d2c24396b7b4b05a2d2d0efe8bb35a5e5aac5a5abcb05afef2e2ac2f6cbdb4f8e4b73c1a5a5a5a582dacd56ab562b5f06858390bc6abd1b26ac9a10b003a292305a31efb8b8eb6ab8bad9717d66a65af8c48545e8d7e568b5bafa9e1408b7739c4f9b0d5b9388b77e3925b5dd6017ee71d27bb2883e5e1ca5d9ceb3ecd5dbe95cb5c01e3afe5e2d8a357a3e5e2e0b7f0556eb9641de0b7607d42e8b7d444182db915447e8b0fa1efe24150efe25de72e9fb74e832ebeca43bc1a2dd925374ca6b3439386c5c2d8cb3c9539ae020e2994cf320fa90f479d70f999a73c1aa85b28ed9a48344a94113f73ece9a06e5de543e4ab72a8f216a74fda1576f4e8e49953a376594f870422e7bd065c3fb9c5d1f9c9a3674fee33334e864e7e7c1927e0b0777cb2ec4f2ea384b1f79276fde8dc25ca6079e6ed4394d162e59973ddf7e22dbe20a8f716befac297dc22b33ef9288f0617ef9288019277f1ceb9ee5a7cf15961e7bda3c365e5f275df10f9abdc79236957d8e28dc400dc0164e8649411fd6a2e18f5c93841777e344f8359276930f396ded1e171f9e1e22d9e39aac54f1e0e97165727a38c1a3f1a4983990b91dfb0063397fec9383165a2c832ef2599b792768529e73cf3ee69d78f944bcffce4e9b83864e6663dd929ddf5ebe2ad0b2d6fdd8b343269ca646ebb28e3e4d666015ba7f625bb7ebb76757e9fe55bf9427ae433c7d7a6a76748680a5cf099a332eac367999f3eaa136164d9cb4ab8dc4a1aac49df4abe36985469d267beb9d6cab20ef063bcf4188f5fe22ccbeecd31dbccec5abb9231394b4f3fe7e9d73b0d1abd18f2e9228df59932b0498dba259f4923955aa6fdf6c5392c9fa40f2f351ac12379991b49157034d29122a9101d6a1775a16fa73c1d63e740e9a40a34581da5056c33db1dbbd6aefb748690f2e8095116b02462c2d14349c4235dee849dcc014b4fd260953cedf4933cf7933b381f3f943b3bed4ae27937d7a90d67bc8df1f6451863edcea457f36eecf7a4e92b112889583c92087505b6117d48283808a9324742a981c68e7ba3babb2c924a7c65e2ab5fe9c4574944d439a722c48e76dca84e5c29be56e1eb15be4220cad41a228c5a6b751bf161ed42128976925031aab7c1ec8b5fad95951d8932d553f0d5b5eac3d72875228ceafdb125b81853eb8976313eb6100f44199d479f51d3ae98301a355218956c3e1d94ebe02f541ee274726f9efa74ca5d96655996d9747b5ebe0dba1061f4e57278318be53974102996d3a06c6aa00e62612cc475db303303828dd4488dd4d80672a8652a876d80abdbae85daa50105ad4481fd45003af8877420335abe9ee51fd72d50d3dccc0a1cbfe60e6a705aab65ab63f3ccb90e85c8ffd1e08f5a4fb7c19a43e99a5f29447ecd2dd4400dce2a969870757bbbe8d56a33efa67a0bb5ab851a9cd9965b9affc802c801b7b68ca3baf4ea12e79b4a834c587ae640edba3e9b4a83424dd34c3535333320e80e04f4b997ae9859c78a98f08121d949d2aee9cdd3edd3ae56ed9e9fb37f2453839369d2f4d24b0e58324da9e4920a4b4e9935c69de9f7eebcae072a1065a44b9993a68676a17f8c34f405a485bca899345dc51cc1cf69829fb25156e0e9311386894a39a7a44d2885b7e3baedc4e97cd8d9af818830a4e34f2e913e0d4a5ff9e451835064142539452e354845f650ad6b50a5d1a0e550f27c96659206a9dc519a342aaafa62cbd8cc8532054f3d942a784b79d08c0a6c352d1f4d24da3a4819a8bff49108833a8a0a0e1b16ca1d9e250d0b1b565d228932b81444192a90336c3498a6c5a9d3b8d13c6a6897d7f98ad3148b83dec4a282a750ed4600394c67015bbe292f616c41bc74ed0b658ccaf3681a2a75e453c733a03fa5a15cf20dc4cb9e06a5cf9ed30da088f2d4fd6733b15ee38c33fad33c5f3438b780c338a5083fa713998e838e2883c60c25e0f67046ce3441ad421ac4a1c13a535fb4c801b770887fab3cc281c794a95e6b787968b9facd2c6b057e418b504bd9d2532ef55c94d172c1e9d7e75cc699f66e60e02ee7b143f06f58ab1c82d82f6b53da563e4ea6a71ebe44195cd2eca09df006c0431cb2029077a6cc0e8bfbe4db9d9d18616cb45d5ce402d07217ce5b3c009f8c3201b28594274d841f25529044d1243dc67c97366e3ce7ccb280e7fcaed75dadd3d932f35e8c592cf79e892daf16617c97091b71775e88b577e3cec56e8c15cb2bdb452ee6331213f30db1721b6b90ae7c738e5badb8956f1f277d6870d1e8431b933f3120a1a7edaa31fac99f2c8624611226916412d62e942522d24c983d4245394efec0268d8ce590857de6ce53e91305ee3cd39cc60d1a1965564e35a114d1d316bff2d03ee988f8a0d8a476b5df22f0114f3f8bf434b451a8671e07707cbf729567de4de6ab0fe4be0de7f87da1fcd5cab9d975b2bb9573ab2fc8c62c1086026b7e6dcfd315a7fae2ab3ef9b6674e59a262d4347888286968680a8fcf9c3346c913238d84b9f018b73d93c6454c6c7a37ee12264f2051105d5f8c8bcf454c781dfb09853f17dffc3e9739786888c8e8fb88c4fa933945b05dc2d99e4c4aa614030aeac1fe7dede2eba696a1cea18686888cb0fc49c5a48ff489c169629c3a456a575325fa8446a152fe884279ea315099333444644424d632a7c884090db56b23923932c7b9542c0614f4110d310de55447d4e04a478de850cb508f439808bbe09e9fb6238bd42e179cb63f793a145aa2580c288849e614913f34168b01057d1ec3d753965a667e72480ac9a09896635f963e43b6c7f6d81e18fc85176230786863b1185050bb60108a31461a09f38f1219c5268d84c162b0180c990ec5246ca888060a9a33d6ae060a9ad7850fe68b8592281693b0586c084b18914913a363f8008203b6a1b1d118353330c6d85b00406c5a6cd7ed6ed6ba7df4a54733cd33cd6e0d901e0e9b969a474bb7acdbeac7846baf5e8d76cdb7f656bdf2e2256e078f28834764a91c068c9979511363e8a3116e998e9416a159483b8f1e38a81a0cf1b766a7edc27b3dc4f36b5dd75c4583cdadebf5a7e7d9d3a7964315fe1ab2eae3cf5e81c58a2c161478649c4bf209d29c89c19244bafdb2a2741d70599679ce5104643e3dce3a10d6739cb56ed354721ce736e273b9d5f90fcea7679fa6b9b5dd17b3edbb1e3d0de7b56ba9dbcc4a7530b21e63381df5ba4df358f1c801995b3aea671c11da02bc39e7b657bc3ab7f2e9acb80efe5ac94374cf0ebbacd56e3d0a2127f6b1a8ca949ff9585445e83397ad2cfb0b06e6c5ac69574d7df2655bbf524a4f3990eeafdfd891caf7d6c43458dd7e30355f2594af2ea14499f1b5c624d0db2cb331328f27b76939f4622646cd0c1bcbc9cf935ee7ed7e925476a7bc7329e5951fce5f6c65ec35b7f6760d56d7b2ad6af14583d56334585fdcf0516bb881478f6a933c20242979555152926fc7ac952778c664dba677e4b28f4d49c9c71438da56c518715ef320d96b1d3b76f4961e3fe931768c339d64e5761ce9fc28f5ec55ac982161efdda8d5c16164623982439611608ee36c8c12985a29734f4c667289cf4f9090b54d99dba8f51194def95aa791108165457424129a7110b8e965ce0b8b8a943b836b58434715883452f63831f408f858e4040a9e93319ef4ccfe6919ea442ca1a714e82952cb179c043355286f731f1575f6928b31fa58e484cec725708da94b393939257855aa13c178e3440922183f9c3fa77f31b5552023d2ca1370d861556699703e3369b8ec0ae03c731b1f2d235d2addf898028711c9864c3a47135f92c85fcfbe2dcbeed558419c94525ecfbeeb3eaa80c3eeb32ccb5e482dcb315bce42fa32f280b7b63ee0ac4b89f2a974523bae01ae01268a30a4b3ac80b3240da5913a4abb3697520a4d9491aecdcc482469e27cc051125df2d4dbe7a96fdffd79da4a61f63787528a979e25f1205f3456d12979f00f587e28633d27f5592b95924ad849545e7a272dcd9ca6764d29a9cc9e43404c8f31d185053864b500677e1dd57ef2a9a150a8e83c6ab0215aab9d3479e3a975ca3aea9ffc9489ccd99d58edd2bcadf7e66d61ba8de3baaeabb5ba8df8b5baad6e51aecd89fa22f53c7a737a9c53ae03db15b950f25069a9c5d9a7ea69c364d57ced1733944eed0a3e1dbeb1c3da1b888ca01cfdc4848228ed1b7c08c1214a0f2ce0248b3bd9a23e3db32d9a75d427d2e0cc7352596b9535c8c8677635d8d060b7272fb7f9ad35f3ea35dfed9bde8da6759601617dcdde63d2742d533fda32b5557d7a763d6bd5498455050e635205d2bdf41eb60269b0fd063a054fbfc1519fa13d3bb620e9b2c00eab603c2629d584a3ee0385ce4b263e1625fdfc9d1ca553ceaed6c448c2d3e012d9438b2091b079830f2138f40e1e15b0a1460d0d9bfa33cb1fd615d8a6bdaec1d99a4e7dd2963541463e5ceda4273dca04156384cca10f20ac53e652c887da8d36435b46b6a44f3f6539c441f29967d3bb6151c1d6e5cca489b154d560744dbbe19c524aa957ead5afe3fcfcc24ec894b29b191314cac1a641797b4cbbeecd79fa4c4b6f15cdb4d658bde5d987bb191bb0a3c1e8f4931186d72925208902e56351139a3e94c1bbc13d387ed83ab72955c5d41f70c4e2763845ed17661edd5a6a53dea35dd86b8a13800ef6ecb381abfc1ada1581b01ee756967976afcdf1d2cc1b4ce59afaeea76a10c7d01d60cd0dee7eed9a20f862264637f86266864d8da42c1856b594fab014acb91183c68b991936747b42a5ddc9fb6e5701bc1263c570cc465abc03968e7770f53cbeb0cf4cd9398d80eade47c41b949293dd9eb7f5aa646ab0f2e8e17d3bdad57da3061bbaa50d914963633d8fe621b0c6a12d873787b8dde6069176c5df41c3263669624853a6fabd2cafeb52de8daac1c8e231259198a4944c9249ca5c244524261403ea5877de8dec6930c6d8b1e4edeeee9eef31b1983aa761b1450e0f8f121eceeb4ede8d97a592259fec69b0121165aad75a2b11be5697d5b9163918b35a8c403221b5773747e77af546523daf95c894a97e6f6579b4bbd9d33bcd934a228ce944264dc52ca62f9459f82a99228cea282b7018a17ce7d369547ff9360e79776d336958bcde15962f4699f6952fe66009b4ea3cd66075c9d43a4dd56d3e1d8cf3109ee7f6e4799e976fc41cdee25f4ffbe1bc9bcdef4d3add8bd234ef78384ee3384dfbed5ef7fc5aeb1c672dd5bc3fcd6d66c7f08d5102ee1eae657cc0c518aea5c4e22393583df368b0df5ebdbedd8b0074ac676d6d56a54a95a6cf3293ebf16623dd6b08af06759be556addf93524a339e55e09ffb3e703787403acef6607be79ba793344fc3d8c631c0d5bfd6f4ea767a7deadd9a59477d9abb577d6318d91d23fec431c074ce49b3147a49d41f8d021763f00e4b600edfebb776d7737aa29852cfc321ce9f3ae53f6eca39af1ffe525fbcdde18a3f9caf28cfad77f276452f94d6b3ecde7c1b9499c7d78a6fdf5df96e236007c74a85dc9bc31996629fc92c7515cbd638746a5bc5c2d4c419b1b3acb7deb9746b61da45ddbabff56edbaef671b3cbb42ccbb2cca79f3adf3eef0b25e7d1eb70bee3aecbebdb759ba97d99cd730551e2111f8b9ac0f34d807d2c6242ecc30570281bf125cfc7e80d25ca9050a4cb0e78070f1e11c674d901872c3a135b3aea530f65d3c74f4618a15422efc7a728cf3d8a9ad2f33a07c27aaf3b6559e67954f3d97d616cfaceed173d0ee7b97af23e7977729b9969367d3dcff372ebe43f3cb77ef2dcbae71647484c3a7db1fb709efb8074bfe5fec2bbe4ab6b5f88d3f3d56de6955b57262ec684f4e8a97b94513d46a49d4913693879eec598c5720fc12a83becad54f02352885688a5c18b00babc687428f4d47ad11e0b07ba83766f9ccab582fde4c8de492e3110c39043ff4687473e82b398c432f396421b1587238a30239240d2953a197432c39a4658a04438221c16aadb5d65e828434699a24b5d252f760016b9244143655990251a1068390264d0c1f520cb9671065a8e726f723c27311df3d58c09a906047485192a428f594a5a6d2ae8da969e6b40b069b50e651bbbaf07ed376eeb3113f73d55763d42a818402aacfa8742d3685492b999a010000005314002028140c078422b15038265484553e14800c92a64e725219a95910a31432c61842882100000000044064660201903e38eb3de841ee805adc29813239aff108b46aea00ee5368f5c454e1dbb9f50d57bcacfb0cea2a528930e4ed788a6b787fc9a547d295c13fa05fde8209b1d1b4b31b18c0d2f84e0074d5620afc02960a45834b953129461ec535b9b1ff227ea5b1b1bb0fc451fb139e3d3d7cf9fcc46621af7bcae73b2319fd2bfa5d579c55c560b119920c73ec05e6835f382d47a515a0394627efca95a3a41737868418ae7928a3075bb2fe2c3085ab012453ac01db100ca4d7c8479a082167611a8be607032d8e5d117cbd49a36d1775029e846a01ffa7b7658d360ae4fe2abd2224c09ef5e4da55b4cec642452c8524cf173a9534da093118d68ddc9333db22947833063262a5ed319885111adb9162f426de0ce1f5fef2f23e641991450a0c124102f647988cc78b6105367df783e8c18a5b2bd388dc6dcb96ae186344dd9846bf27d2ef388449c5bbdd88d4e22df253bc5dd8ee7668ccdd1eb90185799ef1f7740e709f224d1857d3d439b181bd49ad035a53a2b3b0e47e95bbd6a191ef2f02865bf808df98a664379f71e3c86eb00025952c91c0b6ac075ff33aad85955ea153f5bc27393c92b17bd315af0b98953d6578109979f36d8c2d1722902b6fbcd6a4a8c6206c1840278c3428f582a622db744a8a1cc590c062f9dbdf440be6240dfccfa2521539a5eb247e5cfe52b864755b016c4ee18bfc8b270dd5cefe90e627f775d64391800cee56576087f178bbf7202ce7d4dbc043c19d2b48b40e1cf07f078620170383aa926ce3f20025e035e8eab2937d6c7904db7b318654666cd318db12d5ff2ad4a7ab686d200eccd16804ad693a20e261966c463c0976c5ae388b48f38678aea05981ae55fdef9bb285ca531f962d8615e67f17ac558a2941a0f65d44575c2abcd72cfdd87151e1590d20d550492a6936104385b72c5f89120e414899551d3258a3c207a6c25a4ee824e15390efb7891f93137dc1121b3e888813f6f4f0b845c4ab4e5e11ee44d2396382101c4483bd9427d76579ae292753cb6220fc66ba96f25c4af9c33927d71056c214a98e4cab3641bea0245629bf827f8dd66c00d51df8ce5b8efbbeb9c46be5816462d20206f32d6724d5d2cd7fd5a142abe5e8d92bcf34df8b3616f3d6f21d40c4787a0837841e8412b6f300332cc9ccbff8f6833e9af4030e7ace7cfc0f2f78892aa31432c0fda978e80ebd95cf2c1dd492526f8b892b39bb70e8d76ed745c660dce61f0fe6513b1496111ca7d9a026293e724083133e1fcbca73bdfb96cfccb32028a01cd60c039638e1ddca8d9097ccd9f3a39c3c81513958f47648acfcbdb14e1c29ddeb727101e17c26cca1980e79595fa783e2cb7acd20a3acffcdc755fc5e16cac8fa2d780f581301f0933c26d4651ac6269920ebd9b4af47437fe14ef793b1fe33a216a4299cd92d70ef5b52707be2b0617d1bc2fa634dfbf489ec23307dfd29b0b0818a810e7255f6f05a58c3ed06780b2f55525f9fa32facb71e8fc95792bbe9f5d78dbfb04e864ef432a7050d8c896ab095a73a27957e85f559ef02516a234d68e6571b36bfdc3d6fa87c70259c4c1ca33af5b637342cebabd875af18040555fd6dc4f7fad8f5e6d6c5a938b94f69d17c87f76b2c9ca4140f314aecd305a28f5b599ada70a21e4b49028075b2040fe9045a15267dbacb7bf50fdffa88351f41172ec77546a6f74d9f4e3e3f8a45d959d04dd9c69004d298aa3de3e5c9544883b16560b28649b2639a1fd96ed15f5e4a5c05f57c5e8a912ace8410673565071e78d5ec2cc4ad536bf3022c4b7927d134c412d18385adebe470c510a352a18d94580ed352d0c2c4f854aa124dcded2f3db54e520e1fd49bd2bc063b05e5e0a48b7235f75ebb6dfc72da5bc115127e3c28e64b7bbdcd95c9dfa72dc6c7c7d253b43f6ef4b1ef3345486c545c5eb6d66f7f81a9d302a5f5f2730b40442f9d943b1138b11757fbb0bf3836cefa40446c5d2437f0040d59cb562949544de36150264e720a9f41b8b795ed73855d61b095c08b3d4194f62879def1961c56b551457c921d693edbe7c373fb39dd03ed54874dcb76a9460056aa0a9410eaabb8e8c79114c106a71b5bee9a6b817cb4f2384609e740a3a1640443a228533f0d28740ae804a4742d97eafd3787e28d1febeac80ac7e84e94b99645a1017a2793d1cc1315991eea22a85bb90e9655549a3e071505acde8f134da212f6032bbdf83a948ddb65869943824b3d7b8ad3d97dd09e1fe67db27632a0b55709335dc225ef195e42689cd145afc89c438ff4f891a421846edaf3264544e2ce14d98be57f08318c7cdc85182118b7262ec99de23f427ae18439596f182cc71602acf8613790191ff8ae078548cc08e38930d238a5b8631047b93bb21f5ccc405a5f32ec76ca8a68b808b1baae45c2ef8757af4111178219b7da8640ead7e71a910af8ce4d154d0092c56180600d202c9bdea24b63fe169c8687b6e4c453ca7ad28cd268d4bba08f946c69b197ae7b34c082bce29ab20091aabdbdfd12b480186cfbf3ae13f1a6914dba65890e221471a8baeccad6aaa1b52800925cc2ba9f43e0792c6c0805838a679eb1281ead0cc88bca21e426f912196dd3640210e1ba90a4e139c26d1df367aba3f7cdc9125ae2c98835df7a5b1a9338fcd281b79f23b846acce9b14bfd864b23bd08a8ebac00b0e98875812c564ed89b9274597bc248cb9622c7f1d060f3e7ea482866bf09c00538e2c2f99fbf15a272e9994e48b39bc0641943ea055b823c30ede930782df48b514d36f7cf13373dedf114aa6e26169d255831e9c1886a73f3a9318fbd60669138ae6991ea7e9e5ee92352de042ec0929b3670a3cf9d8b0e87014f1065c3d5ae2c7a85b86c0e4d1018ad1d30e2a69c7b6fe22ec02d63103e6080efe139d827da87d504c1031f9e6794744e7124a99dd69ce2c524f9c5210baf1de46d238130d9d6fa0c5dd2a050566489dfabcf8e7a31f49c7122ede3eff0d22ef77e5ebab1fa73440300f5a5d2776bbeee6b6556c72c62da6ad3db5bbe97ea1591a13aad729da07506e8c7b3ac47d6bfc22aa650c019641887bd26be4352bcd163b9489ec5c2afa56f4fd5d47a8957375de08a776aa55aaea0149de260e3d3f758679169f7a1660345fa4011fd8a8a224219fba8702a1a36b9cfbd49af5b0cdb1797f4a51c97f25854c75cada1a46bd7dea0f904c9af2735dd6c89067ac688c39a8309a304949b44530ec7080004c4a1b79f5fac1c5e1a86291d578e38cc7e0d21afda0d385693baa44d32cecd50ce34b5b45ece47220b55c577071c037c1d477922208cd3bb51e99eb02f3f1c9106135a670db491b17431ac0425b243a9491e24d2cf1f280e9319d37fa3ac59e56980bf8824f6866b15fee8c79d9eff338d83f0ca930b75e2612728b937dd1fdc54c769c27db36fe13b2b75ce034546b3a4d15c4effb0f057920f801836af97181d27ff46cea3cf6d4a79e9b886ba37240bed7a2b6cedddbc46c55f40e2813848f9d6307f5a5dc06d91a901211492fd76836e620caad77d188aa030a1a48a6509444c9a009d3bee5a2c8f487149890deb894a3250cba83e712afd090b22b0e4276a00c08a98a65563339c8ecd4fe49267bfbbe23a6f3acd030a7a7676f429f07525c0dc4ba6cf709175215b3754831d8a010c78821239023c8532429b047472a35c468f70026a932e77bf51f44034cc4f02da70966be349ea8ac74d142aa9c3e871b7f4a5b20a528c071461e747afeb39b51ad8945f7249e3955065dd1cec8f7082d53d17988abf76522b2d32d121757cc4a72ef8b7eaf417b363d911163705ace41e79dca7f3be205ff86346a95431ec4e708188443e8edb3a2549f6ce625856cfa995da85c7f45e8c8d9c12ded98e76f9c3a0681b8fae6256e2b2013779fcd9b97e2a785cdc1269f47a19f5621b16c69f5091b77c3e236edd46ad3178840c2202dea1accceb9d0af46cc8bbaa05079c15213f8417cc779c130ec11f98d2f2b8d32c1638462dcbe498b75da2cd627a04048c5e14756b2680dca2d76e7865d0b774e6623f4a654a6b369260ad8b72ddf1398dbb6e6c3f2cf841342d933bf2e98e4982e05293ba5e78c0e5e49940433cab9394e3a44f9230113e8d5cdf23262b6c5a10675ac26ab014301e20e990b618df6d0a04da623036e1da8c0ee677a5b2b904d04bfaa51f8950b7240d2d017712d651a69318880200dbb3822036d4f84c574965a91ab2a64a23aa22de87e8fec5b29b7fe22dad4207fd1c1a80feb55e078204e1209035aa2fa8fdd28d7f33423019654cf338594f746ada6d3533f82535c204d6e95954e870da628dd7146d029cb8473211e40fdb62d4f3fd824431be5440227c2f7cb0e015e2e10d16cd9b8eb6f23025fae1d71f25b70cb36a4d2c64192646e3152c85ec2a08cf62c6b7aee33cbde6dff633605c960347574e73776396d88bc84855253776d802812d21c669f977cd93430dd4640aee7e7d6f85536a7fb478ad3b23c42d7c5496cfcdf02f8f7515aa07204cb92e86ad02468fb3878826336b3064725aed1cf71209098b05e22c418661c1479ca243d2fc672c70b943af5012d709d60ab9310b9a4630ae8dce9c019071cc38957d82b40f8f89eaf87ae8ebfdde3c89a43d408a06706da48020680a02e792117e7df646b261a987b98c9a6f05403b33d6390728d84398abf925e8ca780a88a88cbd02dd3ec3be5d522b488a6b7cb7331667202e6b8fff75fc81024dce4a8a116e29a2570ce80897e28a3adeacb85821406a0f7928b2dc10704a6e021c0676aed92d89cdc065b4bb60146cdba5a44a769c44aa1ec3d87f6b961580f40e14cce69664b9612227b983210df05daa481d22138b7401bdca5adaa610de5597ccbf1d35443bd225b30913568abf490d455b34ed66d11ea0f1ac73787a45b206f61064297841b4b9c562703773051fdf1805c20acc9278b95a0cbd8680462a1bf762fc99995f17856d90bc83448c5270c687575abf8eecd83d25c3e1d1e9fb7802b660973561cf65c93c39314345db02cd9075239dbe6076c3056e640dc3a41f1c6d96d65deb9895a237687f54820d52b679c792c148cf03c2900f75c05a996b5b8487b9e95e02134bd37ad339b3f71fd5fadd0371d24932287e964e366c46219edd54a4f1df60436f51d5cd824325a2c4e95cf46681c4f496ba8c1ee8b8dfcf658cf34bea02e9c83d9edcaac44bda1ae62ad07d72a36a7b9864e8d0cf92c72803a2aa8207dbcbcb8f7a6e54a2f2d3e7d41e6ecbd90ed565c764e5d9d1695372906751e4ad1923f762cfe0ea5aa4b2c638517a3779efa0285e35700290c98b11c253b6ae85de98f19a074e62ccb1d58b95f7981a2d7dad2ac739c12c5bd2ee9f2dd8047d1996c0e95e7291713bc7d11f9dc20df43896b8ba7ba8a6adbf37735db4273ab40ecebe0d46cb6a457bb82a5c26477d4c86887593cb7578f2d27c1550faaae10bdf206446b1f0566e3b1ca9ffc06e7b7218efbbb15d784afa25ea8e634bc6835209d71735b778da5592e1770be931e5c5ac4ee7e72f90f65573019c48212a10a97eb7fc398d616a4f898c0e6e6c860d95d8cc86cd24d860b847e11602d1d04738c7961a85d34b5c93ec0fb2cff5dd9e8a188a40a6748659cd4c17dcd5a54c92b23677afc295be85d604cfeb4dbd392689e2ec8424e50f0177a1f62f00e42147a78f0a1571eeac31817fd6e5471e04c0fa9973a335d82aa45926c4d4f8c5481fed060312735b7b3aa00e32340453fa57c69c77c175203e836814f9234470ce570d0efff966ba21e5372d694c5d89e7dcc0b4ae6633dc3eb1f57f414b862ba4900dcc6170aae1d38c447f51882c0263db00d5579fb0c0814380a15f403b90b98c5ee30e2bfa896be45fb5d01c5efcc42bd89ab7622492338936a281970bb1d4740a7f069e24c11d6ff089becb221a2ff6c904bc289a3ae5dc438085259ddfd35a4f20c260db05f561c50e2fa3384e6261c0e45ed7c5219c585facdc3cd3028503ee85d13761a8ec9faa64180e530cc989833a016d0b786633ef29647212894d4979a9c5b736bf57c0e8105806debf20a31856463d310af5f3f349bbd3efab0647d386b5592793f62985d231b33ed5008b480bf7588629ffbb57edc3ffd1cd8480d7672993bc9d0316235a6a8d20a67f433ea9bb771b6a2d1980f77f465bf30887f00954a564e580c0e6b9cfd70737d680c186e57487aedc35f72b5bc00c97fb491efcdf5c17fc16cc33e9f4d38dee7d26342f51d33702b00903cfc4932b19f8d2884af85b3e58fd298ea59094a90a31d9cdff14b298e6434638aff029def133714e0bd4e2766669dd4274abf3826c50c9fd4ffb6936d4248a19af89ef2056ea7d01514d16c7ea0537c996e269e79548ae0dab245f11025a8d1069096915f966614bbb796b23d715c04da9160ba217d19e45c729443a6dc330a05e32878cdc000ff6a82ebcca021084c56069f9abf2ad7861455091ed0ce27d47c6599b3bdc992124e57299a4fcba04f3cbe6474b6c132bffc8d33238147a820b638ec08ceb4daae08b81ac302b3ea0ab8a202debbe46e0a9857243041d95df293e209666acf00d20cacae1cca2cd8e96045d98a3703d0cee8cc3433c87f5970f20376fb8620db21b76fbeae189570bd5c34e1d8da8848d177451033e324a8909e5de1950cef2b9d18030b57229891caf3517a45fdccaf43ccf025f724054e34045e90b7066fe24de80cde5fb77fa179a020394575b325274d6d55dc79043ec1656111eba75dc6029be9bcb6d3148115b72999077bf02e13fb4bd7ecf20cc97107cae742582337f35fdb74d61efd0bd1e5d82b69f2b274a027fc2ddda40914314b0ae803ba5270e6d034089a1ee2f80ba5dcd7d0c8049a5789eaef22d563be404499daaf98a721683ec92aa377c01951632c7f491a0aa941e4df20f92c01e6917e3279cc276ec03438fa0be22fe3383258202c751fd2643d55c106b3b06c8a3725d0ac955ea4b223e05fab0bbb51d9d5910bd5248c476736860d11114ea2acf3258a4ac39d3e548ad58d41cc0c237ef6d5524d5b728513d29fae1b79f46c2ac8f7ee0816e18386ca748fc032e8f6f006f0138004bfc07897a6325903b6497e48cfcb360ea02fd3ad32f00655812d5bf20051e8954cba1ce1086bb450880a4193aa2e53b296fe4699269c19df1d255d7fc99b0cdac5820bc5fda4214c44c062493047debf217ea25811ad9b5de12274c85e7c4900594bd82f49f0ddddc4e79abe68047e5cb13f286b3e8086208de8335c785e3d9c20194275f88258a7c202676d6c89f1e3241eedec0df147a9bcea1d2c39d1a376b3e79462bc59c7fb7e501d83d7f22436c9247ec506a61c7c912c51a8f6a282f0d995516e7c0195bec8429968655a7d86ec5b4825c01c70dbacc40e75f89a77d34330e5432a0bb70193106925a0ee617c838aa9ea5cc5826da6052d0261cba0c724d8dee16dc0a25f68ff3c50ac7e55c2d8c16eca86ba75c0d6acb6d733ce3591a04fc40d5a87038f770e9ef70867e1c8aea175f8198a93238bca4929f6ab887fad563ac50a2cbd1b53e46ddb0283ee0409a57e62347ed16472f21beff3726dfba25d1003839704c343ed46af7c362a3777e9802dbec426e0edd7a181351cde384ef375905d15e0c0292261aeeeb7d3e67321ecf79169c9fee1aecc4d5d72d53e106c0734cada0591b42b103b012d72d82df4b24351b2f05538dc87a2543b50d344e93501ad43ef5097bab87ff2f6688f953e9ce6166435f88bd3d98de84f382751952ca2a18610c4725909eab59f19a4349d2f1077a944445ad7e22bae368f069e4e03c7bdfcd521f8b2d30f613e03214811ac9001358632f44b655a3a1d17c1bd2883b89f0fc978c02f0216cba9e70ce2bda4bffb117c43eba19f9872f3773c17d715ec7b7048cd5754277887d1b10d942af51a7e39d589fa690533663665efaf4d039ad86a687fc211e16c49ef0653e9c01ef0aeaeda5e0b96af440c9dbf4a764ab5768deb69599e811ac58d38662b0e305626c1dbd3e82562f7fdd1ef6bf5aa7b62eb9c9cfb2447265951770cef3c638ef63c68e5163715fbf11cc730792ae34f638553744e1734a86ec1ef1952591c383805086a51207f444a91aa1a83ff4221e93bc9599b90e7d771f994e0d566e411a44e707fcb6b9e8e0a56df3ab4242289442369817e6b7d8ee82e963ab41bcdde16761bdaba60817701f38112c7bfc8fc354b30a3f9ae2bd1d1a16fa59a560b915930aba19f736996ac079f08e294b95022280521e6a0e4999067f2a9083e5973e7546c1414b65b1836ee71e5bac7e6fb51fa5d2ca12114ee93cc8c1c5134226a4fb89f993d4cdb7c3b865e19c88e7d8d710492334b1cccdd0804784aecb7cb621b7c77e3818e670132923eaf6d735be3e1fa3a12d1a42708bb84c0e8251db1749eb5a98871795b78608fca6b908c384362b2c457cfe41f40990075938ac53c0a90bb2688246ea7347be3dc17a147d3928d4e05c6f64dbf0144b4885d6bc9000df61949dc389b315d527b7065d33e4c5035ebca4b20fca91c1a5811968d3dd93c758deb1da039ad3fe4742d65fab3b3f9e3ed61bad9148ecb9abb7f14386830e6052e240113aa01e69b7c1e5a77f857252eaf9de860969945e86b66e5c1f2b25abe5ecd3d81fec3e71032a2afb34cccf5f6a88aa4c67df0d8475cd3af49f2008edada2c1b07e4dec3464854aa8fb5b4540ded46b634bf1bdaa69cd8e6c9a1ffd0e2c21d50977e75ab83baa379910e30a76d833aad38a3571a4374ff6e2b895379a01879e99195696caa14087e2060e04eef40b8bd72022d705f171f513ffb46d31aad4b45cb78ad4368ba83031147a9c5717d09a9a4456c07c11543a3d989376d3cb9e5ff4576aa110aeb28524fe5a27334328dc3e04f3e322a20ec8b3856db81c4a2a7ceed2773f4468b54a98be4e350e578367935a628927f03b272dc565191325cd2e24f45b40a2d43e539412b937880f0f4fdd5cbfc39fb51a960e3ce0dc58428c455a6799f1d7b2e771eb5e1a58a9d8906212a685ceb17ba216fc671f39f82fa4accc98a08f5d269506016c9ce02c73ea86108b140c4d86c063bc458bf99becd8a00f1fe4810458d26e3bb301c9bee3069e5779e8e2cde37fdee0f456a87d497c4174ddf0daf7c2599cc21d88fcdc99c8af725649bd8da315d22cbe6077583c4f6e4ef5600901ab106b4996b3fd3abb023fc5d960db6705d347124608bf2ca5e792f3c820ee7e6d5d47d10a171ecdc1ae200c2024ad581684ba999094edf385dc1a0fc9730184e0c8bc0e571c0554f88403128fd876a25c7af82a81acf837c01cbc7c0d09c0926372d5cc68fae1e36ecf90288b000fc48cf096ed170a86d2cd5914cbfabab6085f217218aa5e182f13d4d81e8a20590de96521df74081abdd675ac0023b0755a7334d942513f549b37fb8d3e4d0f2cd613575e5dc6c95de63f8423eecc744f6751638d577359b40ef1790638c7c19517f03c1a57c3a86f5a7b4d9a315daba8aac758f707c0e472d7a0ebc0787e5fb098ee63001d91de1cac35de41b9718fbd2ba7c5ba6df40cd81bd6418f9ec28d275ef32efdb55949444d9eed9c3310327c520ffb04c58bea517fb33b058b2078ac69b7c828ca122566c15f0e51f4dc1dba2d014e0793543f95f18ba5a256e4c0eec81ec5a4f5c5f0419c658dfbd898d42ba1c0854e059f778b4e32b20489dba8ec268eb0ffe9f5195cc308ba917eb1269917ffc8a5dca8ebfe2bae2c6770dd0904a2a12079a39d2aff55f58428496b0112afa6c6370d02e3c56b82adf57f7efb656b2fe3b9b7359c0a52061bff34c8e3c657b0d2278cc5e929858ba05f8f50cf5b1be15584124319491f81a4709a95057c6f260659ac175d47f8b2908cc44d2f6dd841e16ebe4e8969f187d956fc0321098662da82e8a3449c3b52debfd5718704e2becc8ce0067104a86520a0d4e15234a25d95a32fce03e0203630e49569e43cb6e75c1c56ed19e7215363072dab6e27ba3fefa409090c07990d332325dc16ab9610d9881326432dcd9d2da44978a5e9b75db46806ee2581978e3037e2ddf574452543ff541d8f8351bb784a53d4004cd2b702c254c93c014e6fb813d4cd1c8e52e88fea8a0f02f8505f37c5aeebfd4341315b627ea55d2e7359f97172495c9efc4528bfd056cc353698f82ab26b9804964b1312de60632bfe26eeed6bb08c9445e0123adc6e381e50c8b72be779746cba3710a98101d7260ac981c53fd1e7897749ac7521ac5586679e97270fb20dc75b5f5858a0f8c62ed82ffcff3c9d55f4dc2cac59684e60d09cb6f12971647765fdc8c0b79b13f446088298b8444915497486d7604c30771af05de1128ad89a008763fbaed40c53cbc93fd64f0a293a39c02bb9e26f740a20ee7a4f1538029f9d28dbbf2e9a4cee8a0576333a9be2efc284b189fe0ec3185792aed3d5bbae3004c4a8d8acea8a5da12a544ac0149d310e72df4cf9cfdb83b70cf27485a05750a430b8722d06089d8f88ecadce181ae9e20bd695f4f50ed74d45ba8f7e3cb4189912e9b1b40fabb064969b06d495d148572536ad678e8ae1138939a375b6b40ced16300ed497b5e5d3f766e547cae9c7ee97c1fb4aedd63e2ff3ac1c5f7b8f6042b13f9567972d38ec4ecbbad75f1117b0f915d56a085404d0e369b660bc9fd278673323e50d4650c109d2ca2da8b28a00ce03a78cdc121807bf2e38c5cdde0b418d76689802d23d789c4cd0ff819554c969b2f257261da6cdfbef7c1dc4c0883b707fb63f024a20592bf67f866d3f949d79de4ed9dda990acd60aebd473e3f46938c3014b6dbae91bf6ee02019b09e29c0c8b876d3fe67aaa700f5824760aab8b82dd3deca1cd9318a65463630fb1fbf542e72468a63181eb5523a7cabf2ecf75dd8856c3d41023d7e1f6146fba7c5993d0c92024b8b7cf1b1f53f0316a955c68bea6928636d32073a7d8a4e3e9d29a32263f1b3bcedff0724f457cb36f861f67228102663cb34686470207fb09a77a13e593dbf8622ca3c6f00e95fff8071a6d7ac400671ce24dffe66ed9dbaa33a914281833e4904fa99123f068522eb4050fc9bb83cd397b9629ccc45d5fc83245f10bc9b431c1fcda4f52d8c6dbe7f8432c39cc7ba4c7555ad11b43c613653790ccd3529ca4964900891759fd8392098428753ce1a80ccbcf826fd88f58591c4c7f46e848823b2d3ddb504243700ac6b3daa0d13f02b0864f548af43c1453671a1f8f9cbd2be96d50bcd36db9bd0d62746f0fd2f8e96bf223bae2d2918f4c05586b916387814dbe0246f86df18fa87a1713dcb60ef2518952c7082d80809109364a82481c7b0fc12e054886e1d2426c63c12079a01083cceafd083de16f9da68ea6c1a2e4050494fc2fe4380499332047758cd6356513b4b3d88bc6a5f83ad7aec5b9239df0ac04f92ac368988dae5d295164dc1869a11d209278d2fd3e7e585e15fd5372c59c36d2133c4c29f1879b384747effcd32df8db46ce852e45892455b55ffac2ee519666bf316b1bda30bf5a836ed4c87388fccf4ea1dd310a8c0627143b7f10f3f0a93177d03b79950d6b42138a68e22a72e6e451d9e0694c45d99780b9b2d74ffa3d18a362a803b4c920532bb2afc2f1fd8c8ca8f3d29827040ab453c8202b09940869c01182bc3c3d5032c050c15955b2e1c06a424ff9ceca9f6eb30d27009e51930a8c958771f541f2fa196836b69c871d3bb4a8f95d21337ba39786ca75a39da62a512a226edd2e895053cb6ca18d7dfc2eca7278ac1088b3086a3b5a66ac120c786eced96877a512479c2c3ede253853fb8433c5e7bc91b495322889c6852b484cb2dee10f2304d3be15e96cf99821b8c9ee9f2ed43708af47238f7812d66f672ce85ac4b1eb256b4da5abafd90a59dc87eb5da4c3a5118649a24343f83472f7af1afc0b62a64bb650e22034a696340b234bdc24c5840bf85f04a21d8b89ad151e4bbbfd4ba8cb15ec7c91e203d89cda6a57e4a00fc1a441523bdb4a9ef087f6d8a8c30e8ba0ff33194ddf446b7118c5618eabe57a2801b8040bccc9d3589de4b4ec320a8932e04b69a8a6d316bf7df251c356d7ecec115b6f97888358b5985516f800a9d2ab2cfe078f1d5514ef5f2243b5beb71455d5d9cbec03c3edd5f3d319d05e43e46b9ae75687b51179e326e4cbf9c6560328a3e24d573c1ed9c9e006a117c258889e98458f44205678a3d29ba242248817f794a9141268930b6798107bf759ce47aac9f3af05a358a31b03464e556dfc21949a0dd2939040e853f0ab9039e5fdf17fdbe4546b58df09712571901cf552d04df4d8093be27003fa00daaef74cd7fbbce66a5b626d050f999c1880a4fb42ef703474337bace2b5f1e404c04ea18fc2f71a7ca935b04f17d2d45241052a49505a33a802b44dffa5f4b12d46c8c52c358203b2d71d7868dc97c5c0123224f7f2d63e24a3c4c22a1335e5d2dbfa445835eb8c3e4422f5a2116c5d90cce21365057c1d8e58ea10ac57679308d9342b613ec1e14e00ecc8d5dc0855f377cb22687d858cef947df73d516ba702d1dc813ccd2175004238cd9615760e757213f94dff00751c98fe14ba26f3982dfa78dc2941d05e2c46546f12cef5c793031b02d4cf042752cbba659381c14e3de475ad90dcfcebb0d28b68a284455c4501851d0e486bb59addfb2a3cee89e6d611270bcd49fdd66293f16d168995d1c4bf83ab0a838bef3517122df71613e96b12210d1d2eb1a4a915b29a5203634e8ee63c16c07d9e7d1b60fc6949309c241682b03d79fe626413727ada262fefab412ee3f4162c8905e0d6018bdb7442afe4c9a63c4b2e4761138a63dcd8e164b709948a525a8b7b4b2a4a9b6692c1b4e63d7584bd0f6b5754d107df8404f3f357228e86cd77c7a96c5a117969026f5f4b91b0919c3a276759956f54fd8ee8919914cdb6ae2919b02cb6b7525d57d1c9df44afdbd8cdd1cbaeaf9349b222c4c7d2b35d869bd54c7cf6c431488eb852ee24eee7436bcedc0d58ee927dc361b2d694c86f93cd124d1af002e4e767b203c30c52af7ec682560fd9c7b1b61eaca2ec2ecd33384ff759e285474538babe673767a36fc85ce44687962439ce2af1c751254360ee422950e95a7099db855edab2a73ec4f3696f98c5bb09edfba12cb36dd5673d5f79bef34c24853f8a49f31896dc9e665308454996ebbb0a5881a4a7ee01c4d71e418664cf8c2ea5eac24195bd04933138d9201b4d4e378859cea80f7886c6cbdcc69c154e90f494cfb7f63423a5027acc7101eaa0f66cdc8ebfb70222efce8816b8d30311ec6ee9252bb175c11da1379354b37a106178839f9cd9e77c4008b811641694ebfa38b39c77927d010c4c184c5a5c3533761195ceb8f2eca99183ec4908e70670558ab4dfa2116f3883ae3c845b9c8dc4fe1d46dc18460cef89e91de09840900a98434aa31696fa3c488a76d0d3eb4bbf1c2a8bb96087d84f7beaae86af999dad6dd9a631320a87ff9048532e45018bc6caa561f0fe6070008137d2e9912ceed4da6da661dc86a09f9bce8cdd2688b892d311cfbce3cb455733c105e5f42b86f8aeb546bba3fb3883acec997c03906668d05d99eb1d00724045a690136c0f995140837bdddcdd303393055c2dd36b82b3ebd374e40c3d02005c8c077cf489534b5e5cee1b6b86d059518ef09b9bf29caa5df4150a7701951d55349cec0f6662951326c2d583074b1e96e2f86fa77cf6a2835dcc02fa648919d398e8fbb6df2c6cca1eb3e5eda0b650ac6abdd8e8bb6a03cf459e53ba38b807bfc5d8c435ba1a5d8a5b5e9e82cfe77b275e7df3e35ba545ad44839d2180136a5b3f3273c494b96aeb28b245e3154d9ec80fd0873169d6b675e354c85483b42bc13d947839e505d82d134fc0c4d3098d1c98f84acc4b4724b8a0186cb0537548fc6312ca16a21037d6139c8d051cc149641ebabd8272ccfe83b31095eb5c33ad23f4cc70daf9e2ae1b1fc6f060fd316c323f9bdcf7f1992e2615081ef832694c8961b8d31bcd4eea5312d849974e99dfc5c9a7f2a875fe8ad706fe18a938ac51b78be09896419e9f27f4264c877fc90e619633673b75cca253c268f3df8be16a70d2f6d099a4e19f3feede03892d18350e3716e2bb1eb144b9f432b27ba0c305cbfecfedaaeb2aa3df2ebfd7610239a07ec2a3c7b0578a10713842c9674ba3111cac0428206e62020ac3cd1d5df8fc873cb0ef7adcbd5551f8d93a788628f49f573e8eb78bfd4fdea2a2bca5e2976d20af7b01fde58b577db83f6fb38be3ea6408118ccdc420d76f6ceeeddde4058ad0b5f73efee007af8963129ef37ea84bb97b64d3e9bf504ceea4412dc3de6c73fd05f5bae1946ed7522e874c45ee7d306ce51e08a04e8501eff2d70132154176bed0ed9da1f1d523274918671582b5860b8c33cad6adc2d24cf4aea12ae7a2d7010d695bf7de7323dbddfa8a3bf4b5c759f07c7afe5321f31a8858b598e38c382b9ec48b4bb19a8a0bebd32b648a4bb5818505c2066140c4cc9e8818540ccab538945b8404c0360d6dab78cee409482295b801aefc4d8a431952551ddc124a658301bb61079e6e6de45ba567628705232dc84b68d2bacf44ba01f4ee2a412a05097408706636cda827e32c6ed29b6cfd97132e5ab76ef32577649b1f8a1ac2365f2d217c758de4117c4d5ef249f1b8dbf2f72f4c637ed1661cbc6862e5a8981b9c8e6ed27e86070248eee6a25d4663074ad0bda0e76a1c468910e11256200814a2321569ca2e7924325249c43250cd2782887ca20fb49bf50c62eb74a8ea48041d981788db8fcb6ac88ab11a7bb1f0aa07ebca07ac603e3bb17502d532682b92dc306cef387f2c8470bf93c14eb1d73e011a25136845cf8592d2a4623af13e004eb2a017c2e447858b519fabdad879914441a0f8bd37f339d20177e9d07354c27777e46741d8c53daa6ba0cd57f39bce8f891b598c4133f6b2b06b8999b86334152e94d5d42f97e9e09521c24e6fb74d5f89d4b85b08ad91ba91408c3443e9cb05389f1ea6ba46438b76f17233c0d0a6e5772456d5ff44f9aedd086a4bca27c6717cad86f019e5a51c587792ab9b2815546f81ee9a60e39357de46b9519d9cd4e6e7094a0255aa13d407722202e9fbab66cc3844faefef4622913528e1b204921d14b5a5fe85c14fa130763b73351fd2ca8ebd8674628992be6b03c217ab0a5c1904f66608aace9628728f24ac25ab863d869bfef3f0ffd928cefef82948a01058b3888a51108308ca6812d053b4a6345194288b8bc3b473003e75b0561bdbef461491c696d4cf92e89b5692c066204a34062e92932c8ae8ce0122f6874033a4d620ede3ed8c133ee7902b4fb00c9914ef42ceafd0dacc98ab9aaf50695d053d6b9d989d81a2aeeea49de11abbdec401ad8551a8e9d7b9c8c474eee5c261781c94aee458372a439300ccef50808a598d960ef1d3a7f449d3c46fb55f6c22aa49d9577abf0ce5def07f4f08588cb749ec24450a3453b7a73e9ec8cfd53ba8453daef4970d698dfffb49c8984e3a20a93386edeb05168030bf01c97a46cbcc4e217d164d27eee6445e01df8e2a64537e1e3396ac25a1da9634b81059c70882d50f0cd3282221022fb85b87012aed6acb5053d914c7d5bf079b67fd146c93e33f5dfb760aaefb95db728aaf220bd0f50db99cb8d6f140bfdd983cb22cbe5c7a2024c2d91088347a35aaf7345f2eba3b767d00fef22eaa103181b39ca45c101fbd2c6c9bb2a219a9ddd104fe4a46df44c96e7c2fba80294718dcfabf682c1336aac7bbc7142bc7159a6ef068abd85c032789642307c8327ecccaca471a40112029f7394c09701a68395118cc2f803cfadc4cd487d49c475f90a4dd32ac0cbecb3e820de2492df9bf789026355771cc202cac66029c9aea716b98ea492600e1893bffc5e3034e327482171f7ac36cc234c6bb4795552f18214f95c9c1d8612532573ed2c072786517cee8b3f7fe6980b30b917d32382411898f2e80caddadc72fbde6cdd3695dee7637c5f376740190b168bab6ba0121d59ceec09b47d3123be4ac773ef4926d4ca89782b00a7da6345df7553ecbcf031a72ec3f6de42111b7406036de0013f0968adb3504d2ce960f52884ee29dca7630d2fc13e3ffb95ee65b2d61c4dc9cb86eb89913aee8a3783e1f270333ad1ea07dc1b02a0c7a997c9456871320d4a985f81c22071e30049c8c52ab11c305c5bf52f97e2c7256afa0a0f7a1db4ee7d684bf82380d5b7f0dfbcb794d545e23e661c18bec6bf4b5718e89c1e67324430e9ec73fad09279d47b668ed1f21aa1428307843125390277c3b36a43b4d1b4d4d201aa7b5e0b059455e7548052243c662ab1c8fa630356462395f473717432d2c79d1891c3ff9260a2d0069976da555ec620e2900479ce55f29fac45ea06e658389dab3e685ac41b513c0c88b091f24d1956816eefc4d14daf23d5de22d5def41553ee224d29f292de124851729796f4aa37ea6fc5748ae2efa622f51ebbdefa4f49006f10248d05525beb0b3fd05e04c608782e16dbc1c2a2c2383e33c29dc214ccfc9e1bdfc153e5e1369c13c94e3d33ae7aebe02f687cf56be5c0bc81f95df89418d21ba9838b842a5a24736ae892252f0784d4e6f2b83dfe65d4575784fe15586434f8b31852308157369e812e3981776fa745140b12ae1a60155c662fa144d75392b139fa6d46ae16874bfcf0827a279e9499778bfb05c368c7b9384e9b7c7f6972860a34f98272d1804e19ca8b75a4005a0d3f2fec8be19697e7b5bffc0128006ff39a87593befae335a987034f4d55765ce8790672f8ce0fbed078de18c57712027e902e7173337c4564bdd27adbf5105aec57715faaf702cc655d079647a2731fbefa8cbcf039743344747177247afbea54a4f367c58a6e4d6fda233c663582d8e5f9a939091d6307ef889cac7175a1dfdb949a6eb87b8defad0162dbc900b0d04fdcc29f78b124c4ad5433c89a578c973a032307ee59a5a1773e24a545802401adcc64a18beb187b7267710bb2b91127bc1de5f465e370a7e66c2e411657565b7049a72bae06357cf4b880412b5f8c3c5b56ab735a1a7f3d30af730e502f6afcf2e990acff136ece9fcf40de3bbfe2e01a89e95f14f1efc40a4f04a8ef4bf127249202b5ef741183975ed2137d6a7b72863609d80f2eb6e1b6ebb9beacdbf0c1fbc7de317d729d767f1a6e7c42f01255ea39b48e94d11cd527547a9005d7c00f64b9c4daa9bdcf96a46512f6f28845359b4a6f2f47c29ec9df132a584d8d6f4540531b8ac1cf6c40db39eb715bc46328b90c1a2f63b53a7dbc8335158c525486c05778d277097863aee0e00327bf5c2b7539182beabe4afaa8ece8dbc265a5f1f15cf5d121868af3a648e6f260cf7aecd73097d21442d25cd348003ae6bf3b0507301c3dd3b7969ae053938be1db8fc80eefeaa33f6516851f9a6c6542d82375c3e11078ebd6cc85104279680c27c70a05c467649ba41f4a569d46dad683cfffcc28aaff5d0fa1dc6d29d7f9aac33b0b986d5db8b05909935a98a52db43c2b942e093d983302edf0b71742b8481719c260771ba365f563263e74231e3e28d2753a8f207818742ed5c39c5e73da2f082fcf4529cab5e4fc2a33e2390f4d2d4fac22fe80f0c2f44902b3924fefe6be2f260a96756daa5e99d6167c919052c9586fdd74d654070bf2df71114cef74fe41b092d7dd74af0a2570b1ad6459433e700c2c436b5ba8f044bf55704889aed445ae162ab7257d4b48c9ad16024ef26e4e229aa273c89a6519ce204d68eaaa826cfcdee10fcd6dc194089e99967120a7e5cbe842a990764a9a6bf0180fe479470e244fec32b096cf78fefc5cbedf4c293263d630f5995e12568bb603a4a70df9279b8ebb1c54cc414e23006c5325cd461632d25a88d62b259f7488f30670a4f64edf75f05b33bf672dee11041f08d6313c4052e9f930bb83bb211401e9a6adb019a436cdcac837ea95503246ef3fb8250218ed30e140ac9503976e0a89470a34a775401c1a3742804eaa3f882dbc6d42bfea95d0170ec799531793adba165872859b131b5fadbb03023c3d31e36603403557328453ccae9e7e27793422be638c536eeaa7f3b2fff30e82d5a7e1f8e2ce0e2735ce4dfb4335bf8deb91f526e72c4a9a4106ca8a4ff67dcc557c40fd0bd90df45da5bb767a9c366bf68b28efd570fec9e513b2098e0ce67b7f8cdb67ea6079a528c2a128f723c323d378400aa0a58000f111e5022cdcbb0f4df41b2ac6932c213288aa7cc83b0ad91e2e22780b20d472c544d638a22464c8bed5bd15cf255ad164643291e7809e71d09ea905893768806b5b847a6991b6bbfd20f37a4ea1aa9caa80379b49f8e8307fca10efcec6b940f2722b881b05770c335ff3d5cc06861ae9f93d67f7e4ee54cde185d2ecc9bcdc0b38ffcdfd1fae94d76987abd7f3929c7d416d5a32f60bc15f46f2dd5346f3844e66fc06594c55bf5a22f38c9b14e6c6a73fb9362713397f31b2eefe9d29d730cc5310004a9daa7385c69ada6796b4afe986228ab36be87cdfc0bb6f28cadde4420d6e00f54216bc6098572fec0ec8e8f2ffb05e8d39be7f9f90af0be562bd755f275123149b5d4d64c7dd5ebe0d6f16faf0bbcae9e5aa158797eb21168330cedba0d978a8152e9840eb4fa58855973265f94f35e37fb4203ea73557d5f8f5c17b2497aaa26d3794ec9fd03cb0a183b1ddb6519b673ff795ab283e09da99c7c33ca792a40ca13f3f82c28415adc9a1df5aba35067ea1147250e9d5642a7868f7b3b66e629016f4e3b6a95e91ce67e46d900dfe032f1d6c18dc55ed8258b7397d1b05a3b40b13550c328e4223c5a8da0669bb42b85319c08f45eda1c8cd449afa4a24b72381f13d1b9801e7521ecfeaafc66513b0d1d7b407447deaab0714a9cc7eeb81e801722b1de891d0cb00d2718d89a27989105fe19938e88f55b8f8d5d12fa1524dfb380aad489dbad325a7e7c0af5c79e424edc90f8263e1e821dbd208544e4a6c5ce65ac66ab457e42e8d74598bf208780b0043b540d0c6aacd0a39e532d95b7aaf35967cb372dad63b499b8163a518b6ac97e5051f7a4f2307c4d4dc0588358c90cfbe819754dcee96866a6455180bb1f81c0c1b4bf46977f182ec7cc66a6dc58f6d65d4ca4f043c47335ebe9d91359656d3a697d4350cbdc0e65533b901be87b6d18c67b3c99f192e574cb3e44d6a9fcfca7fdca1151bafb68bd86bb5b32ce9f201c2474eeba221fea82ed544dc628dc4db2df93057aaa863cd32b9f15b75aeb246a560d199eca647e69cbe73b4159832c33c210a5c2c776b96a4290b0755ac4079bbb4e14aceb5df64c0cd6078cdff2c0b9e50966ac032bf31144a99e574be358658c73eb520656d9efac08081f5b535114819597659432c87c761762e44c29e53f58cdc0d5cd75b99a2dcefe1ebeea660c43ce24cde9128b60970ad2e1fe9897c72c9765b3755d18e3923dd36a3efb2e21e95b67463cc68f99169b0428b4b944c8d400c209cba66b998ecac651488f1f2ecb780800244463ac719f60f9ee22617c11bb847797d48b1845dd285f8bbb965a1f8d48221bc6abbca41f1358d4f10f10df5414428820b48baf75df01d3d2afc6f7e0297e9aa4d403e06c04bc9d013f89cc233a02b9b5d22973032ee0a39ed3f9cdfae3573d3ac87da8c49e30773493e00692aec8ad0dcbd87c121a9c14a8d2792950d1df750e2b867126d67f98da3a616eec81234496ea2f8f367f783d766ccce7e783af9c1ebe7ffd3a3111f1932bab0b177d1649ad4457ccde092afad9cca0711454b5ecef7068ce226c9a520ca41369abc0eb5849eba0f4ac41ed48f6726adb8a1a2f22a458c2589c02f49620e5316efb43fe934ff6cdcbedae0ea0d1ec3b34eb88c9705f24f2d391649b506b74d68d210d61922b2a7fc0a2f219ac10e708913fa8e69ce37df99992052eb61d1ece17f32b74eeb2843ee910b7e6020494c4507e5ff12875494f9aaf4e05bae115000cedd8d2d3f93068afffa2d50810ae455033ca3f138b2bc312c63baeaafb4ca4bccca5e4165c8c83af971db673a41686a1b467fe0c392351ffb0467bd338d0e46a16d461aad178c49cd10cdd0435b4e27945a39e0e8bbd81fe6df23166af606c3fbb35c6c18998a8b815d2ecc7a54b20dd0b82080973609f70a4e8c617c020acd6cf65299be45e4026e2d228a11ff48f03658b641b202b8e52400a514e3e65ee162db4f9fa7a18e35a1f5b129f8706ae4df36696635b3b9c8979dce32be6f7fa5ac65547e82a22ba37c1d0e4fd8e5e637594a476711530805cb815ffd9fc1938bb0debb789be8fe0ae11a7a2c4ddde2905a12207af901243b6b303c9e6d0ca907e0b79e0389843899c66a90276f217097d9f07d2071039e2a3a1ff41b4b4df66fd0a1938ec3845b7dc2f7f50aa8da45c955e716baf9c6f58057aa5c6600122069a59f3311ad24e4d239a4ae5043213728cc51e32a97350100d74709d31eac0a1ecdfa88a6d82b61b1b95e940732add74adfe9649e15cc74230a8087fa11456dc33acfdb13d82d4b6caf63024fc8c7f5c62150eeba1ea69c8a98cefc82f3f7358e7efa3029e25408c336c581e75c97aa5f4c12d3b3062e6db81da74c15839614eb8039204383b46514d2010a02a3c8eba510b5b35864125e80709711e46082190549e70eba5bfa5fe02f19db513e37870a05ef14d7c65e8a32044299a531e81875bec42d75953405a21978ddb6a193e284121f5f2648d0f525c7a8ca3625e7d3c0ba8cacfceb66009c846f7676ca71f056391bb84715015ba100ba235ad10284431a66f9494f841e020e3f7cb9115c5380067e5c163e3a969a891d47bac102ab3c00d490e85f2bac049b5586f092be9966441159a21ebc0f16c79b22bf352c7c26d6adc0e996655f4608f85eaf3c866b760689a5013d280a196d6b023c708a8e76cd6bbe9479be521d2d055ae3515fab406b3f233c8c5d01174c5d50223cbaf5f3e794ae879404b0f3391ee1c249739f88a9125641b566a017219619c425331a23f516a8974728015c8ddc52b7bec501aa33182c07867e925cbbb017fe8fc3f1efe00d8829f50a320c561c5453518302428687bb6a2cf9e05e54e36284ed3ce09d07ee2092f79810e4ea11208e9ddf0832a8f628c3974bf2a80ae1d212e3bece1847fdf008f857a28265649600170e03c143fb17c68428f49e6484d7e219fe2b681b1adf08c474ee995995f395e28c13875fa694a98322b7cab0480b590e50a108a14d8af5a012e3c63e23592d56006fba75f1ed5fc81452bdaf19792976a2f7308f4bc17335d2a4df5fc9664b6606506e103151b99c75dc55b07fb23f79bf13a58eeae143184125e447b8ac6561a0f86732cc0daf703529ca269a5a4bf513e38e4b1715de08bd3237d54fef4411e3a6daeaace7055aab3298ae6a5351d5747865eb22e7cc2b22f6c7ec887d4ead995b35a676f4cbcb0937a19253c99b199d11066d5a29efd8aca7556028c0e6ad407adee589d6bc20161efa03988169799393cd51114d673bf1ab593b92df6f6dc59dc0eed83daca3d06de7051bd43742a16dd52b370a8b195301ceeb564ac511b3fdef93888e178280e5cd940815b8e1a7df52ec1bbe0058909e47122961b463ed6e73ee8359d06c420fe03fcea03ada3c04cc6ea205d939979d9a640e64695cd27ea10a8a60397d7119b6b1b30cc9d91cc9be78475ec1a537dd1d998977c05b65e8538a3b271c309d7bdd4c32229c5262dd700691eb4507ccb6be94b29d33310bc1bc2be2c81924f8e09a2cea055aaf11319ab99e9e4ff9d880bd7e611ecf56a4aec9ab29d69e50c88c576948c4290d52dcc0775e09927ec9fa414ab348542501726c47064c3ca3b34f8f0ef8bb6f6801e6293850b158a8907a2199b3c9fb341773c424cdded32b756aece6661b192dbf665e8597c33ccf8b98da5e731418f1a29e5b20cea388d4e1a61a3b3f66ee64663192d2f192590624307ad8dfd325133861310f6657308b02fde5afadb67bb98e5228a9732889e3c70c700033f725fe765fda503b8c3edb9b810212080bcf76e3a8b7d6fc137b1d9f2edae758eeb5375224fbff93efdf2b908704cfc52573c5494dd818c899ba8de144fabf87b2efe52643035fc9fad9c5743c457efad1cb2caceb029a6e89bf2117b25120203b21def16d510886f46cbbd536f05bef05cb7ef5df83b861cdf37526ec88aa4c06d3dbc36875b39481776dfc1af464ddf355c29e53d1ed76035038aed5f78374be7aa36a931376ec179655244f398c9efb35c4cab56190bcd97c0caf5a3cffd8526921c325da143c83b28e0843b03c81b0add5be411a07e123cf3a303b5cd5b06f745d31873dafc1002c0806f91b210e687a0b58ba13fc98da9a02831edb881af0adddac84eb2739f62c2341cd5376d865ee980a6b8390ad248008215f873635f5aad65ac4909ad482171f9f26c55b82874848f9ac6ac8d1dec49f6c4bae677b0a54f43ba8dbc31a168ad7415df2ac7079be1ddc23139eb852eb203c1fcdc883a8a3c6320ef5dd80d79824fbd0566e0b347122a36daddd05a0440d46cac12d2d6a7a664a40739f0de5df375882ad5b3b2c6d1372eae46209268163402bd77df4725ede28d1bc89d37db4c4485a086e0fa252f93e8f2203150c080ee0ee2c7ceba8a12c15aeebccc33572482d844d2bc6c408975cf3b4ddff7fd07f1a647845cc26d5a2edc465846ccfd665e62a59477f126b3a7d9b9e5d10584f44c4ea6fd0e7150fead5208a90be8554beb8c6c28c14efc08dd87debf043a822055bc962dc9fc753a4553c62f142d811fee9c0c105b43ee60c5ef495c880fb4125f456c896c91633720e18ed7159f0e67c702bbcc8b01984d1a0b7c245953af82093be2a3b48002f8c49b26b37504d9aa780c0cf392d2b1a4ccb7fc96c42cd390d23e29d6187ad03da5874ec70b57191627d07f500788daf429208f4d60c817b8d9a9490b4a93b4ac5f1a90b2dee478d092c9a61226c4fa84bd976ac7455fbb5fbbfdb308475b29494ce7aec458eb22fd84212a7a8ba43580d64278bffd05bc1ce1d0c435710c72c65eff968ba446b8695a7bba16603897b4e5f418f42150e6b2c29a2c15abef3e3cc86b1d5a9df043a97575227bfe67a83348475c11984e09b80f64180241320096cfc6c07749e2b1df8269ef57a2eab36b31d0692b46723ed4a6889198185754332ddb0cef8d23b1612e3b90a62b902b0e9739042fa4205cad924e67dfb3468b9feed7c8ffc14c3e0edc88eaddc353a3f76a33655e04c079b5c2e801c092818aedbe910055b62aa5be14c8d85a07e392a929e767601f87d13fb29dde58bae2acbf862bce29043add479fada22e43c78305065e2cc563c947478225a003f27827a9ffd2decef6e94e719d5a9ce303d4e643203334a50ca8b4868606da2e7a0d7e4a30e5922300eb9e08460b633b36237c817b1419973cb3e6c616d71d0be8b95eccbf7a580a6940fda817268ef9db5da70f739791967ed172f35be4bd1516189f40acdfa22d3b4b203161ef6d8486c5bdda637bab67889e2c24a8f414d21f70df1e3b3218b44c8699943a8754b2dee5c5a2f3d76046b58e70da8bf932810948fb650dd9cdf5d8f9947e0fb2ea2ea8cf6b9b81b1c60199fd0cfc0f3ab73e2dfd9d860b4a8bae844bd629b824fd876b38143a26bcdbd3ba669ebcd515faad665653493da5046568d7744c42316e3328a5230b61f37b002bc1dc335f82806446f4ad2d344e3130cd395024b2b6a3c656fcecd89f03ffb01b3ed5772a6e53c15f7e06c0c37305a43c8e9a4f7043d9c581156c63905ffc283c40ef068289d1271f58d8a10f234680d439e3feba3c62dea692f325a0cba55145931f7b54eae9c1f4dec0f31fbcd611eac0955f3a4ea24125b121165d5d4c07b0c31d3df228967aeab98af2888391a88a6650e655a26086bde9e131842465d842c5a60e18ab727ffb05c77ae66375277e57c6f11e904d95005fa2c65a2339872a3b71c7796f91d6421bc7c6fce3aede79bf992ca6b62f2fe48a28b4251671fa43e4025958d0af46ee16fdbe1124915c20155dade7c5ae4b1a1653427199959827540c8ebf4db7e168ea36bc3549da119233a0985ce1a83b277dc18f00b2858b000d641b1be45e2cdaa6cc117f377a9e34e89bd39b10eead1244e8b7dede0224ffe3fd606b97ccab952c2ec609dd56b5d2c87e0e1f4463598f6792d6180b97d7ddee6f435d9252223d965684028e56c1b59f85c11b2d9fb4ac4aa94cc89a837dd12ac4a8042a52823ed2292941a97e57d94380f3eef3265e9ba4c6daf799d352a57dbfbaf07ace7322880530b0a79a813e456b0ad45500aba79556bec40d686b3317911a6ee1e0a2dbb888dd7fc80ef27e3a8124a9fc8e10052e0f2610c78c6eadccaf0878e9c04a7d1250b2a8d6f188996a8afc367f83b7c85eea79f3d118193c7ca8c5f934f2393293c20478ea0add79bb0c532f058178b75019f430206aad6b7b20484e9c024318770896ef95d3c4065507e9c04df8b705a5626553cf3962d42ddfa79465bc9fece3c9b6d71f7008c05c2057ae8e7c9a3f0fafe98b2f2ac43d91db2c8fbc27d4f3cb96f6c5de5bba7809fb4c743ec1f96dec72f92aa2a848950db3b6dfbfdf0451443caab9f1dc7e06363dfccee3f326e11b9aa6cc6ab54ea9b66d465b281812402cc144403134cf29d633cf9546eb6409a5bacdd265fd0ff5660a2f338f9d5bc744ad6d658c2f299bb3c7c193c328336186c6ae8e288959fea5fba057b734cfb90c7e2706772966f33585fe94939a3152584c4a4b1a42b958919844d16fb426c517aac399b0add412b284b2a593f788bc0d47d91de2b70aa33e1961b1fe072180d4dab7aeac40998b94195054ed4f89f5b8593625ee2013f2929bcc93a40d920bef6deaad20aef3385a8bdcbc7371ef2b18acb15e082543f908277de31267300065a5edca12f2b58b934ef173817b2241a280b49969fb6f2172d617dc0c7fc2778be061963618298cebb2ad88b02328d08fd6f75bb9a1e14b6bd90d69e4ed0384ace3860f39756a279b4b2b1fc4b2377bbfc48f4a4b1e779d6688260ae4fbc9f3eddb63d7866eef8d5a2855f75cd308e1ac27d6cf19cd452dda5b292ffba75796c381a4355bccee86ac98fd430492273e625c4f16933db912ab4bba47dff57091b973d91f4dc343fc8f1b78384680c030716c3fceea5b4a1f90a956d0cefe1835f32ff250e732590d98cf7e74dc61488d613f6569141f0f7dc89d32ccd76d235a04ce3a4dbca7ee02d5b5dcf6d120fc5cd428a278bf7c27479caf94cbb0e32e710fcc3d5959157c9e5e283773dd76aaf0a6d1b612942a6b4aec04187fd6a2bf8352d9e4f56e5c43e9be84e68daf39c2285b451def3405bc5b00f4ce13da6fb67f3ea68f10c4b155c1ce2ee4a88ace075aed8c984ef717a86070a23a7af26eebb8eae8d1a870da02318635ddeda1bd93c58d6e992cd8a197ca2c87e89b32e732271640ffdc1334572b80321d771eb11540cbcec678918b118207836696f4ef7dae0e67f8100eb8bb79716c8a5260b408ce88f950df1aea000b757b1570f3cc3685ac8a03f0055630d47bd3a8e9a27fbe89cd19f4bbed0975691cc5b2c523c016bb88e2cc72481b9ad07d005da50a5cc17a3933423fed48c8643d8de74f8120f611efd3c9d22f9c865a7cb692ed2943f29fbee544c9907f5e662de3dd08aa707ca3475cbedd7c3adffad25749ec1aa6e6e1ab27eea1a07b31f5e2d823015fa5c4d4bfc9b3ce60faa70a15e17208aefa6fb800dc6c79f058cc31772f4513893e82b126f4ce129f911ae19e121fdc48991f12fa483e70173879ae448baa02e73367b9c1eafe4cc38cb212c13fe91f756f56438aff2a5d3813214af9c5a5acd6c6f51d12453b26cd6c2ff01167464f6d6c5de9e125020f87a768f7d81b6850e2201ff1f78d891e3fb45c39c77fc7315454cd06861016b8d1405b612e393b7f587182a15a221ae9c17e2fbde401a3fd15c26469e5ef211615c677cf6c7a05fb6601af8fc68a47dd1dfe608a3bd00caa4997997d83fdf1a502e32ced71ffdd6681dd4b15c645aa4dc833cd0f79770aa4ac144bfa23661c5054dbdbb6ecf2157679da0c047e8560c9e96012e55550616a240619f97fd0a86aaf8d11c7de03ca3e5d2efbfd9144e2cdea1cabe4112f3ab5bafc0031693a571f3468aacc0cecbc5b926f3a77d3cd0941118f50f167e7d8f60cdd3e4c482274419691c8c1b1987081dfe02422fa4452a075c1bab7b2dc80141c5d1800b1dd4a9b5afb2dd7318d37ca162a25fa72c4f3d61d2efbeb431072c61b5efa7cb6850dd2e538dbc80a3c9e30ee7535b45dcd786a199f1d587c59f99e7dffcf21d2f4758f90a8167fecab2b59216cf2dcea6ce082d0f245ae26dc76f730b76e6c6bb6de38c35ce683efacb13dd55e2a3ac1fa84abb993dd8f3e86cea7fc559c1c282c968b5c7ff883f5816412ef36e331d03a9b1de23093025f8db81f922843300c717e7e6aabeb5ce30545dba59709b2c7d96662eaf359f3ba13f96381e72bc144fae38c06fbbb0154f36e1d804639f7dfd8ff0cff61f4f60b694a56b29cc907e88d8c00ae6ffca7b08f4916ebf008aa7e2fb5e8ac8aa6e0b79d477a851cd394cb6f549aac2c7b39a0b5b6be46fca819b9bebbada382ccd2b33488a9d6ff23c497b70538b49b02c396cfa44e17afc6487f1efee02057b1f6ad10631e89884e93763f3c84001891e522f8c7d9b0dc2c2bcf7dd6bc3fd05e2d8eed1c2ada6c5796da48a38def25ec96a49da50b903cbd1ece43f76b65bd70d42caf4d2a6e8273507fbee33ebcadb874d1cd64eaf9eb7e605c4d5b91eb6bdd7eea956be143f304248dfad597c12c259159a4b0cfd6863a206eda5c107dfad8608fc45cf3f61606e5182ae753822942eb9a98330dbfd8a0f9ba7f9db3d8c9c229e4add97cfc257128181732dffa5c6c78db6fffad2d058f6209a96b8bd69e61dfcfc7f53118375eeb9f9bd206a071c8d44290c19a0759a4d10b6e08a5bf597398c34b4e5cd6e73e730d44de8003a47940d8d05eab85db69948f14a889f1f49e35d51b319991961e328af1e18e942c0ac3f900bd736a94aea17504a85d2d03afde1ede3908994644e1277cce83ccdc595c1a1e2808c7f0b01009ea1b0244711a7c72a07bddf4f1c3dc22a28e879099a749dceab7acd1db6b676185c2059e0dc08704378874849336cc4c971a180001fcd1578367e932b102693c2bffece4df0be8e5832efcda832c4d9a33b31718a5ff5213300e27dae1095b2044208d8ce859d196102841e433a536354d1ae0310d42eda58e9142df1eee411ce5366f6f8a2c8e06265af8df8065e012e05b4e5ac649eeaa246ec579c6bb36c24d600d3182238b47632ba49e264e43948a849aecbdd6d499cd856201a9cbb264136ab03f9ac892851d583cda6e3194c8eba893e77f8c5459731ccb9f76342bf376a9bc590129688de157b2454d498ba62822128388dba7af0d2d2760e6bef1c07aacab830d7ea594c135e56ab939091c6b2220840f02b0f110eeb11e84a8c181f63d3b95258ca064e2b2d72b15eb5b09cb0cc1d003d25832c3c42fe4ab8584ce24848d0155aa16538dbb2cd294d5e426c0625655497b06a7d9abd106c6a1cf01f87d20be67045af148f9243b7916c11325325512970e7631a01577b4fa1ea4f81fcaf54b10cd20c24154cbfdc59d808defa5de967a3eb8860735b273268be8a234085803db2c00a99d0a5c8eee25e61e384a1eee286365bc610ef460e84371984c5f3f38442c567c208668c1191b51e0b153a5e023a92a2b5b2965114c9b369904284be66bebc0d48ec3fecf3cb63e3b59b7d8787bd34bd432cb17c5240c1af29f9893b29aa6eabc52e1751ed041776916ed5d005d0d769b2dafb2125f3dacb9e59e25e5acc5272b436a46bc482a40c81f80344029b746e591e2549723716e96f87ee7a6ac9958884e0aa0abd8b9a40a53484b2518ae6066728c16d87356d6b3f83d5127a688be801169dbea85ab9f86f612c0e8fbc744390357ebd4d25c28f9d65b3090b8b1d125b4a5f325ea1c03f1aaeb2ec1e0ca36e8b76f1980d1eb10857fd557b6ad7417bc7e7584624682ea1b82b5175387b6fe333ea81fa0dd58f573f6a352b66e537d8972317fc971b658e609b195094c6bfb0d75b45a9b59ac89f122a7c8722f8a14882159e2d2dd6239f01aebdfb1a8ca3c90258aecdc40705bb88614622fdc15cc918798a1beb3e250234cc93c9b5d6696698df9475bab19e8cde596023927f748084dc8bd6e99760f1ba21e330484a9d0ca7e16f01600a956bfa14e2031695552335c940bdc0f082b18c1361904e554fc02b7db7099258b3d9068517c11b7a35bf054d450a38207e415556e73b1de589aecafd6a42f21588cf0fb7a1d869442a85e6d03a3baa9acb8dadb14006dc014f6dc1cf56a6839abcea3d8009566b27ab5fc3c80fcf42e51adb08c5fbea870b5b29c3e57af07cce911ae1c90ef6580e8df94ce0ae83fff5a6a981966da3cac3f973ac6e3a54348b2abd4d1c80e07125a9b22eb29e1e1e092477afbe780d9bc4aad8fe2d68dd853df15242af9b4a76f471b7d6da7a3a4a28dcd1de08909954eecc772772093522e31a6ca745fa398320c3489e6209ce53186cfe5fe4d67faf7f9d2be7fa333b910fb3ad15663537cca20051698bcb32654a9370a2c766b4e91ea7446d18234905c085ef7008e678ec9d68a62f2897a558b31eef28a3f39a2a4273d6b9209f6f37099389e585e6232b9fc463e02c2344afb243d79b1896bb6894314904fa9e69b7002b365f67545f629fe0e680382ce6ac795a4919ccb00d7c2cddb9aa47d431eeec84bb3cb5fb44def90a7dcef58a973d415b28ac1f8d968afee68d9d296f97710a772abb201e11a4d3da8b15dd5961e3d28d17cedcae0739e841eb90547d1e642d3cc0b9f61221ba114d9aaab60ff237e8e74843836e5614870a57ed96300a67eaee6717fce92468fb15a4b74337a68173211041ddb80d8a3186d92ef9dcbc6411110ff396454a7efa8c70fe20c1302c4a1fd29a66d02240fc6aaec7baaa3ad86ef4998079924aea7747aca4ea6098001cc8469c494f4ed2762e11b5a1d86610591bef158b29188ca4ba9ed8d81cd03a42faa40644464cd2ca7e8d2cda6cee7c33f24e10df9819deadcca14d4826946cf0efca58d6ebab789afe512a03e23a49769c6595878dc482ec5c7c5370be00bdeb695fd51a598982d8b1bb7000c26155b51df0ab80cc77de3660be454117b2a52ef80b9318065e8655aab140a3ad65f4fb034620a9f6ae7c3e4e66bdd9017c788328ca37d4fddbfea2c2f8a6ec45feb2bd0a6e7d59d284576359f4d3047d32eb082b575d9f007318d8dc7bc46a33d91376a912e0523966a2a7d6d715138438c635a8e0e46287fb78cbe154ffcc9d22f45d9215ca2046414b98b9c3023e837c87f08f8a64802a11b9edad24e571c27b73e1cac9cb727bba68e44461263549a3a820deb64e12fd35f5f0c48a7fce69b9cb32742cdb7167efb4d5752aad10442c444532c7cc894526450e114b751ad4fd684e7a9993680c2c0e794e33ffb656c7432b9796428248ab6c637338e1e4d4e5a02c9daa7f303670775496ea0c07192a25f9b484b9e60a369d91931ad91466fc0c9fe974c2562b4b34d0f8e466d276f768fd44752074c4646337582f34bea81138b30e3d302e583c9b1c08b40108ba4e4902800e53287d1112b1d20b6bde3f138cf6102cc6b5b653666f31918a0f6072d3c2b60dc3ee06a70a44f9d8b283ccb96fe03bde6578f9674b1bc9c37222a8d3c4a3575a6c395a9a40262f0ca26742a436d2f72c02f534065f965f5e61d12cf651772bb861e7f89e995661c5f17db517534daf4cafa81421fa0f1277521299216a3283c89d4137f6351ad9f96fdbda547146b39615adc945045dc24d7abdc44fd8f2f4343006cb4708334eb51254702780198814ed0889226556607893922733767c7b763b1a43c9a52f2478d04facfb02569f115ee2ae4b978316c1272d9fa461fd72958d233168600f73621a5ce8b11ccd6977112845d95631b995030cc0421c790d4e8b546095cd55b3567bef81b870dddcb90d87d4a9e3696c878689db63635b18d74068a7452a5db462c8c721151f272c1c90ff1a4c3f04b73b9421815c74375d2c0baca51785bfa2b1fec977944f1dbfc1d67d734206ac42b02f16697a05a9c070ae441a10d354a110906933107a33179970a2f81633be1f4224e7f8c030ce4903f39d9cb6992e7577832f9f853e94cc8cc9216aeff130dfdb36b462e6e08608cdfc83b2e5d0fc072410709dba730d51bf5f51ebdb6436e1ed59c15c1cb75924056ff34ee2cc8a5fa7c6143b17aa4381bd09bb831c3c91f9465b48383f2fadce7c0838dd1b9c1d99772e6cf2ff4906e33fd12167033ca4b4b6c1a437cba71f663892d4888a6d252450ea3447b41dc10270a02896f2d94eea68a2620b4665f7211c131aaec49a777cb7ee5d7cc102433077c97cc2c633de847d171fa5d51cbc967b8065e14cdd242869490ce708d3c287a35f5199acd4b8a8ec91745c3dd178a0a7f2ec333fa42d1b9fbe60a5efbe0a2f01a1b29b3a7322ca30f149debcf1505db978a7e6028c356af51a6f60e8009ade4ab5565f6d9ab7c52bb84a23e5dcb9becac8090e0436ffecc4a916654e9d64682bb694c4ebd181535fdac96b271c7846ef6465f32f82cdf8d821d5def2fb5a7cf5ef83c1a940f4df0c0c65ac49b90191f39de13bd8e3e406fa337749437756b5e62fa98674ac9198effd54153fa6bafb42550fef605ce3040b78ad18beba4eb9399687f0af5755ce81dfb355fd05b67e06a5f880cfb88900297c367a93b524d8d8b0ee8c7988e0084d35722c242c7042fd5886a1d81b3519bb49b1d5d0a0b73f5001e7d5a912b1b922ccc63dad8987019f68ab58fc90db48abfa62644fc84025e8ac966509a84271af2bb4161d6dda6f9039c041bbe902ee437ce54d4036094fa946418a3414bcca4e8bb7a3a47ea785e3d96f361c2147529a7bbe0c3a7719706b3f4f0519e959aa4113028fd2f686bbf07e2f442db85b0001072973d6191da197010476edd973aaf4ed5c042b5f790090787a2aae7a5745c424190404dd59abb717ab77a96e4b711c194f12aab6f068c05a2c0c4c6ea759a4147f743bd18316af7224970efb540521568d1f392ba8934ff1f15343017a64ced05d847e0228bb3f38f74b237c6043bccbf6bdfaf6b94aee9ff220bad548e22ad1944bf3673c0770da2c76be9d1b17d8501617fce2e17944da10fcbb9a1310af3f6d944477c0313ba19b66c1f8a0c9ecb44d0bdbaeb9d04532f1c1daba7f1dbbd9d61bacce7dc269f106276472d8f2099f552eea40406ae30107c892a16f09272618ad7373ff414bf8134e05e6f2753ef94a3a66af3ae6aec7296d0a2455fcad6aadde2885ed05bf16ea317c006d27f9130b140d3cd3840e220d83cb18100e13f4865966b2d1fc176b3dff8ea1ae21d19dbd257425c8e236e7c0b1c153d2b5e6b2d3e92915ecfe619dcf873c840a4db7f10e9df1b263a96f1f4957c991c8be9ac4363fba6c039bf97f9913f6c15f3597ec6166ea97d3fd0c38df737df2d91035e8b6e76e66f31bb2c9099d484ffb4c0f3450b6fb1e319b19b15ee6e64a64cec724358e00665c2c465eecdc17aa733ef0b3a2c48f001ce9f22c63cea55a48030c968a86ddad167674215f4c8bc43ef083781dcaa1a2d6e807ac9702b76a04cf4d715215f4c45df906f17717334726f8f3f6cec3843ba15eb08be75d2d2e29298292caf236640be8e6fd01f49fed2058648d2cacc6c083d2992e796a5497d5d1334a1cd9c19d285826cda734091708b7aabc43e14126d697047534a43a3bfef9ed1b0b8a698fddcb9f5fb3ece292cb4fe675ea8bf64b8cc40e5ef732133bb1e2cbc4181ccadf5f3816b8830de276d90fd532ed671f9d6e739a1b4c57d15cd82ed0d9b3aef7738ecfd468ce85e3787da7e926d1fca5bdf2e0dc58bf7d7f2c23330c476c131e5587f8cd4b0d28fba4c7452714bbddd0a04c21925fa3e94c6951d732d86dd7697453c0705af50f21a95481f9bc9af99e74d135d1b243bd8b4c18960076d69af3e582faee091d755e50e9f111f44cf95d7cfc5748f8606ee03154f065f0b7e67c7ea7cf918a08b6479732ad5ea72de2e982f3ed073f46078deae8ef31b5655a70171dd55f600d277b2e1e474eaea34245b82414d050088abc09c6913a7edffd797ed8a2946d82788088175e9fb1b4ce3807fd7916ce06552895b156c8d9df64475a524681f073a1c735a38ba111639af99d325435202ad8d16464233a224a81de51db791f9d64b3e42fc69d37cb0f5efcd2b46813da628d5d16c26eed4441132b71392d43163bda691ba821552b885d5a86ac847557949ea5fd3281e513ad4c9950d36f96737fa35c98d110db6866cf85272f7e1ada75b2bf97bcc4c7c4d4b5f432fb217e469a3f0eb03f47fa58e6295de2bce73635cb11adc4ef3be9b40e081c87d40f6d996c99adabfe58bc00b76adc15c35e96a571f0fde85103b1b58504fcfa5a0804ca5e371d43e83c5628929513b2f58f9ab0a131fc79395414857bd59027b94274a865a094e4ca32852fecbfdfaccb1eeac976e850383d023d879c88b398ee18e2697b20f9d503a3263028fbea6fef18e0f32d0d511435411abeae94a506c7ad2da7a3f13c3fba024de214ffa738592a4abb82ccc0dc36806a91fb9ebae89097f5771c643dad4ffea5c744e43b4e2735eb79ef96d965f5e1a1d8b6b8bcc79178e078ebe424c8e61017cc9f0f480791ecdd50fc29e7ed694123ebdae0bc92c62c704d30187b7547af6c6779b147bf3d756b75cbce4a67bfb233037df5d123078df8365cd88f560d415eab632de844b65b85c507bfc263268b645f8c4ef5205cdbe822ffca535d06b6bf896dfa40caa59e06b7e291528b7165ff94d6b4059abf18d1f950834752d3e8fffcd2a83d6bfbe4e373fff24de2d99eac8905a2ebfca0250ea8ff8df3f6818a794bb32eb51312896bf31f6cb027c2dd0635d5e014f09893eedfe0a7cca48f468b757c0534ca24fbba7029fb2123d5bc0ca08b070828ddcab78853b264afca52f04d58c3250dcac9b93a00afadf98c02175419c08366a53100fc7f05635f9a1f57acf1a861f52946ac853ffbecf6772b18319c1af8d16dc631e7d1470fd973ec9ba9f563137d5f8013d83f976a64193feaeb778fd563072f300e8fe6ac3af46c9bbd083fe34ac88a900fed93327b10e082e4b8db5dcd1803e0452f9555762de5402e85e3ed38736301858600f44e23aedb2834c6007b23d8fd62e94e73fd989280b40d3430867e8ed25e011e2d66aef8c29e6651b0a0e2871c0f50f1867f139e325d7f8ab2677dad43ddd1bb65821499e01627c28d53505a4ea5515f9a611d1490d6933f2001982c417bb58b5ada4e2d916aa16f8830d95b858528f39c12d76883fc9298da61a388c01580e6785886affd20b0d7fa88fe5c3531039e7deecac6db090c208b63ca9e3adb937aa45b2118446956ae141a8d1e28465411670e1fa7d442250862992d1d244c8358491c6f80516f7f8c61417e4e971f50b069c975c3c31556724899befa3c0ddecf9ceee3970683a5b2288d7b8cb113d2c7853153fc631ab0216ac14900778398dd45549461909924cb3c60eee9f151c360cfb0edf14f0ad3781c4f651aa173273dd869bfd4f41cfe4da02b66e2c25707a353a23901f5989822c01cd5de92bdb44698a84ce5203f295abbf032f1171d894188eb94e145a41176edf7aa66a331ea8f62983af71214fbc2286186fccdd1b270a8a2155601c11e31e45a9c6bbf52fde3a8c00d7d6aac367ab30268bdeb8b23608c5fc50646d5c4c21727b595638c2229fb07ba834a6c6ed79d1c8c3d618b34c252bb5dbc06346c44a7c1c72895aeb726bd024aa1a4de405ae5855c9310ab18bd2aa696f6180fd07da5bba0dc1286480917cf6dfb42da5868873a536c785d37800677dc9136bab022b295dfe485b5e226842273194ed3bebd5e5c78279aa761eeb0f38b55378cfe75b0f57fdb49deb7e23554be17a64fba87970c13b2610c72d65e14ae9d95ec23b99c57be100cec4c3b8a2286096c6ecbfa5f5fcc66fc4acadaebd6c9335428e0f957c8cec508a97f84241b700e0b8384fae995de0664045dfb4f47bb3f5e15b55d6d395982ebeb6ecd4f9ba5f79f74ee983f625756c0a0275f0ad897bb2130b0e2e82c2cf5e4f9c500ca0153049dc7700235684e6c66ff7f9951ae30cda9547f3a20685c4f9f9819cf6c974390a29bca20dc2d1aa8ab8f7271af57ba63e120bc5e4371de520d534dcbdcd9e3c4572fbc8a493586607b430b5816e52de480cd687eb6c231e7324fec496b17c8e6ba4d105279ef70ae3234fe095c4ccd1b3866b11e9ea895621fec67a2c932cb3598e6b1d1d3c5aa34d5e9d8488c84649e6ec1bd8f3f8562bb442958c87ea24005c70e9b5fc4bb2ef2a2bbc154147678aabd14406c8ad8074fc098c93a16f2df3340142de2c3aa973b1a3c062523eca51e95195e3c00ff7c354678929594869e17b8fb3fdd7553d02a1f25b832fff7a915c5aa121289205b1b2b15c422edeb24b2826f65df4d81a3232bf96c5c197299c6fc305dd9a4c05be4fd53ace9774439e0602830364c56489e2b4a5f8273157759969cd938d0ee0c55c4a8892eee2c623fd0e6b37969882e704d402950a1e3b0ac6795454caf80fb74aacdb017082e9b4d05052a44c5e971eabaa39cfc0d074deb662e5066bd70b8cf27332d2998c46f95b105cf26cc1396bf59b78a3701f122d33a30a40e62af7bc51437ff00d75e0481b01b85528bdf49210522f3b01a24a47535e0786f686fe0cef0a0c10dba804d897f4939f4a1c2888cfd5f99338ab1f0926d2bc474aebc12da6f84c49edef6138d713002f6161657de04429fc8e921292f65f1d5f3400173d73d611e9c1ac6fcfd270b7627f90000f9fb61596c985e64aa6a0183eeb7c0f7344a04c001110b22e022fabc5aba3edfcaae7aef2119d2f0131b0fd70807de8711989481ab482c16e289cd4c2354777000f808da821061021506b4e92b1515af0154af698b106b7f7d02c5adc2ec557791e8988c15fc4be0a51ad9de5b2c38730c09a2dcac3862c446bea45b503210a54d4e9817a2604faafe92cff0a33114020e7bcc8c6aa748c7b8e9950f21cd9859461a7581cf07078833d9e18ada3661df4654aa9eefd59ef99cd8564136f6f1ff48419a4c2b9ad313104653b3d4832dd0f94fe1211314865ba9694e12c0cc94b1d2205351c3e79da61f15b498e44c2041c470fc55d35f66006eeb923fb90a7b8ad0f1321563f37a1d2a3696d53a402671ca50dc4914d0cc6a32715f5a8b63f68db51c114b56d543c0f5458b311edc0fdf9e0d7d71b4d522d0e661e3885196aae02b180c64e63331b35158e5e360936a175012742ad2b88201dab4b4f645e4504c46956d32336af9b3a9e11f3ca15d070ffde2d55f087087337e8bb42c6fc597196be1a9fd21d6615287010b1a211bfd7d2afdc0af2ea0b6942cff2132095d6e9db15e11aee91f05ccd7511ecde462b34d3a26d67f6dcf9a2f1a99cde008d13d632bdbd0d6af1e175438082075e1f21217dbde1191349ef651655f4a2c6375b7e249fbe032b7081cffb2acc7f6c5aec3d8b00b97682b8c20c547c0dbc0464f3cd437c960460d6fe2d03e689fc3363b97b600ce185a277953eb7c809d35015ce854779e85614a6ba15238181c0e970294ae700bbc8e2385cfee8aa7bcbf1346eb3facfd0fdf73ebbad77f8c565e8afcbed5a33468993fdd1a1f4985747a51141028598459d87ec4b953b1e166ada21515cb3e07e1e62dbf4e2df06cb29b61f03104af823f00cb01ea2de7033c4c11f2a98001ffc22d986b0940814d55d93404c945bd116337270396f3723c767ce33813d6fdd793534528ccb4ae104e014db8cd7ad0edd8dbe1c20387772973b6c2ac654a4f4cfa1b1412d0b278a55751a7fb9d628b357d5524a957454f9d58706a1c6aa33fb970174456013a143ba3dabd72c9ae13fd64afa6dfac7eb862eb66e4bea6f31109463351107d7120eef99fb054cb0506afb4c2e28f366688a0e8b82ad329583622531b2862e10f3891dedfb50608036076af302288ba034789a0992b0aeff4af4515f52390d33af369ad0d91fc6110b825b3c53839213ac454d97aa4261e7c5b3454edebca5bc082dc111c0888ea816fb9585c79ba2d675a6ab4246064507b9feadb52a43e3e41381a0114746572898a58f7cef60f3e10e971ae7f9db798502340d6e4e0f62cc5bace96a3a0000e9a35405c8d128e4c132c8e5e7df082fa1148ae267608c2b87f4e4e46ffe5567dbd0d05014c638031e79c35c666a82d645d913cb866eeeb82c0d7522d4b44cbc8926793fe30dd2c751bbb3fc1a6a05726102b07b6002680a3f626b1fd2e16d8282b5f6dee81c7e0412f98cd856df53facc49ec286707ad8f4a83b288df6e313da163a0b81b31cc52fd896ed221e95e84b2ed5e936500543d10ac823161f5ea0d3e1e565de9e1694f6f3a11ff94f552d547eb67a1aa98256fc6fd4adb2872f0317480f50d7501fed312a3c26cb0387b0a47881d643718b80e482f1b5a946c13a5cab8e5f01add6584d02b59c61fe9fc41ec06da668c309d210d5e4d65d21960b78fe304e3c3efe14cca44077541916a8ba1e9d577a3347aa645d56252359ad52dbe233b52e37cc485be9f478900671599ec28b607a14a14d82d0b1cebd8b7c329fc30a056356ed90cbadb7ebf19f9ef831680fea1b41e14d15d6de416b9c7fa85b30bf1217cc13a8cb4d7736c3c1132e7712429a7060ca934890d151732f2e5c2de6b7a78cd4bd33bfee91d05772be0e29fbfde0843cabb5156fc21f51180eb3c482a9ec42e85b6d3b5a2bb4abfb63dc0fcaf902ab13bcf9d7c0fb9a0f2e7e61561a62c59e56e0e28f309875857f418dad4fc67a9c6bc7da3b894ceec402ac69f15c52657448c314cb2d3aa48677a744c037872a74deaed3244d72617a9c05368e8a13d1a78a9c427577bb8563166761a88d6af90f2a41cc6c4c40ff218e5489b4c678262c3df8e214fe9a89d03e7f40cabfbfcf116ff235e2a3c3d3795a197f52f8537d12491e0c420345d25e04add32ed440d3426264395782179a929a482f50d15177c9719e3f86b9212787076cbb240e4a04506693c73aa088d5ae0e7a4d8124c0e8c466001f61dde738b80a28f462340d0607eba5c46e6b20c2b8278708e99706bf60f5d323b0e2618cbf163483ea983aaba076071e0ebebd37e16173b16138d21e90eba08a43ccdc6a689685fef627f1ff2f152bbca78a211f802c2ec46b24cbc8ffee871a848226f8d8587c9b5af44aca7f6ce99cec8d96bce6c6e2f225b6d61fa1b031fbaf1c4677f9f514dc9cfaf234bd90e20fb1285895b1d4df267542de5044ce4287c2af8dd9c3d1f188127e292c757a578b19b20281f50f4f87e5453b3d0d7476a180c24f7b0d9d986a7ec1537c4db806de5f25b628e829222ea52e7763b0fe12a9cafa03c821a178a9e0a2e5c0d73a8ef5a87ee9f04eabbf64a8a86ffe9a5865e53d37f37cfcacaafe2c2cd461c0e983e8166b26cc8cc36a6304fb4e8f9685bd75b433de5ce23ce2f6a4ec20722be2a0e1d12ba801b957b5f67debb6d7768a2acca295b80c0dfb38612271c658b4fbedb58a1c6a50c2b9862533a0363ee94f77179f1cee6657704a4691bdd2259ca2dfc4688f2a1402eb807cbb8b12075f3077eb54b5a810378f8e1e1478d0157f4cefcb8c0fad8857355029e2ec62a210d7015b25a1acf8fb84f288361ecb1484254f9036bc0b3102c5465d45a16ca1bea6c6d9977969a047d926ca903b4b6c4fd8f8f52809ca3a3f82beaaadd02699ed2106d48c945f10bb4614a3c8a4bda4c38331d1e47c418f74c133959cc18c6318c360bc5f60f23ac280d21de2e58a7e7b3f42ccc72e01f786fed75f887b161525202ebb5481291a45bd74592cc99a0d1fd33300b9c699204ee2521aacc7f8877e8f42311a8d103ca47262573803eedca89c392351f24c4bab1fb2dce0defa4193e6c992648ac1e728d085d6e66f19b7b71f9f5fa40a503a9ad0dec29035a99868457205e515107a9e5caa1a5bc7a8f2e5e8a57614fc56e1f6a840dc0e699b4de01a32fb0f88b3b3d57001cc422f57806c0e245b49e297e031a3d0c260397b66deff559c28798dcacc050f66361addc7bef265bca2da54c52063408cd070f08a29fd6ce288d8c8c8ce8fb7382d5da0b661f5f94b21a50bb5c9d2be5f2648abae64b769e3767360541ddf33d107e7efafdd420f880b80f525103db67c057be0d14a78ea7e6cb55dbff6973519719f2f7e3944d2d7f06d11c88afccd9fd74959d6eb2d78c35b896ffd89b4cd1973e415a94fe8e8d27ef9db299af8cd3e5b2d9db4f9d29f3d98236bddb4f202a5e7d84a7b639f293862f652865f8539cfa886f1b4d976cc43f52688f12b6b3fd364e9abdfda6c446229544274c53d663ee4f67c053dbcf1925e80a4b15fded25d577fb23601e2474184c4871c59d734e8fa635065c6d271292a529459f9117cf39e794e27d29d1206b122719cc797f5e2c25e6380ee73a591b11ba4c577a54628b5e8adc6ff87aadb5d65a2ba7b156e27aadb5d65a2ba594524a691d43809b1065baaa4f29a5dbb63d0a6ce4d8be0912d83f51d56cc2478e4d37b13dadef5a529500043092404a1f640fa24d4bd983fc59459963db61d259710919c37943133e405c8003117290807e757777777777afb53e0a6ce4a8ba09aa8920d2269d761fbe04766f0add694bacb2a5775e279dd20e749df431e74a0f0fce4d0c4bf6a3e36ad1d084603d4070646280642f9d9a568de60353910feb018203247be9d09a1acd07160488cbcc80765e43b11a5a45d2904ee98bea5e51c31b7452569b5a33548bf9e404a133f447d08c678735f41373e54c9a2d678492e80902a5cbb13c6d133ae99d74772983ae9b2e250d393d9c3ef78a2cbfa33265e7bd225b946d3a383f20e89e2faba441c110456dd3ffb9670dab7407c2dd81d09656d801cd1e5f07339f93524a3becf8d613aaf4f6df291974a47006182e797225a79455573a67139d44b942a7a315e6c14a30140c6506a6e53a6463defed832345b7e0d72185d7135ae0683c160dc908846f4c3471413e386442cd429e67392d527f238612bae4655fe52c4e2388eabd15595fdffe9b4b99a57ae5681ea50a5056da74053cc58e4aa5f7bfc4cabcc53ce93c7cad5b6bfad19ab6cfb9c3bbb25fb1f248b6f972cee2359bce6e5403240609426595cb2b864713bf3a2dad6e5299fa9964ab6717aa1780a65bc292b6546431eb34fcfbf75cd7894939d29d91957398adfa837345b5ae126668f5ccd0a3e88edefe63637faf30b42eeac3a43aed4e5b4a0148d3831676de0d9520a5b0a6943cceec236e419e4a9191479c6f658f7e88d796a6fbc312b2ca32aaff6c6ccd98da154b6fdad9e42596428f20ff795fbcadd9f79fe9ea9a9f29a41aef2c73608f7e9b07bced690e7d71fe9ce6c656de88ee7c206b136945a1c0f73f3ce3ae9d76d6d90205fd99cd59ce9b09bd33688903c35edf9d106a13c9ef21984d2207467b4fd48775c95091b86fb7a77705f3971949ef23c7535be3367e8f215327702560c13ddd3ee69f7f47e77823c9f5eafe3b69f3f62e5f1f735f99efe8ed4bb776f77efa7aae3bff7512e7d913651edfb764e51fd5ee877a207c1dc223d8308aa25555991b71be05c29a5acb7459b31d259f5471644298fd4a1f267eb66d3b79152fb0f4b9dc667ea4b1a69fd478da6b4297518783fbd9fdecfdfbe8bc9d253f31b491515d9be64228fbf3713d004d43b527b76ffdb6f5bd6534c558947284f715fb747494996ee3739dfb5896a6f6fbf21e67b262ff33d6dd2e91da9dd7da7532098bb138944a8acc8f2e584f91c90cdfdef2ec463c91e477bca9506a80a5feeef9dd3bfa9018a3137c5f9b95c6e6eaf81f9c3575a1b902b1b54851f633c4a366cccc4e6221262063c858ff0147e49475e69e3b7f86d60b7a1e337f7dcfd51ce342059e8c6d509ef4b8e1f7f4a45a36c3c63e369f3864ea28c13b482fd6dfb5cecd78a31c694e2fa9bdc94528d040d42c5460d241c63ac9f0e81b5132620427dd1dbd862904795ed239652b5abd440dd15967f859f3883cb0c71a8220a1be4a00184274c50835a0dda40cbe1af624345d2f094a0e25c0ca6538fcefb22ceabf23d5145e27091a86235112917648c9f7e4e9cb04c595bdd5224580164fb4fff4da7cb3ceccf5977f80e11ecf91ba554a678ccf7ff5ea69dbe0293176b7596eff9d856a324be184f3cefbdf75a91bd17dfe771f1b5fb3ee57175a52fe98bc98bc98eca62edba6565b0389750965e4a29a594524a29a5d7524aadb5b64afadb532cdf6eff71049bee7b37d156ff4a675d77f2159317ff8dbe2df95f2b6af6fdfa76671edbbbce263b7ccbafdbde9fdf0e11ecfa57ee39c12a695899b27aac92477daa4fced375965a5b7760f98b8a3158a12a74602b9da215ac49e956b7cd0e0036ab800511f286a01921704881102b64489badb358e90d405e2b152b8bb5e7f752594c6cfae308767daa79506df2529ffe10284fcda76ae8c2f7f2e9515223114bd5c4d97f7e0d01de5d084e99f2de8e6077563aa520a871b88fdd7df79d48f4fd89a04cd5277560bf6c9be20fecf4f8814d52073d49a3d2fd612c53d5ebb1bdca1a82aa25e87509b552d4a954e9a44e88821382ac200a55c8e7c3662bada162e38657f2445b0aa982662bc20a9c10e48bc38b064d610b59a8e2892a0cdde08a23a220d403254431030627d49057c084d88615f4c07230e0a15c1364ac1456e004e7c31652450afc25078727a278c2cc0d40f8c20c0f0fdc1094022ccc64c1832cb0b0a9373ab08196a1d6c052d1d5f001ab0aaec0d5544cc51aaa102ab2286d29848a315001863d9e609d140010430e5a7110c2908fcc909f2139d8810f0e6ee0832b365ab3b193e52ea55c354bb2868d1b282216fc10010b6c80830d4f8e31d32253b47c8022085ee0420f1b803003191bdc5208d0149e0ddea33fbd128fe9a1bc92974f25af943de5d5cb35973caa7d6ca76fc0abed2fa61b2c4f8fd2fa3665ad88b26247931ddb6e931d73d77fb1f5ae543cd9f50933c784207ab9b2861b6cb206a5a7df95440f84a41f8923e2dcdf07c33de61e8b1b634ee4c13d7e9238729fbffb76848f5ff4bd808fb3806d89862d851001da9dca93be62e2491af3e5962f74e32454e89ebb7ee77522cef32ce8987370a4c7126c4e634f811ddd6cc59e02bf7e060235fec47a63d3d9ae1c1ebd1ad949539cb9e2c746d952481a66b12db7dc767274c23ac93d91473c775c355f723c9987ffa8c890c72a622177d6c39eaf3aff2a8e49a4b6a5d87f1379d4efe12ba308e52b3c44bfbd64c14f5f46c7d9bf5664edb593f3cd4e69c198ca1ada9e56cf5e79ebdcf55a5badadaa19962cf7fdad64c1eff5b71fbd4ab7a7db53913e16e5a69b288260ee1933e84bb9e33715913ca568427f4c6d4b75aac70c4963ced99dd2fd5a708a2b6ab6dcd5576aadb57ec557a4efa27e2e96ce19ddf5b353d1d796099b29fef5a59e3f9eca42421336ad9eb02c9684f26ffad933cd9bf5acc64e1f5379652754836af55adfd24929a54f7350f9d12b80ecedab8e2cce28cb483715a2aaba69d04cf1076184447acc41b365ce668a3fa783b6efee13af4c89de133b99128552259a2d73e66d9f4bf809e163e3af769fc5b93f710a899306bb53e877f75368e6e0b4c8abddd70f88df9d16c93b1d1c7d6ceb49fc24e1ed0877d5af4da938d67189ede39b1f17b830fc54a4949be7e7b6fccfc5f49fee48e2c84f99111c4e12e72ed5adfbbecfc544ee292359e6b6530572857b92c4f8ad8cae50f48451957daa6a4155a797bef2917c37855eccf93d8b72bbbf8ba207268dc445b9391808e3fcc67c94f10c9ab449bb3ffafa70afeb33e2deddb5733e6973e79f41599cb4fce30cda5668d23a92163fe2d3891b11e9abe49c47c4dcc247fcc568846b713a9dfee4dc8f90bc2df192934739f722d1f6e5bd38cd83f4fe237a243df71de805b9ccf9cd6f8a3368d2388ee3384e85e4df7123239fc5d1db233f47de4518cf891de967d0a49160e8a01f8496f488abdef478a22e9e937bd4e2678f5636379ed63b41959c449338f6b09bf42ebea32e9e7e2e262f3f92894884101f02c29138fa1171f4b147de3f9791cf39bf0eb9f3fbd82271fc50fcc42c8ab8971f69f49fe8639374a5c14c19fd8cb4e782c3bfefdb3e9238aa6cd277178b4cca5963d197b990bf21341a6d87ff21e9e79611a8013d0be4a9cf45a1688a8ca0dee7223282ba25fdc8923ed43246faa963a4cfda66d2cbf74a7f1a7553fc5df238bc085fb12fa51022b1881b872cfa51f610a18bb0324badcc7223a3efa6fd74d8ef48e29c69d1e27329a1243bbf1412d4b3e5f742921f87ef50eca6777a1c6e2291b028faae54c2a5984d267cfb9b25d516242dbc162d1e977cecfa2dbe5289387d62245178496fe5a3bc25d1238ef19e1eb349d74c8f82710c6d32fdc8a7e33718866f2a8523a1e843b1fbbc6dd157b9527ad1634fae905ef459b290bce8479f8bc8db212693fe7efe2efc5c3249bf7826b960d626d724ff7865df0be9af36c91affd017c755a6b0c35ec99561d19742d3bda50f4da148fa6b0a4b3788166f8eabc2eaa96679ac32f5c77d1ea5cf6fbfca4816efed5715481692b7df91881e08f7df2f79f9492591f4243bf2931e877b250be4a99915f2947d936869b6a46d90a7ac6f91be37d4259d151c7d6c2b233de947bc495a7a0aff20bdcc55f6311ed163ce233d9e4e3fa636f7a2509b709af4e18f5636a2493f1249243d7f78ca7ee8914824128944d21f989fcb94b12257192b93342cc99642827af6e840eafebe1bfbabb1bf19fb7b1454697fa4ffbeef4ede6900b98751c5c9d196e22a255a20195dd999abecdbd6b62a237a4ca5467a7c59d632911eef6c5b20eee32b630a488eafe8788fafcc20977d218af86a6a868f35f60d999df0b91d12498b7ed4cd3689445ae2c7262d3123f2c0123b3f491c296c8ff2e3709107381eb7d1f194bdaf6d85a48167933ee727d1469f479f45b93fd183388fcdcb7ee2051addfcd6494e72d24f699ff452b22491daf9af0e0c49df9dac2f8f8a8acca3c7dc2a2a32e9555364d106d999a75453e429dda905adcc53f6e90784ddd253244dd2a38f4d7afbf47371e1863c639eb23fd213e6298bbf21be97fca49f1f0ce973fe4cf29b59267d7ed1e79503912afb222c72e1863cf2a41f53db021922bf8c3efffc60f28f463fd26ee3a9941dfd85796aee91f69be9dd1ecaf1f80a2d8949dba4e75e9ee2786432e947eea583dbd11c8fa7aac8a32591c42b85a4615f7e5796a9c8a230f4d3fe52564655f6bfef4425fb1bed8fdbdff753cecfa5e7c27ce549a2f7232e8ebcfc488fc32f8faf640e2fbf7d0be42ba3b7ef228a4c05d66bf7f0ddfd954916dfd647c68378ca7e32fb36d423ce7a4c89f4f8243d9eb27dd51af2e8f35f99af98de6ea50dbf83266d65b6a4392179a479907e947fb4b2d11381c819742040b67d4f1cafceb6f6af28936debdc8be3e160272e840a3ab9bb704f1494999234a60c5d763041f61fb10e2969ccefea7409eba697f3697ce9bbdbdd87e0a5fb2e0ba92feceebbee71d709f56c19b4a5102c64bb9b1fd6638d3d6b583add4abb81262f1bd6e312fb7a7854128245cf1e6feceeeddfe856ba0fe2445755aae6775ea73b3da23af7ee15793cedeefde4a90eff14fd287982902c74772f84afd015d4a9eb5ea2741b1c94a02b9237bdf792ae5a889e449c5245bf8528a5ca24be5adbcf1a9d9dedede71fd9e654a287a7b6efaf38ff1375dc9fb72ad1c357c0df7e4a215799aab63f59c186bdfd9c18dfefee8828ebe9b46d23dfcf5ab789bd128a678b5c6475441a29995a909c4a5c98a04e5ec0e8444cbd6e2a3352be92dfbdef78f8538feb5483baa8ca529f9962696ca650576cb6842f9c631bd3e9e1fc90899134ec8b669a9029e1cbe6bd146cfbe1ebc66eecfef86a860cef7910bd1bcfc6532c57d9dfd9f5f470c258cd0973f83094f161178bc56221ca875dad16c6f8b073b95cae507fd8f9f884e2875d2b0cc3f03fec727242181f8a6ab55a2d7cf16147139e7c288ac562b110f5a188460b4d3e14b95c2e57e8e243918f4f58f2a1a815866178fa50949313927cc8d56ab55ad8e243114d189a3ee462b1582c2c7dc8d168e1c8879ccbe57285a40f399f99627dc2d1875cab15b6c2300cb99c10c762b1182dc4b4307ff84af80af7e12721593a97cb153e11bec22eaab23e21f6095bad10b7c2ef43fa614e580b6b61f8229c1386b7168698260c657c2e610e1e2b26430d394489d562b1586ddb176380ba73f974aeced5b97cb6fd17bfef5a5d4ed7ea5a5dabcbd9f661c0f05ed43a9a5aadd6d16cfb2f4e3a548c168bc568dbfe8989c885c8e5e372b97cb67d54097712b54439a1a82512b540512b67db3721c12db89a8826ac7d4d44b3edbb30dd1217e3685c4cc4c562b46dbf646423712ece8773712ecec5f96cfba7911ab2dde3ede15a5c0ed7e25a5c8bcbd9e1cf5318867a04676662b4582c46dbf673f71c49d7752eec835dd8855d58a4ffb5a0b88573700bb7700be798e8cdf4c6668afd9c69178a1e8e77e3c978319fe8b1240def47ac665b9a0b866d3f6b218fb8866b78c8573bbc17e3a97ae3ab2be3c70a64e7f063cdd1e1c7aab3c1af36be927af06b0e64cba5a1fc5877b0c1af359225c6831707a7cae0d4199cda1af29567836cb93c3c6ea84916fde3ab2b0314448bf98ac805d9726f6ebce0235960b87cb5cd66af19cf0cb641d4834f8f205b6e0c4dc2069f06912c2f1e7c4ae3ab8d8787d6f0d01b1e201b3c79f0690b64cb06043efd21594c1edc70706a3894854365827ce564856cd97676d030932c2e7a7cb5c9f8c8fc006db044886cd96e6e9ed8912c2438beb2b35990990b7cbff195d283ef3c902d5b8cfb6083ef3692a5c583ef31beb23cfe830634bd41b65820a0380c49961199af2c0ece0c470807247d41b6d89d9d30c424cb48c757564666a7070c1ffca904d9626f668abd59c2067fe64896fc609dd980a297c1067fc240b6d8981ebeaa3c433c3f36f81c902d1568ce4896f9e02bf1494816fa3319f844f8aae2509505ff45b6d49d9a6fc8803fc3575546882024cb7d70d461830f82ff8974cb902df50645b2d4071ffb8acec09fb2a5c6cc14fbe0834ff2b980af9dbab14bd341df580efac664e81b43d1b46d3f86f6589286500eff5e9efbf7da1fd1a078effd7b2f09c687daee6cdbeee88577b26d1b6adbb66cd29db60de7ed872e44259bcc76b3c99c36994d66bbd9f64112ae34db6266a5d937db62b6fdaf0536f100813c251e1ea06ddf1bb9249c1d50e3e0e0ec6cfbdd680bad8cbd397d5a5b999b6d5f94ada8ce6c4c9dcdeaccc66cfb9c50ae7bbc3d95078887870768db8e9b60ccb6600cce0e0e0ececef630b5b52a7373b3ed5fb13e768e75ab1ebf201da6b86d17bf999783fc9362e8a37d6690343efd61913dfab3edb33c96cc27fb803cf5cd5c651f646dfb557ba63f5446817cc5ff0baa619a5bbb354c5382431a0f5bbedae10b029a79e29c214e208a9fcee80ad7688d992dddd04cb1a7d9ac1baaa23f16bfa0981a5d7932ddd06cf1989029f6eddb6c5bc3355c63f14ed0c161db17698f8545ae3f86af6da594327c85afdbe32be327bb3e305f113fd907e42bd5dbff823ea18f663775d1d527a32a9fd992678a7d8f4555f63f99cb457d30567df75199dadec52b535b2755dbdbcfdb290ddb6e3f7eb36db7ace3b7bbd83c6f3e6db11fe64104634490c5a2ab4fe62afb18e7ac1a924727547fff3e28e32bd22795d882f47178dd9cb8833863aeb2e30c9578da7c7e9f8cae4aaeb2bf7d324cbd185fd116cb636dfbb44529b5d976f5017db24d7f9f6cdb10c53f6004dbd994b4a8cf6cfb5352fab26efa9b68777d5acceea8376772e549957d4f0865e50cf9b2fe4cd9049223fc2315a24292657a2c5f494969b8ced8a16d1f6ff473c12a9bca5cc4d0509a8cae68cd55d635e76d9ecb749c97ca986e425bfd8dd26476a7a990a7ec27575488aa244b7d5b656c5b59dbfe78b2ad1e4d355321ba7299a9b27f3a653a5542dbbee873a12a1e15df65660b0ba4bf40aec0b73fbaf763b8fa7e24b93fc2d8a3cb5c4965ea3e15bffb9b785da4dbb66defe27e2e147fdb06fb600005c8dafe35b54e204f39cdcad7d0ec098477d553e62958ae349bac523b6542d8a9aebae5ab4fc8a3f115ead1c83c9aedff09d1d504927d42734e4a29958fe5ea4a157d2953b445ca14fa72d6cdc3be9a405b86ab3f0659170b3270823f3f0bd996506c298448cc6611f1d979e3f0c1f041307cccb1c207b9c7e1639b1393d147f783a73ceff3bcd42aff49d25545f9c2ede334ce3d458fb979bc4099b870311a9d484840fca3cee7488f73dbc0cf71a33f7d2e23ee39d28fa3e7bec3a27d6e64c2719fda233fea5137b6a19a22dfa72fbd1de1c6df71e2b6bb18e00445df330cc31b8217bca0078ae38c5d5176f51cd75aeb0c7cd3e7020261f70d4fd11fdd67530f63fe2359f2d3eda11e02fc30d426398723df0bf859db0f47ce61bec2037cfadde8db31c32142b9f3f7c23d06c1c7bfc1ef72ad2fe9f79dcea3fc21e638f0479f71f860f86016c110673087a3cf8be18122f654178abe41719cdf0e70e39770e32ab7efb10499eefcddf7b998ec486dd086a7c0ef429148be26f96ffed40643ab6d4c9a3f4fd2a83736e9e9ffe02b3c463724cbc8d327806409458a142952a4489122458a142952a4489122458a14e9428af2f7af7e51fcff3f397914ea4b4afe747a93e94ba51f8d3ee7ffbef7bce7b8c7f86b7d6bff8482ea019d99b2e5dacc14c7d766b6dcd74ca12f9bd985235235c56002d36162199e94524ae1cafbf2c7b0d76cc133259423323549a48a5e2230aa0e426a3afb0af98aaf4821b59c4d1ffbdc19fd1be42bf3d236a5bb7ef55545f258833280810b5c0ba02051010a8813d0474820020f8118463cc001270d78510403168052000c2260125032840b217620e0f46212840e204c2e2d7e38408ed226c16180028c0840bad1c29207306263b5f20920003ed4e801f442951400d0d88187199c08ab523ae420a34b65000317b0001215a0c0048e9040042060c4031cd0802218b00005100193802184d8818097207400e1f2c301726c1c062800016eb4b00cc0c66a4500357c08400f2a2900a03183871d54291d72908172efbdf7defb1206e55e198ff23250f4bd3d28e2dcb7075685992c7605193278304c76effd7b77f860aefefbfae25420f50775a7ead49ceac4dd28aafbe2df981819266c5a33271045968e8d8d8d4e4a260312031da20591e1ffe785e83b860e3a3a2f26c4603c4d383971e5d06ad5cc2007c84d0d50281a17a26f183fafd7eb47068d5653c38c0c6b484989908e8d8d8d0e0a0ce60385073990ff44719abf4d6200011224083c2fd7104c261c2d23f3a3899b1a9a14f826f979bd5e3f2210d04c0a564dc80ca3914cc7c6c646e75faf1d27cc1f9f1e28f81e81515363630357101c1c7c5feb454d0e4922343f626411dfe1898f4f2c0b4233d916380e86fa603056d9546ad0e8d9b99182b19eb1f9be912b1b18f8b102b9c08f35c7022ebe178184ebf7af2cb932a2023f56190afc586726e0dee308f7a73f72150209fc488122f0230d82c08f94b6fda94f1a23fc854bae66eb013fd297037ea43c0d709f3945b83fa591abe962c08fb466013fd21b0578c9fbf421c25dfc6ac6607ef45a027ea4ac21dc274d08ef91ab59dbf1a3fb20e047ff79f9d1819c26086f812357ded2f1a30701e24777b978e9dd737e70b972d7017ef41f397e749aeda377f7c1f1e38cc3906421c9e4ca6306f871ce0af0e31422c08fb3e6b41bae23575e6bf971eeb0fc387b06f093d2cc146ac37fe6cc965cd1d6eac769b3f2e3c411807b5fc3694e0f49bf871fe550007e9c31db0795e7c08c1249481651ca8f7206801fa58cc61321573446557406a5cd14faaa1fe5ce0e3fdee0e1c71adb7f865cd11a152208c9d2a57ed461eb7092e17f5b2892657b9f5155f597a7cfc56d500c5cc00245cc960b84841e7d1b518118056213d03d66cb951da147df21a0ab8b25a0471c010d014d335bee8f1134d7e6012d07b41ad0ca992d57a7083dfa6531c0b50097025c3eb3e5d610a147df9b0c269680d810b14d7fd266cb3624841e7dcf1a7dbc438f1801fa45d3ed27089a165d6d363a5a40b45c5a39b365d3f921c745571beb007ac4395cdbe5335bb61a1c7af4ed316a8058016204a0efb4d9626f68daa696d2cc166b69ce6cb12d5e63f1da00bc668306aff48857f49805a06be8d1a965d99a99427f556554459b2d7568a6d0f7c11500570f2e159da2c75306801e338dd80c5da3abfa6acd96fa33536674556d6a664bd59929f479a0b51d744da56ba9d6d6418fa79c831eb30c8da26b36fd0ec380660badc160305a031245511445d145930f468b22caeb47d17a9c5bd4a228c2b438b708f3a1352882807ea2a06d4041b9328cf195c5f8ffff7f51145f14ff258cf81fe3c58f31f7ebff0712439cfbc51aa406a1f2d457750d4114f5fcad5f3faf9f1727272727272727ffffff27251fcc9f9c88ff2ffec9c99f9c9cbc10e73e11eb8fda44bda93595a6a6e0ffda5c9d6b737560a05028140a853a3939f99313d4e9833941a1fe4ffe4f50a847a1504030c4b9514033292aab2664869313190cd1f70bd1777759b7e6b22eebb26e8d8b92929292929212140af5285409c907832a293979d49fa0f43877494949c9cb853877894877a8137e7c7a28145028d9904c261b32399d4ea7d3e9545252f22525a7161f4cc9e984fa924795e871eed3e9743211e73e89d486dac0150487e2a0a464fa76f1fa79bd5e3f2d4c2693c964329d4ea73f9d4ca60fe6643295fce94b4e26d39b4ca6dadca6da10111afa83c614399da68d8e8d8d8d0e49a9542a954a2593c9f42653a9f4c1984aa5d39bfe64d2a5920f893877c9279605a1996c0b26d3f4dd42f4dd6dacad66636dacad86341a8d46a3d1a8542a7da9341af9604aa391e94b6f9a7ba447a3519091e844e87123944ab221994c36349273ce39e7d16834caa40f669473e9475f1ae971e6bcb3e833ae021cb7f196b360349abe49af9fd7ebf5037edff77ddf9773fe9cbfd10793bf6ff4f947f9fbbed92c28668836abc8d346c7c6c64627f43ccff33ceffb3e2f7f309fe7e5ff3e7f7a9cdbd39eb7138a737b3b3c5190c56053f8be97efceb26c8d65599665d91a11c7711cc7719ee7795cf8c1781cf7bdf79fa7c7c971a29983a933732690b903cf930dc964b2a10e638c31c61cc761f083e130f69e7b6f623c8487268b0dad393365dcc071a26fd1ebe7f57afd6cb5d65a6bc5183fc6f5fb6070ad1cd6e3ac75933fb420202f601bbaba33aad2992d1876b271faddb5d65a6b6dadb5da971f4cd5d87a7daca7b5356c0d1b3decf92c1e211f54248de93c78281975671ed60256c1f80583a5f09cd30cfe1f8cd5d84fb28b864d3f6791fde79dc15058b54df1d542913ca6ba19de09068351159517dbc8af13cfc3eeac05db3d5777e62ada220d2053f3318cae0e802d4c0c9b5e21b6698a575dd6b0b1e7ab8adc59a53eedd76d351764cb183e2e3067177c86ac8108112244881021428408112243860c1942a3d168341a8d46a3d16843860c193264884f11a09d3d45b1276950e92915aa427555f124bc196eff5757bff3177b437d37fd0d377b625fc170c83aea18767d2b5be6cf4c999fb7904d80c05b8e3dee9e1aa7a8c98b1e4bfb349fead4be22ca4ffd18d5ea9734aec8b4b24e29893d2a5357a2eab6fd86dad56db5d6befb948901b627ad76bb981375de0786019dd6a844ebd90b8bdeb1a1910040002316000028140e86430291589487b29ae30314000c769e44665a34184aa3148632086210530a18430c01003020002322541a0005f4fea0970ea8de067a9ca8e7037a4fd4e3837a4ed0f3a11e27d2f381de13f57c408f13f57c50ef097a7ea8e751eab999d61a04663651cab5761a911d98f684481d2c18483e2da1e08f722e11e30381dc908b215a380d04fc3c623937dac7d46c317315e8a7bcffe1c0c443f2c16500f1508fa3feb8eb805d950086b853bec7898f427702aca8bbfc5aea5dbf9d7f178b19885000d49669b9522cd37f8e2a33644123265492560f6b552e52df7c2d626c69703556a5e2205098a4548490f8cd22fe46370aad1854a916de56563731707c51b6200db0921d3e7935617f2a1b042b37fbae0ee108cbb8ef5c2bade46292bcfc96655880b5f40781d4be09cde4fe319b1913edfebd337ca8f526ec1437eb94d2fcfde41158f3e1f59df9827faa1257dea31b8d54b9cbc61ffc4a6a6c8bfe9244a5568687732a095dc807e34f3174a51fe45f279148c7f873d954d31476ce79f49a073a08e1941ae4517633e2c0a974b2937740d95447b77198537e5b038cc39df25f19e08b19feb7d4b34c6dfd4a79c794d7e63f89670cd8b6fd93bf8a816f935fd99798596dfd9779c620d7f65f92770c986dfc937e8a81df867f898f28d2f6a98fec2a2299a849d17186ad36db8a509ff47e2ec3e054969b1204ef0413346884fbe10f02d0deaf7bbc7d2f252899465a95a492b4694b09cad390462554927e5a2945d934d2aa2495a44f4b4a519a4eda2a6d7261913556acb2c09a15930b96acb1c49205d65931b9b1c8120b96ac618dac813288aa14de42db4a8f859c2944be8a84f83298ac0c42656ee0d6bed4192418841ad6b1658accaade00124fcaa071f09033ff44ce2c2b72dc667fb11d824ed8994d584c1ee56ee442432579dc7b12b3af9b013607dbd99ef4a0587824f10cbcc6b6d14c8aed1c38ebafe33e3e0d9c01a475de50265706c9250171c7a8514ed0bb0b376729850ab9108e00b345a15bf0dea4f9adade404fd2d681d07c617e01f44aef60963a771f409b1df58127250dbb5987f6972c551c9c45706f58c0a7c39c728932b77e2f62cd5d03a2ec4219813887ce50940f19541d92411772c3ae524fd1bbaa506cc053431fac528e49648293de142ca98815d3289ee0aaa8e037108e70722577d00b93bc56530ba49b1ae925d66d93521379499908bc523352821bf580677181168490751932b37e5e6591aa13a4e94279017984cf521c0eb97c1394910e1340a8549ba0bfa951acc85856c0b1321478b47360d7d1e0ebbd404ba3b281d07c021c81f88acf20124771a97c1689362d3869b90323474d431e72229547fd866659090a3cb23ab8d29689d5d7202dd1d341d07e210e40f4656fb00534f3050048ebb319b9d2609b916c62c5fa5167c49a65b06b5b700ab24283333837d7b964aed305be21f9b62d4385aa1e012f9063411729d798becca9059a86f132e4ddc81ab88f412210f8cac30483546c51ed405fdc07d467a73b98c04ec141b3686b543171e5a08ae1bc9a7a24370479d877e746af16404863692b766979c96f28045ad6d1be5cbdea5f94e825b46f25125b86130e034fa8e07226f4a871db7819a80de47e7f6bc546004a2b938faea638682781bb67ca360b46ac6096de2851e3775bce74bd845636a7c7543501aefe1acc0a5fd4181af4014c689572cf088128871d991d47a85eca07e6583b640b7aeb41c30396d39ae80c464b468e8da5e908224bfab60bab16903bd7ede16a93e7706582b31e0d253b7c946045ebd47fc3bcf02ae6c23dfd4bc4461b24856e830526e3b2d792386f9554b1f289c1811be115fe7d24ce3b5e1feda5a0e4eb93fe3e85d58d13f0823cc27c11276b941cd8817e2d7c4a0920ea61e7b55900dbdd4c45c028c789a45bdb12626999674a526adc79c9e0fca63babcfc85bf01abaa6d6ed1ab927b813d6df3ac7d880600051284e5ea2be68b9a8c4891befdfa7d14a62260d69875f4f9ac304f27b07ba5890500eae10c68e77eb259992a72d81ac7eade64002547db57aaa7c50fa9a80535002802beb5476daa82a69dbd7a5007445e8b0d2bcc2027d193f27227622697c64a38dc7136fcd5552bb0cf8f0f6ffe20077e9a984865ab7a2efc294258402b52c061cc40e0d1747e9021426003b0314714a90f88749e3b5de9a1fba3e2d69dd7c07e2f076b6c6dc18d675d40b6479dc581b3d2c32044824e9859751b8a75413090a3977db56df2232c773157675400a71d0d5a253b35f6b661ae4a2d4505e41c2ebbbbd58b9f2ce43526645ee0764dcb364de36d032530fb5e73062899d6cf0723b303ba2ca71864dbac434264b421a44d89e270d53aacf48f8036fdcdd0e99dc7ee9f55dee8ea36b99045ed2ccb6a27e649b991a09e60b44023c5f6cf5977a58af7c21a0f2f1d6215bc57a375937e77bf56de784fca5fd5b3b9b5aa7cbdc2b9d18df5eb35dfdc97607b9d9ec09ab846a0322d6168cdf8d08fe1a00964d53ae2333163455fb9f976a15d10f1a2e167b512b0187445f0f1aa7b7c132d03ad0cba2f6ed2fe4019190cf75e9045ec7909fa4f822e8dc0cd4911318f0d586f0795d8f92481d7426cc3d6a053d2ed44f479477e4b1a3eccbcdd471679bf95a96c9236d17fc53b3629738404dec089e3d38923b045452b8c98bc113c00c36211fca74889cf82fc8a2482df053ea190ea81c6d889a498bc5f987201eec5d12443252e1b30a3097016f16f7d08c4bd00f516df6fc8cb0066e5ad0c855ce616ad824b6cb579a819c33c2a5d627a2a88807e362f472e736b14a5651aa7c0e728a41bec0099a993f067c04b25c0e78b15a17773d4fd25c299be282003c2a2cae8c97554162f60a16640cbafc3ac631f2bcd5902f9e2215701a2e0eb00e17305a4e84550530e8445605894827e6125c1f141816fa24ba51569a14716b06762be67a14986255f6d62d610158a8445ffa14a8938179d9483aa05e2c8937827e91f94aa0c0e0bd45160f367636d7484b4971decc28b22857333531d9644b299c245991242415988b52f0ac15507be9cb3e8b3ae45011114565d505faca1b258034b35011b7e1df256132c855ed8ebdf441d359478f499331397164502a5641e329d0358d229fe576f027008047b27df1ff46a09ee0b7011e630a548dd9f74fd2c2c4c9b71b90acc951e0c1723ff0642fd637083c54fe93305e2997aec5c20bdac0b0984f06eeb52f8d32e99c3064326868fd597c89c58fa5d5e4dd0b02818e0f5c570eaf0302e45417007e3f411ed2c0489969e49b3863e0e641a8594b1012d751cf7aa3f22208281bd557216c04c932099e1a300ef02f4f88937f584f894fa9afbbb1a6f7521025b06589d6cae40831ccc99c085166962285fe9ab380ad12a27de216ab41c7aa10926a704bd548fdc439218168089a1ef6954a23ea54e3f0f07a6e0b554ff472109522a73b1fc665aa587744ac70109094ca5904cddde1834f0e59ca34ff52602a760b07682c2f45be6f2ebdc0153f15d74bb9862d9e42538369603a50a99d5df2054ee022e53a6846d787d238017470c6d7a62600084dda6f6cb26c648816470890098508df2646e98905a77b85170cc04e29c3638e84c2da9ae42d3d2d827446f66bd9a012fa3201a6ca0e54e477e754f06c900b077557b13f415de9cdfb843ba18f56e0000be051793f7f084112c923ffd42aa60260e1b8ce1605d0cff41d4cc2350f551a38d8cca0e33d0b28ee2bffa36008620d85642fe41b8ca60dba10eba6042f9ad4ce74879e5c2c84d6e8969c5d368ba0016df825f5b0ca0e50fdf8637a222b4cffe6308f08fa1213eb0b5e169595cc89b9cfc81b080c16e32f1819ed265c80257dcf7954311e2e90774a03663397bb9b30b67b10012a84ad4ca21612b651a114f3a63a98be931ae47be0c8e7877c96db326c49ae8c941b1079e9400e124a68c4e45b15a1a61c687837495e92801177a018ea0d05c2de9bd36d82526df041f4e88e62736b8d1d0a075dc6a9bb05a9057b4e30064b03f7296595b2cc94c734f32754c5393de437ac989272aeb32a39befe415094a3921e58a8d52bc8ede725f6ba28434579ae164309c20aaa2d9883cabeca66b30c34fcb4952387576458145b19ed3085f8d901a921bd40c21e660066d556a8c4c57c602443c95cb52bb8d81c80dfbffa03cf08f1c378a3f524c5e939e47d7aeb210826e4ce399d891c906158bc62218456f1c5bc8154b495ccaed9617a25b0f226d2094328f4a3608028067cab832cb281fe9181c28e47e922a703510528d9a0433a07b75e75e0e31277c95df92cc12815273001dcf2c805346f298f996f2761c19440a01f9d4ab28a2e821b78021776a58501b5618b9c3b630861636c9651eee838462f8afc67cb76ce5929339110f991e5806bd37ac1a8528f92460f5787559b006379ae256e73cd96983059c8fe76ba4c81ceec05ab3bafa7b996a13202a7bfd01487f989d0b63efe38d6e7a9984ea46c614c6468a2d8819195b20363276c1d88898c9d8207483a31b1ddf28921b8ed3ae606c44ccc2d84831053122630ac446c62e181b113b191b4237707423e21bd2b831c1de0a5caf69bafc4fccfd4d91d8613f61e4b14b95a756b109536af81523063eb75cd80766c20521a1bc5f8974b316c399dba2f9e35f6e78177b3c8af2c0731b7a2b153847832f1bf446fe539ed201a5019cc0f4ce01a80772e9c06986490257b0210361d06d2fcecc88bd2faaf6cd78dd363a5cacd3a23a9bb139e2c728853f4eb359e869ed64022e3dc2597ef761f128cfe9bb77dacb030144f0e738dc627dcfb084e032b12f9807c3896f2292da38dc93536d6118b2b4da74fe44d46d9df722870bb1be45bf860e54ef04656b890074c06166b0d9852ea382c2a4a5ef3db67409b3c238f7959e17612f64326208be81ddb9be2c93a6087b29b85b2d202cf8c5fb721a52ea0b9fe14a68d66796860215187db685f8fa2e54e5586c300fb1ef24b796ef546e6e89928dca3d355a2eabc12320887fef64c6037b6ad61c8e47edbf1eaa8bfd6611c6f976d860f0a356371e6ae2aa2fbb1212f5a011033352b9ac7ba0791ca394b952a0b20dca8d36db287d36300cbba20e449ce9d1d2520a01a0d151c17dc0ea225019b82e35fd99febdf253f64e4c6c074962b4da8bd87e123ff14d4dc87fe9857d7e5f05ad18ccf0d31e94ae8a3e55426d0a4ba7b0c613c07d108c0184a31999eb33e11dc120c934b053942fc622252e1aafbe81c15de0ba99ecd265175dbbe9b2cb2e5d76d58dbbd4d08ef25a1bf986d5b871c61e337e2ce3c71c63ec783a9ed9783ace31e5c2844623a11ccdad53a579d0f5bc5a0c13c03167680118e935881bb86ff7f9491015e85e27a8f550b9bcea5d3df7c424a2698db71e1bcd78f6b25e7660e1fb5cf6696756065e9870628fd0f391acbb3d1681708f2ae90076304448fd8134f33959bc6083fc75935bdb07353de717c85a5636cf19deed64258c2ae5d91a60e504b034ade8d668dc0cb28c82d0cb66520a6abf9adb5255907394c16c5f229a3cfd4bd8be009aedc3ad8b4fa69750a668004a683d50a75c2b6bd54438e64c30682eced33589f56b8cb660d75c68a20863d74c4d974dca4eb4a723808b4939ae9000030c187d426773a2a3c09fccda109a0535905cfb0a32954befd088807251958a62ab4e76f77f39975eb33725fae32f1234b3490ca632a25f3ce927fde89f698a12a66cdabfbab3085302fd579efc137ee4cf7b4482299be65f9ce469cb702b6c26914f70b8efe1ffac2e274c15f3f7eddf11a66cf37fb1f77f52e5f7f70f61ca9e7951b9b9a86d3d4c0992dff4e14fffb1bf0c1217a6eccc7f91b002a604c96f7ce0a7fec85fc4c70f5376e6bfa46965a1b1a2a83bc2e7301edf2402f8230a98b269ffe2c7224c09b4bf78d24ffc913f6b354959cbb861bb3715a632c96ff8e0a7ffd15fc489075376f67fa958075382e4b77cf8d37ff42f62c414a6ecec5c42b3075342d9f29b7e0cc3d4621785c5da51277ac2542e4857eac321839d7a09502e215121dd38e36b1dd6970dc25f42341e30b5acda55225afd8ed8106798fa40002702830f960a7bc054d6637f660b3e4c7d78f142bcc72562f64b18e0c8b8a6f330555e3ba7c1d4cf213eadd5886e717849b7bc78ef350266090f2de6ad39a11ea65666d741a117855243101be632aef96996b2c558ba352596d21c8513bf295ce977c8b5b7bf00fe53dd9585d9f728cee298329819807c0f1559373b0b6627b739d9eafc81d1614f27f8d00976474c1aaa9fcf69872c0642e0a91876033f5a73ec2f1e93d36df9566d292cfe66b56f831430d8af2a07b5cc4cccf8188c86725fe9096cae33461cae87b2adeb8d4812cdad45d2840b79293ee146910a52d49004b8ec89c594e2387d22e0b73891dcb4ac35d254553b8a5528ae0f10e2ce5434570a36150f6b688ace0e7181db85e6c3acebeaf5d902b3e2372b3df217e8479dbadc22cda6e514c75597e79690347c3e910f0aac628aca9472d662e496d8e7eb4120b1426bde1d637f28a2bc47f76fac9a6455cfb02aada7104027827a5262670059c88785973e84409f81226904218082384f2e829ac39ee3592f29148a6960c3427763bf19eb844a23070666e63a165b46585ffe607f46a106d6ce4b3fdca7d33cd25292088316349f80bc1301a7f0244e84bc8a568115ee367f372b40aa5305a4f8571132b5f84390e11fe96278630e0158c09e976db58a867ba8c9be41971415ff6e8114b4c1c80c69ab45a1d4d1eed3330b4d066e1555996cfe7290802334fc177ca06410887e75530a716db0fe92f61709208edfef28280f5bf32442312e580d8cdfe27d4b23b26b0f2d1636f63973a82418fc0e5a1208dedb7821fffbefe67a4953c9f9a749277f80d98ec180f8d18afeee4f08c5f560eb1a3feb1bc8d93f9fee043b85728e974cd19cbda732cec9f16f0ab6af056489c76ac90fc33d4918ea4e62fb6da3e149cb74819b1bf7fe1c9a76e479886b5ab12630c8a01d04bc4b10b9cf2063355488227a9b14212b00419ab0930f48099a26990968c97e80c0e41bab7b2444a0680bc2a5f03f10adf7e88e1991800e64321a6af489f2a7ca749615a67011c8fa73462f5044d4afa8889e1970ce1a080f3fe48f1b587744f4547acf2746da045f86a59e8f30fd1ec5f05bf659f3d0fb63c28d0e679089d33f3a92d34fa6266a17aefd8743626d9315370a1528e29e9598ed4a44207718a0cf6f26b6140ca47164cf862505d94b0518177c854e9745045b940531f81f4d317a706521c023a9fe61b36ce87bc015d7c18a2b586f2200a9190ee277b25be85b24c705f3141e3cc99bdd6546049952e4f9583cdf21e60f410342debf5426975cffe3c39aad255d8cecd6f2ba61d8127ea09f1147ae418c51f86c9eb469c5488970bb43335594e0938820f2eb4d5a73c0fc4badd92fcb40eaa657d5780a17b2d6274930dc342a98c9542349ebda10a36ef0b6157869e468e40ac5c5a8d942852d548910d48f657385234181dd8b88b344e391d3e34f737afa91563ccf91c776a3634262642ce737861b32386982e61aaea1056f88e6cc76433d07cc5c8f9a1b1434c4e0052eb37938ba5d4c867045200931f6014cbdd561b2c4a0ad0f23ce6570d9feed870bbf25a3d181f09d69043125dcb7c9a69c94b6b74d43adce1d48d276cc8891d024919f081aa33279a0efb033323d58ede85968985135024b8b895c57570c49691e06e64d70fc4a423eeba96ffefba7381cce9db1b072f1385e638d57933feae782bc210b75b76ba8ac291e15e33a3994b5de3b478a0141989e2d35754bb0c24b3ff2d2d9486e6692391e6000df476e6ed2f5baa20b214115b2b883add411a8aeef7cca07e82290febd170a977a9e01f1d642fdf22596924162c6ef9cc3a043d43462648b1ee13c272738aea5fa0d453a5c09cef8b8c677ac9d2d9097fe592e408742f1772102d2956bc1548faa6ec0316900a5fd929882095e07f0a498eaa30a83c3f77f8941628cdc26140e500896cb41dbfe85a023daf5ad8e0316df9ccb70b3a1915cf731860536ca5b1e49c1d93dc281b17097afe87ffc8028d7a63a8be813f9665bb45e6c246d362dfdc67c06836b1cc5b791ab7b930c27b67ca079632e94fb69dc86e46c04731dda40e8f5ea859c3e334c58fd20b304632da58abd6682f9e7a0e3d99f0f2659f76a465d98ed30966134cc70065c62b16beb0e9c01829cefc8901f34b4b40f98176d063be08ed0f55a69fd39fa84f271680c3d722da3b57f9339370806442f9bd8adc2494f8df73c91eaebca9a14fce8a13b727da5b8f42f9109c95923699ff931d9486a999f7725422755b04e715a28d8673c26d42c3528c535f9609cb46a82d082fbcc93bb9f2a8bf9c4e3b3317d8e46e04acce846e4be815f5769d88ccdc4c18658dcd519f4ed0d3be28791a93281d308f156b50aeca73134c8b2d9c4e5f759730e5d3716e25c7b343ce028d5c1e2b37e3dd11e82aa17c7a10ceb03113efc854e6e0c1216a4d01ba21093eae7123eeda42cd790d0b446a4c123018d09f11e60ddeaa85223a59d58c50ee78b2862f2c65fbe516873d32649332ecc40eaed9c2f0f69d66de8a5be847d53f1a2cd33c34fd97018a8385cae10fd9006e166c98b1bc820f30629e236b8f014475ee9c1a2b6f8a19028cdb83a4b067e35c201dfc9fcd07b8308ab2afbd77cd7ebfb65306e084af515dd3c76484c10cd5a085d3cd0b56424e45c41714fd483579aebb441d08c733f45009f4867e8efb63ac37a5976cc4f4f5d7559233b2abb3b9e884d7047c9404cbb85c974c936e2084d0d44fe809e05180af52bab1dc428af43e44252d373871907258e4f38e548ace53112c9d98abca439ca8370f5ed37d9e0cb97e7318436db60f0faa3d23d0a74b3c1b45fe969eb64c07d18abb786438c87209ad87947fe0142855c9c80a7168ba79bfae1d4dbe3f71e1ba492f1ec4f33e6083f3e6c74b0ad9bc0bc6979e94fa74040093f329709f35838b0dfe88262fc7ae6350ca8f9a73d5fe4c75883aa0aad33d50ed1be6897bd1840f0cdccda00ddec32fc73e44bed61282dd14accf3a984b17257611e497ca921f0d215cd39928cb05de34a4fe1a5f6aa92cde88966d9802d54930b158a96fee900f75de306f4985658b3317b115cad6297c74cd838b58a93715280fa9fbeeaaf05a84d134ff307d1b13f9dd090c3a08615ae29289ecabed8c6fbb57f5bc36e14e3f46ea1156b9da9d6951dae38d65a3f3aea2808ef8677e483a45dfb4b6a165bdca6f92cfc545674a6101879df338c3cf4e779f93679fac4501246314cab89cd1e4032190a24349152b9b2c25487a95236f9a5a73d4790ee5f1123850b37eefb032f7b990a8c352ef1592de857a7ef743f16f6abade82eab248b3fd578bc75647e41446ac41c40ccf46074d10d6a8cf882e3a40b92a0c2e97d2de4229cecb628715f7b9c0a3b24b251c9d357c0216e07e76a1a1d6d1a3e68c891d64f3430f7591c6e9941f09ce589a3745f4a2b20ee7af4039143378124c61d2bf558350e24049e6c65a9e703e54360166298e9b0142506aecf475ac9902f6815e0baf9f7241b514746a1d06ec8145a9f37f64e1e177a5212955fbd7160c6e6ae70f6eb6d113198aebc1cfe1fc65abe593a469aa02c41ba23a8f4ca3fa220411821207cc02734f0ae72ddc2976427780084f6a283286c52ba3eebfe23266bc1bb6930e7df42fd58a1b6f5d24366375e099f178ec3169921e93b1e9e4b051706d0262473955648ade2c00b939106d816bd17a281289dd9f5e952816e80d824de4ba9ab3dce3f7cd88587c492b810dff9b8c5930911c974a88a9237c63a836920def5e045ad19d783cf6f128fd0ea0f6b3da89816406ca1f34930c6e086553727dd6ce917ce7f1d2ef8749f1d0a03b31016a4181981453b0a15785ece90dc8e25b62c5588f9e068a90b1c9aa03f3b5c0dcd7bf67d109b464afd9e5b62928e3b95ec18dfaa412f40b83c25668a7e101b384fe2bad2b0e742aaf5d63450772fa12ad9bff51eeca350c8ecf823135587790215372ba333efa907edeed72c6e5d9061ad14c9bb914d2a8260c1b5d7e1785b7afea5143c4fc6ca3b25258812b102413401fa9d0929c7a6f9ce4c06c8d68856dc76893a5ac743aa645000eedac4daecd658f8c50229c5f8396f7918afe40a49a3ed22598d5ba242494671166f8ad9249c79a783e58e13ad11b0add3568fe6586c13e9b96e2e66aca71e01d16e8bfc423c9aab6b37199af2fca87c1106316cf35d1702b872b0287a6ea80479bcc7560e0a11ba8ed57dc0802273eef743ae92ee5255c98890a551c755b78de932db4640bd08125a5dd0b77880a04b80acbccca4882bf4276b83f2aedbc6c774b014c1b5191d6adf122a2922122431c8eefef545ea6b86420b700aff81b5aa2878429f6e8ea4d94a862c846fcce523ba7e005a0c2888d05184360ed9547e7d4bf7d8e69f0d05667ae84304654b03e765377fec91dc9a41a299f52456bf8a3fed341ac40ecbc8e58f781b8d41bcf126866140ba6a127b3fa0348e858e3b719e06008802ceec47d8df2a3d40b7b80af81a2a60f05da3435e3498bb39852375bb61d1d8f3a1f54b0b67674e8c83f9419a1c75741d87fa602d0e9a8b03a143a4f95c33f07bfbccde80db3d7b5eb2473016c88cc343b44b0cdcf05f63b2648a692b9e7ec518a2eac0cefe9690a78a38f7878e03fd0b6de1702d0eb73fe17bfab01f5c4f2d251cfd62f21729eb76fbf7c3a1fee91f637dc83a03500456bd03c501d73ce56414942fd5ba348de0ac38b9a123eee50c8dc9f8a5596a1d122b62430b0cced7e57548a2e3d64e2a1d68e261a9e118d5ea6a2dcea2e96b6b586763e383e02a64df6ca6526ff76a2101316aa479cbaf4081023e8f1ead510213dba206daa723d0ecc29f6f4a184be0168552ca36cfd46b14637a836c25025122d31a71d25753a6f0180e259dd5ec520d89942962a01d7aa5ee7ffcb784fdafc759740ca1351420f2153d6b3f012381febe6d47f836f97986e017123d31b1e007305a0f3d9b538c609be274bcb5df008cda2cee4c21a8a6f5349ccd8667c9d5964042329bb42622dbe5319704bf1be48db5f8a690b8a6d2bf7cac1a835b4bd578c6addfbe60e89e9ff798bbfc3ee7bd918546937aaa1aa12124d3fe43239cf7941f86add97371f48ddb45eef27b8fb59f21b734301377fea5dec71a71d00b92edc690c3c7da6760fdd0880111a0ce145e75aea84092a3034fb3555d21c1866155779c4da3512d58238e4431193ee762125a0b4cee50eaca5fc298b4bda65d06cd4271dfe35f2cf5ef0b66a1c661c616f868cd06ff6bd0ca9e676b7bc3e5e68d04dd619fe7cff2c6387beee0e0ab5f3f562a29e6a947ebbcc208c95f52dd4d78d0d3f7ed4521dada0030d3aa9b431482d894124087d652e979cef383b64adb377d5a19521bf130dc905e17e281b17d6d7c2ee30bad36913927fea135092d8edcca67a2059ce58898615854224a0d41dd98e576a55b471f258a0d6b05c9ad6b0c240a54f1496d7129b739450b59badec872a1a0b75af868ea792e8d16f66c6c07e33f13fabd34efa8316ae57be3781265115ba0db81deb129a5df871e23ff3ff8983817a3a80abaf26a0dab347cb6c721ae84d53677415eb8f3db5c08254735a17091e9dca1c20bcfbe0a31ad8867229d64f853321f32cab2efdd7b0a2e55e42b1cb8485d569850af92ffd5451dd140082748f0b9a59d130fdd839332384a307668d5a59e4cd1e4fb83f68266d906b770a81fb4a5cfaa1639d3367c7446dd30c803b87fd15f88333586e1541a56e8ddc9ca7051c01c1f053c4a6cb0470f6f0b199b4c1ab248d24691fdaba419cc91dd8987b5e49b03855053468ecfbcf557051b9fc7309dc0bb3c0059098839a4408da505a7f7d1b3baa3e7b29966bfeeb3cf7f5ceb644608d5d3b3229069e43edb59d79a6731f7cb0ba7a78c7fe32fcfc49e42284c40333ae68c8d2f7f877ab47fa7121adac00a013696c10361f774204f785359ebc180094a29dec63c7525e4344f615058af123d0286c76d0360246a9cbb2f138e83eeaa543b45febfed02e3f19cde37c032681720354560ea15c3bde261ddf138a4062c5d9964ec6629e8c6f3c2f8a3a04e66012a85b4fbc924d36fd3bf4479e85e300ba63463cdfc229bd647eb24589481eea25dc96c7fe45eafd622fe8b00398317e7c45e936949f6c0d59629fc557d405e3da778617b3ffc837cdb83c12a52df3f935930401d2f2d191153a06db5415702138fd2169582d763ae356ab7d7ea9b93c71eef30fe2e5d6da100695d96fbab46977b5feaba01dfd225592b6ee2ad2cd07fd7978b34cc977b812380678344df4402c54305dd0d4c7926897c30f3cd0abee79f1a87465c0e4de9f561254e93204df8e6a2d64744be91222e3558beae09f5906365596d65189930700087dba06f8d6b933b9135a7bf26e80d2260ff6d82904cfa7a1559d9835d8b4cd6cc079dfe7dc7ba464dc9ab18df3fcf6143e2103a9bc0770928cba23026be7deae0b6102ad8f2db62390107b027b4ea740e6052fd314c31bfd909756be533f9c9408d3eef99dfaf060a2214d19c25311230ecf78eafe60b061db45162d86624167dfde126639780073a63133573ac9c3977695e63a03c1bdceed27f0a6d56714aa25924a4da3fe9d2a362ed91c669ffcc1202892cde4e50d38a5a6721b9005da4f49b0e6fae7180bad9e80d3f7ffccc16dd9a076caf260109bad41a041f9b6230899ea4f0ce045ff0eb5941ba99cb66860f0ef736d351c197ae27eb11afbbb4f364e89e05af36520f497a3a1ba70070937b22a27d2e77b0000d296ab002a04d5c057580c51559fd094ed0197e5027e9a059fb16f298101da0872f0088a68b31e73f04a1562b51ed4245968e8142a2e1b71f23e4a9bea2656ba23a4c5bf0b7120b36e2aef626e360b5a7841cf3a46853d510a4c36f1f372c7257a8729b9235a8b66c29c091eef315dd87237b8b412d1cfc98243ca568d45b731e7c2ed0b0175ecbc0694ff931eeae2aab364103b7bceed0f0d5944983fef3b4ea79a69161c7d55e59c038eabcb22347f083907e0548cef2b1fc44883df6c39f45957895946b99586094033713987bf66114e685de5581a320bfbf766c4461ce36412ed105cbede013c40545d30ff04d23df66525028218c5f6dd59b0122864a4af0c27286163995676a7db3e05c84776eed05dc0cdd9e86181910fe9e885dc2f9eacab74aef6a17515c01d5aa7ab59d53b4af12b933a26207bd8aeab570c19ef602b13a630c1c26706abcbd68977337a93f7ac5526d4f74f971a2512472dbca6365d2ce3eebfb056aba0d1947688fa12595641656b4c4ccb8f3e837652ba62987d857a0d174a0c406174e11f9017e2e910d3e84b82fa775047f924d0c7609421e0a6949b10e3538c880fbdf8841d94c40680256aa9ead5a53988f0a4faca276c25a50a901818d25a0c50ec4a780b8330a8e61849a93315890a1896ebd2f7d2a0dc7fce0a7cda6fa0ae84f83c7bee7cef28b316ff881d0a980970174b99b521780253462ac2cd87c863c26362b22b07f4e0280db8d5c468a33e2758af2c2d810b3f04ed0b9c7d9da1f0dd6b20c60dd5421026243ac66a483c7c057790c9ad1f25d358de0d56d2e5334cb384928371327f90cc43b374065c38d5c8f9f57dd97d1d91ba31ce9fe356be07c18367cef4de49b68f317fe180ceeb7ea84624aef5c2b50d62c8d78334e652a40055e283ea47405199ae2577eb9ff69641ae51bd7c3826ccd7c27ecef2c1ce98954dc5e88dc5fa5c0bb425e629ca3a6381b26d850067d66cc80f531d9034ef4181e5ecaad8c86da9e37422fa9a6b544644ae4c71b3c2028deb771bcfbcb36cebea1d501e2ec48f62d31136ce2bc1b7718690eb0c647dc2cb857d68bbc33cc06042ff7cf97f5a3a8bd7165079813eefc2a4bbb466173e373139bae1e7db5fea7cbab68db333f533bf2c6071f05f9b0e5e9fb6bc1bc1690f1df9ba627f35c35baaddb16f1f81b3b4f8fb5a177b4acfa1308f28d4fc7e2d7170d3ad77a129994f939430832520ee644c2139803002def3c9c488f15aa27aee329dd54633ddeab14848943518eff26c0db99724a4afd4dc3530f043e766c989cefb0e14604e5708bd1a0972a6347315c88e6aa649d5a1dead00fe3b52aadcee3e4444477286b37220e4227bb691adcc8da208d525351a3b8d9971550a5898533016fcce9557ecb4ffa1e3daa8963a8eb42f4a3ab9c8b40128289fd87df1f16470c053d436fd6b2565b96751b014b0eebc571ea5da873aeb828c03b36f38c2d0f7ab90c6025a00672ddc1316f305e829037378a1cc350c83d19aaecfa14154059b8fe8b42e284c23f84a317a7d224e561c4c37a5e74107faab6595aa858ec75662dcf2878e96cdc320cbc4ca9c44175d6bf2ff7c415258c7a215622012bcd5a11eefe0c403c534cc0da14c4393a9366410220d51644246e615873380dc0d49d61d999762f34f3769fe0a4ddcb1427b8550fd7e2812ec96172b4b9b64d949fc89acdda04cd748de6c09093e40d0c25db9724a8747feeb0af75125dfe46a118b2d5a48cc6be3c805c884eec8ab5f8c9a500440b9642f6fa84bb51cf8684d08298c5c734481fae2e0ac186d208ba7c5f098172792f7e4f42bcba7552702efafe7be305624b03a26eb42c60e8459681b221a48c613cdaa14a837d3916ec88307be8d420d3b191a240a64148dee506e5da482c6b3d3019367ec7d09ccc2a18e539120fa6db5c0af734acc267725ee45e6961af858cc1f099f5ac212a37525d7c28fd33a9a627eb8d321451246dd3c926ce5d7151fdbefdde5a0e5340036999374f2aced26d2101f31322731c1b7358c443627fc473fa8842c40e426a2674a994e74e59797ec7a1dc5a8d868459caa81bf832f5fd91cce4b6976531e7d589823c69a785ab6aab7706ae758bebc8194ca159df7ddf4e146a4a9f0c9f2b0527818b0d07983dd6c896a2f63241c642d472347f2b3dd04b2dad0a284eaf27cd37adb9f9b2f686cbcfb46a51558538702a6737d1ba44f0ee44403838ddb1d1f12fd03e85f04acf1373f90e0d9e2821fd575c1cf1a245912e2b965a07a2743d47b0adbe5a3fe1c05b2aed3398b51813e621110e00dd545640bb222cceb5c83267b1c041b4e94c274c848474a44480ec993d48c08a4fe80f50efc461fb51f1c0f499e34628fa9e2c287e10e6fb05bc54c34122d7cea071a8fe63493c1b34182783e2e2e28b3c2fb65fa3b47071d29e5e093f8f16c09d4543aad09629b052e0ec3534e95992f44b4c08458d197391eb364159a3638ec3352c160c5280305b6fc7bdc4785cf2c8b1749b15068ad430099749b067d52d416917c50b8e090344f2e132901dffc8cec2b0a443955caf93535a25bda2daf4b1b951454f4a7bcbd507a025e3be535f490bb0379e1d1ac26c6b1ed3e273736b56d16eb6aae597747fb56a9dabb3afbc21a23c696bd05c101875dd0fbb876295eb3bbc2b7600e03ad293c76c32d285637eea80804e6b224d663f2f7d651c902d60c8f79320fd0426583986f3517203e4375705d26019e771818cc72bf3453c771bf021b93ebe8e891919b47fb08c3467672dc6663b243fe8469d9d931b7bdd37f71e014884b973b7a72ca1b31ed059f7018fd3112b0a9cdda7d5f3beffdf048891c62a1ef2de81c7ae016f197462033928035919e8b9f3bd957b08548eb22d8b3361954c2f9fa4a6a21ebfe1c6ae9d42b8bd2cab71d061170720525a555d9ae3ea9ecae2b20aa56c5b6b88b5c3d3f50d7b376af36f4e2e7deaabbaacdd55c0c358475f1257d0a605e05f970571ddbb9e6b8b042e5345c26101222711ff4d02b389e9d67ca406f01690ade5e6a8643934ec97c4b9aef00bc1bf1dce831d46a191f665893a2f603258340e884b644eaaa4befebf53bad4b1f7c260d0a51d1a2f9befbf22f2d2fdb990059ec9245709575f26b9fbef3866ca44945b828dd4d1dae91680a5e580619a8a9770dd32805c52c56e3387847f60b8864b64b2ac2030c7eb24d5f840ab64e7773c17274f7d2ecaca91ec3a0536f0a1c2a3dfd97de028b87b301fa440c25951c0a9dd740f74df014b917b08a2c6875b9d6311ec440c1d24882bebc2780f2fd75a8a7cb51811564fc1b02749986ba614e2b3a38686bd925ae0eb47f27a0a4467dc719947a339fcf015f367dc1de52242340f2c295c308a6e1d9ca480d25826f494103474ac112462adb60b94bb81789737668384df8cbf56ff93fb49b0b64c922553dbbf643fee7a3edb8b49e0bd7c9300b9c232135c96c175f8cd985d7d0520b56fb2aa1dac8730ce4075cb94ac36b5dc8b5c63050d18b93dd158dfa0e3832f5854bccd8b9fb00cae082d8f12527848906a067314dfdca45b728e30a7c86852f6e6cc55feec782aea58f432e8ce0949c37e9d90e6fbdddfcce8a7d8099d8488bbcb58e9f804201015bb45f69677d32aa38626bb5d3363eadbe769c24430c2da32b2b6743523b1be20404ac670dd6433b8709d7c29a89cd2369de6528e6c54b82efa90f8ebe8b49a144b854e25f8087363711189b39c67ea1e094ad1ae531e5d76f7c901afdb71d64026ff9b0e70ff270bde66c9569dc1bd228326dcd79dcd5814c2c621f476d59f01e2b7cd359c15a007b1bdb675b8c790c0d31f9d9b93945bbd1d24465a0a9b05d49a68bc3536125d181b212c2e28a861a1161169eef41833e5945b075721087347b756b6c3e4f711d3680100335bf45144d01700fcfe1f6b77f7b98396dea6a355268acbc9ceedd6b3906f88bddc296446d14e3f94f9c47fd6d7828fe387b7a3ced6445ae36e858866e5a345177d2567b50c8089d56ea476b9b78768f4fc68a2c9df42f7c3581ce10a80b63ec6d82ba2b0cbc34b1f594e852a6ae83983328a06245e295b0b8d34250fe54216441201add4a77567ea97ca32c834c2dcd91d11c443f9968604940fc61469806bdd88fb5ab1528d9feac47074334c90fe54b739bb9771053744633d12daa97b27769bf2dbc3617110196d80b1124cffcb4b164264a6783b22446ad31ef8098d92981c54dd9e4254a32210d31770ff49354065243e8431e1a77f595bb29ca8bcf829dff00b39c1250698f2b01de9d9af31ed7f44404b1f21982e06cb30618676e41dda64a90ebb8fca6e43d4b293563cac312cfeffa0b49122b8fba0aaee3247c2b0c7d3db96368a3b2daff04f6888108f3b23b8220f1c824885c94df2ce49a8e93ac0504368164cdbe47a0962326bfa0bea69892f1dbebf74364e7b2a66671d7f31942ce83ca557998f79baa1be5289b65956d6ec47e77f1b48800d24baf89ca4a8a27d0d9d63596f06c20be5b0fe99b1696ed7ff1642dc71717f4acff6dacf13f38031f2c0ac794d00c5708838322ff3667333948513f595dce4f3a6ecb6916d36010c9089cf477c29468d6cfd4ab91a1ac9bf25db50e4962a1991053ae2fc55ca95b04829be0ea125d966449b72a5d5b2efded44e7aca74067c0986dc2f30eb0dfdfc6a8e440411bb7ab8a9c1ebf2ce7ca68da42a1f81e2554e24b9566620bb14c4c9b94b05cdb24945d70a54b959642064dbd17761831b086bf23fd815be16b196383570e71a7f29f5c1f45bc65af43c0030cfb3ef86ce2c693de236aa91eb2c331ceb1fcc5d164e807994e0b7612a4912e3f3c5b93d58610c51674698c7da2c4b677c3d8ea6cd53dae8c3fb6ea731a9f76064e817aadfb724b9dc7940ed6293dde5cb5093c740ac0a8cda1f605944b88f58b3b4a0a0c22c0695221d33b3e3fdaa532129c0ed29fd32b010d23dac4648d524375dfc3e5759bc99415c2a07fa31658dc1e6b3361da808bdc9083d1710582122f820cba2c43d88244b16576f46029e05b808fa53a26f6e49696e5baf9bac71512d6a69e041568890140cfc4e227cfd303c984ffcbb15bd5f447733b82da7a0fe1b41546536bb7d70c6c5ac7b8503f7d9ed05376e66bf2f1cb89cd53eb8e262d67de184fbacf6801337b3c79eabe95a838fa36436455f5198f53ef8c1a8e235106e4d91d2b89f6d9f7025b3576a0a9bdd074eb8cd760f38f1563f52c996dc03475ccd2c2c34857d813d53a064e2d47275a6389c7c69d654c69b29da8921b2c9396bc48de6e05e739d69c3f8e7083ffb2653e4d2c064a1ee26720573392007eb82f4895415e394992214ab5950ed2a41863f9e79f1ece3f3229d7cc733e57def9935c5d70920a74ee01211997d225292ee9e7d9667fa9e982742d0753f3969c34f140cb75695cd17d52acc1e6436fe5e1d1b14fe252260fe8c5981c167c950a0c7f352650b3efd1022da6c877bfe411f2f86d637c4cb0c986230c2da100185a140d646c4e11c4081b0771ce9916b1224f6c7669354125d3ec59122892dff99e964ad83d65d2520701d0b9c64ebf5d409fab4c37e4727f275b1e8e83e2885917fb7138df07448bf8177cd74fa6e131449ae8dc61c714db500cf8e555d2b7674860e99e3ddfe454709e77a9d0074d3c0b28d5c290c05a81d30f39f74c04b944d15e31854e995c8cf56e35e53425c8644edb23caa3d176ab6cffbbf5f6e2c8088e6c31ba05a30c58c0f41eedf3ce310c5a10870f4a92193805bc7e10a1acbbfbe9087bc7f96713624d4096ab898bba72ac31bc80c0195d9a2f4e2671b328e53decd3ace9b9b0a381d0e556a1d67dce61149f8c96ae65d9ee6e8f8ea27e15a7f0dbfa97299e6b497e1575639a8254a627533ed5ae85a72b9084fdbb6092db598c38dfa94c7db71f473553ea1df17fff8af2d40e70724446fa8d48e45b6d9adfa18f76c5f98f4d2b5577c6ff0847b3d59dd5b16f80c5d019cdcd296fcbfdcbce8d9aef2c22bd65e9083abadaf1dd4ec9347d987f3b4aaa3712279dd58e3924c4dd9a9b08d52cdfce88f0b425537e972d148411171adfff85ad71a105abef0386bc319e688907fc5f6b389669c89613090e2e80bd7e610390ee617af6a6074966d812642fe9eebfb147cd8fc58b3151e3a27b49e87cb93f71938ff984e4838f74a23d0041bdd8d61caac199eb3d28b61ae7e6d19be2081bb07b4799c1c00bf26c7a7f2f27196b865d747fa0becdbf035da94013a43c261aeea0e8d233ff77c302241019ef9bdf199c960d368a2dafb0bee4f5c7516f6e1c7fd1161c509122761c97f965e10940345694b574680d94368a1c4837e907a2e658969b3bf59e27f28aac4ac9a47692ef6097951a70d35863a55dfa9aed1fbe981f0711338d9e1dff59c672070e6380a1d01106b369b17a870e502f143af0ee7222fd021818fb61bd4dc83d0faebe59b981a23e57d59464882b62c2a41593f48c2fb33d2b356852175d8dc01f17097bac34bf41662a1152c553a80fa6fc4c303a27e8d25c612387f29ade21f76f499638ad7f5bb31f1576a9c9ed0380fb281968032e87aaa99571b6bad614dbf1d7152bf362b2b4cf7287d7ddb89fc83d5c2c71a7deb36fa3908a768664c8498e8348e0a566425f5fbe1d04027795ad5bdc9ea32f7d9d651844cb94e09c31897f34ca88825544a0a8a822cf4a12d4c812991eb99faeda06112633c53df9968cd74931823b0761c2bcb0689d35e870ee3e092065dda3a7f773b9a6751aab42adc14137dde2e5c9cb0c8b5c7024782869bc348b0f9548cdceee1ca8e8e7f3912703fa0f387f5c4aae985f9fba23471b094d4592010722b2701af8f67a07634e6481d59a818df7805b12262dfe1e3275005bf9308593974c3eb88b579759bfc7ae5e9c3d964f30d6f92174258e66b1f861095544131c92b3d2f62976001bd721f71091002c0ba853e9f2cf4eb11c3316389d37c3dbc5589516e5f6f16743d205539674241c9169d725df1a326a111aeb350b68c6bafa46f1766d621ab9f2069ff40419456682a5f31d9250418c6a1c434e291ac3279c03ea8c45768e7663bbf6053741f07df2d029e09d91469d98ab9e0fe0073607b6ff8145d1457f2ce99b4ddffa3b26e9962bf070deb16728ceb8e7a6e698fbb6200fbe9576e2116afbcdcfa3ae023ceccad1f764f37049503a188ff175d611629c212f4c311203c0e2438336e660e65d05c6d1a106c2cf3cc17d56441b74fbae0bc8c699578544805813649b103c100a95f8ffe07b568e100827d1c182c2754ea10342c5a0ad6b0502b0f4d0d70fdf484bdf3979d458a03853b440a7fa0f81c444f9287c69c3bc3a30f46672643c5252f48678302b02eef5a0b15ad183e1e6330f37a2c27a7677da456389be488c1d6d4cc94ebd18e1eb36a988d121db0505009a3eda427db21f98de1925ca977101c7c8f9d493accc7968901958ae0faaeec982f686c694caeeaee2ec8adbb373a6a1df043fadc600e25c62c1722b3421f9436e60d6f250b6e1d3ff450e861c4452609ee440c4bf02125be23e39d5e7402fa3bf0400f932e8dd96b3f77f54e4c78f8240f01fff25da04acdab81d49fe0a14a004e138583a15e9f03774395343d3d9715fd99ff60a89791aa238a4d58bd719cf59e8ad325cea1a48dba869653585cd4dcb55d44ac11954e983d0c30d1e7650df4c3c5928f0629cecd18917b5951ee9a7a432ba10a320afb4eecb577451d2deae4cbd83b3dc74da8b10a4da34e3215550c68eb6edea965493b48404a71b512c90d7c29e55ac9103f8d662ac4a8a25acbd416f6c449d7c5961f0aeded282977029a06b781fb35c1ce3e7399041d81b312053a2988ace98357a2ed4429e0eb59aa8efdc037401e07ad0f30cb4e6df7e6b59c43c70cb365286f8fe7c04724a331b78eeda118aa213c23987a01521462024c3ea0065241d69d144ac1386e6e094d141755a9a37e6f2e6bde1cb84a844a80662b7c6225b34bcdead32cd7b4dae63c6633e6fc1dac881449f080044eca275403b155bb2b5a939dbe814180001245bef27834d5cb39eb1ce9ea9f1ec5defb4b4c157846d62a4712ac40ab7e1421f8ededdc3c96e389744ca9e419cce6f652c8d38f2a8c0e39726ee0b0f8d0e2d7793de8a80f79769ec46a9b57acbd83b6289923a67efb34b3b6eafc542a6189a003fe83093e805f40915009388e1879b44a3cd4e0e11e918223cba31f102879dd427b59a5fe1ee1db306171d077ceb7e07be9c9a993a0aec9de07ea6cdb22ad24bcca1f8ecdc1ebc5599fc9d6b5920bdf2301453c81edebc541faa7a1bc254ed771196274e6cde5565fad333ef3467098cc02eb11087fa0ffb54b1d3088ca4984a945c09c266b73349dba39e7030d3f7e08d5966aac10f9dd900ce81a20e7793a65f721711ec84ce331f5194d6521cdf52ca9bde54a6d05dfdeba87cd8f2ca9a6cc2a344c9c19c926785a233a123d539362831d9c0737007c8bb7ac328693717125cb024b764c97a6457fb0fbb5e4544cf1eac0c3e57c32800f43d8e460eab407c8bacf1f40fc09d9023c32dc1cdc889ea0a86900bd118eb859b7de912a2ea813bd1ef851b914c1b3a977b1ea3a7936577a6ac076fad336937322e5e977b97b612ec4d6bd2fce0ecb1dd81a0abe0ea2c101f13f4d49801102342f591333e166bd4df8a05441aed5b4d5e7122c53116d5c88d6ad4426afb93a35bbe7df4b188832a480a81e21fec59b263a3d81ca1eeb922d65a1d7ca89ee7d3755a4e0d29bb2e3d970ee8ee80ef3902cb0a5678417e4ca82e2821847e9174021589697f70ca38a0151cd015a526e4b2807b0e31b70c6423255fc4bb3a923e8ecd158b2d53c7ef36c631a06b6b40875c02e9c1c4929e1ab16e268aa360dafc6fa29f8e2f03b7afd94a23d810bc3ec23a540a94243aa115eb1f3fb67431da9025184bbd9bb1aa1afbff9552679171f5a0ffcd012f8454888c3c812b06898c358519ea0a14616baf9764852659999b0e7e83bb9ac94ecd7306f332c0690f40b1d73f5f6a00acda766903fd115e311134d3dd28b0cf303c16fd0467aa1b1a0db8e3b70277f8954507362874685b8564d80e01ed28880ee3636e61f709169b0812915517ff052dff463c18c26d0ebcca5f314b722b8c0490cefdd46ac93e62637781bef8e5cf8839d69e222d3b0661000046ac12bc8d0302d24cfb8b55cb45e8e9807a89ced9c5b95b1d39bd454af076dd2e57c6acf24842ece4ef90aa0564792b31a7f45f1d411bbed3757479aa4362025f0f4137f1b108b84ce17890127bb60f22e1b0ba4f6edf422cbf6a46877aea3fd4c82c929bc015feb78a2f171e815e8c0d9dc2f72006d0956ce3ace9270d29da23212e87c576baf8905c88b8c86789408b3117d25a7219bd96ac588a5ebb9d30835a272b514a1a888d2858259f38cef745c6495d3248b21502f0c42f4b52dafde246d3e01ae19074366b4d6e6ceaf1376933bdadca019c1baa9f14a63524581dc78b1f6d92578b5ff58c533b2b62a8acb52446b5cb3f48a229d2e7a234891a55ca05f045c9b12ca2a1923152b60a895941474e9a9778da3a308c7825d9cd486cf1e83af48067e2c7d18a03aa1be717008c93fcdfac962e7725905a360a50053213990d8caa11202767bb8962b162204242a22e254cb2d8b9aaa0bad36b3825edf0ba79e6a464e76a1d33dc8893e97cb5d7f9c03a8f4931055ab051ba11fc179a2af418871b52a822b6f82a67fc50fbad1aaca73f6bfdc0db79fb759e892f7257cf16255c660a087e57f0c71c2d8f02dd26f5c6d0d5f82b4ad82123a02cd179c5d6b98c0e459403c05b1e68bf88e3415d09fdb2f9dd5d5af8bbc542b0ad90cc625b4705ac91315ae07f7bd6e110fd4259cdb615a1a90656107468169698530a384669754c78ce5bf57f9fd7a870668c23d6190e6acc09cd5d23093f1ccf8d397ea67fcaeb607dab2f384bf13299266aebc4f8d6f15b445b393d804032174260a57bb5b06d9847fc299fe56b716e4765028c2314345763c476400be367031edcb3aa1b9445fb4cadb2ff2acb3e13c680fd11323af102b4bc60516c476b6915c9d5b092b8e3d4d6a98a83aca0561f83f6e0c60d88f4ce473b66968e485924bd6a1ac8546bf75306b20a1817ef10cd0423437db411f1c5ad5050c68a4b66ec358ef02a240d9962ab3423a2352cb7bb3c52255ef1a4e155d37ec4e597884c285ae4667f73b1914f1e8f3f9eddc67b9c98ae9f31afb0ae5007ece6533c00ad536b05e80c3142d64b376814aebb79d85242902328cf0d58e48b85e7f930937834cc64e1454d14861fec4d30876cfbb089805a72f4fc1c8db29ff6b47e2b3c415cd8e86423d3cab991c6b8d00298d3afa27a5f73bc2245412a479b8cc5c1ff10d8e6861da7db4c3c70cb62f16781c089a16febc2e71dc530e1b27358dd23c6a959ed8dbb7562825b96d07a49c21c9e0718ded5584dc5b369ad7e5119b31384a065cb610540c88f1d5d55bd0e465c35c121b66cb29f8fbf0d9276abaa1e0b6489cb0fd49668c990f7ebb15717baba6367cd944573987e78fd2eabc2f45003008e0447489b046c1f68dfa04c53713f8560153bb89bdfe48f900faa6a8648e8f80b390f2b29a5fe3568cf4df7d748e42ff52856c1651d115377f2dfe47011eac51da9c86b99cdd29c00cd432c14095a3fdd1362776b4d276602bb3829dcb4f645b72a4a9cd194c68da205342db3c09f01d8d3f73f0fded3e84bf9862ec1091a0a672f811a22affb0fde647a74b841057fcdca65eb79349c883f1972c902f236e21771492d2d8a0c26b0cb4af1e3688d207f328c20108176432243c0a5ae3ca4ac3e4f59f79cf242e4262c9e0c17a727777eaa230c2139f4e31f819c84adc7954d449d858d9dd1dab119b4eb499e5c483165267d70b6a946154e1d311a04aa2ec75f2d410a29fdb65d99d46e1808b9f5a04d0cd33a773a105fa29b3c0d2290c945d5e37f5e49aa1781e57bdb3d99f2196172c3c8d6a7af17b057dec786ce8635d82d418a9b1b7f4775207f9024299d7f7fec6ae98684635b7551abf24b18724b8aac065f16cb2ec58556deeda5984d09152628f76c6a26422e168582ea7b402d5e31408af4e59de2666839a32c3d40e514823e244c084ee13bdbeb4c5ed8fd96365bfe805da29e0633cb1ab464d556d8b50bf7be02af06af60df72f408240dcde94f82329e502ef27d263613767344fad7a75d8916b28ad46d1cb49bb49ff1c4619e631111ace6851a00b9e867be13ca61ac0e068785a89f74e547d8fcfa45773294ce712bba64d8094303411010cc94290e4ae993f5998c919aa21130efaf373e8231db827021e40ce33df80cc21d999e82526efe3fe257dfaafb4564ad07abd3dd338d055728ee24d6a7cece41241983bba9c51518965f2704376fc466316aaa5d291b3cefb91dbbbb996d670802995604607438ff4820ca2a246a0a483939f9364ebea9bc80ec6a5e662dc909086a8512787e5048b296e7cdb63b037b5690b7d74db44dd383edc370704aa02ba1eb2685e505815271d4985942aabd2fd650cd421c9df55d618cbffc1b5e1d35c1266c4f6e8cf611b7c4658be5876f5fe1e8487007ec401d73f7891f387bb56956530596ab0b3ecd4e940b490cddc519345d45beb2af8ab258410228dec4df6de72ef56064806ac069367fa34aa6134fb5064bb15694a44a0cdd21968969802354bb3340b0894851765e3b17dda1704746fcb911de4c3b337b2cf87f6c916c92259fa44ea03a174a627db5bda8ad71b1d8cd19aa815d097c9d0e4ec9142b2a5421ab4317e54c6e4994ecc27cc9ee9435da8103aa4411c13357f5ab265c9face39afcd89633f63ce3c7fa32a9ee2a9669f261b8f79e7f5fb6bce6ccb3eb7ecbb27cd8684f02e9a9892d93e5e1fe4f9855a7d8a9766fbe8b72dc79b3cd1645b666827d0af1664fb30468cf135a22ed6d501fb821f31428147440e2f11c838e5c41a604044c9d8434cddafb058de6c98fa0b4273ff47f7fe3c4db4f25d974b0b4b4897ec8fcc3092edc3159048b6a794524aa9a4b4fe4a4a4b37defdcdaf6c5f8d342a76a5e9d30f99b5cf645b65b2ad49b2ad47b265d59a6cbffae2e58cea4eb671c6d69f2dbb60b6675f1099b52fbccf9ec1d040f84a7221b98e5c17be5ca2c91ec31708a2c97ec35708a48a107c0d0972f3fc621ac7445d44ba64dfba349e0d8e4eca5544b6c79b8dce1988299beda94f9f66626a8e7a5aac2555bef08794ed3fba8cbbe106190dca1b1a94b141ca93eda90ecda8b562df342665d4c23bc94d4f90edc32df76b44d113c49205bd5317a681dcb17331633a48106e1ccac8b7971925b1207bda6a75b4a5615dbf6c3ab4635f109939d607fac2eaa3fb1a46c3f183cb111bf95344a6755a606aa60f257271bff0d87ebf203267bf361bd9b52b67b846ffe28b75b5d87f34f25e3f2f986cdf2f9b8efab51109e36a89267b8a2f96064097bff7915dabd1306de405f442baf62a38b97dc3740052dc9ec3588a0f6cfb38298bbad0b4a0b1b0d9e8cfc7f6f54df6b50da826a4b949f7da0784ce1ed29d3cfd32b52bf250466ded4a973ac66b8d78ecb3939681f068a22e96b5d65a0bb2b760c6ae0ef9f90591f97e5e83f63d6f2f1eae8194a00a3b78e209254f709fdc27f779797924cff77fe0653c985c917db871f36d970669c442b97a3f5ed8f31e742a756689de66df3ecaf16ee6ea62df6af5c30fb45b3a269cab986ec5549db595c8f4dbb6639eab55abb3d21b511dd3f2bc917cfb907f8e39942d2fb2fc5a4816c36964ce603af0c2d9833d9c39d32726d7f6992e3a584e9fb41dce8998eabc77dd351c7add376d304cb369905e9e4677e3dccc154b976c56397889a79f2c8d0a9d3e8b7886f034d2a58ee9dcdb8d6973d327ecc370fad4539b2f3124595863efd03ba786be988e99ab9fe93373664facb1b5fe696627e7a64693c951ca541a693025d3c903cfc7a43ee49be58198d2ce9dfbb4cfdb78f4651ffbec6950f6fce68f8f17b64fa6f4f4b3a74f24f99092a4ec997a4a442cd1a3e01e91e95f5e90e99b06995ea67732a5f46addd22797889d666c3e49a6f41a9630546ee02f568c421ecbb64ec73448bfe196d199a8a6b3e2ded1f1a691eca0d34f23624a3b0d270cfed16529f395f21a8685f73704438924d357d64e9f405f8c8e99a8f9d2257a3a5fbcd17cf9ed984c7b76385fee7cb10dd27bf35dede84f1d74f041ca315f3f5faf83d6226bcbd54d908964d3a8010954e02931f2f5ec1acd7e0e38a27a441b72284329d35a317dc437ea69bdaca7312b8d09815fef71454c7108fa9a524a29a535405146a6322e2ae715af0ca28f4aa86073dd8e68057ed58941bf8e02023d5f18e81908fbaeab3c7a49ad40b3040f2dc96711df88190bb37ca373b4e18019d9078e1939da833e7fc5527c668222f418bdd87de278318da6781af38db59b601438f446cfd93b1cba90b30f888c98fb50fec38c3c3fb0c70e7235238da6fb8959b4bc50b258240e2c48fc985658e58eafa18c899b0d0cfac2941c57f3f3f2bc67815506e2fe9012d3438ecf6e0c1ae5a4341e05013b4c94bc97156d48a07910f788516d72ad9737f532a6ce8052fa14cac8135b9cc8d8226a0790168fd2600a8b17bf94ace48487a4ca473c2ff18df8193f3f3fda60f76ba4124992f8cd17583cd0491da324f5d7a3c12ab3dc21bc291e8e547cb14b275fecd20d3234190dde4943ef9a325e7d7da105f2fcb42bf2c2104c41d97680b9c6bdf7de5b818bb51b8a8f4aa6709377c0a206edd79321d0b36b144228f128a594524a8fd0aab4d6d75a6bad94d2955a6bad95d6fa5a6b3dadb5d6fa5a6badb52261b68fcf0e3e3c999e877eee6cca29cce410cc4aa62093e9293d18a3374951b040490962947a4a78f3f431fa145e7a90be07ce3cc292254b962c59b264c992254b962c599203b3a7c7c3b9c3a300d76aa20ef0d12206f87a7c231e5f01be2a7aa81d7b86615a841661054f050538982910ed3f200084e6901699a8027cf2a54bf5d743f185dea8fb68117ad06f34d12fb41c068266ed936692b0eddaf6499afc436659134df517ff903c1963515282571f73488bd0227d02f5e9a54f1174d1c6c344ca8cdd5b7b149b8e7b7b77dc5b12103a894420883c87d887b61af61a0e83c876cae47ab10f33a35a79103302e58a16af6c7b9a6dbfe6681982233c410a4dbbb6b6f190dd12a75b87a729b517882a31b56ac2ea5ecf1b8d6ecb58e45ebbc4bb802c82c6284990e92f24d94a4ff6132fb9258b5ccd90a8c109d62fd6d0a841f95e11c16271606e9c9675ddb6cdacd3581ca76d1b97711cc7655cc771dd31eee3382ec3b287ddb36d7bc6bdc3346ed3b09a2fa63c1487cc1c7765e5b699751a4be3b2adebb68ccbb88cd3ae245dddebe564e56aada00ae2b2db6cc3f419eedc982a11537127a4349b8ee7cadd7becbea39cc6691df77befe5de94cbbe65df34f9c9cd6b97bb5dd669bff7765e77b1aebbc7befb8ea3db9cb2cbb44a2b474120109761da71f7d3eec6719f5a97659d9669d9b5675a0a8e1f5c8ed8c89f2232add30253337d28914e9bdcc67dd933ab6db85ee2fa0cd39f5c94755dd7a1300979d889c8044517f2b0aefb82709327a6b4e9c4ec993e54081d42e906388de3b8cf47a6619bb36e6edc5de1b6544cad701ba7715adc384dd3348d8ba9ecdb404c7130946e80e3b2adb2b24de3362ee3b699751a6beb384debb62ccbb22ddbb62dcb3a2cdbb0ec5b876199a671dc330d5f99db64cd64dd00f78ccbb4142a6edf6d2a52685cc7e16f985ec33567180899753cd7770d440e322a6d1368c7eff38b1d8e17efe97798a8fb4996da026537bb17e479d8c7723f4aaf5716fbb1449a258db2b9b0eb07439d30270c9dd365ce39e79c73ce39e79c73ce39e7acf3ded08046c9213d56a25c922e595cca8ffa345291e2272293a3085d7697521e870e3d10b043a33e4d6e3ce4c4e1e22deee2cba141392790169ff2c5b3daa7f649dfb556d904cffe46fae21ac64eb18b577c10e81cdede61ee1eee4237c1282ec2263fc1a2a748f11156f11578d402ffb0c00f79857bbd110a7e711246398b6758e60fb320e1824587e3e9b4c5de2b6b1be60f3b896c67ba649ffd7a331998b32f6c1630b7c0316b2b7e40203bb6f1d03ea7f6155a8b162f70d7d8dcb8c0b388972ed9cb06c4524c51dbd6b6c098d6e26614dc35b86d70df344ee7a8c0ad9302f7ce096e11eefe992b3c591ab4eff064cd96065d84cc21441afcf02ca24bf61a9e466ef40ce83547c6742b46b696ded21cc668a2946e3dd3204d07bc50e6ec3021d7778ed4913bb5566f925a44842ca684d78c468d50a3d68c2835100ac72c592ca6b0c783a46aeb470e3ba5d7d5574bece953df3ede203463ffd1652cbb33b22cfbcd7046f7de3b59b79bb8ddc4ed266e37715f23aa9bb8daefcd361e5c9675e7de65daed1cb0e59365f4d33dbd93ed35cdc3b4af6bb2b9f1c8beb601bd6f1ab4ade1c8ae2bcb70cc3646323093f429669b3b39f3a626db996c1feda7cbbd3df88f469e375db27d4cc1f183cb91eed6e9ee6e71d8475bda77d09781b49a06b383be20326fb75b8ed62eedf2c294c8f469b067f234681b8784f0c28b75b95c20c8f6574b6f3a409f8d2f6d459accf3b26cf698106990ce79ee1808d4df3eb377f7fbd8fccd7ebffd6ebfd9bb5ed2ed9976ec8921f9851c95506127afc08b3a2001916c068d62ee17a6cf7a1a94f26edbbca1c1e6b11f59ac5655ccd9c41b8ffe6e9813eb30ee8dbd3f179b8e79ee0b2273f785ddb7b7d878cc63d9e9b4e52865ea0dc1c33dd3340d5a1cf62f7d4434d9376e23a28a7dc5cde1de70b340aad863b891682394bed874c84fb24020d01017d68a67f2803008049a3c9307e402949dc3f5a0962ed91fb9583356ec4b372cf79bdb67109ae77f74395eeb5f38dd331a255d70ee0ee56eeedf7834d87d5d1db06f898086081b1ca993e272c446fe1491699d16989ae9438970b8c55623932cf393ac1074d912235dc07f34f2bcd92f3159bab8481797f930fbbc2669d3d1cfbeb0fb4299adc6e1fa79b1e45b749383308683dc4cbfe1205ea6cffa067bd84c64d2c603f4cea4d6357dc23aa662b667b1e900bd3f7d84e62fd644f58bc76d17e1098568b237c1d389a8628f024b8c47de17dedb7d5b1f2459546c3afad8e4e9977e89a69ed605a3e982962ee5508b275f2e24b344236746325e122447b02b5f2aabc14ad20e84b6d423b9dedb6d1a76d55bafd5a66157adb7d65a2b928aa422a9489080e09c586dc1adac58aab5031175c1802fc8b51e31428147048c08648c79a92d7d225dd7f50b5bdd3b64c807ca9714359451c8f5b2d5b54a9e0b471ec9552639c288a8ba7ea4ca4b4c955e6fbb37dbda87d993abb88a5f3813d5adf9235595c58b2cd7cf05b382b1a391e7ddeb7919a599da0eac03d6810980c3bbcaf539300e7c03dbc035700e780018079c310d2c001c000c007c0356e1177068634e70686710da1884d605372e1009030e690a727d0c1c522372bd098714895c1f43bd0a0e290c72fd0a0ee90c72bd0c38a435c8f533e090de20d7d38043aa24d7cbc0215522d7d78043ba44ae3fe190fa20d7a370488190eb67e0900a21d7db8043ca44ae4fe1903691eb411c5224e47a1770489590eb5bc02ce0903a91eb61e09046814e21d72ae40ae334c3c00fa97c69cd9b2b8b545db40a51659324b9c24f4c6553882a1b13f344aea7f5340a516565a44abdcc925c4f7b620af47aea44a550c815634254d9991927ecc4d4a584a8b234344bd089290d0951656b6a929013535d1351656d6c8e90abc74454d99b9b22e41a124254591c1c22e46a0284a8b2393941c8f5b426a644afa73e882aab2355ea757e90eb6889a8b23b4a4495e5511255b6e70651657d58bc925e515e4f6362cac5777ac0b3835c73907d7090eb690da2cafecc20aaee0a065175599288aacb922a4962eac5eb5f4f8fc4548bd75398985af11f1bac68c02283cc7a414ce1d75314201155b745aa5423318542255952a56eafa729882abb922a959e20aa2a4baad4b720d323725da920d7672df00b5f815b1c055ef16d3bc6f7192efdc3190c30c4886132c510838acaca8a0c32cc30030d34c89051430da7130a3563860d36a440175a608185e317fe02ff2ef08ba360172c2ec2a39b60d143d8e4de350d84b1634cff61d0e58b7db5b7b7bf5630c070ad92c4889124c6648a9189210699968a4a6b66656586460619686a6698a1c686061a6c6e64c8b8c1a9a1069c9cd329470785d2d999316327d75b1e1b6c78d8f5b627e503bedefeb8b06ae1f5978585a70e5a1f177e720b2b165872fd65a5c0f8f0eb2b2b8505e3df5978857158b3fd87432cdbc3c0e196ed53300b383cc9f62d601770d822db8338854316b2bd0d78060e4dd91e854319b2fd09873564fb1a706843b697814300647b1aec67c0615492ed65c0615422dbafe0302e91ed5570187d90ed63c0261c462164fb18388c4c647b1870189bc8d6de68b247b1027bd164df028ba2c9fe053c8a26fb639468b27f811f4df62e704a34d9a360309aec49384634d9b3c02bd1643fc23266dc104df6214c239aec3d9c030e1da2c9fec23d4078071ea2c9be847b88261bb11388058e5660a3d6cf4c56c951c9133639bbb4cc522ba913c0e3d18a908d95b2501b80c7a31573482cd5ec71121151bd8358aa870183443231e92cafb424cd03a1178b8ecb48ae2f31c10be79022a7d0ae724c699d910ea1f848a6759274955f782beb7ade68f4574148067354f2b393b3d831b2a675f13dce9416c0150f5db8e8e1c824a43bd843ca845c4f63264803e3e18cfae2e1e807bff0baf085b7852ff4bc940fc6178ebe6f0e9943ee2d0b64d5ff454b9bb6ab2f045ba0cc7021877635b2ab192461249aea33cc6a2191eb2b0bcccf7b4639b9bec6094b5cc9a8065e7deb25e4018f3ec9cd4f929c92a3929f2199523a736f9f68e5149a8a2dc7cc59f77bad2e16fa7263ca88986a41ec23e22993aadb52a40e691bb40c726de9178d521aca971dd9e99c94ce8d448f49d8ef69013ed2c3793373e6cee80be78fe8f7d91591eebdc93d98b18b2e8672492c568c2686596a2fe9de25cbbefeb648957469c99b76c3bb8e61d8439748c35d961ae634bc6958d370a6619086310d5f0d5b0d5f1aae1aa61a9e59c3ad6199bf180daedcf8d0dd2a422d5ecc31d7afd49a3813656ec8b546fb8cda0fb469d8cd72785dab9713ec25d64b239b0bf1279b8d6ca465b7bdd9a039997e61ca0f29d9cb17eeb224124da077f9c29ccf85b79a2d5f5883d1f285b3d992e50b837440f9c2980c962f7cbbc8cd17b63f974d3d52f385698e2610cd179ef98768029d46e39829d1043a912d4729d7642cb61ab4488345843a70f27a091353295e2f938829eef554080c44ba92aa392355eaabcf0872bdf4037366952bcaa623bba5b7945a7a91680afc4392e8edb16714936a485a9d35157ba1b95613458b74a9fe5e4ffb4ebf10a42fa2651c16da76d06bde96835e2391e85753138462efb61ad847a29f0e50d218b9f2a5412338a4f5b3a6510778953f06781831a2622c8571499657c8f2a1178e1e104bf2f6dba1c159b9bad58040839a74094db29cf30a3994794eb9edc06e2746e3ce7943e4455303fa44ca71730d65ae3cf4c0a274054f5e21b74b4a839a7c4602dd850492421a6c22a6640d264e867b34985dc30fa3aa8b902af2d7a5bc4c1253a0dfeb79a3112679e6bd9e1767172155d245fbc296dc7b640cfb82c0617bc4c0f60a0481c3768a4317a95a2263973dc89d41589099553081ed31cf1edbb71dc318f689430aacb2fd9c19080287384bb206596a7d8a1567f2b0caf18d796890e2cc20b4860185214030c410430c018221401082107020ca96f641b22295cdcd1a1d9bc6e62625e5a014e545afd278dd46c8b2e8f12b3466a986bc1ea44ad54e54dda30ce18689a6233536366753bb3866a11ada3bfaeb793d904b4495199a50e8d9c530afc60b65cb4617a9e06834e79c55b6224e4bcda7c8147c62ca0b4f2eba167aecd349c827e413f209ddc73b8d0edd0b79a150e8f1a3a2df066b0f96d8f14e60a6dc018fd045cfa49006ef0c2430b5eb42ef42ef42f69de854742af286e0a14091354cc3c0843e5b47f4b09590eb3ba771fa24ca1aa7036d3a445de84e1f6fd594d5d4a5e96663e6133c7366a2d13e853a6deef40905cff5460f0981e3855da48bc406bb562b66b644d8ebbaf6f2ccdb76c3c76db06edb8dd027fa4a4c78a2779f48345bad295b53b65088be4e0ad1709cd192ad99eb670ccc6cd5702a916342ef62626ad311fa687761ba1ba6fbc2a82342b1d238383831316573fde4e993e8f553e6cef4ec70c6c464214dc3354287b9dd33149a8665bfa093682431736a58e6cce67b63661fa22974cde6420be4d04751295e43f79e02cb58ea34ef2bbaee219665a87b085ff1a08d877df78669d164179b5c2f0289b61c5e76a2754edf64275a8783dc1cba3751b386a6cb6c31c193a5d3e04e97a4aa9b88e9e9234423e47af275a8c58b3d6362ea8aa9a9d3a86e1e9fbc62358ccb8c4971926f566ac0995ca74c34d5cf980fc4842e7aec93e80baf8f096e982348640bcb992bcb1d4453bd5422aad4d398a84ed25ee89ee763b61aac325f8909afca3c63fa44ea0e84e6b04f28ea6cf5a9611aac2928394260606a6612371ea53c43427892a66a76e3213a6dc9993ed16bd3213afdc9c917fa383910321fa17b7d371155ddabc9eb27ab751a27a642afde611a6684937f5627b866efe4f5343298987b4f7ef2939f3c0433112e31e1d5ebd8e7e7430404084fc332cb9f3edd8f74afbd92ee773265be196382634e18737c88a67a8b97a084869931132585b072c3f814e11919c59ccc96f1a472dc69e6b6af01d1542fb3948929d06703fb80903994e600832ca6cc99c4beeddb1e778b76bb747777777777777777777777777777bfc5b424162b462a529c884c5084bc8edbb40c845df86a1b0fd98d72172813039947b91e2b9441ed9c9f735e73b68c9d233abad7c52fee5fb885a6d9a3dceb55127631c22b4e599068710d1c073c5fa69196f1921cc9f5c5c319855c653c6f346a997fe16ca13c6c997f2198b31196f905cab78dc768743a3a1d8d5c9058ac9844a8052273385f22a657360abe9976ab6770d3744ddba8c07d9302374ee7b44ef3744ffbf4cf5c4d96c9c2b3054f970685608c27915944cbb878fdd927f96ac48b6ddcc34435a07b946bd75b6cdb21b79669b0355f24ab6560aa7d3893c82f7db25fac1b0ffb9e2f46a20e6bed376445f7755dd405a54731437060080e7472477f346a6de4695205fd4c7a3ff0425a841689a64a63962f51a53ec543b177c59b81ba565db2aba8425d6c29d621b9d63320aaac0ba44ab5ef610151656310835ced79504054d919ec908018848cddde00f63d62eabafd0ecdb65a35620eb27d0e31e5dd3e876e0f0001646b6f83e8f635a0b2bd0c1968c8f62b31c5224725db9ba2cae6e8c090ed4b516575ec59882abb638fa3caf2c48829d2edc19842b97d4a4cb978d1f322dbb7882adb63bf22aaac8f8a6c7f1255f627145577851253bffd28a65adc5e14532b6eefc5148adb2daa2e8b3d165597655fa3eab6cc6c5951a5de5e8ba9edf637a6620a3fe5bdf1b0d4d24f2a5f6ce4b8c7789222c5637ce185c7a8523dc61b6e788c0000c0630c40001ea30004f01869d0788c393f461c70788c0318c063cc21871a8fb1868dc768e3c663bcf11871e0c841001d3aa878d879c763ccf11809f018753c461d1e557cc74b3803e1ef180669f87a8735131c1a61d159e0d14998c55130e92e30ca5f60173f7ef116f829187f070e25ab85c572573f3e3d3c3b3a393837363534332d9998243388419855a8e40c7785450dd5cc0c00000028e31400003014080584c2d178204a439d8e0f14800c7fae54684c1b49b42cc7711042861063000000000000000000c80c6d00c7522080af9225bc55081bad444de53926bbaf896c9734692cbde52adf29c99825e52ff9a8f0c8d11ba235a77af1f2e495527249975119b6e76996c8c314c710069c6a7d41c9913a7521a2612298e9c81c184ec25b3b98e86999150846a43e1b7efd009d93c5734befcc2c61bffe6159ee9e70d49aba17ba64cb79c66441b241cdb77290418a3f840d731aab8fe6e879caa2008fe7944a1ab90dbb80fd89b5df53eb4f1d099ea5938f64e39f372016afef4d293b932297b9be825785bb83d48b66711448dcf4a1af1eafd7442679647db550f4266015e72515888d4fb8d9cdbeba9e9763af683f671ac2be641de938c62d930d59dfd98a45e910f9a3930bf0053d866b893434bca9ccb1bde903360bf3e82e82b824e53d61b2c5b58dfa7231379d67e84716b590e56e7354ca5f8a2fd037cca2c4f3b6a9f35f8adc18a8675322c738868cc04692c787bd453c9f16a87b9b026aadea6a6b23fc200669af31436c1d6c285006b561725271311a859be0ba9c073846144115a74d3b06a78d5a78ac25b072dff49e0eb999f2ff51763141a8b9bd1c8e117bc5ae9ee1aeb195a3ddad48af5970a767bdad827b49e8a19cdeb87b0bf206716f2f65fa63f9a6259f133b30795620c6c1ef729aa80e58528149064271aeb7945d4825ba7af3032095237c9c3951d8fd427cfd62e944b41a1f780ec8cc0fd1ee4752afeef5f2abfc95886e3fff082c3f4b06e485490dd9ef2127a16681e0a015e8c70e767dbb09e99694c305250cccf11ad1659fff79267806837802f8ba86dd03bf553ebcc9c28778f67c0bbd90466082688365fc8e936fa3f48b9c5de486fbf0f2011371cb8e2ee57a54765dae27adc031d9dac670e436baf4895c5d7e7bbc5245a482ddbb09c7685bbb4cd19ea2f78317d1a34f53df033e7cfbc7b68c1a9ecb74a9f189be279d30007a04254ea07234df599c8a0d569d18ca8a6d82a1f1f5aad8bbb38d082cb3fff115640f0b590ab67cf33f7204f62e470eed562470509d9e936cdbab663fe986e95553407bc433217bcb1fab837a1ee61a9288497712abf743c04a02d33fcf00925d3c00a138be9e081be50f30f68b8f3d04566f2b28ef2a46d910bfbbfa86e061b045cc962ed23273c070f7d46285e16a177f4ae3feb0890b1e0cdffff05dca16daba9f5aa936f0cb6f3537c143121b9c7520f98dcba215b34cf3a17772c0c20196bac29644385d294a934a83c94c766c56242faede4c30a270aa6e304fdf4882a94807b2c1cec983d7c5741ba63758b8e82db24063bf1b0b20e09cdde0547b87445109e28ed80cbceb1a2917686ac28ddb8615614170e4140ee90216cba457c026d6b129121d7cfbe789714931edbeea4266ac6235730c3932d3bf468492b71dda0b48563811a90b8920cc08517c760cc0fba91094729e22035a15cb308c40a42765f0faa9f03caf8f91ebc2e7794ab666e85b33b73c97b14e3a59b27e089e3b63634ac251a1c0e414bc57cb63308a8fd48210317b92d286a4a8a624ff89b6ffe5dbe11cfd5dc8d14793ff7b5abc46b76f246f4a952e079f50b7c1b6e913e9e31dd2be57da1d9c1046791d178865269ced199878f6738bad76cd99591ea76ddca7880fd669394a0ec4e9bb637c3028a3743b683dcb033cd288711004e120a6557bf77950d050f6a12613cb69d2c0d3bd064fbc754746f006a09c36aa1de203785470aa0307a2f5bdd06b2d408866b045cae72c96ee24884d6c4cc454919584ba6f38b7997e4d8e488fd9d2e8edb4f6900d39991c629a664a1061fc38c49ca3e308aa599d2328f383fc4ff316394a2f29ebc7379e4984c34fac91ef541fd57f5420b2ff9bd731535b861769e589ae277c28eb2c1bf9a7e9b27c847a29ee38992af10cdc59735a885c7a1b3d9539f22101ffde1a84bf15c20f78e00699e7057454cf0876e9edaf37a59b26456ea2daa718696d3987560bdc00073fdd4a1f32eeb9584123d1fc8bacb6b77a3c220f2ff48bf7be60eefddd8840733467322726302226863971ff351ff9f43937ec4df68c7a73455d8e3c25992d7011651899f32089716c0695796ab35adaa2c1f1e9e1719c8008775788e94772369fb8574e8d6b48e1397b746f3596e5a58b26d75a11056dbd309518ec225f6d50d9d99a403defa49accdb2bc405661c20558dec73b907221172c609807cbf97d0bdf0cc4a909dbc7012a7086b4604646851990678dc36f1d9b08c18d4ceadad9df46d698a4faf384517fe271ba76127b3737e67eba368582028a24024af4cf48c0a2925605329718cd76caa687a820e4ea7bfa614354b21c130826a091722c8a7fa7acc2622ec825be180a893eee4087a2d8d13763fb005c5970f9054794109c12390cfa6dbc3820dd41b21f96b83f927d52436709a1f4b268b0c9fa4e64d140dea0aae94a61ecee2a6fd0af11635dd99300a47a1b21bb5a11b98b2934a68a188f5232f44cc32682c36568b091fab814bb9a43cfee8fb37381ea6a57b21214ecaf3642169262714a4ddd2f0ce6ec6eb523de91cbfd29de64ca4744254ac6d35da28e4dcda0e5c00082c949bc4c6133df55043b29f9007445d373e38788730750f1a801d0b7812c70198ab5459b0e9180f424a15061b9f580ce2e278f8b9c4f04375ca781e2ed3ad2ed0671ac799b593c84934a877e41607aa5ab3be9bb8900ab6642fc19f8e25d29bec635461c5741c138894a59eeb51582c817ec5fa77b0d09ca0108e52b6b2023520ff49a0ccb38d51eeb40df99263622b226c5dfd17f514278e894610c5b4c6093e1382f66cff0faafc3eddec766e9906f9edfb1fccc174ed5536eb3ca6d9043f6746804a7bba80da9e09e2ffa567114967959ba48fa4aa2a58530d3e3ed0531ba114ec3a21f6166bf73acacf579bcbb58a5fb4cad9af87d52fbc857db4367d7a0d4b639277d74bb7e6a5794f02b944fd9dfebe74a0884295166fcf60c892f2cbeac10b3921aa3cce154a6c1a1bd3f108d055c8a6a5c399dedc0d8a3020f74e4009f45941e4a2192e5544aaf0cd25be0b5ecf424693c2057101ff3eafbae31520e4e64772c08ced432adeb47b31ec9b6e3dbe79c21f7478721a907a1a61173034b0065228b1ee7c076524c3daae122399236a947b1d17aa3237b972edf9441404ab0db41276118ff7637f0a0a476eb081563d64aac969c18a14332ff0ab6a55a50bb76cab9a01a81e204d5d1779581a3decd375f92b7b70b9f1bea38e4818e4bd948845603dfb00f553164bb533d2cb587828210bf1b01db26d6c3d6cbb8d0e7e34c7ac1eb68da5d8b50e9ac62e4de0f71a7dee0865d650aa90516792f7be4fbff091b426b765554f3b0bbd6f989ee6b8ae8f734ee2a5dbc0a0f5ab13a988b909f088472306989d4f7c1bc5949c5023ddd8301f46723197cb56c951faaf84d47e79ba2bd025091cdaf91f0dd348bb53b260c4ba743735fa2531b993f76fd808dac89ac4e04ac47745b8df45ace16700db84d3c9900aad093b03d87908fb53b7bf821f58783dd78f7336a128856fe96791e88d252b9a07b9416b61eef70e1b88d0250636ae96a699490a24c58f894e8944a42ceca47d5c39160082c0b37b4bc067070262b283a713d8f9c5ab69192ac6b50932ee589c6ab9d85b6402943067873a54c78f8f9cc2441bfecfa8e4800cd45c3271ade0d84856f5d20dc1a3f703bde9c69abc985f98fbadd3638426e1e9a08f1b8a33573a548174808dbafffe7cfdec2d3dfe2901819fe677f460f7a088fa093e9c9ac6cd001c909512c31e33d083f7a89bd0758cfe089fdf73cd51a20299da29978334706e6708f02f89908685c1565233e339e637810def394acafc86b82803b4fa1400c901479652aed8d1a8bbf9883a323a12a98eda8785298e99b2668a0d80494153ae1c8a720bae2b21332d523780196492159479328d32a2b2d5f6f8b960a1dc843a4f2bf18274c615b02efb1a0cc755e483e32a5329aa49ce30c71f0442f2d8bedb84147b22bc0998e3a7b261adf3d2b14d188e45120263d9533179fa1720438a3314082dc47de4616a1fa22d23658250341e9aa415dbde6a366dd68ae2a957d845eec237ea6e7f6817a08745ea59ff37f891cd70db8d7f6c9303fa1c76eadb0156a7b081b4da1fcfa9fb2f37ed4b863e06573cf26bd50da6bb4dc65995de90a09c70f0d724cd99720268a2f9e821bf210ee33e72d60a0ac272fba79cee3606868404090a18d3cad297d61ad17ab39c6eec3683827c1c7482dc0c1a23a90ff10d4db7f7cfb07f327bf46d9b9f5a153c8bc72321ccba28fe8c03e22d82b54aa51286db43dedd644a04f17ff7e2b50fac586feadcb38277cf2b124ab71476768897fefb4c0fe8ef11d92c8b1a27a748b99676270ebe97eb9f347def992bdbf89156c525e659afa735707595848a06d2a7e85fbe4568e0262dea669c0f83cf1d1f1b01665adcad363f118efd37171e77d721da829e33eeba0872be53284f01b65fe81d4f1bdc10f6f5cffb7712aa755175dc106035db6cdec09a7765515ff0b7a5fb5897214c399292713b41115395f0929972038f98d8db1f74c8e60456fd42a397281f91485140188f8680509e21e498056e0eed92060a3d4c87742f02f7a12850d0fe5fdde2b1054a83621d06894560be84263ae0d71152848430271e8b38da1a37e01a53f115263cf47b2cd0c31dca3d236a8fa9fca98d4c3de930465489ad5eb4078dc808c1aca52026466a3e575c926f2a7733aab98beabb7f80e005179f7b16657e66c9206512bc9152019f877c4cf58a3892831ffe2a31160987396ae2ab491a873d9c57bb860be6a114873dcb2c9de76750d9e3ed1dd97a54ff9847d2715b05ff4b7bec4c24837d8ff430f508a029fd8e1fc9e87d5f43da26fd5b049274e903550c39216510520d1697adcd4591c80f756aaf23913d3b3405a71d85efe0ffc03f05cff73dceed89dcc052b3976f9416af684fb20296ae10d929dd595d39a9b3cf958d292f2b9d1d227b79a9814e31ca8a8f294a166ee708244c590aa55e93c2a0774452ee8ac56b82832bcafaebb75a952cd9b0fca6924bca94312d993ec6a7644c781662242faece1d77d31d613b4bef9655bb72e27775e8f152302f9774ebf63c8f98831a6708e0c887f606820f3d9c494e1bf927ad30d6f23509a72a4c0b0b8b9e555d83eb888f48498f8cb19fbf8f8ba1a88f68c6903e1f0d437ac40b8afcf97f24e2238c4884cf6f20111f413d227c6e8ec037db604a8da7ad99e966ccd284be68195c62fabd95c88d28a79d253da3220b2f57dae8b494702ee2e505d2e6dcb1f36c084c480f0ef6b265728ccc25eb8e3b1600a43f3d012438dabb040a1aa396c890686dab3dbdf41ecdf817b6fa9d2f60d4ec24bd1e3d43ed8ab5035b4a2bec29faf009d348ac7c886c35788cd4ee6fe66155e28d292d72755778ee4c82f7b2bdde0d2586bad93349923eb3eb41fc3ba0837d320d8ad02ffa04aad642e784a83a0b1123b07258b5e1d0bab4564a621b3fd6023911d96587d48a11406e30b46b880b870957c5a5090220e234cb3cbf49f810212e126440d33f32bef7231bc7569571bc5be42236931130bf4abfe2fd339ced4577d989e3326e613cc6d632e4304742243650ab7ef5fc291db2df066ba5d5ed645298761c22adce8f5b9e583c81cf3e3b1f4c2c40b410e881025ee29db826693f52aee9b172b8e42fd15c348cd595477d5398d4d138b1d5b850fe24f6fcc33b323815e7ebedb7832a4359907a40559b25de92c4bb1bf2fd99ed4c8c7f5bd46e2397b099b9f0e915d470093f9e59a898f84d604265c9a353e7948c557de07d0291ad0579d23af332ee4d2b761975805b239d6dd02d0441ca17187e2dcd9fc789d6fb87fb60c38a99abcf9b02e8fe3164b74edbf7e56a1f1cbe2f67ef79c52e89231ac428738a59fce9884ec1206d70708ec5c6a7a2161b347c455e66fe741a529d757ff604c322eab342043614e572f67b17440f9dfd5a9ae8dff1a2439e8cba3a5e960467eedc4adc6aff9971492f15376b72019d5dabb65a3c06d69793668e4259869bec024cb650c1961c2393ff8a25b2467d46e9d584a8d9477a3e380f5544cd113145dab4b1df366eb29beda3df06e2f466e1faf90dd64656b2aced311409fb5bb74fd3a803028a02a9e0056d179b9a01c33c12d848631a2e0dba97d731c3673ab836dd0e31aeda607fd27fbcdc63d2d61e8af2228d15738e79a56df646ed13e7c422c2c856746b0462d39d6426f2e3c79c7b71a4c6a0b034dbb2273f26e641e5e4b4c4a06d4c03bb4f47135ea70f55024fd746ba9db4b040c8e13dc14684f2ecfce98d085134034ed021b0bbc85baf5f1d93c6c0d07a038a686142b666ec7626de38733137c96d11c7ac67207d6cef5989c476f28c380829b67d2d5540da8d77f5b67ef9ec048a17ccd11f59b09f1529b0df87656dbb92a0926a22b337f38fcbf9a7c1f8dc47833e49dc36620d76a540aa97d3f73b4f7fbb5fc6c61b278c6b52dcd7684c60af4eaa9b8812956e338a443a8a8823112e0e547cdf578c44a163f1109a380e75f98553606906f50a78353210e354de44e80f30eaaf5066fb008fd192fcb207dd9825f6d911e00464387ecab628928321c331d2ffb869780f121d13f521da9f580f92fe693420ee9e560b79bf09dd907498d40d61ef74176941f4de6a2dbd2e19d52d9bb0bca8de333bbe2989fe97a7c0d4d7172620333b5898aa28e193ee71108a4b1d41063a91ac9c4ee2e63670f52affaeb653d03499264b9bdf6750dfa16dfeb8f2e71700ba0215e35f8822ef6cfd5d438f30c0fbe575433f380678a3af1d1d74d40890b34684c70d093f28a8f86d2326e0a2edae3be2cc3ca30ac6f63c21a9ed176424c1d4e586988c2879401987560c6281ab3b99b4c7d590987d380768017bc521eacedb10dacc859630ddb4fa19c7d366993a8269b3c8daaef163104a5b37ffe24a9ab81a3eb129b1c6963156b1dfaed80cd9efd4a75d145deba74f1ed3c4c0a72e67fd131187c40f859b289439e99532ebf62b9a5305005e15332d940b2bb5fa5e4e842eca12359653dc100d371b12386577d5d80c4ccdab32029db05c2e595938580cd07858d795d702da8a4b0224e158e7ac2a2c19b2715e56ca240b298c047fa56763529a20d92be0227dc631aabc96167a477acbb3a66a0e7e5119d26731e07d33130dfbed79df9de271157d2c2bbe7278b59c6a6c7087c7ee568ba638e06b0657b43af8d230515c207a6eb580d170faea7c1e28db04323bd5eef73683811ccdae0e41c818eec7a008b9c38abc83166e66b773c236e0aaf440323d21b0cf0360e841878c3d4a011a96b6a1a7ec85502969d29537e014e158cc580deb63c845a58a71ec250a548baf8bac90a6d567b79e1264dc0283b301603025c47fa389702de0f8ac476e4f4429e8e6561e431b191d1a140b419cb976b83c283dc1ca8de47f91b068d57d5a882d25d7ae229585d27f33df8a693db1645428fc3bc6b33288bc65e1a9b6438e85b4ca18e91f43472dceca670205da2d282ce990369a9664798bfc07667fa7256fcade6381dd287e1e367ce1eb9ae26b3fd24b78d6c8661a772180fff4741a768ca563ec4b59a4afcdbd26de44b7dde844522b6c3a04b940616506749aab8521e48a944f58ae6ed13a2d3150383ee8fbd1c6ff6a246c743a16917d6a19bc2a91a0081152f73a5d1ba8b00fd69f802f005a46a9c94fb5eb8b98d24e0f5d40bee91f84780c1785e5a41bfe0ed4fb9cdfdd783a66413b00426a72302904a78fc8bac5a03c323f3a5bc00b3d238ada068fcce35330b5ab082b8ba695a3d90fde72c62b3d7d7ad032485eb9078a86a8c0be521dd8081bf4f0b75eb501d9d7e37e6970cc5e11b8c1e5d74f4d86f74e66d9dd0c31024cd9a7ea7c6dfcdc5139b660c8564aefa8208d8076a3414a36172b0b164f9b1c994464100fe0ceda92f9b78087278127209f7e550ba649b16bb0d2e2172646786fa5dfb5fe73222f8c2a2eec4e39baaeeff2853c2b526ae32c6a7abe5f99c171e4989a67634ae18b34f8318d36a95325d42504d3bb126c5861c5c3e088d8a3c0e8987122c3f8c0faa9aeff5035740685bf752f105db520719119afc1857ab1ac4a0e6c89634457eeebd3ecc2fcf66558b039de769ace9b74e1484881e9510517d1454410374f9762109845cf2721eee2e9820f7776ed740b95685523da2b084d6d4453321bb2630ca4d4860c3df03d884c81f85e5c7aabcd4b575f9f2f6b50f9702427ac13f17cf4b4293f523cb2f08584331097ec0bee76f39cdda27b226bc9c34ae77484d7e8ca4bde91f38950e49e6070766b797e2ee49f89028c0c5be4699a35018d588d55b5cb35cdc343386123c9063f9c112018a8e8463469860159fd2b6d0fe1122f0ed41fe5612706dd5b39b84ac7c983deb90582ed8afc7a5a18f6dcc4ecf7747e5680c72c00c6bb9164acc7082132a6bd1918307de830662f8496398b96ceb845015279420b8823b96e034253bbbacb643eb9f805e6b9767ac334e65b6d62fe235573054ea789cdd7ac17c0929c3e3211f7b8960cd2586b0244bf4284227132b2d22a3614c19b1c88f8dbeb86c8fb1142cc9d5d41f4a63b20e0aeb71f6667990f75d3ab07b8eb8e87ddd96d87aa5634a743305570e972a48d0687faa7d4baa1bbc53009cb2604e3651c79d6b3f1239dc405bf59efd17ad12b8c6ad15223f76f07a5006f75f8f8290cf116dba10e75696b9211ae35a729c4d04dd225cf0351dcb0017d9ceb05c57506c09e02b10491dd08e8d41e9f667c1f9cd1caeecbbd8a16a6ac6dba5e0aec98a6e12241826c329afde2e6f66a80f4881229778650ba79ad395fd753ccd51e12bffec18da714c1b56b99c607c4964f10048db39a956e43615205a3e3306bdb9915fcad154caba25b663763bfa7236d21e6e48656da3f83e20ee20eefd006e881fb4e2bb19388507c1d78e3c55228605ac53d95cf1d67e060cdc30ed2da5f073f1d2fda2b58fac4202d3b7a4bd12e0ed2a65ffe8c3f422a7aba913996af08dcc0299ca8a924e08640e3b4ddb3c1be81ae68938cc84bc2614767f48a96fc1b2ea4487cab0a8f0f8ca7d885abb15c61bb9be8b7d043b33774ddfc69e934ba5fc44eeb884e1704c2566f1289f217f6e123df7d82089c09400e70033fa43ac4042300b97dd3eb9080223671ed5da39b87509e38498108be03a3721cf952b2b96e2f0bf0d7be01e00e36ec4a2524146cabeeef53f7a6f40c90af14c5c870c92fffaa394705bc9654a59b86afcc8a7165459cf22ee0b90a0432ada220f21f3af89eed2f86e8503b626a17f15ac0e72bdd3d6cab40fe72520f8da3414ecb3d88a80f3491b22841f496d8b85d9e54c1d10609cf36d658a3c54611f3ccca7fd4e2475c68fc5891bea7b1aae814ceedd42124088b9bee0da7d3123618cdd8abcf407a7d876061fc722d8f57ec8b6542d69fba8612d0d88ac567dd40d390ed507e66fac0834ca9c64cbe4c1c678c2788362b61f120ab70b2965946a0e25b37b50b9b130d138392d327f7e14c953e19993ec1069890aaaa2d366cdc42bf89a8a0f2282ae3e86722409da81f64da2d122e3896a4d0a241c81040362746bf445f45c3803516e99740f6ff0d2bff66045286552ce2fe751c51d3b1242130ac1cd208d333b0b71ce7d7c6ff79708e4d723a7dfde5010531315ec3b44dd82a63ac9f77de9fb133fdff112c91f8f8dd024e6b4c2593a331352e0cc93b40d9f489824c2c9b495efcc12e974d029cdb0f14e8ce5816d9211bfb5f2b7cb3259579c7b3df512bd0535f1d4b85f03db8f4186361bc124c2e3bc18828c98266eb4e021953f004c7d8c8f3e72ad8fa7510c849a61900d9bfb4578bb171497ba08d7cce85848ef5fdb295287463bada0526a659c0434343fad5548e30167c81c98a708ef0a71af85787469eb3178b78c4ba827a1341d18c95c2b1673be5b2bb79d8ec5262d033ddea16ac05a75c8d71c89957a82754b6193128170265d8547726481a7919b35ef9768a30f918a8d884238d3a07313cce46b33cf326ff0ceac23cb41a6ee961f7b241a8f00a7e0aac337c22bc4d13ca5061ef86aafa088ddac579bd38eb480663a7477dc83216595ffb643ff063a2bc984bf59e8d91923502ae39fb7df1f4c9857a2e0586d6915080f96a18d347d1fa15ef79cdec727ad7e3ac5790c259c9936aad76262be021e950a6da9f9444e88c859343d7b758b1a064f2763166faa12182e31a691fdfe1ad824b1ca05bba03e477295c1ff5f70aec6fc22a5491654dd48ee5f5f85174de4b3effad8db62bcc50a349ed5d3946c37f6fd96b1ce680242c5adbe757cf9a5bd729cdccc413704baa95372cefb5732a73d5b4c16bf20743846bc7a67b2bd30e1c7a234848d887b525e08ee687954e9a9ef514c5b11e91dfc428a157c0216b56937224f39500b00c4af489a64be2ee5f30e25018ddd1745ac50a42f2ce2ef6b548935f580bc8763ef7296043cb032bf69a791447545bc5292421675f15aebf7766308f01d1258e3dcbf0bac2889cecea2092b22f9a4a6405135c2df287450fa9b6d686f964e47cd9919c486e7cd2f63e0b1e5e59957ef140151069d4970ef6d553c9130998dc14e40264be79a49339211e675cdd4af3b4aeea98a4bb9bd8f3b82fd780948e0e629d46df3b275eb051eb1b90eff9568c71835a2b5282ae82f455bf769c6cdee6eb96fd578d860f34bb9b8529d932d157af2a3c358c68eadb2ea4ac2a9a376cd1d4eee4a6afd14dc4b6cf196ef4dc4de3d0edd24068c54ecf299c91279855b3316ce17eafddb44e71c20cfa597b6ccca19d555e5bf923348ed82e8ad2d685198ff90cdde8e5905a1f00aff5c938b0d9b3e2c1d2e2a327b241b4e43254ddd13886e30c0c123207145ed86942a8cbeb9db8f03a83643ae471f47d7bc33a1107942368e6606682798cb012515f312bfab1baf1fad84cfd9e2e336e6e1556b12eb803656413281c515301fd78818e2059949488637349a037bc86c0f4af2f1f4d0a4777fc0b7e0abbb6d724ace292992bd5366d8ceb458cfaf1431e0dc20238ff0e89d6796ec2a68d581205340516e117524c517b835ee83766e44ab81bb17bce48691faf52d3c6fd033d6997ed988b6e8b776b3bc002ceb33162444eb5041b149f0ba3f4f88078e2d6051bd780cbacfc2c33ed57d4c904bee128aacf5ca049009433142a5d62a7b2169b3510ace6d3d30b6fe658b9bbe4f666557aaf189a04170cd0e6ac510a6df54e7c2f1f6c2af5d8451fbaf7750dfcf035e3b3442364a82580234589e011940bfe190809710e8d144171f5d981f384064516d6756a07e1718a6dea8acbd3338ccfc887ba56d6fa419773c3783251eee9106af40cb72c107928a28159aaff4371cea784798c7a92c3872728957fc4a1373d4357f8993b3c859a213d0f2376b9e8e27eafd3c4276f28f6292eb02d41ba2175d93734a013885bb4337a1d744f19c0cea856b0e634db93bc807209ddb513314a375caac36ffc7fca43c7efcbd59e4fb5327a6283b72b04f12a3df57e7f2041462f7ac1b3d33a46ed945c3678b2f533d0d7d17c603112c44af37433682725ef593411039065e00a86ae21f32748944c7b182da5f7ef562fd88439183d0067c9f8bbdf8dfb88f5769b0f26ff821eb99466422f930199f0b9715ca9e20d77b168250ee9d5a2abbbf5ee55325ceb57e34ef10a1dc3bad0df80f15e85fa663e8cfbc505a6f0aba03643f9b05ed7f8dae576e9dee1bde58224df7365f17870f72c7002dd502890aef07d557b7d2e3c8bd1a38da116e26a4f6dfd47f68b4bed6ee8b67b5dafbdf0b20df63bf4a76a26041e3ab2631e71ea88b59af870eb15d11f6a616bad54191de4144682d861bb61ec09f3a0ffd86814e53705caf7342ccb5d10db02e5515f8ab9b746ff9b401c21cf065e7bf596ed46ac6abafc2ed20c07f1e8dd5ab2d0b578ccb6b7d29882f5945948b0afc8b22728ad2d915ef3edd546d97f3d9dcc5070f6558e74e3048888a1534650fbc80f98b45794ebea5696a75db2d9a9d741dd5e6b367186cdb6f46de59fbda6c212c5bdf66baa3beb1cfa772166d3dd9fc9bf63cbca3c97fc146bed3e6b725e547192a4479a6047e73259198f73c0bfb9eeb77d84a16953ea50d3d720e9d076cb8d249359fd00c4196fdf9f5304836c4f3058b3b7c01371154a36a1e52804d695e8061447aab5ade5e30912f49f87b998d19062dbcf41d11bd3f7f355498185c72f57492a614dd63838f48a5f2a15f80bcf5099f0e08bd0c0a2a4cf7bd27a114e54e02b0d8a782c9805519c8aea1549d5b40dbfb1674d0b030f6cd397d963d5b099ef8d88d4ee8f4de6eed1ee02a3d5443ee0b1ef32d350fb45a2a0216fccfefdafaf9b4489ef72ff796a8cbff027d3acd7c5a125d4d01378a41df3f6c57aa47f9ffdb1fca78b0d953fcd15eee81310889e9b5ebe13c2c46bd99fd8cc017ada266f28bbda05c068f6b832c5b0b4c6340e955bdfda9ea27e02211b59872331a93b518503e2d8414c1f510a7aed8e58f1e4bd64ece33e8003882e09fc7c9f5bfccda79bc718fe802bf7f57958202bd4fd27f8f992bcd7b9bfb42b22ffcde9e0a20d8e6dd5584874b0bb8a00741e566e2108d9198612f7bc2edac5ec4af6efb7cd045f6b5e4cff79b5bfc6134a6e6addfd0c20c7a14520b524e63cb868b5cdf7956cecd2790121329e3b6882ab448616b4fca36a3ca1f79ae8bb9f7a6260366793f8194633f5f436abd0975ae7a0c771533b3aabb32e4f77492848a23d3303eef596762b65a29e284ff4fab0200f06a34f133944c5510753df386c5c833ead6b8103394d58c3036a685808bad22c82680bac8e3d6c674738fc4e22915d1ea0441a7f4a0603e7a7275963132c8a08fa6f5a34147509ee94afdec10fe2ad508b483c110e345079621f46ea85f7b61703eda5c75094e3147d5afba1b4b64f05464ec5895fe38e473bb024702f6b941f464e8eb589a9c0e0a16f8158ce6a4dc85a016f4b00ee52cb5f15a31d1a49c3daf04be7181116edbea18bfbda2a406f2fc72a384a900e0ac5751795621bac2eab817ffa2e6599d58f8009f2955de63674005bf94776bdb528ef3814eb84ce094dc2820c9ae83b10e5e9099fc66be08557fb1796f3500e94cbf3c4e515067cda9d3dd713250f54a0160a401a56b0c5caa6831e8f897e045b4e106d45eeef6a6f4fea9f561de1d0b5fe4923173d6dcb6a676f07b439b5c97fb379b230d01619123b9044e6936205d39b803ec2b55f4017fbc3fb68b052e31a2b051416b256a20808443b5b3971cfe7ad8e15998e093a12d3b1a09483964ac9d2ea39f1ed0734993bf34e739bc8dd4e3959ff7576b6c3d8601327ff3d0da013eaf52135608577b81b6126d81416b19fe161d984f6c249e5c303193edba3540b52029279708bc05b4c490ca362a5350d625348a17e62125305445afcef194480cbaa831653eda7293d8ee827f585444dc209c40be6d64e049ac28d7a7f4815e8945ae84c25ec14daba002241251b173da3fd39426564eaa7a350eb713ab841da781d5ef9b6fbaab9888de3a847f2f79ab56d83c2585bfa33b2bcdf12766b46b84789d48a413fe218786e5c4515c0e460764404e3e141c8f961d4a6a1c2359195b30d8b99d3983671453cf5d14d44550a8841e04478ae753fb2a3f21d03357618f7a053a80259ed53ae9930726d741606db63715fa4633c6b0507c773e16af8d243a336c377aab1d9adb3abb65122760b13a7c8b63bb212f03ccdcf0d4b528851641ad4afd9da0be54617970842b9cf02b0c242876bc508a9a210682f1d6130499b75a5f8f8573874bc28d311f9baf85a2c14c6e6733121c8ee1d531a4902326fba1ad1d4e19e191897507d867523627235fe5a7bccaf82aa5c5eb8126ab30d731da2f1cb362a16acfb2bbb03aa9167b74a1454dd779cc83c7a1f71264b75a3579daf011d25c50732ac7c358c5d291fc3a52e6cf36825e01d8dfdb4ae02899a32c78c04111b8544b851713f43161bb7040f356d56aa22451d530a5c444818bd6c5f18cb902456b6ba183e74670337807cd753258d6cd74f71c04a9a031187932dfc0ce9ba2ad80299e396ce90e64a0669b6ffd1fd41e200228f16458dc0c328c6061d49d29641fe4a29226dcdfb2dc19547bfaccd0472b8695ab526104e34bafa846ed182f227bc6bde74d0f46a2cadd77f435cdd5e60b706b342e64153fefe7c70a35dc77f982e1dd34115ea24353041f3d389bcc1f34d795c4aebca3028a3e88c401732a1fb454f126807cd15ccca941e9c85ce33adb6610f802b6d6075343e325c2547b670d9b57a3a4fa873d6b53d8b587c86cc69efb5ea30132b03b7c08349e0d1f5913a7e4c37944690e9739a66adb74dcdac779301b6c9185e9a502167a4c66d33482f8f10901ca7580dffbee4421218c84d9674581a82b28e9578652a37602869dda87d931a0d907a49b88100c3975969270dccee915103f7421367acaf1852fd0e30c9b4472ca4797951819a0aed0cbc3b9d37ad0b26f73f0ef057498176d55c0c1dbe8074215db4886d84d8738d28edc52a7200ad7b91d3fa241f526541a610acd189f87453a4996602f41b921bfe0490bea02f9680412401053c52e0cf3ff96f96915aaee460651d710567a02933db718972a79323ecfa92cc6d8d361a8d806f81931ad8b16092675bf0e62f4113c6c7c23f4c03751c24ecf26114139383e8268168ab1e58cc4fe1e91040e9ee88b9851cd757e1a5895ef8c465e94ebfb934e7681448ea5fac5cf503e410b709deb98c77c6f2aa0c134cb41cdb261c21cdae430d90315c01cc64120caa4cc04146c9c4cc599858c59848fbd3400e28e46cfaaf3c92be7e24ee852c4437fe63332e00c39d60078e72e42b68c4e38aee20a431d4a4548661bdf5a856abb058efaf56dcc43ad094f3552cfde6e6eac98f981314f60beab63dd3413d213ed323eba884485e9ec00d8e00f29996e91a2ca2f93cca0cb31a3c20ce34a2741a455616b75c3d3da10d0865a77f663f0885fafb752abc6a1411ec39ad9c775cf2c5edfcc3235f8a01710ae28d68fd4beb4edf992395e5882180fb62559416f43c8f807ec8715ba74faa7f041607f828c41658fa4fb7501ac580f81f1c5c70e967162ac39959f2e9bd0697f56d626f4359dd425b969429467a0fc075a7d2c24754111625e922dd18f8686b3c290ddfbf7113b025deae432da7efd8f7420ef79ff80115dfb903bd594188afb4b38a5a60858bc7e9ae9873cc8751038f211b9640095147a37b1cacbf4e69eb4155147003e1ef79e37e752e7f80b737fcae0e4dd1ec178fd64aad8b4ea2026708fff27f00df1cc6c8afcc320c2cd503d0157e7359fa3732a857d2927309c6b2c7d1e4b1c1f4afc10d9f09b3765a57f354ef4fb21334f0f3462596312862a0189029ba6cca706010ab5e08f18c5c7016e00535a603bac458eb1df20b301aa496f7ad1c7d61839c818c58201633ac51d7c9df2496b4021802cf992443bd654025413e55538979ca0a9827cd3a6510f3205d202c69ce4bb1ec73738f094b2d9d47f0607ad13e6173ddc2ad8eeac58cd5d132758fb2c77159453ec64280b90ef0090895b6a9548313e00e73619230b31b3ce0c12c55a3a1cfb9441c8b215473d39aefa28c662fe82651d139d27d31974a9c4fb98036113dff67cbd4913cf773bf34a56ece4c1a0e1bf28bf89580a0fd6a7a768b067a661423be7b5e3531754c27cbb107543d8f27b17b7d100bd209c2861280f37276c348926fbbea054cf7c7c366661c4ebe3f5d241fcdb3994f2dee62d0a159c70a1a1dc008ebd41ba1083ec2de8e737734b2bfde6887f6705885bd3a4001acbfe12ab098ac432044aab13e1432cd4bf32bb64aa58c3c0309b01be7764d944538504e290b6d444a31785380ad48cbb1ff9bd0a48dcc51110ec07f67617c6c32230079e973fbdefa74867357fa5396f9b66ca6bdf801e56e29354dae12c8cc6677a490d38a3bf8a97fead9a204847b7cfff6d6d757ab8dfe3b1cfacf780b5efffc1bef060522f15f5e5994b6cdf40b2a6a83d7786aeb0656d0a654cc9804e8a1c5d435a003966ced5000194e01b40b0663f64c125c7d1ec8fc95e87c8c793b2e19b078b7d51aee3ee1fda579e88ad61302ce950404968ce9ec78f6c86dbe180c01b1a999d621077755c51df1c78a71e09323af7139aa6307c7698847d73be0d8215a80d2f25d46dbd5586b7176c45c4af613ee249229f625e3e02a65aaf024f4450925b1abf9c38c4888209cef6360b5a8494ab60d84593af397d11ce9d2b7d9e6cc81e9f202d9a46f0555713b5fa5a0b7f495d0994ef91d270f86069ab0a05ba11aa9d9f10b66a58f8b2730a11bb0f0378133128127a688c0c5e821b0856c29846fbce969890246557ff20310680e2d83ed02c60ae36c887004520a7c4342e4ab8206e6bc6cb05fe9e97bea5f457831129aa2a38bf0bc12878e18e3711e414d086ce314979850d8f8f17dff9da74dca0cc4be8d1e48f0803372328b16bf03d4cf9b3b9fd58ad6ad657ba7a86ed59cade8c2e5a26a8a6903da82139dea0c95b7d83a77cd121281021ad37f32ecc74069a2bcf670f213d679a73bfbc46251ed7bae70fd18c65525e45447fc20539eb83087f6141243843add558eb080b509643b21d1e986acd5c740dc7f346cabee96b9cda5fef9c51368b1302c1382544a879689da9c5ef4b2dfcd6aad1f1efe9e1f0b202534112baf81e66314914041eec9031959cdf1cb5dec3bd69ab71de48177c3889b1d6c0b5598c14902c90daac004f8b6dd96f8a4b5b8bbfa36c124abbf48755a857a09d1284eb1702b90b95b77dfe651aba593077b2a37c50b7409624d11540179f744a1294ec8764d5df51181346b7cfbe15b161490b387f852bf2e6e5d84225bf1fe9815f5f32d512776d392cf988fdb662c38ee7a0da119ef44e3ed5b21c7247fa0abae9f296fe5132f51cb56768653f849a52ea9b33c5c85603be5fc42c0cf536dfe2bcfc5d8ae2ec6d306c81f5a3d9732ed6b693102cffe57e6726562626fb23cd23ec16fe34ffa97af7b28e0b51ba7717c855e40ec5d0e9ca9add810e6154ab4b56663e5a940e809cd2da4ad49a77b99854b9e7514c36cc62223a20b7574d5629e820454f1ac4b68e0251bab893d8af038451e3226c0b9ec82179158ff7e60115bacca74575622b4cbb75fb2b5f1b0330ad5201019182ecf91128f405224bd00c3b45faf73b706f173811a74af9c58a49b7a2be24bd63da41f4eef288a43b0323d8f2f4dec815951e9724af53585c793bc6c2d3c79c7c6fad2309f5d06073632dec2053b1a6d683b63cdc833c664ea4f87f3d80f4f8a07124ae5d3806350a9e54561e6a5676ba2e74ddb34446b931eff8c44279cd2ae47f03e4005d49a3e40f6cb893b9d1a5c972a074d84af322862400871ca57cc054444179d9d05d006654fd029a6fa557ef4311386053c79abc5509749b6bf56c1d36b7c56dd99b74188be239908a647cf5e40bce1732bff0d44d92bd34600a756a050f9cdc11de36ce5c179c2b4b7c91850b019912bf7a1c7af46aa03c89b44365003c680d5baf0e98b33603578eb910ac83a6b499216787ce221a20b1f389fb050c36c7716fa5531172b6276e1c5b7b238b9b5b1b79121a8a3f7dd2b132a6d10c1674ae2f33a9206f564bda0638fbdf7dc0c12278b122e2f4a2abb0003ce028099600c4f935fc8e0520642ae8c9d5bc5461eaff5b0812edec5f8e16b68d708c01926eb53b0391fee3f197d2baa8c95408185060550aa72ccaa2f07da3f66a5982f02e2ba259edfd82b0f1ac37c7689b5e20e1ab6f219fee80d9f8c608487e6de3b68b40844411d34d48e6c90071b0d5c80a20165a26eaa0df1b40456103c798055c42ed705598a73ce72b16d50b8a74d421aeb4cf4eb513e270c4ce49dc426f974f50baaf74fe2776d646a7646b9a9a092d53c6684b601fe9e23d76755b163755291050ef6d9357bbd64df9c011ef2efa0bc1eb675742a6ad278490d0952f6e51e9d59478640d2e5420d283f8718663f5eb3765d26ad729ac186c52b10885883df0c05fa1e1f2d9885285a0f31c879d4830343e8638932c61d9a9b1e755836bf55b0270935daca5384f9f0664be32c333178170ae09393801648d731a14ae01262368efdc9db5a38c52efc358aa263488aba74f46b3058c2b8c63825dc04fa6e9ddfc513b98d3b44b7a5125cbcdd89e9a493e0d5d7cfe6cf208147f4c1a567de44dafcc374582b33b63ad591f93e1da184491dd34323131b0287c0591052b96f2724f786b247d0f2e84ef06b9eb3ec84ddbf007ff2a4050778bae8042822c2cca4f6960185d5f17706dc0dd0cf4392b829edf5f58066b06754c080acbf940dc245c180c3a24fe050458122cb86b0443a5c3cfd23d09d3fa8fb20921ca39224cee76c30761695472e486197c57c0d5f015dea8a2b6ef28a4ab2634dfad931cf542f3e714562734c61530be4755b5ee94a3bef2fea740127a12735652dad01429a27f43ab181f5ba3b2de00aaaf2175cdd253e1506cd94796a1ed9ddd91f77f6208d6d289d201b550fafc784e4db20af02b1ad7b9ab1d5211ef1de21c8dabbe8a07354e5df88ffb397dc1a33a35e67ce364b73788da56c9257f072c24faf20f7eec7274441ab255746108234cf4c2046cbb1238be01fd8f7091142ebc747dfde7e006dc5791d9b96d260daa023749c7203d97ec3618eb267415b80eae631ab8bb34bc285977bce8d2ca8754c9797ab24961d2b514337d8d53f2c0ad9c7fc57301bfaa06a77e13a28472bb10d719d3f4be902e86537fa60c277c4816d8a09d9c940863a5df4df47bd6aea08882a81d6ff8c7972bc43a191f3b37634453b9cbddb9b10b32b557104f042d0804f9402e364bff0e8fdc54b7c2e41d6bb2cf5110cb2088b71f8ff7f913da2a94cf452ab87e0af09741fdec670e552de82c514018ed6730440bdb51837c95c386a87783c34b8e8e45c7153e6dcc09d47d6b31f24455e8d06f8859e9648c60d682d153787467cfeebbbb0ef65c3131cdc4d948ffa2540a523fd5809a934f202849f67eae4258b862491543dc186d92523f57fcc7172fac45d13ea4fef75021c2a5474ed29dda5e4343d0b244d2d1a76d6987a591409b4e2368b27ecf408c2c75bd451571dbbfb2e06822b0da97fede35a07c4c9c3e0907f32d9bb370ca68b0c9a3bcc79ded755d83b0c1275ff014ce3229f88acc320abdf2685f479fad2e75ad36793f5f4191d66d69238fd2256de8c6f93be8ae220a2b88c5dccbf095e7ea1ca47a4b879c2d34150ea20dd17d87e5c78a03905343249ef57246c888c477c04a4bbcd7d3d779cd41c1777f223fda0720cb3398cfd10b83bb6e1c30822b2d68500c18e8ac48becdeaddb3b2dbaa21b787d4601dd3f754883340000e444fc21382a44b3f124230d5b812ac28347eef707f711804ec676f360416a36058cb5c96ebb1991acb4e1da8aa2999a19bc63296bf2744794ddbce3d8bffd1983229c1d9c24ae5bc290114ff3be4cdbd03aa3d29fd869cc713eb03cd1b4453374940f637536a49999447b55e9e11d8fdaffd283a0d4d078667ae816588470e9338b4cebfe7824e191e7f0df80ca7f13df5b63dd5ef96f411b3904e3a2e743cc51e9b1b9b0fd9b5d9ec121e7a93ac2bfc63b140c32bbb89bec79e3965b1362006e24c56fef19322967662eb5b9f87dcba0cdbe14c6bf64f1f6b83fbc2fa739e35218e0993e9aeb80bf511c9dcdabb62a27924ce5cc706c3eac16be38744a46a953338b2f0359c8ac9b4d6ca5a0d3037b5e1d281477fa0ab533840650ee9cff12cfef0bd0d2c8485539d4a55ac31a942038182e9d77f7f711f9b792ec03cf7d1ed63cd8e78712495279b5750773e7b3f8aac20d0097f5dda53f18e5e616b0d4930051fb2729a1b046bc6c0a732f8d6dd85723c0d8440bca9253a3c2940f75e4e1e32ca9d062631c83d3deff680ad766bef9ffb2e7193d7544691b67e6a071d635a2267673a62a673a11d66ac192836e84ea0aa2b7632750b2328504bd92451555ec73f39b6b766238336df17e97db764f32d3d2f215cd3ff079e677488012eb643b4ffc9c832300444393103bb974d946a9ba930df48beb29dad8578be8880617f3f00250be0d631490aa5684d150373159485c5c5f963fd5ccb57bca3794755ccc65c6173085b4ebc4fec276453212968c3fc8bb400ec6af6048bb882048af06937acc8ee07ff0aeaccb76471d70d11619bfe393f4b71daea63d38986245b985d772c64fb8f906ac913ba50f9c8d1d0387651cdcc2538fd9ec16f5b0949cefa4b4f0a4dd4021b0426453596345ee61711efc93ebceb4b3b67d47ae1bedab861563b448b4c6300e5ce234ccbbfd570e18156779e71d605bd3fb0b6840142c7e51064b70385d6dd7204bf15e6775db993807615e56aa99f471a10fe5e92ad5a4549fa1461819933d8baadc48e56ade8bf7e4a4ea6d71fec0ba5e1012043e94407feca5ced1961e3ef763e7e403a4587c982b1033698f2b6bafb940211c72b8d65754d38f13121e428fe29370f72236086477ad78e1384b9eca7142c1a8daff3a6e2596d4206720da8e9b501f71dfd938b1ffd40efd2a9751cd1ea10bd0a0fb0945ce57648d68e738f72dce8a2b2d01fd1aeefb9652c11b521b574da961975418b6b69cb9494db043ddab31555ce0897821e600e717765c33522bfccca9903c19efefc3a080cca3a0f4ff2f0c5cb0f4140f655c1774c23ddbfe3d7f25e3fbea50adbc77de831e463db7b96cc65726be8344aabcab0e8a91ff8f10cce342f181648abe15ae2fee8e449d9ebcde585c1e54178f3073f881b5c847371d2b55308b039e40711c4190c1336380ce6d8710c8b06b2ed11dece1ca0fb76030b6499d8e45fc8fa7bbc13a4f71216b76ef050422e9fa901767c7bc97800312fd1d82dad5886056c136354439550de0d36024086b3dc8528a332e56618f28d0e6889a84dc31d4ceb5b5c1baee71040c792d86f58a608e22a5fc79233351252cf327def88d16a11de529881a9b5775b6c061f49247af68cc8fdb5eb1b5340a852efca79e39bc30bba78add0df49e488f0fea3d51af0feb3d91de1fe83db11e1fd07302bd3ed473623d3fa817fe8d70015cab039a7ada805820cec24a074dbd1637e8db2b83ba36d027488e20d5e308beae2660f82c9090be1dadefd38f240f9e9db1f153fcdf5349c70528244f940012e4c29bd2a3679ba79217cfb4d9b2ef08848899434812b2f7de446e29934c4906a108080890073cd880244aeca22a8c47e4fcf3c492294fdc7eb7b7eb5e00a5f3ce6be71b2891ddeeaeab81a4c90f28a872650b196c2c4de1850c134a284dd143b295420c26576e574a29a54b799530e18005e72584f51bb158fe21458e1ad6bfa5611bc0a3bfff037f0a70c321e9012155c4346e370c8e22503bb84290a8a63f6c4984d0eae377108556e091500563ff84066030362c24ba9c12cb1d884072859c32368c4f22481985b03c0f685853092588d030b9a161b9f24b2959729d25d11d893a04db7523c99c84b3d1c6105a983ad4dac2f4f171e2ee6339830e8e48971d8719743658ede3ed4868812f832e64e84eb06b580dcfefaf7dfdb476bfba5bb5af5756f48ad2f768217e75fcfe694fbf2bab9fdf15ef1f7f75df60bf8ce2e4371f71bd839ddf244c50489caa46cd3170213b33b315363e162a2845c145183264c02813a7560003374c90e012c6cd1157e4eb151d943dbdc5f06b893b51b384f31a803368c0e276bfa28cd1c4ad8086d96d37633e3f05c32097bafefa9c60e7d2df364cd24927c882df22b35d10b526405148a8ce48926aa2399de0494dc2c2b5ae6cb5c2afc5cdcd913d764a9fd648bfd86f6904f12f8a40f225047f10295d826101ae8c6d6085200ddbd2b06194aaa10c185a5cf927e8703054a266922e5f1f93a6e9fadc38c6055f5c0358246090783952759fd25c9e5d8ec27acf8a61de1c71c60b1cc448a15af9708226283386c0e286d8593356feeaa3788a67484c5fd60891860c6dd0c4e99133c6d2b75fd4561a4bb4cfd9af9972b07ce95be1d1dead8ff16ba47f7ff8b7152431566b432eb24cb09e59cc6216b33e2c4227e8d51a67313e6c8867e0b7c0b75c2ba51188a35774d47db143946cd84c2d7be7eb4e2e7eacd73efaf19514482b4e9c38f7b9ced3b4197ff5130ce373cfc9cefbe4d758645ec97173ceba581ef3d4307e1992dce88404cefde04627245097b1303779f73756fb4751fbd57332e9cea4293751554f697a4645354bf354f551667ffc56af11798188bc128c112cd2390ec8f2248c1b9d6498c2b32e367e61a4e2aad85904b2816711883fa78c65a5a9a4c4c4cc542b7f9c7a85f66a317623acd619cf629c857fc37a14a9ae8c3db38cc34d3b372435f972ea6818bbcf95eef973ac366ee340a3ed7d0373f8d42b4adfa303e9171be61f247dce863c094edfc1fa4876a7d5dd3522314e9c38695cff16fc56d088fef4417f3ac83f2618f3a94370fc832fd9929c8e4c695918a77232626689f3d719d8dce834039a04dce8340396db4e34c8eecb89062cb7bbb9568e0ada034295305d7eaebdaeda87d957cc49903f47902fe5468a9b4e073d89cdf86bd2a785618bfcf8fed303e23fbd11e41b4dd0829593ae6c249d0d511c71060cd23445618401bc305285d39b30a6fc90c21b2c4038b1060a0a59114d42a8a08c2c090b2f8650218a61a10a8e1526807892040f5e040a667c4102ca862356f0e40535375071048d18ce88c253d0451070acb8e269862fa8549031482166c105142e40a451c3b40513152480a429cb17305fe264f10508072a6e0843090f52ae48410707aca4008397308aa82269ca114978216208282772d84245c914153e38f2c311355232486d21828c1411569694686a83830a114a0c1459105e88c8b2c587401ae2043224692203032da050408ca5a732b6b00163cabb2001214615306ea8a0d2848c0a0b18f3a68b163c51d1851b59d0135f9e805aa2cb1a30b0aca0c1d2992a284c8001a5831000b0028c0c6da2e8012a88146258220a131534747144155c5a600514497ec8a10a064d56088a1f39f092a20548c4e042050c2ebe05055254d218424c0a6644c4a0d2e6ca130d462869d9820549ba2083ca155108a1420d4faa8cd9e2044f904122080ac880258b2d9638d13206016160b93244162347040184d3165862e00515a62e5e5400c09b2454ac30419c24315936587304124b901155c6970a6411668d0bd2f05085112c3b4e67c060c3a50c324f149da93244941aa09466b8125ec1c30a7c0083260635a480a444061c22ae5062a58a211c0538e03c6103103e84810ad3fd8ea73adb7666f0d065072d9698a2a647f8baab2c5e1007cc9724b210d1c3dddd7fb8ee5ee7e7e3fe802c6450c060420c0b989c9a2cb915272867dc70e2431247b840c19229ef14c393fb373a41c1c2094a1431c926723181a82e9600238a8b2f667c30e3c4142a8c880367872154d8f134460c383cf12107a71ed2c8aedc50c6892c905ca1428cc2cd114a34ed10c68c35ce43bce2c90565d84851a60552f494616202198098b2051967f22933c514a82e5610058d1ef1630a4eacc06e7ec65881154b584c31f5822698297e54418c982885b41c5d277b1773b44f6b1db4baab2bc13874997dae0fd786757314f452e50d2996bfb9a59b1c267568686888abaf9fcbdfe5ea1fe65c663133357247c3fc1d8538e55004f28ebc4204f20dd860c3a130a2b92e877ca0030f441060fc81bfff5124a2ef492ca8e6caeb9f635698fbcb3bb8eef4c80c367669ac6134d2f70eba1da5f4230a11e80413d8b0bb2b46c24a9c44031bc04004c104fe803ea56fe9903481c65ef42315d766e0ab55a4aabfaaa0376c3e472239a9e09479f3a689372e576ea561dc50dad40febc3efca1dc9fabccfa261ebd414dd9e822b304639b5ea33604b354c8a80044dff888024ac3226d1e24a1108ca862e356625bd542c97f9fd690c147d7e8f221271cfcf7d445adb177660c8dee491e0be35b9a63da77d3e73305226bdf44f939435a1245fc87b57f224fd23a756dee4b319b6e7e05f3baeb4b4f26fbee2bd8493d441550a79a09c925346530db34f567ebcaea583384a55deb43368b68773d991348c05e724ada561ec4a11888d3499f4d24146f257cf2f651dd40426127912bf51306497922b77a986b1d4a6fc8c1936ecda8a94925407f1c829d8546c989f712d2ee322fef0bfa0967199cfb8fc47e4992924532f36520d4b4db1e4b0ad5c2d3c6b1898867153c39849fce15f555ea20a39b8503f605897336e9ad5b7b5d6aaa3617247c3a4d720514a59e5b681213fa016c531745cf90171834f83afe7e3f9b8ff74befb6c4ef82d507a45736a5a97a3f3f68b77dac8b1dfb09d0f632cc1b008bdf67da258bef6873200c3a1d80e18c65e6008bb21eb5a384069efebc6732ed7bbe6f3f6357e6ceffa6e998deff8026d3c0e30b4b2a7fa4c4b2db5d4520bfc0e5c7290ab6c50d90ed211b25dabb531c2ae4eecea0ce93c7b453a9dd4b55adb810e0edd30269babf1fdf84bdff535dff9f1bdf1f1adf1fd88b7f536be78739e9b5dbceefdd85aeffae8d7f8b8b5883ffd5fdc7e1d30ac64bca18a40fdcec60d5751c964526883d7e0c3da23fbf0d5df4b52680350835a415ee201c3d70d3bb0c8bcb6c87213a744eb73be9eef1b163677655a50828a3241942185972b5e082926d0224394186a60cd8cd5be7a1f1196521699cc3df5cb7df752264db989aa7a4a33a39a499e9afd132c8aa594fcd5e788bc70354e5eadca55fff68545e8d5406ee2ab31952290ae54b9a20a1d7e4083872718c841083654634cc1c407ce9baa85e2134b494949469a8d16d913a64a32e686ade676bb714ae2e58612895c72c9b20e72bacd3385aa04505748c98c68a1664d8f4ea1082869aac8987803a7477f53f5779a213d4b3d8eb4d3311670d1470a94943152ce4caffbc1b7c626c4f890d4834eb19d04bae740ba6491aeeb6a5fc37a698cce0a8f5cb7d6187f5660eca13daddac70854b5a37be4ba73c710d7a66ad663d3f1b0da334cdc8903b8b5befac31d9767a6c34c4ec1abcbc58f659618b903d8b113c7f6eca8377a310323965fcddd3b3a2435bbbc41ce5c3940f9c40bbbf13330629b9b59b692a258b9eeeefeba614413d5c8f61e1dee596e38745f3d63703112c55967bfff9cfdde11cd9a3802ed0b34d63451064d932d63a25461460a1410d1c41764bab489646801861733a67428630a49cb15a92c4ddc5459ea32e64b14d306083763b0592343982f566c806345490a6250831354886982818f335b9ad4c045952553585ac060b3458c23d2940963441962d874d1c3130a5220065406b2a491240822aa64a862228837606ea0810728353b64315305144730d9a10566f830830112125ebe585a326bf2e58d143c2c59c2e5cd0bc26862892c6da214416b5a40d2e66929ca940bb288542c10e38d132931f040450999041306155792a431050592113d3cb1f1a24a0f4d7849020b075928c07b320176cd4dcca576fe1a3d4cf952f6741e9a6dab885f59c41f88a3ebd58b70b3574eb0b9b9db997bba4f8f605c6b2de49e2e9925b717f41d0c27bf4bfef4aaf9d1ebe8d56eba1f31f7286b7dbdc009d28f8f62324b8b893e7f68a08c2e1be33b681b268bc8eb3fa34b1ae5ec33e6fc413f82e15cba51fa17bf460f363c9a4773e97a8c3d264e173899b061779fcec92ca8524a194197525ceda09d178e1bfeec365c3574726c8be575dcb6aa1a9d2e9bdf775e19b082fa8d64c3c048b2bd281ccfae32173edde973d5a646416ff797d47dba9be93238e919ecbc2e8e5bbf17f5aed81bd7c6ad5fadde95d8eeeeeeeeeedfe6ee7ea373775f551ff3a50442826bf429a0ef5ec1a8b1b3c60cbacbd8943d123ea7524570b58332989aac1d94c1ce7d5d1cf56a33fe8420f046a89dfc5c97ab9dfc6a5c6ed5c94fe7721bc775f2b397eb3816eb72ac4e7edee55a9dfcbacbd94e7edce5723af96d97abd1695fec21bfd5e56a74f2ab977375f2d32e6783c3c1e1e8e4e7977b753b5dcf0e4f062c097a04f29f24982db3a0f4d60fe7dd7eb2e673b32a09f3a74baed5fb62049adf7ddc1168fef679049abffa2ebdf3e937c1d8b07a1d648f650f5cb4c04ad3a6eda0d5f3ecaca6d55f7940e8afbe7a2368bfd264055d7b9e40bc11fc35309ceff37dd2395d42c1712dd7e1b2711dabd5aca353c36d546f18fbb8b85f5c9ab9c19d4ea78beddfe9579c32827b7a74b658d6e1c23a5c6c98808b3e21cfed79f49cdf95ed392e5ad52885648ff8b1fbedb747ea315f5b45a158fcf1bed983dbbe212ec81feda9b8418b77d150384cb9da8eab758fe8f918228578496a1ad357c209f2477b0e220b6e747a82e6ce20512b540d6dc0e90635577b1d1dd45afb1029c44a55d69e80a504261f2e48210e1c22851e267fb4a794ce15939333554aae6e3ac358acfb0db4f267689b45b4cab16c967c1b0c4fb8ac24c6c61eb107d562435288fb2dfcda7343be880bddd465178650e0354d607d0b7c817b1658e58f07beb07d07be14da5e7b9814e25e0dd328a5b3cee8fcae706fbf21f923b9efd508d03e7a25c4e48f86c586dc5f9086695f6badaa433a288c5445b4201d14dafb392088a8de341cdc840c26c66e30d958ff68cf7d0c22853850d39ed3945a882669cf4b53aef6ecc50a83994949da132cd7899a1bb296abb1ec6a3f3f075c81131432142668b11a38d8f7a148b26f1c996106a56e336c372b7152146ed641f1a5fcef8940f25faf57adf6f5c3f522c25783082459e81bf6f468496ccfe51ef25ffcf29fa8b04e4e96aaec1aa6446906d7228a2a89c104928a6ad6581b255d6ded2c16f953b380423936a4031cda428b392591e2cef99d6b4eed6a9144e9fc9c28f9fcbcd1a909d55dfd50a9e4976eec76a39311196ee823b7b0f546a724342ebf908f2653f227defaf5f40f3fdfb8d1c9c8194d92dcf0d5682a1763fc18dfdd3dc6d9710c235657ddc69c477fc1e2c72a7fdabaf69b07448ef0b36aee6037bbe58bce9e1ef3282accd97a130d8d135786b9f239af484e217d18c095bf7945d20316b4698ab3658d1459f408b2a899e20353122d3ef4e86e0713c6527777b743018557f956cd755a42e24a26345cf9114ac2c2684154d5143a38b18306945230450d0f3f50597124d62c4929a54be94337ec969081c286ae080f35c8ae086088d4550ad377fad12341a3715eda183676bd11e098a31437c371774bd9fda33d1fdd7e5b4a8f537677fb953c3eea8dbec4c5b882cb2f5e1eb2c1d011c2fa73dd52babb7ae6a41466b5ba715bd8e5dcbd87d5e970b1f4599e8fd5ede1d2e96cb13a5c727274745ceae8e8e8bc5a9782e105dc29a560f86376e3ea0a2ec6866e85e5b01fbe6a58efd95f3606791061cdbd3ac23cf816eba3d703e3acb4e3bc07749d06dbbe59e9af3ef975a80ee95829d3a4763dd574cf5d6b8bab8e8b41ade72fe2ae76dc71afb655739168e3589edd581eb76d5f8b8b44abcde3beab57d471de77997f933f8f5c3d67173b76dc5980cbe1e76a3133c72ef0c1285f14465f0ac557f8bad4eb3eeedb3eaac99fe1cea5af7d473baef4392fef0092a334a6872bdfbd4a9d73eafd5f67d8d6e473a55356d662fab8942ed79dab0fedf6d9cbd335e7f394f279b4e4332ad76afa31ecf1597df872b9cff6758064db6aaddd57df7d56bedb8b1ec16e4bf9b93c82dd1d282f88b8ed75d792096eeeaf99999b89047932454418724a723454a41b73d415f1c0100bc6d55418937b949d199d753ec56b0e6bd1ebce2ccc3192436774a60115a2e7328843c62561430da870c834a0a2333ac3218331b973dad7ef5cb81cf7914160bda7c4867c85b86efdc9712c66666666e6efbee9baf50b4fb8b5d3de7bef2b83b0bdd7018966803093e572200f1021ae6bc460e82222e354dd0d3c9a5137ec408e6d45a0c9f23a6eeb408d40f33bb08a40f323687fc8abcd1f5e5df7c40ad966cec44cacb4c45a4c13725a3c29634366e2136891060536f4aad27855ccc44c695eb2384155b39e1e1e26a058215436e361420049686c189bdd8ecd7a04901454c5d49383977c5aabbd71f8c26530ac3f9f58be2eb442dbaeb9f06541cf71e5c74b3b6052287677cf4fd77df9dc3999ee0aec0f86afbbc45ac2ba96b8fd5d9b353172c8dc1d8ad71cd6a2911c275608952161c32d6a8b8a443d54966384ca78665ed8500049b32b80a49ebb4551d916c533cb218b8383a9eb9a6a888be3c0edbbbb3d8f1ec2b7b33b4d15725d76a25821db8cc5840de3368b55705db659a7f4f2c1861d95d2eda8866cb34e0907d33cc3836d76eba5dff1e5beebc0f0689b41b17cb9ee30c7598b7ceb6ab56510daf862cbb191831512a7aed19cc2865bd4eddfa222514c8c0d6dd8588a44b1db944efd28c0e56d895b3fb4f1c5fc6297c1c7e24a63c30ed2dc0e62d7c652046a1b4bb7350a761ecc38a662a494fd469201add5479f703a83c033c2cb38716e64dd8eb162b1310681af7c03ec883c31deede57b1a11a45017f56d5fcf8b7edc0d5c0d767ecd91ff52c87b290f1085bcbb0f61205c1921c05fa70e183b148363e76b565207dd0a21f5f077f7399b58fc0b5d39d5231191fabcfa1adbbbb8b7d1fd0d2222dee360fdabf53bf633584520fafd197c75e7f5511cdfbcf1b90dd7d73558070c2debebbeed5b7db55ed7fce3f8b44476437afb69bdaeb59e88afb8fe2d1211e9e7b8efef58fd5e2422729d1589885c8f444468ebe308449ff57504a2ef7d3202d1ef3eff6604a2bf7d3402d15f7d5a04a25f3fed5b45200ac61d9e316819b9b8a69368d374725a2caf03c11adaf0e8e8cea76c2983165c7d46fe527e12a55b82081d149d6a90bafd0fe820e6da75e50b91999d9500d68705f09deb39fe1c85aafce9f7aeb23fae62315808ebc0f0397013c1a54f6bac542c4117fdd09ddfc1f9d29d32b3df091e75d7c94c298f8c01e5d163f418638cee1e638cdeb034de69f2e9cfa9b9a651f0a8bbf3ab26a53182ae4d6845a54bff5a5f2f5b411a935378f41863f418dddddddd1db4a25d6070dc13257feefcf1c79f56b76de33ccf9352e674d67349d9ddddddb2372a74645ccbb2778db13b76ecd831ce1839c6d76cecc831be4e11d17a54968297c51c3687bbd8dd52b66cd93272dcc969c37523497e00d7c5beb863e022171b8b74bc8495c1ee8b972fd68b0dbb59f90397b511cc625d5687086b85b0117ce90c613516ed7670b033976f5dbe43ab5e11cb6e57b7596b86fb584ae92e5dbafceee62b5ce4963e5b54ebb42434ad565647d5252e36d792ec6a297d524dea7491dc59e1384e82a1656eafc8ddfad046a037823502f9471df10b637352a7d53badd3748ab0b5d6ae6259753a32ab53840debd59159aed39159aeeb74bad8f85d04bda239edeb599d8ecc86f67a6df9b460fea3c7da9c9cc9e9e8c418298d34d2487d7ad439c2b10e1096257773338356a4c03949515344531818dcb0d214563a338605ee15c60c3aa04230db6664b46cb32494b0cc6474206189534e53e29415cbdf1d2014411495c139a2329f46723245def8a4841bd78d4e5092a8373e1d11e5644bce8d4e50b4cc392318c7885fb99e0f0a4eb3f13c9af376a26660f2e49348bbe9cd6e3437c8e59a5eaf5a59d6c4b2d6cb8f9b8accb0652d8b9a1333618cdc661951d4e206d90ff99b6421d2652f4d1dc4ccb20ef2c2c28c0de96032d4410cf28c4095305d6eeb38af88fbeef3fea3d6b55aad0ea25a694aa6d446298dd72d254cb79999ff475fd63c0850254c1e09fef2fd3d9ef287ffecf2e9e0bea1b6dc626630f474cc96eddefb7e1dd57bddce7bafc8d3220a3d19b7e3e5b8468d1af22516db545a9448b4009645a21a1f85b53f39e6868662b12b613c3d1fda0d5e8221f773e8c51f573e1300a83f2000c74610356554e27f10fb800040393ce8e00716236ac37130b8793161ef10cce4d7c881a50cd3524a29cd50a7be863a7535ee5ea4e6f458afe92815c492d0fc6e823b2cb06c3cf0a07b07db55195dde0e838b5555d786181bdadb45a22f56c990a5a2144ff507a59191e1341a6c34348c3855d1c24e54d85c9e1b9daa30b9de8d4e559074cec5539c6a82a2b2fe825b718c31c6186bb8ba46f2dd844eea31297bb7e4f19faf813ef8824a431d9330ff1ef3d33e2abd7acc4ffbf94925db63be045b90f78a08e6d34fa9f698df9e099c94d463be44923d91b0c20a2cb0f0e951a5907f9457e2cbda0d80f095ffc51f7b2a4347d571f9e398101070f9636d80931ccc343d81a58c24c8c4d853b5e96ae25afd0a0c7908795da3d58bf0fc5f031af645ad011d2442037ed2e7ea156d200f7501f4867dcf65d7aba76a93b694425ed7483ed2fd86b94ffd62e7d341d29b55ab5158665d97a3614dc150763afaa7630d8b5e510e9f1072b8eb700ae1e698c923bce4de6ddf71140c37bed2a95318af9cae4009bb9dd7eabab55bba5bb7da5ef341e16a91835b67124ec5552b0f5f62258f79020a1ee475575ff8721748e5e564e39407394187b9c6a5bd9df35d07511b3d94f34b2a1d726d3a3f7da8df06289f3e39a66192a9841955575dbddc90a953e57de4f758ec02d661d679fe960ec86e6ccef74a4a923bc831217351c5a1b5d65a0d8c02a34ad0b45707668030b383e512aedca821830db98a4d8f8b4afe74947c6ad8042553c3a49516ba0182107ffa7b5c32bd646aa87ea6927287084204e207532291cbb0a1a2aaa092428840fc892544200986d5ca9d558b1bae6a587f0e5646754ec4a8e853e4b20b97b59e2622843daf69472f0d04325d90de73f98b21ecf6eaaf9473d6e90ef200e1f147baeea0bbec113b9f5c60297946d07e6a600326330a5d910e7aa1832a23d9d1813b1ad67d7b3d69076e600368d55c08a3d4102ab1ea1f068bc58656b26a3564b5f2d5bfd1fc8625a943585b76c474d0e9c31a0472684a49aefc1795252e89f46ea78a0d7dae7d1733f3774e867cd55990737ebec7dce21c90e1b09e87749fdbfabc48e5dd37c397562da8edd8a1699a4f4f13195cdc6fd84e15cbbf238b0d2592db0f874dec1d3bee04976e18a93a898bfaecd77590e17415cb495509ba724d5b813d4839055d7bf5d45a573d48d5fa9ae370429078828e2027d41fb55afb02a76e3b0f3f92fc7846e0d004e6f1d1970eddf67cac2e27e930f534e59c73ce598f8678e4235df948377e8c1f5aaf88412bc1d087a5d41fab3b94a3431d627b8f759dab729d943dfdd3ec71e0ab0cfbdbf60edad7ad462e3bdbfd9c3d127c1d61bb86c58eb8773858beee5af44bbdd69a0647398dfb31bd22ed6dc4f9a3a12b64e81ab1d6fd77d3f3e11569cf0919baa108d7c803c3a1ebbdff0674bb50c7ed3e74ddcec6ed34b85d006e67856c78cfbd8d2fe7e3aff1f1b7f859cfaecb60e8bdb7bef0c301dcfe29c9b8f3e9739fdfed8b577b214337da9e337cadf5b78fedc6b92799b7f87760a4dcf4224ee3a66bdab7bdf5d33a084cd0bd76520a190303d87e4e722fbf1efed83dbb94b85e5b78f5dad315a594993257cdf5f26d7bf68ab698b6bdf6ab0d8c9c57b4e2557da7226af5fe311816b9b2f2e5f7c26afc77d5d9add6289ffee9dfbe9764f0bdb04b347430e46f7b8e3b28ec065a704363437faf9f517f91c6dda5405cfaf7db88d8e5569ae62ff0d5b4e7d1ee40369752735daebed71a61ab2277e511b602226f5d316ce5976b956082083de70e1e0dd3c193276f0085331a0afdd3af81216562431e1d3b44b82197d0b07e13a4eb46af2848e7d6a53c725d0a86dcc595200f101e1f9ea116fc1af10e399dbe06b6e03782a09454ba9c1281e14a1a7b59574e13552d275eaffee9ed4317aef602f76af2eae1aed2d7dd3e2397af9ed56ae555d0e78a75594dd334d09370da470d8c9aa6f99340a475e77791a86acc6fba0f394e8ae5f11e293e8d7db9c53382f7ac678121eb3d16eb0bbd1ff1769f7c4e364884e3f8e8d5c7dbd42ba254bcdc9d1b9da4545daeebba4ffee643f3bef047bc4647fddecff74021fdb3887a5fdcdef37e38581bc6fdf6c9db7d2c14719918294c37de7837fa469bf4b6efb46dfb7ae571aec360e4d6e7fad52bb7fdf6c50a64235023794cdbb8aef41a89b6a7bfda2251f7f4b948e4bd17895a4f9f1589ecd36f45a29ca76f2391ced3cf8944359ebe0e83505db0c8e487d3c811683ed732024d9f54ab35c09c0824bf5f27c77eac0824bff57911483eebf33e2e02c9efbe6d552390fc950e7f2035902da8c3920c8e8d58a91b76ddc749363a511973f949e01a29e9ce475ae2fab3c0e3ce478a40d168823c232ce0fa2fe0867de506bfc1eddf200467dd7e162cebf6b338981fc6186344e238b7bf1006233d3972942cf91ec78d78802ce0f6b310673782314eecf638b53078e84f5a9975c458c98d83f67e70702b4884835b9fdbba1889a60f7b8970958fbf4498ea560681198436c26dcf7974b2a6b7ba0881f9dbcb6ff5dbe71b7bfef50be1460fc8fcb0a5f723845b412221dcfa9ce5ada5b340d0b705aacdb6823e0f10faf3a95c3d0701faabe75bbf90e3dc1ae7aec0f9f56b5ddae28ba4311b21938ae21ecdf0134ce7083c3b59e570aad8c10c942a7a7ab15dc37838ed203543da3d597f233a5fd3420dac1da199a8048ef6543909d1d808000040019314000020100a8885229148301c2782547d14000d7f9242724e9b0a84498ec32886829031c4186088210018438c199b991100f9d2e0966d7b80bf87620cf1ca882827bae51464d18a9364808a6c8feeea19badcbf01025721092335a1a0c3a936588296b992a3afefdab4f9ed77634a0d9dfec9c5369ff8d122c1b9953b11e4297091d14df5578527a5f10332d7999c6cd65837838a85bc0c470e32b7abcbe1e530b5e86a9c7cc6d6afa301402dd1fdc328d085057f7a089410e92fc54cb3bfa371ff511258975f54f6e81de66928b1b9d3698c9dbb1f18cf17cdb88ff58ca3c4ac52727b21ceb3ce70fda463e45a68ac7abf223a78d7547c7aac9da2d2330c3c44c821413dfd1f9925923900a60ef2d05cd2996ed33d3e9dc4259d47b450672e11d26b90aae9c7e966b29086d68ba1ae0e30e64170ec39e8d078603985ccd191b0aac929c2fd63f85776ef87c0024ea528007afb730bc10061ea3b324523758a8435757ea655a414ecc77b9d44cdc2a515ecab091f4c9e4a7f69a0fc29749a5ac18c9e10c09dc3a90d6a322ac22d4943cf3f087acf34d386264ea1f04600f11665351edf5ec9783ea1a197035de640ca1b63e492b2e31391645e8f470f643920ab2ca94750979ddd40bdc12bc91d773365f656750d137d02d260cd01da065e9e482348115933e3bea5f6e5d965e2ebea4faf9c6d2b292bd4e072d3f4d956dbc84431680f876bfc4554f944915f469903fa59a38b1e4cc2ce5d1417250fe936d4dd9a0bb6458b1378f2c670601bf2a72774de07441b5e2044d7991c260049ac8afdaa9bd68bb56daec75dff0a9aa4882aa47ceac05de874085dee94c1a08bf125ec73202eb7481027d626dcce337271255d2bd069ae4795ffb4cd6e4bc5725c9a79044e7485e5798972187789685e55770caf92d69bbab57504ffc7fd8e66b9d47c7c25dd5afacf366fc7a6680f942ee42a3d885b4e71e9544b34f4dc5a7a75b58ed8971f37c2ff7223c33d4fd9b899a9af5f410112cdca39cb9f5225297a7a598d86aa8a5b59a54d95c82de52f98ccf708b905f4a929ca5fd40c554c51a404375c572ff71d2c7f959f5b7d6d2db3136673489276b16ee04efbdf69128ddc8ed22c9fdf7fee8b261cd43184a106292b84a1df8fd44218de3b0b9a8296ddcedb8e2d7982810d407818d908c8364283d2ba35ac69c33df41a103a8cdb28a083b0d10eb2243d69423547501a32ca2dc86802bf99766db955d07c7cf41bb4c15d476d9c22d3920810a619c411bab78a3e703b0d288321609f5ad88adc2fee4c8af6347db640b17cfa84f5fc98a4d37eb708c37778144563287184a1e0add8ef536f037e8ec0544d872b326d9525e9a856292e25844826f41e64eff95b4663c3a13fd964c7a2e3fbc97b27720e701b1b8ce0c50653c8dc20d6db12426163a69cd9602c038c5a991b2539f6c0994a3378fd0c9859f4e6617c8ec1b76593baf31c4ca65baf3690d35f538bc108cba63a156c77ad1b6b7d8492729523886dbd0bfd4b17a58db646aff58d129f4881774b7eebbb9cf033161a649332bfa11b1412c13b1518346da0f033e45e4760a4d5d4749f8031d676b059e1b198a164f7e3aa6f88029197c372d2f00d481aeacf3949185294f43e967158f76c12d1c2f2855fc92bf1113018c20680b8ee8194368c54fc87c480d15809dcefc4c79c36c80c65c88869318697e634fb2a7245ec1da81d537c5500b181b461b6f9d6a3eba62cefae4a12708e227a12d4086f362c9dddacadb28c1545f5e90b2a579a44f1c6cd19da8b99e53cc1380113836bd4d809dd517231864d37448e35f0ced48b223629eb3623e1858b86485ace7e7e445ed98778b17670fab3edceefdb468dc4ee73051e5ed5773a0a78b9f879f9c3279b6ed7504a613948f51199b60af50b18c4b359d8e365bc39e6c091f73f225a489d2290b120399a418dae3ab1801ec19530c58ee40a8c111e51d09e7c241b598045f52780e6f8f255d019f78b38fa582cc69595b56269591e0ce04656601a1869f792009631f917f18e9911c74622e421a31a854d9edd2180fd118a29b5a535827f6a998a7aad84823d62bb1227b8f03c4dbbb61e70054cabd2c2ce5a3c994a0e2ea746a9afb72da53776e8cb2008b57ad94c2b606215c750a399f886db6bb94ace603efeea2d649bf885dec950ae5dbe2af09af0e47a52e4d774f17070685215c5a171cd8b54428cec9ad4c6e2920bcaf4bb6030939978ebe478577a9a06049cb03addf8a2fd7dd032b4c539a67bc23cb53bab896363f500c7969a9ff0662eaebf68c11537059f28fc0ab46aa3906a25de1a20d75e3cbe3cffa292105b0d8d62c71c75e57509c87c654feb186d6d5d161134cd3a9771b7dcac7b7b3b02083bcca3e94d9d584c056684b07de9c7463a177ae687d89d7c163ac664692de60a2d857c0ba365ef1910b86a3c0902de74dbefd52c0805230602b72392d1b1e81bb2ea60be6f6d929f3b168b41daaa53538de4a4989d930296965dfde1d467a3af1fa78ee3d5e38f6d2327b9fd6b0e9c562de6fed670969ab95c2314d8131e620c59b650b28ef1ce0f3c1ebcaa98952905a36457fb14aa2333e034521f9b38e051e86ca3508ca511c15d5cd4d1353e779a68e7c71ffb7137c4b0bc8a52c2740c4d6f98133b03e3224ab802470dceb5a66d1a6017c91d449ba1af23d99e70342cc0e5696fab5ae7091a0a74b6e7881143aa85c57bbc1a02ba6f9cb009b4a299b5fc38c1f14f355ac5960747d429cc80374a06ac659e6a6c74ab09120b0221ef37cf48b0e0ea097e7fad34bfc2a9bbad4421d3c4f1ea4352f12baa18e67e82f74bce60d764608099f8a11c8d63e334482671078f66583410effb00ceeefb59170ebf41eff3194ce84717ae83c6baca9d4d853eff0625f3fe8ad5df517094403b96e6e4920f5257060f0a212ca9a774efb0ab5564a1852c239ac233263fcf10bd8b2c83ab69222347ff70e78f4f2576dcac78ddcc06bfacb120802c612815d99e987d97bc3fd8c293992910b87bd8935ee4e136971d14396a26aa3a07c2547a86395b511f1003845234b4b90568d2201333db964088686e6df7fcb4530e29c3c3e9bb24d7f009188121579839ce239665a85930c1ad9e3bed35d41c0b7f40d0226ade65cffe87bd645d5f46e11e9a4bd9c6aef66f6d2d0cb7ec7c19810fe56f3543db8c6f29f655b8a57dfd0556652152dd554ad1d24f79f3bdd93348cbd8669d604dbd3657c3a229d768d1deb25ef7edde15ae2a4dbb93b8d5fad316273459c9befc742b4a4cb8a221b51bb67516a575064215db504e686441a1f1ba88719dece7931b4545b80c93ed25d651ae8bd0e3eb4140957998135f27699822aa15699086428df1d2594ff8c13a64c4312c1133350f2076bd724b14ffcbb4bfa17e0ba0184590c3b07cb6a0b33ea01591624f064ee9478627ba4a8787d826d85f06213a691f0b821959f3c5cd52322ca4e202909203a5756a0cea3d8dc917859e4783c6a8495bd1e87109fe866500400611ccc642f0991e86d00d5e78a11513313cabe5c178d90563428deb404bcb3b65e167f226ced9288d53dd753d82532f82d03a3c32d2e6c81dd1619b6a3e1b7ccfa6a66af97211e1be24a9c95bc56c4f348adeaf3ea4b784af25218f4712df57121fd7e312157a1b9aaecbfbdd92ace2b839231e77d914b53283817971a00a6da0e6d0b2c0420e5324cc15173ee5f8355081b4fd59db3bdf489fe6162e49c511bda21675738145c8b983e4482423df301bd19ec2a2f6d4197b8ad515a8804e8bb94c116db1119544a73d5b551833d5a412c8c8eab0b749bb6329a1ee8b6acb9ee6a759a4299f54d4d94f1049e090473c7c09d967b42ec455e7faa2f7107420fec90cc596109ee7c040ce2633e6d4a878ba75d75704ee6abe5483eda009df6cbb247b67a204163e8391ca606b5097231a57eb1dd7cb9f1a1086ba13fa7a3fec9cc42ed37d1cf25fddfd7a98e8b50570eb1c83ada4b75cedbd21aec1fd9a8aed53a2fe133350d6fcec562b0ee414a3e5b5a2d9a997db169a3b39fe759bb439f38c8fbf4bea07a8492eead2f39d8a02e105f885563abe73f6184fa28e5f8a83c101d00a5e75cd3f9b55686f0c4174890d2f050ad8e7eacbc653fbfaa52381c7e29be85d2291998199d4a13e74f7f57efa769522d01492ae606a997eca384d0d0bb0d62db5e3ed285e9e11a1c94a1d589456e0ec73d105364d2d67cc2a6d85aa6294ab659c2ccf6155191ec5424a9b6e8ce3ae796151fe805e672438fce84b018204801a5518ae67ada80992379ffc3b46964e7f14e1c2c558463f42fc6e34bb4726945eb29157d1f09e95b3de00808806ca27bee687f389b17c0714d2ee5ac65563797b60c0e8149a72634e75aeafcb1c62daac716e844a83a1d990b9511b0601c85b7f9d8469e62466156ef4bf295b508a6d1c7711254c60f6a51bb38f72292901913ba0b3544cf4884ef42f368fd338f8c1e70ea5455fa203856a221205b69ff20af0ca87778a2f16ca4bc1809d5e42ec1474966204e66bee960fa1dcb7c903489609f250e6d63780905614a381d5efe4ac68b1b8feae78b856884bb04865324706d76da797ff2a2b452b779768c24d55066d64be553f5e948ba11af955af1d89b4a1281c46d71704f7f28ec3d475220aec5708f6c354a0c6a27c0c8fa3d36d329fd096496645070d233cc4a73d395788e569aa8cc857b82e7a5903ba9b43fe0caa153d20ae2e80c96b11f082a1d268c07f3397fb4f126b30e68bcb26c010f540926ed85a7984a5843d79d8c4c31732aa01ba874df778fdd21cacec4187aa816395d4d9ab2c38f162880626db55cfb0fb6fd62934e4759743175594deaae680e8c7000cc3204b0316712d6534b113db47aeb08c4c33ae5c29db42b916cd2bdd627d33f8dca67cb390cfa80a0e6aae8503322c44fd949b5369299e3c2b7baaea149dbf08ce3f8268c3f2c63f02fbea714a15e5efe2484b61384124c2d30c1c99fe328467a6e8b2196737f644af829b6ef1e170e9b44d49809ba8d17ef7f4185027d3dfd627ee873b0bb41dec9149d9635ed6834648c5563466488a935016b13a23f21df1c0129e58fc1984ad951261f057c9d1296d0a23dccc7fe260d87c55b74978e53ebde0f3259a550825245cf9ba89b295bcc6f0319dcd6b244ff020fefa49d5287854655c8e63abe002817694d7f5c61a308b495e46d2ae73ae2d812b0633ff74728f7841f0b1011a1dfc7cd7ef5adafe9b9a496343bb7d423042cb1f50257f2a5b5964680ad5197134b10c8fc0804fcabff15d8ebf2870eec7da007a5b6be1bec3d12f38a5b09ff477140d0b5d132c517a35e7d1899d34d788610ac3c1e733d42a76fc3574cb6c9600e2357c4f3610a1fdfede6c5413bca649d378e71fbcfbffc487ca37db036c929f6e03400d438b1f1280867ab3b2250bc21460bfa65893145e9c74e6cead59238bb254af859951d8bd442437773038d8cf160991dfe97afd6d4fb797a9737200c9d34a9b2609c6b710f25722f19ff28af12640bac93fe4d05e1111445d72eb1b93e5c6a688c95f066979a3289fafa1c59d89c25c4bdcb3bd6c538d0c5295d11c7e8c0cd9adc498ec1fb9ad30522449d5e9af42252a55c43952dd561a68542fb367d234fef6f01f57999fe8fff7c8dd4b552a882a688d8e3e53acbf2d9444df2ec8a6b70a7f52e85f458479afbe4c3746bf2c95cd125fe1406e16956d00c0591f4185cf08db9d23cccca2899dab6bfb40b1f81545bf27c49cfa782e8ba6323761878df1f98f2b80bef95fe6c393371f65cab8f9ff7e2fff4fad466764be759e35d0f7143030b5b118e4816464509ca23c5bf55648464db3f2410203cc16f96c368ad24c3f21572d4c10f69532fc3461d404ee93e8634a703648c04849de2570cea61d0e37d30dec7093a41116761014036b63d3f83c212d05f768a57124960f9df9a7dece8be551ef6178d2a02f41a286b6712ad7e0f9e0b7ba9256346ec0bf7d24398f68e78f8d9f7d4fd2935d146425323bb35b05a1197b2b425fcf2937189bc5f67c09249b380cee0a2b1e1c76bfe8fddda5c48051b3603b5419ef5ef4ee50660a39a0101f18175ae86cbbfa146a74c1de8de64d0c63100efa83975a1338492fb1f77c5a0e268aaf5e9f44b645efdddd6903fe3bfde48a261d2f9723b016f70e5b42467e3ab7266df895ae31c7b330771267ae1037b523fe408e2192a6907fb5fea6efbb098f049b7c7183ff10ff790cc9d2522065b65e279aeb219aa7d38b21eb4efcfc5df805817ab5e9d7b471d6507a2e4f032f19ec0bc316d4685bdc364c1687d587c492cb7086747c9f8f6f85f6272f73548689fbbbdb20cbb3ef9bafe1568b7750566a529f698e4d8661749fd125880c3ed1c0a6f931b43f3dc43ddf822aab6e80b106740d1aa236ad2d1a41d709913f07d6664aa0171d17849ddc0a8b0ea71cc66cae39f3dfcc6b88a36f046b923ec6d1fdfd265c4b448677caba57d3bc5fb2ef9b64d30431ed362343926e0fc3f84793a8eb38f469cc5c934dd81ac296cd740cc84056958a4d85645dd93056b77eb0ba062bd412d67d7b87bd12ec9908b83ad6f0474b12dc2f20ced09360d304c08deeddc94f13639f414b65047c4afa691b95f6b730efd60c0f7726d1750f406a99165209dca46a99531ae2905c218f7df7701b64526e1b5e839f638e07b0cd220039c7808af900566975d2dae3381d1c6c9f3af2b3e605ebe2506bd839b42b25109ac962c1a5637c2dbf26faf722d0253e9cbe248b6ec43cc00858b394a2c9f2bad9c0e7dad6b21a54131ad9ba842ae0f5bf4db2a837fc84510b3eddd02d1567f149494af95ab605290f4c5947990cf0a5dc318c8aa06efd562fd5681d0ae6f08e73255560f06a3354b2a2235c68adebd53f3d91f39a9501a73adaae06225ecd56946681c1ece46224b65bd95ad0b8485dcef550cc634c1809446364dca7b515552c7890a348bb38a32f403e3741474adcdee6269dcd849230a4e32932cef491dbd8572adf9dd507a830c10f5b4de8f05e315eb32511d562306f557a13484b56eb780ce04d0876b9ad6e2afd832179fcfcf06b506c8d8412503371267071d85909de8bb147153061453ec8d7f575c2e9d1512d0bd93136900eddbe59be86107a6c328c6e96b263725108d96d857814cc1a05d58e2c263a3cf159c3f6a7c14d818a2706287c6c855388960a99ba2847572ca6209185fa5126151a588786fc099d5c6358fb900b274f90a1b0232eaf39431dbe07b029a571d7ac175edc9c16b8b9c3c57996450c3072c1d98781bc68feb2165f2251b33f68eab9f4e3bbf5c379aa001ca31fe3961fe03f856948fce8aa2be1f885c508b80fdf509d73b38f39f0b6ddd6079c747e1ed347ef81d15c952d997905aca7545489221195dd376364458d9e89eb198567b31d20ca5136f549428d15149135a36a635c55ec08cf109f3ccf13d5a012f4e780b46bacf1550d041a0ef1f2206cf49c004211404824d62a54a6441931766ceccdf42845bfb0bca5ce7fa97caee1221da9df7e8c7915895e58d60fbba2881bb2a2b66d2742eef504c4eaefd84cc0c34f9da5873e0e1a86fabbd734f7c2d0174c1a255dcc50264616b0771ed4837640b9600220204bc4551e14a2732d627cba0536c54d8c140dab85d0b8d58955186d0599f3dad3697e555ce03bfbb370d73e1713254217c8d0c00a0b81f777079c553104eb9d116cf4047905cc22bcf7f51da3f3a99ea8cb8b9553a62a1b59da438c774f8657bfc11417d2b34098077d70fb65e428a529a8f77a8242608c3df4fa5d83a34f4ef36abc5ed9e2f42fb26af3746793778cd562a65a38fd8980fcdacefae26161feeb656c8640fe8b3a50faaf71a0fe3f4b1fdcf85b44943b623e41fa09310941f8cc21d9d109c75039740c901e834d88cfb9191ea2db4ff701f9205a8242b3ced88b81ade9fa72892dea24e3598c566c7b288dfed7268acf94db899a4c909f833468ed0445ff87baabb1159cea2b1f21030f3a216df134235d9c1c9401ead39653e0c3fb08512730d30741c8758dcb9c0484866c7cf4dfafaebd09e08ff131294bd6ee0fde71d3f40c82966b9ed134ece91c75aa6047e0016eed8268a451d9ef6cf002337b46f1b7fe1bba7f4309c444a03c82ad4948f984af393ab0c64794143bd89095748f8edb8e0ba6f5fd15430617583e87b054db8202719475641cebac41116971656cc2cd282407f63e078ffc87f6f505a8963891e77991bc672d166384f37033d0b9d9268037ee20a1948dcaadf9ed59b1e920a3e13c5d117a21dcc571d70caf4a922fe3e766e072c2b9e21f0b74b04e5e39b22289aadf6c65ac32551423327755b3776b86eaf51a47036a0f4c6da9673252eda3dbc45c5262580e0baf9b1c5385f14945dc24120acfa98c14567634bd33d4d8aaf8bf37f6014624d5bd504ba70a0b2d8ca282af2c367cfd5b48ae431c3ac5c817ac3674022db9a66b0353588048f257736d37d4310eeddf4b3109915c32d4d049999a4ab290e9e574aa4bd86d55e86eb6cb230ac6da9548219de19a4c59876b1b3cb57e7c43a7db25164d6f989cdf1bc6f6790da69b3579a07e95163e186a0c0406191f4b723f970aa7449073a814879d3c2107a393f4b8d3a5590bf7c53eef20d2f887ebc475d48422d2d1d7c4a0b1602edfc2cbfb67e269c805844f5f674d4b61209f810f24aa74b08a8b95e7baef2369348a25e62e3595bde3ba2e2c42fecb765144b75c9737b411dc7c97853711efc48479074c3ac5ec8614d99580b4245494c74f67c38a90b6a0c28a9cd288a57ba18f42113a33bd75661add9a63bef68d9017a27fa7bf33b500413af0032ad1df94346f014303749d1c2bc18d830399cfcadc39ba6cb7be439f034ebd4e70f96d1e1abbd91554c4b5d0e7a27f897b66f914edd89b9712f4a73fa0f8095e4c5f9bbeb8cf1d38bd6b40c143bcd850cb8b59a07498b162fb5192bf2f7cdd7541c43cbf1fdb85f78986df00790380fa8797184c09c5e47e510fe72d4a691ac220e517def0d132947c4e3fcef90cc6ff6827a5d7f9503712409da406589756cb5403eb042b5514fcaa1c26378dc5578b55d5ea39bcf881e6d072f70bf37313142c26b75576ae333b1396be2b4ab08889cfd8bb73a6dab57700821d132ebb032c59a6794ce14da889d5d34c991e1138acd9ceaca2866b2b33c6526ab6b86323367e314702538b939cff0a753643c999cd5276601aaea3d40198d0172f6c7105e4355ca92b8059289457a0ec639009cd4a3d2b6e72d23e73e76b3c30908cc95720dc109dea83777956d1325d3f3ee63bd1db5e23883c5908025d1e2428b2641608a30c88415753be784777f235344084e83ad08bbb9a899e7b3d66b73b6ae7a210e86f1886a88ce6c4d6067e9d65ec4e756bfa94e8793efab25761560a5974ca6698600b1f8759dcef24478608a620122b899f26fcbb8a4269404b30855fec8b0598ddb314342428895003aa2cbd07816bfc001ff64e6b69f77d596346dee52773d58a1eef5062e8023657fa09a6064ee291364d1d3b81fb35065788509128422ff1fa9304605a059d30810415740abdee4e720fd4caea53328e97ca1928414e6afc954b079bf2498d6d0b9e65952aba76b2f18097f70e0b3cb83aaa0c8e8e7c963c49c498378a7c7a361cc71012355924bf7208514611cb8e9f836be8794f0dcd1b2dab37798d596a79ce9fe531ff6cfae4a552c7a5cbd51730231d63c6810a5f5b531ebea804aa128c770d6c5461247564b9988ce88f34d55b99b709000e3470be8733d4ffcb56091f220c451cc5fe8e275614e98618c2be276ece15895256f3a30a52f4080e35c2b0ed33b392a9825eb46608119b0ca0c250720d4950860b44b6fc70382a5824017e9ff1a7691316d405929cfb7c1967fd9061370a185ed8b7d9a04c958ceb752d863c3b7551c718df2a341ee13d0209e77de0d5f07acc830ca80b488244f19b58e9e6e489febdcfcfc32df44ccc1d9db57763f9bd4c4fce2a58a7f82de8a172224a8ba99b2c786749bdb06cfd19a49917a7bda14178ad2e70353378a289b9607471dd334b0a482b162d0cc3e64c64ec750ee952c6850d34968cc6e372ca0e2c12019dddbb05a42ea3865581122ee032482dd1b0bc562a2dd8981af201ec970e95dc4f08d7d4d6f49dbc1660c6e1705b621a8821fccb38391e90243946115b8d932b5f041483c4a8bf71250480a78488e4564cde6cce93c6c3bb9b3573885333c1c0253048d3dd73aefc3a5a0d7b5675b5f10bc74760a7d2a97b42202cedd29cd06003fc1e11957d5c7e46c165e8ac3338f610fefc82533c807c272fa32ae98ef26a2ddbc2889eb8532b38106c9e0243948e2ea28cbcd8b8f914db1ab34466b38db065130e64e5050dc45117cb4b7e1c3040a8e0e1f220a71597bd812de11c8116e06653fe98877806accc10f71585bf36c315cc9c2b7f33cfdc9c3ef8619329419082d206d34c79c4b7dc0e39910fcc31066c6e7ae376e71cc35aeba410cb22aaf12d2dca69b78af4c83da63e671d9507e89d35c747fb912cb285345a16a0b342d50d347c2c914079432323be310f373b33f9d1361563683f9b0500119543fd5c3307c0314733a46611fb6a256cb981a69fd3856cce57ed5328d07d5a1008e0ade13ebc9a64f08bd8f6aeb08b711e9c461a3a178ffbbbbee039e069c99ba20c5836fb1c7012422b6f2d6b74405fc0bc6709a42bc13e86ba8a20dbe3713f52eb014ca701bbeef4a0b891d0ddd2d7c1af20b7a9aa7e1f3acf4e2fe481a1691aae25b3b6e583e94b60d3a27fd79dd76a645e25302f87c40c916239db8b4716d7c2ffde5dc711ea13612feed637d31eabefc7fc163f1f9bcc285498eff66835e36af518e8d180215ecedb76d8fa0f11a67013735c3bdf6aceae9aec3105e99df212354d82a557d12cdcec248fb3db5ee88fcf2eb2eb1dc185ae8d264610f09a50e341db7f7ab7317ab0bae69870e23afefcb6872ab78006241bf10e3646bdda9a08d9592e891ba77629c8557cc64a9c185723da2d0f6d115b9f35440f589543c5a1c9a0a3689d42aa3dd551a48ec3bd06fe0dcbce18e15f8f82864ae9079e833ebb4547d57ef61e4e84aed93840be9d38b4ae8be687c1bce5c8671b3b0e889c640621f7e432236f4c689ca64c2d39a7254f45b030991bd623f054a5886dd470177540bed13af51aac6785bf18cf687f310d13bbecdb59d2e14f528c7891746e1c3036c7bdfcac68c16e1b8dc8a91f20dc85f4111b451849db18f0f10b38c184e69fb64afea8dffcec79f26b91701984336b4b031328298ac14096b59f53aa5357033eb9263066c91b5d98df69897c9d6ccf9fea5e2ed702efe902753389839c06a9f65791a3c41107ed5be1b30a48f48d3961fc1948641c0668a35e7a003e59860752c4cd9058518339e198c3ac40402871d3c440c40e92c8d0bb935f407b118ed400b80c2008d12884ab40c5f6a3a2d5c866a3cf35bd61988e25491865308c61d21ba28fe4fd32cbb1c9aa062fefd97b166a4685b749e61c13b8c1e82195299b56d1b442201cf5d7ef3f915cc20a7f1de1d140469ab273a1c795f4489b89865693f0f2691494eeeb91de93069b6979c71e40e430063056c373f9ef1f55ec10d1a696ba168e9ee28dade51ad9f5ab5f8fd18ff36fcc0684c4256fddf9bf1e1d7551c1fdad26fda83a750bd2e370cc566a3b775635d7f049989954b171b03f48ab5b1e33f2f1552165bb790d146458c99d54ce38c65f18723abef30558c0d063ca7aad694460d628059063b16315492a9231095b94be6ecf348bbf948e47809f6fc2583a382374139650653da3598369522028511f890411e229ad5f3ee6a1292f22a08dfbed0568ca04267c0228904f3410a47cb1b1368a55fb296a7fd8ab2c49f14ae4a45450eefce5326c5a1630e6e14f179c3f4928acfbea5fc7f8a803ea264ac5d67fcdc176dee0f0d63f2d330d0664b11a74311488d83d552d1777f23b604acb3dc8adf54e4a9b49be72f572df4011e9e63edbb7da60022f291104a009e4cded9b362a16dc0b9d8bb72c447349b6c82d56285dc961c524757dcd4821d136b2ccef38f09b994d88d4e2ba9ec23b3f4a24c53e016c5deb0dabb305597c1342a701f8db137acd393eaab07cec87fa80b251d78b18dbaf904aeac4afec8ca8a2c15302ff9a1e83bcfcd9e5ede83586e3dd05cadd78ac4c3f5e2fce8b20e9ce9546c19d0c51893989895000e56dfb03ef37556966829be310b0ecae3ba4e25c55ce8c04ae0eb843b9c1484fa0c0b9226a2710fbf7a5fb9ae4bc20755b2890973603bcfc629037d35c7776f6a28940cacb2f96bc1a9df949b094a90d7c9fedc4e28c6fbb4498c552975b6f58b63e2b3bbdfeb9841170823a8899ce7f23560f81b8aa64f70f429f0e4f3822f324d8623de9b27d4969a74d55ec643139143a0ead3829e5da5525ceb24fb6f498aefaa0f75901b5f1d20e6aa877847600d04057321d1aa74071d231b731f6b4f8325ffb37e14be380172e0bcae1bc35e4a2dc22aab569017ecb3098381f7f16f636b6e6a5b59e85fefbd648ea8a2f5e501a95295320319acdabb13fd6648da3490d745bcf93e00561c950ce6866ff8eb015e71551021feabef0429dc4b2003758de2a88257622a6aa73381aa16d6ff35d63edc9e1e57a62a059ab69e767ed0e62bb6475338d5876c4c6d52e6d307088f1cfc9ebca9b942f987ab8fc06fa7ca68e34bb2d714402998f7fbc39273bc25a17550debddb338970e59e36543a4adc3ea2be41fceb5b46681a72ebe486186fb60f501ece2f655662647064845a6dcc9bfd3d372f0c40f8823e42464c7d5e2d60cb945461013bb5ea04bb23f797e82c617a5d4d2223fe7e6f8f09d82eb45368c2ce18a7021f8a0f7cc91899e8d8105c9cee3f83426c3b2002cd293931651d9c9157428089c847cd52ca6b69352e29ac6b010ba3e78708be0ae5bf7ad0d974f0f572d72a0983498767a65fc4b24a299bb0ec4b4d5a15095f58d0119d20ece2fc17a63cef07d237152ded77a788d0b1f271035b88822a18ae72a7f2d389ca2eeb12c1b3d459856c6b23226a79a0a47c338448e37889b3cfd701124d33bcae87006299db4b1b9a5a510f8d309819aea31ec24a5460fc6d8a64f62ccff5767d9cec1cbc8932ea55f511cf668dc1c5d43734c701b416ef1d774ff35cbc3ab88f8c3d9601393cdaa071b61d131651175c342c3d82e6a8aeb598ed80cccf61540cf9f38ca342aa0cd401d8186af6fd71142ae91d2fbcf1081f961628781b96217f4f5135c09f6f5b38c99bf94d711e9fead64ed2d1f09fea19d75bc170f323a9d3022b1a34a82b71714a6418462a6f08c22a38d8535c3bc6230fa15781eba2c926ec6faeaaa2b2fd6052742ecb5c14c09941c8f9bdb362917c85bb1c43e3135996361063184639224027851dc500c461ee6d490580350f9c47be189cf4fc8207c5a88a1b9387bed77b4b442cbb23585989196bb75d91e13b66e2490223fc5598b356ceb2ee703ba5e61cc1153fc637b6c7340acce40220bf6afa51d05daff981ee3667b03cbe633256bbdfb1821247d356c276f32fcfdf7a7ad0aeccd444b63c2cad2edb35bb10e1f1bb727fc9bb0ee0aff55b1034b68d2ac88a08c8207804043b1018ec785df47a51c10f8fcd9b59a68295e0216a32b6a6ba9e07b17a0ff081c433ea8a9b8d113ac3ed8f30ffe38a96ea068ef3fa850c405c98a14d4126fcba1715e051da43df2f58b93771e4933f12b71421736773a1cea5b9e5428f2cbe94a89b697588d34633310406617f217293a52b45eea1dfd20063d102b69ec69dbe3ae510d1087556f043d18873fe5703e944012ef206afe6972febe612cb780cdeb03333985d29101b08a40891ef4705af5024de5943618cc1c38a492f5fa5bc42098c877a650be4acb6c68a53236fe729201209398f338d6ff0c4743e590dc80ec734101e64296d65bec59f216ce2072d681de7a4b008b1ede67be3edfb450c36bdca9aa13bd80b03579c463327e7bc87dc7a227f942be91f042e21ef6108d00fb1e1a325803fb07ad9a7c8d76a7922068b5736a7f64af448ddc93aa779963d7b138d6082b8bc641311b0fa02a46becbda8832924f08019988d423a30e0297ca9da1c5da4048e1a09e8dfb74fad3824b9413a3a2ed794042311074c81ea6e80230a57fb2afeff0eceac7f17b8a9581304b412634d1c448866e3acd0c8044f4767cbbbcc51bd65edf29832ea0d858c11cdd0a625de38b430a6e084eedfe7b187c15fd0a0005c455a887771aaeb7688eb731f32ae65f8e13f12540c8beac9232c8de322f2bb22ee19e356fa241d228bfed7d54d41887e1ebbaa697232e2695c2dd9e6ea631a7102d2a562148322c4af66c03e10ecc0c5df709c014ec07677ace687612b867775678bc0ac2dfbc3ddcd722637838b49af2a2184bfba7221af3db33fd015815638d6bc19fd6a8beb146a3a5654696aea76448e89cc06c4dd677866ab9dd4b568e4c41e81bf695ab4d40b1422906442e10ff2c6e1e10850f6c41a1ad087202065388ebcecb2add9c48332dcfd7c248f335190630e6b967ac6ab4b36c8a6a810032c42fed9f1c8fac16984377f3f294eeeb9b2895743aca2e7defe6dddee9fbf1fb883bbb6809d9af0c61617790f36a2172f7a2244416df10147ea817ad838f0591e37ed4d03891991d856f656491be096c1933e37ee8432ae1be3600c40d68b3bb290ad576db4587aa10e4fbbbc420874e2c12625d0689d0681998442d2d9be4232965f77bf0b58cda5ae8286e87b8f2d885437eefae21899257c688d3e0de7c4711efd832657460984a0c11c65f69046188fcfceeaf1e59b0f832779667f687df9eefe457a89cbe915db14510945f50f7e365d3ccf0c23aef2bc676dffe22c1868d30f37ca963402fd6b483b4edfd3424267c1d3976f5a0db4316112b1218223ab75d8c013c84b52a8782471e0f583e8cafa7687f661ad1b4369985d5f5f837672a45e0d8111e959fc0c31377e06507faff0a01cea18a968561f4a51e996bd3ab3a68c77c630c31a1014776463db8df50317ffb2dcce5ff2150c46920281022b7366e44471ff8fecdc1189ae0ab9aed2ba9d822cf9ac2b927b50f66f48aade429e0621afc8044c1afc061e23a60df3f80b5b1afcac28a4a686dbceee0a89b4d550178e4ece51537a5c812670efbcdf50d1468520a765fc9c7f3d45010617b6b5999e48d2ace2675c1f819084bf17fc8af6e2e42ae2a645f225f068cb00644e07a7263297bb4a28be317194a0fdce1204ecf7085137ebca053cb10a2c1c2b3716519ac2130a6a84f891edaa2ef17a83201df48be717240e6756d8e1950c1b86ce0b4d911dd36305184fe64345258267e70495704210d4d441449279a18b313420b5d1430d2893028970f2592fceaf48e28d2c96653275a79e644a1c5bef802590a4d691d02c75754e29e5cdb6ffcf2b20ef0bf372769fb56e38ddb974280fa99703d07265300630c4e01eb07299b97c1e60d7d17ff2e7033b45b7ce2bdc00fed950444e15a213507b4b835b562cc43ee3e742fcdc2266015e330873605d06e01c7464d909dfba424c60621c734620b283371249b5775ef45c1d731f95f8288c44939968618488168e9016c7329ae6ef4f1208fa480a6c6030872ffbf40e2ec196088adf6608473576b533788fba0a2e7531d5aaa0723d3ecc4f8261879f5aa31a3b60a8a824c6cc95a0106c7fe1948b20243126db5004140f611e8f4ac762b6784cb1789fef7a714fc1ac4dd86a645a63b5d83b69960c99be4c3299bc064d6e41eaa0641bb05b2df9f5c2bfc3a30d9cb2a81b74085ea37d395e6346ca14b4b6d09797aeab96cb4997c8e63681fdc31a978f20aaeb084f93c524403ebf32b860a3d9634c747110ba0be2a93e86e38f73bafe6f97eaf61c4e72d20879d829071e2c68cf478319645b20d1cd48990ebbe7ed6cc4fb6c86cac19c99643273d8226dbe756b78b4e47e1d050fba986991a89c0baded0d2d4722ccd51f0b2b384056ac0ebebdcd4e26d4e6c99b9f1a3d3f03a0873d5ff3c7a43fdbdb57ac3ff85761e8312cb8e81263672d633a495840ef76d7914c68f5481c93a202d75afee48fd98cd176036bf423b83824e5177c164690c706d55b3e95ce69e8fc942f477fef7fa83de7f88956b1a84aa706ac272af7999dceddc3c2f5443b6c7780fda4b8ee00f576590b8add6b4e841caea576b80a588fd6d4ad99e252c09e07c8c5d5e1363b2439d19edf337011cc38bb620cf49ebc1a6a8c22f0811513e655c048792dc64f21e3692574eff4006037b5cf5bd0bd8317d15aa884d0596fbe295c0336d138ad63903c3c3e6cf7876e701cd911d0641d203dde38950032c62a64d12fb52b999ec62ddf3f2618ebb1b701d48b7c741834a876b7c3a6a986246bb5a7f01a7952dca7b0e2c35b50b0e551f44f309b4225e98eda0aea7649b79c1d4dec675212d8f62be35d6eba0184709e6330bda2634efee5715611bd0ee2ccf86a6b8b226323df6a668ffb22f5068cac531376463f5020a158d983c4822c859d9457cba005b94b3eb12852acb801ed91e658880cd20f4ddb4347c146c280cb54ea5688f0e0b71019b83661e1bcaf53a7700b9048582f20ef8ad93a0d579ce691f78530964c51d7cf1d61038597b62b55ab0fe5c051223db485f250a970f3600c384418f8f4c9cb5d196d801191b8ada728182e42685e253d5f26ce0458fb757a9cb4bf3b4f71ee03cd3c81c4f2a88e1afa053f13d4394aeeca31dcfbc2dca14acbadcd2f2dc551413a221bffd715881df9dd0b1234ae919af16ff1ae18e0c3fad36f9670c85b5130fa86b70142054499d177d4dee0eb506453b319921f2955ee4c99e8006f338b0d6f4049a13c04e7f2442da35c11fb54ccabe779c1d6863cda51152b70a8950b3015f421a6ea7d270dd2c7a1e565efc3f4c122e18ead44e4dee531e094b049bf75a8a97b3ac76af4635cdca89270fcdf6b0a1e2c9c3b73444347e9f0c2f64518ab5b957deaf0f1663df2de333b8162a9a215a75c12dc8c511c93e8af972ef9821004e8639984f3eb685aa762028ebee7258212d198c0812e31ae113becfb43de7996d992b973d1c7488518b6d30e7f804cbb3d1984aa18f1d31ae4c09f1241bfd36f0446dba22d8f2ff7619a0946f01a88edb2af3e0ec5f0841f4f905775b97255c3975aba928af4347a0fdb426130cbd3a8be545b72bcfd4e830f78a45d8578da8347ee2c6fb3d89a0bf4526c74138f32f0b02a72d8326684a4ec003f7d80080cc7888d3c1bbbd46d6031f9b343d8b3f4ae5624db7373e38bf2c545fb7578c4b284d7f6793aa76f538b907745f85eea150c787957e2dac823d0d315bdf59aef71c07cc2a6ac0e64c5934e4a00f833cddef4512991a762b833ea3dc090b714a889c298e993694a388ad55fb833b315b112d985e9b77618fbcd0bba17cf8dcd0f705f762485b100a7067b174580a3eff1dd56791889f632c733d90846cf8781b2c00540634257e0b9498945a704ae0d7ee0c1474282c59f9c1d8cddb97fd6091de26e48e89dcca34e75019a2cd82766998a46cd5056217d2f1ec14c1f1a66d35d7cc3653f6aa4bb957f43b2d28cc4cd32187604c9f295aa04fd038a302b5aacabf079424dc698c0fea55919bd93cfd860eb0207baa0eda1531fadfe0bcd38845342bc69035829ecdbc61733e26e941c844680baea6cedf0953b795d55e57d16c006de2b6a55e13febe70304c118c48afd83a77c36f578e83bd90b376e9c109b8fe2634d69333f5b7dcf74a5b68bedd9284131d3c1fef82fe8cf505fb86ee1d008f0a0b9b7352e1f1c28448e64d671f54930fe805cb52367326344d846ba474d332a74f5d36596e1470dfc4078c1bc042d816f48d234b2d29ef02d4efcd4b68a07359bfecb58443d1c5d3312f8b7cb093057f813eaf251cec4145dc2aa65d6ee17229d4d839cf897eef40eb6b85b8970cb9f80242839635a57d10bffefd8b72211a3e14120c7913feba9e0a8d157bdff538ab9c6b17b4c0e15a8e9b61b84f0c5a7cd87b4047219aa5e5f2420d838f2de7275b934293d36eed7b30c6ad5e8c2f2b8cfda3eeb59b3685787b761e7e6b538b5f6b34fa179c1b2ee6bb4166736951fb6a269945c782f37b83353ee859c2ba2c7d01d1b6e61ad001beb1016b04f4cffcaedb06f9986dde62266fc5fd3cb12584b17c9dcda7046facda4a21ead7a7b37d4477fb49169aa24aa0931992974bdfbf1cc1537b1ef439d2e0a763bd1c91a2141f8b5e8e6f0d1c89d4f346ff93ee1564342b430ea68e3254ed312bed718fe263a2d01569c977102f7f408923b0427e5d8052191b022346974d9fda0169aa1c7a75d0cf8d8fc97aa1c4953ab52adfc286f7015b82633abb05c9368367493ec1aa5fe0e00e8e5f067c1691602ebcb1e32a4b003af59aeb05e9fa5ec905c50eea23185c493dee81240940b480bbf7d8b836b0f52de9c9c241111168b05ebd061968d22e5d335323e3406ad14e990182b772a9e97ae72a8d6db19a4aa9d098fda5d277f0cd935e3e025b9c07c90bde7176e987a0463ffa405ceb1f083a9b2bb773f33d6cfa6fe3d2696cfe88cf7668f9c5afa71df1bb75bf35f8b59b116bd2e60f1a1fc3116ade6ec7b8b3ebf636b2d1fa1acd26ecfea01b4cccaee6ed0093dff1f2b7dbb241a5d8f45c4c63393eae72eabeb3ca33fbabb05679cb5c7fadc06a0ac577e79b26edd3cd1f8e808e36f087ded9dbbfbb2517621f5c179278d989c1709c15baf5051e890f0d88f24523f9ee98c676cb289316d05a211c51f37628c4eff4f9bb4b8d1dbb914cd8466b5334028dd9cf14bd039072a2dd91deda4c7e7a4c34fd7c59a364a27a880f74c92c8af51576f27002c621c07de88aeeb015f28af2e0335caacff5d90156791be9834befc82543485c731529e75b7f15a39cd28e9703aceb142aa2064d701bb0b2f71d9c97182f8d5c0b4a9f96eda611807005f18260654470c6034d3d6d0a263406d132557732bbb02526c9d1ef6a3a8efe249a6ada2ae69e2988ef46d553a573b17994d2b9fa3c4eb466ac4e19d2efb6b68f7f648dde834d2557740b889b1bfc2cbde94249e6c3ba552d06155ed24be09c20a310e89e7a8999d7f4313e2b001fc351dad9cc81000959289762bc76750bb88c6357c7e1815a3eed994d564fff6b2b3aa00b91ac69d1b0ab4592de720c9db3d5f0a6fb818c350fdaaf3c509fc428f4961920aa474aaeafe90ec2d1ab850019e83ddc14d0961b5742c6a0e93c93d197ccbdba42474b8b17a5a7ba5b465d311f013ccfade23d07f4d6db33bdfa007a7186ab8f9075a127c5533618d1286dbc4391a9b2e2eaeac9a1bc41f26c4ac6c25bd6ffacb24816431836d51462675b5323e4d900dbcf144248336571b5a519702aa54c55fdf827b314516019cae05446084b2c1a89e1b9fa02687ed7f3710ad5af3aa89826c09430eb6199ade3a7fc9a64a8daf07bf1f259c7e3ff52c6373d6806bad5446b9229e94da4f66f5547aac7b20295a1e0fde63b71453c065251461423fb6920c1c4b22b2c4526ec1dc743886791e7c35826d3d871821332757e70e265f685fdd8c259de0556b01d4834d1d365126d765e6e0d3842551f81731d139a81725eed6f5367680e73adf134d29401c0d97a729cd85cd7c8c4763a12b63a3714ccb5b4c3740d3469725c97f25147d0ef6e75e3d7b4568b55519a2a94092edfedb4e292d9ee74491eeb24057ac8f9b10fb18adba71410ec7af4d0e71016d118f6c9468f737d8a447d70d89151c460645561b40394d605b74573179d27a4270828a2f0b4335345f5e0de95718739999127b2f59140d115250a90196aa2e656160225262a6e69a5a0c8a4e0aaac128a9a14aec2aaa0c809c55584d59904ec23e870e341f70193c53704da9520ae9ed547dbf724ffa29cd4478abb76a4bee9b0344c98069940a47ab8f61c6c3f14b6d9211910dcc3321919301497f778aa92962f9c62e3a2617abaf904a0a4b92ec9271859971e335a4831134a5a897ba0b49027ebed285314292bd72ebcfc838b7dee86449bfe18af38c3b645d0e8b3a09237974f1ee83551c9b21b4ad684c98a0aedc6150f3c96c0c45e429f1e6810d10c8cb92d0adcd2818f229fdb54457fdb3bba0ce4c28381bebe2f4e95ba236d43a65d496e3e5036262ef8af27556a9ba87b10c1ec14059c1ddd655a9306883a3ef765b86cc7194f6b9f8ac4eceb91c742858cd06dc0927300a018797d90bd2488458341bfae8974470c330731abb7f19ea41221d18b67a0e308113380c2103ad32b4c423f3e45da9a70cc331b47a6528ed18fdf70a235fb8fc611c2036fd5c1478cf136e459541b583f3dbad5fe24e57464179ce34dcf59e5b7b8e19038e805b70323de9441f126c3fb735f93cf0926a8e030af2c39c1850df11e727e3c99e17404d6e2fcbb7586b029d514b93163a6eb9333029545d96bd0bf0e776ad80ca3211ea0e5dff86f1469126667043d215a751fdfbbc007ccc4951137ef0815527184b099205a634400a567c02b641850d1a74c1ef26b5ec5b5cce2d6761351a9e2dac4301f45faf654e0c69c00161d674564eab2b8f1b852780f1d13b2b077e4d8634276c936898e9309a103fbc0de02ce68079453281a138027a925ae0db64ec2045ec28b92d43a241e96eca770f78845fcadc035a5cfb5daac514aa48c81b45ceb2c71a44812a93f1a2e6fade9ad417c414b045d2d772190b738ed033465f78d969d979f9e64aaad59dec6215ea1e50c1540dfedd3aff73f2f508bbdb7ae1d811a4ff7c27d7f8fe947e46bc564042548c3775c0c75077e833731921a9fcc5e34508488a7c9e2c6e6bce91ace3c3f2794f5930bab94b2fe3444a2cc46f15f4d4213e78ac06f8103063595d291033543c296ea85cd02762854f53cd3ee090336861a9caba32e1276c6bad34b47ba20983a23651918e4f879dcb234b0dd48b75c2c83e1d8c704b76af81caaae88397cabacb0a9f2e9945d16ea7ed3275ca69bcb2fbc63354388816e1f39bf518b91aa8c0bfd536c5aab6fae4237a8360e50d7a7d521ac02c4ccdb742594aebd3126bf088a21490559cd8042e4d064b005e0275388273075349f9fd4ebc7e07323761094c363c660bff6c196cc81b61ba0dbce42db7cc3be78385bcec67d587bea8c82f8b80c46e7c3eba0a6ef17a4794d599aea1f27637de12ea384d50c4d81db9be759b5da551a014d84398a686f0a8d342544596ffc0193c23e11c1635a249c0d51e8686606f7a690199221ae2d5bc4d09882832ec13925f85e087a944a59511bc55d47c9d9e9ce193a62b5e323d2259eb0bc216eb2ecc55f4ff8be7306cf1d010addf6c9663d0c9ba50362494141cce4ad093146af1388ffef4e202a5a9d526e005ddac2346e2186f74ed0a735956293968f26fb96637d39a1a6111dc0be4f5c269950ea9a48b517054282f0fb9fa511c9f0a7f68a5ec000eb891d9c6aa34036f9f956d938b770ee9da52c0c354467993e8bc8f2a36c4fc0cdb713eacc7e2ebe5dc89675e0f28c03a7804e02cc6b14b332d438fb84b3d905ccc339ad0be0227b49da8ffcdc82db6529140bac6db6cc72c3f88c557fe1e1e38a4c2160428b16c7d9fe3b02f1937d0467d9b3a9e4a274195e1a42cf30297abcea7c31bfc0a9dd00810ea892229ec0a1a536aef95b8bdaad28081fe36ef58468b5a947991d7379c9b02702613e05a614f5b2963a0ba25f62af17fa973488da43974f9458c524dde8b847a14779653d1f8a74cd6dce0d938ecf30055ca210b47f1d5bddcadee206a82ce5852343767ac014aaa17f992494debe25a1e7cefaad09aa6c0d71c1663bf78102631cb01720501909d099d8c61f69888ee82f521efd015ba2f4338f05d79d694790533657fe62df82b76c5e3f34555f9b2f0388959eed41dbee63cde7829eed34938b7cea7e5ea05721dff8736fe868d0eaa79eb20ec7cb0c40d6a0d8dc4d3564675852570e119ac7d5c3e6263f4b6634850c63e241af1c1a095c0d4fb66ebc9074091c20aa1e71a78b962d0045581559738cd80f035c03a7b7f04a4f7e2566faebae7d8d05ab4fab526033d6e7b680eb06952c52fbdb5ea0efee01b94e9ef0aaec20b5cc383e79851af3eef1384219122d5f64992c7e0688242bd339ee2634302f8372d24e07cac434d5048972f91b5edd8cf1ebc8bf592b849b28f2cb28cc53e7c58c28034934eb3209a557c65f877c519c61c0e1f846a91f5bc59354facba84c538b4644891fdfd7f201690bc408524f42a18cdeef077454b5666c9f73db1947d315b6704cbc03749b869f38cbfd172f23508722bb45022e4d2d19e3473b78ce8d8e7c76f6bf2469b91bfedf7d434366dec9cf446cd7290a477a6051049b9b3a2d46ca6ce6106f380c42aaac2546dee4220de8025969ee4127e03e33db4c750ad03c4eb47d0d09d00b3c291b78f5ba8c43f22aeaede4c608809258d8404834e39fb0b0a65325a7bc7952642a0832599078e493ec2cc06660aa3b209ebf3e6be44735f01486b19ecd421c99c9db0c8bc9326fe912751b93659e966df19f2f612ae60c45b30ae292977d367f113de79923af9c830616cc85182911151cee510f6cfc829299aa30d54d4e1dd864e5365506f34674402bd2ced601227389e688ba5956fafa4c23a2afb174429f836650d6257d8da882b62547ce502adbec9dd3ec2b57b4d1deff2705d250ba7151c148794a88d3d622ac66735dbe9854f69834ab15353ec0a964ed807ca344d36f3a653022dcbbae47f6bfffbb138295dcf295d0bfd48c4ddfab0cfb26503411ee88df07a211104ea46c096ab10c75fb7f92b716206bd604e2da40007b826934753d087f6cd1437305f6a4f3242c7c1037e18c9dbb18f8a986807b1201008519b2e928f23eef5cdbc136241ffb90e3dc1c3861d0b85d0c39d954c91be06dd811ba8a729ca33dd2442d380fc20493822d271e08b1d6078b58f284e13737f4d309234d72e6d7fa95e6e1710102744c75ec0f461c2a95d3a0a5901c1dc2b1c0b77456ec957fb1eb6cceec0de6af21f41200a60f96b564df7d8d866800e91a6710762ffc503c0a8563e419f370470806691e3425877195eeffd460f8616a6db49f344119e9d42cf51066baf2ca66276026e7ffe5e12675e4997a4cd8c7e8cd651c42c93171459053dae1c018fe5ead70ad33bab5b8de79ef610539b72f40c3aa1a36ecc4e6c5eff02706d6b8591b397efff9356660bd4807e7e550e5a3f01fcd1ceb045baf9f801753857c184b8e148f455d5249e83624674dd200a9ba1a2fb75687180b664884a179b4789ccbfe706823eb946f52923df072291c3b3b2401589f1debed268add0dc325285ede61d13c563bac7f436152f1cbd22890f82c8a46e990b3e2d3f83d211cf51e5ef9840058d93e6a3e7c326c1600d1611e37c01c6c371cc1c29144e2417cc74470d8e30e17054339ba0bc471016fca136828e8bb4b08566c25f9fee85345986f082ebdf5a09c34fc9d75f56974e207b1b515d4d6b18d1f1e80c006181508762035a080cc99761c841efae19dd4d64da264d051270ac7fd81dd99859b649b2372dd2f690402c73a9a963d028c63c9284d99c12c9da83042ee40dd5a34d742ee56be3c194041f1470040c51d395fd8c175dcd99b2ce28edde0c7e0d70da0bb2e5ee4a050b578eaa81dbf6dc41ae0b5b2e746ac183cfef5321ae295c5b6a779341a0959b2f83f289269c5b53f1ad7f9894e3be87400e0caac44495b05d3dbda2f9d34f5db7e5dd1d8f9b8aa1bb6d2b266f96fa9ecf798c2ed357ae93a542fe034f72aae4aa91ca5e3f62935ed202ce95416706f5edc7a0f105263c9d2a3391307bf922dcc8b976a404d5076bd9d2c204bf3e91e4be997f0bab2612900243432e61b61215dc69aaaa13b8e33809448830ffb59564086c2d064a53be483cd4b28cdf8505d1a6417342641cb243c6873c251cdd9c1c5a2ea9115ea133815435248a15459c6d145671d27988e5ec0fddcea6cb52fe9fe3c8a8dfcf85538e37fcea54564b72bda0a8a42ff3c42e1b7ed2091c8d1aef7085d92981b0fa4222b46f79a30e0c3cd688746dd05c2c4c72066be4f5450fc0dfc4465a57c8b315d43534d22cca73c6761ff9bba1ee8774bb6d76c2e682c101a538c93e774f73a84a8a7a85dea60e57ff3443121f3317198a4d5a4365f674d2632a4f0540294ef755e6b6818593337858ab791bd8b6e54ab6db0c4792f4aec1a247db3c0899e631690f53fb097a910187f7ed716b162e46c5d173de79a653e0b06ba9bdadfa43a224b7062b78fa6b4f3842002c0c9df9d8300c9b6b54f21a220f963312bd44cb0a3bfef9e79d21e3de39e9fb34653b01e7da5a8561303f826192fc9d6b0b46645cc376241c965282484a9f3ce99ab394ef3cc0980a67711099da8d9474bd8e21adba8a976cd2f06c738c5c6176f77b34b3cf6a73d0ef2fff82997fc88fdbd96f72a952a1f3e4dbf1e464763952d407a198ebf0501184cc938b8465a5069562069869830b198f5786fdab6868085b370b817e2a217572ac859e83f497b84ea0a0128e313a49f2f868fb8d9f3079f6412b81eef22db75a6afffdc6f6f70059f6c07ce988318633c84919a600b725a67f324816c5788ff5ec524c4428fea728b45f5a7802f99b2dda7a250c5c44b81c6053e8d7d8193cb8495b419e70835676f716ac7bb407649242b925661e43a289aba3e441ec9c5bad564c899e6245291603a1808b4c20ed52682fa9c71ab164b46c14c31c687d9a4ce9e3dfb0f054b906f11b135953815ba488134207e5f03781f778874ca5d2dc24add28b70aaabde8203a22cbee7c14d14fc21e5dc529d129803d0affca1931d01c83dca398b2e8a010cc84a98c260c3ad750d18f7f5e8baabf579fa39184b040458921610be7498403afb0a575c59805a8fc53c3006d2ab15e78718b6d5fc876c55b6752cfc6418b08893daa92e0ecc55d76feb897a4a20fa80c9a0be8327f82295d87704028c26e04f58fceb999f8149b886c0dbc060e7600410a5dec8f1bfad7be3a628de3e8fe782dfb9bd10fe898e4adeb3155dfae1359abff85f06d70001d9403076c80f1210b481c68b1c21593668bb91b494a5928c277c47ce152bdc88cb25930033c203cc7e971ccc35c52767de00d87455cc10c507aa8b2bc2f4a10ba0c741b516923ee6ef19df9f27d7beb81a03cc285562a0aaa17b35e2838a3eae64f531903823600c3edd8abac92a2cbf9e2cfc8612e5f91b35a5a61029cc1761c5c78497c7428531c4d02f271e0d040f6a4d13659135a75009f05b0073d6daab224f7c1cb17c4a004ddcced62a9d9920892158a07784c9e48ac9fca26c22143d827a38d0b918361ef3b13cf9e4d113e836e61e8c8a1ea2234b7998a06f1b8bd47ceb02577240d84037dcd8dacbfb5f1d5048ae484b243b780d0b74a614ed5e8a42602783339ad3563593d6ddee1015ea05b405f4e99c8472431c1584e80077d2187844140e4c4c27b8cdcef7965332ebb80962ccd133e70bd0b206ceb24a059137e1f70d997bd344cfb4dab0d96cb64e5c3af00f5e867ab01860503f1c110ab3e5b92e71363e0efe38b94b806508a5a3e017d36c09dc4aa2999665c604e25bfbc07b2d7134ad7d700a886fcd3a99f822f3d7a615d03a217761ba117a67194069dd614fd3a6c3e711fae51172e56032566f9eda875088caaf9d5a082f2285f5ab33117b5b6f5af2c1254e20cc710f59fede2bb1cfa9f86ca83a8f04194fb8300e22cba368e9886388c5d4b868648a7a21a5dde2ffa720388b4d40b44a63be63a3ae0082a569ba1b8829d07a8d9b383c1b112a666cad768a053b534926768837cb5dcc2286543493af91e75be416b9a1c22f50645c902cc9194f42800598f688a992bfc048f4626cd3416c34b307a007bd4959075e095fd6e2d585a968cd687ab075a8a45146ba7cdf5df4e54c83ab383d4a68d065805ff7261d4626adbc3d843470fed256819d17e569577ce68a7895a4e37ce9715a7eaa1f25c0a0239510a7a566d4a80dbb9b69eb608877bc217fc5d06fae05fef7e077e0e842821c899f310a9cab9bb057ee37f1c38b9d090fdc281f720401c3750adf941e107c0a20a9eaa0dd9931be6f4415026b7f1ab738a3733d2ccccfcdfc0b879c096fe22448b5b856738903b553837083ab06c8b3f00fe9f17a293f41ca6ed3fd5bafcb03311928d80330217e54331c5761ed1a4e735c457a544ffd829fa461a4cb6223c61d3d2bb06a55833271dda29433fb3e5da3502fe3cc0a0e18036d1917c2f2e56cd0ba121bbfb8b2f8b5d468c0e172b8367575514ec556d4843713a7ced5a9ad98415ee2eb95352494e5c5677cc7a974992bb868c3bd12d8973ec9185452a3025d2628ed1f6d633586826f423d3f08ed938b6776ec4ee6d4a2e152c032e68a457012a4db9ab99245e4246fd0b045d9d60aa3ef217bc89fc2ea4f007ba5948f51429fb10853766dcde2663b6b36ec02a4d270434103235771a241bf23aa5d8d448cd66127b092ef4120d87b759868eb326f1e11a678239e75452cd01b08992e30ec501174be5abc4edf83fd8a493fcd83805a12892e857c0608d7b29f5b97afc7434c73ef72c65911d5f6767ab75a70d61be36daa18f15c33f1b46b587f185a72e2426aabd9b2eaec28e247fb8e7e777bcc29d02d8c068ce5c73167cc99176a62f9e52307537ff2c3d3c3c85425ff7fe563b3868761ab238d4060dd30497353fc16bc7cb999f7f8efe7b90d96d0c037837e8e88e103f1e64dd4bbcc7112fb85308be8dacaf7c1a7d1757484d0832f20440d78f5ad3df97364f74439087353238ecbcb5a163fe7eb7d438d2503684862a9339c97e7a4d4eb4443103b9b6e42cadb8ca915d1ed10473a85d2c80c572d8e5fd4cedb5a6f2fec1583fff552db41e3c838cac5f7753374587726b8908ef82b8d5c375b38b59d40c6e948bcfc5326f2dfdb28369a4f15e34fd26b8cfe9f74d8407c8160974cec92f5ac806423e08b64bc487073618c48970fb752bd84f9aa0e20cb4486a70d36a8ec5e1b6e8aff462a5666b24834e70cfc85b441d9ff702ddd0ad0a21723b1c083d94e6ff4a32c7fac713bbc8f644942d422958b3ae4b52052a443ae68fdd0682fb77893e9a12197a84b58ff0887be1621116b6ca2f9417433ee99efaa001be62b5106258ac8dfa083f07e6d29d23d559d7f134e7cdb8e559a913a107051267eb0b580016f4d12c4c6748a2796eec2bbd6f158d8c1f13827a03a802a71f740bb978be7388e43ccd33278580a3b7836ff74b873b89954fc91221f5bde535ee86346182d3db46ae60eb4566fd9d4648baffd401e9101c55be6d8896f70c4b5a864f5cc1518e76ef6333dd9d114b029bed9382e996576d376ca364621f7399b4f5c6118876fe863fffc207fe4a4004ac3a59576615f05dec6db2ffb407c268d1aeac0b53fe47607d0279b028fd3b6df03beeeac03a5bdf45d6ad6a5bfbd159bfad3b85e13728761a8177be5d039fefddcaff03a3fead8245faf821c3e7cb510fd31c5a3434ae714920ca7c87344c5b6f61de217f136770ec1bd4854c4793f4815579e08a7d44a3800f0716229912dbe501988c7913f243b450a855811a2282bee930c4fa1d9fad4b95e60a10a8bb5bbf2bf167a30ab57b0ae72b6227bbe7aa07fa12a375f555e9d40191cc0e6160d46ee52604808a6cfdff3f68dc3bb17a8c9a257722e9f19cc027b181b4e3dee729151b7802f8152228ebd7a0d50e000723947ca01ec98f9e7c9d4a86cc3f9de6b5890ad5106339a9d2c3fadb598339fe0604419b02ae0548a03ba0b92eb540236144c7d11cdd014d078ec86e766ce2fb0515557d014c24a3a676de6a537f303126a68b538c74803397684940daaaf9708fe4dac14f74443f688f5d8e93b98ccfb0a1b41045f46a6fd35fc347e903c4f470e0be2dcb1b389458490fe8d396f7d78180a3fb31523f7559491c249dc9f247af4f8feed3182937100032342a8d53a6b0da58dbe4c9f06f711798cd648d836f859ceced34fad9debb37878f6059a63610c4ca27988438819ddd749eeb01a5fb9831ee1f468075375a35b78bfef0bdd401a459c4b706f5df376d6d6ff914ef7a812c3caf004cfac2f6213ecbec548f2258c06973efd0142884178931ee9b03dd624c1899466b76074b172030e8c4775268e9df7bd951a1e23fc76a0399c9210d434fedf33e762c5373a30d7c9dabc6f4e3e4657893bf435cd4dac85a036a9059d624e31fd69465cb91f4f134e6a0ef3e97d7cc0c8598e7d228f00fa76d309762a66efa8e58ee4ef266b8b21174be415d952b312e10d6e4674898e1cf906d80cf77c452b27a14eca6d2d94c6f5fb35cd0bac568b9fd68da404ce3675e512fced6cf7eab2998d114d8bc0a84a9f087be1a88bae6b3594f66c598c8760678132130ebbe746bdaa59919c445f48f39757e71acd320feaa25c68e6e75e5e92b4aee84a84c67d9961fc8eb1ec3a347b94a5bbe75d0bdb58edb201735a6b953af03a6e7cbae7c6a1025979e1921d6326e42bb0fba02e37f5c2b88fbd202a731070536237f4e1db96688f8ccfb1b41958efb2cab993a63cfb22e5c572f768003ff3e08c16f352a9ca56dcad829091edc68d8328acbc11471aed938e3b4c3282024d2eae42ab1c1664394d35bced12b4adb07b71d9a985264c392215bd1f5498c7a8a02863f12c99d903bcff43c749e3d23c18e937ff48f749d0fdd458541832bcd06f4d0548d15c1fd711bd96b8e8b26e665c7dd47eade80396157386ee8f6592ebf7431ec13db9c07dae8171809d7111c27f8495ec4a39fd240408ebda62a75c3d91f32b4228d94370068c8a8f45a87b2d126b69924db8ee7894c7bc4e3e2c7660f6f0e66907046a1958ca8fc6e9abfca1c87bdd4ce6ba7671ae2ed05e009f36aaf90a42f81f12f5d2e7091488844aa9c15434b0212f1752655315560c17e88e764a06c75df4c6298078785e7f80485bb7b7e6fc76272f9e0a136bce5c19be1c2e7843b68a089901aa583fc1323b664f3810a6b2fc4999e220645c120a6a6687b6fd3f8ddb24b3743f979f783a1edf94955f847f7f5fcc690b539492cc9a5b105a3434f1cb3abf84663b4672205aa1e0114d48d731cf45d4a1336c4ba50d5fd8960228d9d0ded26d307fef38135dbb1077d200a70a86ef4d1ca51317cce4cc566a88a5015c0021bd35422be272a0a4338736114e4b7b6a1059036b48e525ef018ae0d4dadc35fbc3931f99b36f4b21b7adcf1c2ed52b445cbd569d9a99878a937009d7f90f8a157bec7df466d3fb8e0073d03978c99de8133c5c23c097e8fe2be40a946bb0800d822435904e811eca1f3f6ad1470dd7f35363b95ebaab44b68f651f60ac5a96453465846ce7d3c7083cf1633aeeed01228cb1fbee83a6dc788c0233bdc71013bf605c37c3cb55259258ff038e88d4b7fed663661374a9f1873930af777f1955887c7761213ebf0e25822ac6778bd179e4b1a252b0deb3f0098c04323500203eded723c662775ad22bcefa66ca693e2a529024f5d0745a8e63a5fe9149dc9693670680eca2c0f66b99a756a041b306cbb63ee216be8a9872654bf445280660a08252193ad8fa1d99624d9bcd30706d22d957dd401d62c97aa29d11011b03fa2a130c6fb29f20f541f2b7d1e0ee9c8a7a86e7596932d545e798ea7f9a000da078ca5208b03c82855bd916d8d0e1fb1d3c1e52ceaa7da8650eb4f975f550299ac5910e998f9a35191099baba9d57d2867ec0449472be8b3f1ab872ed958579a43257d35ac58a97d892a86106e0f754a3208700f9050fa310d719a07ff8877f38e739aff99d151cd5edebfde8ce51c404a692acdd0942a6ad9caba2e5489f6786f6289906f307c919efc2b944e3fd3a7701bec18279f21d06cf00891a35f24bb2e2dc6a1859311ed3ddb1a8f8a5427999f55437436d607b5cf52499175a9467c5352cb1177442449668a371fd46379ad3f8c1acb94fa10a1b3de6e6f6c2033bf18ca5cf6e2bef8a6c9058c3203a29b2d9b99f7f751e37c504b50df1fb983abbaf0bdc96a54e52fb3b1d14fd850a61fe34ad1cde2f07adc507c5d615379f1b72833f5a41224cc6b5d43a32fe324d075dd40d26058f0256b8687f81419623d66578a2ec112a90a12d4cbbc8800f8c06a5bf3d81c5da549b58e731b7f5037af7b54030941cb6223ba9f3f78a6331a792bed5f528244c58644e0e1909c13e4a05a62fc8080c94f53a05e9083fac51f6cef47d1a7d8f7d792b7188008b1b1c11955477729d55038b951d6ee2e59f2e964bf4eb1ee47a4cec04be04e71a104d53a726b48ffbfbe71c76af40ed9ad9a840539f64155887c3ce9999ce11f4e040d3ec220155089c492c4e7acc3498e5660c94b67a6f7a5b54cf57371fba7b3536c456d32eae568e208d300c017773bfd85bc982fb577a1db88c1b371727d09a944f04db70903cd83779e41704b9873b2e69a5f5ed584791de0f1aa3a173181e2ae6a2d2181af62d34e31478e9a7e98c5fa5c5fdd3197b676468b95ee683019283cd74ef452896ed0b408e668447c92bf3083ee2034a802dacdf15d5d4014564d07f9891bf2f04800b275490c305f1af1b0c8b53941277fa8d4b94f076d1b6043c7f5e5f9999df89d1b302ac251767d07d8ffd66734f31c60f9bc3a04f1b70783fd813a37b8a2df93acbed427bffe88b5b6f7967bcb949294297005cb05f0051d4ece0dee291ad751aeeb76b8f295c40ea757a587a2baba28ba9754c92a159b4d31c96df33a4dfe8ba371d37cba49377fe27bd2aeb3d4ca8eeb28d7c51d5e9d775d17ddbdbddbf8bbaeeb883a8c53f24ca56a7dc59e614acf4fe7ee55c98b87fd7f7ce8f2c4e1629c0f072455d27235f0e91627e38aa4aa065cc359c12a1f8f5f98c1b35c6769d86e3ccbc9bac519f5aa48d67049526505d7705cb04a1ac51a78256d07c61dd886b49c51b7585c92ac892f8e0bae893b38a32b6de7451ef104341205bc4ac1a1dd33ed5ab077c3f9ffae777bfdc7d7ffe36c379e8d3b70acc19bda346961b869b6e3b4ff89af89f372e32b95aab5bf5388787998d2d3bda4089c3a71e3c1c6e118b6dde6eeefeeeeceff1615ffffa5bbdb96dba1944915f790ae75bb6b21734c47772ddc05b24380ba71db628c42984cb9054599acc1e9eeeeeeeeeeeeeef68f31c6ffcec2bb249616bc64d48dde9ad6ddb0ea6d5c740ce3f2dc354d93c9598ac832d0adb5d61a43d71f5d59758074a4aa7db420ef0528c748fb48fe48b626ac5746b266b33c3d3eb1093465d307cb9d42dda23cb49483f2c0bad5752157d2cec093430f0f1f1f5e9009e4093165dc167649426ab42ecaa369b3b442afa0719ca8dbf252ae2593352d934888f25c69298fac1142b6da47eb7c105c4ac677afe709d736aa6d59d0d662b413b81f22f5064377e0feea9f524a893c8cdaa59b46e4afc34cbeeca298ade3eab89472cefd46b98d46e19276b8f295c887a257b3f451682fa92abdac468ee3382afee70a3ae4fda95d8e6e5468dab4ee41bea343ca583b167036529582549d78aacbe6b224c91a14e52c0ddb4d675d15474ed97432817a256b269154c9de82fb0bb621ed046a275cd33f6095ec2d6ad076706b42b148576a38dc09458b1aad6b42b91c05e0f219fc2569a486025ec92f3825a9a56da49640c85ac308dcb7acbd5ab0574be2562cf0a516ead590ba25b90ddc47923592556ee5747de07e0b7ebbfe825b9d95b6b7e02ee54abd6b9a6986515e11dcb711c4d96eb8907b45c16d8a1aadcc41b63ae6c337de02f190f9302262c3721ba95bda4bae5ef205843a2355d2b258b16ed1995c494b0404457674250542d1a55d1869afee90ca34f9d224678356e238ed45ca5501989b4238638303a0db4e925c4722091048a2caacba38a642015838c04f5753b6bb9ce40728d71ba2ca8648e6965e37e043a2ba6ca3d7b08d8154dfbfd8dd56dede7ee852397e0a72b923524a29ade8342436df8afc8b63a4942c3c1dd946298574110097532d63aa5b2cc962c2d461e418d9318cc3b1dbe1575bc6ff51f0f7523d59dd4ac1aa6e87365dd4fb265c6eae51843a23579235a4b68d766eb24626ce207278637bd97e0c37ed67933dffe2d0631c23ed86447b52266b9e6ff4cb8d56ce644b12114181727404841b65179265517d11dcf61ebe01b6f4e826978e98e33dffffffffffffffffffffffffffffffffffffffffffffffffffffffdedfddfdef1a1235dafeffd79488b29ddf6ed34397bbb534dcbd795c8816e1f98cd6d2f818a3f7b669ac624bab78ebedeeb40abe1f769bac61e1699ecb9c8c85cb40d870c71bf8e083542131efc0423ec4626cd1c174628ecc7575776f45180032869999b9bbbbb951603ee14d983fe4acb41f7254db0f255c577777733ed022df1112be588dcb3760ae8b9999bd11a6d7ddec24f494dd8ad438dffb638c51de58438d2a3606528db6bbbb636cb1bd9c56667c96657c2ecc2c31509e6bf354aa8539060c944b0fcb2cdd2e1e3333cbf0802e5bf931152eba19ef73fae134c33bc16085c68b8aa551afabbbbbdb6b4a087a9e53752e873827185c577777cfb9b577bbb72235482841e575c7d7e5c8d239a64ff0c184520eb69caa45babb39c6ff046f2b52a3edcfa9eeee8e8217638b53901aadeb792e5bfaa403aa1217b7dddb04b0971dae2bea6c383a57d2580ca31c184f104f5093264d524f9ec02887241f28f6b18ff5ca27c621c54e44c42a8c063bd745578c8843a854ae87d2eee626a7511bada6596abd9483862e8e27c8882c7c6ad3b1a040321ae14b3ae975b76bb196a51c9ba6195104c9dbe164b0ebfa1e5912c748fb1dd183e4131414141414e4ef53ebd9d7430bc49d4f7fcdb1701f9e202f1e3675dc1dcdb5afee76f204c9a24ee33abad915685c37e218a3265c9354af5838c00b2a28a13579d93a909127887982be1a6ab41f0d35c6681e5f96f69554cd3d86ff448d9bf78de09be1dbf1c9f0c550a3fd5e5f14c18b2eb820c2690835daa4962d603411c22908355a20fcc0073d40e2c10e74703aaad16aa1cac284a01c1845c1e20a28272b02e09daa1040b700022035235058a0c0d8d68c97aa5565ed088a9c5091333513648a3ea75bdbc39ef4141d7972655c8999ba654ff0a53dc6bee9538e11252400dcd28f0dc96325d88654428a4026ac542759d31252605752a4cd53601b525b8f51241fe2b21d8aae8c32a5c21fb30cd9953eb5a75baa5e756bab7181553c6a58784196e3051850aacbb2ccc539e19cb04cf6aab6d205ae198155d2ca367e61c500a6d739406f8fc0352f74abf2ea85c0ee6e19b933cdb068aea0ab71630f174de03352a3edc008b2bd3025c3c244903fa9aa749321e5cc8cb528a8a44a258f2498b2dddaf8c8500ec794592a550f6248b1a8e3811ec9c752f8d8b589750fdb1fa3174b5ba7e44a7ece5bd0b85b4dd95ea130535556d557740ce35a41ba51dbb81fbaf2a384b402dbfedb5fee045f2e920a66c870ef68430ac531961b65db0e65d4c84801070ebec1514617d423ae6bf5efd3ad69f9663edf7cd1170da9b1c6a49438b0fd1eee4897f3e448979312834addd9ec8d28e37e0efc383e8728236fd4b4e721575c102e08c7235bcfe373a69d3e5ee7797c0e11c7f3f03dbc0e9fd33fccdb666aa5f0f4e48468964baa417cc0fe0457b2fd1e8ce379441999c2d3add7912b695fe775528cbc1159e34a299252843ac109b9f275b8240af4411ef63e9e47c4f13dde873fc1eba4c43cc8e9157d70fc88eb8a2699fbf8b8ec3a54891e2edbe781715023514676a9073f25a439e79cf4892b2910456224e2a04758465ad904c748eba24a5c693ba4b15311b1d3ab6ff0eed6ada9bdf59efcec608fdc49613df7391c8d71cc86c4a7b0983061c262c2844984b1ec0a875b91875c492b7df070de402b457737ac87ec4adb52c6379ec88d9f477284648bcaa80c4a7551242edac46dc21483a4b20f4d2f3a932b8ae44a4b91c89a169d5199b3a9a3d861797b2c876fb8752547641646aeba05632d8c889e98e3ddbb1c9e63826ffd3ffe9b9cc52996a75b26cbf67b9e88918f3d8c6f74d6c6956c5dc63738cb1d7d62e37b2217d2a28e52cd46fa7259d6b8b458dae15405dfc8c71ec903f54ae676f83e3f6ab49ee57a38f926903172eadbb6efeb81a846cba72635da1814ee54a1d332c8acdbfd09acdb4def24458d964f4335da93508df684831abd1313ef34abd19e9678a71bd4e89d94d4684fb21aedc906355a8ee2f34e505496d3132d30eed62d9622e59d6a00a3e5440317efe4448d33bc13d08b779a010def94c47a271980de0949e89d9a18c13b3101e39d8ed4f04e31124e4bd468b7bbb12e65b2f24e4a98e09d9238c13b1941c13b1589f14e4800c03bfdc878271f96773ac286c77c8375d976365826ad873a71777677777777ef52a9f0ada5e1eefe3eeefd2ffda393a0a7e6ddadcde69cb2fdb559cf3967cf9edd9c737afb12eedc2173ccff7777ef9054d6a36d7c24ead04641658363a49da50bc4cb624d6d1b00c7942e10af0d129b0d84e14a36c852254778a28e4ae518f9489ce0945cf972797825edb6559e21277852848ed4088363529e8cdcb9c9c3f7a69d27040f8c07d6ea84e0e1a9cee3415e0f3592e33ee0cf651b23293ed8325252876c7f0a7e9d83912362ebee342f96da3ae8f7857044cc6eba4f9f3e478040ca8f109c092356bbef876046d6dce4b6d33cf2ec5e7306d9ea72e870023108563a3b977244671991a6d6eecccccccc5d0ab8ed695590f26fbbbc9d2e1fae106788632359ad727b3337c749dd4cbbd9096a6e5590dbf469b539e7b41f458c45e9ff52b814b2631251fe9c433f243b32e13ede030b642df5c42d1568ecaeab4ecd264a4dd96288a32055dc10735437294a503b1bc82a6a8909195413911d4184081104e63d417ae82982cc10440f7a8031a27e53c426d553129f2471a27e45482e766208c28711049103abf47292206a08835002976805902b2293ea97930079720590a0bb417143cb55b15000168a006142c2a0a65c4e02c4880a840524f88a00240551809040faa8d58b2b6a0b163da49686a492243f925c57f522c90f24ea4e921f43aeabca1924f901a4d69ae4070a6aaa7ea9243f469004e683ebaa433d7553d23ef54b2252514b3d4ea4962e278105b144455d4e0223c1953f9525c986aa45eaab2a14808503d494ed8aaaac1acd66b3d96cc6840913264c9870b36f1cdb940c59b35190bf9dce823673bac0ba34286523572eb0ae87305215a4eae1c4ff5f1aa1838728709038c1c112321431801c4c6083155ff4c0210a1a783126a7231e4590a10b26848e7e80ccb04309901738d0e06505caa150c17cd54bb1666c522072ef93917239091050dca68117c3818b9999999979d37cfe4fd79a9999d66e8eb9ce24e57602fa0dd568bf99bbbbb7bbbb83d3dfddbfef64d3ee4e9f74eeee1eba6fdf911a6d77d409333377a3f785b6512ec6d8a4f34aa6949aaa757b3b6b4ac9050ed04dc5050980565be94c2556923be5dc63ae12a31bd73917d53d0cea643c14e8e69534d72c4b6e9a974c1e644ad182a2a4bd756ba34373f3a4cade95f7c61ebdae631762c42a62a1b8c4ab89321654784166c2026e5b5e3d777f03dc6dba645a299bff11083d8cdab41cf48202b845dd6918614d60b208932a2611b681205290acfa795b0ba374772fb510de8e91aaa8b5710a1bbd9bbfd882075138e5abc0b769d35fb5b2600a0665bdc00ce090bfb892b7b892a35c298536fdfb25eb5669dd2debcd5a5794ade0dd18030b1893947f9d8e9a5069a21b87d93f126bc372eeeede319b4b34ce574e5fa434729d572a791d4797f85862c4019f4a2b701786252ca89667f94a2e4820b45a0b9a6dad2546aaa2c2d67b5a41dd0e460c8db5f20161d85097afe40205beefb412c3a59f3addb4d9d555ba6b2aa5b8c8d0628c81291895d5cd4040ddb65aa3b6844c3159191eead2a06ec62c79321411ba28db9f5d2cd5ca823694001dba384a6725cfc01472afaa17c25430704c1253f32adfd80860c338b8c559695918c7b42d976d84758b0b61e0265c110683540555186c06b8a6c319a99aa95e46969c69630b36e56e71960353bd22e22ab3dd361bd60a8441bf0a7c14b5ba6cd32d8e0e6dda7c2f9998f53c59631a61bd929e4a85b012ee4718ba35005e49cb4a22ce50514441773bb4e11869bf246cbaee5293775dd630ea7226190b10d9da7c8f3b88407ce3e5b2cee6c465bba5eaec26b4089439383aeafea943aa5695b537c4000644b0c0e27d6aa95a55d612f98af888f87ab48d725d4f6ca360bce922175337fdd3757747284c58a964b27b781cfd24f133c26ca6c34c87d94c9b4343433fff0f245572f683b7cfbc7bd645d7dddfdf5e58cf42d336bafd88e05fae06bedc0864c76cc76c6868289594f453b37ca3cd94dff4e410191a1aa241a51211a2ed981189724444488c51ce1891de616868e847889fd96c369bcd7eea309b433ff483fbb74f79f43fbe63b664674a9ffd337dc72c06a5aa9262f2baee87b3ac6994eb381d2a437528c5f415290d75f253b063b663b663f6bde01b02859b82114fb8916fc418a3f709f1b9e06bc127e4e3f9763e167c2bf8827c417c40be1f1fec03e2fba1bb873e157c3e3e1fbe147c3d3e9d0f05df093e137c3cbe1ebe127c3c74f7eccbf976f874f848f0e5f0e1f0ddf0d9c0524ba23ef5757a25ade3f85c498bbe47a747e73f9f1e2983b78c4926ac54edee2323114a54ea718b03fa8072361d0ea85b2c0001b180457571441c51932640409e94dab65a5329bb42f72dc140451e031223040505057dcfb75b16e298233ea9ea3112ad8c31cecf833cdc993f3f0c57dad20840303a2a1e4ec573fabea65d9f4e27afe32c4521a17e804a6a39a2a5a725d6d204aba295615d322ed6a572d9546d0172212a99b416d40f5048a8a496235a7a5a9a6889c94025b9a09262a09260a0925049a8a416a02b2d8c0b51c985a8c5aa203596528e16ad8b25032c61296199ae05847da51c6e57aaa89185c69752ee0c7008b71cb8633b10036f35b05d0c68002584224239e14c3297282e452828a828b4b3b5be18a18eb6995c4996ac4617350acd641c83128a386894b08c131411cd922b2d277465cecb247389828a8282424db2ce246b932cc52433c94cb2251ca3843593aaa3ede83e092f672919c06f0baa9443b32ad1dd743b7007c672e04e0d4bc19d177086215a2c0ddbcd0eed8b2fbeb81902031aa8b7b30da362a4a2850ad2ca9095b8e2b3528455d146199654ac31aec46e8ca8590c856a80a6995cbd4903d2e209235943e304ab244d4e920a52b7687858194283b3c2d32d9a18568a74b1e2236b66861093b92e152415247b5d2a4825152415a41e2a48a995d8951646a8080a6a1671b0ae8882fa429a29745d367084584b584a5eac24a423a32222d6ac2564c938860419360d4ce2e1a92d2fb6850377606c07eed480a9215150624c7ad58071b7da4945c6312e4557baecba6ce4b09eb08cb4238036706cbc7a950404a9425a01595058451cc31262cdacb8d2a2a0441c2c254b220aca0c59321264a82e934ca548d6b86d1d97a2ad6b6179210d50afa41f79d2c77a7660493cd840c382b54b799db515a4d101697038c6d2f4e09c4b6303d3c4c0335ca09d23b09f2422847a25ed0b0da3238e61e98007529c64a7528e1d1ba39463c7da181cb8632d057754688038f66686f5a3888312451969699154fd806ba815ac62f1a36e51a33e825bdc0ef7703d52f54d700d67848cbd499c0f158a384c4f4419152bf47224bbb8bd80342d200d129a180aa4f1218a38688eb00cb582c6c82d9235343faca269e24acb1212cd9cc01923a36ed1c4c0ab1d9e49bab06ecdf48057461cdd1e593393839e2b2344f5e3ca1e57f270258d0dd428e7ca5832d6ec898883c58415647aa28634af1723d08863a4e9e5e88b3c3535a3822fb7439025eb95b429208b0864599065d42b69bfd20a32770b594245f505a401d29001d2084de02c819163a2a501d65e45af8319a1a4852f4635bc17f07624d000fdf5ba6930c6e5c09d17dbbd845bd712605c0edca161298d707b7999317fd572bb979719f367b8bf20bd18c9587962a2104301b05d0d7419ef45bbdae6a1502c3f5fb3bfd9d7260b4b0e972297227f9f2e453eff745a595951a92f46d2a69472984a284175b15e8caeb4ac2259239b09b188648dab026df238c554a26991916598b85bf3ea74b8c808f4e87eeb1cb8ff27206ab41e9ddde74ec7ec77b656a493de47856d217687afd2bce9a6c9684e9502ad75e933ddeda6e00e6737b0e9d65c683313c5ccd3f7a9d9ccccd8cc1431332711ff36f859fcb74177f7ff307b1a4aa526b57ddba17603bf65c338d83bd46a60b7ed4e859cac4637d1cbb2864b18a2ba52574a1822d42e7916bcc2d40a191646965ce4eb86b3559e2e05745cb6da06ce4083cd0d0d35bb4d70b314c4b1b9d92c07ce40c376b3591c9b1b6a3bf7f72da42b1c2dcd4e9b5d49b655417660b31ac83754b32a74831748dd8ea5046837032917d06e871478cd828063371e98d6039aad975da20b872f68e1f52235eea06307f8bbf3901881622cc6622cc622a59452d125179a6e9a6f2517de76b8b577a81d5182df38ce6e6f39ca6d94d334d7268fc3dc27cc7dc2dc27c7713bdc141f468e71ab5d8e6e53f88f86c5c60d78000bdd9a40af607800d76480526a350a4e40da882333c035110756495b14777835846d48db816ec51c59531383a044624023837825a3939c213cb0188b3118cfd387c99af9f329b57108b7e80ea59bd62914806ff48c879a4f9190c776223bb2bf3a97ed6a2bdd5daafa49943deb99ec9ef5acbd673df3ee9efdec20346e52ebe9ffce3c9bd989f4ee666666fe28f3d2a0195d6a9135ced4a17357c7bbbba5101d5bd7eb35ef5f2eb5105fafcb29f6888e61da4a295f06758ef8fda173cbc8edf37fccdc67019b33a8940c9bcb69e766060002100083160000200c0a060482c1304d03414bb5031400105d863c6e6038190823498ee328888220888218648c21c4208308320a11510d0006fc95527c1cfca1932aa5647a00254f0843b0651607b8ef5cdad1f8dd8de36ce92b0f9804fe73c0b0e6915a0827cb4b830d4e288c243cde880282a07ad13ec6969e18e131c09fefd9f9f98e4fe831fd1df17e79942f0a2b067bac886d287e82888882318123570b8cfe05bae3cf0a0939cf725e442c73abb42047da94d542edd38e6d0195c98b494e2c9c3f9c5831202c42fd0693fe170f14600381c5304007825108580c0045e0e70c7efd420ccc7e7dfb3c6b6f1c0a50fd909dec21240d98a68fd17dc6361182598c3ac4325e9046d75af161e8d4807500e80a1889ec85bc40d791cd9e3abf17d2d4089f6ab7b4a9787ad2d77004177bbef54d93bb5f023c55938e1d2a87593225ca155f07013cfda95337bccc0a1d751d5fc271bd0302af151adbf19770b8c5042c20bb66c6cedb689e7b1bd896b3ec51be88c9fb4ef764f2162ddf01c6cc44a3b4b04feb192a97daf83da7f9c6c13231b69c9e0d21ade7c2c741100040488b062cb1cf4e46ae8ef6d6b2b84b606547cf5ba91b7711179213735138848730a009ca2a114672287cbc4b67e08431109ef77f6107040793a8208b443cff68d608b6451a1dd0065227cfb87d23568d38a2461926ebd7a0466235fb413bb4342165b1e1010159a7463631b480a6b99b3c35df8b665477114310a8ac8a699bfbf4e7431fc2938bfe01480ab9f39f943282e654c2502f4c4e6ea87446b03a0fee662ebfa28843bd534b085a720a8f5b28a06a2bcd88b011526332be6e235488e4aaf7372a08454dda58b86b5debfca2cecbd3cf0e7e19b2fb330b18163e865be8903e33d920bce73450eb8c4b350315a7752f98f13a289d3d9c16528b8b0dea95a1391fcd8bca5e6f73ff0cbf756c09046dd3900e22c3cd4b18520dcd29b20b04384713360395c7fea3f373050abb99a1f74a951a30b58fc806617fb0a9146f33b2f9ab5bac545f33451a048c3244356763e1d0266a60bc694370385c987f96f0d02c0b5dbe3107fb7fa5562f589df162b3b22c17f38f3c2bee8110ea04ed16016ea2641ea8bfe066f6dc8f61715be3b85ae07019084c6590461a58492c76531b5ebbc514457fe5da9e18e3440844d7c6c36b9705463ecde9d571369e4d45dc701a4caa48176801c023be0d235ba252ec553314ac04cb886f5005c6b6f7ed52512f58000390729bdfb6a03c447e6218ac50991ab380de8a615e943a2348bdf39879d22a23df4028bc8a00d009462bdc21fe152532ba100c16339601f30f0418d63627512126bcaf2a52d5f75bd88f21458e7b29b488372feb1e13a67a99cb07e3863a5e90f401a5ae00bdf5d0050014aa8c03289bc732845e292a0cfad2085288f5080c9b31738f0fc9d9b8e712091198a653be3614c137636a5ddc6d75dded523655f3b15542b50a01db4c84fd1e682bb88076659b7004158a6ea3d7a159bf8cbb3a5569dd190cf8916d2e22ea71d8de0d5b00d2726be84cfb050e186aa838a496b35bb1bafdc57a07b22c990fc7dc495046a9a56dc96c5587019210a38d7656c5d7921f3a6ec01a492385d94307c57575731d4cf6e812a7624099f72b40137fb7d82cb5f09c9ae070bf095218a5e8543cbf0d2b02698e1fa520471005158b03ae2a476935c735db9feafe0b5642a5509c207c2ca8a4f7ea22702c3c0652ff48f0434f9f0f20aba52247a0642f82ee1312841705649d86bd13759fc083e381800f00267735e221a412ecdce7a2191d4861d34ac3ad9c8df35878141a5c96f4f78eee9fefe2250bd2e60d9cf85a61910c7e56b9137f5ef6bd2b6d27d01d2dc4f6e23a2d1e4fe680c0adf4e0fa0e4f59a8d4c2f7e3faad898cfda6c339e3c10f5da2ba7ed55978509f0e02102e863779e3a728bc37a38b551130239ce547487615a3f0409a07363d80022476e8bdd0b53f53f511794b62ba1d4b89f0c06b8a0280416e758c4f151bc8e3a36317755ef3452707f38ad6b80a6768043b6af093ae6f8fc583b6ad00e212a31143168e6ef6d59400dcef18bec04334ff932432b8b2f2198a135dcc6d0061b3eed72d8a3ffbca7210415a9b850bf6f2d2b1ea8a4655b4ab01885fca3e21bd34bbc9e94ae9eb7b32dbb66de7d411e34d05a010f4af2c2890299f408e5e067e62025350c81c06cf631c48ad5d70e53567ce722a23edf14d11facb840cf34a84f6476862b2ff6d75fc3be37df714a105d87ab8a12e920830e613b5c1016f705faaf2c59fce221684aeb6090ad9c83105a819bd3053d202a31b01800d3c23690fb2ecb126059f95a18d4d6b4d9c96e8a24af38b32b4ba03fbdc0ce32bc7224d2b2d35edcd40cadd73ac68b8e3a368c41ba14b2d6ea080b5e755b88bba4016be31a944be3a69f46501611bc8ab132bf44965387a26a6449b3e6d750ae18483c0a7e2531cb42eb4e5a552631427aff65a1a220be858b32836dd86dfa9ef561042f64436b2a1938955f2951229a0c27180c67526280134446cbabcfc8301fe05aa18d6b23c5035124ef17854e982cad178ef12c37d09ee9eb23654c9428b9b01fab58840a1fc0aaa91fe6be65027e6ee764147cce4e32848e201e2721530d3458453a3a90c34389fb769d9ce863f19b8800a304ec02c8708846076696dd014e58999411e10e07e8550f696dd87ec6d94f6cd8c6a272c9ddea0a83687f0e477322577e34f66cf7ee533d703c47acfbe80e747bb9d9d995ccfa360de67f049a7f1e949e8be59448b76918bda4c164a49cd9b8d944f77d2b60d75d09d6fe4c9f8f2fabe3ae1b7f53a8d23e381543b236abcf754f7de5c7011c931a16ee8034b26653d7c4377bd050010fb020f3f83315658da4b1f98dfcb865b7f24c5bbc8021d0f700df55d89da774e4a5370c624468502cc23fc0aa0aad2b2ae9151bfeff844fd4e5c85bc0948ddc47d59eb5b5aa2a469ddc84decadd1ae982c3e51f8f167438ca23af85fed5ce370b5414e5fc1f8c4ab1b29258e5868c5c3da8e555a42dbe10aa374813dff39b69c77543f205cbe0c14ccbaeb9b722989a5894b2c618cab60b1dc9f5eeec9f18904f3be1b85c42423fcb79c0e7fc90492ca0c50fd70f102c69b209b3c08824cbfa294f05941ae29e903918353dfa012bd4ea28ac7f19679a5fbd49c66374773e2f66151969c94fe2af25012d3c53ac0880c2a0768229b11af349e8e169b84c2df30f47fb12428f58c27846f518f2f8e05fb810b483d58b4d1b0996e9f9805c7be1353e36be3302e218403a4b5a4fc614348839bcb91b9f0d5a4319ee7b4cd2d6f14108657b7959d0b185575bed5160ab42dcb9d3fe1e472099f38a9e807c314ba297c53dc568b5e38f8f19f23aaf4eb7c633796af6f67ffc8d7f70eb1ec6776e9d541bfbbd821a70311fb3d0be2e56b70cb0beb2a85f0380162e3413902a6215e1466c657efc6b539040fe2db8f30a89b1a51a1bdb8d0a409c5ccc4ea6ac510a1177cdd2b33e101c7c9e85cbca830c80d83cee910c6c147c578f6075ce59a2f419229e4a468d0fe3b351127f73f2ee32968e9efe434e0c788ea20702bf494242cd5597a7092b81be1ab38651186780786515e5be56e98f2a8fe5bb14ad179e876b5c7288ab31aaafbe2ec87ccd1e374bd0a42ba3bdb60714dd6e0c89773ec442af79c7e5a363c8d0a6046e4f4119200aeaa79c1e798285eab6bef8524877a92db94c51c31b55a891c7a9623a6d987a191e6e20efaec7099d7f397a4ce922c876d3bb726860566a9052694ed02936594c3b824ba7aa7815106a89dfc2b40d2ffd6715cba412c620f6cc24e98cc9a4ab478550bf47358fe338a6b753c8a8aa63a9eaea8eac88289e1e7987db4c90e7b29a9b477642cfeb2aa56980a15bae0b4a5f202a3e7b570e63ace12e551a7cc761ec3948294a31dc53d06f55a19025a14d8a4b4259811fc6194bbb78a2e3083841250f042da2ab0bd375052c448de45c1f2dce770e73dc3dfeace028077d366f7a05022f66a8f69048a944c48d054ec16276c41e925f1958236f29a0de6111317e47470ae6cd981477158921b0a2c90d2dea1f8f8923738a7b0fc7542a289885f71ee7f6e92c260ddf000f69adcd1b4cb0ed486cbe5dbc4551de3e088a823aeb19a2b7341a7809edbc318c39816c0229d15af810c046762b521132492de3c83636a20baf30da4a7f64986d11a6320dc7102e99f0b65ec9e91731f3177e4bc46cc51457cab44da2aaa0b21e2a14a50bc6a2a65aac6c7a4f8d9786f78dd52c55664416cf651a1ab9bcccaf1e30133f2a7d6c4eb0bb9fbaa2cbeee13179142b9b9af36170a303c4677f47843cf002f7f31d23723ac09335c2286d7d4cf54990b2b2c2c71ac0577bf00bf6fbfb66d21bac5d75c3a83283c754b2ad8c2a825737e93ea19a601dbd91de472e08cb90c1e34959acf5f4331d1f82e7691527dd7ec46504789caf74c7ff03a97fbd9420a85ae16bcd0a9b1d3ded47f8024c0020375b05970e4d2cfd2cdd8ced9aaa7514f8350721977a16fd83dd00d024cb213952a6ff1476da030ecd696899b44bcb763e8b5a958d0b5bf16798be43fb19a79322b09f2104fa52840b4a3006665669f6a3f4276e9568c042a1e7646cfcc489b183918e519d5f1b8e58cac95fc7488bb8a4be81e429481cba776ddb69e195300ed90c7d5e82d02fa24209d19615f4f75d69714b5676e81db5bf06c0c8c06f1a11508bfc3208e4e5506d755a15576827b84ee7035f8dfb15c14b1b030c417d7db7f60fd494a55b64ce7b5b0de3aa635e43a11cee4747a976688bf8012aad3848398e8bc592a72dc05a272d8daadd490729706ffaa9794e8ef0193457b1e90dcdc9cb17f7b4265ad8e146a41777fa9410fbd21a19ca474c6a79fc012408b711324d9c1424f74b79d23ad260d6edb09f72c04221bba5b9a5ae546b7ddcf530db26f60555fcdb91b048d6321bf43e15bdb862dd8d63e52be1158e86b065e1b402a472221c3d6997b14bbda2b0d984eb97d8b94611e5080f998bf3f21aebcb9d559a27db5704064df9e4babca91ceebec256e38b630c04ffac9f219dcffc836283d6580381c05a56d8264ea35f1656d9d6ac65fb6019ba960aea4cf16dd269082a26b2b575a389ff3324a367bde12b5c0140e6aaa263c19dacf5669c1c6cfa286e530111585a932628291be8e0ec6ea06b97bf5697327310d8e208f289ea9b4d12d643b8145a3239f337e5b527d7c5ec29b6b5b26e74128ae544b31721fd7e334d665d4b28e1fb730ba6e670a7c17d0407b8066e6d6b410951f5ceebfc9b2cddfc308bbb44f3859d3840591ee535b6741d98b0c09644512951397ce95a07a398ac50e8b6cdc56a5f58ffa89d07120d398d12d1c35c94baba9366121b65145f7d81c7432a8c2e3a5325966084674ede8643a3bc4b830f8e9ece81c9ebe6a2083fcd8cb17c1ae5e8b69f8c8ed6b9af1652774fc61fa25d64c979ef64f66813b5405c4d7f608c582b7e283f0b178ae92a621d231c2c081dbf2bed7aa2c188cbdc64e34fe1f0b03711d4d9b86a47c5a8ee4e62bbf3923204553048cafb37e374b3d910fc5ef31d94c8fcc04c5f504f360d57b0190449a9098082a58094e7a704a321322e226d2e01aa4b6638c5ff53e9cfd75f7f51d925c9429b706322ca2b4a4166842a8d03873cb04b8966d8027ac9a2326302a1c4202017d93d60a19fa81b6cb997d0763c79bd200bf3c402425fe0ba0790570829897227d8f399e27f12a27cb9df21ffbcc7271d13fe6a3058311641798c21ae5dc10d87678f89c8d43859022fb36a0ae3d8de1cbaf49f502d98be9e06928e7cac0e1142c5cf2a5932ccf2effd762001760618b8a5ce0a3f6d09965c52ff339b73f762e7ee1ac45259c5d4d33ca93812fa96534c7071527209e2597154c3dea3c9fd321fb9ce267be13100a5cc03c0f848690b7df7a69586c7c23fd0e6032cb52cabf0ddb251c42b12a8448bc6cab69cce121af090e906acb5255d3473a4715f96d194b80c55ff72ad900762a6143a39a6e6ddfc583090c90cab13cefa352a98fa793b2f2b58da598abea4678384b5a6c8f12670d88a6042df03e793775a30e76d8a14c153e5dab2f9a84c21ab33b72b375b76bf05a29e91feca0a2fa7cd208e8205a581145492c7fdcb128f79edb4585d01602f940218acfb63681919a1bcf4c7bf917c80ce723d19b18a66ad042cd11c6db559c850fdfac7b71db9f47643031d7d23980c1881ea4e260b84c2b80ba0367565e377de4c2f9c2c10255f8be1fa72819f55443ac77ff1066ad0b6d3014ee2a5afa36393a2c9dc86e70d061767e454b05c8d5145d9cb0206ccb155b37e2d34471113602cba2aa073daad6ad6139f5490ea6908b585f5e2c898006a9fa8f8ff4645e7907a1d18d4d12d80652d926f5ef4b592efb2454c795c7f577a4c7c33693c8d1ac7a15ef1f8baa2aa3b0b8246502eafc742fafd37cbb6ea23fe2bb15983efe850f8950d8eb80f5b99cfed027ba4dc3daebf107ccdbaee84c9aa10209ec25bb3713c53605da4a7ea704e22bd4fc94656d18f3965d371b81c922bbfbe2a1e40819275a41d063d09310414a04477a287ddadad4c38f90f5372989b8ee52ce64c6c111215c7c8e33e064f420f245d2191cfe287539e4cb42d43968ad703ac5c980eb412f66cce0eced84edbe20de10e2975a112c3fa80ebecf6adccceffc4330bc8acf9a58e250da2413d21b2795a9d8d6a5fc52ca44a41878931b53ac32ecd6d55fe6e3b50493f8584633cb88d61ef2be59dc555aba45279f94652b281569ab44ce9b272d2ed92c6937f7fe96111d4cd062edcc3947fbee4aa0f60b0cab0264429bc27b1ec36599264df7c4408a40a76294374c2e2c2f6af202fda9db222852949333273ec1f9868aae2be056823a3c1c8069c445e6745b6aea4ee0bea523e1587a4869be5d49e2927e7b7a73a8b02f2d0e4eaedf38352a14a3e6dd822aaf10c64eeb93ca77e4b6e29596a90b5d3a96c19dab5f65b365e84fe70c0b2f1d53b7f80875e507f34351dd9a323a34053caf8d1be2b21d120a62337a4b4d1b019e0a853e3f3d22a97a10d794e4e3e9814dac874541e2d3dfe9b9c6ec62a5ebce782fe6a69793bc6ddfe9195a082d17080d8842aec95f0969a870380a1278b8f4b340de30a56a2a594fce59e5c8a097ce71433a8bda89f0f8bee1431e8489a5ce016a0da78c82680a45238cc17754aa2a13d6ecb58616b45a5323c020f3caadbe710931d17a48664d6dda35a254810c0557999f47fbaec34990a84a3ce1919ca26aa825f6f9ba3bed912e6de27a2e4557327e25a5a3201b15e37fa9a07bb879ea6c9a60977260e359bf3c4672aa215c9cab124dc4715a8aee7458a46fa8cd514b711929fe95c3d2bbedd9ed4c5fae5b8ca927a8640873e5c63addb17e7464a832738cad9f88ba6450958938e37c14027b4b0480ad7a92000abaa6e820ace299d8a226b9dacd366dba9b117f511e3d4c6432ad963313af25737402a04df29af183f92eaff7cbbe4d93548df47ebdeb6fbe300bb86b7443ac98a8063c3bd9d042e8cd5cb0a5d39d068b8e700a6ab46822778fcc2914fbfa8681f45eae3aa35184ec4b8915895447709fbe6c184ae766ceaea9d90a9688ef9629d0ec49ef6bb5b286e166f92904d2d94b47d508871ec5e8977560f1f5bfbac04c49ed3ed2648c12101de136a8ee1bdbc6bb6a6aeb040ae2a1e728e5f2e408ba1bc4ffb61c47b65cfcafdca7e8740bae094714ebf196f793a5a6b1e6d03be87492863642b751bd41bc6e444107afc1aadc08098967f1ff66ff78b0887ac768b51829c6a148a480f1c17cdb688e26d4cc59a90a5803da3c0afe7f2e20b6b8c5fc95ddb869436da02b7e91e683dd7b3242291d3c588e1971916abd19daa44c42e76eec43cfd0434a81a6093e89024f039af88b146807d24a6a15f5b2fe0204ca4861ccb9b113e3f4ffbd6da765cdb19d1e3aef5a8c3c685d917634016b0a9b27ad0d6f44e0e1dcb70c9ca2796bb50c6adc99b2a892e0ef7f355e10f56740c276590638b3d65e2a63b55016aac2d0e045706ff940a923c642084fc8642b547c558eaab85703f2f013ec86f8a6447b8a11fe4a65aaf8274e0c56744cacf10972bd52461398a95275c67eb21e51cc0ff5b40f2d07434ef513bcfc7dd3e3f5a39586ba5bb9103a79f28b89549ac619dc6d4c326812ae6f5b5bb265b455b1aa4e3d86238012e8fb5631850b26e3e2a40b12af7015bb5ac2accb5078c360385be42d85f0eb616ab0ed29a2b0e62bf35c799ffa4d3a8b0781187a8d4d06196feab4e4f54dd3e24f885647430be6a8078ca9b77ca90aa4f87357033fc5a08fc362ef144820418444f8794968346d615c8b3155b07bf7010f718ca050ecf3cb5154142836f69b081d8b2ea3f2b4f48b9822126efe0a24a8a2d5c16b6fae0b6b902991b101d455c69d16babf43b3160e640af25103542ab11c11dba87548d4da4817eb28830a8a2fcdd88c21c8665d334869f98e7465e865832ee718665354f6fd8874d08f88f6aafff15da03b95d33fc585d296de7b37957a4600d36fb6a3cf34454b06bc11b9fd952b7e5606a7d008d28c6ca1eecca68d90dac526d7a59988117c140957ea76d60162b6ef00551324b52e7b06216edfa920b30b32ef2a67bc5a0e19ae1929ef8b1613db73e545623053cba721722c4eae1e39c5285bd729e5e7b9a95ccc051d37ec5b24563d69e46e036f5e255b0528eea08447fa6a1b240fc6ffb7ca936b888c7cfb1afa64c9cf5d994fb4ef113b13c8b421d3037318c687515d00b4a6a7fd06807224a9eb6235cb720a1a019ffe9f1c143c401d3803d9ca15ac1c953e07fa77802d04c01853a7da2f2e796ea04338766d90b335c2d1e6208c9939b0ea4400be823570fe9d3c86dc94e4e595e5d2e5394d6ff54cc27f31c7cfeddfc0fb301ccfcf9943c5a836349680c05b7ec531e54074ee30251cb1a2883860ad8d9c4106cd8cc84d1b874033a3fa1ca7ae02b8d46e0c4503738c0747a076ac351a6e0440be565732587eb552fed23248e33c72163e575a46bdacec8a55d27f6bf107536d63edbd7e939511e0f17a27ff037e00cd14aa48093658a337bc080e227c8858d7673e8037c1536ae0db14bb7378d0c9ba40b5b182270ac3014094308eeda526c6a187aea8ff5284e94814071ba13486d6ef02d2dc9514d22d4875ea4394a8daaa0ab37c2046ff378a844349ba619fa67cadd8868a0921602564031d09bb5ebea8cdfd03ddcf5275378f6a5794635853ac7d7569cadc7d4c7f301240bc365ca40f3fc5a8b9e9392fce9ec10e1dd8284bea9355083fbbb873db1171ed59a3a52ef69c240ffc950bba918a4a6710801c0592df1c8fac3fad66e6b76a91a25199e142e0cf0592c3289cf07637b63879f7eae6d44a67b2144632c0c4d2b2208c14da16bb7a67f68671eb47041e672934b4ac8db367f5b08e35526d49eeed700ed516b9c1192cb191dc784150b528f05c0dc3db6ee010f2bfb1c45e12a6179ac1ba5745c740e19879090d95f02f51ba9a9429e84fe54a6f077bd24c8ad896967e43c632b21029a8f7c4ed0a5cb67856a0cbe37d6989a5a594c8a4121256460d0b20d4711bd3f88493de605172612cc362e0909ee206fb49443e21cee37fac62060ad65ca5850499731eb5f63ff55ff65cd2166149ba536357250373ea52e5d5495dc837114495dcfaed54094ebe25653359e02bcd64d56a52655e17e40b1c3325b4d7c080ab26cf19d6b69ad8e2aa14172f49a0a95c08cab47d9b98519dd274fc1350aa56f56e2208b1806cd253a14d89dd2de01ea9e43e8ceb8ba08490371af6491847bac5e1da763dac6fecd97d196f57090aca8ca112650ecba0b54f39815d1f925dec5d28c6d505f5589f08e4a2298dcec335b8ca179fcecfd5cf0a60d985d2f5e1f143bf03f074b08eb6f83e22ae879f2a26b95e322893c9726ed3fcd23a232efa9e9981ceabdce59fc193c8d36d5f33c252413a62dab828e3e81127f19ea5752e242b51ce04a8f09310045a61f1e8fb145c8df154fc04d4e986b9b70514ce8931ee5d86e23dc90b4358ed27bc553656b641a1a1f2241aaec1e4ba8595c727ed71d80192bf8f5392be68cdcb126969dac9c726b7a5d32b844faded3eafb24ba1390c535c76beb094eadfd3eb7c0336087011c13eb4f084bda017c8a9b2521d884e5a229a4885843a690debb8e46f41355462e864663fab89f5051c9f557e7472fdce2a3dfdfb962250844b4e51d7eb870e9d95a23a4a73b03b05314e4615bc0b8d17f44874d9ab156f8725b73336a387ef4e5b1f34c95fe0158e4c01e099e1d4a4bf0785e4fcb40157ac40d35b075cfcf3bfe79423b78f2b192d9229b045e122ed40ee1d5652897f75c1636dfc5a3d7cfdcdeec5f6edd4bfa6edf30fdc2fc8714fa2138a774a3f822b32b950297c02ad87917c283c115d258093cc79bc172cdb0f3602f65b52aa317f8b102af09aca2d9445a83083785acb460743ecc467a01c911086f70bdfcd139102fa2e46ac8d4f9dea40cd1cf050bac96dd9f05db7811c935810af9ccefdda08edbd0505b7102c2717daa89b21514e9a1674634375ad1e756c0e23427154e81ff2ecc5637bbe436f2a27fe80a68654eaf925625bbd59ea555a2d2709289de1998fbb6c21029f0d8caf8e9c663665cf37917e7ffe5296a139a4d412d96880f81b784225d754cfea44e29bf9af69c4b4fec927c0b62925db3c4d00ef63cfda3cc535987caed4d366726f2485058e6f69bc7aaaab9143fcfc33013fad601cab8d5cc09123a10a7072213119790e7311ab480f486ff9be7e9cbc51714c7befd8d2c05a5a50cab2a8bf9c39f5e50d903940c64f575ffaea780aea81801af5a71403ade992e37facd503e84de819c3576e2b0974b25f886fba1ac291114ab6ce9911dfc5f12b805a3769670ba157e35605ecb6a46a82bffed7afad5ffcde57dc23191b34afec357e7aba5ace8fa8673d4ab9ba60214d3e965b66addd6158a2323de11bed2f02f04fe481e16bdf50f9186e0344fc510b4e3b075c8a205a722292a1a798b4cd432202c1cd9d23f78a519e95357476cb7ab4cc0a8818d25ba1a58ef1c01882c5cafcaee589aa890ede905360a13704827d86d028773d228b14cb5def068cd2bf66a71fb2e3c892b486c21eb0eab6e6a763d4a620771d99b41553b33b209369b01e3d76a6f558a5c35d334927a3a94904489757cd7dd4b1b0b1556e6e47778b5b41e6ad382b0fc6c3d5d0ac6a4a294ab4b5975d30f92f8bc2b86893b57da5d0c3d42d266a875264804707e2a5c5ce27eeea7c97b68d15510fcb99294d48eeb1132b8e06ed1bcff987ae5d5ae0658520f83cfcc91a039199ad48a7ae4af9f3fe11ddbd8c078ce5b4b23f07af35ef47297be3678b51439d0f4cb50c3f18b977cb98f04b7453c60cb2f7c488cf813a3d7e08644f0db8adfd3e87a160edd62ce5198565d38cbf1de656119a69b485fbd413bfe453e5dbcc08e4c889d3a9464a5460323fe25b2f550d2badc0f0982c6d85973aa11fd6ec44ca65a7f608dd61de09f2dc5bcb92c65b6bab149b476da38b438c5ede4b73deaec433a15de2c54fc421114216448d8f00170ad1fe365c56f57198abca44d184d4022c227d1ecae7172f984e8cf1017dfd4e4c27be1ce96c0d12b23bf1c8cab6f87d4cff74965b451162a9a2751e3662b962529fbe8e91209c1bb31a5f42dd429f70e31f5f5c77be6d2163d05a8d7b7cfb57d94daa47312de81ca1dc5fd1f7cbbb1e84899e735c524d9add72e5b4e8c451c94a67bed192ac731fd9fdfea458a7e30884e26914f96682b01735b113747d2c6b17480374f7dfaeb700804a0e8f176140ef6c20a1cc3abf74f0e41f9513c37d3c9c89541fdc022bab45537708184deee6950afd9a0bcb90b92eb387fa4850df1c9c87bac92a708936386aeedf436e5d7552404d3a48602d50cd0d1d303b845cfde3175cd85f4090871e4ab4b8ecbfb557455221ea5dc1c7cbd3c1a94026b9945137a15a7569f3b3d0c0d01cf507c3f5e769506b9453a12ed2f4fb64d572dcddc8d10f6966dae136b5e1600d2ca0071e031ea7f69c1d021d404ab08829485c834b97443ec4925a9ce69a38c24912058dd6799b82f8fe1cc28ca816c937fe93846ebaaf693da10b9d89ab520b5c1892898b65821fe2d3e44618c83f8cdd55a4711fe7eafc1307ff6b01845160c120d2574185c232fc1c1c3c0ec228aabab7417a561b2646fb29dd506f83d6e349f169cbf13f6f7e05d805ac6688b35454ac0ac0fee7b5fc9bf40499f51bcde1b8e6786fdd80fc6c4008c87152bf76486e2f3a2b2314b22fde68ddb7cb9994b72985042225811a1f48b1192f21852b7176c8cd6f7d57e70a4ad7215632df1f8e0dd9af0f915f5c7fa3e428d5745e1292d31969203703379989233e8b44f542c73ffc18ba9343ef0cd6283e6aeadb215d20688e77aa01c3f4024482214c24a81ecb503cc57aa10e94851cb5f605be62cf8c510f170e81a88a40264c9d283f528566b264a655196122de27f8b80ceb8f1c399b09143674bc21a047c83666ef475dbb99e7af24bf1cc3f38e242b00b6622c81e2a368cd35ecc14d81937464ad6804750e30fbdddc107488f63fa53802bde833b140ae65d7775dfd7ff9d13e88c0c67b5695cd0c89820eeb94ca69f825c41761394017ae7b37203250cea8892afe953904908c841b84fb8146ded12692ea7de1f7b482a6c2cadc0ee1fe9693d1cdd011471d64fa3a01dec690498bb1d6b882b5e5a5ef6dc089bd504dc3e2474ce9c43bb8bb4a8b8cfe1b1707162469d2657d388f33100e63fbc27772a38acdbbba23a79a5bd51d779e890164e8f42456b2759f80a2ce8963feae6e25082ac11b9a70ca384c20132475ad01139460cb482b0dcf00ecdb6dc38387feccc7179fb48984d1681df67a05a2b3214148a811f31841f3be6b1e03a2ce232df3f0fe402858514663f0b08980f6c80d278ab9253099c6f60dd585b7c01d73a718b6e06bdb2cf83b18e7312d0fe1ad84094042f807e354dbab388ee5bb603700ff196e45bc3d72333574df5b1688292e2162b625ebe6204c53cdbf593a304883ca2c1b911a08ceb3da638ec42c54555811b4b515609ba5a5fdf11c5a55f511606da9f1b4d58cc2df1b0c246844478da87dab912953840ab435b2b89cc8924d2252762a083b16548269e2b45dfb959a2ddce16d3fe02d2dcc61d8ba328c466bc06473ea631fbeca4e64fbccee17ac3c80422b5a7a93f829b2caf1b50315b5aca495a4f059ba2e7185682275bb1b35f7e0884236a4d8e7aa94747fa542dc7323550ee74bbc7cde425c218cb37d20335014820823909f476295e41f30b781fc7cf29d597a6d4ef53efcc8ebe2e7ec4c5363a1a1b9d330705bc0ade260a47ac6d2b2fbb9ad83cff922681b3b2edfa5b3601142c4b35536fe33367161a1e318e86f9fc51236e575ed718addb05695f9cf1b00d1c078a38155225673b0d7aab689b3c46d3ccdadfa91ec2b1af3344e43b3817f392c3411319e6c660ffd65899d6d615f863ccd697452a5be32a47821230dca706aecb6cd859a068e22ae2f83fb957275997aec63ee0d1f12a7d0bbc41057854b8689fc85efd24a91e32fcf8a0ee5fb20df3be03ba9f9ec1fe24047d02caceef800c008e65a46d35a91712b7f4c25734f11a56dd632f90cd2c7b6ebd74c4ae0473a8841520dcc88c27f6c2324808257a76ad04bc79255e7ec770d122786598f8f2da41f68a9c86daa85b033bdf306fff426e287b55fad3b0310f96fb864994918bc900c6c4e5699146fb8a0484694085c0259fbab23f191a60e9a45101558970fa41c3669f12ad1ea8e8eb1cf50391862029dc39eab31d9e8cc035f4fed0fd1d88b9f32ecf8b4ec4618930d8f3242b2d87c6d458dc51ac8f321a006935f3dfe901194f8ad4b0a81c05e66a92aa4ad7cb76cea36e5a4857221fb9c157045cb872355963edc4888396fe718dba0ac1226bccf59bb1c9f7e6fe2c68b7bcfb27970cd1749238448e421c97e9e27ba2161fabb2042ad491f9a735df909d815858cb50ff9efd433fbf6019e9488b7730162a7365dbddd6c6d20b1785a192caee2e658974f8ec1e1d9ba7cd056f6a29c06aef24f7e913158394082858eddd6515602764af8feab436bd8a8341d6018f71d6d30802047323c3a551b079c129dfae36a3e54c736565e9045e95ee34e33aa7119acabfb902cce0f1f3f1314e39c2a74543f83f66750ecfae7087a6f196247181e3d41d06ac1763c0b8511a4f6933fa1a75c96bda06607b4a59c65ad4440b902fe4828b69513398efcdaccd6f8c7d26f78fa4c7c62772b629d7fe067e1a33b9cc2fa50eb4bebb1a0ee3d977e861ce8159b12681be23e6c9b3a58dd57b76fe3127ef7fb56b7779f0ec9c766833917c35872d2c581a38b3291237e0f00d75c5ce012f64392dc8d784eb12200f602ed5b0e54a1be8b5a0da958453a467fcdde958e3a2519bc19895b0e46eb58f4f55698bee96e243ff6268a453615138b1c2b2a5ed7f603a64f6e3da0263e5547c4749c2ca7b63d37c7717542c1c9339956f7ae81f24a94483c8dbb3158ce86c2b9b400934941d3073bc3a843a1f09cd85d57d7146694d4fb87781bd72d6523b7015fbcc52038e0d902e9192d77dbe4600510a01baea65631614d905b56aa3cc609228bfe20d8a2ee3d60db276cbf838a7db9d28da9eb939dfbff79f98b46818f379480d2427d74eed7bd78c3ae89e4e9d083fcaaa3596d69870407215d0c6ce15cdc265e07b6190a35410de11129815004454a9e89fc645e07876911e7d8b24a9ab8ce55daa4bbf4f0b08c1821d4862ad7205e7a5a6f569b410bc8c4b965b85a8ec5d0ab53a98456e240f9238e898981023e039cf73820d53db879ef7beec1e7c7dd23bb30ca1eacff1582219f951a89f46ba8df472a1d02b3ff5fa33c9c348ff1cfc3e258305c99dcba96ad28623f860535c53ef77328d8903c7a0eb41429d2148d0a295d8a521ea408c65b1898b69e947f69c87f14131a2d6541434b14e46fabe8683d054a33108f8d4fc828e53851da66679990013fd7541470e4bb5269a6dcfc26afa8f479cdade8893638f22a938749e0c73ddd9c1518d5d5c14ab105550f9ccee0f6821c5cda278f21a222c33a2a972b24bc7434cc143e97ca7d0edb430a2151cf27650e70e988263c945cfc7d13c0d33bb90b5e7f1c4e90d26a5efc184448f65cdbbb248063eaeec994a1ed588ae9c8ea580cd22791787aaf937ae3c6d49d2aeff406c3a6a77ae1e6fe26d961fbec863c50f53a839ae23948a214890800c93ffe2a1b05bd7b0c0e2e7b18b535315ed0c34f83d05231f3c126748c9634acafa66518e6a780c369ed4da38eedb2b33b8ffaba619e76230ed29e62c6d21e9c2f736a9f0ccb70215ca90e14bbfb1dde2f7518c6f1825039a0daeac027442790f8fb702722493ecf66f146634ef9d9e50ff1bc8b45eef50c7ba6661f0a9cfe039f25ce1705546a9817e331073b4bd1d8d7a83c49e25390205a647e2a01ec9bb747d597ce3990ae3de38c44191347f4a31aa96f32bca739a4760d6d86cf4b7b39fa6a2c90a4779f2aa3160bfc445d2ee8724c1d1201a42728f8bdf1621de056b86e9161cc6913a7cda61c8769ca34f131e51f280d68c9f5e323cfd926d11ea52b244fb5b1379ef7404e2846d3426558dd364f4b638d18864b6cfc13b3321a6a2c5353a0cdd9da2da255c16c537c9c29200a5d1e30388138297412dc1202bda4210a4f0cb15df2407fbacbd1253792da7e4ac4f7a6dd8bded502cdb1098a5f3d0250066da49d6b4f42fc469728c94e089ccd9858d3355cbb0640c0102825db9f98bd8a47500dbd506e45dc8c06a4c2b766965f1c22f8876fd8da38056d703534446bc0c68ac7539f8c0b5392eb3f460d4a6eaeb275352bc5a25acd3b6900df52b8a4544d3c5fa8c236f6626aea81db89d8a9365fecb39e1afea8ae4d29a9d866433c64776da764f66f3e92b8c2019330ffa83f44977625aa704ae2a92752becb498af1d6df625ee6108873b20fa378db86674e1ad170fe68841a66350d45d30cc54a56267d322c15cf302da8124424c2ab9566916ed1cd1cda043606df1f7b961250a46f944b163ca43d076595f022ad2dd0b4b7be7bb192a031337157a7ab295c15591714035798ba27601009e49c290bc2939e5370078eaff1438242bcc85212ac4a77e700f6710993fa5b65d7c02c1eb586aab3962f783a0720fb3a74c46f317c81581646d5a577cda21f758c988e742c1c4eb31858f8714c1831e4b72a38abda0311c8a74e4a7fc9722bb1825b3d42b31c1b29cd310326c7551f000c86ce7ba6db4f8a4a254d5913a7a3cee7ab115095fe86572fc8c779c7645c14565306ff36e650976a24a0dc28b7ecacaaacfd23dab25049cb1f08c715b81b80e6bb2c5060272842924208a13cf2ab3d61519da2901cda0b8ffdc0b8d42d2c707f14d9fb3a5dd79583a80693589bd8ac2cfbedcc291e174802020986c6400612155982c1285a2db95d39f5529c9ebe41eac4fc2afde7d430f9c27301e9f30d5c80975a7ab55cb5dd26e66b32056fedaf18e6ed7bcabcb4acdaa753413b18a50d7ada08ab84dd57cd24cb0e4252ad35107c94591820e6501c49db23ff3057ec424db07f1f5728bb5ea5f03a1c9e71737147db91342db1bd7ff337be6eb942b6f26456ae1f56a1c7b6d47272c55326fa4cde1a8107d564f9a0b3b6bd572798ddd84aa2f748c93d701e4359cb03a887934899e3eda44e4744722ca4da978414e478fa27489d5cf1a4ec50793992e75c0ad2b8ca0a3c88a52417dee44588d8634ad37060533a3005cf1db2752ef697dc76d81a953baf1cd3d7056abafb2a84879764fa559fd3e52407dc907759ff6255cf4ba3ea71d2c437f325277df70faef756ac9cb86b03af39ea96834f113114b568ad840982faf4761f7d1a5e402eee33010157460e71dbdebfdfd8825614d35e7862e8004709e7a85d65f25f9ad5e34a8472727c2fc1e095a13c2e9a7cd6650b81ccfb8516a840f508b43b3936e1656efd343298061329c2622e56917deeb030d114013a74f85678bfb9f520a3438597610eec49dc7ab04fbacd0ba33495b6c8529bb2f0e25fb5fb79cb1c8cec218aa9c52a59a1f056fed507a8b33fd257d10a0cde36ef9487f59a5d8051bca1e8ca63a47ac7a4710c140cbd5703eba6c216ed8f93a8dd16a4aa6fe0575dca106dd69b79663ed01c7d78dbdd71df06a5e0bee8613eb2568e46563995e6392842a84dd06324596e80b6d8acab744c5861eea5463d6c62d05da24ff07124e6454cd8b67c9a89f944bba7b1d1ffb2972c473b25180048240f7707ba0b97dd70f9f31d84645628f0ae813fc77bd330c5fa452212b2b774a333e812f4b18fe6801f7151c786a6975ebf5974bc745902531d07641e8128e3f23bf91d073bbed6c2ffbb45afe022ae55583936738294865da0bddaada6494a1fee7266755421afa9f27518a27066232e7e50a8ff057dceb212ae12b2077b6e554cc22502445f7b99aee2302a0e3924f643958f78e3fd8f47d6bffaea7fc40e61c3e0bdacde1fcb744aa1e1c38b2f6ff200c9d4872400f6356132038219ed4734c958aec4e0d80c0c1fc05676ee305de7941de5d0756fa2ec188260af293366d19cdaef3752a258e39641224e68f600b16c2b4f09063becfba79e1b78a6ea229336deefd10c7896ae4657db6c409b4b914aded0e3d30b9ad0bc72b47512275799bab0e1247ea6aa3a0b7b321ed1ec169740585768c88dc5d62e344b05eb57b0b8f5ccaa157f8dd3a0bef30204a4ea7d22f38044a48e546be37ef888ec56e48ee856eee845e66e46a1f51975eef171b88327ce13314146d020d9ccb9e7a2a64886d772300a265d3909de34c6fb93654379cb951a44428cad208d351977927b90fbf0199ce16fb4ba4080e01ab194fe04526e6ae8f47adfa7f4be6a79eba7a8d5995fd16783f2d5f468190036e0ca12cd4767cb8daa0711928bc3a8854d21a9e988d993670754512eaf4a634222dc8e2115798a12d50792b8d7943ea9becae311fd85a8b391e454251968090f0726e871344ee682749a2011f119434145e1261e0dc2aa53556e6c892218c6c0b74a679aa19b879b149d56b3babc34c97ef53786152ebfd007878accee37e9bc06f43dfede84e37d8089329eb74e2176feadb7018b495baab94e3501401b983029599293c25974c5be4a528e584e010929818230b42fc4cd309aa4a16f6d23a0c20fea0494f144e133d4f3cba6cb127c8388f26b413a211cc3979e239d870ec84e3dc0ffe3e015844c84e9f77d726c7b13354afeeccccb33734e1f5c38f891537b7a8318887781f773de5ddf59b25b0d501ff186d7fbbedd87075424313a32252c3a1a2d51657638306a9a38741d46a0f407b789406efb8b67aca7a93011ca05d2084260c0878023c190036d4870af90b166ff4196a00556021ff86618d640ba5a72c3ac9520d4ad67f053ccd876890b01e2b58a9108e06057297067e768c36b0b21864b3f5531a98fefeff6f50db1ffe01dfd860db9e946e6276ee422373375052fe058f03cd7a9f87bd0bfec6bd8c4accdcad71e89857282f42c3567166aceae70215d59835c5bfbef7f93509f4ea2ab1160232e8d1c4308059366c34b53c72e2ee5b5b49f3f50dfbe28284efd1ab213587a63a7272c4113b379cf729a6a65b67638debc8ea1bbe0925711afbeec32a3b999513960151084c6040ae2329ec31a7545363742e955cb21580f5fcc2b49e416d587ec9b6cbc486e484155328eed39ce1790ebe7b032882b3f04e308be7c3b5a34a3be501ead7ea3c066c3cc0817873d9a7a5d862250d185671ea03e68be7109c965f4e5d82d31f75a0a961e18675a3b39130e7f12178b28b54a0cdb6a8960577e101d8a3e433fcbe5db1c39cfaafe23f419ab049829250a7b002579e3d3642442052bf2b6357e8c099da60a476a4c43b5d65849d980c895320dc871bc32a5a8a5fe4e254b85984803cbfcc8ecb7a100c4125223aa713e654b80a756abc29041675356c0cc0c70f6dcba11381aefa2c71a9a6652e120ae9432b89af335c7f82463f5d5781844478f05f47e279e446cf985b93672881c99bab05811cde4d0c7d52d0d6242633cdb32927564e2b5af5a5a7874518a275b12d34704c9f0107397bede671e944ef7bb5aedf232868b34161daae22ed05fe566808324940e93d10faf2e033ae0bb83aa0aae7099cdb0fbb40bbec2ac6c86292a2a135a969aa0177d7e719d7e866b0178ef2b5d9a8537f3bd9dab1660b7a1929044538c88bf6418464beb553e2e04bc937e859dffbc6af6d8d25ac50cd2dd76695077f3b15bd02cc1988b420b4c58a9545c6454749141e88819f40644c3aab54bb988c6b5909dec3068dc9e2610c66d144a43cbc61d5ea8d1036c0ec0dbaca117eac6f22f05118c389e6bdc562b36b62e3501e2b5dd1c88b0d993c6eebe23ce983dd4abf47f25e1dcf0d950ce19df0b85cadda41c427208045d2bff1a9ba06f4a607d822d582fa6bba1d549bdfdb5da0dfcf653a1c5a09cc930146b57bf01ba0d1c637c5e2eb92734b030de00c1803cc1deaf6c4822966207d0d1190bf07ea8d48508e23f34ce8d431a9d65346416289ce62c5690e8fd7183120289a821e61e4c563ffbd54434e2f54079f19447c3c1be943ffa00a4441a6e088a966b03f89c597d1b0f119d23c402583e0a0fc6cfcf983418e9b8e5a3e8cc5d8b7d556bf2cf9aad95caae5ba81ca308c10da7ee2d739093050ae4706061ff495297c01f13295f51fa70e1e3dc912a8f40e15060b87b9875de3d813831330c4a84278bbfe2ddbd985ef5586c59fb4aac171dddfd90f929ec73c86e000cb4c85dc99651dc23700ecdcaf4617938c8881b9f5ad6d17678b42e5367a9d95eb76907632598b36a23443052cde884f1e7a4d528c211e0870ad1f72bbc4ad72faafc8d102842f340402ef946f4ce172c34c986a9b6dc908858086ab5862046d27f526d0acaf184520173bb016c9c0235d524e4a5613bc3d922258571a2c3b6896b89e2439c3d46f78715ccdea040ada11ece0af0af4a4e4a90cdb33ed3ebbb43bfa2f1b9d9a44078804637633ee68c74e62b2e658c1a3f53e766ce56eda15cd9207a050584457cf4b47624fd0ff80bc50caf3102bd00023bc1179f8b0b34bf186e4e572afd42f810f6722b1223f87be7d030ce405302d5c6d605442b45397c07667128723198e5378f04c93051de504e871122a6e320b26a1c7226251f19185176b1de604a1a63d0d72eb5323f3d4efdf7275ee588fe1d086cffc837cae5e94d59d18c54c8bd11694147d2a7d99d83cf0ce96aff79edcb853ed8f50b665a4a28ab1912a60459408da0bba0f0ded5fbe14159fd88209894806bbc3509a808b2d6bdc08b58a4cfef490d0dba1aec4e663be0e29c621b0c0f57985a43f8738626e426ee8f144bfd47b7583b7583e0f659f1aef4ae3a19f2bea1ff2c7accb72d5a9718cce4ffc924b659ad3c663a8aedfbf98445b17cf2e422f426972ae5640a018d54c8b4e73c49b8a91174790b2c5caa6e920675c91381720f72caafcd72951aadac213defaaf6cb9990527eb61614b8fff4cb978571a89c7acb78c5839e14cc03612c5857b89071a29e660f9ad27e498e64a6647c7b90dfec059c6b9c0125c5634ddafac6683f061a8a2bed29a428762f39d32a3d291eba2a33031cc82673fb2d4024606a6314e9541eaa4542ed5fc1056d3c862fcab7ef6d0882e0898602050b73c4e0d800d70c3fad771c2b6a408fdf2585a0d13c36de25327d98d38238c21e33ab71e5fef9c4d71107864631484a89094f20f5864e9b12e2d03e0431fa553d5f9197ad70549f8201c484684949dba7907cb9ab48fad87a1131d446928f2dfa1e17cb30e0e9772b9c3dcec1cc6de9ea63dcd8f9c1f4de5fa95bbe5a9802adf26c245ad44747ac9f2df322498078c80e670770cb68b796a85f0fbdf6290b0a85147ebb703b83a192328a65b30d7bfc4ee8ba4f1a13746ba40ada1591430696783d9d9d060b0d3bc7e54249228910692011647848333b86dcbac755e3ecc5fd026cfdd5e5b9eef66dce99096cf7879d064f446cbb87e17c84bea6863abe02b774a8430d81980898899507b1931f4773b537b128d8dca91dfbda1ab7616382e7079f7fb9e50cb2f38f548fe2d5cdc42b64b75917d0242641ea829741b22b6891cc6e56d0de01914951ec1612757d2c4178ff5f321efa983deda6fb851080d12128fa53d54aec1abfca2168106d17e38ca1d5508b48f4eebd6b00ca897af36b0be102871659d1c803579cb3d5222e635eeb3ecbd2c1068c934650830574c6f8c3900671a6344d4d605da8e9f693ee85f86ab3a9c257088942dd4fe504b8179ce741ab928770eb327f3c2d29af6c1a189bb41d74409475650c7975047441777e0d96868458ebc92ac65a9a884668f8de038ab4e34a473fe30a68e10de68512e4cda90f4fb86c83a5ee2a61bb1b4c0852d91fdb62ead420162a916259a34bae2cf28796d5ab2dd3208b2329aaaf68191258789d93f12797510a279aa1d7a33b0c9cdd40445583ba3aebfbc70e53568e90742d621154440d4a8154637237204a900a1dd03a56fae0c9886d6f15c96dcc0a4328d4ddfffdc9607aa551c8956d2dbe89e62d98516a46781740a95b9c724d93a2a7b42bb9133fe832c9a0c3b56f0c5fe0f091f694dcb20f8392ac12bb1c38d04fb7960aaf998c6104d1a518e3153f84c3dd4796d02b7df9787f7f5492e4e9da688d8000241b054fadafa7e522ccb30a627dc49318346fbf8827f7b6d41fbc3d3b1d1310603d7e1a381d667f2340018c0dfb53f49f037dc3a341c73af8720d9c1832d64c34bea85504e07fa04cd12862288126eab349f029cad1a54645f1eb6f8348dbd7fc919d7259203c2010cd799634a96fe6d94ebca5e3d1a1f2abeb2c1ec371cfe9168f12370a4750c46e2395b33d8c4701e050027101dabe768bab8c0029aba52f0f66d013e76e234ac047687640444272afa0415407d19382d4ce83ca4e149aa340363168cba0263494024a02466d5f4092595507559bcffa3810bf85f6c18383ba8aaf50b72bc890878178960dea2ac8fcb014c05a89a7f86c794bb61a3cc0c15d54067786b027cea8e5eed5fee6be27586dafb3bb4f466f030547ed8f2d25b663169d5967fe76fbdfff524a2953f6060707af062bd6b6c1020b20205b3608ccceb23d809758a2b30082b0871bb6e44d984478132a4378132bb0246f82b4ef8609e14d94fb6ed8116f2205f82630923761c49b5015f126566f8275e44d04c1c89b08df84b887fa8dd934d8110a10b3ef86e136ec16ad0cc76531642f90d120ab410603590c4c2eb3e1c2789abb575cd602990b64333ccd95dd9e46062e630197bd781a93cb6ce0395b2cc7b55578ce96428e6b9748ae8df34ee1250f81d9f399739db219321cfaddb29e6b73b7a8ed3e7165b86c867fc96cf8cf81e1a21c1b031a7110901d48bf7bc50e1fbc3b8bf578f4ee588c500649c3bcc1a37d909d8de4356bcd0a1f5cac48ef2cf6c2a32a6888f1a8c0dd59ac8547797c4db05f7c5383c44e12354a76d63bab39e2d1bb6d1d0464176d9ad82d06648a1fbe892d913790939fc035b4986e377fe1ff321a3af25810bf6c781327bbe19b82cc0559b0df2d4660c49c24019e27308a28ead222ad572d3d12b95c3226143b3c1f2febbcc353b1c3376416e9989856ab05c3c7153d138a154150a8d8dd481a4c0deaf5bb614176fdaa4230e09d29b9331a075250b1db3b3a2b2854106083420000208bd59c60819148c364fc72f920d4d5b5aa8f1417d8920846b991e202f296f7de4b7e49846c0159a67425914d963e7e9718731442e43d5b6e99089be5627a2155a832d5133ca19cecd7bdd046698fbbc5ce6921ad542a954af553a95c8654d9260327838b177c403d74dca8a1f0f5696c2e43bf755df7c86d824f337331b3cd6af8d5e4a25709505d718e47f5c2a4df6d8384afb9bb8597f86e11cb69d92f47081949727b9aab83b7bca8ce98ba7361ed7ee30be77969c1ecb387d487b1f772e155bbbdc024aa377ae178ac880f00929719799b9733a6de7a407d40d3b187d70bf77aa81e8d1eda437b2f1c5fa1f008d3830102e36bc5d0b2b5702d1acc15951492d8ea810102d383f1b56268d95a34b470268c6f05c6a702e34b81f191607c228cafd5531a55b504a2c6b1b45bb84a5085c94a6d85c70a6fa5b702649be48aef372a5598a804576a2b3c56782b40567a2c2b3573a5b6b2525359a9a5acd4566abe0e2c4bd4f8537fc01f6e051e61ddc633a6aa2570456ae136f216798e35a276a8025449523afd544b5440955525891a749b2eab906a03c42f21f5696c8ca82429a202bc339b2147fadda59edbe9a75a329e7ef8f4339d7ee4e977fa9d7e479ec688d045551555a24a608e6f91e7ce5de23915e7b1518e1bef16be2611e46197faa09242128328bdf5e4a722bfd82f099b2227eb9dd90c39719b1e1b5b10dfd8c8e001b7c3373632f860e322bd339b17822927c11e27c1e08d208d2089d2eb2b94d3e6f6537fc01f4e1f3172b3d5624d8217bd2b29549e317555cf1a7005962a91e7f81e79ee2cb59ceb4ad64e9ee2273fe0af6745e26b70b29bcc26e391bd90ebd3c48031a124568b13337264557f2a10f81b4f9b1f114e562c156b9fb88dee69704fc3a2d11343864761f45f10500f9b0a54f198ba3a396d6e2a8b9563ed12cfa156dcb6735a48422420290989b4967628e94abcd20eb1446e1a594a5bb8cbd07ddd316543559922099192908024a15e3b21ada51d4a3b4a3c91b492564c5a4da4955c512bae949e4e9bdbaaaebfa1f5b7aa5c3a36ad2c1e0b9654bb650554ad56fc05e65c5ba32a6654f1cf59893ca7daa3aa65a53a592e432aa0baae405508a804f853b158ab75fda9424025bf150a97a11ac115c5e9a703921653d7f5a70a0195fc60a36a665489259a51a51af1705cf1cf6919459e5bedd20ad8692e2b12527de9e11b598affc547ae78885feb10505d57a02a045402fcad4340755d81aa105009f0b70efdd475fda9424025bf75e8a7aeeb4f15022af99dac2e43173dfdd475fda9424025bf7024d22afe392d37f34a808794ae9695cc72128fea177e96d78b5e98bd392a3cf76f3d83e764afa8ecdf5a86fed1391409fd91b81d11fc5a1f12f4373978a379f8d7efdce36fb40fb987fe3bebf819b94b8dda20d15c9dc786b85bec1cd6fe1df338a49fe9658f6fedbd39e7dcf5c98742872922151725f765429173d96112362d344142aa0367da6298bd0824a5c88554baa369149231189e83d99adb009fc6a6894dd066b55172d15be4e753718ec765b70873ce24fd6e9b23bee6c298addd2296c3dae710214144fab5a93dcd6db1cedf28c7252609248da68773cc4bfbaed3f4f45b048982d26a9d9ce7dc2dc21c1e9e163bc7b55bc47264760caa03ba437190501eaa04babe6a2f162246b1272f1b4d0d19d87d2e1e0be20370b70c8f09f1b2bb63782ce86dee0e61786cc52f9d739e31dfcbee76019e501d501ce88e84ea80f25025d0f5c5e25513511ecadb28ef04e58d50decb4653433e696ac03a12bf4e221d0a0a46c1a42dc2a4303ec0f45a2eb46aad5beb85aa85c54c31b570a8ae345a81f1012685e9b55c68d5f08d4d0bad174d5ab73b430109698d0ef4c6a661ca206304638a9f0a1854d854bc50715361830a9c0a9d8a1a8fde1d862469f21d1e7ec1f0b39d246fbbb31da08a172a6e36fccd8e12ffc2373b2b7ea9d0a9a8c1337777dd7ba261c0a5eff05c43b66979ecf6343b4976802b56ec2871ba321a03172e56dc5ec692af10698961b9b609b0ede23c2ed4452628c3c45573e170ed5c3b5c3cd70faed4e57301f1e8dd6148922ad72f2623b4a11c0643f2b2bb5d38ccc8dbdc3daae170afac4bb60a65645c3d57cd55d3e172b95c2e97cbe572b95ca31399d60a5d900e0683cdccd0d09cb7f3c5893b819cbd1388d3771271fe4ee09964e55c49bb54ee94f3c5793b71270e9fb895137702397b2710a7ef24e2fc9d494ee049c265ca8c0945cb9e49893a34ab2555122153645a2c1dab066bc73ac252594958409612acd5a5e6c28254b9d8c290244d736f140dfba585b857777ad0fbeef07c3c2db26ab074ac9d8ab5636d9a49aa9cac1deb084b65256101594ab05617162e35171bcc08254b0291c47e415b75d26240e6e9a4c57a904a2db6eecb6ed139da39eb1362f609261572b7fb04176e234ce12cd894d2c55314b92b2d9b25c54f09407e7a74045049294977056df3b6b3c28e3c0d8bd0455b2c4c150269adcc8422d72aa53cf1c43db5b28c995ed307b3673231832c2c586a2c31b0d858702c343c7a771892244bcfee8601c258883b62e46b84801755b2c282176d72d19a6da73e684590fb4abd206930d5aa3b1f84ccf4ce6246cc1ebe89ddf8994b82cc1e90d9eb61f674983d5dcfd3d89898c13b8bd1606131a3d7ee2c26e3d118709dc5c642030b6eb3f4c08c20b30e05958899bbaccd1dbe69914288c9ec149e6be556ca57b2286b250ca5ad9ca1bc953de5cfa37787a1aa2c753ca0917ec370a6a75f0e3b62063773f2191b7ecdf0ccd46041d8106c8529e130e0d324e91766e461422398fa342d90295f79d25c29272d3664c782fa0dcf944f3c53be9245592b61286de50ce5adec297fd05206884aa5a974b753fa2447ccc71c1bf235363391d1bb51430c1832d880c82738987aaec005e1fa155378eed4bf4ed3b533bb68305508393383c258122163b3d9b837692525410a966a9474251ca55d89c7bf4a3c5ceadd1290922faf768ade3636e46b7e4f5344bda81027d27d4fd3434a42485fef2c16f42829886f6232fe15ebb93a8d145405633afadd61500ce262b560a9460dfdce62311ee511e3e19b189026bd06098fde6d83a94860457c8d2a24de8c27dc656f1787c1945c740de2d77579934e4d1f9d30a08b08326f1aac3c82ccfb84a49254abb63869e61b140470636214b928869bf865636208300ec0249e2b7ab231665281d4f5995d3a0b6fed8b5a9be22c5fa3ea76a7002285cf0023e6345d3c31623ed355dc3e8dcb558a98c3ba8ae78c989bf003e8879e143b52f0643f807ee8e977a7e0a5d8a1c3d3d1a163039d1d3a3de8dc4007073a3c7472e8d040a7063a3ce8ec746ee8cc4007870e0f1d1e7ef8f8f1a3dfad93eaf0a0c303003a36e8e07478e8f074763f723f0e3062feea327a04755ee8dc623270c17eb7ce4de745b7f5177a0a3a0cdd4557415f418fa1f37414f416dd855eeb2df41374163d86eec2f780f13d5cd0efeeb7ee428f417662c909608fa1db7aed532552200270901840efc491132ada6930b5d7e0203100f5c4119c1fce109c1fe010c1298203049c217088c0118213048e0f7084c0f1e104e1f40007081c227084c011c231a2df8da3e2088143440c87070e0f87089c1f8e0fe7071c14630acfc9d8ad673d62bca7c1c1f138bb1bd3f1afbb55578f0d890501f5dba3dfbdd3c5703872f4d88d1d3af4188defe9b1181f93e161f4bb676c329ac394f03577b7384cc52b2c086bf23477bff0991a6c897ef709a8a0de8a1ebe49f1c3af4b9bf5c0dde0fadd38bb3bdbe15d1c1c3fdbd9f1688ae762604bfe756148fe75f7ce8e9fc18e3c7a673075651a514e2c96164b8a272994cee24c37a331cbe1696635663acc6cc860b6c39dcd98dd30c361967b9a3bebd17c2663e633fb59f1d90ee3cb36bd6c94d3996be121083b0b0f01d9ed66f19773969be598d5a0df3ddbe562760bcfbdeccc73b6302766b366b97fddcd32dbe15f778b6232f4bb6141980a03c26a421f6f16036fc45d331b96edf07ba6c32cb39e74364317c04c05154c28f4d6615570e9a41012b5599b0653595c7cc5ffa227fbe48f5fa9adf96f2e8eb88a1d8e9ffd5ff269ec09db1ac5521cc5b90a620246cccfbec288f9ee6289e762ce14510123e62f2e978ef91a1477e9342615483dbb7491866666660666b3d579012303c673a7f09c6b93ce18fed875923b6778c2093422dd80f18413685604e1adf0ade8cda0f41e008111f3544fe1399916614e6bb7b60bb7ed1c9915bc8b66263f5bb1a3866f54ecf00bc7cf56f8b022ddf1331534a8c05dfdc3dfecf0d8e1ed68207eb613862469ea9aaee95affa09efec57a2a0b8f09e131df4583a42c8c766a6bce820c8721812d61f14b2cb1c4123c2d768e2a0739e79208c6ff4bb1216611fecbf545b3499b4626513489a6d16432654e92999b287f6242452251d6b91c738a8acaca8a5d491953a69531c564a698a659a6504cf384344d13659e4ca6699674f9e671881209bf177dfb38b0bcc71985d622d168148624520d8cf11645711c4d18e31316618cf188370a6f144642e24d9a5098c1262727229108052535a29872ce5a8435c61ae3aba26255b4de755c96292356c1ae52aaed384414499cb1c61a6bac31c65a63adc53c662d128db4168d3aa5c37b348eca9234d5300c47dd6a656e20096ff175e4688bf78e5a6bad75f8eb78639cd2e11209a9353691a612a506a4cefb44629c31499ee08c31ce592412894438637cde7df9b374107f73fb82a485fdce5a77a34029afdfcc83b0c744e0eb768f46a49d160219c1b34046dce87693aea0048aa8d11f08c950a791fd8bf8e90f8444a8d3ccfe4886f493fe40487a19d8c16f074276e063073b9ea603367c03693713f22ffaa3c6ae3bc0478d5a905e901e803c15208247440e226610f1826e77d8015f105faf3f908fe7a381af4610a0a05eb77b0ce205c9a0db957e7d1ce871034a8fd01fa847adff0efb03a549baa83f50eaeb9608dc04e4dda28b71680625ee0ecf0842ce41c8e61c821079a0453c30e540a47570ca3112f90873e841f340ca4239e840e650430e3066bc1073e00967f08c3f489842209846d4d07844b8a2518456ed2669f868f8e879861f248d1cb99cc1098d19399430f5732b730a8a1152c61f3456b092aed0b095846029eda025ab74c1bcf2c161a503ea8af0744172cfee21d38ed08554c24b8e1f328cd8ba19ba1a2c4e0783e43925cf50c7736be586c2989c90c9e7b96d811467901949be71886b24f9524540c7d1c748f6ff91cb11e666e4ecceb9c8b53055d61007551462c320137cfc88c1929ceef206b09de843ea7ee050439fc16e1c5c8cfaffc08167e8c70dc09f4ff7e386f4c70dbc1ece409a7e4ea8b15bd7edb96ac1103086b8f5071aa206042574dd1f0808c16ecf0688aea118e40305c1fd8182e8fa0305c1f5db1f28480b7aa93f5010186ec075da68f70a43e8d0fb030d31a3932900f980627f205f91106f06e073fcfc0292bcb33c9af68617fd7b73944cc69ef76a24b3486b91de48a05c889077cf68d9c769a67c3216314779202d1a84df625c8e1790b4fcfdfea891d680d4f931c6196392111263bc35296b7ebbde404a7f537680cdfcd4dfd48f10f12be1853e461036e7c78f818f838ff54e880e4218d1389cff451a8f447cf711cff64b247dc32352f8223cca91bf69ba168eb0e8492e885ae71c84ce3908fdff347edffd380731e7c78f310a58c8638c0216f218e39edf57e31d44bbedee4d8cb6ddbaf626c26db77d6ceb96c5a31bb7f0b35bbbe86da21bea5182f35d5ea789dd6ed2db2d8ef8eeda926ef41bdac21a1ff95884610b3b253db74bda85d7a55f1bbe1915b909e194f48c86fa1d35f1d169da054fd72ecaa36db989c5d12fc09097d0efc67f8e7ee3bc7388826d7b408eab7ef78ffdeed535f1af3137193710f96f44db3e8ad7fbf55992244ee1be1e05bdbfc4fbbe5628fc9e417fdffc3bf39ce20c3ff541ce38bc9bc4afdf3dee36414eb8f33d777844396f349653e8272edfb9007ee111c77b1381fc9c70db70c0688b4820327db450a4ca67aeb44dab0d1fd860c70da7700293c0c62f31b2825f2d4774a2f8d50389451e5f0e820dbd45ad335940d2de77025fce81dfb9b3996a057b6fc7fb9eda04f8e61c44b12482b218e36b6168d13e88f088fe9b047c13e17e55e3740d77c6dadfc2e2da3f5af1780c26d9d602ae66cb46fe46d7f02bab6fe284e3d122437ea67717ddf1a89099e65df4871408df452fca0989daaf7fb1122965b7d8392e7ad35c5db57f5f8b538a3128be79d1577401913ac8ce8626155cfac9fe135714e372fa9d889c54d40bd40d45030a87cafd0bd5835fa8dd455138562a5ca2782b825c1d9648272277160b52f14d4c464f3da9374eea4945bd40dd5034a070a81caa078503b543f1fadd237d92a24232a1c8b9443b2123377e3d74a03143062e2643ec859d2db96289634d4fe14b01441892e44a15aa56a158abdd99e6419d7066d5a280a4697a82922a553097e1a933b7653a1911d94f7644a6ca96c880b2a08c890a0035153b15381ebd3bb5c3cd5ad17b415a2dd3c974329d4c27d3a9643a1911d94f7644a6ca96c8803226b220006afdee90a744969165c43ca6a7f0dc19b35b842e1c066c11cb719dfa876f6674c19e15f79bb9a9e4c4bc40d2c2de32c29caed3053cd9a84b54a94c287227e69cef544c48ec172bb2d11cce0210fdee58d0d7f44e3c08508c54c70d1a326c35c115860c2e5ea8d520e15f3543bd068947ef86a92a4ab803e3bf09d4cdd6f0ebb6ee4b35b7ce1bebfe258c7b288930446bc79c8768ad75369d6670c218f300c502838837c63afc92595afbdc3e4ada2f0acf1357f3db4998c746de2d760e0bbb448e0d6c7b0e475d7fb81fefac45e10e47278955ec8d8c7ddd7dbf46b4433e7af15fa22d6345a97f89b6c8025dafc0bbdea2c8bec5a791d681f82d5249255ca224a608e143d2afa853e0a2a21de2589a568925614892b6c68464346d55554352a9440af745c5d5641a4f23a9248ea35822997c6c943dbd80b48fb239b456abd56a2cac90add1ed0f0d2f601095dc7df7dda8552f7a42e404258598acbfc270861b432f89a3c9348ab5d2ae91762ddc281ca0a82d504fc810df90f895535488b0f648911b2ae8e6268b4aeaf66facfa2f247f433af775a1d3ec124ad82561786edf0aea84328d2811552285a89108a55128140a9531eada009c90a9e89a396bb709bafe2e92776653d86c6d4bbfbbbcf6714c5b73bb0844fece1b9f2b1edf47dcc561fee5d1bb4ff6ee9a7f599cd5d7dc7d5723209db57e7e32020ea43501b617cf20ede6c1b5145c7b1379df941c69714d06a2ca0de168edbf45fa77c657e506d26efbffffaf5a21ec777fa05fdf68f7ffffffffffffffffffffffffffffffffffffffffb24d26936994c9d80767d107e7920fce3e38fbe0ec83b30fce3e3c954aa5522e1f9c4b3e38fbe0ec83b30fce3e38fb9ca6699aae8c7d7026f9e0ec83b30fce3e38fbc0b0582c96cbcbcbde9c9f301906065f0b83fae0ec83b30fce3e38fbb438e7270c4cab151323e3ca2e17bed68566ec83b30fce3e38fbc4a03e38fbe0ec2323e342d1d7cb041360337966065f3b8366ec83b38f0bf5415fa318f4fffffffffffffffffffffffffffffffffffffffff3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3fff3f3f3f3f3fff3f3f3f3fff3f3f3fff3f383b18ff8ff6fdf06f15b16672dc25a340a499944c2d7924421a9248e791cf1b5e35a1a4d27149949125f4b9ec813945499cb125f5baec1a126c155f3e8da9aaad9fadd293c2efadd2ab61518fd6ef3c6925958f0b52c355e8e1e783b1fe90e03b11056828158c54378c5ea0d07a306dc6d46cfeda277f7faddd7c70dd2efc6bd4ccbd927ca2211be5694d38bde40d2f20d4f2ea2288aa5daedb9babbbbbc9bdede9af67c3f15ef6ad757abd56ab5fb53816b90b4dbed76bb5dad56abd56a2f2727272731e51abcb56bbba53ddf4f4dd3344dd3dbed76bbddb0babb3dbbdd6eb7d3ed78e9ed85384dd334bddd6eb7db6eb7dbed763be506322695da9ef5d99f6a81699aa6e9ed76bbdd6e585d55555583b7766df77671a3344dd334bddd6eb7db0dab2a56b94aa55ab1582e2e2f2f1bc5de425c8fee02699aa6699ade6eb7dbcdf67cf6a702d3344dd3f476bbdd6e38df5e36e7e70903d38ac93131f8da98137ca37b80bfe2605ed775bda5a6c5d91eabb33bcb4bd334cde999539813a6d58a89919171a11945f1b528190b532053b3b75e0045f736cd350492abb96bd696d7d3e7d379cd79c5796db546ab7b74fd6e9919323af4bb5dba8b5ace42464d2aa039fadd2f930ab6eb9d09d90413f0b5268427d50a2412747c6a54378187bcbede835ff846f7fe379eb4b074d248d3f4f9748ff6d174cca9ffcf204dd77767291ac8fdca3445b724c911cea296d538ef3c023b144446622fcefa57a629ba25498e44235c228525bc0221e1688b56c818af400849e402a9a4c5d1f42bd31cc5d32d49522ca146fdf7681461aef97d9a7cda9c45329fe8cff8febf2589a517a2f8d95a6badb5566babadb5d65a6badb5b6248a56dbd174b2daa2acb6d65a6bb515599454aa2cadb6226badb6a5b5565b91b57a8bda8ab44561b51559cb62378bb5d66eabc36a6bb5b5da5acb72b1dacac06a6badcd7777c0daba3d47914d098a1735323960b44567095410b039a26d7344a76dcc196d5bcee111ed16a10372cee86cc1029523da3747444d006f8c39edea641a0e7bc41a3dd6d6b8d97d77d8de7d5f2a32448b7bf67eb7d662bc51829034b38b1d6f9cb3ed9cbdba05d01b6ff3ade8beeceabeb099046937cd1c95525e188a763520d9ffbdfbe39328870474bbcb21c8fb765f6cedbeed10ff667b712e8990b414743a1a9544c890442a954471244f27148a8ca1a0a0a0a452652ec3949c12b64ab234cb5549246fd1debf38b4a33eb3b8b23b268231d952eac8ab92c86a65d2211d41b2582e2e2f2f2614019a79a804cbdad169e9d00800004000e3170000200c0886236196a641107bc80714000e537a525852582c10c882d11cc56110c46010638c21c018620c21862154732700868559b5b3201a75f7b59a2d0e44b4b25c1ac971e0cb5fd40f41f1e6d2a81d7dce2389573d4a8dc1013143e345a907d358014a4cb8e48de22c6e26d827e66c4fa65b7de2eb801824ea3792734cf0c2986a495bb2f50caa4062422ac21a8c28ebde7108931ae877cad883705c03a39b78b62f91cb38f29f6e037171efb2bda099b81390f5b10ff10ccd9d994076eddb8d90b55b061306e93d0069a4cddabb96feba2d895fdd45c699f8def61f6b2f9a7931a626b208db588084c62c68278534521d5bcab59c7cc45c8c9733a2d2f69c9bdf2a3b85274cb61fb22355e4ae62b614b5cebbb7492b6ef9764bc12f65ffd022a150b23cac4e708a4e046cb470e4f9ac01ee508e60278c2efe849cec74ba5414e6be0eea99ec27643bbad067803ea6675c0b60fbf4fbd29885c1d8a4ee5ec39b27dcef696b614dd166a4cf42d9a53989035d8d02523938e4fc81f26db64a9631b0034f4b50a028351ecbb387783a040388343c3f83fa83c9a179f567f86afeaf745212735dcd8b3c5bf1c0c0410d451ef3958620054e393d32955cb3963b735ebda8a30077c34daecbd368ba6a1f2b8e11875ed30cee1d41da278b5b0fd9c617b8fbd822fd58ecae453ac35fa27c1dc2ff6eddaa596bdee3580e061bd2e9ce7c0f8dacbd0bc52728b0a274e6eb4e11d2795f732ec0549ce849fb8b897581ddaa9a8c0f4d9a4758f9da62524efdd88acc07bc46a43ac59d362be40501d93de404285e5ef3861c4336771206ba50369b9c2be49d5a3649a11d35ec0411bd8e395943c10e9604d189c0432d3bfbc55cac0b509ca7b38a0b30ef400ccf397be620f90862bae4ec290c291bd6d1bbfe3ebf3889a2eeed342c8e1b454515556dc3c04c57ee004975bd6dc753eb48d9079c4c962b80622102605ff2f4acdbd30c3d3889e8561f891709d456f1a270ec7a481035b5a2d8bb35cc1014394cfba0d60618e84e34e85bf4ca50d034be5209dc4493a7449ada558f2718f2f1cedabac4fc9a1a18e5b5ed633395043b5d8dd42498a61563b1c27c2a5728e639689b15ab0b02a4de641e433c532630015c5bba366f289718b4997394054d45cc71aa031d5d13d21ad4904613228f706f93287dbb036e031411dfff4b28baf9a25df6b75a31eb1fa2deffd289dafc602b6c11b05635fadb48d4178a89d83dc841fc390db698c8a49b398c548bb3b45d3f52d80ed6de3977f31d70d0f03a53d4b89dc00c2e25792340521dd7c4e922079f987cb81786acbaa101037e6ad7bf78091e26f06ed604739be72e53d94afba808269e63447580466f1044058dd71fd2fd98c5983a6bca2654d6c4d2e0269f0cb442b1a3a87b12b715892912b00326997110a8e82045e701d9366bb34e35af6b0d2fdadc51a61f0c360c26a177d995a6aa8919ed418d00f8d51ce50fe8f206c61627f4c5389759c9e2aa830c812520d72b110bd5f2a7a3d556790b665d6d3d0ab877033e29fd88893bfa41d1fb45554894147a212fde40b8c8724ae1845abb087906dfb59381b5065f063e329ab4eeb8c445f0c0248bcc36b624c4d86b10b6dc8e50a3671f13ab0210e9bf700128c48462b76639db90a0c0c193e3da255bb4e3904ce3357816bd68ad6317310880ae6e239e3a8d037a1c138b506882004f9e2f89c22f21b39d545860a0b59d71f0b19e5d23dd6c8941d99974a3340cfca92ad12e9fa263da7183d91b1c053cc6103b745922c4626e1a424bd67b0ffbf7dbee8b102745df909842b76eaddd41fa981ae96a3e73d5d44857d399abe699abe68d7435cd5c3599b96b9eb96a5673d73473a979e6ae79e65af3cc5553cdbda699abe6997bcd33574d33f7bac936cca0da7c4e308a487bb238e435d9a71503fb938648f640bb7d069dcbe6e790116ee8d455937b6f113764aa1593abf7f87a8b65dc0b71a3fd3674bce499e86e5e641fc1574c2ebd47dcd029574deedee3eb2db64139602b33f43f0d91ae81f6fb087ec5e4ee2d820d99b26a72e92d5e8f720fafc3ff6eeee24f73af77c1a5df864eb16272f716c1864e5d35b9f61eef77b10e6bdb513c2f697228ef72ad84d9fb1de20fca6c1fc1564deebdc5eb7d72943143e922dc859cded5369f618abd699b127dbaaa0782bbb66eed5d3ca6d14f43a46bb114a8ed7a5beccaa54a792af44dbabb14d939fa89ed537962e0d6b4c6db489bbe4d6bb86fdafc69dafcd1f4c67bd3e6afa6cf9fa699bf4dafbf4d3b7f9b367f9a7efe346dfe367dfd6ddafc69faf9d3b4f9d3b4f3a7693fb04fd57d1613bdd51cd1187559546fcefde63251fdfa234a53a38bba69adbfaa6b2d2e7aab39a2b1ff929a70a77f5d2eaa5f7f446934facac4bbc7aa577f8ad252f4cad4b8bfce1075e32d7d33ed665d1dd40d9026c6143dce6aacd034ef43cd19b8f812988d69f8d3395e7fa853d99318350109c9bb3ec07f72003ad0426f51e62ec1d2fc239ff8954185c193ec1d6b6daab09fa32c2cf9c5ad1ab6ba955b41043774ff82f88d5311c2cdda9f03f76202a5a2d09eac395ffef15506c067ad83a63af0a81749dbf8c5ad182cbab508eaf38bb4bbfa7192d3cabd543ecb4db4baa0453e53ad4e4d8e69775e698bed83aa60452c5996a74fb74bf3fea6dc7b16d1cd4219300344f11f4173350324c49bf7abd7a7cf489fc5c625ecc40e0c2813c76489702b31376cff1e835984262b1e463113d7527b4181bfa9c410d37c5e331135c95815fb7c10a73828afa628c2ab7b032586c39dcfa02db57eb44a211891d684038ca64dad65d97a49ee85d1f3aad48d5e89bb81a1d5050a13fbdf251c96cbc973cfaf566a96fd5b6bb3c75127dee05fa1e9ef62290cd08a3b006c73efedc5a83d869d01ba0c0ba620b1415c0ce860e60e8617c7a84076bc7b9b2d71e06a74119c7edbe4dd66f3e6ef206c9d63be1ae6ddfc6b7dad676a576cd4bea7f8d71fd5845767b5ac51416b831f7c4559d44203f75da31679e5a17cad43e09033d9daf9809509ab439704e9c4b53c2dc82d731900d1b8c63a0ba0037771019b29f804513fb29837239eac4f0f4cf50e4a1a5d0d5d04c72f9b79b3f12f0b298a7cbee4dbaeaa6c94e9dbdb506e3b3ab59d45c04ddedc28de93a382d31e6ae9236fb941bf9cf2306cb25f7f3993efbaba8ce0974560efc1b222f1e8fbadfa262100ffa2aca0d86f389bfc144e64ca832462a58488ba2510445f50b9f6432901f1e016f71faaf43f4e6143172be90c79b3c8c08031853dd9e43830c75aeaac026de6cd266fe06290e88a3323756f8d6d3e60967b12b2991c3d0959aed4638b72a0225c54b305149fdf07efd5d8c54f2148a45ff042b22c3791b17810f1b8c459cba32b8c7a69cc0dc8f861d6592109cabc327b3950076ae87faa1b73cb1f2f40032ca32e5a4b33e366962c20dec274881ce2b5c7e69828b728e540c5de674d18ba185d00b75f36dcdb0e96c51a558164a3910411b622ec0008cd66cb4ade5d616695e61e46baac82e13775752b6291cbbfa1b674a34892954be63695bbff5eacf69b9e280451f8c077496122217d23fe9d71b8d0d1debf6101dd26f72adfd67886b1c686326b04359b3839127eb38384b96a4f8945c1faf6e5ef7e22454191ce4e5928ef10882b258f447266ca4379b9f772b8cfde590bb061bd463533a3c5690df4346c2de4d922055a8c8fdd3f7ec3b9962960b41ff225286a5836ea9a16aecda4190ee0650d8211d4ef2134a537c1dafae22689c8906b1456e1dcca82940b0b1b442334373dfbf63a7d7933ec3890df109d7028a43325110ec01bd539edb6175ef3a5fd287fdad1b712ea890c71657f79b2f430b7cd6a025f83bff43cd7aad8cc98d4ab179449036668693edf7032f987d8a1f05e3f4e27c005463445c495b9e1c20f63947ac7cf1961dfa4a9dc1eff4f7055784b033e9087d1bf241083c2e6dbc68d4e1b8fb6e423f63a5574281a24f344db71bb188d9b1f39f1c23aca33c31b5215f259884dbf98265115eb8721a3c1af285a460ffbb74df4c6e419b7ee9924e587b0df0803c7428c4b22ed34f4d0bd4781a1e3ca0fa66d91e9b5c523bc49133c8d58bd96c0f98a13ca28077bf92a52249d8f495729d6995d4e89605ed9d96aa360d07d92190a323a2647c7c126dc706b9bfda08c4a5a7878bf8e587e07a70fd3e6e19e5ff41b01c8866e75b32cf5b353fb682b8ec77080d5548e7d8c58b733564aef1c08961d3a32eb85b8904733079878434404e404d72ec1c0ccdbf60d679ebda8fbfb2cd46d7d0d6ce89c9fe3fae21f2c0d182e277984bffadaeffb1e6ec6f0e44aecafde5a57ecae29af8eb04eedf00faa7b1d078929499b425dcc17f67da3e3a431b5e07d4eea56e4163195e5e7647d48515a6922afd1c32d27c731372e7d27be09827c94e53561c3af098ee756c692cdfec98efba55922c29fa97ead647156dacec53c4b0d462fef5322e3475b3f1ffe54123b410b455ef37b712c180c3b83ccf9b3a741d7a32511c8627912d377634e9544525579fef03c3d72539fbc6fcb2ff7314c593c8eb013f69b0a14db4574d44c14d9d456b4b27f20ad6b8b627b958cd35d8a712242fd90913ab4880686d0a53e46d1570c74432b6462f48d53ca8429dd140860c4036abb7c4a35dce56b50bc826a0355f4b705aef252ac5070ba8694845080cd6b83cd8da57128ba6f06cda7301a8dd32f31af59990cb9a98d2e11d95ae2ec5f57471905a5b2334df6412e88ddb836d4df72182bc77e2fbe8514e883645feca0a7f134eed25a0d79e7697fb531b961c78750f374df0375d97f72e067180b11fb707f2f8603e31fe9b8bb917dc95331bc34a69f35b32463da4a33ff67a2ae5e2fef45c0589dceb960be78591b83ab42fa12814de3413a090854c1b2364c2aa1bde3db81d7dce816d4814e316af5920150fb1e3f6511812bb1195a73e29dc5e736dc0ce40e42683d78346f1abba6a4e274faba988bdfa8d90c2b2d968b530c4a2aec94c42e65db0cab15e0ee472eb05fdae3e7fd2680c1ea650938dd0ce22a4354a8bf9b4178921adb0ae77db81ff0eb5c05a76ac5ccc01269e60a340272a1744b5279d968ed33c7b1258525cf0a4579fd0cf274289348c9f81ad9b7e5c05926a22da9d7949939614bbf4cf469cc84a0a44d5c1c0e9f804ecb4d5aeb0ab989cd603af19dccb9ad5dcd0efad7842b97a1c6aefef1966230f9ce749e4fe47cd3a3dd3b1b1ae8791cb8ef6e182634bb703f49d66e3c72370d8497a08473f45a64bb01aab1f3fdc7ce0a2abca42ea52d5366f52a7424707c8c578be6067059951c75d2061057de42764b3b613a9da2a7dea46bf4354b23c42090b1519bac75d7709f047d93b6261808848858646fc2cd3a5c85a4af743fc343fb9d724d18699704b77059b18c69e5a7d6c47ed6c4270fd90241738233ae5873326c7e59e4782f4fc325313f7eff0c3794e12d4c07fb257d95c796806b9b90aebc654bc481f78544257d277612f63c51b31ec6e238bd1a57b421388c4da68b83413d4a5544c500726b7fb9333db8d2d41c2eaf324ba57da854406ce1eaaea9c6a46af1348b5d109d64fb0c99d5e99ed822295bae7ec54643bca3885bc71b877593f443315d0d3f253c72f76ffe0ddcf7a264db0b8a962210c81672b23a980a1e1b47768f5e4589da63ace047f251ba9243c9d1c0004b11536e6924e48b447c5841d75fc8b82ca4b93e3de03866ec444d110dbd6f81e275aac4551c50d9c8662c0e2a9d3e15a933460e81b9e61f43b107c44b17045dd7588baca67fb9f8c38caee4b3b6496d37a086e00f31e23d2e7abaff81baec3d39f03fc628af75c3074cc5e15dfe48e7c902e10257fd4b03138eb9c0bcd4eb2a7c24455a87529bc65e6e88220ede57e5aa9a727946940aa7900bc8aa18c8da498b80f61085d70ade2735bfff2f63a9e4c4a2b7d5d3410ef46080f25f9c373eacadeb4dd5460e806578851e16592de3a519aa3bf69333d5933582b0941e15b94943b08a32a40575b2b690196a95a49c8a68620476f301dbaec19f973ef8d137c7fbba47e15d4964dc9f9045f467e24d1d9a57c113b37af65f2b2eed87221e4089ee47398b974f3210bbab20b7bcccc6698d52f4f1191900d26309cf4f353cd6ca81b77e0117cbb0643556461523422320b5932895ae37ea12d6a318a83faff35e37511f2d71a6d07163e1d0c9ca9c5d1834b649ad9c18911ad178b12f37e3de4661dbfe23e3476419bf586970e6a648ac73517a9a046c4894f7b9f6c038e16f377bc5ca896370710ff2e3236bd16fb682173e1115789aa11feee9083ca686c159ad65960f3ed386b8e6bfb48935249d7d47f7a526472006b9194d3c3a1d825778f4ad2f28fcec60c9f02de27858b85199e9b589dbfb0802ee1439b4640b11018a17b276b1eae603a2de9108513b1f33b31e4245d83c8216221ec06cf0d249cb77427970077fce5f41998c2c76142789668c3fa8dff0ccd9b30a66754a6670a85c44d00252e1dd051dcd66824ca07e00fc816bfbf5bf34484da47ae3e3d26f07bc38019f6f11ecd87c0b76e6bde1c29c76a239ba29ea966aa75bf38170fb71802fb3b630ae9d35bb9da331935f9faef05f542693662e6501df97a2e1c7a1b4c876ab61df945ba1e1bcca4f0579e8e0c0611ab8a49e4e05924461bc3d8c2be8459aa78fcfd2f47777861ab8fd31a03c1879fd5e89f6288b4384766287fca865c7f74358b25b0643f38cb0732d6b7cec7bfd1fb1586f70fc59f0e990cf49bf02fd38ebcde5475492b400e061029f71563ce70bf260033010c1ffa486a61f6c84bb33e95d675b566d4e608942a397e9a9da4b90d9eee0930832c173fca5877bb9c6a0b71d93202cf4b8c8323d091d6d704797f22a4df2d0983a64bd54c121dc7fec92c96140e969c405e5f48307c6b9a768ad1104c240827c2d0f03e82b25da40073a1aeecb4802105afc3dd91c146119573fc5bf685269ec9450eaf947fb1a39b61abebfff010ee9f6fd4df0da743903fc4ffaf1d8e8ac22d678e827bf2a45f98bd1379d5cbce2c939e38145084014ee003b2b04debec5e0fefe292d8f85d8794a619f62e86ac067727fffa6dcccaae74e090e5694bf40eb465a64820c218f8cdca0b9682cefea2d9599ad555d1602376b6dc789e7aac7febac6b463f66d383200ad65003cbd4d732116e023a357f1d9da50c536ac18edea40f3de72ce860e040458433a00677ada40e5c17502434b41ce00b85fdabd0109b530b09b83f3f2056916cbf3266528564a9d9a837c8a3ac6674a2a1582fd6be0e9af76bc29e6619192a6f556141c1353deef31d28a14755057b0d68a4dfd3bae33407a6de075c4eaad41090025ecd8432a81632c0211c02105bd3a15b05cd1054f64f5e70f08fa6db25dcc507ae28962f39d60a2759b1d7e978927da37b5195e7cc08738c9b47160c86ce564a1b31ceff2a43d9a970175cec2a03b2bb3446a44f01f58c1079fe5d4cb93b1b114e746e7db526a1bd513694c9ed9486d7b20339798267113e47a96e593b550a436f46a4ac181cf83e7e4d2ce04b2a1f5856aa2f14e9cdd3e7c88a5a6eea4a80405da3c326eefc84da76a68d35c97ff7efef4bd40ae4a9f8a08cd597b09ee72782cc4c0f02438ebe2c10b2232c1cd84bc69388e821f3916e0b82ec64fa43e95c38d9d849884290eedecbae98afd4d2e1534fa5757166c649c3180ca940898d249076a621a7da50e7aa9c41d1aa2a7aa556241a5f725d119ddb85039789100aa9b2e98f3781a0e3909a00a2ba4aa49a3ae8d84a8801e06cd4e68bd4aca2f68bd4abfce750f71c9b199ccb732c260a3b62ad478d6e37d799d5d472166d2521d8a6361747b54abffe6bfe69979a9bbe69795425121b2d0289e10478ce74c903cca37f0debc36c26957665d15ca86077980d41b866bccc523ee1fac751372a870b08eb8a9757e5462435fa55732ef0d9dd644691ea57e8a41a933e710febb713750ff32265610ccadc74ab98448bcda8755febc61b203fb40347015cc3136e1e664c2d7f10592dc11f4444281e2ed905888451963c5e9287d6f1ab64630ad8cace6587c6f45c4370344099445e8c69d6f7a267d6991e6726cd27c3b7e5e7e640e20b9987f507c8a3a426dc6de055b49c453ccece23b640afa292ec4a20e846be5c9d3b1e1287329f1b3e7b10ee5679d1d82d1c1381e40871932ed278c003b17e050ef3529292753cc9d697b842fa17b2da9250a4ae29c6ac78e3edd44fd0a5c9ccf32601b063e8f654451953871b653f960f5ce44a0fbddd6e31433ddebfb336bfc657f036325f6c8b0f3aec5472fc2eea38f8c15d0b2bf0082338b2541e2661acd24415e60dc7866264783d12667ee6e3003f121815351aa7d01536c686e1ef2b5e72dc728d53544a6b6c2dd04865927487aee48d6eb75b4c3d183d23a2574aa156a762a9988cf9e60cd128c3b9455a327885bf37d08375b02d412f0b1fa1c7acaaa8c6bc5764b51915fd8bd22a189a3ddd08037c4f7db0a808d360168e40dc04cc906a19131dd1ac290be16ff0a0756f579dabca5e45ac5184eb34589777ae8d3d2411818e461c498f18e2cb890c60de3f0449b5e0684789c17f8dccb07cb02e341b92bb3d1dde5163cf54430d29081667acbb3c23995e0398797c35fbce94b822a3a532f5c03b94827a8e392cba44a5e8209fe3db4102d632b5ae638bbdb3e70679725f8dd85be0dbddd2b3a7a74e3d4907dc39bb804717422f5a2c874012df1aee8d50bd2936e540c459ad2443a998679df1447a29b44d710f4933c985d1e3adc7344b0d91e2239a58c77a6097ca772ce4a22000856305850062100e2f060dc1d0b127da8a8dca76f37588e86f260a3af0f6003b5f77189ebb081609a9453c44b5501ddef3f2100920b1691164b1d8fc8d502144b481d67a102dca94f4446e2cc50ba0eaad0ea23078263882d2c8363f4c3c448bcacbe73c3a230a00b0f8548344bfcf5e14bcd7f71b6af63c55f27b94beca35d257a829fb0fca35649343c30a0a849b7aefcb98dbc12648dbde94775e220bb525adb826f329018eb4fc660f7848ae4e27ad942b64007c16f038f7e28dc83f4cf8c50d1fe3ca34bf0dcc2c49b1d25fb03e02b9b3e7ae4a4d8ec726ddb36cfdfd68b29a66bca28acc0d70d96d97d053a56d86dfcb3123bf130d308f1fbaf73f69da43931bb1edd0f40f23f05c101d8efdd001bcb2480950bbed259cf2f974ae17ab0995cfeaee0b3c49dbfbfb87b343960949652e0e9ba2b454de766f51d28fafb8263e99d7dd1ea95e598ad32ea1cbe68ea7b2961d9754029fc5ede02b35455984736a47c19db3911617236c4a267d0f6e9cd6dcbcc6cbd9ca708fdcd27328dfbe45ed359f211e28001611271e88f80ed4e442db39a759b7e2b412940f8b1bdef46ea2f746029e9e9b30c4a88b9e861be4dba467605a14a0964752451d6430f29f01af804dd7a220d6d2609bad1b50e541cd2ad5cfa14309bc981140322209dd9c813829bb4c86c19738dfaf45275e59bafcbbe0fd7e59b40f4633a1769154e5af2b5e7bbdf5381011a1d09912b124ce0782e06e10c8e4c8060d9f679ff7f80b0a52d20f2d98d4e83a3658560bfaba8b4c4522147e846b3a1f01bae7a1add79563e0869f008cc9ae8d7ad1fc3f19450fdde41c8afbebf95bfb45f5a24ecb638d92e08f40c29671445071e8cb1f724fc723cc4768eb76b6bb8464bbad8f71b6fc7f29665a95beaa57b8c7005082557482cd888ef11d7af82adb3839e854e1581d86601f5eb858a866487993f869717da6de289eccbacc09b9caa65f7dd262bf821ec35f3110f4672f6294722c28152d874ad2fb48f65a4d139d434c32b8ba3243b2b43fbcd03bfb13451206611e9220b5fc69819cfcb839e21aedaa8c652285dc8f081915ffbb06c89f05a72b44048f2c0f0d45ea8ae20aae88508b1287926c918b9c4e4a1795c7d4c2c5088711c43f6dcf928b640f58ed0317c700724a8e34df5c0ac91637df98b9117a06156a51b56e7e44fbb82ba49767cf0dd66aeb7e443f34ccda5f6e314f2b08b43d0aa20ab099f88d9c8db96292567406c11f35dc101f0e37134391b05f1bded7b2e44daa1d18dfbc2c885c21eb2dd583b65794d4a45f005e01227014f568b98a74f965c02a83e44fc7606c1be9b6606124b400240220e317922e806b64cc114655c9188d18e70654b834dbe67045db40251204346ba6fe47078d499c32b0557b605bfe4b138797fa1f1d447a0456609039c7e89a2c52056b42dec45cad27a42da16b51c1523a2925f2a546d0b0b04ecfc88bb6ef42afcd3e7321b5e5c2906a19a3f9091d02616089e7b117b0a11c22d014e7e9239049ac97e3d26e2b4530021c66f1a51ac5134d8f015c6f185a37e6c019b9ae83102204b814a0fb423c5807c048024ba42ca5982b31c797924b077bbc53869b558a75fac1c1de2f93d02749f9b268b58658dabe6271127f0c5fb3acf845b2a0a58456647c49a82590737e57b2c9d6175aa2475d955258ef4aa66035140b23fed4f6365ff5e5eec3dd5e953b6578765f8feab0effc166afa5fb693a22e03eba1de8a116b7d455b36f5eed0f8ed340fe3a0e5819ffc6cac1fedcb2cafe60889e486865f601e9c0fcf80c3db3975d7bac7e9aa856a5254b9c55b3dfe0068d255530f7d2a15cf70e20dba03b2f465b129d2f581dabaef726ce0096ddef79918daf9e5e6f9fa51e54ef6a92a31782aa48247b3ad7f8e7509d2315589305e09c85dca2819d25999a67824e54eaa768256a770a2dc2fdb7bc76036a484b47e35897a8996b153dc2dae728fbfff4a4c4ef8363a1726f3c2fad7d99a52f829606f8f1ef56a5cbb63ba45856c83562f3d200aa872c7ce07810fe8a08f53274ffe2224842a892ceb2a76f43e5c3feba6261f3b4c57cc7f1f5d4494e602378948780678e649c36d806ceb258beec3329aceaa216156d646277baccc514137cb3a1306502793f19d89db77daacc7ca31cf8c7720387c3a6c5f16e94cae66cd652cb8b8451212d75136acfc759bcdfdf7275eab2b483e4655ec3c084e21630fcab2696456004b9d6d6d82d82899d5f7ecba262515f6cac0826c8c84e03050c6a8f7ee65d1cde098f196b24fe41ca76b6a6a4623467f5ce86612fd859dde04e11854b637dc661f88d6bd8b0474fae7ad29486c37a33c506206d181e80b69eff17f32c67284296ebe9d84fe86ac07dcdece54c8db359c3b3762e5b26c086c14e81c1bba75dfed79f02bb8931708603eb2ad0a723dba1aa662dcbd424844025a883d8795a621e87aa460d11708d2811c233d5756230159741e0995c0c97e6c4ed8b6ebbd57f00e71193bbed67bdd588c316bda9d086ccd604a66863fca35daefca8adb42317f2f4e1a28a5bcaaf5fe7550e67955868fad0f034aa4d763b16f80d4024b97c324414d53818cf5573fc030f08807048b2aa5835ad2a59a28313e34b29d18094a8756f02e372dd5b691db0221418b5e1d3b19253c5984bea4677b568a8aed3e4dc985e3fd82c145834d8a232b199e5733669d160dfb82c17e80038853a7f95b41515dbb2d14495f0b0d45a5a14a4c5b824355eef01f21a0227992c722e2789a313c7a13b149337213ced718142393477a7783498fbbad9ed247af67d812c0a9f09d2f328ea3ab39953734795c173b12fefa328e8fe8664de17befcc29aa1d2a04e129dcb24d9d7d05a2ff14676d1fc6d62623325416d25151f9e543274faedf3fd43738033876b58eb1880f5c61254b1c0e9f38aa9f88b0ea256e6c63510cf66c985bbc1485df41ec44fab84c9a9bc396f07bd64188fa32a103f422aef304598866f2af487acf777ac5e0a5a7aff965353f13afbca442cd30589902418700e7736b584246f535dd7fa6d1eab42cf772206e9214194d5b6d7ab84f428ff336e07ad129e67959bad70ee552af13316cafeac5a4e7797c84d9853fbeb4e211c5db82efd49edb1d6e9f40a4758e5e77b6ef5ef5c5812fe0c3c94e7796aca38ec9db6237853cb1835e363d632b209da6efec1530e8d389bfaabd31e59ff6f56b676de021eddba7794e5560b6ca2ae3e75ad96e3c090baee433a99f6a76df4f3cc991e96ddb5711e2174d1f836ee2fa45d7ce94bf9ab5a4e52e330ba27597d54e640e33def5931285bae60c35a54601828e5b15d4121f46360ca518cd49389b191f27e18f3eb6219236a48c9874af499227b28f30dae1a5a006d31ca201dfa13a0360dbe7ba2dcd11d05dab689c30438aabed8fe002af48bf053c3776ce0d9545974503f5d96d2e810d9ebdc2d9cce1b9cdacca9de0aebe145ccbd2f453b6b17a87449a5fc2d759a0c6dbc5c36212e0b0f67e8d8d6900246495399c39b98aa1ddea149a35b0878c3745344313e75e8397a96ab7302796692b4fdee74e9c6761e56c1528ead5f10e3648356b2c336d411fa0af370950d42e534fad9707d2f6345e63e69eddada6ba726dd030a85b2dca6ff1b4c50b7fa742ef8504ad251f046f62e8d65c734a0243c94242e9d32f995efaa285a050bfd2fd3a992551e5fb5c943eb8b527910c5b650cf6759db903828ea2a7b5de6a7240c1a8a9c0d2db325bf8d96b8bce22bf4ce97b2c66121523a4fd216842ebeb0b3a46f11a8944ccd158b8c53c9db5631ebaf8cbc28e3d8d7fb5847461ae0659bc3de8561d80e883220641917a39dba935d212ec17742cdc416375799d5db23a29c5f7d2764a4ef0c557c8381019d5e8abd783c8e4a2ab4ff10bdbc92e75cd75d7ec583505ecbd93226ec645962f5532b14d751918918d027726110a02d21add89e906fcff9b16202626b48902fcb3f819117b52976ba385671e4fc3c722d049d3b458efe4986baae15947be3abc9690f84f87876200473fee8ac5066e2d5c1bad1ae518a40f85a614385dca6e6f23cd2ab5a5001128ae2d6b0ba9dc51405f8c44152f749a17f583a771e07d3ab1cb5fd53b0765f715143b539a66459f33bcbb7ee7f72fbbea0fa9f7e3b73c6335d55358982b1b9348105002965e076e3da374d4471675c958ba4a30bb77d73c5c2c0cad561cd31981c830a971d465912ebc6464dff3dff8f970286bf15bd944cf403643ed37349d9ae4c5918e183c4a2315dd59125e6ce50eec533991ac740bea074e4dea58c4ec43337a743ce73a371cec1b36e05b808f5b4ab3e6c9b293a60c541a2d559895d93c8465f688c919fed19abccb1b0261a63faa50deedb656c4b9637c4a7edc7c47273bd7d2f0e875a0eb29af247790e64368076b016a3e1c592f4df5660a560734a8e49a2c7a8c13d95082480e2599625ab420ec773c5b68ab7ad85047bafc3adc3e75d5746521e3c07930d31260bde9f440f5e2812239e843b93a2911f0a128f4f9dd43cda715f77244c2e50a84faa8eb36cbeb9993b55f851432c8a0d338019bf82bb065a07827f062e38118c9dd8f0c28436b4f89de077d4606f5848d1ee45024b65082ac8fc8811b643bc02511746bb95d7381179a3300ca7b23a2e1b5985422a2de05c8fe4e8a39fa76031f1352c7be4a42542f38d99398ee8d233cfc4631ca45411f3e64d433595de354049654dd79458e5f5bc283bc811139bf76444a0fc277a54ccc841f1a27f3e580ad2d1c037ffee45d3b656f4de7533c66144e80f81e28b31de2be02060ca6578e24458a303205c31a0a07a80c2e4db3e619196d9b898709002000c720c11d1a86e649eefd0c69a99eaae72172f022a2f309f59937237a98e136acd3f0e962d7f0aac201c2e848717a6eb14c992a31b3075ab52373bbdd7bf904f9b90b7516625a1fc5af2508657aeb9bdcc178a82159a0afd10be82c0d851f61e543c7c65a4ebb0a7ebe17e85698b1315c9c066d18d91695c6fda692cd5e1f34d85df698ae4609836ae59d4808f11df0b79c6196a0600767292d5ba473beb3c91671c9c8d606cc3d84a8867963affc8efe21a31c18bae76db6d011baf46561a5d7ededd0afb0b5414d07d7641aeca7f8b90b01336166ed4a0074cdf9abcf5b1b6f262d92a2c3816e6c40fdd12a3f7c0f495ab79ff9890fb20623625058d1160f80b39fb507671a19d42a786357a9d0a9b4ec30a37511fa1c10bfd76363ef2882005817c54d15990c35761d69197e5ac185067d4f4561a9ebfb210d72013a31e56f57d2004fc8ab8998554a3ac0815702b53968914c035e3ff9e68484eca11ebc1508219664537625911004b473ce4d70a2ce8f84f388bc8ccf8af7a5e28fb3ba18973db16d6400e36899077c4cf3b6a25b0b3c7e17762a10780f1153758c2957b2126d11aaa5cf8ff319df4dc093f32d26b446e320f8df52ce63b654c3e2eea062f0aed055fc9adeec6c1ed2c9aebcc456d80edb905e6c409ad7141fc4d00806eea41774acbe0aad09d53a9c43c342ff43ce934a5e582f18460df847d331e4e3a701a237447fba28293165355ba0520a50fd78435b9d11f258d2dadb068c5e419b96135927fd8e0dda1b32d07d2f865f42994c879149bde118ad4597f32dc5ff2fa5476e291d301258dc360df6dfa34821422f30eea111f02c8bc2b199f35e145d05fc4908536c8e4165863d29e7ff3f55d08734c29bd5bb53f04bbff391966ee0e0f07a732225b1f6316f259b570098403464021ddd1a4d538648d247030a749a38619384c9dc34e1d3555a4b5480f730ae946539debec0555d25195b05e75d2ea212a2b32e889c8a3d5a5dce1fbfc52c47dab30b1c0ae342fc3c4c1e1e2e0b436e6d2df90837f66054004e1334c61a452fdebe012900011bf31b21ca33283f6dfc3994d9baa2186542a25ed9394d8f92e48913d8af3484707d2eb9fba62dab7ac1411a7e3a697ba561229fd4b8f09c2f13c52e7b651af585e3fe12b4393c76aed160bc0b9ac33d87a2b264eabe563980520c1084b6c431d6b148183690d1a34cc9448376645c0b7585fb78aab6e3bf80c7b39b116b00f0ea671553cc35bace5a4b1a085ab3aa9a0a413427e4021d8746e6ca0d6da2277ba027cb1335ef2b598d8d0165db7e3c3773815652e4ff3c86ff473bf08156296907344a4037dedc299391956136e3dc15028b879c80623530c23cc56b063acf47b818bbd09118115d1680c60eb4b8a2bc1dac542206e2b4ebe47dd14425345b355e857ccd21867998533028e93cd8c6f62e7fd8b7f10bd3e5afe2af9afb3bfcafea29edd111a1b253ff43a023c226619f8bc4739c115e561908b30f67b1d5a3485d4631926742c0059f5dee7556f2d4597aa1bdd7ea39943dd1bc849fa61e7eec093d92aad28b1c6290dc89f604f32aa21c48c51c04bfe834d48df78efce0f269afb5fcf00aa93e2b700858e040cab70c01844144ae66006d32a8a51279519dbc50f78295b86fef4c2934969daa806eea23919a8c54df369d67787166b5ada837f9ca89c4f23993bcf066a91b466dde5fa8eb3e4d76311b6aeb2615e29ecb6a89308b8d9d25b98c7992e4ccfb934725a25553240c4e101e883755bb8296a7dc6c19ad4d84ea060b11a0356c577eb8feb14b03e50fd27ac54b783dec028050d0f80b5110d5fefe0522f9f323c214d3c470668d3760f160dd82ca99fb74cad281da43a02aae6addbd65bc817697f804cc2b490c49f032d252b80e64fa0c9c422065ad9dd5272d7363a5d503b225175052406bbf91a084d01e1e93f3b05339d6c26a3bc52e9f9c9dfc84ec43d6da2e0002b406a29c6555e15af36b61cf0ed0c6f85ed7cc5fa1c72ef484af13d13b04655e9482555e55c71eb55c0dd1d6220f12d981911073f43bfcce9a7e3970a981ec54a79e2ae0f0674a63d3c8a34b781fe9c661f745523ab8f5017fcc3fd98aebde89051e45e3e7048911907842348de2f14b6bfe822180b62ef48f8caf15bb2175684c1b02ad848bd3fb6261c620a2d1af41c58938f5480a9269616a3a00a074570d8a4944b819de466d23ad1a041aeb0fc1537823bec0c510981066ac3eb27c85806e8b9c53171833b30a8b34172e011ea7bb7f2bdd8521e8067743bfd89e898ab8eca15307813da0146b713bd0bbec3455b819c1ab951fb03af80920c324545fe5a370bf06c945d22be44414786c6906960f22cd72b67980bda95d08ecb95281c35a7dd5a8111aa64acc5bb13ef98fa69db881a99c04caaea3ea85f6211823d60dc4c885ad51e791f9875b2b0c2eb1c48c9ce8ba288eb648361d7ff634d15dfdebf0988770e41847b0f19468f3a2ffc66b351431e9055ef5992c4aca18ae2825d2e7cc21398bb2c208b906768878fbdcfdae5e8407e4379e560e557c093c17daa5e08f157222a05fb57cffef8e7c897089291f7e0d0e274c0cae8f9d2496b4b445fed90572cae0e9eaaf8385387b977f56e4144cff5c275f9924819a2d0b6730dcad88352d730381425a986b4e84af7aa2f12dbf15527bb953fc55d6ba494a631885ec9b94d74055bdbbe480beaa868e213d063bae3ce88b024d7cb0f773da43ef945357a75e812f886a92abf435cd401f188644c459549188ea2d5ae4c80b244744e5f9055ff4c06314b628e5dd9e4d0082436481eab52a1a1d6ac4451a175988e4ca8a69bd2a43013419810d50142eb50da9970feb4d6838d40fdf5cd04544a95aa75fbf89c8cbadab0669a7c35eff9e574961e3416b48c635ee849275f21a2186a860f918c23559e0f3d55672acd574b2ef95c5a1180920787d1fcbb596ef0e1dc3d19b0b03807fbd812630fe9983929a0242f834119e69fbdec0c221d1879d8346835631c76bd60c2d0cbd45a329adbaf869e7d08fb5c9c7b07f3a8d45b1271b194c5382256020fb0f9c3aa5484f020b06cf23fe6d14faa2841bfb79b8aea20d9145d56fe11b317736825181cd1996c3fdb9c69c3bf25469fe9af4f4c3ab84660f789bb6ac96c60b51d9a4c272bb02940e608ec10f7896877114518297ee25393ae0ae2cc8f18b643314d5d0546a5141dba1ecaa9ee3c0286288a9b155369a0b36b797a6b05d3347aff59bc6f69ae0bb571c0b4ab0f6a47b3304e9796362ef5f90dd606df41354d27a85d7c90a909fd3855d2c24087de640f9c145ead76759510c61dc4f1eac3055d8762132a61535e3a5010d625c4161a01ccc55cc854d16cd0e5ce9efa7461642cc3a9188eb3a6a99a09e20da8b8998f8ab3c0216380b6ee856e369a4fee5756ad780a8fc64f03b07659a8659e6de0cc607932a8d033e5c1fd04dfee7328021bacfc273fe1b4d96688948789cd366c6029d7f03e681f640b9814c15187fc8846f2cc3fc241dad4ae826dd3115fc810aba6f8a88146ae91bab0f079d3b56efaf1c3344fe7cde4dd80219cce8b6e1074e30bd6fbc4cb6d67bfcfa6b5c7957ade5c03673834ffe4934ce08000e355ff5d3e04ecbc90b5387f9eb5805cc3bc5e12b8bcb4226e0b86822324b145a48d10f76c231c02d7576864dbdd19ea59b35612dd10b8068604ee4a9257e828099c7fb0dbe8f7ea0df9790cf884f172903c91a3781559950d961609be6f9c6b91c175b692bf35c227a551b57836ad7d1f5efe087f265d1e6e35360b109f24a6cfee2a317cf72bddcbc940d65e0b26121c6569da3db0e121333bb0355dbb872e404150e73d40801d9df081022e88ae667b6915744839c11fbc7daa100227d05a59a2643597602fded7fb2d4d020427c9a9a36b9b18adbd04b2514ccb872e8921aa4b1c52c07fcad5672e2935dd886c6b71edc6e0fd00c5c410019b61b7a3b34f098d6b3e0afb3da02f01b93bc08783db14ec98f9e58d77a006be9c81d5dfaf1da516ef2811bee5da9d597005a7a5c7a9f72d2dedfefcee867006c6f35ad06adc0e0312a59d61ee23569d3b225dafd0867342efb202ccc348bd0ba4772cc6fd21e34baa5db31aedc61fa817b53e4000c022c6af2f38d205ba092a81c0bcade6c76ed19898adf83fcebbe56a2987ab0c962abd1bfeaf8bfc09439ae6365a35d3c97340eba350b6ff9d8436c0626dcf96c1456eedfb11d3222f46f8e44dabd314a297840a608ec577ead447a78e0f0f56e4297947ed475ae29d78d12a01a7511c7e36449ac42edea2ac10453fd163fca2e6f69f9779d9f02c9183947d446fd52d9133955e304b6d112df17516f9ee8d00fb82e419bfc9a7df3de5d79ba3f4d3cf914ea2345b1e32a4192fc086e61fb7c8b2d15d8a774fc3be9648e823fc60b27bf74006627e303742a400769013eda8dedbbbf0462f40814abb5ac1992ceaa303fbb29838829c99e6796335677963d3d53bc8973d4bd65972df74992ecd400b992015af3608f5d1e583de7de86ce9d82d2d6ed865b89e6063cd51b8dff9e65a50654ee6346f6382ba8d449f090c093d02f97e9d0a15315d7edc68c2dc329567e7fb81ed27bdf8fbdf2371ce01af3b66a031588db0038de6c8c0b3724f82c3646ecffa796190fe6f804b703157061cd044cdb3fe63cfe10efe27376a099bd63c2cff6e974c2d0cfe978f78e9008c2daae22636f6d4289bfc870f6596bd670cdd7e531fcc338513c310e36fb4ccdb10e5bfbe1b78facf079773775b5474ab0a1ced517dab407adfa47cce51ede92e01774110110fa139056b79065d70117fc81c28702f8a5148ef83d8e8b4679d93cf1a224d37df056ba8d30e4f93572b5aa3396194667518a49e37d3ebce093b92d430f884b0162cb088c94a3742480e61c03c12ed66adbcbc39212363645e9e7af0da4f4295e7dc9a665de23f58d970c2ab104729529e05be6c649f4b38379ff7f9ebe384e1464411ba0e1e417ece077352b0a98eca3516d550550b1a38ce9c844db2e00a12d61b733b4defa84c1b1a1c9ef4627a69d1789507d1fdcb21f6efd04446f6f564d441c59db19a690b44355cf63b37ffe0f36b77dcee95be7e7f655b15e6700f7377145b2cf2995a19a09bb3f8c63b90891e8937f7d0c42731e956187d9c30404c5483182083758b93855a27814e3c239d6bf9c4a0570cc5b0aaf7f6f83925443ade8699838cef65f47487ce8f8096674f5624acb14bddc92d257d64962a5f4184edd1757d9a5d388f76ea2424f493f62b35cabda54101e258ec4468eaf9e02a602e7e5363e0cd8f828603c332af8df2cbd3bb203dd08ee23aca29c5e606d5515e70bb11929143274869ebb136ba0e2d26dc8668d32072e78ba1ffaf441bd00f24fe70a3ecc6f00d073222b3aa893e4d762d283ef179cd442c0e5d218eb788b869c6f32001184c51aa38aa4248677c54404201c607efd542d88627dfd79387b9b57d2dfcb3f766beaf20fea7a9882698af8885a0f5979feb7ddc7b172d36d0df77a7a23d5011c589465d8e624a5918b7601c961c9c8426e2f73163dbf4b9e1f967eb96e9c428dee93ec961c547222cd1022c241c8be2cde2e65a597784a0847f2a1b9804cc2168c687ae0d26b5e55800bf5d95ecc0a00e03e5cd4b415be98885705eec1663f22e4ae3154e2c38d3f94a2f021efe0d9c30dbd9434870f566df1d5afe4159a8c7efadad4eb3068c7182c5197609c8edf7a25105ae0f1524d4dd846ce6674ff051e2ce336c5f15d8473db1de64b99298dc93ede24352acf80cf59438644523879b311c2bd0d34b4245b38b1d069b9d8689d522e4f86244c60ca570214d7f72dd0aa7017fb7a3ae6e857d4a2899fba1f4017d584bcb6eabc74ac49ec2287e5d757bdb3e19a5a8f9d368f82a1e57619741f21aaaf48d425285a074c449d456f5ccdb720d2c9baec9a9ba1a36d5ded75c0661835b3b9521e7b9bb942cf54a7d23806120f40cb1d621eb2183e6a33af99deeb35bfddd51f3da579f5d8ab208a21e743314bab8d9262a4f70b83dc2ddc57d64321f00ca845c1e59b46046cb640da37762e2da4cb0241ad43103ba6f6e845a208e59361db4ba730d9973b86f8662a0ea877acfc750df46cedba07d11a51dca803c7ad843bd034a847a7985d967d40c0c040604030600809eb957a7b60d7e9cdd25fc6a6d15d29975ab95f20804c828c9debbadedbda59452cae1078d082d083e982c79736e8cb46209ca0c4840e4a4e121e6dc58898794374a2e6c45f1293937668252264c8fa5394e61e7c64d29a0ca7ce860d222c39b73e3280f5a80f5b4a48615ab37e7c63e13d0126de6bcbd7050b8652f7edf25a77bf5d6effded1b2626e6ca54942318580072ee8bd4ab612a870ba2c070eeab04015a22ce94396fe1bc754a766eeb653960b7d53ac0570e0e404b54df35cedb4a66d4658f9cb8b8f959e9724111323ece6d91be98882ce941266cccd5b9add257385f7e6501e5a0a425aadbb0281a308c1ca9418773ce8d272e64e0718483c9b92b520868f8d2e2c2ab86185ae7ae4db407375736864c4125113977657a525375e30a07961862ce5d7d2b5e8cd9088b3187878b38e7ae516f7f74d72b176f8e2c11b5da02f6d653a02768d9f5400dc2a7750e5822ca84a846bda5f1f6ea0530a6313016363a8004363546ac6a851dcead9f9249616903c313981f34acd7180cb01b4d64a872eedd6fa07743962a2caad0509d443968c170ca02258b9c538ca33716df68308acd57cc6485aa571f79488a01007f3d63a6a6b1dff99cdd83c45c95a6eaafdf2c363cc6389fb962d5cb22dad4a1377e33873667681d2cadc345d7a27411bdeb96af0e6ad1555f1dcca2674a7a579fd140e11661245bf639a771fa9c6f11f565bf80082360244a44c11e2361a51914ecabeb243d13a2c52bbdf18b561f7a8f75b5b21032d2a06dad5432245a66cd6429891ab71b327a51a7a56eb9da0d89782c6c4b7e537500d3c23628fc91fd867022fd792d21fd66621931aa2a51b2d75e6b99465a0f1687d6ee23096287068146d3283fbc9e7a0df2d7afb82d9365b24474e816b9e3705adb5a297edc2363e401d31e1045ad7138cbd344574badcedaec41549a060d66132ad5c0ba9d59097b9847f416b1eb0b60cf9e7529607d733e17d0a58063903aaf6ec5596bac8043e9bc391c83d4494b0fae91d286def87daa53321d5ef84e2a674c0ad2495dfc8173022d49117de8ea348a8f2757639693baae1c581d384ba06c083b5f18402b8c2f0cab7f359e6569bf6a2a78efbd2d7830ce18678cefbdb76a518abe96f6f4e60ce60ce68c31c6b5d6fa82d5daa5a6427ca03d757befbdd65a6b9f44d2da5a6bad6e7e17042ff8f3e318fcb8836006fd52e991520d6caff51674ea22d01355050813004371461bc91285dd95d99f12b951072830a812803b0643463ad6c01abd3a1217863ee26a2db4d7c8eef0bd1883b584ad6d2330e7306731e759ceb49cc79cc99ccbcc43a537ad0ab1740a1520d013a0e8d83bb0bb323b0a9b004af463c2a8037ae282bafba063408b6c54a8baa8dbb5fa25dd55b73e8212519a735824a90633a69146298d62f229cd292d7a9a338016e1e815e909fc3437a21c844ef3139508749a2ba01265a7f9494f60a7515ad2663aea24ad1c845b7c9aef72976f6f49ab22ad956273e6bb2ce92e7fe3a8ad25eacde96a0922945a4a69ad23c63a22f6a5abeb96d36f92e27a8d8cd6d6686cf5f0580bb24414ebae5f2b2d6f57e05ae38cd586561a7af31592813a66248aa7801dcc3a15aa0f353f7a270b54d0f5ae97191cbd133bd6e52d5728675da16a6d261b69d0cebfaf572be078fa644e19fd3dbdea15f9ab444f5c1fd5a07a456145c4a9eebb5b34002c6ebc38f5ce4a86c20918a234f97a673dab6975258a52efac59bdde596d1c254a3dcb747b481fb27480f5ceea76c966659585d9df15aa7e5ab2eab5c9a94679e01645dd220ea63cf9ceea218c60a36e113dafd215aa286e113d2bd562ad62cd3fcc355a9cc14b4bd051d8300c75e834ca871f5225a1f261013efcf16118566b44da7e82843deea99516d70d63b846f5b1e28a31c65b9ad67b63b859b474f550062bbabace8b2eba7a2d55d1d5cb47165dfdc353abae36b4a4b59a97ae5a4d9e4260a4b40a04bbbb2976e8ed3e84e206ed48d84c7190199da2eaebdd36eb4435cb074f13271a77afaef238d13c54ba7badb5a013bdc9a796c7094f95c6d9eed5384f69ca43a5696829106bf56cac51d51eb9f65e1cece5a9d2389e297d75949c8921485e8c71ce190cc350146733da9007f67794479e805ddb3a2011445e1a8a241d411ca9b183f6e2dcbdba4d8e23a9adaef6b419475aedc519a4c2436575b4baf855875a8dd6ee56d87ac248ad091edc176b89ea1ed86ad3687da4b5fa687324a87f82eaa592a7a504c65aabcdee56d86a7b637d8ac71d913641a0b4e9f1144a1b1c1f3e85d266c6974fa1b4e95960ac36b49ef83cb5ea72f4d5a9c9029398c45f02f96046ba9dc788b61508a57fabf5bf4ab9aaf4d7ef454135b84eb18e036cc0f2bfd68bce741c604315f55147218abefa00dbfbac534173285230d1b31f7a531f4f91d0afa750618928584150e73bf4ecb499a780268aa0a89b006d4745d1435187cbd507799e34d6eda1a740c6d90a1b804a84ca32bb318da82badc411660c58848ed7ad9603cf2c87ae4ebbf7de1914aee2957bef0dc38c33167a8be012bdc5d28cde22b5beafb5b32f7fc40fa8f5bf964ff416f37d5c3fd838e8a96e45017e14733fd2c89ad3c93f92e409b9ccf8deb2b495ce6acdcd74e8d96c56629ad6d7abea7c3ed095403e1ec9ba71d5e1325873e28f2229ce667b452547da8cd26b2bfe1a3ea975d6c381cc58ae750a0473c5f6d61b829e05638c6bfd5a97dc2041904b915aab954ca7c6213a0b31287a7d4c29f817cf280d310e970599524aedcce630152949857288cf362a949d82ba4a299d51edbd72ec95ba380c6734190cef1545ad7138f7ddae7412eac79608fc20e7c71fe65cebfd30e7fa41fe9a6b0dae4ff040729ab2e4830d95767a8b488c496324860e1a5efcd05ef4db26042c0037c478d30b50f24c9cfe1dc73b8edb7171474897dff1a192b7e3543512d4c46317733c76ed3b21381e03b1f2d84b943c6c84cb42e2638918951730f01904dc90e389cb9117bd169c362053dee604287936d7a0e46910437c0fc249943c10e2cd71b79b07dd7ce8e6e24dff8dc8df6e98f3e6066ffa004a9e9941c9c32e54f26e4638338ff35dc9c389b6e7117b1e1e0fe2c1cea3d4ebf5609c3c57aae06c35ad9141caebe4e152e6c21815af321727dd7a1efc8365c46f121d08fda6554a7e28997abc0486c74bcc3c66c2e43166d2e5710e373c7601943c6c4dd374bae99605f010d2e34cd98b2132d0a1379d9a34eb4df04d336fbac7f0a6a368c19b2ede220e7c84317d690961b2c3692a71e14d0f40c9337f0028793c5edff314e77b3ca8e4f538a1f95bfb5be6af7b1089a14b64e9af792b947b7d849d7b89c4f9bb73ab946bf3cbe3bbee681afb7bc9fcae575eb16e4e8394e5d861aa0990a3f30ed981cc963132c67a38b7feebf41600e98c0b409ec67c386eed69a085262ff812c3911a48ce14d45cbd008d989316acb94f2ffc2dcbdf1c839277c361f8c985c718bbaecaf310b9e1793c57f2788e30bd70438585a31db29c5bbfcd16f636176fd107ccec1842e497c505acd346c4c7dbdc4b9e2dc4ef38c9f91d1f51f27644d3fc79d3349d5a78d3c9ebcd216bde741125cfd4af1da7879479ed40fe53f2eecff71fb0bcf90fee53f23e5819f235f16bb4ccd76a35edb5da15395fdba9e131350fa1e622d46ecd690d4b99afe9d4b0929a78d6bc2e5922fab59a53f11689f84a1a9b8a210684e9ac353dd101030d598ad8a8495d7991e1abe1668573531f094dbeaea0b4b09981aae6b4561bfa5d0363917aec21705357e8af8b567e7fafccf05690fc7510a6699a6e3aaee49918bcb692f4da7b4a9ebe95bc9a8e539f0ed7975fbae0cbb3fcd2495822d34b1f32e2e1cb0e4a0fc1125d2f5d845a59fa089cbe2ccbd22b8eb2eef8b2327d09834fc9972037b6bece52fb4aa79b967d597b5f5a65b978addd56f23416f3d8c51b78c020bef6fb9a7f2879b515467a68a9a14bc9961224270ef3613b54e1d10298b11acefba4f4d7754ade75b38a913779656d7a2824d985ec224b9224b7c80cc8af271d932e3a09f2a46b276d9eb4baf2e413214f924fa49ebcb2f1e4159927dd2c79a4f9e3387ad038fa902daa4ce3383ab5f2e39420f337896da283124fc3fca5325584aaf7d7714ea5f4d777607f7d884acd5fab2651deaa8a86bf5e96bc8b6ffc367a8cbd3c76fff2d8459fd663274b1e2e79a311019ee6b4c6d39c26963f739c25c2603f73dfcd7cc8cedcc8888b9f752035f3106ed12cec673058e02ad371c58613937376844b09c80c5c74cc4873cee8d5959f417d3dc65082feba868251240caee4cdc8c09297993ea7a2863a25ddac068d5be8e0163a1bfcd6c1483a3a3a3a3a606f5d074b47ebadebf4aedeead039bf758e7eebecf8ad73550234565f3d222e543939b78e16ab2e6facdce0f0c5e4dc3a586ec8414a892bcb776e1db135695e403635c705d5b9759a44e0a5cd0c37aa98d9f23ab74e946f8bd4961e5bc43439b74e181d66cedbad6f9826d365afbdde82bd75ba7598d85bd758b6e8b2b96cb4dea2a26b8edffac86f9de4b76ea1654a8aca0e2f39589d5b3b65bd70c31c222c60c9e1dcbac71cae2528499cc86c9d5b33bd9d7a8344eb07123152e7d64d1fc81155b68255d29329e7d66f6eb461d1d5c3ef4bcbb9b5155ac2ca9cb7bba655d3faeabbb6a5a5a6e677cdc9ef9a0cbf6b576fbd9655d3aa79d5c0a4be3cb921568686d79473d76a50e99023c46a07a832e7ae294dd130838e346e9e1c39778da906333e283441ca689cbbb622062670e024ddf0262becdcb514516062ac318325e6ebdcb51a68891ae6bcdde66d32cddb649a5e26d85b37b16cd1f559a1ea3e53ebad9b5dc8dfe69159ab7e9b2efc36af6a1c9951c3a969ebc9b94da41b5173c814d18185eadca6d22c87df171a3a78f5a8ce6d32a550c6e205178d252e849cdb6ca261079b2a45b2b4093bb719f5d5260d12314f4dd09cdbbc35ca5ba3f4df259c8bc30a55dfa5188e92cd5b2fb7c894457e974d7e974e6559fecab0930b961e5860006381e4dc25125603a4abc90c32358e9cbb540a2bb2552606468ccbccb94b267a068b0725a5155c00e7c7b9cba636b4449b396fc932b28c2c23cbde3ab9e62d29e737b944d2f09b2449f21781ae1e584e5a76c8e2e3dc24d2882d3856472f4401513a37a924001d5f36f4d042ea880be7269940a0c482960cb030605e9c9b7463a6cb8f16689a90f0383719f5360a0b489cbc8ce5803a37e99b424b4c99f376cc1ac3de8e366b1cbd46b0b73e62d9220b66c72d392399df63eff748f57bbc2ab281032acc922f3b769c7bcc81e486992a6f5ac0e8e1dca3d20a1a3dbcc2cc80d4e20992738f3ebe6ce9fd58aaf1c5eadc230f568e8ca13164ca8ad8b9472f698c2c65619ae1abc9b9479f119a111aee372d8a16458ba2d15ed068341a8d46fbd916cc6c0b663dbf679669669966b31efe3d3b5a9acd66b39f15adb8c5ea48a2452a7beb624f3cdae0b7f8f45b9cfa2d8ae2ef024e52c8a2b49c2993e3dc22d28a223dfc70c1050b48326c9c5b549a3ab3c6aa052b2a58e716995440464c0c5ea670497939b7d8f4564a8f2138baaab47ae716a35080c16424490e921d5de7167d6768893373de86642159b8c317747e872d7e87337e87307e876118fe4eac59d28206264e64443977889480177c3576a8e2c2c3c9b943a59e245da4fcd040018972ee900a10b02730d6f000c605e70e9b3e3c9933c3c816234d66387718f54e9a6248a3e45ba3a5e4dca12f0b9805dce016700b0896d17e8347200882e04f481692c7dfd9293b65a79c73aeda192a1fa1f99d9df2150c3078cc79c18289d396f30d0f1632d0280325ecdcb9e96d0b1ce76d6df1d53a86539170d85b8cb117067beb18cb16d51df8373e42f21b2f0df98d9d88fcc65711b07286ec45342c8164ce55304dbff08909c74fe4aa61cb8c0ad212ad86ac712b29ea242998185bce9c2b800c45ca4c32e7ea4f47afecc4391f2ce758a3d2e64a9339477d4872ae4e9cf3d1e11c75a684957dc06a616927eb852c5b9b21513c55ba946e447a18e3eb01d13bc710b6d210317e0029e33b891cf1c80ae1b3e6f459d33b471f5ba94f183119563bbe7ce708e2a9ca15329f35206c3ebd73fcb195fed429323e29a6730c51cb925c40fad12184f87c40c1beea70cea7fa0f8cf30746efcc399feabd7304b29502f1b8393a73ee002ce88083ef1c7d9a900971d25f73ae3a5dd1423a71ce67cd39fe58f1c10444e61c95e21341e6dccdf104e91c61a5948c71f22a038c1cb221289ca367cea95079c09095733e2bce0c7a9a9e2b583ae9798e189039a70275c242990a3f30ceaca3f6009bc4409773d7e9743a5dc637a8f6224cd889733e2f38359943d3d52ec1e8af5b9a739873982b26b3d5fad5d51b667763b544f5eb955a9b57bccdd4ee154fa9e79c73de275813263618dac08409a8a63037739cdb99046cc51cf62c8ae1d344517415664933cfbbc6a825a88739475dcced9aab316a89ec21a59e735893727bc55312849f0b73fdab5a8219a417ab19672c6c0032112ac776a31add68e5e5d5086bb1678c45608cbdfacd3a7cefade6e301b9c625dacc88ae5ea3e8ea33ab71d6a28bd79f60dfa4659eccd32f3f66acdb24187144d7dcb846531f7100e268ea2b1e63e06b2ef75134f59cb33292a5198219e36b6ba534934efd38236b6ef682a6ee53a906b4d67befc5f482a2144da3a56975db83c7515403eab9f71ab5ba1cd134324f7a5c330369039b71c42ea577c65887c328955a31959e00d97841bdf54a56abd5e4e989eab8a4565e4b5fe9899c010b5dabdf0ad0354f5bce889141840acc49a950a5276c062c343d513360a1ab8fb38b67745667e26c667338036be64ee1ad67b1d91eebf1c31320584fed0e8aa6581a3fd19b6645d19b5649d15be4b9d25cbacefc161d4b63d1e5ef7acd0a3d6d5a1a77492133562cd8aa4b6a0c638c291572ace3001bb4ec8e6e6c8932896be9141b300a8023b03b9ba3140441d05e2ada5dad2482aeefa0a722d5614c79c474f5a07ba36602094e101f3bd689507a63fbb888e9b44eab532f79f649b188aed6fe98dbb50c3b1848da2a07b6f737084fc16db9da5915770853eb22d8229c15ba602a07d5823d1eb2bb2b5e1fe2401058091cd8116489e8d3cfba9a985bf2b03dc16f1590deea4660779583fa55c6d12d1176b13aceeeaad7c6587b6216b896e162685abfb0781b041684443cad8fc8d759123d8e95c45e7d575de3ca2fdaba4e15ddb2a3ae73a54d2aba567711d098691a5343101d74c8b9ddbd7e8b2897246532b4d0f0b1e4b462062a365ba0cefc48c3e2acae714af4367a8a6f4e04bba34edf3eb5ea8a7ad188b6baa1ece222093275675c2a4930121dda28a3755e8851b9d83229183f8d5da0f2e540660b4ed2a10d4ba6755eb0417f803ad2a215180da455111f49d668d150487b6ca11169fbe972c5a6197d5a1445abb575a5438b54ec101d6ae969f2a9d55617dcc21699acad35326cc9a9557468e38bd67901062d5a8dd12515183a8ac64f1a7c6ab5650d8ec40e67d33f412abac800c5c8ddc87d22ce88cce8eae7f5f7a2673dc63da6642f3ed3e3ffd07bd1e9abd71694038c444b54a7315e3c5d81831aa82b393e186a1c393f80a21a5316c54248d6b9ab526d9a4106c6922353ae66a038bc204b142c1e33d2f468972f3e2c73be085972ee9a65e2054d569c10e9214bd8b9eb1636d452d126bae645ea94fa53c751a3a73e445550ea2350fc3404464f02e8a1534f01851158a2ebe3e98fa78e82fa8ebaa6bd5ecf066593d5ebf566d01c3e671749da8ddf419f7def486ca3cf8e02e933cef40aeb33d5b2d24a92c53ef8a66c8a707dae4735a9c777c5b1f4d92b1393cfb7dc1404e7bb4255df10aecff90aeb33889c7358150b51d68bf3d91ef9f8b648493fbe2d8e2526ac2f9edfb64710a8cfd9ad6fc767b755d9627dd6b2bf169f2d18906f1b26f6d9dede8bcff7e86dbe2fd24dfa9cefd2e7245a06f81d8740c9db4192e56d369bcd7739b7d9925cbd8db4a9b17908964884db5c049bcda9cde636174e6ebcfca45cb8387fd810464e922d16645f36dfa1667edb7ee7e777488cf96de277c67ec7f18e8b51507e0707a8df916ac1efecf890d497df71104ade8e08118e1321c22992322fc21f50f244e49c6edbeff7cfe71ce77247607cee489bcf19b1fa9c3ba0e4e53e2879b61151aafc085751f24688b7074af3403b0e04647320a0154cbeecb04549ce0e5f309c401f00bb42038e0c38c2da0045c1e18112f0dbf6b69fb74101f2369b0dca95b745a1f136f7a0e4d97c67676767c71b50f27678250f684a9437dd344d0f22618944b8e943545cbc7933d198a68b608e304dd30472d374d3344dd3eb55c53275a6699aa6699a2615afd7b9ce53943c9d98cbe572396740c9cb39951def7e963c1781808080fc35f81153b87e84a3287923767676767676767676767c01256f4744d98b7005943c11a28dcddb3c0125cfd641c933b16c3c7e4cf6187b50113eb1763c46f3218840c1a8d863ac228f91942cd10e8e1db509eb710d72802b4b04e4d82b9656f57afc26873566b4c6a492cead1f339123c683982419a69cbd206ce2b0b043111f6bb0921b1949985cb93202e7dcd4d7ab518f81ac1e080808c8392879400e72f03b2eee6009f91d3f51f2766c369bcd66b3d96c364740c9b3f9ae91690edd1a058bc69b2e9a58496fba51c9338b4a1ef6ff91d2e57f9ca8e4fdf8f8f8f8f8f8f878d6fb300dbde9072879a618124979e1b19b2879d80d50f27c8c42dca0f5217c83921742c8d56b9ed7dadd12d95c7b90f6217dc3d46b3da6775c6b536b1d385b11cc19772973058915140c6c95dadadadada0a4311ecea7215294008c15c3e207b08823ab62e8fac21f2fad5d9b42dc4199bd2d3d6d3565757176e6bcb09d75a6bad15c536ca14a43aab08051450e84ccb7c65434c5d74f51830fe82bbbaba30be557430e842c418cc983e6db9e8a27fc11863105f01e102d7c88ddce84b66e1669a31a614535cf1bdf68b1c8cbbbaba5280d081d1cd185f298bc12b8e2f488a5b6ceec520f81464d36e9492b4c6b991095a04ba1da183a7238438d385bbf495a1ab577ba33c6d3d6d3de5e8d1d193a3c7851e1c3d377a6cf4d4e851eaa1d1d342cf8c9ea41e193d317a60f420f5bc00d1d5e3a2a785aede73d4c3420f8b9e157a7a73e4dce2e8ea373802c018c9ed0da6b71e6e3cdcca6e6e6e3bdcdadcd8dcd60cdd6b800d4234b504a5e5ea49d6b1d2d35ad5171908ed3297eb63aabd4a8b7402902780a359d9eb0eff186a0cf4c411ae5714b5b634cba906209c381352140c94b4b4b4b4b4b8b8b8c0281004adb22af7deab775e469cd1c45918e2d9571cb4b8b8b870546b4a581818d6b3729d5c5efcb8b8b87ae8fcb87e5ef7de5bb57e6af08f8bd65a2bfd5de1e2e28a32c24a6aaad695d6947026d24632ea5e926be46a81c675c7686517d872dcd2dcc86e686e63b73337b19b995b991b995bd86dcc4dcc2dcc0deca6c30dccedcbed77fbba79b975b979ddba6e5c6e5cb72db7ad9b961b46ddb2607ad3ba61b95db959b965ddaadca8dca638905a4204c37b2f78c799e6a277cec5eff511e071659181d0ae87efd55adf8ab5d65a5f8d20c9581d04154af1438b50f8892a2e0974675d871279c0ee2c0ab7a8ea7635a92659a25d65fc09faf8aab8453b0f9080c369bdbbdae17062097623c04355690708293d0c7217dc91184bde0f8ad33b7731e721ac2285915de35fce74be713a6a85dca9d4206226ce421104719e3d582b14d04fa69a8b0b38dc0f082dbd3ba877a8003ba19d7b9bcbe9e4723b5a34c28f6ef9514a290a151310294e73d118e31144516b1ccebd0ef9bc96b2328b9106d5a74236052d0a419ce87af7a1ae1e1d2d1d2dd5a3113c70916c3dca3509cba0a3b77ca268ad16c98b711eb4b33bbf41eea28b7e64f45a771e848ba1b16882585e24529dd18f1115a3664898000817b09eb191911bb99191d6888ba1a98f346702febdbbf45a4be9dd699dd9ee87ee7e9c9e20ebdddd0e3ab07dd1203b85ba58a4c20a59af3174c90b29171529b01b5d19d4c6d038130505c5d1db66b30ee21aea682545f136b1e18c0b77f8de203d04e292f4bda0484f84e35596118a8a8207f1ec73b82b64e9ee0a8962034abc076668a3a12b64bdf6c0d8fa369b2dc74dca2dca0dcaedeaf6e466757372abba35b951dda66ebe5b0e3726b7253725b724372910371c6e51bafa0dc9ed88ae7e337283ba15b93ddd88dc9cc617892e298638dc8688b71b6e426e416e406e36dc5e706bbafdd0817645abd2550c2905ef059331d500db6c3bb67b2f48d2a0589c8f8072efbd57a4b3149eda9d978b73ce60e8240cc3300cc3522b34cd843af41083a178af19d16b566963ce5924b5ad04db386612c4b6191749e632bbcea0e3acc360ee82e168062c455c9ab3297b71c6172b450aab31e7662ffe68c1cf8fdf3ece99c83223c5aa44531c6da5348b3338d3a5a8324a215605ce665dc4510c694122a96d25d86ea609bceb216d766734b12a3257ec238d56f2421f4912631cba4edff2ea5288555d7bc72c2425618c1883189335b2a6c9fb538482f6e482d000da631d8a269668fc50348e3a1428c6d18baebe71968846cb898f3fe8943fda6c3c64904d24f56da77c000936db079dd2041e7691529b88693bf54bd22c1b70bb9526f0681ef6d45ab338ab8123bd3a454e85dd893a146774755c2936b3ce2c71250d50a044614da15547da5d9ea2edce5e6bad1dca4b4830120cf923c190602e94a2a28e40d1235134ea080cac82a9bf1042a860473e9fcf377a19bd8e6636cc9a442691c92ab15236aa3a55272556090e5068bea10a55a3f0180ec361980c93b948aa312a12ad4947231986b35918cec4d0462d7d605ba825b25fb7b99bf45687c25af77bb3cd65246befbd4e8a157441c565e907f094aa8ad5ef12c812e86fd62432cd82d0df2cc8ac49649ad9300b320bc234527aa224291d69945a6b31b6f75a6bad0dc14c29b6d6adb594524a29a59496e468ceb4dc7b6fbdf7de5b7135412510e42181e78661ad59287eaaf7da4ab0d97b71cef7b6503305c1e0a724f0d868570c45b7ba200f22cb9998e9893c2695f45b7bfd5800a2ef53ab5fef9f747e6af5f5e6f6f8e221850a10c8a12fb0d9d719dc17d6978f8a459237449ce2bc215323ba518365c7952b676a9853b37e1b0d7d2db12cbe9818691271062f18863a31cec4e03576c30c0f4a7e3a808d39b17222468e08667c597c419136527c6af51504ccca8befa9d5d78e97f2d4ca4bd6db70f484e836fc6ddb607ebc83559bb0bfba13ec9b00f71b855eaff727e06a6f8e94670209ea9c1773340d2ef95bfcdf62c801d689ef17cb2ad9246a5bb04a33ec12c80a558f444555611b559dac94cffa9a90e36ff4a2a397f137feacb08bd9a9dd89a198db275c303030bf10c05430b09ce46a53af3fe13e06411154e16de8d7ef781d749bab48d8ba758cc7d15e0a5a9d53ada0718ebcada0b7edd2abf380ee480c99a07fb791d197106c0876576bd2584df2d9481d06b723316482b4913a841a238914d30ba0147f7083c3f97218c7f1378ef497e8684914be3aadf9e2a8b5ba0af5e2b05e7195c0b5514b50bf4a5fedcfeeeab5514b54b7f6e2b0bb9aad759cab98ec0787c1e8fde313b8c0637c71e41ce94563d2bed0dbabb08c309d3847579c39b7e21c6d8da5134f81210c7b51ca4e58029cdfa8048d777541ca0cd5cc100004010316400020140a078442915014456922ed1d148010629040744e34948763b124c55110044110a38c310000449031c4186688684701ef02e9e9f10d5928c8ff26b9734e1f04f79c4fa21bef44782b64cff33b2f6b34431263acd1a9cf0aeb41cd1374b78a6dacd518332b5de98173d1dcccff18a7a54196f43e579d8bb618906c0021fea9ba38a1c086fd556f2bf2d9050d1d075559a5579e76f5447f0bd6e87211202510d85d8595881c7c80a9cf069a92c668ccf222a71e9bbcbf403a344f859ac653afd79c2a37306d68952ae84a9cea103090d4819e2475e42caee6426a3240bdd616122147a06f8f162b742e4540dae9cf0a951ae0206f63548e2cd3940fb1a7cc335351f3b3a9b0dcf0d93763ee6a4eea2a574f9138897f8d438c8f7ff22edc651a75cb9bb6d293cf3c220ea9e56eb05738449466c793c48c33b89eda1105ed81bb1e33a5c36c4a2719471d5114ce19626ef769a5bd894d54d819fe8b05d3f510f43dd0149f5da6038dda77a442643ab0b63e51599e9161ce58441867c52513c2b3f7bb16344810dbb61d34195290ff0a7c05dc48d608632fafa76d7055cdc17dd1753aff69aa9979535a61dea977a427894a5710a2622eaeebf1269e240a5a47f2ea109131451ccf1ffe5367a0bbc0a74e8462888149fd9606fa54e0cd81a7e2bead170dafa0bbf65fdd151b543692095e9b3bada3fea9dd4180af400f92fec9e014b979b1ce02c019a78a4d81a6ebf117450246d3e46d4d91462222db459b2821d3ff2d38a851bd4ed6252d21902575414b51a54a7c7079afd43ac95e726375c11e5a26074cd93b76baa5463bd34c99f0a5be06f13d7f9641b299b4b0540fd3d5f306a64824185b587e75f765780bb9f10b5af5a41d2de15ad4bb45bd39cd2b07015f22f936702abbcd3e99799c8980b432e7715c981b376d5954d9de16b2f7089c7b4ce816db5b0867681f271437ce76348080387345dcb81406080b278d16e17b82935b40f0c32a64866e70b824dd6ebe28722686245f67e4804f6826c8e047236e628985b7827fd4c0076121ae477f46a93d6e2fcd286b270091dd88e0f6b06b9e503f01b7514cea2b52a3356069561365b8df78ded3ccdebb3c3832556c3265dd675174c865c54126cac226118c4462cc1c89bb1494bf36ea0fc7c11969937330578fe4075fb4234985809b38c547cc283e2af604e57f9b92c045976e04647eafcc66400617cacc00ced91596e35e78b57da2bab2811a6ca34993c11cd7195a7e471da8dc4f355c0235dba8fcbee36ac235c09ecad96d75bc3ab31466a426550e0d7cd2e114d44591a58bf87e66b6a5d12c2adce5ef6b50807cb8790678d5edeee501b427dac4e5d01fd93045cd6c2ebcd0bd4d7a5ce1159d08bb5025a6619ebb839a2c1598255a546a12d5ddf8a55412d12fb7dfb5ef5ebe6f2fcc62d143aba186ee84747d02ca6f002e10839796a9972214da513cc96d8a8ef20743ef19104db649d8aa46cfd5bb732a75763c156900c24655d942392247878222feddbe5cd4492a468e7e58600646d238600902c6ae3f6194ca4ee348b025826e317611eabb0374f7163aa038095d1c62e0900c7c1eacb408962e14eb14d3d4d986af0e9f5ae7eda2046dd85782ecb2004d1c01212af8486d0bc4615f192d0d190f4ce0dc0d5a45b2af7ab322aa4bd126c4d58f2e205054395d51681a766e069a12a9004903215614f227f740c11152ac9f9a54950ae162a990b467095abe984f0c45a1d3a904ced3ea25c85e1d076d587630a090096e0785e4ada6a63a6d30307b3986ea8237b4409cc7a869005bc3f18876e8b6099065d2a32bff2c0993a4938c188901c3655b4ab97a3e6cbbd596533a859cb90a283f4c85959b856f6fa1683721e3cd4c0b2727b30fc4611d952815ddb7272b351990a9e1da47219bc3a71043be0b787142581e7837420bac917928fc082c0a968c0588a048ef610d1b8437a9c139e5fd04ecf810a2c990baed356e8ac0b532300cf46c83eafd85a31a1d9018e8b286eb4de7a286f41664997faadae4e246620b6293bc0b29820723861972b88a4d71081d209bd183749a6ca0a0fb035ce99beec0b0c56a56c974a49dc25e58ef28908996b72f783a72da51b76b13a454666d829b5a7ddf1447dfa26f9fd9eec236e9518f8a8e646daa25a8d6a34de7458418a45b2373a36ada75d4cc028eaa2786ddea03776d7d0234d5f48ba5e978ac7f68076967733ccec9ac03bae1917267a9992d530734e3fb0172b242493e3d0a97ede939be4ccd985a74e7e96a2e78121dd4f4132271b9f27c88bb758312218532a6a45a5af865d8d0cbabac64c0f200eb3204e2cabd3e53b0b52b7d331c5860ed66fa8640d7ee748c41dd75107e29dd162ed220f8934be8d15245c42e882fb05d85305938de2077cb0e54670f647cd10bf606c98d0b35d0de93ec28fd5202823706cd3bc51fc9d00b6d13d7d94f6991ab77cd6d085d724059bca53c9c96288a65a6662edb3053e85963b3f8644a0564801814b8920a2470be15bf651c04c967c9cbedc0c03385c1550526bbd37691bb57aeef35096c1a4efbb7b29635d56bd9f86a746eb70f0640ebf17902f9508d8c40be744b7939a80bdf38c0507189344cedd299f4299d6e47946c5943bcd46c6c8e96a27d673a92feb743fc26cccc89ec415cc0857cb3aed15cf3d2868716f13a6268176ac540fa5b61c659bda78b7e4b192b57e8ce1a6e8ea4cc66c1790cc2e26ec21577411ef4b6452d4b3d33e31a3100c3be2f04ec19f034d005f9237c0cc80f3029925ab0b8684d5555f5be48876258bd6825235c18d2fce326c6c1784c0cc05a6b674af317e86f3dba8030860608f33607a08316e67a2d689622230719577369d94cd12d111b5f3c0c69569c1722dc3a0ecbaedbac7d1b4ae0dc958c62f28aad554920536ae125189bfb908538dfc1979abc495c2bb5485b7457c34b740023c22dda52b160f8534a7ad78e6a013df659838866803492a3ddb419876fbd6ca6c22b018bb11099b2309a8ceb187f0ade8497cef6ca94f467012d885ffdeafdc4e545ce2447dc8558743fdceb7693032ac7f4b3d6d8ad96e6de6ac91e7dbd61ca6a9e27bcfa55d26e6f7b7f0d113406605f37a29269b3433cd344c611f75d5e3ff5e14c44416cd106d7cdcfbdb3eaf1dc0c1c38c08e80196b817e41b9907f6bc1ff55a8f66380e86b2f9314da79839182fe0befa772d52b9710e04a32f846538fe9a76e836ceae18d224b41ab02262ee97e1e87c49f12bdd6e7228811b6046cd2e2796a8f748d8f91b9f13143512ad78cf3d5b969ce1e98c440ffb5fc26c2a627d08f00b32b0b34866d164d97e8614d805e7579dbe060a76496ac49d30a1b68179e05868a8a7022c4e63740d22b9564d5f0ac3f845a78fe947a20374e71b683433e960ef70d14a14dea7088a6f86f5430cefc7b307881e1576d40c765272b293f914a872492f56d239b9f18f39a4faf2973fbb98420777db576d778751baf4f58445be926862d826c27523aaf904a647d9112cacb90cf34f43165edae6afff410a825ffd6a7ecce85d5e1960ced819f6e7d0fd7e3aac42c89038a2090bfc95a6b5872ddb2e7f9bf68b71b81c1a7651e225361f0fccc5308f2755b0a38b0c5ef2ed8c96b98abf2eba8e5b36510481f96c1824660b83f5c6eedff13464422fd8e72ecf5c344f42ff07e3661d91eeddec7f641ade2bb2f41d74a522d64ad0a085c6a6d8283d55e414f9cbafbde423728491098938c1c39f48924c3508a5e37bc5bc400b65960b521580f00e920d18a0a1c3cf2bda02f58edf01ec80eba2be54bf1ad9ff3bfc2e1234733c45ecdcc6381b250a879d768296c2ff31d40cded6c9a163e35184174df29cd41615bf3c8f0321fc73f8d7c05c5d93e062443c2ac470aaddcefed66906a31e6fa571c465a86a1982c1238efc183a547ad5db8c4027473cb12dcbe89abec70029a8518ce90f672dc7062e3e6f56b6c2ce681bb5e58e5df0c397e4b1c995ec18cf9f768b6e53261fa94f97715602bc0639822c4795d076bb957327b17de77ec7a2b5c0c2b87c6852d36f519009d72ea3ebbdb0aacbaf98a37103c3882dd44f1c2718a4274bfe7f9c9d1a2a34162adb6b43e2d5fa62d03b8e712f2b3f889112ff7371e686867c561c548b4de07715c6f9814f552cd6a0943c364a37eb0d75a4cb8b5e0c17f2345cbcc7325692eca54c085059665b05c0603cbf80063b1f3d9c8d03c990480f062e5bc8a7aac5371867f445580b10b1b558973d1edb05e8948515956854c9de6266a6bda5fca4a3f9959dd804efbd6215acb918a9cac9d21a4194fbc2dac38c821501597304ef0c0394841a67dc257abd43a6d4ad108c01eab5c7efdfecb03711ed5328b7534b32c621db671cc42d15fcb2cf1492bbcb03190c6b8716dd1033dd2bc8765dcd86fafd15b1077e20a4319462310e0799059b6faeec8bfdf6088b39f6105602f3a9f3eabb6d14b8a2cc31ab7bb4c1a6e799dbee7bf98b49217a6068675b0725cc0c1474542d27411b02ae17b1f8e28ff979473eba20cc82c727c979b2b5d78c1d51fdeff6e0e46d218251599c15899b10f3994c6cbca8e4302a324e1f8e69d48ef16c581a0de0f0463a27bc84e871d5374d6eec8b816629c258026a6f22fc52322e1e41208d9dccfbde60fb9a379e1adbdd36f57b88cee6042e07f9dd53006a1af5310fc5c099f886a50238c61e287df30bfc432ecad37fbb113b2eb9936fc6703f8d8e084dda90023b87685aa3dae550cdad3375040ecc19ec69c46fdf929e63e05367443f3bceeed21120389a1a2a79e853d52b06fa196b0153165a20d363ae4fb6a0a38cb6f655ed4b34420fc7cbff100ba8c9ed865f32c930f37b2c14c12ad42f166443658e79824c6e3dc8c4d6220c00d9bd0c8e22f7b7916654c2b1f528122f83cc1bbc3030b17e9c7a0e432f9e06672a6c48befc603d7122f2d9d19c2c786e95f1acaca592ed0f67e9fa77b08467ed8217481e1597e6852eed75310beb865244b1af0707955f2c5c06e46247c0cf6ffd6d7f80e41642b9999cf7fa218c698c6e968270c55e745e5ff4a20ec0331041fb5bbd68723443b1b9926469d79ad9948fbb0165ee1c22e0e430aa92d7af794b2f4cb32b24213b418c6b5e7c7b8fe84c22469b2fa0b9ea09bdb8bf7eebf4aad2ca1ec21549e84b44082c8ba12a502a21ae94769e296e78f9368cfdac80f0e4e9b13b7c94dba5015b6cfc24d4a91e1080ddea35b32a6cc4a4d395d0e2f35b602227dff9707a9df7a80c3ba3a1d8d58e27600491ea66180a6b08fe621c3816291c147a9a274a4b83da92f6fb83c0ab6d0ef1606744a9f2e6ae5d470f829c01ef189e61598489b0b30c93f16628537e1b36413530446a85451f8df9d0409936d219e8423bc2ff02ab4a1e78b027e90b50a339219cad82bd54158fa0b6870802182ec13a82d9f3d9761a546232b0a677d8aa29ee55dbd312e91a31c4980ac098a930fba0cdb397980b9725597e5205feb08d913c7e8e96ac3f4ae382de170bb6f6b1d9d8e37b5e31b8352d0117246f160fdb8847d91850de543ac84c4f3d80ddc9fad385f72579a7e9462eed90c63c12bb10a072f9750c7b187693c9f063bd81669edc183f3c9b0aa4ff016bf867938ca78fc556a5221329176783052443bb947581fdbbf41d3f6a1ec0c3447a277ae14efdbf69ad4551458d86c5cd9e633be72e94deaf7c504ec64132012dce4a6d1a6a0d917df4eee155a796196fa50c9dc080f6436300b383759ca67de734bc54772e59c592a0444754a999d2561b19cbf6280dfb1682b5061de17ffd4e150031a66fddf0ec9d23105e54222433dc2795a6496e2b2ace303cbdcd4eacdce7cc2a4b143d403f261664be4ee29b31a212cdd33d08cdb765abb0f2e58f5399533cb074b1ba4e7228b7e26f00c63f18023186dc727e32dff97518ded73690d3f17d6127428dc2797ad38de1c1b82c6634bf998a21d47642ef74977eb633398a380fc540282badab46360c2b40905b664ac10b5fd62d5f8905fa61b8b290ca74078d45dc70131d0b9c83461c76e063e28573131273feb7678788c2ebf3b2aa08159e3d36c2489a5f5a148ee8791ddaba2ca434b7dc79d77e36799d059d16513864b304d69cba3bf241e0b4103a1716261399bba4f372080256239626c3c689ae1d73e23bd9788a1ebb31edccc2919464915beb9e215abdebbadd28756454a96a1b5e144b601fc9659bb8841179bd7be25fe227bb2f06206f8f77b7cb8996d1a2c535d718ca504068884d644093975c5e9d02f12f260641aed9ffa27e3d510c09a28c4d463df9cbf9fd6204355ec35bbcedff2847b56f90042b5d2259538246635c55b5f442bf61af979fcdcfc44d46fa2c6fe72c6af2f344a2ad2384caf8802f0432524e9356132dac085630208035175841dbc01068a6c4d000f703507aea4c35a589a62352c53a00f46ccbf8ae59f30325899d7048489c5929682eb48e388a7674ac777aacc007204f0f3c7a8956a5c236ecda2ec2495b5b263aa78c0c687faa3e8da6a4a5d539fee7632923dab1959531672d2a70bcda08ba01efbba10d190508e4d9f883188da0bb6ed01320e2c02cae0cae375dd705349f302ca90a695a4866cd7eed58797f94a06fcdbc26d8832d88d89677a051253b6c1df6c882d2543ed550fd08f7c7434308aaa7da649ec05665294904fdd4578a258ba0a119d10a89b5da274e74f708a781f3e9e9c1e9b41b9f84717dd8992947074ab1dc2bfe8459ec340fa9e1165a77b51e6b3f0a19c34722fedf6237750948040fe126e9ff0d50f14439165463da56fe144345623434c56048baa1ae81e1a463682362ccf14faafd3e28762601f8a98a9fd3bec163c569ed79ebe4e5f4433a21dc6ed4bdd2c3ca6f90e773871a42c58dd94f66aa0fb69905e8eb6e08857e166814471add392270bc69aa57101136ca2e0121ee1ded488f01a8cd2180c11ed4159c06361315df7927e9fb20a5c815633a05f936aa627ef4e780a47a3fd2877bf81d323433f1a7233b6bb8262524c46273e897a3c8be3fb71214a9c208120177dffa0865fa29f2e347269fb02b1fd1da71680c58d06ba08db27ed90a7ae40d060824b8f55aef7118eea0c1497f168243c6c6ea4105d298a5e8ee016bf2af062da3dd102a65a9053a14dbc84a03570561b0418436f76d15d95470a43db5a8e50d15b2bc5420483671f727bd5f5fa9e68b9099dd1249425b3c5c358f7af19663cd9a020caf9662e6cc73b40709efdaa4bf911c470569b362a248e18020872a5c37d090a1a327a3f21961c2c605374c2a0de9be3f28da73d6736147f99213941f72a7b8e2a18ae6b43f13f29527bc38ebae74aab3d010a0d9171e7e6cba2786e7ed58eea2033610cb11652ed9ecad016745fc84c6e119006801abadcb6921746b28d5f3aedc41e94496bf61a971dfc1c95b6e7674f47f80e09a87985354a003fe3b650590aa8434b80772deacca8ee7a649ff22de2f288be7b51992373433f69a22afb7b8172212dba7e15f364a2ce03a3cbf90f03f689d21f727223fae286bdf7a8538ce8f18289cec07b6874b41e388229c967c777684515de8bfb37aedc884476fa87ab8283c1c8d9491d9a3cf1285a56280b5c01853fdd0ba6f9ef9c902f0e26fa9e92d6eb44b1c59bc7ab93caeef89a0330e0157dbbdcfa9254492d8c853a6a113df350ec459c35370b2a574591c81ed7ada50592515d459b29590cda9db15a2375289d9317e2b4ccf324bd522de794423f83ff50365a6409d2329d99bf1bbff745ffbaf6d21e60908acc987be61eeed9d887b8267a708de7d89d588bc5318025baffa7c255b2cc271ea8342a17c75a6a6f73feabe40f7ec7083289f86fac99922da8cbd066041083abfd57608ccdb2462e5b89cf9f3ee5a8162fb3e33cd8eaeb1f45f8494179035e03c77dad1f2389bfc708b64858e7688e802ae1425151e5a8bd1b7630c904323a599de93075d8632c2e7d9f41f476b68c09cf8845b574b5740ef46156f10891ad4cfce778a05ae16ff67f0dd7cb8d84a1d1deb7c0de2fca06b6789798c536e58afb836a4de6acf4b2bb7c8e5117169e7a1e2f142677b2d22e1fa47ee128a921ad95130a110c3af7c49f07082c85997d0a4fcb594426498399e8491f43117167320f3a8f766b844c3727d9c13ce33ac780354dc38a8646222ba0da930761a6882a814cf45bd6d3bf4ec937717cccb125a800b76c1937e60ada63ba4c7ca012c6e5e8fc538db572900b59e7bc97d98ed277f0a9bb34868d4f6d66b24f1e99bc6917a27b9cd7e5b341396592177f751b03ae239dc699af8f2d4a39ac42145877e91c1f0ee7a9c8d1f91c4ddf4f2e7e5e22e4c0c8eac460db60d03d1da136608014af44139ce112d06236131eb846e954db4f450d4aa7b6240a3b692eaed5bcb2e2684d57b2279343a45400be3220dfdb420e6bb9f0d6b88c774795695e70d7dc114964bfb079a37f65f386a915566cdf18515d5f56129ed2232862438d04c4b8593055edda2558c8676359c74b195ee36a2a7d968d2ff634d007cade3b81436ea3d74a99b77686e41b53be0cc466d6e14f04b4397dcc9bbc755564d3c3db754ace740571c0a6ffee3d7927ca72293901b8185d6561a59a014f56df9ed6138d67f442f6501128c37a9cd8883402ddcb8c07fa8b0b3c601ebf253b66705690580f5d50f2b13b4f0784bd3724093e367a4695d8e115e135dc880ed503219c1dc8b16283fd9003b4926fcc32f670414f235cd18906a9f454b69b2a6c58a180dce204121481bfe63a7b0b210b5604bb903fb965d1a04b8503c23d0a39260539f256ca409eb61f14a584f0310209ca3affa0b20967b3a66c4806e4414212e5eb0256c06818001273a441c20585c874baa65c0ac81d5b3041ca8beebf6f89e74f456e9a1113f415e87e0aa79a25fd861142152a8dca84eaf6408aa41491668c00c223f0d88cce2dc02248493e73fc419b8620e326a05f6e90cb76ae5f99b19cb9b9ac974d8b7a92ea570e7741eaad4450f17aa7f4622d9f519fe86a95dd0e8fffbbe7f079ec08997ba56ca2feb671ed8b5d45f687c65645977770ee4f901edb0edd0c6ad2cea1e2ad3b1ca9165698a0f4c88587520bdfea2055589378e95901ebc1d1fc1712572efbe107b3c14dfcc692da23007a1d85cea4b50bcdda5aa51700d6771cf505dd8e64c4f53b25a3cddd8db02dd4f01e044ee99b2e59a44c7d5aff464205144cf60b3a71b41b45edfc8eed786d32ee67cfb2e89f08c39045148cac6c990da90deeb9da4ddf1e4942e601e5d8db1b961777fa0bf78e8f750938ee2c16d60a3c3ed806cb7b0f54208f36cd210423def3094175955c8203f16a7bda8e64326ee227f4572f48729b1ccb9581916a43884b4b45cc7c68ad26550e668036d7546b91a08d22bb48df29e2c7a672f24812de604ac9a43da3aa66055c2b2f73871c3f019cb50e71a44c1d05b6daeb156f70af500e1d4620d384ca0fa792ff13bc234c4bb6a302ec48afdf088b6a3067ee7b4241a9b28db1af824a63e2f60a48c390acbb5e9fd49cf69a36a8b89d54029f9dafff1fb30aa177c4ee700b91adfb2942e9eeffcdcd2a63a5c2a876a5e7e147a43f3c91bcb10d3df9255af5f578cc35656122bffcc62146899406e62ddbfaa717166b45c8be6bed4b6cc08724f1d015bb28aa998f87b4720e6881082e6804d345109329d10166cbce231d83a8c05c28a45a5672f8cbe5a1b44430ebd69dafa9c4e4c270dee8b6b7eff3475ff808201c497c080c4edd0b37ef4d6b2b0017fb59909e3c42c79066b7a35e0597ba58039071f412537132bdf77a8cd0a0ef809bcf3074694ec62ff748cbe0d00109ff7bc022d6fbb47200c4a9c043a239e49e3d595745b5be26657dc5339b0071ef719984bee5fe80979c04c373981c2ea80086d0d5ec77f8c6a00a06cfc177582aa435ad1e019637cd06ff5ecdd19805abec100a577091185d9fe0ca51e354cdca922af45f050cb8df985e20e89146f55a161056c4c16d088dc35f06f992f626fe32fd9b3626879b9f8540cf1fb705fadd0339b12411d24f7ca897f7f481cf0c19f38e32868f61743fea76b61f7ba17c77f6fabef026688677496e81e908faee0788fcc5b44a04fc329e2041b53af9e5b121b1b3a3e164312e44fec6008ad12c2a6da802ee853f02051bc4a6e46b15e0927c41fc53a2203d306962f168837bf0a44bc0c5f0746ca2e5e2b98f866609019d6c91af5716349fd026d2e3298915c36bf59e5a5a23c0d3da19230951177775d7feecf074f07088d9cf7be0d4bed51d6cc4904117771242d2c55f2891f28fa054ab5292ab1d9a24ed2b60b2f96c9d07a4248235b7fee8dbdcaa507ee87b05051fa44b216ab7bccbb8a098d554a67bb1450298caefb3404f65489726253064e0424d6faa5338ed78f6ec97145ed035257fe0cc2f389148b326937a17952da36f41b33d3aa89607d8aae51e9ac31ac1b32b7bd8c78e5c925f886e2974d4895057cd0616a4c28426faa2ac7d01ae8e9f226b94bf253b035ff5d30a65a4986d91af8f60b696f945c5517daadd565c0b3a5b45b084848c5601c27086546c4a65949282c6e8c649fd0ebdedd12ddc3dac2fe15ad952dff272d08bb058c9181a11a1e2c45c2298a42f081926faf9a4acad2c0d38113568ef9a78858d9ed266c9eca6fbbf7dd04e5417ddb1aad1e2d875e509a4e9facc096366f65fcc37a366356458127d83863a24faa80e29343db0857c2014e59eb2fc1120b8cb4e09db332dc004bade517b2a575fe657ba564d6270e7c8dcda27d178c1c18395efac9255c37b122c3fdce9caee38c96c7bb6e57c2d70db3b1b353e144487deefdbc214f2e89032e30a96f410fe1dd22943d5e3c388158dd0deb57d0e29d350e53ab256b701ebbd838e37a97c51483a5d20a2204f037c0988208e1f8676780089da7ed0aa082f88d8871688f6292be3d2288dc178bc95058f94fc0fab84275e406c6be0ac0b62b7d2ae45ce461244f1f15aa16c20a0245d4b7ea442b1743930ccead6876d95eafb5440d5b56156a6888a91a0c59c7c2dcba734c2628c4d598e6479c013565e348ab79e33f816a0d551b1bd015aec35307382cf041e4a8350741f01a0345f88f554e5aa2daed7eaecbfed2fd319d8355e4a7e7155c15cd0aba187d79a8184a4f32ce9c81cad7c91d926859518903904e5fd5a4cbc7de8ea2d5f3c8cf0b7cf41cf92f18b4ed1e24e7d3261f14af7c2381b394e375a14f51ebef1c7b891121a6ffcc56d844add98ee6159691bf1816d1c45374e431a5be533c5df340fa0d95353bffc7094497ef1acb843b82aa2a6af5ca5839e3e8d877ece3289deab088fa3b6d26ed8d22d0674b45471762ebe3eb48e1071f1852ce09a84944e48987e0dabc8fac4febcfffa4a252da1e9c325cd47a53e2d21bf48ae8528a07b0a0921443e5acb83add1841675c2e6194d2885423a4a619b1270d5f00bf9159831592944fb256212982f8d4e8aac3a760e81955b0557be904f8af03ab1f3948e66ae88044244451c889b9271ea944d9c489063d57462c5b901174dff0aa29f4fb5dcf4cd5ed908c320ffea6bd88d31d5a2f1aeea17fce98936f10b7c21108d0be7a769afb7142b32525014ec2c504aa01bc44c185f29a73f29a04d86d99919099c7e757d210bb8b8c895c351b09c74b420a4a629b9f4917bdbc1b429a74094e65b4e61fd614a1e4f9a0bca3068c196d9173c96569c2e73035b9c2176f681d4a92c1c16cbc33104acc05436c3008fa641208c008fd61b1ba5c29d3b7954ee599f631978d30d6c74721e43460390844b0d50710c1de26a12a09072096be9f0e208fcd021db857aeb0b0f2b9c7b2ddd05b139076bda48248ed58822404e40e272c1ce2e5d18bb8e9b92870f911260c1928ef1796333f06e7c40cac95dfffd17ac00192cdc951befc597db677a1fdc36082c566c01133835863baa23f2990a71a4b997e2d144ee93b0a91875a59392d3c54b0e87b17b5de427b2d93464f3c283a65aa4a25952b9fc553b12ccd8e9172eb70e690f3fa222de3d28739dba43c3e79253b66887ac4f9f4a09aae9b62c7f309079c2b60ba11fb4c116461a0596b945cc7282d00caf7322efce75f9e757da271b9a5dd40a083bd185df84e635589690a595e5fd4772cd8fa313958aea8a28fdd0c2cd69a30d1876a01302735f2263ae5b905805fcc138afebe58c1542060aab4f8d3fad345d6c5b24ac37dbbf111101ec0814c3e56da82ac1561fd41ddc52f84443004bdf61c5ec21596ed059be17cfdf30b030cf31076558b91dcc6183e01e4eb299419df8745a03dc3468cd90dbfe2089f3d0759048710ecc987b94f2fa01b068f6004531902d3c4970abdcda0949a90c8deda60bc8de05f173924fb3f092f81e990825bd0c8e572972e1dc1874eb6889a1451afd3a4962b11a682b6a9f2f3abdff3e28e04e93eb90082c18ac882a8f08782b80d41284027bec42c9815f5793b32792ae6aeb2950b6f678820880322122cfcfb80d2004f0b10c364a8139e27dbe6a1c7ccc1e133468e92d70f372e0c2406c2448a8a79b7f03a58ea8911ec2445d4e48f049157f1f73760f1540e5ae1bb528df6e1b9c5722abce3037ab875b7016a6955f05fb08af0a02f493579b5662c9973115c8b8fef596d92a1ebda44957c35c4e5df1743f2f30e9fb81e67e6045cdc8776c3aec3c2f82399d96e853e1939004c684dd8840b6cba8120f40d7d87c8b4bdf597b730940652cd4ae2d9317a971c0fe8f007923c0d33f9e9b1613dea80236c6d3f8a0e2fa20478847c934d7b5d1cf8bf74001b368e6a5c33f22737e5f7f72c7664ed9783698b9d6b7efeab0bf226c74f0a71ac2c4b36452eef74426f1f013bae8e18ea99eb2a7d659aa1500cc8262050ee117d899952ddaf07a2a5481edc903b1e08193337c35fbfb1de16c9432cab419eb4439cd2d3a50b063dc0bccb370843b385d87e6f2da5c2428c996cc69344a89efd5eb61cb82083312d84076aa26078c3ed1fedf4b81689b023d4eac17a0f557192df61b6a53384cefc4c3397cdf2317dd6d9454dd6614c1e37c7567618e3835f55e7e3633b6feb348b8fe33c7dabd4968be894edee345e4f9522d4d18bfdedc77cbb5665d33f4905adf6be7d141662ce9286cb7da0daab97c76eb1e7fb9c84f06945188579d13a1e3194201d718bd890bf9599715309fef4e27e7179701de72ff442fb9a459b561c14be893d2c845f060870646d1587d3d2b08f0707b2908d8604cd925923a12d02993c9ce7e5f85839674ef2c986d6e654d3a762647f94c50f36da6765f4067e09874e8a877d823c308a44a04b0afe64dbe64bac3431e2f93192e2055a378e0bb80a4c001b21f7463cf5c95aad90e2228c8f908db455b40bd2d374cddf2f7a6599163dfbd5963fef1ded16002494e1ba3c9fed023897cde1519b0590413bbdb7660ca452ce9c13bf06a3a3008d9329714be932c5b84ac3c2601ec13ddc29aa0ef7c6f924cb40f84fc02f744ecdff09fdd86c119bbc678161dbe617c3fe4bd80e50ed6c36a463a20264f5a98537fc427a7c4c77c5402786d89473099ade2cee4388377f991b981b9041738c405e7ff58259d2c9a7123b403185aaa83eec41ab703a0d52b24d9cab539528a7267dd597c01d6e1146fd67473c5291f6e3de64306b15a258abe4137d8d44c013cd6888bb74ec5da31383c72dfbcdef3cbe36b655cbda74676f940bb9769f8b85656030813ceaa3489de2a8b8b5c7086549c566b55aec8d7d97055659c65abf2c8e0fc455695872702c8065c1236ed243eadf29a31d994b97bddae79a6f239f4f3145234d33e68768bd4606b09a31e7ea835e7451caeec77492201ceb6589bf13e0243eb8f3f8f4a90962ce5ce189c50f473e4545b91f9570e2ee1508991ad920b9a3b6db2322e5dd787a7325b67ab849ccf4aca3fa26a124f9dcea59c4649608e12e378c2e1981d449143bbc2c06ce1d4ce53deade73b4082df58cbe0a198a0aa39efe57956b2d1b9f66aa6ee4f04d2c590c7b4e4a3f1ac8f0505b1c994add644de618eb18ec5a5376e91a4c4bdf3a8e19187b66483fe63859d4637d304635db9597609a2437f28519ca49c1145c4986a99f55d8f1261d9495d48485c2c30c97e2a4652e6e0954c46660f6804e8f0471baeca2eec71e63e93000a1764c4a3c040b9f39c82294b801d56287a8f843b5cf4bfbc2b70fca2e7a00567ce9608e6767cfa782db60905d581f3ce447f77cd596ce2017d18114319e8358a425134e77afe9186286073d779322082f633f420bd866873d4fe9eb19d4215d1bf119b50e65b67aeabe49ed29dc05a2fed0890c042a42f561dcf4b893da44b3576221b0ef2aa911038068c3565ce303ce94c7111739c42ea431a2a529cd4df23d7ecfa69bf6fda218be80f05b26fd00d13bd12f2d4897e3df06431ceaa56335c68d02bf7de39c24b052f67c7240c126983d6c254f9ced702b7f02418e651e5012189557226a627ed16a899341ab2381529de574a16bf6aa1f5b167899b39310eaae45264dc0d77461f20f093bd455c182a1d70532f64990da3dc0b9e7683597981336e9006c930f5b615a08fc3543ec03205691c06ae086c8100c60e08a526e102105a48f7f69b7b2fd30731d128ed2225a3ae58e5bb638e8949580d3406a8f2a5aea5910c32514cad377c593c69be8314eafdd311cf6a0f525f12cf41ecc94ec3e70db21c5bf23a4f817caf08edbebcc6c6c16b5015040fb39cddfa5847683e3f723d680922e7b1f024c4580edcc4f89a75bfd4d0c11e08d9a0953b519bebf16688dcb29ac1561e6cc1507247e7acaa1c9d91be395b269f03b906839cec1945977a834482b26c3705fafe3498d8a50f1055027f60c89b5b3649c5dd074faa4d6dd197a6564b6055b72f3c842d28b881e1fc76ac3b6c11e9e51ba04592ffca86b3eef2ec0bd23bfa1307bd5e844c45ede73a65fb87db96a0ae05ef363eb5d661ce9d027bc5e89457a66bd457250e9492e4e86fb89d0f137de0556179c203a24ec0e19f1156a578829744350c87a582cea4cd2c0e778ff44bce112cd17c49edb7381804427371f0d2492d69aa39a1ed431fd41addad86fd70ecf6b7c2f20744bbc2f9896620883bec68494b8b6eede4e8cd338b31fa907949e8d5d02205b7860800ac3c5904bbccfba9d19ce7eed9ff64abbfe17285350eb7fbba4dc67555c41ccdb5dc9941eec72e78108996212225186283350e15798f4b06651461520c7123c86853fa229b448d16808820d972d0362240b8e9b23a36bb1422f1d024670b40f2e526b472d958b943452053ce94346cb79a5dc368666f669d5becad046e516ff20ee1599939840fe6beab9db66d5a3bf3318f3d363cbb6a70ab7ed5ac232330f0cf992cd75ddd82991540e4d01634f70853192f90ece149425a863adecc4c683253ee7693310c5f12111f0b7f164f0be013f172ff1f87811f15cce4d4317098f99abf5c5a228c56ecd6fa580a50b857ebf7fc28d2cf6d77457597f1480014457d484e270cee270572d7e69f939f94dc7fcc87e19c777d08800ce611f7d840ccdcc0594877179e368e90425783cb91c950eb31a5deaa245f663c59e0dd77dc0b3cd763920f66d6c5cf332a25cdbd41d87b150f1d12686c5100129f0d0ccf3649d9a81064c2ad714bd56865b8b3490b46aa6e116d08de3d2059d07c5071e7bc0f2eac3dbf9ca595a8030304ccb64ac907733a5e7899e8f090443af9af1db5bb241d2b39010727b06799cbfc17999ca786acc443eb331e983fb1528ad7b1389834374973be1015cc08199e3f68c8fd9bb00f767fede5cabd9883babce5c4e7f571b597cbf0fdd33fc6a2ba542c6dcb3b66a62c2c6fd08af88601cab16217314f348976228a1e014255ea46c9e85dacf9e3376322315524d8bf65c706b34b975dd723dedc7f331f5610e0190d34f3777961f3d89ff2e46f8a4ae545bc059e8659daf1fc5c18108c60153e832a19c3ff96fc212d95fb68ac759154fcb43610a5eafb51da4776ab83fc0710db5b0212b90d61f5881864e9f24a68298c4eae2aa9f69b18300380070210aebbccaf89b73f61e0cb3d397a895c1773d7941680790bd1239d6e4151bc0c5b97100031b817b3f3930ef444cde816208eef6276e5c5eb3dbe779f534e0e04f5e1f422af9a9258876e952a9fac954c20185c3f4bbe396d195b18915080254509e680fd59d94320a99b941a6251c1fe8c22ad9cd293c3e72e8333e24b8217af7da1100cab8c0acf22328c3fa57292c43bfcef2b29f2a62ec4ad3e913d51c4e62f3eb9dc518c8b2af7b8787a2a8106d18a736a1192cb268e984d4c511f79ae2d187f886205f1e72a3f6bdedb7c7f41e5eccdb40495838777aa465034d1435164713b38f36644ef23ab828d6bbe9da6c8e46f70b07a1c17fb2d61de2efdde9e43a72ec7eca7f224f529c7755433f04c9a06f5a8aa699bc45addc4dd71926958d590eacdd950306e0f6f6503901ea31b3de1b0bd7e2c853b52c1afce2250590f32b3da70bcd162d2bdad0f0d8e46ce150feb300ac9f8d2b7d2d60d0fa3e5686a8cab9ba8e8502328df1ecaed17f1d2f50af5b29425d50e17919fd552f53cdb9d2abf068c43575c6c1e12a158160596cb7fa1b2627fc95fe9a323e320dab5306ae4d035e01cae3b4ddb9a217c59d479066e8f5791f084e17798753f498bca161f48bb937cbe2443366424360b6e928ecbe99b8657ad86af7533adbd5713f682088e072de72327ae650c2cd6efac5871d61057e89174b381de9168faff3e59b4bd4a61a7874b33a091f68d12bb24fd17ec840a867f6a8b7e96244446b44fed1030621b4c38ec4fd05ba35720f797f37227b6de1e7b60528409c16e98bf945f64745a301a363e94416c34a2e710e6efff7c7cd67541c7bcc36adf699de0198bd9121e3a366cf410d8890d4859013712f4096d2b4fbf44bef516771befa0bcd1811dd2f3f751ece82be2dc8edb3d70852cc61c77c269daa1970c949bd85872b2d8bbcdf61e70a74ff450c6accb50e17c2cab8bcdba8e03cf207a69f11df6b4bf34d2156d8b521e6229f0cd73737aaa97eecfc1d98a9cdf91b7cdfed8bb3264d2e47853d3834b278b20b8809b10002d3620b835a4453024d4fdd6bd1b3d1b34f694f6bf120e699460e96409d75332057646e51daddba53b8a4a3facc4f705470774815bd2fb95d86e290c59904d36d0cef24c3ebe4acfc57a4a6fce3347ff9b49fa7a69db3beddcbdd6ce3ae3afaf3bb01f271dd3d5ac859717f0e5988468aecdfbb11f3a106452661400d659d4cf33e9fc89110e353c4b7ed30dea4465b02b7c2ac819f182ab3f19cc49802c384358f68580c8f76d2159684957f4f180d82e1c89ff43b046f6cb860937c8fc7be58cbd62feae57522ce6d94351617bfa5da6aa0327678bf81e7bd9896f14f1b9bdcab41776a94b4ba32087b5293fd26f06daabf2e9ea3d6e7a33ffff255b974ca955b1ab10d9be90b6816f18f8c92e747e7b3fa22641b23dd437ae9a3c7c995391eafd3cb1e5794f6386d94e94011653bb6c298638c7eeccc8b95c538d7a8f6319d592c06272cd6d121a44e5b21a7678b10e6955d2f5746d74f8a60b0d494f76ebee87bff88febd74c801cc06ba3b88be316cc0a7f2e88c322ca6ca3bb49520cb4f94fef7a41f346ec7f83ee375300a01ba81ef6f8da14f06d9ff4f8c4a143a16d727d4c0219d3c7692901963caea4f9ddf39a208b5bff660507f366a3963eb97f5e3138cbe017350e59e58f936548204a8afaacb8843459263f34162a260d722ea833283651309a6720c233c88ba333122cf449dc50a45a20181504701070511393c7195be9be487ac0fb3f384b09f2e490f9677277c55264742d509551b39130c7f661bc1dfe211660dc6cb3347c125c4c73d244af5747ffa761ca50241b8816b2c3f589a93bf2139f0b4ecf8f5e5fff1ff00d8c639db58a507beab1ca3351af3a16a20ea3352b1682535decba9a19e3a26f4b76084b51505c365d45722dff850de8083217aafc1cb578cec3624eba28f881841a506969bc7d07113719efd91bccda70716ec9e98ef01401d2a37c5978eb4c38898922b9f9dfe597084f2f53951afd0c5ca1a9233150e5abb17dafc4f83b68f82f3838464661f6603c16e1f1386452f92e0ffddc19a31aae1ffc6502a00af83a722fd40da46f9461e048604b20ea8b5443e8618ca2304d010bd1f02a12806917ffa9c07c3150542525b63a9564afa37636019c021ec6de2966645dd6250e6ff803958ece0ff7d39bd6841b5eca6e69bb1ec22c753d7f43f00a3726441a21d9597cd9220a972992ab2851e732bd99fa375259d1261d76254b471a7d17b9a449044e39943848d8c153ecfa476f1d59d362eaf30cc3bd5e988f26a2a345274e55123e2f596f4648a129f78ce14bf68d411fc981cc983a89d418cc98fe777a91fb50f2d9be48de5eb7095981070f6b891180a363d61abefdef8812cf89009631a8b452bf07806353993a478ee078ab879a40b8abc652bdbcb2ff267121f946d24298e94a09d17925fe10879a2bc7e16ae62748c069722a0aac10854370f24fbaeb551e7c10829c96dffefacafa2a62846a663eb8faa5ff021aba4ed44e1fa4608cb77ad705625f2edcf335dd8c56b8cfaa10349404480ed1079e6c7030f958162a51877bac2bd8bbe7d09d9dcd27870ea8e6972fccc15d24aef238d04dc059fabafba265c5964fc83040188cf369809d1566ee96844911ceba812f6632d3a281253f988ec0505d58d537694efa8ab382d724d84d3799e3904fe81856e84f4288eb7a073f13f4d53afaa68a3005dfa4af55139adaec4729e563d8b6dbdbc105f099ae744c357961af17c0db3110b92419db1446e680ff6e43617e8e00f96aa845a8f9b72befdd67bb2646962f259b167cbe8c07f16022a662c5aba965fbd614b2810aed808e300cb8bc01a8a5797b9871f2fa7a0606db9016e12d538724881bb0ccd0ff3e10aaf741e9bfd18920612ba8ac4e0061a2cfe0787b6f4068059cef5d8cb55833b1a84571509ad2db7856348e8f8313324ae21e5aeff9dd49a3a968f468dc9538767be9aa4b1863548a95ada2579a73846a1e7303c231076e260447b8ddb1033b4c1545ea89dc3b7c858446168db07f5e2c0b88eb7186e3882aac607d562358328b50b3d64b2e12bbe9fbe7a381a307ecea3db8dc6b1d8e458e27b553dea31b1d3c60c1d649db94d38e1c87f1480ae5a9b0b7680d461f97a5a79baaa040de33dbbe5c23405f33715a18e1ce72b08b7d293542cefd5a38e45cb13343a98cdc5e76c1c3070445b828677744d4a08fbb160e0bcf76cfcea02dbb7345d3f92df42bfc61f55807bc006a307ca878a8c7c26c8f4df28379e2b1da71930dd24ab8eae5a762546397250f8bfb222a971fe17fb117cd425e78a3426d89b827bc16ae9b0caf4b6ecc03bb9e17a6df10ce275e59fe315d2c352a7886cb638d2ee6be479f2e6f20afc0199ceb8291e277d29aa9a13860cc84be8bd5aadc62417e7050d5bf9ed84fca73f7c2392481779c497d1227348648940a6754ff0969a679cf884c821a30182510f389a1359625f4fbc1b4ea876f90ffeff23fded7c2e20f88b3e52d906013da72aca0e61bd532224c3a65550c2434ed501bf26de889784b52e232ee716ef565782fb7e9f2008207fc0d4d90501345805215830855782ad185d27698fb02694ecde8c18dadf6c3439c101195de81ff633668cf91d764eb9fc7af00dd284fb94e3b1be92fc96d7ec41110362ddfc88f5560d2f91940919285cbf4372146e1567e5adc493d64a076cc92f2366ec4633a4350fa76ff7bbee20bb2d333cb8813807a5ccb76f1a6acc20aea104e651d403162f448017edf9b8348ec412522ecaf9400ac16d840790a5411cfdb977f871161d27e4243000cee87614e076040bb0422301ecdcf24eb9eaa5ab043af63469c5e1a76603ea9623ffee0df86ad5daf9776435798bb94aad2a89f0a1d431a2262691790fcc717fc8c3930adc820ed65f7d30f77c30f098d3b68fb2bdedfc0bb4d79bf611bfba7a4c9698b303088d5fe58dc54afd5a914964e974ba9514f9cfccf2e54de0c05fb4bf890e55bb34c1932995d923e2845e04381f3fe65ef5ae6b8764ede8a923f3ae4328c37256c2168876330669c626e10135864d237c3cb317e4273901cd4c8b8a765fc7b4c46b7e522d4a7cdec9194a21e3a7473e8f84dfe228b4490b9cb725ded47e985c4b80fd6d299f3d0832efca7308a14e682e46c0ac9acf6073d516968814522e1dbcb3685c50e5aa69153ad1d88763d6128ad44de019714c90fbd246ac8e8ed2336eb13d3ba61cc5de202dac63684bce669b073a7395085bca61cd7c2d881ea933136efbee219ee2ca20d5ced503b3e0961cde624313e23f5644c16fd582ddf7e3b169db5b97274f3b59ae2ecbca190f8c7d90540058079c859237d5c4a2f139c24e4886598fa9cf4cb9f6df3194ed6467718ca346bccd2783679ac79e110351ee04b429a5c07d06251f1f9be41311b51d39d8b532fafae0790c5a5ac6011aed06ed3c68cc598f0ef439b34e9c84d45c923d269f22816289554d350c0a0c9f6e38a0a0eb8492981b0b3f08c311eb2f395ad1f419f8837ba97eb1d664e2f0f8f6c1487a2d998ecfe6cdb25a1e2b7496177ccd8c706f65e5140bd3c9ee32557ba7ca3819f2b1b28dadad6e2a634858667338db045ec66144c6487199fad901c2ac8b1f10cfcd292f6314ec7ce98192b44233e16cc14818ba0cbfb70f6fb4b2293a0c57d69db494609e4b3cc26d3599055250d7db2c366a058a3912786df6f4ebd5f66a9a0be1c6888ee03b219dd41510041269a23289136ba819b19445295f5af7f85a4b9879d5587517b16caf66dc622d52295527801670d91e29cf77384b170e96f44ca70dcc0a49441372495f4099b0036b77d553ac0a4df8bb3125cae57e95c131d4d07c746f0ec0c7a744d881ec94f3d0453ea1a0557235234efb605785656c2e584dc4d4ac2188974b363a33271330140de601a97c9ee923928335777d5d6fe45cce10cdc6eccb3babfbbd17d2ae4d1dae227420a31d1d0743af5f7e8cfea6cdb4596e80df564ecc94eb8d7d7d01d1cd178b97adb97d35ecb2ff6a314a2dcce94740fab1bfcd1cba38573420e30231068251b29738dde480dd8745c08130b3863957788f74a46e9dac12d5bcc1513c8d48ea38888e7c73bdc7abab03d786a0a2d16608fa3d617c665989645a2c54cb8157d8def0c14709fbb06cfe41867746572dfd299b3f2500a825bdc519cac44f8992630deaabf8cf31367c8c8428c1cd935fc2b64f8c021fdd41f730a3b3f2b39976e99e4edffa1124c267bbabf5540b4c116adbf290e10f29d6304368a8fd1cb4c1953982a374b12a23f072cd843a01e6bd4b8609207cdb5c381b9230298d017ddfec228a310bd23b9d0fc37f0aa07b57b9f245d9008741eed2caaf711dc444e8b1999de4b136cc862dedeeb63082ae27a32fc27e55b447000300565f188fd9475789dbb906c1a7abe63b12b593388330016900d8caa5ea84d3724095f0de600ffeee1482a6b0558be5798ae260ec2af075eb07a7ebd7abcb31bc8ec4246bcebba0c6343e5e7fedf02e7f9f5ca2bd2eea855e9fbd3d7a532faaca01970224731d9b57caae0e3b3a8d12e16e8b179061791a3cc69bae0c42740afb4049d814044281667c018b31e67936027ae44778c6c7d7b37099f26564b24d431a0cdb2bee3f0c710ddef073cca22568448180df0ea75a9ad252a55514186b99493fa2e17f50788462afa18a8906dc301b8f04c2cc71e230b005fa7e89c5d43a3247086c4598824b3035845943bdbecade8737e63302286355d8513a515941496a32858f7df232260720486d622354c3d9433a407c9e1ae52d116721d0f6c7980b186496b0dcef0c559563f4c981cf157ccccd965648c850468c8d12d6704ce11dfac36d8592002ed3ad68a9aa1eefa0130f5784edb28ad93553e32417e171c42d50714c89d20aee0759c2c7ce483fc3d002de3cba8250e1107c364f0bd94f8458d22ec04e4f144b3601a10bef98518abd98b5399f5237140dc93792f4e5fdd2942cca545e8d516856a6fdb618e418d35b00e8048207438b5ea8905bbc0ce483e622f9edc1db9d9dae936ffb0364ac6c399ad6862bbe9a519d54967f0b4886b889dbc5a82929ef3862f5b824df31e0328a219bf806d7fb9337d4a6bc0c886539667d4ae38ffaebcfe540a773d702fde8e228f5a50a6a4e925a44e958f4bde14f25b5063be0bb36f6125401da006c67062a8134b70063047bfad1e366d5ce8e32f9ba462df156c58699c80101731d86bd8763ef5642de9faa7fcf7dec41c13fd0824ebc8c770125eb65fca93ebeb04dd7688951430d324627a2dc3edeff189a96c38c1b92805c00969d9888ade9034f183379044197258d4de257393ce9541a0986892ae45185f98b68954c8542e202ca9eb3279762c5ac00e6e7883d7a29191ac33be0de26840fb23e97686cba62fc312b4cbd16ec0547038c09debd33148a1d3c6fb8741535734a160ca715e4cd555ec39101ee7aaff4bd23a29da06fa8918f8ebee42a486c0422391480697d7092d3fb2c66ac9daa2b6e035164bbf29e407f815619e59e39a872e873f170434943c8046ac0e4bf30fbd3b14270ef2a0638599918a92e93d31fb1802e4b334a78c44067f00028a453863959c000ba091704ab7bd07fa7b1e0a0e84020902e8244fe560e2999c7a7920146972a9822c8d4cecc723e7445961b95be49e2b3cf7d0fa6b0875c3b6c8d57b9c156d65657cc9018d9c9ec286aba18ce26b4fd9f5a2cccc25e6bbf53a2b955f59fba3f7905ecd773a5bfbeced8dfc2a4ad93aa970574a412298568dc20fdfbda2ad9f5f2753d4f8988c2c96e1eeaccba564a8778e8ea4383e92b6682559adf0fe794e56900180e71add691c9202b7e6a7682b136e2af47096de09b4bc1f13ba46b502856f0709967e4c9c62ad88fe23aba10e6487a9f1f96749afa0c1f0a062a90cab54b095fd3b1d16583ee147419dc07d5534e5afdd33940a82a766ab14a2c025b73b60a44628c2d50822f82fe7556e7b2da8c248339db895c94378c0d96edafaa947e671ff9dcc2e8de25a572194ed52867c87975feae97e2fc661961487a0ec690dc0dcbe99a913ed6528a42e5717daa4f13b9611a1f1fdfcb822a5bb48e762ac7514934d95a3502c2a0874f9fd591266989b4d69e25ad8b852c8676d558200f49ed1b5cfba1cf9c31cb6db723e2e710d676a1a2c59be3a20a52ffb223199bb6764d60f1636f61fe02e7f2a43f0dff6fc5943172d37a8dc23bb5b7e93f50dbcb7509775086bf0284ac82f3911461d95de7e714e42b11dff3f6e4a28861360bc4d87d66163945de8c24a8e216568e3de8ca52c238a38b73a70442d9d8aad6887088f1598c10193e9c82cd59c3b5d019c661a5f02f17af6bf9400f256b63a75938309c130d19529a0710bb8669ca97ca7bb37d7bcfb58da7d5132f357650dc080e1b3eeed302aa31ad3ad52e5de796314ccba0cc3bf64b0d2fd9d7c618a4649b5da32dc6475f104f7a3e29fca4a2b826000ddecea892dce7c0a622853685da24ceb02bf168d49b428bf04564f48140b663cc4811889f6cd1fadd168402893f0fe6ef19d284246f207a5531f853c52b15b586033cf7d1cf8b887e6515589a474ae1f586531c171c9dabc621b3982a0193f5447bf1aa4c37b6f9f8fc95a0ea398404a5a46eec60f41017a66169200592d8ccc09ee7e0d20f5a75ce512c82fa6b8f8744085b7e1460c106786558479b7feca42c15e9c3a3abfcfd09d3d9b4ae2ac0f7f4cc79fe92264fdb1f0aab30e36543240e3667f26458e040868b1c6d39e6b94165ef54be9e94d8363e1f568ccda2470a71782ef5e0a8339b09ddbb11f3638d6abee0a141f9f3b9037aa9c091d92786e03aaffbd06c942e2b821fbd66c5633a4fe12dca109dd0cb41493623a306524201669499987b4f60fc9048be134303c72c50d9232a34d74ac405465d80c284da6edc0a28e2f1d9f411409d3f6c59c737b95129f4919d0d162da9cebf4815b43d0cb00809b43b7f8840c386f49da831741541a96bc88aac92064651e0657b6f522ea69c05e4d79018789fb41556515eec0652ed08936a51ced6b3d41e009e85f48b4c52d91467e9134845c95e8cad5c21e58dd35c106a573fb8a66e5bb8cf7a87642848bdbc9c6eb5ac03016ce456946dc4d478fe41730ba63608d00237b9a19cb0b938c9d368d80fd76b1dbe26e2dadb9e03e3c9ccfc7b447f16ed7d128ff3eecdc61c6805046176f193e86a5d673ab32f8f0df63ec4869d20400d42f10776eb7d23200578cb9fed14749c0a369c8cad33bbbcca68e88b17085efd69e2e551c5770aa3ca79c64a407028d11c929dcfe92a381c9b3da5125049b345e28c639858e594eba9a9068c73c1d592b3ecb1b5be8ca798966000363afc1832a9f1fc8ae7493ef7ce2093b6c488195f5840d6db72b75836764f721e4f05658b2c37d287b03458e4f819fe453468a690eb089c084039dce0a283d8e7f87cbc9b9764095f567023371f2bb4aaf931bc1e8fb40f3cd7da33756baba8a0b32840c212e7c8622eb2e1632db7f1c10c8f4f5831b91cf21ff5e24555cd764132c41ddb917e663a965a150bd9f6db24ee50bd3dfe19b77551462a49b1dbfcc745c79a96aa164a15e566d09bc640644ca5f5b666c069898c752f963b3d0d2ab3cd7ea15529bdae91a99497bcaf51f0367f9a1ad0328617540626ad1b25abd05c6bf8e7fd9ef907f6d7081d5c03cf4ce01fa54714a5c300acae21cb5fab6d470842210446877f33379a5ea36959aeeb543b0ec22af8907b4b84dada6bbcde19c780e8fc7f978b9fef1fafe3d8ccb455196124bda32c4384876a91b801c27663faebdd18559ccd077146788b426bbb79449cac00485049504ba3fc7c03f61bf96674e1c2c2d5b2c0cc1ed9fd553a03c5e2ffaeac7e50857bc599cee2277fd700ef7829a4f4dfda282fc7594527fcc7f1db918c19b376e3abffdd91ca10d0cbc79f306d835ff09d0ba7642a7891d9d3673b10f5d04279db82197df9edbeac4c1606305c22ed6c65ac638cd892b1af9af23c7268db102b98b9d3fa73d0ee4353a917e44c0f41186e02295397111f4e7996356e789dc4315df8fc11aa205ac2f5851583f2c1c9c60f5b21358297c12ac20f90d168f5f73d5e673b84a7325068bb9ba7295c31bb95a72d57455420e73a5a388d51265acd8580961d58395965762a5835513ddc4aa1784d5112b206dac72790355486022aaaab012555c5e4c1515cca66a498ea18aa77954a110a44a47f504951a2a292a2a49a872f82e5430642daa22180c15092fe50c1251ce98693af3c3992c2150213342504a851e553a42d8c1e6278449131b844842871825d29ca0a4052d1f1227c4d0f04493134cc6683122cc9db172a649cffd6639e31353729cf912396ee312e34c1c1c6ee2701377d25596dc5592247f912fdc4951bcdfe22871c6c27805b30313b43de4e99013f36f7f3831feacc3accff145527113e74c75ca71a7f8acc3ed7a99214e8e8a90f368f453ec0314b4be905ef12c4abde2f44a3e80cbe48b47c25d4ecc31d227e15ab9be128c9b36232b63b4339994a81e2e1b07a07c6068686868e88156c64246f862188662188645341a8d462b92b15881d33ce71c2e4990f38cd2ec8004e6046d9f518e52685c3dc10435946a28856186916164181946869195f2032d6610e47c63dc1837c68d71635c08eeac95edd3466981051760ae2f80758199d912cc983163c60c0988861e48693f4179a306054214940510c0004e1b268d6ba30218d5892d2833b880004357e8c4074861541a63a06fe81bfa86bea16f680cf4d0032d46fe1a94380161187270efd53ceb129779288ae22af630ebef79bd7a4d40a95dec08790eca0e4c1a0a28ef0270119094139b39e71ee61c66b283721cb98befa591d5293d2db79a8fab2bebd2a591930c28f7ea1a7907e3c85d9819e85c8ec81cf9d0c89e79a63df0e0010f2021a0b58640be108041460341ac138275fa07ec4b9816f93034720497b3688c52eab085381bdb52e79cf38bf768e9e972efbd65ce39678d53f29496c3b5847dd1fc08ada3c2605cce1d24b0aa962be1529a8e8a20145c05ac8a5d4b3d2474e2b01c56354669c728fa4a8d518480c6282912a523f8ee24fa220e8387171f60f47582df871442314c081c0214c77297fb6b2e68341870bb42175caf1749963794265054e18823a6be8c19336607060c183060c0e4f43c5bce7da424a4bab447ca231d21654a77a422a43ad21cfa06ed00fa04ea0675026d026d83065126d0255025d0245024d023500ea05ba8116811281b740daa064d836aa159281a140bbd7ae289d235860913e697b30ed3f36c391f01ad42a9d033e8144a046a061d022d830a819241c7a052a8183408340c0a060502fd82fe8002512fa80f6817940bda03ba01740b1a856a41b3a03ca058d02ba815b40afa43a97cf952bab01ec5a43d848ca4e7d972ee44872952a24081cae1090e4e9adc6083af061a982c99410625bda724680ca8130a03fa02ea02ca4391a02da02ca02ba02aa029a047f08bbca8bdec599ee7c99e2dd4092407dfd062d6e2027b851f9f6c53397fb1020a54fde313b497f8662ff28a62868c3486d3d63b817e80f04fcfb6bf8663ac50da3b6c424a633893cabce6ec3e89fd253fcbf564384311ff0fb3ff3b77562c8a5cebd70feae987cbf82b0525fca9ed67fa24ddcfd495e9779f343a69cde2c2232fd7cfcac2a4c16324147510cbc4043622d168619358ab9934425e336b689ff57bba6fff81fc4ce6bb22865a75b5bb4b8489a82bce6bd961ebd30f4ee239de12e24ae50ac4e24599fa3861f8ac4c3abed4c362f6734f419cc748906b5cf23695edc1da930725c5286398349e548c657c9957ddf7faa4aa780a5b9dcf04001c4199fa88a07ca6ad431979cdbf3ce302942a0324b21ff52d0c672f53a71373b3c6ab8798b3b072faf0ae06ca00c0920c094a32af629a673e9fc4d23043f6734948416bb8c324054368788d7a8276567c89f2dac249cde79365c9dab4b95627e380ec081912b224644ac8969031210bcad8c88a901921db9269c9d2c8d4c8d6c8b2645bb227646ffa73591bd9962c28cb9a9204d5eea0887649433f5905655e67dd2989c742b15b58202bc55661adb057582c2c0f6c16560b1bc5eac0eec052617f2c14360a2b859dc242b13fb60beba53f67b7b03f368a855a82d463a77ab22924d98eb5a02482b4fb76a7ead4232a4feda942d413d4212a111505b5886a446d524b504d5083a83b9504d587fa4305a2ead49dca828aa43f578fa83bb549d5adf0a249f535b1be17eb94aaeb2f0b5a5f2acffead7ed6cffaadf593f85fc64c2f706e8b6bbee6ba85d926956db65e9e7dcd06f5eddf9a4d8a6af37575fd203deeecb94dcaadfd8e6b83fa20f796f2e76f4209407ef82041d7c3d67b1ef7668ec0b443041df7b6c361bc67eb7522453e003e3cdc254aa238680e8a023d511d34455114d5eabfd51f0df6e73d8d9e41a9d02ad40abd42b15034fd799ad59f677408d40c3aa2b0151d8392418540cb5ca2e7b8a7e8a98322a71c3939729c1145d9a046f4e7a8d67df9aca88abe5814632047589753734740befe214a000cf6fa04c4b54e549ebd0ed447e9fc8c549f1c4620e8ec1b655ed90e5b9f82d49ea002c0d6a71fdeb39abd6c3699bc3c7b7e644ee0ea4f41ecfff2ccc6c4c4c579f0252622c671f481e9d3f1e1cca6fedc00655ef90a332ac3d5d569668da0ae69b4a222171a6c50e6d5a7c3d627d5a7474d008d56a40092462b2a2a32693c1394d7bd0b9d2d0c68006c7d02e23d188881d6d772df0b8ca77d87ebf54997a6e04139931c69cffcbddc9b8e0ff77676b93714dfc36fe0b7dc5b19756fa6967bcbf23cdc1b0fffe77fe5addcdb0e7ffe55ee0d766f1b8c0fc77d1001f0e1cf49752bd8472d7ca63f2fa9fa73b2aa3fc7b1eacf73aefa731468fa739dac1f8718cd8c445ca271aaff3a8e81ad23999d7514622c73897450a8fc54790e8ecacd9254d971ca6764331ad19f8f5a978f3e63d6287589c4ee5a335871e1af635e84c18f990b5f6b38e55beceb1f8e0e28f3eaf2a0ccebeee1aa1f10ee59bbcfcd93c958e8508b5c6b31f409772b56080909c572cfa4c289fb1c8def093971ff03fe0f4b148ed0f7bd0c6c0c20457952c06ad86a1ff4d87ee84fa0053444980032e1bb593db9345593aa497da46a52355a67aa75a63e4ed79354eb4cd3a4a9d629e3595c0e9daf0eff5e2e8a5c461e4d1a9787857b7319a99e264abacf0583e4ab7472722a9d9c9c9c78bc2099957574a43f3f6acacabb0c15249d78b5325892bcdccbb3f7417d3be517c5253765217908506a476e6dd95ce8cf6dbc2d1e8f942a23e5c4e3f178e4cf4dce65a660704fe1f57c506e82bc20d973e3e305836e829b97773cb2e773c30b067bc8cb44f28e9777afa053cf47b2cf2b5d4ebcd00d1924cb201974ea2de1e51d2f0f114337c1cf227fcd67059d48f679aed14dd08947feee89fcce89c773e2edf26c055e6f496ee2f1782fb28593249faf856ab7b4c056aaadd25a69afb4585a1eda2cad9636aad5a1dda1a5d2fe5a286d94564a3ba5856a7f6d97d64b7fde6e697f6d540b350509aa9d82229a429a3921f178315dec488c17ebc584c44e880d891189a1102b1233126b8a951033211624b68b9110f311fb110312d3c57631166248faf3d891d82ed614d32d79d18bf97aadef856c2aa67b110c3a79e29352b5d42d35a89e51a9d42ad54abd52b154346a963a846a4625429d52c7a8645421d432aa943aa5b2518de8cf552d754acd52a58e8272b1dc91940564ee655f7692a1f2af5c3396bc3bca505f13f194afb97ef716669b8f2d98675f53d27dfb35a51f99a794abe1ce947edcdac37095745fabe1de521aee0dc6e4de747e8697e195dc9b89f314ccb60f26b9b79c189c6078c1857b7bf1ee8d0c069d3cf1a5bd144a30fda551419cd486fedc4c6fe8cfcfb4497f8e2275d29fefa438f4e73ae993fe1c96e69042a54c521a2e510da9924b24433a43ba4407b68302c73c535faa434aa53f4fa194a92f852ad9b46704041aa5bd0b0840ee34ede872d3ce8e46dbe1a5bc1d1d06e40d3298b56594779988114e6e2797550092565454e422186a172e888208d080dc4017b908725054e422f84e3d9e4e9760070c20b3918c847c6524b9857bd3b9ed6415720af9488e917b2b726f2950b8379e3c249f9085dc1b999d7292fddb517d43c9d936f4e738fb86fedcdc4dfaf3733be9cf516c1cfaf39dfda43fd7d939f4e7b00db5996c1a760ddbb7956c19f60c7b096c4707c59983636edfd66153e9cf3794eddb50bbe702082c5d98b9dd6b80033cf059ef92cf2bd1686dcb799a02d3a71397779708986d792be3e7a5bbfe411dea6090e7c40be61def6bb8c7b9e96b3818b331809e14e54951638f62a8b4036109924c7de4d206e33cf8520fbf9c821d946b1faef2a09ff1258aaed0ace1ea38d4fac545b386eee438ee143c2f927d2671eff52928af453d2bf9b33231c15c7e701451138e3a6a32dad29f1b45e9a61563f9f6f14fc783a63d6dfff9acfe5c0d62d1f7fac4396c7d6202e22ab8e6ec33fd0fe67789731eb42515bc87c500886f5e7b65c002c170778df00b5c8842c75c85918e794f28a407f530545e57e8f5b17cfb40a9a9355b413751197f8eb4ff954b94b38ee712912a686c9e57155d27cd3a8c2df7fae4c3f5fa44faac4c4c22f0ed87ebcf04af8e39e6ae8e1d70c4bb5336de357a0da5638eabfdd09fd780f7a6b93ee2f5c88066b3d4d499404cdd0236906a818758172b68464647b8cf1d9579d5f9599fe773d273328392f98e51e773cc6bda75fcbaae5f850827e658cf3f6bed622fdf34c2ae9f7f5b84de1d27f7efe29b3fd72fac47bef7c8f7aaf138ae6188b5e6a3d6235e431de2fcff1f6a1dea8c3f06320c726a303dc7778efba9f1de69c769cee572b9a6a5cff9e6340d798f428e7be72eb5f9e6ad3a2ec7a72feee2999317a7812e6eee12797fb19bbbd690933bef7418f2ddc57073321311f7de221fc771df0d04b4cb13bf50d73aa4b0e1c4e95e3e5e75681bcbadc75d8a672f9fef6fdf25aea5be36bcf47be79c4ee6f5a76d35d714d01d875227c5fc21bea2c8bf8b9aec28bc98457ef70e459c4bcc66360c1286617886e3edb8d2c64ed73c6badd4715ca9fe4c8ca3388a9a8ba2c945760ce2848de338b2228e18b7e43851144dd3344d3eae5f2b4d93c595e5ed6317c53bbb5c14f91ef7288aec8f00705a6471c4e831ba66452aadc73164b366738e7255fa16c7477eef38eeb5e4323ef37bf7b5bdb88bc5897cb3e5298eec796b622ec31556f6dbaf4801dd435c0ccd86d0c31858fc9f0a39ff73ce55a4ebe9c41ab7a2df8fea39be3f2b74892ee731e1c4fcc220ee9cdf07db2c811d0f65104c6c46e85bfc4b248b7b484e2cf21076e8db4a1f71493e067b0337700337700337d0c56d882150e99b8f59029b8b2f76e4aeadb9c8431ad2d0257afe63e8e7fafd03f941f99ae70f7429f441b695fc7210b2cd24b16e5705b7022897b4fe423d67c55931072627590d9824e7b197f0357af172c54b6f92fc974492bdd7e8c57d5a309db74adfbc4adf2150e9a6006e95be45fc9b82aca444a3b52de7692acad8f866516c87be15e201b2db3d72b2288a2c8eabb8cf661697f6300cf58c6f4319fa97a2eac4ed145f4e0ca4917262d784d4ec6471f7de6bc1ce11f634cd99ef6b137966b5c67a49955c9bf0d725888cd4c411e24fcb17120989a614038974f59b25cd0b33e05c0ac48564503063c7c20858cc40fd4892438c169a233f2d4ba23491c5e525d65f497ee2fab9d972d5c6324986048f70b1f294048e178cc86205b442b34bc1872678778cee3877a5ae15ee465d609a1f24928c3445b4dc24c124273cb5366d648e01dcd65deb1c620c84965513bde04b0b85561214e10e52052c8aa28d9c6f318dd55a2b1c410157579638b204103e2ee10821f418a205041719aa7a3c41624cba42f33788fbed3896484a31dafcdefd66d11aa2444e9af2155240c2852754b8ecb8a04b971d5c50b0e261cc98716a64fa6d6112af76d862640b1912b45cd100abc969081b8060c2cb96ef016787966e24c3e5a9c70390236b8670b3d57483d48f148e88c1a1d7ff8ac94b847c451c93a4ec318965af72d0557663c6a40a92b4748c3cfd66c952933595025d3ab2b0e054e3108b3867eff6e5ba59b2c07c386a2ef24b94595c0ef19fb95c4ec7d2632559ba36566d803c5c82535b474a602be0d48903eacff18cafe170c07ae61b60aa2d2fe5b9db70e0eff7fd565f9db89d392f81b25e537e0d57d47fe4d885357fbdee8fa36b10ba768958dc238eb28b6c05f405c2c81086d7c33741a7032754d5100d29877e02951591a6a8440b191462e9684880008317000018080807849124064220c975e50314800e608446645e36944a83811c87611802310cc34088210018630c31c630c65859018621d1758f9e40655cf568492e53268830b4c85596ea483e2a7c0529ed05b523f8072b1b45bc3775096368c12a525c21c92916148396214ee46d21bbd7b26d45ce439ca429e4ee8ca10b31c9e4f34c840de024274c649540856fe74ad5544f8c9a039b36e6dba314c1f519bbac4ca66d3e49fb7f9e12353e6811f76a705c4aceca6371278ca7124a7cb7acd7e0468bc6657b679d0f1bc2ddcb474043f42d199f5acd8f80aa6f17008bb7c01e5acce891709088e6e0371dd577939fff3d050ffa94b78458d90404d2ae17f6f23966b21a80c59f520cf49de1816fa786162d4b271d3c9f8f72c16544bd85dfd8555b0ba27f0605951ce69d87db4a1cfb2d668a71eb3a1e82c0ab6f42cb3116c42b09cb206e381a93db44427ead706c94a65fccead8303a15d687e29921b14d5615a4e065da7853da9fee1432499d1041888b30cb7d96428b9323aff9287b5ec874903094b77af846132d44b7c1d7e413a4b1307d811824960a0dcd51b46a4ad5cf0ade66e66f863af956ff782c99568a4ba3126cfcb9d7fa70f8137277153710dd938fa4aadd19ab019495484afb6556dfdbb0cef275bd43d1f63052921dacf1f364682feff2aef6f5dad1f4d171ee5f63e30eecc856469207a5bbb6e28ea41d8831d3e98824ff5fa23afff93fdb77e030831740c3d9c3b1fdd1ae83b2c0a2f97716fe4c2004b02d0dda2868543a221725ca6bf7047c52693bc2d95413e12f406857933899e28bbf12e74791c9fc4d0599b8fb08dc6d483c1fc400db2cf2949e8afe65f7b52b48023c802c03d3694eff2642edb5dc130f8a40f73b8288f6a9061c5439cf19e573c2858d02d1b7477a2457cdacbbee7979446362ea43cb735ad4dce848afcb80ed8140da842cf3823b68cccb057ecb4757e1814098b705622f71103af66fc89005913a2927cc6e7f5086e6a9807421f9515d340b2616daf4acaa8b736985a1e34b71b041b75682615dc72e8e5e92755ecb1b1488bdf095993313e2bbbad6edf5dc26b8bebe3812eb298e89749b8530fcef01a80b4dc4468e41562fa8e28d0d07e2ba796c04c8afc3e92471e36f40eefe70ad64d1f98385a172f37f657f0e7d2b564db8806a752e3ac521c5dd846866e95cae69f02f40984a621c66c60f4963e2e1a3beccc5d5860364eed26004ad9133acce70b5267aeb627f03a659ca448f0f78d4fda94662fdff7f12fc14059f280a192182fe20ffce1d9e13bcd25f99bfb50da725a124b59f19457438c6dc8b1cc5237b16f2001f358416d007f6bcf10e09558cab7ffcf6e45a520301c0d5745adc136d0e350d7a11581f89c5e3f00a35469582427234355220e6c866c8f98afe1da885ff891e84656f0027a07d625a0ac3eb099486c5de7b1ad5578106b919f55dec7b4127c72ac6d706b7b40ad05df6a3f837eab71020227b741712ac09345bba6e8da24f4b449cc516f0830edea7945bf9f02764ed5263cc76e228c2be10fd7ee72fdcdde09db01d51adcccfdc1fcedd33dd0795ba97189afac6a51ebf0eb92437c7aa54858a26e228fde80321a8f33019f20b1904e72de5ed3456568d41bff7b990fe9e96a088be1e6e40dda589b2953247ca5ff96fa2c0540e23b0d5d9dab55e0bc09af6d04dfb87dbbe6ac1b0d4a2e6928bee1caf68ae78982d4c58ad14bca39bc6182098a1f6f28d2cf4a94e7bb2e77c5bf34e5811c69ea504549b7854cfc4c1d55294c51d24269f2597e1b9cfaaedc2c3d092dfa663fac713f68866b88c58f60e8207cd49aea0a94073b34dba34a0716868592475a8d466c6f10c2c588bbb43c748af556b02f95058adf2f4c4bbe68e84a36ee004ba916119c2d13e2c780b46343d437fc17d92cc7db2b60997bbedbfffee9241ba117379421fa0bda600965091ac5c17d623a455ab8d899c45df92e5ed676001666af20313c2db8298f076a41e4e170b423968ebfccc8b19f11bd9b241dd1ca6f4f4af2d371b700bbfe4fe110ff8ce1cf8e78d3d449f354564f33e1f36a327eac4155a1bc631019be06e0409927d20a24ac7110413fbf76a38c3dbabc3daccde6f36e9fb34cb9c1571e2ab70fcf87c12208ca6a43ad7744027f756005dbc248fabc0bfa3d491c9ca52120644db68b8ae33fc92b08804c1d9a856464548bed2d4471c1f24d8ce98c2fca0e71943ea61902ca80bf3b042717ccb29cb706559d05ba36a2b6230cc568e325e431c30b4d9d86b3c809a149f7320a8a9a5d19281b6b1266f8e0c81398a5fa95066cd3bdc68445b2cf8440ace5e4f6327d12bdfebd00bc403a4d840c239d4fd7cd852ca313871251a097e6cbd8aa1cbc3354cecd01b53a8d72842e754cc97a4260c408615d18e1835a95038c69674231fa20f25479cad5156a9244d9c8f10d1d6e72c9cf3cac3314637fb243035248a1f7525a171a2ae146c4488dd1aaa194bbc02e8e63e42d2fc29a280aa0f628fbcc81de63a40bfebc8ae2cd94e8f77075ab8f3e3023c929d1de5a1896a205cdb06dd8646c8e4b95f3d3f2a47c19fac1d8cb54b4b3b54c3eea3f8e03ef2b4cf7cc9e92afdbf0de9e90620499efeecf632bd3d68da5396cdd87c7c842a4f53eef63c071db55df5b3cab9587e8b3c1ecd9828d71566b86188c458fe1288365799360f49da1e2480cb09e0388af03a006a2ccb4e1a69891041b5b53199858e8d412baa6ab4310b6004ecb88b7bda8c41c3984f647227e5afcae463805af362e41ee38cee0e5d527cf5514502656f0ae112ada505c1834894e516e35ac046bd49060d86e6597f24a87efb1d4e3e0d31e9462cbccb62613cda374c274529f284b6960d81173064b9c63159aaeaa4d26f861742d3191f6da6e8b0a9cd48c59194b34c41379590b4a60b9822310b76e607becc43b8e63b72a510805952acd495cbb32c0dfb0c64f6a39d7432a55c6d1f87979080c3819a19b4eafeac58ac0c05959ee6fdb927c959bdd34dc7ae24973d0f792208fe3691037f4aa96be244de4e227c7646a57eb24e592e838eddc5a351ee779cc5dc39230cf48d84d216cfd5c54a8c27583a45b328c875645b325f3054c018f50f21dac4412053e4271be85943ab62cd10fb5157b718743ca122986efcb6b29a4407af8acf5eb042b5e01aacfbca5bff0b50a02c9fc1906f29fa4b5f880ec0b2ad4e5126ee4a691fa4a81ff393a3759df6e35aa2e9218d2c99733332acdc37d36d08a499b793258b60345c365180681df9cbf4006930734cb9e2e304ebfdb1f1b1d63680584cfbdc0b1fbd2b46d2ad8813be33a813d2c5e699d78ca498aef524f632c43b93b4da854845cbb2de09fab895a8b91a340eb5cfa1c572a18e8efa54a87a877c4acabf2d993c4b621ac83c44388a7c42977ea17b2cc4aa4dc2182213ec8fea9ec801311e6d6391264f553923a2f9e4cf3d766c12da169f5f56377cfc7f80fc8bc2164304dad7d78c479504174f2b5d66ab919a89c99afa1486c33baafe5d7385eb959bc40d9c8fdc4f94c61a26ccbbaded593ec2839becd4bb76717a407f711ce946e75247a6be5e569b79fa05039b050a8b0cee5f7a8b71ac5260a63fc35f38382bb6767af66021020a935568573ad197afe9c5c9994fc42a17bd11efa1e34073c96a4f2e087b79c93c8884a508276d92777af5b39f2d01b6d2c496949a83e92c80b09554d3c4767f1a2901f0b7052608737a950c3fc0058e4262e9c57e8b5c12656cfb5ae7b784b89a25378dd8c300c240c8055f3041a7a1e3de6364a8982f569b1b50cdb582f3f4be47af2ec44a582b5983b8763d2ceb62f035eeb0adc4722d73ea07061911f023b12541dc8f2c4de5ed7732afbbfce0390e51f8b1de85cea6df0e21f8d1e0a5d3d37b52ef8658e6b6446b613508dd54d656b7a3230e83a58439650671cb8faacc0516bb862aa503e3c9aa347d2dd70ecc2a06651a43c56adbd724f0a1a9f8392cefebeb260625a15ed81247a97f100f966be7121565c1ee938c9ac4e19fdf4cabbd217014658daf77686bf98111eb046ad2159783eb323e5956d96fd3071ca522127e98edb6e52ece278bd6c9d3432300ee24f811c4324074ad91a6b244355355d14846b59cb24cc8552f2be1b4453c87488f2d6e72ca527bd09f8ef2ce72b6d504943b2c07473b2a55a69cb2aecdac7760344e5b074f15a35488e72ba72caa8e1da01b989d59613b4255f33868c834352fa2d170e61a5e085db96035a46770e83249a343963ac2c238b2c9f5a45374f3301075d8d5fc448a96ccc83d0df7ec9ea1e560cf3f2c0cf57b9d31a81228a631035ca71e99c8190b01d574ff47c00af9da5e0d9b370405dc0a96a91f0488ca106c882b388bc3353968aedcf999ab5d849cb1b395c5a4842d1c648a951b7dc1047c1e08169d98e0d857a1bbcc0cf7424b60b09ed4690908574d8301cd4c2db902aca1191421fd5d1f51a16fc5ecff5089cc5c2d6c81bc7c004d24a544e916ac4fa5abc9794c22920c619b0afb96d67ea10b588b71c97ad954499b9a2666d959700549843b0d6cb14bd4b7385584e10d0841234a8b82d2524401169a026e02f7c41cb027726c84fa3c28c83d23253aabc674c9eb0981199bba54c600493c065b9218d4bb7e59fe4a9e67c24ac6b080ebecdd74a92fa72774c5e982f4cf94080b38ec312d1d6846d872ddd2735e3edf29a9a2ec1420386c4cd906a10efb4624ffbd55d6fa7da09c56d6b8f1758a9c273bac3042cb8e4e2457592171fef827888241f60940add95d7570ffd7b24dedeccf08155c69fd72d97a4faf11471e9a33ef96dac06a9732895597cd49e10bbecfe446a0deb159ec1cb86c4c28cec0dfffcd68ae0242d514baa625883fd84231a966a3224d87d9affef31997f4cb5298ce0c42885755d5e27614c71c49495f0186c57ee83bc8cd7d9ebfade5c6ede905297dd9395236a3a1cfe18aec6669cc9543800e0c5215ec6ac83b7b55a8e4198314d596954a7c58c7dcbc06c0967a70d99e00bf1677a30ec831f6249850f7d297567055a0f3f1c75edd4f36a371ab1733421637220fd4b5a900446a99d0d4f8bd11e7acd505ba1049b61fc0cc561295dc31f22df935184939aea7e457b7b5b5669120e4d116f00dd3fd28e895cb9d7b32155fb1802a366e8c9197e2ba32a89cad5373757ff257313eb7bbcd623b17c3388129753b23d9fc1a29115a1bd9f05dd2001048059df43107829b38ec28913c55fce84788a61c31205ed31eaed281cccd0898ab6eddb8e86e9aeb71d8f861ef88f3b23e88fadf60ac1029fe90834ae5d8ae7f0c58fca4c614381b60f62df7a9827e98e892449efbb66a78ad72ed1d8653d267553c6d16d4e1796300e6542c50b3392217f36137ab73b86334707b7d0503987df54fea2b54dc433f638baf0c5db263997580fedcec5592b24579865df8ae4f348f9c4880999dea0330807ea110087d20afff9150ba5005987937e2a471f49b5544a7f06e369bd49da9d4e4fba0285e534f93b24b9d79dedc8655ae18bb27a51ed22574861cfe14ce7a601ccc862b0c937e2e28d905c675f5c072c12a0bf51b09c8f9b457d2809a5f1c75ea7ac252d3a676a7fb0344f7127a9a94ddd1a167e636ace60ad97953f6105d426666218ef08417c5c1343ce218f9ff8ace5e60bcab0df00b42010e51e75f04a4c0737f6d9b86b4e9639b3b0be261e20d75d06c0586c40c0635c97ac1d9b79bfb36cceda1a3063a3577891427578d772b34e26ca1219ba998173c594341d6ef6d7ac60c0bbaa2ce526d6a8a32ca0c3597a8d5298c13cec101329ed64770aeb35d82e855072ab5dcbe66813868ae906ca590cce0fc0c5d3b9152685d657066552d9645a290582af79c3bc7d1e6c8425d496ca5bf8f67ed5040f94b41a17f95b68cae12c0b2f4e7002334b9d333acaa32b7a174ae35ccc214c3732c4a618e5b06ac4ee22bc95a6158cff4864806ed004b006cae19167ff31efa39658357031d5263da8770347e1312f7346f97aac2e1774bb82021aae26d77e28c216af6364e840ce61fefa6631af550238d2c75b40b8f1ff752fc8f080ef35f1fa4ca30a039586dffc7b34b4c7016b736ec6509431a0c10c3b339f09bdb3f55e077b5624b3fe8d11a1cb64094845c70c6c7b9c392e1e713a43c3c587d29382f570564156f7de1428be965baecad2698ee1d9cebd98d4010376060f4024129c9dc826fe03982f38b14a3ad55357f21ac4f66bf67263f7f17c082b0bc661d0fc3c51dc5742f35eb788237c1d99e9e3f7a337bb8c02138fbd96c62e4d1dbe604c179fb06c69159a10568d711ca09b8656cdd641f700c08119194ee3536da0567dcf21309cef55108a647494c087d99d9e7a98125c186ffb21be268029356d714de3e5b70aeea1de6d9440abac8076a2bfe94edf8646a6f8632e67933fc8c4425a811ceed16c022de298f9cd1631794326eb15f069966a9a8b27e378848525ec513c32613f0b6407d08ceb65ad570efb9df2433f2e0897dcb6b7cd18f1ccba4e2659f37843c660140e0ec389aad7f46ef43dde1997878eefef75bb260378f57f85f8112d7519ff52b36f0ac3407eca7e3b6b1ee0589617f64a5c7e39e905162c8cb011e48dbc6b79631a7c49d21065de1114ff69c15e47077ecb9270d9660bb8f063205d4ddc70d9c661c8d0f90cdbaac2dc88295559dbcc711dc43ff4ba32705992becd6120ed988db96b62a1d1c972449f360b9cbdd84bced2d95e44d2d041e5f8c5332ea3536591db78285181ca0ab07b1999e2559c1c2661149dca9d0e36fbcb7df8836ff570699a935d92afe9fa00ea527b2bce6c28fc1c4ba967934d16c0f1fd92a1b72aa45c6073124b7d8b357d6b01b9fc22d3ac74486aa59f143a2836123843ac93bf3e7ba7ae56f6477dd2c1b2fb2766749acb6b069f6dbed43c0d254a2d8438d9f72c0f379fb0a94b392d8fe5da415d797ebbb04b39db3edcdfe5b50a1c747b06705d7f95b0089c11dc7428c581bfc252665b6c02e5ea5bec76003527329b008ae7a08b415f04be29d85032191131454d4a8e755ec9a14797bf6962419942033a5a305eaa8beac51dd41a596d1891324a39196305b17e172e7cb81ae98c3f28dfbb45953efe044bb9cb57759907b6703e9adb209abbe3c3cce1fa3e02ca6a9e6d7be88e3f7e077363a34bfd4a4bdedfd6e6ed21d4692dedad371606f7322635fa5d9fd0bd1cbaa07fca13d91d88a2e3c4f72f28ae10642db9ceda2c5aefe8618127eac5883f994bd5752886056485c4d19df41747a171874319e0c2dff04ff046f73ab45b5f4c08988985cd3b6ba3eaaa3343cdb7b7b640b2f47b564d4f9701d20d94d3c0ded50163d3bc4c940d5cd4bf8c63f35c43302433bf7b059b5c8d137611a90ff517771df7eedb12f57dbc4df028d6b73d300e9aecb05645c9b7395f05006a966cab9766c07effe74df4407185cf8f360d8392e31cfceb279f6b563d3459c7c2df617cfba99f1a944eb4e20aabccd5c91b7cab899381ea4d21cc549d3eb93183187b64c22a72d1a81825faf4cebafc2f00fad28782faa20208b3978dd145c098209741d3d29f6937ee638f7c08cbd7ff2db62cd6b7442de25fa88d41028a84fc356cef3724df099887520d58a6ad272715c0aeb914e98bf30219c94b3a5f41d417a2a54b60c0b50aba31a5717651fef67e483939cfa1058f96dcc05a6b505145940b70c48c934fc81806dcffc02fdfd1da77767f52304491003a77fe422e424ebcad3ace8421328ffac7eab454ff81ae6d2dc53f7db4fef06fe96b09815261292fa2dc15eaaa397d084e3bffe30e01202e3854508ec5f36d6e98802979a462e87848a1c8ae97670a10b00cc3eee2a7d4e7bad56cdeeecff5d9f14bcaebff84d70fa084de43731806fdb20675a581d09b0c2692d371f0ee75fa89f3fa8b1a6451b0dbab019e6bed88a8ca4a28173976d61c1e37e11073380449a94eb4a719328dc74b42e1c93c9fc1c0d7319f48d7cd41753fa04f56a68ca6467fea5108e0cb1dea11ade5d93cfe7de95dc5488f05ccfd213ce446a6832938d42c40a0ec94110c081c83532cc6e45524182df9f08f414fd38317c332e17033b9d6340c95ddf0dabf460256d69cc78c9f37102aa6326cb9091fb3d31654056b3268b72a937d5ec28c1c82ffaad440183aab19ac66929e58b9bd1076b82e00e0acff4a99229c1a6122220b8cf1d49cfab2ef257558f141afa8ef808047029834fff894355d97d1e701229b5d4ee35b325a70a38e1961cc9e922a5df17d45c21cb181b34b4aff7d147570c111407b8623ab4622fb05fdd15462471af126fa55d913c5e1b3f5736c07a6697d8f785d87085630c731059bacfcbdd8d678daf6473a881988795445a1c24994b662c755196ab35ea75c721b55f60ba01114c0497d78192ce2155bd614a8c6d4df4624b5f2e41d5c76430fef8b8cad2a2560c2d4aaac100b19964775639b195d98416a02385f3042a7e909f69700273baf37445ac2623cd99dc4df70cbc39b3a3cfc0219dab346fc39b119f3576e460f5b23109f791e407de240c80dde6d37b83515e4faf265faf3af099b987b55c116baf4a284497b2b60ccc1190f2637330cd631293f45e89131711ef6a045d412018f23f0252c3535f3db7a353808af4506c6899b3960a00448a97d6d7e4ee57879f99fb5acd1d64e74d79827409c7c041df86f35e7806a3f1a520e49fea326901f15c1dc0225865a1ff4600723ee957de1e1d571b783a2bf65bea8e3559719057bd4c8f26aba13af6b3b9b5d55c4156df4a28449792ed34fc199cf14173309b671a20f15f90d31711cfd504a082451efa370290e7935e656e511d0269761ec552429ea5749d1192174e83a7beb8d5a6fa92fb92e1e6c770824925ed396ed134821f72bd59970c476bd7dd23144328d92e904a85643ab683767385649a87d9ff6416ef3fa6b0c08690c40b956fdf45368a5fad4dc7e3071e3c139efe282274e0c7838a16da3240ce3c9d04d4f95cec758a9de301d2e1d89a1b2752cb751c5a82d1c2c8ebc9ecffc95921f336f17c0cfb50e9a4f048b903d22fd64193d599d3bbcd643e838d72cd6af0055d7db8946c22235e4298d8dc38ff8d4f811840ea06d10cd9789308546ab5554319ce21c3a6a3857c82dee1e5dd30b48c64d8fee9baf1e9914834e4bf38f871e88e0e699e1f9202fc67828267546a1e55badfcb33da2cda971b0c1fe053487f87daa15f0ea268241aae9f03540d109a5ee772aedf4893c15f8b2caca08c460d2e7994d724d11a631442a4d1da92ed995da6273515fcfec27d388e2a62a92a52f26ab5cd88af9bef1a87811619f671270e82a572a45ece4d8ad21052ec4a112521c4d052bf740ad64d7b335c47c5cde3753400cf42f44f2f1b7ac52452b6a57293b82cc21a0b90349684eb40d70936f9813503bca3e40c35526b74f493537340d4024b472c2029fc22ec7c537c7fa0557e66693b39408dac1eb972e2c9418e73d6821fb5d6ea8fae3a41dc23144bf21c2c0f4979043ff09b64d59288e06dda237c037f446af4f6df07169405ba06e530cf8af4a975a3701814f8da05fdfb9044a749e08cebdd7847fe02a043d8698c8e3bdd6b45e6f4be1c056215c9d6754100b82ebdc49ab3ced282e5290c2599b3b88e0fb1d82513f8a7cfd1302b3040983914d004db4eb9400dd19226843e040e5160d41f0b650c6d66ec6bfb21657d52db97a4a072ca2a39d4fe2f19d7e54591622e80a434337739ec8822e589ff63c432b16b66690628db9523b51ecaf79506a912e3bf10600e1e063a98131fefc4995d450f07732216b55521419ab66d634de5e642e835b0726019886b09bf45edc3bd09f3f511d3fb50e0ee3316c9d052ce99efbb94252b5ddaf4d1f2d2eb6322906f4be891f5e06bcb709df30c267e559ad72c58b98d38c7a9894de601d5dbf2dd57575b887eb92a3b129aa439def8e11fd66eb0e279c700c056c410d8753983bc0983ae9c35e76e5aee3fae04010ef0e744460f241d642a17e0786552bb266d689d94bd01d7c59cafed4d4d0bcfcb57f9f367c77173c258f540f473b4cccf298c7e4ef4678e4c886f2939442af3336254acc2902884cd5c748ae54d1a2fb450d472d06a00ff57af444373242a7162b694bf56a57d6a1e9cf20a3308d903f215fc09a4a10d7635428cae27521ab880e22475704e961bff9700170fcc1bfda3e63024014e2559df23f729cac9b481a7d16a1ecd04d8370df979337a8eaba8ec296522a7aff6837d9bf61ec0ed43a50203832286ca91c5e2eab1a2dcf5b354386502f07d2d580799305a02ac9ec58c91527b3c8f7eedbc98cf770f51add31ea34c4a823ab3cc6457d420ede21547d13f7d2860aa16122299741c9f36de441d138556d0dae83eef445319bc8928bb885356e27adfa2adb9eb38b0fdbc16f360db97fa33b1c51bff40971465deceea723c414ea07896d3ac42a2c68da5859d413d7f0ffd17a53f37593f3464dde618eaa1a489c6513a2a9727ce10d9fe87466d6c345f3f349022ca1aef0764efc6c65da668a47e99682f396aa6c144639c3a3c7ca967fbe792363723fd43f6f1ce8127c3b26cee2b040eb2d6364ab71e7bb1af4143c8bc454b66f2eeb0b3a142def02baac68869c3287e0f271128cced18ebc1f2b7c54aedefa086cd5ae0139e27827310fa3c99a28207f75b5ad3d323da3037d0651fa3ff5aa4b6a16ab50b8835fc64594308bf1a1688351a4e3c34ccd57f93d508ede0891ca307b1067385652e18b1e139b68ea13aaf0d10e458ac3178dfc4ace174c1632833e01daa6e833e3ec917651974ff5d1be81910a9e96a73570fc51c075b1c2eb8e7bf7cd2a2fb42d80c53ffb68d367b3e2af9254b6afb8e1e6a5930488cc8592979ffd63df8f7133612e420a8bab704d8e903583b80826e9317299fe9d3cfafda9a9c44e6251f6a7662c7eac2ba2bb0dfecd0722f7c0aecdb4b8df27f082ef5d28332e55e168943cf016847da6a26c647bace4f5727f71a21a65de3f395d2266c1ba2d109219b93d2ca5ee22df92047bc9b82ed3585dc1aceb8a45d12d9e31d9666dce0d3d3d4639507c92272ef5e7e6e2b242ae59c84c8e1e066c20e08a4ad9ffbdae2377075ea5c9fb8b9a642759e983abb1cb9246821ce6e785c12b82426f9c0c52cbdd815e394b98b5dbd74d1b2d898b4d6b5fae383b1abcea5ed2853d5d7c0d3e8a0d061a507851a96d42ce4129fd97e0835a1ea22655fc07b0d69f0d71323ecf316bb673915914422500f9ca730e9d7fc50d15e7ff5abad842911b6a481682dd8761e05f1fa5a48fe51a8788f0171149d1554d1e5afa4345282e3fe0a1d86aed24bf0628c82ab0abffe1998b08befceb69773d57b54f54b41e7fe7e664d9a6b680a0f164062dadb3bfd92ca3a5af62bd3e8d340439a878f473a342148ec1f1d3198edb0b76a7ea907eb3919f642205e18175ff20aa04990093accd5316903a6313c9490526600cbcd68066924a9b3770d9a1831f251181824966a0d4406af57aa2dcf4481770c197d1bd88654e81f6718b01c155a46846c74577f1e8c3ad197932052ce92732f6204231d78da6a4cfe7aba40092ec5b2ada6175e641b3f5cd76c38ff6f1fed8259f2668e372595453c98ea17b4fc53cb15818675dda5f1f87c0fc9c2433dc931704dda6ac106a5c531ae9d52a6d6b8b02be97bc188d96f871349fd9357758d5b1d7cf8ff95d2de20c7538b2b010d2b5d534a9b32d4fa5bc7495d5be2244e3931b71b0602357c81b747e238fb3ab5350407bde17c2c364760f8fc58516cd56566f90bfcde3b6b1bb93e7ee30593fed726412bcda51d47690df8af7ddca3919492dee5c6a34a25f8517efac9587c3bf7cec61ddf8cc18eaa168c954146f0e3a401020bc75c2a8f4a88b023e1e524149ea531278d297c3427b20f7ebec467d1711e282d117dab500338cc68431934160afc67440330d85a691d969107802020eea80c18b931eec858b20beeb09fdf78b11db45439d058d64d9a67fbf0efda553c631e7a80e0d42588efc01fa9d3367c14265f7419c49293f743272bd70734ff5e2039b49d7a38f5c73fe7a08c431915ed5418324debd5ff2ab2262747ca7ad1d5004b7b6e3223c68ee5d85cba7065e6815acd627599b9d17cf2351ea25dc49cbae87fe18b780a029ddb2fb686d26f1c01d70c0830dc4d493a45fc42cba4beb5a22e1f428870112477a7e163189c32fde5067068084470f612f24e573fe85dd451258f522572fd3fedd7e0fbc776572193cc5ad8cb948b0eb55711ddb3c4475a1f4d3c55e54a02df8a63eb9c76758fa23b29f63d1763cd565b781b5a700c3f029b8ca768f74a84fa8d8fd2e70c0d01e63fa7d5388a0d11ce6cd1aac6229a39aca29e74b354ee51ea5d0bca91fdb7ca12bd07c0605617808ab616148da97071ecbdcabaa8fe0498bfcb4c41244067e8feecd1a0dc2b427fbc97fd9af8da45a187a13a712b75772a730189f49313be5a68524154fcab2cb9b30bdea7f5cacf2e66f007d3f79524ce279153403aa49832fb27e195f543c26d44b2298f571880144aebf40f32921f0ce25921b978d8e8a77be6f477dd3d1738d0b2238298bf6d8bd7bb278d26a5fdb5f35056b803a1c842003ce48e690422cb5a60b42f59d6f42d60a0762cb34c809ee65e54be92494bd41880dc4788a13446cbda260008d1294724ca80b7044244e4a1951122a5e33243314446b35863b4acae469910aff0cce1fd80929695de18c0721c3396db537d83a92561c9f2d10205cce9b4ac4f68afee3b2fd6f5041fc64afa389914ba4cab31e56578df528c279e80f05ba586a9c2ac65820bac3e28d5046eb58398f5def42de3feb2cc54496e2766b3c5fd3a9cc513c5ac6cfc5f25a647d4acd59d05f5127e913f3cebd32032d7b294d2a8288338fca365cd4c53a0177e07c75cadaf664d62ea0c67b8d79ad559f640fc2fa0a217fca6cf1ace8124159e10f00b045813a5af03df624f642abd66a538e71585f585520790c05d62b6a958b02390dc6141a93ea25e0dc974f489996c56bfaef18cd105675a0a704ea15f026b2a63b0aba1cdba8cf86e15e92e534796b63e99a2a520c8daac89cdb1cdba52d312c125c756dd115e7f3f73d768ee08c4ee6b9bb5eee190d59f92106b6973b3e6b3c3ce3eeeab11dfca6ed6724ff77aa779f42b64450e629f6279492e3de70a5ad19ac53e01eb80079ee3dfa643e7788d2f9abbf6dd7317c0389c4febe87b6c62409e31547f0c46cdfde7974e4f60e3d5d3a6d9998d6ecf91b284bcf94ef0cd1f2d3c516c5a59b51cf9877d611064266c135d4e31065f6fc02d0bd5719672640e44ce927a0e17b614414acc952072b9a88203316f0742f02d0da433590b281fd24b23e6f3463811ffa2c579207aff5b8f28f569c70bd24e2ab33e9d8f60e790597d4af7e68d5e8a5e0a5b49e8a9a970dfaecbf12160d50826a8026c021d041d322f2a4487540657c66ec6561fc45e604c8da6dbd410d4662a2af184d2dd56cdb31033a669301d9d5b5bfc4c03143bf3889ccae6df9ede544f110192efbc415fbbfc86cf9766a63e1f3a3b3bd4e36edc64dfad7eeaac44fce8d4f6278c8fa983aef9111865eaf7c7187b9b06f52db3e606ad7f9549276f9e1844aad68a8029932bd7f8b8ca057de29f28df8a99e6b27933d775580f23b6cdfba57366b2103069c56ed6c1daf301ce1eb7d962ff0f696e75acc61cf94b0ae6a77233c9d69b1a2b698284a5d384afc0a99b2bdfc0b84fe349e6824dd0c9c4da058839a589499bc97282ab409df0eef02d2e9531c1e74b6bb6a3a1140aace0eaf188b5ef690e8a6fc1c6aa84f25ee811121b82429ba02c61ceb68e3ffcf861d465ce248c69203d4d82eaff80d03f0346f4cd3f9446faa20c4f33831ff16ac72a93c641a419c64decb30810b0dc3f3080d2f90154b9b5bff663b4bb4c6bfa888f1abb6afe932f3496c5bb8e36f51e6ceace773b0329318cfbab3827fe86392616593d556b7f2bc4574d3c33e2a7adc1993a1aa33b379b16cc273292a21ae55acfa3835484edc159adb1ae247d3dba5b74b7246f88680854e202aaf755655c30165aa5035ad50d5ac0a4af1c465dfea8daffc38591dc620d6cf8e76aecd8cfc058717789abdfdc5a9554800cd7b6d79acf7bdcaf007026fda845ecf313b068c73698a1f2bdcc1628ef05609aa17ea39584ecbdf796524a295392013606250676063b6af5c94016b82d5bcb63ad0bd6eab0b6c7da1dd6fa58fbd3c24e3679b8c9b950f3db6899a3ebc99a84ae0750eeefce4be9e038182ae5aa0b1cf6d70f6353f62f434ed7636f8e1dfeef60d8a270e243de7c7e5ee001438f0320a0eba17ddfc3e1ede7051e9283a107e50e8080ae4702b2cfe40e0e9437468eb0df713539da649c7ce312c5d1c8740270bf2a02c7e5c6aa2254df794584a87e5379a064757fca6ba5b8a442de521e902053e010a7250d1538b49937b2f540d9f9805d0ab97a40627096dbd84adf33fdc206488f9537cfc77fb8e937407aab3140099ff7248c00009b01d4d4a43297400db6b8a96cd7a37fc7393a2f9ea103ae6c2977b52d5f4ce5cbfb55fa653711c614ec9156b17537f1bcba99c3e6d25cbacdc9c1695d463c7735972df0cb6f5746a9fba6edc8cc9b7f3dfbd117d772084559f63522e3f537ca51a15dae7b2918c1edcaa10f659ebf5cc8886b81c3ee12769798236669c459f2a550bbac607f5924841b24652fc7256e00cb9baadfc6410934818043592d0cf3b7f799bf7dd141a0dc9b17f6f710cff75ba171d8df91967eed5658261b6589036d64b7d36b6bb1df4cae7b9f5eb79046e96fd3d299c426937da10c45a83e63e223fbb00d7088e77c0993659efc8c49cefe2af19be9b72833a2733a6759c644f5f331ccca6ff04f4f87b326f73b9235e7fc7bed776f3ff5f581729665d95592a953a6cd690e4b796edc73df8502873753ff15f794fb68f7b791e7b282c25632c77d0cdc73dc03994b70dc5caa4e1fc3709de6db955fb85a751ff785e0fd5ae5772f3fc579e1ad216b7fbdf046bedc77de7490d3761c286bde1099b36f2ed138ea5f6f475afa59a0866ef1fa38e3c5bcad6810c1ce340fcaa1733a77fbabde64efb973773a1c6e2e70ff0c71b2bc1c8cd354dae65ca1733ad3190b5799732a734f7ff63efdd90794332f9c977a40790ef16cbf151a87fc1d596d9c0b4a238d300ec6b97d8cb46e91c619638c51feb66d5bf470b49777d32ad5b22fae629441e78b40b9729101124600808d1a32312b1a3364c0c480f18255a98edbb4ecda4aa7f45e2202b72db2b2b2b29272b22aa2bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb7b85a4bbbba3d8a2cf39639c33cebb74efbd59467d3ad76fc641cf3732fdfec221326a73c96a772edd4be712b4563a95e61274c9c1a65fb3c9d530a59558638d754a2bb34a2d6a9555a416555a91562a9d5f7d4eadb51facac601928910e910e914e121d984e121d221d22239452a79261b57eb413e660b495ce1e289d43f3357ba074c226cc2910b02d52905479014a08ca9523942d4f5baae408654bd39627b624dd0e70b199456c0bd2e450d01b0b6825a233aa148854125b6177cb6b0b087086b4c5f564ab6869c2820a26b4c4b4c040cb0bb434c15a946881e5e90313ac25e8254b148c293184402507597c806fd0a54123cb144c650559a25011ca9294e5284b5116a26a65c6b2e8b0eab68c804998598266f03f453d3df59395f954057b73067faba7a6a7d813d2bc22c8075e3c1df1a4e409f61484250acb1316272c566059ba589a6031eaeb8214604e6019c2585e36b0b8ae68b962a5872956ca5cd290564645e095d7952015666cc1d11f95fb866dc5032e9a3cfbf37896d91ff4580a82b23fcc07b213414d8172ca2107d5942314a8584eca110a1413285027c85a8e50a08872dfc814d84023e40d998e17de30e5943df017657380fba3b4f4d26b69a6d55ab36ddbb65a336da3d756207091f33807a56c5a4691c03d54af2c5d295644150d11f59010d71d52830d317b7b33aea3cf554a29b76d1ba5cf755b66af8f21cef257a5accccdab81a32fcc5d4f08161cf6d0100c6608e3fb3e2efd1722574fd97663c8f47eccbe1a1cf421426c3cad54ad0979ec8ee2a07f2ff56ba9876044d1d2ad7bfbbb7da1e7ede36398ed7ed4386f86ce5a0fbff9186b72ea43b08b35d226d37ebc456b7a08047358f3859fc31a99bf8f0bee36ac5f5e60981638eca55ef256db58752b81a0939393d3cb56f14a75a6848ba02f86bc80eabf760a79adbc564a79efbdf727cebdf77ea17dfb5d25955352a27689a383e3dff77e3a9ce5bf34add31860ce6722484120597e04298d61e619e913d9ac7d70e646761c07fda3df449de8fe336e63044309430466b29c9e00ba812c9f7a4dcdce0e094e78225959f2e2c88a0c29529c46d802c6e5888bd0e7057fef74ff98a5acb2d69fee3b4ea9941fd7f1c3a9418931c8c148698c34d2ee26b99f1ee5fec221d25ff54573a0542828074afdf54a41094aa0c4d631c621293189bbfcf324940bafe2593815cfc2ab78150f224eccc5e8d1a3475963a3e3d97f9331d22c94fd0b65885ce477c3c1f620aa112967a553ca1f78c07d23f21063bcfe4d07dd05b19bfa0a357105b781e21584a61811e0e9e08e2dba923fd597afd68709b96c6ff6aea274d3b8d760bc461f675ff8956e4f3b1ffaa9dfdc57366e84e171f677e48b17f30dbb49e84bb9934257ca5b4d6d489d73e44e3a27e6cdfd29a7aa0870e74ad79dfcf61be5b8bf5f2803e74e6678323ceb4e1a0775ef9fdeeea48fdc89d26b5030cda77c6951bed686f66354d1522a18f345fb2aed7c66957965eba99bf7d3e3a38399bcf75eae4ba9f00b8cae078c97a982cafd37e585f32953dbd1f9d4b42877f585b92f04baf34a4dde5879f3f22663939165166f644496fcede3bc31478693af6c09d8f2f6cd2b8d83ae6eddb82e2539d5e4f00b8cae478c2f5ee936b29c57669579a5ce278e698b334188094971244551aec97189289e721204705c220aa7fc392ec14425bb2655cf7961e790fb97fa1dd439f6eb10bff7e7f729fb859dddcea7d6bf3d75f5e2d9c0f537dbf55459b39cf2c29909658a83e8cba4bcf5788c0e58fb42a01be30b1997b3b761d32e015bcebe46927938b9dc481a47ccf4b3ae87fa5b22f1630c9f98e3dd7c464a07e5e570ad02cb7881e7ac745e6165bec03dd064b8e0f9f2278daf7dda7bf7c28d59d3b2ec7e1537163573c659f3a30ba60838bc795e0efb0d70b42fd841ae736ee42eee2bf6ae6cd713636e19654cc1087ebfd7d64f52f1d4060cbef31d802394a426775e6e7edbcf3efa82fd7b3ff6b59ffcd956ecb6ba5c2e827b99ac01403c9cfdb69583dbc338b8d5a71fc2e4ed756c2d9f78c35bd96fdbd7784bfbed6dbce5f33d369dbc6ddbdfedb96d66fb2c10997c8b1d76e0c1872243433dc0b4df5659f892c3981c252bcee9bff5bba7faac9b1cd4bc49cce1af7d23792bfb9a4a11fc2f73e28f1963fcd3a3f3f1fc5ae9e37edc30eda5f6421cd4b4df714de3fe65071cd6646d9b53fbad230f98fbcd2badb4d24a3d4bfaf167f6af9d228df62f3ee0ecfdc31aa7bbbdf4686895174eeddba3a17353d6de7ae190ce6b260e6acf7961a492b5e7a8e0b09d74985e1fb59183dac7f800d6be9d348aa36ca7ac7d8db7344d7b1b4dc92b6b9aa665ed5b48fb09f8cde4d1e20cb216a1642d4691b52ab2f65183ca1a1728214dd3b4ee0befd566b4cf02feea74303404ebe1fe16e331ec222f0f43caefe5230ccf06209e9797efe5a5d7df8b37e7bf783586200ededfd18103c3096bffb203be5913eee517e22bd8fe86df7a29fc7556bdf5ba8faa6b8da8be6ed23ee05fad42a7d97efdc203e65ef5f6b1cd9e7a3474ca3372bf7a3474eebcb08df27dce0bb3cdb3c1c1fb1a478507f9fe7de9b5cbc1fb9917e308bedf47f7defb5388b7eadf08e594efbdf76dfc66f2dcf701c45bfe37265f2f5f56be1f439d7c97f2dd42e5be387141d8e21637d5b5dd376fdbea716c18066f1ee65248a9f00b8c183032522cfc0223068c8c1934300823068c8c1934563135f972383a516905c210617e1c44e1c2689a0c4d9ba16934346da569319a26a3693526101f0b583de8e365013035336ec349d8521e10793382112e95b2a919dc4effa7406fd588a03f107913e52acbdd8ad16915636c0d1b00188184f7bea689b1e38d00a84878ef2b61c6841354a9f7be12664c38a1eb8142aaf3be12664c380105ae763c58dd8abb1f2e61c6841350005929d44fe7572b1c7ac227ef8c1164a510801b342ae0d871b01f5bef66b04113729c29e1068d0a386a04b0c2833352fe4cf61bd8f564d6da40a1ebb152aeecc5297012df96f5689a5301478d0028b742e50660399bae0750be915b6e28c82aa7c0e105008d0a383899950d015a373805c891d3f5805981c60c95ca86ab99187304e8529d4fcdf5bb05c891a36300165ad8f907738d0dd7a572e4e81880851676b2dc705e06000393a36300165ad8c93c0558e101c890a16300165ad8c93c2ee4e855930ae770e05f0ebc91e7ccca6d260d1a1c0b2dec641e1774f4f45310671b9f57dec24ee6714147cf8eaec7cac15f11c1e6e06acdb5f2d4ea42ad3a6aeda93531d70f520179436b24ab3ef57024abbead61ed84f94dccabfe2c6282e42d9aebcf256fc5274251e18ce24a4439e4e851088e72b8aa4f42f0aaf5672cd7c994ebdb76a55a25925c83c821978372d85272adf5697857b27c3edd5cd82970822dce6c3149b85fdbbe225227e4d865996a2686096cbfbefc50f5f76be44deaefedfede7b19305ff5b16380ab3c234770db77deccb4abcd948f1d0733957cef6fd98720e837d993cbe522c273bf46c75b31df7cffc7c72936f932416df9462db33193791e9f84a017895e27d435c208941e459afb02cac4647dd0ea83561b0476ddbcb35a4e2510a7c6efca25cb5afc12438a686316b8061becbbfcfe7790d5f2c88b28fd317aa1063838384a70d846b8febd18af5646f407e91287e21835134e1ba586805db66c295527982a11c41c92625155441cf6e492ac36e24c41aa10390d09654be91b7925188131c55be0b08d421c8af32f3bc80d9cecba4532314a69adb5f6c82821a304be55b26c0993308f792c2aaa8dda48ca2841bda04260336c49e214248817386c1893924dbc11c7d594ae53d629535f28496962c147e6c442e7d03a651019659451468ff4c96d9db64e23d8a313ed25cf766030793d67628a526030180c06c284c061c372146f5179d365300db6c138d885759feca2e44e741152127620d3973904c23f6855119992e2ee430137c8fea1a6b4b3730587f71e799efbee3537d583b9236fb0adb70a0ee353ee1c7963ab92f4bc71ecd4ec4425f04e400ae1303e09e172cc25a3c81667c2de0109d92edb65bbadd4565a042c7fbaf5ead4a7ac74563a8980a5bbfbe4e24e7dba743a259d320abb539f2ebd167947c96ca5b3d2a93a02e7de28c447fd91ac14979863755b49ca6692dd94d94a6da55dc427d927e6b861a3a5aac011808dceb624e9bd88c3dd0ba45f9d233f07c41c8ce0e7febc70d8af259b2852963ad5109d232b9d2929553cd02955510ce91c99e1d4a4806da5b6522d3f6da5b3e6a5d259e9b402fbfbc79f582c16fbf97921fdc89b864d29fb255953e030c6ba2d6ae14b67f573315eafd77dbd24f8ba5f74c21e6315f020b7b93a3118a716807039f3d7561cf4dfee132c3fc6228d1638ecd7cbbfa3aceda248e30f448826c28a7ed97e7181c3d8d4312052058218933f13c7411d1c1aca1fa70687823764a073860ee496ad1a0158a55cad1cf4d496a758ec865cd954973b654fd93de029bf106bdf6f3dec986fdfebcb5239c061c7c27e65fb524a296bba630c8cd1693f20170a0e6fac632edb6d3677514f01ca742121e58911548c8b299804d19d40cb0f497881e58814120541b2891e38ecc0c411d712633164718287a418f06004125fd3951ce450650543d812d45de4e0209974122190a83cc1854814228824b19404145d24418310b80089105a1cc112693044144060b1031055b6a822b422821f3c7043135eecc061b0ea7205890dba48a2031530ac60892cb080558195e0c824c10e8e4ce9224b6e88d2c4143b5c9164c8135b3081b2820840182208490898ca91a82c4ea220b1c4674a174d42c4bc783909922fa8a248d441cc620827945080450aa11994a024892e7430428b2b46ddd442907321948194589185090e401082272bc0f1031f7cf18414441011c20d540039090289278cc0c189245370b0a1e3a7c791a8d1da766633055fc8c0265322f260ace1ce4999072b08820a23a81d68d0e50b27393a71840a9ab04192144de015fea249a64852583a25849843b23c75855cc5d4b8f7ba70189d98700f3ece17e2d8cfe7cc81aa82644d1264512014b45dae5fde544082f2a683e4e3184475030ebf47f7de654834950f584a2965cdc67991a7bd705593e38702c8311c404da4f10fd239f21340c4e1ef9f0ffce69da7bdeb93caaf031c46a7201cc62e3dcd4bf0c0d62f70c2044d8d1f36d00f07154bb878ea03f1d807fa41fffefd6ca00fc4133f4bc29ff200fe67a900a90926576c4941149e7e20fd3b3f3f842458b878a8177994763a67e6992319a8e4a62e26a010421731c1044433018595d6ba99300153b7bb8fe71d0793c0e16faa9744a2644a2080e8926790d2df6f5e5c3f3fa27277751d119f1c5122c7217a4a5fe1f477ee27723f092acafde44811f7430e6d7247c9a18e677f1fcf5e65972e59cee81cf9713ee0cffffd7ddb7bfad6054f3ae79c73ce39e79c73ce39e79c73ce39e79c73ae82204a42a59c934a2aa59c53ce29e794734a29e54c72c3d63f30fdeaf23dcbdc7dfaf4e97efdfa74bf7e7dba5fbf3eddaf5f9f73fafcee9def35e44c4a6f7372507e96dd2cbb52be0c4cd665445a654b9f34da68a38d36da58239ddd8f76ddce5aeb8e95da660b220abadb8acdc69ae5b86dae5c7f8b91c9844d462907a1794427132de2049ad588c49c266a1c95a80851e7b4527db9dd23aa44e40acbe4011d8830c5a84f15aa72a91ca8c3c15a942bcc4123264647b91239586b51ae443526094fa35c796062a4a4c9c11a66514c411aacc8c1aa19f1967f31fbbf28aca7a98d69ae69198b49cb9cc95bd4041ec5fa8ca22175e5fa3d7da957e307fdd5af3e1b70b703f6afb123cbb8bea234cab2a82cbb9f45f90d0a2ecda50969304d890e411a932c4a7be96094438d2857ad4833d28e72fdecdadbe4ad701a39792bacaf5cdd8d5092432e5f2a2185d130548301333840677ce4a15e0d06d0e080128d8f3c9910a64792551fc9a514946bfd507be5fa3220c0e1846d3a7e36e9a29f7449a01a3f56abcfa324ab4a56a59e84d558b75c72b0324929b2c95b313739f8e2ee6572c9a378cb934b32e66094226ff9d7bc6d30130623a3dfc05491e1de7c3958dfa35c1e255d33e893403cd5ca2a0ed68fb2519443523b11d3256f62befeac296f59aee8c6722fa308db24ab94f2b497f1224f8c1779ac974515c9fab87e9125a2a722525edcf6935beb4b4c3e30e9e6a96fdb9fbc1525d79fd9ad59d40e30674d6006da782c6977d9f15882e42da4d6523f8f25491e8f254b5b70528e9d0f8f254a1fe7d19166278304d3a29a452d45240fdb08971cbb17ac3f8f25473c961c29cddc97c792240763e6b164c9c198ddcb5ee6080e2f9357e347ccd39807e291f16afc90f929f3403cb1fbb1fad5f79255e96703fdd5b792acfa32bac0e165c2008e4f6e20cab3681a49968f0993acfa991156fdbd4e92557f93dd2fa95003396651de02ca3c9628f94d7424bf993067d58f99c7922699c792236f01e598b778011c9fdc209463d7c363c9518c2f3c963099301e4b9a743058ff782c397230e6ec29e6e85ceddbd8658a39da2e756c474dee2f26b5f5c06c95bc751d69c95bd15f6ebd51e9e5c3500f50b9cec9535fcb6e16e5ad1a3bb2dc4c0ed68ff131d7cfb8788b0ee1f2160c23419a90b7b497b786bce541f53b8f8696e1d130338c17ba925c5fe5d130ebcb2c8a86593f861762185ee851b9fe56ffc50ba551ae2f8de44de4914c523a49d8e5a991a7767f918c922bfe421994ab1258abac2ed9a42499a06245ab5056a8e4ea536410ac71d40fe50c642a3553299a4ad554caa65237954aa56c2a55bfd6243efc870724d2546dca2b2ff6afc60c9d85449a9825d7df48d001d78f393291e3130f44c93487add40aed2bcc9e2ed3d1d0844da227448ef29c4c66935cbb1d32790616728c34b66807b7b5cbd9ded6bb6edddaa6b9c1c9b6f70334d7ff58f9c09285232b71b0ce2a1608192637f970f9461afb753e30799b1ea54c75dd2e270d6f9e0eda1b6d96ea2294289e72e6dd486333d74df36416664251908bc887e6ecad97fdc89bd567ef43dec47ccca7b93e1f3b92152377da6f9917cea29c7dcfa248934d0993b04893f9cb5f9126cbb2eeeb2099af83dac7dfda372a69b64fb355628b1cd4aca665d7e903505a6661b688e889d092ec76d0b730cd165925de72a297b76afd0cca5bfe59c0bedfa6216fddcf0a3968996cccbbef629232a4a49824bc69d9c7a6d8592afb881cac7f0212bedf5acf092ec0a9565af2567fd5b2efee071273c85a9f4b823f7759e070c26e4c126e9883f5b5286c935cb72e06ccb6c384dc9ff5fad92007ebdb24dbc4226d73fbcdbb9146d33eeb72d05a2b43488975592342d615e42d6b9984baee075c634796336ee2608d97a9bd2bc5419613922af7dbb3f28603355e8603ab8ff91a9fe692acfa32df95acd5c77c9e5d79599464755d478b5cb0ce3689b231f7b25f79f46d93cb74a564519acbc6ea93b7b4af5fa1a2bc5545de3c552edeca549d4ae5b9124049c95112f701a45c7fc6e2930f28e5fa93c96f224f7d55aaebbaaedb687775b752c6d9d3e79c12a742a02d6eced1186b773e9dfd79bcf319972d23970a379063f77037d268cdcad97b39fb3026671fe34dcc872f39cb3ec6eb1859e14b55ca9a32a76ec78dbe358a83d5abb1bae4a08d231c9a48265713f4c9e5831cce231752376755aa4bb97ecd9a72fd5aa3e42044510e7b4aae358a53ad5f635993bc99f1f533277943e3eb5bef67c7c1fa42628e9be8a8942d78453164686800000000e3150000201008064462b15810a5719ae93e14000e6e864c6e4c3415c8824992a2280cc2181862861000080086808111182a2b0069b489b2b05f35bcd653cf9b13d7d75e07d2645250931e000e577cedcbc50ba76f9335faffaa80e10319fbb9d42d17f8682027cb9d02aec49c0bccade7ccdb0fde0c02e299f6f55fcaea0f66efd1b536a46ef12590a1f00ccf4786ee44bca43d096dfa081c03a8af4afc3074cb0691077779a0e115e0b481f7ddc99d03e2f72279073a8c9528a6c0f0d202f28de6a640b27640b7fa5880addd2da834e8927308863eab4356c136c37c09257ad374871b46e4ae5e17fe211bc02c92328747f4980ae09caf354655a98e9318b3366d43d6615ddf2d9d1f6fc31b9a928e00e80709a1bc6f90096272efe4f11d58e7eb078bb7737fe54aa26b43425cde6c52cffa18b25f49bcbe8202d2f06967447f4f801207cd3d1b10cadc4fa5d59ec69f70d0648893b65af235598e320fcd29a23e121fef84aa1bb59475c9e48cfaeb48d4cab55e63019509f62feb72d4377a7084c4706ab15d60e0a0bd1e698bb7e550cc3b085a67f68fbba9779eec83191c3fc786f284c3180aa96388df431260c3b62793934bc37819be80b870647b3b4bf724aacf04fca71e09e1e2389a13ccf0592999432b61cfdb102dbcd7790eb93b804b7332dcca20192f9ba3bf18a83ad04e2bc9ad6489827fb2fc2091e82428a5d659bae0d5962d00efa6b67f43ab7f992177ade95ac0e6ffa2c490c8098230fabe425d912c20b65292dc06f04b5e718227f6d91f8713357926a532918854551c716df9aca939dd654dc8ed699cc69cfa1cf54ca5b0b0602c0ef6bca43e64845817f9227b6d3104e7b55191aab27df0bb37c9b3fa4dfe4d24e0cf8660e4657f709dec7ee250621694f1b0e4bd08ee091cd7ed9c1ce29c582bb43f53dc2d6c3fead2bb47ece0b5aeeb21810ad1ff0acdf1c3365fbb0ef97fa5a713351c684a1b5044fddd90e5bd13a5a8bbf7fe0edc2dceaf14f1787a60cd8e51c93f0ef3cbe81e01888e8d5cc1b7118ddd5d5af28eb322b88d5286e6da4a69f8eb525f4149463ada06dc1c647a76794c2728b7a597061492c310e7112e63560b5df76d7693d54e3ed79f1df55b8a8554e440bc6d87d3b6443593d10e872dbeb9bd990c99e398abc1b3d7cc194605317ac907cef383900a47fb55f45f7071028bf9cd9945f6373bc289f2d2fad1ffde4c5ebd05b40434d34d54984dbb040b50d183c3f62460b7caa200dc701e2022f5b19c14403cded0de19b2d8cbf70fe8ab26bace05669168b6a69328eb9df4d2ad0cc181e4e3ea2fe857052971f61a1789bfa3aea007353d5a11b6eae8e50a0617fae3fe736c9593b757984ec92a7a281cdb91d7737fa6e9c4cffbec5385d33555e8868018f509f63db48a91eb4b7f88b4b18f38c1b993aa75f4b3be8364d5c456f7beee96d64d642aeadd0f421af4279db501cf611bd9df389dfd7bfe2df3e4aef5a7be1748b7773c803474440a6ee2a3a5286cff500ecd8d508a45419b103af1eaaa9ab8e85de7e2282b73b767c837a9a159d14eff81d289115d702c1265f407e8ecaf72a18d5a28d3602aa4ecff8a60dc8802d4e70db552d30639303144ce8f70fe9c66af96d3a6866ea3870b7451b9c8ef004008c91669381dfda188d5486e2e029ee74bc679bf278ea00c8ed5762d8937345f54f05b3a0463c3a2e8dcd4ce024c5452c5b57e757d68a9a28453ab10217aacb009be226ead43355e30c6226e078220e63c2fdd0a7550bd113bdbc68b82f58cfa5de5b2705e8ad22d53ba2d090c0232c77fac02fc749a966b3da3560797ec101454e9a0cf8d60f7a1ee5b6bc12780365e9fc34b0a616a6291b681e471b1744feb5b9f2769d98723bd48c36c20185b7070c2b54bed7f803d97ed53896bc449d209acf8e56a61c1065a742d6fa53c302a7abea67f98c3fcc76185ad2d6229bc07ad60238e950d0ad75cbbe31057c70c5dc372c1b2b178814bf46f43f3092759594c1c665cdbc535b343276df343f112476840012c43b4d9f18e68a87d957e2c470e67db67186400b900e48ad993b36c09ce7b2856d6af9d7455fc9872f95e00ee3d632fa58fc415c351eb3d71347d82fd6597f18b71b5a65fba32e16227344d59197f9137d1c2d5730dbfbfeb43dfb8301fa29f5271a407c3cf5efac1a03d1d452ad1ff5b42e6d8beac2cfca98fe1aa6c638b4d1e1a63be3434aa36637cc48beb2bc7913c40a629770b36d258d287b8e2765ae7589f1a6109a58c4697e163561eb8269fa54c303fb092f0e118feb2790cbcd0b2c4d6f2aa9ac2456e63af13f3e344eca65cbe7123f266fc9dc81e09aa763d5f510494478f7551a3ba30faec546f6a4c4aabedd253f724a07b6fd50feb9697fc52d5d5a948851b2813f8392e479c99e81bedd66bc3637fc83679b6cd8113dac7a49b4e7faaa154caaffaf1ee5e95c0722895d110a3674655b6d282c6190c4997346f3ff388f17b6e480f8761acbc6fbc5f7328072554e47aa30a265dd5dcdd1c0c3eaaaee53ce24faa21840ba5237bd894d75eae50a48fc5bafbd0fe879ead58dd4073b496bdfa7cf7fe429d39b98ce5e6736b41d5212557e5ebd9ebfd54acd16b750d80c4c420bd4645fecf56470af0cc070727197146528f39ec324536d0bd36a66ad49c0b63e367171e91cb1a042a9ba30c7f49fc35eb11eb29a6d3829d957bf563e992d4d6bcbf7bc1b30994707a9e3c3baf39d4b54ad86a019602a980ed2bd3d63efa536c5f4d172e0a9c8657ad2b8a22d9bb84652b2f5fa9f3c890b6d7fdda7f153f5ec94013493aedcdd4c5805fed7fa4a47edef1852d16f79f542fccd0dabd845801803fe550923a2e7d2d669cbb83b3759c73db66e343b7bac2020d3453949bcc45eb80e36c6462f125a6f6fd2a033bc25f20ac95c4122119e832379cf11ec143bdeb6c93b14ecbc9bd4b85465175440e056ef2e93c0bae10c0fa07ecebcce386a9df9478c2a722b1aae0842d7e695012d56d5dafa257ec7ffd5a3474caf52cce753da36f9dccc26278e2c88b78d9998e7e03dc71d03f175fd1887b531feca30fcf9669169a32282bc2453e286a0dd6deacc155b7c8bd300bbb637978e274b70c25cb63af7aa7306900dfdfa45e7ddebd436baf3ee9d2fa904b2417bd676f7f6855c3c7e5fd80c6fed33baf472db14f936da8406023e111771424a2d3637ed0a84b0c9c4792828c245f905eae2d7da9a231db7a2469eb55a1c76a6875982604b843f5dcc904fde352a4bbfff504638cf3b3d0848e1f2cb89f396dfc4c97ceac4e033f2944300014295b2ed09277859e688c5687a24534f322370e907888873cd095e544f160fe17a0850854047c076256e1b3f92f973c6de0c5197e543f226e2ace78ef451084f3fb55ab803462415f9a7ef806d2b9c1d5a20e46430784aba3885947338ed509828ceeaae14402b6247b1cf418ae233d6c5884e90b34077032f9c857d45954edf99cb525fbf6c8c7a61cc43c565b92d556c245ae1bee4a357416a1a75a15111a09c0700af18310fa06c1081b9a7c5a2d25aa6c987973a06248957b2cf35ead8d83d16baee66eefb6821006ae5d453e89f6e5bbcedc9656c7d9c4513b561c2fc79be34e275c5564b28c26cb90586b30a496fd9edba1b9aa3f2b4bcac851ddd54c5a6db0dff396522668c874ed941c345b10fdfd9b782394f8008a6c2673f770f3fcc59ea9f8cffd52bc1219c30079137cf7b624c3c4db7ad4ffee57fd761b763b007030584b54daa8da7eae3a7664e06b149fe16db01fac910032efbfa5a6c7421798fb8e4533329418d5e66aef639ffbefc113dc49e9ac9bc1c3e941470fcc5818cb45438607ce75f19188af23eabf46076d6549449068eb890e7b241c250190d417a2fa2385bed3fb136c9e84ca7db7b502a9ee198339ad347de0eb2298211fd8b50272fe622f70fcf0537d9a8ebbc818993c6a1830ea649461647acc659bda021ad50853a4199631f883fe683df9210c0d89e2afeac95483e68edefcdb8cae6b37661d012f30529cc69d44cba152dc093e7f1ddfcc4188b10630045697469dabcb9ec3a1ab6c1b9bcb363a63ce0c7435a011b7d14dde64491dd713d7fc55ff02b0f1e70da77ed1748e5af8516a8255fcdc531c0736056fa656d25fec05972a5f204460d2f432b90bf899e0de5285a6f7b73f75e0bb06106995b63323764673783207919c0debc2370bf76a8541580d4377373f75f9a77b44352b8fb301c72dba7ac5d617c69d852d4d4b6dbe8c903f2dfcb145a17d0282d002462fbb4a1d89132af60dd9c6c7af17a7a8ba3e39a48a890abf6953026dcc0eaebc545dcfb4f4f3f8d9444db769d22f4cb10f6847325c0e3a355e5dc008e7555160fa5674da1c6ed760eb738083a4f649c7883f50b7902e9b8e3fa5556a76b5193c441edd2e22b174ef44dca7aaa435227840e5218ed99160bc074456e79ff26469d0b340e60780c3858aa863426511b6ffb3cedadac7b2721aca0c9e3622ed9ece8f54cc752921ed539663e220b16a81cf6a758d19c4f807e2a4817d3dc06d7346c80515d659f0098ffb80481a0977a1d907c5c1ce03892f388bfb48668735a3429e07c7ad015d11cd3cf8b4917d0202ab262743775f7edc58eb6fcc896cd30c987322ab14ca9a01fd20ca7938d4542122f8c2225ac90581c038c2205f465622404dbaf03e3597e944663b0566d8f04510be903450e0410898e1a6d0c60c39a8ddfce730ce689fd023a9135ce801fdc96fdd3394ded29a87b834c724afa55a41e2b965695b3a52f453c7d0db88687864b0fc7abaf688e37fefdeab4dc1d3983462abf6d5e3155865108d590c9eda533077aba252905619d4e9c7324a4d6ff2e7fc17dde39c71ed1f04531d7349fbefdc1ca7d994ba78f92432a250c2963732f94705f2140dc53c81bcf52e2aaa0a571c0845c647bbdf8943080a794c06dfc27d6068c82fd090c6836486e6a3cb2661371ffbc1694a8e310dd753866b9e68c646665f0c9d402ac4376dd4810cfc29dba08142ba769660b477926c1c536d8fddbf2f25dd0c80cabb0f27189b09e5fe230b7d4d08f8787aa9ebc0989e1144b15086b07c71bc49111e72a046cee89f974dc3420063385a684aa0c008446f678cbece3170b4bb6b1d70953aa90297daf3a0a172cf5c5da915fa2608dfe64cbb3cca9db2575b27d37052a45f7de6ed739e928a744a98d450d6b207fb900e4ac0fc3f725bc6d50d7298bed17ba7601c247f9e6492f13210a795ecf21dac822feef80f4bf07c7e0a6099e7248691090a0c3dd034939338f26baecd27ffe3a9205d211d40df41b99c8ccd60d0efd80addc8055e22253b6151f8f942d4d803dc16c905ab2fe45d6184a0d6616dc5d67ef66d4b0a725046c57baf55b81526c9d18ad7744057a9e01fa93d8cc4ecca650cfa853ec383e801ce07cdd0b07cdebec81f7ac838c30838d9223f03c6170e4dc2e6e754ee09ec37ad1d1cb9ead205b1d41f496aed425d2d136e74e4f0463ef90387b68f9e291f6cc31672e4d38c1b5949e47184ae252d3fd36c97ca35422cb16b8d092a25bc11952d6db73066706be9b78835d668f1ff2d8be29d892db5a95e7c3cc356f1109d6814369214c30874609ed148e3236a9fdc1a6a2a2b2525962de9a5d82f32404125158adf58d852e3ea3e74a3da276e28130b3e208ed1aec70b3379877f04528c3891d6f6eb28e86bfc19574172d7552e6fb019c3c0ef91e06f75056c03bedb037adc232e9b24e83a083c13f74c483f8b6d7256d01e88cdafba930cabf7d25b5df996a045b70282ed921821f96d61df94580ecb30483e27853d4797b7e343f4e33832b782b023adac382a3d1eef61959a5fc393cd04c5f7a303f37a1644850df503ba1953f4ef4927067777eeaad8f19d617e12805685f52709b07874525d022ba9bd3137ac9b2d1823870992737fa7275f36af62f3a043618d6cccba4831cc1391c95fac53c43fdeacdf708a2b28a3c4d6c225137dd2d78829d5b1c77f4fcb619eb1361b99a0278fbd00eac322cf1b2293784ffc7a50bd536b4e024399e8561f806c1475b975d7335b9533d0f18b22b7ed2c69a1ca0bac6e59cead19535a4cf0385545e82f7fd034727a7d6da70e0380278495165dffea2e0716dd95912d1b2bba4408c13e2ad2f552b769c99fb91fa075138a7648bebf586e8c10ade795619e546ccd5a48035b9bdba345fdf162fa7e0a1611439f8d60f8b8c55ae5d87b135c7e046d3b80e789611df554cdf21f2c3912450525c7d31d5dfdff0f4451a5a9ea95440c9ba6f653e84d1a7b3a8617a12c0334eda026332fbe4d9c9dd864d55e5f28e98a566e49812bbbcb124703c87d0bbf117b7966f230972d8f947c6fead6d836a5229d375ff1fff59db95b4562f2929c10bd63092889ac53d24d03a6c4ff7e740f04b555f4d32a89fa0dd81421aec1574987fcf53dd4f180cee78bace985865868525c106e47a43208a43f58dcccfd0fa80736b3e325a42edf9bd817587e4a98ac008ccc5306328fdee421a379803fa75e5223db6ab159d77022c628ebf53213767c19fb9bf4b251f36e3c98552d1d5c1f9de6f915e3e51a475b58ebeb7b85de7bf1085ed34b20514e4e6cfd0b52ea55c34611554ce09c684b2017646ebf5987d710aabd7a401506838dc51b02d3e887611af908d31cb3bba7bba4d3f79dd6b9a84d3b88c603d81698eff3c1f45b2594159d09aab4cd50d8557e1a831a55f466c94056426a5fdfe4c88e22b49a957600be5f0909c017a11388c79968c45682bc15f6d985355fc44443067bfe380504271fc24f407e961a420ca4305796f21f5facc68072cb170282bddd0d648461259bd33ec60eff070204f447a488ca34271d46751f8625d3a4e5dd8d0ced800e86582341168b9a571ab6440e9ae1eaa9ccf9e1c75d462e7000587485e9171fc5e0d58ddb582273fc02c11f8952dcbf6fa209e23f1101f6fa6b24f5a9065d34d54a78fec09d54c0f44340188017625348508c59e809a73e92ff516ebd77731254d9af9a9dfd6ee5ad2fd0e9fa01d04b06d8827e6080dbf0d0844967d480ec9d1c920a4cdeb5b28f8a9d6d9ca5d5989317ca2f66aef8bb3100b8df57fcf0d104b768f1efa484f5b92c7ef9f2910e256b1d7a14f667f416533809f7c1dc84a9aae53559b4990d486cf80ceb890376115dada0ef929ade1b64dfeaea919059c01ffb5416f2d3fb46dcfd6fa795f9699f0610e44fb31a994544bba23b9e815ec1ed454d4ee1f1e5069e77a2664d8a8d9de28452289d3af7476c43909b461ff2ec63c17791dbb1e926fda0a5221c8623be1c09ec07ced808cc5b4d23c1eee2f04c777464814d742ba2cd022b00ddeca24a6e454a1e578ffb58a56cf0dad3a783686e7db24f1baffd0307eff538abd0588ab4007517cb411dee4244c67fb9acf48152c51f36b1f8b82ad8c4d6875b4030f2234e0852aaf0369af967fe3dca05526f5a94e6b06269fecbbc2e3dff3f112700ff84403c067f62e162968474f25e72e866e0fd6511694a0242be4b8a9b95a9ef8e10423c3ae438e681ca153890f98e1018010955c69894083faff18ad4f21fd3693e99da150df13ca53d33be3e489190e91ec5a458bc5a41c1a6ffc7b2537bd02ede4b0a769f1ad9490f6e08a80d670de4fd0ed43bb1d0fe88644fd7e986d96188b38b88f4d6d07ccbd3d5ae539e67aa77874ecf6f7f04743ddc36019bb01900501dfa5329d42cb84fe209e228b78fdb3dcaeb9f947f547b0614f7137e3d901164a6e64a5bd6ac84fcb18a40b2b669b276e961b943f156619fb2ec970295fe189f5ff3659ad111a7c12291b39ff5c0b6609faa8473f57bf6ad7c1d239184c7ce258d4abdb807269465f438ff69cab2d2e16409e6d4d9065895e7c7a3b043e2ffeb981777a9afd8e1ca5251f46f7b7ba58ae8f7fe29a28b18b188e484b2bc194d1ac438a1c5f9e72be7b580d92a256631f99886a422aa8d5048db469ea64bd52fa58d68b6f7f8f4c4d9afe3999e27c0e811e0c2a929f2f8135e18e3fa9202b263493a4c25c58292ea66ff560ab2dbf224356abc25a9beba1cf15609069162966afc24ad14836590a89220868f23300857ad7f4c060ac8a5447ed75986a156ae88f1045ec0310df316f3e8396bf6629c819428c1da506dedc584bfb94b3fc2aa1648ae56eadc8dc7a8e0e3d11329c4a69e49adcc458726c023e5141fe8a236771a3df3ac3038fda64abbb90216982a1f4a1ca081b5506ac36b84b75fc5a41fe0280deb3cbb4d8bf3944de04fae3553d92ac910e69ee4e3fa19b11f04cf3344d24fff1794c1ebb3e8d14fc22dbb20f4ae239212e35198a3059d3687c9c73de8fc8a978b456bd8f4019fc12474f6f2117218a782a4b9b2417027616ced63b6e6f0e9d9f4830db8699f01f54205923a6fa9472a54882cbb1cd84e5b68a9f4b004d03d7e05dc0050376f86e0166d74de3d0d919aa20bf1102385b4c8bf7acd6106383f0b006f8b5caa1cf7ca4f74369dd807e1de114239b3fd2f06dd137ed1861e8cf2dde3d247ccf968b45b859ae41ca6845007d7642dde3da7a4ee01fee8c4e939452f744d6a4ca1e0032e37efe9f61ac0523a094287f319cc8ad9181c0c5d90ee51550f0f610a2a051e0717593fda0df112c7867d56efc7e0e104c06c4c05eed7f87a3999e27922d0af9c49931f12db13bf328d4015cdafb8b2c830ed600d4739284da0f3071ec0444d8ffd6a159dbc239539d019c5d01108d9b68a517abdc247d3f370ef2043c7b81bdf9377cf36d0c6dd70550f99fa49b48807d67cb46c0725ec5620fc9cf3c1dd5ba35d2222bdf1e0165d219d7175a5bccd8c72c1a32cf64d2c1ce8e8ac2873cca65fa673671f2a3692393b9fcc7f52bce821382aa7757812192ed2a4da95cf5fc6c2ade860ef6d91c71b0d8f65e1457f90cb73338250b41321f37e76b2cddf5258743b88cb6ae4ba63f3b7e93b29aef4111c11571e5501ce482e559effadc5a2e7200e0b8b72f786d12e1189de81715315e688106fe017ec8ad7bff561e810d244bf4b9d4ea03aba66039da8f25889a3f7e09f71a3dd95bbffa478d347c04855223a83d8e34fe6c357203cbd9e98edd2c9c24c06e85b3cb6078ed5518fc689fe8d038c368ed38f220147f8b53d4aeb2773e1581902e9ee4027a773a48751dd457b11d25089f5bfedd7c68b825e8aa3d1d3880f5c09c507c80829d791f0a66e0664afcda5f3778dcfa565e01fbd2567da5e3ca1402d9a2c2f31e16a78c5139b87e239dfa093465073d6d5e8c88a82a17160c7437b45b3c960f148a2acf11abfa5bf1601a3973b5c2928048d76b1ada1997d5f0359546e81673955e48115f72bd8e2761cc66aa7cc1ec09df8954df16e88a745e195d654a552e821b473ee09c453cb426c0f7e63684ff8f7b4336d92ce0929d351f4722820298eabdaeab7a957080eb9c1af6148efa5698bdc3287d39f4da80100cc54f7171b0a2db9cb6509aa22f65fe705a98eca45d32084479269ad653d696fb54e4165d4b85bf358a7834a835f0795dbe8567acdaaae4bce2c82962ec2f736a892a9cd01c19e9a528cc169b349dff236c2c4141add351125fb8e8af9d0bb1d38d3162129c6194e60e68142dac14ee1c0adf43fac8658f35ce3f83b3208ef8018e59130491c564aa27f89eec90edaea60bd1d40ef94565e4a6257c4e95542ac464de63bdc7c9e028384fd18d23c2870a1952acab767e20edb3a568ad12ff388b8a72a1a0ff10440b99c49076a497b0579853e6fcdcc12bff8ea11275501672097030b88a7003816bcad73a4ddc530d10a1ca2a24dfc22e384bcc82b695ec420d64e5c196b27e512253cc0a1a3b2c39f9da4f0d78f1747f3ad7a490bffa605983a297e5bbf57804405976e186cc0ec458fb73ae990b68bc2d430cae704b14f35df1f08f6d5602bdcdf89486774089589ab83d5028d699582b309d4e35f91c3ab7d9f2617e2af3c62ad765faa58299a2badf97d25ee3df91be278fdd6e18486beb7ddd28fd96d317cdc9bd7a223844de9c7386c8042018d264804187d41d3286fa5393b3547a0f217d2ecc37fd8da02bc4f1fc0c2ea312de33b4489e647b1d3aa70a7e2aec313514e7a0f9582b04c6dc91bfc3d0e227de83c3491250e992303352064a167dbd2536078ecf5f82fa0b25a21bbff464202f2cfcd5b2e62f52241c0896506829c55403506ddd2fc1803490f1e9c678c0f67e2d8dad7e20b209552a55bb72d766439b1a81015167a471fc439681c18ac226cf69daa871aeaa401718bded1fb8f05903f99aa706420a1e57d1017c6251840cdfa8417f71f6a1c8363b3aead9cb7f9ff671bc16f52edb7ca9c5cede0ed61b2bbd89b38ac2c8425bc50d16b54b97c0dbd4686b4b241fb95b9c95ee352281d7228d14afb355b20ebf5b4a7e8350d6098419223ea4bcd26c926da11847516957cee6c01b30f251032c7ad1c612e0700b95a0e4215ed63d375eeca3658b2f291a9dd0a9db7d9d9aef4c95ad32dbcf8f4e3c6fadc4e2bfd275440533dc806f8ff77cdfa250d61386a573f76d961aaf5f9c2d97dd428bed692b026be52eef695e1227add2b4dd742a91421c9737ac83940811ea4610f9d39df86c5da771a494ffcb1d6a125f4aed4814cf25c3d0c4f2429ad03b443e5da43091741607419847cfafcffd3e67e54000c17c8f69de09da900fb42e402c1206b87e2a117c8bb0be8ee30d1aeaad14a3c6152e94d8a6e4554b53ed87971e7e3214138e413018ef64398607d7720b05d3838d6f1d50dbd283416969c95749ca2c62acc67ea3eb178402175351250873afcfcb3b958356027733eaa6d5ace2087250538c46b80706ff1e59374c983485030e1a168345b0201b17ccceb2095781c9a084fbd224ea2d22e6d48504b8403ad66946c489896d47697e730a979ff80c424fbfb7d125881e11acb6b593148cac656d6432299a5abcdbf8bf3a2683a3f435df9097e319e6c7f72d6be20f307a00f1a3233a4ea0842a4e3ce14f3cb06684717c8aeb9506f0f37fd927691143a6998fa9480c466e1f1508ac6ee2492d826e429a291045205424e80658214fef0cea34d33c0e50ac387f55f1724d1409ec8f402d05909b1b56a2694106bc984b7fcbbfc389fcf0eacd3709e71ed00122d082de6c2651774f04667ce5f8b9f8190dcd211c8d2c8ce8806efd01fbf296677e8cc195e8c11bd20a568b2700927815bf6754e0588e3a4ab0b4d3525f47da6c3a900e0f99f1dc4c6e25c5682588abd0f16835451615980f49beb3fd1b84d1e122e6a8b3f6cef372b03532f81ff59d9f79aa08ba38f0d0281fe4079806b7728559ddde5dcd29fe661acb96486f7853c042c55b38a926ba01310bd1706ea46d645ad3840c7c081c912af152af167efb63d425dfd7bb8668a9e1fccf5038d0155e8e7547f3fac131a11fefbb3c4bbcb3a037fe329499cb5217080a38f9059d8542562872a0b86946d7ef31f8d852c77cc2a1c3ea2d5dd8b626e9bf53d4ec627295003b9e6be0cb09c6037e6f0c61f6dac7efed1484730c9e3b0469b7521f4755a4ea4df946ceaf6ded1243b921d3d1d65b913846ede9a56094aa8f5ea40958e74fda531668fe16597bcefcf65beeafe8639af771e2dbe40da67bee08ad7939b8d11d97474b57fdcbbf053e63ef5f8d90d3d3b43c1bdcf64ba4ff1f0ab83bc5d44a4ce344a4b574a21efca9a7211d922333511ac622ff5c4ee7b925c72c215da58bc11073eb0e4a265530036450128322761f1aec49bd3d864116000473c63c7a063c96bdb2960f6d07890454ea202d4befe101c3f2703d07d8c0a580455060084580690ef7340f0905636342c10a902fa48680805a51570524f30d0d4216c1e92196fe6b4df934c445d72ded16a0b8cbbfc40d9b8e6fe5dd5a9cab408ae9c6cd8fda86a089fc2db0ecaaf223f718cd80b5bd9c93120028ab72ca4f7378c291faeb2359bcafad76dc4d895cc16c3605539cdd0e7d7436c7631edef085490b13dfa002f11df3fe713353cfb98e330fc18273db849d6243bca0864b127838fb02361e0ca48bda599b6ff8067c26689310beb2b9cf6a311c1a12aa1b562c291be3d978f46b0f89e25b8a829323c5e218ff5cdf1900773bd893160fa6edb9caee94e0b360cdf484c4f61e6aea6ffa4587c8876961391afaa9e619763849ae52cce88c3fb8daaea91e6a4f95504ec2e0e23b1b66371b1bd692d182f6258ceaa1fbbab5f1d7e8abd4efcf9c89d4fabf74784887079849ee9f0d00af14be20f3870fa8e5bf899563a83f6ac5219c4ae293cc740a45176278a4c9ecdd2dd0fc72c59e6b5c27eb430b0f2bb594fca8c5f9429b2d653ea24d2bfbbea90d9a5a23d1b9d4dc35099193b0863da910fa0d19400c62a46679d2ae9fbf100ce898db248feb41cda5fa3c4e9fe043e6efc184cfee0d81d627f90cef527432f9cf9213dd50f3c976951dcac92bd335f91366336cb2eb24f19b2ad42fe13948815e695b092464fe2bb39a858f7ab364f4f29f5833ce3650f431ecdf366fe2030ac3c5e817969b2fcdfd27393a50530ebfe13dabd4de86fb93d61d3ac1cefe37c09834155f3e985e62264cf9ee123c64afb85df8c3169600d93c608c9b3efdf5a93218a5480287606f29c90b0cb9add26ecb2be81a4eac976e3fac12836ae49ee7c67897a5db7ab25874af7d39dd17bfadf20931429acdbe15df3340477d5c3f801112054d1c676547a74db918317c4f83634a6db855228330504116acfef47b00376d3b1db78b87870049ce7848b90c2048abd6ca790115aac4f947b93dd29a18df9db0c29dcbfa4ae1b2a6b8623c32fb0b45845b40c26868c1facc2c95fb5b8cc623697041cfff66fa1f1f6250e76b2905387c4106d3041cff48b43d5fafd0dc7b8d3f55abf30820772ea75d903e51adefc129f6db6b34e876b2e5593a9cf5b32a993b2cd1fbc29567e020b65fad62d2fd0e7d660f948d79d92b69f7d23065c744c31f5f2b76d2c24cc92a973c7aac841033d3aa0cae2508ed4607276aa6c811a74229e7d83dc61898990c6310da62e8e7dc8c30ae38048bd0d40351e4793dc53a26a972b77ba33ad154cc58034122c72f7e29ea0e11660e1879e8b634a8f953ce17bc6c43e9a386f3afcbc43f0cdbc4ade9febe4e64bb08655de2d75f64d9566a8461f928dfb9e56373326377443c040f20d1cc6ed2c68308accc379460ff66ff10de568ce4ead08b67681584820742c136809c4fb0784bd1f34f2fb689fbd9d1ec643ee72131f1007f61fb1bcd74c976be84c8cba617a500f23797fdeec1f0d20facc9e739344b612ef7ca24aa35c74a9a74e6708337388b88cdaf74d3c5633aaffb59e1cb3147bbe2f046de3bfbffe46e3f0b44f493f0a2506e13c964e7b4e25623d9e30b22e5219c960579e800b1ffde715e68054afca5edd5f68cd48b629c8d6b81672f80f1e4b70b8daa07537b0e57927ed8e9b541f6d6b6b5cb8bc9a1fcd5897878b303631aa2b81ad344de31f1605013b3d7e4c074bc0a708e214d9d6e8ccdf62331ad87f08ca97edf713d8fe6cebfabc7e8a32a7621d1649e3fc30eb1d939b3aa4c5329df22add6ae5e4f48573b518658bf3afb2df3614d4aef1a5a0eb9fbc2e3023c5db7ea304c8cc6b130584d9b75ee66cdc58ffa69435871adf072f71b09a6290ca430358ac05abae54a1cf857e7a10f5583c8ae9989652e5174408aee9ff54ed5c41c8e6df7c0386dfbf9f528c5a1b7e43914003d7b319ff29716ab8c3afeb3b136fedde7a3af587301bbf4c7c0751aec048352713289f3b2434be21ac50641cdc7751b2965f204184d87196412091689f0300809f2b052cdf02497cc5f20aa27d6517e19b58ee70a7594258a7f37299848db19bc11782c7fa870452f4642e614b7d7488b8654ac92ae835d6c9ecb4464cf81e775fb6a11520500b618cffc068987adb75885b7fa5d08c1bcbb24ca6304ff1fa818748d7b5d18e1009b2c16f2710b96a89643a2bd665600c88c8859cacd4081053af5b0bcce05d0889f28250168c222cc7335c32f5f134d4dc19164208f56babb5f240deeb9d29354c0ab1b60a211037e9137ffc5939e0aab3c6fea13aef8830f09b59b0a128c4f1a49833eab6debceea2b1095636b9fb60863faf9be8d884ae048fb8060ba170d962e7e9a1b8ad3fc76f684da54dd213354229d9d17c6e8bede2c53377ab5a194e5ab70f9d0ea3fa788b0882f4f4f1ecccce27543f21e6001d164d572070346804d587143b71c0783dc17fd5145ff4ed29ce07f8d429edb88cc8554d899d017e39bb151747a5d564be7db80ee37902ab2219d55cc9b2262f160c2dfca4d9729df3e180bbd9bddac9803309975201cc04c478a719b2d830c8a406a7a4f12a76ece1b88a227f08d92dc578303c61b91f07ff1c8adbada2f210bbb1607cb7adc516b278043c9cb76096f3dd5d669afc6ba0cd4bc0af312e7fc8b7476b2fa608df4e2d0b3e809bb01b18457f7bb3ce9cdce20f8a4f4e2831a9b00bd1fc59d428dfd53aff99e34927dea257396f28df11789cb5c6fff3636b1ac3e86bf42ff7e97e3b743a6192ea735b3868cc030506cce8012c7b5a2abdd5cc5ec3c34c3f00cec380cc309465d520d6d7d562d5a73454ae2b0caeb1775e2b9d526aaa6a805b95236d8105c691d6704049f9485d23951408863b40dff01da47a2f8d3939ca5fc292bcc98446cddd5ce4bc60499d3d41decb2849c60c8e19fe621012d9eac1e186879e3f4a19a1a7e21f9c5723ad5d62bf9be43dd2be305fe0d64a0a222c4b4db99f4056cf660c767d0d86fdc35f645e95f1a0ee64c07b670762bce2c611bd82f29fb0c344e81594d10dc917b9ae19eb2f42afaaa6050116613ec95c20271b90790594c9f33fde439ca25ea05c17c55f592528c8de077970f72a26c1ad9ab30b272979ea57cb74050e7c8d18738934ae581757440096ea0f71a3b83feb0998a0e7b7e41fc56ca26e23f9be3075b2b1ddc2361236105e084b4ee9907ad0b1697691d072335462c353accb16f13cd6af9ac61c97ef4daa2838a57be8a598b927e7e6e05c76b9b16052e1062d3dada0c3e037b24566e18b3990293fe6b6fdd4219e677c270d5e96af6516c7906963da9fcdeb239da77ad1d74c4962abf9b47eea4ce7a2dbccac47565d866058b547102d0fd3030b1faec649c38418b97615b4a78f839f38eadbade053e374be784ef8c7d39a54e561b063574cec0f0100c8ff477d54025b4368fb4b047261f1e7422162d94ace15a0c7b28fc3ffc317aa6fa1b3725d9a540fb622ebc7c6ec022aca2270d38e599a352e4d661bd14340e28f18c8c2d4c815cad4ebbdc3b419b88745c4d1887bccaeb06dad9959f47b911b1ae5a8c3ea74d185bdc6d7c20ab84b97883191acaca0e1c575316f6b712bff32fc687a4e09e80a70f3909fdb2e8be2c67d6e817cc2f6e2760e173b3514f81fb83c030c74a53e2c9795d1361186b06b8671ad0233783bb54cc5c9d0b7d25b9292e22f8c3feb53e60e4696d2769f88933a4de499efb30f11bc54dd5b4f9b1f0653fd62a48b779adccf7f015e72060c1775da3c87408c58c9413963fa325c9c8dc6031e06321f6212ec364479a14f2697c1c6af22c1a247b07784cacededc2f78708a0c283557907e3c0ef064d419326809bd3cc779bb5468d9cb27569f64a51dfc92479cf5f8bc691675827ac4c949d1f160e5ce77842e2d73cfc020854da830c28315703e5f6d5f93047a2d9300415db5482a562307bca699f1775d36afad1fbd40bd56445fa9599a57fcef074f2b5869223d7cf7abc222ae0d444216e1d1d79a2bd2f3ae97108930404f820885bfc75239a53f0f44bdd611b5fc44492dceb35baa953f4afb4a38a6e01077668128afe8aace974254083bfc6852980c84db8f4b3907f76b671d40fb664218c8ec8776105250a1bd920c8703d9ccf6a516f1c4d50470fc9026dbd572ae73185930b14a22386e24f3f64fa8bd192ae5c5eb5cd4d9af47bad6dc65381cc83e5382933d91740b0529ccbebfc1f4f0082305c32e09e6edf0f1081a19118694190e24d3775f5074e2609f4433d4cb501fcc0f41af890359d35b2dba2067aa800158ad956bd4aef39f6398e3332e9b82ed6becd578faff3005e0655a3985e08adb8d8de88239c1073ba30bfb25dcdcdb4b6bb03fc4fd1766718848c7e95cfa087b711f370c30bd1938248e950eeaf1bd005228673c1a88d1f4f76b459833bc26cc9b99eef94dd12fdd45ea2a209f4d79cb30f311cf92fd26f57d56f0c7955b7cd83b1896b280b313f144e7898f2849828cb9531fad8b4878bb8e2a939bf90d160fb4cc063779703ede1002c45a52b5957803d923f2b722037ec126c5658a2cacf7288aa176a40843d33c533d54cbe951c81f0a95a23fec7ae9ce063565744b02d0e5ab34dfb06b2654dccbc2e4549c2de9adf390901ff66a70879df0cb2885dfbd724e151404b27f75ae7f86bd59d57c70b0396115f54c3e30669bd44f537a1f39083628ff8acf63246b0538851a9bb174c10e89b7b24127b2b7dca3e9302881369111f8e12e3bb56c8a80a7f4729fdeca7492beb363219ccc1c05e9bbc288f84d414ec954ff42dd30f6f7bc87614fa781f4bba2f394c0e2438c395d29ed85dcc4924aa4e24bdc8f3502e0c31d48078fe0dcef7d8828a859d95e88ad069d01f149baddfdd0778e0257c6619bd8e268453a330be071909ad98fe5e539b7d971da4f020248f0971b9e0f85d85d13473e37b29e025f4561dd78654802710efe372ca1f9b5feba23a80ff6327c1ca426b6b12cccc8da0fad5183470530b1f1c7196f2896329d25f0f64273ee220c9c416cc4349c0da98fe85035a05472ebf524fcc5f2e6dc12587c474c43590338892d3a791c200e9d5033a2fef0b20d79bde58d5d2f1e87b4c41c6025eb313a21178c0c2ad7a9aacf3aeb2c3d06600bababcc4a63cd22c50e7f6810884b6aa3b8003b0ff1bced2f0bdb516de4c5bf061ef29a0e83cae93dc21b909ad9155b97ace819e733e12ba523ae6c31e48722af041f07a919d43d06b9fab1f9399b913f9d20925e3df98baa6db00f876092b4e9e610b8fa05ac2b023de54e246bb766cb0d80e01782726081338257388d9b8ecd1c66a4b4efbe87704834c68dc908a033081ac4d190ff8cac7403bc20e12de1aab0b549c8b31314243a173721439c02aede1498bc63984aeb5b502187cd09ee0c52604d29be6f5b02251816ac13073cac4a6d5775a34e8781cf1a19429b27cb2ec5f12b90ecb87c37dfab05da0faad252e89d664cf917b89162d63307a8c8ef320abaf004bae7460090be3c3a86eef761ab08ac6b1c611c9069161ac210c7c074d401ee5d4f02b3e2e19affa7e9dbe688477f74dda6aa0d4b8697999d7dc8e4eed202c6c983246d411c060013581f79106c55ac3b50fbf0c1865a306214f8d31fdbbb76caf5e88a78c733fd9e10deb02dd983ea188bdfcd32462ba0f984761c6bc29bfe6469f579d008677d9334ed064321f16ad70d42f509eae246c4cffe8a5bf5dc2d171fa25091922eda5de00fbf5adc24bad18c26c094c5f4307a3c8560f8e6382214818523c28799e0298e081aebb629e1884071e7bed2aa22ec292e09d7b9e170c460419fcae2d27e20bce60f25860b479a359688464751460b5b4be548b7563aa3f9a6f1e3b67d2814a143cf0c52e35125598993d718319e9e56eec0a9b72354902a781f7e105fb68a47a9b2ea53976f933d297a463c2e2885370d6b004a46d6c5eaac3ee2c74b4215339a6f85fe41e424acfc4fb756b15fa85f76039b46cb45f5a660ba2a071909e86d33fd6bcd70ed61fa4b95cebd5bd29e3a4e75f31d41c2cbb60e9ad1a300b9c889ba2abca568ea60dd1941aa88ca23fe8005356e7f66dbe088d3dea09232bafd7570f17b1acbf0e358893b54cfc36f03509ac887ce5f4ac35e0c98dacb48640ed1a9023c7c2685ba8dea7892d2c133353b1ec7ad4e243a6cb9ca56d6dc06c16207b3aecc5240a18fbd0091d93511680451dde121db243c7128a2e8c1f204007c650dd20b46cb7ee2b8d04a4688664b299e3789e603d0ca70db33636353ee770f00c5c145fae0856b44084618d72fee51927bc4628c4d0e4a4cb50162be8ad7c19e6447b1a3ec30f93258112b20ccb2a76e2827c5077aea8ef0fd0f8311d80f0e5285af6d877b702f541bad9293e987ec23e472db62a80f4673f29899f6e701d36d1823944abe37ee30283dcf23c0720cb5d1795eb64df267f63dd9b3beb1be7074806850cad4315c43ad9900082de85be7c0fe8195c8596e0f2c3c589979492fcf9006f180db286f8912625782bf469d2da4bee4fdf48a02884bc4010ece7c939fbdd21255775a0b8f3c1bf4222c1fda1b46b49e1867ce2d6921f526a73e764daf8aaf388691f017d5710273666141fc7cc86aaf8f38281f629735a99755adec85652f1e3e068405a09030fa01d48f7b61b3ab45174d7f67188507b29d98cf383dd92ff0b468cd8ed9af0ed001c059616c47bbad96ab31057dc24767862fcec3b1363151b5539bd872e007f8730199172bab22aa7cb0b1a4245ea08c2b2252afde8b1878f5d04ed340ba8ad662548a90d7f99ecd6d7cf92d67b098c22389d8a580f6e092070cbf958b713ce7407e8e3ffc0999252a9ee6bb6cfd883c7d252d74519ef2344622e413284f8b6d271f8ffd63d56b38ab5a4f572c8f3afdf66cbf52ee937d7168e72e2478d606b96369779c5cd9e4835a8d94fd01f4cd87b35658eab31163ad7ceb9ce4920d8bdb24f836801c10d6104bd848098efd777975715c3280fc3c762e9e7e465b7e022140f4706a31f9fbf8b3c51f392700171ff3f498d340c23f62eca8a882a1425fc3fe8b5dd909a78ddf9c0bef279c16cbf3c269d34a7dcd716e82df9d62b284e1a4f5f0a6ed4bdb936737a74c9ad4d72f2c66da7541b8b2b41cbe13315502ce9277dc84430c7acd9e95880768489eb098ce80d0f5d6b84b33e482496d9b24cd00c89e19677fb95f4a8ab969a3da9bc1c8fb6903597bb0780d48ea1de0fc4ef06bf19fe653ae17c97a18709b88d3bb0ef92cec05cc9f5379c76b5e7e781160344e9151d96f4aa224e574f105a51c58a1b3f1cb2b06cc09cc5a60d5ce380e4e676875e2d25920efbea035e4a0c85224ca80b1c4fb1f1a0f2ee49dfafd8c0624fb586aa06fcb60e6dfc189801695498ff208b9ca884c16e1493e44e90a4d64c9175c5a6c671a7645e9275bf3fe5471e34fc3d51db1d7c036a154fb7db4416ef83a7e4df4013a6f6f4612a4484e091856bdf87b3e69d357f9c0494b57b7ed42ea847b02923fd87af429b53173c15361f1de05e037f7c709e2f2b69fc195d27203a41515f863037db6751f96eb7f9218b5ae2afa6cbb07d92405f3ca6acf04916da385322129bce3f0416862273124a8d9d1aa56d11b07e1aae0a0887090484bcbd1e5a21d914782885363004539b6f06e5cc9e3417177866e5a9a1e2f54378cbdd7de662029d025b5cbd2d0f66cc166d1e9d9c76e8a77ac9f7754a8535d83f3ccefea26f410360230f20a5c43b91afe5161cf54c841f10069297fb13014efd3cadae75b7345b1c26b65080c3de891a62c59bfc3fe52699cb711d5bda78db832034a7cd227b1df93d9a06c85c836c6f94c29648b72a4bc48b30620f17b2d896054940be2a0c1d2b0078c567f7f145c58f83b5a8e2d3feb1163efd57aa75f950f18fc3bddb6317f97c95ac1813073483cec192adb397b33dc9cbc546b1feabd02a17d824433887c8d44f5f1b2b5807e1b679fcf74ffbc75abb1bb0548253939c2cdc719f15156b41498d4e894091ab1729a61cea0f7485773e33010d8047990a0dc65b874f56b314807572258310ed02f4a7618816e2d847092f29e68c9376ff06fde7afffb90b7c3e6e8819c9e9fa28e51563148d155e331e416303447406e0c6e1b822b3d6bb4022b35422874f654f7a119813ccfe751a41e1066073710fa661681099940ff9c44058c8b88b3778f4652de8e989aff5a03f83ccbb18e906d25d020ce3c9f680d1503050ea7b1bdbc6dc2c92b9da609ec09038d38cfd708ea7209bf6163a7b7629a714f08fe199cddf999fa2986e39501d89712063681e14de1b969b70f7581fa7927671fad6bf11d766d8e4c849e44d9564f95d0cd743bf3190c82c80e437d73c85be4f073e72516ef38792e362a5680acef0d96f13d29e44751bebd43b9d4f1aea49882521cf98fbf61babafedf15c64ed5baf3ffcafcaf19ea4215cd59a0c2f353ec4a22c269b8bcba280cce2d073d9c3be4475865de28081c8d0b29e8dc79bd26e374bb4ef3311d5fd7789cae2b691a7bc7f51a8fefe28a66e374be46f37141efdd318e2ec97ab5f7f873e0b965962d784ce14a7e02d3642a62653f72c6b223161d60e10c0ba7b1728eb573ac3861c911d61db0ec106b075839c20a3ae5c2da910b7cdd70e1176563d1368eb2e1e81ba3d910ad4dd16f8afee6e81b44b559948da3d83ceae61725df54d6c7e194955409c5d807d88952d1a1782914498802eda4fe33cc84b35d6833e76cbce050df26b2a7cf7cfa620bb87dd16ef0f9e054bdbdcb83d0d757c2b1469ab52804e3da20994dd4c5867fc23135c7d77dc581f10ba1aaad1ac94668570e44ed08f56d28a16c8d297953a9b3222efbd604f4974fe409c720ae8b89421101839c551910c665228d10fb4cbe975840738ab2da185a38de47fd54ab2509be67bcba95f355559907dc158837acc8e986a33a0e9e45cfa476f924c8414de721cd8b6e192f5fec13260fdfac359dcee50bccf396fd870f0d2de49dc254c61a892a45b9db9a53e7798da8c65c556d738c41512c4434954fa1485a4a3dcd554f83034caeb78772c56afb750529c560a538ed08214bd59eaf01a4c33a29e5747b481c12954247eec6143cab93dc3e5e16024c9a12b846a9b597e6504989eeffcd943902f5335fd1976826429d95a42b9400d428316cf3f06ddc77592afdeff3fef999e96c95f0fd9f67b9ef42a37e1f56677775f37b9830f617d4879f2ca529b0dcb6ced693a8bc5a7cb721ad67469d56173c2f72b3a8e36e2ddc1cfd2f4a6b833c8b0fec8cb8d0766dfd453a699e2ec6fc697a7c6bc11a41d467cdbbf4a2742c53bebd2df487172b4af1a3c171e202817505ba4378788f8ff9adde7cf0b122f623a4dd87a4d7c4bf59aa727910d7898653ec47bfab8abe1ea8eae714474d0c5d2d8b1f35b1b0bdb193eacca88d109f72a12c7ce694f7e8657aa608e287d4486f5e044c4e1f10e990b182661407f31fa2eab3034a79e79d24c3b79442701afdede36f3d3f49508ca43ccc16b3a3845d244e40dd2f3a2daa1085b43b4468a3242ff197141dd1521335fcf63dc48f21a403f02bad34e7b0fa06824bb302abdca8e4487687e354e34332d6282653a5116efc9f536710bc190eb7d88c5a3c8122c9db53cdf20357fa653bcfccc00df292bc9326f2d106f91604a420326c40bf6035cdd6d20d26c10a85991a524f0c463a6d66330ac05cc92819a0141bd800be2cd9354be9c590357091228c9ec65714db88440380c8280d14e41d85ea788db586b2508ad9a9a1ba08534eb6928d20a34c21d4c0862a6c46699da2deae7d60409c97a1d0e18fb276366d4f670203dbc7713ac39e9d244e5b08a8f728d22465a61a19f654d2c46f8edad36b41354ba72d167fabda18866f790c92f051cfa422562f24b24d98f1c5020232178227e960be05d4774d128040d3133a8edc4573be05d9f9c3bc2db03f4f55fd52716a01add5eedf37ee18a1b750f6dd2b8c530d7a2336c12acea8ff3afc367b8a043d655f347fe9ce29894cc8c7f3895e405444287f14b42f2f4b3ca63b9f17a0a0c4192528cb8650cac1c99a3b800df83beb9d4ea8259496c384ca85b89c6fca3af09b123002c0ed0add575dabe44e11dc4d0926c1b54f41037438c9449ab6c9360d725b9b1812ead8a47fe9a659ad8265042f747712a48b15802769188852c55a27dea3fdbd6fc9134cd1bb4b4135b935fca434921f632718311412a375e5bf22d8d59b0c2e0e77221489ce758d82c47396d7516712b8f637f09684247d4854d439a9a44ae83f922c0d6b761dea731b391af05d6fd3b1d3ac5fd41f54453fdd48111492496080cb2a1b1ce414beae2447a2d9f22dd025fb1de61e66fa550ac378bdd2fea8a5c7e73651d44ff4621ed6cb75a84dd90e839447beda52f8216dc79885e3670c1a77518d69728fcf1c89df5c2d00235ff7b29874d5472e488c79a482e4327d23d72e4133c93ad1dbe30a922cd1d88e2baa593cff86a6a4a9589d846f3f742c66e50b226305ca146416d3982884a0c0137d856727728166fd462bace5840dbef1d42e6be6e3f3ceb68ff2b714603f53a343069d621235b08a20e84a202cfe7f10de9e3e0446d91ea00dc1faf4e0f5f46d9c578e28e2e1ed7091e4ca928db625fedc28cb2988886687982715d959693932e808e4600150952180974d4a394c83ecd3ecc3adc11b64336497d94299a55716437533fc687c23af2a2dd28a5c91e89ae0a244723247bface9bcf7fd712c9353555a09d4555c3923c940aac94d6aeb2b5e035e2666c9073a71bd6a923ed5caf7f2c923040989f9b0bc7aea331c76fafd863e85e5b5c6d33ed568573dbd89d0211a0475d50b291eeac48c6801ca47ecfa1d7743bb552b5c99041296352fb329fe8b03bfcc1c005d0e3a66502db81b5de17f0728264ea24429204334147a613a7cc1a72ebc9673157c6f180f7fd1f12526d4402d1f6d3059a40516a233c5592eb417b9e64ac350103ab9341d7e9a7c0d17b029b88d6ee15b21860380fce52a400308a30118eac95c6f20115893c006581e49653476f800953137cfbc86ca9408f91fbdd3a716f77ce528709b67c6212f8bcd807ed6aa7df3c61ed7bdfaeb728b6f10cd604d45a7b2f078ce3633c6b97b80982898a5b610183a4f9ee4de5a6d007f8f48213885eac89ea113eec9a857c32d8188241a86803ef06a53574bc9cd200c4fa3b06b5ac6ea77bff1a15076584d4940a953c0bbd49fc47b337f63c0ae1532c7b67a0a6f572aefb55d54ec97800885a5a8d8e466e86aa014df943f0c44888c83c04203a11c91ed63308c528428d7dddaabbcf90887fc3349ee5be2e5d4729f6d8feca14f056516de1ac8821fd2887049311515797c92728b6b25ee8d0c49f3e50192a3e30ab28330b1a4bbec2e707964e7657562de74b080bd8db74d431f835604c3a092cec162ec3b4c2816d532b6db0513a00a2bc792baaaa072963dfa4cb1b6e6676db6177b8e28b229847a4714855cf6988dad01ab2af4353d6453c94fea8cd06558a4d4e1859eb485c48e724836b26f8e7ca09357dcbfd88fa1d33fb3be22041a56047c7a0b1793e527cde1ef404e43fe405bec5b0b925cea77a033de48bc4e92a865a1e773751c9c14ac2f17b3bb0203bbc866270e9c474d47ddfb9ba4806ec269a70fddd4bcb100f28603aeb33647bb9acb19849f0b879d612369190accee0367f9f0ad82cf600367f44b3b5470aea83ac076f4ea2bec116618a0d06ff8368ff32402be2f80f8cb56291f367b2711449eda2023dfa49245d36877ed75a64a5599a057b767d38a1b380690c2fab9f02d80492336c7b0597bb06d19ed213eea192df6182b8986a31df6fc494f4611ae8001a8990fa33421b05204638d63b2b2ddeecb279fdf8127eef2c91b2a8f9b102f5b401505f7016316bb99f8b9828a40679d767fca7f7458e858273846e89a73f41c38d83d5c2e94110abe8e1264b4711a02e4f07a2612ebbd1e54ac3451569ca6bdae37039217cf3e4eb7cd813f87fb4ea880e3e65a14098d8c5f0fb4672005a4fac1149b59c9cb162a131c94164781a00318967443d10caae6f15da81630b185828a592c0b1e2e879d4eb8fb8c4de639cee4970a9eae3f6fe01988b1ae7ee4b184a274f448f4dbd6639a94f73bfa26e238517dea4c4661b6b1838478f8fe7fc088ce5168068a73308e04a8cf83406603fa2e4c97a09699cc50877888af06aecb582b884ce8f959c8d138b888be037539363a6de2861b0df3016c1903fafb11645a30d819a7036dab9a05a134ab75779d9d6bc0f2e01c666843da549bb60a1c25bc219eb06530849899cd658b01dc07ac1f1c8007b461d3b229550700df9c26c40108241c732c4635c05e3e46b40c01324c1adabbaded2d654a29c9300626064006222ffc904848eb1c79a2e7edcf8ac88a7d9ec4e2602955361459dcd53872cc56c221aa73341b16a9de9538ce4dc51e3b620d69cca8fc7153b147b852e547734415c158e54773c426e28835f438bf8717236a32610442e802257f7fb920368c5a779668b1852de4d4e844091f2d9c30e29e1a9d2cc1137d50a3931c25eaee6c92e58931c68d9a6218f5228a1b0f83dda4dde1d3caf7b7f2bd701f336170038211289a8c000a272478252981e66dd96ed1021b9fa01d5439c20c57ec40063c5802089240827dc44a66b4c0092960408508aa1fb4e85021b410c58f155bf8e009438800162fa862486708415358ae8655a92af6bdf878f558b71530b161684a08a080418523ab0d08f4bb7f77fa312b68b83bd20a345c9c2abdeeeeeebe727d79766777f887636e8a1f50fef803e9dded3dd4b269b54bef6e6f3090880206182d67777777777777bf9cdedfddedee3e3528507e39a79cee3ea79473ba7bb7ecf6f6c69470051a193c81d6ed2e99999999999965337377b7fcd6a240b33ef5c73ef547e37a95d25b4a203c39527637b333377716822f5abe90deddde434c44e9a20b1b1b274b0cd5e86489292fd4e86409a04a3bc53aace3e2adbbeb8ec1b8d170aa914129a548a1289c0f252af372d7042ae50906d99330c821eb24a9a858519175560085bec80f59a7081a199c330cd26e63d65906bb2ea8ecd84974f8c421eb546769464c21c414d2bbdb7b280a215148ef6eef21160c61c1faf6902aca1552908214335248ef6eefa19eb3863f6d788b0c17dc5d87d6b44629d0893284273c410911aee0828b1a687145139a105f8bc3466a01a5cef3c3021ce077c7fc60228efefebe96daed1b49090dbf76ff37779605e154378f1c3c6af80f82dfbbbb1b5f74099f2b96b004200061c8979bb9fba5866e66ee76ef6666de961abf5b4ad9bcbb91e376408b47285132a46468552ab659a262940a88922125434a866c6e6c8edca89454515245c9909221255e28a9a264488b2b9290842af6a60a2abdbbbdc190bf19a9bd39a3dedb5dce193d36478ed9c718a7fcb09b13fb4e6686a1eadf55cf89512726a9bf9f6055fd379e1a6e40788e54b9b9948e40fde3131e55cd7ac4ffb13d269ffbccdb9efb19e65edbccdb3e8e5e7aa2cf3c8cf3e66fd3ebaa795dbce13ff2449f890bdad8273fecfa09743f880da3ced00826a57c203c47788e2ce703fbe559a1b00f08cf11066305c263132b101e1b46491e1b9e150f109e1583b102e1c9613056203c387cc4796e24109e1b1e1b1e1b1e550784e786c15881f0d830186b90280b7777cf8c40639fa477b7f76481075c2e2b6aac7097deddde43be052db4d0c28b9a6a9120a0eea489a02a438d4e9a50d5f91f10aa5a6f467aca7fa161c3a8f30b6fcc9f46aa1130d6190259a253e70764894e58fb812cc161547f38393b497a4e204b76188c15c8121e0663ed6d4912d6c969204b7270705614c8921c06fb03b2840873082ea5c43029a59459480cc330296973320b29a5942ea5c4b028a77477e95f90e6a41d83bb31b83d737641e7d7b91361d088f7507e77ad059b925b36db67e9a1999f9dc23ffce1fef06f94b1081aeecf142a0a883a3a32fff00ffff04fec41dd9fe9a4dc9fd58124c2e839cc3ad187e0e8c3a6fcf9f9913f3f3f3f3f3f510a0de3cff2ecc79f1f2643abf209fa614afc51ddb494ea242460edb2654d9f3cd05d7786ad2c01630c5b1d81915cd0588c0c75515e5e5e0b3818b4bbbba5b7f4c602edee6ee92dbd494e707777671836a54fe9d817b472f76cd9de185683d5484123f38a57bce24c646a914cb02b5ca480865ff35aaf644169d7692ee57f9284936594f2076a45949c949c04d1b0eb4c5f632716a32736b19f69cccb320fc3b0bf91e9217aadddb3ad04d4e2a2fbcbed9227f69e6dee85b37e42f41005d1f5e6337b0dcc2ccb1ee35ee22764d2b8d2b22bdd911449911449911457e2fcf9220e0757a9324ca64ff1b508449725c6e83c621224a78c9fedf9400497a56290bd9a19168bc51a8d3ea0da9fed89a2062e8c3e214b454b8827e401a39177b700d1b2713e6ad5c8081936bd3bc69f9806bd124b77ab3a25a4a56aa95aaa96aab53388277e295c39e0205c41abfe2dab09d522a3fa1b49194b947850e2c136d65ce98a4cc452f24e31990c106200809258b29d235096158eb422acd46026131353323295574a5790368dfb354c3c647b31d83f84f3f16218aab61b69041d72ab59b4dbd70e5bc987eec0fd10550e87c60f51cbb4fd85608bc17e1cfd34bc8e1593759b762880017a38e1d01312fdb27b10c0f9a3389a1cbca1d88613c0fd002b7fab8282fac72e06fb77703f44955bcdae99da630133f8f841534303901a8230a0010e783109b1e18607e000811c7418b2030c0f312b2a4e4527acbdc1914f1c61d32c26471ca9e12659d694de2cb9a436a62af14ae941eb588c0bc23fc322fe58da6613c3be1aa0920fe5c9bc32ecc42a5182a8c4571c52d9605428430299ade9940ccbd8a83d83000101ad7657946b74c2c48d4c7b6ce1b6c1a7fdce24aa2d7508d5e60bf3104ec9b0a352a93a60b3eaf8cae955ede79d42182595cc39a7a8ce8dae20505c41e6cc0c9cf261b39e73ce193dba660e5af8b453f2a911f4288360a770005540c308640314400d287ff82d7db3e69c406950cf408b354a3e1486253434c508838620682326c747132bf6827d0cc2a8f9ad28eb41bed809096d9ff2310cc32287cd30c83981beba09ce065b43acae6fbc41cb1872ff42d9043a0514bebb3ae822fe01ec08118a29a8a03fbc2a028a3752e032a73625f54ae9f202b2022173ba03cf75b76d3f73f92f7f86f77351b62267296d8afa73fd2af6b76da3ddb2c56b99a1acfb655f8862aaeb934b1dd12d62742550e60fb7e82267ea3daa51d6d85e4f214ce0a2e07ae87e8c379a68a14243dffafd13d5e839cf6021d5282327048a96312a63c99e7fbecedb84cc25894d46f5f79731d5c5d3a264f845887c5415800ddc437e4acc24bcfce06aaa5bfb7be9df2aab7b35529b2084eec5627fdb9af64ae9eeefdbfc4259e507444bf52e341a986ab846aa6f4705bb6f9be47cc8f67e1eb5bf22b2723e649868cd4d7a0a1afa14b4bd37db3c0322b6aa7c8f359a936831ee8819af3717c78e65f9fb2d8ee8dda2786366f1062ba188cb09b6752af001561bd44bb3ebebde3958460c6d937df5f6098788cf24c228223f0045a0171c583ec6c7f886f8b6d5a77d233de68644ba5ab677d00f44b62706f56873df350a442f6a1cf275ef00046d1313a82a7f6c56931328e962a036c90e136c77776f9c1821822a43e5173541b38ff12c8ffdeef470cfc9091a6ecf3ef128197b88a8705beb4a7281f945b23a5adf1d5b77e34ec6e2458e0145b6b20e83bb3b0cae885656381c48868292b8a9e14aa151c30dda292b1c8a752a0c6ab8d59d50f4331c744a8286dbb33d51c7acec2bb453469826b78d0bb2b27d33f106edba461cfca21d54fe9a9608b2280534fbe8931eb3a14ff2e29cdbc3a998171446c5155a272b2fea4aefa9fbfc2dcc0b54f7b34ed1ef2507fa2ccff211d1aafbf4fb5e72203d7dfa11b140dff6f4e0f8c5c66504743f96b6a0f1c99227aacb13f46f18ac6154e5bb7b60756f7b60a8cc3160e446a45cd2d3c362396fd4485ef28929f9d428f9947c5c7a4c2e52947c9ce8ec11d4eb0d39bcf1b67119d75be4dc4b3ecff291c503fbd44fbdef53fb683ca06157f7a6de6053f0295040b2a2b513f485748a7e9d62f9ec232780fe3e919b2fe3de1b2ad0300e099165438cdaba7da110755bd27afc33d3dbc6d558af673b99edd7dbfe860a95d9ed3a5066c5f4cf7dbf793518eccdc4a08d182e09345691fc0c08991839ce08da3b1c6f5f68fe9a7b91dbeb2ccb9e26625ea8533df3b0e9c919e69f9e911abd22b2ca8fc7125e480450e5b542eb263cfa0a7c317880bed0207a7ed1bf911abd300b85086dd416456cfab737d35fb62bc434d8589041e7ae0a943f069bfee6ce324abb2e26823518ecac8a160b4079e868abf5b65faa1dd16cb0a0a321cda6ca9fd9d1500ee9536737524cd10fbbba6d1cc463091e3a5264104e0da5942a5ff3666030ab9285d6e0d44a34712acb21c328466d2fa58d2a57a45701ed318c870ec6711cc7ad17fe0684aaf6dbf69c68c43d75c463898969abc9c42e95eab55597f311356ff4dab7ec91b57127346c09b2c9324aa3d63dfa4299da210bd5d1c711953a8aa36ef4244f3b711e0b716a063ef58f9e831a0abb639b8aec82c86fd468e5fb49dfdc87319917e3893f5a82a05a01d1cbd7b4dda4ec6ddb9e26d6eddb34ede548ab44f0d4aca1b038e447e9882714ae9acd4c7a504c6fdb0a7a145ad1d07582b6aef510a39ad5a40fd1ee68e3e639fe5a8f46a3a78975f4466a4fd01c98fd940907c673203e7192a3f0b6821ef1b31b4ead8aa79cde9327b6c25148d56b49a12d3feafeb55eecd0c89bf16660100a83fddc375745d0d081221684c17e01dc80869249ed17c26064c2a9215107f60ec4a919dafd0c1736ae5081faac16046362783b06ec32193f4d8064cc70a12bb9bc98666cb36adde6b232b2b75c59e1510d89a8fc41c9322fab9476dd7f4c0c14d992515c5e4c30345e78efd53f322e74d3803145983731ccd75fffac931850a945f82404daaca86329e5a44bba523ff4697af19a3287e28dfe928fc92601a687015d71ca027deaa863e30c7ff499be96affbc28ec6cfaf593972d4b0592f64198d8fc27c5d277bbe1ca84f1135b988600721a2a61083fd3cc4280cc693417dead74cde14298b10412e224a4a8960bf1cf2ee93ae78a385f08660d0a6f64f1583dd3795b724a58b942f529aa484919286942f48f952ee7c75ea25a7b8c01ad36dbcc383e883ba1fe3f2a8a10c7579d47d31cd181d0684212941638bafbdb0bdc0f9e028eedcf2381fd39ddd63178353d8b0eb483793152ada69739182c6b0b9f4d018381f5a90e6d2f32e516c0fcc9bde647ad3bff0a68f3d60beedf11ee661be215e7280791a4fe323e2853f27683cccffc37cece17dfcfd0b1e23e006349cab8d8627d97ba161552f35acaaf2278318ac5d0f68d82d8d8a0c582cfa0f82425348a84e61948c014e4eed9752a45011560b48bc381a7775dc0ddc83bb2a68285d73c5a7fe2ceb56bf2f988f5c0ea607ea148c8c25d0705f41800289265520b1e3535751078b53fc3222a64ca6cfe72a9c2b919cfc71cb0634f41eee0a747ee8402d1726d49f5f28228a1a9d1c2154654b3ed1b31d6f5107b7fbda1df3c3f6f5d3a75e2ac49474451dd8378b88579de21707219efa5dae560b08885bfbe2d60bfc5abe504ea9dd7da19c82dc825d928b2953a8cdad78a306346c160090a086a20e30e20e6e2d8efe1642166a83b5fbd8a7b53bba8a88a3bf49d58506346c56017ac4d70cb045d3875788291a5ff77c6198be8e457080b94242b9b5dc6a3593948c8eb9d2c1f9983873357356253d985a42426d5ce3b19590d070ab728a0c8a326caeee8e3fc09654c056f2a1fe33dcfd2524d4e3beb21212ca7d8909caa0cb0c8ea44cdf5f6c569f3cc2a0ead188fbc23d52973fd3f7cf9cce9a5b3231335bc987d6920f057d94a8a06bf337f146bfb600d3e75bdd22a366b8b0a8bfa4012bff20f20374c2f4abfa6ee6016a7c52444e754abbee1f04b5066c251faa49579ffab31212ba7d89099afd68a471949cca429ab632fce316b704f3d9c92e5c38f9fa65959050d29798a039b5e7cabf8484baf0252668b8af9e954fedef86b25357c560f7dc13b4e5c366b54b0aa382a20e197570a760beb38860bf8c1fb55ee32c5a3aec3664071e7af02102129872bbf43d64071e7a989b0f1190c0045c5cbe38a79cbfb3eb580637f2c2fe2975cee2b33fdb64a30c68b8aad9e26acfd7abf64f57d4e1df3f5b5118f5001c2090830e4376f09e9f78a39f3d6769cd97267aad7f7a315ffd43a28e51e50fc4d414e2e6920fe52954fb6384e1b17e34b1b28c15fbee9ec7599d7bfbc426fdd3ac66c220121a39f57d42a27dba097f2524a80b5f3a8286fba25dab8b57f7da72bb9c18e62c030b744612d590971d5e5e6685f1dce4c5fe6c8036345c958b17762d7d17d8ce0bb3ea82176e95da3fc393e185a0d7e26d1246b17cefcef7423fd6966d523b46f647132bedadc2603fc90ba5505d9b9b9c6fbd70c2f433ecdebe3a65fa9ac55f483f9742d225a9d4fea46bdb98f3c159e63d9daa61c3811cc85d2bdc8a17dc31b6f55c6a09092d31419dc573a0226818353a4982a7ca1a2e50ed47f5cb20209c19a559eda71cbacd629bdaee5262add5ece914ed9940325ab89543c355cd559f7a59dd56e1d64b34e216bb7ceb548df66952fb1b4a6d186ac7d19ceaf2f4770ea3244be1d4aafad4a5d5ca57b5377bc4086a53f79de37cc4b9ea54f773d5a21202c3352bdee8778901ed5f15b7f6a764af964b4a615450d421644e1be6bc61ce07cc89c39c10983387397570f5aa539ed3d1efdc86cd6bc987368b4f0dd6511028bfbf108551fcddb0317fc401025b649400361c3218360860e096c33c6d3ac818b6213e806d87ae988d8d072e0857ac87ed0607c448c530021040b4c22f3d00dc8fd9ea54d62757cf6f5fd3618bcd6a563391691683fd24269a95a2ab54d0907f5eafddd99d7d09f8cce7d31aa9919bddecb97d577bb4813b441dfdf4c2ddd9d5de0c55794d71c5568c52e7fc9199609765d3230a1b79410c51b316794174cd58fbe19c17d0ee0cc9c7bc2084a8d8871c0802abdc2bce321a807e9c318bd26dd4a5a7e4b3eebe1ec456de27d195c36d85fa84054295df07a12c04df6384838030ab33de989fe3bc38eb615f58e3ebaa7ec4199fd6f81e0251f708a388cc9df366880b472b00218c8cba1f93e346dc3124e2e0dfe7624a668b3a80f0321bba8fed973188ed7e473c9a45bdfcf0c90531f2c3f7880cf2e2cff9d82c8b01b9621983ccccdfeee63c72d4f93db7e5caf7fec4055d2a756aeeeb91fddb2d478ef871c1babf9e7bdb1734fe4b7c890fd6f92ff1ab01acf38bf18a788dbf358e3e7236c41e339c83513b84332655a1e10bf6f1c16f6745071a58058803283c1ce12ff2f0440f3df2a544e56aecc1ebc8039ee05079822354e3139c2835bea8c6273840353ec1e9a921189fe0cca072353ec149d2e97c3c68228f3a768504a3da1935451d71052b2458255ad448181657d440ddd45748449ae40de993ff8a27a44fcebdfc9020998f6514983e8389213f60de10061dc33e210c3a0e0c7a10067d981e919a2450d16f2f7fa66bdc9d52703fef655ff4fc435435b9c1b084fa9f8068188184e030845118110afcc0a817eda3639fa9d638f234f3ba1606fdd7471fefc41b9b42c04b880f3f147955f79c55ad53622efae84f5bfc41c9022a67205935b451fdfbb5de1d0901c39e33828a3e7e48aba8d6302a460da358aa63b58651b4fa8719a8f36b8474f619a55df721887d613634d2b60de38078b2d6306aa586515c0da3b6ea5fc328ad8651a31a46895e681855ec67c5be3003bb8ac1d2b4920fd89e93e2fe68fc5a4c4ceff3f449b24146c65bb6d45086f3e12244f98756391aadfe582136200041b8345ebcb1efc51b9968fbb1394dfcc8d1ac918a713494926c10713458f51f71378c389aad2491bfb6f1b66ddbb6315bf19f619a4f1bc51d71bb9c58365a914f333ff94d24748cdeffbddb525c7cb01b83a4e7838dee2ef3f2ee322fef2ef3f2ae0b16d4054ae782056db942d35c7a688c16e37fbb351834c2bb2368ffd0c42677f79ceaeeee9fb7732f37096a1235dc6a7b96755dec22700bcbb2162f66669c5665666666de8da168b1866f5bdd976952b7c6113f35fe787f60cf2ff6696b7c13d419dc9fcfd9cb6f7b7112cd861b6c60928f183c40399af6f675778fa6953003b599c6f90b33c0136450f6e8a7676f90318b58ce16f91c828dad906aa4236da3116f981687c46e40fbe5afcdde708a7b89935941b38cd2aefb9716e814113e4907c453cb2deae6d51069161041f934a20e1d9876c7cc731ec827f9222f870c8f98ce32950d83b29be5aa3adb1d2c5c6440f7e38333a6ba4777d7de9f396ff3b23ef96bded45e14e0d3fccc23b243314cbeb6fe8519a8312bf9bc0d4e51804f44189c60a7d6065c500573ce1762084ed9e089bd058a4c51c6222f9b73ce2712312fece6ace2a58607ab4b8d92a5741c2fe924091ad2796b69186c59c841415aac116231f644c15481132e55489728cb5e31b4cb8965a2d16c49d7cb67b8aaee3921099bc553c6c49c96a0a103f9d6fd0b7cf18d4b09e8ba7405f18d8dcd11579094bb0298d22998dfffc83875dd9773ba67a7f4699f469f68748f9066f589270a7952f4a2f2d21cd5eedec4304df462caa5e0c550d01dca64703b94dff4304f63a4b99751e75440f979e34a54ec10ab3624bcda59a9d3bcaa193b5efbfc30d864bf66c2e06cd6b6d57e6ddb5a1c855bec9a51635c271450e638ce879c3edc3fd03f92b6432c5d306f82f1765f432d2dcec75c195459a90de45554ee05d8345e807129c453d757f4a04e99be210ff217501725746fd86c2e3e35c49fca1bbb309ed2a79ea6e629eb05d560bc66c2271f065f58ec0b67c5ce9d6a6dba8c83bea591481add28e7a37b8d6340101b46c500add9cf28fd08a2c308a366eff2a5e7bef42ee3472fe35b1874a146ca20ff864074957fdaacaa0aead494751ee695bc66c91b02a038c6109a294b0c00b4c898e182bc912b7973d331b6920fe5958b12ba1f722bee8b999999bb65aa0680ade443e57497da8ce8c24b72141934656954aeae546dca9d7ba8a46e3625b1746a4600002800a3140000200c0a864462a168389e47b25e7d14800c7a92407c589a4a84498cc3280c520629030800000002048080d08cd04d0250a31098e106c0adf602ac265b1a4c07b3f479c66cf619dcd49303f938dfafca7d9a4e0cf4458684414caaa78842a000bb7b71f4485742a956e6232530884323317100af3d90f347ab5ed6d25d3dd9b87adecea6c5e87594b6d1838f50ec874c23f185f32c8f872fddd7c1654e8915b834d788361149ee09724d8614a5ff669be3042b66303ef4241834401c167f48ae9ca6c74a67c7a8920d7eab4ea1e00a5bd3bbe7c772a8027b441a109f57a60ff1a979461a860726939df0e9333d73a45a5bf28cc7ce17aa266109d2a74347080f5707de57c3cac26ba78d676a7c150fdb995f97406a1e622268d2133554e4eaf08f432751138e98b392661ba26b196e08e49610d0876038ea05b3b66d36c38abdbffec4bea6cd7e52abff6be78db7980bc6246b4c159fda3f4039054fbaa13da87a16497e251ae97be1b9dc79904db5e990561781ac95db096d503bf25521db59541935242e5c3012a7ca2c391f13081d14180ef9781e4ab847a67490b0b7db9f1e3105ea494c43ec97b35a9152d0d157488de65037108267c916b9c076b5615855ba622dd3188935545abb926864cbb1bdf28a6a588b5d217f58bb75bc445c9d277c2b62a270d1d8730401e87994c239774f37ada719e849b0aa7ca45f1114293072043a13516bd70242e019b4c17bde90fa6e0df44c6de4dd2fe7d9ad819e462c41d0bcb5a38945365161d4255e59b5829001cb58a832e8ef0a536e5657f85b812d4c0b017d0014afbd067a7ea0219355cd1339de245efda69020163d7c5baa5afbaf4761c11ae8fb71eeb7eac0dddd584fca5a5771bb35d56824b000728c5e02f7d4215ec91cd998b0ae469b15ae99dc845cef93009b4941a97dcd5b0c2d23b18bdf888cdb51f9476448f970e83ee57ddc0c34e92fef13a524505eb9039cff4f5d51b41ff44cfe887fa58750faf5ae01e3596f26ee1db70e9a42791322397f5dbccda2a713836379cb14ddff665716ea77292d8b4e9e554f7e04f97c225c8894c880ce91752ce26ba63492707200360de5b2e644d09401c96c73046a160b2f12da07568cb361e94ae7094eac14e33ff1f1327f0d5043b6f6dc06ff499daf706b2e7be1a7dfbdb7ef24bf34b6c43ad8fa8c7c6a346f9607759b9890bfcca2c8fa8103a5acbf917a132b5cad115edee21abc417d2b0cf9abd706cc424ef688b10128135efd9e9708117ebd80e2be805cd0952d6b02ba75653f4f08595b6e01612b12ed86181db35e6277e8e4d04543c8b691bb218553c5b94a8517c7560c5aed408ecc8aebb2d852c25a434ff78d789eca491b87eda1fe51a7fea70cfd69e4087e6197133af390ba55e0e30bd20111119d22872f15945bc8dcd49c840921c5ae356ee97a4008853bb6703d306c877cced7a48cbae4fb1006b861cfd1745771555f00c5f208d6bea81d56342c5a559a87202e6442e6cb1f1f4d44d6c4ef5b220fb6c8b98b9df34c632acc8bdb69cd5a2e1c49013d20ca2d1989b5f8221caa83896741f74f1a57d143042bed7338fed1662e548cc8eaa9276725b51ac66ff9fb3ca6a9a74e53f0b1cc7b6b00ebc5dc001775792338d703167ca57ff04637afcc1efc511585bb09a206ced03d7badccb5121e3532ecc5bac651175ba4342f705c3e2602ca293f484bccf7606b366d53d43f72f2962c836fbb56225084fba33bb0df158fe54a7a8d5d0a05ac289116689a7117c25b25dead2065322f80a8b988f6f286ed14c537184d68bdccd41573abc1e2a888004bbbd8374a21a40c6bcc0a63bdb64f0c6ecd9fb91bbbf2f53da936902efd9fbc244a339e715fa21245e68cb98b7179c97e17e31a79631f4645b634a1e6269319c36786732fdda54f3c0d38bb3e634279982086bb29b6505fa91241e57f6f741a178f956962e2b0a737ffa1ceb55610d7869c88074c401fb7d6ddc7ce81669b081ac3ff82e80010dbb671edfa8dc2c0ac9f42568468b0a8e34a124de91f38975dd31d8b902e37d87f9251968e6b03e0c09037feb751b2477053900674a24addac25e0040b8242527e8a8d7b88939264f257cb6073f84ad5e21edf43981ce1e4739ed71609fddd67df25a2798fa2ae973f1fdd7d66a183b257231a6e3af28792ec2b4a7f67b3e71506b263d31fe2f81b8a225916a9004b37f5e529fbeaf8d37fd7f243ed661d22288136fa8aab32b084d8f6602ebd85abf4f17859a1a6d876f418d4cd94726e6cfd306b9b239af46441788d0d7c49f2555abd07e669968b85fa94cfe6f957aed0dc6f166e4669b44c629a649a888653b4fc127fe51c7856c90b4d7daffc78049d12b915145f4a489f99e84632be896bc10964dfb5160c4a2743cdddd0e66257fc0899d3cdd80582aa90546a2953a637c204d658b4995fd34b4fc8c341e447ef9ee97946ef5b2c0ab7675ad68a4982ec44f87696d48f7d702583eb491b3013eb4907f4126c4e9e6ef83109f696c2b902e75d3ae37fc00bb372fe480d5aeffeb319fc9fee1f73751a634ee57d3c0673ba9ad6de7031a0e80da7448694154d539d53a678732fd46d9d4d1b783e9e283f56af79ccf7f7c66aede5e7bb8b72a826bdd32a800c855d2323e89636ba18adf62477b37ca7afe44289e369cfe15d3393b3e0ffc030060a9717248231416e4a5dd54ea7e7a2c68e815091faf56fd679ed1e16e159c16f4a077d8736d6dd81928844e3490819aed4616d2c50d588218be4422bd771aaaf8620722326f066357b98ad011137373d4b14f56aa911ebb194475a6907e0520e2b603e6815bd528056a45bfaa66fd4a58b5c09e2ee19321baea98b1575a0b3dc37ad952c8a98f6d221bff721f86ca799d08c81dcf0216930e2f94ec0738acb6670a5f1b2c656a51ad8e0abf8c30a2b3852e1dec24ec13673856974cb01b66b3b39fb4baa210ded68738352a2b051ae7708f7a958b93c010862820e4af55758525aacc8637c052982d5323c15b8481d5e20feb4addbfb5d4433b8df9024a3eea4cd2815ded4f69be5998e7e4f3c0d4e2f701805c53f55046893345514100f39279415b6dfc737add6c5dccd85ea91104f65c50bf2080fca0f4132a1aa3a4b227f7bed66a18d425866786864881bd33ecd84c87daa3f88410bfb717b7742fb94aeada8f9d2f45440683fa45cbcd1bc3def25ce0115b1a50731bec5fbc772535ede8e32bb6f7af85c85e417d05bf8510882cb90efce510ea52f9c7aba755d31ec73832a6a69b248df425b9238f738a06a7ad6058609ace5763ff3e83bc1d25ed73ab768b1d033152dfdbf581bd36c13b6be7aa90cd42c15580ece14242495366abd68c7fe92ec18d73d918ceb7dff1dc748abb7667d470a03126c272854b3abf1a109cc7b5d6b40662a34c7859389192645f652ea28e9a29907891338cb7be39e64e633d5b67fdc1b4b0b7f1ceb18311aef251d0ecb4b5808d5c21fc6c2630e3e94fc5a02ae3344912b2cbea76d693aa21e9060ee63d8825e59dc6184f12ad4f2ed48ddcd0846ef800b537fa705cc06eb542ab6feb9cdf45888d6d7b1c94e6b3ab84110af23d971f92148d1c281736754d5be1952ad08232a9b11a3f733718023fd5b3f4da237eec54a741e4233e04d0e2109f27b0fc2854016d0e450840855b99132c8f35c9a5acf934a5d984b3dc1c2d99695e585cfca3053bc1d8a71af7b9e78e0a7580c50301ef5988d3486c21aa5242188cc924d0cd4eaffaa3fd3e0f55ff3a52a1854a3eda58e8b12ea22cc85ab694741f0f382b69f516ac3fe59af23c6f948245c5add1e65d317fff90cc86767e82b42d2c2a899052f0583880cf9ca3cde22722ca20ddaca9d3a42706c3a22df5ce90cd7c1cac4ebe237e2b31a5ee1fa20b556f76a526946bbe851368177fa57beb4e77dafa4dcfe2905ee84d0ee8ffafba28244d527dc32efce6a69758a7f5a858f28293f3a8ab849b45cecc1daa0838e2b19f695ec3abe07079b673498d9207209ae34e8aec2688d1fb5554ce9bbe98b38d5f93593e67bec184c7fb71f663bf7794a3825cc78ef758fa0b0bd47c2fb540af30e076a4704b3f69e5fc9335536654594ddbf1bc6b9c72720c0dc9c85ae869b36e8450097dd5aa699a929f5a203da0cffe97cbaf6f266101ed62bb2f1eb11750c18e9ca4300f3c59e84ecccc10dd78b150d076b82ae26b8e015621b7d7f3413d2cc792fa74e75864387593e8c333d6e7097e3f4134ce689cf268cdd92cedc57b30679d41b431a2270ba4ebf5663a23de134712980ff0742a1cde92e5c29d57ff5a46fa2b94a8e38aacf19e19795a0234b58538cc332fe2e7b315a79568498f32926accfa1da0483eff9b576f45266b799d207e3a34b53eff581b207936ced7b0d60f541dbabd520c2a297a1048c3efc35bd0d681a4e3618483fe4165d0a43654045d6204c4514b74759bbaf259605f6a0cbb099b74421f57b374591c140f74442adbc2839de69380b644eb011eb7392e3244ecb94b846eca83cd26119f4f9c2a00c309a8ebcdb1b1b8652c19293be95e43199e237a03c8fa32cf85e508e8c698fcda6a6e3a36e5fa25cd46c9a5cefb35ac5474cc4752ba77024ed842e853e913680aad284d3c0c801c9c986f4e22db1d82f641827af62de415aaec0681a5b37b546ca5859917eb6af22375dc573e1dccfbe2397dc77fc62f16a1d39c3a234c573ebb963c118b96a8b49ebdeb9286e1a132233522a6e99fa5321811fb7a9e1577214f39596a3d5decf0f7addb4272f3a0f2af01669d71f48e020c07ac3d8e2dc652ed0fcc1e4d54d964d138ec40b78fccacb955802ebf43f07353191c0ef7908fb4194dbbc5d57fd6bff8ecb170c3b459fdc7fcf3416bf2b993bffee963d61a82b3911784c458c615cd5e2db83a4ffaebdc231b70f3fe2a874657acba9c1e06bfa986919edc899e9382e4c1e7131ce44e8f178bb01841b74b71b730b7d1f14922835643c8ff6696ea265b928ba35d4fda027c8be16e2d928134cd52715ae12ed3360d3674e54bc0e6bcff719eabf179f91ebf8bc1c8b30f1821ac23e7eb2887afd8b67df4bb34c12c0891249b2048ef41c44bb07b7d158aaf9704f5deec51f11c4cc5e6395b39cd32e90350f217817f902087612f461baa94d33d954d39a50cff613c591137e930f8ad318f1b51c7dc523a3563f8c78562eb54f656f0ac2489fdc900c46da01cf0decd88be42606d4a976fe8bcfd8416a588032a0fcc1cdf3721fd872059777d05f2a4856b1f9a2d9bac03fc663ce382173848aef38995272b366c37abdbe2737a27a73bc308964b16cc22b2477ac73ac62ea598e1ef0e06e3bf67ace489f0c6a81bf951a85980f59fefefc41ae02aff09a917a0797c03ddeb838def4c1dfeab7d2962fdf358eae858a549f5d80564ff2f3a4432d8ec68a8d85eecc3e5a61e1cec34d66d92bd8adc2c5338a6ef86b28510a19174437c390d1925d9185ec14e93598786055f0dc2a627610cfdb27254754449a8c418f443572bb17430a438f4d4a428e6c1a249cb8430c2608f94e07147ac4f7831f47a516799115798d26c2d78cfe10bf677213c4f701d5dabbbee62d2e3ac155cde6658bd830e7455221ccddb249555e6e13ef82849e2a0f01ff9b10efcf97e267dfa47caa730c804e92659caed3b01c6d57b4bf4eab69ae755ec2e33a152f58cbae54d3cd99dd1758d7fbadb6ca91a769511caddbf145e8d6f38ed038675e3e7ed94cde5d786ade0ca5c55d77a7233c4f09dfed7cdb620bf5a07b0ce35155abe717e267b62e6d1885d43cf2390a0a42f9ed96c18281f5b649aab99b056e11dd439d01c21d3d1e9a885653997c006151576b705f54135ee59bcc78a62f11a19cfe37e3749ae79a4914bf41fd6e7a59aee27c79c3ad2d66787b659b79c64686614ccc6067f92377852047e496cc9b7102b0a1238114610f8f937ae256005853c8fa63c90ccb8a8f3f4027cc3b0d50b32bf296d1d74b459f30d186932567871fb56cabd128eb63bfc17b24dbb0db2ca980d96da66a19569fe867a76464be7a7bfd80b01fa25ac3e57ddb0edbc59de2859c001188e83c5793e37398a34f7ebbf64712b1d1e11490f70598d55f10fd66de4e11d6c33bf6ef8270d38e41f98959163ed6cbd1c0058e77c41066e87a21a5509521881fba44514d20b9aa630a17f6e606ac9ce54ed1697242c0386021469435933f5f3a5494955c2a66553acfc2911ff89f927031e77da7093c52e85397aa1f20dc1ecc71bb2f7ac0f8181c5107cb78c2ef90e798e2be4c6a0a66b19d370647bc239ea03f4bbd3a2b00740e2e5a58c1d367f2183a5b199dadd7e2911a7a240e66f9fecbb8095174dbcce011ff2a582b64fc6638919d251662fb00b24fd28f5de0adbe5fb0202fd62d63af4eec42a470581f09608d942a24f3b991581ac90020014aba57ed2cf6be335ca53e8eabdcd43dd03bd772a0fcc3b143d5d35878f103bf97641dca858a218b7774bb0149a06a598db924383310f75c74864c729cd19a52c2ecdc44cb197f0f0492c1e70dd748300fbfd04654fb881b922c4a0e417941c4ca047864ed0068577b527dc069227f44871238a4a402d8d4fc3545362e69d7eb308c3a2092a804667f3f120add195b31c72ebbb7cd0d49a14372ebb1c0f26063745c8b8660a3faa051dbd0454f67bde298db790490317e94450c7bb9def8ca7db188267e60a904696144c3641a1f4be6f95721837b493cccb92fd69c5647ed6fd7a4c3b7baed6932791ca645f0b5ad890d7ad63e876c9b331f7ee94cc51c2da4eccd7de49c11b1fd891b40444c00e25ce81555faadc6f842dfc4c014d22a954d4a5746ce5ff9a90c5e204a7fd278e3802a013e383d74af85d2814208a15b752aa09b8adab524b496b6a46cddd8322e55852ba0f585311dca821375a2da23b6f5473ac660957596b2cc2291384667a861dd284752a96757b2bd3c85210fc2185822e4150b2b136c248a4728f3ac66db9ae60535f58d154e761ea58eb64ccbc5f8c43fae007c94e80ffa1c8d0aaffe20c9943ceda6a539afa3a3d80ffdd3930b3dc192d3ed79f4b8de81ba779be6c12b0350a0a55a4438cbc5fee74f0b568c4806c9ee6221488591ed0a9a852ac301bfb9ec332fbed4183971fca3425084bc1f255080ba9ef37e5e1d40b4a586b7200f6883104e109043e99b61f833a77747cf9f7f675f6b0a198705877d945790a0fdef8589a2a47d060b89a0212de8822bafd2c3f63c148114ea4b070aace8494d16870f7b02d5eca144014d7fd09f0673e67f2db6e1ca2a6ae4346af5275e939990822ee4db0752cec045028c9bb95d48a582ab5d4ba07b8658160611f6efa6fc7811ec81fd2a317d81baba9632bfa36cf7b0f3f4cd6035bd0586d85a450a7a2a658b1d5edac5c513fe042a5d276b4e55808fa5518ce414611cad65fd993195564e64ad1ef27e3895eea8f7667ae03f89f4338a29c2ef30d1053ff0735862fe0b9d8a85a0704643560c3f47eaae96cdda4420982a780f875ee635399213b81126b4308578dcabf55cba1d5768443b170e69050cebecba3fda815673d27acf13a607c24a41e509d88265851b7c5d3816533181adc715955f5193bf0fe90e8c03fa82dfd531954905ba05e169e7126c2442ccd5928c13cdf366d50dcf8200daabb9ee451002f20a17eb1a082f810a9e05d4cacac5bebecf3a8bac649965ac83155330652c6a98c206547970ceed5e84a98a49adb0c1d376742bab6b5aa097179a874610e1e53fe9cde4f150a86dd1015a77e0e1d4abd826707beb26c785899c14810fdef1df30821debeb7907b4dfb48d2a7db0a8a626366d52534d6f122629e5db820b57d52ed8e76ae5fdad67708c8ce7151b4515b51fe023e482bb1f182d7fbd07d404a0edbbbcffc34030966528820d04a2ba225189c225626764e0dfae2e5494856bf6caf8b5160295f62c81f37cb1b89ecde3484bda9545277f9c6ccc3482040894f14e364283fc5b269ec9a2416f682bc76265c29680d985ca098af26efa11e5bf8cc9bdb34d14f1b264b23b9dd2d0847205c29fdc05f48aeeaadc72bb0568f118379b6014bbb3b2bebf71a4e9541a299b25421ee9645df975cc2009a4cd367ed5f729e407231061cb7e98bd6bf66339c30ae4b04eb9b084657796c2d0c94b01b0d97eb9b9c47a022dd9de138313b586d04aa4cf2477d972f849c7122c84834227ca441c85d5a44629771bf2ce8e5bebb8985f8b2b62b203d3b4212a7ca51b3f25537da264003b08970c243c851ebbc6905f8258bfdbf1d537c5ff6fb4facf68524c1a2a749bd84e49ce091ae3606206959024677706955b7b6e6a2a8eb07fc1f78ec99458a422516fdbed2481e7223fb6286fc46201d56b0c953e9b45a09b70ac83b4464c00923bd24ddb43275c49ea5caa43fdbf857bc2e2912853225b0ddebcd94d52444ef6723d773155b006acf05a082bf38b1c27b0bb78b2c2c293cec075e62549c043b6b48df0d33e789f2b2f70cf3772e1dbc5e9e51f57810f9d7d3b4cd4e49bf1f671c7a88dc12ee11f31dfe74494735b766257bbf1f69ed8f53ee2b2376adb11bbddc55c76d5f881e741386b627936c45a22462d9eb330d726774d72e469bdb7d36824fb77afd7221021832772764915a89e8c54f52e50b96e38d354e27b162e944d92d77498346e253c1d83bbfcecf69429349ebe4b7e208c6d6e6bf12f76a82f577dc318e294a180bc1c5b62f13dc5e0d9a4589e4c1d667545f9976e418a26d0ec15ac755a3feacd82a4268ab290596ff84cf773b5daaf659622cad78bba496ebb74a4da67673c745d76c908dd69a3a1e70941c1445159f9dfe6361967de0fbca1ae5333740bc7c08221c07280a76c83fa44e91793f164c2a4334ddfc42b791cd8405f9a12b6792ecef386eda56bcea2596832acf121b2391963a7959f9854538fd5ee23809568b0a938bebc236950a0ebd9ef9c2a5e8491fb0eb39a262ca29ddf37bf533c23d1477a4b4b73c63296481ac171a8cb1e550019b6280e1e1fdcd7184b5d0ca06d9846bc73032405069eb51033254437452dbd0512f4b284de6292db75a0e8267291606a3c7883ac719f9e9b1b4ad224b2f84b9c88ab57b5c40b5e0695783295fd692296f5f11fb2b1ebf9ee25e502bcffbf37621144a71c2e6dfec06097e22bf06f17768134f8856f24bc809043fa3b338cf462accf232754e8f699bbf97cca4223cca9612a2542057d8789573fd7c3895e1970310b05ba9c5efb244dba14536d95edbc4c9f647bca058437a7d85098ca5472c71e7f7b63764d82cf48e914d25b5d4f281964f2b96ef69bc0704f0295abdc2c3526518a650fbee176a1d5817a73d144b2d7be984dca57b9f912f13570431eed019c22f43f316662547b78e72f816571197c75d5bd45af31db8fbf6b04ab26155f518eb63d9b3edc4d13c12f8e300881521f20c21ee72a9e2b706fd4fee78d775eea7c0e2b5321278c913f770b32d8fdbf3f368b7cfc2f3110f55202c8373db9338d48b3bd9398b9429498830aa187b59add40e16ea3de6503a8c4fb38e7b4cf75faf897fd7e14978f4698faacdbb431001181a0476c962a0406945c6067e1454427a2ad81c7fa5ee4db5661063dce5d06ce5da00967b22e654a6fc752820baa068f0f1ed7c4c72afb277e4ff6a490ecffa688a35a70cbe183a0929ec8cd4f348e48d145f45c8e3214e4864a4edf92e0c4ffdc06f1bf99d35b5c889499aecaa5117066be00e62a6cf86abc554616bef177e5b05dac1dc12594a8fa6c7f14f4df55b75f575542b8542735fef01eed7a65d2921f8584222f3cf2a1ecd668ca87115e6a9bc055067343fa61a87f0e525c918996bc067b17c34be94cb10cb6ae4a4770f71c55ee54719a1d5ff89d8bdddfce26b12cdf56aa86ebacaae8c7900a3528251ef8a50aaa7ddae0e427bde2ad738a04291b69ef8869e2d6863e0e9aa08c807f667625e01f0d5adb4e0958fd3b22d03143e6abd51f5341430605b14ed840e84a3a1b798226e816df536f122e3b36c6bd116c70fc6338cafc00681e4e1905a56d2a39039e02c8314504f6588cbce1da9a40ce8eb2223ce8ac2a2e09c7df98509e4dbf5ec27f136b06b62a95049d69d9383bf8c0762fe051bc79ad63677c85ec5e05540191b2f5aaae3e8418dc0cf938cbd00682e87d7c4b3395293e4c87f91826752fd8ef6625ca7615c2f107c48111499068bdd166e382f99ff8f0c9b42e6364774a11f7396306903c3323c3d7c850faffa4db5d1bfa2f7f12444d70d1990641f1c037e559f24bfabda62699cb12b9f8f72eb9d6ab5396704b567ec3e85d89bc5b207605c1fb2928989f966b3c1f331a3426d0a1857dce3b02577c0c8b667b2bb3d7ba04cc8f27cc17e80f08f9bb0882929530a0dba491bab9eb7520ead756064b1a53578b82d52e355ce33cf7c51bbd492f268a5086e8dbf9c81401889a2b611239528c3e90874d61c5af30df46e057929a6832f0bd344e46c62a09f0ded84cfd9898e94baac2e14c9cbd1cd3ce6d785926d347a3a6434ae94126032748000eb82488d95bd4abce2a3667c9b89850cf156d35a4487a3f6520951e6f0a3bd9d0fad17feaad6dd903a05e533883cc586f3db778a742c4d7105cf075e917c46e8d6c1d5039655b9ccdcbc4b5da2ccd3ca55e9bc3f95f0ce833bc1d819bc3a95ffd1f986d7333ab865362c9ceeb9a4dd91d5689a2bf60b85f8a7a49a5ff6198319dbb59140a8d47370026475b3baa45d78c5f0061cc188c4c1f6d8b59dc2871829c6776647ccfbc55c3c80e2e79f7e8b0dd3fd1c05a8e7ab0fcf8aff3a1ed265a5085715ad594f508c5ebda885e4ad07662643832b7ff6a906e09f52374ba5983279e8289c8fb47f191d195c8434b974de943adcddffc9c8c32c52a9ac11fc73593a016daeb5554c6567ff4c64a031b5c69cad2dc2d5d6b298bed28d922ff4ccd4d78d861c6e10c9e7c39426c7e8b3ec980478f865975ebe808a9865a954675e67c0ab3a7bb5697844d015f7fd00740dd7d5330cf664d23480186ef6003a70f507d8bb1b8d57bbb59b08c5780d7a92f7c7cac59f8ac6bcbdaf10fcbb3bcb38c71379a1b268da17e72881573f0c3b0e22cf2405cdd2a28147f3771ef6777d3c9b0337737ae155e441ad508269719521fb639cedd353981fa9105736fc670caa65285cc1314745579f7568fd36d24cc1beaddd81abe3d2e2434753b9fd95b1feec7041efe7342f7fad1130fbad4c4fe4d2b00fe1ba71f23038613d5a966e317c7f438bcb24894387ba703c2047b15374f589f42cb027034ea95f30b763355d11a4739bff1aecbf9391b95f3c38e8b9c5fcb982b1433e089472310282a13ed2880048d3b0a9abcc3ae651e603e4a8fa04218d7ee492527732a75765d1523e8be2ba666ef609c54472ccf2e6d9cc3fd2ae90765b3ed20d2b45034aaae698740c91972d7812370272607af0d87b9d96a112bc67472d5f7a084d03d2c7d36b2718401d4932813db389fa16b0ec7db10032e1aea7a4d8941e8624536b7ddfbe2523c9a8a318e4d283f26adb70c13e387753e43357f11655d42032bb43f46a213c5ccfc804e627806836c0975d700d928c8d62c55833bdcda9a5c01a9431e315e7cff696838b82ec547b85fd3dac08b198b08aad26c66b8a78fc3c149140d0d8ccf72d65867f1ac7d2c8a150ef96f8f1f163e331460c4881179418d164e514e3259de8920c2a4eb58a084abc60f1ab8b61726bfac1a0dab3abf6ba56a4e075ad5d9bcce516ba80b080081eb04a135e9fa1550b11bcb0650cb9d818f3d251ea0df0139bba7ba2991c530c17d27a203d4453d0524620ed2f6c51f7617cdfa1f91fa79cc56942189abd86e0b19653a4a97ae281cbd810a527e061e225b5372e60b7086cb78abfb48d9523d10196b7be226f4f7896451f69987ebe1474f055d4698b2c09aeb2b7ec692cd339fdfe885706e9cc4091224ffb218fdf9adb9a4907ad24a9cf67c98663045384f92726278c9a26c9897934bf74e80401475c58d6a095eaa1fb773cfc3f002b877fea65728476261a005bc3327bf9c90e5ce79ea5d343bc216a8832c2bf7eb4845a099ec1eaa50f67d85ca092cc791f63539426839340f3908d05b7d6ed312c03da087316a381feb09ca781a73bb5b131194246bd19eae28a708f05921fd53f88f847bfa40ffb7d828970025e88e2d8e86825e60b8ab8a8653c85f4450830cd81566302fb035bc2c46f745607ba1ecea939a957538991b832a6309e4f46a62733338a749a48265970669ddaf3af512b0d235f31a4deb71d383c9de50df7ce2fa1e09abf46f80c7c275a63fb56fe34f207f24a4b8e8f78db4511f911f12370b655b0f6615ee350cc17881b63f706238a79da088545a66e93a3795beb607efabc846485980aaafdd472abbecacddb3edeacfddb757c8835d313d50855b3ea2d9697e13853d11159ef265f150828fb1fb661683bdeae99723b4792320f454c813498ee3f02f83892b40cc735848541eaf41c6deab4683986bdf951dee94698b7853af4c76c5c411e4ec4a53a7459a7cca498838cbdf60597469266be562a6d3e698c868e2fadcc3810c3e306af47b67c4365c0dc5b24884f78db7cb4c3b5a47af392ab895157d3744af6edf632136d3d38195d7505dd28a640211313ff4f3d41e787f10dc379d06204da2470c5266d324f79c867d0861045b634630e149811b4b139596a559e49f204cb288081b3304d693b8f31b5eb4c555ae21674bbf83d4ab693efebf95a9d35c4885f3de983a9a56c8bee407040437a0e99776008e45dae1e8b3b03401ce8f7661676267dd0874c921548f4fe3c12d4307191f4ca80a24e7cf6246ffef38f1542cb98a6e1b1423a8f1e21ac22a6d8ffda37a0997d5889341f9bca877efba97eb4a038e6176ea558d325e3b4fa2dcdd5d2cf07f9e766ad0040d62b350c9c61099f01110ae18a9c4a1d8ded5471f757c720788bac022c852478cd7989f00e202c33ed65ff58aa07f3cc45dc432891f9d482ecde48c52b24a18c70c9936fab54700bc6208a1435416885cd1161fa9adca5d778be695e6164ccc7924e124f0959d987787684dab6540228e72660e8de1113983048fa6b2d33b8747bd4ccf9c4bddfdf1f262f83a275d53f7332bc4f6d8e37c67a0cd653b960502da974071224c401286cf89d8cac66cc23beee66c8855ccd1d5aea479c3706a53ad90d4914462df24d51850a0f0db86c594007efe4b1080fbf7dd1a72acb60ad2203974763fc08761c6af2098125f0f0835ceef65a19172a5418d20fb4d4064ca4c1286386ea595d3a656ddb59db73279b22ea84fb57fb1fa8567e57337c17fd5bd42027910b16469b715e7c974dbcbd6ba06aaa1525991e4686f40c019d5bf0fbca3f905906fac8f26c5738a799928b739c2ae44ace20852ea414c9d387e16a79518b0b921d76bab4a52cc9ad8fc9474997ef607c57cd2df50c673a43597be3994938828439c8974362d08344dc17a9ad0fc1e75c4d86f5a27dc75cac2f50681ff10811dd2c01c48d0bb70deed3e9eab681d5b556a607331d49f4f4b635836cd572eb20550b0d42f59b223c5dfd2e6c010f972cf83088de2ec96818c9fd3dc12b01e0a5aae68df9d984c877fa841d115a23509148c9e51692ea3e20eb45921a9a09d320637578b34ff7d40d3dc981f7685b12d5ba2e4a78cbe2d3a97513a434ad3aaacf6d39fd6a3f262964e840a9032c7fc44d1a38911af69b50909b22632cda1291d7c8a5b73cce2d434215d4a25b8f6ecf69502b9101a56f587234393cb7d584c27a8a5c50cfe6c6a10e6029c4bf54257c5916860336974cec13953ddceca1fb8c6641f59f4afebbcee2c2e94e697f19a7144da2fc903a5c6a87661043e758157451add1d5d2b686b747b490ea134a35b651351cfa1eb07ea57cf7bb6483a6bc07931993a29ffafb4ed8ce525fd2e7e00cf4222b740075451ddd122b330d48a8be16d37f395b44f29ed3d4a204fa6c08a9c491d7e90aba2537cdfd09370788730ac5dc808b2f2b158078c6c036424996942091b653782c2f17a3ae9e6d84ce490248f64b9478bdcd95fc1625d8b4705542465017afbe238e202760dc7d32280edb7b2e28672b010720981a1602c93da8aba489de24a58c014bb84412c8f22338c4cbdd01894562e6dd96019737b4aad195f5e27af6441e7e58835275763384c826431f78f62a66378598174461ba8496560877ba01b8e8992a0e85bb5e0cfbe0b8a1c489adcb1a8a5df113c00669d91e9f61db4ba043a1f63a3a424e40d728685f607eab893080581825e82f051c05b47cb8302ebdb6132eb8b8f40679dd67cd37694ef96b47acd33e10aecd126651560049e5e40c755d868674eb4b822676c942c4200ab41d4237a2bf05372c2ebc29a342fe58a08a10066549f768951f8f7b080e25acdbc76ef519b147f901227410c1e498e26e7ba769f3850770a601880b086e2365ed4e5e92ec5b8ef4690d8285eb734afe485b366a8baf20cc6d240d41301d4b64af3a657131a6005c0700e13929d1327338e74c50cc3644b5f047c400a94b46607fb3421de629a06c41ea6a7354a69fda3c5e3f8b89178267b1c24c7b032e72352c5ffd7a904697f718fee513c927b175d1bd12203fc3de98f2bc088e9459d026110297b0030e339dc912136be4a59846d9cebbb66e2be2b119f7165175e3d5c052fbff0c111581ec7c6184e8a4ca4d4e1caf11f7441b7303735e6fa5199a235afa9ae7cdc335d867a97380388e0e3a6970c959f17a2c47fd84b709cb83c12749c265531759319d00db3cffd276c565b6193b7a2c261f3ac211ca5d45c037f94476d43f52a7359a35597f3fb60f807f4c243f083b79261ce1c5c158185c107d3088c04c57019d89eda9a0ee3c137974a10996999198e24b6875902f68882a50e3e1c32af553a32034e4281de0cfb292b8f709974206c70d303181847b8d78e4fbc942c2d356e770af8b3357b388912e6bca6a466556a930ad32adf825ab29eb2da03d248be84478df2fb505562a61b34b6a9fe404f771ed9a398207063fb96dea60175fb97c74a98470c8982f6529203b58474595ddce4f048bec6c495c927e501e9eb8e82c78a160957b8da7a9dd55efd0868db50efba466b39143dad72083c08ad6c21c3a3a29f693f7b8a85d86ce7d6144d308a18c3cf7c723ec26c28949cfeaf562df8b3bd515010a1fbe4c8dcb52bf78b2f0ae2dd026d37c4fc6c81992b706cd772012372002f72b42cb4f0917f7661efbc05104f3a10d39283a6fa02d93c8c51616e2138ac45b35db396aad448a0d9ac6e0be3f5d4a822c84247ff43da2ab4d39891a55d5446818549e264d3fe79cd39b01e1a8045cbb704a51d322d462dc04e9268b4e9c5706d9b14dfe3361c89b6555a57e8ffae1f39bb91529b79152d7694814f691957d0896e068043514e784c09823c812c005cb984169c9098b30ea24ca1e2b0927e5712c50b6b6bf40cf431c8dc752b666e124d95bdcad2a15ea74da391b00bcf319e41da77e5200bbfe362356e61292cf8ee6bd071a792e0397a6e864be0518acbb91fac586c1d7191920d37f1dd08b542e985e5b65204cd7091e8b14c4465d3310076b3a82a064c65baf3090c0021151206ebaf2dfbe9840583bd456a22479eb1d90db5c09669d94ef6d4d6fe624d3b13f31384e1d567237407636eece1c91883609a173d3cfbbb76566699073b4a583a400acfdcbde24e422fefecc33abbf2382905d05270db12a3837c0b34b5d65912d5280605ac11693fc8425c3731c6f63b7641eb465d9a19b1a21a0aa233931d9212c32d37018db4226fbf283dddb0615ef3d28c53e02a42893b58a23c8acec793e2b8a577e4dffb68cb9a9146599261515263b38917d6233d9b4995324c8f18c8c04462a91ef35c4599ee6c4c748a38f6aec9fb165ba60f505ea52d1d10d28f512242aae747858e01e3a22af55542437c84c641db0d90e4cde3489ad66292979cc312c931bbdda7e4cfbcb2d0f27481382d221585019eefbe6facac8bb31381614814e263cb89fc2ddc89241bf54b02575613e339ee16981358eef77777c6327103518274ddb64935c5310e431af2383bfce610bb7874a1c33da5f4e438dd78978623c64355283e46adc2404a9009ba95c68b69be5e40ad173bf6ff2ee6ad4c8b4cde772abb67a794dc4cc8f4ca54a401b44cfd150e4295790aa37db011b2787afc59c9dd6046530e514076b08293838bb44be524793050f641d427a8c4d79805863ad1aa9ad1e460dd172c47289a4ea52d1e94d39204085a7b7b90fbac9fb75e6508fa60de60025647b28b5132afdce63cfeb27e504352adc59d5554a8ab27b7aa3caf3e349e8eb335e07de14e020f99e1f870ff9081cad80860148fe80a103d4ba76c1ca28e9585a3746118046fab6a84aad53d9d9596ea9032cb3120a8bb921e06e1532dd62940c0e1d0b2d03dd7eb06d124379bf24c199b4a63e7aafab8535addc4b233f1ca88fedf068d6cbb614a9de5d261412090931e73038e26710430c6418fd33f402ceb1f0924699aa075439caba8d164fc728d36cea309844871b388cae7c533878ab02c95b8e955411df645c074cbc1771e865ec4fda77de18c3f1972e7d4ec51c98dc29ab4e98a170db29dacfd0f5314baee9c48e1447973a2a24f0fddff45e40bfdcefbe545c11818c06993736a18d1832c80306a88950376114fd277d3d521be2e7d876f1511c6ee1e74ef372a5a90a23c26a73b0ea4114e59d5b6a68543295def9ef632f4cbf4a7bedaa5dfcea4777bee6b4a0b7b9bc70c15f4e5cf5d7163391bcfcbbc70205c1b37300c46014d91b7ccb5545476c29619aa29eda7490ed266ef17d547a1f51e4a8d692714ab22cfe94e1be4000caa0fa5ac24a943bf39c71cdd4955be433dff66ff90a55f934994b696c7948043df6d05b601aead1f268262b26fba135175cb57eef9e02526523e667d26c859e1fca66af7d68faddfb995b4e574d833f8c9496f5192679df8aa221e851ab4f84a7137f188de97168954c549ba3842dce976be3b1cba946e1d4d122cb8fada50ea87b47a8f2fa74489bb3bb351dece1f1d3d436ef5b53cec942fc0117f2da3c209e450b3229d5c560de03b6fa125a8ac76ce5508e308a234603b10aca3dc08dc58b9070775363834336aafab6512b28d636b290733085455290afab3508d83fe606b12e6eb94dc642c0d6bd30ceac6ced2fb3c01783e2671adf8e0a8e8a6e607259f9ad99a95c45c6a51f52faac7cf5e4af40e9d00bfd9513fc54d0ca992bbdab3ffefa5311c69f0d323d9651744a9a65de7908db92264ad0804a4962f9dbc8b99a734141260a60da93933566101feb6c6410d3ecb620b13d1cc474c091f1855d3efe853625a62ea717ffb0ce4e878895f13a68f193a24caa54f7611021356818a47bc2d7430fc59bc1cafa5a198b71f2468d38ed78c19d0e5ab0229b7826a0becfab9809b39b59c1b27be1497a6b85add4bf00377aad1a118d7dc88a4374ce488f0308d48a07e423745ceadfadcdd4c8b3f7040dbb5fabb846e1f4461fc738743ca50f5ed2d4f80ce0cdd8c4cf83dd48429437b2bffca89af53e7e9c84f9c9b39f534c4612a8ce4bc0921ba036534ca9b76b8e85a19cb655b503edd664353a2415fc482dabd89e149609fe30e6dd26dec5e91a56f5904f08d6c265c62011fa03a1cf10ba3918962deb650745c52892eee15597210d909c5668973234c97f4930c379255088138a38bba57236015ea8e74297e9fd0000f4abaab905772cf5594d0cddfcd902d709a1c7459690a9a890e722bc75aa7bd7add491b0711e589c569c223f35dfb23f4792c9ce1caccde5f0265cbf40dab8e16354e579480d2be71590f4e9867bd2650518614c898985bc24167cb986ba0071334dc62eb2e007bed66262564f5a007f276be620012cc80b13b91cba85eeb2d67f3e1e30f857ec78fe3ccb6c113923b154a8b31ca84bcada010e99a9863bd831a57ab5efa0073423af80f3aa40ddf8bc393aca0a8f37eabb03e1b7e343cd05199c5ca6dfa7a667c3d7b6fd41389cbb2d0a03b1d5a192116b14e43f8b26b4c92a3ba51de3b07288668286191049cbebb710a66bc14d311d748a92c2bbceea929ada6ea57392b2e876d40aab33cb8284f0c9def1a812769a0ed33b23a336b237c3a623e2975c54903a415b6ba1d6672ee6594ac509fdbfe7428b147df5457496de05ef60bd65331e00f11b6b80c21d31c7d873d33ba0861d16f08a4f560d1a0665dfd540a783b8b0c3816cfbb1dc6c33539619b7adbe669eae4621027d3f39d3a57cb3639e2a8c03a3a728673832a851b08901874066eb047ba81ede82b38f94f483ad699ee1e9a80c70aca291f8f6d328d3d517fc9702d611221aee9880d8943b0d12327d204f9ce0ecd826cc9d46012f05bc76f6b0032c1ff4bd484e1fd3e6d1d2192d527115dff6f88a7862bf90c81af61864e21abc9198ef3dee241e93a50538f2d4c939e230eff8be4a2c465942511855e4398bdb40b096ad6bd6914175bb2f5d5a0e1fd1a73a994a569d31945b83f3c87a388f3bc0de6286805847f314a69a11be5092b747220b2bbcbe2aa22ab90f2ed72e8b88e2abb3f664582b3ae6bc38407136d25196d4ffddcc12f537f0da7247e7f303ff272c403412d5a04a3a9453093eb349bc7532b09058c608e2461d6ba6112fd4c2f3a09739f810a28ea367f9a173481ca52ac5e087906e26587b9edb1e2c6cefe05160bf62559a120f93700d5aead0296678da3df47b34a4e87dd18810c733acc6f06c96638d54ee1fb5e54e897b01ce406692abf23316c0bc0d8bb56ac750e0e0694e681223248bf461a94f8385853213768db1d2a4c1a1c7c17bdd500ee32ea563185d549da86657fd1794635144020952ae88f8d35412c1c4054a42df44829d26e6ba256a5613ee822c2334e1b2398a7319373f1449c98909d13890169a24788aaf884aa128816638331493af2250aedfc635bf14c69362e85875f0298888983cf19a593ccf39682bbbed82388f035b66b9e11c7ada176fd5c851bb8cccd36fe6a1f11b604b540919816d9d358b5278092fed1b15922b5e192085d46f5e6ae8a153ddb994dc69ebd21ba28b32c9175d26e0bdb5628868b26efc43a3c3de369ed4ced70a918a2208d6c982416624a1fbd3980c851e223b092e07901e84dbdf43841b7861c01ff9ec2620c6bed6f8eb16132feadff9c674c2d839546e9ae4aa7a18a540bf43d4058db08b5787c08bdf2de4871048013c60933db4095c30b1d390d02f0400024e872794a26a47adcb9808d43ae6a949cffb786fdfb8ee9d67346adc9d773e65c301c3377b2d21190199b87b1e1e9f173b68ae98f65344bf75071d39f086075868e486c946ef94555ca795399278e425d321f929ad15b07e50d8dd13f68f52528d4bc18a8003898b21f14b63ca157381c65939d22ed597c5b2937ace086e547e9c72d017dfc33f2bd30ffcf542026950d04a2b58908b9da775891ff3d540e6f66d69c2a779cf79ac2658a0f71d85982d9557a6769ab1d0f51aac784c4c9cf486562b6a064a5c79e0f5e2b0a8963da996a350f24e54358301d3b9b1cf6b29bbf70883c11939afdaac6b0ae8a8afb305b1f5169b956625eb24ed92ae2f28bddc76c6b16192b93fdfff58614527549d8dcb9a8cdf4df08451f26300f8cf3d49c6e25b4da90c90bd8c73532fe6ce44cb0546bb4356e7eac60aae701d61f1dabb138c31a4135519fe177c992557844382a3c93a8133449b4cf6289e4ef883195f74bf1a819a1379e2790cb13b5880cc66a9c8a8dd8ce08a9144710b9304f1ce2f07620c3bac8538708052ce8d162b81511552a891a77e46f1901d39749dca23c24686d0f6a87a207cbc52d6e26c0b91db31e9c082aa48c18a360b101b55c7f12ed5bafd9bd55b6c9ac793660de5604d3cc52620a2ead5a4a30b4545e385aa3a4afc36466eda7310ab748b8a26fe89a8c3b91e3ed1130f53c7d6075998f2a7308e7642e370b37d8fa6f62329b916424e532ef88ceff5f828615b6d5618417b714b8950ddefd9a7174e4813a829bc91038b60e896d69ec5e17f2c95392690711088acc194ac0693be5acefe7ea5c1516be9ae361a35b0617d19119a82e5e370213ccde3cf6430dce430dba8f59a5033cb23f1581673bf9c2eec4731a0dd6586ad74dff6610b5bcdb4e3ea89d3de59dd4bba84d0235b0a563aa5180f7628bd54c299937c78308ea388cf5fec5d95d39064e352ba6f1edaa460ac6a342d95fc0c621c33fa8fe3d21b00e59c73d8d7b729cc2cf6b25ade85205d4130b50f924326a5d5af505fcd1cb0c8f49d7af0163473ba4e20e96bdeeaf4b361ea5cd6395789f7306f82916ee0435e83ef658e4dcdaac306eaad4824a653405d42c9ba0407adfc69bb277f225dbded4c88431411dd88f1bcf60e89fd83737eef2349e1cdba5714e8d2e3da9336d563868c88287f6f2ecd54020957abf1ebd08f6495403847089a24b64cd906623290d058519465e04af52575c962ee95792ed796d437d7c9dd2fb70d3c8e15459395fe23d0c8a8a611c8c7dc25b202e51d73e8c795f99c0fec6ee20da92545f0406c00d480813d01f6c2de04c8a81213b793c6e1fc654ddb761847fc7064e06f942fc2d0083bd3a4c1fa0813041190843b0f80f46a9ae27559df89a70b0516ec35066f5e5adfdb9f8d25ebd5a9bd89f56a1c259a1f8397503dc0351f167c5da3965344476e176e96a4d62fe6c871689c9671ff6184d94827ced1d49c95ed53cc5330d2da26540a19edf06c7aa2fbb2ad2bf05c75c8fdb0da0298f645da46e103e85c98ed8ab5ed27214d3364e07e3c61cb9f31e6c6d509c2aef8d2b326a93ab2f6762a016e1d7ea1c5ca64bd6b2764db4374b87a5bf6f4074ce33609f04c395e30be4b3c18d217a7d77648dec5888a1edec2deb487ddf28d07a3b218d4888913f090d17576e91abb5f237b067d9abb4bf99c658e7b91be362b5606d859de81e7cabaf6f7c04ce8cdb05e6693abf9fbb0fa8eca6c73900f3b27f7c4b6d6f6943e1fd1646352621aa499d66a1389f1c869ae03a33438f495daec9257a4898ab495d1f8420cee8f1ccef6281a2ce15c6831c1c358993bab8077fd89dbc4c117b4b9e44700f80b372a7a4ee38f527561516724dbc62f8d7df7ee505fd1ab537b17ead42958d06780f3b864695d672a1edcd30a99888cd680d37b27121c6d58560c92ffa83770a58e2f776cc7e003f1b4f9010d283b173eb1582709d00a2c995455535a0c667cb60832d9159d706aafc440ac9a4cd1d91ae23a98e8e780ec77827d86de9c02247889c85f0ab5208ad575083765bc8593ffcaa47e8c72ca9f2d4c399cd47e06b3cdbe31f5e3db72d673983642bd5844a292a4f83a07a10152da6032540d86194292889568e174b07a64b3730f74048d1e06d34a98de172b1e88da3c23303e59caf3c3cecd16ac8388d6acbbd2a26875b63ee827128c840034aed69675b62984f5dce1e737170d0b0f027fb9d0d635a013ae0252624e5a64cce11b64c0993d321b93ba1de6c84ce5b1e76b81e69bc65112206f8ee7e8fd0a7a626ecbd31ee6dbd073b4dda0d1c1e851ba417bcd930c2054230f8568ac0cf54f6c9bc88207e0022f27697c9706aa940c6de90f16ec9aa9a269dbd9dcfa48e179a9034922c12b444cc72a8cfc4e670a6b3782615e333a101e5d1f7513a33496f4ff2eeff426313951ced75bf946001ec53780f29107580303d213a335bdbf098ce74ebd4de44fbb50815ba32b12be186f1641daf5e742b6ecc81e1026a776a4619a251c25c3457aae2b5845d1141af43c3b3b5403dd609dd9ab517d17f2d0a5155c877752191aa4a633a26df8e2a1702b724802c3913f4f77a6918f85d5de4c0f996d26b775fe1ee89964257dd2713813215fc7130f769ffd5156dc9db4d9d5c0255ab20c9a691aebcb6d59a68a34ab495267366f25914a5effa372fb2fed89526948d98134f4447248d835f128aaeb954e2bc919d9075361551b844a3624352f5f5a40ec0cecbf437174158896662f94ad6455f33d6c188c8d4d2cf6321ca64026fdb0341f1b274f17a056aa0f339917b46034875a09704357421a5f03c82d2b8b60c36f98723de825bc35eb3167db37d73b3d9e3d3adf426ff3d279b0de8507ba5182e4d2b2138f0448043e1574aeaaa190291c2460e895130a04fe89791b1a9ab1c9638817a8b177224845b67011fa6ae380eb0e09338a17d4085d158aea2d4f3fcac7dcdb323a98ab2daf13b3917d5f06614135720340aadbdcc01c24b04e15176619aa1478584ad35eaf3b1d3316d5d84e7d19923838b9777d56131e1279e185ed722815876bfab57ee85a3d3586a95eb55243c6298e5b1fb6451bc3403f046913f0df0a23de83f6d727283ad79c4f70337e8e95b811afb13eaaf507935feb0b951fa484a331848a098e7bfd33765945e34c03a9c7c34b3bd585020341a44a3f8d45685181645c62beed75663101a257de1f4eb86d65817f9ffbb8ef19e28e92f341abb9d57c02ffa815332411934b457bcfb1a711f1bb8a116f0e7e542d5870d5f9db3bd8346401be71068aca83297450d588a568752d8784dad081f0604e8b9cf9c57b9278d92fd89749ab9694b233f8a2d0a45d3508a2ad327d134648cad24e6ea358ddc998e1ada96d85fb5a480078a0f12109cdbef2b9e38ab2b1f8ba72cb2a9463ceaabc5091bada842b3a1971cc97bb1dfbc4bfde17b0133186c742f56d51a9662a0148ca19eb78fa65601098397526083dd3f3882a6edb1ce7e162c383e55d15857cbba1b501084ac66bbab68ef6b1a9ceedc4354a19cf23c59381cd1d42532abcec4d596e71b3efe575845d6dafe3a90dd95d8e8463f3d5b0fbac1b1d41409afedce46cc4454e4f645dc9983738ec40fd1caa545d3c5d25c281ba00101f14e1fdfe710bef22fea76ad144a3cc3ccde53756da1d3b3eafa80fe47bf15a134274b47ff912adeb514d2604201c818b7d7a84fb795c052ade8068e8e83dba08df6ba746e932f125014878c4d979e4ca41321038d7badf1ee01419c6aa21a81d7171d2aef10dbe1e35d787bfa49908db001c5b5efa9c7b20d58ba9fb31981775406167c5df3e34740ba52b265c85ebc0a13887b4f43909bf145448a2952a6d11b89b09063beedddf0aedd1c0056bcb3a750c8a1399cac42f19586c471c929a7828860f28ec1a63eb5d6e7c70b77c3ba0f6b12b3e2dcf1bab3c572a6deb2bc77c8de46f405782e4a771fab74de495b5e2b84a06b5f5a2e602228943829425676ea9ea384de84a0964a1f49d9d621ecf2a99d7bc57290911fa28cd4dc1ae90a479315bf3eb2775199f6811cfc9a6862d52a7ec1f0e29711d66d08c5caf6605ed7ee9c65d6c9c90ee9afa1c7fae6b33fa1bfdc7488e6361f23181c8edc9729a8e62fb7a6668ae52901f72d3c0f2c8cee55b211eef76b8aadca9e84317a5ed97cf1f51f72bbfcf19b8c073cf09e85f6c142110620371a607dec981a5f5a524a383265533ab12a996d440faf49e815ed041d95b96c5a11cac3d8c2584383bf94e5efe17f0c4c7be0db428b98c28123296ec31dedcbe5faf5c5d89fb59ab6893336e9c8b9b7f883513c1e5d0c7a4233ea3ce9b9c3105469fd641af70ab8d6d22065bec37da13b6446608f2b629bd5ed03ca2cfd052aa9c055e43dd5cc1eaff8942a91d77936b8d86bce82a1608b56b117c1a9829b3ad4bd70574528ad0e10520487ddf5611751ea92e24e1132aba8a85ea5faa258ca5bf69ab5ebd5ded45383d442477f4c852e1766aedd16e545303e5604cf27daa50ca68e9b5b15b44c9bd42c7dac709a88ad7ac3d9315e5f828caccc680c9cccce0efb4bb2f4ed3a9a2ecf596af549bc30b93d4956de52960c8adf452e7b5578f390c06088d83e118d7c55f2c7c13bf4f60b1eb28031622fa67dab9c330e5ef1925e4508ba53e13da440a3fa59fc98da45327f495d0bcd27d118984878a6f87dbd438ac67dbdf11bf0dac1b0685cdf65e54cd3b66d907a338adbf69f8325837b4315bc634b699e2825990db573a1ca561324d1045918d5434caae081601e3d59b806c2aebda1cc92c9102b40ad6be25b627787784fc09172af43b8f6647a8819605f4373baf54cd37c854e4d9251d55f6bec947a61ac3dfe248a0e8ef72903b5cf4ec91526ada2b04a25795b921f9a30bbbe0e2346ffa9476fc7b8cf75c947a2726625d83deff03a96948d2c8fe9d8bc1c2558bdd6cc07e7444a8bb9e3c4389a67574628d5dea3e459043629b71664726a52555fbaffbe53e9735a0900f8a25c6a3d68e638819b15f9a2a7077378370e9182a1ef1dfd1be1206402527bc8508c4389a6f12d3b21199e287cfcd13ed02736773db13445dedf10524dcea0780eec1de97c502cd1a8c96c98731a242447624f53c638b13d0535552c15487ecf888945f4b983181aa21c3552953ab3b0c5c6fdaa7fc889ee510eb9f0ad22e55e36931b11a59ed0849e0449bbb2de9904ffc75129010d1bd867639d7d2c755130ab6c541218eec05e143a09f124198a03dffbad2f8682679f01d32ba66ba6534306c54f651f3970a34d1a0ec20b0f3fc82a5ca0476e4fcc861ae9e8ac9464397ae9e0b8b6a3b3f05ee17f3c7810c1836a4147a93ac61473bfbfa38e1006aa72cd9d8e79f0c0d36aa858e59a06a990e252c3e6bc62f6e1527573c67bd5518c910154bf87dfbaf0329873fe6452c101bfc9d9f7ddb1a5d2a9483cc9c0f5d69db63a96189d1d4553dc21837c001acfb5a1054ebaca6b897c984ac15b548a495d4aadd67224838b1f9502214ef663afdd64a949d865bb80e4724b58f2eabc4f29e36dddf50ac74417433bd01efef8715bba7190ead92a358a363422f5962ca58b1bfb996e3657ac449fd9b01b825a86acf79488758afaf2bf59d9d9136cad61d20100bd81f4d9d724644072ced881fb1fb30fe6b100a86ee9211ad669b4453c3a3a3c4a93fd28eb64019b164ec9dc9c31a2ef3a19b45e5f915ca3880bf79758a3a0dcd6093a2be1c7cbc56348cb2122554cb07acbc072db1567bcabcc8dbe09dd5e9ab66bb2240291def3f38ef906cfc726ef8187b15d5203eee8c919370ad1131da67ac3271eb340db67a26217a5c78cc413b99f3aee381d662ab17e1f24c024f8269c7986cce8546edbcb05d9d42597d992b05360a3be8a705a4d4281eea13ee8f1fa4d249fcc6534e31ce4a5c4f1bdf1972bbff6c9ee8a362b2911a1a5182637ccbc8f878cdd4661ad53765d15703c6116f000f5626ed919ff04e727a2a1deddac0005322804cf57cb087aa3503b11519add5eb8da6cf4d003df3461512f4e88c78522f984107c8f17e8349a5d14b2e0f1ed7121688929799d0d71c360db180635a476d2b7b9a14f1b97a80f6eebc0c805e262c0efbf18f4b51e3ddec0932a732fe93f27e708dedafacdb3b3e6e35e55437ea51a8628c81558be9a7c9059a3622d7d83ba25a293fd08cd502d75a1bbb115f4893caf8763d442152acd11836fe311ab03cbae40a4478e0ad4f6e00766430bc986da5859675ef5504321ab982831e2882c99f1ee5ac3b5b22f53e3e7bca408dc5c190d76982cfcc8360d0d8c6a932bf900b7f124e9a32c0284599c61243637a26de01e05ec173f3795e268fa6d9a73628a2704aecc3ea365f6928a1291f9fbafe01a276760401889c544f39d689b5068f9534e242e98a3d86119ab74114e6447a1e0eed8108811b748a6d373a201f283c6231faa5b5f9eabff9f761de5705307311557f2aac8ac9d56e92f2787d234a758a696ec3c069bd012f44ecde96585aad35aef1b1da2605b3e45e1047af4cfdd4a2718ac8429edef44e3c4b3353c3db39d09e42047f8f13acb8caf5c0b83b63477ecb4e9746862cebe7e9ef3c42fb2c1006917ca6a9e1af9dd01f8587afc5d57f74840126a47134591a91a6cc6c4168c85288acec1a91b8f4e82780d66c8d54c714c19ca6ffa7038758981b5435164861898a5aba8ab2e3414054b93eea4468918d23e2ee7a0b0860d5e17fd6d35b61a1faf3311a6ff3513a16dbf05440c45d1f049543783653c14c5a489a447260d5114649e5fb6cc752ca2b20b2d5edb6bd150701f3a9dbd5e07a285a77e2a17fedff77b37de870f9fe38710e79f8e02f4b06f86c2bd73b5d325f27412a9b6a235d3c822877e1eb8c6740282062464bb450dc509e3021732b7d7c5bbe5ad0c7749f45766ee8d628ebca65dd4afc3bb25abb81e5cc30a36a12cf6b36cde9ca752d53925b7f3b45b07a8c33487de9995ec5e2672209b12c9190f2861172d34df14d535e6651b618a1a705f4ffbed508c748de034ed42bf3d91966182224c7447262a567242b60a51812a36bfa138ebd5cf8a61da7ab5831fd080f4cbacb020922b17901206d96e01bf9f0574ee29200258617e031386d4c4e37bef426967da18ad7ea3a3ae579f5213a920ea2a2dc62d2bd5926b05cbf95b4f7c72749ad7ed94a83e3c04675ea15d1399a1e69cfb15d99ba883a350f4f0d2e389b3cd1adc7b3751dae635700f17fca191cc2e09f092cb84363745c855c7c57386a849d045718e18011f4b59df2f0d429be28981f65a74029e502bdf7c2fc680f58133daabf31d1dfe8ce66322f9f7af8e54e5d94e40937ca403ca754e7b5930d81da5037d9bc9c866b3d92c7a6b3c50e1cb1a77bc4f1c1c48add941c8490381c2a8ceead5edce5cc02fdf38d4220f1ef07a42cec68d385871df0e7a06735c257c6657132f17b9420c8be6ac9584ecbd37915bca2453920196072207cc07140b94f5fd3b5037d062fb552b7f2cd644a1546f08edb56e3064fb552b1653e8287ab51fb20ec7d3938a9e501a455db2075e484cd02744a42659e4200e82817ce0cc3ce2237aa4653ef9b1fdda69fac4e168b20fcfd1d1d17322f721fb89ff56a8f7858d48d7e301834023f37b26d7936324c535c580f9f16d98313ea91a89d5c8ac3d3993ca2c28ac5da5ad5cb5893a0a9ce97f393244e8287008d47ee12c3487a679958ddebff7ecf619b1910c0ee8ed28515a8a562487d861a37282c4f67f371f4322b66f084f0b1d24b2b4cf7c359cd482a2e0bdb1ed7707ce0e9b20209f1a04f9fc0021b1e4081217b22aa04c502eddf59697a3280bea4141bc1cfd2fe7e538504e572102bd0de4400c7017b222fb892f241901bdd34a2c68fb04cda0eb2ab01d740417244a1a0073b808ce0c81f6b78f63d1bd2cb0ba23a4d87e1c3b1e11330e2ba0ddaced844bbea7271d662704bd13d6f880cf0a54dec3997e1f5de339efc5e7ef410066c14717e48f00b2fd2b1cccdb0f55773dc3fe8f5aa1545e500ad8812ab2fdaa15efe06f511b56774e604526f179fb715269ddf5bc2cdb94b5c389e0c50824ee03db4d73bd8993a1264750a4482fdaf1fefcdf77d75a5014e8f5264d604d9be0cdf407310403db2d44932ff6d297838de0cc0ff4cea939134bac375962fbb9c9500ff11227bc845ffb55c7da6133df0bfd324c509926d0db422dd44465fbfaa1f77442f5903bc1da71c3a48bedc7a91233cacc7ce3a35fe8373541617d37cc1dff0d059a06be0d5b9ca679416ca890b5047a59ac97e101bd28942a26795e984499efc3d7755dd705e1c52c351ece48bfd0be8141af431564f2dfea7a904d01dd9e406f0319d5cb947650031d6924b63f2b25815efa7290f2211b1979bd7c74f4eae52d9772974babd8db40b619007364854570c6a404bdfee33f0ee4415c544524f9e173e2fb0b2ff4471ed06e1f1f9f143c0c9a466503274c6b08d1abd98c7db658cda2382e94bf4b810f90cf0ff561a07ea1ffb1404fb5852428c7042a63047ad9a79d64454eef4ecbcf4b918b95c74817caf3f85d0b3d2d09b2fd456274875aacd7cb3e8f2b62842752815ed6e2e5ce9af7995a171b649cf356b7836cffe604aa3150ff3410031dd14840bb835a6812b1c4f66b27f83f7c8eb3709c7cc8f043efb40dc316433df3a2502254952fea8c7ae65918b638ea9967af4d375c821fd19d5109db8f4364fb7d54415948bf8d01fe71485b5214ca6ac0cbe9b4259b11e8fb37c335c5ffdeea50c4c22cab218e3ce1ffe17364f417fa4b3fd014fc6771d4553bcc16ac235e06e86b09a1c4b684aab0f4877de017a04b8ee52f6a9a0c260623a4f497a679569a1cb1cfc6c0248ca6795698788901892a9a261503125d7c54c7911551d2dfd596f9465234290eb9e98ed3f4717afb7e1caca97dc6a56963b2875f8a711b13838699e8e9f65898cfa026833bfddb6020840fe459585332bf035fcab8c77097da983f7132dcf31317e3df167b6c8c41a1e460e9e340182ac542d7782a43a1cf6524a13b22276d6e9ea5af695886b1233066c6321309c31e23c166228be19af4faf724fcc8e14067fb362e8aa88da63184ecdc90190a3333f638dd750de74052c1eb61c47cfb1dffb93de97b2cb3d46c6bd83327391c9861d3fd495d8cd0fd278c30bed7989f5d1cab830efde7c78ed2b2a2c3f983948a2aa25a6891fae3d8418ea1748dd633fef15b4af638ddeda0affad5e5736e3f703a3233cbe7975f8af1bb4b3176c72c931dabc3c162c5eb23ab696275d2cbcf481cabc3d1c97fd61f0ed60524d64922aaf1f8e2ab71057a57b7c3d13492fbd11d3f7bb14492c47a565957d0cbb2114298c3d3e2520913f31715c3b9807bb09532c9e334e46ec0000e449a866d7c0ae8d8e0a36be8c76771ac615a390866d788bd7e4e9e189e859af61bc735044376fe659f0bbf647ad2c31e4b32695fd2fee26e67d9aa16e78cf6396b6a72833fe1f603f3487a12370011507f9e1cb3c64e20b18c65c39e9947c933237d06996b2ac8b3fc409ee59aba7ee7afc7786c2471dbbf2d468e8866b79edccdc1668f03b5884241adc6384540e54792855afcc9b9bf5fc0c6273df7ecf4a9713656f7cb0410420899e85108af961d9bbb6195dc59b22bee3e85eed1dcac837540f820ac7fe3bdf75a0455dcddddbbb322dbac507eef6191cda669d83cda3df2cbd10c6b77f7912cc2c7b97577f8de7baf9344c7b81b06967de84010bdeb5116d9468e9f0e089f1bdab6469a7bb48e1b5f7208a0f59df8367bdc8dd3448837d893f0a12834fa0d7843c6e8f344f6604df49c8c357e33f02307b301db0f63fb5f0eece9e61410c54775343d5afaf38cc4ace4c139d29b91df037549f758b9f949cdbe55fba4608d74e76858949d21632f4ebe19f80fee603b9e6c0c1be3ce519b619a73269b69259b699a739bcd36cd39cd6625cc6630da45b2d366319a739795d1a1cd6668282d55a346c96b7c39e0c30fd8e6f7020481ed8f355210426f41d69f9918c040d8c2cbc2cffcb9bb7bf32c053d2c58b060c182050b962b57ae5cb972e5ca952b57ae5cb972c58a152b56ac58790f0b162c58b04ce13d2c56ac58b162c58a152bef09e1439e0416772c58b060c182050b7dffa290c17fabfb8ae0d1e3f1be7830889ed2e5092c84ff155728c7ba03b35b1a57a80ff9101278048f58043c3a198272a8113f6294d2fd69fede7bef69cfdf7befbd1791903db797edd7c25e7d4d22a02af649a975f5ea1e638c1e6574f7e841f0a24108d3dd10763b1872c2b894eed121840e55e0ec1c07d8fa334cb37b7bb787e1b1fb61628c578c1cd923757f24187e3142edc1d73fefbaae4b9baa192dacd65d37b7a6d149213333bf516bdd9b7c87793d2c25373bc312bc27b8d8cc94694f64b13f1c0687ee4e2794eaa58c7172befd8811a541a1e549f981c2cb27e189efe3e3c31321333f861042c8eda9212c849f1f1a11b98101a24204919b2d78dadb0a691f1f1f1f9ee6227bab223e3e3e3e58ad083a9b86888d851305a11512b3c40a0b6cec571eb6b0f216fdcc833bf41feecc27c8f865bcfd809ad74d869efe21f3cf649123575fdd1c5f728fc4acb342a9eea796d0f957ab3192838f8f8f4fce0f9fc3403002f8fd3523d5c6be3d4be8ebaedd23113e96b3afb54496a12674d3329d7a7d96b5c61bd7e7429c91b8ced410146ea91ad09deba3bd6fb35fc1c7c1da61223d89547586b8bdea497542a99a463e8f421e534250f96cefc34fd58032b4699a9210cd02c13ab0ba4415f6be85374b50b1f057382c7cdedef6b61fd14677cd310ef458f9977fd6ba823d1b93a0602b69902feb85f07f70bd3d52be8e14d7691a7f1d0804272b13982fc17ca65d9f9924174bc3be961351c895c0248d846dacaf3b1d20885ded638df3e15f3146d36f5cfa382b0fb4db5579da6e7fb17ac177bbd59d59b787d75fad5ed1ca9df9dbac3bf0a3dd6add6888165606828f4418b2292907f3120766509b1465678cfcc9c9a75c4cdd62e405c3d1dfb8ecb3c951ce7b667e36b5c7698d7b4eb9494f284e65a43ee8d03a1532f77e776ee7ca87df834bf7cf1a5ea5d893a4fd75912ed245ba48a4d7b81dec5d17e9358d94658fd31b86fd45b7d7fe9a7e23354cb63dcc46aa3c6fbb5bd30cfb2f715a46babe1fbbea6d534b2038416407605fcb09244efc580ec2be56135dacbf97b5d46304c39e8164929d4bfaf83d58c95d12bb952efd79da46d2750b335f63205887343d562a61a512f69c84dbd9fe6114c3e49bb037491d20e56e0f76877f7bd3df98a7f3ef29be7f8d1276e25ecfd02a612a4f5bd284a9314af572a0e7c6549e7ea63a25f6fe1bc74068bcd1a059ac5ed2aca7ee3893a7ee6a0fdc43fb42a289a3eef83cdddd4451134d9a48620f605f8b092dddfd5bff167f7b06da7a8bbdc5cfb2fbea7529b7f79bdc36b9bddfe4f67e939793ec38b4524a281f06411d60f677fbf72f6edb766575e3913b0da52cd58df426aef2409bd5db8391a63c695b5f4d98d0820927363365d9dbfc71fd3c6d3926945801d8d7ca81172d1601f6b5723064b397f9a5733d035d0f5ac8ede8605ffb33b4d77b7fb9f2b4bc34f9aefcbe590d7d3d736daf959ef2407b7d7c53dd2a37801f2a2b0fb4f26f1cc00fcd2a4f5b1981c8ba239b5479dac2dee19742f865d568d0acd7cb0f2b03c13aba9eba2b755cc2c45e2552d20c42a269f11fecdabc6d406a3c069f85dff006d8651b57e3513264626c3d46e03bf68e04831bb763fa1e2c3f1573b76aebcb2d3cd7dbd6f42dd4db5cdb74b9325677ae373d77576a7b8c3084fc38f0cae7e91dfe1e6cc34bfe067fbbaec45e1e0cc3eaf524b663c088c188c188c1187f7b4b8cbf7d04238c30b68cbf54c654dd05dc3565e3e563cf823537dc781aff33b82f9d626610c2df1fe448b8473fdc1e076e2db1afc1993620a6aff12513f637b4f077dad4bfd473f5bfdea877f60d0c6eb05ed6b08fcf828dd5fe1b2dd4d23f5833e31face18934aa58ae6d7018c0a1bbf834b4f9da80d4f8ed25d7afe2b4674e665f837b36c5c5a751ef44d53b67d44b65d44b4bac8bb2b1be8da9b7b330f576945e73a3cccc3bf3b1a7ee826bfb57e5e571ed1bd318c3b619aed7be32d3df385a53a497f5e3df70512efca5ab0740e5a0c75ebae52f5d3546bbbd7c6daba6f8f1dd05d89b5ebbb02fd5db4741db5fd4a576abf23dc85d700306ba8b7f495513bcd8b7af95441325b458967d2d25a0d856122d1c081959cdc29f2fa5950321fb827d2d285b6cf62c405f0b4a14dbd9d78212645b50aad8ccf2cb18ff623ed334989f756e9fd5cba56d03527a7f3ed234d9f3fc57fa2c9bf57a36dfe7ebccf76c07fb1eec7c3d27cf78c66920b8873f67d3f4d33467f57ee6e975a71ffbf9f72fd77bf518e9c1f26733bb2198cf49ecbd9e87db99df8365ee4221d06acce96441f6f234b49771da371a6edbf9d9054b7fb1f7af978ffc35025aaa7c4f32efd59ff972e5696b9a01ab332a4fd7d48ccf84cce7e7671d06e21efc59e58bfaabc4993620f0b9eef0635f72feeb7d7a85a5126f1b90f93b1b0d9a9df57220db7e68527846d350a0d2677f71fc3238ed6538983f6d25aea4d35d4c0c2e857df6cf9a3e26864d1508ee717dcda0d5fef2c0cb03b5baf357fb8cb37fdb0cf3d9ab36430c29a6a6e65f3cd0f25f1ea899b4a7309c7747eb9baadc80f0ef94eaf671a341b35c2f077aecfcedb5d7d1b4f7ed873669e8ec2ebb640c8e7922f3476941047c848184d8d2dac19716951ef81498738a0bbdefcb8a7b823d3386b1900e05b4f8922b4454f1f124458cc49f58048330b4bb6ce609d48f7417dd2709fa110ff2c0aba126c73857e21ec581403b4b77f1db28c90dfc664cff483f30474cf53df06a8a3c1e4a9aa649d3f44f1fd80436fe7b9783b011fbcb4beab5ed2084b358edba333df7197313ab303049c644329948da56c48817347bf9b78ddc54df0533ae1fc3d2111bebd7ca64f51cc7d68d8c8c6e1bb5112b9b9327a98522526e3ffe33267d12e84d6047bfa50ca8ff8c5afc1a1d124ecf9f5a13fa7cfbf1afc33db08f2f81c783f4f127f068eac7d5df590380bf9447cc9b991ff39583af7b3ae63bf75e0e0070f357dc7cd224658f9132794d1700e002ac159bd5492492d73b9f7f879f3e4e63dccf76d243278ef39fee805c0000d755f44cfcec0a22213972e4fa111bdf93344dfd9ad5c7f7218fe244bec4a1b8146fe24e6cac9ec493b8121702d236c583dbf93a98ecac33361a4c3f2b0f6cf9698c2345608dfb40eeefaca169b8ca909176ea633e5538ae72fe133fa505bd5ef5368a340dc9c6c7eb230d24ac24c53c6c4dbfe340ddc59feee2e368e31b61ec6bfc15d7443d1365feb611071d61201f1cd80277d9b680d522ddc5f937b21a9ffa22469ae6dd981bcacaf8f7647cfcc9b95077f17d63962d026b74e04cfc49aa37e2abfebe2f36d807d4cf97db10d417691a1a1fdf08fba07efedb66bdd9c37c46bb8bafe24eddc54f7135381a286e06c764f532b82ff732121bffc4a16c0cb7c305c3518e87ada9cad05d7c9d58aa7792b46a64e307c9e244cd1a6327b9ce8b6e7400beb4a8404901a14505d14f9cd2a2224a6b8a93d614252da2a11691921497860f1241a2088b580b248244cc85c8aa9864713e52c9806addf50f3ea2f66df1b73427c1d2401a427a3f72d8c5892cc50525c521b4888efcfcc2356849b1c576d132a8c019f6b5a478e22e448c08296770c5d8d792e204b3740592530183d91285512b8a1e584db3af15c514cea40667925c40ad50aa57fd0a27888fee7c10041314558a1044e18b143889c1cfd050163168c2959f2a6e2004143e40824251a5403d4a8582353850361394c8c2022438c1c9175d8ea4502288265daa60832fec25007bb57c00642f17ec15054e10a6a2f5a0c85e971050a81dac57354e10d47732ec6b45e1c45e949d42193fb3669cac806261ec6b554194da8164d974c73bba63a2c4ea8eafeb92f4fa560f98d8eb6a596185bdaeebba64ca08191d768a0736fc46d027650ad605fb5a52b4b0121dc87b45580218562001e5b13181d086767e42c5132c4fb278e2c59110d94f67eb39aa6780e66cbb60fb6dbc175053f80e91dd08bf8effa669701bdd6bdf1e7868c87fd334b25ef5f54c6cd5cd45d570e343061b6c6c90f0e2cdbc22bc9967635dc243028c37f3ec8b5b64f0676f3f6030a8c1edc789b583c2681066f6a1b8878dbfd2be8f525e0ef837a268bc1ed9bf4fa96cdebf1b01eca039ec03c05756db7835f486634e33de878f1b1f37383ee01719f48b8c61a13bed8c18311ea76fbae6f988f190c298ea756b7a99b7b9f1d7a6351a345e0dfba0de3f3e1e2dbcbfe41e36defdbfc67bbd446e3a8804dd6123e53d0d6d7ecfbf51ef0d7bd947c8cb01df061703eb80afe264e09eb36183a16d8d4a8197033e8a0bf272c04f5da1a8f77f3c9a896e66c8e8e2fefe685072ae1ed2a8da3f58c37d3ff74c4f575c102754bc99675de08238c1f2669ead5c102759bc9967358ee38238f1e2cd3cdbdc4571f7054188a7ed9c362926f4d9798a115359ca11bc99778237f3ec13163c91014be98ea83b58394a0a0b9d9e03f9c8a83b16cb491196f0669e05c30a382cdbacb5d6de2b2d71a921be637aaf279bc5c4f9d341fe1068a53471cf6a7cc4466c746f6c0d3a37dcdcdc2061052723707202272c706e4e0dc66b726c6d89f3d7f5bf8e7bb6eb6b0b7d84a038acfff53278338f8889040de2a47b34d37158a7f06995281c05d6bc1c7b33ee596814657e141d98857f368233ece587d3d9d4311fe3e0cb319ff466e6c37f818c9d3fa104dce76be51f1f37ddc1bf9105ca599a862fcb280623b25c160cf2848837f3907833cfcabac49b79419e40f1669ebd9ca47d6c745d92fd708f5785cb40d8c726783cfa0bdbd732da62ef73148842f9f4f10efa249d907b4a0bbd9af526c1e3d14960f60de5635c8f85d3a5c7da2923a87ca0d7c6067617d95ba5e093fe67049c859c27fcf3dfe3d1969482ef3d0337c884c4cdc9fd3073606c8c61e36fef85f8292ae8f517955d1c0f3bf04ccb1ef9751104969faf19380b57dde17a9e6999af8d06b7bd491eda5e281ac9f169f3dd4bf6568f47f3db81ca410160c3da938ca4217d3fd748fd7438d7d3cb21f3ba7be3146fd808b7c7e9e67898d6bf833535c099f853ab77c61ae09c57c642ce36d7137d1dfcc9696fbeee75af8344ac53cd76571d8c58ffb7d5221bbaaba1bb2804855ff4ba481b2069e940a8abc123a0af850589bd5a07524f6c6c524ee6b479c0162b8441851c1cf1450ca29430743044145e00c10a51b090f3fe65c0a15f7e0485d2885bbfae182b8fdbb7c9ca43432e9ef4bffeb8d3dfffac777bf7c3ea49e29c97bbaa5445f418af2b5e33cae8fe504b947c5d9c039a80c678c1b8bb9452ba747fd121840efd0b2dcac265f69a86fdb645ea3d1a4b2064cfa5cea579969d9a869df49ae6fe9926a5eca2e80db786301420352623fbc5457708358fd16177c330d81906652fc6a8d3ddfcebd44de3163bec7b2c151534ba9cae095d9d5551412f9d539b4d5454d03b55535453bc6a8a0b321b42d810a2a351c511a0745cc0c6011416c0212339c4424546c821a31546f4bea0a20418510fb688432cc5141dc4a176550e9e5176c513492cbf11d6e5c62971a889888338e5b211858f432cc51429e210d64568bafbf329b4bf4027ee108975f7ef30ba0612f5977a894029902876ac2ff6d22f32acac10e80af0081c6a1c4059c18443b28b6c6243894c10464405bbc2094c07d8152c95178ce87d41c50f18914c90c7e8f19aee369d143631b60a0a270f03baff73e527b42e72680a39050a394565630839c442454de490d6c54745e417b5a326c883365182c01afa59954982f06ddb8882f2bdb1b1f1099a441642d50ea87b6bedd55dc504f5245818abea4acf30bb63af1ea5ac44d83f254403cfc87a77100bc772485d3373baa8020846d60b1f2cd4e88988bfd6f222082b2dfc8714caaa3a1d415513d69c5a5d8461210972504d6465a1ca08faec3d39777a23e8ab615fab0b2258695fab8b2cf69e2ca99d087e5a1366ee6786b0a686380f4fa16ab25245798296550b08559cc8deef9f5102bd7ee45ba86a09bd7fb404aa2ac221f36342318e646fa5c4baf5990566b1fd503b350d95eea6f5aa620289b2d808e1c3f02fb2549265a61417ee66950d5436500d51c5c8c852c166a6b7520d41999999354f4d81c2ef77d58eea570cd96be3831ba15e55831f60c1022b508ab802143d4cf83829a205250062d2b2620a5b0f7e5cf8c11693155e6c9b7d2d2eb88091457b352b8a322ba890b870828b2655b4b848b2dda48e503ec8544df314c24cd360d5e1b25946e25259a60581eef09348cf05d01646566a9af640aed7bec742987197b10cab902349ad36370a72ab8a83d534f077bcbb177f90bd55962a028d97641581c6a979f187711aa5f253424e317ffa1ebb4515bbc3bed60f8a669089f132df63b38c3512c635cf392de460fe6d7c918a5892f61897fd3c7d0c2e262b71f14d5ca95b350d7dbf9e524ba90d467866409f7d5b70d8de297083897b16fe9c33aba921d7cb0772b911cbb454e2604a6d618a4cdea8a9042b6972279a0a02bd2c164e0dfefaf9cbef1972d5a7ba9ebf2745043a7fa5ba56ec836191bd08f46fad1f0cd9edb3f76867a040fb79eee09f690f7174cdcf93cdedc631313dc9f4441008b5b35ebe9a14206fb7f7ad3a94f2e6c77fe76615465abac030809008398942a528cb16f7d2346de1930d4af17aeb0c73ee00e45952dbde7e94ea7b3a6ef6fddbfb36240436db86b4cd74e8c1b721fea47adf661bdb21304a77a7aad11848699a6c88571825bb88f8fd40c8f6f726845afed93a309402a7bc1cd0ff2f48053a815e08e5a3cf92ecf5134c989afb8988de0bf2e371c9eb4a0d5dffd75fdaaa3ba154524a499b6675b50f9c4aa28bee8ff1eb9b42aff6eeac512dec50d0a6b97e7a8fd10a4b297fa4a2a01765a5ea579d464f8f1bc0cf75315f2cb998d76482fd25ff5e3525a4fffabede3fbed39c734e8d3952f7cf291d637c0a85deffa68953f6169990458ba126b410cac28bcdfa35c3d212f45d6922d423cb016dc11f130fb801ad804397825e6a639cf4348d4cc701bdd0f6e3c14e541d50fec7caa81645277b5b4a0af5b9802c6201c5aeec6b5d41c566ac71e4d8d618c04fdc892fa5046d22441989eca5b0d059543e592879a92cd03bedcf23ebff5a586cc9f109b7575f9b1d04ca1eea3b677966b3df3e631837c8f505d1805e0e2aea1f48b9e8c4443dd3cf2c63c65f8ae24771336470efcdcced073351d36854b2672bf34d03236b504fe365fc8c9f4f83e32d908f6a66d4d733d8779d321c0cccc7701db76ddbb6bf7c64e3c7f853a97482f918300f6360602aedae8f60cd0d6fa6bf69bd134365da63db0f0d7ee90720029a7dacf0f98837cea8bd8ce4d4502e4d0981e2f48d0c11c2222ed6eb4541786acd8825b685b0d87245d0153eaf087dad2cb4d87eada22ef64ead4796d24267b2d70e98afbb02644056a92f2b084396fa42fba78c41aec935d84e669c0999253f972a6c519654167a1f15ef87a79ba6995a8643b344db73ddc3483da7eef8150551857d5b9200e3c7094514f1c41204584289087650842f8e04fda46ff6a3fa9bc55a322cf67d0d51b6e822c50ba814f1454ea4c110472862a20589949c140fe89b3f64cc849b8832c50e04648fa67b5da42794eaed7b386c58753a25ee5714d838d5dfa07128150632ee84c2c1c23f11b150a33958f831ba8c1e7d634741aa33ee57bd61c0f2935202932c33bd6fe64e2581762a095d8a0bbd3b3cc585c61e2c5727b2b7ba1ce49fa594f0e37a1c767df37b3d70601dfca924505aaf2b5e2c6dee2b08ac9938708f15eb6053bda84dab5db770a615f7f0c12b865dba3d585325f272e4d01d7fe783b469b5eb9da46fab2a8236dbd73458bddae3c2e51259d9f8da101b6175a62ca7685d016a5931e29242429696952aad2a61b4aa0cb5aa0805b5aaf808b55a495248685989d2b272a4d5ea4222699ad6ddf6b65477b2e7d7ea3f12e5b13f9c886679602132961fd2680d8c17639431c618ecc088075a96944a313a9abf57a7a4e89581e8aea7184ef52719ecf5260e9636eebe2c9ad4d14911c163fce581a418dceb99cc76e57f5974246dc902eee61411fed16364e6d411f88232b6066eec0e7f1070a66c40af0ea73dc339ec8fc447660f56feb5c39c7f31c11e073af48149ced0626a07d7558022b44870050b22aef892002a80b8b0020a3f504151ac125b3d4c8ed4e08b2eb090c40c5c9093012a745142480a41f822899ccba25205152b6cf73fa216152a4f04a1cfa8944e35653dea1491040040008314000028100a06c442b148241e942545fa14000d8ca448724c96c7a3208651108410818c10020001003020033233228e02189a53f8c2ac593db9b1df8584890e7dadf10bc0c48a43dcf91e9f091ece8590e19bf3617be8cccba6527550910b5064248061ed999fe183c18d0e956a838d74bbded34de032ef0374209cb1b7749de674f703d6297c40ecc6cb0a37f1c88d4e815893d48db9a4817ea6582d975bab7001f968009cb115bde45679ea2ea637326d34eb6ca5127f81fb0bd859608e2b10e193208646dc3274a60f1b1279e5ae5b3fb80f0cbdb28abb42e20fbc17c3c7e082468fec89ae1c2293106e2821d6c6fe84a16a0b5da518d25585934bc69e3bb0da2fe6d0b436c4ee870b6263e620ddd042ecca4a452d377655dff990bc2aedc3c9c6124c8ccc19e7732bf0ba7af63682415f43e147701eb587b1d27da7e5aae565efeaed7b647fe700d242b771bdef87525aca94afc32c3d522a2e091aa7bf192df65b55d9e350a3cb75231e86655724abf8b587ccc9988c5931cc344e4c63746955bf30f98e15480521d958cd4a441171f77554a244301282f8aec3f21682e88ff13b73c501268391b4387d66d9b899ea2fe225aa83bec6b0ffadcdf081ca585ec49c40e2f3076928f198e63e0bb023dee306cec7c2a80074a714ed77d61cfc88a19e12c42077ac5af8fba258f713b4033c53eb99c4b4900dacd21ceed1e3abe29b43263a780cb23c9459c61fbf58a818927b7f1bf13bfe623f7b1d0e8f6863f80944d939fa452b6b8df5dd5cc33215bc10194909ab92974b08a8cb33cf535db635ebe0066b7d500bab3067eb7227e80d4fe558477f51a98211605785439e3d8f4f6453884567b15e44d65d00930831754e28ac272ab493c0eb80e045ea7d4e028c44a84323c9415a2e70193ad25b4b0a26f1ca0aa39a4f5375e4b7cdd0c63dfae11e04a84c2a1b99e8580e3dfdf6a65fbbbcafac183abeffb891bc931ce7c966d58cf1ae4904887d64629b87184ff1278bf8853f199bc9fc7c45f9acaec85dc18feea7d729eb69e01dd5ad34eebe09db3f5d029da4a5d8a5e4d44f850de89ec9ef51b2a4e021d8bab6c33e5d2e214224246d4b6f63a27d15292a6d2a4aadaa5c35c946668ff380b924aaf0336bca4a5ca241448f1925ed40623635031e8c82b98b2c817a58c48279042a1c09a7764481e9905520a6d4ab3a947614c06c7c6b577b5d936f5e09ca291a61cc9d66314ea389a46b754ba63814460da5c40294e500392274ed94df2c7e366cb81bc901ccce82ede76e50772de14655910f35224dba41372d047ea373b70fc17a83ec54d9d2c691304b3ae05206b7ecde8d8f2d4679c97ee27bb1ae247c7d78eddc34da3e680a66a03df338d51ea6d2c4d90f31f78193ec1c5eae308024171b47825208cc1255f9971db200a68be4c784d62dace502141d4d636a6a9d2c545cdcc67d82e335809a48c41a32f75e639cb285ad91d83d67af04e951dec940e39438b35c539e896232533fa03a24f04bcb5367f5f5e52fd074172a1eca784c8693726daa8b0d62f239ea51430a7ab6c732bd78229d57b781314b8bd38b1a9be3711533db3dbc8282a577189836824c5c6127bd9ac16b903c9320c0b7072a51b901dc1d679316c4f5d5b113f8938ece1dbd0e43485cb748fee5c5672ea6dc62a1ac193769efd5bdc58eef760651f1db2a6312154a20e325bda069dca8be5674e1945ca7244da46a40ec33b7783b9a1003a325e55c68c485a1cf6e7a0afba112e8eec74d46def717d81973d144edb30633c841703943a001319858fbb01158a9af89702fa0b0a8d5d06868738a438dddd0cbc0edcbd9fea885cc6bb75c790e5a907f4524643772d5a11ea99764e08636727e55260cead63be8c96e6291c90d93661255ee17a5f2dea0c5194b1672571cc08eb7aaf4e5033304ca6e0afd70522b2b6407d070ca8d09ec1fe3f6d6f69c19c52e4b0779ce85795bebaa84e45300172ddcf226d6ca1878ae19f3c660624486c9ea8b3918408c69663b17ddca18860422b54c65ae8ad4e4520c9cf8913d6dccfa10365458b93a4827873f2389026fc4c82fb42c51352d6317182fc373d1d48bcf052cc69608cba8c37d42760380654f3e86758c93924febb72feb47553f9f4b97f544e69cc0f95be3c2bd25b946f0328bdb8229f1f1a6fbfbeeef777c5f87775ddeeef076f7f7bbbfdbe99dae373a7fa3f3fbce6fa3aefc3eca470059ce8018c15c86f79ddfeefe6ea7773aded0fd9deeefbbbfdff17d1dde7579bbc3dbdddfeffe6e7764ef4f2e77505f8cbb865b01fc6719a9945a304569a2acc03844ba5e24ca85e323dce5a2a8281a03e16e16475df4f808e1ed6241949bef1a7bfc68bb283db0c069d89fcd8362de64240270ec23ecc731ff556016f7f310f46f67300cf132390bbd9db3e97c93af22d623500dceee937b8b490005d47e3937c2c3551fdb69fdc9f3028c5240a461ee8f2d2ca03b2db9e63afe1a696564ebf03ce387f60e105ee4a76567cc866c049996779df7f76cc3ccd1fe4191c62c2d7de801a51ef5e79cf9c894c5ea6d9393b07aca944b0f55c1e6a5b46fe706443341664ab3716dd279122367115f3a11746c4547891281286932a547b8378218373b59271a5954431e2976e73352f3cdeabaf6f6b9227d78a3d078261cc5f27872d29f52a27a9332b205e6c84aabcd55adf4b7acdcb38befae6b951e9d4e647fd6ad84c85e021ca99d7614bb20841963a3b21f2b7c6703149f0632fd78497f05ba91d7861e2fc699caa1044acbe090cad3ae0b0650adc469965470959bf2a5f4361b4897575a360de10cf7cce83ebb06e8579a7af2a135f67a929065e8c4d79896fd09d620d1f0c1c15f0245f11a7db1ac6c4d5046d54a3578310064616a9c678e7b6c92e553bd3fc6989e7a022343640e7b86c71170aac10047dce65558e26b6e158bb303a3b5240fcbc26d9a4c7306218956434f81dbd7d89e4151d3a60cfe40f3eb71e698671ada6b383033be1a5b61df7840ade6b0dc8da2ced8cff4bea0718ea93a9cb118e8c5a84635e18c843b53d14db17a4367f661f6600a7f44e03d41ab32cdff34239c7c6d9a811eacebc250ae16e8e25ed86c87095ed5c2081af34cbf1e72b047ef8105583e994d6214131b2abe3c07cac07d106f422f06443ab0e1a49622c537fcea79dcccfca64d4d9a446a3cb3348bb600facd544615b84dcba960215114c13e8108bde142dfcb1c8654b97e192a440bdf06b938ff39c84861c32d8c911ef0466050e5684d6a587330c998aac394e7b2d6ed866f5a3d7a8853bf88e8144df957f9f067a6ac65d6d22e94665b56b0e06cf3ec90c60d1989297667b2d2ff9aade8db3f4f5d3d479a74aec8f767486040f07d1cb0a74f70ebfbcd2ac68be79d7962a36fc6c4c0a54134b1d8d6a00692323dad575cc7b0d7e92ebe78921f9f8f49027544f3490d6bf30590c975700ee55bdd06a1810b0cea7d23d8381b731ef909dc34cfd1598f544f523b15b72438a4e67a9590cba86d97996a27ae2c6c4f90d35d66efbd08a26b001022177b5524967c32643ebb914c9dbc9bc074d9262f103259128210e73a73694827aa6182721fdd4f530c601438afbd9f27e9bb40112e887c24c4b8664f984c75bb7cadc8107c783f60699d8492d77940bc581e10274947e49b970b817cc6e68e8d9fc314fbe29bf54711ed677bf9565adfb221ba986f387c072ca0d6929e2a758c81deb547e9e8c1bb92df3fbafc87c32d873b632ea7a2583776dcf1a1e30e074500d9bb717dc6c064502c24f9f2475c1e74bdc0f32e6ce6bf0ff1612ec063798624c7fac36c93f4ebfcf76ba36e370652b9653e8c7b9ab780a5a761a031f0d550166d7c7b1eba0b14a2c3ac6907d82b2e548973e36ac955e50bd57875037e99262e9b7a1b7fa4c6597e06f020c42faba9b4ed552cdbc6dac19f9c5d43a774714c9f10f8b6af89e9b00c90f43861aa4d44f6e4a871f3ac0ead09f3f2c7e68329c85107250e6f30836423b5fdff67a2e022ba80e76acc35b1619c0bda9df7efd555bd212d6f13795b2d2f35e15a640578c68a9ca4729060609ee7cc232ebe8739255358ec4962029044a3ad92fa15e1d827f422d76168e4eff77af9a33440f891ce824c1f54a7f5ab7d52d7fd77492319ef5c6345310f5b32b712df21915687cda6c01dfddb21d81026ab2fa8ae0af073d771b64486565e98cc952aee4f3d466480f8ad504bf9d31a8d546586390a5f6dd9c1dac065f472c391bb292c165445b96afff34673f17ec5173e1006a59fd388b653d8ec67660bf2344f19a271e547f042c318284f03035ab72a99e6de1e8268e4b2c8a60f95ea5bc7960abc0d29f9c2d71b8d0445d7c96cb7051e9e388c690a438ab00eeebb2946881e7bb903caee7bc1ac68ede97489260fd82d92c99431d3a754c7a2602b45765a7e10cd1838b39d8d46a3d09fd7f26a81398851be9b75cb8b5c596bebc508e9c700b6d0117d098f18ffc3c7addc238f8212e0bc23511f972495def6e6b133c01511bb16b63798d326abfd3b21dae4ef25a087f294f9f2865034dfa8f10862d77eab2b75d6aa10e3db86fcc8f6a37c99d7b1bbee4dae3dd79f36b1bc7100050be4a4538c8618b1bdcc0891015c48631079afe58fd9bd60e7c2325ca48fa92f0fdc81d2419576ba6f5f4f96a3db5141cb18312be1555ab8dbcc0525fc04acbfa465073c897c5cc39c436f0deead219c9b26178aa814277f2ff4be011a5ea156a1418dfed5431587c4f1122e94b9fe7a129fdde2a185c54fb2abd3764e451256e23ff31d1755dddf0f01c1ee1b66bd7cc3b7209a3a61bba07e78ed6271c6d944d4cbdd887ae9ecf784cdf49122b832023ba785ec726b80170deed650e6c085c265b0826a274b006c3f2d06713559e114a571999d1efc05b5a140eb0db8ed2ffec34147154571a5084a815886aa709598bb5200aebaae55e213d61594e66fe1327274d3fdc6e09026c3d82b58b4f99685d10be7b89d6ceb00d9d28239548433c144e46653ad99a3dee5f181090d4066417fe1ce780458d85b62f2966220ec49ce013a7dadc372585d915ded03a6e8e42e24383f10677bdd3f736fb28d00a13e46c1d3f59a5a7092568e14bcbb66fe05ad0168470db0eba24d70d8774ea59e2d86651e8009c8fc32b5cedecf46a62254ba542c9d95498d4eeec5eb77268636e9df941eeba8c6c44d0e24c5bd69fa41510e7fb3461b50488a9fb1dc29b1852945331c7bbc20308328900a4ef926d25b95b34f8d659713dbcee53f82baa2364bd8def700b3e374b90a9268c1cab8485a2b048bbe7539007fb649b9f29f0a0e3b5d5a9e92aa72e77a27c34fceaa130bbc0d933441b44a21f776179737605ce13e27cca57138d4787c683530d1035679b5cd9a98e742d1379fe937b7f00a5f876297af00424950e1faf6751c33518a5c0c97e3efe938d108eeea4fe88f2a6a710c44a3eb6892231b1b410ed3eee38f7df284560137a0558556ff4111405f2100992106cfea644a12e0d243d37627e1d85d1cb30270c8c7ff3fd11726732973f2488af5b4cc61a7f6a4b31fe3107dd93ac0f644d5492fb4d27d381be12ee6b4f71b45ab3701a0bcc8b6d13fc8c295da734bc71ddedeab3210dc2a08c96480e7d54bcfd75c981e25cc01e2560db6a9e4d396bdba094925a6f72f3957d4b30c6e2a11f3641beb58936e95f670e3d223de52aaa3dc38a7743847a01116acc661eaac2607a3be94aa8beba7ed1269747ed5375b820c74285f88f3aa4404f29486e0e592859b85518a6def0c59da3725dc65403df604f4e1c07859de95503e032cb39ef9254715fd2fd6b4c63a287c24491402d8a55dda05f8f3bef64aea8f35e9016a3aadd0f03a967b0508533dbea7acc5dc12179009566de0a2581390734c66031b62f724925197a070578f0eac4cf998c710dc9721acc1e2bee96478d757f2e5afa03cf9d54c507b994a6237d3dcaee3c92298ffe594ee2f00819c335a8a49708e5dea6fe6dd43c164219f03e3e47f70eaf5211651427a8003c80ae14899c8dbdf7487ac2787604813a3c78167f60348d2305463f7b594594ea8eb5c142530058837ea17613a725256031fffafc9e87bad6668e1fcf4623d167a67929c15d1f8df27bfbe5527b622362f08b08f392b36d1684a027112ecd76154f382b569dfe7b99ac5fbc2e2c366d0069bf7a84bb3c39e650919a1ba3080f3d9346dff27948808c97505294fbc4e117792907ce38cae92efba4ae8910234c893b7484be83ad34f111736e82a2517834bc8ddf87694b6eb28d49e208430c9f3669b0868d5469a05e5d3d287d35ef0656ebe03c26be46ce04528a201247786cb0927a8817b514f3335fb089ed01c0106dd19a1c0c227d6c62c660fa777a0a4ac574de82f66fb04185d326529801908870fda1f78e33bcb4827bd54c8145799633eee7b8c4027996465a47d5d383e797551add939b7627b9e84edb4601d5b29d580e97bb18a7b655bfa205914084c22139b1317c7e43f2c6b9443423d92b65b23eef6653dd01974a4f9545bce89cccbe7c9727638af48499c7db34000a90a0bb591ebc69ef03796b1284d83f3362e9ca7c2b579b9b1cd13b2355d8c7ceccbce5b674753ca2e65e6a0e83a6e5978a5d9efd5a12f4d37fb12312e2176dc607e853418cd7be85a98c857c62013e3e1ad2175e2ea985b3cf47befa2efc57bfdf5139478c45de0b44f525f4d0eb2611aeb1d314b5a95c923726a00e0c4e36217b0c458701abd5e49b7840f7f5593873a91e6a4e02dc5c063d0c4371c7ca821fca3970235600694c10fc0e7010f1d361bd06cc8a14f0a0b441d64813bf31ee379aeaa5bde0c16dea9f6bdf74ef361e72004e0a7846d94be2d3bc5faf6644d1275b135ed0d75bb231d7c09aa922b0f01719d5e9f1635b4a76d4c34f02855a027f6fe5f59bd10891bb1d82d0c69e70a08ed75da062ca4da096392c1de8017187de1409605bd7c50e58120078a6c90c806291f6499a0c901420ee872409607bd6c042acb44f90a20ab65554d992cbed21a246398a7c434c5a629364b91090a66506e8262738acd53d21c05261498a6c434539098407d0e0e1929518a6b5d1b79361dfa0eb7d266e102287a329711f163d5299748d9102f95b5985a772517e382678696c1a590e9cd7de57a73319ec0059de1613da252d1b720abf24ccf0b52063f2e74969ab4d6d9f940d1437507082fcfffdbee424610a8c7d5f415cc5061b683c3b1285531a0105669acdb8b29870517a05ba801458162684caeb089fe222b478cc35b2ee6567f566e1fbee09a72ef4d3eb86315fe821bcb74924caf7f372c01d6a7675306799ff9b4761647b0f34a9354c68b14e32e619a0b1b2da496af8a1f80ad22b9bf3b84f8d6843601f0ebd909370040afc4abc6b12826d0ca1d0b6b416e7e2bd4fefd72a1685cf622baa15702a3f89248d5b1758eeb0ec4c5580ff6008b6996bd2a3bd7f62313f6edd930ef2c594fe8068672d4d94d8cdc21277420ec2f9d713a74137e72adb3ac345559752e39a495f4741e228008b7e8ae620b3b8c9d91b229a46b206a0075c7b45be246054fe0491123e9e1722ef0865ec144fc19b224511b101be96953024ad257a29d2f3cef771161180b86acc33f7021553e486ccd9169721a1cc82373abe2ac160241e8d006222b9fe4a64702f7cd2a6c26fe7615b204523f74a9e14921f62942ce6411f192311fcb0a19ec02ae074474757cbee4d9037ec246f8901afb8bea60b8b1fb28b10290225cc98c6fe931b988417f303e3ec0097d5ff6a13d97356ae556ddf12410d88a8ce885b1ee8a1c305735ba00fa7a4660548182262c54809c4e2f3a46f637a6176584494aafc668ad190f5c0c276f9574ca354803d85c7061a8ac1e97f9da3bf3f27636e7eef21e327f3de122450d059b57b63865b48b841b8769cfc6cf2e9e23abb744b40de8830b5c4b6465776892d0d7be43922158429fe7a23b013d00d9471759d5aa94aa25c8c5893bc755717e3be4c5aae5b97e067afc626c5474e82c7df721efe575046b6152908beb578dc3a0d847e8f35acc2a742c7bcae9596da0d12be5c4eb5b5cd314a50c34b2f6be69845255b3c95afd0e676f83f74d853d02688cfbe087b34fdc6557f7810daf0ca9e2b5bab7be04415dda1fceb64cecf0e275ad6b8ee043878a0792e0e9d39b06facda256b994bc953bc7724f65c1ee982b857b5ffef7105a9ae2b7f9fbcd1fba59ce38593eca32ab26a2a91d290b6d9799f72de198a7c8a9261970bfbb6c68e6b82b2da781626d5d09a5a43476211b3c9d99cc127c0721de8c500e865371efebfa30b566819f41fd1d0a5406254ca8b684b399663f9f70e419a4eb5218289887435221a65c204d8d324288d883becbe1f79fc0f4d763dd433909dbb4a4d6058deea0de853cbcd15af63ca4f9e2c80c960621d2c745250a42bcd3d509bb2ea030a84321292b1795ebdfb803549992cd3994cb05c7dcbf1172c3387373c202bf12241bf53bff4669fc1f091ae1fffe3f5ddec490f48fe642fa14d739d2e6b291d508702cfd7b4a322ffbf51cf2231cbbf5fe0e5ac86f7a9b47f2edc1fe84331fd872248891f55211387ffd473e9cf9c0549b13046f79329e9669f6800ccd40201337f4b20e13fb37fcd8df1102b014271e530752499e6c0a61594e3b07f2f3a173bff5f908eba3e30b811c31d27c6c700cc9f9579880266bb08bb844743b0f4893b72f170ef576c1868929b119fc864b69ca33f8862424382c76cde7a3662fce19a48ac6224f37fca6fc0451cc0018f7180b766e51105d5d3a9f22b34c22f71d0641c7684045f6c9e24941d07cce23f0141070b2a28ead42148f37d58a83e8d7e22070a984b557a30003e432d82e037cda8acb92aa51eaa0b32030890426e308c81459648839100df4b22101b5fcc827c44781e66cad539a5c0b0dd4ba58726235823e388bf5a2bc2d5126228abbecb06677c7cce52ebf737fc48a0726449b5d3f37fd8ea24ea591dee2efa2ae8f860766cfeacbc7704c7f6f02835eaaaf3ef93726f538fae7f511f50298554a9bf0ae3a93c9d76914a94d9e500d02b2c86b362720470b20038d733e7e8d21475b7de7add09829b86448f6e30d61a3e0c1e838b18c1756df8daa8b27a8a4f0e9e19e79aa74217545e0ebf7aad221da57b04e95f3f210cb45a6464002997d0c54681a3e8df2c3905956a3d69a067725b6f35cba3476aa7892bcdee8aec6e18fa9a61d1b9ece698bd9789aca3937abfb270ba89426f0ada8dd210e81028ca3066bc5f3da9a624942552a5e956c4406882e5cc6950176cb3eb710d1436afcbcf82acb5c2961e9a75dc9c670f47fecf37c7e892a9bfa8f80e14d5f3744180f5359cb30eaa97fc0d5a35053ef0fa46b37aad67bbe6a73a5435e3bcaaaf1a94269bea4d8ca57d857f96a2221785e052f00081eec02c284413385fb4e52e2830e8e7315535b2693b59020238e6bd670daa60fba165c411f594b7d98dda9827edc000f91eb016c173ca1657808ae5ce88ce5f4feff1399cb390d16c63bb5c2aadf83a8f8374aa0b32249b4048feaab9ab1e9886d1dbb86e66880a83d6a3bddfc19f0da64a9169f93cf3cd0b04a29eafafe18720058dac691d2cda354be39b195bca845e2703aea915c86dff74e3fdbba071a140fc3f1f58aa5843f808f3a7bf04bbc38f088c8f4003cba67433ff007e8378b0d6756fa9b9411023c56fae1fa67df50ac7c948be608ea279cbb502be7ae3266b19727f20df9a80d420c82b727d413fe4d90053aaddba28b31ad661141392b80c9ca5207e9e9a85e551e6c9f11c943a1587da861ab2d15c158e32725032d486bf18262f25fad58120e9dc5b12200850bc7374c843e4be875d82b7bc7a4194146f7b3da74cbd95c6a5c5ad0224366d36189b71c0cc60ff3a4b6a4cff802c8427b51f4edd88054eb8ebed0481aaf7d34e9c19ba84c48f63472370f0e979799fdf600b526c383feee9b95d5568b1b60a922691064244d4b43020cb5077f03f91f777ba7a3ea544f9a1a932b6a46b546d2d09225144d4156de2b76647dda23460fcefda98feefe1a9a777b0e4ef11c5c0e6c42f852d89e21f6279eb4d84339e4b50f02c67c1013a79ca183b229a93ffd7bb61244fb10d1e224bc905ef447caf1eeaef572a831301b43263c63d5a4292dc28e62afdbfb40ae89a4e900d0e82bdcbf3ec55c1f56559093f68193d5556f224148cfc6736be45f860dfb0e68f4948082c63804a22bd5ecb7d4ec60c18b770c70a2e41baa32b01753837e2246c394b80b66c82dd9188b566b4f40c850947eefb6d970bd7ac9b947cb0972cbed362fbd87e4aea6d11e341c8407b9f9e011ffa72d1043f07264f65023ccdbcfb2bab6b89d58055688bef1e841a0300c9c7d4b4b2c6ece7b598a856918dafb1de2f63881b2535065aba79b347117677490729dceb24bd5a403341fb322bd3bc8bd98e3b97efbeaef16218c71557a5a1c0f048e314cb92c6ed6a2e23498dfde92e1f28500d75660210766f9bb080fc7488f7e03bd2ac9032f50c9e7b18045cdf6a8f4e5d7843950f396694e37e25a2dd625930382b1dcbfb8ebcd4fa295466bfcbaaa28c4f1cb3a5b00b6e1df0c837626514e74ef4f811c6f0917e417a609c41a47e0de75237c84f2edfe70e0debbd7872b2e1e84f4cafb7b95d2cb9b157bf983490acd3a16697973dfd494204335cd60c77b4b6d56ad377ff4d1178fd1965a0f5cd92807ef679b56a32f7316a803be746fb954bda619f1b45aa61ee4d9e9524ac6f8cff1d68d9625975921fe84ebc6a57ffb68646e1628b8b28bc77b777d27a4e25bee94e286dd003adec8dfdab7b8076fc4fa141e387359a9b02879cd32584a4e98cadf00e35a7868bf5306e4e66c930b38b2bd2e6c786c8c14777e0cd83209db55628823700d62a9dc1ff53271df42f972ee5b8e6f95ded02330bf566348e64fa7124e00e9765a582e0fa63f82b6dabf017ecf5c2bc37dd8ad74e9039c37c6ab8c4e8e8988075ffdb8868fcac2d26231edf858ae420f383a449002a55d222f09cd78ac57f547d2878361cd6b44e2af0b1fd1622123c0dc042cbd7c67c8a5af23b17a06f3c332f830203fd26ab086979b80ea59b6d2a18ed8c242260b82a6376644dcbcd4932534e5cd51b9b253847d0bbc8762a00d1804e01a82fbb73a5176bbbc8e4210ce1ab6de53da8560926492c3cdfa637da9485513dc94b829dc944fb6ea13156981a7cb3972fc13f6766ceaf1f21ef066d4677e8d5a2f7c81ad0408e3961d6a0ae567987c568dce62edf5796d649e391cd48024685e1ea9679abd9ca042f72ba1d0581a5ec1227b1642f862f60d4dfb744a8870ccd268e2b5728dfadb366993d7ee4626e5a71101e6f8dae63abd0139eb4842b9c05f45e27ba037b2006e29a0845f279b18ab94a191cfc5594fcd82bee7405611748f800b396909e9481517ceb43d7e2fa734ef120e8a5244dc9e76c92d002521156158c56ee9f23588250ee8db22205e7c724d9b5c403dc92bfb1660f48e483a13ef4a299ae747e5c82f6733bdbcb9b65d6c0faaf1aeddf385412cfc23c61fcb54803958423df1fd5e0c3ad88c22731792a988f764516c94e7570709ff55024065ec8a6b97224387bf6344dd5dcaf0bcc9ff575788765d31b6cc4664d23b68eaa91fffe5078954c45b7c5ed7a734c58f63a529b2e45463dfbd68850c3f5210ecb1339bc549c108e3905813037f94fdf63db435b4af5e50429c77a4f28183a136d477b3b06f731038b563b3b952cb074f68e3cdabf9362887954292ed3af40038547bdd791b3d62663f02159a4fd5775dcc584203a00ea6b4f2807735c12ea9061d4dabc93586e8c3d5386cea9037bbaa450b5100c860f482409e38295c6da43d7039086a22287435e5e519544d30d31af4c20256fac222f4d251c06fbc23a47d7e500cf15f9a4ac361eceb2fec68a8d0084a210e1fe161e7ef6cd3b856d39e3a119335ccfeac210f0a3933d2e8957b5ed896c3c6dbbc1bd3cc49d4fcc9748c50a238d15084f4137f1db4ffb71f33750994f5232613301250514d9dc1f7dfcd09b0fa31d949dec092b424a680a33cfbcc392ee467ec0ee7aac44357503400ea0c69253dbfa4928bbd8185ac747226a55efc21a40fd9da5e594fde0adc6fa19ae13c2b6dfc403eb2e00d0e3de7cf2611a9db43dbc3ec73663435033acf143c517e44277659f72777a987219144ec8591f2263106a58503aa8b64300005f62ea92e11129062b0b94315c09ee3b0623ed80346b3434a4e23790a8224260116fb5bb78dbd5bf63c04aa7f7f49f755da68cab4ebac5e82901922e3cc5cc9b3537054621f802621d5bb8793286fd337c56bd261875a45727171d77436941c00f705339666983750bb5e1a812274c15fecfa94d2fd409ad440d7c75997db3c06504a17a4ce0a32a780ad5487b302e7d498839bf57f41bdf153a20093271fb669f9c1a8eaaed2a7e187e75b7d238818c7d54530d9902806e6db4e272c9a481e0a1c854e73eb526c8d06fe4990bf13998b8891e4ce30ca50c3b9d090ef70e955f1fd73ed82ab053a9981e4c89d3cad96f77269d471cd19e0a641269e32b75c1fb1959844f7c8fca512eb5d927b9019b362bbdb633059c044ca77e7d3d37cd2b24e5d46c3034f52cbf863afb9749178c0019d3b53ee9a5a04b63bc1c17dbb3e6bbfe85684b05a32e18106ab06d7db8759447abb6b334fb742f95aeda71cac957479c126dd9df6694d60fb8f546ede90344b272229eac01e122775913d643960423bc49ae4818f1297a32b8bfed60395c9683519d01a08262abc6c163d33dff6515bd371659278cdc557c22376a6ae180931771d0c597f1ee10ea5138d9d9f7b4fc282ad2d5d04ba64f1c93dcd5ea77fa48497a7c23c650a107da469afc1f25af48b169ee7a4d798f6397c3d8bcbfc9a00f54fab1e5a6466102887bfe2c08443731dd4a929be9c7b108c58560804174c8d444aa9345400110fafcb033ff5a01444f94568a85e2ec0d9c39f1dc9d88d93c5768e6c00a16ec4ffb19ea2303f41f7d8a30dd1617ff35c2df55b366fb3d97dcb6a2746fa275483fb1ff1470ca0721e273e75c684c350ea11118a8da0059889350238a5d5b5cc7178f4b9d3a33233859302885d899658adbc20a758e2373994a1eae538995ed160b029e9ac3bb9d0dd62813bfabce3e3a45ac0b3372bdc707ca6f532f928c3d623c24fb820865df970e58fc017585688055e0c0acc370d71a6bb132d2e24b4631bde3830b83563a7ff72fa648d935db566e092a54641d8292c6c364dd5a531b494a021f62a8a59d02234159389b523f0e2b9d7530d84e7597c5a4cb6da2a307f2bdbefbec2aca580e53dab43e6972dc802e176705069b7f836f263e42c332628f0167a08c38cbbd4d8cb6368d6884a00391375e9f3004dfd6f0d1bb385dac45a4652cc56f8340affea585127596bce92650361d2fee254859990dc6f0a9f8138f007aaa71cb451f236a3480f153a73b05402876c11cf4dfa231a6e717307c46d28626692dad2b3e6e0d90fd2dc3f249e0324105754f0013bbd14003b7a917334f0c9f54e0f0b54ff24735fc226848143bbe6f835b2cf6b4445c54547dce73e6eae9e9beb00bbbbf244642ccfc69b47523a42dda5913f1bed1aa7c5040de4fce431770c7da2d32dec54e116eb10a0e7a3d6f8a53aca3827e3569695f17fd4e712ffc7d19095c09d580263dc098414ed995b0982e39a5f25b087f8c1bfd64ad057beb6a87207400c98e3adb98f4a5cff9309b149d098fbb01fc44b72ddaed42f886aa9b2977d413b2f20588e4bf109002b72ed6d428f1ee97cabe388059c77d13d7fad529201d4bf8e7707797f01d640e557a5ad44bfa53c983b6dbace0e93a5bf43668712816b052e864a9945ecacc40ffe0bfb686902a0a5b59b1f960e5a5be30acd52f685a0bc1b840cfa9f60ad9f9c3806080b2ded718b35a3ad3098aaf07916ae5e55651ed92d3f36b23bc6d9f464e569d81d7abe5d23cb5bd324dde9ba19105372f10dce6964d1f9d97e9413d65889ea9e8872a858454ed0a26ed7eb0d7d211285dc02109d3d79f901389c105b1ccfa33d9f3a789f2bb575fc8cb5dc184a0953d6dd6c458d1d5440dd0e89c1ca72ef4ba89083aafcbf7e8e9b3d5f27025cb85110cb0d2ab3f17bbebc1b1b9cc49cb957bed2ec0b159a8728d4c6531cd324c12fe8e82883ad96a1e3d27b49b6717c2cbb5d4708c383f2dba74d436818f48cb5f3840e0172d7f781bf45a240b8cb6e91be0e120bd5019ebb700baac0e8bec9d803e666f9e50e45ab40be2df2e4b2547279870a1b0ef4487aba7d4015a25d70c8f8dd1961d1ae3190842352cd824b0a206848ffaf15d83abdad2a473e64aefcf654ddec907909b014650d4d5e95b937cf882320c63551ef432e52a0710947f381dd5656a1c4eca39cbb7d4c08833eec3cec5664594563df6e274123b85f3c55033873089fdb3a478e5e9779b0dc9848d5259bff77be992dc562bea3257c8f755e766c196520f9a987b8fc955ffef9f2ad9810baefbd6c7b112172b040822d46d95be376487afe4714a8423be1234882d64a93466095b9d5c2ce7ec54f8952491734212b7dd8f0a8fc7377a051c1bb643d9388e8fcb887b1d2a8a0097b5ee30409687495e90301d0c2e4f092ab7ff36f48b7c53442fc95edbb16456b6b0251a85365ff10da25caea4015594c9e8b7cd59330e223dac82dc6a8658ecf1b6a88055761d89f166f44c8375dc7f0c635c21f67fde1c0b8941263ab3f2a2d79f14af83a666697d677f11f83b7a084eb1e46746c6a3235c7493070d5205daf00500ed073a41143694dc0fc0b269b60c783f7006ff478e171b10d9e8e7004090198423829a4d9465499056b6065f710008ec3630ca6400716a79bf53120df8ed9ef7414ad155070d8573990e34b0528d3afca3d3ccf5a8e767e22c4b4df4fdde11ef9c2652fc4a21dfb70df10e27633149475a1a1fd4e84303212438ff4cc8dbb62cfe8207c7fded656f07478a96447f22fbdd723b8f6b081f620ba8357f5764f58e641fa310f621879f5c58c64b3f5f1bd385c45f0195c40685f49dcd16a2138d611ec0d45a15feaf2865dc7c1bde1cb2b76c9555147b5956b035326d75ef5b349fa2c26569963970c5d2c57c8beb07cf2ee55b5e74a88ed1934d044aa17d9f98118e3f5366d3239a98ae16475dae6bed269d5262f41adfee64e0e401ca276e0d413cac1214b4efe402d5565c81f11217a716366eeccfea381069f564064c0d1e7307c7b9201d426c361edf1a6301c9c73c13419d1d4c74d23eb813dfede6d0b747b33c29996c7622580cbe07be9ac54bc58ecd762c9dbcbbfe61a3923ebcf2a8891eb228ee86124966b302d28f00ae0a20aea56ada3fa223a484c1ddc47d9af2704366e151b3a73b882c9b61d6679682bb80560072065f00323a83c34861a20dfc0078d80ff23b80bd08cf92acb45307dd93e2a272ecd0dd26e81d52d1097c21d7c35e3c8d28bfa730780f2011c6c619830b860670c37fc99bf91e5cf117e4adedad07ac59cfa1b4c577a38ef1c572ed2f2f8b19ee5ae9bb5db0e4509ccdecbe0638cac7fda4a6bc0d1b76c7653e1068cb6cabe5c14c3d3e3b3f5a0c71f1affd23c2cd22fcbd8604c2e48aea52b31c87dbf6d01afb88032293aed3d64d569d5026a53a22036cf0e74d8e050ace61695ddb14c96dbb682b58ba620aa951a961202b6f2ff1501fcef8cb403457cff719fa538e2bde80148b8fb56c46813fff9c402a61566f0cc65f146d626c8c4c2159fe3400624b36be5450eb26793602aa43728f568db518d1a44740948d7fbeaf89d2f83e1657aed76110a7f580f9ec5c38f4fdc37aefdd57fd61237e7cf16b315e8833dae142d1c3aa173ee52ae7b5f12513f8a8f4fc2b43384a624c2fd1e84ecc8569d147439244fa7d03b9feb3cfae01fa70cbcbbd30614a47b437ef4e95a73a2f84424a0c71e04b57d742a093c4c259a48c02f89e915e8063893fb5f72ffa41518b6f8dad03490ac90e468c66eeee2a9d54dbc871c3e090ca271ea3712fda73954a210e496f138552d589df4776a3724ce21ebc0f68d0b06fc01a4432c9a9c2a32ab436e93c1408268df80a9f2e0f569f9bb9186859d8294dfc381802b048a9457ab57417f048bb3d02c0428c649c6b1f92e4422d219b63fb07aa695467c4d46b689202fb9703d75a051cb23b82e5c7452cd8de86b8c8f9e1b48ca2e8951acc5e754c26a096d2cf83d3493281a3c367dfc8aa3d860f005cb0a7083d338f1a31f2451f82903e4d9336b4bc39e9e82bff7e94442dbc87cf5b03a47fb429b95d05e60bcd923eaa5ff97e2cc4c4b12ccbfab3d7e19109ac3634a57b4cc924eecddf5b8fac304fd28422fd0a41eaa779926ea89bac8062876e2864d6e011708c3794851a22dc65fc99c25da713bd0027a54ec26711bb20b5993ba79979f959affe4c0e8f433023b267d36870dbfb91b9c41ad528b3b19368a1a36ecca257a8dadc6c93e72781d318e0fca097bfe4aaef5ad8fdc5f20363b9ec2de4c480006e80f2014b791f644b890fc3ea1000942edd46974cc878d6f5ec5000cbc18408834b393c52f0ad3d4bb667f9b1f155957c2c9a8d2169a902b78d64c7185e58748e62563421e1a9ffef08cb36d1e63342e5f4768c675e07d248311f17e8972f2e3685220c1842f21be2a99c7ea2d78bcf1dc7112ee20c11875dfa53a763c017af0cc25039f6f26804a7bc4ee5624034b8ea3f4c8d3d798941c7c92127852abe6a1045fc4ab1b617236b1d3869db9ba09ffcafe5829fcff5d8f8e85ff6a8d657c5b519ef7206ef83f5c11fff2bfb06ca9b95964fcb1425fc79ad83540c2b4cbe072e9e8ff0a96ce6dc295e0a5763908045e9d0203c8365c72b1763932bb3ac0cb07109ac6bc0b479d595d69033f3493f8f82be7d6400d21d3077b3325dc2170bfd98afe02dd8f68a15cf859dea4e39e8f7e20666867408f6accae4c8c5e5cf22acfc7748e80c4360a59ee1cbe7e9740f46e50af1766e1366a4a72988fe787ab01b604a91e3363c770a809bdf11fde0e8a24bfc7f05fad1f4a9ab8bf81cd4e4c02f17bdf690184cfcabdd672bc37e0f2972e3278d16717607e0a1e93ee9ed846338c2305c1b31fa64cffba0d07e76e5b123f2f3aee150370602b62a4b489f36adfc9b5de312634042a6644c50f5996e3cc34e6cfdd56560164d73659e833b865c8706bae83365ea3563de1fba2d055847cd0f0af95b1f35e6631ae0bec7cc50e2ca126e3bbed304275cc176c53148eac625974e78b0a058685315565da4e8193d00cd80ee0d8091fa5e6553d4e39b932ab70d90cfef768f9fe2e5ad3bccd2f21d3301662382eae932ebb407b1980bac067cca00d4d342e97da82addda7754be7ddee6a41c43600545197c0aaeae924af74b98f652c36504e8174ebd7e82f02a0685e5cb3499b6eea696dcee2ccd671bf7e86c5db18f6f00c4def546c8ed2174f740aafae5c3d118419db9edf0fb6b2a32c95c17d64144c1b68291055ca109aa156aad4f3d9858e19b4b1c7baa706fa8bd87eea38db97f784dd4ada2cc0fc868ed0f60e66b3c3a78863dc08927c6eabb5ae77f240b371593d6cf3b107fd4dd6b679a3a5d78283411b91b9051822027aaaf03ed7db4018203d4d41d617d36b08cdfde4491dd2f041a2adf2d0b7de8edf1a352938045853a40e2c95d0bfa01a7a32c8d0a93b30094597b00857a23f2297acdfe5feb4769353b6654e4a88a333c0b26abdbed19c9901d0ae6c03eff12ab740b135a013507e6f3ed99034ea0bf062c6a78ce2919f82554bc77d1bdb28163127e81f0bc2a4dbe9432d0815c1678be989ac0168763ccb94265c7c12853f9719dadacd87e73470a439dfffeed502a8b8cd2657a71a5e1ddedf34bb55b98a1a9a2ae387614399a5d32b4b18966ee0804fab4a70ce6fcd10ddf57d86020b7a8643af0926ab727a0be8971a8c8240eb1aba4d25258e7b4b94ac1ec4a16938a18a772375f49c2e7f5059d56be417bb49d12af3f8d422b9c370447c266de42feacaaf62e0560fc3cd329b6385852f50a009459ae86c7baaabc5dbc6f360d8e24c2e81082f4f29f4d6db956ee9ecbcad14556e957ae703be5387fa72606e493032088a4af99fc51fe467683dbc93f4d7a0f011f30f7ade9e022ec0eec10856172f27e417ae64fbc68600e5a0fdfb353b34b54d3d2d3b13dc423155c419615b2ee1fefa7bf172e72ca26bdd4598f9986ff725da41505b77d85ec93679ea0d0a8bff0fad572116e80a2072d83633b0e033f63dfba5d2872e17f98bc1742cabc65f3e7adecef4b356ca894907abe73d0b773ec5ce2db7f0069d960b97141a111708842178316d89ee616b3e7b28071b00baf7f23d2a0c128d4d5d26494600afcd7949b9cc4b0e36f7bed117fa2debbd5b9d1fb0b1d2fc2d9dc5507beb06d6f5e02bfb43d2731648d1775bffb793e9a983e33f77b40d85745f4fbca71d13c5ea62949f9a8617a1f61a53201333d7d310c90ae1ff6cdfc598f8c22b11f0f5d7eae49eb59673241c55c9c29ddf5aa0b7bfc1b8cbd9e2569a8b505acee2fcb52b9e164cecbac4620648819d91f62ae7ae5d809fedc654800bb6ca3338f127179ed85a6c1006d434672bd986e593c2d06ceea22d36d2bfe210b2684384c2d3e347bf31991b30e0de3a3e68358ac86614733a3ddc74d4faddac75f7caa694abf5605986356ac3fc6a6ab58591c90d294e94c48be1e45d31f16ef3e908d67e1da8c4af976ef3e5d091a1eb9debc6ff9089ad7a9ba6e50753a2595e410c802302fa87f81e9bf31376a622faa27e456c5940017c09c94a1e40d4ed2e2b88911281f39d1a2adb89e2354262665fb15c5d17cc2397a5a3b7a362e29f864dc0fcdc4ba59211470a1787040c907477c29e62e7f4417c27e25e0d8744856473dfc9c8a0b4f4c2ea47118fdd3defa2eb319ec189ad0ab460c02bc30fedddea0d590eebed33e36e06e6b0fe6e3825211352e24b8a991e08f106f8698d2f29de323f86e53c57a1ff5fab7c3dd460316e249ee104e6fcf7b2ebb417fc7642994d5a859d3e17b56c8bb817c434c5a467bb16c8c5f0fd3b794dadbc8967d00f568b53e43c75beb283fc9baf96ea9c081c34e2548a6244b64479060f300a50bdbab89e1a1ee63be723642924e4d20ab460538f26f10560f9ea34a65309cab5e8fadcc49a94626b4b47d89b1b64f82d0c272d78d7dc44b36aa11cce4fc527e84f015a0c1d9d04de20d0523aa3b7aaa60deae3283f9b65cf5adaf79bd17bab1ee901fdfc20d45223ac5cc1487411fee0178bdb022c8e14b9b1185007470814b306f42de89f292b00a34709e2dc81a52ef4acc503c7f2e99baa33c9fc441071b848acd842f769fa38a77473df5877316fd31ea6a4b805e2c7aad033000a5c9b48126c692a8d2856855e6af6330c71acfc835bb389e03908a32954afe11dc65f8a79e724c8a578f9db46b4ce99389e80d9b0041a141ce590e5007d96346207fd8bd9ee435eb566bc4ad8dcbb5b0fb3a54f354696770a7e4e6ccbcf90a3090cb6022ab1155b204865763077924070783f8120526267d8fb6d0b6feda500974850f2448c9c1a0504e137703b096d4afad6d816f5b2650f8afa257ec37a1d10e8abd00b67b935b7adbf0436b1d5c186ab2897e93e1631652a21e094e33b1d5a0cae6e70e1014d43905d8d0ca68ca49ba37965ed38c9eb7211f6939c1b2989095a4c9a70fb9b4ac7f054eb00f13a6f0232edf444a45281bd5c35a0f288c3e372499bfadac112d1ce096f7afc7a3d68f918f41b6ee595a7853358a14dc70cdaf450c24f0c42e6c8fed448f6c7338bdabe983e43a4d45a2ef1dff0478c69c53b64987eb1ed47c657ac0a756f5999725d0f302187a2d9fdfb258389afda79f749f6dae38a8338aa7574e38947a58747b5b83b2844f377c22280425394406ffb99bce1923f35d6125de9630fa4eaa9222a0c42d028479c74b73d067a00e698724532b0523af1adb36254cc987929029ae1df18e496fd831a30b3174cd97529132ea09cd6d19009fffc68eb68ac7603a9a933702f58cbbba0c1d61c3ffc5fcbb4e6ec00cd7b8ed1d2cbc9e810c04688e9e688f2a7b442e518c42859be6f16c02c40a5478da86fdfb0f4af59e704fd50586b5126ad9c7f022e6e120a25ce3deb5f50c15064bb9a3e6dde07a41368d57b583c4345d6d2199e79ca9f7cb9a49091a08a3160623c6c41f050e54b16be21ce916aadb28819bb648a4538c60f68b5a516d09a6de4ebae0909f97f8c259f3b227ba43436de6643b12ab5827435b9acbd2c398c59d3f818e92e87cb1a8f354b8f48a81cb34db91810ebb0c69800c0713ff91b1562fe89c2bb0f937f5cb348b55b4d011a5c75960c49de2b79c75e315ce8a868d10cfb7f6d61c4052d9c32dca69dba9d0d949b8897d465b9e7c3a483629491d7f2f4762e812ca8e5195787822e7e887a8bfbdeb8c0d06aedf19181162fb9f59eab9ca9aca26604cee5ac24b58d7558639900c811ba65357fd3411b72b35818d556ba8729c388f87e79190a0baa0b352ac019d512a129a4a5092423e457aa0a2e63ff3231ce4fa056dcc48bbf42d9b345aa14d217f35339d02658db3a925f665b2de9812305db837b0293e01027a9b40e8856d43605edd7ed917c4c17b561645d2498fbcdaa376f0a56fd4bfceeeb9f8258cc48a7a93fa981db32716dc62408e483d42c3947c6053bd758e76f533a694a89a60087fb1454904f215fea009efd0b9e7354e86f8d1771dc4a0ca4837738ebd932517073625a5e5a13bfed1b7f54e346e5defbe586ef1c85724e0abbb92b101573708f4268f2a202a1c70bd40a8a9b779d7a68ba67812b5a04f579b59a05f27cc99dd3ac97de6260c335a2f87fef3d16bcac1c0164ee993b3fde93ea93036494bf72eda48b661778b73e0eded587c8c7436522f7ce336aebce41d95d0f9f439adb776367c8bf119ac4113627558022aff8b00d1d4724fad3983895a77c82fe09e7b1fa441e37a83d2bf443204de76a06c4318028e4c0016cf30637c8cb531d45ecb906d33d0451552b6c2c0d8d86a62563d833ca63eb3c70dccf6a1f9acbc6c4b0e85ef3fac83bb3acdd3648570222ce583cb403a2dee151df0b439a5eef33cfebc9320e2aab002a225b100712f5ceb0f59d2e4989534fdbd1b987e6c01f707b964682291eac5b513887e8944477e38169fa213cbe5da816b57f20ecead940c1fb8066522986ad3600466635e26fb2e482e4ed5b8b113993aa62c370b3d36050bdeff6c852964b0f7511cde0a09163559e432331f377962a3da830bdd855a4c3f8a84d896a2d0351a547bdb1a3ef39cef09b940f68c438bc45468d9e0cacd55df2e536f38868fd36f8e913e4e2220495fa2d284553442357b07b3fea6115b42666746091f8ad55f050f7c9233bda10e9f1972247499aaad4d9515c919964d1846d8f915d3e67209d1bca575504b150503d465e29a08aeebb2cb16dffac56257ea03d1a8c2b99567ce23ead111263a94c687ee2f64d27b3f807a0eb32277b96ab611f537702ac349b04c412c5ba899a896a40a9275b6943ab633ef975fc1296811c22a1c1c12e9d5922563d199e5c1f08988db2fe46f940f45364f2448c30992f17abeb7308022e1d6ca59c58e2965377e5f7368c2862d4360bb5bfb688cfb2cff05839427ebc094a5a041ee0effaf9746c05c123069d6aac6cafcea28ae8d341a27083ded1125180c97c185813b57fae221a82403cdee0e15112aac5b394c5e6fae3cef129bae28ab171d334ad34aa4dae4d7101bf678bd4a48c97bbd8b7b1fd6572aa540c58047ce7ee393de140584912bfb5e2c3cc6a51421571f1e4dc5bfcdd529ce5deab631c5e07b7cdb1ae1ad80b384ccda784fb308a7eaa018858d7c992368f8062d4cbdc38cce32a53a8f086208794783dd5a6710d77119821c34e83eec50dc633721c993858fe5f9b4d5f6a592f098f26f4fb1998f6ec47ec9423de1bd810ca6a401dbf533866ac45b85509bf692c44175c2d3fd87b5581980d73a70d801abf99c63d16fa57b4c0593a4dcf794c3d1d8552df85bcdee98d120237f15267798e2469a5718408634f75416ff44105c1e20c7b2558587c6b402c441a80f1027332401346172a57c0c1055c9e355158731432476cba508949f5926461bc99cbe9670dae82ed82dc92dfffc3fc2e61786789b11178f3c5dd562629afba80e84f3c55a2c7c972e21452bc30ed754c9b41bc66808d72661278705e7026bd1baedb9338e268355994333f7b6d90cfda7b8ff0451e573f897bbe5cf47aaf921233f9654dbe599986a0f6bb1a0fc7837179a6776e400949be71403bdfc554f00fbc28020dd9f7c033279993d119924caceaa6c5f71a94a82701b334d82d7cad6f44fd4d288752ad508a53eebf2e0652f8ce6b625bb78421bc92dd5fa2333b7a1137c61295632c451ec93acf8a7f278ab91fc2af1ec16a76555ab653268ecc654d46ff90a413196c1adea1fec7f66b5a92a06920e5744c2af1cb032fe61760b7f33b05159c7d267089e6470ae7bb786bc5a47dc406bf01ba33637224d1fede3acb7e44408ee53f76969ae7f5fbfb1f750b30e2bae6ec246300d2665bd97a21ecab71735df804098956f58162ac1adf42243d5b1406379255bfb78889c820c78784c69f5632fca15a2a423b22bb12a0c050d2c5fbb0ffe9e7acb9a7d55fa9cd74a4dd12b65ff73bcc6702031a590003845d2e5f20092cca4a25e368a4491a36f584102ffd1872be40a91ac803e34e390b9ac00b276b6c20d4882923eb35ae29ff871f9c5697d7236018926dd93e0f554d543066e0e813375135e160ca0c1e340a090322f54f4cb5b18a04fe52f776258446acf5cb763f02275fdc4e8d69b5862d5252faf18f3c4353c331af40c2c323a30a4880b7de9bc4ffc0e1bb6d9b358c6b13681db9a1bbf50726688e236e0d6703c4e8e5b1254e9f6b42fcc60c3c5f79737c7e493de4a7f8201510f3faa6008d6ee58193ac4120588da4ef91e0c0f47b2dad9b26c04d194dc107f46daacdce2b20b71c4a1c386410debb48650ad522e5f816e0786899aaea1fc14eab105553a5ccb51a2fc7076f544f137e38110b5d8e4a76ea07fffb1bb75e8ce38b5ee2f4f77f61da78799fe8e479f6e2374b6ff51044f3e5dafce10bc5a805111fe36deb17fa61cb3803df04b133ae995f44cd3c5046d550ad98d02bd549b3ce702f1cc54424c4ad50258cd81fcac664e1a0d19a87ae7df3157a067f4c51385fc714afc41c5e698d9941c1bc58ba0a796ee5dc62673718a41c8d9e0036395cd8b525488c1ccdd4de32f28aa8d91c96439521cabb1119f5b77547bf78e134f092719254e8910d2b3d55247c8236e16b801cd08df4459fec711e61b3e422ef73861bb9c930b90f7d91895168b5df4d80e1e510e91f6e5e3b6e778f275db913c081a444fed1803cfc04a65804bbacffe832263c76075897f11283c11458dfc99661da5575a69e957825014505e6b07035354d1360575a46024c50af7e258cee6dc18c139f3995293e5a2dc5a600d021f870c053a671b7c49e4e88ac2cc13357d0a7551d6f42e2d52cc5273a15b898884387b68f3ed0f54041609988d3ba424c2f5070db5bb6af9289f01c3c463887c5760066715185089749cbc647e85d1abf0834b79de0c846e6c7c56f15a361331d490c88c1c8290d3d0097a0314298364fb8b662f9de547afbb0ca70cb0ae0a0cb2dcfd3056ba8ea3414228aa07cbeb3adc761e37583814d5ad8c003b1983df1f7dcd169428d5061a259ac65cf5b787c8fb39a7f59829f6673302b8f6ac68986133a41e39cffa07ed2fb4ebc00809d6694788f542c4e2d62101d526af12b395e8131c732251f3f807e8b30d32204204cdd64b1b8daad473c855e94ade0996755a4a20e6a3f8b5525da4a667f7afa7969428a6c8f49d5622283a52d86f1697a7cdca90ef15654ce59e997b3793e818a23f5dd9dbfb4dcea8ebdad679c008d1efe43fb776cc31e3eebaf0d017d5554c88c6f17c604589e8015f820189d357d68354c16b44f548b06bc304dabe0f0f6878c133ebc6dd02f0a5a931a5525d2f4886a647c70b68dd7628406f89231c27ad4b66e39690039937e1ed3d33ba911712a6d9cd2c21831a8a0542af1881bb7e29e33e58659dc782ca52f1f65da4e4d382dbe11f48fd763f112ad7691e942412462bf0c16eadf6bea806473aed118a951c93b1679c7650a89294b9811ca46344fdf5a42f1cb02efc12819e08738b856c05b3f4a157cddf4444c227a3a3e879dd4fc8331b1b8a04c047d606320aae484c024c4f8a74019c985a7af2d5eb89ba0a3696b93f1d1ad23b0b54035a3e0a2fd1b913a70ec63ee68030a8037b4aa6bccce6193b3b74db26d15b5bd56514ecc065f154a36a0889b206c265f034e990a992194b2cb1ac242c6f2901f8fff7b8511e3670a5cbc8cd922128fa141d28480222880273e5cd53d4de72318e7741e32acfea6f90afa9c259b77392c19d9c91a2cd3c99542a83acd074b1ba4b3727d528d99ef7ad5ff0e28ff516311acfef3b5357033830f77df8b98e7d3bd08bc240f23ddd16954358169a9b4a825a1ece6035d07d195c61a3434e2ac49ab2dd16dd9f77396f4c86077e696de511cf813626f405c71140c1b01259fb393e2352daee3ee14ff782e6ec14445b3457839d90c0e987be9cf1c3e031f6501033b9d2cd0cb10360a427696e90aca312e0b234040a3b46c740fed270ad4cc55a901f85ff4b9571f9f632af91d681333ad082c5e3ac9dfd30557c9f9bb07d1dd436b699fc7b84f836f58a016700739ebba44292ab00dbc3ed33aae32a924b8f75e415b895ab40630c718f8ed777aa6f94bf40a28f1d354d02140ce750ae2f7916c65a5d450798a005204102d850fb07de843cd4a29bee1420d0bf763ba27bf5809534e7fd16e9a12ab6d73573abe81252f2f8c6fc77e572df2562b201d9f1efa99767863b4686b7eef07fedc03f281a5faa53b4a004723b67add7fa4f3d4e74203fafc3012a5a695e67890ee76550cb33ce8a5a77ac0d40e701c7b50aab5e4c8c2cb220d56eca1d50f25d7951e9bc2cd6fb270a208087d37912a19ad6bc91a81e334e595d031f8d01abc277132a07b05af4ad31eb0c0cae703febd51ff3f3846ce0349b0e829abd2f51c7b980c04530a381977e6fb4563227ab5adfdcbd3f75a2ec9415daf8f59bd41b845140f67cf42333632689fae8f51b057faa82401ee7e4dc5cf9dbd54353adba50a646c28730b8941460243a992cdff43c4053355e4d8e04c770fa104091c1d82468531230737de5f7a0ce124c5da24008d4f9592ca13f3e454427e3b0bb0c1d7150a96513a32418d250eb18a890cae9cb3fbb8edfd2b96a79727044131925d72a5396c3c000c7f3932286d62b9a71c2178113bebb6876c4e79b37b87ad2a8d60c86597c508fa84623dab67b0050c84d413ee044c7121949689f114d7640f57082760d5ef8618264dc975b3c534116245d471401338ba7dc53e6898e795c6c84330262c99af4f26434e85bc0576ce064afb598ba5fb0cc6c3f3b0fb4be4c15b9327bf2ed23bb87da76ceb43b25bb28d78da1a028ea3f512fe961c31d51734f7aedced3130a64cd13e71b8f8ffc24b4810b4e975d536290169e788b4da3d444b895a2fc4bceaf43bec1df11638c49f0824c7560e75a112c0af34bafeadd90b1a1aa87ba8218c2466a95597ed0bb49671b17864aec5cbf499cc0b941b2a3d64109ee1c4b1a982a373f0850ce4c1d297266db6c8b5427532aea34c0c54b386562c2a23451a886a8d55431a3cac5b0c801961261138df7591a8f948ac9ed14d27535543f3d81b1015222a67934d79bf0003aa45fdeeb65f160ca24db33b49a036afcc377708a65799854e1f3ae159434ad474005f175706888e924d8e8e8447a5e04a015cc5b599079523b1c174ae7bacf2e703dd75deca46922e5a7a14e2019c740d04ed6556593c6c0db284cb1942bd41fd772fc4e7eba402510d4c6b4d6d723b13ab1d88cb387ea5a5363a1b199c84f7941793b0302574c69fdbe2e28b86f3d76c4a1d35ec0718f869e076bf88387ce5fcc02f888b56a554973c7cd1db49ce74a958a578d0b5bd27ab8c6dc26a2656bd856043689d7469f3ae80b473af7667a01f6d167d27f214837e2dbdb8a7398fc40e7bad24a8a932e769b27eda508758e91af59a048c8feb499b509b171f504c381fc320f62d81cb49b7a6ff754423c42e519cca69f46689fa9902f813c563f3a74f8621dd4f23a549a1384d632a2e70917b74a5232481be1b1e0ec736ba91035426f555ba763a67802867620201edcc1cdf1453f260609b6955376189a952b54374372b0d57c279924b7d5ba31ff425cac06be41a9f1384a157d5fd6b5e9c9e4cd8e91350b4053340e8955c7900fa08a81ead5a06560794a054069cdaa92ca610aec63a540018728d3eed619ad144505d1567a19f9c5e9363e1d8293f179c8e25e59aa103ba31fe2f64f8c0082bc06f08ac3e5611c19a65bf3ae0d05ac68f666636201e910f9f84c34613bde30725a00809b1bd4be921518541dde5c5142b02630f5c41192c4bad743d1de29aace5e90d9e0b6c3e320fd453b5a41e12935d5869eb9d523042ad3c97733a8120aef6a38f612abb7ebbf7c8f516c83b22530e5474705d66a0025d88c40f39c9ed7f54c1446910e5076c402747fc0b12db30805cd49f82d67bf2822810b127fe54d4eb174e884cb5d71eda12c93da39036d92143788d3ccf7e54d3bed7272535c39d75f675243bdac184d7b8d013bb2ecdb25d2864a44ea8471c3c556ab694f05f08fb88d8020035218065ca71c9efc9e4de383a2740f43425f036a444f9df8fe99f51eaf6c208bee7ead802e7b786ece93d4ab779ea6d394c8c353f5b8088366d271bad259030b613a267078e740c0e296420fbced181b7a0064682dbd5f883aa9c47e873d5822abd4d4ed8a7c4ee97116591ec017acb1567abf51aaaf466b617b350d6402f0ef97b5910e0f5f3ecaaf8a848cac2cd206fb3c3e79a3e6106a7a32d5d48c3c930aa6015ea4cefa222436a4f9ee854a590525325ee4acd43415aba75b0af9f1d613f220050155fc20478b6bc6f553c1203c7b92d37ac47b7c8ed1855764943a305ab42427668e8caffee01abe0265431abc4a39fb6d6562ba02a64c8fd45c142eb951286140383b61dff8abdda1c6f1aa16f4f36e35a2f5fe4c71d542c8524e37c132f1f11c4f4d8d019318705cafcaeba2e874b71fc0acf9ebdf41084a881ccacc169b7adabd4a693fd16e074bcfd75ee5809d4625eef22741928f151c32c1b2d71c57f2a2259d4f12c4122841901f737f3fc24904f282db39601085134c1fd3f5ac574c1f3635b6e9fb609dca2524842d326d77bc6bad526aef1f8e307599117b7f01909501d6088a726fc17dcb0a4d098165ce1f07596238172a840f6ea6bc5b3b944ed5d96484bf84dfa29ede170f6af41137a63262de208841b20008072931c490331d88fb82423d28c9ad99523ff277d8eba39babc68d13079d923c1c22b62f9d70ef12b85432a3844efccd330d3b7a2c4903ef5378e092035a521adbed29ad1daf989ab378fda625aeb6abd3120de27c7d2a528c920221213fe36a4d9d630a093d87cf0021d794e75483d840a693e0b22a0457848dce5be7ddc218926ba6ee0562e539b0899b82adbfd00a48a19fa33b9a0dbc48410042bbb090ae480edf6cf98153832e5082d415a3bd595e404b74e17a3bdb0c48630dc8702f0c221f44535d598c0c760feec9866b6a2b3d878638396ab8e1bdf434228a7bc1f21c67bf01cc94719f09d1785ba0ab56a9010973121882745b6c72ccc5b107209b692ae894a02c3f82f035e5a342ace22ba0fea4a80b2c86ce9cdcf58d16d6f15dc84afebe3f161bb513c61953082e845d5d9d03f07ecef81f3ab47c2cf7cb7f857f738fea33b2677d1094e131771e0fb3f4a4ebfbc267575941fedecd0f588cc42fe90fa781e32492a6287e66fc1ab957cc35c4350fc40ce46aa22f967ccd30801b5575d877385943f0fa0c4530190ca9d62b0902a71cad6b65dd076ee718ee84d2020b7b2e0282991aae66f24ed205689230453045322a731c8cb34fbe1e319b31b4f0063e3295dc6276567f5114c0e0ad37640d3e88a7ecc02f6c9dd2eaae80e51c7c1e39afecd36b622101d04e8b66a28099dc03eb2e8e05ced173afd3774fefd9d5e5b36fb159367048d8ad6964b11f08c37f618a78637fcef6b0d5c5f7899a05f97b71b672a9bf179f321daa4a524e169dd5a820dbfc1ac5ec4c3703054b8fc45ba13c500e06cbdbb274bcbd96d82fd7a8d7fc73004d63e52a56fa11ac723f3d627de309976d0b1a200fb7e748eb3ef74f128766a8739424268c091861f09f92743f33eb9dfdc6ac1896dc58e5a8bbed6b576b138f9821e248cc2763ec04251bd05738de9f3749eea955eb9fdd902ebbd7ffe8c5cc05b564d1e3f4078cab5355d4cd7d586feaa1837bed3732b27998e0c2571c3951606e47d9c9e055de17a4220a79e3f39386b4ccdc450d03a0834c5bc33dbff4cc8a4c1ce576124da4dc172514b8d0c14406735f39a33ce148f1944fca9f6d427d7e660463b783747ed0a999e5028675ad406e1982e5f18bf6de6ab6e54a5741c914b0b58e4884b7071167a05faff881d437f1fbebc115a039337e5d2e58fef1fc8544044de3f6865d1d9a2fd23fd4197d46cdadd2f60daa770caaac847854eebac3ae47c17abfc985455c0ed79dac4e6c6093b7b5620ebc30ed054daa8294a1a2a67d12939e9c2c4dc4600beae57d6f57319aa78feb2b95d68bda8ee4b24e08ee2c9aa6d807e801efb690f10ae8efe86e8780adfa031740eae118ed41b21ee8cc1936c337ec0eea1074470ef1e63db08e87534112b39f587f83caae5bc7db5d44c2e369a881d33fe5bb62285b4652f24173f24bcc166f3fa6ef06266238103bf3900a2c19639f339258e8f0ed493994f82ffb351dfb2088e3dc66f16606e2e5af48216e425f175daf97fc7496d61c7a57644b0cea7ae77a1628a4c488e3f329dccf8fa908a0cdd1b963f96b2c8fbf9cad45515cd976dd782e3906101eee75135834483ca8eee4a035fcbd3217c7e60cd07b14f21d1ae408cbdd582ef7783b366e9c447315fc9dad84bedef3cc5ede7b82ff67e0127d33a89073cef25428bcf74a77fcdd4df868550c92393fad109f8ec9de84262efd9f2be2249228ac5618095075241319effbb98f35253ad86a2814a147406552ede378eab1440813ab4c4aa88f117c7862d33727efdd511fcce4f01cbde798c27a842ec09a96016e00d1ecf7937b045bbe0bd84968fc0a052bfe0bbf10677df790d08bcffbf9f5c5a07eb23c0bcf3fdb1031053f7ce7964fa34c82d10c38e6645259e9b47072f22382685980114dcf7a7990e2ef78eb8a3d7d385eed35e310a0aac1f3ec2e4bb1b3d4cc40866dfd0f513f080f3e99802ff8742c870f2e205be061a3341d69d3f9277f5dbcd982c66ecb4c2215a623fa860ec4fc642ce0fb9fe739c15a75c39d8d95feff6a2b6da686410d25480c50094e9632c9858c2dc52a7a4cc2d58b1a583c566416428e63c2985aa80aa4d61b7ff140209380ec1b5a3ce1cb0c023c56af48bb31bdd9ece7ef7f0b319ed95b916c1d982e6e8501c1e74212d42ec632555de8a55052c9e32928c4ebc84c1baf32f56068b505d47f0e4fdc7a817429a59adfdcf22c1b6dcc9b3a5756ca52fff56df24592e4f4574571bc85c9ef8434282268ec877ad5d5250f37905cb9b9f330500c76a14b7ca71b6a555361ab5059b33995f983dae855a7c4fb026415a3b4fc3389f96d58d8e307451c9685184ce6c2868c3ace1ba541d1ea57a5c87c6622d0641c9950539a17c1d0970edb09ef36c82b81db75c69f55d8e608baa4dfb087b636975bbe36cbc25c7b253715a802a05dd410b9f8a64cb480d52122999499e38e181794849992967cf560af127e7bfd8fc2353ed5e312c29fab7463015cbd3691cd71a10459cddadc0ac5f2649029229c18e34ffe8904c350b631088f5e9f913a801c7b90d8c642a1692a855ed18b85772585730cd1710998ffe3139622d153c44a2664e00bbf3f3ea40ac2d1370408ac2b65e8a79b8d295090c8b8e89ca2131129dec1879527d49d2ce45268982b8b6eb609442aaf18f585e3b8a5be035c1c0dfcdc07bd4205cf6e7c73ff524c191019fc3e31b51c843fe100f12f7788462eaacc335f5d8bc7707ce56d571d5d229574b5a22b3cd7e201e090d42f560f93a74f3b7ff63d6cfd507e03b308d0280f5cb78a6085dec7800866f93467f7665dad839f1956eea8a10c64d81e2466f09374d5d21d4275372065cf6290ddf2c7685ba19f9301ac9aa1079c17d15f78356fd3b4807aab8f015fe9abc619be01ced26e0f650da4a55d24afd800b6db382953442e36e640e7c689ea9366f584e409e104a50024a5a0994fa030e5d2d869550092995030ed0c621f87c5e2318a98e466e640e7c583532a972c77c85785c42bd80232642692b81125642a57fc007b49d0c8334564e6c48ebaa04bd2461759044236eacc6d188e0c01b6ae8ab19bfcbe012ad8cf1491020a346b8f198ff8dcaf87cb4db88acbd1775e7a757b06021d58807e8dba8d0b46d4d4816447ba093ff2bcb6ab3d48ad6bcea6386509a84a6be1a2556e6787d9f1975423893b14643821d19076bff63227427e91aad539584e58812080e87575ab738cbf529321efc0312c112618d2a13489006ec6201eacc042a5150dcd57405fcbf5a84a45cb9bfc47674404f11780d37873fe197014f709c38e385cb50ae8957450c5216defc35aaf4dadab52a5ff4a242d21e01f003c70f1d41d54631d7993122d6daf6df7b4b29939432930286028b0276c8e3410b903edd63eefaa1f0d4de000f3421f799a9b90f58c725cfe5b1d8028fa063f55c46fc68d08c3fa60613712fcb0a4dbb64ced98d11c38cf931b1704b2dadfc70d288bfd1e624e1fa73b1aad987645fb54ad5cd9568f5abbb9b9b5591ae4101a54b3683db344ba1a10d35381d4cd9a1db287f785b3e2da708ceb00537c5af3543bbddab6ba7ebedd92a96d7d55410077cc805b82b2c8e89be28ee0a3a6575956d1120794c250678bd9c7ad6b26cce3eb98d6259329649f5f21d3b6459dc148ba88fed426138ebaa29ad2dac822c1f0ea34d62b18f7e501401d046d1ebf039bcd0e3f037bc0dbfe46b781a7e86a7bd0c1fc3c3f04afe8577e15bf8a067e193fc0a0ff4485e854fe167b94c6e23b3d194c9e435b21a398d1c95c764a88c862b57bfe99b5ecaf7f0499ff4571ee99d3ef7b977fa9abb3b0e5f0c9ce3a5bcd3277d0f6f7b280fe5931eca3b7dd2277dee739fcb5f3ee9933ef752de09cf9add5f054f5df754c275cbc2d0867dcf28d886e99e54e0a9b30dcf3d6d58eea9dfe96d9f5b407c2b8fe57d78dc4bf1637eca4f8f1bf3d38ff92923f14d2ee4a7c76d31b3142c9359b675cfe3759f5e9ba4b4a734383fd00b5534483826f0fb2fbc99eedb4768582b87d1f7a24a69aa83d40b368811d0eddb9a331f7888d8f54c4920c7ed2d0668cac700fb6349f9aa757fac262aeda934a862cd99c394084d26100475c153cbe64c4efaaa3b768a356744339f09446116816fba12b62370186de280c3bc249189f219d98cec9473b98cec253765a64c461e238b91bbe4a5cc256fc9b8acf45e7252d692b3e4303218f98b8c94b1e42bd94aaef25f642fbe2977918ff22d53c95ce42db216398b7cc4374929a5943bbc686a1ec7982b8f79b462e6579d291f9301045cea3ce611478d1c2543d9015e181f52dd9e145261180fc380335fcebbb156e690709f5c9c0ff361fc042fe3b58256bc80a7f6aac1caedce095ec675784ef032bee39ecbf064aa436956f7322907ab2a13a9db77cf96df248fa8a84def15db9ff8e84e6c990e7618fd71f18ba22f36ba19183777b1c8c8aef6eb7aabdd331bc771f4eaabd52d8a9a4f4e4a2bc645a27dba352b86fa7c4057f4da15bd7645af5dd16b57f4da15bdf6cdaef889548c5e18d65a6b75ec21d178aceb84c2868486b6cf7d52548bb690c774c3dba6a213d88bfc898b7e67be84aaec942e7e55fcbbf947fbc66f09f50983f86e77fc6e77fc6e77fc6e770c6b58fc6861921bfaa252babb7ba538fac296e90a594b460c9025a30468cbbb44c9964cee1217b24f35e9e1d5b64f3db35a9d024a97ec8aef0496bd36f57a815c7cb9f87ab9f87ab9386bebce2c4bafaee8337cb40c3a0b78b6654ea3591c7d7df12fe7150b39c6f48def04ced9956c59b61ea46f9423701875a9b664a8cf97254b972eb99c983b76ad8f36de27378a5b44b50fd11e4ea8cf8d72c79b26fc8d975a2e3c539cd3e48feb43c55018a5b92dc5e4b64c4b2d469291b3459ffe8b0eb1e73eab9bedb51a98339d734a39e594795b0d6aa9b3ee7a38f67a620830d0f16cdbf251059e7977ac0982d05704b198cf1021ab159db256154f7d79d1b80a45670ce7d0e593f31278c210cb4db83b1378de0ea7cb9e672cf0bcd9454b28f149e0a945248e207262c44ddedff4453c1178ea213cb56c82a7fe21f0d4f285f820f0d40f84943fb28ad628b09500759f544ae964340285b2ed8f3cbbe3c23a28dacb83a20930f34d792a524a19aef4501735551b7937fe86a63466db437dd447fd91d091d4fe514eab3faa1d79ff477f6484a706bb7842bd284a034f2d75512a1d9a15cea9c1f1f1bc0e87cdcd8d0d8e1b3835397845a3a3da49f18419fc999e2f87a73bd66d591dd5e500d000a600364a42006cd0769efeae7771b5370b9893901d719fcd5c89bb144b4bd949d2a805974568688372a66a545609232a4b9096db6fc952fc162d352da316d153007c243ca5f698b6d4dd95dad6a12db53f1245c253cfaf5b92328bc7f26d79f359a5bc6dafcadbac553a6b76d6b6b7655e90fa58aab71c903ca8c6326bd5e7d30d9e4f98a96e3aee396b5e3d1998d6599a4bd3b4169ae3bcebb8015e8e7b65715c15bf0e815815636154d1007026fcb6b7ab4ecd1603f4b500b6b3ed3d18b8563bdb9e9cdfa7aa2d55eeca952b57ac58b1622587019f870c6409e053a194522a6ea9a5eeaed4b6fa53792ab20e0a7052aff676de37038629150daeb9617383032767a5b3c3937f86abcd32cf8ece2a07a727c7d7ec0d8783e3c6e6464d0e9d6b4eabc134aa9466f14cda7d4a85e07dda54cfb05a3bb46e7c9af9ba968e70ef00c255ef4cdd9a358fa6c3b5da528a9f988200677f62cede018425ce16e58f1e1c2d4c792e3e8b77fa293fe5738fc56bf1653c16dff44eefe58f3e29dbb0ce5cd19c3d6d18674f25ec79386ef6d4366cb3a70ddfd8d3866bf6b461bca70dd3ec69c3aa3db30da7f6b4e1704f1b06f7b4e1993d6df8dbd386bd3d6db8dbd386ef9e1abc09718438614eb80a75747654aeedac75677b6b0bf862e0a925a5944a6fbe80830ea074d1219ffbdc27b9b5d682f46d3e6aadb7c94ff167f8bcdce5ee49de8c37e3934039a9d7cbc54ff165c4a68724a594524a29a757153ef74d98f608424a2973957adf5df283474aa7ba23a5938e94755573a4bc16a7d312472793524ae9347df43236ef64efbd01ced48460586b18a7c2d40352cb9e1454291cee184c614513506ab0828914b964658a24be80b21205ccd218162a65b1bc22a85563db45896dadb55abf3cd6ca4f621ece96465d9874b80f5c5be6daf27a8dd1d77ccd25265c8c706aa1ceed9a3594d5a53276ad1eb83c3f51fd526f09b775b634ea8264096acb5c6e2be16645282b5af0470ff563b8bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbdbeab5d6ea135cad74adb5565b2bd296527f4afc971e243d487a90f420111fcc8379300fa647851e15c8d460b4e589d11625a3bd92917801fce48cb9206ed90a57db326f95b58b2788a7e51642673f9fc641de4f121f3f9e0ef27ebe6f8605c2f7e903f67769cd2d40e99c3ddc9b781a943d2d606984a36d99a7b471419b52a528361542673f9e963e83bc1f4f4bf9a389a765ae3b7959b2116457772d79efedc008f5b4cd9629217536132247a7b287940b502d9354169946a8aed56b4ba666cb5900a58bc886a087449db69d9ef2654db0a1651501b5d5e007e4dbae7f4296fc991276b50d5bf702a9d9ce53414a877a48aa3504d43b52c04464d4a725d33ef273e4876a4dc4d3200b08d4d861a1960e9b81a98189c8a86dc4f7d5f2474a033a2dc39e9e101c09e5cf0c4bb6da1485edba6e4f83924a293da5fa5a21d0ed69707af75e07a9a78d78fbb2889c3a40ad3d02a5fb1055a2ab2bab48952f2be46b4d09b39f089b7e43828888f8d81d18f1ede9d73ef2f36950a680b8fe58409f4e4244c4c736e206dc7b646f190a9e92c0664a29a95579ad10e8ee9c82136aeda80d2b510874775df5d6140225106b82dd74ea395bac22bac8b51648dd7742994f4f40f3697ea9cd1f8268993c7a2c58d2da2a32f7947a4ae0d1232cf50924c00c8002e0d85575d8d66575dacbf1f5cc3c98439ed44e8ed3a82490f397d411060080220023170000100c0c894462490ac349168aed0314800d4c6c2e6e423e2a8d04229138300e8502a1501084000c8300088241180392248773d4d4019d1820bc7f92341bec6ed4e468eb0cbc22fac7144473179cef102c1b346a6b4963df0e49e9877cf5a4e5046ed62ec75442ae30d98ef32cf3dbb444bff1207aa94fdba0aced08fa6e76654e73bb4e531288a50840999db2c70ccd6c69efea8bf1b8a391fe892c35d34d0c8380a7b05ee6f8c138698efd77647ae375e6988c5614c68b3b88d5509a22e6e029017bb0d0913956f14ecfce28dc8b3fd5ee9cc9090c1de38a51df355431d1e1665a28d3266248d32c27884deb3745e8f809504d4b1c48f48e81ce0117a2c29b7d9bf768a63a31b6e47fcb82e11c5ec34c760e4f670e019e3700a8f39c3a514a4e99a465e4b4c8d20653f071029f94d22668a21de6be6c354ace4117fa5b84014e432df058f6dfa78fa4b733a3636f2d6d7beaa9901dbd6e54bddf2ec4c61bd39e5728f6021eaa4ceda39f605409d370e51fd5cae917f5e291da63cd72430c967658fad322119636567d63252646c38957041ef68c1f0c32b78026c8ea8cc26ed4182c9535b39a1c2ea6dc951efd3a065bc0477f063c18d6f03b86ec5fca66c90f0aaf6d49c22e96b49ecc520ebecd02b961b2ee8284877da5c5da130eeeea9d4c347ddbfb98d4f4e96c497f1cc8cbf4293d615d3292af07a4a82b07edfd6ffaf97fd75c3311914249e4d03670682c235c2b8ff39e8657ba50c324075758ec9221d1638c3500ff87997e20b9eee3945500dac0f88a6d4de3bca6b470afcef9f989081d80c4b4bf864898e17dc9e952b9081ee47dc9e952b9080e8cf601721a057a100f08ba370f9141c93f90d4a570912dc8ff90d4a570911decf6a7d2b588f72a44a49ea48152bf084ee465e48052bf0826ca9451a3d4f14424a652cf8840e467248152bec826b2392315d0cd8a37e1e46912c3a68a23e190a1a10644cf3b92d3a7f2111c68fbad8ab4d9bc244ed19dc0ed4cc48c130dea4d8a9038d76fce8e167e3d9c86b7b346b60309d88d67becd4431f423e101c9895b33fcbb4df58ee7a28c133e2806024b5a81d8d37553a84d9c2c2ae0e6de05ad1e580e8801fd020f57652f0ca48ca30523f18ddd0d94aeb5c601e460986aa2fadff45ec22a39a4124f43aef86904fe805d2742397b0919908cb49ec8c362b8544d8a8697ceede6fd02de87c5c677e3223e04f8c103d1862d9b61fb858e696db89ee8b969feebd80ad9b0431ab67d78fea541251d2f76cdc0c40ffc2c60338c8a4a8a0a792d612fc4adc7848eceb6f71d3e9f0d33c8e893b228695811f9245d8c38700f6037e2c6cbe49ad06024627aa0de19fc791a7f720fadb7311167d62e1a3721aacc385b84567b2f474c7e1cb5c98eb4a0dab6e67381566302745e9048ca81b3b28092b52e25f4011a6e8bde09288073d210930791cfc1af579ff2136776fcc3b6e7d0706d1fbfa933ed708cf27e5cf9ad7d610b8c9be9913da8d5795550220c244e1ff117e42377c8c2c505e30383b629212c494f4b129347e82c78fcef506d591e4675d0d22490c6c38d388fb861e4870903ac220296aa674f7bd92f39b6b520b76e45d2830d8282ed636bb9f9f1b51a11d3fb9b458636bf604c36f910e3fa427c0eebf2cc352e9fb700c92470439559803c79f7df59752bc1d199c678ea65a2c66ab916b9c50acc605d0264bf70c8e58dc7071c0f1d386a84384e6d72e59a6dce907f1bfb32cf4bc503c18fedb29f7a7eab1b706d1781ce0754ecda84e9b5aaebbf56621d4040171538516f8e4400bd179eddbf93c4149e93cab61ed0d557164b21dc19e5b1b2bb87c2c8277b22b5656b7e4ad1b9a4e5852cc9ba669358a556a1b05984bcbd9eb3514815f5641bd857bd027b6bad268f20b2d012371ae85a14f6b7d445bc635ee408b0416452de46a9da6774c7e195d8b8310a56fd786c55b2cf8d5de8763444b500ef608b6fe5f80563d5ffbdf28eea32ac69a45e114775a900618346013055ac024a9f5fd001e35b4f0b042482370f855e50425be08d8ba4727a70ed787a2126108ccdf056773db64cfc4227c84d0fdc5dd916e7dc6d23a17b16e8559cbc04a074e39551879f15c3e244625812790b8e1578c118424966e3c72eab688ad3f3852933616ed2b0ae7b733eb9e91e6c8b38990dd966739540dbeb3d3ba2baed3e8c0946657d708a4e65fca8222c6f73bdccf02d89948fdcc8ab8be4f25721c3a910030940c20b8037b8a73375fc1c11cffd264b7e7ad96c7530697f65a3fca57eeaf0f09725aee017268dca6116988322011d38b21da810d166085e1c7179fa78cb767ebe743f53d29b684eac50cfc52234e56de0ddd8d25ab6531ae927103946b46303208f4fb26044d1a31e5846edee4d1ccf3d39073a4907f6c7c0643bef169e33c95b33bebf28a49603a2d605c185ba70a24d9163e12a397b5164ecb0cacfb415081b26259e03843ab80556a03ce30fc4e8e53de5843dcc93ca476b06df33af0a4287aaf4ec8b2263212a39f7a250c8908a4eb45e142254e513ad0b1d0977d1498b226384557ea68d2fd003fcfe6060964c55f3bca3e462fea0ea46d7bfa4bba878ddc5834f3591e9eed1991dddeaf465bc722f3bb297aab34eae834a5361968a74df0055c280580e7b0a2ddad25f43414dd80cd141ad9217d0d8f9319dbb8baa549e55fae7dde6f9b22321d0810fea73b26ae2ee743c6efadc4ab38fd28d07c9e41f3b25ab2d5a737358b0d076c9d7a1eda36fa25bbb6126ce117e845b728c631fbd02878c16e5b63eb37d247b66163a37ad4286b59bd04cff93a0e06ceafc30bcf04773df482875c195ac8004cf5f733cd57755f8fdef4246183458daba369e74d70d898dda81893222c472bb007b54971bca53e907392aeda72c65def250033fc67b020a1c295e950ed748d0b1cb807a108d30ed42570bf1c8f040b4eb8e3b5a4637f864cbd0a8517b8f5b09b34f54a2efcac01f34670f460ff242b6ddc5624f8c8b7d80acad18597896c6454e5233e424e21807b47470b674b96d8ad1045e05361ba256e3190abf8edfdcb1e8076ee2e654d838f5e342275f33c18f8bb881f2ec0b957bf775d7a37f0b338cdd4ad07b7f53203b47bdb9386c04986c9b40a12d1324ac8c1b0b1ac5bc37eaec188f5744d9ed50f9179fef65b645abd05be8842f67a37e867f83be94619ee0f549a93124def038509e31b246248f2ae4e632a52ac306dd5633576190aaa4680b210b1116059c3ab078a7abb2ea9f91c063db22bfb0e110b790a478a9f0be585a6a8dd150b9d65a597d7da8d6529c99e4df2f1bdf578d80c06264d1f442ee0b07ce7ec2daf6732560f48d884bab129e2aa0514e33740935ac9c46655e5eccf2b4bd67a17b46254f62b4434430148debe518764fdd5765946c1be97293ea8f75683ee875cc6337178753e74fd9dfaec5d1250b51e890a1ac629f6ae771fcbc27e77e4445a33339cca89495059d0b61c3cc3793da7a36ec3f704e8f7824885127d3a2a2df7ab4094b8a14662e909226ee4f2909019e91b867a48f4052ece88dbd679d89098d25d9ac2626d4e9248448f3e9d1aa330c19f72d7cc39d53a983d08fec86037057d6471bb74026b6fdd4054385b6f228a3039df025139c8bd347c93de3d3e312e1448debf45891ba81470e6db6a7c8b1183d56456078ed988cd1b2fd0cd9afcec73a538f75faa019ba2272ae9c2fcadb7a383137e2e4d43bf00e165319d16fdf596cba210eef970d5dd4caaac2371c128c0f56d9b537866edd806c8d9f90d5cc82d99286214f4d9246c1d8b435490eea709613c8d94491a6005cb70a813c1a289cdc3ed170dfd2fcd2340293a58f5474b25d479a1b5737b46eedef0fc49bc6b3fdfcd7a0b1ef9c89d8cc6faa0fa17191408fdeecf0e455ab8869f49fa3fe0beef772f2fb29523baf4e06998d2b51557e6e3a57cf4a0ee4bec736798d162f983b404ca6fa6d6a6f105e6cbed68acdb3e9e6f867c57deb8633f19b4490ed88382d597bd70f43c766ceb4f4f7dcd1cbbfdf827961c104b68751e5a921570a1b1077a45b3ca5ae03e5ec5cc754d55c75f11f8fffb3b00d50aa8a55df096eefd2d1d0e694c22c599f3bf7ca90992d02787623cdc79e6724ba30b260ebb7fbaa3d15fbe7a64959db086719ab9647d5e56c6f51a1e36851ec46cdb29b07203e2148a95a3565af363332568600a7f8522ab84083713700cb8b72ca23360b73d841c802af089ae19186ccff07e8d626878d063e2f6f239529391eba7e5ebd76a3be5522d2a91d048d01fa4d1be9c998585da96b057b3708808d423713adfae7545fd98e683c9eba592a7c70ee83e01dc8e738b6301422ca432ae6416a0019f76da99232cc8df8732d94323295fb1f189d71bdd8f51a11f3072589f7dd4b88b5cb2bf954b618fac34985971f727b1dc9ed84b7aa427d95179b69e5294a8d13d94efb80acbfb94bca740c682bc6077dc63994ef7bc8abcf8676cd4cbd6865d31a03c90415b3a97c670e5f496f3f7d61ac72f91bb1bdde018441a16e6ce806a953e3525bd86e1001d18878850a2574dacab16ca3cdfe3a2c7b71e8171f72a4aaa4106dbd68cbb6ea959a22b033fa7ecab71e5e5a301c1ebe46d77df5b52af3c0d0f4130963d73c858d7db7a2ad1e8954a2a64e7e05506c914a70059675a8f5ac6c4c77c6a9106c567a6d4965eb7ca1b1c3819dfd17ae99a7006a150f6484573ae86ed39f1ebce0c7b581071faa46327ca88d829e6b7cd48e63a4173667fdcae0418b666c322d00b0a53d1b50b44c55c0507ef1f2020e1d79aab28d2a67d6a371848205d8f16e07e4fcfe066b9778c650eafe419f54ed66f5f1e85f34ff52c10c23a18b9a13c7d52dca76dcd1a91fcf3c93ba411110378370da21e13eca4689d984f0799eb13ac3550c1ca06e3c9fc1c1d9aa4740e6f5f3c27c7f4c52dc0628ac7738dea59f0d05f2614514cb5c1d13262244c15ca9da425c5ebe8846e479752443ad1c6d40c914baaa5cbde917a0d415eed9c2812955d55705ea698b04c37751ddc0404f77ff317c05dc7255374960a3f53dd18d59df9f5c79f60baefb95f0addc3a50adbae166b649c2b6107d4df808514d51b8248b55af7950dad54caa6a9ea13f14c8ad504ef467476a701cb33e4d21c4acbce840b2bb5259a09d8d9e1cf8369d44c772d109ad921c516e15c66ec46ea7d44e5d48bf539f5920d76c875ab86bf0f5bdad30f518509a0021fdda052fc2cbf2aa30093d39d39c5b998706bea9b870d887127c976dda05f6b53a6ebcb1c3a5dfb5fd26cbeb3bdace7764524be44d0948af537986a4159c23877f89a8c602f70b3e51519a4fe1dfc9e8281bce4400e41fbc90541e423d4262f7a9e0bc7b5a56ab6d502fb9bb764b03eaae3454827791fb842cee332bd4468ae07198da0850577dde6ab8ebc523751c9007b853990a74a7c0704aa111eff46c5e3924122a6a999f90c25e75c9857c33af1407bb87506357eef2e64a691b7d53df2b379f71318fd1d3ec3c674c27f55486328cd84f44e0c158b059f6130121fd8db2b0734db1aaa8e11fede24a947d049e9557c28696352dda02210643b4238d8ad033da3646abf52a7578dc081c7995467d28e7b81aa641976acdbf4d11172764190e18a2f68f6fe6cdc75c9a1985dbb784533efb5646a203f38906491dd7c700b7359fa4b3bc5252a61e146c6524d547be98f814ad41859a8f91873b093ed0c768ca83127497d907b06dc0d9c3f3fdb1a09d0ab68f18353459073c0c295a97434f7fcc6d979eb3c475200055dcba815fd711ecec47705ebeb225aa54129baf884cf6951220fd4575f86442a80a9fe36b33bb8052fea509adc6e61ce52468fe6390ecca478aa4ad6ececa92e32f1d9a9c59c5b0afa5bc44d73b784cc0b3552b99994a66f9ee9ebc370bb44507e20664f26cd521bf78b5d536e0c0bff2bb8ab1f10236a44e839ca00d4ae6ea3e3f9cb824ce1168dbc0d034fe634b2ac859f5f0d8692c539d1607a9cbb8131bb7e8930c4570d597081cddce2843ccaf08ad325d523887fbc750e47826eab8c928b6638649511aa37d6b952ece5bd40f1e9807816aeb5f51cb25e18c8b5bc826b6cc0bec5ac6f7ae4462e28504ccbc52041b33f8f49519b942ce4a1133d395e0e5e07b2b5297633c5576d415e56222d19497e5e0f4a5c7d4e4f285d9a4de36288ed251349345b869a8de895cfb726bd6f5c5e414256fd967502f10ba35cb19f910ff4b9baaf1fdb6f801c29433e06b50a64b54468897754442c4ae0d93b9a6ccf81a2b61052fd0a34838538de31a0180ab1095a009e1be8fef5f025e6598dfc98c6c5351d0708d2d7a1816889cce5a42ea4b6e0bc54ca6d81f40363f23c8d666143d799e37538c047c816b15751c727356460f9b1c98efed73afaf9a08ebec32e020c3b1e0445bfb3eaf23ff5ded1d1161c81e7350eb8741e2b18688667b9c21ecbd748b125ae3abddc9fc341ecba33176201a42d4f8d1a82d3e9c8adc6126e154df472e20c8a48c20c34b2cf04b321530483c14043df609d6428292a233b8c76d11487278225ea80c015acae14184a53983af4583ce084068f889193c728ab9626972234c7a85d490814621fe901f3325a0354f48d2d6df38499b4f43638b753f0261c7302e5e5a14f2866258fda12200f13bebb09a19cc1710d19f5f5e5a8ddd27dbb16c869f7988c9c387fd97178643992f72cc498480a33c6f1b7997e986046773cdb5b2fe43cd808a97967172dccffd69e2e82cbd1b66ff591bb3de9c56e4837e1aef6f94a39ff9ed0b26690458295fefc71369eb1512ba338d09391636b4ab7623c6821f35f3fd9ec576e7b12adb8003ccfa6505e1918ccd84d11a007512dcf15bd23b6808cfbad7942deb278578902ecf1acd89e808dff330fd405a8e24f45853b7b4817abe48cc7fe4f1440ecc3e5d87189b905837f901bfb9ad6606198f9ab4428e0f54c4cb33a59307a6a0f0f70ae0a0e01477eaba96ba2fde62b655cb5fd1362041910964a2e3ac87fe7921367d385fe716ab49f3dfaf242b2c265ffc9b0289c3ee9c2b6b6a9d6b7343190caf6c7a2d3c8aa5d6f5cb186195414f889362e396f032a653fa771503444c66f7fca1fd6021b1729365dc1e27591ab0a7c58ddd7a009011bac8397e1567c6683f82a60c5979f69916c4c28be511453b940e88c44643e88a6caabc6725103f54389ecdbec3c3aa63b8c4a4394057c5391c180e18de80201bb0213129dcf3d2e5051fbb46e8969282418c36846564c9c85080c80aedecc4ba8944821efd0610a92c4678b12421a938709354fb6451a58f1dd3951080ec7224814125e6dee995e7bc6dd20470a24b10188d7e03adc70974f2ba455fb57ba87dfd22efc080e4e5f155297e89f03bdf639e024416b210de5f90e04ff0664dbf2221c68c95f8e7eae3042f1625338228f9d83a3fff56945a0dc4b6c207546d236aed277143a78e3d9da9a5ffd981bb410355ca2d2bca7962c55ef9951bf784fc86cf8174e79f2005bbb60b59876cad729b7cec4540da77a9c5b5277b1e38bc34c67ccf8670e1e3c52d7c7201caa28fb54ccda360c97a4c4798d3e95bcc70b13f2788bbbe5fa33b25499636ae98c87445a7d017492309dd66c13d4ed765133671d5cc432fbba7e95a51aeb5e8b4df5a8a01b787f2b6698280a14f58a82ee785589ee180a05f17228d6f6568012c5992cdc309f503571c934b6003c1878b99c9b1825727a2cb5313e8b355fc1391171975e3a47faab073d45a4cd9e6fd44f8404df5730942954270c2c35bd5d0c50cf6f8c5531019bb5111e6b23866164dc872a3b068e3e210f7d6396d4eb1f0e09ae38a529be6f0ad5cf5cf28a16d110335dc1f88b2dd04c5f302c235436f6bbed544acd989b0b11de2317a112e89f82ca8993a52651fa601ff57f8243d9820f296e82174e64312171ecc0725726b6a1adb532a51f4d05da61a150c1294ba076fe9f93af07775621d96d4c214d5a0cc5f0094f048e7175286f155a2faa8e7eae2ac7dbface32fe4d9f65c8a97e59b364cb02980151ae2e3a4235a189e72ee25f0caa941fe169d370243e961ba66484d7dc6c98c10db039f3a4fdc4ceaaba9fb0ee4174b794f6b8039e730db1c3a1dc2ed7d740c54eeb65825ce528953abc7bc96ce7884e4d5f81f7f7ed51c8dc4fc5ae1f41eaa45b9117998533aada565516d7e33c48d14c68b7399dd2147623b1de6306bb88e4e81ad7f3756848aad3488bd68ee2efe62c7417d5c9d6d6b83c2938c3daa8c0f931716ac2af32f280caa26331cc0e59963460128143b06a88fb10fff9ae4008618f38fc696d90014949f5b0d833ea05c1d8f9f142ec6d5a4346523b5e81c47d9f709c6460cec452740ead057efef15acbddabd6697a00a3e58c688f805ab0194b21a037a7e691e8d54700a9d237303fbd4bc313da7cf72a5a340bc86a0e8e8986bc591da69c2914fddf6d31c6e5740389c8f42e92bf7b77e6528c68b585116c61044cddbe90469bb0491a1e98472aa992b40f3e47da4130ecf588f17ffcf53f5e814d02c179d1cee009bdf6c26703927919b97a30bdefd1dd03620509ca6f19dda0f9993a2a3b5aa0041923c4c0ca2ddee43fcf475db921adb9591d9383458134f35e7375fc8707111854b4478c565d4f1a2b56adf818df04db5bb8fe73a8a23c54d6fb07487b86138894fc8c3aeaade0d5256bfa498bda0d80e99b7f133c3202411855f9271b6d20bde5439c61dc2570e7ae2533d50fe8f0b57d7271c05034012d735e00a30379fe5d476a4d7f4948b2351d6c02e50cc45d4b5566d66b7b7d9157fd582d99fb0af30556d0d40a000502752a42cc82f7a9bd8baff369c13f467e1c252a184d8eeddca334304656e41b33aaf105b61abd679c5bb458c53fe912c749130c5b4aa47ab9e1ea5f6aea6ee201a71e0b845a8da0a619c51e1cc3733ae625a756bd922d9c5950b1cb12374832192774b3432bd204bd1b6d41c21c5066d2b395224ad0aff6d899ba6b7aa031ef6a6a98536f22f2a9b9e3fec98e0272431db0e40db02a5f0a4250cea9b04aff057032e44327503ec23fd652c6a13b6647f96fbc76ead66b53b1fc71f8fa04197663eb00c59b72fccb09421b819adaaf86ed259401ff3ebd3c789cf70b710d800649a00e9160a3b0f1732e3449f394e1af76dc4e67fd5ecb27e3a96c2ca94516324e118b85bb1f29ca4acd3f0cc4646dfb08b7543ee769382c879e8e05f91bb1d32272c209da0f4c665a0ff13c5ddaeb956a6a7a44ac95544e04549369468a9c7491689d3b75b983fe8a3014383de67e71e31ec4aab86ac24840c25e2f135080349454f58541f389bff6c5e1a582a8d3558408fb9e990118d66687827b813d90fdda00a22ec3cedcdc2670b4f446e2302f8f957abc132b098515e9d601f0ebd2e011e1292851c1f272fcb4e05ddb019a231fdd6ee567e16ec64f601aeb6aa5a05dcd8c5dc342a0a16b2a170697ce83a664f4d8b312d1d9059ea98f72c3df5b05589e794a7500eff356a494c5d2036ef477168da76593d2e7cc6af603d9792e583d7468cb4983005366205fd498a8147329af01493f6cdbb02c76142e64f24c088296ce312ee6883301c9318c7f764b2c47ac283f0069ad24ab854e54834597546088beef24e73fc3d5041cd5215443e4825c0739732504c270c2df9cfe15d271880ed4b51e272534fb04d8680553e56f889f62f2b525a44f125ec42b232b840b7601e2ad7fb55deb52dadb2336c3318fca8c37a1d10c13bea8a90597bd9e2c8d805680daa9aa979fdaf8956a88e640807aec09c158ee68f4335a8d15575ddf9dc0b5982c1551e85f187643c81f070d737cdfe782e4e49f260af4b57494bc69a8fed6f0d43df62f335c1971ad747a5b301b84ce96c13a91f0f4f36c04028008d4d30f64e1fbc389082f74f11bf6a2b1dfad3eab21f978e9b2552dd6884a53aea66b40c3326dd5ccbce499f834d3150ac35428a4a80e08201fa9a36e90d14d3d012d33456ae98712183dddd30174d563139ae5838cf5a5ac45f42284ccbdd96557f862d67c1e93c4decef0b23595d3944613b5e412186265dccd398af5c44ebe47d2539b635a3d08ebd0175ec11da186553bddcc6895457f241e804df37dffc06e45881d30842d6d2b485949f762ec5eff79b2a6badd88a267c90007da30635958661d1717296901d8e45354ec6551baa43c69bd148fae2caa5484c9c80968354ae50427d147c178923958442c387f889cabf9605e7f929716f622ed44df41b65263a279df7c9ec8f82a98332d30b1c0a9012877e0c7cdccdce2a8c7c85537f561b7c26f03b5916250a05d9047cfbe38c9f6fd609f7fda275c29bdbe7a673e6d4000c88b8a2a8f2fb0093aec388e756a62df94de7fb1734bd1d9aa9e75c7989013761df397c199c3e597bf2f9e3d9c3ba19cd0cf96c249c745ebc991ee8d7a7136a97cbb4947039f2a84775132fe637cf80e074afd34bc6d35b782fc7c140cf932ce0e1dce74ccf53edbd582dacf14036d0bf65a33516aee24726ffee926bf0259886afd00220bc1ae529855a376b4868d358b9067d9c4b198b5bac00cabe5fbaf3bccdb3986910be7636b358f4d1ba0feb01506f7da65f56f1ac5582ae5deaae564c10b0b8db8e001c5375884a42fa72f13b11724781632cfa09008400fb4e92f8b04181a4c65502c635a0b024a030b0ac18ebb8d50a9d06e30af50e417227e27f4badfc97d4fc647ba4c2f0a56345d1f84ee42a9c27db211ba6a5e01c26e119be4b29c293b299f6b047c0de4a89defbae2d2be11338c10d620ae5bec05cd87084dc469a6f667d223612f13c6c595bc7f99bc706d1c2c4a2049e1f6b41e6e8e0f3c5f04891cd4d6ce791a2ed8112457e640e66d49afe1da3e2ea92e385dd901688304bd58c73cc13f203c1cd4b11330d246a1258bcf8150586d185f99b32dcf51032cc479700dcc9c9043b934551baabd13c90a20656d4194924a6cd3d17f5d3d9f468afe61bbe100cc0598369580ea261194f8c573b8f225bb86028bc01c495128433b18ed3280bedbe74ad158b791df6f7da17418a4a949c782b153e057160cca019f9cead0754387f95cc9e5eb660691f0814c2f68de3e313fe99abd7e6399529b5e9c6742344a79013a22bf853587cdd3c298f23ac4ec4082875a9822401302595bdba98d002078ffd9c74b8c5ff898fadf85b27f37b1d7d341a6507c5de39a88b43644ad777945754ee5d220e8e4ddb24f3c2badb480a1054c013db800f052788ab90986fce4f564419246b070c668fdee3411c25a6cc48d640cac702eaed6c042bad74d97903a5b51d482b4ac2bd52ad7797a11b6d5f368ea50eacb07a3255633a6aefa1435acc1d900a28f23ca2aee3593cc0902687a65f384fa5ffd8be9ed04dee65a11d344b3f70c4291ca9c2cca59e2a8702bef49e23c7788fcd5570c550ec168522d919217e7dad8819b7449ad622cbd528af7e69fc2ead320b04800382dff1e24b908d9689c6fa265057a5d6e79a6306253dcbba3b08e84d56e71910d5d51876330854742420edea075d98643d7a8097a92fa751488a265c9d5094e9e27bf1fa87f5efe028a2329615424174cc8ce365c995fe122c84102f8250ccfdd6bfafb7c1c2e9d2162c697cd73de0bbcdbf25844a3d04c565827c7a9e2923a85c2b81fe1316030002abb831cf812a84ba954f694e2cc2927830e998353a2471e3b9c1759459f3bc48a3bdaa765d58a1f0d7336d1f8cd0a0d3c0c8fc03f92260e001c90129f67c1401b09a997ad410abb272014b297a48010f38dfedb5a739548057fa495a471e1d092812f541357290397531bfcdbc45f2bb8710f42a91ce61c557e91a80bf1c2fe65023f9777e03b761a746734ff1d356e162b40cb8a4b0a3a7cd64640b084398b9de83011ebb0b6e96d05e0a091f0b5c301c0ec6bc0ccddd78e0773a6dc9cc6f60603fc1f900f647a78e22810bfacdf901959288230fe828d7b146a25dc3a109b7a1c855d50cb3566c09d31ececb440708ea404c994d9aa45709aa5c7e1acd161d89ca39c91f601a80ae49aca95b8ce623512430222d2e9033ced9a0256c2c09442bb0231cf6368978d890c79a8a2579188d7e0d20f3891a6094a46d8533368d4a82d4e4cc02fad931645d408a59361db0a263280ba7b6540baff216efa5a6f3a30807de336ba040127337f02e1b853335633ac60e8a512bbbff18acac3b5c37d51f40736cdbff6db81503c087c2c69a4b38565c5bd99b05c7d3602822126a6477db724b29a594324606ba05510662a05075f3c4b54b3689c93239c19d80abc29d809b5242b517675c126e15e29cf3ae8f3381d3123784d3f2a3991a742bbc7e4eb229913d3540214cd4f5fbcaa35edfcca0871f86b81fffc4ef6b60bf5affceaa48c13a58414c825703f54b9a9b34b90dc3300c3fc4781c00152054fe896b7087c25e5686e9b2346957bfb634695991c04480b03bfba70676671f8742982c46087ece3b14c31275db9da6ba34658f4f3cce15638b71a5f9b15873117c522b5eef7af029323831f6b73bac35d5e013cddbd5b6697a1a2703b71f5a1a3600179c5e75b326e19af0fd269799e93213b88b5fa6571b7010a34958cf950cdf9224076858cf5a091f638cf10933a8e34a7280d7c31224eb10efe2aeb8f8e2e6f86934d74a5a49d9d3487317d47369029b20ba2ce4e591ee01299090e932a55f46e28db342aa4391bb910ec55b07c3b024b2bc1e7e0a9a410f4ff430b43bf069fe3e2351e46e941fef306ffb7de2ec392e0837818082848e78bdf65bb6c96d77e1d34871b43f61b89fe89a1b97a2a5595c026eea681c001520558e46dc146eef5bfdbadc78caad2c904037c5df75d2b5fe4f97e62d8a5e5b8a29f2c2ad8316575a4e888475098306478cd24ff6928014d58d1d4fd8f0d88a7212a58b0c1a232db60809f122ca09170a51aeb48471c116060b4f579494215036bc62c850438402634400e1479616624a0803650b7324a7e718a2eca8a46648520b213300098d8c39f2420d5b5d9e7c8d85a1b1f3254a009d627d5de9399d627d5d8d4b1ec7630802f4c7720aa050aaebe708b6ddf15c721dd452f1527d15b9476a5f3cc0b0f95ac115f585e3c3218c1ac1e01082a1a1df748a05e6fcfab4feae3f423921755d412104a5215ea817196a90a185075ab08cf1fd8108049828b1c8bd6096004002dd32febdf9de108633a3df177720eed5e5bd608ef47bc158f57befbd392a076d9d90b9eb1607baa54cb7bf75405758bcae3cc01fa69bdce0e32dd4ebebacb3e07fe09bd8087cb0b46306c512dbc73344800b13a6242c6656c8d8a235e9d102142952aec068a08c182e2af4bebe3411c95d96386181218407151c388ae85312583774617999a95fe6e2c53470e0a2238727685c442932c71c15153118585a78b2a528db10f5e51abac9f3204a8948982c3cc08ace103c5db171b2e5d4c3ab899713af2441d545155c5395fb658e5be2b8532caf10745da4638c31d638b0cef86bc6e245a4dbc7f20a72bf64ad1ed6778218ccd070440b9424438accb17791e0f5d4f3ee790593134a08a2e584258433451f72dc2e1db419e3f8187f59c3e39544b49544a9298411c26008d5805a71654312293abcbabc0420735142448798172914a858116e3ce98232616bab0a4e94714b8e1d292f8034d1e89185890a241d3868e4f0a42442992f58b52e156eb296a0dd65c21eebed2f493afede7e5f56e818638c77d01d22bab7fc6204c607a25c7ea1728163ef9d4eb1be78f0a5452fd380c59584e5a5e98877e949bfb13fe997ab855bce92df0cca4fb5f4fb78df7b332ec72575f5965c4ebab563a7585c413a4ea7585c4e3d29a43a5db5d61a07d77aef764f31a8194245cd12225a49890c295b8044d1b155a49f6e2c5d6b9d4b119783d38e7b8f14b7cda5b28017171a70fc176bcb4cb79689959292254fe8531d256fce546bfa7d545f7d5f139192b5538a5f246dd60ac254b58f0ddc04ea95005402da2b26753d26706c77660ff5e226ef22a5b5d4f57c0f198a6956b51eb092597d20bb322bfb815eb73e48b8d9c3f1d554dd3e89ab4c878f0a3e29f888f109e353e553e5f3e593c407cc078c0fd89eddebe3c557f029e3d3a6de7befbdf7de7befbd63dcbc4e216cadb55a1f3357bc4edbf6ac8751a4da537cc4f89491f5424a29a594524a29a594524a29a594524a29a5949234289a904ebf3605d5e973d2b4463a7d1bd50dbeb9b9b6de581f76473fcccc9a3033d68545023bafa09c57537a56d5a9a9f2a84eb5a942551fbd32d9adaf4eff76d12d33601808f16a3785e8555058adbd17e35cedbd18e7ac71d6fafbf606655826bbb6cabe0d823259188ab3d9b575260b457136a3d16a335aadc6b9cd7683837170aead383738b75b4e8e8ecece88c7f1da3ada6e70706eb79c1c9d1dbcb3736dddc9a91fc218bf3d27ce39e78b31bef862b07783c0c0af152d771162eba244a8b6953fe8f1bac9eb9a7f9bd2202b4dfd3d39d72d28e196954bb38c5b2accb64e4cbd8c1f0f801f2330b2811fda48da8324af6fcbd26d2f42b995a9ca227214b91e3e7f3d9bc0cddb6c0f92e6d84110acdd6eb79b8ececd83b4bf791b6992e8b6d7b308806feedb9bfc763b1a8fc6dbed76dbd54a93c4ee569a24fa0dd1b5e9fc0d69de3cad1c800b6e7b3e019db795463a5f2b8dc4b71d8d4763d7991d8d5d1cc5d90e00c671676767e7b673cbc9c9c9c1d18065c60c969913ab8c901a698ebdf637d224d16fb7ce7fb4d99e3fcf535b9adcee744a1c92e775746ca599f3b7c7791e1c5e9a620e691e8dfde6c5a7ddc6dbedf9df663f0a91186b3d702d70135713f769c913829ac0bd529aeda7bbbd38eb3177bb5013712c7053a4d9d9157198651abc590fb7bcf17ac3dd1439ee19b03b91f384b85fe2b2b84c0b4e08b724cd17a03d63c59f6dad96841c06d673b628be6e649f05daebb5d66a06751125adb5d65a6fb64fc3be7aa3703370fb9a2c9ff0ef4dbe69efd3a5482b19bec513d88ef9beefe3f1783a0aecce9afbc97fe2e183cf49d1ee6a95f6d56a8ee62edcdf751847f87d1fe500edea46dfefff489376f5ef432bd22edaeca592be2807a80709d5382995f3361cf29fb86ce7ed07dd219dbfbd0de7addd7d6fff86c43d76f7edbedf2177f6e77b1df286a45db60bba4337dbe7bc8d1c89eceefb1af9c1eebea7cd4891bc0003dae1fb1c72db9f0fc4f7b6cb3ede8dcd59f0fe28ed9fb8ecc1a791d8eeea177e2f86bc8f3d9491e63edaa5f83607a5f4ea2539afa0945e9db310100478bc5da308afdfb350787677f5429d52f55ee8ed1342faf404eee67eb3ac65c813a2e29edfb46fd6bfafa287254f08f1c30f4b13f7f088d7c557d1c33d9bfd9e95a018ea50872525cdefb70f84dd85187fb03b9a6bb7165b4bdaae6256b118a5988876a0b79c33bf406775a4eb398b1b638c69883b79fd6c0201d9dda8690092e2f5f18f8f6915bdc2a2571de342b0b3204025a8640adaa19a42145c607f2a2fec0bcc0c092121d5ddec10102e0a37753dd6437e59893b9d81b2f248ec1bef4808e901f8ec71af15b043d5eafe804375c9fe804f9740d86808d61d1d7c73a853276a00f0cd04c868352110cc2008fe3bd1d9cc8260ad2008667097486a153885a4825848a5fa3e9b26ff897f8f03c29dac07cbc396e067b28620885e68b30f860fce6618d89d7d1bc9e9590b1abbec8876b056f6077c107c5c0c20f820f818800f822078e2ebb3cf0f7ebdb21e660f3e686e502c8f686f867b26290882571d7c10046b4fb685884a9001ed50dfd6847a82ba8da6c9daede66d592985f37a78adee013d48c874c9ea22ecaed6767f7faa2c68f64fdcdefcfdddfd1bd978877838184084bfcd23dad565bf29e085e215657f657f81ddd5bf35fbcd08e901b8f81848eba7e18f3f848b232e782a6ed2adaeff9d9c9058fd15ca88f5604b4dbb90520aff08fd7b739397d48a7aff13077187ead2eeb89e1e710106d6c39476f2611ee92a9627b08e76b06f7155b8d6afb343bb483f90e5d921ba755d8ffaf91dc2d58a5e4d290d42efbdf7664d73ce3ca46ff5678c31c6a62e975f8568074a9172ce99524a714a78fd295128256fad63980c14325038b82093a5e3408543530faf98a1b08fcbc3765d9696c9ee3e7dc2561c5d9ab4ffcc6d7badf5be43387f67cf1f87bc21a9fde1a5ae81b87fe6aca4f571ff4a23b1ac54b983a591fdef6d69543ff75c5ecb24bbfb2863125d7f88b19b243a7e22fbe9920323c6649ac09c3aaeaf2dfe70369b801593d59088fb73fffb2a55afd548aff85baa6199926c8d24bb44993e9d499cbf52c41d0a4b5de252e0e6de370c53f4ef3159d6a806c09fbfc4ed39d32c9fc234e7d0b3a71fd607492babc03ec8006a2dedb1ce7ac06535f98cbcd99faaff96f4be6eec58939b946152f696a45b3756d1e4b7be8155115a3c06a7427d5b0377858a9b2f169685736026cc849dbe7aefbd39056ecabef7e2a678c0f8daef02dd11fcbae2a8e0a6e08d337202779cbf7edf87f5c558286c824b4a29a598528cf1d30e144785d7c77705dc145c2b16ad8c315d58604958013282f4f8ce98e80308288e3b3d6548757394f104e49411820b1d104c767a2a8d755aa7a7125837837a5e4b575a0d04b650e9b86105275a7c88b1ff63bafdeff45482a1cb84a0c83c5e90bd7956542888772e193967aca0e283ad2d1a96aca055e40b0923cae9c595274c5496dac86828d1ec8c1f1f604383eb2b045c8298e9c00213a9ac0e68b0a0c25219bc9466d7a81f5ae94ac60932b85825c96edca0554d46929a703a3d9544d8147f5709049c801c0e59a7a7d20dac1eaf17db3329cb19a38ba9c5928b5349a945ae49a7d333a94cff3a3d93be2c8fdd3c7a7b20faf44d7a8232bbed8ffdfd9d31b23aa5d269af7ee91487d44ec0836aede30ae560fce0dd7b6ffd6b6f162fe74237be15400b1c5e43b068f11146858f2e251c2841d3d4e505346d483361c02e32d186a91c12b539246ed2ac1c928a5ecbf0deeb0363ec542bb5d626b5f0810884dd552c9b0804c6328018dbc2e090d5c64c0e4ea82a60021634362869e384020ab32b5a2ef3442312b46718750ca149df34edd70c624d5a59be3c4a8a08ba3ff449f35e59bee41def0f3573e65886c94cfbadf5fbbeaf04d13b5740357179a186534ccd6692c534a566042e37b498d1718d1c1c6e9d9e2b98f4b0d37385112c6b90dc211d6a9da5a52b120c285847aa54611f05681106f7c77e63112645dc9fefbf12047a97491e0bf07e5c6445ecfbf37dc6ffe9c7f9f36ff2f1a7d840fff7bb44da40ff677ddca1a93b841370b34454d24ed547a2f7c782fc3c16e0d722fefe58eb638aca5a2d26dcb5fae1cb4610d96a45557b6159605a5df4fe34a0f25751143eade4c13f0bab53b814615230245e9de8fdb12045f8b2b7bd05296a2fbe7e132546d8fefb11fa675f81d4fe907f1e217e7e13253a507b891214a045b4a7002dbaf91223782c0069116d048f05b4c7799c120445376503acd3fda96f2339c953145e9202b4c8056d6681ecc1bf234684236a25ade4b93ffb906492913cb714b1cb71a7491e5b8aa0f74745d1063515d77e3984d4e69274ba5c0c8c753468470c5f8c85ec8e62459df0e54898165a1833c379456bcc922d688434015f00401581978197980b2c98c8205364031b36ac20e6e403a82d45f8e953c7d8c5908e713a2623ee746db476380e1d12b236e372e06feaba79cb235d1f65a861f9c86f4242bdb661a1dfa5a27bdf14e2519053e2b44eb1da20e926e740bbdd4648cf9d62b591eae6ee0718ea0c06a60285135e844541534585895882093564f450b092c5c2e24fece67b2b8b34600ba4104c9f2cd0e460541d501ba6ce3bc56a8324a64f165ae70a31b46e9e5e73c01a0bf1648cad11e2f61b0b73f182d3ce81763d138ca5e9d18d91e943c2efdea2be3cc6cb97a58f795919c6a6248df55cd800748a3556c2988f6b73001023a2f560aa08ad68c11b1b243d36561f1b2f6c04a0268bbd564b0d143555bddab0a690c4c9e54078ff8e76f7a6ae5bca43e9bda08a598b91c4b8acd65203c38a55b1dc5a6bedd34b815939e8367f757b827d9c17af4fefbd379752fa892c267becce014096eceed36c8a006ee6e70921ebb92c51ebd8cc2870c7cf13a2fae8b8a4567a5027ba745681a55862553afec2f363537f36c58cebe2fa737e4cda6ed551e81906eb286e6aa19da1d02295c044d5ea28c4aeff3e8d4a60a222f5120ae8fa3952d7df3503e8151252d7a58912140c09a99fb8e9fbef3d21d2d90432e8da440905744b3be03fa1fbf761d5a489ef4fe80760a097c8955040afb40306c25862533ab51e36b6b69fa8ddea24d7de7bef0b1845ae7740c5eef5776d415765eb7269adbd449d7981b9caefc2659d628581e97768d49aa1e30abb12836b0ceb29e9b870ae53ac3022613dba191425b41ad3ac8069eef99b2f2398a912a1832f23c4d022064292121a5290dab147e8f8c51b3ac6d80bc662491d63311a1de31e3c2f23c739ac1163d1f1045eb4d82956988d5c428fef1f7bc294942c579ab1195c639a30185c58a701d3cd20233587af30b1344c5870a5a96a81e3b2fb0c589a291d778a95a69782be2159228599e9fe0ea8e8b79646f777a654025d9af5f1ebd2ac1f3ed1ad2169e6ffd0f4c43442ba399e01eb67ba2670bb59bf032a6ed7a511ae8fbb38f8b49b62075f87c8f9abd1fdfd5ff8cd2af8b40e918deeebfb9934c26f876a900673e6aa17a053ac334d9b92b0dfd7cf9852fb192c670e50d1f77e703f899e5f8b381a65f6fa987a1c0d4e675cf46d06095699af9c9dc7f999a913a0a614c85437c71fa755aeb30a34ad207f9fb7e65ff891fa3319e2d36fa4f9471ae5cfd9e8fead8c1ab130dd993367cee86c65a3d3457d9fee13e185cef8da1f37baa9b362135ae15430c746a7fbce1f4bfdfb5efc7468f0184fbcf54c8975536775c5aa7cb045ea0c8b2145a2dc68c324480b2b76d0903165634fed1095a6926452a0d4182e55034d8a8a88f34556833d49603aa17ae4d6f042385528432687d20d3a552bc6f088a1e3498bd4909b931b9d24a5630cc9f0482d8552caa820baa8a69ddd26c74bc7ca8d0b270927e4d2e4c6763a3da7a63a003a3da7c61a183469a03eb09d9e501eb410561bbc0635e37c32728e607542b9f8748c1c97eea7d3f309cbd30c2598d82640c8ee68ede58d077de1a678ff96b79c3fe772db9d26ef2dff156ff56fb5d6ce6f2fde4c71e409f195b8e409817974b6e57f4bfb73ce39d775eb9bf5eb572f2fbcdce939820a61a7e70854a68dc03e9dc044edda84ed9934b17d7cefebdbefcdf75e1eb776434c25e0f90136842da90414df6a95ea29c254b72610d0dbd34755b7bfad86d14d119bd928ffa67657b1558cb3d387f1d5e9ef3b6340fe4b23703f63a3bfe52e29dde18b459b33ce240a1b819e6a00fb7a96ab81db9e3a01d86dae74c600160bd0623d545a6b6823b8f6eb18b0bdb97256ac58090b3b7b742959f2848995524e4a4e4a4e0a0c30c00043aec9b6b9269fcef83669926308734bb6cd2df974c6d7e696f05b5e24dae163a1873326897a58d9f773ceb9347944f94d1e05198f39df2b38f7987287c09c6f16987b70c939e32b370848777af680e196b9b4f6b63d48d871b3c61e1ddc6cd6879eb307938e358bdc95170182980e1123b27a1510d103a18b8eac7dd3e909420c3da7d31384aa514b2be7a4f62fb02f33605f6bc2aaacaaaeacaaa09c48b26865d9d2caf2d5957531ce59eb6fe3bdafad3b6bfd7d7b83dfde202893855b0465b23014c5190dd368d7565a288ab3198d560331b3b25fb3aae250ba3dbbb54c76c93631d925cbc33ad924ad2c5b5a59bebab2a8aa102354554815923a5591d6541715694d5daa491a605c1369f6629cb3feeef7615bbfacbf6f6f507665326cabecdba04c1686e2ecce66d8d699280bc5d98c46abf1cb39b695cf6835ce6db61b9c8b83836dc5e1b61b1c9cdb2d47e7eae8605b7564b719036aefc9b9a4a9b3f9922650b73bbbb337820830feda712e47bbb31d9bd5da7b31ce59ebefabc24de0ddb369b92b7e52091e014eb2f48a2b3d7254383d794c9d3c9c7253383d79249d1f2039792041c91b47b956cc41e119cfa8adf4454de69b73dec5c0eb87f5525c3e5ec234e47adcc4e27ddb8f688fe756c859e5b0722ce498e498e49ee458c0f5e69ee49ee49e540cd66dbfab71ceb8dfdc139be3927b527b8e0bafddcc61e558c829c929c93da921e59e9c2008397920c99de70eac1d4e72597ac5b9a3c9b9a3ca6e000992bd6519ef6c4b1073102f488817a63b4441093962029418bc3c40d21ec0a045b00384155a391c8162d248414f328c3f80c8ca1f29ee5d72bbab1b470e1ad72909138d39d9143e8040727f68cf447768df0dd6314e41e4207420dd1fabc531c660199442500e1f39a63e102151c23188bc7350e51c472ec67b6807f19ab25ed72442138f5e0312d60f2baddfb29e3b5cf4b08a50fa25afc51d9be8f7f4a04905ae1f386fac396f28710d62221e05392a8fe8bec9a3e0ea9bdd55a9ccbb431f6c5353bf43b2143895d12ab7249c767a1504f455cac784a5182f4019a215a6c8dc69f06484cd112c165d382832839a6c54399b7e77362dddbe189fb601a5832be78d182cb478da1853ca9df09d364e1b5b36b274f3f64c4586f086e838c8aab105ee6c3d00e94e26aadb98ff8174547c7780c4feecfd59cdce0ea2883d3fcf9b08c74c53f767ecb13ff53908d373a727075ddd1ca3a6a674533c9af3e0dbdfb737c0614c9411b2540102a508192c4e594a72984253f4b9b0f3586e074fbcf58c9d9e35a0d4b87aa1b5fe01e4c51495146af0983ae3454347d79acd8f29ad8108e57ed4102283500da95c2b225ae11722e81f55be1ca97241c618224c3d2d5e609012030a5a376ab8f86accd0c96ba2442b3ca3c777cff8686834b68c607961e025d8682ce1349e6433767c62a850108f460898f7e3879e2143b4c2313e7d6f638e04be3b3d67b0e8a6502e8a7f9d9e32d400ed78a7a70c30dddcd5e8199ff70373e11b7e2c65e5252da0d00f2b42ac36dd326478014406d60c20bbd3339b05a8b42eb6352d64332508080410004316000020100a8703e2704894a561aeab3d1400096b943e665034160723914890a328088228088218c610630842c838a3d04d59017debb7716240c46e6a0eccc80ae3a432422ef572eca94e4f1eba0b0b5a15525d72a92ec6ae6e1890796ba6180fa03689c55555785cdfd62fd74b0bc9510376521ab0d9b1e76761cf1ede0c23cb7709b0d6bac4e5590c8fd157e82058f8273ec4657fc58876fe9348f011cd8b4338cb4ac21a70dac31cf89a90ab308f59559a43775e85aca75cba18ed30eece29fd98a1a68831498b6c94fe2344649e46f797f5b29f48bf2c864b4a959674e40fd8757f689d08b2725c4fe292aaf629a17a6a222edb714f9d45cc9190015203d55c04b569c85aa19da7970eca1916ac3a541e9b6abf47688e14864b14b733a5c8419baa3955dc8788118afd9539c82fcede95555b8c2be5dba70219251a02bbe581140280a1c3f8ffbf6371eca98efa46f8057e307ee621db776a1fcf3d04e8a1846b29c8286dec3424bfa708b4dc8c0302f15161007989c8780c9ac5acd6790c31fc44a44c5d051f6be200105c73c680671657e4bc9b6441dc17c26dd6092737643f455464b14a60ab8ed0b480847674202dc66879c7e3e616f08b0b42a25558c6035e2c4f8984d8f06310832181624488a746c4ae62f4bbb7d9af3c84361011e29d9e7c8f7781cd201a1e1c833b819096ddf89478de50e37049f1bda5e6ef37815091725433ff1a39cc513c209d4c0d2a29f169e35645f232c1696478ec6bdc651afe079f190dc93c14ac591e8e90812f95765944258bcdbd19cec1f61802cdfc7fa47d619b99a88b6babaa96ab2bf700ee316cabcfab6eb95d02ddcffc8556ae3c2ce49e7547fda1c20ebba8be80aa5fa7b8a9e8a82f039208c20c62b58bc446dd2d3280e13409315bda84b2ad190ff65df683efa83bd7078802303d267155b77e31dfbdf20c6a74238cc912ee129271fb01b93177aba269846ac80e32178efae7d83a12d5d6a75d33a466c3329a363cb28de8ca21501cfee551844ff52ead0242d3d6a32c144655cbe67113feb90d70872ca33263561cf7376bc0bcc4e178498a28a33e6592372757ed3f0de79f7c9c6a49ec7110a7ad1df37759ff4315c4622581fc245df1ed293850e11d6298e7fe948003b9402b673e73c1d8a422393a747a32c6866748f4dfb5e4f620115c24c7e0628d5b5271ba9e85596cf8330b8b66850e63e427ca188e76e1056ff7ceba4ff903752268b35c647ff37b1423648972b54b74c2d9c40e97376c92176fe4e39f77f87a8a460ff1ce304f63cd52f15124a032fb9df6641dae8ac5b123ad6355b55bfb2c8d3c15434866e8d91c6498a368ae8ba14ab5c583e3e6467dbef0e6e78f683b293dcedcae478cb76bfc476a5b9552d885ed94c3e8972a4004711c11a47ded18adf58e55eb020743e0b68144c522e2c611466725a35202da3f1a2454bdf704319e1313cf76b1fa1bad9308d16ad255ce701950ca2111e38a4817b254f69e0f2d2b1011d7c879dedb827b8b740054edc143abf8fb1ae4ec621e53d92ed8f5e4d8fd2ba8090678829de5f0772eb7cd7008223fe2e915abe3df312a8e3f3b5ae43e27c22b9ad0030b2a11d863edd7fd8a3ae5b6c45546d85606dfca5b38efb65b8e07f2635ae243c50551f8a7ac0c873799585a140736040f10b595ff94fd58dca01fb6eeff111cc6393c61159cd696691ca36a28b6011f91666e5ed31a9eb69df663bb05b2c8af8edb12278ed2ba74f0fde448537876194cb2aa8420e3be4cda9dc90382145d1fa0343f32d5d70be8f0e75ff1db27d3b5592b1c7622c16c8608bb25f2532b04716ad825f97ce1ed12d4601ab190412236f14dd986fc7f6199e3ab54c34f17ee76e281d02e3bbf6b49d146d1e4eba8d0c514ed779361f0bc705057957ce0fa670f53a7db260f35fc17063df3b2c75c14e1ffc211e88a3cfd56f7dd82847d9e37ccde265f34515cf9fd3e2aefd932c8db6831e075eb78f43595c553596e0cf205b9fd33c1e1a9296535192503de7a073f78b0043a4b21072693a03712ba71a101af6deffd270bf343dda73450d63ee9eaab1d531e8c1be040575be10ef0abb821f489d142c53f018d877e4e9c5513b95770e50248ccb2ec70932defb3d7f248c99279027f10dc1041bf4f478a1813352716ef481585085ce55130e30fa0ea1ec5f53aac01ed7842490d1eddf4243c1802eb43c173718ee0969bd04c81a452a024fcb3209132db17c1fae231201dac4f2411e7ba8ba7d46faa7325a8d4b112b2cdf3cdd407563381a7a040d4d117d261d1c13325812c9a8be68173a5f23f1e91b61f5585563f239b401c3d8831ea7c5d801cdcd9ee3795387ce131ae000d47345674c442e552c09004ecd0fb5fb5c290b8dd02dfa2975bb00c74b31eb5a2d5fcca3f43b898a331ac0b86181aefd4880bad0b6f6e2eca99dfcb4d128d8b51e365c21226e84201de342151fb2ff8a8c522e1b4c548de520bddc6190060b2f7739d6dae85dc45ea79c1230ed965948337cb1db99c7f96b06abe42c8d098603823412d579e5b579d97d5dd8fbd25acf311da65b31254eb5c817b744082759d2fb5727d250c07caaf7305062115afff2bcec01ef0debe99a3e2e0e493199d2d970caa0ff573710d94a79da943b73c98224a90bb9697dc741412694282e0c11aabae9917368a57bbfdf53eb5eec663a9aec59823f33f7e0326db33c2b20d2b3293242711068548b4bd4acea6174d22c38aa7d74fde7a880dd8369e614f5f3686d726c9feeb3102ccced732b320ec31573a1a94834dc3027d342801496e081bbfca199e140d620f0c110d0daca7b24f605096385d99f82726f8adc5461a3b2e029ba327b0c1f7182b1da39b3d8bc4ebf1913cc014352c6c1f3b930e84cf2da705371c1611a87aaa985da79c967f5728f19850217b41f1ae82a6cbb115f4d86b59cd81b5a6898b6646f4e3c28622fad3131a3cc1c20a95d3e8ac188294d15304ab1818689bcaa24464dee8601d5e71e85e05da9ed46941cbb4c76d7830bd28211aab256f5f61d6a11880a905966656adc85bb0db705b3ae836ab259a31045433ba7fcf075dba257e40d4e1f480ad0aa687b5d1f95649f02ab213c5f63ef055c950c2bcb063500171bcd6d1a1c4651619e2e06ccaadc90e2b07ba90bb744f0eb8b86da9afcb871719a59320e530104c5fe65a28183bf377e2b349f41a28cda01763316f8dc18750573e3d690bc0ce7ef057ccb92cd6952ef4ad542c1269a12d02deac5a23f5f005abe810a40b86d96f397fb519aefe87465a39becca40a855b24cea86e1a709b750269529d8c7eb05a2dad4b10881af89ff52eac4bf276e77b31f375beadac2a0bbf01b94c870a6e4edadcc7acdedbf7b8bc799ea2a357864a31be58678bcd340203583b916029d05c759ff25c8608a5d5a44375e0db76b935095300c2563be15c961af1e184f5e678a74b363be739563e2c84f2820c78a9b28facaa839a88c2a9c61883b6a1147394c97d1d21a92378435135c36a45729e416f2aff9dd52efb88d92a74e24173fcd07da30561008f2cabd69074b6211f98e014b6d735e075c4a2678235309104bed1b5f6eac0c72aab00b502e5c47bf4a6de4b7e8388dcc3dfe2ba61b384307620f9ce20ce8605e6b0bd46b358f574c55a69f1b2f48c4c7947be981686663bf095adbc2a0900e1a341ec352135578022f6b888955770e059c55da92fb09b8703ea794b0f3bef772b9f44ea8ae6b0cfd0477d8bfd4137af4ed606cda0905026ab754f334d5096a5b5a7258349427cb6a3d4d2322371be6d9bfebca80cbbe4263cedbb632b5714b64569bf6283ef1c692a9b845038150421e6ac711c3a8424b7d4d9d106ceebbcf11569c3795ad70c49c276e6ee2d76c3147183ca241dbf50428c9cdc07c782cf78be356cd7edf74c39360566b9c0190a19412d6347cc4f2d738c6a2e148f082864794a8841f1fb45c782a56506b15bdd4b6b485a29e30e3c97ffa872977652043b2a6f186848f85d686684596b0e05a4a4f54d766f207222f130e321f998b536b3ea8fc6280280825a86ea3fd8147592d426588dcff1328cb3114e412fb29e223a54c40447fde4acfd8e788b65ddfc2b2b31a61d4d346b173b07a9b6bcb6075d044ca8ae3706905ab54f481d8ec1bf446bf44429d7087a12a65f2485e891875e931b15a1b57741e6ba816906593eec4c476ea73fe4a72a7ab9c16aac91fc416e83521c261c8af7dd0b4bc76b37b7cfb20708850e4028daa54376d1ab03394ec2407354ba19e387e008ce87b6a9bc00fa4642e333087105247c830d145304584ce0b4e5c6d46f78908fd618e66083f7e5556b928dfceb1307702deae4181ebfb47f63cd1206c192b1f48c21c738a1c6c3d160879319d285b715fda77ce0b1fe89dd1387b00b841506d43eb1d803ee16261f6d1b893e275037cdfba6bd81b33fb409b6ffa1c359ecbdfba7862564e0c25810d5ada8092791b165d7757372247a0058c48f848732e3fe1a39981f64e11f622eec2cb1320477a4a583064972ef9e022aabf624096d34af7f2a5ae0c46c66e36daf723de988af4f01a87470f1a408b175c420a0cf2e789fe395a3c898251fa5525705db4159697f24dfa688a309974fcf55a64a2316d677ee7ab5e7bd7c3465954008fb40f850a3d67a69e94b66e985c2ab4862d05e55f0c8ef2486c9412c4764400a418747bb69ef618721d45183997618f79b47cade8446b23305ad8aec91da691ce00143fffbddf0d31268fb6c7e7b148f08825c771cf35b4cf5912f5d4eef0c1c3297bfe51667485a06fd3121a85b4c40e9f18cd6084ba5c7e098454f714f78d5e68e68680ced6395ccf20477f74e03fc65bf0705827bc3b766ed0a0a0a0635a81e80ded646be26726be7530221dd7f4573b536529db5607178237975cca3e135c742f7386a9f193191fec745c978a9074f3142a1b8b8df70eec072867d3d99137e5167597b82baa4fe623d1377bae15b89be52f0a3369350f237cf9dfcd7ec9acf45a240718c8ef4cf7a3374d941122e7e0f42f8966f7d865d458efef075e9dd53bf05121f301d3c63f1d7f95474b91c84c0f117a20102545901a28d188883c504b808a0d25def07813f40d8ab0e94a1d1f34ca0115873d94550435c9bc0362bd3c87a66441237bfc6f0ff166e02b19d8390e2b004629df16d65bd1af38c3fc4e77507eb67c8dc21680d3a5b1ab9185cc11b061d1acb37ec1c5865e751223eea959d9b83eb22a6509fc15e0bbd90cd64e603ff18e1b30cdfce38cd189b294640bdc8d52d08a618a1ebee893deaba8a661a746e41307e9d90144f58146f831ee253ad14c09ca2d81c08a837a9cc55de43b2e501988b844fc21d9bd9b2e586f32451dfaed796f61186f19191e238dd9c5b946f28dddc3e37cb84f974333ebf549fd3723a5443dcd98940ee423fef9110c768d75d36d0093bed7a8560bd8b5ccf6953dd09ad7e8a1d2e57919e6a55498187cdc4a663d85b02ce4d8a46bd0494193e10d293d6d2a0c97f6bd01ffcb292ba0ac8d7fcac55525ff961ed0c981947c0a98e49d9375b8a79899930773b2b5c99ec9d9f12c939c499f5a2f687cb3b8e34048ef7e3261c95afa786ad946d3b844be5a73904a0074e9b9a256ba17ec35342ee2f4e56581942b81237e84b3c98cccf4dc5be03751642df8e56384b9276c09a3665e48bbf14e21406777cf4b9749eee940eab73ca2662b700a951c19d4fa41ad26ae55bd9f86a28166948562dbfafc4ba140a05db539108ba858fb3ca81e00546d41ddf3d9dfd2009f65df7eaeb166928a6ce3e5f6380d80d1aebf1998b4f1ca31a4c5aaaf1ae619b03b4d2cca9080286f59e41212a1d7db04661a06d67915a5f4a2f4eec2c70cbc1318fde725c002a9da96c462fc95ec1622de2481b8ac744ff953e5cc052c85e6ed8f69edf3a03b0c7e4f0b43b07054cc6026661cb8183fcdce9bc4e168a544e970067ad263f1a460f50b3185dd880ac41eb2e0fc95d7a6d416815756c45939503402bc928bb497fada8d43aa7b76231da22aee84a4cd2d29b99114c79b762e0353618931573365fbb0a31289a42c27b6702f02e0c6ebbb7cb99844cfa2d73b74e204887bea0168d85b333c703cab562c43b9d4d70bd33c7bfb9ad7cdf62b03fb01fa24c517ca6581ae5aa354e6774b68f1abf62f8603c3748d892d3babc64d6694ca9a7759f4db988e2ff61818d1fd409be60b26c9ceaaf5795f4f9cc2f757a6c551af0a0148e2f977f2b3d3dac8322665fe97403832f06ccac3db0f1b238ee6efdb8cbf294b4362108db8c312883612560d00f1d6dd952c33b09401e190616ea58d34fd116effa103d88e97cb03532d8d3abef82b39470d6aabca9823be9435ae801b38ab74b587e072843e71a0b071d0e2f801728aa6ce59ec6240752eff5fa707fdf70c5856fdedb7bd8f85180262e4529a7d9c904e2103c9f0165b2bd2a96db3d4ab8778b30fe5895b09bd64d9843f7951518f198ee088349b123cc352b3c93173e36806b2dc0c08a0afed6bbdba4880ecadb852a5f0ae2677969d9b40630eee20b8c7b039885f63006c27abea6966d1306600010a8e8c9d231c4414bb72055384771ee00084d6158a17938d1e54f84e20e14986b9f9a2cd28348eb0105241b98aa4ea4803b482f5bedaa2f269fae3757071143e6f0d691b659b168eae4705f7e3012abbcd94b0dd4e10699cefa82579824f2e3e0a74bc77a20729ee5af00a0913c0894d5bf2b4a88731c72147563c3f1f7e4c243658236dec0656261270693d6dfe536d4bd9213928e5a21b96f8e73b1d88497a3e42f4db823382c24a5c7a80609a3ea61687308d380069e4826ad0cc22293252e0b15c0764f17c6defd54d02e0c099cd40fc23201a4130ce06af1066d12be4b31358039ef098b04fa08cb68b1d48091156d12cd29d3303030db042f9a1b169d680769d7365eac54ba9b11da1267db81e8a448e1bec4cd0289b456edccb1b3d87bceac950f1f7ce6c4972d27b1c3173258eae36ee6e83509ecc50e7783c620258024e847e38213acaba32ada1a68cf8be586abdfa53ffa66feb851a3d9e2480e2b82e48f679ab298844138442efec3862ea5b0bcad4f3076d527d01082e97dfa1504a4195269577b1fd20a69f4300479e6180b49b742a79ad17a39cdb2e417622f0234d9429af70839c6af87e0df5aa5f6ebf732991ba88936cb08c4ef41f9a0c968516f5e667b06e62c0edd1842194fd4a57b68a5fc1e6e5a2f92ab500882eb019a199763cd4ad6df21da8a463a4d315afd4180574c9e1f01a79c9aff3fcaf065c2ced236c1eae1d0e516401145ed67a77f426b470bf5a41c5dc625c873f843237e591e26b2a6b559290bb148679c515a9c84d9b767913d383f1ccc4d21c42bd30582f7664f2ca3e8e66d5728851988feaea47c5a0293c21e3a1229849142876224dc511e767bd8d2ed98dc2951769f71f33458c84814ae208392d17a20610d67ce45a280929fb271b778f904650af409d60f8c477f3351223d5b1c46ed962c7a162e6c883e8a30e444e8af7e7ec549840be1a261c2258f2182ecabfe20f1762202ba8c8968a09c8ace18d0185f09019f70f0b280ff951bc73ef2a722ca2ff9b0e0e9d9b2648a34b1cf9164ce88cbd48d01925c7836a45262ededd139c34da6437eb49e28187e5dedc98b78d7e275bcc7cd7c09389772b7c19b1909ffd42c0fb66afd512f0b9443f7e88885161b80bd90a6bb70d4a91537917572c8ec2c24602c67c1ed91f6f2c70a06986c3fad2793635e3bac9cf68dc33a98b398ae6ab317eb268be519ec0a02892f3de92640f4ce5b445003abc58b12e1c063937057a9211434a324e57979a250e7709c0df6509871d626b24de5a6389e318d1a88af22075ffc200b38ab0f1118174cc51a3857ad062dc1b4c83139290f5d2898f1f235c124bb893c22da63ed4e63fd2327c884105f86d0352b7fa0b6e503f6472b496c3441dee7b8c107b8656fb894e98a7acdee48b72edfbc705b020c263c9ac6fa1c6fbed260c00df46cf09bf0ca4ee5e7fe8ea82b12922cc3e9e983226c3051c0e316bced25bd8c4b4cd8d0ae7e497d17b545dbe0d2c7b2a172d73891e887f3dee642e31c9aeda2e9a5b9d4967ec104ee68e4656f0f710db78c82c2f8ec35a0d593bad15e05d324dd2b71d7c0cf5181142ce514560b94c8ece153fe2a7f0db433a8b89ea0634f115aeabab6759b146d32b7cce1274d13c0a66d38e6ba30c1786717d1070178372a8b338652ff7a4075da351358af0292fd15b04c40f82b48432dc7f5a66e431c517c5ab4c4637d9dc0493e799f434a7e0af2e2e75cacaec3e1d3309e1a0cf1426d74374dc39674ffdfdda70edb90cb8c6a2470b2239a80042512e2b19a70f31614d49fdf1e5114671b0a5e0139c1dec113a0c3e6ece59265b14390071b4b011065561b2a5c9315fd478f1c626b49a2611a94838b9ef503808d90c80337b67243a50178ca70a709f030dd35a5c58481cccddb8cde03ee4a82d204c27c0d588cb57e5fb646282572b15ff071aacc25d25e040036a780ab4622e9f6a4d99a6f9814dddeb504005e6f76b04734a64df5eb7382ec5a64175c1e3327fe2a6f5575906f94fc12416511730dea1d9ded0ac0df9476d80e3a70e1ca8a1d52db7a03d12b8fb403c904698906295bced3be2378d82aad64e7a4f77059fba82b1671840dfeb969bc571e60d306b03f9003e6e229f8b2933edc4d53868722c9e7e8bfb04ad04198872052ea4e0ed619a35c2cd7d3051b91e04d0fca60bbc709dc396ccfdc080cc0c7fa3fa8bfaa949ec2a22fbff08d11820bca49378e7d29825dfd1f30d2bc09ed8fc49aa1ff1daecc448f46919d1901151dc4a786071501cf12970223b67c9dd3c1f5e507b648d026d989eb44cca092238123c5a67d2a2ace788279ab54689496a84e70a03c95459cf9482e73bd9f06ba5ec7eccd93ad1ce3920f5ee25f6ec161a120d58b950a7df3e2a96131b4429c353951e715abddc5c81bc6483499400e56cd809eaea73567748b16c76acca53da77c8a9712301a6f2def4c9544bc15d4698e37ec7b950856b8898f3748067a87f72fe34cefb0e6bd880f6d3c7bb8aad40905f085e5b68ec9e2b9b9eba689ed5ed4a4929af0f606d41ef11a9ef35a36c8c8c1f1b2b109e0c2749cef9d2d0206a549ca389d3f61a553f373002e634a371d44ce4e44edd488a6232f0a1f81c33f468470f8a323e9c895d135436bc501e11790223191bdd7c52d584e31c44dae120515a0e61990a29aa92b7d8868d41a8d239401293ad6795b0fa77dd45f4ba6744a2fdca535468413172b9500ff0a013ef38d84abffef2101b332acae7ee1009074d001f0a92c97002d9a2315233c0a400bcd71fbaa1aa5f24e0df1388be26cdaa3f10c6f2dbad9e7a6fd1e7cc0a71c6fac84dc83251cc8968c52dd52295c614f6203cd12491fc7d116c3ba97ca765e8945c587256376b54d9ddcd7a912ce22431912a32c47f64911788b79fc45ee20597abd127bae2b4e8240b620afe36b6ce41693d63e4755571486642a2beab05f0c93392d3f6e19eebeaf8c344c423588d53393f5e0f785044a7e24d0af9c040c945f1452cd2e259a345572d4eabd738f03e7098c7d93c6deb50ed78632d610f318c4312398e5ea452afdff51ff7123db33859631b80a15636bb06d8ec7081c726ed49d4b37907b00d505e40219dab3ef6b4ef1ca4c35fc58b43923c44f162dbbd3a96fc58152d657541235d26a2584e305f9fb55cb256c766367810083d5169e4b3c39fd09be674adb1025d6da3658f1f84df823ad5d051c8258b4fce634d213d05831537985795d287ffd3c530ebfc4360ffd76d78e7fd5ad0c6e8c4e3b818ccda6cc080e631b1cadb5f289e1698558f9044947a20a63cba4dc260328d44e287ca6c1a807b4c5f0c655287b241a9555d1ce7f3b0fe845c53f55e27b62d68609f8ec7b21e8a1aa449d51af617ebe1e1c84e09c757b8784a111413b7712cc23893baebb7e813fad104823464431827b416a622fb9d495973cc3bf47c762cc60b02fedb69a5bce04cfbc7f9fee9ebe15ea482db8665a8f338775fa96da7327a41a69b7f8c63c3694db0b897b8c97fedf40242410788c784e7404591897d3fa11a941049a97615200afaf69adb02cf8037ec18fb5692b27ee75b58a84b0202dec69ca725bd9658dbb09fd6318ffbb1580625fddbd8f96903b3ceeba3ed75851d83825def415de683b84e676046d2d06d96ac4a7ee4d4035183ec5cf3a956b44551089f407a49a4eed8a9eb35a63216c53142d37b6e23b89f2ffa95adf5aea72130e4416de0153745f2140b1c139d8064c3976639b4317057a241e640950543782953cc29604357a1f04eb495fc3c5c982bac67ecf2c67f2c5fea65298970f7567ee91af6d5869152a68c6cce35304ac9c191d2fc756f15582c2df19ab54641d3b92cb2c58199c6786451b912890756cac1447bc744b73f362b1d0d5787442bd1c8a2a86f4fe45871aa118d601ae41b81cf4a022a39e9a93cb5878ed813670b23cc00c71ad2b8699c6e2001f019f102acf7bc502e24bb7372e125a93b628db440a5a2290553a48d2251c60f32d559ffd1aa4a493443fdc5eb7f6c97ca7b94a6748a861476d3cdc1ca248803827e76159d9274721f6dad43a8a85a039d5f9e0c73f08f816314c70ab3c08c9d8f1d5d1dbec9a9b09349c6e5cd038be81aff730f17f5a9d956d96dd546d491c2b938cc8287655e91c149f8219e1d2aaf6fd9486fda517e09ddad02b455fdcc6c629d56b95ac92eabcc05a95def46f196f3e53f183f57c03c2325b18a05c576ff604d06a64353ad3c44ea57892e0947a2577477291bee52362e714f1482888c565b9c181113efd769b84f2d329acdcd6571528f9da1d7f64316eaf818f893b979ac48911930966411fb91483a02f7152e4e5cf3d3d2080a0855bc270ce60c0295275c320431287721e7baf886ce8e46788c3b2b7b985c163a0382f331f79fbdf4e0d0c6231c106b1d8f2caa9fa504f13e51c81a5ae2b7c3829728400f720b205d821bc72430a36c2e7eb8e12e5dc9de590d93a27a455271460361ee0917289e4e8898054c94abf0652708a6a10eed2f5c5465023285245f8ccd53b860c6b381d693873af5ed7137f804ec216183c41b60901d3f4cddc14794c04898aacc7e919eafc835f21582fb2561b7c620b0a2331a39f14b97e4d50ea3e58759529ea58b18b8c85bbf555d1a58e73f38f0fd9536df6ae4f61ae45843f6f0a75ad7c6c5a1db9cb51ab437cf70993e7188b43f7a4c87510162331c853db06c0a5780436854ae9781ac320e283af156db4ce175400bd7583c06e7b758bb27d18c60419964797c60687a02e071b9ea4da793a4ee414061fd5f5ce83e00f4d02ac4ef6f2f1aa56f8bd2f76834f48d6b50cac64a1b1e879a9c5e5afb8772aeb91b87279ab550c57b79ec9e568cc045baac0b681fe21a92f995fa4a405fe3e609b23a671f171008dab10da2fac12c6979b34c60cd5d6520be8f96e0f93c2db460881a05ecd9fd4901a47fa220e87520ffe1ef7e8020d7228844a5b440247590378057b0d83c5328845d06dd0778c49df45fbdc18ad74105ab199d2bf764c9b5261473a393748f43c49951e922fc96976d20f95b9d4e9a1593d98da1a651d22421f8006aa55ff1c1de10cb91f92e1987eb69113c53dd5faea794b92c9bafb35f68743389d3834e1257f7f917bcd525547d85cfc4c6973bb62180699d602ae8c9674c3b88337a2c0a6439e1d9ac64b19bca033defd87c22f35f5292b659c41884a66b230f676bd7b6f05f7db83e98e4d2709ea4f6543460e817d24325688c8f67425bef63918b8cc2f8ee1a6dfc302c0ccebae53af71f52313f4191f2321d5d025506f5f6ea951410f3093cd94b12d5379dd5400c1c995a8a3a81d3d0517490242666d266f097e06c712e4db0a06f216e8e734d450895db3a1e37595cd3ef525b6840cf8b588068c2030c8e4612ed20462f5bbb18e049bf62e16e923edaac2dbe32ead92cd15eb852529df66b3e747d7382ddeb74b34b8f674e2f6baec688c76b45a014280152112ce3d49bdacddcef8a5640d19270bb7a2ea3b4aa8fd5853ecbdb61751a7be630a3434eb8ee24e14c7c28de1a6a96f8795e46ea025f2d04286dc9843115972fbfe411f553a80febaa26bbc051503fb2bcc2eac763b9ca513d80360d55da05fc49ec2b5e2257b2258d0ee3014d2fdf43829aeab86bbd1e05b593b266bc46a51a72762004226ae92b33a439c14119a7a91c533a235253a181ff419502e5ee9dcf3dd7e8a9bad20693073599fae02da21d9efd9b5986be20a01d052cbd6e9bf1d3fa034b95f61ae2be05ed5e437d196f8b28aca0c9cbe1b8242049d2bdee901258780ff3a54a46fa26ddcda2269f0f0e0a278632875021145da3904e21cb3bd2e5d4b4a05d58026b6efc6b86d978afff4b1b7c911b88dbc1c43a2aa0ea96be926bddf684287f71d1dd1b163e42bf3b4e50533e08f493d47d8cdfc0663020d4463b7c6b9f2e0cc3b2ff2ea16ef7fcff21f880588c4901daf4c4e34922b8d36fca6c4ae8af4d84d7e4333ed683d86ece76c8ef482de44bb11e89f980b830a857a8825e566a54d5c693a5fa655597de93d5a8fe6b1aed7812105c5bbf659c7991d898d4f39127d8bac6879e9a7ba34411456d12af1d2597f965e31fc092068e6c13584eb94978edd992d467e777fb17cbcd338d03579011405d24ce6432fdda3d7e65691d2b6c2d2899c62da465ab49a49b32a807b3f73c14e6c7968a1ac8b9b08ba77004b5d6739f9c83fadae6fc546b09dfc860c62698b7de819933bcce4e65202ab4f131424accef94701e22a42d4d710f21f99455293f9805067dd77b6a74d309a4c18190101fd58c427bf81ac9b950604410cf7500ec710c01542ede1bee5bff4cdcc97eabd867ea3224e2225eb12d399d4069a3dca583c42ef9157eaf7938879390bf0e2bc93e570059b46688a1e1b7703081981f0f119c7aa4cd89d287f4c700161d199e11126e1bb3c47fd14784df8453b5e63453b0298294af434c5289dd251565c870832f34216f53a31c8b5549fc5b807935e4d310a97308ea8419e2941a66f483dd56cc146afcd2400a1d710a1b7d27861a43c45e90914aeb665b3761e82c7aac9af98e7aae9fee0d84cb1630359ff2b8d7bdf6030b5b40c50b53f313a1920586e9b756c4a1307d99851d00ceb104e8d16c54a4e87e01a7bba15ebc60e25371b5f8c4654758c18f862de5bfe6f12d770df198e1283240650f374b5294b709fdee51c569951836c4ad9b77a35aeb2460f60aed729aab9a4c505eb404f473315c368be3e21dc5c5a0439c16032bb52691712f07d3323cbadb41863241e66f25a21f0576eb80f93644d60a0f0125762614332ac98e5f6d37880a94d763a3699222ddb36561cb5ac9dcfabf1f6b635be302ca14dcb06af78792ef63141993c6ca965f813ee9abf7317131cee4ad731c888441e2d5267430efcf6d7a94e117a0132bbc449b3afbc960e776671fb13c28a133506a4d491482cd64811fd085b0c4d4d294f1d4aeb990ec5917b7f16eeb7298f9c2e924f903c70b249ecb370cdbb316d45d15d1b21bc968e982c84309f295fda480642fddbb3cce8f1ba90cf86ba4ead60d30b2d2f0974f0d098feef3fe491bde0892b16356ee62041e53bfa97f75708b5d3a5a3112cb0b81f8f9a420c44963dbba94d2f7c1843462bf208ff5080caeec26f4654048e9cb54983c70fa435adbc596510701ac6cc9526750e52c4160b78da81411d3e083e9118f47cb200c451987223577642874872d229907e7b09a75b2d6b39dc378c2b94735eb5c4def66dcb43c8e4dd32b5c099c2f49a243c1b3e881ba7394bd784dde2ea27886974b2c5348a4809de288bf4c7f4338ee589ec4cd7f54be60455b50d5778455fe597040578bdd25828b3e684dde47b473315186103c134859ed260084c102ae5bf2a713d0f46ab4ddd6a12749d280b9cdab05361c139e7f3e4c163c366a21557a12a0a4b261bb7d5de6fd9b49628c6b5d295a2d0cb6e32dd458c3720470ada95cc8c307be32406775b58a1817eab0557551f92c3e842a76f098e9ada6c8bf3ce90724b388f4e9c797cff3c10422cc0bd81f73db38027d0c89bdc5e22f703e5110f453913873616aa98ae61ae26f593e419e1a25a588919011064be2ee5dc45674ce0905244b330187a2cf38598b779d45199ede3fe8c3d6f6c758f1be16780be569986923f6166e6af2a96a0ac8ddcfb80924b20e458b3589470ea45f34c7f47c99322e0a419552f2f98254e8a0fd075e50661001a15e43f8e625c67b6cbee561bf8a652773ae1fcf290bb7e278ef816e8f2de4eb9d1c10f3c740c8e23c57bd7222adab28e17aed1ecf1c265bff2646bd8211bef58807b7524efcd69895ec39adb39995be8a72c90613152137f36b8ba554ef6c1ad0b098801853d541be2d497dfbe3e38e5495b7ce5ae6d09703c1e6107944b3e4000ceb6de3ca5e18872a1aa6e92c6c5e8da104111f22d5ad41fc0a9dd4f0e15036e315d29c0305db652602d9443468592110a832a850389c68d1e3c1c1d3f8d0720d6e3c94421394f1af15e087c2fd7d9143c4d5c048a8241d6e650f340713cdd49f569ffa98edd2abfc223c08354f2f48d8d6a651ffc89e4042bb89942f59951aa9653d0d294d67ef467471add6f8e61cf0643e1c4af4e2bd1bdac11da9b27a102a4e89001b9143ce80e9cbfee8a868f33c948d8a46ca1bc01c246061a16faf6ac3d28ce49f407f252933171a598bda958562cbac75c8148995146f21e9895377c763fc4f5f47448a52ffd1de1c750299cdef603e69ef75e0e86050e3fab275f1f7b88a71f36483226683a81d030d4d804aa8c3b6c4e68604a13e73524ff40d9e64e8fee1ed782d2080335862b7c963fd412110a40fa9b75e5c622cddd773695e8d7c735d0e31d6b42fc6393fdf1b6ac74b45b83362a685b18c77ca4bc1e0f974b15dc03afbb92e541f33ea292ee0314962b49629489684f1c388c0976844c19bfb4d53eef3242d23e2ce8765aa0e1c8c10d7a829c82c42d33a705a4518b772b0ea2f1b66a30729276585067e2ac54346951fd782a9ee781f8dae22d4106188d617faf0116eb3ec0d1109d8f39c5d99f41cabaf847f3e88255ebfe083e990f846082ac0a26db2f12c9cc98a4304b3dfcbdfa6c1dd56711d158781c48120255a1f9a2b68d6154db28ce6a8dd6184718367f2e88cdbcfaeb496a02b21746149dc245eb54ea675457d6286a656fa1aa67ec3362e0a7fe45e15f3e82b61baca2d159e2c19df91dcdc1b6af33e3ab62cc919e10e1556af11bf72a2bbd98c434fd0fd426dfbb5d8840ed6b813094c475990740b880fdb78cea32e9ba04d4dff882be94f73f67d22489a46fb22b8700e8936cdbd065ddc8df9acfdad484717ec20d015b53270b8e0ceca80660ba4218109b1bdb2bec10d5618bb278a7bcb00cf89aad715c5d0367f4f24add40edab548d64804cb388a3735189702cf2f99f1f3359a3c5691f2984f86b9d5533159c2218ee954b02ff159a9d00735f18140874007e36ffa79a1d5e8020c6c246318de7ff842987147697175902050bfe71b40384f693ce31d87e17f0f3cbf46c974eb63eb81c4c2484475b029a194917a0bace1d88282848595ddd56f90caa91ae6daac9a7548f39a6a1372a0a3112c70ad3e32e886834438a56eb9d33a6d716e7af290789f66e0e425708456f7ab81feca41d4fa8e4b603b95175c30b54ffa1c2c139d417b8e79031cec161cc5f3dbf3bcca9beb1c5c43abe98bc941840ce48008a48462b01070b607480464a172c538419183595f056034a6f4b1210ad3307652393a004412ef44cb1a9f0d0d8578d7a848facd693ae528f82f38cda9f32886b18e502eeac036895a263b06fa374fc22d8165c958df6b1901adf13031f2f8fb24ee637f8aed3c12c980ce4fa43bd45fbc76e58dcb9c9be91db8ac4ae0f9da2fdfc052b309ea3c08cb8c147320f44563de3a6ce47560ebe1f35e5e0dbd562e7edbf46b41f0c26faac1c58e756de2638b4cfc421ab01502b4ed746a8236f6e28fbfc9f38488ddde1b63a37544bd692872fe8d796ed391d343ee822bc844211d7205f58eb5bd17072abe8aa9924887c3982308399cba1f6c14e8d85cb0c0fcd823010ed683fa8c9b64144c537cf715678c2b4a9018ee666d571ff603d9337583e2dbec212dd87ae9cfdb99cded26d7918019956e72ae3b34eea9cb609e280acb2cc3a8fe71848742a44d78bdf5e2f56a159cf7e4e1ba4a43a5b8e5dcf201f8f643625b0d6200260776d3a3a67ecfd412f54b50e87b29f1c9c9ec4afc077f095972d9896fae93ba61a5be99edb505d9148e0fd7cdddd0c7a4073b65ad219a25a381b364a52080af893828eec96804fc8085f11f5ae9666d57dbc78acb7616b9beb6c916d6b83c047aaa4b98a78468d96dc4aa699be85c37b99527ae2a608292b8a7dd05c82a1742a6109fed843ce3a6e93cfa72268a02b0ab09e6ea9f0faf94b2ede569a69c3babd1a3512245c33ae73c6d0a32f4d1b730483b233410625f561a1fe0b39b20f17de5b500af494d38f212bb873a2fbd9fa428760f0f48609163b9028c9627e7f6f6319b08875a820f0130f6dca063b80c71199416dc019de61499381aa1af9a1074b727ee83d8b3ae9abfbcd865f77c0db9533416df02738fb6d90130e9e3075fc73ba5580aa2a99660f2275b706e0d31a9f3435e7e6fd6343e2777a468fe5e69fda61f409f7af30833d4168f143f81b30e27266133301d9023c5285065997aeeb0848e7a55f030b28d0694940acf0f9a4f138a1871e5267b1f8fce79dc2f2e24d26707dc820afe70da1776084cadf9f8e28dc9eaa9db6338dd1a65f9ea15fda30036cd60d993432ffab97c574bb26b4ef8826e078f4ac6d531c40365e418f6fa48db3ff711082b0cc3e03dd0fcebda5461f46752b88657cc3fb81dc08f7068440c4ece644d09689e9e46654118d256dd9cb0dff128ecbbb8a39c84f1ade40095e0978bb00e0f087f5abe4c841b21ced7813dc3e34079d6ef3959196024277f16c19442b61f837ac278acb2a08287c3c0b4ab145bc2c6c2da2c36dc006773159335b3fd0992ed70ef0de153787f69a6d8d66fc2293dc29b927f1065e7c0ef08b0e3d49816a61d8f29e23a4c8951820c9f715bae449de5e12047caf3fb2a05af46904ba259596671956cb70ab045a278d6aa708d39c4c2395ac00bdac1bd68b8b78ee4464c47bf0c6edfc6a091943ee0ba15b3d36f630bbbd1fbc7d38fa1dfafa32e4be606164611815abbaba0830c7ca41819a9f275d159441a6fabee72a0216328e8031796b4d2e101d910b6164c9e3a84431569d28db0d6d420365b8b3ecf26fb66e1f1cad96b55eb0e692027494e5bdd9aeb13b33f49e264a191e4b076a70476c7bd8656d96c10dc7357ed81be15508dd109c00d31230987f3bfb40008241e340c9c24e35a3f0bc3a814dba62edf6d1494d9a1035e21ade99ae641e9b6fccccb9a0f9a397bede62df0596347f842e505566583a85402b8910630e22a742ff21974bb8a85916840aafd2407af57239120ceb4674c88679c6ccfb11c9493df92a0815c89bf0f1d1a5e31087913df04dea912436187aa888445a3197a81284447ddf14e8831aed7f31385303373d03b5a65c18569080840557a5f26df9fb8816543d450c2c2c12578246a2e1873d261baa5d65c76044510bf69d09597e791b4d4373e95edc9f09d47f54df0a06f7d0c55ac2054835c8551a813db388d7ec2c685ac128c98071e234b4890624a07b7d1c7a535ee440b50c5e2a536dd9ab6f1229a7aa8fc76f0085f9807953c77dda8f4c7daee0e7edb582645efeea892d96c2689fe0f263cf4d68edefeb2a5f091498aab4246d3076d5ef3655a061fdf941582eed74c6759880b8bc5988eefc2804136eb0b3dc653b07e924d6483f24ebd90892e98a8580c2c4bb0546a913d30c4ed0dd5c29aacfa92076c64af7b1142a9fdebffa860d47498f95e8a3f3c761ac5aa34593793f942fea18218cc15a2159ca73aaf661d73b8345fed3a61e9c32bf1d9906258c3e6329e97b6ac4b9f6bc11c94b82d2457a54eb23aa00c4ddc60c37473f3d09905520b48e42155c60df470b433c7c218f8ed12ee6a90aa33314171ed23c63feadc38322aa31eaa585e7abcc11d5836313bd3c0d03dbaca51461b8d50c04740eddc02002e61ed43e926bc8384317dbbb6b02d4916c732d207e1dc1274db08524ea8dba73cbe6a11a1e19adb67b91c7c5361b2935e126cab424c350c853b665cf66416cebbadfe0bdb1ae5e427086e048d09b999228e2f9a149a92b8ad80053cecce66ab5063cf7a40401ec15ea1590dd62b829adf08f7af1c28fdb62395cc6d01ece858f9da2e987dfbfeab88e4efaf04f17243e9eb3b0455c0f10ff419661073d275401679f41bba181fc2f6853521937cea92c71ce9d5b6ca7f869ddd9eb2c609349e011432010fefce0cc66c5ea6669bdf9fac71536b7f1e07d7d012aedde00d189b5fcccfb10b0a1af6b1d8bd07588849f63ac04377976c69d0b6d599c19fda522d61c6f952db37db06ae142989c1300600f63011a8f8c398152638bb31bdc12ab1b54906d92f0fc25f25ac60bf5e2197eee9334ca73fa3ec23021c4f8b3d89e98f920393fa61406b7e2e0347907f8c88934624639823c6275f9a11252c92bdd12503a0b2cd627fe65fd7c3c7801c355b310c232196c8f8d546ae30629e0f864a1da948ce1055d8f5c40c04d942a6859220c404e59b9b43b051d083b4ee2cd8f5d7dab678bafb930fe9910684e8fc5b57aa290847bba30db7ddce48372a10b46bd283ea5690a0aa49738e81bc370322b73987290e1a1712f2f21ea0d86f5b125ad6025b88407caa570ba4d21508e33af309107cb8b7034e15738ed3ab6a503614abc2cb88ef6508063ec4abc935cfe77b8e57e4499566d6074c94463b55124d1eddca973d359d577afb0fea17facd1428a42d460d08774525828bdb9cd4d27de4a6927d3fa1e2ea15361d525de2cb43c13714d5a1422cdb24ff481c9fc94010a8ee4cd37831ca15bfc296a3d4ce336b849b70bb97d308f0319de7a30571f90d60f7d4020e113043701fc057396764cef9c828add6b7d3df612c0c4b653aa4b974e47e9f63380684cfe126546a324abff437e384cd9f74a37a50bf9a5e088df8248cd5ed85666fb74332b301cfbf9aa2bca5dbbe4ec16d2551eb226b8ed8f374b97b379839f08e84dc847e47b105cc927de222b09f132bc89b8fededa444a828f6855d66b6f2250e5fe6ee95bb0d1dd3a5b31896bc67bc98de98b48f81826605790dbcebc56c5c10eab0ca9850729bea03d4b926a760f4ef41579eb50f39d75cca39edccb16bb927b9e33bf2309fef0e2d31f109bb95814747beb9b2a152325616c43432654834c97ed2b6e446f10259e2a3dda5308c23e2c095593d6a0b4ea619d6ad5c5d1a854a36fe8f1229a6b940a7a875de6f7d2f1014d5dc2177afd8b7a8b41b4f1ec9179029c881d03403b23542df429124310ab92b89f9192b2c87f8025f6a213c6c8b33345e6c3466ff63e82fb8fcacc85b87457b17dc773e2c6db39ffdb9e78cdc1cc0ab1e1e079b1d63564a04ec5e115332eb58179dbd4d738c21b8a03687e5d42f094423160fc18e8dc3dd70a463c628f8e3d0f00890a17fa0eaf94320bceff7c656fb642fffb4e1e04dc42103e840dd12b1d22f4acb68568792bebe7d388ca9f58cfff4eca96e83da9603d94fd4ac82bc954b70ed07879a44743bd6c60e14a1b4fb80a40c2170be49079bad5bd8dcffe554a0db56d41d1de0e092c354f85dbeb226d2c1bf39a5cd73e0f333ea9c25900c0aed5cf184b347b2bdc344689c793ed5a574097b35403c190b23040c441393cd486c8629f8138be467543849abac581fd6b36e876929d779e726feaa50932d4ec433b5bc45174c24804a8914d95c0ea5b68dfb29e4c3641514a753d4b8f5dcc539447dc8d6c43f2a234411f5bb0525007154d8fdb8a473a27ea839abfc0e6931b4d662a2771078c8ce914b4cf405dabc74af4430ba4325d964c74b0994c248f045965cc7f27cb49979a5f60b20cc43712e97c9a6e77a912860678ec70b32709ada5d09c91d13c19b12377248e368f0b138d92ec6ce7604d0b1b5f01b45286ca3d974d8392fb686a28cd11602ddfa67b47f2ba5cd89f79617a8e3ea39922dc92e8c21da2f747c4e02c97c5f60e9b61a1d18c2e28c692eea7c59f6b0fbce85a1fada95e9f4145d1ac01e5c81a4c56cdf5201f2bd2ed2227b9d2b25be60e377f43e2f5dcd11947fc3dc853d511b59cf1a07fb9c047923528331b81c500378bef20e8f53d87828d8ca6c125ee1bb3287e10bb42285433194cad5bd64e21c9cdac302ae70953d8a0fb31135b049254d0b71144d7d9baa1ca0e544a2d9244f10344e0180d4de190abc54d3da0ed8b612d4f306034dd167e633524bd0d6d1d2f227689f7c220509d5cc8bcf69dfa3e06ffac33942ebd76d09427fbfa1afe082232d304a595a4173c54c4efe8eb7dd985f07bfd669c1530f2d71aac25a9dac001e264176af14ade816e58d8c2e3fb956373d0e3679189a283074cb06f91628861cac9de74db8415a803daec2786b0827240cffb1478d779bd03552b92dc3ba5708b8400a9986ff09cc236e9707817064660406d4eeaf79df1016dd7c23361b91a9ebb168ab26ac282d78f050e605699d3c5d620863541996144d2a76052a4c41d7fc570f08cc5a41c62df29365801203f721599f54a88cd17a2bac5f9a25be4bdf94212d49ab137aa34863cb2485c761b2145884b4009317263bc85d15c22fc3019240b52102e734a3956c3dcb485f2f951807e9bddca20ddc8c6c08d60c09bb980f45e1cf490c65c3a784e55328069ea35023ad2e350a63a831c4356a3e85407e27ca40b6fe4417ece23bf8a1ca04e0450d72a87f426229a7186cdb8700e632387d14bf3760ad02358d9140b905247cd09ea088486f9b8ba412a3e9d3a844710cda8a3a32287806a92e2d6cd37bdcd91151fbe0211a0ac974b6e22c71ce18507ac1255b6082a53d969a798868ce37e2230a01d021ab81516621522f0d2fc083939fe9d42346ee2c802322ac32e048ed13531234d210d87a7231a594483a38361b30801927fe90af357badb3618297980fe6436dd4a0ab1181e05e3e9d6cb46311b11d761f7254d619e1f2854be04808c164249299a6a5f389ce25388958730dcc790b6b1bc3d3ff2ffb3dd619ad7eee3297836a063f2c366bc763559cd9b3aa0d92a8ea686e6ee3c08a4b68f668e1cc49f22b70baba754ca08c036ed3eef23f1b95c2220a9e16423be4b435b64846eb173f4a46921d3909598818b62699a1f8f9e027d5536b699a589eb755d6e10fc8d5617efd733542016184e4285bef7eba36022ed8deca38a66fc828a91b96fd007181de80e060697a90c571a78ab79828f12a9047d504c61f93e7b5355bb0cf827f06c6a1415b669081d6db00df329de9984f2729eb58860c128d310a087fa50e9f572e914b0399d4922ca8f1cd12f43be7ee414419f0590d30404aaee3ec522e6aa547fab25b717b17609cfcc7a45f117b04f61d3f5190297bfbaa29956d8ae09d4ef28ff8a054b778066255e231d236ec6ee4a79b41c63e9b8a645919742b259b608daacbefe287ed1a006d1f79585319f45aa37f4ef80cb5ccc8655b28e6f6ccb386e4401d2bb6278fdb1e64ca83b09da1af5fcd679b53b1ce1852c1dd66c6db81f9d186c1f32d04bcd431245bdaf5c6a4b0801dd83112defde6be5f043637533be372e836deeff73f36b9eaf70c845116209213877f5da31716d356f2174f6bd362e1afd1de1a19246c2c55426753a92938505f3025fc869995fd537b9b70acd667efd5d0d4b91097223d6f24a6d077e91a2b1164373c9ea81b366d8e6d8602b8e68f55a1ab24b477a55c41454b9534224862423637e1d1c5e2c297550260e8c8176a908ff14ac7ca1911839057d83d2144494d085e95364956e5b751f4187ca231dad721fe47bf84c3b06447e5458dcada56604b8b454fdb83526de79c0dc6efbc5d0fbe29cda70a7394584c431a71bccc645baa667d092e1384987090d78d86d3ea0f53e31769aa2d6e62bb7820bb56af403134085007e1244be44d81566762ad602b2fa62b4921ff81c05dd21118a2835eae6890580dea4140ca0f7c5cca768b1e2428ec8e556965979cd590edaa49fb49853af223d0c5804453861ccbc29c5dbfbdaed50d2be67ca2d15d0cf32a910e9834055583b9472fb62125d55755840cf2a3f20d448c19476a96102fab9844c81876989095ce9c4b050ce498206beba47d9ef63bed3c6142bf0feffab403dfe1b6925fbe7e3e3c6c93a923cbcd8a52d7f0e1bba5823332279e66fab528498880015224ed74f758d633d125ee805154719c85cc6a0f1ae89e8f7dc14f7da88aa347fa485568b57fcf44d2b0d2d09ee57c9f0e652de1f0084dfb83613a32c0fc5b10da77c7d6eb2d08a2535b808ce0fd40534ff66804c2964bdea41ff5543d7644c01488dcbcad01d84fb98e10fece4f1fce80ff5113055c5039bb82034b721d73805d834a953e1ba2a0b1d3a7b5b2f976ac1e7f7ee6d86cf8b5ae86f14580e9832d0c7127b5128557b885449d7d89e91e7de1c09168c105ce49d22443dd9a318f4296784f8b466f54e1098b88e995391cc32d42a6660b0c03ff39aa2fe32b85503ee92239653e404a061c18141c2e735e1404963086f850608189c6757d3f54f86b5b5e056864671e8527442e0e875a09b4e5035251f11ac7e854be375d5f3834791ff7b62f533800b707f2191640aeac57c5275daa8ae4dca495b25e0aa919eacd138d7dd8ba52fcce76852c255ae85537c17cdf90214f4628efb0c054c1beeca595aa6b42109c904a662ea5952471d9b22be7c7250f7b5bc67c9f4c806e9a12ea907215951890c0fa7e8c417f25ac76eca5eb91ba6d19cac8e844820dd19e55db035f818dae87588fe51fc5580ace9d7fa99e86db977f6aa8d495daa94605bf9dbab7b4b7fc3eaec1c088e4300c947923482a53592505a5ac753c92403a3f520c15012e864342be60e66071e43c0c10fb3b9362945d596a5291ce1bc92f92e0a909f7c0f037a4f92755c30503a4a738be37dac1d1daf5ba2bed79a4a76d5829d265dc5f5967f9dbc9c39c9f88529ae4d1727a0d022a432ef42e8e8e63ebe877931dc793af298bcca2e2fb035a3a311b9ea370e8d50a3f79963c01e11b1b6b5d6464b4b4b9b04f50609075807311b11ea2db69b0133203cbb4acd7e8ec7733722d4615dc5fe9c9cbfd70ab137161abb72106c6b2b8d8d7fc41dd9e37b328c6634e4d4cf70379ede8af0fc78f8d12582e263452cbf41c2df208364144f7362e3c11d0b3c872139ab1fedefd9359c3d270ec21d98e79d79e66db5da71734e0bc4e0e238c9dee4620f9f237170205c499c599b37bbea5a9f7da0679c70b3964e8c62afa50b1d7fd94a818cb8d0f33e8cbc0cd2377fe423d0c592c4d9cb109fac798b392fb8aac752bdbf8ed836c5a87b19e6857fea32a4ece9b29db4a68b73c723f597b72239179f40743ff196537ad57a64a73928067165a4c479c7a8997cafb53735326c68661cf5d4bd3603cb57ad47ca5a6b6760d7292cfb46860daa86e6fe64faeda19d7e329d9ab2264b189ec25824f526171236b559df96d8b714d13dfd3a7dc4f253eb6192b1efa516c4952953a6cc6d538672411306cd1a65ca9439bd4803e67280e469a9745def81d7aa5fa63dfca35f04fab9e0923ad3326ce1eaca57a95d07721a68befaf43b3d0caebc3c2cb9392b0b1f7db3853265cab47abee20b573c90a503de6a7d7c4fc53d70258fd1009242c7986bc47908c440f132e6dcf30388e3f11c8fd74bba5e15e4bda2b292c449d2ad1bb0ba74693a0604bb4ef3696ffaf5de5573e76e5c286cbad380982e8cba901e2621435e783e16b319cc6f4862d390179ecf505f404a9740a6978ec29be9d76bf066da8624607a093b6555d6c7e7ccdc47bc698fd46a42ea6ddea290d265de3421f298e9d883ceddd8e4af679a907ad42ddee2292aab8260371dbbe9d87529731a90fa2d669a175f731b4d48fd967d2b3d3ea787189c2bc0664f6f83e1d36bf04693b7a10e7a5d3afd0c0632fdf5c540da4ba76c836dd4b93c9a909ae598391eefcde0bad60d905a85d7554361288999ec693eae0a88941ddbda3ffb190db3187bc47e5da507d13e723d880a4901c357e94e43c1d928e54d9e6a3dacfc8f9e76cec6264f7fb0e6dc8dcdb4035737de0fece8c21baa819a1397854ada72694b3373ec2165a76fef0997a79e25cb4d7a4859b84025f74a1a124a7a48491706d2ee425b67edb3b9b2a04cd76a6ef3065b7b4dde609bb8f4bb4dbec436fbac9519c874edf625d9a4243026a4eb2fe9ea62da1e972bbb7cbd5623f3a6e520d859ae529a32d07b4fe465b5fcb258bc0549954dd2756d325ee5eff5974df22f8b8c1c24ed254f4fae2c6f2a64814a5e161b5396a48bc2d96bf0e910df3ce2d42dae8d04573333a7d1decc7bda4c967afdd855e30e996766b2ea7a599e02ecb59b4d29eca2ce0d7651479eb6f7244b968794854b963b0369b660d9600a105f7aa75d0b8824da064f7a00ed5a484cae74d6f4f1ad27ad205a41b482680561fa924453b3d78cca7e8c31c6183345c53bf925d37ad097e50c7c4fb1e91946f1c41d2e45038704fa120eb51f2c6f37f5f2f698b755d3bce1c0b2ec3dcb3010bcc9b2c7188ffd2fbbc933b6205843c88c1a7983ef25e40d471209795b61c1c9db99a091b7140f54598914a519ce8ae4c00e4fb36a1a12a27fa6b7991e0481a2c46acdde3309a64d9a90cd94dd74ecdbf55af326bfb4e9f03b3a78c6ccabcf516da6bfb2db929484e50a13567830ab9404f014a02bbd296330a319cb59de68dcf4fac7e452dd6a279b5f463ccd1bfdd384c42e4f01f43db1b30de7a66ff24bd7a3f049f3418fba89caf8738d1c4bc8246455de2ecc115e85934df49ae6231e08e6fb2cd298371586aa0c7a9b9346ffaecadb4e9b7e615a8f8ac28f067e4ee043a2d1f487a36a3e50cf6ec2f13d7106be4fe199dfe096816df0095fd8de2db5f1f4c4d11b0fada1b951679e06c7ea4f99f2967a79bb31bbebad488e97b79da6a171c20b17a874ecd6cb0ecf4e692b92632b9263a76986d5675856b12cbdc80f441c3856ab3f957a4cb0d3e768d3b72239dafe34835fbed86a3e4caf9a90ac4d7f4ce2dc8942c70a6ecd9012f3562447633f656bc2ae65e9e5e1703dea73a2e35ae9e525e1bc1ff114fc043fc11077b31ec9ddb2ce501952921f74901269494b9a82a3a0fa00c6872f5ab66bfda0840accfd611acbc7e650143c300dbf93a4e1732ca086fb1c51a49562e753877c6a8c31468a55f0d3a76215cc3f5c0b749ece7855f072618c515e05191d10f0d1276a280cf9443ce4e383961451cb960f4b5a1e25b1ea9dbe05a1230a381f787ae713b1eae51fae0578e783450a381f22177574e4efe50496f339029a57616610d4e8f72144f17007cc411d73ba396dc52a56b18add6119085ab8caa8084bd0966c8411f6c458f17661139bd8b7d7533ede8850cf4b6967068a325e8faea0dea01a63d4f8d26a128513ad264da46e132a77ea00854081b1a486070c1b8076ad26336852c3497073f02c003e6765a3446b88b9d66e2820edd99b1009c96e3520d96de9d99f668f6558bbc54080ea2f0b046dbdd3b23fad3ec340ef18762db57a0dd767d7707c2603a56fd7255661aa926adaab9e9546845a664662cbecfac98d4dd1d8af4beccaefba6b51d1a5b15cb23d31cb886bc0a2916c1f8c21690cdce623564d394bdfa8aa947f2e95cd3f57ab6afeb9fad1fc73756cd8af5df74423420de3b3843424212902abdd0ce6e64c0657286de55ecbc996f14049c7961062e818630f9e88d2f30ed5523e2bddb54a5a08913adec64adb5c7b3c4cea9adf3c1e76e97a394567a7513afb7d10a874ad9faf4b3a3e7e7b4f3809c2989ec1dbeb995bc2db14523abee6f1704e6c5e2d486cabf9b83d6ab299b6c7b4ec693f1eb8f1405f416a7ef393f682b8f29b76ed6526cd87a669da7ba016c4e6da4fb462a099c7bfedde74a8f9b89f353d6af256fa9cc137799be9eb260c34ef1a35e38106c2db0c053e440e3e4051c5113a58e2e39ccee99806c4763dc51876d27ee24f782bf5363f6383b71285a5de4a0f41675ba9af10f494bf58cb5ba9e72550049a0f41f7b8ae1db3c1f212cbb8868164b81ba599534c3521f555fb91bff6f40b5bac0a72facd4fbf396635d9237589b36b18881ee874cdfe7ae946e91653bc3d21306e34a75995ca3f436dba0a88cd4fb7f9e9a76737983e33d1f80db681f2333e31cd40d967cd4ff3a8f7444c663738a331f4c28c97c0b9023c9f9e3803cbc0291406caeeba060365c7324de60992fdf4eca79c232403653450184ac2051486865ae6cda4456028092785ba05ec429786fad24a87da853d8876e958297b106d23a7ac85b6256ca446979268cc85b6570641aa8352436df3364d3987f67cb8a5762d29581db34dc1991438fc1edc4d4627e1caed702d27ba347cce7b4470628a762d2758bda35dab8956afa468357441c3ef44155cd76a026906cc411bba25450d0d77449febe0be0cae5cce01c3c205a75d0b0b152c44606992d3ae85c504368490a35deb4a0fa876ad2b2c68c013348ca86162c2210a2451b0bc306961a206890c8819ed5a50dc40a35deb8932ad27b4340d37d5aef504151aafe266988678281d98eb1e98eb5fb9efb9a73d8a1befa26c23b557a0d14eeff01dbec3a701b90f0e01b3f0f1528ccd4218e77d70a18d0990f112db380077a137f4e21302361b091d8e406a0ce6290db7ccd1163494cfe74ba358e8a0685192d68084137994d45a48687139304b1ab047c37d872b26f08824318c4c9a54a894fac4c6a01405c915062bc28a115a32164cf1349c297065a28149026c1cc089ce7025108c88c1dde1c7826b2f4dd22aa20b7434251360af871eae9321816498b2cb521832f01430fb491e92e4c2254bd27b5f8eee12f94576915ee41796cdb04ba8e9a7cb7943399ca6df9ee52da7a98da679dba1f43b2d557037d932252fb1099fdd077c267334b5172d92a34bb2e7cecad51aad2d3d27c2584fe773a4c4192abd4984d42a424a8b881a72c82e4e7e99a2e4ba1611442d28637aa65d0b8a1612ca140e0350a8f496ea2823928e2d28513ac28e1152f8e66db85bea3dc29d245090a4baa6706aadb5a2ee829bc249a16e80034f01afebeb59a8a9c77232c49876ad21626803b46b090145cf2925bcd1a58fd95b308488059e025ecfa7b0811984ede6208399587a0e1ef7eed2661795c2813aeacac675e1588a314208772ed933788561275c316d6df69da7715d2bbda4f5d04a1a967de54b0bf24e58f6854f389a606b353be157c3c984a565c195f7367c3d0db650a774ed3048ca2e4919c40165ca94e90c7b09cb9697944d71bc540b1e54966198c93dd716ae302cbbf692865529cfb9b457ecddc6cecbd78754d175b715ca597aa60bbbaeeb8f494379f0d042edc2f6252c9bcaae44882092990b57cfee70ddb35fc8eb57be8ec3bdae6c73ce0aee96d35247477e15e58e7bd9f9eb0fa9af78f90b1b101b10c37d6003e0e55338cf813ab2a79a40fce91580278221fe945d3c0cf0a63cd417de6e5fd7e9f5d243ea4b5e70c37cd46f58de721a7bdb694d9fa7cf1a6bb319ee66a3e74bb7b143f349f3399fd1cc600757f79d9d707613ceb2c536cbeff1d9845c68d98af0386c830e3be734325dbae3e96d28496bef81af94b50c941da86e3c526e59de783afb965db751c769cebde4a096b7ecf53d31c3b684371bb28a10524ef3467a5cb74634700de9f9886bde5ebc94515a9c048d1e32ea76da8f2b42c74d7e6215907a5e15247e3ee699a4af6bb7c140d76d4e83b7eb34422ce9795b6b666077ee469661bc4921335a8cbad37adc600c5789d1bcda2138106a14703e3838f805d54bf07c4a9a0f9bb2f6a9d32d9e313521f3b6a409b98ed50c03527dd0dcb91b9a90f92dda675590d79e48e3aa63d91dbdea97f2290c6473247519189e8137d3e55358c8bccddb25e45e66ed3df1061b790de47acd65601faeafabb0c540da6b8ec25b8d765a3a61a00baa7edc1429338bc9ec18661f441b3b8265f298bdd3507036ac0ad662a56c5e06a9116740f559c2558e1d1f2e6cd712c24abfd73b21326f42aa1f27bb074ecd080b44241801ab9d5b39e76cccd84302ef3203b907f31a05fe428d2f361feacc5973eae2a0e63fc6958f6f074ae181125278a044114ad0a09f03949041aec04991e161ac60071c84b0032423a66c41e6053f281a020a2b8ca82106576a93304874a0a530c4d45a6b0d03a9c700c38b1c6892deb502b11c4428526bd702a309183af43b46b3161848ba5deb0b2ffa3d73587c91d4ef0f87fb962facb46de78593762d2f741840bb56175f1accc9b5369e2fa034ac4143db90062beb6c50edc776ece86e2345e70aae6b81f9d29b6b7d85d79b9b12010a01b8e3f938b7510ce9a12681874970a5732ef7c4cc93c3e5e9d8031d8f232bd89e0fa20d9bc23713ff9a067140cf6cc4a1c0448787c3d11144f8dec562b158527c9c95f8acc41d72c9afbcf1bc94b71dd36bde56da67de9ec2f269db3165179f6517e3e592b803f2f0ecac564851e7a9d4bd71c807c62b8e87eb78ecb1fa075e69a1a397afe83c2bafe578c8c7c97aac27f4583e3d51273e06d5a6b4e22da836cd403d6036e2ca34fc0ab561de864cd0d7f9389f991fcb273a31fd2eb7da308813f303eaf8f1450ddcca75fce2c8ad5c6fce071d5fabe325d629739d9876bd392074cc82480c95322d008386964f3422082dac5c99410daa18e1b38021a278f9018c135f9af80cc9a087317a904118305b74e1e39830410d4008830b1c6060c2672807124831c31258c45c31f289df893b6a28f1c50d9290a2046168e11385f025081e66c821cc12627ce27be20ee7b3c4da00737063c2075de4604a1357584186c905c6548141134038c183146066d0032348f1828a11acd01eb00bc0b4c0d8002649864d30a7c02c1c82d0858e9b0a2e34fc7d7677c3e62dc2fbf8e0cd2bbcae4060d7256d5f919a47c71f982babb7781924011d33bc096231ab2d2fa234fd94d236662f833fb52742ad0b2b5d24b5fd4cd44a874078348cb9033cea67de03abf6536f5541ecebedeb4c29c876dcea4df874e7780015e1d130778047c3c37c043ec874d34daff74e0b62e3c5d9eb863dcb0e689e5e94629cc3e59cdaab48600e621cb0121e1e7c83b53c191197da2f2c2e64687d1122ba2e36a6c08186a226556021039fec47f81283dee49d10323998b78473b2462f4fb69022021838b183151cb4604b18ca05ab29e5c104247cd0c30f5228090306ff2280762d2f58bc38c145bdbb5ab87e3a865b382272651775ea4f6f016a7fd7e5895c97f0d963167acfaeddf4135897be7ca34efde1cd67ee6f7ea1232232b01379c7b0bf973291d44f59e8f4541e1275ea67b2d0119199bf2cb4136ff24c16ea893af5c22cf4a8532f23d788b39bb0267f9d882c5de85ebe9489c46759e825893af5e59b853e705d59e888c87598851e2b27113a22f20eb3104be88808fccb42da614e21ead40b99eea28e3dcd4ecd9d8f4bda1ecbe6cee755d45f126983858e86a0b2d0f3b99f790d6e01fb751adcc21111ec7a0b27b066f2cd0f29ead4fa1360b8795eb98579e7b33da4ae3f611f0d3b22f8b7450c5b2c69cc41074d3da886d057e0f9ccfb486967c20d8e8839b258728316536ec0be68f1440b56f7002ae24effa83d166c393836bbffc0d53477c07d1e02b93a70757c3c59386908818ac4673c2f8b25b00332cb11ab5d86f34527dfc2e5575491f32adcb1e0e1a9750b22240278aec5a2b674c1228a2eb56b6551830bc06001a6bbf4fc0ed4e15a5cacf47c8e79ecf4ee8302cee7fdcf65a1a321efee2f0b3d9f2144f5563581982ba09a407c3d9198858e88940e1fc3f38959e885e7035fca442570804f7c0ccf07de4a284d3dd8e19da8337f44240b1da926f0ee4ee4dd65a1237a21177588bcdb2cf4f2e3fb09aceb7c9c8f238a49f208f85a5da2b4b4f0c1b5c8c991b202b8054a0c395b7e3841cead90cf426bd7da52842d567adb9964ae486a5d71e50a2bb75deb0a2917f8c176df5deb0a2687e25050e928df9c314a3763bc944e4a299d8b0e462833088dc40cae1c7c3146082184114a079d6a4a28a594b01d6d18e3a98c51ba28a593524ae7a633127bba197f328439c3cbec6276a587156da71b1fbbd8ec3ae79c73ce39e71c640283598c114ed1f2f029e029607b0f9241b6eb83645f3faf4cbf573a16238677743edadbbb8bda57caaa2032dbe2df679c120ac97afa57a7caceabe894703e4bcb74cd5a98cc5867400592be9e5d94d64a6bad95d67929b3476badd96b0c487e6e0a88235a99cd8b6adb7520094ba5286ee91008b3d737949412cb46ddc8579c3261a7931664288a0c657a1b8ac262b50ad15d79932c56d77ca4c56af9a0cb0aab2f54c730accd4961b5cc321e8e887a38e2dd11babe074a1b7723de692877233e0817caf1b81e7f695041ae3b713754df743c75ee062ab60d4ac68561a36c2e6b5e47a154efa2b5a5bdcaaa3055e9ba6a5ef4c97ab9a905a9af5a9454d1a59f2664284a1256ab30940412abaf4bed274261b54462b5cc466218565fd9943d1cb189fbae034d4d441da13a4a379349b823054b4e3abbbcb45e7bef2dddebde8b5ded66d744c4b465a037fb6cc6495eafb7525e97bcae96d8b177954eabd6e31dddeb0e5e19bea694d259a2224a679797746a40689c40845db9d7b143202cdb20d955f25e5a8f7ae18dfebac52afa7a62c54662d74bec5b4627147519c3e8aa91220a298c708a88785f8c1c155a54e1210b24b490e08a1c74b8f06004152040c1c196115841bb30f16284c516464cd860c388d78353d14d0c8c5c17b7680c235c444251038260a485568485110e53e460c40054d10c8a6024a36804482f08cecb124ae603838c7be2065188b085910c8ca2aa688b9c450428f2c2281761792fcc99d19e73ce99d9312a16b7145f2ae59c65bacc502d1ccaa11e75602ada297a55ac783368a1c2c31546618a0083910e8c0e90538415392b84784f94311a6384008963a6e8044462a4f430c5e80da10aa31b3adc0f9c30d229d2c208464ec018b92c460228aa3754c69420892a35481aa308313738616224051438f8d09466c1a484a21bb2307a91109874f18ade0eef8b295cab545483918bc2c888a74807ce0a16231a452a302ac228893382018a28a565c6684ab1684203a31766556482ab62534485d1116e09288c5c13ae073a7c61d4554c1006111064c25062db52849431b454e10409583ba05c6a30a328082ede10ce0ba305f45b92c3ca00142292c80198255550a08329587c40022c288841133e3c1881134db79850a68973ce39e7dc73ce39e79c73ef3b1ecb27e20073391b0e2a8cac35c61a638c31c65af3362505a3c47570f562883a29c8c35ba0fe3fda7eb3f5b122ae9905b87a42f2722d220eae6284ace902cce5b8978083bb2da0e3b76785e6241c00720139f171893b4c78cc5f49517d3b0fbee26e367e5dc78fb7c07be278d45ce7f129c41dabc7b3107708e03100a5c33f262b27253af9b76f4f49e91517e1e9223c8dbd8495ee0a95622f77bb331e8fcdc0db6361ef59c15a5cfb230243a28455e28b9a91b799836ad74cb3145ee11e0b7c800521560d0d7e4a90ee09bf24302b2c8000e014a2ce3b00f0cbc16f49d4793701678c5fa3048c63a373628c3fe006a00e9a02267ab045bb7694bef75e2e41895b3a8de37c7b56548fd9e31f986705fe71795d3afe07cd4578e8b196bbd968a8c12ff95d1e8b852bf488dc8df7127e4ae0ea3dcc1b8371f08b41659f8310420883b69dae416f0c18b87a6701ae5e17cce5c2d7ee48c3c33b74034f3ec09c1621c703031c50e13c81d9b883e8a83a22f047dcf163bb3bd9c49e82e3114df29af02aeabc67e77995669bea81d8853884410885cbae1dfb80e321e46e04a1697cbb3378e20e1e0c0cb1d7b0ad9587d67a93dd7eb4c934435363636f527790be044c027650e726cbc00eae6c322a6fb2ed77f286d3f630a7edcdf599ec6d476a7833e52c0f51e1cfc07107c45b6a984c3970036914523a2bce39e79cbce29cb33d7072a0768c3b608ecb9c938aed11b17989619fd385c159dc2bebac62d4c35e9c21fb75cdecda5b2a1d5b614df64578fac21576ec100575b043ecd9cc8132073ced30cc5a2ce3b1cab3e5d83173aa65a77f0ed4819d7e45a9b5d7329cc23970656d0a8de5a0d9d8afbc822b7be5c395fda954737dc51a8c449895622eee661febb1c2740a63912a5dbe23121e35c3b0306587195816429d152a4cc204d602faa19e794efa49b38703da234056802f7b38cb95b607ce9265b65620f4311e81bd8f31a65d6b0ca4ced1ae35468c361280eb1c8001e03a9c63c2253a92f359422873bef10fb0745a8ab2d47e5a3b6fad95544e7ceb898ea6cd4097e1299873ce8903571888bb65fd4961ac71775280fdbc2e41555170556feb65cd2e2a75e4b5bd8551e64cc2253a9a2f95e6b4a5493fa79db6c612603849c870b9407c4da090d84fd2c32019c8407003c97920f2f035aec0010d2fa4c75a6490c0431b4977b3d1aa998dbc8e3ff23a3ef7f0d5834d602a1a33eea6b5f7ba9cba44471322203eda1f2e8c62eddddedbd5f1723a97bb116dc055fc8e1377b37175bc8d9d1c3c0bb8b901f6f35ac68db7a133bb9f73f6506daecda9887db8d91d52818100c35035d7dd519a9c190238e72e11e7f28900262dbb4e62d7253a82f129ccc106c01d0fe6d27d09c0ec7592521495184b1bdc2d6b0a53f8c86bf9430963bdf34447f110860ca7630e5c6120ee869373e435bc84b9072ae90830dcc49df7e7b59cc1e27592cc95762d32ad2640bb1619254d7f6053145ccd53889f5c89517ce4353dfd735a8f875d8b0c92761abc4447f1f558c5f7b515c7c3e9a09f4d3f067bd7845da223a223e77460ae4a80d2acd6fa9ce6031a61ced9191468f004ae5c6763c0f46bfc8ee8f754880f1fdd0c5371659431c62bef0fbe07df7b6fc77d7763baf483ef1981ab983783f8e52d6b183fe79c0f1e5701658e100b7aba923e6a40e4e5b1392790cc370ec9f774d06408284b601e0200031149556ab0840d59dc10ae6882821964f1c31739a045381973853e1983a535c64a8e0e592d8d708ee9414f31b264920b964a425a018790ad3146d83a8687a9431863c2484189cc0b557010c30f7840854f184dc520030021868a9650a962c30b4d5441c609122f626469420c2b45991852daddd4ae25065267d81263496fb62506927eb7485a63a61083456fd0f449bfbb777bd345125cc24c5102871b681037bc20c2862e3bd8420318e4f0601bb00d3c928c6572c5287291469c9b6a411454ec80c40e869842c30e55bc1082881c6011a28c8f94456859a3a50d5a4a99ba36565ab488f1222ec1de10efd58b81aa6286d05bce082a9812d41fc4481103859896944e88d5116f8f861bdbb5c444e9c78262a4f8e0ec0b2d8dc43869d70a23a5379c9e615ad038af3bec039a34a844ad9595492c19aa11010000003314000020140a8644229150381a11e6a4ee0114000c96a4446a4896c7a21c46511003410020c6104208000018620000c62090d20112f025231cd17cca3aec304d174d2ba2afe627f9d8814b87e87518220d6d71901109b4384a421c6dd529d4ef8ff81119a839b9aca92d6681ae4a99e27cc30ddd07838696aeb53aa9bea4bf0f8d4fe9071d29d2456351f677e05ed34af4ebd82507eee328443a6d0e32893bcabea6350d297b0e22acd2f0b424cd3d1ae0262310698083908548839b10624759d6694c14b2e320c23a0d4f0afaedd370cb041d74d5811074698811a8e018218e76b6a8001da77da3d10f32f201eda774d0912b0e7be390d6f14a8d49718f43adbb688cee44658731e4e0d6d1b5a35e47a5eb20718576a6a511edd3e2904ccc31d29af674799f83afba1ca1f46404451a10254450d0b078298b9286c5c9084a1ad1b2220e1a8f9b3149cd75a4b3a0b29dd8efb2042af4e7448f1fb650c56797e090805a59d24da1bc7db500c82c6f8066cefd445d982abf889973d132b8225ec80bf93aca3ebf9216a732ad837b0d57b8cdab092ea3512eb452702adeb14d3e92c25a59cbc3b15b79ed95534740a2d6c5cf0fd3f5c625c85650c26ac26321114250a02522a9ec188dc5d2c820077a7cdf816b0e7b3ba477bcdec1f53b0e294693510ee8a0371de7efa67deb42083eb43e241f738ce4a22d6b42443f8d8f48c78e6e72b4fe0e92e8b4cf51d861226d0e2281e3550eaecf31428c26a31cd0c14d87ee0efb3b1e4d07092bdad310b5eb28e4551a13d24e2d874410475d75945597f6456464251a22252b3b8a144f3b5354e00e68bfd3f896f4c1f9300707c84913f7697313436cda850f2e867ba205247d13dee4d9a6903db84e46f2a1fd2df3a0e3345cb4674946f6a7fd940e3a72d5b42efae7d8050efa1cd276b8ea586f0e1e8bc390ee34f0598a70a4f11921c70ef473a3010b32829fe6a37c8083ba769c769ff64bc9c80d1a6525371c490d66e1cb6c2fc835b18186fac2274773e190c43e9a2da57db08d8f7c98b2d21f8faf7a2b873601a79014a09d1599011c64bfa5f5218fe668ee1c44ead36c49316b937649b111c7a3e9b091abb4271177e778ddc1753ba62d46035969fe028303ef86b68941447fbaa1b36464a45dda9c2241c7eb71607d1c24251e192973bb865cdb2fe84df4ef5cef3cce4c41e75b36460602738d97c4ea3a85cd032db32f3c6249622d02f671709f5914db97fbd188ed2be30b39dd30d8127e19561accd796fd61d89da5956109e1c2049087a2be6e2fa7118da7c16162b35321e3098a8883017132ebbd3e123cc0368ac73c90189e3290e42cfd29268e0f321f81846fdc0f897ec5d270a209b6640939b3f29829e13a1a520a73d92289dd5c9f804fa085211a66da6e56956243931d6e3dab0415110815f4d7a354aaa4d9dfb7c530fc378df9cc1b6b3849514abbdc93e89a5467d6c59fdb837414718d4853da856b78c1178a6ee63a59ea7b7c0c9a8c650caeef34f3e9618608f5ecad291ff8b74e7f36fc5a9040c5df3fb0be17e1234f6d2dbe8aa49d4e7dce71ab2fbe9e87b82fe4c76b35f09d4cb9f560ba47d439bfe30446f0d0aa987fa5374b9b23c8d0e32d74b343ccc7be61fcea1816d0b823a5a2ae748501ba27df171f1c80d568a07bbd6110a7206c0bf8e9601e22ce61201d9d037405728561aa83e25214a69ea0d107b20920d2b16b1379c4ee6c69bc0bbf944f23809b8feb4efea5b755a18d8033398e0c6762aeec0561ba23a6df6eb84a98400abfb33809567b239b314b52cc72af8c139382a957b840c78c60e0f92ab7f3713ded39c9a0edd447d860deb07d036a21eab127b6bf3637b52961409d2746e768bd69e08028057ffa405f000e75e97ca4c61a9b68cbb756aee060f7357bb2aaaaaca20000b411603600bcdb3319c8ee4152da1944631297ab3ab918df0d62a4a5cdb7b1773539394026e68dca1e357135793241a12731918f537c6d98147011d2c3d53b9166220b9c98b87135cae02e17db9e04fbaa24e46c4d84a85b44f29a8ec2576bb5f73b2ffa80cd3e398156052c11ca6918e6d85cbad1d9d1d7d01bc3e9f18cd5fa3939bcb06586797614b34799eada711704da6c807061ba529a2d34d5e6caeeeb97f6d53ea8636704e0133dc180a0f41f8250905177923053ebcf1402ef683bdc33b2d7c609fa15b69e34679f4471534cbc1472d496ba964dcc9cc4450115453a5fae07fabff9224d41c6bebe5e13041f0d31723541166a69769de6f75370ddb30e9edcebcbb33c4b5086730304edcb22b557265350a3de5625a992706fa1811a491238b741a6f08b7ba653f8c9db7ff162cd9770d039efe099faa5e7e7afe600c8386cf38b663e9380d9c9008288c77f297ab612df9deb74d9a3e14caa0f44affb753f9b28e0836c24efc0792d34fbcc0092f2dcd6b10e003de3d2176bee9f94a481f811fac2da21c978e37f9e67189925cd4041db1bb4e0fc74d3c7a2e9347536b4c8d29c5cd5571e5e1aa7552d1eb5e00f35cbb300eeac3a40812200f554ce3d81b59c6d55e29c53b4bc23432af5c10fa053c8589ccea38483cbc59e98ade4ecb26000f5e30c09b80824b37a037886f3acdab5004c3b55e5f70643e20a06b6f2f844f9fa3405918f0e6e4ecf24c83a477858f64c0dde4fc9c011b3581ad75ae5f5700463f43844997e680e1386348ab6e2bfc68ae577ac988080c0b7c4d711f7b421d2e1cfc4d4f3b98164608098a37b3c965a0baa5a07d4b8810af1bea2edf9b7b08ac8e9a0bf5f5ec82175cf6943073a801c2eb51bdb0d9b82f82bebde1fc7d66d363ad91f3e5a70fbff4176812dc7808c990ce210cbae71ee166f8271263a2e8e3d7d43f6e349643fb91b010629412262160245124a426782b3ce17514ebc1b711dfa25893d66ef9579ebbacc157d2b671f7ab135ad92c8797bb9563a3d73f6daa671ff9c045f4fd9259dc82d8f929e63d4520dc2f0f8177787c64ddffe2e8feaf2727e4f28c233055ac469b1f10bc2d05b6887b3e29326e0ed31c8a5d4184f5b2330360ac18b424620c6dd9e66373e379e6a8701aa3d076fee29aff73cdcbe0ce0a54216fc397bab166b499cc81620c35bfe7249a0212ee05061da1f1cb9bba0f2376b4cd86441e87a8ff99c27c865225fa0748a3f42ea848a0c163c65a5c22229f230c196780a701d0a6485fca18e6642930ebbeb6bea7428710a9d7036428570773031bdfa8382e5dd56b825a6ce752687d256d739077ca0fd54819e3557da5f9b219def147fbd6841969898161be0c6dbe033c6fab206e27c08efd0302d68777b4de616adc9d50f4e7dc3fb43ca2182fb47607a6b461313f68fed5de0efcf288b53a71fc5f6977b257771398fb2d546fadc25959eb304b4d3aee6e7aef90f66453e1355b7635e52bb81d3ec5be56acc7357d2d8ad26439fc2cc430601b6fb470e2a8dc82e134c040ba1ae84b91576c0a6707d4cd9e42e7aa5ebd53380a8bcc47c808a270e54b88b9e9b9800d54489a42edc95edc06acd894aa11a8c0a6eb8aff01500538ac453356e1580f93d07f9a15cffd2a69b3f17224f8c77d47e92d9a564117c2574cbd08f73720116f40092bdb326087dede370456a7a137231716bce008a580bc3f687e2623f4ef0c11b4c1271ea831a2683a2af8d2d6fb23cbae533a33348c160f7dec8db61f3c0e6489795c970e4c548741558b40b532dde65f44681736a442a0f03d19034f0dd0125b1f8786dc4f1b144a71e0abdf04c5bd77c9a052d947032752280758965183e1a243c0b8f498c032a108950768cb0f95230dab3086fbdd9dad518b73acab452b5d0106273b4faf02cd43c5df9bf11ea2bbcf2ac9670d807c3eebbb0f73360e54ccbb269808b5051ca4993df434d768f88cb36bd3304f31f3b9677c264a6da17b55847cc9d0ebf18d9fe2a9aebe51867977f98f83d495f530457afc25a64e556317583b05228d67b7607717ac193ca92f0bed673d4f489a7118b4176d94b6564d35be28abda91e6fd4edfa9227146c830675e1f9c9641b451aa8857762b7b77499feb4c3a3692a20bd80d70102e0670afc174cf98554896a4b03ae5531e9334a71537f18364fa6f09375d9b3a428bbe4aa9444f9bffcd6219ab7c3247eed8f1dbc57fd5a813427a555b8905f193c91339352700958e9f244d9f92717bf9c12cba2f7f7344c725a8c820fd003cf2f4029910d8c20607fb5ef89cee87c64185da3694df063547021fe9ad7065a5238cb15cb5e92483a23dc3876b09a08c23ee995a2515e6dce56eccbb79567d127c97c98e87c052c2afc3326cac0c36f67dd07e6e2e1afa7df2a3fbe33903290e6dfb3e7af9cc5ffebf17542ad0189578566806a621815575f1fcaa79df4b8aa0f9ca6999e595f9e3d3726739dbfedc42085df84bbb8a9428201248d618f4103bdbe378853fdf98cad13f6cc84da980c218454177b78d17fe4a5967ce0812234298181f64a5f27d4c67042705b031caa5eaecb4cd933f4080bb0a81329fe20633b44375b971eb23d16df0670b67aa341973f49d77d0360c293badfc27a93b0a581e3ebe7f5003357379f922ab032f1abc40b13bce7117f3d7b7639e966793d369d84ce7e6fdf56e21270c9809141226ca614e827237eba3f6958aafeba242371f14cbcfeda4fcb7d9f1a25431d0f842052f79668436b563358c9fbe0e1afd6164930ab4f86d6eb804bc7f1e23addb9b961bbf81c2c8772cbb485f5e1d114a17315200db1d4812bd68071bf16918ccd43100e51a057530d0af1653c36bccb07ec3a84f75af8cc074e814ba8a918446ed460381532584add66c514c7313ecd20b1ca0131999e6364076da0daf20eb0b6a44f1d73fc6295826948dce730fb70e8a90efdd800a3991c286af051c34ad7f68def9d7599bdf3768230482912223cf858c55bfac7d1ceee28634fe15b93b7173e11dbab6df3dceccad7e6015ff3626f4c5de857d042395ff0b256a181f8b68cf5fc81089bb371e928054da8ea422d9d882291b17159a5243407296aea1c7ca3090ac5621ca69b623fc6d5b72b10bbec913a8d479fba9378a411acba5d61b3007bc32713b129009f62d8a8b1c1578a1f53ed91c7b72b3c98c492983b60c481133a1ce46760c473717f4d8736c9bb152661d1d2913ebaf757855f405962dad3fc2c8dcfee2c2420543ecb05d30f22baf984ad5c119e71634120e79d6c46b3e454e6f8f3ce1ecdffcd5eef54094c94284b7eff6a118ecd30c5382c9086dd56b018e10b3a3d230b28426f5b8d9c696a3d0b0638e01996c0be9c32a2de999d15e47c8f963ed7076717e713fba7a071e2b50c953772eb9ad10559c1d1e56fdd59f16074989b0a2843c9ec0e4b87035e1e8330c6b79698f9784f4ba013f96ad5de2e961a6cd651d740c84a2667d9bacc0a4e451d903e412631f43bb3c432a275c731b1f21a4da75e5a2ebfc245618f0912414bb40b55696ea80e6031bdd42176982f38de8bf64b05cf4055495af246adddc38638e4468849d569b9841570a76deed0ccf7960d6f254c87d1e62767d8da3c4c0520875a3ca52b84a23db139af6302a3a76ffbe365bb610ceb3f4b89f3165730aeb1f6a74e62b9e7cf10e5f07b0e184e31be417a49ca5bbe8fc4c2ba720902ac032de73e4c3d5869bebd6ebb980cb5941ca7486a8565f85a56cc6b2ff12c7fe8cbc58929c99460aa401fbc693b5af71547d193dfbd52e78d60abb28128070657a1433fa0d31039a610d9e66d1b90757ecede92ed5c324c65196146289340ee74382d08eb86764e20712dab2d17c022b0cdbbec10debc0f0e9f0285f4b1410c11756d6113cd269990ccbbd4216a9908501112525bffb8e6904975b5166ae9211d05340c0e1c75188b5e1ae53830d7c4a09f826e1112e594dd616456280e89275f00ecfb29c129ea8413b77db7dfbd226a8b2ebbc80f4d9446f0532bec693a20bb6243bd17a3d3bdf76faf10b9a4a368d4a1bd1d6cd9e3e9bea9be820aa2681f748687d35682332c419a873d257104474d04ff45cb350f9256c0b6fe64fe6728a2622985987cba8470d42e321ab64de3c73941df17606daf837af3bb6e174e0c6cb90ddd3bc744dc0151fe091e77d09551aca295028f069dcb6e210d3126148bed21392556ac1c5a96fde6c61c7eb4390417ce66ec56a79595cce0706ebe54245bbfdee4b439395c38479582ef696a112cc7aa6055f283f4c7b2254fc7e08dba8a8b68eaa6f209d76da541f85f122ed295de2b1893a574f12792666b2e01053af87210af24974faf63017d040c60f65f301f59251344bab2ad4e8f52a51a59684835275d96758207cae1d532978746f4db2a0d90c16bd57506de8dcb82e9d70aaf680b1607f069da73a53613c06f7daba304a984d624be4a124d12ca04bfa13bf1016e49de7e475bef8f9e34c90387e1f477bd7f87b28e58aed7c5051847c379f9fe7c7d1385824b2d85f952c41ae8594be6ff33542c5fcec0283c5b665842d4439ba238b3248b8d3c717e5a5392021fd56cb7fd6eb118115693090f32fb98f627e82d20ce6b87c3712c1d8b6b016709e02d09438a9876259fb3953b2eafe52b08142b130fa5057ea5499d64bc932622d2eb1927393ba4a032236823fce7b8c024919e1734800a3291e9fb52aa8f48677addedc086ef10c3ea547710b8f71bdc7e3936cad75279d5a9fc8ff28bb1b692172ed89008e82faabaf59ef0cf379e74f4468db3fd59c726baad5493cea32ff1167d45ca0a0eae7ba9a9cb58c1e046651d3471a325ae6f05d509dca3a3fc93c8981c758dc3da3110a3455eabb275a9f9791797e0860741cd2a167971e4e7c16cd8d39a3c42349406f936afa94d669ce0000ddbb5d57a0a51b0d8c2cba92ba16b7ec1ae6b96962774b2afdea4721f1e4536d13f2124a13e29917cc06b25745ba7542a5c758e01e02c5eb4e478cb27ad504476827559fbe74ced118e282bfe6718349004233a00d564648ca56dfa3f7e7afb6a425c64d5a5080f95b704f6bc56f2da67a1bde0c03aa49177d5e4451ff55ad165519ca518c83b09736747a7bcdf72759bd027d6c02409bce0e62a66738d24ecb8e195e097bce8a299bd3673d58d584b7cde0f5a89d8bd9072a9b0f2414747e5efa43aa843e2e3267e8fe0ce9573dd2b3b6520407cd508ee08b2f4e444cc496cf11ff4af2dbf9c05495fffa80963b15438f7d8c4f7f337e7241e38a960a858907f879e8d73b2bdff6ccba6377738f11271aa93413dd79bce3ce08a87b464fdb5e927034f9f76138cbfda1420b0886044ad97a5be1742acc25890ba2818dacf20dfea0ae2b6c96a176879ddc9c191848508884d2c8a900f294d519c9c67d3eac01dfdc9b460671736fa0dfad9347b9216ebd385750d860e0ca57798782d24a563f63104eaa0307224a4f7f4011d421703812c05a894c7c10140b88008c04b8bc91c3e3f291003091e8134a10987402c8d99330d11e05200b37c5035260903f63408c4945f41f8b85b2fee6382801146f9737f48054794d63ff890e221f36dd4fbc8f11e3dbe2894e13ebf3bbd38af07c5d878039281a0d7605094cfc53bfda4d85582fb15c3ce11d4b3b2b239eb70004ca99f7b7b273c1fbca84a85cf0c72db799ef56e20350a401272fc5b778912e65f9954f50b37ab38ece4fe2b4e5bfaba78345524d97d1ec809a0440582025a681b4607247b33b9e904b3b2402a0f409715674c110749e5314da4cb9f5a4ee8e820e5965df00d1957d7764a11ec8e5adad2b89f1efbab3e4f5efba388ae95670c897a10a23f9069a8c4e578ea118ae5b8b6ddeb6dc4e412a8b43c338532e1f703d336c08295224a4b7c2459ef0a10bcb187b0115f8febd85ba4abf5ccccea00aaac9e68956fd9fe0ce593c7602aed6f61dbb2ea96780f87603411f66ee13974b3ccfc2e3b502395df4be6bec829b0baaf35f66f53f2ea51987a7ed760b1866431926d9c8cf694aa6bf505330f3cbe773ec90c3ad86031c0238f01e75a125649b1513cf0b6be2d36698ae291ce57045bf0de0371a90628f98ab98b01943129f2775fb0b05b016e0cea20e7187bf497b6e4ab3e35eb7b56f144338488b1cde2adc46f856948542a350125b3bf42e33393657811c3d6fb7b271c34dde65bda8896514bcc7310116c4dcfb5315f689b87ad2078c39bc41487e8855df6cf09b42dd40707827d18afcc29c607ac2f573fb933a4e43b8d0a592ff20d63207bdd3aaf0ca9318ae6578b970915a452d4df05e119a788879aa813ab5a4734ef24d07b0deb0370cf5ba5f6bfec3ac9c4e2321319463c6fb76ed5e70486a86b26ae416e0ad356c0c1eaf56211be5e00118efe3a03a7b753c8a66f2f34dec8784c9d5ecc1759efe61455f8d7dc1a5a88dacabc735f203e157509f9984f1e259d2f6ba150198cf06aa99df89fde90faff8814437541f1c3422d48f962743386102c56bdfcf18f1e39675500beb8a2e2f181de95baeeac00bc74f945cfa6ffbf5b69fd8c8a7d9dbf90e1ff5d6f4a28be00c9fbc7894717523960b0284aad3b22d0c3f2971870d852b32cdfa51d5b1846c124d824ebfca3300383bf2e053a12e8a63b1001af4344f18535c2510858fe6d2db712098ace7b1ec697230992744f055757e2784dd1e9ab6b55bf2137979a1cb9654eeaf966a788d3cd8eeb9d0f695dd5f4aab5872a2c63d3ae2db0d948ba218893f29391ea99c60b16289d9648722fc5bad38bb236a67c8f32e6f757218b8f53eb40b8304d9b54650dcdd14d07746699bfd127c0d0df715b93b80b8658160ce7bd0802db9a0b0f511ce335d9d2cf10a912a084714c4394282a390ebd3bd7f329c08b0fe88de15798928bd400b77fd8a3604b34cbd7013f5f2bc04f951aa5a99884314405cc7b86d3c9c97b6487429776461d321970e572910ba81f7c7d2ce959e77be42979539a4a1708a40caeaec04bb5fa57d92193050debe2914364346fbbd0bf997066e3ee6a33cdc959068b8787cd8dc168f416a56b3393d1986546f55f74545cf96290357f4358b79f146e722034b14dfb32a4853961989492076b569cd71e177a6ba8963edb38a1c283a03fd0aa80f671d728dbfa35b77475cd59370cf802820433a366739610cf7f6b51f88cc9cdc399e56b8afbda0111625179b097bc963f0c2d353b5018320088d0f977d2b4420a29a4802c7ab70160ed1b9d325cec2e117c468b4abbe2499985612b3fa4af56000d73899b2e4ea35fd3cd59edcd0ed3437284fb85f188d437840e9d7fd138ed301390b21e097f5265d35d56751c482be650dda09c873904349b6ecc99aed4b56068fffd282d905521a66b5f3596ec7fb335c5da2799292a777f634650a0e37abea33df4d351c891696f882ee775f45c4ecf38d5b0c50a3ab1340eb3b3e6083c1316a118cdf79f8b200c457e48c3adf94412bbbabd4af89e88b50f1d555bfe69f12e65606526b6b48cc754e29de4c39c1e06a2972045e5f8d3081608cb89467d936610fc8d307a5b0ec3d04ad80b9b8c4ecc2d023ef2ee0925e36e6acb7a9177b558a3b800fc02d737043332348b9b6300b7f7900e8c6e43d49c6145dd3b8c2e61e49973f0679b62168b70ca6fd602af53bfad76a586aa7d8911f5231f4410e52d02e027995f46b9185dc039a2ba3c13148a5ddc01bf3fc23999d7192adb5fab1adb50dccd68f6482d3047461d4f946ea89743f36a5099b3b0bf7ec9828a37b4dae579f435747c21f7b94633fd7058453472ef80ca5b72e6230a6d132ab73703a7c464f5175538ecf94005979afdc218726558d86eb298ac4999bc00958ae29be35ff7b71903fb68907a8476cdc5b6a06cf9b180dbea925c0b3206593ff4cecba74afed4c270f8b1efda36f82986aedf13edcc3207492b92a0a1896f0a9a26d3372be6ae08d2762a5a2955ebef234b747be20201ab436025fd953eceec51fa1ec107ecd0468c3eb28445db598d8943a426bdcc821a7abbc8fc111a1e9f182cb4785a09330ee72a9c301f2b0ad96a313867fcc1234b4928411153f9a4aa2437bcc020f84a98930abce6ad554ed84ceccd0529d2b84eef63bdc50a28d0ee5788df460685c432e14f5b93026fe0d4e928bb75274ded636f60117d1819f29d646028aee3543f74af04bff946be69fa0bbad0a513a40c4b7b194f4b3e64583676f1b2c421e25946af9a4ec48a1b4c40106a7758577e1a929353ecfd44699f871b96ada12c384652ad9b319c9b3185146b44e149684f59f5a32424838463d435049eb04c571238eb7eab9418cea7ed086d667286405b175a41a480a1ad0586e3160c5fa1e39700a531ffb4e64dbbf79768966232a2b33cbc1198a09f5f75b41026a7562d747cfdb1c1d789bfebb66f09e61bb68d849cf32687be017945aedd9ac5b90c152baf84a7e87a454fed76f677bbb6949305dea35ba267b1deb0e74545792c9b10199038dd34b4bf2f78315def239c8174439f909fb066b28e5284fbef9c10063c9283a9ae85d0318466e109acd06bfe22c39a2dd486bdad6bbbe3a0072afd8f1d44c646a6ffebe26f175ad65be69ec255f87d03123a564a6097872d7c45a096dfcb1197408e5484444107d0cb7f0b691fe22caffb053de4b2afc7e01b77e4414ce2bd286b44d78cf0d9d5715e0d8fb7e58ea1329e0fa481398f87189206071af5ec54e5f604b99fc43272e28a2b4d0ff063157a84a49121e004fb4c952a3a0160ec0e46f7ad91d3bf189542e425251717041b9ee932a6a14df38a526407c06aec5b89d75db153a2ae575b0750a6e370992d4a547ec07e1348f0e55f7e7fc3b5748fe4d2374cc7dd856cdfe637e58a251233e5f4ebad279115fca9a59d9ba9f64335a3a326bbead8ca8c204ea60ee764270e05045828ce4ed001512ca982ced54c8b53677161cced4db004add00600f736dd64f9e2396def65b2ed4fe51476649e67e1f3c8ca625eef6d697c948b41f038d1352a7ac616187615eeab12e3a79064fb3fc1cf939e6a3bcc7445c7d2855f66fd1a307d00d9b93021698807b549b00760462dd4bfb08a05685e9ad6371d9e167436e7f4d182fb47a751fb4f284ec8044dc4d7043a5f058278515ba8043197ba5511566039db0d1abd0259c1a5370b5c500a5695f8136fb84105495d8200f64f1c946424a21b99c8d0c042b43c2b22b129f15cb96d073fc508a47517a366ae62d657bca5135921b11c1545c5f507299129788041d3082667ff9924768b23ee35cf02cec4431e7b6299158f6bae9f09a6e67a2f9f9e03ea6eb893c34410a7389c5a9184be4b3753a9828fb9c4a4d23d84491612ee8fdd9a36e3e8be967c35899dd6b2833c9beb70ccf4e30d23226c0a26ca0583811eab6cfee702bd28189b7b85527cdd48a4def95f39d0ba4c92420795e993e4f56468c7336362176692ca94df00ac2cd523f4dde735f615596f5e8c0cda37f731d9b2407b509afd58407bb4a03e7a101e19748f07c27fc41ec323a488c582cdc6482a9c4ad73b6982c8c3942d2ed450a4dbbfca89689605ec22a50cfd192a8f2f555840d02a4ca6d167381c8e6d184ced95d4c3f38fd1e6f6d7fb835f1590be8547930865acb9ef237f5ff9dfc27c76e20e3f6d87e7cc65d1f75e4d4fe8e0cc5f5ccb0e62021bec245d18a652478b516ec405275bf48edd854d1e2e3595f650e0084aa149d9f91b4955dca90030429b5988a9a41b39fdbdb8f883dd64112d97111888e81d683c09a950ab1ac4778bc90fc88956c7ab07409b0aebd5f980e762c6aa86b478de986a05ea4eb58f44934f165b5e419c946577b2e2d647f5bf0dbef8c456ccc53958d34aed34e1bd9a11a4e7e2256dd86327fa6f29cd590754420ea328b94a5d248359cc6c851e63aec1e21c7ffc28a172d82be6ead7d9256e23cf8a0d9a8bf31c7d02bf854c99a6fc07c1129bb81a37ae483331d95db167888dadbb27018fa9b144e6ec9d0f063a0f6d08d9455a6a3bb01b5d1387fea1f42ec97cd7144cbb0f570b2ee78852638f1f9b2143608a6f7927afe2bd7e6feeb22c0d0d135531176eb40f60d4015a2ba811af000d6c8595d409daa9100c5120e2e0b0281cf8627820204574492be191b1ad9db24dfa0449d4192c272789a2500b83c515bd2576f1f07aa5c1b916a78c6e8686bf8f555dbcbf3508905c08e3179d18fbb2ee6d52e6900056c0b52e2f864b544611470c6a81756ffefbeb7c9d35b7442c85116e7b883948ded276d81fabea9f4d54c86451be502a21d885a4a9156ff75020d83c78566ad9a0848c1e2656ee97038da58db9955842e60cda322a689915a6f47684d8c0a093f4c81f1bd044021c36f031a8d4e1c2e79dd4d57921f23aaff771ba9efb3f4397dda1fb15929a5d92fb9da30c935babc78d58f57fc117a8a3b5796ede2cab78e081a6ed319eca3a4a6b87e618463d437e7825c5a1ca8496c550e6863fbe4a093de72557246496908582d795861a777683c669c3b94505e3bf208a40f933cd96a60ead4eff8fc22501ed5cebe0ed3e91952bfd35678ff6007ebb5fef7183cefe3da8d8ba0ac26ef8c7c73133279671f47b38b2ed5ac6ba45bd16fddd5861324e498dbcc4f198a45ede1414683b233adae93cba355e75ed82ffd90b3b785075eb1aaa76689040b97b17b26830ca00b7c8745200b10abf4e1289b1c07b3b51aa5f03714cf0c3069502ca5404c5444fccafe365cee81b13f479e886299bbdd0b4b364db2f6e240f122708be9ec1209b85c4cecae61ecde190da835f795cd6296e3a624b29649d7c00ee181bb7fe126d89d984c5963c3bbbd60676da50be5db2b85b2b913eac8b1c0689b02b1cdd4dc54ec9fcca0c1cfe4621e366b5512f836ecb750fb6c782a9addf083334759371aa5e9355bfb601235791be596eaf22cfa848db2803068b12635d3c6225b944b209207b4cf398ed1059130065fdc29eb504d0e293110a11f70eddc8a3a28e6ad6184889745282237b011b9bb40ca18cf7b5ecb02e7c2c69e6d44fcf0f4b62ca353270a838b7155b42f257ce85c212250589aac320621c9771863f50c5a6cf5be24647f8fd23ed0a4c5dcc25d65903a8dad0920d594ff48f9a202f7329be4f518092c121985079f42900af6494617476c09437d57440458126b1da94d78e1c036f952987b01403879e444a2354ccc526c193bbe11461ac7c83a4c9e5fd11a8e17460f46baaba67a69e58eba555d6b43229e36b1506adc0f3288e72eee780bccd5996ca1bbed070614d6571797bd8dee835e53d0dd55465a95a536bd7673e1d0f662af232622ffecc9b8fefa4439c9b6c54c9c0c24749ba1b017bc15b54b71f37291c7264813e368faf07af42dc0bd9375a03cfc8d73545623ae3299b823d4cbcf52be973baf62768a6ea1f271c09d44a6ec94d6e196072b38fac80f9d5fcde1efb08b6a6a694dfac4d0691dce3a428f9cbd21b6759228b3cdebdb9810d2d7766d44218ca53bfb1e3a36cc09dae3ccd9ccb815f1aeaee22e1fa5dec0942ac0c3a0d9c28394c07c62744eb9722ee89b2513315fa79491052adb1414ad13661abcd71af0aaf558cabc70873e7127b041dc6edc9d82631b5545851a3ccff124f359c15512febb237f46f949b2bf82b3f0af316ac26abaa5fa07abeee269cc05450c9a2575b8e2df0a3f0799cb935ed4f38cbe7ea1ef9eae351bc7ea9a172c9432c45c24ad554808b52efa897a207860229908c8730964240c6c8b195699786565eaef7e9975e53320e330e6927555bf0ca61d54a51990912e0d817a58989e03417ac967d7e6bf958d6ff94b5612ffc3eded6d5e1f2d2e7a2e13144101c6ee5b6208e810f047e766e3beef0d18c1c7ed8ef49695814b575527409c27eac8f3bd43e991d1060baa30f3157ffea00d2e58dee08cfceec268b52f0c08e39b975445530cddd2f2ad34e940ac4f494923c8e1ffa54dcc8df8987c2bedabc92ecfbe0e31c8659c0ccdd09cf6779e9bf290e6b048972b945c89c6c57ee6673289ab39a3939b68751c063c922ed378f6d7c3e7986e584b7f32ccf34d3e26f8b471c615715eae8a6655cb174c446913be1d87b83bb6ad203c5308cb66d22e619bf24fa74ac2353fc2225edebc54ce54f55212cb71f511492a1b31621fd9efe6ca9e2ea95c2d103249534f892b5ea91a18de0bd9fbc563e7e12263719eaf9d734ac1134302c050aa5c56004081b8244f8996788a790b2b3ba7579bd5a913e0569ed0371ea0ae897e0a608e4def86854c750ec1577ac6a38787b079f5adcf23271e98520f9e144060adde7ebf732cd2fe06af8f7cf14180bc80492ffc982a96c84da9193352aa475724cbe5d24787582d5d2e22588ad8d1e7f6d58b29ca2fdab9e39a8683ffa0ef188b9ace1fecbfb01207164442353eb6bd02ba43a0535d9fe64f42f7b0206240d76fe37557b910ee0f651d3961601d2119b4ac0941244a8bafdc5f18ef510a0bb244be532038fc6b3adbdae578b767941d31c9e18c5caf344e348ed6fcdd0cad169a50f5bba5b613d7b55fcef699623794814c8246f7c77f21e418edd75dd7d273b718bb8960b1993b18a7c782894ee44599c047233bafd48b87294cdc28ec889519dc55199f5a8cdba289cc5a89f85a89d751d9d3317c5ad73e39f8df6d89c9e724ebec9f54655f7f4fc80d28ad615d32202616981688d65eff59d7fb989de139b9a06045ceb5e52be773c098e361446e18118383c67fefec0565f941a973ad1c4d249b6d1173a2c93594372ec33a44e11b1a94e72f19bb56c35443e032ad055b3702a40e3eb995f0325a79e9b7bb816b0da7fb77fb1cf16f6b1a2676f85bef454588df0618029774fbb78c3a73ab5c3d300b6b6fd1aa9bcf9aa1650547fe8dc7c4137e2171366c455617bef9af20de25c264d66c6ffbbabd505418c114ca9717de3694a3eaa6a6192dc02b165fe4376ed6bcb89aaeb5d895843e9754a08aba315ae48a4891b2d4fd44798a63a79ce5a7d97f0675307e4f49b88e14fc6ab7314694c486eb544ee2a098e7a4bfb6f48f48fbdc057700f97918439541b0ff07702cc5315ffd83b312451236c3bf30f590eaa34c2e2ffa5944a923cbddd26d18664f840131382330a45effbce1bcce53c34f5cf11658a8ee951dc92013cb35f110be3cbfe869ad331febc79058587f3531f7293bed1538cab1e10653f2e9c9e40398ed302d22db0d49991698669cce7360fcf5ca5ce3cef00c994b95d45d97d9222f1eba1457924253df0dd8973a56b234ed5c5f95d28907f9793062980bd5e11b3dbf1357c388b5b2f653e3f5efc01c1dc8bcb9479f1649f0645cc62ca70df6b3006b617f33b77b20f74086312d8a644182a2885fcbe4bbb9983ccd3712c2740252799cdd0fa19d7ba9ac71e61f8e6ea16cffd4b088a5008a9d9809b24436a724a3ad32ade98c8475b674be355c17d191a5a389e331238117bd48e4b281e1c4333d520f687335074fedf218216315aa80485724c542c315bb450c5f89cc0d5e238a96d44d49a3683875c535bbe27550dded8209b866964cd83a2126a6018868109da909060a5eb34fa7e68596878af9a2284fc5c187713683cca8a664d7be0729f469bba9f216b82c69bf89d0a86245e6525deef9177a3dea919df1994a3c68c5ac6f234650ea79ae89f949a4eff2602a3fbc1695823df60a8bd449e58b33372d6009a4e5533b097eb98a8bf832430bf912c0109c20ae2c80d22ef5b3492a03dfa508bd02e364f22919e93a4e679e953f662e156883147255384dc628ed6190d110bca3ee6ff43b9315f3df503697ce195a986d9417450eee553ae3c3ec70a368c5964c79ba281b65e37c3bfd1f485eead1f47de46819060e57a8cfe4586232418acd42b855e3444c95b06134bb87002e41d5c106bd29c1882ecfe52a94689218413e410092cdc6fa725c7194adfaa2c5eb61127c9e05944d9e309c8bbd8267a0b2e811be1d2b1af914ec128cb08a2aa07f5b25777238ff89aaf00f1b13ff3232c24c2dfcd1577e264eb6bb911f81e4a32250d9d6c14c71e28c31ec20b75c58e5a63151b8a4213621bb94a6938bbd55423e277b8b9b35a5ebc3939b73aa7df57c02def32bb590e615bfa144103ed78ef54f215a667a4d8800c0e2a7b11acb2a63e3f2c088a468238dd70e007733b61bf9ed3139368d39afd0e6006422f73749bc60e3318e0913043dd115462a478b7e5febaad7d5328cfb941529f0f5d9de462f4f5542a76e39b40efc605ce8612b5cb57a621025db5a44585b73e2564cdaa6b72ce02b684118351e3767bf9bf03612b2cc5a3a54d3483b8f184b081e48144370761c196e735f7ef0a5943fc32fbb52fafaad4a55fda54a71c1175492abaaa32479cd7ab1f1044b05b79f5e8d597209877953dc35db4849383bcbf1646ec0384f78eae1917bfaa10c61ef6f1073b6e858d1f0a44dc7235b6c3c61004e7939f1fc3135861e1386838b2557f9bde39e7964016dc89069a9594f3e959a4de6e6d202c25a923394f96cc2a0597b4d1167cfa9609597eb9cd3717c56f850cabf1d370322a2088763cff3a51a82d66f9d05788f2df9fbf2d41d3aa3f1cb6f073602bdd8c80e7b53a7294dd27b583fdfdf30d40b289f3bc5866cbb4e05cb20f5a71f1da1ec77fc435383c2098b4e32d865fd774ef81a57a5ee997672df4ab825a15916a4a5a7580e7b871d54b1c1c243a8a536dcbf90b8fd66a297d208f01fd757315ea7777e56cff263a4f79a8de73b0d708f92ba0e9cae5ecfc07321ba1f5920161e0ba2f2456eeda2b496fe7ab29e28a19819bb39394d183136195ecbb93550b74c3614f6c8b344a9ae74853c189d31a340886eef9ad7b472c423238ca6e93f81a7e152da2a92e0068154c1f00da8b71524002dc751a2dd523e5cfef51f58f390c4ba58ae1d7176c88c9d31bf650369da5c183f92f00dd3371844fc060a050d79357ee3f127a195772c6776d116790d67070609b333a41a74d9de72a754896eeaea8565484b994aceb47113fe74c6c6942a3dab3b6374688fe50c0ad2d3ef37ca41d774301780c6cbe458889488743102f28fa4b16088cc67814c6c6c573156a123be172138498f8595da004b9fbc6bdffb153da25e9317a977ec44e9fd9760677759dc5582593374be299d4176f0185caafb866d32bd40a888c4ca4d97288bf9e9e5b93542fc66d99229e405e4f7b9213c201f44feb4e564e0b5d0e724bf0007af94249ee32657059a41523c586920817d19f636dfc926025d642aacfec3de4c317f583e4d65ad11185c54dff32dbae0970761ab5d45de1da1455765fe15f65c02e78e7597c392449189f23b9b24d9dc39a033e0aa2b2f276f9d1e761f6d2a1159d10053bb32475f2f3993d7bcde65e7ddf3c60803cdf2aeec9660776ed493056090bae94a95477c902a5f381c0cccea55d7222453a25a570ba9a609ebc217a373508a3f162c134aad15c880f0abc4dbc1edd5e966f9f73aa34c16dc388e182885130483a61c9504dce22321e876096ff76544de37e2aed3ee32307347e5853ec1869398ce4cbd087a991146eb638387a3168c7cf20b4fdd20492855c7f7a3b19c86de60bf108e40ca755d8a2b16fc22101a63edba7f755090cdec8c7e434438201651c09ddfb2f5d7833d4bbc394262fab4290eaa295e2acbd7204e4bedf8cee3f4fe9c74493e626925dec15be876d5b79a86aa96070ea7e579434515d78f034188692f6d08c658eb3ab6f5065cd4e25e014da6fe5feba05a07d6304983da72bf07c12d93907e45272bb034326c6aa0cdf12150b0d0449d5009098165c1ec185c4698c28a65094c74054fcd773f7055434272ec7c472ebba6302ed36c992b26dc7476f6017b21c58ced29eef1f6b67b7b13d581ad4bf6f5878eeffbc9edf9c9f1df84a168a1ef8c9d73c5810910e3c6c3931610622e4306b93f584d7ee734efd06a8bdacaeddca4cdae0f99d65f1ac533931f98062d2da5dfadb7aba8e5a2c721e10104d84777f2db1227dc415adcecfbc398e0dc1c0e3971db26f6cf3b71bb428d44f1d138247ffb929a59b9d4cbdc3d0fa2dfa8033f19b39f1acea9e7bc93235f5d3a8fdacb45a69deee8385888213f0d270e4d9cc339cb7f053cc0e593c0a8af6eff9297d13e8f3bf94a228d6d5618813481e1d0d2dc74a2d0e792e6d1523ab0dda58d090925f7532025ac37381475d49977c7a7b97abd5ab36eeda75c5ef66521e45225d01d8ec246448b96c7b63a23412f58f3e31f52f4cf503fb57ba7dc86388e654db87d75dfd03a63cef9883d371028b3a4f2d4111c4a9e3f0b90db9c283cc5aa7992a602bcd677b9f2fc8ca6657d92a61f87f22c50d937c85cece46b433f42f9b593ad16788fcf7b9ee7b220abdbcfe083a2e03ca969a2b1c762f4f3b85f865b3ec93376e421338acae8d0b9df940f1e65407b57b9e669d19b17f2199890a6af3f9581214e133e503dc9fc1e87e2d6716ce312facdb7dd0c1550afd974ef7fbb865b5872faa704dc72740fa9e929d0068359a45b78b3a1910b7d4604e9a8a79795b62aac1d7789dfdc1f7406f6d61bf311dd8729f4a09ca8e0cbbf68dcec65a81e36f9348f5ba417786a6d8cf97c442f5fe56965cc442944e8fa644550ec7ac9752585869df21017df39b2e8590a1e842f92a0013e0c619c4306c0fd68699964f66751c19ef17cbbacad6caeed6f7e568b55e42c9150e997648db8af31cc9f46bd05c17890e993b4ce9e372de63bed3a9df18269391ddde81d4a5718a07bb510244a2b286c07df865a63c8a8dfb14206388ccb30a8e2825e8c5f2a2b6c934993fd3c3fe1327d9330404980908b3c22bff72b6c610642de5dfb53b33449462d12a7e6e3531e962dd5aef428cdd9ee8785990d0df641d86c840afb81e78348129e0bbb6c8326a0882284bc0370aa031afebec41f70d6085140940bda09bfa0def992b7d39e711a3266e3a71fd3a3253c5a439271c53e7095d2cba8e489e49437191442ec5caa8b64c2b0e1ba001376e37614f30a4c963b34e19b45f7dfd47e26451814d456469b11b132e0394e38613a74dbd4960a186fded771ba449e1795ef2a0b687fda50b1043e9b303403bafbbfe2fd70a792d4239c6240add797fd8fb36e2d628a86f6aabae9662b3758bd6e4ede97f1faf2495b67d9e464ad637277fcaa6d5f25e12a4a4f0260ebb8425ff17c7f5af7999a9df1607b003a01a64c656823bacc4626865d578be76d83da2fcf2b49f0c07850f1abdafc00dee54e55c7e4acb2d3215c2cca6d2d82dc04b1f8c69120f988ee1a5501dae9bb9dcaa558dbbb0a6aa724f0dc98c80cb8a97c7ca7366067ecdc51cb45787ff01a6851e76994d7b99a6005b823284f041621acc3a2b48739d555f9759430b9616003ec63cdee19499ed19705df9818c7f4d6a7731a3317ef707655544445773fac11bf7f4b80041b02c1d8fd08d41eeaff5e8a86da6a0b8198e82c71c537e0cb8ee0d7a7f4ad8735200df348bc5eddde8e7aec1805863493d4e4aa0bc542efbc38837ea55d14be82bb248c90e58c6435c720a308eb7b95b6a6b64f585eaeb5854ab63be6c69c94f3355722e20fb6fe255938c9674ae7591c40e2cf9d5cd07c84f46340108e26ccea0be11d192054d55e053929edfff88bba593bb09b6e0186fe8b43558e86714a4f5f9a1b295de67ae4be84255c60b479ba4ba3d6a6cf8972b6b190a59c53a79090a3215ae129aad656ccee99b52fa827b003d7fb910c3e43d5eafe343338d557c6b0fe029b97c325171b041b2061e34f6cc35b9c4cacc1861d3449404188b06e1449a5052ae7aa7bf7a6b864008a828b88bb04f63b4624390ea100f63e8c46b5db92672654075f2fc2dc6bf8a319f90fff51b5c0ef19d7f9e00b2251fdd6db342f7a8577a699f4d6d54f92ef308562eb04b8cdc7c69ec4f663ae7fab8b2b40ae7c60219b952f36c50cd94aa4739c9aceaf27e98660d6494e601763560d014e7276f73b764d2c672d581c2a2e850bff9443b0dbcebe76203e5eb99a8c97793444c0103b6873b4cd835c9076667014eaeecb9dd8b3f1d0dea86932b8815b3f4d66ae9997d5733791c274d1790ee3dc495360591190afead67aff0c5b927c6c939597419f7afcdad576d20d794ca4b3c73f6a0fe263844d878107a116239c4f95c2b4070820ed36a5105d120b15138d2dd107b399651a4bfd4046891ca18d122506dacb83a3d8ce58118472a3dd5bdccb38756c3e53e816fe3ec42f1b67eb58e24e15426380c98ec8d1b3dafc3386551296a7176c48d07fa046059951b7f058b2b862894315a3c450981cab87c26b930983f678f6047047c46e0151ccc1464557e18b8f8c8facbf8f8e7982650981010bb4901f1c9c0e61ccc9b10eb9321d248143f7dc487d9703735ab4805df31e95cd878c67da8b1eb062be001543715aa4d3c3b2ba6cab6e4cde4e309e038d9c3df278c1e4fee86c966341b35ae1663d029a10ac62c06b0699e4e273e891fb4b4eb41f4635a8ecfd9bb2d78445e5ab42620bcdd01391b73078b1a7d38b8bd8090ef39ac764b04291bfe30365992ae3089ffd9194a703208b40399037c12f1f68bed3f9bc2a135f1e377e670e69c8b5caf30fb054df086b77a635502ab46444d57a4014449206c22a284dfa75fa1cf5349aa1bbe392f3f808ba1f402ef10ff2683b62782f400e72e41d10ae2a0413a7aaa95f5bb903b527e48a86cb6d267114003549032eb296ad2bb8ba1fdf27c3df8b9b08a515880ad65f8a835713ce5cb0c2be0e0884a069e05fe9951516224669a9fcd364e63b1a91af5ecfdd80285ba0e590ba83a21af4e074e32de33e43661773e26c0ab233d4a1aeab73882dbc354d9d379fccf63f80fd848bed6be0c1724f214d28cd2eb283f600c0f7a5cb85c17ce33b214d9f482b3608cbe9d09fff2e3559991955299ec769445d8a41d691b908f28fc286d503e6962af48adf59f08a8f1e35df8b1ced3d11eca46c1c4b0913ee422dfed09e801721151811fb17d428bbf445ed31cb455d4176f1a223b6a4272709a6e822c09c977564e6c1fa54c836c9b2b2a4c3f194d63a749b567814ef741c795b851b60f6d1a1c87a753150141a6237bcd7e0a31865986c640f57046081aaa4855228beeb61dbb8cb7535433dcdab9041c76112ad98f48211f7b061051172732385e0017ec332b7e4407d3a7c29652592b361a7f4b18502ec7b88fcccf483b3f91d6023b079ba46ee7406a2de710ad4d242b577e118c16626cff8434a4b58915ca50415a4b37b24d73fed1da1cac72d03c5a9b8429744743fa699bdfd1da7512e11e06e4365a534c9843e6abd11aa4b4f217bc9ad1daac55448d458dd988ae3e268f395ac3d2502153ed23e511caf7851504096c34f39fd6ee679933eb0b8b2b95111d4bb446c90c5173f3980a750a8f150cea03ca1b78db358f217473b1f26cfc2f4787d6a096a8326530c1eb686a6a3db6469ae82e0b1b5a2bb044f25becb8ca36ad6d605705ff8aa26a57ab50fe94bbf4d6b0143ea149085cc40625c90f156b09e24a0fb4e6d92509c7144b219f35beddc58908c149d01a79a5464c979f0e0cad15c45a6c63614e165a4b61897e2afd23912631165a238e22635600e039e39d5ba22acb58e4a3b58e869727db9e179171dae4f49622610f19aa426b126ceb489fc8da70f89b13b6b28e73f339047c19dfb953cedefaff081427b4a672bb4da6d8e36cb36ee786fb03aa6a021b6f1b5a5bf8c283519b8bd3a854a2008306686d663e05ca365ca9e21cab37df0aedadc69b34252d005fce4ae0b3666ed44cabc9934ecf4d5c19cf5ae35e69aa85ae542d5508b92caeaff0df56a7e6d725a88267cddb9c673feaadf1ae7793aaf2152166f4aca46731c1f4b91814010fde79d65a185261f5ac0d6d91ffd1b33686b8496c928f676d5fb3ceab724977ecc893d0035a94f40db06fd4ed74ed5a3b1f67993a3139f84f269f85c7516f18aa2c9c51153350f481dc893c024e8e440babc9e7d05a7931668a2e06bc5498ad68c51b30bf3a4ed562520be4799fdd1b6003637a18777b04f72d510fdc5afd2107096672fcc8de0f14a4221f26a3804b17ba0fbc65b937169b37cad5ed8ed3013c1692a73dd26a2078c26d51a915579a96428d0b457a4229c3f5c14194c59822a469d85ee81b37935f6842d945bc8a3baa086e60ccdb08118339273bd25868757f71d47d901cce6495f62a430d6f4f198b9d01e0d2345f284c495318473b3c0314589ef1955691502ea2210b1d1151c92d73d9826c26922d3da465c52614ed4566827aaec164e266ebbfa33f0af55644f54b9bc76bebac3a1c209eabb691dfa58345f2490b0330aeeb3e294b8fd36cb476d39b0e7e9a18d0f86c54a232cd5b98b12fb99f73b319a6582cd97a542df95aa8e8363f31b2647591ddfed90c8b44b264530ea93a9cf64f2ae8bc4a7a330c475625c642112392489b60da1ed7f4826124ff9273a5dd5bb2b6e943560d5530b41898faf2baf1d37475854d90e14920aac08b0db0f14002cb8ad5c60627775a50b189204f92354d292c117e43086a36587e36877ab5e76a2bcd2f5f58ad42731c5aac4e9305128bba8f2e43b36a8f5cf4095a81a91f42fd6e6cbb2842b863cd480b658f4e1120846bb1e3578433acf270b02e0630d4af50cbdf1b4c216b84bd3e37718202e60eb0422596c8815c42f4742be11bc77a0baf991db9691b8a6bece9ac107b8267a26c872e19348e322be375f70e577757e8bd1dac629fc8e91e9d05b086415b1982fe6f58c3878a9c18ca8f88543d4151c132ed2df57e2b6746c70e89e3102775cd99e5e804ef7924ba9b0f0995292c2667cb89d72b069b1a18d92f9dfbe5481bc9245053efd31fd1f37508dae36d6f7cb113fba55962fb451af4b4cefccea985ebae40a40295bf54e018daf5a9e2a687601cad5aa578bc90c9c1b04ae877ebe84f56f78f818f4153bc86b2a15ff664975ec4c4aef73ba9c79fe9a3ce69f065867c4d25063dd754d46cdb620bf0e1dbfa88ebaf59bf2a2760fab0a918927cd061ec761bbf312ec132aa2e323b19c336d49b70f563a21ef4bc4da46cf2442ea4cdd59457f167a75232aef08b61dba0a1740ee18b8d17b637019ad7b110a1c8c7c491cd5e9709aa99b32bdb83d30888040615974c7a3865e4a2296da316cfb0278f6e015a7b73bf04b0ce43313fb70afbd9f8ec28d24c169acda6e4040db6eb85706b8e9eff73d8eefa9a68a33c276772aea99729bfeb904927f63e75d04adc9a41e4d658e91b04461a86a7ef58722ed54dfa1378fcedec08f60a136b1845a39a258fb732e0cec8c3cd1cc19d051b4ea6af2e4cce1530be1cafe2ef738deb4d6e1cc24491c2786c2ad76e8d6349f36e1eb8c9c7a705ddfe28cec1fd0a063d92ed2bd3fc8091017b5d061eb7c9bf7206db04c7aee77bb6bc3043a4d6b7c08de129a204896c314c4b9cf08027bbcb54e77b70e850f6da1796320645d6bf4844809ca56ccb489027214f0829579f5031452b669f2a4d99b822d450787022d313c2d0f379e4f995856677703390aef2a4865a757cd20cd74785c4f5197c19c9d11cadbfc6601070f59cdd9d6048bbfeeee0cddc73d9759468e0f14ce6b8acfb0b19ca390a362d012f3998a97bd582ce77d8f5635620196b12c07332918cf219f5189e278849a31c83bf56c0c97f893f608e211c13211c10601bc428cb91b0d608228117dc25513a420302864c143bc43d9c66d1d039fc0ef7845b2d41dbc23df3c16c91ba3cb827b05e13f6c20c9dbd316366a40ffd51b06668641181316b6ecff61c782784fecdfbd49f5e96107fb9f1d5b9aa25eaeef0d71a35fe96a9891813baa5f9bb6e180f1152b20cbbc418879b550a90583ef138496f5636c3d06c3065254c21178766ebfd665512917e6a48d21d4a104fdc198d5aea7bba60bf2a387d12731770ad3bd600b4e8d7081426d7f5ae6a59c05388301e5567fb1bdff1d6b2fe793d3840a2464171369a8c618a32138e4b585b2680eadfdd16b7498d914e50ea3a48380b0dbde00849683af14f220a410f991bc3314d4224db9e7aee16cff75b9f10d816113553e6d5aa754923e83bcc24a8f809584c00963239ffa63230887774cb1ae38a00c907801670dbbf73bea337b8a409bb885dc8c190778afd4715c5e696456e1cf084511a82275d1f0235c0d83bb6d32a3da992c62574213f6aae394917023c6e34bd1889193cc2ffaef1d309d1e1e3c6034206da7fe0adfaf752238cba2c21e6a94f401f05dd646fe059f2e11d748da9b27faefff1ccaf5c1e604960b66f68774b64370a2af69e6257172150efa9e16925b8a14b5736849cdaaed1c5325831108c302f8f2eea5bf5bc10746144bdaa6d284e5dfc1d9a892665b4b708d9a8491878092c79088a72a8642e4e1cfb2ed978660ac68730950cdb4e5de1821750d058005a9d37c6e3fe9f286b569d89391250a857eb3efef7156611bb9764803d44bfd4d505bc399d44953e2ff5efbbaf629532eae8b822a930f14238619cc6dc292f9aca6c408d17153afd142e6e46e9267fd1bf1656ad1bd10ff30931c38d94ecdcaa9d8fdcb9a3e01248e341bbb60473d24deedc485a6efe5934596bb45ac9194ab00bf60cc4c3ca088c88a1e53120f05cc04d207d284f1bcbdf5c3927c162ebcd31add7d295e68d412051c722f98bc57b7e06af86dc28b5c4fd80901e5c08029a934d5a58300edd4e07487fb045d04d939ba6033c200b461718099aa4d6a342f10970c10b414916602da85208b55c4cea64412ed3007510a09bd40353f2de4f90286becacb8bc50ce06fe469b88580f53ee57b7bddbda967b6f29a50cbf0532059c0546463cae0f239bb225c51045e4ecdc9f1ec51d398a48355c1a612e8e56710a868a15ae4e520b42c5209f12491cf74512e6c791220dbca20e1f4b37770acd060dbe197554c53616ee958a38221f20d7aa4807ac48a6580449519eebf503c51b912fadd83756245ade5811f55ab87e4c45bb245e90fb83484491866866abaf889e1288bb07579cb1566c51f6e5e566b540acb7054a8d29dd24a4228ed0de8f6b37a453541b0a31a4cf0dda2b420511d143449b0b341fb122dbd2e571e51a91a25312fb906e088df8293e09e9b83142215c65df9e511062921e666d25d09ac45caea58fab2293149992a804c94fa8c8f5538c4ba1e31e4911c215d2471cb20717a418d6c3441b0f5ab18798fbb4acba2abe49b933943648452721b39f1828745c351421dc157d327b45a52045a01e4d6d6e08341749ac28b62c5a5d6d49c9286f20b948848a7e8a5d2774dca31321f8fa8a7b6e8e20ee4e0fa291b6e2126d895890a50b73e5e249157994c52c2418427d3f7f2674dc33132188f421d9d36ad3203d6dda03c82d2fadacac2804b6b6e55255b5b928ca5076243e734f0425f5bcd33768a8ef37f7defbe1101006a46603047a45a440553c1c084a070562aa398186764c209e9d0d34b3f3c3b7f343c7639a30fc23908e8e5459f1b2d1986304fb63a6b3fe78e5a83f38c1136df1ab755b684f3a1f361ed4874ce7f4c1ea3159b43e43383e3c3b3d486886c33fb21dbf3c6f47aa9cb160ef4f8e1fb31faca7f767e8fdd9797f60f27ce85e1f36950c7882157cf25132d5d767a8e7d787c7070649cf5b48e721477be06c7a6eec983d3f300b0b2f3a656cfeb889ce39e729cb8ab241990d1ebf8e6c8b373c45da3c1ebcb61dbe8e1bcfcba3d691473c156b2a2e20ba123cd9a74dc1bf76de53b08bdf9e1b1dbf3d70c59e2e8ef5d4916952c76f0f10eed9e96ac76f4f4ccfbf8ac06c08c85f922d6b66a9c786161990b9d7666dc6bc31418da01dbf3a6a48e63acc39e79cf3efe823eed84dd162bdd2911bec8ea257f6f0c47a9ba7c975caba6c1378a6ac8b46d5a0caf1d627116802c2af0e57df6c09191ff3677cc41f64f7abeafeedb2e0a0e201e660d47aeda6310495a13e6615e3abd384225521b268edd6b467925c6b1ab96c2db0e357c744776bb4c18e5f1d111d694ce9f8cdd1cba1ebc8e1ded339cd38d5e73651b03ea220d7de66774d3936eeb0b0f02fb3ce794c1330c605cad1f0794c4dcc08748fc50db287c1aef897db8e5f9cb3217089137683b3a4c1c1b239e9f8c5519eb51dd0bdcd8da63c4d795412f148cb3b7e7188da76f8c38e5f1c9a7ea643c529ed062dca90735ec4da1c3aec1bbd9fd6668a737e9a5bb7edf06fe03af2f8f4e7b6a4ce98b386131c3ee75d3fc00e2650eda4bc986cd18edf1b17473d284fcf79737363de84a0d94a6a8cd8bc367a33dc681a755e9ba9fe1dbf3636fa858e5f9bad8e54396369549d9242fac04fddd44df706dca2827e17dc8f1b003ffdd48d41fac07f79007ea3916f60346ed0f36e91e89f6b9699817e39f526a1e69cb9e11787afeb3727a96b15f8df929c57a062adc200eec5b193e992d97a65b0360080102c461ae30c96c391139b734bb209a1f7f2445457038f2808afce04281023945b71098815a739a52941ac281ea018fb81622c2e39c3337091b1e45a2493a9e69224a7e0924b923a8a72122ca42fcf2f093703a3dd14f14a96487270c09b0ca1e8e783a25cb34cc210b1c06a4afc4657231be9ad9a371fa5538a3b29ada4a48d9e11a7165a475a74489358fec36f36b14cf64812a0c826b922d952d4972631ca71f11424e5e63502241d5f345d772a5eaa8ea2794c5ec901140d8bf016a6b34b6a252f1469261bc90e8ae2c8924761c9cc46220986d97efc8dd0599156a44a6be9450a2f6d86998e15d9100c0e5448d3ce4092af1e73c92caeb197177a5e7535667d256a207514c563c26dd9cc0cd729a0082cd995744a8e30405156d267a785d850674292c444a09268918b23c097a7197743b6ce60fe72e02813c283c65f18179e8c137ad704824e8e0efb21a08f1370d3fd26e409e82308d628d6ee3fb18937c6287973606161312e5be4ca87e6e38ddbae47a858bf2da83a7e5b30bd517eaf8ba1b7859fdddbc2ed6d11a63fa778d0dd7c164a807cc1dd05fa38a762ad5de46abafc83a9d3a9b37ef2fcd4e2770aae033fb739841564dddf289e7eae67366a3dd2f4c08d626dfa48e0f9ead9e296b3d5e999ae40e2d9db13bc92b2c0cfac4b0ad04d53feea099cf30d9357c037fa26ce5b9360146bcdcf67c6196bc62de38c15f4aaba5a055df5116f41c084fc6a0b24e2de616f30815027a07854b88e5cc1787ccd7a08baab3e6e2356bbdd552525b69c8832345ee50f4cbe910788800979d5ec04703f3f3dd3471f7866530bf9bf2bc63a72359fe4baf9ad39ec66faa8cba9b316eedc79ba9ebc4cd52bdb04fe07fed2734e53e4f9e17441ac7d7f0ff575c7af4d930d04ee0dcc664a7ce99c68aedd74d537e2165be5d63815afe907d5340b5f15be4a0c0a892eb857c0345fe80adf7ca12b140a858f0a1f7da19beae3bf74f581cf1283df61bffad2814410c39ea244f345cdda0d456fe517061f77164551f47ce2078daa287aa227abe293ffc9b22e52f3f4f357d03db3acea7e78966559e2aaa2af6a6dc29e905fc8ba983cfba65ed119eb9c49c82c4a34f99465f50eab51f4eeadd63b1a886d5dae47e4cc5156a4e6c9e09eb8c816d9667745591f0575534efe7c96e50206f6d1d73b28e7ec9b98fcca9e404466f63564c8af7217e5831aa5bd00dc32219e10452076d047f357dafc3aeb1d9347ff24e66f89ea6be2197c9393bb27c63add1c4ca1ab7e481f7de10b856e0af0cfcf6fb62ccafe7316ad410c390b5ed4d7372350960435c822823e9ae819063bbfa62d27bbaed2f1eb74d59ba2ba013a7e99926ef4b5b7af59a0f769e855cabdcaa957b9f32abb56b90d67a26f56b91cd4da5d7510dfac71ab9c5e09721dd4fbd5f603b059fd5c3f0fc2e9e76b5e47aea059e2870c3f83ae3106ad3386b81c02ff8cd41a5e67780d2e5277e12ad7f305a1ca75d65a73f783f033bcce5aa341e49af741ff0cf607f5cd0a875ce976907d54b8ca75f4397739df7c73a1fb21788173ce6e9dc15d831ae5d1e75aebcfaf6ff44a906591e82357b9cebf65db0c2f6cf9c90e6b77d61a70fdfa3f045d645eb506fb7798e6c1611bd6f7eb9b9505ca40cc441da58ffb51887a4aafb46ad72b5cd7eca3c4fc18d0efb0d90bfb511336fd6c9273664dd6b8bd065fbff0f5b0afee87e0f3671f0962d88569cab2423668f2dc8405ea481d954f0cf11a07020902fb21f54e67dd02ccb420863d3f674160bf9d8eae71acbbc6e504a0bf6a0e62a86fd638391da5a7f4f1d43a6a8ddb701a0851b156b1317d24f2003d7399ae7fd5dfbe50f3bbe466b4d162ccae4293dc57dca273561a75cc77694cc3e1331430803940601fa06f13b79da1c0011158504881031ed80065a857ccfec1b0e377c945df1dbf4b2cfa998a8ea247e426010ab2a453bc5b92290a41229537f3c3edf16622ad3837a6b45cb272d35ab8424c39492291201b152274a89829fef4b94c7a6e1248b1062e6d0d4759d1889718964b26e54239551d11ff4e14eb94487429d5bc296141c41d1284288e040e17edacf802ac38228be8f702ebc9a543729d525c25f5cc24dd1495fcad3032764725e786b5d5b001f3f2d82ac28821054542c96b28eac70d29670e2906089feb4248516bae98a483b8e4c60eb1182e37a7aaa813553cb244dc2b72659470e15ad821d24208629124c514438ee85c203b70a81587c8de2e57c55571cd4571a989c668c8448ba3117747346e7e4af65cb03a17058f620cb6229a99dbf3e5a69051cc314544a2cc6b410f851b288aa2a999f5f475c24985d75c1beeca8bd251f6cc61cd20c093064a13786d5c3e6220e1809223582e905e1e3e4b9ee74a2e19502b8ed8baf08a4000c38708b4afb0175a297762d25a644c48c2b2eaa2d67c48d4488bda79334a9b5660cb8392f2233b723b6186520c10a39fb8bc2894e9379b0f15b97d8dd0667488c4d570090196e451d3676494755a4d944fecccf958536223a4040fa9caebfbf9fba1d903737161c9c882cceb85981fdfb28388f7adc889b12827302414e32de993eb889f0a09acb9c8b9536a31e43482913b311d76304a3874702fb513258d2eb9785213371f18a49a1a20da43d3fbcbd13763a2a7841cddde138d9e2f1b0440daaf578f900438fe8a2879ee7ab8e1f72cb94c6b6bb1a4c62b6582b79426dfb98b8aeca2b5ec828363274ecf4a4846969c138f0d0c56de0d5813b005a6fd069d84a51d58abbbe3199206276447030c2c272ae60f6b09c35c5aa5477c895295dc91a6af9c97242d258db63e19265044a146e632a7a3a790349939e79cef76d8a2e07d728e53b365e1c81217673c706e34e11c7424c4fca658c09475e9c84a9d73deb6ed0795b8726c5e9401c0a373a603c791177d02a8a11461048990a4aaaea7a5f33ccf353d5272a3d503ad6aea46043fa69f9b1b3523992e98fd76119970a2161b4921222d2c256073474670dd88190d31c275d7cf778984f3a1df388e326f34885405798b94a13921e0a67cecdc6c84a9091d6396540ffb6fc9cb120ae25ae0d7f12359b8d25aeb9c73d63a6bad172044be3001bb3a2e018f999580bff23a2e01eb01e9780eabe3df917ceb9bbbc26e4f1de378c365551d9399758c43c75b921c965909a058bd81b003849cf3e442a407af234c569680323d376e002a8e43024053766262004a24a88067c0c4f415f4e7ae5d640a6e982a42a40ab44e8256deba6ad7b1da0e0a912d38e33d4a404b74ec72a6e8b8e3c76c0450a034cd652799e6364d739b7b9be6dedb34cd6de63221b2ef181dbfc956c72d3901990f592d83640a6c190956f1d995d1189aab636166a777828e07d9d9cd03b682a41ca8efbdb74ef40c6a352a7eaaae91ab0a32b2bcb6527cbe5b37af5689a4d33ccdd37c6718edf5ddb21c8d79ebd188b3fcba49c7af56cd12a31019595e28b62bc11d9b446f1c96034306ced052f86531f9a0e1483bb246374494776766a2f19fe53a8cb1229d4ca530cda1699ee7e3997ebe5922b88c2432ec54ab94fb782d69d9f841a2a68bf7e8e4f0d3a369a1c486921f32dcb0ea50ce63a4e33c2949335431c65e152f5e2c201c6e901d01d93a13d2da1dbf587359dbad0d47501f1858961491201dae8496d8f584050959d905ad8c9c70126e1a3a7eb1cefadaf18bd5d5c29bf18d4dbfc6373563dc7bc5f65eb9bd56633c7a94808be0afb9d61ff47a1ae34cb916bf69be51474b8a07fde8af803f1005b704dfe4afc20cba7e733dc12dea9bfabfa74407744ee4a0e3ad9e12f15fe7c4140f2374fd238cb0b74fd513d5950ae67cc44631ee48b9888e1c765dd5d5f59b6f15968a95a975fe539bab06fd7c4d9426e10db8234d3c5095c01b70475de4495c51635aab41c727e859af1af4bc350ce38d1a54343188c490ebd8afe317c64ecf1d08cc0fcc2be8d4041d99923be894ecba401f814117c4b0e3c7bfbed1ab05e2073e4ec1cf3ff829e6eb6607e2fcc0578344e358f0f1af0f62eda9ca895b17e823f039500da604831f4cdf18a345aa60e5a88ca557b672975e09cb63f92c479dcfba48e37a9ee7b9aa7bc5a60acbb22ccbb2b9b3cf591258766d51861be89520664dfefcacf2018b08fa78be90d80102c4d4aa151283cfaeeb1a7cf5390f06553e6009021fd540e09f41adb23887ef0bbf772a4fca4865ac5a31cdad43d0fd437e8c57f223cd3f31d61b6bcd7a306160320c8c5ea24a8df5fcd8a85f29b6aeb58bb1ace5cf1fb9f6e301d03f5114a8d3d43481b91bb9b692c2eaf875d1d591c7d7c553efda44f1de3b1f8fc709e00f26eb726e0fbb7d93a7113efb994db140fb269f42eba6e0a67b838b0bdaf7e33f17137047dd02c80433ff33e79c733e41430737f8b5d65aebcdbaf0aefea6da547474db645dd0aebe6aae26918ece344fd6e53c33fef33c5d4c14453912f3f1a990b22ebaabdf019216f8c107b22eb9abaf0651347dd5453fed28aa9aac9bf5b0ba1823407599fa238ffdc8821238e8e9bb708072d05397adbb4853a333305f54bdce9c30b945cf6f46e116f3b37b72d051d81c4e18bc417f9ab6fbbfe38edc27ce305147b4363ff284d9301801393f6f3fe5916d3ad4f0f8550d440e7883fe0c4407e00dfad3ada28fda037cd4afd16ee66c12d1ee01edfb1d304203708bc9eb1701b7b427afbf05b75c78fd20e0160c28af9f036e01befe15dc127cfd0cf800b7acafdf830528e0370714b60a6e49bf2bc323f1d70819be9b68782171e986e5011ada130d8ff218882cb41df817882c0c3bd05dd2e0a67bc30966407e359f67cf40ccd0330350c88fe142fe935668d2f3b3edee2bdaf30779cf0f4c4d940bf7770d19881c834eeb54f355937801deb699bd00fae79b29a06eeaa67bc35fcfac4bee262fa6ce38156a13cc0217b5ef77514df25fc7ac8bda751e6249bb2a96244625f694c5927afe1405635d798a3fe9211a409bc6cceb67be76afdcdb860a3bc07beac8f5a893828ca9e397ec4447e68ec976cc3ce6d791e9585ec7701d69a667c7ef585bcf6fee31b69eedd40e820055270ee3051e82533583c8dc8e8f34fc56b4031395a45a6362c1340c33abbf18be22312a3086d889f9b851f103d675e16be94451144d4d1445d13357b540f98a73abc8c15f108513a30ded865d5b8714635a693855422ac28abc344099b20733ec4a602d797c7c40add059faba63a154d385de99e78ffc8264b6f396c3472c058c1532ca27b431b2be28962f9b74ea749e67eaf4db6befa2cc5584a24c1180221254d30211974f0953257888b24228b10afb3abb829cb9ea3c43503bbff8c8828c88e1fdc9806fe78e84121c12155892194bac72ea84ca68be7435785160756a2a8e98b448982599a55803a3bbb0d5b46d94b822b2646feac8006ee4c839a3e1456342a8b5b4c55e30a12f462efa9e96868492652d633a267ac01c29bbc2762e6431857175f4ad11dccb97cb60425fb9648033bd9c3520426d71332bf8d2f8443801411186a465699b651a9315f9bd6d6a6865332d50fad2110115d4f58482c564a24b2b0d5dbcf2ea0aa6c9d38b6acd4f6d2364243569dd40dae211e7276326c411e5178be255fe409d91d791dcd4d31a108c144596476a6c865e9a137c239d5acb3cc9e94e0b4993274a7a177114f52aeb68aba5341492113143c0b6aa70289d5ef8e051a3c64d9712146e951ae7f84ad8d40dfda8f1b4bd608ae959a3a90a8bbac0ab98b60aa0548e0c289abcd139c26b5a31939303821a0d0e4e1fdf5ad109d589eaed2be5f2ca2c870820377553703d6b56454abec2eed6ac65bebd508a334b26e96501c0086aeb4d085755727996f2189b73ce7711e79c73ce39e79cb766102050c6799ee79a9e49a094baa51c1a8bd179e1e3832a052c298b06168d97cd0406f61231c4c8da8811468458e044589b5f1d94ddde8bdd12a44429c5d394b49684b796e30396a2ef6f2f65d2a9172c1b5b6b55543b4a3b28e004b30c72639b81d2c1b9e4805205c083c95a7146a74411821d5b457d42e6864c2ced5817e69f3af85681a2288aa2289a9aca269f246240404a00e1a5db8bb322692d84c8328a4e136a69b9830d733acff35c532d209d1d384841c2f48062769079fdd8aac132697172218dc3c8140db023496292884c69657e6e617676613cd60cc484a2289a9a289ad7d1162b3b754f636633363f2fc8316327076d091157570c61d412fa69cc7eb94c9698f46ec0901d5146c696cee45e80d676ec25594a3af180a95de02c9c90553dba96048d80ea3be6789500437183e96bb96372a8a5bc64e32b4e140889c31194d667c3e6a54a064d792724f7da7cf10993049306a844ac580f4aa70cc208000002a3170000200c0a88e33810e4300a876bed14000954c23e524828104b45a1288c821804422006a1000001100080108661100a252a521d06decd6c3ff9791fa6a9bba3b2a478ffd7726006fa3093a99d30b318691373455ad3625567aa0d2038bbb60a56848bcff57c91574fa9394b08e1a206bbd14d392a8dc5e0cf2a5c454da2bbb609d39e91f61ee11450cac83449490daced7e7b5ff3da60132a1f73f722ca3748aa9a951a7b94e2263045b0ac49eaf03ac802067c5555d88dca2818c1ee36ae1a5539d82154c6a4009fb19e5972eff18238266b93b96dca9cd05dc90ec458016a1639fb89eb11e10b249e2e62cab6d16217144ce41eb9da0a21e7b5f9003eb18214062976726bdeb475969730025e8c40615a897852473452f5167b817d6efed22717a3d0000b744e7e34271c61a5267d655d9878ed86e897ef50c4e2f9143593c8a113c3f821652e2b9305e6cd21e5da9c5e5f8b9a74a80b65582c857549765c1e69f7ecea682fd464cd71b2f17b8d51cf33db4b7941df2401b1b869848ba894aa0a39317afe0040ff3ad331a4a3b69725a88b99876f7eb8076615318bef1fc51df027db6e9aab488394ce89bd6e3b8c48cef1bb3a4acf131e4e40c663bee191fc95d44c94c3041f5e4d35f803f6e620b6d0bfc9ff3ecf7437421c505435f9e06a95ba6459de685d23e2baa41e4f5ba314922d9e43868eb022571abf08002b8949a8be8c76bd630d53a74fa5cc99fe249db95f9dcb70a0b1e4a4ba6bf65595a4ee7f8c08dd085dc13ca16de8e809adfeefc376717fe8382af313d765aed0b3cacb2797e41fad15ca04ec44c4d23b3b5cd2573763876215ddf97a3a2137ce7973c16b331d9ae85f6b4d65329b183ea34c4703c737d6ff55b39fa4eb13fc942f75f565ea0e6e215ac3f7d642c0137fde5b6d4d7648012293634a12984cfdca684ff2adf0e9959605d6496f4eae4fea6f7f0b93ee5cd72a0ad314812287b27362d90dba29f3740be0ea4afeab38579fbd828bf24d939ea455b23a8a83dec8427263233342cca6a51b0e8e1d2be97bc9cf5c52bacd662a62176dfad09df53b3aa923e844e08d9dc05618952514a7ca0eece5fd32aa72b9307a17a5bad71e5aca36dde6cd2c4f350d4328dd0909a5895e7c51b23f86295a825d23b601c49f52a1e1911ba74081524cacdbded277f8c303b6e50c16693dfe65e462a3bfc6bfd74d3758c2899cd52a59d7a2a584b8b02542c9f2309bc3674dd900a430d1412ca4adc521814deb69194459eb29b5c899d14a3c6168f0c11822332ed5fd777fe07ea84cf7ef1e100c27c46d659a041e943853ee918a861188f0b64e464f6a4e5809f2b12250ccc4a4a21ba55f7a3b21142507d2fde961b41e0a95046978dd832acad1bc88c412f8d9cac41b8f420712f8376efcf24851955f22c36809409b4a6bc6ab4a6222c2ff5d3abb178e92ad74c00210c6b4d5ed063c4544e8e5fef147b9ff4745bdf83fdd16d24daed101e86e9714070fbbf1299ebdbc3837c417d86950628bc62a28396fe16766e0a519b4f6b1433b10f604d896a04183c8125428b0b3b92c41463383363490b29e1bad3f1b6dad102752824eb6594e36e4c932541f5c3606d340290a206382774966363d0fbd12e3af1146d1acab4958e5cd490c63217c33d1eb4abf3b127d86e45b14488db1e10423c59e9075a0ae0eab622345528124836d6f040746555ccd0604a55ee6884ac22fc93bd91052c61057329b4626ae8cfef39d30a4e437c41d02f2bb7e94dd51cf144a742952004ce7e49a9b568222859127c579bc7e8a4882cabcfb92542eff91c6296740f0d833945c9763c0184c7eb7e75712144b8ec02e48a9d70b901183295c9229d49f804fc8b4bfc5819b978cd5b6d40e6f93eb9890ac31f896b779f43884a3498f93f9042fef5c7cda922558aa8bc7a80c28c7b282ae793b95645ef2f3cb1b2cdf7a7966c0bf63ac9bc1913446d015a133e1834433345cfd0933212e897c4d31ca42a0c5e44fc0191ed67a165698d51071e40dff3228ce27ee0173d2c67a2751ec3f2cb457a00d0139e54b12435f1f4532d133abca7adc668b6ce3b79ad1dbaddc2a2bc9f0938cdf914a5ca71a4012c34f08c1b28739027c493d697ba776c7813905240160b5fa62acd9c49eaca6bd95596042482d49a11bbaf80fce12258a933095835ee57a91a46c45566c884389999df2eb7332da8291a6cf0a8727194757d9f44e4d64e11f914771009d13c614e1f424e0b874eea58a88b4813d2f7e6fe195dbe3d60889116c8218460101f010a4945f1f1989225da55c3192fec2477dc6300ee972490f85789ce595cc70517738dff0d2e783bcd052ec222699a8c9a34c65066fc3825826599ae8e4c1fc49e533cb966435171eb30202ea4bb0aa0bc7a800a8c7b082ae78bb2bc958f23765280cefa93262fc6adb4ea6e1b76aa55cdce42ce623faecbdd40e033958a6652457aa9ac6d5854671193edd6a82b703c974360c087ba68a050a82478264fada719292cf8ec285cf92b35c41558cdc953056fcecee12c3bc4d468eb52e0e30b09712aa5d6a0f017d128e4c38a4054be442981a688e6748f0bbc3fc072847d66e5390840c02466ad58568369a5cf6e10ff7a81ba8babcfc4a3568daa4c6cdf19325a36e5e38560c6fc38492c1f2bbd4e303234e276da0f1ba7b894ac823e233b4719b0e04e81fb422391bfc8e7d0621aaf2990354cdea48d016ce4c156928125369c843b4b9f018a9997009f4edfc3d18f83f9c0a16ed25ece092d913fe767c982be1ff1b5b0e5f0337cc4b151c4e81a2f10bceb86faec9e57ff811a084b5318cc09ae27384e00340641432abcb72ff895f402e7a9e59dd0bbda4d728277b0f81174e97f2816190c59d5ed341eae031ffaaae377c60f8f2c1fdaf28c2ba53cf06b8303e2091dd1fee26d0af8868ade8c23d876d752cdd7ce8d8b176ec5fe62449b64751426505b97d2faaae293e85f2037f08c4981e02b95ee2a902714c6c187929275432a36525f68bdf054aa38c8ba7f83239778a4bc4c80f69190e08baf89d4a9fd101ffe9c1b3d655b2cd2056901280268b410378cb9a164e923eb320d0403e724afeb0554a3fd868f68ec64498269f4ea81e86af014b20016653a5a57c8a4b500d85f71ec88ac686e6de3e265427e1fb9cd5aca43447bf0773fb132c35213b0d3e94b88aeb9106e422f6e2b3cd0c546f331b456ab668436281d96c91e9e0c4cd0faae9e4d67f90786fe24e14f0700f0f729adc98006ee8b5c86be636f11dd2537674ff4d0a2760e3cac2fb0b92039fc54f33320f8e045f570c8f4b0e964e8a0a21251848ab9c897aa65a1dd57a16ebf295f3279224835ef91ccfdd54f64a0f5b678d39e3890e3612fdfbfb414e73a75d140a9cf858d872c7281cc9af21a10255e6c959ab719eb595131a2f78f8f2fd2eed28a1179096fa1b4d4320099377adfa649ded02498cdc4491186731a5af906069b1987e844200c980cc9364072d5e7b5ccb01132817ba6a5251e40813c948a9b38a6ee5da5f60598d5f0226a890e493c2cacafbe266f81834ccc85007a75750d6425a861d3c1f2dc21e3059de0735663e424e6157e519231e6b28ff10b0853e48bfd1dff9a59622490474b72bb48b91278cd4df565a9a11f79dad4ad9904064d54a735c3560669394fbdcfebe846640ce24eb9eb85e288d909863fe025d4ec042196dd2dd3ef872d06717657e75120af6fcc6c0b964f33a494e3b862f675929a058af1418e6237b28041b1843e19f719239fcfb0d278057adee136aae89f5649d3ca4c71cbabf450e47765d0b9140b5902b330498c3c083d260742fc3c3ff2c8679309092344dc2165a7d4ea1e48673083cbb731eb2158a66e5cf5e52029902b82524d6eb4ee021a16c0c704e3b92c7bcb0820e9a7392b05c85cda1afa0206220729c2dd9ffbbcce660b03cf0e284e8a9a4ebcce514832e212e49e448c2c892e8afc80cc0a08cd84b90d084311e41f7180189ca659ca47d153776ab343c735439cfb6c65cfe17d2404e4672a34a6e076690930b76bee4702eedc06cfa1b1aba10b2a6040b656d80cf229481d31224a4ccbc7ff47790258213e61e41a9cec74f78606fb34a637d009fae71dec156c45620d42ed0f4c2719f9a51da63aadfb8302895de36edd7638d921be6d4082fa3d3d00ab0470a7b9e89535da773843679bf981e40beedc6071159b4bc3322fc5798003d35a8b32aeb2d3c696a4f05a3b136fb553e58f248dbefcdefbab27f13391f5d63e9e2c102f4aa3098037cdc0158529e147a04e312c774fc42d97e7a6596a8e881eb1231875e44f2f8e4064ab9b53a77645a2b08143401a9632233c1bee71fab1585373eda48e316dc2f77d5ffa2ebee67fce7f71bc34a19fc5231f90dfbe42e28859dabdc8c4f2d67e0af8fd5ec743b645996f4c6b73ca187b352bcb1dfcc7a58d9f768d058cda7ac82bc4e978eb0d66ea901a43dfcb1b09432ac9787306ca2872ce3b2db7f38837dfe3b509fe5cab51cf71fecf523518b389ff4e0f62025297653c69b92c2f90596be8285601ff8f3379d847ee179e62a0cef7cab723497482ea97c8c883d6c42554ed530dae30ea907628f4779b2f1f9dce040cde18d6874c737324fcf50bf451846059cf795eaa7175c94749a0a36053adc1d6b4ced44505f021f6878461731e6f9886b03f3117fbfa1bada380bb5750d9d2ac46e549f0a87818ba58849a5c02796bd1ee3e10548d901b1433ddd4481e0b08fdcad21a4a2fdab2749af4c9b2ee6f4487dc53c1237b306037c49a85f3f10616daa6b5cd3b0293d82f886aa7a8e58ae7802337fafa096835118f2492808e4378204abf8919ac8a22438c9bd81ebb68889531e54133f591f6677a434a7e9f27c2a92c98fa0215018ca7d84d06865bd555c18e586c777a04c67fbfb420ee111e70cfee2fb6c6d84c955419e5295b9c7a4a4c77d2b8cfc5f3f9f37b19f2560863eca0d05ff5838454c8e79f40107b60e3ace6159fc3dc3e7f0bae7ccf0177ebd6b08a08647f0421806df210c10ec28953485210c3f8ac0cbd98a379e5ca9d65aad072117b5c100b87629bdd6830aa510862ffa663322b4f60182e13ed6df86cbd10887c62e51a314c220619241e9516587daa7c4ee4960135062dae919bcf2b07017bbbba63e21f3a7eeda3529fd36fed3e6006cf5a9673033cd4372aaaafa0a91c28e9117fe5031c8b8511918e25224f64d37bcc1cb8e6d58476a0195c2a0c20ce55ea1b83168aad4839b7b9eb80a8a124848525a53dc69947214dbd9c3d8181823a1b051288f0a5bc031fc6cf72320da02765383d79690ef1b4741f419de4a63ba638f5c3467aac665caba5018c15db93aa62a4afaf5dd2ad8ea14072aac801d105f41f3c981e7f79505d254d582a7d3cd7b3f83197be696afb1471d842f5bdc32eaaafbe6fc7cc3e660ea6c4cebcf63b80101d0704df09d39eb8332795a1daed33b6c045017a74648bbe17bdc2b4c0a5250957dbbffbac451315d8cbf8c390d0bfb85309212c4d09e16591070a29606298c94cc406b53072390771e8777c54d5e6135e445782f873f9b300552c852197d8ac883ed32180f96f2801e60d79ea82b43b7ab2e1d94ac069757aa13fb357575e9c07dc4308191c9f90f68b4244de236e9791ddb0d0caddade33ff479b10e52aa2ea6d16428b2f011d464c109b2d4298fe36473b128b07c29810018b03dbbb12b97dd9f003fad5c6c4cd6b1f1088b1223a4159ad9367c7bb82944ad304322600a6188baea373f4a3ba60c014634c8a26aeed17803b12c12f8fdf460cdc35fa61274095ead46a1e07546bd800a34ad7a6cf033c4b512acf52116080c0a6c614c07ab8ec43100e59479eaf2ed88800c115bce95f17166d76b4c3c12245654378227154ee01fc1ef59b916fb4600ae60519a466a4a8f44c0f4615831a5001475f8554bbdd14b5b27786da434b274bbaacf62ea605350059e25dfc480bc51d4492d615f8f49d7581ff1fcfab9d5883baf70b1aa6eb8cced293688df06359982fddb76ab37c04b6064fade9d25bf010c9566110aa563b7aa4ad714fd3d86e9bc22e05c1099d563f3ad2b5d16e7108d067b961b936082b28e83f6b00b3ed978af2ec70b8f2c2f0ccf9db1576398c120518f4182ce2eec0f6d2e6017f10883c2da30952d1bc2f2a39b77bd0fa2c4d5aeec475b6456f9ef9e67e1c2d0297e7d5f66678091857ddd3b22d3698f6fad114fd414a80626b4463cdb54f305f0fda58a2f60d199ffb29404acf68efece3e52d2426a5ae19399e1072982b91c2164853dd3b478061717ae708bdf050f84cba4d0c808f48d547cae6f244a02a8c2a6d0520f151cd807d51b39d6d75e32d660850d466c6100f13f4164d7f80883ea003a04b42dad1f7248b7e0114f3fcea36031804a511112a62e52b04b89bc03083e343268fd4d05b61db6f06c4ae488f66ce60a3ac3f19bc6dba15f22bb4879bd1102b44043b8c70b4afe49e4741495f79299a95a2d1d44afd433c990e523f2dfb85de92125d9f451054f886149a06c8a6d529d87908151c1fdf9d9193c12f573a63cdb1124ab3b0c3cf1e8a502ebc31833e64c7623fa47ede3cfacf8480f01480c3088360a5b6a84158862478fdc35508010259eb978a63c0df0fa5e4e023ec86e5865bb62b5fbdc7abdd09ae43d77f5a098bc274a9823ef774ad27b9038dbe0240287cf481fae265471f761f834d8d9a3bb5ef1b4c2c10bb2fc19f5cbc1751901da151512758a738a8b72032963cf202d49240a72e5ccdbc059bba7a3791ce5360e6ec477b7435a823e6881522cba58b4d70cd7dc9b11762220c4c2249ae23a6a49721d5be6b96166d66420942b1337664446ebc5ab3509e66b17d137da72daf29978c9a290707ed79d61a9e76160cf4b406c17924d0eb6bbf6c8662a045ddfd5ab06c90e9a520e24b06aba565d986c02aebf67e3c77c5a80d845f386d9267e4b9497671f529237434e3a85f45f9ace27edb51e9b8edb51de0a3ea401d6558186a2f6ee73c3c1dc33f1691f2c648a6b7a3b600aa31540a72adea9f05fb9f8bd506effd5538c57202fc4bb276fdd263f272a1cd9dedfe0870a0dfc836511aee2d74839a71d752b428a83faa22c1d5b858dc9499ee084008f12aef4d9d30f89eaf8b78a5976d58b3fb84347133ea3da9eb2ac0ab46cc4f475ff9c52e0cc556be15a70d0689023d50b0716f21e85821b2168a8fd064ef079dc82eeed535714ec8929620ce92619a5c8681ff0c14cda98691585475da29a15a38ce1ea60d663a028d0c45c0cf0758e00d0ac1190ee278dc5c0083b901917569befa5c07132d7bb1d556e82a47d43b9fc46b30d8602f3b6c4505d1e1e1a412a5cb481061fdd38cd26582c386e1df9754808c03546b41e0640503d1533f75ad1e74b943a5f3f351f9cf8f46e9c343036a6a0a33d2e589fc035f0316853eb8a1dbb1173ae4b6ddfd3d82574e7f7dc3eeed2e4f03ac60de0b14ffec6eebc9197a79411002b91de88dcbc7a426aa6748cb4f2e14830229ba5bd4a505e0b7d2b0ad1fecb2d7d7057cd49ef167baca5d9e1baaeb419cc6891dc96f63d17ca4d7bbbf577f523116ca4e631cb6ee099fed5779996c6f67bb05574c3b1184010e4232e22ca99dd16c9d02fff15975078c3831b602b3de0dca623cf94e6284bbb79210e4d4a772ac2cfd98cfbe34e483efac0e061064d3878800b71ede0f5c2b98850d3e210ac1e7781fa92370c684019f8ce48cd59fdc980536d96d8c6e0e1b71a3eed8132c90cdb931b604c99193cf659a3f41901690478893cea18b2c2aa4818e91449030f3bed48ccf3f121d16a3d5039b1d20de89abcf3adf7e7e3080e83e4670e3edfbe9410d1dc1298358cb6ebb79cfbba3266284aa80cc283bd63bb3f276f5562b03f13f013922da47f4bb8e77a8aa9edead140930b32d8302d876cf0901916cf87dc5f903cd549253d2b35c4e1fdc4a4321e78ff214317b2cea3b1ee149aa23250487811e63d043a2127cb4b1a40055056282ef2a45481d0500df65b6c327f560fbf82ab0a339096380ae393f6d7addd1d2274214be33148084d340f892fd84af3d75799a54ebcc506a1944a42bc7f93453cf12b31ea912b8c754b0847c4b90b5869859805436853498d5a1f635a74e7234be9874848d305861804c84be1b7518fcc0683733611ef08d24ef465005ed38675fa1b1fb672fe96a7e52ba9e4366c4f20168017655afe9693f85c6a08e1c1553e21dfbab9864e449511c56292a6657e7ea388bcd615e97103dfe02ce0e33121634e1c4e6b496180df48a4e2a70bf96a272323ae58e771d6b97546dbcd6aa7e5cced415cb661d7d9469a186aa16dd5a5fb310020cdb079e6afb8e6dd4ce05a13e7c3282b8b9986fa10a8cc74ae7375c94f553a9680172de8308a4c13dd1e39c901de59a502985d10825471aa06182ec743a0decc03fc06ccab448d7f6f52d603fbfc0f15853d1ab42dcf8a227d51d986acf6f7cc10324cac1c3314b9088794b80b73fd91eb2828e46e195844e4c89d1107b895adc06f4ef9f620758224fb6ba30dba71660e8cb68347fd2a614ba1129b0e8b5d6314f371ae82c827b23dd697bbf7d8eda2296b050b453578625928f187ad34bad1afd68ab38e5ccdcc4f3d3708b458dbfa1f1b4e945920bb60833666c08beda7d1ce98ced4cd47dc91e0e0d9a04fcf2a51968078b5352292f16c081cc82b7bd90efc63899ee3afe35c534f9eaf78b1f0b3e1a36153ec493470fb53575da7b559059dd3a5e4dae1ec0b5c8de7922981e2c6cfe2626c664da2307013804c37c153f109c199b147df6b78382c014673e1fdf178fa4e7554294b4530223bdb70b413534c81c5470b6389be1efdaa1f8ef0bc210f84941f9026a71b5b42e026804b21ab81f39351a91c9d10ed4fba95eaa82b27b91c7e458c2979fc26e5b92bcda7a9c9611a0d2c4b69b45eeb366b8ebe27de233b4d90de0de29e83e803b6b9c6bbcd0172a8b00d7e9e07e063c4602ba9c995b90ebc09c86c7ab9d3bff16adf12ac2431928730675c6d0bd16bbc4ed4e51485fb101a5861519e591d2b322b64b2f2749744e94c27062f1f647946212bc86af6b95910e9fc89dc696207014eb496f01c287388825c8d2ffa189258a1990551f1948f77a6024e685c06ec1ed37aa75a3259a8a4880e0579f2aae4c044325838bb598516c280e50682c4c43bfa9633f5a007e1e746bb610547bdc5d69d23ce0c71510ee3a5c6c7e0ac684977cbd83b8955287db7da12f1499df3143d8548579e0f6c7cf44e4f6e4c4cb5f7f56f02299d29016f404cfc18e9423bf9bf641831556c7882bc6bd04cc57d7480ca2be045a70222094b674eae83983cf76415708f299e3ac0ac786e6401ae34d4fb13689ed68dced9059aca56e5c361ce9ffc2dc2880fa02282832a74e8b319162465e985751b0c2513d77cf8b97a0b40f8310da92581982a37af52b626951c29376f85b6b2414f2b152500b9c1704a5610833ab5fe85bda6815bfacf247b0a0b1d926b015addba8e2aece83e05d4e057409e7be38a736269d9f14c133e5eee2dee92116b6609ad4a36b753443cc403bdba6549fdb8e8bf045cbd3838f2c00153f161b3712e6f7c6a81df88a4b6462365680daff0242022c3b5d11ff3285040f66e5372f17725041f6fce1b29ebccdc60c3dd986fd32ae34d6f85e3c9aaf4cf83f866a5252f740537f317e7d5ea4ed5daf5c00b0cf1ad555a728466fe6280db3e5e53548beeb15fa395ebb4d4d075d22d488d91d0e1077743d27122922595763edd1c1bcf8c52706835b91a3a63d10ce21cd2e3e8b217fdea281590c5ed80fd0c1b0045e5e98b074cdbdcea276bacf82eb25e4f34230c56dd2ad7e7ef91940406c772b188a9efd549f5d2d16e8891f81033245931940c25617fdeed82c65a09b61fd327b84415b805a9946e68a83539c9c52840e503ca2c20fe4f6c8b46200118917cd15ac604b6c21771de0a2530cdf62213d124b5e397373f32b6611dd6a6967662d460ee20e50b2f221df4e04d53240510c53b5e296d8e4012bfdca7c3d68b24f374157c52c154eaad0ea408bd68aad00ac3944d1d3e9ad631a0c1dc78d12aad6b4fe73b561a7af226b120a3ea1faecb38bc6820922d57c8f6b35eef4fe342b702a9c20c19dc9c57ce4b8706c05d35b775c0bb6c0a9a0269802b44616b562eb037dac5a76813d7a79237979f344ba3a65bd81cad07c9b4c74195597689be6fb85984279da42e04d77aea927153010b4721fc1944e25486178020810a556dcf554c84beaacde7c4b218cac5d9f9380ed2aa39380090852eeb38bda85dc3d3029b96ed61270d66a6b08d80341efba7b366ad1f5c3aab7daaa076fc119fbe9064c0ae73e8601811ab7de82468ad78d11fae33b0daa935a0d19b3412a62760851c7bcbd5ce6b08d082e1a00b222389e81765d0c2ddd4c961e534cab9f198a69055503c4339623d83acbef86c123b50d873676595ae4f03e3cb5d57833eadb30e4586a999701475cb858d38c91fb6818d2ffa1927b82f2376a82ff25ef987f3d8a96413d650cf2606115aa7a874af433be0cecc51bea99cbef81b462d24db028a7ade516203c9a568022d0e28706ea24a9771b27674ba2efd566881648722e214b28e79423e4611a9f02708826331a2aa6124985585a8af28756e9d8e723d32920ed69ca0ef511fe32f3d75a43cb223ba72475d097d9877e6f3691f31f0b8c8fbdb8863005fa708052080a6515fa814737cfd18415f2d9939caaf00893d193fe47b22e21669865e7dce092180d9028e0019e5e024ad7ac77941fec01662bd48b3d5eb4093917464dd9f5847f7c53b2a31d83b2214f416b7ae459016a0cc35129a0fb7a7a863d47145156d04c4bfe23845052f7af54f3b1578221849bc62dd420fbe99e47b9ebf97dcd129affc7ffa9156cf08ae8a57113959acd1e20e874a915b26e1bd900356d0515f5cdf0f133cbdfd194561864ceb7125aa12d8dadb0585a010c4635764198afc98da252a185b486fdfde5cb05bddf470d0b3aae0f80de4d8104c0b0888c3ad2374033a852f6fa7279990f0ab4b54a3970a678628ddf98ce02d91160adcc4278da1bf8afb656b6843e4a70dd850d909c1f5a0ebba989ea32c5c658cc5e627a31b550d4470a8cc3659af3b108983e16744c2a96ef8aec87aa7f852da6a5958558113cb81ea80aeb5de0a8c6d24ffd341e592c39cc3b7a117ac7326dab52b2e44aa64eca64d9786a6489890f717c62f750ac4ab2c3baa1d5eb7e4c2015a66baa59c77eb22ce8eb0026d4666d8dfdc474cda70b022b2cc8a366ceddfebe4cbafc4329fb893d2f073ed53641536c6f9d84f2f5d646d87212b18cd77fa211311ba78a112ef8e1a12708f39a2c2b191f83ed6683501c9fda597d9825bac133888e5783fdf7462c23e57379d7cba597b914d351f065ebd41d8e4019504094606efa2cf36996f4301a5817d79413f9dced5153f4092b651775440a84bb8b5dc88a2a92e28c38506ec493f7d9ef6237d03680c29f434cf6e64e5619102216300708aba5ed49de04320028fc4e8720136313667aaa539144b5b016a68535d2dd145090ece8703da4efba40f7ef839ed36f74193da6032d847d1cb79bfa5a4c1612c5207589edd03178669e6257ce0800df96048fd192cbf4113d4c03ebe21a58bb9f333ffbd858bb17001861389b778f70df16c0000cc171bb66137109fbb161c1b36ca346740467fe193eb35771432a502d56092569b3cebac99a1b7bda2c0685c6efdbe76cf5f44d6cc45ee4084ba9b26fdd888c5741a4e4da413d0ca0e4d47ad5a2304a3de56a2a0893e27a86df463c2b838c944884fc2cc6d44cacd19d110ff91866e3dad932cfeb714016c76119c86ef92f17e75b3c0c07e5193ecaa18eb765b66dd4105dd2a65885b6b4397685bd7250aac6e2ba40c339d1afaa17a613412246158cf4b0c79a4037b1364c07eb958bfbd887f932ceb0fc80e045c0a00ccae1accf81b91e0f0479ed7213970924ba692e60218b4364073235803e72164eaf0352fda09b2d03dbbc10bf5256287dce189511378f5e183bd4b7dd733d2a9f38eb2d0408d98709b896060f9f5348f5c497b447769c4f129ca95a2b1c5e6556ddec87e7247b44c61f5dfc4c48d1269eb402885766afe0da0f1ebfdb54bd5c1e0532b31403ebc8c24ffe2ae385d075cb0b574e392be7dccb9ba8ca0062fe371148f6f226430af9d79a92acf7a7c1d3d6daa4ef097b5210e0ac4ae11afe44d6edf204e3e7e0cba31b9a2df3ca501a4be3d004c9e67f9680094da1f7db79b9286c257ddeaa604c241b4e8712cc8ca28939b5f167fdda79b9df02d811c54592ba87382f1d3a8a45cc81cf6c4ec41cf3426cf916e88864ed2bf11e70216f6082bd4007ef713ac0ffe31b010aa4e94a5de06e69b3889bb214b14582cfac6744af291a12de9acaac1e07a2aaabc79cd0593137c7fa393d61e476e24099d2e561c1fe8ef19847d7a2cc49aa1098dbd164e39e44188221acbb9defbcb83fbe074d7008a23f215aa7a1e052ca81e3347356d4347c887e3adf37986be6669d29e08f9e58a81fb6fa45c037f1ad428bd549348738a20752061a2fe7ba0af0b5e54121063fb7e5298910e693f8a1a5c7449ab7bf6994620787438109a6db6b657264faf1bfa4d03405811b367e18c7ad50c5fcbc1d8ae79ae6e00cd4f47a4969ed92b96267bb6b7b2d158a9066217befb4c622c0a4a2ffddc2e40a8adcd085a59b1518f30c011b7986ea18629dc78f2efa92465a83f40b2c5d8aa8e299e455c55d81af78779d82ab0fbd5dd7b6ea2d648b2d6431c454513a26db370b291ecb0a52f208769411ab70e67ce1c245d1e066a0461db3f0957fdfc31bd083e5a58c190921683ba80ac0f0e634fee4a06e0554ac495af5be633fe9278d9ff188d2869bf1e18dd33b29a5e41011b08ae21b3710ffbb1fc24c604837ca89d557f0884b524bfa093bb14f2ce95b2ac0f977962d8c550ffd3e1b943ca477ab9622bf2f42d55d855439cb1d911c3dea6184d064ae174e0d44451e462b36516dd753eef62bc4ed1038cbd55a753a6a214f6b69efdab8a1bbbdcd726ec0f43a6ef98e189520ffac0bd22335a0fc73a08aebbced8b065f2a21922602f7d93bd909800dcb49510b911e1ba9ec4683acbf107f0211247d4fc703fe3dec434cc017c14d81fd083a9e27bcc8b28f6bda40502674d0153d8e42661926e80a791c0fd921ee02b0d1cb5baca27daef83003f879321d07a88629fb63261b9d327fd80e0797dd5f829a8899a7acdc9a2fb632ee50d68e61097fb967f10f79ae3f48005303c4b053593ffd74ddea5370475997660df1d99b9713b48e96e49858c8b0c8ba5dbd8f3d3f5ff545c26c5fbc4d9416467aa72a4f970b77434a54fba472ea722dc6647aa6b59f169812e8041ddd9cc44462813268541fb91114fd3a47de6a65a488528fb262c0a8a0232d012103ec7bb96f70e8f69f16f67f8a81a11606769df53d3552b73cb7cc81c7ea5586ecff45c91603d94b0029d44152630952eaf2ecfc77310221d9925f987061018cbc4148154b90c58f936fe66f0a9f44c77c50b20ee66262d3aea8fec277ab51c3fc967153f89aa425202a43887f24d54d9fe9455fb6a9e98fecc4438b782f75d795a41ea998243d842c1d3c4d902e5abf5f64bfa4d335b7232be9a20411a5bceed109b549eb46fe91b0358013be0d7e8ad0cde564da3b2bc3c9794de68d41c2dfcca8c340b7087f8b45f14de888b9cd0da3cd0b59907b312256576c0688fd4d9da9863b1c389c89c7a7674f5c8ec2c06a81be44bf1a898c2785b57860f12661d23ccf20549cefca2aeba1faf7dd09217d1945157ea7bd36313130008941002fb2934c63fc68858209499e2a31e936509de9fdd5d5e374b2700a7b0e5d680b7dc25c1d981002098e783a3501cdddf2979fd7dceee3a962083c2f585197efe876898c4e23728cf545bc0e6d1678a65bb78e2018b0db7cb8cddba3fe52ea860b6c88c745fa698435e80aa8a8e6e0c7bbbe7a99ab0ab6d0e4f19040ce27094df4ad14a996f64271dd2b5dc57e6a171acacee74e52be5b6f1cf7fb1dc5b86894eac67eb82b4beb199b29691bf91c496a244b29be69520fa8c1966ff28610f543014ca244b57e6402663be079942bf83b767e4fb44afc00db2a9dbe62422e1320560d8bedf32a9c6aa6a1131879db25be37e40c22d1f0f0e75549e1bd21409fc8a612ff6a4fd7e4997b55c1f56e8779a874385d8b004be8288665a7dee09124c9a173340528ee73e29fb1b43f51f143db5de5e86869fba89e29c27129dbe757c1aef4a0b4aea2499664348dd455cc6f96876d0bb56e1f520ac4517c689db730059003167b47444485f4aa9c516eddbea31d6e0daa1c109086d92e160067f9089b485fcd882e8668627a8f0f376303b8a9f68630a003df4742bb353c98d880371b3d46120822e7e0ba576cd40d041d1ab572ea601e08e392d135da3a82355eafeea1f3ff31d3c1dafea82a93a315cc823e782b4cf6e8425dc3a99d77e8f02951d80f9be8d689a296303f5a56febc21feec93518e34d0dc353d6c7df01a6e00e19d026b896a96ee1e320f9260705fd4ceb1270743ef38cd9ab639644483c62acce4e0eee07b1d45d2d31425d43a4ed34b93ac52b689062d01b403eebdd3a090a070bc77e0d6217a1deaa7d3148a7a87be1c683aac3a585d07abc7d39458c892a1e1c8462d0b11a68e42ba69fa25235eb4b2652838ca8ed388132bdbc1a23a9aa924ea68d5412f87d81dee737077e8ef4083c38a83de35a4af67428edfa91d13df749f5745430ef438ace300ba0e92b1b42816a991d3641e19d9a0b51568ba5173cef6cb2371b4582023e568b9a28923d0a1e628efaabce66c7b8e0966c40186314b395683a6d9c9489396104446403482a40c8e4adf71fd1e1bb5cabe6448ca6a7071a48c864b72a363249db640ca0a6683de9d4d29fba0a570322248232859d661b68e7652103aaac53547c3a9423cbba37f743465b93e877e07a2d5aea466b965998866a1c30923e448b202475743eaf233708c91458c6b9510751d7a72601a8721d734cd2d245e6b96b6b3aa285563d25464291b4c239620cb41a48e96a685221368cab2be43bf03bdc36a0d5790c638672c346878700dba77ee5a2e244c1a54924174c8efa2490819014e2396321d741c30e6104358ac9bfe4e9ef14252c11922641d48af438d62e33f5634f4dd027a071a6a5e400ec29a0e8af1514c28cec8ce63f38feadafc106de6cb5b99a17d8dc8265b61ffc8691ede2c47ff8eb4756e66846579686f7b197373ff89a6139da89746805cddd41d204c707c55605d43ec356e58da6432d242dade7b6fb9a5942949196a063f06d1062d248ffbd427bdd32fe522e1a5dcf54b837932c2e8598b615a74aa620bbab2a8330d4b273b6708963184725011a3551192b1a04a0b396856e191e7b74c0559936c69cad314a7294d53987a8a6c8a914f299a02a35388a60cd529415370d8249cb4bea1cb0942454c9647b21c79beeca09b73869e23b11b154c919a70124d50601ff0122c252907c6ae47657994c40e7914b5d88d070894c8110394254a2ee0c2d3c3112f40aaa10a275f40d09eb8a01dfd782c9c182d32ebe5a1594db3374b2c3c51e221868820e418211c7010111292c4488e4e33fac1f183e3fe782c1c293e64f608be4f3730a1657924450794a72860a2308181e9c245142633c68f162589a669f4c763e144b1f2b2a903ee88e011d3cd488b0cb73d2ae2894c878517407894b117300c05bff88147fc62086fe1bd3d40b8f75e4d6707c6ae9f591e4101936fb23c8ad203ca531e45fa52ce49fbdea6d23f1b94b664b43aa5c2c8a3547c4617547d46eea35a7daa1955cde8ff8faad936dbc2b448e7db46d2921a29cfbf73faa55be56c5739db69defd34ef7e1b8a4b6d282ed5614fd5614ff5ad5032724e3aa59cab2933e7b3e8fc194ae7cf396773ced89c47e6d0143293104da129e79473ca69829c724e39a79cf435bb9dd6ea3dab6ca7b556ab7956bb57bbdbc6755de7791f2a95f29e29540a7ba9af0656ad54ab95f75cd17c2f1957cdf79ab1b969dddc78cf1bd55763ae3c09ca7caf99658b352438d39a69b5bc67ab86feb4763a6a3c01fca4f44e7f46f3339a1f8d4f8a916ab602ea9eb1aa6661542a6a543f1a94babbce0fec4e93c50ef3d900330d37a79647456e95d367a49af94e8b6854cdf24cf274ec49fb34920ed7f1f414260c18305fbecc9f51b01f40c396b9506b4680295934264b6fed41dde59d281f72ffcd5c9016a28a244f4a28282594129a2d3d5fb07ee99dae4c95a97ee92179fab9a0a1ee196b8fdc41dd3339214e48f78cb3471899599092aee2a8b2a48d8a8a8333ea268bcc19b90fcac977fa3b8843cd646ad8a8c8ad248f2827d44c8648f2f4a3661e24796a2b735238a31639a3165b0a6a6694fb5340dd330b8372423dcdf72b33a3a17b491bfef55ffef56fe439bbddf35ef4ab0dda547a4f8a1a6fd4af2ef76dabdfd5aeb5d63ae545f5bd365ef5032d727defce72366abc91ebf7baf47b5150f2d4ef656f22a0bdfd1d9bfd5ef546d6be1795f26e1cc775dbc6f9085af8f3e33b1b573b97ab2341b3d5dbb65a3f8539c66df4d7ae524a6bd31adeed7b49d9715f37d869d3c3d8fb46d0de7a1f095a685f32d7ffbe1064ae4e29a52fda7d36ea7f35bace03af2ed32ed7308539668ec9f495bbfbd5d872f7c9fbd550854cc3c63eba2e25bb6eac61f398174e580bbbfb734ce67ea449524a29e55694bb7fce39e7eca6dcfddddd7d879adc9d6a4694d2ea54ab1dad92dc2fc6e0fb9ba77d2268d9fbee6a7fb3a63de8fdcd5efdfe5ede77ef9f0dafdf59685c50ee9a943b1c654e0a812ca350613eb79b1b14214a7f7ec0b4eb7460a84f654c20b8983f47c42de186382515491d2277fab925b2a7c620c52ad422924a4335413d528dd42295481daa43b821f7e16075862a43155263a830d42052864aca58714335493d411fa0a5c2a919968cddaec675a8cf6b7130154ecdb064ec7635ae437dde4a8553332c19bb52e114457d5ec76d576bd1b46cde88d88498621c8c83b9cfc8156db014914b29a379f9234e09a58ca48252432d36f782dce9a701391e7287cb21450ea8c517381738205206fe7eee07e7836b41ca90f97eae0717c4f14805b94f05f21d16b81d9c0e2e0757020e07072465544f050929c0c8cd90fb39a13e40ebfb3b4cf3299a57ad687ee60338db97013fe0ca36cc8126ac59e48e152976162976ab7ea94fe4fecad404e8af4061059a016b5255923cfd3260d52279ea96ba54b9a4c0ba040aac5de8075624c9d3ef81f58ae4e9efc08a45f2f45bb066913c5556ab489efe0dac4a489efe0b562b92a75a0da5bdcd34606d81b58bdc692dac5d244eaa32f799b202c928c8225799fb705ce52a57394da3dd5a8852011057274ab4825d499eacee84e8fabb94f46f97abafd6dbe6dffe4dc32b7952393ef38d3c3f1aad1a6b7888432c79be17abfbdb060d41b0bfd7eabef63bbe9b08dcd79e84ab71e1ddc2ebdf4bf59a366638c3c63f3535c225e1863fe18fef58d46bbe7cedb33143aa7d2f4f66edab31d3dd31626c5ff8a20698fb5ee0362fa7d94a5d3687a21f5a15e6984c027aa3b6e644f752e23ccef9a2d95fca2b25751a065e3b77db795a57a9267586f0c8ca7604d9869e27b93ae747c3378f4a19946ede95f128121a58eedff2cd14fc80881653908b8b484d914a82ba826281f342619c2ac80d57305c44ee97a92972bf4c25c9fd127525f74b140bb95f7e2ec8fd52cb148411c3e30ad612923266d3e611e9a070623826ad20b97f32794d5bb882794472ffeca0e4fec989c9fd936392fbe7c625f74f9b29e8628899980bf60ea1cdb41aee0c11b9bf5de86e2ee45ec1ee10b9bf35ad86dcdf5689dcdf355310c7896b667368b509758206b9df3bf6a3cd91fb5d0b57b04a9dc8fd4e67c8fd9e29c812028f2b188ba81d096f27cbaa21f7d3990d1d89dc4fbb75c8fdd452d00b028f2b984cca985a70e47e192029a3ae603255544c9348c5f4e3d492fb6bf5b0528d7e09057095f5ab62ba52c67cba5231e519ae6051f0fc71b56d28a78165d9c18d6db66e702b9066999a9a2a7d400bf08899c0249184f444062b829dc02fe00e83673a6cb23cb26282bc657964454811429dec523de0d95ead763f0668df02fc4a9ed94e9a86dac8c94926d158ce0f393fe4fc40a783f427b8e59c1eb0d768a1501d68e514480094b1bd914968915e5a34410d4c1393f52313ac6d3441fae434bb3f41b73f95f4d29cf64bb01498a367fffb68d849420923aa0163eabbd94eabd552617b65eac0d185b85132cd591e25d33889b49ad303a6df1334a145fa394db064aaf36915c247747200b806e59b692cd3ef727ac0236d80cde38d4c5ba4d49b35c8d3f0c456324dfa26d4099b3090020181de329f4e0d76ee72c4d0bf41b56d732959def934868f6851930fb59153be39e94a6d468b68d12cfb5fa2392d535393bf26ebae2ee443fe1a903b8db5511b39657f0ba3d4674e4e4ab27fad2d9326d154d2d6c1647f2b7dca241b7730ddd3efb1ecaf4919eb9ebef3ef0cc58329fb7757ca903de02dcb0ecab883be07d80ab25c2d7a0e0bf0289bea674093c9b77dbaf7cfe901fb90fd3b973cfe394db0e7db411d986ec32b79bad2c984a5cb119323a6ade8b0023467607a29c98d9ed026b04a74c42af1438920aa5571aa12e656994dd1e5c0ea3c40fd7e17ae1ef65c2e705cc628820433a992822a4bdce6e2097f5085471522982c07153132a7195c9e68810a723401d2c4087468c18f254b6449a20a9725203b400942a905463ea42081022994f81266c9519125ed88bd957aff782c9c2a4f6022628886602b984a182a60a82c51416202e3249ca81ca1e203152646e47cd12328201df583beede4d44ede4e63c7183f70721f24a0a5a02f4260be30df53a78309a781dcd3679443a406e5b1ce5c3a45b568b206724f9c131378ac33eea9ceba87f650f9bd280a484a7713827ffd97bbbf58acf6a477d310a7e64fe956f268ee5ac5f8decd7de75aaf366adddc31aeff92d9bfbe3fadafcf467f8df992ee35ee57c31b1bdb0adc924ebab09ad6755aa775e02866cd7eed728ee056eef79c22b80b47edbbd9badfbabf61a875dd77dc7b524a29a553d6b49f73ce39db286bdfdded75286befee4e9bb2f694d25a9435ed6bb59ad6853935e4d480fabef740fe507f5fa947bd7f36526152d61ea5759f365a25591b3d296be10ab28c82bbbb5027d43e5764028ff8b6485d1ab0b197fdd43efec385f8912459ca981cb2d6badb25b2c7ad92ee7177777777b743ee63dddddddd5a77afd6d65a2bfd4ad3aaf7e975d81fa21552997288e0517421cb4181bd3dcf531170b93ccf59acfba294865e2ae786ef4559ac96b3bf176e516e360c691016cc1982e7091ed422fdd162ce103c7a50a635a945fb63cb6673ced9006d6ca25953acbb9b7e37c5dcbd299629a5b5d68f868f3289863b9863027c7f7e776bd4bfb96afe1ec895860725c0f3bf570d9ebf5a3876586326d7a056ae61cb5aa4e1fc16da883afb5d2a27091e69b6f946b6d659d2a53b97ebf7666fae3fe7e76f43a8d54a2a5fda0897046b3fb7b6dafa79083257b7d37eaffaed59cd82734cfd2ef580fa9a779b1b8a3e75800d3be986fe09e18dd94e6b37ed0eef3bd47f4f02eaf33a4dd334eda67ebd6fff8adad719f4191975777b0f0db9bbd34929ad45b3a8563b8382ac36caa4a41c2398be954fadbdbf7920dbdfb8700b67f2fd1a33337926dfb09d344ddbda4b3293754f2bcb7f6a89bb91da47ba0349190ee3ce649bf9f63d1c69501ab39d56abdd8debbc0f95c2aa950c6ba645e3aab11969d4f0c6c19b1ae2489eb982455e72ffd7d4e5869f91e4e97f61033c72432a2a94727f46b01679862aa71737c0e34a3672aba7dea9afe3ba90dccf24d71f3f21f5476ea89d5a74587ed9e0d9ede079a81f71fed195bbcfdd07b9ebc4163803b2401950fa8ed7a1de9b1985fa198d3ff5ad54dc86c35438273751e0cc9cfd723fc8f7de0ba37d5c62ff65727ddd5cde1e0226b88f2df2225b344a265be4b2455b68997474c0e30cb241f68b55f5668319cce479f3edf4bc8e033d16f0ccddbcf393be5367fe7e6cc3cdc4723db21199f0067ef209dbddc20ef6420c1eb98ea87b9c6a3b714e307aa7d6d8f2168a1dac4bc2d4b59644b441cc27d8d76add8098bbe9554dc3c9dac8ca9accbb8fcc4a15e2907b2fe4c42570ea51ffbd0f76f1382eaffefc68dcf07652a43a7cb194af38198ee3388ee3f0a7be4bedc033639427138e627ed1a842d4d7189cb9e79c42fc473fb5934c7d318f798c0bf10dc71879c4b7c268f2f61ef37b311ebd7bf458eedec2d4500e0d78b4b3d9ccb586567f865f3b4b1dc9fd9a6cb6823339ec863b5185ddb091ad60d3013187c82385848531424ca92269888603164c86846cf882021b805c6084213f4ef0821fc43449216310020c2ce040c41339a4503212c40e43d420c31020bac8190466a00208103f9ad8005300162650207d71818e235aa36200537080a4ca16237ee800827c79819b2b5da0cc40830f2223f9640224848c14e99001952e4d607c450926454909c6ae6f42e9871c2f78bc59e678c1f23b1ce7bbbe37daf3c68697d056b674995b64ed2d27b42a113184f884134dcc765aad7637aef3542b99232c376081a145e3aaa137e8726c80e77b18982e282a620640e00c4e48b628d9d24948be6568550495e1a16e09b25c159a27c5dda2d8b82e9ccd5aa2785a62ac2c8fb43041c96479a48588162058698c4a6906577ec8784858f3bb99241c2dd414341e142e8e4bcd5116249b569647599cdc1c6519b2627ec7c2c3e23493e51116265a1c61b9f2f33b108b1033591e2969e940690a38bf7be149f0e88a979ca32b4857a48828ed852e670678be97a39b43c47a00e1436de43495c8a40c6661221a892daec42f78bef738701079c4b19940787479f70896591e5d39c2816e0ae1c40819cc44e8e677bd35d899abdea5b6dcb514a1cceb966ad56b905b860fa52d5766457030060409ebc1ca0d6690832f47208c18480c358dc4c3d5a563c07243112c3004510a62338526c50d14f4000490189ec44008cc0d2150406181131eb818c1c11625417492b6c4909384c4e3c58c10b41755f02acba3a422927888a1832d412e8455b4004af1e3a3e8d1a24b0b2c94585811c5059c988f1b26426cb41089a1c6b500f9e1521ae3028dd20c845a2f9a242d41f283951444260987d06a0a175450fcc05c5a4821f5403999e1d341062fcb1018ba2c412f704cc8b061b982e58817b008d143498b0c4a53ae5041e48a97a12b4840ae48094a7aca34591e6df141e9471e638850a6ce8e51ccfdf983dc2f6fbf8b892826e08124e43eb675846817ea47a3439a023c7fa45a77adb556dadb4743c70896e148f3c4eec5881c438cc98982a1e0f9120848f22081e74bfa34749f73874e76a96e903a50ce11e168011b74d2c5d892eddddddddddddd4dab6dadbbbbefd6ddddcd755e7fdddddddddddddddddd3de79c73ce39a79c53ce29e79c724e39a79c72cef99e943d3252f41fab8e2cbfe2903db82b504d76d92f655390eb287a826577f77e927d6c0b1de9a12662d24a1ad6b1c909b5e82ffe80bda4d6622dfa670bead8a129955e922a48cae8f757254919f39daa208f5e527615136d09cd9c227037933cfe35a865644ff531d6649f2de43edabd18bb5cff2aa627d9bfa35f0d55926a49a514e4197946ee1965f7aa0fef490dea1e8f08d9d18013e284704fb820b8261c132e09774493a2c5b427bdd32348f654654a2909729f1493d45211124c8a922744410c654f3511caee7dc9ee4f412f69a977fcb50e554192c7352f898b491e7f0be40ebb59d56256d3eedd36aea35de73dbbbb715cd779ded779df8742a5525845552aefa942a53056a9562b99958c0c8bd59a69b568686a6a6c6e6e707056ac60d182b668e13d5bb824385e098ede956087b3820565c1c27bb2689c8bbab171675a2d1a1a97aba6c6c6e6e606c7cb1183b3e2a25a16c8144661b4c58480a6174658053580b1220324a2ac42dffc806315f39cfdfed51067ae33c41da819058765597b07313e4c718115295680b0b2c4458482ef959a36aded5a9d52ea5e3b67110a9e79bcf265f768777fd119a5b5bbd66aed7c2de7e868363b4a618e09ed0e2323a376ea95525b6bb5d6da27f7a391f364368bc568e43cc15f03b6fb92d5269d4cc66a222299554c3585324ea1b2fc9c17b4ac7bbe2c7f5224236a9ded23a90faba96d56b6f9b58f06adb5ce9738228cac7990b7cdbac7c2b6a7cb6b513bb985ae4b492d07dc5d4a7a937a78e527428c068273a4ee77ee79564a299d7af7cadeb6b95554ade1814763b6383f1a29cc2ac48cc92ad09fd94598c99486f6db57c383dc82e39ca3a8fadc57c3834c5ddeeeb17989993e4ebee0ed1d1bba954e5135bcc975876eced9002f42c2307d11670e9ca024a28c19c1d689a4f91fb40bf7b370b2f49e08cae3e3b8c83f598927c10b920464cccb131d2b18e6171c4de429cba326c0e42c8f9a88a2092f4c3835b1d4c415da84cc864e07ca9197264c3e6cf2c5613250972f79be045e0c9151591e75b17243888526805401f264086c00359801092735784296440b54481e3f3f28c0c1693882c869f02364e81e881f1c38948a6490054a0b4848204ad00cb0142c39e2881134a046d4e0352070380d3f382e13429eb0e18921978c7ba2bb654e964871e2048f143431e3871478a101081f3754717bc45cf35c1e667537ee229072b70b16f65c5e67d9ff4e72b7c7f2986860125277c041882342d38791a422745878c1e588e9051fda9323a6168e987474d34a2b0dec752e9c77413bea6115e8c0417429d2c588076c035e22881c5d82f0f084b4450aa01d3964892226831210f9d114030d4438ed4926c1800483199e4ae025073788782032c3e10a0e4e7c1063e4c763e1f4907643220897262e4be449002e397041c285ca6fc15c9e6c796a6579c46589621d57fb09a630c7805daea0940370ba83476b786fa6fe20507003bf771aa7c5c7c92d79fa6f72bfdf641f426749dfebee3f79461f21b318036aad4804cefc2cd664ddccf271f1392b1051f8c9b5c6d8d2752949ad8e126cc3f1c776f76ada4b6b6badd74a297dd1eafe72db9dad7834dbd6e06c87631d43c828fce47eaf425a95b556116aadd5845a43a8b5d6ba7d7d134400b78fe13b9d0029f6cf0065de065cf137208be7c0d5e3802dfe82fe316658ac16275042dffc7c391f46fbe0703fe74fd923e2c07386acf67470c0e394c54880d8627bdf8ab7f91d2cfee6518f3fd4e36f845901b9d3df6b1291627f05a4d8effa9a77fd9c35a1cd3a38e031c6cdfc157f03041bd0e65b3c0936dfe2e7b7b8f915e10a2cfee65758f1367f038418fefd9e0e134cf3feadbfdfac9749618ea1017368f12d30079c6781f349fbb4f8fe89f3333689dc87c5f74d7d06dce7e61b3da35eca47a95eca1e0c808c4370e5da0a67a414591398e14865c016e00afca0c55a7f05285d058e53490726388978edb2df0f80e6b1cf811fb4681f0784d13bf66fc0eb3b7644e1a7c518e07176c9f7bafa0ba26304077941275d883062d4bc7c1728001db9d381145d0208000f0c0078b023ea4819f767e4bc70d14108c65c3f7ee0fab1e700aeefef58322b154d6be676dce67d388572cd88b164562a9ad6ccedb8cdfb700ac592597956d1b4662e4ba6f34a65c19971cda76a1ef57935dfdde7ee6f37cca1c6a5bdad7169a1cd15a4526cf5ad42b7ab71bffd8efb1af7db93c06d57bb776a5a5bebb5524aabbb6d31d66d62b5a1943c3586ddd2e588d1c101cb975a971f591e2d219798794b302d81f4248f942e31449ed8970822dba0d3b96109ccd29725a425294b412c35594ab2746469c796279d1ab820911d7069c22587a51f5c90e4f9d76e40ced9ed4e69add6cad75ac2c812069aa6699ae6c2d968a59556ba8534bc4058660fef0be6cccf6c65ac70bc915930d58fce440529f68fae439e373f7a129c1ffdc88a1f5dc8e83f5c474f5752f3307a667e8c11769080192df063b84f07a11715197502648f47b917b30847bc22c409c70f471104fd41ef22775aba2c8aec712b45a0cd6e45f6b4bedfb3c89e2db2d5fa9befee47e346bba9594ef75a20cd2ef3e99e5d067676590b9cd9b348ef220b20e500469c99fa00069079290bb0d250373fa35b2d50cbe0df84b2b30167be069c99f99aa7a199b133343335df4d2f847bb1ebef267324d0936a404b5404b79efb1a90655403caf4d780aba61a505504e2195403a6b24e113ccaa41a1095758ae0991f5d9669fe669a70f440a6f91af0cb2e902604479125038efe65f427e40d723f76190afcc0b10ad518912c090ade6e652c3a35c59c33854b2bac3fcf1b2a518bdd5721f74185558950ee5a7443dd3a2545bec38552f26cf651a8b0ea14bc597e5eb7a639622a9420c2c4ecaf82066c2875f78237e0b07c82f6f6b5232d3627b9a17aef57f065ff3e0af55ef7a4c23adec855044a7255fd28821c720d47144dfd8cae31edefc5b8c65a64edc71655e5b5c83854397df8bb4efc9501f9fe1c57e0867018428aeb913f5045456e282cd327c43ebd2bee29f7328afbdc6b344b1e6b4c4631a3d4824191fb6bcc7dbe23b9d35f25e64a5f9bd3a8c44db62635858648008000003316000020100c090402912c89b340cd7c0f14800d66884068583618c863a124476114833114639c01860003883104196588ca800060ca2805e4112bdcbf57f8c9e468645a4ebee14164e3a00d88d866473090a756ac0482e8dab7f3c3542de536800d3e8200753b9a5b62c34cfb79b872a498712fa8ba413326f91c484690fb50948dbf73b175740ccd6434f521153fe70c891477c585cb4dc31ed30d723f4a1ee24f432e506fa8698c603f696c934ca0d94f16723f3e29f0b21c39eb48527ffb6f488f45a14ccb3d0723a521ec8deea3a47c0e2ac4c160041e00644e95f8eb3739de147bcb98d16bf7c9f9b9125b88c40f24c90eb96b24d124629b16e65f50c32246214bb1b8336ccc171fc6476991f2bf5beae347dbd88ea3966c3d6d7ba005b68ec1a71ad65d9da9044737a9af686d93974b2f5a55414c4eecb2b650b463115bc9cb0061266e8d288ae54b991df2ef9b9a206c0ebe7dc51ae10213f15f484abb464ca3886dff9b1fe1d2558936060dc6899fddb132b7ac47ab299670e620548aa13cd675d020f4b16ef77c15ee9c37eb5728632f624f051b2c40b18f17db1e92993ef3c04a241959525f44f9c802479c48780cb4153b75ddcfe51093ba308239198424aa32a5b97cea4a6f459136cb5e9dd753fded85c68c1d63fb7dcb6a5c5e6e6b927aa4ceacc042a6d62aaefacff527a7c6ac6830d7cd93a8cd09ad71bdc7ef5be3bb23b439e083d30e3dfb82eb27231804d19799a1319fbd277881354b30bb5093aea290d97a7c5419535d40f3f6631a2aecf3ef4a9191ce860ea44d86581e53a98f059d9de6563359bdd365c1eedf92c9dd241dd06213320324d6927e0c6c54945d620c3bae9e02ffe8a8a8061727e1392524f29e2a05b02fe0949787c64627a6f8d4c6362e0c711419c2d05f7abccdf5c3575ba0811fae739d0a256043c1c716f098e02f7aca805861fa35c897285772276608b30b50ef48ef1ffc07916473620965eb4ab1ec21903365550ad9bc75d6aece520d807b0ef4352e51c10fd5170bdc7df0f3978125d60c065dcc2278a28d6c669d23c97ccc997e97b415a7f558968a32a6d2609fab5b308b7c132a3e9b1ae7adba398f2cb28971c23e79f6d989da5f6cc295cd632bce5d1de96188b0f2115bbb14ef6e9a0152e34e6b38a7bd5855a567cc82d37305feafb432754f428dbe734a685d855133a2d80c5f8c30b6bee08e3df162dd2ff791f41c5b834162013a2c4d2a05ceae3a4318276b06841b0bc46f068b59b24e4b375b95b9693da445457a9429dcbb4f11486f7eb5eaba0616a106918b4df68fa82ae92cd8eaa337ec6c998b2639e079ecbf5adad84609b7fc29d3f0988e746c4835880bf0bea3e121afaca1745016df38c6c3c894b79b1a2d982a37e20ff8a9cd04b7b21ffd78427c352044a59e40942a90b2abb1cf3fcc3d2147b8945100096050afbf2182e550466821e6e220a7a0e0fabeeae8cd8125504084e6f35ca8bf7c08785ceadf88107828157417f88ba03a612e10b840a8bbca9ae0e7c4646a5e168859b6c888aad4fb35d25ff3c23c1666d4681beef2f6b7fc2d0b6dbfc11db072499dcc140db15726c3ac03341c31b1b8522539b652ea667a2ed21351e0a978732e1d03bf2d34cec22e120736fe6de21832450662987e2767544e4a154e465f42a032440977f8176ea24c61081530cceacb8af72c2ea171d3562cdda7a79b866a9424ed64a016354a7d9a6e367e21706768e60cdf8706f885efdfcf204af9db72810811c04cf5ea7d248c4dfd6d007ee14deaba4275793b3121f152e1322a03a29781886c40d4c2a05d98e37f611a446bd687d3afdbc5dbaf3ff56aa47aaf9860cc07613c5e2fde1e9a60504d019350b2e6e63d2a100d178259160d4a218148ca24b5a5263a7917424040f95146730f37d3700838061296ab76a784f35384b4e40c015f29ec320aff1df2deac5d289b6352e66033ce37790dc597fe7fa9b1de02907083cd0a939dc0bfb63b77962b860935445d37a017ec0873218291d8c113843e34e4b41765fff8a30c3f3e29ccd72f05a8f8c6605698e2ddf364abca32e776b3c26e22b92296e334b9d6cc92fdd458c78becc08c351f8b399258940b9450a2d237e5e0510a235e12522f6195b3e99858dabf8e87b7a03424dd5ea09c5e1c71f02d810d774275c09b170c08bae1122790c580688e75453543b9b863f069a9dc45dcfa865c4938218a15558fd0feb78852a6cb20604bb2ca9d0cd1febcc82c9a6db1044aaa101d3aecb8164e4a8137517eb606660753cb1cfd455bb98a19a18c27825d2942bd20da0ea74d4181838121847aec954a4ce82be256b9c4400054d52d941b515e59b4e75a7e7f474aca2d63ce48c3accfa9dab35d2c3f4d9b6a7c62c2e81b882607217df151759ae02882fc891ab0a0f8f5315dce7252bf15db21e530a1099a235e82d5de1c9bcc05c4eebc40c4a724c01316d216ddb899a907a12c9a7ae3cabe52c39eb4a037af2751ac5ea9992c56ac9ad033764cbf6886068bd559f38faeb4128f950e354f10290e94253c0c0ff0061f454f959537f54a06983dae662cc24b8c458fa8cf523465fe7234095220ef1b921bd2d8bf5604a4c98d35b6f287edeee42898fd8387583caecf0ac0e284e5ef9fbcf4b51ba1be82b40cffdfab308f0198c725e0b745b4f5d7a85b5bac36f04443b55ae6bfc7cfb00afd333b5420a4198d3345c290675b2b0d42be96a76d85b33439642d562fac7082cb46702747b92b797a21536d6e3fb05630891c3b13b9698fc65b35ff7ed62683b713b970528dd56dcbd1433d8b10d6aa77f6348849c2bbe076b92083117e3c6e454454c432269017ea95d19bd813242648d62f8585a8fd92059deeb24be44fa6fc1c2136f47d63d9c835ee4bdf53d856b433792cd719960a5880ef29e12020715c46a89f96e06dbd6932712c4a66835df537649e8e2a175c8319cf8b06c6d227c98b6a9f54f9c4105841e6d764949b84101de421e1d6341b95435e221c857358e6c0024e8a5c0628576a97d495d3dca868e30467b88b72e7e2f7772071ae817271ed87ae71c2922e2b815c493e03a4de8d7fee4c2b74a0534bfb90be6eb361285e6fdc263458b770056ae9d5734b83e47d7bb8b7c8e88ac95f7aabdcbb38947d8d706c80a918021a63f48611963cacb7c619b7a92c6b7d55d26c7704579a562260cbbde879dd27e11e4474d5b69156fdce0c8779add42549cc20db318566ca7e02c2aea5417721aa5df10a3c66bb0b1b085d685c42d6d15de38d35888e75cab2eeb26c44c477b973a6ec6a8f84c28311a10ffecb238909916859c916dbda9a86346dc2f97215af99f5c1b3622a916fa9f42dd1f205eb07bc004cc15c4a387981675173571330df3878a6a49d3dd91ed784ef3f07b2fd92e0e4c9e87e579cbad00e16273bca2ec4e40492542482178833251fca483666dd8be8fc69a69d5d196a1186b57440485d5c0a9667bc9cd2673f3ca53d27e1c1380e56515fa04ddd60c11b3320bc094730bb362b56b94488573910cdb5696c9a0eceb31a136f9acccf14aae7057bc64bfff4f238e44c0db77769c4c9365353630f7bb09edf0d2ca49a12b6571d087a09a110b629915767ef6e9c6f5a4dbe4eab70d6dd8b2638583f9353b333d2a3db67cfc93b18d14276f9cf8bbca0b93d4d2af5bfdc8a3eacbff7a650eab897a637365cf319b5e7ef555e28ddf8857f9c0763be559f46d21c6acafeaa6f7dd0c1234364e75ee459ebceda783ecd2ed106810438b56c03d15d8b19daf08cfe1e798355519ea9d08fda10b5182325c1aef1ce2070bbc1fa4ea3a0e7f769685c8b327831b198c7f7a786f204d6be3dd0449e34437094deb7e7ffc5e48abe215f8451c4b26f5b12af45046a85aa879782e89c91ba6e2255496b1205d76ad1730f2bfb5672316be0ce0d69ebd01d88481254326829501104148ad25d41de95ff4e91bc39474446bc2ef38e0f89a2db9ec8563b9869d27d669aa4ad2685bf00bd2ed7af1af28bc5660a938535c99598aaae7bdb2ad2d23c9f708a9bb81ac4c118658ee419f4f4d56e6ef89eaf6c48a8618300171e716f1f74afdea63de8f3219afc00761507e6e620abf4698bebb79aa7bb861efda4230187538a26bc8203735583b5f120060d5cc9552cff2e4b5e4695363d44c154991f7c2bbb0bf9a679b845022b133534ce40aceb2fc8a8ec7d3fd6c4b6044dc9962c24f4024426330830d041c524208e657dc2be75515fd67a49d500677ea8b4cdad10f8c4e00fd07197453fe94a50893a8dcb57879200a82a9b03bd6a4ae118072200796f2e23402bfedec7c3a1c94201779a14d3ee40914534b74c4823677b3e7e3c988789e655d7f35630c4c03fad1f0f7108ccd8c3523a6feea74e6647879c4c9e2a7aaa9554f5121fd6141f10bbb1f0bb9f55efaf5a574897f3181630b177554acf2a669dd008a15501e65f7d90cdd86a8c421349f30f73e9aa658fc2c9c84949f8f39f8275307ef834bd3113918e0048acc37acde63d52e9ba4baf177860d944d4d7dc5248c406ec900f707c7a92df0d4893a80870625ecbc474b66f41adcb864d01a1eee612569de59bfd321c4a3659a948445852ca3409cf782f03559a3a07d32ed68721aa1be375bbd8c77c0acde0e326b622259d14b9ca43de706ee43c47c4b3d0ffd153b45bdfc2ccfd46526c076f2c5aeaa3515433079d0a670596ec48460f1443595510feab00bfc2af85cb590c679a1131069ba0b1b7a3533874f6dce49b9dfab1d2f69202ce4b2fc7a58b6493c9c6396a98ff608499c8e8467f815929c232fabe621a4e39371147cb60a3992e34dad20298f014b9122f357a567a00a568fd75f1623930f0dd1a8c0de27b214200fbdb01587fd87a8ab7c8acb782069b27901bf9feaa15882e8369bdd85a470e1d0c66f98ec2dfc9a7fb1dddc9607445027a8a4c0c5fa9d19719c0ebb2bd9925ce39bc51ba1f7743121ab6f4bd1858b994c83f1588917f396d1d5fabbe66a2da29d5be99a0596ac8fc35d3800b986da0e006e2af0a48b6f8badb517cecc07e83e46c0cb692082387ea285a6c08bb0e8c3b7e483c0559d15a50c7a949b432ebd621b0af5b18220f415e30cd41c41e245b43459da8bc71b89f68f3e81547bbaeac402776b4956546594bd96dd730c9063820bd52e5840b4ba6d60c2fe8383a5b43c23bd08db0a88758192f541a8aabd46d34ec26cf02892002bd69045c32d785debc7548129495d30aa7cbb4514d6f4097369b721d7a03fa8d1a0002d0763bd02a945c181d94b55509d344b12fd22405d224812020953a589c60d17442af5192c0c8ac8115fc6dee807d1af90c2bcc0167eaa5c1f17f7cf1e5bafe2c6905b2c351f86393d034258cccca5401b5ed1822fad18da83f5ba1048737945155f078f8072057c960b777a45554a654543e0c6a9f821d28ef1fb6ab851a2c2557d0301ab1faeda578774dd644cd78f402bbe49f52b2e226da7aec539db427ce842a22f394a25e5c56248204a5c08fb1d39ce2b072c48321c3e3ba04fc062935c8a0bdad95fc83be478bf31035943b86068023e302403c7c41fb7702d21a96530bcff7106ac7c89a02b84b07fdbd80f642e78694bff054e43c6a7590addc3267ed0b3f91733b93ffe800860c63c9144b4fb6e7b53516c56e85a16aa95b019337cb6390f5c6b075fcc9f312385a1319104841bc992550baed9091459126ca61f7706ed9a824ab0c47d9205b19d4377a4596ccdda941222d8b7cff46aadae3f625cdb149b82a8264adb106c24d97ad641c8344589fe0426b2e3be760622dcc5aeba226d587b54152579b84c7e6a42b9ebd29e1f52412df92c410d99ecc00457ae97127a52294dfc79dfeb34cd1e20f5b3e2a184b226805e2173db572ade2232e353f96be06e74df2c8e7edd613ded9e252f9f62c2efae566fb9c8f79cf362bda8928eb2fd716953fcdd068b295cfc96d8ac22fa125244c1346d6e4eca4725c01a75467d90c55039498d75204a41cc86e91594980856185fd82b61e40d8dad25f899b4b6dc5666155375b8967746fcf63e9183b1b2524b1a26559463f061b7a4c0d9a5706992aa05fcefa146a5ced818932f9df63759c7ac2b234f4550ae1125a0333a8d12ce46cd62432a266c105834da3c83af606a43c45f9b5d6627774830219cee0dc10f706b27ee6d469b68560f0248692697836e2076502353f30642bc75a18aaed3b9a9d1e85a629519e4a383c45641146c21e15fb20d6f268346b3871d6205a8a8616496bbf26ff212ab072cd7bb8ac8bf0faf3e51cbdc84b808f5f2478cdf7969ffbbc751fe70a2c5fdb1da3dbe614ef596eae578e2a658d45bfca7e1b59ff7f0b65e99f13807ed25382de052b334a090e4eda2a2cdf7b5d3622db3586643706d657526fe9df489b6dc5bba7bd1a2f2a7dd66b01672ecf5111681a8b3dbe28a4223374e5b23e05f99e9e6dd944420d55aa83a03695048b69160dd8abaf544b389258b95d55870c33780d3f03d793c72079a4c0feff9bdca83d40331bb5d62da21b28badaa818d2681d026dc3a6d0dd6febcd132112a345898d1a4254424a05e0a50185ac635e426dfce2e15e5db14c9366ce9d56e9700637262d637a75cf028d1a3f40ce78a5948c2e94105faf0929b13c57af7c228b73fdb31f5e36a7d83018e50739d883b5349fd285e180a0dc4537162a9bb9a574386670b149ece19d066ba5a20e3eafb0ba8fc50d45157d458b094956e7e0869b35035a6cf822d4510403f7acd08ad0fa66f12d956234c4bbada10cd2619716ab0bedb98c0d93c82842e185d63f06efecf79a9620406c24c4c4680c95ffc3bdad37ed902504456d42fc00589c21aac450d49a652b87eec30d289969064f2f445944142a4927b3c373cd4ece203b096055dc9e37541d877960ae1c82f8d0348ba45633b5782310d3a0d5aa027897d4c3510baeca6ad79be06ccfd7b5d8e1912a46a5f05fd3a07d39f517890276429b77a5c700485e6b16057625331a4a910626d6b271c4110b4e721909a35be82bd5ab55d825a70fcb6e128c870596b0592cef20d3bc12d9f01582acf2b4f342005a5e784c4d57ce084cc5c9562275a545a5e50fc5a7438d23c96d034fd614a89362815eeb4b13f8c74e8c5b8622b0601aee9460b4dda85fac4c13e8afd68c2d3a2b217d8a2e3cb2b92b46f9074b63c74cbc6a7214aca8ed8e09bacc8b25b272b752b35a380ef60213b2564df5248c572c6792d0bc23d0fc6268bf05e65415a337909cd15f706869abbda9033c1473991b99b7db79e14b12d5c50f9698f1cb9f8ddeb637dafedafe17a85cc94340123c1f86975e254d59c2ca910366032eb5f2a323f20ffeb6b21c5edc7c405ee0546d53ad557f97ad11e6c4071254337f9440504d97a9c64c2d8d6c5aa384e9937d8577071a6560a8e5775e2a669a14d8afc0738a7d7491791ba5117ed1e8e7bb56e80e300aad80379fadc749f0861c499e8eb2e27020e4cf406c8f06bcb602016a67c10eed90146fa06d0ac88409ce9ddf1d244ef554d59a81cf751c7f5b04240fd10ed855b132722fc4b9d91b6dcf03828ffd7a197d4cc2bab2030aca6f95bf5eb4393d272407c161858c108c107b9cd85d3337bf43f2a1ae9e350e3a71163a1005a6717a0baac829659be34b354bb718607e4f4d17ae542c0343042793e22dd5ad7b438a913b9aa8ae1503a40013392ba3c5be7d19b596e6318837aac860d8421cd0be9a108f01273c7576dbc526dbca825638a16436551738e1e578b983d297b87789588bdb405a9b7959009d379df6b5fc27ffb0c3f91096a31ced8ddf949541df476f00751983912114705f2504338d56a681a7deafbe4e6a914728e8d681f0ddc8e8d58039dc3489908a6036b324bb7c54985bae8007028b63a788febd15ba83eba3d32be380cf0e4289fc129abe116f299c803b37c04174a2f1e5c17ada2d4b679c4466457a171b880f07870f3a38ea4082fa60781f3d6450bee8382b1391e46ce2a3c0b8c41a54f53f48e759c9785705a125bccefcc8c016d7b51778d765503ca99b0577762b35809240cba8c5d22b0ccaf8b7f933fe6fc5457eb6609450f823c112219a51b041d64d9ab0ab612ae3d6a8525b275b57d8ad808bdef09d1b7b400ae3e3b5480a5ebd662f1f86a32c0f6bb2470006d0c9916a34c02973ea250d6072c3bcdfe39fa51e069015616b23ec98ec9c989f01ca88c32a5cdfd1520b8487c69d9cca554351a3dd376ac1df314e031261b2195424704cad9a5beaa65b59b98210b71266074fe5f8a4e0e7fffc40c2b61c62aa8aa8cefa8fe9e8ca9a9f39eb9982cd5f7ef13335b2655a6a86d0a9f17f8129395098e44770868d9e8e8dcf5552ef0960a864ba8883f1bcdb36682e2b3704e8fa598fdefc3005e09d7b7064649d1f50ef15b51f309babb8b9878556ba961d7c25cc3787fedde98727943e95450d3023f230524911a25538cc9a4e8f6818a814eece236e1875e6696c65ad92bb91ef66b163a670ae3224084077b1ac9195a0466b121c7fc47496a0fe3329c869c3e78a330bba28eb716a1aa67dbd491999b7c86df7261bb3c57bfda69655405b341a37329974b8cb9b377189dc9b38fe1049e9800edaf030562ea5ecde545336ed67ed481b3773f1be58cf62cfc2dd22bd05ea1525aae60c4739202a700d5dea2228ac081dff7ff09e86d3eb20e38801779e15d77a10c16d4e2b5ffb60ae66e2f372d2de55e3e896489db62223b96debd97a357dae1735bbd87d9d65aaa999a91e8d60e0d8bad7348570110c1c81311acf661d489f3277f4b8d7a27cb2b76599104236ebc978a17c2aef97345cf296107edf341e559615d620fdc089b73ee2d317119089b8e2cc96865f9eca2620bf75fd968d8814cdac34f8f3b42c01f2afdbef6c47a4989895165fbbaa7f203342e8ebc9540289192f82869cb287d09e82082ae6b392934e652771a4a1880127bd3f1efdd2f3b94d628bba13314df9d5f5176c26ba4831a5e38be73208d47f5dbf631331459a291d7eef542681e7a78edfb18998e23db53cb1aabe7335b8947a21ff6d0ec8ecae0696aa2fca54da90de4680e6d047be78927123ef0bff5ea0abfe2f6c1a111545241eb9e57b905d21be8c134e9de3a8f4481475aaaafc249ef88851dba52e12a170a644fd7d3813417ec02b471f12e2a56ab882f5a71ed4872c8e35b704367c72ef3bd66c424c0c3eeff45c7ff0ea36f9772a5d9fd4ec53529fba40fc8c9c553460d2652cbbbefb7210362fc441905a31b4e5e108d1ce2e4337b2e7ec2d5ff5e14d531a7039226ad3ae2f7721454b3aa6dc319e052a94b6c8514dfd5be6fb6ec3f600b8bf7bf9e9eff31bf69daa8b7d9fc039989dd2c7ed6a80ec207e37767ca61b23207463a59e36d84d940fa74851e52a1cec19dc5f0d3e79b1118486a985f07aa17eb2d7d49bc897ba753c9a1cd6a61baccf9f10540da614eee0634023b4f9551399f63e912972d2d6837ff866b904232e1771c4eb1a4875f1d7640b0b7d3d01879bfe16f571d80ed7107955c1c9e6a693d5f0629aef5a7163e9eb1729bd334fd5df9552131f80d9e2686b5fa891a3104dbdd7b39d3fb4bc88ad42a57a3554aa5721a57a152ad557a392b312292d68a554185fe9d0c2255467847a3a557df3e3d49946b96db5bf50af40251ffa538d9f5ecf2035d97beb8568052a735780520ff5f4472498b6ceb8da6bb41a29d7ab51897b059510dc9352d519bebec66a140757fba5f82a2aafafa2f27a052b7357400906793aa50af3cbe99a44096bb5dc3b0c6e52c038a4a934c31caadafd19ccdaa7ae2af2b0821635c957516c2a2ff838d02e95f11c52adfdc810265c3bbdf49e04f58d421832d92bb4d8143e621021bc8362be7b26a0ad7b1dc8b4b456336dc28e7d496f2f630f5e9a69ff3dd4f9f0b58d07cbfd6a69601575aa817791d9931e52801f298a656164fef3aa503f3d4d3ecfba32a89e202257ae8c18268808dd56867b1344b4b856c690cd050ec332e2b070335efdbeee6428e2bcb71cbfe8f433df4a7a21843b5e136f7298c2b740a7a0bf00407e70888cf985a4bb1c1eea868398a0ac4061ad6d3652c19b2e01eb97d9894f19dc3d0f8370e99a53c35d83bab486aadbc38bfb0989b6f1400e4b5860f3f1d2090753247db4a6c7fde21b2b16926d4bf099c1063863d79621c74fa3c2c53190906fadd8b08f9740640e037961c546507ebe9c886322c30ed811862a4f8197f4e340326e5af80a85bfe3f3f0e9e672aba1ce947a5de018e31c3d369b8a814f8d28d004801f102916b67f3138fd21ef237354ff5bf9d1a27cccb19be92db9ebc2aed649607a2431c63e473fba9b5df9a286c76e5a03df1e7de8e3cff05329862200f207e52404b0cdd2b9f2a10f268b1af33f3ebde74240e4806571c1392ec7a765b505bfb2801a58c62a26c17b84a1d99d6033795a3a64fe00fdba017e5cc8bb0b023fc3f1cae3b893fd60b613c4bb29c4bc0e0f47c8e6895cd6d88122e881e25cc98b1a2b4ac05feab897185ba3a152716922115f7dab8c58b28242e8b74e3414a3c6d538d7dfe79217a2ecabb74392db331caaf11ca9a4f067b618609f9416f6501a3f3a8643809c38f5f6e519d9084289f6614d7da7f709cb7e32be85e86b3f165fffe3b3eca2e737a8453ef5f812c3591f36461fbca4f85e0fa2155d9ebfccbe48bd4a5f4d5fa3d4cb494fd43df9e22c2657cf8fed0ab0f3ac33b3ed4f9d1a2ec903775156f95900a23d38d47ba13228e4c6dcfec1f45b45b03962896265bbd544b7588e360dcc0159de917f0c59b1d53dc32d727b77c35b8ad24a46cea266e05106b9459d33ffbcd20d8214984ac9780f24d86809e2868b229d5a431c0a114a534f0d1e95be03cb8dbdcba2f5250b00860ce21d08a25c1c5ff0c172efbd9a1f97851ebcefbcfb1dd546389f65a7ff30e9c1b0d7a9687b2b9ae9790b039e10777f68212d4c8e1d3a96ee1f13dea1e01735fd7182367731f849b2c41c20f0bc5146c75352a1468390fb4cefea930a49b37f3617410744608cc37b6bcd2b1ac29061db1a316edb8a6445f87ef75458451efef8538bbd293b21df778c1c3f7325a1be87fa0e0084fb32f452d58e72510b5b6e79fcc454a2c0202d86942bc1261c6b5dbc738b2807def6cf0c963377eb7b5c6a87bbd36a036402e17853830991812a7ac005b351a160a9c9c00e4d1f6f2a73cccc6c5813744fbe2295932fa6c85d0bd349b0160937fa24e0c883117985a76b0da7f26a941e5cc7785e3bbd127a11f3adaa6f7989be12d908c760a0706533a0752f6eb00cf7876c4a57f1166b79445548ba3e9d58e5838eead1d87bec329315b70dcfcd75a6dfd4a59d98773257b8ac245adfd4efaf8cabf4571644fec226c1e4c274020ef4ba180771087062558117f4490814d4716bc7dcbc89a92069d846158e494875c238efec61d875daf571511f3a5ab597ade159d25d504988d0670cafc6282ee2a56d4f189639b2da89bb37a9cc8c62b6d5813f8f64af12bafd48c64daebbc44294a168f5d43ba6809de26236220ec637ca768fba7854f6f1eb72e58071bcdbae1944be2fbbd5d985f909a03a0c4ef51c6cbad78df43ae0e4c3c3a4d2e8189295d5ecd5a447bb49a3ba2b89199b8e4aecd62c3f3310059336b0f57fce5bfdc8d73c55207f94a88672ed024abafc524a041817d3e49ddb1f27f9d660801b5b7844a30aa42ce2f614352df815ccc14cbea1efd0d4811f4b745d11b7b97424d316a03a5ca586af4473b3bfe50a2be93aa5674a0cd5318251f9a4e498fd5b45caa236e11801d907a006e6e82c2f8d86a8ac2d247b0b0cc74a6e845034041a0264c409b8fdc45d3462865bf13284420b2fea8851b9da835382231f7817f6ad458a8270e615ed39611cf39f69fafbb6ff925cf3e2338332c7bf706bc3c602d5ef35b51ca5028a0255736c063685b9f39b0bf8080bd19a8ace99626ae1af0e4d1f095bd94cd753f3cea2514fdf7ea12bee72d35926419554149735dbb6bb9147050fb10a0c60789ad466dfc302128c7e2b9ca5e1b9bda7b1dee47e24ac3b7a296bf98ed5682c14de6c5cbb86405d41efe66b1d8e4bc501f4ed98a0f79fbd3da5311afb266c32dbfa7e567713e8ed2dab354537875cd934e7e05d98b10077e0184e094e848e7ad7d089f9257e11da5dc2d363031d462131cb57414feb2f24b727b7b8a263e8e3c6ddfa40e0a72b4cc0d3e0dd9ea6932c756fd4225a10b5fca2848c778412949233736beb3f6b50dc571b86d49ba4ab0ae588ed390d37a3f1779c7776c48f9bc438c50291544fb02fdf3c4eae66f416bee6d59579c5ab98809ba7440c15c36238aa0315d232d4ca2d78dcb76effda081063eb712a08dc87029f385e04c5a50317b14e6bcf5099e93ffa846b251b52ebff839db862252d0aab4112cb24dd8449bc0cc6f97f123b5a0daa0099b01390039d71331d0ad72818e3a56db3fffc332171668383ceb91a81888cb7f7dadc76c89a7188d3fe72a04c1d4fd178606fb99265af9b43bf9c096f12d0410f61e0ec7ba26b5252986824a8a5fe91cbabe4e2b5a752569951b4dfcce5b5843087026fb934d2a582a0920e7a84f2430a8da7990b9c059a5811e654a30702454b3957e05c31268e70733df2b67163a6e59bb471357cea7d4a71a10d7f8941a1424b0de024b8461689c055a3bb2dc4221e0789d2fecd59ad6d8bc8a23dc741272451bdad84b26f233a7abb50cb73119075bada038f63a167d8f3821f5cc6895a1eae1a997c8e10290ae8667303f33124709b74cc19879c9d80d3b0ca98b65354d28ded24fa996199047d9c2ae0e95c1d08fe286fbb62f7ae34e94d77881488de2839f1d6f4955cd22d7a426ac0162883a5e6a0493c9caedd3785df74d2e3a21ad822f37868eb9eac03bfa819fac61dd4af9b03a6a03b582d520fbe4587bd6cc512e317cc288457b1a1b2689217170a32ac472212e82d6ef3e20d5a89047af3b4f308f44604983b925b089b94315c1edd220e3aabcd45c0341d94cf1da059f0c7827aefd15f9d8ed868dc18327754231a0dfe8aeba9a62987721549116bcbcccf665603e5b43cca7279ce6a83bf660eb7fbdb0d4a9303d1885d2573571ed8c7057ffdc46d37744d113f369070722181d36305fe5a1c45fe3f0e3bda99a59788459005029617564b10fc357ffc591224f19e642c1ab1998c5292413dfe1a572fb4f00483be1a21157f7a4e676efcd5ed29d3c92a6a6e1dbdf9ab2c4b9803d3084600df8a52d6335cb9a8dc1fad8d243f7aa7ae2bd55cdef8365ee7f5b37c3474862fa6882a5ee3bab067cfb2842c8f54d674f824d28036f48282af00e0cfc2399785f3c41142008f29db2f1d0e2cb2c74ad930e783328e0564046254e6fbdd7952782f3a75605a10d3a52d27938033990fc1702dbd069bc8b21cfae0d48c0742a9395b4b2374b271e0076e3f28d418e16556ad49fd455339936682e67b8d660eb804892ac33538c3f005920859920d290191e881c37d35649511cf4f92a62b97127f6ccc247cf938b83e504b8476423e822035c1a018da90cb906d97dac061c706d4b0fa75c42a73ad7dcb4236a4661ea65bbf2ef41864252c3900e80a47865c465894d3a09ac5044c3e1991ba601303f9c4e02b27558224613b11bc8531708de288d6d739829da6f2b5a0c564a887a00d24e40fb9fd23c0d6a8592892a8453a2c225f1964c3eeba098f1950547ac1cb17cb5806dc62c0c41259e252d187d5f4d5c09684d965dbf56d46b7f302f3a49f99164ea04e01b9eccbffa30891ffed7894ae8a50ade354a3b8e5ff7973a520161d249c1ddcb0e5b2495c59d6ebceb477b6b59dcc714f0a8f3c30aff10e82a1a25c1fb7b9dd9c5c7d8f5b3359f1c5c1a7140056bc2a1eb6f0493fda425896559473acd45817a8d4452cb705516659a9354111afe0e9b052830b57b9e0d7e3b4c8443343c31d714779ee599668e25a8fab27ca2cf6f9a2be6df10824118dd799a89830f31820631847fb28adec3c9260167250a9fc60e452ce924ad920d6a4f093f7713538b123d6da307a9609a2067815ca5eb0eb4fe3e94fe3938461be22ca973860ef856e9c725a4e79b99892fa13970ed17902a59a8da722e6d9b2e15d27572bed868247eb2529b7ed98552c8044d6035376aa92d534faae6dc3d3092798fc2232903421df51bbff827e0b4f78f4a8e1e963d064cdc2da875ffb45280bc4829c9e287199574fcbe648e12377217b25b3028557b9810d6461888285c149be703e936588eef99ed0b6dd2b325829b5615f35858497e6318fabf34f18a9ad4b097bb6ee9bc22657d28cbb914bf66904c11fafe75896e98957d3d2c931c86035743a51e0cc33fc37bc76fccb6ac1a4ba8f31b2c2231e1311f1563b16df6e9e7294a4fa7328eb864fa46ac15e5dce233ff22161b361d66886b6789479dc302bc3ffd9b129e5d398f6a4498182f9a5246493d1d18c51fadcc6dda2ed93811db5c684b9a04f1f688c5e498b62d1e638fd0f42d22dc9d8ad6151061a6750f5c349889e8dd3d26884812eb5859a95d4e3c3e359fba43cf0ae145ead09ad59d8d2b30f21df62ed82517dece5b676338632ac576abacff077a50596358915cecb8d9b8843d4e13a9ba53b5c1523a97553412f127cce469f8cfb2227d3e40a0a7a7e2ebf224e242cf100714607449cde5c0b08cc1035e33e1e16af4b28f275194698530f9c9a1937bea03952a25cad9a605b0457a25ab5483f71037396a2614a79948c2199e26486135934aa1134235088494e671a5a49f44174f647a56e93675c96a71d29719bb42212d4d2749155e05c78cbbdb2cb2527e13f6105ce95ab1cd5610af94daf76e54b266e43e7b597bbb96e16624e51a1741f5276892ba283010c125a6596585738755d1c64308940a65d8541207908000b6bb3006d0e50174d14086a263dce8dbd4469379daac2273a29542dc32577f0cbd919a4dc6ab6cd151fc45f0c82f30afc3bb12ec428636679bec8adbff57edc375f5d8211fa15274ee45066f325253d41577cccbf648c3fb60f7d53e8cc3b70dfbdf2edfdea11bd11b96e217a6bd91621f4aa6678986b948e9ffe7de5557d4ef6b6eb8470c1f0ef43db1b6c955a992d77168bf2d292a512144fa59e1c6ad3b2f81e129270d4bc4ab6705dda736df89654380c2af1a586be23dcf5bdbc8ee81d47a7b4af092046fb9c854e815b412ae625101ac9629b480b7597022ea8903d7454e724e332b0d7099741f10f23fa6ee5296a3962b00b0b1211654942ddbf289198a32c71d8d8c8b4ab4a404b1b5280015bff56dd588fff50416a5f45704b648abffd541644e6cdeb5959b462045ce38c1e94693b9dd2fc60a5420e16c85332ff7234993aeb3ee47a1cc2a95cf416500764f520060b9e91f477310b3c0a3da56b474943bf4d3f98fc68faae5732daf19228140000d48f38948fa21a05c36cbfc5555455eba7ab02ad792fee9e48b3ad3db6c2a2c8d6f0d405310c1f49fcfd22b2ebeef533fc0b0589bc30767fae83a835fa09a281adc072578cda1ce38ed0c1b9193750c33278b202f0236a61c13277b01cdabbf1655ee9e063b14f2282f885a2fd47fee865f266a939df1e75f64868235bb4661d2c6c5f48b7aecd565953cf45bfa737738daae583f1a90b6be50c4369e85b25175cc6bf4dc620471de0823d85ca1c5d1d6c1f5602f79ddd49d1864b1c48498b672ef32720942120942e9adadf06a70eb127eb28a141d78bc9de524ef0cdade3e264912b968bec88cf77a373da423537479af0605325b0d76022e51a26e6dfb988ac96e7454b3bc4eb347ceafc13a46196e616d0131711131da20d2eeacf47f08dca2d130c120395711b488a3290fb7c013b890e61cb18563172482e34923047ec48ce8d07ad79fef15bf3b2069ea00edbe74ae95674b8afcc48dd4516b967be5b372f1ca3e1db2f9917f977301eb6a7e3f9ba255b066bed53c1dc7aa66bb1ee3213e27bdaf8889f24a3753000f7a654c2ec8169f643dabfbe76651bbf211cd4ff82a2cfb4796e21c07a1efae07cb527ccad21a814fc935c9b0f6bb76ee2fd67681803440f05f9ec00af2cefdba9dd0cf108ac6c96833aa531f3e54c1e964e9519081b4931ed73094aac6eb31ab46e27525561813060da18ca9bb066b1bd28246a772c4d659c846903c1dfc88e1d610c508e751cd6fc11d38e99b4db6e740418a98d54660822a60d7b7012d11d6c1f2220a79630edc3cadbcb86024fd7b6ad73900c0e3cfe20a6fd5c363bb0a427ebc969176ee5a38b6b91076e0f2671936b05d5f5ef464e586e6647df90befca0c22f2f0b9d3641cdd6768a11fc399ed1e075d058e874c64d551b6f55c074a18c1cb5f76a32633883d83ab6789d9bdeaabda75fcb221db670d506169b08d8b841ee41936111ccd5c280e5202bed4bff64630205e4e0d3d9dc238c2d76a31347efcb3fcfb569e5051670dc29b8c3b9b013096bcb34c0aa39e039fac5832ded03435122034e64a184cae662315777e005c4abe03984426981bde9c4ce21b8dffbf678dfed7bff3eefd3f7dc88837d5a440190f4e7105996bd562668c7adb9a190717b92884f0302d4b265d2d8b31fd1fa094f4066d6a94a516071d9c023e50429d157ec47cc00a350c584445dd773d4d7808343bd8be1d6a9ab7b9f72185c1db20698f70fb176bb2b52ad427d9ed0fa4d43461c538ed3892b517a1470dc735e7c159244aad567670e6a08f7c809b0c775496b6dd186d36b30a838bc5925bb61bff9a7561840bdced404dd2e335759c6a28007ba23aa157f2100dcfa9281deca0a4dff29080407e1d4fe227c41e5741befc58e28b3a819882bb7d7e484bf3a63e9fc46b5ba5bb3e2170c9b5a3568e411d7af8bdfbdc3e3e320a78b58c25926c8b02c0b8f6ad3964e93e92ad69b38708d345bf9f0c5c0920ee04859ab2008985ff939268949490fd345cd22cf232a697744dd712681d6c6a59d70087cf9c3fb67a984ab4d77dcbcbeca48de7fb5165ab045296aadff891ac65d81ef334e6a939c3ff32d5abb9a93222e692a4149dd0c2e462db44492b8e708e983a12f8ca97a9f6119344c84fdd12d91c0a62387f2ad7b0fa88baa8c756b9b3896a4146198cc2022c7ed5d234cae197ad45e5828b751039bf5d21de1aa0fd64e3d38f6af836b17273eb2826cf8299254e4aaf65a21b8d31bdbc0dd5c0eef07f6edd3cfb879088461887e0d2aef4cc7aa7cf6935b0f5515e8528f7ea7bbc00c6b7fefa8144cf126458f7281e9c48423c6f42f5d3cdfc3193d2a23ea422cf67ae2c3898db75c4f742dcc9f91c8fe0fba0b468f488e59406d2a7d995b3219b03ce6bffe04117ef90b4f473cdbe87b8ac364332ffd44d2ea57b06aac0022f7ba3489470efb8152b40f5e075952a9de4fb944b874ee6b65e89f5a5702cffcc476192b726aa406def7714e10bf4cfb009d7592dd887866dd9ef2ce21a72aba49ebec231e70aa0d5f09b4128173443da5ff407424ae5dda1b2dc70e5de12ac1b76d0433da77531dc4e694905764c16574b916aae06e4f40cbd1d9c24c9435d169ab75d2ea9ef35cd676804e47f938da6b69daed9b38f1b18d3b3ea3ce4e3fd4ce16e0a818a6ac13651dbcafbb63c92d2c3173834415dc88e785b7a11ec7ed1745449134cffab7a2352154f3ccd2abf30072c36f434936f324d5e90265c8f7f08337a42962ceea3c0f6308aed94a7db1ca8f5625264b17e80947bdc9023354bd1696214a76f03e64d7055cb3b65900acb75e16d5f01063469b4eb66e2c4c5539f7f6f7ebe621961974811621c9bafc1f4d884b4b04bccdd8a4ceadff3c91f52dd833650dd927cf0e14e4d22193fa634dab0a494b4806873cf5de994e8fb22f935db2b028e239de01874096753ce3c8c4d66194609aa646f5a901bac95607bf36346102c555354e2e337b4412a5d4ce2fc51a069bd254c32a7fdda7ead57ed57898440d6aeb8003eb5653a91afd7eaa8c5827780d0299abbac7fa01ee0d5bd67775d6dc09e9c9633f93b59df5c84a178a55e5c1a0dc93b5cbc70b09025cd9d6b1e9aae188c59634b15bc49ac7cb6fd90b5f6b1caeadafac17ddffc0b196fef5c50d3b1284df26c1999db97599ad77a75a6c380094b3b2ccf70647a5c3821e4c28b5bb3d75fbd8b53495cfe83e5fa267a1ee13f9e4d64d40281f9f7e109b27bf8e79f65ad16bee810349f2479d035215684877bb42038107b88c08001964ec64b52ca1111a276643c0ef2217e9552d77c6aba34be04a06c2a6c6978303470e1d1f7474fcd8b1c3a30e0e1e7574f0d8a1c3a30ec859c824e76a28dd108cf4c390ecffa972604d596bdccadc0603cdc309f9f3f71fd78889d36a16f81f796d0e409faf176c7392b7c77cf28c159cc7fde02d4139a2073a4b1d1b4b11d3201ae7bb7c3d354700a938e8f8c804d469fef96971f573d8f9b54806af1b7b95bbbf003880db8b64b7ba3921072a9838aab50588b425c37473ec8e6d68f29b7a0c685b70033ed3a30cb6c6d4fc160eb0cd1d6829764e86d5b681edcb850fd1c37302ff96418c126155e51ec37eb6f3a940b23dedb7c167564d55d70615167f6283b5c4b6f36da41570bba7360bdef64b4cde8abaa0d6d3eb44cbde8971303ff09f67fe9f660f4c890733249fdd0f46b34bed505307549df091d7b908edc1a94f418b55053d3add81738a443df08f7904e138b66153e79a17400799048d3ddcd1e019afcce43b2fc1628c57509cce3fedf8504924104b3236f2e0d5d0381056fc2cc6b8f554a27f686877e5ad9434af1836c5817013dfb0c36edb9cefde21dd3ac78620ac66a273410813d3041dfb2475be2859a01ceecaf559d7a08833a20f23a5c7dcc9fe2242045eb06275fd6f6e5ec11a5e2fb7c19e29c6c0c9c30e9fe94a9ba4dec96acf1e87104dc54c8fc8e5d61cf13a7c2c95a4f4900cf0a951d0cab657a0fd2d67d153b2135ce0c018cc496ffcd4559b35e2f78884800055a6ee0efa1c268727db93c32e86d5549341da6212289bb800cd0850a6158a5b71d80712c8947b5419768e87d45b4af4ce690361e2ca029c2112dd3547cd125970c751c1202d1eb2726019b27e8979948800fb0b8280996039c61d6d3782135a0995f6fc19059ca84834acedf7d43bd0932edadcf660a31a4b8789d85568c81222098d0d6e4a4e8a6efafc290000b8cd40ca8e33c76a7c6e25f70433e4836120a2c90f1965adf8bac4c05a0ef95f68ec336097263ad0125b26ef3a2ccf881ce1eea2feb3825157eb0dcc1539c31557dfc2c4bee53b4087b5d9680a2decf713d59abfbe7a3bbc856861ad1b5213eea09a81b19a6ab1c9466b4ed4454de0e135b486d4913262f32c5fdf93ae101fc2fc4ab3e6227c1eaf8684141a2595303003ec6d2c517b7480e6117c3bfd3a2492be2412ed94fe9c1ae334deef1e632057ac017ab2393b8c405a3f9ed6c0fab66578a014ea4b9a3bd6da2a3a3bd3cbeebdded32b13f47733ad5bf448bf922094c9f94e743737d95352c5c8f2ec3bcb48292453579689ba34bfc418ebb6ec4fe348ab75d9af9d7e53620a32d637a7fa0376ce26ba3f2b72e3ce40531d5b8ed4e0464c42ed261f81e4cb26f450f4c52a35317b51ddeb0b81f814fb6179449c0a9ed91873ee9dd41f6ee2b7d326d4b058b59c513ba9127464591b3b61191a67d845e32c051c08d85b0224e96f0398a22fca6fa3579af550f5219bd044cf29d37f863f99f96c759c6a4cd347b220a34a1e9f8a1e14349846096af41ae52c344db2400124584300d0da3198b3ef5f73d6d4751c6aa544722590f2aead95e1b06da56a624e9761e6f05ad769b0c4916935fdcd679b4e0e5ee7bc2b46826bd7a067c74cf2016aa1a52b2898d550f17a5e4333073c09a4b662b598e1a320fe444f15d530508f15a5e6f33584345d1a5ebce2c5296b86cc5d1a6631d028eb16ab71165d2dbe0c727d4b45261534a4aa4db68a63d8f5d4a500a94bc332c8671e535c85fc886c1aec50f48ae69b8aa21e254139d93f83284a528a4205321083d2a561790a4fcd6d52a22520c198ce059e895643b84f40144c11db08c067d448f2c2b4cf8cd097fe77629be2ee734b8715822d0e883ddb171d5bff72e82415f6aae58bad854dfcb5138956e0c4b07e86f741fdfb88a47855a7452a35126195fb83223a7681f8bbfcae2085e1f751591006c1c21fc1807230253ab628732901ce883278acfc23a2f4678ed4771db0eabc93da4f824eb9c9c8454bc34a513271841df63d51b8a0ce060a664da38f68a713a44b6e55192e03d72821293f1954054163094905b8beeb0972ec6d1b05f10f71ea62eb7a5cf4e0608827a404a9214ad41973ad480a16ab2d6e0fb1d806719ddd99fdd8f2f103379f14fa7dce35e810b6587b4dd4cf560a5984660e70ce052b2e995392bd2030c15708828a9a4c8dcace7d66ef4d933dc08c1152d2c3201e9ce19d957f29b795981c54a5d2c34883a803e259cb6068f45cb4c963b27f4b0f0fe4341fcaa8047f439872d93874a1689b6e31966b8bfff182d07ab594327e2a4597e84efac093d268e457c65a57ece89f5289e25e468f64d62a2a62564894f86bec576272918eee50f975363c6f93fed081766d9e37a5f4f3bab6a7e4b50a442f84471b336546fd801383c210a236e3fd040b5563d1ae129b98b8f9a74cde545a3938d318460202e89ebbc17f6c401007c7a50850c82b9ecd221232e4ffe6cd92b7b4840a9a401822af9b93a728389f988940e21470b10d7e3a2d40d4c7d4e0f4d1af44d966f757f3a4ea06606859b21b9589fbed608bf37aaea8b007cb9958c87a38053ccb6c171a9da752c836af5674bd72e194773bb0b05239d0716b2fe49dea0ef0de3492618d18d65aa248cfc5f4100b1f8a0a8a00dc436fe7c24a676a740ddbdb0092c5c9ac8ba0ea3b84196f94b5d6c9cdbafc73200f36c4a4620137f9b99386b3ea6773055d66b127e42943705231ff535e0e3e7950e285a2af601cd56b7f7466d0f58905b0d334a93cf20984a3897ace509ff257c6c5870efecf869f95ed8f73889de3539db9a1cec552ce60aa7f90c7c6319200c6e473560e99d57d35abb05d796926464ddaaceba201b6b12e9c21e6208674b4db4de5c2635bd0860e6362b34540ddccc5d2fc8d0dc9e5d5998b4b293d1092f1536d79f64e47b3f5b5b8c46431b6fa4f33a699f3e8a293dee177a7ca44c5a415b35883855b1b02e9e1486234dfc793e7886775b6d1c35db1b4237b8f23b18587c61c997e0bfa4f183266de02d58235acc884523f06f5ffce13151650970ada9f493b8b212b745e19b2d45da9c1910958fb66e462f3d00ecf699b767f10251e2b702098a71b6b7a00cf8e30a3d4ced30c824d761d2eb758a9337759236fa774c30da95c88194fd51bbcaadb782b77c53a6b519eee6beae266cd3b327c9f0696db5c216065ac081cda9aeee84c524cd762b7b85b9d3bc7872b77070eb8893c8866cce8c8738a7287644b62650b7619db4c06f48d940e30c9b428945965e233310937dd2c6c2019b8d57262503543ac9f9142a25e143c5f219cc56eb70d80bf63b08b3cbf9b79001dc9b7abe9e4f51dfb08da07ec99404daa5a4f70b963b745d96dddcfeff4aa6250d6181eb835c7b88c734de58896cb2f124db0e27d45c62c4ba33a9010b1d2e10979a141aa5cd04cffe1513a7d9411ba00cc3308927485b7bf760cd99fa964afcf0d0244521f21780001c14613d2b45c8cc3a6969e235d510693bfbd972676d3f10d817b9f587c1be8214f96402861d9237a4937d4b33cb5dedf76ebe2c16fd599063f718c1d8f9ef3745671489acf8b24f4a66098cd10e9509a4aec897f1471019466a974d2d85a08f47ced0748af8cbf03569280f5d8727c42caa858189aa71c32b67eb4fd9cf78c4301276623ae83045d6cd1f3c3b1e07b5496b319c90cab20b6a01f22426958bd5d44e14eae3c88b797d872f57a5647d2b98760a7fb55d5613637b6aa16f1415f4b4006737c997cec8b04067e00ea03b4aac50e76a55123f2d55609d8db39b6397c9f5cb8bba9a7001ed6b55c7f3d24c87af8ec46f70a38a8eab70421b52643528c3637af232d612dacbca6b9640f9ae63357ecf9152b2c88d330dc6101ea7be5c898dd0bb703e8bf8bb4304446da411e912b33fbf3a939b7a61ce12474a161201102ed5c0304a3b15f64217fdf66dfbc0b0513702658e83f0f17672ca5455756745776c99d3177169cbfe6a107ea12850573da982a2b5da50acac2a1429c659f07b11cb76b62dc1e92cb2849fe0e261f7acb8e25aad23bccd32c7b869870a021871498504fa428cce4151ab2b851a61866a9e36abe82c092bce38e0be9bd9a4485225c510792c96262b6ba84594d5be3c4b8a24c60b1f8b9a62a08e9135a18c1b4a56ae01b31813841010360349040ee060db388d5f45cbeac32437c4c3b19257a2826d7121ffedda13697ea577e73bb8ef0ab98f286d4add176347422b057dbd9fb4db3e460131fec163711949f091679d94ec0854d78c8adb90e33150184a35043f73357f16d636503e81b8c9aab2b3db09f29e41f3f081f6268f8dc2f60b5ce457840f5d10f627fe06a163283ab59e4421c2b6c5f5e4566ab828b952aac2b1579ac6274ee822d9643440e9586a22ca1f8bc76102556b05311f628450449406777fd89982217041d44abac287a627d71eb44a97144215426b8cf7f59c8d1ea842d8722f21a4ee16d371eef36d2aa0ecf6c1e47d2517ad9fd8fa3a658e6ceb76d5a33a4b73c4ab8c6c91482b42101faf9d984036c5570e291e42fd0353a75ed3c1a44edc45c788d993e4fe747d51ff2f858bc6c610bf275e63774295f208019ded05182c570f6ba115b0cf011b93dee452fa96005e3d57135d72efcdc021264c19a53008b3887bacbce2c49cea39d70ca6a08dfb8bf48589d6bca93a5b12bb4b9eaeba8ea3b05aa45578569a6bccd6f66ba7455de61c69962faf947dd69273f9f1c69b14ffa6c93269b7d21190415d161fa2047c15072a16929e3535d6afeccc9ee6d773e95afb0d79da1220614abb0675df431ac72bb4cf37b5eac2c779c0646cc3b8957bca10185ddab63180a8798b64f3b817e2ff2df92ddd8cd9a7bb0506901ddfa887668c5191578d675256f73395991225126b651fd587f99c061e41dc2b7231377c37f076a8c0374102a1b78d4d882607d1ed45f8d4509fc3602004b724dc273b47c03d71c6ac9b8de203db4890e822238e372847fbec42c7f149e9ddb0e5bbaa76e92f1cc2318636b2a9c2da69c00bfc0ab2cdbc8c2849f59f03e6104c3f7b80ca6395039d652b840eb69d2af613268d91252085596393d122dda7b3ce167401f8380ed18aff8da6aeb0c748b5ee75a1bda1e14104791347d0abef308ea850ed1ef5b1b2190c1f05d61acb62421f43b040dd3770fa569acb472034a82967f5c40941da70d0e7da867cd8e79cca79c348fe1448b2d069ba0008b1fe8fc5ac0f5b381b323d8478de064b8c37d8598477110c91c446dbbe726179605d6aab2022eea1c4e35b1d6ceda2d3639d3f283fe9b99d94d24721389eceeeede01370823089f073487e6bc9eb335a5e0d9ba66ebce969dad3a5b06c80638c001103004012e12c07a9180172f64842fe84f7c61baf107f57f3aed1de3c79cebb9cb6d593fa7c7c72007c1e4a8909873a914132323f3c3511b7f240c9a24a6e22f51d2044888c6d6954bd3d09d6ef4a709ddab4d065af8c5788374f835e20b9ac783e4075a1774f834aa6ea625c3c2850c3933d8950a90cee5528c0c0b17b92587584137737ec01595c14bc103aa31e891d2ea8fca8a5351b1e9dc9e52c59d62a5c31fab33c506e67b3ae55c3f12de57da44c88025e2747ad414156c2076141f4851440a2152fc90e226ca14517c446945018af213a58b1284283ea0484841c66006077cc41286c832c413569d068ad091810c6c6670031d4ea7474521a28909a0184187214bf41cd18a22074620c2942b186912854da784472f0786608207258c50c509ddcb0ca8f460052e10f20108c94d72bd2a3c47e8f6e70c0eb7852397b4d6566b6d10d65ef32ffe6230ac5a5b6bc6e3b2b108fc17dee27603dc3123c4d27a39c717718b1140912d1f15644b89653b589dcbf17e3a64b2bdcf5c003adb7e7d39a7d470521a55d7dcc7146e54d7c87f0ff5eec3877bdbafc59d41e5f3d7e23eae796a09dcf0e0a169c0d7423e7c2dee0c7c61185f1746c38c4cc99fc1ae0b6a1ab29ec09329081fc36aeedfd7e272aa7e1f630d2f1ae0639de3d67a0257a6ee475d0361bcd905ff7a8cf1f597a631b16b31ec311d1d63d8c38e6d9c8e7e6df7b5b01b8ef9f32f9fefbd7865757bf4318d9c9bc4a8809f0c175b5da282ec1e28aef4d703058f01faeb8162d57b2210bca3d78ddbb1e247fce545fcf49bbbbcc65b3ee3a6d7bc645bfa7cfd1cece9f2358f41e614000f764e0c72b70864a84b2e02812912bc18b8546fa137ce42a07212898ffe858f465cf42f5cf4272e12f1fdfb5df8fe16ae6daefd0bd7fec4b577e1dab7704d7b4cf30a9efd0bcffec4b377e1d9b7f0ec4d3ccb1ed7bc82eb7fe1fa4f5cbf0bd7dfc2f59bb8fe12d73f39b637cb7ffd0a1eff85c73ff1f82e3c7e0b8f6fe2f14b3c9278fc118f2fe2f1378faff1f8198faff98687b8abb37a3cc5179493b1e1b588dddaaf5fb7d7630c42790492f35a482034326607c02c9db3300ea89dbbdb7300c551b75b04ccbf0eb3cd2db6ee14f04305d9f0317d4ae964a192ec5a6badb5d65a6badb556fa04c6a820fb955041a20e1251188912248a28ae441145141f9789095080de2823adb51ab153b0af9ef844c783adbbd6255bc8c601c8095b89dd832d53c5be74ca080548e7503f4e600ef688511953f7b5e0a81f36fc1db4c7b8edd782f38e838afa9c74f6de120200f4baa2d753af2ebd65011d5f177ed1e9764d9d9b7326e20ea1ae0142d95fe858c618a1c419fcad3f4d23da9b09d0af00fa95e937f200747ce5c8b78eb11cf9f3e9184b29e3c338938f44b79a06e61ddf1cef7db65e74de1e77cc58abb8f6b2f6dafb89101ef7c950eb5efb640538d7dd68224ac6131c20ee131c76b055702a141f6cadb5d62b586b6dbd4e96586b6de54e43d84e88b841e5309fc40093f264054f709ee0e0a48a13284eaee06489139e798b38b901bc9c10d1e1632f93c40ab3db29a262ae4d093e5c4e743e5c9ddd821e55082a9df0b1c3bcf7de5b7bc4a85badf114515dad486c177a6cee843921c5c90f4e6e3aa7c22c7808a305a6e273282cfffb990dc2d8d75f8c6bbc2ea573523a679d3493dfe3c6c08ff11b9c9918d8cfe48bf94d8f9918796ff92f543411c2003f73157ea1c23a8639628927a619db2be516ffda12830f67f3e3c9d431bfc9417dfc2d104685a9b7f231e62f06ae10c68329aec214e6d8f750c5c0af5f4688ba1f5f755dfad210c0e9397156b7d356f9c4a37e71fe5a60fe17e657a676aed7b535b8cbedbe16bc06f7893bd54491e3783f9b08fcc570ffbd6a2642055cff70a9677e63ffba9f318731eec52dc53cc690a59b1e1fc3f410f0341f75cb9f3f18e2571e80878aaf3387f1529101f7de7925dfddf2f95abc1830bf62dc183606be19f31a035f19731a036319f31903e38cb98c81b3cd5856455df32b535b7319036359f3180363f8229ed9d44a3115a36768199f9e59d635c731f249eb0c6b78c317f7cce663be652adedcab86d98bd46fbc3350125f0a52caf85290194096240690a505107490d849402544278014e1840c6a0ba8104ef870a2475015579094fe7a829a042511f4b3b11954a4c39f49e0010c3d61e2c9139efcf4d7f3a47b3284273e78c27a62832742a840c1e95c7e62e889a026fdf53c91a467c627ba278cf4d7f30491cef1fe9e20e28920b3e7091fb9bf9e276c2eed116a01c12af42397908fb04eb0a811ee6646ccdca04e88487f3d4241fa13fa21c483ca0912219b0e3fcf1ae001484101fc0a1cc1086bed1164708bb044cce090841ed6367144ca0a360f7b2341060bed41a7a78921b909204df8904c5ce95cce9309a1cee54c6f0e3cfba7634287891decb0f7e999a8020f1157b07131050f5700f2039ccdbd0e08bb87dd84c80d145408eaf03354d2b9dbd3e4486fa2d3b9d984959b10e1018fcded28ec17ec9cbdc40f8fbd4fdf444814f04928e5841d6e2b5802099c258a007197c8c10e76891ae0d4255ce0035d02053ccc2570789041d8dc89091437354e8f5ac2a773aa1f3cc445026645a2cd81bc3598d805140575091c3b24c5bd9840d1e107713101ea21677250b960a20427e652dea51f5bc564083ac8e430af995c8a61c244e764980041264a60708449c764085307263ae820a512567890c94109272b991c9468d2432687c9c40826423aa7fab136413f8284f4b7e988f09f0b2ff41bfbb83e9e2fc6964c3eac09800fb71c5190457fa82e75cd8a2ee78c2f52fdcde7808cb20818b02b16814989e1d333bc23badc31156501fac5b10c43af5bdefc1453eb43082194158818f22dc1a21d6c265b088d279b921131278f81524a0971806928689c1c04ec04bf80520e23a594d0ca8521b9b05c465c2bd4ba024a2965ecb977658fa851ace52f502691406ca541927b1f6ca2521ed7e32e239b2ea56c61bd163c6cae85e562d3e58f6cdee5a70520fc64b8979f1e3f4339a9a4d5766f567b2f5a5bd4de0baba4959d93d4d90bc359d7b47408217cf04d086bbdaebf6c707a7c7ce3a3c7cf38fac768155171dae89a964e593a458ce8b0783a564445ac6b5af42868d46424340a8223206e2465d41a01c115901f4180ac84e4ace0cfb8ba233c488e74939484f443ea48432429a42ba42152ebc686d482314a59f135e17efdf58bbf79b3bd5cb2ee51be254a00bd18300e240afa7bb97a3160ef63d703a368c27b98f362b0ef25f062a8ff7e70da810b1317215a784c534c4494a0f056cee75e6ce076da418f5f5d98f4f854ba08d1e35f2d98698a3411d1e3c7aaba2528f4f873cab971f187c562b1582c1b1b1b1b1b9b2d1a8d48a492c9c65caf4eca42df418f9bc91642e3c9a66444c4a738e68876b0996c217afcaaf1c46c4a8f0f332268cc19c2d2e98e745dd775dd8ac562b158ac6e6a792ef9d5d7e1eb138382c6c941c04ef00b20d6d250e8f1a5c6e9f1630e02ec143bc12f680d459c5504d2b174464023a011d00868043402ca301796cb082b402b3dfe053b0c498fbf2f2c3dbe7619d1e3c36b85eec88f12a0a0aeebbaae5bad56abd58a85953da246893d17ae32fb9c3da2c77fb15b8dd2235c412030070e61e9745dd7751d005e3a0d7a4c02ed03aa34a83449d06deda193cda3482d0963e672a416a9c5915aa4568fa552a9542a954aa5cb4336513955a73c240c95cce95847744a5d7f4a8e7497fe62f3831effbdd8bc16382f362f3f162022cbf60128065530c2922152a8c26eb293d8568cb022858a1fa8b8992c0814e54ac66eb682a03027882036f77e8208620a2b4c5ad1850c8f07090b5aa00e9f664686850b192490952aa0543132568e58292287583273a4d0a232b0a224c7ca112b3c3f568a58e1811523ac11308a09d5d62a63ada86085552b3df870d52d8b0fd7891e75097a97ec304f5f6b95246aad35d62a4c389d1e65a506476c803d0410f6eb5e9373ef47da802a55979a86193a43d77bd1c898aea181d5ed3d94a5a1c6e27c71a7095c33301de1bb99bdead38828b9ebb6b19c75d635d7c62570c38307ce72d63466d84b84618c31d6b49daf199686ac6b6cd77ac6484f406730cbb22cdbbae6befd7d4539db39c3d2a0e91adbed6352defa224d4ed788a0482412895ebc225d63ffb29b0d7094354d03f7b7358df89ce85a116c51e957986f301b37aa288434db37739fc518c6d9f21afb18d6ba66e62cb3f7b1d7b48dbb61363466ad66b1b53b3aceb2c62ed6b4ae81dc853dd6a2a6699a065fa66bf463f75e36748dc63086bdc52eb616db70cded36c02c7673b063fd980d8d695d53f7ab41b4335d4345f32a6198c90449259dffaa91589bf6ceb0c759cbe9d4b2b7a66b36dc7beffde2cdb0a789bae67acca4f36bad35766d3470c7362cd23551943551c6788bae61941f8f3286bd0b865d74b6e5c725582a954aa5174dba06fb9cbf45eb17692c5ff9adde68e09e47ba066253b6bc067b8ca44bd796f48661e6ef18c18089c9924072d55fec72de4f24c211ec639c05c708a58c394f4cb58d6b397e7a06be3e4e5d03b517d8fbb2183f4d9458d6dc1fbf3fd23e7b1ea2df6f350c0dda67bf6b106d4fa644f56a1b10565db3ed65b509689f3da66bd0b62753d9cce535da46be2e5d932fa66b4cda0c797baf05de6a4abce675fc99aef13ade2e8b3a625f7f1f6b1ca17e12cbf45b1b60961932ec78e374746c83b181751dbdbe9c6f39cc42e7664362111b614505567aa892a5ca1455a0a8e2449525aa2ca99244152654e1e9afa74a912a43aacc40a84a0b5045180a1a3a32c4d35fcf5091a19ca120fdf50cf918ead1a7109ae2a783952589d8295653f4c05d2a429dcb41fdf5505142a5099d4a11d4109c1852326483a19c29ae4c013445478429727ea0724508547858a04ea51d2353639f9eca902a43439d43fd4881e5440cc8911703fc4d81c4eeb58826b9e71681503f983c3047ec225c0005203c58c1ce8f246c296c21f6142b5462107444147a8c00bac18e4f0a499418f0a0040f780881406670b877269762a620e92d2c59c20f8c39b125bb0957f401a182362a68a382f6a342d806c629279d94c628e7a474d6a129859b57e610bda136d89cb4da2924e7ba8ef0203972716e26f9b1f6ce0ba31363fc18736e02993f824c20dc14327330ce5367746a414d8482a4b4565dab6f3d634ed14d44451f3530ea1ac8c91f3d7e49ae4cd36492119af2bffc38c31c753af658e63cb1974038ce7a61ad8d4a2d2f30bc249aa8d84448fe534522aa584465441579dec79cf802c3b87125de441f3ffa030ac21361c0d50a2259c1242bb864d5040af5f7b0833f220cd8c12050089122fd19e9ef371061c0964cc5bf425bcae9ca4d7f0f5737e28bfa4b3ec909c97e3c2c5ee614b35d44183107c3ab9c73cef989b8dd4fff504e167ed1d6322df165ea78baaeeb4aab1fabd56a458a2f6a130d248130d0057431168bc5a2363637363636362c5ab80104d4ad72ce396795aad4552a15964097966959ba2426753c9dec70d78d56125f57c462c9222c9664499664b510800ca9c3d56ab55a7518638cf10dee6ea04baeae96e92c45f7da1d4fd7755787573f56abd56a2581641309248124900492400578215561d7755d775dd7755dabd56ab5bab1b33a4bacd97b753c5dd775ddeac76ab55aad6068015bad39e79c1376dced70d7d9567d9d25beb27a61cec43a9eaeebba4e9561c8a822dbe6989393b38160ce39e79cb0d56aedde92c2c156154273021873767b17fbcffe73f91964ffb93c8d74913f2de7647781efbd8bcb5b2b7fbafcdce47cefed5b5b5ddedad3cc4c6df9fad265e3a0c9daef16656d7679ec5970f91897877171f917973ff1962dc74c376ddc8e0eefee769fba3d3dc6ec35a194724bbc8448fb4fcaadee38817c388364afd05ed892564a7925e6f2b2e54ba3df9fc5f02761f87de14fde1b4d1b77491bb7e529ca8fa82e519153f58dcb31232f39a14c28138a295a1bec20b4034f9c57d61d8af401f4e7b3838f2b1d01fdf9f438d2f1c3f3c9279f7cf2ce2be943fa66ecee8cfb4fbffb77e3f4cb7ff9afdf51f4f6476fbfb4713adebea66d1c34d2b5ad6ddcc5566f3a66b7cfd59779cb91bbc51ed71a6e879c7f3d9783bec401dfda806fe14fb995b458794cb1153b1229c622305e9e833a39eec0cf7ec61731fe7d3d2366773fe418c3e26357fb1b7abca418e167f7331e9dc59d58fa98695f8a3cc64d478cd88643bff6d8bdf672368b39c6a80315101f8b3cf6e62c5aecede3e774448e8b5db7ff39e6fbf7deec332ec7cbc7871a02da76a37e0c6e30dadbc7628c51e7665967b1c7a6871b0e3843dcc1e2cd6132c1bd372ec7ddb0b883c596a6336b37c88aa8b8d92ff1fd2fbce52577f9c94f4fe2793f4d14bd08c2b8331f6ef873e49e618f6139722612dd1c39ff89bb704ec7dcbc85cf1c39eec49db81377762429b9f1d1bf3f9f1c3a1dae74557f3e3a20e93e39f8e020a4d573a71faf4f0f1d9f1e363e3c7e7c780cf1e101d471d777922a8434325e4f35bcae3a2f1d71e366ab5f2fb3e1a0b5d65a6bb5119fbb6810a4412e80582891f9e933c298d9b44cd7705a21cf30ce3f00bcfecc3f005878987f2bfec5e54d2f358dab67ffbe859815a716ba698c3e26441f9b5770d8bfa1d300c0d7f13537a5740e6201d870e8b7320f0340f5dbf8d4851964362e76fb2e70b3c5b970798e850c17d369a9d319659e6e18e7e05bb8c1b8f0d7d78f1b4d844304f05943a55ef4c28f08f01ba53304c517953ec631ca3feb19ea6f4f808d53bd909afb51031000fceb6bbc281669dcb810ecc01b8b4e7f445fb435ba5d9f7f064d28399c431758d753fa57d7f0c768a40ccf3e005c3fe7af6f9c73ce39e7af074514fd99df0030d3c2c6c2a9cf978d7b978d4399364e557a4a6189f419697e9fa739efddfb74fa47a15417e67a6ca6939e44fa80840187c8d4fc39da38154ab471a8df1bf7a79d376e4f289abf70b373cc74fdf4e91afd382cd533e4ae1f0e9130a612f8d3a78c4eee70e372cce8096506e119180e814486c0211b44c1182718a7a2908a820f0e3f7a01faf3b169f291bbbbca5aebbd353aad99d1a3bff5b19c6d4a5fb437fdeff4a2b61a9d3e8d3b56335a9c588650507ab204f9d824c1e9c962e4c5f4a4e76e3ffda9f42bbe050687f6f8b5cf8f352efacc2ff85916223d7b9720597c54b1eab20a215d4a39fa4bf4d76b35304be6dcccbd7b9f4eff2814a7ea7983116dedafd7fefaec479cdbffbe01a517693cfba723007be96962b665d1e3cf78d510c87f6999966999966999f69caa67da06b31f6f1c4c0dccd235fcd7c6c1ec8d06ccd2b58dabd1afe76ad4e8d773fb6bf654d780bdf49873da8bb6176eb6b6cd50fa6cc3517ad186c365f31c339cb6bd883a7d76f9f7309c9bbde5a57600b4e1b2cd883a6dbfa2a5256793c9943f7b9c99b4cf707eed33537e0d679fb3979797972ccbb22c4341d11e76ed737ef8396b3e363c3e36407aaab8b2376e47e65c8d9eaf4cc9cf2b5a4a2316fe4a182d7ccc8a534be99f54f51cb3c16cdcdd3dfb978ddba78d3bf5ec5d36ee94bd69e3beb471a89e3d49b471aa2cd39f39577f7311c0aefdd43662d71e6a0740edefc6e1d77806758dc663d7360e766dbfccbf376ea6e7a7915aa641433f37d3673adeee7e33356660e236c2c5e39180f7f0be1d64d09843a6d344148432e4b06764f04829a594503ef7786a3ca067f3708fe7069b7b3c3ed8dc7621079b7b3c58966091d26f7f3d5884961840139b9bfdc919213721949dce2f017d518f334e6a821bf7d2e59670c2b9d180fd42de616c70546e9c0bfd71b05b0b6f2f62c61720b001669918f51e4fdb2fdce363ccc404405a710ea4ac177f312ecf7c83a181a3ec72ebb2c7fe3acd98bf6ef2dc2fbfc1308c09905b0ea4084edd3e0874dcfe1e0c3a4e1dbe17f6e7ecf2512fc6c5a98deff37f5efdbab74b2a379aa78cd7567855dcbfc62a05dca491686b99ce18bb202f82ad744a58fa01ee00df60a4773deaf437a39c3f6917258536d65a6bada5d6da3869b5b3da7bdd0bc3139b386b2ccfa927076f26cf6eb2241007c99c70d5e34b12735e922844490c12893c2099968c1494d0953e5f47a783870446907c40468f51c68f3e5fd6803ee65309d0c01fb1c90e204b9ed08e1c6ec7aac78751ca39298c52ce49699db4566befbdecbd2e0cc3386335575d334d574dcb75ef5c45a25c4773724e354d1c8b963c5da8ad9cbba149af9c4472d1e797822ae758f4f92653ae9c93a1cf6fb9a1d5637dd8abb5dc0d405c0ef93492ab9078267802188b112c3afdf5601982050610cb0f2c37fdcad0945782ae2c9957905c3132e9152243e69520a57ac5c7951edca562e864a908a2a2497f3d5424a142095474fb52c1a2a20849058c9ac2dfe981edf2e494524a29a512a614948c409242aac12889d10ed3a4842905252390a4906ad0e5c351125d3e1cedd0e54329390b504a197f39b73bf77986fcfab63d22a583940e606cc4975f13b5f8f85a6b6bad94d239a79432c668447cf1099cfa6163b172df89d8f5ed033d808646c2b81153f2bb1b2f490df145842183a6befce73bca215651b551dc8e34f5c3e666ba4c15b1b977a40212c6fe217992115fccc09b9987f18098922f6bf460d3ed49b9575330bd9ebd36e76e545965d541458f453232918c4c242313c9c8443232918c4c242313891ef6ecb1d1939e54a38b7e74a38bbe728ea68b361ab961cfe4bf165e1faba692a8d78bf31951d6a5cb9f5c0795a25879e0f8385e6b6ba5744e29896c08e50e09a30f7c30b5bc7e89f9d3bbacc81e5fbcf419cf316f9c0e1af50cda5f1ba7835e5996e1fcd9e37ba1b5b15649e99c934a5963c4f9caf7b5b87e6ff7b5c8d78f3887ff7d03626238edafed859b7d5dbf02c5c2850ac5c24597a5d7fee2dc0d0864dced17beb0a67db60166b9d1ef85d6c65a25a5734e2a658d314564e7df40d7b0e8f7630e7b44917e6f2fa246a2df22d2b6471b77a36b9fa5e32be6b5d20c317f6d38627e6f3856fcf598eba09cb6e9a03d265be1b2629b11f5b23d7571696979fd34b145b768ad758bd6da6432f9f0377a2e91467f491bb70130128958d041ff533decedeef73780ba8eb92292900481038492540f288452384b8038f2c3159f1f58dbe7879c95cf0f36393e3e80ecd74200bb28d563b4b7f6fbf75f38b42dd56373356af4fd6fb4477ba77080d001c2878f8fd68c548f548f540f2d0bb6f17b5e1100a06b3034d4a75f43dd6a484d4d83d637658434e3766c2dd6c8786fb456d63a29a574ce2a25d535d2c6d86bca880dfb8d3b64a43bec3d1a8d46db7e1c5f4229eaa29a39ef88d7bc3e7aaa6bbc3e9a5f754decf7f1cca396273d0fd397be6a181a5a9ef435b46c4fa6485f8369137de9eff5afdf1f71d8457f1fc3d1e37ba1b5b15649e99c934a5963ec7424fa4bdb5e44895e7bfb3471c46187b78b36d7ff748dd4648e99ae69d07e1f731a928695a22eff051d86e57c2fb436d62a299d7352296b8c7d669e22821fe6ebc24faf5ced5f4f235fcf91bbadf7b590bfe382d2c9bd7b9f4eaf52c9305ba49717d3a251ceb07cb13b338526940a74e08a36ee06a1fe05659950b2c81def11f093c19104b18b281bbb88b213bf9c8fe5fa62ceadd6d979dd381875fadc68549ce72faa8a1d9f2b9de20e4400c4906faf520e69155bd70b548120e7bbef7ad853c9f03aa9d9ed662956a4ed561adadc03da2829360eeda9e8b5a78937e20bbd472f82223ed2ffb4c83ed4569370aba10218a821bea019061eb552a89d52a6784018882f38889262c31b1be8408e0fe820417c914d2810066dd3e477e0ca8d0d084d28da14d2d90cca28a7b70965e624ede78d5361273b7382d80d96e94fa6a41603ecd7945360bea82a9b53a1a26c1cd7d3cea97afeebef8cd4f7ef3f9d59178db49b0ce62816322816f1457dd44ea1164565d7879d53b188a8281baa248d8cb80361807fd364463e9f9b255dbe0b19e20ec576a3989671d7876047b7a5b4f51282523a5b10ba40b1789953cc2e411c99aa6ff3db6d524a21a594525ae9d35e29acb5ce09a5d2c426a921b64dd160db44548543a921b6ddf256712e0cc29130607742a96ade222ba2ea77b2c22199aa5faf4b6edcd3cd6ef7ee7d3afda350a99d5d9f8343bd72b148afdb0b375be6ec1c08218494e28bc6a967502aa59e412184f8aa15524a131f920fe46c9ba2c1e660912e7f3e8dfc402a67db6d421b45ba9a64739075c11f30e7c92f02e3ed033225ffde5d21abcb4f19d9f22fdf5eb8d9f046cc8361ee76ba9d6ea7dbe976206b3e86cdd0ea5a39c355d71d08216ba76bb1e20e8d3a2f76718752c8a27147731731253f731aedc9449171e7a584524a29e38eb438c5b3ab0868c7511fc346803715cc29249b53a594b065c6af4eafebcaf88c298bb27993aaf802671fef49dbc70f39ea7bc5e85b5e1fd2c0b02e59a064ece28e2e02314a8a8da33eedf07db8e92ffdf9f410d471cc759b50e03fbba1a0d8901b019621c5b3e7d34829e5cfa079efdea7d33f0a35c3cc4fc2b87f5954b7f0b52aa3f063a76b4f2894cea02934832694d9a272064da1d98202619841f36ba47c367cee1d99506c68c43cc8a24e4633fa59cd322ccbb2a8836559962bfd9c5fdbaebe32c3f7b5be1f2f1677e24edc615d754429a5238ee3860ea985a391ad17f6d88e138c4623ece23bdaeec53edfcf581e8d9e26eafc18ff1de59b3129da99bea3fc388ae28e5acca28e19fb1bb1eb6e5c7f3251042d156cd25a6b6ac2b4a66f32ddd776b6666b42796d4d26d34f2193b6d6647a6bf56b5a3399346bd27ee3f4af2841280ac10e6ea697461b77e27e6fd7ea8ced8432a1dc234a7c7a20e2d343101f1e703ad69e4cfe4b428ca9458283c3befe0ddd62183f84f4bea5f557bc70835db46bfb186b8fb1488445222c1261912822f98731d6f06b5624ca44af23c66e526dae1061ed491a765d2adab81060fc131ae978d3f0d3cfb8ced7566ddc8130d42defb8238b37076b5f4a3b31aeb83ec616bff71ebfc7f8a3ce93cfda9f3c18e3d8598c71ce183f97d9cbfe9530486f37aef43adb76d44fe2b76bfd26ad7d66f5efb77b97445bdbeea6f98ba88b34c2361db3ef94f22502ce908bcb4b595d7082703a1c563f407f3e3b5c996fdf9b41cf4e5baf0bb741f6773fa36fa854cd374631646a4600000000d316000028140a07c462491025519c16dd0114000f6e8c4c5e523c14ca834990a3400c42c630840c20040888888cccd046088626532e739645693f3d45ec3175f561dd32dec92c20b81a86fad1ad0bb4acda3585dd40b23e8ecdc49a88dd12fe656b8a2dbe2edbb2a4dedf200bb12c28840d1080e55d3e0c79ce045b1a5ee639c1a60690cb9f60d321ca4d146c7b48ab530aa2ede407a8751fded31e37daa2de87557e6187f1e64f3ac55a2602021fa0dc744fafa03d4daa7579a057f0602f4461c6a7ce09d33bbfe076c82ae314bf97cae95de17125892c2092badbc1ae410f45e34a7d7ef973503b470c8f759d5aecfc78ae1b743271adfdb79e8b6750d483009d5f433f02e6787503fff541756c562a71dc0f414e5afd9d520f7e0f2f3d80454243284935996a1fcda2509a671c1e9bca1813ab9327554b5186d0eaf60c89897688cc73ae8577307eb6ca755e4d481e01ad3ca66a90f11fb1b961c4b3ef3eef8b96dfa9a5036fbd5a7255eb17d988793ddc190fe56e4d68b7b10dd6a4ca1b06ec95557666199c770c0bf06741346e2daee31e1cc8a4ab083f1d3975d9fe2965f1638653e6087e2da6fb29365e22d50a7e9d561431dfbc0133942fe2e8b5ea26c6cacf994f3fc3472465e691d82eb3e9827c217ffaa36700cdd17ebfd09d011296a71d3fb7b9a714bd7f332b574f9cf3e272982ef7041a9688b7ec10bc075f25d166f97b624da8d9a04966d2b3c1264698433437d8954668a609e87d55f188ace997f8e9bc312524eb0d6b8a339d06bcb59caa0588e2915c7124dbaabff556c477bb6d61f259b0d9b4a20acc289b9025e1174e232ac05080c3adbd7e646cf2f3b7f3d9e6d9473e75f36effa8cefa34c7e0edbcefd57c530a477238b029596cfd33c699d164de815a7e0d7b8c68a08bbcf787ee5440ac0fd6cc8a68f43b9688b36060917d955599beae9ee1418df8405e58ca61bc9df2d703a5a8e0b5c3861cf9f7ef3868d3f5f7cb3f98aab4f2bcdcb3895f47536e526f119425f06861b34e82de93f382fbd93bec8d196a3e1cacf2c96694cf0bcb5d036ce15a039ddf0b425423b57808af361abd79c7827d8fbaea2abf3b622b21c41fbb8117c40d23a8778b01f70b2268312de1075fc1228203600fe119160134b9899b48f3cd567de088eb8b6e6b435fe12b6ad615352d8d8744d0d1543eff3f4ee8fb3bfb13080f9963febd54ddc2e2ff98843a67c4372591b84b8ce701f013cb80e49cbc0f8288937df241f30de9d2598b4d83901f23904217751c36b27b8d23704f61fc8ca4516dc85f00798de995256246f4b8a79a0e075e24eb34d6818ee737efd65e5df3e2fb003f6320d8518928f322e889024b92bd00251c9c961cefcc90df4574a8212cde1841d3b14932f1d6a40807fc05609476219b2ad06791926b5a66057dca5d43a2d1852ebf4df0c0a5e6f182d206749d13e55ea516a60b9db6240f71a599c8a143f485f174e1b830a7284c6d349ed2a308ccf9bdbc6974a14f53c1094bb66d375dc4e919cca9e75046173a0e2519bbed66e6feab3b696fb69cc39953047586ab950c77eaea05cdab86f54606b468bf29a834441231ed51248ab291b4cd054a3f4850bb96a6462aef61157f4efa41938eb481a118725a659fa82b8eb78934dc76045b131be78c17dfd1fb4287a0217d7ff26f8cad62f0fb02f88940e7417f24006b898864a4ec7fb41aa32e8bac42bcd4a9f343d1027effe85bba2765fc9e6e0b1c283466dddf513a2ef297d6e3750cda8a7aa4787818dbebf8fcb40706be643f63dfc855b422f0999f78e033b77bc1e740eaf9e0f3b57d4f46b32a463137c8ed591b3b20c084b6026aa9ed6ead03e9fd5484bdd84d82219c00a93de454bd968e8cdb0af21886a2a7cb9dcf3a581d7412bc16a38e31e4e59787e223564b20e557533afe2a89925b391d3c53ea9bf8d55c953e80760f15f6a4959c44b6f983d16e38f695d52282c6b9ca97b1188706f8a5964451b25829148b6ff47c35379fd7d0d581ae41b59b8ff23f7586fd18f7319dc63af64cac7cbecef3edf3f2f414e0ffa32d0ff5b58956da5841be467448c4f4c3b8e1e1e2b02ed9bd0670b0095fdf59978640e2eab9062cce5149f06bb5cbf56b1014d3809889807ad73faa83d73d3682af4ef5e4f781a78a87f751078c9dc6450c6cd04f96f691787ff0338950ef5d8680de36766022002763af2377653da1a8c3fc6d7a040028e8a67f5b3d0bd1f459d8cb34379b68ff979a7e6d21c93e982c24cf9a14d374979cf39d8235d9fcf22cc761c177c745b89fca412b127efd2d9e0806e732809bd1c73026f8dc4b7d20ed46f7ee049a46bad20c32d141a8c7e644124e2d3080cd5abeda3d530e5a635b9818362d9d324097c42b91731a3673981584a29aff601d08b4bbe8c224ecca23422fe0c3016512655ecb94d6e0a8953fb8ff0749f82ac37534971cb062fdc0ae32096663d767ee387eff125a6579d3275d07009fd993b785358926cc190f5c7574bab36195f84e7ea6b18421b8889822ed40ed7253d7eda1ae049b5b47f37acaa2db4f907e4a35ef886c7b043504a56195ed97905cb1253f96214ea8524a6b194ff49fb1380dbe3876406c203f2044a9ec2c9f3b3b007a69c7776aca285abb3cd53ee50888c0f92121f4733228a4e46c885be4095f8cec6dfd1ac023d848faf43d5cf6868447cf3ee147abdd3e023e947db49c6164f3862e471fe75c20a6cf79c94721b4482f683b294611445d009bde5e188cf341c146a933bc67d240ed3c5b9bf5bf8df23cab6cb9a66f0131fa4056875c246b18663576107d55c53fc463a8907d6d86bc9fd31d5e97d7f5ee56c85f86a610b89a50e1d871d2e42294eda86bf64d50fc5915060747b0b4642d61a44ae30d2897a657f7447c901e264768baa6d975ff7b4fd1c1f007921019255cada98968263c03d4e2ea3561da1f8906e735be0e4cc7dc08a5818fc5ee2474d0119964c3d20b4efe8338b1635ba375f9e64c856461e19cd438adadde6cde3e6fb1cda5cf969a019a63376811a5f69b20055c7a49b1a7e4fc836666bdbde2481a53f6689f1179a4b4aff6d8387bc4b3c40a85c8ba766632c087351b587d3deff28c86c2b1d0673cfd676392007b2bee97d60a5bd7752f76f3bd2f9e407686e4c7bb7abc7ca41aee76683a557581e2620536cb775cee25753bbf8b2845c7540f91c3e37e61bb700ec21184780db4268a10718cb3f414910899f4fa7889a4365089d8fc0073b5c11f86fbade6a166d636d1978e80dc19088f83900d3ed4c38e62d3a40ba531f8d3e2ee23cc807491fd16de23701806b5266fbea77110845e179c05570a87d86fe8d04b93f419fbfecb6ff1831f1296822aec3977d83ff3ddc148726be67dd93334f5c49966b52aca66d6b9b04abb80369d4f07ccc83b3bf60c51866f564608999d7cdf728c11d44dde3564d7211d002f52528864c6c0eaffa88d3106128b1b743045318531dd178a7dbf017790699366424c5e99d5000cf9c4c81b927bd047760a4b5ab4a86e55f7ecee3d0b41d8e155676a36f60e6e0544e6c38669dcd70e85774dbcd8b5c60d9455c6926a1018f4ac560d70bf606ce40e925a5ef8a8ac8805c01784b839b38f85e01482204a9854e00e39622c7c14cdf5033ab5f190868e7c437f2b688c9b73e1a3850b1969349501e36ad425433ebc45fd19593b9829b688b235bc70241717f9a94d2bae89efc7d40788ff54308e4b77b8f7ca4aa052e1a3d9680dbd7bc247ada49080ac375746a57fcd859fc1760c1df16df34096b080cf447172178a2d056a64cc65d94776ad909bc15067a0960500087dc4278ade938a146b577af9c231d47785bf147f7f6e01e5e82643dcd388dea1ab49ee33f87642f8280f867e2e7b835ab8e3d8e6d2631f1bf34b558d8188259116edd9b01e7c9483f781fdc6dca4f74bc3e64aea0c60f0d1718a16739bd88fa2e9961a1db1577689a08f524c4b3a4580695f85f7267654ee61eacc89deae96a57c6e32301f3be7896070a523c82ea29a22304c7119af973a881e2202e5aed078c53606e3f806500a39ebbd09ff6624968dc70f99ba4c29ea4e76dcd686a9915fcf554b0352aa7462ef2831a35e5428848229dae4d2e3c2a3dc7d40f6ed2bce24b12f7437242f63e2a70a4042514850c882b62872fe4d330b5823064d1e606d623c23be9c872e5c2a1a9af95952f191b31f8000b271c2896441bdb2cea41d111978d064d643b122aaab52a7dd90e68629db716441096cae562f98e8efd2e5328e5117af9896bce71232e0b22917e972e24ee7f03d5206bb02911a4b3ab83915b62f72990d8a9250a99531b56ea3a3d5f3a49df0becb8be6889c3a17695e175f63f3d346c36e5404a974097f6cf7520a1410b09d3cb4afd1f8e4e8609d1e1d458a54ec8b12db0eb77679c79428b5aa7cdf68d450701c20a4025a73de316fe58fbb6ddcd63aba2cffa23f7537306122c69afde008842e545412c6a29311de30088671fa65f3982a991772d8c7758010af2ab956477558e9a7369f81e81cf63b40baa4c815b66db78f30824e32db5c2ffe4dc18a24bfe797d0f26b1d9b4d11d85d3bda46e9b1eb1c88fe21fe173a94d566114a0d2b99eaa8736051c44b042f88fc093707a3e99873b81ae1e9ec2c0d36c3c9e4233586812adbdf52d61d8e0625f5aad209f7dd367c0c72522c74568cd88e9e0897d785a82dfbcac1255a4ac0c760275be002650bc073ac407a74839cedfb8077c90143c491dbd38c261e213e27f51f233f48b4a7a9d657e4e9ab40a7171e7875d1355718610b0ba82e23f44fa657a1cd5f704f1ad1a318a58efeae3114b270d7e4b52cefbfacb187ef9479885e01d053defbb254827a9cdfd29640143511bb170c7d1b3c3a560b3d63e302fced3e932ce4ec94617ec234520053ab8b0c259c75fa4a81141117ee1b73a699d68aa597ad42c27fb6805d9ee1226e6a59c47b568dadc877164aac4bc347389bff7d2178fd9ccd6e51e32309eafc7e840f5ab571f5fb095fea491367bbc8cc4c99862c98d78b580b3e9de9abfe9d6f7818de0757cd70711d45268ce1f1b3727837e8aa74d9bef4a777261aea44d685664bc74c11717a9085d5159632d0eca70b293bd2ceb3afb32b95bc64b0790e73bf38fa46291a55075f9f8044e4d5f4b915776393a184101fe8397b65715f7b40fec480cf94d3c899d091fab8dff8d5649033dd635d23d57f39c035c028b14b10ece2fc7541d5fd7d5dc3c6fa4577519cbd71412fc2802e6df1f75182a2ff70497972c28da851cdb12b1827b047a7cdc066acb179136f55f96d6def4bbc1474036dee6933c579491acfff87c64b1fbf5a5d4dc4775a1393de8214b969999411c265b4c25ef36c0408b3c3409f47f4ac94b3d0bdc067b7265eff4d9a6a22082bae04b93c9f496199b8848b4922c02523e6ab71b431eee27992882167cfd7b75a38f18f916887be28eb61a48406d6df8950d18374e0029cde8ec3cfc0285239c8cbf2f792889cf503230a0dcbb3161c56ce99e37445c8880a6bfe1dbdf7dda660b010aba5f14b13d1225a51056b3b809fae885b570c9870f152a44545b0957cab7d3716a99bb62fbc9435f7137cc0b3b842cd6f3c65d46c7811d323679d06cf24756f9c74eaaea078d65ca0b9f78bdfeaa5e2e2506549f13155445cc2f7e18a728e74f641bb58234269767a78205ce81fde2677b2d368cb1a9166e8188638854279f53c47b2464483978d18dd25bd705771ae86e501b01e6f8b07bab5ced84f5b34786c33d65aa7ecec152dcd0fb43e10b48835c52bcc04602a8cd16f36cfd2c2ce6fc5b64212b1d946b1ba324666d8da3bd2392870eb3591227b92834f39dca497b2209015db0322b16fc1fd1a45c5bb591736c907b7b5e518aed13f3cfb1c5fba7a911294c3144fecc4348e5cc6b9a68f04b5dd682a0295581fd4a42baa079ea5b2a4233b5ebb4f4da98099fbc4878e03eafd08fe7c7f4cbdc2e742960dabe2fc979b7884eb47196df7cc0fef745a0d4097ad87879113393e48ecdd7357bd61d9f6318de47f1ebc95fa52a216ac08ae4904838bf99c9364b838ee45e27f4107bcfb9d5549fa653f66e9bad07824dd04ef0011f4331928ff467cd22fa427d0330c115ff85b794655b39e9717acf5a6508e65a240f54780e0d507b586c8260915b93411a9f1bd38d6925a95133ac20723f2f71160d63ad6a20f9af5ea835227a63a8c71b496a2e6cf1bd105ee08b6c5580a431ab4dd62788b699003e98296824eb17e8d4fd8233c75f4f53725bb7114df4c1da181afa04192a80406c2cb2921f58d1aa6a2004d080f48c2b63913fe02a1a10de875432a678f7b7b7ffc3351d02466621b89a9768c695de26cf1aa196f7ccbdb5b08e5b52ee01c9447cde52132317168fce2d07f2e1d7857857ecc7581be90139a89ef5e002016875a6f31ac523ce1b43b1d8cc5aed75e76fc98102a42d29e00a72521708db3415de275aa47ed08f17390c6157d0f672dbbf95524a046fdbd5941d6536ec3655c1cacd3f99a46ba5e87a8ef8f1709d52f42a8be6877eb7e9045a58e490d3cadd332a093f69139b0a15eaafd60f0c02fe59650fd48aaecb3042b20449a815fc2202d8197089e30a420d8460a03fc11a70ee6d294604b03c780c904d8a1e238d042e475c21720576780e66d077f81d23056ee3ee1bd409b26123249f0fc79480c87399cbc58f7fd85d81b30ae02503ce9059af503508e3201ba8ed3c9d215d170cc5390c63f9446927a42b6362e7c07b963082af51d3e3f3cc8ce5cc0066e4e22249af711328cec47594ab688d1f751a6301b4a3a96d7fc1bad5028571d564ff7a61b15865047ed592e1dcdc08845f389d707f1e1a9af5c4e8e2b75819e84452f7ae70867e8e1e95d783cdcf856094f94f33b7ba348a257201791191cda6debf75ebe323f3527fd915e98a1ce1a06c04a7c8dcf6f92cf23411afaf734485d1521961f966014078a9d6ebc2a2bda02d2c8026aec4b851a74b568705f34cbf6e800089d97fb6826cab5bdffb13497c2e2c00a54bb4acfa3a5ff863053e13b986e146558510e3ed9a7403a479d7714225b9ddcce013f4498e6a8502203200325cb675b8998292b1029d531749d3e756c4b0e9d892840c03f04448b09a664abda0312717621c79ee08d2fcf23e7db4b43564a556e47dca582618a08f79e086476ee732f0f7638f815aca920c2d6498192bf740a571af47666f2b61d021187db18d83af646a67b252e414f8c726af5b45d45601c82f5b99ccdd95da497ca5708bd7297956088d42beaafb117ad230870287a95b8befa83d2ba7d7b6105d231e320d4593791c0b59dfd0627dd2c3ea1e06c98111c2459e5d623de560bffcb96675e238a594abaa1f243e3506197f8688edae88a88cea9fccc836f2a01ee8ced0a159123f83ed2482f392188909c9bbb15e647a552f011f89c0e40372179632e74faa29ca752aaebeb52a146ea65e7ae33615d9a20286060a55f01deac18afafa69cfcde202caf4fef33480899c291d237a582b1e644f43a6a7b11f489427d5aab896a953f0baf1f51cc82dfbad589e33db08cf55c573b3074f6fc59e6ad7f323151d17d8c10340feac1a039ede15eecaacc4c882b886e0bc9c15bda395040c48c84765684422cdec1fbf78d67d74af569797178f5516198d11d1e66699daec98e8bb3b06bc5d08f90b4442c099b3c2323297c88df7116bc5638707cdc50fa650bdd69b902c9bee77a1720cbf9dd9e74c1c50c88c6d68460497dcfed9506efe358fbb5c64ea792dba1146e7d1891708b6d1857ae47c2af7e6aaf913bb1be00d96f278c221de4196a9b6b4f87a6ec7b85610170340e68e0490cad157fc596e08ea275e613cf680cfc67c9c2f112e7d9c5ca811fb2b2555c565628bfd75548efb65c2fb82e3839891b74d1f2915ba06d9ce98eaa0ecb45157993948623745a6d50ed6b6237071efe1fee5eb557592b2993c01a85433e733ec05f999e4c67bcbb9a628cee91b3fdc48bc21e570f8040ec4cafe3de2a1096a9731cef2d59dbd18820bffcfc11bfd03a5ec0f54bea3103c3aa9d1245933cb5af60be8fd2ad706d66362a75b875d993f16b959bc009f4ff1ca5ba31f65e423177b94b5ae0e6b31197da43f8ca7ebd1b5d32ed878211ccfb7aac512222815b34dd753403a3cd673bfad2f8ed53c19e6772e7599606f2dce25a19554a3bf624369fa7dcf4984642836dbdf2912cc81e4701e99307e3f1237d05600e369a4708e0c10c6d969fff6c204cbf9e24154f15403ed6d23bdb18094722f8038a9a06234d2c6dc7c0660757077f53648d49874cce1b6f7249a5ba4ee85d9459e5e89089183c8cb9037bee453d42b44f16aca30c0375f1e14d87bc389e552d2b18c19cbe7e0bba58b8850093e602ac3fcfb9e3a9e74b24c8aaeb6a0ed5ba974c2e73a302f8c54c519c46e81123b1f796206681fdd0ebfba53b41a71040adc31face03a7c747dc3f5596c1ee1b2762ab92d89de6fab402b081eae9b0e2d9fc7e2556d8a688850ca56b43e82deb49170751447e53c494985084229c10803b8f8e0dcf71a4d0c7f69b1de251be75ef6f4eb87d2f5999442880dae6bcb89c2978ee62b77eda21315a6ed043357c7855c01641eab6482baca5dad0a5b1a846998362945ea803e211dc29304d3eea73a405d0a4d280690ae0b5139145d985eb778d4e3026f084c3e52e8b30d617b56f202c0f10b906c143b15bc21822a8a17cb0adf97a7ea642e06bc82a8f28958d1eccea55242a8594744e001a7f5e5993a7365974a09fe1d45547014192c2074fb6961dec4c85ee248ca194036494bfc8115ef35068ed22d1c044124bd318063dd4d02b0228af7972c9fd84cb7f177cb3b39376de1e471b604bcd49a4b47d22e2359044ee893631128de6d55caed94ea12bd356d692d3ad9f079ec75ea904d62834f2297b3463c142cadfb23590bcc5c88710d651f942ac2d2bab2b9b9ea00cd140d96ab07b3c42db50ab5eed460fa1ba42de5cd7644e6310db34f8f5689ff604a103984881cf0bb0ecac86e42c590b62503fc997b25f29c82fdea08551719b9637d056bbf0c7c9d976195d6ac04b5663d1419a8b5255c9973bef4cb5c6b4f5aeb94d1bd3ad9c49e545bbfab2361b50ea441185bd2b7801413b7950fdf59d7f1f151e98f081d8a19fe0b8a381e432cb485a3f550e10363ada10b48a892ecf00f8d7c1307cd722542e3845a17b24de917086390bcef1aadf7b8d3a755e662d01ad08d95188fd7cb652029e80578bb1c7167bd1aa701c0992b2ad9d92d37acd0da8c0717a94e1be5f43285a228629318f064fd4bd93798ea465b2d397151a1b5f93cae42e36679d8355e82da3e96c3e1503655a6bfa624c6fc93dd91e879b814aeb9c13c61fbe0099fc2e49ce86e8ffc4c12144cf713fc93604e6232df3d0e906282124914280a7a3761d5f8e30d0268a2647fd3cd1384661781f6c6772120c42556a18588f0ca539085466d17b98ee36591e47e48e559d1be7b11a456d65b131aac246c611688c23797dfd00872bd8bef382c5214404ea867870909a59caf8b7642b2f32b0b093899b4177650779ceba5e04fd66f52c976fc4608a6e92b947a9e45603364fac4bdebaf274bb0b96288600f93bd9b0af10a8f9c371b6d59378bb6351f0d127663d0c8d9ab08cd0c5eae7fbe2b3e6b7668b55190bc289664c0349254bd891f58385a745431bb96dad01577fd929dcb7636e318602d5ff1152a4149a2087d5b179033d9366a7af3c3eb3fd718ec9ca276fcf0c1158d7cdf8e2ece482f78465aba5a04b55d49de5d68cf8f54d38e615efe9909c1126dc1cba1a584e2b334d924a9ff8c71043584a0b29fcf8fc809cecfcd48d75b4747634ed3bd73a29a4daeb1027d5d3be85613cae2635f9a15f64f18d7eee91fecd335c0ca4b624252a9323654b6d721df8cd02abb7f9e48c1311f63aa329484ba001bfdbe177e0ec15f6e2f4e8fe28ba8de88836eef5914b22882069a7490f96220e3819a09586beb41f87c3913b5ed9296eed7da14ddec110d9b9a04dc95bd471e4938650918611a7b914a980641950ff31eb9cc17aef7998dbed609212b032e2de302bae5187a7e9156f248a6ccd43b127f115922138b06f0beb1165f7ba0251cb858ca0974245912cb0527e70ccce96526ce82ee04e01115ce3772cc85f93499288d91cad6bd97be49d9ef88be4a0debe777e43aef293460b60ec746200e98ca0b2fa06c2152f9e83797417a4a0598fbbb040ccefe8136494d8d8f6fa25eb7dc50cd59961b615153eed0316f34ea29f1ae1829e0b4a976236a979e6123d3b39f757852c89ee2d35c618bf2e6dc21b77caee950c74811836e1305e846c652eaca3c21c4755d0f4fe41b51695da1314ec6b36e5e22f8300b7b6d2c3167771c5ac2793b3e9632094068e03a9018fa2b886532ccba3ce6ffb4232b7646a2be99dd567d394766bea4d69cb5fcbe4d4d4d63db5380e9f4626537213cb91a79181e3e1772ef8063879578d563a037c3bbfaa872223147a0bf9c909c8d676f10df19b17dd7c6b4d7f93982c193199d91c0b10740d2658a0743817a37fa17cdeed91d54ee14d8259cdcd2242e3c6dfda3f78e0b3364cced4dff5b292338fd13190b3edf9a4ee97932e96df046be9491dd4819d93fcac816d965208932a26a28233b6b06ef74ed808ceab19b2bbaaae3dfde7743980c3139a449319343a3c908ee9003db52f01e792b88e86cc7f1720b0108c8c8f3967eb4bc07f4049561604597929523aa2494064a045f731d12680d7091c80281bbc2fbaf1bd5004bbd3e04446f65bca7c63e98dd7d84b51f99b4b759feb4b74684bd65d402eda93234b76136050787b8eb21f64e69a4b1b89e5e881d6d839fa5de2a09a0f53f6a05f559c8bab92d643420fa6df91e19abc731cbe4a3a71d295c00292ac8e7ec397eef4c820d0ff8c1da13470d8fc9a21732a4e5d80540daef06732473dc6b0987e5427f577790eb3d0ac955d999a36b92b0e5cbccc6f87288f59319b03797f0bcf048cf69eb859530685a2b978aff9294a1e51099fe2ed0bcfd786f42a5a311c4088543082150609b4a563b062d356c6546a75e19712ecd394c94e6dc2e68b1e6b33a87be940763d76e7fd892234c1b19def524f48dc14e4e472f57963b2d32ffdaad9b7c660a33a044c4218cdce81c5bef55df19d629f8ade648383df5a19b247f038f4f4813b53cd0feb13a894d945fc23c0665848e8f9dad5adaaad3a9055148d1d7c08efd817037bbde59507346a0ed1a0b138c599583a01ed0d75c8dcb3cefca8e829df1f50cf4831ee0c965b3da1a19705148b94ff23af81095e2c43784aa9c4f731af72f4d6b2c2ba5c163cfa69d512b82d37e2c7de7635bc8cca688a00bab7d34f0e56afbe856b54afaf6e9c48826f7414f09e7524ef7b90f02a3e3e8e587843e1d2067af0a46b3f4fc1a939a95799971267e67d0efdf43871e90de3e69e306d43a9d7c00a19ca9d75c233d36a2f00321bd1ff9573363e638072312e45744a2d4290257c46a8f06f8ce903e106e9cafe86e7abbc9e61d5be734903dbee8eea82b65f1a9882965e8010884c886107104f92267a6842ae2b05480b48335a4de755e0438ebc28e21c3cfaf5a0ded840c8cb66640d5a051dfc9829bea565ce0116539f1248ea510baaa10fc8624c3baf093f8a72b201cdf52108bf3ee754beca54888d9dc113c4cf51fc47f7f3345c57d3d33e22da8764ba16a705095f460f7652881a65ba7e68c3ef0d07f3c4059cbcc376e7560412b5311f9f3bc387bf54e85329739df9858d818b1345e960e59004c2ce0885927e49695b316d497af4817b8e071c623e569baf04cff59cd766db2630d3c13550a16bd45f16894b5d4fae46e6151a580c2289bf356859d3a468db05dfd0a38849af410a717989f191239f1e4bc3299b91b605d39e1c5f9d7bace3650d0fc75069caf412bc744ac3be03d5f0cd8b977e10751ff5495de0549ef8daa731c37579699f6b7220eeb7b50492e29b80cd141c1301481bc1498f04c32c0800ee6e660dec452e70cce6ea5c26b1568cce4abfcc9581dd2306e4b1e002d5235cb12efc32d834775ae7f97a095867594f5fe2fe62f18aaa77e87c8d75f74b3ced29d05cb8f9cf82ae1d0df521c001d42832b7dce4f7c8a5aa032d4b1e0c0e37ad8931da0d627145e44cfb12629661ca1df83ab87a07e973da801ebe4cc1b49df5089a2130cf7890b79fe88a684fcfcd83062b2e426e5211c52fe21fdba135c389e4e1b74c97540ad8ddc599d62e6f3c455983b76a51328bd656044232259f70b8d034ec89e49185e07bb39c500ca495e52f117bb9e227a8d74dcba6bf56d57746bf90fe2521375e8a0d86d7e108f77b533c60b6637ee529cac1c798b638398cc397ee34b641e3388da3b5bee528cc3ed443d8ed15224394717466fccc8651fd1c35f2041ee9e397094400bf1853b2aaa5cc223d96d945597376fc641037a6856b112f0328f83b283412c053bfb95132893606bf36a72f6f663ec3e2de4f13dc78286f94f02f053ef00a0eb9d4c0f35a07309c2388f970aecac146194ef31ca07606db100deef373b742511c7bc33c958504d8f5122788826c7087a98457f9b16d84c03e80274ed513f51d4069bad380ee84cbaf19cc70f426402825ab0c7eabf5a558393ff7b753baa29e4b2092a9be1d2d705acc54427e8acd9e83b48c8ab92bb6a7a20584a3d3294767fce9e0b3c10cd9b94c35e3181fb80f27423efc41d1318a58a667d446895724ba5dddd1e743d0d5586cabf7e3809619993c93acd96054379451504b916f08fb8b98f0cb03a8f358920899e7a0e6a10ebade903d53989fce966f4c75d4443c271516f6a8f5ad7b5ca7faf6d0c2d6089339c5c3551df0e91d3e0cc34527ab356d29af8ee8d2cdcc6d245890d65aa63fb0474ec9c98b214f1715ef20839df7d20d74c6625fd705b705ed96009c5a208fcc15bae122b9aa6d493a73fb6220b431ab27332901b5c35687d95a2874f96c642daa3cfca498a169d8e3483e64c8d742cb460d4c024cbbcc1afa8f6d0df4cd58a8316d78419aa9306693b81145a4ccb726b5dee1e01450612320379b03c3f08b02bfaafacf976d06adc937350806e317228f3e5b3d1352643c46751900686199cbff6e7ffae8200a54c2384cf41c691c699156c99d704d1949fa6f343e34e0b0085ac7b136ff6c0ecbab65454f29c2b3d648c6461fb44bdda28127815d69271568920daa48b2543647cb95e3029bee8144f9a3ae2927179a94963610dad0c19e75ed8302019d28f1cb2eac21cf6685937239f6a4ac76d89f378ad5a4b7d90ae6b5e54815f0cb6c2aac210606603cb4ab13013497444cb69238bfd9a018dcf72973bb0075e2e37b67829f930f9cde0b588011088cf892b4fefb17bbff82783eebd12d362f7148bb001cd182780c0307fc9a081756f3420dcee247d461fbf05f292fc197dfea93e2d9cbfdab9dbc1b3d72274e581898b0face09f103a8965f46ee88e8eb8a2b86aed3cc66882e59d23861b211643c3395ac263409cb792b8b0ecb43014798acb40240e4c18a6a768ff31b14b340d88962c47640ad35758de28f6c2538ec74b80bd8ba9fc74ea61f69553b425bd7ae7d6d919cabcc7332419684946e61a5bb1bc8fc9aa98dd65ea08df055de0d8d8f43f2d1e0ca08fe32c919a7471c9c3718b50e717806a62071f158a23b26b145782baf44b9a6d824e988f9d6065426dea5103cde1ed265424f573871a9a5f49f6c24452cb186b22e2147b1c5b1032887426e08f2a6c196a41c02a02e3cfeea055eed6d6324513f822353e1580c877553046a058fd5c1c629e6e96aeff9496f4e564b8e1d0824f74bd30d7840d1c7ef3d104a3b38eb584d8c91228a9d060b6dd90b2487f38a5dabc71c8f4431f5ea187ab61b29a87188e1fb4a6c703aa5945e3c2f1ccf3da6d41a611541b4b6f804bbf08e21283cf186311b62f86a14a572fc6b2e48b1b8568c4a9a69dc4b4445b900b61a854cd203a11e26472319e03b3d7f48f6151e2cc733505d90a33a5e698f5429d9c28e54fa463ab5257ac3a4e913b7e48c26a210bf18d73b1984ca44e289af872c5f40129d6e446a29b0c967a0a333a3c49c45b9143bb484e63659047d4751c32b612826c8b1de3c194b124ee4b74253724bae4b0dcf359cfe149d21f6619afec7d6b9010512f2f7e0e2d167321543851ec923b817e32598c664d09fb453590e2e849266da5a38c65793a4c244bf14166ca62c62742ac60b238d3d9cb2989a7d7048fbe37d7565eae023c23a1a7d18817c6c8beb020abf1fdff893ef891ef074d343b93533481a8182357de8741aa312e6dc942d0c77fd271a61d4acf7a4d2bb563a45f719c1d0bec0481fe346975051c13396d6fd787680ebd2647b0891e0823a66e07e3af3c92cbc2c842a7daa84a57e31aff28902bc58b23de5a4dbd4164ac441ae800f8e2b527c9a7a500b32c5cccd689c7585196a6dcdfbdd3c2b4fc5201dd498c05c7d8b7b20301cd07905a8281bb595db09e37d152d37587e619c2096ec1b7156de9f6f6afd3680b68d7e879e1c70155f7ecf78e6563c06c0f86ffc619de6406009dc307a306336e66738887af3ab0e28ead1a612ecb5279af9f402af6d6ba1621de764760fd6957a69b8b3f47c273770d477de1540611b8ccd64168171c0371abe2d96fafec79338b1ef5134805fb5b72b83ffbda9d339208b5a9cabe5e64b1bdbd6cb5b27a5b63ea0efd10954f0137b3398cc67b2da488abd11acc980be4c5a9e115cc114b1c75e3bb5ff4399a42ed0c7b9b118466657b233bb0fd0ee9c9844e6189a3f468a023179d9fb91812221c5e934f84ac6c08cbae4ea19a5af7d1690f97775769eddaf105b33892e92ba407397f8ff12f93d6aca08b8278fd06ade1d803455c30069bee2bfe78ef3009ca9900b4c0ca25170b367dd797c3656e143fda7105eed9ff1552ed8a753118fd8d4bf07c94111b4e8c83d77cd60925f10498de31650d899f2dcef45b5355c72e864fcb8e8b032f2596498db71632759fddbe7ddf65780d3cf67671ea5d3463e9f0e6dc3321d12fc83ef71be043c3e3cf3308946e889f84c3cab7bccb01fd0a99c2a3a176ccd1c33f93696933d55a5b5ae9fb4d03ea5660019e748e747eec046fd416c85d8a3011ceb1d589bfc1eb446168b9fb524b6c9f9183cf3bfe837abdd787295612fab6584d2beb97ed4cff2e1f39325ece4c11ea7499d7a7eb15aa1c40804853446918b32b58f10d7cd29cb0818304eb4800eb6696b69ae2572be199f16d8a4c72fb3e32ce52e874729bb6434de1d6b862073fadd74b09fa38f4392ae703b5503b069764d925f3aa4bebed48f4b5f9db30aae48cc850d52bcc6e975652ae8e8a47747e7e61a8f4af6ebf77f44f10b69a9b2cd1b2a91156661ee8df53e036fc241eecddd9ec8c69746ed6a33690b77f1e9f34150df7b7c08dffc6b7874bfa007014d2d3aa6d3dc20692ad20b2f61f16b9428f49ebede116774f64883f269c6a8c614876156c877e0dc67c4e03d958165ac6de439a886a62930ae80db9063f1f01e79ba30df92b7d887f42adfd15cd39597488bedeff78ad309e30d609caf50af3274250f200b764514b627135e2d18337c082df38578506355ae113f17594b12637974fd6575a5ae52d756de1263c852412ef6cee6ac054b2b63d8e34b9b978b036a5d56a1d4ea8f72d6d19708145ab82771b6656deaba3579ca4e0a36131fa67b84d814ac435b104131de643964e30ed45f870b2cf68bd3b55a3c65df3d31fcdcf919d5a8f7e92f65d900c39d67b64b114ed80cc464c1130b109c874441ebf390df58f11c9cff82ab1d4d560fb792d1b6e3cdf53debb5ad9fce39c0f62522668472a0d5bf683b457fcf1762486e2a3d48050c51f8d5561286a5624c9b0bd3213862d073b4dae0ce5f4d592af1e63a6f5c0a562e9755529fd1e15af008d3647acbadc295c3e9650c2ea3786b59eec94505c8fbe426de566d435d6c085f00b50babf58623b1ad3fdd1086c2d7093fbe9dcf40199c23cbbbb12b0b94c64c7b60a97e40c302aa427959a1c2afdfd0f100c05f8180de9d06fe808d861214b8759e19d48a914ed482ae11fa5844bd2c08b34fb6b30e9d3adb6a00bf0efb5b6ff8ac29ca5c426694e7d4d717afb9b11e5eb86f622555133a993ae56c93683be914d728ac46badbd8cfa896dd7ff347bd659f6c7a166aaa264b486acb248cede20c9a1e7c16588f9b0831783ca17f0656493ef03613e0dd6315e202cea5be726b1398c284c3d9a12110f78c0a72e640876f8891781ac35d106c30e8d80714c4c1657b99dd640c4033e107beb40b00fbfe24db3e481914b695357c183a2fae78c85b687fd6f6de8dd3e284e2b8308d37766c3a3e7b48376dc0da3adc09876b0e30862a1c0ba8692f359ed1ff366e8a8061624588bc079babc0665fb54ace8ee6babe374309adc4c13218d2e6eca37fc9ac69efb03c121ff779cfafe83b05dbff61e088e9378e836cf5d8be9d000cde194e8e2a38f617dff093b65eb62fc0f943581eef14d9a35bb794f5d0ce638aa85c4bb7e4e48c09ddc0a869b64251f8658b32e864edc7001dad3d5b34ec65b902842031e7aa8e811e1fe27f559bce3909762d8444e4a5f7bfe24b66a62ce07ed9ced1f93db5f78db1c0677063d71825bb18587247ebb996b583aa1f4bbf26fadd19d0bb307e7bb7239ebefbd628c09aa2eaefb7ac68223626f35e426dd889b3952b41f28c1daff50f6a123bd703483cba177b512fca26f57ce0c00efcacbc540c9c175943b24338f8164e4c866d472f05fe8bd8e48f8fd3eedc6371b7f12ca27e3bd698fc4935dc6bc6d94b1df0997f129b8fa7983b090bb5a80c2b84a52308a297edcd55ecda6ed9976f51e42ea29828adcfc83a9abe9344dbcc159efdc8ec83da1436ad0f2a6719d8356dd832c00e5c1ca941a9f3f8e3af7edcedb4cbab94a506ca224af4f2210ee97f47ebf430edd5965378d03daa7a79b9f262a7f1bf4b34d2482dbbdb50e20114e2590ab4b8b59e3aa551825b9c664fd8803a0b25c6aa5f74e42f0969780c9bba427cb67c92d17a817b5f68990d6fcae15871460a2c50968af40e503ef12d0a2d39543af2c6ddef81ca3eb6daefcbc85697726030a99181e94e4f30a04d03152af7d12bf9249288dc5150652c0926889299aedacb1451e390a9187fb9207f1359b9a40cbf35055bd008761124f15ba5c88a13dedc14063b03c004f3646bcdae0704db6822e1281fca624057d0b1bff4e688996482d1be8ddf6644dca643ead447a027c1a8abe0dc32fd682eab1849a052138fa33803ab1e3e1a5dcc1ade818c48933398747c9dafe2fadd8e5df69a40f4b1c8871e5a13cfb00e5cd15b44124cb2b7114071ebedb29ab39c28b5c0eda36e014222885d147990b0727507fb4f0ce27b4b449840da2196d63b48e80febb89205e88dcdce1bf91f3408336237330dacb8c3fea2341b6e3842c18ef5ff3256ca838a204494e284fe8c960d226920a27b7424405275c660671fbcc7aa6f8c388e812d39fd3b1f83d44a97daa9e0f48ef27bd6dc75cbd787fa2ad8db22f0ce84627944684d737cae47531a654333dfe6879bf1cd43e7ccffd622100d537e6bde30f41d627d77e52e237edf25353dd68897adbecd7723a2453b8524583cdc5c4474a0ed93daa0e68222808c11dfa258aeef6442d0f4dd78fec2202d6245c5124fbbd923d971ee6ce697eca9a7aec79877243f08a115555a393152d406719d6ffe0b718099a26c0e79e8583120be824cf48ad466e51fdca8a503625e8827c0057a0b423826e900c548062514c7e441a49cbc7778c6d4d8d8a29a1fbc8989d35073f2e8b984a3d41822796b208378ccdf58bcccdb1a700f28bd86bc9c196390e8075d1c288319074dcf9e070f3bed41935a032d9aa1e14dbbc1e25f37001ba1e37f05af8610855d28ccc6cafc2f8d5706f9f37e927786c2e6e56dc666b7b7a543e8bfbe0f6c7332e64a7ab2e9321f1191dcce22bfd798527758e45984389b63b4bb215b28e0d6bc21ceb46b7a8be0f0359afbe6dfdeaa00e192b919da44eadee1e187da209dddcbd5d9dfa0bfa71307a93c30229773b19a152aa9e67054d2c47c018a15697603940e9ebd63467bbf4134bae0ef7469a62d09782c4480a54179e3d99fa77d562f2ba1952d6ef8588a190ab0e44c1d044a720f3305372348f35bfc627a70780a12be49d52c1a582f922b21cbfc567b773dd718156a238e968c370614b06313908c1d736d72984f503c999c92ceb0e93a975de977c6e4aef5eb938516d538f4e93bd2f7006fbc6d008fdd397faaa9abe2c87cde26296e83c17501195233af77bb580cfd3efe12aab0e0960386e961fb99cb76546be11aaa68b842ad6ee28f2a05f7c559aab95662ae999a075831929086e088e8b0acad246a63fdfbe4c205d37dc993cbf9be9f20ce525e4f8638e721bf2d02d07d535e3d8addd9cb993b2c1fc979d56f56158da24aeab22f59c386fe536b58e3fc5d37f3f1e860d41d9c88e0c012ebfb2d08657785084a35aad7343305732ea6a3e736dcb112717c2580fe0207125896a7efb6a1a24b1d5b8c007505af8384c6850fb76ddf5590a8502ab8fefd4211232521e75f20a91c2e09125e0f35a39918c8bf127f1509282d20905467393d3422bc7fa8b97bc9519202bb1adfefbc86cbe3633d4f9257b4cf1c5fc927726c3ccc8f06e9e983a10951a329ea55a0ac989737ded7230470b07c2931f42dc235924b9e441066bff5d562b3400f9a5d94b30117ec87569037b128986b064711e72224409cf0bb87c76fa7beebcf3057ace118522c5de1665957f7bcb51cf64000a68a9ea3f242670ed8149b2585f35448b4acee0c4ac27a104ccd0a65d76443c2f1fab64f089cd1426c52c7c95999271af496bed4decab8b9293671fc108b7456769fd388df1e439560508c68e751c9e20f31bb8745bd234c2fbb57f8ebb562396836e54f848e0eec3e2c30df4d09ea29290a5871a47878bcf79aa46049ef9844254f2d9142fcaa665c4a0716cd6ef5e894aa5505639eef7c442d105968859e273456415678a91dae2d8982905d95e33aa20067aa5d7fe2708590d9dbd0618504ed02c618a8fc3f61a77fa496c4c8ce1f822f21fe06b8bbcf801dcedd340c3267b8d1b0f7ab93721f6870629fc5ed5a0c3629b48c5ce5e133bf2e2de7adb143ec4b296c5a2f2c98339ba8e29eb6b25a5ba23b1964941a372db6f800310b35f91355f28dc93fb3833fcfa40e394a8f33c9c69a29190a7cd13992412df6e40af78ee050689296b02c34ca21ee04499b9fe7e2de8d6accd0aceac3f8baa1e82340b16da21907f4cc9b629d9dc70bda2b09edfff8c59937f0775b6b5d2425c53efd0fd59e616a4940f0bc09d4e0e6f25fc0e432a13a7c1dba0fb1a1c2c6240103f6d23f8d6a0d6261e26a53e9aa6d08696fb0d0282e8f8ab4eea83396f7e444428f2180d863a7dda88838f8d1a76270ed0756ac6c0cfc9d27b36942937738658135b44ecc16e867ce572a8b8d1e7f9a12b6cb957c4cca8cc77f322aabf3005920f44ea72d40d5d8b904cb847e7ccca8424500954c7570971ab02bef8c698e8e2b06caacffd98fc01017a5360608ec8387d4dee18123b72292c00629c3972e0d6f242d118792dfcc981c0f2c64977c236800b948a83e34f65f429ccf13ee4579da761f17b1a653f33245e8cdf140c46d9442e3b565785998051e01a6e88e941731e66526cb0b25ae72abf8bcd3b7eafd1192a56cc857bf803190cf8cfcbd2972cc6916e2ba3a3985fe79a0a4e47bd25d4f9edf461382eafbdd25dec00b621e631a6272c9788d3b3bcffaedd516c9e0c8587a031356ab2e291705f4b4978c2ac2486333ec7703868becec1fbc31dffd2f3a4ce1302ec0fef624c675e604da9df3961ac3591ca2e553a8c09180efbbb53ae2c670eac7dd06361077f510617eccfa5feda64eff84158f446f171d70cf217e338c8e420351d8bbbdf54efa3855bb2834880e25e98b6be534dd726e462b4994d29d21755d7a753dd47c684c21643b74e6a73d09fe9fd87b5b587ae8dc39a0710fcf626718ea621b6e42d7eaef248c3601e1f5b298fc9cdc8b4d449ee3f3cac7a078f0de460f8ccdf222e4e97401d119795aaf13714929f4cdce3cff21e89cd652e10ddd813f0533f99d8169ab90dad4f7dd43c9e054fa8b3c250df7b7a22dde21d45802466b50d7cd15ed31179022721ae843218fa0725d66309b1e049de7f289e94142398214db6d48b84d245c535fac978d2819680790d7794d1bbbcf7c98a4d54d7de2f6278a60b5ac63313ce14032765f35cb263f069a8eb3dd5289b722157ad89b4f3245c4b0568b0061d29359f493ed6f754a399018f06118a57d609b86ce067dff15860c506c8a2e8bfc2a3cb33103ed4c30a37d941f8ec5050d52612ce86e33522661a9b998e284789f33535b541cd9018fdd33e3ac5da2d7805f83ac388b833c07a97fdc17850abcf2340c721faf3e19765abafefa586faab3985ae107bcf82e43785e293c159fcb7fa485498bc9a0541f5363a3358cfea017b6c7f8702fc46cbeed55638d75c0bdfc305a2240373e4f6f779e464fbbf625cf7ab3905ebc89c77ca2ce8466fdf6c5fe5d49cfcc7e4dd462eb51c1fd6b66265a660dfc610f899d25874c321aa027196c7ac5fcd193214fd143dfe13acde2a7d131b6ca1ab61c5dc7ba047d1b578cfe80e01a6912c0663e40e63dc88b160ed2cd2f67058233946aab2382b667618db01e40c6019f7deca76be51e94bb8ea6824bfa979b8c7c3c4d971d8f28d65cffa40b33648acabf33ad3acf1275dced5f643ee50fc4f68900eebb80eb9c2a116960c6d593af8d492c1744b33444d14be5c9d91413f0fd5d8cbeb701d148fc33fc97a0adb31cfce25b0e069a90d88e575c622445d73b587c85074e31e3078af669bad6999ce81042f767f6fec41cad6436ffc4407c1b5136a62b660b67bfbcc151233dc76f4bffd1a29d2e9a74654b3c01ae1d8a3870123c45908b1e0e83c67b7a62969b05f8d442bc45dd3a0e897091f8f907305d1ece25826709f3b8cc37158078345ea27a1f6ea34885184f280150921194963468803b1e6dff3d0caac48605e093fec160b674180cf085b3e0025ed5ef0e3e40c99a8ea31801e96e3d6d58224130ebc123e951f4bac9fb2ffc8e6aefbf503724f0fa52b2a322bda77d421e3b7068abbfefaf8d530db634c7bcf3f6546f54bc3d9ea341c688faf9dd6349b2a4aef5934e23e36b79cc974a1c42d544d711183dda1eaddd6b7a9dc26fc4b254136e1e72f0c2f50759535cd2ad0031316522cbb6cdd1cbfc0f53c40b25db2fc5335a7d4dd2f919599c497dc65af4aed56accddd0a78c0656012074d37dc692b2ab936edb7460a3becba6fc390b856fbc2ccb16042e5ac6432aed6d742834a2d851a494d7bb4e585db33a539c014ce55bd25b41fca4eba0308468b4b26000c2f2ba76e3e69cd2f311952c524afea669c793c5f11db925b40696364aee4d5e3a21a7757eb292b2fdac653aea8ea1c996ada9afcdacab6c97d85576324fa44f82dd49eb917768bdac12d087efb24321f4b02c7e46ee4b7cc60e4ff85e113774eb982de7fbc1ce40d07f6257cc2abd5363561259a8f08fa4786365c9c6c19bfda419fa510518c4cd866ec7892765c2701cbec65f474c8feced9c19d5bf4fc2e6fb2b5eac8cb4704613ae49dcbd2e8467f650fa094313289861e6e16cd1109c93b6f445e92c81a1bc63cf53128ca27f4d36f0c39d171800a472f9e29c2f90e0179c4c159e56ae229e7f23896bc9787304c39797e87fec20478601da575bf8af0f7bb0948a35960642dd9efa36f42e98097c3ea9120c8cea0fa8dbaae33799ce31a90a86613f6a30dbf0dbd517e9878d860d2d4eb314923081fa25d9c8c1227dfaab583f0a327bbe7a223049ca879c5730543f22851e3d797978f180d4d426c89cae0d6015843e21ee53ee6b2ad45e3a49aacfcac3b0625ddac4e8a7833faec8903122448487c48b244dbaa55aa8ac77124b463facdc8d43651a25dd7271cb08b3d0801b146c01fc46d5679d22dbdc70aaf5403e9bed3f4bfe3248f005589d6e45bb1fe2200752b04dc69535c04862b0ec965d15fa930db24e7b997a6849dc48d8c52d4047637b3a0417a128c9a2a0947dd6505b3d0ef09dd2da7362fd6320b09384aab771e2673f104528d04f7de7b2d9e68b63d184620d41d111f2c1d2df88410f317e2de4cd75fffb5d3f0c7a2abb2b781462460e0c8d8f108f04cb4729608c9646587449cc557379cfc595003472fbeb42f39cb7181afd5f5e6037a410f394f93a4566d262887a2d49333746235f4ff8012dcb6213a0592b352de66e832b2bf2ef2916b32746aea0fe2ea6a9ed8e9812ead0acc98a255bd2b92b3f2211a59841db0d8d5b42141fd96e6064c610da6729327ee53f75904bac1de6d5ac4f59ec6d804a6fe8c2da74c5900246f1e2dddcb07cddc8b33296811f43ad59a1a6f7a8feaf4c6857606950afb28097e709694101fa2bae2c1562fac3b6667c8bf4bcebf06e811f6107dad93b2651122f85e0a2e67dc7aab0216b22dad1c29f588426c568a775ef4a0b6f95b905067a5f810bb0a24809197704d14bc34198ae6b31fe5815551424f139b2c2b25db0c44c32c72e93ebfbb529bfb2eb879735db21786a20eae5484c7b48363047e2d95166f9972c46421ce0ca5284d4d0e8883ed89c7852d9769cd5b121c62ebb46b1b8c51dbd2b118767bf12f7b20f27d77f19ebefdaf6750994f1c411aba46cb3797092349a962691220dedf112dcdc1dcfafe3cc17afb485489651129fa6a33f8f0a9942869af4025e6b2ef638a1618c781fabab403619a2798e6e4465aa1aa8640cb30759fb194a96e48fec4edd9d91735cdf2ab6adc0410e7749c5624f97b7283347241c4b9e1f52628cbc541942c8f3a02a837d1e0e4a7fd5951a4b01c8892ee4ad9ae68d5321f3f0f8c80c6d03862888c43df8edbb0832b99e42431de0a92a7d5afad99249ff07921d5d44c1186c50cf97e10acfd48630bc6448f2044fdc57a02f33c7ddf1c4cc02810f983d149d17a27471efdda8b4645a6a54e88937cc0471d73c83730e02f264e5815d00426986302386439212fe37c1eb136bccba89eb596666cbd3b6c9599b9b2fdbc0b6232ef02abcd0f7dbb7ecb5c570aa3770d17396b412efd6d595b90e394e72958af7db572cd6f456b7b0ee8159359bea94bfa2ccec54f179cf353da35ea2236926a19c007eb9fed7a695d8d11d9c2ed917a345019a4e19c78742d2e73064893e3306d1adcb3f1da300cbb76402eaf17f5c63b1a39a9f51ad6d102d7c12d8d9a5da47b60e79908af0b850288736469f10a204b25e0f35bb0c78749a41359b88a8c65bddfd99876e5e2602c810acb9808d4282cb8427f14343bc8588973f6830b52b8dae1c4974fd914ec1f7ca9caaa309b4e03ec8c4e68bfa8e87498155559e1c1f56eead94f27f375ecb912042fb9d4acb7a30191801063506231ad7703eaf6242f2c2e6228173486d22f5c1304155f5461e6fcbc78950e6f63f4ed27561709bee260492bea521dea9ab0e047f1c0b692fd6947075003f2c82515a74c9bb937ce0d9133b7daada0b28cd82ecab155c0935ba6f4d93fd3239009fe632445e5d11cdf37e5db226c87bd0a58cc521e70e9007bf87222cedbf0c4d348bc9577bdf3c1800716aa5428639b0a676071ddf9d0b83564717e79f07946bba589a5048f8c25c12555b6dbbc26604168b905a68a049d4fe115428db9f2035afd2518f22901c5d1c021dc6f2e6182d7917d22307ea24dd5cce1de314903b6ab943c87c5009ef2b13c1fe08451ad6e235839827b20e7d32f8139cea17c7e20eeb5cab4df606eafe54a7a83a7388bb77841aa44e3af95d06331f5c503dbf07c592ffda235768cab126035623065ecb61569efe04235cc0cfce41c9dc702868eb1e0567cdee8ec583a9a5336d8ade4408eb7da2e0b35fbdf79d1146c737dc99ced3410a70bf4cd9c0b22d89db42e6dda319d54b5b39f6ed79f92c27394bf2feceb8868197f21dcf03528f20bbc18ae2370071c11b995e68e28cb296881d1271952222a942b8814051425c542c59272c909a2b57e8213a9c1a59903116726e9ec160814f20865cfaa182856ec5add8702ad1fb39d0230c250ecf9921103fc43afd59aa5cd52169832994bb4eb63ced7f1cfeba71f2d33301b59fd411a0e6f42866b8179e45a8948d6af323cc5c117480b707a3e3bca0e767873554dcbf6f69beb8582c9daa2adba874012fe32473d68a0325e6fee09589329f06d625566e765832d9b3883bd3400b20a0daa2843fdd2b680e9b4dd4ff30eaa1284a95c95b717b7f7b3eabb9c6c76b6b70e8e8ef59394de011f042ab9818f5d0e51da2b4f374bc45d827f79dc0a9715913c895114e4e79ab3b2b938b885e028c5865999adda14b14be1a73c8c4bfcb374877176d425b13d18fdf9c9573a739fe9b9263c364f2a5d6298b4a6f7833366403cd1882cc63be781e9d844efc9e781e6ae354c2a73482cbf0c28037bd3325d7e373ebc6cb6080d257cf7659da597f7b536131787485292662278560e00609f85fe2b202bd7b25185b1675ca5970934463265a6fd42a2235c41dc57ec6f66ae900162737bd599299d2e0b93eedd215b53fe7eabfda6a0b6ec6e0d6c32c4a686c547d87e750a42f05829b66db1ecc9a86e2f5aecbbba99210689edb3549ea5014871000fb6ac679d9f51ba883b0c42812a4935fc2e5d2c29fa52048524cadd0d3b3f45a151de2551e195c7356b179a2858391291ce9a13924eb119dadbc60d5084907ebacf7be0410671a8735fe8a995c57d96e8b616a199aedacd789ea1cedf3bebf39febb23608e37e14ea02aad9790d0bbee2f7fbf6c2c01d606570c5822159a305672138f4b4c163b256d98fba83135410810fc412ad95aadc9fd4cde58d316097b1e0ea92d26585b4bd157286429ea7a339d78ed688e575f31d14dcfa65c64f8afc46efcc2ece9e3378c40b56fac0f191c80c0aea909033c516236ebd6f178d9d349539af26305d734ab1081c93f83d8b65925b1e02c9190d659466dfcc1bc9f843ffcde46d39dbd424ad073ee404d6243e5a8c60d7f9221c401157ed18336239cdb9a3eecc6698e1df6bfe49c0972c00534fdebe32bd809ea00a058f5920485863ef16260daf45f63af01ff010bfc016346b3ad0717d1e1cd2161161b21bb8d53890672668dbfca03bb2972ed43387859fe06e66a9a7067c3b64ac8961ab2d9bb7d72677152848cb8d83a8309337474b6aadc8de58676afc37e20c9726cfd6d4621a1193eae82d6eea9b782787cbd323d3fad579529311ceb400013737eef17851c63e69d3c508f522d38d5ede79c50cd62172206014d4048573796cc3ddcaaf8643931be0a42518eb4472400d18872fb5980006c5691aa05209abaac0f81d25c96485f65cbaea3c2d64e2b3a9a79a7cef657dd58ad29c17590296d15e5ac4b5c6a5ead364688c7eb16ead48e90f4983f90b318f0f3b8972f91afc454f98838d4d33100637b20fd1b175d821e12c9473a80a3c6ecdea56d3bd62e6c7dcfaf72d387d30f1172f6808341131861a031b61d3faea438c867b5b02a98a1cee764b7e96fdaae10e18503a5aadaf066bcd18081996a6faf3c557437c34c6b6850d228e33917b966e8809440d0858e22e90134c8da8e10c1a530ba9c846619c066dc63f6e340c6796d1055cafaae00f88cda1f1a43db52860579bebddaf634cf77c96a6557ce4a30d87702b722919ad809f9adb47b54e841f18cc16badd8e298a67545fbe3acb4156647d4aa6d345e576d236988e4a5893b794d40643c527f055801864bd44041180ba044b9e90abe833077316dfe081650560e4ac1e0e35e57684b9c00229c478ecae732da8d49614b7f15a8c8552d025aeb45e2c3b9ce08ed6f3f8027bb8ac14d064d20fd10d6b82d3f5fc40bdac7d89a919a329f985519869f72ebf07cd401fd714b67dc1525a8088f558a7546ff549e7649f22c45ebf28eebbc0126ef372380d8d7fb02b51f50165bef3eb0d1a96383c807ed58c592f4ec71f5477d25d148f99bf54746476ce4437cbe8f37429f58a7718a442268f4c17c50c02af42c0a716da4db31ebe45540cb6b48a8300d58a414f999e05b2d2ecc39e46d0842048f3abd91ec057afb1677c2e36fbed3a9322035256ca195b273658eb36a1d8ede3cb3519da39eb13179cc1ca2911074c42bb21fdace13bae95775f0f62d78e08a8aa80ea58ba9ff5a2f4d6aab18f03829b761fd7cb4f71ee477d762a4d368b674b37757114c0ea03881bb0efa161aa2b736a1bdbd0dc5eba4610a1b7dc063478bf08aa562c65f6ff05de9dcf9a5b901d0ba47c8377cbe89c52d1904be2d91f069acf43c6c9823ba3e0ece612127ac5cc42fb56b72bd6e2d9562a3e4028e6bf35707443c1f9bdc6e970081104bc304349abfd2762e4918f59fa8646925e6c254239bddf2a9b2eed9d8f2b1fa7d3fbf5580f66c513c5b557d7bba07534026d479723e3032d60a97777cd918dc05a95102173bd1ae3e3fefa0db81eab02db14bbf62e2d6e993b61c345039e3c3a1c88bd73fd0712e8df51c7c015d4899c6f0da6520cdf003904769a8b65beb19c997824bcc67f1ea48f838400cb506cce5513a4adace6bc9c50aa4224b17df90a9b1ecf0ca558c6cc311b7378c6a8884c1203303b1c6ebf6691712fade8dd23be1d2ea5d61b656c26878382e37c99147ad858f9cf5023ac2f26f8b996f44108db8f9dbfa161f37bae2ac8dfc2fddaa9a85e8af6295d24794df7715882a58d392ce84fa07f0d4fbe865e0c61fc6f810dc389fb84d36b78caeff8cbef123402a45b5974408c1c48f75fb03bb36933f600ea69016546ad9b16784d4a1b6574e61582fc2add3afd520f81b3922fd3c7d0584a6cda3dc1aac1a0dabf915d45424a7bf4d0a66e74eafea7802065f4c75b4897f203a042467eae1c17fb3d36673e1009071b0aa098dd8677cc0b0df4913357679e34529b23a413a0033b5a51039a301db31f472f9f515cd5e3af74baf6e2b28cc50ac082f4a6fa0441544eb04e244cc9a96901bd44de00087edc804396c4c63c80213eb45dd0214f8ac1bf0eb728af0e13b5e21e4a6dafb2b650fdc0171d2bb9a55209655a975b7b8523e2ee9cf82ed0d774fd523696026c07e411a67415c8fd81a7e955f726d47f847018fa2c2bad287b87b2485d37d0621401eb1603ae3f3da0aff945c05eda3302b2dbe591cf14db01e5a82fb203f7a0e9e7f96258db36d3520adb007dce5696cbe03a37111e30643e11bdf316ee7e939bbe7b861436df39b4bf456ec351ba05ba061cd1fe546d4a6ccb7802b61d5078702240c2d63cb3f868f4ce883572130c8f8537787593146dadd7f1993bf0bc55a8eb0d6064f59d4e3996b4c98b8fdf7b16c6c234bb365e2e9b08ac5d4822146bf0580576ea2938385599302baa469094d0c8f708d1028bf92ee0abc698dc54cf6aa7b6a6851410e44e348abf0edae237359565e195f89425342bc6655fbec79a60d421a603dea021b1dd1b519a60f9102dfbaf68f63ab312d16b95c6a28a95e0300d7deeb3660eab2b8831e4d68e5651ad63ee55144cbddcc0780fb33ce3dc31de15c06ce97d60c01f54d3fa1c381f0d8a37aae6aa40cef3a82d3606ef96a3f338521196192c8e81bfeeaf08b96a1137cb93d462a4d96eff3bd49a8bd552e32085a35802e42592158e893eee4b02a80b55c99fdc75896a82effbdacf3d5184f383bb4eac9661a6940c06c66e4ba3f237d55ad707db8c3c612962e3aafb0a45291299ce6a29f539e5c30815de15ca668d9c0e0355ba19ad08a2fd2ff58a3971db4062c206e860039037d820867f433a2547e83cc94e2b406c63e3f8f7963c6ec2ced04b060777b3892ac3aceed635f1a05ddc4f8ffbff63a80bb13c5b08f879fb0cf4ab0241fd44b3dc6ee47e24a75e9da0297500c262040f3d61edaf5ccc92bc78d3b07ab4dbf4c4e662c4af6975920e6761b818fa4cfa42f0edc7c66c3cad433bf8080fdb9424e233255800f2d3e0ef99282bc6f0f0681c7c3a1cad5152a7bd552bfd5ab5012846a4b7be0ec79409f883b6741d8e562efa3f6c38cca2051e5f453612581050e9481d025f829c71c379904f0374e8a5b3e7d8e8a5f880fab3fb0188818c809e2649233aa3c84aed20b2b9116b84c8dd943829d34b430c7a5875c47ffada7d58fc47ecf4503ab4faeb3f7de87ff8975f5a237b4b99026212e813ca10557cb4af01560e398059b444512585b17e0ee02b8a2a298cdffb97f16b21562604ff57f53d88d57259b0d55aad1e746501bfb502bd857ae124493d4a29f572a2671ff572a2f77d0ae0ccd7196b5b2ef02d8d1168bfba66607d055bd685a5c995430a41dfcfb8b268a941dfe7904210f8f583ac3da95e4ddfd7562bcbeab57cd0ccab3e68e62bebd5f465998186ef675e4d5f961c3ea8f596e685966b061abe5fbd9abeb7ff217d46332e2d3568e6572e2d3568f52c57961c52089a792d3588f52ceb6a3dd86abd666065511d7950eb35431448acaf3fc3cc5bd7ca954314555218515f83ca18512f25277af69de8816f64bfd2e0ac00be7d2423f07f0b0bcc39b9401538dad6abea7fa7faca41a11e7425497972828dd68411b54f9526090a95d6cf654be00b07f5f55d202c85a3fa136c845958adcf04cb2d12d5bdda776badad469c58b0048c191d4c13628c49aa26c28caa5616e38f0ec6092846d6d704cbb3bed68e13b284a857d94fbd05df4fae6a539f7af04f453ed224b19ffa93cb698862b5c298d8efd3a1b6ecbbecf42714cec985737af0744a724a3d2b857a925a9dbed3fb09f52825d40b07f5a7878da717cc7b7c57b0bc47924aa5c2824955f9f8d110d593aa7542a1bea2be72e112a68af9522b93eae54454676aad33af4ac3e453a550a82d5b9abe4f7da94fa45cf8fed40497f1f4281b1a3636df8387b3fc0bcb5f49a92c51249dde2aa16a50a857b97caca1213aad4eab941d5b373d78882c41a29d4c59b620d1c58ee0b36cb46e589a56536ba5c2d13aa9deaadeae6898d426bc8cdfa7524f43a4fad43b4d68612922d40bb430f0ab6e4f33687e9084e51685aa19bf476174304b6c71022d6c4868bf2e6942893108e832fa27611995404011e387002de3f7eeb22510e74382f3bd68fcab0bf5ee6252c7ba3f158d1327a857d20bc4327e2fff643e26a1bef220dca093d37bce831b1c3f548ac649759284654459f0fbbe57cef8a4befdcf55dffe2909168b656d0af6d917cef7604e924ac9fec7258cd172f962f4d1eb6861e0db3fbd70c01c4f52557b0296db95f515eb6b75b9b538acbab27683e30aa55abd96ea08e230a94a2898fd7114a4ea7f8f42e1a050d6a65c38a9f7c749a1520f1bbfb7a94f29f5b131a16af5e0ab94503ff32b57959ad55757d2cc6bf524f5a814eac1127c317eff8919517fb262f4f1f445701945181d0c114c8c4eec30da8c0e260165c65dc7ef1db572e1d49ff955ea51a917d8fad4ea53a89ff915ead452a1c0577dac6f091c699c9c1ef5c2a9af8a4252ebf7a84fc251aa8fc2398138a7d59f50b13042140a85026988beafaf541f47f5b011f547ec56bd98c046d4a35eb0d5e9853a9d7050ef38a88a3aa16acd58732ccc554db0ece748c1c4e8a38f0610625cfd49a6faa4efe4c2a9abffea4ae5dae0f8adff6890b0686ac625704cfd0647f0fbbeef67beef7b9026098dbb2cfd5ca7f5c26102f37755a96392fdef6756bf7202ae5e382a96559d7ea53aa9be24587d7f7dffbd60df2bc7c25c044888199d95c3c20171c01713d8e8dfd32001ff737d39348c35954aa594525f55abb7384c604a49af5f384c6063fd5aa58e27d797f30d000c12568cafd1c120c16554e2a3fd2570ac52c954a91957b59e4017cee9c1d3c346d5af4e95ccf881a7c7f9fc05b3306b8f60e5e4c8d2faee3a58c6241cfb38f6c504063bc578103a4ec5a90fc24670b439aee33fc6adea95a41e7c2cab5712165b5f89bf50335f5f1febc9e9ddb25cf5224a3da8f4d520ac6a92a0360d8dad5247150ecdea67bebafc695c55aa93d5a75e4bf57b3141bda7725ad58a80f51d61c5c87a55925dc7fab1158449389ffd5e4c602b55129cd5cce32c81a37f959ad1bf55a5aa5e4befafef95a43eca7156afc259bd98c046d50b966361d559d572a00a17a0c862b4b55626d64b0d687d945a34d61fc072eba3f4d9131223f89f113b8ce07f556a46779d27a06be9546b036ce07501628cf6595c8cdf8305c862b4cf428139c016e3e9534a3d51386afb2c96d330a6583549a7df757ce1107dcffaefa5e42202ff54a566d4efaef33db1cf7ad7525daa23f8ac1ad52b61a57ef53855eae8bf048ef5abd48c95e609ea53afa5fae4f4f5b5f4bdf5718628f5dfa75e4ae0ef3aa25ea092fd5dc753953ada179880ea2e809faac205b00050802a5518dedcc0fc84c30436e68caaf1fb2376470c076195fa7d5f9da141824aa1689e9cc0d6077efd0fc6047cfb5aaae3097c150d123036d69712ea556f5d49a86702beea513444a857fd4753a52ed93f3dcab5549dd8ef34a6a64a1d3f1bb11d8449a7af9f048e3667b45f992cd5f17ba932c0f21e7e9a71e1d49ff11ec472d5d4b47ec66b8619df0adf8366603dcdb330f3e16b869a9f799ad70c5120d5fccccf60f32c960ba7be7ec6d79ff1ba12457dcdf8d60ba73ecd6309bad2fa9a17eb6b1e89f5355fbf66e6695e576a7ee6afd83cebb1046109729a1baea37a9cfa58825a2e9cfa4a915a1faa6ea078d08c0f5f57ae788825c8c675250a249baf795d8922c9899a67a1e22002609a826a6abee645c30c47c2b779f17cb1ef5bfff22fa60a5fa10da2fa195ff3493c4d335efec56a5e465fec041c68bef5342e2c412d1796a0afaea5cae473d5a6d6d3bcae5cd17db1ef692fa62ff67d0ac583705fec7b9ad627d5a616cdd7caa56ee1520417223be35bae9a67b140577d2dd52a76fcf2a548353fe375e5ca8c9ff1aa5ebed837a3e66bde83667c52f5327ef64157b53f569a1ae43aaa570a077c0fa23981b494552920081822880043440f6088c802668830c68c0e66882dc00c118211353a9821b000338405c00c11458ed1c10c31c4589f950233c40d2a3004588121c00cc6fa3dca005eed079e5061c010e08b14a383210013a31360887166743004d8618c6511fac7b2081d071361fd568c025aa5f29a4a558b42d9ef74fa4010044fdf7742598b8a3520ac63922a497d7729b156d867551a1c6ec2f103c790068a7bec7b1b57f29d6894b8c3beb77198fdf059a7cf56074fa1ebd40f6336b01a9ff4e3cdcf8d1f1c391efc1c8f23fc1b61f835c2a711be8d2b7c966dd5d711eb13fee9c3e7b1aa0f5da807623dd0f793a366c6d3dcc0f1ac1c385caa97fb84af2420d51fb1b5c6a54ac1136833569598a6fa05046b172eac576dd1be988d3980b6aa5c9a7a08932a171a9ad657bb24ddd4a6ca85e78a8b01551f589bec572e9687078887874b0f618ae6a7f59606f592c2b1e0e16952dd8025458918071e10e30058c1fffca65625c2ef95d4a3de845c621c08550fa85e58960d306764f5e031b2de59ad91f5e02bf680b08ea9daf4d99645a17846af64a480856f43a3d6af537c3f365e355a2a1a36420bc476a964a4e83126799830616ebe6781a8946a75aa2d1b3c926e926a52250323135b22b4b11dc224db65b45d6656eff67bd577fa1ef4626176e6e64faf141cbd4bb5493dac1734b64585ca35c57802bf9cd1bfd563eca13a559eaf4c095e6cc08030432b6d9c021026391836b4b058077800460821c008a165548d0e4688262264c004e102304184b16082b0e20313040f37dfcfa74ea9d47bfd4755952a0c6f6ec21b87fdffa79ea7c90f71a9cf92e205bb79d8a752a914f08c817901e4eeee2c2230209f73d383c714e10a41a02b0547283608e53afd0c96fd53fd420baa401004938058af62bdea9158af7aad5eab25ae631f7c39f88a5520b42716d0177ec5bf7c40dfe7840a082809080808685b0b6461f60b141ba4b241345a8011428c1c304140d1054c104cc4bcc4a2883d1144961baa882da0e67b2c6c05c78064dc2a711dfbbec4c29a88c11306cc066f6dac8630c93bb045c996ef07080890d3eb83410a5583624b84493c29205f68ed971d958ac7c280d86f67fc7ec765cec30b1e16f69d829aa8636c89b0b27064c2241fa3a56a51a9c2f0e6e69fc9ba0dca54d60c9e9fa1a2095b37ac9f81ad784615eed47d3fab1f9fd4a392545fa84696ca5577e051b5dc10d64f59588eb5299bba80cabf1f2752cf8a2d119e2c2c076152c873e43bf1d8184f1ee4a8d357296ceaa687859d5ee572fb1676fa180ea13d59fb89d1244608bec372788000113932b4a48911929429a7a5a22987ca658cd006a18cac4f7d5a89fb53b799ac4f6af55292c5fa68a93bf8f8ad56558552f9d7d7890b0f2a0b0b4298646366b40f74aafb64a315ba4001844937a316310f8449372a5518de7c03204306073600c78063be7c0142cb0f63bee810c60f5b6c00c40148e687324014f1e50b1553542f547c01b3a50a305b9ea8191dcc1624ec1428abfaafd65a6badb5d65a6badb5ca137046ca468dd5aa06c7cccc2b35e365c39542d1b86ab892c2715557b5d6d56a3503f542bd4559313313ba4e10426cc9626439cba6a5040d122590acb01faa89857d340bfba458d83705eabfd1a25e43b127425b5bf6a74eb18010b4b0df620a8d45a3c68d1ca8d60dcaa274f4b0495ab92cf5200a85b261c3860d1b366cd8b061c3860d1b366cd8b0b152b98eb5afd801c224df02f59282632ab78ff675d600750aeb63abf862857d29f111e513a68ac141bd3c655faa978dd697f0082b6c398d926a6bfd5e4b2553c980d5d67ae36badb556f0860543b8f1095184857d27974d615343a386c6874b542b2cac561182dd62b7d8174e874be77a552b7210b6926c93dd6285b045d8a6ef63358d4786a4b0d6da6ac5f7a562918565d970d12cac0a2949fe658aab7eb1b1d812d5fa90857defa30d17cde2d8c7f91d7fe3c2b1bf438af50171fcf7382e1d365e491bdce162edc8910327470e1e3972849023870839728c9023c7e7c8e1ca91a3a615e3a14ee15bd4903285e632f03f95ea716e5c2c009c70e3c6cb6dbc56aad50c1047ada25a4153a7b021045f49b0191fd22099f14a427dea51610d1abec5163663529d0236c395545d27d0488304f502ed67554b2c179818168dfd2336c6439874135340e82ad5cdc7033eabb66c8038a07ef538a45e354314a79f21f52a9c1550bf7a24d4af5ea71752ea552f1e37388429fbb1542ec6c1b7d6be8af5b52a8d12d5db174bc78d0e11fee686c7df54119e078d1c56846f845a47a84c65be9f5ac686061336063e0d1e8cb288f03c9e15eb521fe77b293a1ee7a5ecf89b19a240e2f1373f83082f1c9ac7791d8ff333f078e1d0bc70bed70a38afe39170743cd2eff89b97bfb25818accc5726ba7c7ff3588250df0b67051d7ff3483afee675258aefafdcbc8ed7f742daf13a5ec7eb8a8edff1b2597210daf89bd7f1d60a2cbcd0789006921410f5ddf870fcf77ddf97c5fae040fd8d077f427810c78bc9c2c45cb9e1aa4d5a5c56e6fba95f74d408c14f7dd28f65aa18368b85811f82cb36d998140b031f458362fa827ad530ae037edd62464c016152fd72c4d62d3e9415358ccbbe4f52b15833686c120e033f44c2c2c0afb971e5d898fd1d23ea05ab4920617daac3ac75cdfc8c6fac7925d9c0429b1aae24980d57526ba431f32a57d209c472d6d7fa52bf58170efc4aab1fe3a188d1353a982c618c37afe393dc06624e9dfdd9f1e0db5abdec7055315c3ac0bf71811f6b0a93ac97117cebc5653e82cf046631d62f388428558c8730c982654e362c1f9a07df36b9ecabf9243bcef05277409a3465adf8f22c2c5ca7068d99d6e7a271815eea9095efd80747fb35ac1a34665a5fea183b26592fb58c0dea69becf7ea171b90db0857259d7b1dfcf8d8e771dae96db586c8910e56558a75aa696b979f0ffe6a686f66b2ceb6f5ce02be9c78065ca3069f95cac2b59ea0e758bb56161d5821f4b40a8e36f3ea97e517d12cec2c0afffc5fab01efc6a85fd71fb3df8c52a161606d62fb58c9622ac0f0bf5594f9da83e09f55285532c0c7c319ab2589f1daccf162b84f5a92f298e14bb22848d3330202a5518dedce4d81fcb848da12c1722c047d17c3fe302ed67ab0567a09e956a7d1f3803f54a6a8d4853ec8f07812a2c362cec072c67d57888fb7e6afe53a96c84618d9b1b1aff362f1f53f3f22f07667d5830ebb31a1dd5ca12feccccab5aa1cb5aff25dd8c200d97cbe562d58460abc6a96583a6090ea779c1582dd6ccaab59ac17a5924d6b6b0ef4f9c857dff4a9aa9f5e4e2d2b22b2958ae1a911cc9127aeb86e7fb55ce0baad70baa2fe6311bc29305a760790f2594f8e2add60b04df9b802038f2c4101002b950366e78f480e58029d809045390e459c0a4e0c211e4f9923c0bd8e954eb176322045fb126c2fa6e4fefa7d70f21f8dfe9671e4b90eaf4c25961b53afd15950a69e55f2cf5ab179620141016063e0f0b8b251126791637df2389b0c99493f5b9eaf8192195160694c343e408482695c5862a56cc8a1096c475aaaf0f1f4b1048f3c25981c6878f44e3c3d7952868fe4af8345e2a241a6ff336af2b364fe3852508a4f9ff1e3c40df8fcddb1935ef35af574e0ec2d5876ff3493e0647f3b606fc9a9a9a9a9a9a1c9a1935ac19ae2b3db685a96ab86036165b224cf2307ae47c0c8730c9c3807d8d13347e86cb092d1f44e39d86e6a5dad607a4f1f69dc6a682de93d40a335cebdd9c7bcfcd3c2fb662eabdcbbddbc4c934d13c954b39e86091ea292eb53cd9d494d7d4138e3aa3aa7c803ffe09018a90b22ad509fc6af51c5674eb75053085eaa92127af4155afb59e4e402ccb7aadf5b34b6a4d555beb87b262abad298b034aada89a725b69c4cfa250b099afa0b5e0960ad66a672a0f6c5df9a982f6c3b526d95aad2a8ac5b1d5a2405b6b606b45d9ba42cd51eb67551b387da9191587107b43f55503545b51b656fbcdaa056756406cab1a51d5538faf484d590bf67c33d6d6588d4f9501ec6125f98cac836e9ba8e007034fb67e7e2240754175eb61187af50a565b715055f6845aedc9daafd61f75a7aa6acb5a6b5142d5046b415b793e91a5435542a5a1b1c312514f564705eb57dd1ad99fa9a05b13e54fab3c7ceeda40f52357d8afa22a98aa34f52bc25a95ecab405fb5167cdb5ac1eaa9d6140fd833024fb53328954dd52aabd6aae043d59505bfa5fab2bb5a3f9dba62d9aa4a557bc48a6045b0217cfe79ada9286b2b0d187ea0d561adada80adaeaaa47659d6c3dd5193f389628c55ad95a53b552b6ae5055b57eb68275490dc10ab13c2ccba6eca97ed5565b653504cbb229b07ea7afd69ffa55585dd556ad754815c1ce7ca9aa02abad55562b0a87b551415b4f60156259f5b322d4efb316b46015626ddd6167eaaaaa405b6b95d510ec4ceaaba00aacb5fe7cbd394145e443e154bfbaaae04d5dad642c187044a80000abb5289bc235bcc1c35a52abadb6d6aae329d7f90b582a191770e0ef821263c2b8e0fac2062d5c1730204a0bbc7024570afc480911e0a3ab854351a20a034071e5272b289144c6e80239d244091176b0e4f2e011a2c4cd8e903be3899f16d0f4f871cd549f16d4317c68651cc0e7c9709116041174685d6c8e1709c839cf73020a5c72c01881f6ad113e070de752838ad34e3ff88337b87feeee3cb3bc67baddac34cfbb94e63445e2ee3b4e02cee5238ce6229e37f229c6ed0ce489bcdee6cd2c335aa17077113c1c01c8fd66d676723bd4bd3682cadd65d84dd1a9887597d4788abb5128c2179d8a77df724653f3e17c1768027968029ba04ef89ae2410d61029a4ea756aa8414d4002ad103e66831f1046a004d6093158e191e373734ad5c005ff844606d544b954405849af986dccc9c3ed0a49aa2c9c6941a563f9f0174d0eaa2e95446d3a9b5c3044dadfdba40d3ea66864d0d39ed9c84d07283a583081bc01d9a6a5c35ae4fc76647756353860d2714544029225fcd4744c544d3e7a46707358382a2e963a1768039ac9eaf822d306726c90985940ba81da8195452cb46cbc6ea668523e5c237860da81d9f171b4e5834919004e67e464208a0ac5583b201eba7f3098146ad1c289b6a2185932a3add985151acef04b6beefb35fea537dab191ee0978a92a2516334639342a5ea970281803b6055e9f8706a588d707aa269061435d8a0401cd5900d601736bc66ef65902103146c2182301ec062773bfa610b92a0148afc64140c1cec9810d6a85230bcf0a4a88c108819c1083ef01441c41123ba3881161dc0c0041ae0c48e58c210bbed834e799003325c94400c072280858618a6bc20e54991922423889003471515c0d20006d030c32c041e191d6146172ca8926b2a830c1ff4600a0c3970d89ca00357640003139080037ce84100b3185c68e14911911621b80204162862890a52a045073880810b2480091d70b82107644e50020c5ca08a076469c22511121b1a3230f8a20b0f70a0025448a1801f78c0e52c862930b4408464882c6643a345083c6080237ec882cb1854204a826488c3e00b2d4200e68a0a502185031400440f59a8a840546488ec07484f8c860de865c0e00b1680f1c0151ca800150e5000103ff4c0431617cca84c4961471423084d98d4cc58018f2d3be820a5051e04f0a0438f298a55191f19768c53102c10544f800bb00ab04e541fb6e7e3a9224be743e17b1c23581e1527b5e3d3516fc01c15c7aa060d1a5f08d6b46684343b5a3a583c666c5629152a6551a8d3e9ab8eca3243c2079a52abd40a9ca1f249adbe105a483514bd5430d48c0a086cd554b0859a81bc8fe6b301b7b8c18826d40c9b5a813934210031a06986855609e6cca8c102c13945012b8a88069a8a3419b2b9c182336093980f9a6260c309616aa82799cd08476ab0e08e4f47575d464e2894a009851ac128cb8d9a201c3e253504a049c7aa85968d960d2b496ee8547aa6074d44f64a090d8830b5fa684e4aa00076a84105ce4085506b7ed4200304ac4e3041165519226658d6e9884d4a08c804c3e0c5861a27d84c9299125053c01352426ca080124a6c58800f38429e2c3464930158d1c4dad98eb881c6474d6581c73724a5c3a786999410d48c6ac6f743a4e40b6126490f9a6652443447aa25384892ccac96b48e4a221468ca01e6f8cca064356850332c24af1812d034a35a22424d87a6d3179e2a6a05d4cc6908ea042341acddca04d512d44c4a07cdd0aa0758b4ca618347093b709ca042810994126a985189a91f343f7e888c522d30b5e324fb7c562dd0843f925aa566c09d131310e8483de17cae130e9e958afc84201972a39ac1b1faa941a888054405037b803d500b683a6106387442e124c2aa07c8a3a6e70bc1862671a77eb64f07fc4e32bc6208e202196d0003c27cf1d280053031002c333069251b2669314c79410a0b518e8c9aa8b04406f4035602090078f00a0e9401860d64908211125e3b74a4b880200b2712b00292146421dc68b15056544145145d9c60620925b818200acc841df10823908eca10238cda0b60e00003b36c03840fa6cdc8909954971fb6fcac50b08502bac884f8e4b0c19a51a578e04c40025370f9a44805a2244864407a62346c66d08007e8410001a0e145100b3480010bc0d2020b3f3e3736401184d9010b468af8ac522807e440c503103044103ac890c4010ee0c3932223434c68d5207c40b06540328f033b0694816dc1c98b9a027b026b8255095a62ac08ac16b60aeb80af0156094caa3dea08aa104e3c6874d81cf646b56153e344c3dad4109c6159a719bb52a96c2a75b260fd6a45b9fb8c0f091ede88e167ed6ed44c753bb8cca489eeea7713c66fb868f3511ede54096f4c772fc1c31ba1f006c8696fcb1f7bd83f2e4d8d9aafcddfe60fe9a537bd38f2aff9bb57bbc971930a6fbe30070f68b4bfa126c6f13ef645883cac089147cd1bae511145118692440581f92928ccd1e43a15d114ef7d753be9d60e7ed66b88a3080e186a6e8dcbff9dd1d738971f836132dd658d63e646185ea278dfd737c494280e6f20e0c696c7ed1b8acfb7e5c7a479ea4fb32dbd5baf60ab1dbc4b37d6e7b5b983eeb1540adc7d04f7930dace0a181bb909e37f269ba234f10220448c88f101f2141840011f243880f213d42788408010202fa01f2010a020404e807900fa01e201e20213f403f3f3f3e3f417e80fcfcf8f1f1d3f3c3f323c407c8e7c7c7c727880f109f1f3e3e7c7a7c787c8404010af213c4274890204082fc08e223484f109e2042800001f901e20324081020407e00f101a407080f10213f807efcfcf0f911e407901f3f7ef8f8d1f383e787101f403e7e7cf8f808e203888f1f3e7cf8e8f1c1e343480f50cf4f8f4f4f901e203d3f7a7cf4f4f4f0f408e101e2f9e1f1e109c20384e7078f0f9e1e1e1e1e261e77b38608742ae6762815771767726660b0197e86999c1919fe735e86ffff77771d77146235aebccca8c611f797853544a8910a69f8c05f36f3b26dc3e7ff0c6de36e66fabf6df8a4611cb96fae88ab4811773f21364548a308f7d7e6ded5feb5f9283e65ba4477b9f6b6fc7b97dfdd6126b8cfc87edf2fb11269a25747630a0c321a3c7ed6eedee568dcf09795b8f6bdf2e2f4bc7be724cd698a8497d33407d97049d6ae10209b2edc5d1477ce66f34468c3c429277632c2dd713cb4610a6d807c89eeb2ed759e46c5e7c7e7f88081f6f886def4316e3f6a3e36cfdf7a977bd946cd199359de74966e3dcbe5d466b1a0f864ba391e1b6a16dd221474441ef10240f44eafce02ee264ce131614aed8d3c151e186cbb5a15ee0e000f4324cf4205770b867d813dad8ffd31c408307ee2410bdc8b18a2c96b828e78cd818bbb09a1fb37c6dd4b16aca07281d15c447b349b5bf72406eb6d5d0ecfb429da76351714511ca93439c556be577b5c9a4b66f979ffd6e5f0deb7ce3420d6e3f344887c0fec89fca3c0802716a08019dc5df490a6cc4e9be9ad0958538321308052d1050f05431f0f0ea043054048f1021c0510f95220e6470e0320b1c3142390ef4b0f37247662182ac3879caf090cb8be38f241b1029d1e9f0e4d434c62b0e2841638f0f87450c01e05b52161c46c7c5164101e110425906819a0f50d392264020633f8a12756c1efc38c0046988016b2e488f1a17478a20730247004891d61d81a5460a949132798180a6d60c304e1882b2860c28921225f5809744181088ea6bc00024370618f700197087041c4083c3231b6862270bcb003195c475d64616d597c088e20c114a626acb04db488b1831c3a788d2ea8c2f64c800b0c1c21cde0022190c2e2e8c11546a44b1491c41428aa184d1ca101202a10b203094cd416b020491216280097d90b90a81d20c009524c0102115c20204485028b20471cc062082a4576a840e400430e40c07004073490a5f2a440fa4289de0a6e7857ea141dac9864906206251c760d42406e89021801064f85b39a90828a8372878e071a9495060827664e02706420658aebc00a2a21fc20a84a084620f916377440d5c38e27b00adc2de085051868072ca2e832e408b80189801e315604c10422ae258927269490c3881712209e2bc10880987862064db81c3ff281061f219081065374ee405f8808810c1e48dd8080bb0835a42084a98c10ab2cee5f144c35e00014b5561963c68869222c2304481c11a30c0888600239a4b84007ce09a38c02ec504516ab6ca4250b1b9441431530509540d8eca8c1176590630420023ab8c1c1cce0a20ca205f4e85100530341023165885f4c09ad38018521a82ccab05180145c70451819b0406105193f00811712a2e09e1e09544146170350912983819a1b4a5290610505867441f8d0e5082da0204301651430d342cb9e410826c8f021015d582089296030850f4890b1bbf801af872e4683058420e385218a70d8e1072a4a88b203192978a08a32684032c07394850c1202509b9dce2b2ae870858c990844208a2e0b28a3698a3d06183b7041992058b0811c94708e5182259eb049a199a5a007e51854a8008ab3c70cb526b24c19834b104a4984a00224786008a43170e0c00a864cd841021050d1640ca52c5888e9620457a43064680ca30700dd8270429007f440648c206000992922c70950c000c818385c72d00204446080883072c6f0136c1c3e40820db20ef41023065b86a041065a52c4131e627c4003a1103e4e82c0c28f0d311c6003111a3d2a1208410b2d3186604016443f1c613aca95018a21030d9078f10080031d3e208618d70055a0f0218a0478200261889184042b4c81f54431e2061b8891c3439811a2d882450c225f88617301167e00635432418b8b20f4a00c9e03c4b840155c3c1113042e9ed09191a303465c01c6dd9d8c2c82908118ecd0e22bb2034917eeee34332a938a6f68c1bd2ef570af555aac3ac3042bcbdb8bc1702eeb9936c518acb6d3b3122b9118478a1bbdb53a103260e508894809d1d04c09d1d14ccae8e48b18f9180cc5a768dbd578a76ec9f50e357de7ee3b1ea276709e37f21bbd39b1d4a988e6db4dcb9dde0def9b6ebd43e2d2c73e6da7231fccb800230461a037e0a2898b0ef8204a15301de01f8091238b28fa0b5906d20c2241247821841b3e3da2b8c2e6a5840754414b40802d6ab45001d529b1c0e80a1a377602b0050a92482f408200c0508478a5ba2d9ac108257c09f88145471520f092022b402e5424d082073600c0fe62a7e606d0185f17055889043052fde6c93783147e10460a9c20e20628d00d4a0c248d501dc4814e6e84010728c0a8010039e82067c09d17440867d540035e7b74dc45c8d2e41fcd11f7a2774f8571772c6c51137777797822da379fb659cf2c77723b14a799e4f92246feee1397f865fa6a7797e2219801af99e74e73ed86205217772624dc79b6b87b16f7cde49e4e39ddd12920cddd5f2188e4feaab9eb702772076dc0ef73bfe15ec3dd69b887ee5ee3ee3380883d3a1aefde79dedc51ce4829b6d9764155f78287d60b5c6612973c62109147072888aeedd87a787882f4dc5acd878ff2a7c7e6a3934d51e37d5352eca55b9b379ceee45b7ac99d1497a7b9abede05cc6edb83b0d1220db8e92cb69127767b90a674bdfe6a9d34fdb9786c3c3eac5dd69786881dccfbb9473383d95a076c0ddab87f50a77cfe161f581bbdbf0b0bec0bd08132e5133c51a35752a9639b743e2a5d86b13f6283e9fc8e3da97e72ee3f4c7dcdd877b45dd5d8787358bbbeb5424d19e9ec1bbf32e3d2d4d91d01ebd8fe6a7c560ba9bf2d09d4cb6cf9dc650685fe2f3bca4bbbfbbadb9fb8d87f5752aee9c6de5ee2a4f739ae247ef97184d771ba71bc5397cea72e66ff3a6fb6fa8b9f7cda5d9f6b7005e8f70f71d1ebacedd693cf424dcfd86873e80129fe6b5bdc6bb57fbb7e547b3b9eff7d29cc3399d8a1687bbf3f0d061ee6ee3a10fb93b2f9fb6142fe5ef6d93bcba4bea5424f1d28c77d31d32d53b643ecfbbd34b6f5a334f774fb93bcadd4fad0f74773be304172cffd2d434fa37f3041996ca634110234646ad2e2d5ac02c5ac0570eaaefe7ca151aec7f4f437df0af448194fa99bf9245cb079d90507f7a1a56ffba92c3079d5e576858bd4e8f7ad1807ad54bcb077d9f7ad1807a9d5edffbd380aa282b3686b5f5fb98b0bc0acbfee95465b1a106fb16ac0f825f8d00cbb1b894ea2ba1aa7ce30a0441d0053ef8bd4af5f54bfa6a7df0fbae24d547815796ecabf6f7aa577daa2b29d56bd32ca949a9ff9450ab97120afc93eac1d7a7b2af847a3968df5fa99ebcb0bcd624d5afdeb258be7a3fbdd20d3eeab5648f7ca0abcacda8847a1f675e55ae54b91951affd2da9a3eaabaf2a57c6d4eb747af015657a496d962f80192de599d1d75d9c6aa169b3c418d51aa7b79cea1ecde8a805e601e0c2fd16002f017821003c8ed3dd46f1d289750ee3764e89f1466f7a77b7df19cdc191bb2374a7cd1ccaf80eefaabc367360c25c4ab17e8ce2de69a637cdba1cde3908e5a072176fa8d94bb70e4ebf57dbd996ceac715aa277df4b6eb344efd5ed705881fbed1ae1dbd5e1dbd5612be6914c86840393a77829cf7080e2e9124e75d88aa96fd7c8881322453adde51aee666274d62b2f4eb7bea71123d88a79f439d88a79a4bb7809111f3fa2e48d127d0ed04e77310e5b318feebe43e5c54bca8b8b96cc7af7c4e952d6cd986ece0812918d8f304e9182b2a8442742526e00e3862f4e65ca3b11927283016e38dda94cf99cd27c18a688657a79282f67273219122fa3378c58df50f3869a387d979ce715b2210c9a712e6b1bb8b868834e44b10d47dcdd867cf26ad8c2c534bf8fc7b51a9adcc71a7886a4b84c73d318f78c8e4d45b8d8bbbc1497e82ee7735113cec58fe134e760df43ef36a189c779d8f6396f2c5eb8d77e9b803e162ddf3bd12746a7c626969bf3bc42348c1169586267f466eaadb199e6194e5fdc0c657a66e599711aa7b83d9b010bc7337099cdc0e4e63e77b999be3823e3799772aad3dd341b218273265279e65c4e6d3c8ce6ad67338c535b182fe215da11b1bcf262897917b765f0c25d8c5d191a20034de7f3f72ee70c21795e3e71edf7ae26c34dde64ac7c41cd9c152dd70acd734ebf57fb8dada850b327a6d6d3a107a4ebeddd2dbd2f966826b1662a23c64abc615f3271a9d570f939341a13ce5dc438b531bd184bb3b97471b8a6cddca7d9c60b93e27dcfad61af6fc8f3c263ea9de7ce4674de9d9168bc25ee222d89158c531bcf71f9e735378a97b07017699ae93ac1b98b2e1581bb99b81a0b4b46ee22cd4879e62548446c4fd06ba69705da9767c62d85dabc2dfdb81b93536c65d7c5ef6b349bdb2ccd5d15f3fc5d93bb8877282f9f3b20b1dce4c5a5894d9b59e6dc4ea583535dd02e81bbfb799a4a3b4818a7b6190fa3431bc5b911a766698408895990c990743ba59c9bec23fb468f71f7999ec2f7c5e56ca69b765a9bb3d9d6bba4f26aa3da6c63ad612e52a1a54038ef4c87b1d20c4a490445a3595f9c2a91b94969a2d84a4e6d254e6dfa76cf2437dd4c48f4ed9eb6d406f737a2653224224c39485fa61ce4d3b33bcf4b9271c76d9357058bf3bc332eee5598964c5cceaa18dd2a3c3872df5a15550f2b41d16d31445416e9b4b88b39f3b509dbfcac3f072f99e76facbf8799e87062d6017177715f93cc5a5fddc34a9f8b740f3391c9906c39a73a5ddec2dd7b5869b6b1ce5c3216f3a33dc836948bf330fada447369163212e3e1f1f909627ba2777a8d3e67c4291ae6c2b8e78ac8e95cccd9b897b8779e62dccf254e28a78b354ca23897cba4d217b134cb9df334794a4c4a40ca9b536a255d2089c95d8cf54e9d2e63f34caf8eedc4fa3c4d5e1290ce49eea2364d2c4af49a5bdc455e46cd9a8b38b74d5eec73609a87511c0f5cdc24b6d9f063a5bb4d1c4e8abb8bb8d0dd71edf6455f1e5279e6db16b1bcf9bc49b9c15c44b295b185b1f56ea8a9cdcd83bdadf6a8f94844d29cc4b6e3ee1ac7c0ddfdbc3b6fdc347a887f44a36f52b2a0dc1213cf7c4f8c3e11f1be8f7729059339d5e697efee9ecb413c24bdd82922491c5923e32ee2c8f4625dc3c25d4c917858dbda3cb3c6e9d55ba748b59a4a3c73be53f8ad8295ee3efa9dcbab7466a3c7b87d63b42ddcc5cd84d18ca2e6f3f0d18bbdf373ce13ebcb7bcca3797117695a441a4d9b34203f75656658ccb4cc8c66b01c7a33cb18ac7017b5b943cd8d667233211961c2a816e76134065a0c412e0f2986eaee62799667a642021753ccc3686f671ccfdd651e52e1c1451a4e334943cd1b8db6ef631c121523f1bca899cb2815176928c6f16829bea1f9fc2961dc457df7142e8f5e52e74c4e619a72a3b3a3a4ef7e9ce6dca7f9319a3fef110632230c5c60c031f1108610ca0f0f5f08e3be6ff9c27e01002e608c7eefe6943cefe682961b6adaf2bb407301a674ee82de96a578f15d44257da5e8c4129f2726d13b4a81e9a0196d81cca7f7dc91e6d8c2177711dddd6ea849b6c0452c51fcb9765f9b630b52ce9c8dcaf2b6f0a9cec4e914a3bc272c8c71e76116b4b86f33bde74e6b1c79f1eb1b6aea74f7ccbc9dc91f43168cfcbe2d4729b3519ceb5ddd794933ca14ee62695e5d0c35bf77a2f961463c8ca273d4cce5ccd7e6cd6994253c8c8e5152a430ee48e65dbaff19c5a9908748524a143fb6dd4f3312eedda3303b3cdae2aeb1be484740eeeeb5abd15d69e625285becd23493af4db8a70e0a93fbc69b34d3adff7e9a6d38857d120fa1c0fcccd9088abb3bc9845f9bffbfc21747c715b6b8bbd83b6fa8b9024ecce16dfe631c52b80213a3322e92e62d9ff7f5fd231e1a79116fa8896ed4cc3a2326f7dfb8f73ba346372e626d428951f36e349337d454d237f78f71484fcc53a7bb45687d75bdd4d431e12734bdb5c9847fe7a227404f542ef6769117628971e47d7cdea22a448c66a534172d51d4049f576f268c3ece6512f6452138b9c2c5126332a73abdc36d949751a58f6ddc836533c5bad7263eefd1e3340bbdde658cde8ddead51a2c738a43387b7a9996eeec4282fcf7818358244c4f6a44c3389a1a018c7db79c9d4e13493f8dc9518471e95379f4a69e69544504a9348495f24257d7792de36cf8b9ab630f89c6dac9b78d182ee9ad0b6b9d3ab6bc2e3bd2661ce3a2663d21dc9040b17a9d0987061c2e4cec4a897e6ad4d1c13d86ea64299990a6154e82252a16db3c42939c3fae2c874a753a1490529e45581c7ddcfab672ae8725a12b10097bb33eb72aa9b299dbbdaac774f0c05939844ef52798dccced3aca5d84897dbd566e7e561b444f10c35cb8bcfad53d356e6193eaf9eed5d3e4fac6768366f38c569162acfac671aa7999c9d179766695e5d89e21cdebaa7b719a4a4af139c66a15dcd4c379ac919de77c94c75467438672261dcbb3a4ca2f7bc419834539ddeedbb8f84d06c9eb797e67d4bf4e690ce9b4b339a6d28d1904c86a4c40b39864a9adcdd95d07497372a0172acd35ddceba0f9d1274a6edcfd96ba1d0d979994d1929071777d7949c2f8a363121dd617a7242e79f93c833c4c5263888748b6707731cd4f4bb3d0795ed24442de7433e1cffb9320e9e2ee222e33b9cd5c0d89d12ddde9fe869ab8f6b99c7e4eb1151d344412a278c806435d441e464bf4a63b1263dec6b527b14ee72e9a8287433417f13675d6e532f93a68464b8c4b933477474345dcff739111bc3b2f0b39bccd1e6662a48799f4b0122e33a97b58a9b6d3425bb84885a6f1edea66ba8b71b38db5d0142e52a1096d61326d38d50919b90b7d50190fc1c3a030e7692a057599ed2026910a4dcff62ee3b6c99b6dac8396cc94d29bc369186483cb9bde74bb5989ad9869c6eddd9df54e9deee2f45d229321e132934690747923d9285ec2585f9c11d617a7c3249a51d2b4d976faee3b74f72d37bacb42360c45a7374582493417c964489777d312b74dde6c9b491bbd3c23b1cff1f103e72e8a73179de17357e65c9a5173869ab96c4389b20d3567256a2acd6644454a69e66d8ca639e9e666b8cc42b8d6bb4e54c0b7f46e23b844b1de283675268953bc64deb6ceb9d9be33cd7473256a32c1bade9e21c1676d9787cef3921b2b91e6c6564c3d9b31dd1c109f1dd3cde9349b29de285112739f3b273992c9c82edd1a25224262167ef858229223a5c8644096508cf7dd1aa72f6eb6519c5eddd0d6f866967ba7c3e9bb64e79cced025292e2fc619414284c42c68d2d4a8996e266c04684784c42c50e1f15132e112251aa9f8f8f143807630b83fc0dd691e16998197a7b9e3e9117de8641b6aeae0f392bac4e8cdd4fae2f6357a22936d8df73d65b21cc9847399dcbb9cde50b37775e7dd6df2c6604472a4148db16deb4cfa04f1b104a72f0ea7ef921c29a53467b319d3cd9de7258176335d8e9492e634c5255169ce88f8400428a3b41956ba9bf637d454babdf20e1143888743ba0c8132c4cf5d8937be95bbdc2e6732dddc5fdcfe14ef8bd3db6bf36557c87462ef3c7736ad314996fae2803c948520444c0c4d730df6dbd448223a0ab109097d5fa026770732729c3651d3f6681e8142f8c1c2c5f3bce4fdd1e2e585f263a4bbe97e14e7cc7b92b97ce4ee4a3cf4e9810f17f7dd49a2a6cee4eb6de6306e9b6836517314b7f9254e339a713cbdd317e7837347efdb32121f180fa39feef2e7bd6f7a3373416810448820475ca4c53ea724fa1c180da7bb7dd19ba9fffe0d35972e8e4477b65d3984769e5788f6f7f346cd477738725f9d36cb256d069901648ae7e5d79777bfbcb811c8520804e62ee69e34f7cde5bdbbe87ddc6d9753dcc6ddcc12e37eece047123f96b88b68d6edee97e8ade5fd399f93e27dcfd738974f3cf441e64b14fba880bb47f1d087cd47e8e2dee52fd3fc39785fd23c75bbf2afb9cdcf49f112466fa88923f7cd5d5cfbdecdbd7857e809e3ee2c78d863a5c7049e13f09cc0dd8f3ce4c912f2f0b858e2126314d73ee75b2da7bad7268a9752bcd18ba67829dffebc3bf43a79b1c43a5d4ecfd3e4f5ce9aa975d63dc66dbdcb29bea1b7fc12bd1fcbfbd36ca6baf2e2f486de47cd87a1bbd7e66b1387249638c5af51f3e6300ee9c5b277ea5d369770aafbf4b589dbdfab3dbedd346f8d9a5f62f29e3a5ce225139338fd5e8a7755bec49bc43a26243b5bc46839524a89e223bdc3db966137c5bcd71827d9a140b8a373519bf8865e1ca977af7579eb5be2adf1ae0a4e710b3b462e6e14eb7107266e21c69c0849d138d531e16d8a3711c3442e252671fae3a14873b1c43bc54b252ecda59cea9e4613558e7369ded7dc266ae24813c7fbd2bcba5d159c22e98411d1fc5a89cce77e7d71a10e530fbd9f66dbcdc4295ecada7c74a3bb4c92f751bc64de1ee390748c5cc41b9fba5c2651d38990943f2f999be8c0dcc52739633ce78be3944433a9836634a70871a3586ba41c2347818c1299cf3f4f73ebc7e92d312649f492e86e89872870114bbc71aa4bf146cdc7b5cffbf1592bb1de3ded310e0985008428f0b8bbb8cdcfdb96bf77799fd1bfafcdc7a9de5d12d7be779e37c528be7d0e3e6b17475e9ca2bbd79757e2d4d4b87c8c430a4ff062f7b99cdafeefeb8bfb6d3e265153e33c3cc18b8b29dea769d368361f8a87271879891fc5b8f678e9e25e7f0fbdb9cf19c9dd9d78182be3369cde93c4e5e79d661c895e1d9c16f130e6c5ddc5bb6ff937d44c33f918b795c87c8e616c8abb889a17476e9d7584c2d80d16ee35f2eaf4dbf22b91f7fcfb5a77712936124b14eb47cd8fdd5073ef722a62d1843dde696de25cd6af2fef718a7148214c27a239c5ba9c71dae47defe2366e9fe7853dcacb8f7148210cc8ddc512a3662ec51b978f6bbf334afe6b131ee390dc7d050f4d4881c6d8f61bc529b6d9ccf271dbe4bd7ebc730ea7bfd3acd3edf4ef8c7e2e3fe751a21297468cc460449872d036736693991123e7798570cedce80e8a4c66e466dad02cf4fa3e12112239520abe5dad71ce8891b1858dbb99983763bab9ad719923a530e5a05e7a4dd2b46114d77cfcd8e5f0366718dbc212b6ec73776db82c4157a2589770a4849b9d661d3ef126618ca358a7779a842f371e92c045a442c37b4762264c028e0420f71cc944822aec1146a442d31b6b7d6729b669f4a67b869752ac713a2bf13673e619f608c2dd5da4425b9ae19a9992bab6d3e86e86c934db64b28dcff31ad160788c8f528cf232908f9edd467739778d68a6ebe47362403e7a769f9362d3666e1497444230222466a1c425bacb413ac5b99d4633996225329f67ce35bc646ef2ceb499e2120ad668d6699cee6b2406b4fb1ca01dac6733774651f366a639c5b5dcae4889cc67d0de659c33b791262546b3a953cc0291149b29de55990538bd24fae477644cbf2d8b5468b627286ec2749dd060f85ead77eaf3e6a4a60e978f7739df7e7c71a358e74c7cbbb9e7c574d08cc2b43904c5280a52998bf0ed1ae522283b17d9d8d009d9d85862a24a506c6a78d143efdf7447e2749b35b8b87befd2683635ce5e794f9cc669129b1a4464a91cd4086d5237363450e0b848a7226ea631b6c96439dc86860a363486d0987177b1f7328c6de92ee8c597a5394d314d264b33ad8799e84ca4750b78ebdb44df7d87d29c4429e720bd82ee61269b091745b109a3b009a7b8ff545cbd29b1a921e3ee3b9f486c6aacd066ce6535575c2967dc8ccc3adb763ef5c569897755dc1dc86d66c02e2e65e0ee363469ba2b79f9b4bdac49b6a136343436ad226c5a5adc6bb06919ed0059da21536d737755c525aef2438e8a9e1021091545516126657492d128473a26ddb8f1518af191de9dba747704a5b70bbaa16679e6257833218132945e7ce65368d4e5d22528d63d11e2e1225d2e5d8234e4634926cb91526c667e6c6672dc73249383516c5654d8ac6a50e6584e0f2bc16c5655dc7f5fa567c2688e64b25179e17e4b2f4e284d91283d4182348018dcdd749b9416152ca7d8ca797edeafb7597b9b89d33a3a15331944f4117fe8e890daccedec90daccc9641a5504ea8a0dea8aabc70565859e6a51b58295550203b815f72a5cd89c409b938f1791b8cc68f5012a42648857991020f7fa537dbac4604af9afc4669fa361255cf91c580f2bcd7ab5d9ac975ed4ac891a3541191429f2e98eb4f9c4f80d3587dcd0b7f9906cbe232308e3fe3270872136193d7d36b68bbb8d8d8dc17d6774a3f868684c22de7dcbc7f888f6b6acc91f87306e672129bc12bd3c2327516ae526af2dcac65a7c3193a8a9d3f492af4dbc74f597e82d6f3e6ffab913a719a77517d5b56b9eb5bbaf7813f1e7e420d56a57f7f8bc2f6eac71db7c8d5e9c3b6f8a7318a733737fc95d99532a341a0c5fa2f76a333f3abe48c356cc14be8517b199ee1225d1bcb1a642a3c1304333ede293dc28de55c11acde4e74b9ae82e97cbe4eb4cf230bacff334a920197a222493e91e569acdce13f36432994ca761a0028399f2ced3cc799d7cdbbdce59bf1e5fccd11b356fba49acd338e56134ca8ba7d661ac4485a694f312bdd328d66816a2c1f058ebd4f2d6ba4c33ef51221d26c97b4b14931a97dfe4cb9d8bc69d8b6e6650ce48bda0121be927b31d48e1eeae149e369b6d7cab07a841dc1d04e2fe75e5eaa578093f6abe0ec294e8ce76840e02a0039abfac4477369c12d1418f0e68fc659b09e7fce7bc6cd6dbd564322d74434d1da5c4649a9320a1d84a4e9394514aac54a226a93114a2124a5089376a3a29314edff3a88512ef6ba6fbea3094281b1f6d9d9b6cbd1b2a312f972812a21ca4e0e27977a89933b7c68fe2ef9dbf73d18b2e8c66a59b4b7779e9dafebeedc43a0fbd0ca3e6f9b9bc770e7a31636d7ebafb8d6fbd9bd38f77b947f4e2511efabfafdb3d8a7559a6a4cd34dde59efe5ca67809f3f2921769259ee17447628d9a34fce82573728aad9827a427fc2ef7de46f4ae275090bcf045e312a487820469440245c923097aa4a3284e5e44b12e7f3070fd952b5fe22f62e4af5cf9184c9b22c6a9ade8c512cda91de91d8df6f735d6bb1c5a2fbdb834f50dcde77d1aed758eb6d9322e6fba73414fa3edb20b33fcdf7d873ea74c8d3ee78848cec41de9ae137cbb45feff65f834dbfe334aa3d1903c00fed4e52e13be5bef5d7e5bd6db44773308c10c6e104d30e165a539cbd1369c7e4ef10b779f7868a83cf3928b876ea859bb258a754c485022dd44a7a24e8e64dac9914c3b37d4bcddad65b21cc934c6c8fd65d98612e95404b22493c964ee7e3d94810d0e64e9f37e7ca6d99662dd794bdc2b2f86a2cb21349b37a1d2bc4639bc89d0dd0d07e5cc7b0a1d21c1e57502e5ccd9a8c42551898d4a9c96184a6904833130f8226acd749d885f128925ded908bf58e22fd3cbc3e9f9e979434dadefc6375bcee563de2ba599174377b0174dbdcd1c7c5ebd7159dbe9f3c4a436736fcbaf718fbc377cc6f4cd29e9bb61af5353c784e4bc3c8c2ec945e769ee2322349b4279282395689471e7a2dd93f2cc47689432c54b4f72510b42a599596042d23bd38b04ef9b974ca328ee164a89cfd364c2c345252eb3d0511730e8c2025d289de71532020a7274246e25d4c4385e46955eeced14eb72aafb5712a0205abf1e28c8d1117a7bd104252dd48644ac949750536f9d9abb54f75be3f2ccb0d761ac947b27df448b5aa64bf8379f8673f988f6224e8753dcb6a13ba36f333f067baccf9be4459a8f1f3bda6bf369b4dfb7dca5484fc3b98b9258a7692f6e9dcf8c7e264ddc7eda2e6d262d96437baceb6d8d53bccd73639b2d6b13bd3852e3257c9a27a9b37137f37c4d9a5b9ba4a91b89d8325efafbbdda6b9cea700afbbf4e9e66048988ce9517a7585f52ef926c5967eff2e7db7ea61cf4629a7338a7839a7f59d8f7b4a1e6636df2ae0c09d293a2175f4c71ce8b4b5ea4d18e3eb699709983bd7e51639cbe387d9de4dcf2febdd39d37869afac521a29dad445113b7735189cff30a0da199cc484419499718179158778473b788c4ba2322d40c4270e35e7f541fb8abbfa80436628280031b884181982cdc3de5a1180e88a9428c13629a10c384ebf2c74880fdcec748f8cf21e165bafc39243cec73f4538101979914838a418ac1f6fd9e2ea71bc5b39b6ed49461a414a7d8ca0ccd280996acc2117881cf5a0fcda1c5981138616ad4fcaf091100b9fb967927a1e6ebdee59d57e76e7a753f3f7ef498baa7455003112c89c09653fc029a8bcef386a1e1facc59e7a723ee1f8f1b29b14e67a65bcb72faf288b8d799ba3aaf7b55b9bb2ae5eeee4edc95782d62a5c7c45bda6d9d56d16534a79464e26e2fb820a50516a2201d4159c1a8c84913262a2c519204c99050d0b823eae494514619376cd4a0615346b5652144deba5e4a2e6561e43a1567d84cb799ee9d0f9071473fcd36327771baf56333dd2fc3a2e903577ca0cbcbf0ce79190cefa30f0cf181268fc1ca2099ec869a6789de251ae3246ee4fee4035e12e1349355ae70011829eeeeeaa548454b7c9664b2d9d6a63e6be60ddd2529b112999b40c1682e3ada3943e15d28b3141b798009b12cef97f83c470f5cf10026d1ab93620fecf040e8eeff211640c06205eefe46fe6548901a80c502b0d8f2b2870016a5bb77712dd1811df866c23a37dd5dd79f17ebbf5076236ada22f0329d8a3b3b4a24c6913299de4cb80325b8fbcb4aaca3609c904ec59cbe3cf2da7476345e32b79933539d6e3321b9e9ee1a651b4a74748591e6b9e9ee5ef1ba87993c07c4b87b89f58e68367b590e7cc0831ef0200c1dec400739d0410ec8801184155270e0eee00dc20d9471f72d7c0355d036104446f7e76c409734da9727366ddacc6d40c90680dc3fe765be4242035cb84ec51b6aa65bf7cede3d75da1cfaebee3670f71ab83b0d66e0ee22b89f44d8e130ee6f7a75a71334ee73b609a8bebc4faf4e676000ae5331c54ae44d9196e8d94e269b91e8e895852f62b8eb94e635c2380992a8f3d6995b97336de6a9cb5dcca3d14a5d6e57fb9c7cf462d6e77dad778f794fa3d17e480c851ff2273c0a8fb16d06fb22af33f76ce373484c676e18795e7256e47fe333cd497e67e773b6dea5341aed459db9bf57fb9c98cedc9f51d85b31b54eef4cef69e6d05daab3d14bd2ce9b4bf5b923cf4ba25967eebf77d768a5369fd6db26ed5353e7fcd2993b35975e8ff74e97cb24edbc4f68d8f6e37f2c0bdce88c717795bb0cbcc4557e4889378a73b5e6eea887554c71f721f2e8e894b88a17959e5461c35d295740087771f34e8cbe4c4911511194b1850a34b97b055ce348bc7bdb4caf6e279749b1b6c36df3b6b323d3babd71bfefa7ba1f52e214df6e66ba7778c9d428b6e1f26f48c5170c80c2fd653aba1cc9b4a377a8e0b9fe5196680ed22115b25c49a47b58e9ba7b0c60408114b83bfe9e57f2daddbfc8359408a75908dbee918f1f51363e2acd21ddc34cf4d6b74979f1127cb435be11ed7c1ef17091e6e5a292284a690e193541893414a1f284a2cb9152f4d0d67989eea5782993da1cc24df4798e1a9bdb093e75668a9491caad4d243952ca4671ee868fd02825def786d3db6dd4293eef5169a6295e7aa2cb0d9550304ed24bf19279e2a1f14897e65089e620a11b6a6ef42ee11343d9bb27ba5cba64ebdb4428c5465a974b97949844771945c79dcf239cbe4b8c6c39a74678df7d8451a2a3149ba70ee3249b091795172f21ab38a9921bdafa36c165163212cae5ad77422de872e992bbef109acd17089598878ba4b881bb3bed310e490a0bb8bb98dba1f86934296e17b7f4f7b510d2795e21a6eb44fc346ff226b9a1a68f1fe56f13dd7d8a758ff50d127dfce861255a2cf6399f0383d9320a0f8466c5d47fdef29627c6a5d9763fcd36d296f5ad6914ebf2dbf2ef235e6e9233520b4cd749941b9ad31672d1ce4525bacb49762e42898e525ca64f6c4ff6ee490fbd4e72463ae2e124392315e5a2128f4e64b7b6d33b3ddd59e69ccb0b173a1553ac3b316e96e299363546f1cd052d70b1c4555e544ab34eb2629ed74cb1f6d2e42f2b7a72a482175bd8801c889ff76754c76bd8801a0694e12fb3e112e3f2267a91878bbe892d4990c1e9bb442623cd14a3f8a6d35e74e1e016078d70f7183c64008ef7f4f4883c628f0e9a75d20c9729c6fabc78979ee74e278a243ecd3820e18231a280edecd4767ac7f6b8fbcc4328a6d8f7662edd8a8b78183d1d31033a2527a78891221f632a4dd8b6e1263228e9936dc34dfeffd129323c5369cef0adc43325f2a63b8712b242a9fcf40330458cd8f0e98122445078149fb35979e66f0520172012291e5b975fa40899eada8d028eb83b2e332a43f1cbb820d1f33ab613eb2f52e4457cb33eb83b0c1e76c982ba804424341a8d424fe4994a53e7440ebc976e14efe86e6e07e374d776f499c91d1f3e42807c7a786c3f808290d7a7a7f603fbf8f8d87a4a5b8de727080f9010d2a7e7470816f2b3436ebd4b77c88de2a58de2a5d946f1526d37d3e54826ad67ba34330b32d96c363323674664b219ceddd49662a59c06f5b6799a3b8ade9dbbdc4e28474ac13bbc5b419723a5688d8f4e7c24a4b30d25d2e5ee36f23944d29ce43cafd0798564b219990ce766999c695cce505c96266e66eaee4ca76532db89b54c668434cfdace48a71b33924cd6e3f5fd9bee462237dddd2ab912352f4e28b743673323387d971880a7446f5a22414644628bbe48487117ff1f1d91f84f8ff0c275ba23b6e86ea83986475439e24574977e3679dabca5f7fc5a3e6b7f9aba5c268df0c25d2cb5998b8ce86284d1d6195700327a9b35139753dd17808b8be82efd9d59803417dd7d877028519402dcb897e9e5e976b312c57a96cb22bcf04d5e1417e180d9c65a29bdb914efcb9be972292ea8c43a0a6e9726af446f6d5662bd33525e8c1bb3922832d97967f9362b49234bca8b71b39b5e1d115f10d1838bb48ce3d1be57cbc1d8f6349db969b6fc39348c6d33da8f18db66e7d5fa9e425adf93c4d836c3d836b3cdb0be359db98d609c8408db986e6ec6c36889e6da105ee453cf86f0b2b11e42cb1052dcbd2cef10b38d3501cab8e7daac4712000bf79c234011face0870fa46cd195ebaf89ccd4a34d7ccd29c11e02627bd105eb8eb2984d8e2eea210383407097144f370511065eef76a414420089a8b1bebdecd3d79b3d441047103c41820a670206840c0dc1d2fe5dc0f5eb8bb889a3c1e2efaa10b6ef20393c9c20f4b5cdc42469bf018b787b67cd9b2c5dd7d0bcedd7d0bd096d045bcaf0f5ffcbcbb2af8b559fa5084a7183d774b28d1a33e1cd9f9d4e799c9abc3279a6bdf236f6996282f9f423e843d6ce1ee3d74f1598e64ea81a987a1194e5f5c0f2edef4ea6aa636720265c9a3230f6178e0e29edb699cf280a46dfb482623f1924c566e3dd3691e7e87277608c2dd757ad3c1a8697b9c66272fe25d95abcbdfdb1b9764c638a41d8434b9cb3d2f2f29b1decd76b8d1818c0e4be860a4c33700070cc0077717f5c58f6b680f1dbf443389d3bd82138d5e9cfb137a273eb33ee137d18bbd13e39d8b448c6b610051dc457cbbba01c06e5700387d714ff309e263e6032bddb346130016dec56f02d022801eae77b0a7a5d98816a9fda8d4aface5a11c069942ce08c00820000000731200203024128d874432b164d77410f20114000580be627c529c886194e314328c186300000000000000000110006407e2caaf031ba6634736565d9eaf727125db8d6258742d94fbe8064855b1de6f1eac49e287ebc0ca6c829b5b6a97b61b3f1ecacef8b17a64852dfaabaa48c366a4c2fe21d3fadaa2685f737317afe8a1cbe88a9b0f314ea6859c8c17ba8e30cfa2805557720680a991d7fd1c6a13b182f0bb669f5c05860f100d58e95a647cde5f8abe79e65caf443ae83bdfd90aafd8b1b5a3aa47b4ffb34b143468c197626f303e2e5abd3f1b291becce09bc42292109c488bfc5837f366673c3b430c71d2ebb960463819a945409d89987475ca92f306ec17801f328ac89b57f1faf8ee43ea75f59af68fa570515fa190003bf31ee1b62a73cb782dea5c0e3efab7349e692979f1fb3b9ff2d580c19b2c4439614772c4bd95cd6b62714ef657493dcc60ccd7e5f6d9f043f5f4d072624df28798e0c17ac95e146ef98221b551ad98815dc33b8b8ef1d5d292a65df9298a2c8a2a89b7932f344ae3e762aa6fb86f7a1bf8b32029f8ef768305c5e4618c89e70f70785b28ea32b873686a12907a49e54fd1c3a6ab284471e2606a4c530b190c87858baa485ce404af3eadc618e22595c14b1fdd1edd1af04a42f60d93f640b83a5f0a9b923c9e0a631be86639df42d2f201dede038624f3706fb4b36cb271ecf40d46fa74520ac4d7e832f21a78493d91395bf7df274139f4d0af3bb215a27a6148d6544b64d6c519ec5e10d8701dec82b7ad8c2fc0c3720c95a03d3d3a1de82a4d61d9c179ca6ce324ba6dd25d5aec54182cd071d2b807e174ef43e0c5261f56f384efeb3719f9cc1a700182a3ac6032dc2ceba4107c470a7af23621c1eef0625a4fe57643df9dd4ea01932edf83738ea80eb10f1f557c42ff0731c02e6ea01c353bdab132020ac074eaa41fef1cbe4e9dbc72fd3a5979cd94883f4a5ea7255746ae3db5d73ad9a4b699f82e7ab8c40f53b06a54f66c617cfcb501d04eaba3fbbe9a79f4aad5ddd83ad98c5f6a4b68272b7dcdc52e1a9ef6c82d08accd673694c6112b7b5a71f97dcdbb2fe9808a7f6a008ee552eb37f09670c4af6d98d3ce3bcbb0d94b13552dadc715e7e3a93f10c505b8623ae51e82a3f0ba6dd68128e5571d6f9dd6003f9e85cdec46724a31f431c832ae32604d05f83362ec6499aa6403b29bd933ad5005c9eb48688fa3048d338632187a2b91ccd57d271e8a00aa3ed5026c810917062913d99eb4e9fb92477949ea10f520b95071f7ec095a3254deeee3477ea918bdbe020a8236e974ba44b1ef95a1b198d5992a0d7b210639afd09dcfdfcdcc206c6febd22bd7e7d189ecd498e69a40dff71e4d3fa480cc479b52685634e9379ace687ed5385ae738260afbf15dae8e0833120e8636639cb7320820cb75d158e151b8ccbefb284162cbca3a8511c6ddc3f1a77ad087c1e06e6ca3f9168125bb5fd5f34143e3470023ff2a65ffa76f317dd5b8d25038c7023e7cb3da98fb42738e8d16306aa89c40ad71281f1fee8231df702c9e9b81e01a00d736a32088e91407c9520bdef5dbed5965268f5e706dea53c22242b1f88ea19e5a17ef3ba1e35abe9d0d7fd276711595decb6c535c691baea15f0a0542b33309721fad985f90c9607811e7c701446e109ef0228869f80b64d90fb7d092b739ac3ed5921f05d32ee9a94db5a0d34e954785ab7f8dcf06e497b90e6ffd3a4fed53e584d2e39be1397397e45224ea4ee1f3fb97110c791852e688140feaeb759cd9e6e4c9518a6cc313b848c2ea65f68f6a289fe88217ba04a430ed8d1dabc9ac16dc13b44d42bc4eb0187f6d7adf4fd943fb5b04f93d99b7dfee3d68c2a5101bd4e55507fef2f6f767af335bef360e51945caad42a1e11b87eb0b60736fd92c164a09c9f1f7b6935e5c9587bf494b39323e482c122708b02576bd4b27931875bcff50c0a832c1d6a97bdd7b7bf9e8894a82141c2b89dd4de7ef0a9597b2578ede724bd0cc38fc5c44a5e928b9a657d09b6a006c31da424a70959110cf93bc18eb0e76a020980300d8132d6bae1d38bccf8b24cc3909d988804dfeabddddbc04c0e965e33e3b97f52584a04d8b157f0b17612da09d8562a04d67c477b30972c4e38fb99734e7bad051ed1f9b19ab67c3f54ca8771d4925c3c84bb31d602b45c3a2f856227fc4ef766392f4ae2257ee582982114ded8ebb835f16818429f95c0ee25605285a1f66149a1f5a86e8f48ba1245b867eb87c2740d2238cc0489204e594349fd7a23f8500947f39591590087724453ba763bab0159f9dee7602183f3bdcaf0229a6e54099300babba0fb70ccb65c30da9b046296b8f99002c02439307acb842368e79e931a3c0b6f56b88818ae7151fe6383aaeb4a697d281119f4490e05be701d8191e9219412b46349df28cfc8a529dcb14dc9ec85d0333e46533b98c8d280e982bf0ddbcd5c6d94a20983ea58aeccb56bdd6dec1d259a7e6a871070b6ccc9e248d482e1c0c9bd0d7d466695f9a0022806b3b7adb34054cb03a679179cdf481246aa549ed47f4ae2a2a612e4578a2782f96ff401f5f1c538f9cca58affb4a705e43070ef77671f7f4f3e3ccf1cad001424074b780907119f68e5028a061bda5d03a7d77c623593224314b7ee2394259940185a20eac9859edc0161f442f98a0679638f8c1191106f6453358c95f1200c38f313e15f3f4ddb46d36c2d8c8495b06ec95c125bbef2eb3018306f2bbd0085aec18506ce598b7f36f86226debc3ac1a2541c6c64e74553f50da19629100b219f5b591ba95b914b260c8b145edc3cde32c5a520d84ced4d5994990a3e15bc4d9b765ef9625b01814c6f9b1db5865651d3fc602f735cee3cc1ac1650b22dc91a0f315c1937beb9f41f477e12bd96a1a85ee7af8ecbc8f412cdc1705b8892c095ecf0cbe14296a39e78513f06de6a541b251ea8bf702f9aa01bab145351f95782c750cd8a9bc9cab59d36db1007b2ced8d2de39e387524044e558664c5ea1170d6e0026ad1aa61509255ea61fbfeb50f841dd1a82905522e10d985a44cb718bdff56deccf72a3f222688a2b0597010a431c2bdb9b5ec540bb4d510cff9ac9ab331000148601a5e4e609d5033aeb7371bd5c5ed1b3368e499d43acac0444dd9225f011c1ffd0a8b9aaa6b6eafefb66d870ad85cba06d725e72e17d4f21d84a9cd6e38a9b4fa37d6f8b0225c8cbd8772f9dadcd6222dcae3aa0b41f1f0813fde01f6b42d33f3a832b9314c42b0b14da85a1b02309d37cebb3717505443e1349208e5a2610113615cc7f0312cb096c0ff78a7c0d25b9fd649fd90c3c941bc7537caf3cb6f443915fef25c78f4422226666a526fb47378bbf721b405c9f29e4c2d74cfa47bb06d7f01a0d77083ab37db4907ab044296d5f5bc944ec1dabb727c90312eda037657ebf60d6b502b932d656b299e987bc78b5f2f10f089f8733194843ebbdcb2d2cf769158b88deb005e8b6949887302e91573a12a0861a474fb36fa4e1ebd772d361eebe9b7794ec25a52e3b4b3d6a333fc6db4098fc4b4cee99fad061ab46530af220c98877876884a4a66cc1488e454c4ed5ce798fcc3e7f1242d16c232be8dadee82ddc0102ee61e35c6c12f13bc2386bb88ce16c7252638484108e37e36b3cda8b4fbf9748422ee946e52ec2008831b36068d3ee242ec2eb1eeec3d0c93fe5dec409b566763247a5d3dfa34f6ba3366339016232a1ec8d145ec1a8aaf769caf4684a727635c561a5e901a5f4967d40e39be9858c858397b20176771d8e3e18851be0d9be95b0e85a930e0b609dfd1b45272049bb3ae3716067cf8c803ba51c5bd81c4b6ed674add669314844836fb765607718290bdd854331491757dffb54bcdc85c598dbc84f17b0a836ffe3c5d5805312eb2cf0060556b1401e304dd5f44f63bbf036e77f6349cd46ce0cd5a055785a4084b8323e690014ee0dee9933df2772ebf48eb187e47a998c16efa79ae8295f96e3115234073e6987a77527286a02e8db556a3b62cb284973209ffd228ec70be782e88d7e151de25961e3ea21990deed12780c89fa7638aeab257f727c1a7744715b8e257bebdb98b26c5d4c60838a728e62a94d9a98959ee2c77bab6b19a61dc828a149d7e48bc73b408582910dad47f41b428bbea64c06fa79da63384c98f637e5d2182d4f90a289cb1efa06b4cd72e546526255547cff3262d7dc99a6827d574d17421b042a1e0ea5c895845f31f216c062e7407e15d967d4b6570ddb868d5502e5ca0b7b47b38a9b5b1e1dd2d6bbeced2f5718d08fbea9ed1fdf9709048faf583d00757888e76f9619e4117c235f143c598bf41a3a96133358d823ca1cfaadfd29238772a2b68622f8b93c4f6f64ff0f9e7978a3942c73199b66be3fbf5f42b87ecac610e8a13de2b4e62e6db7f3d9be1095637742d649f68bfbf0567eca032c8c04373709b1add181085c07d20f47e313035c43c7d436579d5af57f3a5555456e4c6148050b1a4aac5d25c3a74162eb054e1e0e9913e4348c3b6f21836b0ecd4e2ed8722247f8acd83508453e85dc338ce5d35f8a2d433eb2d4e288ab60b62f291686c047cd9b738857442f3923e92aae754aa1fae01a6980bd31cbf587cab95340211bc49b35649db9a3eccad6138aaf5ca979e5286a89986e4c51de27edffafd6bb623a8ee932c91dbe8289b7f9b5ca23833314ae7c975b04c87622b9ed8fd56220fdbbd03cd2c1d00f95dd4fd3e289a9ae52be864f1eb58816a00df43372c1299cb1fb91ebd940c00417599aab3c3633880e29757c1210b746dd20b8d28104b8b5512f9ff9b0ca5265aa1514823ff3f6dc10306033292dd0c9c73331a2d373c8272c04e8b64d352ccec4075d10b837191950e85a39d20bb28d50f59bab514b50faa5aa18c5854d3c411dfa5559b1a2d15cacf82b38da102479553f69e96bbf8178bf6973cd86b4f4a32a6528577640b1f0f2ea9b568e18257ce5743b3d0d2ca345fef43e78d72623a49e83965d458088c2224d8dcf833d2a453242f476fb9882786e12405f2b6aeb5ae8520889a51b4fa7afc79c0125481519da95b1bdcc9eb3a66164a10deb8d86aff31d7cab170001449301378d33ad786565993973131f592ed9cade581f6d14b9ae7018db3725b0c0423e9fcecb2ae8b8651d669f6e2b3bf30011cd65e2a710a711dc9af4522e8fcd8e168e33d354602ea68e25142343e0b49402617ae20616d2ffeadcc99b5c38f82b880dac2a9a72b0c4387863a3a34d1488451b4bf84fbb2f760fa077bfaa7f3b0638c863ed4016a88c9e28f6f4cebde257439b7518484148f662f45c9a319177cf0ffc4e94168a3f43e49c82074f63a811138b9aad95c32eefe4dbb3e1685b746ac75e145ed14fb98ea7d70a64f22501b6dc817ba70ccc7cfcd15eb2f1fda3f08c0f1307329a0c821d642168b40926d45035453c8067c048fd09cb61a630de9574b798b4f41cc438d5a3a62b76a6e633622e312a49f8f14b88794c6879660d48e4809c4274bd7870c8eceaf596035119be0df4956a77556054e803126babcef28b868a0188aa39b0448b1d836028b859537a75ffc6110baf7177be5cc0418a9068feb50be2d2163d12084ea9c94ef75e6d3f1b2991002d92af44a6404b96e1906e20b2a5c55facb9db4e7f51009caa89a28a58412fa9b232a6069e0d1fecd79ee4f138ef48166704a89c056a007a705533fe6cecbd98a808c1fd371bb020e5c7644da226eef725c611ab783ab29d189cfa66671248b0ff8fe8f053c5c02ff3c48c689ad7893d9e87a5a4c2cf19d189571b03c9da32d0e6274f30925bcfe3688163e28db85fc06bd2677189c643192ef3e51a0c73ede5cb169b5215788119452881271901a10ebf4c4c12ce4a0a62bcd3dde7839ff93bc20eb23bb24645439cf130d399588ad7ec5bc2db5a2ef7ce2e4bddd7262de2477cd58ea50127dd6c2ee8c88374662a75432f1f549fef6912d3de79a11cedf5b48ad878e3ac1490593649438f4ccfd414cc4c1787c34baf134cab0a11c96836ef7be67c5a9b4f4c06aa23ed75125fe5cd506c8225b980d645016aeeb83eeaa84d02fa2bf5559c8386b99045d35cf301d4fd88499450d8dc73d4a440c0ef4500fea80e81064f392253cb6c11a89b3386112e70db68bb15980de23136061392f41d2520c48b5b1d593871f74f5936ba801996a34faf1d276c51b45d17063583e7e60ae0c5bf97b50573d14b93146a31b214ee55fa7514d0919f46440ec8208fdefaea0000d9d3a49069e9508c7390cb6a0a181fe1a2aa519367704a9cfc987fbd25794e04b3cd7a63debde0c4faf1d360348dff6797835cfd269b66bdd4be98fea721df16d11ac9e8bbd7070cee7bea8ef1c60586dad4dd30d91d6e3b5d4bba980987af72b40b971f54e3f1dd9fc6a4af7da6925ffa916d2b6093341a45573b44f8b55dac3c64dad150ffbad45ef8bc7e63bf7df00d7141066785da4e67e4eafb1e15f4fde9319f99c86b70d18188ecbbb587ef51ab5135a221b27e95a4d937a832dd40cdef13426f2e7ffd09be5fad4dc9a8965a624774af96667c183cce84ae9d88a1ed5713226f07e889a52c88c2d8f7d742291d2c80ad74b5de371e74bcaa4b47d7d5120762e620fb466e2c434982935a483c572d7bec392ba73dc4837881a93f7e220cdcfad8630ef84e903f3b2104fe7ec3b494f2e98673401f614211bd094649110e38b2a081f960fd33614e50ef84080d29e07523565ae9bf1b6cb9c0d8de8026ed4f18a812d40550ae685c7e292d7a649dcd4b6bb7bb8c763f7f4d8ad85b4875cfb11662dcf6aed0cce86229e0c538f88a72996cd4828b3145ad7d61130f2e40d4d83bec8b7f8fd4eb796b36c085bab346e3f17b704a5a70a4839d194cfac3ef4eb67cca27592f823beae1398e2bae5d3c70385e1ae208b66b8c93b6c6b03549686b488452bf40c55bfd10447e60e54e404b5d183a9079cf84bf18c7793b270b1507e8d426e0274aba20da3c5596219dfd64b162214b06701a0d44f3a1715360de7fde8e6211fc3febd22984abfbe3b5f2fcbe48282ef62d273c754f9df09359f288874a8c2b788d49093afe8247926952b46de86ce593ee9ed9f6f8bf389bd94f37918f22fbadc8e94e415839d75243138139e77fdc3f6bdca8d1ad589bed6a11049793d7c5863c3a55445c2e59a1732a765cd2c180092c8e903f12cd8237395ad6133036d35bd7039d4be1381f4b59914dfb9da543f0dfa2db4e558cd9e035059c03c9fb746ebeecb6f14b48df879aed2a0e8a5a9e4d07669a9eee3d358d0b68bbe2f8ed91bd03db8fbffe869586f7fc12f2737c7377956ce9c5b7602c8da18d0f01fbac6410f24645d80c791c8939dbc64213f78b1ff2f12db4e41df0367adfceaab5ce22cda3f601fe7516a29027f49937df86cd578d9a5002dc8d5d976704cce1dc22ff55ca1039e518380445d6fd996b8c22636eaa8dc7274fa0901a3651d5eae18b3219c88101d913ab986c823b7e682447a4e7523a02a4e13ed10e068421446faec6bb26aea908a2d40625aa8120858394aa20983a83de38bc8d013577710daef6eb1f6e415118b117dcee0d38495f0bab6671b08ddd7e800d328ce8d272fac236eb168cb89c93177ddccef51edec077f34168178dae2422c2200b890b3d983298b11bcb3071ae02e1f960f075e27c03f9f1ebda58cdf87b7035981363f713a1341ef16091cb06f1f6df5dba3ceba095f2e301f1684cd022831928ff719e2d60d3246f52a5cd0b66a460192a132e7f57ba808990fda86789b1fde6602b393bbfe20219680f5c453248513621da0410613c1fe80aab56a024a1d39869875aa3e52f17fae8b97bfb1e491c1321c5c88abd046908ff8d920182a26fb4d90f414e27228a9c5938dcaf47ee2d3122cfecbdc12beed13c5e6005cdd46ee3f10915d005b38c0289522ef4cf42ec6fe4282f0d71a26d9a6f09e85fdc2954618afa579a3c217f6fb73192b4add011288987c3d778a90c8a96e0c52210964eb31cab192a262a8e9d0618d621885fdc26800e8e31185b724ab3ab0665ab0b2b62dc17e97adb4660ef325a67fe0c4dfa18ed38c353d8e919251140cb62a68a0418d64d5c8846cfcd1916de30013263ea701c9f0325c492c0291e5df55f750c81f57ca159bc1cdf8623d41e0a600754f60d62ad32d7fbd84ec1f749f91e9235b4bcf759d76324991ffeea6648e4113131c5b068ef8e602f53c842ee28912787fb10efe73b673bb26c18464ee47ffc01761aa2757bee8fd218a1918f8994462a5ffa444cf061322f78969f0f606f6aef921f1784ac9ef54621807c76e7976693657d504c89de63e1b10ed3fc0f3054850a58c9024913dfeb29a20d4227e05a8dcef1d6bcbdb6c552fffb27a7e25fcb0c9277103cf03bd0f8a99817a0253772a4e393b0078e81af9241982a40c7647f4b7296f1d117428e247c3df1d394030b548fca5bc51e9909b3a4d3c81618a6f9ac02a9c10cf08b0423f9009f8e3b575e954c9f689a7903e89658d0659fe82cf1b53c78c73a3aabf7b44f1e648aa1c3f71548f77e7eef9ebebfcf68fc9a10471c90cf3df56f55b5c948688b897f0aa8a26d3cbf1f50a7a0b0000a91831e413dc148c74ec0af135b7f845933e0ea00856dfad0b5e1d3fc240bb98000b8ca20539d3ff7be2ed069b660c9117d288e226ec0623b0033212a365f21c4dee2b9e79aa03f4f0ebff6878112770a0fde1173ec2cb6d9fbaf4fdf5c24e52ec1523a1152b643943e268c940e053d0d7ca0c5838425a35c39206f0fd98ee101a5482541a0789a6ed4a82e0d2877ce8500baf95b3e802ae71b69dc4b971a2fa3fe7dbbdbe60e68143110d912928e8a678ebd0f5a76f564ba486d5cacfdc066bb38424db58ce1ad71e2eb9a33a2ca674aaabb903712568722fabc9216c4f22ac1893ab41d617277a969d51f236408990a7eac066fe52824e312c5039dfc19221cf0c3bf549a67d377c502ff38339587693f61ca77eb65103a43dacce003cebce6334e5dd583a2e22c67e15053c54ebcc4c4c8440a2a194f2f8f94afabde8bb23112d7eef08b8b132b8d0191cc5904adbc7057ea1686aede73bfc315d1022092a15aa6ba6566e496e56e464eec2950304cc15c28438d3543160cb505f31c8131aaea642f2664060cf39953a2c08fbc88d0b240aeeb77d464384004320363a9d41c0cb11ae207b3f11c3967cb8f561dfb138d72b31013d0b7fe2489b38ff51e77d17bed0daba5a9015b1bddaf42779f6524fd93e5e10bff95f0fc6df1d5f9ceb5ae88764a439ab97831c841ed67bcc39d626f00bc9fbd207299528a319065c2cff7a2315c2a48174ddc0df9d5b14c2730e9264d9a17b973b93d51545baea7e812e50f1f19d96baf73ebf4888f26f7b389b8ffe523017aa1cbf764f38b19a502f2bd04d008ddb4cf975edacb66f69c137b3a53b09b7a8f2aec954bc10e5a96c207d650e0de6813741409bf8e10fc5e7016bdb04c1d5f71177329b4d262aef03d50038bfb7e8768c85d97b4193f811fa333bffa0b2267a98e6078865efe1ed5fa08bffcc35ecc2e5306ffc9190f6a71787b8aed45e4ab329a648c544aefa8314f3bc86eb961dd9cef48d698eef63e94bc71473d9d8ab67395733d89c93cf9ee52f1bc0334bc040663378c191bb2bbdd1e86c76bf7e91f21aedf7e443e14b5faebd9c63e98171cefcf80e86a869636d4478c1bd185db1e4acdc1140f803252da6bd8bdd7fe3ebd54e279d559ec0d593d0e190d1df3fc56289892272a5f361403e21e91919b7fd3bfa75b5140394f93a130764539b6c5774b45c7df0f767954ad557cf03920c4afc5dc713c4e46cd19ca9de214e63a9fa9e3d11ca8a592e94d58aafd6741fc2ea85d70170de8523f83ff241303ec08fd413eccf47d4021bde6e1db271f3977b07acc4b2214179b3051778313dba9d0817c0896e3909069669f5b2ca38837c6e46fb712cfec4f29758c89abfb144047105d8a0ee2e4cf29f89142f606e56e9759d021fe994306e23467578cec04f824be3496e94bee4fcb61231850902d0cdca51d4b0a62f17e827b935ec1313d0e48ffdd2ea0f18977ba9efd03f79433f386c270857cd1e03df0dc59fcae8045c02a7912a681e2c97b395356626197fd22975e40ccad39f9b486887faf2b2fea55e418612f6729e28859c0dfd9009781a8632fb1ca4eb455724177f4b57e0cd0153dbf8c937918442646c89958da3438420e4cb9173800a442fd94eddbe1e19384eb2ec79fbc5daa6ad0190241909abf94a0b681e513428cadafa9922f2c0d074892984bbcee65258897ecbc3f74d8a0ec315d035ac323fe285eed5c47ae6b54a39f6d8889887e49338158a559f1e58e0acfc86a5946dc6462af203eb482f47149de2882dd94e8374ce2dd53eebb0b6ee58f1f4794efc494b0be94f1b5f380468256eb14d0a41b21693e93d87b7145f32689789b625e1bbe08e1d7cdb19bbe9ad73a4c7f2416163c85490818afa4c0e85cc9a963b79e944d2be1d1b58e9b37f0e3a62344d3393955801a207746dbb38afc63b6de8354591acfb8591b56151ce9c8226fb156deea9c432530ffdbfb22ad542d0aa1fcbc9f799a8786730ad4dc2fee6e30400aabe8c849985b6f4910bb8185cca86a188aa628614c78daa82afed3d99e9d190f72bdf929c3f7e6b2dffd0b5aa9216d317feb98bde8f079441f9745335471b9c06f2f53f371f37fc0374925ad88f63d62267087e364622cf5bc63328a653c7bb88cbe86036640637821771535dc6e962334bfb1efc8c10141e10407feaa98af17e48c288a93065bf3d8d6f54e747e9d1abef8f1ab804eee28fe0bfddc89de8d13f3fbc636f5b4e5f8d8286316d2960d5bed149b3214575ec59e44b70ac2cce4388c85e1143616e21858729af9d66ea88109f0332de6e209a55cc0dfeb912df47eb2499e7e126e544981884c6538d6192aef4eb1854207d0e2a22f9382f966369e4558f0eeae6bcff3bfa992cbe821d3f63db3bbeb6a58ace1bd590a3a927448bb9438aa99786e35c7fcdd9af099b673c76022e39143bf938236b0dac440639e16184979bb676a1db4c99a10cf561aa741ad9958a2608e7dd0296e6219e632125f800313a240c81fa4d5bb1ec400134dffbd39909ce37fdff8791bf3a2567600abe0b81220f6804e067242d28e732abfb650c8c3da28641c8cf0e0cfd2acb7fe1fa1aee8a324c615239923d67692b4c227b717c8046a5836839a8298fd372be6b696664a2981816603b459adb0ab13882c31fc33a19fb208587b8bb34ed9cc8f6e213b102c482528e602ecff81fe1960b6a3bea738cfdf5a8e21a9fdfd204ff981dfb7a0e00416237e4947739455dd41d062ccc39ef54f69d0af45db356087d7eaa7a98ced08726871d1f0220385dfe6f2bc7fb5edc55822c5c24e5aa2c9d44b3c7a3890522af291d7e7493a27528218de70433f30883212f6f9543d3c960bd06720df1ce984bfb06a64b661bab5ff3cb249f8a352c9cd95613fd1eb9ecb0c7c60d20e32c737c779a5954a0f9e02448213c9cccd57b52938880b4f6e9e677a910d8402158832b2638ea27b3d64e63bb8bbde7743091ded6455b95acffdb516ca0532ea04837977a689b93c8d46f14e4a237014f83951c1b117e461c11f87cb2226c597078e6ad2c82bfb0cafb6b3cc2c4ecf0e8deb0b3ac14c3edd43411ac63a5dc9564a9fb66916c9d9297be4dd35452a1f2673895c837347083bb57509f8be23216dd02e5a1a653884ccdcc57aeeaabeaecc6669288ede3e49c2307b5f4f64cfa17c886413f1d62fb103366609b712cc7b1d2708107ce70571c26de126fcfddd3a5de2538d7fb8b7cb3d3749e067222712ea20568848d2f2ee6df0513d2959d65c3167472552be590516969d27b812ebc32628fc074d5caf2f608ea1b1800428bd5067970f6d897ec8902ec296bf6c3d27212c789da199f5982356fc32c0e8704ec55860d2309d0abdc2457f627170837f58e143ac24508685e0997cfb5ee7db2832edcba553b8df27af62fada09893084c330998e693dfb70d7a160a72737a076fd8b0b738b6dbfd2c7a1dc06ec44a6c9fa872382512e713bfd4470dd1341131f092abcddf56452195f466ae4e24861e766589c0482d47cabc6038db39ccc2801b51f851a3355305c4731d1658129cedcde3c8ff916a2c7e68b5af38d097ddba1d3cfde4f1acef85276d684ec6b04c810059af2cb5f9a19181827349c685e5c3e3a7d62d472f5465842387c6a2dd8d672492a2e1c9f5bf708c695fdf1c2f3e14068947077b4c9aed241dea65a66f70123ac5c736c4a72540300bf4fa62e3dc28c3700fc2654b143ea50606b334841df790d1ba3ff5675898317d71f8c87133d03094ee462d6986d8c0c2f2770077914e2f3dd7ad08285f7d42a5cbbd71c72600434d8098348ce15038ec93cb64b9d9f17d08ac2e2877a3203d98ae89678ebe4e145a5dfd01fc9195ea1b69d0be952f5c164283c82d97dedaf40749f9906d48293bbd46b0f7e8523d620dc018ba28828715333a8cdbbb166d54b9668168ebdd5575688732b22d2fab82af4ed4b32630309ad96cd51706f172243daef337e42926763c8b7adddbbc25d31c53d99ebb907b220d9f8ca535527b309b72b2d2b3a9222b9796ca6cc8eaaf3233233a95b1c05e9282e7ef06fa5c106549d40743865ac1bfc25e6d26389e27c3a3db05814a6ffb89a637e8d0a29cd30ee843132a7e6fe17537312cf8c9410ef07211d9a72d979534cb389907b9a3cae80b19c96996f960266d1f0a8fd60238e91c4bc89a29ba5b0da0e5fc7aa1495f63728b4636998e9c4761440561b360ad59b62ac6a8661ea7d139c65c586983e69b6b80c56665e6f1fdd13e494b4275bf9847d5ec244cb4f188847069bbe8997f9aee1950c5457c1f220a46bd6983fd8052e5c96636fb6e13d257c87b8911a595e54baaa1e1e3e8d1263160cc31bd254354e8590db70a7b081260c8c0458348d8a6097a0007a164ade31eeed31974af34eff84e0156c697cf1486dce507f76d371609b7f4ad9cd682e189f35f942501af47626c11786b4053ca45121bdf1a035bd71a69c640517932c3227bdc4a139ce0511f57a3268c80db9928cc724ea41ef2a90bdbd296c12c58bcd706a63fc612aa3977ebb01c8e4ae912e5c71e3009d71014acde4c68d15a8a040947048459cfcb399a4eece80668c212e306accd7ee6eac95bae64989be891f5bc02db207d0200213e8e1c9779c661239a70e48d38bdaa35f1cb87e25f5c71d04061e6dfe8639461a75cb856a659f80275b4f7d44c61820a25ca210c0f0f001aa09010924434dabbb41ae4900c38618f1061b23af3e0b40689764e2a32549ece2109bc82d04e748026214f6dd2bb6dd743b1133f1af2d3eb43ceceb083c9fe3ab1c60c4ef61d4d8df30b30b3a372ea09a91e6f63cd0e2c8a04b7ad2214c41000996abe58bf46e9be7cc737da0f44e8b19a73a0658241341c0176e0f467a5b66647cac0b872ac62c011302152ce7de3d41e7d2908cbbb45d99e4ccd153887f6a1f2f1b044e336521f2ab5dd77a4aa46057d22379038198981ad9bbf5ab420b8f20495a30f3486037d51f003b09688eba8e199e3a3fab572d856caee18da523303f2cefbead8c41bf813cf53b78dc5b9509ffbfdc8813f69a572ab3fee51cf60f4c7eb6ff02ef68697b57cfa601f225286f4a63d9d7180e1d4e42a3911924dc795bd640cd3df41d4c0fb761802287e7e4be599b0a9c54f229308804aefaa5f676b7652b96c67192b585c1ee4e7e3f37a3955c0b1f15772bf80d0cb1e457840eada1054e6a81e793cad3c384bff38bc44e5350dc66df52630ad00e00b0a77f86c2e65fc01b49b1eeaec794667c1967618f3fc54f389481272369cf8fc2627c8f4e4f8765781eba21a02e3231a3d0170613a70046384b71c7e686ad2ddfe2199f4bcf338f2ce293bf0c38b3a026ad90d7a099f89c684b9cd0241fd46a1ba05aff32b9b49cae86d2198c775d2327d9e4672596f52f8dbf1bc63b479c45f8b98bdf94c961039ec4dea2b541897cb839ebd8fa64a7878d60c680fb0cedae9d458d35796aefc62809e379006cc59892be1658c55aeadb1b4eb52443ae63ba474abf8cee13dba2e0c9b4847c37b1d00f53e6fb6591d31f3d5ab3854abf585da9b10789dcbec83d6ea60d93cee23c2379148fd9d02f15e585002b50dd77caf93bb86eacc82cf0186f59215d758be0986a66b8be0f2da35bd5602a136702b06d42d1b0a5e8082001807c341ca961be5fbbee2923688c5066d4f297ec28c6cd82caa4735b1763d3f7ae3df1f8d8de14898e51db45dc3e19e4ffa601aaf270fa670a14ac55309b55723ac2d624b7e21d78a015d4c7f0cce722a3b8fda35bd605ef41855c85c93743e1fcbcb9f7a9c63310c0fee503e03490c6d3ed93b854d2b3b9d8710569ca9d7ce09bf1fbd60485a78f3b39785f5b72dafdc174a444434a3032b326da3d9fbe619a89c3745b258c3bbada45bfdeffffa8ec887788f9c330ae9587b137e2109c4ad40d5c84fd266833b7fb4f8ba94a6fc1ba7f43f95de37afe7f3dda23b1e2f496ab60086dde0d840231a871428afb7d730c3590ab230cc7420f0d78b4c8643206cd6a16860af399f25e9451933b5f5de13a97ce8b9890c4bd6043132d5e8dc1b7ce25ba140ac26ef72247328470f26b5b593058757ec4f8eebea0fbc401acd8567da8cdd58eb653b7e4038a8a2a386427265c36ab9d9f77a4f7d7abf9cdac04e2d49113bce36c605aa03b14ab8c6d5264667106c880043960d2a3ab73d1af6b8d034bcee55fbbcb9a6c29180a19ad883a1f90eff4e9bf76acc1247bc22d8cfa50750b15f4a5f8b1b12ed23aad0821ec5f4aaed07d385d20c04f4e61d22ddb153abd923590cdbf87dc02f86d4f591a4f407d24df8c2643b10067ecfabc7323d7dafba3129dc8df2f7039b65ac368514839351aaae561e85010ac246ee9d9617e87bc839a0d2a4af5368485fdae795251bb148215e85ed3ad659a3cc6f485c3f99a8b8a2c96b249cf61d0d960c45b61bbac47a63c25650362c914459a1c0fab2fe51cb656d1bce901acb6d26fbfbb4b2e340df7c4739b2e0ceef1a2f91e4efc029667e27263300050219715755ca1bbcff112516b50a547ec87773cee98dafc9268be23140c2e064fde056ce2d0c93d1d16e42c17e55dbae6dd5a105b1921e93541fce243a1bb9af4eddb151aef20e81ea0ca2daaad77cd071bd8e054febb640b8b7858c9078a527cd449fe1903fb2023dc6fc7744974d7060d07fb3b4beb9c82a1bfacfbc6485b3de6f585de94fdfffa1666d8abe750c6c035bc073b19663a7f69fded9e8584e5b6d56fb32c235cf93c1b91cdcf02f47fa1a8003bfae69cfb242ec3d52676183eba40b4eaf13624b3c9bbeba42037e84a497f7c9a77df69e3afd59cd9388739bb07c567f828c50875b17a81474a637c1075cc8b16c857e42b52c3a780e30134ade1880117d76b9e2ca7255322c2ecda9c13e54343a2ff516274f2eff11ddfc6f130f24e7017479b55889ab378cef755cee1fcecb0e2861793350eeab61b611b7a84706852a217aabcebfb1fdda6db49a6f74c3753784029763fed634ae5e5822f6bda39589958437f484ec7ac413b4c15e5d9fa5ddd17378acdab5a6767ef9b9f298ec3b798a50276a9b6f05d3d2a39e31d3c90d90ab96d2f1c9fa8a56942bf0ad46ce0a4596fe7ccd8aaa5b0baba0cf52afd00dd0cb856937059f93fa688030fb86b6b72b9c179d15f2761345ee4c656b6b854aee0d90f78044f5cf231729ad9630fbbbd132add9a2c1d41e29dc3989c12161988d388026820521721a3565183a6eb786af617858d83f7a5b667db65d9a3303dce98086273de78a8adf15963917c55ca8d2d2ef39dd706cc4cb6aa913317c33091671bcebf7e0ac55b20491e0ca5f9f8347b90cca84c7a99756ce46de55d5d3416b1ec713c602869e725635901b7889993db076809d5b46a459fc92e696c4daee0a2b6f89c0c8086b9bc1e80c1545cc76a4acf972fe7557ddada4d38a28ca1fc1dbb13abdf2e28b1b5d031f7c7ce8a150dbdb2179fb592970b299355194d219d88341c8b55f5566a728cbf3a064548a4d03032fe31b35f560e4bbfd27d7001bd730015454cea410a4a4bc129428e751994f19db35d5e5eb7d49188677f6b99768e5c53720c391de33a41bb04b28d1740458ecfd948665f40a4739031bf0caaa61ac6e0fa8bbf0c421cfbaa8f78913381b8a9757d7be7907da18c1fdc257aaab0e6478affaf39fddede71f44ec6ac47717ddea8ab52fbd1000685c3a65662dda1bca58c0b7fbcf693c3fedb2023037e148af309450f97ac44ae6602940cc5d75d5e0e814b2f79a90da468aa631c10b2710d2dfb0a456943a5dbd88cd5249c9f4a1eff7201c0456e26f0684a5fa9482c991c8aa4fdc62c7421c00c023d2d5d50b90c38176ceb06667de3f3b62d12f6a2e1548368784cf382bdc50f1cc1008ea764b2eae2638531179f4e23242f229d201e95333fd42e58174a46821d556f02b07a50eb539a89bf7c49b462e9ef4d4372ad1f4441ff886e1306783322333c92d73430450651bd94c49b61577e68d67670fb5e5e24ba40b7358034013e49bb5dfffc1ecf92d58a592fea7e01bf0581d23a767c54ea86a580e6313f7cec95650535ffb085bc47ad54dc0c6c6969f61775d4d892f94ffd9d8c9c65920830c9de8b8da7acfda7999934c636630ab999e947268c84d5c022596b430814d0b4ffec25dc687e581ce8480e472c73769c71f7149650d8c49b90f7fde16f11298678bf312f84bea618382f1d87ba285125de840c6f12b1b774704202d5b8277c314bacead8e2e22de62c2210e868fcb6449feb2b3a4e9d2c2176355fab8145ef01174f97b4cce0a4d3bdc47b580741a9eb74fab22d85558117ef20b16749b18c9ae864cea4eb8445e1ae18c7c2b2cf5b460a178ddf486c1b1db8a17d1473bebd4773dd65fbc471a8f8ae8ee75d224c413f6b057e42f11ea972c431d7dfb010edadfc88498fb40fe5995eeed57c609d24083662786addb062ea88a05d8a4a8ebe4b0320e32e213c55c966eb0cbe6d7fa067ed403c18ab93861f20e19b0368c3ce99b708a92356b55c230638b108338063ee004c55ef3bb1d14edeb291a49d41a486004722e463bc3f7712a2a7e53d0f6403f9d7afde9b39b36e5d848b4a6d9cd9e5a781f62688fe83f78f7188d86af6c110d9dd2534daa51d01fb081cfa4810db22898fcc06c328d60aec9e64603f33b0cf33dcd68eee1fe81678f4edc232e1008617c5fa3a99540a4f310837291d4907c1c3e45e38975c460fd2652a4803c75b31725de415bd72fa0b3e0d7486999dd199e828ae64451d2d8ab673ef8c3399f68f780c4c80c26f1fc1dc31c798133539efecebe49cd305a9e5dc8076d7ce01f7e44a5d39757a0e7d45bdaab9151c61c6a31a23377a1e00e015cb127bcafda349c2995efc735d3e4cb2f475954ded60bd11b61af5f758de7626ea71ff517c32b6067e4304dca4c2358d4d902c47289cf27a9c046e1b10192a3662587cb960f39a7487eeca53b190fc7c0e036a984025511c3d3a1c967018328010903b9a307fec4aa8fb211af79e68dc4f7f1db82e1d8e6a63bea43fe924e0133ec390d24167e409788500264443834c6bc575c964583cc75dc835bc52b5128c1cbac52843e60438e521f6add0605d6ce08971cb67159d7606e6911cb85315c3babb69ec6a8929ef62a0d6117b2e64e98d89b9078298f503f20299d80203634e89687b006378e069626f806ba2f76e49891f421ec6df476e5b7b942a3461e220e7f346c7d2b0788f1708ca601581faa82cceecde70a42a13ab3d946796d89c3d51d09a488323d7311888dd5acd63d3f0dbc791555655e3769c1a36217ad63163f5c6ccdf1cdc1d3424db24c539322b411f275dbe9fbf706ade17626c2736ce4885bf80e031b6cc9a6914349a185c626df827fafa4ed25930d284acd579de2a02e12e84065adf34c6888307b6b9f419bda9b661136292718f482ceb85878a8749ecac0c7bc6761ab346a4b9b6e33a3d7a5ac3018261f7b29e22e44a3c67ef5bf95cc0ce709853857b410195d180b3719682c98e60d135fe4a3a5fdc4660801dae7f1665671eb4890e36e119d857e15735b5614fef0c0d334cb8efd74595132cb528d4e55786beafca5f72e252c1ffca284be399c26106d887cc8689f5b6bf8ebbf4e532db9e5ed09ff253007b85bc424420de0444d6b0b0ef3857825ac61e4efae3760e20de095c5153986d13fc5c73b891287e8dec78412f560dc0afbe65fb2f9fcc782414c23258f93377d91e03321cc870e0e0571ae114e3693a22099c8f93b05b70a6e00320a16cbd473c63b12889d8c037e4589a78990ae9c10fdb7ef0c88e65cd0812408f08fd4b62c2bc951a5bbf072311b8a806ac8b5fab948373f0efc37d1c0cf5d6f07f25c37b7e9541cfe9abf1cb8b34c369eb93a86959e1827a57fb4be26bc35b2ec6b4a8172795c45e71f03580dd90c16876ac49761562c2138684b6953fe8a22a90977901a6fcfd4ad900a8358a75734801b4fa8f38b5505bb703675b7cd979d75b40b273fa0b33e3ed3f567025051ceb9578feb5fc044d8f853722471a479e667633059c34b8ef6bee3a74bc4d2306fe69e57131f2f25935ba6a52f51795ed77aa3006b9eacd7d4323fee62e9d8162c1ec53c3efe517cfa968a6af832f3963f0df43e2935aaf8d906b352264d3e811fde1a9d205afc915d3e08e598edd7d1e7827a13b8738fcda57efdfff9923b65c7b30b647ca094f1bbd8e27047f030be446fdf49741143042d9cd3b09b526c7f1e2cf1c21ec8a2fd66540c7ca804550fd5e3037ded21a4a56cb3f9d67325ff4da37cf551a8f5c6dc81f5bbf53e7d39ef64caa09aa786067da34f276e69517d362614a880f791da1b37e872cf7906efa44262ab31bc638efbc186e02c51307799c23cc73d0ed77e22405c00bff94df884890fbd5648537572315538be45dff9ef6f8672debcb69ffa7e491a5cfd862ccc7809cf181690e88449e570f14544cc3476dcd29346f10b7e5d2e1afe8f1bc448ab23b06ef9e896bf9d1b668351af4d9d1d0400c010a5a3b513b2b208efb16543e4d585212032a062dcdac51fe112ac0b3b0efc52ecd9c52a956105d084da55c1c00fd54472784f30f491a7a8a21ba78109832bd7f692b9e27a9d588c1b3560049efb4c37935d90af980b5315156fa976c6963ebbfb7ba48ef9762f00719865ce8d6a2bff7706bbd34474646dbebdb4a3e3c342e0ad0a17525be0fb3c045ec3e91df48fefbd179baf6c5bb0216b35b66415597af59e92ec821419c882fa4f6faefc57a739dec20228b7681ae9c33cbc4b20c081f483f033edeb35895c9b7e8ff2e7426cc8b3069dfb342c1eb6fb79f052136d8205c9c063729c2f7c01ec921eb9a206d6772c435dc83304cf898f75cbdd700c9ebd66c00dd234c6d109df9c3eeeadebdd12f2e555e22141e337ee1b0568489b3d4a21d31be6e477ee86087b919c8eb38de7ff3c98cfa41e3791cbe2f2be3b25bb1b3c1e4e55d6d02a81c0a40c6b15e3b992e274c7286e4a3434f3aff695aac05a6159418ecc40c149f69a759a0aec7049dad1ed812a3f4f957dfdc6f7285c840489d44a6fbb29eb488eedcec0e6636f0531b33935d9db36c2648eac3487ac3b5e91fea57e63bdb43dc78a71561764a52b6b036d003739b52df8f8e1467cbe6cb2cfa41216fddc107076882056a30b22c01baf96923bcd3525dd9dffc76f3f8a32ea3060d4120faef43b4077d5077297320f4bc1fba7be26453296077ae162972adecb730ebf06088dc2e1adc08d3457d3c65d5f43cc80f1cde8b6b59bb4b8df3198d48b904d857bdd1902047ba9738a287ce9e829e1faee1ad25a17c37ca690b6d4855a53112fd72449599090380b4886aa5faf0a101d14f10e433201acf9cf4f7d2ff5bda94349ac8e6535696973bdcf144b6667106c6484cf87a60fa180035b25db2a0074730576bc00459d1c08e1f9269c5a6a4f8aff32e33992d74449d679597b8309ed101b9fb081bd203512cd3d14ed3cf9cdcc8d8442df69da05579a3458185467ab52f08d8cd8c5b03fae7ba383c0c364c4f6e0006a30f049d049b7e69498394ba018e898715ab048ad0b703ac240c2bc89471509feff161a7b1d31573eef347e09abf83dd8ee79e24737fbcad8cb7f3e193c525b0c59181cef806b9983c756c07c03be6ddbaaff91662ad7c73f077e79d61212815559df61dc9ecd3fab715a1f3905ae01ffcc027d6334a5f1ebf00993f317cbc35f970541fe8114a0c69c6d4cebdcc3019303a76b09e72773e92ba10fd2de90f2be97eadb3fd8450ef0dfdfebc46e614f66158ef77ccfbb72b652f9a549cdd447487ce55b71994d6189d10d01e70676fa6668dedca9f0270a984a7cd2bdcb6b1c0c973d7f697dfbc024bb88fe5f0a9bdf4153f33e873691e05ff71f2f5efca4bf4990c1e44fa4dfc9a7a9da667ebad287dcb7fb8529fc2320d5f256ef82a60132c0dc11ea955266f7ef14d1d1fc092b487cd5903f530f2dbeed647ca58f623577469dc3ad04fe0d97c13049b21c6cf13c335c04567bc4cf6031834a929b9fd79fafd9caf5ff6bb4de4fb289d4bd95f45a46d4dbc97c47eddb74ae9783806155655a8fd0fd10e48c73183c809b2f73cc4e07c7ea2d710420033aa3b7cfcccc85fe34b5cb97a8dcedfb5f39978a85ceb141d2d6c5ef2efb7b69af6d472a36c0edaf1cfe316c91140d0620bcf74c7afc3309ceef49847d6d45c1b7f9bbdb6e1ed815be4a3b05750bdaf6f14b73e91bb1863ff10c5bfc5f58bce1ee3366bdd0715cba579cd67067a110e33a15f92ae4bafe43a191cf966be57c6efe3c604aa238c602dcfc4e3b4003b952d7c3e4db66af665e8759f4b185223fd87db7e627efcd2643899a5cebdd36e0cd6c5f4d70cf73eed4bccf25ee19d92f4d1f02eddb57ed1dace6f96115e054529d4c63eb3e0c7aa2df6845306f332a9da2ebd0ab7d0a85bf7b9ffdd7f0072a644b6f979130d8f5789ca0414cfa596861deeda3bf3baa24f1dc7d5752281d72bf623bcd328ddd8154d9c3ba5edfc820f6f4f60b2b8c8cf443932ac7c192d7bc694d59973c5bec309ba973ed3e5cef0f267bcec195f7666973cf34bcff4d267ba9cce3c782cd0aff46f73cce8278e95fccb98cd99fac24c29c038231e5f6262fb25b7d1bc3c19294bc694911925c99c5232a5349928478694272365c9983232a32499534aa69426135a3a5c2abe9f710ded51ea199be1037ac78063c89f89d63873623cdc85c45d39d2f819c550bf7c838288fa5ed1d26572df9132893bd673eaa2a848eb2d4e06931bca4ef2da9afaed68e67dc89687b66f4c154705325491bd273afb2b4944a3e9b0e5ad13bdffdcf503689f7fa91ff86bd61ae0f8c14d086214163f93090b8b276911538adb030fb4d214ebb1522eaa4816c39ab92280ea4be52d7a4744cbebcdc961eda166837c51addfc3845f359dba7692109ec7716feff17af0dc9037679f3cca7f01fcd43fc8794ac0a0d32e9e8017d8002893398cf317a52018556689177d0ec48c9d2f12a6b3a0965659f936fbadcf5f901e59f6de52c44a09a46448aa37f80f2d13031017056791b93326a0ff0505e8a5c4f7618b6276f8e251a1d90561c69900ff1a9339987e47d9dded209a5c40998bb42a431f626e149d0f690d1499736bbe6d3a719ba486e7e87d00a8da453652477f7a8b86fe72587ea6635a09bb074e696ccd552780ccf312e5628b400010e1e6ccc3193a11ac7b4d8cc8b18f17cf2ea53f85d078a412ae8cc6e78a3540cfa25f3121bc2461da57d3fc875dff6f78de755117d210ea18e3469bd0840ec70cded065b78fa47b53aa3c8426294ae505174a362a03753a0293d1f96eee57c85fbd4fe80e52c1bdb689409aed5cd2df04ed9eb1718d671b1caff6369a3f28c4b606874004e7fdb50c1664c90e0e84eec20a548743a7fee038b8fb04ff182208e8b61e0406f220eb2f1fe39c0be4a0b970b3cf0480b6ed82f76ab6d34ef88572744d8c618d4a6f8883a09864b096ef7512e21b2e8d420fa3952fb46369ac1fe8645927b8c0ed8129b636ca70df76787e5f8e93c96913ebc67b6c826c6ab9dc90ef3782613b2285e180195510412af084a47abf12c8274551780f7446974c4c9c0d4905b067c2728328d82a37cccf6413a301ca2e9bc0482ef97c02fcb9031ded25eca9d51d1cf91c88851ce49a1201cafa1130ab12e3cc1c1dc4f176a51b729643dd1967156242e628c731f8d6f0950a0af093435f6ca6b0b3018bf68e82bf3a19d89bb66f41ee1578bc8f1c3d8cf967a57e904d1bc7984a52fa7136aa54f3297006b3b9ecc19c4ef12c68fffbac81c024aba7066f38ce07efe6cbe076353d93ce1bf7c05cda5a998f1483f22523c1a1e0fc9a894c68f00a5b7b5ba1be9c9c7be001aed206edfd2999af30f1c49f5ca47594370800ce382d1cd065d7d36c2878cc2dd5c83519b46dfb149a105254352cd45e8b2862777bc536197cae151d19931fef239965a5e65e347325eed2616f8117323612af702e2403062fd65cc45435968afa1e349c2b72e16c657472f0bd79f47f375b8beb0792b6a6ba811ce1c1a10ef64513220e27e95cd98a8d785f28aca6db745dfbb1b0799caae79e4ffdae5a24715f5054cc21a72c102d44f2ea770eb1a21086a2e501e00b3ca71e3617b62c5ca0f96fe97cfc7b18bf255ce36d93f6c6562c37bd9d8c60f1e590e274bde581f0585304a035d19d744f63f83c6ec4411403dfa7453c6e10fd72fbf7801b29f58e7e4131063ab1f19874d3383c3d374b3dad4a0a735040a024e7fca586b56ad7d4e39711cda9ee89944366d82c8b6d5f33e497fe474146a2c90da8c95af0c5f88c5db5b96d725b4ab02a461e6613d48e260089d0d8a3b0857ebf706f71f5cc4361d8ee0974800fba6b76e78ed8f039f5746c0a0f47792f9d021424007a19f0b34f84d14bf8a0a724109496ca546b742e10c6ec72fc8abd32f0b76abe682bf46ba7870afe2aab1c090b260a1c0a20a0a4c0b27f0fffb190c2832eb30aaa53a7bc1d6f4c82de8ca53d0817e0ba77e80672d22859a7a8924876d1f1a0c0a4dae120fa435ac8bb0c4fa81f9dc5484704c433c7a76171a65e8622b6fd626a3ac56cd63dde855707c5d04e784d9c24e5ac4ffc39f10486299a6c10ebc28926cfa3a0ed06ba52bb7e8746d27086c9f21b3e7932ea18321ae0c531e7c5738786d0106faa29e1a836e4a285c69854510fc85c2eff36be03b6e9ff3cb9b28e0eb16ce077e50ad265e6dda249b3de252ba15c839e57d44f4f04ebb2264e80454543d08160dfa1f3a9031e0c85b6e3ee3eed77c809aca7d65992e51ec3e427ad12c310f33c3971763b5261d1ba127d03a0c26fe2e9c060f176329776d96a3b3a8f2f7f3bd329ca77afd75caa2a0b56df74f2ae2cc1d291157ca6e255fa3053b5b5256e708a8179126035bb68fb8ec5ec347b9daa121f9062711c0fd5138a4e7871139d6100bdacf7828329b2e56b99be197c86f229e164014749c323a6f072f6e9f00561f895bc7ae80eb9e670207b4fa5289b3e17747df29aec0ef610c2e1b915a57440742cdd2445c5178366483056165e9f1adf2c7c9780f45e8e7bedd9314ff886ffc994ac44532130cb087374d48f353170ebdb2af188661a3fd8904e7f25d799479b04475b327ccbac646c72941625986155f064bd5fec4ad59c1602a6cb459a1de1cbec2162ff8400deb4aa7cd0f715194ae4f253bf36a9186d383cdf13b9be78040e0088e33f669d625cbcc1716acc6ef2a60acae6d623616b9d89962a4c1e2ad44165ef2f627cd818bc95092529faabeb5338cac761b7aec4c574ff205881b10fe9587eb6ad5346a93f3cba8a947f43321e9a2fee451a67658fe53890cc33bc534f001554c307716a0f58bf251afb0610d1de56d3dc9063392acd3fbcd02793c516cac3e55a1449c689c7f8a4df75d67ce7009a5c47a9fc9904149f4fb06d00f97ad35d1d9f3746ff0a7b53e1aa856d90eadffea5d55fdc20c607182ffac7128f9152f55c6bb76cc60a0203b347344b3d700b7dc0a27e170b77e09db32d5bfc09207b5e126ab26a7d50f23293a1013c1414013005e5310497c51c30bec27be1f2219d9c54b8444622eab2e3751960ba59efa329fa78a1413c2900fe2a4bc0c9fd33d3ab872c8f20590808d25c75a6a0d85a15c498926fa4712a98bd304cf5baae436237d35ea97ee099965db01f6f18af59d44537bcb0222fd6bb538c30d8d73533d02efb25daf8e3faed00b90f948cfd3788389f1fcfa38c819c010e414ae87231709fc4e462762aecaf8506e2d5b43c984a013f3979076b3a9f3ce7f0875da62b9dbda339f0938e60a7b0d3159c19dfcf5ee17e02ff0dac1c17991655e856e649281a1deeede86d2c3c679a42fc4e7d3c8a7def669787f0e872e219a64b49c6c4c05101c48aa8e53e9608e8bfe8d126db45a5bef2a25ba97cf1657467aeaed3554e9d70ddaeb9222182ce475c49a5dd940d0ece9d5044cd843907f56c02ffe993318c9ff92bba948a88dcb0bac0c7fa0ef757dc67b63d13f4004de08345e78ef13ebd895c84f59033dc05d12e21c885d147eaff538b6b71ab77713e0a24885316ea0ee672a2f94db1683908c9081f6c5058989daf0ed8cf22df1f1e6815c6e58f1a671339a46a52ef24571d2d75c098a60c4767cddc1988d8a60e1f3a1a8df49106511b71d34ec44aeee2510cea68ff8a5b612c4ee00e01077dbe7e64c663a1a53dfd8cb8ee99f462c5824a8d1d59a4b049042124feddd4dc83cf884392d085af94602ca8ff95b313c2ed03488dd9ace860beb6e5a9171ad6fe27b457a27ca18fdc367b9e63c4e6977cb4c7c62912a10c9654587ab35bc2184cbbefd3dae8db46e7beec5465c6ae1adb4cf8e0040eeb1a8e22af6a68ad216470533115fb37833004ab7c47ddf7091ace7964471b3ccdd87308acac50b20479709e16ac5a9aef8784137f80481d5b76512e531439bbdf14202ce24e70e833de396596375ec630e51a6db212248ac01af6c209b0a2603b7574ac10470ba3ae42676ddc86adee6de4ea85428e83a4be28f5afbb68caae068508e5b434abf2d381fdb02d85a680a44e3d638b3dddce36be318394ef910f1ebfa7db53e142b288fb2eab16703b22126cb0c696418bcb48e546c2d2b15877aef80442fb892977a69f995f77483daa071f9a1af0e801f4b95f158da219ec513c845a023a6a557c4d492cbd53ba0751f3c44b4bb29e74c6282c8d55e767e04e72336de674cb55330ec72612717dfe43721c0db05c0dbf0e29b8f01c18519d6d4b2a64cae89879c41071ce1ed7864b38ba1b7b05b0d06f555f85f8b02458ba44ae33bae106abdf3a652c681973c2772a50f9a319059966ed275d31dffcce48c438aa8c1b9350ccec3333c7cf518eb3b66f8b46f2280a334ba74e1b7776e8dd53ae18c7ee4c48352d3780bfe45c733e49b4266d36d3a11595462e4c12e3d1859c83d6fb8883527b9251ce0443a5a2db4bdd68c8d79c8ca5c1dee879e4706e05318ce3955dc5e20fcff1b784add7eba3ca0aaa2b8a79c34ddb836a145cb244f0adf1b910a0c759c6ea2b8c2beda2e62e927216857f74d6a193f0028fa4f978526d6ca24c3e39ac7dc7c1887487249ee5b8c104a089e4d8118ba283c15179a04ce7aa6cfaf54f574a3c1d9218e85cfee774c054ca6d0defaee075070bfa863d79f470282e716c0c9c54a40a235f5e94510b4e4205910275905c95a2750f9ebfcbb24c6590164cbaa58049705c010695d1ddc6157f9d4432ef44cc348dc3f472b43cde94617484d6a3ccb8974d94636ce3b4468e59170e418db7dcbcff5b5b0695461cb1845147968faa49013ccca7d3b519e525fb00721ba7214f10465649a7aaeb4a2d6e0a897d880d870674d8ba7503390ec2ce91b9c39f3e36ece79de2945e7d760f9c5d4caa010a47e083700f921ee2af2f3617e1e995aac64f76e6b9ad55f97604b4c2083da1305732f13d09fbab4521b85363d6d69508e3fc9ba7382a65e9a566f28f2a6ecf510266255570849d15eb4a392d4368e0a4d5042be00287fa7a744efa3471748d4cfe8e1e826efcfc80343e3790defec4017832518aafc198a8a2139e733a0354aae63bb7eacb54dac962b7ae0d513a7e619868d7806f5d96a05765a4650acfc538d0ab6a30f239520d37a6c5b8348b63334bc0e4eba81650dff0b56c8047469edbb36e304bba7b267000b0188f14b782b3d97ac00ea0186c2710bf742a2efc32c0c981fa97900120c5e392faed2366c5f1726088a214e38354b79a5f35568db81e861054cd66144d14d7a612fd0ca32786c8e8cb79d6f62a53a5bde209cd3f912070d786258b81410a1c04574f1b9abeb0fe68c1f38cdd34d50ee682a6f0865dd3916f11ce15111293d5842623b0af41e915a857ae7704b44e6edb300b318f49ebf0e8d0bd5c021f0c7531ae05850660cde6fad0090540ebe023264cd6ad47889a345a01274e216b6eb09bc211de2526dc20d0d33956510787365a88dcccfe876203ff8040fe81ce86552d751beb6260ad5257500a716ad0bb09bda58437c1f9e31b443a435e210f2747e533a4dbc8613c26dc4324c235041f2f45327b99096002bfb354b762e2bd139d010d4508a4f93d7ccddda3514176990cf238ae1c5cd426967e3d7231152e7ca1815971a3d8c7bb3e0b6828c3e6db1d2749eb06828162c0a08f799519f2e0ea7b2e4304cf2204b243abe3a38db3fd085b2357f069843b28a14f30f3883d8c7d6c2aea57abea3bd3ae884f7d5ce2a694114893f3fae44038e5462cd33ec98faf653aa36ead81e076889e2a7e29d4de4667a71f240ce338180768a3c3928256d6ab026d2aa5a94cf4b53f62c87666c412690c730d2f7628a0b20d95b707af009dcbe4080ed81b7ac07112ba067a78e4dc477c98e631721b503cdae9745c128b240c87a8dacd7d4f6269facd7c49deaa732a2feae42e66db8b35acb6a9c9903f90d9977d5d90652381a7eac5159808e71cc6f3dfe5e7fa29d31d297d8868edbc6c4478148c519a862816e85cbcc56fe79f9e260be215c8c021727b5dcb165a60b422cc579af49ddd7589d0c1381617a2b7ef242f800ae518c55a748201975c1207d4be72e3768d088109ba469af207f7ce1bd21c53d93a692184addd9fe91eb2021e5240ff6455313d2881436407c0ac723c7fb7753ba2f395d1cfb9b79479124c345fda1d82fa19f12c08d7903f3a857bd316dc149bc1e6a6033f70a69b969b88f0bd2d8cc1d7a14541e05afffa973181871cfd28a09111e27e985978332cb1edd1ed1a5a0ada114dff0b5822cb971061119f98fe4ec5d84e97e93f0ea6022f2308f9dfe0fa12f38101f14d07b9ab6fe4ea7770d88b527aded7873e02e59f7633c662f26ac78bb4445275c4e52c2cb61f5fd917ed066c91ec959076c06f6544e3dc410fdbe7d45bc581164ad3596efd9c90b12ca7280b280963a11c381f7f09ff994b438df59b1cac088afdad482cc73b5f5b70aea394593a4cce9370334114b475b73583dd3d10224b7b997adc4aff2b7ff9f54da974d11699258b6029ca28f0ce023bf5a9c2a10aa11601dbdaa54c8ffa200411c0ad0560ca7adf145d6fc81d4eb71574dbd905657d1c5287b52612c2bae40c2a63dd484254386b1ec8036ad5b7731b15d05ffb4d6df151f504542bf504ae5ed7dc8642dcfa8ffa04f523846b312f5ba0c913716a31675c913049c3fb3518bab1aaf0bd5f0037611c286a87e2edd221d48cc7273b47b7eda2c6a593c89cf654d7f05416d0c9b9caa953ab30f0ad7c7d63f6375e8b837088e0b3d4c1145d417f112d7249e6026bfd61a5205f5489deebee5e982b8f1e8a76a561a5ac9237f2106d96da116fa104aa47e706459e7dac6d578a32df3fa250b8d54c74ab019453bdca8b8dff693912e06a5b9e9f5d156a104b1da89c80321328b1818c08cd9a14a25cdd8ce4397621069b0baeee4f16b5c42c9c6248c05d945ce8682c9ad74572215943985726b06b40ed6448b3b2c5913d0f9518a1c138f3af53fe55d136da4b22d001233edffb95a37f6c3549f4730be9ed1f49627c350202450b5b422d2d677d3eeb3accadc2e5042901954e6a81a1fd5ab38fd27f0429aa57d42c24ba08905df8d2f144c299507da7c31fd0d84dd63200e0ec69289e4d32b08fc12bf4789f10a66ca3d87f518ec8e096a62dfce5a9dac39c0c07c601d1f3f28a80309a7293517be3a9216ce073010e198ed0816641bb62dc19ed8fd028fd69b131598cd5b91e86be333bf74d73ecd627dc7746b6042e40236252384723024b384c23e243385223a2cf26ee64d262ef97eb7b64b83f49eb7d686255d92891436bf258c23ac31403e3cce61c04c9d27159de8951003d8f9afcc5f36a8d248b2a3aac68dbdc087ef64680e13a8dc41933d79fff4e71f67e232cb942397d23a782b2da229e110c388f9f9c429f01f0c998c99f3dd0604d5bce0bfdeca11149f49e099b2522fa589c1b7c0f2c42d1f6409c0a545770ab53f64f9e7b487cd74ef435ebf9960f489146b6d40840d2a313a630c6c8bc00ae8e36ee8b104a0d52421a77b734af66d6a9ef5520c29fb66c16921d929141371bbd266b90fcf7ba69d20027e659b5699d91a66f512b58181f8034a9187224d85fe578ca9741dba413e33b289c523ed3666ddd3c886b8c92251532a6d3118903c4c8544326a2db7d768c7c8483e99c24952592269a494cd651b552b438b50a9aa0877347da965258623198dd48ef9e3275647dd55271ca4f54c74ffb620af5d6c86ff1bd3b1672da4930cde99c52b80f5b993e2681b64dca5d5de618fbbe4a5d96f61918b612dba8f76a24682e54f606d6cb04b692da83e477af15d0d5aadbbaa8f5377729292c0cfabf4f030e08149d81d5d3dafd4401dcbf3433451ce2a56cddaf8911ce30fb43c366f1a7056dbe7f79d452edad244fb51a0be90ab9b6a05f7ac3e332a3fc7babc48f983dbba005fa3b8120eb1ad08c0c2e1e8df077939fbbbfe175275b37b70d8e2791a7147725ade70d2e13688ab44a8ab321060a2aae7712dc1656d05094ecd4b81d26a12862470b4f4f349cbf927084b2e7f4943087b8481281f95d2983f1e9c16613bb1bb65a692016414d3e5b75adc228a35c6010f84661ac9f3e941f1cecc620cc52652a4b9520510b32d77f30895688d27d1ca33a5c05085eb727555dc1458dc1601e819d44e8106c7cea2f824bac1c918be08ad060af31bae4c91f9a138ca08f56d572739f16a3653ee219d1cc8fa183e257ff537c9ec7f6a40ac49af701f521601004e4c4af668f1daa0431972b1dc9eda601d57b45665ab786ad428b18f41b612c15e2ec7f4296c24a154e64e1c7e79fc6f684289e36619ba664bc1bfe1508c95b79fd558d561f2d78731be863dc385364dcff4861d9f6689d16f4e131684e6178f1df6d9d258ea4d73c93470ea871d6beae631b6446aa49814cbe76521707c2759faaf2548b1b279a4810ba4618b2014034268a19d4345a2929d52159644170af35d4364a0d144e85a7dd35c28646ecd5a2d6dc2908a2e58380678f88c67563053a016556123be69728bbf16b166b2730ab6257fca41a479afbe76fee8cf50e61f72f8d2219d0a6ef062bcd55ffe07e5f83b59e725f661e16c33009c884dcdf30c628073e2f2e8e8af6a3cae6ae2c099fa7a9d89cf5ec99719782dc6b0a8a4490727b95a18688813886735ddf1233ea82bee467965533e34745b85dc0eef7bbc888adcf93fb2bafcd9e196b7dfcc5f7d34c593f5b97691a40d2413b672f2c446ff468be24831ad9c5235d96328047f825b50fdd1ee6e847d1853acfead050b8d6a0fa776caa8ac47edf5240ba00c4997ad4de94d58e0b08a99b10fe2e7f6489d997f919bc3db689aa60e3fab1c16a9b15698b0ed9359fc9f054db65aed01fbd449d780a19bb014b0b2023d3c7272e278c0eaa00689df3f382c13717640991dd5a7a866aa11d408f93782088cbffc9ee1a077c431c87e4546407fbad82774412b75b1e72d8572b6d4f4805f95d6c6431089c24c4fa8f22fca2b59b05af85877764ce994ea05674b84eb057cb47313800de70be7f59efd46e7b6d6e96f960703c6edfb5367ea4f78fd827521adc6593df997f7258cdc3dbd8af922debbb3985d90d8c8eaf36a2b1a8f5d2f1ba3b35d8d3299955389fbeda64599deb43ad5eac8874793d787786f1398a01dd8feeb3f5010143b6106b2630ed707b2f2c3f4859ad8a2632f2966f16d17457436e1da542857907b6d1a1bbb6a456c6372d39363803fcc093b66d15559fe13fc6938e33c8dae1450c26465a90dbe05ace8f94f5ba454901c97ced60558a0a7001acad3e6f487499138234b414ddc1845f5f3f08a0e7b195653e8e1f7882a19c137ccc5788b46504142c9f20edeab3e6580021858120c50147579822556a432bb7794fbb250456856ab668fcd477d33cce7642f393bdc73d5c9a3fdc88bb460feac433778c816b7232e11c1af111a5b4f7cb4f1bf322e6a9baadc34f0144b2bd1cf6200e1c6934d586bd8e1ab56ee8ddf22f82e49849d9bc0a9ac0d53f6a15ee0fdc149eeb1f050327a694f1fa2e1dfdf84ed950b1c54071d512032a9c78a9e7bcde4c4cc0f5ef731a7c34283e61c2594131bfef0ae03f68ca211b35bae01faee7eafeef2a5c303589daf9b5972e4c22640a9f992524b04393084f4b5d19127289e1ca25ae45a5725c029a2a9c8d610d8a943193f5bc4d70b0350f790a02f935d28eb7eba1d961b53a86fce7e4cdc4ba27d2bad64595f4171848d57f012fb4688bb1b27a971a487ae8ffbed70d22c8754609a8ae14a016264a8793deeadc0cee9878ed067b82f3d9c77f867f2c78a18dba947573cb3e4c76d0ce794c755c6bb7611c54734382ba1c3d8b383f3a6baace6d2b3d3ef308d0e211d8ea551f84836eb5b080c134edc6e3d9c0483eb6d20d2e0aefc255c86d581eeba295916d5710fba55511de560ec3c56b91ddb808b305eb23ddb630a6e56a22bfb128d6cbea21b87929a60b5721b661798c8b5646b45949cc9756457a1bbfc84e377e4d99fc4de9721e804676b24e50f7f1fd2b6e62657407a44a6f99211c7f0832a23d65dd5b4eabcc7d76f75ea8dd57981cd9ec15e43209d71379d126e831c372628ff5fe518ff633d94f5b76c2e8f1ff51b4ab7a2a4bec118eff4ed13e5ebfa76eb8a85233f855737fc17ceff98b2a771705ec80dc619fe22eb0fe079db268b5307074d61a61a2d585df7289dcac9d914c56fd69085615ada4b7950fa8b095effbb0b7b7c54d5d2ca3b296474115cfd4ab6edcc15bc5804f24e6df2d477833c6170d5968abde4ba6f110b7e6413e3ac103da08b2b4b37c3e0913acc2aade2107067c18b74c540b4b68c57feeb7cc21ffca23a86d1a884d69f4a5e7ad79803a3b8241e400bd649f525046e1060817cea20b01e02c97ea1a70394e7323eedd947ca579e48592358b09e4f6d4d032006eccec5b0573287e1d93f6a6a2c16c05b4390e5f89381c51b589f369b5ece87c631342d1028017357862ce7eef8330afecd0dde8c8b72336ede30133ce192ea9ad6af2fa5d1f7994302cff9145f9b73977cd4398f5147d646e73d3bdbf9af82d30ace0b338fb19b4cbc13112865af520d9f7efd4f4fd4e78fa9cdc127ff84ecc529e4051c6c8e04f446c34d771877d41d2c9c0571e301d6c98b402e207d585e339ab8b7a3526676b7a36856d0a1308ba945a17501d06f909a5a246afa874826c3d4798e5f34efc7ecdb6a69e71914abd1901127bababe9af558b7fda969011c9433c70830d75e5adaa37cd0090d09a0e02d12e2b00231b0d137617dd2cdb963ba024b36e28da7056c6cae001448271cfc6efa310d75116b50049a892804460b9bf5ececa73ac055dbd271b3e52b7f51dd510a08c8b37e410ec0d56d4843381019ec396e6bd241da0739d889400bcfda8b9a5147e0e617ff2ab32779cd0c850d4ab051c7cd804ca046ecfc78ae87e5b85b88ce4e589229c68c735d2adf097b717c03bf1b56f62b5951fe5dc8620d63dc597c636c9ed25c96815aa2170d580962792d8a1a9406b6f96998ecbd9a0e2ee3681bae3c6dc98dd03826cab043f10007d9ae100bc9ae368295e18cb50945fb1161d14bb4d4ff45a80324a0b2a8b219bbdd00f0dcb76e391a8290c7faa5ccdc3a0e0efceeef827daa1fc2b3ddb284e10ca8329c1f46fd989dc621873b9baa0a1a692ed42654a6f92bd9b14c3c58a2d56e3276541ad1540120afc4879902a44958d81eba7bde56d2ed0259cd44019c3459b23da76b2190a1ca506f6771b68b7228e07880fcf41f942aa8348e0a052789c5e08c9cae225ed6d224e8bd356a8e75a2eccd5f46d0024f795524229d943928c0ba7e177558b062498e07cfd9435fd7b77d7d1b1a5a74ebd3b8d85a01cec24f49b3433efdd48a526efc7b8bf3750649c40782593cfa1acce07926cf49ffcf48a4578e01985b3b190fdf0930e10c8a35ec995fb282b4f42ac674cb5d8a9a1b175222a1e295fbdd5da6b127a83b7057e7466141435027826514af24740898036cd3dd97a6bffa051f636267c07c455533849b08b34f1fcdf4216f2cfec3c01011d478c76ed1848acf25d2c448ba5fcac4de1d7b2b3015ff8e1deaafec6496daca7adbc206d7073afcdd6308f095f52f4458abfc48982abd6bb4d18185c48cb173141a08672fdc6818b0b5995eb3dc3f79bfe106a6e422f2dd43b36b65173c3caec29fbc357e4927ec2d3fd47b0b74edfcb49003fd3308c3d1fef8bfd13f57ade3a5589349f8ebd804f7c7ffd95ec1c4a6cad03f75008d1f4016a9b84caa6c448f3e38e345cffc1df3bc4cf82b42a7a3e5dafa8d87b46b8fabe0a6e07c4bf9018e65feea4aad9a33a67f80659ee6ff91719ac67a6bdff0f19f4f56df17cc274aafd9ff117f83ef457d50ba63fe84619f7c9f5de71977fd7dfa6593764e18033478384e658cdddf8f24225b9ff5a4da8e8dff46b07fc50edc965bb823a0140f32b0330fed57372f9f890fd8f46139dc5639cffcdf505ad4c07282d93ba9df1735c23c209a7c274fb8dd7dc5989cff62cb4ebcebf66904e8cdbf4338f8e85b7dbc4dc1fa486cbcaf0596362e33e7e7226f1eb792176fb97b38ed66090789cb5094b907fa3e7547c41dd3e31504a32a3f2af1f6e1e3fae9869ae51b2a6a1e8a6a9f3035aad11bb378ace4e3ee1635a64b22875c808f7c2ff04021820d4f55136e3032d57abac1759eb9654930edab9b031997f0727ec4e1e22bc089196641b4e3412151d3cc868976eaf997f9aba219792063d8c412e87b373db63170a1e05303092032c89e3738ef62983f6a57544907cf9a4d3a9fbc259b88b8313675e9f55bf88b8a2fa90a6192bd998024cd3aba2fe3526a7173b75e9718db3d759572f532b4b373a3f5cbf24ed0fe1ee1bb2ba51a0b88161d759de596419257bf5dccceb321edf23e95e9a8f299818ac907edefcf2b9b1b10b7862d3662f45e2bd6cccb6a33c344faae5e3104c59e7c6261070080cdba013e8db27a706a05abb493996e0229d8a4f5a61ac374b388b11d68d9cf078204eb363b7bd5f4827c5cd83316ac2986369fe0a88a33db5a43b050f16ccfc2d2be790880004f582a389e8e63d0d5dfdf4e327967bb6f1199d5c450d5c6576d21cb9b5cb5467b9d30b77adcad6683e69177933377961f4c470ce2859d3abef737683fa7c2459845dfb403d49ffc2d2398e466a4aa215795cec02761b71ed9a670032b6891633dfae92f74aa70dd2431ea809000440b284fa98b1a6ae2740012781dd33e691257e6ea5b02a9554d9fedcf73c65578de8266e0e88f189b259908f0597280991dc239879c88b2a7b1a199bd34e539a62857c36014e65004f0d64f328594f58707b6314073c991f82dad19fecbaf471d159d65aa7a667ee996675321bf3d16be98e6b2b0e7a3c15a045f142c2fffd3e8625c9e8c17a6b2ad40466aff5082453ec74fa399fa3fb17d6a95cb90ff50e85b038264002d7419c9412295e228a4703e2bfcef5ba5a675154408ae198da0f561af7f7bbf215d4786adbb4cf2b8ec579d143f3eefb7f3f3a5c7b6ecf82b28ea9edbdbd9f8cfcea66f9554657d1529392d85b0511413d8da13e42958ebfa7772f991caa7311d3c993634ce2ecd9dee35f89ebc6f623a401f7b451748bb703407955e4a3dfae2e4e0aa5415bf6d7eb69359a541b8bc268d233a7fe512047c1ce6de6ef54efe5a2344e13df91429666acf02f2e3853921a172c354cc3fadce9b4aab453d6b70ef34514c51ca74c4c5100a1616755f2747cd34545df5c8c74b9caa5af87e81fd591b488f559605adda23b4f354743b8378e6435e143e51d491adfc7680104e4dd792a6c638a1f51d4001f010745e36f8f5a785ba6b36b29a33a6d32187e2f8b225c80a979ec0d2c281916d115b270619d0dfe35076188cb8ea841b199b7764d87bd69109cbe9ebdccad4c6170332a95e34970e9acf1e29dea6fffba3ec0645a3b866df1170be3bb303a267e19fdffcee35480ff6f109a58917dbd598b0c99d1ecb935250a84c40808d70269e924f79b06b34eb57930f535864e8a358aec458db04f9df7dcf0fefc58bb0aac700decc2f4da6dea340d83ea6e234935425226045403d2ac54c85a174cb1b91bdf9c76213e1d291c274b9a06c43c2d3ec32ed856f22502a5b3eef5f0d24af4f407169abc50f50a78da68bc473e4811bb50d064b0da00f8171c37fffab641eb5ae79faa5f8986854e6fbd2efbb56df570befafa3f8c024dfefb26b870473dd36b7e11abac16b132c5fcfad69f54b57e1583616c6d67e2f7171d606fae64b687d526677339fa49ac198c22eae667d96b59fcb09fbe34aec55e8ff5c378a24c22f497c09978680bb98a10b5639057c48e4deced7063205baba066e11f88f0c5b50f40d3cfc05b70d8d896061b81a62bcfde8f64877c1c912b39bf0c4e21c60f33058990ddee52cb4b1a91bc3689a59a110015f11e8c515af2a4400ac02ea68ef25afa15459d869d8a74df2eb4463dff5b54650426790e11916b8e60522b87ecee03a9e773df92e1f2e34e6231296d7ce386e2f9b0bd1f7aecb659272d640bc25995842eb51a36c0949779d1cc604dc3bc36b5bc54bd3ad97cf13dad09fb61c8fded303c37091e99f554cfb2d107f8e33fa0f2614e8ff4c665b83fc59dc7552b5900e57a69d098b6954ec5bbc8e6861bf33c68d31bd2fd60066a4fc2bdc7819615aa6aed73c1b5ddba870aa77d9b48c6528694304c0db7595828c421c71f27a4689759c0d483fede24a6e4098ee3bc5405fae91bbc97eafddb4c898f9f629d581bab017a34c37ecbda14739c5abad7696c1c66a0d2c2dbc1c62610d0acd868eb80182c4096f431096fc1181f8e8628b1c9f1990a4897a5a24a316730bebdc0d3be93b9dc0aba4c9fe1375d84339527bc6e7786ed2697a6029a10a4f0d6d7224ebc73bd8e88284b7de287bafff6edb4afd013e8340bf502452f958e53fb255df63facfb021908b5fbb1deb1e23600ad116e2716291ab9534fa80b71ac088cac8d464ae837d76e1b2bf7b36449f7bf2b551e10d7341bbdec080c7d1e2e2ef23d2a38d3cbb954422983a8e4601e663e991f37db3cf3e751050c11af2b3e5217907c7f3e0cb919575aa2035c9161ff541438029560b7b4570d3cece0393395cd599e48d37a06e9c6a269350dbbc1ec9012e2de84c87b43affb2014498deb07da02a48f77031dd7233e7fd896f48866d68d864162de8527e7ff9ee7c290b00a678a6e2c0642591f2f1fa2e365e410e86a4d5e69e8315df70c8d388a59c767aa25b69b5d8e19c64b741491e4f23e2bb8a050a4c3e9330b274aa34b376d1b2da884b8489499df08296a4182a6ff02ec877ec6f2af6ddcad755df8aa8e4c9c5c9bc1cd06f44642c8cb501ffab8c20e878b5a7f560d13f132693b2570ca1433391b578606f4dd5e0030122aeef186859ca5791f8c7b5a5a83c10258d309f969c3a07d526dce822969133c100b524a03f9fd48cf850cfe94b4a8a148dd298a0f8866ecdc65fabe4c66b734ad71568472406f391ca439bd4e7919525359fca3c1da3474ace85fb8f41551bb8d0efcd09c08d2bfa87548868c16da4762d872d3c49454254ce9f98b09ec4f4174c310484252403dc739a6d892647f1337b5d58434e5abaae4df3f0db60614766c3b299c5a2d9155986629a2239976bb67e5c635924fcf599670a80d1ea147ce1dadd41cb2367b52c3820b16d3190d57eb132e501d4220d3f31082adda399eec2bcb9cc843f8297f2a5dfe0a2038000c092ad97835ec2ccf0d1a6fb3be41cd522c3369131e95ce6cc2b8fbf9da08dd7b65a5a4820aca36f3361ee825b7fa89e85ab767e51ce811ad340b7722a186a31ccc6091411073d4165d94278179fe1fde8f9aee95ed28a4b0c42d63127cd7ddab72d80b554d08587028633477a53df14441ef3c2cd2ec8870f8b804ffb4070c057662c45f5e7ae16e656db34b889b0846bb036bc100bd70d5f45d6c2fa325deb839c3bab9952a0a7bf175aec3b1c16997df2295d884a42625f1ca1b1c01338aa48c42353181ceabd9e2411236b56849e86c029dba9d7d75f1a0f6888e277d3c882da0e10bb2ef9fd6dcfd9f7e047767d27f477fc1bd5b60d396fd74a566368f694b5ca1b34707cdd47cea10d308b386c3574938133904d5c3e4d7f9e20afd00ed5b9eed4f219c9b3247b795c1ccce936a67b7fabc91715e7ccf0826fb85a0a52e94843d608623d7df4ea9077f5c13102919f2d765a7bd808061c03808b1b51dd8ddbafe2980ac826bd141ff063c70c5164a5798f2046a7ec2146751255af8b5d506dadfb5aa1587188c0b907a14c91e3956031f7c620a23c5c2ce025895328a0cea5751ffa9d7648d98720c0df574830a533a01b1c590811e0db5c0b7ea77f4fd44b699bf7e76c04d96ad1135dea01bab177d233bd0c3857aaba95e00192b867ff054cd9e62ab997823a0841fd9d69d067a710d362ed20d98ef634ee39ce7a57c406b053d1e0ecddf97ae452c0781cf2b673a264300eb93deb956eff30d9a9a27a2282cdb3783a8ba5f0764b51717cad5463f6bc7906b1d7fe88446c4f01d043fd722c2d9b35b0bac942b53d38fb86e367b8aadec1cab6e38d8b9d9870b54e58885238b17f4c15e16ee2a39c85566c4cca61011df4bce2e472c8d911918601013cfba2baa1456e6bb3009cf5bdc1e6fbc010f6977a1546246fec9cb86daf49a4c9e27228616894edbf49720044dbf031cd1209c1529cbf65fd17ac4a545e2a84f536905a9c3c94b899e59db7bd64318fefb6ba36e580fa6e6273e00c6db83704ca64e742a444a4a6ae89003239310d7e33f8b168e191224ccdad34566d24c10c5b1f4569f98ff836ed667249ce12627a3312cf18b7ea47c35318e1bb27c655bbb4501fc699252213840672aa53aeae15fd04f3216eb6278e7762ee21edaadd8285a0a50e6b5ea48edc55eb2b7fc2694e53e54537d46c3f9387a3d3ea64b3af12a04c9e746653f56d40330f0e14de211ba892174bdfac5661d45d5dcb455a5deed1a35cd7101f1ba9f9aa2c23fefb99848b165e51175246536a29bce56c34b98d38d64f98d9fc7359cbc61c8aa97574f384a762dbc0448269a29064652b00a0d017dd444d1a584684c64897ed5adbe88409614869bfb00d3511d7bea49e7be27d3b93b93bfddd3ac83e6d6d10bc5bda0a080d1bada78ff932206e73840e98a554be66a9ea1513c080e8d3512a9c958d410348d4308c33bd7787b3708dc1016382d3f0cc85137e84c57c1fffa93b156d06b3eb3fb1cdbf97a54d537e41164c011cda65e4464d803666f071800e62a58d4941a2eea85c196194f4f9ca69e8c72f3d84b11f96f0019903433d0c552b6aa035a3ec79c1fc82273b7cb419fdcd96d63c055c7f4e71c48374a552bcbef5da795ea1203289b1d1731c212f4c94f976df98d3ae0f83202c682dc53b114679308163a584b4a57daeaf15bcff21cabbb9183381202182dfbc07168dec49905bc2a683a6b583d002157a3d5ffca3814d84b8baffad0c77123af596b50a2408a7a91275807bd96ebcf6774e2105d9bf226abdee11468110fab3c17ce37eccd08f984b184c1b52b3306dedffbbd144968ea57cd7a8473daf0dc967ec1d4b61f8f2f08c4865116ea41f60abacb6526ed25f5637f11e223e28f77165d370077efae6720b3cb9f0b86fb7c52f33de0ecc9627f4336ab87bfe524363e4900bc4021b30f4633c5f546d740d07f04524a42c8d5138bcd3222208b6e8349af4966b427ce46b82e9718201b914ca19623d11a7bb26b7c0fccd92e0df2046faa4e54429870c36673d8a0f8d6a8fafca0b4cef67ac79b467b8e229c8e5fedea2ff120d447c0717000bc92628a80a8c5e7275c92daf615562d2c304f5193ddb079de14e3d61e02f6ecaad1f367b6a745567361992757927cea022e1f39e4cb8de711a7ade97603758606d99e20d382be754643ffd90ebafaa1430f8dead3da5f49e4ec7ccc36fa98d0aaa7106ea6882f25da0a2ccb04be5845f9114c1028b2b66d0b0b82aee8298920b2e149aa59abfc4b2a156081412a808f2ce90711d12881759be07e5cd9edf5a1298a856016d019169b918d64365ad9ed956deb53a70baf57f16225fa81dfa6bd124f1581105eeaa5d96461a3b139e1ff3757b1f228aad860e49f876cc4c1c60430d528822e3646363c36b0bc8a953f2f046243c3526c34a9640d0cfc7f142c85c252247ca0c777d6105a03cd1a40582a8e323ad31a4c7856a347e685d0fc7f94ff2d6f52638d18a2b8178e2b0c6990d5a981e5ffc5af08fc5c5043843412790c1c313144a54194864f1a5dd24099d228e151d898a95c99826158134d40c1c8dfa071c7ffe8698fe532e2d050a247d411fa3c9697432034ba3c181627e25d5c20101affff62ce30434ca9543e5f7ac2fc7063549c169d9f2f406154aa1409263c07fd4d6738f9174356d6e08b016f85110230636b2889925358190c3da28f9b51862065cc21862855194960a2985d62880ab91786b9339511011992907188898c399e7b29d11bca402632942083e7d5d302c72fafc0a854580ae8111c3ee791ee731ed9f2398fec7cce23a8cf79e4032626333a6f3223df6426843799b1e04d651e79539942de54c68d379581c09bca30f1a6323bbca98cf8a632416f2ad3e54d655a785399ec4d653a78539926399f63c1071b38d920c78bd29bbae0c09bba18e44d1aa0dea481096fd28082373991e44d4e1c79931341dee4e4026f7272c79b9cb441c1298782085cf0395a5cf2395a28f2395af8f1395ad8f1395abcf1395aa0f1395a64f1395a38f1395a04f1395a187d8e16429fa34599cfd1620b064d4e181ca2e6730e11fa9c43cc7cce215e3ee7902b9f7308fd9c4340f89c4330f81c432af91c4310f91c43f0f81c43d8c0608393063fac79d30f3bbce987d79b7e88e14d3ffc30d90090097c0e20567c0e2007f81c4086f81c4076f81c408c3e0790fd3980bcf03980f07c0e20f6730031e17300e1e07300c9f91c406e3ea78d249fd38691cf6973c8e7b4f1e373dadcf1396d2af0396d28f0396db4f89c36547c4e1b273ea78d119fd36687cf69a3e673dab44e135c9041930922980003092c68928797cfc9a3cae7e4917d4e1e247c4e1e177c0e1e8d7c0e1e7a7c0e1e6cfebf820a32780fa214e04d5180785314ef4d51bebc290a7e5314faa62829bc294a086f8a32c19ba058f226288fbc098a1f6f825281374121e34d50b87813942ade04e5006f8282c49ba0ecf0262836bc090a7f1394306f82e2c29ba0b4f0262815030f20c860021305165cc04193a7400449c018fa92134dfc9798f82f19a05480ff1201fe4b4afc9706b066cd1a01ac4962cd1a12046b48376bd6207184116bd6ac5983d3d2462423d614b1660d116bd60c214429883552a4f0ff6c6c5032438717405354f02207832ea8e8e962f5637411001eb890c0ffe73163f9d1c963c6c262fd135c70f0ff2512b6e0e349502ce026842d58da034c59b490cd498bf2cfee31e2fbcb3fc60557f602f44fba02841a4fe4a1211070f2ff432cd7d0ff8f1f27da1e3886e701288c5005cf03387840045840828506b06883051d58bcf1ff5aec5f8f4e0e5f3a3a2d5d66c7061bfe4b35fc97685073f45f322afa2f11558104066998f87f521539fc7f1e8b68d16302456a4cf2ffa5ceb3023622c80010f9ff1b33ae1f2bf070728923ff8f4385140e009341186ceeff935810000c5f9008e20062fc3f6988444688124250c58aff2f75e1582064881486f0c0ffdf6870c41c1b58c20062d4f1ff4c9a204024a43b5296b4f0ffa5412049a2064a9610e4fe3f8e13411130b17a43863ffe9fc42d702394628f31f4f87fd21ddd54034d1133f43105e505151434e6f10562fbf3d2048941306052bca03c725498201e823c288e42792e1d162bf3a0c697eb0be23c4bd0cb35be7807fbe7a178c73c97ce6a140247958af37e14b246a397e7d2e1fa43f115102aa8831fd7d2bf1e9e1f950a15821d0b0acae14b8777de6acce16bcca210c8ca181fb39431045722dfb925965002167a2fa129620f189daf07431d812eac078c0e90eacb1ad5595c1c3d8c8b9e988b44504ad098312b56b0202fb33e50b3c491e5bdba2962c678ebb58538cb43857cec4242192808f5650f95c5a020f10b5fe21766ce0241d71048c48dc69087a3ce211f47d62b4bc91f180c150a81ac2d7a524496977b0862e3cb85ed2ff31d82475fc63e509441a54205056179ece1d8feb2377e3908e3c13c974e0e5f3aa81cbe32068a22d7fcc37ac0e860aa116489286ccc528e58397ce9609e2b63413b431a64ed0489a8cf1b8fc24c8412b94b07f35c3a64bea03c57c6f8500816a942b0f70e6228cf9551dc753406002bcaa178c487502eae8b0e4f184cfcc1b020dcc7575087ca1e11b6b908ba8c3876c487b898b5609b73d186ff2ff36bde28fb274170030987920e3faffb2fe556fe488afc9782545f8a214d098dc879e744212fc1c0caad2f1771224fe8bf74c64c99fd79432532a531623ee41e698212d03fc92b85f929bdb0bdecfac4648fa5a33d17c8c3f00d7a1139cf32f2309cd5653ea4c1310459590c3991f789093367f18c9abb8cb8f0b543b53174cc1ca34aa58e008fd8a52e3825174a5c2088c364c4201ff2d1d3311961d4a627024b8c90e0ffa340492208531157fcf311fcc214d14311658a98520407ff44443208115efc7fe0474407449886a0840e91c310744c4b97090a6ae932e3104f5c3c74094189108208c185144f881ade24041493101f8422538248230809fc3fd6d265b8ce13e36abcd7886553104888477c2808feffa6204cff8f0a0016b47bb8eb08e888bb1034048aaa0f0cc28a46171fd29c08e31bebe0111f125318377f792bde61429fc73dedb5c00fd45c047d8eb80bfb070efe1f13fabe091ff8f8f7810bd187285ee41e2a101f7048d85c8df78394b634f9ef210794d0e7e53087afdc03971ea0fc4b898287438282c090ab113d226f877c8b39f020c1835282422e94bfec05f419834442498bce63879772e400a403174f42a603133a3c31e9e02487397ce51c8ec8219126c1811231448d469c892b982b6b5511ffe2d0f97951f92f8d70431a429f97e5150261297da5cc248918ca30c9bcee61ac8f0914d4f8f1228cb7c030184aec5ee24a7f39dc61d280d38d08388f1cf12115092511fe4b21348900ccd19737f88de28bcb7f0984ffd207a50e2ab9a28635461c2be250d4f079accf1b038689864750472cad83e697f072385261652f1c31be02b1aef50a359631916ff05381e3e7a97600435c8d61c63811d885600fdfa0cf0e16ee8540d8fe722ad5b55e21cf02585eee41e3aba51ac5cce24429f022354ec41015825cc0d17394c33fabebbcafc4c17f69035225a5398ea0fc632934de6484e68fbe9c41d65187f1f0681cf3e6afa0546af3afe80bdf429a93296950094901598abab080f0769ec449654ae0a10bdbe06ae42deca893a274818948ff7f2a95fa2f39f92f65f0ff3827473800c88de14daf25264a4a949ca239d11732c2f13c3c2987332202fec7a0ff0ff45c99afb094d846ac800c543c96e26abc3060c410158e1132f1a8cd31ee02b5887d5e18cd89544399170d654e06cb360c75a319d22899fe4b39ff250cfe4b17fc972cf82f5550a2e0bf34c17f49829c5293ff52041fc57f8949024c333879fd7151e42a1247853904bbe849914002092498e0cb3b186ae44763e8ed306320a6930168084afcb80bf4728805015a84e18502c02e628812b304137c20f68147d8a7930a527da0a7c61b7bf441f20191e7e166792bbd88a9d5c2bfc88536efa104818b8fe250efa00b042265613d8112b10fdc397ce94861759ef871918be04a63e10b3483a1c430bb5c19db2aa8207a612eca18dfc15022d683611fe87a6141fc158e4118383a000b9cffd2cd7fa9f45f225df24fb2845409181e161f1fd2b9033fee612b2b564ebcb712571470f1854c424afcbf5adde65e38a600c5ca3f8992ff274d72a58bb1f906351fc12f73e5516c796357a2affe7bf61f093862bc0c2cb53f2ef21eb896c752a118a2547b0d38625fa2e1028698f423623851d9946e9320b979a4044738d008238b6c40032445d4b0424ae48c09c041c793e630e5b124812943792c51744a7ca80492562530ffefc29b547b3c2605f4e951150003853c1014443ae49f64c83fa9907f5206fe49849004f92705426af34ffae39fe407898f7f1206fe4917f82759e09fb4c73f498f7f521eff243cfe4977fc93ecf827d5f14fa2e39f34c73f498e7f521cffa40afc93e0f827bdf14f72e39fd4c63f89cd3f898d7fd21a6a04bd4e8328869c47759e95290d1762885a21cd12ff2b31af324fe3c1eee95fcf50980fdc29e23e45dc676f9d22ee8326041836f00f6482410af17b8554ae6046b9853a0ac2c48fafc8e4cd8dbc2c186ad43c0cd30879fd13396b7b9b87de9198bb60a823d651e7891e91117fb582443108438951a41c8d50c4cd3f30e42e4c8aa7c59efd813b2d30ccf2338a5e1710680c7908f6e8803e23e8237a2c8e8c1b6390c9e27310e79d4ad018822e23ee6dde6a794141118c89448231628c63f6bfe85da9f279ff0fc19bc6741963c2ff9b808d19c35a5c14731891877beba85e9b7f625c99af5262aa8891422a91d03883740314462a0534c90b200069518561644413a2f9d074341d1a34684a40d3848426282614987ea8783144855cfc29c34d3f26fc7c806152542fe0f0c2eb05d60b31bc40e60530270ac59fe89a3f51d7ffe770f0272d41fc494b0c7fd202e54f5a487fca52c89fb2b0f1a72c0ff85396a23f6519f3a72c3a01f814b0abc19a67d2410459bcf1c5430009203742a62f81ec8f8f222f9ac25bde880a3a21019f80277541a4232a2d44f9ff346ff281e3ffb144655346100ca7702f1c4d5eca90e2e89f948028ba6cd145897fac0a86a1386b7baa0fc442b07fe922f4433a7718d8bf9e1f2c9c67193f1ee667e71da3ec0535a6090a8201fb3cbe7b07a71ce52130cb32090503573c186a7c8147b9c5f272178f58ac57cb133bd10b4f196fc450da6be5ef6883622e1abb29990affc0b0d25a6d11180a6162eb45064305056141435f82beecb1f26b06b0a807e31dd6418cb358b9254ae153424e048e01c1607ccc20eb28bbf290c87b10f7c5ffb35819e31895ed4ddcf8ff42e2176ecb202bf1e5a292c2973516365894f8f0d5312a54b00861014385c57a752c188f2122cf17cf595dfec4f0acd9fc7b75206bc7c4b3850a4fceffdf98b95d7e0709b07fde4e99ff29d8e7a9014d3b50fe9f0b6557d7a1e45f47902741c7c80b4f190c3bea44209d2eff2d6d840214a14fd5d2462dc0d10204501f8861a83c06041372220c1c370b04bd2211e345230ff3e7612b9d3526664ce444210f83b1e0e4ff15b9c2e60a15586a7c81578ab862f45256d046a9d407b65aa056895614792cd502c32c56f6f8dd63650a2cd5257b63c41015f2d1957756f52a94fc5771234c98918baa546af32a413f6915edb1149137661f51470c51262a397c6a144314e889aa14074ca93dbca1908baf90bb5e61449d1d15be84d4f8ff190b41cc0353aa051418284ca97f2c0d306d69a0b6d779e1145b0f2308864bfc7f00deb46d79226f85cd82476d2e8a2c56e651a144168b44a1f87fa3b1c5f5e31c51324cd7e89f85201282b0cf13fac0b008b37bd83922306252b0540b0cbbca64856c8f65520f0157452317c5f1059aea1462880ac110fc3c95eacb3a95d224d116d1f6c8ab222ca58da16d2101a259f02f1ef1214c62a31157e5f0954df38b69b230a4b911d090e6ab3104bdb8725864924f3c9672e5b0884b1f5ecc6044ceb37c628e429697b300897c280371f1e7681fedccc3e8aca0c60a0378717f5c44fda0421063e50e6469c1509b8719431d7d52b8909873c8a560c15045e03734e4b1781186ea20d6e21a6cb158bc08133326450c5f212862e20bf4c24cd4258b5fefc1501dc4505158acec617273972b875ee86517162548c4886c9d1877017b94f8813c23e8c345315fcf9006bb8cdccb08fa889c670933823ee290068bc02ee3ebcb0e03fae49dbcd323f21f9ea3d1d5e238abf37a46d0070b6775f91393657f3c8c989636823281090ace8b7cf3a1c5a4c00576421714b4a4b06a6923d5feb26a84143040e1122c25625254e07e151fc10f851754e03e4110d30916309d3087e98433c2309dc0c53f8649c18cb63785f38e4991826152b051e41b93824d390127abb2d85e498c0f282e822c8d198d227f09612e1064617c359291600294886163ce22c10428f1e32e570bd439ccad95fe78f7758c95bd6c264d0f456097b12312100b849207ff8e90a43c89e7494cfefbf877c384f17f120f3b80a3e7040a2860196685046ce462ef200417051450c0ac5cc1f6c71f278cc7c1020788c7e1c1d9791c1d1ccd84311182e20a62889a321af1548a7fde4ae7968a8f997be188618ff1d11343d4f74aa58cb211163002128fa58282466e1a61fc1b9c26a7196efee4fac09f5c88fcc935c84bc0a494c53f298b2a388c7c487be33fe9061b4835889c771ad41cfd938cf43fa9e89f44348a7cff935edd3f69fc2789e10c2ef06bb1866420793851a0fc7f0affa54b40d8ffef71d3078afcf30f14327d50c6a78ed4e42e1f24f1c118a5a5cbf031eb0fe4c146f083827d802595dadcf4c11321af4b6dee81121eb014f9ff29260fd6782cf582170c1c37a7260f380f3af87f51486c6152bc74e0c4ff83b9957744a02351e442194c185197f9e142190cf7050c07833cea881524a652e20b3c3a62714f88b3c4fdf110ec513c28ac3c6e7e24e5f3c4537a69f5983971f9e2ff73c857d05e78e232e64f5c7afec465fb1317d49fb840f9131710fec425e74f5c70fed413c99f7a0cf9ff08722ad89c05fa6c16b8e5e36a8a4016df39627d5fc470ff3738b0f20d3736bc08fad4b0f3cecdeb8f7217d0e767f45a5e97ff1b1ad4fccd11ceff8dd14dd1ff67716b2e0c07823f5cf4c93baed710287ab90562afee25f2a2eeed2c9b7f45d925f2a3ccc258798b61651e868760b6ce8967007fe2f9f9138fe9ff37782a8fc206db69e7037fdae1e24f3b477fda39f3a79dec4f3b13fc4927913fe9dcf1271d2cfea433fe4907e84fb48c3fd12ffe4421f0ff1748d013e668f4c688017dc29d7776de11f98fc8adc6d0dbd9e1ac3c86e1e16b7c6519bdef25e489a84dc5c35062c6baccca2b23be1a43afc332f67558142898c8793ffa7afe6f5e23962f3c3e9ceae7cbcf0fa7e2ba88c1f2c58baa8c8e97546acc42d90586ae2e4457843210988f0f8140acd706bde02b2d3ef60881acddc33f4fe8e358a0e149ff4fa21f5271a50c31441d752a51ccae1b305f3e7f5ecb0bb5e86db125e6a2f00aebffa60a95ff312e882a561e731f02454c4a1ef3165de2e6ac3ce62cff24bafd67c1f27f83efbf6805849dc5ad792ac5c3df1e38e64b95321e85429daa80b9c926dd3b048b443183598dd9c8ebbcf5126fa648f91f732b04b3e02a86d97907572ee69d9d77be54860aa522ffffa3a050282818f7734a653cfcff349ae5cef4845161e1cef474d1e9f9e1c2a8b81f31403a3e5a7ac2685b9affbf4101735846901546b3afff9b139e8c202bcc8d42e572e5546a93b5ce504ca5542e4bc73f9ef2f5e564bd0e4fa9122b1f11583955ed9ff5ff2788214a5485dc55a1fc3faa62ff8fa71413459322fe7f4ba5302c043b5544abe1b532ff27ed8457b5c050e51275ce1ced88f1b07c3ae14b6bf0a60412fe5961c86990c5d2c1fe6f46b811e112096e1840fad295120a243c9e24c71ba4351290812086a89d79f8a7d30aa087e615f6d737762f520738704820243fa688719a8280294884f0a729abff67b15e1f96e2aea3710a9629a939458a142950a64830e5a328d27ab1408d61fcf33e50ccad1668c457426018be44fe81ac28fdf3a6ac10002c04319fec838da010148c8fdee7754ce423c8878ef850942c32cb5e68a6645996bdd040c158a0d097c3a0126c4823252815a4b90c1d887d39ccae2c5fb821fc88f241390ab32acc2bcde2963099208a22a72848dc847003c2ffcd07ff371edc748003207038e243226ca2c0e10a1a46a872c54871206243881b26201105879dd40bdf0e160003070b54f860109c2390b8410f2041409823bcc00d5254f1854b0b30047243ab0f17aaf801dcdc7007a9b2e65f4fdc700342251b131ec8c28638946083260a115d6c304011932c48b032810d5a00436578b004151b5600734547a291486a90c482315f888fb051431a1358b1061a2ae01a906812c4901c401fa8c14c0376b2700044076a78e2431c0850c3444503234314683109ee42031858fee021004564a1c1879b0c9482b052070d60e448a4a696c0000d1e648023c10366625043880f381f48d182831a2daeadc104165743c3104204612c40355924a092c3143244a83145414917e20ad7111f1a1b1314a9f172c40024a0a0220036568e420bbaac404514f2a84a2019e030d21d8e22f860070e341d2019d5514375718941c8e8000358b34515d91446420e48450172e40ba3a9013624e49c214991253d2d688520004d119b141368287243164503e89c3c31c644a14875033465121e5c4550e4201a628527ce10396281004841840d1a109161c61f32a8c96110052144c806d8f8ac400414468432515c218208dbb9018b2e96e4f142e4a692409cb8d1c88b0b392cf1296a52c62b0706700a04d0127a7151c01d7f808100052f0dbef4818348469511900ab498675ca2472bb4e880081d0640c0f8aa230e31a31a0e469dd70c7d74808d939182454028001906fc20e65146102b8e7e70c404b4f1a20436c63944561363e084403a8836906c0e18882a20967c8a106b50511056800b0d897c405a112ef1b51184128f041176644490009e0edc114eb12474028a46c2cce0014bce00400745f031031a53f3438d1e82cc6084176054928499a119ca086005a9e364cc0c2650718219df87c9b588083aa12971886b025150d0008d2a805c3d60896079620d8f0b8c0762e6b06193c3d5011a62e4c0060d0ee0204f14a0022d00c00166610337c3939315504dd7a40b263c2801721fa454187a8208cc0944890d886183940f033824d8f081fcc737c513852c31890e387c3370f9f9831221263e2a558840a784477c4c48d0e20c21cea8a045071746542a71b85a4f0001200c01089281567780156dec7c49a435491893724234815549c9042422f9e2b2d8d00e69610d49d660090009309ac06cd0c14ac3451a348ca86007560a68dc6029b052871c29bd1103b85518a2800c7e548203932a86d688c141cea13086c21419e0112863b2a1114e30e3070630d24506431221611f8a9840862d16d1a6dc053491010742b02d66988832f4f4d0811d6a868e90c189f7801d36632af0da000db18a024b1e5e15d81f165420d5883716c2811e7a7467bc16be6873c5153e10f0263043480d165cb458e121e4c32463e0716695801110d0598265cb6a88bb712b4959b0aa893491e286127aac486bec20d3a4280321382e10a191063c4944a8003344e08c22210421941f3102022670b943480a1836100201961f7a0726590211190e80fb19dd1f1b08230b497a11325c32884a87233a993570781181382ae825d8914724475060856f60040a9cb9c128f32f3ae01a48490ce13c68e921e7113614e13e7bd8e103243ae11c60f1da83e7089e2dc8181e68632bb01b020530d3c56833661f714e7eb22d8c3696cb333a72c61a3b474af540941514da026dc694d969c112bd802d8cb2382134b5eb88010c41c00733740a871f8e1029e4d0104c2a2e22864cd1cd014918d522580f9d1325887009217f47c7b92084891ede019d4cd3839a391e883c091b3b3cb08556415e23c523e5083479e424d8d43158b0c128a3118340bd31c923198533ee3801a4048d200e54a21ecc2c510a1aa3043229288d1c2008089f2b5040a4a045d0cf14638680e2e791a010f020c3bd21010da80ae9e38f2109548da8b6d8809045525ba4a0ba8108057090269150b5c5b5c3d12062c0a0caa0888a02530008c4f0c716310028840c0e3138804915461338c111c3088198294118c823861670b03cf1528315314810458b4920f994e68e1cc8e02e3c78a589a25f3125cd03d248238395365b0830482b8d668917267e802193e6df70d5e1827884c68d3f3c40e4f403031a02e0b0250c1d0cd48026cf280810474f8626003d682508428517183a7083c6102f302b3098f104973069646009188898c233012a131001c318219e5062052a0a80a1842636f094a16487338a5ca083008629083823010d3eb8353cb9e1cc0e455b24c9429867bc0cd100483a60f3e5cc0652289286932858301388216378557400879907e8ac8001d111589831d24e982292b011333c681049640a1433cc5c3089c9688b4e2db3079b0bac1185a6421905d81108ce214a1865c009788ffc8e1a65b64c02125f87cae078e142a469162133c79528909ca105116498a80483450e60481b32db0d11850d349003992c01907c91c1933ee6034f8861e68b9495316a70c9b4aca1842563926882021475e4bc31068616acc0c183cf69cc09705862a5ee718198465c6fec0064c08298300ab1c20e2311dc10f3c3cf227c04712085981730e00800b6c862881810062082105fcc200265800f0e3e491e410314811e2c4e50020d1b806cd879801440408102d2b21aa28badcb094027302448c3864b84307d74e0d5edb1850ed38048d21882059a2f61c4291b68808c0d1584b9f200221ec0818c4598264328800c283e4f7eec90e2103e813d42f88162080309a29861e3c72b216c81f180ed47fbc0080aa01a61e3e70140c11b65cc60bdd086187f58614655f382124b7430465381cd0b41468098d010d37a410518485e40208606309068d0442438583a3065f8a1c100ec013e002304258bbcc0c8242a30629638010329ac80031812380904e203194c7c49440a32e6c0e31218be78f1011c0d303101802f3a40200f452e7062fad2a5cb1019f44ca08b2f00508014af3b9448c227101074f0401f3c0df0b9e2031e1104d82af029428191471f6c58f1d919828d158340b17d2cb862cc923200145ef418230a1d6cd474e0458a4ac2b8609b448b97af4b4390232209bde02f3787b02009245e6e420f889e93e8224708af295c4f7cd0c50083c41082235968d0451f32c820673882a5cb0a7c24e0c3f9a2e58224367869e40041645c48635f393388970c5c40028c0c048c1507b870a6834364e880121d179e0002c41a276dc4c185112e58ac3ebe2b5cc000438b1302d89071f121d741d44725657079e1830bd4b86137c1e583186e68e246ea881e4208915124808dd8a3450f296cc14514687a6a6032852240748d9e2c43126084070d027a4c8bac61460e1bba6ce123027974800336475b180089511a6da2c85bc2341fb81e7450c8162b3a4a2368a099624b043b00f1c8135c42d052471c76a800800468a105011b7cc143c6fb40cbea24891c4798205ae84e0ed9f0b243164be67002913d6ab8c9c28601829490a58d27b20ce08b2eba80e0db208baa8845d634c9e249962857cc6c51108108f7886cf3810ce8410257460a85ac30c249072e080bcc3088253d9438202c1e91c0bca91c36840a52a09492c0828811cf91050ec005962ea694d800844b07b0e4c0881c4cbce021002c2e7830481e812c02068b061008c1a80b225ae001a4cc20414958791e2bcc6809f9b0791e228d8c0f7b44f13c3a681cdd36393c4f054390a0a0fdefe421461a2220f1bf2345f604212dfcefb43c50428abb85c890ffdf2945a1c22a5001be841e3de8d31c3aa81e7288440634d61cd182996fe1c9b3c0c8a4af1158ff989411d0fc69842a41df8490ff4ff32711285037be43ce0d70122187ff9308ab073a89b0a5f5faf849842aefcaad9308524e2238f92fe2df490445fe4f2194398570c763a710be789dc3bcd2a7100c1084855c888f9f770a61e814421714847d99b340b03bca61984f2090f17f838105ef05091040f800e8c33f73fac000ab31bb56381a6f2eb8b140fcc1566376612c964e2af56f42584619659481731b4002045b9c3cc84e1c0c72e2204c9a4937c0c2d6b9e5b4c1b8c1f8ffa25136c46903281ee8526d6ee475ed8dbcb51abd30af70da00e7ff65c0030791c9881b300460bb4a59c2a0810376686025e88d3cfa50e38495422069a10c251040481523ae082730848c03a85145933416c1c14b05175884028e5cf91191e0c34a6800223ca0b132a4b8dae081ab3c864c395a63001ad962064b046a8865403083142db280a4831b8215521c4da8c18027c8b0f009b1c3255d82bca8a1e3001210682ab018193031059a282c902175650455133c5849ccb863043df22064e8f8c0004e907281cb494ef603217cc871830306091a4458fc20c4ca974b8cd823ca1b2b9c50e5032512a046070538faf8b9b102354646c10c1548a54e1ae09313362727588c21d8e980b144a9d4ff959598c1ece8ef48d4115b429fa7bf23311f6516df5f11b85920a855add7b7c18fb35447a16af3495fabd1c5f76905fada3da994e9052c4e395ffc09a79c2ea79c7acab15205c3524141d8286617868de077c2600d8ba5f37f03c1dfe0dcdc7c4b97b9c2fa748ebac73d3e86b9a0e74f1674395950c64de9268252044c989c2a08d2395590a3e54f1494f1281696f9e8e99c2858f3ff28f1d59d28e0b2277d9d28b8e0ffc5fc698209a0c48c49e9c1504722177536e7e26af4c84c702568628e193feee94f478ee13f4d10519d9aac3935493d6a14b990d04b94c2c5bcf23935b9f927e22278fd90985b975c3224e691e58ddf6b48cca14e93c92b10d4d1e2630fd813827af78069f1b187953fd01387c40cc40241309cb57b54ad304058f0942f2d7a5e38cf7223c9bfe9e6e5b9b22a9b280d954d11025941e2f752110d05617c357ae194233ef45ffac07f4992ff52241e38732a295194432a51d994af080cbb959857a7920b5b8979cb9f4a3b4c2aa5f906f5a4af2baa90bb8634c8aa62945b57267d5531caadd35f2266d67371fa26ef51095285a02a28ec4009927fb07f3d625e81e161968f0f81e36bcca318a25899952d39f38f42a1b011e42c91c589522c4ec459aad44acc2b4b9880e098e262c889788885a8959857e20634f05f894e255378d260f12883e1bcabc4234a86d82cee99f9c4e41db07f3d5ec4a30c06f411b9190abe4c1244e5038c7caa908f9e4a7397b882e6441fb8e3ff254123490b1f852912ec81a2ffcfcbab2b57aea452dc0b47954bfc40954a486c7dafac1a3f2e4efa820482312e4cfabac237c873a58ae663542abe415dc43f95b87b78c8b770d087c57a65c963de1c98a274812f59608fcf63c662e58b05829d4a1cfab27b267d355285111918c9b2089845d82c12c206b0060ca0c8218a78ff4928d2e47f911d940213a644705ee56a852b4458ff5f9ec40535a4730786a00f9343b8281d62f4433a04cbff7f6688212317b9ffd21dff253b6af82fd5f15fa2630e394a7114a208bf1245687b61a703a58ae663547a86966a86d6c6a4ec9e1c663055c617a872b5c295cad552b95aaf495f4262cb9481179e01842ce0ff7fde44481e24881f38821fd8fa71a30d423810248a17a407419a047204c81c8010d1a68cd21aff25359ca4f15f42e38c3fae30fd31c49bfef0e14d7fe4f0ff4c7432df92c30ce69fd4fd0b71ae56b885a7c7d50ab78c202b0c2befcc7ffe4b6590f147e1f8713bf31f2f2308fe8451a952299e1f0d4c91011f78b020c52184b4418505aac0a001131c9a743181a90b3992c0c25053fa1cf102041f04f9e2040c7ce8c204094858300970002eb898c2010e0ac0411c783800cb0d75000961c50f267dd4c00725260bf460da83cd1e388226f478630426ff4df4c0ab37e5c18688c7527980792c950708586a102c85c715580a8ff11f4be181e5b1141e39ff58ea8e3db0d41d4ffc63a93b56584a758714d08b044bd9510696b203e8ffedc0b0d47e531d5cd451039632d5c1011d6de8a0630b1d4e1e4bcd71c53f29037300c9a1084a0cf9c85be087a576de793970d068e159ac179938c6080a7a1d06c90830c64ca0f485042ca0a60a601105cac75998952ad8f65a51a04480b492c03f1bff252fbaf837e080430c515c6cf15d74807cbe9ce9f9f9b265fc40355e08ae82bc88f151715a74c284e1bca8b0fce8900123465546c74b10e7fd0d40dea8e38d32dee0024be5964af4302cd579a81aca6f44f158eae7cbcf0f87914002096fc0f0c699375a5085aa155678a3c93f6fbdbeac553c7c891f77631037e0f87fce52ad545ccc60911b59fc833e6eece0c60c2856de9f3784e1ff770373e3db98038eff1f73876146d94b1b54fcb751c3ff07f5bc46166b3cd1460bff6d3c51b5f198152b56d818c2268d2f02599df502c9087d01b77659c6d9d4369ae515155cc6956e7e7795946f7763520338ed6a9de59d595679ef775b198e222531809b956a95f38eeb6675a6f3284ec1699d55ad665ce20d04bb057038eb99b67a9b59b7e1cbbbc7caa402b8db71d574dbab7559eea616a5e0343c29ddbdf3deb1bd1aad09e0b44ab5d53a9bb5e67b33ae45c169d556ab7395566ef86a4da1e028ef28e5da669ea5dc349f08e0a4e4bc5f7ea5e4da866d9d07e06cb67d629a6d93f29b59bdba52ca4b7a82d3aca6d6e68ecbae65cfb4e804d7c99df3d69a4f8da7969336c1719e6bb633aa55d9b5aeddc904d7d96dee3dbbc63b4da7c62a959d06e0e8cd329debb5f7decd62b9ba72090e6b9cf7cc5a7c7957e5365dae5701389aabe4b3ebbe75186323be52a92401b86a73ed9c576cafd497d2d5957c646525382d25df36dd342dd36edfe40038da4d2dcfc9b39ae746e9a69104c0d56aab96dd6d579da7e5564e1d52125cd63bd39e332af7ed3deb5657eeec4282ebb0ccb28db9edeac6e5241dc175da6a58e3aa61aebb66edea4a11dc9aace1285a92115cde3793b3d66e937dde22fe5114a9082eeb785f49efdef9cecb2789088e6ed966bb5cb36c777b66beba9295c33944cf1dafb7726b27b799b6ba124ff9528dad8e49427077eb24e75ad6b65d35ef1d9e9256152908ddf1b6698ab76dafd6b9665f2a2e86d9a5c9d6eba33ea4355c46f7c67bd77177b74de23ae91612101cdf34ad67b2db7925d5c431cc2ed5e6a36a67d726433e6e2c907ee0faad16db8d4bca33bde1ed035bad96b7cdca917ce07ade66a7b7d6fba65be26c14bd2e1ba9072e5f4dd3b6ceadf54ceb3a3e728c493cdc296fd775f9da6e6eb766ab2b6bc8bfaf470c6907aef22a35bfd9e676632de78ca403a7bb4dcb79f7cdb3bc75bd9ce57a0165a41c3899755ddbbe37d67ac5545b5d69ade0c0496dd334cd769db3a45d0d23251e5b9ddec065fb6aa9c999fbf56ce06cc7dbd4b2aed9c4d996759d9dc1a0506287adcf1995500d5cefd26a5dee586a79bbbc73e5b0e87b5169270d5c5773d7699a6619573c3915b7ea734655468ddd2a9f984ed93bc65ab7f311d771e614638db5dae1cce28d8a91ee322c65763b4aaddef44b11b7d52e6f1dd62ad7b68d65df9f57f4bdc08f88ebb89e35677dadcd5a530cf6af477b5f06834281fdf354d7e78caabf66bd9adadbf16c6e5b27b9a6f99c51e991ab986f5bb659d749aeb56ea9b453e42cc6b7ebeaae9a7653d3737555a237e5167252ef7ab74c77b452dbf3b6bad2aa722854e5947706aeef3cef9d1bc69add7be7d595a31157a96c5e4df1867915c6c5751dc7595bbba736b37bfbea4a554675408e4b6efb9c5df7bed9cab3d5952ad59c2c16d7dac765db5dd969d6cd6b37cc2fb53e6754685a1ca5b2ab9d76a5a6aba6558942b1585c9b61717d5bed623aab9557f7a9adaedc9e8abb8ec6a34f07853afa3210f539a3e286b85ab37db5aceb33cbd3561464a894d3badd7ef5de72db7656893cceee6d6f926a5d9f12679d35da3d425ffe41a15028d105aae4f539a3da2b4e6f8cb1a55bc5145b9aef960971b6eebe49aeb7ed6a2deb74d2d7acae96475baf8f8eadde75cca9c6b7ccb9eb249796afaed42417ce6995eb2cf3ababd6b7dab7e65b058eaa2ba96c2e5f9d65946bdc333cb5beab2bf7f70243d591664673f86e5c52b9b7d45657cc6dc76575669a6b33e3d3de6df69ab99b2fd7b36add7618e7d105aa3659bb0471badbb4cb68be16e3ac8d3a1bf19945c5553a67bd1dbd9766de757775659512039737e536cbb6a6699b96f35d5d39f19686cb584a9d6787f9762bd6f8eaca51e455a2e1b2662dbdd84a6d9b36abdbea4a15ebd5ca64a6194d2ae4ed60db7a7d307059cd6abd9d96694b6f27f3ea4a114ba1cf1bdace70b6cf8e6bb9ab92f70c6f7275e5c759fbe32a6dd66a86b39ad6d17eebb53dd3b3eed595992c025d2ad6abb5597c5baf6fa70c97f5dcb0a6d19d37ad77aab590b1724e29379cdd2cbbf8ce39a7ec6eb6f1a639d572d737de211f7b7850a8cd3d17a8512854969f27990c4717490163389d4d6b7b77bbac93b472fd811bd7df972f8bc5a20b4c89e1b6bdb3db4ddbb46ddabee9d595630876d904206ed3b6e35ac6bacb3a3933dcf98fc8c7a39dfe249b2f96abe55d2bf4eaf87685d93d6f7d67ac799dfc5ad9f3832bc65dcd5cc31ae769575752175e98b4ce29b78a6f96596ca7a458676cbbbbf56bf9b6199d920b182eb31d979aa6f96a8eb5c67b839bc45f38d965ce70ef5b97554a6b5f5db9c1940f87a79e5ae6aab1d66dbaeebdc16cf3c2ed8c761befb0c5b26b5a73b675e1b62e534eb1d6bb8aa9e5747525cbd5f2549b877925e2eb0297b36dd2ae7bb75d9bedbc7352e1c2e56d675d36f3bdb69bfde695786d0f87b59678935daebdebbdf38f137115d80243979ca92d5cd7b56673ce7ae75db77b5d5de902c32d332d5cde92d62cc3586b736779aeaed49c48058e7466e13acef9b515df8ee79c7559a5bd318fe294d5e78c4a721cefb49a6937674d6b9f1685a2351c5d64b0703cbb9ada8e4a896dae1b0a85abd8d9ea7346258687db986f9b6bb65549afdce8ea4a292dae62a7f99c51653b1cbd99cce4cd19cf89335c5757621e823c611ed3ed68f2ea70b9d36d65ee995abd7558b6c065bbbb5be3bd3ba75a66b75a9f33aa1858e0baaee2dd6d3b77ba35bd67efa06aeb7285ab925bbbc9ae75adf2669d15aedb3acb9c6fdbcc33a393aeae545169add49c88f654e1f0963399d56d6f576e5defea4a950ef3a4fa3b12352c5438af5def36b65b959a56f1eaca30af74268d525bcbd5ca2da33acb3a4dabab2bc351c4d5e78c8a68e370ede4d6499be9cab3a47b7565fd40160f0ac53f90a533eb73460503e632aee9d6aebd73cfda51bbba5235a51d5b9ddacb751367dec98d5e7deb26efeaca4cf20d7e5a9552c7b64050c5daa14a2541e5aaac7ae7cdafd45bc392afae1c43dc82c66dd99dd9c699d669b867bd5757aec4974b1582ddca2e94eb1ab67b4fad9bd8e6abe1d595aa8b2747ef95dbde74ebb9d3b66b5757627925a7f58cd2ab5d8ebbedb2de56571681a1904ace8ce3dd6ebca9ee9addb89e7775e5feb29cf7099096273a4f789e0015e59f4ddeea73466566050e63dc3bbd718d37c6d7da27405a9e60cdc7a0509a135930289dddcc2fa538c35a76bca15028d4d4f814b951be697aef9c72525957575e1a2485ab5db65a96bcdfbad98ce3d5954f80b43ce16a3cf1f504a8cb13d5e7d9198eae2a01d8f0c5b3d2bb4d2aef866a11b158284e4f592bdedde6beedcc32d5c6472f2453c756a73c04758f0a9c96d9cd3dcbb7539dd16d47e1b68eb7e41df76cd377676d75e5d8eaf40990962742af8e6341a1c65647a178086a313fc9e6eb09d0932c3f4f9e007579a29a9acf199516282af115aa541ea4208d726b0414a40a640981ac0e4ea0d993144c8052021412a460298ca0820859085140c03e28c183199ad081ea040e660bd42a1eaa5472c8d6e9d25cbc1b1ca95426006073950a1ab49ca84270cc1948cd867032028b46114cb64e2c674a954ae8f356625e6118947001eee32b040b8cf84aa5d2a2d702a1821428103b98608260e88104433a772c16a842939d79e841042230912a2ed4010452c4915eab0542b9992594c2cc59fa0392541971105e851fa030d10589b7f287038589442aa0e0ddb0828dce77381b4e079d6fdde520550c69d0c070c64c193263c40085f979c1c74b1717b8f46cd19285c3c2b3a373d3c20d0b57fe66febf0a97fce9a6c99f6eb0446e14a1e0dd68001f3a3f800a469881b4812aff240d5c803406490c013c49e39a800f2651926025b1e594c4161deafc3f1620b4dc80c31a247ac86982e584c44760c5e988054c80039e8c78040a04fc3f01c496f761cb187aef6527f3eff3302a133b01fb38ebe3ac7a2a020d51071ec1e22120ff9940e288310fe63f90e14f44644c3630c419ff3c0bcf3fced77a1cd6d08f21c883238387b37a30ff3842fd1f8777f9ff26385b85a33fffe3043dd862fde3a87062380501654d114e1a34ff8f04107ce0c0f0ff4d70cebcd0e7f1a13caa58f907ec079c930f4a9c7600e1a443d0e720c7090729271c72e60d7adc0087993264fe710000040404043406470c90680368c3fec709f3f3ff02982f2ee470e1e2e385cb23727471e1b9fcff8bb8cc2d63cbd4325a195a6696f9c7e9996ad85023c6162d59381c2c3cff383bff8ff338f57f7b2a9c1658e069e932ff3791e05cd184b032a50a08537022d06ef4f080ca3f4eca4802461130c2c2480a23041831914a6918e7fee3d87a2abae31f070a9d325be11f073505070356ee4096967f1c2963985dff38016812be586036cb5bf11cb1be2f79ccfb1f47852847dc859b37fe71a0a470c487b279c435ebfde3a08063c20925c011f221ef03bd8cde278612a552632363065ada68e42cd66bc703f5e83dd27a7164400d6af087cc3fce1313fe874230cbd1ceff8d1c25fcffd1ce4d2424e08cf08f83e18cf08f23c23f4e08205c60ffe37c40ff713cb0238e36420a84609cc22e6e1ed97cf34f0c0e071f58088bf5f2f9b21730a398799751e71f678316f88559c68f772dee856b0f1c7314bec4cc43a00ff4bccf6b6d1dceca9ef6f68b0b27f284789795e6409c488fd1fbc4e456165f2ee000e08f3e9d39836906262d6df48fa381930cfe714e38a61c3930b8b9248ce6448f73018e05ff381550f0ff4d2ac189a0121c2638105482835309ce8d8853aa0487b4bd918be225bf2d49a5b44a2aa9a4924afeb3e8d0219dc730917056973f3160401f56e658401f238eb7321759390b8bf5cae2d219419f2f932895621db13e574b8c2b87409cc813411048e43c8bd0e7f9f09697592f30fcc48c21e852e38511370bdcc2595d1e419fff1b0fb058af2ce22b1c3f319b7f62fe6f3a00891e378f38f2ff250ce6186f0d2f8cff6f69236d0c1d23ca904a6944a9d4ff4d239891bb88dd40d580a6084d6496f9bf41e4907f598687dc90423240881f83f821c89aff9b407e7b807c9b29b48410117f74206bc70f3ffcf0c30f0c6c9647e6ffe6021ccbff8d05f6d8fc0b8ba5c7e62c561efd0b8ba58387f87f73c7f7eaff3776dcd4f1dbeba1e3ff668e0ff419b92852a213173a713437724c1a879515c0706847397cc38dffffc488622aa551a2546a6a9428959a3da914254a83afad1a9d57d2488c0a0c5574a85345f33157c0fef588573ede25043faf158232e4d6958f77e1adec6394bdb4f297c7bcafec9eeda942deed9e542ae4ae97d8023fbe5be0278ae2667964ae54d17c4c96efd5778ffeacc46398c11c6d70670cb36bf71c6d70e7ca9549ab4c2a66143f900793825f55f0942ffc4a93cd233ea4d9d7f6267d050172d304137cf4c2a29d79f87f638025fe6f0a704300cdbe26912ae8064509e2200a96ea60e721141503be135d227e693e46f45c3aa2e7ca421f6fe54fc572b53c31061a1ea808e451894f8a2406094e6980f82a22dfe0774ac381962b68d440d3e5e3ae2fa0cf098635679cc02f336dccc081e571be9801225122fec55319ecbf34c210efc3894c14aa1c74a0a1063250fef3281a9dc6f0f1e018d61829ff46fbcb406d80be0055f07f23c4ff4d10ff376b80f8bff9e1ffc687ff9b1e78f8bfd12187ff1cf21c72b5d65a6bd5344dd3344dd3344a29a594524ae79c73ce39e794524a29a594329bd9cc6636b399cd6c66339bd9dcb66ddbb66ddb368c31c618638cefbdf7de7befb5d65a6badb5b6d65a6badb5564dd3344dd3344da394524a29a574ce39e79c734e29a59452ca2ccbb22ccbb22c93dbb66ddbb66ddb8631c618638cf1bdf7de7befbdd65a6badb5d6d65a6badb5d6aa699aa6699aa66994524a29a594ce39e79c73ce29a594524a2933b9e16bab460318e066cebabd7d76d5ca2969be00a7b3ecba677aa3db9669335b80eb366d67797b27bb89e9cc7b705da699a69abeb5c3bdcbac07577bb6592bbbdd76955ce63cb84ceb5a6e3777adf9b6c98c0797e9ddb1ccb6ac4a2aadcc777059dd5bd6f149f5bdfd66d90e4e5bdd65df6cef757079ab39e72d35d9f1ad753a3839f3b619b7ddd2de6d3e07473b9ab37c6bc7efc6319783d3b6bcd90e57cda5ee57c7c16d5b57ae5d9e6939a5a6b70a707267be69b2ab75eb4dbb0d0e4eb395529dd5a9352c69dedee028cd7ccbb8ad9aad58db3637b87927c51b9e33bbd972bcb5c1e16ecbeecd5d6633d326ded8709a524cb1b59b6eb7db7763839b58dada5dae499be9aedb1adcdcb6ce566bf56e586edaa6069731963667ddb6b5de39ddd2e0f0ecb69c699657aa75463734b8de6599dc74b75aeb8ccfed0c6ecb6cdd74df14f77bf7dccce030a67deea975dbd5369d5b199ca5dc72dae14d37dcb9dcc8e0e6a6f54de74cd22cdbb0dc28c0ddd9b156edd554cb3096db189cdeb2945ab6d53ae5ec5d0c8e629c6dd56aa71be5b887c155bbbbcb73d637eb7ddb60701ab5945ad9dd7b6fa57b025cb76592f2cb35df1867fb0b4eee3bb9964dabcdec728d25c0757ceb3ad34dd2cbb5d4d80b6e4aabfbcd73eb364c7787bbe0e8e4396b936a92ef6c76980b2e6fbdbb3cf7cc55e76ec35b7055db9cf55a75ddf4de174780db946f9c49cdefdc38be580b4eca0cd79bafcc53dacce22c382d6f9d627a7bd7f5de2a8600a759bc352df339b5dde18a1fc06d9bc6f5a6946ab3e64b31169cd6376f2d4f9d759a6d135fc1cd5b719658df8dbba94d6c05b7e94dbb399bbbd6ac3789abe07495f2f22a65ef7ab3123b809372e20d6fb74b9bd99e612ab86d2bed7766bbd352c3196e006737def1ae6bdd96bb4deb0ce0b6b933dae7bd35eb6ade53709ac6a5ae35bbd2dab9ed057035eb7ae3cd6b26bbad6e05705477b6f78d73cb6d9e5b0a0e6f934eda6d7a37cfae4e00c771c57c6a7a37af9deca2e0f4cd726f5a3631be5ddda0e0b896d9deb3dd689731dd10c0d1ae719bfbee5dcecaf13d0037a5ddd7f22d6b999df6de27b84edb79ebba6d5e27b8dcf54def5d7967e5c66d131cc69ace73a39273d9676582b355d335eb6eaef8d2cd009cce7a5eaa6935bbf95e6d090e671995176f38d3b6566901386977766f3771be1ded04e0e8bcf5ca5e2fef56cfa904276fed1defb2da5d4efb00389e31b7b4ead94d9eb500388ebbbe1aaf99f76e7649703d9b5be5936fdde16c4382db99ca6d9399b6b599a93c829b96decdb73bb5a95d6d044731cd18732de79cb599dd2238ab759dde2eef1c5bd989e032baada5fce23bf3d64370b7bb1c4bac717b2304d7ed2ea5dd7a6e4dcb346e6f82e0b66d2dd65db6ddd6f1bbedcd1aaea398667ae76c4b7dbbb63740709de5527659b651bbb3adedcd0fdc9db672dd499ce7e4b7b3373e705d66f7d2aab5cedef4c0ed6ccb72a737dea7b43ddb1b1eb89975726bf9d29a6daa657bb303b76d384bddf3ce36dad9cddee8c0f59d3bad4a6dcf8c5b6db337397033d31bcfa89dd26e3a377bc9dd64b6b186b58d2de1a886b194dd6eed56acb54a38492fe61bdeb4c3bb7694128e565dbbbcd672996d9f84b339ab96669ba6f52bf5fc0077336d6bb6f6562d379d92703debac4dbd377d71ed32126ecb6c77e636eb9b67951ee0b68eb36cca4eb74b67ef00a73bbced59bb2d2def1b245cefe89675d69dec12cbcc3ec2557bf9de68a7ad9659965947b89e513e6f969de33e39073889a7ccb863ace13d7123dca41c5339f5a4bb4adc19e16a96dcf29aed964969fb221cb795f32a3b29b7e67b039c9d536e1deedbaeb7db34c0cd99713c69d5b44cdb4d11aed3ba27af55eb368d529e08d7ef9552eabd5daee7e48870d86ed66a54cf3aa9d60fe16c9675bc5a3ee9cdba6e43b829a5e5d66e1bbd999cbb10ae67ddeeabb3a9b33abbce00a779cedb36358df1d66d1d219ceeb8b4d9be5bd7b3a6dd20dcd5dbce9a9cb367dba66d827056b35ad536cdb4a6d5b905c25d9ceddb6d7bb39ae70d03c2e9d95d3cb3ade3d9a5196ec36df66ab3cba9f3b59dfe83cbec9e77cb769e7552ed075771dfe6cd7857b5aedddb07d775c6b85e4bf14635bd7c7032ebb34b4a71c615530c7012d36e4e39355e6996f6025cdd5c6b9d77b5f7ad336b018e4e9e4d5e379bedc9376d0f4ee69cf3cd7ddb9c655a0faec3b94f5e6f96f39e95e6c1ddae6bde32de328b6946f1e0ba6dcbdde6bcb37df67e07a7e58df699354e33cbb71ddcad53d36ecf32d7cce6590797abb6cddaf79c950e8e6b5a97cd6c536ceb95b2cec1758d354b73d559958393756eb36b33935d27b7acc6c1c92cb336ebe49654e3b75780a338ebdc527d67957d6e38b89a7bdebacb6f3625dddd1b9ca6b5cc25de9276ba6ad90dae6f5aee76ee2df5ec66d6dae076b73bca7bdd9da4546e1a1bce624baba6b7ba33aa69acb1c1d92ddb8d6b58cb8ede8bb535b8ca6d2737aa77c6ddcd575383d31ddd709dbd6f3ae3d86a697099cdb8a6a5961acd19b61a1a9cc6edc455673df194d56a67703ce32b33dad13c3395553383cbfa7633e3b777195359b532b839338bb3a665536b8d4f8d0c8e675a5727bf39a35d66a546018ed739795779c65cf32ab531b84badadd652aa6ded32d3c4e0322d27a677cbb0ddd9ee61705c739bcdbbe96aed963b181cc77cd3a6beb76a5bdff804b8aafbc4dacc38be5bbf9b7ec1d53df196f1ed5aefa4d554025ce61c671dc699d6b74c3bea05277b97d9a9efc59a67bcd12eb8aecbae7667d76f8775b6512eb89b6d9ed999ed5a33db31dd82e3ba6ab9eb2d67d52cc63402dc262da7db9452db8db74bb5e028be5b675cdf2eabc49666c16dbdd92ceb6637e9d6ed4a21c06dd4eedbb5b6dd9a71d7e803b86933596bd57066afc627c582cbf26af3d69cb3997597f40aaed3aadda89639ab97ee8c5ac169ddb74ceeda751dd6ba57c1757de20df79dedae5edd1dc0653d93b3e22df32ebbec5470d25e796f2625dd5ad6f106709572996d5bedac26b78d3380a399d5f8e59a66e726279f82dbb2e34967edbaacab782f80b372eabecdcd62ad6f762b80cbb56f586ab8a3b566754bc1d94c6ff2ce7df3b47cee0470d26afdced96d996f36eb28b8aabb59b58d6b7df3d67550707a5e2aa59675dda4951d02b86eeba6be99ef3c3b29bb037056cbb6eb18f3dbd5aee627b8aef2aa75daada59d9ed9096eebeebdd856ce35d6786b82dbd9ae76579bd1ce4ebb31c1610dcf69bbd4dad6e1ba1980bb7bdeda75d699d6f2dc96e07836abac1ace3aeb756e05e064b7946a3cbb6eab966d04e02ecd36c59dc637d678632538aab9d6b36df3eeb9673c00aef2d95dad6d6dd6db2f1600a775b4da8bf5cdb3e3dd9d497059a632677a6b7c6f9bbd13094e5bce65a775eb78b7dbce23b86badbef96eb976dded751ac175deb7c41bd72e6f18d7592a82e373eb137756726bb756678908aecaae4b69b34c6ab94f3a4b4370ba6a8bb9de3aaddad6739684e076e7b3ab946e5965a7e52c05c1c9de6f87b78d377af52667690dd7b36ccecd6a6d6fde59394b407072db9dec5dc519b67cca59fa81eb34e318d7aca35b777b364b3e7052f73975cf324b336ab359ea81d3b6acf14d777b6696e35ee281e3bdab756a56df3cf9eca51d38adf1a6dbeeaef596b39774e0b2ae756dea9a6d97edca4b39705b9d9df2a969dd66adf525dca5566695de4d77b7c39d25dca5f556dcf5bcdd3d6d5709b7a7cd7096f3a43c9bb5a384b31adea4d66bc59d76ad9b84db5ad355e65deb366dcf1fe0b46de39d4a8d6b2dd32e4bc2651ddf4d5e8ef7a6379b23e17637b7bed979ebcc3abd7980cbbdb3759392caaeceb9c90e70dbe476d68cdb9d6d77af8484ab53bbf56edaf9ec32bbf2112e937377bde16c5ed9bb958e705aa3dbbcdbcdeea69a57c9012e6b3cd3f8eacc52acdd2a1be13aedac56ebce58d7de51c9085737cdaac45ad357634be5225cddf2deb64a8d67adbb2937c0dd3c79363bab7937bb3ba50638ba51dabb9e657eaba64da908a7e14de9ec66ae9d96d9948970d46e35e3184f8e2bb7994484cbae86ad76f3a438d33293877012ebc9b70cd78b75b7dc102ebb7dcbb49ce1d9bb4e79219ccd327badae74e35b963c035cd6b3db517b6ba51ade9b106edb6dcb95d6aeeb8beb1e84d39ddcd4de9b6d5addb42d0887b73e27cf78a5dae64e07c2f5dd513bbbb6f5d4eca601e1a4b69ddb9a7bd786ebeca5b7d73a2db55beffee0f2cc946b75675a26b399fde06697338b279fdb66b96d7d7073f7db651bad739bbb6e7c70b6663ce34edbac96718b31c0f5acd36ebbdd33d592e20b7074b3fad2abf7ce5d66d8025c86b9d5baa376ef8daddd83ebb5de2eafb4fbcece563db85c69c73467b8c37367350fce729a352d77de6456b58607c76b97498ab3d69aec92dec16d566fb593b8dadd6d46ede0fad6328a6fcd7570f46eac7515535cb3bc493a38dbe56ce26d66b6dacde7e0b8deb66a69e63a6b9d66d9eaca2c4f80ba3c11c75c5955999483937ba3575a2db59d99c63d0e8ed3ab51a9bbed76dbe67aab0057e7ecf8ec776a9b6f9673144ab33e6754694870f48977c76bd6abd639bfc1e54ae9ae5a6a56d32496d80d2eebf4cdd9ccf8a5bdeb6a6d83e359ae1c7775674eaf76d964594729be75d3f76a6c27890d8ecac937be353e2bd619add5e78cea87b40667bbadab755259b7a651cc5f6a709b9c985fbce53dabb6694f83a3597627ed7aefa8b4f26a121a5c97e93d71b5156b9c35953293cee09bdb3e77966dd9d6bab6ba52b3976446df19df55cbf2cebd0cae6e724a3e33bd3b5b69af1a195cef7abbf7e69cafbe15570a7092f7cd6eb2d24ce22a311e83b313dfed7619576eebed5c0cee66dddcb4e376cb1c5fad85c171adcbf36a6bb76cf19e6070b6cf69a7ceb8f78ef9ee564e80c3b493bce3986ab6ebb674b9c47cc151cd52ad4dde3b35e25b425e047699319024c061b9d15da7d6e5966baeb50791bce02aee996b2de70ccbadab952b52179ced59bd9d9c5aef9bd6d5cc0527ebecdb66bbae62dbb5a9b7e0aad62dae33d39abc55667475257e02a4e58966bd302d30cc8242a150e1285a2152043899c96c3bab2f973a5f2d06850243aee6033f14aaf5faaccf195547d282cbf26eadcdcee6daed9a0537b7aa69b961ab67a62b95aa4d561204382debf6a6bbec5abbd169b330e11846ca1b8e22253d80db2e9f966a1c4f8dd2be65ab2b711f5f9b88c351a4948405b777c6bb3c67b66972bbf3aa3ecebaf2c805eabaebeb09d093aebe9e6c937405b7ddda517cb77d6ba75da6cd1648567059e25ef9c66d576d77a5b658485570fb76f4f63cb72d778aab740097e9bc03a074a864f0aaa6a198a41432840000a8361200900003130030482c188c0583d1a0585dda071480024f966eb646984ca4d130475110c430c810630000000040000186a0b41100a84f064edb105d0b793131399a8b74cc223ae3d69f0073ec8df9cbf13bdecf59cd26d2ded26125f727564e1f444f85e031698ef8445a593a5909fbe4e34405d1a4d02d2ede7eaafa48ce6dc1fd6d43a12429448be9e7e84a2488256d25be4f2b4e271061857c3151399a8874b3c45b49f58b24b86dbfbffa50e724c1d1f6fbd577750e1298e6883db17481b467da271eee4f8cdbe69eb5fafec70c41ba775badf13b680a907ccfadb6bf83288e2435323b50a13bd0faaa2141072be38b87cacd442ca7b191b0702cffccf8e8d0109779465761ec25be97a0dc9bb0d73ab973a6e0c8f7db6afb3b880a50e28826d28fc0ab3a21e7b4c0f8765cd57872120bceb71b559d9373b7e078fba9ea2339b705f7b71faa3ec9315a80bf3dafea831cd382e4db6f55dfc9312c48df7e54b54d0ede82c4b76f91d15f5a1fa2725198a2c89d9b594434abf8e70ac17def67ade689b46469be92f6898fd30aa29342584c3e4754224d2cdd56e27d52714552df76ee2f3094238948344bbf95ae3e41386910f1155ac574e20813c967896aa5c9af5b70bcfd54f5919cdb82fbdb0f559fe41c2db8df7e57f541ce69c1f1edb7aaefe41c169c6f3faafa26e76ec1f1f653d547726e0beccf114a248925da4abf3f577c20d06865f8e259b9391107b3e35b87eacb84d30d225e21554c24ee6de7fe8243ed27a98f76ee17dcd57e906a9a487c96562b9d7cc238f920a22a3489e9e6882792ca12c94adba73fae50f549ced182fbed77551fe49c161c7b5bf9d3aa92f8a58713475c5ff3dc5b70fe7e86fab6cf5d83f3f663aa6f7eee161cbefdb0131139003d2777c22cae4be51bed9ad641f7dbd4558c26063351566cccdb684295b3c67d4b1a972bf42e6628b50823d7a1741067cbc0f0b06a51a871d6cc88fdd55d977ac1bcaf45aba283c4dbd4aa220f0c48ceff83289e91a71fa2339f6cbb2c05375468382182ee1591245004ddced938dd257acf72511b06b42dbcd7cc5c9757b97017b623c10020db63ec15d34ff3a70487527f119a0e0e7f927b6456ef440fddc74a4ccd8063af5f6da1b3826f2c9d1a00c7593de32c3862562a63b3335a8ec532809e7434459c054bd9c675df3f240b64dce48ee6fc2703b22f87b26f654a8b00591936ce8dcd42ff068363792390e08044ec88abd2c2cc41a8d6679f2d2d4b4f2edeadd6147edf4b20c57b01d1e4cd8a04d9d00ca5db0a6a44f3f501fe694d41e4fb92745058d05b0c300fc77ad6be383c05bb5eaaa935db547d21a58c5a27aa56b37642267145578a58eacb4fc82cc621ea47675a04a8616bfd866cd742924f03917e93925c96029ff0acf18c5690d8cec08c20a06592b9ef79ed8c7b503639bfde91499940a2946a10c0042a0da05395091c4e62ab5a85740bd44fb12d52a8217a272861e64b9636a82c36a5d816c5215c04e3f919e566234b03d23500f0506303076838c0008d074e80c652636071bb428018fca2b9447dbd03978429e60741f42101b11cb280580c19215286d25fed3bcc6387868ef3a224489703824859b07796127cd28a4ee2520ba528c7bb0aaa58b7a68aee46f76f03d0c3a7ca8d41ed04df1e8e616f6d7dda92afb667d3213c85cceff1a540bdeddf717fddc84f057592104185d5a0ccc16b5682d8333bfc5f5c009b5e6bfede6ca3736ab277687be4f3c70370d5f6b2a8a7c8c893517760c6792ac52bac5ebe7ff6f4ece7ec81249585d0c86856b0ad7240192b0d425daf85d6d0f6a47689d7b6d1d71d062d00178acb021437250da88f8582201258525546c662596a1fb8de0ab92f251b66d51f801e2c8150fce3fc01a8d706a06a30e82a595b0a836cf1e994a016177492e953f2c9af9f1d15a2efbe15a67133cd45637f25e0e49c9ca7406969a83331e20d1850566f110cfcca4ee3338a38bbc290843d0c19203071f7c15c0971f9c0dc94c62c2b4c50d4a1da2d0115ab0651043a974629b3d409e6baa08c015f705810faeeab2bbb6a16f2afcd223ba1fba120b3345f7b7bf66a6ec7467e59b1951b9c08f2a58ee7095256e12bdb162c1085b9586b819f1ba9cf98002768be53cd458c3141bb131a433c7e523ec2d83843d3209b3be53bdb8fea632781143bb52a0cbd398bb18020489811a6e2d5495b5ed523acc69861d35630589943277d4466b729e0477e350ceac633d26eb1e1cdec138b19a84addddb5bc649b08dbefdffe33f818f143019080f25a898a406c5d32e99e6e9f90a71be9443a43acb4fe442fa9aaba68c089577e82fdfac75df2b9a9550e3c702da81d17426a5baa8f9c0c868223976f58cba360fad4f91ca112a0a6f4b7a0bdc183306086c9f122e7b7ddae4e2ddc5d9ef13ee149fa5bf16db12781f1073a0bf52d210d2ba3dd4241a1690da267ab615aa0af49158f4c2f5651d73eaea80bd0d09a494d3799fdb38aee8b4c6dd4694b250b4c9b0f1c002fb54070d8af243e24725994aacdfc6b5393957903b5a25e30506274d303d4328dec9856e98fe17cc122fa8b41ff5aab83cb300422b6d9416d6503b619762441216569998685a2a6db56dfb0482c849c1e0cff2a379a83771b807d340b6067b3ecd53ae9345b66fd0bc0937d07aa678a9652baaec54d20e88d272a47165098a11341230fee27355ed5a130b6ce4fe19375efb58e51b4caefaa6e1b7bd7d67ac79c757743538e2993eb21784e8f1aae94202fdadd01b195ea3810a0068eccbefd77a05bc8459006c0934f418b222201f50a939b015acc2a39dffea1bb78e0010cc0cc96fe21cb26d69208dc5d261150e66f40cf63663ffc345acd69d188b2f87d438da91e05943ecc52461a4305c28546c9fca24162061f32dca3dda62aab9e6f07da2508813ad491d7083e184f854368214f2d6f968408498944de58121ab8562f40282a6ab59e4780a830932aeea09b522309d47b1691e64bf9fb78205b6942d0984c8701c67fc9e83e0a4c63631706004284a5a719200141d970d40f2dd8883aff3c927f811cfb77d542fcd86324e2e3b7c25b006a30faa5148322d432376d7c74f592d8985231d31a7c994678628e8007695d69cda5dc299f2a1c6f067868d74ead6e43d0ba4b46eed8b995e742b1a15e5fafd971893ecfd227677661e9d18e47ca6486886214f66f41b47d7f1635ad3a77723c88187fcda7e5a5eecb7d304a95cc81fa114279a0ff888621c1307fd2b91338fe6638b1c1382465e8f7b765b6fbe4204c146c239acd9a27d24c0b5f035ef7a96333bf86c9533acb0c63ecf6665e39dda1d649b366f63126f777bbfe7993d035d02e98de47a5d150534d87f506c02d86747ff8893722011cc17610e3dc8b44bc181218a0dc1d41408d4636e1243205660cd1d218a4ca2cf9701230e799ebe794b872d124fd26621d28f7ec2ef626a80d86379046076b130a3734c8ae82b3ba3b8c86d55cd602cfb4f88002ca6390a42dc8dbe0eb6503a7bfd633d2244484dd10ee67f0169fecce4f9ccee423874a8a21155604f487384016f2c648c92d173c9e17f88a552304ef546003b10a12bdd0439f37ca4090384e4d0dd040cdb24797b1ca2313055092c137d30efcf7d243067259794450fa30639a53906a3edb0f0885349f1f70bc593d1f025b715dfec370a33c70cbeec4fbef8d9180c8f50b8c38dc7705fd81c00bb70c77f49426cc8dc2b4f9a269e6b63bf0f4b37ae56f5a5194c70c592c9bcaf0da681fc3a389fb367471ebbf6aa6069d77243c66c7b7e47690273e1e00a47c73087e19460f168b862f3bc88fe0c25627d127ea1273f9cb29d937f3bbc5a684b27465aebaa78c3407de98f4a6a235b9fc6407e0d6797f9002ced1df50284a797874290bfd8285e54c39ea1ee45bf7ea0e3941f86e5b3f6ecd9396710ff8266c7687d78cf82858c639033abd7ff1630f58000d7334af193adae6e8ed65dbbcf184c13b3e5feb84b8a0ea81f0e8db8237e9692f3b682b9bb8d5c8b1ac9c61e61d6d5b7eedc00a62e04b5bbba83c00fbb27db3bff4caecd58ba741e7e9f8c4f82c1b74713acd02077ea690cfcfc3d1988bcc195fd032cc0c793a1abf71dbecd82ce498ea8a0f59d8445d7062b536e742e9ace3cb63c8e33465441b75f882c5cac3ab8d33a127b343c7f67843f9f5286f0fc05f0a80aa5e5eecacfa6799fc3b9599ee35ba2c802d0ff9411119a7c44fd970a2dc3b36df032afbe67508436c6f86caaef641d25b6c6ea32a6ec250e36a60fff31d1d2fd89b01a4c799bd06a11d9a9d8ba4aeb177a83e1e40e717460b735d85b7c554c752af5b855e4386c2b1955f27813d8a84b830ad453948e994346fe63bd886c1be1b69d7af50ef7854062155e25f726c4345ae66f0fc65dcaff0a09687a08d4e8b3e9740f2487caccafcb0c53d6fdccb029a7535c37c286c94494756f7fc08036a250cbfffcbf30907b3bc7ddc2cb0241ecc502ed711ba7b7f0eb48acab3fa5ebe350e278c9a419ef175a34dc3470ab3605bd63b85bb3a5618cf725bbd77cce97cb6a5e57d5598c376cd1bea6870d941c0b2beb12b45c3d906194562a6fc77694c69bb0e2fd010bb6f065ff8d50cfcf9dcd71f293b20a8e7b303be4022fae9c27439d65714ad624d11a4b5917c92a0dfd7e7ea5524ff7aa86ed9db6546e9f1f7fc4bc43f9e38c4e087ffb07a001a04116210c3b2fbd36cd32eaeaaf0fcc224a9130ef38410ec861312502f85a0bdc19d7e53589463fe51052ad0a0dd5c9a395df2b1ea69d3f0eb26494e17e743b7b063e979448be503e3df81a8ae0ae08ef727c1592bd6a7bcc7c3bf4befceac5958491324f0a7ebd1202850f452a1f9b7fb240880fa20e1cb56ffcec9ea0acdb93664ef69bcb49dcc2b759a83b1a9578c9bdc21c90fbb5f83bf2cbce78f255ce4f2ce6f51ee3e3da43f0d1cbdf7c3fbcdbd9f62aa3932efc250bd2fed8ba418d61e1ef8a3bf6fb11ddce2d7984cea7e94b0d5d479aab6b1864dcc5cc0e3962f6a282c953ed9c3bb2874e1dee7d5e3bbfdeb52063b3b4e400ed7b0aeadb4dc90700da3a330e707978eb53309cba8c326e2f527b8e28297fe90ea9f34a84437eb330f90f0dccbc077972e8ba0ee5674328d4702bc169d3fd11e582ea0586231a8afcfd8c28bdc73206c86865eae998541151b53ae67ffb030061aabf919f377ce37379a28fd42a7bdf870782098a492b3f4e629c3706837c24f62aec21dbdb75644f5a661eb83a25226ef6c543d33c1a3d0d8480b354f569f4dfb5433776a32bb9b93f2dc592ba8332cb00c6d182bc5c0a00695788311c0e9edffeb2afac896fecb847586f4402d80720e4e978dc96bdd0f05dfcf7092cd8c1c7c379bd71f6f5e106b095386f50ad85d1100803c807a41e392b0fbe9de67d042815f7b88fa110678da3174726f28ea87af1e6edb0003569e6729e812e90845ab0f6f60b90925363f345f362dab0e30de574902915dde25fdc42dd65cf8a55360c62339dd8824b55046dfd0da75219d32a27690c27813812246f9d4b309542ba05687cd7930cc8f34c3410b3477c614df311f52ab4486954e788601d6f3785f7f7a9c19e0bc155a14c73fdac54c9b86291d4893dc7f9d9f33c7c8736f00783af8ca85937779d1c4d064044bcff3059ec3d58e6279beceb10e777b53490aee47d357be9295ff70dca766ba84c2ea8f59361050d7ac7c4ec0f9b0021eacac5a954470846d39c72b7f7791d28f574c619c3c0438f53eccb16f2c77aa7b310f9fad31272802939db3222204f47463a2ba2d88592d19a994254af629e3b3c173be93a355b49b219586824b07215b30d61a77a3233a699232339291bee5618865239a4e6b3b3224bc921950b372b1e561051664489c11f94a9777a3ea538974ef2b7b62982879d0ec5089fcfc5877816eede4920ea59fa968dbfdd0b736be67d8eeb8866a07a63a1297a85e5a68a1269c42804dcc1b0791e6bed355ea58cb7e4a16b35165353049c470c342843234d19ec5f8c50c211e3bc0164db7054d2bdd399d8b1bbbd6b1d894af2e9794c1f00753eb58cd753be90958a2112b311bad3ce423614b68ea0263e8f41a5eaca813f356ca7383e710fc30cc1d033aa5c63cf680ef06d81498f1ce9ee2c0fd2692fc5eef2738afaeb5f680f3c9aced0799643cbeb507a70db022bb8f112073c82f0079306d61de771b2dbb9f3cb6f3508d49f5bad62313bdb066849d0ffccd277f0b70f80f983f422f88e3ab93052f18231fc1fefb535a0b7908f10eedf2c0350a9d584497e8e442eb07e60694bb6adac2f03f0aa963753777d961456f7a461c95dd40b7b70cd75efe0932e53e63aab3f9e16f0cd9139cfec5b51f434d26952bd8b75f154bcf23dc85cc6c422bc5df6eb1174a021accf49b72f81584e707b464209aad63d54988662be024f537165149dc90d0ab848e97cc4ab748f7b282c2b4cc90c94c9c29667fd549d7f2a0ac33bf8b88ae418bd75086bfda5c64dd2ca213fa6d3bac9ab90903e8be0ae74eb4a26180349513d3d0710299414ae391c899643bd8f7d8ddb69a84ed73873c28c5af4f7e9a5c1d43fd699dd49c24cf2844d7de803eba26b6f03129eab1add8102a75acd8a9043796def1a0c76170cfe02b4247094a6833c94b0492a4ff2736f395b85521b2f3561f8e8bd87e7ef65dde94a6d5dd118ee8a97a3e134465623347f0330f8fd64f163410cf7d67ca30ff31079a18d1a08e7c1e63f41da4ddc6dbe1c752fa523a656f2964c2f44a40e05ec9c433cab8977bf95c620a76ef3b1351ae4d90010b16ccf0136c5089a9e36540b9e8b098d60ac22f47c55ceea8986bbe424bcbc662e897ce9004e5645c09ba48187b9e9a269e60ed013f46bb7218de6d443f7e03f3fd6e96536763536777bb41d2becb3afbdad72b208bbbe0885f1f333bbe0c4996b33072d7e3ec0d6840ee4586c225573ea0e54fb424cf69a6bca3e6daa9cb339789d02c39ea40916831dc17f6e210fed7428b61f1876d3b54bfbb36133228162fe54470ceee6efae0660831c68fa69e378a38fcacf66efa162333fe8908fcc40d5d3595d291cd3e0ef4b11f1b270a1d1958eee069752eebda237d3fa1c6ab5bb406bad81deffd126e94c9316427e68e7d9f8634cef75e294d7f91a1de5dd08cff1289331a8be7d8f0c7d2e5cae67a9a15aca19fc807bfef99e87321f82448c7cfba651bfa9ea1f796613b7b095e513dce29e4e76ad0c2fcffdb7aeb207bfaadc5bfb01800dffaa2dfef8576b266bd9f40f2ecc287b29be57834fbd2a39a2b9800dfccfebf1de9272f524f9e9e46160ca3d5f5ff4a65fe5b40441ad5fe21c70251f3be35d8c86b460bc2eb2155c0327e055b91af8ed4128bd93bc04a7e3ba693580d6f400bc2eb2155c0327e05598bfcd39b69e409fd73c32262f81c63b40c874f4a93c5f19a6467ba3f51cd6c8777b405f3fe456d633bbd50ac0c974f4a93c5f19a6467ba3f51cd6c8777b405f3fe456d633bbd50ac0c974f4a93c5f19a6467ba3f51cd6c8777b4054b474a97092dbdc12d619b8fb5e5cae631b654d7bcb796a99a8fa995ff46143ff2492c37f6607d7e046cc76de907c749c1e02da3238fcf6b466242f7af90de740f978135389fff71db711a3aa071a5f079cba84860f399919fd7fd23a030db8b6b7c0dcee547d86e9cbe7e681c19301150ba1aed2574f2d98773a6d93373a265f361a33eadf2a7115add60412b9728c2b784f5dcbebd3697bd648a7c576a469267d6efafd384e41681ae8d89a8f1beaed1235df70bf8cb883c6de4b20d14463e66b9d10d5c86e1d0cb5dea1533706b05bbc18665270c134c3fbf11438a885513e3c376dcdfe54b48cacbe1d9da8a39bc27c366fa0795424fbc84c35555436d0ee68b76ba347596425fe5f1ef86f518e0951a00a2a0ee7f8ae6e0a87e51e5d65ccb9d117e7d228578585e8721c0e4d3b44ddf7ae4808d954d7478cb196fd2c7daefd884f7cca906dd403df240410a9d7ddf430b7744af340871c76be5bf2f2d35c3fa2b03c2ec433a502a48bd27da70db081a25d857a5c22447492fa26483b25bafc5a78cd400e0f5955c6ca54bbff5a1f30fa5c7bcc74ace93b959451baf420d967c8ff20260d2a0532d4d09fae3d99e54e811d41293d1d08f2382755d10773405613c407a572d9b2976b9caf907c840b2ba061662047426cefdfc8b991539d30ad44eeff2f8a733bb5dbf978f88b8eecda197560ca0ab914ee6efc07dc657707129a0ede8b27dfd73ecd295af8483de39b3aaa1a01489998fa7d05b16b7321e24b654fca8e3aff832a7b11b6cf6451b758c0367e8df767fcd810b733f8cf2761037e11df8978a0db311bd26b2e948179d3e1ebed69b4cf6e0044d7d5422c24c50c1a1efa4ba1445b27a88a71a64afade3dc19a6138b7ba4c5799cd477634732945fa1daae70060089c8c42b06ab2aad81e9d97b477b581e8ad4330244a3e19fdc8e3101d07974ad0af7c82460aa28d56def2a13a6ea98720a7dcb4afe7127cca4dedba9b6dafa6575db1562e73840c1f54723f25d5856f31daedd1dae2e1a88d823ffe15dc46d61844f27cd61cdb330568236cb828062f049cef86e381b1036d5927e35703406c5b5c24673ec7df8eda0bd583a4b6806432845b794a5975798d3c1680d82aadcdd143672e36a5ddf40219f22bf1b0da978e54c322cd95461ef80eadf349758f71108622b9b77df16e16585ccbf1fd10614a952be44acbd1cd2cf8e2a3974ff264a0800ad9e44703aa0a02684b2dadce19bc8eb1e45895647530785b010eb59e362c278ea5a04ad6b9f52a7880783751cb83658bf5a644a73ae3149e8c4b8fcc550d3e7189b5511b50f837d37637b990e9b2b08611ced687b940b52b903a109bf5b397b87ed3ae7a15c27aad144be162818cf48b7f96cd85e88cf78f5577e39544c07a49d81a9dcc0e10b5ea437a894d8ce19348441d2836fd0d1efc85f190dc00ae3fd43fb9c827678a616feee4fac0bf77f5415858e13f55be29df0231ea6b0563a9f79048751e4f29612a40bb0d470741628b3bd7f87f8e3dc0e859fedc222559099382dcc958912080c32ceb2055c8b52cfc16e8ce32a29e5aa591845b0ba727565f69e06dd225975bfe9c44f12b903bb73c9feb38c4eafb8b80587de5a9627cafa6c0b3d7f1ada1c99de151d4c4136025b871d588415a0bda204ad1524ebcd8641648f42c1014bd654c5630c3dc1fd8ad1fbebadd88d316d2564ff6ca5b62610b41a1ac241c1fe7e0285d25136152734f4165212be3ba69aa93acec6507653ec416fd9eaca4c36c228ee7b4819594a885e234eef5bfec41c85dbdbbc117cad704f6203e3af03d93919975b63277396f8bf5f19197216116dd644cf3900495fcf831c70b7c0ce83f3e8e78b8a3f299f6d2139ff517dec292c962dc4fbcf44c433a8ae338c243b4b4c8e6ec0e4d9bd854d1f8989fc4f8be4aa8563e15d47c0b81fa6a9edfa6fe88149d25de6988b2bf2e72854d20be5da58bb7f64351d3a893e6238effa9d4f26d19d9673857613b158a331b492bdc4d38dcb2cfcb6e045b83a41a79aa8a93eb89f518de329a0bcdfebd0fb7cf184a95599a2977b2c5e917bd58cec135cb0551d3f487f971b6db3c170d6ccb36f02e13f4877a0778d6ed3359564f18b83567931cf18a0d3dc5573f9c2c498fcaacebe869de077d0dd782863830c5c2cd40e5a3910dc2e159dd3711b16c08e9dc3223f08612bbb84111d6233aa9ddc0eeb0083df6c560699c151bca4fec73c967288e6c516bf985657bd2d5ef3e36ca94eb6d42c2881d3ce1151f4fe3def1ea967cc7f433f66e12a6dac1e1cfacdd9bc779e7d3cdb503caf9b660d3e2e2ee74824c2523786c280ddfba7d7a6a21374c918e20e3a4c103b2814e6c57e9969210fc9614672d2d8e3f1348169e45cf984fda7f3a77277c3bf1b4fcaa9d18fc7d104061a79c05cda510c38fc21cfd8f68499e4ae9d81ee27234442c0108653216558cb8f81ca6ecf3846ef85d5f90fc5fb9900087677de698712fc69f26b39c4ed28b97ff585c73c39cb4a86b85605261fa0640a33b0baeed4e2223f0ced9d83666a8382bf43421bb4fdbeb5246b8c207974efdf7f8d2fec94defed6ccc5ea2817c94bfb1d4a46220873937b91ec75d85c557abe52f8e0fc4a64c79ffc8b54e591e93a97a200230191ddaac18ef905fc0f9bc285c142289c7d8294b55dbea8ad15f2f0432effb7fb645559ac964c3327bd06a8f9c045487fdabf86cd12b5e34ad001290a5ccb1368eab8f2c1d2f33d45febb01735c1d5ae15e6a9c3d0d3b0b51281df8bd695702196246a07f2903df4b9db9e6807dae1c0cfa79fcb83e0de8f4931cbf8cb85a65c8861b3b25edf04f295c2a7a25694beeef896e7a680f99130a8b376e3437aa6bcdfd429bbb65010e65bd47076ff9c50d955a60c3979f2f9dd69175760fc172b6fd9cb464d9eecd598ccb6b9e5a1c4c9b780dc5ce47b8f2dcb9dfce4f7cbba97dbe642d4f8088edde9553f0df0c5cdf80da6fc25be3025a4e5aaf9df6e377895043cbe0373e787977f73b9033543a3290076068ff86f68cb78c79bcb1ba0bb03454f800622b83bbc8f0ee3a9a1d62f65a19bfcc615457f6a4b6eb6fc502dedec439df46b3c5076b8c839cf642fdbe1132fa23553cd845423a84d1711d58cf951b5d2946dcdd1ff075de4de27e3c214603b50075b163044ce9556c27f57067e748695cc9ac842e53dfe46ad0ca68484ed7fd8763224b0cfb799a6e823d1476fededa66e666fd1a81f66945376c60d1473809f98f5a775e5f2843b8dc861c762a6ea4064d677f808528db338b173729a775775e7c6853e0293a15f5951479a37a75e098644515d3bf7249ca4b57e372bd5f553a95697038de3146c7ee34ed1e738e0eefce67ca434c84beb26b83b14e6f9deeccdb5ba104dc99e9aa46e2a893202eacedaa789d863de835470b973949f5d81732236f91dfdf944756477eed28d138831c3ea23dc1db3f70d92e43dab245177e69bc84fc1935cd5813fe84496cc86aafb225325a5bd45b3c1ababdac80d5e86cdadec1becbff3b5b8314ef3d6c9d3b7c0b317a8fc0560444fd6587af82b83b5c97b28f37eaaa98d1f3d460b73942aa9ba28f25eca02c7dde408db1c97976b3804afdbf69126ebf3ace95e596db028c86452836f0bd9e1303eecfb3a24b27e9a4c6d254b8dccea78267be378fc50992f30c77823984b1c68cecb7259ae0e9da5aa392680241135ae10c0f92d0d7c9d436e377ce1d6fd8b6ad160c9f07ad9e3e82fd562c0325c9c61f8d07c60ca0fce42ec3f073bd334edf03fc397bc25703229ae80c2e4dc819f095e29c64a5ae9db16a04686d80b8ad66614abb605c0693a7a75280cd74664026dc4a6f5d880cf6a84d455b3d4c2149acf6e133434676e3c497373d76adbbbc00aa0019753aba70761d1783da4b53f434f15fc7ae3b2a07f1bc2eefb4e31911f5663f42b41cdca81e453ada9201c503e1331fc8c358ae137114108aab2a1ffd9c40b0bbfdb19e24dc03d6573359c6d435f506339077d83c3dc283a6517bf1340e885bcf5ed1e6c3324886f5014b4e69f23d23a5777b2917ab25271dd214c34f876f00a51236131ddd09e66e4f957b6087029cf62b4079d2e41e360a4c24cec4c721e494ed5f3b29d7ff49d4b291fe749bd626c8ed9ca1083e7a1b5ea703ebc3cae629c7f379839a6484fd36efa0d27b000ea10de0242595f143233068821d4f62d274681935e1d3cba477acae75dc7591836487c76e8fff2ab81bce2e7dbaf58fb7e9914a3a34136d01f25e9fc252063958b299fe937e5ebfdf070777c71f5c444e98afce9157559d6c98488112bd5e52ecec74143559c8b1c1ada44a02baa1a9b3571eeb297466ee3a19041c3cb0519551da78d9d548bf7f871446119ac9004688065bfd4abf4a556250af0c94131841e97fcac453549c5348a928327910c8150b0cd389683d99706267174e70b0f571ca84b52ef6add159ad448576dbd9bca8a3b0f14acd12895077a972eb22fbf3489731bcf54632afebab5275430c17c04c6942d6aa31a25ce6885ef0fd312b7777c77e331da6c1c8bb445c447a06d99eb26fb603932fd421ce2a2d18d11b191b4554348bac6392fbb6bfc8fd6d08e6586e7435fad99a335d69dfc730709e6a3c3e5127edb10bbaadc95db2f84e1a42e40cb75a9581cfa9c601cffbc7ea802b58bb0dfe5fd62ef5f8ce70d2e1a31e1302d38bca8fab351f3fca61270eb3c05de752b6e4983a5f97e9497dd1f3f96d51edea57bdd45a1bce555bdc15b29f186c20cf149c399476935da374bb874cb66a5b921cce295906ab0777b0325b9a32f423a7bc3ebbadbe90d441bb6193873d91b0be85a4596685bd3aff4c8dd9bd97f80f1113956349c47e3e7db77e90073b9e0c3920a380d0379b826a3e3bf265c724cf738347a6af6ca93faa30410cad8c0584ba2aff31eaa3198132b30fcb4ffd5e3619a07e9a9745be82fadabbc2a75377ff4b704f494ce56a0ccc01a312075efbc5d98cb3199f3f7e0648b1cfe7d797fb88feb770aa07f722d36f9bf5ceeaa6ea352164cfa439afb8dd78db2939c7ca90cfed937b2255845c870201789e9478a0987d4340d5966a455f39f486b5a491a593c0160188a4b0492331a45178cf76521e0bdfe02cb6a7c755a0bd391c34e6cbaee909a36dce531c8fc11003e82e0b7ed5b948c1007f5d8ca22a39297f9a479eaab66bd7ae368aacf814d02faf66a042b9a189a3ed2bce584e5c361f8e2cc4ad2ad9c731ff4f152b8c861a6686e5c117724b3fbd4abff82108f92f49aaad76534d1cd1ebada27940707064d46ec2fa38805267144f8ee1cb2d648e669d6c8b601bb324773a2bed1caea6d68a3ccacc9c0076fc04db2864d7916d9c7011f114037f3973fed5156ab8a05397a33a063324c31c8a905cd658f4d5f9dbbf7c04b403557d3415a6ae8a5deffb90d6e6ed98be9a47b6f2a7a40d1377b25825dd6d1d4a6b525a646a000313fba5b1afc947e28dadb63663f7213ed16a5f6b5cd7e0312baa83ba1f5c5f23fa88bf0f098aa6640bbcf639aed67f83ed6da0b6b31f20c24a0833a367ad36e2fc5a3eebae6f200e77cb18b0acd451631d1f8e72c28059a3b2fc27c533cb27f1a9dd30a5acf213607f90314b9d72ba30ba036c0b223a2749718dd4b869e9e4b1c6d387b2c9012621f828aa5f8210ac97e0dcbc29726e65ac8a3a6a490bdb8ee427c619852306c3ce7c72fa58333d75918069b56b9be6fac612436eadb15173dcb1f9bd43d41f70a51d27aec41d8b6862de44672753a70686e57b17957fcb6a4a334e5f94a3ae95c77c78789a539fb9adc24dfb1ec71bfe6a84542fdb0a9ff3534dbe6ba68f47809f33071b2ee608468acafd2b1f3a7fdd07f9affefee5403593eeb90bb79dd02135e9ebe5b24397146bc4cd1040d70e5ead0728014d026e162a794286d5135f3e69b021e4eca00d2ab04b0fd2df409b747924779eec44a6fea3f9b0e49651ae253d1ab629e6fe7edb2f89c6aaab9b4056d05a0e2d460dd0068499910b45cda4e6459251adbb62bf7e89a95f1cdeb40217d430e9b0d213fbfe44e924be1940442e9a9361b9e622df1aeaf40116e8d0587084b0b679636d9fddd2c9b1fcf807eeeb0d22921c5f111efe5e42c7363edb8b39e940fb24708dc9c32a67a91231e0ad9cc1177e35833f3fe7f547ce0648ead9cca98561a0301cad7d11eb46d1049c20ca5693a29fc80e68e0324d6b34c366c27706608801e1bb50373c56d325e5ee899b4291a39c20a74f963ca9b609a333540d9484a57e26bbcbecb04c5a04d914caf75bd9b1cc18aa1f18ea79678419bcee7d2fdc8bc1a3c8e24c25cbe527c58c10a67187fce8b13c35faa2acbd402d85e8213c9fdca4189c1a9dad28a1bbcfb2cb33546fbe935082b8a50e4ad87cb81368be7829465b3b0c56e31338acca17f3751e2a8d012ddb63b3fdc971272c6b5b594d726fb1eae7cd557ff7cead9497bf8ffcd40c9c386a067842dfad36b98f2bccb96da13714ee754461328b6cf5ea9b83cb6c94d6fb5e61015b346f28a7c9418781a5504ae00826184fa056821111d02d5846e9b78edaf56fec6932d6d2c21d8f7a071686f0cbbeaeb3117b9576c78c54e00da0ab5f511ab10919e353635c0439c6f5b71513d05e04d237dcb55b2bb88773e3ad5db6cf42beabea2f1f8d745bf58b8230bb97127efa7f3f28403d8443387bbdd7c391c606e9abedbe690e5e4b2e3de47bb7684b1188608ed3accaee66a27d05be7cdd20b554daade65135cdf68ea0876bbc9a5eacdeff5d542816a484b6a65a2338da8f173e6b5a434fb02faa141d3d9577347ed9dd1c6931eebcea322524a6fa140800dcfacf0eaafb07e59cc2ddabc78650e72d1c894e2c9cebd9a0f08d7115efce4b6f9e2f61b85b3bd613362eec0d2a066509ed10c863f97422f49c3a80642ec16ed4d2d6b386f856bf7574c2ae7f705a5640be2fa2d48236d0179d8b5ba7d63150a2121f37804e349af3076a85605feda47b11b96ee153c994dbebe664173dd996f6d049876a7936c309f33bf32ee8be266f16ab1bab3f2260f78a4b894e26841dd0f43b3bca06bf31cbb4f81b38e408f2cd9e44ee8c82e1adc067bdb441cd82d957262d9aead55ac844f7d6f9b60488520d5d5dca02da59233df8ae0ff779a94ffce377d87b30200646b29ca385b23d3bec850de659f18c07c65a52c850af41318d40a4856ba88aa468415672cb2f3bfa3079fcbd942ca7a3b8d1d4bd7173a0f4bac1a37a22e25dfeccce29e82800cbcb25f9fa4094456c7131618b5a7f00d83fc66d06a6940fbfec01b0b9587159f821fb3b36b48da94cca53e767e9e1b94ce4dfd7cb3fa07cd9ccbd122e1e2c6b0da46563024a6da0a706d21f98598b7cad58006893650e74b57556cbdeedb51a4f7b27be54c7c2d9a68e65824970de3bb1b3b8d3d3346c2df136c6f1f952b7a41c99b36fa978d2faa1904b3dd689e2de88d780ea118856c3aa0fd13bb865f35f86569ad386278db07d9174d71da5769447f816740314e1ae89df6bc1ace8c31ac75efb0226c598d032f209a3e9912e66bc9addf58b5bc6befc2eb68f7ebd45e5614a7ab5d9ed21bebb67c20a193d842b29c38a1fab2e58833ebc7ab430a1c43b4bb010c9b11c547012e76ae12b62b11ecfc1e0354adae7834f769f6ae2a85c642cf759acf26b5a086a6aa4937abba9b6dc0db97f2a9a71a9e56bd8c73c39a99bb4d541cc0810f3b5a7b6a1d7b53abefd03884a0d689ac9a5dfe758372e66701e7a6fa38f051729e856003dcea9b16c616a0a46beb497196ac5e21cca220de1e34d570310c207e8c817c441b7c3985f519547ca55fe130bfd159ac78acda5fd89c775eee20f81b7b28072bd7be2d69b66706aa06719485bb9ae83173f71f368ddbb11b0d6788eb3217f959ca5ba4b73a64e68cb76fdd100d8be66f0f82bcf21c23c16382f48879a144ccdbcd5c5cb9cac5f78666cba514dfd0f442e7f7ba64b3defc2033a541a4ac55deaa4f9c4271520aae058f29542ba7ea6e4777f16f8f714d928726c8b8f0bfe7778dbc45a13d8f4a049c75c14498acb71675f222c5ebbe310c8518885215c0c30e4c1dd7c4341dca7b5115716f7d643d6b402ce683c4baea2f119405c43d0489a1eb1a39c5b60fb3fed4c2f3e391adb3b21a4e0acb003c9afee8a207f109b227b8f8d1027d47966a45b8306a722b188f4a9c3ea8eeabac1edf0179ff632aa0b9d7da1c15af98c070828f3045e55cc70655e855f38b1b9658641705118b1bb827822ec39be7cdddda8f000ebda0cb7229eac79ac3d3b3e4e2436a8974c015f147e6437d39edd2add2ce0f8ed6922c76ee86f22e9df24ce289b54fd8b1ec7de2d085b93bcb66df30eb581ab849fe71a8f8248c9d133f3349fd070cb1bbbd5099738a465f3dbe1e666f2cf5bb815af6d57435ebca6a197aefa96b887ae1b336efd16d0f60d74adc801b12b900339949d17ffb484b99f815b76c597e941bc188d8c73dce8b4e09019630b84bb7c1eed71dd7ffcdf96338740fa0e38c3a5ce087d05320a572450bc60f9be1b956be7bfd82b0656b3666ef33e4e5f463ed5884c89737561e076a93166f0474d9d0e778abfe62320be5a3dbec9a15dae59e6b954ee2bfda7b7ac27f7f5b8ed612871bf46cc60813e09afccfa85973142b9df22331173fbcd7b961164dc2b60c473f264ebcffc0fd47d6a561f2c1861af2b22c536e48e9433c6247bf9b9710c8ec630eee68a2c2426c6f62d762a16f9ccf78a3cb19ee1ecaf4fb94fa2881227e0a10d32738aac374c98c2b616b215770d1b3520699aff0b94a6fb413987771a3a8f4640ba34aef1f580f7d4bcb046ce3d590d8ca809935019605e3c5c1cd697df70cfcfa993117b551cabd74a4501c30513377d0033790b7f19288ff6c6e1e3509d875c2e74a664de0dc5f9760ca5cf07b91fac089c0952b2a385193550a22dab1f07717b971b9350e7a3c3dab216044fdc63a1ffe3827464c57de949966122e93f750ede5d6c5cb232ef4bcb2d5257d288aeca2938374ba85345970ec8de5486c01960a81c1bbf99e16c6b0159a320ce364524b1ceda394dd99ec57db30b565feeb12d8a59e05b20d27fb6d6d72e99994ef9917ba17463c3bbaf8aac6362ca5d8a9b532d1297130877534466db5076f0216ffc99640f7fd133cd57889c18a0dc96eebd7d83666a49903e79dc263e1f01ef87b098bf7d62166cfe5da411c4108eee4ba4d4592d738d255aa0d239f3a19b336d08472eb35cb077a4791607da72ea6fa4444054278f97305c31501d6d3ec62572d26cbc9108fd29871617532893e4ebb36b70e043b81435320f34fd0604924b885dc9e3d91df478d99873f34f4b5c87f801df7af9076e3649c46054929549f5d3178f73eb94d99aa930e0bd39344da86425c17316219892f40de9fcc111a4e53ad3df04ff93b556f8df939dcecf0796f117242bd17207fa6c6d263119ccbcc61facbceb726935581c418a8ee3b2467f2cacdbdb86d1b6c5d3510dcdbb40fa578e40f8f868401cafb510af478bc03ba0b3d83bea60c3a2dfb058e94c45428d8ca400f99849cc4622d0c661ca0c5f05a888f798ffb2ce16ff587193e9dc85e21f58e0dc4e65b1c5ccf642ea02d464d7010f763903b224cb5b7f6b8b3f1724cf40187e1f148e6bdd0ca43b89f9b36f0c35b075b72fbdf8bcc676d9f70e66bc3f8fd69c90b7cc445e0ac72f0e521e40ab1e3300a17656fb284b0e7e020c4dd8c5cf4d77178056917c27b5fb33243c273700a4fda71e6ff2b548e5c0cfbb336a970b28fff2e710632c795a450921608fc42108bfeed10b79e853ae21be00f59d2e1c36f0e780d5b361b3a5b9a61b6acacecc6b32e5bc1334d97ee51de83d44cda70e4eec0d8553b840df612208c59e77517c556b63072c0504964cec4d884ab1d44135da69b826fa7d4e6bc933786e75d8b8194e5bc3a995737c1d3ca7933658caf9eb87a11a81fd94d6f53ce9cb8fba9194104c78a4291902cc185a6f540fba631d970c0f12eabc48c3c73f8a9e0171a3cdb18ca514bb590ba8794e3a7af35ca16a1998b3e7a339c469c70d42984e04a8a6a340f15160a279d939265e9b29effff76d519900e866358af705203ddf9925d507863992fe3699e7403798ca88ebefb3e7a2be8510b4e057fcf177f224eda69cf8c5b9b7294938b066199edd569c368a4ce7984b6a2c4843a3b46b4b60c0673cd65b17798445a0b1b218d0e769c4f630b9097571c3e520fcd300675fc5da73c7647f3dbc9afaa9e3ee55de84c74099cd2e75811fa922df7cb84c862bc09106fb4fee4d20e9b2a858ab3137c921b788d56ea85cb1944f0a15fc0fa5ef62d607d8ae9312bfcbc9256259532cc8a0de5572258182b2fce5c505a7d33f0ea124cc2b8cccd2a81f0ce98b275426c224ee5bc9668e139d4931930897bdb09221e702662e91a5790147ec682667553653952badf1a487546bc501319ed10b583f6d8b50c7894e9f09c1c7f1f3e3d74d39657b301880b985361692c327f0d2e41d74bbc9eecc68cf470b4555ec84d1b95891950e16d30fe8691edcbb485cdfdebefc0f0135982ffa290cb27454040634c4bc9667f25bcee0308edac2ba9fdf328244cc0e44a3a3a0f254d823c46018dd40223db0481043471250ed4de1e14f40a2185c7581cd4e4fe7d7b0dc0b34497e755d32c870c22c70065603e33e81a5b611db3eef2e07d28197ccfbf77a148f2099d5b1b60b72b5ca4c59328799640d0c5ce64be2d37555043eac57b922d1d8dec3f04cc6e7f2a251d4f6f803202df30662b6a907da6220cb4065a59751eca9344a8740b54b851e710762fcd4ed6e507833cc4c91368e014025b23a1488093e26587603b7cc483a02ce5ba7514eeb2bb873a9251343d8cc35342188eea69bbaadd4646fa137269ede0998ecdc19ff20b0a5d3c1d8b98406f4dbd03fbe606f60b6372c1353ce40ae6f1c87a26306d9f352fb287e8706aaf9852119080b26ee6ce168e3766c2acc076dd06dcd18c783d2007250b4c9cf6bb9a430ef014934acde48b64bfdbc7378ce81b3a9334519972d95bad65373f9eeda37f1e008a292e8a518cded91a04b082346093078880294843734f466a6db7b3a71dd4d0dec391679372a29f2b8f4ac3083fe7a97395f2112b73bb9c2506e37b8ec724dd53f69eb50341267dec89d31274260745911776ac1d93dc7efd198f55f9bec503762fff93b352bea1b00a3285bbd90c17bf3b48ded0576c3446d4c7eb3d3131990126100f041e07c33e9be5cbe3a064dd11f0548f03f0b84fbf856e5c0f9838d5e3262d7daa31ac70e5d63149cd7e97933498e70648466e166d4c3471831b046c0130e9cb21dbd799062f30880b9ce0df100b8e6b21f9109e342ec0164160eabd9f723d5713bad1a2ef793459627bb0b7c56a21ded0a6026b1118d41a5a8ad14863b704c9440ba3c5fdd9e580ee8f17ba665e2a130f79363749f829dcf6d9a13095e3e618e193e4585ca67fce1ee9a690d7b15ec0d7f6d040027373db908f2a3498d872d34fab8128f8d563074ba0630e5688935a50753a2c378bddd927609b9aef24efdf5e5025f9970b4a49e293af2137a20dcba94f08f419f126b763eb5d8c67886af3a3f3787fd1b50d9a2623f66ffd2f23e1a9ccde5f203ede6bb1becf4a1a89071b5bb3d65613054872c09aaf6e73ece29bffe5b7ed48ae454b656ebdf3d88f23f6fb5d6caac04d1882bdddc790611e6ed17a0cf7753f20bb2214772bd65cf97e7793bbc30705947fb9abcacb1f81754d6a967cb6faa9ef5b1f25a0df01df68dc6c532ef56cd596b38d937035772eb97a34c41fec71cfa394815984d652864fa90681ee51b81b098a11434d90f9bdfb48c21b65b9966f5564208cbc2968fdaa904767f8d854b60a20d80141595b10a088723ee153eecc28bd345aff03a1258b8e9557860150093c8a5cfd839a42ce204f8cd2fd829b854704ee97d862f7dc62dcb2d61937072f9870236d2db75f3e0b13d3ca2747a27b83485037fd543eb189f6e986b74aebd379477e090ba7fe23893e72a583f7179cc6c89c18978f286692bcfe6df0eba8c2487fbc801d9c9bc03ab7c0031d972c217a798c97f83e6deebadd4fd709ebc12586bae2a9c47829c1ea1c9bb578886b5cd0e0fdbad7538f05341fc9f23320464e4ea1c36d5ef0cf7cf1632b3f43cd612f9639e4e9e40b85d076431a1f34ed9b2cdc47aa3008a050af58c14a955bf5e42cff7e3e311244d1290b49bb6107871f672bca64c47f120b438b54ec23464dc2f8c327dbbb45434ba3b382650bb1d2ed02bdec188b0b7b8656b93db52c9eecb42ebfdd995335a6fd3bd0cd7c55c46b01f0f0a7740e93e8b9bc6bcde581d874a0c481bf00072c0a022c97d98b58c84886989980f45b4cbb0fc133d51a940fcb657539171957a4b373c96ab0b0145202828f3977bef7c8ff5434d56f152133c5e1d223983b7494758afacefed4544e388b7657706731ea2bbac0f816540ea5e52e5abddd5d3832068dd396bb7dceb9ebfe97d87f0e83e9a0994cde615eced1b1946d67eda628cd252ea0985a5a89843b68c5424e542fd232518b9209a0bba1710890535572272ebcdaa748145d9e4608e41dc39737b166c39862b37ad0126d0c09e24f43490c95a6b6108b486111643ecbc1d85c1d4513e6b64df501cf0c7258fe12bd5684686df9e20604647b8a210481df81c0c0bb794571617f6d9cbbf5bb40b6a795f46c194b0b6ec3e9bd890fb3767044461ce1eba5edcf25040a4dd0cd3bd6de43722ef2932fa4ffc942d2e1f27ac982918c3c9c60374830028c31b4f03febf0aa6a0b0f755c60c487feb6117b12c84b78c0c1e368ef1cef5d07e4151b96627a4595a81038fa7e6faaf552a294eb885a442f99b1cd010bba4d88983a1e97414117e6efc1c076ade9fdb7ed5857c8e16cd2893ce846914a5ef87140da4584f56ce6f9a794f948f37de0372c24f1284ba0d4f7cbff456e68a4ad281f7877d79b2b769ea37371dfc3fdd88b76e8a94f8951795aa7c659fdd393b90608a9fc20a006ab935791f73d51b6fc5023f959f6ffc19e01f589e88069c0a2a3f0d3f073fd776109b162fa042d92cdce04bb1e913ebf117f073b5ff0802c85321bd16ce6ef4e0a1d65dfaa41ef43a9988427b98ad536e7ef990f45d5f68e7e244dbe68de06cadfca721f40f351e22407a103c4d88232b314fd88f4cf74be8861edf8227e95695cb5958ff30de78921f67bb5ebb5a677bf5dcdbffddc31e11e1d24b3b5c1b57f5b9e1e28faf3d718c476dc10744711cb88a6f8f3529a0e4ab81190c82fc251bdd3a63a878d8eecfee3177db7a0e938b5b6d6afb7da1331a361f3b0f70e0f5f917d0ee90c5f53964d9d9b272af4cfacc123783867c53b688555eb268b20b5c84a966d9950d333ef8d619466b9a33dd66cc29c7eae736e3e635ae55fe0e721a4ead3a6f2049de47c267185fc720d46dacbfaf8d1ddb410152734add9e6dbdde993ed3a3692af6f978adcd2a7f1c11f1ef54442ad17a5027f76fdf2719cdf57882403cda5acfcc45247b9ddbb6fb3ebac6b8d689392d8ed211ab1f3b6316192bd3bc5374a317f43d1abfa22f9ab3629f6ed849ace5fbe76b826a647ad7b2b6d186058e681aa46f0c65fe77f8aa412ab85443298d8754e8a54b7b7b3e8a0bd15986bcb5352bfd3de2c046eff1952759a5373d43f19b3d8f2ba6d25462f5834a9b975375fe24d8596dafa0346e4c0890f66de522f4559a925ea5fc3dfe7b54ac6d97eabf1c20a41b893aa9ede58e80134e3fcd90b465d590b57ef19e2df169fe657915853505b405317e199b7f00dd9486b39f3d98a745d399fbc6abcfc90d36d2fa7bce9cbfdb1aac2b6c55f4d9ad7b958530293874cfb008de89b456cf598f0d73b20c9d1a7228a773366a94df83d1b2a5d9bbb8cadc44e47587bf73dedd6de42a0570ffd4583133ea161457f3cc009d266c44e671647f8b7e9b629b64f26893cb910b7278e817af547c87486481529cdbb7cc6efb79352919cf87d9d348798ee7664a576161fde49a651a8730b83a19c504f1d61177642a32f01a4da386f8476aa6f904df80d9af1cfa382fabc75eed61b72cb928dd4c2a0250da55b38dd4505dfdf2fc583852787c081f302d1794b3eb212b59635ce0bead5e4c1b20d88ddf6b969b0facced21dd09df4d14df4cedd08493c858e334b14d84bc7763209efbaa34dfb1f35a04412bd0c71f93a9ebbf12d9702c66e631cec35d4cf51699ffdd2742df0ad9e86dca6e0efc10078ff0b72a6ee6566529801e3a1f91c0fad0040d0347bd3dcae827b6140cbe11f7e7ad87a3c06f6c222aecac2fd6a07d88f5aae217fa259a72c4ca7f29d3411a98d6dbd92e203f3ebdc32d226945cecaed8ef59b9be19f6f42457e146c2f0c83923bc163e46ad2dbd3259fd7d0e434a60d85e6e6f53f3f2907f761a1d178d170ddd0cbf3a38d0d6cd5e780c193a0be57a5fa083d5c20023cab6aff94c7437e44f1e6405a2dddfba4479750e07a12536998c4019e512109ddc9ef505ecfa72dfa4ad4b13bda76a97dc4d02dc5dfddbe5de3dae8d49c0842b1f31b900ecad06b29b452d6d5eb176207f6e8907e97b6509cb4e3ae21cb03123fbbccd3247b94d9be9aa7d96e09be049265a3feb46b0af2a616d6c9c8fe7a828217dbf292dc8721e6ff00fffb9663058555a9ea14fa2bc5c3b2889ccc05f2e7cd8ce227667b91f3c45b2264feb0c9886e32f8dfe843a771ede012b69fd019803024083e2151d48dfb4763bc489b81fd1690d43e411de9fab1127ed89678fb2c3b7fd2e9b31f5ae86b5c40ca9128f07b2947b683f70b004d60ef782832bb71ac22761db267df9e68499e6572e0e8ae79f8b6eddfbe2a202a161e33edaa816242d6ac3f1ee0ab1bd05b59c5465648679b4738a308c86e085034c098d3ef7172f757c751c9fc72879f1fdc04095cca4fd39592789271603812fa2d5b57d14eb1a6fa0fa7308571a39fa3f05ec80acf819c873ad525df9a03d1f867d8f74a592d6e1ff5272157efbccd498b72dda4154d6de12eb1c325fe16754dce62610ae19edd8cb4dafdb38cfc65edbcb8b696c4f95072e4193eaa2226b834ae31ef4d0c0b1850b80a58e3844958c6ef4b38279791606515f55fe20f6bd803de2698f6d6feae19aae4d93f0c2a02d210059543afdf32a0370d6a71a6196eedf80c9808b955c30f88ccefd404e4ff6f1036a5be3d5bf171c6842c3b5929b20b0ec9859abfbfa69bfa284dd978079c4547dff3d3ef9ff8441f8ca1ced84627295fb8864f8201cc5866bd00f5a903d01c20f70a6e906f64c03ddb8daadc89cb159b3b3646bc451e5208c4ce2c2ab08aa19955eac7c11094b61aec410afcec7bb2ae20be88e24a50456aad87f8a42ffe399dd7e197210f2f97fb1ac358a2e753207abbf49a1ef5ccf4e0fd0fc0f3c94a7f7edca36bab75ed6e752cd4a72e5221f2a7f8c28f21f1dad862ebd4e7c0478ee1f7a087a709476121ee678fe3009a9f29d0ff7a067caf07c2fd0be41dde9b2e2c52353325b4db798bd914700f918d6c32c1278db0034e6175dce3f402993324537b2e03be6c59c56a926a0c343e0cc2c433dd6ed1232816555afd8d9626bde84220d94e02c9a5251a8c995eb904234cf7a7f8583c5a31012e8791d03ef388d3761c82fb0b7a58b900b4c562b4a71eb375145b3ca64a5bd3cf962c8b975615932a47e28c0e1e8cba2c39a56d976f35e8036afa5da2fce99e6258b1536c083c90e0c13e826708830f74106171e6993fdb6ba33f2c4236687d06f934fc3a327a367e95aa6f0f8e65e6cb5ecbc7d5b9490be1ccf6296ce1d737b475495bc46c6c5f8dd9b9cd9b1d7f50fd28c284036a983ef848954b3472a775d91fdac923451878fe91d3c12076f318e23c6ae495d259d3170409ef6b2253de305ac234c6e880ccfd204b481412e376455e78e0fe15ed0a900f64fe55b72901588efac596c82d2ca3c2aca517e500e1b23aa9cea8b3af12125845ad9a71718e8acd53f587b354c987030de590323b542732494f1eea11c4bf09bc59cfa49af15eab6696c70c90df66f7ec488c02f43d183fbb60d6c42369a51f07b65f52304ccf0b4d80a766ba8db3d53d24d1707179d4382de1bd727b038e2d54e583eb0568984a8193a19bc0a58af3ebddadbfacad2f812853ec0c063c3b8fafd96d16714b45bb7ec162ad182811e1f2a64fe826830a9d686cf7453e56923530060e62420a343f1d75dcd1dd0359a967bb8a4b50ca212b70f7ce93743ba014ccd7d99fba0dee6606a1fc2a21c100fd2db3fd275486a52a014a1f0cf74bd7a1fe32e1bcc9e2690cf3adb3fc9d9277a64fc38384fa00d9eee72eba8323a5b1ed8705eafee985973ecf60fe51202634b41cac26493e2bab462000a76785f38368b2e107da77eac5e46a5bb4699f7d4ded25005f48cb7e7bb9c9890a2d2d367e2b484c5fc65aa3b9c96badcc42e1fc2bda51526c7a710cf77115494b468a200d67a40cefcf8acb0e7d7a9a664e194b640c256b0c9bc8837fe2e96199e49aa002fec3da848ef00f49ac00b5d60f9e841be391ac1772ba36fa2810459c40eff8a4e30a4bbe563ca81af27820d8b1f706a55a3064820688a47033db08cd4f4dbb3618defae88e5795a3f3dd065ef7d63eae566f1b9ed7a0f70793d639de9214793d7846c53e1e7d771a7b00ac726d8ea47edad1ea00e496a02fefda58752593a7858a5c053f54790c3e8c9bc12127b0900eb18687ef03a1c988b8d4a17b4ef835219e75375897365d96b2cab52a3205ee9c8a2fab98cee803210c96ec0ba5eb75bdc7230e0eb9f839e050d5e1749684edec85c44387bdaa9c2c7781f0af89a76fae3d77e06540e80778f28970e001605074048098945f491c17b9f214a8759891e59086463cdc3520936bac043cd0f84e81efff1a7027b5674b8c561983f38a0475af65e3786b6eaa82661bc1f1db7f85350ca38eb2560cfa195f56aee6cf3e0b9806e81fb88f6e3dd5a62338e98271aa1cdab4dc32b567df90486091b47bba4043428ca314c795e2dce9507efae44c11f6a663fec4350fe55085adae0ad3c26f2519ffa102663984709d9a8b65606711fa012b47717afc664e6e51988ebbd98837e60c0a8adc7af4484527a6f44f8cd82db2352e705386003e2459b808a98500ae4beadbfc4a505192380e1004abc8019a9883a0eada09f7fcdb349b2cddad2560433d032d1675aebb20216831cffb29ea9021b4dcc40968b5df1281614f06d0c7fc28b50049a34d239b3e4430a4fa970000af8aac925734572409d87d15d633ce5ace38038cc6cb345bdad87816aa669f6b5c13b0c37da3fdd76c19ef09f5e4be4ac2e4aaa8bd028261de630a3076f8775ab1ff7a947cca659f7c6b84d08e050b8059db1850e3265e4f3f914f8bfdb14c1eda874dcdcc1d22532bb57d4fa3079db678f572a9dfbebca979f0e4dd36b3a5145d3ba5da082caa401a8636950fda65c6c35e5265e6c5e3e2b011a735c0240895eca28d81e0988e4948738c0f013d5ee5752392e6816def22350495b936c84b653febc7507684d93a3b80fbba53cbd283b9ccd1491dbc41b6d2b57f28d97a176fde8fb3069aeca915661d0a0652e8002c073112f93732d07401af4e05943dce3b079e7ca48a4c140088ed1933d059c7528f8af7385f001eb24cd0a1319d6ef740379156b83966ab73338e9ea5eeb05298864d4c0b1679fdfaca17e94b44b8f63d3d20999e3bb8a43e27c7fb17d62a08fdf440f5f748b0cb027f6d9918c0c626faa0638c15551b10f5bcda98f1ceec1bdc7fe66d07caa8f75ebbf310b7d6f6328e6987c0f11ebb5fa8fc9ccf16dceae90bee4cf735f1bd488d16fb0080c6ad786396e09f6411df2dba88ed890a9be9cb08aac6a9cc31fef31391b7a8b4289780193749664e40462160f70441fec5c6d89c54840c499e14acee9e09b39188c861d478492d0f0521bd0dd236ee8b5a40c90b4f9bbf4a372130ecda37a42c5b06aee2e7ace4408ef15f107027841ee4119836ea79a6fa7aee9115b93952ff43119a311bfa8cebd56b363e0626742e2cccb85e9ecf9a7f7f9ed6fdd9c01f7eeb0f94edc38b697702b7f86a4ca44b5a5117844a5db2e3c40ac7351eed9f38381e22277607f50d5b4ed68e0bf298cf29dceac9813a7e46d4cffa734556ff460eb67d58edf27e554c0a88925eb93a8a405f6cb08bd71c4ca242f86627614917a45e4f7d050d2bcd8564fd9fb21b51055126d2ebd7cbce30bbb3e94d56c07386e290d3fe11e6e355e981f1c7ac088f303b89ebe17ea62e7d3c89bc6f2e89b67c8d4ff429e41b80b4a6922e1f3fa022306afe3990747e1ac8d30b84e5b78eb58c2fd332c7bf3c715fe1fe16eac3d3fe7bf4ee6178be9c9d12afb7e2622315a4aecc6e758094ce0ccf30d317290cf43acc3439d7307d65ad942787925b687ab6a8e64e90c335412c5ef0aa212d0ef3987fda7e08be228d8460d1b2589eaa53b0569a3d811502b15b5421b0d75ccaf57e45ffcf8e302da623d84f5cf71a9f5580b12823abdba68420a5b901301200e03e15fb8af1e0a7c3dff1df0435b7f996da225571a6e6e28da00e6174c735f244219101514c88a6041168a0d552fb0112a608e5afe4a4d100b724ded811a9a886ff67f588ddd78bf38958322e9567ac18164d11139ff80e58341beff18e23faecef1d77c636ef2c4b53b4b135c0785cfbf8f90f606256dc9eabcac8f944aa868fc741e3377dee41ae12bc14cbef0307140e0f17a3ea5b1137c10f1b0876dfffdb0f32aff150dc9d39282d9c4d467e0ca14a1d8c3af99817408dc971eb0e3dd079cf4bf563ce1733f9923594ebcdc5eff9b209675429750f123f5a54b8c0dd2a7a7be9f12e9b92704b69927bf4fd71ec42ef48ad165cd9912d5eecc10be0303b9dc55d5eeb8279c96d938e49f5675dd6d8905683bf8f883503e8f575af5f3b85e1921d34525421b33208d878956e11bebc5a25de8e17d5f94621c8b7a20c7c7796ce658260c15911f85c73de4f6cf6da7e8cc89354c8d9a839bcf1936f5cf8a6654134e726d6876c2a621d4f8ed729042f2dc637184e811471f4ee09331c5fad1b3688c43904c4bdbbcc38079674d2fcecde9a6fd1aeb4e8ce2867315ac6281c03b4097e88ac3a12b9a5e127ea321ae94ed232ba90dbce7d26b0d7852b80716d2800e34a373d9306c9eca0bf3ecb1b7af44aa45a85803a182af2e321f09457bb55cbad0d375b0b17ec20f98b65eaf40bfcdbbe2b8031811b689d17d719390bf973f56a7d8ea77716c74248ee2abbb3db47581193b2c06651d4e121f4cd25a829056c4439afadfd1753f81c186066273938cd42dbb038ceb4f44dabfeb6b47d84c848c1a945f3932335703b87bda8ec135c5f85ab0b7bf571380835f12c34bef5bfad0c91de1bd57634bf4910f089862d9b724e8d25b5a5469336d25cfefb99429f186b4c184263bf1f48799c6a94e0e889babc475e7069760827e661dcb212ea3c011209308e5036f55f69ee799391c0694f362f3dcf8a3c5a7d99500788c013938119c7a1f445f0891c3f4dd474ce173432b78db066e7c2efc5d0d246bf530c312883eb99df7297e7ca28b4486ee08e5ef30b279208498704748d0e38e10687141f0d1f9081253c6cecf1fdfa0b2fdee1274cfe334275cde3a41011b34ba80acdc1a0d4b9a4090d5c2cfd2bd1eb97e324a20d644f08ae942883b2ec607fd0b3c99be57f33f107b3fad4bf708f9b7f47b74d87e4312652c29037586b4b8cf224d695257c767ca2d7b1d00ae36a0585d9e0a50ec7176866ab42bb41ad73522f2e39804f94d8194564eab123ccfb8a6a9899fa660a791989d8fced2f1fc0388cba6fe1370abb42d635bfd5930bfba52979be01f9e1606eeb088c77eece7657096410af87440b80ea823fc630a5f335fa677f5225159905688f0272c66e00a1bfcc553de04e5015fb4c4e63563ba3026bc056f36d100f551324b3879c32179e1fccb0e75471377775c19d0c9c2ea2235b9eb61de4192ea34a4e84ec94cb58c1b2df67584701deb55ab20169b8660fb0aea96750e492fda93462b787c686014867e2d11a08c04c85d4bd9cd5c2b1b50be0be398fa0b423a7aa1024f37194bf7e7f68c00a446fa749a48e5f0108294dfc6247ef94c8070803b89c2eb8c7da2838f6428a3fdf8da2b85c3e32aacdd98b7db4340ccb1978fde0de95ac2bacc7ee5ff32d82c12b69b0f3e07227c82551a6aa96bf19a48fed1ea461f4d44ff27c04f846c3b5a3e81beae7c980e695a1a52baecb4d70dee370a1eb287c8cefb8807b2caf523c95d97a4bcd42dc828e41bbc9273d0b3153bab91b2b195d82b4cbf7bc26d3c4929f7a2116d275c23a4db332d96918b8c4c196087f49feaba1f4bf7682b27a8b5290b66955a560730dff498f8ae17ac102c63645323e713f3da9b947329f50ffbf74f4df5b19f0fd18177e9bc7cb643fb12681ccfce90bb5d49be2b99532c7a4d3a0c891748b3ab9cfcdff41b6cdfffe53912b56468d27e2c9ce2fe08ed085b6c9bff11a90f5ebcfb1753e5ff0903f19761364422d4745f93399895579a9574642d0be5503c79e39ac525db8a43aa326b6812f8569188ce2887a36a8ede141f33488359d14eab7ae8fc7b5d3d5e036e8b77c17d0c616d2f573959b025bfe4c3a63281f259f1b68d66eefaa5b2e22bbef23c493a8f382faaabfc23c1ef4dcb3522b401f1f33d78233c9feb0c289a82b3c12652eb9a8cc55512d2546200fe3473a84ccfeb252bd8be2ce819e2d6d84c96bcd4c38fe1ecbe22ed72cf9233dc6e3790fa64ca36192b419af4284f38f8b84e26ae0bc7a3dac30bae2e46f83f108d8ebe480d3d5b9c2fb721ff8080f647aa1f2d66d8c5b5a6c2b4b6e2efcd67fe9031efdf4e3abe065296b3d3c0085bb637117be75dd607a59b90e37927a28f6f588c8390508abfc0dd651fb372b452f3205b760b04746162e24a63c0f923871ca84972840a26dad692f28c555d2cc7e2bd6757222532c564d2abbad134f9ad74b13f766a16a6d519f891f1327ca5c936b86a212cd8c486d8e021f323764f8f12ffb3a636d8f6b18dfd8afab6fb9e92f3e6366a330123cfeeebf8fe49a4cdeb61e240ff13a0f22606b8fbc4f0aa71c4e67f8c7f433da937eabebb81bb3b8bca4ca4c7db511bee48f7b2fd65eda386093b6e9773f31bbb5d72ef0381de285f44f170cc3da0b35731dbb5713f4704e30d5c2171f697afb1ae284b4ece5c7a87ef71cf8e1115ab6c177655e9a09a7c02574783dcc54eab5c3750b2605c19cb8e23adc7562c7a50dd8ec1e2d9af79996a63774dc405705da9d81306e425da68f4f8ee66a12e7f5222fe791d37ee00c6c95ffc314879148cbaa3e8e320c463bbfa5704ed648965f6995c3acc5f42e7ff53f2d453f3f69f192b3079f818795206b3b11df58ee3d73af915a49a5d2bc218b0821cfa0a37a97c1377a51f6fdccb01a5a38bd2299e7ef44b309ca463c102090daeb76f1655236fd138a76eb3d056491acff99078893a42aa0db3a50ed402411d46323e80c0b5e7390997038f1ef3579b373e4a215c8584be5ecb34c9ac435e65ccc71d2923f219438aff32180335efba48b4b9a11a09eefe1fa2c0cf0f644d6e5b5efa912f42661904a157b4d82a616171b188d0f95a6f29ae6a75ca9464683a7ee55ba28e10a755f68a0774def914bce2f9ac7078173cf2b239c219e0f65e71149499023ebcc44c0c3c60ae26e900c3300cc3300cc3300cc33074c4a0f97ffb0aaa0999929cdc43468ed091755d5e534a52269992e0ccc4979ece4c7c3a33f139ffffff91ddea0b7c0c8c0c076179e94b45445270f5aead0e7bde9a4324ccc65d868e314482d04ddbddd01739964224f758ba98bd62e972234492c5b0954b1b6db55225c8918048c4bf04393a12c904800b600c2249c78f2a9ff9f2553709f8b0f181800f0960e1050c4124476df34b42cadc7c1cc28319f061e3238b0f2db0f888442211c445a40cc40ee222b1002310c9d933764e13516f970b49cb9170ec87165744223c6ee8e8828b2e6000228b1ddb6365b977ac70b3aed0a4322dde9821f921010a7c7c48008b48a48c201221418e1b0bb891231221418e1b0964a900e30f49b536f29352f261730b49fbd0e28a8f08053e6c7c340087172115405c1c00d400861f92b47c3484a98ea7fed487c4d26ad19cd4759af990944598d97a68bf94827b48d43cf25cffc3c9b49e1e12fdaac23f3f95c5479793596c01b203461e924e88ee533206f129966e01030f497a2f6679cea8b8e778ee90149336d1d9fba1e3ba2b76482e7539c237bfa4e61e92c7bc805187247d516b29c65ac89047229148064c165b8080c0a043526511954dff7c45ffcc21d933cd3d07e149ef5a42d2ce0160c82131bec6db86be0fd965485ab1e45c01230e49b9dfacf23cd4dddb2f7a7b78a10347030c0260c021b1359338351f9f22436f48aabfea17cda3b7977543a26b0a72c388bbeaaa6d48aada1c83d4bdbf90230c362459baa7931522173dcb8103640d495a64deef79ce20ba1a1264e68eab5bdae3c26948eeca146f62a3a4bd684872f98c39f62b6fd73324ef27711daf6be163cc90182ee85ca63497c658860495348af6d6b30c3a32246b6652d2c365ceddc6906c5632643f5c6c4c25312408f5789f37ac66f33024a5f193bab94bd4074352f8ffdf5ce5bf687f2141c664a9ac3e95ccf65e4874cd1a7e83b6d454ea42e25ed89293e184facf85041f0db275664c4fb885e411a57b745ce7ff722d2496b69caad1475948f64af576116a2c24fdbe76eeb46f41db7d85045dbe95f543580e765b2131e5e4a26dd55263b8ab90f81ee61ac4aee96b9b0a895521e28212e9a6624f2141e4cfef2c97e50c5b0a495e4acc4c27d32caa8e427238db8caab9629590a190b82174c69db77958f8094959a2972a67c37c6a9d902c9ff9ae479caaabb609c9611e4586093121c1cd844ee9d799b95d4272386fd3f334632aa34a48ce6cb59552df87bf68121236bba66db9efa620242485d2b70c6e9d59c7232486d1cdd6d93c9fbed20849bb1994a8e7f591a92c4252e5187b3ceb8708c9fb394675a896ca9633842495829eb28b1d2124fde914eb4d3ae85f320809b3d12dc85e35d1d60021613d3da894e436c8d5fc20f947e5ba11a74d69d5f820b12e6ae80d16e376d2f42029bec88ed174429fc6f02071a4a57c9774c62463cc0e122daa2825ac4c3a48cc8bd62d9682b434e520e1e45874139b948a493848d2af34ddf4fcea166f909c7afb662a9dccddd006891b355b949329c5e0d720612f77bbeffabfb53448ce59ccc4e8b5cc20c94505d5a192bba74c914162899f8db5a71824fdb6a739b94e1e8241f2a9cc9c936c66aaf40b92cf7f4b9d34eb4dbb20c1536bfe4d328c16246fec73919e1a359d30589020f62abc8f1891f5dd2a12e37f4c27478b9865a78a6411fdfe759e56749e8aa4ec182ecca7d2a7332a9277376c57a74e95d74e91e81ebe2ee77535ad99291274dd69287929ee95aa1449a74f28194f64a8ca9222592ddf59e8b5ec54b25124073df55d59af427644911c847f586b2514c93997caf795773c0914c9315784febbbbcbe3f81b20e847b086de73200302a296c516200bb0e21389a9c33cad099952c61b7c010484159e48f6af5c42a7953a91989741a7b2e4a2f33b2712e5f754da58de269234ae99a69841ee6f0a0708ca911fc0c1c5170a38a782b04213c9651927ac742c13c9e97b2a54a89c4c4dbfa30788d9ebf8420b341e00088415984814297f6b5953fda9a04b246f9d8cf6b96d46b36889049d4a87160b2d246d0421d073082b2a91a4b5e683584ed1635e4a24e5afc6defe7ecf519944629996521ee6d5ff11840024f1df0041bbc003cc05200f564822293db626993bc6fc4e8a4452be117a93fa1883e710249282101bcc36d4cdeb472479c79ae76b7665b71d91246ff93a69ad0b3e6e2392b2bcfac49f8c419e8c48ec30da32ece2c53db9880421734a2fe61bf25adb1b8c63470434ed004014562822f9448474932aba54502292d4d7e575fe1caf5a4424a58f9f29a78d29ad7842d24072b876c08a4324e6cdf2a343e88a9e6388242b338be9d229a1635c88c43b99b19da5a774ac42d2fe03fe1fd8f15d98cb61052112b4ace6c78659101e3488041d634a5aa184acfd2c8804cf0f1f4447bb701986a49d644520123fc35bea6ced523b024492d04aaa6379fc87e498f1a1fa3c5ec6510949bbc1df830748086e78d1c63eb4b8420b2c3ef6adf04362c5a8ac393d6f2a4e7d480a0fbd2c51bd29899c0f494a9452225d6f84ca7c0f499553cb5d53ebce8ef49018cb64d5c4f56427390f09c26d3c8ae5b1a0f38a87e4ccca1e192bc8ad94de21315f662625eab143e207e1c13f954a76725387c4d0d3dc1525f767a143c268395963c252c5abcc2131a7d9f9d2dba5d3c942d23e8003c4fe039ef06361e3e3021f363e1ef061e3a38717108844767c08767017e929f09e238b48241289945d009060851c92347bbc7842655c37c521c994878aa8656a2ac121e1732dc3e352eafddf90e449dc754c64b57a3724d606193ffd9ed08fb72171647d792599c46294d89014d6154ac6590b954e6b480ca2bf59eb3e5ebd490dc9174f2f3dba892837a521417a6c6aa9fb28a32634247f564fb10d17849de90c499d475787c6d11c663243c28bfb97ead69b90496548502564485319eb3698c8909c4f552dc831ada692c690581de2229aa1b27b490cc91a36bc7fc758a972290c09fac44fca49df3b2d8121b192deca78326e28ff0b4967dd1d2b8df04abe179254d0a42d8fce73b1ef42b2a512a1bc3c2e899c0b09a7cd74b79c8a6ee8b79024df3c56fed8eb68bf16124505bf3f6d1bd5f5672139a45f8aa9b01a133f16923e297da5f19d9398ff0ac939368a6d0cbf75f7ad90f419736177d9c9b35f85249d3dc71362939fd0792a2458cef4ff73298feafc14123d2e9d4cb12cf96c5e0a4996151fb3a92d8ef0a390fc21c34566de67d21e0a09aaf36ce7c7dec8ea9f903c9b496bdefec94a724272cca72083de3bf352131253253b4d0d13d79f0949f739a8ace761a4f94b480edeb9829a3ba9bb2b2159764f29fd36d1b52721299d650d563a4b9c8e84e48fa6f2d6cdc354fc0889a36288ca237473b48d90201afd3efb62e9921621e1eb53547bada94f9d0889957544ca660809d6ebb9ef62cace092139a797d166397f6a198484f7ce9d25bcec72070849af1e6331d67cd29b1f24f57abcd471991af641d2cec86dd1fa2617f62059bb65fb335d675778909c5e3bf67b58a8f576909837738d7af5105d078931cedf8e3ef5fae62039c72e26d933f94f390e923aa7e0ed7baa7b946e9034a242c9147e64850d924ee36becafb0d942c88a1a24fae6ed4a0d16df6d64050d124c8a69a79c97a66164c50c12456c380bfd8c5d17592183c456150d2ae7b31c2ab2220609e7a57dd3d4659a0fb20206899f82761f95730a4283ac7841524a32cfec59a62c1a64850b1284f6b724aa458aa5202b5a90f862bf3ba2c4c7c790152c48d2b93655f896af584800abd8539e53fd0aa922b18434e9295a44ac291589416bac0deff2573f2a92b4f79eaed1eb1dfb291253fbf53573532475c7b9eb5a121eef522477abbaa82d1d744e9322e1d3dae2977e2d937b14492e22daaf671bb46d5124a9d5a7d0b90e45e2e9b0bb939fd5a4daa04812729643965042d9d99f48d29bb152bf527930db1389419af8f9674e297aba138971af9f266447119ee644d28758da7ce7f17cd39b484a29eda75c715398d89a484aa74389cfd3cb6be94c2485b3fce8154aff7b8d89e4f5fa710dbbb494f52592e2df2e74cef2ad6a4b24dca8b1509b32fbe92b91acdd49684f7147ba881249667b722ea9791249e253b2bde441c3bc2c89a471dbce20e66299cb9148d2aa55fe29fdbcad0c89c454626389acabb4243f22f17494eeca525a4f871d91a0bdf9392baec9fd702312d544fc3f656cda0f332259335ca94e21534e0f2f22b92aa875f5ee06b9614524ac59fb75a9a6998613913473428d27d3385a64442476544da6e25a8e06b903e6973fb4c0e2e3a020230e496aebf1956a429bb864c021e9d462b45119bd224a6f489ccbddd9563659ea7024f204196e48ca271f1e3bf5065db90d4979376e3655e9745d2c39d30ac86043b295bc921fa1b2785d64ac21b95f64f251756e966342d24aa4011f366e0a32d4905ca1622ac275b7e6bac16307028e211c5ff04003c84843c2a5b84e0b4a4d6b500a490309e1e1858eb2bd42061a12b46438af0b99d3ef7c86a47e2bad1e5aa7d469a320c30c09e2fd2976082dfb6ecb90d8517436fbbc66397b6448d84e19214f0651f56a9d20630c096e17639596e7b9cd90b4341b1f957c48008b8f2cb60039810c312468dbb09ef42915a39632c290a05ad40661a64bec8238824864419020030c5f4898cf6b9d2f256155b18323b802c8f042829acc35ffcb2cb153489a0e414617d299477db23124ed4e0632b8b0fecbcccdf5ea02195b482cfdc9b4634a57aec19034906f820c2d948c2c94b2f5abe8b45752fed42cb60001400e646021312c63e7ee988485e884a495c49320e30a6b8e1b64778a69f385a4fd0e1d2039dc58dd0a645821f14c45533243fd05654722914824725676699051853d77ca5ab13aaaa5ee8ac14e5467d827adac391b1f36f4f8400615926dc745b55f8a135b4f21c9f268f9ab2ccbe9974252af78086da23a834a461492f3e9f4f9423dc8cb18a4c77fa0c75f1189ec0e644021d1a27c75f6d8d02fda2724c94a5add6d4d7735c60949992ad6a9b4fead7c13122cb5a99171cd91291392475f3e2194c5969074b3264f4366b4af78a184c4f2115a47a9d5dab64948f8dee0b1cb93ea6e90909c35749df55950a2324748109e529fb9dd9cf4abcc40861112630a96299d8cbb97531112d6dcdfb26555ac58224292989c98daec595ffb1012f37beed2a24db33c4808c9e71e573c75f0f5980e42a28a2995cf74b659110321d172446d998a7f902093e638f517c592cefa2059364707ffb3b87b393d486c3ffd9744e44d8a4880f63abed06207060c063278907c7a749215eb1099e91d248ecd5ec5128d7d2624430749e549ee997fcaa70d472291c8ee909183049577a7d72d28517fc241c2f7789f18dd603e9f1b248f0e9e4b68bbd820d9a478bd5f8c18ab5c0d12b6b26c978ca3ad7e1e2091c8bbc92cb60021810c1a2485c71a7d9d2a7b076d165b807840c60c12748efe33a7e232481895f6efc35d4b331b83e48e959577ef62e729810c182428b1cf95f77e224e7f41920ed7d571597537d31d90e182c4b46fb37cea4407437a7041026b192d48ea8ba3945063e19b4e32589098e2ee8c86c78bcbd12a12536f5e5b3d61579b7d05b430554582b8ca5815d6c2adc3a94812d2c3299d5355396ba8484e2944cfed75dcee4f919441a7cfa8be0f533aa648b61f9556bce276435b8a84df2d0f9afd4bc7a563902231ed6ad0aa72f7b1330488e02bb01a63148962a3d492967b98fc185124d6c90e9522963eef1d928627462812743c26d54b9b0b1950248dfcb74bd32986d014e40338627ca214254e43e5361187a41d4f74820431389198f459523a99eb6efb9b48506d153a6ef6b64db22692dd3f7f529edc4c24c5f6c75341638b102a26923bce7c8a33ddd9ba5c22c92dba558eb92bb9e92c91b0c1c3c47fbab2cb2c24ed8b1d3dcc74c7f7e002635422592c3eb57a558a6717f522062592b6b2b54ce78ff3f2e8f13c78200073120715d76bf552caa737043124c1d6e7f5a0524c35670deee8a12346248c69ef635d26b9c1c41e03129a250fde9eaa317d623c22c1bb4a084fca2e67d82c80021f6780188e48dc191d3b2fc598d37b2169e3e38a372012897c688185d90f6234629dd19bb289d97c311b831109a3dc66bdbf37b8e6622c22413fe9acc93c6c87ff2611431189f6322aefcdd68e25212462242231e5f9aebc5c47cb551131109198efde82fa7499bb8f0122c62112334468919df4bf5529242d3fb4b8e2e36f78037044202f8b2d40024086188648b2978b1f65d6e13b7f861885483679e2834cf94975a643d22a1089ec781e63884188a42463e944530e3a056119880d225174ffdc47fba4188248b08a8f29e8c5921733c73a10231089a552acb867a9410c40682f1e33c58bbf43d248c03b1e99187f48d00e55ae56e9346d3e24adec438b2bcec920861f9246b606cdf1ff3db512f0a105161fdc831570b810a30f8949698977795ed1a9a285187c48b24ec1f28e9e52bd5524620662e5b2d80204005788b187e420f2378ee769e91163e82139df7d2a61c1c59387b13422461e92621ccd66629f73e5080f09a253651b317ea6c3e80ec9e9314c94e98eebbbed90943f27edaef650cd751d923786ef52df613a24bcbc8f860afe9a7bce81b5d8e017345c057d2412899c81989a952cb60001802762c821a9e3eb43e7521c924b45644fedc614730687c494d35cfc5097aa93de90202a98568fd1c22f7ae8e822c111810f1b1f8e838b077cb1e3bd98c0878d8f0f1b1f23884478bc8e2f7a0c22861b123b5d760d4aa9515bd23624e85c931f57c9b2a6d4b221395f68964ae93fdac715440831d6901494de18cf31c520cb53a210430d09a7beab9e9ad7648d4240de045cf0484352eeaa323d661be2b45088818624db9c2ce7cedbdff93f43c296c8dc369fd333e966487ccdff4c1f6fe3622e030140136294214925691efcd294494178f4c0c167ec6c2006191294bfc9abd4b3a04b1d92b638628c2125539e16195378e3064722da238618123e495f3df91d192b179276628421e94aa71837c858db9e1c7923061892530e1bba69a74f5c3e24f13eb4b8c218cb620b1015c4f842d2ab75ca56665ebae237760831bc90d451f3530cbbd183287521498de8b1d5a0662efc5c48d4aff82ed9d51d8d6f214198577e8a95f9378bb49028aa424d74bcbbf9370b09f24fd46e9daa4aba6221e943897938bf5c9acb2b2475eb67b88d39c8868d159244878b23b4e4c449b10a492a67d7df6f490bb15021297d7c3abb14f3c8cd4d21314673306d2f3fb53b861492c6b6e32e962c0a49ea2986b3f1cc2017141236a9eb78daa257cd7fc21d35c9ded67cd4dbba88e184e4334fd2abba4aba5b423212e11189a09a1d3d747020461312cc37cbc6790f711b9990f8a9a40875299408bf428010630989ebd7aa96db0d2e42803e88a18424a163904968dcb01ed3e791848453167a39b65e558f8404a1b264af259583cce908495aae4bbb36e5cfa61192d3becd7da877b6d417213905956a614622689a74eb88a587282506620c21396f30b124eee4e82a8590347aad627f3008c99965f3d7f8a526ed0021c167cc3fc7d99357152f74fc20d1bf3533bf443e48eacb0d1da24ad55fb4074932dde4c6645d7af81f283d88c183a4b2bff29316eb3abf8384d323d7522ead3e99749068997450eaf2bea1fb1c246936b72842f9ad577090204a7f122136ad8daa6f90e8d7a6dfa6f267ceac0d92635a2e554d31b3b73548527a964ebf7a72bb940649624288f08a4957e7cf0c9247e869b4b49ddd622383641122f45c4c423b9db5a3475d1189442266478e1ebc45881183e494d48679ddc8c9a08741920c953e9310b9717e7f4192cdaa5ba5f8599b6717247f8eb18ffe7b29a9589d250362b420a9c3829219f31fa7372169761688c182e4a03193a76a7c6dda0bb50f2dae8844de23912eca66b10508006c00631549caf406958325594d5e48dad95d5145520c1b136dd1d62b038c5424c6baa096ffd6f531848ae42cd61a4c9dc8b849c7e37b7cd1cbc32c8b2d4022304e9160e9a468146162bd02b9718341f63eb4b8e283c78d1b088844788420478e10094422918899e2507b27638c9961643dc02845e2afe88e1e43683395d58901062912947bd2125a39073ba50f1b1f5a60f111310331a30518a348f64afa2ec69ed2edab2892e2e952af3d719be2ef0618a148165bbd64eaeea3390b49cbd10324123103b13a33c000457292dd167eb9825d7643d244f03c3e91f4b2a2f2c59cf2d48743d2747017208ee33381e18924ed9564f0b1533a2f0b49c391e3460e04d289fc2e7d4cacce02290117e90c274c9a84ffc7cea1623abee80112827f1d190263138951532839b9b178537f81834f04606822c174cea961e365de4d960bc0c8447248cb0edef29bb26993050c4c24acc6d6da4df227375f22b1e7ffb4969629952d1fc091e3864e0086259252cc245b6fff3b6a2724ad12c916e2bde1d13fd6867716804189c4a029cc59759cdd749a44d29c0c39dd34eac208e14908011892482eb9d9f2bcb44c99b40b2ed07b24922a4fa7eca931c39e1e9296723cc88e1c90f8f23d9aea60a990b4127cc102c62392c67256d9cf3199e388c22e6393a6ff2169660ab073008c4624e7fa8b72954773dc2824ad24e6fd0c0c4624659dbda815df3c9a5cf0e0620466c7f3d8c11220008c45248cecd20f597379d55544b266d0cb9694ccd39e4d44a25765255fba0c640c34b490389b9ea4acc9decd310b895e9f736e6ab30834b090705aa4964cf1275e63481a0fcd038d2b24db6e6727b5ec20220b493bf6a1c5153dfe8ab3c2a1ca4be9fd945b77b3071a55d8949e93e1f36b44e5692fa0418584f17c7d7ee132a5cad9f828097cd8f8a8087cd8f8a82c3e6c7c14043e6c7c14161f363eea011f12c0e283c614126c64760ca62f888c14122b79f89439979b6e2b23684421417fb018751b4a897a43d272470f1d5cd0804272ace66c257e17c4a54f484ab14eb3599af56817485a82861312e7a2e7e5703a98855e12349a907432e6946515db92a9e431582e12349890286a94ecbe0c253534a3b184e4de28a6bbccb2059f43d20a0d25246e093d5db2d5f3b7a311349290f06759630ca3a3c83c4242d25bba0a212f692ef1ef11681c2149f4c4d6d85d52abee1a818611925c64ee2cafa13399b80889a2e49b66a98e69849d55a04184642d753961fad356cf212475df8bbeffb8eed7508186109284fb966ecf3d08c9222dc77e110d1012b7dac36c7f4ce79a3a3f48eeb7f1ee9a51963c46c3078915f4e9ec1662214e1e5e380848177a4da307491a3afe77b6fb8efe19101a3c48928b31731e4bd963ee17a0b18384d3d9da2f97455f2aad1168e8202944edcbc9281089fc8dbe001081460e9233697adc98d945ade6c3868d0f6fc0878d8f48a49081060e12b793bccccf9d9e5396bb038d1b24478f93f55435259440ce7044c00211d0020b36d0b0813d7739e9fe8fada690b47210f8b081810f2db0f828e56c0d68d420f12ea664a926d34c551a2429d369fb84d87e40630609f22be328e5393d78ce073464909439658cafbc52a9550c92a3583aa1162e0a7cd8f8a8097c48008b8fbca1a30b2e763c0e1c5c1c25d08041c2e595cfb135b22a684da0f182e4ab7a75ddfb58614e172459505d4ab7eb767b121368b42051357a0c672a8dd506d16041b2e99a6fcf9a625a6815c95ba1944a327809575b1549272eef661c99f308995424e7e79b699d6c0bb584a4e50466a0224929754a7de35e34972430e314095a721bbf512c37f7a648b07c1bd3d539938afd952229cff6655fd59f976a1e308314497fea77ac72ce1002c9e13b8aa4e06a156436796d5d525124ac7b7fe84e8dd1608e1c3a407278862231650f36e2c3858b3a1bcc004592ce7f174deb668adb84a4290d667c22b9e4dabd06d96226a39034901c7e6430c3134955967539429fa628091ec7efe844520e0b1754eadd92bd85a47d6162308313496a32dedc5b4adbd82612f62ad9a59cf3e81b2487230c666822d14a93fa89d8ac56f290342f3291f8e1df9256d3d13326923c9f0a9b96e3bae71289f33aa67ea753fe7521692039fc5c30c312092a99184fa9520e3a3d9548bc50b3e17e955a5c0e49d30192c3ad05332891a4b6ac5296e9e59b3624ed6f341b0b664c22e16aa388c9399d636ccd304312096ef963e62df19d5f8c44221110d3199148ce675f42861191a23121696f8224c10c48248a5a8836f7d98c5686a49d11cc784452cc5a28f15bd5a9bf90b42a2798e188c4127a47e6ad8b4e1a0b49fb1bcc03c4404280b8e851b6e3439063c717331a91a473925d4d7953379d1149dd2273286171943ad12212b6ae343c28bb905e86a4993d6a80b1198a48cea235a6101d6ce7737ae0e0a28b4424567a865aec68b983638717bd17988188240b4bfee14d7d0ce286a4150f661c22e1cd825e8e3fb5a242e0cc3084193ef6b3e870d6c9425c1ae42b2c736bda94a285198448f678fa84b668f2da4637ba47032291482412b9620108c28c41a06e2fa58a921ae40f49f363382c509629982188e49c6df47d55da0fba0f4973636b811981483e37d37fd9964999199236821b39be40aa0510892194ee24426d2b7a5fece8a15fecd0c28a1466fc21d992e6a4b34187db759230c30fc9de371e97a63e2467d56b562aedfd69c487a4fce9b9fcff524de6ac1166ec21b984c99d13a69485e9f490982fb86dc6aa320fc9d1cb6eb35f140f49f76516933a2ff996df213969c9eb1237ca72ba94812c61861d92ce532c7ca63e211e05cca84382d09a9e848b1eab14ccc00c3a3442a886ea1263ff86a49d197348ca3146b6da9a4add3a0233e49018ae3246bfc3452e1b92a61f981187c49b51a9d2834e42680e480e3f26980187c4f2ca74357af45cf043d278600966bca1dc9060a3b51eaf3742e6e2468f1c38ee4630a30d49a2222e68d2bf502a6576f4d0d181196c48d00d72a5b4e51c3dbf630d89a636b7fea67c3766a82169332813d5f3def47c481a17652098918644d39d5410b539c59423c20c34249c8914117a154ea45198718604a5949f909b66d7926e86e450fdf1a37cb2f338cb90982bebbd97c7e89f62a5cc2043c2967f72f7f92474e72169261261c28c31247807ab7c42b73a72ec504024a223c70e6fc0073e8b48a40b2e22911962481a556e32ab2a7ede38e4438b2bfc06175ed88c3024a56813611ba488b6e8d9058e036680814ff71973fbb4f885a47d2131b45a37fd64cce6a09d20667821d9de34468fbd9829cc0cf8b0f171c5878d8f057cd8f8483e6c7c28e0c3866a1712df55b37d2ee175f1c485e40c63dfa3c22c4fe52d24074f97325632c718a50a66682195533e939eee2c24872719e3422c735bc54272cea083da50a269b7bc42d288673eb597be82d2592141254f3199ce28329f6c46152c6dcbcac12aa714538a29337abb5db80abb9bdd871657981dcca042e275d8b8fe297ad2610a49d30f2dae78cf61a3c757608b0733a6907023cde4854ababa5433a490a0424e35a6be13261714cc884282caf699f1a2af74b341980185c4dc0e6db1b17be38d16c44ece7842b2e612535a1ff27e2f663821d13bac64ba794dd567485a08c2c13b1a0407171ff83efbd0e28a1e3972ece8827f478f0a3c173bb488442299c516202298d18404fd14d53ef8dac50c26247a5e66f7d0bfcc29c7c58c25247710d272c47f97927266b105089aa184a48b8d717ab3b369f9242468bdbcaf9637c9c51a0949d94b7e974cfff1527c84c4bc0a1115ec354282289967eac13795a908091f1efe59de7acf2742c207a5d288fcf3b9740889db5f32db161442921abd993cc53008c9d984b2acefcc2c2a0442b29ad4bad8a23bf45e7e90947d74ce6ce7830411f61b36ae5d4dd983a468af266ee37fd618e341621a9d95ffa41d245d0757b3b00e12f36ac7da17d5d9aa34302307092ebb9d9be637741a0749aa42abbe798ebf79832475a35ab529c472f536488ccd25a754cca43a5a8324cbd96629e5d329e89c0649f23c9857b438911dcd20c1d2a767c5b93291b30c92dacef2c566f37ca118248ada1cfebeb3754e2e0c92d2cdb68592ea8c1724ff5d0e4aea65190fca192e48b0be98e4e34f7b8e39335a9024449f9299cbbcff9a192c48929e4dcfaee550e16356919851835ab098d12d8eaa482c0fb23394be97853115c9a54c73ab2ee7e0a2828ae44e753bcb683945f2eda6ef4ebd1a231653247ad850ba44673be54a2992c4fe85feaae829f72345528a51bc2ca98bf182378a24bddedc175d1489aeae5d9a39e6dcb68522290919458d322b191b1449a133a90b1b663f69ea13892e4a6492a9844c0d9d271233c98a5529c46d0c071720df83cd3ae18e8c5bbbbf6d23f300199c484c6225f32bfe4d24fc893f8ddfd5ca18d544926a6829b9f031648c3391b4de1aef73867e3e0f2612b3f87525e9e125123c8c341d4b755f9880b130698924fd9a2afae6dc257141ea3eb4b822f163614a0f199548dabb78a1740ec2372d831249325cfd7ab4289d278724c88e1e3acafec89884513b6ae524aeaeea0265e0ce17322491249355eba5cc610664442231b9464d33ea9a269442229148a4b4900189c4baad6fbf8b3d22d9b5938bfbbfa698b32312bbf38d1c6fddcc1c6b44f29dc69eb55bcaaa970c46249575adddc808f73c1791d44977c43fba7790110d3214919cdbaa3e45116b639f0f2db0f88844400c2f11096a46d59a9bdc30eb87a4b13f20758848cca2d4c7ced70de1fd19641c2241460979d1b796b4980c91fc22facc76f363aa6cae1009af2983c5c8fc241a2112bcfd457e7aa5eeb866f161e3069194feaf2bc7286b59418620922e43fe76f4fbc2d74024f66c12b929850191d4374249b1ddb4c1ae48e48c20123923b8fd4352b81513d9799f5310fd9058fae64c8a8f506d497d484ae253e8cf4c69367632f890ecd1aceb3d7decda7e0f8643861e923cb7df8285f2542ac6a3040c810f1b5ffc03743004b2d0c15de0301979483669aae7c3b7621e914824823c7070c15f788e04a408f0684024d2052a810c3c2466cd2932edad9bb22c023bbe871711f8d0028b0f2c1490228064907187e4fa77ebdcf39ea4694d1764d82179bff336af4ce73ca3312dc8a843e227b3f27e95d3ef7ee1820c3a24c5e4f7415fcddb624c1664cc213176ff2b898ed5fe17392499b4f95471330670180017fecb5aa954ea86016c21194c56308da9db42e55a70e35b43c6187e1747223abee861d830802c245594ad9cf1792c24970c2663da89e7ebfc0a49514673bf7b66be85ac90709a7f76b2765afea942825bc88fc98390ddd95321e134d8989c174d21b14bb3697a897ebda414924d88aad51f1b39134621b1e3668f8aa9ce190ac9b9726955b8acdefe13124c8cba53db4d7dba1312e54c7c3d868a418fd784c44e7284d2cb1bf59b094952d4fcd5aca84a295b42528c8b8f97f22b21795b523ca82b19932167470f1d2618401212538db2f1ca9befb208098929ff097d1d439bab7b84e4719bb93fb9243c3542b269cd9d64ee8d29a61621795c4e567f5eb6ae9308097e9727674b865bbd0c21d18412b1fde661ac3a21a4d2ceef6d3b6cad20247d30193b664148130261004048562b21635e0f9d9bcd01fc20f1bd3d7dcee3bba8a70703f04172a6e6f75d3839ed2f9930801e24be7a4ada1ae36691a990b4828401f020d94bcda57f9eea5cff0e0e0d257536eb89c83330001d249a3a1d742fc8dbdbe8e02eca007250b08cafa61f2a963ae1201db467f9a47446e9fc0dd813793a98fadab80deadf34631a5ed942a8067b30153fdc69afdc300d0e739d3aba8232f9f10c8a1f453bc9780d23b4039041418bf9f8dd55d93b8018a433851f958581495beeea144f78d2ed0b0c66a56329753a6c5517186ede42866d533a2d48b8a8111fc4cac33a0016f8f1f7d28cd00bb999551c36585c853cfd5115e69a13fafea5c25c2a79a891a1a228a7d2a8fc3cbdb93a056b2a67130f0b993445828a31d7bcaf45c5684bd1767c85eb3fab8c14099b5bcba2b58c9e7fa370e6eb3eb62c840cd71045b2dcdf6ccef1b576ad1ddf830bb3bfd12b861aa148f4cd5dd61fee2c37098ac4acd92d2732e6ef793e91242ef365ce92a1349e48b6107ab3d426b1fd7d27923dcb59a9a034e61c744e24d7754a498c369942bd89c43442e8d724b65392a92692cedbdab4726bff66870a353291207ef76222a763ce87807b5c710ff8b0f1612b851a9840869b9da97cd4d225924525f978ed32b7fd5b02954f5e866bcb551c5522c92e3b3fe78c7ad4a004236e3bca6b335fca933865b95b57cab0efa2243ef1b349c5d8a1ae48a05b5314a1c3a75421519041e9cebeabe5a87a3ab88bb21cd4784452f08a5db1f98bb95c1d0c81bfd15ee450c0b182450d4724e7d49df2595cd228eec80162b7811a8d484e95b3b8a9f775ac54a00623f8fc0df1a431af6e42d2bef81080e860bb321ddc4529418d4530fab2d3c466cc40729cba1a8a48ce6059c572c9ead9bc711ccc800884f4e002039148952cd448445210e6a2b973ceb6dd35109130da32a551669e2975882fbbfa8aec3c327a84234716050c350c91b01ef3945026739a172db0f888448c50a310c9765254d8d0d469e552b0062112337d8c9752a325a11e3972ec1844a2478b16d325d1f84ac261763504919c59abbed762928f7319c142a146201284afd6767cbb54fabe2fd40044e2e7c80eba5f22734b5da8f1871a7e485041940aa77b653af49034335d408d3e24e83d5777fd9e0f49d22d3729d5b3d032f790d89db4f5938ea2126ae821b152bde6d17ba533e47948aaa4a62e7b41a8cfa80ea1061e12af46b35b903ad2e3e50e4917be2e34bed4886d764810b5b6fed5ef0e6ad421418356984b5d73214e74488e39c6bab4179499eb7348b40f179ede6c3f942a87a44d42838e5015ae1d8c43929ae94c5f55beaa3138a8018744379d6ff684eea04c266b50e30d0916cab4685c891ddf0dc99934c510bb516c64ad831a6d48ee1f351f3bb3fda5320a35d8909c74defdac9b2bbba5ac2131e5e866e8dc1999a61a9253e8dda421e1b3eb4a776dfe90d190a0ddbd95c1c488967e8604f9a1a2698b69ffe1364392ccad2ed3ea79c173ca9094fbaa3776eecaaa890c49619a6468a98fd39a1d4392d26159f53b848e2bc5909c254ce797ab4fe66718925774d0b1650386c41759ba2a9d1a13b3f9429236f1fa58ea72b4d2bc906073a5c305994b23b52e2408a1c39fac8f594468b890b827bb41a9cd1612fed2849a90d79e64d442828e77ea84fa11a15dc942b298284b11f116fe332c24655d9296332c4da5dc151264e54c3a088fc9574d2b24a5911e9f528b67279d2a2448739359d5727869900a095a66e6559be55e54a690b86fe15ca46e76084f0ac931549ba95259a14d1a85a475abd8b55da190f06e632a9bc7176db127247b5fc69648cdc154e38404f5e172b9fe0611a969c29ff1b64125128944eeece8a1a3a4a0061312845d99071935335bbb418d25248e90d164f8f12c4a4a484c6e4a4bbc4871bf38098917ef496b89aca6b320212993c71bfda6cbe4a747481acb7556ea9f726c23249ebde510a73bfbcf5b84649169f496a8933a1f2442721293a2e4f209cd5d1942e2ce8a68f470d9dd8d109254b5c9504275caa5ae2024c954ded6a3ee7e39034252de303556d23e8bcafd2029e6c609cfb9a563c93e48dc14b4a974f9dcf6f33d4850eee25ea65b6749850749e365e2ab37b383e4b31b8d166e1656733a48badc64d237c8ec24333948107e5ba542c53848dacdbef9983b374812b3b931e3558c5d521b24dfe5b9dc1c27d4a841b29be9756bbb29b59a060926f3930e9d9387fe76060963f964ae538baeeb9141b2988cf58d956947b431483061214b6c954a1e736ac020b13df6bb05539df5f11a2f48ca14d7d53c8852a73c355c905c42f594dcce76d1548d16249985a8d70b335722afc18204ef4cd3d06c3122e755248a7ccb4e9e1b4766a68a84cd74397f3afda8234c45929fce4cdd2963e6cb50911cff39db16a4b7c7d829923707f3504945a648debcfbbe501fd15f9622c984d86713234c05d14891b45935977149890f975124c64a51398f56b936a12892aac3e5cc6aa24cfee1e9c5c7eff082478e1be8a3d38b0f10bd5024ccad9db4d3cd3ebedd08ce093440911c224c788c53b31893280391c88d2012e922c78e057c81d03e913c1ac7dd93fdfcadec89c49c9a6396f84daa9972837144e0c34627923bc36bdc4e27f75424020d4e24fcabe998dd6c2229aa8fa6ebf7303e1f4d240759a9396a07e155aa0422112fd0c844e269dc4db5f1ab714b4c24696fc5b2fce125923283c668237ae4a6c512c99e9ed47aced34cb18240a312c99d5247a96ce788d8299194fc472695119a44c25d8ae99d4efffb4c92481c3791e67174ca958b9148501d841895dccf4aa501894c7d12aa4306dd69e52392e6cb55b3887c54113b22c136a71026ecff63ca368259f712e2c27821698506231236ffaa635c994eef952d2251b4ab82fd07d56a15452478f8a6ea6e109d3f9688e4709dc2e7d1d37262cd80062292fe672f99305d3266cc2192e2a8fb18757563474324c93f69afa7c16455104f2192fa53e46b6d7912dadf811f5a5cd1c30b1d17031a8448fa1bf9b392a53b5a1a445252b37ac94678b2d00b224925a59fe71d26c2cc4024e694c52fbccc7ac78a16587c44223d10ebe84206340051ce15ccdbac53271d59593dbfd79d1493a1f1874439cbc17cde2e080d85a46dd2e386173bca0f4939b6b69312fea24dbb39a0d187c45c5fa29fbd69ea530e0e68f0213986ce49eba51c99c68336a0b187a48c75bae59d620c4a9bf86f6c0a68e821495baac8a6161325d379481053b2b6fc653c2467fb9cdb43b977485032c7a4e99256161db443f2da58aa8889ea195d489a832c0d68d421d9ad3f9afe8709af28d221d95236a1694768cf1c92429aa65042be482412c9620b9012d0904352a611be66c2c13774b433c073d8884392858d7453aa3579ce095816d080c3779e52c5c60d7aa73222a0f186c4945ae3b59ed208d95d41c30d49b9849c7db598b73246a30d891973acd09484ee546d485a2954a0c186e4334b6acdc533783685a49999800b85028d35247dfc8e231777556e4c017c81861a927295fca714a39c3a73241c5c5c0281461a1244ad72ea8dbf8814e1c8a1aa041a68484c4294c937cbb80c3b248d07173c70e4283333335b3501ec80c61912bdbc746b18533a0a628a1912654327d53bddfda613920602f25e9432051a6548aace7e298c6fb6745f481a081992323e654c73356eae86a4ed13688c21793343c8de7443d2ee9040430cc95671b5b2c80fa22c672d0e34c2901c459978efedca5d1d0e34c090e8ada393afe9bcafbf90687a336ab820653fa5bd901864e62851955a1b68742131445ea47f0c4f59e242e2c7d12f9a5b3de818b485c4984264afff4c278c3da8242ee643d2501c0a85028130100c0a9aeb9604f3130000001016920763e17848d495791400045642324a2a261c1e1e141a8a04627120180a03c2a140180c0683c2604020180e86d2d21cd47e8711bfa02112f9f428e6cebbdba83bead515e25eec74668d33d28860f9b1e8258070f9198d5aae8f2f40e0e8acdd75b9f811a710c019e2985bbedeebd58043b035b8295183acc0874315f4e1ecc50fc7538003528fd297fc8c0e741bdc3480bae1487a863106ff9556bd3018e643c27dbf012a03870c1c5b7076820304870f7c80b011133216577a137ea717d0ed00821f8f1c35f53b53d2ba2f8fedde3ea3f317d7abadf461e8247511b6018c0ea620dc185c3038bfc126f4061669f53851576c75c498fbc78952622a982a1f4db891b8323b6d14db17dd0f4f7d130723351e453f50a31b0b608261507211fbe03e8f4faf99c5887d8b465a3fcb4d6fe00ae5393883fe26d21ea0cd7670962db41f5e2ea5d40a3533b1e3e62e42d6e9d2a51c9fbca65f0185baf2e87b178f047483d792dc9add7dce28025811fb52abb1a707cebbfb4884ce139d27608e6e56e245b4e5e6471bab6a486f4152da2f112132ed288ae8ca487863fbd6776a4ad2a9243edaaf0ce66fefb5b864e30078a93aee3146c84a00f0d284a93bd61d89b432f2da0989de26d90bcdf68881aa105f0ea306c9de565c4491cbeb9245844622a501c72ceec0616b38067e210f93319797137189dead2dfe882f61c958f37faaf5080d10a361c066a56e259d5b55273e3ab849102aee39c4f79d45ce9e54e7cd27943632472c303fb45406a70d26147a67b079b4c67892f91afd50fc0e8a7fade3a424818c07f086fe560fd2128c010b5c0e796a4248dc49fab0fdb7c65a306512b140926b99d2b4d421c920323996b029d40987c5c99724b149759c53b97af4278c788e27447592e8681302fc60ffcb042c2144a9edb21ed5a17cb2cc4ff9d522472c79c8aef196abcb22c251b91e34659a5d40b15e660ba2b8e07980ee51560ca5ef81b98e814757ce38c66b50a0e289205b8f59e8f31bd15eaf06200b0f78c11ee3080fb6f74c8922f25018f9fbc065919e4b658a8e25e9a6ed044c0be6b8390e1005d29d41283d9820ba9623669ff9c63a5f1b32b2aa4d39ec24160ad3ea9096204f9ab7e0307d6958277bb3203c736cf18eb9490046afcd8191a1918291c22a0aa3fd9786b52ded6304fb547b4410ab7d0c8b074aa84791d007f15b7cb966fb35057e8a570cc02340a77b913725631b359e5e4270b72a2c5f6ebbc9daf2b32047cd61e915fa4ddb12782e3f8edac192a8196b5574d8351b95cb1856ebc6c48bc0996c86ce680cdf33f436f0c69fd1e0071a25b953d4b7b4632094785bdd5627e496a5ea47561c418ec7e0b136c6921d7e1aaed30547dee2e764369801df9de57dc7abf88376cb15fe53b4636e5fea08d300a58dd54cc514ba4e123e1004dcd3dca5259fe6fa4e630b64b26d923581044497136a4f7b153054f7e5c8107bd2b1c9133af84505b4554cefa5e2935f2503325d41a8bc03eb2821c19279435ec789d797dea125b521cd6ed9ef1ce7a7a346f9da0b162dafe39bbc366b7b8d55a46db3573288e47f6df3ba4e5e31333498492f025ea9bc4244af37d4be7d7ba35e6f5ee8bd9a7b35f06ae4d5ecd5d0ab815713af30fcf5442b37d724f6dae885969745bb5d0437b6e0c4bf6469947fa0a5c7f3d07fe446486a7e24934c5f37060662f9ffccab3f3aa27ba4043bc96da8bb8c4df25fd6abb017895fc5c0d27b25f16ae995e6d5d4abb15703af665e0d5e79bcaf279ae3ae25b9d7b617dae375241de972a1abd72202b06bee5ea6f5d54724a743ce33c27c30e2784df7bae775e5b5bbeb7ed7a6ae4d5d1bbb36bc36786df7dae6f54d5fd723813e1b929769af035eebbc4ec8eb384ba3f2181836e0f94ee5126df9c36591af40578dc46f4418c2805c9a9ccad20ed388da89dfb1c2d80fa22bf394ddb463a9ee6b85ae1aca6a419a1bef25250515dad078747f013d52888b20897a4151744bdba41f5341e0a875f690657e2410f9179426b8cd4b4366f72dfad28f3262617819e583987436c0933672a9dc64f3b10b54efada4c08a48c6a6887521c78074e5ccfe1895d15ff3d239782d7f85d009a57c8f1025230896dbbe2aab14634e6d5b03cd7d835053f73ecd2e04562170847c080c017970330f3a431f141751f7187764b5b2dd0a3e0c18424b2f17d9d9034d531413953c2f8f2965908c8d3b8c5f38eff21fad1b2bca6a8f31874567d77b901f3adedf2739a7f9e48745adc7d34e7c3cee08f1dffbd65d5577d37dc3011cb62fd0d80b87e70b4cc7b3c012ab7680b4d96eb08e3a359ee99b0216d8286be809449e55b66f0042824961a70a331c757df6b82d6852141af579f997e7e929a6a2d96bca5cd5bdaa4db57127d87d39c596cbe223352e7f67af42fb8025fd03f5bc3528e9ca0f5388f5fa83426e469ef0d5616a7db5d8a123c9b465ce44644473a1fc2712ee990be40cdaf4f35b46a5d9872125d601caa1af885f73ff8c654ffed36fae06142fc08eaa687afd88344248409d872310061a45c1a6be35213ed5e9d30ce677d42e66f24f2f62ec4b0cf71176d6c75473b81b045b1d2fe87adedc474fc31d963487bac2b91515c2eec39e1abe697c7596a1b86a8d8a30d26725671018b0d74582b11c1194828329b58d98186815693112a5aa26cc4481991aa2685933f3912e2bd11858eeb30aa1cdbfb5eccc10163d37e94295e04d97c9e68e2a295838946f8da3dc0524343890e17b734cec52b70c6b9b6f31f492c65c1d3989831bf42e2f81745bb314ce56fc557a0c75484d3a379ddc303e8656e4340909f4561c7dd5185a14dcb82daddfc8f56975b80e2d1fbaa1545e7e14d1ea59ef98efca731d15662ecbeebf401e03b06f0b7151a99f943eedb7c41a1273412797451317e32da398961b1d313e40264ead1df5c8f2e024a9a936526252a40e98906a8d41aa587dd4741e251751277a03b39849e18c9431c2e4205b86593a3bfbb122c8559de532a23811d30bb1ebf30c321fab5e1e6c3eedb4d0a92e5410691193e12db0c0b62f558c780f1e731e703094fc9fb7cef03a3ada5bbeed29c9f6440d0b15c31363063b1e3234a3daf839802fda6589901ad58a9d218980462c9fe95e3fe054ea9913eb2dc29032a693a094fa60a721ba03f1e2739806144e9048e6f08d90f8450d97479ddab9fb22df6e0514d77742621853994328634c35c4fda6843bfcba4fe751680ea214b38582e49254657c194f58a89c7e742d82f4ad643398773d0ff275a7c9edc9278bc2272a5392d59c74882549895bdf5936eb98eaa511596d12065fa876c6b122f923a6e29cbb1257ccce7ee51344225d6a8ac5d6d60cabc3a3dc891fe440c3ef739a59d48f2222d75464deec75a7b9915d6163a01b8f79027d4a538a953a4b103116f1744e7007431ccc6a013d237f04222de23952799f40fdc12e3e4a8021f032510114359e346f835e157f028fdf91eeca388de4558c1799ad8e682fb67bdbda08cca953a224bbbd9c8d5db7380a006855dd291b7561dc3819d5898e467d50f3955dc6d9f482363d48cab463d0a5a1a0fc33159a9e92d71b59fc784db73eec55270b79e80719384650b4e46fcbfd5cb0e5e763d107ef5dea5175d4d82a79430dd407a811314118962ff8c9d2ba88f1a140b5d359bb828a1411b4bdfeafd67828fdb37dc5e338cdb37513684e45629f5c975bef42b2ce62a26f572018b0205cbb8019fd7aa7773cf28369fe9f3fbe2d5e71eaeeee13e07ae1ecc72ad98f4b87c20af19cc5e1a3b07411eb6a88fc9e3103fde5091f2b1a4d7d8c9cbba5481a4cc6cc13626f57fdbb569d0b3b6ca620a5ed663dd43b081fb6cad749bf12df880a03ba0e78f4b374e20370f5dbd4f900d62f650624fa0f22fbb51ee32d3d68c2503b7d1b9d66cbfd5e7f7309b4addd4ecd9beb6b7bc0299e3ff3d6d5d269744c7e150c0f9d4f859a405e304d45aab362a191e737fd7f45f8d763555270ef466681999df24b910a503ba41f47f5c68005460f338cc11c31437ea1ffa204825c293c0376e2690711619e62acfe9a9aaea3cf45738f76e5f49546f2f12555fb649c99b24a148c969e9f22d1dd8c3e695adc087de1fd1bfbf67fbab5728a49e94414fb9a8d2c685cb1ef0ba2092fd7c7d422d88b4ca6d4057094a4d05670623843f769b2234168ff9eef4a50fa907932c0e4c0d27761ee398094251b77c18d2ea3c53dbf8e18711d1ca034c23282ebfd199c7c2e2b6e891db9d20c15d562b606093e8a4833589b37ce5fd6a69788682de3b6527a113ae44cab750fe9ad3748df6c277bc0042b8013096b877f17d30748a99b205e40b2b889ebe81bb155aa11805c550f2d26e24ad16b31e587104ac5a83b9c1d61420e3aeddb34bd520280fd00a1a013496f14d0dc5888eab677ba57cab7a853966bd835edd965b9220aa23ff0452b6435a2f397f98d313ef4de5dfb1925826d51c44f318e5fcab4fd04073ec991cae975d9ca021fa5c72b9977ead24f5065e46a0755124d401f859cfd1183920840319504076f252f098350ea5d77dd23f0f9fb895910fc8fc0d769c98120d520f618c048951e913d3eef388614643ffa247fcc2622f2c862755ffd22a01641aa0cda634fa755a6e142646fcef14d73d2b5e5db1b99660cf1040200ffe942f478235fc6908d6ea56300e136ac3989f9cf63c1114a383252097ffaaf5aadc6e5666db56c4cddd4a788f31f472c8f02957f64d638eaf2ac1e7a9342822738c22fb2ab14ba9cf82328b1fc12b8c1c6df798febbeff7dab6b2c6b9b04ce3698e458f7681bf0320dd77c76245ab1b6383d6993ca07701c515ca23601052961711f76d69a9c646b4260383750e4a485fe3f1082d6e1ca74e4284b36fa405e4248c289b37cdcf11b2aef5abc1143161687adc9582855e12341c0ad376fa55b4c6e36c2d61d8d71673779b411f37dd246a3cd7d430052ad5ec10297d330d90667df14ce7c3198b38fbc6251165b93b3406305e24637cab9b4572934e4023a06a22d07c661a2b53485375dc07485560ec062da0e7c35686ece1e0677d3d99094adc45cdb4e9e40a8b4cf4d235ec795cd811c7195c00e702edaf3a33153d8392a711b89900dddcf4eceeffa1fbe1b9141bab124107905904f1608730acc47a738297c165451aeef620a7162f478f8202fbad29ff814c5ce6fa674d739c96c2f109686194938d03b8129f7d5bba5a2524fae0b875695f3811405aaaa4c51245a5bbb193d6ed98e312784f606beb7cce6a4412ed862c19450a9ea4e4464b2cba95a3095ceaf1bd6ad7be3be5c641ce0068388cf20c7729102e148b73334cc3faf4e6cc40857360df46326f580c761bf694fb75396119fd5ddcf03dba0bf3df6807152ab7b8c9da92a6ed921137f59fca4fb2bcf8528a7d507db10b7329ebdb2ca2ba547a56460af4478d6151d6aa90e794fcc3a8280f03963e10799daf9f6e8320026be84e50f9eef877f7432a5b308164452b85da159241255983209601d36b8dc7b686b1f4a5432a9430d74d881a2f50b13cab720a471a98e4c6a9daeefbbf48c0e06446a2e2014aee9ea4a934daf17537295bf90095e33774968cb2e62106be15420323ef671d355f5447213e2c0e1b30e202f5be206befda42558dd6fc7ca8faaa6fdfb4416a5efcf58e5551e82ccb507d8cb2dd8174f14d0fe6b62add66b4cbd7863bb9ebbeb82e839028147c381ba0217c1be6a09ae0beb38ebf730b730299590c0d232a21abf315e5d069340a1e0bbeeefb1eee09d8454f6fa69319cd16562b33b23449b63449d8f55a853f27d8e851a8738e1aa8490dac607c60d33f6993401a0a93eeca3af6b21e9638c241769e919b554a99a2e29f75a94e7a8cb7bfee8663a477fa9d21a0df0ce3662ec1b8967353c685315ea5f599258f3c648ceb8301528e2c0528196899ca2a4a3a8d9b6b3867ee437f7c1ed11ede35a1197bfa906a86a0ab89c555428664f8710d3bda35adaea98f70c36be3f297ad09a5ad31986bd89ba6c5baaf8b5f4f34d017defa327c030bd5f6dc9423d0907ce049b9be9a5b90192d1d8c40026dc17795fa2b2389a530a49b9cfb66e44e173b7e4924a9d3fb3e869b354cb9248042abba8ddc4af9b7b2f7d65bfaf9ec645c4e33efc38edd1428afd5d8088e93bc72de8d205de454f5d8e3de77113ea7af725068e308bebf82136b193f1e46720407a2bf7f31e072ca52a72eb18a540115f1db0a0b024731f8d05d23c3b5898b24d5cd421a598828472d4f3b7cd61d20d0848d49cc2e215dc13214629e3f3a50a4c4a0241c1bfaacd3c0cea11d2d84d98c6ed16c9b2e9094050fbe1b854d9a461840f782ca505043f817d5c2250e703198212bff0d081cc4e81070f30e7765cd5ea04588ed02d2baaba9b4d335352ffb8f73e6a148216e4584ad03180bf96cde48168a34c9397445dd9566bad4d5e6ee5fbd5769ba420caddff14427fdf71dce8a46edbace525b6c91b6dc4db8ce9280d93747883acb365062f51e6ed87e0a9313d0dadc6bda4be55c753c700136dacf8d04b2a4551d968f3bdd4eca1c76a68a39d74fa06684bc6e98e48508b4f395f1f878c1e0583d8f2f1ce721bdf12ccf96466b0806989acca2a56080f01f63690267f07f56235a3d62a3303e6fd54d26fa6999f25c12a476130b8b3e1b29813e0d4d24f5c399718854c1aaceef4c307d0651a05a6c272d2ac9ad14b4b185f650df4ef114c0ce8604f910f7e527d9cb7e3f1845293e4342295f410c1e35e049b09690865d76bb40f6591a901c813037a55b45742f8d9c9a5f90666b909be043c0c91575460f8853e68b47e63f51cd9081ecda79c25d0b84d0ed1a9175431693626fe8d06fa7572b0ecc9edd47222b27e157e6309d1c7897928f69833cfe8b7c4821db5766cad5c188ceeb80e532f6d1939b450ceec08ec041280b861346966ff13ea568847e688fc455e2454a0f6e02eb23a6b95ac04636f80bc86e9de1996da700fd3808c59eb02236bbc34dc6e51a3727b45060f79530d3b76afd60c6bbc2526a8d8d2aa836c8225b407e40f95868b56a9fa13d38a1b341f22e58abb5511528059e9761c5c6ab9fe63cd3055bf981cd25bd6940e125a6efe9abe34a552d7e58f8f406b948f963b1cb612b8c21e9d8097063fd53ea36ac9777360b347050c24d75cdef5ae69c995737e4e0542f546d399c838f8cc287d3ee164a67cb717821696d2308a0ce62c320dc8828a0397f7d3754998c8410ea37b9a0a6f82952c029b767736307262dff20cc6909f09259451f355227bf96924518d3cdb4c89147363dfc7abc74c28f6a50c15090f26b27d4a6ee60b759910a8cc82c272aa3c959ccd1c95e9a543912e8aa4c4dd469139402ef31c583a3179baaeae44978dfbcfeca37ae3568260d6242ded79f00bf50e3fcb11381a7ea61fcd34cfc7148c31f1902d23bee6c8092a61c92415cde24d1a330f1c13b491500271a6aa8b79ec6b4e443f20203c4d175affecc1bf29c92ccc06aed21557a37bdf785c25d7fc03f6eee454987561f02d71bb98a7981f868136c73bca60b6376e8789b9c1065e481e3652b51805fd8b4dd6e2ecc99d50d508f9af32d4a55531f2706c8becf3567126fdb83db7fc28ee9cbdb790f0d87929ea689f1c7a32c622ba78aefeb446e005971640d248d4ea418c27c14c3ff78db05f5053e85658d2bd24c9e3ab5a1816c508244da3701bcc139fd4fb8be13b50964a4666cf5a22b98e05c2bcab00f7c68e9debdd638db466bf7a9349472a2e91ba2c047a3e84540968bce209afa11c79a69814bf47b798ec8c7d64a95909ebb2bc69e1763a3ba7effe74fdd9a572bdcd127b41eaa2a9bc4a7127c767ce699d30a62324d370a9c15a2d6e4e4c7c0533f020adb3aed659c77dd28c528fa51f810ea0af89ddbafd7c0d4a96d00f18a306e2e92161ccb9cc5de6707355f3b9796e8af53e8d85f9be891de7827c024424680cf234220d52604eab982396854e9eea57100ab470268ac803cdc96f9a74c293a85ce01fd7bad9959d4f2fad381d309b537dbaa062ee7a9aa2f49951cac2ee20d35927fbb190945ed484a8d4f361270f3233a60ea2c993ec150010d76da1c180af03dbc4ad7bf6de02c6008ad1181a634b647cf78dcae98c1a8a5933c9c983531cfab4f85965e57a7d89bb278b4db1c2edec071c595c6098d8515248ce34337f9be637cc5ce075ebf1828060b49821deef52c33500dfe88948f16b1525219093f42bad306f4c3d2659b47dffee94e9501dfd0a1d821f2b7f98870d98633b1039ffabbacbca0fe657c51b03e58806031c2c558898f392f92597fd611bbb931f3f563c0ba808d4770baf1c8a23cb23265a3c4bb25b46a703a78e8c8ec4e6ac87d0d7799924b7fb1bf95f69e4aea5425e4365ce0dc647bdfbc53161165e34edd28fd7f4e561381c5a7ac0c4963d9895c1dccab5467c5cc34c8b0ce5ef1f44bc869fbc83bc4207540548261ce628a11752850e9c81abbfb2c862ed90aa02c5be292dbd53d7c4941db7d419ae87006ddadbd809669531e2b7a236bd53836d3d6cd3652e97389651772e50dfbf7e02f14843c29c40be501aa6cb80abd3a5f68c24f86b01054a4ed83c03388ce66f13992016ad6e4110d2105e8285df323652da9132c549b4c395e686c4d4e7a187ee2bc48511b57b9736df805fce2e846fef32eb41145a650fa0641ff91eb6f6257d7b5fb670a419ad23026aa1e0913ed655d41069000902aeaf96eb1009b30ec595b58f3e0203ad0e3c4636a290743bc05697d185e4510f27f1cd840fca61bbb1d7c5d8e35e1ff1a2763eacef9af3684c1dc0f651ab0ca675a5ca730cd5b4ba8bcfdebe60e9fd5e3b2d3483e1748ae4619a327a99ee470ddf619f72ae0c78a63b2cdf70e2e85300940a22df9c68cd86b94c1c373cd96a09ace0529fb664db6a18429666c00cff7d93397a81be3a7f6b174de297291554296f54647b0a3f5eb3f73b2350f58f23560c3c5c1594f417a53b997d2c2147b05dd967424dbba657544ddea3cdc6a028d6becef57d557c4363b01566947f397669d52bebdba860dfa090c405d74793126fb70706eb483bf1a11aa34f9a7048da48ad4096098885b9ee175d6f7780322ac91cf0c811b3da6e05061499f6edf0c89cdb69dc0439c3ac46df6b1ba0193c8ed1d837891875b31f9743712bbba5ded65acef52f23ee86a4724046f18c0218053363eed13aa00064ac0ca362a07aecfa2587999e9a8dad738f56539c92ca14aa2b9bdbc97d2c8c1913052eaf2253655a51700c0e06342668e7786263c6387a4da85e0ffc96baddb4687e09eaa10baaece191a0ac95346b7bfbf52f1527eb8184c6c963534db115ee538ce2668501353b507a3a8368109e6171b4c2a0ff1597ef281bd623d9ac4e8cbbdd601d3ac6361e528932461d7143988fc2183ac30b00e9552594e0235879037312ff7658712c71eae96e8f63194e18040520285b5985dd13f0cfdf652123febe22745677b9c58a5e200704c7939bde60e37cb538f2a846c8e64dff2062cb8869ff244abd04218706b8215204cfa7d0d48647429417d5e76cd3ddb50022a4f2e85bb6f161e9c7096b2b43ddb98934013dc842c0d5c1d4cb94e8516af8d0457b2d04d8f525697227ea07ae9d8d8b75b1b9bb06fd06020d441808313069606460d6c0b081280c362f33287f2967dbc1e2778125071b3ad591f4f486650335de73e967b10d9b89cdd65165e2368edeaccf274e06412abe282965b91629ed95aa51535eb7a28b85f060433f7e86cc5fc1bd9ca504cb4bf78fb9cf1cd3da9d80fd032c05dc8d008ce4000ed13720ef54ed2f3eedbd70dc87c10001842dc1ca8424e00093296d182941ddd23a91cd1000f71280694122cffb36495085885c44ad446588fc44d44a6486c80e91160810296993a89b584f168de2d237a701910a3263a1a6a41b8c8280850b1a970798ad280337210760f42c033b42bee1f4dbda81af8e8e64322745eb6903376cee30fd3031d881883273f5303581d43c6b7f7a28e0c64e4f92b31373f985f8b26102c648bde3fe7c3c1d9ad45b556676026e69f18f8fb9002274eb1516b18b27b6e442feaa694b4f3ff52775d81c18713a59751a3728d3cf3aec15c80840e993b74f25521427b683f08cf1a2a8e30cedb38fa4edf14728c480baee8cad3b57bfc120999f0c4578a35e7e38a8f98466f98625d04958d6d3b68b07bd652ea75a84bfda7d0d31021ac196fe0af988c809d4e64d5b500a5a87282501965c9827b57b8005eb28b7c96a92783ea3d3971f581b37322d69910a8a582a8d50cad0b922ac4932e07ea82a16352bc7e4458168fdd17c22152dc5b07cf423c7b729bdb5bce47faeed0e5ec70833c7be19de42457db7a1358c8693be362a6d8e87016a4d828b4d455ec2cddccde2dc8739e892d3d5bdb16a420c6ac83b8274ab4f6499b31b4f89f18f891c3aed015c2786515af29a8d86fa5623686ebdd159ca92cf5c86f6734af45439a5857482b1227164c18f64f532b1e70065ec00f4cfb82d7469ff93b1862004a313e61285471347e1ec2b9cda3def4208cf905ac66b58fe9ac8c479f6965eb772ecbcda2f9e4089183fd74e11a04206e883b21017f972db7d82247a66b6d4ba5ba545f152d44fbcf98e95b999aad592438aa91213c617608aa20a157027c640316a5ebe7b4d3e5688a499fe3932232acd421f6a326d302944ff9ecdb924abe3ce910e5534e0817cb2ba78e5eacaace45e2e2a354db2c2afb9b39db80c4e64b7c3f512ec547a43bf602fa4aba25879b67d07a87e2a3d4d4f3b1ff75554c339ac8ad32ea5f75f0614f9008e99359315519631cf075435de564651fd2e9c31763280da110129257491cca783bb7e8515678099345d80d8d569985b60e31a790218909f180a38ca017042bf1912165b1f4c4f67847284c3077e936b50f51243eaf241ebb12bdfb93618137930be353e125295940c601948e3385d9ba116e7d4a62a8d8cc4622ca32308eb0b84cb58b95252915a8556bdc2dfbba81cde3c703ee77b4117049cba053bd66e63f3888437eefe471b12c304e6ad8c1bdc4d5f8b8d39ad998394123fbef4da3e36b42df736dcc6b69ae63f0bd5f2ba511bc96a6f8e5b58438a64bcddcd096be2db838dbb2164c229a885425134aa40379440dbe81f35834bac9409fa8af5a16058da6cb04db5128667563c65342e1891492e31ff1889dfe8880c5801f363312c85610e284077ed54cfb2c435aa4ae86ada7df5a5569ea274cb1dbd9727e3dfdf4e2a8a7e4da5b719790152611819530ab59342ac6855858e2851da50bf52f26ce5b5e69aea74bd33b3588325b3598af4e39ae4a5b3dd89b30c769ee9ebe904f6ec143bd8d203216772baf812cc5bad767ea23d45d7538ababa4b27d444aaa80bc706aa666674a875f8cfe476b33a43dcf11a20673ece18dd9ea8dc1031faa0ef7fc21c9209cd8793c88d43c042b01c64c8fd5e511aa5c3f1ef185522ce660240c8322f5d9a9444cf95c4ce329735a643f3c7710d80bff1f4af7fdfab47eac3d6e1d1dee0a142e90aac1613913c12487c6c531133bd881677349f6cc122b7284368b996b9aa728e966b99c3aadcb7314b1115612f8955b58bbf4768e90480059a2772323c1f4488bd1d048f3666208a28501945cd23976de567e1cea134abeb1aa92b46be0db20fa783530a1714a44fac8d5f2815d7c9504967ad9f4eb9bd78563cd1d212fc02d34136068d06503a213ba40d49b0366441fa2cd493057b5bb0470bf660c1f5b20b837c9f5c1199056e7ae11b31fc4db83022b747091a0252760e014057fd001c13d21a6ada3f71c5e3547af5008cdc1bafa8f5a6bbb0ca648b4cf1b1b8959e0675e2c5637ace9d454fcf0c92097221276449fac838992227724816a4838c2b539f8373fa599a5e324026c8899cc922e9202364925ce4942c930e65ac33e39c9db3cfc2d3ed8c7d269eb37366525f7926a30a5b66649193ddbdef473b2d8f7d0bef35bb37fec093eb073c85b59bb1de23704026c5b44fb4a935bd537a8a4ccab49bec85ee12aae2f14c3b8dedcc50675ef8eb06bdf0a68a640e2a4f24b6d4209af44327e838add12bbaa5df74868ed0da7aed7e6f675d5c3efc86e44cd0291305a29094420d149dea512f2aa5c2ac61529aece6024ebb44460c3650b4960efcffffffffffffff8fd2887c6ff27f2b999294d58fcab9ce94924c29a5c87abb0580000000000000d04d4484b42d80080001360c380c950c32be6008595bbed76e5cb23bbc604e3975b2d27e51818c2e183cd488385d97dd846c0cfc21830bc690d5415e4eab2c22af438b87990f195b308fd7285111249d3a6f0632b440b260f89cd7ed3d96b8fe32b0608a20d4e79a1094a896878c2b982cae44f2d8a7ab94ead01e3f72b8775ac1e82b562ea7f3a7f7fca71c2690510593ef7e8a4b530c32a860ba0ed3edd8bdea49fd2106be0978f48541c614ccb93f07b17de1397e1e8c1dfd053230c8908271cc5e45ef9e8c387a13f0d8b165901105539989a4bbfa74aa5aa0b02290f1045390175fe36d363b270a64384146134c5931a922a5a4f5ff924306130c7b5a3dabd7e5d07d410bc858820c2520c962928c65d58ae21626e7eac8f7152cdd29305ff48e1f6180816424c1a45dfcd7a1c5a3023870f0e88104e375c4cf6939c7945a8c307af87030100bca0b328e60102968c4ce53659915e204194630e4a477b671f2928629a308265192f26d574e87160c6410c1a493f289193ad2a1555e206308063bfb522ab25ae94a76ac005b204308b6984e6b59e2a2436b05cfe3eb9220230886f19222724ed64ad708328060ce733a692dc98e7621828c1f986329a5e517238aee8b0e2d1f984e9d854d51917f97d2a1c582771e3b7a603e4b27224fd27aa1ffc1a34d904390c103636524b57f7d0786f1bc9274d0ae25c602820c1d18cbf4689113ea3284ff62e4c0604a4cc850fa617a2f311fc8c081215b12722ed3e31ec8b88149743e7e07ad7568d9c09421f53fad5c1621bf1a982688f4707d8f9997f040060d5e1391b28dacdcf2608b5998f3c4a986b4a85a57ebd09285c15eb5b7526e9b66c8a3e8608b5898622fe5c9493c5a8a970e5818a496e7f190b34e8e1d71b0c52bcca9cb4336579f54278be10af349af9b70a163b32e1d5aa8bf08a315e6170f22e56bb7b2a7fc8f1d3a5690e3c79b8015e652a2848cbd0a5ad1bc1b6cb10ab3843b397d395bca35abc2f49f42e860fb2162e55361ea97d5920927edc46936d8021526b12c1122c9ddd6f33ab4c816a7307cca99543d97bdf42800821c15d8c214e6f9b99bb0676d396ca53059cfacfcbc84fd3e91c238497930d5151a8541eb25191f2c6ce6e4a23067d97e086abbd65c120aa365e59ebd3c16d6c4a030c77d6b6fa79f982d7ec258174d84890ae2ba2e9e30db998f70cb35298bd60953dbe92a31312d54789c309e6e7a8a272e5c3db50953f786d7898e2da63b4d984d727dc82e52ae2d970993654c1a1326d74aa329a6730953522b3167ba92e59825cca13b9fe167a9ffe54a18fc92d249e1514c871825cc62db9d4a2cce8a8b26613075b9b5151d7f594918f5e285a4a265899d239130ff8e8be452da729a14240c9e5c256ea5f434e9cf91b6c5230c27afa146c8890e25f5c3470f31f0b6708479dd46ff8292fa398503c7168d3079578e9714bef46584b153b810364a7aa560151c3836b0630337bc78001eb6588451f742122161357b2b3ab47280d1c347ca91e3c70e30767c9156ea070bfe40b085224ca63eaa8d2a199de3096c9108f3a7ce218e85b5dc35025b20c278fbb12e4eba849c637708938ab519b3f5d1a1f562545d952d0c6108ea42e70579218c372a7b50f1720e3b13c2a07a92693b1321727610467d2d1522ab4910262dc95cd28de7b69502611011abcd523e01c2e4e9efb3e45c349dff1fcc714d474e426ab609bd1f4c232aee7605f5c1a4cdce93aaa550d17e3e18430825673fc410fefd1e8ceb414c6d248788caf560d2ac0ad92d6769d9511e4c26e952505126553e840753b635b5aaced9b27eee60eae83fdb913c97d01d3b18742f8cac1362ef731d0ca77f3b588ef85eb8e9602eb92d2741db5850f61c0c7af44fa8d0feefbc1c4cdf61fe34662f54380ea6142684f59451eb398683c92ee5c5ce65926bc26f30a42417e487707254dc0de6f4a01e414fe47c396d308712af949c1637b46c30e5f26cabde497554d7602ef99175749ad09dae1a8c15f2ede4aa4d83c1554d3b744e75bf2a1a4cb6276b6694d2190ce1fdb3da6454d2999ac16c273bb1d3da2799963218b6548c45eeac5a9742067308f7d913299733cd3118f48e6a68eda9d1498ac11ca3a5564444f52485c1b8bf3a218c12ffca83c1ec2a33c9d7835f3087d1989c9277f6f5d00ba67496ddf537ec82b943a56471bf37fa73c110e43a8bae2569aab30593aa5c6acbb916b43e2d9856de4ac50b1fba542e0b66493bdaa2164f8fecb060d2dd117ee296a13dbb82f9fd7d4dc65356305c081682f68668b55505832c95b774b0d4eb6a51c1289fdb838e9e29987405f54e5a42f8a9a5601c0b97d2f327319e8d8221ec98eec50be2270a0583fc1693b150d7957b8261262895b3a2bb677382b15286d787c97d3921c0164de0524a31dc24048fc96d593917534772ca703131c1f01f7cd7ff4b8c8ca00e2d1f3d72fc781360ed12cce129b5f78770d7955282794f3c8c1aab2c1ecaf15e77852d9260128b9ec3cb2a2de5500b4e0e317ec78f1d39c21043013f586070e0781e3b74a0068330610b24184290b1133674eeac901c373420811b473055face33d17b4fe81a070e1c595b18c1702da23f8914fe923415c11892d36be4082148fe8960d2185ffb4a6dfaa11d8239899e2e2513e286da72f04839c010a3579023478f1f770ad84208a6097ae6c42e547c82d01641505494afc69b50dac514fc02d073a0ecc748c17b0ef42ae01d5b00c11cd73b6c5f6559b7fd03d3ad09f16aaa4cbb5b1f9843bc8a3d3b49ea57d9a207f59d505555a905c2163cf8e2c85d512a4359c4d86207a6ca695fce3fae0363e71429ac7e69470ae5c01c4452eba52a7b75757060fa306a49dedb83c8e506e6318fa192d67bb6326d60104b699dc74499a9af06c65bd950cbda163430879295d729b7591873d3237fb04a0b59982df6c8cff1c3788612fb418b589842a827d1f5d3cf237b8316b030ec8e97522d95da93a3052ee82f8a85408b5718ae4a7890366695aae40a73fc6c4a72d23ffa766e85f1830822bb649315a6dc921b2e21e4ce3731ab16bc09418b5598527ef1d423fa4244548571c6cbcc63775cdb3faba0452acc9f44326dfd11265a04155699502dff259fc230a34cc88f2915d6f6358521cfe75628fdabb3b018b42885e1b2f7fe45f49a14a60e134cdfa828b1bb1c85395c5acf339eeac2afa2308eeabc48b9d3f45c96408b5098cbf7b44539edd65c3ba005284c6ef26974c3b49b7f72f470b51f68f109834ae9f4c7ab3bdd73da400b4f1854884aaa840a75e408038c318e560db4e88471945fb2244509a1d3ad43eb6c075a70c2a0539e74d5c5408b4d18f34c6507a1224fae980e2df5e2878f57c18f1d1eb8e1c58d09dcf02203ff0cf027560a2d3461485a232f5aeb3cef291346ff4ff2d292e80afd63c2d8e13c4493f1b86df94b98228994093bb2342b6f09e35616190d0f6779f74a9823e57a4fc152840739250c22e798a0746cd2567c12068b2fe5a2b327fd159284c93e0459f3ac643ae648987278ccbfdc25344b0b0963abb88b2ad13ec224223c789824bd76af23cc9293e571d1e3e6d1d2084352298e899810234cb225b65ef8ff7cf5220cc1de3d6878fc34a529c2d41d41df52b8c48f13618edf9cf3e01e57928830756d45cecb8d649b8fd721463b40145a1c82331591218c75d9794cbd2d43d742984f4e7b24091129e8130e1ca702e3342d0861c86be1ed3e9aa987e8200c9eda4f5f5032e2cd220883d67de9b3e471443c03610ae6e9df2cdc9ef65a00c2dce15762ebe133299482167f300735c1652e47889cd65a410b3f18ab2a64cbf1d64e418b3e18c55475b6b353d2adbe2868c10743f6d5135aaf5647655aecc1a464d632540c1145490a62c17e410b3d98735bcd2f2c678d11c181038c1cffc9c73f036e7871430c15ece80ef87813348f9ec03f0370e030841679305dd073aa53be893e3fb5c083219a051341854887568e1e583734d0801c28e8d1c3012df8b103f5f8e23980821e3d74941677305630154b295d314f5b1a9000056e7801868f1e490b3b1844ba9eb7904f7950578726d2a20e66f393d153a254c4d3820e26152bcd89acad2d212924d0620ec651423fc511f25da43f5e0c315a0b391894dc91266cdb93fe6c1c8c93bdd2e73c3e726d32410b3898c22ff57a7c9af0277f83f9f3072574bc3531be26410b3798472895eab3662bbc7c072dda60c8273227a94fdc15291b8c19f7a373b0aebd11d7609611f94295a67e75eed460f408c254fa9a4e923b70d0220d46afed30f6975375d7dc062dd0603e35ad382af94688941b5e9ca9418b3398f3fce5152dc2a4e792a1410b33183e524fde3199ddb6dff0a2c6a0451978ebedb2f2fca2f722d6879324a61406c3a7df8df5090c061dad4252b944ac17a52f18bf928e233a0891523679c11c93c4988bf6d1c9a62e1882c867852f53b2b4c40563e918931afbf3c1b40593d0f13e4a4584da5c0be6f68fa3a498c58aa32c9853d788d2794f941661c158ede37eef5e2a055dc1146e3c7ddd862419b28279fe4bcee8fbab6090e62616744c8da07e2a18c6624c2edca510d69f8249e95dfbe0f7e1ad7c29182e8cd26b23cf46463e0a269dc3c272fe50302825ce2b45f34bf67982414fc57b0f2a77dccf0906ad274fe85375555a134c3a8708593a449e5039130ca67f365b72eebefc124cd992ec7f8d9460f2fb5825314549307ad67a4a592349bc2024984ebd8268af9d8c0b3a827945a276cf858c609025eada84451e9b8b607899d4bee7fe612b870826bda2fd272c4dfed2108cade9ae2573fd742e0453ce2794d899dc9377108cb91fbcf64a290f910682d13d4552232d5e9fff03b345d5105bb99377da078664559354277c52ea8121db0753ab5f7d7df2c020bf4c84a8d7eff9db41e168020d1d9893105162890fd1b9710e4c49d32575c8180786a0bef44bd27e55a51b98c5f75b6e926c609291c44a50313fde5f03f3e59cc2e2072d0d1a9892febdd42a1b4feecec258b23c4cc55b656150fa21251593a4fea8b1304dcaa3c4228ba70b515898267accadcf6c0f7b7985b9f5f23ce8595d798a2b8c1d5b56afdee1e45b5a81865e532774921586144ab4d8d8f6e55856618e89be267a91fbb4a20af3e851a1c3ab877b2815860b8b93f20915d209156635792ab77592489f5318b28bb689acd3144679718fb91475bfcd52148e19a4308a57aa5b4a99fda65198440c69a1f2c6960e89c23041b25ef6271426cbb1333ec2a030669c5afbd04974c99f30fa6ac88868f93e56d0139d309abc4bbb3e274343e484410961a3da356ff2869b306875abfcbd5013e690f357055342849cbf4c60c268d13326a99cf025b74b9874a6c911fd99b6bb59c29c3c884d0d9d44866e953068cf9de81991db4246893c5e658859cbe973d608332661d69850df7d41a77b86244c29528f4d8e15260445c210f4225f277123f503095309b9b1a011b7acb247983d674f743d0f92e208f3a6c4d4fa485e426f84419bd7d68ff43f1f19610a2a75e53849c482482dc21c16f4eaaa9a84982bc2b45d1e5f553ba2a60dc68c44983be864e796e5647f1061ccf1ae60123dc40c4398a4e50e2b9ef6ed82448756a92f9a478f1d5785306fa530aa3bbb88b7b00eb531f80433086188a35ea4c596a7e8fa8c4118d5238f05bd386f396c8230c6cf5a85b6331046ddb018eaf3497f889e236df978318e0033006130d78bdc414e8964f78c3f184b4f765dd6f51f7df4d0f1638caebaa10109e01066f8a1cf4962e75e32ebeeae0f26ff537aa7b9a227e5834969f3ab1cc242f86e0f065552825f0c911ecca2cb528544d339964e1e8ca33e495dfef849780e1ef89a64415a4a4ab98b7807f36ee4135ac4b2f34d3b9cb25809e9fed5a190b6e4fd4513f25266c20c3a18c3b2c7cef924fe7c7330c90979b6b4b7f8596c861c8cfd97221d5ad21c8003c70d0d4860461ccce51546ce2819a2b28203b1cccd2a588879a787a524ad9c9b5e1f9b958f1f61a861c61bcc2985c91c15f2575ca243cbbfe8f1801ecc70c38c196d306a4989db7d2ada154d9bc106d35cccfb1625f2dfd83ab44831054090430033d6604e9e7447f850b711e42c84196a304ffe1cb23f3c92e7c98c3418ac74b22e11ef4907090e1c3870e0c0d13ec6e81968b825857dc81354b2a843abc78f349f7106f28e9bd05f1dcab34d3136c5c8007f608619cc55e925f731544a1a6ee086052430a30c85635730830c61cc188329d9c87e49d2728820d7a16580196230e4122a7867ee684e4a0312b8810307f9c18c3018dc3e3eafce25ffffc1601a197eeab79d2f18d5cab3d28cbf5759bc604caf53714dec9c2565170c22db079d2a642569c805b39fc6dd64b336ff666cc1f849747a74cf2942cecdd08249665859fe7e551b9314db8c2c98a45e557f927ce1546233b0608a10473cd89c55a490fb30e30ae6d0bb6a9f99f45d991d6658c114a6b3e73af9ecab38d36146154c492fe5d8ab6fa9a602e00c33a8608c518bfea5840ef2f41b5ef461c6149890b44e4c8f4f1b6648c19cfb2147496f414d4e6b46144c41656fa9b0154a07bd176640c1f81d7412499ea494ffc486194f30c49617d5dafbffa934cc7082714d09cf15d76b82a9b2e699fab0a4df2530cc6082f14e8c89bea518c2f59fb1044338d13a22ac2d82194a30e49cc6248884a01742c418a3c3c821c60e6e818f1fe30238706ca9624612cc1d63fb268b30155aa4438bc78b5139988104534ff28bb0358f1ea52aa0a5987104d35bffa7ab4776f1920e2d6bc40c23983f6ba86d9365b6629addd040038c0f338a505cbad89e2b29443045ba2472382192a537cd1882d92c9fdbe4dc0d2f1e8f304308269b3def5c5d62b456403023082691a2f6243523449c3e030826554b428a89084984cdc630e307e69e113ad9dd7c6c4fe1c0e163475b400c31ca15337c60f252b1fc3ea558e961a1193d307bae9945ce7b29f97c43030df8b1438c1d1cf02f7e070372e4c08103078e1cc452318307c61256722a5f2f57590670e0d0e2cac38c1d98b30891f4f3bb622dae03935cbe4b672aa8bab6941939305b75bf07ada2c2b636030706a132421223bfb43a35e306667349d739445fec6e0d98610393ce7b9769840ffd7a0d8cdafa63914eab9bf6cca081b176db364e2779aee82ccc4946ceed8dff08a693210be3c559172177413bc5636194f38e2b278260613cd7ce31d2e39da6fc0a94aef8fb9083ee09325c61ec7cf23a3ce4e6faf60919ad30658f9c96142537bcc0218315a6999073e4ea910e2dac406291b10a83acb7549adadb2e4a2f9cc7175ff4c0814355610e42c7f149e6e9d022960ae3d9e892a3639f305161167db7186b61daa7c5ba828c53a83e76aa4445047bf4d091e30bdf61860719a630480ecbb94eaf2c4e2cc8288539629c6e8f16d7a1556490c22017a9b3e4725bb3d50b1d3f7674408c2fbe48c00d2f6edcf0e286173732a0821d482a4761b4b2a0c4e7876c42045114a694dd43540f391446c99e647fdc49ffa2224106284c21e662c4c5f809835ac8ba30df19d5db138631b7ce412e44cd8e77c214ea1be1229987105e4e98f3660469bb262f4b043761883ef239a424e652fe6568c2142ff2b9cda92492ac3361082a4ac7896b1f3552ca06199830697eafa59438bb9294a606199730a91472393fec32ce34c8b044f1e1b533934483828c4a18238454562a4d2a7d6f0b3228619654df9fb3f6c4c93f13644cc2f8a3a299ac1b99f2519c820c491874685132e6237f098b181d0973ce9582ba7e114ae78a9546410624cc397b4fd01e27be82e8112699a49fadf493490871842927c7aa30c16b84c14d9db814132e7d106530c294535055f14347c78f1d86b508638cfe6aa8091b1f725610321461ce0f95cc278be534aa1f850f321261fe380badf7269a21727490810843184f1b2925ed8dd172d4231e3d78941b641cc268b5a293fe9b0b13711c38725496187a906108d38eb85162e96154f40b6152295b596f48ca1631214cb9ae944ad4532bba0ec2587b29b2abc3e5944710864b89912bab2d4c326504c2f4a22599c908353f512b62c8008429b279e9cf130bad5518eda3037f307fbcc4f8bbec74effd603aad350b31e42751ea53c1a9c0fa60ca29fbba878f947416e6833182f7972a9d2e9550edc16821bbca7e9c6fab8f1e4c25f78456ee4aa3cc9307e3bac82d51425b3e7bf160f4bcdd799797aa454887965a828c3b140e956107930862593b5adbd529ad83412e3dbca9cedc7a4a87961264d0c174f165a636deee1fcfc1b4e1bed6d1dcc2a5580e46577d8bd955da3ed70641461ccce715a247e4a685d02e1c4c55791b3176bf2ac7379852f2527d13dbb4c99d4508196e309d5e9494c3855cefa71b1a90c08dbd3bc8688329447789134a847ab4d860086e369643aabf20630d06d3ab164fc505196a3099c8113b2ed7686d4f122bc84883410909e95208299ee98c06438af4a9e4d9a4d39f9d808c339894ead8ef3956e7b0350f1e0fd811460f0dfc1829d8c163033a7eece8000e1c26e0b1e3c7183d7ce0c0e1e3cd60d2a3eb391e2b88e43c92510693a84fead6b1db316e9c1ce3c60d2f6edcb00006bcb8e10fc081c30212b8e1c50d1c3878f4d8f1c3021240934106938f29edb916513c3e7c7c8e301a0c6519633045fefc7471afa4fd9f500632c460b4cb712409157eb5727561307b2ed91a592343c74d9001066307ffb4506da3723e468f93429bb04cc1e05993432f220593fe892ef1588a8249f642d5758a9ccf74a5810d2818a2de256dc154a594631b4f3005a57b2c7b6ddca897c70e1b4e3098fc29ab0fbb8d26186dfc4ae297a7581d31c138c1db5358a99760fcce5e5bb335a244af049338bddfd5585127e6eff0a101fc612309a638a722e85cd9ab944782c1f34f5a374f5727130a8020070f1b4730a7cab6b09775c17392114cef1527b6adbc2b45304a94c97fcadf3ab8fb3688602abdb1e2794255bd3504f3e587cf0895297a9484404e9e93b9a52de8e1e38718ef6a413067567ff6a9708fbdb16047e206d80082c14c9427b359316dfd07e6d841c7eb493aa77d30bdb0e103b2840bbabeee8139b57c643fa52b6b877860ccddfdb1dc9dd424ed173d72bc0f2d0bd8d84127529410baad723d2e810d1d184bdf4bcafde1937e6e47056ce4408b91f76534ecb64f3858dbf7c4247bfa8de8d0b27103636c97c43711d361c30668966f7687168997ad816b7fb927a6c2290bd9a081297c7cb88aafcec254c12dd8cee994e654b230aca82c51ecd4669f3c16a60d153a9fcaa8e4e8ead022b030eb6eea878c32a52ee815a6d0f31c952fe474dc1506e595e553fcd22263b6c254617977d262d7299d1536a0062b4cebc95a553e45e598afc2a44ace6304f56872d6508539f7be5498e3cef87d4950117c820a7399d5968aa4e4f97fa7305c482747e5689bc254a1bc8436292985294d8638b7ecadaa954981d611a7fb4dfd3e7ae4781e3bbee0b1036b8cc260f27241e59cebe324573fc600831950431426a554cbdbda6d49d2c9e1a3478e15b48fac5098449b2559417e50183b55de587f3491c4fd845172f04962d259a41250c31326d931a25cbb69c4c0b8ea8441cc8b2c112972501d7528278c3f27a95626a55d52f5f8811da8b1098330f93a3bbaefc953ec050a50ffc8808f0514d384495f859c773f972ad5eff0f183003532611cd7ea1ca93e4eaec7043530611222561a3d218a0ee9f4eef145a97109e3bce87a90fb31a1a52d4b1872cab57e1debd2fe54e2501734e4828a52c2202254949b8ee63ba3496422ea537c477bbcf0a22c06c00a3524916d5aebe54b8e732a913067e6ff08d9134aa4051f011d62b403bc68818f1e60fc04b4f8a106240cca6544b8bc9fee0f070e1c38321f61489dd536d4e8c7d1d611a58fa79c92295d75a0f6a21185a30623cc1e3d7cc5c9c832a754eab250631124255f215b96861a8a30d525b3b150154a525e65093512619c9c3b251135ddc583a48a500311467def2c2acd64fbaa09077e8cd1a3052d0122d43884e15d2df4ed1a400d4318a28ef2583a7cc84a6f214c979753d985d850ca25844195d0124b2db509f90dc27026d2fda739a5c65382307e8e1df2fde7304ae8cf63053d72f4f841017cefc103b74620cce31b26522701c22cf6f15a2caf1c618c9103053d7a7ca176811b5e707d515450e30f66dd3adb4a7e5af22460ecd021068effe2f40f151004410d3fe81d3f89f5b20f47b90f1f175d7664e4033162ce45313ffdbfa0c61e4c2f1f2f4d5d7655317f50430f4813f51a9d9da72b561298c016dba0461e8c966a67cd2f88ded58d900703ac6ae0c1ec17c9b2ea5ef6e756f650e30ee6de8a92fa849957bedb50c30ea68ed6692d8cb6e4bdcdb8461d4cf2fd3cf578e5a778c3c8f1a3ad6bd0c158135b4e4c3a8d144e1d5a24a83107c3aae5a0b4940e22a6c5e460f612e27954362f754b183b5020461c0c3bb6292a4cb669da3ab448a971a0061c8ce731474f68fe88f9cb1b0c226f259554861ca99230d47083210825c67334f39c7bc951040b35da60f6dc972da4654922a86f6840023770e0b8420d3698fe947fb8e5939aa51346bf036e7871e35db0c3046d811a6b307b2959331d961a6a2852bc53322aee23a635d260ecfc9a10b4b607a88186f5b4ee44cf609693263e27a3066a98c13462165e91b70bd42883b1b3c8f458a16f3984a506194c39e364e9143d8c4e2a5553630c069d464e87b42a492aa544a08618cc22b2562276c4132daa11863c755885cfb2256ea006180c723e399af652ef59d7a1c563051d8618955f30bae7647617494504690d2f184ee879b40ff69d1ee9f183c70e52d70573c9897cd6cb95c4a23a34470d2e98f284247b47f6c47d7e0c3072fc185fb40ad05250630b85cf95bce59a5c122b6b68c1f8396f94d0398f1dedc38b478d2c982e549ed9f54bea3f8885add37cae31bffdd2bfd8a1c30b1c382c20811bc400a0831a5738a5895421924e1303a386154cf9e2b7da8b5fd4a88227bf4274f79c1692a840907fe1fe6905a1c6140cb2f44d92a87f22844f0a06553a9f08a92395582b0ac6ff9ccfc9be46574728a8018582bbc5d6a83c411b396216d2ac091daae104a3f5a589a182e59ca46f8231d26d8b2993ef9dfa13d4608241fefe856ab88b1a4feab2a3c6128c926e945e9db80e2d1fff83c72bc19052249720440c912c9b6a24c110fef6e4a988842bf3336bc289cd521d0c6a1cc12445251d2392fa358cd099b04bba222d656419d42842fa5c5e539474bd356b10c160523664a81c77d6f7342daf310443163b7d3a89137e419aa330a186104c1e26e88533fd7fff8aa046100c3a98ca76aeb14f5a0404237af6783a45ba3ca2c60f5049693e7aa41c39c478efc1c37e8c510107e0c0518a1a3e30e58aed263f6ef5942c871a3d3088912d572a44b20d3578e027f17493dfabb103735ced77a8990a57971a3a3087943f5458c9a73ad960e4c033d4c881d922fda928fd19e1e339c46852622440af060e0c179e3f9b87d00b356e600c0b4a4793f74f178cd72ed4b0812949df1d6d6abd638735307d8f4af9ae4e09c9162ed4a081b947c50e2a09a15e4e3486037488d10ed02146ebf8a27d3c18af230c830347de2c8c212c52775bd29fe6781e3dca6461f6bfdc2a7b3ba1b5d6520004390a402316e634e194a7240b18edc3470212e03c3e011cf8e28b0623035f7cd160dc6981062c9c9c73ae5675a0463edec7991368bc829c3346992e9bff920e2d41d07085e94fa7cb2e73db772740a31526954ed5a893af0e2d14fc8b81ac30975c18d7ac6c17dbe34a0110e470008d551872cbf9dd4fc8e621c80c345461521f4f24d1e5a9fb16038d54e4a73921c9ca5ec1da916305ed637d40031566af12a7d3acfb76ad5314219f09917c6cae44caf0950a020d53986754b9e874fb90d26c5da0510a1bd02085d1c3a5df13ad9fafd71f6f82bda18106fc0e1f1a50c002c0a0310a73c8dcd2a33c2d99ceac1c804301bfc3870670e05851983aa66d7fa5a450183365c2c5abda9af280c2f471d7bf72752539190e1c9f30296d4a694790ed1cce22030d4f18d47cc5778e36a94d3c061a9dc03d4dcb2ab897881c6d25f6f5d161bc8f30d48b0caca031b0464c063438613c51266e4d45a408343661f059f5a04bbec4451b8940431366fdca7dcf7163d2c45a9076fc48cb8471cf52d4fa6c75685565810626cc394bde3e1124df098b0b342e61ca2effeda87ba2758e1e89c7abe07d9c95818625cc2112c4e8add7d27d791f581a584163a06c05ed4302342a61ac5ac92a172f57e93f0337bcd021463b602d8c06e3980220c801011a943097cb9588a6ddb144476312e6cf27c9ecbd52aa3449c258d9fcadae258ae552240c97826765dfaf58c9878479cfe244ae6f8d6efd11260bb3fc68e97e270539c2a0c2c9bbde11a722db8d30a8a042f3fd466ec66684499a276d62b45e84e152d85af913492d164518ab5256a7f510c2f3980853a5892343a99e5069448439dae8ee0f3d514be50e619e496272a2ae6e9e9a28a061086388fbcb56915408d515c2e8b3d55797231f4a8430e90a7d4a6245cf6ab11c5961f4040c01340661fadcfe97453541d457f24f4ad8888f1e583f7818b3301a8c3b340291eee4654ad51bd00084d1f8c37d4a45be7ce7eb29411a7eb0e3c8a4cbec35097a0660e086d51a68f4c1543ae5d3c9084a528ef1d841830f26c9a52dafa6dede227c008d3d98e2c76c46ea91e2f1530ca0a107739e144c04a1b742d7d963051a7814f4170a1003078e1e87041a793049c8f1b3766944091d1d8a85a583061ecc3979b476ed088d3b9852d4515d794b72cbf3020d3b98279e14714d6fc9b9a4071a7530b9a5ad7f38f921beb581061d8c2a2a74a9eed892b3c6061a73305c5e5910e97477d2b71c4c171a274aac2ecfaf71308c0afe156a42e868270d389874aadd129d722a914f1a6f30dadedaa7ce6621f97783f944333d7679d2f15687968e80461b0c13b52eeeb7a738f5d16083492d788ed12372f2d3d660caa1dad4472d1a6a308e8ef20e1d9d278eca6909288d34182b9dcbe98d243ddd8206e3298b35e22e2bb682ce60ee971ce6eb7ed5e5651c689801d1b32e4abd153c8f2a1c380a216894c12cd1265c96d16c097fdff0e28617371270430312d8000e1c8767a0410693b8ec89f82989bff60109783076fc00038d3118f4497df3eca81da72406932475e26830f6769a9c7412f14e5ece60b42f29625732e24ece0ca690b29f71225e7dca3298538de796bc351a9223836947663cce047dcbec6e0c66f118ad58b1c6d08518cc7e215b5b1669921a06431a4b1f8408263018d62c249e2a1171dd3318baf8824956f4641db7a0dcf35e305f8a914709e5915474bbd005170c237a3b692451af276aa18b2d987e4f462959d182297479da6e87859c9845e8220b8b09392aa6a89073ce16bac082f1d4af0879c1fc2cd2573055f80ab25348ce1a522274618552b8d8ae4a51726433b79817a5e73d5cf9f758e8a20a260bd62772b96fb1bc2074410553f9dcde958974895ee2144ceb63d944d8fea04d772705a3c987dbeff93dd7d754605130889435bb6bcbda4edf0514cce27aeaf489a4271845899c62891482e53b39c1a89e7a4177a834e23522852e9a6048df1a263c8fd08f6d0a5d30c160113d89b68c4d7fd112cc23ef849a70093a59100a5d28c1f8923ccce8709554971908ba48823164084b62941a9b5ce1c08103075617ba4082d14aa43eaf12d94545f108c60c791d215e756104d3cb7b5aaee9b5ac1626745104a3e7526aff3c448fe5218239d889a4df7a1e82c9652497484229953a672ac8612ac8c15d08c1a85a21e1430a6f0bba0882c13da478c976ba501110cc622162440941a5f6f507864faddef20e2654ba74e103a38eceb994be3b11d6d403739bead57c51fe154d3c30e9f718bb8dd4c9837660d26ef7163e483b9f5f0786f9911797eae7c0d8ea4959367d5b36e3c094ad73775ec46f609e28b271fab781d1940a69e369c452e7d4c09825dc93c7bfceb4ba0b1a98f4c94792772be22fb3309d1615d5aaf2e91861599824e989d99525457f636196cbf20c4b49bd220b0b739c5dd3d77b798571267bcc15062194c9b8aea6c50bb6c21cefd2c87cfc5861fa709395f3534eddd92a4c32940911e53a92bda50a934ae192d8a79718499b032e5261f4d06149e9adfab81415c619cd0eff5449a5e49dc2ac7a1ed29ac8712757cc8529cc21f69d3aad3ad1e7be808b5298d2bec73f5f8c49f196643515df744b0110e4500117a330b748f068c96747b72c463117a2308499b9cbe9e4a1302479399e5bec10e3d4a030f929799f438ff64ee94f984fe6a9b394145722f48439554ab1546676c2103c54f0d4f1d3a4cb09a35790b359d242ca966dc210a48548d9b3ab54b65613c6fd8ac9219b7afd138d910963c88b31c9fd8409f38920b27b07a13ae87e09431ed7b81153f13a792c61ae9336412cecc70f57c2a85bee4946357e46a684792dcca8d4900f6fdf240c2e1639b6ed250953ca3946a56ce1f3ad2412e6544a7c72d45232250b09c38e8f78d1ad5dfbeb234caa2bfd848d312174ea087388ada43b5a8de494d208a3eea8e7aa161961bc58790f134afc9db508639f9d56c826449e9ae8e14211c6f288b5716e39592425c264712ed6b79c4e297b106174f708fba52fcb5cf210668d1c52ce25cf10a653b1df26e4b417c285306788701b7ad2955eb92084397afed5cf16e71f498330eea5d39bd7e9f17358102639efc17d74ee4f6803619212948a15f92cc4a880305b74499252292df7297f30484af36b9bd30fc60ee27127680fbd2df6c1182284042149e3734fb8e083714e9c1cbfb0ead0dc432f2adcdb2c25055ce8c170156fd4a98c502ae7c1d4c94b5faf96af248bc78efef13e481d800b3c9827f887ca8cd0154ca8035cdcc1d8d559bb2a516bcdb68351a469aa44d3c147c975684d7bd221f62d74307d4afa82789c6429b23918d7dfbb3c3f85f66cc9c1fc6a2e323c290e868b6b11c994ae3093c0c174226d85dcd8d688578716c7808b376c23513bf54d0660e0866d10b8704351f5730ca582d68b29b6e1d8503812176bc84f3b07997b22cf05065ca8c19c15c53b981ef352b948c371818633983decb53cffe80dadf2e0c20c65e0820ce68d98135cac432ef975687106b818031762281c18e0220c25792247b780551bb800037a629f4ab22faefb8239bf54e948d0293eacce85170c07175d30baa756a8ffd38ef51817cc17e14ff6bfc52e9d70b105a38794bb9e4ba405439e90440eb29e2c982de65dbcfe0b93ca830573fd88f80aa6129d645f1172288dad60ee54c2f3daaaa8986e158cafe29e477dbc934ea9600c8b1a663a2a533057fc701fa6c4cc868a140ce2d2d2ccfc1905a3e59517b97c49de07a16052e1f465316d7982719405afceb52ab19b130c9e53d5bfee4fcaba0986a433d573ae3b7ab4b86082b94ca99f90de5f8249bfb25ea7da9e7b4809c6fa3ced2784f810469d0473a4f86f3a799f4a949160fa2064e7a0bd83be6f4730ede6967ace13d721c58511cc77a72bc764cc45118c0b2218bc6b573dfcfd2c7b968b2198c35eec8a33cfe9b2bc75e04208e67893f3ce635ce93c291ab80882d92b299d929a4b3f1ed601174030598821a394ce5ebef20f0c93948af390fcedef5e0eb8f08129eb26754851990978ecb8e1c50df4a32770c38b1b3888e1808b1e1824c44f4fba2d073dd31909b8e08129e9285ff2ed4e52f8eac0c50e0c672a764e49fd3a30bddbfc05a5e7c090534e77eaf6ff727e70602ae927c54267d50a3937304ad239b6599738eddb06061541c83e59f9ffb9b9a88149ae7bbed694a0b4ca5cd0c0f4e3ff9f575eab559d8541e6df95672a0b8327557af26b5c8dcac5c2705176ee2e8385e9fe4f6419ed10f373b8020ab0f10a539dec59e7fac58edb1526b5ec7a5e210551e96d85d1934cd35d174195b4b0c29ce3e933da3c26a5e02a4c71db9252e496111d55984e2bb9ba488bf7a5c220397409e95a4187104385f1f25772d01f611faf531852a98d105b21bba6c914c69ba472309dbac472bc14c68a687be31f77ec6a5218fff4c66c844effd78dc21425988cdf505a73335118accd2c34dd0a8549750e1a4a85adcff10185d1447d1c4fd9d1fec4363e61b4937da7bb69199e270c3a7bfad4e2419212f94e9863a8ce06274ca7674936376468d7c6264c2145b2d86225b7c3c786264cfa797cf7bfbb53884fb09109574434ab1cb53ddbc08459edb292240faa335b1f3d6e780106f2800570e0402c281b9730493a9597b98f258c22ff734a1b63f2835a09b36f29214feee83115a2432b058f9e035afe60831226f1523282aa1c361e96828d4998d3e8f8a444885f22846c48c23cb9245d58b687534148b01109c3d59c641b0f3944cc06248cf6a5effa3b7ca6866c3cc2d49e2fd684485dc086234c4a9f14217374e5d0fe4d7029b0d10893d0aa8bfb693b87d57a78f5b0c10883b0c8de651fb63e692810a327c017051b8b30fa25df09494b844abb0d4518bb4cbf77457c885c6d24c2181e3cfc9dd4309f30220c9e93f0121a56af351ec214a49a16a5661f0c3084e14347a4aacfc536dd033210c618fe0bf00f630c7fe7828d4298a44dca4e77499d5cab43ab7afce0f1000da00f2303387078516c10c22ca3e457bed69860631086f8492b7f88916b5b2208c3df25f716217ecd4f360261d4ca6142994f1821260ad8008451764d48bea0cfc6471b7f3065fadb6e79aa84c1861f8e204f46e54c57d1c7f3e0b1237f60a30fe6af93277252a95492bc8e60830fe69195543a112dee771bf8d15f3000070e1effe3477f918a60630f0679baf37934c5d2c46ce8c158ea259aadfd44af78d9c8832917dc2359aa4a7a4ad99d69db2fdb47d9c08349e5d592488bef6034b5b5bc30aa938ed20ec64f39443a15456997570773ac65ff7277f3942345041b74305ccb5958fa768e31cdc1282a96eed6658ba54a7230ffe6e7cb895e39f58f83b9826ffae532eb4b3f1c4c724aa9da9b90635efe0de67c237de28f2e7929ef06e3bfc90fafdbb5c1f4a5b26548f2cf2284d8608a286a4ec70b21cee5acc19cbd7f42e85822df78d4609e09e7c9f39bf4de4e1a0c263b5cccea4457d3a2c1a0ecc7b44cd4c7dc3d83293c8fe4b524c7fa5c3398fdc476bcd1b50c267579bc275e8e98aa643068a5d293214b8aa59431984fc9180b693907991531983c5bc7cf8c4db41cc3600cadaee31b1ff252080643c82942bce4ef0ba6ce9e161f23e8657c5e30f99ec452ffaba6dd75c1704ac5da7d23a67cb86092cb3aa3feb52d98cdbf3c5592acee6b5a3057c8dea698d887ccb260ce93375b693145898d5e0585061b5830e828e163e59b5dd05ec114b4355594a79d39cb0a26212b4fd9b5dfa57c150cbe3d2a053d51ca83a8601a917d7af653018f54a894d025335924100743c15010c4403cbc6d13130000100c1a92c662c17848268ccb0f148003543e2a523e2a1e262018890503e140180a8501e180180c06034261602806c349a28751d20310f8b499e19b9d6bac49a2423657152f5569d5e3c380512ce05266d1bddd8312c362bec94777db72661ea541b2ac36b3d306f1af80a70ef03dba974a6be65752e034a571120bae82e15cbf6eb5e1d18b8b7d6154f19942a700305298cf2e3415a7267fb2961ce7e5e56f2d1d53f4edabb0d3e32e066c7a12232aab4beb137361bbf130dcf1390fe5319d83bdd9537b6025b91e92be782e07ec432bf114e140259fd046b6fab2a22f3a7e06f1d24f435a69f112f44f9e7f906520d8e9a5a2dc07813d937072cc0fd3199897d87328dfce1f6e1f6a861254fc2ed413e7c7a5e1c5229016c2f828b1a9a733b70de650a90d572f6c73a196b17fb05c8db0e6402a0bd6f05b872ca89b00dbddffd5b68524d40cb97695066edb939aa4f00a09e6f1c10a9c856e64312afc5e1adb219956da22a50ac3a67a477f99a43a9ef7178bd5d75a361e08a77379d190bd810b622ff7c671dc052494eeca73c9adc552ebbec6368d3918eca3e642911cc289dfd627fece88620e53aa2f87fad6bf6fc919121d98234ff8b1515ef24a33fae3c07196c2ff76baac70d578fe92040146a16e358123ef8df6c684c0b16e420346674d8dcb9ac45af489a6189a4832f5a8bc3bb76ce929b07e326f372bf3f21f455e5b6b0290e1eec65e6cc5fe8d645439538fa8c1465ad14a6bf2c1620a41ae8c6a00553950493d2386564935d5e9a8f2cd06d5b1965aa59a6729631f7807769268858738a4c4a6dda019a84a0ef5e459815517ed0d05ac5346a7cd294869dee33e01d11e8d836296db82495eddec12b10e683e3deb459a05b37ba42c79b44f1da27cbaeabbc54e4706099767991557a93dee0a07a70d058ff86ec48bb1acb54a39af575cfe598f2d6d61e9cdc773081d13b51c68340462a8c5bcfc611f15eb58c8c7ad925e962e938f58e5a376f9231bdf712310c02cb86e384438b5385bc9284f3d7db9d73445c3b40898941cf78d6ce1ffa37fb214c5de568c3dfca68a7db66adf664c7e84dbfeb905cd1ce96a5264ca05191612a54651311f061b891055b591c0fb2200155011b0ce43134029fb3f005028019445046f5705712b21be2accf6e52206e0ef8e38d9fc78937c467586bbe0497c57751f58f907c76d3a61d3349ba66dce9ccdd8df06e383cf6dc2c566c6aeab5ea9c7aca650ead4c37cb60b1a56dbd09bae6198241209692381d0b761954cd2fc2b6a478d8483db0edddddf3f0b8d5279a71f7b3a4c1a3f3a0d52d0029b5bff1a4a6fbbcbc2a5b3d15cf7261daa45536d6427c256a4b7b4f2eb147e3e71b59535edfae4bf4b5256c21d7a79e966e933983921f1be0ec1e111ea3cae8132e18f5b8181c0b5687972090bd9c5d9722346b2be794fc7c3879008da71cd91f6564c9258db5f40b58bc9d26bab985f46598d0cd6854fdb0ee72bb560595aedb7cf488a53d5bbef2a852d0673b671f076a6c4af980a645b4e8c863a0e96640a64c78e2232e174434370784c61e35f96174dcb54f7a823385adcc81a612f4636a9143b54cf050cbb38a062ba61c1648392636b97c5e2972ee0fe25c01c0f4e2c871d25bc73538d344e653042bf476ed8d971368b34e5739ad260e9988434bd9beec966fa7b9b0c62ec605e991c665ebc3901172e8e862f602ac89cad4f46647d5be043e51074a76d8b08fbb52c80d6af0c78cfa4e3b1a4db49896b0afb556af762711aceeb0a45e94a8bbce25085ca965cf59432af3a11bd7823d4965a751b7b915db0c63c52c9dd869b642d9f5051b4468b1ba404c19c80e2d28b0df68d3b440ed19d21d3239d64c90fa8832d2566e7d55f9715a9346e58b23f6727f5a6b5e0ff2e6789c3bb9a60037b1526127773261668a3aae671275fcb71fa47779967121f1a97b2cae77456676ebc1b4639a50153a22b0c8cd0b27072ea0a64a430036c5b451c4766100855e6269830bc00c351cc090e892760078d2905276bb91950c0065c91ce663266ddd5931585a07a827432558fb4464a4f3a4181466333a5b0b810d0993edf6e0a9a2a40020e3184b2cf5184f54e37f76ad388e3b72bbcd47461b339d8a51a92d097d5ae450fa4e32c8d36a703c96e61a3298c4c61047d23298b4e5b44b48fe64ad9b34c2023813d8e76f522c30c3752d77ddefc93a7ddc199c30fddc4a2a7bd1038e4e05ac166817c02aae06052aa4294396ab6965b5736b5590281e384a690516894f2028399cd7d0bbea4106db01981bd891e648a7a2aea9ad87e40d7bea36fdccf3217bc0e994ff290e0c0cb60c941029a8e06e238a0e9665d101bdadd546d0baa4a293528038af25c73199f45655bf1d8734a5e060cb55aac4f0d1b93ca924d2cd78230eefcf001b51970671fdc72535e08cfc99c72a66bd357a1745a4c7552e883c3c0abc67b343e457b3a22c29a61ee78c3a7efbf8fd3fdb37618088746246e03d1ec6607188179121cd9d28156b122a69c0952d52f7eda3c751c75b331d6f3b82953b7dfc41f57278c09e3bb74994b5cf36dd8189a35ca092b8893e22a3919e666ef430afe86b59c35b85e085fc03f85650062130cfd45e46cb653278e54f94e2ed4aa4f05897762437f48032d1f1266e014e5c341a77368f51855ad204e99c684388f7db0b9594800e090c6d145d8ef70a71c1bf8db19601e19819dd4b11f28fc2222da55eb04cd7489e900d649c0ed7e1178e75d505f6fe2f69afd762ae9577914d638f593f6cfac05dc0c71d36d4e0c156175f171a57c5272f426bdf93b6d5ae6b630bc42e51307f6ba7d72a704a90367b59fe738f3630d699e56d84d02da54b304f8498bb5334aae74845f6110cd0481c198e712298b37298657995ca0d4353af8f4926d114a3865065b4f7dc57afc1b4842bbab1c21dee2807495908c6fa3f6323fa7047fc0fcb0063399ea6d72277a0790dea6bd710c09e468ee9f3606679f76314f13bcd7ed0f2f714ece14dd65e85475e7a3d63b9d9af7194cf8f543d8300f202c8d68dd9aa20837c14b2bfb3c2904752d403a5387efe5252d7af1ccd30142e6008bf107ef3f65e697ee696e7c75f860cebff4b865a2ede1fd93a222f42c6720729d7ad59bdce495ee5d9ac7b0279b77aae28d70c11162ef21cbfba007a3679d772f8f8ba770fe3626ef665d2079aaf5f0f47cf3c2f25242bd09114008e5dfd3cbf3c52fb0091f1b315214a07b5479cec37b7a47802c5c01e668960647181d85101c078c47b833a25347e5e55895076977d9a081fb483a54a6f0c6051e965182688cdf9f89a98aa2bcf117908fef69de2acfa7bb66025efc100c2d46c03055452898b990ec20698ec4250e06126e23ddc76a7720822ac22ce6d1a6b915c2ebf4555fc69d4743dc39f9040664a7247476c848dc11dbec2386721713445d2b1f611a1dd78216409cc6e2d3da6df6a8aff2d1e4c3e59a1a2f7d143c2b35ebdfecaa10d690eebdf4c7c6a03218d74d0e53f6e227d72c070dd329421c9070f100083d2fed8df7a627a46a741a1b06d106be25b990de10ad8713de0c783a66b3fc6a20e90234318ae816cf0f02cccf8b5e6fde327459d8cabc8117f5c640ce521091494731dff2ae38892a89c34b9c21dbab4d999fb699b077f2562435f17d42a209a93cc046ede4c80cf046f6166945cab259d56a0a477a78a3e0b009fd23e219bb513fd462b9db0bcb2aae456ddc06dbd38ca260a65ac13b50fc71e6a08f16e6b81bcf426a3334d41c7f5524526bdb3c8430bd9c50ac2eebc7fc0b61aab2cc5e9c16ac485417bde40617814c905bc7bad1b9f93b30f705e8cdbcef093c25c19fad8d1885694a4df2615a5bd0544c481c611ca3d6dc08f0b1980fb1178412706435437b95314ff7ae0225e4f7f9a893d98c95460acfa0dedb129b3edcbdeb64e298d294fe9b9723734538d1a49a26543759017503da47c2f2e402c78d9ac5c721691f292ba2433df915acc2a5a652d435ff226f89ad82d4a878246f4ccc279c4be5ad07949204799bf328845ea2ad218cd4da172d75168e4ab2be4adf32f50a5fd6b15027a5db36b343c4db31edfcc996c89ea87c29689c58b48cf46b72312f416d11954b3626d98005af89cc2bc2ca34d7ec882407214ba12a8773f95dbc1c0ca646295a83f76c6c3019e03854150e5ba115607a56b05ea97711bdc3d805482284d5e74ff2abe116eab0e4a943b9351d39e41c3f29f6456b105507681b5d6a5f780919b977483365040d368855885f2ab46e5ac8f29e11e7f324bc82a1f64ed01ec4f7f3888c665b34eb275bf068f9d3fa06b1e77dfe69222412dd15bdeb2b08739aefb9d10e5017405806fe1a3a6484b20b6776ac3db078a2fb7fae0be339fa5c6cd936e2ec390fa42de5cc339d5450dec9f586acc1206e6ff97819e2a30ca29a71be3afc18e036b83975a802f0ef03a90db6fca0b9864a36251679b5eed17f5f37fe0c8726cf9df2313c6a54460a39cd6467e4fcfc0296a78c692a0c47b825165097ffbb2a53de36693a049e6adc7523eca6737748601e4c35cc8033909ee502852ed838886048b2664f4744bd9d5809a486ba4def9cb6be5021e71775e544a7e060e8dcab300ff427501a1e39f0cb0b823e73dcc07eb714820a686ec76795ad0dea05105c66fba636caccede7c3a0863dd0688dbcf92de66f7b2c33d6f23dea12042173887d0b43dd1676850d0100dedd02b3139eca4105b64c168f2005514910058144e34780d62701c2c925bc30cd85fda2e93fe37b797630b91fbafab1181630e70e45ce4b7efdfec087fe31e5134387e865fc4e47773629c01e90f477414134466d0a98ad5a0ed8fc41e8c81eb162e068c4165027681f08d9a9e0e78e3f25000b2b0cc546cecca2da9eb81bea0d4dcacc814f073d9e8efad6e26dbbd7343421caea293fb2aabb615866d670049283ded9b6397c5df0c339c84a72e2e29ffbf6148522f74febf91f269490a1ce31902810967cb0c6508b81b068ec4b280bdd009301807fbddd0f84ce622a80f094dbd5868dcd214d55414f685bb6976eca808cd6c42e16d80ec3916596da24c31a731cbdc80aa51caf6d1114aab44604657cfb633ee1ba910b4d314304acf879c3498924d1dc7c48bd986307866a9c9e3991014dd752883c08c932831ac49eef518c87998a08240c44a27c596959d9b090c6056d8744f4c605e49f31c38fda7a3c62411750d95fe157748ce7c868c66cb1025121e0645dba5cd1a8b6a08c5b8cb5e3939d0adc4f15022c4c318065463dabafb62b9a8f0f20a7cbd44c86c0180b187ab22f98a7d35b4521367ac03732761288bdc36912a2bfb8d0c44b9d99d93406276b558cdee0d69990c94f0cbd866d6dae13d2e6ece317134f00e66fd08d0dfca7cb3d1ddeba20b62627799ce4547e1c99a62c6f1ea680f34adcf213c55cb5d5aab3497d90ac89d7fe461ff59fd3aa7994240d9860e9b4dcf59a8fed33825f8e4556d95135b69f7c046030c5b4c342ac20a11a5da9d601a45f1db42e503327c86ff24d5b0f97ce45d6545892926ceec0f441b11711f2d098024833dab0f26c43fd535aa41310754df2b0137f55ace97e0a2b113b52ceb98a6faf6a6835c2e0091ee48b0aac5f046a188e9447e8bcbc476914c73a9712d4e41b155cf2e1d82315efd519328c0a5528671198d360fb249c04db4c0f328a583a0528394b019ab63a8c017ff0864cdd3cf53b3ab76d5443dd1750cf806d81f3706580d1f107b29e0f37347909aa5e26ae36c1707c8cc1167feaa1834c25ffae7ab1411a07607604c2b5d978cdf51d03056e41e0ac6e3700ebff0fa2fd008f6497133f3edd116539f66d296f6cd25aa5a284d1e3b643541bb18812092ce7cadbdaca3189ab97a601317a12b3a3f29e47f338c950accd3e1079629d5dfcc40b06c87d014747413c83f02a41c59bae590fa251982e974e0a11451b1219c7a3c605dc7287253e29ec039d5127be398228ebb4c2297907c0587f366a7d3406589ed8b3ecce89df6803155098f5bd3e40692a99f0a0c4ea0ebb12a66175b8b488f1436761ba9336a2b80974cc89af07fe9cb0b53c976c588c12b69ce5bfbabd172994d4086b48f80ad80523d82f70a73028ef8dd542164bcd118a2685d650585cc11a8e57cd63926981851f3b0d49559d7234d3e61ff8f3859979309be98a9cddb78d2b571c5c622b12b2b151c6bea4adf23a42ff101393101ac4052628486987c0ec47df25532e40e9f931965e3b135a1c3f543752febad0d5bf38e6eaf8bd584a9d5a348bac32b5d5939ea50a29a97ddb46a2b52bcec65423495533e15c0c75f35593aab8ab1259031bb07671c8ace71996be3668de2c1a15305bbce4db594fd410d27c9cb89ec304139d9d168e2ade362a8107e8f9f3cbb63decdf4a23f875d88e9625839de55465783bc6d9f7c721e4dc844b60e3a09723da6e3c0a76a2476027ccc3b3ef13b8fe6448e15141e3320369b440fa52e344844a03218067a5a0f435026870307a8458508fb9e15dda2bd52d9dd6dcd2312606bb544680847e57d571d8e71ffcec94ae7dd6097a2cb3716a4fd90bf935960d9a44b175a60d794ad78b757836dc7e865baf5e4f531de949e70a1917932503588819d246b17e5b798d75078569fff3a30cc8c9c52f265bca384b3eb8aa02fbd3e85e110c92010321d72040ba517f729be6cc8fb743e4d429855278b501c285a453497fa9fdd91425f4ae34f18dcc0903842b425cbf862511985892c0464bf1bb2d5cba68f5972992f0992d9e50b04cf10dd7904942214bc8ac2a727dcb8740d15e0f3f14f24b5c88684c2413e847c330d2cb6948a060bc7894da9ec75dfc80ef3105a05d7e8020f30096af6297179d876c20aed32ddb4706c4181929e9118fd7411d03afed58e614760625bca38e3f60eb0cdc129e6c134c541d6934b4b52487d7d570b023d257901b82a8328338ecfeb2097148fdb0863e38820dd0a3f5b60b0af72e2b301a1e3c030be54dc341ec81c232920ae897ab12e9d037967090a55c0f033d0a2a7ff9945260d61f7bc5f0f08148706a80643ab38abc4510424c024c48804680f7263a0fd3906446323e5a6500f3dc922a6a32dbc0712c2e478ebe597a430cc7a4f29051a2040b4c88210155970d549a4e0e891ad23cda8a26a5a1f0a4d4028a32f9c0cdec6ab8505f2aed1d01742f20098753a60c990e6118092870418961c58ab965b706f4d7d3e854407eed61b33149e9457b2aa8e2c451f5eb4781488dbddd5a7193934fd0c159740075b7ac5492f841473d86d18d4c1b4e3d6692e6d0841934e7836c80792d548edd89a8c72e5a61c81412195b586063ed5247926e772f5e29300fced024a689d8623752c4899345af69b5e819af4b6add870d90e8632d4c1f87bd25163e99b7bbe57acd0e352e6a58e652af0660fe91e25fa0104632df225ee104899b219d7df565c78e5bf8e7274153dab03d1436760185990dd1f249dbafcab550b959b4351c3c318c638e2f3b48a415a546d222249ebd1496c4ae90efab227bacf0050cb8f1b59f2b4cf8c21ac9c6884756dc49db1c7d63347a110b2dd7c99e41cc686373898a7e4bf39b319222f43b5d2d9a7bcd364949940269f98602980cd64bc63a259d0935407463267a9f392da6a7a6aa5702eeaaac624efe27d360d4158b086e24ee243c3bb91499fb3dc7bdbf2d43c22d42377305136f0eaf1f2120615999034c798744bc8073a4ea92ac45118dbdc0109b51570c7aa8c68f7248ed8248d92644e4cd19f80d5424b78144392b80bd0a6a2fa26647cf958da8230d6a49751677144f6b8e0291f8b0e90446794ac942d30d04a1c7c138b5975183c9501e9b072e9917f4c88fd9e8d2bedbbd26f1cf42a1c1cf6dddd65478a22ed63431fb1a4d9746ed8096a03da7af7519ba4da9ffdca676ed187d92dc9dbfcc10004c8daf7aa631ebd253df0d88b622126d13db3dbb57c50eb6265d5cf16fd9062cce13f275b87e5abad6c7363112484409f79b518e957bbd1b205b0f7c16165db760f03df9c44057a28de50c200052136e6a6ebf7b5a1e2e527959345e9f1cce5d92c4e6755df175fad643a462aaef562b3d013bda9896a47fa054a80ee8bb84237d6200ae9482d1ead57c369e5aee13c2eac391aa268d22fc0938336a1aef967827095c2db4dca77fba0205af57055f27c7c32b7886d72bd513961c7a274909a428d7ae788e72661d24a9a9ad47d42177112fd570ba2cc62907940a6d989ee44efd47c69ff38da1e400f76f3b991171de02459eef153ad5c8d574cdc59e46c0fbbe4a3473b1ba4e326fd71b538f07ee2ed20cf112551efcaea61bcc99f856f8888bab78afda2bea0ea28436dfd2705efd2d503c32d95527640d46b809c69ec016019e6f0f79e0335861592e6b90bc1be1600123150ccbb6267e5d71af0ca5eff72a282acb556280d979746324e182b71b1782e422b2b72c0fcb2c7690b8bc47b08843c1af11074c7238d3caa689e69743b9435e87904126710f3795b4ac6f25ce0a66486e86d7c81618832acb52cdcf162c34c336aab183cf12846f1b5e4fe956f250d0ec437e55874e21058955ec5f22e89b03b1530ab68f1c4245883277d53224f2dba9372d4456a3be07cf98cc32c414f9d70f18d2de61bfbc6270528776d9542c12e1edc37c9df0d565c818bca6ccaa8f5467e49498398ac4b6b1663aae2f182b2b61e4b51a235f880ec5193976956cacf33ff4862d521f6903838aa32e590419315736936f442f74091e9312d1df638195a0a191f2752327efa417d1ae2f7276569be2b4e28deb8b4dd45dc121f9ba3d142850a635dd5654ee704d0e3a295bf69a7ed65fe79077a7cf3b76b318acb024097520d505fe5aec52d5c08d490cf4d613749a5383110aec14c901761cb056fc74f3abee5d20208798181aa3e28d39e4f18870e9c6d1d6cfb4782d672cbb3f8ce2b36cceb7201b7175266ce1bab62761aaac623042a67c49a5a2c1289f1faeed37ec88d57cb158018ceb9eb4d15f64fbfb4d4d64791de7432c0a1220851797cb4a632813b94f088bcbcac4abe06e610a4b1ec39659868bff25fb8de228e71f5ea540c7f8a1fb69a0550a18dcdadb8a0ba611635627746b45baf1620bea216b2613641ca3ceea465e215953679768696de92ecd38aebb2c1805bfd615c8657440b4ea5975566bf26d3cb19eb9eead9b91cacce90ec5c0771755250d1cd2fde39803648d81352e3dafb90a652d4b5af7c3190fc82873835b1a31d4a36a5d3093531ed615850b66aec3b5449423be54f17328e7a16127bcd1ad4cb304dce5955dd1d011d8d15d46ba4892a263dcd9be86562fc78151d32e491bb4e3b3a3596efa1344211afb9d5d0f205e69840f47f37e12e7fb7bf5735b8599d722ec8193241838f828799d5f5378e43d06aa7aa315f2b0185219ba08e563f82f4a50a32c8c6d7d48d45064b794a0c6d1264ccdb9712d39e33aedfc1d82c94a39701ef9f183c1239a03b012bc8cc3e8a40405cf5ac115898ff029d682197c7c349bf1cf9642497dce19a9cfe8a032e35b782efc8795741e9cb934ff07ed0358df888992134bf6d0b2d9feab05c67fd10dbd24d55148f0e825f673f3958282f7235e839dd1ee52e6d43623a557ce0152886f01bd65f309494ef4187deb2c6134db3649c5605c9fc5997bfe7c2f39f37f40b9a2ca0706008576e1c240dcab0280da226e0de697ee9a2de840bca9ac507894f1302b18c2de24bc77d8c0c3108289e403324fbc56888a750a0bfdc2a3c21c2f48a21bacd74e4fcda98033c5fa2daea57bf3af4f6c1e0aafd056c248f1beb48f17962e6a8113c22eeedb15997d2bc69467088dd4d7edcc519fb36d93fce07f13f53d32ea5ec781d7679f349ffe6490b0c1b3cd7cf822933b0383e639b145f578cc619fb98be6d55e373b4488441ce087bd78599ee1644ec7e0dc7c169c529e86cb4011698530e562910cedd840a9eb61849406b6a27b594cad486c57f50a67dbe456a9b7c1744e3e60d72891464770b7a50436b8115031fa227ab70170e960748fb05e9fc3fab51c78aee9d805654f19ac225807b5d3bf2fddc30e49361b576f11ab05ddaa854a816c04dc14376442d21657983b097d68c2324a21f2f0af304d378edd082e22c2609984ca96617e8c43cb5f1802cc2b350e0b4b0b768cac2f061b85437bddcef9c48f6fb9c6fc6b005d895fcb798bae8bb604d2a9fba5081c55cc11b96697ced4142a706945bafa111ad687215b4aa407aff3cd0fdf98cd56f5e8c7eb7768d63b16f20a5dd8f6d8a3951658b5ab48772a3876b633248872b2eb8341ba69489121f4354a4a9961a941da2a8246b2304d340ab1af105502eeaec973f5db55729d773430c14a00200766d175d1cc51d9768384495e319709320c6efe50e9acb1703ea79237cb6d7cb85ddfb6ba933498d8fa36f936ccaf8c85a82a28f214b04c0b419e444a856fb2fcf8c20641408e26a67f18c0a68132574c260b580b429d8740d074a3240bd0182641c8cea043e55bee357a798aae228a55e86924a1da2509a5ad0f7a243b81caeeb662cdb0357fc2a7feda430df1ac4c7d3716d680510d9faecbe152e64a8ddf65baafbf10c0ed442d02423ae63b17c88d630029d458782ddf224a28cfe7e9739e7fc5026640609806721612a47dc91e5a5d8f8375f4ff0eb186fb50000d4e5ba3af8a487ba8d46cfe65deb392ee628f30ab7c320b45a3724ad487c03fee0887a36a9d8f3950e84bdd6b802e01ae8e3f5459c73403e88624a0b3931eda800fb690dc0fbdc741d60d7de7b8f01031f8734b34041eaad2338dcd6cc544a2682ffe6e7c02613a8ffeec91fbf83cbfe75382f0dc6e7e9590eb0c961c6aaa6e78ec2760a0625548e59ba705b1c31f91595841541cefc2612ae76cb9a01f4cb38edff797470a414bdab7b28cd4441c5a960ecec11df7a017863bb7666d401e70918772c58269b6e7dd5ca4ba36e08d534df440d75f11400714bdc27af48093469a78e7c21f233bdc260b7ad3507622571f5b8c41429276582640c9348208ea080efae161ba1210237284fa6b4f19cf64d92aab1d6bba2bc4a0701a548d53fd997ee4505967a16ada03368236222bda00d6f961d33809153854b6a22f2ed447867a2151ab4842ee125be7705b4c5cfdc70a36d7d6244e20f9602f834194fe8c626881b6aa3335d7e000d767d3294ce945b7b38485db47aab142485dcbf70702649ee8cb84c3ac54bfacd2f309c5c6533dbece1d774ead1a857194239b07dcb14d97d3f416b7c942f1eca0b1d943889995dbb66878f50971be3a387e62325fe081ebc2f372a59043173e5669dfc34a61c7903c564eca80a04dda0d90276be186f89cf6f895e33638690d16d2e1df7b53ca0cbf1f707dbc078f38d171078c1cd8c759cb5914ba7711b6b3e5cbe1a404377a681b6e14bb2421751a8d908f3234766e34d2e834da4c88c3a9086818fc28d6e213a73025b0b4576be2602193e86e38c88c443e1b8fba8100e62aae84bd8e7af742d27f9ee1e680ef10d7f597532144be142e53d90f78c7f979c0fc1172d5ef066eeb71b60b7452b2fc6a87f81ed9defdc3418abc4bf9610162b2380c113f75143a4d85422a93b44e2d50ede6cf890b5b2d39f3844194d2e3f96c70907449568efe72549e923289dbf9f3068ede75ea5a07e051d54e91472efa8a006ef6894aa5f9704d1f536dabb8d6d7156e249b232b2d7e865b2f5a8c11d1e82805afc030a780c3a9696f4d88e8d81a7d77df019ba37ae6152715edd15144abe8c8e484c7ecfab0d624aeba8a939ce0fac1afb7465588012f91196172d62d10382635cdacb58af9a9b0b8a5a14955fdf0510b5a65324434d421abba887bc00f47ab805a85084e282f788b83dd9a64620358e0d7316590585d28e5f563bda56922a8749118364b8910204a1ab9c1e5e55647247abe63ef13d13413a667c63639d7c3394e65fa13de103b4f36255277c755d3fcc9ded573252b54eb13976bf39bab33d446edabd303d25d49e448120af5c23ae3b87720a337af52500d32341af8b8300c7c1815647a3974455f3b2836ee48ee558d1a6e596428c6df716f7f801efa11daf5aa33a4fe45705e395eae28cfeb29e4573bf14d5a6be3e8711f50c3eca66f37432b66e2c98423b4de95e9a61f18214ac8de1273149816185a5c3c797b877e41b0c96311f9187f0d1f4201b06e2520ca2187407381985e1b403bef07d9db6a45804fbf824c24bfe0454c733a71c8113e0961e1dd4cee765db8dd585f5cbc3d3e55b1a50a964a3a3e8a0164a4e74293746d2a7950728f8b38c7259c9dc62f78ff78ac9e632f6e6f0a8fa1db2508ab0c7bd85d7fc6260508106f8a2dbedd7edf159327d990b253a32c44051d2a41ecca4043048a974b0027acd2d736e67f4e5f0b9909b5a0f37cf440280e57ff2d5ed824300df6234d67832768308877416f5180f61c96a1b9a427f604402f3d031cf4315d01c62277514a8698b9476139a3e459ce0740ecc4e13f7351e46da49dfede9b6bf83b08f1e76d917e3a51c82dcb66dbb31958f3f086e70ab726f1db8115b77469a163fe3dc98c88814115c78551c011ec66da45ceefc07a8dc1fa724606c96d8020aa47e09d6bde8e3e29f99cf09d61fbe3fe2c0621a2f7c73e660c35f492775b6a13c4caf399d1e3070d11275c92497602d4eb05734730b76453e0033a1f31cde2c7b87989e81084cbb84b3a66d1d059f4892e2c6be2976db7b981bff440800246ac1062f9ae5ab8edaece3bba3e31683b14986dfee2d23e26b0390c5408c6c6b593a5b5b4bf9ced44ee174286f5a6ca21d9109b18984aea0c11f4bf091846d1db507c523aa42cb103fb2dd60c3ce030f0ebffd64cf129dddef80818efbd6506f053c4445c794677891ad3c9e864e7347fc1f456e3951a9d14d9a9be058b9f73947b65f1f6cd001c2b970d090bef270c52da18128f1c73c791a6fa3f31d2e527e6f3a3ffcb145c88899b3d04edb0214ca5ee5eb181a888d31141620493468e1b97430a0927150220925a16ca59ffe804af08c1ea12f706f7c463f379c3cb0af1311e356e25bd47eafd3a35fc8f0e6455847908c7ce7ea337c69c2b7cf1cd00648968acc669e0680438b9f92fba685ee09ffda9c4c21309dee92143d9772422fe51a1708a1ada5698503465f36cc13aa1d835f7379f7ce223f5c631538916940c440e375d22f1ec7897fe07cb80f40f5d7d8d3813694cc7729ba4299d01027f81ad0d6f3d628e412aea186e5508e8fa3071f2724cadb1d808baa27d20880d375c61090357f91da029953f424dc06f3efe744ecb7eb72f4fa150686d5407d326c4842ef146a0eff4852752c068e495487dca50a8e5b2bcc81612061d58de41baa3066642f10cecd173d0cf619d1b511915fe15800d0914ae75b7ad69591694ebd273d5cbe6680206c8884f9e41f948624aa762b88412dd3d99e1b11e76783effa23e5696002f44fa0494e94a5cf9b60ecebd5d9d64f0681b91ad0c9be5c58e4157020db5de81f06c2d76d3da574547aa0687a3913b69e088a97a1619651f5f2da1880d9aff817b8a33e16a709e255235692f8cd61dcbb2ca36b7e07d9b288506090a286a28924107c10306e14d2521402b54eb5142b2bf0cad02378cd271d4f3564dfca9c84ea1f5b6695892ca52498a72acaf16d1f24ea7247498e8bc09b1fe19477f45284a3d76648ac9d6b5fb28d265fda2cdce0977055da5f99dd39e0dc4821e21ee4b8aba6e03c9aa09f6c71f6cab0301bb565b7e20ee711dc7a849cca1b6266364375d6f045a57f55e74d21971778fcf4debb85671d42b6b0a146daa886d80ecbae7a51a3abd9b15b37832c988884f1820975d824c7d7cf71ad4af38f46befd91649141d65e30384181599e1b2543250d2cf37c8e0808f9a3813824f43a548bdb33b416c03eb8c98a12a8a21d54ee7632ed553a7bd84da1a6d41e3d42352ae15092c91bc743309fa4dc8fbc8ccc962949f7ecc45902e399633ae71a98b78ce48f9cc3599ff9731ef83f15529e040159491902bf1d5e1805c13aea94186e5bb0363dd61c9055574acfeb2a9a1d6ba80350f7f403b0748ef3df466d05c585d1ab4da3888cd48c66454306c9eb99a07295635523c9513759c9861ab25ac6e2d3ac4822f941e990764364a2bb81df79c055657f0a36fd9a8ec3020c0615c3747aa9fcbdf6e52c90c5d6074f6369e14c5d92d0c81f75acdbfbd5da7d8b49949152619d5ffd543ed5477aa76a8367807b7153eabbcdc2a01fb09da5cc46860cce790f2344625f524fc504e16595943c0f890ed161a89a037371011ba0a1f0f0e1184e3dc404c08353fae7c73f64f9aa0263da1138a6377b657e8f11eeef625f021a52f3fdd502cf02048d3c70ef42ba2c4ad48baa15f915f88e324dec2481080f6e2128ed1ff940ac5f412d89d693fc6cd38ff944b7f5a297b453dfa24aa326ed4e9aba97e72c8f48d346da6c1fe46c40f03ea21668870dadc160714499c8aa9e2f1d192d80a1d6165d471395b8b70af40d8f16cb3f27dd8165cafe11e089ffb06a5e11f3532fc512b2b36583f5f70cbda50894f97333a1473135c4ef4adb28e95dd8828a01b9d4812c91efb92026f71017c0ec004b8eb460391df501c329f4f9608d0b3ca342da857199e02d71d1d8f3ce3af7961f982c56ea62efcadaa629936ae0d94ab3726a0da893e9554233e8fd96f86918f98d9d416624a180092463d5597f391a4c234616d74828fc919f86fe6517321200988891736d76da16e7dba75e9be47971e5dbb75df4d976e5dd5e96eb6b4e7546f57b73fbaf42dbbbd74c4b034701721de6bb68bbebdaabbdebaf5f8386a81cea7e5f34f4bd1d732ce5662e4ba44defc8c2c1619dbb127f9d1156d912a8b382a13962fce0a1ca663dc3a5ad7d455b725d9c999638c0201353038ef1fe174ae0a317563ad7d6b9db98d9f2c424a8eee521b1c471730b30d1c9ecc04ea4095d5528989a6a133a4eedc2525f8d03d01c918954cfa4277092fbfbc68cb63838143b244d7a0fd1eb560b1e58c139d19ba49f2f254e286cfd42c6085b24c81cdcb65d78a1a6d47fd3049cab59c886aedcc9904447ce68aa98bf11bbae24db2134ad52327c04be2bfbdcc940653e8cb6577a26e53d282916c2a9af1faaf974ba9beda2e1f01c1d3261e702f53f6395046211f579201c3b6a893091d469b86b57c95488837a69cf84b38017e5fdfff7f2d5996ead893951120ed28cb083ba9b1162fc6628e805b4791f2e56dfeb21b5ba2bc2df9c30f7f0e67a417d37e9e19d252ec3b9f31c89723d5e75e4b2d49e85736253e3090558a4a505ab52292b8a1364d6e234645436825ff92ae0815101052406d5fc16bdf9a58d06ac7880bb791b18612a4aa64fedb6df61f05a751d944b93379ac178cfb1dd67bc42581d513eea04b25e1303d49a3cde3f4ad7dcea809780e473821667e2cc18238ce13020629eb8c2d8c8ac36deef0bf92599cdfa6797811d0e6bdb4d7eb68fd61d17604b8006781bccb5e5ad7c87d1e977677297828bd17608a2c37c122aa9cc7d4b8f6358aff73b490c06adda264aa02babb5b7e73a9808c4b8b84806c9b24b804da864ca9d93fb369406eae6845b622e7d5eb44070dd8e1974bbbd82934410812cd353bb909638689d11e15395487272806055a55717743284ccc017a5b27853070b4940e000c30c000030c30c000a811c068cbbdd901003441db006c4a4a4a8a1b17c34ad606c04204d64684c6c5740111088a08eb07ba67a01127375bffb5e871f44ea8a0a1459fdb9f1b52fa351ab6c52c1acd182219c3183da7b5852cfa890cf3c78c2c3ac61b046c118bc62c74fe47e4b895f1b0e8a17a8efe57cdd931f28a1ee5fc2ecd96e18a3ec4f1c63c34ed49af156d87cc91bdf8cd2503b66045ff185c94d2148fc99d55f4e92077a7f19f7cccaba2d90e19b224f3e81049451fc3587769d0985222a868520665e6a153eb75f0147dfecc1ffb28d43fe54cd1f67accaf7a6652cb4ad1c4841822a85f4e1749d1ac44c5909daa1a83a8b718451729e4603e7aa1008ba2c91ece73d60c14c1960c78052958c002104080048c60051430818fa051f02cf8c316a1e853c393c4c99bc75125822dedc016a0300b6cf189c653ee144692a58c99819ee884d241cf63b80a27ec6cb189365c8a7c1015ff93e8c7852d34d1447a7cc6282b3b8e99e853c51909513a4c7429c6fc29b8bb97e89159ebc330329567b444ab96730c21836a54a2efac12b9ec5aad1975c21694e892e38dd9ad934de4338926c4e48dfcf954743692d82212bde77448c6a1d3c5f2256c01897163b18a38913ea28b9396e3fb6a92613aa289ede338b998ef65f6a891f39f0dc262446b2da97b324216d1e588102b12b9a13bb78522baf8225912a721852d12d14aeede8f5d0d611f8e88ae716758cf980cd31c87682c446a06cf0925a9628836c7148b50113d32dd2c44e7fbc0273ea892499310cdbf4b947dfc960e7206d145cec6287c8cf078ad236c218836a5fcf499903a659203d1698e8862bea6c1720b883ea34e5afe383a3f86ffa1f5fe7cfc9fa1cea5e8875e4ece232e57ca167f1f9aefb290e52ce3f9cc7ce82c2d4af4f929cf921cc2167b6854e39f06f79f74c919610b3d34e12cb87b9660953a9e875624af7ccceb7ea07cb0051e9a9f8d7fbd9c71ce5c66618b3bb455d92f698a595a2272852decd066ef24eabe2957c8963a34293639b08a7e10424587be7189745f65af3ece0a5bcca18bfceb7d071233c62b87ce71b82c9a2118842de2d03a1899f76d89865ac2a12b093f6b6d314ce390a9b0c51bfa9c7e292219e63cc711610b377421a358d9b26b869a32256cd1865ed73ae7c773f605890dfd86096a95dd71742cada1879da32bd3152d46aa861ef4a71c1bf2581c6fd2d03cc6f173fc72cff80b0d7dd8e0bffa7032a34e9da14991c2f563cec5e766861efc7f5e85bf0cede543df2c0e3ee64232b4197f0e951b1bce9e3c862606cf3b93b269c8be8aa17560213ecc181286d63d76792a09c9424660e852b4c3aebcd12f7429495b876a6fb6895e68534a8ee54da1916ad785f6a232ca7b588998a25c68cc349557b098541cb6852e834832edcf0b39635ae837c4efdcb3f9915b9a854e7b7c2df36ae3980f0bed46648390e921c9e22bf4b94f5fc343d10a7dc631c404ade89e64af4257de8d33675648ee132af4e220f959d0065b294ea15db56425c95229f46b793d438fd98e411a853683bf9ce2388342f39343d47ad5b169ee094d7a2e0fea9ed173684ee8c2a9e6a874bd09adc588a771c2c387d399d0c99bc857ce7d315e5d421fa366fc95a1435d5395d0777c24daaaa924b4129fa2f59e67cfca21a1772c71f2a923e68bed08bd84135735ad8cd0869858b4905166fcb3083d6a14f3a470392a894468265b9e0fb9cc81867d08cd49528b214b27ff09854045c72bd2132c41e85385f9941971924309103a7f14a29784fc8362caf78933a3b0850f9a7c904365ca8f2d6edb83b6f4332f1ea778d086489ddce4603ffedc411fad2169c610e64fa33a683cc85f548bd9283e2a07cda47a92164fb7c0419f632aacca477cef788b1b749a23c59ebc3851f2dbc2067d4a9919966557d41fb5e8a16f2cb1b48e75cf68d15774982b8a9986d8e82c9a3c3925cb8b5316cd67c5f1903ffec6ecc6a2b9d8680c332addd0102cdaf1d070d16c7945a37b59216a85ae68834ad6d4973c71e3de8adee25e94b2866592b3a24bed712efb649595761548ec8f57495a51451fbdf17cc61ea5a1c452d1b669650921e555ff0b156df89c71589dccff949ca2774fcf3e0e3d486bca149d07536f18e2a77c9a2d459f2304bfbc1d1df385a468634a19b9a8e5565e3f8a5e7d3b2ac3208aa2539387a19ee43ca75828fa8c7bbaf1977be1018a4e826438a3a7394c353ed1ef34b43cf259ea31e589d63322bb3bf63583db891ee30ce9bed93cdb839c6882a49768fa83f1dc6ea2ab2e8b1957eb5aee144db415c28694f2cc99483c7a829868a25a6494bc217527f912bd3cd269733f13b1de127d6ec8e6293956892e6e8e6ca2aed5d01c946892374cfa59a911369d447b9acb53a84e128d4ca3b0ab55d6dea1481ca65651a53248746255a119eec13d858fe8e225c78ef3c3ca2bd3117dce58f344c78550f236a299d0911be69aaaae31a20dba0fa7a15f8b6824e6ac67354d116d9caffc72a2aa9ddd44b4e32ebec144cbb38c8826365c2ca6ae58640ed1b7ba054db9c6ff2965883d3c4aade22916a2e9503185107de4642134677785300fa2cde0d3f02a4355a4a820dab896c2a5b428104dce30ae86dcac267b01a2f5071fb4f16cfed0e5488a1317e2391af343730ee4e286870ea7217de81faac80789d39973980f7d66958d6f7c1abe617b389c7e4e21038beba1d55cf9f02776575e9587aea13c508d241efac7eeefd6f9d79fda3b341222412643349c4e7668f5d27a354e4ee88f7568d41bfff707df8f5fd1a13dcbe8193d27c544630e7d6a903a462e4e475972e8f5636c8b1e322a8b2f0e6d869cb099a3b741dcc0a18f9807b11cc7af56f00d4daa14afb9b22d69446e6845b52a5ea33bd449bd21006de8b256489f94d2f3f5168500b0a1effc986415412c4eb3862e83e01d354e7838ce8c206f87fe81789f47920cc6e73a74a12beac48971533a8a0e6d568dfe9f2d5812499943e3e11fab727ce4d843e4d0ab68ebffc7d37c968c432779a91eba7c67f385436f41b3e9594a6f685f3f439f881d1fc7e486ae4cdb3bc3dc86def5655a1f57ee87980d3bcaea9e35f45ad9a38de14b840c574363d528945e76d3d0436fcd791f5987103568687522ae4fde0c8f816768d6db1d26f70811276e862e455586af61bb1aab65e8413cb2ee910ab30c2243f35932632652a4451f43173dc44619e53f5e85c5d03fcef961f3b4bb832f0c3dcede3fbe2176082a83a1c92093dd93e867c8e30b3dc8aa93175ac79ae3c6771251005de8321f85594a898f2524822d8c8200b8d077a45839c7901b52dccc04b085f6a344de90cfd14227d9a33b33e452cd4b161a710939c429077a591b26002cb4f9ba71b8cec61f257385662c2442773febc88b060158c1aa18e42b3447f89855a11431a654546663eda8503cf62e491935f69ea7f0895c9491b8259659299017d753c8339a2838953dff57544bc6120a651c2372c33d66ff8462cac03a23cf09bda523cd8c8c4a2608a009bd54a360e9ae2122250026541d9fdf1a5eaa1d670967ac1123431cc9f4a98461f846742a034375803417082009ede5d8b1fdffa1537924343199ae04990f319a2482008ed07a945897e84c35040118a1d74851f14b31698e3110045084662ba74c1ec7a417727c1000117ad8539e53267f087d7a6811b5e887ad4121b49e83244be1435e574579104010ba8c7d751a7b4ecad4c6e00d0a3e50566f1000109ae85c296feb07a920801ff471398478297e5010800f7aef8c9a1bb1ec82007ad05b9ec8f1e15846cf1516000f4c25399ae738612e5b10c00e1a0719edc87238778975d087c951f54da61cb4256116727c71d0e30e7296d338e3b884057083b63bae925ee3c6552d55110460835622ee766ab1166d0c89526a118df14669d17810ddd6fcffd92a3e66d14399378dd10fc99349010810e07f052d10c30b59f4f8a43b7f6587a09f7906582cdaec2cf7e94f0dc388b0e831dc4d629553c6ef06e1c52b8cce065b0ec6b2cb22bd62f3ffaa75a5acec8ac67b35b664aaec9f4a2b9a90254ac8ab6156f43055ceb8dc234f625d05dbd132b134265c78a18a3e46caa951f87c3c9a118217a9684b5336980fe6d98df281519d78818af6247bca39c4c4245eb9c28b533439464bd9c53536335378618ac662aa6c042a700400195e94a2cbd0fa3346f85513408004c8e08c6005af8108d8b94035b0823741795382920213907100c8c20b52b4a3b2da99611f47596ef06214fdabfce4bc709a49aa17a26872bee885128f7937065d8002b040072f42d1eac36fd1e4a963ccf402146dea98f155d66e7ea14ff4215c349c2a4b95c7f5441f53e4093b318996981fa84e741ac9a7d362e304d79682ac964679041fa8da4df4919b935ec453045b32201f304341060a50009385179ae81b6a78c70dfd235c26822d05d08b4cb4914534062fed3832bfc0441763eefe0c834a5be97589e627e843978896c53f23bcb0441791b36c437ff06fa14a9492bcc295f57f3e112f28d175380e29755749caae400a2f26d18fa54c8d0ed7d7a03759bc9044975c2eba7965fa831791e8cd813d780189c3c6286696e747b4272251b7d4252cae8ee8c483cca8a4e30dc9042690c10a5ad0882e545c8fd93da77497e5032d781664125e3082bfa0163fdafce3b7884cbb377a5fe5caf6f042117d37b418d3332bfafa44b40f723d7262c590a888f002117dc6cda09e521cc18b43f4d93b3e4644b8decfbbe05d5081340abc304497bd77fd31300d934108072f0ad1676cd08b199385dcab092f08d14f0e3942a724837f80135e0ca27f8c41a444d1d8186604d146ebfc1349dd22791e883ec4d9dc38338c19a718107d8ad9a1e768f8c133fc437331a92d777898c5ca0f7d652509172b5a5cb082165c60032e78d18756b733fa820fb987d3830b5ee4010fb581177770fb736f5f8002f80a3050b78a1776d833b2e614d9a93cbf827f41f316295ed4e19827c348615bc3e274d0cbd5d21fb4aec77c0e85241242438eeca7be90437a713a4279ca97ce0426f0c22d70410450b0800abc88430f7562b53898ea901c0e6d3b0c0d7973788994bea173a0f966a973d8488d1bda98a12f8cc7ebe7e55eb4a1c98b9c98bb5286e8d00b365895691ef125d19e650de234e40fa99d2a075eaca147d13535344a08b1c2176ae8b22297a5f893c36f9f863ea7896cc8c1a3ba945b7881867ee432cfdc9349709033b4aded69514d6386d65ac6a28547e51b7e199ad78a551136a3e4284e863e7bce96d02ea2eb2e62e1c518fa2817b55f73a7f5a75e88a19dd4be1aa2a1b355270ccd47868e34af9ac859c0d045b9e8554b1633ce78f1852ee25f94d98cfdf1910c2fbcd087b0cc295e332cc478179a8e9faca77371a14dc957e9595115757bb185a69259c40d31656121165c59185e68a10f2172c4c73f29436fb2d054af874879debcb863a19df81e3bac34889fc9021480062faed07af889112722ff94d6821756e8f244c8679e8fafa00b50005fc1b3043af00116bca8429f2148f29e7330155a8b1f29fd09c1ad2322d84a410b50e0801753e8738a7e72eea1d12662c0bc904253ed2177c8a2d221df1751782b8b8956c6b2922dc0023496f0020a7e9271949b65377c022b9952e47811fa9e13f4cf9de2af8ef77d5a1ebc6802be608215005f2ce1f830e3f43cae793a25507933e38821fa7a4d2a2dbc48429b3d8e82684ad6d2233ae00512bad0d981a5a08d2258ce119a6e146172b538eeef18a1711cf2f195e5bcca7c115a1f0dadd25973c7f989d0e5bc12b9722c3a67cc10deea4c0dddc9170d085e08a1d1fc9124664f49245e82d0868ca715733c53f70910ba4c21c78c611a98c47fd04c726fe0193de2317cd069d4369f5207929af7a08f7290de604336fd79d05f8776f09508e7baeea0f73469ac66ee3184a983d6e7311c49e19fb9e6a0e9d8a92da2486fc6210efa5021c38b9af2556adc0d5a738b16b2725ed8a003c72315e98b412da95c14c10819a52442af1ba2ccc2f2211c1742e83aefa328baf2f0f4c7175810b808021740e8818410ea16278ba9fc833e68789037637be3f73e68b2667b7fbc637c0eed4163595d3e233c681de67e716439e939b4831e7fe6a00e72c22a223ae8fc1f4f893448a95225077db0ca9c1ce928e13a3868524a68387e6a2125fd067d230ba29171c7850d9a8cbba1697a9c4e886ad144b8c5f58b9c3b3492166da485a0ab39c54cd12cba6e20939232beca0c94459b9127c4a7e610b632b168633ee34fcfb08a8c8245df5a5182e536ee4ef3154d683f4c111df67e5c5cd1f9b8f86eca1eabddb5a2cb31b89ca6ee99d02e2b3a0f25b3d1718239ec57d189548b449bae8a1e9679bce66b53d1c5ddd988ba1df11aa86853caf27992cf3288e6299a38552ab37153347da1f35ef1bf3b4ea5681c8be5e4a9d318849e14ed9f79eaec3b19453b2a151df349249f90287a601172c3bf4a61cc118af6ad3b9c88ea4fe81c287af0913c65e74ff4d6efb9215ad60b21c4138de5ad488f90184be39de85c3d780821c4c5fc83134d499f74cea94d34a79f3dc710323b21d5441f763c895af846c828136d8cf951e6e82f267af3209372eb76896682e78b18af32498a30113725a9124d0e1d52ca30a41c9d90124d4c07176f129a442b9e4386cb8c24dabf6ce12375ccc92d25123db858e19366e7490c89369ae6e33857b54e9a47f4a92791376e46083f3ba20f91fb1abb1d3fb478235a0f79232b55cef6d230a28b1b91fb4c5652fc2ca22f09df71a2c4aca93145f41ede1523e88598e825a279cb7810c91be5184388e8b1c55ebd1caa734bf810edfe684e5e0c165763883e63eff75cd179bc55219a8d216b8964fd0cdd428856c463acca9c83bf3c883644f335478e1dd59420da4a19458d31ab6b2507a2d19d9e8cf462c7cf2840741e9a514453428e2effa10b33b1cedd28dd38e5873efa74849042b333c7fad0a6141aaf328aefc8333e7439775ae71e6fc912df43a37f792dbe2447dad4439bb14c74c61062ddc379e82c344caad141d47f141e9a88d943f4412aed68dda1edd37c49228fa79c658736a8c79aa68798fa31ead0475506e153e65392930e9d690a3d0ef23887f65f3f6c989ceb930e39349b1ae68168461cda8fe3197a3e929cf387439b62342ffeae4a0abfa1cb8e672eb6916ecad80d6d87aa6530f19ce42c6de8e364fe95e4316ff09e0dfd7f0817f2641c1ebcb78676ae420ee929357732d4d068b5c79332c7395c340d5dfc0e9e19f31c87dcd1d088bb9ab4464aeef93f433f9b3d787ef64dc7a319fa30bd9347d72f388696a1f398eb31c1a4bf572243ebe162d2f7bf4acbf818da8c8d34c54b2962682be49c817bbecec647189a4995b353bc08863e63c43055cdf3cfc92f3461fd73d44c122fb4213b2efa4746179ad020f89c7c0e49c2c9857eaefa5d2cc30a916c0b6dc8127363a94c0b4d68cb94a311fe17bc2c746e162242555bea14c1425f1edb8357675ca1ff90a81e72f058a1d51f4d92be39438b8f2af4214163caeaa7a77143852e83dc22392bb7418a4fa1cbaf99e69d53293431c3ee90518617ad5914daf5fc29a3cb50e8b378aba49b674e8a3ca19fc87a1ad95d62734c045b51188013fac89afe3197e590f135a1c771529e09ed37cc0ea7716c90d45f42bb9633eae988081e2e25f430e67778174b999493843ec376e933d94cf23148e8a57bd7a16c6cee851ca1ed8c3316654dff1d67842e3fca9974ce1f895c8ad0eb83dca01c7e86f87922341be61f0407b137b61b4217de11fa326728a6a5109af9141556821c843ea6486cf02c19f9fb40e8d2d7d73b6bf4079d37feb238417a32321f346995fba83d85ce690fda14396c748ca69c7196078da869dc080f3c553877d055598e5fa17374d0756f740c2679eea7680ebacce42fd59fb91ce6e0a0f58e8faf5937860cf21b9c217f4c5f42ca006cd057bc6c8ea1cab568559286a5ec2d2d5ab3c69132aafcf27c66d1c69f1491837ab604872cdad78f8d93cf63a3a4c6a2374fb9d9dd8fe2270e8bd6424a578821c4f490f28ade4198f611cb0ed263aee8223a8c39e60f392d525ad1768a0ccc333caed0162b9ae8d37e155d6390f4fa53aae8a7753d64734e45df30ce231deb64c1345474593de6df48de50937b8ac632be1442f08a299a721c191e4b8666922f45d7317b8a1c723b7f3b48d17c66cafbee1933166f149d03cf9a51589c69df44d1a514bf1b36cd628c53283a8dea2037bf7a68c780a2adfc1f2fb6e4299df8273acbfa8f634e33debe3cd1e5c9a83e97fb3f1aa7134dfe8c49bf62f88fcbe144ef48e6f3a7946ea29d8c33248bf9728c9b69a28fce2886661c3f99954cf49aa3668aeef9b935c5441b216c7a78b72ed14567e7c8d2184b745126c7a41d231c6f5a897e5b525c6d901be3a69468ce73d4af709e1bab3389262e58079d183733d624d1669e6821bc5fb8ea8c48f4e292819af90312cdab6793890dfd63668f68e22a672696c6114dfecc949672a6118deb65c661ed9ff960443b9617394a5ef5fd16d15be4fee5dca422badc334dd21f5295e24474dd2186bc55952d328c88d6c1e68c2f557b88a6b3f1bec6f74a8d7743b47a3a1fa288669c520bd1564829e479fca8c32d42b451331cff55f79b9c8368f2a8e3ceef7b29d11244b3f94942786604a28d77bc61da16cf2b02883e88be23891c4e8305ffd0bcc6caace3fcd05fc6e76b6d621ffad0ec31c8c71cafccc387364bffc78410c2e61cf7d0a9c72491f35e0fbdfc9a68e8966439b379687db24f4b7ac620d1c143334935f5c3f4f0bac13b349f0e274b95cb6a19a9b583e8dcc828a2c9269961d0f7d2f8a312ba4844bf7a1a5d519e1e2588e8bf7be63c8e26f09202088c6f401787e8253354c8493454340e115d18a293d89d1a49a253632a449be9c0e3bd2382e882104db008dd92f906d1ae07f91e6f1452f376852e04d1bf8e6af7484eb75a02d16f8a9443638a03a2919d5839aa577752c22efed085698f255a9a1fba904c26488e29c42efad09f465407f91c3eb41e3eb9996ede98dadb432b53e153f69e8a6b165aa10b3df463e6fee9b06284ed4330828382149497441779e8b26bac637fd4090a07a826d0051efa2099a3abe2458e29b9ebe20e7df0d78e513374286fefbab0439bf95bc9933c9c0ae295a18b3a349f752fe722c70d5de9431774e8439e6f92289752cc1b1fba98431772c83b25a2b1498684b46c39e8220e5d9c6b309e277a8aed403c7401875e1b9f38ec8bd16bf10e5dbca18fa199f253fe324b961dba7043933be42f4971e81f5355872edad088ee6c65cee7fe1d3634153de4e5d421ccc235f419bbc2f3b7e5154b0d6d8629e48c3957529c4e1a9a559f0a792966cce5a3a15191768df8bdd69b33f4287ca3ecb9b01eb3c40c3d0c9eb3562ccd19f932b4b964757e839856cc20438f3ba520d92e92a2c3636836acab72c21543fba922bac38e86a1f3f81b3a316e2e130543531ab63a9ee70b9d749aa954c86fd1f742f31353d685364455ca3155d7e4422e349125632765b685a6417955f6bff05995167a6c21f10ebac8429fc26590bc8dc475dd3974818563c89e41e6f7d5eae20a8da68877a02947c81d267461854eaea2e2837c56a199fc3719dddeb6dea8d085f4d68c634ac9c263a6d0e7376818246643e78e14daac11953334f158311285b62b9e9883568bf71c0a6d0e4155e292e3096df2eff9b8972ee16427b459b55276c7acae689bd086945f3ea5993ece6b174ce8416358799aa34b686582c34f35ab0b2518b12693a29a23098de99f9585f3ee6c31116c0dba4082e2a79bded3a39b2f47b02abbe58a1961cd95db3a3a772749045b2e60c107ce0b5d14a1ddec31f31c4cf0065d10a1f3938c2956c434e86208bd69f438aa3cb99d1c42e83c3b861216d5372a82411741e83f6eea74f2a80c930584fe533408ae979e3246bbf841ab250d27aaacfcc4e583d624a70665d98c41173d38fafd522f28822d4642173ca05386262167e59cfc10bad841133363a554897c31870005e8a03d5fb7941c37fce3a4052c48010544d082116c80055de4a0ddf82e9d8267cd9b5d1c343bb3adf11fc75c3e3728f47abebb1fa60b1bf4fb41437825c91ed36bd145ea18d23be7a4a132e582167d3689251e634e2eebcca2ad081f77ab8286fd03de0213bcc9222e64d15e1691e4e9172ebab1a802c0a213f1d9941e62d24979045cbca275d1ce352bab50b941b87045a3123f06cd8fa1638b6945ebadc182668ffe215758d1794a67c879b3abe85b538c41443f935e45156ddede7c31261c64bca7a217cd9d62563f50d1e7f8eab03de34adef129fa141737f4c3d41da4550d70618a26eb666456a570518ade43498c8f3a04ebfce18214ed75f45845cf113aca32f015acc0f3045c8c02b9108572110ae4021455005d2e3ea1838eb953e26211acf9e22ab8800cfe018c79092e3cd1673031cfcb8430a26e27fa94fead21eae8b85938d1540e96926e996748392e3691052e3461f0bc992506cfb14cb4bf7ee5a9719a37f660a287f1c28154e8ec70fc257a141ac7dc2198264f164b342986389eba65ab3cbb12e8c00748c04525dadc11729c980daf5d4a34152ac557999cc93c9f44fb0e35558a19368e6848a24bcb1d427b78fc9647a2cf0a8f53d0df98543124daeb97acfe1f7dc4db171a73e629b970441f5cd671e675e32c9a3f70d1884e5e827a8a8db3354e6144bf9ede61b52c67941f8b687bfd3464dd8ad3f3ac3e507b7ce04211bd5ed239c97f94f3337c082e12d156fbb57778e8558f83820b4474197d4adfcddb53ae021400eb0345c6c521bad23c21b5c7ac21e7e4097c054e0114a460043318c10946d002154ca00005f88026b830448f45726810553f2ea60ad17b72dca95274f7c00521ba96bc10dd3b6507d1658f7a1252bb68c31441b42fc1439e73e412b90d4497993d21c6c999717280684df79206c759c662ca005cfca1b3f889ac21ca51dc1c3ff4d79d25f127c44989f4a155911c99cea69127ce87ae1cba5476871d55dc3d742165ece39ef3d812d543b3218a87df18eef2e6a18b7ed987fd7933b2e2020f5df46f13a914d7b2f959e0e20e9de338f963e6d64ad5d8a11f4d294ef020a23daa15b8a843fb302a72636673e0820e5d85649798d9433c0f99c0049e8005e8818b39f432bf39538a5bca8eda19b89043e31a3e7314c9cd0a713f70118726c5acbadf6072c3b94ce0020eadfe064d7ee91733242c8881b18b03176f683a857666947fcb3482810214e00a5cb8a16f07f9e7416b65d49dae818b36b4924dfcba5747aa418c0d5cb0a199a0297214efdc4a4faea1c9151e579cc851432f997b19a63a5a5609388071c069818b3434526ee618580e9fa25482920208a0a1b914eba8baf16124242c707186b63566338adf0ced6492b5d0b82a031765e871e8460e894ab9d08e810b32f438568eba951653cef931b49631f665cf8c2524590c6d909093571975a36086a18d934a3fc3ac21b5886068542c87b0a41a527fbed05e4a9ec9b18c0b2f14a707b8e842ff2f1f3f3357e8f20e17aa00cac516aa00a7855e92846472b971c8052eb2d09b24cf39a4a2c45ccc0803175868c37fa86cacec3ef15ca18bf1dc2a936c6ed9d80aad8ca7783c1bad42dff02acf635589b21f15fa0f2fff383b0c3ac19a421f297986ac5f7444090326052ea4d06f87caef74ced5fd89429743f9887b83a1d085acf0a70e33e74b9527b43166235c8e2924f775425f19840d1e37725d73885c34a1c9792f348639c6085c30a1d3d41a2ac4867e86e2127a1c6364678811442e94d079c528a1fde32209edf9a348d11ba3be8a20a1d129cd31db272332e3089dac7cbc181afec57d10810b23f4088891a8f4ee4402b240241088c3a160300c068db31fb31408001824268b0663a12007b4c10f1480033e1a1a362628162a20141414161014160c088442c1701808068302826020100a0983c4f02858f8006e46c45e7c8595611e80f12b06c584b131749360fa200db4e50ef80967c1e9f17799a7984f3f49c546f61ccd8d0b435a58cb82c69a6e226252af826c9fc08905a2303efa85c4ee29fbc680b72b10b5077e5192d40c8452aab118ce40b481a02ed5d331c293563d67aeca8d920c09068da55142f5cedac8a5eab088cb48507ea827c7e6544a9bea023c7f892a04cce976608d588fd98724796131c5e171dee344e53e0dde0ca4660489457b6b9d67bada961f2b910d0211bd03159f02df3fd9dcaf5a614b0f0def0ecd01a810407766e2b218b6bc65c8071001e1d640c3c93c5d609d5fbe97bb7851eeacfb74ca570512c03f65f07ec9177e1bdde66c087f62eba911226e20240dad162ef765304ebae279aea8eb1597d0d72475814aec822f57012ca443f8704d01b9eabcf5da6580e69287c18bf139725b84310e6dcb6b35b697129850d2827d548722f904e880d9854f45c12887c61007c6d40417383e043efa36fad4363823183d4a8787961e5bb5d5acd0db3eb3b46989e366c6a8b87ecc8aa2d6839a353554394d4aaed28c0a05ca88e3c562205a5a412c33771b5da0680559b74a07f3d7eb8d5ae1246cf3f9f98fb828981b5a111ce9873bca6c941143851d9e384f0795a7aeea2e825b457539f9210b8ae1dbfd134a0b3f41bbd017fcaa886e8a3e2e8cf2a7cf05e478630db7cb184219a4ea23df306a11c4c94d0fc0397f32223a63abbdeb2e81d0a966a78319653ba2d4e7349b03e51c441c4cadd49302124624d014cccd0825835b013b70b0026e378820a577c6f8c51242447ad1a19573feb953852d44845d6905982519d8205d6b7fbdcdb96bcca4422826010cf5fea2551169e760086feaeb07f24f30fed84afe4058041f14c0518c6b2b1b34c8cb8ad2502184f63f03c6976f79dbf811144e47eeac102866348356b5a0c431583b7a531c814943d56aa700f2ad1dde01b67cd6491284954fdccb8b8eca7f92360c14b82a1c3ca0d94a273fc6868587d1ca3723183c3313e1cf0d30f58fabf38e4c034de97aaf652231669fa760506d4800e9a5376371153ed9e10f6ced99a9d2c7a4762df8ff25d8ae6c31aedd06bdb6293f41d802ab0128efcea22354e58a8802e11a54fc6fea5fb95ea646b6b629b0879a6bf7d340249e480c404edb0d238607c69b217de9f87ca3ceb259bfbdbf7cfe3fb8e4c1ab85f7245387eb1eccf1e7e0953ab7ebd71638b69b6a3e0dbf9d90b1351d60c809f4b522d7835befb5139e04c7a3e435501c7762f4c52c523a3151e0b8d3fb3974b4cd35413d60be69fcd1b64c351e6ff3007750c8208e88db45541272825f561cd0747d462f5338b3eff447ae0a2d3c0c0907c734fe7d2c6cbffb7b128efdd72ea729897d3c832c5901922671d77a90c2de4e11e01dc1395e4aac381bde312b5d6dcb99c460765da04b4aa6889f7665c16277e7e78690ee08e3e0e40bc837ba96403863e1dee0cf7ca899ae9cb77e871e078d700ed8e4ae2ad047ee22c01941448cf370e640568164ac81e81af1fd8f07d6014831ad9d5e6637a1b0765fcb1406e25244e5b8d48824a7b86aa57e49c5d75469cf6092e320398e2b4738e6a03cb6dc3203559b864defcc146e43d00785459435200d3d8000170405cb8fb9d43ed59a48370c15436880b61f83c576929ec4f338b84ddc524c040070c52b13b9d24192714800932d1ac08de6087af871ab6f0486b25b6cf2e3b5c9041ef096f7cdf15fd5c5b185088cf792b5ce9eefbcedc1244008d1c534b030c88762998d4c4cc1b5b886820a67cefc0baed7b25afc37154cdcc90dd0cb0b3025ac737543fc1048cde4b9a20fad0a29402ed31fd40d026a04f318813e72324a7d9324d325c8a8455adb2f90fbe67b43dff0029cab32162b487e257e555ca4bc683ed455ef1aa08aabe82dd67193cbc4ae4894e96676120b68139ce6718a5b167036ed23c90d89733124754ac8b95c2d90af0c881a83bcc8c2e0ce70e4f8d338f769a19b7dbb93850daf236c02bf1189b9f0ae066a91ddd136006121a50f2313284d51a5607ebdec64d00a8cae210cb3c21eaf40f45ad26caf20844e0990a96db5128df48744a74e74cdaaa862c516e303b6b343048046adaa1f88e5ae039ade3660302eaabb0296d394fbebf0fa37ef3d3a88b26794b8c75980281887d2e07c75ba6118032b454e3959a4cf9678fdf9b406474296fcccd32e291638a08a5cfa33b2e8a211568ee5fe5c18c1f18c4102110d332ec40eb5df374ab6fa60405e9ef928b00a99898eb42c59db25636ef6568ef209a515ac89392f759b604a5ce7c90a59cdc36f66e5cb3327631b2e52788567f292506a096bea8a58663c312954b19a2b787ec21d5ca533aea07a5b739ca1fb6bf1dda747fa094cc4087a6d32d48244229b966ddacbb0b461d9332e7e4fd6b6aaf770809b6fcf8cff335a1b6e26ef784e5b6b4130b136a10dd5a6c78dcd7066f78a06e78a34f34f6224f2b942030edf760e86ca553cc2d62b54c270bf4cc891487dfc9425d24baa3f28ef130454ea0b9fcbc2646b3ef59f6723ac0cb69f47a5ed7b3d1d3a8f3be2787f9364517616e372daec1464612dfc2c468c06526edb747018999461916d09acb9d2b5d20b6bbe612f5203887f49e9b1c978fc04beb8192df45e2076a91298f8d438a55ed5b52a31862d13ecf9419fd68c048b3577285c800747b1fb70f1a4b3ccbb6225560e17e9d9aa2b9b25a6a0bf46a9a4c64d502bd2ef24319d53b7283b8055eae090db8d93f84bfd8d1f1d5f3a81391f709d9610576e0b2ad167ab3ed0c49e942ab4a2ab61d95365961096d681c37a8255114a09e29c0f24568f56ec23863dc4f03a40a130289142c5416844f47149b9501fd438d485420f149092d252209e7250184521290e2a134a8382a058280c14024aec28609c85d31c304a07ec05aade4c144d6a0a513a62300c0f0315a13a52d43df1dcc5090eea80da50bb58940e711e91ba42e54101fd2a8a8337afc37182ba16c5fcce040a88d97f361a0fd5370cc8f572a8f1a8beebd3f3329009cc2cd4f0a280867c13b6c5102584fb3064a98994f5a8578a06c540c1a1b8a3a2524828118a0ee53c0a958a42598d724ae150001411ca874a430150361407148582a1aa505e2806058782298af9dd17af3828a86685b2d8d6eb8b26a1c489c2a42828209407558262a11c280c280c454005a1fc50b887ea63b80f1c2ba8060dd507323deb0354ee45017f8626cc71a0741823967e87d2a08a07a5c32171ce504115504016054c044a26e7a0ee3d5f82d538a13250009494a1fafaf57e407250ee88027efd90a79714b004467dd514580a4a040007bf256bed36a816ea0d3541c55008280c0a81224355508408d577c0c5580328461e457bf37a472f28c35196140f4aa4a2ee715cd2a974a80dd4196a110af83090e4543427e0c90144b9c92854e9d561fd02c5a094a04828010a0005433150290f05b49c35585dcfca227e14d036bca7b166a038545a096f01d52cc5fc2e194a04243b8c770215400da17828311400854321a050281a2ad541dd035ed262f05009d4188a975040b6cb0f1417541cf1fde08a1b0a856aa170a814285305d527e260c80dcadca080cc8e6b9d80d28111e9d24f8e2a985262a474408de38048a830d43ca21485f3a6a11d8a84d2a070282c14e450ccef06b6726201e5818a360a1832573e7636503a90959a7a8152a0121b258293255a2605d40935801aa122282e14028541b1a13a28d245f59d6407fc1a8a2184ea4301fe1a1f5402a2fa54bd97fa59150742dd782811d0261b7813ea54d42e8586d24279283a140d450d45a0b28d022e404c4501ac39b48202f24528c41150f158373127187ade58cb2c440c254b8fccefd18be1bb791e301dab06c8364a270bb406c8235cfecab3a43286acff4b0fb08eeb87506e40f210fe30f45d79002e291c91c4000e03a373c4999671ee146b34f7d6cc536bdaa40c21244d5616589295440a150691720d2bd99c1482f74d8d8649569e29f210a70440df052c810ca134d69c1a6c510ee3d0f2cf55bf5af9ced6170351c0c9f49f16224bcd25e548e2827cb247f3a14f95e4f748dae0ac7eb9378422edf8ece4a50152433393d744ea92ec4c2de3dc2904f2ce552843693d011824d32b2b2432c9829564a530057401d7cbb2d6cf692768f599ee84b3de535c6332c09dc85a879a4a514dedee97aef6e95044c4f307bf175d5fb0629b91a92a737f221b44a64ca5fa37529bc9e70edd3c722f6f316c08f81ee95a299ce2b661a1c5e1feefd489765d9aad67dace086d92c5fb5a822a8076118a60a84a486ce89e453c079da505ee5fa047f133243e700c182eb5effa9a308775529ff6b24061e3121eacbfd3522017a610cebf043f0a2f18e7ad60b216490b22a95c480fe55e7d483a68575433a91fc006468d5f0e2cc8fb39706300d961cb4a4a33e479bcc1ecd40f5366b424bd0b70577eba4481d5d4e0157ec9aadda368e82140ffd1b95431a003903f6fe329f7d7c18cadcd17e21ba715e2bf79653005771b68c506c7c393ec438b8cf03244b020db82d22196df1b2d4311e6556b6512d1c0965555dfc8767ac0e97b1fe3ec40fecb31e0a43639160191b98f7da0dae06326df0a16ad4377209aebee2c8f4eb26c3e89731d59af75a5f85a9c82310c10429992f62998b7fd5de8b6ef68f3a6f847cf9945bd97ec285d5c573e48ad88ca573322e1eb3360f3ccf188e5a290b4f4ad9fe088d49b974ca2358cbec20c2707a9cf55b80a77d61538c90c9c4f8f5668310bbd7bb511974600120a8d2b0f3c975c1f417b8fccf8280f2e39ed117b8752f3691958c1e3210a0c206ed990a6c671bbf665f9229b6727ea76539641ff36789cf131b2fe364119e5c80701761cc2319a7fc461a77bac8d780781236534a374662726e94012cdd3272990ce6bdcdd04c0bcb8313c130d8194d60d445734b6ee1b835fa4c56396604912a4bd771c89f52d854c0fc49f5f33c0d5fc22cd8dc8b7471a75e419e93f025a2e4572e1916ab2e8a45bfa15ab7373536051bb5ae84aa185023186ae8bec41e80bbd565a77742ef4566d1bf2b4d0ee725539d6fa61ae731d4833a23f1ab3d684585ea4631098d3582b50789d1bbaec7cccbfaf06ab5078e8a7d20f293cf3a3622d633fac533c6dde632ba82e6e1fa0c1978a0cc5e8eb3277f566005eb90102968c64acc19ad2015f2dc00050b3c01429510a8b8f1d80172b1208f9f2a4d6d41b61ed293b0db5968dfb182b2e13f98de895cf90d080ca3a7a9a3803d9e1205f048811885cef0ecdf94ef678e22cc55b9e695dbe3a2261601e706ca9753dba1eccdecdf24d34256732c9928a48cd550c0e17fa38446bd6462f31631c3a2e712fa386dcd55a5607fd2252e0a29e0be055d3bb3a45dbcd961a5e04c0dddb9bc466437fa119095db04f40ab51391b691e29ebb13a437e8e9d7fb57b31ac6a8dde832384f56dbfa187f53a2aafd679652acbad0d9017b90cf4cf381f46068b17c80ad87b1bdeb4b254acda337f4fa5bbea2e27df8abc2f1479fdbf255773b3d6c78a6426b39b38f87c020f9f7da074ca6646023891a7327755400b37db0e463c432253536572072964babc600205bee47f5d906114ab642b3c2411719381a8a5f9f97fae5ca4a13e8958457400d495292b0906a33f390a7ecc3d574a339842c1d7d84485fb8bf2d22302300b4b8d8c755143928266878f94de5a3708370adb69a4d97e660c20d2bba533a01ce963e1178761802905e0f502592f380999fc22e096b5def281653d22c4c9b44f04984fc385793dde3f36915a9b526e2ea1d506371d61c29c1e01ed146b1b15fbb248a6c44be240d0cce1115327ece8cee03b4524f1cf62aa9d95341c817c1568ba2f7a82100619d633a82909543899045b18600d9285811be68f33fcf7e4552a04c198a85eb145e361d99470a56936e2bb96539f7c0be614b6a81c7d861af0a6802283a1fecf8e57db5d304ec151b595d95c3da38d48cdb29ae1f944ddab4a6d9880bbd72b1842d56ac26bfbb29e6ff881e1ed0c9e6e61304dcf84306b76fbd291aac7ed99b64d6d9c430e4b67d8f5e52b3f253d8e9eac57db23ccbd83471785c494f5980d2c094aff481d4d909735204ab8090836c184fc2178ccf5704812d38c18521219924c1691efb3765ade214759d11cc680c2b84f2b9603b657e4d3d84e715ffb982b518156210ed79f78b6e4d166110d66ac0a32c1eaa6aaf365c93ae103b0f465d6499084f86a0d0b86ea5080ff9b2249203259af40d4a0cf84559252ee0251123393961cab5269904d88adbe18da72bb050e9d8ae0815933ced2ae52fe79b6b0659ebc478a945ee20d6ddf0a13a4343939b36b54366e281501354c40778b203b5cebd340d451cd1cb7032de304ce290254e0b7595092cb95a0bab292825e14a59c48352cb5679aa4b07651951dda606efb851afd483e5352d0129e40f5c101d111d58e9a3a647afd10d54651d0f79b0dc89af5133fedb1e2ee499b1407c709102cf8c7fcdfe3eac94ea44c15b991ef90ff1985857d4482b6b890ae64f92b7002b8e55bbb3708e880c4cc968ae54bd1629e0fe3b181143af0276637f1b2f51f11e07a856872b26b4994e233728fd0c896ba884c6da979b04517161185df790baf7f857ded591887eb64cf1065342689ac84d6d40573b8eec7e9b824a53bbde1492216cbadc1db42ff88d4c62a58e758534321bb12e7402237c6b54d3669b305e320471788c864f3df66c8155fe44942b40701140edb4209d3a2e024d4b7f364e024c5edf5ad7d49e809889fd1ead6da7f06c3180dfd6c5d40379d00c4e7653d47a8f1b3998788ea1b9e0b1124cc2db4d0350b070d616c1143ca9e9f965c5c60824c277b5afa243a068b226a1b6131af8c39160abd76c0dda2ab18699609ba487d357c13750631c73027acd5030d7139496e2dd18834da59a5aafac6e09b1af23679132152d373af232f8628e88fda6df5e6348895d851ca5a4bcebd417d184a54e78f38f04749bae54b475943891f696f5da7b59eb250a895bb4ad9992a28597e782215abac9bbcddd0bc99eb2f208669915af4ecb2422ab4719dee7a7bd594c7cd99e7f79d13371ae538529e796f7a74b97528dfdccbe3fe724a7ac52868f3e8f4e922182c938dab8a161aa3e16e3c7eec8a4b413a738ec8a0e6f02d65fef0c3c408e846a3480afd359e2337cd6f938d42d5ef55efa6f9c9a2f575327484b4fa2b8ada9753cf94010143135af37fa3ad398d962ca3a5e7f815c2ae2e5b660945102d53018ec62f03b75e944e13d7feb6466aab40e4ecb4e0d82d35297117bad252ed244fc9499eccab16e05ddaf13df64fb69d87db78e18a85879a116f5346e1d45990d16556d1c356bce4fe2c6fecf090d7fd5e14f7827ff09b75949c596492ca829257253ed312f07add55a7e27b8687a2040a91a86f6e78fc16b9e1da8be2208c0e9bb1c332fc6b21d9d029081ca3081461c6ad1f2998d27152e52540cf2162aa045d4fd4e30fda3005822a5e230597c7b621557dced1438d12643b7a59e7c45574b9cf3e8db7fa93945bbd477369f8020cf67e060055503bc8aae6dc719b89f7b868a4dfd3877793b7c530d814f41d89a8c8ee5d809dac870088564c5f581bb9a50a0aba88931135364bdc67ac0900600e35a4e99e69091d6041f40aadd669b5b07fc95d6d2428b4cbd7c50adf2a398d1f344e79f1cb39f79a3df5bae0a15a7167278f832123894b7a34289ddce8abe8c1ef23107af300601b2cd707fcff644c357d1eccb000af628ed655bbd43b1549fd01128a796c7f4a8aef258d252dc6134fa53df5e278d8c8098d5d859ee5ce9c4a677990790f61753c51805e35687a6f6e2ed6a4d34541f31aa5c4e67e14289a909e236fb4099efaea8a7ef128d883ca0b5a054ded235f429be3af69d3b7a3209ced2da1673f286bbeb0e69b6b1e151daa0dd583f2504828060abe83cab61995351516b0ec81baa1c445545fb024ab19ca4951a84653f80f0b5409f5873a50582828140505a1d28da87bb0fdacac40bd500a8abf45f5ddf01cc3018ac9a3744c43deea1d4a41a92fa87bf0a7060cf50b6541812a4a8711312d4841f150a308459bcf23d720a04e18b5499d5009a1fa78cc07fd375407a0802f98b26947d497e626c183357fa173053b83ba97b408110a350215426d040514f0a2eca427e96979a243c9507880d28106ffddda501ca8b9400155dc04f2a540dd4bd97d1a00144414ad14a4a8f54686074d38a81f5407b58102a11c282e145643a12a52b25e08d4f8a222a90705840a41a9a02814ca4201a9d569c182e2a0568a7b1f41cec6004a93229bf31965598f81ef1cea83929f02968f45e98a94d49850b4a530aa4817a8035584aaa1ac1e14f0edfde77e146d0b0f440e050a8028d1a7bc14e2282081761a0618281db233a47871eddb8262a02618d5d72f30e5a85054358a762e150dd4a14e501dea008529aa2fa7eb6b684145739408a036b0ee02f581b2a14828351406554309a03c28020a3614b05c2f7ae45204a09d68771ee3be3e7ba2a92423373db0070724083178720252ac0cc502fee144760c3750b2a4d001c33f3f3f3f3f3f3f3f2ff0bc6dc1362b0a5bd85226f2ea3665f3de94524a29a554068005462384b4c602c20680c3280007029f0c1e0c5e0c3974e0a8c11683183f2846f70c426a76184483069723860f8a7153b5c3439cae57174870e0c8f1014b70e0c80106aa22460f0ce36d5a638550cd6d0c1e7c3e27bb89f661a2bb48fc606237e6e4a1f2c0872e968f9b73874f596235b8389ff0918ba2499b11b22796e8b33f705192f74caaf012a14f076f715529ef51da47a794f8b04561999aa155a5596b99bd95f6673a96d0ee79c4472d4a92a6eb2f61539592c4e5f0418be2e75bf334a531c8963e66518eda316f50f2c6b8199445e98495e65d9b143226f98845416b50ab175edfb7a28e0f5894367827f956a4f9092d31f0f18af28fbf89cf3933b5665d513eb165af94f2d8a283ad286f28b983e7efd71bf5072bca277d492d257eae38ed6315e58df3796327ee4c92f95085d99af655f2ba23966177d2a4f4eb6bb055200408e02bc1472a4a6772c939b4866c13c30f54946fb53da9cbbcdec6a7284731399f464567fbfb618ae229a173ba7e75ca94e58d8f5214a48930515b9b55922c091fa428273159a9def07e8ca224f4cd97940d8dd1ce87280a6f3d424eecbdaf1285a23c2a359ef897e94deaa02809a7f526e7fe5c9bdbc727ccd9365713d93bb132bdcf356a1e4f4c2ba164c7f0e189626cd32499dc98573646c34727ca3173c97af1fb41a64982011b94a3c207278a1d3dff3b9bd69b5bb5f0b189620cdff145dcc5c91e6aa2fc9e6c935013a4783ef9c844617468cf13748e3c810f4c143396f6d0d6fbb693f9b84441ebc44b8dede77b630c3e2c51d09afe5a4b64eae6eba312a5df24df93b2519e8f8cec482fb09111005ce18312c51651da57a1793eb993285f8e94bf3549a298c93fc713dc4795d47f44a224b498feca093f2051feb8a369b4c66ece691d7c3ca214324b8969339c245e868665e2c311c5f8d8e8f1eb3332628a8f4694426a9824e660c2433482f0c188e2bae9df9dd12a4ffbe06311a5f1ff924ba78512ccc187224a3b6a2c6bfce492e3a9c1e685df0f3e12516afd64b2acfb40c49961937aa7f410a5cd135b74d64726e5a8147c18a2982493dd39c9a28f4214f4fe9fa8ca9f244611214a6a94ccb5657d0ca260f1a9df6265b5b3461025c9c3a70e9bc31f8128e9763a3549d43cf80044f1ba939af2e0c1ab3a1f7f2809c26487dedc96e7fa871f1236e98b6509267d28e66a499126e7689d4af8503031b5f43e7b7787d31ecaf9e22628fb204d68480f25f1bbe745bc6ecde7e4a134fa6173c8efa84d62f0507edd6b8fd9aec4ca983b944c4dce76e9de6dafb143398ecebae32a2a37df752867f79b4c22371d0a32a47649a194483df11c8a2f4aebc92d5ad55b9543e935549e096fc6a1a044b76d7ad072ae261cca5df5267f43399f1862abf7c483921b8ae19ae4bed126fabc6d28a8124767c7ae8c3bb221133f61a619aea1bce5a6dae39f546e721f6a28c63229a32655d3508c7255a3624dce248428f84043491233a566d392e6d3c9198a73fae7a727d5c58acc5092df74cd68f34fea97a124aa8611136afe204339b9fa8a38e184c9723fc6e08cd8b9cbce76698ba72bf92697bceb7c88a1a04555345f357b898f3014c3263d4268b715a5c2447c80a1604289a34207f5e30ba55332c449d9f1041d99051f5e287ccd7ba6ea99a04914c747174ae3e22736a76912c6b4c907174a72eecc310962ab57fbc716ca65720c7ba208b550fed8fc68aaa6ac64ed230b1f1f58a081808f2b2ce0c30af551051cc917366850610a0af89042023ea240c306181110f980828c8f27847c3881c68c8f26d098f1c184057c2c41093a443e92f0858de4e30309313e8ea0c3e3c308313e8a20800f2214e0630803f81042003e8290800f2010e0e307340af0e183f259c853f25c8743c71738de6cefa30725131f111ea3721a7cf0a0989a35e38ecc5ea3361ebb2809257f92e4777451dc121e946ca1af81472e8a69374b8811a573aa8c8b929f204caaf0a8c72d4a623dbf624627e143ec618be229b137d3ce8ec9985a94a4d02254fbcc4394092dca37a746f39ba459945634a86831a92c4adfee73aa34e6cc61138b9292d3eb7d1ecf9a1f58144e50aa4fac737890fd15e5ce38a2b4957e86125724bbae7bf3d76e45c1daa44ee277cd8ae269d3a0f155dffde72a4abb73324b9f3acb58a9a22464ee4937a95349532a0aef71e2e6aabf5d4e5051fa0c27d4670db92de95394547ecf5849f32022539453cfcf58975b8a92f67c3a75f690a2f09ed386e739259faaa328a689d19c46aea7b94e14e5fcd4a737b6e9f0084579a38ab0f3a0620f50144bac95b1f43f71c79dd331e7853c519031797a69f79d2875dd99e58cdc8dc9e144726e26f1b4ef9b285b6dba65fe3f6192ae8972988d87926da545da9928668ca80df7f149f38b89b2e8a876b63e2f51b2912597922126d57e9628da9bc6ecbb17911bab443906599ec7a42729cecde141897257084dd25a096ad94fa2ecd935b7e794cdbf614994736ecb3d99838a6a3712454fcab6752ddfd30b89e2c9f1329c2c329bab3ea218cf43499ba7744479c64f2c5525265964641a3b3c8080116c0001322861ecb071c3cc40066964240c93238781814723caed66a3cc54073f25c38882f092e4e826bd069b17e946ba51bc483752075240c3782ca26c6a62d66479be1e8a608f44a80722cee310c5563749be13356b67507a18a2709e41b489a1bef5b5367814a25c77e3f2334abccbb5081e29692f2d1c44c1a4cb94498e5d102531ef093d9723eb9607a2bc27e3565b2bdf641210e568f7fb72728cf79ffb434193d4493ed93a3f14cfee479baa4d95bf0f2579bdc3247dbaaee4e6c187a299ea49659d79b44f121a683a72a4c48b3f015b261e7b288712cda4915dbddcb741e0a1875b81471e4a729de8ed9ff66e27091e501d4553c8f0d89dc71d4a1f93a053c8a81d4b7e6bb07d916aeca081be30ed61871c498f3a1c1d4a72c796aa5fa6065bd9123ce6502a71cd3e6164b4c94935d8e450d40f6ba3ba9471380f3894d4e724ea26cb4cdfeaf18672bcdde68d1d7c33a46e285d5fbd670fa623cec481471b0a6ef28853d2d4c88662bcbdd4d56af924de494772c0630d45afedf5202dacc186f8031e6a289eee7c5692896ab09d471aca7e9fe6c2c4d618b6e12cf040838d9c0b3cce503ecf72ea9b83699c2032818719ca23f4273967b030c99494c1830c4553db64e2c70ba5a311468e1d57028f31946327dd9fb226958a654003c70e31943fdac6f7936fd27e57830da51a8147188a169faead73d2ce7c028652dd67d3b1a3ff8592e7d5f7c9b16dc2425e78946c25d639c977a1e8a22b93fcb9f927e9b950bc12f4a8c8eeb750fc2e8d53b276fa6c1a2d144389257fdcace5b6ce4269be447a149bb150f252999aafdc2b94cc2fdc24bd415e6c6b85727af7369da327cb5fab501af94ca1268918d3930a0599639acd9a7b5227e1144ab922f49b8ebe6b31a18187148a7163126e37a75f6f1885627293cee38d8e85060a2599613efe868790b5793ca1a8e97c336e07f1239a8713caebdfb9b3c4a38cb63c9a5038a183a7cc1831692c087830a1a8d146db7b12ed37c9f1584279b4cc49d3e1342859bbc14309c52f53d731271dc489198f24e08807128a3e5f92b69e93a772aec1a6630637c0c831031d6927f0384249b63e693d36f3069367bd2f3c8ce03cf0284231c6a877256544c38308c5dff97513738b8ec975c26308259d392dddb7a6613b427808a1246dffee9fb8eb22e1118482d29cff79f5727e42878407108a39c969683eaf175d5a8f1f94b45d4e54bed66692a271100d1d666dcdc30725fd7b676da5d37bf735d89c032323347460606484860e2f12101e3d286e1e0d21c2e3e998ba0b544003089800022ee06ff0e041399b8aca3d498ea977ac5de72e0ab71b9e5bbe4388f97451b02a1d3a4a3cc63ab928c8b41a1af4091d64c645b9e4fe31694eb86f32b945316747ffbb098db649b628d90725a679f82449fd602dca26095a671b935c722ad1a298c1c4c6344dcfa238f284b398ed6cb208c9a2b07173728ca11a1727b1289e70a3e3bc29f17444b02898bde6e4e163623253bea2389e4f49f275d576d4150513f98c7766af26795a514a3d1ba5a164585112231a36868ee9f36e56513a17f99bbb2564335745398bd8f0fd18b3a990c15494f3b56f4c327936284145595b664fcacca728864eff6f628a2c394d5190ff50a3d4272da324b314a5ff2034c6cc31294afaca32e357ab4a7e475112ec4d7ba4898a82d1941e4fd2170a4541e9fa189966c24aa3a028e70e272e4cae2a57fd44b9fc9490a74a14cd58f244c994d04ebea14a8a5076a234a2ee4cce1742960972a21cfbf6fe66bfaa3fb7899288cf41ddc7d1d4b3a326742bd97e2af5cb44f1547a7d4ea2f39912c344b14d4ff674ee319420bb44b16c8479e8f91fcf181ba41d33f0a2c60e1b3568a361004b946e44bed73bc8e0a355a2584ace91d125fdae579428471332fbbe841da5348982d796161dfbc4644aa2681bc424a557278ca891288e2a858ae6becd251e40be50fe1c3be72462d76003c38b1c356820b32f6c981a13e0168078a13097a5c524f7185476e400d285f287ce583dbb9a199db901840bc5ab6b4d53e7569fe4806ca1f578f5f0baf46e1db19ecbb87c173fb525102d944451a6397bb24f0d205928c84f8212ce7e4c49b2090b4513253489a9a32b14dc2d74d2192d959963856275a9d3529dee66e32a1464ed548c8ca6e4b01f0815ca9f44e79960029942d994fb7729afda4d5f0ae53d614c129b7d724e2a90282cef3557b76e9a25f3fd3996c56e205028e90eb725d7aae4bc19c8130a267e3815fac49d5056175dfabcd489e1bc269436eff4c9ac291026143bc97ed895d304a600b28482faa78ea5d5a4149303a28492ec59de6a3b8324a19cb5f24fbfbf54f30b8284926dd665d261ffbc24811ca19c4d4bb6d062f2349a18a19ca5afd2aa4cca248d0a528472de9aecf721e420442867d1f462e7268901902194aa9465cc70726aae580805fd0fd2d44bab5b29418250ea3f294f63ac5ebd1b04082559a1565726f64e3cbb00f283e27d105e1f5ec3241182f8a024dbac4ab215dd81f4a098aea7a19f6994977807c283f2e899b61a0d426ee66e1705d1cfe6a6e3ca4aaa580532745172517ebacb45394b4e9dcfc6940519b828af686c9f9e26d5e1b94579c3e726354aeee4bedba294e95edf47666b51d2db1ca3e9abb64c8d1625371193ab7485286316059329c6dbc32e4316e54da5745f3f4531c88845a9454c3ccae6686f2219b0289df4f93a9a12eb9b9b8c5714cd45dfe68d0c5794946d3a490cd1e91964b4a2e49ed4f6c5c6cee9560519ac285cb6c764a29eb03eaea2247f5ae9249c36d3b165a8a2d4d946885ea96c7e2f15c53cbabda24db59598230315a50af78c491a5d1be4bb21c83845e9ca635dab29bb3c4fae0c539404a1fa4be377b94908324a51d43a613b87f90db75f06290a23ffe54ed88a8c393b10648ca268e31f26bafd3aa8900c511473fa1835898cca0845f18350a227eb1cbdfecb0045d9a434f1dc38f113c5b44ee5a7d751836f3c51b8f594677aeededdea4441668893417adf7eb832385112e2acb4c773fd0e4fc6268a55a3dd257a902236265313a573d31ac63d6a09edc944492db5737478fe9c4a30516a4d6af28afe5ca2d4a9046919c44be5c9c8b0445957e39566ff16175d6625ca2f636b62862ed19ecea444594e8635f946ce9c44a973668eea26f1f2e34c4994e73794d8ea2945e73e33122555a74f8e7ac209150d248ac9e2648ee2f6238a952332c8242fc311a572b54eaffa1b517055156d3a9597bc31a2dcefd5277aadd996691125d1d119ff2cb4cf9e88321451dc1639b965ba44144dc88779ef9c46e5c911511819fa4bc98c5b907188f2986ab4bf924b33b788320c5110f396a14d5092a41e23ca284449b2919ef1b22444d932f6ffbf6809d3a24114a49bc99bdc4409a2398228e93c6679aa71198128bd959fff6a79723b6500a2eca5c48ec93e7f7628c9f843e98469bb91f1c8f043496934994d468ba7967d28a9a9b23b53afaecdb80c3e14e4dad589a2a1ccc5a6828c3d9494162d5561aa6963848153197a2895d99be8498c51909187e2ccd789419c6b1e25b604197828071dba57773bc997ff4ec61d4af2893186933b47861dcae6a743c9134d96cca78c3a9474ccd164cf4e22830e2511199d467dd494d1aec126630ec5ff24bdfe733e4ed0caa124671ccf10fa8a437175bcecdc4a666f090ec5ab389d1ff4fb8672dec59d1c5e7b7b536e28e9933732c6bc1a3eb4369494ec34a194c72463ccb1a174379a94a434bf8652754753cd93da4f5743492cb973b8c8d422364a4339c7674ffa3a5a9ed4a2a15892f44dd1d99ca15c72f89e13cacf5483cc503c513c89d7f15f829dca5092ba4c6b12e9b9276cc8500cdff60fbe4193a4248da1d4b59d2fda8aa1b8315d76aecbc350d2f03945ec2c030ca54dd649da2064b68c898c2f14844e25270d6fa9a11e195e2829915de2b376968a25a30b25e5a1a38b8a51ba1e86820c2e946d841077824942999a750ba5ae915a279af426c8d042e142b45fbe9bef4972441959286cde1ee13185300932b0501cf9314d4e733f4c9016645ca1f89ec3956d5677ee8c150a22b398f250929f4972aa5012fa73fcff91e1cad4543074c4690a29ea299457b3acf6f87552af91424949a13e4267eaaf3f0aa5d50d9a2413b47a3e29148af1996a4bfe89257bfe09a537f939bf3e57764f4e28b79f9053e33937ebd78484f73631a1e47effeb7a270923cd25944e7f9c66123ed5c7aa8462c896b4a19e4d4269b764d50d5d8284829df420fc4b76d8701ea1a4eb2f37ea4e2394b59372fb24660ed37d11ca172626939fe029534c8462a8ba87b8bc10b1dd10cada269e5ffa2784c27627993e2e5f69c241289c0ea1744f4e13358e8050f8cee62d9b8492a1df1f14740c9bfb4fda07c5e0a5946062667a5076134dc97691cbe041499bb42fbe1da7aa25bb28f7bece8ae6eeb0a7d74569ff772c4e664f77712e4ac2ee4e858c372e0aefe9e9d1e47e8baf47a76b87756c511a6592895d7ad7a2e059b2694f4a981605a5243b25468ff5ebd12c0eea374c106551527af494e46a23c6a2b05fa5cecd3a8ce71c44589c639f2c32534e315e512cb1c7f3efa6677d4f1262b8a2e07135e9abebf220f318ade818ac28f5fe78fc90711d637c15e59c4e8e41c55655146ddf64cb7b7b12833c1525196192e0b7a98350a2a2985b723e6b87114a7d4e51d01ea6449f0dd79e39539433899fe37bee1cd4a64b5132fdfd277a92cc3c4b8a6252d2aa5a6bcc49cb388a626649ea4df81266ca248ab28c6512c27d3d683c43519264d5566b5e415112133a09a546346f27f944495ef772cfd7149f644f14f443f79820bc189d28d665e8a9501d278a21435f9fa04edff66413c5faf56c26af26dd9b26cabd793366e9ef9ce32813e5cc234a18253c4bd02326caa149a68ed194d2f8da258a9bfbdc8485c6ef972d51ca36ddf8499b54a2243a29ed4a8f23d43c9428f7c85c929ce5bd32bb49943b7318e5a92949944ffa6463f267ba3e51248ade7bb31a350b89f2686811a6a7d442ad8f282619f6fdb64a8e28e993694bace3334ba811a53e25b6d586d737b16684a7a2335d44f1c4a8399850ff1983ac8854ad669d3aad1351ea581e4ce4dc9ccc258828bddde792d496621ca29c77931c4df29f7b098a6188a28e9039369e14a2546922cb5326497eff310851d4e0ffe2b2699289d0200a624ba8ef518fa39ec51084f96fc64498307e06a251e53b621902a25419a388ec127438298df1877de54caa4d3a64c9c7f043152246084bedf39c1a6c17a30fc5d55d6e9859dcb8a5b96bae1f1b133bc80fc7e043c9b39c1893e469be598ab1879250f91e74c9223d1477d3cce68c9f3bedcf4369f6e48d9bb388cb128387c27a9834c983e59cd21dca1fe38970dbd81dbab643d9e663ccd3b3259ab37528c69b0e9364eefbdb930e59c9d4bdff1c0a379ea3f664e5a0598c55ccc8e8b556cd28d1e492d46a3a0ea5b714b9fff81e9a4ee050d2240916269b9244e992371443ef98463329277b891bfc244369b8d69836944a949f1cb3a82741cc865207bf101d54e9f053d750bc92734e77da637b490de5301127eebfa4ff36d350568f9d5f366631d0f08693995bd3a8629ca11cd566abe42b71529c662809cf3339537c31ca50d2294e267dd5c520433974aa884c952777b43bc618ca3b62929c73fe7cda670c31d8488c30149424f24cadcb8ad6135a186280a170a3ed253f4e31bec096cd557ec7eb16c30b4593255bc2eded85185d28e789f7b9fb6a262a1b1961440c2e94cacb3baabe9d85a9636ca118b2a4bee7248ea1855249a624412e565468c79b4631b250de16257bac667c743c31b050d26e9258f7b75ed680185728e6b0994f940e32f54c6258a1984c990cde7756a1acb98492af9f4baa53e3c92006150a42a8dd935b62a6ffa631a6e05f783ee1779248a16067926442d865d694a350aedbd82ac94a4ed50485c229bd7b9d3b339c376ed88801f620c6134ae29c184dc912fd20a7bb410c271483f856d66f4847138ae7ff9a3b870d9e8493098513b4798c2bca1b333049424b28aae6d4efebf969e65a183194500ed2844c326c94a7ca8883184928e9c9c613b4bd55735368831848288a88ae9cde6c92b3c311e308c590f2259fcac4644a3742a994542ae276735e534f478c22945c6f3cfe83aeae5012a1782384cc23d44e36874937be6fc41842d14d12afdb1b474c73f72286104a9b93cef14a0a0ff2e4bc2008e5f89c7973f22e693aa363611003082579f3e72cbde9481ba5de467c694e17ca49a7103949479446b950ba0e2d1963f292771d36da74dcb0b163060e10d942f9939ee6249a4a12056820a28562aac949dc468ecce9ce4249aa90f9a5197b37c7582867eae9b0b626c7daf20ae50e6b9dd4a42695ff5be14acf954bd3ba7bd50c72c32a946eabc47ffed3399550a1aced26327c7fa650ee346b72f8d448a1a04d7c3fbdd255d1a14814ca721b4acc3a08d18c43a13036235f236493c62bf284920cef9239c89c2fe389130a2ef6be75ff19f763449a502e6f4f2df798cc348709c5cb5ce7a72bcd52c72594e450629a7b0d4fa289514249aff30935fdf897b948120a4ae7f9acfba5de4716414241b50825e652f2224728e6f18cf13137c67b2b62844db74bce4e6cb75cf5f4fc735a7fc8ba458a50bad5ee241ecb800811cabb49d4d9fdd1ef71141942f9f336bc33496b828e611aa62242e0ae3bcd3575ccb5ebc35e283d42224128ef08a5277ff3a3230242f1e54f68d9d56bb0991c33d86174e4edf8c2068e0fac99210d911f94735266f27e624510f141f1ba4e378c7811651f911e1464ffa7b6938d31453d32827610e141417c5e6e8fc63cd14cc82e4a17fa2faea4f35835d24539c642eef45a673521b928989f68e6a7eea574878b82afa96cf19d9bf5925b244753f229ab726d51d8d3aff9049dd49d94d5a274bf7127a6ba79d3295a94eb4e8e5776f42e9b675150bfcd4cc296b2b063cf754dd776e5ad2dc3946f3a9da3e4d46351ecf02a5f1f7a766f9a542302382c5053088145c1545a96183637c97ee515425e51d07bc29c4cdf1e26d3ae28a6cc2686d2dd0b21d3ad2858085582865535e14fac287fbda9fb953969c55b45399fdc6db2d99f762f5520441505fdb14a6ec80dde31c3869054942d3e5f975882810ea480068e1054146f378406258c8bde1ee19840e721e414a5d3204784a84ebd6914628a62d0d0719390c6990d300c0d2f74981a3407424a5190316689e68e93a2fce3f9437309fa356821a328655b7d96d62e3d9328d8b2757b17b1b78c1f694abf9de4261a8a82d83cf1a25386f4d98480a2e8f6b9514eba219f2807f51bcbf8d9cf7f433c513825db58e8d589a228ddf1c2a385d637cc1739d20e3e1d3a72cc60023ad28e3024e09c289d980ea31fc2f2541bb209e77b444982aa93261d219ad845c4dcdddcab624f3b339e52675d6562428799b8104cb49fa771f566f2a199c5d4c90d9b904b1484963e379974d4dd6e89c26997151d3d5c4b682a51facc0f639bd3ddf4a2045ea376a59db6e2597726089defe4924bc49c4461b38e1e25ba9960298648a2983b6927ef0f25bea190481444ce448426314e928443205178d33cb2ac67d466d203421e51927e55367237e7f02347946466d9664d0d25c81ed28882550665a22991ff358730a2f46153f3da5d791e6de6224a82f8dfa4398bac0e934c4594e4d4e8662685d02e32c44414534d29314676f21d250f4144d9e3be8a9efe1384ed87286e6c91351eb5f32879288418a2e8e16cc65c733734ee3d08294451efd7a4dfa87949720851ea2d492b7be389ed1e32886297b97ffac6d4b65510c5ffe0b91a36dc64dc8404a224dc2895fb61bbb64a2180289a2475c6f0491bf28782d6cff7c850881f4ae2e59bdd270fe23f8dd887d2951c4df521848c5b08e14349a84ce359478ae9b4410cd94341c6c9ae351e0fd143e974ba3399531f9287921cef0f5fafadac31082178285b85759b7d521b97ef501c5bbf19134fd212447628c8ad8ce727ed4e50e23a94b4aa4eae1b910ee5340bd99a4365e376e6500cbb7fa55743cfcc54851039947aee73ebe383ccd81421240ec552a35ac2dd835e4fa9100287828fc6b0fd9341dca76f28c7125fed4b7e4f9276433983aa3a21bdfb34d73614436df63e8ecc6ca76243d9ebac640de50cb7de4f520809216a2846d3bbfa1bd31e084943494c323267ff0d32ce090d651f194deabc4975533e4349c7e8e9a7d733611d33944346e8a09d3a34fe2a0326baeed615ef5a756d69397b4227133c870c8c503a68faeb3b8662923ec6a4c397ca18436228ba5ca8a75f3f0cc5f864f287e9f89a660386d2cc082d3ae612f24ed5215f28f868a8fb8ad80be5eb70e25ec649178af1c43d974cd326b5e642c98496933b7c49a6e4e5215b287b92844fdbd2d142b1543c8cac7337f9b31d21240b059d7a9ba945988ca2c5427964ee1979671a33ef902b94846d9518647718930bb142d1d48fc611b2e4fbdd2155287aa8f8dc768d9b5e542a94c4fca3b3bccee6ff35640ae5f64cba721fe5cdd31029943cc92685bedb8444a1f4254f9fb8957d1fc41028145bdbb36d4f5a71cd439e50ba93df395274520e1b14b04288134a2174468dbb18597aa24d086942a9c47aebad924129796d258430a1a083f0ccae494f67bd6a30762005344642965094b70cfa4d946ab0d5d031831b896620440905d3281a54e98b9067d6607b018e1b189284620e6d25c9d1d4ebc48cf922318e0d20a1abb84bd52f57ed7477ed2f4943ebc4d231492f78018e0d8081a30323232fc07143438e50eeffd5d839978c50104a2893791aa54048118aa976763f9c44285d8fce12ad5dad2f838290211473e3ee663511f2632e849228b14b84ce0b13f50e098297d662b1dae6d696997dd2768a7febec307608100a9a3a8e0739579710f283c29d3ce19d94185d4cea5808f14149caf8892729f9fe39ec84901e94048df13eee94986ccf85101e944bfe19fb5d0bfb18d500d94531ae96c6ec989500a28bb2c91a6312dd7cb6f4e7b928e620aea683c7677bb868f33ec5f36b64f4d23d5433eb6f79265121f3050e1b5ed8b8e120b728f5ba8c959c45ce44df16a593ac2499eb37b52849aac3549c8b12ed3b4600a145498999361ad24e3a4c8d0f300d0b03641685b5d2ef41b72a8ba299bc994e9ef10451e6485f00894531c86a198fd1438735018145b92f45ba8f277ded5f511a4de12b52abbd37c334cc15c5934ff55e061311bc0e1b5e24482b9283501bc62cfc1c660616b8619c15259d4d7c338d56e357ea551494524d22a61642d3abc1a68ad297d00ee2754c7335a928cdff06add9e52276b20e4050518c614ed0a15a66f7740a198098c234ab16d5dcd1b6b85c93c4b04b51da68723cb9c40a1dae2245e14569937f4209c828ca697e3e5dc7b5d4b841445112a37c8d4932588bce86a2bbbd31cb5cbd7299570f26e79b4b0ba52350147e4bf66cd289cdcee5274aa2bbaedc98209e287612b78474fb309e459d28a77bc6f5bb5b838dc66e200212f0c0062cb03b6c90767c81e369ac71a2248fdcb425c9de0e1d386200b28962abfa08796f16ba7e4701441305fdbc0a694af85cf24787b9310197024826caaaa941296974734991f9c0c8080d03c144714cb579f6a46aa1f49728766e36fdf3b6f145098825caf21faae4173d8254a2f056f623fcd449aa94400184124513e166268a6ab609029944297694304ace410b2347f7054024515077214a9b9cba9478a11bc946054646746c183bce0b209128e7b71e53e9b1a4062151cc2155554598f586e811e570be994aeca9d37103e288f2094235ddba8c4e7dd2888289cd7ca8944bdb9f11c538cfb6d1d3f6dcf9220a4a6d9d3eabd5543a2ba218375ed207b9b81373798928f9865c784751d2c37a8a8882cbefe92679276812563d4471ecd3a49b983a8f980d51d87e8d9a4449a96a21ca2574ceb61d97ee7a6a1a4008512c51212343dc54add783288c69d90d76662686ba0451928412f79817d3a9633410c5922b931fa46f8edf8028aa9bdce3eb39893f1dd53f946563efe951e29d0e0dc78e2f30303212468e1d3a6cbc20e5f001881f4a26eb4e12a4cb75ec3fad046d3901903e144dcf4ede58e7e7beedf8c22c1f8af1393bb2346934181949a301eea1186bbc44d9ca9247da1cb0014604d468a046036403881e4aaf3d5f1ecaa2745e7cf0d4776e0282874c7fd32c766d903b94ab4c099ff1be1e80d8a118f79d444d3491ef79903a94abc64e7692322074e0e4ea8469de8f39d3207328a8e692b9a4aa92ab1518618ce0032323378ed9910307188d0510391484899afbe1dbffe4d1c8881840e2509017699a31ac9c5af10361ec0863c75d01040e9ccc6c6db8a86dd6568d8bfe390b4d2f1d1840de50d48da3f9c4dea83e017143614ebe927d93aba1d394e30309d286d2ee954ceb7e15669240d850f224497afc3f644cf2bd86c27ada5bdf2e13b6936a28b9ade9f4df2bf9b408928672492174dce42428b184d150ececb6724f7286527a68f5384de2a8d640cc50fa5c9da579739224e945014819b22e7db396cb9ccdcab60ab91b435c329483c9c5472f41a6f0fc1709640cc53e416ace4932e95d8f183c133911f3b894176ffd2cda774be82409da3094e48866feb79e3eb1beb091e80002868214036628f69a9cfeecb1392f4349cbde079bf1246a92a12c3ac58927b66994c6504cf5d9caf327f9491443f16343ff6a34f9d10b43418c8d7f55cac61018ca416b9650d1f00bc5603ac953ee412f143c6e4c6b0d73d5a42e14d46dafe38bd5671217ca9fef9318634cd361da42e1c2c7e563490b2541ef62ef04cd12cf42d13c2613a733c81863a1709acf4b26a5f55d7485525f27dd21f3562886fb15b59a5385d2fc86aef6b0a2939c0aa577d7ef6aaf3f319f423183b4d8183a278572e5ca565aefd6b517859286bed3f4f3db3f0f0ae535d1d3bfc94dd7dc3da1a04c18ed9dec5ef3764e28af2641fdf5f3a6d8ae09c9f5b16342514fcc6e6727f163b484a2897a8dd149899e7f2594e47ad73f3d6523f3492869f66bcfa5ba44ed91500ca54fddca8b34217384f249a2e77f527c148d110a4a66f9bd986c21572b42396fdde9188412b755234271e4372971b65f42694328886c759bc999108ad19424e61c93582a0a42b1e37f480f72d63c09100abe3a3af4930e17273f28284126997d261f144f932e31714c9f7f801e9484cf415975d4fdf7003c28675f3de9a4162bf377c1ca09be2e8a1bbdb54a2e4974d4e4a2e8d77165548e8b92e49bb673ee5b9462f49489a2db99c4b628a9eed30fd98d49676b5114dba0e46aac6d132d8afd7f2f22c3f8c8cca264c266917d22d4c9aa2c4a4a12d3dcd13fbe83b128888955af76b028fe7749ba47af28ae49b37152349c1c734539c878b092561453ad4e6a69062bca412693ac24c964c62acaf3a394789a255baaafc1965e9003477268e7aa2856f95baf9bb8561eeb9a918a927a9cbf37cb74062a0a329c1275cf2c3d8612d55394b3e77ce2b57ae9983e39c314a5971367e489210c600e1b34c0d091368719a5289a28414613a91e834e328314a59149c75c7d255c09f3288aa73c6cfcd56d12bc1545418ef9ffa6e7a431d65014c7d3d9fedec8e634ce0045d9cc63da8d267fa29c6378537b0f2f08333c5134b9d94f9cce933c9c086146274a5ba7a93fd5a91739274ae2c27ffb45661345cd6a66829c68a2549e644e63b9759d431d99289fa432c79c3b87cc66c244c13c9a70728e9de424d34b94cfe478d0a9d34dc7184b143fee97246e095fb2a54a1474fc28254af2e329a52d6f6338d3248a26a8d52cfa45a937257692a8744c4aaedff845c22caf8c8bafcbcc6640a2a0252725ba4b660d763fa2ec26423f9d876e80e10506c290800e1de6033f32628e28ca261d7f54f56473dc88f2bce64d723849ce378d11054b39f94435661125f5257ccc3e1ddbeeafc1b68a289d34e55b5b42a912ce1a6c896846224aeae733c70fa74f4bfbc00c4494a418956d2b0b59265a830d2fd9c8b1230f51ee12f22491bab6316d88a249db498d495b0d362fb610659fdb9884931673926c924e8882892935c9f9bad2cfe54114c634adf4478931ef331a36c051831d2d88e27a8ac664258fb867f502512cafdd76ed58191b5483adec055fd8a8a1c3d4600ecc00444136a3ad7fd49c4cbcf50fe530a3da4d78925525a9cc0f255b2f0ddd1dcdf2ad1a6cfe3a6c78917d28a6d298a64c30d9b0976d0433f85012a72709a34e7c2891ead843a9af3bc913e4c44c92e9a19877264f4306714f661e0a3fa7a49244d66c4c8235180f25bd262664b0f90e2571691ee5e490f13b5866d8a1a03bed9efe2872b3dd3a149387cf5869a1379ea543d94af3ccc3c8e8756a0fcc9843314bcdc46fbad5242b95435937e7e6f2f7d62c9b068d2f72dc0566c4a16876b2ac7e9998736f376ed8d0c0c8080e1b34c0d0a170405fd8a8c11733a0f1858d17a42380196f28ac26a1ddcdca33fcc80da512a49669d28c2d199cd106adb3765c4ee3ebf6b624e126edb406931a2c81196c28789589b44c4d621499196b280793ba57b23769c56723497206374c093050810a8c8cdc0c359474d07792c54913a1d58c3494eeb46c940b1d0dbc75a8c766b85ab57bacdc76c7757bdb93d367f0247d628dd68f3135c30c5adc985e6dc7b7cf9aa0d3e9b01b3c2e98518672d75e5dedc9e1248d93a19449db9fd01babc3555a983186624c279949426aa8927a1d4498218682b5bb991c113a97492e0cc5d1e26d2eff926006184aff497cc6541d4d27fe4241cd49f7dab02e1af6195e2828c9afb232fc6a841d82195d2807d5a964f3dfe7b26770a15c6a25535dfd334fce164ab277ed33b4a0cb8abba95d768cf7e954219394a1429784195928799824a704b5f179923768243070bc0eb45481195828d6edc94db6a13e06255728867cd3d1f74c073193154ebad7375528099d33a375cee0c1cc195428c694efcdb7dda227c98c29b81a5aaeefaab55b3bf7c17474c96ef26d7c86148a27fb397614e5aaa504258e4229e7347f6dc93de97fa6614607faa43b980185c2a726a957a3abf5d68c2794fb241bfdb20e223c35c3090539654a12219e0d1c25581ad684921457ba69b1a9c10c2614e3ab986cb9bed924c33037d2054646900d528d194b28cb891f19b92e66b5cd5082b7367abbba79e99d1b9b1f4f3213bb8327abd28b1949288acc7ddf70531eaa9c8184820eb293f5f999f84e728472ecbc61da24f1f58c5092bb214e47e69358a72214d53d93189359c2dc3e8308e5b23053da3c4fd02447c28c2194e4e851afee5763fe720f6608a15c32cec5fe974128690f2243892598b7d84028c924aeae2773db2fd98c1f9447274bab0f194684b855878ec6b1038c3072fc3260860f4aa263b29b4fc2f95a23233b8c173970243474e8483968b4ea408ec18c1ea04e77f860ab5bff60060f4a2f2ae36dcef50329c72e0a57c29bce6c2ab77545745136493e88589b45725166aa5c6b68bddcaa665372cc5662a5082e8a26863ebd9fe46f518e6de99a525f933cdd16a5d09251ebf67115e25a94574bd2923eda9c7f9a0722b42826af3c99519e26671f0922b32829b9d03a32f20e1c37443032c2344cc70e1c3774b489c8a27842a9c7c660bde3ab482c4a4a8c7bf8acb2af994404169e7610defb723a2bf20a342e652f3fb52edc56664f4e3b3ff94950fe8bb8a2241b94924508a519b3482b4a6a4cecb4666445e916ab57f7f2221f931c4a64ab2849d2fce6cfd19f04d1c006420a789f79aaa2e8663da6c4841505915494f6ab75115494ee4deba67dfe5a6e4e5150326da9dde7a62896bb8949d4a41a4e264b5132bd762f6f9d14056d576272e3f7f9dca3286bda98247b6ca2286d12be2773cc9cb39484a2a0325567aab7cd730b14bda5cee88e8bc5dd9bcdc9cb9c7429ad41fd094d90499df613634646aa20e289621a159367279cccdd1736d01733c0c197db9d28996bad7f4cd169e18d8c340d4e944da59670ebe3043651925475bdf66755359188268a79afc494f5fd8a934cd808264c2f6123229628772aa953995279caf42295289a4a134294d49121935062d35ae6159b9426c1ea6668ea55c678d5e59ba45398364d566e9244a9475b7cadf2b2486ca1646e0689e298c91c79ab0aad311d11794449b0f592e4ef501131d760a3618354832d8788234ac2df8852ba57b33b74b84823ca364ae77ebc0e8d18a40406da17228c288bee1863c7cdacd9fd46c0082c605208d2dbb82182911a228b28868a5f8f6b9fbb9583e1858d91111c364646bec0a1030634b405228a280977dff91f5293683d1105214bd89f0e6f15999374208b20a2fc23deff74fa523a260f510ef11ad373d0a618182fca54c410ec5dadd88a58ebee7ed7bc0793ae329a8a931a6c5ee0d8a16306bf35102944c1840d1354644efef2498108218a394a64e4751c573f890ca2bc1bec4e7e9f2cca4f228228a63c65db1b736ab0e1b07127120816880022edb091c3047f285b9727a9276ea3a13581881f8a9a42555ee329d287a275566cd49817e1c36154ec9c52377e61e36c0fe5fa2469773ea9ea7ee481f485074620a287e28aa692bb9392c29987b28a2c413de7524ad398be2081081e4aba2fe2624d4c3207e51d4a97fdf9a5ea59262f0c88d8a12c3a5c7f971426326d7528dec8ee133d4b9f7adae9508cdf4e72963d615f631b7328a717d95a1dda47ea470e0535cd7f259e395ddc3814f4ff860eafed24281d0e997ab4366320f286f2266d720c278e0803113794a35f87f7283f32657403078ea37a43a40de5f513446689d85012a2836937c14e67c3226b285a6813b3848786306d0944d480756dd5c8d957b5876946d951557991034705bcc88123e11c3bc04843e1c62d94dca413414341094aee5eeb3db34e32226728fbfd8e8e8977a208cf0c6ea41c60708b98a13832c9b2a14ffa128498460dd2176b1210294339469ab9072ff17a823576980f648d1d068c0c63c7a50819cad5ceddd4f48e11d797b992c3acb16387c8180aaa969fd4c888a178aa36dfc9d341aafe226128e68b29b935f747100143e9a450e246448928b143912f94637e9334447cd7c639125b8ed41d10f142f9248cf8a8342ee622e25024120704c280301406087817631308001840200bc582c1603c8fa4e5071400045d2c1e382a28202222141610200e0a05e26018100687c2603020180a07c3a07060889848a13cc84a465924120ed7ceb69ea9b4098b722d7dd09432be77f5e1807c0cf37d9cabd472e45825b01d523c9f625f3015d69ec37630284183e3934398af55e45ba2c7890e55515dc24dcd41c9f84d1712d2c96bd9bff8e486f9f87580baa23820464244a92aa08ff6605deb60c245f6e102f245f86bb530e918290e8e6173112a6c90ec31612c66379e4f79b63327ad8dfeffe8a6d3caf1eb006545814348321f473e05797a7aaf45c4eee9748072549d72bf545b9de82a852bad73119274e0bdcd53daf917e5dad18b328b5014ab95d61e3a8254a13a29aaeb9e35d053ee0e780dce9cc2202c11ae2d7839e9cff3ea112d7fed0fceafd7c90fa108b3db0353144633c05308fa5226915d5774e21ccce31292bee1756da22ac3e93fc8b373d89970c601c2aab0266420fce15b02aaa558ffe3f174a17f8ebbcd1f56ef873933a82c69963386035ef8c846391bb4dbcc6abe3441d2ce5771c476370a6d6f79bb365bd4b0927fdb1876b1577ae1f46a73b69b320fcabbc0cb36e4187cda4229b0259ff42178e4651e0b0f7145aea331f45a2a46c09e9092a6666c3d523cadb41dcde8ee927cd38d04aa6ae07310a2878a4c6d074d2b08e5d82a0a3f3a5d4f594cfe2c8f439ed132eec9052460439f23106b1b386904f6de602d2aae1b7f959ba5c9adbd8acf26738e272adcdbc23ca535de78a5aa8780edab7a37057da4bfd9e40a3fb22259d3fb0e7ba4139275ad4f3fa5272ec2572dfe1a3c2fa1872f6c88bf00f377fcb2dabc820bae4a30c6b880dd6fed190455f501db1421240fab0ba7fbce9d59800ff6f4819111f35be8aae8d0794f410b7e88dba392d6820eba407a34b797c5c7ace324961cc0e4acc67bd0f66c3e924107ff53ffef850822ebf57c21383ca3bd40bd5f8c6eebb46c4795512fd0e2a2da14154d0c57cd84e761a410f7cc68f5445d998e8973b6e4ae0330d0e72f0877a15bcc046ceb0b35428302e7138eafa5687a8bf9f1b5034ba1c0906d77ea591c75a1132c7c9155b1096b2a6e726914721e60b31ede0c2eb1a7774ecb684256dacb05c791aa73819be13f0cd744c422b8146168522b818ba6ab5c8c52ad333d888e2d54158987e84544d36c760abd0d5c16a1a27e949e422b02eb91ce192456d448426eaf1c652bf8ec0bc3d39442a53b62435662298cd421099c3930450970c4d62a37d460c25c512568d94213521e0c9bd41165ad133c04cf4102419482d6eaa4523b25caec01e398d97027c0890aa113f29716c046db743c285addacc176277816c63a73ee486f346ac2b7d6428e53084937d8d6a68365b82105ec37914bdb042becf5154d92646d13885f9ff1fece955ded89c7265b950ad2774d2310476e678984e0562f731f56913a9919ac2ad81c57d8725694c04818e64c54303e1abadc864f0d694d912894969298e8f1bc078876677518e38327911d46b9c559e6602801ca4181515d810ac477eb7ee99ef8ff24c2380c3f76c3b1e19e1f3e3434018683fb0054e9c6ae238f69728174e1188d2a6bb46ae187780b987abd86c3271b9502660f34b9043a6b6092b0b0762910ae706332b35abb588a0260cd62ff5ca4f1cf210758749902e447e0e1b6de7d0d8d2fb4df7bd98cbb8fab0dbb7aedb3178abeafebf6ebbd3080a146a46111b19e099e4c2d83de232888aa25f6501121a04a0c94fd9b9adcf151bfe7fe20dc2c908696fafd38f7e2ab03e2635cb81786eaa225be282a45741dc820ef176a50b6dd1f8cf99cae3a41901f3c1f3580b6212039d7180bdfab291cf6eeb430b183e69924ec706c148f92aa6e038b3cb76c18a18a5797fd959a493eafcddc0971837f22089ce69bf88038170acecbdf5a8105706b1ddc15028571cb4c9b09bd01d90f384c067e78151fd87db988dd50a3493a1a898ef43a621f1053d427e8b20198717adf2f7700407008a0b8be44be5cc54afb8fa43f1ed028b253f4c52745d5e3050be6f8be07afd12a011e07c2383614bfece97e44e624b5e60bcab5756867fd2311f1db8804c87d5bdd1f846edf8396b2a324ce82774f1bdbb8772fa3da6376eca4c7a5c5b91b0e2d1038321eda4b598d45c2afbc285f48124a2d2687647822aaf11fc23a55b54501c4fe13b8beb0f390676a09687ae6f9f890ce357359d51fc5b1bb1ef3bf8314ec4115336adca10e3fb7689ee97a9203915eb59a3b0c70c41341b34fda31831d8470875101fb1f3c819c9e88f8af550aa36d5e20b54a78d21999a066502a6791f0ea67564afd6205a578b00927fcf6e07e9a45583d9f981a6d640e20ba6a99b9a45723051a9bf7b85becfffb0f652525a046181dd930370e0debc158de1387e6b738510219a3b331ca5905eee3948fed9bbb8d6662926a0e492dfc8c9a92b30a33d9c05d76ff32e38a48bc0041bc960330881d04f7229a401c3a6da64863748dc1f40ede9c25997558b4cb268033eb420264806441d030c47235f008135c20db999d028aa38c8df7f1f9b5c9304c38518c52be922d56cebbdd281ad2803a81eecb38bb2c025d0be123366106a2c82cd8ceda11e7e7375fcfa93634240c41506f9b1a2947de44a04d2ebaca6a11f930412771d67a241aa388a9db2732da1974606872240260881329cf23ea6233b923acab2565438fa42704a9a873f759fe845a6e6c96cb53692fc526fa20b22a33667c5777c71a91ea814e1fbe83e324902d54713dd6a9cb15ed8443b77525f75ce922be2b61902cc3ea5682932f925ec05882610e4434a0d2a8a3cbf7874bd0f2d95dde3c9b68322560576ba8c40166fa6baae98e0eb6d211705d25f0a3285a53bd212a7e5d5299396fd8200066a88ca9d6cc66ec4a43f49e8ec9c2465040ab5ba90f346a08230b0a02ee10379d2ecce245d85c49e75d62bf865588c021c408206bb18cd67742306b9d44c786b6ad9a99da2b319f78d19a3da02b5ea597e208c0020521653a050ed39ba49b24e084e4c98d52ab0c946086387b36b320f8140963fd9477b9271a60323a7f8928c5fb44abb6a62f9998b0f672fc7f28627ab761b6258095861a9e620d50dec416d2fd0b8f0d81c8fc794364232ec93f557adda65681487724ac6445c56dab03e584a755bc1242ae5210aa77c9ccc16250c612ff66f1efe3af262d5c9ee6b89bc62d99dd7686e370052f1c6da49e500a5cf9aa90c7dbc2c65dce2f74e2a754974b01bf8dcc066429ec044494f8c7332fcde675a8ab36b622fddcfec0989740812a3456443a70a274ec6abd01e9aa64d0246915b93443e7a516db548a0a2071b1fae220d337c0a444ecfd9769c7a03c251839300210f2aa621706a21d110f8139241fa0ded38f88fdeba549e0ac8d683fc8921fd3342a91ae0c1b30a15dddd32adcfef6497d264564c6b595143ae972033c71ccec92f90c4f09769a24d6d225dd4b958ceb044db512e870b73c84d5aea636e98926b072544c8e64582bb76a2c259aeae4d0674c85530cd021b234957de14da2998278baf587b19fb987909014791e133a5bc03170fb1e474b1a8c12b4794f0038b912c5883b3190ef07cc1ad14b1f86989bb8cf245c7596705e52ca4bd0498014f880714173b3610d5279110895611f9a8dcd3b653012d0523d411993e164a11401285bbe007224d9cc86aa01763f3a4ee02a13864984482f61050b23f57f15028eee973784aa03b4a6a6f6468e3e9c03f26ae2c390946c736dc50832dbaf9740c59f954552c497a61784629b5c09decbcb91cc7005527bb38144443a2019e46e0729ce956ce4f7b9c56a012716183798de658daf4f82f9337260ad0f8f32805b2d88190a19655b74ee43a6d8af6aecd71ad32f5d0dc2312da6a2d446623c01f687bf9fe0c09a73f3bc583d22a4ee9d97eb78c8e18d44d8113173b553a8f9ac56407a39b49d394129fffa20a25953e17643c6d9d97aa7a0ee6b9c23aec54e3a842e96ecb6512c8b6c43dcacb4a03792d555018a38ffcd3c915b98904675e09d177cfe7590b2e469b16755fcd8896c462b8038bfe94e3668f4a8d0a1fc44ea95a2009c0e0e5846df663fe1eb0d1374800b4f0c87321c7905aa5c61be0c0a934206ed412a4e9b4d08ee7215b933fe0807d8b95e174297d4787d26d12df268d20a1500d787d2080601e8a2c1a7c7a57c889d7d7b08b71248825eb0297e524ca3f6d5935ce4749f8ed09c52718f8008bdd8a5581308e6638d4b97bcc8e10401d97257730998c366d829fe96f82b339854553f430ad419f89742fe06115f757d742bf6d3ae630905a9106d2addf5da2a9dff21e49962f4b37b3477e2308914605bdf7185733cc0ec50cf9b9c02d55c9e520c07ff8ad4941885975bdde0d48e9aa6539187464c02db071d575a9f6a95a9d25301e12cf88d4141241099ff670d1d1a5b1d152ccd1f1c0ad9ec0d72ab68cf6b53244f00fa33140059409d4a1f1ac604dcdda0ee6cde7259f8ae32255209c19b59c8d8b24349e02e092a48427192a2c3b8e2ec6b5a1a8acff40ad186f4a7026b17955db315090237b0c5fa68538b5c7c313b91cac115d0a76855eefa8ba84ab85ac03be9e1220f3942b518785f23ed330f913ab13bff1a092c85942334e69c2edcd117d49b785d935340fe60099e648edc43d3b17c54add1097f678362c7e2dc615c513a4942bf4e65e57f6105d6b0b44e8a7c34d6f15f710be6ebf3019b7a4af447fc6e77fb174e2b9a7c922b6b7b391ac14c344db53ea90a0e47459a134052c822d2d853652d1a2a26efda3bd70f5db50934ff96480df5e3317852ae1e2866bfd5920911dd369c33067c9065c6569c0c750f147809f6e05c09cc2d17ea79c19491443f476133d22b88db39235966be720f040a30c0aebb7124119069c7acafd02338711f1342e2f16f8a531bbc2af5fa58de49ecfeb1d4a2fb59e785ac7a076627a8a83406592d4e8156304be368b9d1a5d4d566d18a4a24bd8c520886a69b4149b7ac08215356b8db0eb952aedeca6255f2263cdd8694855eafbbd2a20b2e7b42b418a7828ae37b5698b9afc35cf00d28496955768a3d9d9450cdd6ef514f9bc781270c635c8f0e1d37c75b2f41c35c218b55147feb49a695d9528a2d406263919471a163ee93f1a0b43a245bc676a5d09f2d5171de63844ea1381dee42c152fd26d2d858ec2b4ab34f1d5713ad35419169170656e90a1ae2e2feee208c9a2063083174c9222ee2e33ed0210858992c417266d729ab583d5288093b29a1e530a7f3a95626cabbe8b010f694d01ac3afa60f54fb3222292c6660f3011116ee96720aba018bb695ee373c9bb60dd6671599078db77bbcd3f365c3ce2b88ef01b89be8568c17b384f0ae388799d0489974679e365d304342a3f278249f024d7715b26292905070c1a8e4d23f47d1f51f15a2671c6c466c2003b3af8daca0eb678c78d15c70f0ab61e967e6a7d8b35addfc2f2f363887cb9156ff632e790e6e2fa1d422f6135bd63cb0318bd1a63df3552e40793db508f7fa0ecada2ff7cf0825ea9980158aeada8600406a292f7db5d05719a1d3c42629840424785f37fc9c9417e82135449260ed2c3688fdf1e08958a4e764e30b0b05a5ca6a480eed3e1a2d78aed03383e2f07aa6976faa70bb4ed36a92b138890662f8844946ec6d23efba0689c00a2853641981fccf52780fba03a24fd4dcf40011e2353a88ced001ca2cc6058eb72672629474bc5d267c3aeb615cf5f1521607192fada480a670e2868364996802e0559e1ad0b07b2a05601a11fce3d27d095e99eee507734ad6dc2cea8e56769768726801fc13f3d01c40c1212efe19eaac4990350275eac36100a511ed82a60ca88e3bf731a257f0b66f10390c6b067a43635b6fbbd7308b2dda078189359c70c9bcefba6c0d6b0489c2490248ac9e053ed00289aa6ce618d7160958da7f66f9fe59766e6cf246f585e583082a51cf29a524847386ee83d3436a13c49f0b6484932cf2e4a69957f41f218333ce0dc5c905208dc0cba181eb608aa23f9fcf07893f8cc9434f7d163862e1aacc0f79855f20f122f998a2f634c1a88e0126c79e4b883135c41b4af65164292839e200d83f73ff1505e85a202fd9401cc2451e036195ff860ac012409911044b5a13673bfdb10716b10300f758ddf91d9eaed1287a9f94aae6b54465f3d35468b0d78d89257a36a969bc25155450e900e0ed8854753b16a8a743b89583fa24f52a25028dbe8fa2714396dc6610b242f1c1d362e44b39855667510555bead00be5a5baccf99073870d1367a527eebeb32d0c40da80449ca951e27d41cb80ebf4c53aeedbf0f2a008ee04d3e990018e2d7092c2a4f4110a148496bcbe8fc0f043d352de135b9675ca06c9e473d1640c7534f36325f54b2d71e2d54eeef8c58984cc9b5f3129dcb3717b87e85e0ca743c235fd540f751f4b4836040bc138441f88c9a8bd21ae2329604646c7d0efd663240839e1d143f660058031f85cb363c2d00812aa084f4e6392570a757417276167c498a2af66f9514f1295065ac794073d238b107c18ac480f83a988e1d782c6f21634a913cf3e8e1c8520aa8decaa2c853edf1b8d604fc9b69b5ea11ae217084d0b336e4b2da8b9a8c3680761dca802bc61aa790630d1cb3d80e1684fddd43720480fe6f21c011d8a0e0f7b9d8749571b77e050dab18587b43254f4fa2821350e4946d5891803639da942810f20c98165a5614d77a1c622067843bb40055d990ecba8122fe18b5ab50be26d006b4de9c0cc1f096cff2437443b6005881a0e534de1e019410311401761578cf93691d9fca5c63727a949bf5a09f3d9f8805715df84a735aeaed726e00746913dccd81f35495d44a28570d863496b2753d7d7432f99776a6cf4aa2fae3373ad8f1e267993c2b3d1eecc299cfe272e64b9250e3e05b3639ab648b510b2ef6f92a2ef428d8171364b63feb31662867bf5f80b464ce79e5cc2c914c2b5a18f496975f232de27ab265d805ae906dd5fa973569a56f39261d9a01d67fd14c0fff1fb30359af2428e869067958be1c4349896038db61cdcb84a87c5ceae01fffa6fd4f49b6383bd1dd72dbc254a907054ad4c34c4ea2ed96b48822f0f3451b5b8dc88c3b87062a2e2489aef45efb86311c2ad0c9dc362861e347f41858f84e79991069b5a2662f826d56f5e7329b70135759a6b106b2b8fd80ef962831994c701c74d4e6ce09433437022744cddca30112e6dbcc9e07cd078a716613abc9de5a7c92a30652e5c74c4f14b8e327966c638e9a630112abf1139912c12259f6ba401de71fbcc94c09bf680d06118354c1412469aff8541aad5b16d39bb60bd08a576d53ae1cfc32a34e3838869208239d99808caf56cf810c29bac613e940aaecfbeb389e78d95db8f410749bc3aacce58b842aa765fc02d820fc0c62317201ca1f9b3686a08d3c2f6e5ae5fb4a26dab4b215e0010642c8a08f02ce5795be2da317161b57657a9f0ee14b3fb5b52016e65c9799e2c85b70af4ec05b50d19b0b4ff69009437df6db762f847fe47257c6d0b435754922118de5810b2279664d67ae0898ff235e1073dca5c36b533ae29983efc0f08d67dae85c97ef76f6051aee294081849a04cfeebf89cdd049270ac70f3d88751f9c354aebd9caba94120ea25f81e2a2ca9bb910dbacceac207dc7b0a1a87802f48d664723166abb052d9db3b811d98238f0d1d4a504007ccad3e821ce1a4750bbe0c05f9bdea66bc207b9bc678bac4da816bc2a5ec9079ce995e884b4107194051f6ff570471dee9fd9e628ac8858499056fdfe752282632dbdf84a70be8ed265966909336f3c5c86c38ba4887c4f198cd9d7d04ced89506d039e5693db71569381f028b0c7aaa722c0a9e5fad662a4347006f314a90b69d0139dc03603db6ba5aea88f6b515a32bc7e86dc558a9c7f94a663da13862447004266b6ad1fec40316b5cd40b7a3f3f7b7532acf66c9d887f4419f421aee2e299c27579b5341619428e199861db1b7565a0139a198e0b179223bd765023479d4ec3b7e29ca85ae8650245e8bcc799b3e56f2960cc40c040318a0afe517a7ace32874a1b27f66219e06fcf0ee3909dddad8c050e2a0708fe007c23d5e6b64b2c4ac0e3eaf77dd25b7d9c1829eb1ba0d5a6f065d9a923d697d6ebdbbc885f1b242feb9472654920750a0467883c42416cddbbfd40d8d02a9a9530d9b547e6669b593c4e35f84d0be638732908643a86105448d39fc9602f890eb4503b0547004727b06033c13ccb2c6e6854bc1d35c5483286d34e13490089381b59eaa681b9a27b27d70df81da0b4c05414e03ef8ffcd08005ec5fffff036b5c8e68534190542ed9a5161f90ed0fe7da74c0edb685d34457bed81660b67e900af064302043f3b410d8664da67e78e1ab6fd54bae558c6520ab154c53d6631691bf7eebce1bd08dadbcbed946ee0a23a8a48f1240942bb6d931f3067f9d3507e3960b73404b6971a98b6a2e288c726ac3cd03b70e4760b46e9562a911a3cd98234a168aa703f28486635ac54e37d817a8bb63d362ff8db5d41b7cd235663c2c37667e7b10e3a473c0d5c620c3377f5481dbf59ad255a25493ef846e43088f22ea66cee369f488bd479e6fa718052155b39ea498f3daa6bea009324465860318cad62f5d5c9f1ecbd5dc8daeca28079f33c82e93ae9da915320484d7524f59f0733e1ce5fbb140bbdda5bd289f03aa3283d5912df7950890e93ad9318588dc242d3eb43d719712bbf16235f7575f3c226784dfc1e3795e55e70bc8ce3853e5e13655cab5ec77e41072b9297d4febabef0826b1ff442e9d5d52b8217a1e5eb180536c6b57dafa3fba0e338dfeb388d42fdc9d645a32b4221a13f91afdb9fc250e7b7f8f61e734fc45e030e287e46696200702e6222c639841876b35143c659f85cad1aad1e32fa178b0cf1ce6b243971f3d429ef7c604baf5437d174296a71b988507c410915e55227b9c5e108359da2764b41820211aa15140642e990caaf94afb7562a9062094508460143324498cd45f5a1e6a46b6f287f15ea1ef05fb02880920c550c54f780bad79b6e189a424d812a12d45645011bc22207281a059c2cecdb4a100a381a38e10b7b7201aa1f54538702628c3c02ae8d0252214000d1a280324b0cb38c1e052c7342331416d577fa40967443511305045d9e9de2c6a29abe0c8b17ab85e09fc5d70e2048e024a4d358e166f40c8f6b43ed817ef0ec4331f4131e2baf19ac9d057914a7e0e3eeab7c3db2b208e2509d71c147f86a9f3be50282713d55645f88af7a15be87615d4495bd2dc6a8fb427d232a8214a850ada00e270a9b14f350bd4061a7281d922af14b09144250ed3a0a083a032e3d4e244640b534a921543ea35890ea050509d568a87507a54326e8fe690425010aa125aa0f438b9506a8eb1054df0f7cd40154a20fa583f18c1c3d8132172a9ba1fa3eb58b9222c24b7e84c248a8becf3d2ada0475eea38072f268647c72a212fc25469197164b81e9e37f9b83410b516967b8132b6c44695f149f812806fa540762448b86a5473e1ce550e7f966e453b4efe4cfa52a7d84f6626b1ebc250b45213da1d7d8b04a35e5020c9bfb946b1bff1fe0dc47834ac60ca55d7adbf957100aaedefdcb5384b1ac4a1138699116a4586a672578886349426e834c431650aa69f7f045a5c2f5aeb25d3bb7201d5e17355380e5fa78005fed18818d43382afdac8c11d350533b9bab8845c66afba0b9f2cea83e66273351f5d5a20f94b34587d71fb1862fa036cb7e001b06c088b8a4029187c1896742172d1ff9cac5be32225871dfd7f9a7d86392fa09f3fb413ea229255274d6c46d6ba7b8db43d7f7530a7390f9112461eaeca3dc10077f49bb8f67b43176a4982c2e7b6eb905ef2a864f6781f4c543880ead514f03a783dbbf3e29852f99d0719dac27ab5282e66b3933d858a0c627d215dafb89895430da6f8620b9df8e71d433bc68efac086cd490cc331502c822bb1cfe12104b4271fdbdf3fc83462865c5ec3465acee9a0451429331a115f63509b5ecda5fadb866df81dfbc3155110201537fb67b356d823cef5c23465362e24fd1221039ba7531b49053173ae3427b5305bd7d7a78291cfd00b3adbecc73051fd6e38f133060ea4164295a43debc0dabfbc2bfe144775e04835f3fa5e3431e85c66dc4677201ac0d497898a8c126ab3ca41388604b4bc2c6ad24feed9825b2134a80de1df788e6bb61a9fee2dcc10f6232682ce7e0b4513cf63566900ba69604ce80420a46e04cfc784f3200145212b5b9c87f37de88c8c70fc4dc100004f64d31561b7984cfa6a144dc8daf0aabc5474542afa664f6b227606de89004c3e9c81d4d1098e1b26a6bd20689ffa36ca8464f4f410fa371b0b51538053cf6c0bfb83f6047875a37ba0d979909c4b79549098057a953f6168df99b8393c5f1b4a925830eb7ff085f58340fb5b7c2291e86c35f9012282b6e7b4ea26926e13f89eaa960c2a3338634375f55a0bd7141120b004bb767106d0174c5d5a129481437e7b381745ba094a00548ab30bfa58457319333410b318d92934977c406166522750b523d17b0b5b76f6cab8d15d6314ef8ecea61506e1cff1547e14212a045b86aa38d98d2e3a6cc932674a4541daf848f998421bf044ff8bb4e0cef0481d1c955155939525f0031bb15e9a7535bcb75d7a6f48d3da0229a5a9dafa1114c46a8d0b960024d461b50d03b52df4d4a61988e799b62328d20c0691c3b2ea93d990b60d1d357d02fef1a1919c4df20a36174ce097c124952e103517da305901d0cbe73d9e5721244e1ebef4a1f1e564781099050400404f9c730c50d68040cd277ab6250e2d8e6c1cdb7cd0f6a12c5fef0fae0ae31e9f1cbaf6ffaebd1ac9e9a5ee3d4951b277a5ab3752ec69e551f6d0265161d1ee233c931be066c7922f1b2c0d7728f36ac95dfdc62de49f7d21206d9c2b237c096c93305d6728114958856ab6dc3cac125dc1b9ba148b5860ce98542645847757e2a6b25830b864de20be2d971ce56894beb10e91296872a22e1294121c5b7438601f62c6e374e880f530da3b8d34fb7ca0ddb79bd8b23d8cc4b6ded4d5f840bc5831ced1814178e774b706ed296e0516529a6a8a6afb31679a5bb6ed0f8f58be9a293f1a9529b26675da05c14354111f0c49c5307abb8c1413596dc183a54017a9c8f2428b80d4d8277d95cfe3124b17aea25e28f0bdaff55e443d0d97e7468477d4b89edc0808da7e2f167182090900905a258e42fc32c9af6513789e6fb6f3ca792bdf691ab00838b79be43d6e537485af9934497d4138055c49c24f94caef989e2b738af4dc34b67d95a65f0a956ee4f81a1db335e92682ea6bcc7c72aa1dac88ebd3e8b1334ee77a0aece4e992fb6f4d822f6e8108eba420df73d185279a8559df1751521b8415875338443f5c6566d5e8246b19c690ca1771c1aca226fc26f372cd0fee2e2a87067ce6ef3c6796e78c61f491860bedb2f699699746c9d37302ffc9381982f17cc88d0e402d84184c417785a7326b8fd24ace351ec97b0f3491612d5a33e11df9b3b37b740658067878f696fa1fbab6c2eb5fb50f1b759cc8e888c3c2945314749fbfe1cd7d2c1bc62657003e5c7cc4dad6e00f5b3d2b9b6a6569158805409bbfc87eb385121c3e3992325b1a8bd50fddc237a40e0994d78c39fc9b517ee5ffa70ed8a785e40b453250f08d1c5fecd28eb121de2005a0c3b030b23fd5f0ab120eab7932e316e752ce4a2f328bb715caf12d82113ec7e4e60ffcf1252d48a78d74cb7e7739efe3516d7ff9c7b22bef729617727b4de7b309e39a1b0dd7954dcf9e3e6ae387c66ac4d0c88627619ec25e2218a993e45aaeec23e257fdbfa3c48c5c05e46d2b02dc890de9dc69027e5bdf8040edbdb7007f00a3036346c8db331162fee34b4d61f244497e9e611e2316cc5be715a1206dc1619f5bf2de851dc5cccb8b388e74d0f36ceca4f6dcf5061ecff616f1e743e132d8a55f1cf06c788ef50de070ec446dd48f70b278705a9b45e2f8c788a807df8dddf5e5d8b69f24c4009b69f7f5366441049a50099c6bfbe51cf8397458e7e2c0c058fef0e6ccaca709474eda08f08f458d76f1b43cf10e1879a1905b7ad3d7f70247bfd76583ede143cd279d19252b97e912b9f62c2e3ba249f337c0246e6ca358ce825698af2e00956159e4559d61f53526fd9e3e03621b182f0d62aa10dbd138a13586cc00e22e789f28e76b64219ea2c0a744acc12a0fa90eb06249e82680205e4db92b08e2d2ece25f6fa49d5be31b780867860c0c3cfaff76a8118a167053c1343a218e981760f90c69301d07a70dd3b5407a91040359003086903c43ecc9cc8005802206306b82b49da5c724605dae7a572e2db6fa63a3515c910b81015c4f295d82e84db335e190040b8dcee04d6ba3cc97cdf3e1021320cd99f8158116c03c593f69caea5ecea96c9eb5e07862c3c0b0a535b282788cfd4945a2ae7b1e4ef5db7210d5b42e3653d92b80e18f375849bff5c18855e0da1437c89e0b6623271f3b0026abca69fd44f606d9b07a38fe6b1c3553745062939c4eb7d1f314eb3012f31832801fd74b4437635d5504cf515a98a7a2e47792c19e511dda055a51227097872172d09dbc96ebb02348376922b433d56a4af9772e1b6898a2525372f9f0e69054bc45c3ad1ea97fa3d5f70a013f687280ede6a4b24979f954efd14695ac661642f30a7b841334365f3f4cc95e74d3701de1b71084f60d40e84b9b41931e0a048ce8c742d0c2f866e93ce3dd079219f251e74d4c36d9abb4df5ec7086c0b19e92efaf1da85d777cca341b0726d43825d1a57d8b8b3e611bffc8416075b2691e7f0123d7668795c4b5eae2578f562970637afcb8d2df4372e5edc646d9da6447b39a6187897ecc4f4dea88f93472040c443165286281df7b729579977da34c8a4a8ee25b9c7e7b93e17f6684bff827e48b8b3192fefa8edc6a276ab44d11f0a3c76a6021989eb788bec353c7bb0a2513370849c825d7b0c4f58855ece67e308c5a194bdbb9a5fdff961350c4ad163af8dba19f54079de9b08274513969251d2ac63f10eafad0955c5946961d95ad84a1aae0fe9a880c5472b5742c69406cd586ea500bd530017c1b40231523801d69a773518cdf0759d03a85876d22219e49426e48065736c081b086da99ee171ad2da88bad8b141215eb9958af43a91bba6d0690077ef1a49ceeef7942954a1f9f8c2fa15aa2030d463a8b940b3394f0ec413e86ee6d5dff7b688d492e05a996c8bc5e99823b81f9cd19f3531273dbdce2ae5067b3d3a15ce618001ae80f71dea281320268a3a941457c2f4c4d1b8f69b11ebf27b6b0492dafeb83a8770afb038874a9b54ed2d205ed8bee5d893896dfb9814aa713731fa3bf6270126108de6fe9c28f46a30a69b881d7d10cc0336ad1a72495c89c7cb13bb50b7fd229b60921e0dbcd5ac0b8e955fefead53ee03b12ab3a4b0db9a477296c753ee200d2417797d29a7389343fc4a7f306ee11793cb080d4c925aa7e695f17be035c45289a572daaaa42480000d732eb800346362af97d2c5d772497ef5563ee9987f9405ac80605ba82ffdb7189d1abc4ad5787eb40d55bcc2511c9daea03453b0aa150e47365cfa1b02f61ad6fd03a9faf4c089bc0360e08a0e15bc29d18e298552edba11352b4810c30f67344350c0e27aff690064ec5590d5782fcdda9b17cbc6b716eaeb0710ec04d3a52b87ccbe40e006acdf6e5a630d66f7d4016ccbd8e1f1cc602210333fc45908a37856fe6f77e6d839874988c93d4800fd5ecd8836306637e0fd4a0c3703dce2d747618cbde702c9b67b0d48d397bbee38717fb4cc08350e2317106ec3d5899442e4555026e31c49a0a3040f26439ffffffffffffffffff68ddd3d6eced97494a0107a00494c34d29a594528a54ebdee4ce7c86fd0cbb98cf5c85220a6b0a840a8ec614aec1468e363ae25098902fc64ee65822d20e3854b6151263c2a95aed49b6bbb43469e2e978433985f966f32444103aef7043f9ef3289929f3f1f74b4a19063b0f38cfb39c682d0c18642b44b35255dd735944feedf7e08b7430dc5ff91316bf6c78f49c51f74a4a1187bd63ff5c734a3b7103ad0506270a0e30c253125e4e36dcc2544af3bcc50909e5a4aec8394b352a30c3aca50bebdcc21851295f163c8509239dacdea32ffe93d86c295c91046e994aa698aa118ba3e36c61cc404fd75b5d01186429435dd1da2868c2dd3460e4a07184aa57c5683921e3b843847c7174abda5937fe63105ed05ed3578a6698977a1dc72a5aca4ec678d36d25081c9a1830bc5edb0109751d479e8d842396af893fbf2af3b3a2d9474f29dcf10fd1c3ab2504c2173d431314add8646197e461ac70a0ba5cc5c265574a8c8efafc000d17105a4ffa6a97b8bd661855244cd89216f8520e8a842b14bb375279f9a9d34154ab11ac145783c8572b610e937885fa76aa55050be5a969b614714ca1663fa7faa5aee35502809617ad4b65ebfca2794ad747ed6908b4387134a392ab3e4d0a33be49b5096fb1acd907d261453d6ac88c7897c553b9650f624b664929e3b94505af56d97905eb3ea2809e5644aa65b9173b7294542314a0ecf96eea7b573472899cb66d37d9af396c1a0c308c5cca263fcd7cf31c85884924819d4526e420aa97510a1183e889010f53dc41802816158d6e2915acee65b5496951002c228664f1bb3348e4bfe8351d0a36406cfa571ea074629364bec5af38be2686797a55cc9d5be28c69c1a654246b2cebd28c62fd91b722ed598e545495706f5e91ac36976514c7f7baefe7153a6ba2807d1ab9539cc4531472bb5481b2e4aa26f2447b7165d57ba456994cd4e2ebd4c62255b143fabc389df1bd393548bb259a78b9dacae2392685108b9cb46e424cda2985793781579d9509245494b4822123d4c73522ccae14b820cda437c33c1a29c43870e6293d445ff8a52ff781e8dbf2bca3123674f93df4ff7ad286cdc6913fa643345ac28e4fd0f317a3fc70aada2a0b6b466888899095245713347cb2ff166a5938ad2c79032530491d51d5414de32e78d161af4daa728c59d560f49dfaf98a6286ddda89b91396784a52857793e2136aa228ea428e8dcbc0f9d789ac151944cf47c5367b748de8ba22436ecbfe82d14e5d27ba7746e5bf1d483a218b3e4147fee9234e43f5134395e3a889c8469e43d51ce342d39226fbcff3b518ee18426a1399c28c8b8eb52b5d1a3f64d1474744d3699d8bc194d94c3c374da70268abeeb9ac22cef56c64429432edd2c6d3ba54b94b6473f09bd6ecdd71225cfb3ae08afe94f9528beaef5b5afecfd4a89d2d866473b731265efe4a3a54d499472eb3cfd885c9f3012c5f3d22aad7cd39e834431527eda9c31dd9d087a441f26c848724a8e3062ca53230a4148751f8949a8f31951aab198bc3b9a45072da2741974fbb4e4a02ba488b27e18d7ed9335cf494479a26cdecdb62cdf20a2205e363b825fe5c81ca290636cc7fa244c89b0218ac1c342d9bb461db710252f2d93c38733d32921cadd3362cace4114644cdee7d964f53c41143fcbb3e8d0bb480a44e9c3c691a94ab6ff80280815bd273f836ee70fa50fb1b5ff3698a7cd0f85a0b55dff3f8910ea43612d536efe1a1d3f7c287cfbf5e8df9424ab3d1433940ca925470f852892e45e270fc5b8f58e61466435090fc538325769758ebcd11dca1b42dafe14214bde0e05a16f22e4dbf81de3752895663febd74c0bd1a1e8a33b954effd1d63914c469efd8f9d6d468e450caf1384ac910fb6fc7a17cfae6b4a73a4dea854339c9b49e5a557f43c926071d1e71754329638ae93da1944dd2db507a0d416a529963f6cfd950d2f9e123f3769ada7c0dc57513f22bc33c85cad55012724f5cec0419a2e569280619b663bccbf960391a4a42ad3fc62c32bd267e869226dbdd1c43b6e9c90cc59f53e9df57695b2a43215988ae293d190a765e9dca2fdf3b3f8692104dd2845c75ecbc180a327a630c51257977c250cc63a249d2959eee6028a88ed21395971e355f2824d5133944cacca7f6424967c9ede5eb9c5077a1e01a719208ed124ecc85c207539e4972caff780be5b0f5ac9f25d5e9ab8562e5c6e81a5b3567f793a7f35d64ad5828bba8bcd91d9d33d32b14e2c40bf5971b6244ad50b8ce263be909a7ffab42d93be9b83f5bcdda51a1b81ff446e579a868660a25a574d22ab78c140a7224a6afdef4592c1385c2ed874df341c3a4080a8538c14275e43ca1304269849139b683dc09a5fe984c88903c41f72614743e51a1a13b9e76261473cea52175b3847227cd71547ce874b6128aa5f1c4e496104ed249287c5f973875915030b5924388a66a847a8492eeb93f0d427c9025048c50ae944f6db31e378c1028424963ea07e13242930e024428eb7a9de6133e1bb61e4641b4e5071d542d8c826cf7bfca6fc74a3a18c50d754ac66e9bbc0f8c82683cff0ff52f8a1b43740c4a72d4185f14c46cffb675d0089e5e94356bd67e0f7951486a5fdeafefa2f06a23364f2c99b3d18596e952c69496735112274992c4f619ed322e0a9fbe448a49f916a5540be9631277a2c9b628984d909d437f5222c9b5280669daa6f7bc3f089916858d9925b3e32951139e4539282d1bda93888b902cca97273a3d8ccc86a05814ebba9476f99c2b826051fc2a95c9a5834ce9794549b76ddad09dadade38ac26a455a8f1d74ffde8a82975b6d6dd69fbcb3a26c726dad2c6d3ce8ab2884f0ee37e14ae868545170dd1f5995d95414cf4bee6d5667897a5151104d5e1e6f94eeb97b8a72dc7e31b139040dd93545d973e26651dea699dc521453c5c914d95c521454aedcbe271174c61d45a96398bc1d39a1425c51142dae94d6b34addd486a224ef3f71b4fea7bb161425911bb4f7e87c9cd0278a2e26fa749e06553a9e284b12d2df44c37dfa74a2bc1e92c4242386248d72a27c9e5644f82053a9573751ca78ba66bf3d4aaeaa8992953c6de239a685a999284fd05e16a362a2ecff2f7aa2e78ff9258a6922a4fa38f968254b14ee75346c0e19edff4a942376b43ecf1e5f3b250a5b2164e8b127519e1c9b240949a218e46a5cfd90c3e670240a4ad5a9c8935ee68144b93609691e57d9e94714c2e5defb9b8e287775c70df935a21c747cbc5f2f1951c8db1b4fc9f6a064968b289650ed6f114b459452b34c2b72fa52aa4c44e9f37ab7a814fdda23228a333327bc54cfe81c3c44e1d6fa5f53e38d7ad0100599748998ddb93ce460218a15bacaba640eca5b244431b8490f51bfce398a83289a8a4832c78782285c7e98dcc40e371906a258ea35b5a6fa0d9f21204ae284675e174f1613fc43e1459b926ded414608faa11076c36587fc1cc2a90f65ad50e222339bebcf8792e6add166be1f25bf87b2e5c49f38b77722d243419bc71c26c4dc9c4279288451edf8fa59dd3f7828c7cc25a3b9e90e458b305a4470ffc8713b14ed7e339ae4dbcdbd0e85382266984c7bf31b3a947653ce3b26cd19f51c8a79f5232e9743316445be516294693a0e45978f1a3bd2a49c150ee5d2a963ca37c6ffdf50cc596f2547c88734cd08b58ef788881b645f2885652cff51db6e78a1206312399c9cac31ee7376a30be78edf525ae5a35d03c20d2e9444bd77d0a63ce41c3b32b6d08d2d74b9a674762ca99ab171430b8810cfab27d3fc290bc49831710f2f319fa4bffa347a030be54ca3eaf3dd154a42c4bcc8ad9a15ca5a1faa1183da6e54a118bb753f414c6e50a1a0f2db1b42e4d48be4c6148aa5496d124ac7e6e07a8e3adc904251c495cc5144c275d26a196e44a15c42a4d451b6de1a8238861b50286592fde9db4f87db9e50cea0646ceb56f373957ce186134adaffa24d856a7dfadc6842418746126966936e30a174d5a321df664fcff124c38d259443b756ad7eee8612ca39caaf7d904105861b4928c8d87bed21f462b88184e28790b09b3d7df2fc8d23946377e4911841b4c67a037682117408e28611ca9a51dfdfb3b8c9b06e14a1149ecc35948a521e4b48871b4428eee78c7952bfe6321c438daacb1181619464c490f93f88ad68100161946c924d1049080f5e3a608800fa64e76c3da5616014b329ed75ed73ea6ce38508fca2789fe5b661a6436c17015f945d5e55ce3a4424c723d08b729b70d35f1d23c08bb29c485254966997392d02bb28cfcc4a947cb2a93f480d11d045b1fe47dc446e79889f5bc3043388402e1c397ae5e2df13015cdce29fb16fa44188c02d18dbde9c5d7266feda88802d0a398b7cf52a99a284522dca23eb35b3356ec2e7694192d3289b3ab7c46751b40e5b9fdae2535976cc88802ccad9343c9dccc5a2782f233a849c8c002c8af7516c3d651c1b8d9c118157d835f7f2e961716e123cde766ab65dbf48045c5190bc9ac4874f6a45313d738f3e0fa9a74aac2855083d253b4f0e39b38a529777cc3d5913c57e55e063b15957b2a928d78b300de9b64b464521868c938966652a3d45310865a33a53e893a3290a263eb54f1231a2c84a51522e31a479d4ee0f795214237c349d5736c73b8da2ac9f3583b80889a268b5c1aa430f45d9b2344848971d7d501425286127b35bfab34f944f878a8e67503b29e489925575f8a07ba4264f270a1fa9326950cd8a3027cab133af4f5c7d9d7513e5bceb1bfbd3e690a389b2f5dfabaa690ff665a2a022c89da821e669eb60a23caa52644c86e910bd4431775d6998d012654f6df910e49528da6d456e917133274e8972081394cebc3e8962292543efac772c5f12e5fb181a84ed9128074dcd9ccdeb3be290289598d7c60fddddcc230a6aa1279a8cf86f6a4714db4255ed29b99def461474d3c4c8ce25a2938c2887fef8a5cc4514d3dfdff376883175461125d350fa1e4d836f661251aa789310474f882869fb24bbb447243f1da23442b8767ca62ed31ba2b45d91743e85289968d9d97dfdfc31210a329f2d7f826e8fc14114a389bd1d6d4d22491005a94977decc7520381342b6feab064441698876de6e1272fa434156f9c651b26264dc0fe58ca3944c267242b8fb504815274ea6e94d36f95052eac38608713de7710f65b7132d6ea5db3d643d143bcd043f551eca214e6e9d84f0df12c643c94de67ca414d99b3b944b86cea1ca3fe9903eaf244f1d4a673a4810f725eed34b8782e62c7a738cedcebd7328cf5a8527edae1cca9b71528b87f8ae228d43c1c243c78f7982ed46e1507c312124a6fa0d25312187d3cd1a7c5f3714e3c4d48fc9e531576d43418bea093f496a4655d9501a95b549c5c850b25f4341a793a0536e926ebb1a8a397ca4eef43f22cd692848c81fb63d086b75d150ec506a74b75567a467287a38954126e76042966628e629d9a3fe3fe9916519ca1372d7aceecd88243214735093444cb2fd161a43b94c4eaed690139e8ba1b82544fa2419d4ba06c350f6537fbe9fb7dd2f0443415675ebd7499e24ff426944c6dff18d170abbd93fafe613b9315d28cc7aa83df972a12454fcc907cf73b36ea1284a44d0f1a5168a7ffd917aafe46c2c0be5ec1054798e1c168a490813b2637a85a25f6a966e8dd1266985824892948acc5bbd477c5f0db22532a34239d4e790fd42080f4253288bd56e881b7672f848a11082d891d3c9e7f5289427c9187f93eedf8843a1ec5a6e3286ebfcb97e423974909326896821612714c434b54663dc9b503c3fa579993af9499950d2d13759949aec49b984c2a40f1e27e69c44664a287f765a3f534a4212a92494bc4fd72ff6fadc8484424c93cbbba3e7c9e808e5382ad3e8f18d103f46287aed88ee3939d375118a49f2d585dedd106d048850124af95cc889494bc3285ce668a7ffe9f4a6c228bbcbebe64fd1486530cae99fcb237e10fb1018658b5425e3bd360715e9f845418698aa79643c0fabc6c85146ebf9c20e21b58d7dcb9bb817458e249a311f325b991927f2babd3955fae474f0a2114d32bbddec8e5d14dd3c87a90d21cefcf9840e5d14334e3695f7ab2317e88d6936efa40329e8e01774e082bcd17424657e8ac8d842ebb845a22d1e1bdfa15e2172e3c8ae830e5b14e67388e1ec74c6c9cb3930848e5a94cf3594dcadf0493a8816869cc69877db6c7b9d6d9abb933b4137f3338be26a9498e366f3111f248bf27e129dddf4b3d0118b6276d77042453279a35503160531f133c6b98e7d59c72b8ab9bba972ea4496bd3a5c510ef164fd933bb3fca615e5fd2f91e3c8fb17ad5941b6ac9814c1be3d2ebe462d84aeafd95c1b5f4571d3241753dac11a6ba8a29cc4248fb964bd88a05ea1231585f3db58cb9be0fd2f2a4abb1927f1cc3a7beda7287e30e5a9426a8af2c556a528cdd56d12bfe65f1a2245c14fc9a844eb46519d96a68779d6243bed124296a43e89a23c22c8f591bf2314e52d2fd5c1c30e8a5227fd90476f9f285dfec73ddd1dfc64f34461a247f4bdbf34f964274a66e263f8f4f426f366a8d1c189bbea4ee36653d29a7b6a7f8610b7e5e94d79878e4d10c49d1075bab4646cf5e071a006b1269a38eaad88a0df4a9d08658297affad4b0b62c9370f61184dc858992f978f0ddd4fe67327589ff2567ffcc1a1d96c82e52a4893139b2758d6889481d42262d69117454a25c5e9bc9357d1938420725ca3926a13a9cb9a4f01831c44042c7244a1b49a6123ac393d49c240a22265a32f3d9a37644a29884c9983d4634899b3a205152c226be99dbdadf48c6561a6c8c81c69b3146d9073a1e51fee4353ae6cf92e3d50e471425a9f7c7c8fb2849ec6844b93e6af977690a397934664479ed5a2b248c32a0822b3678f0b7818e45eca12639d56bbb458612932b37e215ca418722ca95125deeded39108a2aa8433130d8dd51aafd638923409a5317623a26ced499b52d3f09b443b7834c658238d31b8ae4ad07188d265c4fbcd9c4e79a686505398db281502dba83f62ce4a673b11a21c1274c7ede4e918c432496bb44ac6abf3c4c40d79f3a8a8a4431025912468d2bf0dd0306b8c61d4c831468eb701fa319279721d2bf0001bc60665e8c0a0c1aee80844f135b8e95ed1b14d66d450a30d4014c39af49ceb438a30331a6da4e163acf13b48c38c8e0d74fca19823a99724b2c90fa5d8ebce16dacc44471f0a314569f9505c4fef3946e8d41ff18e3d94f3c92ca6d3df9c909fefd04349ceb55ae59bd7d5df918742720fddb959b6466936e8c0431a1e51ebe64e443fa752dd0f2266e81d0af9c3c793e33966e246a5c30ea5f5a063af696bcda61d75387c27bd928d339275d0a13041860966d2c3935076cca174aa3225c8601dd388a1d02187e27f4c4a8d0c061e6220febff7cc664979e229788481c190c3e30b2af0f0824717dc13b149d926f32f079e223cb850543b530de77983fa881e5bf0d082d2c0230b6c786041cb2a53396bad8c8bd5b83cf14c22798cda35f0b84259d3cfe79f88b34ed50a851c6d84491f8baddb3caa50ce1141d3f40451a12c693ec49b182d35bd29146692f58ac849fe7d8e62c1430ac5cf692d841a8d47148a7e25acee268756f0804241ed7734488c1133a9c713ca5ebe2554c37959f07042e9b74bc96c59b2b51e6c42b145c6ce301d31aa3a0f26944644fee89e4bdcc62ca118ef45dc9a899450d2d89a3b7f699250bc8d94debbe9de348d84927c92e95f8277778a3d8e50126b53726635424908a5494dc6e85b393d8a50384d9dd3ae6a3ce04184831edf8eab700c03f131e7d2b954cebd2dc0210c15e008463a740826435685c6c06803c72fd217ba5c248bb7129bdbb61725a5730c727c933878514ce741fac577765108396a7fd9aaba284d180d7eba9994569b8bb2a9f967cc49cfa3dec7818b8238fd99c6fbba4549e3a9efce16e54d4a879e9cb1643aa15a943e6dd86c9ab373020e5a14ef730cd3fcd4e02bba9b45c9b4a42bf1349e2ccaed1263be451c993f6f093890b9b3c553a7f22e71c0a2904cd6e9567f0cafb79180e315252154c9a025f77d89da15e5d3ee210711a2e7a0dc56144fad936b44119fe75b1170b0a21c23627a6c844d323f52c0b18a82694b92eda3220825c221e05045b1c4a9667d1b254ac871a4a2b8f1d9438ac42c0e5494a486d1d9c3341ca728c693a7c74efa8b876ca628b56651a396bd1962689421022b4539b53ddd64e89b1cd4468a826ed00e22ef8e378a92b65c9a85a67ecc9e2c0e5114e26ae8776cc9041ca128c859bbd33d39384051b40edae7afd24f947f833ecdeea9b141e5896210694d4fccba13a5d0b2595e7af2468c878313690a1193129713fa0a706ca2f29c21284f9ab4d5d1811474f01d7068a294d157fc7b7f3c4f08195b6288713ae036aaac802313870313382e819628c6a89fd7c354899246cd3f2f75ea92744a94435e5dd1d8f1b6f33d8962be8ed0f85e133a842581d01dcd09b2d94894bc24d9bc6b87e8101285ac59d2e2a467da943ea224334bb0d17e19ea7d1c8e28fcc6f7583f214fbbd888e5347e7466949c630472563536735693229bd7a70f2f6993887c882da294b1c4272594aed586c0a18862a80832abb9c95ffb89288d7d7e493561e384d21d010722caf6aa9a515682eecf87288be88fe1e757e33bc5618872ce7963981215a224d994dcf48ea15d1d218a97e53596a74395781005cd7709bac2df35523804519220b37b8920e2084439d28e5abfdd0051d011e52641ad697811ff509ce0a9374813151470f8a194311e6d4b275e7787a30fa533b7aff0529327e0e043b14444194d991c03c71e0ae163f492fd61c3a187723e1965c39418471e0a326889e11f9259c0914c12825bbea98fe30e05d9d9f43a3fa162531c7628c9cd103dc78f4989ff5c01471dcafd13354428b5b7933a35e0a043319386d012d4ef8d1e6b0a38e65012d3f21d746ed80c3729f0010e3994cfe4d3c55b8cc9fc6aa600471cf00638e0508827573c2cdd5b5d52061c6f28e87c95d09c565428251c6e289a0e12545644f89e0f8e3614929e989a44bdad4c0e071b4a918459773ef1d1e521634b71acc130df7415f96da6cc81430d79f0fafc8dafbd91b1956ce0488349c664b8968c2d1c68289c47ac7111961965b800c719d80cb623b3bf946f86f2a4d18c24c3a8f435d90047194afa9ee4345637c9242243e1a4085f1162196e1a4349d43fa5d98510713e62c04d2cdd2ecc3e7c378edd66d3e008434989bc2459ebd3ec1c188a41262144c5bc38be5062180e7078a178bd5173dee45a7aa60b251336271efbc424b972a17c2263b6971eb750901d4cd86a66add8d43a0e2d14f4c93cf518268ce93f0bc551aeafa9f3cb24a562a120b433662a5da5d64f1c572878ce990ee623e3ac638582d4b2d5ef72cf90af423999aaba7e4c3a6962a8f0a89a9698f2e0984221a91919f245676f7738a4500e5225c63e21bbb7c41185237aaa45ba332d8bd7a4627f0f7040a11c44828c7393b473869f50489741f96c4c2325c49c5074096a3478b6fdf7ab09052b15fd9e31e34126389850909e43bd4f3e2da11c224ddc3053e250423987741d722879752d8e24149212aaefe7314868547dd0133eee2314931e37f364fa3a723642216586fe20b73ad4af388a50ec1cc66af3b35a5f868308e53989fe7baaac4c88dc184631839e519abfbf7356710a37845188a974cf9a860a1531c128db96acb27d9d2fa54368bc0a6e00a3d4721e9ffd4bfd07911bbf28f5c6081ef4b68650fa0bdcf0453979d0dcd3d350a65e9425bce8ccb7ace8cf8b52e74eefc174d22e0ac23ee6a0ee41a68b424ced398da033b37e2e0a3a2d463b4352c91d17a5ca74daea47a7b4cdb945496ab69a9c7d4e9be7b6287a6eeeac63a5dad4a616c5acdc3c1bbb6951483275eaa0c9d486cd6fcca234775ae2368409a665591426c947f975bd7b7363519074a54c6bae4fd781453169ed1cb74ea8b5385f51d8205ce28d2e35d2465714731435a544e738fa6945d16cf3a585cce872b3e2186fd4487af356515c116ba3c2a48a422eb3d4efd2b671572a3a21e142dad7858a624f5ceb3aa1ffc3e814e58f70c2c4ecc414a5fb70ea8389d7cc7679e146290aea7f669d9b365f45a428cce6883326836cb66714a5b6897972892039ff2e8a82708db921323a44be43b1c70e59a9a50745d9e34679a7dafab13f51ce253bfc52d2881fd313a5f1c8f93e9c30099eeb4479be5227648927b244cc38515ef5c9a3426f44df7d13c5709d12c36d242d9d9d0ea2704313e5798faab339b991899248dbc9e9e42fc20d4c94a3969e95c4dca971e31265d1f5b36dd9b2fdd912450f26e759dadfa844692b4492d31f53c60629513ea1b1ba7bfdc13d796312c55d7bd13f26ffbfaf23dc904471efb3e8bdd2d5ee2a156e44a2a07f6caf242471ea2748e023fa99abdaf06e38a2a46183868ae65c234aa1846be81699bbc18894f69db990a6faf28d45701e6a275f21dfd35ed54e965ef986224a8c44941876831b8828c785879c0f9ba64575e310254daf29ac6f4b686acd10c51c52bcfb568da58cb810a6068ff712a2a875e7b5217a1d4449948ceb3f273c7dce53100521527b437573732e0c44c93d7ad5e6c60f1f4b7703109aaacf7fe30f2506e2e0861fcae971a55746dd87a2c9f44d6f69be39c8eb0337f8b046b8b18792045572629639e149ee6998618331d028830c36cad8811e523237c9d40d9e79f464e468438dcd43e93aede659d1731833c6683c943fe57c4fb6576d63947195a34370e30e6cd98911f1398937ecc0577858b5a6565b8d7d6585ce4fb72e6974d0e8410e5275286ea9f8b4a9a195234287e298ea3f493f1efb437328e418fe9b1ccab6b964460f1e6763c72c0e2529bad6456efb88689bc1a13437aa73c7999c413d666f28fa68896da5b953c868e68682a9cdeebcbb897964ccda50fceecde82933ba556dc686929c9cd91aca31e4ac6e4f93a9a1fc1f4f288f27374b43419e6f9c244fb3c4d46ea0a19827cee9e7cce919ca13e45544c722cc46cfcc50acda8cfde2316f67c96e94a1983e8d4ca339758ad0da0d3294c389e6fb9c105472888da17c6283e74ebf9fdd1043715427ea8c58175d8b8c1b6128e498f24f9d68a481c61839cac82276821b60288bd4036cf0e02b80860dcac8818009e4a8c09be1868d36ce58c0040490e3d768830df3698c055000001f5715a8aac019b107f4d1dafe5e8f07103170c528071c3672b4b1460102d003af800200c0468e3652408000bc0d4c1b3640c398810001e458e34f1b288d35d44800097294a186514000da0080000000a1f16ce4f81d5400030be0000072e47031082000c3864162142000860d83d258438c030060000d48401a6a8c818363d8c831c6180b0040001870802b830d1d9481da18638c044820093d5003090790c011d438e39cf16718400246b832d858838c1c668c3146022450841b630c044880086c7c8e33fe0c037c0ca31872b01ddda5f487241546f9f7439f48224c9c8f05a3b4693532564c7650b233fe8c3de3cf0046e1377b5052eb811ae78c3f43cff833f2e31757061b669091c38c3146023e7c7165b081d238a38d31c648c0472f8a9ab34f4ca23f23ce2363d9aa0dab337e8d317450061a0395715e8d1c5d6ca051c6e540a30c36cc28a30d1f638d37a38ce2453128eddb318a67a8d211dcc00946d0d181147458e26317c69f9841578cd4b02ecaa6b494a5e610c6e40ec1472e78172f2fafb5d74eabb3f2972443e726b963e2a2b4616467da399911823e6e51f6c9b32525870c348c192778944609d816c5121db36869994ff7d7a28b7955af3bc961631ed3a29833dd49f37c612af62cca1b24077dda22d88e289541468ecea1461a63900f5994efd2d74568927e2d2afd884516176b5722afeffbdde3213a58143c795755ee5a9a675f51ccf3b5516eb6d695b9a2983efe49f6edc6994ac6d618080d6386b123c2472b8af174c65bf3b9eac7c0624539c8cc6cf52082dcbe3e565188b9640c16e39b3d44398c1975830f551494f2bdd538ff4845f1c5c773f21da981e775d01fa82889ac1fe7455bdbf4e84cf0718a62a8d8dc5d6fe618363bdf820f5394bd4f899c2072646c8e5294ab675486904da4cb467a33f083146551539b4d6f928f519473d27d5635f9d5639ea2e02cb28964bae15be32314a5c89921537f5216280a3eeaaaba1e33940e6123c7186994400c31de0cf732aa3e3ed19a85bac8d85b6b6b99d79c0e4ff93879d5c1631967a481460fcc48e304ff1d60f344f1c7d55e5e44e6ac3f3a5194d87d523d74be36ffe044b1d327c4f02673305d7d6ca2ac65123b7ba51f9a28879fe7db7c42992854d54526044992236b576deed01bba57f48189c2be2899e7645077f18a21860f3e2e5138a5c397c7ddce0d131c9c34cc604be041c8646a9eddaec1861a9530d5f5694eda84849950a2a4f2f79374cb842c419328c868fa8c04d33907591225ed48717ae39829cf22619c207c247c08a15f32b63e20d1b876a7e496d85d9d564bfc9d901b46c35a8d33cec7234adb279310f921e786b0e1c31105d3ba31c77f9124845023ec0c21d3a9c91c4694d4dd640ff1219cf6f563118d4d3297d312fb3e14510c3246489b9912ff438940442292da6ac32b6d4b8ff5ffbd8bae107f1ca2fc2753c7641d43143b4bb4d53d717a1e2b4431b47ba368fd48699e0f4294a4cc060df7a9053e0651ce6c9a66af564b659020ca9bf39921e7d31a9f1f8128c765ca09f771669b06c4c71f0a623d94fae8f9d3c522632b071b3c7834728d6703046f83359e04676b3c1b65c8e0c30fc5d0216f852991333efac007bd7773b469c8d8aa3d2867f51bd207b95a42157ce8e1230f25ff1a7b91928312268207336ec4ec26898d8a786a2aa563d4901c84c8c71dca51c29a86116f3139fc6187a2ea6d6bf68cab92e0471d6ad55a512f4f5b395da6218ed894a10f3a3422a93a3dae2d6564c2f8e65e73db0dad081f7328c43c217bf698ff904321a9c412951e44d01cff8843e94aed830a19ef83287dc0c150d58de52963c918f38693a6aed0968b587babe1c30de51c944c6a1f4b7af4b90de5a4574d49562da53e3694ac4359a7d0d512a4670da5afd2412999c34612b61ad06b21b369289abed788fad9bfe93ed0f07186f2462aa14aa699ade43ecc808c89f1abbd759a3258dfaad9766676d25d92b2f598de7f90a1142a3dbbc45f7b0e570a1f632827f1e1e488a473ae4a0cc513a9c49d28dd47180aca22fc474a157d1ffd0043c1456ee88728faf84279bb7cee23e731a57d32b6d028e38c03c187178a953ff236728c813e051f5d30c9e8985482cd5d646c3d0e0c1b639861cc8c0f2e9422beaca989570b3eb650ce5affea611992ced142e136a34d921d42a39e4af09185f26a45dc1c6212195b58592cf8c042292fb2e94e7ae6ba5d64461a1fa0c3c715f8081f56b84fced429a1f05105b7bf8403b30231c4c8f1418582eed0acebda1054842ff89842414b628841eb35ed8d52e023adcc668dc997c647140aeabc376c27af091f502875fc8961840ee7aaa3271483483a6fe891f97042612bcdc36a849a50180dd3900da1fb44fec184b2e479bfcda59eb191fb5842c9d55c9350993f9450d226ae1fb1c44b927e120ab6ba39e536089d4f0809e548b761c4feb68a6c3f8e5050dbb6993ded9ad8e4c3088c66cbb04f6d7e14a1a0f523368896edd92602fdc407114aff2fbaa744b4c4581a46795bb5652cdfc4e4d9431805d93a1f53deb36cc8c128c7b4a69b7a3ee4371518854fc276ed639c93d4fda26cb9eb7daf79f8a26c13fc2509ff7b51cc1c4cf7e0456945627617e5d249e910c44d8738395d946283f639dd3517c5338d410f5c143e95a69a48ced324bf45713b8a8889253d9e981eb62806a5a324e1aa7ba34c1eb5280819227f0ca225c8b0072d4ae119723627e9dee979cca2301357cfafaf43c4d44316c530d95427fdb24194dc231665dd51b133e29d1a7758948466b72ad1f21585682392ee0d56bec1f3704539cbe6f491971b7c3766ad284c8c5632ab88a0d46f66ac280617d39dab378e8e6c15c54f9bfec48aad8ab24419db9b7f5351cebca123b5326f574545418968d9c136b7e6bd4e511e5396412c440f53381a43d2b759bdd941a5c84ecdee3c4554c37990497b6e73abc9d8da8107294a9aed45b6388aa2276bd75ad1431465917d61265a92b135865dc70a46d061c782ab367884a2a0e7ebed3555e9a022288ab92bcd3387d63e51d8d1f5214a10f144d963923b19f3dd89f2d6aaf5e69fc6e42f27ca793c7604d3e8260a5123ab281511ed9cd24499b6e1a4954a3c3251f4bcd2161af355b685e78189828e49261193d07eb23c9728c94f3192d227478e901cbd050f4b1443bafbac91ffdd6fa6c1a312c53631d9124ce4e62494286a943ba521b3314acc4da29046ee6bc367f7a49d8724d2d0736d76d946a2783d9aca4a072142a29c2e36a64e4abaa90f1e3ee25d13919eaa537c506a20031e8e2809eb09fa4c7754174f1a8f469494e40f153ac830a2a0737f28eb95902ee6333c16b12ef05004aec0231188f038c4b22e31b33c535286289cb80f15273fa8896b218a7b327cd2e499e447888cad5f6351e04188d2a4fdd5fcbca32e52973c0651ea2fd1e7deba3a121744f93c42f8d872200aea46cae8ba1c1d3d0344b964ccf91f4aba1a6d3e78f8a1d8373a8fad6cb995f43cfa50ce392893d9ea1ec284cdf850c84168b68a51923699720fe5ec22742e6d3e79d3f5d043a55deb33db4ffae41182471e8ad6ddfb396709e5ad93b115030f3cf0dd216dc9a665261662d9a1782f7a5bc3485b931c8f3a9493d050b2e4860ea5ed1c244e4c2268f46c0ea748ca1ce1d400c8c1430ec591ff6cdb2e71061e7128897bb816d712f14c8be8018762ba13e1b3651ebf51f4784331f665a4bee98a921c0f3794e4892472e977108fe0d186724cb2ce50b5fe1a71f4604359f44cba58a4d750feccd94fdb720f35144ef6ec94568f471aca9b4b359b2ccd9c51f64043b16eec3aa8c65133efa1c719ca1e73278f6fcfa896d1c30ca590dbfd575122083cca50bed8b89517094a5c460ed68007194a7274c964e9e135d4308f311494b687a89e27e524a9218b50a824ae0622692c128845e28030180ec469a78701f31308000038228c8682c168a06992f201140003492218362a2822241c10141c1e1a22120b83c17028100a85c1803020140c0402e1b04defac0f40a9a01f865815f2df8f9132ec9a4e7c45842a9d367cafaeb3c90bdb573869bec39f0e0271ac5e95a4becd9a1767d3c1fcffd1fcfb368002da7d0154f37368894c17e1e0d38571a8785c2883e7fa066ccd2f13f20f5f18fc82babf04bb9ffe573d58f69e3526f7b118ac8f26f3c751aa5d099966a32c3258d7ad2fc8da566035aa7f981f28f46542d8ef62c910b509356ec5ac4a81dcd64d5f19b43fa2a8929c944e31e7ee4b771ba6dc12c673c7883022a94ca02fa034dce32e76d84dedc34ffc92b4fa439c81a62f830cce980a02ea56697b7bdc335288fbdc823b395c3042d5c31ff105115dbb096a4594c46dd298ad2177184c4839d0f5afa5f83681f7f581e83cd917da019c01adf5208384321c164aa32a6f4ab7e801fe667eacb6f6a6b4a02b565079055ce46a99d074e168bca04456c384d19aef20a5ccf570eb03e756132c37b7a725d6660c51299495448a3bfa112743def697da199f44dfa11911e230d52b5fc7367d58a4a96140f711cf2d9bf61f05153528ed3d253b50da219e91881ad6aec3e2bb936529227d1c6d580ddb0c0f1c284889f1d8364a77f6143993d5f5e0659d533a90c8e9cb5d8d9a0543d8669a145966ff4a2c584fa1e1d648e8da520d8e7dd76d9c8d1a89000e0db7f5c8418441bf941ace3ebacb88e8e825e3b0c4740b19b3a137ccc9e08dd4e7222fad61fd3fec18524c44d00500883fd1ba044a982be7ee4734e3693761e6ae8b515cba146fd87225bdead0c2bb54f9ec256478ae2973eeab34a660df0feb2ec0614d57911c1ad4cd125b127f40f27d7f5b6ca5ac540d886b227050e64bc50a006dce22d8dee6f64c50333f33da7068499c12fbe0ac5d76d339689f50dde3c674ebcab985e90304b2d194a0c682f9140cfbca6a0bfa5432f96cc7fb66cd7bfaa84b1ba13d086f20e7bc8416bd01c342b3a4b184cfb93ff85a79b8135640d3c1a5907e259836b63434d21d36115c33e6e10df209dd1fe30520f664b65d0c0918e01370e19da3a72add89653b28663860ca2ce7cbe72af59e460ba1d1a244120f5e977290cd8522a98a2a401b170a12bfeb0de0bbea128a53cc03da8c191569ccfd82562b8c2a6a52fff20c7b0aa604a4f9f195f17a5d3fad581e0cafcfef43bdebb0ae6792325cf9c46c6820cad8ec9a4bda07a94c5e9c6637a2edd891543cede49d9de3a75c6306d8e57176d4d4c346d964524865f33069c22375e1735709030f4a80362cd5b2849b29cea9d3a9730b9167795cf17da83271358618cdfca307829d3a321ce42119b3aa2be752fefdae278f180778ca66349751aef60382fb714737fe2fba9884c945876f675e516d7a157cee9093e8213c057495e16fd49582a373de85f01af3c7ae779f96d94a9e8c4886ac2ed8efeac17f43a5497449b4d790b806a18241e9143ec1fa5f232bd0dc4da423eb821a9849a66691a5a0115a2b90019b57d11bf49036ff9935cdf9e7ecadd9613296ace0f43b077f3240cc010aace39ceb4a2c97e8c84111563b6e79e32ae98415e76a5d37178e673cb0b75633ac33b0061379803004b104eb55c8c5a7ef2de8324a9070dcfe73b5b21544a6c51e11e2c46f115b92e31063ddc2ac9ac79f21ae64aac664929e0e6449423d6da371fdd29960a221b63185fadb7c662965eef9ed0c560844006dffc9866b29a4c4b65240974e0e8181aa1e1e1090ef576e2a7d92c62e6958ab308d9b158245f1b27d03f17b68fbba16bf3f5c6df79387ce4c8dfc7157e6e0ae93450e15b813f78b09bbf947fde627120f1b200363536dd96d402e32323c8dfd1c09bd9ecff99b4699f7996e40063d47956fcce4c95a0494ee22b1f6a5894165eae66052d7bed3caabf2c879bddec2298b4f4dfdf8efd8949a7047450cbf651cfe5e6e051c5dbd1d00c3b1699a48e0bd9cd80f1d000a172a8737412bcb2a4acadf2700b2f3df64479b3dbd333e4916600649fcb91c477720968733047c39f1a273aedc71599014bad6296bb50754bc895a1a459d942924664a99291f7c24ddf83fd2ee93adb54412bc06aa2216d011e6776ef52ce5d49540cfc736410600893ecba510979a74c32a5c01f62a1e0ca5785eb78947f5561f87d964892a64966b9f8d2151bfb1be19a11826fef43d196d8781207631bf9ef7ba6d5ac011f16346e47ef770ee1eee002c477c9f79caa4aad7ee225e0756c7f3d0eb05ca56bf86232ee6cb261eaaeb853b1501ef4199f5ca12a3e5be5d0b3937e740a6e440b3d8eeae9877c41a5fadb672556b5a8ffb85ca9c4dad2667a23274ed0754f59b3fe93fd200e71cf9062e191e9d6544944ecd5762f932376ab350edae1d767e7bc4ac43bc10f20bf751f85ebcd03a471dde9b47a7acf611411a9cbe29a9e739af560656e0cc81c0d9b575509253044eeb39a0b78e7ed75d91b813f12721961cd5fa910c57a8645d40f505eb8ee328caafc0822f3b17812d290de611549beab9408481f2176221a4a7485653107fbe5964f97b37c49799946c393370558ff1511678fa3d545ee604b4102a2ff9d2fa7d67a241bba2f50168e19d5ae33435b4c2489c71fa66f9fb4fe7f131eec05591fdedce8c4f0a84717ac6506babed27c915ccb5cfa331e7f5605deadf2372aa60f0fd5e9e7be2d93c035f83f4d636e15820397009f36cf7faa42dd62afa48c0d57e8fbde5ac20429fc1717dec1a3242ed76d495c22f643526f6c387e325dc59e8b8acc478a068b8a315a756d98bd371135921ddd870c29d44c53289a5952cf4943f97191c047c0d891690da29501ec4aded5879c32841191388a4544185cd6c87453de28152709a0cbd659ae17e2802519ca35efeb0b08addbc3a1dcd8c97f96de1b4b1a1433477704630a3b264fb177af952f43ebad4ece29339cdde9f316fd21d736f3f2e13c017cd23948bac849d87100f62617364b75486c0f259450ead543dc3f4bfc2f2480c1e1950e73b889597c21d52a4ddf0e2923841785762cec61d20423ba476812e2c3d0eac00c51250d0c1e81b11d010c4c8a07d7532459900f602b0a24b0e74ad91c5beeb94c3ac3f98b79b818d8689f9dc735963fa1b2efa5e1b2bd327420c55b589c1f6c440d9b5bf8850214211b3966286c6b67721a77e02b220b43c6c0b65b926a2b41ddf53bca345559f926a751bf03895cbafcc1e23cc7d3b59634ee35ef5e0e30e09c1002f92444eb7dbd202ae6425cd3e67fc51118e54a2f7072008a162983a1dd804085ab6870b626d121a81553003708e6db86146a1cf7d4d3b7719e733a1d71d2ae82f15b32fede9a96f6f85d887e7362afaedd4fb2cd74283bbf4cb9b80624717d146f69de93cbd02dcaa56448b516f04455e079e04ba24d0358a0d1747e25d0cf8c5f57e2efa98e2f1be52af0e7dbc48b813f082b1140fa131faf0d0c34cc89026f504cdd619c4946cbbabc400983d73aff9f35ca296423df2d34f415bc7e6365abb8519f1f6c6c9f7b018eb2612abd827c96d1c14e27ef0e0422b6bf3823b66f68c10139a7692366522a999f9ecee27cec29be7a0358fbf6671dd9498cbf6c50f7a00b696447c51293f8012d24cfcb5b49937ff9a61f169c837b68848404b47575957bdf3c12373ce7035eaf15817490b2b23fbe8bfd6f865a9d70adf9372a3bcb3205a311f1868a974144059d936d374cb14d2b2024bc1fbe88cf48cf023d0def31c6abf80614d601b635c379d9f8739700e1e8b2796ce2e023f790cfca2ff0c742cae0f24a47d31782cb229fb98fd0a3e4106ec9d0f711c8f8aea7226c259792e8201da1aede1e909b63ee7fda0a4a71f0b36556d3a35431893bb48f3e3dee81db5256133d6d205eac2a799d94c6a4763fb7434512d899cfb479c2e318b947ee81fade83481fc504c0058c9d2593d1362f28ffe0d27705272236316735bc3f930b4d9a99b5e23ddd52c61f6917ed347ecb59b1910b39f4cbc22797c12a3fb572314dca1670d8d701d653ca4278d8a27e59bc2aff298882aeced3c9508f402f7a9ee9b77b3c0eb9ba2a321679234453429a567f6a1b7a0de0dd0487712a53f1b499a756a6849a5c1d7fd8c2c2e8e1888e0ddfaf2a2b6cf8d2fb856db04eb4e4acc40e4d87aeebf8e08ddbf2445c69d79b04ae2d4c0eb25ec1ddb8c9fe90616aaace858acaf8686adadbc81e0f3ac2314e4bbf5fdbb97d0da4d8b4eda5f951dd553bad64a19f754004c49f8a074b0f90d9d9a3451d11c4cfbfa5b0084edda65aaeae2cb5010904ab0f46182642a6c421b558f6ddc63c6e902cee0caf72bf2a503e286311e1cdc8e21ee2e685ad8fab9185857dad90e3ed9465db49b3bc5689a0dbe0bf801be58e0f3e8f7299e1572499f1a06ee2f3384851e9e6ec999dbab705882a1883e18fe05c56b992a6d8a220fa7144b4cd620a77cc03f201a28fac0cb4c8fd5790e9921d32bc4c3e1cf662965d81bd0d47e5852c9d27452a208057979a28dd358b9f8c6c2c64aa5f196608782286086fc638e5c1a255085bff3b971b93ce87f3a3e9ec85c2f6efe1e1659b20f8c32bd8e53a94cb1e97ea6a6484e7117411b5465cceaba0033d1bde642216db596e89889be57c2b1cefa6aa74f23ba04c2dc2c1683806bb6b8c140a52151cfdb98c965b2808cbacba3d9f9248b684ea4740bd9ec24792527998d31c61f84072dd846f3be0e895baa3f89506d6edb19038b726059c136de7bbaa11808e8589962131aee81674b47a6e309d396c0aa7a4256896c76e14947e5cdbd81473fa5a907d2a49252fdb210193285b4e9a17b7c4565aec10a2c3b0a143763eb8a6cdec235448fd9ddcaa716ac794dac9ac540512768553d9514fd3b3c24a53579014166b7bf265bb7e13f79453b71f4339ecd48e8685b9146ca24a21380e7655102dcb8147f60b483ce8914354964df71213fb4495269a432ec2f73242de2f7f245335814d23e8012b568700d46728d000161a8d6c80a3670d18ae3d7c2a98124e4628b1a36346a228fa7c9dd43404a2ed15c4038902649229b2e5f1772ce96a3cf141c153cd184043d7e7fcd4d17133e67af4c631841699e1d0dff123252d67f6586b386b307cf842a0e125a00f9063a9abe0e9d201440974fc4cfcf12829e444f2027b1c5735de713cb8af5696b40949b5e265319496f61039abc62411d0b5112d0946bc4e324ffe423739a969f3a83808da538f4ffd05d8c37d747b104d80dcd508bff88575db324bb96752da9c13961710abaef7ae5e29e76cab698b358d61e2fd995886984d40208a2ad3d69553eae2e9aab1989a32751b9d4ec645d89407d801b41aa1148054684e89264775564b996071964870a52c4ab2d8d64158ebd3fc948b0770d2b3e3c1d24051e39d9a8ce88df9dad46b5228a3eb1a5d4d16b2bcda1e9daab28797e12280306f8c8544f961651dd8e80260324df1fa68a6862af3fed9014538d3e28e5e1f039285899f396143076a46112e6cb0b89028638efb8e3a3c9062570c355f56e35dc6f2d4e98468b067964fc9a11e182b1796da16a41287a70ee27c1ba54002e4c0a792861b1ddbdaf61ce40d8c340512ff4a642c29e157c03077d8ddc8da54c46a28ce44a923732c44b32377ab3b1123de07c0638840871c7cdac663521f43d420484c8d14f7c972985271bc59712f17c2fbd401e242ee0c7095021328365c707e8ecffc630843d8160d71b934e6503acdd4cd08ced11b5dcf2d08137d1c0113d36b3636aceb8ffcde8d1f44d519691385f33b282750771da65788ce759d31ca158d85920f1e33af5232b90ede49caef50bca28430ee310a46ea81a6d58cba45c62a10cc8cca181ded9093db489f5e0f8d626c74a10b499b79092f58a2be97d76de018e1d961d64ebd2348dd396762c3f99c7a9cfa76420f71b79ee8a1e4dfbe7558bb86180593c525df26213b739a919d99d19266eb2fc6a4fe4a88a1d8dabe19b82fd6c2043d493db5d911fdb6ee06305a1c8141bc601a04258ae498477d130550b3510dbfcdb1408a52a9bc9876a25cd47bb4a50c0338cb91d9d5496fbe23b5dba137d21373586024ec55e6089bb0d1e7c772fb564f25d65cfb59b6d1761aeb47e67057890ae5838a2d82b4e80c20cee515065e0a5c0ff014a9e569772e68f58899a114420971967964382aeba7c58d7ecf33e4d8d894b3d326d3718284381cf29e0ff6b5e7370ea3e1e5c02584cffd6098a427c1bc406f4b87436845017cabbdb4d6038b89fc1984fc0cd95d98afeb46c817471b62cdb7857890c2968e34de6f377bac138fbae7adafd434d67dc792bc0f15914f12e4c3b2bd98569b486094a07a51a453ac8e0bbd2556cfc707a57c5f9eac500e16e1f89343e2bd3ce98042df87feea31fe3053b4307b4478d6dd30074366af05fa1e1212256bbb049e5c72115f9b7a8d5d5b052b4cddf5aa02fd6f8b7eac483452ad0b717c3d2ae683b313421ba5c767fafd53570a325c4020141f81065ef61268dda35e727a3a284506e15ad958270cb42cc4e326f61301a2a82b5696462e62169d58296a4c088bf1465a48a268201e791a88082dc75fd1f10bd4905eb0a8d77127bdd88070d6c69ca8df2470d7e04d2e37a047b4345a93139efd0f72d66c64d5f7985d90a62bd406ff778b0d1d6a330011dfeb55a14dc0aa2a51205638a7c8599e913ef4afc6986c40923201a5def91295c94985e3eb77d64311c97318a84483118ce2090a9dac25843c08529965632e0302634ab7906e46d2db4002197154c95c7d97946048fa887b7ef2ae3e14e9dec7a2552a57ad95a3fa8d773b192262e6136a3df5aa3bf8fb2b42a9d815fbd42a47e6b443a88d7512ad984a7975000533f7efca0dea7316afdc9c9ecd74183fb3a1966c5c478dc4907bd441790fbebea82159013780508cf5d523972882903dd7a893cb8e77492c64c89d9e7858637384b3c8c2dba298a77441c13b0d1d73f46fb72f32f3adf1766782c9c424fa990f93129642e4fc9ff25e04185459bfa12f0197d346bd079f3516d5ccfa37df9523edbc350c0b93835cc24275b7d8d704e244594bd3ce6d2af58211c4e0f25aeb7a669af938e7cbce395a8868d771fe91d41e1d144123d0f149511582e141c10501bb7a694d95b81c655338934f1a5febca2aae60d96707334134a0f051fb06b5b2c22b23096199a4606be514cce6a1e82e4d589aa4f876d7b7ceb3b386684c9fbbbe1995973f7ab54389a087c1617a9443d144dff1bda6c2e9f6db64e9ca672523fba4745a54d88c854bc256935e5e0ece66bde507a65862fd3bf9059458268492ada6545cdf53c5e84c169784b21a01a4b2273d79036d44b13ed5a1e8a439625b3245e4be58a5919bfde7f5aeb76a012ea9fac83cb08d1bf444fee572a39127d3306630437b986d594581278e34fbc427fff2dd3069d294a58b4b86e10fbf6d6dca43c13399247ea6708b54bb48799533ccfce2ef1b46d08dce79cf127c23d06b2e5c41cc6378d2b187afc36de1bd0fa8b9022da88b732ca39a118c0609ad68ce0315f544fe633e802368a28bb7a5c31937af3669174b23a16ac092034ae052db9c4c3894f08929d9d5a4f951a2d3c042b6dd11f550e5e726fb806d7a61e99528c158a58e32d834a181def489bc37f00e2733d547fc08cda12051006c77b0a2627b0a55b93ddc9003eaca6296e57a3b7d74bfd2308d835637187969c87d1a22969e41ed629a114091e0dd82397c0c0f0098f1a411252e70871c2a3ba274c0df305e43b21af1e6cadc78ca0df3eb32e6cae0b1d113cc50efc3d53c65125f14e1b475918c65dd4f8e271a47c5d3c2cb452b8ae5d508cd80fcb6820b18419115c774233400f8fe410fbfdcdd7c62d16bb91264601cff45fadaeb0a49e9697b75f5c9bc2a7a3019415eda76e67d712079bfce8189f918db213de05504d2b08bb6a7e9f4643f12f4ef66201393019c79df380d3ab0eff405d3ab8ec7aa5229976b4c912f2ace265a86c8bfa4ba7093ac9bd3c5d2bd04b4a1700b0b3a19c1b07d54a8566fd4fd5ef5e18c8d808cfe93d29393bf476d1ed5400462d1f0ef34276b85b1908a1c7c7b403bccbb9a5702e8976e8f2228f235b7b14002abc1b0eeb9e8ed9e0675e87ef4b9073291af44ecc8387b86d6cc5acd2981a7640adaeffe5144c94e8ffd33669fa90675f71785074cf1c0075a155e660d0c2d83ee9296d4657906e46c805ee54551b6ab5a6985e833ef3fd82a143505311125de4a885ae64926fdea61cd99d4b242ae26ba063e6a71cca9da6d2d95189e3bf885fe01a4ce13c19949f91786c0138e07932c25f7213a4e847e4f02b7a13caebdb7f133b5a67618ae10a4c87114184cd198c7035affcb08ffa78bffb6c7ff9639ff5af4cf1ce0dd6485824b1d282b6aa4e11a58cb1c67a8ab5f206101ff10ff0d22ee7952e311fb6136db8e53430f2a3c2a6850988af50173cdf47d2be89e44c9d6c935e2a65f705108be889fa63ae6b093f8ecbbbe40bb70824ecd8d51144287451542a82819b5d8677e7b9b48fd43bc2e6cf3031e1894b01b3744901d4cade23321ff92dcdd33beb337922f3239fd272ba133533d22dc15fc421679db49c2f5d640fc2be813dacbc48c3f613d1ceb0534047f7fd7728ac87754debb37a75ee2dc09d53f3d7d37a99f9f22e448bea8ad7bbc096ae6e977f3d2f77bd2b33bb2ee7f23665bd09c776cf9d9178e4bc08b7d44cbf9c68ee5129fcc4ebc4fb0aa2765d1afa610a932229ced27487ecd542c58ea27310e5e9ad47ff6705117d62ea21d891cc80c5c044b62117100ac5f0044e8d2953e3047aed3eab19914ef0b831e9a7bb35529548b26b01cb4540aecccadb429a7b0efe1f429eba0c80927de754759cd0c4d67f24709339c8d37ba12d5c2b5f347f2158810a81cb7727046a16782c5c34d7db2135077552ac948130974cd417428c13e9c5c3aeca02c970c159d45817605f6cd8b13bfa644b0f0708e440c316dfb6ce9904e365dab8f0e39c5fa1e69515684d2f8b7d4017ebb22e5a46ceadcc26e75e01020d15652da53ca490106d751ea68e0879bbbd43911b9c8eefadcaea005a72f6de39ed768a651b2b69b2f74d02ba2c945defe38b5ab8d3acefb474f50bbd9da4da712622102db1518f152434720f74919e8ed000b56c34a7aa3523fb3b31070b6d8e8e91ebace4ccc639d79e8e31a89a55c8d8ec9138fc19b8813f654f91e97234c23533656c09a97e2b8df4d21ce20e61aaf051965f417da0cd709155d424eb0bd93f2d6f9eb3abc611f738a58db55a9b5bb2ef731cb564bdf7f15613c2ca913c28349e8f1fb9bb4ee6dd20d903cebd02b9b8530dd908282e7155fcb30b9f0f8aee2ba56be3ea2f51f99bf0ef5ab871c140af2cd5b3041d29d4d0c6919b348b8cfe69e1b9a0dbd23887da0752ba1482ca7e232fe79d74e05f97f12c9742dee722369091142b2dfadd49c4c31669992edebd3db8e991c330ebd23db4cdfce2b551cdca08d061d97ace56c0d2fae80eb6f27b8222717d10d1ab8495fbc66b22cde1740a7a0bbe0fd1b449ac39abbe21d226d38670c50b01bac44490c9af9cef697214dceb1110f3a14579cb62430446a53688cf0c7f0009f7ed7598bc9cf4bdff54fe98682aeb2866124b6b33a22d37ee9a82808c0c5ff9c6d5361f917c8c20e338849b2ae32fe4692f012ff319a50fc9092fbbd252ac32804a08490cbf5fa76a7bea9edc1c14f20b12c57cce0a641d8dcc50670ff87c227b031232c266b0cb36684a0667bc1e1c667ade5a7e089ede81c7450d7f6752813b35366c516e299c742bc01d5c181609946af531191611af0f1bd54ae4d67b56fdd64adf15f06b082f310cbe366ea3575a7da1dc838511ea950a9cbfeef9f5ef2738b57e4c1f6f0bab3bd5e62349240b63381dd10ec6fa5fc8de2abb8a4a58660a7f28ece32c136698a7553d074c4e7d164681e63215f9cb75c5fb561f5b3b114ef965636d90f4e4441b7fd087d6d98cbd9f5c1e226862114353234e7aa9bea849fa448cfbd02e9e81b152fc63191874bbe0fe20c48e1cea50826d43afa2a72a96e9f24fa97a9d69925d554e663adf65a9fa24c4a2b1b67bc7e4b76421cd5ffe9e20105dbb302f20982c0957814506053b543233a2c7590d0480cdb0b3438e0b548520f0fc2711c22a1f767d354d8c38b425774275df6de4b407b91ff8b30dccc9c6db9b851fc660e1e21d0935836b4728cfe45f51c3da2c39898de35f0e5b4ecd0e0c24f98d9d6bf7a846d078e2e7c2ef0fd14d0e31bbb6e4554d6d9853caedf08a224240acdcc67a8c28a0062623befadc038060588ecf6de5af498784f5e0f8fd2bc5f6e6baef5831ffd27ab1dc35f09b0159ba74bc834c30c88e8ebe0476b38535e78cd6837a87471d1e9ac0b684b70a04c7f69ccb0acfd4ddb2a7e2613cfbb959fa87bd16461c6aadb01af448f8527b0bbbc6395a084aa6c1bd3c775d413dbfe95713d162017846aa7f05493869d34f0114c24833b46daea03705317963e662df4824ad7c4c6b46ecffaac0415f496639517c09261cc67fd5e098c341a8c2225ad411379a938cc0098fc30661e1bda1459c50036112b21a4a90afd0dc7ba085678d9c3118b0fa1197105672e8579866656240a2fc3a12ae3ba44ea1fe87a40c22d632402afd2eae70127748badf13f7b2d2c57856ee6e8389910e639806ed00e4341a76687c65207a6795855a6e13303c94c4bdf8caaf77404b3b8ad6c2d3e9a8a6789ae5393b1dd2b86fc7187f6aa6d6482078a4ccbbd09590f1cfed30e4529c12db2cd681ae2c748bb956132becabf5bd1edfb559ff8cf3947c23e61a11cf4ca7e82852ad4f1769993e5e6687e453125d5c2773da4f0fe6d9bd881f349fef305fde85b8d855bebe0b71b9eb7c790b07c92c428bdc9301a73b6dd6510f2ba408bfc0f3da9d1cac75ea1df87e923fe39c7dd623e339255f232e430cf601ffe425ba6b382b53510ac1ae9337dd25030dc118c89809e079278f779d2fef725ce94a5ffce5f304d17acd19f3ef69d0b0139b32c7b2634686e794d4351368542899f2d1fe8448c97141969dfd2d13fb32fb7a5ea84dc9e33e03e86b2523cae600732a910cc9491d299290c494eec4965deda04409f99617ed2c4feb644efa799cdb299fbed3738394c69277af037df9d763692c6cf9224d5d5456f3b78f4e990846d6559edc29edb010a1bdc9c9759e7c1ff63b1b68fa03767bdaa1f33a1cc2caacf3ad8db2d4a51856cd6640ac5b5daaed29e479768c95453219c3ac7b8d5a6497b35d41d2fb5279511ecfa62510099186fc97e2f93cddf93ecdf33a9df37ece3033bb26bf7812217dd3998e6b5d0d2e39711792d0325aa5698dbefddbb10b1dd0009d1f99dde87aaabc1156ca9cf193c3148556ba93a9dc071501b81ba5cb7863fea8c095bf7d97f5149957dc35f18bf03dd60a88bebd766ce8e1e6a0a050d2911e594838f9494c05b1455d0d06d308f1293fa52bd8d55fce8b5de98b676706bc5940fdec6ef54dde811ec4b042cda949ced3329fd4d581a2c120", + "0x3a65787472696e7369635f696e646578": "0x00000000", + "0x3c311d57d4daf52904616cf69648081e4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x3c311d57d4daf52904616cf69648081e5e0621c4869aa60c02be9adcc98a0d1d": "0x084acc970c28713ec93bf925352d3023418fdf89933227e1e2fdae8481103dfe28bc3ea120d2991b75447b0b53cd8623970a0f6d98fa2701036c74d94e6b79252c", + "0x3f1467a096bcd71a5b6a0c8155e20810308ce9615de0775a82f8a94dc3d285a1": "0x01", + "0x3f1467a096bcd71a5b6a0c8155e208103f2edf3bdf381debe331ab7446addfdc": "0x000064a7b3b6e00d0000000000000000", + "0x3f1467a096bcd71a5b6a0c8155e208104e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x45323df7cc47150b3930e2666b0aa3134e7b9012096b41c4eb3aaf947f6ea429": "0x0200", + "0x4dcb50595177a3177648411a42aca0f54e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x57f8dc2f5ab09467896f47300f0424384e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x57f8dc2f5ab09467896f47300f0424385e0621c4869aa60c02be9adcc98a0d1d": "0x084acc970c28713ec93bf925352d3023418fdf89933227e1e2fdae8481103dfe28bc3ea120d2991b75447b0b53cd8623970a0f6d98fa2701036c74d94e6b79252c", + "0x7474449cca95dc5d0c00e71735a6d17d4e7b9012096b41c4eb3aaf947f6ea429": "0x0100", + "0x79e2fe5d327165001f8232643023ed8b4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x7b3237373ffdfeb1cab4222e3b520d6b4e7b9012096b41c4eb3aaf947f6ea429": "0x0400", + "0xb8753e9383841da95f7b8871e5de32694e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0xc2261276cc9d1f8598ea4b6a74b15c2f4e7b9012096b41c4eb3aaf947f6ea429": "0x0100", + "0xc2261276cc9d1f8598ea4b6a74b15c2f57c875e4cff74148e4628f264b974c80": "0x00000000000000000000000000000000", + "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb333f71360101c6556bc3ea120d2991b75447b0b53cd8623970a0f6d98fa2701036c74d94e6b79252c": "0xbc3ea120d2991b75447b0b53cd8623970a0f6d98fa2701036c74d94e6b79252c", + "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3fe54f28cc5d1fc584acc970c28713ec93bf925352d3023418fdf89933227e1e2fdae8481103dfe28": "0x4acc970c28713ec93bf925352d3023418fdf89933227e1e2fdae8481103dfe28", + "0xcec5070d609dd3497f72bde07fc96ba04e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950133cc54b617fa6116175726180bc3ea120d2991b75447b0b53cd8623970a0f6d98fa2701036c74d94e6b79252c": "0xbc3ea120d2991b75447b0b53cd8623970a0f6d98fa2701036c74d94e6b79252c", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950b8cd4c3513e0fa5761757261804acc970c28713ec93bf925352d3023418fdf89933227e1e2fdae8481103dfe28": "0x4acc970c28713ec93bf925352d3023418fdf89933227e1e2fdae8481103dfe28", + "0xcec5070d609dd3497f72bde07fc96ba088dcde934c658227ee1dfafcd6e16903": "0x084acc970c28713ec93bf925352d3023418fdf89933227e1e2fdae8481103dfe28bc3ea120d2991b75447b0b53cd8623970a0f6d98fa2701036c74d94e6b79252c", + "0xcec5070d609dd3497f72bde07fc96ba0e0cdd062e6eaf24295ad4ccfc41d4609": "0x084acc970c28713ec93bf925352d3023418fdf89933227e1e2fdae8481103dfe284acc970c28713ec93bf925352d3023418fdf89933227e1e2fdae8481103dfe28bc3ea120d2991b75447b0b53cd8623970a0f6d98fa2701036c74d94e6b79252cbc3ea120d2991b75447b0b53cd8623970a0f6d98fa2701036c74d94e6b79252c", + "0xd57bce545fb382c34570e5dfbf338f5e4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0xd5e1a2fa16732ce6906189438c0a82c64e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0xe38f185207498abb5c213d0fb059b3d84e7b9012096b41c4eb3aaf947f6ea429": "0x0100", + "0xe38f185207498abb5c213d0fb059b3d86323ae84c43568be0d1394d5d0d522c4": "0x04000000", + "0xf0c365c3cf59d671eb72da0e7a4113c44e7b9012096b41c4eb3aaf947f6ea429": "0x0000" + }, + "childrenDefault": {} + } + } +} diff --git a/cumulus/parachains/chain-specs/people-kusama-genesis.json b/cumulus/parachains/chain-specs/people-kusama-genesis.json new file mode 100644 index 0000000000000000000000000000000000000000..f93d622a37b98168671ddb4bb04e5af962c12f3a --- /dev/null +++ b/cumulus/parachains/chain-specs/people-kusama-genesis.json @@ -0,0 +1,119 @@ +{ + "name": "Kusama People", + "id": "people-kusama", + "chainType": "Live", + "bootNodes": [ + "/dns/kusama-people-connect-0.kusama.io/tcp/30334/p2p/12D3KooWQaqG5TNmDfRWrtH7tMsN7YeqwVkSfoZT4GkemSzezNi1", + "/dns/kusama-people-connect-1.kusama.io/tcp/30334/p2p/12D3KooWKhYoQH9LdSyvY3SVZY9gFf6ZV1bFh6317TRehUP3r5fm", + "/dns/kusama-people-connect-0.kusama.io/tcp/443/wss/p2p/12D3KooWQaqG5TNmDfRWrtH7tMsN7YeqwVkSfoZT4GkemSzezNi1", + "/dns/kusama-people-connect-1.kusama.io/tcp/443/wss/p2p/12D3KooWKhYoQH9LdSyvY3SVZY9gFf6ZV1bFh6317TRehUP3r5fm" + ], + "telemetryEndpoints": null, + "protocolId": null, + "properties": { + "ss58Format": 2, + "tokenDecimals": 12, + "tokenSymbol": "KSM" + }, + "relay_chain": "kusama", + "para_id": 1004, + "codeSubstitutes": {}, + "genesis": { + "runtimeGenesis": { + "code": "0x52bc537646db8e0528b52ffd005874bf04ce0e06b71250106878940e68e5085853077037f7e0ac00e39f3ce5d32e68cd9920c41d6c0ef827f2d41f397370f8585ab3819e905b19509709f6cc0c0dc5faff31c72dca4555fb9fa2d2f837217befbde59652ca94522e14a311af113edc879f1e0f12254a64c3b592d338129b6bbebe8f07891a4ac439e9e448e470ccd7e7e341025222a851a2f71c5222e896e6441a257a740976a2e7394e7224682891c9e43628118d976adc8613d9a044a6ce4d4e64c3332ff90d5fe71e0f121725babcdb311325d2e196bb8eb7e526276a375122291d52a2cba113991c7324a29f28518d1ace51226c52a2e9359813d538468934cd8930b7f119083da34452fa4589344a84e39743cda113650e29919c7122e93c9c3a11744a896ad4701a4a44e396e53994a8468ed358344e9dc8724a8972a696e344b3a34ba06628d18cd3d0b8cd0c0d8d0ef7ebf21c9cebc2ae594363b241d2a0d5f3b2a13d8c46966a64d6cf442af5abb1a0062f8b0693990d938d575322c96b4e0d83160d29833666662259fdfa2ad5481a4dd298b4a7d303625daac11c45a2978ece8c09d3260f1e4ed4ce83c7b4614387d3009fd390f5e8e14497f7e851635925d7e13cb2cb79481a6870a21aa741878657a281aec37b9848dec3514e64c3513c783811e63c280f4739d1943a3a588deb701a248dd3d03a3a3a3d9cc8f21e94484787a4398a521c27ca1c67ba0ee791e3386e03e53c9cc8e43c68a06187534a44833b751e4e74b93b11d4d1f9cc4c9b5c87ebe0e0b8e7e4b88de3b8e33811c9719eebf88e13957c8783dc38ca894a8ee2ce1de53b4e64c3dd899ef3a0e1e64687dff0f01b27aaf11b7622cc6f9cdad8b8e750221c4a84e3ee36396ee34499dbb01349a74e831341a78177e83891e53a9468878eeba0443b3c27c7697022cd7538d1f41d4ad4a3877794c88612d9f8cc8cdf50a2d3c96d28d18dcfccb88d13d1b80d253ad9f8c98932dab33bec9da33ce31c87129d28d1c9713ccb5c87135dae831271ee3a9c08a343ec0e3be72827ba6811bbc38ea2443de812cc03734a89aecb6b50a21a8e51c79c68d21f304a74617e43892ecfa6674e54431bb03bec374e444315b03bec3450221d1adf41897450221d4e3b4ae4385c0725da2c4821c317655e0006144cf1a94982124f8451862eb4008924f82051e33d6f676dd0cd41f7edace3a0fe76d64d74ee0e7b0e4e8ddf50221b1b7ea244aa2058a1852e5e6a70033082e053a372c1114e38c1164d208397287c6a9ca8861295287783ceb7b36e83eedbf1412bead749f4e4441a156277d84d9488862ec13e48685e8312957c862e11c4070992739448d3bc44895434b892c6151a9039630b5ef021ed13c658318313b880cc1664f021391189125934c8464f6f675da3fb766ca035875f873487a64976873da344185d02e58304f48b12ede0832cb850c5194a1883039f4997701f24746821061e10c1094994410b3e48b45b4e645122497d77d88922e5dece3aa4fb766aa035c8af3f8ada1df675d52bead10040420a24c6d8e1faf97bfede43428a7fefbdf724db1d6eb580e189f74ea13a5521d7a9769d2985ccb76b9d7adfecdfd3bb3d0811d9ef162184617db7eef71ebf4e6b54fb0f8ebbdb731eb3cf678a63841d3abfcadf8fb98b6c3fe366eed5b64266a72aff731c382290ceac35eee06b2be4098f7921eba3d428654fe3eefd16456a613e8a465a214fd8e8850ef0ecedbb1d8146bc15e18c9e5d337af6f692edcf4ed5f6e7dbce5e5ff63a1f5cfb3bd21ef4e86cd47a02b2f8bb05054ebc2927db1d0e7a904ed59943a72ae79d8a8e43a7e0c71250f9e8399dead4fbaa7d0df2d1b779daa76a5f4f1f9deb547b7453f4e85aa7d8a3af4ea441bbfadda162662919fbead420ff3ce36e3f638d7f60a318ba6f47a05b7436ad43efd92f37752a9399c4305a31bf1c935aa7a43fe73a85f9f34c76fc19d66da3b6519af346a41f364aa355f3cb65b7af7543ef31cf48b2dbcfba7dac439d9e7df747cd7976a6d5f2e8cfb3c76c75fb57370fc03ebba1f8cca66fcf366b6d3722d299d6f9ecdbbd6de50c7bd5fe7906b785335aa3741af5dc726f94057fbda77bde76dba876d8557e212e53a64c99afaa5f975d1d7abfce7436aa9db79fa591728d6aef69cde49d5a7f8eead47e4ea7fc9ffb5821ef9f579d7fbe3a0fe32845b63a956bafb377dad7b3e5c105e1762545caef6a0452be96be5d00bfab23ba7c6f3f4038f6f6ed94e5edb053cfdb67a7f6dbb3de7e2cbadcf3d7ed5b1d7fc6dbf3ec75432cf4031b05bd08f7cf7953c06ea3aaf61c69557d9ccfea2afc0a7de8bdf4dd7ea2f77496ed4644d20a5ffa74ababfe96bfaed65a9f1043d422def26d94e53d6f764244ffdcea6ace43cf5893ddfeebf6773b023f7642ef9fc36e1bc5bedbcfa3b051ec4d83b8df1d2a8b5f12d9768a977f3d2b6da7f6d7b753ed75fe3accb85bae3dcb5a63eef9cd4c150efa73f6de7e982ed7feba6dd4f3acb51b2250f0627fecef06e936aaa777fb818d7a3dcd1b0faa6fdfed47c5cc6164ab53fd9f678be2b2e5c16da32af7c3cedb90228c8c8c8c78f6acb5ed14fb3aec54fbfa6eb351cf7b9a3bad51cf7f70d5f4cfdba1d7f9cf3353a7b651ebcf4f9de27f9ed329f6e7196ba74eed3fdf0d7651743c14d5fcf6f94d718cb4436f8774889f296cd4fa6e45d89bd676f69eeee9d579cdcc854930c5eeea88d5b3e7b00efb9f358063e7df1ec0fa6ed9f2c055eddbb54eed962060f1ed5ca776458229beddd4a9f5f653a7d8db735807fef6d5691ae4bf3b54cc06c87687db951154bece5fe73ab55b8280c5afcf4e2d1746a8f2eb5aa7f8d7b779d6a79a7e7d759606f9ef0e15f301b2b581abdcb3a33a55b567673f75aaa29e9ddd47a7f8d9b94eedea882ccf6eea543ffb360ffbd49c67d73ab5cebe3a4c8382fcee50313f20db1edcfa5a1c19e6c11963601c18b82f7024e098e096e0a6704a704970487052b811704770467046a532a53394d22899a1548612194a644a63289d510243c90ba52f94a2501ae3e1e0dde0d9e0617957a6131305f304138ae902ab05160b660b341f6859683fd0b2683a201d411a02090cc90b2433485a20298124464906a518949a2895a024456906a511948c2095219d818406c90ca432946a50a2c1b44296850c0bd38ca9452626fb423626eb42c6856c4b7684cd0c5b1936326c64b6316c62d8c2b08161fbc2e6858d0b9b199b98cd0adb14b6305b1436286c60b62f1b13b631b6246c5db630363036246c47d8bcd8b8d8b6d8569b10b6206c40d87eb061b159b1ed60d3c1966512a1f4040d8b39867406090c243290c890c6401203290ca5284a30289da074b4254132a2a4020d08590c4a52c8aec0455192524a41c9a8f404298d9213251464514c25e610b2176429d0a4c8a46830b219f01137c12698623805bc02a020802065a1870420c087c8909f1e03e8b080220a4891be30000104a004859911cc1c3163c48c1157863b03970687066706ae0c1c196e0c1c1938317061e0cee0b6c069818302f7857b02e7851b8313833302f705c785d3c21581db82d3825b7130e05e4001ae89d29852174a6694b2509ac207a204712d201161bb62a3629bb28d603b82a7601cf00dd8068c85af700d98062c05cf8065c031602b1c05c3805fc050b00bb805cc02aeb2e4c540ab42cb41e98b768312985218ed4883426322db426646a685ac093764342889c9ac6450642ec85a90b120ab92ad2053016606ac0c9818b82e382e382f38227047e0b660676060c0be80790133834b02a7048e0cae091c13b02c6058c0c46057c0ac805501a30216052c0cb6050c0a1818ec0ba6052c0c5c181c1238319c1338305c16b82b7056e0aac095c151819b0227052e0cc6046c0998185812b02e18181812b02fb02d1817ee09ce09cc084c84e702cc0b0e0b9814302e60637066604ac08e803d017302d604cc0b460636068c0c468627059606860656063b4366941d9119c145815b023605ac0bd908b032b03199940c897e42964436a58485d2164a5ac0bac0b8c0b46045c0b6287101d3025b6144c0868009e1f100cb020b020604ec0718167d04cc07580f301e60576056603bc0748065c1aac0728051814d81e1a0a180dda0bdc0b0340db02bbd05ab0146034c0a6c06980cb0186056b0283018602fc05c804181b500630156055b01a6022c055d057b02730243017602ec086b02330156028c0a46028c096c096c4a7fc192288181218149c146c03bc08ee0a0c08cae32dc09ae335c695c685c66b8ca7091e122d32fb8c67089e10ac375c60586eb0b9717ae3157172e2e5c5bb8ccb8b47065e1c2c225e6bac26585ab0a57191715ae295c52b8c25c51b8a07081b99e7039e16ac2e5e522e362c2b5846b8c4b0997185712ae2e6fca15c605c68584eb8beb0897112e2f2e2ed796ab8b8b8b4bcb558487c4b5c5a5c5b5ba88700de112c295c515840b08d70f2e2c2e1f5c3db878705d715971ede0d2c195e5aae2cac145c535c58583eb06970d2e2cd795ab060dc545834b8a6b06970c1e0bae185c56ae282e18b40bae175c505c2eb85a70b1e0aa72ade05971a9e04ac1f5c4e5c48582a7c47574357199e02ac145e522c1b5c435a5b35c4a3010ae242e242e29d708ae232e233a8c56c23c432fa19930d398684c334c32330cf30ca6627a616ea114c6c4c28c9479349b98269825985426092613afca5c624ee1274a5778573c1ab4142c8085f1a0782db8be702a28598143019782c7c45be219f18cba4c9fa1d36834da0c5d86264393e931b4183a0c7d4683a1bfd05ee831dd85e6426fa1cd682d74161a0b2da6afd056e82a74194d859e4283692f4d4627a1c76831ba0b6683d6d25c349727a573d054f4148d83be01e782b64163e92b5d839601a64457d131682b1d45c3a05bd02ce815644af0105808ef08ce827fc041602cd807dc03ce01f380ad601d40f100abe089100632f00357820948c0480d910a19ff7276e5ea0704458906900ca10448082448327e41340142a264484910489060cb404c34a064a809111b40320404d09325413459820489cd8f1f9a16485a1670342c2c07966ca08913a02125404f8080b2040a501320223a9a18209038d94093224c983841c01010404c983841800dda1582685660c24409104c98284140158418e240132026652c10d006903819423224040796007960479bc24261b244c910501048808036d0438bc23ad9409325483ef0048808a10f2869806b505820209a38698244099225433c10104d9c3060a809114e8000e27168608270020450103ab4272c940f0005218102e50340469a385902050a10043acd09eb812543fc13a0a0274e2670a4d3bc2cd09092209630511205091011404438c087208038c001253ed8a091b150828000120208252c94a126404f808468b2c435319a2cd9008ed665815802a5c9922743450021f9009321865082e40950104c9610e113048413263e395a180be546f3629520c9d1b66c079028195212849221a01e66342e40b084899225434b9a2cb1a169b141403861a2012440434400015404500d6db5404f9c2040d388b04d9c0c41049220982c214203489a280102c992217ea809500738000481208082208209104d963489809227447c0f6d080b0568c9d092274e84182242098d26846de264c990922744048164c809132848960cf14a9e10f136bad904abcb162818e15795edcac8e859f56c642c2396c143b00567666666dc216fce63e67d3d67c62b5fef3ee65e69bdb5aec75956a6bdf8369a2e66194d6bed63b9cbcd2b795787ec850fbedd071f678fad66f9e02e7cf10017c7ccfc9e65c1f776a5f560c3edbdded32c8bf9ada5bdbdf6f58bfbb46cb9d7b29697dfdc7e72d9e265ed69d6a5599ad597d4acedebf5f526ef3e299f25e59cb3b77b3237e3e00c6049b9da6559ef65f0b1f5981f3febbaacf7de7b6c6d05d876574ad92bd7daf798e7e465f97a9b9f0d66b3186318ef62d86218b6d862bb8b6118864938574a29e74ec96bd5d448b9434dcdf294bbbb532e64b8524e3833b9732543b82b57c296dd4db27877b775e0ad79371273f74c7c2b44beed8ebb52f64a295b6ea97b7bbbb77ba55c967257cade96cdfb5e33491240f6f2ebe57d9b83e47d8f59cae6e6b74fca96bb7399e7cec9bbcb524ade65c97277b38ce53e9ad5c1fbb21b6f27cc78f6f15ecc248b997b9b9bf7edaebce65a37fb52ccf0c696765f9b7679003870b65b0ede1c33cd52000190cddccbfc76776f30377397b6be817737e3e5c9cb162fefe320cc8ffb35d7db4078e5f6b398a5b5bb26de9d6b69bbcc9c6d2f899744da98b4bdbbf5e47d00789377b9e76eeff20f9e73ce655e669ebb4d9252ca4dc285737b77e75a1bbbb767b7157997b97b59f27277eff2dcdede5d5edeed65def97a6577afd6d27a5a66bd8bb3628cccd6aee47749292533c3d7d6aed59a7ccbaffbedbe65962ca5c5524acb87c599b44142c852c21bee9692e505f9a6861de66df91ef37bf17a39cb2be54a282db88f5b6eece6c870657835b63ff0c44907803a206fec0d1c70c20409079a2ce100079c30b129394d114041345982a4c912254200b1810d38a10260c264495010548f1e281e281b3e6cf4a0a1069d20a520982c11020824434c8850b201a020769e281982d2a304c5c6e6260808251a60c2c4c9931a7628017a7273020a4232540450931c401cb0a9016508ca92228072e210104aa03451f26408c9d0920e74c009cac60660c906809e0c41699e28016202044e29882640430ca104091007943c71320485ee0d434a9e003501e2000ddd0660c88993274882007a0214c41327404b9e0cd55004901039341b182202c95093254f8638ed0d1d5832d4848827488080b2a40334004fa0e0ec0d1fd8c0922740519010e086010c20004100edc036004100418102f464880e380102c913a0284e80007a82440994208000427243506a00011802082028489c0c0df1812740f0e4c8210037380e29244538f1c0108e1aa9010400490080829430d100120e345922041425427803013dd9404e9426406fee0d489a385902e5095014241d40f2c4c99012209c3061a204c950114039a234017a3d3422f4aa54aa2cc9aa5458925549956a1615a9649222de242abe8a8a8aac22d5ae4aa52a7a49b68b601215171575d14b52c4aaa2a29744c545aa4ea2e2a24eb2aaa222952a2659d595648b5445aa57c42a4e52a42a52a954f12529e2a2a24eb245aa4eb2459c44c5459c648b8a8a8a547126d9a2a24ea2e24db245452a15545949545ca4924954ac62554ca26295aa93ec2651b14a0593ac8a93ac4aa57a4956a5ea243d0f0abcbbdc01284a36657c1563bc007eb75461e5b3cde057a6156e57b95711156dbb5545f0ec16fdf59ec7ddfbd7050911bde5fbdb55aef2ed702bf21e3a5bb4f2c30afff2f5ca74a9dc7eac1fcb77db19afd24b5e339fbecdc3b9b5636dae0df55b8e3969a70ebdb73c9268dd2f9b26698dde3ebb992a5c462b167d7a6f44aa2ae851c9de171dea7f3ed927adfbe5a1b74583d8a547e7ad08bba45aa3f6615352472ba818f3ddef162abef8d514584a24af9cf46a9abe6991366cdfcdf22c6b8d37a60bbb88b3cb39aab8eaffa0f6b67deef689b820cbe357ffcc3b7561251c72e84ab4aa3ef3cb2fdf2de39f8bfed02876f8d68b24d9e5984e39592f8c45fb3032130c24d26d940838e9d594d3a9cb9f1371fcaed3290bcbfc791092bfca5f990906923195af43fdd8162ab2f8ea3b381557fc731d1fbb6194a730106875959ff443a3e09148ea60a338becfbc0e3ddfba6d5474ad838d8ab442bf99690137d49fd18a495af9a547b75016ad431d295d9db7f145832d3fd0327b87eb54f4e754ca18e383fc6e99420a2a9f2d0f8eb3f82d533cf1febbe506677cb6d96ad6768414bbca5fa3d7985d9d3fa5774bd77c3b35e397c34e95fca21777f926a1c70b6e447e6026e0f6d3a7463d6a6ad4abd1e57835fdf3996e1b359de3e12d2f3d92c76eebea7ee1a367d7baca547eb40cfaf31f3a05bd9da7b00efbededd0398bcfbab9fd808043b1d7a94d5a550fdf72eeeaa4f13af4be1d7a95d0af8ea6dbde617fdb91ec1b46b7ba2abbba5f1e52668281b0f7f40f9dda87ce4cb00efbd0e5f603e9724ce5b98e694440e5d32e82e7483caac4017cda9b1635ebc8b869555526d83f87dedb91e88f56e8915e910e3722fb57a6b88fa445980f15cfdf66e47a486b037ef7c7f5cd5ad3aafade47aa11f8d2f20a5956bdee2732d8031b3ddc8e702fe983ef41fa1e3b91ed36c643d7b43c8400f4cb9d90e22f083cf1d03727ae78e8d32b0ebf5e77f82df9e6bb7eead4f4f51cd7e994e6eba84e5dbe1e24874e5d1d8cf1450bc3ba7d6b4ed7f64bd37b1ac748e6127a96917cb71eb20c23656e791635df8f1a1d6279f488b9d5f147e99156fe4cd3aeed08748d0649afd0a1a8fef2b91d81a27acc832e879ed17a3946a3ecf652bdec36d73a158e91e89b47df1ca355f558a99b8e056d0ea3973a2952a448297912bb3730fb24b17b437d7fd1ead3f38488bed4adcf543d147a3f332fe0367f9b11e897bfadc8f48bd6cd27c5b93c73e9bd15d928ce458d686eb9e69643cfb42c48eba1358d3fd27af9c41c27fafef4abc3897488f4e993ee637e3d16af20ab5e73faf34885b84cf47704faa4d5f2cb31e68f1d7f11abb0ce9e3842e3b1cb19ce076ee16f516a94367e6d85ec2ea9b723d0c8e8d7797dfde7c9dcaefb0ad7e361effe900e9d3bcbdbdf3684dda2d5278e118bb263cf31db76ee60a35ab6cbed08f6ebd80aa90cb723d9fe685f8aed8f66a397ddee8f6e23bec7436a6a2db2e7afab00c70e8170757e734c58e9f84d15e0d8b79f3874156479e96f6a3f2499f20c1bf0430ab03cf8e5a13a85233d7a033a55757ee854452511a253f5b45c78e814efea09311fb1e7727ddd2f657cfcba66f0449f0aff71fd91a53fe9bbec43f2975fa753425ce6c9fa907ce9bc1941f2edb27db9e9ae0f7edb0f7bc65d90dc7870de86bce76c85e0a51389400445b3e8a56f57150fed4193d6e7eb550e91fe8cb43f2a02ee9e67dc6de4394b6a844f9db23c7ace36e1a0731abf5b82800567da951365bcece2739d5ae9d1b3de7848238d339ce1772bb33ed665c7657e37a3f5d146463c7bbf31d7964c88bf358fde1d14fe8b06b15fbe822cde86df2d529ce16b7f74ee9ef0fe883e345f68cb7ce6bb0dd11cc332a618bfd655e9d1af6e3d5b0840d73cdb0b70bb5ac117fffcbabaa8f56e5d2f7fde9b11239a5f9e418d372256e657a739dc8ccc21d399eefe60ef69adab4d797fb05f9e75b59f7dfd8a325fe89dc1e8d7adae0eb14a726321db21dac57c24e3a19113aeabf85d59b1c17714bf2b1830f1a8dfd50b80f0ec4eb8b7c5ef8a05649eb5fcaeaa5cf13e7e572bf8f22ba48560bf0c447a69856c1a3c92779eaf2fbb943d5260617f48dfe0f748718505b22f696d5a8b3e4a3f079ef0b35f268ccb346d857481042a2f54fa28f3d99f4bd6617fbff657f9cfb3a7c5ad4886c6d15722681c15915f893841174808f342499ec7c0e0858a485f87a6008553145f87b044914de1eb1009a610bf4269020f6c004297af50b0e8f2ecbc1599464645de5664cb3c7bdc8af80bf14bcf6467f166247ad35a03a397de6e6d43a443ef795d556f91f1158aeaa55b9dd0962953a6551dc5060d8c1ecec0cb77df7dd69ad54532be3b1dcf1b11ff76d945b101e9501b71e9b10b6a979e75d71b112e13dd8a14a708f4e844a0473a94ed4a0a347ea8dfa2b53d0a7f74d5771fbbee7b28fbf605a38d56cb8f10347a1b066211bfc832967560315f7ebd99677dd631d6011afd7a66696f1bb25fac39e7943de7e339238ac49ead40cab35bced0b3d8d16fce98089a5b1dbbd60559cefe36229611cbd9da26dcae9a78e231b79c8f70bb92c28cc75ef32c7b1a6f4466bd3cc8ea2ae69667568753041a19fde6f0dfefe656d7bf794f5b5adcfd51f276ab2379a9ab16dc86584ea2dedb10cb39ef795c8763c472925b4ea21d8e11ec2dc7dea237fb034ab7bc3de31ecffa40b73a53a3a0979cd4edef8faab9b51dc15ef39b15023d6e4770f607748dde90481d1bfd6e44d8e8ca8cf734f7786628ec1de8b044ebfcca05598e79b57c79501101c330cc7b3a831a6f43d8adb715b11c0b22ed0fe8a5fd018d1eee0fd8010e1a19f19b6757b6d192effeb84a4ebabafa3e735246ba32dfba27a492e63d5dd29c946d9a5f9946777d64f47afb57b76e55f695946bd473faed5b5b54321f38f8bb32411a3e70f177650232bb3f768709c47cceefca045f3cf4fa283f6fe8107a2cfa17cb7848855e99323088096db2601cd547d9e56e47168ca397f44a56f43576b1c98271f4d12b085e46d9a40052561fe91511144dba45fc73f6ac61f77cb70a5c1141d196e173f95e31c251021a3c61e5090d56aae0623434c496f1578c8090b1855194024859155141f0f1882dc3e7a2465b860ffbf32b4637a0a0831160c1c8c867a9088a2635820e691de29fcf48010a3538831423239fdd7aa0f9d8f206d9d1b7aff7f8badbed03ad902741fe0a74d55ac19f2fa4914a49e2874ff429343e543a65faf69b9923ae32f9f5205f4d5fb70a0d90123ba6d2a8f6ca55a6f2ed75abf0ed44d0b9b71306287c10850fb2843132f289febc72df3eaf33823830c10c8e9081107ca424f1c3e7f9141a1f282589f6913ec5003ecf6337c5003e4454f8f09ca8016fa7fd75f9f6e84454f8203d52a29eb7d32e2911153e447f94c8df4e7ba441eaae56cfeb76593128e1c5952d38e106521063c6096e7d5429f84208308081165e7600069ff5815e837cfb6e3eb89191cf732a9deaf1edb07bddbe9da3df1d4550c50da9781076d199ad18ad1823ccd9f87755822d3f1d1dfe087199872e694ea322840f7687f17c5748f4f52c3e7ed39ff427fd59fe7ccae74ffa7b2f935a60ec56ceb44b67e938d0f9fb716011a4c78ee58c1d3fec76f545e5fef983ffde7b3e35201cbb9c611f823df3eff6d36f5f371fc9a467196f3f98670eddea34df15b279f46ceb545f336b0bb27c3debb2df5509ae78b83f626fd7ae75965f1d7ffb76d3b56efa45847dbda727adebd3b3ed6ae6ebd9d366d79bf376fb5b17343d28f376accbdee5590f9a6799f3ae1014d56f5e3d608634ca3c94ed82e509267ea33573cc7b5e96456d767d39cca436bbf6dd8818d1682de22fcf3cdb8dc8d2ea711b8239e6cfdb4f4683b021982fc57cb722f32f1a34bdbd4e23edd3af6ebf5b55c63009d9ae10e9eb31931d0e8d8a3e840fd2a8e8bbd59c8ffe760342d3729a07f3e83bac10df1fd3a3fbe814d7a8797974acdbde99aed33c13e7238fa977a6475f28bee2f0d17156087fccae2ea751d3dfefaa0441e0327206faf4e7bfab124cf9136fd3712c7fdf8f6351212ef396efaa0458fc76918319bca9e38be6346a5a5ddc1febbb41d9f1bf2bd923f268effad8ed48bfaef24b1e29984ba1e2f9e5eb597675bbeace5a7bdad56d18a3b8f100b723ef9f63ddfa7416b7fff902544dfc3c1264c730a0e7a7bfcd4897def28c548b8e58eb4d013ddadb14d0f3d37b23d2e4858adef2dd8a685547f6b4de16a08ae2a7674f83db109595174af2d3b36612a91659591f99a5c9cd9a1a36af6e7db24bc3baf5b9baf5e9ad48bba4959bf7916ad1effea8bb3ac1132f1debb8ab7323232323239f22d01f7d9b5011528e30c2e89f6ca3a44b5a5f6f47a0bf0f7a1e7d3705ec5b9488d30f9d5ed2dd1ff539bf17c40e3b1c23f503dfbebfdb4f7b4f17b54a762433c9f4e03a9daa409ebdea3cbbb562823bf540b262c50496a329b6fbc13280db9509b27836fae759697d752a1b7d7bc6c3da760ee082d8888fdebf5c8851e6f9d97b33c2462f7dbb28b008f7ebcf778554e83845b08754a8f4eb4bc607f948eba3d07bcb7cd6da760de0d8f9a958e74dc885b87f34878d7e77a822b70db20a705906845b37d1643e7090cb56ce688d82be26574003c440390674e873eee3d9dea9dc577fe9d9ee70d14f3d9daa53019daa5c924e49dfa153f0a5ff70c54bbf40a7decbb75e5ee6f072bf78e9d07b9a8ad14b29a594be3a9206ed9836232b6239f40c76adc1ce826ef5349c97f734ecf8a74bbfbcaa2e3933ab8bc20fbb28fc96670c3bcbb36edf1f30c8eac1f20cba500ecc367b1aecaccead9eb4c29f2eddea5e435aa7b35bdef366b72f44f4ed6fb5d573d2d915366a7a6f43f837871d9cb40ef50b311abfdbcfe656572d8fc23d136864c4d7e942161a4694f928f3a7c3ae6afe3c76419847cf324827842e34a51c61c43f8922fff228d64351fd45e1f329648d79cde163ded3b31ff3ad137a8f519c22bcfae870fb89fe3ae83d0ff3d845e97f9e75f3fab886f047c73a68d1ca6ff9d555beba2ab5ebbafca2d37b9e94ef2b14d5b343d7e810e81f69b56810a442445fdfb317e1bebda7b30e96d6f470a0b343ef0e077abbe519ecd833de14d063393becb621ed96c322ed96e52cc4659e0c69bb1519a248929f3ed783a05b9ecdaec287fe2efa4468c71819fd508d9ffede90f6f3c81058f744e800dffb03fa907ccc6b3ff4ab7b82f990fce9bb1941f297f7f4ec8474fce558277480e7fd7175425ce62f9f5de58717ddf5017b1b121d3a6f3f9256d54b87dd9c1dbbd5edafc7ae6e3ff0c9cb58f34206cef88b9ec56e9f378e43568b4f562a9279e69986f96a8e697e398675a646ad5f1dd7adb367591785bff267ce5d14fe2ccb3cebe56d4862dad3591724fde23a95b9e5ebbc6525fe6cb79f95335ca3300ff29af3f6c3b4e7f53477953f48fae52b84dfea7c7fac739d0af2eb59c7356ae75b46a45fb4847974e89af3f600ce317a6ad4ba464ddba895ce9e65bb5db4aafe72ade34eeb2ae617462b7ccc33e7ee75e5d7bc2e404584dff5a1d18af9c3ba7dacdbe7eb794fb7107ccb7bbaa733d9d5e8ecb3c3612ac46fd11c2d46466fc38fb7ba9c46f14795c5110b19849d03b820e83dbefe6e090216bb426a908faa5804fb98c5e815d25af4d0ebd5c352e123bd327dbbe9b193001032b428e3b30ebb4af43088c996f1964baf451f7d57875d2075bba841981fe2b768932de3855e99322fe91511142d18473e931a2d184795e823add0ebf5cf7b1eec7a7cc6daecd677abc08271e4b33dbe8855b15b0c128ce9274d78e9c7b3238c559632786006349cf009c09626565ab444410a61f82c4785d31ac56efd7621052ecfcf99a0c2b8258b3138485096ada67a37dba87e10c28e7f370b644988e9a6c8180ade16e00204209982a1f734a493aecee34076806d5429e30270bb2d40f51052157302eae9dffa7c0e7daaf64e640a281eb7cedcb6b7c6dc7a6f3ca8beb6072d152afaf5e56aa0c414bf2b25a87c2d3d741b7eb76461c69720cc9863670e6e3ca85ef5ecddcd54c9def613fb69323a73ecb1eb20117ee93d3d3b8533845fbaa4f3d963c7bf3a9006717d447600f6f5ac14c4dd4c0b98e9ee906c9fdbd514343efeaea640f13b936d01b4cf4acc496ffa1c46dff64ee10c697ffea4b3c34ed5e841cfa14b973e3bd5922ea77d4ff7b48a997b906d01b8acb49dda951259fc73c8830a3af4acb403f7bc5da8e8a1103f6b20b34c5ef27d3b35780dee8f0709cd9158821d876f3b1235be6fc706b781e4482cc1be6f27314af9deeb86155a1246d8afa1170bbeed545b5342df8d56c83c3bf6335e764f66c746dfddae9210f3bbf14a892c5eca977e6943269dbbf041684929a5654108df8b7346191f8ce2f98ca50ae79cbe3cf343a3a49be0d4e6f663993a351dfa29675edbcf9c31c68fdb8f6559d69c3146eda18c5d85dce517adf09a741b15a5252b7c18a16469942d0ac63841e689299f6d126eb778a2ca6725e90baf688e75fc373355389c22d031878ed120cc2daf58744ba31be07695832b5ee7779583a35f24dc6e8182302f5d85751562d8b47cdf8ce55de1abdeda7eae465975a8ff22f2254ba7f6314ae44b9646ed57ce9e3f912f586491be4fe4cb149de227f2058b46ed5f57e619ad30c3e824f2258bd911f97245a3887cc1d229d5eff7b63d43e48b148ddaff32c56e46ac3265ca9ce12d4ae40b9646edf734273b0e21835d94f092a11184cba153bdf1f60384abdca9bd8374aabf3d87e6f1f69ee6719f7605748a8715f2be94c33df1eda353da6f14f6cbf39429508b63e4f6236687e6599f309263dc8ef1ed20b1975608104ed21c8228f1c5b7e30077f8f6ede8769146ec0d5b641076cbe54d8d5a1abbb93fdab3ddee46082e7bade7b55f2b64bf3d764c02239ee36255c6f71455aa90e25bcc4680db550ec47cfbaea698f2555be180ccd749808cc83e3b37eaf11b2063297c045777f5eb9b5959211a8e4ac36ffdf1dbe3a3571ca270df5edfafcf0bf375ce6423ea301f4f90b7135df33a33abea600ff2787e783bd1a746ebe4325ab920af43d2aae36b908f1b5cd30a69d8619dd628e857371b05a143efeec910b740e0a3a6fd01bda7e7e3b1b13bd0a3efa676511587875e7bfc88343c8c38b2a7bd2eeb2eca7ccb7f783c6cf476a2cfc971191bc56ae3a5d1477f5b11ff1af4ed195c6e52464dfb43728b928e75daa2a45fdd5c94f4d9c14549b7badd21264e1b32e143daf4ca14f7d9687c5dff051a15fd87f5c256665b58780bae9a624ea786fa1ffca1fe226d6434d4f0d921645e42b69d7af041ca8b8a21f8f6f8dd45e92740e27bd80ebf3d6be943f3797fc4fec83dbc97d0b3a8bd280d258d7461a7e06b55e4de41f48ce7f2f5f7b61fb8429e2fdc2b976752bb3ad83b742d6b6b00ec013ce6ae4cf6c9989b8d8a8dba3aad7762a67ab432d73115ee799d44b445597eea54856fd153a3a25722fab86bfbe949e76684cb942953e62df8bb5914a708fb73a6b051d11f8dd29fc324e0eae9a301a6b8cff4e8a7c97dd41a159d47c03d7f0d71906dc74b70eb59f75b08777f2cbff748db44b63cb839c4ad9632647ebaef98bf6477fdc8b7f1a07a9be799e7eb99d97785c4679741b439ab70d3afe972e341f5d333a849ce6185f45b960b4180e5996fc7726bc3bcb565bc199c16272fdef2ba498841706894e5bdfd5cd48714aeceeae32d9f97cfc971d77ccbe546c4797ab63ba3354a7acde12d67cf6185bcb77c874e3db72c29e1ea583468c744197cf9c70033def2fee29f675ab278cb5b7ae6d16bf42745b887d2fe60e65daad187f81f65b7baacb33a9c22cf2d7f34286bb75c6e45326fb7a250e9a1f81e79143adc8e58de1146e16f879e95a6679bf9e516e6703b223da351de91e8fc7c4bfbbb4d8a53c4f2e7160d921406b50ff1c721428f0af1379d18c31564ab5379f5704ee7f7b474cae2027f3e9f6f4ee7b715e138b54861bf94ced2d9a222b5ed54171ee3172e677233f25c46286211c69819a3cf9b91e79625a547e9118d151a53647b8129def209c55bcfa316543eba9ca93133e33a3934db105ebd45abc69379851f7d69cd3a2954d4e81d145d7ac66d46584adf8a4497bedb155dc68b465a2defef79da4927c80e0af021099322a41c418185afe854ff66367ad3566668d7bca16da782a4c76b7a074db7bc9ea4376f46580bcb729e5ca3d8ea3623cf2585f0f17624f1caea2d0b9d1919fda4bba80a8f106dfce745a09151947e02847de8f44c2b147a65d068a367fac4f2a1095d16816f15118191e85ba850f9e7aaef8d88ca9fd4ba5ff34292d07b4bd2657f5b0f91c2c9afb2b8cf90ad43ab5ba859decf1dc76c761805f09b61f9e39be9fc16532ecf3d8d627f0ebbaa82734e27b23f5df5ecd3926c75cf65a77a8eafcbb3cbede7d12f9e7dbdf84b7e5d64ab532fa387bef3577b7e5e82939e31c34649efe6f7204988cb3c4e91c8fe9e69257af68eb71fcb33e668324b769696a7d57496168b8bb56ad429c7c95738f0a28512be7ce9570b31a2f0d942600a2eb2581427b994f1cf39c3343e62293ca5797438743e6228580a9e829fe02a6c85b13c746d1bd26fe39986726ee74b879db298391ae7edc7e41a58216fc3a103b1a9b7281b0e3d09ebb00bc486435f1da71aaef436bccec77c97c7da1d1b8e0579deac6ea68a74de245d8eaf8d07d510bff11a5dade1d2337ece21c73173a451f839dfb6219ccfecc686a7f8f1c029389cd364c7531a0569b49a8ea7304b99c2953c3a94e2a11459201670d5a99243c752e1140fdd7a5ee1150f7d2bcce2a1cf28c1d51dc346071b653977b35196732e69e51adb90fe1bba8db27084f82d8f025fba50a97d3bf25cd228fc16ad9cb3c76d087b10e7d36b6c448224c72f6297e6c9e1da8d0d76d9c1a31ea351d07574eda577a0674fbb40a7385aa5730e9d66231264e3439495e0ea8ef1d06d3a78d4db9020ce250d1ae287541a053d336956c70fabc8d3cb1baffed2865754950b568158dec906ad28ce2d48e2299dbae1d0339b68c1671349d6a96b2e8d829ea3eb2f7a0762f9cd6b8761286c745ca5e327a690488e036e43e25b94a524c1b1db703845f348a1e2463a740845a79ed4383c397468054ad1291c870eb174cac6613cc3a6bbe1a70efe4d772587cbeeca14f7c9e1abaff18c87dcdf50d955eda56756169db24911f13fd578852fe74b7f36b49ea856f3b609a3dc380ed9556bf5d05a7de1a58c31161a539eb03205165aba7c1133cfe8548e4e0a15f2e6c621174d4c79e9393db0dfd04a7bb0b0a8269959da8d8edbedc67bbab71f1bbfd1f5671207dd055273dc46d1e7e4f88d1ef86b3aa122a3b73c839b117649ab7f8ee7b84ddc8c5858340abaa415360afa0db5b26814749b6e3f6e8b0457ad2b1e3af4dd6cfc6d46d873688dc27fa3e3df42058a26aa60920bcbb34cbbd1edcfad0867b90db734c6b4de70a84d4764dfc66fbafdaca35623c7c78d888e975448c74bb7e9f89b44437ab81129955efa0dd7d888702fc46386f80b711829fdc6b38cb7a76bf4a379b2b3fca6ab5ce66fdcda88709997d26d78b60d91ce6eda8cf0dfe8f86f3a03bcb51139c04b2a74809736fbb821c98642e98f225f7a8d0defe92c3ac50f9ddfbaa253361cba8545a7d8a15b59746a6d74346eea20148db2d228e8335de59ff16c462363336666c548df15c21467c6e1c797cecb93e4ed40976e05a1a1b00a4be1ea86a9706e472e2ea0f8e7ecbcf5f084f86bd4f09eb73fd3ed7375bf78e8a4aec28da53c74adabda5758a59eb0ee89f575c3d49cafb0ca439f49a2b3d729bd72d68679e83f74ea39741f2ea0d33cd013c0c36a0a2c4e1f73be9ebee63c645ae747afdce7742ad2ca539e1dba11b58d9efd32ba698f2263eea8517037a610c6c85d3bec58c8fae60ef3dc653cc7b8fd70116f41e89635f721fb6eb221540103811e9d3b0819aa8081b04709692da29d3b58a513b260d711baecdf4e9b1cabaccc56a7c2a3879ef1122d8575d8325466e277c9d4fe6a8087feb0407d7d55827c7d55eaebf2d05f9576e8cfcbe381bd03fd74e2b82a33ccc30ac59cde189d470665f441bec2290f8fe0b6915821bd2d60bf0ec1df588b9b47cfc9f1de7e723ce36d4bf2b68ec6779bd1b74ef53431d653fbec5ea7994c9af734971b94c1e5b5777fcee521c0ed961c60f1d9770eab5821c6086ef32c9bd1789bcf37efe98c66fbd968687cce9e369968684c3426addb9f9a6fbef96e26cfb66e3e676ef3b7cd6d9bd3b74ddb369f5d555953db9f6eea367f3fd3b79fccb9ed67f39ce6612ca0cfe6e18c8c8c8cf0810eddd4a91c877eea14c92daf385c5e7d3cc4bcfa57f8d006adaab7e1b3ab715377c369b81b1b936b9d9a3e3b65e3d3b3d769dc366a9a16b0ffda8c7f9dc56ee2a0711cbe9dc2e11556a981eb6e5a8722ad9cd355fe1cafb11dc9fecd6c4474784edc8f737f3aacd2a9e8d3b9ed6796aa3c1a668038003ccb1eb5715357b937cde734269ae73426ef79269b2ee8c68bfe997298bacaf0df741b93dbbc87e3932607b57193f7345401eb40e3f3f9111b5afb6fdc69edc7a9b0cacfe78fde7886e36fbef71e8edff87bef864215d0ca8fe3383e29ce8dd3bc2a3bdef93e9e1dbe8f8787fff0e793d622cfa73f9f34366ed3cd54e14c7ef20aab3c8debe82abf0ee73622eeb3e434feaad8e06387d6f94cbe43f34ca48dc8f32093fbf6681c7a7b313da7d9f1e561f21d26da695c706e6eba7d9cae7ee0a767cb8dd34dcf368bdaa434febacabd8a68bae9991c3e31ddf42a9482a60bb2f1a27f38265a556ff2d7cd93d3387c8275784e5321145f4f269c9e86db91da6fe339dcc64f9ed1b8c9442bacf2271fea9f269f6f721a37996868d0741b37f9a9674c3e63a27508eed659b97a7a93ef9a7cb722363e4ddd848fd34de7ed48fce93736f4c12718c8c9737438bce7e9d041e151a34eded3581e4f7be99cee701d1e4e03ca677e38105a513bee1e048807d90142dd33a891a00a70f8694edf4eddcc49eb10bc9969015787e08cbf83063dc7e1d3ebc9b367e4f98e3bc571dff193b797c7d358de0e7400d08afa412b8a7314ad7e83f3a0f5e43b68e5a8775e02a0e33e68e56ea0fb7668701b683d4d3fbd9d1e5e03adf3b9296f073ae73710fe0e4779ed30bf4367aa7043f13baf43f177f8c971b8b611e93c6807adfcd37978b61dd1bef337658737fce9285a3bcc9fbcc79bf2d01bcb0e87dd741e3876380d8d6587ebd0caeda07528fef493535a270ec7b61f1c2fcaf7fa815d9e7d3b39bc9e7e3ab73c5de5edc0940e9f0e3785e3d3e7a6687cbab629934f7f5b0f38bca34331e37e4daa21f8f7b62211be17c9b679eaa90c1baf2da6cd88de613a75e3d1a10a5807fee8a48e1f1e756a3f7a4eb7bf9dd2e1d161a770684c1e235d0e5639794febe8984ca3a0e3748c46a3a0d3746dd428e8a6aea5340a7a57a9e1d077d23abf86e7e82a0ffd54e5ebc971baaa7a1ce7ed07c7b367f2cc447114b06f7222fb263af302cedfe4aa7f5de5ea3fddd4d5e9271c4ee33dad7a9a6e283e0e0a55c0404edef34e5d749c2e2792793cece5ed408773d6783bf594dddc78c6da4dc7efc58b171b32361eb71b2aa627e13e54d8649636b721d377854cbafb63fa8df3f673f33a7ee69eb397e7737a79d3bd3cf46b1b62721a67ee394db7fbe3b9a9dbfd216d66aa70363efd713636feb61f9b472b13ed4d3ebda6c6fa534dcdf39e3e75b5e8697cb79f77a3dbafe9b65137bca69bbe1bcd8daef27393cfeeb9a9e3290c643a4d57f969bcb79f47d74d4eb36f763dcf4443abea697c764ca551d3df0f0d15b2dee43dfd3a93eff663a2f152c75baea8c25bc933de7ea6eff653721b5de6b3db2775fba64e739a6ef3d8edd7e82af795c93cf499c6f2d0b9aefad757e5a1973a22fb1be97907bbd9a8c7584cc7689ddc73bb534f3f697352a8d82d5430e52d5a4f5f198b87fcb15bd8aa1f1d001d5c336610c2ac0baad29f173d43e930839ef5b348b1e7e559a6b9956534cb2ed7ba20ccda32cbba5cb35cbbb2cc7b7ac330b7b8cd35af25dfae9eb97cdbe845a16fa4adb90cf35ab232df9cb4d1aa6597e5edd8352d5a9f4b2d93a0832e927647cfba75b0d241151d4cf900fc6ec9324677fbd6be45dfb6dea2e5fd7e8bdb10d55bf0ebd2e7727d5bdfe4b6be49ef79b2fd7541f0bd64df3697f2bda38d0abd67ae9bafef16b7edf46246eb506f9a47af4df22d48d2ca59bf924be7e47449a2439797343af43ea3d1b16bd269d2b6b6b05831c5d7f0bbc58a1d8c7936c1ef161d84f9ac343b559fe3b4ef5bbe9ef93a73d3b34c52927357b9670cc318938e415217542f8f5ef4922fc730f812f6bca3fe4885de57e6ceaaf067a657a6f2cd4cb8f42c2b394622612412e63d0fabd24b5dd0e6fbdcbde748b4aa9ee41877153e4b2f615ea2fbb84a12157a4ff29ee6ba5af441ec9bef766473cc7bdabde4b5867343cfe231459257e99c9bbaed1d8eca195af7cb4fe7a2733474a89f4437af35e8503f4649ce71b496e8503f9324e6d037a975b03ba23d46eb35a98916792e990906626a14476acd208b962c507c5682ed43fdcc5d0eb03cea774b0e8cb250f91ebf5baa0836a72c59b264c952636464646464f4ed377470308d21d3463d8557930bd7e5e465b55aad56aba3a3a3a3a3a317264b5bc992254b962c8da5b33416bdba3166cc9831636cac56abd5ca74747474744453234b962c59b264f9f6991a0640b3e22eec250c1fad56abd5eae8e8e8e8e8e8851943a68d7a4a1f7595196eb55aad56a5a3a3a3a323d20bf3c2bc302fcc0bb30149d5e0a35985ad60c99264b55aad56aba3d5d1d1d1d11173e12eec258c986d0cd556abd56a951d1d1d1d1d1d7d3b26009e99242b66c9b0111c3366c547abd56ac555d80a63e12c8c0576ad56abd56af5ed3395031764e6c0ad4e5ce098970485723f9d386e8ae1c69c968c1bf194c99d7cc231161c23e19808c74038e6c13139680c068e00a56f8f56de4e4545af7ecd1cbe7ddfaebc2e17afdba57da395c713bbbc9d768dd65927462b37693d495a3dd2ea9056d43f5a515fa395df3e76a14200d29c1c773ab957d4776fbf543821dbaf673a68dda553367e3dbb48d1173e69943191311e841042ee1632c320dbc74385742aa0cbeec95b5491e8c3f5cf033bcf792b72f5f6c3142a8472f8a0a1f7d151aff2b15c766b75522c4f820aa11c7ee875b263bea1aa5ef5d27bde5b9fee64578b7a3342134991b23ff888208c2f76bc3f221551faa1cb08e9d2d8308a6c75aa75f4ed99849af6ad69dd3ca8de696fcfdedb7e508d6a29df637efcf8794fa3fed12a3dcee8a35393f69be249f1a0d8bcbe27485e1f957f5ef2faa4fcf346a3795e982643db2b9397259b9d0f1d26b8e95507d5a87e615e89d649a295db683d69b4baf48c56549030df64bec22a37fea20f4b2f31c56ff4de975252262fcbbfaee20a14fc8bef39a48f3679597e1bd5d3cb5cb847b751d6d1ef0e1589e518ceed8f757642b4acfdf12c8bc2f7203f0ec6c752c6f8de7b48ab073e760e4dc841fb48f70a19c4e2d9a79867b75e956797cde5d9233b642ccffed87bbbbb77773de3666fee5eb7aac8fa7472d7119bbee70ddfb4de7b4df9bdf71ea4efbdf7da3242865dbbbb6bb58c70777777775dc7fc7e5ebbbbe7dbe1eeeeee7e2c23715b52c82e14b413efbdf776b7bdebf6c7ca084d269a1cb8e1cbe1f7bdf75e905ff6c29bf5e4f71e86f990d68307e17b5a1af27befc517e394c82088624418e9ee0f0c05199301b3fcfaba2557bf1ee1fa2383c9a80fb3ec8f1dbcf7de7befbdf75eef73a207f3681ac0d0813b22959de553c79503c391e56838db0dc9a674e26a666ed4984ba399341bda0dad463b69361a69d3b06b5a32c2d773f69813458abe29cba7b4501fe9bcc690b9eb881c5782d37af0f5b64308e5f7eeeeb64308217c43bc7c77aac7130c6fcafe80fd04c7bed2b3b7373ec246c986103adc88d47ca4fdc0c83a05dbdddddde5d7dbcaaf5b637e5daec775b8feba53d0dddd1709a74885f2dda551ebd695ac7b3705e1ebd5217a95524a19af48bf323ddb3ee2a0d08533bdcd8736f2999eed16f7f15c74caf499de525e995ea55b9ec96e364aca6bdf4e11ffa25b746631c6a0a1fe47a3bcbff281e934df9b0fd0c888371fd8c8c867fa6e3eecca67d27d64801042c9a79343f828f7b0f441d01f7c938777675a2fc58b5a8f10f6a3dd04cfd9a9f50c76b35116097aa410c2267677d7fa47fb096ee620cb98fbe94216980bdc36aa490b82aeaa4cbef71e6f44c068e9c84509c87c017eb9a0d2844cdb324c2302468b962ef2492702868bec8880e922b97c418980e9a275aaeaf8f6e7cfe7dc7e5e4af5dba9e5d171de0227bdddda84b621fd289bc1496a6a543b6f5ca3ba8b16305980c9024c1660be4081d1d23c0e6605e60b305dc07059659105182c1ccc0a8c8e15b26f91b1d2620629dc77a9aaccb220941b1130583a85e50a2260a6b03a2260aea0c259be5bc04cf1bb112102c6a244c05c31a147ee2d2260ac0d6a8163df2b1e1630568e940163058c153059c060012305982c60ae0033051829c0580163050c140f8c1460acbcb845b63ab566cc3fce02075d7ab63c46efbc46c98ec7801adc86b4d350fe52f9e7a49589ccf2d0e5171e030b1c7c5ea0f7f4cd4c154e56f135bcce136c437262c761f6c7f38c1b46a9dddce0748cc515cef276b270d978d5a8d5d4588c0d63793bcf49db15b6f2769e67d7a59dfeb915bbd35b13bbc141c155b854c96cfc73d31833db4fa4a62e5e70fc44a39ecf6c7c74a4692c66d3f80a5628695c054e638edb7e66b4340a0a5c9d592d4d3f520d7ad3d14ce99f9356a4554d98b7f3bcd4a8d2ccaa26cce3317589b4268ca9cbd1cc36e4f43556ca98d1980a35349e02c761384d7b16f3786ec6bc29385d1143bc1d3063fe798d959a2e2bc49491325246ca481929e34c477cd3f194b7f36c363662231b37b4d865afc4d7d08c7ee6a8515120ad6aaeeb023f780922491826389b1062fe797643e332a60f395b039e199615e70e39cc2e013d2b1e1af51cc7a6801b299fa5b042261a2b64ff398f39a3339cae888ae85be356741bbf11bde6e4996bcc9dfc06adf0ad99232efabe69b9e838361e5438ddfa98726c4522d569548ecdb9dc7441decef31c1baa51cf736c46de4fd334e5d87eaccc46632970a62e9dbad19833798c1e8bc8b7e8ee8fc86d0cc359dba8da643e7a45bd89c3ac10f8cf6574cae4cf590c9bd1a9e9cfe10a8e592136fe329f93e332afa7e77c33af9ecabca29eebf233bedb101b1f698d952870dba81b1e777fdc308dd199bc34ca444d5d4c5d3486028739cef653e31c6685e4fc1bc36158cce3c1f167eab23d5397cdf7f198babc9de79bdf74f3ed3cdfedcabe9de73dfddcd4e5f15061e3cf4d5e3a75c39f9bbe74eae4cf4d611ecfcd8d8e3f470c016f45e28dcee6b3a7dde84e5f8313b51bdd8db751aa42379db53b96e3307d36b51b1dcd679776a3abf119a6dde8669efb4cd36e74a5cf48a4cf48da8d6efbaca4dde8b4cf38ed46977d36a3dde8b0cf68b49b6e7d6e74d76734da8d6e5a9fd9d06e74f2b31bda8d2e7e56a3dde8e06727ed46f73eb3d16e74fdd90d363837a41b6e7de046274d2e4db482c0a6eb45596eb315816fc3b39b854d32dde86eba88f787e536db8f0dcfa05693f337dd8c96de797eb3fd9ce8ccaa51cf67709a374292c96bbafd1b1dceaf8d68519ceef4769edbd87e26dd8dc170cbe1c8a1c5ae73b00e2d76399ff9ae55ad3775d99de7357c97e7c62fdf4d459f593d9e1b4a5af5cef3475aadbe70ec190d5dcd0d1b9d89a6eba2c34e4d13ddedc7a2e9f6e113feca612a8ff9e75c57a1967f5e22adfe39696645e69f6b5d3591f16f8cafa62ed5f4e59f5753979ff6b819998d1a83bdf017d8a94921cb2c46d84a172cf3778b14a7481399e56bc6d4f40e26a484b2e34541192184d28256c7fb0346296374d94060e680b00db106b963a12637a107766910c5edae36fd840ac2e998a951038769bb2c171c3d4d4079901c4e3574e498711df00925dae9f8e0fcc44f78efedf0eb42693a281596f5b265bde4e8441b50fbde7b2fcb9cc0b13fed7a3fe1f0226c420e3be01004c5fd68200ac8a1093914c0049c59a9c2476f671f90afefbdb70400fc8fd389e3d699d6e746747c50651febbc3f6c8835c81d4b8c23d414a3077679e181694c060d99ced7dd5d8d3b5999be63d3580ba74527a751d3a227c7c2a19ec3e79757089f437f1e04af0e36aa2b693c06744e6325e89899536a6091830604518c5803878926c78463437befbd77a346e32544104431e2e9c606e7066777352e71f58b43d3a2183438b41a3a72ccb88e2a9c6bcf797f30a1443bf82eafefbd775579129dc24ce0d86b3cda76680c8665d5f9a8a6a3f11268e0715d3d50d7b5e39ca6699aa6699ab4818815b6eaa286255c57b441e3254410443122843e345ec25a614dcb01bb3c18608cc1b147d45b2e75fc734cd3eb75f9e5ec4157cfb398a05e844f099a0621fc81906611aff8754d8b5092708ac809c42cbf1eb1fc03c00f2000080282284604a2bdf7820001c00f1f36d4b083eac183069d1db4731d397004d9a10cd9e27cdddd7d37bb6d33e1096a5bf3757757c61b96b4f1de9abeeeee4e8dc1e0b7faf5ecd21eb03e0f8bb7b3ded38c049a4bca1a1936a3651ab462e5b94de34aa48d9b12cbc37222913459a5ca6f12365845e35ef6f5bdf766b4c5beeeeed6b868b4375f66d21e8cd6af363b551dfafa73f6200806f734de1febf26b3e20b990371e7cd1eb7bef452b1e6b34eec2b1bf855e77778f7efd4108213c65efc606e7945383e3468ef9782c6f1b3a4c4ed3d5a0333b389d120d241e5b0f0d95ed60355c364c1fd60f09800804067937740004704382be6f87c3e0e09f706efabb7d6c8e169dc3e0f8eb7c9c22f09ff73f5a811ed275303876f86257b95fd8d5f937368d73c39be568bb2dad445d7eb3fc734602c7fe98bc2cbf8eb3fdacb316aee9ebe0ebe673ce72706e6c4e35376c98686acc7025d2a665d8352d19e16bde1c12b7b325db4d41f85a876efea027fc4266a7b2d26e6abdb6c3ef0f6a6f5adb3b1f1c7fd3d94646abefc79d46f638c8714f43de5f91a7c723a90f1f0ff90baefaf87e3cb2eb77048ea111b8ba5f3c0f9daa7b04232b649f737a873d6e3f8f9ebce0b41d9e7d72696e55bd03f3b011fb763e82e090a9b0ac972debe59f2f6c2256d8aa0b6cf5cff9bd0f7491597e9db9582632cb3b6be1aa8f67afa77fceddee831d87489fc4870e2993b7c58b31e8366ab78b2441a7d6df7b1da3bf17a1f6ba99c3f0f66b66e676e6addfa33846fed121fe5e31d1c9c1c20b65e8408c2f27fe399c568ece43bfe44a3bad781006c93d9a63caf1d51526e06123232323247c9e6bcdb33ecf4d9d823cab03e90a9ab0ee74f3abc50ebcf0f277e5c594af26bf1acac089962084318223231c6481c51463a5e16c91022a7cc10b0eccb89203ec4a81184a90b8488219208410729ca9e6978b3088f034bf5c2441cc576ef6e0e62beacbe4c08cd50a9eb082177cd1aa34b1650b13b6e003246aba60940614be408229946153322289218cf185208c410aa0ad42192e300186195ad0041931982723566c61852a541153c505a55f2e9460c4c35f2e9450e58a474b5a51e6e19440075654c10531c0410fac40026705185ab3802838b1658a1198710422c8282e6082162464e942145fd4a007172be862c78d4d021558c620410bac488117cb850faec000092b3001136058d1024dcb15baccd828410c9ea045155b5c49e30811729ce9c6efca0a295f3929a508608821ed200ca501fcae76b0fa1dbf5caca00bd4b3c3e79e7dd927fb693720644cb853a3d84f379ab0c208a898c10a246cc1c7341f8fea8a323441cb1434c68411069ff5dd00271fc718638cac0557a1ece6ce2f175e7cf9fee5c2084e7c855c0db2183ba19f752984046bc0477f1dd308bdb2ec88f037aa28fe6d14fe5128aa7ffea8021ad5acfa0434aabd9404aebdae966fbfc119cff0f9c2477186ac7f4fefa2d66317bbfd6cd747ac3fbc9e411ab4fef615215b1edcae3edb1d6ebbb84119289a2e6ed06c04d7ce7013d0a977844f5d2ea646b113ae700505553cb1040ec0f8ecacf1524a8b064e206305093265baf8487aa25ca358e7dfd71c7098410bc400450c840003323e95fba745129870c59632c4e08a18f8ece3712a44410331541063822d7cb6caa953dc3f7716fcf3f978381e2c21082b29539820069f5dcddf4ecde7e6771185a319e409f97220010b4f500205475d84d9c1d10b76945454dc400657aa08430f6460031f28fd514e762793f4ca99f6edc088528c333a3f1e0e9ef1707b08218410728d628ee34cdbaf962c5cf095835ac8ea7a61a3d5e3f2ebcb3a6048fc7a0372783cd0677d0dc02487f9be480d29bc7082490e63747103297ebbb0819500fc7681850bcf53a8f867adf198b77c42ed75d2af2e12990ff90a8efdeab8e565c4523ab590d6a1975d1d9112381c0e83c3657cbff4ba68bce58db2780a532989c145b7ea7c31cf53de72a24e5d6e391b49f1b1aecb79fbb9e872de3d5a87f8c7b52f7c9d656a94d6284b0c6e7a9d6f5996ff70814e41b73c09ebc0fc9633198208ae7fbbc062c6433fbdc565b06b96d71d56be63fcca1c12d03cd367b79cc0cacffc6e39cac14a0758c8a04b3a3bae510cbd4e22d1d43b3c3459e4800aab2e53a488f1a9a77f5c8841836bcb1329f847fae7a8c7037d9e07e11e8f019eb08230b468e2085e90e1f3686592c33fcec2ed5713cff4615f93e9d43bec5c05b72f805f2d4198f233bf2b1d78f96a7a4d28fd76e10589968d8512f4756bfb617e653c289b27778cb1351863f482352d0bc3ac69f9e218c3b2e69cd3b2ae3931ec9a976559d69cd31a018431769bcd3c9c1a47865e7007e1e6cc6954f4a1cdbce6a793c699622c0321b4bcea98208411426959324a08218c313a9441b63cb8e8cbd2e5ee9bb940a3a6579d977eb9e9d4a9e8323a8c5107e56377e972eff9ecd6b22c6b3f6ecc79392debbaa6354d2f99eb94e5193b079157c85667b6a5592c9d0631c569cb2f8f7e5153a32677ccf3baae6b4e2ccbb00b9b73ceebba260d72b983e666292dd4b3945246eed81db9de89969cd39216e43e76c3ee96318af9f235fcaeb26439238b952ace786b83efbd39e6f53216205708219bf1cc0c9fef7b1032f36ec7d8af9737099625e56a814f0c583e83ddcfebebf2e519211a85798550335dd7c58f75dd0d61774308df9bdd3de17cb28bdde428864bc6fd4bcad9a898c3cdec437f754a79f19cd725a5b4649731775dd6b46454410cd370938f3733c827a5554ddf2ba594b223ec1804f9e4f3dde816bda755b25bb8c3fb7b4fc618a3cba8c48957aa53450d828e29433334234d4002b3154030381c148dc643822869ba0314800f91ae504e9c0d83499005218aa220a40c22c01000080043008c6ab609820f066add6b28cdba8be815ccd6ef959445d8275b5675c6028a89310e3187c708fec4e9fcf41329bee07292d3cdaadde2d9374cc5dcf7a38c7d7866582d164be8a3ccaceb16933e07dcf0c0f05b25b3e402071cb4a9c865cc7288332ab02f3ded698b52a29f4cf0d5426bb72e9116dacd56db726d3ef9e03a72af78f332d53b06f467e2b10d833e47f46a46ba125c7294bc65d43b366826e8fd93419471641a8375920710811a40bb2547cc717496a9fe31a06c7ac640308cabac71fbaa2c697945c692243651ba1f3cafc62cfac7c005fc755b2bf24b9d0b9c8443b922c20a61cfbf3e3a951dbbd99457c7f4d9ba16ac063087f2f9803e95d49845ccbb52a720c9d48379af070bf409ae4e6699ea1b073437c185ba977c82f8950ca72b424916ae4e0281577f682c1a4e9321fc6280650385d4cbed5b909123197496617bb621f428ee7d37e923877f5142edde47cd244f624f161fc9d1a24ffdc256d0da0cb9c1a30381967e9c78f289d34243d400b95972ccae37df9a6033c82a486b0ed8b3e29c8727b971a6218c10bfee18403799c643e8e15a403e607f0a4a663020a1ff38a170c4ee856056525abf4c0d68df71474607613e5f7bf551208a3a0cd6cf98ca670b2d9d3ecf01a749ac18c18adbc4efc458d7f9d3555bb3566934600805ebf344da292a09de69e4e5f0056219eb1d071aa66e1c84068eeb2c41064f8edca07b050e5cdc39aee4aed6656c6e955b19828058f46572c5cf70188ce5efa809c2a9bc777715f6d1fd0fad03f0591d1a433e169e989266ba71548033ea9c2442c9948c5de82c8c460001cd1319c19ffb33124e104a67989f3131c4c2995928a2e4da23e38413bff541292596b924fb169c4368d4aaebf2812af053329162a13196dd00cfa9f3400fdaee9d48d6c3877625a8a74b8ca58ac4597816ff248ac3586d47cd07152f8ab695a1724cc3d3ef605b08a5fd00fca21ec823a0cfbb38cfd93228fac2e02af2d3dd760c08f5d628c5873c26b43b49ca192e8e7387239f43d633ea8a23f3baa2a46e6c01fffca4923f54e33c63782fd79b57ba7c69d6df8ee34c276c9215d881e811b40109262b81b57efa011f31e80ac18627913beef70daf0998e85351b9b6c2d26026a04df52b25d516a1c390c8ddaf99d19102a0782823b5fa3413f8169309ee79d425a71d63f1599027b5868b7f17c3e6286eaeaac60148ca4e27831a08dbddd3d7a4a811b91d4c0b4fb9a0a07a5e9ab2a2bfa623a26ea107cc8eaca6893b32232ba8189fc19501d4103a3d9a31e187965c20cf7624c71742c221a02dc82beedfd015f5cc5d4c22f8887a944cca0ead74ae680aad7eb53975b193c74e011e2e56508fb6092587225f9c9d8e669c163988a38b30b8ca32e7f99450b642196071ab88a03cbd05395c213e6c214cc2011c2a02b7dfe580488995cbb7514a21e66ce54f1f601874225c5bbd778ca0654c2a42e30f89314880ad841694fd0e98d69c66a1ad5542b05fa265cf16dfa318bf20e653f9e776e68fd7f46f9ff7d13fb7b138c4d9e1d63004212d235f4fa6d71cf47884f48eeacac798d31cbd298f471241e191a90ec727d0ef5ec34657df515d7323cc2bd6742004bacfc9b9dafd08a0bbf46af3d27f4ffe6568267859233f51e7cebd567f4072dcb8219239cd975e4430ee8704c509830ef51c541a87a0f21b25fd080a2d3ef6d2f187aeaa382b05a398162da094f99d169ed00b832c2a9c3221b4fccaf993972bcb4ad3f791822f868a2f9bea16659017c01dde70e53e63156390b7c96345c01bf0190b1468784275593db2ca286f4f27a4380b51278502a33727768873b8714b28a5a205828e6a8e81ba474b224e6a7fe99349bf39635e6dd765b2d43f9047380755b0f42f1e38eb5bbd171a706716534890796165ed6f15927b3c9fd42866e8e9547d52cb94fe5d2be17e49a4577429a38387f6fb90414b6943942cfffaf3f5160e37d111c55303f2b6c5206b72b2b4fe9d9e996d1ce75b9ec8835e56cda0a06c80d0e0df0486e535b32c6d2cf541398b511b87eea58cd2bec28045592e0d128f53b920316992d6d11ede5d219068348beeecf9638444c30e4653dd217e621a71b74c14217cf7d8a8ac9bdecfc1364b0241674e93fe628b62f478b9ac6604e8991b93540511bcd2cb800da0661acc9f07154cc8ac62fa5224cdad5f443558682886f4f4c672ad29736de832ca1f672dc3b4cd471133b9d316ad7f76fa093d5f35ee263825139345063d6ef1b233f8f86337a9e89fc32c4ce24fe844627560a3463c40f284de989ec6ddc8dcb507cccf5549846fe6db98d06c84946cbf9a12f49d14a050b4ff88af29a72fdd730fc795efeef169ddfc6c1d664f20d86d5ee71d946c9771680dbe230241ed71c888befb370e68926454941218994ec2bed35ea670c8f6f3f6f402baf79030715b51073b0ad0f84e315ac9bacbc6d23d248b0a192c1f47f1a92fe9724a13f0ed9427f1b9d20255ee203f7afc2fec3160e655ac8a4a494970b60d1efdb3239f4077026ffec798be36ca2d5493ca20a4b518cc3b7007e849fe6c23468ab312055e4ace0a75e4e0f29bb268d2da42723296c56bc48e58001ce177221403f923da65bf0a862b553c7e6258236a1e1d51e2484ae68ff411a26a45239f49c750b91ce3e98c3c9751467318b29b01cffd8c48dc34a7354dfc5ec89d18b089c6fee4be38372882081b70f6b1325ca646c010b6cf0e307f7431dbfdb867ffa3f689879e0bcb523f74d44c01f1a42e03c06aa147d95b62a4b2096311d05e63319d4bb6bc126153807ba11d69adcad6e132df9343a36fe8bdc644dc12b6c008a1e740733daeaee7dcfc4ce2dbe250f52a02ba1d05c1401573d8ae9a0516d58267fc681301613340dc2c4e8acbad3b8d6a9f12ed92e1d93b5e04e9cc4ba0450d512f3fb4d558427599fe3f41d7005c4946cf6210a0949fd9b6ffe01a4c7dad4a15b4b99cb21230b0fab502af39792500eaef5eda1712119c7bf5b80f47d75fa0048628a79d64bdb10b8cee4d1fb67d2aa35fed7fc699405498c563d5ff695ef6f0afb1b870f7d2ced0894d1a2c2a5a66e529f49e0aa4161caae69cd55500cd320230f348e2bb53c175a6570534630464e621c5e2a2cef4c8a4ee47f28946256778c7e4843b4edef0fce40f6fa33ce0de9407874bdf8f3965df647be07706a4e59b4edb104c001eaeb481fb9115c15123a4e085fa30b841c21bdc47ac0f1eb5a1083794c3844b22a91fa8f652f40150157ae76744bcda58788e9a209400dbb9c5511c1c9aee9285a6c7673df7c33121c5aa06bd18021351080211592102dc23c33f24c3f2eefe10828a3ae6f565f6f983f1fae6274c6a59c5df295289308adae83927a66623c8b4985bdf9ecaeb2ec693c7a6ec9efaeb5c7bc8a6890b3ad164489709fdbd9b12e1c40005a112a983785ee5b2bf83c09ea4e902c96c8e308a9a966665381f135202f8683125a84b04951055be4b8b818438445eb7a20e8215302bd198c69fc6668481187aed83ee496fa7f662f19368a9728d8191a6e1c437df07691c0a3a4298e8ea7e625a754fcb9031a3ab5cb0c4f76f74797b292aabdc0e2c797f9ea5515ad8c2b42ea3dc8fe1c258d1d15292fd9ad7a12d62181d8796f8f2fd3995603fba961dce3069dfd6e621128e050ec15a3cb401a7b7ca16fa632bfc5b59d243c874a7a491792013410a596de384c30fa599511a8f94c8a450ab1b0542a0f3701811cdaa1365cb1939634b34ab09f4aeb46285a4aea091f7dc03dd07bc2579012e0ad743b8211d2435aee5e7277317cdd4f5fdd1f18d3f31259b5dc4135eedd895e924e910e622cfd7afcac13b03d9ba40319ba453c9d5296fe62b99b187b730acb7481b15b32bb241c73e65b420bccc95606cc32cb9a11384ec589218a16145d97f6d13b61e18b670633945d258ab6134cd006ae598cb2e445135a2dde37e8fdccd93d39fc9c09fad3a36bc36445efab63dd65f481f0858328c3fd602f30ec43ad1e386746d3b6edeb3e2c87bd5d1841b4e07b4453f6992ba6422dc885eeb8dd90c6442086298f26bc8b4ed290b80dffa53ae2054c33552b6b7cb6a5f82a4378939f524948ef9b2f5c9bce724dd88a50d70de61438d3e65081d210fd24b1ae92e03381c338e5ff5d2a9bf839beef034f0fc0a41519cdcc8900295fde4471a94752cb998e619bab7737c8172f5598c941ab8129d38979c88e06f6e851f0ad438d8572c5475434513fdcdd99f8e0849f472d51aa20259ecd64a45125d4b37781456152dea2c174d760981c470587e76a0be59063e405ed73b6722ec9961c7a6266bf125641b8f96e35157834e593a5e4e457f50efbaea4c767079e883080694e2f79432867558caee3ae685b14c011bf2f59f9d43d0cb1ef0c4245ef26c8b90fd69a9c78094398283e9fd220bf8a16d76b96466a63a9d4d3f92ddf0601dc24f775078331fc3669d64adf6849b6a253be66563365e4b5ae2612a9a5c77ea24e51aec80f0da1ccaee81aa820921376ed90871ea1bd80ac69232bf461b4800b8a0c42f1445e9c06e613242647456fdc3cd2141283ad6624e9da6739b3febb6a26a5b7284c3c7bc5a84c73ac12a7045eedf91c608783236845c6d68bc510c2e986871fc9fd21a3a579d759b39b1d002030fd6ab799a3e5955dc6c5291767a4900d18709b98e9a569712ea4a2e69143b7725041c0e0157a16ad269edd06a406176c19068d8201900387bb4bd8c89b152bfa3d47eaf8374f1a46a36f650705453e46e4a32c20e04e7fc090a4fcc8d3823acb539f943cf4dead779b25cdb8e16a2be4929bf18c6393219c952090dba2d6c35b87149312a54d9949e0cbd023e105d57683aabb62337351a70f572e3cca716fbb40fe7b05876332ce8236b30a49ff073c21524f05adb89e42a7a1fc471de3a0ef6aa80e94a0e58958c0dfab688361b43aa3490413d4cbe2cd874495811ecf0b8c3acc345a714d51f92a73fc8507babd77eb80dc1fb9b4d840a950feb6e6a61796dc666090eac2bcf771b3e4ed25b7e88ce254aca73813c60920589cb74b91722e0ed7170c0b28b27c505c4b4f8f2f52c5858fcd5dbd4e6b3f61543076edfcb3c72e2a7f1fd05c853acb16a3b83485f8cde6cb36415001446a6546480731ae6ca314526c0804c6276b0ec842965636854f4344e80d2207bcbce18a00142020057a27057258bfc5170cc5f094a15968531098f232e1d9a90ea2c6453bda88b91218e2abd10722c1350ca188624197041877106dcd46bc86ae305b995943e931006483a1e02a204585cc6746a480ca2d2e5b2950952e4264276cd24a02c618bb9b53e2bf6c7ac5327bd03fc6186e4712313cce77db5df66c821730555591339e12ca949ea0a3b88a16b6cc534d3f913323a07dd2b87a47695e6b56d1675d78561d99913a951bd5da9b6ae54a532cc2f8cc3e59de18f4684b907d00f23606789ad30014c1bcf13022726c9cc8f902a73758795214a973c23e956df5009eaa339d580e691902ce0a522f92b8721bc093f5514a071413f4faa5da03f42b6edde89b68891a646f9634f2f92040b0e51d01995b78273925683ced5bb47051437b03f6a224eb8c644deb42a50924545de7ca06e7ec980432ae0b9f5edcad6fd7948477f0389af4890a67fddaa7d1bf4cba3f5ad2063e4047491852c60ee626cfb6eb0ab206b1db520023cbabbc2c902d9016c574e6fdf340a22bc0152c43e4d17c974dfaacbc6ea7427ba24a2c80953b1ff77b260c1648c6bd06491f0afec7ee945c6f6bfceb8af2aff7fc5ad5c2f696bdfb7955435777b1eaf5a32fae51d0e60bbc89123fb5a7ddb6ea825331b27aa83f7025a26751c21deb585beeee49d369afc141fbaaa4e3539430473aef7f555a2b18c7d4090d9b4373e73a1f6d3a867c35679f6e129ad0453ee71e25381f937b53d8c43cf5afd77dfe05e80e87805b2042a2ac04f518997cdc54412af888dc274e16b27d3c3eec54e0e7591e38550f8efeda758103a994ff3eda27ee57c8c27d26549e55c64b1a243ae44f6a94f5e0773a4c46c8971d0b8ee0449795cab0eb4f2274b145f3ce3cecd8a0e99dc4672743a1b324c744d3e67ea67b3717a4082b665f47e70a91ebdc14b46ff031ef39f8b1ee705488ca3acd1e3ab7c863c33d16b53864f539265a4eae865b312c0cbebde885e0602bc2bb0f3c1a4a35c023d4c1953af230db47c528052c70653ba01aff0e66ee6e478698157181bf0726016e9e3a039b0541f1aa5b734259f333e8109feffb2f3873f3d091b3c0d2bbb89df7e0ac886e0024ba40a063640bf6247025d83f708728a6259eb4577f9f9e838dac3b3817de87865d58fde73fd73a144851ec7977fcdf3e8c58f2d4ae00ca4fd0ff4e7880f6e48b1a70afe7aa21708f805d07b5fceffcd9f5bccedaa3b7081495b00a0bb5b48677b20430bf5982cd780a11313716bbf69a9db63f560dc97cfe60dace7794373cf75c9d1e46d7d87216b1ce28a53fb850a9b527663e3587290c2f63c1331798d697712ce04c04020ba94e78fec53e03315438b1c364725cae7c5def7d26c23092c8799695b14c584b42b8a0e8045aabebe4c5f5d375f0b51dfeb7f69968e345bc126a03ed056bc23e419f70192a1084ff74a55191e6ebeb40a5393adfb734a350fd54c21e3ddd95cab096973f091c4b33247f2e62ffd7d1d607197b89cc375b0b73de76493e8fc57d5793842ab9dbb68fe6cd505be10fe0e9f43bad2362c305c550484ff73a1353e4ccd35d7ed295d137370ab123cf3a259ff74bbcc1d9e372eafb27ff0099fb0717fe4683b78ba51e0ed6a66875d789183870ec5c3b1662d3c1a66cac50ec25c3cad1443082c3addf32a3aaa9fc4753237914075b17bc31afc28cbe90eaf2781710f1b1f6fa0f4a0076f8c35f9b2ef007030a37a1fdcb907a60612710f53d7f45ad3c1aabc3f939d5d88c31c131d26d4a1cc724d231b8b87b3f1f962c685ba4dcb008410285efa1926de0583628722a3f4039885467dc8810424104ab9ddfc2d24c88f6e1386d37858c3c106572e71b82b69cd9b9bef17084c7e9bb617359e300e1e784800560c8445c140177830f12be2356630d025d50818c47f62dfc553c4fa857b05c544782c01b91d839dc985bd2d0894e74065ac606eed06b86943a5702b1a86b5bb350013df3e224deed381b2c70934d7dcc5cc25edc52545b2c1c44460634dabbe5a7ef369c45c074be0b307d2bcc536a12b880b7d5929bd7069327a8c9db8b7efd17ebe5d425872631a041cdb07e5da2a5918a48079d8b5949e661c42cd0bd984bfbda7308457f45f8d051820211ae5a8b94644910a6d1fcfd79c0500bae1c2f6a71c653817bad82c53f18292c7e17bdb48464cd645332c24407a627cc9732bc7c48c4f71d38c71e9171135210c4f32b5814b9495164992ae13a3f33b5d94b8e562a6d24f604321d287edaf8fa3abf6b5dc1eb32acb845ceeefe731e04d1203b68801dd6ea1d881c314af6dfa10568a5c0543df037cd5a4bcee39b9ac54d7ef6b703d04b637c1e31c13958bde453a734a5a9eb689325a35944152a964de386e2041c365e72f536a3c032339cf558277f3d1c874663a7ca908942f342147afaa43e7749cdb1dfb87630ad65c4daf7fc57ce091375a1a8bd4c717d9eaeb64bb7356ee2cd3edec0a7c2aeb9e13f0a183eaca3afb90f4b9ac6a8bc3ff06a11d6250003e8759ef50ff9279e293a8509d3b7c87f7f91358a39d8d77a74bae68d63eb85d34dde707fb2e221add5d9db68aa2780b977b83c2fae8fbc6da5b562d4fb56298ebab32099bfdeb28784b2e89605f0b60070e372d13656a5d04f86de8776e7ae4aab0e4ef7e2555a02613dd7b82eeee68fa05099aaa37f380e91ef7817837de077cfb3668377172ae4cf19502f19dd9294c67eb3dbcb1a3868dbcd61acb11ffa584615a5a218fabd152acc8931f685e6b2f660c7d8f5b24d3abb9950c975b0a878bb95c25785b79a087bbbd8655ce0119b9f8f0fd94243772cdb13943eb36eaa1535e74eb77b0cce0ea7e5f05a96c212719cb945233a552a68df1e3aca0fb5e9e334de3e081359148e6c78216eb549b208a7c161e782e2731b55986cbc640b2cdebb21aaa85683d73b9703424f5ce80a4c9b1befb96197a07a6874c312822936481592a66077c150b76000b24fac99251b4fc072233414053a2d87a96fc16bfd281ce0a8b1bc86254fb53ccd50c12c04a4fff99961fae7e647bcfa4ed76b4fcdf914617d8feb0fda84c95a3435905bbdde9b0ba71160bbb95a57b942d799223fbf2a05239c68be8050fa514f285e71470b1d0e92600f80cf780477d7482cc7ba4b4416a93c026cd06926d345b4836916c90d9a0b245678bca06992d920d349b4836d06ca18d09f21dc6832175053ea43247a95afaf2f6739bf9df32e249ea6e2d58c3a631df0f5d7db2f34a38c99920b3fa39b8f907c4b9c537356053554cc6c60dc965c1953352373dc75e385169f9a62a3341bb2f4ca183061770b8abc581c2cd6781404429cb3f2ed64b1af327699f9814e14e6323eae1a64109235b2b058f2e19b65be3f09d475d4ae5945179e37b89693df2b9897b70052323145e158f4b8e23804910436b7e3b0d545d233c6dbc98c1f1d411354b409972aefc184803e442d89479ceea67ccc568297031f41441bb97ea5691dcff490fe35449920afc14a3833769cb24e3ed292ae4e266b9744aebc552dfac971c3d985b205e12d0e9bb4a35afd2c46c8790de9a34a1451f07a553244bc286e222bae82f7e2d064408b3aee853f54a45c056d68fa5e132fdf96448f687e5aba5e9543fed3ddd680fee02eeac3a2d721b5e3836bb742b0bc72eb9ac6f5583bdc08599452704cd6fe630a4a46edaaadb8be6682af6999a2a3cb7f37ec39def416514b2f7a8b3f53a29c37f8168bd2e9ce8061e36c2183609041ccc8b0fa562dbb40f6726d8daea31e2fc9ccc969a7ebe1a731c6fe9af545005432c6a62a524e3c865a32990a7f04098432330c2ea262c2c2546e87236ce2b90f398d0fe4d960d7508d92ffa10f95e1f1bcdf77a3445fb83b8e5e61d1b64d20e90e504ef120b6cefb912134165bd8915f223dc56c1953f57374a01f5f5a89cdc33b47d3fe2e56e41b11b37606c90a398ee12bcd2077256c5d478d81c8bee0ecc91f2b7ea1f74c200eb429e8cb7d91e494df9a4f18430e7d5a2008d2844247795d185ab332a10e261744a1d80d2c42cf3ed6218e7c36332b9494c374d5ff8c838136272906c5b5b6d1b1a6cb2b1d6133b8d88f48c0913219dbcd33b33d4f474b2707a4c33c3ec31449ad634bc904207024986e4e61b7eb1bb1bb3eb43e46c8721c5e3a78a8aacada3f7411403624645271e455c60a5376ebff5b449fdc7548fb52eb0dfa88664a58ac037c477803857e05fce009f10fb4e5c0e7abe5c1da63cc8d49176dcea9db4d3cb1771dae2a6a9c175a157220df36c0eefd320d2fd1345d1be9542b224a33bdb476d42bc1e6adb49e85d284507c294a968e9dc6b221ba4da186bbb03504d9a87ca044b28665ed402178db2cd98becb8811a6089d793b336af3e20b20e9e6f12cf42cb06446518c93771754f3debd34224e0d7febad821a50129c75cb7bb30e5b8fea59e845ec578c1ba8f096151124229c32e1d7a1dd879b7c8f0731ab04493cb2a02786d31864c52c8d9e488d5f42ea0f0b5e02285ddab35979d6f0ba9a8b56ba2ae1b510dea7b00c6040b7f92bd3bd72b6a7f6cf52bf114a70f14758dd56dc98212b3f745a7bae4cb119d49d3031eb4bb6859019bccfaa4976aa800e2294df8ba0843df7b4f25e39529e283a9e2b7b3ae669ea5b9e01c17db2d59dfe5167e6bea5312302260fe44601b5ec3a562722be64810613305abf8b1b27ed818d75de815f021acce3ac09d70ec91e4ae22a083d5d04dfaef74c0f0e95a43cc3412738c96db90feee22c639f7808d5315e7fb8c6c5a5751d195eb8257590e52dae22ed09f4d5f5434220a816c0ae41e5edc237070bffa9a4bbf82e0bfc0c61775400849ee00a7aaffadec4a96c163e7e912503ecaf27d434fac56382fc72b845054de72b1b60310eaf67b0874461e8e0f0e3a067b311421e636c9fd137d16118d68871cad085b8c7223bb18ab838f8d145061616f679e1c4f631c4d6446233d0a38a88d21d0efebf27d269409044c869aea0a03041575c135badab12ae651adfa583affbd1a99af43cb1c0f574a003407ab93c6d542a196b4993de7645c794112d098dfbe1d639ee8ac6fa311464c50740d1fc89a6fc8270d182bc3100cd5b392b727e6747829033f479d015aa039a372a04cacba802ee82146093bbd4ea07001d01ea785948e568939d0067a1edb4db684062d0df3eef53686660d21a82d976bcd9ab9f6406b87d950e19313980feb25f667949495cd70904451bbf29dd90d7cbc5b252bdda4c61e0b81a3ba5721652863348acb30d1a1cb3ed68b63642bb308bbf2092cdabae919806a7451042546a528d9a5ff524a13341755a98ed47e881f2265d791ff6292b1a231dc2640b74776631633133ae4161eb657a96c7d37d6358d644b74c0789c483ac5284f7d6eefca2fd0b09a2d954810a470ee5acd8f0bec619f0c1aae436e33c01694fa39be3e666d864f1c4b2b1ddf73ca0c904f507f480a0cebeaeb5f56d1b0ad304920ed27475896404176e3f38a9029f4fbee2b0ba3f31013385d6a639e8ccebf65b8b6963b4a415d60a8b7b51a0b7bdb14192597c2337d0d8070b62b225230747f65b94814c5fa57b12d3ec9cc4b23683a9e807a8c82ec7968d15b78ce039bc9ebf2641c472086f02e183fb3606dd8e9e6072be189409428f904ed53581047f35f24719b3ec0146047833c6a3382a9d4190c80a453087f18b94cc8e365e4aec98c83765c800c377f6918ccd9d94b82ebac7ea917cba912a9c2c16559dede7502522809c7ded28fc8afdbdb109ffb14dc38d8294227e212b1d62d2389de45be17e1d69b2ad3c45b868293e139c7a914bac05b1673624c2478c80454cfc784e0a42e79133d87f000941f13743238971c2bfcb195ed3c4b81f851d4b185b4c620fb51024797bd44b8feffcc64d404bb8e96322699bf090b3d79341e506ebe495f1f8f0a80ec41aa3799c64acd878c49dcf8557b87b0f7067a6f362a5d54c2729bff285d874b87b3623e0744393ed8a549eec810c00d1ad4ab5974bb31872252e9a3d897285467faa5b4b8696b1eb62a929a6c8802510d501cd6ef8e27dd3201aadc6d40e8363c11b0d0af6714cc90d49fc40a363a94dd4de2d39ba6aa4b1e5521beb9394dee7cb37fcddfa6ef79e8389bc9edd47d1ca317c2fefebc6ed5c5aa5248e1747e02cd6718f06d7654b2f8700f6884bb9e8a981e87a748fbc6d5ea2efb63de532317202032cf0980aced40850d8d17a712ad654e2b8a15fc68e1f3d1ade04f2ea5f0dcae5f2404467f3ad161da42af60d0f38e37a328d471a4a75f26ce2674a748b396a75473ca07d21a2cdc0a494f8f7c72883f979c6e4b8303f4448ac159b14a121c6c217b31bccefc30d1b0b76d1bc3c6303e405d98827621723982cfbc02cf9a584207e674af1a7fec755c6c88748e1e0d9dd7811951014850cb8e4f3221c06ec067edfcd6028762af1103dde0a5fce9f597351ef4bb28d60406e5a120b99e2453c6623c41bc53312ecc5a48e0d8d1a24b312dfbbff515bfcccc8ff0970eac768562bdc86fa41ba71588f66cd0463e0a210bc39e2786b361153c914cc036698fee73ec5763c9a791bc9f00c45d17271caeba7639ed96c1f2240ad35db6c345db130d2fcb3c158cbec99a8d85746e2f1ea486de69efb20111e17fe7c372742030c9f95ea317335e77d0e4a072e0c45a5cd7af9e90640fefadecf2343efbc587a5a0870ab291784b84e5a2daa49b040ac36c1224e8c29a13b030d03a2442c755969ac660ad40595c57d2829315d84a901513ff6870722115d80e35315aa7432c4ab120155b84f00d350ebd556e1230ca61860ff792d2eba2aa8e57e284cb2885d66754de91b3aff24fd7a8cda9a0006eda18cadf44fb0fc12bc55dc957f23514ca7770a4f7613c6c1e47afa3e38b0cc5e820d208624b08c007cc64fd6da1002c1e8041e59d0661f73ae7f49cf056a93dfc9007b3c66137575f74b809830f73c06c66d2001c5ac255f112a8454c7027c7bef9cb8705170a1e56e3614fa1c06217c6f309492d0bcc32b9f679c2a0fd7bf0d50cd7a9d0903edab6f7b255a4cbb12453d912cffa395d18a2e42428f32c8a4cc7e73084e5ee9e91e13bad923a4fabcbde69820656463630e957e82b5a26e8eb94e01a7f1057a74daa4f7dc188fdf23a4a2870418413a36950b8aedc290289441aabb1b0ddd77704521bba94997b69a61294f8e52422fee256db2e3bb172f104af144fec3a9b9e0dc01b1ee91f4db390eaace8fabd9d98f9ddf893e8c40b73d68ae7b7e6ecde869be70cc5c5d83c9d1b28f79a0cf994708133e94908db032d02b0d99b806aa2ea7b99eacc17dac02953d32741138c2f8f9a2bd1abd26add412840b39ae394a92cd00c226705ce183c0c8f04004901248f285d6d5311599d1a707e2bf38601c0dfba157fdfb4e649cfd79b21f0c3a61ac993a20b2c468eb1cb3b5279f1c3396de6ed334a5370f4d3a47b43e3dd1b7aabd8d761f16788ca488f222b53e6685dc1e50a62c5860a665df9343bb0b1dc60c1d3f5c1ca4530928ab3a354f4d9aec524ca5c77c6b8ed20699b35ba13d5e24db4048faed988a08963e60eb1b9a747964f9725cd047a8e07ab1b58b1485f1bdf859801ff33fcda6caf0b38bbe588d3c2730bd110a9e277bb5925c24672f14ba3a22195d259296b455742934a1f526458114c330ae4c03f9264fb88ca19c961284bfd1ebe2b9f9bb601299f8fb825e8b458a4bece6a6ffef7491cfa8c40484b887a32f479a1655cd5f2b23027a0507fe8282aec18f1659d2f5f42556a52944e01d9850ff526d5cd3e94ebbe8d0487377364eab1fba21aa2238f4e495794d66064588b4605ef306215ece798ad358d126bc6651b69d735bbabe01427487a266f85eac3cc266c4bfe02ba9ab69cc45c5c8ed1b6b4d448fcd32d69a61b444c7f7db98e0757351ca40d882076a5605ed1d56771b2f1027ea31277a12b961af0e24d51299b2261a7bacc41a288099ce838c6febeafeb8476c1591a63de62d007b924fd2f6f827b057f2814c564bd4ec61f63c602905e9abc9059a204a4761c0cc88c66d584bdad5cba0d38a685e0518c01b2c584d7fe6366ed51ce7814e893a06213f5e130e4e45b950762bf745d15e3ec15fc48be6f92f0ba670345b0baaba62f1981d2fbcc2f02dd899eed969c65b65049cf5f8d3f1a8fdab83e68aef33d72fdd0ab7ed005cdf2e519550432cd62ad3a06f55561007781aae10b8ef2738dd319ff1cc3f12de3a28218d181ebefb55018c92a0500ad60d3a28c194dc25c141d3c5d13b3ef63616a8c60e8762571c4864c9600d9a44f241110516efbf060b43ad98677ed524f03b548022fb4b49234c2924ae7c47e8356da5b1fc8238161d24c2caed187386697c74bb0659f0beaa48ed161111f7667c532560191c0aec3e8f4489b0c350f04390854f80d0499c3c9a76acfff7e520edf21cf4f1826e2124985336450a75e14e91925c1b107c02209fa7b152123c4fe0c8bcfd30df1743da4212fabaa9bf66dd8b94a2c280b893464bd676bc2bcfc9b1c63b0b532dd5722c15af9304c8d85fa5e61cad3616b9377cd51ed4003fddead3ce3190905ff70e23003c587a63ef07efcbee2814c60b19bfc3c12a903b464d2c1eee02a77778ea69e7e80915804630dc6f5e51abfda299e006367595df0e980d37676e9460388ef463c8491fda0bc945356e8453663aed6df123103ecc85d4f14488c1d3c6be682632787c080025008e5368e200d40cb302c8649124418108be52c11d4258a32126bdb480d7cc4a18f9c690c5bc871fa782e9dd3f0bf095dad946c7d4f9e6428a5007c6af03484b4d8c59350084544d760888bddaca441b14198dc2bce66a084900c2e68d34f323ff233c061dd46d3a274c02b48f2d9ad17cbe964337d94cd6241c456d0b83ec3ea5805bb55b0737b7aec3d16b63ebab120ffd58339c63254c0ca3305bd57c68dee3c5ff079c431c244f0f96c5c377ea606910a37ab576274a91532f5626bd8426d4cbb649d7f8b9285dcd2a7a69fdbc2735bd26f720b927732832f541e3759cb33760896ad61435bb372c2471ed038dcdb9718a21bbf47ff3d7e09322b312f28af2accc1c050c1d70730209f0776ad9646396988de022e68a751d19d36f4e9862c3c77942714a9f1578ed108d5e87b9b909819280e239e4986fe408e82538bfc61e62ee425e430e3e6e935eba05eed13a70b0ab4270e8b828cfc9c3657e75ee35266c8467866f23ac8ca6b25409f8f6f0ab59a1053897021e3d6b8b077948fcfd9e4b0126c566456aa176f1bb9296974bf9f2e139ee05690c603394251c0b7262221559bff51e7c1f4b7738776db31f6cf29ddf55ed0f6f1f018c4ef0e4dbe67e9c09b5667e30ee03b37fd9dd9462faa21e35709d00823747a3b4511122580b50b4bfd297a1c8eb0cb754530ec28c52e6981298c6cb28d82eeb0e346607c635630fd265664f18627dd09dd161ff4bab5e5ccf121c3bc6feeea85ddf641dae30c0131115174a659ea20e9a900d3f4a696f2e51b1218d1b574818c7151caf1042d3a9d301a8f99b8dfaec12ca8d3ae1c62630c9ffe09946597709d03d5290e80e23a4af5880b0b9037e0976ecf6ceda171ede91d88fe6dff4f64f3f97ed996f380168ef58d9e1c78f9c1c3bd17eb753518138c51b6838dcf3f1bb44a965990ddafc6daab0b29f39396b4c6923c909a547191bc2d6be40a171b87dd2409434dfab1b1c5830f3e26ae4fba365835d1a7dc412dc429bc708ceb855baef9def2aad63e23cc568ede236810e4f2e62d04ec84c6fe8d79de81a25c9bde9bedb4b399bd24e00f8d998c89e3fcb4f8034d11bfcaac0180684e16b6bc5eb09c6087692dd1b55376a0a4639a7d9929ce40b830eb90996d8c7be097c5e2821b3d4e4f0881aeac9f00ba52d1d09c436c309d418a0b119840fa62dd969566fc83bb23079df588d8790116faa18b09b857276d9656ccfc197d41a2b0ed2a961e0aed6f4222e4261cb2eda4a9e5f820bd94ab8e3f26eca73f218e83fde47511f55f6d2abbcae3622f025ad163620d7964b8510617e7bc8e3378419c4bf25282a6210923d22b3f4ed8912a4fd5e86d1d045729361c59ff13cef3f286d149a6db04b16902dbc2a00cce9ab76c7c20bb79ace3666978216354cd931ebf54641ef1ddb59384f84c32236ae71c60f12c2eb553cd7d6b87fc7fce1fd76dbfd0e28cb3bfedeb1e5ec51c02ec85b991c250adf0eb3ed5a6afb1e8546560ea0709168231cb2e682aef6829e27e426769a15ce709dccfdcf363af410fd5218ab81e9bb696962f39c121311fa64e0fd112aacf38f9d69fd1fd0b371686aae98e838081fbcde79d2446d5b4852f28b9559368d2a6663d6643c1fce6347c53040db0ae18139459655e53f8df6a895c59059aae14724b36c90dc61c4bacac15c11e3012f8c4c477b2f1bb9d4004ce230d22aa4e13301d40391f7a10042459345bf80ece98f6ba88437982dd044df82508747bc20518c0b048d2194c922fd9b08106c55acf0100e56a10045a24bf0df7dc84c62de3ace584055e0d2b68ecb6d51a52fd96269da94bb122723d2c358354e79585de9189ad6b26ed101cd5a468902f9fb70d810ec6986a95b4f0fd33141502822d048b41725199096d096f0a2ac35ec0d8079a90360c56ca07f84fbac4aa0748f0ea2a70fbd547462fa924d414480551012c7983cec08da5c3da2282ec75fc61d99120e8343ac1966ec72d4d0386c738465f765a1cfc40df5787af7583ac3bd64cbb7ede9c99f475d3e9701fee864133c80cddd60836dfa441a96981b9da19e4301dc4d0e14b109aa4c0cf9581b49427561c3c3997f29014448634cc738582caa3c52a4741f3f4657e8215e4cc9817aeb6612577d2a955fabf27c4c6bde3bdbff20369f25f7ec82be0cae0459e5c28d946e85620c1ccd939a62248a85efa3215ac372719ed1caf4ef9939281000ed0a36c10d13cea99f82eb024d8b4db3847a577835d053016307f2860acf730217b7d35c88170763e8da89722d57e7da9c64776d991e6b4c096c9cc4911b841c2a230a8e7c84e591a1b898eaf1e951cddccd1d43db28264ecadb9735afdfe747a79750e96a9f7ad264a0b65020daf06dde4ec72edfc032ca347dee9a24a39cc37c58d738bcc2e3f277c5753b118a2e597c14dca4cf60c42ca03507e973dd62346d0c516420de8a52191aa6b22936d70de89afbf40c31d999118f80073e402dc457744ac6f546bdbde6dd09b377c3d7fac1dd6638191ae7256c8754781351558a94ee20237ab0d1082e526f83acf18e83326fa58f6d8b074db0f44d7ea467fbbf3a25ed0710623434d7449814d7af3d14bff68c6948ef3a0390ad094709f5c274d767b9d919306619d8235eaa1280bbb7decb937b0a86df32d59d2223cca045a8e9b30062db72fbcb89c040cf0574732002747526e9152e268162a5263f5b2b84653759fc72b61a4eb756da8dfda1e4570e753b73538c561f9b8850215cf06853096e8ec4207b533c7683d63a4b0cbca23afea585ceae2358123c49e5010e810194dc536b03b9047325a613aecec54355846e808c2f4e770479e4cee8c142cc0d57c6496ef354c14ac6946422c34d2cc5aed9c7eb33dfd2702d1b957700f56beb3fe8e97cf379817042f0b5d2ad3d87aa0f86f6ab063953515f6ad45e14e455e49be57d255c7f1c02e62402f3c2f3512e95b953116ca21145441e12afdd6b31513fa4a8d12f04b58bb7a6b031567f99a165668a95580936e132fd478b6ab8cf124ec2f556508506cd6c2e8def50db963a4f5251d1088df02c2f378c690ed4683ee77030059839e403a9057acf2c1c4b503d5fd69f8e9b7f0a42cf5744d287d8bfe55fef35b7d1dd7f47cf9a4fdc417ce1ea649164d1296a7941d7c577bb62da4d163ebdf23b138e5782eed79402ab571eb3b7b87bf7b94e107fb15618ac7bbebc18b525ab98dd7e8cf212d28cf43bcef9377aec74c9c5cb6dea82fc6d079f11b40002a9fb4750506dfde021262523bede54f188994a1e1c2dd69185759933f70d70a9e9591dd3b57544a3780e94c39016801e690d60858cbf98becfd3669e9d029537bafa66f886474b5cbadb0f5a4117cad7e8c80eb190408fe89e6cdb44da4e773b4233070f49560af4f4580f941c1449d60843abf8f4d82ee20c8083582a0fde9852f70fbb45ad122de71207192fe9407e3bef28e2a74ca4b2838662fedebe7094aa798e4c84f2ec6e35d1e4ecdea8dbd12b0646f36a4db41751fa6fb64db45de4a4e19e20634c8911f9b6219f2d8e237f7f879b41b403aedf954c68318b2c7a28ce9b58c4cc7bb0b3c5263185a5336360e6063961d9b871812cf43ab44628d5025dccb0b6632acbacc84e0bd015807bed39b57093318b4b842f3366c1b31e6df20f7bbca88f07afc66702c56c39be5bc453b8f0b7253780a45069c0e0102d04a615e9cab183398931a489e481a73387bca41498fd1aa9cedeb41cd19804a43a76d219fbdf7ea6712cbf5a94465f73455bf02a3f47ab88dc31b3ce0294142f51ccf1545d9ddf5611b50301c4f760214738cf3e49e58d1f66a6dbc1482a63495b9bd56d73f45985f6eb94250ec8efc30c76aede199747fa9890781111c34447f6c85dacc4f3333f4fa8142671b63edb2fc5055b3248dd334060ae3764891e63dcaa9c7e5b714990a22f2c3bc2c3bd042b50052d90782953114f8c4113144372afe7de8cefbf30b38ee5700218c0c4a2655efe912e8770910c4349f2e16bfcb94ee133ddb746b23c320edbe71a2794d2fb1db59d83663166b61e2ad4ed99b50b8f801590bbaa534390e507c3cb79bcd1fa1c2ab5bc1c7d92ac95ba5ae7d17cb57b9e0e509ccb531b7d967a4bb41b21b337340c0efcee314ac6ce65d7c9e12f15464d1d8721ee604ce1cc662844462234e19358674e58c14dc37e6d44533051013b5b910589e2af1b77c331715e9b6dce4589205d824ee159e104e14683aa947651b162be5afa0193a0ea0056741b716a5e2519d935b1f2eb0318549f6eeb890a00b39e343869d9c06d7b3c5cc81147f186aaf1943cb0adc23d5f92557b11cfb8f3a34da213c5a9f6788ad203fe8909bd0637175133034ac503a39f374c07ef0e70e7f390fdbc80a53e045cfd55a062c71d31bf043cfa72ee9159da989bb1ccd23fc2d70b5981289a576f4545b03c57f20bfc12d5395ba282693b4fb75b138312830cf10666302385b4a23b950e99e1e04974c5573ab656138e50565e3b9e23a6693163d3513072d8b50656de1575e624c21982f1c843f2ec2748eee62f32c6375af6f7227a2b7ad604a03583d799605a810e0056e5cb0ee11a8879422131e4640574f89013f23376f4f891a37787290286a47d97de7a15e126356dfb6d8f4d90f4c7209eb8cd740ec6ed58f3edd1e488047dc0d1a53e845c33ef98b8b4ad0236886e38ea45ac604935dc1b8801c9234a9a2dff9e558e7952998f1336ef646812af82b8d246f658b04c25c7997b1818f6f6063dfd7f40dc5ac6c3ba610f69079fc06aaaf292bd6e982f1e5e9e6e4d6f9760d9bd8cea777fc7a0f037556013d3ab2fcc727615f27c74640844df6158d364f566412869fad5d46bdb7eb377b7e6d2885d2685408aa61cb1962fd00e081011443b1d2d26fe087b077298193b8118c84e69ff8e0989175bc37465aa01751a8a6a763422dd3d121a357d6d7812f3b0f509b5fef30a22af0cfa7077fea0deb6ed8ad8ac0e8f8bddb64a80fec23058b5436692ff95bd98c89ff7e2ad1567264a131b765e0574395b80bbea65bdf51fbb0c5a219b4c0b32e2a1f6216b32cc631411248b2d3dd94ad64e73d2f204b64a0300e0a6cf152ac83385b19e73eadf7a10f568a451f26bf68b23f9260e4d16109d03e49da0835a0dd5fe31162807368265f8be93ec9ee134167c15e58a51b6bf7ea3cc35ff854ce9199df78d1ebcf7089ca6716ffedff3bc70a37d00956e13d61843f9ee88c232c5711825880088cd06f68a324ddbc9f5e09abac2e9b5f05fb02ae39b4a4dcfd1ede6a95fe8aba153e4e13be760a124a0aecadeac43a1ec88055d659f57a8fd4185fee6b8b4f3d2a5b6b6bf470bcadfeb49bd4086cc1abdb50b6fe0cdbd9963598fd8899a544e0eaf561aa6fc57efe29bfbf792498dfdc820b299a0acfe6f73eaf3abf8521745d82cc19d86824916091bc4712629ab42c556371d084bb88bff921a86a5a4641254c230ac46ae09bd09a93e3fd65524cc0d139a9f4f055e36cecce5f19ec4b1e6123c053fa3c18a1b01048529238013e754a9bd5d8c6749dfa972ecbcc490c737ab2c1629f02a7ca31a9be0e78520266412d8c2975a48336848cf2ce57575b86c99e8a184fc9129a22e516a10800003fa7a7e3c5f055fb466ad754673b7caaa7d77b67586a587973e7ac26f8a052ea7bcd63405f072a576ea2aed2b9c7020cf228eb1e318eee4848866716563255d243415a993e06e0ae39a614baf41fc46ffc664a93cdd35ad860254e6b3f5fd7865d3609360511f0aea219460b62f63c0234954d066e26f311d80c21550310406e1e388b40a95673b23a9a2940eb9f9d6d9a01266c947d8ac8892781c29dba3986bd70110e1eda8334aaf5bcfcead3237f80cc836f50432ce9219af286b65cb143aa5c7ccb68c472347da911600bed06345db94f92206395eaa89f9b78f40f35f2a4423f9e1719dd00cec493b6da6c4aca74cdb840730d1c3b7da33b6ddb0b4e7e40bb28677aeca671391f7ace5583a386f19958c2de27baf8c62a5df7f930e326c6390f9a97ed6f86858d58030c74efcfe7888abd849474897832991608a3bd2cde18b0744b00fc56a807bc3955f7e1c54bbd520a28f718524f544c243626427ba98b518630db09048c41b3faa6335418e8c97bfc9cd2525729125dca32871c110ddc3e773cc1ba5246977399a572cc591e3a772de94845e869aa35d9498325f329c8ca3058a42e8f296196202333804df4a2b51bc75c9decb0bd95b5efad4091596eaeb532a5dceac286366584b49fb99775bffc5bb2dd4cb5a528e68a59602d6eeede65ae09d203f856b2afc100a2c563ca55b094440ffa66b3323715788611b2cfc64338bfaf3f2b4d86420bb8fbcba3eddb555d39b65ecfdc2d62c8df6bbeffa8adc889485ed054d9359e2451c33b0a7c9e96432fa9b42c1327385ac6072d37a195e0add065f3d19c268807db8f2f2fdf052314bc3927c6d82eb1b0e42bd14a06e4b5194932c3ccb409a2f1efeb392b1e01cd8d2c9eca6e25c6bf340f5d04163c1d88b8388c7075760f1a748996e782ba2f00869a3a2207c14229a0c344bebbc7d46cca60b608968aee68c846e7156baad9809cab789b5284bca024ce67e10874340bab6c60b311566724b0d7104aeef5a90a77a793760b91266861200302a6bd8f3daa81bdb99f8b75ab88c205ee196123ebdc7f69c945f8b1411a16767ec008458ff5aca2e01143614c3a965746bb5b26168924a76be1e6b7a75ca49283be06089d93a6f0efd81e5450502ce69f1ed906483503e6e6c5c0c02ff2d507419a73eeae9e0a8af465442c09c7df4f867ecd169a8e8a1d7dfeb74ac89dfd70c0cbca1f592bc85ebfc3c32a4f7eb5d9495282244a31d4b627ad0d694499cd70069d698c470e75adbc8bb2ca25e722f47956ca21a4fe25663abc8fc946bde366a683e3195b8254f7100c814e30f1a4a283d01816c8916be67621808d87538d1c94b4f55ddb2c97f9e5f4965d48706780fa485cdd4464dda50f3d08a5f8abd73b691d27a5c9417ccbb922cf71734a025ff0af5d591b4695922d9c3af0f50dc535e10e595d1397c992063872d24ee24e12940c999f7b96603daec6d97ebe2e15f3d9f15ba62ade8c2bd3a3a87ccb7b01c6ba07073c69bedad64c608ee6daf4ea355ce7cfbb92d91d8c63425bbddc40c62964e9fdf9977440eeb26d741ead758f299c07df8afe15cb59cc4673c75da916d45b53e0ffb4526f52b4e060bbd227fd32cc454a1ed2183d97d796bdaf0d031b3d08302017ede20b85440fac0e08cba1b6cdc4a7a663d8ebbfb2fd05c238d7ad4ec8457ca815469e15a72771ca745a0aba9c72943aeef46d1b6d07ed3f2938508c68e875d44d7283edd31370540f1c2c7a652d782409787988eb7d653a2800f3851428e9c4d5d02fb936baeb80249b9dd2490926a4055221ca2ee4f2cb990f1521c8c45709449f0980030577948796806fe4fe8d985a7df95daedf2f9a6ceec4dfd9531539acca4cb6d3690d53925bb270a7da17480f933619c6f51d5dda54696854ee2c0dfa1aeea077d573d6c39485cadabbbb32d7965ea58d0ae1e933c428de80a19a0c5ec9321f29b47d4002e8a2f42fff07a3117db71023230a9c061314edd4325190304899ff428814c8724ca32c05c24d3a75f0ade2da029eac88ad6c24af68f382bfc14bb2bbafdc6062d1a89c009c8ac123dd0220a37637a411fa239446cfd88e84ec5d19ed97460035a023c844aca07e399847142e76fc1728259a90fd6fe79e79ab631e9016e0c8736fd1834b00e2b5aadf69f98597b7d3532277887319bf407023f072e4d67025bc0a9cd780d71aea2dfc094832012955c89d313d818947ddc6117eac0d48663c8497d4e101a6b4a8e8f56c64405ca242e95bc98e34dd5b2725bb909b72e2a04d25ae712c01cb94d7a6fd1949ba7411634068a62aedb773db5aa0e19390ad87d5040939f94554da78e5a6a8d6ac80d1184a1aa0441840e1df68638ca5b8934210811b5a6501c9ebcf8b3c70476caf228f5a9c24c38689f48b2509c9deb0d1e2989b0153a7c29ab250c5e6dd308bb2314db2303d3835512688592c18e310822e98902fe079219cda5833c9e74a4859d886c2928d89a4550650dcf131722ab7bd5de95c8202704eb89f95ed389e9a58f8a120b6dc2d0e1f9889dd18e06d6744e2beb6ec89cf611a10d3b600c7244e61da0ff4c893df344de0a4129de2edaf7fc311c0a3a1f83893c0348758ade5798946b591609941900cd0bbb5cccb4883dca7b084e8fd63e82c8550c631484967b705ad1f2b0f410b1cb88e39b399d420233f5bf767b5b32ec24021f4cb03fbcc01236d63ca2a7a3b080375298e90b4087086a3109a4d3ea581f2aebcd0fda092e261c894582a8b2402d612847f09c7bbb6596bcec1b2e4075011d1cea59376708a07152591e1190027338d13e78b3f141f1bfb040b563642e59961ffc89081d9ebb7bc1f22bacef114023e1d69afb070fc956360e6a445cfab8a6a8084ed1998a200de719334abe1e0ffb2286a8b1a86af138dd4f7cd7f97bc011f802b6000b07c83a7549e16c8a2019a7e5f6e3d4bf62c5452d3c14fbc0d9c0469fe1f524732b716859f70722c603eabab46f4fc9e43d63d8499f76c293ab128b8b1b9c861d7a3094eaa1ea243766de5895a1f7c672ea8497f8d3b31737e506996513f47826bc1da0f12bf5f818337d973179c65c9b36365cfc898f820a66358dad386a335e9b16f2943318816d9afdfed2144fc5c4bf453cf0068fa9bbcdb3c47c48921d9ca5fce62fd54093377efb18c389f7ec5b6c389b3a34d9bc049d78d2e5d177aad3e6cf2463022386ce4873d9a36aa730fbbe711bf27616394fa78b50d7b0140dd5af6ceb2cc852d5e1800c5d442b3f7c7c4864cb5d2dfd4bb9d6aae8c80c0dc40ea95ba6b1ebd851732d07d9b24420d633902159e47023de97f0d0ee4523f0e80978f695ad0a0074ab83596d3fe9d73ff960ec75f4b3b53d65acd12b1ba51c1f1ecb4818eca3b224c6425ba84c953b6cc275bf1877df05eb03fff06043d3daea3706009030eefb0fcf077c5c3af9d7580dd7a3728ad3f884d881eff0872358a59ed428ef9d16192ad8c78a7c1b16ed93e32054c7758e5c2b6176e92f6ecfa7badb7a43f17d0ee41a2fca201b55860059ec2d14f0fbf96a170a3899f2b5ba69852ed9817e625579e9c4837989581eadbb0980178890eb7c20c22202bea07369f1b790e2b862b2d99c3c10985242c14065b8ce3226bce13390ffc2ffd5a77830d19a0dc36b804aa527cbb00d7cb9f152b7cda2a211374affb6624b9241f25d955c55f4d7b2b4f0d151aeffdf5221b9b9c940eca4a5ed343d9ddd2538a59057f0d263e1fee0721626828959a62894c37043e3e605f8d1fc54610e9ad2bb876bb21a038fd6fea25472c5367b9126e7070c2b982468cc36a170bb50611f8d821aaf45372712c7396ec7093cf082fe5e9743602f4d409af6629424027c8dbae051105d3e9a61955a1925397d83611cb08b79fd40945a0f82bf5c858257750e20d29f5d3e7758376c15f4aab1d55529ba9ebfbc6f16d26ca84999160a48d3c74eda7d9e649724330c9bb0bba29edfc57347928c8145ce83028b696d305f07fa5892a4b0a7cae4b5a800740b6c796f738e922c61da3b8ea5a7072656cde49d27ed311fc9b5e53bbb3a9b6723f4a8e132e01e549163efac48e88b7184280087c0f34d66e807b49ed18f4bda5354194a061086f75e3d9690f31e278ddf237b70851dff2cbf97bd146e18a237ea4d711fefe86b66132fa730878c4806270f964071c9a7a000dc7c7653f7f467edec78c8e67a7817230f90db1ad4a88ffd7d6788a4d1dac930ba80d51b99faaf30de9ee4c4b06a13f580583547f931e3c56aaaeb4aab3ee0c6f0a5859b1ef3686e5b0c30b6dc5dbb5c97d120303a078b423792c67c7c3b3d56e41254c95b031574efa593a32131e5307e88dc602b5d0ad723e3133c7910dab490a5cda24d16742a71b2d6b07db17cf4996deb1b39b7b0420764c063d73951c4a3e334f548a58ce0c41cce721a5b61b5cdc5493017782579923b2e5574aa5c1bf15c50370f8931ca7fc64a489568b5f6866d61e1cb0681070b6374fed2e14732a1b1ea0db02e82d9a77e35850129c04ce155195cf49412e0db24a86d5ac334d9aca7311e8dd54e534ee05a87346cbc32207a05502e7e12292a598eefe052cd62bcaeca3a8c3954ad94beb37cd1cbff292dfe10ed140db0b4de4c48f44655b15da52e6fec1d59b32ea2340ff9668fa9891c8802f4b3f0f2da2cb54ed8a706c4c4fa1dc55c6c1ddef64ac84b7ffeaed8ef8f1389116ee85c2ac88ca048ac265cc6960667aa9e0964c26fce428a69753822e684ade5c3e3f561d6d95d14c35a46f91049869b1414ccc6f89c5a8dcf413f61bd342e6f3e4266c6fc57e8af900328961e0e7784f7388e89b44b9603cd5c2966da57ad8e7dc8898e695b7da273563494ad783b09161fbec2dccbc5c269914b85de7ef74e19b9eeb0523219a3a16711a1509c87cefed00fd6f2a4f1417863d005721a5265dd6568e29f61e5494a4c44ec8fd49be089b585f1cd8f45111359b438680d1eaed5728232496676dc3067f78ef4f60caee231580b73ab7345bdfd10ee9300faf491ac0fc53e8a7294b38e97901d07ea5874f5891270440ae59df7037e796884adc02885659b27aa0de815e740f43a026001555a77a2ba454046edf145236cbaab5870aef0b044425fd4f9a210fb694e05f11436d322b04c01d3e08240a3ade47ef395337328b648cc08c1f790722317113b9c92bf6034ddaaf95711ad3b116fec5ac883eeceef8ed7acd070043d1edd5fafba2d25d6791e3edfe4e604a7a8f39ff86f595f934b55980544690c033d54bc22fd10d62befca97ddf3049c381cf3a9dba5a4f01b682823175a98c0cdfa60b6a5da000b067f1bb31e678ae18382ec113cf1814ca5fd586bffebb904d3ecdc6ac1d6d92c25909b51901186d40791d7ee3c6aa269a29cbc9c1fef6beacfeda7d4dac60484d383704a354283aed83006236057c4a670c91bb9623e19708089f53c356d87fc1129b3c9e0a2279a97e9b1e42238cd66b6bcb229c80886b003c7467ff07bc866e1220de8600262308f5d46016d55c02131c82da69d43e21b1d5f74d08403fefff8fbca3f4c01029420ec267beb873755d00cb8662a84b4583e243aa8aea09599a4147e11b312deba159647c1bb2e24cf71c0c58003d944a3a9aea50b67cfc6d6062685a2c35b1a1453dd1b2681d09d89b8524246d4dfc83c794a44c28b258aea12f24ba7e8ab3c0e6aee32f06352624fe5fa1ea0c4be8ab9fdd8e3059796407517a0cc3c058a2cdd0aee9ed3979371fb0ea320f0efbb1c7b610f0f8d59243bb69f2c3b98de3e0706e87cd0bd1441f1d59cc8c951aa9e4a53327b13e3177570d6c80de3e2b303f1a2f901227f4dfb0e84a99f55bc0b84cec52241ccb708f485b2ec1268383e8e73665c686dc2a218997a88641f14cce6c309eee29c332e1a36b12845e61e22d8170ab3f070829b38e78c83964d7d9491498f08f683d22c2c9cc12d8633e3a061531f4564d62b32fba160960c0d4f1f70391347349a6a285346dc61369f4489102173394a53a77ed3dee2c81028f15d8a602e1f746133c449dcec6a97f8a520dd354c976dc46301f65335e50b3905495ccb77d8609c403385483901715df306b873f475a86a9e7170a039acc849870345083453889413697180898d9b726d6621ba4e63c9799407fbe38fcf78482616afab82dfb408eeddd89c5662ba420b7ed084fd98bdae125fa6eee8d11a4ea56b9a2be8f85a3654aa7594ac12b6f46fb4000ec59806a22e63d91b710975d36bd28cade89ab48303f89f5e0be85d372da94462ff5e7b0b73541f6593c1ed299557a5173c64da676f2bf7227abd8acee2c52e653f782fa2cce8739422cddefe133bde9df2bc3c4cf0b83e78ddb84362b7f4deee248683ace4a3d8e350eb410f71982de596e97e2c5254e86f3a3e72a8d39434803cceb7b735b8528bca7ee13e70e96094940ff00df4be6cd49b371d5325589760d905fae18f5e0ce0a391e67cf0ea3163406134127ad1da80a0980159303b319e1c30503a0920aad00e2c842e3ba9d2a2407d8432124efe7770dc5fd639a675b61346878acf9b95a71340b673c2bdb16ef22fae43e4cb1880e6130cacd07ab01921ceb402d361e98ad60a68aded2b5d490169649604c5d464a904932740b5580a928a1d2371c601f2a537517e07d907d696b224be0bdc301cb7a04e055747aa72f8f0c5205a6ee071c8df6e8a46fc3a9f06a42c296cc7c88c2847d0afe41893aec771491d8261377c62333678e2381e0222acbc89f0be7106475842169ab77c2838ec2094110821ebb510c65362ff32a62819446f1f45ddfaa45c92a8ff091c12138571019379dc371262e1112eccd82e26dee8e2fe1563e1f563154be40813da54c85d7c81f2a997f7259213ef3977cbd3d26a83a5ac2fe931e279327f204e5943c46464f4c853a9bf9fb47869bff1866182ad34be070eae8d918be31582f9990037edc164ab7588feaf402043214a0d4a919522796ad99a5539a239e4f563a949286f18250921b29aa3f715172135ed444db0c13c23af434b1a267f2bf7dead0efbe91f9da1b39431c05aa612289418ed741a5d90c1dba6fad5bdb23c5e91b413dfe420b4accfdc342fdadb450659410ba60e7901eca151be4d33e33a8264478a0d834167e747e9a88b242f7fb9bbe24b8b171da7aee56f7f466126a50592e3466561414cc93f2d1fd0e98aaee0a54e2f283137867827608b9b8b2cdec71ccb36a1b751e3879e0fb74d9634f690770b675f5549e8062d80cba41572fad0df2964c4c275278aaedb42618847898f602d112c7516c43aadf0616546e801a32ac539e10487e8acdb8559d2b7f549c71c4200824756a6624cd7376e4bfc9239d413fce3a51db700f189f068fb993d90f0f0931d6588de24143b5c2d2b5c0d6560f4822dc02f4dcc6b0564db585a4778b7ecac89105afc5b6e5c77b78f349c903579e34560c9cbf0342a9704d640981f7be3375c93548bf3df73774c71ff68cade815f1a74c1201a0a00a140541f0695d7ae1d94a9c3c651b6dc827b44d5adecd31d35d00e6b45efb3ec1734e7d14ca8b9caffe55a63d044e9bc539757dbdb5c63cb232a05cd41b8100e09b64ca7fd3875e02a7f25e19c183a518598b31cbd038ce292b18d1474fb5a48ac66ec8906c6d6d4bb2e1951b525d90d70f83243c1aebb68b8f7258b77fb30be4acb28f5710c43c723bada758685d9a3f95d4458da37e9cfb2483e0bd90722ed9cb435c37a9fe6d2486c4f267d403518006539ce5aff4c1a8fb90fdfdac34a55fedfbc5ab2e5876f261a76071a65603ad12b8a42c6708450063800bfe40f87bf19af4ce7456d1070114ea2af90ccf373d4544067f21e4b8b113019dc65974633b58904f93caf5f5d68980fac5dc6e6a7010fa8a0ea3d0a11a75d140967c279a0286a4f44c91916618ffe81ddaea9d102f38e19e83fce77a18176648e432843f339891b03df3c3a72d8088a9547114da775d18b9a420c8c3f2355f7029e912623e5da03de10ad8ae6341ce30205382551482c5c99c222ab28fb8e96fab7c7caf3771a7a9babedc4c4ef466f5c37041e0d44eb0c54205a52a50395e2d88bf9cf76cf1643d790ebf3aff01f4ebba5c8b1f53009cb9bdf0d171317362d010f628f90a9079a1a705658993926232cbc23ba5a1ddcd850948a6bcb1662625a4436217bcbbde59652a62465430d8a0c0d0d19ea60224322d30ac0c1ce1a5bacb145f7bc3ecc39e1cfee398b66b793ee8e3ea74b8f1dd7d8a19485ceef7dd2decb7bbad55c4e161f7b6bba17e677dc9797b92eafe3cec7b73e1177887725bd251965541a330ae8421dcd22f88ac0fb4f22f86ac0fbcf26f0c580f79f43f0f580f79f42f00581f79f40f045c4fbcf1ff822f2fe730974bdde7ffa40970eef3f7b6010d7b3fe9b3c9ff4826c23bba4c2279d905d2ea10cf84221bd5262005bfd9f2ccafeb20bf84af9f156bb527200bdfe4f6e91fd6516d09522f4d20806e10183d4f0feb2090c02e43d6528080c82f3fe0d6f28c0fb4be88a79ff0a5f45bc7f075d37bc7f0aba7ebcff0aba66787f17e8b279ff87ae20ef2f035df91d7f4634a24c3fc39e845e57f24447bb07bb92226e122b1ee689dc2456d0509f889bc48918078e153dfe898a33c4df50f3f2d9863f52b3cbeb70934022c6916fb6a4dc8f3a6a57e5e934a0ab3a013d1492bf6a8fc700be6a18f0c75f95c85b42edaa469f9203e8aa6640af59f8abf12efebcdf81bf5fc9e06fa503a39030ea4b19e2746c32f6d6f6e6dbcbddd1b1b374c336ecdaade62ae07fdc20dee622e067b809f820f7006fc335008fbb80afe10af1afef69e8f17d55c0bb18a0262f40884f014124000107b8aa23035c951a2d405c2d2c201825721b29a88fbc75d42d5c27ad9174739363db6478225a28c66d2e17e6199c02dc8635f4637edc14f4e8cf7057d0a36f735da0473fc87d48432b6cd10e7af46f112c6ec8cdd95bd30673618e21bf64ef8fbd9c7c984c58d7caa753451151aac1cb5d9701613d032e05be0177021f81ec6f2e7d085c237a50224a44a09c555932232a40810948408bb93c3c909bc3d770b31d9e015702fff2093c7679104184081d584e2487871d78727841724182419a48150989b574ca9c1641e4c4e9d830ec286aaf1eb9af1cf9ca91afac1ce9e07454594504860eb6875d1d32b1abf91d5cce8fb7b1b379c8e504799b639b57c7d78b2d767186b9cd64a8877a8b6e12a4c8c6491311e5d41475519fc1b59151abc5e5fccd3d6e101110c0ac226f351111ac1e48e344f730315d457bfd2dae858a845ee523e6e5c21c8363a8a9b904f81f77006f737df819ae003ec80dc0db7087b86e0fcfe302f135dc1fde021620c010202eabe787dbb26401020c40003e04e0aa8e865c951a3440dabf871b210d7d1a1926900b93b10b9361f08724cf70399565c3ee0b0d765d729501bb2d79861b44e471f378ab860b8a4bde8a4bedd3d3d340355cfffc6c3972bd30da704131c95b9df443db5699623fb0ab9ae165c3ee0a0d5c4e0c6b89b5d4aeef225d24bb43c8ebeafccde5e16db819eb217029f00fb81578ecaab0321eba065c237e0237e244e046a3a018d730e246246ff5efe0e2d11a473b0c7189f87af1cfabe35daeccbfdc1d0f73ef4fe0429c1d2a7059492c246fe9f07059459725c3e55021accc85d3c1b28a2804402e00be869b83907fdd1dfee6b2de864b3fc8d5e167b837bccdcdffe3e2f035377beca6e4bf41445e020f53b377b91a904052ce41546474848459472ca3cb22835524e4b28872b82d4b00b82d4a2aa994b52a2a2a2a2a2ad9551591617486eaa83d35b0632e478787ca4272787181c1747278d841480e2f2e30980e1d5c8e4c6b8bb93b0fe4f290f3aeabb383901c5e5c6076747278d841480e2f2ed8ed328c0ca73373f7e36fb89c19fe86db91b9e62d9cd986b8443c764f99861b34c4571b6e6a3cef7fb57aa94f71300bc35c30970959afcb727259446314f128d51b4e67e61acc8303c289531c71c411070e91e7c1ed48fa36862de6ea3c90bbc3d770fd795c1ede75739e017702df802b818fc02de269b8f46f6e967f868bc3dbdc1bfec705c0d75c1d1e02b702ff804b81c7ae0986081d8ed2f0f92c7cd22dba6308c9e1c505e688089d9e8fd50556176010987378d8e1b320045f9f1cf0f579c1d7c705c3600ceb00001cf25519f9cce6515e113929f2567f052830010914c183d3993976af0fc2e5d0f041b81d996fb8dce30611f14f84081b8c88cca740605c304699e50b48d305ace97f5d95131aaeaaa812a13a5221792b290257b5e4adfe209ccecc37584594a4db320d37a888ef718388fcebb25c97457431cbc85b379835c4eda9384430ebc85b2ad5dfc0ea7162da5c795c560fa4e9afe1b62c419a5649a5ac8a8a8a8a8aca8a1a45445c1591b7c8303ae3080720d8cd32cc8d4c8686b668d2c40900b84884dd1a7363153970514808bb5886b971898f4feeff1ba7f889b9910a2e02d16cc3104e8808e1726630d29e9056a2bf7f881b7bb8c8d35e733e78c6c111f2638b1dfd1f5c4ed0108f5d9b6c69d8622e7d201787afe102e0795c7fd7cde17bdcec5f57c8df5c1dde86cbfa20f786afb9f987b81007bb33d3708388542299a543d118482bf0f9a4b7c2cb7f352eff793019dfa3dcffdd9edc4484e890c3184500c00169053e6f854f7ac1482e180906234d8c5431128691584bb9ff86ab22625d9513af591da2c5e5509c2d76318fc3e5fc5bd6865d995d97d504d2b40d5f9d387d7fe5397d3f8fcbe201725b926a4f6751a8aef674b5a7ab3d5dede9ba141baeea8cf6fa6b7ecc6073556404b92a2358838adec05cec7176d8a216baef9382dcd6db70bdbfb932fcebd2fc10978877dd99afe1c6f040ae8fc7ae671a6e9003fe6fd0103fc30d2ae2ab031e6688ff716deecbd540cd353888c8bb5c0dd4ecfdbc1aa85986974af9632d41e07e92b7fa1f70bff2b4ebf6b413d0754700bd1e7f5d1f0f03beee112091bf6e91b78cda758faa19d075d3805ed778deff6ad5f5d49eef221d5dd6507bfd3497e580cb6ae2adfe99cb121a81d6a37d7f0cb70509d2f4fbb82d4790a6fffad8efbf4728dabeffa6e199fbfe7bd42e083daea6c6f3fe572b7be1777d72fb6453eb7a57e5a43d98cc03b728419afe064107dbc37a442e67561e17c65f56ac885bbdd541710d2277e5adfefe87f24a1fe597fcc580efbf3cfe6ac0f75becca901970554e9a8caea19f074ec733c52aa2259acc807b9fdc8f6f6f52bb30ec02f3f52b91af5fbf6b57f6f553ed0aea799c22befeaa5d2f5fdfa55d3abefeb74be6ebcbb46bc757fc19f12c766f527b1dbbd061ff5da4fba4bdde617bd83cfa3b5c0ef6f45ea4f65c1e7239306f63879dcb79993be3b5d73a2e109bf63aa8888f4545601c6e606e1011225845c485aebedbe48a7910f27205d043f37091ee937661df7f93eaa5a9d88897b1670d997f014fe61cce0748942746407bfd391c10edf5cf6498ff24f45c5e871b32338c8a48e54445467bfd0cb8aa065cd591b7fa77389d56c6b0aa680b1d6c0fbb3e32036e0f5c0e1d32a9e9e55b19b6cb1fc23cf62f2e435c0778ab7f072e0706c3f676e0845803bbcd43cedf20221e8608ac72d2ad7e1d2e2706ab889ae8e27faa1d9a191b62b001c3bcd8c0a25ab121a562830dd8c35c985f2ecc2e770816979379cba74acafdabfba996723fcbfd58eec7ea22f7afdc4f8594fb53f76bf142ee57b91f2b8adc9f723fd551ee47ddaf850ab9bfbb1fab89dc7fba1f2b8bdc6fbadcfd5a9690fbb7fbb538a1a58d8f75831cf91ce7437d4fd2aeecfbbd4709c52a8661231a910fd0095f3c91bde30b68443fc0286424621c406b0061d6901847c6f087448c83067b0ccf9d35843c9883616b54d11bf691a3700d21090434a42acaad22ea56530134b99d3580a65011e56e38b8eea51d4a19ea60028544888e31e081b53176e7e86043686e8cf4012542e4ef033d72520c69528af4440d25a03449aaf549125214214ad911192ef1a49bd02119caf05b024953b24819765bd7cf71395094327ca4ceb44452867f8223c33f713b2e79a9432da1468a0aaa5351515151314148f32d7194e13bbc350d3a14818c6e408794a0f919d18d204d7f3c5a6aaf1d8eec4bb96951f6264ee4affa83fce5c810be1b59ec469c08639be8e30ce50fe3596aafbfa3c078b4a1362333b2ed4d98f5bd7a3b6f75f556d7189f74bde442d912228fc8f3883c22cf7dd8e8eefb6a6594a10e1aa0321853b13b0ca8a34c9a0ef554a2403008fdfe19a55f59123ae44074c881e89003d12107a2430e44871c28e3a14f8086a6156de43d30887cff3ea35fd55bfd9d1aab270fc5fb6cfc26378644b963f5d77cb2e446898d07c747995072fbb84f7bbdc491da6bcc8a0f334b27c7187fdca72691a07387b24daadc1f13f9464833bf274b864f7fe80ffd69afe9cfaa639b1cd339996c46434cda6b261042082184d29bf890531ef7b9247f2e29d38caffab04728d79b9de199d196653e19110c827d7fb6a45f1b15991125ca8c285166448932234a94196546b91d6f4099514ba7444399cf134ab4194519cafdb6ebbacbfdde10babbbbc4ab968df4d3e59e138e2849261c4a9264489728c9904e91fb3fba244387114f770cc396b1a81d486795a7527c0294fb87862c94f932a01c638c104618a1976344ea5c9464970c5da6faa53df41fed522aba4581c4e8607b3d93da45bf9ffec020d9f74f28fdaa51bad5af861a4f9e4081d251a2e4cf7f1a8e8623535c95da6b0a949b564c31f4291ca8bdf69ff6b0ff64f20d6ba31b1d6ca0a874effddaa8819488a20f448a6e74f0b15a4dac21cd8685321fe52152e21972241f22373adb92568dc59d502a2b77d5e202c3e3ead8e1c3f3415363f3637ba161e369a016eaa16ed2445da454647484e4433c6dc4c3c3c3c3d34748494a4b2eac961c5e1ad0a5b9a115e5c6300dc95fda92b794da657b3437a0cb6a9ab5da92bfaced6997b523802e6b356bb1c8fd76a86be8b73efefac15a0bd1b03737d65a6b6d107c7936ffabaede4c229964897e708a41e4af74acecd9dd5cceed3c6bb5f1464d48ca2bb3a55be4268e57e61e4d482726674658113aff6f027584549a249783cd2cb51d68423007f055bfe295ffa7f520fbaa892e4e7a1a1a2a2a2a8241609c3e7c59347f7e889161e4a970d57991fb2f7342eeff7ee4fe966f0e39ce9086720fc9ee26b15d4e8ad54cb31b673a75a81495d48a8a6595a385e5f28204c423875c582d39562c30312fee03348d90542b29951454ccbb00b90faa3b99feb2a20f55e2364b9572bf76714bf4c18894b40cc33a72c487df121ffbe4feae3e3a6456b9226538f4654348b91fcb86b221968cfae920843460d8a1924330084c869f693c2b3d96a77b52ab6f969165f8333287b27b43d1f90e72fd6f9681658abffe1c9a4396c7d1882d81d8d8e07073d3ee32ff339ee735c7ae7359c9198b66866f27910bc1235b86163ff04809366a9d7995153695de9ab5deb7149079963d534ae92de2667f21bd59ab59d3944f4495ab542b365eebefeabbc9fddd643a681ff107a760ff836c6cff413432f71f3c42eeff6018b971e570b7e195c5d8b3f9084813c3306987822eec75b88137c09796caf057e00df4e97f2c193e3ee23ff8c5cc47b4c7d3c52332005d8e81b4d74518c60d91b9bead5a9d5c0e854154e097634ef897c8cc36fbf0ef2aafecb6c1aff5c6a67573642923a9ad95e57f3619fe8dbfb4af9956313aa5dbdc9c69836ff37937072acbf0237c45207740f6cf40feaab5abf8eb5658048a403df207957ae42f02dd23fc65036cf57721064f197009b921d20a6c96f8c666d82ecf4ca7ed4a08611095d54cf38d2692daa93490824cedbfee85437f363d78ab5d42b4075d4440afbf077f39c05b42b4eb882602ba32008b320eb93304228946f37c2dfb272a8ef60ef097127e44bb624f6700bae208a0d71ff1573b08c61dc01ffd4af82bf6b42b02b53702e88a34805e7f2fc148c31799e4fe276c70b0c8fd71a86b8868c056ef009e84b08e6c44a2dc9848f68f581cf2990ab996a5bf1ab664ca059c1bd2650ae42fed5bd380765b0279f22737446edac71dc057107cbdb73a68f5adb0f9cd448cdaeda93819ae1e044be011b6292291d1230e3c00b18948b4b1305828c36575eb6010bb5d971596c97886ffabcdd84d75407276b5bc75b6316adf0f040718846e13c3d53fd05c4e7d4be967d9a973d9c64df68b7bb86dd9f31787814420b9bd0c244601c2d99e65acda9539c959cd5e3c64f57d855d1b2fe21e280eedb5e39bf61a3a92d9ed020b652cbd598647d0285b8fd0081e2511a1911050b6b2818480008a4b5129dbe951292e01c9202a755113654b65137551546aa21f9f6cb1e9f3d3443e9ee448d956ea489ee4238523c9267228db0c9343b28923c9a19ec993adb6d1cb929fe59a2d4fa6ff55efc943525e9125b783e404f771299aa8bb508a6d0045190051063d42c67012914a0c214d3f18264f96b8c2d82e27c5b2cc445f15d42d67cfec421c79638eafcc1f567fece9578cd179513e9d63120772fefeb17a4737d129bd934d7839c89002134fbe3dc97eb5ab1ffbf8f2a27cba7ee81d63d0d6f92b49fd0cdb566eedbc3db28d3b64b45be38aebd6b0d3528bd96a33ab596bb76d5e56b6dc366f4bb6a66dde1cd99e6cb7cdcb922dcaaad4ebc411a624f2a5b0257f851ba2b2cd9bca369582ca5d3e6553b62ddbbc5cb62ceba2e52c578c666c755819bbc3f2b03e5a9e693e0ea5f8eb40f60969a607b2d720bd6e79f7cf9e70c4ff6ef5434c8ceeab75ebd7aa9bcb719f37255d3e202f21bcd56ffaaf3bfdb7eafe7bd47ba8db5de8adec4f177a4b7bd385deb20ffd6584b7faa653abf65a08ef37c25fcdc1a3fadd4ac3df2a834959aeb807383a214e3f48466ae512f1bcc93ea472ffd6b38c1b6b6e6feb76644e2a87db89b9a39252ef48ab893524cbfd31378643b85b7482b5f1768c31c69b1c3f2a757db794d3366dedc1a634d2195f01b9b607df0416c676394fd4a7c3b89d58ab091ad91a633bc7e544daa63929c5726aad59d65591a309d96de36a6ad5994c768a0c1ffe9cb6d82dc9f991b9835d3f2a856d4a8aca144aa556565856585858522a292c2ca88e8585e5c462e25858587a98b037acb55d65bbbca114629d4b7bfe9d522733ce723916c6ad4d5227cbdbc66d9c69eb4ea7aeab2998922a2a5b5795bacf4625955a59e17252ddca25d5a9545c8ecba4ba954baa63592975f3adb7d3f74cf1b781b875144bbbfa158bc5e5b84bf7f212dbe83e0f2626e69fcb894a1dfdbcacd4ddc718c7c0bcb8b0306ec9b162c1aa9514c65805a7a0708731c6352608693c250716ca7c73287bc442577f4a255209754ea75fe6a69ec755bd8ebbf2f7628f2f7db9e4e54718e45f7ec31b76bc7c095d2c2fbfc20dba502fbf8329e88a79f92be84a79f92ed005f3f21fbe5a2fdf832f1f2fdf06be6278f937f0e5bd7c21d0f5f2f279803dc017cdcb0702be6478893f23f028d7974aea954be2e8ea7f5249761fb9047593385273ea536e12481ca959f5ad9b24c9138f43ff090fc70aec59ff44c571028b238e3870ac58796bb36d5ea96489bcd247486eaacbe3ab52777a6bb7544d8ee9f17566e66d8f9bc40a7fd2e3354e47cb2caf399223f5d0eca4f2c6dcbaae14e4499e247934ce977cc9e6c841332e67cae06ad8233fa296cb99279867f2efb80d6b529ee54ae8a5fcea56e8a57c8edb412fe5636e0a7a290f735da097f2acfb902665835eca0a7a297f8bd8b82137a3de7676de18b229e525ea65ca9bb81c95b727151f6718199dba548b8ca2a20eb5e2392122cafe1505478a6a4b5d999fb747ce71651294289367f64c9ff933a758f2d616dea449f6af292a1b0f20169797f777b9cea43d7f9517ec432d5702c1b4869aa8703a360cf3ee6842e4ada22b8dae3ce3caa32b91bc95923f90c657dbbc3a8456dee872bc8acb89791b3b1816ce2d34a8c79b71250f39eff11e5fe23eed79d08ccf4ce486c0bc8acb818181813e85ffc41475739523874b0e15152ace815cc5b990100b0b6b9bf7e61c57fe4c41851cc252c85b1edfe85a39585e85cb6179695d88c3c2e2495838e7e1c9fe2b96189d56ce8125d016e685a9f95af3b6e626b1a2e1683dab97965a2c97d9c2e550976dde17d6bc2e2e517e9b7998991eb88d82bac85bfe33b7918edaf37ef11c412ddc4441dd242666d54c7a6888ce98bbcdabfa795732bd5cce184a5da6925d2e4c528a028777e78fb7268fb7a0b4b7f4726396e1f64f50fb78cbfd696e0b7903b5e72f2fff9e67638389e09837257b77f64c1e6f2d399429a8106a4fc95b493a5c66c1f2e70bb576dd6af559c71b32a6b79107e4b163470ba5a4a7a7caece0dec61eb0070f1e3eba4ed23ccdb383c7f6367ad0ebd1039e720c7ccc9a139b186589c2a3476cc196e74d2a4cd947941820b9c43285aa80412a1c14c7a5a5dac3dba252a7bd8d3ea00f97b2c5e548a5f63cc619a53d9712eb78ecdea75c66b932a93dffd59550a22c29c5282d382a29b1e89449fe923f491ea7c365f9f385996dde2dafaefcc911732515b28a2b9b786bc85b422d4e27cb72e80d9a2d7561b6994628edf9fb884949ad6ddeec0c2323358e8e9eb4e71f0317912acb8d64c4227f1bc3362f9623138f5b7874e2d8bd3f2f85b94133bfba412dd6caccd7d4db995ff9fa2b9462289f4e3ecc2ddf920f84130092990b715a64e086481c95c8c0c59e22ff1e37fe04451f6ff9c7355a327011a83d19381f3cffcb50531395ba4f26cd1cd36ab5b084d2ad57b5e41843c2609f0406471eacc6668b1dcbdb70392ba54e7e5e66b135dbbc327fcc5d220756c2650b9553ca296cb81c9636ba4f266df37a5edda099cf71837abc8f2b9362b852c95bfe75e6637a3c8c8fa7313c76837a3c9c185e753550730b0ef2f12b3828867fb941ad77b976e626b1e289c799f9c8e9649905572f7471be9cb911fe9818cbcdb28c4176def2713dfff67cf2f8abf5fe32094abb94da15452ef9cb93818aaec17f064ec733c5f26789267b770a75cb9f861c1fdf56d1ae89552b2d548ab76a6161d9796715ed7917baf9dfa422bb507bceba40a0756d524a29e5a55f0397339fde49457bae5a41a5d8e0d09e3b0f42526e90e7a104d0c3ca0d6ab55412ae2e035a88f6dc619e6152d12e3aabf01c73fe9434609886a97ab922550f6445fec8292415edf97b57b6ae1cf2967f0d9c4e2bcfeb237b574ed12d7f1797435faba99abfba10d2a8708f7b84b7fc7f70392b18ca2c7f7046d0b0cddb3300d9e68d99d2e0dae8ca3f75355073c512a83d7f205c0e0b9651bae86f6b88a175e3ddc4dcb0a8566e522a3737f3615e8129a8972918b687657b127717e6d335719bd592a64fee9752c9127894a52d438b156439253cca73283f6010d4db87120b33c41b68ace9b7df5249297fb4a5a661960ffedaeff86b8f24dbfb2d91ed6bd7f6b6ddd343cebe905ee14f66fadb4592ed9558883534c7c7db728598fd36e5c66c5ffb9f9c7d52b6a7cd5a95db3de8ecc3afb77bd061391ef9abababa3fa9f97bf78947229ea6690a63fe5ce6c53dbca66f1b7ca36d3b44b3fd380e74f897cc4b3ca2aab3c7d152ea762a892ba3247952ee57aae5ecaed5ced757b9b85d339fd8663976a4fd37eb342dacb425a8359c5e9c4cf3e55dffee95e402617899fe16f753f999c6393c99a8e1c2e0e3d8f731fa63cecce9e325386fa2c0567d59eee7549e50d6b5f61bef5e3ad7833229353f8ab2951e5462a221013ba2f1ec523352252bbecf7c727edfa8cdc64edaded4e167f2fb5ffeaf6df96e35146f2d7fdfe98148ffc55fbc2c6abf6ecdb8f5c8e76faec72f24fcf597c44a66cbd61120b69af5fb5028d04d0a8ae3dcc5d99eb6909fed672dceb7899dfb086bfd89db89deee777f223d206b3956fdfc4e5589b616a912cb1d9ec377a8b9c9e899cdd0d7f48f22673669f6a4fb110cf5436fada0b699b15a97f42fd707a14fe3ad78f49d9be0ab67fdaaa56fff471cbb287dc004e1a16d24730ebf4db63d95bfc0dc9de7ef676a3f64b3db67d774fdc8ef6d6946d29acb269dba6c269f88bdb66fba79e4e17e66aed5f6bf1866409249b21d92f46c91ff647ba087d26b2cd5ed6b87d448a3764bf61216eef17a168d9f6d86bf88b49197beeb56f41b5a0abf8487358fb4f62cd3e7ded3f0c55fdb5e3b587fee2f1dadbdfee776d6fd67ee47e98d9fe89e22c22c51aec532ef7a86b7a1e57c7efb8322fc4bbdb65380eb587d99afd97d92cabdb67d43e21de8031b1ffd90d17c9f017b39665df9c0fda6ff6b3fb1dc12cfaa7c7ec63df927dfd2f32c9278cfac9b6c79e7b99d3c93ef6a61b9964ec376e27fb221bae59669fe35ee372386d5eaadd8f03597b2b37e77cd0bebebddf114d7b7b65a6f5bb2edfb7bf316997bffd38d42e98edc727c41b62c66f7f723916c32e26c524edb19e5c8edd308b5580fb321f047e1d6f0088932404f7657008f0eb7824d9deafcb36bbdf1139fbedeaa8d86b1749ceee11992b8e4f8835d80b716ce27b2ff456532431ad83c6c96b46e516447128c7c8244728178049f943f2938b989e7bc8e97c3029c7df4cf88349d9f4dc67d7deef26dbf8d595ffb6d47f9dca7fa99447fde792e3bb5afe93c901e63f8ff5dd7f40f2ea23fe72b06ef7a073d6bffffb2be6dd5ddebff33f5d971b9f75617b7f61b7626c72cc2db77bd07dabf75792271ee7e5fd570e93e3d4027361b75e2eec1a72dcd58dcf72e3abeeca4da9dcf82917b687ea2e924ee713fe4c2fb9bbddcf084cca55c3b08b171bb9c9f523e7430a15629c40e6ec529b96a65d38a3f317d2357627833032990516389863582105192020c115a46053041dc0400a2f9220051a69cc00210c2cca905f7cc18c544a0fe81545531c91e18532d2a8a940118c965821045d2c6d81240910d858a38b1ff4e00855c810c7146cb0c408418002c6c4e8133c0a599eb2945262f3076060d6941aaab22be38aecfeabfaa9d52ac32fbe00841f9091bf141324424a442842146db4800c10d0644ae913805e60451661d0c2046bcc208162063ab8228a272298420f742284a2222908b1800b2f5001922652c0022fa054e1032d92100306d678c32705638c000d38280085102c010c3e70428c3454a0833c4bd004e563e98d2564618a204cc10b27aa0cc328c14fde320ca3044a7870aaffe190b790e77449318ad12235723021ae4c8c62188629c933528cd229461379ce39e79c73d229bbfcdd64ffbcec364c58c9fe9f46f6affeb04b752bb2e4afc36880e4066f2ca10655a0a209152b7843250b12b45a4a4b6f20418c183ca1046ed0e084c70926446902859011d8607963b461822c0425a9a209a103a42184285c117484262d6822846a92c54a8f0e80a00a1e1af014410449ad4412d07842d1154a50a468c282d317455fb0f0f0800ac200062d1801080a2c766448f48328792543274d7841b6a7c6648c3146ec73e6ab8abfac7ef6125720393e9d32bdb52bebcf1e7b9bddacb3ff2ec35947b386137fabec2f89d30f2512ec8c5d3fee2e8915f39f781c2bbe7e59fbe5530c6f4822cadb1906911942576ff27ed2d5ff49efa457f72d7f1287ce4d4a77344c1982418410a40007988e9a2118629cf1ed922b1799a8655564f9f2a594f3b58c28db2131fcab95642294a594524ebcea9794388637a4e809a3080a3c4fe07c9d1458ecc8ce86124ab0851940f18612173ccd300c2986a81443390a012261074f480118a4d0061c6cc8900104a51b9c200a32bc6803073eacc0038e60052b7e94602145131d108c104c710537a4001a9ac2a43380418b194001470eccb8c20f70908121c619151fe1048b2df860e88da325275b606122fac1095658748195460c7ed4100a4113204801165d9ca1e3d260c61551888146141de8400d33a4d0841751c0d185164dde50b9c1ea8150818b134cd10535a0b002025160c38b2994600a30d0c0a2e74484c50a52626c60030a39f002880963f07ce10736d30758c068cf393de98e67b0ccd0cccabf68410b9ef0e2c4f5feca65e52f99309a0c25f12294e9979491f1887c804617f993b1992ed0029327262666a04e1912317152853a0140a1ff40cb79e204651c299d91021b00592fa230729836788aa068030c5564714406231862820c4c90e407075c184e74215f7a00c71b58346185132dc280e40921b471f402378848a0051f8060fa000ace450933d0988209d800c3164ed05d0c010b52765d4ab5247f1d36038c4e2fbe088a4286a80b1c0481408648e6c8f08b2f4c21731912f9000a1f87b0a31b327acb8e328bb531a75b2ac37884ce259555089b4a994aa9a4a41ba155b0fa5641173fc2983928367e104218a55137bf4e77e7813470361736ab189dd21b9f20a4995e58e9de10b634390c96a8a0220987261ce548c484496e424fc6c186fee7eeee94fee7eeeef47377772a45b77279191610f5614640f3e0507c83b6affed27092276e70ea6fb8a7e2d8efef3078b5af370bd2b27b4496ef94523a25cb001027fb2520110e07ea73207b1a72b3fc6166390622c336b42512acc01e7e16376bc57cec263144e6393de0c94d4b02019187878707cb309c611a86b0f56559a23090fd232a3bab00f6b50fc262ed8380a81314814919090e129cfe29f1179364df25d1de2f4a8a0e09b89471ec47f8e313e2f44aa7213a67aa38eb29a574b7c229752e875a91b19e66c89652ca295dbaaa8d9c070639a35ffd24c62e76b18b9dc48d14db62aa16c4d89dffe492c8a12fb79c61a9958b96eb8d497894c41ecff51e39426909253ad72b01071831820142cc69ca3ec6cfa29d37cb35dbb6becd4bb3959356bf718af8f3e37149f4d14cf3a9cd90d3a2504400105b9609b9b9c938a86932a90ecbf065dd524652406c6cecc62591135fa65639de204dfa8ce7c92472b0e77ed31ebe0b734090f6d6469f320a75ab7fe372248e54a42215b97f2be23a42192b6792a658dbd485c79350f7d57cd42e556ef9014092b760927d87d2ad7f67e6aedb917593b5723b9ebbb7d936b91ea05f91fdb99dcedd5bed77b4ef1e7243b4ef10a082a123007aebf326d977b0ac3dea6da761ed23a7f356bb3b306baf6156ad986663f616fb81cbdadbeeeeee76777797524a39e79c94520cd37057830efbcaed6c1b8759356f18b793f25c0ac77119e0de6e0f75302ca7bce96239e52211e340e11d2c7710d29cb0e93b56f7454e6ffa0ea35ed0b1869cdef4278ce4df5efdc8edac64cdf4367bbb549494d4a449ec8171297b8c31c6d845d9fdbbbbdbe74f76777729a59c4db2cf499d9ab0c974bb2a3aecabe9d461d6909abbafb9c35f06f2f6ac21359fbee613fe3290b56f6ee7f4a6776ec8091f657f1316d259e1b0ce4ade306ccf622ae4f991fc9630ca467cc8b3e8e23b769f0c753cf1de011314387683c34dcf52bb5437d428374d83d223da051a07fcd14f8bfc4591bc75d42eaad45e1ad045dd805e11ed828791db89a07f015fd89207cad8923132b60408b624f73b96047b22f7633c14c95f4ee3a04b4e91dce512559abe5125aa84511a07ed42d02ac34c9813511f12604348b0f614bbf8cda1ec9c9bb8c86df369876d12aba6b7759b950b00928c7a4127f337af68d3db6c9a3e243bd99bbeb921d99bded2cdb91c2428c72a40ea557e881426cafd2a43406f7db3c90ecdd96f54879eb8ec23a713e3c859c718638cb1b91f54b97bdbddddddeeeeee524a29e79c93528a6119ee74c0bdad5b763b1d706f35ee85340a85b9afdc4ecaa3525018f55c06746072f728ac63b90e2311b9b712e374684622c64133e436bc43b369881bb23dd603ccd96b1fb99d9d1887b55f218410421bb326b9fb638c31c6bc257993a4fe598a452db91d9ab7b7be61b7fe24b9fbe476a6c48aa49494db9173694e8cdb71fa5121242ab7d379fb8e075df6da67dc4eccdb5b6dc3381fb0ccbd357d483286b1af19c39efb9ab91deeb7776e08a71df5fbb4f8d37abcdc479f3cca8d3f3a5f88538961078cb2918a832baa5360985c7421841c5f23824ef8020a8d880c4b34893423ad483bd2d2d08afca52179eba85d9a52075c64610d99552e9c9069097028a5943a96557291844c95e0504a29addfaddaabff75b9d230327d497fa394d2879576f1e96f94523a65b665d84512bc9067865d28818ce904181946318a9d61293502bde95c6a14e10d2f6e300436ceb8c9be041e0415818b29d698010d8ae88c22053ce0c209b4b0021a5cbc20e3c206f72524094c8c200223043dd9019d74d225191722d0a670c58f1fd9bf06613af542a80a958b2632b8060d7ab20004161441698a2048810b821b26578a1b5318630b1a5441033004e128086260128c4c6267582f5460043ae9945dec32f4420530984e7c64010b4159f04116de28726203339c28084c566ac8cab0c21a50ae808617521912050128db0cbb98c214aef057e3c0af50e6e5c37f7ff9c3f7fca5e978fcba0fbf077ffdc307c25f310f5f087fc1bc3c7c23fce5f2f08f70253cf2f8abc75fac872d0f3ffef82bc7c3d5c38f42fe6279f871c85faa871f9bf8ab47ebe1c7a268b43d547998827af871c95fddc36f9eeef197e9e1b78ff78fbfb299ec372482a8a7e78458a27bd3cacaa3e2a9d5f568f5f81915cda73c129c5327c36332fcf64870682e102a1feda42c2b96550e1697d58bcb0b4c4b1233299615cd4f9ab7ac9fb949c44f028920b2d77ee6934022887eff19bc037390fc24845822e6b9cf5e8825fe4d49c45f59f99abf8f04c7c69bc4cc23914410ac20bc4f7d0a7f20e6bd8738321f042b88d4fb781ff803383bde0010c7c7dbc80121f391036207e480f0819d38f158b9ac9ac78f04c7ce5c03409c24dea7de462e8898f77e4688ffd4434e08eebd879c10a64f61d6ccfb23c111d242dabbac99d71e094ecd0542c7dbd64d7d8fbb12717a5c56105ef71e660581bdf71ed6baa72d86df1ee2a8546f5bd7c5e55df00758ac7d59cd0973230ee47282e8bbdcd6bfdc1e0f73210ecc0b69dbba32981544eb655e067f20e65b98158416c36b3dee0ecc0aa2c7b7be853ff0df03b382f0eff13df007bcf787381087c78d38366e3c82640e103c5e487bbd841541442cf880083c383ebef54b30e17d8ff7d1c24c7818760d5f5791e37f80891e98c7d5b0c2121e9cec33211e3b6ef5567c99abe3da782b3ebe3742bc15ff6f0fde8a1f7381f0567c982b84b7e2bf5c07782bbecb35827563cb8d3e396e5cdd08e4adf82cf155370e792bfeca8d4dbc153f752391b7e2abc44fb931c95bf151372a792b7e77e392b7e29f6e9b6ef7782b3e77dbe7b264d8703ca2c1918735f3ac20b2c79eb7e267b8812e4b060c44c5b108c3d188060341f111132bc19ac14048cc0aa21fbfb7e237ee1f6fc5472299f02191726ca1fcd51cb700ca9008083cf9eba11c9f26432220b8917b0806e9204d3440e3546f15a1fb7a481ef96bbeb104c4c3c3c3d30451137f452d626005d190d011528eef4042fe1af217129cf8de04a3c10d6ad053e46eb4e433e42f5864e4af152a7c210b3f3c38118910e240f257c489df4bfebae106464338f19da7e847f27827f90be2788f1190ecc9b195249257312bd5e20b21908ebb558aa89b6d689ee1634ec3088115462033b1165580c28b28a67422e931191269314656c9f08b2708e5afa35db0b11ac071200cbcf0c2093d5a7091444786445ab8408b1244d1b4242c246191461a2100230c1340a9370072c40971aca0c9132ba8810856320cc30468649a61182720816441193f613401c50a425a3c51b34892340431a982073ad801d29227154002139468a102276c2086d015d3891016dc0c4998c247054d28420d4630011c3cd182163150020ac0f0828a13d0139080fee041054544c0c1185ab0c2892dc32e965ef075fe62acde82b7887f96a17f3b131149777c823a18a2905286886a61043259407942460a61e15f300304591839e1850a74906586445924c1d77cd117f6b5622e3f76b0d53fef6442c6222c9471d48e1a49edc12c73d7ae0f096a470d2736c26e9343e8c547d5f6baf61a07758e61b76044eda871467b30ab6448944512327c28032313fc6127ebd6bd572901198431a86830c810cadf0a0c22fce47e979691996e5ddaf8b27ac445fcebfba7c59fee5f679ab30c7ff1e5db17e2118925327d1b3f0345e447b911755936b921f333fccdf9f18bf8d7b8b517313aa9a4dc90223e8b78e4fce72d225f6efd8a38fd91b3b191b2d142e8e06aeb52f1572eb17749ac88dd80d7b44ccb322dcbb44cd328a5af515a5d56353ea59452ba1d993589b5b1ebbe914ac82d95658c2eb03676b0dff117bdf6a49432cbaca536cbb08b61987c2b5b4a4823df45769d90761c743219a3f5932ee91dfb064aa94631a554a39452ade28a39a594522cb365918ac052ec78560b638430c28f30460961062184f57e479cce643a7f66eb5bcbb9c9c9e9481d8973c5eec54f26d387f8fd25104843e9f73bad9fbb3b9c360b0bf17793a3cdbc5e7bf06d47b7be2d91e76358c5b08a61159b55ba497273a316d36a96550db3749b9c34f9a9bbd8f0648a9006fea4b13b3ae9b0d8bd63b748ff8b31628f61ee2becc69c6a1774c1307c24c6ffa17e91f8186e0cab185631acd65ae7c4a27449efc6b05a6bc5f2218df6b53d6d62188661988c31da98137fd36e0c42d75b8c31c27a84cbce19e3fc2fc6d83dbf678cf1e3cbe972ce19638d3fe79c73ce39e79c73ce39e79c73ce39e79c73ce39e7acf588ccb1b66036abb8ca2cf60d59fdac1ee9af5f5fb6576b7d586fad5f718d314eecf08ddce4e8ef238a8532b2c77dcefaf256af9b1b9d7112b1ae9e496ddacbe5f85b6bda22e672debd2d97c355a2d46aebea9169e3a7289d696f4e19249f4cf625fc886f95b1f9edcdef2dbaef264f4cbf6640e8b06d9b73ce59dba31ba5f4e71769a798ce774d4aaa517a7db2bfed12f8953f6f2b8935fe14774f9720d6f8cff75bdba73dafb5baffbcb57ed6671891b15917cb7d86d55adfbf564a29a5544a39a7f6a96f4ffb6fef48f62d4f29a59452e2af72394af0f0f0349169bb28a5e9fc338f6e3359cdfe357bffece96bdc10ffcc9f62f78ed5c896a5fc285dd2bbdb9dfa26ff73770e4af993524a29d5b417e2dcd56a7b765a7b04876c629a922ee99d63df50dbeb1f69e9d1df81ccb49775028034d95b779cb9ccfedbcbb6eaee9eb9bcc9d967abf632235976c2de717452293dd2ee1e9d74df16a19396ffd953126be19b93ce5b7eaa5d2d535d1633d93fd5aec6fe9b734e6a043af16ed2999af34ddaa9d10cdb52edfa5c3ae96472bf4cbb646feda5daeb4ee6944ba0bdf82ea41db3867c31cf23324ba46fbe4492ed9cf42546e99029bf2333cf9f1fa514c87cecfdb2e8d75a6d3ef9f3e91d2265c430ec33028de8cb09b921ac21f393382233123bb3cc901b12e7ed4c718cd9e57f8e9390d9c88d11e82423c9b65d4e8a6d4ae42d2620ca1659860cc3b88192aef02de4768cc87362f3b18fde5cc9df6ecc5cf6106bcde93f9fa57d91eceb6bd9d7cfb0afd8883c8dac3210f9836f6495fb3bbe6bed4016b66bca0dc3b0ee0ca317e69ef32127ff0664dcd9ef8dbfbf5db55f1027be77dff93de777fbcb9ff690e4e912238165dfdaabdf5e84d215ebeebec95f0fb9c8e9edf7d54ef8bbc9a7b78f5d999cb9e47eb134fe3216fcd5bc72bb07ddf6f151d7a5bdf7bff1178b0bf5fe3cb42be5fd7b6897cafb0ba05d9b296572317daa3fe5f6a33afc9d5ebe10cfa72424b7d26ecd2e362293e947ce0797266d4021d3c7aa8ca75a86c1fa43990994b557ca76db4e68745fd5a9b97ea470d3b2d30943c7906805f1078b7ec31f34d23044fa6c2cb41fb78ff6b32ccbb22c833088cb7f3639c39f1120f88b1cf783cd9afd8ddb49f9967769177c98e325941cbfcaf1f62d976353d7e5e9ad2a2915cbea21647d63f8eb561afe3ec39f67f157933f98846ddbb61d69ec16a110b56d1816f31a0af5d90b69ede507147ec15f67eca552d658f8ab415ae1cf5b020bfebe0c15fe5662a480ac0ab6d6e2efb336597b5c047bbaa90c806a9fc5fc863f9935ccaa2c2fb9d38c79d37f17b74df5357e4aca6f3676fff8ab89c12f98b5c22cd87e6551e1cce56adc8ea6fa2ccbbecbde94fdccfe943d97b14855ad1308c330244b682fa14838f25751d8f6128a8c523114ea33a9545f62a14aa55c9fbe4debe640016559fba83df636b9aac822f651311e01a9680944653411a38b6883f69f4dd6ec57d4db2dbb5ffc28ae1845550925d6509757b930bf72e3a77c9fbf9ad24674ab677931ffd554973722067f35de0bfebcff15fe56f9834927fc7547d9293b695a26738659ac8f4fbdd535b9e6bfab99112059fbcf08907cfa97ff6c72d44ebffa4f7aab77f9c9ed685fe4e4f292fb61cb9acdab6573b3fdcfcb81b2f87bc19f4da62fb1e0b2cdccba30d3cce280c442bc81fe7f3fb27df8cd600448cefeb3c9d6e2cf0890bcd90c17d9fef4f63fe9c3f6a7df64669d1e48b637d9e290adb5169221adfda01af657d206064979fb01a53ba8348b180ba39a748a21910100000000d315003020140e8904e3e1384d43d10f14800e84a8544e481ec9c2308851144429660c31840000081063666868260e9508ba105d5b444b511b30e76e69b6b60c4aba29bddb069816740e87e2b6d666fbf09bbc3e512a3e617b35f85c424980e76f56574341f1817986610a2129875f0e782cf4715a41e18c202ad9c5aaface8c912cff8af99a4be08a2457f4de02dee98736f7a98bc33f6a7dbbbcca75e5a70922a3b544af81b28be3a41ba797450a3dc58dffe5866a449f069ebf8aafdffa2506bb8e8f391c063eb86093dff15088fedc24ea87a4a9bf6cb869d0c3cb8529d89ae4463e8f51916d4ad5c3bf2f288338327b69a3e2288352d7d132cb1a81db96dfed08adf8b5a06b739e2910c0c02f7f3b5a3549e0a13275d6e99220d754618479912d76ff7dc166bdc22f6353a722db7cd3592ff5b1d1e93c9ad325b6e5f732eca0f5d241f02a94daad816a0a0fba28536c7c356be3ce1d90c7c7beaee5c83deed1c91646892c2542e7194f1837e8e199c2791ff257f23f3b474c6c22310ebc8fb0ca91549df388568bff86151808656215056c1afeca2ffc455c88885537b4cdb84ca8cc3e55f03c091996c388f94c130ede3212dc7f24b05a0d5871095cd3ccb4dd9049b3b73b03dc3ed3f874c9243014e567326b25b7dac6f1df0dfd69dcaeddb6341f6ce0921a3ddf11f2e66fdd9400cd9d63e03e8cd6a1ff0e00a69366c442e35b9c4a648248a4d3ebe1e29b33d9671f5f5a3d8aa23425192269e5497591d8bbf71f02ae40b74c626d9e0f6a0134ba5432e9ccb10161ef224a053c7c5230a8febd860b849a2817567d6c466d71c40ac7313e1220842bd2b09546f8b7faf1b10534a214efaaa555eba56ba7ae29ac6ebbeefeb6a5c7e857083b11c65b9eb07d54c51fb0c881055997f8e0f1d3ad5ff512a71e1ff040527d25f7df4e9c1e5948b18b83b13f9497a67beb40c63af1161485fe92b570cfa8a54b65b64b9884274e589fe111666bdb4089f126809eb1a547b0de9fc49c4ac23b95d34d4410ae3cd7d8bc87f0d7a05795c7a883596ad6235afe6836e5f0775f073f3c8d363ed4f37b5845eb41e28df1f358f610c004d5bffe8130a8c5bdb55ec5a1352fa4ce9535b7deead8f8c67d2027d20cbe8bf612a28794e1abf25137cee01c6b35491cbb6af806720c83f537c02683ab2e652aa5fe81326af15c7507653566a4ee0151522059a4ba95b59c7ebb3cd8b5ca9b713980c161dfc754ccbebc191a902d8f3c81dfda2a94f793517bd8ae4232d5baa87b59fce61f381ba77aa50c84d96cc20412289af4b9d0048fe40104e102f50057de63f9dd8964a764c0f70126c59e44de43a0d9fc17798a5ae2fa451806f10bc4fbe98c4bd916ea0610d25fd7e78840b8abbb29a3feeda5041c594506e2e7758999d0c10a6587d972fa0e34f1033b1887785268d6355265eadcf6e822533ca1ccbe1f8ba3ad92185e4b9c5784ee56c4c5c0519b5ec5cc95911b1ef65fee57bfa8ba520d37392d10c3f065b62d352d81bf8040bc05d4e44ef07b483a3ee815e362ff3dd7aa65ca4ad0407fdfc82e0f30fdb09b71b94d98bd3df2f5b598055a620a159ad7a21a03e3fee4863cb3dc0952c698fc94d75a00cc03260b651435fe44f6d78c2a5b9fefe0c9e177ebccf420e82c00c2da993d5ca3fdff083fca128f1b2106b8abf081ded1c4e5f30ce92bcb7ae2026b671ac8bd775841dc10bf28fa2a02d065f6a6908e15afa95abcc09873808900843762343094e0c0601ee82ec33406bbad75c0c5f3b909023e8c5faac3b2ab55b883587ae43118f419162d596c6f087f208ecb403942fba9d224982dae763bd1577b10ee0cd825224652a751a133d4586144500ec3eed30d312ca22e620c02892e606117d15876d7153644962fb0f998b0af5efb5640b4d9adc25efffca46cb9b08f8be767d481e4365dfbc97e319a67e15f7133be9312d9c9e055c0939f8a2ec13cdc00787193764add653411445553cb202ad8ba928d8eff4fd1dd45ea00d3bca50dc843f05a8874a2a34fb627875101481cecffc41e201c25336455e7f8812e20c6ba75a7f26bb465d73b1febbc03a00bb4c41e2bc1f358891d04f0d46705dcf318d6049088f60cadcb32032ac870b93ea23786d701f3337a0dcd7af079d451d7474c4a9ddc2a18834be662b224377258b0e99ad92df71630199384b60f727e0360e243c936849ddb1061a3b81cae9bbd545177a18aab38fa6c65dc70f71e74042de4b2f3ad3e0b7cee50637fc8e44a08b112d1088872e2fae115deb44ed3d31ecae688580f49f8a84f3729135319ebe03b4038b2e367c3f252b6e2588cf318a11785409fc6191dab054f2b52dba7314c27fd6777ce3752077c06c46c58cf65e933589323a390b000d6ff926db87c3f90197e902aa44f19b31e8b55b330b1be7a34a1dc59fe16cad36249fcea235b3e3a88f1949b396854055a1e2805b1cc0c83b33c951c9417b326960a2d3a2c4403f5f2f3c8a4a37a05956a789ac7dd6099ce43463ba0973ac151dcb7f50fabce96a96d7d534d3b4cadeaf8d570f61b681a17beba232895218f9751387b250789b58480960f9bd88eefa86fd5db97b4656887fe401ceec1912aa6e4dce56e4be179d655c21dfce2ca9064231d605f112152b5bc032f1714804980e531544b33a6b8cc0fefd9fdf58db5a24dacf4c49dbbefdb3086fc8dbbe7b78a52468292619cc5c30d9eba048cfbc6a634980d8d0b5ccd08e59a0bc3b7436efb253d221842580d5be499d1e29b0a1bc5b06a9463f1c0595cf3fa2b0d46994628187917f5911b9762cd3b58de7b69c072c938f3b1385d8be6fb069a2de93a2f490da6547d0350351c8023c5274f5e3b560951b85133e8f8a930ca11f860b9f04ecc6a8225c3db0cfc9807ed005c724b4a08f90c178ac9097d1cc004d6267ea654e1038ccc45b3f1f0a1d08120c549f9e6204ff62f89035233aefe4312b5a5ed5d17c3a838ac73fe01b33af941cb423230697880f82b48777fc45a697a0810053475d5ecb408c8412436e4087469417edf32894c7f8b796bbd9f5e92c8a94bb0c99f886c3b2323b2c394d7499d4846d2fe3920704989aaec86d7780b2cb0e2ab42eddcb5d1f1bb1e83f93b6a40d58eb7f9bcd1690b6ef1ea5fa30f272390debbbdfbe938a6cc9aca7c5787fe47095f0ab2b15dd9a1e5f2fc2b1cdc119885b7dfe9a9a58615c2434f60ab26341f0cfa7cb6f4bc9a4f9114ba7fbd58469728150a3a33239949038c927de048015c5a9c3a2f8fc1600630783fa9c952d5678479c6fb5eb4ac4a8bf6ac4a0a989e8c03e7c131604eec70723965df30dab3969d3f6951e35ed0ba0fc33ff2115cb4cadab2fbb4c17640cd5179e15190ea635e2634f1ba9d57e396c3c9a5532175124ab1d024e49b8e1bf0565f5ef17f5a297a27c1ef13bc3d02dd41307b09bc9bc0f711685702ed43f05d82be4bc0f608769f23304fe2731a5e529b597f92574ed3b8ae805e29daf5357738d71e10ccdd22b5306592ea2a287cdc45fe6e154109b83711da721c7d853f60734be34edc01648b89db78f1c94e5dd50b4c2e8890dc2d11690926acabf8322f5202e5e4c21c3813f705946f87b6e038f0cfc8ec84bc1530f9f49b8e3a02ca0e2cce22e316270808b4ccf8695a655fb3538d236aa05ae7ff9a32f36f0aecdb85dbaba51ff7621f43ef448a2fe9f220b41f41480421cbcb6d91005a53278aeee5c877d2bec72082c5a0f4189393a0f6e0ae768e2d1958584de3c19dc2284eb446307ed5c47b84a328fd452b571e7e81a213f928b27628f4c084cfa7945b24658a7a8768ca949b85e0a261804bed03f85e956d7c50b10061a80888e3cbb51ee3c1dba943871fda668675426d78b17682ffd88ff9b0db44e4f082605857f0103dbaee2104d85b5ff13fdd8719b04867b9c17e1f215e6de60cc80830ee76bdebf20119c5400100d22b26e748323d99923feebd7031cfbd061ca2b9b74325a9da394f8d4cd2bc387b75fa46d05b322fef2bea0fc968a61d5241ccd3df269ba1dc579f8f2b4a244283f9a69e5d0b643392f35e7d9e9e35bf71f7d15a79897d87c734a46cd6bae38e0c57c42a1116c10d67c5ba5069644da9b468d046666f6e221a9739b43b9060071bff2aa6e80f8cd3c08f913d9c5972a5fa628f17fab01bf925347439a4522c8340a36ff12c21e837b59f0c6d761719df830856a67689f0e2c546c6edcdfdda0e0ee4249deebbd9957a148b615b6429385025f97860d738dfeb792583d34d871cc949269312a1f325c700326f7981676ea4568d3b67e249c310d026bd487ba3d2a8e1b9f6ce9ffdc5bd7621203dfa1ee835088479569f1e183bbd4ecd463c46e469194d6cff96711de2d3748a4a2310f14d006b1cf71a14b8515faafad92f321d5cc686128a4445172f8db1624e522d20563faa6cc0f5e640862e84e171139caa22000199c886b65a951c7a0eebd3a9c8c93d92eeb29147b6d705f6e540c88bc6c847465d8059da590e0dbdf6acd171787a7800a0e13f73df78540898c7561479a0e363ee692a623cfa1f0ba3b1bd046d97bbab28f120a67f27282e21ead4fcabacb84df934b6e2733fb6b50e56936a285cef6b7c617d90ef5ccaa312141d0d8dfc2cb04af483491e875e6f5ebcf7c69257db1f8fae398519807c856cfc3efc5a5a4081187249bf9b7dc3004c6c447e14e1f0209d297ba732b93c053c3085ddd9e8cea7d00ec9612fbb157bf158786732c3c8e3222a202678d0667c96a1e3777278004330b1230536c69e5106d681f349399db18eb9b1a7b8e9ff7ca00287a7c3349ee0d0c779457f63afcdda87557af9e27c7a9a7ed06a362980be999da3c752ff5fb58c22164f607a11d8df7d930190f7c1170d38b3235bfb7c0d9b0e37b3eef0ec5760fbbb80063b50b9a28adf0e5d73130177ecc7507c89ab5b9817dc77e51c57d1743dbb1b2f025eed59e09b190b65bd5ff6aa086e1ca6ea573fd532fe33778ded4a182b2b0aca8b1e3e4dac6aeba0fc56a97154968d0e46ae8c8c015817ca9414bac38bf588cc7221255b6800004ca58a6d2daee6b1856062e7fe426b3f81da51dc34d08e8be33171da4fdeb656cff88fdbd4e1837ebbae4fdc62f032ded2624c44ae98d51e0b445a6164968daabf745796db2d101a9c7f2bd5094a97223fb3200eb09d8432b1c9e1628bcb86f537d9cd953e6a7a8c93917a08e121116ef6bfea23eb495b6a81fa9d53445aab4ffd88ba5be205d9aeadc2de57062797a5211b556f83b0a7ff6af1dd93a77106870ddaaeb0918716fa95f457b2f605e5edca05366babad6232d122b58688d27802df0488ec4dd5cbbdd93147f25a030f9edb2ebee7f72b21e28407e09719c0ab65ca00204782a00f6dfa118a06cf35bed338a6fc7bad734db69d4e8b5cab7a5b627483eb4d0627d8c95dc3384f34f613bd03f8efeb230d3e5aac1461070801372e8d5174f4029340b6425986b312a3c5a9279070588329a888e0cef1fb7fd45915b8f87a06b8a22a22e9f4997d50698d352ad2bad9368650ee7e2fcccae464dc146e9efcc02a2293be575f4024fb2f31a5af8036e7b03d9c99c22564f50bedb3ffe796983e80aa8a69f1808dd858e8941387867d9c61a6db7ecdb28886bdefd02ce6da312647ae82ec5d14a93e0ec47b267b77b4326cc8e25e6947470822d13e7710b2fb429cc9c3a40d91439995d0052a82c0ddfc5259765d43f916f48da4a878c13cc385002410148b71cb781a23c19137926f814e718592fa3174b79d9acb9220ca501626460bf9b7e0c1247fb71a53c6bf2e6113c1adc10127c2f75748b3e1f0d586e648575543a8908e3f1c50a967a888b18b0c81f8c5273379f9a5c34cbfe85c0fcb72f379443621b1595daa34ac490902492d6e9194a23db040c46a945875dfbdc1fc435fb998ec497b88d7c7655261dc0b38e80d80cc16afc79a1deb1d8da07f63d57a0881dcc9b496e18c473ec7a3e1b7f20937c26f9eb7bc78f869d95697d03356589185f87cfcb1f86191c627166d7c624bc337961bbf63b9e1855888240a807d9ad811314aad1a4be2c4f4e00a973e5fe9819a1145d34e351c97931b74aa48b04de58f8bfdf496c0fd8dc87bf3f6c5f24071d189cc88e35148c1fb63f88522ebf8dc8f8f52da880decb6b1533579f04a179964ee9f4c16f8d9073abbc48ff409395ff38a912d0f1895fae4930dd3379d00d479ac751fa489e4566e3f8e8c41e8255f10f5e15854a1a95e45f087f13250926d5e3fbdff8bb75128f391dda108a9e60bc5ef39a38a35dc06e948a915222b3b9e6875998ae54771658a3270f5212c7c0542d6e09d55c277316a4aea5d2b2adf6c0cdd3eccbec41966af3acfdee276db12c00e5bfdfce86b02f6a956a5181387c286589e32a016140e8d0b8bbcbf089e0f09f541b90c7918c819e98f8c6c034a3203b2d5b5610a03736095de9ab2e2e2506c570e007468927cde88f1a8f78adf51bcad7e009ed9d0dc2c3f361f8c046dfa4356761d00bff319e1a41847c92ab81de5c20e21932107b3e679eb2144756cc6f24737748a643a39dd150cd4f1a727ed749a7119ff0a993ac45bed090fb18f5d2aa2bb7ad610cc73502aedd77d7b6c9afc32ad990956531f96cf0a906c0b4af9baaf8f7acc019df8c1acfff89944553b2cc41f0495e2356b1217c7acabae2c4a7724e539d30c0ae6a2957516bbc3f60c7c17d0ce122605c0f43468714102985acf84812f1f8a20029ea7a8a0ff5a9da1478da8cda99d54b5404dc0dee8a0f17005aca3c7825d6a73bb226855d4a9ca245bd2f5cb61e0ac011a54e42764ca600fd1ff20090f2770e9e02d1ef39f757407688c0a7c9a49007854d15282fdb756f4c2f29e37a919242b5735281f57492a0d6cb746389b6e5d261c594f044fb01965b74a11b9aed63d2dd8bc02f47fbae03354bed7b305ffc178853082a9080e6f56167b12ee780b6aa267ff26b94b0bb5387262c1f95eaa0fb284982d4e577b45bcd6085a07d830cced2cd73b6ccb030b0350f0971049e6d3fb916a43bb1ad761ce409df64d54ca591499aef62a79950284991febc6e7f5d386f02c2c81b3e00371e5491a226dfc77c502f5215cadba7ef70ada961a5ddc64080535a03db85fd7eb581f4939076a8756be6fcd3e19697ccb8bf1c9533acf9d487aeae009d1984327176d63edbd5d518cd34011a6b02cbc1170544e2a40d894738d2911d8e6ceb0c6681bab60ccf11043dffa61ad3ea9a11e6ac9556b0d62e0e79388cf89ed70bf98fec949fecc169fead8abc693e5dce6c88e13fb24907ef7ef8197f18301128490680897481138d11164f2bae3f6f53b7683040ccaabbfec3f56a4b439aa2be8ab1f87ce7ab2fbb39d19900138567db5a5ea0de8e7ada9cf6d18e923974783314b51e53347e2c9ca207f78577ab430e2d1038f3c0a205a54625d3bbd17c493d00d4c78dda67c56828da33ae8a0b4836b27bbc31dd9ce49bcf545cc9820baec479a6ec848102c47240e7f1201e4064743533fe44ea68edbf8d1c59b1fc2a9da1809f468ef060a313ed94585d4b1a5cbdf232bee78d6f3b594637b5369cd76eacc7f0dd38cd20ced90819c37736c6c8484af89fca0b330ede4263e365034d25e3fdb37d2fcb5a3a52643116ea43197400c930586ff5ae071a1312b64082433f619d75657bdc372d62ee768aa951b56fe8b3213074e595b3e51944cf9f1eb118b0d99649b36341ba83043adeb65966a1b79960bce3afbd64cfeac47298e4d03655f15e7d11552e39036e71b75ade24b5525fa216fb936a3d074edefad0af62c4edad0b05ab08ebbb7b0f620a7e5814c28cc39032627e3daf911f4db4026ac5331e4e5e4ba4c933ce0b806d97ae09fd99084ba5d34aa4c171f9abc96f832029283680c917154ee08313efbcea05b17a237f46845a774bea6bd91221003e1871d414d502fdf1a65d5a1766c8972c24e831959dd4e67d200d37de99d12ed5633140a100a787a06f10f23bc603b8478f2e3a70e4ae505bae7b0533c3d57a21a17d59d51e93aaa01a49aa492b47c20bf5195938a5b72afc1501b231fa44b4a2baa40206ff5902d7a0ad0ddfab3663e7c99a9e4a63a67214248f79bc827cf6c40286ee16b8807feccd869883488a939840cb5a171cb8b390f234a021f0c69fd6403b1452db3d3c0b381b82261c91c25bd10903f11184af1afb86ee4dd5f4524db05943acc836ef458ceb8c7a34992ea616c106783fdf0bc9da4d1a531b55cc7aa34ea5cfe086c90d10b2340c993574406f9b9ff0f9091c6a64c95a536c5793d9c411dbb4aee6aed04c3e76f4bdb1757ffa9aafb524c10b42fa994b974bb6c008524a1ecf05765fab6285b6d33c92c4fb5584a46d655a5bbac0f7bb03d9cd3ecbe1b4bc5c2496dd54c83daa7d846bbdad26c8d1580b80e6b6b3d6c8e5aab3a4d025fcb5b8be58e955c08991b04c34f610686018b95219e31a2cd0f76aef313fc3ae9391c75c93ef2104d9725940578b4ddf8afbc1ec81804615bd3d2d1122199d409214bed1e4216531b1ceb69f17ef3b15d11108d808f25e0b9721da4cb0a37e2d64d76d995f0a69ecda9047f365381c892c68b52d39c3ff1231fe39cd9be1c08a7d15ca2f79ff9553c8c3c8acaf8a9c58cfec3aa5458c6786faae3905d7689b4c37f2285dbc9e05d06f31ed4f556c541e72ecbe2c34594960517c9781d0e228a32f0e8aa9e0681fb0e1f0d2c19fec2577d5a6a84a5228043bd0e57d5628fbb571203180b587e90998f6f38bdbee3f62f7126d260bf671d8613ac7f9a0db80c7a21430b890d8104c86fc6826d99c7e539cefd9457276221e82d2f25edc371851280d2242fa2d35d28f24858f9bd4af63fbbe179144ec1939be53830d58e99c450f8b4f1322edd9b836c3bcdebca157a74c1b3fb0f06fc51307e80ea4534189e485faf07e9c0dd3485beaeda9ca6d93e5d4e7ff1f2169246fa8ff22c5ead1ba6584f5be392234d66bd186e9f590b80ad0e03b90b3e7136d0302810b895a491ca00e3c94102142408143154de301d362a29e06cd38e09de61fe3ca7d5e121681fea7e43190232f105f739091165b23ae7dec42d373704bd61516e1e9ba173a61b222adbad50c5889ce9c865a51efdffebd06827213aea5e3c5668a4a2f7721d2b34e3dd688e20edd0cf4b48b7e51e7491a1bda9c4d15b4d1aef3b9534c876efeab7a08b9ec22897f691cad2349cd541599a203ad45dfa8ad4a834a41a35876876159ceb1a7c7cac390fa908fec44d86c7864064518211f9971eb0c124a69d96c967840ccc1c61eb2b7e39a95947ec40813ca995a601c3ae7fc1875c72fdcea1e99ae1e6e81799f6d56793f58201e0d895c42b6148477eb89f1f2177dd1951208be963bc308db5e6ecc5462ca68442c40df9e54d6610cab2352e8f987a1962e00e851c4f8b90ad9ec7e834dbafc123bccb56341e4702f20e6aa6d4d189f60520cf020a88a6844d50782cb20f5fea7be0024e004b991b6a564ad6d36961c4080842e607043b8dcf8e7f2e4a9de434a2cf85b8cbd655660adffaa0ca1888ed4c07baf99d163ca27b83f814112a2a2da6e85be7b737bd3448dafae2873176c730ee863169e5e2045d6a60d6d7a7b9bc65ff79b535bd09122f893e2de938d6afd0f9348a9abd08b42ad904b5d55487831ce68c6f471af11490930f7d4d52e53b19c4c4c6864a47533d34ed34b846676ae43d0cf1132a2e97c0212f3dc07857ad972a84dc404dd35cc55e1692fd6c55f5fc469c1c909169124085e063b98d09d997aa0bb93a8edb62f140a2678a230e490b3611d09096a8adbc01fc48c83918d2f5dd6a7dd38101fd19111be9dea5514004a80336541950232d1c02221e935dd79b207d44deea3b40b86b5be430304cfab580fd5c3d921f74d17a6f7c964b4e8d55189f45fd3c5700c5237b90981e9f6902efa6a31981fda143af62f8dccce30e638c094d76898db93d5769e7a49a03d9dd4b97cfde2975c6463e9a63218d117573cec9e58ca8a265e34370f6ecd6278118068a88317aba89277e66e0b98f337448b69c19f3241d359925d39716252536c1a7d40cd9d9cd7ec907e8abf4e66cd74a3770c2a7f0f5a276e7de29c8e16e987b13e4fdcb46bc28290e9c1db52da19b720a8ac0a1b9ee3696a4e9ba19b8be793a64da80b25c898d6397fb658b279181351f27855a4d71504e65d1e04b2a28b1ba8435cad4ac11fe44af55ade14dbdf855cc2d79c165995a7f3bce9a4cab96a38759dd72244100c38d14906fb8702fa399724167f627b979931c8e26d96a4be094656e9fc9c44d9f7cf9583bd7712ad55fdabab735290096e4dd93e47abb0c0efee592a4776306043b81b42d417c659a68479196c8e2d65899aa371a43e65bf6328578ee9e470f55fea5ce8f3900c65cb4d3b3de071fc64b44384aa82445b3a1115150086b1c254dd5e9d52705cd965dc7cfd16cbd7bd34012358efbd2ccf8efc7b5d8fa164fa46a7c1e5a0af4ee447fdc7ff0f6ca83283ce1d891bb820fa4c1ebd9f6b6339b36cbf328567b3459c3f65675e55d8ca3e08560d7aedd34928eb9eb7b4426fd57f7f8b6ee8b6aab3b0faeb25e24795b079cb1e77c2d1b1136891329f4e9bda4f1a26dc2c981870d2827e4369c56609d9580c05a9df2ad88e018d245e9e0510e1ed06b4344b71196b53a34a9e2f82424294f5ae4e95b72f3edfe6452b3769073ccbbcce0ec61e160a49eaf0c547d5ddef166755ef8258dc8d3b98a6cf5ebb5baee886e079a00d16382d99e152a86a874da750ab32bed00cb8506620afaed7411eb8ccea895c875a7dc7db40635cb68e532e8a1a305f706ca86249752251429a7cc174f19ab52a36475bd3435fdeb4c31eb432475a541c7f1d9c354dd0a5ae81ef04ee3d34db782c9d3a18e1ac957925be17fbfc030e40dd7a6d0fedae701621a0801749a074e0c4046739b83bd10ea14d6a8d30b61ff3d4a1c7393d4dc17fe600293881908e5441f8422f4e09e8af763e2cd9e3d8349cf8064de08f009a06e4fffe8212f9adc175beede54bbb1f28e99f13f04ff60ac1a4c447381ac068c018a60159ba57614c357b62b2b8ef1cb9b84e056ffa18bc461a8ce52352f8014d5e63032fad3f43d0cc114acb8d62c242f5a6635da1bb71eb792bf2a0ba957b609274c1d283a6efcb9b9adddd826287dceb589d39b4c8cc41b4cc667a8f18986b96c210895f4bfb80486a67c7e3f80d109a8f6fc5730b418d1cc64caf04a4a988c234edb0fd0b56cad3265e57c2d2b68c482810087d78802681d88c5868b9f2768c13307945933a7b652000b23f2deca0a8fe762f64b266fed6a7e15cf1ba1719e4ec95949cf85d46665c2ad3296ea7b702d260ae491490f6c728e1bc73d8b43b98e41a239d76ed9dd2a31cf61a5aa8e260043a8f2c7acc18d65204b5a40bdf4207c9fb068647b563cfc23c5e2365586227f21b0b34a8223b41d3d0e20130b8529de01ca6f3aa66b07e91f48df14dd50f5fa65feae455d38a65ff490ca764fb6ddaf55f212f5526368247242446e41ddedb27268a30d6363645423e8709383ea4a8fee3b0b3914423ebdd295cd1394a0dcc744ad15116935b1524fc79b89f628a70015717417be5d57ab90fec58d5bd50a90e4fefe261ed75023928087980a603318ac1f5ff6891be900505e194e23da27a32e81188077b1b18662a56649f0647534d9a938fa062cf83a407bae595ed517fe8a5df2378680425a702007226927916ad26651fa88a51f0d76959c93b659b554c25c25715996342838b580d4a262a184b713db29fbc4097e0810f46345b829d550660505c9431c66efc60b718a9ea6ce88225ac311caa43b3a8f81c2b65c68296bfc06fbdc846470a62ed89ef1c177f4e1ca3251f0d208ec880dd8d687afa3d7e6fc7b987c8559902c8195eae1e564a5825bb037592ea9084e798f1f07c0b1b3b702b8a6843b1f2fc7b4edce7b11208fe11d4a146a0e19ee0ce98127bb92282f108ec2dfc77299665c01216d29ab8843c130f42f92bf1b0abc529e419bbc01f5fe0a0b1d0ce60480abcde2d929a4a366346b92880358404a02b85094400c1296361849b67eb4acc4effac0540d621632b53a457340724f7025a3018cf28deb72662f13cd1a9eb977e570fb0a93055e8230c700efeeae40022179cf825eeb5dc03d78fe56ee77107cbfd26675d621cfb41f55e0d35160a12a84eac5823fb1eda80a0e37c4586f1ef65ed876e7924aba0877663182fbf6f9038fcd7d82eaef7fa2035bdddf83839af987fbba676b628938fb5159e219800bb050370b3bf2afc8f2c258235b1dc4d99e60428ac62facc987b6a412766d4f3c5edcbe6ad67e0bc8528511fc504172293d75269cf84435fef814e85e2d93215a01eae9af0cec2d409e336845126482bffffa4451188882fc75a08c59cddcc1cfb15019d34d0d76a76cbe5c02905f391799432b610a7e6259a373acd20a6e36eb85f4db9f8c526bd3645a988a8025a856fec51ead03fe40638d44ea134c0a5dbf57b8332215ba20008585344d81047e4ca0b1d3b132b996e8fec44a55ba8c28b9f412436d63b73d99b8b5c167efd6000edf1a58cb4258ef3f1de22e6a30da3c0d7c7a5841a5ec4e240474b8808dd3f51c00c567dbfccaeacce29147bd1ff433a3e40472bfcf9c1cf8574148f3bffd4386e62fdae7f86c1913c481686784d88ac9107ffe228e7af71e63bfff2730c74389faa81d6d7e1308a5fd7f88b432a6f9508808ac799dfd2390d1a785b0791ce737b6b5c1ad4137b0acdd39f5f9e224583199efa1d37ff1b69da75e2b36b943c160aec6a4794207bf8ac8b44be8146b7048aee2f884c40567162e6144c9d7604593730385a803179f8324398b1f4c3837a535ff9afd16a69ee490f1becb66d1d045fa992d0ffcfe5451fecbff4527c89ed25531b94df33c1a297f0c314e467e02e8cc1c08dbbccb394b17eebc4c40b0e07b670f38ecf59ccdab43efec73d674b0cce9dcd614168980c610a6d33b924f029c027427bd8fe5df703bbecefbc875bc49aa24110fef0b90adf863ccded091d0bd929f314378d3bbc6fbd05589ae7f472b6333b337fcf0dc83de819c32d14f6bc9b8aa048f79d019b232013522bd2f49ad6d67e56b7148239db1bf8896c675bd1f12256b70cde5804ae9f60d13d217a8d717a56da5d00f97616942047719aa98b1bb94bad9d7fa8b980a3bd574dfcc94fef0f804b63a0aae64c4c6f74b504985ceefd5f374fbc29a7b3bc0b7048b40d4e8fd2b52de68a91f73ca0daade64de49361f9bac093a42ffca83398aa3d6c8b2eb5c3e33ff70dccc65ae6f90424874d54a89794b644e11c64a9e07df7b446e2e919efd3d4a185807425763d93f7f416d54748e2c56b42dc5efc035d300cf965ada12dc62e6ce1f3e38f0a413ac8d0a6219695c3b554e243c1a2152a2aa59aa38c7d0067a890ab2632802d8d234d6dba718f38bbd29d3d9a67a7c9c5ace806c2a3541725762f5ef60753d34c7fc407528622bd61dcc16042838dc03fdb6f691df14755b75c6f744f84c54a7f1daf7975a1c45ce397444dfa7b9d4a2ededd5d2d2c4f8ac1e35dfc1ffa25aea129aa61295d9e11325422f6e0aa463ca4a62ddde689ca6d2ae4f1c92e51032b42d6ad499be78436d00b4502b0931e91d421903357f624b8b35652eeb3bec9904094b3f184095b242bf10965d598584fd73168a8b130ef480052763e7572167aa834ce80d8e11f9807ed2cf23b6ab266b1e3aa6746656ba7b4b56eaa8f1ad15969801bcc6b35ffd86d95a0688ecd611cea08a95cc98cf04cd5f0c87d366964346b303d1eb68f4cae75043930172119abd89a5c985ca2ce9d70d08c44e7abaef422f0529c171191d185f0d7321cda7bdf8120cf520544f10cf8f4719ddd68cb1292caedc14f69e4ee9c17f6946d119290c19156e9e057153e4e0caa4d0eb2564694cec93584c097f9d6764334948c8ced4171f7c2c63ee55eb0a605d8d5cabd6c9cfb6a8e80a594076baaca69a061a41051cc1595b2d6c6b7bb031b250208160791738a9b47dac1e7b7d2bb79f3109c0b99e04399320f718290825c43df78b58343fc2ee278069fec5693e6b09c02a4e0aa2dcd77ce9e818ebef8942cd881da6e8f190e6323684236900665d6ae1ab377f67a576f5ee0758e380a5a6512614fc16f63d7833e9681163752d4fcf27aa6abe0ae4152af252875e3042a65ef8e52d44b4fd19f219f3ee29757dc9a15212f7c39ea27a6c9ab3482889f1eb259941274fb22f8eba45d463640674edfdc739192c50734b5e4d132249548eace347a2c406041a25097a73d1d49b3eadb952b9eebd63705997c47f6c306568e19d6d6388eb06534a40da18f2eeb7b9c7ab3ea6c045e79353a84cea4cc65d8a6829526f9db390fae0666badb4ca1ec81fe85bcc4b8a8eaf7c3859d35571346b5eefc8531f559463fc68f0d97f12e117ffc4588153d0f7a9ad069d5d74dd9ddf82891c9f9e39025346270fdaa81310f6bb936c964005532f873feca6130246451c2346c377848652d95249e3329c000ed3b6f2dd3adc6d980eb3c849a9fdfc222b63a4e619cc83240a32cf90d87c2ec2f911e00a2038a5a4c7e426fac4e94c713bb3653a3ae6e35344078b4e62a35166532ab4fd5617e90f8f85240ae23fa7f722765dc665585b85a4120beee51956a116b7bb178dafc7cf46b39fb76fcabacb7534a3ad0e05bbf134db383cfb202a4088e8784fc9745e8874719357d9c14b94ea1f4a8c6748e007747eca808bdc69c48cd3905436a92d032ecce9863dfc8bc90aff3a4368adc203a981da864aba7ac830a68b83bb14317c3281e631c7c713d9600e7cd54de728cef31214912bc2e28f3846f999457cca441c004d850842067e8c1d0878fcbec2e41b56416f45898a922fa9abf4b0f8142ae2ee69d717e6c6a22490628cfe535488928b3651151b6e7fc37cc16c1c02e9bb22771503728ff6760a0c3486c157d339518126194ed31054288245c99608e412f85fd6328e82e82a30d8798dd17a04cba9ac3f2043f5a7fc250a8b09d9e8fc946b6058faed4e64577212b87bc555268fad7d1cca3cc94b00f5df09b8306a19750c6097963d9cbe2a2f8d2dc2cb00614cab48d3ff2a3d4a0058a01ee949e63193b86662c7c642a2e61545fa7d39ba92b306202624529bedfd38f292a2d2abdb117ca0397624f172f49a70a8f6f9280c6182461d9a01d48eb99d30a898a29d0a5c8818eaae1aec4b58607c37133b495750b1480e77d15533f99768306d5961940b2237dda5ca6d73f8a46a5807b5dba817dfcddc79336710c5ca0879119f967cb84b6cb399c01db1815170fb00be2dfea844bca0ce23d7bceb876d343f622e6b1bf929b949b719de1782780f32fca8b1a49953cb04ccb3c73898de20203599fb47c6e9b873d32dd3a58b6173df24d1e8683a4f2ee346184ce95cae5aa99d67ea87b84f21ff86bace154862b975a4e495eba98149b55f31268fdaf65de0a7fe490920d465a3defb33b643b48c4debffdff838290d6c337e20fae8bf202687259e75b365900962052ef404c22ef1d34af8fb119bc1b25c601321def3fe43ba807509c5fd1e3acbce952c7737ecfe9acdf4ee0699c75152ef6d8cc4e5bd8bc8cb42dca8647469cfa5d72f01b62173e7c354af5d350b66665c82c19dd29ff743143e7c724ce31d5c6f6d127c0965a6e52bfca53a5a037c731684969f4dfd8395f739922535cc05114e4db285dbd1f5f14e7290b5e4335cbef5b7c86124317970a9d1635675e0736e6edbc913c297059ac88c0393770cb1b84743ffc178c2a7af37a64fee208518186c0b2ebdb62b26cc42204638110aab27c8447c5a8fb1ccf9a151d4514d6ee0b857db11e51708260f8ae84f8827e7d88bf487366e6cd310a82882a53a84f2018733403c9771993302eb3c1ccaf6363932348152142702967238c85d36b4eab09ca2284ec4156f6710876c36cfcaddb86f5f100ea42242c3266cd8cdbc95538b7c1c1a6e13dc24448add992ed8dde8493e31a432f5a80e226f0b63b364c34e34f82f044414e1b381c21c914718e14d69c7b9f52ab1d3b1908c85c265aa80edef45d005923b5042f9b95b281cc036f7d972d12a04b7197ba12da828a25af6835341f491cb4117e876a21c155434c889aee98b5a3533f1693071d9ce895792f7af21987987d6a8097fec47d91d6f130ec552b8478ea34ceb6eda96c93564a27b4d3813ae8b47fc588a43ccdd32aaa48f5aa2cd3383c6d4c00918fce703467f6f4825334c68ba74ae604566365840b483978049090034ce41134c89e324fb646a80dc30b57ace856ba2b8f6c15a071533ba3a584fbef62b0f7f6459fc3685ff7ec55a2d511347a9f43c5cef678eac4583e865831bb819d5ee9029e628ed2ac988e58f22d2fece9bc67c7b000cdc1598d9b592622bb86e4e78d10e637e1a06f6300cfef8850179f2cbf96a61150cebba8525d98886f1dbfe2674e86f84fa5d5fc2902e481f86f93eb01ac2e830fa28076a2e250c245361b063e4e503b511663c99942a77c8bf5c182d1e2207220cb4aa88638c42d659d9727a02bc88778735003b3a1a96fcb0f1fd71a91ffd48fc8b376eb3eba4572d866497545e1190c23c6c8ca322d3efb051b4ee4af4518cadac5dcbec091c64de6da0284fd5c14571a9dcee7cd8272a564d0bcc92ac55c1bfe763f1fdac117a47d8007c15e01f9e2b2f2e6cc8de76e1bed95dac25459d69da0359dd0b366dcdb16ae9825ff88678f4b4d5ead5f6f4259efe493962219018ae29d0748d092d3b2822e0ce353e56b153bc158a10ab20996b986ce07cf5a2da3f02db5fefe1dd468129c742d303461b6c35d4fe06ed5445e779df6bd681bf3f83a19e75da77ed19e107166b4cbfd71ba648a44693316f421fc730a473f3c080518e8ff9edcc589a01714a91bee251956d7acef265c883c1e560989bc33c4666498c44bf46d5ae229385fd66de5a14c318cf64d070d705578bae3c38c388395b592f57d993fa87cc25e41aab8f7ca88fdc67ec3eadc000ab832be4a28fcdae75f1ca884ab9a7b6d01628813d81730ebcfe0c39215546232d2e7af110381798bd9cfaa57dfa1bdda7cb67b03ecea6cc51c359217fc3bbd6cf1869a3660177ad9af53df44de0240311c95ac1a163afc831ef1b83cc2ca04793f847444fa1797d26d9bba440a0f33b8eba8b680fae0135e6b6b6c5f75641fd3f49d003f106827b02a70d01d0b0ae1dd597e8f0bb1097596edca783e24130a72141e33310ccaf3f7092c68a86c8601ffe0e1f9234697bc1a6e8d59f406adc187a5b5cff18c6070f8a449f4b3df755107021408401d57715d51c5242938f22b1876722d9b127d3d3cead6c850036f11770b4ad0564e8ff829b85a6a31f05961e82a3d57af4ab5a93ff540b2620e0e75868e205eaf2bc9af647c645d905c7972bdb5b9badecc83d088fe625eb1169d3b92d93900f92537fb7c038f1cf1b85124e99123eecd2ea1a16ee7c1ba8713c72655cb50de4b1547a1fb396e6ef57973af2edbe8cb1f635003d7b375a0213f87ca5910adfaa709561bde8af809fcbc95407a8cc0a22df3422e8392e5ea9f14d38ff3dd1e80fb6387356e8d75f894575074985b0295f63960ed61ea908ba8ca4af139cd5cf1623523737b14bf384045f1771dd46d00520bf6c2ee053e4809c59b2fd66eb5a7124264bf1cfe09902607a75be0c346a1d1cb3b91ec4bbc853366fbeb6c43b53d2dce198c6674e880087e836515256146be82d3b8cd8e2717431bd3fa9523092b3423eb89317b437fe145b158f49b7fbdd2079db55081776561363ae446b9e85d02554f19161081c4157fa39fdaf901e99ac7ef4733fed5651523a7a3115a92c7ab3de422fb3ca3ffc4d954f7c04d02b14a191df5448f4915d2b76c3138c54ede8decda9f4d6f9d444759e4485847b602ea3ed5467103a4cc86cd923413ea37f5a5d98386d7e9b83fc8dbad4562db3a4b9b6a823be89e0d39a14a4c706b204d14f215a53236a9d43e48b70203c61a26adf6a7223d6c7b683e214bfc6f865d1006836a229a2fd7f3ad4399cd9845b3cd0317ed86858b54197efad92550ffed3801e98b3558f69d48a7f6b9bafa6b0ca4c343cbd3efbafb25917414481cae973f77be92fcff46faea09834bf12e597096a6bb533f1027a5de8822eb02ebf6a93e80350ca4aa18aa11b5f1544002377f2fc4d02d76bfad43609a96e5f160c2701f0350969d4d63b54a0fc4c46de6c150c5453333d6cbfdcceb7894e3dfeab04a179717b59ecbe29c1926dde869cc592b59689104adb5c275c742094cda372741ee7de156bb4038197499fe44f8ea32a03d78edb6aab0a3e0223883a7a80b9b66c036070f85ba60c233c6cc61e649ae13cb37bfce256266fca18734c482ec9ce931ae5dac988d82360ec3a966a53216bfa5a9bb2fff54103501f92337111edb838af7dabdaf9e545fde8e829d36c4106e07987ec0ddad039b48824d5071578196c0845c5bc223dfb5dcb2c2101caf8435812b420bec73ca0270d8f9b8c0a1540392a6a47bb5ded2687524787501a52b8813b41f267413dc05b1d6e91c3de5678448dbfe0a53e751e0507e7859eedb95945f1ec9a93130a326075c48ddc683268b0c0b301748df4987c9a62d4d32dac517c4ee5ca0d21769d2d996fa70605569b84d07ed235871686a7b0005fa950985597356f3df95373348b8dd42c3de40c363c7bb1f3a5e93688dd8da604709c7a761db935940e8cca99dee0d2cebefe2a477416dd71344f46f15381915c406099b63b7e87520b5eaadc1392e8cbfa55b0952bcde31fe278df9001116faad5082a667736c2c7987f09b02571c80a07c83d0de79b7f7327252f11bd0c8e1aad2cf6561b8bc0f3dc226b9cb285f31df0e27f435a03bd054c9468de0e285571736e3abcd43ccf0935dd9723ac192a5340fa32cf358116b58dd698319aa62d6c689b4172f58fbf7250a86bd4d28a722f5e47fded680d3bd93446a8611d66a228433f2a84d193eec946a2b61abc8b7f2ffee6014ef1e36ab8d300f1f03b668a06bf3b36304fe187202b9629acedc0aab57159ca4ac1044d189ee109b22d05e53b50713f1879ba22a9467ebbc0adca3c9c83a380a76120f83e29e0acbc366fd5e6fe9538dd46707f98ef13f9112c067656938f8d233a2582640a0dd73a0fd727607cae3e058d05ecdf3ba9c0655e084a580efe60166efddef4dfba01644760b21984cd922dd9f9f8bfa8468ad11244731ab770e44d18c75ea4ce32f8e9be5a88dee24288d0f3f37c12e6e5580f79a1214878ecfdd44d72de35626acbac158f08026af40269a605eae34c9d2b5279e736c462bdfc5b9f747968d8835f620e967b2f8fc8f01b690920cd22fa5f2f4c9162b87db3732b12bbd7c5a281c6e45a451c051f44d0c208c856703efd00976ca68e824ea73a42b79f2660c93d8f1f7bc9079723eece362aa26bc99898800704371b2db32738c83acbb0c612ff5c0de39a3d3bd7faa0355f98f7879310415e388961f0fc5e0d414086e934dc84f6ef2b2c72d7125370e0a00929c64b9cdd3459001e0a706b28a492a9db44f8a98e9efdc20871443c9c7b6276841f8bb430fb3a08b6de7797550f6a018fb56d60a3b6e2808090ac3e27583f773e802a5bfab854706b29d151e69885a1c29708ceccd5e37c0852dcb322f1cb1cfdbab45138f680ec6b83e08358b1eddd0b8bc202d2628c1912b40de274ab98d802de870042d103fa8c4d7ab32cf1ba04acc8fcf385abb7000b8715808049743416f66a8601166c4fa64e4174712913a655f8d23d0b3086711eb192c0ae4cd437bf560cf9acc39a0c35cc148446a217ce0bc241ffa8547e323ebf4232d08d6638946a2287b69abe598b5fa17ded452a8fe72528a915bbc2bdceb4b74495161f831e2cd3c18603a1c214cc585447795164261b685070371c211ed0e6db53d6b723c064a93493099ae20b321953a804d80c803ff4f42096c9485ecf58ed0bac831e1ec69a65427b140fcef03ac33175852ec213110aae3e8817a230af42aef8319b3ccd9e4759d57302ce27c16a373de9e0ea637cc363621739870c3b1003494ab02d692b5ed101a4674e46f4a2fa43312dc155e6dd037842a51b4258d1d3282ebf33a1448a94b536ed30166979540b6194eaa60ed5feab43479d7240ea233e755dea98c0488f7c28c2e80594cb1a35478c1010514cbbe810768c4669f9a699bf21ee229cce1823d0d080ac4b25a0341416ae5631be9ef3da91b62bf21d2fb60a9a5f1c988633aee74cb614c4ddd1fb69801bc641c8579b724854f72417739a365d8d4a2c6abd516bc7a29af443b2bbcbed8178666de69c7f24b1bfca939d9f6051322ad9405c79639977096bec8c4a01242c07267cf127d132c8321437f64af53a2f542156facbe284c2f481aff9089f2a3e82e109ddb94e354aecd7ddf0d33c697e6276e6a108db7a5b7aaac1c43c87acbf92543dd56a9ac113828538559ab3df17f8eabdf33800e6b9e2bf1ce84a2df838c6281e5610795f059d67ab41c111aeffe373509743010eea07696becfd26460f42e9e2da9343e8b6a380488f0150922990bc831c34442e2dbf214b3a31d587a6bea41d37f253eaa84eea3cea8866a22d476b20253302027ae986f0ace9cb15fb50c915e2f01e0851e3f42569490da0adbe6f72b434bedea86d3970f28ab85682592a066e750d4fc6ff5542e10749952abd66e10efecf42d8eccc24759685bd6dc5354a00c90852554bba59cae05fa4b6d7dea32edd57d03ad9c2b61e090dfe4090159d21df2d03fabdf7d6d6e4d5c322621f305fe36a2cdeb01f55957025b1040868005e2e9345d12740b50c5b93d77d19f159a4570450fe2cc09032a97e65bfc00fbfa439c1b08695c7fd8205eba6e300888e400f8e6aa0536b7aba8857c467783fef891d8dfbf591693bd0108d118899574ec6997a69e1597e72db349161b4ea59b2969b16317c5f0e991bb0e3f641234652455e79a94d33e900dc62be124f6595c0cf135aef43bfb683b5b2086aca602ec082adb2eea7e027c483f19e139f3c8c68556a47e86071e2a04a4d97a70f4619a92e214f34995eaca3a03c97d0f2f79348c18f22ce59d92a49e7850c90e4d5b2d88a21e9cf685e4ab30f90c2066d420165cd8ec320237c3cf753c85e9d23daa7a89eac386f0180d1f4c959c8ac4b35941032aad8f882319ff4922cfa9351739ea35f62211db0e4b88c993303804fd818319050e8378258b88fdf6a15fdfb62ca490500f8f8af3f823c5628ebfabc27c3137f8c963093adc60ab406e850bb61dfae32638de7666deb7b66742f1206b03cdf2c21b7546092363c7cfb7c78101ac8f9ae172fbf36e889faf0cbbd7839fa903b44a9bd74fbdf9d9d0db2275589ffa6029f52409b29af38795650462379c668ff0b9824067c0d0cfb087831effc9a5c329821844d9a2ad09f510822d8898ce67752ed152a884099189d33d4174fd3d567076d3ffcd24b37a9a6e9e2f29ee31b37fdff5ef593967b346b8e550bdb1a283bd2ed13d8d7dda7b9bb5286ea376e015b317b1cf74b3fb08c6691e9dfcbb7dc1321593eabbff44c0eb1040c227bff9ac3d0336a74960f6fc601a6d27bb74ecf7bd63bcb6299ecbc202838df700548b00dfb0153273e218ae3c2950cfc58730b32c53ed00470b6ce07188ccab335eaefe4ba152b729cf6a7050a0463d1c90ebfa2538066abc97ac40071331052c88364130659b884508df371380adedc4d8e5124e6a42ba65253af0644cfa517acb2b9470ea8cfa131410d57dd722d5a8c887ee08a557e4308217c182a36a1e43a31f600e6991812b28396b905b92b79cb1aeb7c8b73da211b8f99f03554d3f6acec3dfd8af1dfab6993977432bea976c182f8b9bb16b09ca41f57904d4a1d13ba567ae79f0981e89a78d629421a2d07bf4fca5537ea1a6df773618f894349585764cb0f845a9564c509390e2524a0b34ca91d90bdfc963e0f69e7de8a6920caf0abb05c0d9af6f2cbbeeb668eace0a9f358ca0418be0532029c284ad0310a85b0e7b8e4e006621b5b6a0f0d9ece44128fb4229f2f3f9d4c4b2ef291963ec81d2522bbedf0599da691ffb3c1fb6090d845a921806752ea80cc7d4a8fd41b95c68dd20aaa464b9a51d9d2e1892400ac86f2250b65f8db81c1e719602deeb239f1360d47b25c3e8f4d35e963a45f2d1d6e0d36fb6b0eae9aec17c254967cb81ae1152cf85fb0e2c856adfdd5c03380577788132f832df60aae1b31825af8b02101ec2c33125fed6d2db157ce1612de86aa9bb92b268eb0acc2df1cb0ae965930bed610693bf3707c12d41a2d04188f280a71292b78724f01f4fd06e77c4ccf66869ccab42b8130ac0121d4c690477fe0021bdb0a181fde0dc7701c65d31b4c8a0109aebe128d73a052776cbb3159a1152bbf51986c755b6afda974d1008a8d8e426e12cc14f260e1303084025567537d417a45eaf83111660d382bcc91e61b41eb07f9a43a583fb97a12fe95225e38e73af7b2886c55de1f3efc45762bf5a365239be6337c77dcb94086885abdad7362494edaf4b0eab553ebf4401016c1ba86f3b16e8a3af012b777003d8b7bcf6b28f1745a516c413ca8824f9bbdff5d26685243870573eb05aeea8d3a187d82a3da46ad6e789351636e4d6e34adb1202a5b52b86fb48609da1980bf621045f33610883659914a1653dc12b3c70e6cd302bcf52e127b9b3599a8645447a24d1955b87561e82e4c410bb6c522b2bdbe756fd48ca15ca0aa938a1389282de6426d4c77f581bed84c387221e5f055141e744389c72eaac24aedc37eaf6e66156d924c02d2298e585bb9d134ad77933614be395154ae9835f2ff90a47a601014164ee29db285ea6aeea90c18cf56d998f165447d0b5c34e798042de784ccb1f411f8f2376caf19bf4fb111ea79e978cac40a5cf58449e22270ac226660a3804b4c988229512ef412939c338836949271d6c2c5f2c267dd355e5a40d9d416b9ca8409e56ff92244200e44a6bcf238f340dc4fa6bccc31d9478c67693205f48df64408070a8b4ea9faa097ae07878b7b025fcbbf02655938e59e31563ff466d0db889cf2625413b602940e47768d161d5130cbef7a98f37a4200691188557ff17a40192d1057f5e421b7e5894cdb8b3495bf2d81ac8b86bdac0bf8bfe9b8a9680451d635a9a0ca9893d616a09b9dd51d97e7d26d3aa2577918085af0b9d007360aec434411e562c29744a55bda82253d4a29030de460cdb7111c47884585f9d219857c2a2b0fa20d36a59d9e5f81a0ecbb5c6e30c4ac358ed15f32e0a5018def5886b4b2408f0fe39faf08d6ddb9cef2fd81eda374f27a9ebeab53d9454e43322fb3df87f5988a4f5c92cf34c723fd3603800d4d2a9b5148a8f8681793cd15feef7cf824e8f5c27cf1515c578927dd1e3481401b79ac7e67ab99cc53cdfedb0736e8e1e3eec069de6fc98014751c7ad952c0e4fcf1e1e3aab481b1ee67b2bb7bc9a5f38e3ad908071a3c49f6d9ebb926d6d192017ca3c367889cf6f54193bdc2f07de98f01e19f70080b2ab96589a65e1d01e65a24459b79483daf6a3bb9a66324a141e163f6d37f9f477551fd7615d4a6b01ccfd41f1265e4fe72de882042153e29a48f5ecb4418c56c854f1f36579eb8bb0a1ffc94bb5c62c1adbb42df4c854f52d59d81645ac5b95d5a950ba30011dc22a61d4c66d4769b646154f85099f115282ce721362c995a6bfe6d7d45b14060e15f213d967548d668ce7206da093986c9bd746574d0969a6915b1490f3afd7bc685b8debd5f84af02350cf2e83dcd23c28b59bf9fe549543af91173fd1bda7242af2e073265e6b300f4197f157b3dc634f14afe40b8925c0619e19ad32ba0fc98cfcb717908e7b7026e20136142c651c6146abdc5387e6a46f9e4e2bab6772f4f970a0a3ea10be2f911946e1eb30a007885932b72018dac7b9cbdb50b115af7f481974956882c334bd1e22d2872de287609ea9e38b1c979ffb256ef097dd3e419fe142357118a61e491d2cc5711e7eb12bf85168c619816b3e6b3fde23b67da186ef283b09e6cbf8de394a5c564225e1753d1ab633a0fbeba8008c77af937bd393b2f253f0cdb880176331983e72ee2e43ec0e3de3522e57d75aebb30c9ebe48e8a9576dc5597e56322596e6071c41894f2208982f4783f883895a502b8a8825bad08f4a9405bdbb1609326260f6a1268276da28986199a55bd331351b1cbbe657fbeb868dc2e73980c3f5fa217811cd0bf76b1789808f6ae78555417c17bf4a00e022031d03cd543f188385eaaff8e2679044b6913d0a9cf3ae2870f32a540c602fd46672543c803753538dfea1e9b569856774e2dcd1dc38a8a0f2e802f7c9dcc3e23b1615fdca45358320543015a7f4b9975c6be2e0003416505f29aa9908080efa3841f1e8519ed31638b66ebcc7c1c53e792b7c035bfe287b3af524d17edc59b8a90cfd90dd6cb53827c423749a40effcf22d07f31b78221c1915bb852f783b3891a8f1f13c91f32bcad91f728fddd8cfa624960e87748a6a6c70701041fe62f6775517115211c21fd5eadbe7c2c66eddb40b6a79562106c2cb28eb9906b0a7d76c96b795ade983bdf834e3ae4f23dcb5073884a292048322b82faf4e4e569eeb2f73168845e143d3773e346ec1289541f40217ba5d87b998c3796ae8c98fd29392bb176110d6b4b950e93c37832435933366b434e5693ecf84aca9e9fc9c80d2380c111fab4b5f67425c32384137a48e08ac8684874c3f62c6eee8dc8547a484e68b1469dd215811e905c33caad34e44d0c21eeec26ab94f3e65d5c469dc4c6a293ef97b710082dfb0ba3e902a583ec4b0ccb49545b02414acd68b90026b71b94c56aa510b7b4d9041a0c3077a5d693841cfeffc1ccaf39f24e7a4166278df813dddf5fc28b64ad1fec3b3f37df795810adf4f6db5e3a1fee12004133791b1ba38a7c8eb47ac8e271c4ce40b39252fe72eeca65659a7cf7f290da196240dc9b12d93f8c5d0f5c477187d6214843d25c9c68a30394f30655ff2835550ab149251e0950a3574916da5d1873e49be21785014f88d05d2602e23942aae9a40b71055f56999f2410eda0ce080b5c246258e19d00ef773a621f3bc25ac8f856b5e7c3981c5933c7adc7517a034173eb580e864d3e25a54b5bab2ecbc2443efc3593f2b02554c44cd3865fad6d04b6b3ee903024a60a682e91ab282367d63b2607121fffff2e86621a8d810f2779d09ada14860cf5c7e29ebff28ab9490a3a791dbd67121df86e4dda36396dd332259d3b4d1e7e3e362ef05a4ae44e19a959030fde889512e00a97ebceefc1ce519737210dc31673201bb3d759f97cf7a9bb269e7f95b0bf5bca11a268f55c51466d1e2938893baa4d169202e3ee232ab06b4646345d0302570fb9b11a68b9c0225b8ba683c21581a31898b153dfb465606869ac06a0794c6152a2c15ade1fd9d280ca1cb0378f49a8d70c25fa4c3aa46afc1c51f02225045edce0bcd6df3c10a345bffa69a33ec46876ab936c75ad65ea939e85acd901f3a800e8d75294df785b134b4807eb79f115c40d8d543c74790a34e80f427136c3c1a021a7237e88a35e119e3a3d4e90691169a4e8f7125e2fe5ab07dcee4deb7caf759fb6ea675afe6de164256018f35b3fcbc05b51f691f6b1e75bb3c782f09954f212196df7578d6d91bff70a58cfb755c135dfabdd025e48773e6c6915f74d92e851cd80f715e316ac51e73cff86308be14b7fb76f3f7b31556fc27809455c3e7585917cebdfe172daa97936a22ced0f9c41c323708c055c9200e2c84afedb3b741f38f8c158baac84c980ade4b79d76cbe278a48430f792dc871506192c97d84df9e0a13b78f083071a0c4aa5957018f0d57fb7db2ed8d6eaa824783855d8dfa8cd0b7156a673220ae56259c6b6ffd0056b3179135a86d9c46a71ae7e1d5e3445dfcc7077d1b47d3fabb03669fa00a1e60ee80cf781a7137481ce3606d7a0d371c8ab1c6ac0d24a409b9843277bf80d475085a7d1ef53085e5971a96d614438abe7ecb462ab586b4e405bf771bc55df645cf97b46372dcc0a386049b4d915d9a8c94c80f4675b86b5df9c78c46d4cd6f204990d03b88507fc64a390fdc8031e3c280caca9a4a9f8f940383337d0bb839740f02c0d26b9100b0501b6f39dd0239bd02cdae1368a6f86129c48a80741e692910365cb17063aae02145899e91b008108565cff0cb8df621448c01a8d8f078b814a5cbac08b492a21c2bd4802cc1e9227c7430713216dd0b9811008ca1a745ce8008751b54a05fb4bf408c9dd2ad0d6077a01aeff6ae5fcf01546776fccc3ca1198d98b3011585b6d985820fae62f24c9813dadf305a53f1746714c80a120de4fbae4eb4d04db7493d64d8ae6149108c1cc2bdde10eb809208e9105f492c7eb6968e8a61b81ea7c879174e7f3c28b5252b9972f178c5c033c2ab5602b57e8072cee15c9fe92a8eaa35afc4a18b1c6b587c9b072fb5f0c72be93920919f221929b2d60b25680fa3b5140fb44d6ef4bcccb532ecde144ae719a41591020ae4152808294eaf134444d93af4546d161e7766b85f10593b80bbf2aab6959342f2f31aa3a49405a2376d66ff00874585669878096783ebec16a29a481f3affb5e642cf0dd0d7c7d2e4018401781bc9d5959895801ea33544e157d924938fa803008a93095518681a4f151ab898aa80be7f80b19b6f8544c2721cd9c8b58cb16ad2e42edc28c76b1390a76005eb458123bf3f00bdca7d449fca167f77fd1b3c9d5cd68c3a8dd368fb7e3343ecdf510c264e38a3099280b8da39f683808fe7ca3b85237955e6d334a7336d9b7f59abc48425bc6591efabb74deee630c1b4a36b5eb2e019a5ac090a96b4c38dbd1c90fcf8eea7430ed3256055d479340a05813b6cd6249dd8b0347af1263902bac43ad9108e6e0f327906f3c6f75443894ff24e7113554b29baacd4fe4319e0e3f61666b7b7e2428b91e7f672650a255a21e357f4f66817ece1defcdb7a04fe00ed05f264cc6edf428e3c7f65b86d93398efe41c14dc45b35675940d59ebb14c04152ebfffa193d5ed95c961965d49d61bd083cecaff3b3c3165a959704b7ed90792a8fa7f278a48e4dcafa81f2f6759f698899b841a94a3a899e3503adf7b903221d5f6ee0901523971d7b962b860f41eacca25cad025aa4e50addfab7537879671fa6d7b8c646184fe81a0dacf4c291336e3ca5804436a009fa472e999ba8798dfee64e6f9ae29597300161903c8043446338523cb80a212a05a0d435e33e04084fd5d7d0ad882de7b90f2050a9d5b7e994011476abc1680a1cd41197fe0a1aec03f80ae08889a9736d9024d694e977a79bb8eb28847e6eb37f10c07932d788a6f38323d10ae4a3a2935090a85522a13a3439db5f0ecf86eae0110dc064faed1bc8ddd6b984798fbca2e48187f8b07970ebc4b52d4f420b33d5cf80a91fb526ca2571e3648ab41a8c8145099cef99e64c4e739b123a8ce62eb202a9d804574045af38a382161de4c45aa71bbbc40ffc32c89d3286227fa654f214112d5390231cf346a331c28ce7231b3a000f0d58e78c5c07cdb5f9cf1b41c9fba3518db8f4d2ee4abe126c6d276b90f89a383cb392603b9dacbb3ccd9b6c27f1af912e125759922ad0f342a98950565992222b58e3b1f58c87557ab7e1ec91b96482f42f22213d2c0cbc089864c38d0c33fb036767a03a4d662dd42403f3f96ee0ec81d03d4898f158a6936a1d24960d08e1cc88fe93926eae19ce5b512184acc26b512ab52f10bc0dd69c42a8dec248ada0c57bb71aa368cc0a37316aaee69da617f12d572cedc53b722defc09ba91cf9faaffcd538d4675f73387c6b2f79987bb31f6573da9f094decd376e205799ed5f4462e8be09f0da3fa19094857c9b1f37f63f7726cffdf59228f11ef9aafe775b66f1fd7be33a323b8bd5f941d8f7f9505eaee7e178db4556c215675400e3f1a9fddf5f074027cbc3d82dc4c3900c65337304a162212e7240526552603e174ecd54e025ce172ff9a6cb3c5ce48204b27e3f6c2bff0d56c8549e37b8e44d5c49bc7c95056b94cc57a5e431a4a032a0314213657ec3b5ee75961168c29a03ae884d7f47454a5c1540da39f9ad8f930042fee2a3eed80773a02cb58424770ac5356d7c2088a09ac9bff3949eea89120590a791db23a6c578338920bf5f9f6309dae02e5aca91b9154582992fbbd917ecf49d78e2cbc51bf6a1cbb69a7b6fbba1840deab557633df00afa3c6664307125f610c26a13335649e06cd5dfdbe7f692fd3b0f75cbd5f7d4ff6755da2250cdaadd731b38074c8abe02e46ff5f8d57fa5d880b22826402653e2bec162fcaa61df39d6c487af5083c142463a5deb4c553e676df935516085a7dfadc97c05df6fffa3a8ff6a2d7b2fe2372e362f0c6a4052043329a153fa61b44b6f2d6dd3b7075fe2e382e0b5d5b00bf564690ad76d5de314992387471b792a7d1d5e1fb6ca961e5f1744b5932f64379f01fbf7e53badd7625e517ac38d4a58a7666f19f9bb57565976855ed07e416868e45afac2b2d527b664a1a15b6ee98f06855ee8a091e54f3105f64b360ce8f40b9f0803a1007ab56d39f07263ccf82a341fc16cbc9f943408b74c13b29408566710d9ea459b0ffee7ca98b577d9df6bf5e812a94f585515fed466a49aec5e8416464efa66528c95c9a21b9ea0f1f134158b188dd70d1740a4d47d20d783dd43e02e5d04921aadc05e8bc54e52533b653779d374084412f42979b95338d5d08290eadb04c8fe9293de7234dabf3ed32873860f0dbc4649355572e63673d65447771de4e3810b267c64545184c76c0d04c429a05c90bb1ec9a8c43bf86fa8fa5f1018bc6075250b188180bf8b6a0a8e53c50ef5067539e0e2b1d2cb4d1ccb52683e6abfb1319febbcf4623101565a8fb0552dc5076b78d341812dae1ce4cc0f27a5ca48c59683ffe3add4e6a2cd23f1578049bf3ef40b8ed35ce9e107a95732f26e81b14f36c925dfa59c65e401da388f606503c651b332ce43230834ee7418d6fc82d87e3f291210dc98c6219ae31bf8873c28cad26133eb90fd217bd24c4919ca5afe346452ff2be02444e776ec86b19cc38d80962eab9270922b6c0ab1d01c6977352856aebae76e443abfe65edffb82c5100bf429d41d583e4670f64e41dfdc603ff4bb0051227f5566e13ed0335c04e94f125fadf4d6c10101a64181e4398cc14b8169c6cb5170a244536c89beb888b0bb8f447f543dfb48378ebe50f0cb3db3c9f5ce3ee7c1bc15e5de6897d94c4a0e848e591e11a8b647df2e9046f4e7e8f876dcecb71008795d6bb6aa373bb842b9de7832571bc3111c6cce931f03575faa8f1cbc0812e5adfb470ffb483b8950cc4406ace851c2b9c000b813c93da86d76f3c6e6c00d9bad09eeb14ada9e040ff59888b4467bc114e50b636b0e82f56f6affa631890b0031100c2070b5f065fa2428b74765991e0484b8591fb0fa3e5498c61b3cd353749b60723a0981b8ef4c88ac6d9140ed739a0a50ad8ffc67e3a6b1acd28d33333252c8a9107371d32d92bec81b7ff190ed1376727c3d8668d763400fc192d38778e39c57af49f15190ee0e4b45784f8fe3dca9c10ca30f6a3fbe4b48fd570998f4037a9b25e836d66802e47cada3939158104ae21dbca078444080b37b78479a891c902f02f95b555ba54c1ef65b598b500ce1358b77e559a209c3947fe04e3bdfa6809865f4b1d742ac393aa4b2202273b9a1ca8c0f0d861521d97baf901eaeea287650247378842e53de396d36e2efb19da8ff8c80ccd20fba3dbcaf7c8bfe306cbdc9dd5b8d221a2bf97e4690c64785ef3ce12cbacbb814fd6bf242226f0812d9be6e7e09abf7ec0648ef96328d1bd46f025ae379665a30ccd1930e1760d41a9dea165ebca8856b9d3bf1cb8774236ffe887f57c059c423e831345335c05bcf5b15ee28eef4c0fd749df4b4a91a6d8ae06dd2d42de4ee9d50db298e7b32cbf7a42a330880901a227b93bdf796322599021e0706067e06953c43908b38b654501de44eabdb298bf3d3dc912707a62c950f15e1ea20c76e1fc7c555aede00e36cab5074112fcee78782b60ef9aee6795ead62de8745cfc3d5873ccff3b0e825fdb0e761a1eb7596a88a2d56850799981d3024890283508bc98f7190fc61bc647879a18162c5ca0629a94c71f5700881349e986c386e88381936c236356a33ccd8fef3c01f4f0450427c314912b6b4b435638b44981c347268b2b1c393dc1bfb1d55fbfaab3d54d2a4a23c715d35dda033565eb9b9c2820a6c72f8c1c35aef7633d070720347e9e90c8fa4a91a18142c68f1d2c5c90e585b762b89465347bab96131eede8270a1626bc77417df7efe5ff8ba31240d0818b219a6845f30d0a5883740c8b03411523e69a981bb0e6fc141b5c4d440035ffce34014d7726f2961c9b6dc5a71829030f3095931f42c22a207d6f067c3dcb735561b6d2c3eb0d9c82863c42a0d9b266dac8638755b523a72bc904a5e96aa3cf14812b35e79b37e7c1dae17776fb8addc0375b6d6c6c27a235992d8cb32cba9058b6b2dd11ea82f1c28ec17776f382da97f2c2198282ef14f59f6409d3fec1f7ea276ac2f59acb5925e42918242a5811a5133b0c421e284069016b4e2041143eae1c5c9901d55536ace588b773cb6b5e20fffc88085729ab6804891810556232bc899fce5ce6179fd5c70bf9a8a295905b00bc1af80d4beae735723c96f857b7e994e3950e71558451ca8f3f9b1f8705e7658497297c3b2126da5f8661b550fd4f9ff36e21c88e21c98251b4b5546e764937c6846a863bfc79d87a9bb87bb9166f748e0a5c55e1d8d7ce84fa34cc7185eda2f2f6d96ecf9f1d9449080923a57aec5621ecb3148e044d776b8bb51f4d2d6f3668b4310c1e2112c2ec1e20e58fcc2deb1ba02b60000287c7a2a3881a3c044891b0f899dab936313c31af8799dadeff43f103e48bb0a8e0e70204a7ae0a5d23591fbaa4a935c735f0901c41554683f4f00b968850aaae23fefdfe6007f4aa1324557ffaa46f7b606a05c51a4c2d65a1f67754448e2bcc7381f9c551b3be2dc9d085c54ae28524182121718845c9191c1d22503271d6c901cd141e5031a0bca22a13205ae062a385992aae030fb0189062fa517a6aaac39e38219008aca15452a7c509283529a219a8a28e392002e4959c868ddf01203191426f09291f4c40633322e6140b6a608013bb3826535e613822b3668d5e0c44d171f5b38f801268d15580f30585d7a58900136841492334268d042a6f9910363650b48105a2a1840171bc218098286386760512b78d95216430d60aaac9cf0244f42665471f151240b093a0c79a10c91ae315553704ee25c2909c205ca161fb060c02a2d07e56b0995285b149011b9c1cc6ceb4985a62b1b6cd94156c64c5754d795099d2439ca5c21311b228395dc1b314590f16afab2e4a444592454a6d8e005238820691a32b5e56b4a882d36746c45bd61721bc1865298d4139c208ea812012c6b78247d89b2c20e243c5d5b47ae5899a98036844a5fc182b6c385b11e6580b8814451b9a248050f0f4772c86066d5420d5e686e507541e5e801063664a72c122a537c515283982a334ca5f161ca09a91b725fd05ced30c3d48d03844bd78c16645819919281315031b4f0e3a9096d061dd10b9623549824c1398b622343e543871168c8be44d91ca41a4f528cc8305345cb4b9706494d88f4d001864b101eb6b248a84c419968d05033a38735655c0330020cca08244a6c38b16ab262d8560d626280f0b271646b0246824499c1e14c0d1f56376c7894068d170d625a6c98a295c3105da0c29cb4a12a82855a51b9a248051141ac783942f575230a8a892438f4e82149080e5a564a60592454a620e343d753d70f35b6b0b22e50066acacb112c6caac4f9ac7618d321cd8d1f92c860810102366406115770c8bcf1ca22a1324550950b5d6e2083a56ac8959219a8194762d0d221049baea85c51a4c2485999233b96700411c7aaa11459218c8f1b58e8414b8d152a5320d110d565ab8a87ac3347780c5e32e8a0850c0f4e5368ea8a221557ba647893a50d0c5d593a387184694d0b5e6ac0a9519e7d592454a6a8c0492aeb8a882366aa1890002d30cce0238d1522ca272a02c2bd6845918a114059b29444cc531394056477cf31b6428d194f4bb69c01a1e889be31d971fdc4ebfe913e5e77406fc92ae2858d920ea529f35391ddfd035eb9afa535b9372f980e82072078e0ee58c439f6c03d00a10c04c15aadb57eb58f821da53915af700a76508bcef5eba0b635d01ceafcfc942928071d85e2703e9872d05c2af8d83dc52cde1be5a0b554c83e761d37ee4a39e82c15f2fff7b8c84fd2a6b93b88ba8fc975c96159e2c97dd543989c5b3b6bdfbcf90202e643180b4138550e4c0003151d3650c951464c2df71595d8d60b514ab92a33725394aea892642ff7d5901917dcc6ede5723de4fb951b8b7deba07639b5db0a8204082567babad0309181502736682c5c5cc6d0f8f0a58822612a84b9a20ae366069a93f884068f02908624a9e2654d5a8d2b190196143dc4b2e5d0455bf67c7eb98592a70eeaa1164a76b4d921861b96dce04196c5b4e5158ecb5f0751b2dabe0ea2fd64d32a4c32d537d674ddfbb1cae471d734565696fdf15bcf3dd4e3af14cd73cef5f8a9145a5ada3b957a4fec6a15edb00eabe4277ab60f32f851fc8d894d0a506fb7db915b15c6a68fb844ea5b02f558277fd4db438f16a000a65b7c0620538bcf9e4c2d3e7932c5a1c554899b2e3b9f5e0b256a1aa800d96b8cb076f59cdae110148970372f6fb78e831653701a83ce2da6d2ba6c16b5c745e7bc5cc16cb14fa5b5b8f94381c6691ac7a2855d69574a7d6786918a954e384f640fbbc6c4569e4ce2ea30a17f4318d1871d9fd01bf48b07eabc0fac85a2677b400bdce5d013ad8d85102fec050c07aaf8cb862a0e735f3d51c92f688735f1041631bc743c650412aa8465c71df0a1f184aceb9856b9621e8184127ca8736c2020d193f694c8b7dc2472c5997e18860fd5be7abacaeeb8be98220208fe389c5d767748f0dc4a98b0943c7572f548180ee42f6eb867879540820f5d7187e756c204053610906c166cea393d15b7b5d65a6b714842a439902b537cee64da441e3877da036dc9133c7728e9979a953c4f8896fe8339e7096c2d280440f28c913bf2eba07e9bc5a189176f5fbc254f9ad46935aea8c914d7d6b1b1a075b4b61662a6b616b4dfbd4cc19d8e5eea408ebdebb20b024ad4e6d9651c743ee90a4764c74d8b187ab20151515d76a66403a264680c3ad32e7710a539133742da5dba9097ade2492135032f31596e1bc6b961d8ca0ab3b184ca0cb3032f5c662d18d1611566369c1c96c4e460849816cc0b7a28d2a5c392286640989d3ba3b92b0a2d7232c52e6ea61ec87d42e7c7877ce79ffcf1f27e5064c892e945aa94fef8fa9e60ebf57765de5789e9ba785aac0530b4c932c62acd0a960e3a5ab70c88354ab93032472ccdc8c116e9867c37658baa6c4d437c114249cb143750a262f0ae840002885c6b5531b643141b1f2f6cc962d66aebdf7b43911b4a545216735f7d05c9e7b5517df729c6659cc289daec9292a78ada8d71e1cb99fc626edb9f85b5c44542424d666277bc8267ba05e8e3153cf33192496d2c421f210407acc8d52f129cf0a284b16ca4c74593658a9b2c5352f4b2d19afa5bfcd9e2ee8f3d1468f37ba08a914cdce6e3da91ed1ab4e9b89226d024f7df2285aa9270d24cb1adb931f5a1b78e2d769b0bc72658f256f2bf37e8da41ce42d824a551a4b263f7c9eeb9ae24d9cbe453aca735c16207f24a9e1fc5b56d1f58dc59132a7651f1936477795adce15bf1db2060826c73cd2658fcd8baa8b676b608f8500c1c77b697ba9e4f9fec8e69062dfe15fe41adc0e32e27054ac776b5c3d58563132a795f841f88b975ba7a0ea97fb59d27d2e60157af3b8bc4a38c8c216f86f0c23253e37b412cff93393bc24508d4114f68b67490e12571a12d1ab8e42ff7d61237425ffbaa8f1ab9c3f5ebaef8895ff936056e2beacbe3c83ebf5c7a367af0c0d5a5668b889bdc7564482e309112e603c9952c33a4f8f94981c32100b81b80fcf81302b9c0443d2e7ff00fe69272ebb3fcfef1aa961f8e902192a58c9329cfd526ff8f6992262aeb4b121a2f51e657ae244fb7d6cf71c590ffc9fcfffffa5a66e412b9735c4b9d8d6ea2ae4bd5ecb01d45b866d742ba4a9e4dfe77633f50d656d956da5278f6577ea70f741dd7f18eebf813bd5abff331d76e87fdf2e743f576e329eaacf71ed5711ddba25c6bedba0e7787bb5a71d839aed8ebba0eecf0576bed6a31b2254f8a1b531848968a65fee95fa0f48a768548b9cbf0fb3cafebacadf5df9dc7f9e5a75e363e1f5bb2bf0eb256c277fa1dafe39d5ec73bfd8ed771d2b15651ff6acffb75efd76dfc45714f63a4dce4f9455dcad13e576993ed318a698f0bf2bc3e5c1229879ee8e3f5e1360e3f30c7490e644a8268bebf167fd705132cce4bc774f4c9f1b892297886d15fd7872cd9a2f3a56aaec5bf642915135f0aa35469ade69e38b0f69db86a6dd779def78160adf64dd7c7d682f4f1d2c52f07e7a5634bdd92270772e5b2530ee4762a4765622a63aa5c654cde335dc74c654c1d933395315926a6322626ca84a98c89a98c89097cdb75a79779b5b3b6abde7ffe2d5c6a8bf850c55f0e626e2fc54a7b5c3452862156918e29d40c03676f74fc72f889e007828d3be7e4274f0f8c63368096af2260e0c1f1517f51b9329d4ce1535d421cb1c48a0b074d4f54461a1c514ca32321aa29263b5247945f606c9c9946471c78e590331d1f511ed6bc313d032cf3e8164302a8121a19444ca3a39c1f229a1a584e5f5570a098ba761081328d8e6a63a611c747df8f1ea611aa810fb3715fe09852fa56e87bddc636bc22751a2efbf74f2af6d1622761e072c520e8b46c02c552dc49052453cca31d22a628152e5d889846473b4952cc8a8f4a50214203012880ce10a6898d79747367a61f0d994e6919f61319b59422c6922a36323a7a7ce4498c2063567ce4545658321f1b1d20876974e4d1302b69c4f19147c37cd208c58d8f9c4a20fcbad6b133f88167da41140f60488db42626dd5ae2052d03ac9f7225b544ab2871fa72373b7ca9b2410acaac8d23fdb24549ae032f255c666dec718280275bb83c1d39b031e2e3f142113c805f30d4685313c1913a919501316b630658661836414969b252268d1b9b088e1dd89096668639223876b044881e66a823826307467a6499e1dd5263666a07ac86ab1d244470a4497429ca6db27ccb274dbaa00a489392099227648065822409ba2e383614245a4cccda385631c3122672725942beccda78bb32c34abf78d08224c595dd72e149a714c54c088fea1853234d8aab4f8cec0c788499a69a1122e284508e6822236ab1d08211668b319f884a0f205f7ec498358c647e60cd6ae0c3a446dde554439a79e45ddd7035f02144415c7b22438979f4edb061825c34b46e98479fd50f13ec9c7f0f4457845042addf013d1618e1c50371fdd67dadfbe443b9e048a548a3beaa5a6a631e552ed3c843b9142399ffe452f296f392947ba0523ed4b9afaaec984ed122d9718f8bdab9580f6343d4ccf079103b7c5db0c79a702939e2c8027c00a332418c64d2aa0e722af5e4eed029168fc3ee205cbef9457e4c3b5c4718b8ec613f02d6c63402f1111d62c68669c4622433ac8de0587117d2d373ad91357014016c8c6422992bbe36b649c70ea3708402cd1eae1e49a9a4b2ee09a3d3b22549f77a44208d68940d696566ad2e6183a336d870a199e05897b031bfafa57881c2c4ac8d3d634c00655219f3f52238d2ab277172666deca962ba8e3317c2ccda8862c9a7a8094313fa62210c015c34d0ccdad8a60820aee11a696402281324fb8190ccd0b3a08d02c97549326b630f0e6608d2053889536582a3d8c30c29065bae926a623f510fc58db6468725b3e3ccd8e2eaa1248a1f260a246608d66a637f58b7c9b27ff1e16988a6a2c4062b2fd646a1a2abdb649927d326ae215226381e2087195ab136e2d2ea36593e716dbc0ff4b9db64b9c9f279c129f388e74d02ae8e789934eb879509925f8307d8a24399287e4f54c38d7bcce922a3326b63e8c5ecac2761989846de17f3e846c4ac617034f292e0e46a357cd459914a326b585b33a8cc2f1c9892cc9ef27425cda438cad4e4ccda2894c40cbdef6b8a1834b336fad430435b941d69632698d9f8520e72c49ddea089443166e3fb4444539a487599d926cd5ff61329d70ea2b5f18368d16001cd0447510cd1942652a18e581b8d9cc70f68e6514e1073470447a3f6328f5acb887629313a0ad7a0e54c101fb5942a6826481ae9a1182953f2a499441835520190f2c504491e11346a303f249946203e32409a3013243f8a86539a25131cc5296678136ba3518f1521651efd0eb35d83f3464d74987322e5afcd6419f2658263e865861dd2ee777a736ecec9953c3d909fec1f2b3e25b2d326b23590534a29a594d2dbb808c59df8c09f5b6dadb5fe9bc9a798ddf1e74e43bb09c2f07bb8dfc337a157a71675777d6c2cc29a8d45b7ed03308bb6ab736f7deb6f9e5b097713dfcfede27c6eb7fbf1e7af54147157d0737b1d703e1405937b96190016508cdda977f35c85edd4bf36b90e52c7b57b13ebef70cf6afbd0ce32db6c1f80f9c6e4a2ddfbf8da58b40e97a2ddc6e14efd9d9d9d1da76d22e744ca389dece4b9814cc9caa4831a7b5c2cfd4e69e92797c6859a335bfac981811243961b5161947e7215cc6dd5062a0b120e15c6ba9eccb06e7cd10ae341c70c0130d0e0e406315e57d00c20b7569853ee726b7dd941658fc8b852a2c29a264e564bc6648bab0fab6c0f906d1048525b9c94e01055a64a1c283e8ae45026898f0fc5a831aa55ad95be57bf51b18a14a49f7bdf555bbf2afa50edbe7e9566ddb366b763f889a20f9de8926277a7a028d6af665c075197e2c297ab5cfbacf952b93974dafe27c8014e6ad408e082019440506cd2a4a9b469290f79b1dff25b7ecb1ff1622ff6623fc4bfb156e85ab04302003c2450dcc470603fc41b61ed1b2196e2e2de08b1f269f98989f9fc888905611c1c3005e4f8b307fbb33f7bb47ff36bbace769ef53afb605d67adfdff7f379f28ee88e279ffecc1feecc11eeddb749dfd3667d6fed9b77930b03feb3afb67d65a0bf667d6fed99fa515a579b0077bb0377b30517c340ff66cdeccecd93c9b377b360ff6666ff660a2288aa2288a6ff6665fbf56fc45e0ecff5f3c15fe9a5ff36bd67c9c8ff3713e4e569aa6ac21beacf25be5c6e7bf55fece6513be7eadb5d2efbb1787fbb33c8572b976ae83cf428561f7069dadefb8c35f1339f6bee27f4beafcffff0b695c6774dd9d4b51386149f2cdd67a3a94dc98769ed5418d699399e6aaefd6e2c7d5e26a49b1d6c6200f1d7a9d3aa6feb82bc4ffb6be5314681c2be18fb9b445e7942e859d5b570aaded1e6afbd6bdbda9845c718f1fce945afbc5b05961d8b4b11875ffaff576505be04e2be98d9df6bbe327ddddfb21fca54cd31c378c4ecb7402e1aff935bfe6688c4a1141a5d494a04bd325f9212a9aad7aa347f3474221bafa9ff93783ff93842f76bf7a66dfcc7175af6ea97badeaa0af12c4bddd782a7d6badb5d65a6b9fd66acfcef667bb1f653ee4b562a17cbee8d65a6b29131b7e128a8163bb8462e0b8561f29134b9978e96fb1b5d6d6a755071feabaae13bbc11e298eef287bf844ca5edbae7187ebd8b81bbdd1c6a26bc55db514c77822e5c62b1e052f37f6c68a3b16b693e08e0addafc31e0e3bfa752d7313dd066a5cab872dedba7f526bf5f0a3ed94a67925be1bc853038252ea8197fdb5a3e5da6e3a39d576efce8e8d85e8a5b783b95ac2d7c2c393a2cca53884076a0c7efebd16cf0405b69ee8b17df0933b12ccedc813e7dadddd59fe642a0a04b49008d6bed023bb149759d776f5afef7c635ecca5988700359f0ff3e15856aee8fe18ce29983267ac64adb5d65aad5c6ac52f977e8e530cce1af57229ae653e6bad95d65a1f8b1daede915fadb57ed80f628e4ea853bb3be08ed0f7f5039df87e24bc0feb6e3d96b025c46a0755d2c1fe76119f82dbf5ff0177a3cfe5521c7629fe3e31ac59906375ee7badb556f1f3215a6badf5ffff9b45576badf8dbf148505bdf443b05f404ee036badb5fe96efa3df0792282177b88edd6d4136e1ed4deceedf7e205bc2ab89ff2dd77f8b16f1c4576badf5c1b2f3dcef6fd4bf5aefbe1fb5b1e8c8f384dce1c6d53e1daadf1eae5d69e3a7fd5fbf63d4dc4f411611932d3ae3fe13b2ed3c7c765dd7d50e7f316a7efc58fe0a05b4d61a962851b1091b0b17bdc4f9fcae8d450529a0551e77bb0ac4133616fd7d2d705db58d2baec0c6a26bcffb380a4a2da8819fd7853a392f01b1b0a7e62e873a29d49e0f68f64ce60e6a0684ee1e42438527a5ad1452ffe07363927650e3c6ca7d9569c634840eeabc0fa498524c6fde07de5af84ec3b639f5036ba1f84e45b0166620dadea9ad6d4e590b455bce3bcd097b2640cd10f24eb665318bb52c8e600e6dffb7ff688e8e48c79ac34be9adeee14e67653af6785607e51239e4b995b8262878a714b4cda91d74bb5192fa57eb5f6df74ebb17abcda0f3dea957bb9b14bd7c77c74e9eef73bd1c769ecd147f62cf075df64c33059d76cd5330406e3286cd3785ee824cc91462f4fcf7d3e51462d85c82192923f5b8a8f9492fea75bfde7393ef753badf149f1d75a7b1cdb3298c30773db5cb8e75aee32b55cd8ebe1ab02abdca9ff1a8edb43b3cda12d852e87ca3d6f0a36c380ca315c07c76d4c71935192300ec7bdeda460330c22720c271fc7b56d7589e5189e49a4ea658f07c821580b453aeee45014e9687368b339b6fee7e4386d102481a31ec3e65b456abb1efb57f1de8f26d88a4b60f1cef7d0ef6932044bf60375ee072a91478b1b736d9b137e5f4dacb8966b36d72aa6e3e75aa5a3e7306cdc62316aa662a61746973aa8c4ad972431e990492400000000531640002014108b856251926579ae7c14800c66943c504a36924702a1501890e34008e21006421888011086818c81cc31a9900354c13f840fe23e407181ff6075ad623fe9745c2fd3f647daf80fd40da5a656f4719933075cab2f700fc3a8418e75a85acd35fd25d0bf40de882969b5f47334f9839e01332c8171d9b598f723025c6dec10ee44e8b3dadf0fe7b9ce5d5cd730af7df9909d7a5618007e4db814d15387702588839ef301de6073fc83ea4d235b7b2e3084f94d7b79ccbeb89fef4d4f3c2b9db86725ce09e0fd3f3110ffa2e7f6c20bb64df704d9344f34e96fd195472b07fbe3fa5b0202f895a05fa2e05f6bdff0317a04d81594e9f824f925300fbd10e5cc0375901020d7ae2c06291e597fed4a4fd183e031d40ff7c53dea00f25f413dada77e20d274b708b9c004121d3d0bee9bd9d69cdc3d4571ef3d9ecef266044c72bb2a31377f8859ce71e90aee3011dc78634a807b9b3848617c8c65ed5d0a9493408d0022bcb1b9dde9102792e3e6f6938ad68fddd1c076a14fa10ab5adb06d4217c37cc7667d0edf1a52ed1f3669fdf3c609fa732df964b54555e38db9a5344d69eac720b68f378e7b7e1d7d815e3fe1cfb573f9eca6145ba610a466f52d886cb75ecfc027c120b8e3ba23cc62cd6fc837fb48be279a827d7102603f34a60cf7614441f8954ff675d7afe36eeb154de2cd3c52d69c68338a2c0938900f4463b5861b2c5ebc641ee487be13f471d36e56552889b3c1beff9396ec2d9a01f71339f465d30224cd92914ed75b4d1d4544e264192010f08e02b70865f74add1d721acd8104fb6045b9540225ea2548c5926add21ca5a2a2b180fa721e67d4d727a9022f97151f75fbf5ee42b079294cc2dfac98514a5edf2a6fc9f6fae39e2719ae422499909e16d78560dfa433fd8a1e1ff8761ec07c1e2d78be3e34837d7a18f8de15f05b9814bdd0a2db2a776de8187785bc575b95e9a9f90ecd82ac29ca033dfa13fb81272cf762bfeb246cb1171adad0da25a07aac1a75014f1ca9f150c117801bb4468a443a34dbc950d1971c80f4e89bbda9e7ff5106f6b87602130abb854434042cf8fc9496232a1bde643e39abb89edc8486e7dab0742a2b82aa9bff510f076eb8a7f733274b428f59e4427139e617f663e2cebb10e308fee40e7308d125928baeb341da089cc7d0b8214ec9d619f2d11e1094e8bba308594809282792dd4b05aeb9102dd13c91075fb659ac5476a3453b2abb08a120151c71a0fae8ee0fd9f88773fcd29214e623f00017c262e5c701d737b1c768e8845b2e1d02ffa217d1771bc33ff6e87a2861555b3a18597d48b329f7aed52614043fc48ae25d45c561160d5a7a1eca141f0344ca9a600b13ea5518e58fc8dadb13a9093e7b4366b913372158ab2dcc134136c9a152aed47cac1ecdae9efcea4c3eaa3ec0f4a8088116c82bfcd34df46b94a03233a3b309a3ea388fd5f3435d587883feb8d00331a6d1a3e217880ca7bb53c12fe134514c60eeb6b0efb80e5b59ecf0661b739f753dedaa0c8a168fd975859e3503ea739892232e4df7d82095e58974b8ddd3f81f4e7a66e893d3d6db9502ae693d3ddffc561d768f9549004c5e1c705e552ba5cce9430c4a2ef25ab7902119cfd5191a0221db9f9dad1b6d2e86c0252cbe64480de8692306baa70ace83e87668124b08395d3b86fa9fd3eca38005ad8e1c29696961e7eeb36d69f14821a1fbb1682028db0a2e05e6eddb34293650e56a61c16a3607486e77b40557c22e80abad1918414fedda809049375bb0a535342e67006c3f00dda8ce368eb260798444af8c6a991f09bb1aa8f2a7ea675943274b668d5a56c305ad75e426341cd81677cfdb97011e44f1945da5740cea9c204273963ad7234c09af88f7cf08bf151c055ac41ac261638c521ad30172308a38e49a677de392ee09e9df53ca3565ec6aa2b8c236ceb2d7467b7d37ca4f214b4a356c5f1f31a29e94736c13253e09e75b0677183946b6cbfab701c45d529aaa32d7293988bbfb4032dcf79c0c13b9e9c5fb8a09692d6064f73873ec7c29a43daa856435aaa5f23fd918b832877005570d72fd608990dcfe294776c1252b9cf3fcd4e8503f4b12c069cd3ec422f608bf732ff2f44b645343b2a7268f2ea9ec25d3009baea3aa8dbff53851aeff0d6d4a933dba777bdc1ee8364aca06ae0aed88ac8874a26eaf051be33f7523eb59e237047c39ef294f6f4d7e97c55bdb0a341b3d1a133c0e7286ff69af946f68c33ec64d477fc32ccb1bc5e6c1c2d233387af6dd9a34f966d5010d24dc20aacb81f957a6dff1f328b492b1925d9d6c751a73d0a9aebe1896abc051a7575d0d06d951879e708fb555df57ee57ba4629cd766536d71ffac304f871e90412cf6e313ba2cc5bc31f45e5a1e616270dbf82cd1616c25b8dc1946d16a52367d8683181d07abad3e3720d96659900a99d6f76ed7ac61b50e0c9da5d352d83d86f8c50af936ccfc5689e30231959f56505f34474604833d642f6a615a4cbf1304f85ea0056b497f56fccd1fbc84cfd439dcc08b4a33f1046eddc609df7ef6eff607f1f35c0d3735df51e61f1c2570275dd307f997b4f8879b75837697981111c0ebafa2646c372556c49ca89adf0a8dc1715b06a234400efe287c4718c6d578e5234eb584d09608e79a3164e6b2713c22b847ae0cde351d59ba5e884ab02209810c4574833d01e3adae2bfc941b6ff9f8d804176f705153dc1cc82f4e426270880608192513e39c0f6c7f8e732de084974d3dc306f659cccdc438da7c7d385a9275884387a1837016e40d0c121846ac0b650c6bd0e5c6fec840763038d8dd317f6fbd8a8b62ce57375ac0a0167acded643a8802d785e112167bdb466fee68986ded3fec81fa23b7e309af20abfcef73f8d2207ec9b47197f367563ff208b40d6efe600eb2227bc66b00155b4b90d05e16cfb9d89a7211bd09a073f7308490c390e5c5c61bd1ed23d3796b8eb194427c2d9051e1b844a1df755d9e112c7c7b3f4ddc4141601a7e49dad11faf099e586a46f0be15fa1924c0d7e7b101f054280f88b804264ee1c73987a6637118a8811ebae920e2386ec4fac6335ccef3cf014de609f8a171094be6e15335fede024b6a2e7a0581aa82a4f65f41433fe6a18b185e56e1f104052210daccf802837e6687ea9d0033f35af737bdf823fb7fc45047de5ae003f72ee6ed19f290c83353065e720c031cf9b708be3e497e03ccbf33a8029406813b323c4ea8e91eeba291777a1140099eb2369917bdc63bdec43a8488f07967c31cb721bb2cf180032b1ae0c7047d09f549ceddd2711649d9e578ad5ba80cfaa7d44513c6dd6ba187fb12535bd860120acc6096d4fdd35bc20f260c1797427bf2b8c4a426c09bb7e530c95d487c54135dfa30318b83f51f9453752951647dd4b96ea0a2b9f2c28d2cc65b566857b696ca659b3baf7737bc7807195838c1a1b88bcefc9161044ebadff97a1b83e1c3b3c7e3a7ba81d1ef80081cf9bf383af080af35cbcf4b6f4aeec1bace55384ad1d1ce5d23a37fe550b82ed6d98cfe3a601f82ea12a595af984737740440b66efc8a0c1d03d28c55998607da6a9891e1f661d80c2ab5579258cb9a4ae7d5ecfbdfd679086c8b7a2415bfe63ba8c8f47f8aa7ca3fe8ee7b71ba8a0218ece725d7af8b5bcc338f067c1f1331575e6c3256540e80b3585e7d8ddd2801a7fdf2fc62c87f44f6595d7dd573559a70e3fc7bcfc6ec7d781e74f405fde2b9aa70ee9bb1f56cfc01181df6aabb673e332f869b04baa9cdee6eb850b3963ce4004dbe828f0a7bf72da231b767d22b79b9fc93552f11b2c0092b3ad9d1150c1618301898ffe2845619aca1224908134fc704121124ecb766e111460761385c360914ed1a5c62c608a040affced5a4fbfa761fe5365885dae27f88dd757a79b97dc9016f3c2741f7d7718e610a6610b331a161a16d5ea3825b196017b78b0376d191298cd1b0e62d5862990aaa436c9ff427eade34ab35eafa54f675467537eccc14bedc90b6e9f66bdcf42c8ed1a8b062122153c7288f048852e350e14d4ae6d520abd0783de3b136f64c205237581e81f9308cca0f24185fd0cabe3de96de115072af2c10c13b5bb7ff85137c234a05461c111b0206c245b826d700bf30ed9d2d12890748119a34a072bee1aaa225eda445f218210606a80f0e9fbb4ab18d9b3bb2e902d55689a501940f14a60b8da3e9706683ef63f77bd86e46fa75c821cf2c0aac787a5c37094b63c4a914c3118befc3108647fb2616178c7227309db2eeb533648018bd16f3939059033b78fefe5e28ed802edc94b22dc19f61a823a2e5450f5f104247a18ee68f418833dfbcecfae38b2aec42e0045dd286574a796d9df7314fe43cd40518feca4cfcd3b0ba681447742a6a85ff2c3c004ecfab77c26238fffd1462fc5578879f29e271b09c6182ac9ce715cd068fe4a31cf4465691988d47f16f8a7f2117b5d1b1b0b14e76ce191d41e433e0aa548cd1fc3eb91233714414b0064b255f81cde2970d6775ca4cb09ee77a434c11b574a9fc04b742cff8c063ca5146a5c9d7e257c2d2bdfcbfcab4d41cb9ddd389cdf9d408c39fb6ff66798bfba5da5a5b0b6726f5881c383045d39bcabf39a3860277e4946340c135d58c6262585844f2197ab82f95d503fdfcaa066ce0d7ac77a2cd20bd1cba7bf2e2bb0bf8fb4e991a3008c9805926feba3fd44b0710277a7107e16b1ba0096fae7a06696396de606027de91a2ee4bc08d551b3fd088be1fba0668bf8f3aafe750149e01d98056024c40cfb304c0a408b3c9d32f1b680fa149cb1cc1b9ae80505d81240990958ba48186c3b0be2c43e4a03d6001c4f667b3de65540d1f00ecd39be286acdbbc15e48a80b69db4378b743a8a373788e0186b415c09e659d43b990f3c51919c3bbb1fd0c3a9b762b9878cb8922f31d97c05fdf715569b9158ab51e598f7e5ab8ad80a0d6f03ff94978baf97afb8e4114abf6d610b24eaba83ba07b2331712c86dc652d059f8e6022ce1d2b419b34d556c3faba78a45eeab9f812efcdb9ae2d7bbbac581717520aab41625a9ab876088a2e9eba68ac6e22e17536b31765751eb820e48d9e936b3f5323ae4634d8d0cfe6f6a21fd64c4564f8e0937d4fe712c2256b37c4cfe9cc77b9d4ad68d55a9f2b649c162d6640382134c15699d516dd7f24369aa1e8eea2dc0a3b25fa9e216b70e8c904e542bbc113b9dfade8ef09efc914dd0090e87830bfe6410062b929fceebabbded55bee1a36d2813ef149c07b38981893ee7e14fde64b18d5e9f44bc4b583ea21ee856aae520e0c85ab8541586a8518ba2b41d7fb3e0ede484e8754111e17626c36ba6a66025558f53a870797cc59ea296f438282bf6f9f3024e75ef787a0185b51b8aacdedb76684ed5a73510f313e71b0d43622882d87e65a4becaeee900b08b551059f2afea19d42ae231f69ac172bde033a3895d2af0527d18bbdd09dda4699ff41b251080b73611924e7642c4d5c91f48eabeb2f32a7ee5411a009ec50776c8fba93f98fddf524301f5fa15763c746c74aee52823fcc6ca69fa12cf19e5101c418cd623eb6fc01da31327883c387df523dd3f601a9f1eca44588b403873571c0c2f5c91e316d29ebdcad85279ff6b768fefca6970b07da6b008ecc4920298fdf5c61bb01bbda14a6c5d1d5565aadc1a9b40f947633e0766843f3f86fc8700ae38ecadb113357a050184d06d9410e9f44d03341f6ad316fcf06c192311340b77e10a7df6bd71722f055e0430fc681963935e1ffcd17a311f0a42a656649a314744afba9ffff6021bb53a9705d052240bc34e307b04b83a7f43fca1cd5142c77074dbb1f248015b345a19a3b2677253ef80dbd66081ad41826f122d9b5c51bc46f2d3786edf2ec6f44dc1cbbfbf6f5599bc98e0fe0493e7cde17878001ce9ddcfaca5ea7fc1406922416defef86ca7821edfaf0b81683898557282c4895f479aec3a358b5be3bead4b8daa14d5ddc6a5269c7bf9445b84ddfc5962962457bb5aa50acd634084a07edb32513890cab74c13d9ba1957e0f8072ee373a677cb8c4a60e336eb3c75e971a18ae8968671e1315da11a8102dfd8377a9248fdb5d93f5c58287cd3e3d90fe934f2d6801fa59c4344bb421f2d0cfa2089805ea0597d062bc9017e5e553f767df52f81e40230d8ee18a2133a7b6c576dcef9c1d58bdee9328eacaa663c82f865208ba650aef1a82f36440b614766e461199db490106a30b483469239230ba48e0f81fe311224889d5261ebda6b48e01b79522aa93571e2ed09841e141f9179e27cdc2dce2489db674ffe970028b0a8f579af7a1395bf084f81e6020ac161b149b41a185a4fa964dcbcabe9cd160e7d7d5b4342837875763530fe9b473cef967fb6c30918607a869b0a1f24d3b5814a1c5eeb760ace511089322659e1d3bb28bec8653d53d34ff7832636bdf86b94c65d4e1f749ec9e729318716a76e7dd964a8b4964cefbd3b212f0497c07878a5d2bca0bbb5c3526e1dc95f46951138d70be8794457cb3424f1704fdca125debd942d315720532efbbdb02fa6e8c49834a166b5e0cb88cdf89ec9933b867bf35707daa5be9a99830512404a1501c720ecea77306f2e827adccc1eb519aa53be78a54fe2ee4c457b101ba03d1b3ae654303cde2e3605a8c9668eeb322868c35711c387fbdcf432ada6bfd57160d2f1742bb8b5c1e81cd55e34675cc8152e0a1a77d914838d3ce88a2a59121f8162cc576f72cfcef7dc5102d51aa6685f5e95a8f75ccb924f54d850e2bfd110b2d3a7e0df48aeea61a3f9025a15885c225fa76c26e180103a6157172215ccde24a5200772aa2c7cff255e72b2a7c4b6042c0470e2c02dfa74d9a4d705c7af18756345da8aa0e43274ba8b71de50e7d0e2c057c7584e03c65e37e1b28425514d2550f8fda4fa70bff56c801f8767fd19b11ac5a507a0b00cc472c63b4ffc826864f797e6cd5b207716da38ad82acfe2d6f8843ea68867d011bca08f95f8b668bbb86a25027688702d8d43454c7bdfd34cb92a14462e27181cbff678a31dff7a76b37d6229f25da5dd5a107a27ed4f15b33445e05a6a960753c6292f9628b2924b5f0d9f2733b197f2be5f9840e56f4488d7a14a2aea49ab6c604bfec932e998291fa25290ac883ea0c313b8373d68acc6c4787b5c3246be061969ca4f182d4f01c487c80b16414911b9ff3a45444b17fba077dbf96629aee584be9fe8dfba131fc7f0b08d9930f201fa31c7851353da2f7a2af68b750529e70118ee0d39f5577b31a01ac421d89d21696890390afdc3c35ca958464977f82539abc2aa391a32cc11d743000ebad6186cada0472af6d47f67b7c00b2de43afaf64789c31f56a9b009b4bc589cb550a5cc4f24f5ea10209aae601b6e237c0a54ba38107c7d3ca505a2c3a9b09f4e00832187ef119c54553d86a22dad593a5958042c736ac344f8e140a966ef8960978268f2383ea10c714b6a3cf3a251047dbefb4dec77f2c30d1ddb594939fa9719cff248741d82d362c026fd377749d16dcc94a2e1f6ed51d00fa10bb1be2ee584a5424d36362d187f79096eceac551796f2a3bcd78514f42e55c2a291a4b05178d0cc17e1ae95f5b407aacb6cb2f9f31c12c0ebdbd0392e7e8b8e768a732921ff6c2cb28a3cd5a6c9c728a5403b63054316b7897c7cf4968a13805e5b84c4d7d74fc3d5ab486fc7a860839bb64df0c07e533a61488727e02931e5670dfc55f53dc2d99ca4f6534917f134500b5d9ce0db186e96ee7bb1ccb457e123d063da449de0bb62f090f430ac3f7268d9d4ccaf0ae97b311ee817bd12cff9b35ca5df207c4d0a6cfd4a6bb4e6567b79740a53a06882aef88d1ba4fcb76fcdb11da1c3141ec5bd718c0d55925a9325e61b2e491ca4e61d50e43bc3cdb4fb7ed9d1d90d3915617cc9e781df1d7d19b327aff406a413f7ab4a0ff361aeb7734a2032e2c03d21370df5f163215697bbccc12f488c6ec7dbc8bfff529052296ca0979aa322c824a8fe5561ba80864306f8f10eb756244c7091f074574c9dd247345d724c59e0dab2f83e088ab29fbf0654e6d55994640f1caf3307de84a1f05504dcb26a33ce9e4609939a45cdbe4ef016e5ffa53948b88316859bda1000f592c4be967eeaa7df50d1ddf5700d45814091d0ebd2e3888263f80abd63e4f41dc10ca87a460f8df0ea773701b3adf69f831ba915eb1e057b488ec73aef1068728aa4e4e0a1088fb64c3e3a5ef65dc9c67c38e3efd6fbaef16224ae9f42ce79df28e874ca59661d6f6bad5ff570ee2a8a6603ff3b106c6145816b91428c6fde2339eadd69937d7200144310a97ffd2506420557d65ad9a4e50061f6efbbb75d4c0f9a7405b98ecdd681bbe4d85557394194b6bf863126fc39868f32a863a344c13b08a8c6cfa2da4ba05c9c4a6310df6b54943b626d0a0747858bc30351e3edb0720f0a3044a5d428cb0fa5d5dec12082e6370076ff105992ba59485ac502c57d02ce9fa8738102d3702ddcc3df91fb0c5ab56441e918d97d9e274f68d4e20ef791507f249e4e32ab51e41a570da798e5d500a1a5e4a5ec0cf7cd6bfe08193a2dc642f0e859d72a5ada3ace12cd5741d7d0734ac463b0786b26b6e4a1ee51ba7ab6c742c29465267ce7979ae67bd7680a2cde15289f8f38a265a0f48313e0b28155fe619469322162c39cacf242b08256de3e21373746fbd714b874914e40da86d26927d9b1b6a6efd7b1cd0c1c834f048556d0aa1c208e30768811928894a308b44f2df6af50b9927c0f10637948ba2df5434278d306c54115e79833278a317029178eca246de0549e669fd2a8a4079e8894e67244ff8c0159771f3c7dc78b9cca0223b3791e1cf89f405fa490b1aed98d5c8ca1f875fa7b6f846de3d980d64887a1899dc686a72943592b66698ff36180485d83eff5bfe244fec19738387d2663710f101bc4f712e8917b43fd90971d3cc7e62f77fdd605e9d7196c48222c5202fe0e9014de201db19ccf88de4402e25df478eb21e858879899230bf8584ac12968a35cd3233a2f205abc34af5651831f0086cadac7625401fe292b279b9dd730c61446130c05195c77008ab01753099156143b93c0d667bae9964f079454c6caac1800fb48009dc49ea336fb6a0d32b5938c2ce5d19915eb8600801dba143c5ce9aeb7834d44821ea0375cebe9be7483a92ac42825dfc0bcaa234921ae0a5f6bf1c2d313bab3daa1c24410a91f1b83574e963a9755a9adfca807e3f553c607ec20b2d897c3cd57256cea35885fb6e90bed760b4363ddf2b745a6b4261624ea9040525a7be455ccb61a121774922919195c21f07490148737b4b34798d25a9d0694aea62f402902dc05d1ee19d5009554f2a9f42d38d74263175b09f75b84060f7599576c1c161e912da3212aece720655ae34d4bde39c637ba7128b6cdb4c1d821a1915793e5c207ad6fc615d89627e8bab240348be67d6ee275609c0d0cb105cab03e04a2a29c2c498b211f36d3880772f1f9ca10c059b3ef3348aa8c464c428bd247ddc46a878f275436ad30641206465afc26b46e50ad972f615cce2a5ffdf7945c0e900b11975a4e04274c2e67e44dfb65546a61c1d2425cb976817aa6c1c4e260c48c407093003afeadf045be415132670426b68999da575b0065025b75ad3e79ec8ee50124f681f3abb6839112d20a84725a214b4a17275a88525b75d3303e600af45649dceae0cb5f1a44693933dc4694fdda6642ac879cc019a9c90e43b2621597f7ca45250acd99bc6221ea7345ff8928f9e81314c5815e7627a8611f6a3b299024ea26ad9252e7368fc20bb905f64d06e7b25be40bb69bafd433a155b15a18498b708e3008a9168276d8dcdca7c10ac55c79370530087d12e3cee626974eee7f4eb14b29960ffdcd80866e80534245795fb48c7ee8f9b441ea063470466cc009b28184157edd45f805c062a7ee8a39e6cff6946802c105c68c6c63e6584c8b8a1292c40c022dabd48a94863f2d6d5245b8a3228ea9dde8bd3cc97087b1df75851808264bc79fde69f33be39c010126b1d2641b1a1b214d9787f5e0726f9aae53e3fd1484a8ee2b737de089e278fa6b403d4700da19d3f2635929e2c6c4b260b1e16d4ea389b7842b4d980ef0e6f4943626cac4d80255593926ca62561136eea9a9872216bc4417e9a641aebbcfaf1de9b9c4c859546434fae7310906c19e9f3e573810b0ee45f01a2a6e9cb30d84ba81dc325f51e4b829e6a77e9832941a508daf123a6b068002c593ab869d5e6ca7ec003c81ac2fe47ccce1961f78d9671afc38243c4ec331cdd4e365a7532a330c0dc27487ae88ca0a6db396cacd913d19e7239fdeb91d481aeb9189ed82fc4d7868a224b2e2330e5a3cf92caef001b9e6d278a84252f8dadd0e7153a9e1bbbd4f012ddceee9a9dbd22cdcf430eee981fa9607bcfc73ed4a1c1abe9d4a5f0662121cbc46f7f891640c9a624489cfb85ddb05ed4d9fb1c3075cfd803edcb76dc4a0e2be895e18616eafd8c25cf8bdb6c1b6fef33749cd709ba2ecc7850608bd444bdd037c7494b63e6daf48b986286671216f46597c36fd5045fe146778a3f3ccc5e6160106c91531a2e7825d1995ffa69e329123d20bd79b43e069e504af3a5e40e83a93663f014f18026c22fe6f81a97f1c3b3f751bb0a5d0cfa5f2d5969849100ebb10baef0013f6b75fd7217e96e6190ddd0b521302f0ed12bf3cc84a216e00b5337e2e90d200282a818574e7b682dd7efbdcc28e80b57675d95f1f70fc6164741b5bf3538770985bb735b4937e6e0638daadfcfa1042218e59dbd899ee41cad2cc02b8ce6c6d6918093a67664d08124eb32cb5106ae896cc537cb5b559c97f8f44c9376ef4d3ec00fb27b08c2b36f9603cac389a5bd4fb4e91fbc361c1de8b747e30eba3b619fee8e5330ce64bbb9be594298d0c8678a91e58533006f2db0b715adb13aef329ecfd93acbf77dc5e5d40e7e11a5bbb5104b4df6a32d67ad74fe4d2394a5a81a5e3eaea4c8f4a7b11a6b9854250c4ca908bbf01759165f7c42436e68de98936b3a5f36cd2e545b96946440947634d9c8baa37c0d3c161f5095efae9c10c8aa55beb6d7bdde2cf262a5df2b9428763c6e061178fc45401616d1269a985965d1e6780c6e0aea2906760c03efa56632f7354ede700120e0f811a4506be1a0b8a6ee54d22029e7d0afe4aedf9ae5e29e04a0097986d6d29d88c8ca989a5e3b34cc6621bc9e94a3e0a54c9e7da13673a21beb75faa533bffa921367420fbd77c10973cfdcc8bf7f39d9f9be1e080f978c360babcc92949b4f6786518d1f6fa23fbb42194c86cc2cc815964fff2073adc9f34434a5d53cfb2f9cc49bb2a047d30a8d36217bad310e4fef9cc81ea89e750c7e0acdc9e87c81300d09d44541c49449e8775513c087a6d474ebd1a1105d4038d27665a30138f08605b2742ca95d59229592e9c048ac37033e68254f6808a7030300bebfa1254497d2e68d7e3c70aaf990265b6ce2667933346584fa32c966ddba8813c131a7974b06754c64f8e35475d907782e9ecd0c1d0dd2fe1d3f6517c58a1d16ac7a841daf595cc35c6da2ddc52f25dc66225cd6356120b47d99f27a201ff363ed9745edd4857a5b2a98699f680949fe0267578b94241c765527fc76d868874d9eb049683b7978658d780aeab81f593d9295d7ae665f9c2b51c01c0c58206cecec74332301ecc68b9193bed4d3dcbd2a9907266bd25662496f2227ce8ca2f078f6b5eff424c8f975a21d820465ea2da6f0cf612ea7719df0580e9b7bfe445ebdca5e320bb87adabee6f9ad1c9a6f8f5dc5c55ca22d6038b242047844335be682fe25e60c0dd921919242fc620ba5b0a10a25182ff680c62b3d821befe9bda7778931ca0fd5141b8dedb8b25738ec6c7991df71562c08911e4ae89f82f5831e01d236fb9eade10f009994dc2c655e2104bce4d4d503173e00d17a7c9bc5b05e384523bad6c77c5dd8ae5d15560e68bfc34c37979272382111aa2f6227b5119262865afdfbac2737b69eebf00c446b8746b29d5801ea36e9d020e452cce76a7211d9b8112feeca7b6c3c91f8d011a5238d3d862cdbd7118e547c6dec1497fc237bf15f293bff00dbc7c0f0ef18d932535ebd9015c02f2145e4d08b91baa902ac35014284e6e843329c605fc59323c5118bdbad744c289dd2d4f13d5a1384a987462e24af458be445c4401e59594e5e7bc251500c2366b5b0fd50965841ad7d180ce024ce35a178bb147ede76a1ad791e3b6a84c38f7a247d0e7102ed7e1eafb4c1e71d5582576bf8fa10703c925c3ddd040553acf562c2afc6d0df5db197e80c8a4a05b491048ce6abe6583ed5d551553fa5bc3f02633a0b5b4d880649fffb2c7ba1dde4ecf267c0057fc0fb5ecb09ddbdf6ae157294a6e698b84bd1edc89b7608f6aed7b7165212061be0e582e343a2e1d112643584b5c8353e811e97f208c83210acf5e830f283c695a829f4dfbe9d0660ff31724c60232c1de8483e4e08c194a4ff46ec1468f9e9814754c5de6c4bde9e47964da060b2e36e71e282b269cf99f9becf36c24985cf1ced93c5d69713331e903103d30d051b8143d884e3a1bf6a2b8fca18cae644daedaa94a297b9e096655f4b3f6a1f26533c28ec6fef5f2e5981e6e5980ca8311ad6a620988e0f6e20c0b925885baf62c546c27d7d6e9b6d8ecc444a3c9b68c19b050663b0a8f44f38240955f2c8b7795c9b81cece8be9251d0e87e11898ed1e129062375fcf91fb52d1a3a410dcae334cd70f27d81318396611a43ba507a23ec4db0134be080b63360f4f90c6cae5b76c0b3e888d9f9b0052d3c81f5dc07c91815f55679fec375f67248fb1a1666f6528832b1bc7d320c6661e321a397dce728710790a790fee04cd1b4ceb15796628a5d6a6097596f9035ac0485a7586d453f449fd4966be12cfd35f1e058458ccef64120bd4017f607f7a406fd06e3ce84d468a9a273bf854c5aa3041ae50182614adb71e7934b781d8466bab04aa617393f0664c48ecb20465911903fde2d8a0ee5899e27f6fba24c544cab1b03b7d6be7fff468b0c78385b52fdb5cd23f53aed46656cf2b2992fcde2e16272cbee85b5119c91518447292e42fc6422a833caf29a3c8b017ec5ff2384f690df1e5ee383a631e868d7da16c30a4f09ad055cb20d515aa306eaf10b025ffba39eff9cd0089cc234ffd3d7b147caa3dc2bc770b494d3c47a1b8ca07d9b00c296526a66d08d5a5d8fbd498418f8497706866d39e241dc1623e167f84d39d73a62de3f8b6c5c01e0c8296032a301a7525039d281deeca04bce89c1507c01a4f45100316061706c54e54db34f0efd642ffa8b1df7ca9d9d485fee7639a491b35002227783499f727de22450d7479c4a42d8a92ff756004206993ed1d12aaa031934fb3269b075edd82c59fefd459f90db546888768df2ee5acd3bae957174e984c9409f1f8b1c8c81e4e1b3b0828e2347965992777554d697a1f75b8117bbe3e034f437b2c249c30d7d919c792ee116aa59b5fc791e2f2e553c4e4aa571c0deec798e503cd5c58c538c842e95789490b640c36fa8be39ec769412623ecb04b7fca8186101449f0fdf518f7d4950c8d01e6596c529353dc8a88095cb5c3364fa0d1fb6cbea53993457204f00e3c8eca4094b863ecdd74b6c2b122e03fd0531d4685b391bce4b7ce8dfbbe46e5bf087d9a851a77efa97ea9d2f67e92e691fe5fa33199434afe14510b71d45cfb395af0c1039b743306c317c65a7d6323db7d69b93683c6bb1451df9ef9868d076748b197d7ddb745b0934e2f568b6738dcd680e159ab52fed9618383aefa45c33868081fd529584d59733ba74b090785362393ec6ce080ee87f00eb4dbba0e9c7c041828e78906aaca0480711f4ae6710189f1036108ad0cadaf867d7845dbfe627dd4d3ae794a259a37cef68b8f8775cd0808242689632e5dfd9248b617b8c895a5cb2481fdecdc30d26502b08b3507743462288affbfe24684b04614be4da9c32f3a0c30e1812af4f5047d281466fb6e6652a3a2d8c06a2c8836756c53c96080aba7f25ad12bff403276ec069962dc53dae28808988072128503b140125f89da967093f3c035cfae75895499cbd8e12375e05c06a8fb9ff35d7eb05c3db5b4af19602a58ef65fb709284a49777f1486971a645a2814bc94b1a239525181faffcce531ae214dfa237a1ad1aebdb7200ff5c9832d4b4caba4a08adf772e8048cfe61244738d5f9cfc1988080d4352b95f1b2758585f75c4d041c1dbd47ed88f543bf13d07c8872fed70f8698af46775abcdbd45ba020a6b672dec4912ec4897386361501c0391f9a98014a786d06ab240a3f8853e313c81b2aec28fdb0edbbac9f0f4a32b58a41f6efa0bf1c97e993a49aa1e9a6621ab3e5e3d59461bf48dc3c57f8a920c23071ad305ec773e3d785bc597e3b4f4472d6fc819a9ed9db663653849933a76c588a6e6ed867fb3791dd6d8bd9fae18e7ca4e2a3d5617b2d759693ed9374131ecb4047a1e1aeb15363a90a037c74edb7583a507821f0f4720b0948a7fc9d04214a04583c3cefa72cd008450ab4b75cd27be74d120aadc568a9f3be674103e5eeb613866048cc6206129a0c915e26fc4540a63ef8d013d153cd06f28ebf56e02d023d4cc4abdcb9eff9f410f1ed99d8c665f7272f60dd32523ddff895d500d947f39ea20578e97305a7f49983028406809596055c0ddfb77e051a5779057dc82aa9ddaed95274fa51f020fe1e354a2c53d2b7664419bca25aa7bde8d7c9a700cb60baa224c3c8048714b6e8a572a597a184921d11cf0725b8d4ab72f36b1edc449b6314033bc779cd3d6a3396d1b6fbebb067a90883c1956e569bf513dac51bac5e2ba7fe8b1d0e9dea9b0b088296a630351083753bb3c1f12e8dab2a66afecfa7b2ceefe45405e93c97776c61f8a1d577ff94583d96c20bebedf0cb496b11ac4331421dc2529968415472235b69c2d8dc12b9ca5787a9c3a6992fa7722d781a63e5a3c224dc222bccebc21acb227a0b84bb1f5a6e28e47ae8e7c5d0f1421cd6e6afe326cc521eb500c384dc07e423ffe2e5ca6463b85a2ff642c99a28a1c0982571111a8c367e428d5b2caf527ddfb69ace2ff0986b9a1a736b2669ac5c5cf0dc901218e50fe24ec27854e707278767476577f026386fd490caac333bfa90aeb25f6d8bc7065a2601a34c62720368e00d90729e72c36cf6fbfd20390804ac4bd84e8ff9fc78671304d89fea637cc8483b0951083c7f18916f9a01c1ee2261df34fc714f6594b7167ac926861da83737bd682e80ff6ab6036a674c5cba8dcff52f1744e5d901979006bf858ac19f67fc0ac1c78e9b7a049751629d0d45eb4611b906be439f1af44f3bfb10b96318fa633fc09181c7a8ca956763eb8e748d275103871ba4b55b090c8efe11089907540ef2db146634996a695aadd0144564c02e8ca82ea28ec0ca7558869b68ca3a364bf024dee8289b06df76534efd204b42c8427091667a903848d87d693f17be16e4659cedcce271191cb14f90c474d114105b36b5b263d55a93bf1db19f15872cabcdc4557bd529a6f844cb2afe295eb04b62113cbc847841fc8d0a9a874ec2e2a05e0cb8d9e1bfcee0b14f001e56a094f1ce69c1db660244e1014f67954d11e49460a13f1957e31bf38ceb7336fbaad8b2b13b0734581fc3928ac8291a431988aabf51ec1fd24cd49150392674a801e99fcfc89b73e195691e27c0df48828ccd1c4525cc96858b0bcc1affddac86cd903c73df46afd70a5b175705bac486e44392075c6e8e824d4c70de287f962c4d03d23ccfe37d19c30543a043bc69c893c5c12b1e4f5ed387da5f7fb473fd555d2feeb628e104f5b1ab3dc221cde761617eb269c6de587f97efc7e19df6d476e0c99e433a691fe983f203b1b7f195cfc40491f54c90e39db7e997493bf19e19f073f4774ebffc0981754b1388b2fe23d226105217680881c8169fb15f1006a1966c7199915f50f07b93a3eefa5c44bf6aa97c2414ab9b972e36a2f8d36a10de95e9ae361b1171971f1cd486d90a2ed794a10b3b8dc01f951a9cf65228223e46dd0421c260f82dbed4fb81506486813d9d715363629c5bd5066f0b65a68be8ed0ba2940a0cb76ef96275157fa8bbb121655d3ed73a07a65d2bb726c1ab438bbf0dcdd0e39c64d9dc8cd4e05e5a905b92fcc7c97391dfe17c1ac65c858ddc1d78a64fd847f618b0624e2afe79caf5b26bcf9580fd1a9e947e9b23e15dc20acd4540f1d71a42809fd5fdd9c5d20f105833ba270307502649eead1c8c690919f4a8176a74c2c514906a1412cfa014595008853b9d15c3079370f7693159cdbef82a0abfb6d3a8c5a5d8d3a19e97ce0a338e1272b6c5f88cd0d95900882daacc287330c5c327b4916ddec2d7992f23692c70ea644a1e88e9b761c717134058c6c4d69e88ae9daf65ecef41b11ae6da3c4483f0e59c2081627d9b6316e909575068a08dc10a901f403b0ac951d8dd25dbe3113d693d9eebcb91c6bb04ea61e1d79f8fe6a8c909f6d3161c70521547c5f31de58c2330ca4d524195efd9c875d92642ab457437328999c994a249f71e64c91499ba051e5e4b6b9496b24a4fb4a8b77ad6f6ef834b0655c9513c2c480c064ab3e6ba244145882c6ef48547d583519cd7cb770341c402bbc81edf4468c2c66b41872d138989b3678a201945b1cb1b32a5813fd2d0791fd4652dcb39398827cefe023a6640258479d58db88998d55a71c43f9451e2c6fc165bc4bc0bf1d716c57276587b01a12eb2c86bb2c2ff9a6c09440c8b467fa0384c02583281c33693306a9848deb229b79fda5cca47d59dd7a7d2f213ef6d053dcd354cbe83ef69b277c38c667e8e28c262693df13c70093f93770214768231d084a7f894f83f6a711eb3dcbb540c802a40b8da5f80fe8d3aee33266f0a4b15dd6c54f686195d3ea0366b54d8c05685564347ec75c8a89e00ddb2fc87d2a6a8652843e1525e38407ec2bd4a96568a8c7430d53df9bb140830b2b7b3a4a32e9e459d16fdfd5be8d0439595ac2d9a683a6620d5c1c9c85e26ff46a0d9fcffb7445f932c6704d632c670c21753a8c6fed988ffeb5e2a3a2f204cac74a880d7bdb7c8c884f800ee37b4006e7fe21bef1071c3418a8e341c2824cd27e5a5f3835538064c4aad456789708b93296072620532013a631d721359e355c6e0dd16bfa58ea7d0687e24257ba3bca014d59120b907dcc24afd31f21fd98182fcbd5fdb95539ce139aaeeaab2c2a5ae1422058df255bba9259543b952c55474e55775574b4a6e75ad8a2ad1d48feaaa2cab1cea4a29a2a2ab9f4a975a56815b719bb9e20886966c9bb20ec12c156a022ea1e77bfc9bc4fadc952b561d2cbb02c416125adf68c08e68342595afc6a2ddc2dc6b2e08fec918e230a06c9ff09e72ae00b225572ae281e90250b1c00dc3ed23f730bc0081f096da6e3c9c5dc16c29fcae5e4e0705ce389ba8a6698430115601de1fa11040312127d1f4d452d8625b42aa04a6e3773ab5e186168ce2fc1d5f1ba6890edf3d7f139281884015c8757679fe624ca70061bdac42d1d5c7b958e2175dec8281e754062c0c72bb343a8d11b888f4104e840b028ffa22cc6e04a8701cc232f156cb2b4cea5c602078d417c26857843003846b24d342bd412f43f48526932dc908e58b93731370516f2046a950a84f8d8b609d76fc9200eb82840446314d285f98949b402e054606252ac76d247383d19f9608a40af5209e08754ccd81179175d2f10b82569070192d02a365b29a09bd13f8cf82c0820b2da46529100170a2b95d27c67c51800948609ce91b1456123831b7001bf53ec20b03a1ab4945f865b22add0245cb10cf8f5260b48c6c73e3ef7aff4f00088e0346aca344ad5b16c01a212ac1e331e98fd61f2d410dad89810b2c42378d3ebbdf8f81205c018f84c07867426b801f965f80f1439a02a3903ea3fce20093c88508bc2c06200c4e24a7eb069817058d892948805353a09b6bf0d489d88eb425469cca0098a857101f9814682f7a0d8c80b046f3ab3c8c8253a35e4494c06948ff97c7612675e406c0080444cbce363f7e8ffe2790a0700f3433d9026e82e86871f6563d04ad06fe2df24c7c9f725dc31b382890674928476d4983641da7bf43d497482a527cf490aef23e432b3f6c750cfa002ce3e3d546a9fdd884ad38561ed7e6f26056ede8dd23b150857a61cb21ccda3d382fede11b90fe8ca9589daf71a7ca69b07fe5a4ebeb3771b546b240bac914dc6c6e98838119dbe5636fc9a8e9881f2c6517ab69c6f41391a9edd60ece905bfcaf34797de59611db9ca7be451d9d0310d53e17fd15e42f0631af5ec87ca038f0d836bcd390e553824fe6693dd68f7c80827984ddbb8195add28490cef413ef9e2bb5dbbbb6e5792473bfcb5703af353dee817cd1efe6f44d50a35a9e14d9e204611e391501497ca361f61ed16ae5858e8a993459768f6214d8c114c34b0fc9c2285abe11025ca622c4bb2a7e5ff2e15324d9b6be075d78a040b823830d49795189c70203211d368a3025c1c809c8a367c0cae38dbd6d3671c8f805578a9c2171c31abf74662610dbb08546a8854101184d08576839b667dd25254e8f0ce0a20dadac9602b0b58491091d77fcfad9387338fdf85b6662dd26e99f13ff0c379b520ced8ce903c8af77e070b329c560b6c1dbf2c1e3518fbe61f03b521585e3b70d67f07119a8c78c10010b86a18ce3b7c945ecca215ee919a912a25d92a63d0f54725096b5e3e8ca75c1351014df031a0ce79b57201ad6a803ea2ff58753f34b3c1c4f61950fa7c6995bda52c00d19d95cc3489e17025c33c3ee522a8b15098c052c7540c075748060799d9aca94adaa58c1c00f8723285b87db07caa51e0eb5269fbbedbdb7945ba69464a809b009c8091e8553e1473c89afe48c573c8459bef295afbc880ff1d58a6918276774532251af9ad52d161b5858586c980d80700039509e84f5c32f46fbf0d3d152fa0dee559b31ce160650b526f4fb3b0cd96248d2f470f49ab161341cfd8be66dfabb6ff3896ce9afa0e7b408a5459c99cae1134d9764e7dce0d8c86a3ab664f44dc07353c06598dc3bd7612b6951e3ee04975c7f4df7e9eeee23ffd1a7a3fb7a397c3d638595577a0ee3c066d80cc621a5cbe42e4892ff77391cbd068ddbfec5edc7c16182ee9e8679899dc851bf17607c86ac8db80dc3912d51587ff912588b38dce7686f18d7b06e983f69d2d83934c859e77889fbfe9ec998f38a082f49f799cf66db56e347ed10088182060a2529d2249230f2a54d5ddcce2145293d202e6d3ceaf73a07bbcd2aacdc428bd9165ae448137dcdd3ea102d9aaa8904376534a184159e547184099e40830613a84803094eb2a0842236f0411a66e488a1830e8c30c28c18385105244cfd3a78898627390599895ffb1d3d0c9063a2af855dac82dc51baba5801b9fd12904b32204d14052db61cf18744864081978000428601326254d88225e40850fc28421a3d583161085e6c0144870dac072fb5008b298ec8aca490a208a6fe0e784962a1a5ca01c2148e30061a98bca0051e2489d2440f689063eaa780972480040c08ab3038c182164cfdfd4d2aecb86928d07264cecbf76fdb76a58f4ede1e8e73d78d7b297c55b90b76cdee79684f9f5ddc8524351aeeee1d28a7af648b8bd5f9537f0d746eabfc92028cdbae98a6d1b40ab20dc7f8c5303424290252eccfd16204b8e63689c160174f50bafbd4660e97e7706d1acb1c39a404648fbeba2b09e36a6ef62f2e7fbb6a10720432c717339dd8366b452297c8cccc342df6ac47fdae9ee5b01d295ded6a57bbbc5d21fb7cdafce247bc885cea3478d4cf5dcfeb683fde40dac22b3f645becf709330b49120e526cb1455efac217ef28ece2236666e79726a26406c95c5d772bd362333b2bf415103bb6ab5d3099b796d83489e6d5a49a58c765b3709edcbe79b9644b7f276c978ffa27d863c81619d831d9d26d05c6616c57339162bfbc73fc88327ad6ae39851da5cbe57231bbe6129e342e2ff9ca572ef695af4e7794ae27fc39bcf4ef6a46d2333e5d7e96090287872820a701724673923597dbe6cae9e1149e44b528a59c53ca293f3cbf18a6a19460a728fd1c5d25b7fc0976107691ccdc29293539e56b20ff94524b82753489d2a47e92f4549aa4a34994e9523e0ff2fde54b9e02f8d37dba6b3da534f1caedce0d57bec8250f87bc7989610e6318bd218a117f73054c1d3caffb6f125309d3bde7fd3d29f68f24696bb1ff46cf2049df4b1edaf3985fbf574d02a25b0a491281f4b6cddb3696609b18f4dcd1fec0b28ffab7cd5a0785d824ed07ce99b9c43617560353d0a38229f0344e1a48a4f31d38d36ad686d3472e5b56c5b04c8b3d418e82ada467dac1168124b116a4d8df382d6aa191dcfeee23526c1fdaf4853dc48eacea956bf4dda9b3b6751d509a1e04b9cb7d3140c880903215ff0136065895a8871d2d6add697f06b9203938b2a5a714b6573426611870fba70f6c0f2d767f47214bbc841cf573dce7234756a9a2b023e3ac524d1a250c87717ac8410130b0b3757248c06a9abbc65dd924972d6a1ddf18a9c9fad16103c4f5900239985dbda4495a8ed6c1f5f97c4039dca8fff976f0fa7e670d5f52e03133d401f4f2f2a2423b2a9ff6dcadc12c52999dab859f0256f962b4506cb17fc9ed806df26a742828bdb091b983d28627f29869d040e96ab1695889aa85dc7eafa38079a97dc0b2b1e0d1d855cc95d57eec95e77238a1b032663a61717cdbacc591891ce2f4aa57acb986c32a2f7dbe7fdc58f5f209ed7f4a285bca5aca3a876bc383220923fbca5a949763762dd4b4a669b11bec482fb56c2eec9227ecc838576ec164892b6509081f4d27ecd8da47870de3f0c0695c661ced478672fb3ded6548a459c52a79fbd5a451ca6ee7fb7bb56dd68a44cebdf26ce8701700df05388dab7daf5aecef225712e9f4901619a73ba1ec114eaf34c669b147c6b99d83285bf8bbd611f386b07ad5a70612c546169b518244b64821379503a5044b6014c8e146d3786ca5942c33063112e0ce85056edaba01795ec18aa17341d1cc90794c04cb9773786c3d897da60128a5d4e1e54a29894829431550f28c83700d240729a3a78c6b32936ba20910134cb02cb1c40d95aac5e53de8eff9f57767f680fd7acc6108502a20542868398007566bc00378603518985a2b034a290d5c2284259823478e1cb30a54a00215983b76ecd831030210800004acb79bc80611441041b452333c3a3c787c313a9ae4f0f8743481c261e95f24e214bf38d682d20e483aec40010a48c001883880901704083180015a70b8a999dd51a9c105382851801c941045020c2047e6bce970c78d5f30001ddcb841076108064085da60e00a4012367c1235d46037966d0625ae1956d2ae17a752a954cbeb31434a44436a65a546a88530106b6daee7a33373607534c96992d364763dee1f13ecd0a7a3c9ac493320fc3a9a4401270eac0e9b53d80131d84a54be79032b81b4289bcc9ae4d826393a9ae4e8b039bdeeac4bedea913781a2d99c98351d36409a446902a5494ecaa7a3494e9327edba4da07c632bb9aea3494e8bf27a2b69d2d8dfad9ef9172ffd8b44bd79c344e08425d0a2ec61cea9896a50912d92d25aebb67d3a588ab245fe36bbaeb3313afa6eb265a321a265102bc32d26455a3badb5d69b6b7898bb3b8718f18bd1348d525a3705e82065a5dae4d8dea8614aabd1e9f119031b588d766a60c7ce16032b434da334b06cc389841d3bde3c42a43251568634b09d49033b8fb05d0ab7559a4229adb5762cc7715dd7790a88d1d1d793d2aae8e8bb75e60caceb06901c2d6da7862639b7c7b05babe279feb64576ce0976becfe349e9c8cfe7c35dd769ddf4ee3a96292f365a770b316657bac41872e512ae745d61c855114998ca729b86dbb3e63a94ebe1107d5720ba2311a7d3e90e21bafcdb8f29578e9fdb3f863c383ed2a5bf2ba597a10c97078f21b6cb633e7dd9e2df7160cb16ff0df4bbc92d1cb5dfdeb550057ef9cabe7c73f40cfdf9762804df7985e03b2b3835d9d2af8114acb245ba8f3f2ef3cc420633069635f9e9ce114d232cbde34bfa5169510b6fb4d865b83c58b6f4f389c3e0623814bc0cb7711b8d8ab4e7d4dc0b4a0870c300babb5b0021f801b0010035b0d03083c84677b74a08f4b1299eafe375dc56a936bda594524a29a50ce1d468736e73ca3943ad04e29db3fa9cd335fa3f27f5cfd1744eed055a8e3639b01dc1d3a03e438b7cb33157b4ad4608f4b1299eafe36d956ad39bbdd65aeb6b359c4c354dd3dcbb60f9a7b74a67ce39e79cf349703db49d169ea321061a5040030a6878012091cf9fbc34537d9a7d9aac169b90a4698514fbe73686156d735933355bfdf2129bb670ce94cfd6e6a3f67cff94a2be36d8d61aeddd44b2d858676ed79a620feafaa75a54a566126c55d59406d3727c8404aba580f468dc44df711b8fe570477a6a8fddb8233db5c76ab8233db5c754ee484fedb1ce1de9e92507f1c6d7201a6bca7634f4457fd2d894ef9ee6d01995511c3ad3a24a755d2a59bc5acadf4ba1e7f784a0d941eb4a9a1dac70b89246881997cabca4a5bc9ebc14fa94466554565125ebcf0345d2059299c9f1206f6ecacb665a6c970d719c22394866558958696612ebf9e1f3a01f543e145225292fbe8ff8a98bba5eaef71d755dc0fb94f7429d0f1c7fdc6f54c18f3bfffbf13d1b1ab092c60c2097fef4ae5d1d933032894db93c66e7dffb0ec8b23ddfce7b1cc842430fd89fef01e923aefef4cb63fa77ef2578b9295fc1713eb929215542912001e5bdf1398862cbb8b0a3d6d25a12464bc99623b2a489449f8fd4521e161f40fff91da0d0473b5e7cd49fa3e716f6eb34bd13fc38c11ed6d410daad2a2da5a9b495c6ea6e9108499764bf5c09cc697cc9079c2e1fc5648b6cba3a779c312c3ea8fce777a8fc27dcf17950a8b57cd463bb3ea0a669d1d42e2f69b01ef5f708046a2dad85f2569346ada5b5b4192f81502847ad784cb6786c0607a52cd193ed78a926e135455197e6e0f6b37c13f0d46e9bdbb6d1707e9f16eb801aac450d76016666817989cabc1f3db75b9d8514dbcf4875169224a58f8147ad26b917e44479ee486533065aeaf67f3a1f2fe2298ff92847b6cc64cbe8b1bf1ef31c0973862c692d1f27eaf634e276a6d6f212dd428e9a7e717b8686a37684db0f7e13f05c0ea94bb668975e4f001dfe78085dfa35358a786021a60e0ac83b5f87bc33fc38615fbb5b38f2b380effcceffb8f499867366b65c769cad71e2dc7ed18d7177f4d97524cc4c5dd4455d335a8bba8860a9114eae8499da49754612777a819ee8a94940bcd9a7b37cddc6c9d9660abc9a121ae8e54c35a99590242d0b996a92d66a1114d2939f68d8a5857c1968d3e7bda67c74a4b62a4bb660c1a3feaaaaae26dc4a841af2837f3d07fb720eee915693a8abc52c24897621c5937bccbba8455c4daa5448f17bf00c7820031a53111e2538c164848587f9fe7e801c98c63a807a44ca9ae4f684b9ee112cdfd151d3c5435a5c69b0268d7dd26a8af4e9f6774fd874cd57aab6e69d5ad81ced282fcd2de4a8ff8b1418b7271394e8f6375d38743669baa1e3e05f06fbc6248cbcd3359358bee394ddfe1bdf0ef2e67a210be1148a53285910f66454d62479fb8e54569390a3fe256a14b04a45aca6d87dfbe9739bae395d3acc391170808fbe8780cecbfdbefbed13f04d603efdb791c58c60c79aba47ece741bf6dd68a44a0301cc5d10b4bf072e76f1f28c47cfadcb743e77bb8fe2f2c3e7c1ef41ef83c28f480ca4b9f14454f4aac4ae713f0b1f8f07995f700e843df0147d0620788986ca4279b12b4023af4444f1488c740dfef9ec7fc26a452e373b48adb4893c7bc444f35e829464f233ddd1f54c4800738489828430b31342e6646c821c3c917370081f403c6623654766514c74b20d08701d37dba37c08534891f35822e38b1c20d1358a0821729d842155f7882939a23c8cc2679697a1e8ecebc99afe9220171b76770fc97f46aca47da7590bea8ab08d67fa4ae4b5353df09df0b6b4a0a3bd6d44bc238e076e747eb75f3ab017908c09d44405f8580428fc562f70b359813c18e8e7294d370dcb64e385aeb85a8ca83ef585363951942e39c2fc6455f0ce8cc2456bb63bb76a871e7e76898ce4c62fb7e3cf8b501896507edf26b97430a48eea3c3c646bba3c76a2a6673fbebca4b320c3970c24c15418270c488a9bfb2bc24a53084295c410b479882164a30c92e94f1c41144b0c291203b30f55795977e00c14110a02c418b9a5912a6e6598beda809705caa422e87353563c759533555533555653e55484d79c9511f544da11c357172a66bbaa66bba7236aeb34a69a662635a3b1fc80b69cf83baf333659087e70eb15dca208f2136114b477e9378d0e7a17d3f80fb3187cba259eabeb9b05a43e9114721c20131429f0b811c614ddc737f84359d9ac4ef9e95f763c7779dffc21e3ebef77ce77bf830c2fd0f1d7498f95e9abaee7fe8fcd7f92ef4e1f9ef3bdfa3878feebd37b2c3f35f07a4808f5afc3bbaf77ec7f79e971f0b873e749e970de3513f90f9408ed8fc8fb0a61a3ee662d80bf562aae18fb02600d4f81ced415a7495cb842ea4c59e43b0e326e432f7393de323951f3de6326fb90bf43f3a8cdb667ac64bd2d42e1a7a0a453f7ef9f5207a4b7d05d20ed8790000a5c9d449fad544e8243417b7bfd333b24508766cd80764790bd2f02170860781a24fe18f7f82443c9bc9f3000051d6e47d0d70066caaf13580408e7831798fb226cfcb2f05f39985822c34f46610ecd8308f42b670a077a0e78ebe5ac0e8555c1afa0a891d1b16808ef412c7bd4898f909b8f20f207168259f8247fd44300e2d7421ece25370e904a10b418388297cc5a3fecf921370ce6dc6c1674897fe2e8347fd3cb83d932d9eeb21e3c81627594c2c2c8c3b6267669c4e9f52f8aac6240c8edbefac19ebf9fe5ebe566438230d29c44889f1e334c50f9c6081c40848b8991f8b0fdf7bff83e73bcfa077616d034a39f29088fd1cedd534cc4b3d6367667ca54494d50f50476882091953bfcf78690347fca00c57e8c29022f8c0d4ef2b2ffd98410eb290c48bd68b095c98dae58a225724e109408082cad4ef792fb9f7fc0fdd7ba18fefbbf7843e8cecf8be7b1f9ee75e9a58f83dffc3f4812c1cb2f8c0fdf73bb8ff9eff0b7b18e17047f79eb0c7f7ddf7f0f47f60e7cc961db70e105ef190268d8ebafd8e92306e6d07725e87bb1ac77d31fe1c9d1f0bbfbc3bb8f758f86a33bce86900a5c9739027c8d243f71990a6ee7f48f982abc6f4ad80d23403284da21fa72fa6072033f8714a7995e7d0837e4a93373b9fa701b43f03187a11087a1b60caaf802a5f03645305e5fd7c9026209fb740baffbe874e0b145291a980d21402a509044ad30794260b4a539702fe38310d1308766c5810dd646ab0be0247e169ce722671824081c8711df8803be5a6bb833cb81125c028c3f5b8233f0fd89311ff228c3c3fcb0482f5e767a1ffe3d20eb4e840681c77342642b6f84acee48c08221808111c8ec77ce5ab0e70290c36df59dde34f67665c2a367808b37835dda7bbcc89081515151bd3ad70299c88243917c982a3f0d50ad8b7035926077a9efb1fbeef421fdd7fcf853e8cece842961eb867f9e153bee08282a90b59e67b2f4ddffbe0429619b2f8d07de77fe0de0b7d78cf7d27f4616487f7dcfbe87cf7d2e479696a25a07b66aebbaebf601e509a3e509a3aa03479a034c5f4e02b1f5d11f64c8bd38815f96816b1f2caf526a603a3a2bcd43da1b382aa93c2003a18e847faba01f435de478d15d0af7ce87f580943610f5b23ac305028b45bf8a4ca9a74d324c6817909f45c98aa3715e6b12096c3b13eb9fd38f5b9ef22aee6dadcdd7d7c7777f7508821b45b997ac61f570385e009f873ef699ba609519f9f32f3160ac1ef31585b522ec4b9fddfab45956f49070b6d97416993fa5a352dd618ac45ed093bd25707861cf533817563c4bc7322eb60b07b83e32aacc26a85354e9366777777f72c4007024c98d0988ad0aa206202a970213b585793829230320997e6d50be8f73a180e1daf51b6539d552835560bd0614bdfc3e18bd11e874f47dffa2d1db695f5c5d4222d6e215bb8009b06d4cfbdf6c56c740985d197e6849dcffd485fb77f2c11462b0a4a78810c694061eaef70bc1443c40857503dc9029299e9c70d6ea2004516b430430a5598fabb98975cb08a410fa040820a638099fabd2fa65db2a5a3c37db9fcf5c74e9af84392449f3f4592b4e7df240e295deab389c371085a592d360d585b459ab0f3c73ac35aa49e711bc8ed19d6568bcd841d2bcb73912eec9e4a469dd528dba9c50ed6c13a586703ea6a3a98971ad41dac7b499d694fb5a7da53ed2977a9d458b1219a8106961a006043001e0c59aec8ae144011db0fdb4d061c78f2c6e8b14b66d504198b12338142239d2f2204c40b93114e015d988ca0486874896fd206b2f1e3cb95b2970195812469a0493d684092b80cb2872671948ed2a49e8114cb4059decd4818e9c58a97549ab69aceb48d3ffd659550e8516f5279693f293347dfe0c8fef31a10ec484f97a268aa49429a64659aa4bdcab7b59f12a24178749ec710dba5464897fe214497caa013d2530d1f355e45e56bbc8f1aefdff91d35583aa10fa00ffd0fa00ffd50e355422b32c30a2ac860922623fca305a99016552dcab4d85f0364aa4153291f67153b29108aa2a7169dc8cadb00516fb2f12010c8116fb2f1a837adbcfcecb436caed6db6c93e9f1332ce5b909f28b123e3c8fbb11ff309a5b5361c59764879fb361c596c4ac843e50ea1dd1f97659b71a76b6d7caf7cbf36bb3ce61d351c8efb68369f508b05b19ff7d8764e8b3db6ccef0aa8e5684fc02712c67ebfb60559a246488a041854eea8d9909e7c80dec6fb08fdcac97dd878d0fb58f9108bfd1da15f79f9b1d8f0075068e38750b812f6106da10950903081c2978f12569a548aecc0244d46b495fd84ec82c2f2741b7d41a03439d137e4e7d0a48ffd09b293325240282d768b34ac956ce927507468329606b15daac5ea7d8e9e472c0bbf8dff6162611bbf03f436c21e46f87ba83c28ec616407e857be478db7f11cee58f9d04ad8634573df3e4fca33385f9a7af430b2c3868d90e5f3d2d4c3c6b37c3a60439619fac044a4a088fbbd074c015fa7a9165b9a401e52d50a58034401717ddee0c8aab0ece010daed684fc0f91ed8505a9cb50a285d5e953bc3ced18c580fb51c0da745ad08567b1ab495edc291ca50d526933063c8928683b339d1c4b0e5c4b6282dce70bcb48de124e7768e18aa7079f01de9899e64cb7ce77093c91628ec0cbb6b5ad48860b5706c24b7c6c9b0a38c75107aa2277aa241409fa35bd6b296c95807f8e43216ebd886e294483581f652b6c12dc81148182e01145ec872cc50c28c3270102389923492a0055512afa9f642e2560d2f242edd5043ab4d59dc6e915e3a76dbf8d4a346d5c038640dd2df433e318a4f23903723706d042d7610b343b5cd138ad8a53d5cba41321046f1a9457e82cdc1260b222811860fb8e0041305944421238a3190f42088e9c791321c818819496c6ed030f5f38c97a4168ea8f1020b2fd4c089124c7c4b23e8513fe12222c60104bbf4a3e0062eb180a54c24e32c00425a210863803f88f7b00460d851de5cf9d281268d35689d3b6b743ee3a0219ffeb20005ce27c6b1b14b3faf9c055ce229b6137779870e2fb2a55f660a21b7d909e9d28c032882dc0066fb8e1c24663ac172100e526224dc6a821d5f5aad961246d2f21207a9415a415aece7202f2f2f2f22169ea3d117d9e0358c83862aeca2798d8be1353688da733daf9535eab35d9d8419aab04b12b864038f5cc5065f718cbf9802c644bab0129a542258ec76f96b0976de915fd37dbadfbc82d0439ad52b2658204d1ae5ec3689dae08b32c6b87ff9899030f3fb5d204b7df246b111b73b8544f720b56dde2b1b363ced99e5884543b83d3214ea3259e8365e231347b2e447446f89de12b7d00572d6727112edaaa2286e9b0ae3701976713278e4322ab7a9a651aa691678119d9021c365301a4fdcfec938343deaafe92548ecc8afdb5bcc2556b6642b1c79c85c82d5eec8389fcbc2ef48523db4eb0aeb33ad16f9251b60842cf117f54711bffac4af90833179b54b142b11754684eca149e326b6d8e2ddd1e2e5ad47b14771c9153d47d4d15a2976a1476859682d16fb47f03294d7528cc351ec428fe052e5416f9ebb551e704932e36830a40b173cea0fa306b7bf61bd454bad49324df2e76db37614ddfab3e3cf9d7008edced75482f5af5fbfbf18ea94a641fff91ea00f283432bf883a03d32734d2f976a1a4c733dd632005d2627714c974ade55124bd9a9ad393d6a21aa533b4e38d119b9d2d2c693c9d8ce1e46ab19cab55e13691cffbcf2ca4a8cde91e1b658ed62ed06f2db775a64e215335539d99622a93d1312adf8e84f1dcd9ae39c7973b3f47f7c783bcc2ed6ccf3f535bbbbc5da05f4f7e1f27ec7b276c149fe61653c645bb640b12b2d45bc8513b8a9bb3bd1a29a632ef2608e924acf8e439897c1cf46de3968f78c647fe342e97763de425af17d7b408a32e17a5b1e198d6d290704bd0c2891867fce00b5030755f20b2032da860832fb2c032452712ea9a33dbe6fe9e10fcf49d7ee7bd2f2c5fda48bc197cf68935984685a9d56851e051bf334942f6b6848d42562a3af365bfef3c7b2fa98b7178a1d662974d6b51993b0e1332648cc39d481729b016b0b061b2d8a796cac16590279b3419860fb430622ac2638489e923a297a56dadd88b56d30b98ddedfdfcb15d0d04a6d534aa495ef5eab582fc3bcf9df7eff4a9f3639f807c8eb61d4e161d0245c23e27ab4954d643a0489ad4abd652940bf4a60825837da027d918dab4b9d30a938914e74bcb399571f2e6cdc49963481cad62979973c77985db0fa4c5d66a5ad4623d52310e0d0ce9d2afc9ee4c18b2a599b81ed8d1603389edeea8c12e206faef735e5dbf6ee2a2aa0973eeae196e0e57a311d9884613064a9561812ac0f233b420f7a1f2aff791fa107fd11ebc3c8f63e3eaff23e401ffad1639f1dbc67d9c19fbdb0fe3fee4c62edfff07995ff01f47995dff17995dfc21da00f3daa491d2fa4d2ddfed3fb99c44e6f7b0747befec57861a34e3d004739cf5eddb0cd2ea64d4dd9a7d985247513dd380881b08b07398247fdf9e031e859a0b05fdeadd8d5c1ca2dc6307353de7bcf3b1f998419434a270177ac309f5558855598e70136363253110ea50926239ce2dc7cf9375eb256f953164babb5d65aab06d6202dd65a6b65c160158c27b08be7bed4cacc18a8a156514cb631bc3aa9b05a6b0d7d4d8b9e0aa5aaa74e4d02cd40ec62e6020dcb26e7f4e6520ae3e606521cee8e142788f564f5a6f3e7a20a45aec8d9c54be097e498d909d7b504496234e4ab497c6217a6e150e62596d114a3419dc896171d438ab40c1ecdb419fd420f098322450d4c456853586232c20f3ac1a4ddcd6adfdd07ab309c169959f661803ef71e052b8e7f1dec73b52b6c457158719ac4e1ca87ea7bda8ca53f56996c9172cef1b0fd7c1ddca4425ad52bd6eda7d607d6bb1a2c587f0e59b8037edaecee4871bc3bd2af07e923f7670c7431212d361376ec603eb0a9553ee2260e37dd65a312726f9a3452d6ab42ef2fa50deb86b5c2a07e715d962fd80525e370eee54f699226691a037025176a290f25bb88b2b64a9b719795b86664cb9c60074617eb517ff7042ad3c93a980dbeb981c3cba65003403f8a1e80da4c2007a04413e847003400a58309f46300aed486604320edbda62ffe991582953ed28260411f7a2476a4acbbd510c8c27d8dff6102812c5c07eb42a11595ef61e343cfe18e1aaf12f65079d077c00ff62df95ea15028d4f96a28140a854296eda5a947e859362e54bdce7f5ec87b2f04ab0db025612a4cc21c914e9cdcb1c260ac65d1c96877b3026e58d88da349c2bd472565f7f8b3cfb812578bd3a7cfe94b523933477dc2805115c8995286cdd88565f4092e311933c641533c6b56ab98f3b6e7dea6c566cd0eb63df70a698cb2a46449182a58ac5a512bdeca53bdfd3cddd357e87f98583c20fa199e7f0650280aa589431ba16456582364ad8495c5a32134998d6673fb8fd8b18379a95d6dc3d1435d4f387aa7b19b75425418d2b0838d15552bb76d5bdd6aad95f9bb63abf88e94b583bca12f9128a42f0af3eb5bd8a83edd34a9b790e1b839517f4a98526571dbd4884ecdea19770ecb39e7b270966685246d409024ce595e048dd52a0e8552a5b62115dc569b8c6c39b9cd8c477128fee4c68593f344ab2a12a156f5132c93a99cad5051b285d38e784bc270d378387a2c57f2a367118e9e13472e2be5ac94cf782b6f8827d379dd4cb67450ba58cbf6ddee6c675a954573c776a55a465fd485b8ab3c5559340cedfb370f88168edd19a86d7a12be844791aab05917c53b819e4c05bd9537a4c594a73ce5322e2455613058856d325d67be2941d280ad486f437c3bc936946f2a9e3a3c94b68b568dfbf975b0c6d9b69ead3a58076b6de1646e646edb9ee3669df36b976f56f4bfe9703b235455298bb27418e94bdc2c57914259ac0ba5c59eb5d8952561a86075b0ca627530d9127639b2c52a516d2049399024af4d5494aa55acd60cabf48961b093edd4994a453fc1386a12e952aba8457882a865d0a74a45b33cd7764bbcef5e0382bde9709a24c4d63d6952c747e8413e561e87bb1eca4b9e92a3fe5097d3cdbc936865559b97baf60a2b4da190a5879567d9017af76ae539b78fef37818dfb38a1fde46cba9b16719e743050fa485e6eac3577f4d4ade952ec09ecc6e67627f3420aeb42fa2a62474fa53c09982fe11ec5ad02f3cdcb4b9e4af98bbea60e8ada843048aff7b48e36bcb083c996ab59612bcc61fe34ac5b480454835096fc288b7158d6a28cddb99f3eb9e9353434b419b75554c5c18c716c2155b10babe2804bf50a4a99d0645edb73772f6e99c9d28858558bab163b28481cb5b36912cb5aecedbb1a09b381ee485fb4c3b63e83a02bbf1db6dbf51dd4b8e91c7d55589d4569f154574336592ce52f330d183de5a91a9b15f6b97194a5629756b1ea15954563f50a2e49a64ca40b55026dc204a52ffa7277ef782e1e319386f1d886b0773e17c3354857d34141baf4cf4e8ccb33aca98a6a572fa10b49f222b601e930ea19ede2b8d936a81234a50da12f7696311934c538b6905decc26470494b2375bb59b26589341847532199b0828bdbdf2ad9e275cf1f0f3e01b9c1deb83eb70ef7c574cf79dc46a9a02ccaf26ee6a5963961f64e9739ca6a910329cf78d6242770a51b262e94f6c65db5d81eb2ecc0bd2321bbdcffb82f1ef56f9b27c17ab663fbd3c1922d2d636bdc91f23f2009932bbc50028a0a4a4c23bf87544557dbe5e7e7b85771bfaa97fb96c24d4e58498f03e94a4565ea95f432bff61dae54d5ab266954d891bee68f1d8c03298b1669b1d562b32e651569711c27b7e86012e6fbfee8122475822485c138f8c52efdb4c97db5266345b73d6759fef939e75a1433903858b05d9fcc02110d248cef007af8db1332ac458e759ebff342f0733bc39872ac493e632dc2b697b786df53542dd3244f0f6912ab494de0e813bb78bebf18fbad92304bc8520746abd886c7b9f3969202b2ecb03dfff63fae0ce8b99d9f76936971755b25613aa5488b355f2362b9254d4a81d534c975a8dc4ed6d9745dcd89717460c82e0cd912830974b0d01d3b98e763b7dfe37907c7fac5783eee6cba9aae9bc27642ba52fdc0aaaaab8b3b6e546cac6dc84aa6c5de82a092d8c13dd5282fc651cf902e68b08ca89b8b3b8e2ecf6e4e2e14a706c03096356d428aadcd665c23a34db054422000c35a0677865e328b326842150ab519c3589bd5d98575362628d4108b6a1257d3c538af3912a6fde3ea67811f773ea7c9581bb7abf10abd6a155caa1176353dea5f79c245e886089d0d16578a8aaa61079b77f4990aa370bb093cea31bc0f4a3589beac60a196b04b37928af28d9b56d01765d55814b69a63b30404b6c9245bc2a486db386e0b733488cba1e18e358707fe9904cbe0cded7649617bc653334d6a1180afc032b1e3cc6d256da6a5b1857d62176de6a556f9280d2ef5135c78fbc438a88a5dfa29cb47fd0497e815dc8f2d5b2a0a892b387519475d42baf4d7a036d11325617aac28ed8bf17c45a5f8a8e58b498cca341fd8efc8f7eaaf2561b8eebd6fc9edff60639dcfb3f359e0c79d1ef05bf21d91a3fe2f1cbf24b759f273a5dcb1b268c883efd8c134b083c9968fe364ec0cdcd68953084baee0514f16d722e7a8388cfa058635a93a61598d6da7315459cd9941a24ac958eec79a03ce703d03307dd530ee265f4da2ac16c39024aa8414bb49344555b408bbd025b7b910a77a41b654148f9408e336c3a4d8d2c495b22a8ac5a10a4a37eba234697660c8127dc951bf1dc36e4c6e3be96ab62e1676b0163b09f3852cd51605a3ce30a92c1b577edc06f311acb23a586575300e941526cac2edb1935d8e6b15f7630fe1b419485371daac51614761674e8b4f5ac46991e74c79c9c6d7f8715bf9d18ade53a91ebda8e420d6d8b6156b43e10c62b7f7d856598b1da2f7a844cdf357492e15cd000000000073140020200c0a0644e241a95c16d4e20714800c809e4c6e5c1d49b32488619032c618640c21800010100118289859250060ee32c856da863d5f561dbde373353f2146e8c4974213df572fadd0a3ea9d9f75d40d2fe38a94e9a79201f93c3e258e898902c3c95c96116dba9a7fb8e65298b641677c7fd6d2d1d0899e0aa6dcee10c020b76446681b5850453afe37b478964744e5cb2cb3100cc75ac6abca6068336f680732b081b1326a61371ef0587f5d088e01a79ee30f81247f86676f04eb3fe189d09cb8c555ad71f0b00c2df8c23f0cb40b14c38616f2c096b0cb64ad06e32d01217b295b03e701d54b66b7c9c6167920fd6a0853af5bcc4c51b0ebf7ab870ad0e8d2bdb8f53df15582ad90c8efa31a08dc7548ce1faefdec55c67ca9bab28287b4ffc8201da83c9d8e6d52a6bea508a77447a19a871ef49b3728bf5e1826804eeb3aca2d9829316e908abf801a6e8d64bff30af99ff6f960840058593d0a8f1085f4de94ce212892be8d8e6b526d14ae8179263e33ed740dcccc927490d3f436ad751ac8a2d70325b29717d66cbee6a729b90b2e04c41599a8b7a36414392af43ab5b5671456d806d47e1dd2a5744ecfad06802a555543a9f7f9476bb975f922bf6d759bc62aa3fde6f00e992f55f7839cc8e5a3621ba63aa56ef0ee4be106865d126146fbd44d3c9ec6b95db7bc0e26f69b298960d854db8abcdde4a3a1464803a7f85623c2e09a2266ac8ba3435d364c0ed45d4cc6838abf3d81d9d3be7be8c5a7a761f323d66846f4f9d820344cd71a24379c2aa08cf4a278c54d317fa7edae9eaabbd3497b9baf347f36c59bc1a2007f5092b77106238f3b7f76338246724afc3c3e7ab8c5ca30e4dc115392217ac235b498ae24845b162350dbd93c5b0040c532b14ddb5ec7b711849c4159b578edf4a4eaaf3416bc6cc03a9c3a8bd61ea96f3561cd89e8bdc5c1614c9c1bf7b47aaaf2124f8eb6cbaf7896ee0a0d49c500bdf8b5ce52f175a62a37731a2f5e18bd4689d8339e05c0e4e81aaf9a6b2305a0b243fa1edd15e1a0179ce5db03541c3bbe4a55f001b2471ef768846018201dd37a94c9631691dd239d0c98c8c8936201a180360aaa2b47c31899eef5db5d9ec645769cfca210048e293f113c32112f7c0942a3dd25c36df833bfa761c4e664588a67ff6c704df5d1244bd7250fbb613eff831d75584585b94f31250166c61d32014e89a6862e43ddad4225ee124236ff7edff0b877f0c7f1962db1d4921e697c3926230eb0f3d53ce1bc691fb4a4f768c1c30e14a162649254d85a0d5ccec64fc2238be906592933a20e34e7ee4052583cd0d62a2c421b6bf15129a2ca5d27ca2c3aae33473b68b6abb5d0076f3a9a128f25fd3861ac16b689152c0cd46bd32dc29d902b349284af11183e1b0a93cd27ee5184558ae3d9aeb6ce242f88b0c02dcaf0e64c5ea33fe1ad72e1a77035a85cadf52a5faace5015931dc0f3737ea88cf30d374e16ca0f23e119e9af8d30db29f54a18f43d51f1c943ebb60792c78e8c254b2ae21eb3548f18ed4a7114e6dd393134774614301848c3cc64513952db3310c5ec5016330183459729b8f4d76c4a4dabde8a9d664455e4cac86859b6ad34bec4a124ae744a20a7713ba161d7c1a0ba6cd790f1caacb83c1c3c53c9622e4961e104cf982a14c734a9a6ba91943b23155216745331b2f832c6203692f66a1a002a5cbb23e65ec20b045bd0a78071777f0f1edb3da11debd3a4ed4458bb3071641db6e427a2622c080777ef1a833b7d4a0c48dbe809d610f1527a56c5c9ec14b6c0b87d2cee4896a765bdce8b95017470def73a673df49cea4b9680bc150213370dd3891c90f1accd55115169d751b98377eb08bb216b739d5b925e75b278b63cc17a348b3a94242a868d26ad09c8c326c19b0f424052e48c2e5519c4a05e53d42b4b1f5ed0b5371258889d608cec56aad25f144cd5df930b6911aa1230be4144c14086ec7639daf844125b0a02b46f1f9e3176c3fa40a41eca32cef6002d83847d1c99d689292767e0b39ad5b5a4b80af013281132ef0f25df31c1b104c643734de641f6f855ebd44493a80f611dc9897e20051a3165244e9609b09ecec20723967d0c06013882027668fc21f86102c8fa2e8111f6aafc809a7e3e5715fd856f5730568592c9a6fd013bfec2a7cebc10c8a3bcb39f0ce968d9c878e7316b3b62f5daca08ad7d58b473d809d4e13729e72601a8a078745a0361605dce4d277824335787c68adab1e068bd82d2a9f5a76d30cea4f2e238a29362e20829e69a0a7fc6e8c813581360171abf8cd10d1a47c6a0ad17bc1ca0f0258eddc5c2b9237cf217a04c5b58e61f64a7490aa248f984d9bd20af3c9d4baaa1ddf2f7573f8d47e36cdfa4ad73fb7ccd469936e4861ba44bcf7b64a8ee28af27fd417c7f6c5bcf9f8f7b4d863a793dfab414ef4d76544d49dc9ec53bca4a0517aae120aa98757a455d2a66cbeeb033cfcc4bdeed2c69b470484bd1c18c4d0581c10e3e54314407596e145758026d2ef19ca2b8fdf491f3f2a72dbb976d0a4f23d8c9d491e059039a89b33f3ef81c716773f2cd2894031034dbcdcdd292d3677378ecbe23023cf34affe0c282a02727fc352b1c96047058075a49a4c3bbdd3807d5e70d250253c7c42205cbe3224728d13ba76d4a74d1a5132706f16de07d0a69339d03a11352a5ffcf74cab15da3876710c9b1e4ce9ab11186d9e06b827367a3d1d9efbe9ad743e465746e540590e755920117392d1a6124f02afb864896ee6eea8ad3b54becef1df86ade7bfd7fc719a3d145d619b9ad114dc3334a0bf5d63b866881bb7c75085382019416bd2d86b53512d2727c08279de4e1f27d3b56da5ca2ec91f796d284f6014adc635096a334f426ad34d69eda15f1f991aef84279aea1ea50ea21fce95c2fcd903c37df5ac15c4305baf6de5bdd69ddcb72a65f2516efc7595fee603bbc60b11ce8a8203872b47282c2df00e55ae6a881598d852cca9593e3a197bf4ce97a501e0df89ac572dda1615bce63e61529e5825cae983c90cc719771184565434593564489425970b05398cadee275507da078ad2cef60eb25a59dedc18d3af2ab12f5761bff1a708b70e7b6a8d33dc24d140b750ae234f7e841cf9f8433906e7779bb89c4b37a197413ed87770aac0db77fe70b56467c99c2f0dbdecb07755ea6480a49b23ba8c36d94e8ac3486a10dc228090515c967e7e42deeecd53cf86e1b0172c4379f5372bcd607cd031473c26d148e08106c0bd028fbc1df602302844a40e968d9397291dc9acf701d8ca6ee9bde1d8d348ae3291aaff8863f74fa74121cf357a82f436f8795ca23876862a283d3649f4c9337fc664b24aee63d3f0dd0a871b913138f011780470da8db0312f7101e3a00a8f9960bf496aca62e690c03f0e77e0f87d28a26cc13a2dd629af0a35966a467c386ccc169ebe9347cc9010f788222fac05c07b9aa28245ac304a2c417b561f91b1c640294fe23c8d3de434bc5a26f995a2e441c40414ae7750067fa21eb9b9548573e3851e7b36e20ea26c0db4e0c9596c7f1e0ebacc092513495a12a353c9fea004521d6beca6da76c1980a37173b43d5243467b2e2e5c3c7f728b0a4073223439c472b8d03c95b865b0337ffa43862e798d8ee2da29c8c312efd193bca9419beeacfd44b7cf529ca7218bf84a0456b1a1da4b923bdfefcec102bd446af6754a5194b9214cdcd769c01085d6754a89f7b81327f5cc0b015132bf01021d1e1a3f785a3200accce51ba08232c1f6b8f423ad42fd21813475ae56e2b91e25d208930e568125dd8894c7c35d5855a0005531ad79e420fe71175205b85af417e17c67069c9c5f1933c822e3034d6816a37db5f637251438bc61874112f1b313c969a1437c8b8c7d2569def8e2d0f701b6965bb57a8fee3a4a7a908fb2adb80818562fd6f5cb27ea319fce15fe9e00348e228e12b22fe59da24e61e8cd47997cb857e36d613d6edd89932a0b2a511d6aaf4a3cb749871a8bc5cfcdf471c0036b1b8aea7288b5e2d86505c30337c4fedd8ff61bd6ecc36b780afb2205f3e764e93ca33b7ffb8caee4cdde7b096bd48b47af2c16d3dabd41820a63fa4592995cafa810dd5faf3c4ceb42aabe6c2e86a5b126aaca8a3d8ff3db8cd0c8f4e53af4c55e4d1fd65cb9f67dc33f88102d3fcea6d7d076222666489ac0574dcc46f70b32c9ce22bf4a7131e8315e3ff1b2f6c2ee0e8ee27d563eaee5f92aab92092038c7b05f9770207c00d8179d03280427ff3ca69f9df15727181ea0fa81e497e3b785ac3131e030cbca748b09f6882bad2db2cf1243e2f60dba8190efda70c5e2cc1356769fcc3332af93577abfe1d95045003387c711e23b147c8fb984d80abe3e0edd6dafa08dcd99301b5b12ba444026332cd1f27793e4f5b316995a68dd1db3590fa749c1d1636ca80bb0cea50d534c7c2da694a210826db0f748f6abd807bb4bd08bcef400a388a67b52b0960b5caf9d6cc26344ba0aba7e71a29535715c425b2d7b6f84fef710b2b97dc9c9ba4e48f5d982f2e265a0bf029038cef413dffc7abd0d3ec895b172970cdea534d8573683b75d5b631e83f58465632d9b522322ecdee848406d2d3f70a091dc8ed41f322eb86c4239040f893ef5648bc32f624d4165b36009738871a7de66d1e6883687576057ec6d93b8d6d876883406c8de220eb1b7d5d83a1c41dbba68de72eea8debe2c387645fb31d58b618b85b68a21ecac4f007441cb7763dd9190342a42cf822cb2ca71782dab88a21515ad89c7baab79898188568dd7c8ab1187bd28d8622ed6978cdc27c50a0d1844ba98fbf5e6760d84aac04e765db084ee9cf05a48719ba1e6206279ebb2c71c3a6486ce0a9ab2dd842ea6e3580726b7a5ef1c268a06d698a6ae0109c254bc67b3624fa6d58da0016564bb13367b79e169a443ba62e8bde19733479938e9a9e4f40c549c0cdc3c0b34472e89876ecadb8042d9e353040160d4a06b39ba76b2e98a47815e21db0ed71b8ab4e88e8c68bcb3834b7c5d2238a72f5d9e54f1745e9dec8dee6024ea2ec928dd41eb726850339df1cf99ea98f0f863acc95e75f26269496e9f72a32af29b0831ff4463c21a152839197cfcd274a65c47cf86a9a24b81edc57566c2ad0970d39c146c5d1529c278525e62480f38a24af4e6c0f921a78e8f9201b3f65d4d80bbc68e4c08572ae15f560ba1557a5b5a2119ed99e01ef624e266ee54574e20a100a360909571f78fe07d98111019c3c5ad6d8f8716b6ffc44004bd8e670305e1aac3d261314d73bdf16a2d90b1cc73c3f3edefefb7186427429b647f09b929c1923ccad057301a081c7169bda35c27968962ccb3093e183a11e649b15e9f4de556a16d483d4539f33998b96450f88424464f8f28d1a7acddbc0cb697e9d818ed06dcba2e7efd73cefb2cd6ef365245f4c69ffa6859afc48adcf0aceb50560ecb0344a600b00aedb102cd1f90955c4a262107dd334e762dc61e3f2b52afcdd44eea3f6c4faf8d46bff56e64d5b8568698aab7c008e9b5bf6d233df2d4a4e9e858d2c22c222f895d39d78d82b07d57293ffaeb4670894df13b091d81fd774ad4648a711aad4db0213a6d73c61b32d159b22e92268df50066ef2e027dbf14194a9604984ca56da4df355e0c3c8888bb261127e99c94ba05ee7b858b9f0a6a65c87f610e228a49cf61d057c1052cef1b9b9ae5b3ae2ba75cbf0972ce20838cb4bf623e470f941f01d282ce088bf23d28d464e38fd2a0b3d4031d1b7bea3ff2696143f1166e50024a4255330e2de957466249ac56882c401ddbbf74ad9afa18ec1788c182034a467a9bffd901a780913ea80dce8f2b209591b9abe5b048a4071b4f4124bae55d921d1c4e6f1148008f8b8bfb58f0be5f5bd50531b99259f77aabcf380fc962d212d59ad5335bd1a6f4b078078fb6151eba1d56cfb13795db966a939494ceb7ad30f0aafa8032480e4b0973833b82fa9e7732f3d6c63b49ddb5844c29ca42800ad089cb0f1b3c31d0a93135f181d26962ce6c56864c3df64c468a24f91e38b6fa263e710c975cdc9977231f27bbb1cbef141d7b3e73daf4426ea2e6e6bd8c5af42165bd7ca3584ff208504dca4a4c203e8850545b62510cba86941fda0e305553326772655f817658be2c90972f40f4ddde6d046242bd54eb154a34c6b6a9580dea88d5603829d20567101471d59c6f58ea88172a9d2b859c046794cea94d827706e1bf673384f3ade03b713978778be241a082ca81501c16c3cf4498333caf3c8d77e57c5c092fc4a7d8ce856d8c212190e2b8b68564a87dce8698cd56b571797aa64c4afd20397a8814c238f634de6f82c99e1fa433296571bba2ec67d18e15457bea93fce3a54840cd23d5be0b241e7292c55f41409a89e3057f22f563066ab4f4aee31f3f985412de83f824c96a30236cc8187d01109c3cd33ab2e18244424784c58612791f9dfcbe63066a8914fd9c0af26119168e9a98c4f570831e63e6fdc5c7758ee7aed6744883570efd4ad64103c6328a69508bb58c75416757601efaa505ca659963e720bf2f26badd76412cd3383ad0f7818aa3aed89ab635927bd846395052161b63d9012c8f263998a3f22196cdd145d41325e7ecf1b50d400c4769985cd4cac760b4da53b91d2828089352aa5d4ae9a051afceb9bb8c22af081a65d6c4d885aa2975ceac6b728d6b37dde4cbfeb6320d96e98cb97c1cc9832615d3c61ab0d8cabc1651af8b7907144bb9b6dba7b962c647bceebb07597eacffd1303208556d34613d67ad084de06578801afae435ee804d2d966a6c2d55a6256ae1ca59d9cfc2a431cf3ddc4aa079d282ec6dc98cd77d3e044cd2b2bb78b42706d36f4cc066f17b4d13a86a2e6de6534392fd80161f4f577dcc87f23f0ff69d291a4c0f8e5f56f965e31c1d1841cf1ba750a30ed1274e7913722e0ce8730ecd0a9d3f71c0b45c9907f35dad99532027642e5ebf7313a9c43cd3768f56518bd46df64d567e82c34374900e9f74d0b33ea5843f409a133aa899f5a6ce4074f94e7d9dd0534e21cdd338029a519d9410de71286670059ed82039e138028609c00dfc363933754befdf9e5057396d5a2b5a2e515ffc61ac25c94488398a6d121f7dcd181584dddd5aef16843383520a8e920e4b75019131959184b195215d31d8a5ce53bd4da2756d086cc7e81ae341266e481d9827edb8cfd2f6f6248bf745ca17c3db2dcdeff1089b50a8ea062745b81494c454595c6fa8c030e304fcd48974247661cb6a9b869d8d6aca92681d959a229bbdebe91a331a2fe7917d64f72dc55950b9f5e6055805e31f85ea6b4ed8cb102617b564a0ac3127ac60a76bb681270128a1a0ec5030717c750167ce83173dacd3e3da27501837cc2730c320bff75cb6a6d6174f29fbac92df9d61a14de6791754345b49398cedb46c9fce9c90877a03c4f3baa6495286e4651b2c3c82fb2eb224b8ed4883598e15b512c92d9312d74ffe169c0760b1417b8b6a7b847381c751ce5a10183ea5e92ab3bdcff355058c35fc2b86973874051d875e1435111db723c03a42c79798467b0973902bc0c86a697e0584bad0f420fa2ac8a37613af0d0fc29bd9689e6d5e82dd3c828d1f7b9b5e1dd42c390fb89c722a114a919aee18a235c492e6d98a4e681fc40dd50fd646b9c63c9cc80ad696bef2148d58ade69a71e23548c7fa262b140180d81a3c38b52f65a846ff2da3d74498f51771f932b5dae908b1710c0f271714399a142716e603d5eeb7e9da5340b42e1628b730cc36317f36044d609b8a7ce8a91a254351323dd5d7b83a451e45370645a6e241607b51a87277662d467940e18029a5c9e06bbf4cf8189373c0c0446d85b2caba01493969e49f568fd887fce130991baed3203d94150b997f9299accded5168fb42e3feaaf4d381e77895b798526380a675f3006de16838d368fa42c3e8105e8bbe4a85de188c5ea7a00b9d1b127e077f78fec713c1c23b2824ca9d28f61955765180858c33d3e410d6bde54bde6979cbfb0fd0ba2936865da9f22d18141695d384b78c5b1900351ec4482c8cc1bdbdb72d8c27b885107b6f814e18b933eced00adb2303b7d11a67b4ae59894bce79a1fd6d44fab7eb417b45783ffdb8a3067132466c4cc4b3807df55515b291f36952b709845a877a31ee8eba127a6f658d8c1cd1cf081e93034f04c6badde75d816c905f03d71533a94de0e6eb8451e8f5896fcff7944d92b398b90b392b229265e82402305e4b8acbd78f24cbf53ca3c5946397f8d58be956d7b90f49dc6a3b11f208ca5f73e43c5ccd382a4a1104a52847f32f4b6b98b8fde5ee40bf563a60c0533ef669ae9a7264c65bff4793800a500d9a841fb10c2cb24673bdade9c28148d43b61b59336b60b81b550b820d22eab9a932637795199d2f41d8982a65fdcc98acb902c8da955c9089cccedd8001b5e42430d37cf0ff5efd2b117a799a394b81106a75ed295f073552bac57c5bef788e13180a725394559136092bba47947c1c3d5429c184ff7aee1eb18d8556ff748453c060a4f7992188674068cfa051fa877ad33d2a9dc9785ce83a9339d4985640d826ad32078832e7d02aa0adc045f52859929b20f964176a74ae00e50733e214a4057bf1bfc50ceea1c00a5762c2ff890d1d6dac90652e488384a3770bb989c526a5d4c242c1b7b33f47ec950cd3cd991e5508ed02b9be0b04c335c2635a4d412f186325bf493cd18dce5809ae0cdc7464d6387c9c9f0eb704bf51ad4a253815a57299b4f8e0c7bb275a1f4c3a76e8b6540170d797f702b8daf38c486880375945bff0cc104488a9e625962ebc2fcba6e732b09887ecf62047c7466aac241da2f70217c6ab5249fbb7437a1501efe8dfa9d238eb5a50d000a79cf86b9d0c7c6059b3b0ee4db2d05b9ce44d2a36890155c75fb322465e6d15520d44a18524e9329663de0b3be87a8104a47c686ba655912c9adc7ec8515de094758ef566d3333d108292a53052317eca5c2d0230a45219c95a7a75d155e3d4f6cbf013b3a69e78387f7b90ce375836bbbee0e00b761fd3f98e19d683c8118910e22ea06900b1870431d17dacd54d2ee7a8a7823fc96d66bd00d8dee704d8b66afed8154eb8647def347a46a8b6ab00522431ec84e47eac4d4921440d26d602b7ba49553a2a98378a4d890fdb2a42cc6ff82b587ceb659a51993f78124994822881e0a00574a24807c009067220af9533ba1547728a3b07536aaa2732802924938324cb9c3fe0ef3f4fc79832b442fbc1b9556877dff4f0c0ff250d3d14ea2a9d7096db9086c00bc51b70080997094ee410f23edc601f42144ca73172ce29b1ff657bb14a9a1da3ef4538adad59c087eaf512a60b581ea0b5ebd8ab4db25952e6663368083e9afbb3ae0fc29b297a1e84477451f39f728d42cfdd9fe3941fa963ec9c76d481ad289ee41551f77338c91d0995be44941e0f48f2fa48f252380bce111db40f4566a7d2900b2c26873bf93d6f9c6f96e42216cca4e6c40314891caa54053f9b174d4d60d851ec835486d9620ad8c2ef78f7b9f16ae292d190ab9b05ba2a9fc35a2b17dbace6585d3a3e81ff6d08c98cadd42c34605f8d0c0848faa71af3ff1024d6f6c5ff5fd70c41c377deffa76982576ac3151541ccd1be8c7106b77b8187d0466c312500bcabc1ededabd92576e2ba2708070a6c94fbdf0e88988894de79973c123f69b35a6a91dd6854f50471479162de34e5711b698639b43e0a783085f10de7b8b3269951960d9b62463d6fc18cc42a172450898a0032d7e1de9c25d92ccc08054fcf49b2c3887a5e1dad0ea1de57bf9aa88b2741e0278b73c0005780b74117c34fc2821de75b66439cfad2447dd824716a302667665e08e237fda7dc16491045fd32f37fdf3a0ad27b747727f8dee2eb130c0101f5f2b5aaea18c42e2b4b2dda94b6120821128245521f511a68b06744a64d6d973d4f2dbd69f21dd364bc890d11f009d97101273f773f1d157b1582430d631ef0015e6066968e8c1eb30a90e03438124695b64ec5e4dd259b20af03080f1b6b82c38563e1f0302ce0dc94332ad4f040919d74e2622f85d898db3bd16e22fdefa924fbf1d2bdbf3cb755506d0b172869bc7c831ad1b89bd512e59a23118202890bedd0925511976d4cf635f10b64e15592adbb10316e1101318cce7d9475522c53efcb557a7f8aab27c19318e1df624c332f4d9acc684516d92bee8a38e034ad0ac41ff84c597015938d47febf2245a013e1f77c41b47a9e320ff10600c23c66f346a0ff38910c0d8988f9d2086fa0b586be2d323c08ba3d90ddeefe8b6d90791825f3aa56b804a18ea7fca82de958c61ceaa61afda38348c55c501c6acb44697cfefa8d5acdca6571a8844e3bc1c9f694922ca23a7e004e4b60e897ab35718419b44f521dcfefe247e6f10bd6383454d4cf64fb95d548b828e483b82892c38c9c12039689fbe3699cbb0c545ce90d62ab792c7d16c258b893fce3b86e1fe3edaa41fe8338ef63aaa13f7263c8c8f44c440b9554f41046462c7cc488c99773dd6bb1974c8d46c64c29387b960cf07ad022dcb2b66b32ade9a3a87837d3c3b6515efb9af1698000715c03b87be8c05fc2ca6b68b02808497868ddd491e1bb4e39e4bdb7ad65710aafc167d7b5d8b4ff3a0ec9de80d656cf5fa9c27fc22f2dea93a08fd786ec50d6709137d15e46eb312338e8fbf180a901d4f86727c5ea7890f8ecc632bf95af7553bd4c097d0026fb283a531bc1b3d0c7bf8d31c2f6d62d9f16fb88d8fbd17985e68b67e753fcc42793ad3a89fb0b8fef6a4a6fbd000358b501e62c4edfc04efac512fd153f8ff06b344139b6e003d9d06f5de52ea7325631568a21634880f2fa150d0d2810cd316d836fe6ba8a323895bd788f1370efe3062c6a4d4631dd5b50303002595db7bab8a90633f8155547ad0012289a4733208bcd0342b9291dc81d11e53cd3a232433b8215c7dfe3f9ac533f284325ee13a3cc0caceb25f1c033046c93967696232ef9adbc81fc5ebfd5c1a9d13c5cadb57ab430e7da248066de804373a7e1d9a448d8821d39e9b6d237487b83e336e40d6d74159282c1676dd096f762cf1eadfd8cc4adb8778ac7edf68b9b0f2c606daebd3cac82bf8a635d4daa968ef9e0612a36697f33e01642e0bd843d489dd791b62d252cb7be04b0efb9265b565d172533fa9200cea6e20022810de1e2c51455094d5d1e1b6563630be0735f4dfbad82b677c066a36c073a74305001314ad8478261c6d6b088a86fc93cc683eb7bba9447af076abde590f9dc707de803b4b7fedf89b13fa86f0e5b26777dae955ea13937fc7e44585a94ca8b17b4ffc8cd2e185669407c95b6b5ab41c60d1aeaffee86914d521c78d1c3678412926d5c92fd0211081e72355d3aebdd7b70d2f98a1bac383cb9c28316154e11184f5f46149fe1c1978d9f63f2fc3c85cf4117bb016660889fad71542a5c8750eae01d7d9c8f4112ea049d778847f0a0aeef79e887f1f6fc80f778f84805078206783e38ef47a38985e02e09bd2c9f1a0edd4e369db0289ae9c1631f1e980f08b8e9c78dbf3e600ef6e80b026e815d08e42754f1602fd1c7a12ca14046a0bce7724d324bc0c6d46e818abfdbb680a327a046f6ed5234c1f406ed9fcea4690e3a4bb2c926c5f00fc818bb9cd3992f5a539967c976ae3e01077f6d6d318c841eaf1ce98577655dbd29cb516f08f24475b3dd9cf72519d41113ce296ba3791ef77072ed4a55571db30c6185a83e9dba4c34749d737f728482b86bdbcd4a5c53d8c6fcd07eb033bf952a24637a185fdc0cb5073b31b56e1322e8b54aac11f973c947555d4143ca97bdd9970d2fc03378aff04a9832d0529880afa13d198ca17af3317f3eac0695b48b1e9aca7b5b30287d90c53429dfbef2e9866523073af009101f0ec37e1b0da2b8cfeb3a75ed29ce0495f4d9523e152571f2820103eace9f34e0a6a18c4dc0571ba1e0c6bc81438c4f346c11e27c3a064cf49259020b6b0e497d2aebe23690b57f969e34dc95561e35c7959be3ab9b401c85380bb334b7b2a21b7fd77dfcede63ca90c7c3449360cc78d8930f47e91feaab51a18725c83921016c02a43a3d843b9ec101ccaca606da84eafd4ae8568a3bfe1bd340e63ab197c9b2cac0e351c5ff0365804076533a5542e62abc2cbaf427d63590c1fe93ff81236d48bedafe24b98e818b6fdb7b66baac18df7a82a88c16c5f26760bc33650420c1dcfa93c4d0c5b11f0c84d454284a2e1f0910855d3f945d6b7e25420846ab70189566cb3cd5585cc23e985a22e91787d2a295aee791704df4f16f98c18d6ba90f818ffbb481b80e4bbe736346a026fc5982a22afeb89ae75869b0f389ae0ce606d97d1f516bfb1b042a970a448b3b33f3dde6363795f7d94fb8f0828d44b764ea5d3462a012a08c3b97e57ba5e1cd2ea51c3b254e3a03aeb0649bb347d072a4d32c6bc3343dfe082e0cf50459aa334d1d148e3fd9508984335607e29f37305257248a599ca1a0a248d55d6b40d1ed67b000ba0d999ae57fa47581c08a087a291a250924f52cce27f8a1915a50ea40a5133ccfcb5d00ed5523c44f26509459f51c5a88672566e8629667063ce7a0a8d649a33fd3406bf9a843ee8d77f61e660b0e80f98bf688f102c3d15b47e0fb93b31107019ae41942bd453763129239c59bd61ca38b65754f77dc8ee31daf48aa60f915bee18f1d108a2a0803114aaa977d14e1fa59ac0f9b7aba4a1e4c61af3493ea2b4cf31937a02178702ba2bedb86e64e0a6842895cca8e6f9367c71a1874ff2f315aef612da6fcd0bbae2a89b76c5aa3afd76a62ce6e441a996790969953d1ffee1b666459d80c0f139d1605758e346a7acf013a3915aaca3649623aa7750ab0c5f0be4ecf8b52fa56f630c8795027646cf4dd27e93a09caf4f113a8746d9fd996cb751cd1c90fd486adf3b926b0bbeda845a3f6644b9170c54ab288d1d6db3bb0383e6de2ea1eb1727b786300db869e69db05999b286d0d2a742c6526a40e3f9c90220d2b68332ab99d1d7cb2e63b505fa6e00eaffc129d87a44887a83db6806910442f9b810c60b8e4168595ac9cc0fb47810922f3d7e3006f6c1cf29fefdd90d51b807114d02b29c1556f32839610dac92cacb2c693a62bf47ceab91dc5489c423c9c85b9425d84076150941692b992b70ac45a8ba74a8eec119989185037685c063cab4f20c82eadbfb57ff1cf6cd1d86a87ce9158405615acc7d6b04932b520cf1da29e7a8f53c9341a1717a312066a522932e07576439b03a210f5a8b1fe5c0a60e35b85c38200879a33be03a49dcea17cb734e0d6674ad7dd035e8728c78345541cf09034075675a0a687eff89d77bffd6ba38b5f63c51da062601bfc1659c21c14619dce6ee2e032ee7e78a96403494956abf0f589d2d3e6c6f573b2594d15e431b79b7f85b2f4cacfe1cafe284030e384887e03a7e275142a4e104db229c4cc99d44c10401d4230549143320e30957ce9a7711933d655ce99c206b9a8c2b782071b02cfe465582b8ae8285d8d5b2d706ff29c8a83674e3e9e6008bdc5c988b3b68c2d448b808a163d9e230672f9a01f9cd7fded254e1f345286db11f35fc821bfab91e49631f74079fd021ecd7c09fe3dc43b2f32cc1915fcd238f68e52b8d28a56461714984d9c1507f147e5e5360f16d532a9cf57cea12d565f52e951cd8fe45f5292759e436e5c17e810a3daf4cb24ea6cf2b51db633116e67d20e91c02d651180eb83afcfa73a0de99a94267eefea275345a9dba86e9a9cfae31b83b06e9a87cebe99c27ff064e1cb592ce8d26c85307152f3b312e503116d84fdad44084b7af7d84bd77962110ee4293662aa067a209d3fa6f5e461e77b25ea19185df75f9fe35f1e1fb66f267fe253860b9d2af7a5a8dfaf4fe32af36a70e9701db5b6931e2d279f3622c83fa120e8a9c271ea836db95b9692300c66c5829179c6e4cc77cc5277bc1f9d85942f3c23a35ef9d8c6384d2bb5a74927dc8215de2a3dcda5eda2e68e18e0f70355cf62412e07771499c7b15f440358f4802758c9673d0d78234fffbf5a80cd7a81d2365ef567395ec2f8b44c84e4e8933a7f5750766b4c339b3eca6276e7b3cac2d9182ece19edcdd2b09ac26d0eb82f7150059d89d98d9a02a8d24cedb71be0fba1efa75994d3925b668a57f1f73818f2af45c6a2f0bcc2bbb462914b0159018be921d8d7e2b3ff8f4dde49302dc7c534060f0f2a880dfb5dadace83fceff65d4741e234df5f8d42fb2b868e862c3d5719caf88debb2c29e417baaeda27762fc41a5e2b3c395a279d338c8ff492dbf590437a4b181d81a41077d414c74819c9f852bba37683725cb90107e5f90ca5e6d5fc6cb3847678aac80c2ab8ff0d9853c52364888127c2a8e86bdb29405d6f0ae3c6a1794cf040b34e07beab878fc0d221f53e697168b64f22b7967cea874a9ab26b9bd05f41a320c858d9e58783e8c4a7b9a78c44c942d0d97ee6c8007279c912ae403b30a6f0ecd21f927000f64085c37aa8c0afa7b1b3ac8deea4529c28ac68b25c938fa097402eea4a96d5d3cbb2dcf2bcb9ebaab83900e0b394ff1a2db67174a582a47a8bbf0848e99bd56012d9f84099aa67e113493ce33b83d2a8c8f5b76f1d9c2c59273b0dfb691603a2a804060b915af97b1e1f8bc7cba72b3bd70104d120f650d17d2ef32bd74c06208bb1881a98b0620b140ab409569214bd578d24eef1fdbfd3cac566dc4d3c5c713789b8ca2c24b944af86a9cc1a8592e613404409450ff32a83af6170a7f26203b140e04b3e4abcea92827b130416338680f4c2c41460c81ee3a56c7dc7178c043e44c034355c48bc19e88ca170ac3a2bffe3a7d076b112a8279538e00ae75f9670d0a8f4b69d398cfe3097a699948c470509fb5bc8a5eb041879ccc718dc4398728598f6d23e75ac950d6ca40777a4fd47052822860351f15aea7f39671ac0eb09555f4349f7df10b406e1df7ebe2830a5f242fafa42aa8b1451cb7cb1dbbac261a1ce44a392aed4e10fcdb4e860028215fd342ca79f72c9c2c4074c787732f3c97108d3dea8290d914dfbb14de122f75c8f8d8b855fd7de51767d1e73f278510f8e17ac9d76b50754a7530a1cfc82c0e5aabcfb44e1282c10cc89801eaf357f9c97b1576b91b218c209e980b4118db6b9f68ab3ab127d7a4c8e14eb81596d314a4da7722b688299d6f2a7309e2cecf0689f6484faec5a21a1a84e68656a26cc099526baffbd83597f84e6adb66c7dabc838f2902849c2ef3aa8a5550700b644b7725005bdc74a0a6060c5020c1df58a07b300c138262af9987d5d7268b3233d92571341f2ca96fe4baaff3b17d17ff3e23cf6ad70a9a54d141b31b2df54dc848d19638265da4ebc4752e28c84a41275d8a5a2ee3018847c9a88b5919ea5c09f512088c488dcea6cbbcfe192c04d61491daacb245177ca8894f5555b302e0230053b5d7dc50f4ba4876dd90ecaa5eb52faf00bc7e96e970e39230b8c3f9a65ef21008b3e64c977aa438754cb705b84447fbdfbf1eefa89bb3057ead53a8abdd54008e7f390aa371d877e29b668ff50dc115ead64b7f7da803556f8cab2a2570f9f73700e38aefb8ca6886e0dfe59ba31021043824d4f97d93e0c8e836b5b6da0437b43a28f6fbcb39dd34377b8ab1e5798996e99ea0496edd0c749c944af0719136c6845b450c79d68060ebe75afb5b7c311e6ae3584a95e7790bec5487f407676fd95609864f00e9ab0f54c0be276a7529cdb3df28fba81ceae7d1a767e3dcea9a3c05d87ed3d7ea0ba2f06cb9c29920df7ce94c4a333e0d15fd1d20b291c5e58d7adeb4ad354648f63fdd149e909f7d5558adf1a4d18d54cf95a0ebc71aa116ccfcc4c9fb2131cdb80b2ff83426a31ec4b82e6792e7c502cd672c1195adaa64532183fd76d6aa45c9642a7b102335319db1544d285967d1f32a96d68516e62957c04f1be8244b830c8f4f976debd707c2a0d36b75ed295eff1f62ed78c2b8e8a9e6a61b46e8ca6f6c4d7b254aa66d075c26ed9ee7310aaae13d82f9ce0e26d103c6de5b2cd67ee66d0361597bdee7a9a3abf4aed43fb913b849ae447de0e28bdd1d8acbeff08e41d11e98430b7d47a56a609356c6a8ad69b42f78c27b57dc6152e907ce846a006c2635d0a1e629f64908863cbcda38af805869d1e23970460790a2bf596e29492bae384cc67a2223d5e3e1b815af04443c9ad3f951d34452f1ab169c89333e80ae7d9405d8faf89f144858b3b2d25e9ea1809921f1f948cc3ed2f25ccf6dabdcb7242daa94a8a334e73639fa335e55080e50ca8f56c98018095b9ea726c8b3bc39adf29e14c0b4af81d70fb4bbbf888920d05a84d7cad1853a6d8f07b9233ba18406b51e8ac2875e11e14006d035c58b99eecd0cb2f6e37165f911fe81246d0fcba45d394b5691bc0b349157a31a6076705b8e978747998676fee8dbf5b951b33cea9550cc0766f515aa05e30c871c4820b6c0beb193bc8948fc748086727811468845b9c464af277145b3a0fea6e75443549287b729a20ddc3ac9235718b5fcef3f04fb1d6ce518a581e8f7cef0715edb5ea18d5c2e91affd224801927ee0f36eb8c748e640ec5e4691c98d9157d99674d1fd12af5fabd9158aa91817fc66075b5437ba5e7a59c22348b1c70f40fd5374abc0115a609e63936936e59eda24ba6e416581060513a1dd25b2dba4ad77e608afd18c1b470a639322c1e36163a66317f5a35fc1855abe6ce08876360a82590ee04e53ee64ecd0843510080df20a519b3a27f599443b5210cdf4ad11fde31c225f8e83a243d7fb2b9cd697ee02786a573ddd96f6ecb29801af8718d407f646cb4d5d886c9918677f6498e7ff3a00708d796410c94f89310ddded41b8ce074a81ab71a1ec04b90c873036440ddf9a579be6dc22c8793350f201b25cb75b7cead4e2af28803f38f7d0e350b088e4eae6a4e451affec0680084915181bae45ac310e86b038cbfc207009bd01ec4c761aafac1b608e30d2c7c7ed1e77fd52410fd5ab73b52a0c5149164a6d79825c34e04d882cd3ca0c43e4a2b07cd049aef947d4c0afa412c1750438009b598ad550f5093cc3d2539315ba93121a02f500918b0b923fbcffde026270ef74e53be04dc6d8721bcf8c5407b0450bd9b0d22a0bb2bf7f2f0545b40f4e38557f75dea24157e86335283f3996abe1b93f8e12b25cf30b28499018051d1fd95157d4bfd0a2186b0e423a0be50b3e64ab890dded129a5a9c14f7d073ec85165eecaf2dbaa020f62d1027863322aeb71cc00af143a60c2f5b830fab70d199efe1424b1dddbf079705182c8f73c1beb6d2e37bd7139aa8310e54e6e2e8b856f5fe517b311223ac51897a20873480769096c140946503c1050f10feb43bbdb0960ab63b6e931d269acd960b660b5d1e3a220298672f26f05e63c04e329e1a9547a5b4ff90a069175bb688083d73422e8224dff06e02d9e718b8f8985b946aa79dea4c02e5a731c56bf5f05017e8bea812f8ca8564197057c0c96cb8540a00a77762a4fafa9b260a0744fa17cb49e06b4840f6fb746c6f814510952abf769497277ef2e7e1673685fca7190dab13846e210270434bb8201829cb8edb2b14cbd3e0c4a31746b6a2bc54b213577d0a93f671e5c0f55071601ce2f2b7d7ad44e26a2a62e077a4cd954a605e38301cb1c88f2b43aead528e4a68f4a3e45bc84d510b879819f86d25d1b6215be3c24da06b8fcd61816ff5dbcfd8613785ff03198d392282e2361b512e9f8106eb22ea588ea14494ee0aa7e85bdf16f2cca9eb60f62a6e22ac3d19cb6630bc31ea5421a73b2e6b7c72ba483d38584e7dd13e360347026a8dbd940cf6aab82227996ceea3096800313f5debb262396172b31b2a23ac171001a5bba04ae5fe66c1e454327240691a2fe35e2072778da37daaa9b140208e1db0d8974b54687383caf7536a19be342244b3f2080d1459f71057b5bb0cfa1a381c10febf81a073ca08ad4df57dcbdd237561e8b667143f2a085c30121ad48746564dd95dfdf5baca3f9ef12f623d91f81fc24f0f17ac3b6ac903ed4fd225767369344b8a3ba834ac5cbe57c6a6164a0122686e5e5f6803eb53b99b49e0d4eda1bbd2897078c6aa2448c8be206e132b90cb25f0baf9e66795e07110c66b48c0f52a763f9a583b3788eae30f1e9fb4e9000b51471518430af46878e484f6c4b3f416f0f87ec8ba231268819b030e76eee55ae58d3b1caa129c2f8b7a3f78c149ed1f050fad9bb8afa2aa9461ead513fd1bf691ce1235fcae3a4c1a09967dd905130e89acdbbec96e8c84d9c02357ec52bcefe4c234288fd13035414717e28fde4c58ca702a3c54846fb00695c570fe99113e30cc7e54cdc7428e43ee1aba7505ab97e54b7313b39fca2346ef41a865a61d2126bbd14442529e9bf020c653102625cc36514241a0817c7fbcc00c11490aa5553362f31ee7bf26efd38d6a390669579bff44326eae4d4d90af487352fa85c31e8c7af5b47e5ce53e10d2daaf3a20d0cd2db2e7b96f4562fa7f270c724a700f55603ee0d8a5474674572453f9493e19f930818629ffa11f387dcd4b4085a3b47a3d5abb9e408e3465b2a9e047c245e8959605300661109a321afcb3e87200d220a4c9abf864d850e7609c11119a481d0b4086a398190c5dac94c9923e60803dd9d809648ec55f3029978c120980f38d4a3e53ee0301a3f88eef31415e5aac81b021fa3b57409246b844b0cfae549dcb72d5b16f28d2344b52ee35d0cec8f3709678b71440bb33db600c2b925ed50e311200f0b6c20c8b6cc3e8f9e22a1ef16e4e3c9b8075500295b684a0c6964a0c37d851e26e8e4f3e1a37debf81186ecfdf7687c38e9f4258eed6028b993e2cf9b158c14387f602c02aa6354b02de422d597c16f5c0157bc29722575808ed7c83c7b2171a7183599e0aa9fdfb9eca7ee83ca977e63e14f7d1417c6761670ffe568d5f3e8028011442be018742dfc07312fd227351cee2315644a80b86fb94b0d1c25b03a6312377a7bf064d036d2e3c320e80b7b1a67507118c5cd050b3383120d7a0c119b491852e36558794e2c2a1019a210fd5ad22b801e0d82637b22dd92fd38c378f9d7abd364e0ed5f9c36ad26ffe616bf38ab030917575327b1c78b7428a0b197283104126fe219f8041814a204a721444b6d3cd769423d358076fc801ed405550a602f2eb114262ae9d0a26ba143879ac361d94bc2001919c3cd59ab525dbd00360495f2bb01cfdd74c7a0634edd4e82a0eb5e81300352dc07d514f1c078066cd639daf605dd08a6951201c1a8129885740fe90d4f21efdba4c3d96205a4b47d555fcbe88348cdc99a6ae015241cf292acb9f54cdc54885ec4a43ace0d3784e4594114410ef946f402cf08bf16e303ddc7c905e335a37a8359389232bae37dae733b37e2284df96949177f87e3ab237ff7164aae8218eca58715c2aa64d67ef8d612ce27f793c2f3023b9cef8326d2bf2169c7cf1d82e1aa636b76cdd679e9431cfb1ee8b1499d3aca3fa87faa3ec9b187245753f1078dd4a82444e261724d949bb34b1e0d928bd1257f2c972d0993d00153ba0846411cf1a910b2a84820dc2d8b998e3ce2f9d9791d0261d4d584e8a4653a78e4a2ae366d03f3f109f6fb86ee2ee12058a4386a227ccae8771d5787a93ea78706de19030251d72241a48d64fa64b2ec6401f0b766c9d7fe4125cd7ab8a5f35a95cfc8bb38793c1a60ac123c7c7682266a66bed81f08e621af9c364ef20fd3e888e7a48998bac4a3a827c4e883eb52a6ae2af047e9f306da6967107512c002a48cab250aeb375487d977128b790185c1b99e7b7ec5ef7de153c2e242838039e6efdc5d962d962055cd187ddf74c36cd22a032029170b161b57488e07028827293e8055c0612f72a3f2c623c6e58ee6068431e4104a6ff336062e3e592f7e226110764712a01d110f53e2de85d856dc5af21e6bbf80f863f5b3c737beeeb80ea8be69cb706063e922ea48e90b8b81a829ef7b767684d32da1a53b3cd918d76fb4eb85eedc53690039810435371a244409f3e47bdcc2252acd67c8ac971bef26038174586e82b4faabf01df433813365924e459e11bc3a35cb088d933109d4d5f1013124581315979ff53a16b4be478090fe10864245b1f6848c84da341350739bb2e79bdfb2dd7a104f0ffd54f21605cb05f28c9f0519f4ac28598839a990f6e3c8e076bbfe976a3053a5575f4764c16e39aaf8428c8aab41f6a004c9a85afd62dc944226af4a9e0b476cfc305420d74e40c81cb2aef03570bceededeacd421bd4a70515459413c3d3369fc5906b880b41e469fda42f0311efb5438424761c4ed2230f6518e6b9df91b31afca05b1ee2c0b7642f5a0d70975b4b962303bf476d9bc75e886267c3ca8c60d20831e85f05f904ca08b93a27a52e09def31f2dcf18f1ac32d2b7640f207d6284073f2e3d4f8d29144bd2292652c3bcc74cc3ca47cc5e4b26535ba0e807fee6e6e844d0ad1d25b010567c2de8401d460e32ae800d568a5ef5c4a04bf3c907d2b578877b11d5f97e157d435f2096e0e5ad69fb4eb272d68559c472540dbbd3ef0f184ce476a182097800709c8ffc6fbb4cb3c7c185507fa18f97da77811e26ed97ff4dcfef995af5eca676ebe4cc7726fad973d468fefa94b4ef459ce3b1433c576e492e00853f8c8f4f0691b2343cdf35540a510334021e7480831b20e1a377c1c2ba7a16bed0fa3ecec51515bbcfa7c1206efab0e5c94a84922eabc892b383b9b52ffb58f2a2025d1eddabd80b086536603e7adfe1dbdcd2ea1dac86d32b18507a573e010b643ee0830879a50836d8f03b8825fcfa0ca4936a30e4dabce21e0402325f0f96bae344f08d8d5cfbb6b29d54d4b67d2b20e745e5a13789c776e205c23b6d2649a43bddf671668a4916e755b9c0d2ec64c42874a9d373d6477e833f19ba701f4570565595eda243da52b1950aa787a97002bc4e0f4990b61838ff01ef86a89406667a5a9bcf9f920543718df9fedf80aae665cc1121220a31ea1cec8e0126abf1134abee13c0b713c859fc1cea1f8723138537a3b740e7a525b278a4b4ff8f7cf55a371e3b0517a58d42b1bc0686ae5ac4643a7d85ec587de7c1c52f1122e57d1aaa71b22194672932a245adf39ab78925a9ca5a2bc274c8d25d06ba5037a29f73cdc5df9fc0530b51018d4fd29e72ee9b5a4e71d587a4be948e19ca1058d3bc1ef771f264b2909ca49045fd3fc0d985330c57c8e898d1192006910536624dd48eebcf295f28289e1e1747fdb2b22ac2e0b797b41698e1256ca7d9eb1a2abc2cab16ea1fc82e00f0e018ac8c8ff2ae4291fa306db6162b067882a8abf929292ef90cf3c1d5df02680b67b5546c7682518b5f82a430723e57110762b3454d885b7d86802850cc532381af2a86f4ef2697a6810c9f13b54a324f32449ed0b22924277bbd9384933df5b9df5051646f678d5546d1cf2f7cdccfb6720a98afe293405d9e77494e4c04645757a009286ea9e1ddf1b49f913d03d89bf0170950b2b137a22f24d59d9c627aad19cf108ffdb749f5cab44a78d71addc455ca7f27a8931d40c268e88e8acd8672693db89e9d9e72a7c220981bf442496d1d3216ff714e68bf79d251e31be1604fe076ef20149e3491c29c183155db4d111902749633fccbde3b451ba950604a4fb38b1924df296e3a7ef597a8806ad79236ff50c73a83e8cfeaae7d7ab74385cc0485df05dc1f17d07af027320df82ff2ef79f53b98f425d4a17a64361b262c2c33ae01321bff8b44a205655a32dca3eace48053e0aa8981e871dcb413747b28cfc740fe16bf65c8ff2ae4484bc2ff3b83ea780328a983be1ee19e83fd9785a641a9719b2205aadab54a44d6da57c4e6cc12a10d0c0438ea0231f7e2d36138aae18ce55e010ed131b912bd62961a81067b12621c7b2762ee3906ab03c8fefbe83da0d6bbb23bad4f67bf7187390937d99bad1ecaa88146ad97308e01ef4708279593342db000ed3ad7cc6bb1080b921645ad9848966423e56c457b08a0f7551ae7a2bf8e058c152e5b2b37dcc6b3b9a63091af4da3c408aee5b19dfdaae3e4920ac3cd253520904059e46fd8cab9ba51b59faea4fe29c6e25165d1a69efd6c4fd41e86070684e8cf9b2bdcda2bcf59de9e7390b9e02c70cdf801f979654bd300c72439f2c0a5c1d1a34b30c4a6691ef209905e9c005db380be2b3cc9764206eef65b0ea46d5011d83f0ecee4e88bd6a750121e63d7230cecb917b4b58693557e079d0a25bf528f30db753bb2b58f2423613e5f9d8c46a5a95e0c836cfadc4b0f16a35ea0490b90a89eeb00c1740a8005e7330155a53037a67f7b0de41377fa6bacbd60ec07c0f955f74a24915159384d4144c460a57a1809fe1661ff54f4675708bc9c04495255d377a6c760b1b1ea176fcaa5574454364885f8320d17a7cff1dec0dca0a37faa2bf642bce9c7d0212a171fcb2db1ea7a023886369f6a25da84639e84c19e7b82b85a01a6dee90ff38c80945a352b0e4ca75119c11418a68eda3f6d0781ebbb6c91a62d1f34139626fa4a0e63124fc546f5d34e62daa191a79304889dd7b3354d145822f606d1031c6fca142d603a5230b99d26bc34afbe98e21c364bcc9c7d39066655af2c44327a81b9ef26cb0a4c659b880a3cbb659e13fa1c8164a3a373681eee040490cb00fd3a1735e56e87bd0d686eac6827d962e558a9c16b28081c12a5352c53d3cdcf5442d4b01faa381a7fd401a7619de65141f0e16750540849a6a13dc3d155a6d2331c94511e0d07ace054d8388f0149c75e628153269a01402c4f34204e4ad337f41c195270bdd086e7774c37f0f2f91cf1400cf0c72de5b37be53134e631c34bad7ae6c377deb58949ede498b6babcaceb751553ad98f4725c8332777a19cbcad47c6c18d2f216259be39871be5a994036f125b2f0eb123fa9ce56c7b665fc028f940eaf5e5a88544f912fb58189fca52ef4b2722a68b0ce88b45fee6441c4a344e98349595166a07cbe29ec8f13c8c831135e704c359a3d307f79ec84061fdee6704f24bbd50cb0aafc1f2f1ea6c7d3edcef10482bbdfaa0ef4eebf659aff6097155559bc7166b39e058687b186bb392484a51ae7dd990d196f96319b7220ca96e28afbcc2925617815fca8aa62970c73eae1ce62d687a2ae303c77b4de4a8ee54695af02f072c5048b49b685acd24835ac02f54017240e6cbb80ec3e1144561ccb095849a9323922a31ab29a41036bf046b98ffd8d6058a040ae49d896cf7436b034de0bdfd013628d026b08ca8fa22ca7041cc8f9e6d931158346db85a39188da08ab3ab50e34cc86eb393d615f0621cc3c45bd01c2d2f620c21c9fa2f2b5ffba63552862ae260cdc2c5e9d420f07ac4efd7b99b53807589db506d3ba770aa46d0430620ac969cbbbf53d1ad52a9f4dbf6c5eabcdcacf659e88298996441f28804110a72792d226930e607a0c161ff6dc13839f18466e51e62faa600fbe5bc192b1a37788f987a640c5816b4c213cdbd8bafadba340a502353cddee611684831f4133f451f764daa58b22272947b80d4d51e1e32b59258dbb13cf95cf890a486d9c8a8eea1b0ffe923b7213ee70d660c4c763bd84df480ef022279d28a4e4f839cb1145fda5b43722138ae98d92fb1b78d4137f99fcca6fd8394743c874b32a5e995752f60bc147e468cd3221c4523fd7e918c68e705ec3764582dddb47b34feca1b767856f51a2c2d0f18a2290a6da796f8ac425cab3d83f9ef78be25207e402a5f608363ae7c3a7fe233d85c88458a16e1553783ff257fa05de590c2407b0aa8e651a5ee8804f67510bc68505253a7a3304a616a52ad5eba641b62a00ccd7cf74ea16805ccf94ea236747bcfae9d00c82215fe90deadfc15f4266d4175ff43e84b25ce834482902d43f5174a79b7325b250cc932051a75d959d6966d186705b240ee05df503e5a1d5549dbd05719236719b24681b95d5a595693fdd6ea3d93cc5b949de511d9621fcb86e67a91db5483edda6d821f1f3c08fc5757a1d75db70c210dea47948ee428857a7db3ae2c3a12e8007f11fc411521dcfc2dd70a5844b8ffe15b4c7a446977eb7c28dea38d37653148c2e4eb9791239bffc51fcc332b6d6c3284795b9f17c24b2672ad4a3c4f806a78379640b9da08bf841e88f3f2888f1d1e8c21fb9df48033bd219c8c9728a2eac73bbc776b2f9c0b4a173f549ecdab40ec1b62f9828273418f3a303ce1d8cf3dd4a9e2659625127c51b8841c526849a5059f2ab69d2e39978b73db2405fc15f7b5cdae128cbc88d8dc641ea737684f8e528709b8a0d29b3c9af8e6aa4bf691e1aec36b6883c245fcb9fc4b1dbef31427ece9fe0544b4b01c8060d16f701079f1a327e7329478dacb6cc79284ad518ec4b2a17a733615cd9247df12895095d1fccdd3c60141173a625265c7e1a49c40a2c3ddb9bdc00831103b4155a52659813c6b9e7f7514efad8c0825ba51809c4792a5a3ef9ae3bd1d735c22467b463666efac594812e132e804898074e676b3b5871ef2656fe79c8a0dd0ae9ba344c791792612ae9f5e7f0769c792cbc15b310ac3457c62c51ac733b84adef0d4e07a7cbcb35ee595d027771679f3ee486768ecc98f59655b9e42add93c5fc878deacdd98618e7eecb93507b761ccaaa4f848de1816b451b2143a3e50bd1ef3600ae231eada2b665b0a50c956329c28bb16a7b9b0cefaa4628c53c0dc00380ac1175271e1beb01af60e42274903dabcab43aec535ce06733899ff211d0637fd0b8ef96cea3c76571b1e4792f5fbf63f4806defc473e906ce325d608c2f0057507d11917d0c65fc6df4738a996b4c33d9d5488ef734c092c3cc06730febd9475af5753b7417643320ebfc2d8d28050db88a5e04a26b0f0908fd9027a87d173711526ab48a9861242d4eabc21d0506afb45d1519ed439366eba1c3028229acf2f341ca5088d276ecebcaafdd10b81dcb10dbdbe7470b9358b26349f74c7e2cec2e98d974161e926748d90edbb16ada569851b6f806121afcee38ea33c123de3c2abe699ffadc410cc3dd796e53b88bda7124fd824a08004b9c6c84a862231bda0e039335e3d6d5736271a9d09b7ede9636ff4a59335e3e425681253a0f5e7577a23bc8e0ff4bf38d3e2456baeff59c6a7c30d3cdf09aaf3bba992d7acb25fab355f3506233dcc10aae997f629fa5dcd58a11deb613cac0d484b8575984b54deb12557dccbfad1ccff4f8b4ae1a2e920ec0c506c17af3728dbb138679ba7305be9231642325ad27a443b572d452f3b4200a4f73b993340695a74db67deeef2ae838844e73ab7bb9857b565cc906ee957025d9f381671e205fa6503540fec54a1a2d6a310e1333e3734a8686d9b0e379cfc1951a98006e0a883b526fcd4c0ced31b33bac77f539e32be22ae1aeff3f26c098f723b47fef4875c8ea9dbdbade79a814131edd78bd763995ccb89b4d4b290c16c48d04120867441179e1887d0d66aa1702840ebd86c7f10880784727c058938ba8fe9630d1bbaea290ad78dc3097d3c618131df3c0b7c5274c58c2f6ca595510bdacd459e5a1a3fb2f81ade7e8649b46942a1fca2f190a162f6f47ac0f4cb5da2bd6039619e2d5d58c02408923357d209706dc901a1dca9f679ab10976f594a57177c8b2460e3bc2730155c9580bf622f5eb48b13dd1aca124e3f6166e2bf701dc43b3710bbfdead6b4596f8edfd07c7fdf0c387b4cfbb7e24983cedae27954f3fa899ece3be8cd38500f4715705f5ee59b2333e82eb59a6efab51ba561b13693d8820cc1241c34fecc78e2d9dcf1fb7c8bc8ab1bc841d061729866812b394b8d820f5556c3c3f415dd5cd4056f971b4fabef98fe36428122447f45eb3b73c4e283a57180f951a4b3570fdea1e067c08a5b00f627c2e202d84d8dd65db5ad8fda5668f444ab3cf3643b33f1195f682b5804177cba78a569e8601b6dbd17b0a306b9416bc52ed11afe882536d4260ce75fc4d88c0eb5f552522b4909ac3015253a016fbdd2b8969b21a50a724610e2d4cfd632aa7c3a1315c69a8c899830653f012c11d990c5ccc890a8153675a7245538d02a01eed0010c9bf86d4dde15eaa34052e813dcf875770b3a9b614dd91b1b3036bfae2a56b79a98d1c0899fa03b460df5ed6573bba9ce4338306d05a2ec3b08e5943da2d72ccda16c4b8c2d8d9c5ec514da28996b8096efa7174f9bc1e8f8713283dc46967f4286feea7e2e967214fd90959a0ff350bbcfe924fad8702857fc1b920119e9524df53b80605ef73bf226408cd2ffaf2ab9f627db9e1bdc7f6da2c264e4d3e2c2ac6c6e3e46d1c47bed00567e494ae4379e44af5ed88f342a3a7109d13872cc556642cd0d2a52fe1406107c0f52886927e2fd60519e7d08f2e17d73b3a98bc7a97bf916f05967ed549bc04470e0105938462c58fbffab42010b8739c6a4809a44b67864c79096411503b045878c5a9c45d08cc001d43ea4426f3931d0a4b14b1a531296091f07e6c20468bf9ab8b1349a0adfbe855cfc3103c73671ebd044746ba3586064b63d0d72b86fe2f96baa0f1181c727ed4512a3f4a6dfb063751d45d700d0a295b0408cb13f26dc6140d0c110b6fb3d29ba46a1220ee8c965405e836dc9644aace019e93f29a3ce32c2889c8b6a7651ad0f605d97e387f657910e5c7523a13d4d04aff718f7d244b8ed30fb54f4729228fb7a5ae0fb73e5e83eb7da1600b84117078671f706cae13d0788cf4fdffab10d31b0acf3f5cf53314590c089273727a3caf9c14e3088beef5d8d53d1e28e1cd22592caa1661c2ca0814a2279a78f395cd49eee71fca41b0933c1308c985389187bb4ae83de22e6802c337a9e8e3f83820e22fc745a409ec9544736b0527c707fd6149f3adcead32df6c4901faa1e997a2cfa41b9a5e29ba0c7443d32f4597492f34fd52a1cfb8473403f906c5191c460f83940a96799be87278e3f437421f0e230b17ca3beb2fb1df706bc1415cbe2dc50a616c9cdf90a86c5aa3df700d8c53f7e87ef2c100ebf733d36d889a7d9a5e48bc7def45a8992326977fb46848c55c904aa06e18d5e927fee90e348951a0a382fe3757cf810abd04eddb4537d2f577fca8ae5afc20e6391a0fbf1a80a7e6da0a3278a8186e85ad6a5ce99e5bd4ba4af3df19cbadb086c1ff9a6afe86e5466825164d2c45dd038f0dcc5424ecd2eb393642e4c87a82546d85d971421b136ba5986826a24515f7d9b5ee66be4c0e09d6c84e76b59e7013a647dcb93586901663b3737db222a9f9e80354c5bc4835e3a093e5fd9cb9d622b7a88fc90d16c6bbadc9ecadbe70b019024615534a7285ce26f98609fd63c6174663da8cae49f80b66839093e174b8062ea5d754070591c10316e083c6d3418dc256e64373460865e98ff13df792ee5b8b9b26127b1c0742163bfc41dba1bb8a2755df45920cec6e442106e312a03cf63aa1bee9ca8a0dfe4c4b24de5de0e08b83aecd34c455e8481c406c9ab9067904e3c29f42dbcae9c56e5c022a8f8d6eeac684c04f467572d735cf954f4af83def5393708e34dd9b4bceeeeaca638f3f79e47574993283cd0d9088358e03288b1de7d4647287d3bc50191587acf4d6e24628621e67057e925229d92a8bc45e1264be906cb9c6cbe6ccbd158d8aa5c45fc903a434f990964f774e948aeddd1dc4c8789ce9c6a5c9d3b7bb0040262ec6576a7323b9188d4320e5b1d16518e638ad1c796ec730050f9106849fa959b679a5e67c85e415fbc09b29dcc12653696237542053f7264d6212ed947f66277546f7aae47f0f47b710fdb905fe71bffd7d9454d6a5537e278c81619bfd5079aae573adc50e86a6f9e1a21ba7bf16feee074ee904b83d5c2466f31c6fb500dc8235e8dac94f2e47c5d650bdfa56ce59de33743b422cef7b302447836a0a76a83fd9b460708b9e2c9d30f7a0b9c6ef0760e1ae8d0597778fd6ad48a74161900f62b75b181404f7ade13d70bc0561ad6787065aa13da3db51d0048fbe4ffa026736c1589b8029b5e54362a2f37ab9acdb5e866be812861a62daa4370741b1091b07b229e9fffa75db9e66fc2b5c234cc97138b00f6fd6f78a9bc6ddfa16f063cd2d1551212a03fa4edc87419c0c8b5abf837fe623b876addb34a3b0d592b9beec9a7e00b7b46f01a004099f99af656f5731a8c16f65dd3d132459fc578b293637ba80525c9c9f54e050038bed4f2927317c25cf874c425e4a8b61ec0ae1b92419e68a21ee6e9b9058ba2ca5081102c8f37b94230ba9fd2ba1a33e308ec8c725049e4e402188ef37e485d099a56f698a082f05119ea5ff662fb123507de514ec87913ce8d970ec9fc2cfbef6be274a8a58ab0e7e2377ae148edfd162448a429b628107c5e31175e5349c84a986133ac1493d13908f3ca07f0a4ce16e6de564c20ca80f18001add244781598966bdcba2ee1c248091ebab2c45fade1dff388f64524dc2174835a266beeaa7f793b1e10304b5504ba237363c13335078678e2f58e8ced1a98be091699a4b14b6c56d2a8812a86245ce76460a3e5afa8c82dd0dc2490cc5345cf236a47234643664d8d9848aa05f26d8eb192cc5d0a1d8d1cc2a71ba92001c1f843fdf1d01b51a3184c7ff3821f288e0131c8589483cdd9bbd46852091e0a8150a5fbf701fc61acd42df6af14b992aefb051a42c69738c655c58b57a85c20ad07cab86f4a873401926cb404e3387a2e3b9815b0ee54ec0bd93a5d42dc81406d5ccdb01404003a56c9cc1e69d93546973a501896ae87f99d43c4d5d6f7895503875aedd4ea9d03d4a63c3a315f0407b82d56446ebc7c997cfdfa2a49c965492015221279e0ae201e1926b9c9b316ed04e69a32b0cddd00225d18f2445303abb9d02a022f049d9a9e025ef17c3aa144bfb0db06b912fe59c0a61eab86062fdcb5fdb1a43065c5c6e8a683adc633b0a7d475c8582b66c36a1362b28909f48d25df918a2e891901be68a37ccbc6b6e16db6839019656306b76b1c975d8b666906f7c5b06a5e70576a072b2b2bb3cb103878f6600f866a24990a77814165bfc58cc674c333a0980311393068c092dd274902b8cf5cc56837a61fa429fc5468afbf7dd22959299171c15c60c7e5624867ecfd069104479f909da66d3723f3f1522da396ec0446a455ef1d32015c83c4736e64f0ac74fc34235dca8d3a507b481ea46c48f15feb61a9567a6418ad65dee585d74247dd9f0f511cb07aebdf7042b3a3b8a66fb7eca17bc826dc4e3dca3201f044c7dc0767bcf2b158c859546ef6eb79961fcbfb8217123a982dcd634eb084af047d83385d9d036f707dca3d15fb449dc0022ab40aba114126699d02548b5e19c76902304462a6c675d30907aaf1dc5338488490a523ce9810be3e262f9cd6ef86b6c0b52c86506dd5da822822401bc1265f48c988c23e08a20c6567725c38f62ddabf91243bf0b92894010d2eb5da3bb15b4109ac12402952909684f3b4eda7f54903857f3aa7444841f495ed0662062efbeceeea5127547aabf486c59b185aa971eb4073e2c314eb128bdd744ee8be2eddb4a8f47c184e4eb365efdb16f75a9a045d192fb06906f6e3e1b01d37c0bb721bac9fe09114121d2098c093b210d452845bef466e76bac792bcedaad786bceda58f7d69c55b7f6d65c5620485a2641c20f1e927e21bb8f40357c38b3225bc3bc4f1c2789822a18d8a036d57be47d9d1563c55b75d66ec55b7756c68ab7e2acddbab7eaac1a6b6fcd59712b4fadaad7f04a1341700cf32d2ec154e831dc34d83c5e339addaf9c7a3ff3393adb27b23414037a8fd09d22a5b2e8f732ff281a345838cde605cd508f4752b5829ebf8d9f5abcd858239d6501d629668226addf808fd63245470a0ed01243f4ea885af9ecc0c541a7ecba8a0e27480ba318f8e30860c93bc02e6d05032d871c0cf437e41b56f5d5d119c0bd823e653722138413e044db47c92aca92a56fd4b59fb74a2d86e542bbf90b2d1fd8c213289e0ed5abe0a086fcf44534b41859ef26a0d5b434763d17838e7e761e7c1cc888d4cb8b99b8bc3c0b1443df4a5ddbd99f52e36d23c274d55b8a1b705cfcc7c0303d6e157f33245f2bf17a54d89596eaa1c7af16aa624c9c97f4daf6ac1026721e636e8f691ba2fdc73944835fa61c5ddeffe6f6f887eae49edb8c14b0603060c503b0ad7e6ed2ab673d9ee5dbce47891b81fe1064eec1fb16784ee6b81cdb707241351673e96e511623698ecfe5689fadcb53827db5dd38e97fbbec3d6a4df05390f18174b53cd275afe5baaf75edebe706ae008e4a1d0d846f720fd8bd49329e7043a3266fd19618cd69ca809d8265dc1b84200358e889885c3c1b88fc636c48cfeaec9b7f92743a5523d48cd1a249a3267349193bd9090b86b6a4d459e8a873bb2806cd635bec63682d17562e35f89f0e73ddd9dff2453c684babb68103fb043e34bedf6c31f1e15c8b3fe6fd5b40965e93d40bcc3623c3ff00f62ad44c49af99645f1a41c438055e75c44d0e5720da554d07d997c169be8d986dd3958f17845141f42f062f553fbebe51e6357452c31c0a13f51fda0a4f900a51f500404b808128c97126c36497327e88d096910dca4dfb432a8d988663b3b6ac6d7befbdf7de52a69464420e860e3c0e9e8c4f823a86e8dccd8e4374c0d7eae8bb8239f357aa907e828b3154a59f2a0839043276b7f71ea7e712e1d82f21a591266d583c598fd2affc8a15c2a2524d3d547ee587a84615f4582a0f55966fb13c644dd973ec57aaa947cbaf7c8b65983565cf627ba5e327536623d0aa955fb15c14f3a610e1d82f099bab706c1f9fce91108e1226c570bf3aca18d5246c1ca2e323db1f3276bd5f5a489a7e0678aa87ba9bc062c39c70fb898463bfb8f0c1adf306e1d84284dc4f1e0811727674e9ceb2ee4cdbb452e632e2c0f13574a4c1527a072399d31972f8b0551492e647d27ca6f21e19b8c0d68af988b5a8e3b8a99919e3ac5abd828dc8303a82f4c0daaa8e420fb18355aa9c670f13437c93d90bf0fba9c6943d7401bee1184e0e964c2e6b2569829034fd3958e7f24d1b216ff4ab0089f9f54ada38912282b0f125bc10c74d0d4e8fbe91a80c48716be17081455bab687ba56cb12df6438ce43d32708116fb43eed1282eea0c5cc04fd9bb15ba21aaa6c57efe800f29f28d7e1cf7c1d34460b1bf9f006df7f8a9dd8e5b8d3b364fcde55979e51a2868256ddaf3e810e1b6e33df2d42f813a057ecfc0e51245f884dc78701da853db4b9efa5db625a1d0f672262890a92de6a7fe4d88d0053286c4ed4c65e49e7642b8ef7ea4947bcabd0ffa425a6c9a793f66ff438b2b19c3695e352afb7ab2ccc57be4e9fbecbdaff2ea8716c11c645cfa427e685446eb0fbca29c4b8b1df6144c29af7e08856caf1f8470572a09a3e86e572a19228b3b7a0f8c0e11663ff6aa8bee95a08ed9a2f6cda4c5161af2e87b8fa4e92e64ca73208170e0389d6a7d794949e1865c108e32767f701993316f4a4498c58056de4b6eb3e41b6cb7d816db62316e5ddeb6307471f917451c389c5bde04c8435b6bac196d68b55a357cd3f2949440db92adc56444dda9fb885bc57ee4560e64ea073fc9ec03747ac05a14ead3a9bbd349dd63f20ab018b7f200587f70d945294ec475fa49c3e84f14b305e136f4f2134f98e178a245722f42a745223c3c3c8d1a439e468d3888744af6d04ea37c686868c331aaa29ff8412015a5940afdb454fa47da74ff481bfe941be953ca9be85314f2c673e04b14a1768b277416509d9057a111c2718bb15711fa532242beb28db4b8c57cbc6705e1b8b55eb785b6217ac7fe69428708e7d6da7e36d7160463264ca93701ba91167bc8bb875afe1ab7366e71dca2dcc2b1c9988c4d3be2a036e6ce15f1253cb9fd6ec49ba0d48efc5c8fd7391e3b3349c2044be1f67bed3f5270ded3233c6ec8bdebc6e085303625844d50e96e6e28881b0a1a92365d7043cc40b0fcca03e1f22aef6a957779205654dee5472ed62bdfc3e555569e0716bb6291f4b09dca8a45f2832af184102e834f43de7042f2463fdd522b3f862c2ed3457f142f05ff8778990621f83ae41df2d833e656d64a02ca2cae07b19c465a6c46f9d1d3239a3aca6490bf734d4aa4519e16e617a5ef9f569860481437c7f0e304c36d0253425113ba586ffff263d7929e4ae7f220bed1c1fcd45dc1833a1f494383ee0a3d1d0f6ae0035602cb5c62f67052e086ba295cec4bb80917718c328c5a7f79900765d32937c449a1876fa89d49664ff7923453489a2ee826e9a8d8028a9f2370421c74044e71165ef5214993842cbc0be94af0282441a666cff4d1e2b613b76938c2e51f4e425f1a84a434a0466c94059dcb658cb00bee02634b829c5ac82ee8fca9a30b1434793a1f4fadbc4ac7d36257a445ae0b79eaa70247e4448d8ea7e3d159ad6ac8826612ce825393092637e6106612ce82835a2f45ed74b83124cdea762c9063e0ce0540185deee773df36ba40412eca138ebcbdbf0b73b14601a15da744d2704f3ad50135914e75d4762e16971f1de69a13ccc980801f64bb2cac9557791e5c9e65e57960799715cb3dfc2b55aa5c2cddbefb1f43a4b8d90f8dbe67804fbea7525bd55bf46b529a4dd7b4e2c537999d49f8c6ec9956706a3291c4837c32c129cf82993b18674fa91802e826e04a2a8650c1f5648d50bc06e07a8c14f19829f8cd3a5fae29b208fa8171313ef56f1b4f9f5a6b9ee6f11984438e1a3bd70c9aaf468ddcd05df2d38ab09f2611fa8f9d4bdad040da501f692385b4c978206f3a18dfa8017746905d135dda6c743c39b29bd9d984ce0e96fdc80d0911238344756790282ee613f31b70efa14814f691f65c15b828705390a839c40df536a9c38c784f8b4528a5746a93ba80a44d569435d129d9237713264c8456c230a5e3091dc6b2b2d222c329e56299e963f660be0caccc52b9c80af24678190b92a69f61dce4e12cc03298c35e868ccac3c3d3c160b0d88a49132727ea4edd3b30c772437c476e881b6a14109e534c25928649a726509ffabf3bc3553ce17a5304585ee5796079152b443a0f2ebf6285b878a10a2c76542ab687ee085f84a1922a242a9d8f8aa5eba9a9c18143141df54302753c3208fd75e420e3ba3da2b26d2e2edf4e98d9294592169108935c2bc2b9ea5c784296ceb6892f08fd8e1e5481eb3f2369f88778f9679316dbc4414e046bb1cb02ac0a58807da1c780010000000840e7ea5c2f9753e7625c8cd311623169c24d2794d6e0ca04d0c118262469f872cb064af04c313a1f4c306868c01cfa3402f8983a33181b33d174d262518b3086318c9d701386d122e84ea3464ee8f2704259c7fca5c312e2c9e14bf0a0dad16000a00e1e4943efd8f1d8f0d9d0d1608990a90ab698b49155dcfef9054f2a38c53079ea771943e805f7303625844db82e130af43926dc931517a34784316e28ab1c8c1b9a40f3e5a9e90a031537c8816a7418ec67a48d3f853d285eae13643a8166d074b5c8b06b44384e97c3e4fd81111531cd68ac51a8d78b4abe3102e0f2bba783d23967033a259deb0a303ef5afbccab750c39ac89fbfab5d11e68ea7c5aee769d7d3286ab72d0c5ff294753d2df2b4f857deb1e3e9e1f208cca160c7d329fecbb623eafa0861d7c3032bd2a8229d7a557fa724d4ae546205102ebdb20a25766e6b219b0a5c0446bffaf5126a91612a3066ef86cf00060073b837c001be1a1048ca07d96ef8d335859c9dab06089567792056dee55d07e8e1f22b0f04cbab3c102ebff263073b009863f2efa1f22cdf63c5e436022acff23ca83ccb8b1582a407cbb788ef624dfc52d56285b87441075970a262b14f95784208e21d4930447befe60561dfb1a3d4a9ebf0debd77d30ef0fd7580efeeeedf737db0fa17a5eff72c904a76ec316e4b2c4814477a921d9d48f7d5aec727ec94b881bcd13c5bed78282b44b1d3a783f5f04feae38e83c1bce3e8bb53ffc97e1ae59ee9a0eed45dc727f97e0bf83e30071917fcf92eb08ce9d4d1754fedb7a8fdf6f4756c4fed8ca4d17ec89520a5af435e6a1df643a4cf65157c067f538139a03da2f25c3db2f22b76ba9c67ba78a6023eaece3b578df2e7e97a3a9f8e87157e965d967f5aa43108472ed66dd4bad8eef8e80bc2ed76aed8e5d6125c4ae4151245dfd56d315d9cd11817eb74b8d8744d57ac9f70f6946946999dd6d0005e0207c99407c1201ca76b0e216fb8c52d1b77f455a388481b4d8c4ecd9e2ec89b99846ff47fc1a9cee5a7a642cc173a2bf8d4ef3920a33e65ca833c8b69998907798a1bf22c38c549a1bd334a334ac5187a31e11b4e886f0c798a8bf9490a9ce238f42428e430e784e68b13e2cc1074b998a7e6dcc209b79fbe20d46049f8867f3a2b3a578b6fa615e48d1e4fcd39935c1b779c2e578f9d4d244dbba698af1fbe995ac81b57e04945e9d222c2f96307e3e996901d4f67834e0989e2ba56e98e1d4f773c1bc849e70ee629a7823cf583b175211c03e6b0e9baab169fc4244d77774f972b9baeb944054865ba1ce613c6308631eca4e329d9cdb06658338c612b523312247872664471deb814e9477b2590104160a24ac186051fa84895096e351f96d72518dda7547e049710b501fab5214f9566e6d3a869b526b22634e738cda78870beb771d074cf49f54809a73fe731f5203da9c7d4a3f42ccf6285887eead17db64872bb97143d09e1fcf16b702c09475d970939e12bdfdfc1545a87e83298230412e8fa40798e8a2b105d49c5157c6e5c49c5157eee8bd26f9d26fdb86d2f6510ca522b496735739055a04f14499bcdc5ab4b7bb9bfc6d033bbd99734601d655cb763d705fadfaa75e6dcb62efcd1e374109381631ccb7849d6da8fa38d7320380f9c47db388df39fb39d30f328dea2d6d4541e08951f351f176f71f3815829fda8f9703cac3ce979004d6c23b0f2a49fb687ca97a4b81308dcbe2bdab4227eee6745e121fd479952bb2644ddab1b4a9137ac7c4ba10f652b5cef3b7a8b27cf2cc835aecb8236d139676edbb85783dc3bd73d2d32639ef93cd9966c960a2d044f910e4ecf22c231e608e9b98e5b1876500f1f7051c22861bcb9cb28420ffc91c742b36c2544f9c247f9be2f9c9a4f17c51d82cb59ee8151802e6d08ddcb7140d4bd56aa5475dc844f6e7ac7c5264c4b42941c9b8e046b3a45f00d7e727b076e2b95b68d82deac7d49ce4d7f424a8f62f32784f029326e5b9ce1a5842a05db0eba5021f13cc8a5e8034759967d9ae779deeeee9d79deb3e7bda7c30373285defe79671d47bae7aa3793d0e12fda43da98e2af8023f677a476f959ef43d4a567b9295de43fbe6c97a321ef6e91ce484a727c8e37ae536e092cd7cb85ed98067e3d17c5a6cae8214fba1d09ae01b44b41f90fe096f95de81c0a792751e3fb50b0a2742a98799709fa88244513248b169acc5d67428199ab8ce03295e6103a1972a0533c9132a24935f414141de07969ee5c72c88e42c3ff9787216117a9f97b18af459dd6e773f3ea9b2d4d04ff44b95c539c759530edccfd7c1d9ad7bae763f2bbfc0578b9fd7f545bdbc0f0a49f0a8523091704285c4d963ccacf9644de8e8b8f65c47577b499afe321f12a98b356a6c577737e94b25307b6541419ea2b1cd0b89be10852a05ee85986bdfdb7bebf050ad09ad45ade693fdf6a3e6e33ece721ead664d6c2c2324cd11d5775acc9ce53c7deaf71e9f393d94cb2f339bb51896f96ceedd2b26699eb4b8f28a2c71770f03d96f5e654933bfab5d336a472d1be94f1bbaf01dc3a9b252596a4bf86f739b1685cc011f34618511566350c288129a70f285156a50a42383b7618ba18b5569b17f0c6f86c3534386d0023390e189222044d102181447e0220b434c1185113c07f0c3108eef3a28b14227064aae58824500269860a207448841185640f9fa532b8f8032004028b23222042d88c10b618431c50d969881929d2880397f7178aa035b4082158e70814815422a89852d60b1133b02d00e78a0f25aa0c5184c88428c2655a84a5a5081051443d08145a1eaf79ec00511fa9520f81d44d8ef600ef80ee6706f3342c08e11b703afacc2065eb8267eedc1ee1ae1b769f4a347589856be36d43083394758de9b20f8f36ba80187900bbeeff03b06b99e047718628356105f48c20a245c4c4125fb043ead601de9733fc11cf4bdc771fae3bb47745ec5626bfae4ffd5230ce670efdde03f6a97fe98d9843fa50de9a95ffaf4e9b3b45179fa2d6d4a4fedf8e3fbea0d2dfa73d5862d84df8f36dc9a161dac9b142905df7fa5aa9448754a1afa2935acf451eaa53faa97da1a726cb7c11ddb052d8e46713778daf7d91f5f0e928b1e70d1834be7f59ebe67bf107c17478bdfe5c620974a91db7c1072a98fede9f6dc3bb7fd7bb6fd665568181e61798f45fb1a1a356a4f5d7b6a6b68d13f85156a2f2fb3c7acbdcd2c0e9716f9b20bc2b18616679df9cd8b902b35d7044fce6cdced23578bf27e11e268940d8d9a5f0db70d358dda64dbed8a307eaa70062c3081062a7e174fd13071850a66109bc118c450318f0cbc30d2852b0831a13201169238e2658528584f54fcae243c203aa40e4a6b6891af3d923d4edb6d0b4317174ed2f0cbeadd52362753fc1c97227f7cb9e336561c304fce8ca32f0adf100f3c98070fdf10df50fbb9187cf1c029d009f31bfa5c7cf32de11b313f398153a019be27f787166effb764946530038b715b6ee1ca33783fa44dbb463bdcc88bd09415b9247f20fc1387110e3aaf1aa1a03e243ed6f66dc163d2cc8e8ad022af5111be19b5e8a8086b256982d802df6846a08405c081434d8a6793d6e080836fa87500dfe8e7e138708a872997f0c0e300bef9be2396c8e27e2c4933e774973ed7658670fc866e53d676cb00b6865c497c6e0a7481434814286db24ff205297277d4f2d1c807526cc58c468c04b3b4d5289bda4a5bc1b4a316dfd056c0a9108c5a7c53b33d878ef224a44fc2f91fcb8bf047f86d95eff422ec583297b4793288610b229698026b09aa26e8e08b241cd1c50f112254438a50c5113d60607da14415545d812e9c00c56a0c31a860a2b2f1c205002403180bc19321bc8163d4bafd73ce8cd28c6619a519a5a52284fe5e098cadb4d517fb883e30be31bea2fb91e1e58e1fd11c034bd2489a20248d6684bca17335156848dcfed1861bd421de0acc31c2d13ff89ab1b02f6b3ada4a0c21378f36c2e5974c046b42c81418eb534b1bd0bb231b4131b314217b6108b7dbae3bc1206d522e122b01899292871349a381b1463d2983b4d46e4efc73e24e29cd5c2c67b158f6e325cc32c408c76fc9763f960c8dc847f439617dc1e52970a75f9e02570ef3d427469f8a1af569418afd601117a8f311c15ec6bf28d62292262b22021f2936bb41b603a2ac0929868ce70be1a8adc058a7c2d5185e17232e59fdd1f214780679f28144816490a24fe390e2a9140b0279ea6cd402c3ed7f724744dcfe96e98570cc78584417c90e52157a0a6554a453d288b4e1ef470a4933e291365d08c1e71fb7199acfccd76ab9e3c79a5e84d91d3f56d3e9537bbf9a1d4d70b99f45a1f6e3377424e5bb9467700777c19667271742b0e5a94c0979027da44df7200f240ea46f231a9121e4a9ff05da2a3bf25dce6aab2d84da73effdd442e8d96fa8456dc853df12ce7e4339f4fd967c2f69f339f9b490a84f0b44df122227ae46694055b8aea549be1f69f33991345148d4a705ce26b9fd281917f39be8cfa751fc39e9537fca47040b757eae2bac2823268d1a851a453b808346286d3422640ae55b742d06b79f4e9b69216fa0d8ccd535b82e49938570d456da1297a7466ce9c6695e37ff592ebea56a6abe243e9626c5d57a349e1abee1c137fabf243815829a1430078fa4e1c137190fe48dac063c1f11e94314560a2bcc98c5bc7dc6d9967d441fd1a72d71010535ca5d5ed456d967c79a3b662e1ca28bcb95e1a073d2393357006ad05601d056d38bf0bba3b67a692b6933ba338c10e5991a20499ffab5d5a8f5b09126b424b78bb491cb43c11c303e56a388982e3f8947dacca7a92cabc9b20364994d96dd64d90d5986802cc3c182e090a4116af1c8e8e7a822c941bb591155ca93ddb1ddec1b318b35f049c6edf00e338b9fd2e7a13f7dcce769d4b4bd6d61b892a7e66991d5e20e3fef348a7f8e98c53cf6e31981b18fd5220fab45774138d6f41142256178a59230a4b8de9555280105087221512c83d78ea46156e69a7466ae8c283b40363f10026a79f08d10b83b0fbe015ff295056d216dda0b2f42530eedf27317bc63e6923623b6da8a281c3f96b6e24f06da4a00df68ba4f77143067c53e9dd98788e86634e290e99c948735aaad4209e0f66b2bd6887c448da2bfd2c142e8bac2a4933396a251dddd04f89a8a90ab0f42562b1fdc0c2b1890eb43e263b9bf80cc0280f459d0ddb9ace09eb59af89c1348daf4e59e2ad08cc748a328f8ea130f240a2c8314fb339f26c02792a61f8c7d110299e01760eca6be9d8f458510c8bc314f65401d038a4238668ee227f1a7800e1872d9fe58c2ce0dd2e0ab51429dca60a1bbd38c7a131f18410d0878bdc017df801fd1b7057e65283e85a4c9b49037b6c029c91f91a7322a32d714421c32fa01bea1168c4d30268970c0e351f89cd39d524ac339e7fc2dcbb62c33a2b3aa5f4cd28031bef9c69037be30c031dc7e948f48d280218570cc5c44577e2c6739cb85e5595624dbb6cce5ca5ce3c7ba3edd84d66a946b2b6da5ad3c047c3e3f7477b088afc83bc03775c2e932e2e2eecde73272fbbd08bb3b4a2737e5b3226d249c4b849a1169f3236dec88c5eab93428a25320ac41d80ee8ca9e90a20742b83a4072b31af0a97fd47670fb6f00331e4903b66e77946e08f8a64e880030875f06ca8a342a63128e992b0ae1f8b5eeb7f3f1348a7ef6af46f1f76a5188a638266666a6861a6cb0e1868ff559eea969b1b72184d46641130a3545fad43537e0481beffbbd9191468d3c1a2519fd683f7fc8a10bbea68d8a7411f2057f1c15e919196931013857a58005e4e4e0ec47ad4671738bb05f822d3049a386c271c42a72fb3d1c128073550a5880a67d39a003865ced35fa2091a469c2ead18eb4f976463290a84f06df88753fd67cc2f78470cc5cacbba5b22236e371420864661fcb53bcd3a7223cb2d9472c4f8d6c8330b089b4c980248d15242aab428afd1b08bb4d6de6e2221c9905fa348a8d342ab31950e69a42e1c82c1ebed9f8bb414340e61f0e747e0998f4c3f1eba9a87dae7cf941a04e115981a842429f0892ed3510a85348b6ef075d8d929914389d655913b0f24d40021200266196b4d9e169541169a3b111dfcf48f00de40de516087a1f08da0f04ed38e47a366b92058139648b573638b708658bae4c4a1a20204074703685cd6820698e8c3e73796a645dcc72654c8423b3f84626f1bcffbc470173bccc061d0de48d94373a0b843323d246e3321efa23cacd76206f68663f22275f9118408284281f18e40d6da5ad98b59556048f34222babadf8230259e04ea3e67f441fd147f4c9cfebc091eb6b7e42079e9c19b9e3388e7bf7902debf0bb651e3a357656a3343b7aa869c37b5ba7c80849c3d347b0d8df934411211b91a3691a9d539b73f21326531530cce5a8ec6143a04cc10fae8332dda7bbabc6fbbc22b3874911a00e26ac69397e82b4f991a2519313fdd4efa7f02fcfa94d8d6ab387468d2e1de813fb67ef12bb26a8c5173da64567ed87148c806ff4b3cb53c029b6a2c88a11f00d83216f301486a41788bc2149d345102177471e1a7266e540b9cc625204931d66db813a98ec30d9e971f6d7c184c7ab0e263d74157a11b73a98f4701ec86708e9cfb4d8bfd362119ef66c991451a479ee4ea798d5a7661599d3bd87a7451d4c8a68d4101d4c8a60a2c38435d9ea60520465dd998370c4c162b18aecb438c40db178e8ef778ae3afec96b5a64153d14aa592562a955428a5d413527a3ab31a0219f3e80a0b474ba552cbb370b4542aad6859a665d9e6a91eb808b6525bd55259c555794b556753a9acacd8d1f7b910b2f43d78dfabd4af15ba79bd8fa3f48d72d9346dd3b405882f69bc526d95d723a5575159b1fe435428a31b3e4ecf2ccbc1df7dd64de7324db31bdff08da5c0370ce01b2c852015a863c42c49d3357418c0376c84641520a184eca35946b3ccbfc11d5ad5831052a354a334cbb26c3a6754a359c64300155f51f9d1e5aaa8a8b8644b327b3df0d9aa5493f62c3f4455aa26fa7c536ea35c940bfac8533fc8715cd64385d61ea5d20a8bcfd78307a2340becd7f763be37faa63729f56fdbbce999bc9246a946e9763dcc7eaa20ccdef34f86194948dad06f2e64aa7dda8bdb3f040e429e9a350416dc8e40ab7af0538f6ea9b66a0a11be8f8f8fb6699aa6514ab3eff7cc8552aa6d1a951ecb47bd96d1e3b47377452391c09cd17b5c5b65c4aa96daf2a54a64e559c0aca50a296dcf0014c9628812b2248d11928605d200fd2b52162085f49e07f331083ed76c6bd54a0b4bd6c2d2d2f22e2d2dcf524d2e2c2df4338ecbb8a755e0c0c8a5ef85dfbc2098c3e3fbcceebd9792f6dbd831e817a8ba3e02d43e8da39399523a25dfd0972b2a9f955e55c2a12abd4b8bd90ec7b888011570a952d537cb6896d12c5bd262a9ea6caa1ffcb49234ad02169b7556e05c390849d32bcff22c2b3f44e5ada89858ecf37fe055aaa907cbab3c8b154dfc2b966d045a55fa92ed41f6cb7ffcecdb5acc5e823d601fbee9d56d26a202d6441802c2ed56fb486d6bf185ae04c19c8cc11cee816adb87d9f730b263683b2492f520e107adb59b4b9ea4aa27489ee4c5216fb2e70f65aa5f7e6a02dcac667ca3ffe5290dc8533f185b175e63f4d03edb16862e7674f1d19e528d360fdf64fcdfab22e71bfc1e0d9f5779653ecfb8ab52a58a06d8568116fb657b323b443b5bb461ffe5d98e33ac6cf1f4b3c5937db1234bf0012d2ff32d754cc195b932ef6d0c3e60a43f7bb8a4dfc007f89561f0016310bf2d7604e2cafccb6fe003faca8ce092ecf8f241fccabc0473ccfce856cab0e3902b6365fc0bb8a3af8ce72ac38eec0ff3d38ede4b9dcfe1cbcf3abfab41f8729079f99d109a72e0dbf27c5bdeadf86c4d3b66de7fe6dd8edd85f101f3f63d0677743accbc8579fb1298797be475edc33ca98e2a97f4b48e3f2e753bdf54658bd36b3e26c68edb9d763c3d7d93c9ca3ce9719c546b3cad297faae30f95dbf2325faa25e0dbf20deee8dbf20ce630f3f625b8a3e5ad1d61be85c4974475b880a37c09a75b6c1d61bee5bd963af68df124a823c69e7e56faa54afa96961da52751b963bec754795b6a5fafa3cc7b7faa3e60be9abe05dc215b14bff4b245f119dc21bef812d4a1afc9fa80f919b18e32f687ca85b1f66b3c8e7735b4a3786b3c4a1d6b6e8d4fa9e38f5be33f30e7c5ca9057f7ad0c7fa8dc12f09d799cdeb172671eac9dd056ebc8b7bed76ea8a66abc57a3762f2ec2d1347578b2765c0c7fb2ea8472ba275b84a3bffad6c7f15beb90fbaac1b7468d1a35ac0c7d5e56b905a0c1122b98382245b06ebf89bb2598d7876cd1c8ccbc9b50386e30a16d8b70dc60f2a278a52db63d6994b76a94e9fb39221c0f5016c4b852e84aa02cf45c8fc11cd173ff4922e5409f5f07fd71030d2e4fab8bc5118efef2178ad7a892d5212f0a8a67b22694972b35c8a8fba10c43701d610a5880e1040c2c810923c48a3801c6852684f235823bb508f9e55c02018f0316aa9fab77ab83d09463be5af4180ec21b30b8c3cff0e4f26804777e1bf197f36fdbab97084762bc5ca8bb474015c25cb84117825429f09220410515928ea8e8b68c968c8213551ce10635104308469cc00760c07ad002229e329421d68d216f687c7f4706695343dabcb7e3f25eb07943dc1aaecf481490520d5f0001bcff2651f6fd3f89aa3770bcbf4bcc4b940d34efef0ef3d457854e511053145145154a8420d209fa7142c409cea4c576980b6db027af55ecc9e7433f6eb8b2c521772bf29407b618030b2d4c01831ea8c41f4421840d5ea0e4055750f56fb08d68ea346ae5fb86f16342e8f234fce82f6933e3fb0a225e86dbfee360f096166e68fce860d4f8d1b370ff4777727b23da6040484fbf5481943e00ef71dd5e087c940632ad40e893be5401602a994a5b1005d94835487849efb5977e7c771b424448892476900511822084d4c2144bac4882958591262b50fb52c96eb0ad4913c2718395be7f2b95be348216fb875c876d2d37a4c17aab7a2d4178b996920a8ad5eda8a05c3a9eace3e9581dabdb89c562b1582c539121e3fb3b56c7333b3555ec39ee2ee35dc64b304786ca83600ecae3d0008fd3f26b30c7644721d7f4fed3a8696dfc58330ee074fdebf57f39bdff1776aac626e6fde59436f4fda9b41149ef76fc71c39d3ff3a53ace5bf29f99ea2d4a066f79127f79aa7bc958183b862d2d6fc3c5ba5161fb826ff49fead66423da9cf449f2b7d851c61d3b182b639d061b633731240dec05297d5b3f59842eb654c3e73a6e60f099eff79fd64ff82330c700dfa17ca46e47d2ccccd47929e8802177da1f37e490a203a483eb28192acc734e1851516c7606a8dd4e8b3c2d86dc8230e5c78e959aaa9f165b2dc6bc85854b9e241658bcb0185aa9a61cac0f7ffb39541ff3eb93ba24351019600bd9bdd942dac890f42330a74b3241cace3f99525aea7e48b66bb5dc932019bde5ad25434b60a525444b8a38f4aacd78cf3f9e2b55b2581f74f0e7e097532feb42355cff94cf59129327b9da7442963cc99b838528b51a986b79aa63712dae6375ac961955d6a8f27677ec8ec8dbc36a017bfcab6b852db6358346ad515dd2f87f9d92c6a93cf9c760e19b6181b94ae1b40bfdb4ba5697a493a251408d1a39a2ced5285650a346ce09cb5348468e8868a533593c1e00aabc5188d92b81a0b0a464437d29ce2f4015a5381f00357c006ab033529c4f801a23c5f903a82e529c8fa3aa4871fe8d1a4a717ead9f14e7dbba4971be00ea94e27c9a09e6102fd750e50d4095d7c11c3300c8f1312e2ae1c7dfadf3feba2958d0d6108ab8e08223c040346407442431c30db6d0738620b6261bd106db96846317eb62b47b42afc7a00f24e06b7a1e50984d55872c51cfc2954510298b5716439e8dd7f0dbdc25369d8983973fbd728a2740716baa5479b246488282145048e23027b79ff4a4ef482f2fe94952e52492bda1c5fe9c1a76410db5f648cd7717abb1b02e86dc09e7f6d1d401ea6208d75fd2460b1dd47f7498935712422798f4b30221592039f09ddf23ccc17796de2b9724d82324c9762190c7aee5ee3ded436ac993bc3464617aafdc838370dc60b40653180922d5c5ba09779cb48b957e7489f931947998a730b68b91ecb8c9d871a3c1c6d8313459f7e961187a51a3c2d71802816104088c222eaff238eddd5039062bb062a5f2b62bc2712bbafd3c3b4b08c78e25e70ee8802139fa6e4f244d9ba65bd38eefbafdf1015911050d6ef0842caa2084902082b0859f2484884dc11ea9f90de6a91adbc5ba18ac8b6db06e65e519cc61f91baadc220a245c2a3062574e71251018492e12d7c571a50b09eb7a9ecc7b2d3df531a76cb1e583b8f4f8339998f4fc3a48cf3fe47a1d855c7fa681d621d76b90be34586e01df30fdaca364724d8fe331557c533d3da9ca165b2a4c1d879c1ea74ba5c7712e9564aabc2599f7f7fa2b5599aa5359477d1bffdb15e18cf7e4a68450021981e88e1dab63356ab6a4cd0e47246da6f576244d7fbb9d43489aafa95d4f9ffabd8ed5a898efef761a25f3347c7f57a4513d9d111289345fa6366af23beb63aa64d2ede8c04faad48eeccf156871b2ed8cb4d8d4763d2dda949011ace055dc022e80bf10ebb4434158fad15bad4679921f96c7aaa92b7815123a793e4e9378b2cb1683f8a5cf2de01bd356a045af3952f3385e53a5bcf69dc4cc24d27ba5d62bc27a3a2d823a6c978b98ef75822f2f307faa9e583dfa30d534432c3d9146f9702122bd6a948f2335efad5aacb15ccb4f357e9471675c6666669466de931efd64d4b1e6caf8ed8a5046cdfd9f600e1b5f5fe2b48d3ad65c1bbfc16c7c3fd7f254cddb78921db76be36bd8781a2f3d65a3a6ca3ed978af2a92c6868d673b6e367e722d1b75e56bd451068d0a1bdd0ab68e61ada3ffca7f1d19705d5ec64a174b423876b1ebf2a52d28941788090ff700fd14dd9e4061005d9b2b81c2d0b94442444b943cd1848992278a287962e7a2380a21d71341ae96e75250c85b9316f95fbef49e07e6687996f72438e776c516829a5bfa594350737d909e823a5a9e65ac21d9b1e6921ee65deac8d7e5a5a4b9f3471beefc51a5e6c795d48f34d8fc48e3ce4eddfcb8917ee56faa4cb5a171fd471aae7f4d75ff187fd33398a32f0dd6ede8a63a3a17ee85a92f75f42f3d571f2dcff21b98b3f2a3e6b6e8e0bf11b17c0bb5e3ca9dcf8d2ab7f4f447cd6561b15ba96eb079372bba57ab45553e95bac1c62eb635994fef0cea9e5ce9c5900a981003085ecc20881a452072a2066008420b84d0b53ce5a5ae45ea5aec2f2fd97123f9cb27d77005f2dd20db3d52f30cf291d4e3b457e3c9fb28a003865ce71d6e7bd45456b10b42a1d4f7fb2b25d4627babd88f5e45386eb0268dda9c346aec36d846d4a8d18b6e51a31a3576495ed275008b64ec5ab7d5a8f9394b7ee449bae449de207992394b5ef2242fa803b843ea6b7e83792a654d3bc80a78a14409229c7481072a0114a9a42a556379f80b2854020422572a79428c2be34a254e3471fda585b4f13f92fa06799035476a1ea7bd5495b207af6a7ce85656b50bf95fe942527453ecc8465e1b17ab70e41ef797fb4b49a83d08beb6264209eed8a810fb516a10b07e40b68c897de2770511359118e175be408becceec2ff657a3dc1b359d899346b91542117de0f24b9bbef2993419f257a324101326424cae13f9cb87260f427eafc700cd5568d293120e6006759fee6827e7769352ca174317da43d453a6323b63bddbb65f664ffba7bac2f1ef26850c80a270062b9ae0c403980004215e4c7802851854fddf2ffeec09c16712f6cbbbc3d073f9e58c8b738a72c6d3bcb520573a1432cb38cb64371a855ced4e3beab8948ab08843f91d51a3b6d67a1265734af9b2764d1ec79ddf63354adaeed5055d1166df1179d28659caef601d518b7cc70ed635e9881ac57c93b4c8b4d535e988e4ebf24bf943ee927ae514334dd84522f9ba9ee66d9fd799eb719f571cd7eb3c3a27b34c19492bae3781ae977d5449d8df9ee6745249249584fe128ceb699fac920ad7db66dfb6a30fd7fb02dd2bb228e2d2da2cb76deb6c64da41470672a9c542e84ad9dca5a61ddde4f2d3dcd3f59a29acc895108e94e8f29b72e0cb0fa4813bfa8e13d8b8e5f904d214488fdf1dc71ff2c5042986362f221ca98b7b512bc2ec8164b7e62ec9eec70423374803f590ed7a23174a164f6e905e72f9c7ee8e9e4538ba641166efa56c575a5a4598fd90eb913e598174a54f566bda21878680cc3bfe90af1ff275e94f8b2a9fac1428ccde932b2b73c59ba5cb887e773daefb64ad5a5ceffb64ad03b8dee89335e57a289facf47ae1276bbd5eca272b107a83d00b44d2323a6557e514d7fb4c515c7ebef56631afe7cdd2a5677fdb0a7eaa2494e2725b118e747a774f96da88fe481afed1f40659a2a068b7eda8e3d2a2cb5f6f5647fa73f98a2545ad95a7a4158230850eac5044061eac544c81264ca8d0f1c10a5820858abf2bea623eb7a851f22915a11df956798b9e5cceec11eec568913b183fac457e981cfa628c2d96208630b45a205f457c100b83104ffc6008f37ba8cfbdac2bbffde97b52ec6fd0a95fbf12f422ae2b926057f4cc4f5d9e6269c2d0164368a1051f9c41c54f833c051304286a5084222d2802122a7edaa23f56845e8c193c077872869925898391f6b64c759ca4b194994e4ea698b9b9b9f948c6bd6d17c76402c808ffe28cb4e1de468ddb346ed3a13b5f5e31e4e44eda49febc09245a740144667547aba14bf82e63a8b988b76ba46afe209cf69b48288c2a6176bff70341c33ba541e6e7fc9fbf792ae58fa0fc91d1cfef8e4cf4c397aa946aa2d66401f0539e87d1a33c0f291f5a20c04f79149b2253ea886af608caaba4a768ab4ff3274a2b05c7fc9af93f5f9cd6e4bda907833cea12618dcf9bebefd2e1367f2c6d3d9daaf9a2a7eccff9a31c8a1971fcffcbff8c2a55b64a958c2a552f3d355fceedcef7d3d46c8ccaa4332d4ef19188a169de8c3a7a5b4b2fa3aefc57955a91ec205544c24779099ab8e7c13fe579e807bf4e2184fc0d5209c58c1abead28d587cf9a3ccb2344790d0899075f460502490f99071f081a3ee5bd2984f025cdfc990408f5817e6775c8bb3d10427ee61186282f41cd071e4460fee54ddc57c03fe52bd00f3e4a35d19721e387a8c26aa28f327a94ef317a94a78f628520a1b647e965582132d6f4a517428335516be26c04fc53be473f38fa212a8fef5677607087acf2d5aa89c7e87790aa51e9bd3655a982a952f5a2f1203204e95d1ea765cbb33c4e677c632ae94dd5e5616acbbf54964fa92b0f5695cf565e65f4a591ca0acbfc96f92e52c552a56a65f47e9a30d3899089a03cf844c21fbd0479a47c15fd341f6504ce9f3f08b78944d544fcbb6508d725233c3983e306dad9ab5499543187fc2efc92bde04d60888abe9c59221cc04f2269736333ba7c801a4f75ef277e1e65918bfb51beb21f25cc53ec2eecf69b93c890d56ab5b2a145fe1a1c2de220e21d14ca1f7154130fcffb09845082a0e370edb9df242055b46b8d9ff83d27520d59e1f013b70d5be49f4842f963485db335317872667cff584af9f2c48fa3c65338f2c4807740f36854f6da87f2c49fa439a40b4778a7f56104df95526efea16f567608cafe95276b8434de9362f8332f677ef4ff16457f1a8fd362a36a7ca35c7ff951c6f5d1f51f65ae83d74d3fd2703d06fcd1bb6ebadd95f911e63a7765fcf872fd55b4eb2dd7b3fa230be9477aed8f2b77e547955bfad167fc58bafe2d6db2f71f53aeff48da341b97773bd6787faf461569d499ff49a346a521d2b0df4c9d2df673188ee16ff2c4768644e6cabfb76d86ad2f4386861813cc8b4b0bcb8a4a91122b7c70fd4929fea176fd5146ddf507bdebff79dd48d26c95250d9d7593346e694844c264153d505c1abc11c19bfed94b95c9ad2902de6bcf43f7990522fbee350b04921ed9770f8426dfcbaa8987f6a61da44a33f190bdc7a00f39f0e5df41aab6e7e68e8054e5601edb7fc099079196eca3dfb46af237516b8a80a665bf5920b6cfb6cf1e08eeb5972aa9fa408bf3bdea27ade6dba42adbfc347f74a0c5298bba2775ddac51bc8da14a8bd9cf9ac9cb004fc9176f6ef62eb07028cb6426b355c8b7cb10d29736fd7434b2dc904fd98f59d56ea334ad6e446c97c19c6eb33dbc17a2fde8a5ca41138fee7b096e2f64bef79bedd1fd678598b477f153a659d5d65a0d89b89ef6cd46754434aa7566a3b24c1b69b589b8de56b5ffde7b0b7cef59136701f04d9c3545c0fbee7b78df592148b81782f2de733fb24246dffd109556690e7cb9df41aa421ee16f35dbc21afa29e36af61b0fef77902acf0281847b20e67b9d05c2bffb1b7e8ff9a195dec35ffa895efeec33ce6a5af65ecd50b207abf4d3275d28557e55aac0d04f19fd69317bcd4e242d5304e67bdfc3bf7bda6a31fb4d8a9bbdd769da668f7c2a2da32d4fd19e3e659f7d1eed6931fbf066d97ff662f661f62ed94b900791f9fe541b32dbbb81272710fab704ea42d11d7f66a23c203a1aa507bee9216e3fe5d9007318ec051ec36d1cd7e6a2eecabc307c53f6a41fa23265d66481f053be074af6289fd91ee1a77c8a15324a421248caf08491d54a15fe10d5e8c1cf7a3e93f294fda80671e5a84a15833a84b7b347523eab99911633564ac61a33d6ad91c51152e8810ab8f0c4125443746a00c4440c6014612406aa7e5a446321f54228555c0527c260a206ab954aaa9094a0038b903881084560ad56aa093ee0fbeeebfe7f7cd7fb6a09c699d511c7388edd671fb8d9e3f858c3d5dedbbe0fccc9d8abf2763accbb3d577df0bbfd06e66cf6061b6221154338d222947b2098937d7c63393c91b02c1be275b7839f1f289240f1f3d34a5a4597e64a254e2c6188005702456189bbc11a05044890f0925c3ef3b86e3d1f68f14714421a6cbee66bac909ab7f921a9bff91b2b04072c54a91fa21a5d2e87356caa1004fc0d3f33a35263eb229c2bcf535882881430254fa2b0002b943851c517432481c47cafb37accc73c4ecff73ced63f064c721f7f4733ea54328d371c8f5c931ef1cce39275779e78c79dff198989898d367323230d649efad4adf2fdee2a59779af54bd55172bfdd8c57c94de8e1be9a524919e8239242bc32f7d7fe947d2cbd82ed6a2b79a9764bd6ec22cc3fca592cc6513934cd48ff0cae21b9e81396c1be6475479774cee83764d384d9f54fd69ce7c538d79987a7a8f3f99dac5bc558ba7eef4fdcccc33f7f4a798dab1eee94aa0309a5ccfeb8f411da737d9f1866b7ab9c9f42f2f4ddf6272b9a6a72f2d302f2d3024ca4f5f073f2591a80c49c6c697aa2852ca325486d95469d842181be20dd7e569a8a9379faa36f3b924365fdabe3b9260c8e41bf44b243b06b9a4d2538f3f93c976435a600673681742d3934aa00416b8d8c20c34c8c2147438020b24a090842788844168a8517da7e949ef996a37b485d064da82dc713e69d6f1bbf349cf608ed9bd7e7cd764bb212d8435d5669248964b551cfee61de4e1006ff30ef648fd8d15f249a14abd833d6adec60a414012ae2155cde378833914d4f1f2ce2549959ef4a612c9b46911927e3e3fbda9356f5353cfe0034a6fca312fcc9b4c3fe49a5a9ec098bc558bed625dcc855ae401874fbd047938c0d758217c854e1845aa9a97600f9b4f59212623a86c5e823d6e5e08032141044b75a3138e5dec4a92f521a12ee687d323d262ff92dbc53e26e62798c3efb4fe7222ecc7e16d2a7080bf799cf6b22f556d5e8216a8f91b2ba4c1500598aac6a6a67e92240d9d355ea68eb38e3335f307a8ae85501380562a1caa7cad562aaf06870354173f75318fc8edd04f400847aec5b51a356df7844bd2287f6d2f2ea28042c8c80fca90c5189e206206621c6102135e7cf162fa36225dfcaee9678ba697617a996a827999e7bb524d30bff2a7f74a5008477f7936a8e82969437c8fc152a985c697ea8c27493067864744a7e43b2509e6c43c4e93de93d6b483f4f475909e32935a5e82dcd24d6ee9713ca69a9e34ca54b25d0bc88e93e9573e47e671dc546bbc4c95d7461db76e46ed588fd32f75fca1d2b57e3a22ac46491e8ea8c5e6c4e8221c3b22b7bb221a55bfdfeb88342ae5fb3b1d0fc25010a4b89e7fd4671af19e2e72f9b2e5b9f385e5e9f3dbe71f7d27075f120d98524ccb8fe2cbbc9429d3e95fcab734ecb89d2c8cc9c23c7fe9f4a56fa9b2c5d2d8f2334a92be8d181b84de18999ac2138a3648df981f594ef465be411d3ee6cf1b637d983e6696dead95f9f145c68edd845e93f551fa98a7cfe08e92f5319fde18da6283f485790775a0253bface3d8254bbe79a627780eece7d4d9ea4599a738eecb1c5f152e9536acc4bd0597c43fa39fa0ee9bd1b371bd6bb09c98e4c411dbccb96c4757ec3f87736a071c89c73a7543beb3526e653de59313129393156860e74bf989af29e0475f06ec35a9cd68fe01b5e636bbe644797d4f3cb66c6cbb0e396b236fc64e3655a349e56f1bfcadbb1582c96f8d48e33b7633d3f49e5d292a5213b960d1933be411da687f9af7c3b16c9b29dd62467d8717b7919d6c68b9ee8bfd06f79982ac11ce2d3f7b68fc17f986a7ad6767a69f94ff9af7d69b5df9dea4b15ebf863a653de8fe01b7953de77ee3614f2a5f1d1a87c6930eb7a4da3f2e5eabc61ca7378a2f1dd77ffe2335e1e46c6cb68f97fd1c657faa4a794868d225856c70b5ca64c9932b5a69827d9d1a483e9e9bdc0f5373dcb0e99f7181d484f75307de9e9b64d538cdd61b225eb2f635b5a52682d3dd31696a00e2dcfd647cb97ac0f1b3333b7c5da78fb55a46143c6cb9f5e144f2f0ff3127cc0cbc3fc0b0c0c8c06f302f3a7d7604e303466c0d8197fea19cf75c68b773a9d7efe683444dfca78b6a61d34de9fc6cbcb77f425a8038def9ec107d0f8ae7b9ca6f15df72f263b0eb9a62fd571e60297f4311e13030363635ea6ca1663ece872e7a872bda5c5ca3c4c952dcad8982a2363e3491ff335552c55fba4caf236aaf8a65a02ded139d0d8f142d241f6cd419a759cd9e15fb27d671dc55721c978b7332dca789c26591f2f4fe365d451b43f66ee8bedde3e8e8f6a78abbc2a759441d73e4b1d2f70eda78039a71f33b704bc63e5d278ae76349ed66ea84d3f6e2de4ba1de9dbf7ec13c249e2978919372945d2dfd2e374b76a54c98e422e932c47a3cecbb69be2d5fad2789cee5e8db2dfdf09f5cb8e51b9f6657fd7feec5417f353bf7d2b4366dd2ee6a9294ff3c7993bc70b5cff8ef1582a9ecefdae67b9272d1269941c65b7caa16167e4addc13946739272dae1a85628fd4788a1be288b821aec5b93c25b9a8820a927881175cb06304553f17e4a91a863082188a2c39c2041ca8fab916f7b33921e43bf335eeccfbb0fe19dc31f3d6c9ade1ca2b7c5cd7e7894f4b860d989ff1a7978d129fc6c3a4f0843ef8495f7ad2732dd512534a4dcf9564e525bdfb30591f76c81f97f43962def4f27a8cfd71fd4d96f4a64f794f4a60e6d96775f9c5a22b8ec0ae604228f33c0677c4bc979ef44c82c7e9e95faaec03df1da6d20e137f4c1d4d5fe329e800982f3d0519c017e6d9a6f084ef691484005f2ebd0421c01766a45fb2293c21b53f54fe25a803ccb3f501f325eb437cfea13252fb43e5daf869c71f2a57fc1a4fa38ef39edec11c6602ac15a8344db3864d903aa56844000100001314000020100a0744a211a150a4ca6afa14800c899e527a5c9aa85992c31452c61863880c008008080098240900d3c4a0190bc5f8811bd27057cc12c1e23d3b8932872504bd8c1be85aab93a8e94192cd753f76fdd23ed920deb5404c58354a8d688e8eb01322e2c8daa12bbf94096ca649b334780548f9f193fc4449a0d4252c9b0a1901c4670084f28c283bf465c1b688d64d81420a527242ca8a66711617f0b20a74f68bd2d5ac0debfbf8424ece81a1f5fe37629344b496702da8c79e96652514d611d09433d62b104c303a1fdf9b7ac069006f7a2dc4586668e6360c39995e48b901f97f2cd613744625821e4a92ef5e386d3086974f816b284aefa8e341354170e41e89bcab44dd82b433888fa4cc4583265f5afe5c702c87d57bc9efcad6515da0d76e666a54d0c2b45480dec056d2ad180df932fe44add35d275f88424378bdac82bec7f68dc28d6d80200ab508e44024e8575b75a8b183bb595d4d4f651d69070b9950a7fce124d247c4be970f6bd2d03dbd51e63504f580268f56397bcf54e1a13ec443552b2a99d3c55d6f2588a13373174710a95340f58eb9f61a6074139fc1f4a5e43352309528b500589617749187d430b56ee794e7b62be49f017c0033dd423614ff1ed4e5aa3c6c6af20c3653b5ff338ff63aa5bd1d5445f3d10a251703a65c24b20a66793450dc4f5d1ca15abc32f63278c3028a45618f610204e857bcd3b9300d248fc67390d6b16eef25d5b01ac7923ba179de121b02b3a02a7ccc1846da085641cb34147d981b3d7debcf1c98580f2f3706ca6ca777caedb2092421df8e4d12a48cfec7921c6ee5ca04b46282e300cc0a1c005cd61ff86d7875d2d12b6ea2994bd5bfcf8e357b23294ebc279748e9db741013d32516f1b4dbbf62061c55a67ca8c09af75227024cff112f42782fad2ed8b27ee799f76f52447e43cb4bf90f2900ab7add106671525470e89b7953a64d2135ee226156ba3c4d4f50d65505bd8407f339db0fddda432f8ff7633ec7101f144c4d6a55ebdd1647878baea3ac76f8a337eb231122eb28faa28b158302d4e1a1921b160f2516a7575d2452476054b566317ce2d244a84053efe40d5242d7f7b1136bc038d5bc6d785b74daea1b89f06573d4d435861e20a6801f4cadda1428956d588448d6152be60eaa9f82e904b2a030af13d35c2f41154d894a01e6a8a86bcb9d94fda14d8e000200d9e730c73a5df40cf8bee0d9a798823fb99d88a86213d14c2072acf489aa010b8dcf62022438e1e80aeecd5894a984975453d992ab993edcc6683759b95029c60eb4b3346dfea42d5a0b743553c93ac274ec41355dc0f506ca67b54361409e9276a6af1aa575826626245177467aae05a5c6e91b9ea0456b417d217f1bba5cfd0e7768a53b662603ca8fa494e492b0197a7137988cda43656927d00132d4bf24985c62c8cfc387810b008aec84b0885b6516b50a4a78d5cfb89a19170c74dafd87ec13a9f8b287418744137914f91e38fa1d33f4a172ba663e59798da4771e195357b0b467d6fa008d20f85e818a1aa15b77903a8361fd545b180bc1103976fe48b54b2aa7918062ea53225a049feb2ec305378a3fd10bc6f167ef8dd7416768635c647278a9faa8328cb74c5305a7119afe6113fe6cf56fe5982607daa765db4a8b566a3296d8a70cf22e84744aa57097a43a6884c4f41e9119b6f35047f5e7baf2443f9c5d8b868f20ce593b3dc236214efdc3fa2216b4d6113de6687d532fc69963a01b6bcb1fa7ce01c485e675ba1a6b3e917a7250468c4deb31cafb938993f618f555d73f06468c0847120130121436507f88cc0b65e1e78c076fe1b3b62f6e0026c6954a00bf5bc1920f302a60eff32e66282b3e609b3b657821177e0ef0a563bbabd287503bc3e03867abac8e4824a28d4cd1db21a9eb6bc8305d402ebc717445c79a87e38c69562671b72b38f87d269a59f357f483469d64ffda0ecd4b7e60e3e00cb98b5207a84a6af5a544b40933c3196156281bca747326a8364245fc584ab532939559c694d008f979a82a0e4efc767606c958059cbdfae3066568857af4fa0615ba55910d366984bffbda7208fd1d43bc606ca49d00b5126b3fd4763d78f5d310d4f2035cf2dd533b489d32f88b9f521dbba449cb18b7d8a5db472b328f8c6d05b87411e5ed6741931e0a078257b752e96cb7e516e6cdb38da1263955446c38926254425e10eda9564424ea351c00206ae16ea4aa39e382b39b501b4ed60b5514ae347118a6625ac3d3a8f2994189c039099f8a94f4aaefab65c3e4a525669f83796d45eaeec4c92fd4c801d3c09befcc2601a6c54695526bf35f42bc02aa790878ba86d47b9dd3e294c499aedf1905e5c82be87df504bd1aca3c5e5489831010bd025f19eb3998d451fada7a24e0dc3109088f52d7e7b12dac12e6b8e758e668b03de8b9f698c1aa566e0cac7085412ced27b490f586d6153851a3b3c0a918f2770d2a4a7b062b8edc23d8289f99669701ef89a2405dd2cadc10a3cb004bb2b6477b71567d2875da378c4d6e350d6168c50fe4bee44fa4f470a3d6867d6f06f456d080ed11d7130b07e0c6d31cf1f4c496d4419e2789f1f38df66622723ec335876f857c8d7fec1ba3fff4df417f95370996b46532fadba7030d2d85a0aea55648ef52f2e5507432b0ec9b044272a20bedbeca1245a881152dbfaec391f552a3f5d1708553a5a697c2a040ce6186ce23d4f31537a900da219dd06d8e437283b21cdb1e8b380b356f68cc6cb5a71db16f31a8b28c45d52c20e970ae0bccd8f301709eb174b031e535bf6eb68ad65e1720a8ec169321c94db8ea14479f9825bfa4cbce7c762803694defc65205cdf791c4e7fb8445677efd21b4cdd3d6adddb8a03436cbb7becfb0076505ce54d12b1ce7c15ee2f5a37b6def7156c5f1c52057faa6ce020738683af291420102accc1b4f5787759e227f6e49526508a456e044ad02f138376567249f73a025bcd0fced45caf97365c3357f3967fad03c981fd988270b1e1d2eef7ce5cdc5b7e2a9c676a3e424194910f7c4d5edda9077dc3782c56f6c28316c2bd12793819841d47f616f11da6bcf1bcaf787b69b0944df49694b374adbe7aafd885264a0fd6591d5c39bb0d0a3c114f18c32e9b8c159cb22b2cf02dbe04d24f1ed2e55778310f8d69b36d8d3ea664a147a2d32aa2e9ed93c89e493f2562efdd504d5fde20a7b105fa2e6a62f7475e0f59f398247a01c6458d6c688c2fa69606747db84e0605d77d191278804b8ddd09326d5e6c32cbf97237d49982835a5c1370a8d5e709da063d65e79a68642fc8ea5f763fa522b3ba0a215c6c520bc67092cc6b5d0e657026259df38b08e3f12ec78597db084e5d4ccbc36a30d04a7a9d1d49d84c66051fc03668b11bc191ab6e83965d3aad96fff1a1cab60c082a7516eab2879ba625bb9d43e2462a3dc6422f81feb8f77f7e7368bec2bd6c4d2ea831191351aa69adf2698c57f1ec7646b76896e2d713b88a1f80960e7261bebc3f8cea7e7756a905623ebedb64b6f66caad0513d29c7b2fba583252d275aaf2277d154a74f7341b0a1a630dd50ce2029237cf7318ea7604de57a694e01c4217d52c1d6a0e9b19f4317a15a7ae1062a5656fce1518f12d7fab5454d0a03494f596b79106308681c51ef8c2179c71a9950f5f480e785091abad7579f3b56939a02b9ead4941e0f5559e7c5709f8aaf24675af84b171a2e49fa22fd588b761a13e007533dc415431e700ac090d57ed0a2aeae677f441b0f8e02a0d9a1bf8d6b2c59fa48080a5251e4577d78a444dfaac4b07a9b86cd3f0e867ab24816bb505d44ce1cc601e84f5fe0bedb53b984a5f3500536c7c4dbb0bb564a912f512a337126d0cb1fde46e84fbd81520082e1c4826a5cde8750fcf8f37f93dc7837d542744c9b5e661e88360aee0a1020d5be7a8209362ba61e6d4c7a9817fb9a2bc9dc49655310e674b6482f2754d7573b5fd6f2f30608f487aa189c654d04d2636f376f81429896af147afed3f6149bdea363c79db0369d43243f2a57f9177d5b1decef33ac914b365c29256931e499c9f0d864ebb5eceb6b144bdd854bf30753e246a7cb336ccdf83c429abf0a409fc333c1f92a3b8a95b7393abb61acc152f71ead427f90643df8998db83b2c9f280b120d2eaedca8a56ed394ab6c57343ca348604aa9b9b53720e423b2578a100399295235780b817a4c133a7431343a82796d8c3c05e07ee78f6b61051e5970bfe6ae44d53795669a3fac06dc5130386d0a96c2492fde52d072a7b8b2668a1182a32833ade80b4b8ca7202f148ce5a40ea87e28d8a9675b11ec8e5087c0198b49c4455cd92ac3a1e7a457047f247b293775293c63eafad527249221a13c14841d14981dbccd574699247634f464ba58d13f14aadd177aa979ae846c76f214b97eac6506ca0fbe8690ae81d9ba7b109614dcc1580e41670c3e141ca8b7cf5687755af94be8acc791cc3a66a654c371918134acde18d3578851adbae5ce4f0a23b644bf995bd104fff1ac507a27b07fc9a7943cf09f82678aa52a3e6a3d6f0cea46ed3d0a9eb5e184bda5628fba4109727a3d28afe9d810dcc79e7048187405288d04eb79152d9d481107d0a618612ab042f4d2659adfd12766d5a66f04908b9211404a0f17f739a82adb7a18eff9861e5908588760e376cf184bb963dbaab7caed503118da2da8ab7b5ed53c8caa952139f5a059130048805804ec5f5dcd082a441dc0dc9b4602c465bf5358247c694c8cf31952dc6e0fe2f5c7ad7b0ddaa10bd7789788530ad656548e26d436295a0d91931fa0ef45da7fac5b86162d2de8a985dec2858bd47f4e1f6548fb43537aeaddd15e46f4e92a105547c018963eaa249d289f678a8809da09604a538d7461c58c4afcc9cfb9e4e3fb9b8ec4c0a6e29cb0b18f784071cfaafa1b097d71f368f7d9a6e854d778e26b8daa12627d5c7d92049cc7e105dfda31ca2f5bd4cc88e235709032638f448fc4d2b390f35570184e5150196bbd59ff9e8d49468ea5346ce1e1a38f177f9058813e9328da39f2c8abe73a01e20fde7d6938b70a36a5a05fa1aa0174209ea0a18045a57e2cd0d8733812272048fa29086fe85ec26536dd11b5d7f7819ca11b4143649c7ba89ba2e9d05034ca6c4bf5286e8e86d036c6e2b8d01036faf17c3512ae092d4bdf723b7f8f749b6b7413c6aa1c45e7d0d942c2da4c382a8eed145decc1318d1e9362ae979337930e9e9c0ae4425c887ae67e35e7f695d0d27883508efa719eb705af17424948a4067ca68c329bc2280613a3b27d3c5fcdc5cf3dbf5820c0976248fbf6be64c80be8c3b8583a37d6904d39992e08aa2dd45eec9ed00b2c6481c44f4a0e402941b46ac8b9c45e78fe56956c6b203df7cb3de45b59de49f1e8d9313c234ef274d8984674889a386eaa4151bdb2131224d38f81d354fd3c8f9b2d6b7a31e7d3251e5682015fb43858024b1166b7fbb7edff57489c9bf4b59f0ea2692b98579e9769fd678a35172ed98d2024b07f4e8cf4b08804810c07bd56d848a1ac180544a21b0489abab9543a88e1132a9b3c4e8047a23a1c4708f354c7f932a694aafb0264cda749cdc379201e652c2c5dbb9107f227cf44c709afb44417cc87100547d623d23b9120a52591b23e44e6868e89a97ac21a0f4b27a531003a26d6de57d790d624e7495edac913af3f93850983c45a8e8db9d43412539d0c6426268724961a95e56ac01838f3da36f6459823d387c8e29f60d4ed040c6b3844168d177c207bd1f0044d173e732e7172307a4f8cf8ddb6e906ad29212147ebb5739852b97128e5bc32e42ffd16c33359fa03ff42148cddd5b69781dac910517a397de05fab7f52e9034cb73d112a9dcbddff8e65f1f8405210e6a184fa3db4d44b87975a45cdc944ef0d5c2f79714151b25b4d3e199686f925e9b0cf529b89ecaf014755935a377ce021ece521f78cca68a5193f3b95fa81f48f440d0dec37c31f59548637d9a79f92950729c47e386ec9af12e699454d733ad453a21e4547042b18998ca662e4a271aa7e6f093154cd1ffb204ac0a599d77188a72ffcebc5947083f62d86e13e9ea223ad77fcad97ce809a19160bd6eed3a21a8dab9f9f13b0abc316bd3235990baaea94452e37d8406fd4b34cabb020f43e6448f3f663aa73e96548643d8865773235aac4b82654ca88adc06b2bb8941c2a3e2250345dbdb141d58d310d335f5f820624bacd0d05fb13f1c1a125f788c23e09a0cd0a5165dd47598371ef2115af9b6d75edb644f233213348e3e6f80ed38590672a25a89ec111aaacc8a1151deb4e9fe28d33a32095dda42c00ac65617bdabf0cfeead7dab328e5e40222001b5d27d8c41b46b2f9096b301c2eb56bcd9b1148822b9156c8072cea8536e86a643ac7d263026c2844afa47b4c16fc228406df729b001a905e9cff22df19fbf4d2aecd6d0dca9d8627e8df88e47eb54685ae3d957486fe6c2cd70ad5e7e975c23a871e88f613d3828007875308d5534a0801b15171540276134a1b0c40192567e268480ed35488832a1ba6c0599e4e859e9e51a977d84e284c0aea57b7d23f2a643d39b04ddea63d4411e2efa4fa14ef2bf75c68504e34935fa77c3a27dd032c8d14d6c5ff9eff246636a457f8a90b9722cf77ce5049ff234ec7d265b37651c061f3f1b0d4c2eefe594f824a4b22414fec830163470b951b1d96e394149ef67e57c4356fbb630f576f9ad280943deaa6253afc17c299006da5cdec371bf0bbc2958d106f51c9936acd63d1f67b51c912d4972e160b2c83cedfdd2a98c70aa5fe769873bb80b8b6ec0ac66aee0a511d153e4da2f5042d82f1ab03bd229d06109f2865d09daf540c8ec6d3308d706aaa02718b4847073c9c71f44819ead690bcd214190c62507ce7957e4d660fe462231864a6dbbab0cdac3c83549726b78e7e95050cc20e5089f08cef76181cd06ef3d62577873158e0d41d35316447c9e7f9a91bee804811452ff004e84b5ed3051f0248bc8a080582eea2543beb96fbff3402415987c42e06e2108453cd4910ae53df153fe60ad595e919134b6fa88b3c60b85f1a716043db524ac35343c8169c0833e09a6b2b7ffb427402703679e7246b3d92c8dd5d1724b9bd4ecf92ba8ae8a608f8b767280b27956a0a49f2786928d1edfc7e9ff390c3a2b36ff94a6b2490376e09dd5ac1d4b265174aa73b66e593b898d4ecb7f55ba03aad67cddaedc34330c4cf663979d6c7ea4713d120018d1393602de3e7ee7edfab31a63f583f492ad092bd628c06f0fe653bf5041bc3f14c4a9da076ee6f29d602b4ed24c330a63caa027ab04e9875b3b1f4b1bb8a456ec6504e7fbcb169c75a17051c21f02f030fdc0259a91cce06109c1ccc6f3fcd0cb699f6c87981cbed598c58ddd044d7fa0ddd2f6f8a8c19f9527413b996751f6e4f031d47ed28ad99170b8eebee03a306ff22457a49ca239f37763068d91d399e88e4a2e15b02d082130685ddee2d4d69e8004fbcb0ef3af841b04855f43f54b9dcc07e502422b98c46a117d124be78055d6635ce79d7b341c16c60cefec2142c58fb6f80ce09936cfc65794fa61d3b246e0c309f1d7e439f3a40228607121566ca08d37fa2946c02bb252de4110b9d7984e55f1d288aa70462b5d6547a04364e97ea87ae36c006d50b9c7235d5622a7c102af345d1e597baa597341f86e3e65b0345d8207128d826fd2b32ad1d7024ca232cbd9539b8d8db4033dd9877630ea0dc4115290af78bb1065d3a2ba0ca0606889ec970586c6778c7cc506ce2c65f2358863d4d86139e5f451ffd1f385077e801e865396006b817b0f6ed9cf3c5d59cc165431db143e106c1192e8bf936223d347cb4357e301a6e6113d653cf200608c68026a6b371e6f9fe037e5c502185d016049688030022145e4b425e639c095518d07f5d0dd74da5d6154bb1fddcc0bd2024606474a67f70a391e5a37aa2a59fb711b560870d1c9117145258b0b2ae9e29ba232672e95a4a4a8b27765ea453d3f820925cbe532dc098d8995cd39e122fa76dae182269bcbb25dd8e24b1ecd7af33937953e4f34c3b2c3696a55ed0c0838571cf487eeb42a4bae3e5b27bf1b4cc89d62062417e15d4c8b50941c044d43a456cfe9417aad4fade9573a5fd432d4668703b24883e9f3c2ebe8d7636e8329ca10ebc91df57756378cc64097fab75050a9e9f73fb083f7005b69d329b7b3e8ee1c3f48cc54a3109b074a96c16d18fd58ce1e7f9d365bc46b5eb1a7942fb5b8df442ab7666e81c0b16a7fb09b8ba0dfdbcb5d8e533d8308cb206d83701c6128c9b1c5c62ea59c3491693b67555eebb826bbc0295c3e8e5f130cc348bc21433b5b74e46d34da912524520bdfd7724036bced1b8322cbb7faa833e73a28e8a701f60e5ca5c41bf3738ed89ead393063d6664d3dea3b75d60b51dca39615161d2faa9fbc455c38ae373cf6afc7fea12e502fe13120795c256beb8004cf644f80831ea0be0d55016c252aaa1a2cc7c2a712cbaa80da5586867fb3bd0eae76754ab03c455c6d798fadf9120db4953db30438c5e0dea4f03f1d0d5704fd8c655f29d1b2632e4e2147ca413f47775c52ea142cfd4beb990d063eaa18d2be9aa9296580e1b6a214c7a9f868356a4bbaf6f062da082b04745f3fb64ecf930647877215c7a5a4b9055d57eb4208fb96841ee2e09e5e3ba483a4e0e77f8667250d00090fd74cbcb00ba43370e11026f7459593e439739a9fc7359bc4ff719cc7a864d7dda93e7009af7c3e26d09b033aa40477c950a8eb2882f388de12084a4e77613e80ef282d89481da15b43211443742f4cda038ddc28298709ee90505ef3e68e31669b54f6293c53fdedae3732837a980b4484206f6a4172b7323c538c1a0f734abd8186a003c4e5f8a47defba96f7615ca0812c676a5777bec99e249956f860826690c39265b4740f45ce8dba98b983f2291a3c9eceba5cd218fb11193d55f6ab3ea7c6173852fe6eaa9f27b6ec5412876732cfa531646fe19014ef5acce33fb7a336557acf2129acfb43c5b715e5e615a3a8402dd08b04a9d727389f4259fea59a4aec3024a3bf04d133e1df94c836e66102c80337aa7a90981877eb936391b264d770d730e9583166289ce36a6cd5eceb87c76561a2b96702dfa7915b92e0034ce30bab8ea52702b82e6fff86b9ecc1052cf5c41f29ffe348923a3bb0fff2abaca1e997b177da8ff87324342d87ee31a87e70d7dc531b0784ef74099aff1b3998b4c2186a1d783b39d0703ba20b0076ef0091fc087f50ebd1eca6f94a3ffce876ef7508bde21312c3afd0259a82291a6e10fd1eca550aa4159529337c09b5e4abf15eb32f962b87a245fd3e26335b18a15969af4c263d16af7c3305108445a408d0e3eda8806e9f141e49c364b2783db677ebc2b50c9325c2ffe6763033ec9a4435929105c645e09f3367744d90fa1e38a9787346dc1311fbbcb061598e935b3da5cc164d7443067549c5af4d6e76d014775c011510f0055b13ff2e22addc26ace0c9209852d0af4047ec8ccf64720dc2c5c5404d9ffb388fa8ee3b879c870d33ffc440f5d067a1416a4cfc009bac76a7b1a165d4745871640ade788dc79166a1ad496e8d961c3f581c77282d56532ed6924082675291c1c613ee5f6df9694cfe5c3bca477eeb3edd9285b34f8a7c014664d13b80169904119d10c33065c3af64d4760740e2a47212b8c351991aa812122e5ad7007ca8d39c094a80b1232eb9b851204f792a79c9a5e19ebc35cdd3b488bf2240f09d254137af83f6ea23e937effc663b4ff368705217b6ce54ede3d0f46a955549ef03007f05a032e3582ae4f2e49c90224821d8024c397a2dd940a50786e982810205680021c1654f294860a252425e87d8bed810c731ae8794f151418118685782098c21b3cd3634aa9b8712e27dae49b6ab8886301885126dd7ce8a2b40373193b835c1020deb4300da592336aa94918f0c2997e57b147db655d2fd0d8291947a5e1c4bc221d662a80a4841aedd1229da51fdad533ae4aeaeec7681cc67f4df85b20e8812813df7a3ad42783c721dcab8a53079820468ddd553a46ec8bb204cbb5e9fbf5273c4cb03c8e398f5767f87d13c61e0edb7e8f95c9740633ba58937a1eeb9028d8db462015ac530217405695998a84b33b29776dc7515fe897e240dcdf1b593ad582d00718abdd33c74cb2429b3eec4b99250a45ff9704e40a71c9e8a28b534c82726ac361f4029166c3c918323736cfe541b068361ce351cb497221892444e40ddf23a7a72a2ea058cabd967e14372063e19c0a2130974b6b403bebac61dac2309fb135c18d98b3c1d302a1b82375d784b83fb13406cb04ffb5a9a39dd602de0564fef30e4ecc957aecdb80013d6dffa1cbe64e4871baafb96c7fc5df4af4954918be099fdd42dfa689fb61a1d8f0fba0115bdceddb487e3c7667014c79230823b95ca45212bae70b934668e60001142818e63801f56a4d9a527ff7e9d57c0f13788b45fe7a0c4d85c0b29fd0f4444487a2d886f213d986fc4605ddfd26caf5651193aa51c51aa171e09d137faa5647f7b8100b8085a31b98521fb34ab89e260cc61d7c169a5b5d809ce77bad2342aecdae6bfc3edf289fae40e75c53063a8f614272a6ba02cbbbc01f547abfc8d15473825b4cf81ac835af482177d5154911ca3f884dab9093379cd802df5341d1dc8a9462d55cf1de6a3e9e1ecf51035d6843f6bec1183aecd4273a8e197aabb69a64d8cf78b82fee7a0314ffc2b0e0da4bee99bb216c17d8342c8d97b17641c11a0fe90e0a54f0f02dec92def6d7100f4fed5499104b35971318b2d08b0ead45c2c01e480a54ecdc3384d6da1577072418b85bfa82c17797585ab4ab43444b158866d16881d2e87d1b05305302099972816f41c60487c837ce1a4f20703705049a71084e599707044119b7fa420800b535fa12eb278ec10a22dcb93e010fa8f8d973013c0163d9bb1cea9bba2991310a6378289018f18118e103f2ff31a3e76a7cbf347c50450910002c310dc3fcdb4c7654061987b41dfda858491acfab64861e3301e95fc159d9e0dd694d98b33b8247ee567e0785a64988c5900a5e8675d965f07e00796011e42997ca4c4b69227ca6a5c0ad730eb469aa87544c9d88f1f347943a7e4ee4a24c5b8932b3255f4413964ea37b2c87c8144855d44ab5db3ce71f51705e2e4d85724f780f8822fbf4bc3a3e4700aeb80d5062b36513c119dca646c4f0453b96df127e7be203e56251e304c86f6f272ccdb185dbd912ca031d3f76710977f4a2bcbdada6018c120b38b80005143174e02dc9df80e8d1d7c31230332a3882f10d583b317f00418d9dd787f34e68ff6a5fcd2bed1810366c2af4d84ddac57b8a33583080acfe8cb474b7ba201287c395eb06a311d8c367aedcaecb9870bfb7a172cdb037cd5daef2b4bcb9ed89b9437d64d08280041b7e41c34959ef22f5a9591c086c3b8e07a50a8a6aa218124492c897e361e1ccf6d340491c4933f8fc10e4c8994da5875a9c4b6711fd634d933fc3f4109ac5c5fef4b4689b319ecdb3162087e4868af91d1163b316ea50fe8f746647f781636cd11ba36cf8ac202a86c74e8cdad1ebe60836012382255cd290b8cb5f0719d3834c26e47469e235b919a031ce81935b0ae551d21dd6c45b755be86651d590861a43070f3d6a414f0d2ed7223c704eedc0c8cf36b8abfbffa930a3ea70e3ac82c3f91a3096b1cb41e634eb96dae0913b38c6cd8289db68854b79350412ad26002427165aa190900aded563a55cf6a657bfe2d4f0ba3989d7494fc17dcb2926e01400fbf539a0573b122f1f3af2f686f199bb83329c0cdf6029cb9c48d7cb0d5eeb15bdf08089e730288aaeb469985ea395cc06992486894e944635e7001f1833ee01d9312eed3d79d86da7597e6b82c97fd4ba6a87f85ccbf130097842479802839e268f89c1167fd51907e37b3f5a0dc7da6d2cf08065a68d75ed23b4c18d39edb222cd19912c8c181e501ce52fd439043ef428e13875cc1b2d5a5295601e57e1463b9147d8490d1670a22598f001825624eee2809da0b5e02fcdffe127e06e003a8bb089dea9cf0e0fa7c7c31b6fbc0f0fe9d49d68d868146cad910c1e9dfbdefef9aeb9878a62acb0e494e80dacf939b1e7193b042bb7d92c63f61f06e03728ad02517a1b0e37900939d8a1fdfcb553162175e52d4981812d67567f2e1952418953fc217b0f4541bd904b4c2447285aa26df9dd7ed09cfe498f85f8c2b570a560ec69a1c6d1905a4554bb7c70dbf984e34c580608266a9542ca5d73ce70eced3124b29a3ce52ab432568258dfdee926aca5fe94b5ef0c36e21aa9fa842adb5036b3db22ce2a2ababf1294da0bd3d164e325d7f3f21ab01e2be3200e465599aee8733108edd70a00a4c97a3af50280acc8c596d1dac25b70a7ec174147400ef303e5ac3f1e51bbbec467ff7a46daec1d9a8874074013f4b4159032647007ffb8900f92ed7a88c6cb87e1b358cbda798505e9820236b991edb7a1577c1fb93d7536e059a06e534b25a821b285396df34b73b73a47bca2609ddfbaec4da0ffbc81be59c38b0eae29dc699871ba19257123e6d409df3a93ebe487277feb0e362f232754431038b85cafaac8a36fcce05f0e0f3f44642682f85f27b2d1d4e8372266e6f7f7e746129f96d1085b922e68b93376aa1a8b3f3900f3fe70ae276175efa53f36fe8f20ee1ff183541139c0bccdc9ed5d6bf8b704457227b5388f65381df3581fbf1e8de9bd6b48cbbce3d332a2c45b8253fc7c3cc1c620f4675d24faae42d0e54a166df6d44a3b437da0f0b5c1533865b83dc1a92d7c181cafcd4f8f9fc5ab36da18f81124fb506576e29dc5ff317dcb57824496d3df9f70c2703fac289564e0425cbb1d8e4a69714da912ba5a1167ee13c5c597b0fa6587b47ab93297f8dbd34c11d9248a2e5e82fc9244e26899c2d9781f99f63edc7d4837ad0a2b07a2bc00251b6d73434896a7d282f89958bc0622e3f9ed10dc6fd209a6a9188ec8bab674f3c7ebb066df7323fc5c73ff9537abb08391e7560285c691d30a81f734ed32d034d3a64f8c385dd6043a5d709385c6d116c91f9a683b0f6128af9d0af482cae83f11d8de017a9408af6b9bdfe40895673feda7e15974b8b1f11c1f5bb3c60b6d085440bed380e36ec298ba396986ea6b5c34b8c7b68fc90ec54d2bd9e311296ccfd53edf1b57ad4272e44ae19a55485a3ce05a2c1ff7529382ba3261b1e5b2bb990640264dcefacb15870883b0bfa2e636cec0223080fece002e14df7a8b2c1ae448918bc691e383bbffdf4dc9ba2138019f27c2be0afbe339aaa0c1f84ce1289056f5eead9975398f23cd11fa763dad0f44f1d24361a28d03d7cc16e23855e94d7dafe46006481372a650ac139ce046864e7e1a19a9c52e58e37a343673c40697a6f4035ffdae03f54ae00a0d942e83edb891543a7fa8adda5fff4d54a54ccf02526174db511169911ad2172ea41922e429bd2804ac93b90d0b517abe110ac12f21ca409755be746312f4a9c9b81201519a29107a433c0229ac35b7fcb390ae49586165480b48a0157ac8ef4598381dc1aaf5e393021a070723f24db214bb53a0570d83dbe91226d672977c31f064b971781dd7f106db7013e2767237a27154ea537b41966e31cb046b8ccb787632b47318ec4408f5e30a32f3aeebb215ee72d210714db807bc40d2cbc236c800d99ad0370dd40c8dcf5018b5f81e93e001aafdc816cbf15a9f8ccf2a4caba2e9aaa80d4268d3a2fc218fa22f13544b8f2a37243aa9536d3102ad3a7a9acfa39539919d5d3fc32893b6e01aca940bba98a4e7e12718f6c755d73bec071bdfe8e7232c1eb625b85c17bad47a736d50ed3efa1e0c9ed16f1bd26cf9553d65cede6e640547866ac5a46a3eaab499097e3e91f2ea6692951076b175db849c0dcce3508bf31b79f9dcead1de0b1d49f939770820e7775f4e08860cf801060f483bc2573a006074bfe9b25a9cd4f0991e10cb032754a8b60978007c13a9210bca03f9748c85051581f299d34fd1d303e396065fdb539083be7c798924285a68a5e0c33510848db4272b39898ac49190cc60a732dcb68629627d424813648826c999c550149843af62487211d5036b9f145a79edbc1f06bb9e05ebc664f4a4f476124e830b6fb19b67e2818a7e76d792bb8f99a397f1aae58c49c1345681ac4eb683ef703bb3dde85c0608be3ec9cb59409628fe2da025e03d6313ef5d97e5eeaac99fe9ab4344a9b6e0158a0a59e9c607a54b84b8e91a5fbe4003f89da405bac357193a97d349fcd9110928604c742d283019e18aaefdf435619f8018bae112ae9e09b196a711908b75f6adcf0c65b27793da6ac17aa0588fcc435007546841b08dc1fd04fcc8c3513e3a8e95c2a091859d8aa16c92852ece7f62fa315c35366106a9ea5beefc8402b762e2f17c0d64866799ccd3280d931ecd097505b0d87959787722d65f86606b497273fce0d486c3f0115d84648b960eae52d51038f039202661093dc0e0eebce65fbdac8c8d3a203e366a808bf79736e148fc06983e2756f30aa302dadd8cfd7f82177262c2d6555279f8ad6dc95df0be7bf9126b6bda2530aae0b8fcfb96555f10442d3fb166ef50fb44f80f15abbcad582efd0b466d725181507ea2656fc3b1a7cb311adcce9c5814647b2bb5112ee969b13a222b0b2c1a37319e01244d3b6c3146b1a901cdeb0954d1d07563f94c503091deb5130ac0c274d99422a13eecffe738d6ea982aaa5b56f40af822cf978a1f75b4ecaba97d00f882cd2047b1bea7fe9a96661a2696b502691a587d12b07dd8674043fd21e26af7cb42ff304d213a32de0b68c24e5444bc8c30902656f172a70d564da0717ba1fce59008c4f5c425907e8a7c5e30aff583966769cb9c7703f09f8228f6bfaa975e329334f8f6e8cb4a65b28267ecfe1ffd4e3057a5acd8cc1b4853c2123b81f6c473b802842338729aca96693bd31d4b3d2281fe69992ca89a5f87973803359016bc8cf5994c02d1a467728527336ce7da7686cf679fbdbd1f9678bd4cf23b44b88ad0ad7d564a2e89b50c0244cf6fe909fa311aceb5d1255572119818a0e1d00d895a3305d7d081b6c842a25f1d38d62e18cb0f77a1cca6c6768217c12e9e0322ac31784a10ef8b16215bffd6b66040c4b27c8408ed853d5bf17fd8a2340f0a9a62b9b4ad917c85478dc9f542dc511a900537fa4ddec34b6242ecc4f46880c5dd9f918fb4aa371e392687bfc94cbbc732915f865317e522574de45f0154bb12b7ee8b0364a2016a00dfc8bda2a501e1b63f904b4a0069cbf29a34a613fea782e3897f24909de41d2435e2247796726016bd5c41c37b0e05cb05e7593f05a5bdc5aad071be3caa62c8074bf917189711f1f5ebd8c70ee23d3a5dac68ab2b42347de35a04e0f8013e19245594d2a6b2ab0caa35646bcc389ebd925c282323670de26c35a93e3f0c11817ab06e10a3d541ecbb1a4269ba39493a4698c86343f9c41a353d3b098b93c6cf011e2b61b8c10d62847e86556cb527813c6e1065b2cc231c77e5e89c18d93588149cd578cc5783809ba6bc7705e93cbaf1e8525c83c8a4842a72e437e66883389f7fe437f67987cfa08e6abbb98902610f7f06c45414fff4ecae5683e7342c57c637723f40c6a567dc30b192fd412318b815ea56493f3c7cca00620723ffb9208dce861426fb2db74d64e2a30276e4daffa80aef16577424129c187a85349f02b6f5ff112f25f9aa08e3db4929111d868e5bb8794ad27c71074a37f76333417f6c6db3a0f2888e088ef6f3df00b62d8020ed310b0a8c8ab96d9536f325bc7da838ac02f901dc4bf12f99823c0af292bb7635a0cba5e86a8280e526df1c145ddb5554d61d4e6221fe1f583a81234e0da93d976ecc0d72da360d3a5db9cbe46a4e49a6259091beab84ff2db8bb1d8b3aa11770277c19fedf2f1cbb8d7b6e4e45b38bf154bf2ce8ec6b7ee54a1114f58f56eae278e646d8c48d358c0f4e6893faada8cf82769e50f4632dc5096ef2709d0680c4c65ab743486516251c7c3c6e4d6ed1824e4b707cfa66cabef6a607bcf53ea87e9b10cfa1338254f719aae4ff67a1d0cb6788f6cc599b711d37e718fab41685b8312e98c2dc3fabf74a72d7dcdf4fab7a2f165b0088080be83b770eebaea48e2ce8688aa27988e011c13ea473f53e3219bfbc367a2eeb488ef2c2a18f5047c8fa1d19cad331a8973c087aaee676a0db010c4a797bbd28a5934279b954b3cc4537136138f93e7f28958b31f8611c92e7c92c04281e280c9b898224fb435a810d84ecc99036a036713bc42f97c18b9e85488ce42b090e32b61f7b65cd47b22fd6377d21edcb121e9880950c50741f25cf82681c4d6e31c8d54d7ad0285f88c1c233b4714e2ebba5d04ba78cc4cce5078df80a1ea5d265aa5ec3252556a23eb2a37209a0e5d5993266b46a8fec8420ce0854f5d1e4c71eddcdab17ae3b448830bee342f279f98c41812d8441335c9491f09e4eeaa00540e2e55beb5e1d2ea590f18f4a8d41f31934f246913e96151beb599b7c4f1e1f2e5cc90f3c9eff476e75cf0d378ebd371e40bb63fa5109c60fd90b1e605991efe3a15216e3023a9550437c009608fdde2c0005d70b886062115a9f1c0d886795f987cfb5a3f3b6d8edb7ba72aa1089995cc7678619cf67ce06f0e40ca55ceb896b13ae69a1e9f39dfd60e526164193c15b40705a662a36316e7e73c46cadfb1059475bb00778742651f4a0e7660f0eeafe5cf0103f93f45ebc5ffe30893526104651306489df9a7fea563a5c7ad86e979e09a8ce9c841e886262fc14d711b2cb9bf836e8a1a83bcf23dbbc7f96f97954759ee4898fa59f5b839e5db6b8a10075fe8f1e8f2ab26974aa0d5253a3df21695589e20983d92f5d80a263510e16c83140ab733e44c356235e32143512dec0e8eba0992e275dc4de60754e318b5a9a7b4f60a7f8adbaead2a500a5a7499b3b979d84fc32acf27a007e9eb89c407540cc3d01b71f79e0d9f12094c211febb89815878e682e12c212437acc05ad0baff8d5ac35e8dfa829898e8beeb071b0c0bfdaefe4bafe1bacb5fa282593e5c73e9836c4db0880839991b00222589252ce942ae8048e4abea3935696a21179795f00799dce098a513f824c125990428b2e08cc261d69cd36a52655c87b531b35dabff8be8d253924536d6beb98c69e630ea78187b0821a88b2d90c8d8e552c5fcfc97c83a0afa62a4a98f8e4738fbd343fab4580c91ab85897c03da4754532874f88bd5911410aecab4a59bc24908cdb029f85509e8aaaf1e05d38fb73f75ea1b94f212ea3ce8bab6ac2ad35be1d11dbb78d6252485b0fc3764bca78738b02cc791c13b4ec038d489db4b881f078db9767aa33faa1a262f002071640fa5e4f307ef6240284348fa1b1fdb09a3ab5e08ed21f46cdf985eed92d82a4d02a17c0712f8799552dd3acd0b6e6a4f8569d306fb1c5fad404b5be5d577851d9ac60b70a4383cf7e182c710d3b09ff150e22fe379402ea7db3333d1bf236ddf625e4c23e870961dd642c758ce54899581af4e39e269ff481c10aca82175aa6d2c368ba1fcfc2b27d9c9fb4a30a1a2de16a178db90f2297ed9116dbb529e9a75a5008f09e66cee2dbee323879fd78949f2aa0dda0a87dc18bb0d122956da2979035daa362cb8f5c2b3dbf4f35a5a4e25c367d7cf59027b58e6ad2087c6975890c0374e05a928129c2b0a46a002b1414b42a3363ae82a4f772a098341ae1d3ccb2ce5998294e69e8e45d4889da5a13d2920f56a5378112f674f3cd448a42b96810ec898e71d55c13f84bcd1a5a48092edf22046e20000c7d3c1b6a33859662483796b87499a5e38132a43d5f183f21c893a3e16e4033d8ccd6344573f2d8fe71638989fb67233a6980fb8f2d1eed211dffd9b9a6d2e76783659b79b80adeda3646164e82d4b7de0a8c138a31c932076a8c7da7a8daa9a0a5f6cc787f5fe08045d61072cbfb8a8662c9529830eb623735d5cf2098a950c4d4706eabe7053ae03a574157ef15caf7d5b1841135576a12e4da0015e22802f3a102ada8f69051f22326b2283fb61fbf24c71441610dce018eaf861e7398621f55a5ee03719a1ea56cb39a69f4482e0faaae51fe577b08c8bc1b50393d13a47130548e2bc74a46833e339f4450990e4735bc0c3734870e182f9b14fb5ca64e340e423d648cc828c541e4e18567eb5ff6084797add97929871ff06caca2333214860e98445b946fd5910e179a07d2b4f13140c287df1d064f1fcd4a58b333152886a8fdd2063c057cccc310b5881c52be58107aa02a32e1441d67ceaf617d7eaac322bd2e8b1d763417e5d7f92243121eaf753f9ebb682f41abdcce530c64855bfb1eeec7de51d84898d2908647cc4359574268ad600e87792f41874e9827dc90cf8dcbb8f8884e37d8658269d1c4c65db74e9f0fa4573f78cd5cd0d9bab3eb4e5ceb6a3350a4ce33b45af8410ca02050e2dee930b4cf341b497b3aaf9f76d4ccbbc70a0d8ede70a81f13d8720d24dffd8e687cc088647256e9790f5424b34321579c18eb5d211b6eefe90dc4df1877f71f1ce88d1669a6e210d4c9be60d1b911c5f54f47088a55017372abb6dce80cfc42ad63927d93c3bb8d5dd46fa6b8829685f03156cc89bde2f96e42511d7a5a937038802c31763fdaa4e11a0d4661423398b7e77b9c127c615a5e027b62e5ef54a48bd3e82d5dc099f40b3fab8404e2875375f05c604e4a489f31b0de829ee3023c1ceb7cd907d066cb505d1d4fed358e59e4c8d966657f28660c9e2739c6197424dd0cd637db2d5d54eda2d629ec2bcb6d945eb4373ec6661f4e7750e1efb99dbbafcb5ddd8b325c7caa8ebd4752364d1a3e296073c921b876c749a0ca6dd4d8b6ff482a6356a78a58654bee4865a8dca2431cc2c2a6e300508cc43953eb3fd800c7187014009e6f68c77d59812e9b827523e06df7080d89b130f28f8c7dc7801b84b803259e5b384abe7419b688da913cdd93041129c18e844b7752c519528cac13ee30bed5fe6c3b2aed0b21f2e24233e5eab1c7069a63bfd70db91676257b5bcb61ea46aa7e014926b4dded7816643750c48b21895bc92020bfcbd082a9041bf20a3d75730563fa84cfdfbf044bc2e101c4d0ce4e1b389770c384f24320ad4c94924081b1644d0929c8a2a2a9d9c840f5063d882cfec7fec3a80e3174470fbd45e59dee0dec0462c9e73be4f37b00a85e0a4c1745943ed69815a5980d4745db895365f063f92c166576391f91c7c31bad8af9764c2d633cf87b2fd166c8f264ec750c2af810894199c31a96a20e9ebbe159336795caf92a4341d17acb1c0c9f145ccfce0ccd4af05e073bab95b779c3b1203b48715a88c18048ca99cc90c9dc188e2835e6381c3f877a016066885b438c8fed7d76723c444eccc0190484e3df6a4162b29692923634fbdc14558fa3dc803f85906f2d4fbb2563d43e18029a6499c2907eae50bad9fef7237f589742377c4858019a425e280a2aba0622ba0fa31c7dd8fa667b0ecccd0da0665f3c2850d5e8fce05abce66413eebdf953dee519130c409a81d9c5e5eacee94debf64b4fc3a2c2ba40b3a9199826380900f9fd42417a95cf3cde33ee005e8b7226e00b9f0fcd79e9c262eef38003d09a6988c9038e360bcdf16a1c9964d464a047fb7b744b2544a4ff5e7ffcba8efea5b99a2a696cf36053ca8436756309e748b9525d8f3ecc3c908c8d1ba31dbf066961eb46dcae95c132fb054c9567ea1244ef26b9be4241cedc0db24fadb96b603132a8bd780c535e9521e9ca637c6a6816d9bcabc98b6f94a642d62d5a30b2292ad1e0b4f0020d3899600010381f202797100f861045350e7e0a0e5718b4a0c498df2841f48a19d2c4cdfc06b8eb2497f3176e4301548fb3a9269fdda30df143d7441545fc3e26670504a417a183e89ecd500abdfc26a9d5f6583074b5b264d41426fcdafb0972cda46e9f80f67992920126add91b7431e65c58d4ac81e729c8b03bc8babf5138f61b1d476e0662b85732dfee3c56673c54df250a02caafb0eca875f090f85ed7a3d32cf462fe57d484583fa0dbf4c1ecb53d60b3a2e6832a6c2a9f46be32cc9f8b339d9058aae7354924413ecf9f51ea3a987c55d0c30971cab3e23dc4a3d96c07225f501d784647c2909805234fe9d455e91abeee455b0090c6a6321712460233708fa6ba311dbaf4386eec8600cf1a26ef715dc037bee4ff65b231823f8c8e61eddc3a3e6b0161f34be4b7c49fecdb3101b5818c084c8203269fb2600ba41e0154c533cf330453ecc3d10845c04b6a1d5d1539b905f34112b5b5a08faf29a1bf610932dd6b7591a059de8d135e1e06ff683f565be9ef6c7a9b2b287d62bb898f4a21832453b9e7c00a40d2995f0fec9d143b83258ee944db1aefbe02e018acd9a139d42328448bd8e12a4cd82db0aeccda7dfa654f0cf3aa6fd505413e754fb2a3ec7fef7a04ec5a334024c207adb04ec79d404664c679e10fad8984e5a9961eb30e754055ee7dba4b105305d3d82720837078bc1f05eb8ae3119a71f25aa2d600c7340e186b09b9efb1a1e5581565c1a732d49c4b3965e3abc5728ffb4d791c7f9e27141b657409f1da3500ccf423763d305a712422fc92bbfe4e920023ac9b213f51713d201dea3ba620847d8f3ab3110f8c5f011f726cbf30b1755bcfd875e2e56223f21ac51a943507ac3683b0f9fd79dc67cc2d6cb23a25da2a57c8ae7a4e765963ab6dff89c241da0a4b3825ca08b0516c84475727c264da45d2fbdd45146777d2d4ab909bc753d45f63f76b6170ffe3e8e91450af043691a82fda7b42b3104707c6f1bb50bbce6c2e62e34108062d416422014d46ee4ffc0671968584fc9b76863a507d5222f124259e87fd2b49e8493e98989fa58e17bf25a82b2c81b583c27cefa8b8c275e87efa0c718cf2824a0bc768ea57db43290724682ef23b396ad78d4f44938dc82269022b73b28d73b9b757c841e52c4f2a4490cd18ff2abd3b096c32947ba36e464235fb76c94bf2bd909d17abc44819b48afd7c06c998821fb16ae8bcac71c789829b16d4d4c2486f6aea18fc6adf328f4d318f78984982228d25b8ddeab6506150f1a3918537ca0619502ba1830b6a8f70fabbe003361852b358fd66a433cf3f1b103eee4b4484b042d126f3502f27dcae467e884628dfb84189ee3e76c4e9e4f7ce0e11528fea882d0a71657b1b3e7d63f49213dc98a8bb2416d1898f4a06c816808295ba5f556c77cf48ee74b02b385860758405cbe63abaa1781270991d02054186fd261c24f93301e2b41fd93ffa56a536be71b3671729525c9b121abdfc161691192960478c03a1c5e62e9e73620d443d5844432cae4fa4caa346bd05452b9e7bc3e0e8e645c9390bfc870a4dc69aa1c25293bec5761a1341990388641fd30973fcc5a338077dd8ae8686cb5f03a37a81b11cb43d0b909708a3c0266baee4021279acabbc1a736ea20b30b26b73e458db4838ecaad0d485a59c1093fde98a1443eb9a1d1289f0f58162c26b8ee0f66e7659984e2627dbc4f10bf444319ebfb59574aaf362306550e7b48dbd351c2552b40248fa5fe7532a7f1520ca1b0b032c7421a72c02849752c5429fe0b3c41b40c0471ecfe1694bd128d19b73378ded9039e68e429ab121278cef67495a86d4a53b7bcae90bd6d692c182948936aaf64354e5ede46a3bcb26f3f7d7d7c1326c78e4dc0041ce7139ba942bf9a4edae22fb35575a6d46da0df761c69dba99136b709e85cfc259f730eb665cfcbd7e37a46ed8a06fdf4de816c2d2cc7b3abba8ae1cb3e7892dfccacc5db132ce86c8891bf9ee8fe1b8c54979c75b0d858d6ec58628d4ae32b5fb81175e56766e77405d3bad11473c2c737287ddf5e3793e5dc2eb5632d5b166e48ff8f2a50d8664a474b669a5fe2e2877858c6846bd1603696dffa51ef8249407fb69914ae6dda57ad84eca0cba00e63b512ede09036b703ea760cc7ec171d44b41383a78c90aa9fe0b396aee04f4f5bdece127eefa3cedc9d2570d01468ed4e5b117df9a24759c0536d88bddfe134fe6e820e49178842738eb62c81ef9b1a08e9c4478960a6b11aeceadcc98f73d259f8052612ee762ed3e00087886af51a8ab35f2b18c9f53a03225fe82989206559f2858aad52120191404a223c0e95eb81f3cfac84cb9e75adac62c96efbd826d41866533bf89a86e7ece3aaf232d6703022ea7bad7bc7a354d0ea29490a5ae5916a5e99a695591214784b7bec0dd8a8a008a3b7637fddd4fa544ba48bb890c928856c8e2c4b492a2f3f01f331e8eb248661276c2cc636ecadea654d27cfd2ee4d416abe03677a524d4966847d6742e2af3975455f92b158ae30f800710e064611b93814a327f3433809657c28522418a1b1f12c0d30ecb1a5f2b47d406e11469496314042fdb98005109153a0181c1921de515001b8a1690a25b0d62971a2f499ab9307a29ba73aaea04e4049cb0c323001ebb9d0a64907752c2c556387210f49f25151a7de4bc8f1ef87f3e937b5913fa1a86c5924ff16888ceaf6d99b73cb0fd66078e2dca0d6d8dabee74dc1fa9d12cbb9e145fee216959792bb4e36b5781db844a8ccdbe95a9b03fb886c0f3fbb5696180bdab4a0dcfd1d04b8cd6c5709136500c63d1eee6365a2c9445e619958a08967708ec6acf4165e0b14d31e21fa2b53b4a43f5ec8d8291320e69b12cdeb622bec66133a34c66e42aab736725f75c4303cf219544e43cd89f10c683b8ce10f106d319725479d23cb2610d615732d323643a55cbdb49695fd38cf63da13e72e9731c529963d9b0633663e406115239f2b889bd31093aa64e672d3e7a902f18e586d930fb3b1900c35c03f4fe6d7cef92a70f0e4bb833b60d1f1e7eaf8b9d887a4d947ce5ad280dd1ef376795ee8a36faba506d2474dd3b7d493be58ec9a802242a08dc6ee3afbb0c88974c6a96c150ac2d046dd24e5540e926ff79d0ea77ce2124143032c808786a61a04888c6be47e322b5e732ccba44fe670bb8b4fff249fcc630868cfc2f6b6b3f1a57b75f2cd8e4e980a8830472e88aa5763668f85570510d00af6eb63221c73701e0d753f44c8103470fe6907373137d9b0a4bdc3e1f51702245cf48ce547d4953cac76fff310861fc1a8d080d38d88c3d61af09f2ae694e1e2de5ab8a5e8fd57d77dac79b7cf388ca2685dfea1c8f0afb7046b6ada5cbfa7c23a093559f0d701c9ef61fb07ae13201cd3edf01c686c7fb543e06440c1f84785500cbe146a1cf3254dda5842a96620a9b2688798f0189d17cec274ac5cd352be6222873103c80715433573c0e59f052f45f7e154ed5cb5de2dde678f67f2f4fa111803400242c1dbc237023fec1a647a619a01c8c437a5181166886ea6126befcfd3a469764e44dd9f88bc971fe5c4a36fe3b81a2a81ac0a41574c7cb685888f589b3c5c525c8efeb3f485a9713430ce8a5906d4d153c3b2ede75fe159400e9b9c56c541ca6982080b65412559b0f2ba70c644fe2ff900aae64978b3a05a1c891a2b55c7a1dcef02aeef374aca70371e597dafd3c22d79a2227ab42dd7f78b9e2b40f38d11174f8b9b991ac5cfbd38408bf4349470655eaa2cfd69773da11861acdc2d8c2ea2ce36ef45de5650a975a2bc90b311dcd156e0e600af2955f581a1bb1ec90a4abadc6d6742b5ee275feaefd7449596e1564422de0baa8c1a854e05b8454f01f464cd001dd8ce36c2ab70676877fb6e28bc700dba0fa3eb94fb01c558ff358204a6d9a813baf724b215d6bf0c7244f5e4f9f2dc151de7b81e9a48e978a099d3814da8bdc89fcaafafeb1afc031ea8e850ad44afd7d047bf9dfabc62e7139653b97845ac278ecc44f2f0a7d7c59485471b7d4c6818a06e9c715ef7265a12025b30b97450af55d570882b1352c1a23b8ab25fbf3446b1b7258a401ad8a789afbdd4246bc0503d629dcdffb61d36a87e2b56d20a44dfe0717926dc922c4547b00dfdf222c824169db78c7bad2174da03b567e86700b8790302d110fd27228105e7bc98ce76441bf67c45151bc35344d2ae89a321eaaaeb0d0975bf517c667894f29919c17171d98ee4ae293d2fc08a93edc8b2ce562fab901126c13771ed2ad6687c91bc6322316f485abbaa7d06572b22f8590b56298b65ae545274296b17e4d76cf52f4c2c68ca28a141c53e82bd3570cb9cf6ba0b9cfe770b5de63374535d1ce12618e0d4fdbb2067078d33c45684d43209d066defb44cdcb6dde89f4d9676808d95a6a01e7969796ae5fd6c68d26a156a0e415e5029b2bfd77250189b7b84183069a1d42fdbcb1759baa49700d9a8c9462a595e34315ebf03458910b7c3be09452bb4972375af9d50eb4be886598b15a38a84eecc52a7407a3908089475960f37144dcd8f02bd377c38037930e8005947d4431e0e747ee91aa0760d465c17c7163ea94e77c3fef35fd8ac6a099c0d1dab712c69798c55c39e5a66eacb62546fb60dcda0a6f6ea113153bc127d186e03edb0623d12be3fcb50b7d861daeee39fb498dbd179225b451b9ebea99f9aaa649d59e816710fb7ad86ad8064cc61976a711ecaeedc97c65c05200c1835d2ee7ec1479f4a265caad280f7304bc20e7d89073ec4bfc1f789ad4bdc138a12c0959169c1698119b357bd030094194bdccef303061026e833f01655437087bd4accdb8fcb7580a3951ee052d11ece56c3e245f8780ed22ac7fc9a82b837b37c113a6bb3c316bd8fb49ed24aa326e3a8f9c3b93b61aeec6e2aa51a7bd65f482c8cd349b4e3ab387ed684f16d873b2ba39424f5e22f99e736fb64487000cac56da9415c9edd5091befc624dee00fc197f7bc9efeddeab4e7100ef0cb73df42f97f954689053366dd8e070992d15856a16ee4727bb515cf5148e485236cb111b77311b5404aa206231ca4d8e6b8733cd44e464a4eed9e16a5d9a3c51ecab29fc1e0e33000ca6782a0417278e2b3653fbe16c491242f32be3f77822501e396a428474ed1a3f29afb8a94b644bc4f64b7b4a81ccae38857caa949aae2c116c50e29039289950cc4bb7f9cfec3ed47403b6b822cf04119162810959fd856855c80a9e1f6bc195ba4e4ea5a2794ede2d68be36e9e4418ce37b472ba8f944e61ee2f7f3c80607b55915d1ea856665f3bbfa124ebb78d9d5315e843df34c6b482a290984420b532068bea8bb2294388886f7fe1229ad9a14739858f0bb147d95233b2217bebbba1fb02760f428b6a851fd725a8a4864402e2229105fb8224995a8a3ba90851bb00d78017f049da915363258be204d8e4bad5fab960562c69d488e4f2d3b42fd510916f2773fbfd81e6e2030e14379913f3e5e63422f7faec9c639a7e510d53a987126445f740a22716e84aaa1a40ab6b59ab7e82857bb4116cc906e63219f4c49e165e7084900890a3f7498264d1bc10236ec8a0f5f5018591ab3dfc79d840d2285c355c8e30dba08b683f56b8412cc08bbc7f45ce5288b99766d20fd90f0ff04fa83b5282af1ef91b7b9010a606e604623a4e07c109b671bc4a09cb48d6676a55e068080f8193d1d4746cc20b388fe7306491c0188e9b0181c801e62a408f599c11b402758a1f708f2e34f8a4a2987f89b8f9691a90f104ca95f55db87441d53ba2741afe616fee6096ff288339868d09700db087142c69c563966d625b5e5f1f0d432c0ae134983404ff2469bdb119034e8f38c46a00c560e8f1ce47d80b3d0ae3927798afca10c9156e7211facacee0aa6060195e0dbf38243b85cf0dd07eac10f4ac897b04cab51503d616bdd75fe4e9468aed87c9d5786edce899a218c7e869e4969e11cdd0f63a7fc27db8e3b5c72e51da6bab16e46dbb60408216d9b6395aa189354fb52d5ea63933bdbddf7d99edfe7cab599866105798c4f3a9cf4faad54afa8475620722ef02119a9f5839522889f16ca743fc26e18c4ad956eb9b1d4816167df889fd6f61523e1c9a9018b208b6523816ab19e6dc39d73042c9f613baa3292a323cbd4eb055f0a6750a9e32445bc06499f32637fbfea2c31083a083aefcdfb983c9baa09cf98a36fbdcb341d82b0b1560d343598a471852c592721976cffa629a548f3daada23a610162c43f68b96211a333c1033c0607d99c762b550e773a94fb59ce94883b628fefdbab0c1f868f185d8524d5b1995e5ede248ff99d92b29d56c5cf94a4f48033e1588b5159e2286cb7c07cdacb0bc4fb712b213d68aa91cc182b45bfa57d96c7c494de11f7182ab5cd69f61d1ea6156a13c10c6a57cb5ec033db421c5e2037745f1f971c23592d02e1d1c39749dd6747d391211fe9bb11df5962e4ca47cb8802b0ca0408d5f8fc521df9770638c0ecfdd1cb918d25865e3363110f15dee3cf5d5556dba1144467a90f63adc58ddc47a6738931e336b04c13b9ba7e9653cba7771a31a43490e6e5aba42f2cc947c62585be548e106a2a3b60fa42cdfee59e261affa5312edec1a7f23788dc1ddf4880ca510ba9ff7d7a6a2a8a9505401c08799a6f0d1cab916bd865ae03f7898a4258f37a601a3e58e8e8726b96c1c0d30fe61e425b14ecdd899d62af6f08ff9a7f2b8c7a1969d6aea837bafcaa3e504967df9a317c888f38f1d8a5d85709ad78788b3929671a1c37239d579828a19e49a4291b175f59d64677ace0485049747fb00b2e88795e87009c395432492f400d1d7c57b7d984e13c9871bf67e4c1e9924509614c3f21aafcb0d0513d45c2371e4610d2a8411db94d1f07da3ae2102cd7ac99aa06fc047f84c1779fab726fdefa9e1803d26e3c5f390ae610182dc954b21b9229bd4d3625de3b7954808ed3a2bfe9b893c4d18a040f413bd6a331b5116f2683c1a3b985e28d82a26809aecd0667d8357811fdedfd22a341580c2687e2d9cf5522c8921e4ddfad00942d638f6da17a1f4f51e0091a4292b619a49fc20d83fa9cdbfc33c8d18e0b5df3a19f4ccb4182095dabe890f3aaf6f95463997bce607f9abde62162ab867a26a9226eae05e5dbd8329cb05949cfba9bb03f30918ee3bcb4d7d75d601c4652952ee71951ff5b508f2f979044d645631f7c953976fec0319e944a60521f4abc82ab5aa8771e8146a8a400dfbe66d0a949ead5581853b244be70a4ebb21b286c13476a39e546f1f8177deb020170ea81b44e1e54972c7e02e80eb819fd3f6332873c6edc9202147f7a448507a05f0cf7a05062c9744d4c0b3a985a797e9337466dec557a7fcbe52c2228644dd23a6a33cfaa3d07ef9d785109223936ab82aa7d689828bb679793428a0ea897ec8ca22771d95dd6f27266df286f97052b872705bf8dab4ae32967896c4d10f1a9e9d6527b1202a8ccf3fb0ad61c241fe4c388fc5c397952ed5a2717bd1e69b2df37b91f7cbaa9c614eeb953f83c04033a2ff1ff5586ba583616b7ef1300c06eed66b1ddcdac19bc7952eb86828e75b5c31546957a1889fd0dfaef4b179ad810541ad9c3604bdf0b736d850ceb8e25762f9d8f9653a1fde15a60302cefba103e6faddcd92633038623ed9f97b200612c4b2d14cab1e9c40f89c62af1ea6987e63f185270ee51d8f1798ad7bf8e0a9abc486f72af41e3c0a6b15c374a7b180f81f0dd2af9f83c0279256003e407b3094045f44bb35ff1a4118206e046f111abe76c8e97eb374e61d2b1fae022d18fbe80ea0f7aea986c4dea49243c2814c2ac2bda77547335973525e4d87ade040b85647c260c4141b6d151d2698d2b32403da0f3d8db9d37a5a0149ba630e579dfa175087c871760f21b63e3d175c503bccdd7931a8506d3e8bfc7aef4455d616ab43eb4ca5af95ddce9ab990d91181d12dc921c4bfe3b97a97ebc0e86a9b639559ef449b612480548b7a94b648be6fe82b7ac9aebf175292143729a7182549817371b6006ca390e15c16d98c334807fd9462862c5a4b47e2d73b4443c60c901bb0db09cfddc409619269a41d5fec037aaeea43d6cf434ad40fe088175d3f1c58d8ed07324e0499810bafb82780ea67fae113a221b601e3f6bc1ca68fcc1c8806139603902c96d302f132e0b0ef6cdd5ec42f1318a439816c607bae4dde873ea3b6db1d5bb9fe0df3b7f19d9a8b7370f74f614aabc418c12edbebd85347c76eba211407e211e5f54a1fb01e7a1dca37a0bbcbcffee4ab82513bcee48e0500060ede555c10577754043498680a0afa6a7baba66b12fa09f2bf712002882bbc05da551c981b839e9de3a57bba2d4f031e661ae81ac921430fb310abc438d0f0b1b101c667150870a4eae1124248ff78eed633278be4551b2815c42a11969061ade5633b8e18ba49bfa195df06047fa583674020457d0811303d529f400685684d7b9d7a4b7d102fd75b1d1ac98bd6fb0acf7ab4c852382aa2c05f03ac2b7747963c102de0ad2c31d97aba132ac049c6a1cd2c258e8db14947c47c787f840c77917ab3c4f20e11c2d4283ba749a28854db2e6a33d822aca7c5fdda7f6cb3ed1b4b0cba2332ad34e9de71159620b0c569639374b00fe76b39473539b0870ddd2448c3ffd10621c85dd064f439005f31bf2da45d064d432211cb7ef529c58b246a3c179d3f624c9b197283ce74342c069bf51c9fe9f315b8954cdce18f672066585cbb4d44322e343b3b48b030267cc4e0ac536d14481ab19fb16f547a479e3032cf23b72d80e68b30438ae2fedc83630a5e425184e1646c6885d88976cb264179d06f1235cee0c1b3cbe76d8cb57d0efedc14009b0b736f66f127e1e46b8d64ddc5b57999d9ab0a290a9c004f66f3d7bb91503c51d620c1b4618a1623d83a930a11e28081f93b57dcc8c7446ea81750b0f2e6a4b0bb950700bf1b163b295c4e5b172e49ae00e547263d91718fea1bd9b841377db75ecdbc372bbd3fa7818b26f7a0c0fad82d2045aed879d3ce0f4b0d8df110b9b98d6abcecbda223bb0baef38df5baabc048b4c771fd54589635c01edc757574afef8245e1ca111cc09f13d45d175c819527ab2fe0b53cc6483bbc297ec23a63d2f27ae97c0551b403fb0c3545e35e5ed8eb3bece5398382d3e3390add717941d23bc0ea3b2958bf8de7bf2a8b12f8f831b5ea531cf17e4980a86292aa93b7c590bffbddcdbce33f0e050e50da0d7bc28fcb63fe3e21d43f7a02f5eba9514f13fd1cc8f43e08236f987df191203f82f448c647f9bbee8b199655d5d12f51e145cad353cf4d50b9da010cce4279bb34e6c14f7781e039aca5794f22f5a480124461db7d0804d11b1dbbda14a3f348267757bc7a8c821a7e6c143191e2c730d34218bb540201b751a8758a07ff00361d431286cff7e6f78dc9955badd24e24e3b4908aa691f39e2b40a61b407877044825b916db7b2021946bff2f4a1f4f150e5c8da8d4f20457a0d381c2466a9bd8e7718c48a6a2f3efd3ce92e5922834353c7b660d1da002bc21bfad11f97835f882a5adf49bdd2a1289b09f182281b2ac03fc98bcda6dadfb4c548f3aa52f22118794c178e554470405d89b2799a4c58310a704f7ceb18302d47cd8361f28488c74b0e36e134131b72a2e7a574d1e8c7ebb4ce7c09297547db0af92ccbd33e43649ea59ef6743adc8b6a5cf1f53f9d15c7c375638c08a37681ba650fdbd4a025d238d1f338b1fb7aad6a70eb0a309c9ca5aedc015e613a1d50f89a1cdb41c26af43e68f68fbc7f34a9e3fb74fe7aa670e19367e39b56ab173bfd867126b158822d94c8af8336d63faf19c8d03663db66808b54e0322f9a84ad93cc48b6f85ce2391af10f22de32b6efefe120b1813e6a96a1e06ea78c9105d58e3bac38a40717c0dab099c0afc2039a27798b4cf6779a777c01ca94c947744f09ae76b2eb3458287d8d2b8122e706a0b9372b4f3ac0b043a49614e3d42ca04bf281adeacd85b055e8d8266b48389eb5fed5d4c4e31ce89bbf63c8abc2d9d1f094a554980eaaaf7cefadfc9b15b0caa60736f6593196b3b1e30942410d9a17935dbd9dda3dacee72f5c0c70352bd0877fbbe7fd691c501e8c9a1a09474539ae93fe1cc2266f0cab40c8f801c644e2981e6da01b2cb8348bff2cdd658d4395e8af07a2716010929bb719c5eaeb18796f1c3c0c6aa01fc7a7f19b0f5fe5ba19fe34b3563ce4b11feea83c033dc8bc10560ba270781d02ea1f4a9068402b266368ce2303208ec95437c7045fe8a5a3bcc3f902657adee91c019d1967962ad5643da33d8e31972774d9900ba29c8c6191fab38942e7858b7e690829acae1a1e89bc11cc7172cdc04fe44574bd0c459686d49bfe83afcec01fc6388ff16910a282daf7879d0a84f9e01c564c55f9520e188897b0e9ca57c815f253b958bffd4ed9788feebc55f27556e048161f05fa843d087f1a0024d34ad42e494207dcf661b900b944923802f2e9f019b3e2bb807e36f8b690f9831ebddbc04c3b2e58c0dc3ead864f38e8fa745a70466634967b27498284dc141f95df9cafe08017d63cc3ee11fdf0500f72f057b0902b907232396c83c17a7b1fecb3981162b97b8cee2febd33345f76c2b96c846fffe1f76a7a7944022eb0fed70422e33bcf13ff01ebe5da899d2cf9b41753d69e5d0cad17f4c53100027a4afa2440f149ae908c76cc39b956d083987e0f2f2d6c1fb50631a06bf4c1f7492a0643b536e1856301013ae0ddbd8ee597dc14c73992d6c1d06f0fc74c3ff9d730df46278ced893e3418547e477c3edd1c7c738cc2704da1b647b72af8d040a353c625ba5aaa94427ba705c100ebca704408a5318054c3172f00bc14302a54d6c35a07ca49e8791c6f81518c92ae3edf6c9735e940b638c6c2eb0fc56ad642a3d518f7fcf690ab9b42b98bcdec90abc58531474b082c53cc16405009d7c2d68816546e48b97dfa062b85ff33f4d55d89f13ccb1e25b47da70021362a9444767513c4c31629945306311d7774949a602e0cf4355e90c9ec480695db0502b115f6f32d955ba38f4bd46ba411055c5e9351bf66088f353b045147cc066baf3e06555585dc563951101a06ffb5a2efd952ab9329c10861c6a20963b80585a5565d40360da8320c92868324e344e030271780d25279d26a25de688645f971c5a2da944c5a599e5d26c009af012c4d71642e30e2e773835a2a61b74a742548a7b225a3e1d3ab09cb58c0698c1c10e05912b04dd14f46430f2640c9b883679aeda8f04a33f2182692dd7b4dfedf1f2c1a76256404e44acff190888e350e5fca61e77debc4458db6aa7074e7cde92ef4a826dc0fa169b08c4d92154ba6f2f12e7ad51a9c48cfb29493ae586b639ffdda2586acbeccbf015f7a28c992d59737b94c2600313a84ed166fa88ae58250e1d8fbd87a8de4af5f57c01aff6835ecb0a3bd3db0cf8049ea8302c778916ae06a95f1e7c7433fb4233758b944550ec417828470e6784711a484c58b67f251cb5abae41ca58504f45d231f8f0f5ae2b9887338c7a58c246e3fba78b4687c26d222a63732f15e824c73e8aad8044213da0562696d1f217cd0092bf5caf100a452880284aac8922dbaf0166d6bf4dec2b9008ace2f5acf6662b16edabb39fbb02590102f51dc79c06c71e9a3f6b2a26cc2a7cc53fe8f534147240b9355d5aaae6065d0c5c02c2b91dd080ee01b0aeb16fcd5ba8b64c85da1910f06fdb867813461195409635b36d3d3c168bcc65e2d8f9e0f7f7a47131eee64a894bcaf4d36b6310e3c5770b307f51e6b4d82ecd2c03407bf2e51461451a89bb5b9ead142f2e608be3607d317c325207003be3e30ba0c0ee8c3f4ad9ae359c4bd6fc161c73e3d8b69ba785a7c39cdb0e2ea93b018806541de7a0d50b9645003170210833cb56355fbaf4283a866681f2162a749a03173245ce8e7a25ed938b1b4d5cf9009beeb0e4f9d869a8682fb7fba4f5831041bc2c3cea9ecdef396c61e9736cde8fb1fc00805c2140b2ea5bf3411a5633428bda219181c3cb974fc782ea4a2f1486d8ac2b287c0bbb83e74d513276489c8fbc29cbe3b15f928b6474baccc8b711079c3a28cbdd8a53e9fc86449ca68e914e78a616402e98137ddf191265ce4e26b958546925c36c9d8b2a6c2c1727e47ac7842cda8c978e7b0039136772db8da7f1cc9db4943a3f7240293ac3c9433eba90aaf7bec8030396408b858c43a9768bd97262ddcb520bf48fb421d27b1353e0112065a41953ebc46e1505629d61ca024317679a0e7f9c1c741656290e149a3e9248d89030dc147d30f146af2565600f47bf3144cab660166768865cec72a3fd354bc76db4ed32f192656323d3573214e84cdf9a4737d406149448c85062a1243d0458ae21ba3600ed466b21e79907caeb26145cae5e3feb43755925a92eab39c1d5609325b6f3d0b6abc4e84056e8a1b2afc674911e3e5e65d58b7f60394841e511d76cb47544cef8879c1fd7d324a6bf6ff73d827d9f04b135a4f0bb408abcd1d752bfe8eb9947f48b16e01794e3a0ef999a4ea53b24934af4ee6609129ca3087e61a45e9d82a8b4ca182330f328d7241598a2c6b076f8af679bcc8d524901d43c0c8a38dcd3e2b385c0561cb14d8f4b5ef473fc086bc996900f36a279548adf0012174b7d04d27b217b121693e8717e950174f8d0fd2887e50dcb03779343805c071b87966b3372ddc266edffd988cb5f07eb97d486ca0eb9539f84397406083512fb20013e8a241cf7a087b228b0251405bfb71cfcbae32811d1e366a4f512336d627020b5bff6a82e87122a2fd3e3025c4c0e8e414d5a527267a330af649cf2475822064032c6483978a24f8518ec3e7feca64d740ea8a9fe359044f2d86247994d49e652eef690be2bc9f58b8953be3b0c904a2d98c3df30e2a7a88de62673c67f494ca35560e02ea5ce3679b83715488acd06d200601e78247356e56babb3c33ff865f180e34dea1b1ceba972cd8f3cd0858b22c58a7c55b6b4935117690f43c9c5a8f820079a8252d70b0d4fead1a67cd0ac00884c2e204b52664c8fa183f493ba81e2cdd14776c847425d59e57b5bdeb7ac5bc4241a79ffd7d8d677cb6004a641492717da4bdf707e8bb320231413dcc3c3d6b7df6b08c53d86b2a88cea65d039f7d565b4a89697b8225a623437e5f8da8c105ead1603d65e9c669fa09357a97dbe4f6809d3c9a70671f3e72372d8fc91431d55751620da4c8dcde34c05fa6c8a03061ce7718d4682b87518c77104ba5f7c95a9d5141c563e04983697e69f768f97505bc924a6001ee0dcfe6c3e1b736547b27faf0f2e9a858e0b4e7b9a8110372246b0c2304081ef56606110b27f2b063c96c6bd9d4879dc80c67abc0f0d8a3d0c03a0afa478a6f2703b0f80f864c48b47d7f2653e92407741bbb28783158554357ba3e5a28bde4d555a178d62da553587d610fea7221086f69c6f3da50f99f9ce3a0afb96ff7c7d027fbac51952364ea740f1622ffc94530526754b9ec970a5318987dc41ad6416c91973de2b2ed8e899d933aa34667982b342f59b3d8227007c449e00c72001ae38ca1c62fc417b6c34eb5317dcb0f1bf19fdfd07c3e64db040b81b2b12ee863f059e6d1b59c887b322d802ac5bca23a42a7d037c3c0bf4b46d100cfa187cca49ee2dcba97af1de532cce7b05642735317cc52013b517d5a50d5d7cc90045394c8af2ed7c8c492c6ca5a31dfe43614eb10bcb98a3568e7b2ba0c6e6cb36d1a1c940587273033ecf2d251e0e5441e5c3471948f21cbdd8d8a88e33479654f731523a22125ccede6eea38bd97e9ca618940a0a403459aaddb8fbc3a5a2618e7d09310a30218edad7050050add6076d661d982628699701c99988b27f8ab18b951a75c93b9a32eb82a5ce5d82f7769968d7a51c3981f71b7907820504d81785306dc8b4b9e694920ef425129ae710cbeb3aecd549e56cbe16d883fe44b3bf9845c253d91d8fd20280ad9215ceb4651004fb136163243319e9d842291c8439265ba9fdd3b7a610a7142b3e6a46312075d73b73c57269807ba2512a81477b4e8380459239dbac92696be5c7610ac8b8aa4773b94bb26782a2677a012acdbae4904b954bc2ec03a4d81fc68eaf91d8cad2c3af82b4391c203b2d1b628bed45cbe2298e2cf2af835a1f54321a6255b3604ee748826998883c4c76ec63f04b18d73529449e1a9b2f479f090275a7226d9310553dad6f4f5781bbcff713a0ce64999bb3da13df581919c0830edadf5f47e985c3145e22c8257a01582253f3e380848db00dc13116df0aa2178915e0a015f868230d3fff388f45ab35ef1e6a34497fdddc97107bfad7ee0567369d73456d8592b152899ee24f7362506d8be1fe8465f0c26c90cb42c403062aa181a924db9d10060aa7ae9c13fc5d4091ebd6fd38e78d0bdc0fd4a76eb6182a3ea8e6b9c72ce0af8dbc5a08dafbd3664990774d478f027b226dc53c1fc824a80d469d348a1f95d27502d31c96088087f804d379ef25aa9c609d7fe7301e00af8b2b3ce8c20de77dd81012fed4f2649bf33dd4798871f8e2f5ea11f05cb6ca1dec73ef316b43ba75173feba84c37208ea4567ed0fa9f50675a8f4626a745c5fb0ba2aa8f577a542bf398330971733a3bf88e15f7a83e016a81c9f529ddeef04bcc138490d3bca54aecdca2fddab7d78939c6a8818b2c6579dd635bc91c4d62b792d4cfdd95e253f51ff3f5cb775f7ad6e56cdcffc746a385d49865e9d6ecec5afc8e6a8895292c6541fb74a409fa4baca3032dc08f731001c41e281a34a34685c52367ae1099d90dc0837fa42cce2699981430f559c3716f09a1ac549c6f562a0d05cfc1762e68ef769cc6927563f25134999d57074205a039520a9b0b11033581e3da2e6ab70a50dc7bf747e6fa2ba2f4114edb62399827cce00f0304b24ef2a3dbab2f7d1086d14365a599b2325c9e08bf7d5561d9ee55a15c85bf40d8fc4ff8d68fb427a25b3fc4a5af4068339d6ae49c34b4efdf0c0374c82a12130b61edf4bc4356ffbe79c52491e67576f41c6e1212dcf1d4ef488dbd3270ede944f2b14e1951cee2dbb83161584fcbfd661aaba8f7dc18882d0600a00267428d2669b987ee9e416fbd87ac4f417ca0482f1170773d895d496c230ac70512b3b4e771193972f5bbe4cc3d7c9d7af9a174f093d91d8027c13a6ae0dcb174b75dbf334fe0927926dd42e5b99d7bba47b60324bc9b4ef85e71eb0014a407f04a1610a24043b1b97c4aa18180f3d0b50787c9812b9dff0f5efd364cea3a2722658024d22e49b9c521d16abb992931d1f6b0eaab15c318deb41ea9d84f1e0d6d0dac7e0e2fa9dafaf3cb617240efd277416e9038cedd686bdb55dee3f4c22d4c2c6ce2260efc1dbefd6d386d49a2f486fc91020b60f8110e46a5a9602651aaf9207e161c9591e1a1293c0eb9f7e60c7d695a8c04e24ca037620e091aca6f648498e9fcaa68e77aef0c10316910a5f88517c86e134718ff09f5bab2e89a1dd921b86d6ee465f225615ef0e58b36864a9f32a7fd2a343cf1d27822c3f0e9492f9007bde305acdab67ea9c02ff2089fad445bd0fa4719e9d8e4e9b4572c97da5ace29dc03c8b874f9ceb148bd6cb066e0c3c8994d5ed103ec34c5ff9b9a5a8927e746705337af56890369cd286433c059fff834a042417950d82510330f0f8f9468803937dc5c5241a6e1035d5067bc492aa53fb50ba3df43689b0151b099f87153d6333dd0010b148060917f92efa4b7d95a48303a4aee51390d1399191233ba51f54497005ba8a49dedcc36c95115e89e7aec21a40c8216d313fb445d4033e193cfd0f75075d06812a1b2597e2186a7965a4408ec01aeff02d9693092da3da352c53133ca891954a55940f23dc07bcaa13117bb8d13b67545ceadbfca1e2970e9ee6057274f908bb30c668baf6f9e40c83d13cbad5a1012998e6d3f9e0131bb6264f2b31af24c58047c9f299887e06078fcf9f9e84ce6fa2bd9ecc5d985ae0a11bab9dade94ac2e40438c366097a7e801a5b9f1a2b62a07680bd7aebd6df89e90f417cdbdea71352c8d4001f51732bd425cba7f4db38a9324c1cf4ed65a7679f48cc07dbf457aa6713965e1ada4a14ab55a6c87e4be48121af1a05cae342219c49e8af6bc2d101e11f8c63fec76b392d4a06c3f09406701f23e8428b8e3ba2cdc32fc7b434c191bf11cf641c096729047a781eec2dc17a3dd242d493f104181933e090b38b8e8c409834b935ea2b64eab671f050c914c28e8626d55b3d9f294c09d2a8a93518bfba3d0dd3b2c817e22e0c31d34db08d2142fa6501ba5f8993aa47c9eb0ac8aa4e6f1fcf7332853aad878ab5d80af44b73483638a56bf49ee4dd220512cc6a270c90274407f939ff64aaed26e1e55628821b1ea2746f2bee8ab534ba40c30273488d38890765ceb4fb10b1905dec42f457eb2d0282cb6184200c05a3c2ad25818741e8c3681d6797612a00f3e93d96d194b025f5900d4f388b028850e470582e41fdcfb08ca5f4d4a84d4fef70e49fe42e88c9f4ef735fc37bf0fb46288b8ac92fbd991eda3fb3b1f15dd127b63a98b2d671bc93742dc074e08b7e650bd489c09c1c2eb73aacc73b88fbd335cc371b321ee699a811c35e0512b9bd41eeb0e080d4ffa424597f904f21264f71461dacd9f79c88ade17958c7b4a6599c3942ebe1576bd653547284614e67af69390aaf18e36985812897aec8e48555e4e27ccc3462d1c7af4461a4328cf18e178799def3b89bba69aa25d120ed5dcf52efa8bc7ee9d21eebf7a52a9c90762a9b976a61f6cebcf26edb707802a060cdba74162fc318bb1eb0e82a62bbde0d6e54daa00ce598d643b396a1bb3788c2db258ad30834b4b624050a115152389fc01e536c5e47d6e77b8f0e2005239217bf945a895ef233a804ec09493bda3f86435a9e88d4728e82a0539c240326934d1622ac638e5dffc98875dcab7770c0278eae40f9ad22501ab854e373a2a2540bbc4359565b8b78e6598497d3e4969c0b3429cb38f7175a94dea64ef18a30632b918841fef3268d6cfb6d3512aadb7d3bb08ba9b0a912fbfc40e322290b4a5b7745e206790373157a1d0d863b07e599388444831e98054a4f651ddc8db93671f80efa2c06cd2317330243b9a8454fbe3a08520a42f69387609e3d853cc23aece8a03d2a65131feea5624ff980f7932f2cc439212146c06151bb2e78956697f8670e877627212ef712d0b10727ba69904ce9ed1776dd8df44223526e3b82750299e2fc6bace203029b217337851676b313d4db1e6fefc2f86a2e1797ae42bfecaa8651aaebc5ba9b17477bf8cdec5faf8556ead0c2d12d5f3ca9ea95ac2eb04fc7998d3f75ff7a952e6d5456a45ad914f94aeb617145f83055f79a144675c860ae51859e0426d8cab38bc8fabbdc4b3f574c3215f1cbcfff827147390056dab8fc0054b48a6380155bbed65debeb0505b8f00266c0324efb58740ff0d84616d10bc344ee7aeef68ddc00ab24796454df90fb61f0b5c8fc980434c47a5009979651828f66378e30c94df7217db6e4fedf851c99f4206f741d53b27d873a1b5b512cf1c7167a6c52e0dc99d1f6c95bf104a8f6eb85b0a4437574ba9a33a9b618a063f0e8e91f1384af78f945472caf6b413f16500c2ce5303ff827fda480ae567a2ab6f68ee543fea1c40e31b85dc46f4262a937912b5d28b0e01f68c8496a08605345c1672130ff7a9c89b3a7ab074ffbab3966280cdfae557285f784f5fcf37dac71f0f1a0e022694a80beb70abfe76c0879d18135e798740b9fde014126a86eeedea16f81cd42aed944346c81c505cb0483540f1e9a8eb8ce4dbe409f9fb4968d73858b9d78938484595513ea0faee3d764b6f7032d77eed948e33703944bd7cb6334501704443b1f541b97db8aaa3589a4649ed4b23f15d638e56114c0854593af2b49880209a2f3f24833ff4e902b0518b9ae0c519e282c108500a194e412e94533ce39f25263c48a288df007ea991c66808bef2d26bb18838d777eee05b9973f0bb62f427032c443ec48720a939b3571a8b4c14e89b05db9302021a0fda0a620024dd6eb88555f52f75bfa129939f27d2c3011e12055f3ca74481de5a64f0a9cedf0a9ef13d7d076286a7208a33baa36cbc8193639bac73cb892cd562f51aa0f597d576b38cb5fd3a51947159897828b0f07ff862a60a0b17a738c00aed3ed139ffcc9d448fffd37153a7d86ff3b76cc069b073b6cff477fe064df39994ad30ebe5acf5740594a41380bb811c91d6360f0f84b45714c3e69ea8ea1189e032e0400fad57ecdde22dc84a4ebdfc7d00128a83c22c2ee5abad031c5f39b78bf5d00a46585b4e60611132925711a7764adcccf976d6aa3c436746e8136bc87a7bab00a7784d1b3bcb089361770e00c9cc9df8bb14ccd52d1684dac4c7e9f0543ccb05255bd44da6c7a78d7c0c03974f50bd0e856456cb0b23703e72b293207d0deeefe1fdf654408a611693c1105d74cd8adeb23ce44c3338316ba24c782cf1690b47d966f130ad2c03715255663bfe23b95a13398c297a6458c79a5c1ed5898989f4fe5ccf6cd58e3b82cdcf940523fb87f3f0fa342e456bbbb463b5592e2c69c4a961650a629a1f404a11e6175edfdb56221fff6ff6f4251e8d99e66abfcccadd5b6220ee203128d80f963175ce0cb601597310c4199e3f43fa35725703401d31e68150bb1ad837f2588db791c6602c4f8b7dde4b1dfe9cc3dacdb1544bd0df9f8175a6d2962407a169482abeda8cefaa1ae55de6da713953d025f832eff9f2a8ea70f1a89320ad3872b4e6eab2d4afb377ed3824947b0115cde6c30246cdeb11a458091855f771b696572179ed45c0ccfdb5c8d7db6900b784df9abfb6fb2860be875023dfea178966a6e40fbbf98a7e1c1a4a6c2159c789475d1d4caa54ef0fbb3d263390d82b329ecee52a9db295860192aa2db9c7eb1c4d49d2d6fbf0bc463e284af0ccf7a5d30ec0325446d8caf91964b723d8113914c536af082c07566095d3b91203714d7278e8fa4ac0799acd5cbfddc41d4327ef8f735c0f3c1ddde3735412c45d2b9f43db50d425faf9e6c49ae6da27d3d609589705b83e91b077a4dff8e2705311417535dee3910962414692273652e6defea41a0a30a7dd9b961f24f19df773f8d27b3f9a5980c259d34e2689d5629e3eb47bced17997fd9660b91c2cc301d834daa83a2f67999ca14455b21174211a403dfee86d9ea15d650e21b0cebb45d838d8182a5e5a2a99a54ae58e66f47af7529a6b8c558df13cab30af106068d5eb1883e024505440a06a4c5b9786de61153aec3b4ec6dcbeb153bbc42abed9391ec90bffa64d887caae74d6aace6454713914152910627526e282252f869688187a5ce199483e493c2aa2112c430b21b0bc28cd86666694a88e7faadaf6094e74034a550f89c3cda54936bd6cefc0c44e2f6c6bfbf6f8a6895520a5ca7ef3eeae282158242a278dd39b512f749116466a82a5db0e67fa4b7491ea2e0261ae7745d0e2cf38799f231a949d45781036de19d53b97a6e292ec9e81d2ed2efe3302c9412bbee74012da81a65ee2a9c72346c53de3735961bd1870b1d73b53989f05601354c5045e1e04be0c56205e19251df96c99e913e9b43bd2b81a4e883e746567aeb1fb29afb624fa19093b926230f84be1ca723525909145d73410e585449a5f77b68c5aef38824056d6a2bc37d8b0a227b26dbfb5dd1a21a4914dc8de7b6f19e00c920c8f0cdae1bb52eaf037a10e3f73ea0eefb9c01c9ec6cb8fd4fce2f03591656408b84576f12335cb1ccef88793213cec9b96c34788b3e3105ad25958aa98c3df882c1d58310e8f23b2641c7e876ced1c1ede87c699f1ebba9d6b647b7f14f0edfe24e04224401342886b1b472a59d3894508216eeb28e02680c74dd70067b940bc747b9c740f707a65b4548fa30cc0e35a10b7cad5f503f400c2003c66bcfc82b46da56db3db66dab6d3b6b16c1b6adb52dba6c9bcdd9f20aeba9b6d9a781d2e4ac68d995143c6451037886ba5161ac4ede68106d1992eed82fd3c7bad36377a77c85a89524ba989d213a52c94a2284d51da4229d5ae8d5e1a3b6e778d2fb6876ad3bb5b87acd54d75751ee3ead07117b7007fb938ee72739c747f989173e028c035961f72e028804e6641a55a5cba17986c535d9cc7b8393977716ffce50ae02e7700275d02ac6e0620801bd750041880006ee0dca0522d2edd0b8c6ab4a9ae8dc7b83ef87017b787bf5cd65d6eeba46be305a0c5eae15aaac5a57b81517106b069b17ab01180944bf702a38a71a16daa4bf3181700d848fd101ee0c900b88bbbc35f6e8dbbdc9a932e0f9f21239fbafbd3e3e90471969f206e690851f317329acb8c19dd8c192f3366c0cc98a19a312366c60c173366bc9831a36936216e1057e3e176d7d4d8e1d2d060315997b8bdc80d666e2abac55c9b8b1794ea701d626c6a8c19f433ae75707b919b6a6e317473716d2fb04d46460c1c3d961817351ab7ddaac3bd1ee35e9781652e1135cfc0f1215f9fc95a2907558c8b1732bfd86ea76b7a7751b88433c9747a966b3026d34c0cbdb5b82de985eb9124936066b9905ecdb46d777498dbdd09cf8c3417719391dbe776e986af2d879997bfb86017b79be6a51bc1703d927023ac9d367bbd6f77f5d1f54eefb3a66970f5172ec70ab7f562b81e49b2772d7aa78779e5510ecfe8d1eba2c6a8324cde6eb52fb99b81114386b79a816d3a703de8edb24bd660367a5be84da1b2e6629371ef92c34d77e6a30be3322c39c6cd11e22c41dcde1f2170cbd5ce7504dc96ab9f2070f76b308e9a7997c361f0bd06e3767b333960ef35be2c5f99e2da34ab193ad0a0d9a146cd8b4de6a48d5e5c226a7e79b934a277fd74674ab773b9a6eb10371a72a399db0e74ab716d353ca85ce098ebaa7b5d9331e9408366871a353c00a0bb4d63db68b66d876dabb16d35dbc6c3b60160db02b06d77a3b74463c35b773b6fa49ef168b8cc7c693bc0ad46dc6ae4c6c3dc0040b7005c9b8d1e5c4e332f34f275172f95edddac56a3266e3cc80d00730b00dd6c5c5b0f2c966e1a964bb960515bde6e65b931dd25a2e6d3b51ab8f1103700c82d0073b341b71eae8dd53a99eee2e54b83b1d1ab658d07b801206e01985b0f7463b5b0cd86ebb171f8ca646cf4567ab1ccdd19bd6db5992ecb4f574e35b12ca72fb15cdb81cb51c26d5900c0f5489259606e8e05b75cd834d7b75b63f4ae932e2a7ad7ededa8cdb0b72711359770355916dc5a71b3919b0f73bba11bceb5ddc0360150d34d2c31a7eba65f6b0da056d2491677d390ae8f6ea417eea05d226a1ee16a85dd61c6ca9341434305f3d2b9b4d4a83a5ccf90fb01fb7578eb736476e5292672c9da2342a089f4894452083c4a4640598c80600f4422063006f00c31c805162e096a2b64ec421e9e48f4c1336431026a2b62103c430c72c10848fa9c40eb996f06d00828b6209da75958c9e5c0eea337c262ce393ff1a8288b19ed881c4f933c86898e472f6a47d4e489fd4b45c1439ef83c2db0a32bd11b4591b1f3d45a6356397e0494bf541439fe5be53a274dc3052e287908c4165593e1e808d908cc5f2a0a1e32c4e76981fd309e1cdfc5c749e48292e1e7e3b1be9933804c906d155e7e3a319dc85f077126d43450b05488f2340dbc4fee1c5a2bc12c27c6f5c0701b418b2518659453ca3927bd28a5f4baaeebc24a946846c9f0d54a96b2896c128362d0952bd00974d2434394c8723f640db1be8ef8a670d062cc79764bca6d9300f5e2aa75f1f0f0f0f8d45cf39c335e7af80ec22492a045155630f179013f843cec77fdee57f8fea1cf895eb4dd599d5b07165ec6e8f3991833338f31330361c08001672084331815bdb8450fc67362cd8cfc4c133330fec1cfe0ee12e27739c280f108e331aec18871bb99c744d64c8ccb1918b7739c99c15fcd53bc21c382bc56338b6529ff5dac57f20de12107e75574751dbc6e9122a227e33c52441127d8cff33e719c4db0327f33771179af0888273d693f4f9ebe5ebb28a534c33fa333093282496419e4013ea2279d20bf43bec7046ab78a48ac6fe67ba4173d6923cb22b2d518fe19d1889ef446427090e84de8334ac10bac58f1c48a28425a7c342916667898e112281c02e0e8f5ab19e6305fcbb57727d2ad46baf5a5cbd5fa97225b37943de9b268d84602827be93991544995544958658024df116a3390249bb00664320907c9a5dbcf745aba1cea25fc0df14c044c36bd74c821c09e8449e7388ee3542cd80049b209935e3ac9f46e6979c592e5b0925a3e1209b7bce2212d67c1435e5e4df708cdf5a5fb91f0119a61cebdbc7feae0eb0bcc7cc59fd675a5cf522af554e9dc35eea66e8a748ea65e4b279d4b7d9ea65e4b2759fccd14e44678f459b9cfc81a9dab1c573fcf3dab5cad52488799f4121e328a58c503be74f812fe46793464748c343af69ca8912e078f611f99f097249bce72edfd8264cb71f893c9dc4b4795f027f3e2850b1731312a150ccccb4bd7b9b8b4b4a45228140bcbe96432595b2a91481cb76d9a361a65594b0b463df5d55cc232074373c905067f57e6de75f8bb72e9a9d2db057f33979e7acbeda649e16f66eea8cb429de3f077ba7de9a8dbed95f0a7f5eda53f91aedd4422c163a463f81b9d44ba1ce40c90a4732289843f9849f6b2748bbfe752cca5fbfd1063ee8dc343469f868fd03cc2d8fb167b0e927b086c8b2db620ca47268f54867f81a824a49452c238853e3dc45d67ad073f133def5ef4e094292584efba6ad1efbafb56b61a0a424da46107281001138ed049f2240a29409103292861680a3afdf642f74d5522821a1dd27bac8e7c7f8bad4804c43f123e5e545ccd5bd2e78c45f2277d3e88901d20a9cfd028e13a49a4ff48bdf41fa45b5cc2a9b78e901d20af3448a99a22ddd6b96cd59a0a226407c8287528142364a76f7a80c856eaf32daf4895d08de8cd4f1c750708f4396cd2fd833d704913b55ceb6eebb8b8adf302e6e5d0c7fbac38c7c6c607909de80931e19d3443f2f1eee292fec21ee696b40b738ceaa9a30ef398db3ab706c3d5bcb60310a0ea2f6eea91ab8fa95835ca4234cd3cbd41120057f32dd457c87327bb8e1e22bb8ece3eb0d0886a847754a963cfee8e12252e475d49cb61aec98d449a91e7fb3fb055f5980349ddc5ebce8ba72e9278eeaa8b44f5d48e177747aee65dc4f4c031afba4d644f5d24f2a49a7da48e924fbd621fa8c36023e251cf89a4a72e77d44d1de6a2849027dd873ce9199659bb128022bd6c6739dd84a2dbbbcb72977b7acb353d75ed51b7c4cd701748e9347be60e4b921a532a90b226fb7ced568d3166b7d2b0f15ef72322236b1ece4ca426c7dbf806223555661e291d506107446aaa6821ef2577cb9cae95e29f0b47ab26ae6a687c3543b05007f05d278533569185c4d504a2b0f3b84790c88af887c27b45514a5fab97248400b2fc4edf60597661c8f28a2cabdcd1237af218c6113df9e739c506911722bf230f44be5e2f7a551ec84e116cfd74c2b65c5daeea3ccc3e6bef454ff2d02b79296b2aae81c2ca9d7cbddeaf26d7388f11a9a13123c57e3394684ea1a978c0d833b3698e78abb56fd3286b02bb23b2de23a69f7322ab6bfa36fdf73d211b4c91445c426546ebba237af03bd1831712579012892c0c57aebbae5fd8e94bb70877b77935ec1289132882c58444efbe57b308ec09b91f9e872892e5e104228b1e5e0891c8ea5c93250e12bd089bca0362ab87cde13d780bdf2dc9220dc2119ae511cae33c3c3c3046c176ddbbbf8be9ba9877476d9f690979ae28aa0115a04c3901d1508f15538a4869a59e19e5be84504208930841e3e028a26fe4a5a41ec35f6ce9d0ab88f300d881bef9700290e371c4557d00c4814074ab46afe27b4ad3c47fad051d38e2e71161d1fdac7170c01af19d71409c1c58237e3e07e2e0f8010823e27460f1b0c8521df00811217d536b36d2368e847106e0891e76c95d871fb858b46faa928f9b91311553ca9f97e3dd9a8616c1c2fb8c9a683d336b6c551e1e1e1e219d68d3da9193d3ad9a9a6e59b982ad96cdc99c082f9e2ca1ec1b52d6a29545444f3ee222493a8d2e6187e8567791be99f9c687367c204b798d462e0791e8490933c5423a399bb878e214a064780b9d3c891e13d1dbb1235b9d0dea82baa00c99647a082f554074b2b52357f010daaecb504726e1d1e9bc1d720569c428bc456f8350661520d9ed841c73f4aa619421f8448e07126468686808c627704913ec0910a57c6126b295ad204343434319081790900320a12550a8526444949b0aa655d02a32d4b1d2da068ab0271f9b4bd8dc57fac6872504dceb35edc4f5a84d13cfdda96da49235713d4ed986ef28bbcc19fe36b015d92880299a8d4623c7df084f9c204ad00da248d1051d1c2a00c2104ef044080727d089ef0a978043abd066da63cc2ed8ad67e499dc5758ecd725acb7b245cab4d1eb9bfb417fcca869b797f4d2e5be6d8f9c0f7b1236a293ab7afbc8f9289dc34658b9aa2f3dd6532dd88f46aedf72e476b36ba3d1878cde55727ba1e221353206b2566b71d7d8837c5f7a8028479985958744a04f8e4d06ad67a48f798a8da0bfb011560b37421daa05cb85431c681dc3f6b552bc5661b43dd4e307adb3434b3fe7bc91b93d1a35d7e8fca6a9e67bbe9b9a97bdf155b18b7e0a691dfb068350aec322ab1d1659fa9e3dfb5f5f61c3d09de1dd06ef03f005ddba04d2372c59d61ad89fae071742a6df8f703845a6df64f1b263d83bd912229b05ab6042640b2e8142110c9484bfeac915bd06a78061d808ccd486d2f7881e3d94ecd337317934faa0933c822f181d760b2ee915fd6874c8829641a6a7565898b1cb0824a5c43089d9c014d95944e9bb6f96bc6fb6d3ef882cd802226fb784c8afabc8f277d23f1e3e1fb60b2f7a20a774bb69a82dfe643a12c5462087e9e9152c2cb250c80af68355323d7c156825b6601550284aa6a743961e3a61d22c08865641b36095e8d1be199d66a72ca74350327de30f4aa1f7f3c02004abd0d1354dd3344dd3344dd3344dd31e3395191e48df6cdae1a17c623749af7b346afaa6fe3ac925ac1cdaa3ef9a75162d87662d91a7bf3c95b4258dbcdc38ba952cd7c3347ae30c7b9884455c6c618294524a29258c03d017884a95884dbcfcaca9f1bc3f1e203e498410085abc16ef9c829daf4dd38f078879aa541477e724145a40eb86dd1659f206775234752a778c4b6e6c43de07ee367d833be5fe0920d377dfe8b1d1e1f01657f41f01327d175992bb922646daacd845a7bcb611d72349ae9a36ba84c7ae6d1a4aafe5d1ac97b9e26f0319feb0c9bbc1ae434096479f7dd34d2ec785bf1df9b2f1faa6a3317a4dd3d09fdb381d2a4db5611e326b9759a3b4468fcebe51a5720bd6e9d872863b2e073d8dbec94edf9fcc1866237af4d9b5691a7a3a053b4f95d46e9a8f66cc236293e395bbab9918644bd54da306ab5df4a20755b13df8cbbb52d03aa22096c2365b28d8066d76cf9e3bbabb714ef46077376c1a88a3ea29a85091b18b6a9a1851f0f2337771051f3d9b1e393876440f7a9e67436234a287c25028a18b0931806c0d0c183536306a60c4784eb4912143c6b5a9b1510323c6e36d62c888516313037fcf3030eaefbe06fa5e6323f1b44ae0e3af207b26c6805891fc15636465a05b15d737c018679caf15cff899777f55c3b465c5938afde0929de8c9cf89092972797becc0113dd91591ad79c3860d1a34666662cc17933fb824cb2bd8af898476a490d0d504ad539a1c42645d97a4cc652d6ed7ddf28baccd9e304e3931d2fc2d650de66679b98ff1d86f34341a8238b01e288852115943f4894889324681fac6468e7409a555723c85429744ca247a4d28109d92a5bccd89a82b7d5384ca22b22426b73ad2b06da34b644bb5933dc346409dfa243a1a5d4293c8cdf1a819c33f1965a24397c816aa28431571a8222054d18b136a50020c54a42871844e4c72032c085d41a8044980030e74e229100d6a0ea3532e1a8429d010ec578172fc25718ae78a5a1633312c8c981c196f19872143c687c0e3d891430e8ff10f3e67470e8747400e1f02774496f752f74f2643f82243e822431893a196e12843980cb30c2196a14b8657862d19d20c53197e4289a329c353c66e5c0ef1e71d5ef3ee8e1c1c0d34731c393ba097b343063e4675d183f108b6c6864d0e8733cf9979fc8e193cad9226600e3836d0573383a3c74c8e35706606dfcbbc7011a38279e95c5a52281618c540c509de046fe14bf0240e7e83d746f0d9456f849710420942ae91954406cc9ea0e990b9a59c524e18adedbabe501c34ad042d8c32c7a41756bd9079c149d3f4b58d43759694056dd2344b9ac62e61d299b2385135d88f3a41a5648040d34a16568917942ab2368db5d1af89c1e8557d5044164554b91c9b93182b2d2514560ee57e57b71e242c678760bf67398499dc2f713a6272c684d2ecc23cc2cac330c9dd51a13cb30b41540855017d201768162ccc900bf203d3070a0b878294c8d80d0a0afae407600da68ffcc0f4a9504c1f0a34bd30abd428354adfc4a6e9ce39d1a314a314a3f448f4a21004bad531e56226eff8e81b4f0142f46a267f312ed97e3118562bae465cc05a5f0586e5c0248de8a263fed9ae2ffcc1be09fa01d638c61047b65a721d04ac11ebe123a53f401c0330418a1c65a6af5bd3c01b00e2701d04c489b09421135a087b4becb57239b0245d4790610af017338cb469600dc89d801ec6be20ad428764cbc31fb592a93744b1c894525ab15a6ba573ced9dd17a594d64a29a594527a8cd24a2ba5b4564ae96844693ddd4129a4c7d137f05a94adb76e3556d883526aa39edea01427d3dbf44d3d3dfc8cd0694729a5d829a554524a8f51fa7a7d507a4a29a5f7e8e97b86e22125225289286387760836c66b2d619c50381d59aed71a0ef6fabc8c651a6b3bf69195c82283d5b803d09905ab1a026e91ed53b9253787bf1dd92667d75a08889a479f59b032b7cc167f1bc8a3e7c41d1f7d638f95fec94c2a9d74c8fdb0e591bd94ca1432ed253af4d1fcb510111b1ba3dbe4cfcb5accf46a18e36834b34d4261b5d16876d7ae1316d96d66c18eb86f444414595562cbc78e14e0c53ea2577039344ca9442f7239b46bd9f5d134d8e105b280ae81e1285823f3c7f421d9326135e7e4181d3b8fc6e9b1a36fb22734d0e85f4f91b1e3e89b9145595ab71ae1a8870d1f1a87882a80c6c98137b07f5afe6c640c2763b7f9cce9ed62a2879d0ad9510ff6d150df64c7646949d360a750b0d8b32b859a06db891e76787d440f7b7681401c06740decd8b190b17f8d848c4920539ea6c11eb17b34628b52892bec58c574287ad8898632f69ec1f09012d1285a2680bac0240a3e42528a90b98a3ab28c6cb93b2833e5d4439b61e7b984ed74508755a0007aae831a008a00391e9aa1c1d02cdab3458e6cc8f15a8fcd0199c85dbe55aeb2c33c898e2ac3aa067430a967b8a57b129d97bbdc3e73b92f99cb8bc53f2d6fa9180641a0ee7a29aff346ffbad6713900e95f7622dc55405c49f285af77beee10d3af5945f4e290101174e2038be015222b255864a1157b6a066bba13d6b832fc8d9edd62080483a6c0fc41a02f492e61086461903d84f982381fbc70c8e7bd608dcb4228a65b2da66400e44e82164bae6b6330431a72fc8468a8a15dcff295e9555d6fa02e1c9167cf664fcf3eab648c68fbc7f249f48dce82a195d1598e80d187b0fc7400ee19fe58b21cdd7fbac32ab155644db7ef0c3324b252e22651e9704a0301d91bd1b381514a38c33fdda1502704854c183e81e193e85133d82fc9079f1c60c21ad727be608d3963addf72e9d9b5d2854ea257fa074bbfee77247fd7b37afd70dd3e47421f225b2e61e804fa1001a1152522a8d169790a671fcca30b0b5bf10feadb854455a0955a6112d18b49e42331ff741deeb89a30300936eb00b45cf9eae13abd98d6def52264abd4abeb515e385a254d645804d78156620f552091914954c58a119a97e423314fe041640b85b7b882873145d78d95889ae935ecce5ff7b6216b11ca8e9304afb81a880b4599cb015befa09a1eba8a4e3175456b1a597926cb5f9452bcc19a65f5f48397e94872d775bbe8c951111dc38e8c9d8a4152283272360c768ef03432337689d86cd48aa54c64799be5132b6c866bcf28af0de37a6c186700dc34930a557839117db2fc623eaf8683c7461fbd8f8a2dd844ae5a3b1a62d124bbcc9a6439b7ebba606cf5582d72d8a1152c8ab288ac7a78256bdcbfc893e5c82663db3bf735bac5db19de1f6e3bf69961122cd43007717c121d2ee29f129631ec357d63934ba46be54a9ebb140cb675482f9d8b4da2278d20dd06454f5e335dee767308b01942274e36d3e5a0137b9bf0417a091b21a98c81055be890f0e54a3e09fa055b7f5d977a21aa78c099639657c43fdc2f0d6a9195c52c92e2b3f8f8d81357f2b066c8e588d7364ce6d91314afb48285411a078bec757fb6d30b396c84e698fd484149864e9e4416a4024a6c913014ba64a655ec1799f464f926b1b57d26c08240a6887b73f148c41677f9d8c3d17cc1b843b660afaeeb5f5f397125bf43e228fd7b31655d2761b7362c24621c37e8bf1b3a3221b205833af9a0a018242f1824afaeb336432b72251f310cfad9a8b82e0c852015d1bbca307f4126593e32892c2aa5d0ab66e52b5768af5bf90a1382a2273b7f300808961cb12bfe7650645101856ca01369e52cb9a3b062099d8abf6a2ffc759246eea6b9bef91b9145f14fcf5bdbe52afab4b0414a2989f4d090d65a9b48238f85be6ea32cd92df1755d57cf8aca1313e929a3484da001691a79655c0ed816482c123df9231613b1c9f2822c7bf91db295ba349201892c23dc8d1ca9d9025d43fe489731d034b2556402b155048789348d125a38207d43caf2d748d6c29de53f5247712a2158def21f2c6f49fd07aa05777225edbfae74d27322772db49884bd5a5b3a34fdf493e90e81279d64310966fb120f1510a5211ae40eed752d6ea5db19e29cbadd1b3bae00ba863c768fd84c80a69136145316581b6b8fb4b2b7d843ac5198503ac1c29e521a4112b890e11418ab60adfd574dff2ccbbf672ff5afa6e5392d37755197e59eaee9da8cb600f264230c748fc39f57b3e1af264bad8172da8b873c3d2589948cf1c4581f873022638f4132f658d3537a4aad405cc4a6008568402bf6694b56aeba6bb2e429aed1935db0f14de9e7253fa758fba132112f4b2c89a0750c8b9329edc668d309270d4abb60e9630be3e1e1e121820e7db76da05e751be66d340b635dc7c939f1c2eae73ffc93d1aca3f88111f294c236573377a0f54ccc8cec06d0731d8d068c971c10a55cf3a3619b1bda67b8bbdd96abecda6db9cab937ae0d785bc2c89f03f27519b39abf08e4eb910382660cbf69e23569c444bc1c69c42a1e8ff8025eae99f234622b2676f25d6da21a290fa4f0410b31b145597e2e1164024de429d0ad1d64c8354d23bf03c88a2c7db0b4892400e1111087046b2889ac79c9d3b9a1d190e51bcaabfbeafe9492e7e74cd3cc39af6b5e17a59316e5ce210985f40751b821880a4c5061ca8c1aef979e9f0c188db3c11ad7a67e869e40d39abb2e8803a36bc0f76a7ec27fa43c3f54230ade12f284f2ba44bc7c01c998690636b5dae46913679a868837c2970a7eaae07bde50416c93b3c47629b0f09f25ba7650e3c9e71bb1a51d63414d7e5de589b2248a2bf91a85adaf784213d8ae57f4d2e601915573c52bca6de5cef628fd84e4eb2b225f57f61ed1db215b369c8d0d1ad19315069606cf8c024aae93be6f67edf1eae8cc7d1ea175a9c9768ccba17d04731cb5aeebc9aabefbe65aa269eabf1c702e25ba467d1f616b4b51ca577414dd0af25d3968271a8a369c210c9d156c14ba2ea1fe1a82b966a1715a0ac9a049255f5bc8f5b589fd2c9e6bb0303f6b583c945cffd5b42e257a8561239af081fdba11dd9534fc808a0e86bb9b58605b879a20043e3aad0302b9c5163a4dc47fdd96bf4f8b4a227af5823ad855f9b88c50c9636ff9856d5257e52365844abe055328497464904db65dfd753db9aa975358fbec9f97312591758a2c96e9d3abfa79845cefd341619dc8f539c8f557159b2f2dae2cae29950a5b45ae5472fd5ca2e70e7afea02711727d7d81ad39aa0b2c6cd23a90fb518d3e97b0f5a3fa6ba88a4b896e5121b9852722e4a1123b269647c995c5776171f95429d7948b8a4ba3344da550046d21d32884465888a87361da44ae2a294f1efb51a126b95e16c17e748b5cebe9167d035b417a553ff157e916444da68f8d56e4aabeb6e008cbe5ef1c10ec9713b9ba7ef9c855954e3ee9443ae99b110d818d908bd7e611f6bb7c1050fa374fbaae07dc2174740612bd7a1e253c84ac4c2cfcac4761d9247a9505d72ad1abbf381d273c4b57cb1ab695ee2837d74d72ad42d1ab873cf98b4d8cc091742257f5b58e3a4b27f4953a3145c995fe9340d7f4914e646bfad49274922b69f4e92359f057472353b5783a895e25ddc94414ec377d723d13d38946b91ca449924eb0f423b0f17a92eb377c3111bd7aadf1e5d334f522d0e2bb4ace9e136b082c8cd7a0c040415bd978c9349decaa7c60cf8e61dd92d12b7959a25242fcb9d878e915fcad147f2e39bbf5dadb9530dc72058734d08cf2081a6cd8b061c32ef5f56184c4465c5ca80214f14974121075a207248464a0355362f5c213c698af4bfc751947febb1ef1dde245edec3a6b639ddfa237259c6269e4791af6c2465aa24c83d6dd90d4eaebb305e175e712a2276908be2087d7ae2b9bab41c0ab62f708cdf3fac9ec1122a0a20915aaac90e02384ca10851dbeeb9beb12a6618576e372bf91e04314e7254f1f9f5d18e5cc18c6f03725f688fb4a15d878986184935e58d3a03a9873223c81d6a51c59ad96ab899355ec901b8df007b5eeb4ecce4e76b2de19bd9a29c5f2755d19c368ae35cb641e8d3619ebb66d19e93accf5c2b0eb5eb56ed7a5d975e7486ad78ddb75c90b398ecb48d72f659c92043358a1d07a265e8f524a2a25a5d7bcaeee96f06a8853452942d60ef4e25bbe6ba217e3553e6ce916efc85554f9b01603a936b0b23ab14c48a085255e649d9e622fbefe78a43b83c0069d8a03fbd5e478a343d2843c0977aa1fd888243a246ce52ad61b583a04c4b2161bc6383d9021ae4cd8243a4974f2a55d39886c95dacaa66177e6895dd5c44610b0e33ab2639f99e6e680c88ee1f7d7812c21eed63a0244d7865d49e41d22553ce887e124994a3cf1d70120609e4d731de37e9859ca9c23afeb6e6fae3e27da44d6f6781b7de3a3876e2da057b1a6fbabc95cfe6a72c43b35b0d9d7427509ab7d74ecd6dcb1561ba3bd176d6aa2576760353c714de936b618a5d825a57c86d94b62d78575506122a59431d219634bc8b345531584a454a1a80a54602a4d92a0d224895290a2d6ae4d071524b4b845acc626139bb576b784758babf98e1d01a26a24dbfa8694e7777c4496fc3c90c882efe99b46429eaf36b023ad2a61bfe70d153dd50feea4eb1cae51fd209d3b87917027611bb99a6f9d897df81c405e0504fde8233c4455f3085fe02b228fde4023ac0262fb8687d06b18c708efc80f98e76e90d8c33c36bf80ae31f14e0d2cfd0010f214e7d8e8cdf95aaded84bcd7e4ec983b950616b5d519d878a87139b077d6b05ba90e2a4c2e2e4796516992719b0e2a4c72867550f1895e63b8b326af830a12913577e26a62b1859a66b1a483ad6866c1d2f78742e27462d99a446f4e6c629a945c8ee744c9e5e867f376fe79794e942fcf895a9661212fb9af8db6606716ec9c5c8eec73e2984fb9b3c0b81cd9e7121663d2374efa06e7fa4b8b583125b9fe2aaa9b505cd51755a069ea079eb8e106b9361a72fd87cde083abfa0f6b8190a6a9f4cac482fd36a22b4a6cd50b689ea1e6295822d1abef3cfaf6d65e24d32b7d33b35f55e2aa96feddb0ff6cd098896943b72ad0ab7a23e2aa1e3ec9f5df65e546097f1791c5df35d4562ea1b67205e5cae1af0a699afac8fd3073868b88de46b41145af5e8be8d52cbb1482cdb85f3c57a2574faf10e512e9f573c8924ad6746241a5aa88ad97d76fd5cbd9b5b9448faccf7044afbe08203fddeb677478095b84e4f1727d11d9da417dfae6e6ba248889159040091294d0f9604fae2de7619ef80392339c13bd7a98ab0e73d5bfe7eb46e8e9daa6d56ca46d1c09db4a5c8f5fb1d9ebb5ec9e548fb930cfb298c360238a88e9aec24614e9845cef6eebc4dcd699a70c73fa95c81a723a3dfbd4845c7763a269ea4f7773225fee0625aeeae7dd6e707f72bd9c54e143c57bcab524d77f3772662367ef99d8a257bab7ae2871559fa17276d8381b51d7a8cfb8907d469696b3d7c83a7179de3b3728f5fb21db9e48655876a3e59f9733d4bf9bb3979cdd94b3db88ad8d48d644d67cf64cb2e4ecb56f4ecf700a6f4f3cd9c2c6fc6d4f646b1392ab9abaa2c8568e5cd55717fc59148e827a0bfe64f2e9d22b4d53cf93eba1cd3ebb907d76e1742984d3a510ece9b0c806e5ea23345bb40dbdaaf8bb98c8f5292c94ebd524cbbc9828fe6a3dbd82dda444895edd9e8850f2e9777be26e4fa2573fadf06d4f727d4bf6cd49647d31cf57a09cfd23027df2e6e46e3e59b031cf7f9b4fae4e226bb25267d99e882cfafacd27b250af3446d988be2b0ad15625b62e295794e8d5c7fc5d4154cc39e71f1059d72f9f5ce5137b31115b34e212d9aabf7c22cb844abdfee2b9944416cbebaf9ec86a79fd854464d9b071d3512dd76ea98bba5b14d942d547c9f5db93c83a41391d9e9800e99b513ec57c3af96c4c54fc61d9bb5bf44a2b91b3d337746beb89597645e9557d964dfc691711ba45afc855ed2b4a3ecb3f7a856eb4466fcebe7665238c6341a15028140a8542a15028140a8562e14698a75dd948db3852c966236de348258b6d948abdea73222cb2d93c12bd7a219185bd9e4891bea1afad45aea373acd3ebb5110b0b0b0b0b0b0b0b0b0b0b0b0b4b3d9d4ea7d3e9743a9d4ea7d3e974c26836e706e9893ec345f59db367f533eb5cb38f88cde4729c2e24b298f44de7fa23b1d53aad85925c91c8f5140b761e756dded4b5e628a557b05df4eab32221d1abf44aaecf683dd522b688c4557d9d5848f4eaed87f2ea379eb6823abd446c72a4f09644f4ea7322ea6e4ca2574fadb027bc2d895e3d0bde7a3626b99e56c17edfd693eb85c856f7fa2291655fbff14456ccf59b922ccbb23f20b24ecf4e573eb15ef4aed388ad6e7bfd8cd737da2dae8fe91b522932aeb5676736548c1887818a89818a21e33931c6f3bc1b8392713b540c198f8f9121031523234674829dc156604fe869cbd8f410edc9730c163e81c18c7d56ccc29abe817d793967d7bed1b2fc8435e8964dc7186343215cd7f375d993e575c9272c615b0930b8923f9b3c44afe2bf1a957c3f3bfc8ffac648faf5102369c247bf1e09ccb2512dd2344dd86f436ddbfb3372e29f984eb68040dc710504f6142902be753428cc99e529bffd478cdfe291942ecf7d6eff41fd8774fa049582c2249f97b7ce867a416d54ca86da509b67bb1d0edaaeb91d19152d5d15f56c5037ebb38fb04999a04e7c8e958682845efcf35cbcc068a8cbbd7449aa520c942128b2d53a344a9e53c3db9c285b45c39edd7a8590b72f4da28ac4148fe47479cdc545fdc52dd10bb3cc6d426ea6db3a261a25daff9037c9dbcb23393dbe75e0bc2623c53f56075efa848e9c73fe9eed2697c3c8b5514e55ff43defe47fc76991caa1d8e747a2d37e2766446774706ebe8513d10797b20f1db55d95fbc755c5c7b17ffb1fd054662fa76171849133e4c58957d7bfc762427accab0aa6221ece57d6c8fb797dac671246a3117ac85b25c755d0e735bfe7253b717f5ed965eeab0128e2ba1522d2e2cad83e22cccecc18e1225a46f3fedd89b6827571b8512bd894a5263cb19b49e693c291405b0325e9118b5458f06166200da983c13571d5950a74efc0de269915082166bccfbb0d3f7edb03f7f1d8db766ec6cd3fb3cef163d1d6c9109424064743ef0b0aaa9b93545b4b8f26b9ae8557c4f0d106a1194903f1915c32713f648c8a324b21af6744f5674e5e682f8681d5828944590dc75d6ca2aadcdf1b5a97c7711cd3880f9a63ee28a62217265a588edad33cffd87fc26cfc923e13edf6880ad6e28050871aed844b6b677b1046eb802e442a66f28864cafcbfe319e55d94f6f1d5a3ae93fec8974d349f490881e5aa1874235397245a1d8af81764a58b5d3451831c618ff6cbef00ecc89141172f1f0a4585e4ad6844addd67941b1f0f4f0f4408917095342bab08b8429215d90e7e592fe7b8289711897899c466fe0079a86b6e01170454f4fa751fe20cf28beb79d1ff204e1c6f82f0c99c39c322115e8168c42afe86996d92c3e1bc97e3d3ec68801e3cda9307cda91c1d74d40eb4097efac94c82c6145f64d678a93e9e190e530d4ed7f95985e824e281553a247a7102c9c92a10e3d1c92ad9fd2c79e19fa4122ef32fe2873bbffbac8b8ade3ddd699b950e8a150f824c3900926323d3d14a2afd99bdb79fdcd2e7d948a21141917e6de7d59bdb80639adb36d24fc804aee2ce446820fb6c8dadcb6d2f6124652fae6a384b72369399db0dc91d85a2284486ccd2ba19f3fb058363257b77526102ce48ca846ffc1fdffb15de6f5abdb3a9453ed742ebf7e5a122b69e29a71d20f32c9340a4d431f2f248a9e14e08a7ec22b640a859a867e3e6139ed90bbae496e6775edeeacb012fc7b6d8485e0fe03d92e73cf7bebc8f865fc87cc3d8c64bbcc6560244df8d82e7324dcffd6d1e006498f711fa4c730823be917f6713a0c6cc4f6d35b270132986aa77b025aa7fb0f97cef7b6ce676acb5dd498ab9e13314dcedc96e7705d1cdf98dfabfa2fcc65eecb61fef2022be9eef2844bf702a38a71d1e2429584270a9410b098dea79f48256b42a56e4b7a96cb7293f0c4eba4edf33e485875c96fb8f4ed3f48e7b0ea3a12d58555427037fdc7768b91d86f3761244df8b0df8ec4543a5d7448aee84d44999e6425d38d9e8b3c999a6eeb581e58d883214ff4e8e7e5f522091673688116ad45c5c6ae4d5c491bd193346ccc4baf2d92e10f8d891ec51628c6e80229ced0372f72b4dd62d5985adf43208ffab9c4d63a04c4229573cadc59bd5b7b34e63131d3d6e8158384e16e1a3af1b125a65882145744c92dc5154ef20eb9a520ba92eb0f30637687ec1ca619d87e11592b8e56c95cd2413cbae5c91db3ad90e7f4646b875ccd779db571368700992fc833b91f608efd1d7d18a253ee77ff6b219ce729c703e778ed821d49b0691a480459e4061a014fdfc8e78f4456e39ffaf922222bfe6b2df27c91c89282088b7c24b2e6fbf6144488928b889027b21a5f3677ad75c225d8141e295030591886c5f989ebbc6a920bc616683df3d5ccfafee65d3166fa787feab51a4faf8761d8bb1e2f1e314e1c13bdfa5a3314a14c1184cb896ed55ec597de1de631970afae689c8c2a25c52224bf64d4be1823bfc5d3078c130f8bb94e818fc5d39c88fc1b0ab1ed3181673af25f76a123d0a85fd6ac6ae84926648e0ac277a9189ef7a92e3f65d4baed3e393bea9427d9345df688fc79af4cdf6784c0a46d437a4c757257de3a46fece32b157d637a7c2dea9b9e1797798644b6e40cdd924bdad035c8789cd02de9c409159c64c189179c6091836e4921212784a010aa5104e5f81a826ec97a02db821cafd419c82b573456846e4d9f30f89cc1a70d3e95274809414e08a242c660d0ad59a4866ed1289d1345580e8a94a8171c9a60213841bea2d02d0a743551d485c15e0164850a045b841c9520ad7501e5e8ee7071a512d9b30485fa5751ff4a4e52a9544cc9c49b6e9c22d4d222d422d422d4f2e823afb8b8c82b2ef28a8bbce2f24f468ba689ddbb77efa64ff74f66a8696ab5b67b09824f6897c82c8269a282994530b3086616c1cca22cd375d6aaee8ea691e93a6b63806ab5b693c9f49f4cfea8951c254ff46217f399a6897f7165ee07a39700733fa8820f0221472be408872f2af145256419f9c9ddfae2b60e0c764dd67831b99a5c4b6ac7441922ad6766c3771b2ac6cad585f9b66dceff83e168d560354035d193d2899d426fd060bc123d082115b6f13ca5010760444fb6503d61fc9b47cd181359b394a74c9e2ff2e4f27491674c9e5a9eaa3c4779c2e499e5f992e76bdfd04f2c4f973caf3c5bf2a479a6f2f589caa87f72e61f4b9e8f7d837d9af23ce599d5cfdbbe89f1792dc68d41a1b28c878f81928f9111c3b8d5097626077c2ff3c2458c0ae6a57369994fcd25535891a19d47cdb39ce64df376be34cf358d76b38addd834f3d79d7306622dd0befe37fa97fdabff5430a7f2f7cd7ff1b6a3cf488b6ca83e11a7344d5f7009c5626e615a9944c6732d6ef18a6e453064f948d4372d91055b328f98fb41e696d316da72af9ea6a1125712090b2fef1723257ab80e015978288764cbfbea9027219e8ff82b4522f90831fc2e126419454a892ca0c8fae9b98ecce5e594be819797415444d6bc1c5d5e62218b26127d935d7e2e892ceef2934964912e3fa1f44de9f2f3891925b2b6cbcf2afac674f9391459a7cb4f2a91c572a95d7e6a4179222b75799a04f589aceed2e506e6f2744a64c55c9e0645968bcb5f3d7dd37279e944b672b8bc97bf48d0adcbe75241963d7802e25c45e8ab085710a888ad1a254a1551a864791a45e3d42a54ff68129cc8566dd2048a8c92e5e90c1aa73ef104ad4196a74a620bbb7285227185326943e354266fc8f2978f6c614444b2850149202b12a8880a8d8351a1628594d8c27ca2cf94e84385138d8349919f4d640be3912b79f97982c6c192484194af520b2225595e86a1712e2d600d792dc62095d038171548abc4561d8a72888a9ca26241b3c8b2488b2b59febb94443a61c5461c29b35be9c46242a5b4cee5e51ab42e605e391d57761153a3d42a54b80a1897ae3679a236a94d9ec8f205a750572a93ee8acb95ca24cbb746245b354a8d4294e5b51a45b6ea50771d8a12eb90cb3b772c19a53da51da53dd5b10cd18ed2b08a072aa38ecaa8d41d7139aa14096324b560c9b5a4ee82c24352d7527769c13c52584767ed9a86594e18968550c62208d342969fa6cdfa48f1c1a464795a2271180f96c4a6613c581259fecab04aa405119116591e1b11552a40b255ab5c54204eb542d790aff8ab5958fc552cb2945890af5c1d3ac2bdf1fec8c45bc884ccad52e24abe02e17f5dcee1117f15a846318285558acc5572996bdabd978e06b77ba98e16b77ba78e26b77ba58e36b77ba38e766df7429d1c6e1d922b795cfae290781a4d4bac0a88d290789b3b77fe2256f1b099de663abab77522c743fafcaa43b30ec51e86d0cfdcf9a3f3c21ffd15f1107a158f99e7679e5832217da227bf4a94e56b942a05284795a9d835ec1211af63f111c6b4c46640e6f8a687179611ab781881f9ab4359be0ef5cd5064b56c092769089923ae434d232f7da06422b2a8ac4310ebc03f321f92c17d13339e9888a9f08162066298b273f2f5d51ce329add8b4c15ebb95d5601886b59414b78c3226a0ce23578e47ae490512a21044454f137c0070e4b23c3c3c472e28339b7602d1834288d8c8d6f64cde932dedb274e112ee5e994e2a034b297cad453adbd5eeed95fce8421fb2d491afcf8691f480c8c2f003601039e5912b4b22ae1c247a1005efc15bf8aec60b0a50a01777fadaadedba2e6ec34ee925af4bf906ba5eb57f7534bf2e5fb5c6af5ef4aa31a974a8644c75159a1e650ad10c000000009314002028100c084462a1583ca46b93f70114800e8da2566c5299874990a328841c51c00101000000000000800d0105b3b5d9835a4972a5c3b71d3dd93de6065294e6ce6f0ad6fa916b062d212fb3c4799170a032d150a0803d5195896d60415018d4b30facf00945050b7fd700f772e0d98e762129405aff7c5908b717154577f7dee431c49b99eda5408f87688f96583ccc42848bd74a6582ec150a9b158b1c2b98c20f6ce3031033d1f12dcb9e997df8891e05481302731e01f045c7a10fbbf2f076b4f123ca654701e3c097a2ad95433dba8b45f256e8ebe26eae6febae3663b28bee707e02678d453dcff3781aecd79362913dca0a8a4cdf5d71116a57378f3f8658d6491be025a5d9afaf6cf1867266d32be3adf50c88d90da4bde781cc9e0e65364a4fcbeaf286f2b865cbd52602b672c1965dd38f30c8b8318f81d1d47236d8a60efcd4436191f1b298d109154f7672c982c54d37678b3505af5f7407c1ec1983e3e34266074689271d82f1dc94ca66a4d8a6b5153a5d4b5424688e3f7ee5cc3118ba4a409937c819dd0d2766d61cf1be37f5390cfbad6c0dee430c2af7a03178f43a1e1588e7471f7bdf8ff1bc9ca2ca27f087f0f64fb739e144b5f4f9d4dd161d0db28ac230454fb435440809946df1c21220b2a560fc97a0730cef104867413762d53bbc271009d9e0e70dc326fca782c91ba138d3100ad470080ab90479825be079b1fd2422f8695434dba27a2e52b97fc757d4dd53e38f98d584d9932060e06cffcde5f7553691642a37247e74ba0720ee2227daf5956e7ddafe361ba750d52a492d8073c28280ec278e13c317497d9b3f282d8e0a24e992d40f78b08da39ed7e956521084f0ee73731e845522f58d92ca4a16459a5064a5e6e255208571d4efd109405858677a01670cae2241d8379242caec75aaac99a8bfa6c77c5c8fb89b6ca8dd61e15c857a8161303e609bf823889fe3e01a64ef19dde381bd1ac3f79428f892c6e3249d4b95662927001b6d845be7197742cd9e3f85b1b720a2d5fef6e38217b4a62658980ffbdff6a7df4810464130beddc552a7b70d12e869ba9fb44ef2e06f7ab08a6637388c381494a74fe035ae3d177ca18fd79170b320302d6465883d039fac301dbefae55e088f7043b6334de237825bd298cd1fdae0fef757fe0a30bae2f4ee5c27aff0c61f3c1349073bf93c0275e10aa6bc0b1a619f05ae5a4ac2e67932d98b95f35c5aeba612270dd1c67c17af0ea9e752b5c7fb9d060fd8786ba634c3b27644a2cddbfe37e9b96b3a0974a8d1c1a0fd99b3a7d62f94d249f080dfcd9b83418568ddefef42b71f2c1bc8d749c008fc14a07fcf65660aae3dbd0224e36f23a2eec0143c3db7cdf81c0eea2be4d9f8b5e8b012f482575509e28126cc8b335960f8b194b6452b8be3cc0fb5a4bf4dcf0f553502e37a6d8c957ad4c5390b17305aa8530f5cb05d5fa700f182936edcb7646c1d3f0399fd2e53e1b67ebbf97e2c44a278ebfb4b3616a9666eb8654a59326e048fefebaf698832ba595fb2ce57af7c7c43589906c24acb23aa496b83af79f4af444dde5d718187a0e98e8653372fae44a09b852dcc6af32b9257b6603ee9f8f663641c69dbe641b97b82df1391a54efcf7c9bfa90908959191c9a62652571addcec63f70caf75965d97c4aac7dd3158ac004b38a515a9fa58581524c9a78e7295eaab4b79d729c3cc10fddb65edf1b7a60a60e3b25a6c729f8f8c717fcb8f0aafe8bc6e30b9d8efd8c86c394f91ce3165880d40cb2948b639761dad527911c53f79d8e52e325f28b6c21e0d94f9297c3abbd0e6cf82d4677fca03ce0ee77c7e3393b4d268cfd022b8e1c3f4adae0bb201efd18e530aab636241d1e4272372b8f23912c09fa1b7dcefa4f0162da054ac56d112b5b46afd07248fe03d962a975fe640d07ec96d83077c356f4a9f8e744ac9cd8734b79e2aadb99ae4d6f16821dbcb399ab724a80a01dcc242ccc9440f51f4e14617848fd16c0cd94dbf8672b16cb044a4c8b7457728f4d075e3f3d91a92c29f2398049d72267f2285dc84635bda9b929ff7325cae547ad6026edef062325111e79c30a5b260115fc7063efb175c61b72e4b20c88243cc7e090071e17262ba936b7c66edd1292263a83afb4664ad91e1cc14a338d2d49c45fa21e75da8fd1b7bf6936834ffb75abdfbd13b0de53070e641585bff4abab9758650b897cd5cb4445cdf42b38da5ba9871021719ff7b62dcc95fe43bf1bb6966233da4a89980cec943327b7d048810a67877b697f5a1e05b0e9249d5046777b26040aa3daf1dac64b1180e6882429454cb2166bc301017e2b32723a10c284529a81aed31ea35402b864438261a8e9fe93d85873154986065ef03818274807583a1609c1ca4ed0a90d8cf5d4cbdcdba213f56d65696259a56d4b98819346da164bf68b2e28140b000091b5f0fdc89add87cd7e5193a4506a82c2abdc34dd683379909ecde7bf4e51ec997e6c3af8fb1ae54583173371e929209405c51ef77d2250c21b8f54fdf396a5ab548b3953839d88303af5f725b7c89bce1001208de16e3242b025de680975188bc4dbccb40e628d8847ca74fc0de51c3f8758c6c3f9286b4bfcc24d2a16c7dfa525d70e5ea42a68fad72b52b89b757082218371fe218e1441659269b0ba4cab97230e41b18ef437d968d055c6cd0e80837a3df8a43d1c613a20fcd199550a4754a7ae9a4f55255252785170bb5c2065e952d7b8ada3f4e51cee626387aac6da53663b4459d6f3084a40366429cc75730ae04bc78b8b9d39b84027432ed8cebbe7702a1677821a6d47bf0de208494afc065aa4624307a988b304d1a697ccfb5b780356cecc0925d7d3c326651521c74ae857c32a232e0409616fd78db4f1fcb4b5a89cc4c7d3d1311f068db9cd529f11a4373c8c8d9cddfbbb306e5dbaa35d98907cab158cf719cf4e49ade221f822f4e55d6c0ee28969a80f307d95f840008d936b2164f7be81b0e230e5b97667c4f9e8062d86bd3564b146eee7816ca7daaee95f4c6c478b97446b43448566751d5f82897628c9dbad4b97613f8125fbc4899f4aacfe35c3173eb8a51cfc823d9e0675ba21ef9ee98c077f29bfe8090627dc5ede41c22876bd7e8221b12ea386f508192236ffabb14690548ccb36c0898fce90778a7fa06cb669304d06751c246bbb94528272786b6d4112b9961daad62dfa106e609f6065d57519a90edb7d329a3ad100003413e64ca2794801b14d59ac31c8e744927441498a15cb20938854e96963b42de11f6378ce4e8592f5cf3e8a7dd0569f9be5583b22de972d176f3fdf9aba0c4fa802c32b99eaa3a068bc9ca42259db009ac627c5a244b6cfe9ad72cb4c08794f24d482964bb1642c52e819e826690686fe3dc06bbda589114005bb5641f4401b88a9bc518194340352d04600b4fde551d90648db7aec90f9f1d111a55d32fd6b092beb0c77cffb581d4ea9536cfcafc86a53f1391d763bb6d16f7704432180e908e351fd6e27e03a40311ede59b5b2bffe0449f2f4cce9fc3ca2db985dbafd3d0adace005a21a5c5514a28a2083fbab3138d768d5405ee620a2edddab4b5b13c90ae061e8d67e08d672bee3225ba092982f3c49e4c8b4040125006b236361414dd8d4d8e7e8f2f3910b2d65d90ee443e989082a5534f6e8a7c965ac015ee298011e2e687144547d9be749254d25ff28f73943066b81f0883289deda80b8ff208b776da1bf42bac844edf68bf7feaff9e24c028d804ec400be0ebc1f1c5d6709cc83c2856070242595df52da278aa09417f4e0441d382abc64d77d97c7cac9974ff4a9bd4a4f8337b73e24f2f2a014961310bb6eee1d3b626e93f9be330411675c65adb409de5da4a62cf8156a6f2d31e082ddde7aa6176a5868d7e76e37a88a63ed255f8b5d61a301075c500eb92d7901b93efc3fff219ad6e623b29c59670a9733723eb78d83afc9557cb4c7c55084e38325b6b5ce1c8e4c81879411b76fbb4ebbf5124ecce71d6e62af5d62a4459326f4de408474804680eda40e598db1a0cb1547738b68caa03f79cc6da3e7c67044588d349410202673c424bf5e8ef13eac9d912b588f522db73812a2cfec34e91be6faf51ef2567da6670183da4c3b5a55c7584253c7a63499d43a3b16422be35100d8fc5d949b5d29deb095c5640f2231b8e5d256b00241a9e5c29555d16fc5955286a6587a82c84483610f3f21d7ee0c0e3a827db479c4a1ee82722b6f868a937d8b1ac61c9c5fd0cbaf81e1e2c4402cdb4cfc265134e61f0eb9148cfdc708a35b6b2decf3f97fe3fc87ef706dc9c9d2ae6c61589a67ea38c13e1355c8f9196f4dc463e31ec4e66140ed938e4b23f26fb7507dc5937d628ef33eecfed0c61a9b44cbca23b4fb74c003a9927f119fb51944578217fbb37796f1e1bb55fcd359512fceaa718c12ba48ff18ec1c308936bd2353949250c09398c74470adfec2934d12a181f2894f3e0d3f09927aaf136cd0d58b13efbd26dc73dd71bc2f38ce78c3dd0a6be8dc8e0452a3bbf1edd29458ad090833d5e0eebd8be166eab114682b974087f13b480de9a6b3404cff5d742da74406a6897c8a20362d76c62f15e54ad8dab59f585f7aae8250afc12477028db1e90ec58d1f2df223f674d57496d79355860065ee73dec9d7c9cdb52d5d82d2f62167c3fe36477763aafe5b8b1926033684c23d3a2a73564b178d696d6945c2ea880eff5c3ee283aff0a6d679c0e40e31227ee01ffa098eb62d466e1a81ed4fdf0b85202966fda35eafcc80154d648190ac91f06ee9c7cb510e68f9c1b7f00a87c7c7668361e1355c7c57d58a07aaec5715884d80d3b6e6aa5758a7420e44dcad0c2716021c7573091448c40069dc1e5b881cb7c3c9344b7bd6cf47c644ca4957fca5606c59f5750d564e5657757d27dcb2e7b198b64dc19ac56f13fc65ab9b33f7288f2da060a88a7605f619c474fdddd1b14f73c108d68bd9b170816d488b6b0dc4763615a5e17c108e7fc46fe713deedf63a8d8e905592e1d0ed37c2a1c1f0c963264457f6b8c3fc6e68160d4d69cba3929b8f663f9c9510de2cb162c62bf4ea9060cb6ebdf5112e1280f31f7ef98aef681428fe29e6b889b6cbedb96620a7d214f55ff59ebd5089f1f53d55054fa2dc4d9a2759926624186cd83b135f61575385285d729711c8d8e3c93f9969dcf268933295da67407bb7964dc1ea26a9190b7ceea3940a4ca196000c9af5c00af776f83794c09b84b1c91c00b7a3e754aa97dcefed20acb1db447a2da758e4526dd3c584d4846c06d6419725a5e1524e06cc3d1f3121db951f4160cabe93122440b86a1cad33a66cb907d2d8e9ab0e24b684ef5bd65b3ef12c9172173d51927ae36d1097db0247c64bc5fbbc156af0be240fb9ed8105be2d4b716e0243c87181cb9a37fa78b96dfcaa1d6736e1b8cd821aa1e5a7687b76a0f160c950df380ec72124dc7840dc2e716ed66653fce9d96cae6083e74673470127df28458be0b6f530eb26b8f11583d2a0498bd50017b0325c81b5083791345b03739a4953a6669daf20128813fb456c7fb1f0997d04ad99f35520382727b1e39e821e88c1eaecf93368f053c7dd9110bbda0c0e96ad837c060ce5a39d73810a9ea8f3facdb903564f8040474c8b02c7dcbb62565215778133f860effdd6283606dc52e8dc8dcad1f9448bd637c6b9b3958b0803543047bae4c0716d15b706b9839659509924baeeadb3531e06d1cd7d96b0e0460bc168a6637070f24bd9ed2aed36ffc4975913a4be18309dbec2c8d8423608280cd7b401910d77fbd873da1a15f7434f707dd4dec9600ae1ba656349d0dcd9e23d63e777e6264c486928c89fbc013b8361d441d3e033efc5ab0ef6484512194919cae7b6b2ab8e11e598868a0e903be5fefc9b5edf077bd6c9d229a05fee07cd97954e6e4dcf1bd2ab12338de31cbe909b4555b032efaeb4ba1b13c9f65cf7e07695f58fb56743d8901f36a76788c46afdee6e91df30fc8254a865bbb092c9ecfe1273f423be12c8c4ba1c6c8582d1add7d4f3e1d46315b818b05fa81a24d5ee6cb6713c7e05a990a0efb386c423c6e29ece386e877b971c20b85a660db7c50662d446468e824348c75b59a693b925d3c6c0d009e089b4d3986371287c386f0b95f0db906e46f479fbe03861512385f2c2ffc718625e8a510854823a8caa1dc83c926ebd79d29ec067702601025ece790075146a11791ae34f043454525b993014df1fa6991eb7b9e184b1a6c8ddad55ff8d9c7a61901ff506936c5b73081fd810ccccb70ba4bfa040f4c38d29a470d568f4c72c56f96c0ae6f932536caa25a1fab0dc0c25165d7b41d7824d73effd2fb45c5312d660035cc9ca8cb259a6d09b2115d6b6db1ec6ed38a9bedd869f33fc65c128252a69f5c6ed3fac99becb4d37240eb4df4e29bf0594efcc84404f7d252c1d71c03f1079d76d8e53af70d6bdec0af38ffadc42c92639d0d35b315c178f45008817f2bd5e425ae6c0e966d34d386cc6d834af8540409d641b9c62da3be74db84a63fc10e77e0f22789441935926a55a2bacd1bdf00d04df0d006ed3c5215d8cc732feac351e9edc4d988ae2ce121f7207e3c35719f445de3f27e7b8f1268d18d6d8663b0731251d58193645353915649d2c754ce1d04cbb3523519b2e73ea2a480b321f368d45448df9e8c8008a6f01ba85445e2ccecd4c347270b48664cea300e0125157dd72e2362808121f66df061a5eeae246508a68d36bb205e1ab701916836879ab9d5c050b518f619d17ecb031b0c53f26da2d27865377fcbd8e9fc48672b1ac5a76f1207f28fedd26869c70ec3ca91be8f6f0aac3a6dd8ea295610ec88cd3b8bde55f49a3e5d52505b6eb5531fe652c39a89151fd31a9eb13bef527677c85b3c0092ac8ee0814ab533e126c10a422e3209d06e91b26b57f417c49c60fc9f04168dfab9b73fedbffb5f5336b03440d76edd802e7c8de4d68de82a39ec6304d0e9c88c9dee6bc3885ea40772fe25e364f62235368175cb53bdc75eaa126919514eaf6de7171d244c85684fe943d298e3b0187c02d758c9c4bd2356c4de455f70ed86d1c27344240185e7bb58f822893aef765e0334ebd435627d1f4e9a1175e3f6459128065ee2a540a1492b527e41744f6e396b701633e900b9c9a7404a36453bd1ac3dd0d76f12b73c4d08ed996b6bdae13df3bd6b0f0eec1813b9ee3ff389c8d06fc7f23fc743190d8e5313f3b3dfd3d3a2063742681eecd925ac3ff7b2d63fa50013a7a503b1b641b60ed0b8409994e0460fc4da8544c894364e4bd95f34a275172550dcad8f11cb64b066d06d0025c02d87a9a657dca522fe7dce6883daf4c34448f219f74b6ced5322e5ce1c3941f7ca280a1fdc70905f2b6bc195b574aa71ac796ec1ce2f9fe5624236e9bcd35897222bae12c3ff1f4e5a4a433744a019520a84d4da7c2024b3ab40d867eef52b23413d0aebd8cc59a86bd0a0e0b1150986274d457d8542f86ae024ae9b46cb7ddb74b5776705b311049408dfe2e7ad880d98daef3f078a96a1042ff41dc60c34053b970d8657ba61fdeb23b6fa2131a0ecdef46e962950971e80367a58603995b62cc4e9f41d4197ec3bb31fbab53b39064c5014476e26f0836c97a74b1c3e69c39a66607ee123c96d1d20621cb32a04e34eeb40ca83f1959b31995ff4a8d119e4152d152e918c0734b9e7fe522c83054a28b4bb4af374b20abd956a4caa48d857c5ff950fa7b400cb7aab67589f711c0086018837f21b2f55a4f0cd0cc990be88113ecaf2fd93228a969d3a08da5bf9408ed7274db84fdb72794e88298965cb07200e03906950c1855418d71548a1069a41690deae3a500dcff9e7fd31a331ec2640cdb469f72f06b2a0cae00917054fa2a567b1426def8a68df4db9506a54342cb37941764b5f7dd1b8531001fef57d2f708cf04eae38eee13ca98728c9403f7272a57c751488d88471a2f07dbd6ca7666364ae8082df05b1fdf2cc64b03379b9bd36640e405a6c582ed2f987fc3cda58c5938da6d269c6d27180e4d8c309d238a24453bf361486acc07bc02e3e9bd92d663545a3109d69c4e68a29c8d5face1b54e4ea07c442afe06ee0dee9b0d37d20fb11359a89213ab8e1590d4748afef5074341bd14271976d86186102ec23ad15ba21f8c9273d0096ba23b589e3b88a877244659203c07fb68cd82716e29d1e0395824042a80b09794eddb1e30babe73b080249bd9a076c488c67c0520bf00237d72711dbdb72c8540b12296cad8dfeb6ca1158d1c6b60a949172182d720114c5409fb3b1323d84afec10eb0c2c23a5e6fd0c00441bfa1683ac1ca9b26a3839eb40d20f656b69776744c335eeaa1dc75f98e43fb7f6a9a769915bbe465720f6bb19460c39f15af9192b91b6850c6c71b86b6a21b34fa2a22038ca071ca571cae6c331a7d624d362df51835083f16b269e717a72f928139499ac70248d534ff02e820fd0dcf29a8ee5d9ccd7e156b1743d14fd2ab77c79f0e9b38e9c18af9c63ad630983f9b60f190e2ce01536f8219343f47db1600cfa4e1829c48c055f8471ab44a83a07cb389dab5c5138f0bd808f9067aaa64fc4da4aaf60ac3cc61333ecde9331f7093489bdc4bc83b8ccc61b55e03d15944ec40933e77ce9c44fbe3557391f61b80bc7e8f7e00d0037f0020be7f005cda6170d17e1e206fa7e06235d5cb0e521cb2316630c8e00191d660c1d6621e2a63218df58e53c011126f382bc281040b6b4266f6d512468f32166d862181e66bfc2726921cc15ba643d2760818b56a37f0f9d458a20181815486b04d151ca0c5c92b9676757c7cfdd92a914b773700c823d31ed4261eab0e6d589e69fc8dc39c400f3e3b192a10a67a2116e956d91b37b204803735bc2b81161ebec6a2603145e4e8fca2f06b898711a1332cbae1b4a553d206f9aa63fe33e626ff2c43890d78f62b1e8bd9d01b44920b1608bf644e9345bfff55520097e2ca700dbb83ababdac625c3029a781febb133b0ac8f807f5c092da51e758cd40b1c162a6c4fa60d987c8304a79c80632de599d7d8868cb0c244dc2a5ceb4d43d5f7e623645e024a890af8e3e7caa4e7a11e801afaa7450378fe1696605b1b0c3a907230cab4844b4f63027a208b0bb0db50a5c872fc82d187953edc9f5e5abaa8daa396781bc9e2da142a74118c117d1880b02a45cf9c460d9825d541593c70a16502ea622ffaaedafc4f3138b4bcfe8b80dc8248c2d7422a55b204c4eb926a5ba5900ddf024880214f30cd0053f5f70996b4e633667198ea2cbfbc61382af41f312aa7d1b926306e8965b9ba77a2111a7697f183b3d8152594fe510e824069f40ddd8653c763b1010aecc4e27eefdabbb6db13e8bd8504e66d62521969cbc068d66b28cd028ff9ba74873a3375fff8fd61453cf260f653556cb3e2ce3b5a1760fa72633cc9a6ad42fe19b63c81bd536a73423f91e6398a15e2a8a29f39fa1388c90a989fab5c4d7588a81a0c4a6474458133878b6ff2debe5ed3ef79a37b4bbaeb533d3cbdf4b4d244e67d696468b4bd0e57d9bfbd135d4474d328781dc533f1ee55fd76451b897b371fda2e0254ab471a05ce3829ef7faebd9412388c93852238226341b65c13050de9a6bf557fac971e411c1384051f82edd30ec42ef5c398a4072e0ad861c100fa6711715ade39721175704d098f1b5cdf0c90232bba76ee584561f919c35f56eae25f76138aa7df0267c494cbea5c0d7bb00b90ebbed12af1015af73e3e0b35f4b72a5d132209a85bdf4a43045d13f06f5fa6a1d8b3aa9b3b8af9cb010f0ab6b1905ed59a47caaf1dd6f8b4f20571f8dd4ec90855f7e1a5557e8ab768d8cac2c0fe34f967767f50e18b8485bc526c1671919fe217791127203ba3dbe7bae2207b752503d82e2934eff74e3ac4ed421dda267206b60d47739e70612b7635fe919fa6a94d57d1d8b4f8e56676a34ffd6cb08369261c1ae94695ed18b9b2c10582cd714345702b7531ef4af9f36132ee497c7bb71357abff431224464c9c929eaa545db3d745e406e047f7bc1bca5655741187c22487d2b2327ca0ae85c4f4c6e18c873b240380a22521098886ba691d9419e21e9b855c0d594c30376418d3b29729dd1722adc8d7e882f2b70e45b966d05521c529d9fde1932d9828b6bc317be58a7c144687298c7737c420faab79a5730905242eb5a77fec0a889eda79d4c85aa4298b13b727e0dbbaf8c6e2060c1ff91aab1ab04e0923ba25edce2c5ab8ba7803456c8487d76cd05776c6a028792d85429d67422fd7f5de5acfcfba1dc12542c7bbda42f9809af836cecf03c994529800282af4c3d0fd012b1fc45f6d01b21a785bb52e1b6576a6c81bfedd4c4977ed3ca7ecc44cd0eb5cd3da0e781bfe76bdc55dee121e810dfde06ef74581c11bf38affcd01001ef054b3232fccbb9b03c5df0bccc29168ec5695adb26818b0bbc16c80fd6e06df839727e85f910bc30fdcad0d8425474b1400f7010bb606e3111205b09295f017bde58d0064ccad0362811bae6b0d10231582196cde6f64567f8b25276e4744202e0aecfa686f32fbb56ca9581c91e526aa3b25d7254d1613c029a5d115a4ab399b89f08586d244b4c18dda41d2c06bb4fc43cd4f4353edbe9a525b5a5bba219cafa61b98bf4c354b99052d7d26fd47c7e933e46027ef8b4c6ea74d9e86eca16b0d8375f29bb6301f626a3b34f505f5a13283edc02f745dc9a7ac3a94e9852385400f7ea32f76e800a947790cd08cc19661c0c2a522bb143644da7e0609a8c85b9b9c485fdcaf183226310994a264d08d39a5f42756aa6828659a43c10101c5e5ec4e8d6a3859ecaa6fbfb4d316e5f01a9538648b417055f74fb6456fb62f1c294ac6e757951cce8baa4f8de93872132c4f0be372fbd97b6de91aa95266fd4e6badd9ad97cfc7e3709e2b07558abe067515c4f26d221248e4658d812fcef609e8a181bca165aae03f9eb580f35f150d63dc7c91f31b9357d1bdb1b1697e825336953c0ee0cc6a842ee949d262865388129f2bdc994ae8d86c0bf2e89a6f8de9009aceea3b7a3d635673b445501b32cd528e8e0cb06e9e744d073bcd151209a6cf6d96f0ffe03d221d9e2ad941bd57f2a73c281ad64297938153db167f53d3cd0c3eb8b9d9a102d76081ee1c2dbea37e671ca92a4a98c113686f098e56198719f129b9d476a4993b823edea10001545dcef644eb79982765afb9209413311ba28c88d5475fa304a992d2a29c07ef1c1ae60440656ef0a6faced862f0fe290e67acb18c9177008d2f8d5ce84da1deaf638019ea34211688da0f8ecef5f916856b3c831c0635b45dce2368c43a18fb62da2ef093204e4ccd5e5c251416cc2dda95e72a4225a8a8d050780c8b69f0344bf24767517518832e5909254e0ddeaf786b2283c2744b1d445866f30272bbd6356d17961305aaa84bf85768285b62136e41981379ee5171c675aaf42a52be71e28a864388881099f790a0b090c370921b4a44c5efb8f29ad571b1507fed47049045ecd5dbfecf497841daff47c361bc0d5499b3a80b5a299ae3a19ed2ff06c9e4aacc4a0035df7986932cc418b715fa9932425ecad6345fcd63995f6a8f4a959d3fffb37b316023ee241dfa56cb5f901eb9611b2ed7aaaf4ce6519dc1100cce586916f31c33fec4ce7049eb0af9778df8c63bb9f9179051a3a9f158f83a7236471e7d42785e9a3836c905d8c829528e203dab82c0d7d2ad1a95996a2289b40bc44c8e1b00493285b8461e5250044310b764a9df757f732322956dcfd29c6446bbcc8dea6bdfd250d0b82d9e1232947a01cc8674e9c70e17ee28c90e85eda31eebde7186c271c36248eb631ffa895f507807a7f4cdef1987e114f8f7623b4c84719d988ce588aba6b12f1347d526fd288d5f65f27bb71e4189bd98984ef3905e10d66c9895939ef98053fb6e3b0c46292fd8abb9c79a0508049176b29ed694a0e9535b4a25c42bf4a5d88afa89508aa482a2ba16336e44e96b34b2e3d91cf987849ed3671ce2c87c3857eed3a8bbad51cedbabf2f8dad9adf670858058d5bdc37c1021ebedc63952337e18e5a33b09d21b6ea4b836502f8522207a3593f4c269659394880f5d453a50158330a401eb6b4e0f371f7e447a1c9bbf608b34e8574486c8fdf3ed0838fe0aea7fc2901c2f91205988cd446972cc053b15100125532014f1f4c40d31381508a91778690d760635dc267c74a2584906157b4dee696ef4e44beb932949bfc4910085e0aaff97d009db0142e14e4eb7b07ccdda88d8840d358f8cd6f07d1e4ddaa469b5398c8845b40c00cc57b05b2998e49e7b47fd84c5fa120885171f3e2a0415078deee75ff9056241ffd417030834e1a5bebf2e6b8aacf0c612e5d90d53716cf3b2645ba8c250e5d4e403b160b63ec14587c57a5b55108dc4ca0ba1e32d7b526e23ffd50e1f60c4d817ed8ebd4dfa722f692eda8a3541084bc758fc6bfad34eefffc4f65f9fe455b79656fa21d3c254b1b2efb50acf067cde5f83f5c295d8b53f21dca3cdb4b4090141144c9ba95eda3b92f6d2b8d7f0d941748643cb2d76a42d81835f6877058385114856b265f314bad529ccec6c8d480eb4a4a27ba4d63ed7722579912c95db6c09d8ce74a283f6a001ca23211cae3e031e4299cc2e77cfd0a9cb138bdbae9744b279ffe514cdcdf7405a26075f8daf3258cf01bc07688dcf79ee130bea62ae75b621683d18ea665409051530c60745c15bb6fd0c1ec3c64d56cc538b2d0182e21be53c2aa6e76002935463d2951df6c00db316caf061c81058206e1e9f8a9206091880c9eb2038ea01fe85f2e69b7e8d6bf41793e155505d100bcb3a415f0ef4aab81bc2c209b651d71b2b4c72ea8a73a608a0ba759863544e90a2046c19f40e7a2cc44b8d44773ecad4fb675d646ed15ff1fb404f7442d04a0c94f90a8543b9dd2f5e6cf6a58fea908e94a5073119609098ab29278d3e0c6c342c7be803422d245cdc60968bd0b2b52a557123c3db9b915bf17a2300f46f7a8e9c975456537a5472ddb233d5ba0330a39113150d470dc930917802630c8b386e14a46daaa606c6bd908a71dac445fa10e530e869013839d68eaba99bc373a1c68f8ceb781a18eb4c717df20d6ad203cde3321e4402179251a18f9b094e89542378429cbf819d18724b095b09eb19f94a37b49409648d51939af69c1d13b22efe3dcb34a387e232ba82f784235a71279270a5ead07e6202979f277a5b9a433119853c75fb09d0a42267ea6501ecd28940c47ad506d607d6078e5e69bdb3b8fa8d7c5b0b78ffb59a99fae287db44ef88a8bf1b007bb5200b12a1e766d8d346b37c46fe53d02da63d840c31cc1cec5a03469bf71ae6f675a6c82663d0c90bfed794f1529069a0009c6454fe9bc1650c8168a9e10b626d93181a1514e325f28fe3d0b4c07400136bb66eb513ae5a3a39a56d6c695a31eadce7e9f809e72818422b713a1b968eaa704eb939d0740fd8d810b2270dd46182b0c37d27508fc2a7ed30fec8eac2f1f0f8da0b9706f4dbbf93c97f0df6bff8f125dc1f3923a0f2a9bd13871113c829d23530404e7b9b45da5170f28db56302c551023c33fd4e94aa6de0f7e3ad0c0634c1d7899116d5c1ee2e52e0c2ebdb8f3f2c1348666cba7fdaa7881a5abc3b3dd2cfd36b8ecbb86712b5a57f2b2698613eb07afe7bc24d8108349981b7323f860945928aa4f0d3890572d677973b2e9b47d31e0d0d11f203d1257ba9fd02fa0bf5dfcd70f1e54d31e1600640f62eca3782ddac1df7eb3ad8e7bf8322ee4e76dc99c57dd06985bb52b09304aa4232683d035fb997e9b8b5d1bce738f57c469ee1b67547e3b1cbe739d02d86830eebb6f44f28bbe2267543fdb1121011a6e4bbc25e859a504a1ccf73c1f83ac9f174d1de405661c4b75610b7ff6d89618cecb9cd467de98991c7feb7fe7154f940f74b85c96d032bbc5ffd6bb38ebf6c5436a2f67b8d6272e0a69da0d774a7c8df7d6e4aae5a15d27c63719459b32a7eedd5d83cf6a757cfa841c6f70d1cb9347032292c7004d088ab7199f39ac34b2affabc84b37c7818b3196fd4401a38bb35fce5a6eb23d45f53ee292a6f1fa4ea54791ddcfa536fda46aee7442ed8a298930af67b68810cbcc692ee96340f9f565231d8088612fe6a0ef30600342e50caf82e4af23b960e25deb3a7c77535dbe926b2b254eda26a7aebcd5e831ba2030652d416c9493962cf2f34568b436b949675a9c766b5e90ff39544d77d94be59ed01ac18349c5bf4410a68f5b91d36dc8ba2def2ad0fc94be0f1611c5f635d867fb760c38ea3aa0f2bf866a18150c51f348fcdb25462265d6b26de6e183eada69beab6c715d67f348b6b4a89ba75c3dbbc6e12582bd5e10a9533a55a5056ad1072cc1376893cb09273809ee761416b8c34a3b6dc840cf296069c54edf1e0e9989bdf64b2b1432b8f0be1a186f0de2a96550981fadf7976c92cfd231368880edc2ef11ae155f8997bb071b49f1047c71b688e9d469cfcbdf6b1d095dadadc3a8e3b58b458c46a2d79c8a91dc4c412186756162125b7ca1d5a0c9a40e882367d3174568bebe1cb0ccdaa3722fbefda24160791578a582d1b1ce0f4037949354a7b49bb79d19f864dd62e96522f3ece53a78dc7b9325c66fca224d24939800d048126949d63a58353faed178e85df8c567d39ef84625111f04cbfb401628a50b0ac43eebb5a207dde5fbdd7dd5c7a9ddb1a55191670f8d968188df5caf304306a7fa1fcf5c4f42f8218b1ff985df43ec0e32dbb14505931d036cc186f73cf998852e53ee34eb7c76ca87b74069d43c48a46f4ea580805d4347ac22fd05a5280d49c4063237676992155448c1ea3296f7951e8a74bf2eb4b0227502a940957d34674eeb394268331feed2c3c94024944ae22789794b244f836559e6072dbac936419eaceddb85be91003b851702884232e82ae1b86fa07bc2710259759bd302202a0e4480b028a0e900ddd1b1d4251f4118218fab416d8a44a198da682f638862f93c417e4b1c18eb68eba01b1e933094eb02f6170d7941be03ce7fb9f65a680b9f02dc073c9e5eb3b1427710cfe5176ba9664000626b8ff901aa70ceba50f84b8c3378dd013751aac39e09f33976642f498cd902804d0a1a056db7883541f7dfc7046fae6010fe938c988b164c58cc94e97b43f0c785085df5ef2285fdc7b670c1b312c0db8e29fd1fa8108043aa5dc8f4679a0d6b49bdc5f7a9221fc99d80b75f8041208d062117fef46c66bb0cd454063224095affd02172a155683532f1e6855cd0281a859d84a4538b21f45ba684ee8866fba18ba2e4d5d79c08c92256447e33fcd742483a31faf61276c030abcb226436b308b9feccb82e79a6712d1247f5c6e31588caa489844d7f1c241bfa71001b771a1786610d9a57657eeb10bc728f406eac48cf40abfa339979d2a65979deda37f403f72aa27bc1e56f92c35915e9733d854f58ce06b1c210dbced00dc2cc098e3a9fabe5b95890e56fc7e346d7794ab1c915906061c90fc09d053d44979134c67796493432f7b6defac53d07ae33b4a0b926df59897943af8238a88e273ab2d57295cdcace3710150b18b8b434d2a9cfbfe594856fa8cf6008c930ae54f9b4ffd302c808ac6511835fd3566bb9d6cf13e7d30241e30adba399344d19301e5986a448c9bb0e94890c106008918199e7042b400fccd009cb30bb31d07c0ae46397ea26a7de117196aafa22984488cc7c9b565108212e8c87640551374853e6c9b7f8eac97d9d30227c0ba35049fe12693120408969d2975fa1ad687cc6400431e325cf183003cf58525dbbd67e5e9ebcdc264ad9de4689b3e47a0df71fd30b5821932cc122d59ae795d1cad625a492f26a1a09efd8076a34034cc0b4ae226ba566651573af560e40cae4f39d512f972a8e4faed028b762d3b8d5e578c011d0dd193a701f07d1f6dd966076afb8816ae51a930c0f0ecfe4fc9bf1d12450e8788cb5c84b4a0cb15a0312db8a3c89fb45bc29300b6c35b58072269e60223ebaca178b27fc93710c147d4edeb5871f1f76c04b56a27ef3038670739a5797ed82c6697fa688fbc0e5687dab7ec0154d65c40864ae59794f04632e1136e17f9dda4fb88a907522be60543c2590ed863c30882552209036a3ba9f7ff315036afd086a58403c600402cff2c102e5fb837dc912895bdd1dfc6bd70f394f7200e8731e38575d0c1b231e16dd5e4845b6c1558790f13ea503c5c8e50de90b756c2fe92f55837501ba504ef4bd5e0423ca9ac04778b7ee904673f03c3f943679ff147df1efe3540f490c6fb79220a2fb6b7b8fda7ef08e6fdaddbd35fe1f52a1d4b8968fcca96a3e7e99b56aa6504e28570b13e0aa8bc5e7ff98c5b3e2788ea5239113399cc3a81339e4e67e75359086c6493cc7bba654f82872db22c7a4b7827d51eba461e320e01b4f2b00d808fea301094f52f1092f7451c7c6c1d24600af5982d7670f62b61031e813e32371c0e4b79a7ca00c3a80bfa93c5f11f5dcf7ed9c4d81624d47f834f7c92daf77de0bb52866c9393899309e56de131898eeea26c7f0551bb8157c7b818ac1034490bc383512a40c14eef6b0f01f192633d940d8e20b8b6d724def5f24d80e1507b65392842ff76a63b9633a1df7e7377eb1213d029c6e6433d132093d61b5338e0461a5d787fb527d4afb94feb2140d0f2d589b8189fb58a22dcb98f8bd3850c055d17d1dcb053b682502fa069dd87db7dd35f45b7f3e5c138d945169ec65101bca7dc8df2d86808f9673bb7586873369d4ce8b8bb45c20e3153a4d0c2383e32715bb1fa419196cbc0425e32c92d4567fad9c8563f8b7816fab32592f643034f17e73d40915935013a13db9a0cce19765ecf196f9010f28da935bb9257a2feecc396dbe7b8615eeadd1e33986d47eec251ece7d2f766a65614e2666e9fbd4f6707f7571024e9f520aa08095ce192c3622ad994fe31139225563a670da99cb9eff5bba867aec82b2c8548b5f06d7c288fd783c0fc276225475191651cd5978b9ea2ee122565f03b1bbf43471ae3a1f8e7c5f6c72d97d8af78903fa4a15ef8343076d258af585039a56fa6b553c611430b3963e0aa0d22824b8dbf081fb27890121e761d49919346d603ba2f4db73adde50cd045f0d3ed4f23fd2625b1f2e67863068168117571ae516277a62134fbc9cf36e7a16647f902dba7eb3dd063f2b05028bbdb354a2192e5beebe0ce3547c24f7220b20945ec5291c6495af86ba82c4ebedff158448a687e7eb8a0c8aa6be669c80e0d8938cda04f1154ac5cf6980d00b305373f592127e453f8efc0a564a86a1e1ea82cb2c8649b7be2a8cc5059cd59ee9ca03788d79bd67906d9e5faac2ba1752f8d71fc00ac85b4d4362640ed03ef4ede7bd3d8d48056dc7b884970a0322747cc89b271f4002e8e8d5e3606f3e202722b210dcd200de6e76bd18f4bd8aa3b0fdce775a4aeadc49ab8fa33263814f3213cf06b3c94cf28165c4714cbe36267340455a7d10c89e28cee99b3e73f03b1b475cb7368ee2f9b7ca29375ad5c0149af5857b0edc6505a20613b70639a0a0bde9ac81c346e80a8896f0366aeded9ad0091258269bbb3b7b257bf701b07f77e37a3e7823879d788e3808d87401f42d5cd3ebe8a1ae2e559ef2ed23ca100760d23bd924c05cba08be7ee8837088f529c321848e3934a2d5ca7c0d495d0d9ce24f3d3aacd7e7b0fab7b6402a6e966b4b75b6020184b2d0fe47ad01bd0dc5498ae2a47707d876c8f77aceda7e64f8e51822571a2adfe655fe25abb46dbdb95384ccc20f5141ea4a949993840bde1ac259b0becd7463219b5256cec370803cd3c9370eb34da0c5f4596b569614805e420cdb739368e324862b98b21c914b063372116f17e6392e0b316cc664f624062244ecd4c422b8819e626bd8fef92d3e2b043182b8cf764cf0c9d70a082c89f49342a8e08c5006db0216ae82ba62fcdf780a9c5d23c629cc7945c41a19934ac57668ce8f47e6c0d94e85d9219553591f9822c6d85c2d9cd8b134fe26a3327b3f7266a07f896f358fc33f3a6950f6822b4837d3c42e638c184803a1cbcedcce6acc9a6053693b5f8f32fd58858816269346dd9a2423fa34a31611346c3e557b10c946577b4e923390b1052b071f2b963ef0ffe025e9151b318c16729dd8e3ff039dd2b7897031b3367cdd96461ddfaead33741161fbb62f620a92f286e2c0e443d1f5427c452d5a04d61bd6669052cb3543a8ded247a83eb770170c387e88416b616d9add434bee60a2a105c8f42df583db51b4980e72ab40ae70f8d14903aea075574ef49e0226a3a90bd28c09dd559e2ae794f1e6b3e548eb991badae70edaa6d627460f27478526905d1e188d2fcbc8263716171a7131c8fe97e82e00a659ff182ec45c95e989eea2695faceab435cfb611a58e9fc6f772b0dad7518c053f782579a12e4e15bd9544dde97852dc380c8c903f6057a02371a77cd075a900630b63c72039ef386ed2110ed41702a84b841eb94afad1c3c449e5f3ca229cf24ae3b6f51d5f46bd687810ed49146307950bd3de225456125990adb44e36ced2a039413e003ea65698d647bd247d374659e7341a0a347b4302c11e39c2f6d0e4e0299619bbdf98eb5d1dea6d36378b93533e9842ab250ce8e8d7c14f39a633c7bc50f07815a3b4cdb6fb2d2002a50dd1527edc84c34b0d366a85b362326ef00e93cf873f67cf25a8abc272385c806354c343b111ef55974174b90625b08421c295c381d9ca307572fae626252f47cab69e2ac3ade7c8e3510cc3edcf4411bbc4833a67832f4a497a8ec8af67d3f27399feadd583ccae2cb7eb2f168d5f815089de864c938e5c4dba3e002196934a43494e9b966af1cf1f946f616adefc0897157c2e6cf3889545eaf56bb20db8a713c4045519b88668e21f323e70cd4a2b0b501c5024dff373440560d38c38fcee2df5b6ee0c1b0a2d43b36c28db99dbbcd4b6a2331820d0a01f0e73238ed8e5510729a96432da704f221cce18cffdc4280c0de75c3d459dda9828ebaaab97e7f38e4b9f1fbfdfd56d6c8fa2d389736bbc093ec0d15225bb383974aee7e8d29a8aecf77ecd7b36b8613665f785fe2b97b6683e8fd9f0b0fd621be24cad6820c124569146e3ff9058cdb02cab5c514af0d74854ead8844124e557511563a551547089728c129e7ec40fff3d855e058fa006b71e4c03c80c093bd1c9375ead66fc1164fec71ae91991e2448c60b18b0321b4d6639209d0646fdfe25a6be2cdf57329235518b626142d79efa791ea79b43f0b0e198edd64f61eb8051750fda64a46634b0a0d45383638e503e0489f6710480b9550d2c1acf506fb48057525b506a465dd2ce840c86f71d9e8cdd6be9d1011d670d8c13603f5ebad5a375079163d497462c92f4012aaebc20aeda3cd5af9445235f945ddd4f9f0d4fc496627a0318cf8e1b1406540f526cdda97d82f9a1008b16bd83d6b4228a8b7270fe37144f6d1316faa9bb39ecf2724efee1e8929508b6077abb3971b9c0a1144d9f4be10d3a4ee4bfaeb35e8c90bc0e23f19c242c3fc3880beaa632c6ac29622a269fb95e9e7b56c8718b459663cc3b2474968eda766749221dfae1b3ee1528ad95d8355af51f8d8de8483203ad86b7f600d03238a9795800e2820cb741dcf4bdf6bbc6bd84cc92e83ecf3f921e4dfb95746fd8f81b8842369050f8b14a42611f8b60180b17a73615a5bc62b0cb9cbf6701a859d44800debdab5089a24b173ad01dfabc2e37077137bcb2007f025ac0c97f280899a9e88302bcd86b821d1b80c5f4974e183f3382aa00a8979803b3d95adbbe1cfa1ac45615949dc639d743ae7682ce69b9775d17a88fc0a026403c61bb22814001c8af663e3aacd415f7cf03a531d2381b2a39dd180d158d168f483dd90d7057b604107033eb0e3f8ed0e12514ece89d8cd196b0308c4bc78c4cbda566ae3dd975aae6be68ec89990291ea54ded919045ddac4ef22389ed1aa0f12b1ee4c03b8efc5d25684326efaac11f2bec9d40162992063731ac2e7e0bcf6d844cea221803346aaf489dd3532694d1a81b6845807b7a8d0b5fb1452838e9a6161c2d3a1ba47594c214f12f3cd7495de71fbad8db84b54eef2eb757ddfddf6d9a280d1b4377e77312f4969247e6976069e8e02fea2739327082db20684d1efbeebd739b6af2143bb7442ffeb37c872e19716058c9d2e150c9b31dce56e9f0db566d0694492e79c33403f9d17d02113cfdbbb589ace91f0a02720f1aaae8c1c434489030218c68a08cb737dff34a31fe903d6ef7dbdc3b325e03e3c3a7825f4df1964c3572e3d296157a0fee32841ce718d1585684b997bf38bcaaf6220770eb2efc531266d7c80f143db1dc73a92bfafa1fbefff5bbd57fe731f08f58a52d1522d2fcce013f9356df15eb14a32f384d27974cf38a77056ae11462c462f93164f1714463dbe79f912a349b6a017275c47eea4241a60d3c030f97241aee7d7d96d99d4e179afb3040a8050012e3f4abf8ba7a1bd90d6353d8828cb747cc539ab171f929722c38fc1baa9e5c8840a7eb2f34668a998b6b62e03391ebac3ef730e5348178ca482343e7833360672349b64ef9822556e71da7f6381ca18fa9254c36fccff12232446be6d0274f40d23ffeaf15ee014eb2f115f02c95a95d818922217a23a85857fb87064edc1a96c5888c1641773954c74dd6b16fc06979756dc5e2f250ab44bf4954ba0f6d290e6db1f431e0c159e5026e0fe8090f747c7015552e7de9f88a8e5d2668210b62731e65b55d00f543ff28d9e0b925db89b9bba4d2476b14d27923997080c0ca5adb1cedf1df7723ac8487f6a4b25d537713a9c3c49e6aaa4b51269f092fa00d4553e00536783d416248fed70d961f065c60d2530da0af9aef37a41186988a58af099750147506cdeafabb345b871ddd41a0c1411138cb84ecc19875e1cfd7c6eb4c8a7f0e39f943d00b469420b8c782ebf95b88de173d1ca00979a20695d9e2f51574a9a7d2b88c5534002acb1ffcc5f0b7ed8a752d4614489110a554edf570976438c0f566c13f205cdebb2239a3a92f38ab88c0c41f510e7312257ec7f9c28513a37443624b932dc42b1f612068700c9f8c655476486604d8422a4623fb9c84ea531b895166d7ed551ffef163bf5eadb9393548b884ba53880d8272d3c1baa3c19a75a530416095dc0796d175db8b54602c3f24cf34d5750b34351310ce66504662aeadca2ca8ac8d1dbeb3b3cb6c3a435d1f7e5a83974b205a19e418cc5cb709bc553c6dbd9532b4e883991b902067a633fe4a7c55e310054d5a85eaeeb7d105dd35f7baa17c9910fb283b74936feb59ce007c1c016633ec81c6c445e6e01a581418f700841f41b286753267ae3cc94b3271bade223325a59a55ec79bf09e9015ca931808f41379a310de0683b8b517e7270821b048aa85aaabc11a0cf6d6eaef3ba92a53f45494a3d8ce9699b1a8755e4433f2400eafd891a4b9004d422e9f7f69a45aab220026896d2e4e25c1f19620e4e080c83246e1dc063dfd43abc33f8ea94ca4a9cc3ad91637a1b1af47074d12789102376c60ac84634ccfaef71b2e48f67fe4a9b7ea3435a2d7200555801d723440188998470289a9d4aaff19f2bead2437e2dc976518e971084d2c2daa0e36594e338f8bfe6c04e9cd1128c4b9ac8937582040b83b7a320d4351eded8aa724430eebcd0d88e992b4cc2216d42e59bf894acebb4f307052f0bc3ba0ee9b709971ebbdb4d5f546baf36e869a811cb6414e4e176078bd699183cc0515773fe58a2a52cdbb85615d37db68c8b6b8db0318a23acf36bc0db18878dff881b4a2720610db3508b046118b02d2717f3c3e8a93e59c97c488873f7ed5239551a2f0576ec0290c78ae0d4c267245d0bd3c9323db6de57994b90bc50ab1bdf30fa3cca6f83a41333e7e14e96e87174e36e80019d036f750ccbaa8df9fe7ae8ae3a0a09314023be2a140914bf070bd3e2b64bf918d9499690054502f133320af031467e1988159f34acc0281621605407444f9e31366d3654b5c83d5b02854a6318add6ac1d8fd4a942d4e813e222dbf32b002a1e2042eba9401b2888e621571192dd3748670d87d5d737793ba21d6d6e12c94b034c732c1b2aea973d135770016d40630bf12e085f07a1a05d369acfe3fe2267ea9c6e6d2c3438f602af08de5b3e88cda6d3840df2fdb794a30d165715a3c3409ec0a94ff4c416dd8571e7f82cde1cdae90dcb000eb21ac8b44c88349fa67b05d0e07d80236ed17ae6058c4fcca56ebae528e367c1594c0e8b78477b72d084b375c0bcb5febb640a7203125377befc73b2b88c9607ffcac20e68488c456f72fe6d15a1bf7097123027f626b4251bcef06a85eb00da5f80b58978faa1e5e0364050213d7b4defe34d533c60062420a04e8c80d5b684bef193f7aa2a590c42ade9bc9b1184d958b199c4d4b6e0eb487c82029410d3411cccde79b47429a04931717298115149818cb0cc06189be8d5b2cca2b0f1aba7a5945766a740f3092d31eb679794ac532862e6122f3a3dc077a6fc20c214cf4ec93f53a50649f8cfb592a41227c38fef6e0858dc57d08fd2d93515dfd12fd8a05095eae91a2f97fc65de0a14adb5f89465f4ebf8a4ac132afc217ec12d58c2a93443ba48f8199d01457c47b9e7ac9582026b10145deeeef2ea565e4039e37b6961e71b3c032e3eb1d1bca617363b64528222a5c8f48d3915f40575bfad01f94faea11ec40c68446be5909ab11d7545a13d000017f88761e29b07083215f2c2bd74a2bb2fc8dbc54718bcb0007d8d3aff7084c3a41d2123ca7fc70bdfde176dea5ae5f040f311ae6f142a991a4ee7b1edb5400d61561f98242bcf4f9e93f11c09c2d3b6c362f24b97220b22a04236551e84a5e2c2abd35b1ad552f5f77ba6c83f0a55e86e75c1ba73a87fdc2705ef1029143c4620bbd014cdcc71aabd8262fa7de2c879232dade70fb5047a8ad4fbb05ea0f0e89e9cbbb6555ab82235870782fae57365ee987b8de86cc7f6edb015545ce30951ca585aafeaa44cd56198742c5d1108634e1eae12e80be5fe6facedb65fb0a559e8586961724819c63f94241262eefab0e017fc2a8f8d78508d2f8a63b33c444644a8c9f45e7eff2320d84bbc20d2a0724a176db257217ce8358e18ec74f05f77b6a734b1f31f641cb6a4a032c144322ff919b9c2649088a82ce02812214fe0c5f68ecbe065e0425025f5587214386cf8fbef30c55248392f548af6543a167b15d256fd04a55a22b76b1671cf8b769c998be6b33d6fbb63dcb1ed06f2faf6b96b7f841658be2ca67041e1098f3002542f6f5c64b07ded705c3cda01ad68622a9e68472a308ea2a1d5139d16976b0c23ab97f6fb495779f16b403f0d1657b53b4787b35e618a0781b0cb8cc93ba727a588b3aefeb90ce3d2af886d76b3ccd7d984347d69387be000774bb9ed5c33ef58fe8a4cda572f551b825f8d02c5915c406d1ce65d56fc3b75e04107da63a69f272cf37a52e1b2fe341c5b6d600c787a506506f71cf42f093a1a2ab68092d7da83a39d6f1e5379657794c990fbf11506542c3820e52ee370f46e92a4f746af0abf0a634f02ddae2f447da1bb95de7f12f03a986f0d1d597d3313c13b89f5ef58e8eb3aa752d496dc09deab8c67106fcd335236eb421238b5f4bb21f5511cd3a60933f1243c5dbf96c31a16db74e0b545b32ee775e13994eb09aa71423fb0e6abf94a31c400471d469dd0b97f3a45c39aa9c6cf72770fde55972e9ceec0402094c13ebd9f404c11673f7c685ab42d58cb7421998205fb82a13b20f5fd1a5ad08249fe027d03b615a3483b85a90f0ec1e1fa4808d773ac1c2ebcdf64eb076d29cf30b11f3e4dd5f3205691f85b8459e7970dac3484b6cb122ef92e6f32d30ae862f05914f45aa7fee94553b3163cd424d2805dcaba4dc0585f6b5610137e24a9b8659197a7c0b19a887cbd44c588ab6dff6036dc530e18ecd2385fa3901c5ac669dd51c7a8f32b3c508cbf19cab173204b6714884d6d763509791107cf8f77319d9723378f95d1e088f69fc611a2d77313932c14f13453efef2309553af9d7f0a410948f32490e1d604c5cab80b6852144083b60ab3c3f923d6ee4ffe5dd715c1bd7743c097531ad26b4eba14312e00303cf4f97f15135c249a6405a9d303e3b2f61adddf18a0fde0f73606d51b32be437020ceeedbe36f1c417b4913508ebfd9e4e09ebfe8fae66d132eaeb8a5e014dcf25dd569648f8538d7698bef655891e184e0c630ecc541743435b1f59ed537448a5c22ada021d142ddc8f9baa10724491fde9eae5f81f98aa3c2fce9e82df59a5d3f4ed946911fb29e44ab7c7bfc9806563e0e34afc1743aa31273343db5eda8f7529da9dc7082f1e82c6167e1f6ee8bc44521727af5bcf1917e8e4d6181cd0c35f6d0cc7ddee80b9ce6c61dbd6f821b09e77f2cb76a654009f8de18f1f216f712372b411cabab8e39c8266c58b3e790e0d05456eaadb4d017114a604bb4e52aaf25eaa26069a8692d25ea2fcc056929d60ee2de1f7825fb8d2e60b5a106de00e1245df3ed3f3c4041127943b001e532463202b9fae89870f84224a4dbdd2cb53ececa95d0c336b392b249cf782604f4093aaf1982c5ef9c3f52f43afedfd84a528cf6480d22fc0e68815a1e863309064372d8e05585f184d88986054cdcd21aa3475aea56570195855e7aebb9352d6fc5a19b88535313fc02b09fce447a72ca7122d1539ae47e1cc7175d7676d87dd04300af82894c92a5f00c929cd9eeb52c5cc2f25cc2b7a71888764e7e6bf599f52aff77b817f431b23077156146646d57ea04ffd676e0dc7d614607e62f543b1c420c577712a75983dea30d74613925e87b81d68a890b8b5abec28880004eac63ee2f281fac5c6900b893f3cd8f063526d156af821a91d4cde015fddd92d29e1436d781554c6ec68d04906c6897bb06eb4e2b444321bdc61ccfd1def3ea7655aa46888e42f34a18cd6160c80000823284ecaa73d40e2025340d47a3af2562512e3b6e486857f0e845e40635400e940c1d132455296a239294b4a31805f6d0c005cac12f6cbe9a7e5bdc68d36f84b549602107d7aa54118b94319ac1edcbf79280706cdefe33db01c98225c9bc4390da58d0610c5dc68f310acd19bc63464b4089fe195ea51b2ea37b03f7ef1777eab9ff7a168bfa9cd5119459733e4c1a988fe638b64f5b86bb2050d885584e8eb2649362a7a8d4277d7820911f31a261873bbfa6183d50699aeef1e6331da71b1986a3524d055d918cb17cd8ec47719565719064bb171d370bd7b2bfb886997a53505efcfe85ca0d650bb3436eb63b5452143904e76084e04f84dc61bb08fc7a326b970c63183a28650299f52e5e9ad9d188269bd09dec555307d571e6a27c3510c9a043eafc5a3462bd14121588260ec11cc512a8cd46b7849e429be31ca09ab6fe588d37c9849cd9597dde9d51a2a1bf400680595bcf81b9db492999f2768f9a138763693c8a689850814a13ce408f7e3211fc7136c45e46eea9adbcb8588df86642e02bdd8f7703a582bb94cb1455c7011d8c97b90ba798ecb096acb299898bbe6aed725a717592b5b93cc84c2d19f7952387a610e0a11e74366781a2898ee5a0e04e59fb428d14984a6afa5e11b18f0c10a7726424727885542f945221a73f490172472b87986d187154fceb3af0a11730fd344ded9ba60ae90149be21c6a0ae274002f4344d0e1b66879375c54fc71df42947c0746b3700fb3af5545f09b9d4895e7a0faab188fd01a3da4d38ef85a8bfb4fe57fe2a0544cdef3629d88abaf8aeaf3ccc6f1793c9f5fe22076482974a4dd66fe461d8d09cca8413dd5b840c50f9ad22815f473f6fa8b26032c16ccd13a1e9036d3eb7798ad3d180269af9a769887bbebd85e5b0fc7b59c0ffc42659c91a9437451780fea7b5bca036e77deb01bd466fcc19021aa12832ebac2804e48faf67265863da82d3f7d366a0668d9f51863c8cbd467720eba0b69b8c0dd2cb1045c8cb2c015cb61295fd1bb09fae636b250955a028318692372995b23dfc83521c11c4a6b4f2bdc20511f0fa76b2ee93d89c820750babe164274cf8d4147afde4d0da23ab02e18786261edbb6aa2e5a7a2ec8d9d79f72fb001bbd6009e68b8ee7c63088618a392eb424af6ab84331ddea1be805b3726aa64487ea8607ff94819ae8ba073b80cb542fa9a5332dd65c17db7e00cb71aa02fe525112b6e7d8601495be96786b2042d5f45ff719966f886b1574b50183127b6097850fffb81c512205114d70f47f18a12f46071c7e92c8ed9756581437633ba622002b9573a239f4937450f52112edf2796e7c9ef7799b5e3f892c428763023d99e191aee4ed52769af65fd7c48e3a99b43bf74446b767c24ff239699866a3c229a8b0b30a191171941773cbc9bc55f91333f9bb729dffe17789963f1398fba4cc4c591f24c546b7521b455cbe206a43984b956614f64813c3d31b7d9e51fc1667ae687f0b5f6f551a702430fae83eb192f348690a26911881be512a727bc03794b52aa8718c3cba37f0af45ac16e17254a7994c8bb44ba1c1e09533748f493d7360f8966531ef42d4146debe8c5ac59a667fb8601c6406cad4ed7f4e9d83b38feba087ca9055e7b9cc6852819c93e5a408b62276b42c9dcaf455a27b6413494b1523791ee8ea479eafe258506cebed1336647c16b49ad0e5239cca303fd588ae718714952b1109f09dcd27cd0e4c903b3a10e87dd8bf8fb54ca1444f1b480e48fb38777d8e3396aac53386933873cfb3524894318c39d8770e224b4b02376ab3791eb640d9430795f3e2243dd4747804ef11a76a0a3f01712c91e04405478b5a0e75ae8a067aee598a9b2bbaad0637a998ac8e21622f29561d95dba8533c4b1b182989dc1539462e274c1b544bf7668cc21c01ce7051dbc6ee46d389ba26f78856393779de814b744d30f10cfa048fe5b7a523251d74dd1ba7756fa7023a3d482d37b208403fa2f5209d147368026904fd0c9e2492688ab24a995cacb8611d42f95576fd837aa6516f6169c1b0c001a27656c9f9755b8ae549f58c570aaa8b8f7c15addc75613bcd5a968b69ad539df789328803bd51b07dfcc28186234f0b46f33ee7cd8ac35ae162dc146a9d7c8ee4ea10e528befaa57bf91481ec155d3f038539ba025a551fc4d14e81bafd11194f4ec902fd0dd7c7692b7e68396a9c48d15e2185ccf8b1a650fdf40a855b75c613f54da380891c1a0ca83afe56229b410ae013a52c00e07602f8a6a1fca80f2b39cc877b40b1567e9e3157be457ac03ea3f9a598abe1416739a81bc300f45c234f5d6be7a879ae5fbadf333322082c8cf586ab23eacb6ebaaae67697908a675d55671a43ccb2e01ca2bad0317377a21bba15d92583378a9bf66326dcb086e456bed3fa482ee927e3ca86e3bca2682a314539a72d43f61d83836b322933b805dc321a5c1b7530bbb67b81bb902670755abaff43f45f0d2e2f633fb8759192a69baf9d9371ad770cbff10e46575b4a2a88f2bad2c3b8888aa36c5a81a773e6aa23d08d2bf37c4460f16104465cdf2321fe148a7c816fe8079a0ede8f2407867bddc27095315bf6dc50db69278d07958d0f06f1b9a3639e9ac3a3f6b457b7b72b7cc91d9d72e2f9c0ec7bf94dbf39428eeabe26dfad716b07121ff345634e0ba7908700b3e377eaf88ec33d8069ec1ea44fa0805f94e6c29509ef2ed75141a72220c45620811d549d1723f729a43bd06d971c1da2f8227b47fcdce2b6a0329e654cf5e1e3835bb1b67a1e24c9f53bfcc786ac182f87215f4b2b22662f29d2872da7cd48751354c4bd9d38f5279833226fb523f40a4460d292ac8ee39ec2bab44288a6295492662e593d4f1eb8d9ff7e9c830bcd266c46369dc51443dc2dab359016b7c46a5ae5ab3629bfa2eec5802e76052c91d57c4850a8c11f8751eaf7e3e35f22578dcc73c8906a21cfaca576d72c46ea4ce206024379669987fb1a373d8683e27f0111b1e45577ca697724690615e9ee255a9ac2b9028aa95749717d7083aeb262079196ca80118af70544c49257dd29a7dd91a41954e4755c738ada4dc16c198ad5ab84383f73435719b183504bddc008c5f3045a64555fb8457389f856612e60b4e25677362b80b2752e13db375cd15fd662b919ec52b3bd01fb29ff1f191909af4e982598f2c23fca4bb60467b735c16739896a8d44a546565520d02a255215c8a9d60834652321e3f4278285a2bf1e0f38632f1ab720248c9bf90e4a995901c0d9e6df7d9f12f527e26dbfcec8ebc7f8c881722803e5a0ec4131de9f43477b9abd8d4ccdafc7acefd75541c763831e1005ecf4f9566164ee56a9250531a9d524544ece3129d9325a204c9047ffc49185ea5005aa1e549940101cd3c6c4879d63a15fd8b727a4248e517b1a13cf44ef4400eb2b1833fea117ad34514346dfb3bceeb6b43b0a740c1d8470279481e70960702bdd5ec609f9ae8c0843b18d12fc6eecfc7d6602e74778b70554aafddadb514d3de2df1b7b68ff629f956d487d3359da48178b5725067cfd5d613ae82d25c607aed0fa521cc801bfea4dc5541f851635d51005bfcd462bfefd9bcb3e61cc13bcbe68c7c65032b616e531a38dc61e63bd2a0f898cf73473095a19cf56fdc048292d5aa01052287b1c74b0e4ae8143345e2b6845d6c7fa8d35bfa0e26ab82f81149e993ee4784d170b8c4170b5c764c9ef439a85387843c5bf6709c85c2f489213f3c596b8f40945043a53ac53027565b93b4ed61cc17b898edc262fc4b68a1f72dcbd3a436a9a852db776b0eea1c28e2dcc21d22f44f6c0668e1516609f537ef39d74176ceff84c35e44d0b84dcc224da4d8371cc7e5bd3a0babba2d52e1be8ab7cc5217a25c40564ae59fe8d0dc7c7d7f4bf5754e46e3d792611369e48a200f81b14a5a63e46e5c1eb7b60547c20dedf3761d0e0e110f9230a5b18a5ef5e1e737889ae0719358537e9b2fe0d366b081bd6d9c1b9a3ead81d601429ddf688e1f07983ae80bf480384af75da292dd466bb2cbb9cd12a45dccf39357a80e52a90cdcc37703e43f42ed43438b0b2d1f5fa8c4ef696573a3c12aa410d24bcdc9e800e32eb637dacaff50f6b664fc5297788d109e6258b6e8c7c4475405bc5c116bf430e9a78d2ef718f4629f17ce43ce80fec2d4f1d41543503193f49bd9bc216ec482a83c53244db21ab6d9215a0a988878669e2ec0d011f9bbe20d47bb7f5a23029fbde5a9c3cc3b1b703c0f43cd66e678372447b6a48701c8375b83e26de3186526af8525bc12f6d6348e86068b112566aa5ac84956c0bb3a6e487d518bf8d2e48d80ed17e1b9ceb241cfa5072544bb0c5e939da5d03c17d30b746d6d81a5983b0b27d2ae21aa83f99c10a0bcfd34ff30f391aa2a689091c12be396162ea7d80177344bec430a6a297e42417c9b535b3e6d6cc9aac0958b925aa3116a83302a97da0f109fd88b01035629912da5dd351e3b582d6498f70b7e2c69ec886cb7f1252b7fde8632f4f5d7dae636437b45d93bd9fa9f24aea08b4953610017c0eef52e9011799bf115731805c139272f4187176d64c9debaa5011408fad316edb04d5335223b0416031ea1ddd55e118ea013e82fc62e3d31fd866c02caed6c66a594dab6535c26aec55e81e30893792a76315436274c6363a4df5a251c04b423c498e241aa002dd3dc3d89130c6c88901002f549714ba653baeb35f83b9cfcf59763b5239cb6c22d6745ba8f2389fce932853bc59c14db2b423126a93b4390f215196bc7847901a2a35031268a99e2573b10422c2ec322018126d71fb635a63bad79ea489801f23a6e705c4328655e1a5cd0752f5470af790e6b86d0eea77f6985e11ac0e19b1c57ac3b71058cf86097f28f0f2e97552116d2970b3b2ecf90f0d4d8fd29144ccf4176477252e04cbac54d4ed87377a975afa17b1543e2f90860562fa02fcac0c6ec3a4ecfeea013ac45bea2bd19490887de4b3434573d7a32cce478d8f512d80291ac6b32ce21ae7d33a18889e7f44b2d874b2eeebf582b2a3374cb960e2199f672e4f7c5af89584a78a234f5b0e1084298bcb9db15554dd88d028a2e60f0cf8027328aca228311e7d184d5431c16144aa88504fbd501ba3da84ed23d51a0192f35ae12c8454d00be2c3d63e56ac5c4cdadb729e04e7b204258d2e9b21dcfc1bc8a7444436a2bbfd526d628bad472821f31052e8505b0f653c39883b4b42db2117746efaa999b5bbfc8e36db50c5a1292d34246460b343885d8836c2e85352dd2245fef35e2d53e66c3b9be469011520be2fb12ca2509386c1587ed3ec8aea69f0702f726349eede6ce164d24a4b1a462c228fe1728870f7fbeb70957648f92a5c5ae1741afe9d48121ab5b7ab873f0c73f6f9fb5d924367e9739bacef9d97fb2a43ba6de1a54311dd262c7497ba97aa277bfbd07033d77ac5bf550fe96ee2f0a54115f1534b370125ecc85c785b4b40e015d44aa1b1c1784a77fbfa34da643b3081a38df2912aca0e42715b3987b646f5b7c9ea47f9e59ad746da826990458686078912dbcf258eaf629f624b8b8d3c91349c82088a20607fa0f502db2adc1136a7b666b351a831c90a4e511de1424e0c0ee19d4f8883b3769f471691cd709dae926e3d82585bf98ecb32d116c7cfcb285c52c10192b0a076691fa49a6c745d594e9a37cf77b779298db3830c1a9627fe9698d23f48cd6bd0d47602d16c3ec2e7e3ce707a7bfce38d79ac5f372f0bd16942240930fde6c9c4b55416b702916aea8c9829974b53b8f054172c0a5a019a0e71272368b116c015d3a1807d339e41103958fc569df3d77d3bad543996b3c124442a5de5bae99ed1431092808e7f2452f38f782b0ad349d0d200cc8d03c3151c9c6308880b82af8140fee2261d27168a839e15026a908c2a07bce3ccae076185ea7149ac6bdeeccea6e571e3a9416ebce3f907c5b441eea2aa8c081557deb06c3bbda9e17a500101ce4ecc240ebb14a1b9cf892b93d08f0d2037962749a5c760d094520555a54186dc529c215728a6ba632844b02b31687841de09af0d35fddd67b9877b2ee6eca764aa07f97c98c48f8047572dae223901316b57c985c6376f83b80743653fffc73855ee869251fe0e8310baa5f49f2be915ee50afe3530a3ce9f94c5c3c8ccb87630423402acacb4cf02a913b65bfa45aee7e541951457d0f9a0911273580d78d6cba646975e5f29cac2aa592a613d444bf0a5d396ec28c46a8859fe33f2037299ae3d551d66f0673e19298c3eeb9ecddbfc876764c0b039c9171e213625f0b2ab5ad0bb5af0d1ca6a1eedc913061f629a8741353ce6ad3019c7b25b43fd76b5ea81536a0be456680dc66de76821889412f53e2244b22389b949cffe81861f6fcce2c5a549ca9e0ba085ffcc43c804fbb8c36705f9f0ed9d9f2209a618a5a8a32174840373d8b490d7a52bb7567f3b1bfce57b6be4f9b7c4f28e50b0d4a25bc8c0f0565679afa343f9492a74c44564129a79df166c1dfbe078edf259f1cabac9f9abf1ba1af2c9500dba66562d1457e6da5c22337182c318bb1562550cda440f843e2bca185adb4e0222f97bda09f7aebea95125aa7207e497cfdb746bab1fac353966c6002a88f9e8ee9ad710e04b756ebabf182a38677739525ae5b75926c398ceaf6a6f693c75810ecc99270ad8fc5d7ba6056aaaf4c920346707a8078ee1376e22b0e9ca94eb09d6935811087d0b1114d4c4c67544b35cccef54afaa24b459982bdc5c7f4e6f7ea7654732d3193bf9b457833c72fd1881dd29c5f1b5d1325a61ed0662cf39308d27695c9fb847caa5cc7369e1a2f684cb768a3a6980fa6e87a26ef370c8607e74ba9851254e8ee919c42f4a469fb79437027bbfef99f8ae0be0e2cc42f9a1873402df2e0c7c9344bf83906e1c92cf3e164c274e2418c90328294dce926b23f72e4d10ad31dcb83d4f84a6af509dace1c0fa24915d65ff3d95832d575dd87317958bb2b9309b10401e9d8efcf521d5da29caeec81623fd0313801979eb79314fba8583ca50742c6f82c9d16a0b08590674f66370e13992f3b505bd866c4b392704a3c8ad46b8e3cbf3302d2ce4ad2a71463caf680df3877964588ff75ccfa2fd88d8d4f6b5031a8323bcb8632ca2ea824c1bd95a48994282d06c3f6100f306cf466fb8cf8d9e428d8b4560c8ca0d14a72afbbb9f05c19b428a384aaab755abaea552bfc9f67efb379694516d60d1882b3459476af2cbd62e54e13da83109470d04b43f3ee1d9c65680f67510ce3f5b807bab11651940b4c83f60f2e63a06505700f7c948958285b4e9644f5d7ca454e8610d6ce8cbc10a9c96c5921aa8759f943aa8d293243be8659f284b466663285a456e6cb855c1d66ca1c524dccc818d235cc921392f583172d9c483fc0d11496f013deceac9cd8931b755372812b3191d0e513bd79e7bf99cfe16bd22bdd8b4333b4304c3c1dbbd72654133d668b3e53cd986e95c424c02fe6a3da049468fe3441a7d891829f37bd7196fe58a14c968968e97d894d80650368173a4ee02d3a9bef804cef5a7aae1a8a8873666e2a7c1414b83bb10984c1afc5f407e04b5e09d07001a46dc5e38854111e092f5967cfb017e5e71d47073b424d7b32a451ac7dc83edf90bb06339243d3f16c0e621107ca01c7bc719e7958d171f3b8f7b384c387b6f30dfde6737de103b168d7b045e987839fae6dcdc5c152f88ae3ec3c3e5a59a223e54160aab9de3028f41965a3fd00a24d4aa13c9a131553ad5c829d76f8003dc699a47d4556da47f34bfb0881cc1df125b14898b4a8abdb744d35a6ae792c7fc29f6eab9158740a2bb9218132b5535890d2fece04a2c2a03bfb7bfd2b0ab64a87006bb2085061889bd08a049c78ba0e5e4534b552fdc7520dd44e9495f2004da8d019b29e012ab0b2d0286b2850546168ead2fdc4e14099ff5fbfbe03917bf08e3617333fa22aa8e565c92a2a808a8cc5dc961d4be155b14013327e89dc10bfb3240b3f1a4f2de6d2dd3fb7c4fb67659ee6fc0b7e05be51e351212f5accd8d43f19136c975ccc9dcf8e3cc7b82c2ebdfe23c5199bb65ef34e1f3185080f82ec2d26ec0b0b09fe7be63a5422f91e713e17f327307b45af73c4fc8e853f10737153f762be01b121a0f700e4fe44801c2a326303370d44f4610adac4c87ca6537a18121332a31e071c46ccbceff333473277ecabc3b4fc9e71a6cdc93d1a2d73bc36f1d6505cbd18e267f2122910a7e299dd599b4295563377f7ea9c0dcd57d708334c65fa5b36c279aa543a25565b8f70cc5baa5f983c19c3a4077efc747ee3e7c1755fa9223577b4d3430e12bbb1744db121b5210b4d32b7a68fa599223017e555d59ddfa8fcec41e5e8bf2697a7d850acd79fffbe2f620d93070b16457744d20014d57226a00bc5f23d76d2f2ebd580b4c72d7749550fc0a9bf95e5b21ebe37c32777d1e095045fb4bf5db960c2763d11feb8545b63eec00f93779575f848e4687de2e5d821c9fabc61d3a7d511ca2ade6862101bf0d8b8c212c32a67106e31759d8f19529d44e902e129c9865bc440860ee31d08de5727f30d01cbc46a6648f7ef73c13f65b41c9044611fa27a9db794e22c4bdef7c63d40065c83876019ec02e4b11b50a3f657d34608cce2b610ebe48214209b872ed1e576c5e92335e8275b803c2248b6dd79377225631fa9411c950c1daf7521440d6070e700bab38b2ea669439b3f4825e924573e18f246edb7fe2351e56df20d871fe29c154ea9fd981127e5293f933fbe9ed3272dddaae4a5e29510f0e2b893228093ccfa0aad3a73ad02ecadd07f8e41ec4c69c97975c46a606d6358aadfe3815931447d76e7c013c90f3cf7fe24ef6f97bb44c3fd59d09d396203c1959ceee173a7fc3a69ba1b06b36e7b834aa71a6a5821c449a8b7e5c4f9efe37f7f38fb1c768eff02b5d5803781f646765b4a14bd5159cf1cbf0687d307e16e9b2c7c67415638de503f8e400cd69f3a9928655555a9e61cde2c90532efef09871ff26a6218e437472f1e3bec066340f24c4b2804492884c8271639298935c6b5ce63a53d168f0e5e945f08c456e03ecce6f628c7380811121b2495d00cc146ef051625f631c45d3331699447777d4aec2e9f2228868e8ced34f5c43a6a5621d2c2b06da0e7737da276e986b8512b2a08f3621232e57461ef77c84b9a2608e4e0f43da18aaadc2b5b0b72e63eb37533ce6fbd29638082c576d193b7c625f8159084ba181228e518571ecc996920381350bc5eedd74cb407cc1f8d47b1fc7921ec80f500fbf37efcaa80c55c6ecfce5a8b1581a4cd2df597d50ec3c1bb0bd32a54c348b19751df0f3866857d66667574df254e58ad552a9ceb864f3bd06a7780ee2a96606214c6dc841afcbab81daf3f37a6c30ae26eed1301d3f82f308f7f4b1c758a52ee15e63ef7135518e338819c370656a340b490989c4cde0b7550ee5e498980c1f8ed3b5c6d02af62332b86b80e68187dd149d34ed88877e99df3216ecead0a58ef0a1663047518339fa9df8f055a172ef653843048b0a8b5e385334f859d7df51b99ecaac2fd6c8b3306058d22faaa072a1cb52d789cad2b5d547ab44488424eb0235c43549b22f20a9d9b3868add1159344005f8531232eba5e6df546c83ac960dc1822941d56e94e1eda2c1f5e15ea300a38461f6e04d648afc541ae07e38b7bf8ebdc1a702937b2462b1883e0ce0b904f29601127c98dac41799826fc4cf237b623ab04e76fa21310e2dc6e081d8aef0f25020c090533a1ff2278bdfcdab66620d99b1202e37d2c76f2a608547cbca13af47034966c00a23e26f2307f9a6669875243d78c00b63cc9f6afb0b4dd7c6693caeac3db1c29f5c77ce33eb812cc1ef1aee470febd4712aadb7fd174d38a71d94394a43d3c338f762bda7ba7716a5a79802e149a3a79d2638425d8b4c041642b9960d988f5705cd3ca850e663561622ca7a0e533f758fcb1eb9a8e47eb2b198d0f8f1e949f3839ee27be73cb896afc8562867062a48b2e6b4308557a16aa9dd478fd0e446efb23e710dac8b9d9126489c2c02dc3b6a4f980105cb9a507c3c9079b1e19a7b072de7d6d0e954e1528f160acfe72260797bf48b25c62e6b465eecaaae02979e4a27bcdefc0cd1e9897708cc7da2f3de1146701252e6f3e69d5fdc0ccc5d6ac2c36e87dd091ce30bf8cda8030d58c557e261022f84b78497400b03cd06a2b6751371e878e8f9145a2e3a494a0be4a3ef3b2584aee67c75188f78e33e663a52151f55885f3173e67fb0064381b0a5e29e83ad8e08922b91db17e85999336a2bdc7103c5b295d01a2b34bba552eaf6fa79dbdc6f671c4afddb650fb6d2db47a7d958cd2e8ba96404f0f35cf62fbf669b443fb7625f99cd3812dcdb8eb04680918901566c25f8f845c2ad6b1610cb2c4389d573a7947baedc54477f42a4ef31f78e005ca6b9fe66e1e79e5daf02a9427b1cddd2c5f91d5521872500f38f20a0893108a78259ea590491be8bac7eac81f34da90a2f1094e533bb923392166595a56efbfc2aa7061c580902347215c4ec470e289de0735747e7a0038acc41185a40011cc1171de7933e78687d5b407c6af9b05f5282bcf55a47bb7c0c384745bf3558a0bbd3389bec1ee29b15ff594acbd7faf267b4359b77bddb216b58f80f7f3e6cc5294a5489af467d719c2c8a7565bfcbe737ea6bd159144d5964d11cc734af237e89d0fa88a58fb867723edd095343c6c976de9d51b5d41064e61e50966c9cf557a6e0aebcc4435edd2616af3756a8e2e5e9a37dd6a79047d1d106c255605b33325754af4a6d06f5047a9e7542d77155262c656b676d65fb109404ca02f4189cac34546f9af23446ef5397132d34795b68b520607b5d6bfca61be88b155d754b535fc4798cffe625b24a69f81607476a28ee70154f819588450a5481744ae0bda6c30b62758147c2722af1c310824f190b0bfa19df0b4824ed2f6d45634fbb07a861ce013a7156c1add2b6861559dbe85a3f0993aa8a7796f8555146c0afced74fea79abc4abbe47ab16b22e919f170ace403e88ad3494b4efbbef00ac249060780cef1222057726aefc75010a477b2ab503ca20621b270f99d4dfa1bf4a4a06f60b6843a87738dfd57769f4d23eda634c8d74c27a67c1490d455a9d09893ea140346691bf5d1412dfb2c2808cb08cddb30c8fe58e8429133f2840372864e4de1809d34b49ffa15b3b48352d554f50305869a872b3e204863b61fe1299d1529548d7c6d885e65058bea4b72db1a5fe9220b0635764c05246e793498c813374d0512f808b2cfaa3ada49300354182f08731987472dd7532f0550d77b960901765791bca85d2b1a5550797c0333f24e8cb2349ea3f2ca372534968a0d134252f44652e46346146d914b634d0b577bc915fcd8526a7a59973a13750227f78a352b2cf9200091074e68c44ab3338be73edd8dcd48229eb8bd303959eab6afa7b3d1d2fc8edc3aafb46284ff7603483d2b52a3113c78af08c0080c183b42282c18303c49104aae2d7c65930d89549077dcdfecce3dbe933b2d837b04ede8a9a8aaa946b35b0e926dd60d8aec41d350e72d4e7fc6474a0e89d3ed83fc001f85fe724ac6bcaa039cb1ac46cdcd1628f9a964ad100fa124b409024646fb9f7de5bca94a40cdb0b0f0cef0bb60271a76a285932491cf4100d349f66c1e35b0e1b88079927a594524a29a59452daaf99831a6983218d4c6f32fd0f25822e33fdf9b9c51625e2d044d0df69e8a334c761f6d2c394528cd28c528dd28d528ed24a694729d8e0f6f2b5dbfe59766d6a841a635a32d9ac67e3c87077b7eead49c9594027ebe0cfbd7d19f6725f1d873a99c7590cd8d131fee5fed7fbdb45c9a102195b914fa373605e76df8beca616eaf0f4cf0f31dee57ff87ff14ebc9316589b51d45b806c22b2fa77882cccc321778860b748b9c217cb2f77253fc60b69b95c1e2e7fbfc7e5efcbbf2f1f0303f97f792031dee585b42493f5be3d1b980f96e551fec3b1830c23abc89416cc7289ee7f9708e655eecb242d51547f922ecff9d4cb243a0766abdf2f8be24e8adb8f9e033aabdffe0538e0392ffea8938f1147c7e6c0821bafe00aa8e820efa5d12c7fd5ad7163a0e0501a9d4426d944288f42999479d6e964df2fc3add160f6309746b3b29f2f577356f62e377bf76e6c79c36083d96b7726c1fa532cfe70f96a690f065a50f6cffa0809636a6aa2b2a865bab2912a9f098beee64025e5d920fdd852b64f8a855af65b832ecfb8236912eb9fdd3fe6d960d72ceffb3548b3b0f39d76d285b872f82326c518e3766a55dca15d977908001b944f23898d4cf38b1a63c218d309199b7294ab77d4091b52a5ec3bb5fdbcdb6b3726e49458247047e094f2e422883ce79c2f6721592182294c140af0436a34f338d45c5c96a509cb054b932bf7a7bc3c07a6c8594c8d0363d429568838305244b08b525eb73e11593052449cba4404dba871ea50834fc49d3a834a24eec47c7f1d529d883bf7fbab0ce20efefeda44dcf9ef18df5f89608a3c07e6c85931883b30df5f6110775ebebf3211775cbebf2e117758bebfbea02a11775abebf0ec59d150c4c51ee8f331faae20c4037ad990f5572585d5d8019fcf303c4b7661e889b16f834bebfce78e1632e11d04d8be6652e11904e8be6655c4c04f42d9a8fa1019be7e3ab812f4f4c444304f4b57e58ef7d0f5f6659fdf46c10d13ccc9196511f6aeede9e9d9cc6c57c3a867e5065e6462980ef69ee0f105aebe7050cc4b76430edc20c4cc388c1940bb1a65f06a618532d5c4cb7f0987e116bfa63600aa4d3626120be4584071e7ab01906532cc49a896916624d7f0f5a7ec1f40ab1a6df05d326ab4b5b2ef522d6f4b35c6a055a05095e9a85c8ea9fb9348cc8ea94261a46a44d30474dd40a932993e7d4a1c8ead7b4b00e51a63aa4327453c06830cb81e589539a624daba80c35a8c2c4ab71b6bf79629522fb21cc51ee0ea392624d3f25823df9b00eb10cc51aa6c6719aa2a22821982996b245d742550e2993dd0295b994262db4e1875f13ba1482394c69425d91d29461ba8468e6799a2acde0d3f73f4b669b7294799a9531204959ba8743cbf309269be589eb50ac71810d599a98c0f8c9f34f43e4f99e11797e97449e5f9d893c9ffbd838f3b7a6a6dcefb29bdcbba1cdda7737fcb80d872e4d789099d21841331a250ae9235f9352ead4062ad6340d29a5f44c084b6fdce8e41bffbecf487e93e52b4f3b551768d04a61438b84b2aacf85a2e24ecced43ab5871e5feb9e53c6f0d239517119aedc186b2028a895316272038152e727f9c2e4c44ca657b90fb230a75ca22f7c71310b93fba7783dc1f67e737cbf3d2b037b061caa5121477e4d2d61d81d52ab82d7043b62d5488c8fdf295727547e47e59abc8fd92db42ee97dcb645ee97589e37c606364cb9528ee28e7c13601a0fb28c2953426b0fd23613e4fe4eb9341ee4fece98727f375684dcdf735e971ad830e55231c51df93e64b4c86c8217b9dffbe843cc87dcef29172d92fb7d3621f7fb5441eef749e75515b141f06ec2544a306173b6db286c987225c51d898410e47e141f215c28579cbce4d0c9ab9f52c7746639cce0b2e804f397cfd4c92bf7fb0d952c71ca8544cab56ddbc9b1bf965dfe8a4ba50b1689c2d4736e5c4f23364cf9045d4f3b75a8e9c9af98b7cddcd1a3122e72acd2092722c7f7a0b8c3492de4f87d1477b6a6c20ba6b8a309e58e993f21c7df1177b08f36c81f142b4c582942e548ca155262a0d2c2f3293f287263dd36b755473d1c2ab9ae30e1065e2922f791dcaf712957e89418682a2d727fa669d67e1f0e3be9082949e9b594f249f9a47c523e291f9f9437bfa63c8972b4bd11eb46ac7c398122b765822d0275e47485530ca292fae1091413a6c3a19239a66a9990fba77cdf6c11b9bf27ea486e7abac229063dd445ed6aa3a346924cb2c9a7818264d26b09250825082508250825082528f7a75ea957ea957aa55ea957ee4fb952ae942be54ab952ae2b3997ac8507d4e1a046a122219de038e969b16d1e50eef73419343b1ce4fe2eabe14d96150999995443f285b4215bf4b95443aaa1dc8fc2247f898989a98949fa3031e57e9423cfb9d18e2cd297f44a2847dfe7466cf66ec46a2b0e49ee8d0bdb0cb4256c1c124d6e5cc8fd35db3edc6690fbe3b6041acaa0239696162d289b02ab02159ac459f6218bcf14b99fd3f0266f7813c6970c6a7123764e968c2d913b4936b125b224f195e51bb1f23ffac313b089e90f5ae777251381c58762169f58c3e2935bbe4a66497a218a2a3f76df8f83f7120791ef7de320447ae47b1fa4bffbe8759de7ade2af5e48cb235ef1f0befbf81d064224e29eee571808cb770fa4e5bd17d2eabcd5f3b4d7ad82b0bcfcbe4188f4b0bcfc202ddfdfde8a47cbf7e7c0f2f2eb7befa7275a7da83ae1557cd4c796775711af7c74ef3d0e2b94f727ef571f5baec50f5577154fb1156fd7604bf31c7ae42b1eff1afc6ffc753abcd25612e679bac6954be6fed3ffc67364ebc52786e68e611a31d3dda73ff6986331aef72fb7fbedca0c73892c00a6bd2c6a3688715dfee5ae5e7adcc3ecc0e195166f8af0903d8eb843f638629e330a3b330fd3b3c1c34ac33b5c568f7d7677fcfca8fcf73f29bff2d5e5c2fceabe7ccbed67b9f2e712b606ff1b7f1dcf9151c93db4dec37c8ff730180891ec81f47b9fe19eee5f3010f9ddf3b4cbf57e75bbff6e6cad76b47cd4afdc13caadafbaa99f3f278fc2ba1d3f3f3f7cea7f7e4e5e88cfd5397952aaba5bed2646ad55ae306748a5edb7fef5c4e17495b75bd537fd084a8dd870e6d52b47baeaa690665984ea5ad05a0bffc96e54770e19a8c61865d7d5b91937da988c32747747a1b2d349f3bcadebb85a2bc775dbe69db22cee48548861317477cf302d8c31c62d8c314697d2638c31c6184fdd12272d6577b7d64ad27dced57c2159f5285ecd527f72fad8382a9f62577028857283295875824339149d65f10963fbd90d870fe6302ab90472972a3d897caf599f2ea58c4d91468c6d899227b0c1e8c90eab92d3beedd3b82fab5847bd93e6a8b632751280c63d7dfa9c9d6c29434bdac858d3d9a42fb8cf9392196a3418431d55d3231368304a2c4e71b3ce9335279d554c2c76a455a8e60467a7611d187343a3c1f8592767d06919bd763732821dd3607c79c2989421e89dc9d80dc8b1c139e75cd1bcfee8c5f84327c78f299caaa2745fca8b014faf6a309e9c2c4a490bdfa96bd04bb9d49075bcd0f91aec1c093e5d562ab74d1739b54d8bd98779165a6481749b0ec66bb9bb18e33e05fb232a398e605409e1fb322a4f1c3e20fbcf39278cd638a1c7d8c9ad7e32f3b013454d1b65949452558a94f846c71dcf77567cec6adaf7c5fa9fb3e2a778aa130a2a654f4e6c0a254f2a2fa553f9ea0af76d2c5a8b4b0db83117fa32613c467cd9ffddfe708a0a257562512a9cd7929e4e9e8df8337e2713e51d2336e73c7537d6f894f3519e8d3b7be67cabdf3eb5537aa3d02a26159acc1d25eae43d3b0722b55b6b54b71c420d65ee70369827166218eb245f5e1e66fea19369e3550eac479656a8a1b4b2d6d8e0a9ffbf9e734e9fd363cb9843ee0c0229c4db97d42414c93da8d42a2d156a902691e38d94372edf6d603d2dd6b81fe57827a6cdce690ec5d894c2ce0f67d6ec67334c7bf640330d238c303440f3bcf12650a8d939fe92f6f79424a0b95d68b4e9776cca993d86ad323c5f66e9398e76ce3ab3e77969e24c9411c17ecfb189ac7e69d3e1e7e058d33accc7ab1c9fb3ff9cbdf695ce9691529ac99ce87c0ce38879fee590b4a438f9a18c8c3532a7254b3e96a0fcf8b5a4baddad531a6be6102f65f430dc4dde048fee2f5d466745c7ee042b7f4a297d5621063df21b03912e9f130321d2335f663ff11110223df28110e9f19718880c7256f68eb30feaa199c9974739fb7a632bc6645807995485ccc6aad07ddf7fff9fcbf7b9bcf7f756e381557da0abe46721c80553645d54f9d50f511f721f761f7a1fd20feb635f4f34cf8ab29da395f9c49d4ecf9df0f4bcef3c555769ad4f2bc73dc6653cee600edddb3d1b137be737c4b2cf394b106bd6659e0dfa9252f974861a999c21866d5ced3a8c04d1974eeca4982aa553f154add2cd1b769eb75f284c8c1b678cb171cb9031dd9dd1b5cc0c68592ddd0b2b9716ec04567e0d4d8799a0a6c384008087ee18a5d4a6c38470a73730741fce8f6e3bd700cc062386a1c34a10800e0bc2ba0ba08b8d336bd488a18b5e8c3a31b01ca4d441071d74967b8c0c1c69b8471a9146a4116b62c4f73567451964f019bae8c54867c04860e51300081b0213e28ba1a3012727a7e3d119c000ba1dcf46dc9121ca19ba16010a004e6b800e0b021b621ea0c384b05810373a4929ad21c698e3e70cddb50623bde17cc732f5196dd41bddbc21cd73d66024b0acc6d1d9e0d988357439ba3bb120b0203a5377fa126545f18d16900e4adfa42eca9fdc14ca05025b275f6de84e2ed0d73a01fad6c9d71bbae839405aeb44070d7826eac0c9f33400bc9ee9e35373f2344eb075d654800276ece08101551e9e8dd8e12a875c619966cffe323a0f1b00d4d0a041750c4635a25cd9bf7a4f2da616731a01353439309a6bc246d06404cbc34431d12c7fead9901835841af21c6a441240d8906be29a38303a8763027323b03ccca1ec40581ea6f74140ab99b5cffe5de778ef0d76534d4a4ce4bdf4261a945d660d8712908f4989b58cfd40ef575491cc921b82224bc984a35c90fdb72803aa05d1c65f6ea822d4d08f9d1fa286328a090ad438400d4a1a94b5c73c075e23f56edc2cf176146bfc39212f01b18b3c9f0665194a0ff301a44f5dd86b2f69509e1e460d65d7b2d6597fd490e7682d7f54918bc08634880e790e8b6b0831c84108861ca9a21501a125b6c8a20a284c3083963f0df2a742fed5a594524a29a594524a4ecacab9a6809933d7b406bdfa704d4fb0f243ae09e54a5181f3ff5ca40320c7c76c603b5a93e3771aea4f9c9f6e8c4bcfefbe6a96e33aee672673bd5f8352fb8cbef603cc36301cedec7e80993ef56c6041e2842866e3d0e83a477ba1a3348b1a2b2a6a1fb76b33dc4d8a65dac639266bd6b8bc5d4bdd31f7cc5d73dfdc39f7eadeb97714fb6f9d133baa859d948bd450c6b26d76613b7bf73426d2fb0406f5696a902937c9d83765ec63931705dbdfa1b64dea49197b1bdbd3bbc2612508fd958fad795738a80499aff2b15569146cd090ceb12f67618fa57c9a85fd772463218d0d29eed060ca98877d58ad59ad5aad5bad5cadb5d6ae56cf3b3d4fa3869c7cb58f7db53746d05af9f6439ac4f73c6d69d07782512e8c2a6a10db81b527f5ed0bb32fdcf68788c534a8412ad431601f7e27971a8104576257f5c3066349c6fe84a950e3c855c5e197b13f3d0d6a9cd3634f8da042ee7998872caf6c964df9874e6a888c7dca07d381ed0f533fb9a941cce3c1c1c8d83b53c69ea77d69087bcc8865596dfffd0f425af459ee6a7b96ff41486bbe7dadec92e7acb696ef99dff21beea1bfc240bea70f8405b3afed43cb646e8d895a9ea7a75dd220665f9e833a6a411dc516451d3588d1215a4483a810cb8dadc92294b1ff709014361e15e52abb8ce585ac7a5a5ab06c7216f6df0b69b1dc1e7216f6dd169216a9bb629eb6b1bdb435bb9dd420f6daed244a4a0d62288f62637bedaa9ae87f5836f978ceaae77b9667c140e67fb87d9c85bd9016f68da471622369f036521f6910437d0d6dec9c540df21c5491d793dfee09675ba86be78d2d5451f798d6a18a369cf201338e2d946a9576db361b1b8e2d5e38b678bd706cf162d2382f87b0fd31085b2cc9d1c3c124e5828cfdb66d8f7936b697e66d39b098ab97b660d2200ef6fa986bdf10875b282d69afcea141cdc23e661c5b28691c99e3d69d7e76614f16d0bc1b27b30b1bda575ef5502167614f5f486bde55cffcef3f0c840ebd101ae42c25d8d0be82e6f46ce0d8a23d2fe5716cc124e5e2d86249835b286db17dccd3c3b185922d941aa77bc338b6506a3066fb4ab9007594b1f7b7afb8d38fa18e6e729f6cd95b30cb1b6e0f8257def08f53f63c1eb650d845197bb7af8c7dea867248c6be4bbde24e912b63df49de42473a476bb5d18ec6f17ea891040165cc2763399445181819eba33692b13026f16985ad94b19747316c1f2c39f9238bc9264c7a89128994b12419fb88c36d8a302ac9b48dcbbaca71f32d0ebfec2738b4df9f70a8ddd50d1ab97b6bbf665d4bdea100a7d3bdd1792f73e7f950f9fe765867d9e4186b54d97e7b37502dde028b03f59cf7f565fba4d80db57c3a5d5bbbab5f83e7acbccac7a46c3f7a3d2bbf83c759f6a387034501f54f5fed0da94fee97d427d6f4f497bfdc73959dbd611f75ae7f3a5d99ede5b287e590d6a0f7d1cbd1b97e957dc3e92d23cbc946c5ab1c349f3ccd275807d473a8cfbea2b06fa6b8a383f79db1efa5c6be62614ccaa7f7274e7ff2d2b34166efa4b67ba1d619fb03344e3fd6360707348ef7fd45d78758ead9a81b0d6a107b0c07b67effe679b875d8e8032346997bd44f2f01dca3bedea8b97e7b3766e46a3fb3cfd35a6ea6b8531ffb5e6a1cefb16f2695c6136e4f663bc8307256df7b263ba3bb8dac9703eb7d9558ecf66edcd34f2c6c336910fb93634d8598620df65aac9127dc4b0d624219fb99850db9a1a58c7d6f4832f6a9310d8a35d86337b0d65919f6f5ce06b36f0f87f472a0afb2f23cdd3794439e8de8757fc7b4c7ee147e20c77ab9ef9b7ddd3c1bf5b95b3ff6a6f9098ddce19a6dbf72636ac8b60e0c6a7f9de0cd8dcb6f6c623c749c255fc759f1eb74aacaa14ece84ec8d9a71d4acdd90b146bedcf1f3c30fce8a12c78d35da86e38636f1d43c1c607892230e0f47e7692d8fed177065aea8709b5fbbeebaaeeb64d44e9a8743c35c945cfba458a67127fa188e3d64c754625bd43a81ace7d0d6e0b84debc97ec340b69eaebb2088544c1183249720641446afd6aa895677513f2471b5aa4b1224b1820b042d05d00a965add67170437455a1deeae2b19416a55ec0853ab665d77a3118010d4aa9aeb8b1af8b4ead67577d5f31dd62210a070a2a815ceee7eef12444b6a018ba0a4af76dd056f68e084161cb5429ba58eb3fcb3cbf302bb22424bbaaa8044502b8a156491d4aaa7aebb71085330b52aaac9154aad6a870cb5ea49121440ad9a7219b52a4a97dd5517adeec6a31370f16a55951349ad9ad26577f544abbb72094dbc78b5aa4ad75d188aa082ab5557b83082d48a1d43d8751704b1085eb85a95850945addad27537561185a0565d75dd8d47d84252abbad020091647adfad275573ae187a25685e9b2bb2242abbb120a11b0c0a7556358e1d5aadf753712c188a556bd5d772312205cad8a8d865a5546d75d21adec0a69d598aebb510853686ad51849b14cdbb8da7927943d49a1c89695cb0b8c9432c65f2c6346cccd697eadd1c3b07ab7a777f37aea6f18480ebf793ddd6b18c80e67f977bf790b88ad1a9ce54f95601b29b630eca99703d39cd5f2e4147a204f3c5b73420e61511c310439748321fbada03ccba7b470a7ea79af827aee4fb786cc867af24edec93b7927eff4e14df656f6391cae70c830f2897b0d87a7b086ac7d5843e63ee61ab2f6a1d56ecd71f29ae5fe844386516fa8a369d67edf3f088637b9ae2cbe21c3c8287c7aed4faf7df5fee48616e55128cf7915e5a150c2d3a3f089903d6105a0bc8775407914d641e5bd1f3a27fc4327a3e0d8e0ca57958fdf92a28267832bf8e77b3864c1b3c1142f0135a5fa942a5555a9548a4b55552a55b954fd52f8fbbe6a6b7df9b5a2debba14ef6bedeb0865c59563efaa77c7494938fee527fc5f2e5fa2b9feba780b93eca473ff1be05dbfc65ef5570f8a5e0f0b3f72a1c3e0a0ec1ec7d0a87e0090e6fb2f7168737debfdce82cef870e8e5a2feabd3e0a873ab9d61b320c9b03db7da8f34347a7861f3a590372d5d60435c6f4c4a190be9df684d5227df9180ea5d6bd9db2c780903c5f871f3f7ebea4524c108a38926310508004861c838002a1fc4576898443882bd3f9f18bec3bc31209cc1f4a24093a4f7728c428872d84ba68716795238c8ce150fb59af4c8a35fe340bed651839d4b08d35aebd8675a08f7dcc616603d501c31a26e23e66cfe1705323fdcab3c1ee6d5500f6d955d90671102e7ff26eccdcc27239243749e9851713eaf531c9fe2b2e4bb8e842e512cd909921a394c368450a50f6675d1d493a949ce52fe3ea7039cb1fbc3a56983c4787152b4c3d666e0f98dba388cbede1ea31c4ed11d4c388db43c88723d9a7717a4c114120cfe9d10408283bf80d657f99db73e42cff19b7c7c859fe31b707c959fe2fb72709c9737a92245192bd0529fb7bde8d2f7fb807900c6ca4a2a88710e21539c85444197818f540d238dffbf748ea91a4717a20c59dd5fbf3f0e1f1d3393c969e872beeb87cca87ade43fec25cda49b58e14a6264852bfbf358f21c1f4934cb5f490a0eb525a1651203875f935804a01c462d90c01cc62b96b27f8b514a7ec13e849ab0e18c17ea0c2f47e7d5cffbad5ab8a4ec1fce50ca4e7d72885aa2a208d5b224fbb3bcb2ff875292fd7918a18e90fd3d09d9e31546d9bfd250b95c12970400ddbc1c1218ba95cb51116bfc63b82522199f7289f0ab64602e09e85b18732f0274b2a96955800ee5caa5251a3aecca4caf8cd59bb80752910d5b9490b27f8b92e770489264ffb0852786cac1c4b06931ac5a58be950c4349c54027f5138b6a195d4ef279fa4466d48d9ecc5cccf7c61652f6e790649e926b5032e184c0f4048e50d938f4e3d327b476d168f13c9a814f4a71bf88c858d320c8fe7276d31577ee3c8542728c3534c885c548b14cc3289d199661dafc38e9f47aa47b3df1a86e5cedbc8ed55daec6f79e345872f998c632c7322c7b1ecfaea6dd2ccb1c9b596b92ab9d534abd936ca78d853e43ac765a6c6dd80e9f7713eb40314cd3b4cf30cd59a70ea572d750ee11155111156da7c59f716e5ae6e96027b0b2e613444fc5184f40153bc9c83a5113d41a1ba7f3bea1ec97ab76f7ee183bba741174776318a518866118866158f4667b0caaec2ca359dfb4a49492027d4bcaf7ada994f2865bd6613e7577779f5adfb4a2f6f16613086cc538813ec6f729e3c7f874051533016602db8f8a3f87c4d49112923ea673626bc7f631f7b44f8b7beb39d9f76b5907faf3e50369adedb5fb03844e6bc3d903692d0e6b98f6db05d26969cf690fa4d3da66d64d0de799e2360fab19563d7fadcbb0d76eb6c3e72920cb184065faf1ee9065c73a509c61df81ec6d8e137b996133082b5fcec6b0c0c471f45ae7382e7b553fa7c43d87c31fdcd77abbc92979273918b2f63c9d51ed05a11784e28ec6fdf6dcbb77e3267352e6ec0521fab2ce2b73ad9c05a252d6212a651832b77d987244bec91c8ea154840d39a5dccfc91983bb8e351c5f60c2b868f16139c29430254db823ec852dc1aa800297c7aae09267f6a1a7c44b9e182589088b2d29490c8a9c5d4c0953c294588e424f0917ec0994244f89972c314a121128492d3e13870265f9ae64fde50f2a699037a14132084ff8a1415c520e63e69c590d9dee9e8102451ced67cf9f2e1cfea04135b09f1a3ad887710a8a349f46e3d00092e77b0e6c489168ec934b20c35b53d084a2864e4f1a94b1056850eeef6e2e298b393f3ec8305a44e803a1b54e7e80d05afdb51a6cb5ccf90142a7e53d90d63a7d4873fc180b00a4b5bc0fbd7cf2214a8e337a4e7b243ac9971c7866530d9ed3af253fa2a133430d9e1a245093f4c9732ac5575caa2b18eb3973ce79038207a8a1c17964c4678fec898a27e8b34731eec9c35cfbe2df2f37b64e3e05d39267119b45eb0f73fb85fba739d6cc977747ab8faae039d276d0be621c31672b0eef70efc780904c9fa727d28e9f9f96fffe87e557bef2c49d539e27dfd7fe767744613dbf7c0edebfe095f62f1f5b399c7ea5e1158f937f791c4efaed07f13f79c1417a012bd86ac7c989cde80ed4ab7c5eb9b155dde5a27e7555bee5a63ccb5551944f9dbcfd6aef494a49b5a4e2b383c759730eb132c72c1f45c8d6a82e6a8c991fe76bfed9e3d0418804c9de2313fd0b70c073b6a7f589b8efa141ca41a0ebbe3e0edb733808f7db571c844890fa458d7edd6e772fe03910e820d020a5f68b5ac51c8eced29c45e377f6fe3f68df3bfc85b4f00ac31826a4351b28c73982d50eef2c9b0fc47bb46f0ca45ffb5f617785e11ddb671f5b1a072ec0e4d3ad8d60b210e98f59aab2942859ae5ade554f26b91b8ba0dc2f8d72cbbea92c57d80a7b55a6f262df97c678595225edb507ffe88fb8f7ee89ead323cfe97095f889540ca4fbed81d4e75e48cbf3741eec2ee82cf7dec7c6ecb997b8677b9e3e42b271f5799a3bb21d790e75551c9bb5f9dfe83c88b3ff00be00f80b1f6bfc5f7bf093ba19c4a87dcf161f88f61bd67a38ae870cfbc27e9ae78037bd05abfdf6a1d63f29cf3d8016ac3cc230d8e0a6c5240742752a65c8b6e8fe3870bfe120db73efdb731fc4eb53eda9f744dd7bb8bb408354bbb56a9af641bcaf1f5b349443481fcfb9406c691768903e68bf1f0feff89c456d08ace32044b20fe2dfbf49fffe1ec72becb7f76fbc9a19eea97885e1158f0d6b3ddbf76f383a875713efe086d8f8f673167d1be49d41f1b94b95caa5311c52d514ac7fa8fa2ef65bb6611f65c6f0c43362de75fec50c27404796982109f6ea1aec3a55e36499866df67356bfbb7ba777ff2fee9c7c76559d6db03fcfe171cdf2784ef4694ff017592c0e2990af2a825f054ed7aa7e78b7b317e8aee6d339c06d3f8164ec2596d359553631c77cceb7c00c79b6fc97959814be9ba83343cc2ae09e23996896fcef9392892cb32799286a507e76e510c984166c189b300e344e0802699c30876ee9e39a16e5c444dbff68507e053c2707f93cf26b907fa333c378ed68969c3a4726be010cf96144e278064c045250be84a6fc1ade3566086b64394383f2751a9435b2cf203dc62c7981129880d081120984b8941459e108114924e1095dc43e2ad33ebeaa7136ae7ef44efe312682fea80b46d0ff745d22e8efdd2f82fedd5545d0bfbaff76b53823e88ec564ec5d3e95ed289d351a3cb1f23ff951be66db8b80d2b6ad89f56c6850906d05dba06a73d518b3c25e48cb3fbeb6e3e707f9dcff207110222b1efdf27b3ee29efa2729b0b1b57df6f4e4fd69fb1ef9db966120d9fb9f4e270b0167d1f7bebbf539adbf677efbcfc7704ff7dd4bff1ef9ce84e10b388b6adacbefd1300d63f80637062231101ece3e3de2065458410c827c7c5ea9566cc556aa155b325661064d72c0440b6630c5135ab1259fc7b9a97d6bef4f370c441e398b3e919e7e8981348ece9a4e5fc3f4d59d55415b622d03d652dafc8ec466635a385fbabbffe8661026963d7dec3da49fdd3929d6e6cf39a5bbcf99f9310dfa94f970fe370812f17282e0053fa641071f0c67f0a735e833ae6dd05d273cc5e8fce92465e877eb33647f50271f45e18be9db123fba98850cb270e247970565aab3fe8853cab0c59dadcb1836058b616fd3ef80d60077b168d38de50cef00828dc69aa6997ee355f631af6ec89ce1196b1a3ba041d9de8d0954a0b3216621832c64e0df6f812e43803251630ca6c2e18f193c6a4336c3d0b4c7215fc3336840489eefb76b50d5607f61bb8da82e99b018b358a7f6340c1b4a9faed1deeed9cf4b431ab9bf6f1627d680dcc6230dab1db1a63fc789f4c00120aefdd0d122c6ae488e318295cfe3fdfed2fb880f86604566c9a19dd9aa4015860872edee0a19a50b4cc82bf9361927f75d492c3f02810b5cc811085d18922b6dc2e2a7a808491950c93dd82c6f6a48ae5a376f3794ebd6cd9be2820972e5ba0602185ac8f4e75dd15765ec6bede6e59872ede6c5bec6d309d7f072df080430bac8b552a566f9d32ed8f04649e25053dde4d038fef184b2272914ef0655977908a835f8d7d7b0c4dbfbd397e770de9f3045da628bc3617bef71e0fec4bdc77d908ee3b88e0b368676c583fbed7bea7759c9bf765b6f4a1a7425cfa14848d9bd4342baabe6eeaa3f7bee7964cf7d4ff61cf6efd17ec3190c2701c8d17b90fdc31bee64ff90e5e6de609d9bd9d604fef1862aca0e41103bfb18271636beccf331ac49196282b297039594a37f9c1e0ecc862d471c6e20c7e8b34fd84f8f7a3864ec1386b168c33a16b21d3ffe1d10223d15858ace423d877b4edf6120f1f4f5bd27d2a37a7f29bfbf477e774fca771848f729f8ad6a5e94772b064264c5633eea7b26f740eacfe730049c95bd7df912570c84e7513da8f7ec51386ef51ddf382b7b20da893d79949b56ea63cb865a46b94088ec486120b2857afb2737c805fea40814963ececab23f4981c59e7e10204416105bf47110fab1154a9fcedbf183fd0fb2458f2e91de97a28225213181c2122e94ae4042855d9d4e4e3c1b44f74f3abf37bf5ca2184f2fd17d974bb48af1ffa7ebf29f4aca4b8cfb374a0c315134c46509a1a5248e804250ee7fc1e14c8aca89bb364a48474bb8507284242a8e4c11c17e1a97ab82f9de54aa0392c228870f721ce520420e24254db3f6939f03488a88a30309a3c6d121e48388a36389081e358e8ea106891073743c11599ea3238752e3e848ca918488a3030bfb3d1026812c617202963ce7260857132b38fcec107420a14348c7123a86743ca1030b1dd89589561cc97d440752ca7d51b92e2bdf1ff17df9bb2a2360b92923b0e16c59b9dcd4cbdc1f9907426b810fc44d2be66164906484209334e3c38ccf8c103340332b98099a199a59c2ce14d9789142a34453832880fe984b738308031431867e952457f9141eb42503438a8a8c8c8c95499271194f069399999999999999999939ddcc90515d5e5e4ef27ddd2eee1246020be125f0107e021761232c056ae223ebb78bfbba4b33770985437b97301258082f8187f013b8084b818db0bfc0a8569ea761ba776972d9c28bcf4b142fae17295e8c5e82f072f492f4824504fb35ed4549d3346bbfef3f27d48466a0ec7b1f5d5c5e8a5e7cb2179f179fd58bcf4b142fae17295e8c5e82f072f482c54bd28b52ee47c9ed65b40228829a00ca374afccd117e1384f5626693948fe1edf001853f8687636695189d5f5486b94452de5e1e545a5ef5b329470eb74032f4060746461a6c2950ffbd94c0f8a289174b5c2839c2b7a8562997a64883271509031b5a2c061891fdceef69c617d45f119fd027840fe9c3e24bfa96f0297d4b9fa67d42421f934f0868b8d196a28022da14316ad0c891b3901a44d26092520c95151d4a3a9474ce8c87f16c60457c419fd0c7834fe8737d42dfd027840fe9c3e24bfa96f0297d52f896fe63ca3f58d9981878995ea2196f2f918c930c14174a17282f1429a02ca164018549e5a3f22182fd9a5501dd00194191fb4330879aa6d130e120da2cbd9ca5e42c9a24344934483447688e688c5c1aa35823456e1a28224d9108f6af68ee308d0b0616c535337178d344ee47e1f02d0e6f94c8edba39c29582c31b225c285da0bc50a480b28492051426958fca0750059467189de477fd76374d449bd34b192694b0f1428888109cb8f0ef95b91deefc56a020a88fcf3dc9d0b834252cf6027bfa98af91a7633abf14c39c904e423825a17c40f9a0844001a156800a420da1965049f93c4715c15c9a228dfab97a3b82893a09e184744af25392774a3a25a59c92544e4948281f98a07c1ac7060a282196a0801ac7860bd40a9450419e6373056a0924a8a1c6b1a1c2a28a72ff4a72f24fd8cff06c10c9fcb497e87e776f5cb1c627d634ccdc42917c03450c4111d111440461d3c4a464f345132f96f2a4a1f941b4313a3a8214840ddbbc62cd9095b9a1cd72c68c2ec6f6dabad896382438216e096e887b22b2b822e78c9aa33e28eee8e46fb7d7d6c5b6c421c109714b704f70469c1438d4301cda6f5b42e1702687db12107774d344b4298a35435c0d166927f250ac618a354c28e14538a382c30f628597929098406109174a5720a1228296e606b1a606d1c65584bb30d9afe7182f73695c97c648834748ce6a981bbd1b365905d31831614f46f604933919d7e27b9291e9fcf6cc4ce757c618776eaa0b96e9259279efe2fb394be2c791a648b3304ce35ac28613ec663c1c5b5e61edc2e496abba2cdd5d618936f24f397cc8e1d338271194df5f69747e6b72ade9fcd2909141cd179aec5d196bfcbe908f0471e455c3166a680283885628bd727f0d4d356c8175d3f965651a88a061e9003e1cc0678606226858cafd07f039800f200c3b47ec30d120040d402ea2dc0fe690c6e517cc323b47ec30e57e1a8068106226001dbd4432de5ea2193f2fd1eaf2b09a1183123134bd6e8062cd4e117127a86f8288ac7ed74cbe694209a123ec0d1140373e4d4b51fce49b10480146b6f92232651b28441b2ee2923ce3d218d10c21daf4cbb8342efc7269906890c49afe994b93e42c1a22e4fe19daea431a2d94108aa129f7ef04354e02967aa7888893002944b09f68e6572ed10cc6099042c4a18922828d43e3b2ee7d2e2f35636951ad70dad65d9a656e74d6cc9bc6ada85a584e597d7171f160e4f5bc69dc8aaa85e5743b6f1ab7a272fbb964f5e59b3173b12702d25af8595aeeca4724831fc316cb365cbc8472f8d1b89cd5ff97c688e6c859fd32de0d989c826d5ed890a5a9d1612fb03739fe0c0f074cde94b0a74ff990c6c5692ff3ad5ede705695ab43a9719210713a6c638de46950fecae5c21895558d183abf38e3747effe925c2d86f8c4c6566441bedc2e4180fc7964f78c2e43a80bad3f96dc9d45e22999f5873160cb6cef2cb92e9ac335402747e55b916a0f38b92ed2592f1f412fdc43c105a6bc6cf190f339b1a474752cf2d441c1d58441fcfc9f172560e214457e3e4406a508a88a3c389081a358e8ea220c49c045021262007508358449c1c4244b05fd3acfd3eea437df2cabd118a35fddfbd2972e3ba2972567fcbbd61e266e82689066f4e9707ecbbaf322ecd0d22ab1f5f1a1e4456ff8c1f20bef59d585a542a4fc3039a1dc49dd4f7d3e880c648dca1df4f23054d0e687040634473031a1bc49deffb696a405384268ab8a3fa7e1a1ad040117754be9fc6157756fe08fe900608b99fe6a80b107369cbe5c65833736384616513cec872fa496ad2942c1f25b59265ccf5d68a4a8aaa85e53bc5dc6eada8a4a862ae6ca15c22a09b96cca764fee4d28989fcf4f66ac0e6d3a3ae06be7cc24432f8277cc932c61842962cbde7e91937b6622ed6927183dd1e6c4622f7ebc0c2889cd438374444f0e539365c44563f14a858f2c2da7c91fba97879087c72038d20f7d76ba3746d926cb46b9343084a7220358ecd1122a8c389243a8a1ac7e68a08520129014b9e6333456409616324f7f7e7006a1c1b1c447002e5fe980cdbbc862c8d2b77a5a1f3bbf1747eb59a3bbf99d6ada81040005e003a182ab7d5d0d0328c86bec09ade6a19bf959b13978bc0e4d2b20a243057647294e3ceca8df9978fdf4a8df37d8cf171f5f13fb67c7c8fef3f8d03f3f15dc873647c043fbe1bf991e7e08fef4839be17c51c1a829ce56f2385087a7c2722e2d82c35c824e63840495bca1edf813c67e6593e6e3131a746530c696497cc83ecaeeef5eb9cd3b3d17da51d7d714ab1c66d785f312c2909ea156b3c1b27eed5a0ffea35cfc69cdc51139e5e21f16cd8afdb76f295ebe8156c8862cafe5c4d7ded3a94e790f060036b62e3c4a4c4060f386646a1beda2eda883ac593f6bacac913961387146bfc63ae37562959787ab562b932571a82dc460a364b0e50f29c1e238d86a0ac2951aad1e4393c966a34fdbcf0327fefcf8cbf5f69135b79f00a23f7d02f73f46cf872630ee9854b44e5652e10df22a2fa199748cadf0bc4b76e0ad0cae743043f9f063f2067f90fb52079adb5ebec8d7e240357db55996b455de9ddd8496b595a5abe8f9e8d96e76919e3ce4ba6f2841f4f788251912be553625d220b882d193e9690c0e42329d6201d114a628889222424f171858f214830a205530f2567bd9630c99ef26ea86417ece368880da31225ebd331f8e3eb52a294659e8dd5671e8ea9ad525432d022c9a76388b4f196e962c4f23160565e8c5470d84a5438ec254cbe6f30ae785db1d403c80148b1e627872830e64531c51aff5553f66f6992fd750cf1c20ad9ffc361b462069f430e496606b73a329463a8d210f4b1b40cd11094b550b94433c01eaf1e4bce72a4cf8721d98df82299195747111dae1ea31e233d478dd3f23c96623cccca8bcb54b22416c127057bdc0368078806a058d34a94f492252f386c26dd64629477e3cbab1a4d1f0bd00e10ead5944a7936e6a374598ea206730c49a1a24865f537b89c553494841053131bc0b8c1e7b2586e68e2869f66f9bb7cf821e5287296cb59398c7218a1e2089e452dd386261bc0e81c1f4a1a87cda449131cfacf103ec427031bda2ccd2441363356f8793a25c50a2b9eae307829e908a987518f2397e68a353d8a7a30d1630887261cc0f0f92902c5104908696144524ccf51cf9124485a700fa0149795ef5bde9fc712be3d46643c1b2b2fe3e198b9e53d07d65bf5406a1c96971830998a2ae5331cc62b98545429b108413262601f422fbcb2ffb579c51ab7dfa77836583ec5c331f3eaab4a6785eb59acff7c88383ca488200f231daebe61e806a11b8cb821c886251b98d8c064439306fd79488184896cd438372811417f244364ff959f1c45395c0de628428591ecde8d94dc826d6872005284814b5a752f1e8e94fc4526006939e4909810a393b6e5637836bed5aae576d98d396a1123e3fa38f2c1727d18c51ad790221f1f3f3e8086086a30e67e3ea87ce0c08711cdf24fc222f5409224fbbd3d469ae53d4640d81c453986e470f910f29144fb408a3b2cbf82c356c244855fde06309ae5af445b6299588114ad487ac161b44229c905dbd0f4493392fe885392fd57afa54fcafe7ff448f9e44ac7810de315313d46a1f571e4c3880f231f413e8cf091848f211d2eef31f21c1f8d8422160943342d7a20f548eaa1d4a0bf0e97e7f450b224fb0afb106ac2862ba3378a35fe3c967830e91cef815464c3559151f65f15b9b27fac33522e918c8fb93d909ce558460f2d62e417dc23c9091bae80645c4e6905e439282667f9030d65f711ca8e6a5a0165ff2a2366460f24cd5272964a92b33621a1a1ed4614206c189f004401a0f8840074274f011da82ba824cd745649cd32a64604000000e314002028180e098582c168344d84d97d14800d829e506a501f09b42489711452c6106400000000c888c088cc3001c78df9401ffa78fac760c56d42327a326cfb3b366ea55072b15c38c8291105b5aab19496cc0f8187582edbdcb332dede99a3ea81e96bed5219b9a0b8cc6abbd72e97b2edb3ccf18da49db564be31d222d9175793b82498369d6dd4a2c06f6088142a32992895ead3d6229632331141ddb9230efbc98cf8205fe268dcbd8b09de249f6df99682257c9ae7d79eeaee7389c56d4ca3110084334f5672c31b2dde9bb2e62d46111850069c5382112fc7839e59504356a9b25487db57673f682cef07c3d71d85fb4980f87106ced9ac3815a3209319d796a111183805cd5b10f4094563a18dfd115d1026859cbd1874b8e7c80862bb4368e5b047bb8539d5063045aea5e2de9f9cfa8cd7a8ac0f01fd44204e45747343c6d4643bbb9b584aa09896abda2fdf29d7da2e5bb9ba03e08295fb63512607ecfe8c772592af033147252e509b1c4a1ea19d0a340f86029e1cce98b44a45e61e658452704d8ad8bd5549187baecce0c785411311c2cfe3eb124b89857cdc0111fe06c31cbd08daefacbec33600a36ff1604425469ff4612e3ee62e265f985a006ea3ed35825450f81b27e584c43d090c879753c0f56228cac8e30e4607d6e2374a2002e7f2b7fd3f6016f9ae1f135cebd2981912f4bb8e848855fb0abe1860d8cd688aa23cd6864771fc2a58991d0d4865f5a25cf80b4d9fcdd9fed16500c41edbfaa39f95a2d69cee419e41d6d1d3dcf4bfe99d6b65643a22b6bead68982cbd754dd3a91ec35d1e9806bf32619b577611cc371fe4f87632acf179fcf40687916c28d4977d485dd1bce99d8c4705c1209e7dd3b17d5614c457fe541a3d72ec044b100b8db235eadec8c3de1e2757e968699e6ad6c3110227a8235a09160d89e6e4273c2b91fc182410aa3c080effec588fc4d6bb21a5b062885a66e2fb20b3c929f34eee957610e63c537bb843246db670336cbda360f289dedcde6121e1bd276a509727321e7b3223582a8511476a3633197c98367bc0471cca54960026206894c9951349f3814c1742a62e2218a3bf87550d2491fdbbc8eb04f8c0d50788007fb10e591eabcbf252024fc9c040717241624d6c132f6ba4bb28024e5063b2181b38550adfe3a8b4b4cf12465e79293e7588120b42e97715d69b8e622774afee269ea1cc3772deacbed5d593bbaea50e30b6e5ce71d7be466735d152ed9a9dbdad233354f4d0601299bfe8edb5dc0fbb5fc4029165283dabddb9968c763b8d8a4ff426de574329b370e8935786b6305a65eecf719cac641f34f8b894dac7199ecd72589048a0029ea55bfdf67314b3a85511251cdfa513573cd8a075d89122db0386d160b37cbbbe09b866ad2ad9abd530109cadbc1c923d282eab69420225a26c71a15cc796d926823947f276e3fc1aa1cf0a4123824b726a59e5aa04726c36b7a5ff2a35e783a60f80181d08f1414651a961ac39c50ecef4ffbf9da13b26ea752662316c06dd97a5453d091eea21061f0cbcf6d2b11d8bf8bc13cf6d909530d8ba2eb4db96bcd0b5873ac9f482763b690fbf6579d31963abfd62879d04268f41f1305cb2f501bf91c04312fd0c5870088e9af41bcca06bd7cf77974c1961214c007080619caf02d6ad986e311cdab3057757db8b2a886b07c294334a888e41ab8950d7f01416962420c2e659d2c497c74f8b8cb3c5ed4bccca16f540885f2992355fdd20ef6287d12173033a4682f64a2575e4b2a38dcec8c2bcacaa19a9bc11be35bfeeb93a376b15904f6207b14a75cc90c32609e8eec257a9b17f9867fd3e32c474032118225c4b9c13787965d6ae6e0933e52d5caa6ea1dd60bdc2038233a7869425917c8cc0e0a6293ba146b3f3f6739ec942a18acf522d36a333d64e6d612a2933bd42e2a86fdd04668e2700ba22318bbfc3f84d2a5ccd5c0e1186b41681c3991405bfc9767b5342e04e9a3f4620180166af04d4766f414019fe1937b56b4ef6076655887c8e6a0c443344be4fa7ab0b87e803465eb4c96008e8a1b95d9b8898fae29404c917b13775b7830fe62705d813d4c465cc620e6658a553cfde13b2cd76176e806b57ca650298cc413c9ae096f045041e2f4bb22f0459dbc7adf14ccd94536ad1d25d3011c88419c55a500ca1211bbab6602fff1195b7a119d9639726d0442f58019f6070621ac85b1d9acb7d3a9e41413de82afff67fa7ae6adb168f30d8d50a0e77de45b55aa6c3c696dab82db53487d4d4bf29305ee959318d233a431aaf878f75edcfcb2fde70e04128537d166fde3b5d29c0900576073ab19a2a9ce28a705b3f8b912a8a2c18b63035924ec3507d22978ca1c97948ba1ef9a0df245db99f401f255310dc115c288e2f16fabb33119e7fd4e81546d825e3eccd0e247fd60dd30328800e44a5696a18ff5cf7b6f8f363a2292f9a6e95e2bf891eef5152e39a0f3a687faba32f4c51a6a878dcb22e22a2525fbc415fae4566484ae5ee560eb80a4dcab5964f06ed124a56d593c01891432396e4a813b3109af1cfcdb065266c5f256ca75ba8bdd42bb99866e34715c26c19b31fb7b2067019601a07b839413d0527eae5b35c1a8f597880f20ea92c94965062e9a151be158c4eca73585aaa5ffcce0f902eb2640788648b2a4b10027d1167f12243651ea1ae07ff842cd8771de4b5c260a8ef5c48f556c805d57922b54314c45340b4a8fef670985570692ac03ccad636c75f258f14dd6f59882c7c4b8408134781c176d8d40b3acb8116aa06fe8ac1e81ccc157342a832483ac9b185eb49d99ae8bfc6b5464f2831232e86ea14198fd7c029813a0ec8660270fd24544712293bdd3a4cf834581fb42268a3d011e53289343fada5b9a0f1cf096fe5fcad244ea4e0b697264c7256a5f6adec7dc6786887b52934b52263dfaa9e6036ca12ad84211c3c9ada6c6a908dfd80d894b13e2e811576890625995070d2940032950a81743392bffcf5aa8a7b0feabf91fbbc715dd028706977e6ef3477ff66dac2d20e6ee194db483a45f6fa697d0c761cdbfcf92f262bc261533ad041ca9907a1cf4c8b287a390ac3833610ab2bfa679597a3e00b15297657443f04cccbe2e7a6f1a259c8c980b5e15a7d8a82db174a968656ba852cbcf9f40e59d29f1ad98a22bb7e672901361f247140934efa03201cb8f938228326c4169f2cc827812c56581729bd3d240e853499d7db25c481f387c61627be577c9f47c25c24e74d51a84e4eaff6923a11e23248ae953007321fca91851e09111ed775f6b45b95fc20d295152fb85ad32016fb0b12c83c02269f028d117e6c23abb989b5d5f837c50caa781bee408ae11d6d156ba4c0354f00d79198066d8e5667ea717f58146d30fa2b188a0e9e3d3abf89b58611b9e424096f394b6c7318a926195a1cbe04e8abe860aff88645f93f941bde85337f531a4fd3ab386e3eb2e6a03ca17d346237033e5f2e7029f6123273274febec1993f621652ca73e279d0295da3720d0617434ccec5575c1351460e289ac3cc540480877c6bda7a7e56b2d88279c0d90fb896c8dffbaecd4bcaafed9fddb3d5add53dde7f77767d5fa9f4856c3f73c8824588107c1eb574af5e0af295ef96401346028fb767c5d2ff01d54d311d95e32bc8a2b1e3da7db3dc0913156d30a359476d363b29d8afe70b931c140aeb8450664b189cd1d10c2391da0c906377460b269cbfd15bf2f28113b1cefe9190b2148d1c0f1a4ad1484c37a0b60255c7cb1b896cc0906a27130a6ae7510f26af0cf6f781f8ef7f452a1068fff0248c18175c674d2743f2aab6593821f743dfa604c68314a091e8b052493f75266ce750d13a044b605458828c1b41cebbf5b0e95e53de03e0c89d292c0c827f67757ca1f3f6db34f7c356af0678a8018fc8991c8f2da2510bd3202b809a7f44d50188c3a8836b0589f1bba937a096c8045aa9d7da547f8b104808d35a672370c5589ebfd656e8e7923ab4e2403abcd233154cce0bad4e646bbb4557bb02e124b4e2999d075342af1f32bb671e1a8fb90dc60059a6ad1c0db18d89a7580038a62bf88621ec128ddfc1005caa722e7b00bfefa4d4e09dce131e2fdfcbd3fca3287f4f9ef7ef0aa93feb9eb44baa188d165d789a09800073b49bdd8a40a285a85af4cb8f21077dafcfaa211672f80b76a8ce2d4e4d4fcaa51870f80bf5d35948693d27e97a279ea20aee2a4debfcf58cc1e5595b8a6b1f50b34f223d8b4a4cdf88bb5a9aa51b5be1a90c618b17d552f1aebdf29493d163adcc26a35c469e22f25a2b7d63bf472f89497e3d8e4ada236674a35cc5e773add9979bb7be1a219eb7b988a2e1c94edf39572850df18268a6a311d3c2ce381999103b3fe3b0b4ab004e767ba0236d8c587b2f16be3b426b940f3352fbde4c9f33dd3ad38c218eab75ca1e59c8ea30090cf73b4337396c0267a0fcb4dd24b5a6929930a89b8470eaba4bbba1a70407dd32a187efcc5a4e20654b6dbc322460510b39be260c4b8e7112f52fd8de27acb8a64dc1efa6ad62bcfbeba2f767e42c2b998cd66353e95320fe8aa37a40223f5dd2d760dfd06034d22dffa64ac550e4464f5a2c750463195cdd44afd311ee03c4f60eff94bbaf2e795fe1b1f251df67e5667955730bdb9716849001411e4b50eac086e84e9ed24f4fbd631ee5fb917b215feee7253b1150eec145a9acfa5d1b664b15c9bc595480d8233066fc2ada14ab38e72c422c6bb6dfe4fa73286b63f769b5aedd8617e3fe0c5464402592e07bb8a1dc8f9baf6985fcb673dff57dc0954da59b5265704397460ef09a98a838b23df415279f47f315030f8d90d2988ac5833bae66c05b06a34029402ac29b8785e06b662b1782c341e11d136b57081b5248c2229c22fc7a8bad1d24aace43a18086d7dd93826fa060977deb9489086287f2807fcd3c035b66d224f41c31c2d3af48d4e2fad497eaa68e698fb33a007f6062ed40a23e3b21bcff5fad035b5260b1b6adbe42e7ed2e6aec098b5ec18281a2ce21636d35014c1c25dc9c5709696d922e9f418c09c7159ff333e81020774ae2e9d5eaf5f5430bd30303c6ba61fc2b897468109f079edd02553b96896e040c681a7a86217e10318173d1b6b1fd24bc5e9435a8baf2c22c310aeab55bf255d3c200883174c267ec06c06f43ea443fca81ae3c43e8cb024b52500400ae08a915cf8c45c84d572239c8abad80f16ede7a267f29b651c163f2bd5e6168a79d56bb219e580142231518f8a432ba7f9e83dc7df7857c118e67edf6494a475299d68b04bd33b7141231e9f2565cf289296cf9ac3c4605a374ca5229cb0f5983967db6fc0dd06c4bcb983960c64cb1757cd3013e82f9c4c480982bec2a2835e7460486ea6fa0018c3dc5ca11099f1aaa7830de111650c85317e15cd7c645b1185ab725aae842beee48e792f5df54b2893cd61048cacfb235ca4ec3106492c38cc4442d24a6c80d4c43e8c461074023877688f72894f84a59b7107ea154a4282de1a2a9f37bf017783c7cec7d59c498e5345a6090b8d390099f210100e66f783bdab0674b5e3e3addc271ae0e06a9424e7207df2dbf6ead20da50be05eed2e7a1dde225c635a461a1265de2e57ab96991911e0845348f3e9ae77b6a5dfa18e7eb57bd3080ee92caff4af87cf972699536f2a8610263512f4c70aa19db479508f2777d280c3a4963a9010864e6542b96d851b7106e6db530aaf33b12a10e471f2927b81ac62b88f1ae88fe10437af3110b8825c2b7491c8d87fe0fe419d0322f26d32c38191190eafd3e44bc11c0ca1937854167324ab114f5aa303d66f1f23fdc4c6305b5e7cd17a9a27f6851df71774429834be1f6ce0cd8523543a9054c4845a1dc07cceb32964c48136d089c51232cd73c38dcb2de304d25270346e00cab624b9701e7c32b305f96eac3aa7705dda60d8839a7420b564383a410c028341ec82b8403a43dd67c3d1ebba63d52234a3087a969034d1876a323585f8a69e292bcf403ed4e4a3645e3b8ecbe2e68fbf7f99c7bed56620a51b0d184666b27bf59ff5f84e84dd8a7e8cda96285b38d4e9340560bafcd082ecb53cdfd9c297579dd35e19957a0b6be302eea24f4bb9afba9ae4ac36ad42428921331f05e1e6718afaa3d13843b4d59cc0ea5168eb00dd2deda168b135e29b518226d360773375c9c0ff6dfa8eda8f990972760092e8e02d05d3b093036c2666b0a4b49741917c1eb29580420eeff998242cad23b3995904c81c2c4c614012e23589e73dc1564aac4abb093f5d313d865e3a4f8934728e4a919599320f7f9faa6a4a4819985b62f8a82076d37d38966e3a67174269ced64d0158479ba672402923b0278037c9737bd2e6dee3e4da01fc4fa8ee61a2c1ecdba9b15234c6f45610049adae4f126277977f26045a935fcc6f8727b4507cbe2b597b88b2bac581cd53752b521faa4a8c6f1cd68a06cbc7d9ad5e7cd3a343f89a2d30d2d644d2ca34b1081c16d5a0e35ee1ee0eafa3a6d147c951592c733402128109e1f7ecbfc4b166ad51d0d669a54636991a176fe6c23b514e052b2a5a8405d307e40900b7fb7416b9934bcb030b1ad843c1ac5b428deb5dd8dfcf713b4807f1d8edae113da864c2975d0ee0ae210c4c9f25e999093ba5ca2b3cb89933dfb9fbd50c38c1c621ed40dfc78169439a61da783138392bd9bbd72c64cfa4c124b0b786567f6d053667f489377217db32feff4de6446541f2dd4ffb9ec4b9274f491fd9de145540649b83b0dbb8ecd3b0588b42aa1d57c03380b259b99093e699fd49a4c08e8d8e0ccc882814b6b51edccae3f90f2c318ca9512067c8a2ae9c20bb7f9101d365845667465e4d68bb7790f0c6d1a174f6e90d8b1c80903a1a6aed65c7a4c4f3191a6b5eb08894368ac11f5e94086970720c24d28780c833c2fb7011f6d0218cfa30b6956868140932be8179248c319249b4a71009eaeef096dac9017adc217c9a387e5d54fbdc5d6e470a9b9ae7ad6052ccef8e6b41fe5b73b9c58d33d4eeb2d86a0bbeacf52d6ae3bb1d8ece8b21094015034931b9e8f235b72d84aa61c5c4e0c5502addca6d542486c437c9e49e4e9c49c05cdae412b93466618091e81fa9d922e671a9e5381a2e47b673b04851c863679f5ba4bdf78c7df7f34db97357b849e55c556b21629705ca7c5ef0d8f4162f295a45b22cfad130612e746735bf4cf8cb86fa76a4c0d69bcf8f616570cf93cafe1c2d52ed3f73f99eb0f047607717386a24fb14e95b9c82e8f0e2289e65df237b8d3690b8d752e9ab2258f7cf97ee3b0cd319a8975f6339245cda0fd56c9b0ee13a0ac1d0567cd78657a71e61d2ea92aa147a9e65713eb878de7ae28b4a3036004d14b18135e8885043fe62007e837587d794fae876c57e5f8f9614e8008288dc4ea63d6f22b1f7ae07f0f82f9b6430104079e3c643aa82288a185b83a9385557d258bb3cf069fe8b076d53fe8bde85a19dff2d4e4282e7d11e64bf19029203fa868265809404f4521915ee31f2d8ddd8a23bb90d51fa813a0e4b77f522b00cc39ec76b4962245c4723dd2df8d7a43a1c7aedcbbf8ae5e5f84e0239cb3f159d398d487857bbbc432e97cda05a50d26298fa599939cf5368451e8d140fdc742041fcbbd2afadac98df6aeef9ad69b18402539d9166203fcf2a76781bac2e1f1edcc3b59fa3a3d398247859b9e4812cb8ce13b41fc185106480c21a3fe309b1786d8e437c77216e155aaca1b1eb3c7f228065283b3409c5df5cbe645a81557d1851df4d6b17ee409c159ce61f502b1db6adbddd9490b6a5cf046823a07b647d6589aef0eb9a2c344dc4b28a5edba808e3d604cd9750ebbea054ae8a01c4d60f8297ecf566fc6cda1827d4f7bc6e600fad179132a608b29fb12030ef926920cdfc67b303dd4a20f4b16397180f64b3a277c24d8ad130b828fe73c2dca2f78e36d57eeb8bb6dc791d91f9745b11c4fd057aea353c1a12c126ff5c1d11795d0e3f957baf21394879ba7bcae75236f94ad08454ba2723a4d31107ac770c56f25f8f051c986c95167583460393cad16afe6441f53821b42697a30019134019d7fc03604cb9f8259cb56243b1d5eabe4450427bff13675aa8fa7e27272e7144f5afcbd0befbcdd18e05a13de49bdcd968364b67a476abfe9af9c842b158b3e5e20002ba69999db00301755e2a43ef63b88a519a8df9894d086f43d72304dab839371eb54f47a569b2b8350fb6ccb3612420115d1ccc2e848398fdf75bec39c8f813a57603517fe9ef11c06c7f47fbe7c4da979ad4ebf8d4e28726b52684022fd5172f5a08cc24532ed734e83421eec8cb6568b39adec40c0563f28af554bef43224e1888f7846b41183f9edab86734a2236cb2d4c292b98bda6c5eb37907a4dfd1b227fdf4bae0be69d8b81bf15d3b0e0bae62a8917030849d508e5ab0bf6656ebb21ee82a987aee8a4f765825c88226003f3da5d317dc90f30e6e86cf9fc9b4006437753055d99ed9755e23aff7beca4e9e349d962c0bc9f54f93d2a8570075f48f07e93a7e7bb18a7fd1350ac2775389ab60fe193abb38343f8250030c3b22514e7f8e06a3da8edc0056ac32f4c74260d32f47a89f409960bd0ba46f21c74fb1d2e64a4c4fbe007019b7aa1e676fbe4f1de7ba629a009170efaee8451d7c8ed8760e9e42c996fb5f0a1c631ff6e6991c3f6a6890b2b23a5e8ef455aff351a5704375d2d56198faa3cb4e8f093403e3b420dee8030fab1b10d5d7e62d2461cd89f5e618b0d75dacb9b57791a971a3d7316c308d81d7a028226e0f5ad6183900d3badf3de98c0ff361a2167115a4281f054fec655bd48bbd1b40b8f23308885c43ebf9f179b0c0ed8e8cb2f8ce8e1b8d231e9aa695599715d0f1a29b016bc004b29cce9c54cf4e6c3bd0ad6cc9d9edc987c3f8c6106c460b33546e5582c7103be05effde56259e05e0af1cc827468f7f1b458e3bb3c84afa94090a017607582882857f3ef96f5c014028a0f4ce8b7089c2c1d5600300e5602ace28022cf711f4915dc6082978e8661aa7b0cd4f179509d555098f7c92bf14ea65d8abf440a3a62f3895b1ae47317cd0d6bb9b1eec9631c44ceb010bfff0f959582727300acfcad2cb05c06e8ecb9000a32bd56b6d001ecca63c05822ccea99db8da6fed843dc1f8fca71dee11cdff18ac6fdcd9115667c06f01118f7df723c9a0171e5eacc8bec627f2c80589408cc72147a20b6ee68fd4a1dc5251574f700d494ecd9de35f46ffce482e607747e862cb55f48ccfd0b59b6d41108d080fc0b64d5d9f55d9a9f9ff3207075d3dca52071b1280de802a340d842348a658a86c13386ca627ea946bf36b16a60407f70519f6f4d13a3ab333eaa65050aaae5d1f26d08edd0d5a3cc089260b7b16514eee4b495a54c9b6129d9519c86309daa500c37e0447316266c3bd0e08952ded88c3a3b3859436bf0bcee35ba4a2a2429dba77f4c47cce51ae6e1f15d35d232de4784f4697f581b44a2bfcaefebdbc7b10506fd3ab5a228e53ae314b9b06e657aebc01e144c876ee1c063828f25c6086d95bffdf11f088a3e78ba8f5a3d211c4d441a31fa1ee0ca52d20f9d1d0d1432ab353fed1c69dbff426af9b1982b8aaf358a4aebc2d32fc8bd450557d760a01ee3da32bbeba02f5a7e687fddea5703e239148578f0cec6b0cdce32f303a40a0bb13c4d5df73f20373ad6cb90ab1f5231ba63519bc0f08e5845109c876d209cc2ecc7c0f48572d43118fdc371c5e3c20fa72e3514fe804cbbbbd9ae87e1680ba3d13fb001be428c2da59518dc3546f76bfbb9b365ddba40d21b2043da0db62d8bae9800f6d7f9f7f4086ecf7d5b784d4c76f94fc63d53e01b99acc301db2900cbba02c87e1fd99ccedcf842e6f34f48e3cba2ec5080e1e7be361246f479998b983b3809822bea37e477e1ecdf58e2ca711eb224707b5b8978274299f78b379178b285fa5c24630d035961a09bfce58b11ca7e03fbca77ffd2dbb485a2144ba90040d64e67c0a7d49084110d29a34a6549b61e8d59be0278e9ec2fb22f2f99bc9bc4ddb1eaa4cebf7221fee8591b87fadec7a52d4b6201c3dc5993caa62c219e18bc10f901d106ecca1e7d5efa8b536c79929a36457f675837917b26b39063e04776c72d3d6f5881d6cb855c5e213077dc7adc175bbcec4ecbcfc89f61184cf49a46ddb625aa45381c50d30e75d23eb0c2058ab71e279f0a4f45773cce4e3f6fad42f2ab193bbbd369ecaaaa409032c35735ffeb16c6900e14a9fc3c62dd133de0383a8e4b84ddb296df6b8d941c6de9b478ac5c9f9fe3106b87f88eb3a04a9ece008fc75c29a518b0dcff5cc1ca265f53fe58fe83db1e69717e9e0e4f8188d000b7dc449828df3afe9d9ba5a279009fa8fde64c826e9a1c619c5b7edea24e29fa7343ed3ed9ac5bf20971dc840d7ee4a92967138d12576a6c41507d0cb917fe8d6baaca956d66e67f13b5b2cc862a97abebec156faeca326863728ef3c2632dd8c8c89ef9a2b85ac969d4b2b3e9bad24b72e9b1eb4d753b9557c1e6a6f2f54c78c4f427cb7e04a9d00b2a29feb7baa2d6d266ead65c0b8b7173a4f27c406814c9b0b1097e912ca1ed780fe88782ed6951db51b857dab5d33c43d461bc7675a352bca560f89672a41aa25e48ece888b2e30eb71070f97ac515cd1acc5b7524fe1720e3d59a4506ddc60803cf7b3b2c1d6202568bbf7178292a8d72c1c2dffda943fa5ef41682840e141981211e247a8a9d89553bce02ddf745b5d9482627b51da9df5a4e1f1ce6d7460baeb6230188aff5a5816f11ead7f46ddbf11da8c69e6db2047a3dfc60f2f32a62d26689bee1b47060dbf1651cbd113ddbafcebb671c87c9c8761c208a6e69134c6d1287707234e80e7b93edc8b614cfc689de086450516cd73d3d1602b40712d2ce33db9928a954bdbddab08b56bf3700960e2aebf2fb3157ce55b9aafa53790b38d009f89b40d630a5d3e60789cd2235997ce3ccf5cb99558fcfe9693999ed35571daa06233b9a1d58fddf6087df42a80b60ff299442f12505e49115814b09eaae24c40e2af52ba2903f8caecd27d055d57715801c62e6cab919ac29c55197aaaee2949201095d83813ce20f00aee61a89c3c4bbaaf7de46ee8a356c2eb18aca186f58df00e5baae220ff51b2beb2da37990d31c6998fcb2d12e7d033211280b50d468091954a739afe238e8004cfc7a620511cefeaeda4767dfae3308000f0faec96377657112d133bcb10fa199c7521a1085b6947a15d9f39fe9e51f87ebdd9ef9e16c569b45ce86639f024b1e3135256b9821091d99ab49514666da5eb7a10126c7a7b9734a5a57d4fc4f333704a27d9e2af36792a36fbd5234751607f90b004f6d964ca8bd8999ca9d3df153f957cf5ca649d9fc8fd8bc90cdff88717cfc0738d9f45aad1870cbee3005455c09a9855c6c7aa0c031609215a4504f976fcdde2e218772ba18b10450f58323b5d5645a7194e0731bbd71fb50ff356a875d391308ca02d003cb7e52c9a299df152c15f5745dad9b11edb1ecd902c8e99e05936b93968a233bc8ce695a87b0a1f8644f9a6cc87e1b481b835345efa854c9c4a69da3ed742579478507cbd16a29c4c44947c2ccc265a094f70f64999a8b879815a8e9431205692d5113dcf905c6c2a03bdab2ebd827eb192dc1d226650ec6174b099ad7b92cec5fbb4f40a95507cc38ae3658e43828f9f4fd886bad201c87b1a969384012dca2a6b529879d2a5009d8cf293dc815afa20eaba5857b58c40da02a72086da733844149717c4096d04742bcb6d0983f3c879dadf6b914149aec14dfc9f3397599eb8f9cfeea937ca2b18cd1e1d56da79e8f8d063cfee135577a7f2c479c0a26edc21efd9f2923d0e2afa643514341640bec278f028a646eb52b5274eae1c32754bf7aba447ed78dd3804edd989b7a677abef11d85557a64d066f0df50c2439a3a7bcd29de5118fc29cc6332aa30e39400613271ae703db1b15a836822b10d2e3de4762a564b65b6cab455dd3337ac6c8f4ae85ded7b5600220168cb9bd069e7d65804225b5b6dbf077ae8fc534f4b80e76769599f64126d63677f260e6521aece993e9c74abe9d4260bd7b7d1d46d8b198fd206c9638fa2d37c3a9a0467df4756e28f51be44052f3a420b16a68db90b0c4de0d6290611185625d99c24071c66d7748b4b2f264ccf7b2ff229f2f8626c938f56036ac923a52ec2b6da95e2f7aa5af250c5a851f963b22b568c69e42485dd4a937c95a23ccdc33239ffd180c9035535a229cbf05d34d9ac5ddd54bb41b08a5a96f0df0282035403bde4e6b7004e551091732f506fdb2a76b012d9e06d8515a8ec31f49a6ea52b9a0b8405628efb53d2bf1123a2cc7d7299bd90da87f908fa977bd8ec78a13a8f8eb81f53020e6d121c63e9e5149daf88fcf92a24e8ab4288424ae6e30a47a71230ae988b4e1f8a79da2f2ed5ae5ff79feb4162df2646e6f633361d14c6b049b9c6ba2b6e04681f594db9a40d10a8a68c50459035b55e876117760c4df119969d3a2ce32aab8b33b0250686926c65095565f09f49683520445c5bf9b2fa6037f94c8de2f237535f9af29156c15f09418737b22d2345377f9cfaf8783172cfd981bde3110578922cea1d22b0a427b1a8e891485bac7da90e52503645da690ff3fc54b9aeed33816c5cddc3bb1970ab992ef64d1e847ac2415d798a59dbf2709b4048ace1afbe62ed6e30811747cbb312586a658fb316253ef6264cdeec7d20b55cec34f5031d7bddb686d3abfbfa1d1ded6c070d37c2eb77389349e18ec8a3546742308536cb73f2f5ee3946392e905325ee24a00ccb4009da85827519aa522428116a9e59cd45bd57223ae181bf2eb1276d79f2901955abebc15caf2ace35c224016005ae49017028d1a74dd5485dd71c32faa7ab2774383126c26ad8590f7fcdb28e8b85e9802debb3d151dfc708a8896503edc71cf917e95ce4d7daaf2bdd931d7b3e0e283202d0fcd929e39cd1398e8867bf675ea9981a99ed6b082f1369fb2c8e29214839d2e3510f3a6a65deb67cc1723202f90f2ee0cc734c17b85e2daf33ffe2d9060e4c819d8252bf2efd667043bad6c933807cd32934c0ba3e54d96118d147f537c6e7d30ecdcc75c9320cdc867784fc5649f439f53a9aed9242578a18dc11c27d8e8e6b175694f4613ee5fc8992dcc5a0f4a7dc60f4405d042e1295f90dda507c2514322ad5223e3e354325ef9ec0b7e7b93723559b88cabe651275001887cb1d1d4afdbcf3bf4208063ad0051ab8db493a6855b507402b57a7b9d98025e49b28799432e9d6d62ba1b75058a4fbb0c16425058dc16be5a423910ab88d8e8d40d7456e94ed228333b20ee4a3567e26b14fa2325278474597e03d34243a9c38407451b8c5f36b5444597bab1fd4754926cf319922b99febffd407a57f0fbd875dfccc0a3d4ee4b83c3e2c4e6176367f1adac5c11da91075c5a43ff0731c80fe2142fa26a77ab9641cfe4369480df5d9b173d963767fd9b8f1f048047570c241bbc522d34172d6dcb89fb09f5193bc34523138766b086e449f094f32f3a9e29536683599024c44f49e6cd1ef313f22fa0a3c668f9208d51049273782436ba40312eaa2e5d62fc351fb18b8bff7d816c91717a0c99c80ae2e0d071bb32a9eba81793e11db418fa80da0319ce53f676c466cbc121221b195f65fcc6689d9ae904839456c3e9d9313119b2153c4260cb4d1fc1ac6d8241bc644dbcbdd8f564aa77ca062376ac88c83d9f284bdac41a048db56738e9e248839b8ce555f0299e0f6fdd4fdc40f9fb968f4bbf580622a91400bfca5db6747c0c85a078ae4baa88378724a71ecf09ff0f5996a4b5a3f7e38501049cf7a3f494c7c241cffb405b57c5450e27ad9c3fe71382d6b19b1373afa7c4b4af5f5f9a82c903424a0ed77a0692e9eead84ef0ad27371bdcfb5cfc1a200ca1e7b65ab40d219f7c3e0cf3396e1c322eb8cb05013c502bdab9271dee27d25e70c7964c847afa4ed49218c83a7748bef43e4681b586f7f8925fda488116e01b3129b7cf125605470c0328504f3f2c2a3c4f7f514c76425a39c87b9ec4e7183e9203d291d1ba4de075d6b19ffa91b6ff1f32d82a69f87bda0eab5dc7950f2fe9e3340802ca091fe96caf2fca80f8a5b55af2117f49e8c1e9a06173ff67e26d767a43e269975eefbc7bc06e6375ada682214ec342dffafbfdccf9c2fa4c612151f654a48d28386cda6a2e3c221f03bd0f5eadec29880eb9c108716f4161e1c9f8bcb138cebe61e72ddd98fcba025d46e7e8dd68b28168227ba5a0fbb5428fcfe8e86f6480cacf64df14ba6c88761af04a0ae405bfa4be3ee906b39067f4385b431b59b9039361c61ad30be54a1233e947ee395d94680c4aeaaa2bd9fbbdbb30b3fc122ddd8d3884ef3809713fb73b489a920b6bf3ea587333c056ec121dfb6dd5606bbf64ff481d745a76cadc0e968b291f8d00dd530d89cdf81982ab31adcea9748f3c45030d449b1a9ef8b72ee51c81aa7013a7f830d5f62ccae67b297460001310d1ad2d3f0a24faee226bef5a9c911be9f81ba742e43bd2818c6f09f8df1da3b08296555d6d4c50761631a56482f4426dac1b8874609174ac9a940b35ff4bde70c5acd7be7f78e8f3ab898874467b62a87b920e365975384acb82adc89320d16ab45b86e2f371d496512df2da0ca836350848a4e2edc079905def0c0c2b8a3a2e31112dd498c72c154ca344e2e927549f9bd6f599546d4c954add509ed3fc2172b30d2f160888528e911be7f3661a9d8afe01f7adca132289fff0742b7bd4e4dd24d8990ee022b7be2d619c7ef1463f87fa447eadeae27c8d174838fa08c16b60df9cb07040926f90c722ddd2a71f173bc34ee7d7bdd8db2a9736c066536f4e9e1e46ab674b882190753ec53457af659fc9173498987fc1446e20795be53ee21dcc22b4a907979a9f4000557b643c3a66b2ce52c9e7a32b4d188f94686e5187360e3c036c78bfe645b9eb04cc34d94398a49225661aaf0a7f1bad24b4da1369e0ed7815d574e11a9265aa327674a612bb7cf374d75021a7ec32b7b67f8d201a3102d34720e4a4304da13aadb9251655d275e6cf50ca9bc915786e6f8a453c083188c70841708a192644cb51083d32016d40401dfbe6a77f44d23d7c792a2c08c8c186d705dcb6c1e2e0ceedb0dbb236ff3eecf0d567494a2b568bb5b7a5fc9541d534ed3ec5fc4becf1038435edefeb70cd9964fb5da4b0c79c7749ed055e1ac907ec1b8dbb191b86677e64f07883ed504725c3d023c4a24de93dbe7d4e4b78f4aabe1dbe8dc921a3d57fe311bc3c5f5a7c266abf94ac431287629d82f86b5a683b085255be651726c00d42b110b75177b0528159f59b548cce501ea3aeaf5b11ce2f4a638bf434adba60953df1988be2b7097845e171502ce4503447ceaab3f4b21e1082cd68603c495573dcbbbb0c32daf7bc97e3dc496772f912b5f56bdb43671ac033ebb72cda0ab7c14057c7dad11338b8a6027d58e28e8bcc8e6a056855891be3856a56b1401c514e9faab2ffc3b6a4a676f04a478edb0fa725a1eccd5250c2f5e501de28874a21d0e65626e2cdf462102ba943e13966734d2f33808e81b093a37b640ecc855dc0a3a33d6e004df97a07eab547502de658ac9f8a663900fa6d0d2452ecc6027260728c0db2dfb9d1fcd04de912ca045a589ea78a5186c2a4afe9feece866f501e9ed752d0fca354e7eade514a0e91f8f10c55e3548b24753599d7df0d16103ffeb2b53916d868474cbd8008ba9373915cd6c4ede4c8da953413c864d2549edc4c2cb0e4970f29716b44c36bf5446139883111bd81e7ed46f89064f16fafe9a84274099fe99efa0aaedc10e8959a0feb0c88a39c7a69a86d8d8ee0195ecbf98ac5cba3a97c1f932bc2a2947919ec58cd78cb8be70f5cf75b1b6aed86a9f6bc2c067fdb5e509cfa51061c15b4206cd5c2c21561181806014ad40a898ce967d0f586e92a50d9198b14576eb133fe70a0bd4fbadaab7c628e5b3d1549892c7e0487456284d501eaf65f26304d021398c06efaec97218ccc4fdc8f1a1bbab8c0d9c640d00e61d72c826fe0dbe2964195ae9d1eb3685e9629509dccfe971fdb792d78f18f038e38f8b8b58c44691dcd9e500c8f4cd49157da20b0981dde7f516946645a77039b4281d76b839d9dbf9de0925dfdd792cb132b2f4fe80b7357d4c612778e39aa974d9733219e8e77a21e57dee79bb6f81e29f0e63c53c6ccca1c259720e1e1911aa4f308e293f193a697f81bd100172bba0f67b8232302d7b0b7c6af1fe02628aee8f3ab19d0771c34591002a9e08980b52d588c801632dc531c1731ac9a76678348ad7889703d84e04b8e962e49beebd5e39b19bde4ea68fd2f067f980887fc374b75406421080315fbd1a289620b9f4e494b8999512bf9ad266e88a2b687abbc7ab403d8e0b26d3c310a7dfe8118f699b97feae06dc10c344eda7a2297436e17a2f33634b66b1fd27d5871bb2139e9e3773cea1f143a09f47609d1f1b86944750a27a025e84761e031e1867794a2cdb9a01862cd56880b085d2d27329a5162866b150d0e54eb291e9dde793246b3deeafceeeed43d8c269b87fa1bb91b421c4e494094ab6b299b28fac2014b8bf08628d56f0325287ba5e3a563a30aeb06b36aca6760a1ce64bd2a2788e5f5eab407e98b0866d56a1135b6c85f4c4b48fce9fb109c0b8531a0c678811571539e81513345f1e63049da83e2e4b49c684aa287a5fb98668ced80e07f7994f7ef6c285d001112434fa380b2d469ba1f60f0458748f27ea18be355aa83cc5c652671a6480fed33c26ad5ca8f8719087dbd0599adddbe158f1a121bb87a69ac70e9fa0c6e4e110cb419fc8c305386dae0e5d1118d4c12e5cb118272544f294007196164492ea0e99960cccffde09179b2e05d4fd64e37e9df23f5bafd2ad930072c7f741537259ee63aa2a33a43827135104e41b9657188a524479bf92042e2908618bccefcf4de62525ea2b90603d7d2f6b69ff21b2746aff511446657bc571f16b20275fc0df5937bb63f904c5c95a1ac8003df3a4cc5c1694da96bdbcc273b7b1445ae16d2b16da8dcddad1347c925732025f1a72065e6c91c7ee4dc8e32f521c6f18f826381762c32711ad758245ef6781d702845bd11958c7a0b8c3c67365e33619d975aa7dc5f7a504f26f5502c846965ef1ad96e2e82f29fd3f2372110176c0934850db1e81542e1f1b566ad430d6437f7b2bf732fabfab4113b84d096c39f3193747447627862d178d1b8f1bdf6d2547e89237a110e44b6ff0a6b53a388b5fdbabb186ae693962a44a111096a15e09d468328c16895eb7490ca391a7e80ba0ec3937f71b2fc70ebc483f55d72aeb97c6d23e6866f074cd14fbcf45ac89f72ac4054f309a4fd962a8ae489aa12a34e48420282ba2d22c413d31c4834700493b65832073165215bc58a72dd3e716d5e8563ff7adc6bf0e0dd79131f69cb507806e693c679e22cc91596c32157ddde871a13d4330d88c230c2ea37d6a7a59f49123337965678b3619950d13c6a00d73604769cdd2ba74db6fe11ac44a3df14634134442db4e33ea9f0da7e6de802d5ac5d6027c015910e98ec2cb0a289023bf38e59136998071c95c52c04bdfb8aa96404a7febf2618609478980fc378c664155e9a7f5ce6ff357bb296df184c53a1b4e416c47191a871036ac4ba82cbd5acb6b92b87e0d382aa9760bc701b9644dcd3099b26d946ae13d9c79bb183bbb93222842770f1d8ebf1581e5f031f79ddcc6d81b1801979d92cfee3b49724085714f67a7f71903f9c3c4c589462a7c5c9353e13724d9741487665abb9249748d688d0776630fcce9c2d4a2811857cf5e7c30bfca1a96b8c2c008cced99970b8ddef0075bb01503aada8624b9e5a6b6a02c1d5a73cfc2dcc978be1aa7bfc8915fd12bf7e7174fc06f316d8db4d9508d7cf995239455dea479367fc92fba438b0390d1837bb41bfaa0fd72f4d8f111327fa853f42959ff73bea059742b4d538c85ed2ed19c92452d11724c8fc37be63ba4a84880db6f7f3dab8a05f68ba49e22d7c238a5b145b6f10ce2bed8f73f6211be868027bf123edf8d27bab6f25e8f1929048e7d7486c8e719f7616e046f5261b1ded9fe62a730f0e47598a083e616bb9add19e335eea0e46ec5fd2f1b609edbcaafa195ee69f1eccb7470b07d2e33bf1f44e1ba2a75a395654248ddf7652b42a5763e35bbc12eea7366c2d39a16d36d31fdffca3120f5cbe465698a1b211c9b9176fb5e8ce102dfe298350476c63d7a5ecb787c3f0ffbc5658dd91bfed078c360c5ac42ea74a0564b80a3972624315d08713edceda22efc788c02cd7839292993cd36f4977d073a57c0e26c1686d00bfbf78cc705794ef660e667bc407dc6b36ab8f48e617c8c0530d45e1612684f4702d1cb46351db61edb00997e6f21550e8200a554d45fd629c830f022a2251464d1dc796028b2903812daa585b4fb431cc42655c30be315daca437d8420edf91302effb473683f91fb68e5b4c89b658d131433ee4502d06d44872a757f3aa6bacb9d86ec2efa453d79b80ebda41d24e282109ebc2b097ba82f305fad5213d7bf291287873fef9884dab08638c7e48fe2a3a7f820dbceb5c726690850176aed8f503223f103aee8f2182e2ea7ae8c16a00c1b40162aa3a556323220e77f9055d1e96ed9355e974dba11a5f98c0c8df01240c20e478e39c059f0941de66982665ebb1afaa2c77e9bc224ad240f51285555b044bdd5689e8a24a447416fa7ba6f50d07f4ed1fd1d4bd0e2bfa109258bcee0dd3cad87081ee94fb5176300b46a53b7bd40017337b9f3d21c461f8cd668070e9ab66845807fb32bac6d00cdbe099da6d0e025d41f8cc1c67d58a3d177de87025c5330953ecafd0a90263d7fc1a8d80a24d3200f0f7e6442f243fbec516dad6d26f9c4f83b615057a784aec10ceeb212da0dc40fe78e6dcc51cdbd2529cc06015548b3bb158c90a28bc3d242f0b37e9990fb8fe8ff3c718ddf99cb39435431d15a5dd783184ee6c6d1871a9f6cf6d2e09b7e4dafb31b054cc057c1d513c019294fb92e89c902a09775e1ddb835029d884f7e88df4024500c940a884a4889cbb27d278e89aa6e347c9bbde7c3a459ca595de23ff753d4b1ea8f9ca23ce9cf8839bb4e03d60b0ea51f4a70633c2d1e0ab72cfce4ab654cd1834ddfb158b7a25e281017e26c2bf3e45ed59296de3d8c70226f5f37023610efcb1910914647ac5be8406490505a91209809da2e77a1da3de5cf4389f61e6e52836d84ceaee644bbc2a0b9a63b9106819d85c718e511cfc392209ec4770605f085341af78cf583bfeb445308aefbc4f388a9cb60dfafec121f667105d392a0989e8b42bfc12672d54f3a1b5a714dd954c0efb07b4e77bf7db4b7d2e0d50646e3a2e640849ae1c125dfe5fc855a64c716c97795293cb62efd5725d3f2e3b3fe00bc59974969b55d1fe99d1fb425c90b9a4530c3253925b425ade5aed0288cb934d1ae860a5719178d5346a3d4bce4ee67b45ecd4e06595d72bf9402548a199f92862b2646e4195ffa8ba244e0f8aad78e065d74b6ceb635099f6868b70155bf3ee39252a005d94271a4649ae3c84e1db013f749b783d0fdaecca5df72797fa4f16a4e6ad6b63bb92c275b411ae7ff4718a55bbe70829e6f7120ad64f396ee60e9b74f30de372200f2542201c96082af70c78e4ce5e381ab701a964c1baba7e7afd705eec3ae49ed68bc5db8d82ee8ea0f70b013ef4361479259467d0c0f2a0856556e1914c5b077999a4ce464f5b943b916c04039361f00a8e97003e23194fd4b93bd13eebc1dbb476b549fdbb2d230f1aacfc861137815a960c271ad3f0a35669b5c003f9d36ff2b1d0216394ca305f7a197b609cca170a8c3e068bcec01aeff257f54a326ee437a1f85df445f8e3e2361ac0ffcab2b034f5838afdeaad510dfd11a928e2e4aa78191adbbae0f2bfd6f5cabd1f45981acb1527c9cac77537c3be0a2984ac222c77958d1898d891ae2a4b1d84f4cc4693662f9d89c171114badcf6175034028be0feb284769b6322e88e3af8c8047cb9a98243d1d7a3d1eb69bc50f0d42e71e3fb5ee023ba238836a51e5bc94b7264396374f1fb0dd2c76ec0cbdbe1060c21707f3510ba9109d3d8c1c8fe127dd6717313dc13b3c786e16e9237377f0f61f4fee04cd8ad59950f946352a01f5180a3fe947190b6c995f02060b37f1df5e1ba05c822243e3831e3f7e5b6a59fa618ac874f6a2e6dbb46edca4d5a2adaa4cd14bcf6053bc025aefefe3d4e38d829691ef44343ea6d9eaa806808a66cc981b2cd16c34e6e729a2e2c2c1a90402004502bf74b701838519873c4566d18e957ba1d10588e5415cffa994b726b06fa05fe21079896094724b9d5aadd3a8620d88a68cf03e28370a235c18da796614cb126a0109b6f36bd073b18f2494b3a597102cfa5286302e7692692909f84a8b9f2218f57d4254f6024ee0c4b45c61b959b0a30f90d9bfa02477891ec5215d4e2125cda02f69399e192de7e78b96db5368397141dabe2fe7f89e4984dc379e937b92be278523ae43a39cd3637e0d86dd83b5f2e99ff3d1757f02e60e1a004573f6ca31a039a029e080424209640cdc9c15c00724b6a1118cc321b374497f726ee269ceca10eee2755340480a010f90abdacf1fb54980b600c465e6c0b5cc4180a2ab98be75a292cf4359b5485aac83b01b71609fae57b861d47a8a59ecc380d4e7acbbd433a4be0a4169d04330b2234865116b3dab9f85468e2e885a8a93b1655ff8a93dd5eeff35b112b06da25428283bdfde087f54a2d427833c1649c4d65f4284caafccff70aad78bc70b6af8d7606ee5705781eb99781886c20a905278519325870d07340b9dc7b5a79142785fc8c0d55254703fd73a2e025366ab6805f126014e0a99bc2517aa5992c52785a9c24dd5aa4086c1956d21440dbbcf4e1040e48f0d73e2012beef0aff19ea58e550ff6f6e4d43070699020d919e0b5d39c46838802ab0ff75ee35ea9d8ef85b42c952c89e6b0de6bed21bccb8adc811254682a01bf5e611742e3b58b1c002f27cdca7fbd9e03a76bc13f8c438d12700b38c09a05aa3c751fd7f928d5840af4c66f9b00a8828a1eca2e93093030ca0e2e1998b16eb7d10aac19ce91ae673d33e21299639fa81f101a1a32e58b0ca0ed109a95820be89e1d439844f965a4141711a9d4a5111d87de62c52d24803651b81d4c823f06594dc3ec04b0ff6b5a7f2230f1e0bc1b0e27134cdfe0a620651f49c4a2a35241d8ab46a901e57408266f7f4a0a57c7c3a1940e74934d18235b15b1a90619965ba4a81b87dd0df84f73d704acb80ac6c1300456887d2a2d6bdabe5d82e944338c980b6beffac5fa03517d063da8667d517074b160a22eac55c97d049cc2e74e0c8793de914d40589a6fcd1809ae876219e29c4540d93a990ff31520ec76f59d872a02f1437111fee64fa8676e5cc125bac59729af6df44c1a7fa6cda471c57f26cd17b12b16bcea983511f1a82dde2112410286f03e7874fb96ae093d9b3527ceba85ede7435981dd869fd074399f12a27b400572bffc84ea2f1ad2fee512f8e421433f8acc0b9ba87f820191347613c3db44bd0f40287cc196d1043ec2d936662b7e04d46950eabaa0fd1e0a5f989fc73fbcc6de8c4900731f11b6653e14330eddfaae8c4fb85ddaf8d6b532df1b1aa14207477b81027bbda10a16358be84504010957d3bfd3ec49f0519c1aaef4cc10a4276742bdfd0211c383d1a013be0ed0374c30419e2670a11f23dc44d4de40886ab47625a25ae8be69d22b8e52a158f204277097ee95a87ddb2256e448016c34fd9f204504d1b15ba82e896285bc6215aba7d53d3a04e0386c0621a60b830ee69a79ca5ca882fde3a7fde557c1b369e25155038a0dc2e7fb482404e6c045fc7ac137cbbcc51b0e89ef98fdfdc635f9d47a2649f2c56939f37fcd4a05e3390bc3b2256b0478845a95b3a42628b823231192cc48f1a400927192b2f29aa40a0bcb3523c797bd5b868bfe31190ee3a8f628a8c3fb410229d00910b5cc5b745a9b5d108384a9ae9e7114c5e3d2b3ee91792e78e0c55fee246d51513c7a35389692faf5e96aba2a6afcdbd820869267bd0f2b97b5a5a74951e122b969f16a2164fc07d4ab3be92de04d6e9f04f82ca2a13aad0995a985692be088bed9a62a69031204dd0cec4dc2429508777bae57cdc4a906ff4f223970ec1603aeee982b156fdaf9c57c395fe5c05dd38fac1c04b7e8e8fe6816d0a16a55fad53e97504166099abc5c188f40abeec5dfff9a4edceed7475330941aae58da83b55282a955c09110eeb527d0a8dfaa85b42354e11127fc70d1f65ff7fdacf780341e6adeb892000b31a0578415607b5d444712ada0f5882b07a09ab865b938989cd2d48ba4f51a988629dfc810ea4039d87a6fe22529ad33da97423a8848cdf17fba5ede2ff509c0bde574120d8d18056ebaeec101ba5449f76b99e4bc706ef9ab107dab1f3c66dd67b8dee91a8720a6f797e90f0296bd28d06c80b597d13d38b93dfe4f54e0caa5e50fb573672db669ed99b99a3a805107fe9d8da689c8dd395f6026b095528baed1dcfb8dd57a38e989de5635e574f69bcbe2e35a0bbfe9e85da6cda443f85634500dbf68d1bccf205483191295881f0fd86f9872d0d573fa35914692ef8bb91a7715c0616642dd8f510edebc5cb7189f902eacb6aa675cab536653a16b43508c36de6ebc30eaead1a932199eb09121af05d0fe3a56a61ef50647ae6eb0ae0b280651a0f4421cc3c5a86cd2c47d5a4c4e23b489edac086890b7163ea0abaaf4046f6db0a5fa3baa8d5d5192cbe2d11440c7de1262e695081d61f90a25959bc5b1dfaa842f456b2c8ab00c6723847723eba7bfceacdaad6570f255dcb702a9fe1a73e736a8952f01a7448862dbaeece0f5c14722d735df1d6752bab4b7e27ba7cbb96f535bff8dd3dde668b7f5433c724017a4ebb1f8d30df6bb69fca282ce16a2dae0c75f544c8a534d8f4edb6aa6ec73da118c1379218ab7cf1ff674e3c0ec982aeaf4a7b4d9bb9162cf991eff22b87b0562687c1cf259be243b89dcffc10106c061194d32f9dc6dcb16632de68af67f436108bbabd09a185120cc1bbaefcb39ee81ff273dfd109af529734958d8e749e474f2151b3c9b4331e83468f8767fa3299e53eceefc08855992f7e8d7ccc137a921fad062bac93e9d490d53434d2c80919e0d46d4922d98d4d43a983929868b42f989322635e91ee4af63b56076cd562962eeeedbacc724a85aefed00f5a96d371660b820737c0ba81ea47c6e7054e9662cbb535271861fa4b89e36a2f37cee85150233a3068c15554652ee508e9be790fae0a145e369722ce3518d15843a872d8bf70af561097d4584fb43fc738e638ea739e2beae1ae8b5f2ae4495548d5be91a25265fd8797ce71de64169dfec305f10e9d8a61cf4af2680060c08747a88cd5af4309ee6f48aca5095cf0ff6ad3d9a47dddb1323d22abb631bfd4b56e71a0e58d4ea54da6fdc7f18409b1f89b6569eeed6ad6235e1a261001c53f0f499780aad446b838bf2f3a8735eac4b7b4d4831019e844c5eb2f820d64b40bdda1b260242b5097a1b1dd24fed4e3afd1551a0636c7a5994557e70446a9238189bc49a51118c2e3649b332c00c667a0fd37f473b212d36d1efc5665f9738cc8fd7caf668e8584473cc12649e5635e243bc2ba10687975689b8f0a3aadf884112636bd7e0c08164a29e083f3eaa82c6052314f21dc4ed478940238a68860c3bb7d8bb1ce1ba64b80bb29d3167abb9b54699673ba7b06176cbcd9d0409c61a94f4e05f6be802ca12e5cd2b211037e558059d604584b0e9bb617421ac0b9015fc4b7070c736ca9e9e605ba0d5718793f08f48ac1077a527127492c18655b4574f6da0483daffd13ba60aef2804728bdfd5e670b589a92cb9aaa0af43b89ae31b5ad0354a5514de1333ecfdd147ed44158debb74fc4235f2e9506feed30fd4eb1f08a9d044e33360384288bd33358f9500a4a321956c1000ee2b86e68dfbba3c665acd8e19846f19ec395f85bca3026b7719b0d0216a63afc28f0a30099d4af6c144c81b86fb9d86af8ae78eda80e8243d3f1737bab5fab7bb486d41f9099986f680f81b21dab3bb593433e55aac4f80981a05ce50d26a658274b8e5a4d91ee3218a708d222a818ffbff57c92c6e2ea1bc90c2e4170cae52cf4f56e005d2f180c31cff6aba82b8aedde10a0250b0c057e9718a9f40f9898547dce74b71bd658add4894a6f3739c767bd60aa6c1e9a133875afb507028298da51c71736ebf7909e64176dc8b12b624ab81673cd25569183ae6314f05add4eb600f0dd9c54ba7a938ef74010f6b85c650322170ec1e5305ad85831470c074798ad45cca5467fdc94ad5779e429fcef1ded22bf074c03714446eba887cc3131562b25ec9aaf702ef8b3927bd2834f30a36c51ca8f26f178fbd19946769eaeb3231bc82375c37a4375075cead79f98f59610ef61c145c336a00af24268d97a4b9c8f8bd6a2b32c3a318a7cd2b97eda63d08967f46eadf8a01cf007377ccb2fea64e3a16169926b26f6eada7f6df11507a751a8eec652d2a6323d4a1b422327ac05bd4c043873b792baa1e9347741d74329b90c3e08c0c14e19785db4035bb825179149c806f091edfc8bd56c7ae9388ed46ed8bf97a8dd3394203589756d81560b299fecfebc460b3f9cfb0c2da5151b353ba477c71d649b85803b664a501a20c4bb3a1380937f5df33cbb406c888c745300011fd54124d360c061b03e7fc6773ef92ab7dfa9384db4e99ce88af4f548013d80edb9b566776f8f55961ac72867da2400e64d1921230c5880da320a9d66043b19ca0f2c4e1b63d28c00f96cc7433b80bd1b4084a0ebdf1e18e60e03848ee087645485fa09cdfc4b7cd710a19442a8f8e5f31f5137f65dee085818b8c42a871b4782a128cbc0aa05d5c386974d159b0fc27da46dd114dedcabf5086bc3c4c74a8b1752790e6dd7c0ca33ddd5fff098a53828f04174adbf880d5ea7a9a1aacd38ab0a7d0fb6ffa0f625a4a760c4ffac7f0514327e7ce876b567fc9838c30516ffbe771df08fa43ddc3f51a90beb1f57c0c6d6ebc0638cdf8b6c32828c2f057f6bb21b630d337719aa97e3653da552a505997e866816eca23a420811d13710cb064ffcc6d5f80afbc540d122d7cae1c27d06f470ba67666569029714e1e162f24209bd0fca6d4b87b738d38225e3fe2bc27cc54032e9aa93aaadcabef3d0946f113aa10eb392e60afcf748cb8051d230e7c15f3cb13e69df753cd49490b2847f8d2f05833f613e8e9b4343d7f1f229ab8c3f29bf399ab8d0c140f7ded5e838452c80df413990ff93bc868fc5b55ad48f0086bd9806e18910aa17eb2a4db6640d0686df67647a04eb10bf3891efab15e9ec674cefb4de9137d9fc4c32c942900bb19eb8da6dc4d43cffb44df4c123a41a0176e63f42033d574437ca21f05254ebf4e1fbde8a780093fc1bdfb44cf8afcb893d2a79df92c9f45cf9fc839d283366c8944143ed18b98bd15f7bcad992374434d5a51102df4109a49e7674820e089beb3d687accca1c8108dde5b8adfe9be3aa5623e317e07664306e3e4df344978c91eb8e206862eb31e5bcf34bb0df524bb9d262f31e0da023c6520461aa952ff94fe03a97a443f3e306bcc8ba8e945ad98e0dd2e35915b1f61a22a03360e4b57871126543447e20619f336cb346cba6718780c8a4a09fb87b296be77500f795ce03087011a1a7effbc5042ad1948e3f55c26e3ab077b7e7c9d9c505a0524883ef3e1be434d39dd540bb70aafb1a4b54cd251186d907ec4c36f3f2a00644778a7aac451d329998e2ee8d81706294d3c1c859acabd28143c6acfaae7ca13ed01861c35fd5f6e5a10d70df0c96353bd0fd0b5fb0953b74a62509193bd8cad15d362b3fe16d03fc397c213d50593724f0716dbcf6c1caed5614fad5ed3ad4ef59e52baa9497e0721b2a388709e83fe3062602c4f8e9baa60a94f12203fe5ed09496533c5b224029f502f140956ac952cc7ba40dccb9edc5c0f400e9145eaca21d626d9290eac36672d714a195122fdae726445db03c04185647cf67803f63f29c91e7cad63498f62125e596661f8301514b94aaa2aa48381f73f1d8cf2939ae238a58389b9e1518e93c8c6beed86775bf0d2c56f6fa4cbd1bb8f8ee6335f357bc6291f32f5f8b2df44ed38f63b01da54a37d062e9885e7ddebb0f481fc67f27d292376416d4c4699c69fe67fba1b1c787d17fdd1691a9edcf4097093a0ddf2c20a810178e3cc5dcddbf75cf19b40d9e6d173acf511868ba0d6137aef16bd2003fdab021037cc99f10ea00c16e7a8135e627af68e95c89abdb42d54151fa8b4d55e95d990514d898a18487ffc076d42099d84f3d9c4b56313ed64b046a09ccc9d1d87e3b725dcb583dd62cf22f01c6244304db65dab2571cb67f681a253c4424db602f719be7acb5b79bd7d0521d86fd8d2123ad1cf29be3b331b920b1227eeb4c45462a72801abc4b4259b609646125f8df9bc12c9474d9c850683a211237bedbf65d1447e98a10aee1e512caddd9f991f84712c64520a9774704068db976f6913fa7af71692f5cb40f9eb920849f8f40b914434985ace87a87e8fdf3d6099089a65296415d35472e59048962d1e4d7fa71a124b589513e29cab28f37ee8b074be564cc320814f5125ba75d847ed1a60f9f6f684ea53a306bc378dafc6ae9a2b6865d3ed478c45b6413d55848e4dea932ff93f0c92a4d733b4cb869b443cd4803cfc60d49fa29007f1627b96caad3c459b1df115ada00969235d604f6d02f93416c235769a6ab15362ea72d1788eb1e16fa7f597e9527cc910929b93036621a8c1c556ae804e0549fd89250fd38bc0455a0cd5d5f8134191a37df5973ced0658365110275151dc2056725cb98d8b1b7cc1977986eb10ddda4619b30f66566ed47cc2775b6da24e510a2c935ec6476c2ba87a1564a4d11bd42f06568014a69e6fcd7f15424ec5a7f45702fa7bf3906318c27716d2bab83e3f1f4d58d387986706a3c0e68d55012fbb62f44da2af2182c05266465df15a7b60ea962784dc9ae864bd62b1a82ac2097605ef2c9d50a7642a78455091a51c940a1fc638718bdcc7053f0c8b1578bfdb73394c4292cd11f66b12c6225cec86f28a1b03b20a4e4aa499efb977a4c45806cf5bda095839c2ebde1035ff8758abab0cb7ded5302109f1cb9d3632a53fd88aa720916fad3b83d2a3c44acfd15914fdff9b1e50fec5bc5b13e84971c9d7a97b10778140aee79e391851ef93d815d270cf62f53e3114f71f1de01b3fef02ae17e485085182d679cafa61e4ed6a55e77d780865f23de0475aa9502abd524d15b517cbfeaaa07e453f6ec057615f221e70bcef75e63e148bf20515c5437fb14e90e8264b95911423995904dd340fe22f1a5effeae9fc4aed2a2c3af0d187f93c9d88ca9600029506c5dfe65ea49617eca06f9f32ad40d9db474c02c1d9a261d252b4804db3f25bbbf4e2dfc0f59a67c432b9a0ef666d21d66f3d63c01e2f948bf5b41165fb7628d35fa3686278a693b322cc520d260716b90e4b0946298ecee138d2086d05d6067e71c8cfb396215ff3897542d62af1bb47f52449a93ac2ab6ddf918026702711d3e65cec1819486ed8a307e937dba7ed370870ad41fe87ca8cce8bf957a254535e7828a2d5f6e5f550904e361cc9cb3544333d15b706dda5e687fa3f4b67c56394f8020021f625076205e7ae74b198bbe484e1b341875a6686e4a4206b8aa7297d5e69368dcd5dcb710c56e4e93c3e10bc2050621b527b35e9ed5c3bf25b75b37a34e9f95e6339429fc430c0a342152caa75ee04162b8d6f0833a0cc53366dba60fe218ae299ef28b7f304b8c007e581abf58ec1bfa9ae7b692556c6effde247a209f61eb706134cd86082a317664b97d8d3f5e315ea4d90f7b2c7115f35bea02c829b326384d500f773509e6bacd037c6c52bc2211a26b34c8dbcd68279d2660f1f164dee0770090675e76147e39eda3bf0564639c42c01f0b8b1c55f007746fde94acf5b6094164e8f66fef42bdd0a18b110007dd6bc2ab3ffa8936f7db0d71abef105cd1cebfca4a748e48b3a13b534df1d6fc185fd70615060b1a801ee11045e20f59b41df6a3adcb9b461d0d1ab7a228689c2965e1bcdd69bb5b7d922a0d392de3f1d16e22bee6990d3dffa79a029589b3e3118c832d5d454e20c5415f0db501f111e7c5d34c7fec4219e7c5473cf82038d2a2d941ce6e0731f000c28dfdc2b66358cbda11cfa51c702a68ed0428159a7860f3d217b648ecc5d80e2d55272044e20ed74a6dd946803ad464d929d8b90ebc985c6009d450579d051f2071268beec218d4b506d2f042c741977c3e697cf21e798df862f7701944247227959616774969b589d25fbba883d9bf07ae547f955254d292c9d162d74b1fb6149effc464b26bd5ad95f27299596d7072542f4b9aea989de00ca885c06d1188b4c2728ab4e92eca5848544b9dd691adee53b62a15e1adce09c898ccc25299d63597655ab54fa4add731b06538b817007b341e08255ca512c54fd4cdc38da76d092f80195c79e9a45df27695ad1b231b2145ece4747cddbffeca2b10395ee521a0234bbf65815541ff438819aec0aa306582e41e280c132c950506dd3080c86fce369d58050157b0f96a66ab5fd12cc464b4736da6c8533c94c5cebc317eefc80fbf075532f9ae9850481e2ce6a3bc35a418dc3e7d051d5d6dab984d04d402e7747bca353a327941edaf7e766bc00cb6480b0e62b786263ce3a519d54d4c05aaa180b1e137e9dc8bbbd87a65d0831f6461a4e8926fbc09fc4f6eae50e3230cd6c3e2d0da679893fe359e544ab7cbdb1caf979bad2c2d7d6bae6e00de32f90c142b8605f5e96ed49d2827d2bc3c8aa2166be1963e79436fdf6726c447b9e9f10925a56d55d58d792c67314b6551d480595724eecdb5140941e8658c5b90cb49ddbb01783d8133063c06727aefdf361891a8d191cfa17027f6601255a3f66fd5eb9513635d86c7aefb452001885231b251d00dab2b386d00cc8b63bb9225de2c6c4385c8357a7d115c0acc05288f4a3d14bf619794d7984f5372ebfe702ebf49029270b19b611fc2a9c8870d725aedb7170b1993ea2db81a5637c08bededeeb87fa30170016f299558b89ad8fa6363cfa4040f77b14a1801b09833ddb0646d8fac24db338d733d354b36a04b370a305194a1120ff0f9da0ad435968bb4bdc25c2641200641ac28a4e4005b106c2f2711df758db221e3ac9d229bb166a58158842b764f2e51181386cf903f241cfbeb58030eda24d1048096d789f0d20dcb0e6edaa7b598fa08f188bad86a07f4be68dc4e0b934ec5996acca69ca634fb03bf7e7ec689415db3cebdf6778f2419edb8531cc8a24d3e9779abbf9094dc317546494bf2c36d8a211808008fe1104a2739140d0519d42f053c62e939b7043ec1c95cb40cbf61a02881373968c799a23d92e58468409736f30668bcc11bd6c2d63ec0d860f681d1a1a48283507f48ac9eb5fef2d7d0c2df3a03241f10c8608e74978ce0adefd68c7529d1541206ed201623664168ba27dbd9bbc73520434b33302024518b7c136e5aa49497e09e12c038d1115183a24dc7027df1cc1b9f96a209412ba23310c7604597eafec99645c5cd5d5a118907b31143f2cb9f205af6550211a014895fee3fc3fa97df2b70388baa9484051f5b698d3dacbec9eeb3bdd2c4ecfbd29e82206d5dba0fdeb3ddc543b1dc245a215d9527c5362bcc1b882f8768e11463254dcc80d039e7f716bf6fdcf147ecda59ceed818ad14482f8941596dbd84360180643f0651cbb71621fe1eafdf8864f114f714d090586a07a71bd7218c578d4efe3a177d479c594c39531bd7c6ead7b4145de4f096fe202eecc5e9a45c50e62cd59499c0655d892a87de9d2b845efefc1bd3468ec6357fbc67f2befbc68ad6512b1e8991c2216566714754ed31335e8ddbe1a6013c708f224cbc1218709bd5025caff91209667b86481cdeced74848fc5e537db0a7e7022e93bf2af604318fa4aa02d4000e7d67ea41b33ea363c6e5d09389f880bbf08873c4f729d58df28d7b3513f21d8ec8b3139c9e2a8e48515fb98fab72074ac057e5da0adf71f16b26136df96430b27991438396c11762c4efcac53f1c9181f2da0ea4718b2d7d722e0b9fd87c13adfffa5a3dc804644f5c54631db4caad83e6e1bc574feb205e8c693d46e3831e30661c9fc6339e5eeea9d930b1a16a75443c7421b121adeef74fe0470fc52cdac928436ca1b85ad84d0a8828fb852ec819b3a35501e8c57b90decef7aca84b138a0b605ed0fcf89d2130fac8deae128f37bf47f1aa3818253921160934c526d0f304618aa79300f4d2d98c0fda77416b444e307c4f1d17dbad7108c02924bc6cf4b16c79c0cd96848af351d49d10d12f237bb332839402126c1dbb480c18fc1e3ae6358c1d14bcb028bbe99e75e33efc323205bd6eb1f17dc2996b86a6b1f53927da426af8823b4c25313e08d0796b1a01a9cc93af796eb3dc1c006f74532e066ff3414b257f1024c893f335b2f9053e883c80d9e7bd068a0e80b7c1cb6fb4810637fb24e6dd5ad826e5a49cce4319969b64628f0161d31eab11ee6a08b1a17495440943dec17bdc9b9ffa3d5252e8ac20f71f973a7342caf89e8902ddb594facc1a8e0315fc57429f3d9a9c15ea03ccaf8a07e54fb0a1d1435d4f3d72fda546150670b70268fe8623e78b80bff64a8e0434d8f2073d8cd7ca15a95ae70264bbb66eebe9bfc91f508f75dd40111d403fdb4031c9845a7e6c3c64a4dee1c2bce054f026da7cd2f3f21fd43724b4700142fdf3e6433bf5b0daf9b9f001e908b8d45f0f087233bcec0e1a9a1b46a27b200b7c43c958014380e2733515184790cf4682c473b03af671a2fd5d5d944296b69ada972d8d0159b64ac2cf8eff54a31f5ed2b22add56e5145d640512de36057badcee7619140060c147b76c9539151aded6cf6c65142da5964717cb59f74641f7775483f877eb6ecd64044f0ed538aaede3bf3cf7474b9033a6f4260283764913cb5b23d529fdffb201781c71481b2876238341934c32e2f90e597aab1f1fc9a7738f94344c150a82c9d51527bf9fbb898b4df6eb7b578f26ad595b76ad87583647e6958cd553cd214cac36322d7e256595f727de225481f10f200c3f2041512e430e60322eafa80c427defd6789f905925e610514a08ecd80a60ded9f1420b66f5a85c8582f68c14c451b8072b9f32122469a7e08af135ba33516a92c0cfd490e17b70ee003d6ff28c86f9e2bcebf4ca37571403f8c82ed27f20dd1044987cbaccdb5e60ff58d222aa199098fda7d5ac61fb510ca7d66eb19ac7a7ed9a06878818a15fdbef9a62afe2e0b7077f173a4f19a3454a213ad9070dbc6f07c040171f5fa1dbdc3f636e50131fd40eb09ffc4b663ca816f29c499e23ca9350749522b6ca308d8389b818dbb469877052ec98d53bc7b52e1b70bfd29565b27c71bda20061c2500f1979df2e15011ba595bffac36aaf168b9a5716e347f5f325f07f073cc4fae1c83bc88fdc1bf0f6e67a983e89c7aea43c2b53887ee88afc22d0544e11027126c3098076c7aa3628c02eb16f3ce17a608e603e0de3a0b11c035308685d710c61c93e0741b06ba5203f69b97e1fb4bb7ec87cf2143613b5ac6bff02e6cc2d8931eb9b555c647bb314d2333bed22ceabf8f59845b24ceec3bbd5a9a9f6299d4c3bca6789bccab305ce4049f50f675ab79d055d62e1da3516b203a0265056aabed84553fb30f47810bf546ea5c7f04d7aaec5e98ddac484087ebf2d0d7831994d0f664bc5a88f115d19b750eaabe38901e75f49c1ab65dc6b8e725cec59fa9a230b9df560f3182aef143eb38a03be2d04aba606dbbd6a5fd0503089dbce9c438f3d7e8a198002c4d469ef060ec241dd88d8ca3f873eb7c00a12c98498b8c2484015091c1d45b29845d2126f62688002e94c5d02771c4400460543388ec629b5ff2750c5fe3525c782577655c52d0866d2113377edd5089cc929fa224fce1363325d7e44d0ed5beae842d87e34c316d90ae97f169d081bd9745301a8a36ba0130304a4298b73e1a50e4fb155552601118b55fe4f85fe21b697a8e8d8a151e1d3aace19611d3542e1ce6725f12cb56ca69be6d6a3c3bddd9edc36ee92b9aa976003dcd0c299095c5a20d72b30861839f192de2e56659e967604d030f2484c6adf32e182d2e1504811fca3ccebac6953c83eae631df69bc1481f95b95280611335ebf7c919b4083a38a2d6dc386a0aa2b6661801d2668e680929ffadddf9798813d5dec9431dfc95b5e97bb46bfa15b49cbabe3c226610d86710820500c02c4ac56fa058f4c2bc1424619e5d67312dc136bc8c31ef9df21179b12395ef6ae06388e4a9d61532c7c91c8119c12625ab221f1d656b25ff2218808efaf0194cefcb5811427c4392cc07c594c6fe24e01b6c00f0a46543120e46eb3e07eb8bc50efe05dac61179a181f29ef07e9d5cf5296fe8533e26083c0ecbe486792386dd8dac286b042b973a7cb72d66450be04ddbbc6f6dbb99367a9032713b7781ea75bae9afefef37f1ecfed52f63fe59e1c53e848080397b64d43c08c4fd84ec75610a60cecf513531cada1b0ec8054bbb657eff69597eda88cf2dc68b86ecdd14822bc2c2ad210b764aac97d72bde4e413cea5208449dc6bf722566c33901b4cbe0e506246775d3f7dc4ebab8f38abffe7fa55662f3b9aaae8965145ac924ca3891514e0ca56d722c34ac47d00a3f6b630c428f777749d0489bf34dea1f21ec44247761b2a0b485debb38c4bd75ab10dd59cda6cea7767e74b94c65031a3106047cfc292e9f33c01658b245e9f12f63d5074871c8b8ad6173e383dd4851749dc4e75c13b031c577c2251141a6321916034a6014e91b36ccf610e043b87ac479f6f3d60a6dfe3fa962b13fc6544a39a15b11c5d2c5967b1edad2287ed30daaebc44dff8402cb4bc62ddc1eb86d234d7819ec6716904c6a9c008a86a6bc182e376baabebc8d03a9a9e38fa3699cd85e2f0faa42110f48661c72e4ffd7f9e3b5deec81f32f515b3e978133085ae0c7003d8c240405553814fffcab4b18717560fc5f206bcb5867447da42757d249f2f324bd9f3163283d36307e1d23518cd8923c85d15869b5e8537fe20961651038d7f8af2d9c68695504e301c2e9ba868d3d4588252ee6ecb7b01c3c92637367f1480f6f90c74035273bc880533dcb41d1f36a79cde306585dadfe27b4d0b127322b21169fb99e814841b962215a23c90fac1250b20ec4d990a6bf630072fdcbaad413c50d0bcc1eb2a9e99577d3ebb39868a38ff8ff0afdd0fde1dbd9c972ec61bf417e313ed448e1bd851f62ddece269a058fd2b83102254a72be60ae916f4b65660f828df3098c592a3a5099e95a9b0add6b6b8e5184244d1e27f1ac8e571b96f239d6911690b67d085d7f25f65c47da3d1d0508a21e8dadb98645e23abb5c1f417daf51a6da77753b1cfbf1302c09ad435b677d9a1841979e58969ff301ddc25800a41b949f715b24cd0c01136ad53ff1a630bdbee863243941e3fc7ad742d0c8b9ba14d4322e7d35541b4a5272223c9e98d6379cbae07c07b2feab6c4b32b15990fb950076919b370de1df2b99486b66f06f6b9dcf805ae7000ea8cddfcbe1e233e5dc9ef319d3f7da20dc1c93ab6dd3ac27dfef960c03170cef8000a06407b8488c7cb617ba00a7ecadbf7336646f750f50a9ae1dca8f2a38e779ab7565b25d61eaa9b8a2267a046b5cc1817aba85d4f1da008cd395c2bfd15bf719db5ac0589a31051984543df3db3fb2721237d75b7697014dc3832c216875be0642883ea80131580490dbb54f91e6df2d6c4caeca0400b60344c761e5295939fc48c3cca8e3a6c9b0408785f5e10a33d74abedfeaba9b3b6e103c42de5cf1c843c61b8fd86dadc6d2e89afd6db58b443579b7abf12299ccc498e514ea27b279656d960566256050eaed6093e62f70a9d20a383ad09c6210e20dfe09d2ce3c04a566dcf55f1ff3139ebe0a1f37afb6059c28c6d97dd3eb73cb9c2a440910d2a7b0892aa9bedcb268418e8af082a232df3d2d5a8b781bfc08a00cf523e65730a4d5e8e94344452c5316af888acb73619ffb483e281451bb905eaea6366d87eab844d9bfd567a9386828162491b1b28acc3868d2482c7cfe010897e56c1a4f2111502314820de957724c7343891e696c21dff807a97f6bf4f821139e2e5e835da18acbf80c137bdc8b4a748240f692b8f76a01544428f37a0284d8cc2bc95557a0c83f985273b225bf86788b7250597ee5f380310c840a56054c1bca933e9f40b354269508dce4cdcb8c32705969422202ca899153099b06c6f59d467db1dafb377c209548de2b11b5b03391219f6c6a4bab61ac38776d501d747623cf2cae5d870e055300ce4a6a351895c6352e13c8b8d3d66ffb0cfa0cbfdabeb467edc9d7ff45af8da3e8c7087bbd64a17c3f0e2751498c780211c314f363d728dabb26a9ad97d9ab2b9ff8e555339e9d082b22ee2d0709e363dec9eae602cb1d2653959a191af20b76d77ce5d04fdf15144504ca659fb1592058e138073e96804cfb0af21fc428b285a9c1eaa3dad8314c4e29cc51339fdbb5b1e3f454fdcbc5a205a53b4d5db8bc07c011c0fe1ecf6a5837c211455fb955650443ab35c6212458d8c07f3722826fbbdb56766f99929401ad0b700b760a3335db935b14dc949f1c11d9bfe5a4ce101f3d6108ea9813061d0c31ac9bd4d993e43ef8325036d40e3458502e1a20140a8542a15034345a4aa5d28f8f6832d9bc894cc0dde1c176d9395f3cb562f98479e26dcc560c862018768dfa8913062e4de6981306dd07039d574b57b2ceb2f913ad282d5c6b4aeba755a5956b01390bd52a22fbb7a0b488f8b762bdbaefae7aa9dd98b5e6dc2f914aaeda7ab9675a2a954aa512901289a4e5a596fd5f6a2fb697db0bee4bf1226abca6e984f9624d9fd40b9297d90b1bc3d99c75de9c658373d6891db058215c9608506dc13caba65272a4c8102056081f3b4b448b8de1b2bf8de19c85e29a378f2b7130c15104470d870c8462050a152852a04081e2040a0dca9127baec3f83ce67d8f1b8785e343424cff82653c81664226d84997cd19631345a046bdec6ecd1f9d12927755e48942d5a6b49abd62bd39f387b92d8276b1af5d3283bd5541f7314f2027b89bdc84a2925931257d65e5e2f3b945b4a2d2596d24a49a5bc954e4659f61f65a39031d6ac9bb765cca34030e6f479fd0e0a7b627c8d3f6c4efff10596a0eb9a3e27505fd0e8129d8847449b381377a216118b6845a4224a11a1883551893fe8025f20ec0bfa763530e8f235c1b7a68fcd579d170c41cdea49029e3cd82e3b27de1f061d688e8d9e3057bc8df97f32efb33055a4cc16cd534d48b375eb165903469e395bb56f48997eb84f099f940ff74d197db9efca0724dae8bcb287728c872b537bfb6a9fedbb795b3c2bdececb7db4efc857e41bf201f97c7c3b783a0f0bd6f9c15fc787bde9bc747ee8c07484e8c47488e8c89c55f32fff279a34b199676b49f3c49c2d9a27a54c2d6d15f3fe76498b27c69a14f6a6c63c614e017a80ee013b08b81ea0e401431e407b408c0a10152b54a8509142050a152754985099512952a700657f1d403a743a760b70a958319e4c9f9a9ab345f354cdd6c2353aa5519fd479226b84b9758b95693de2a643870e1d3aaef4aa9ca2438702742860ca942953a64c9932450947dcb2bf0d36d8c0623c61a2f81bb2462a9f5e9c194fa40d9b1c6386594c892dc693e973f3d76cd15a4b1af5b7315bb6d6ad4563b6aab472ad5aebe705e50c379f0137c3cf0cb9da0abdff0c5766009a214baf44ef4f96c8fe3358a933c4f79fc14765d55a002d9555eb0caf2f80aeb6609e6553314195fc9153917248f6af4f8064776527624b48005bf62780cd5937ef4f801b0170ce5af1fe04f8115d8c36e68a67619a7fc244f1221aaa78815fa078017ede8beb289a17fd62e6c5c9f4c2be78f1e245455522ef59dcfcc9f4f937993e2bce93a7ee974c9ff3ade9a3e27cfdcecd99c28379eabe799264ccb630eec7a080316fade2dc7f312faee2dcb731bd13a627f3d4fdd2f490347a7f647a34d2f46a5e9346efd7981ecaf46e9eba2f7a37c8f7bd2315c6fd90e9cd2a0e9a5e26f94af1ec10a31ea7c680108c00cd15ef8d624423f975e67b45f352c2a021d1e66b0ac8c305c93941783f727dcf475de5c464bee620e1b9b6dcb4d8b0d4ace4d0a8b072669e72b44b4d39aaca35eaa88abac2bc7953c5af702cc4c2c0b146711015c532c74ad49463a046311560c040d1ffd32967a6235d1686585b3923b36655aeb5657bc81ef265bbc16a04921a90d0be96d520abc108e8693542480d426a8835cbfcd4357d522f9a34fca0e145832b07971cbb46837459802a4e0ec5dfac307b587c0f78077d15e6ebb4839e2bbe07d58ef9680e2c15461057720e2b545861a22993070801e00e0b1994691d028dc8109e64ff1d9aefd4766c9e47f2e4206152a6395800bb37cd5f61feab3053bc889a3de8f93da87654fc8a8fa1490cb6188888e126830f32b86480c91004fcb04c86d8ceac94a21e852a007f1526cf146a8e95aae31f024904783be8c993ab39fe5f0cca3467164393186c3110515735fca085cf189a64ff186ece427732f85059aa29c8e072962a2703ac5739311982d4554e1031dc6062b8c570fb62b8c5709321b633b333543f3b486aa89566218e2d361126b4b32d5a0cb48a9333eb95f72d5bebd6a2b5300e8542231d20e8d87488d00182ce6de5c3cab582ad82ac622d243a361d22746e2b1f56ae156c1544e7a673d3b9e9dc746e3ab755ac85a4854405908aa0ecaf024885ae575e5869f4e7738aa32896e7ccdff3b5f0bbf7c26bc1749942306be6cd2cc2540a31cac4a9b872fadd7bc1749942306be6cd2cc274a6304aa6cb74b95c28d365e2545c39a9b8423295420c9e3397e6442e2783c5fc5de5892cd9ff44ee8433295ffc17c5720493947fcd1caef8303b484e245329c4604895cb02742557717258a9475822fb9f643092c90998331361cad08d4199d2e05439d59566999fd254c9fe34389a9f5e792f8ae348daf032cd3773ef577ea5a13173a0b931494954126989949444761250c9a7242bd14a3b20994ae189528d264acdcf0a330749a73c2767f6cd9048a452a954229d290cd289930454aad144a94245e66b4e9a2838186819ca887e62a0c963a5c2b852c2a0219367d72897465daf14cdc9e363fe8ce973fe274499be70bd70c18001c55eb098ec8738ce3c49f2d03c49dab89934cd172e2ce4aa723932c889d550abe107a65288c12f67d6a510839fd931e8cec5aee2782d82ac46ac060bb3c6ab464fd77035ea8fc2983c413c59788078ae346a65894b9e3c4294698e598b510b3f4dcdb27f2ae62c14ef9f9239cbc61fe68abd3c056b92fdba5c59f59313cb0902e7ccd02ee84e95532d018a30a1af869a8511050a56e5ccd02eaa25c09c99983383c9998572665fceac73665e0d357f7284c19170de93f1e3604633c7ace2c42a8ee738526539c7909a034815927f8e9072c332273526b4d9dbacd0edb8f07ca14bf64fc913647f514c11b02c4518c9fe34c09c86180db25e8dd0dd17f2bc4bfa375fbf73f32ab0103b83ac42e6c8254820918f4826a289761062508441896a30512c8cd38b9e17ae469950f2e478aef000f5caab6267903f1646ae57aa9f46c925ea4ae504d397aa647f12c8a7b272645065ceca89798a26da4178a630f099a22f9ee9098604429d2490a896a34a8e9f1c533a07aee2dc60a2d8193b48c81f3b238794aa724294fcd3ab1c502aea4ffe09264a3e8212b2bfe9fcc9e1c2b1ab383278392bc70e3505850b8e2d15b5c1c8a92a17aa723807aa7245b2bfa8ca0dc9fe30aa1ce6c95da938fe3b48ec0c9e285418fe3c53388780642c3fcd99e528fecae589eea2e09a65faa4f0c10a1f9b5761dee058af6aa8351a445dd5f0838aca9c85ee3ca54465a9a6a0cae5c41ac554a8ab9c2060a0e9bf7c7a2ab14cc6cc41baec0cd58f8551c30faa647fcf41c595435671fc63cc1caf8ae38fee9c95a3484d4d219673ceca01a4a68238c28f9c58af72f8a8a89f290c28d99d3c93ecff72a62725d9bf3cd3f20847b2ef321172aefc260f90c9a36b9ea08ae3affab13378b4506154227021fb5fd54f76d1990356718e28d39c9919635671fc5798d5c625e34f739664ff9c99b3fefd7368a4ed09e985081159b3cc5761f25ce9943f0cc9f39d3c392f09654ac260a490164d37668a176768c615a6f92acc33c58fa64d7ef3ba5c3ba8c993134d9e2c8df2e87876640d183974f2001129537246845cf62791b43f39eb95573649c925d95f34d578976a4832353135b6c6ce60b07e9ea946647fc7e73f4568a67ecbf74f22199fa0692bce7db3344f5ef3d47d1bd36d9eba1fcd88b107aa2b8024644b02c6922be96b357d7d8f48af66bebe27eb95ccd7f78cacf8fa5e7d6f8957f36cdecd1b526788522f885cbd50d1aeef01a9abbb6bb4ff25f376886df15c5ab2f7aa2e0f565be3d7bfb9da02ab50a92b8fd6e80fa6e4fa574a5d79d53342f56cd55342fdcba4ae3c5cdf9f8bbbb6daaad516feeafdf42429bf87dfb179d4a72c323963f4670d8bafafa2ce407dad4169db849171b870f08071f93a91e4e9442ad56abd4235f10040b3f87e200e43a2ae443d69aec89ee99342e4834265536541a5537941b5cbf121c79503cb096222bdcc89fd3821853983426573966a8799ca56c446aa6c4054361f2a9b2a0b2a9dca0baa5d8e0f39ae9c2039b09c58ee47fd6834baa92297a68f797e0fd8c63cf5a0da5971ee763a2017b9dc5dda398328535c9a29b2599ec815b34690d896d89ae4fa126896c559caa013979e5cdfc276f4eafb2a3fe514a5ac4f0690eb8bbf39d59432cd6a59e35ca552a95c75f429167d5af65bbf3471242247174314b627369bcd6603130283c16027be1ada121a8d4643b97a5c2e976bc58e5c2e4753953259a552899e0bc9d1459a10cfd89ed86c36db0926040683c14ca1126d098d46a3bd88c9160683c1603698e776905e7362cdd55ce8304c8e2e923028637b62b3d96c31302130180c0693f39ce73ce739d7da6c369b0d0683c16030dc36d0c510bf805f697b62b3d96c239810180c0683e57e918e67753a9d4e776dd66613436bc3d6666da0d57d2e8658f48548db139bcd669321f396c9aeceea7456a70bb2bacfca423de6d46b999c7adde3d5dda0abbbbaabbbbaabf32665e37a45ca75941b87fe9f4e7d5b167e8a5b86e6b465a1d3c3352af364463a3cd3719491a9a9b9b9799153af71cef2a674aabfcacf95dcbadc5e9335c8ec9d1e4ee6e1c8fcb94456014edab2d89fcf57ed97dd87467fa7dc6d501e712771a3a359773c13d71a3de2d1744910adae04c1c8bddbf200cb1d829f879108739e7b153181e5422f51adac3839f4a3531d7a35da211b230c07604d77c8c1d0ac69d4499ed00343100cc11004cdeaa0d7d62ba8038f746fbbdf5315a351cf964aca14bda647cba8b3306aade95d2b8346c551a25b424997bdf6b552482790d941cc959816c014e1850bf7de1a490ae904323b88b912d382ecdf3045c8fefdc285ecdf35ec8959f6924a9982d10f445944425425880ef4322ba9942918fd40944524c4f56a8c18bb8c34d18ac8023b44c863a411639791265a1159e07d2822b28741210d3013ac96b06f2122c2a0900698091f48e30358fbb0b40ddb1df601ac7d583088673e1864f78af0158076f6c1c02ba2060e4f5cfc09d9bf7e6749f6c345246dd4964d0d7b4d53ee916d4996247b4956715c96dd7ea9a40bed2988eb794ab277def3d2ee7bedd7fb407cbeab0a62bd49655c33cfb443e895dd2bea21973599a315d494ffc91cf95057231e56300262a482da2adf7ff463f4436d91ef3f4a416d89de7fe4a3b6c6f71fbd463e845ccebac1473d8c50505bf8fd47fe231e6a2be6fd4727a82d99f71fed505ba4f71fb9702e63fab4e43f82b50ca6f3f435345fa21e06f523f2fc40f981530e4f1fd4cc27e171ca31a81bbe0fe1425242490829a1e2f8d798a15cebf89f4a26b35a01a432194573f6f03b3067e8092f674889f20c25313a43552a8ebfe80c35813c434e18cf109573267486985071c2338444c5717c86967086a6549c2f9fcc101235e56f32434ad49483f90b2951cb1ff70fe19c65bde2fc74e5fe10ce5923d7c835728d5cdfe75f83fe9d314a5c23578c7f3a72659f652be3227528c84947865e3ce7591fb93f7df1423b783e4238d1961d728f6e1ea31bdd9c15b39319dd72c7e870b99fc6fa7f4e63cc6beda988684bcc6e748bd19d649fbfaec70475aa63747e9e74570962bd496b727745fbfbca247b5feb8ff52118c83309040f81f141024949cfb4c9303fce32bd3cd56f8ae586f9c9fd9eabc77335eaf534ea9ddeab5194121fb39c9a5e303f2697a7bc1345fb4cecf25ede09e2609e0b344d3d9d6a932b09a5fdd4e4c26172588dcbab81f8d91b9a3d3c8cf0832f6293870df4aa45c6f57e9ff77ddfd7f7fa4589dc4433585bc7c35eaf0885e34ec0ebe1dd3910abd72fa1acaa72d64896666d850e6251fcc0107bdebd9e77ef773d917f0f7847fc90d9f392b1237e0f7827f4327cb4a368e217de195f347b7a90b13396a57b1545fe75a5f2d15479ca8a2b15ab2cb3e8e2153df173f7333dc3f2fb6ac85651749f46f7677ea2d993e47bf14b96f5d952e5a9067f7c5134eb8ef8651cfa1e543be293efd5aa6ad549c36c5f1c6501a4e4bdb7efbdf7da2a8a4653954f67b632f933af180a4db3e2bc68624f9539246d88f93b5333dbc7b65116c3119336445395ad0d315f317b665a6dd98ef9c3e04b8847be16a838dc6510c4d0ec4982bfb7a6e89962bee6f5da5daf280501aea18c4d7b6dcd7abd5714e63187e6a953f79479b03b08e5c94d9c1c327b925cd19d6407408691ebf798077c7c33806600cd16f8de7bd1c3f7726c1497a17971e4644c86a09ba159368abf923872726d14a7fedfa7e1f9d9ef1cbdd0acf7c3b13cd57c211377aaff4a29f12742e1f8b2f79dbd336d40be27763395cbcfc8a9a659de575baefa14cbf64bcb03daab309b4e5f4d1895454df5a3eaea1b0600705eb868515be0f7a76a0b7ff7b3a82d1537294ef36d0c698cd2a7abdcaf6a194adf2f7a5e2e914c342cce39c46048149163d924991830dbff30cc8b69fd666bb3e8f4e4e9473174faf003e5074ef93b7d4e27a9ea785f324befacd7fcb2c9ec4952424bde2cdbb72fd3588a1d22e79164621e55c5e8150d4a7efd196e38abe6ebdf20de983d494e2faa3269c4889d99a56761a6a8a9317b92582228b73154101f2cd012e4c5025d105b10264194043912a448902141800471b1600b10b66c73d6cdcd598f73d60a2bc47dd46016881d54800508970a8080a801a10488234014016208104080f0a1829d0ab4f8a8f9a8f9b0f9b8f9c0390bc5c53f5ed6b43e68b78bebb5e565e5b57be57cd07c1cf151c4c7101f407cf8f0b1c34bf7c2d243eba1f5d47a6c3db72eb6ecdfc3d5e3d503d623d683480f590f233d663d90f4a0f5a8750922fbf718e285b6c7bab6ec4cb0f3826e267062822326b09960d6c4ae092d4d6069c24a13549a90d20494266a4d28d9b2cbfe22d88dc03582d708605a78657f1e371e381e3f3c723caef000e29185878e47108f9d075c414b647f1e56be5009427005db8e87ed6302c6c34707b4f078754017640b6212a424e8485091a0214140825c59d872055bf6d7804d03370de034f0c3042c8da5b27496224969e992b49636496de98d891b64fff4489d21eac874668dea20d1a1e9d4749a34caa3d10d44e1a543d359d2ac56954eb9b35ab4181897e5e9f5e0ad4afc54404a0598540057811a13afac6262072c5bb068c182058b152c54b0dcb03889c22bfb4f6002139880ecea72b1ec8fc30f0e391c8070d0e11084c30e072e3b5c3b7a76bc76c09c8552220bd91f072d18932648638ade9a3e3a3fba270989e2c104ae9df35366e87bc4f2674cd43d6fa83947aff3027f854f0ae03004871d7088e1e05202a70414259c28c14409254a1c51a2881230257c34e127fb43e007023908008d3f8d56c9016569e9ccd6aea5a4b5838ae31fdeb345ab38de84170420f07208c09cf51040717f3bd9b2d726d4b27f6dc22b248a31efdb983d4924d0a8bf582dd9a21404f99e3b4ed81890176c89c15eb0b3b15bcc498c494c49ec48ac486c48ec15dbc106b9e59bb36e70cefa1f1b24e72c142569830d2fa22368341b968c463136c86c3062832c020ea84788fd8cea117ed810ab814a0d4e6af8a9c17604ec081f47ec60c41623b41881c5082b46e08c8092239643966396e3072ca63c822b872b478fcccb45a24c2b94201c386060489ed1c390366e8e1953187427cc9bb731577cca7cd46cc15a445a3223ad98ce6b072d257586f8b5152a474d7a25ea1539d6b46860d8b9abf5ead58c8e1b8086b80d811be267081f45b40cf12aa2bb4043301942c91047862832c49021800ce12ab24508217e9c8522264666c6003754ae5b0b9d8e2b8693184762d862cc62ec6268898125869518546248890125462d8612952bfbab5caa970ae66296fd5be85aec5cb85cf4b878b9f8e102e642888b980b990b1eb2bf8b1dea0cf1656c8479043df22d08921e098a31267e9dd888497386f1a40182ffd302a8c59116405acc5ac05ae45a506921a50594164e5a3069a1a485acc51015402a76262cfbff4fee813ecbeb3ea857a2e7d2abd17c3d15b2ff63a9334412a9345a5d99c3cda9ceeb544f6e4dd164227960d9da544748769d1ff69a3ea8b73175603ab1d641e9bcdc93d22bcb6a2d69d1ecd9a2a16e7f7bdcfb40a1e55f28746f7b26afe48f7c911ff240de85620b0a8542954a27be640382ef05953127104459983004b58ebf8d09c3aed13f61f6b45cad039e745e2d201f9b55675a9e38d313cc999efe46738267aa6a4cf2f8832b08491ecf7d7556b030aecc7f248f57d36974befccbcbcbcbcba7a57bcd53fd280c0c3d8ae650c8f33c2f4173f49e19e3e608f49aab50f4ff742acbc6358ccbf274fa475195ca7bd133cdff47418a3fbf491402ccffd7619ed5533a529cf73cefcb53d6fa3769c3eb5b3a69e3ba87ef47dea8d93b5f84286f267de93dd2c647da00c1f3d62a8e8b03a3afa6eb30c6188f4cae73dd9de95428fa5f869e90b22ccb2f3ffdf25334558d30c61863fce2c8f3de7bd1fbd17b18efc9d00391284d9f7a42542a148539d3ffd3293c63ce66dd9817afea057ae339cf11c97942c23c42a23c7dea09f97ec6ac5974cb92fb63f08b5972dd4b4eefec3afe710c1493451704726957f78017e8fbae6e1cc7514646c665bef6fbbf59c73157af6dad7bd3be3cf572a636bfc438c801ef9a9df1fd7dcff3c2d0bf33cddef996d6b5be9e79bff6b8bd82f9fa36fcaec5c4841ff34df2c49cb56c9df97f1f7f6dd6f9a9ad896325fded08fa282de0bd47dae0652ba457b05ebd25d2abebd9f27df90fef7ea892d7634c1bc4dc3eb0306c064f4bf3174fd37b1c66dde5ae46bdbfe729f4b5432f5a1201dee8ba5e85b913d03bf625fe35f1bf6977bcf1342f924edd5af594b31c63dd49848232bdb31ce2fbd875ae2befac51efaf775ea00f6f6e8671598efece90d4669ef781e0477e7a75fffdd7e52cf3bb7cf19af7ffdef7fe34bf7b5ea0afb946fbb119e68f09a5e8d39bcbfd34fcdfec9dd24c4f39751d2df7943b4bc79dbe4b6a4d6cbdba4fa258dce79d9da57d6067d41c82e6bd8efdebdb7f93c4276e94e4b1b5f3d83580282fca7bf37bece07ff375fc9b67099278f8f44e1dffe69b6709feac5ccac715c75fa6d12eaf509e6aae50a62f811b7ae57e5e2f02afa2d1ab5bf3576d5a8614945aca14dbfab88ab6d4951705df878f02f0f1eb90c47b1dbe0f5f07f0f1f7f7e1ebf83e3c75808fcfeaa91e1bfdba50deefeb7d5b20a63c6adbccb447b63674b6998e998788b105c1fe3ef7bc7bafe7fe3538864cd087d266d1ecfb4de2c067ff7dcf664be2c06705f1d3f0f6818551bfcd8a731bcd95c4d66720fad7effbed33e03bebd9f6ac9efa1715942f2ae8958d01174e20cbfe9688770f0f76fcedb8c41051b27f0c3bc3667febfa9d6e6b0416eecfd88f5d38f97bf173c00dfd1d61f1efcb94e0f8f7ffa657a2bf677a01343be0336fe042a943a4e35ef386463b74920793a64c39fa94a7721447fc219207d71d2cf6874c9fd1db1f1ebf0d1f5b12c77d4c832adff3050a7adf7b3dbff7330368be240d03f0481920bef705aef5861aa9ec802e218cd0a8c5e8bc01778396520c89e0776fe805dc2b149e4dae28da67f2299b6e2993326882230e7c240ef17b2947591c4599cc22298ac66b8a591c892f231866f165bc2606b31833ca90c4d2681a2f8a864674cfafe278ef8920fb5b1d0f85056bf22963654029e05ea13c6f7bdfdbd9b7b5406ccb2b3ec52a3e2d6f7e858a9b333d65772b2382d6835289679950ce9ca52302762604cfce9a9ca90e5829820f9ea93542f366773603bfc78603402b8426ed45e927d7f6ece855d76a6db7fbbd9ef77d0e2baf3bc6221ba5d1fe8f09655a734f76b4077ea78df26447a3fda9ed796b04f4c5c9593b9e589bad67edf7c8f6bca146bf681455a3b3ff0d63a3ad6af4cbd8df6bae29b0a3e666cec23b5d6f97a7b646d8619fa82e20a322517adbcea39f96c684321ddb9e36ea0bdca8f51ee55f733a001b357b99ca181bb5e5901a051efce08008414879026ec759f62b6edf7195b3bebefdf254f14e7ba1e68f08655a77f9bfeedecf3486bd85fffd17e29c85d2f191a2cde1ce6ae8c14fe2a70ed17f6709be177d09c0d4d246f1472b73164ac788fcd1f7d8b18fcd1274aa539967a24c6f081a7d52c676dfe9e48bdf21e854bf8d555bbd752773c3cfb4240fc0c3e626d2a8b5fff25657de8f88f29ed645811b8e1f44791ffaba233a43cf00d1874e1d92e8003ff43a6006e870da98b3c6d3de074d6c7e432847274a87a87aea9ee4896200f8f8f1a9c3379e281da1173f74dad8896200fed0874e1dc2b4241df031203cededb4354fa119b4d16ee39b5877e8ea0e9d93281a6afebed0436b6badd87e5f114a7b366a23895c5ea2fcea7968f64c8f45aee40142f9eb81569eef4be24af63c89dc8fbb9f3f409d449624ae54f96932892ad5656111acd47552c4939cc3cd17d62bfcf7c507cdbf69f47e75377328650e98c095c3ee91d1462fac74acaa65ef5eb9efa0a7bab1ec9fe702ba65bfa37b9ec5ddf72bbbeeb56e77dd668ccfeabddbaedbf4c23ccf7b11c9e34581e5fb6248d4ffe2660ed82e199fdee3afe401b099e20cde9a9b5e79173cd5fc2ddf27f47fbf9e4d8b918128ba0fcaeedaa87a9fd5da7e9b3bb4654f0ba59fd232d7c78d760b6c740ecbf52ff9f52f1a43f4b450822fda192e366a6676b94bd0c7be8cd0add1993f95a00dc7cda128299e019ad1392b849b01c2b9137b8261ab3b323977999ccbe450641920219469e8f6fdf566600ddeb2cd95e409e1bc10ee1bf94026973b34b34c0e15c71749d35618a11fcd5407cfa1b7240ecf183c7bd81c9a81d556f8232a33404a5aceb41932a20254d2cc1c9e660edd42b7461b9f1d8a320394bb86996d62a11bd02d14a557a08ffd178d9e2a796ab4df2f1365db8c76346284c72cba7d7f9b492b6a2a6903b27f4d85f9be3dbfcff33cef13c550288a6ac5b965133ffcf0c30f3ffcf083678d781f123dd366d1c75012f03d33071cd756d423410edff7def779e0f75dcffbbeee5cef7e201836f87d9fbb83dfe721f87dd98322566725b95f1f27f9feda8a7aefd1681d169fb6a63c0fc47fdd3b53db8373beb487f5ebe0077e37c9073a7f9ebfe0e301f8ddfb2df96e57f41b41f6b720bef7c5bbdeade3581f6355ca9c9121738150e65e0feba065f7b4329d8bd7cc55e59565653c286d8bc4fb4308875bc60988c39bc31ff00f9ec31ff00fa004765c800240d88c00e900f0047fb0b0d0fde1db817d32071ef06f64ca0b5c3ccac450a9eea783d25e7f81a236df1f5b86d7ef84be7ad7b3fd70da8a63b39ff7074b13e5e09a61fda9b82cbaedafb8992c8bb76537d49695b9ac88d5ddbed9182c8ba0078b59d8e739078201f11c786bf6d2ae8972b75749be6e73561c48dbda894e8b95d9223748e9eb9d39d87cabebfe8df9f9947c4a483ddec49b78136fe24dbc8937f9681fad6c91334251ad386e719f6dd7ab929b9a0bee69ffe14288d41afb62dfcc655053fd26d35f50531ea4a20e6b54061e0317c28978100e031fe2b1da7a416d7d1fcddd05de0217e2419c05b555b65e683137e235c8fd2ef33eda47f33ccf33994ca6fba6eb71f99eef072a4486972b8b94296a93e9d0143c2d94d6137bf4b450564bda689151f070c036e1852e99c77d9bb1593a0da47c6bb400459adca40d34dfc677d6b6fa45f54de43d289753969ee28d8b91bb3aab779e6a5c9e7e95f62e8db1731619a553fd535c555e576059c82092cbec494e454712da85b890b72265eae944ecd5afc89f4697b26847cf3465d0f43cddccd35d5110b1de34f126de0466d3b9689e83ddbe1f9e11c9d14b0c8ad289a6e6068599025d81bac001c088ba3a018c3da559b5af7496a036d22c1592bc44d544f5441525d76f990d6ad60ecb25d73dfda38510c9f52dcbc260360acc4e81d92ab02b59ac9066599b256203269805cc92fdbba798350ba8cbe56e3f98b3aeecd3d686b66dfb6d41fb35a92ceb4d6e5b053ccf50df98d1eacad08b6de27caf78b1775fb77ab528f9892bbb68bb73b6daf221b55beb0f9ac2f014863361481386a830ac09c313616813865fc5096a540467a0088226380365f73b83af4e795727d03e1df822fffb5e7e7ccffbba94e1a74dfb9a28c31679a3c8f3c6d33e913951dee963fa9a634e9fd2e823475ff8fa7c483027ea3b6d9497b3360ada4246ce14832008865ea5ce5f8cc6af06b5d62e95653a6fb83edc15d4a0bc517192d0e2366902ca4023e04c342a5f60626448a0ac5761febe50d65c22dd6bf612d297ae017a492d37adde0c70a357b73f0cc3300cc3300c49a550087e18e31992a421491449d690e40992b421491424f924f9e119024ffce1100c41b7259e7e32056b60ec4a6ed19fd67503dcc1aee401cd5028d6eec753da0b65e9499f621cc8328927137701f55ed228307e8c4d8c4f8c53607c83b10a8c57606c9b64f041901482df18ffbda36bb60d8fccd404390c9935df0e89e67d300ccd7aaf2863c3f82946f26dc138f4f5a6f8be9bef53f17d2bbe8fc5f7a1df97fa3e706cf17db8e2f0f4f9ed520c82a78d9a9f7414548bc010fc36c3272f49921f68daa8a8f0b4ae46bf7338c0f829788ace2a8e46af89f2e7f4a6f7c7fe7887b984aeda12dffb4421a0f4a4337cf1472373343a47a314a3d1cd68a462345a311ab1188d9a28ddc9f376a3deb8505ad80f03f40a74107c31258a2d44d18528be10451c51048028c21045952886a2f145d50b9ed0f911518e674fa3193449334565804d1aad619cb3702c86bbecdbde57d42f9ae9e8d56c1b4dc12739dc2bcafd9efb1c63bdaa604dc666b33fdf0fca97eef9f1d393fbb95d5801b3a0e96dffed4299362cdbaf24d397cc938ed29fce12e820bde92c01fec1b8a675cc2833dea0127cf069ca6f0b65f8e1f9ba25f64f0b25e94b6f7ad3e99a48f70b2ad3329f666a73c9f6edaed11f08c9d5083e886501e46a042657f23fc695b657e30cc903fe2de5fec94269cfd267a5bcff2244197e3f69237cafb645698f7c9a3535a2587bd5b64ba4af5f3271ce53f6966d099a240fd8a4517feb0fde2bbd026a1bdab7ca5d422d4fce3291befbac3ff9fe54d6c959a7134fb9b97bbb5828c12a9456d62b9cec8f8d340b4f199164d7b2ba2593d44beed3e8fad39324f4d0f740fab0bb9b88ac75fcad4932f1cc538e4f77f5ea9edddda0ef74e5fdd477cea569a08966e7e265193ac330b4a57d72851287eb550ad6f2945e757a815306bfd1ecdff746fd116b6af0099227341e8003b64bfe4039c301efd225973f7af147f14fb992ef3df81db67971f9650aa4a75c36da3cd6bcc0698a1546b346648e28c2d50540f617eb4f76b1c10ebbc3b719ecf09e35276c50bc79a6b8babbbbbaabcb658b63eec6ea76a3d12a949566ebd513afad3157b269b42329c133c534ab2b8728fbb14d162d9945678171597ade9ef540512f19e55b6bf20d5116d9b9d18de61b59cab469beeb947f37695ad3dcda9ad6a76d49a7fc2f15ca7e19d0b9348a7e4c94a81a613e6bb0941f50e91169d67b466a0bbca0effa552f0315cfd1da7c97eb7b4c94e08b36678535b94d16d9f6541dce36dca1b5216b456b476b496b45d68eac2dadbd7dbd0a43e2487a648e2c411f7ec2c25362c4700ce370ece626a738860b4da1b4df397c23bdb2e70b50f6e3f68993bafa4a59accee2ba76f314ae6968e7b2bfad82516b53d6b6b0d685b52facc5b11600d6c2b0167716a02cddb430c49fe22a210e61fca1b0a71ffbeda6e89996aa106e504c71339b21a1f9f53e1087a19ba6f97b4bbc9ad7e47a1f88c39048c3e172381ca8c2d9749648a84c278532c53896ca53de2c199e72d0884c0638ab382e03e9c70f5dc9fe98452a9d780a064f8cfba2e0bb66d1b8aedab2fed6667b9b779230974e39ceff3bd32f7de8c4675a7e78a6780069d330ae69271c3695e5c9eeae942928cb8e63b72d0862100c4130048222088e204882a0e8da2e1bb532590ccf62315bcb6a8bc51812e105097509d90e208d011d40b6a9d1eaca6e31baf8aa0b173863ed9585a1a2b941e5cd37a8a419bd56f60dc0589d65612e97ab879dfa5fae2f63fc96006b19c500930ea87ed3cfbce9eb0e494709c500920e28d29f9ef475a774f6d8e933b5b66c366dc66c13458375e5dbacd20a85c3953f2b58f641a1ec6f1ac6b769afb252dad6f19f316db932c531dff52ed6be8bb5ef62edbbdba74499fa0e26d7d293ceae3903486f3a6fbeabad58b3ba9b746a4b8d8ccccd69d3527f42097e6a6d5acafb2d00ab2b77ea8badb15696e9ab35426599ce527904e9b448647f71c6e83151c6e4fa188771599e4eff345485711e1365d33c753d26cadb495c1ccb96457a92d9344ffd345aa5aced8428cdc25f13cad4fef8a894f724d5015c1a3754e800621065b01fbe256d541c02d4b06baf6418bf9ff23e48d6d85103f5213dc6e11f2653648cd66c9ab3c09a97415dc3a0699f541c22541c7fb0e62c5b049bf277cb046b840de77db5b646bb94a9d3faa7ab34cbf4feeddf356795de7537a8a83f397bd164de2e2b4ecb7c3a67a177d6efba10860f89205cafda47528bb5adf775ef7e1ef899fda20dfb7c9efef0edd7b6303441b65f73f866d8f9b60f2c0cfb65d3da07b8ae42f258fb6dda3743008220ae827f1af529b74facc3386bcf7ed24c3d8f670e3628ed5b46f3145b25d7ab3e6dd46cdf71965edd1313d1f50a654f1c6b54d6288ab9647f558f8c34fc91bd8465ef131bc9a190ecff2da14cf1a738e638cbb28f71f68217b412e855eab81b11d881719df2a675ca1f3ca794d6fec0f5aa2aa1bc6f47573ed14882bde1388689f4ea8a0408431a6198c370270c0b10863384214f8d108cf52accfe7dfacc4bdaa99c7d1e2b0ecd1f93b2fff6925ef5ce58fb6b0166180930d65e7dae4f929f94f2c60d322c6beb945b5c76b7b7ecf596258770d4552ba906a8ab5e52517f7c360d07d67ad5a04d2c00c63360cc83710d8c6d607c03631c18e7c0b83f14914a620d16a5075fce2a9da08c04ca5e0f9a6106419b4fe9455b5a2bda18efe7c09aef9c453a710cacf9d7206ba0f95acb23814671156bb10fe941b36bd671ec46038e56718e28538cd3615caf42e0b7eb556affbe839f5ea0fee4fb3bf3d351f974123081ce2cd9ffd3f5aa1d89ec958571152ba17a3b81a73f23cafe9ed2ab3eafe33e24e06a8b94fdf14f6d79f60f65b535664752a6a191ec2f8af7de0effa2bacf10367d4a6f4d1fd2dff02f95dfe9f40f9ab5fb436fdb864e1fd3d3686beace595ba559a5b3ec54a7bac63e78ba39d9b041f278f77e386491453bc652b93f87661c7316c959a4f386c7329afbf4217d68f60d77d2897f80b28b3d36ad694ec3b82825fed0f77f6fcd1c40f0ac11e632fc32c6f50afcd00c738aab34094f69d49b74e6f6afff8a376e90f68b281f65cf1a61c6b846611ae34a9289e30832a41c1f11ca0f4a794f64ff4cd3d0307eb7326dda9266dd685aafdcfd3f2394b8ec6f43d290ded0a8d790356e9b678a1b152b58a029172f7000004395231a0540003174562c1930b466940388410602d0b009b50c9010eb8dc74469ffeaced466d157d06bb2cbf4ed6b9e7eaf875fc92c76c6f7aebb9fc6c8de8b9b1332d983c9b856f0481bfcbdbf5974d893b9df992f7b3573b38cbd020a4392272479eed3701ce2cd598de24cb14da7a3a8844c7449452b19a201000000008315000028100a870483e168228671aef714800d76a85268509e49a31cc8739842c61885803106000000000080c401382a2002da1f5388ae64ba89ac390c5bcc9a5000eecc8e8a504c9d1d5c55a32cd239b8d4f247d3566dbbec5e23f78780f0f9404ec2b3950068e604bc993141deb302784c8e3be976bfee21c94b4dcfd0a951402be863ee48022a4dd6a771d7e7a32b303bae737d4de993944aa157f36be9e0968de5237b05b266fa0839dc7788ac1ff5028bbb1cc5ae97081c83bfda3aac3ee70cdafd1c0f3003f844fc348c01a33dcb55cf44751601f0aedb5a18a2d91a012b08ae1c580b2b84838b2cb976eb208b417e81ec975cd464ff407b309ff6f16341343d93b304be8bec59ff4231fba457fad203cf89214bb57e5bdafdd21b6495dc804b232a55eae703fc124721392333f695142352ad3971e5028b6df91b574633d50b447b6bdda7d477f5e0976f14ccead18811bb49c42a16debdeb54909dbb0aa202f62e2d9ebb99513830aa9f9f327be65f43a6a15ca9c68b5a2d8278a4e4c9482c07a45153014c7ea5a4a4ad7fd3a653b366fec44b7f262517f6a5a5dd7bc7628e32ea99b5b2ee753f9d22c6acfcc283e66499e82c9bea1f791e5468391261dca2e4c7f306a570dc3e961ca6cc73580a29e66262d7e84dcbab35a872e551b17753868097971b03f02939db70d84b5cc36e15f0d161390c1be1c4dae2003f03f4bebf025946fc30cdebf92b6ba6779ce07164e569285b82e9c13ba75b3abaf70f81e77cf1a297c303877dced71dede0b7355d05be27a27b20aef51eb46a731640431444248aebdefcb4c1306787b8c46e55b585eac5bbb51968855c43260ba79ade4d80b5682cb967eb9fe5ea8e15fd84a77d6d57f2814e01e5a3693e80c469dfa610aa6635dc9552019d2f178a92bb27e307b6c58f7f6416326691dc928811f599ef405ff2a43950836e9e75e495eec33a74338b904971edb41a902dc130362aa80ac806f0053c4ae19bc0eb922da43e8f0040f9a2e9835656c62ed8c607ced9340996ca1e86e9069ea69ba3d464fa85c97fb535b57259130c70195c4dd3bcaf52b862446e9f7a7db1fc12bdbd839e819098e4f3dad8765040e8a11f7861211135d71a96a39103e9c1fa2542f3ab202a4bb6c262d3876d2837fd01b9fee36c431075b2ff54ee3788ab640eda5dc60888b1f109ce13c047e88ab8d0fe1037bc603c55f95c9bf03c824cdb3ee63d9e5a9947ee6bb3891084a6946214f7e5b2d485cd2f362182f082e6ffed560462081c347f7c1cc1b1b8da914cf8c4ac2e7b75e7036fca27e21b6950630d36be8d5c5d9b6075096e2c27f3a8d78ada566742f36dc0273411857adc93eb2ade0f143afe2d13fbe8bcde5af412a58c814c81493a91be3c4549f38ce22d110a731bbc87ae0d98078299f859815d5ef6c877ad231b41966601e4b3cca5a0aa48691742881695eee9481c05cf8e76a79123d76099b9c8ae9256f017682c53ee1bba5f1b1b419bf02a74b6ba3952ab21da23dbbe06799855df7230e3fff8993e9057999e42a910dafbf1672efc079975ac2b1a83ad39fb8fd27a983dd1bdd6bee2ac8b1bb2dd7e9502c5fc0c02b27f9e0eb013cf9bd9e76e72d91c7f2428493a9b7d0272de6f3c89b3d760f1f28f0ad0b3d621ed389703005fb06431df0522222ffec44daf384687fd1bc0582e1eed78690451063a6c6eecd02b91395c34da64316951d788d8f51132a1801045ae0606f90d9e080cad44068281d5c5a95c305019e33dba7174e71831cdabf1eec8758397fb08c7c81bfe526001990581bc049446f95b021a1ba1ded237908eaeb714c39c320fdd65bde9946018c0594efc9218c36f5a54b08ddcc7f654a9d54acbbf611b680b5cc34d0b27b5dead1afda7546bc88e1882a27b705a6771e258717315b469296d7ef467c1e898e4f6121944172ad1aca6320ea8148620e9d05593f8ea0b0660052d8f6fbd792b518f9b6fd2d780ead130b99951ce96f6dc35d6f9750f4e4b9786bed59e4f4192a823b6d20f01f76df393d93dc99c90bd5697c6cee5a2ac7982b177be053b090f42b594de75a31628958006152267c17b915d26eb11f2f15a915aa46cff3734a236c155f86c79b39274681df30d81300ce9904a49ddbe81a7d1af908cb6dca66af7465be34e88a81351b88ea5aa8bd2d5574e5afec6306927f91704d132ad39cf62bc8d11dad44741e886eda445ef247fb531ced65770f3b79980661367c3df87af8d75277a3640c85376d75e590c2c7f9b42a067cb7a26f87f0e5677aecacc8b8b56a567ca65b3c0bd3bfaaa93ad0c3d18e76e4c544044311a49fd523324cf579b050e11c2d1480b86252594298bab4d596d08df2a04c8acca123555ab5b57e3723c368e8ebbc8b303643f67d62086d182859d91ebb3b121b4095d42e7d653b55e0f295b1a1f89e0d770642f03acf5317900ddf8dd0b79b3bed95c575e4586e2670d025c699e91d33a51121b2d8c004dfba2a6cb1c2f84e1dc078c2284912e80c3a6e37496783eae82d1492b66ce57cecc475751a5d9a1281a644fd450a334dffb84e2cc828f19fbcc3dc33208f26022ac6398cc2e02a9040fa103fe82b6a4d62fa9ae8fcd86a82d78159e597c531a22378de8d69684776bf25fd375dc4922db1d1008300741a1cb9b57d388f8e1195d4994ec327be3895c93fa66c1b3f7bdd6371f018c01a9721d72d3ee67fc753b58412a8a85b9d03c061b0f52e90148513feaf4d017839d2093d12f96717bc1a2123e820787c9efc64c99645c5386c591d92e1446cbb2560e060e2efccb2cd7f7fa52270012f40cfa2d2e1a6158870ad8348014342ef7361756fff43162000155f0622838c1cd340bd2ac2530d1b80d39e59dad77a846d079ea68c0cec73cc52049b854c6b39d12fbeafa5b404dfbdbe26e2de8a3dca02180d86fd11880c11517ad282c61172580ce5d52732219890e6e0bb5e599b375b406eb64bafcfc29d63967065d692ed73143290eb164edb111fa6a9c0ea3afb9fa9519cd8544d9b29fa6a449610e35ec36659a4b5332fcd27d4991289a0013e39cf6bfec18572814c8f129f95ce9433521865e8ce940994edbc67410930d4ed83fb2a541f844af541fea416ca4c303237fd2df072d0fd214b7fe024b8c99333ff0972d2c1db332cfe5bebff91d80211278f12fdd7102a68e00df0172a388a94c4741b951e20f9f68c6f4461c450f052c87084530b199ea307a7b67cfc32ae29353865960badc648d9a50ac4d3a3a6728934ce6550087aa48e31f0d9697d5669f3b6a3561846f72b0fd80660010b6b9b1d54b3f313babd526eab334a994305962cdb33337fa77fc459309441de8a27a9e3f3ebc664743024e8308da7f1c3fa5f6e4a65b1a56458fea9faf6d1afed32a925307d04a234ea2467624b2440a8609ffe669a246ad4b65a880bb5441a1f0380562d677491d50e967d115bdfb526f314e3b2404dd339b8854bd27b6c388f7a45ed1e66877b7d3c4b5fc83eaa7adace192599be8b91bede3e7b12f1acd7680cdce9d5e4a77a4333baa640f68055b1330c628a2d0a2f86e041a14e99e813777f2eb41729bf40bbfe35a4355939a4278dba9ca1b04708c57bab9177e12f2d591f0d433098b18c42b8a003fd0b71a299f050485639242557cf34a7e7a76316fea844eaf6b720665aa125826ff08ab18360db4651249de20292ed61115268f55a95923c2bedfd36bb93e36b143f7a25ef042d095b9360839d3a3fb8f624ae3c33df6c461bcab4ca4e587d2a2a6e704b3cd3f6721bd27b0386871cfc9b83a653d6d4113a3f6b53f4670b06795cfaf4b85eb70d00fee6d146cf20367f2d7a7e7d9b407cc123c5414b80eb2be81d10001e3fcca3822b4193d3770a21838461e3d16d148cb40570397789e72c3cf6e9d7077b50800947fe2f38ca289b2241cace258dcebada2b50911ee671c7027883198839cd8793a40a1b3a0c413978546636f5e5b17b5b21f55865d7bfdf3dc020b5e20e3e16781c2f847ff8ff996b144361dd4719132014ced4d9fa8b7ffd51082ad649143769b2b80451b36e95fe2d51d45b8df51ecd192ce513e670dfebc80ed59b646dc0321a0b96d11a8f2c8c6228c620cce72cb30993a8986bc85f08554b74a7128151bc16d64c5ce6dfdde88102c668860a589474f7c68e790118db54e05213d12ca4df0b82bb79390abfc00ad2c5a4c6ee59670826edf484c8dbe7b08f329f92912cba6156cf7f1ed54d0743083c7a00e529fb4c757db4c9070266cd208b29378a155ed5bd571e5051e18f1c6ace9823c65da31334d278b0891e2ff63df5bc0bc1f9acccaabdec6d56b06270e5dab6fc346230898d4c4d958d6959c7773244719e03c5a6433c0f33b929ac12701d049d741e1521fa5438c689524472e9268e625617696edcab3c16b7489bb0f71686f18ff2a528980c0183eba8293843131bd68b18364d1a28313190426e9d401a02fb2ff4a23aaf1461ad458232262b3f1caf4963520755b7284d052f4838a4883661c8cb6a3e77f708477d359727fe324194516829b163c2bf8edd58e8f89e8476ecdae4f690e578e059d188f3a1e532737278f8a8a6872beb66deebcb94ae97d34c89c45a3edd2cd9f24eedc94599aa1aa793d345485b9146b25c9039d912d3cb57027e1e5187ad173278910efcb2a16bb32be0befa5308fa27ace0e09281015c9d3f3398a6cfe5c9d77b2d7fef347661bd9597d758a5a47d572892092aaa370f7aa611b48383f057ff76929bda9353ca12b488b7415ba1ed43e343b9e3d4f8932b4c0f3b850e8dbfa2ab12951c8d3307a9dbb0dfd4385cddaf720c182529950a56b60acd76277112a64e72bb010ffbf5bd102ad275db3bdb6e3349814e3ef71c6cd94d93581d225be776441d6fc9207b75cd25fbb9f671faa95d6d221be33ba34c166ed4dfd8092603b8f468733da2e3dff4b8b54e5927b4e744893e2b77ec9131791239c35c023f5dd8a4e3baf10ac4923c785c98cf3ee511e48a02465fd64b4743c025de6a749d86d23734e8fc167c812141e7ccf9f3a8b09285c9574a4416e5d2ff58851f383221954c051c3b63fb4fa31aed7e9836eff6f87a90a5315a214dc8a875bb63e9e22d0a71c7d44203954ee38dc7c1b9bb176d02d6cb274aaeadc844b623dff53edb6f471474994d100d768a31b34f6f49e2b1728b9c5fdc79f609e966ab656931955c9cf40df00726bdc70da16b2937242938834b7a8e4db5592773f43f127059091fb0119bbc1c2774f86448b5a2a54192bfa1f9c8e8bb8e149d12cd86c2d8e64e13c86c8e6c8e6b5519d53e3664015f0099d6e42c6a0d32ddbccd0867231b5530317340de033629f3b785b225f3acddfabb02389e0ee4e430fed330ec1c2172ac13677eac2a76bc3f72ec597aa42588ec8c0761438b21a29151c33147cf5dc4c0bbbad169a4f1d163b7ba072443ec53bca85e2995cfb15413a5519cbb3477f103544deb67186986f7cf9b46c05ad6177a8d9eaa4aa3bda891aded9f740693797343dea1777efd510a8943a8cd6b13ff47bc724b6329bf5a92c902901d1652691a92f3cd61e32b5e8d03adf638492a02023579de7d9d1e3bf1095d241f958ba6a76ad204e97aff6ea5391eaac2ad354fc6cafa0aa360dfd1866fd56620a91c128bc632dbdb2fe4fc5085a9cf0c1ed7b1f2faebe72ff18e7e9fb5d2d903e41a30b720179abd0b738e840871e7ed0417d101f601b1c44836706aa5c314eb94b9fa7d375076b7975ca23baf1861ad8708d70e1c036dc7ca37c2e01683e5cd034ce6814340d0755fd6ba5f33b316e88ea6d08c642060ae149d6cfc11956d8d29c5fbcfd3391e46e6992578e4e1dcfa3cd2b2c9ed1926260163f81c9fcc598eb87c10249544194408bb2911dd4e23333d3923eb06ca0957e569c8ab495341202143e1d1b72c776d1c86953809519b8fca1ebd58b3575084c7e13a734277724823cc14274cb7b1a5536de1996d39b21dd9a7baa8cc8b702d11dfd6e09f23fc442de329a6b6edffea5549800ebca8f15a2a6171c84e99b8a602a4e5b6037a9dff9284c5b7dabed443b1124106f378a1d3d3fb1d6dee5ccb7ffec609a22330e6efa3a138ec98b276b594b6a6e9d870ea6f14eeb59834b97a3e460410714c1bdaee50659be7f8b5b085912789d2f5d6a7124bf34c914113f68f64d378d02fd2bb56770e724bdb86907cd0afa5d0874193bf77382cbc84df0d31aa8add50d6122b159c579b7eb44e888de4457d5b56595fbb1b911b608ef0ab5a0573d54b382cf64707553b96eb951dab8c6125c8d0e302f4646b14b4095fe61e63192e8b1a512d48582b8bb6057239f18c1632772d042fdc5485855af188a92a2c8e9c54f8a0a2329e9ca37f26e098123054bbf345c97d8aa6bba737e83e9ac0e74c9f46ad0eaee2f4bbda2c63cce342a69c915125eda824d124c4780701a38d000bf2884bb0980c1816e2ab5f4088e31f46071a1d51c5cf8ea9fd4288ba39ece03ec53f1078876e4e867123ab3cebffd512900345d61c7a7ab726388bd99c528ee108cbe10eea1b2a07bb04257a9880a959428702f5e4b57a942e5084a0953e844c2085ff1a9ec640999b9825e0dd9caff7bed244af7b230b521ff2a5b96583c03f0793e0e2840242cedb538ecf6dbf874f9d9b13215d5ba2b20df9fa854237289592c5486fb55da6eaf36e943f7b4e5b8da98fad114fc48c9b87b7785668fb1035b715ae406b7326fa1c09cc39e8ef3b4eccabc29a00a5bea6d81c8015c40b22b42700b39995e31a0147705be35f81ab9749b7d733fde53e6a6787fc5923bd220db824b827bc3984bdab706667895007c170275071977ced7ba4d2d6a843736e0f3b8d6a136e8185b734545ddbda26f41a3ae60bea99852218a1d8598679f12418ab67ea36ca2d8b5c6c56da1b1247dcba9dc78f5771faef73f8ab1e2d9928ac2293be0cf25ffa7d06273daceeeccd1abc556c37a5ba3353a6ab478d4aaa7be9cf17bf88423d5f09e1c1dbb43e1969797101961022ba91264412af038cf0cb83232e169ad5a81ad8280dc4e8e3cd1c7783a363d22639e827e6136d467b4cdcdc703cc0f9891580ba177787c6c1a0502ba3b24006b98eb837b7fa6a4da0d426727896cb4263cff64f32147f36305c44bca25f2aa48b4653ea6b058eab63a755d536453f23d532434b8267150f7523b03dd27df3091a8e6fc2ca2ca0a2b777ecfc3ae76866daf5949589d313b3bcab65958eaa202a69a82ef308e1e4de3173a65acdfc881f4789d9c3a2b9cc087b10f9320368d52e01e019e2a6d591973ad4c1f5c1a6d92b2ad97dff3251293b5324c6069551919405eb7aab9b814e9b9c602873c1ff36a160e76690bc7b474164143adcb4c04492a650561d98e325cb7837f5260747428a54d00165291133443824249a1b3d6c5aa9ce6af035cb8138c17ffca1266dfebd75460b46c71209ee8aefec0ffb0d98dbdf9665e5353e97743eda612f2f9a93b54db8afe9996a038e7729b40c53fdcf89526386bd1128d23bcda07d5e70f5d8cc84579eb58933787d0971daada661188604cef7377de0048c3ac9c91ca5048be97a964bf7abed0405a56ea4d67b6bb6cbb0f976dc445bb679b46fafc2e303227ded01780aad98548d261dc5c4b0622ebec416919b00eea064c26f4895ddf1de28ae4c60edba0711957ad08a36d76b467f2469548cc80afb97e2d637c73fd8b4cf9cad57f8b1109051def98479a6904e1e19e786f7947f90237275a92f185c4b36ad4d4d7cea6917eed6121874c157d365ccea51bf9dbfdf81042b7cd60c9eba1c14c7dc4cd6c67c2f73f5594fb4b25eebfb6f132c9cceec0bd39809430791a9349aeeecc64c40fd0eb74ff191bca5068bc89ff64d4099b4ccf21cb39a2efb3af814cd152bf6d178fd4b66cfe2d79b383db14da666c5f9624894e8911087a493f75e186823aaafd635b363e621238d5ce418d1f4ff3ba3b17046d2ade0f1dc8dff5392c80fefd6b6e2b078df426f43a0a5f7fbdf636a739a23ca947e8e8a88875c5003153419effeb2bdf9b8a837aa94e0938a6412ae209910cf255ba4592827823d1d0b0a0e5536ed2ce284aa6374ce657808a9cbfc4d6498379896da575b63b1d5289f1015673ceb79f2916c6ca0fc1d261372df6bec751d879a0a8927cd2516a6b9b8668c6c33e4df7a568893259d3aa84c506d0d1ac0f4a4a7750cfe1fdbc5bc7013a0d65813313bcb10c4914a96340f7a3d01655b8105ae9c489a96c78d2a3d18723f72d3e5ae4b145fb834340b5837accd50712281214f019a48b43fa9a4fda635e60e044f135e75b5be995c9f3db4aaced2477f71af73fafa7d6adf88cfc9f31ff70df34145a3c152ecd5e8d96b1663c6ce0f385210adb30ec6a68a9777a31f79f003b82ff639a4118a3219769fea674803ca452fa553acf55786eb843b7d3a254539540101a8f2219afe882a8f5723f52efd1b732d8d7e5a70cac72475f9b3bc5b6a4bd0467eccc95c923b2d421c5bfa21497464d046276d01eca782677041ee44abda38bbf6133aaf572528128bba8c2d3ec60176f47a31e6eaf6c270e9646a08a28843e378c3ca3a34f316ab9d44d20d11512f16a4329e99c422681974cf9e720b33a931314696f62c55d3ae8d105638b72607129d6389b56cb58d9f54e350c0aaa8c80dec5cbc6a71606784bbad8ecb4f80b98b768c6ebd84eac481e15234d814e7ee654c0f08f13d1740c2c804ce56dbdb431e675c3e01ad3fb16407dcf190acacb32e1c07328172981bed16b2bb2a146b431780d0846238b543202fe8ec3f5abb1156b87dd42664ba7bace6927d2a4e66b144c2048e833e7b24d992bd4280dd14ebf8b7b3115594d7fe238f03d21746367c5b04a9ee57280bf9dd79d80c16af87cd0806c21011a2fa0086901d855a0eb6c2bfd6685ce0ba3abeb4fbca9ae1b65821319884dcb0f6e33dd939150b545684cc9e001a41859bea5e65579a8f55565c5856fff99de25006938df236a3a5ae58be81d3e0b7e314206b3ed4b53323865cc1ee7b3cf055f6f0042ad0bd3f313a4209fe06e6d0c6d6575899f496f891656ae1339f952d40ea817c9ca1f186c93f03ded0027f70f0ae816e44b7ccf7697cd743700cfc34c5377fc6643f7afad370d6f38436cb1552195dd493274cca9bf25d020e1f7c44ea57dcfa0e4755462a6542121621f823026d285dc3d70bdcb789c7599dfe31ab9c44ea1d8ee2188293e20c4feb0021423db9b6fbb471f0b0c567e8aa08e85cea6ef32f4a2c4f598d5d00ca3257f6f48b45ebcc96d3502bed81c8eb7d3e47ae4e29b87798cf1242f989b444380d9a4f5c3082a98589a34c6435c4e0bbf5f3789455241e6125471ef5b2cd3629d1492fcbd05d1893781be1d9fd73e05bc0fa08916d09742a6b1f76aafc20373f3ee1104a5dd4bdbe3a288be36af75382e8e92457955e0d75a9a26230487b0db1afe6ad640b91a4ddb12615d0a5673da20db94ceac39a67d99f177aea4ce03ce29377c9aea8094aa4a9a524105458bb5dfa476943c2261b97751d210695a819ec8add51a01683a458f145c367ff050f93605113ec11db7b34dd21e1ef2514e1316ad88f83987dbdc08c86ead4294b30cce32ad255acd1c0cca61aaa68c9187e52cc8127bf6e0c92ba3904d0549b97c3f2c6ebd2f0249118144cb1220291bb055cee5c3ea959fc32ce71480252d884af24055b8e5414c39591cc9b7132bbc3721cf243749b5366192362cb791d2ec1b755ed20517d159d3d62da1e145ef2356b0c3e730c2f2c8543c25e9f49ff87a3580679333da8d510d4168fba091df58fa5011bf3c4b14370c1df22f2bcc1f10a979cfefe82427ce691db487449357cd831118616d45c54bbfc379305e963601ca59382add0c225bf5ad85be77c1ee703a0925eb2757e4743683a7d133583330034bc43b2ed104ead06bb93176f0500981faa443f5ebff6ac5c8489a2e17d5cb9b142975493d6d4e75912ed0233c8a13f5113ce951c4733c40b849b792375209920a4da00df178e8e6c33f30b9ed953718aa0acd2588ae4d764ba6c167c19702805edb063f935a2fc0777dbb7c92da6a5e3d78f9c53dd59b32e4caaa458830ef1e4834a92f3f43025fad779c00e4c55af995672b7586a0b53260c266676c1643d42b6ea458981f84de79349df39e140dfa1f1cf56695c2e9f4cdd39d13d6954715142fab844ab020037b5ecb43c0f917e099e823e1f4ea9bf54cca63f2a0519be649eac3940782826ac1628cbadf9a868f9867e3a32a7eb631b7e85d4ad92948108d760f223135d4580c67db1b65db8f4cd6c5570b8c6a7d11053a63434d22118217f9509647465490ef7d3a9a548c9cb19ee563f51db68a9c1ce539b0073a8b8e90d9e3b2f578b34ee83b84707b269c77145ab7c9774d5838acd0774a547ea5c206ed5ba539ad04979674f96e7516d7db0d66e2869f034fd04f40e856f64c1e3ae9267fcfe27c8d2390b9bedb0498a6d10a4d84641abdc512b1c4ac96c916d0dce819de264044474459b8ad41f402682283e9ee5a14bc84830fa7b02e1247cad0f96e64c50e762f8811c20cf408c571e86d9562811e40ca116d7307a66ceef53706c854af92a6040eb03f61123ce500903695ef5c0de81eba22c6244de0fdc2f40841f4303810e978c95966d76146b37c56a7e3a2d772619d0dd4d9c26ebe231d008811c32ae4abcbe3710873039638882205163b8a2e1207f641869a9483bc70f95f17f4d6482be20ba2221c3a45dbb2719d7867be3c11638a4bde00d73a2666de9eee6ef12618542e9da414a31b49564d6bd09036dcc95b4305bd583dd6981ebdc5d8bee084403e3cd7f17a9ac418919d1d05d3d0a5ae142f0bd6e044a7f7392118077a53cf45add0214fb16d0f5ec2c372177a23e3d390620ba4eee8b2e0f4741a1c349a640f5a83faf949cafc9494eb85a23d18972eb6911b0db9971e4d305e40039e93c53f3f0187fe50f01aaa26ce263826070b2e020dc65786230243211549fa42b849b503b1a3b9e787592993cb9e733b0465706105270ecf721d28db1aa438dbbd58957153ad54794912b76188848d2f3f05c203f8605315c9e0717ede874bded459e28a6e10a9fc422d7b45fdfbf7416723da55f05ade50a5a2494b822048dc657f7da0a7b476d52dfd943f1ae166d56d3466aac2251f2ba5d8215df9644c94ae0a87cfc2e4ab2ac36a1193062e615fbd55e357402afca2b4617013d5944e4223297c5e6be42c94c1a8539a281991120648678720f28295c23f1470228760859a2cc8b7619416b2f77850d40f3bfe05a486a6e469f195c6c4a6f2ffe362e0f7599faa819a41ab5b36ddddf7e958c6830bee98e07ec5972dccaa89eba5c36edca3ba1f46b50a1efe5b5ecedcaebc88e95ad1203d29d428496558d2c695ab05364d9b150cf35e7e88bd889da56e3d4e2d4978b2d75e6ddd0ff8c8226e52cd02a77f65733738dc88b92aa20a038d32a3ed023eed2de4ec7b6bce35bed900170eee09119dacc11f8946f7663387c3fc7a604034ba8beb4a4addd67b19c4e3f7e967e34ae8504f1e8cdd03514f7a0ae5ae6db9e6b56642cad5029b3c2bfd16f38825d0127d5ac3e05c7985a75a7800a9ad9062d955a87ae9de66485aaf80001c6da491b5909fb765f26b08e61dde05a07369e291a7d8ee0848b2c29b10f36de71e98445496e4590c16b96bad2decd3451dc389a1ceee6431053520e2bd65c52a4ab9dc64a572ab78fbde4098ba9b9b064eb08768d201afe2eacd75e579f60fbfca1d23fdefd01208c30ed45eb108a80d201af8536ef30681dc34969b65dfc9781d4d22c4287baf414c2f0988ec353b54021c1004331ae832471e0d9f98a8f5d2e50dfe9f9e243004955953817450c1cec3ad92c0e3b0372a43c8600f0bd7a7861f44bade9498d4e7e042efef99169833780a336dc339b2f8de0d17415653a7a01f0dfd7e2487e9990faa61ecb8940847c7114f95c74e07c1272051242a4862e77164e9e4c2448d98ab94f6038c03580e79d5008e9e027819331d9ef3247e45fbdb49845789465294771bef51f8d004dcac53dd31305380cc6efe81c28f371cf0d2ed2a5106369c120df6fba8baf12788856d293f629d8f5055082bad348358aa2375ecc3feab691fb31ed10b2263f6215cdda7da1ac21bef0796c384a15a32210c9b0e65a07177b327aad96d8fdb3d8ace00f27a304ef1664ab535b7d68f40907e1899240f7133be79c0736176263873c5d3319664560ca66d3dc44587930d346a5f45fb4fcae6c7d6f81b09a7d8312e21ec0ae34ccc7f23d2132c1b1e1136268502d8917cb367e51fb5e1e5f181c44296396fc35edd3b365ef84c53af8ac44cb6c95274030a2c33da141b4f923d574b250a7de661ab8f09d0f74039dd777f2f4c9b6c2cceccff2bd44990400abc8564675e517996b721b2326dafd61028e5e9cb188a34d031aa9914aa774a88610e3f9b5a759b6a1cf38d98ae379d4fbc40ba9c43534b2e77765025c53f6feccf40dca40a2b6af38a773a2a5109ec96d119c84ccb4e540bb61abb33cc967941ec6f65ab0e4d8550d0c0f39842a7fac308934fed5586a9501549b405932cdc815213559215ac81bc9d99e459ad192169d06ca336b12314036142b2385fd8181a4195a64170d1d9284f87b988c678efeea588f0199c65ce3f19849909a90985878ca3bc1ca7b0afe75792e48900b6f9cb3b370128a20862e2e19e7f34c4d325bd544c528e0667f35c421e3db83556fb7561d65c0c57c487176c15a569e0b00436ab177a2d58dbbe722c84accdd66b7e678c83b9c000126c037052498f794ed5f1f8164bcf9124871aa3f06ce5ae9a6034d0072d6e6c2698caff2ff4a7a3b34ac28889f2abdc8210aaa843d866cca9f5ca8cfdd3d27b3a0f217dc041eb5c4ab081254deba207aa40594ca9e674627ea426b8be01555365ce585d7535c7616ec7eb08731d3e156c58a59da889de6a2ff3248ed3c087ce85ffd6390dc832479f52ec40b1ecef41d8a9a4bb9b4d9d886950ae8ad4827071dc58d8ea62536794d29adc28a333c954850a4e62986bf448cc988147a2b2c970c023c1c227fcf74389fb568f5a9c32cbe6ba5a003df0572254aff89ae024ab16d1c5541d155604934208c6245977530a7eff4b570d7ca6dcec686558c12f0a31fee8773140b7a2283c6cafb45f9c66f8382a386b5bd511433140778389e8f1c3a10267d6cd02130c5ea1d72b02620d95b6483e00b9fb19f52d9005d446c061eda90823a79069126c409f76bcd0c18bce3c68ce713b8e4c0bcc694d65d6848c11f149698b88a7e408ce2f26c155ec3513b2f07f61c836cca206bd49a95a8661f684bd879abd33af9f320a510e12d8969631a9bd4e53889d2e5416356e3966272b3921d5905e1422c35b940d8362e2b8c5d711284d5c549bc496cc392ae511a49683a44fa14cb3a8d738777aa413130316273555370580d7febda7f46e112ee231ed6f4a31c2de2f18e43c2ca299c4e282d733bc8743d3cfe84a317f02f0b301993002d12eff8a80ad3f41e5975166e08dc27a02f827b831c930fe70b680c2ef471c4b270105d609d25000a98cac8d11105bb5cb861998a632ae21a0bca9e8c8ea492f7c9391a0c2485061a69b8e59d5d9732d42de52085e17dec7389e5647cd08f357b828dd53ea9963ff108a6c209dc0adf7aacc13c9060b006cbeb78701a23dc1726701b89b29e6244dca64db006edec88a7d9b5139db8a46d4107d94cdbc684a97d514a9e729add6531ebaa73083033343d5c17895a188af53da5b3d452c2abdc1acf227e395f0a6294a637346c7c9b0635dbe8c056befd8871b7d02f099dde77b68983605f50b80eade7f069ba2ada62f8aebf4bf8bfa0f8d1ae4d3233859fda4c17bfb4fcb6e6f35429c11e6e650fd4c4067469c999f8a4ca94543f6ec3781406d6c792f515755492d11491321097057ce08f04747194bfe86712d2f9eaa991a01ebea00636373217215df046c416a3d008e5ea9a6a28174f2180eb8e1453b0d61a4b9f34f1ec46f72845838e97bae9a63441860d59644b0b6e0ed4cc69ea2b6eaed2590555ba7e20e74eacfad46b9eb4da8d99a2a3ae2ca9cae22692226a840368966a5ec1049ccf35c51e5a622abbb41608601cca19b8f310f459c822b35dd5df6c1b49b970298152568669fba3c3bf30e268568b4388a48da93d8205d155bda4c1147360a3eed78213dcfb800234c67756b107073f1c7145e490add12885a4b689d22b521a9f852f5d54acef918bc410439533504c227d14291610910445fdfbe027f3fbc5fa780c5154b3d536f2beec381364c47b29ad244a43e1edb926b9a18468af437895f5c61a2934019de616de5bc0493483f7966266e6a41346924494ea44c7d99afe2ba1af78ab92b648fab892afb83c8cd98f8d6ec875d7b40c2befbd9258a2350bc14d5bc5438c646a32b10c933ca197a4313a34442f0f51287280e7328fec50e0e54f487441ee1efbca93a5a11aea7548457954ca64f95e233f56b95cab03e2e48c50bff32350faf9b99e903ab183447cd25997c2945b591e23cbc3b920f586e3a202cd62797be7f46696e59fe0b4b733d7ddd6b21393bbd24976d40be8597247cab9d588e1f81417807840bc6280cc24f5563c398d49bf9d3a97b542e7fe2853ed818795ed994014ed0dd0fd3cba275279d8cfd0c9371003cb9116b99aa2190044de990c90c14d2d991334d921c4445f80b85585f1c5bcb17867cc6d382b34d1ffcc555b6c5bb0ba80e2810300557cd38e15c052070e7b045b4142454064602562a002cc1ffb754cbcd12f95f6614fbd16e203e4212585f7aec79262f17d49e647e04d79c22985b9f1b1c018dfa7f0005dcd3ba13e4a8cf6a5c0d85d881598fe62a07ec434015afd203467bc8dd6e21a462ac654323a8aa38d3e688bb75e4dd6fb809f77f455da9d352de0b2d7d433b0b9b483f6b0fc71a20c75af73a66a617ed2ceb814420b3379b78121118cd0528b997bbd58924875619888112d46ff88b4b21a2e2c017b4d792ea61fcaf0496a1bb545b813a45243309c541a35aaa95891853619289dfd59a91f41984572b8d77f3c9b63f66474387a97b080c6243086d020bb01f579d1fad0ace7ec98cc0a9d53e912896bb6f37b2465fde1aa6a1797d7b2a979fccf9e30af086422a0d2da14df00eb88a8f04526c3b75977fab71a0d658ad103075abe6b4efe45e44e345b8791dd454112b22d361f9c143022da5422be2330ef23577ddddc27ec14f0b54464e2514553a40d771e38b966ad2091db9a9c010214df6243151272c5700ef98e618dc181d5bab3781de7e50d7021e93ffea1986c0c0ec3124fc9d5485ef680872b98bc9e29640f31c7da2a7d3f0bcdb1911cd09ee2e093a5f5d9f69902cbe554e3a51b0c1c2874dde2b52f362bdfc535f00251a9ede275afefe7676bbb28dc8ac148c3ff36e807904f5d3b79e06d4181a5f856e8e81b84d8f7e0811085881034dad007c93d09d2a77c1a9c30d59f965e9a01b5920ccc17e4bad7bdfa4c316b7ce9a0fd7deb40504c06a6a01ca292fdac76dadfb9f46f0f32ff78b8fa070ddb65f253a49a9cf85b04a6d9619ed67fb7498f78d73b5d9d74de259add3790de452e5907f05f00c81f1b216a9da28bc698634908681b2a6b2116dcf9fb42c1f608bbb7c80493267a284a202b2db4942db0eccf7a4c86ea6c027e31d2b12d27626f46455e6dfb5675ce556b74b38757a555920790fb3dc3743150d73694441a1a529b09a7c958154ed4d61c3c77e2968e4018052607171843f753dc297774a58b47b6d805d04218544b9fb01a3c171ce3d0fa91b3e352d58cda2d89b521b6d8d403d802708cde711c6ad0916988c2cff24389b1602928da0e2731468f295051673f895a325f7995082eb2388efce7c1652419da2a6e4aa06d5c3d70fa2465bfb1282938f8f14092950380e822a9391d40f62e4ae9dff0814173b10d238b1a4f835780ff7a5ecaccf41391112a4773676f379ddaf9b6f9f12dcede9bdd6ee4aeb3eaa5227f01dd20429e10475776c741433070fa3a3c418c4372208eb3f970062a452505c8b27fa68c067d74c0f70e6b3a1475171be57f01f0867a70056a97bc40a5580a3d50cc258e2902adb403cb3911c026aa2ffd45168195f8aed3d5f69492942e588877e6f0675918cd47199bb743c3e2cfcbb5edd894bed56d80f0f98ca8c1b86e13b95d210f2593ec837ab80fc8fa10584448e999e68a1423dba89eb3f286beb0324fd3204e0a5fcfca4368d0da4503bf9c71bd496928ea7419b3f40ac85dcda38786b903d8f07550c18a4b9489b35b2a0bfcd0332a961799757f661906654ce005817200b190d33dacb40f6166a3f28f53a95eb1d794960dd7e2a928199b7d33df21527eb71d350806fdd59d29cb9b169c5dc0fa252210690f796e74c432f9ec171fee92713827759a7bbb0cd7826792025398210f6ee2a1a2c9ce7639f0a2c2bb0f7744fe1c041a477ad5af22734a2e2b76d121353d8745b89092fb025c7947181d55f42b2eee0b5a7b5053170a55b96803ad0363d6a2a3127ab9915456d0a7a4022fdca0aa5fc91349fb25b4645bca353192f43c4b1f5db4c3ac9d8c41696e6a0be7e2abef44c50d5307fb7608b402018a4e8801d256c962d2716460600575f7f5762a374095e4227a4a700294acbaba69baed01732943c15f758c69c21f4d804f56c5df503800063092be427fd34385e0c7b1df9fa99d6d429919fc7f7416c898ee8643c936cc38396958a9c8e544cb9aecd2161a309b0437899c11b7535b026772859583a2305a863553ab02e0d701e35e0cb97fb352e87520e75e17f4b895ef1b905cd3fa049712ca635eeb95a0ca0565a0c52095d52a06a50ffaab55b300f943a2a4214f21812a741d23702c16093e4ea9b6379c885114440fada79acdee53c79c0105938561686c0037980276343e0953ba271094050071aafe217a91fca3d009750994dac3483544d8a52c3e92feab6eff2553e9278928a5948e22da8af5b41ce0b55745b9cd35a065bcbba34fcc40b08c0e42ec15ed6fdbd8f3e24e1c417912fa24f473b9d4d83c549d7dde2a3298ca9194b0ddfa5416848f6ad02bbf8737493eddeb36d49b509e43cc59a46a8537ad972601343ca873228c39f2e0b55ad71d8b1e63f1568d8bab314d37b70c29d99c0e451deb8e837751360524d0507f93eae98418eafb74a930b07c0631762ed744b641b16b1726cc11e960f76739a08de532ef7ec6a13e7ebd5dc651e164b259ba635327f1c8ce0c2d2c34f7cd78d2a75d5038226d171e39c481c840a68aa6ef261da91cb570c0aaa3438d7de6f9ae9da9ae3662b6e8cedf853e08d6a25eaef2ee7bacbb7eef0189ea111e3727279788e90f69c2d628c62fa0afd4d4677a5ed0169602c2f0fe5884cab4b95eca827c8bb698cab4951765fbf74214c39c82c2df3cb322df69061ad0e963a8af4e3dee5aa6f3ab039345f725617ab1477b2ff4cc204ad6cd21d6ad6e1695a9c42eb2e0bdd6c6898d1c2566a607bf6f55355dd4592100278f2b6a29fc74a6e7e56e6ce3f5ec56073c491df3b1a08512dc5375d5eaf423dbbc08bc1a724eaffdea87310d6b148a127746f6dc3d3e5a4eb2f38b31bf4c88bc1e8f2822b534d51beb82d46dc23f1be349668056e04533bbfa55c12f5fcb0a227d74483e6c52025d3182482f7c485fa0b1091b19cc8e375a469b0098cc1eb1dab7d9e6b7133c18390dc07bc37176710da43b3e78844376054a8271eaa09170e742611143b486912d1ef7657b708f227a96951940b93e37c5e4034e927f58c221b8eef9c4faae5b8e835e3864eeb07d2f51f6efcd0faa4628fa6e1fc49edcb889f1b8e39f2e14faa228e7edfe4dd89043801cd433ca7689326185ddaf24edf7aded5e3e08873a4bea3c27b63bce91a7f52a9e54cc732d5a2862ab42dd69134f628742c9ffb3e3ca715996a767c47ca47d143eba9bf4d0bded68028ace5240e327114502acde512ece1493538d2f8112de48a33112f4c9f8c4f91c62ee8018995ed6407ab551bc6a7e818bfaa0374c821d0c9eefff229d293d85054a37b4307caa1d162d483f93354840fc751d1f9296a113d453d34928bc7293ec585ce6c0bb799bdf429762ae475bbcd7676d7535f2edba649c3bf4bc0873982561b2d04abf33114587b0d743dbda3b3264f99b39b986780dc95133f45fa0eacd897645d039f42c06e22ebd673607c941ae6ad9bc39181a51d454b3c55649cff3246d93deac2f7d8391cd30dc88dbdc11fd4a39eb22361044fa99f629ced97fd81c30757913a4f9844fde0e5d9cba88c215e5eea28229b0c5e15907397e695dc8f43ccc0a1d2942603040642fd143d6cdc4cc51c2ea9afbf5a5ca8f28740c986e4e475f953bcc61fb479ea93e607fb5db1506248cd0479e10bad80faf2d237beca53cc3aac860ebcf95f435f909712d69f8012266f9c0e5e63c8462431b806479178e523fa22d22463dcb837addb90e355666e488e5567101db83416844c1d3f6a6ead922fa7da77b50e897c9d5f4c61bc990931245ea1e8c0c367ebe781246bf8c3ce470422b90dc7b1e5e43f998132c4fd3054b4cc806b56c037583043a9add953d9392c23b323a85c419fa30767fccc8274201571fa80f64d03b7ad0fbc47a61430acdbf2c6979c88d183187d42d5be6a53d281689a7b809a23a85729b13031a8f6d7ae133c2fafc021490712d14637e5337f585a4e9d2ba72f85afa947e9c0a37f5f13834d7f66259572f6335544ff7d6775772830c2e8f61dd948d70d1c6601ff0e87de2fb305e365c0265353449b941aba5be360d363936cce5c4769360a581deb5279bcefbd98cb7add5d01324486f8b226994315cd1ece41a2405e1712d57e6784b8fcb5417fc558bb2afd25e89f2beeadfde1a4cf48e11e4cb48d0550c4ad2ee0eb1c1025adf98f553603808b2c52a827e7c42abeeb67acdfb150e06dd1d7f5e24cb68a06d584d92ac686fe83095f56b4990456c16387ff66d1ed2a1ec6b32838db78e02a3503448143ea0727007715d154af07a8bc9bd845948a75f02288a57f2bac03a7f9d0eec0fac0b17855cdaa0a4934c90af382ab6767c18e6dc31df4b83d3e253e2dc265d2c974c057bf112d1158d167a4412bfa8498fcf2cbdbe4fe3949bec45a613fde516427f1d896a5e047f4722ef8199adc4bfca451583960128723a4f438a7bc98df50e5bce0579472f592e5e7b09e6ee218bd603b50c66fb4722df47ba032e4fccc13ae2dee24a2804eae453f4728560e30a5c245ea3d7a14d1c919140c3fde6e7193122e95d70a6886bc9f05844b851132afee1b718e7a42ff7cef5c558e32ad8e542f603d612c343cda25d5d16aa1646e197a68b3c3d8234a347eb8126eedcb7fcc5edf0f3ad713c12b73a7f30395d769b0caded5f383f0e564f08874e357c39e510947c0cbc88c9dee58d97b3dbf08df4e06ab081d9d1f545ea7c14476f7b52aec2d4278b35ef6e3f53a3f50799d06afec5d3dbf08df27838b48976f75ec719170fd2d4766ec74c7cadee9f941f872327844ba3aab612f54c6096bd9c7ecf5fd46e73e116c64ba0729614f0ec7e5b314a1d8891d91d967ac1a7b6154385d962abd5170d94f1d64b521e2108018c156dc5cdad3d8bea055824536fb59ef30b3add12d7dd73a94b232584740f1052b6f1e72d9efbe46286b4d804e8187d6e92d58f064777d44ca41b9449983ed29ea5052b5217eee0baf527285c162f41e9095b477be97d76231c2fca9d1e56b6bf4cc57771f46401c46ee0d23920ce3dc0be32b0ae37a4e183defe6c2e4f92da505b6a10946e407c66904c6d70c189761deb1e500c2257f51442548c3a824b68e7ed152965fccefd57943f4457a3033d467592f66e51ee392719b3e907cb18dea2739843ae1df77de7af12b74b2ce0665465c4c99414c27f0bcf69ac4590f13861a5ea1633f5613795b5be04099faa15f7aec59b268cfd173aaa009888038c16c3df52bfe4c5715161c15e1f71668d08f2e6727fbd3a21019a37010bf65550d73a24869f5ab0982bbe317360d8bb5ff180189e106ca0234c68e06889f1edf3b597e228617e316c07449ee0c43d68f052a60f487eaeda9af6294c014bd710caac4df4f4c462e04e6b5743e4eac4545df818ded5e9b927ebd1cc160b0901f7201daff76c5f87c94f3627a5b7b878d2ca7c027deff4155fbae727da827db64cf2992d9b10bf47ecca23801ea607b4ace41f1c09ac31dea535581680f8dfcde88bc31976e73403e77cb4e15cf6a4d9e2355c7e7b306e065b41747804f08ddd3f63f76a18b1d4caa7b2411e046bf145bf4eab2d7ab64a11ed864f2aacb90ab719625af54796e8a0dc600d3ed12d9553835403444b39f3e68eac4e71e04fe3e0dd052b4fed5ee65aa28daaca9eb9a871999a4c7344f0ec332bc59447240bcc193252a07220d7d4ed2253d86fd05779e89570afba0e9657dba7d5eef0059b5b6e0654ce09423488e2e3c5ccc6abd75babd4c8888a9625e9e00dde99a7a99cdf4cfadf2c717ccb2d7a5c51f6201edc95ff25d206c6b5748812f59c3e48ff38ad2a1668f009dc1389561b40cb0c29e59a6605170ea4a9d2e740a2bd9623b3a17f20a612b756bebb04a3002d3507b9c39ad5a59ecd8de7ddbc516d2d72eb946b9e7b6701ef52e74fa44c05dc2e5a19e022e8fd0b122eaba0eef9f81d0c99dddf463d771a26ec1aaa6a3a773e0141e62eb7438822c2c86d7d23c66f3f37c010bb56adc0b1716583c890af517f05118204a1950871a385ba37bdea070e38065939edfd50d96616c4d437aa66177384013e522c9e40123cde09a385d5513f2a277f68e8f0967c62825f6e2a3c8a0f509d416b3dfa0c35091ff220146b76099f582b1b5d302f43d5be1f8ca11a007caafd5f3df9a8959b3367a98f8593d4055f6aa0df43c43f10b20abc1afac4250c4bc3702474fa29f950755655cda869e4744b1981f2b4d64d61ef78e39509eb88d08a6bd82a0e295fa24810bf6622384995bf32d146ee4b7c7b227853bd670ac4c4374d262f746ae195dd7aa198c857e3c9268e241deff9e1fddd416341ef6460f659c0fd9923f02f1b2a76a31c93e05d1cd4851e8d03ee43cf70f6131b5d2b81489bd27e1447db5b0d02d198bfcb76662d6ac551a065de04ae94eeae9ade7a95bbe601d3b9bebca2f612f492496f967cd04d71ac2b82554e8119bdc99d7d1241a6b008d080b86f60753c61d422ca9b1d137e7a560162c4330a3caddd10be1cbbebe5576ab603ab720ca0e6236d79b40eb37855fc2e950e3c4df7d22602d4c4e0c91a6646b879bcd799076c1456b43e16375feb236d156dc0116e63e2b0e54cbbcb4d11a0f48de3456b530fba69cbaf99e656fe5fb28a547c72f34de075e3ba603ab77e9ae7daece3cd7d9c97c49804e5ce0be0f6006e92730bf0f4da9f735eb7ecff08db6539c0df0cb26f288419a6ddd59452c67846edd2b10691d72b5188e961faf09beb1443e56075733463d9b5b4ef00051acf0db8a135a11271cd1ae70a428cdccdd774db75cd660b779605d831f40cefc6abb7dd78326b9e586a921df3053e5061a8f24ff55ab9bfc16d47b968f2c032b4e3c2b598e7cac3d3381b2068d2d16cfc5daff60e956fcf6bd716cb8b57c56c95f6b4f60b537bfdb5000a1b60cc1b5f260aaaa7af5095abc0170c7d8be86741958df145d1ed147b1adca79d807e9c15876ca02384db0c6c8ebc75ca28ca4d820ba86791c9bd2587f5e111e4c57dc608f648b1d25d8455bf6cf4f2c9907b039713b78bf2cbcb14f954dbc0d9dc6614d93d946d00698c56b9f51e7825b56b4977d87c10522a43f68b9e42ef9679b4efb23c3fa26be5917d03d5c48f27a6469e6992d3c3f3e2e3a4b5901fbab1cf870cadca233197cf8b8b1582211aa741b4c10387e89d423309e36d4237dd97ff25f89d7ae370d8142e91d2ecd834bc183239ef740afeecd6024b75552c473b03f745253c05ec2cecec9bb750436f69d93ab368bc1f724b128534a2c883dfa516cfd4b4fab2917ed06ab6a13c21a0aab4ba7eaa517374051a21525b91535a41c318885593ee51a17580e66859554b673da8ff34dc89e2484a5c4a2b0171692be5f5d204a0f2fed0cabb78f78c06e15ee7df9560e0fa5cf8a70219ea6c4b675d36aeecc5a40cf02526e747f7e51845d096a5a1f7f134e264c10fd0b8bacbc079c7fbfcb03c2eb0dd4685bdf7003555f8420f4586c5ad0220ea93b175954411749f11884b6627e8f19c57ead6ac607053d24bd8e8099a184618b88b737ccf43d901e42cae0fdffe2d46b998e7ea94e7ae144cd366a96ac02f60290d699bbb7e9d158cf9c4198ab5007b56bb63ab3a6af232d5bade6a8bc7b65135edb14296b9c4b79ce21e172dab3b1976a4404317eb77e52bc0438c6084a4a83146200957e76f3576ff92927a30e55ce092e1e6251dfd40d561d53815c0978d4c2274da4d04ff33fa430ad11533c0964a5c9e9d980028139e4b4950add940ee68d23c0ce76283973dfeaf0091ddafbf227ebd32094565b1b44061ef65b4ca9c45576b5bc9bba8c2e6100b35c0792d0ef203e34a7a308654be09a0cef50a4054c347ad0f50df5e75317eefe4bbce0d4a9e56e8aef11b595e281ddc71133804d1dc1d6c0f00a4742585dad1d71cca0274e2b178c094bbb111471e797040c21b42d97057186a2290928bfc584690743b45f27d601a964815f8348125a31efd5b425890e263b2193ba3ea9580c7fed787cb22212688ed95fd632b35bda28ca245110dbbfd164e0463708ac201fd41a032255383e1c3519c055783b1247b3cf50772868d7858302848bb6da5a4bc45d6b01e3d73a647e8a469a27f989e526c50b0a2f36c0e8d028c4b8cb7a89e1521cb35f95453b8768584dba78caef9046809411763f24c1809f20543c1a14097d7f4306255fcc37c894730f85c6c7807edb081448f139ebad37887586406cf449fb3ffddb3e465faf904e29dc031b04e4c63150e905cb9c3ca94d69d7672af8caf25e02d1ab1922d91ff1fb3122fb1f7da2c055a60007361191a3c87bcee9a547b78edccf137851fcde433c5d004c0744875c1303d86fe9d79de72f053b618218f2a4973eb3d1a1144629b7f006bce84048d2c2fe4f9fa1bcd9af3cb041e0036d24aae78757d14de71d225cac69e541e4d0ffaab25ea04474fc7cc6d43a21283c8d53a19c724af0b998446a0e861db63f95f9472576b8132376bb6d3298f46f5a67a97f33ab0dbf36bfcb6523e2ca441ff45a8d846d0775494b23b83830cfcac4ad8bbe18b9c98021b4fb2f42c6f7b14eb367a7ff6aa2bb8984a7062323f1e606d62b333e65e4cf83bb9ab27f804eaab939f8c1831f70d8c1b64f5b8e075d1d49fa9c8b5508a3f7adbc1111dcd61a7280c7af1e7a80f7a29b540c741e92574e5357690a53e0755a0095e4327b38d311fa2ee95495b4dcdf2f7e774088a7509febcd5de8bde1fa98b084fa11e941dacb147d71e7e86b667abe4725689d25ed6b6cb4a64cb3d137815d9b61040aaf0411e57cef804a2f0e7e298120c8c23e87a2c3bbb957962caa09513a7d4d1f4ba2b94e8d6c41ca4d139aa774f8353d07b1c225c8e60f7cbe87b55c5645fbec1e4bd33149900e328ee783dd82a3a244278e003495cdbe7a0322813170dba23407bb8d901b5d391a70388f67de09d01afba8de62969ae600833e2bc2bc9c9c5af2e3691f537659fd00a0856c382a6af33f05425f8aeec350f466700f241ec550abb0627585a216588a70461d568594f29a67902dc0249a9a836ef20907307978ba94756d0f3f2c30259bc08a0504d700a84d3b6e7316aadaf59785f958048eed585cfb94c00523cf54ca1c85d4f95f8608b099b36aa56514aac15033b33362aaf258972bc7909df804a09abbc6a3dbba7b71e5c741bb8acda056615927a81a12a5bb44b0c38aa5db1dc83d253a720d69f90daa27903ac6adde9381b9513e51c845785c618365571b2ba64b1944a520df7b37d073e1f48f416f2e41c5faa1768c8494823403bee8961bd5d6707becebfb7d9ebdec2f1bc24e323bc1b274d305cc186859d4538683b01f08a9d20b795add74a395d739a0f12065122c83fbbd4c63842d241db525d4cf8f9ab831abd62900e376f02c5cff334d0dd0c06da9f08529413a1eccbc27c6ca5265004e886b19bf599a2919a385ab3401c0447595cfd47296ea7399938ae61b4cc1ebcd5ce945c6de8f3d74c2f8c596bd9cd1f0b2a8b104171c30567eb13ee7a483c9e640b13a92eed35fec4412d5ad16185a6954645c24ee238979b47372dde3fa987d54c87f82cfd671d233171a73b406f927353a9ff9044bd1087a141eeb3d418c52e68e090239730bc9ebbd416e58d893367ff4f44588be4b9ec58314fe54bae474ea96ec176e8400f14af52f1e57bac6b680c67fa7a5b17424be0875f706f48351056351c6781ea0eccd869382428718edb24cd6b119dc608d0be4894896441a28ef7276ae815230a383fb36c1df8b3fc13da5e85defd71871c2312e8f88c1fd214f9d35c819dc052bba99238e236965ccb2a709cf7714102ba002cd90d523797981c25374e5d64cc6affb7659eed1e7c40282e04a642aee08dd717de0914431181a536e6eea3e4c25d15ab2250cf442cd99664960159c0dfa6de719cfb3aaa8f9388a73d1a5a95a55892d2fc677ea661004350511cdbf8d3ac6a611922b814a413c108be36ea31387836c252eb68aecddb9d809278e4600ecb3529f537d8e594f35c1569471eab176f3e5883c6440a4439dfdcd81519355c780246101d036a7e6d52279a4e4b30a412562dd8e3a44216eb44ec428f870bf8617ce024a97c2972efa6780e2055ece826431b909aff64529fb173fe5ff1fa1139d57ce926c87a285edd1056f8a5300ca63c3835b16419af7035e08d8d562c0cebf6f6a2051d03119d683e0c5a0acf4b306b6dcaf8ee9729d05f5b1957d038c2af7b6fac080ce4e98100f6b47cbe79aeb3a779a57446118e4ccd69e2ecb0640a58414ab7a1b5b2ae9adba6dafdfd6741480402ed9d80a0dbe9c34490f267ef2d498d7084af1fa00d63166453886bba0df5b26709fbc028205aa087ec2aaf16542addd45d9147de8241bc32896dfd7dcd7d923d8612a61216c9ed428f1b723a68350ba06b804a5f54e071a0ec889f2dd572f8b9f8ab54687287b9d557d3868a41b05af5ee1a30b9847f4afca9c3c646e4d7d645a9d1a6f4b6970db88ae81db823332f75e55562e0266faa87d03236348476fa0e229456ae3410a35f514eee9cd70399f776ad970091bdf1ef92a372e6cb632d8fbbf4e9b2fc4372c999e4e25eeb46acf36124da3294bc4a7e0b4adfe1b24eb8ea19a524cab86b99ee99ecfc989b8a1e4aa939476a0d8674293d8ebdb8177a67abd089d44a8a79b34b32f3a33d1b9fa49be859eb80882fcd62678d44dc5aee708f11069cde845b27c7b65bbf34b28512c286fd964e7e65d89e11b2027512d431ca35eff7999f7cfd3dcc63bb55d995cbdb94c06c23f62acea3735c45a5fb5195f1c2d614dcf54e6fd8a4fae99970dbccff0eb8a9762e551c5589df8aad314348f03afead27dd3e5356611a9912cef86c537f3123f91582328e4d9aaee7f9a7906acd654742277a7f05ca845c862d4109355f71b166f5e4a844d1f010b9309e9f3d7b1f296d1c27cbd0bed54bc9a398cd7e9a6ab0994c1570a22993314e2ee1e87780ab70a1c5e0c53714ca8b94e985d79cea3456af19fa48c39ec3125147b2c87a7e31a63fe25327ea0b2a0b303bc17c4bb4de1021f5a4e795abbb2f1a4f64733cf68686527a76065a3feb6fae9c897c2c09f2b42760e1cf17422f10c5a76f66376a6ac74d2593a09aa4590280c7b483fa6bacef0ce917cf5e32575787a84f8528f2904e21b63619491e36634c9b0575929a285764d263a196125eb0fa996f0d46162fd36cd7db16761281a5ebd6dfdbd8b8dbb5cbb7c847648c7e8369ac7dfca9a3ae63232f8a79ce54c69a98627fa443c4da4e16c5b498b783257c29e7434b93e42feee8f1bc79570ba15e6c6189aab53018585b6415ac8f95b07c7e9a501a3c6cbf7aa1695c4a7aa6c2e264c6df523260a1cf68f0f1402926a6a795c8b5e5bc2f7042d0305310e2d0a4373c3086451b727a5d9b54d4598889fb283fff65fda9b68b44521b195d7cbc1bb84cbfcd1ecc8f4ce21037877deaeaf20eb931dca0cffea454a3ab9869ce6bfd650b43397c4e3afe00bbeae268f0e55cda98eed7cd5986e9e74aae14f800bc0e96fd25a60dc2d6b6b59c7e8af754fae88e6395c5c180a8b8621a12fc953f533d9272bf8e72a13a58cbf039eec4086d2d1edd799f5a68e9d20832332a05f13a27cb000f9b6f5bce3413f7b64867a7c05a6f649fd3dae545455ddb8a66c506f4f585bfdc408dd7c7e6b96c2801b61a31decc9a183930419fa5493ee6fe820d85a996f2835ecd3d5329f5919b5bcfd9eaffb25eebaf7de492c59a228a45b2557b531636fb4f48e59360ec7f7c4aa4c37951fe0438d84573a3f6ccd653f1ae0ce9eb12bdab98e30876d0be46bff6c628167f9030ce54648c64cc4b51c02096ed20a49851aeeb3c680d3d8734435deb18adf3be6bea6edb935a2124fc5160cbb13eeb55e57f64231d8b18bed643fd90474e3e2a4311a86f269022585562fe0717ebba9f6725787d309b5596d2709a6545f50ac599727e2971bd43870759232972c7c49fadf906ee9dd411a3af87365dbb2d1ea39c41682632aa5014fc93acbbd2a8acd97720b860f25c9f09fbd2e2c1c3a28818ef6dd23820effc0326f93b46abdbbc4a5f38e6cc99fefb4f0c0177528aba2ad1815465e2e533f8ebbe4f8b328c45fddcb7ab7fda4827ea83e86b621d5a0e1fcc8cf02b758f1b472c5e35807974b1d7cc9f5de7169f0580d78a4f0c8fb0d8e766f938d7691fb7689bd225a9c824e82a912ba9a5898652ebbc37b90cb79899b30ba6bf90bdd32af65ca241d2885834c693ac8b3cae9a635ed0f74ff3ae29346e1e2cfd65f678e60643dd9ccd4552280c1480df6a755c5b277652389c3bb17dfca2265fa71258ccfe02c91a2363a22884d954b0ab71974cf3f3d958d7cfdc44677f219be61b09c894e0801fd8a5ba3ef585ccdd0bcd780f814c584fff874a21a310f1d1bbabb1325d74e771863c09690c8d40160465ecf98118a327c6b6e8b30fd744a613ed807132a6463f3439bf9e3f47e589e9a42f00a70473323201411b8c30eb3508720e4ca04cbaf08008633f188ae126810250c86cf28c636a5ce342b59e22c7ae4f494733ab03dd67593b8336476d18a6c917ef0dd7263b195a0748f16dd884d69213255317c27ae624ddb465f085b76f2ef71f631f56ca4e99d03de891c8fa6790beaecd089bddfa8b40e34f90bd03f05a5abd694cf25aaecaf75c1682ecb0d1db4ddc66e471c3693155e7279bba33de1a2baddddbe25d3d1f3949ca9c2a987a538d07f8e6dbb51c82f5e133e6b91b1158ede8aea996f5b033e2343e9029387cf0c5d74be48ac3d053ebbc0ae5c6bca90a0675bf5bfb4695544ab37d4e88d45bbe112bfc5c8e887815a2b896575cb50c446abed078d4e52735acaf5aae6522da74a014533465f1bc25d7eb44e5599bd0a37ec4e98f49ce33e8de332fb46198762711486c96fc44fcc3dad45f5e5183ab6fad8bba272f0159e7ab8d240be61fc24b7fbbe93e41b2a54aec57de6e8ed9e4d9c6bbf69e645007afecb06235f5c213e567843f053567ec97d706aa8c4df6054f40d9df8deadf5392a0928e25885eb6adb4e2cf4af1d4de89a219c70e6a33ed1e4b84f8fb4818dcacdcc3106836fa2975fe05892c54aff2b939aef2784a3aa609daa939fc4eea879fa3833a2c2f6d7fab5d2aee506b1cc4bc734b2f84c2a21972f3a5c3b2a9c526eba2036899f22e3d202479a9098b5ba00c3999de146752398d78caeada62bc36e49d0e7956644b23baa8bce82de168736941d94eb15db30f10f82724016b071b16372c1da0c4287004f68e7f457e17fd7a38ef41a327026f48d3a306c0dbc3e9c6c34a0213832619afd5582b48f548ba8b11142e06efbf801f1209c97b3b0e9cc87539eaa3ed938a0ecf9847203e3687165802c83c7656863066266cc4472a9cd06cfd93c82d2d47c5dac04ce6b1683cea98eb310a7261022ac502af7d17a66bbe213f2d1e0a08ae4217e3143906cc471445f761d524b47fc54552943551e3d356c3155af591997bcf3c2aa5d8f0be2b32a6ce825f07e14dd73c4f20b34eee5080da88dca3ec2ad6c517556a204750cd8df39895dd0232bb3bb51aaa1da6bf89c755a8dd34e47cbac8c5ba8169d9b25c60167599692324b835605c5c10cec6b3c07319a7f1e0b80787446333add4dea03c306fb110997a434a0187fbfbb4ca9858c8eb9b4133b8f89a49b9a0d106ab4c3ad3ec6a6ee4353462267b40eb10d6aecfa0e0c9af47d8d49c3a149f5f5ccc05c657dd2e563c76b8323ab327b46d9b802dfd5ac4c3a2f0226bf8769186b8a825325b649c5ea4e035ba1ac889b1759fdeb2d9bed480e4e5a1061759f07ef0e0140b86b60bc0870c646fbf013ddd2c8a37c9e20b5460650c110fc3f9291f6b2bb0704db09f9518570556fc2377242a3470535994102f41fe3d8f7640477f5fa5c119b0c48d30ff1d121bedbd9e75ed32e3fcf646749c9b74666a6a90ae94a5ac0e4bfedc12ceaa0b38e8e2b6e9787b93f19afe70a546a764651b08ff29d4ad9c1537e722a7b5be51b6565695ef9c3b16c822cfff61dc35d5243ae9d5ec9133d9875aa79f92c34f05d652ac4abcd6574f94a4f191493defce835c6d0d6b673808796b084f48ef003273f2dc4b3d328d0fb3b5de085c01d1a32d865fbcdf2394b3da8cd861883e729d29d51ff09a473bddf4e12423f551d435b2117887f767821d0e58bfad88c4f87ff164db2e67cee8c34d96787f36315c3495ffa46a0998bc6d52f7c60db61d8640105e65a34e742734f51b8a2b0805bc171a02bd0e8107ba96eb6d081a3fe19302f2db342df14cb43d628fd27693da4500d501baad387f27a58da2a32b8f10c0df9bdec76386fa600bf084f95e8ff35d11f9055b512126ce68445387a6ced4c99f03a76e3ce1405c55bd2c716af031e4d86e38054c54ec9af3f44300e4e693bf1004d2cd8af2fa45e7d65edbf5ebcf17473cad9b9ba3d8f4c9d3a4ad6845bea3c1c822a015725fef4dc58e6fe0286a73db9d4dc49558d3ec5097b7e49a8bde33b414d72558a28dda46a6c3d3dbd31d042f737b23ad1d60ae54cb95914b4c657670a5e6cb25989a52a41dec978d9bf4d0ac17be1b9f789ee8f84d2dd3effb6f9bb6dfcdbb6d494ed627d1ed2788fd7ecfa5dadeaf7c47dec460a50354f836570916735ccac08b7ff197963002fb0e3fe6a33326589b17abc28bc0e24e2341a600f4f32597e9d53d7bc33fcaf49c9ac8eab0e6aaaab703a078a85563d41c1f57160c722c21e9b5540af2424b836aa6ac1e805f75243e2f9fa4326af4063f04be178c9e3fb0ac1c08fd773551e2fdb0691d4600def252aa9044b6d66a5de95ebdd83f1d25290e3c82d2a5aed89918be3cde7548becaf729197c8bda0587e9516e47ba319965b8d75d3242db88aba6abfd72ca5718ce01ea52a781dcc7b1c1335f72d0e17c5a0e105e041175166115ecd801281cba7021902835724a6b200964b97971a4c5a4572ff85e665e87cedde753aa37d460f787fa3978f36e763b98c06d10cdaf102f567f08e6aa02fa9fb7fc41a47cdeae1fa78cce5f5453d57a22330131afe84de9cabd5236147ff4c181f4faa6692377348ac46c2f9dfdc8c919d3b11a43efa60850066cf8084157f3427ecfeb3b1c8cb13b3e526beec11a2670e9761b2ba10bdec6529bfabfd8d335d6312eab6c8bd94c565704e7cc7727120f899955ac066bf8d32b5ac573528f92aa463611af9a816abbafd7deba2dc178c42044ffbf73738c28c48fb4f0571e200727b4a0db2e9fe07e41802fa7582bd35bd99a2e9ff218506e2c94ab01f12097352a5d1a573cc552ea6ade041d83e27c474ab993b1b3408bfba160d06810197a8a7710e7ec238904399e916131129711082cbbfe4fd800cf28363613d0b33f8453d44b78bbc287de383673a8408078d9d477599cb050a7817088d170aab5b8816c0a61a56f27940e83520aa0d3bbc8512484256eb9453ed1d650d6a09f4811858ed6e8b477a4e6b39dde18ca2342b3aebf86aed979340498f2af002e6b4d85c17bbe0395f73e3c5e3e6d482bc07cad004203d9392a0b12c6aa5162244a94a2aace447c1f09fec81b0bd496700951f977068365c4cdcb3eb74c80fcab44aa30f45e0260a8fc3db9811bb23b0f1cbc040421a2ce28c3de4016356625e864b77efa761bac4846c6b7c74e2e97e9ff89a7f19a61d142ff0ea4a86f4f6814ffaeca33ebc9ffbce30a5878d006291d730c4ba079a33c5b968bc7b718eac9087996098e75c184b5018cac845bdf01b58c8b7c1a3ab00ab42ccd4022fad902f73047cd94d7c3ff27d93b791f444a958bfeb9a54e320acec100b1ea1b767ff8b859b9aac33e741c0b6af14b4f9f98ecde5ee8a55078431c7cea61ab7ade8c355306abac2b514d235918819946c1ac625123f6a2ba5b4f04a7d0621d25d953fde645c623653f43a04dd89de1dc84a200da3ae6c6b7238404a32c2c0e4cfbaf9718eeac4596fdb611f345d43b619446232f19f472de71e2ff220956c83a536e752161c18a80d2807cac0c6c23b8b82903f852d2f81a148bce8d3f69f86bbc2fef3a057db7342a6be647cae5d63b5b2fbeb8e1f0f05aead63c9d612b79b44acd4a1fe22aaae338fe1c219a7fa32cce0be0d1081da215555b11f4875483cbd0fb9f2186ec7b1323970a5824c63ca7b406e28f597f1c4e85dbcc3b6c5e024971f87c7e117723583f9bd86004941aa21a53bb3f13a75a01673f247970f0e14b924b318b291a20a762c147cb567a04191ff30c09146e1bc89ec7e46e40ea3c6ad63bd0ee1adc2f8efc91b7cdf06d0537dfefb86a515a7a676b1c3af107ebd9697084a504cb0d98343f596e23ad739de530f92a716e544c85f2aa01e226d4e15f359451d7baf5e5197950d242766c610bc0010a94e4ca5620ccc3d4df386392352064c68182b71b6984733a7402a8b2e15b2d488f416928201a141165e4c20419f52d26fb5ab386bb6413ed47bb3fc1f61c5623a5edc139ac1cdc0686ef2195cc2522413a4420700d81fd1486c5c97810b0279b761de14dc35742c11a5d29693665a7350dc98d00d7c3cc325a3d10ea385f4288359e541db4f08553c87f65d37c355d8ce38c9c806f7c8903cdba6ec426e2ad26084908290df2002b574605c10018a9d31f47912133d1b333d323cfd0af3f06c0bc60ddf39b20feadca4f7e4dfa32d2208e92b79b5d2fdcb1f2de7259159eb0f8cd758249fed36181e1b40797b0a2087b3c46c44550cc521c8b82534740be884d229e88ff9540df848556fce11c731d4651ce85f1036f5bba3fb17bbc396d00727e5cd2675e51dba6044d3db02ba554ceac99fd63139de61ffe501b9eb6501a0649eb49e3c83d73bc6bf2a8e712e6bb47804e69714f93bdcf4bb2727f1d15eea9968b58c977d37ee25a89eef96a34ada4304a72ab14fd40b117e42829083957b151c69c2e240ab90fce6958afd595c0cfbb15fd79db993b38fcc1c304b475adf1322866fda3283f3e47a2f589270478a4fea0d881b36106318735738eebc26f10a7aaff0dfa6d51ee25db3149cbf09216801ebba21de80c530240ae1d1d0f9a9adc8113ad50b06e181aa1cf699f0e4cdd035f5c5cb309d48b48893f1c15cbc20be701cc8e93d6edc16e4d21a160f64870d48859b5b000f5ea9363f692a00ceb677757579a6f825b0367fa005ee9b742056f46028954d56209d2b7a80e95c3c842f122135e502ecc75e54beef5ba524f19f8bfdcaaa70b7a431c60fac0ea183c3baa6464982cb8b988750a4f950f456efb367842826c3ba8677548a9457af2739307119d2fdd011f145c786673ae8a1f315dc7ee21f87d71118a9312d07ddc40813383293566e27d524ad5dd8d8e5bd36e9bd002644f9e0a1dc235e5bcad06090fd491cfa43477f0c5f27561b8d08fab49725866cea4268ee969fb5634eaae762c9e30012307ebe625153f32c908b827924822e5de8bbc0c0fd66e07afc4003baa74b724690197c4f4f378d8ae1674f33a873abcaf2a97829b7ef86f8b1ac43649d330865c9271db4c6c6f6adef84aeea3313475714ad021a80961c78bcd5ef047b85cdfb761e7937ee11862bcb1e053bb6a24fe0cae27078054e2877b523f895a10b599ea058b7926465cbbe53f5722283b308bb31b0d4fc22334e42d23a869c43533810c89b5f8a6962d44a1ecc7b3ca5cc5f93949dcf78c1919a9e70b2715cfb7b81891a4d359f118b47afb9e454dd432b4cf7d0e289eea195153fc1730b9b5ef89615b997f33289126fe9e6612dbd1d5431c70506f32398856df30e0b2fb39b4eaca965b2db8790416890ffc675074edf2adfe108d1cdc3b3fca34836ceddd840fb5c5d68abf02c6bbd906ace8569ffe0934c810966f9d7a8df876cd3531987822f9930d4006a9664d3651dc8fa0656cbf2181df23a73cb8ac07160bd6fb1b5ebb5e3200be69e6f945bdebb1304d6100812623cfc9a5f63b7fd77ade4c0daa699bd19449022387b5ddbe7fba8108b0df02454826648dd21cc60ac576f74bedb31b4133e2750f044b03070551ff2aefed6a4932b40fa0dc54b6129a8a5efaaac2de3f4224012d9e9001e2370f5061ddd48df5d35bc7e5a23d23065f566ab08c76d78ecfbbcb2c7a4aec5e9c64d04c5b65b9b7b5bc7d7ed25899006fd1e35fc09009b373db7c1add3309af695af4043885d4d619a7f2d705a01c30f756ffeb98a20c8adc23ddbe6548c0265e37e8ab7139e4ff7089b69e7f4763ce259db57fe1f7b7be3ec02d2062ca724c562b4a9a93646e95e84ce3470d0765fdf6ec8797be64aaf7a10708221295434a54404fdf6ff9ddb30cf69d4137b01d8d1925c684f88f3529bfe2cd81f54080095186941ae653e74394664373b9168b331714fed135fd27f4a4011e416c74e437acf70461140fd11b46305de4b84070d53205c154d73d97061298338c3955571a419aeac8a8387d8b0f8e00c499ce1c27264cd3bd5916764f5812a0054804807b8e463296df32d73d9c45feb243db301c0221b9052c7ebe3dbefb5bf1b69dd444448c80e2c0d8f0c050d351a05f37011778110c22215f67bef3dd8f71333f7909454b8788316424a2ebec3576fda2dffaa9b817423d12b0f33fa7a6196de49e5fccb7a08c0c74b55512aea51f024ae182fd31e02c8fd4ace3b4f6f755f2b7a379c00fad74d7102e857d52d5ccd54f2f46ea4fca21348241289448a558cf155355bb4a452a9140c8a5061733fc4855993033980a6b023879a542a55851532f7b5138c41d2c8a8c209ba6099c8940d3e5c7852934aa5aca8c172df2387984aa55231c822b369431127a9546a05459650731fabc21fe0a0934aa56cb08329d49a27b953a954aa065ab8a62085224e52a9140b58be6051a10665d049a5522e1003cdfd4a068d934aa56c7031d1729f66d136a9540a0675c8dd9f4b80508724a954ea063be00328f725145e4d2a957a412a95031570f1924aa55cf0540a06d00a3c30c353a9140d8b0ebaaa20e9ce6ff1d5122db2c87dac7750d5a4524726ee49ca126330b02e6f31bf2988a10f19d62c213796840c5246c52456c4505d570e47fd24a9f175cb770f20e36cf018431786c82fc608f10e13d823f34020cac19c1c20409c171108746dfa733f1a4984392de71cae2accb9cc870359c58839267dd7a7172386b71705cc421c4e6e13549ceb9112c8fdbc421afb79541293c45be5ecaf29a443fe1c36813a5109f686f3736804d23479af87513617f9f3be79bf1e657cb2e3c4ba9cf0f38764a7fa8434f6bd52ecdd8fe73b3a7a3e07d227cf3f9fcf3d0fc9839ebb1c0b4804629edf3097c9e8e4cde96c90e66e6d53a333ef8ac43252c00931c4d9f976ae9c0bcc9ea70df5bd0bb3b044fa2d519d4b75ce391723847ca8cf89752258ca79b3f239b110ab4eed4272c9f1a50885ea5c581ae608118bcb2d44d568d3ab30c5304f9ac1c61f65389029736c9652ca476047eba1d65802eb6c3829ba54925ac03a7948e710d4faec43d54f4c4959458e324736d4faec7bbfe788f4fb40d3db0434c1f7094897e0a77338e08f36c1376185ed6fa492bb0b49ca99c9f47b0fd68055652d09556a132c391b32b0fd0d93a7f817637c2f937f59bcbcb442cca54f7d52bf9888a277a9ecee044459b874bd98889f0bde0d781be38bf1c5d8dd8f994cc75286d5d20b4b524017bc1893bb81850c91d829391bf09008962663524559cac13e52e97a533b4fff639e569f24eb135b0751f413bb1ff5b3e20a9ae075a16853ff9d12f262cdac334f8b544d27c6aa2ed5c4863ba872c5a34fdf1d8e99633ccef879973541c5ca63bce6bc15d181a45ce540481f7d473b881201117ec4f8e82258c12bf62a32065eb178458417a0f294ff50c129ff31fae5e5f382c9cb91721403611f0da4f154241210688af7e4647b071bfa8e1e5df47828208af40851ec37983f248bb7071261e76cd4e80a3a682a750974b7e738e478149753cadb372cbfde2c395c294eaec831e5ef0ad2e343a9344dce7bf73169537cca7d4d9ce4689dd82b8a1997e9e753ee522ed6a6d7a6272acd0af497f3f877d444f68322fae8c63641cd7eb6a7647b369bc5aca84befee51a04f7144a2795cc43f58d24707128146a53c94cab9e852bcca7d386d8a377eb0b14befc68a46a5d08c1e512efaa84546ba14e3cb41b9db4392a36cb2e3c5a34394d8e5f724fdd6b8c2d05557d53e58d123cae39fce23f5a71f450ffacd76299ea54bf1d8b3a35cf4cdca8d59a03b88d26e15454fa74bf1e590c16ed6551245cc9f1ccfdd30272880679c903eb9962b7d975decba2e2fd6998c7536a275365ee7cc642a29ad977272bb1cda330f56deca81b72a195fec183df2d58d995ed75b949fd2d2c808448db9abca5af8e00b8cb3305b7431c360dd7b3c6abff65dc0021ac26c26c21863742c1ed75dc42f221d6293f8456c129d442796655531beac077c842fc94b42071818887210c2d24ba9ffeee4bdf7056631a50f49cfc708238c30c20850d42e2c6336539fbdba1c9fe8123c05ba042fe4ae4b56555555e6f9580d14ca960069d1be7fb62322185b7492e5296c29b35bc52e2c169dc4f8c5cb4da49beb9d8bd572a858eb2b8743084cfc227ef16e48479a151119d62fde8d17bf70e2b487656149db79b797b779d1e3dda2c532b5de1f29f136e4ba5e391ca05fd6c2db93f5319b91f7bc769344a2cb32aa5837a5df01b5ba24bfd34f3d855d6b7b2ed6255885c166b86daaca663a4291d8b1634ea89794899aab7cf57cac060a8950309a21a05fbdc7a7459652463a08ea0b0b95ca18efa169ded93cbd60e5dd0fa00484f1883cad47239cebeb3a5841537c75611caafa7c09a22a2c6ad33c9ed3621cc884ba81973de09e5d911dae9c8d5c3b63a2f316825cc9d48875d6a3ca554228a584b2e173504218adcd9edc78bb4026d2ef354d7e773996c06e36df5784c660ab724b01ef9a0610d5b94c1f169c94524afb9fbc04667a58b1648735d62fba483d5897e4adb32c4d255b525213d8f8470351454878392fb34b49830a5d56d655ef5a07e8d8330c6483c9f2a54a1a2ea294a5744d308b943f8012770927afa64b12c279a7e425e9927c496a962481ae9d8b9c44aca65da8f3ce65fb192cbd3bbd9b19e85fae5254064b65bdac5864557f4b6a8ca119b132d5d54f7ca87a57b112d0141fb185e56025cb8659f0eaebaac0852ee4ebaa24615944e8d78651ca381bb38b9b2ee80e16baa8c98d8774967136e26b655d15eb2bf243beb287338c8b1c3dcee33980b3115f2126af145d8a87778a977a54b429de9281b052bc54e3ed559163fc134a44ab5673471c82ed6cfd7afc8da4ed8744b0f09bcbce467cfceb8c3757861c1d1872dc9c1672fc66edb0b01986857f07106139beb31d7190538978b923caae54b0a9c9f3d52db15628b1da4d9ed76e204afbbc860351f6f35a0e44c54f21f2bcd64473a2ddc1e1c02ebf693eb0dbcdc9f337e7eadc350841e37094f274f4b91d6c2ab197920a834aac0f2c3dbde5beb1dc0c91596eb6142579dedd20728a9294544cd96d9493ca330aa39c3c4f04113bd5ddcc1a206f3fb306c46b98087b6ba4a4404b609fc5a991b13824b09badc1d9ac4d626b200a89c3917dde06c1e1c06e6bac8dc98a36cd2bf2cc3c1fab814222a8c4c203207b3e560385442832522546fad403c8288bd3a6f99c3cad6f35aec8d35674ca083ba7bcefcbddd7402111ca2845009a65812c2b645922cb42b1ac9165a55816c9b28878522305519d04113b44ecd43052a3265ec1461fd8218a1051e370b8c06f4234d9c0cbf5f1baf56cc65e617360459f2c237dba2c187690e72189e57ad79415d996575ba999ba261579be6791a982c9822b499ec7c9f3edb9f50d54ce46db32b8989494c5b15df4c9f3799be3707c524a70863c5faae1f9e75dbaf589a989a981164602c7f38fe5f9a4a4524af0b2e5eacd191ef23c96873c2fbccdd4ab5e43cf8926cf9f6870dc381c34f2fcc9c8e98a53cd05618510833083d003e107420ba106a156230031353135998827b508bd88d8b935525d9a313595a6ec46c40e113b2fa64900dfcfdb4b923c5f4528a314924a8c950dbc3062821053d327f8f9182c6290381c55cc10a012fb9cccd71a33703116e7dd9870ab51835c8326cf1a56e4f98a725da3eb4ab92ed275a95c578ceb5a61f101113b10f53e5fa38a3e5979fe2589c361caf3355235a8c873ab5124cfd71910b64078082f8418421a10ba4018047cc5b218067b9823fa1b8cdc99ef5b048e7d41e270c0cfbfec381cd6e78f108f90372276f27c7f94381bf3d20b76274f29ba34ad97caf316e79120cfcf670230e42991e4f99d26ee90a7fb95c9582f5b47eca17036e68413c2e99ce4f9251c8eeaee13010e3b9b1a0084519dcbf6fc622c2a5827355a5222bffa66e576b4931a39be94490e879d537661fb3be093b1317ede21b2659197837888504a7a19296dd9a4dcb8d4257937b7244a89034d509dcbe6a2b5736600066fd5a9f5ee392d9735de94c87d186b42082184eff3d1b710983c4bf074d2178f509d4b9c119246958e94d8bd1b12ab2a0c13bfd95730153e529dde075c20ce06049e09bec2524818c78657c40b25b274384d4028e21005147dca34012f1050bc7a979aa830c4a1b99440a8840b2595cb642a1c67c3bae912b4b8d8dc0dce8b29526ba5b1bebe478bd058034df0d62bdc49704ddf527737bd96bb7137b04b4ae0e0e0c80136a99c8d4de662880c9bcc26a61ca70d0a9e3a3a38d98bebf5badbc3717d6531de19b9428c62d6b57265b3246f01772a24b1ca2256496285a4c2e2a257655df3a29e7ebc9f6c31502b993a4b688d75e916d44607a2e8122e9a641831551286554249d70caf84159a16b1b151a2243e2f9a64a8648b880449d39af762bfd8fd30c5a20463bfd8340baa45cd755d530c4d776011d87407a2da499be077526dbdba175b8553a3937492d8969225ba04ff5ec4a174a0748861592b96c56259322c6b8665b558d62deb5a16be7136de92f9bc786e473f9be9c4493ffca44b905231c1e8d2dcc1916cb017de1e17d05a1209c608213412af8858442be04ec490090e0ec48931468aab9a67d35746ee22c3575dbca6dfb6ead697e813ac6a8a74e98a4ed234eed4c4587d1b65e73e1f2a2289454a998b6eecde0d5a139140d474f2b688c47242c1b81b963777f39ecb690ce528982a8126f86fb6c88bb1b07b3724ae6abaf4036703fedd0a08af5a4286b77055840cb3ca08dd813bb97128187ddade29181d99044929f02e2ef10e6f2f32f0560ae22d783b8637123e096ff6a31c1aff0cbc5518bb36cd1002db18c43b62d7261907c54fcaab9bf2da0d618c52ce4969555991cdbc3c229247aef2a4dc41d309a040024dd17ac115bf884e34fa2ccc843112331e2f8f0eb3199947d7ef23032ee04ca67899cdc03c9ab9802bc5370f5c297e8e5ee9e889ae7136e2abacaa5cdd2abb2296529aab4bf39b73e6aea4941946cc8a31e67841087375619613abdd9dabdb79663c46d8685e745fae3eade852fc28a5e2d14680f44934c4e556652937d2697c2b65393fc48d6d9aa771e7f19d13ab6eca81f4c9b2b208c74f9a3ea53ca2845642219550e8f57dde96f74df438c8e2608cbe69796cb9a7e5282d6769f94acb63b45c25e51981c92d3c486fc929d7aecbd9953d7dc372635c95bbbde4ad6f424db369796b9a4deb53cbafc7964712de84c0c416d897b1b7603a79c69f5dc15e55cfaa47e532ce82720bc23b95807fa9f4f2127a0ade94c85bca85c0e4d06190d05d863d44a15028147a4086df1e9053422117fcc3890cefa029140a8970ca4340320c85429b12197e5322a7e8a060979fa243c88137e79c73f4d047b7c7ed4c84d50cf4404b0e7dd3728feeca0282b8cb7f04811d34b9e01f58cc78c8e9acb311ba3c5e18a143518b8acafc0c95cf5051411102b385b01098ac825d973c9f286f619128380e81126f32705c9998948018273d06894422c5207d85b442c22a09d7afd4acaeacac1cbebb05da31e80faff4c03e8f65d92b0d7b95bdc25e55cf422118252a0acbe8152506e97864c9a81e1416bcfd5884b712047dde4d084c48c35e3dbba66dd9b5570d66323025f4ce6815763e843798ecf429d7681516f40d2683b49b92828364c74042607286abb77c076cdbf2cfdd94c82d8f99ccca0c180c6bc11ea530f473ce395b5e5b280b2c86d11574a630995e22b96920aa6fda14bbfba6696e685a482da216dcd2d2d2d2f2ce645afa660576eb1b2760dc7081d3450e131d2f9ad0a14f176fa2dcf2f78cd0d0ccc30c29d0a739e7ac0e13dd4745bd2b0f5d957b21b1108410ce29b0cc7ac42c9a532412fd25a987159fc665e833e531313c60738cd067c5338443585e086d9e13a08de8b6e0ede596cfbbb2f2fa56b2b222b3b272ebcca2bf2982436cf5dc90bce78654f07827fa749a6d0364b6cc4ca6e5533c27767a40e620f310bf548cb1aaaaecb9d59c94d2ecb994523ae7cc9e3babaa925266cf959665c518b3e7c6ebba2084d97361adb5bbb3e736a4b129c7523cf029a147a04b72c6096723be81f4490af1d15da35c8e72d7a820bed93c12e2c636c14bd726970b2906a272ad0c49342ebed2dd908f514357521ea2cb3b0abdbee5bad0bdf2e82c7723e5118e225e99fe7afc4b51d12751ad1505f665ebd44a21a1c9aa76eda128e312e52b2c9ff1fa20a1a73cf4f91abaf2f3421fa3a7fc6e4e64f95155b9d08ae829785b9949f9c45b2874979dc855f528ed39a194314609e1ec7ea43f9594932840bae8a1fb72e8be4c8a81452a787322a7bc30b2e81feb521e73e20490f8087891237cad2feb41fa147d86665e187924a55c11611e2f8c3cc21b786154d5a3b4e78452c6182584b35b8aaef25a8d54443776297497cd883e725d0a7dc443f4d145b87236421fbd30f20e18baf2a4bb894e2fb32558947899e5f250660a7839a4809772b7d04758336243f8d9250ec2f2110e825d0e91213c446616ecbad4225fad4bec9e4bbccdc07108cc1230f1ca5d960094af7c0479657e45de95d061cacae57ce810056f22c82bf7bcca12d079e53201f32128720ade3c1f02f3cab70865ac6019f7c8b8bc32f0360466e9398459822494a04b8a02bbe2e36594bf8cf289fff04a0f6be2edcaa1d035946b0f5db3ae690f1ddecd893ca78805aea8880e8424c2a3faa9fdf3141494bfcc87754dc35be828285be828af28776b98cdc0daa3cf9bf29e4fd901e1bcfde80609bd121da58aee32263a8b7090d0ad8987c81cc21ae8da2c3f7773c29359d75f66fdba8d83fbe6c2bb3dc3585596146f729458eb4cfa860abbb99c1b98ab4b240381a8a6a9a485a4f9482310687aa9ec0490198b0abbb5923e6df14dd3276985912b6ab0e81392ce6265de652d7e9ce63c108703939f535e988585a9199d019a1a8bd8aa7294be395b4a1863845076e7ade2f1a1452291f75a0542f0c2d27f3c1e293fa24b794f96cdb8d3c73e4de9daa64f998c9ccf642276f77aad125bd1c9d3e864fc0e18efd65c583708f61164193dee56bcb5c47930cb490bfb473a8cb96f436290ead8a56c27540eaf60a787f20e6f3d1cb5e2e92f2c9bb1773563823a19a9b58e5e116fcf92d29d56eeca9931e79cc3f4f26ed63dba6f22c82ecbe6226ff0433a88f5116427ab5f2a3718ad4b0f3dc4433abb5fba5b8f32c6a344b7eee4dd9c73ee98254fb319f7eb4f62f88ff67741ef1bbae7d6c718b147eb980f792b46bc529d1e5ecd08158265eca0eba0c9a3ddd8a60c6f42b0ed6931431fc4c2d861c60496298dc7ae2b65aeb60fc45c7d1b12618565ebd5ebc322bc849574f24f0bf9eae5e869d115aedaaf15c3bb61437275ebd66a55ab5ad5aa56b5aa55ad0a2dcbaad6557d475fd7b2b04c31bcdbdb025e12a91e8c82bcbc1168b211d961a10839f6f38ac963d7755dd775e1f73c593683f2f8f89a3ceb346ee817caf19d7f02a25eeeff192c3148a3f76d91b1a292f25a2b4a29ad6e90ea4494563007a95e9910fd8b17432f1f8d8bf0d6b99e06de3a8f1ee9c5782cefbdf770ad5e2b1f784554b95cbb831e7b07b3d23fa68312d0e3fafb7b933ecd881dd2f9d55bdf50322c6302cbd7e53ce826bcbd94f0561a4208bc9182b8cbbbf5f950cd66e48354bcbd8c092ccbbf9ceb7d1d74fd733db3d73d17d6e4fbb42c5953c92cba2ecf2c7aef3dbc452253c8cb92f149deac0fe920281f417e31eb0133bd2cbc59dbdbd1316362eb8c72fc2d3ac9d6bc45a5b46e6083bca35c5e3752044d8d2232c5b2f304a471945f37be8c099477bdca6650fe1d90c60d1d5fd151aecba0bbbd5c7b3d4700706393272edeaae3adb233f06659f0467ae9e52587fe526baddacb5f3e55adb5d6aa799e7d83c919de84c06409a8f7687825bba806bee49450725e8de7d74557336285c0640bfa75eca19bcdd80701e1cdfee5685da446a75c76726bd734cfaf5bbc718048f6fc836187990c5665ce66ceb60fe4ba15e1725d04210e528f0981c9990fac1e663d64aef7dc98b3fbae03e0f56145bc864b4c25e15e7e1735aa7a6c62659728df07806b2dacea52bfb6cfc9cbe952df7e6161c3525fc9d673d228fb3679771913558adcaf3ae912910ce15dec520cea169de48ff6aa618f8672d04f205ac1f6a0ff10e1107cec68e52b94d5cc642e4dd3362ddbc3d3aa9af1bc6cb3aa55396a34476de6a8c91cb598a30673d43a474dd3ac476a1eec9c8dbefbbcd8334f6ecc7d07ac9787ccf4d7b54eb10dddb869790491c8a72513abc6be6f6532f4ef8270ce3927adeecb4ea0b26dc246e7c546cad8032275dee3e76d024897e25f11f5bd26ba1437c7c407cc0e1f117d47cbfba34b6d82c12f5d9a51b09bcd714e29a594eef3c239e1dda39c16422b71135d02d246c41f5d8a8766880ea7be891f40e6adf784389c5c1f85cc42c460240fe95c1dfe889722601c8eebee9bb359e2aabc1b4cc6ecb71af9bd80e4f484421e2941337bf6d65ef9ec3be014026359cf7af26e32894cf2879d8fd481a814dc0434553b7db268fee04e960c9c4563c9c09d408f6f02a240b13fadd90b3f8548eb9257e6e345610a51e8cf47eabc8d9407174f95932efd3deb6ed140540aae76ac22551edcc96201ca957070a678d1957670a668d14053913e491d8b05ee24dbe04af131cb36380907779a833b5d7b4dfb6857668b26da1b9bc40bb3d479f9ddce52e73dde97251c1cca0e363b691d2f877304d8509c3ba24eead1ee6846b9220dbbda449fb4c7ffe893b58f289a116baf1df47a598fc5ae4bae4b10c7e1d01e4f6760ad86b7f979ec9f0b3f3709468e7b100293641977ab5c5fcdc732cfc76ad912208c6608a8ee88e849885e4517489be2cba25b449be211d15f204a84a54ed4115dcb8a3635b66890c478a923bd6854116d8a7ff8c507990c7dbf179be85377fed1a7a62738a365d777d56b18e5dcaa0c1f96b77236c860e1dbaac129d0c9f2efa2ef3d9aebdffde45a61b406f6248924c3cbcb2410152f2f6d7c6037529604c8f22496bbf409bbfc8be3e2069ae4b723b29417ad97b5d65a6badb5d65a6bed8f689374f9e04de2640fde8ab0128674591e07bb6159de353c3d7de9a54f3532fd948f7db2320458d5a427d140ea605d4d01eb52531ad88780240ee45e50a2c7eaf3ed524094f688b7aa12591b229140bf2d952abc9566aef0ba2456bdc2acc3813d5ed7758d30cb53f1b5b200fbcf7f58fcc10e9a7e388867152cc51b3cc4264c52dbc2f956e523f226896f458d82f615512a05a6ee9dce5bbd2c266fe52173cb45af214c882bcfb82e7faecbb45b39922bbdffb2b8d2c39ce9cd9d5933779c70f95cfb10593eb2e348dc224f0289e740023b672af22476e0e74cf49a0672d4dca39e0a89eb92c8715d12eec927b97036b8e06e78414ec1c92a381b7289bcd96991ac229345e4b57275254ad6a342c9642ab50407a4c3d4bfaed471366e6cf2c4e2c5c835b81b7dd90620e4fee8c9288b3b3b9936d149c98ec49c1c30b2e8c489bc3304555e198fe4c051253b1295b84049ec228b38382a198452381724608eeb92f82c72a5da84c58bb174dc8d22198bdc67c9646abd57cd850512019872fc75a8b9034dfd1c2824be913c8f47e2eab839ae83a6500aba2579ce6f570d16b0d65c78b3210c9a3bee33775a727b2efccd898ee2e58a2199d1a6643275942d4104fb28f3f1494115d690312c6a91636431268991c9ccc7889875659e0af4d166d890e9d7858615220f71966c66665c9fd8489b117e927b081a2e3575edd0a8a96b47e5a62be70283c695738191fbeeda54f2b2b9efbbbe47c90f92e56bb9787bf9f72dbf788b79c6755d49ba40724521f4015da92b75a5ae2b344fa6f3e4a3a3f3a4b2301b263636d266490d44492eac2d5e8c9c82bbd1974caceca20ace466f3173c43fb0f022267925f3514515ec488ed72b6de48deca24b3aae6492e32e39b0e4a23d50650ccb25190f99a50d16b6ca58e9e7461eebd951399dc321447639bec5d0f10d9491f87665f746e2eab839ae731360e2bedaee6117c44e9e7ff9fccfaa8ccec2f219f81f1a6f11e242981ec45d8678e973d03fa7571bfdf3f9104ee44d5f2e915cd883feb9f6a1bb4191432ef3a18556661c84b71526ee3fa053bcadccc03d2e765dfa80ee3214993ef41d3074b7d06368af95ce38fd30611ffae77eabf2ca0cdcc3e290f6b99fff6ea18b4cb7a67fae9df44a3105bcfcb1a6ef68d0dd40b758336241784824dd654c98fec1414cb738c810ff9cde0d8487c46cc2ae4b425c1be2a2975c46ff0c21048dabfc83b7205c5c288d04d078cb69b4d096cf6d015d0bb5fc430fba46a3e52a2dffd08342785369197d4e3fb805e3abe07f2ec6dbcb1f6dc6b58ff66755ae7dae72ed323eda47c63f3ef85ffe296ef9c32b3d46146f579ef12033cef2d159669c65741696cfa07783e26ad206865a4eef36246696c738e8ffcb7c8cce7216bccdf8ef36e37ffddd3a835e2113f0d7ded31bba76379bb587f00e08dab4affcde20338e627f8a6d975aacc541667cf496bb697848cc3330cb45df01655c9b3f2eaf881ee36e5064d187c86454484ef21098479f91f540c9a3d77b3399948fac255d6a944bef0dca3ff4964d0fece8a39cce28b719e512c9570e445d357d12bd6f2dd1b0b411d9b4a965443b9a0686338c593516923e39b9840776bb6aae2cfab455a97c6151a5687c2e8dcc89233a8ee9d0712f266dea0791c95c978ef6cfe7589f42ffe0edd2a9d1b0b411827d93364f808e69ff80348c7d07a4d9e73bfaa2d6d98f8587441f4884114618997ea54776fa0c0ff140cc187631df0c0a2257cd85c5854408ccea5c39d20647fe42d2a5ecf2ec42e630e993c41716f2aaa13bb07d6953df18f63ed581a5b5d65ff7d299227bee1aa5e31ebc5dc75e319a034bb30a4b9b29b26fd2468a1d1bf395733545e938f6f79275dc0b499fdca5546437d925f3513ddee792bd22d2069ec0a12e34b82b0551570eac4a1b10ebbab852fdbc9ab3515f87c084c8e2bcb48128d0850677e540947326eb8d737d85375b2390af534c1fa7c8d7e9258d5da23f9203cb25990cc4d2e65981a5cda3194225c68a8b1e49e5140200d8cdf622631b4e968e4bc9ae26c95d91644785dcdf6aadb15c8c65f36e7425220244644072ae1a598f3b6f74d5c55c69fe5deb4af3f507b506a244ce64233b6f964dee3b011b598f9b6315801f01c89ab87123938934c75ca7c8d669a9e2673db991c9c8256e644ad497974ce66232e7006a0e131debb151396ee14d08a69323bfc86192e3562adad4f808982ef561ae1c263ad5fa7c0e80bd64ce46e65a035173a74d5d65016432b3ce7ba5b0465d35d0d4f517295f45ee95bac2c65371d540544dd5542d028310c279026432f1f36635e55253bf1793eb5e3a574e8dd24be6c3fa95baa8b88a440bc76a4959de663e0020062188a1882e910490bdbcc401b00c20233524808800993d92e331477c8e22b21ed67cd2a55497fa46643213cf1d1c58acb7b993fb4664d58d7597559d300fbd34653211c74a44353f569ba01912a1cc51ca244d9518fd0820618d4462faa5410f2400884108632041f8de1f8410c2d71f0384f4433ac33b08894c4107f807f37cb47aee5b74e2308510dad21d1c89ee202ac60acb3dd5b195eba029c675d0a4721d349152ae10980a4514c21b097ff076bc9530bc0981b9b010984cadcf430bc62fe217ce8606a1aef478ff34146c55519ab78ace9cb76a4a192384339b819db3190b857ef95dbd05186a3dd84ba6b32dcbb22cebf39489d0ca02528e7208a4a0641f5d743b132b285280cb447890b3cb47110f297a9d0ef693d243a426678799e8220b6f446872f61d9de1ad3e7449ce061cdd631f9a7db409b278b3782391fe7ae10a6f2f2896aa6468036a5a537bc067f75959807cfc0f89a37baedb86e182ee56010c088b2cc800e64dd0371767effe9040140a165555c85a108984e48936f52b054a3f8954dd3514ce8b87849232a5503c2cfa448136f5df43f290f4857a595cf82181025696e4a4620a3cd128fbfe8bbd0fbfebc2ef7d7b48a28814c98679ba5ac2b6c50acee7aaf7ca5595aba4a8de4adeab1c2b28ff2a37a4f3c3b37a05512048b15bb755d383ae8399d28b3caff49f576f8bfc095dd726fbf1e08ade7ad0d52ebc9a119be1ebf3f018be5ef1f6b4e86c662312e4c2db3b147258e120eff4ef144788459f9e4bea065ee6c0cb92c75559d9e1c4bb778f97c505386892994ca5d9ac2c8c5a3cacf3b8269e71ae54650b98a115b36ac6000cbbaeac9fab3c349bc130e33167ecc416cbb06cc6c2b7664d50718213540f86653c6c6c32d4bab4abbe5a6bad9f8fc5ac8a5d990c5d0096cdd09c6532a08c0199e7793c1e8fc7da4ac3308ab1b391653274019f6c8666fa1ac26c2613ca18e020deb219ed699aa669ae2b0fbd96f1a899e20ac23e198f9aad89d98c477f8b15d55e86957bf3553ed44aa67aef7537c43018b31e9855e38a128e48b66ac3ec47673314461289019f7b2060ad65c5acbeca7eaef2d4efe87a481f7395afba2fbb4b67409f7b7e02edf673cfed0fcd92d98c3669d6e3bd99cd585a8932a5d9cca7c2aacb80cf3db7b21f1e98aabaee0cf6fa2beb8159d90c56653328346302c3ced9a8d98c28570cab6eb6bdbc3032965923d82c9b79b9f6cb1cbc3cd99f552f8cec3226b0972bde86581b78615c74257e06fe9d485e89f8238844aeae42b8735aa6b71caa3abdbb5e5d36f3c15d55d65ea7d9dd0b237b3c1e8fc7e3a9d80166400761d7a599d0414a64ed20bc39b1236b78b377f6c67feecb9e6f44a0c4f036bacecdebc25b6539d3bce8529a9221d45aaaa1760a6c55513aa7943142f8680aeccbcec1e3174696c1ab1333f5ab196cbceae711ec75de0874a9ff60ebaf22601a85bdbfe3007daa50d9ef8f0ba44d4d5477776953d7e8d366631751060bd3a67ecb6f45e4abbe2ffa59e1ed882e75115dea1d50278e41cae71e0aab581a8561282a76c9afc613b0aaac25919accc156704e12a98a4f588f22be95dc0ff3b0b2ebd2a49442c136d128123445d47166acbc83897542b2ea7d653ed127507ea24fda137db2198aead1925eca78ab2c6b5a16b5accab22ccbba2cab5a1666594ff4c9939fe853f6449fb0fc449f6a7ea24fd7137db2accab3d2e3caf47376cd1584ee280703c447c560ab7eb2c5586df1b38a96b311717c8ddfae2cad6021b6554825f6c5d3ea92b67892f049dc81700f7613517a4a5bca532cea524b8959bad4cfd9d844ef1ba574562cf49234b1c4972fe7517a51975844a41ccbd227791691cb9ba882a23ed1aaa2797b59667a22b9d22bad604b149728a5cf8fca1ae57440acaa83efb9e7a6670b92e5931326c92e5da278a547a478abc00a3d914cf18d2b2fc34cf14a0f22b90a7b25acc26e9226bfd7387165e5700f14aa9b27dd5ea794524a29a594524a299db0dad173ce7769bcf0114208e1eb6ef8e0ebceee611e9de1ecea09d5d58e57976445e79c73ce3aad0c0117b53cdd8f989ee05f5559104e6b7664e2f1b692d94cc44709dba64b704e182f91bb92dfa5c7a373639a4508a6b21c43479d48f37c106a9a5743692cfcf6ae9846244d5c71f965339d814c0147770922e5f33d1f609cbe9153008973ce39e79c73ce39e79ca1510a76730c70c2d95b98a51a8d12e2f32477ea9b203e43a1f998275e992792e74a8f39e38c31e5ce2c44e82e41cc091f0d445549382152e6839877e92d0081a8529be67ccc514e17a30c396cd6a844a4170b73c48ccbb5d6bb9c7d73382f2383c862a4fbaea8f5624fb9a2a7e460798af264c9b365d6c845e43927dea6c0a4d73a2f2985447a6c32fa1c1d1691536aa4b0e494142ca73c36ead5dcf5a97a4acae128e5708453ee4c497974323399997247dfd18d9d74639348070cabc7de9574b7174f274327a04c951833fb5665a49c7d2365194efe886842a2900a9da489824dadd2258cac1834c68c8132e70a2944f3f3a24f33748f8007d861b384125d82372a73e6b70687831efe3971389c2806e9a1948f48186584b79843a28b3219118bc8252123eb31435846f69b171959c907cc544445323299d0163aa239e70c85666886e656a22c1385ce94eb9feb737daecff5b93e76d2258c3ee7536668a2d090136a0c0c36c15a8f91cdb064eda64b50c6bc30bf2610a5023107519a4d8c5b1d81221c1c118e96f3041c52f6d0c022039bb765bc3935edcea1545e693610a5823d365b65d3258fcd53462817857e6b9ed24f1aa220cd7e3c19562f8d8b0c5f75c164c628e3a8670801bedf03e3759340242372827571ca8efdde79dd04fb1ac3304b2bb15b8d4c04110e878311439d85091663c97d18fbcd295f64509d105616b9520f07a61c0efaf89844a6f28b281a2646bc883176139e5b1e21bf6f577e46c85b4582fcbeb932e4d4a549e8504333b195a40457771188a25db4e99d098d1746e890df2918f9bd27f961216f52054d90a92210539c2558d8b15f74d173a5aec8f5131faf9b988ae6eecbf330baee1cfbe4a1d5ad55563476e9b93e58f77728822c7b529ac95425687abfed6edcca61ce3a1b9a33cdbfa9f2b004728f3ff7a0a71a419673baeba1dfd18f0895cfc5f32612523296c04a89d1ab820c4ff126c4ede42bd8f82dce545d82d5b7a7021a03fba2783e2ab8e3a35ad20318e458adf4e8c7bb9d4ecd07a50051f1ee303e3438977e6d81fab15c09ca10bcf8b49091e572f6f2313e41443af6fa0b534aa5cc8c92528a87f86809238c30e6e527c6b007a485b18a1d0ba37899c6c03ab7033b95833adffbcc1c4f44be0ed49e42a6421432fca34286af9f97610af02280529e73ce79e7a6200537059889c807a7605594d2bb2a487588a34663a9a354b68431c61823cc31c618adf82a9ec618a38c7408d5b96cd6e198772841229411368c314619238d305615c5dccbb59273c6b72c41c532a5af4c4061dd07e5afeb3226a0c8f2138abcb90f893608b14ff32852bda2ebc2b44f4ba4d920f39fd35b0f84b7aee8e3b9d8e9c4eeeb3171742e9b978feaa239df18aef4b80e7f61ac4b31cb8abe981f16ff69d90d21ecee6e9b542a3524bef7def6f29b0237063ff5ba2e7dfed900f4dc8365bbc56caba75a6cafb5efd96f61efdbd1ef73ad7a4377af887b2b78a1c3b74586af2bb85bfdbc1aafbdbcef596d0cfbb316c36e6740cf24b6619edb6bd7f38e812eba5a0e2ce8f6d877340fd02f7c0405c736c977917dd811948350506e6c53bd4fd6c42ba091b6e2e58aeb5f11fcaaf87c7b55e44dbedad76f1f5cb1ac78c32e3ae8f5a20b02c55cafe10dcb557b7d86b16f42b01cb39c09621f33868384f0f632e8987dbccc0f84837c8efd8383d8cb8c49cde2ed5591abe75aaf174ac9436600cb41de3bc3e4dff597c96077d9061efc7b2b7831ee55916da83d4878a14aa8aad02deca3a390ae625dbb655deb9f6b2d1289c5e5241697ebdaebdd86e4fa4a7d586b050144b2a5718048f6e00eb4640baf64d633eb1e6c0dc9dab5579bfde381969731a1ddb23c2b15238048bef0caf5209ed75f9ed77b3e9f5bb75bbdc3eec16edd1e5ed67561cd88d5b0100c5a3808760f0e42ba102c5bffdc4dc3967477158b64e16d645f2d48bbada05bdaada5d58f150a3d3e14b28f7db2d67abc3db5aca584aaaab4ea7a55ddedcafeae8a3722791b923f3140d8e3b97d8cef80f662ffdc4d0856a3a621808896dd7341ffdc7a7b372cdb434fbda7fef3ea39c876b69a122eaf680f62fff94a0ffbcf2dc6eec1f2852b673f0423b5e706a4feb87bb2ebe783da87b85fe56cf47dcf9321de2ee0a626ead27b93a0f6eb6701efe5ce207531c618fb551e1a28e3dd697e73c75c45ead2ab1c2f63aca049527a49b183a6e6820d131c1cd1fbd6352127201bcd3a9dcf8b27bbdb1ed8779c3e651dbb801828bb18638c3146189beae63dcbb38920cbc6db902c718c22426887faa494b2dbbd8644e2eb7a51d1f1354e9c8814c7ccb0eaa9aa9aaac6a54e01c8ce263b3738537f9381b252423c4b079a5c4c65f36e74a5e32a9deb04bd599bcaee7aafaa9efaea9561d8096c8a6a618952463eb02f8f2e1a757d462a373894b48233f56d2a9b1a9b9ed8452ab14cc6925610d1532ceb7129cc6e6a405895dd73dc97049a904013e8852a0af604bc4c70a55ce9418723ce177ae938ce4e4ee973e564f21ed1f19903c9913622a584d97ca45da453a938f39454c871ca5cdf2bbd5b3487c9e647f19ca73766683d8bce57d0c94e9326f3d64ecad279b7b38efb7220ce101c8cca2e2c1d26161b72df9abfae7a8f60d70348fccab141e23e1df7c853d22e5092a7a4105fb1d259a50805cb711d249852ed81b4a935d2060a8089869df5d02acdba34ce2c73dc4adaccfae7592fafcc55eab89a0672eca159b773acb21e52c77549483c772efa58298ac32123bb1c4f91ee7672dc8a459bfa7307eed85ad35a9048d6c2f8ebda23e32805730ec78cfcb21e51768e3b4e9c3469a2a393938383236faa0f60208e67d18a219143c76b4d4b76b7e23677e6934ce113acf52cbb4c46d224dd10834920121ba8042aa9ae5bb395f1e8d7afc6282f4853049a8ad418e99291192f29e707bbae952b12f725a1e3b6936e024d4d72a77aa74b3bb9a3b331a7c871c67add2a63d7a539fb60d67d73e6d8274fd623e6eaf5e36c7bac995d9f2acb735d5945e9c5eb438eeb9c002cec63b1a802bb5d39d78db9de233a2eef911cb873b49256d238d074d3bf72fa64dd7af54982b548b05b4de59aead376d56487c3e5f9a44d7d2d9339826d265d9a3b9d53411e6b51b0eb420dab58e6e4297d7df009f6ba9d2d9ac43e5a04502623adf50a9d60ad571427d6b273e7fd63333c0c653216a645b0ef5584d5cbf2c84f3931e770fca95847c1b1386b8e0b718ec01b780375604e4368d16ac9b668a4d5a26e8ace130439de95667ef20f3b1bb363b0c042870367f7eac5c4bb5f2f66de1dcb7197df9537b2617c02776026f33025827d87d3890ca4935259e593551616d20136915f9981bd40141544009d0a248e82276102e87e449fa2d8000c238c1cff6864f74a4462712941940eaa2dd1c48bb1647e47763cc7f5e8b854e44cef9d3e3febb4fe45892becca1b0b3b29e1b4b422714db02395c40e1ce35d7624a6d01053d10834d1a0c1c2434c5e9be38a9c69ce39a52bc92a2bde4290e7732599e775494d2ee912b5668c4772c41258cf617ef2a6b9e802870ec1a3e34a90b4e99210aceb520e99c9c8396594596d24642a4c91582c0896c27e2c9e3bec47ef384ae38ce4cee68bd1a218526550bdbbe874450bf39c2a548e3b67e39253960e4b76afd495937a2fc7954cda64d3a525d59537b5535709a49456965876ab3cb1d36ca673bcb4044fb5cf85aecefbb9570d44a5c0099d9038f06156ed22474e4cab2a93b95ecd28e48754198b9a9a984544d2af6ae70a21bc52a74b4c729c8d0ae755062eced0452565ee1c47a05de76ec4ce2f422bf321a9357f65338d6517e60bced76ca6737e8fd2b91206f23cbb636252cfc56485359bc7b2fb32c8d2793157cebba14391584c8f582775ae6472a5cd25d1e06ea801b3e4b31ba79c326a0b66a251a31852e52166cba940c189e0390a4a4910c1c582745c9f4cbb7757628926fa14c5065e18ee3f8040141544081d054f22c7a940c19340c215d988c8b30834b5c9c54c2c6a1ce2ba8c049a261225b9a715ea637597528dfa25fa94795e2fc4e1d05eeb87f4e9f3fa47e370845e67bcfe19e9937dfdd3c2e1b8afa6d7bf2dfaf4d7bf1c8743e5d5e595c6ebdf13876388d777aa4ff8f54d459f84787d2f71385a5edf5670a8a9034d7dc4b7e642ccb7eea2a65173676b24a5206a176914c551db08205c0cdda200df5e18b9521b986f8f0ea86f0f8c32b818cae4f4ed9d2157aa63c4b77753c4b787a30417439f10e0db6342ae9500be3d2cf24bfd83818ba9aeb8f1edc920d74bd1a82a0036ea31e062aa2d6a7c7376c8f53f1a55d940536f8e0900dec3c5544c36b7855c2b4cae7f6954a5034d31be0d91eb837031d5937aac5156fd7331d60d2acaa70e44cd01fc08bc559f1c83b74fdee664f262ac1cb81ca421f7690d8e9a51cd162fe67a327a01704dc1d8a0f0663365f262ae9d77c27daa6304b645e0272fe6028300f889cd00f04d2af592bae2c55c5b5c5be4fe8d2b725fa900d4d8a8d9e2c55c57d4d8c206a22c1d226c0060c3e4c5584f5298646b4527dbfce4c5584cde8d3e9327b96fa520caaa81377831d616ef46df5a9295ca28f80695086f952de1cd926c98e41ab12aefa8aab6a832a9444946b12c2d6412d1756591492448723f94eb61e6e3f9618945cd640d866532a1ea8272cb3db263c78e0b7187547916d9813bd523aed4af35a977a3a6aecc83b383a3510527b1e0b6e04afd1d577ac199c8e0cee0d4e0e0702410b9cf07674abd18d9440ed90404eba60b2d95df2b8c18914b725c24ae6b2336d945ce69934e4ae60a6b59c6436690c7e648ff5ea9b4e2461d26394b6eb8e8c2d9100319fc90fb1ecf277b6cc643664dd332ed735026931df4aa61f2627307d69aa7239974898b2eddc8251025713ab149a8148d35e54d2e999a11010008004314000028140c878462b1703c28aa8aac0f14000e93b452704e1888418cc31032ca1840400400000000000000060138d50e273debf883c241e499633a066dc70dccccb3f2240b1702a0f51cf21862644e535ee0f45ce1d3e848cd708c75aa82cdd1fb85bfb0fef2d19495625233e315ab40f5acbba50db520c6b0deb9d11ab5856c0b89d95586d378ff1bdb99a663d0b59da31d8f21480131faddc0ad5af5c0c0f4ed7b86aa34735048a0334a8f0986e7e8cb6fa79cd9870584f57e53d00d8d0254ca26310b488d80651524208d8e88b591dcc708f00722b78ce81476830e53a3dee5a5bc71e61f8f1f1f7cad33a8cb077b5b37f762511ec760d5d02877aad7a6820ec8948003ed336820d9e35309eff1096cf19ad5282f92a6a849dd2c8cb54ba8dfe31cd6cfb541beab0b143641b193e736308bb7c642e18eb7d6d0bf41d925d93148e7264da3f74eeb59c7a075a323bd2ed9734bb269624ca8a96a592614c7f584386e53d57df3257eb0c178d73e2b5601b43d3a68c265068932c8acc148fbad47eae4c81eedee89def3a30cfffd2cbe47f8689906ae863efe3a19d35606e13afa447a1974244ad45cb3b30b04e6925bba528f25eaa34706090ee3c28bff62eff24f1fbb92a0a4dfcea17b03f9b3d301c4598d5d148a36b7a4f2bf67066b567d4da69d0feb65d073a5ddc873b82403369932be44e1385b673e4e80d035367cbc9741fff71a9ba7bdda4f7b9979ad2750fe0b2435006cbae0b6bca68fc9244f8e7123e21d92171300e2df3aa63619038d4c0c1b58aed9775cec21a9a54b3d4cc0e3bf0b832d6ddb161196b8a8496769e10cf9dffd4147d5f7db6b0af98a389f08b1993e9020a8c73d9ce2e2d6e794d607add6278d0d23b08ee95de925305af78b9bc546b97bbab3193915afbe819b4486528a9f3256ecfcbf9a942b6edf78c0a442e197064ff345f8b01042e05fd993f74fce3fa814012cac0d4718909b9d88ce5cadbdd07511a906d31925409baffbe95f2208eb22b02d5f38222fe4249aa4a618db6ca7ca95d5556599e96c1bf92ce7e5a98602b99605df9756b2b39522bd20c1686e4b64f3820460ec84392a1de97db1cf98038c0595ae1e2d182e25bea5aaf2f3e160fe89081c5847d11dc39286d8df81555199b91b7fb2d9245bcc0f25633adf1b1cb3bfd3e3fcbcd76f176818d3294893267bbdbe7e714caf94ea75530a9ad786816c4a7ef0a1987031ecd6ffc1eb2b12ee8f4a2f29e8c5c5f563386a84ff80d0052000702c51d670095bae1a980e02162515d263120883555483c4c90374c361db9b2066c3ac85ce11678ee5309b146b5e5323b1039587598d0467f2faae4d727dd3524173558aba39aa83f363c47f5c9aaf8a945fd7c144209a6287fb24e3c82ca13a63920436d9112b3b9636e2754acd5cf503ace2398f3cde7adb38c0c4d221694e1b5f209c0e9de5b54587387e12c4b8448acc5e0e6c235fe1960dfd10809b2132739187c669650cd854536e21dd7b17bd13447fabbbe311851eebfaa90af490705099fea4fe792835f7d76ee2bd287d91fc353e4599370c82a6e42f599df76993d12b0eed800f430d06e1f70bfc1af464aa3fc852716b8851861775d18d40db747b48a4c8dec3676788a3132239e169eef60a5dbf48c28873240b456a0b8a8a6cfd58a185c2483fed74e9c714084fb922e0839397dd1357294b69b634b547e9354cba9d5ab185c93d6c19583698c65036db6bb6c26947767cdebd111afd1002afd3cb9c7da664070ca9069bec5bfa04d0769b5a1c57abd5e122a6069ad03109849e38742bdd23025cfdf72a6ac492238fe49ceaec05c87e3465a9dbe57e339494b7a6c93ac18c4ca5202d2fc936e336069c2eb19924d163a4bd41c203acdb714713c09305f389cbe37093bdbaf8852986b8416580ef24f4cb88a901aff3ebb816b942c4afc5437d5074fcfbfe1ca570c7494e9b9e1f6803d9d2ca7e28f96ccb48cb7d5094661e0c1d0274920d15865e432b8e64e1b086e4ae5e3064bf18d2c0bb2fe1c8b432bb0024dafb14cc5414de74830a9fefdc7762d77a255cb77a84ba8c10533587bb2dd5cea07111d4ddada416b638376e11d810f49072e81e79c3bd7f95e2fc03a88e2cc922ce2655ab5178a6d648ef0c7a69bd577206c89f5d056e06b82821d1127228d9edbdb051d1857e4da224ee7f614b906aa8bf49a0108b53ddc2fed4a2351419a92667fb9522dd5f8128f3c5c989af070951a8eb598a6233d30d83d5ff1c3985f6df4cad430865d1398d50f16c692721d3a512e9f946e2bf7add6bb162574f5c3a2d08f42f6b9b06307a52667eece4e2fb727173817178a7902470eeddf94619e20971dac549ece635ab3b963d44d9f23fc79ac4ed27ac4bec43c319b765f3eb7bc0c2e9d488a4c598388367b8a380bacb78cae1da70f5c4487bc875031472d296301a2e1739cdb5598113187f3c467a79741ab04a113cc2f86c6996318af42a776d6bcb5340726b8c9a2fdd0e71f3cf5ea4738ab874948dac19062734f922409d00f7c31461efc6695134425a3ef04d20921bb2a0ad06dfc47d0fc590fac921ca21e16241287049680570b5cd683cc25326b3d06628d20c29606adf14b27885bc982eae0d2422f9290974d30f69862c1a81591089eff178464f17d45ffb22ea5e5d961241dbbdd3479aa1f9d40ca723ba8a72e58bd3240b1c21852e84407d20234aaffe9bccf6e0fc7404c75416021cd44b1649a0c83fb88e3c052a26f8267ab3d4fc78182858fd44d0baa38c7372cdccecbd9ecce9b8001a981b5092d4d0f8373e12f1b03c5ad50f08e69f6d737fe44ac74560600df210d7238c01ccad891fbb693eff4906d7a8c3c22be2d9d76cb04eda19557e9dbdd92d4e159abb994f0e9b6624af9abfc0c956ffadcb7851a8adcf7de622836f1a52ca641d701a406fce6efd32db6cd1f87fdc961fabe152d9b893dcf1b0139b234c80ad332e738d50b924bf4d8e1c649d995a04207ab488b56dc182a43bb554864eaf2d52f06e44060320903e948f6a0cb05b57eb400812aaa7112220e59c60e05bc9292a6c09d90e53408917a9ac1b871c6fa10f91a89912cc814234b20e6c81b2824db49624bad3695b2380bf10005f53ae97a9bcbc9dc26e4dc15ce62c3802c2e9875b5378210604e112c2df9778e20f49c770892073ef53390307256d9ba79c9bf171335320ce131aa0becdd192ec8e29c8c898772a0c12faa763a8af6bbdbe734c520a4b41eb73128115be2df7793c1b5dd12062065bf168ccde14650de4af0a8e3455a235984c4e9f112ff6881451129535c0653dfc389531cb0a2ec1bad8a3a66689230a96243941e1cfe840c9e3df70b82fe53a6264c3ae622dc26b6d0ff0d40ad46f20cce70ce10073305aff8f1fbf497d301db97a1f2015acff4dc29476fd651d44a57e6ef65ca93c7f0f2e204bc3713cada245eea53a0100c5d8eea0eeff21ab13c8654820d56ec0d9be141e639e5a0abf7e1e2eda0bb8236eb5c22afbae084ee0d7551bcd79137e48995d02b6ead8682f5f78475968108987180945fdfe1af15c70e1e1a3fd6948886713085a2ce807cfe4cf04a1f55d1c92a8cc4755b709fe7d37521aa066fa337030ff04add2245ef9a38d431aa3d513763de5d628b277e6e7bd84afc10afcbc97ac6d2375e45511f61f71d8997efd5d08e89c18e54c4bb1b522eba1e4f8194d17fdb7fff509e5c13c90398eccbc7e124adc640a520ebb0261a01f8b40180e3e79d6113f6658349fd849313f6da061489f4c7cd3b1b23a55efa14a7c739f100aca7d6ed9bf674e37824cd4504755367d0c3fc351d0dc232a284ac293ec4833a085191ededac974a221ef2fc5ccbd11cb37e992cb4bae115452f41682268160200fb65e45479c1925da5c241ba69379f1702014a5cbdab17e1b0ab831e09a2485ff2c3ae9673babc89f676aff171fb06b9bc644f81e33dea8c30e461fa306b221038ed6de0fa1d63807783fdca4ae5d6bb6e6e7f5cd373710eb9943136458baf9a43a910fdb270fcc76ffd1fd22dd994d60d9a7ee297a40ad1f79dde05b9c297a476c326e740c993d8dc3a2ed823870e06d4298fa4ff2e5f411104317341f7518a0a9cc69482faecdd184f724fb53e65ef32c71ec4e101cb7c6b3c375c2904b8921271d39a2323297ddcbbbb2ff61e46cc6e59419f2a4f68f6f50c8498a9f8949bfad6b5ce4a40f02c36c805af40486dd9da3d8a2cfac3ed6229f7f1ef8b7bc9e5c5e2cbfbcd202cccbe6500fab6be7762c8d8b520b0c8911cc32ffac11b4e3d3a265236752b585f04f18b0ccd561d95b35ddf49c77bf22ef84c18b112136bd15bc5c2cbc83108803ca0ee96434362520915f2f922f1f4e087d67c7760b5150a386ddd7217ebb6ebca2a326c3fd76bda399c5591634743604309257ff815af3689b9bde4fcc68dc7f6bc0e02cd33670e6e2beaea5c8ba7315b988b83b892c53d26d6ca2bb8afc0bbf3b89ed2af22a3575f309a1b20bbf3b69fd10cef58238a6916889015633d4bbd32d91c5c83ab3042870c93c66f13a0b02da500294655ffadcf63b5cbd8afcb17a4dddcbaec681b5fbf59c942d6b8815c86bcec99c461eb4d8f019e4032503f65f58d0dbffb1fa9768b0d6da7f9f50a4760c15512453dab09efa87d229bb0581a8c22bd578efe852dea14005d1cdc5010c1a5b31848aaf021240ee2d2eeea094435362093ded4492128aca9dc88896bf3cf6a9b2b1eeb9feec0e8ac43f054af247fed758610ba357a71edc52f63ce6fde8189bfc1e71cd1ec0a21bd8e6217aa7b1e0d3c0b8805ae1dc24f93fa5083aa3775d9245a5838baa2fa9d48a7e6bea033c427702d6a7665dea01eebe5ff08279cff0f81da07268b1830d2bc10df085125f1ff5b898308b40d4e68af55e4dfffee7553cb099ef7d7b6cb540ce71418560e9c81331dc073fbfb5e4a86408a1c693b5becc54d7db4ec993b520ad90d99125aff0f0ed30fd34bf32b0c30728afe6e9f0c251923b791a58413f347183381cd5b2f87084ce92569027d96c680d21b19f26c4fbbea15f4a53fa2544ccd6445e990929a0e8a0ac5da6b65ab0a639a2d79a5ce3c4347f5dc02403facd06acd0339db1b903c89d84b3e7ca48972f28a2aaec1f0a6f136da70ea46d5b7aa3777a6cf7b614c1bebb5daa616ee5a48d22b0c21224102d0e08844e45d247999bb9955e33c2fc8aa35918be8d4d5816fa1eedfd562238cc3033bbef143ddce9f580af37feea591d335379229896f8851f075f0ce0b5d1b5d949319bf4e0e1ffb6f092d12638ece073ed415fa7a21c7a549408589a15a627ffb2ccd76bd6b4d0626138fb703771e96759d32c9818cd4768d01f1954065e0028b67d7f4170189f9dd52d1a145563f98c868c35d92091153ce36671841efc4771ebd95de470042c92fe6464912bf1793b7a9b262e7f58c1d925ace1520c2693449146cfcd0d12172be763ae7a7b5b9ad2fbdd22d9fc0a1a6eb1440297a55d97f340c9dc947e7cbc91422f68f332b93a7c60c719d6c9a26a3e7a40b2c1329e77d11a4024835a98aea1dfb240d2e3d8d5611bfb3d4ca02aa47d7885705e92db2dc8acfc49efb8f3268ab1f6a242e2c14676c2687fff871c983d02ca4cd16989a0de22df1f6aeb0460b78259868dea040862c7678476a9c8684a888ad36d6eae56a64589a165a94714067b52b226ff5013a2cf7291fb9db5e94293b73f529d86584c5f5800b3dcaf489869f793fb7f38aec596863fd0fc9a2629bb8130c82b04a5afd27939ebce98e37aef190c9de0bd418e748a6d3ab7ec150640ffbb8fb4728aae129e384a9b1ef61815c33740514f12964f47cba148b419fe86e2a0a30559c3d088f623115e8a5ae517542ceb217f006cc892fa5ada272fc9c3a992b5c095d4b5b8848da33bb04e28355a31c11b150be802a4dbc0818205ca5295aecba3dffb66898f4b801de1785591647e15e5b9e13d39020d721fd8a62339f2b52ca4af31485d656410f28c9f465dd88936c5753449fb264327e87e5324a003d0916008bce94493ee38fae4c2533507156e4c899556b4e2fb4dd4f0a3de450ee9436a16e9c78d6fd1e865b8c8a227b26a51bc65010a4dae1c71328fb9c839164000d8b5fd885bea5b3ef53bf9fad44c5eb17681c2f82ce2f2be5254dc36521a60500a08d8acc73f4739f6cfdad926b64fd6f67c02d5b061635ec60c921b0c12cf86c59f8f0086a6791f9885a0b0ff3ea943c4111dc2bf8706891e27dbdba24fd39f9d53ec5eef1bb0a7d524b28587bff68cb1191923e880ea75b7a54df8ea8e9c02298088008a18482c12c0a54bb25e800a8b0eca772cdf39aea4f5fe3a5c196f490e7613f22363517eecbb8d116cfd3842a7d83cb136d67d2a88c8c857dd8e8ab7592ddcbaf52b58e562259fc4955c1b6251b4605e126916c975cb7ff043b01c1d2a992c1d7ba9618ca9cfa38f558554c423488be28fbae395de74e3b42174a761c63c72a42d55a246113b4367b2f3e1d051351611c36b4df53cf9ecc8b73bd906acdc51bf1c91e42e6307396daa5a8cfb0ca10d3017c0b30da21aa211fb15bc87ef3d06624ebdc2a963dc22282281239ae82bd709f37e3c190a4574881ba54466e731cbb747a74fe33ab59d292cd8272480bf0a2e5948094aeee16c1f1b4f31f32cc5b9a98a050addf351bd548382ed2113c5fe44bcd862e6118d9d6a85b57af1cd7ae376695c0af274c82d8062e759b4c32c18e22cd6b671777fcbac8ea3f9df598ac00025555d3284bc80866f273709b66738ef3ef429c6994791e1b5994af2d643da718806e14c8ea2950f883dce766aec6addaf8c3b0ec7937be72cd425f61cd0a274c29f426dc98137b6815e914ec288c927e6d680a70447522840e10440db83e51e7c6c6b8fdc0fc86e97f65528877e9b27ba9b031842c55be285a01f561223cf2770102b52c99a1bc89cb7b6d51252361de271521272855dd7008698c6695283807a56269dcf6785ee923abde26e9a7a4a037402a8ebc337585cc84f7e55545967b6892017deae4913724ca18cc966fc376c196062d7853ef4e258f53e30e088c180178d79dfb429abb8ca8be38c13dfb1858134157d61c5a7874a7b0656a7ca02ace23a94cc4f9a8fd3fd23340e24da5d8523cb2b0f61bd774a99d743640333781e5af61c445c271960eb6984cb8aec4414d2beffe8d965867a852a0d3618c62f0e18180ab721bd1fe3b2539099743273a502d26883aeb1c948306bf85224b594f9b0b7cc9e8951ee7341e4e5e7c102c4c07174a011de9df5a1a21562832cb53cb32820c3ddb691fd4830c624b29a85322f267687889967372d632d82f5add045c5c2a36f53f4f087bd030910200ca099105f00a06b975de24be0dace7787cd57aa0e6bf4f4897e6b6bf4746b548ca9a02beae2999776a85d00b123529d100224e0bac23ea1222401b1d34fd419219dbed6ccda99d36153e4a3dda7ad1c844320486bc81c22cf4e3d88bfebdfd87549d89039511583aaf6183dc5db5ea2bf19145b0b89501b2b381d0442427786d41e42176b86f2ffdfbb197c0f7b1ae2024f1012af9967a45ab38df8d3851a9e66e51a4e61a1c1238164ca113362232e3eed30dad61be62bb22d71e6134ed4bd726905de91a09aacd62329e16749ef7a95e8c80c25ed2a44412591ea9c88602596930085a356a396dad0c87ec914d9a72a6ddda2b1496c56fe83d02e2c5eb3c737da9f56b6ab071a556cc81b8aea2171197ce681f14159a5f8b5461a0f584ae423624f7335cfcba819870f7ee0c81dfd72ae62bd32bb9d5c4157fbba9bbd763f2f717fd6c1b6a94c56ce712c4833ba3f4a8fa3bd88b7049dcbe9db1298a34c25cf5614aa47dcb4e4a848410fc56c8e6de95bb52cfc5b58a9ed8d84bc6f0ad3875c82af16084ef4e17d2104c90c8c1054b8da508e4afbe9ac9faa50a3c18c3f22d6ee0ccf555da940ae04501096a4edde6d718aa1896c0ed3e8afbd7780c01b6ee57aeb219a90ff0bf3a6911c052f2a8c2afd0f0871c340282e98db77fb298e9acaef389295386e847ef0baae76c69e702fd98e43c4271778bfecf2bf3d61d8be058f0c594eaf51e4d17169b864508355b7a805a1f207d7e9edd000e8d71b5c1a7edc6c462c01baef0fb4f9677e6867d3cb59a86d3f9311a4247f65b2bbfd84f15803163c7ebe98b243f75e62504800cff6ee1a285d0c0a008c7f622286ae614e4c0458cc4174077cedcc69d506165480937adc2fa949eef76de88d0cba905baedab76355c48acf01ac8f91744520f4e3c0f1ea7740a42a0bcda06116fb8cec5a7f5e2ac4f348759ab217147aa19a23579903daf96de0ee331a2053be4295a2c9d2e15aeb593f92beadf55b3a93e7b07ad71cdedd85309185950b973f1b35fc57570efe929032f9e9f36cc06bcd11b15e38ba8ecd73790faf6257616d39ec971692637eba91a83af1fd4c24a8bbfe083bdac7f1fed1681f3bb71e5c4d109d6d68aaf7ee431b8082c31b402760c148b8f471724ff7b67e7232c311d004c4123ed1140142447957d592e818a12585b25374a0e2021b0ad870e1655972c64ed0af5c0c8d5a2960fe24433bd497083baf999a3d87e8f6985ccfa8af2491fa1830e8c7d0d502ccca18692243455f2cab9886c8a7810e57ad36c6b3310eee7ee2f7c74ef657caa16389907c4cf46a23bba718a44731516ed7d38f236e97aaa82600e13a04c125895c8ccb82075be9bd457424efe46b2a9083885c4205a459a16fb2042f63201212f8252960794d7e21feade077514809fba043bfa6b6db4f0387186ae9cc91399a08609b69dc78e601b63d27006bb9b5e46d88b3df7258f05fe22203b2cdb153add5ef01a01339590128ab84df50ae39bd6af0d8922a576fba5c45ec2f9eafd9b9b85df023d9df3a0f190738df4abb04f25f0df2219d4204f75e4a44a2d2b0ade0e79f70840b72fc904c51235fc7952bf8225c9cb278192944346a2f13601b2eafd8250c4c319f85749dd9ba06a5a8234d6a48a941fbd8b342fcfdab3ce55e9a612ca8a07a09546a842d35a9a45368316582d1887238a162d801d36fca79cde1a64d945a2d840a351f68106ebec6c2c308e9a2f92447741062da4664a15a03dd29ea2fc9508b9511f282d82da1e40f029c44fcff44dfddd02e85e9ca0a88d32a2603ec80440954afbbcc58e43c74b99f36ce59e9290300975bd6af5e3731ac781ac938845653eacb6a1261f54f2a125cc1ae6c8c2469fafa2500aaaff7333cc9553dde495cf8d11a217922bfb9aa5bd778e35a825a202cfa9cb5cd5ed1a2ee2d3a8892024384d1b9bc40a36e8a0435d68d0f2da4dff4c1e0a87851dcc8ca375206452608827950948a8ac0846b52c0bb4005c545608effceb0646a408d4338107cf7d777ac0de2827bb76a9c0b285cf03226cdfe2bd3b87421a50a22fe281e87a3d8aa73c76309b0156ce2088f81994bca6a370bd746a462e439ec4ad1e34e384c513f6325ed8dd2400f8fbc3bdff75f9a120aa3f1ff97c1229284d16d0f4ef3424df3369d933ea84a9970aa34254d5902466d60edf30a7628d63a1d802873195e794d43fa36117d70a4c1a1e60083c318bb4004a18572115585acaadc980392f38d4c06e41d5070342413015dee054773ac9b65a99efc7aabd829716a73fd01c1e7d3c3e9631c25d5fdcb950c66aead2d9e1690ffcdd83baf16b8b55d5662a4fa64c2a8f8d1d0c050c508d28d3f0617e628d659653c1fe16588e577551398addfcad305940d2583dd736088ab814c94557ad2e2420c94b28c82c5668e4e5e29fcd9a1b8491544fa5b7ac522efdddf20bc47b760e51fc5bcb67daeb20509dcaa3b4d6ef15914eef6b7c30f8bbbbf8050e8fc0b9c439f091577d59352f34ae5d8a30c8d7c7b5090c3408f476ab6e4e858d3431c7d6a19a1b2384d0a9d75ab2036f26feb4638fd2ce2842a0eaa8a87c6ccd09173a50ecc5062cc44426312aefa4c62d0bc7a36b5af02c355c2a9259c118f4a48264df807430176cb9f1909dffaee7cdbaf8ab26fc0fd72f07f6b48fb672116ec5a109443574d27ed01f758152506a2011fc439201f7e21f05a77edaaab59291bde3a07cc6b7c2b501f190cf992ceebc23012abd09f35c831450332cda70beddf69fcdaedc4d00657e83c106b1c25bd90d66e47190140423fdc5d6cf78329ea9ebc7a2542712eb3214697c5f078df868e541564b7c28e4fc83e49eb979b0b31bffb6983f486d5bb349e85b304f0ba6fa970948b0d9278f0dab657ca46362706e6814eee239a8f9f17291ec4230eaed8fed3993839f78740d3670f2a31f12605240b13dbc5d63b19c91698c8af28dba2a9aad525cc5732399dc65c0bf267a73c6af2cc304167171600fec5a57dd81292936a8a126113d769b88e63012cd56b874e3f6e7a9a05d2aa7792ad73ac44cb10d504ee0ae68ae870e012375d39d4d4a0592409abd54f368ed3367acdf7239f778fdd391b90ba8edd9c1f909ad0ee6c9d5366e126706956a67b1a04117fbe052fd1dc52daf93fd5c39334cdecadf9eb065b4cc78d94fd8aadf36cbc0b95f50aed1e10a8c080dd35f8a783bc9909790b3f8bb431763cea0b3b1b9acc4611bedb6e7913cf47654ad470da96cd9fa4a5f7e7ccddaf5a956d5539d868a97b4adb55a3f51215d568a9c8af1de998b52ea8296aa040d39588c64b159f166c8431091217ab8ad571074fe9a9ac47b1afc4b3152873b61b94709c60ec9370f4e6777d5ab2336b03ad7ec2dfbf2f8376e232ae747a8f857ab04bddbbdddbd2f93bb58ccaa8c5e3662faf8625ef9485f5d4612c97ab0ddd123f499e3408834235f6143413d5adeb35b3743de15010036471d83162d1a4c773a9820780351d78498811513354252d6852dca09663cfa35488b0208683390dcdf28ae852ddb95870853602bcd7301835218529e7b9668a9f1d88db740e9ffb1247822f53f754e4d745fe20ddcaca38e53c460106651afac8d1af7a2abd972e8b11233cab3884d126f1c192239ea1016a2d7cc1c41d394fba8f3f2380323f5ab83c293406500f7c5240a089fc2a1ed792ef2a8fb23d2123430501a3a6897246f2debee4f751adf36d74e4dce5416f9c8e245ce853b48cd76e9ff08776f42a6774472cb3c159db879641ef3ba8f65621e6f013b5447ead2b2e5018f48e0c75272f59a0b2291d62f48c57807e661d55ac3670016de598417fc120616f340ce34c94f78c58a014b52ef7a060211a4717fc90dc8826b787d2b8c7ae986612dc08696497e8349a8b1a30bd16bb6568ed3727490438e2696c8c807db01d7a80468632bff0104ec337d28b60ba2606b8b247445f7366866312cf9f8619de93e16a59bcc1f100517d92a506a7f48b114ccd9c9b33ee914ca60c5675975a648ae6584a7fd08031815ee5e81a9968b071ac7f15d0a9c91a882ebcdf769c65f474b0c6ce53eb9f229b66d3c25ae9ab01db63012f133a06cd40536e8759ab420c4134c2015789b8cc75b006c758c6021ff25f93580710a2a26050fb0564a75b0be6b4fa500fb156dab25f2ce4668b66ac32644e5d64d9df7ce1e0a54565935bb05fee44b72caa82fd13401309b12949b3f36c007a273fc6091c8ee79cb74c40f709acc577a3fc6dfc69efac8f88831d3eea3927c1bbf4934379142f0e71e105f9676c64e8010a728637527e6ec8c2e7b8e9d91e21990b9f5d8cf084de384973175f604564ada603c30118427af3ae45ab9e2f8ce27a310001585981a4038e70858196cb80fa56aba626df9ee60a5389da75377b2ac3670d844462eb2c1faf6e8dad29815e2fcbd86d009206580b63bcd6516093ad7fd85318ced1863511e226a5d3eac7445d6def980355248d14080c81e6773432b0ea6e376350f13230a364a1112f39dc92ce03f08346d3399a046f55c32bdd76c47113dd9cd446aedbdf7eed01eb2810a91381ada7f179be045cf77c41c6108e380dccbbe8a90701bed76be3f833aa31bde878c13c4c07a262be8a600ce3082ec50a466c4616b509b5c2490062a7b2135f1636cf35375ac46fed211ee7351facb968665f72ee521106a2dc9047c968b421946b4281e6d5a5320a7697427f3ec24807f734f1470dfd591856d3dcc7c61cf0368338e494f9a9300d459718365d5b76172707b213bcf456263321a2ed3d7d46c1d17ac8d3c18a372476ded9d9521a9aa5eeb622aa2b3a7e4bdbccbc65663e58d4cd20120e888072be42d2b2dd43a05da2ed0225149c360342a14e640daa698e5629440d0e5932520fcb330a1153a4a5f1ed0b9b60f9d190ef18c49ff35f0c648e84d8b935e1822272981761e07d81c8c47e3dc9d9d780b34b815c71c8392ae99d4cc96baf5cf972bc7376c9249067d9fc4d09a0704e9b2f3ad97484f7d7520eb809211c9b3c720f2a8d2b5b5f4e136979adbc0234457c98a2f1ef4cbcbaa6dd253f2b3663fbd97c99944e8b8573bf21cb9ef31e56511bb831acb60b98d1c30227cb329438bb73d452dfef61e4fe971d1de33731c39e80882e0fe95fdfc23dfe9e73a0252667714e15b1d420690818512d2657d137709976b54320c1010cf33a8d849ca3d8ecf842c78e1f1dd8f19f7799ba0c4f238516a6e10094c292469a68ee54b899d864d2eb9819e0f6e8583e234c17c75fa9089d191413ecb7348b77d4d102beb0fedefd70354203ea75f77d06cd616b117b237fe835ee2ad8c62797dbddffc5c829f86550ad3f444391ed10960207f983d45f703de919f537190691e1a8a8bf8594bfe7287e04f7e771bb60f54949547a89d7a2603e4a02d6764d5aa00517e1f54ffdac49ed9e1eb945468ab46cdce4e38b7a9fc006a6160cd45db536c00dedc6fd623f857d776a411bc0da9faa94b2e79984a34ec85778ae4bcb707e4ebf7dc64c3b795592ae1f893f35b4011eb2adab320c4d6dbefe19aac861c8f7122b56b65d874b8adedb00216041280a539c6997b9a4acbae25d16baa8526ca9fe20a8df11645ec1e857889f4267d9c2bda2dd065824c0f89824b3a714343e0c3e540941b9e5d49909267c41938322d64b4307b8ebe99fc58acfc1d90a47813425f13ecafbade6ca125c8876153718e093d408eecc2dc959a36abd756d95d62fe6c9cd9ed50ea2c613814ec3562f18b6aa0340b5b8bac706f0b1b2116aed5241caa1e7bfbc75c9757ca0608766205074ad04f6a9647f60b37ab0fc9403d632952bfe4862db5a3c55fd8db34ef3d189d351263210b6db81df58c5cb91272590a847fd7777ba12ef5a37bc2bf28123638ea496750e855130ca6dd679ed10c876c300adcff11740f7a5c55fc9882c7a3b608ae9e5326dbbc0ff9b8472fa7136ad79a0247a300f711a235c2828f60d638882066848b137a4b53cf91e98b57c83f2173891704ec7762135e6cbd837638ae5c8ea1165d934560045e84100f2ee3520be2cec9fb18e2b7923f52517a466a2f46993c51df39f31765acce26d656a6918d783582ba6ffebfa3e52168218678b04a208fe341d49bec239e4cd19713b746417a858b5ed7d244241a982141f8e7af0d63dc13d2ed9f0acbe1016618ee80104a11b68ceb6e6a74ca2ee836d8eb7e965e1a10125502b7378946a09c9e38f0ac273ed22aa800e31d29cde41939ef081a4e258acfeef94bd24570b2375527ae706c1cfaeca94be73ae6bf148dd3ed483cde03133e44d42319d9483144ec2a3e622dc53d699d2b387b8adec6f8a4e9a716fe7d9faf378d70940af7e49b07ee19d2e6c175af1b44a4c3c3bd0f5fb12df1bd6ab0dc08e7bed02853836ebf714e20ec704f323e08f61a0dcbac4e2b88233d6009913c40d35dcc3872b0768a7ee3f3d6480ef3d4545167999f03a07ca5dd91b8d3b283a735348640b7c28bbc4ee3e98cea5d9c5fb1aeebabfef749a71df8cfe45c16094d337e2fa6500d3cb2f9c607e0f2da50dd8f2bd388d4fdf37e7cd173d5036465c708cffae088b88885d1c2242a309f6ea7aec41d61dba088f0a2e8dd4c0b20eaf9bf5a6adab41351c352197471823960dadd1aff9659129d9f88c31bce15836a0d6a1a44734ecc37831a34e360870c22322a83436bfed5abb2b1c422d26f7f142f552d1888afc2e9e7be8bd3150d4edd81d295374431ac7edcfb9f3ac47d23d8c997ea6263ebc6b204ef774029a88f99a3f5187ed70c5791d948012a97d91d7c127f36e331bb11f9010de96e45176092c85d183d83570cdd624388349fae564ab9196277986469b8b4bbd3ad3cc819282097764340a0e641dad93f5ca04a8eb3ddd9e88f97e1a4b6f5dcbba37d9951946d07531c039f23b4e86d3e6b688f1af20625fb9d8eea6a3205dd8850e24db354c716844c1a847368a0352f0186c474b8d744c1c1ec04e0fa2af5cdb00d4c5b1bc4e1381299843fb9dc3b7395cd11138597e062f4431c595d53299504b696b4fde937cf85f86ba639f5424f0cf322654dc8c4df4a578964b8ba81701e534e2d008be300d8886d5d611bca420d321552f9556c78c074446b8139a2d7e7b5119bc2dea23d3bc36edd21e0402e8e273216b5bf80959c2828d8f55edb62f45e86e2bb2e30f5b08a0bdf1b70599cbaacdffafcc7e6ab437a24e9ef68da47fb5a3cabcb69536eb76e703d83ba254f4e010e8b3708a91ffbb20f6f3441740170eb9ae46a87a42f2d5bc851ea7fb38ccc3444da8b475a2d240978358125aa5da59223b66e04a4898c096f23938565743d5681f2f7f0e4440870681240f8f73f8dd793a6e9dc1bb09f329bfe7af16b22c53cbf5a44761c086f9c9f4acff40a2d6cfd0568669f704c4eaece984afc204a8b866e9d9476d84b1181f9043a5d256045c1a62c4f890a66146cddc2cc98a3126935ffdb03a65079faae8f7dd3819fd330972c6f5e2b231ed4a56567b347edd20cf4e29621475fe8ee1a651c08a6e696bedea0e24be403ef20054c959fc70b7960a910e5aa2fb9274fab96beb8d909e00b5c09f55b1a189a200595debaffb2cb8a93f44c35fadff20415168497c7cb5ce199189eb78e0337411e80fff6b9d7220bca14960c3968c5200791c44709a84c3e0fc33b747d359ebc4a0d23e93e200a684de63dc2ad4ba18edd3ce91a244d74c67bbf07d9b66872cf4dbaa5d73d48c2afa52286bbc37a41eb1b04957fe7e368ff3f2b400f284286c6316d037803dfa38fd1d9e99098d7d31eaedc3be4efc9ac137b0c07ca2e8647f11650996692aaa13064a340055d4a442199bfbd30420e4fac470a676898e1bc5179da0e090df35f50d0e1105561feea1cd4e70b164fe578e5d3281d649bcad181ca488c57f52462c475846f9d0caf25fe8ebd0cdb75a7f80d59b32d9858f99d371ddab92929211227506d56467f8f80b1aef68306409d2b4df61dfd91a958b87251d159e3c64621dbbdf697e1ed5aa9217cba28b99d642b447027b6f39a4d5690759030d65807c32a579142e8ecfa88d3537bd77f102f2f8e8b4f579603608c9e18bbb6bfd96ad8f4c3c8a2c41f304bcf97652ac2522fdee9f639827f0f1b8b66bcd9be1138cd79ad09a88467697f73dce6a913fb7b6732b8768e97a448b59cda85c2b9a61b2d8864406208c59a87fc603dc0787b9310cc01750e9419aa857f2eb4331535995f3b602aeb7839a70781b7546fe69c96c68a41337aa38afeaf4b1103285e5a8b6a7c850f666a0054ad8e9f09e1b76eed856cd69612bad9e83597b8c686a38281d7f16de59e6fe9986c392eb0c7346078371906bf948120148432c09588b7104c094e3c93c0eac6598c1222804e271b77d61b48b2d578bd97f9a223c491fd22f09baa8a49fa1c172da453fba5c6c32aa2b104696e49b83f4a5355526d416253013679f40cdf156948d63b99cd46ff83cc1976f26d249c6ad970e2e84afb93723520c379fa801b1bd47280e861343b41e7bb945ebf1958cbe4cbe8d709cc06b5da414632ad78f30d5df6cc6735c1e88b6474cd60fa87922fbaf79003f0db09dd6aa9b95d1de947b7ccc8f0227ddc23a6d13eb5b621191d6f8347fe5c5416281790837b73b203a8be8c9dc8554707c5538e1685c25ede7b305b821889aa37f03429f6087621d4dd768e94a7b7e01fdef00d86261220a16a63c8a415870191afe9b5e83ef926efbe9f6ef5c24f999599beb76545342d0f2d58adf2b42b61a553574bcf15a4d9918bc612c69580c19f67d7dc72820ce01f129811408c5d188c2eeab1356fd1e215ad5441f7ee4c3c86ec91d74a246b9be1955042010f0643943cb052d8909bfa7b3ef556b0757ee6c54dace72fb7175769ca79dc32adb8c653fb3c68e4cd899cfec49a6ef8affbabde705ba6d43ce374ade9a95909510e85b487b0d2bc39e5d5226905cb7b7f30a81a7f22e40a758f00361a12b778f4965545118a3d9669f0c970f8815813ab54194070bbd03c83482544cd0bb2c4b70260654f5e9c3a00216724169bf40ca3fc4963d3e4de54d93546892ff4323be43c031907381e3ddcf46c2610bb05bf7e7a61460b83863fcfc3ea96ba920925c73156f67cf916e98b3c281962982edde930979d2b06c1331ae544fc16a715a0af3302e5267acc1a0c3be6d7f8dbe4edd3a64572ef85e0c879bcf4bab222606eaab0c3bc3ff2475257842c4d601e3dbf3ec45ff9b20b1e392111b3ccadb6ac20fe1f7424c6203340d9a08631f9a4ce463bd1adc94a4fea3c675fed051a2f8c7457e06e8fd787108f35fa1c1db8bc6a84dca1484f0cbaa07bd2dc7acf0005918561c40bdbf686843f4a74c067a7a432fbca61bca642119fbc9f03228205f25dc29df7787ff2e0881315aec457d00439e456791d98efecedff15692d83451abc8e7474a17a2f7e45992b2e8ddd6cb88f1c64f09ab0e9894e6e3954f7c88209984f4e8568cc9a4f50384c9604d03671282f57940217dc93920e7bb79520d0ed1bb63a3f300752ba8903b58bc5b04200059429a0de627383b5a091a0bf4993e5d08fbaa95d82833680813ba4dc68619160a7baed58fc1793fd2fdedb4fca73f2f983fe8a0bf6374012d35b07b7e8a08cca52e1aa8eaa44b019b38b5e81f4cda65c49e8824116e4670ae391cbbfba6d251c168bea0b79a2920ea2c3a99cd3b481a89752b36bf4ed837aef1819d0229e0f2429b5b780bc9cb506dc2f1d9ac3ee0852bc13ea6f0140677ee6063f66d8db18a645d5f7a8aba6381411e119cda48d700db73ee0a19f3e3cd857b15d7a5523d132cae293d3f248c1795db57b8a37dc9c078595546e2824884cf29c9939b859670399b3677d31046791c0516f91bbc639fd50a4846f8c90acde8ca204dc2f8801273ee82cfaa1b736ce46f80a9ff8a34b1cb1f7b4a62678ae375ddc26518d6072736a03bc3601077ab869441001a6eb5714b31edf7f6d235d5696b93bca11b3b3b094b716bcc5efe56222579c2480dcfd3325eb08305b20eed9fa01e596bfe1c8f74465b8bd798b3f0b0a3fed134e1a8715f6faa364725248bdd0843a37e0d0d1630488b60371968e34c03b67b9ceb2a8b84aa300028e1557c3b2d525029ebb4ec3a9df174e507f3b1f1c3fa637721c9a523d0fc51d45c5b42bff3f32b1a9c122fb239f17442f472805d3b4c15526fd58eb64b9b4c3f0e0cbcdbb42ec9f9f5691135cf2866e001d60f8c0ce2ca0b3e0eedde3f9bd2753d8343e70b2edec66c0bcb79a1af6678b1483244b56059d9b0bb000ce85c160d20babb10f1ba06e4c4d29e3f843d93067e972d127984c88ea3d94a7cfc7ba6a7cfeb5f6a718005198a0542426921014bcefc49aa521cc38106c05ec3f820bed5bd86af587a6a837d262f8585831fcd93b08089655f7feec0379c628401d4fc84cc323e1d51766596dd77754e1fef9e262bc85a7c1dbe188353431bf77a26a4f6878854f2c389a0d40eb0e6ce157761c180ddf8ecb95ab3cbedf862be60e4830634bec1fc2e549cf7d98066d01bcf7fdc7785402b49fac85771b01c09ff926be8a22ff8f134090d01933d0538f080f583df6505198a542915e2cea08d5784c6145499687c3c511bca17085454ce3763143c4320d3284047c4019c445b1b35f06d5d4ac1aaa8ddaf709cac176c5ff3f6a06b90df22e2b4fa9b0f3ee62dd45d3ce8f032df8aa025c7d696fc695ef091cbf9045692b71a056e47e58837e77e07af6dcf1986f0cec4815c048c0de291aa2125a9576648b6ed9a21606abc7faeeed9e3e805c8ba0f598ec486b4f6fa1195fda8134b0d836f18fce857de892380fe1923908a840eb73062fe5a4e660e5bca8f70e4ba6fd6beda158ab686b4e206ee24bb79075b797ffffccc44c7bef74980831aee490513a73515b0647bffc1c7829d4958328b418767bc4c6d4246b8e04117f04a261f179959b07e9718ca0bec72d6d7ae1fd60ecf653b53b1007bf4642b67aace194b4dea7eb3212a3e20200c65e417e784c21786426c5d7d0d25241d991018e7653330d2005c0ff237da49d216c0c3832791fa71c0276ba23edaaed66281edc6086452b403609e6510efb7f303aa5fe5eaf5578f51751aad09727839700678c5de19ba2373279bf200b830b260ac04ce30435125630af0cd19de56596994e55ea4d3f77570950928908ba94929c726fcefc431a33dcc349201771009c54e983cd2984c4cc09e3d3469133b35690e01f698b6d9567e2e8082d74fea838344717cf58951ae8003cb74849985dd0a7a53167db673fbd4d1404201173fe2fb0a01e88eb32f57ae28b01ad2fe954c6d6421aaae983f2bf09af296ef66661dc578648d83df9721758f16f147e96aaa115d70959b3bd32006805298aab2df99536df46bd830c6c414a2d517de0f0ea3bef7d336383fee8cbe8fa21d4b4e8ef89cdac3964ebd7e1a179855ec7c936c3e38b9120d74153348b53dcb45d1928ad356ed87b2de87937c83b180d9d908dad5688da5b8e636e746405e5b7d601a5bfe2fc3a8bf41bab97cebbabd4725c3a56c0dffd52727c02240d1f9bb330c85a939f0b6a0a9f704dd5cc271f0e7f57e0d92429737d1161cb6e6b9e5341d7695c47cfb3fa5e6f91f0f05371b81559b069c51089af04c3e89ec53d38b7ca241c8902df785cb54bcbcd1742f6a6f42073c49fc46558b991e25f803c3fc0c9e6c69d4155fb50d412dade9db97d4fe8fb1c198f4c718433cb0bdcdc1e0d7a557b9f04f0081e05c05dfabc2ab2775bd0e6bc23a561f22bfd6fa9e6af74416f7dad62f8e271fe9145f514dbf0a2a6efc22b4d6e21b232491e2e0d2facff4545fb9c4411b6d803eca32848ed64a98a08ed8547527647226b6492b5a23f63da87b910578125dcd095e7b94e94151f02049aa2b8f96f150950c5ad1576a762b70443d87b87fc784edcce361b6416b2d332172ec4ff19b6c30da432e611b7950f34043b6c664685a632c610e61f7aeb33714bdde7a09d5e33896fa1a5ac5feffa8e8b78dd472c0caae69af698679b84800e6eb0e3831fd7d224d8f60e24c5153c0ba8a38ed052c64d3db67ba983363ef774bc82ff6037559f53f30a0830f917b445dda1a8738bcabfcead133cdec5068a6891837c83a3a08afd8c7cb6bde4ded7a0d49ce5c32d1c8a585200b37c7187903f792698ae6126f9c9871de5e95a9bd20ca0f1e2ba3cf43021b0266314b87f951a1f7433a3ceca1b545f5d90d422045c3cb3550a8dbe77bdbd6d00a7f66eadde33a96af8c84874a66a6840a28a53b539951893ade1500d108343738add97004f069d80e26a86a7cf216deeaeccf651e690a4f03b437f2c25ba30ed7825a3a64ca0ca380f60ee311462a8b6d541014265f01a87f83d0caacc7e4a8072fed55290a98561440cf9c3e47e284feb623d09fdd1ecd66b7edf7537fdcbe4a5e66154fb03a7d5b0c423faf2f1b60eccb396814d6921cd9ad30d3d776e3f01480d68005e300b6f2aee1242319479136cf838104bb0a2a0db9f0e5c8c7252b9b0260651e0bbec32b73e7941dfb6f4a175c7f45baf8fa37881df1c63783874d81fbe4ba8cefaf749a6e65d426841e471a16df30be651e5c61b4d748816c0754f61c539b4408e219f4eaa2857261751e1e4d23efaee9e290230d5f590d9a9cbd69bd4b4973ac16a4bbd5daab4883c649d0d663ed56a756d9402bd0e867b3bac907adeae972694452dfdc39710bed96e7cfd7656d2f373b8e3515180b83e21db08a57646c85684a9797cf85fc07ad1f4ec949a33f22cfb8d910f406f5fad966928e9ff573fc7dbba68a23cc933ebb92fbb3e5734b70e8d58c6b9ea0ee696066135125590a30f60675d7b5c89123b73c670a36152d4fffc1afe853766c9326d38890a72c136f83c8efa3d17242982db8775c309d6bb9d946cba6720f9c5e287f44a9a46b8e553eb8284aa51faba95f13418811f50c803586523e9571c0707c1e21d16586263e5ad1abca02781ec2ed97a5464bc8f8c139743037458c65388b9dce6fb44af736e5074be93eb7835896b049874803efcaf94db06e45d7c1375a39486b11c5e9ade762c116c75e6836d0f8c3c1592cac62b09d12f7cc405e0a32cbca0826cace70a0c10eba046864e0199ff930403af56a4161eeebd776a3cbad1e14759337d030e563481a47c010f61c4d9dc970ff7eda4564673c577198cf4bede3fbda365918f43fc1cf58776d6ddf947670a406bd9421d8d067c98882550e5c7b2aaa5530ef6a7a8430c944ad6f2d604eb3cb1e5c40b67146684f8441e83fa4671eea8443b86edb8318d3032c81383d3de1b815b7a0277a536b53a909242501a6272094049c3a815025205d02841ed8f662eb104d4330b0f7134e33cfc0ac29ed01dbea4990300e527b50ec6f0715a1ce49982c8b5b114741f5fe1d1d7773bee92c3bb0ed185c36043738e50c8d32b91a7fa0f7fb0a089f5404d00863a6cc902dd61b9911c7edb7848df62d9ef459aa55e5a5b47c77c3b607681a7cb713b7336c261ef7da8a8b214537dff4be7eb9b0c796d8b2b3cdbcf15edb66a0dbb0b8adee102b0240f5367cad3498039e376e7645b8efc7c51243c0c0498b858d074e63dde1c062d189d0ac82745d54074e5e5fafadf2ffc3a3597598dfe1ae2cca5235378a37a9f4b63a955edb41afaae29de5bdf9a9dfe2894aa64adafb8e8735b8d81f8e13e1f759faa32657f6796521ea39ff125b133b4974a6e0e60e1fe6eab9f8bac7681bf1ac5bb06997c62b768d5d12380011d04480128bc955268f3f7a27eb21d334280a73fef25411bc84b58229e26ec95e00a6590b329253940bd0af00e8f541989c5778154bbd5e1bf3fb817b94f32927c1cdc5b74c289ef9735e63e063f5659900399e1b52e699352bbfc5d295dc1167307b56da082df3068ab56c2db7aef020fb5232f40e74251e66b4dc49282238efba0569f3fff509ce63c4b0221be7b17c106cbaf9d711d4304cd33b73827f4fbe73de65edafb9528a75fca330eca2cd28a230df671a13535113238832096f049d2d93c59f45344c3f9c0e477a81bdd7f550e6aab94ed4945708b1b54a0173d14ec50c73566e9e92f5e9c949a3816466a47b4cb23cfa9f0f957ac8c7462292823f833160e97f43da91f5df2d693443d6493b845e81cffd1b2335f0a6bd940c7139a3a507966a5b0ac91b40b64408bc2c72aa172c1735b58596469e9adab628957ea391c1d8a488ece31935f87b9cef9969f88c5011b23af2f73f1b07dea4ab44c9105e49eb116840f86ccdc1db5a2add1db04765b7f396258e300f2e3a0836f99f0110ced856f91e949f70cbc911f59b43fb204bf7fb0df18120c9e83fb5689c97f771f39dfd7f1bd899f4699c51c976ae2df39018c801a2577864b5c286eff350466809b53a86a0b275722b8311faa4b72f475457bdd26e5ed87f5ed88bc993765d330436eac5f28a9182605a8920c0a4ffaeed01f18882ded867836c57be74d3c1cf3933e4d1cf7990572b33af07cb9bdeeff22e3054566a3dc9499d3643ce18e846f881d086364f4dec799d2c94aff758c148f070f5c6b9de0ae3c9aec9950b0ae9a19ed7b612ea1d70c905df5f4ad7b61a2310f0029c060d96d30a3ff7587d961a237a18a0c2bd9740b9e0ce904cd00531658d12305081b27473254bcc73031ba9bba2aab97b758c0636edcd0dec2e28a3abc42c376324aeaf816f5bd2dbeeb7019c0171cc66e5ce6c91e3b1ac7a6ef170a9a7587b772b699785d1248689b03ad0b619f837b5926614cacd6bc83165a951310aa2372c88a2d5445ebfd0134ccedb904bd483932c10b6597cf0caacd78c3aae3a93f7f40c0ce2c203eb2234c7b402e1d1f4c09d8381b384355b427d1d6448604d86a96c822b1c2c508132d17aebe016de75e3cd29d8abd69e1893534deba5f645b00665713a976cf5d790f4d2a3073b914ef32971b362e66c6d2b468b39acc4f79c2a85a5b5da4065981356fdc506420fbbfc122f8103ad27d1b0386e7126de5fb299a0a8df5f725f016b8210bdb9ba6eff6a8d760b892d478d23399a9813b9dbd4b95e14afef41fa8be1262128eb4b176c602c9c036059c16a8d1f5f74cf28b2ec95f2fd7caf8e8a6bfbd6357615ac0aaf958a3d79773833d6ad61cb1c938de87ba18badb8456f6c4532a4b62888bce4039d2a4dda301101a69c6d2dddbfe7aecd83c3b193fce5b52f925a04bfbc68ea21513d98b8e9926ab4642dd4714d69ebb0839ee919036c4869eaeb6227dbcd28a75d695c6e74977a3dd415bf5f9ca87992b6f77e4e515e4a96c01bddf1bf0a37bbbcfa5d4d8559f6cc20e2e93aeb306b2b65d8024f725c5556f6f2d21a534a77aaee6cb214a01327364a10e271a5ef7f16b7fecb105c8fbd10c92ac642cd67981c8d2c83f5b6f8755a39bde893138a66c16d9e68129fedb70f17181cea252ad8747b81654c654b7f3252b599d1ca302c55acb1de005eb424504828cd16d052a5052f09bd658674f5e92ae75955717f5809a082da19338a8f90803f0665a7d5d855fc011dd9eda4c0e9494f36675e62026dd5f6099d91481ef86a4ef8cc15a84578583af5a4bbd29604f676631ad0bc5c0000c91bb49213416442624507c4d0a27c133ed05154b09a4b7b49675621c973c9a054bd5a6b29da527d3e66849aaa4d28e63baa887b55d65492ffe2653785dee793b0389380c6a7b25f9ca0691b315c8354f3dc2958d78478f2c341ae0cfadc8dd211fea5c3ae7aa8d7efb76f442a1586e99e1c3b22272d1dd41cca12d8f1756754952614a42be57d0820489e00bfa16edd028d78c58f1a79fd134060c056f0bf35cb48ecf00d058514d8dac617911b30e532d4c2f7b5caee6aee33111bab83858d0388000dff1e282dc2f2ff0ee473e16199c05d0690b910c5937a7f99d5dac70151aa21a5d66ced85cb50e9280a39a41fa82180738d2f593360a7b01bd724b9bd782bab1c1524e7e6878a4ed9380fb0e0e8f0a5f070aa3c9406b081caf347996cbc4be6062bbe762fc2673b399eb95942d29bf6719dde4b2ed3ebb189dcb22b47805fbf7859d5222719fb9d99463b8aedfb49ec12988a00d0d69e530d7c49ed6041a3212e96f6d2a0f6226478c4126ab9dead9ea4c5b61ba4cecdaa9bb0b4fca4e4ec6af9194afd3c986f8cc908d61d63d92021c45d55ef84c3ae8301a83c37d12ac008abaa0adf09067cb69a72d479da960503fd599cf9c425df3748d1d0c5901b75a96d50a03b42229758edd4bb1ee8b2c52c977ba13e2fa9ff25f79b59ce17c87909cc561b65650a085402d3c98af3577e5b6d35f3fbbf68ed9e33b4bf8c6afbd99bdfcc7a2d19fbdfb6bed6988e2a1cf3e4c2df91cd947f8ec8f0a0bdf4282c6ec86af29063282714a8e50efd15429d3713a8f88db928ecbc997658588f6d3aa01be3c2e34478b0ccf6d281cee6c41276126cb8254a11ff5009b3a7dd22e1f2a42f94820efe75f3ca4d6807ff977b1f898ab59b67d79fd8ba011932b9973a9414ec704b69fff4c868e5719c42eeec930f5f77895fb4c08231e0fa64f4c2bf4630547891a4be6633fea8cc610c880159244bd772ddcb6682b3b9e630c5817838dbfea7bd6232a24aeaec42319446b57ccf65c9c846907ee5e5007d68bb141c6f1454d41f1c5cdb141de3bcd66869e01e3578338d2f23f4dcaee31fab013f40b3f67ae23a616483cf6c78d6dad9b690fcfd518ba36bcd916777f3de4e43db6d98adcf89c0f106fa1596ad967f3d434ec220b900952040afce7e187b57f5806c23466494bc87e3f9a22f90e8ea5f7316f0437e150e76f509e18a9ca23e5fce71a72139ee5573a0283e79553a1116248721c9805d99fc262057f8b551f51a611c374a006039bc931ac5f10ec1d1c0bee600fbfd50c66657479f42cd0fa6c3391c27d82005afc5c99018bf690db041442e6414df1c13c7c56704759040d0533fb120676bc60079bdb56b8f2ad617bc3d2ff1043279fabff3a1c8fa1266dfc1ab309559b66ebf51912533d2d0c317f6a3eb9db371ca66518e1d13a65842ccf3fc3f0a7ace56bfeefaa24a8341126edb88b4d170d4e732afe81eab64346ffe9131706b93e908614d9f18cfd6595592d1cc8d70ce79e205ac5986772c6a227e63ba74114b860cf13fbe4cc284a88d6063c02e582f204bd619a33f6ac6e684a8b2c845cc9199951a0eeb064bf08ba82fe9b13d34194da04b48b8803b9e70b05e9e8b5ea016588592a41498a284736b0f84c5a11a2c4303891552374c4b8e50084d1d5387975fd3e5a863e7800b732df1f4019a99fb55e6e1443b68aea3a62ae599d7285f648755889bbb1d8f3e9a22a4166db5c92487623cee59caab7770b8816f7e2d0e968667ac0d408fa44fa67eaa67c15c3cc9c72b90555167d90689f7ece445dee70101a566313ae5e56cd3a1a62694a3a9cb99091b40475f42bf02d1a0f91ca35876ef5bcca40ed6d748326ea3460f44f1f8f024e689c527552f8f1ab9316b04f9020b733fc6c4af8fcc6e183e746398b0126b65de52abdf6246f114460778a7c7a746bc4f4fb37ef9335aaa73a734e83ab97dbb166bf794ba5b26fca086903a6e2b4a182bf85717ef7295682d0865b647cf9d50523cd432a54895340fa4cd7366d4e043885aced3151c83a152ebfddbae16531dc34315cc0933a290f2dca9410c993b4a55eb923927c904f330538090abbb0e61b296bbb0193b647c76a7c71cd5655ec351bbd36a0d88c4b559056d5e46e6eb8db3521286007923a037296876f060f8b11b4243215bcdc5b3237ccececa4e5ee55b9aab4bd182b7a778fc21bdef0476068ce6e010f8fe7e1c9ab3b95dc88f4270e7992b39b399d30fa155dcb3c4e2007df65f132a9e0bd2b0d294c1c954d2821e0c64f4979392d850f7978171bcf991ff3c2e8f13301d592a1cc0191adfed98018796f987f0bad5a479e91641f8eb78dbafa6cbb0f6f46aac78608cc83e66f60dc6980f535db290606fc698417015742d36331198d54f48440881f404f24a8f840aa17478983580cf47e4ded987868ccf75cdee293d2546df683ab1d3dfe7cb427ad310bb1631bcf4eaae2832ed7bc08149e9bdf9b445ddb9e60ed51a9fed4d7b174a47051de8da15a91d6fa6fa11a0dab57917aa2c5dda70bad8c6214192ac35a17f56e626409413f9d85373018b82d004d6f615740199a82cd0b5959130790a9faf310dfd40f7393604f4335f9dc83a779292354565123afe452f3452a430762b5be26817ba311087521337a18292df25920c51705fbf28d77717a55818a2568400264a439c7fef553cf8f8963b9cc2528ace84f48209a5e5227e189cd2e40e424c113e9bcb60b9c9f8cc5210df4c39172b1997936d2a71be4c893e277dbde57e17599ada580f17556d5c090c2bd743c89d875d2ec3710b43c4a76bdb0881e1cbf5206dc182c1302cf97765d72b0f3aea5eb9802094ad14b3ea6d65ca2e0848a145b6d5ed44996d92d9b865ff2aef6656c625c51a8c85b1abe88a7454578211bde51991116ada408a41edbfd4598a15fca8b9780b1db44d930c94a7d3ff8c98a1af9d221daa3fca5634ce645c8f5e68dcc51502cf00bebd7fe7a7fc4a9b8b43236aa0bd03f5745c3044792773e51990f393ee2baf6bc8faf22cfadc76492f39c20980d58de7e062fc7fadc18b2b5e60a560e24a69d1f3d8d0811e252ba6bbc45f6c6552f7682c95eaf1594cb1aa470c79296e55a3a2629d873409ae4629e097c24f7c7efb265d9e9108c2f508af20b1c3eca09dd09f1efb78d57ac03674a588088dbbbfab8ca2becf11af57bea562e37aacaba1bc2182d8b8fb9f601819f7a731c8059a541ad6c9f26794aeabe590fc551b426da1f822512cfc85100c9462a732e9b427aa2da09f7d377d06ab61766685cd6604909ea07b459033f403a5545123b4126b3b2ce127c67ad916b240b79d7549d4d4bb255f1ec944d7334db9bd7c391d3388bd56ab57d3bd82a3580fe544ef042a105d70e204471b5d51afc9371a2987421418c770c6148978fff1b07842a87f5dbbc751563fd48582bb1a5497f77777e776bf7ff96783f6d5826a98c89b9bb38ae489f31ca7e43bed43b02347275f209d9d558174779cc8ca7a2ad14ba9a2f266be9c2acbaba7893b47255e8746b5f85bfeb53dad9f2cc77c88253f0f7ea61e10dccbd04376021b9d2f6c3d7a91a52d5143439f9facc8c15b5c446eec27c7d48c952ebe733033ec0454ac0e8243811d08fb14a2409d4caa50dbed581468c52332a2ee667f8295c3751aaac8589afe2137c04a1dd5925bf209bab95bc41bd654bcc21b14a92c8b910053019b2ded8b7e4c8c62210c7821cb3c2848f1f8fc9018f41daa75fd6d24af657f759de7613cc0fcea483c39cf2fe719f314a2da4f74abac1d96c309efb9b06302c339b86fe5114f7f023ec18de84010cee0662a142c17a76e04da800aaede345ebdc06ba329cbd93fb6edc002d05f54aff2f98bbf2973288aedc5fe79c57efaeb3f580b391f7ab30370032400f320ab28a122d0ad82a54db988439d5a15697596a28f7d4ca441052de328ee638ac25c0b8048f7181b1813073dacdd7f8406a865c6dec299243a77e64d1a53d5f4503d0dc958b45dfbe7cc232a36f734ebfbd0a193eb556267c5fd13e1ef21f21c9975ad3d7e3917316b7aa4203ed0c61cbec8a1c081263bff7b57bde5cb1ed548088a52efd578f72ba26496047e6896459fa39ce04766a92ca2e19dc2b42c92934e4fc05e2e9b4a71faedc30300ba4e50c872a02fff31d9f5be901f1c7c4ae5190237c2cb29b1da62eff892ae0bcafb6078e3a3a4d340e2226d1a4262a1300a0373895a6738ee6e283103ac3479d6a83ba3aa454cae3f2834821aade458a259fdfa04034127dc8846d8a89ac85de7ae547571fb5806bd3e05ee24914157992e4cb069b29075c5451b15cddaa8a4ab2a5f4f622e6692e261de01621c48c3e61b74cec0a8df4870c0d101ce2b97a48d03e8fa256b16f906550b7397a7d0b11b10f703d44367d181d5cd5f5367793244778e8660c0bea399da6b329d2f9a3b4927ba4c4b7eaea94a14ad404c343dd66baa4ab734e034990a98abdcaeda1dc28cbbbe069c54cfad48606d3dab6f22004e8252ffae786f9db810daf3efaab83cc2355d4d790701b3056c8c0408ad94a62acc47d5675c19afeca84dff8224f4e9fc975041c74665aaf540e3e187aa4466d463afa5106431cfa681251fbc9c4bb419f00cca686ee386045c96ca1f17a8b6d4227cb1c25fd6908c2a5c70f8e3b20639c70510bb6436696b828d5e0c6d70a23af712680c145800e422cb3d3f7cb854d244040697e6b717d4a220be607ae8f3b09ab0e4c0845712a280f948d1c4a92e0e9b7d1c67bc632b9aa8663a04263671fee5cf2133696ee6b67929666f1d57bfeb687712dc67d60a6d8a54678e5913f987d8b500b8f39f5cbc20593794b0d16888431757da3712cac467eea7f8fbd90d03f0a030e9bc2b6db0688f85fcee9e710ad82ad54bc73886d16a865d46b6c2e341c7e1ae6eec2e98c5191ec356a6c9eee3d74263d946cd0069abb4d5776dc3a2de681c79ad132a363e93f5bd2e5d0af7c79340b6f304a3dc210158b1bb47e1e2b7dac620cdd98e5134e535055c5e8c3fb14f42b04db53c0bdb6502bef14438e56c49c536fcb528684ddac13b06e94945d67d88a2c038450f35a04187818baea4623d995cee7eba2353fe3efba57fa67e8bc2528eb72735abc5294c1439a3a4ef94f2f94b542412bad8c658785707b341173bc47551e0b29ad67d80ce0df46a5d536cc8b94d818e3a20e37395a372713f1ab91bb857510a1b227f1f10f60ee255bb71a73d873d9b17c56744397182c6e79adab7898c4e177b6be147790a48c6d34401c2b669882b6ae3cc33ab8be45313290824cde4220e141319a3399e0ed8fe763351dcd6aa2eddd167d568ba60d920a9f8337731fa54736c69109631d5043e750a530a59207981de7396d78efaeeaf7e883643c74de47f5153f9df6a1affb39ac4ff56b3d85fd44cf6a79acfc92326582bdaa93568bc0b5675aaf9e5d7f8d764cf68ae6762b1ee01c94cad9811931a643a8a53f1694e272408a00f49e40c8e1860a540750a8eeeb5f84a6f9e042109eb4094843c98fa8f45f58f97c07d86f150173c47ad52cf9fc80d30dda7008125d0b185c4e196249aeb88d738b61a47e11ca063f492337c95253414861e53b20e277e7ac6a0d1becf45c42cebba1cbb8db1b1bacd53161054be000bcbdc457d1f5d02c81635806556125eb66b4da4bb196645a321fcaf4212aadafb8beb229abeb9fcc57955f04ee17e067aeb352037e69c0b0805c705a002e7024041e315a2e4818888bf9e188a278c3bcdf29f4d9600721a038b451850870d122b810eb822ae661b7e66590bac71769c56f3ccb9055375799e8604f0077dad996a7c53d2ac00661e7b437a2fbdd34de97953c8a98bcea5b98569b0125fdf77bf32ca3642f0627b9a9d2d3e865eddc4da498df10eb89078be54b7d5fd243848fc74f01c30b910e2117db301224f1bff6340be6761260847b756326297c87f02b6d6527c5e4b6bc7008a62e65395beae6cc4301070e536cfac799641e164b072787eacca84471a010c956179e55e60a878969383f4b90434ef6777a7721f7ba5298a73e8eac6527c19d1e4fe2925a6ce24550f69e7c5ed5d164d7ca905e46a5952fe67d5a3b0a1f2b9e13137fe951d8c0183d4393576fafdb343e595ba379ad48dfb0dc8c6ed0664e3561bf865ded6627c8ddc215f130c744648d22a2ee49978ac748d5f992be1f29c243167b4c5c158245a04b15525003e0c0e80995a5d5688a6e35fbade661ced5b9658a946458f571016c111c4b040f1895308e5d96192df22561fc6ccff7a2529e72fe3114f251363a1b1c4f739345ce74266cb4e9466c65bfb11e3d4c6be3d3457c779405c782398c7711d028b8a71f4ca2662bc6198826477f406c20ac9a742342b8b8e87d73a63eaa7415a76829eee2e33a9704f62de1b8021ad724eb836d1474475a94b16d6f45311ccb645897b87753857f80e13622c7eca10bdc0f40f00b42e9709a239e3fec188cfe54f939df177b37583764eb0a3b260e77a2b3c56c3b0bf00b940ce6d1ea0250ea6ab59b79ba900f6b9f184b42b6cc1fc209993a53beffa5ff59dde4051c49077acd5915e6b7f27ff082a0b48c4f003584de6aa45c2fa60632373d4c6318ab463fb284d928f6a6f7146a0318882c9d72ccd815d805ec676a4aa56b1a6179b3af8f55242c3448b1fe85f1e345633cd5dd55770e19fb1417c25c21c0ab35ee111575a41f6ae411a4bf254fefc65ba64f9a5fb9de71477a471c64df2fdf0304eb6cbbd2f41c7bf27052370041188efa845b0fc10c2625920fc92e5caa9dc2c3b84305a1600dfaae5aa1c5932797dfe0f042c33302ab36ccb127a87cc3fcbdd90fa45c0459033a23414b950251773623dd72e6afdb818a31409d3916aaf3e2a88e5c3a5232df9580370796338cef6d1b80cb2697d71793e39e756d13d68d3e7bcb58d818623f6d93dca315f4400af50748a8daab983cbc0af1a17b0303e18d417b11ba39469344cf569b530e894f19da893357ca4d22a47ebdfe8f5d2aa0ea673a398704544fb259aa283a823bf1529df11e5f75ad4064b930c9f4180a12fe0ec279abedfddbae9d90011043aa8fcdeb7817568d77ccd8c128f2185b685bbb361efe5122487f6a8e9b0903e0ab784f085b9e2a1fb26d82924c87145f40b15dfa8f19911d3df14162cd3ee5ac1a8b96c67f4475e888e053f1ce3126b8a8d379c3ebf9864156b180f76fd66b09d7335dab5240b1f5c56fda050a5caed8141c37cb47be124297995a1f895365f353566805a3ceb695763bd969f3ecc4073adc718a4a42afa71f1792fbaa4c7e7e4e6a9442202aea00da540c1e1f748d49120bd6d2f57c1f31ed2255976332dcda08242817101a080b120703e5d889719afdfc93698fbd77275c01d59bd452947acf4e71c1349f225bfd0c813843b6e01a338fd7a75c8e8e7d0071a3713e91e4cfd9d185f0b66681597913fbd6a8cbfec6d8df981f2c62380bfbb08456664541ec0f6654a96528d606f56d791a0624801a1a6ce6b3c5751623d1e8d06170503d48a8ea05f499c7e5841f6bf972ee2fad19b4d30b5f4dc9c58cdf302ad7615f8f3ed0627b9b3d36a550784e614ee3a77149fac57ed4f572db901c80f4ed9342b60ff73ff21a3cdfe850140df71ae480b0e048b050f70e34810c365e89664c8e908d024546adc0d91f684243254fbc736d83b59db0f26a7ce81d6e93473671a339505643079de1bb1dc0605a4050782c5820341e289af9027bf55a73c6b7e3fb3d6bb7f2ad0b498a350920e336def2b7a41a4c95d1aca92cc2b57e7599235feb1aa73acab4f1dd0c7541a604169bff2efa6b1cc79cb78e2db90160461fdba08cd6bf6304501dd27c17a86ce38ce65b56721e22264fc0ad28c39d1479105633af5ac9301c446068fc12d98c7f2c2568255bf379a4100e74fefd23fc1ec86b47750ad67604eabc72f39e2581ab4091da4382954d7765046d9b299c3a2007b4b7195f526e0b8918c19c9b877368048114805390360a40ea9e0c6cfe869524856684d1901b71c42b6864c9ed84f9992bc6158bb8d0aea2cf278426305f0d1b7ed768d9aa8e6c3677dcaa6183d173a0296dc00190df15fc1b5c97b88128cf5e22fcaaa04da9bf3643e0516295da085d6bb1e7b5063ef5259a4046814e2425534abb04b630d6e0880831ba3c7d70383b65acb4b53888deef4b893b807966e81f36fe1178d59ff639eafe0d0cd7e014d151b831b004d6c3cb2fe763c9b16855367b3bd3f9f522a3d882b8d18f6ec2014177bada729633b03d5235562f7ea95d90016d273b9b26833267f79adcaa57fd695fd915a33c94050e9a31607c0314b54bb04fbc8faca55038f54947492da3c61f6794bab4589b9ad472b722b8bc161d3b481034385af3b767fcde2532138626b705c587402bc8e615b1f8363d895fa890da55bbe8c1bddaa01e8391f97a1733055bd63270d25b59c9c0c75fad1c3d7f5776b165e8a210488e9804bb9162ef35341aaa8a7eaeaeb7d70fd5451f5c82cd95a91f56d549ad4c19f3541f3d74cd595f6c294d45978a556601199138e314d1a5b4d47d9bb9abdf23d95c5ed6a47626d3ca5f8ce0bb5f84b7ab65016d64433fe7b9c58a7eed48736f6cdfa699dce7da90f72c3e1a78b458b1477430f98a9afe929d48c8f6aef29758a4107b2a69b9e2acbcf98d8c75b2cb0825a50c6e789e13db3be7a61f02e5b57d97c96526f8d7a1ab94aeee242a287a327a33da03b07c508c842d449d12977b0083e3caf626dda45574caaf4e79471218e85709d9b8e237759bdc4a9da15aeabd9847c2b92979a5e316e59f02d6b5add450f79bca119652edfb74e8916474945b7632206755d6982c38b17b77de8a6b137fb2302a382a100b1e080a0fce36121f3d47f7082721d1fced3dc42ec44d71c03edc6021bb52eab17fbec5bcef272df448f11d356f89c36c5ae35f0cba8e4d8b64263d8784e04066f6443afb464e0658a6b9013c5b1df591100382d878a939d1a940e7d4351552100a477d00a95400229efa42c4c2f3069448836dd9fbcbd81b9a198449f63e123c761a3821684989bd23d021307733e3bfb7b947612ac916c494ef2bf2107af8803394154f4ea8a2804513d5793b50d04773b0775334a03f248382e57b0f1b958e89c3fd638a310d029fb7744f4ae898381a5813f5d8dce759bcc66845cbf7e9921d705a6f2985c12a8c7196c7cd3a79b7fcdf8bdee646bb9cd97add2fd69ac15bc0c6e06bb65d5696a37b4e8d19aca4cbbb6da5adefa56313a92e9ad0ac85edf8480bdec19e2c8319d04ee5e0fa68c84e45063e881c6387a711375fdd1b7973aee94385a9e3e36b27974af1a8887ec7c164c92dc79c53011de99f74fc2b434cad4a7a4b3a49068c33f6fbb720be89c7847d34b79dcb92aaa49b37265c7709ff09d7ebc9966af8edaf5dae173b9c7e7d1438fc1a8bf197f51fd52bc53c1b8ec80b093c7ed5efe6c9efba60721118f576c5faeb306f688941dfbe038a3c4ff6ffa7a2a7bab99e597c2e941f80e2ce07f1ded918ffb803ca1f7e8b2ce162a418a3ad86cf674dced158d69cb799e0ae07e95a863594449c65dda69b981dfd3e78a4c55d20e8df178f7fa82864cfbeb6622f9331288f87deeafefc5177efcba63a299f6f7110c62affc80a7ab94176656c237d062da9c39dd533fe9e674c3110660efa187f018eb32e06179af3e3ce521fa39691f95fe643cee859190fc580cb3ba67e47f1cd450dee80c15257405c8a80c052efb466e2b4eb0ff49e0e9ecb2120a3cecb2cb3f99be6222509e66785f3e422d4e09efcc991b8abd45161bc4dbfca8a974608aca98a519b0708d251cf7d32c3675cf7c8a53c3a9e783c7c9f4a32f224109ea094d3620ccaf726c475ec74d8e828cf59962773a7251c0b924dc1dbf5568c9f147a596b375bb69991e5bb7e37d2f6dd3afcd131e42e1200998ad7ce441cfc7fc38ecf2109ddb379c91492b0a90bb6a6a2ac7387c388227b41b6efaf6877e57cfbbc91bd297834b5e536295eae56266b614a1b12a512e8e4a087f16c84fd297c8e0e5624b22103341ce38fd345f701c21d01d823c572be66896ab4c16d4dc4ae3d0eaa5fdce4e925fac7d29eaed4a035960bfee58fc7ed3354e81f86e7bd03484ac6bfe39afd7567418151a6c6ed6e72cb36eca8c7903f917953e704adfe9ca7841e23579a8210de671f41511ddd0f2f3fc857b3a1af974c868f5c89ac41d26ab0014896c1ddd8c0fdbcc53738c07afa21d5532439404c61c2385047f84d65d4fb2fa2519b1e7f83a17bfea474a8ea7fcafa54f3e22bf1d718c825520205b97cf90de11d4139cb12602651b3a7cc3f7248c7d35551036ec2d833c4a718991498e11b129dcd646727023c88db3d94dd06d417f55ceaf2caa645eefa29baa8dac33224ff9703010654a7bd7d82e7255d2d7e5a5f2e7d8d7b21ea84ca8cfcaacf69f4f97db54b18ccab973dc9dc9a567230748de75efdf9b36842153a194b2073ad38f25542855c3ff47f4faa58f6b75089590d875f688560fca8689ce6ab84bb90fc3211530e92dff18bc5bce8b25ac5ee1c41d4d3dd6075c9a2d45ecdf428370bf8048c045929b601856ed452090d350ac48fb5ab6974699869e0d1699d69e943cda3cf4378e2d1f577144300e98e5fc568f6a3f0d3de3d41a7ab7f34c23e57d5e44e31c38fb7a5a484a7f266f971ce093208f7db32ec6d74f12564ed1932da42211179952120246c584e82bc1ac48807e0abcd6d6be7081d7b8c208f2a20d8971cf9809d4356e08e42d5d36f9503e5acc857dec8660c3e1cb3736f30e1997e895c6b7b2b09a79a43c19bf7fe3830d51999fdcabdca557114a38feeb6c52ca5ebb11f9f3e24b166b82b10983a6869b2076a94c3cdf9072dbcb7302fb414d369ccd7ba10e20b3e5c41b606066099866a41b182568a6d56132f46e87e123f5e0d38ce4474365fbd044dedd0092734617004bd7961d754725b630efe0ec3bd646d39fb04ff70b72be589a9ea2beedac7729c0726ad9539ea29762b160090e01f069b7b4c98f486cf9d6835461c3c054604b19e2b56b365ab9291fa46560ad493b104dd2e4a18c655b9df4aec0f43ec9a7d61439406839646d00ccd83628c540cf0ddaba61daca59c51b0832b9cd6dc408e914d806a7002bd269768584edc0c2f408d92a5a889cb0e3c6115f8fabd021048ad847f768c09f1576a669f5dc0109a4fdb85ab9038c8558e9b22416a0af4d65096edd57dc8b58c6fc01709a2c771f09b1bce9ca6092f390152b5da766e4bac3d18397783f068438d485376ae648a751146760a49324fa1d5d1bab4c8be3213902ddd17e406ec7e4fbcb16c2c770514083ccccdc8bfb84992712277aeaed021e1a02c8035f0f972177cb6e8d3da13c4d271cb05193a2cf6d1b37a9dd3f5e548f917deaab00ae070c9c672dd647b8f8a1a6bb7ca8b64e98b7382a999815a5a3e499e95306a9073db2dbee51dfb6c01d7c77e8d741993de9f4aa9fa27177d905f244fb377a921dc46c5408d38160bf57cae99523d0da92d123eed7d8efcf9a0bc737fa08d539d6db4bda158904a8e3b50789dd4bbb9af309706120bd1d559c73a87223369bb34751ed05bf7ba17bb29c3925c91c5e25ccc2ea99dbe05004233a20a6af929acabc755b49c25faf5f3eb3d92e329c867ed1c6324e9fc140f7a0f0298f3a5779e20e227e29b67243d58af8bdbc8dac0b3dbb262132dcd041b425c2af431fdb05ad47414154b00667270e6713514ca5cd96dddac337045e3dec1f24f6a8ad675ff74113b8a8295178e390fc05195129af7707e19569898692f3d5bd15f89ffd257e88a493ef90820523405eb29f5a40809fcf1daa5789d08f931bc0d01dab493d0a6fa95713876ee1ea5c0ae85d41c38b547bb0e0df63e6c867f51aa1652da9a428337871a5b0380ba6f557607549608e3e53d7a4ee8c60cfee0fd6abba58a52c04a6c6253a7196d69354de7aed75aa5e03648fa69c2bc9df6fb2c91884ccbf04a44814076e2d110d60470f42150c2793ccdffd8afcb1f6b0308fb04e8c1599974599fb690a770c3d8a7ae9c2cb54b0aae4d6cbd08369143fbfa9e102d1b378708e78e911996f276b06449b343eb1792871dce959700cda88b219e3a6b4b958a1aea153b48eb6f2f580097ee16706bcc7419bfb4a857ce7041eb8e107c48901baf91390cef5a23316d063e377e6f5850387bcd5df07fa16e3bb3abc8df15bbe11df3204764817684c78de687ab027a31f84dbec207b8789d8e63fd685a91174dd16fbbc9b880fb6774ab685aa04a6ef41a5610d37d371876be261bbe071b93ec87ae2bb38a9f178a7ad769a63c5190a30648fbb0c0dbf9fc0aeecb977417099312264f17a33acbc993a3e1a0d4efcd88da7fc2dc2b353ca724513543bd0eadbf0578ba96e4bf9c5bdbbeca4ca7d9207e14deb6e9960f51a2fc442cad6957e62fce38bb4440ece194f66dd9e70caaee43b0fc56aa22835aa18a8e3771105e3be696399067c3a127b8e8fdf0847827ad04daa3ef5c2af177aea1259bd8db216c0a33c3206edc78852b118383ef9e5127f21515d1509f57f4f83fb862bd405aa1bc6afa826339f22ae2f150c9eec361f82f006bbb419e3b4276e544f42bbea09a5663d38d302530f2268c1864149071cff20bc975506c2869423e20d6ec3b4c173b279d3acbb51801da6314ccd97e4898557ab1b7fbd37fa1def6619488c78e05197f5c4df99b1cf4ebcc8e88037f85f0a90e2dbe59fc9493112ad5ff8bfa4167b4adb2984ad429cc14aa43ed76cc6173cf85d34849d977415f4f53795a0f15241fedf4725a95df69bdff4b5777aa59f13a12ce0c9f0073d4002c6489c3530310108f6ad17550013879add2755f73e34c71874a4ce3487cdfb04b0214a5e19800abd26a382f05d76bb51504a5710d04351f81ba9d63bb0ada3a8ee4db71a00632ab8e6379ccdd1da819f6a7b1c04434f4ae1de1e8f3a4bde615703845aeeb510402dc93e1d3629a2d18dafe2e2585224fb575abb0f4aeb6be84ab4d008266516fc62d69c43296d15fce0878ce5b7f338b29864cfdcfb8f3b8d03d4f5131cf7bb893d12f4fefebaf48d78acd7fcd794ee22189e1cc656e857906d1d90603e8e2c03766e17483fca3dafe430ad60357d7bb0db4bd02ecdc6c49def3e6ab68d4bc025137487687a646985683b5d8921d61886827f7d08fedd6373599dd99259bc48add0aa4e81c867fba37904cd9485f7636b60514a8705e93f066d6f12f3570b5f096ce8990f37f1ea33db5f1b441bfabf627d72b602924320047a044edbd990b20e2ced24d0857caa36d9d02f088240d63dd43b9ae0e1d51c5b114d868b2ce2fbc60e6ef2f820320c3f77916512ea819ee7402e99b4ba6aa72e622a7996e4c720466435bc0890bf7dbf86fdaa33fbfa7585f4778753569723e46303605dd66303d25784327decf53de5883deaff1c75ff3d70fe3c76f83bbafe1cfbff79e25aed78b1542d821db0b57f983989403c5ab579228183e2715bb9725c1dad7eb5ea2b90c7735966c730b050a3c5c147495807aed2876694897d12790cab7c39cf253f6f6887dc462ea6923c2c90925c604a9fa8cdce03613b93b3de372305bac20e08b24d3ad09e0af3139645a15a779b28c366091abfd3958b576d61fc48a44915950c0f2bef1ccf07fc678c8e24baf49d8cb5509a3a8fe13b867c77147a9d7d49594a383d4a6395d6836d7089d58b29e2b4f27227431e9e11ed276bcea79f28cf3b1d94e2dd4d43f166f908e7a7274a9f6af99be1d4163f815e166f4128a1b5529f112a6dcf4089a91f1c0455135cc2b51e2bd473b5df179e18dc2bd4e720f32658c1f429be85bc1506c7e12825380309c9dadcf8506bd959c03349780d59c6558894ebd4c95d15151c0b400a3e3a83ab0433cc4b8d6c8ff35ff949d86043eac180607c1cf0e04be463ab21cfe32058d901c1cff815ccc8e2f0f16c85887bc323ecb3e1ce968a1b04b0b66141a9ca32c3349373267a89e7ad825242feb5edf306c96d73e651df3a4fea2bb6db37331a6ac24071edf3a1e797c8c0e9ca5c1c7f3e5f2619844b3adf279465ce21a664aad8d26c244748d6be926fdb723f199d4fbdb82c4526b1ba7585ee5f69b7c0254a2a293f7775e85eb1338ca813eb35d96e3dc5402086bd97ef9b383c4c918b609c31530bdd5af317d1257ad578af42915d12e6e50825a58eda8a98436c09d41fe94f265a444d031e90dd1a13f5dbc6918680d0936daf76e4fa297ae46999f7a16ff466d8e472e70b50f5cf1a287d6ee336126eda157bf7d78364bcc4e31f128763e855ac0de2cf47353b059c336a0069deaa84cd9930da88b8ea3aef544628092de0cd874844537daa71d6ae5b8046ca14895631907138fd559f57914b702879c9699881be3b8a8abcc6b99c1ed068f691ec66482a131698959b8272c5d6025e35d5735b38047dc6edaa2938c97d5624cadea7d68abcf61c8cd8caf21fef61eeb3f74dfd3806bbe425d17c0ed5261370c97fdf3dd563ba871f4dba9ed4f5c0793e7b4c56c3340de252cf63e58f5809aeadcfa0905850c373cadd501f9a518f4f0efd3ebc84ef9a28813b9ac52919be5478d833bbd76fa367387248e2a91cff45664e689c5da1f60ea0f8c2229aa744bec767419dc0a86150c575ba416b3b0334b5ee2d4d0434a9bf5c71cd96bd20620d29259afaab65c4019de0c1e8b09a0b4eccaeed8d943ca1e2399d06e88e5b56d27cb9545c5145a688938f7c4b5941907edb32f62375a64c0c118473cfd692a369560ae147d66a2ec0a59fbea460735e276b9598711dafc7cc9df2c37600ddb10af1bbfe9e919a82a3725bf3cdcc7c29ce0c37fa588eff17a009fb771016acd3918dfc1b92bb6dd201008c08a59a4fb922e1b7db26f6138f433d61d6ddfd2c9254b8e7b75eccf49a494661c89997ab1220c68ec4fccb152d9d66849dc416368aa3914aee0bbc4b1c4f3ac6442e9b02ac77ea65b1ed770602df3b4e5df0006126068e9727b6ea4365f95e7246889eb0e2c6403ef857af642d13b8feeceff2f14523ae78b5ba6b31affb3a2f85709e818d6646046e87e0904b6dfc204f793fcd7f541487fd924de3bf293ffbee92360d269a27dbcea413a6ccac2b0c1ab4830564646c594853023bd3422ab3074fb20ec287842553a539554e0c30c455b71ca73ca7e657837b0432cfb79a1a4709a0865d7d3444ee9ceacea7bbcca6500afe77378ec89969893b7d3c7aa03376d512d93ae0941136d7c5c231d799d799c156071eae0750cdc07472d6db1499cac956c95ff8ab9c46d46fe6c39165466adce0359d1588e9d763e189dfef4cfafd664d72ab5015d5fda401af2230f28597f868c600fea6d85be5a72d9920e8ef975a449a6ade7eaf4e058e8e1b9b233508adeab766a86745a4bc5ffbf93f77bc72cf8e19a46c8f153695f72068e24b645ecad90def88ed8c0b395351c0fd2e2016d2ce1dd4fcf3867bc4a09227d86b5528282e381090169cc1bc994426c6ab67e10a7e7dbf695489d13ab1c1570600db9e698a14d0b19020a0e147c2e9ea55a7377e751488b0cdc915ed7c82488f3a2f799944768066c5556c67e5602234d96601d054ee2e98860e5c014eccdd57c464954df632e07c6b4c74f600eb04b2ae879c208315a0a88fa928edf73d2b8e75ca9535521d1f48b2d909dbe1a9cc7e052a6bde73776f4ead567681cd07f1c259622ad2393dd99da619604510e6a8a3c58cb891469e134790fc6e0aaecc1ea6d8536f5576d76bd26c776dc8a9f330f33d0d88840db09e5f5cbd9c02e042176e437c379be2866b1d3d73fdee0ecef3fca72a1011c989d05654e26c7e31af2bb6837018a12793676092e20eefca3d69f5323ae74a44f9c18914b62ab97464c4adb2be6ce560f673288b406a4be5b05ef4cda93ff84fab44ce5145f0b357f53c11ef05b7d0192ff727101f71877a7f882b622bd292956a5c8bb15077db3f199de2e63f18a607755a53f37d27ec3a829092be347bfbabeb50fd163372b809b7fc3b5a1b7ffa3a8f1ef41a18fddffd2b76cf4addbce2b8698a937d7f1d83eb1a389efe0abdf98fffdcbec26eaf889b2b7f379b02b1f709ed1996eaf14ac8acfe04506cddaac95e08aafd785ac380ab9071a264775789a55d6860edf15ce5ed32443251a4a41141049af7b0d66dd300a10cc2224ebca0aa1207b2fe0a6b587a052bcf060aac6d114bd5a2608842da2281c50c0787529b25b4b4e8dcbc7277afc09d2b0e379320587d52f08314f7414f2cdc07ef9b03305da333eee294cff0e890cc7c64c55aac56eb0ac6f27f6feb0bd2613444529484819afb853449107bdacdb42acbcb5d6c64131426b32495db8bbbbcbd6cbe69ab59eb32d7f58ab7ede6f1bab8dc617ddab73ffc890b7eab5e2733a1f0092f134a2e774c83084b1110cd92eb4b7cd5e17b846aadab5b1678b9c91e5c9f7e810e6a119ea6d3bc41c0bd2dc92b0c6f7558450262523b930663eb52fa8bb7823d2aa501e7094d7dd1cfdd179d663fa75c21dfafb54671c4a083c6e3b9e813feacd887db1d527acdeea73f839ccfa37bf1ddd71ad7f2c9af594efcd14dc6b815af6375d6a757fb36ca3e553f77c8d4169cb3289307ba55e17dcb1f5640ff5ea8d62672f8ff610a6b697e8f4dded192dfdb86d76f9be1a9d5aa1c8f7bcf4ee781078842523cc7c2b4cbf0abc95e01242875a72e056b6dbc51410e5d11d04e249acea0607b7a725f767afa84e544fe71d0dd1260eaad9eacb16b5450a325bb3e989b56e8e695776365b993e260f1cbca8ff4c1ad5c8a8e695792c251ba06d779204821316e56d8a247b55d2bfd94b1dc51d1460ac7f9d23e01869093e8a4561ff237c7825119a3b73583d796e9699def61cbee1d0b050c375d88f81c98126e792101e424ad976688cd9916c0d3fac6b8e0b870cee63c71393dbf3335bd3d91bb36f723243057a7634790a60457513e7c05221871d84ce78daf566a71ea1fa6c9608817996a6f306c33ef5b60aa4609b86a98ed129a403e82436828350dcb938fb7d1a1cbecc1d4b6730494811e63be96a898a21d3d0ad459d08bac975c222c26c92791ad0448fa4d9aae3d8fd9da8ae5be27a6827d20f70783d5a13e829ae210525a9b220a48b9fc32fb12f5158293ec2c5a652a4e32623503ecf0835b182de14133c40519c007e66987ed06ed9b801007958eac55b1a050605a9099b663c09b05178a8f8885058ee70d0678ba4ec81e13ac70e46bbdb7d4acb98aab240d44a5966ed1c31dad7a667c4969a0cc02b3386729bbd84c37236935db1e0b0749a8a20e1855aa32fbfbe1fc483d3039776086f0a479a998d2fe9bdce367d9b1ac6795f089059aeb39695d72ec8227920cef0c04eb1d90fa8b41363ed9048f16c86cd41576006ec389c8b66822f2bf9aa1d61284835b6c1b662c685c0bb520684a1ad56259ecfcccb7d85416ed36691a7ab497d0f50e00226b97c7d1c31031909b9346b3b4b5ed4ccbfd3f174defe4aac5a088999a206b8fd0737a426ef945532049cd3ccaad15be33ba0df3c089c380fb6843749cb80002fd752ab4168412d5fc51b96783294167f29a1f85101e42c93cf1b9c6bed214166cc836c04f70aa9ec9b9e27d46855ccdb6e58c4d05d24228309d9e5f4e6ef390d750e454d3e3030dc8026cfa4f1f972a7b3cf108224ea6225607d13ef7e62cca420fa523b166d03b51f12c9d9622571d6948089208c16dbc46c9101083e251ff7bbc4c76cbdfc7563a70f086011c158905dc5b334d1589a142ecf902ac60dbc2923d127b75aefbbefe1d827884dd7a721a4c1cb4088803710d553c442b1d4b5ac732f44b277a364d709b666a1a40f39007572e3fe44d9dc43e58d6424a3be07f62841e3d65d34b8eb331d86d6af43167a9c0652be245321109a8d60be0abc99351b5c8fa1bbd9d25805ca1d0f76633fe199a5d05fb2cc280ab340059941ff92088c60222bb243b6fa7906b922833f261d070ccf3f67fab450efcb42cc3074d82f23419eff74d7ee6d2a37686c1293d55a5eec9a0de8cbbfccbd3188d5042011b9511fcfc64baf3dcac7f98db070cf3983a7365141369c74b449822ae6a3e0b6fa186ad910b1bbcabe84e18372b8509d8eb3e86611373088d2d66cc051d15da040e34a3f63cc657e355ed37552060ddac9dc07193fd4b30d0eb49ce2f6bc2c7f6ac070e204c7a5011fc153bad34613aab3a7947124ecc8bc965ca3096556b584087ac26d04b753b3d940743a51c16caac635ef16b11e7c2e312fec248408635845e88f0e539c2acf387c7bdce51872fe7020daa1d86bce2db23d825e4684f059dbd435235908e0333c43c60d033d3238fb39666c3b712aa25b0c1bb2091421fd3c9453b6975461694552a520892afc9703756a6ab0de751164abaccaf0bcc5d68b1203325231a2f62c1f92135eed3077271a5b19f1b84125aa38a06f2805eaa2010f77a40d92e79b39fa17c03ae00e13b93c69da4ca204f5ac020683fd40ecdf3e93ec07c41ffbafef915c05f90fa017e1aab1ade28d866a4a99c9b8de6e52b2b608fb08b6c9e1cd025e920fad5706910d83b9449f2b8906e6e4bd3ea63b2a1916f03984f1ff8bd2c8ad8e1bb4cf1660e62210aa5d059a96610dd9fe03b5610d8484fadf07d1e1cfdd595cffdeb412bb011bf2a9c73d0abd5bfcbfd1dfb9fca7e9189d7bf77367c846a9c04b26417db7de136e9a1b1258b6563e7d76331f7286ebe53261eda52ad4c36c4aec7d8ea0e2481e6d1a0c079c3dcf8287aaaf8f4b6be981e953f713a26a24e103578efd813e2531d225366e09a6d67dededd2b65dcb3fc90c2787673be199dfa326756b1e812fb3af2f08389d86ab3d9b22e5b4e56211ec43207b5a252e61c68e3647dbfffb8b123649579ef43827f2c86e9b5140f9c7bcf531863c92b13e6b9940c26ecd494de41943ff4c3cbd8f241387d923c0286c23c08d98242cc250db681de56ec0a7cd0fed158ff6f6cebf958db2f283c9017875381b9913cc125fbcad9fefac3e666342f0ac440c7b62e688a16108b79804c14f5e12b55f5cfe1db84ce2e07e6f496bfbf67c1a66b9a0e83f2fd93f0a253795dd6d2016522e68508ea8b13f132712465d7ace5081c4c606eca92cdb87cf59df3fdbfd187af5ce1e423492a74f3f721a1826d193f48efdc22046c510b65612b70c04dd194203953af0defcb220abde505940b0f1d00f82bb5ebc32c6d6c0f64c535595c417cb0b04092057efe9cdcb2e01aa8b4b9721352f7e2abed6c123990718fe277725948a64b38f1373a1e20991dafb314d55cc457af41d4bffea656e9e953762f5b1b7f623313d6adf56f82cbf9b5db683986dfed960e4bff07021d09bc25aa554aa964c9e9203782e72a0d3bf4b625da5cc708a9b47c64bd41cd2d02cd700b78a19028e6384145c7fa2090ea60c591ee288d3e3c1daa4bbea54fd4de1354dd320d16284f3fc73a135c8c33fd171e9733b5d9a0c3a48fa91ea5eb808f6ef695826dbaa5fe3f206672c02bb539a5f15f550e7fd2eb5e325fd7d602bffba54ecac155feb578816efa57e5fd100319b9e7b718f118f337ffe8935950bacf73132f75f105b82bb247aa95351c8eba423d170b76f7b6e2907edc14efc175e27fcd434b9c72000dc94ff9ce9118319e62f39c672ff6e75ede825ebfbc8489b195ba87d8a798e067da6f683dab2c7f197b93c57b2db6a1ea3720bf71b02122df0135ac154f873ca8c2f971c3f39640c99d3ecdaf0892f0b475c555863638c0429e5b5930d103dd977286720acfbb330be6c820e572f135037b5aec9178469f0fd2a2554e0b6dd01df8ae6643dfdf30990637cfcef62b2fb1757b98dedfde0d40f5f262049fcd9242a1fd4398fc89ecf9598a8298f36996d02c641618ac838a99c97227ba74407c68f3a80074c6e586386f1278e5803a1d8dec2e03a8aff3061452cac13adb474d32c629b3c3614f411e3d07787ffda8f5bc74b8da69106f78cc6992d9d3386e3454d9a8914ef193f07fb25e05bd871fa6e368314505dbee3cde069a2a2b6b95a33e40f8308dc2c9451c799a6c622d688c8941f0febc5785ddd2db72737c46d0d39827f0d5882f56f12024a1239643a5a4cc69af60551c4d8cd9ea39955232a789166fb2bffe8a0057154f2dc35415c17bef67c0e961381fdb11b9b1b572ede0106bfa8848a35bb33130f97262cfc48c69ff240b2d83c3a904ba790ec7400bb3b9937166325710a05d1e1e4c6ae6cd2399aa69f1ddebc223049764a2700479ce1a682f73a4e53d83dbc3f5eb56232f2dd1087893033445033ad226945b305855550779c43cb39cfdcd3ed39e09d33ca685fd9f092c9c081c2801834a7f3811ee30fa080a9e403e742c8b70cce05978308a3744b6a669c2f99e6df734dd3b354dd3348dcf92d63b695b57f57ddfbefff7f6ff96526e29e50e2d0936094a09327f83df145184d7f06ee8808029823e265a569acfae800414a1430e08c0e1008fea6e7894c775ec3a07f1b7777bf0ace7fa40115a9a1f7d86050859cf08adf2828dbf61cbcb4d5e0cd597c77c2a545f2f6ff11eaebcc670f63a43f5d50ad5d76b743c3a6996e40b8f3de3d7f8f26cda604e9250ca722ccd56d3149d3475259146332f3cc7ebd801739b1ffde6731ce75f2a46a010f8857e8d30d2e467709987e1333fc3690ff3daeb38cdcbe0393e08aff9d16d5e8ef3da5bbccd613e86bb7c8ec7bc0c7ff917387cff891042b82c7de19f3345d0c7c40c32f8ccf05496c6d2562e9964bcab480c1b2c95f58c085e158f375cc137c15d35a8aaeeadd679aa5c411549699aa66d84b5ca12fd729887c97c4ed7f449de16b96af0ee5c1587e3b9399ca9d3dd1e77476afd7af3b222420081483d270be2aeead383692123fb09572e706a920502cbff707574c78c8183232f8f5d86e6662b4e51dc155ede001ef30570972780c3fc00bcc50bc069be86d79e86d3de069ff998cb7c00dce29cc4e20c40801a9f9dc6cb7e6c7899ef5d411487eea0399407d5a13c4eb151a3421bfbd8bac76c326d7a053b9936cc2a4d5e6bfe1065dab0ffeab277b1df0503446a81f0eca64c9efdc1b31f1bf4bbea2f655a21288446d6fca1cae459df6ae5fb5bab4da7b788135db15ea5aae55ae556b94bbb95bed217b228651e26a3e66b709b97c16f9e06c7791d6ff1390ef32fdce5478f7918fef22f17e275a0de755c26c314411f131478221cc7db9c1d6f5393672d1444bc858264c60ad9bbf88781e401e0383ecc9931c47b8feff0ac061968d09961b5faf1f550a9d4688442a150a8179ae3d1a13caeba570c9ce1556338ed65ccb07918cebf601e46ccdbfce5948308c2d3f105f3a013be2128b82c4682a2a86ec7a33bd7e1194feeaabee3b860b8b25af982234f6f2db2f4a6c6d29be7d4833bf5e02ae71a73305ee4c8debdc4e4fb5d567bbefc4d9bf6376588265f830c3338cdd3a0334346fa2435d030830c3a3364a4bf923c0c06cb71522d4b3ec75f1e7bcc8feef2da611e06cebffc06e6352fc30cafbd8c99b7b9ccc7dce4b3bff033b84c4f11f43191bacb3c9c2145ff67f09dfaf69f61a739ef2a92ba82572de294e17de71d77d52241280cc978994fb8d2eb29cbb22c4b9769182f62b0f3e524242a4a93a7c165fe85cfbc8ed37ef4dacbe0343f83e7781c4e810fc277fc0d6fb179ec380f6bf1301ce66deef2ee311fc35f86f00abc0edf4f5a4b9e27849308e1698ebf7b4cf794f0290c99e44c8e9821237d922021de2593798c86d257fa82c1195e0654c27b32e8b8cfa73023759f8cd47d69eabe4fdd4792ba6fa7eef3e01a8cf1ae2228ce06e3c54832928c2d59ec9587d08123881ec9e832d3a6711efbcd8f6ef3da6bfee53b3e08a7c0e3f01cafc3691ee6339fe3423c115e811fc2f79b376e688f398987393287c9f266f96d95736d215cb94ef2ae2cb88aa038f4c6a3443c3ac4a33a1ec5f168108fca5cc19d7356d6fee6bde69d4716b4404bcab340ea3a3cbb38a9e3ae7a6d52cf5d75d50b57aeff5ce00caf5a52ce906baebd8cf6325fb87251a9d4088542a15028d50b10ef0ae219bac3a3e3f1388524ddc1a5a6b5b172ffb8deb8ea759292d79e7e0cbe5792bf4197f830f40f83fbaf2fbcf6fd7a75f9308890c87a730557b953ee9a98b655ce248877c1a3a901cfae9b4061a24d4cdb56517159b5cb7c8ecfd41e3bcdcbf0968f79cdebb8cdbffce66738ce676ff12ffc65f4fd794d1fc7b8c2f2cb871c0a53047d4cc0f05b4bea37f561a92be8739a82977633f5569d971179d98c9749211b9211c3364590091f8c344d3ff5f4d64a5fbc2b98f3ae2231152a4cdbe8e44b59b23acebbcbde05edb19bfc4af33260b872fd4d4990fcbaa987e4d76b2ff391f5842ba3d15932f54aa65ec9d42b997a2553af64727914e70ac6bcabc8a32d1ecdc93cca1362277914e72a7255dde25538ceb3f8cdafb8cdab78cda778ec5978fe154ef3285efbecb49ff9ccab2ef327be1faf25cfbbe142bc57e03fc73f05fe496e784c100e83c3d3979417847fcac3e1fe38c69545c54d3d976692bb498434932342b5876ba50f3721acb913a110aeb90fcf8097e643262b84348742a8de1655756fb5ced3d45bafe9476779d9cacba4507919f065446442e1ca7593234c72f7faec65eacb743e77c27d43654b8baabab75a65e95be5d6eb2ade15741551732aebe9eda68dc4c959fed86a49d2db8e11c78fb6adc2e48541bc0a283c886bae209e5d1fc7f30cb6ac286eebe0c6abe64a69f238cf4c1ea3b4987cc9f38070122052579114d3865357d0154499cda83333ac956a26859a99118d7bfb4af2e12afb708dfd0be6fb35a27fdb538cb882a80ff59165c1d79beb6f3214dc6432b8a1422dd908642bb88959586faee058fe4dd6819b0c04379909d6eb84f5e60ada440f6f904b1bfdea714471aea02bb85ef1ef13f867bd6e92da21816b45a0c4de015ec18e01143f3109532fd43edc23c25ddcc32cd83f1684210e59d05a45ba189c53c02cd831c02cd84de09da8e70ad98a223dea1f59495bea6fad2cf157ab6ac5e20e67d96aadb5d65a6b3d7e98a3b5d65a6bad750556d1c315bb5debb61b8f236681f6ac8fd83bb8b4ec57db1102d8176e9d901ce42048906c05279c10f2031ff480089b079b07a1d64ede5845d1e8e5ba77f9a2f9c28e1525bd87918f4e8e461f78586fa1fb50ee18d92b039f219f216b9a66132b9f934f132bd5e9e4d3844ae5a17952ad3c3455406c4dcaad4fca59a2e9a4cbca4a6f64ca34d3546a9a6e81984d9843664ad5848feac7f466572b204dacdcfaac5643ab26542a55133eee530e2202e127eecfc90527b7404ea9f5c937968ffcb4f293dfb29face3b374bbb4939f38bdb9ac27bf293fb999aa6e2a3fddd251a5d487723d478e12a53796397293e9e27aa63d94487e9a8e42a53797d5aed21b7ecba6269ab035a4d347a6e7f51ca9d21b774d954c5b4a6fd6673d79d8846d39913ffa6914c9f4666d63292dbd78d51149e210d71e4ccf1e9a31486ecfd3ad694379e949a793ed5472522a5e95d7f2d28bd2f1ce4c1f7d765ecb4fefe292a4b3f5e39d8ddcfc6bc6c83e7ad368678952e4a1be21aee3559bf0595ddcd52545b16bb09fd84fe03c0316106bed6214a7107d3ae56c22ed158542162fa07ed7ea2a47ca3d32628ee32651fa5b2b6a8b4aa5914e533f149ca7a9db343885f60cb60c48e5fe299556703a4d2692269d9ad513031898cafd82d3fa2def72999ff1d9d7388dbcae3ccfc658e35ab143c29d705fee88969b7af3564d8ae24c70ebf55b49919222218b50c6e2654456bc0c88c4ae4673e288dc2b4553583af328cef5e80e8d47776834d425c6f70f4a2ffb61214993e93ccff33c4f3c501cba83e6501e5dd80203db58469379128ff9d4615ef59757e134be86bbfc89b7bc89b37cc9caf30ee0b2e7d17095e7dde03abce7f0eee33f38bc031dc061343cc586a3dce0afc731aeb39467c3d1c731aea9e7c731aeaaefdfa599e04c2e10846b3ef481b066c2011dae99e44c7649843413248286828282828256badecb802a5e4644163c79d990c9054c70262feb2979d9ce874c3860923341c26467923e44fa10e943a40f913e440ead97e4b7956ebde84e8a6ffff61495d1e61bfec428d7c675948be2509c0fc5f9505c6eeb80c6d72ecd0a5e0d87d548d11d16a62d96a2381457b3a2b22265a6aa383129215991ae60ad542b52a8152b60345c16edf9fc781168cf0a70b09399400659407332108c00054e107269a2a02122510ec5a1b82040263d6b484284698701aefdc01422d0e4552e5bb14a31f474a92933d82b0cb25394ce1195aba856ca49d587abea4dbc849d20893d117ae21b05e5e46475b28abd5d55143116bbac95f92e5bb162a8aba51a21c94c283c74ba51749af1e472a2114ac53b29978a59d0cb07cf58ab9355ef05c3427808cf7038c80497d3f11077620f0e221922c55057cb49d78846a1b050505cbe326dae974b556331576cb5623939127b1c34240a200ea254a47808cfb0aaae56a8fa61ce8ab54a7190ec144bb110c9a2aed4152cf552a53e75d78ae22e94131455f5e1ca535575c55ac5d098ce2d4b6435e2aebd829297d8137d2210d1053f3cfb71551fd885f57a620f67327b1128e5451ffc238a211f9ef57090d88bc554986432f57467ad66b1177b3fae2a43e9ff2850a435e5c5a13b03820a89beabfaac862e4d742df6449f0844fc21f6ae8a5347bdaf5e64bdf8430422fa883ed7480b076da15c598f638f857014588ac7413cc3409c0e61608a8ab59ab156ab14d6aaa544bd7b7eed7a1e8ab39ea7b65228be4f2a1265640406e5c39c911355265bb156620f7d3ce4aa38157fdc19c641e28f4b135d8e5df4b956ac550b1a1bc143b0100ceb79281e7bde89a7bcd8f3e199cfcf13a80ba5ba6a24d54259adc45eaf87855e6064f0102cb44a71100ea2d168ac958a9642d168eb59127fc49ef80b8344d10e924b4315c81d2e308ea1373665ecf446b38e3e92668c71dc576bfc591445acefdde57ed168efd14551aca36fcf43eb98deb463bfcd587da059af8b43b03de178b3b6c113eb3d6ad336ee9d73493a99251479ba6872515df39873c6d9c7afa1344b4e66d3369a4e1eaa85329da6d299964ad366a6e1699e4e25c7241f95d290949a6239d2a44e47b98601d8208ac4559b30843fd8025934b25738f188c4a71326cbadf179474261707c82041e0883f88783e020b69b92fcc9fd53ffdab10d614d0c85c2a110180645b73cc25a4a4893b9182b51ad4c602ed3888a17aae2a2d710d6566ccfba1d07d98f85009ddb6f38c88a7f291632d32c949bfc36fd046ee8700d8f24e96d3ccf569ade5afee9cd55150791179762c642b0cf79cbbb938bc7e27b449f38c9f23b4b601f2c8e7b58b098f5c9631fc63f5884c12e0bee21ee763aabacb192bf61cbe9aa1743f5f4d58fa17a3aeccf503dddf5a9503d7de45fa17a3aeb3d5c39cb503d5ba17a9e2e965c2c3959da599f2e965c3cc7130a0f9d6e14a1663cb99c689452f10ec661df2352559e9ec4f3abc8beec937f8052ad22aa4d9ea8d0976347ff1279a517d87af11784674243c0186417cef0aa2622500ce2763eaf7cd6992250b88259657e1212cc4ba62d5d5ba91bc4f50aff58cf3bf99da4467c259e7c9833120ec1bc995ba033fbed0699603014568a4248488a3b749e2ed88b406210518828240eed938a540cc2422ba0d409b555aa97eabc4f9ce6fd699954a908243bc152f107b4da2e485d9f942aa34c9b86a588e47fa9f2bb584e58d2abe3dddcedd9ed7ce6ed5d15f756fb84e3d960ab95bf65895820b04524ff6a44e5da4ca0256952e647ada88fabfeb82af6f901c2331f9ef5b86aeff5765d791bc4b33f95b74350bc5ee3789ead96bbaa8a19580478927c7cb9877b0809eac1b3ddda6ab9af2f2dc064a12c16cb6fb2412c9005dab098872e93e53f9ff8f9d93119f9ee214aa9ff619f773dae1a4bd19c5128adb244643e72d2a661fa2f0405fbc8671faedc73559c7baaa04b137269435c70556c7d7cb60301bdc8494b1292e45d9a9ab6dc937d5c15e71e629a77574d2953d7ff9edf5c559f579f7b641fb977d5dc638184add4fa7cac7bdf8c61ae2250b9ae5e04127f2f0a11870ce19928846741ae1a7455eca990164e1faef687ed892c0fdb03fb28316d4f8fe551b981b1af5e07b627402e65eadd5b3954719ab9eb79b99494670f51be5369a81da5653e336db298940f73642a4c1d318d21dbc0abe1c78399c355b10a1306bcc6625a85695355d3b6da5bb5f32ec6f56290599a7bdc19167f238e51305ca0d4d9ccb4ad7c6f95932e27d7dbc0521a51f496ceab1783cc56cf9b39ec79278ef259c5e71e9c7b78e6cb4066232a5c7f2be5a97094eae4ec779698a9d2300ba7f5198a69433999b255a8adfe89677a66f22c14ef33b32502e119f6713ccf5b0bc58cd1b28abf7d83131498941815a099d58b27f167da54a948e4b4244bcaac56abb156aa5a0a55ab655f512751f47c96c49b5992a35bdee59f153b16711021b64733018220b667b483e4d6a084892e1c79e446d25a710927760f85dc205715b26fd0d6c106b23b8e3dff84358b01c79e7dc29acd800580b046f408693cd076708063cfba90b600c79e73218bdb2de3d42c38154424ecdfc8013ce6f08804767105216ddcf5e0d807c70f706c43162f38f61bd6d870ec62489b80bd40486b404893008d018efd15d27e70ec1ed222e0d84b421a04c6f406b9423270eefbbb42ae7a5db64fe04d5c021fe33f3c8c47e05b38045ec61ff033eec3d3bc87aff9ed69dc017fe33c7c8ddb0c7c0eb718780ab8ddf91d16f80a38102f84db0bfcce1225246e8df89d9d168f79035e5267808bdf18d7f7053c8edf1857f71ddee6025d9aa967eb20a49992d83f5c33f5460e84355313c61cae9984c6dda59980231221cd6485fddbbffddbbffddb3fd376003c89c7f0a9c3f0efebbbbb7899b3f898af70594992cca58b8bcbcd832faf83c77c0eeef2087098c7c15bfc017014e0b44f80cfbc7be5bf4255e4e65b11054c9fb5054e6b5a6dea9e9c6a2c051eda22cf4634e2341f8b3fc2f2e6f58ef4ba27095a944deca468fe356da3741be1d43d463145c289e8e48ace22eef1f1010873f44ee854f3ec8999897f7e34ca114eeb3805ab983631dd4638ad8b2da2ab983ad79a36118a13035931b1cfc7624f5658466d438e368f7758a7ebf58cb71cebc62e72bbeeadb7d676d45ba4310b0a895b706a5f29c937c56c3dc5b4695285c5a524bf0c02813887713217334b493eb9ae8c38afb0b88c827ebf2121a1984c84b5bc8c46634c49e2bccdb9f9ebe3f301e1d9cf55713ecc29cd17c315932cc9d1f88289f9a5247fcc3025f95bd4168d29f5ef0aac18c7843297a4cb54c3c494f6cc3e53929fb188451bcff8ef8fdb0bc3179c8632a5a881f356f2912fe6e7d9a457876736b9db9302bd8b81d73d043d676ad8858e607b8e4edaf0b228c9bfaba8c5d12ec2386e9d8e806cdb476cb924cd9064ef999d5c916d3c5b22ecee10ce5bc9b7967c9776cbc11cb479dd23e8bc3bbb8b1b59a2631105eb4deff04def4a311d01ad684c149770bdf9c5158b79bfc06c9bdcb3cb365f127267d7f3ae9577272efd6c915fd0861a26666b9b1bddd33d7a57faed17ad39e70c33c33d5dd116b58de837e24838136d4d18b68c7ec5b1f4cb7925f30902a6ce2986aa287abbde7c9863f32222160814d7f0d2c65414539280a41f907ea4c63676bcc1c9bd600e9ae48f2b4eadcd0ff16c1013678cc643dc981813bb8c29e302dd9fbbb58c5e3db05e9fd13238ad0bae7a7dc6b43e3326765a5e47adb5fed16a25cdc45e33655c71fd897650ad6662a7316560dbf3adb7c7f6d0ac28694cec2bc6bcf39d77bd79ab3b4b9ecd95af91780d82b0a5c7e8b58fde9d5df7594f9fde852b3e92ef464ac17a7d057616e4db55f4bc1b1f8d38a51f9edd92cfb65cd7389fe3071bfde3ce6c8d068106a29160a17742a8d9baa6e645469ca1d9d83c0f9897039e5dd729386935129004b4ee03d22fff8c608182607f76607d6cd0c239699665344f5569cdbb5ac98767a468bbc18620bc6a8db52659c503ac380d5744d73b1d621c565c724204251faee95d38bb367e5d2311d66cd21cf43498c41a1c400d762df970adf40b4b3f086b19df5aa522acb7a484f5ead24f05e1cad54dd8d9d5bb3b93c28f094046c83e3b68d960bdae61b0cb59ef7250b5de7250ef82a0777ad7f4ce8a58939820f94a42a52092074a3f928ea48981c69c315a61eaf8aac5cfa12834435554452f01c155fae19a2a9ce93649b7de140716a68e8f35a64d845163baf8b1b1316dd85a1755511ae61e36a62ddbd8e89b22a7f5bc967eb89677e358faadd7714c9bf8230921055d1ac62312708bc62705917e2421405c2bf9ee88b4aea68d84718bf4bbea25af59f295947cabe7221a97832a4115937e2421a4207204cb601953bbe85ac4115bbc5ab848b9b0368e6d70d8fc0d67a2afa6ce68738fdc63dac434efcadd7a3dc71c8f385f8c44e38bec349ab0642299a589348d44a3696b533689f8da1852f61290c5b53548826909bb441886611886360644b420aee14806a3cf8d6368fd62adfbfdacbeed838c3bc350b4a50c63b7d9ade85b712a6a19b697943dccb80bd4230a1289824443ae909c87f98b7f398c47ddf6d963fce8359e86df21baf4312961ea25000704e4a0438d9a8d97152e2ebf655c8edfc42cbcf09b4805187e139d60f39b888418269f690aa621d3164c416f6139e1b64d0db11b66525450646aae10fd7788f6db151294de2137fcce123298dbf89d255646aff1ef19187368f8cccc6f8cebcb6b62505f01e337c635973eeb7553efd2f6ef2a11d2f60f42d5876b3bc83485b0367ec034846ba36eec316d21a48d49b4a839e94df517e9cd5b30d25bebb4a5265f8cd4e41b7b27dc25c95be2f2f52f6e49ea5d96a56ff605f0942780a3bc005ce50710f300f06c83b7bc01fcc501bef20ef0b1008e02a0a565b5c1000ec8f1e878ec00f0680f128b0ba9c4b2b58dbf3edeede1d9fd31afcf554b30bb6421b990509b1a62299f0a55ed2adf0a55ed28ff0a55ed32efe18a1ec3993e43556b91ceaf22274925b93f6535894ca6cde564098544dae76c2d9546930df23c452c2b1c01bf00c7e177f004b874f806a8b001ac61c22b802257031eddf5f47c3e1840638fe32c4fe32d2fba7104bc02fc05efe0fb4f6ad8a8b1c2856de0dcb0e89d2469329d2a6c280f8d43432b5d4984f50d36ba6032f6c6ded81b7b636fecad5614c785fd24ad998f98b61427ed89e2a16993b1d1f81ab0bf3b97e7aa3999189414c5dd1495d9eefab83db057b9ffd77f5e0d1dde53cfe1d9c5d5d001c160a60dbe4a477962660cbcc68230190e8d49d11eb2598ae6662f83a77c0c8ef22fb8cac3e032afe3313fc3e565b83f0ddef233380f0ee341861934f8e4501c1ac3a33c303caa7be1511e3a8feed01e46c8f8944567376d23abdc0ffb3075ad2acfb3e1f687672426cf02e11990150a0ab2403bf4fa308ff687677d4c4c4c9bcce424b6d25d5ac8220c57d284c5cbbb7098c7f19817b95c875f80e7f00cf0fd2897082777040edf00dfe16d4e02def6f0ec0ecfae37e0adcff6a0e8ddd0f81a3e7e0ccf6f73f461f8eb5f38ec737c870f736e18f0def31e3c73f1ce733de7b81216a4abc70bc59d942c5ff396a761e12f7fe330eff29815aef2338ef2359ef2349f2900cd0ac0e574bb9ed477ae731ecfb178c721b1f309577ce46b081d820de5a1710835a443718fe678743cd0dd557ba4d846a29a360989692b89fdea2c8fd3c25ddec50d0b9a170a5b5db4c0416277c382e685c24acc18794d7115d3a6e22aa60c719d3919aa9434bec6caf368c4c0e48e98c08d33b441d11cfacbfb8ee390d8f958868ec88d2a331b2e9ce56fbce5b1fbe3b8cbb77004fc0e8ec32bc013f037f88aa8c6559ee6283fe3295ff3d9afc8e11720fb1a2b6cf87648b0a079a1301f0adab9331725452eed56b285922dc882382ffbb9f1b1a079a1b073458d3653e3c25994471b0c58c00e0af0e11879b5e78bb398b615673165882b8cb9fef36ab8ec79361c562346d793848dd008980b0c6fac432f10ae1411b65c7f797407cda13cba1dda83f6505f021ef5618149515cb9ae3cef06ffe7d9f097779e771c4cea391abec3b39697f9b0b40091ebe82f030a57aeb7a05229128542a15028558f5c8d477178c6a3e3b17361d92f5a612fb217cbe3c2ec1516238bb971f7eb3586c68e0d19d3a692a2381b99193c1736e0d97519b386abca9830e0d5c646e6e5c5b4f168784c197bed2c4ff396afb93f7697a7f17f91bf3c0b87f9151e13a7ec27ad4b7e1b3bb0c6786596f5e1591f10b63f57dde588ed8d2753fed66adaa2558fdd680749210a5240a1542a7349ca4c78821386f28a3572d6e7f8219b481fc9911cc9911cc931a53b995679c4b4b894aa24d24b9c2214ef90c355b1100fe3005e660da67cb239e2f4305c64d8116746ad4e244b9552b929653a79cab49d60999563a64ec631ec123355945beba8b7e1cac963a60dd584915346a54e59e5d81cc7711c497a0993ca945342826c2826b84c5bca73ced964caa66cca281737b7b20deef8cd5d9e4b3b39f656ea971af229a1541431646b4e750c56af53f0ba309bf72a3321e75269ef1513dc744a43d3662a91cc921c89c6bf5d21a99fce2c20eac68ab8e29a73167bc059c499dc18bb769dcd1876843919a7e5113967ecd85ad2749ace92a92714b2d29c52a8b334e3b66e6881d0d8f3e424694f2e62e0bc5920eb650288aae597c57215cb4972c4ede962390ce6a4cc477793c449489efa97b8c968dd7e66f9387a0930c4e5d0f1c3aa358ad230f2d1a637944c75466978d5315c7f58addfb4a34e92d66e1f45ae7d44c9544794eaeca3977fd3aef26cc64072916773865d493ea6d9479cdcd69cc1aea388e43bf5110f4d1a483ea63d905c94f650e237c4db4e6f882b4989abdce46fe2fa8e4d18583efa35754a52f1aa24a9bb7c4c6fa98b577d195c0677d3fd6f44aca675d3dc9eb58fa68f6ebacb47d347eb5ba73797dfc031587e1bcd54e6aef16536bd91aecf6e4f97e7d15d9e3d36e631e6e35aba4d4db729aac372eb2cb7e96db492de03e9b012c67218e93096c3604efeb0da91c873606dba8539eabb2cdd9a30b0744a87a537d2cb5bc2fe46de2e0d58645f5bd7fb96fde5a3ef81f495c84b1d9b9e57354b1a4867f92da737c4954c61ae721738f627aa72d2b4b94658eee29a3aaa95e52a1f4d5bcb59eee2b6de06adfe66d7951db2f2714c6fd60a61f9cd0a596f90d0ca5d6017d7feb9ae7ec7fa637f547edd06e51c2ad52e2d10eb021d4b386ff6c732b15ebf4c948eb247e8b8b39393b84b1b53ed39e7f47672727c8beb39c727e2c4e1704594d94927914c9b8e711c738cc8ece1eaa319c30e33a7ce538b74c6638e4b3be12ce6d1c511d5d93efa4e5f638a435cc575647fec135705b2434242392ecde6561d9716aed6fe641a6e67341aadcb4f38fa1c3ab48bdee274ace398de449e43868eab5e92494a4b1a46376d24892cb9ea75d35d645731c7a58dfcba8eec23176fedc4478e5d4ec6711cc772cca38a7ad5abaea30e5cb3b8db5355a01b06c36014a7b53b4aaefb800c4b6e25fc03faf1f1f57a4a3fd891a3168d706c6e4a3f31ebcd425f7b6c6517395232dd88cc92943ac156a8d3c606276888480eca4399884864738383f3376ff33abe71d9fa70cd3d640f49be206cb94ebe60bb3896842cb4cf08598c7c7b0c355c1ae9db7d08599cbefd874b23f9f61b9766fa76ab0b59987cbbdd29df25dfa8ef93ef0df3fdf2ddf2ed77af7cbb7c9341bb66b3d879b77ffb966dbb49e05eb163bbe4d934bbd4eddaa6edf2c79ed9a56fcbec985d06d930bbfc6d97ddb24b2936cb2e817b65ab6c9367a76c53b751f66c9b3fb6ba4fb68a6dfab6c93683ec924db2cddf369fb0d3ed6410ae913f3564100b5288ad31a3109a5108c27a9d04e25ae9b78204c648208fad29fd88390dcf7abdd4e15a69aca5b751f7c3d6947abd315806b135251f30e40fae95743af2e7e7876b24a0cbaf450a5b53e229f1acd7594a29d6eb2510d748bf125802796c0d498a141e1dae917c28ba99ee87ad2105517f9054a4bef52488ad21fdb02dd74d82acd7cd1fae9940f309b686c4635b7625e96f254979d6ebe9137e67f36e148d38452749a65539f2c24eaa8899316cb02459bf2221e19175aa92129e9ccb39d6a74c4c72c6651ceb51ebf6932227a6180caa306da7ab489d5ab468e1abbf31ae530869252184eaf5d22f0777412184342d8250255bacda69b0ea17aca4c53b5ca30967faa6c7dce2cf6f852f0f67da45af862bdacd570955ede5bb8432a1aabde4d329abf65b2905ebd564f8b36622501666a5b71d2ed86bf294220204a270f48fd5a762c47a933a9b993693cf504ad69fabe87add3382b516c52171c8e7aa407c3d7a7cfc085796384108d6eb33522d595f5ac959c97a528cbcaaa8a8982a2b2ba6adf41553c65d454eae94ac2ff30e977eb6e53af6790dc4ec957e62ba225229594fb2b8bca5a55c995e9252df3ae52131ef80eb4e1c4939ca5ba693782d1c07c76d704acf794e8bd486b3d24d6b8947614eb952bef611aea05e97206cb99e7ade7a9d6462d72e0a514888f5a275cc3144677431c5a020d7f36c7af47ef8eecc275ce9b9b3ab773fae9988add12b085b5a8085f5fa8b10f1e752b27efff8c0983cd1e70b220201b15eaf3bc6d4115795933025eb7388679967938a3b51f7c3147bbd9919d3462262adb51928538e842b0eb6f930a79583701ec235d22f13b135245f501eca446c24208948cea5493af3cee6068774d171fee66d4c25df0e9280d96f242091bcc3b5704c53533a9269ab758af82760571290448414bc3418d3b65f467f19f728f2cc98624ecc6dd724c93c5129f45482bd4654ab96d39832f4faba47f5ba47e987add120d07a174b7fdcb505eb957a2327f4758f920f58f055f251ca4a9c3a5cd33b9d2e447b584b6e4b2ed4654b2994f6c1835b836b69032693f49382f4337f529c6449f205496f1ac899fa828c44e30f928ea4fba14d20894703394d2089272bd13284c5b3f1fd7a77d51efdc3a7c9119b54fb486b3435edac17553a451169d3c99277b9977dd9a734a64828d2dca392a666e33a920e58f2917c2460e947a41f26fdacb5790de4ce763d74cf4afaf92038daa2358f56bd47fb77c9b745273d269f147d295445371f15aaa29380b8c61245dd33bdf62196a3bcf7389a36d3474d9efa7191ab0683e28e9887b0614bc62bd63e404e128b4c14f860e2c7287e5ec5d4efb045cc2491a9838758f10d574e221fe1752472d294319677cd245409435e470f2f6d2c91085748321589cad2db1545f2d99a1cb42d409f11b6124eebf31a88de99af7d046d8d5641d872dd099f784a115948be8323ca221e47daa6bc214be669dad9e6c770b6bddcdbc92f09d5fd0a67db8adcbab5dbfac88a30110cc4c08cc9e7b570114e8b14ff7818084808075d158b7c14895491db7c2a9c893c9e7aa8046b190cb31a3234000000000000b3160000181008040483d1340de24852ed1480146ba4605650974a84590cc3300a43c8186208010410006008088cccd40d18862dc5f935fb7e7360353550c2f5ae1f5435fb845eff001653c7899afee19bdef63d9e3aea1e193328a402ab0518d701f0451e892fe53bf923ec9157b3f3045b09d7bd08469f7d515b992a7987164aed86ea1e3a722dfdb80080a8452ef73d2c02db412d10b29768c317464a53b09be44fe7103fb5ac4c9458416a5ca858ba15e2d15b6b45d96fb503103342662f9d01601ba2b387acaeec3795c457e9c72efba998e1a057e441baec9f8bc40932199c5442e99acef6125d3dd2fa6c882367bf9f62a78c1e641962df0965f2fced906efb9ef6440aed2377a987ad0386ced44514edaf847b83b9080e85e825193c1ee3164c1eb32ced37bca619f9f4715b6acad8b2d17a5acedfde7425793ec2e511628c0338c8e1e37a9ab08c732f11ed5b8c637a8d52a98721f892a93c336aae6818a3d573f46c43fc221894f0fa4ef812eec8f671a0f98a90477e75d2d5ff4415877bc8734df3866529c83b735bd0102400fb8215f7a67c3ba1f981e27c392d656c62d9f60bcb07f2cd643c9b16827ca19669fae34b1bc750435332b9b90fad4a83d1a14cd7372737dcaebf3266276cf65b91dce930e04028c41637789767c14bd5f515ca2fd7969727b7baf780ce1997f73aa05797fe2f863f17f64f6dc3051932fb133a9a55186f3dfbb782094988bc9803f61cf6c3f3930dc9d92f4beac76debb09f21307a30e982e8fd79194bf82dda05cb228db62290a9c53cc04ae364e8bbaf31a27ba15cb1bf190c5f3594c1e40a6303c8df5fb27fb620f06777ee11263d1b51121b84dca16c142621c0aada9b60117ae422614c1b45f008611fbfcc7d5b4290367fc34b2ea44e110864078e4f5523385dd92c93ef12d900833e88dcfa29bf7d963b4feea0d07b3d8d8bb6b19c75c1c71b1a0fcefaea788343eae57213f34cbf38c0b6100a9e9b19180cddf56cb17b2317c226eda212739a6fd0f233c6495f0a411c3dd847b4378b034b4e96ca7f05e07e400f7c512c3aa4f4f52ac62e8b2af517ef50d0f945801d7a80c26486452f8dd4e450d533396e4c0139e928ae8845a7f0839890feb7e31bcd1da17dcfeacc54dfeb2ffcef5729e5b9b496cbfbd8c11fbd905885eeded3eccc7f39e2f023878e131cd728bb390d909306f7b3053e8b187defb85c08ee2220f97e04746b1cf11e3a3116cd6b4536eaacd4155b64821a5f8e6c54ca5d7cc28b66f1600d9818b313c977d28255f45688a82a29022a22a5844a6b1aac4d0a05eadac025162013515051c0df4e7580b501870f03f4b7b951f3ab0d03cb5606189e72d83b7f83dbed5b9ec30876a52cf38a701b1cbcc624a44ea9a271167b819ea213a731ff355075b959b187dd42788c50d1aee8a40ffe4e1c872daf2957dfd25a712692bb185062852cca74d4401f2e7cef7285bae1c6483696496fc3501e83040376ecd330995586829c32a64dd135fc1a33e8e6b638152bc6bce5f963f99820b2f9b1d44472228d4d003780a81b4800794d3175862859374e775ddc060883baa146048c9d7b9d56042ada0b4f3f428f0400a6474993f910d1fddfe69b922f4245a09dfeef4531a4a0cb58d50edc15ca891c2c3b2118b6e88950d1c0e102418e5cdd0b5e6b850d92201c2ec0d54f4130a9fe177414555e057840114c51ef98b8319a29230c45264345e113751a2acbaf7746b9080769831c144d1ae7646810fe69c03312a895968e642b4769150f83df087e435e54e9b949ef7bd01bb055ecfa95e8ff0ef613b9e6ab0f2817892d669d89a3ea7d43b26ef44705bda9a1a2a8b906d9c2bd9584e6aed8a0fd824e87b9fc254188869b7fc53e70c2cbfc501110927251003491f24f6c2161cb6263a11529ebe023e7f84541508d044f1af5c5277bff100b52111501769e28d9f66ef8d890affc777b5b242a62910b512ad12532b168f6e764989858e90a0e6043c8b769126562c73d1c7254aa80439ec49eaee890917373e57aa2bc34ba7b3091cefb7807445aa08804e0d46ab008fd9f7fe800edd0344df52a1174485b6c88b3958834658906e5f3690460d91cb5846985c1a442e6952f80b0176a8928ed5e1261319b8c23726bbe2429182248ed505545051f3f03b83a4d3be2e0d7534b6616147f30603a63093b67e3b45d5d2a03fc16a222ce99a7863acd9570bc2a488a847691ea8ce48e099e113098fccc7526ae4b754b9e3c50c126e5c99e037c170e5188ffb1284029a849999143a38a70eac8f2cf23da590679956f83b365975390e47f202a216f6b7dd01df846b76bf12e17dd1bb110ae82862a42ca524f150d67eb3a7f144fa1d0324a8cf497829352150d2812aea989f0af544a49ed3dcd1be8a764e39304122067f2f0b22ac00a9f607dc781d4df02b0a6683fe855244d0f8d50166d930d3f6eea54f900364503e01425edcfe3db25c6d89b5a0bc4023c21e853725c0a204b2573e7a7cd7a52c25dcc2c71edb0bd9b322d6a036628124ff8dd0e244515bca1a22852e6a1f47189de5c5e2155ab1e138023cb4052e72b9c83f1f669d761a3aa563d2cfe876ba5a5ffee072a2221c929bd50662d000e53a47e3acc43ab63fbbb34cb5c841ea01e98883c080c716c02d713c404e8e32420929c044d2811ac1698abcdd23f0e5626102b87755d2f6737d6f59af3854476512a15400e5760dd6825968d6495523d7a321f52cd797258bf26583f4c85c58751b78e9444924c9b945b8d951e8613953abb3c5bf35183394ad547c2fa2caf5a7bf38c4094cf126cf610e27e21c94a9e4b6e4c4545de7062a00e6797bba308356acb318242b0922761754c8a0c685038f3e6efaf64cb1705120173a99a45fb290a04287d743cf29225547287d7ee6ad3d43cc8e396be975d777edddc990f69228d04e7309ec9644527e1c9f2f52e3150f0132607764cca35015883b18bad12b7531883ea932246004f69c893e57ee20fb6777dc61032452fed65bcabb0e1d4c04f5dce668de4afe97aeaf64a2a7fbcb586a55b22f169bbde1a5d914a4ffc0889a8d636496971e653cfd86e6fae38d2f8af401139328778e93f2b0ee8d0fe5f715fb58189c19345b10e23e9f330bb28fcc5798a3688d05acbc79c04ced0435a75e79c22e01542cdef70ccad17d2404bc616354cc4b2f411938bddc0d549c5fd85dfc2689545b75e8d281195eb8b65294873cde6bb41b4f2340cb550eadd1ecda8d0cbf2b839f2a997f3c3c339e37e60c5e118ea5c04c24ea1804d03faa394a5cc099e33ad14900e4339c80ddc7d68108fc968296c73b430a8c2ded3761aa8aa48b52e58ed136bdaf298425a16a361d5e764248db952b23264c5b29efe97dd2a1e4062d7ae008878d66105da48863eec8901536804895aa3c3b71aff5c0341821a133176ff4865be86ad25bcd21a14f641cc55399f27cb2d5b79a9621831c60bbed3eac2d7a15e0ace730e432e229b2ac1cf0f20c09b5bdbf9b79aa9bf4aff49a1ab91e113b956a8abd9742d8fba603377d967897fc7eb1bfa028ead453747d91f904f79eed52654236468d76a29be4b3acf4c19d847ae48b59949401d69f8b26f885d234fc0ee73bbda0d5d96ac7d90205a1f82d491dc3519275b999ed4ef4dc26c421ab87b4ad3530e46f640a6ffaf63a8e3f2a4ac7bc62ea20d27e0ff333b68b45bc36e85d0af10680ae36bd79ac55bcd7ab04028f858ea876f98e7f488fe0cf18aa113ae09116ab8a592c2539a94942aebcc2526fbefe7e1fa604703ac55b7cc441faecd6e506a26bced636c2dfc5b8d206b50155b72730c822aa8e18fb3c2e2092bdb6c73f616cec5d48f654e1e3512b3554c1284465bacd2077d4ee3642b6b0c52ab140b51945400916d8219d1bbc34454d63fccce62bfea09bf3dd6f3ca38f6d66646f2a6a27be26712d980a93888a1ca976553cf5638e234d0c6601f759e15f7069f001641de1ad15cff2191de6cf2fb020933eda496edcf01199786016c427b802003afcdd536cea6c23803354af3a264b921e782d423e4e827bb5c9a81236dc25225e7417833a357ad7ab2fc419660151fcba26076b380f25e5dcf34f4bfcb845b0011ed0b29caf21be80a1bd1b7843119eadb4ae74fd6ecc50c5ed69a00ee552ab693fc6a4f42369aed8b69caee8da83acfdce46ba43f2a985b99f910ce32b772c181f58a89223f1463ca4f3abebd22ac19bb2f487ef523ddcad0be89f3e13ead62e12885ddca80dd990a373d84255ba53cfd28d05e7d6a3858f4919549e42f65f400521da3be1b129d0c2e730767a0d49d2c08f8134095509a944f1a8dfd7b8ee20fbc7e2d2222f1275a760675d5f54c4035c6141d5a459805a15adfd8b2acac0bce6a1055f5b5250b1ced957e8c2e65e00c4a16a21c7b1bc5f323f709de538185a9bd4fb05837861b2c3fa9c6d8a2416876273f534dd8ccd80eac251366327e971ddda1cf1f414c0c0280647acf0660181acdaae87dcdf30e9e5d7cf527fcd8e42778104178b85214fc45179a487b0b0aba7a2ce3c9c42852e5693091229faac719e9e3eb7485af8f45a5cfdbe02c41d0678fedca2fef9065b36b151e2d2612138c31b161dd084bdfa9d6af8d70e8334a71252af3679c8c77f31fc51508b78f09e44043b7102aa2b8f28484210a8368cf6edea0c43102aa73252414cff2a9be73ead31cc93f5cf85e992a4ba16ce8d2ab03681b3e222dc1aaf0a173baa67c4cff5c72600e8809388be24a9db482b45eaeb7e7af6ea606ba72bb14e6fe56c2e82d29fcf66536f9583375bfbe4d572de1bef5a68e895aac6c81b6a1687a59ef7335b8c47c9e887305902876b2e046e68ac6762c145fa5215bb59f9e2f3cf871a6c69a52e06002c587761fa47909c281061e27b962e6e0c6478344d0c977f8af5e738552cd7fa26aae80e7f2ade661ac1ecc1715e2d57c92cbc0534b5123c2a1bcfd2ef9d0500221c9cf8ca7d0ad01f9a08d5b5a601bb48d4ac5de65d379dc13b62b5970581a0fe622e123c61b180037c5fbbf57835df65843c1b440e5232fa1f6f3e6da5de468cd15d6889dc2b9a2f631e953af0dd272bf85992b162244ce32293caac97cf049fa920309d5b0d554ced5af2a17eb2ae3d930e2ae467c8fe8a8d282d9db791e77bedeaaf7307e389da300378a01ccf384588c46a13cc9e588f09b97893582055b8a32c293b3dc2f4be67fa02ac078406330b95215f75cbde3155e64853aecb992c6d821f4028b0b2525d4f15893c32f71f188fe8f84ca5b7713916ba1b7a99ee5dfbcb75d385084b92b826775b2b074cf75aeaedc4a617f0d98d47aec440e9983c28643a4a9665ad46240221fc8a80933944a9b07a6d0867f3b7082b27ad4730b964f1b15d1a300d9939f63d17d2b405abf599a6405bbaf6699c014ccfa2b480b02b9400da1cb7f38f7476ff0fdb31cc881ea4dba12c8d1f330d31a871ac86932a4685e6b1f448142b6bfa60b80caefec77959bbc419a7400270fe024e30589120c2bc33988713f4c2115a0eea08a29c2ec18307d2160b2371441f93e974c41597a39724f551cfc38037dcf0955dcc938fdb79a294c7437c40254b1f51b596aa4562c9d2cc6529896324f0790c7c08aeb1007d3d0ca6aa399e2f93326204340b30eea28a3dd040a78cd14d9552842ce920328804b2062012c36db3012cb9fae1b5107020035583c94097056ac83d9486087d7f3d6382408deed0269e945c914a81f950f7dbd536f8f6e2a253c3c192d238c0a63d6bd434b06a0b308b14c20857d94551437583e9bf824058f585e780f7b4e13e400551a449ce2d93011c990ac3a363d37360063c042e40f97de5f1462451c187a0a1a276986a154e9539277ed5d4ef8d67f0afdf7d565d93580d4447f25abddc71ea9d3d976633034702a7ee779723147ae109d1d1689850e8a26099985f9eed8210469ac21e1015a70586b06b1162a8a526c50a3b173143ae1ec1b48426519914e36e3e75838089292457ae234cd1f8e1cba5aa8f802a2a0609107c94d22cfb2f175d2733fefc1c101053ec8bb416d7845bc09889f47b141da438037bb412fad3e591c2ae2e67e6b9b533681a1762138e10ec4dc9184df278d8185bf8cab821bc87503f1f205de61871acdaefb0d5790cdca602eba7fea8296667782af389f887cd8b22e035d1157a3fac9970937b6d2bf96ee0922940bdc3cfff01406a2af6e73f06fae7030145b75c0d317823d7ae6dd860f63f57fc50ea62fe0f67f49f5917dd4436fbbe0685c48d076a666221128fd5c14b359bc5194a9340beaeb8ca6d0061c4cf5b4208177d00df84d15b682792d5a11a50283b3799e1df9c00a2675945a0b1e56d8da2375d7fa1356895c31affa239c27e8f0ae561132624461efdd18ada99981826b78c77360c44e0147714169bb3e578cde281a0b889ea99396d1ba82942bf00d4605ef0b296d349ddae31e226cb2f05513b7fd11e701e1e2e6176a9462f36c062d9e8cc9bbc0cd309015796dddd46d85fccd305f412f27a51f14d3931360cf328908fa65a366b24222f8a35c007253cf0e3c8c9c86924b435cb8cbdd45616cd1a7cea2c488c07eb2f568f0fb53def90d7e0e7aa852a438ce9b6774bb104176bcae194573449c2664d438bd8257525658cbe1194bc111298d13e3ce53076f89a01fe8e623762a109779a523772cabcf6860ca3916a6d78acd053ba2d350c0dd64d90ded66724fb9a86262513474747670c11723fcce6251caa9db1968f9e7e5821046020c2bfe6870c7cc26f06a94c24ef8400a1979bd9a0bdbe447033c6a7e79d67df8ce8f06a62e8b7ebdc5b6f0d3c360f2ea98a068ae5a874bb79418031132e5981c50fdbcab0752b45c077b6899be332a8fb6a6059d1b617f985bf8e7d36b0acdc28d864103af30f84f31273a34a39063822576834466afd941c0dcd8f888d9653063376e5babe0da15657b62ae0b114091f40953cb908b032448f94fb1eda3124b6b95c272e2158ada2337ee6d590f8e132c4391dd54e52b6a33c4a49a4a5485aa80284592118505f7fbb0d206b874a27190d81a36eda21103a648cf39ad4652d1b0c4f3c09a48b47cda55680de03e63a05dda52547f0312ce04349ecaffd4aac020c8cc688266aae7fcb9432308c402c6c0f526e55742717ddc516c494b702f3c9b4243113aca359672a0faa2e36fce73fe9f2792c7b1bfb95597e7ab5c9850cad3a4aa4b2b91c4daa72c36339e4dfa18806267e8cc39b7374f8827a2164b8e3b7c6afd2f38cbc0bf60a7d88c5d714605cd7e6344dcc9284d0af4fbe134721d6de8a1739a7261aff5dd5a069c4b13eb8b7e344c05fb377e35313d7d098dc80cd1a5681f7653098c511ed186c98ec0bd5dafb62b05ad1297fddddce93bd50807027c412455a7856f50e3613e541ead7eedb25d9113bb382598edd198673b15c60c3c22efef17a12bf3f895a890d3a76ce86caaed275ce05842611202ed97ce0e4ad7d7844a03b49f4da024964ca2e7becc6820b01e9558e52ddd2faffbd11715af7e2177b921ad48513150e564a88373a4803cd74d321370144d087473c786132cfdbb9d0dc4b722f1b9add63bcf172d68bb183bf1c8d097df3c82168988861299505227da7d8632e159de0a0f64730ad5ffec5a9406e0d50a150871789f1fbda292630b9a0d50397dc262bcf74eee6ed71b4c4b25bc826c52c5f9f5c543dc9e64dc92b60522dda59f4e736f0910cfe7fa614957f4f81c11bf9d182875b7a8f879ee8ec5d1eca9c15e122bdd0570098b8a0d11b832ea5c0f67badbb407260d2eb27f514f508824fcdf3275e15ab8634da694f5967d4c390c761a5d807c7b0ec247279fa0580793a1e37495ab3214bc95942ba21957a62c54237f4b841df4baaf839776228898ec7ecf92986e97de7a1e586da04fe65f952dfb457ec27f6da7e1922f90424ba1a2dcc438506a403cf06c6d8fcd9ffda8dd333b15160e5f6181aacf5c770a02e09dc37c0a460b75e1996d1185fbaf31b41548c444148ff826e5148495726c2282c8e460032a9dc8997c9bcdd8109cc5e8ed3eff28c79c393f6e95391627ffcd46364a2cf7b7956ce2df05920579dd9c359e8c315b5a48a66798d19b93054cacc8ebe033796e14a28ba81e3cb3bda134229d3fe2f01e37701b9378584fb253e1837b89196f7c8a0f85b0f31e885b122ac5d238faf7960a6f08aead141c1d4e6b37ac084ea7d66e7e93792698c60df503aaaf1e30d0e59c1db888d3da2d10b8c25b80b9835abb87557d0c87cdc709ebb5f7472ab916dd13d92587c2e8f3707b7d58495fb483f44af02573a53a9f949dadc3b325606f10450febf41883157667b39b97d9d8d39ecdacce2d93d5ca8044ec3fb7bb1cd57fa9c9115143c9bd677a7fb498556cf856fbeb4e26d0483b9055e60f3898e4553c79070fb53a209bd8481464b16aa2653064d67f454b59192f56d4a33714de77f686d4de44de60576c910028c350228bc3a7c7cbdb5d49de1b7025126ac1c44d3c70c819caf9ada8a22885bbfd5349236e811145b81b92446b96c5b0348e8772295b41632ffe1472a17b768165e647f1c4483790f86e4c0c0afbaa9a9391248808202815021dc01f77efac00a3bae0bf6cf4bd8fbbf995a161c3715a9d95bb6f714193a3490ce1da04764f82659cb3e717eac4f27493c92e1516ac3c09f4f40cdd74f2077458c604ec0b32698e3a03ffeb0cc9b3de4675de7917a0f78652c25b14859ec5c3c358ec50f951171662240be7d84919fc0f6594f4598a4ee7cf8cea8c2081c026aa584caba9cc0351641effa5be6721eee2a541df87857c2ba0c413deefff0f3d5e3abe5d36df580d74dc35002adb2c9bc535d04e76c3e670df7692d0a0c224c394a558b345ad250345c8a0511919e6d6c12ff222b69a8ccc58dead166c8a085c62c458bff131b170ead59c610a2640f104506f87f6dedbe47603432a6ab4a8648b861081e9538ea6d8cfee9e4787a4510609ab7a838811b11197c07264972912f3a7aa9160c997e195180ec8276aa7f1de02f1f15d1f020418d4ea4e82611a809baf8c393aaf214d79cda3d8ba8af0daceba1e3324c410b31f13db2f759fabed4e4202e0d3fe47806986d6dfc15a4231864d32f9adcb2cc02e5e9087cff2ad6ba2c4aa43b1bba94422f692fd4bf14662fab117c36d3dcfc44a8a9133724a62147f815103a0c95bf9abe5d5caf46c96546e538d96c5f039585a70321e381ca5c1ac4719b2ce5692c93a13fe7a20eb00ad0d807c0564590520812e06fdf642c6222a4b432ca04952331c17d9210e6c8d05c403d4bad4edc927d3ab078245275f1c849ed5ce5d8402bc6bc5d0c006518cd4f18ee2046fdc81385539a2b7bf7c1e509fedc25c381f362e431da78bab872606e086d29461cffee1780b4f88b8484f806ed953d2c1d46c90cafb8f94153b5609e1988665dba652dd3be0dc0bf62f371b92d220e384e3c32a2f9516dbaa0b2c6b474f9951e2362c3bf240589c770eb3c97dd37ce0388ed23bb2bde1692546653e5ace03879020f90db633491ea75e47128ba28c623c81c296e914a018c688ba80e66a156d93c7bca84fb80171372c790807c3398f81c02824be898c266077758a7153fb0dae3068f9eb72d6a1737234b228153588797d73d17d315bddaa17ba378ff9b99127db874e156308d5ffc091138d9d6a929ea983e05ff8e95e50f01a0f3291af52abe465a426ec21deacc0217f8a21853fdc9894a5977170f3ad2d024f53975d6cef7ccfc496c238f41b3f6a1dd9029f28802b192715c755172c342037fea4e5088d1ce796210e4184b118ebc3719cbfed500528e6c4c35c973ff7cdd5443654df3be08b9c9cb93104178987307341579b444987d33c2a295dd477c4f8e4659feb4accb016b40c6b4e0b966eb82a9c1b2734aa688d438a23ab331fe775aa80067aaf56d7044af4298d83c8e7f5c8043a390d014eb142c72fc71a790bad660e69322ecd9c5c1c6e3ffd11e3c623e02ae6238288d5d0a01df64a413a00ed2955e3aae8093b46837738755fe8467662402ac3089744c9e61acefcbee8068509b02fd372f0ef9954e09ec3b61a84d1518893244d01e671c57b2a72d3edd802af7f341852fcb381ff5f330406395d2be5152ea077702ca3b1659c5faf62aac5d06a2560bd4ab91d1c2db5ba5578bd55d57dabaca3195ce5efbd101c90ae6a0c82a67a5889b858d5b0ad59293bcb9da37f998e361e0b568c548ee024f3df4855f84aba062bb4de2649be3e1f70f72cb315bcebb6ea98feec223b201ab86419551edbd28dbebbebc51156456d44b564147706297bc7810990e493a20d3ab3b6473e7bc4996f0424f0cad8e4dfad72b3b20202a8aa8b21c8a554aafa83947801ea21971a27af94f397e1cac4379a5fd21789294b3cfee0af0cc8e1557298d01e39294248cfbbb31ffc8f75921d654a9f12536720fb6f7065650584286a23b2d9ba4643909b7e0aed7320d8956f990ae5142e36a8d571ab2a134edeb5edf7d1e338c406a754645d40bcc5e6b4e6b42fe459a84101b85adad5c2a62e5d9799f2e6ae91fbcac73a5abd13c6438b62e657d93a2d9295996888a52b76ade1caee2c7fae234407534040cc1a7f9728e5efed979ee880a091ae14579eb2c12d688212a1004021bb28579e72839b649211f59912756014b7bb8802d63382c078d264f6aa1e4ab73f87c688596925d950ab49e3ba656aadb44ac408182a4748d3eb211ee6d61b48648121b105fc6e5b09916945cadfbcbc38c8651226e43632a3a429980cbf9b37bbf5a71a84109bf572f29e676af31412abdeb58083fb653fbf6c5d409664afd73935c4eafc404a4d87b980257fb5ff6a6125860271e3fc9b52e517d81995e5706272558af54898891bcedf422110bd408af8570f41fd7d91190ddb0ffe07b008553fa70c67e97a24d39b37599b7deae12e84941cff247b4f21ee5f99727de35c26fb8d937a5e7301606d53026c020b834d9c50d04dcdfa3862809ef009e38162a9a1bc1dc8db46e7460a1915698d3a16582104eed98cacde0199b4752c3b476071db1c417516cb2c7197057f33e8ee71ba08ff92c4b187ea4832f9208f30976c9c072441da0a6ba0f4d5d0f194d6886e3be357d53ed96de3382e10dc4ef18983646c03b1f457ea9868c8ca01df314d8e402c31090b3bf79ce7ab2710e931cbef36e0216db5ad3ba06a85310b4c58d96a03719d7aaf13987ac2e49527bde17e452c967146879cecc7a27e5ff3c49920c8af5e4703be9c1a507c6c454af964a8bcb8f3a7c1cf4349a71ca8de3d9ca26cb8f367f3255821c020282f5aa26b9e1d8b9d7fb20f6c49a49452005b6276d65826aee75ddf680f21f7c82763aeca4bc011ff8c0c6d50f9888cefee95b9415bb33f6d037d848b365e0efab724594982a233c2d434adafa1536f327b226635bbb608481658dddecc43044c74b57a094bde268d81a62a466590f30cac3b63d0c5a7295234eb278c079df04bce379d41f635cea671176bc8b7042e7a7a3a136abda65c69208ae27f3570b888b8d11a0825db510f8cf4a40378fad7f2943fb5824b03dd0e50a4d9d1d6dd806f69e5805286db275c1d33d372c18e7b5343aae22092742a26284591bf29d0ac715abfd4f00293a6de0b03e11e40ba7c1a72f7157be807f0e6df6b40b34c017109d82f9ba2b031685636a4a4d0bd88cfeadfbaf84ac278687c85048ea56729ec422d8f5e6f87ab510cee57fde724da8ba46f1cba0c360b74ab1830e5cf6e2101d84ad878aee2e9e01c2249cd2a3c67c1597ab2463dfdbefa8647846ccd916499b3532c874ca90bea57ba04cef248a2724a6be8509d9364568f48b7d093d3c5dd0c88dbb3651b41a30b35627cbc978225469f88028e107ea8d7b030882d5902cbbbce7442a0b6ddba572ad507de07c006323632616c64f28bbd245acdf18066de849ce98e7d819bffaaedcdd0694309414b08723f9cea59dd28c303dea54ee01278c9abc5dab7320617595cc71ac012abd2b16f36a6a2195221ea19c3a90e66f2c177a886d01ebdc29b4931c973c0daa8d6ca4455015544c46c1602bf94f9dbdab3f913130849a0a636e8d9cbcc0f118c00219308585f1788b5e79bac2fec20226a8f24d3f0cbf676bcb1ff1565dc7e08e3e13a618ac3314e4b8fa97c751f489d99f6d4c03ed1449da7cea151d6ea9f09051b123089a57967afdbe80fa35dea120dc2784660223d63b8f3b0a903120ed843aaf47126469518b2f2a9686ec46d4250089db3ba80c562553f93aace5153415164c0844397ad80f2e40fd037d447776811fd7feb8ff56f0e5b662d4ce4efd7c75d0bf58beade3b5000df62b070dfac75f74030000ca89891bf9830b4c7bedf7a268e9b9d711feb2ff186c29d2aa6520f4f716c6b1cd23db285337cf87044194c454f1866278c87fb97127251973a5cf9aa75d31032189512dbb2fccfa2fba5e8805439d71d1bb1663f1910f23db76cfbc1792374d9d0aaefa9c31780b5bd3452bfc87ba21e6b0ebbb865dc4bf98f2cdf8f86cdb04b9253b0b715dfcc988b66a65abc2f01338a711e154ac1a77aa29484f1406c12de8480906062a11e0856114390f2f8411ef8e40c1b6b4f4fef45ad5a69a9451bcc40903f36d35438c7548abf89a0656f6b0a26f25bb6885c4137cb21ed494b2bf97f191199c12ef9df790aafc5538c67db53be0ec4be4991172eb3c294eec119dd7c05931e70e124e003cddc68deab4a594f9776e7bb50cdb84667bf884601fdc9f564ff3b01619b473ab713cd2572645fb5ed69760d41ac0a3ef0a1c134722e5d3aaddc30a608089eaa648bf1ec4df569c7e1421e88d822a6748e8abe512b1e4d8565682d5aca5530ae6ce354c6451e6b6fa169c7ed49e50e31517df10b4d7199b8a4d81294455003fb214a14e30d8981c1054f42eb3545b248357bc7961490e926939af32b694630682a9c3ea6426a666c567b43a68ecc43ffea89ccea9ae33ec6c355d815a465254c1c52da5773cc84d4b3a04f198c0dc1ff68270dff42b3b88b89e503f9ed1cb54378cbca25ede066335fb0410e4eba014ab13dbf202424e5e7a7d982f6827e576be0297d71e281be17fd71445c02ce199978a042fdf2644102f7669230ed09c2a028c25a383c1d41a9c7c8438390c18057b4c6c60e284e856b2c657093d7c4480061b8e4191afacc5c3a9c9c00a22b6b0846e82b6d8ed874cd3b1e58b592c1939c4e1680aaca46606aeffe149968d720a0031cd5998aaf04dd448ac588a4d52a8fc975adf86accb940d944b7a15b09d77c0c0ae39643b01646b4673c2c7eb7a80513f0f2eb089ac73530799ed36af18c655ca1d03dcb7239cd52ace692824a7b1411a20866830d8ac3346b32171d1c3df23a1c54b04ee5c28c28dba469625489ddfefe46e5c03c534342694327118d72e65aee34ba24672dfe282786a4088f37c99c7ab89d447195275417803752f0794d95ed132b84f7ed3a3be7c25a33d508e2d6c638be023316cc2fa71e7a26b742689aab080d131444d70617ce5b74b944421d5d00245dbbf45fa50be9de6100799f40e6d40444254669b389a1aee473787a971cb23a69669fe20e193c30c26736df43160f684fca1e58bc238d806440b08684487d329b90f91cb90c7bb46c8c2d1339d01e4650e3a5822689b0718c608c6c5b62af0759147c93dc5805115e62267d307853b38fae2007bebace241e30768b437906a642ddcdc4d4ba58b031e92763e3e3b7b4498a38d3b12c3720c927f74a1ebb2c0e98c34dc94fd7eb088d1f4dd1a75e71e7e756dd7ccb587db2e50c7aaf74ebbc61e5803bd26ba3f1f39f774907439b5548b21de7913c9e0334a9ea571816c3480920e35acbb7386724bfc67b52d8ce7538fd59590f9fda7fa5b43a4e9e812dcd7b1a63166276459ef2f90175e0fde587e7d5893a3d1eee88024c57e4a905a55eda8a9d8d8525496c703ca11509ed7881aa6a23b2521e8519eca895d9b33124919728378a12be21adfeac26446aa50fe56f4136147a89d49219860e22e49c35e04f331dfd26687c7170091f937f1db00297e0f60058043121d5e2ed1938a63c217d6c629dfb6ce96b88024a5399ea1a09f063d3b3fff81155f5cdd32f482e738d38a64a8e7841b2a731b0726d31834d2137d9eb17f4177ab3c39ac8010db5af96f5e86459ca87eac280e4fa3079677cd0428a68cf17c0904786903e162d5244a2b93cc8a721379610d87d2b48627f1dfbdffbe833049db160936348604752ceca919ce7e3e9ce0706f7b97e800e846cbbc5ed0a69eebb00f3d1aa9924dbc85f397b20c6dc65f47c8492ec90f7cafd8f21a02b37ce25ab502dbeb5c74c80d047a2a64b47eb51db203f685d17a193c90450e0f6929e2220a50b872ef93d2e755a8f1fb91cf6cb017fcad2a02d254e53968714d27ab72a5fa7ddc7a3edc9aaf123910a779ba55a41f61a73968ee33162ea1ed200ccedcd0db56a9f9aacfe1d474cbd472cc1be7a71275699a7b6d46e4788d57f7f028be3c20f52a1ee819adb6edd5d472e13766063a441569a1ae43af69621d7ea0df2d7311f544ff257fbab5fc78857739ff59621deb8262acd67c87ec484fead08a781be753c3c5b6f60241f949acb55c6201b92566c1d362edcaa6e1b524e340251bf069f8e392addc3d0222e3dc7d373181fb59516697dd6920f8b8552506d916613cf112846908efb244fcd03383d79ec57fe549556b0a55c29f6479d924b322c6d8dec71b4afd988160eecff1ad83af3a1de9b0ec75c2f4cd5c3a4116b62e19a58068600a5473178c8db9fa9366fb203c904b70ee49184ed35ce117f9d031a611f17c484386282fd77d28c2f0b48b1ca39fe089f46d8ac48e428485ad1fbf749d23c38a75b0a3cab0e58b5ff9336f7a658bc5d17a03e8dd61b3f5310739ccf7c1624d59f30aebd3d8dae64e78963ba3386b42a873e63734bcaea275339f9fe9c7c4d963bd7edb7dd6b83298af7920c64d68d4dfee094c5b7c5febb1263266dd3c3d5e8fa8cfca55fff1e7c172767d96614e0f3cd7e525843af9bd3158fdc2e6a5d039c22cd79111c49374167ec713061efd6c2eba9cd62ecfdc56e30a6f030b4c6fe6ddc4e14846c533f85408c7243c49682269282e165623d0207142ac00c3a35584c45e9804c2e62a92aae454e634b84e55e3eee8ff96723a3193ff564b359b2364a9eeb81406b59cc467d79f492b56c542616cde0141f0c5dc0679d15feafd174960f0051428411d9920abcacd12215879f73505b85e84e20b2262d587b7830f78864b958226a054260601c61117a9437daf42e94c85ab290f6a0a45925044554d10e7665dc878af547e6863a07a77008852d5b93c38e5ea456f7b8f1a9cb648765582ecc00988da02031d89ff591e0a8167ed09d0396c84fc7271b9343a50012dcc38c61c93b3da50021f6ca358104272d1f4b5bae4ec0e661d465086b17f49b25277fe7920408517730b90f21defe2428afd40deda1025526f49e0fea20274226c1e6515aa5364fbd4a3ec5928fbd1a22487a796ee1ecdf85fb66b18047b0cc8708f0a2e83978fe23d38f2dffd710049a589d82e4292179a99887e867a09eddc3834a920aab6918bb3d9fedb2dedd6611bc06a228558a583143c1cc8e0bef0c42766fc3e365fa5e1f89dbaafa4c7fc0553885d6e0bcee04ef8b888b2fe8bd8223790e79dd6590e0806c0407a1b2edae037bcfeb3b9ec6a026812c0a2c491155e1c769676c8aff0323cfa9fb687eed859e3cbf215224931ae53db0409ac5ce4bc7f15219ebdada51729e6fc48ce8b4a9619a7f22b790beecbfac5d3dcd5135447338918aef8f66d22ca205ad072aaa4428af531f6cb9fc68be4aef95bbb5d53d3492b5011b639cc4ae3b4c6c0575fa94fcfa17be322d20a0e98a72602f1a7ca0e7de98f107548ab5f936ec0d390d413c36d50ef03debacdf0a5de88e0e1c20e08e4230f19c5283f4207579a0f6c64c74769798e97f1a450dee3e685ec972b6bdbd64deaa575016eb294548cfe6476220c63b32c1f5364a5e583c63489e9c9a133cd69e667fe0029dc4f83c03f3fe09a3af0b2170a319dc5d2bd906acbcd243d249268115d8cd90cd1e60498d73674b145c246a421f71fc75efafa7303e1f7114ba2779487a41eebc67d080886f2e9f94531a0104c824ba7cdf68e9b77c34b294325a64c236018c3f86825f05ab354b23ba8ed9cc533563fd03e46d8c68b3226c6abb531fa437a8ed220f8d3cc464d34a894fdcfcb45537dd18531f2e8ccf0f05750c43fb4799b35697049dbe2dc89427fdc481b0c6d570394aa1a0d05cf23a6f3c81b9144d35519ec2951c815079b55a75a98590e1e4844b8a6c165ddd6719019a78917e5bbcf0c3c94691e60161596767c40e1faea3e45f5dc8ff073275c01b70e6676dbcd6bd6a2d03632c0cceec23237ba6eea536fb23dab72db4b11b39bfd42d060f938e0e191678d1d4e3305944c3744eb23675c8590c93f3ce753ed01cb267ec9eaf14bf33105805f99bcb625a5c5bfcf76db700828301cd80c696c75b252891c50981d413e10abd05aef1cf3c20955184c8fc83ac9c9e17ab047f9b9f362a08ca1ba29207a370d19950394da688cd4cf417ee2cef0fc8e1d7006d05aa3af734c75375f5a5747e646d7d4b63a696b39e4f2ca69254d39ab63cef70096bdfcf49c3d10308ba71aca668acbd6910550514e57bdbe7bb2d349dae469f12f62f056b9809109c1399ed097f662400134e7fc6d431dc8c31b7c0acb7112319cce45d843ba6fc8c01303feb9df901d856cda64a7a3c69a0d508096c90a3f4e5d110969e0c1010c2637d4b0e3be1008b7526bfbdfc6d80e0708abd9c81bc0ee1f3543672295e81349c81c141061ee225a83018d8a802f3bd82913933939cdf8da1c948b8a33e51881d12c49c3d044718852f1f8808a2b5bba8351f7a53f41c635bc31f7d3e1b7433a1f65e9e20e89fbcc5cb2538d08069e2d62e8156035c10c02c9b7cba1c12a438726de1151530c592552bcc108616443a0af5d0f1ceca0a0b4f31e94c151b2038c1b010c05f0314b23623ec9536262c3992189ba64be4d4f3fc5d86b182b14311559db0cc9c1b320e63ec6933e8d94e11e82ede6f3edfd80701bfcd7b82ba144b59348d92b86b28abd25899a3317e12a31f048235ef017213542a80b8726987458db021b3dce00fafd0d8aacf6fbb4fe51e8ec7ec0b1f870404fa4456adc44859284a866eda9db73b882aae45095f3b61efc533b31b3895b1b2d1636259bffb96eba66eeb924c1b4e067a80aa70d7ec9a46e5985befb3b22d15235b0afeb3508c1f0e0d2ee8c6c308ee87cc1961b06958694686e75f3f6838308f794c40d0da767e8de0460571e895ef6298239f4d1d62524b499fc3454c0b3ed160ec1a65275978222c9124b5b81c4922ef06aead3283e03842441d854c080e72a40064cf027d930b291ba98a26fe48b3e77a7a267690e1256d8a4c2e2e20b8ac4a9c4867614c993048f908f0b3f12e2c88921cc21905fa981e2487d052c67a11e8e0209b8fd95c40d06d4aa1e25493b8aa36085a7c08c5c551c82b43793a8dd4bffc36579b05068c03d037d001ed8a5243f9f56a5101b1e857f6682066c4e47372a0bb88537a11dd8d2489dfbab2d11fbf0c60dabf3abb785cffad05027cb5b7ab5a76735ab5f7180ed0414cc44025aa07ea0b35d5804c9ab2c58be279a0cca81c2c2d21ac45418fbade0ab97331aaa1d172dac9ae25075142208f466d54267a40707b472e7895a33da69e029e2a9bcf45669f7c8bb597a20d79e4d6c30caaf96dedc2454cb510412e2de98fc7ba584684b34be8dfcb28e6735ac0ed6a37a156b63b6f674e55fbb74bdbd8594582e520b450b742007b4c083105808622eb72e750b1ac9c170045329e28ceb997804ea143520525c3c42204512fe670710c8bd7268348d6ab2d32227024b0dc1da07ddf61e647e6e4e6a299482038e27a9b9e16c7ca073eb8a0a807aece823eac0a6ea2a3acf1ea954b4eeb53fd5d853c98154479f36b6f43e598d9df9bfc924b4bbb9b6a98df0b602c86080e134711328530714199c0e1c47e68d91c2761195272ce889bdd1e1af97644b786ca6256f5250d2fec5ff100ff70f233466a4a1d3b4635eedf1b6638388318c7d9e0b01fea40a1ef89bdd211302e9848c01074340769c3c938dadc4673a8182fb029c9fa67b70bc661839cbcf2b6f218300f25d092a380ed0f99f2fb7c9c4f490fd16f996d2b710115cbe71b5326d58609008f0e7a39a61b7c105a0042586a458427477966466239e6838cb7fdf812225c65287806cd90cd03d6087c7db16f3582275427242435028a33bb24943e03a218f6e63c1647fe5420ffe8902c0c6cb0f9be988c884670a1ff6f7e1329ab970f55da10a555e90852de99838976f81079e9988c5cc811e2bee090e1846892fa04e7da1461b0b1e6bbf03fcd05cff95da2c980f55f43dd6b208fd6b802b78ac3455cb31a46c6e7c4efff4fec32358ac40fe3db3e28b1bb298429e2de55182eae2f0a9c859d9b27b3694d219999fb9cc566386f0db782e798b9ab60916c37f7738c671cbfc58890294c5ae20773a4cfeecb21591181251bc2dfa8d5591d331dc90e3e9d30700a2a04d74051481c3a0315f7cc72ba7a5132e1a5872cbb33e7dc1e71401891ab0378c4ef4de3b322b6dd16fff1998f92b69ecbd3305855a460ed4407cf49647c4206aa926440459838cf6b06e5d32ed23a9171cdca8c7c58550758cf09e62fe281d4cfec78f8662f56084ee5e783ebafef67b0e8c61e967abe6c626be8f0e74ed4de20337a88b95cba6e9675969821d90d5d75bdfc1ccdfcace6c6549c71d9bef94cdc3b3fff18f859bb472649dd498e44946a054f355fe83d0367940204f10f8110415639c7ad967511686b9908d6b50095c113ea4ce60d5ae1a6b8e294badc3813452a940794b28b72855376b84d26d48a12632d4e515ae7e1441375fa6ce8b1afe8bca030b7e604ac74a6a07f079cfdb0c29b0b3f5f504bdc402e452fe63181dc6339066311bc5b80a4062695178e5d8ca4cd8d8ed7a577626e0a1352666635ed29753a7a1681f267144cbe19821ce8ce20d2ebe64c44b409f4f98116e2751e1c6c984e5ac0a66139bc002126d53c181027c9fc4ae0d430c7d0a040748020e0600fa73db12bbf7bd1dc07269e7939f998379e2faf7f96881e9c564e5e79c55a4d8fd532023912c1eadb8c642c8e4540300b0ce9ea211753f29513ec5e7443a62afdd24feac431179f8848ac5a3982dd08126b79c989c54abe1b953695f4e0734aba343ef8fd604e8d04c52270450f2092ee01e1a20654b178101542c7d6d8c3f5a3e3e3ad162d253703141295ce00cff2c91df16a96523b4cd0da6a528e028e3155076db5a8c9d476a4985f05b94264a59b08d14919516fb78be0f523184d1f424d62bd169c3298c0dbb4a01d4eb138984858ed3bf68bce4a9152b53507533003c85792e321a7262184b7266dd4d72e206c492223b484605ac62485cdd4998848e48f6c4afa8360a0eee72286589adb67e2f25290800a4adf779fc0414e70588431c37474176627c0d4814580389881700c3220bf2acf3890308966af1bdbf6bcb8565c31450ba8998476a31b0e1489c9986dce41892d84e1262850f2026139ecbee8834bfcba3a399c85ad5e85175d7837a06c4acc2520f9653e0497ce23fb91b600cb65620682a21b58ea9d37c55ca4059ea0a3f95523df92b8e995bb07aa46d94a52bfb5201ae53421a58b5f051ba8373719fb4990d3effc5bc80772b131e1c8d0b99ce35775100b07b63cc148c72bdfc55e858307edb9b09a0622a9c29ee503402a0223e898f7f6a64d90a41e43a118cac298060678d94eb500e86c6a834df03e3238012e9e85ef5a12f08e4d506045c9513429906b986f78bf4e9584053d83b00439d56dd8ee4383c16c870c983c2ea4734fa593c6de5dea87d80d6af221dac346d2a9e2e0a44da6c996e3841d6e3f5e1aa5eb89e9abe563f4f80b0a61e80ddcaae1b67839fc6f2cf87d2ca864756e9f7d63f66d43961ff44090069022cf92ce2ded3ad30a7ec082a633a225c206f96cb3ccf0542e2a3d9474c20f24a230da7d330da09e3a233816d2c8b30a9f053ec5f45acd57496a634ab94ba805d3c94ac8443024938cdf73c18a5d04c900350efa05718608edd88486f90331d414c8d1bf02e771708841557299f14a04a4c67bbf095767ca323f92614989ea0fa7591a580a93dbdf8dbd79064f9a38605958d69faf03c7f9d0ef46aff6f499a9d8734e15ace75119defc988154cf178af4f486787ad0817ca5e83c52026633b8fa38ae1f2ce8690932ba3e21e2b49e0a245c88151e35fe5ab1a6f3b72cb923da546bf34c0b6b9c97646454e2014c881385184849dc040e2c4594cdc3336fa42b928e7723b7b074a9ac1a5438fdb71ad719066aefc1dbb075e86ccf1422d009754d85be2bdca4d9ab9f98d936113bf226cd95e998adc376f7caf934c934bd70fa5a639b35fd32cbb7eb539e6eed86d4121d543b34408ccd9440ee83fef7c16c6846408b0050bc62fa7c6ccb4fbef9fe28990ed091b605269f2388fe89c1471072dff3096baffe78c2c22aaa5864123cb56eded8b0b27df8f9053666e6ae829930e0368098acab324b400fc450e32613c20dfe14330292315159bf31e62bf13594d3778240627189584c4ce2080e27b22bfa35ca6c08f1af7ed433b7e4cc13d4c489a772ebf44e06d4b69d210bf73a97befbe9fccf99fdccfd51fdef2b9d4576be661406c6250a5bea23ee98bd519f862d8921c7712401d6179208248277897de1af001ded857f66763215fa0799a20d2f7e3d9c5dac1beab4531b76f700b298510eb6790922760a17d14e32371ea7c3c29170a5f459143aef8782901871298a3e55424550ec9d1e4c3a6333f255090f4c1487dcb1ca1088f67b02979b276ca6f717d649ccd66baa08e86d89870c772eae401d950fdf4c853c8d31da9fbffd57537e2593ec2c56805c78794246a5ec0af8105491ff0bc146638003a55a229ea0219d1e38021729d6fcd7b92cd38c99116225960ba6ed06dd8bbb3e9be7a2d62db4d6aa2dda623cf800fb70d3a5362769e50c1bee0786249f32bc01277accb0c27f34c4cb05820841995d7887aebc7035416701fbf78350c4098ce4bf3e04bd372141d8509ad237bf97f04824e3b08e2f4877ca002722c90ecd051081befe7381018b289402a22e87eac9e3a341e44c2f031dda23e89457c5ab7d2a63e797d34f21200b1fcab654e1ad74926b8a6afc884be439922ff88cc0721a29819b0a91fce5cc2a75d036596facdf63e60d6faabf42beb9c9910ce8cf372d00ba7954d4f483b7b423fdca1c527da547f2f245a2ac208f34a631634d4754d5aa9170b5948f721448929a4f7fd1b46bc597eea8fb8386764203ee148690c7a9a4135cc8420aa8db957923a6f116d62320c23c3b443f3004055ea1450267dc5fb2b06237cac2168a7784f5c20832f327f007725bef6041a3cb5e327f20fbe92297a9900b0a8f69be1f393768a6d28f2807fa2e50123f3cc320f963d66d16de0fd61a61743541800462029175551ca37c5ca07ca6c0c9c54ccb783da221f0dc9b3bc9cbb704c0f28a258165be898d4124b0f2d6328290a1ebf14d7150139df213e078f8883628c25435076733bb5ccdf2b96109a7f9f0fc06c99d46b9f5f3fe7dd51b7dcbe6ec04a4724760350699e62c09d0e9036ad6f1d1b8815278a552ded18f4b4015f092a3b43747c96ac373184784893f1be0d5c038053582130aa3b80f121833f120ee68ac3768ecd6c3405f31034426f94063bb5ff9b473dd6332544bc53ce4525f3e1e36eb85924f1261534fbd3b40fd4ef0df0b308b55997f7196ce2a581370534c3ba43b5bc7e17b752f0dd0d360e79fb8ce297c3c076f242a28322dd679c483a3a4f28e2d80d4a348235e25722166769a55e78619c67bed07233fe1b6daa3141c59d6d413accb5d1c7dc716deb455df275440507735b70e1f0e2844f4cf46a5dc7a574bf6b5ac6ef35763ef566dc051884126cf8739345653509e5ba5c5e2ec1b2ec2e9771189b7a44b31aaae807d73bc4d79db144fa91801f6b387631231acb57f81e00cd816443a50dcef30a9feeaf8bf13160e043c5be0ed87725feef83bc88fd63ac9a822e01dbf03827e3e15e0ae0ac0aaa7c24d0e6177ed931aefa2933e1a65bcf838c7a0698a7dc22f5c65796ab873a7bc38d523102839ba3540549f46a0230c16457502f01db922dd380120d4b104d49f5602609eba16fbff60ab893b6d0ce9ba5646219796ebd01b3d02c10c196874064a050e477b0948492f8ef63000c4b69790d12f4f7f61c7e9ebe445181f3f6f3ab6aaf7718c9725d956b067f94cfb4b5a82a9cbbbd27d2f410ab9b4f9199b015e16685230d683bd6b2c2c6da7d5693ac145cdc3dad356ada4c7a54a8f92d20e6aa8160256a246a54657a582ad574be2d4dfc5c4692696df514c18dcc87946f9ec8e8f4bce932f0125445f4b1a65d5307b59acdcddf1eef355eb028f0aa08aa498ec0f5c0fdf4cb51e5fa5517492768f95e94b40f15521ed636bd1b5b23933e661568d5a3ee9723dec615a0c76dd7a170d34163c1b01df3968d81b0b401e0ac9707edbbc2d6b443632c63bc49e99c410472e69684baba99a0117243a8150a4a14ba134ec657ff3612f1a9274e3e25ee5dd0f7b6370a26befaf27a5941b6dd6eaa4d4427b3c3e08f145d7eff09ba6f950676255f57f29ec39cd389b3015ab5e21b7df27e12167baecb264477e1587b1867a66c341c76597757737710a85d10c2d52f427c3c596fc85c3d3f9a3480763ad68c9e2f40910788f586da3912e36b99509c4062df0c0eeb4b239f768821291e4447bf6b15d039f939b65f54229fc6da0c99e00f4616f828a01eec09880de70b58b9f71eeaf049abe7e29d059545b12b8ff6573b7f6501fe9a51b8922ffe942e5a6f4c120b03849a9a8635d2714119c9a45eedd78405145bc021e8a0ece09a2a246e8d85044706a5eb96ffa2310f89d2c4514ddd74ccca4f0cd1ae2835ffa2310f89d2c54d4b40e1c8a144e53911b2b9f84d420defe86a2837382a8a8113a3614119c9a47ee5d1d40bca25e58d53e07a2c71605e2899988ba3d0804a0d2cb4f0d3aca93b4881a837189af99ad09e3c2594aea4a02ed463b0f039a8ec91eb92cfdfe6dc8cde331df7dfcfb054221713ba0d3a3fc22c521b1aed81d36f35c5464a3a0862c1b8313b7fd1412b64b33b13df753beb13f8e0edb7fa41090030ce8a3c129b7c8328e23261603bd80ea3bc20d9927402c5853e1078125055388583308e532755359987e222f073aaeb617a30fd9cfab25f23fd85bfc033fc66f5324592709508779dfca931c7e6b47d56079a250aa0e57f5fd4484647bb218ede3d10ab524668687f4b7ae01e1ce19b64ba831b575568ead23d3685ef0388b023b81743f29bd655045c2d4269d6d9ad76ca0b3996f0175b76c64ab5a1b5307819fb33d42dcb32a000ba65c93334cec368f92d97afa77035f3dd25857901294517c109ebb305506d878a0f0dfbc578d26808c03af347cd89b53c46f4830da66497b224a9440643699163b6149a4a00f2e1f8cd0ebaff801c5027bc4eac7e0431def6e1a264b52bfd50728613890d9573a36644db34d70e72101a3baaf0e473e6ed740bd5a6774e090a98e7bf4e282c4937461dc1c3c7dcc2b54cd75bbe9728f438e7173eed50a69deab21bb7498f01f1629fad01db383ece88d141860872165205d6f62433187cf0864132cce01a83c3ec6c2b2e0ab5747b48a1cc327cded9dc928a5cb500af0a0b3f60fd1785c3876a4a0d8e227a7959203c635baf04a00ae93de3526b2be9d9137d6fc933a2ddb259017a7ffe1a1e66f74003051abd5045b9cab528726aa863a70e0f809f7a40b4bda7af5e3acde8dd48cc7a670bbe2710caeb5f5a26c4231b84a4ded6109928791f56d128048305c63d65283e418900f4b8947e558b7667b34df0fa71c13a3e2a0e71418414a381b96f7efc6e0d029c5fabb10a02978f848f60779823ffc62ffce765a07f21e831e9113b905bc3086933fa34c761ecc626c379f076a293806655799289f0b2d950ee736b7b8e23f74caffb44635a9e0185c9fac9422beeb74916232e1ea9f9a7721b13032609dcce3d01b7463704d25ef6b1eb1b7e6dfedd7416201ece9fafd0f3f294afd3ad9aa9ac72ca43906d4702e844917dcdee36b054b4a6270e8e246f40f03ea5896795a309a516d0e019b507ca2d8838c3bc0a205906bb676da8f18f9ae64639c0acfad195a1b12be5d2cf782c63ff137faaf064b33b88c5a728005dd23fd4726a775688febf3fb2ed7ff52a96d646d64bdfe36b25edab6b2b794524a19c50785070707dc97749817182d726b27e478ab666e033ccc2ec0c73601fe65df78187b003fdb0778d9cee165368e165b009fb7d38be4c83f91bcba29e5ca2a32dfcdea262f192666aeb24da57e66c66431fd53dd247346f489d84d326744b7d8aed9be8166dbf89a3de35dec1aff62e3bcecfeb19b3749ba49d62e1bce0c1933ffda33fcb6c93b006f0119bada985103e7864b8b51c3cdd673584534ee671ba766068c7d13db1bf9779fba49d62ea42b27eb9b33c385238396f52563d470d34bccfe7f62ba17e53bd938dc50e367db8649ee33706464223370646492ebef959fc9ee6f6eee6136f9b26b78318366dfd062bffe64ebebcab9ff7cf3be5947584539335c383268314a2e59c38d898989ca77b26d7c8b7df3317bc60d3f73d9dbd370ff62bb60c4f8d8fe7e37a99be48e23235f22337064e45bf43739d9953509fb5e6cae666f4fb35d31bbdf0d76139d5dcc984c2666c2bcc068d15f39afac4917ab48f675131734339d5d5ed4c8ec121f20589888fe27c693c9643316335f606c4e86ae67ce591313aee7ad038e13eec4c686adc736ed2619c624371490e67a8f85c5ec9e4b8bdd3f66c790f12efbf5347b06cecd9b3be74df6f6372746ba6ab831981c22335c38a40c5a8c1a2eef9b75e4c56d267bfbdf36ff820699ad1ff7991993c5c4768b55d4da69b15b42d06fd536183b8566affc6bcff07acffc6cc35eb6b5cab7d8282619e6c58cb5c8e0b2b76f6191610556aa24e143c55011ca661d29352f01524bd8a63995e7f4c9e6de24739c55143bd99c49e6acb859d74bea7bf5123f430431b9c0055398220c61000318b0c0c2b4052d7ca1c80ba72e84d5f5c4c61521df6d43dd7b31c618638c6d67678861e31098e938e3199ecf661778356c77c2536b72b32108f113dd7ee66f655bf6e9f925907d3a0d54bf5e8d88cdb437c997ecd3ff3579924a8a0c2ca552e9b1e9492a27cfd26e9009e5310c05a5a2e0bcb95c25205c16a461f0a37ddbff26a552a9542a95de844ba5d257d257d27b248c31a74d2b28e0e1d1dd0926c4ce4e3722294762f0509f69f3cf5be5072848080a5b0ac13e45451bde8ab45cac71a5b292521e11a65cacd54a4a49b664603161d4b8e120645927825441dcfc8251285835086b22558aacaed085e24671894e29a8913ba27272a95c215d635d2128eed02d328696c72defb5a8dc92cab6f4a5f42811973009480b53264cb2f7b3562a30949d1e1f2aa84d572a2af865c22913169f70a178c2898bb55a49297f2ecc062c32909c18c03265659572b150a3098b5c16dfeba562720208c82b2929c3257e7e4654c418882de9ab944b292c7257742b78c8e2202c131eb19027948494f4fed32ef96d3f06826de012624beca3e2b248b958ab1513468ddc11d3a61d66c297eb3b7c38ed921fb04fed1f2a2a126cf260a5bcc140da1833a2a8bc4aa4af5f7a95b21431cb841f35ba9e9057b984318e99f078a1805d945fd91808f6c142f00f5e02af4e292ae566442d7169db547698b22981b292326191bbe2642a91f04fbfff79231cc4ed0d42709c5dc2f7c9d4cc5033830cb7cdcf1492b89824281790464282ba302713898b4972baf7de7befbda8ed3d9294e552a81512924f845d140a4c5d5124a93e97bdbdb965ee4d6d323a754b234ba693411141b1361d108002657847842c6e9bb8fef5f26a498b1c5cdb56d0fec8e16b105e0e1b5f7915485b41c961d39b956b517041cbf303015f830811700283a12060d31b18b743f8b03d2626fc00083800027e1ce000282990f64a39c0a6372f1330e7f27ac484dfae6ba149890c183786f044e56e00675bda725fa5d457a7b8545ee509ac0ed9b25c91418617672162d24264e6cd0d838687d92fbec5de5876cdafec195e86dd6d2f58b61c8415882d5b6868aa10b6dc5911e2753533c8701e0859643a164ba69461752510074a988b0c11eeae7c3090b6129321e2ba2b3030303037df8c370e06c602be6c57a69321d2a1e0b2c4c4c4b4d89e73c966deb8980e849f8ce6408c2773799995cc6660e5e1332d76e86106d0079995fd43871c3ec6d3416f2e2868e3fec6595e0690c6f2e2be573f1d36bd61b93460cee52e687ed85c180eb6a40169dceea2ce66337caf7d3796ccc7ec4e86482743b78dcbe1ba70416330352c37a8f5374bcba66fe5389661b4e58bede70558961a86a661c6d980b49715617769a181658506131a5429910614090d3470b7d2f05b7bb904463f1d3be1e3071b7783bc9b0a6a5beaecd34fae7683baa20f841688ecf44f9d7bfa3e2590507353e4b33ccb9f32c8763c17a7c0b46d36773e31f082ac6ca7d65a6badf8de3a04824b71aae7f7b26af321c5566d9e41ce1973dcdd5053489173c65b11768a5cf10cba4e48d7cab1145578f464bb9f0d223cc75969ef0569a52dedbdf76edbddee761fe3cc71ddc8fb4092e638eecf93f216b9456e915be434b10fcd2f900f84b46f31f0684a98b9cf82dc7b9cd6a4cfa3cf1c77c10fe474bcf7a2bccfeb46a44d6f3a4cbb5177f39637fdf7b5ceb97e1e0263ad4d2b3bf9907e9947dca643bf4f29ee1b8f1fa3f746bfd5add29b1c5e13d0e73ae595b6607a31ae13c8b4bc5889f0d3da66cb81adb6d6786f1f6babdf5afb263a0bbd91a565a6f41b0171eba76bcfa08c6e3322a49962bc591acb8fb7fe72ce66af946e1ca798f293afe62b6aedade598602b0534d67adbb8cc042edc70ce5bbe1cd8ea56b9b0d5ad1aa9158b5cb1bd41d8a727e75bfad652ee0aca5941a5a061b54c70444f545105c6b82e210c3fdd49016ecb5f29c4f432a19a281765fc11e3911cfbdda1db1f6f4a1def3fb5e50d83109e25691fffbd96a3340d42fbf57f88d00114c9c9149648e0e78d3acd6df9e7a4725ef0accd0f381787771ff51b4d73c68c993167cc991933c68c316732366748ae6b88af79729a258b79671a5b6bab797ebf2ef05f7ec31e186b3d8edf2b0f516d081f40c2e8c7b31755abdd980861d501755137ca6ffd8e87e377fa67d82f7d942daf0e475bdeaf4b8464c7335fffef4867a3a614003a9df256ce0fb8f2d345cf7c47eed812659dede3cfd97ede45d0ddb8b2b55ee1691658597efc769ff55ade9a41fbf638b46ff7cf1db95b7ee6b740edd6beadbd05664fa7a00db0fad47a056d943ae5a36e6574fd967072b79ece1a63dce17b2fe9acc01d598f74f2e87664bb4abd8d44bfd6fe81b4de52b5204dc706faa9d3290665541eb45b50067dcc4fbae598b6d0bf1bd396fa5e89768a41e0d1c7b5e25a4f70316d498167756c6d00118ffead6116f60aef0a94d62a857ee24e9df04413492c01048d04a5b4d6246cd07908691792e8e9ba4ba205f78eee8f46204ed5e0bd5a48a20423ef08af565a4f4c545bad2988bdf61ad17908a914fdb4c1d532d0175f0c7e54bca09ffae9113e3aca96f88813702ef0eebd470471495960ae0b596f61f3aac03da17b82e3b84b457602775da775d431dcca85204cdcbb95e8289abd507b50a2f667043ee8b586bfd6fa89dfd6f6a9d3a99d511b3beb66a7dfda9eeee81bfddd737b47df704ff70944a7b51bfddd06c1cc0d6701dcf3b7726a4fcf5c87133a10ad8de3c03ded37c21bbd7d2b67d437aea3d433ffa19f3aa19bfdd4a16f7371add55adf0f08ab8ed711f6bbb3c535c045f0eed3933304e2d496bae4e5225bacd5a84a89289293292c91c0cf1b759adb32beb687d0ebe7f71807c18113bb41a1d26ac4064180d821bcfad512c1083f1d654b4a2f3652a202679cb1b842e721a457f433ecb48b02124ce8286ee370a7439078a2f310522bfab9e910249a18753a0409252ac698d344df11dbb66dbaf37ed46ed48daae8f6af0c3e1f236fe46da1dbcf9d0e41e2049d074dea7408121f98e9b4feec91fe884089ea7d1d6db13c84540bddbeed744890233a0f21cdc29023c4d0511aea753ae4082c3a8a3eed470444e8285beac09da42df43d90a6a38ea18320ced61ef8d58d43bfed809052d1ed9f20367db6ec3a1d72c4147d149ac0a327e7c598cb16dfd4e5a90207b1156d44db18b82b852239e79c37fc6d44396f5ed01d47c2bc668c374735089618c37cb1cfc5788970a3e1461f1662ed9c2fe4c2ec038d9a107267a3a00b1b156982ca465510c281341c7a7c3f7afb7d3f0abab3d1d085d9515115a86c14065a8e82ba0d01ad2418ba33f35a59add9320c54563d404bfbd6fc768faa826ebff25819fbe69d792bd8e96a1d09bab72fe836779d57d33bb996b3aee5ac6b395712d0d917828fcb5dd6f5f3469c9977d0edce7ef55aabb55acb251c985ecd967cbc1a0e6bda764cf8f44c7331c518dfcdda9c6ddfbcbbeb0808ce36b682bda7a47741ba47c8d94a374cbabcd2968c6bad1cc7475bff1ce9a0d7b167b4c2888dcbf8725bc6bc2b72ad908b6dbef4e6efbdd7075b0e3c12ddf18dc230e9877ebff24c5bf0dfe84d6f2a95c1b89616762dc63ad966234ea0305b8de0aa14ba7d7cad056a8f95d9af3f468e57da52f3765dc488314d2c85a7f57641de8b39bc4f2ec7ffbd8eb93deaa3eda2bb33312e74c63777748376e6f5f2ce3c1e7363ae88d93a9b9118b91856ff85991736230600b2c5d696a0e4f45f0a79c9935e2e139448ae4ec616ab542a9552a74739519184bce449dbf34cab4dbb884712d529e582724191292429a2469f0b2592ab3145a22a7d26d76905053c3cba238109b1b3d38d50e5edc199362757638b754af588282ca258ac16b9528d4418686cb14e29129548aec653ca844954e46a4c892929e35832c248d245a25022b91ab1e99422511d81a19e04a4a15ea8713ca54c5888e43828167b2f0643c150a209bba4b8a4c0603094882a59912ad184515c104d18c5058eb56917c9d5784a0dd1dab5b7b0b45ae02892ab53ca078a63a0cf0920206f899f9fd13f2577f6614b579765b0526520b60c1252d224fbb7fd28915ce59e1aa4faf8a4c48d816c19349e52242a93885a115128161145b24b5eb5693f892436ad5e2f99970acce52a419a88c2ab538a4465c2e41372ee1971108a632094883257a44ac422e91364359e52fc470943c150a58a68c2a82b48d927ffdcc004c7551966dffefe0ffbe4756c98f761bffc04368c97c06ef111d8310f812df339b6eccf3dfb076c17dfc3a631c9dac58cbda8b91f809d6df63f0dbbe467d8af9fd9dacbf75e732fe061f60e1fdb0af8979d8087f162ffcb36035e66f3f0319bfc165b8777b16937c934bac6e5cef666494beabbff7ecddf6c6fef62390bd25c2c27302f30b239d29224b96d830c3ddf7b57be4f97601d04bbd04467978d33633219126914b3fbcf768e4a8c28032f305a644dd31cdfcdc59127bbc6b7d8357cccc699f1b3ed61d03eb6fbdd29dd446717eea6677d8908c1f9afe47b7df9d3dffd523bb418a51c1747de8d02f302a3453663ac22d1e42373c6cf6473fd4bffdf362df24dad932ecb71bbbba09969971735664c26131333615e60b4d01c08f3679307b45e522be7f213c714427a436fba3fe9cf8c3b337dd7fd0d2bfbbe7b1c9e6965b5771f233443696aef66280ded5df7de7bdc37dab76322c21d288ded9dfdeeeb8e95ddefbefbca6365f5bbcf3e280d1542ef7e01dd6b2c5841bf00e2e03e7c0f0051bb29fda800fa4db80ae108c7081620bcb0ed4f37c027e13c4c237e83f427cea3c47b943e7c52f8a62fedb0e7c6e94ddd9f42cea3871c8591f727598edc653e63cbee636cd999b6ecdec354a04278d222ddef6065a3efbe01761683dbd8b27b3c85cebcb3130bebbefb73a677a5bfb312dfa1bcb31e2eacfbee77b0650745d7bd4d0c2bcbdf3d6983bb86a3a75dd7617ad2f11c992809ef56a2f007dced87f46dadf5398f4a44a1e83ad8d2e2dc4e39bdb3cc7158987dadc35048c8b35d072a8483b6d87e52a02abb1f3f35bdbbdf2c7ac6ffbea48da03874a0fc86d6417886dee87de0ab6421c8cf1a8236bcfe95401cd677bf5a913ccf23c7711cc99dc3455b24f97a706cf11ce4bb5afffdf8e0d9e2a7edae980e9e2feee23035063ed972bdeac51bbe9cef2955515a5f64ed1288333efdc611acfcaca307d254a48b1cffdb67d87578007181fe816f82a7f8e3ce013e109deef3f6ef319873fb6a1cfffbc457bd596bbe57cd88e30a04ff7bd58be37b7fbabeebf819d3c527577c87ed39e8833ffee9e23b6cffc0a7671df749f2153f71174917c8bf376b4cfcdfaa6fedf06d2e6bb3606a0dfdc027c9af05beea5f7cd6c77ad787dbf51ac4f93e078b93cf8136befea95ef51b4853711ac68c2088810e536bc4f1c9a77fc3f8e4383e25bf769a33f96d175fbd6a771c654b51a5d3c9f72c75a954ab2737ca8a4fc11c6ea8a7f8a87d42da6bc79fce417886fd8628d7f3185baec6d1c3fdb4015363f4e3668dd187a931ca77f08b03a6b6e0c147d55340a77f1ff894becdfd74dc9eea5f0ef25d1f0ec2d3ec374695496968bfe43e6b275ff55de77a71f7d43e6f77bdf6096b8efd2c8e2fbe6a9f3a5da5aa1de42d1af5c1c7a90fbe4ea71b24753add3b6c27394c8d89e2db5cd57671d46a35c3c2ee87fd9e2e8c084f0a347a1cacacfbfb313d8aee79957eef591edce67a3a2a90ebb85df5a2596bc4a71f09536b44f03f10dc147c33869e3a303746b559df0ec537c38789b132f1c3b7348a1edaf0ba4af57d2aca616aec9b6165e2df078095b1fe7efa06e10e5606f253a7072b1bf91973a30156f6bdecfbcb616a8c7e9bf594c6f24619ab277fdcdefd52e48f20ce8afcd4ae7ddcaea79fdab593d4f5a93d927bf5748f9fbae2a7b6ede3f69e253e4cada15d7cd73e77581ac6741bab8b086954da35ee3c350cf5a3502fbefeebdef5ffa92f7956eb37f8df83e2d33d7edfb774b87fe33e8e5b64fbbe07b7eac57df2e8e27bdc07d2185be47ffc6cd9583df8b4f3b345f29cd5f7b4f3e8f4c573f526ba47f2e9cac6f7a00dd58b8f5b2b9ea37af1555ce4e3db5c1b0b9eabf752af4afdb74ff0456ef211823f7e4925825bf5bd8a531ba917798ed4ab788ed67fbfc3f6efe93e41bec3f614a7b6fc1f5beffdde274843fff373c7fdf859c2a92d598f777c056fa0dcd5bdcb451f7c0fdcae6fbbc60745d77ff4c7073bd787aeffe88f223f4397fe9e7e2f177f7df8fa6fbfc4a7fcdc71fb47bf0f9f3ec947bfff8a085b34ea833cf515fc511773888fa2a8171ff5a24a07fc11547dea2d48d361078042bd88a3fad6837bdce705faf8d4cac877f11377f0574f6e6acb153f77d87e52e0aabe7b163896636adca66f6d1d1694517bc7da3976d8de710bd44e3f45433fea51fc149ffe56d9a05cf5e05efdb84fdcc75fd9dcf14faaa7a90739b6652a477cfde70edb458e7a8ff6b09fb6699f3cbaf72b9016968ef41db56bfddebeb1718ce8e3febd0e15fcf37bef3d6fdfd03608e99f7409386c794110043fbd29c863d892e23ecab137acccfbfb383c5ad2b7e136278f19316ced6870435d732de3784c0c2bdbf80ffef7b5ce0d3a308418ec0cd1c2097e7073bfeedc190c1eec9c80094f04610556dcdcf7e1fe057c78222cb12d6ee0d19490e2ca5dfcd9ed7ed6d6eddeb7b29b7fa33d635c668cbbb6a5eddb3eb1657d5bd6bff9922d1ab545a3e64e69d746b0582585e2a739e53e8b2d717e953ff397b6c42508ebdbb7b1a695655ceab9a46752cfaf1374fde9eaf9f527d9b3d773abe751cfac9ebbbeff5cf59c3ab99ef99f2a12933f533de73fc59ef39f28f1cf8bf22749cf6fff34f5fc94d2849486f5999fe5e7f7ca6ddad2e6b7d69a56462d7f942db1cafec6f364e6f27bd2f1e3c7a5959d332c5666f9497fcc99d196f8514e4cf8fe92978b6cb156a32a95a91041af617e11457232e50f4bf94960cfefed9e7f945f73f9b7fcd3e9c0a327f91b95db0c0bc3317ec25babf5cb710d223c5d74ec62939d10e8dc37eac2ef5eae8347e77e781bc68f714f789f06dd1e1eee3ed21d4b5b53987e6d65a0ee3a2ed075c7ef81dbf6d1e37d6a2067f082badbb67f9b444f099c7af5ba8e83b4a5fe0fdd7e0128272a9b56e4e234a21fa225fcdcd90be8ce5c41417c7c626a29fbf526dbf57c3fcaee8162e244901238a115f0f410a14d423080f04de3026de105fa620595a9edf0a0701a91cf0b275ebc78e144bfff02c60ae8ccac0206cf9d9943307aaceca507061154f642847e21f442e88510e62f845e08c100623601944dce338d369a9f173f3e3e3f4177460add59ebe7478f462392cc11648264942073041921d90a643cb21e191132203241324a901192ad40c623eb9111212324232423242324232423240382427484e8ce5c45aa5789f7795e29f5f8b3d8b5ed81cf62efec21fb67076d25a03a9dc72d44776d7b60670fd93f3b682b01b577babda3f74ede3be3ded94222aad399c3628808888f9e1d234377e6221a2aa594f62ea2f478ff804d3f12519dce9c473474a4c808d190690516fdbee8d383ea745622348d4a4442444359b0b35714fd3e4b8855c4caf27b9e6a4b61bc9554aafd832a3fc74d442b88432215a21544a2941129202921a91e882856ea47e80279096261f7c5a709e1962a5af1b314353f47161789523fb11f3b4d028580709b66058d19a115d18eec581942d892c7c785f5a8388da8648768c7470f8f8f9d2ff52048533d08e2e00eba76cc223586cda1971f2f3d35806a34d1e9cc6df6c5a7d3f989edc5e704abb1d47c6400e9b9301f28e03195684768453423b6bc6f16a935342b688c8686052f42f4127267ae9f1f9f7e1fd603037267ad1d1e1f4bd4007ae97921827bf18185005633874c2a3cd368b3218a2cd400e2805e7c602130a9f05e7c4c2f3ea3179fedc5c7bef8e0171ff024240add1e5dff0ff8fe49c8ca4cdfb681e4da810f0d6020833e9484290011f9e92982cf7511a59cb80d3d3d44417aeeec05e4ce5c3eb05ade4c52b849144354a0a08344242348404842483de834e79946d2cfde2c42ec10ed1019298aa2d6804586accc2c42059599554045417467e6901174f6f203c89dbdf408b1b21a403da0b21a4da0888888884c442327a952246011b30a669122fd34f4a307355484212586868668600e7d313eb4e5cf179f4eb404a212acb604213b7bbd8fc97be2c7f776013501ab5531d443846914962cfe21da72bf461359e83580accc062cf89c60b53bb3010714560505620edd990d30a0b017228678e9b1321b5840cb5ba4df37f13346a45f582d84d54e58cdc26ab05abf21cb0e8d885674613d3e443e269b668408c80502398132c9400640ececc54d38cdc889c8870f70083b7bfd7d2fb5f77fcab8fa3c96c97e3ddf258f6b35961d268870f0401d038de8ce5c7f9fa5e8ce640c5d5a113d29132db57e8f74fd2765e248bfffffed574f41d9346fd34eb68c9a8c9db1c8872888cf123e20f155912991449196b4b5d394db46d7bfabe4f572912d2404813aa35d800a74f630c6d8c3ef91b2eebefb9ef33c4e6d494d0ee4b8ee3feebfd08be91d09632ff43aeeed8f3acdf193c3946ae6020e82acc55db639e76eeb9ef6cd765dd755b3eb9e3eedbaaed3bceb36ce77d83ed21beadb92e0e8d75093beeffb3069e700a2fb3e1269e6db62baf65ee70cbb0e8f8df4e6b76ddb56dabef4916ca498fef11db6776ffa909f9844b2e10da6c66adff8d971981ad31ca6c650b6acfc0beb4604fc5f7e59fec9ff49899282624b147e7eaf276168df7e66f8e5d78b0c19e251c29c4207451a3fee5a731cc7f5ca6dbb7ede668de10da4558c31de3195db3eef5a33e65ad0468495859ff4fa5a0721fdf3a4d70feb8ff5697d6dd6203c7a327aaa3b8c44fd662c58b9fe92d0370873749ffbf9bde33cf0bf53877b0ad6a7817bc761467434a23823413bce3035968f08b7af5ddfc0fb4623981afbb867638bf041f94504e9f74f5828e8717344471ba6d69c99c3d4187e0ae874dbc9d53cbd7345365436b315e1fd0d07fb386c66588b4fdbb9cfdc66460cfa9383e333788c9396b3edc6fedd42db5bf96b2bdb747f5227b2cddc73fcb3a59de996c7b0a5fd317afb3677568e343fe1a42d8384f44f92d61a5b1bb710a2ba1dff2104be7ef9a8851e784f77fd1ad2af94e60cd2ead3185bd28deea7dbacb1faf8734c0ca55bc53fc098d2edeb3e431d1ef5a9596fdfb6a7bd6e0c521db76f957631b40da46d4f414ab7d79ec7f536f908377e8ef8897b7ebdf11c97777c87edf7357efb30b586e3f92b4c8d65cccffa97c3781503e1136f278f8ebf6ebb764a411b1ce7b1c35ea09ff477d8da84adf8cffa54636bb7fc77c4dc73dce3f7b8ad69ce6f63b9d096faa3ad9c13637e8e3addde2b9cd474db82c22c00681495d634a0c6ec3bd1805ad3d101d0d98cc2ec973c2a45b741696976eb9d25fd81b4a6f6a831fb57e77bf567dda3d600a0066db120e8f6b75a8b286d0171505dd316fc3d721582d2504a533f638edb388ee338cd711dc78d38cee3b88fe3b60e2aa3b40708f84069f05b8e9fd4c83d45165b8aae99931da2688ba5f907a1b602dfcfcaaacc7eceb5e76a7bfddc6bafd75e547d0d83307441e88377edbd381e3db11f26690df40e7b42fbbac710826add0e6008413cdd2b79618efc958734eadbb7fcebf46b78f17d4c23033de74ecbece58d659c3447ad6fb9ced5cec01b7d4769fdd377375de9b4abbd296d10fc4d11df7bdf9db5467f7a9d9b0d3fc9ebdc6cb8d2e4ef5a05286d80f4259e3b6b15e0f4e1e9e94df7d5c7103cd43a45bda282a177afefecc45b37c03ffd89f3383df83a375beb068fd2935ee766fbd32eedd13e2951ef2e7061ddd7da0d9df4a8546cda887ad429221900000002e3160000180c08060302b124c9915815dd031400146c866a564c1889844910c5280a8330c818820c218410600c21644846e80a939c0af29c5f2725b2fab26dd2b96744762875aaffa2a369a49860a2a36aff4d2b2498aa2c5c24d31c7a141bf818ffe04cd7a0cb26466c66e496f18571c71ee513e302041a964473ffb3500092eb6e6c19afafe8a4aaa9c699413979007adfb9ef0ebf4ece24a930f3c8462a31014523cc7bc9788b8bf25ea875e7bf5037f45af0d8921d95af008d30c00684f31451c0b57c27f5d57ed7ca3b5231b7d7293b19bf01a5879515a5ccb87964586712c06f7c36384a805e26197e820f793cabef95292f485e8dafd397c25da945c3d0bcf221a2821259ac2356af74c61fec5a23ef108917127135f855de282a626b2b3f14acae375a3e6668b8c1fcf6a0cee54a408e073294832b3a6b521a1eb4c3371061c7edbd3e2d7828f2ad31812a675255ac78abb7805f0b4c26ac60ee5d6e70d2c8af2efb33ae1ce50d48c889c888e5c34794cd4203f9c8852cc08d8f227e8569f11105eccd85c3330c13db92c644cfd70a5798c99e99ed81991303d2cb5bd866c5e00c2683abe3db0473e3f598615c13cf1236bbc0c8e32bf1457097936bf4bc1c2a4011137d3691a692713d32462bf2ada1a8227ae3b551e68e5c8f67b31509a52711269e3a371cc15bd22062296a95851754f3dfaca806b3f16bb0f2fc33cd26c7d9ca73063d5860ebf466382d880d48c16689212b08d8c10a8bcebb4c46691c3f9e038dc0cb1b8861b78b65744ecce3c7db03d60abb16ed0948e6bc74c1159ee2a48f56547d95835f543ab9eb3bdc41064721ea365917d59aafdf77b06844f73268f62239d2c1fcf1b7c0de46f660e065f2391f232033b7504ca593ce215a969461bd490a26a2140120cf12b68743c492948c5377b47200761a7c5a47ca516d3ea71d031b0a1e1f4a1b3b7c1e88f4d82d6e1335e78893245bf39ae9ee727e1e7c96138b53928ca2fdaea462c0073f76adb194b9782e858b32d4e56265179e0d9a8285d4d358d95afaea445b4d02201e34d5547e487b1aa7bf0b251d8dae86ecfb15c375303615e0bda14440d1827191447c2ae4db3b299b32efa1405a291f1ab89385eb91ea4c853c7b07c18fd051127e0c0e8b500a38116c2dc84e64e0474265466b30371b2cbc19a234e390e0b670648f2317213890d0102513907ab4501960f0a6418c1603f9781414dc672995b91479d6150d3c0794b0b09585abaa5729f26608d7471f34228f206e03a8d6327d780addfd8672a5d31e4c916f8f20befe3f6d0b0a8e3045be532ee486c83dbaf9caa0ca658afc2ba0af7d075922607a105200aaf1640a292c0b1888a5296f0321a38e86232c2276d8a093070286e39efca707cb4d497757ffdf18ce5c10ade02d849698364a5b457fb946434f2a7d18d82268157ccb91520dc5d85513dd61b41c43993bf2ac35971aa19b4c427be4f7919b5838abe9533f8c3c338353c522605852e067ea020029bd49a4e75d90711113a85d8b577e8c110a89ea729786d94351a7fe0f852a497e849d0dc18aba79af6028a1b9fb5fcc2b4a499e2bf0debb7574c24d97eb8cd55b62f828c3549225a5230c0ac62986a478144bb515f404e3ca04bc1e20998898a81d5771354a7edcbb9790f313948ec04ba2b21464abd8a2ada44dbc0b28e585af1545f66fdb29c697b4a568c00d724c8140ee3ea88f404bc60abaedaf5e7461bf2cf9e0d8ca9257dc2bd4351ec660b4106a3a27d4a94e48cba218ad4e96e6b6cbf38bba6d4745784400ba9998914c4a339307a64c4abfd75ff2fc346728e85832e341c6445866f2a36dde6f9df505941ef7bbc7d63e095da15f835d6bd370e02f721dc227da39539ab7f1af2827822e5528a5ad353d4ce205651c728e269785e33d41e2461387a2ce849270bc338875ff8480f087c18e1576ce36afd5972e8d3ee2aff6a256c41ee8f436564f9e18a79332f77e390951ef9032638a8f79b78e74fa0ce935f9c191587114490eb8a9ae9efcb38bfdb972e4f0c15a2eaddd5148b94cc38b42e9dd1b117e8ba76d9c7b933b93308fe6c0af935d7e6c19930ef66143bd8124194ed7394c280a9e6b67739a85bc92d71b974ba06c50963ca07f189bd03bafe5bce92a1088dc9a53e4e76645b86159f2cfde83fc5bf28240c4bc504db3297d81896ec8274faf2c4b96e6ac41f966fe3e42c355b8172ab9ca4544e778a54c4159d8882f16d2f94235ad96b75d0ea84cb7a58c071dcd5c41dd262ad3ac86e449e8e005d17f0a169338113054b10e1c83a3ebabc049db1249504a8a38305437e446f6ca52a0a3a12abace10d2504de9b906ac505bbed35146b8b2db94114f9628d33454c26b599cc982007ab846780d4f8287f6a286ea527d13cdcdf12bfe17fa5984431295bd8315d037a0be74d5502d6334baf38194931556ae973de4c8486631a8975971265943d5db6c360b6061ca5e00e7ef013efb44646bf9e2ce1f7ae4ed7a992af36c0d957eb95df7c84cf4cbb50a73ed8e7c8d26cc46e59e82b9bd660e148cb43a7454b4474b11035574bbfa5fbc2c24e58b8a29b5ac1ec57f8c586df851397c5314ddd08deda9f46510ae2548d842fff54e8861e182dd9b043c541a4eb6d2d83f4a9b9f09ef8f4765b4e3432993d5cc073174b71549a2c8ba66a550e6e3dc5119790e3f680ebfdc8901ab63eab97f311e2acadcce12be82b0960037aa9ba6e974e8020fd2b7bafa581053a0742b62889595cd4375ed34eb3a0f158dd8ff5477ad94fcafd579a868d97fbf62f365693cf05707ba560a32850c4b117aa8fa5a4eadd967a345a92e2f54a849484e19d5babe5c41547ac3996605dfdab36e80c28c52b04593cea223ee11c0755b54de165cbbbfc3974dae0b6523631dde20c3f0a5cc522d895d1fdd7d0d40c12568601b07b9538eda4a0f1579203340c1121b817775bbd92204378bb03c91cfeb5fa347f5c1ace5d9f7b02d29975ace315d5c22c3edc1b348f04be4cecd22fce412931eb2e38c0ff4193247bec5f8e166c582ecba69e7a6e16ea25cccaec4560aee43763f790eeec11ddc9002878d7dffbee273991788e0894b6277316ded5cea272ee08ce5024762a6f194b6dfaf9b498a10b76c8b504f1bbb7f52161377c6fb04efd18750743291200269b4a60121422d69f7399eb2b8cd8ea3f2989771e99b9b55e9b0ac5eb1d268901298710080dc215418776f5be2087d2f8ac8c11bab6c13f0a596629733ec35a3b6e7a8a1cfa7d5d079e2845afd5133eab20b2e9b5bc1fcd7b710f3722642ff2580df10d02b30586c81d964469291503b13d6fd75b813eb0e02ba644825aa94172bc81ce048a2c3fb708746022ab7e2028a7f06df689c8da35418d2d2827857d60f968ed21586a0dba83c022a3d0c8cbab2e2b9f49c95f04f5d722e0bb8dd5f712c3342dd53673473a01928ff0d8fcdf0a9044ff5d4ec2620a9d0a136a49494242d0155c7543a921569b077632c212fe9c1e8e9b88d6115f005f1993faa5cfbccf3c72795009029ea32fe238ada43730a70270155b7f74108fbe1edadfa1a9e5edf7389d60fd6150172c6b07627a56b3fbe4ac3158e26a0eaacd31a4f4eba0069f360bac311dc7b6f084603e845e2f4e824a2a96ba03a0664bb9c6e38eab6174e421e1c62faa88158a3c4886a8d09776cc31cf710c50772ed4bff54a144c35bd8889e3d92854ba53e16c7eaf69b92c9aeaaaa6bc225472ba249eaf7936191faa67e05dfdae6e7b092d10ec73a436efdcdc31dded1868cea5e857475dd653757d89c9e5900779c284424dbdb4fd1edea2a9ff77158aa72286a5695992bab16de1c63f1170ebbc1b277cf6a4b2ef017c1b4028b825a77a228e8a8ba07da813ae7277b931055e5371287aaa1a9b2431b738d959f9a434109067da95b5b5b460068a053b79912223756933994e008a026c696651df497418d3caac42ce9e7ce8583246db2be4dccac9b7a37abb87ef3be2a906e0249ab767ec751f3d325b55e33e1beaaa5d65ff427db858ecc79c368b55146b7a760f6c2589308a84a23406b54a3396b6e0c0e415e07e8d50cd504febc3206510222cc8b37467fc6c323a422e0054a1961f9df7788f3155c2694a9ec42beb62759f437371cc8c36cc4e47b8848bc38d89c63728cb51a1da451c512f1f03fbe43375fac591ebfd18e86f831d7461db3915e8452f8f4644d614a04a163a3c8a08f6154e54a65f9d78f72226edf2e0c0ba33c9f2c8ffcfea78c761145d3f0238c30f2604747a28e1f5e82d30efc613fe51ededa9ecf6d26c1f980798d27db28900ea93c20b9363f68a6e92c9e49928fbb0beb8ccea61dd9b04edd698787ad75a6ae55e1d831d0543157c18cc08e23a633d62d71f285d116631dbf9f4198f3341cee41a70da9e8619265db6f595eac058be799eacd49e82111383392ebb84892156add6a290908111a9843e2528f94518cd84335a23a79a8e95c779c863a669941480f40d0942289b73fb9d2bc99ce9c1047ec3ffb9b336d94fc1c9e5b5eb48392bcf00bbeb1b6ea1f31e01f4ec3f065cb6bad5cbee5a6d3c0f63c7a63a42f0865d38ad0dec32c580e437178a2c464d13da0719b1033adba10915461fe093dd1bdad6fb308fbb6bc1122e0081f0cb2272082cb690cf47b0f6a71658fcd7235517be50cdb14a6caa3698dde8d0531b44b35822e6134beeb8f23ba329d83126d53edcba4ce2eeb6bfcd5303f28199ae5a4adced7883450a63ced636fe968a681e93f61d1b41132daa072b4c9acf424543d13c1a165562bc67da65745c14d8a952ef315ada00c880d4576f0454948d6926106bbb6bd6816fce99283770e65d38906d0a18e1dd3a597fbb87abcc10f9ecc081df3c91e956ce21fd3be5f4ae779dc292d115b723bb16c09b2fd655bd5614ca9a4efc1c95c283b654bb314c4e590685630e8c2384ceb2c8b5ffb70f17e252d45de16eaaa420fdd8e460d61eea59127ea774e13b774f93e8b7d42ae75bffa09ad7b30857d113d81eae3b905408477669e679e41690d7e0ba18535cced84a782d615412b13f4d3957ae848a80d97053c32a6f839e5a38e8b568f5351e4b1d171dbce6c15e5d0f02bf5de06eb290263265910ce8f01f71af1eca030c912b1bb353db2ace9dcdd137d9dd77708561459fa674d546aeb888eb1ac3be96e47e66c70242e782349791f385477664c2ab8e728760735150cbbc75255433c5559d45954f6b73bd5ee3a7b32447d2f17f7ba2cea54126c7a91d4d1bb987e9c1db74f9493b2e2bfb04706e90e4cdc38cec70fb7e5088b658b9c6284e3503f336081423c9b1a83860ae5880b4a3c7e86355ab079641a2b1ce8fe4df5587c51c4fec392f53bdc3b05c65ee38d367859dfb9e2052fd0ffd653e708c05bf21f94d3a6540193214704c84668c92d1716c198cfbdee4aba9b83603f14cd48fa3d3e71aced7415f3d48a9668f0f17a8ad56362da47607cf16125a778c852ac59e6c05225c11f58b49b5b373d629d4dc5903e0a413ec7608b8e06c8d73c14c36be2c1d58035c23ec0576b8cd59f7ebd9e0deb7715e5bc06e7435d5629b0414a2ad2ca1a9b804a11ba9b2e18533d60f208332409ab2a5c46270832e164c39d6ed5a8f18edba9389800701c3ec1dcf405c8ed7c8e68b8c0ec0f0962b23f0c27fcbce4f6f739860a49fb6801242512ac60cc13ce4a5fd28e1593d0f305e66de5bfa5476f704225c736a7239fd68b604e05e0a508c544e161a93c760e3f7839175c56f35cd8b1e7bf7aae1a74425395b42c817cede2f62fee022ea307b50dc8b0b89aa89d9f64409d514e97430d1186ee9cacd54dcc98eebeb5340cf7b7183acd086dce8238360489c4d695f1728cd9c892a6922d262591ec8e4ea82c11a6e47e83dd1aeb9059f5daad1c7156d59627b93b8a7ece9dd480694d8316251a6602d5e1866345d14324406afdd412f471af3dbb1737c2b650d88b91754c35f2a235ff84ce4cece409fb309c0172e35bafbe7ea3ab7640edff45e7cfa1c3e2a39d237c126e54110ae88b427074899e47ef6259856f6a90235506e10cbd6205b9dbcf2e2e8300bbc51df43a501b5596409fe8ebba8de56f7d3a69d80efbfee28f1bae76cbf3479476d90bbdac15c503e967fea76be7da85f7cc98001112630b0a07ea73e900a099eb2c465bf79a1a7b538b3250421876719fc7159fb332d7563106ecef0f9b77aa2f329762787614d748c13a7e7d3c8b048dcd8c24d297a0cc6e1d39f7f27cfc0b31067b5e496a24a1aa1e3f4f58616fcd5f03f87aab843fc5b1100b3d54702d997f83a555931054a88fbae60063d18d012cf254aed1ac17e14e0e01658ea846675a278b6c4ae1a1898875fe9805f97ebd6290965c64042fb6b1926d7a8b3b80525172f40554bf52005d8be5e08eb9060e9138eb8a33196c367d5b938395c6f241ad833c15d1189c984801c034a15c3b96167a4218bdb5232a579d65ffc545c8ca01881c4cc66e2a511df875ecac9346f31cf1458c59f382773e6837f665441258447e47e3cc582bfec1eb3b7601a305ef26d1196ce0f7e5a5183fc0261d8a1f36ff4934ae4482d9461253b316754008abde85d0d89b2c3ae05c6c1fe946e88d9499fdcfa3b4b18148a35d6c3c899f67f979d7a1eda52c16b49f0d1d45c0851366d5ff4000ca6381019fb7ae680623700a570083a7029a0b964100a594a723c20cb762509e0ca4bbd7770d7814d440f60ecda703bb58dcd625966635fcda746d354703d65210f38a7e11faf59743d1f9dca4407fda824d680728f7b2bba63a5dd06d2487a3e0e0421b6a97b2df1a15e59a1fcdc68dee18b4baaf1f51504a0b1888507b71e1d27b016ed0e8d1c83d531069ec305580f8ecd1f67ef8680c1d686a75f31f6bccf27f2dadfb4b5a10870aa4bf7c349fdb3de4643e9a17750ffc11b682327ed3cffeb9e732e27ea5fa4f4ee80bdc88ac115df0535118b685382a01a74a1ad3bcbb590fd3c73b04f959a852f6d4dc0b4ad2625844bfbe2db583072cf4934738b0fb7e28da1dfad7ea0c588120aa07fc88406734b727317df455f30cd028558352f3bea38bf38c4cd79bd0c9f1113d33d425e7fe7c653b9bc17da0009b0c44b17fc7cae01dc839dbca77827eae90d96c64b902ab6119358d59b7614b6f2debd9e2d57fb2514f2653931ef6c322425b14888837cbe6c8194ea845f61580e4e8388f582633035757e950e20e4339f5175cf04cc981fe3cbf5efd9cee297f24b736662e308a5427b3f52cee687a14ea49c0a68b5d3a9bb042b8ed443adf8ad89e74f2996ade88904e8e243a834665ae21286d26b898f4cdfeb823d9114de8c06ba14dce07eb4aa3eca4085e08499ad03464b6dd12645815d93ba6ab92c7819355bb39a1eb2e9a297a9acc019ffe32ac618bc23c46f68dc1dcf3168b902fd679226f1b9c331c0fd2dafb6910a14cc3565087fa26fe1fd69611c9fe1f4e7b20ca83729a0f75534e4b28025912502354e09500f3ccf16725930a314e2265e25c05fcd61cd50c88fa78f2d7da01ea6a8de169d82e418ab4d05b1debe0c1409010926cc4c2d83cdb28625c6f3e751f66667b50c261128cce44e3d39cbfb8b0d84400a8229807db711031d1a51a6381cb8266c27272d93e89968484004de7c06b08351b0d75149663410ec414dfe2c9322b00e854fbb60f9117c468b281a0c7b1b9253b3c9ec6823e72a449c089910fceb558684ed1061ec4ceb1eb09b71ce2a9f47f6c8b3c7598f5b46d21b61578b71e643141fb09be87ec42ece6648303d3ac38f0af52d1939ac718486424832e29ed4c4f072affab0e1fe7bb09a72daa7be51130d34455511628212fccc90b5ff8be95eccb6ea90ec389798748cc54bcad8604c93b44102fcc510334f5f191bdca70f4b3d8fc6b382a6210ce5d61f1fab720baf06790068e685f8b242b7f5a31bca3e32f8507452edf83fbe065d098fee801879d34c4166bc2f834a8d7560a2430028203e66df7d2c8901fafd16e5e9da9058ee9b3f81f7d30e630c401618b0d613bbc967c6dd1c714ef15fe0c4067c542a6cb1fc7dcee5b3862aa792cd90fbfa3137b023174bc0deb1d6cd4200f94b37dd88bc712c00ce33afeffa972647c035e888caa77e92c9de1ee53c147fbe2ba5198d24241205eeda0a9add5ba61a2ad5e3863521beffb59aabf3cd4025a3497831a27b09664521568513fb0f33df612714f7fa353a9cdd1bdea4bf623aa633caaaa61ad066459b4845e6dc2135fd294079f293d63a6c6b918fed75c369fb7df329606c8045aa1ab27f2ac756b22f2af30087bae2767bcddc0580fa3aa467481053722922bd2f84b958dabd6a8c8e0b34127a42184430996b3a8aafe296679274e23c87f202c7e99633844b3f57654d557dd602d9be932f81a4770083ae097560aa20201452dc64d2b79f824a8aad203927dea8c977a48ec257658d3b4568648fe10c2436029433480082400b0cfa9b5b1375ec678c527c45471326d411b7acc649f7fe5fbaff834637ada524bae2b18a87095a83a2c626903187c00a6b3f1cec8afb469f709f04b7184de0fdbe542c4d9a6ae77d46ab9be2597571d319f407e454fa68fed06e3735110ece1cf3ee5ecd8a8965bfc96d7322413ce1153fd262f767681728988d46fc0610fc5dab410a98b6c2baef24c39c9b53c4680b37a831215f59ad902d3fe16541492070ce845a302744a9a68d4fdbb7c8eea591c283ddc304606cfcf84bc88b3afd981145b5494ffa6283fccb70eee9e23bec60b384425cc03b6ccf999b2bc5e6e12830ab249da6ed4a104946ef93664a083da64b62615d26323606f91b814a5e026c28ba71e0947965cc9d98e6864d763580f81a2b22064cc14f70b36c3d75ecf3d0abfacd0694fa0ef07e17aa4712b9803dac9193fdf9e8f47806ef516593a6b837f0a297d3b37a15574df646d2a1d20bf0cbc63e9e0106cc90caf14045af04f286c35cac7329b7ac5a237862f99e16563f0eeef5a3791b7c85e60117ca6591a1c8865928f176a1041f50008144c14b30e76b69a837373c121470dab82c78da14a112047274c6c7b155de8f78ff8e15591e0e74749d21b70f3808c3ab4a6cb476f1c4adb472942059115386afaadb313cebefc4ee30cb9608e1d4ce9f251a7b4d172af6180475bbabe83d08daa374c4af969fe80401d05636fc3c6778102c9af96a56d0c6e2586fe2e336a3a0fc0cf3994f5ad38b0f09024b44ae32bab37e08ec963da798691e9f0fd5b2b8723016ebc7a9a55770d22362c8487c51dfc5d221c87e84c0960ace4b73c591f03a169552ae115a4a781fa100d81b068e6bed8f24231b08b5b1203641d7ecab99ecd1414e0e8431405c817f239cce371810f8cac14ed002505d445c9447992c747325ea74af4adc4c1424a0ea94c1eb5fef0e6acb4ae1db910bff512293cecfe65f4b4ea7210819c5552a3978d5c85748e2a4be4d50d2c45ac1fb381e0da04f4f990b3fe50f381157f0fd1db526f63b5c1b3a008fa6e4ebd524eafd60140e8ee3cfe0ed4c2f56f59e3fd67a0b1e3d77080c67b9d9d1926abc4a0a07d3e87b0ddb7c221d717435fe50c39cc679899e3060215b9602554d3ffe5fb86b31e956a0de2520b849dafcf62d93c81c5e5e0a8652933b095434edac60465c7824da604b6a80ab91aba555efe1d8e8700bfa11c90d8666c9c4f8b06a335f5692d73bd8aa2d6d23baaf532c145b229737e05d64a5528a5242f11094c5cc9ae197d82316bf7fbdc77eb98794fa722bb815c5830d49b5259b5a2a6366d77ee1fa526fc215c1233ef320f673d43e85681b4c6ea3046bb5f84a56e34d051c544fe04aa1b8b3984f37e317c6cec76f0162cc3894e11c7318a6c21f453b1f7964b6b0f2a721197cc971aa0a46a80a4f4f598a61be2a5aa63ed3681d6c12252b3612233d858958d3a3d5da6e5acedbe0acd342bdba90a834e50a8cf5b07acadeb879f0c2df9083cb5c0a885b55c9e274d867315a5f8b1d2bf92e56a63e40b798090914d503aa94638674255f46485546a536b40bf89df8bd98eea5c717872e62822a73fb465e8bce94ef112252521bdd185d48d1b0868bf69e088e05f4df66122508e87c9c671cb2d805a2c3e58aa29955b7a55bf5b1da2557ffa865d73e3c4e8291d81db582921e4b6af03b7eef6534e42fda2856a785f1aa8459d5cec9506e9c9f1c5e3dece63bcce2039ac2907b59607dc7d7185cb6a487ce144de123fa7f80eaa7c00262e88432db4442d21888ca8bc0c955e2d3f45b8b76d0b3ad8b18f491b307b29f7f91b6d9ead89c707853021a1960fb09309398cd77483ea6b2617641811d4307e6631d8ccdfdf6dcfee0fa18756f99150f122168d4728a78ef9fb1012cd930e2be3bc9adf7983ce229d9d9a2d85b6e4261cf44ea86dd51da2b6cb12945078cdcea4cd48095d11d801116c9bbef3363c17c6249be8873750883dde61ad43d592322dc8f3e9cb3e0e0a94aa206c163a7eed9341300f96ac199f025c2043c16f14b7c1ed93a1d607103fd21abd591f65e4c6a4f2b20a992b3dd917381be7f7b9a21b0e8ac4aee220458671a2572b1143d85d37385645b9848b93c1e2ce232cfc8c8db3f22940ed68d90236b0a4a01d44e878822d591544f5322c55b81a19aa7b6f5f04455e9a274a8bcf2bd04148bb0a544111f8c2582f2c0401d9e3e24c2d490115c822461ea936138ffdef9706910b7618243e9461a35782613b8cd16745116de52576c8c8d8ca32db76380c422acd76a9f9881d4b1e85c66c21c6053e6ee1a219e5b7421733594c525d1a80919520cc29a54b1d4998c785ad364e9867d4103be0810cbbb596cd8529ab7ba758f911974187fa5cf4db633e07e7b2d284389ab2b037ab81da6c80ead6ebb78d688b367bd12b6f80ac60d2ba0c42161852a3e9bb17e05db626ca45c53bfcf84da77e39a7a4c56e0889e755835e804bf987f671f96487fef48d4df057c91b5c6a998febae86e39cf36a01a41ac7b6e7a8a097cd3b5a2dc4c628741343104ebd2011728c9e2db2b0975267b5c49deacb0608e02f41b6369c71cba468bb75d186cdb10b4c61a948aa323ab1585e4cb37ea58ad12d7d981c7d3f4d2384549df6df3e996ad999f4b1aae8565767dd9f85fd230ab168cbd0af53b3361e39865ee283b82c2f9a8668d9a75ea6221af28f00da367f103eec98e9234fb31818f04b1bb12a5b968812460070224bede0afaa6b49f6a4602cddecb968595c040505c206f5d2f2117e2eae6a8f0f1d2df435d42bf179399ed4d09025613dc1700b73a2787bab42fd7f5d0fa5ec8c9f06be7a95185be38760405dd8bb6ed1c574b9f2ab866bfb9e7cb3cf6a579997bdc2a68bd216a08c1b8317ba51b421ac14b1110605122503a0314558f7d9ce69fa6a2ed7e555de9336d563a8f103fd28f5fa59561749941a1600cd4b75805dba295fccc65d966d40f6a22e8c3be1b432b0afe7c3709e05a427796053790166202286aae4a527148290638f76a5c326c5300f42800000f59b7b8a6c8b993e05cda80d864293af161c3afbaf5aff343dcd0e86d021ff57da52143ca596726c420d6a1456f8090a3c2e211b53519b3ccf29155f11aefe0eaab2e620fb5368a4e0c3cad8f9244492d0b438374f0cbd5a91134a6c342928e7f11ce3467b5ec98514dff18c8b701403d880d6fed4249a2528e2a4226e9f9d1267eb9701c7f8f8cd1385981e4b9254fbff9309d7fcd68b061e4d62153aa6dd3300a5731622d22ad74dc0515d45a66e44c2ff4b8218d86b32be01fabad359cc1254ef91295b1d48d4b9462e25af1d34df22a518c744af46f7453c5331047c3b0d1ac2096ff89518960d5808ee619b3413b436cd5ba57f5664566811879f3026b2ace18861f6fa3eca21f658c708ad62a8e41bcce2ba2ee74111ce0f822a4016bdd9a2dccfd7a0b888f61bd6286bce409148f4f608809ff0d4899bc5756962ff5742e18184a1ba8754ecb50af4b761011e292ba75bf9b9ddadcb01e0a68d5aaf5a7225b6d627f4869a674d4864a80d540ef918250c07422f342dc2c646929f316df90ddaf2493624af366079ecd38cff236c18c47dd6e6637bc6fe1052216272b53237d512ef5393460d2dd0ec2189464af70f6b9543d39e458efa9ce8030f10c4aae56a53597b3bbcf8328c4097c884a1919da8a62d543227d4b40f91ec941aad219239a1ae3d8424a7d4b50d91e4b44c51cde98808b5604d92e8e16a7b0c84e242f17154c05c0e7fe311fd300b5680357ac6256693344202c25c37bf30d1a49a1003bda0ed1f955eeaa28d9426b074d3c24253ce58cdff25755da02df1f9dbebc71a04c450ecb803872a9d730a27d17423f4992a4b936061c274bb3853647044e097101c79bb6870022eddf1821d9e93ba6b2f4cb001a31d0c29de38544b8c0d8c5ef89ff71878286b729f83841ee50f58d875af6dec9fe6b6aac2cf9a607b348a8e10a1cb756fb7f3ff0c48ebb2798eeb2244f04b404c608c10291188d2b72468bbfe9bece68d4d7e93aafe1985ce86f47a7e139b37c568b42158252904f0411b0dc85cfa53ad5a54cea72096577a7528e1c205e0bb3400a8c6c608b331670822a7c6b690ef037bc1ce4bb692472a091c8689106bb69b6906f592b653d39f8dd4f5e589537c2fee52758f6acc88546809046b440ac0bc9738089c3873afb98ed1a1c0f669eed0e75d5a3adf2b08febe65b3259321a06e20b084d91efcb808f5c7e36f4da319367eb4a0eeab0c2b0c43098e2926753e5264ddfada05e5613c2289d87348928efd1f84208a29b619fdb97eb167bc975ac58ef72caa29e3a7f5ce20b117c3f90f79ebb1a3580797c0dfdf055cd2d5613ca0d5d45932878c9a28a1db4bc3380d521599800195454b4442f37215edad215132618ac9af5f132514b94d724388c2734f946c4bd003992c230ac1615993689eff32c953a3fd921b70d2cb710157b6adfe3203f72f9e74bb61411ff92c07db67a9733d22a2a4270125faf0a46bdddeade908a3b679c2399a1f1878d20b174998acec471adc83e95537f2ad5596de65946c440bd0c6b52ad36928ba9add44c086e599363532e70d71b9564da0cba18409c62b5b69adaa8c17bd64f092cd7ffd6f49b73a50fd1501ada48c3115133e599f49e5021bee01f99915d11018650593e50f4e97b81cb751317a4c430f2d4df5867877e2837881a86d739ac0b1b903410809901911282d9b0e2568ef7d1e0d951c5566437de61eedc01e0ea942f9323085175e999983af668de588d56815ba162d556d85a95518861a0255b07bb0603f5eaafc90ea0f2759354ead24d350a9aad227bdcf5d0a599b9208fb921e74e128c32223933f1ec2caa08595e44ba7c1d854efc1a219090dc5b76bd0dabf17fef4a08ef0b7651316270ccbec50698b2eaf0f032b55695d69c7c0d8ee491fa17154aeb0dc30e3dd121cc1b5ce0b3380859e6407413681422b80a720206fad3f48ca45d2e928ae142d8394205a310b1e739d4413958d77c7ec341ed5345744fff1a43689c4140696d8f7e69b249548d35bba119238cf240df585da982e20dcbe4bcd77cfd75b172c2d7cef0ef80daccee7a6b7898a79e93d9709c5c2f584202f8325d934b6a44fa03e63358592557669b8fe49aa482a0e84b274ff49def87bbc77c2a462a85ae8a491ce33ac2875d61b409f104ad53334648f542b25b7a56b235bf24884b3b2d99b1afa4dde0eb87d91e958ba5e68720178278e3ec87ba9bb19977d05320703315de99035143ab508674efda468a1247c708ce076527da85f0edcef88e11830042c4deb28820695d7cfbba3de0b9722074814ad438a06a88e3ad459d413076c7db4a6b12971e082aac0ff48a924c50bcb0748cfe0dff228768c09a545a10f51c87a2ba4903e4aebe458b3506fc90a9916a56bc5eda7c8d071fbcaaeccb961037a6216e500dab1d8ec36a6c0d3d3db3b71a22ef5f611efe2aa970b0cafd272af8a7862995bf03c981b27ba0ce68b2ccce695dd51ade4302e2acf953395f14de5dc6d2d27a179a2de4ce11aa2b15344ad8effcb8d138a2e7ae845df6385adbd3bd4f4ed0e64dba516b7743f05c7094de1f691c6e50ca364edffbb17525d8325fcaa6c345d898d4ad078859750a4046e6bada45d1b7f96abb68ae450a49f829724a9cd9b0a93112963b496c9227ce963af24ef3d1e4f9103a8d667b0f129104c384d582ad415268e26f9190c210c178c64146920895b735a8a87e5c9224757efbde105ebf8698cd4159a78fdb59ad92c1dfaa998b821ec3869789468d3961ebb4cb5187f54714d624108f8d42aa05fde419164c4836b60b8daca3a8261c9f3b23a45eaa4434511031cce74c71003df83b808331684372b5be0bca6868420a24ba6047a41ce8c5c42604822a56361140fc29d433dbc40391e16e7de303ad9076283ec117b9cf4f2b90c1e2207d9b104a84f4e5c81ae03c679c9c02c9f806a319331f70b1a4ac239ecb0405f03361584c065a620ef6da893c1baa4687a5e2b1e949f7ee46251f6f4e2f1501256cbc2149ef9711695943a8bdb506f20135345a6874aa69a0bb782ec982743f18e2bd775aa7f2c5c5c60840e8a6472560ecf2caa82520a32ae180c3e3ea65968313f6288a87fff051c909871e5db703064892d206485ece64ab7860207862b568fc14c3aef52aa8126b314d8976115ae68f8ecc6c23e7c142734eb948371fc871e871ecc4725753679215234ba9230feb19b6bc2548440a3a85a02c9edb89219827a49a46ec74a7e29b4af328cc15a0f826b1e063e54dc926481f2ecf85c39c67db8d0926ec39493f061b828c8a30fcd983574e5abeb6cb0e84adcd70b882c4a1b66e1b3be9853f5a12bcd88e4ea3088195d69893e812f6877e8daa28077cc6374e5441f4651b54675190234837b7bde0459a783dc4957261d5ec17c2506a0db3ec0a4313813469a260632e054febd8e74c765129370cc2c435c02841084d7a16f2326aacdf402803740d80a51e95d597bf4f96d520b0c857a79096caeadf5a64446a12b31b0e84ada95a6d8069598971aaf90b671f65729227e7f6434a2f2591766263a0873af4107c11b4b194c894ea02cc8de4e8cc4841d1d739255b1ece4e0a43faf5849f31c8c34087498072170c1c86546712aa6e9a85724afa53ba6330d589006db5792568c9de01abc88f161eb1242c19b689d28400563556412290e7b459beabc67ca4bfa2e8d452d0660e85ce2f5d70b8fa9cc94ca9a4c4d333ee30b68c66eaad8ee95df2feab131ad60a05eccbc794451acda0cc2ee95ab800ee91b838cd6052cea4d4000bec205786d6c5d484e8d01db4bd80c0ab414ad610c31df27019cc9d064cc30a914f80817d9381521486fca2c1a072a3ac91873e7b1d15671a242f94a384c854a1f765dc7d38d5655304c116729cabb318486ca9b8070a9148fb819631a40bb280238933d5fc5fb7c65a7790348fcad9faf9c21fa02b10062d9c73ad072a31d942cad92c4fa90fa0a5dc68eeb0482764e9d6804953500a1be122973d2c679df22608598b46a6e37c625d5eb03999a4fbf9293d0ff8510f72bf2b2bfc05d87b6780ca4dd70bdfa139730b9f4cfa56e5417c0c2018be579f68e08c5f63ede8965065fde6290f744081bb2416dc5241f23c2da8df4a1754bf4ebb054e6c6c0a2c601a994840459f91816557426228382b36fd1d16f63ecfb1e7f47bd19dc0816fb129049f8576fce83927cd5d916b1bc32c1f239bc88c84b132ca19f3bf1bc4832166412125929787d1e418b410c84c318000816587fda40c64c801016b20dac2cda430a4b9fb715c3b2b0d81ddd3a5c61e10c04c3c2d1936109c5c0e66f99ddeadf99f1c32902efc51512840e79714207362386e59c49186749388405eabc6a04fbd3892b5a043e7c8521fa03312c6b8b7a360e885da65179382ce38055f3687d7c5e36a26121b79fce1a169569bcefc60dcbfda4868ce79bf1688928a58733cdb3c9a7715bbad09eb5d1b69ed2e65934ff04ba462c62cf6588131f1691dab87d4df65845dee8219752f0bde0a6c8b913606518d8d25a5f3762f11f0021b8243a45292b9dfa8a90631219003cb29c32163f4cb9516b97dcffd7a73bc16b027127808a0e54e82014f45849e2ff129ff6a72b16a83c05388467d0e519633ef130b6f61d70ba584c48f3d2b2bae817f581bd2b97c9c3a344f857302477775ab7b5c532cfeef107cfc562af3d835e2e1641a98692aeb361ea4e1a4762b158951da627938464a19c63590adc73b1080cb4394f0ed2ef0cd5bc757a0ee3983d68e0407582eb11f7105019d9414d291bf72634e195d1e7c532b70203b67fb1346c5c8df9eb00e3c555d15f2c0e69323035ff2bc4a4231cad2dc6820b0a7d58eabe31d53eec5ecd198c743aa776b11e9b2ec6e289eac61a47c6f22987c8146415b6410ac27a67f01339ffdd9e33164215b6c95391682cf354986c1629921a0b0c92bbf9f81a4b3e3062984fb4b1849421fda2cf8c419d9d791abe666cc90d92053b02a53eb4b1603aedc642f59edd907531e7557f05c7c2a13dc06d1c0b7253e2579a25a356ac9ee83896fc2da7f88eb1735bce50aabc91d67e400e5e5976979d7e92a552c4f6e031ea12c631a9b948c7e261be6d5387b789ef886ea9abc4413a96ea9abe44f9e32d1173d062898e27c52ffbc1cca0673278b8102243ba05a452413d496e05f06cece003f6b1180d998ed1711a13de6239cdd320fba5a2de8f7dee6359d905a83f16076001597eb4c449822c670078847be0313069e924bc2e0808b2a484dcbd6b1dd26ef0e1f0d7ca62d241b7c7a1d05f0a19800f3f0431c22782007007b81a37a630e27cc802c7bdb718922121dd1fb2ec49c73491dbaea23079c802f00b59f660d47b972f8022c4d9904485fce121cbfe7674159244168db3a13d2bb2b4299b98d005d5964a2ab2843287b14862e5e230791f81cad28a2c82cf1fef0e8714093b10216a1a59cc003f2100bc234bfb63c43a1959220345161d43bc69caa42cd19b8a2c0cec66a4a3da16682625c050f6c86ec556433b3074b8824dde9b6a7464c1d87f09812aa9b4ff9f510da6c49a9bd3ce8c02a8882f85e903d489950f2c5da73d348338112dfe6a5dd9b6e6d702a20dbc2633dc61559b40c9225a108b6431ddd2ab88fe0619089345271ef35edd1db3c9d0e6dc5da63af90c6f64a6479345b41fe22a5fc5be75472ee760b2ac5b26321652f9be8addcf64d5f82c46169e2f531cbf5471e2ae12007b02094b0138693559b664594e9ba1817d4c9610b19a2cb3bdef6439bf1e98c7454b9698edc0b71b7f4b0f04e29a902760136c62a161534d16ebf31a9adc8060a863050bfa11843dee651b613e8912f5401a1ddf7bb2c01de10f58c707932e01dd0c9174d735350d622091834a49c385ecc922218b19ffc953df9fd18d285ea8c25884e2b7280bcaea3e122d329c2bca420e35327a554c37035eb5280b7edc0acb180ce0b42ff4d963c19a31b12b0030a1283719690391b2604825cefb9560d1152ef045ca22fd00939bf16c5155ced86d3873dca86286d019fcd4bd0c995316a823cdd8735416d7446d6913b2ec2df9cb49571743d98b41c955968fc6362f5e24fca876a395e5e240a17772810b2c4bf3ed602756e1f25e7e26c0b20c469cade9581617803d5b1ab32c94aef6a765b197c2f8b16581b871f07922272248b5c87a7d94111563317e9785027674e8059c22f2b3c122c643064594f990f9a3b4998387ba454ff0216c56da5e9693197b3ce9f4cc35394186bc964032fd78ed6469308b607279311aa678ad752569c8c12c8b8bb3598286209d7191c30e9db973e31d7c8b41922d283237300fe5cd2c17d3b394245d2c82ac167c608b59263ec1f5c72c622dd353bbc73c0ce67d995da21ab1fc62161b138d90da4c04948f20c78f8a1e01a994942015ac20a412898654c68448a51f14a98426b36ca2f85aa58656e55f652ed647031b21ab3e597d1b549b2d03c72ca8765591ff87a3ae659660e32f3d5f661604e05ce8609e84af2c1d2c4cefe6699e338baf5e884964049c595ab72b0821aec05cfeeba3240c9c599ece4501b340a7677e0e726601dcf8bfb3c89fea61b34cd36816b1335c6ceb350b9101bb4551ac9670c8271867e907e5fc95e1420e999c258f7f570e8a72f3e7138f9c667ae6faead31795f3318f8ef23fd2513985a2f451fe9e3ee6247a9ba3379afe1c256056cf84f8dc44abf29fc0e631cc391951d81dc6916a5bf5b1e78bd8f86dc5e3e23fb855e5465cc4033f30a28dabe131fe70cb551b75d925588e8e62d691cd5dc1b2f63538abdd6873a5884a51297c2b8d3712b71dc5a481c788de8fec418adc7c596eb2b95575d22b3b088b25d73d2e428c266746e935134857dfc9222a414d312ab6e9e2bdee714f10a40969eded618bc0b8fd1d06744fe052e9e1ab5e2d8ef618061c56db991f84b4c01e5445d37880ebb6a75658e8847f58c2149e308e6182746ce2cfd48541c7617b41ebd322f13ab02893c56427bf927c973f7f9def876151806870da28bbebc0d42ad856587e4d3a68d961274308bc10cb327274047fadaa616b248dac273df15a6c0b9e182f1a2f278527254a9ca7a21114e99d042117236cf99bf0fd1391587dc41866c0bd5d6212c2426833fc0c25153cfd43c5dd7bc13c15773ff3d3286f63879e087f8c8a967c9b39903ed90124bf88e63bc23fc62f47e22bf7653f840fb01403e96edb2577ebbe612b8faee72188378590bc1c6380b7efba778982e345ac0cc7184a71fbc6716dc9b339104a9e3eb602e96f10fed4bed860fac041ad055f0b33adcb963266a876dc5dfb8e8f4cdb3778cd6334ff9cd37a4e5ddfe24565f4090af99eed223fe6be72a9f324e12a3b0973fa7957cd37d0cf2632fef8458ca6077664eb4cf775b344dd057995fbd6815b1279ac1274b82080c83114a58cc3830222c7a8683247b8ae7db9abaef1b37981d43fde814c021edeeae87f3802b9a1027f5e4ad58a53e02223376b42ed2b3c135c8e7e2d0d19cf07c8a1ced4e1a98cdcfb8123ba80fc980661dc09d9ac17edcbab6d231610246c104252193f528687f95808fc2af1202442a810b385ba232b2388e82faef695118f888a50995d9d47c091f65b8ee02987fbd8978b6535f6ba60691f751a3892b2cd1fe4bf5f5f37a24649d8d7aa916cbfdc61dd24530723507f4c1ab53cc798c3d997d183cd7d1b33da5ce0a3c40f491200ca2cee4b1b9c44f1f32bd6ee2bc9051438c1fb1664187d0b27a8e8b302f40ae34350eb16399facb2a6109c91bf4c79b24657481c8e215e89952676b5fbbef284adde3777f25f0fcfe8007d3d0fdc1683ef2b801afa589e7d5f69d4f3e14a332d7793536b8e61cf795f16a09fb5237e28d3def7e33f012e99df1b10ca81f3800dab912fadc9816dd6082088d0a039369b4b2ceb484e92cc82c6320b07b78773cb08d14dd7531501f4ed76beefeae7347e39ca7b429a7f5fe09389ecd058d0ae8a35aa7a23a3f043d5dfd740e48f2cdbead5da311943c0efa5a3358cc70b5d4d1c1490945295d3ca5934a24b60458a3811207c0b6ba43b7f1bfc3a47a5842b6ed1f8b99c2abdc6278de6c9c424fd7d51e67c0a01bfccd7549904bfaa37a126f15462adc1a11d8c5e0088283c3e92f021714efa7d61be4448235e0aedc94406487b539fc05d07d8543f4d1ad953a79d266400942ffa34b8eb0263ddad9ea0fa3ad79255ece34ae3984789f5efcb9ffde127441a68eb253bf6b0ea530ee99b71a7af72acdf918b9358b8d54b60c334725e23486b01fc061985fb1649d64da2c927682028a149d1031d415b6903fc7ff85700bfa41fec4601ea04edf955dc9a4647a32ed01ef05bdd35d3e23fc20b26e93ecf08f875776755878063b5a7e2b335344f1b541b9a9a909e523d05144f838912268c429d46a7f01d0a4e74b61055d4f7fd888ce0d77edf5a4e0e8c0fc0efd5ce483af09b61a079a56d9dddd40a1b3fe03b9cf02b392e0dc32f97c888a87d6a844403374f0a38111257bd5fb8dc88d8e376794ee2a229e94e03904ad3793deef4150b4606dc9a0ca3f439bc433ad02574ac9303f87ddd07144aa3640956af167e456150875f569e885f6f53fb8f4421ca86269e4ea2a7e6111ad348ba469aac3b3bec6b8a2764a44d7593285de30bd7c181508cdf5769e21debdb8043f61566e877be98d5aa96dd237f0befd73b7ec5f3be046cdcba087913c80fc66a41b5b74cdf6b689e50c3177b6ab2d6779389f9ebdb0c5488fcfe9c70dad8db4f78bd3e3cdb9100dd29ff916ac9f66b8d5f43d849a6a890bc500072077452350d54146fe48fdf0ef7a55ce417f88210fdc4c6b2d0d3b8296189033efe516d73a2926535dba62dcba44803181b59514fcb9a2c1b925fc3c0604a40f1771354d0e5c47c10aa69e35fbf1f81ec9a332e64b5d392811725b6afb24671b0ee47768bd60631bf7292186103406dec577adc46f50e18451f464d50a365776ee619c523ed3a333540b26c96ddc4ee3f3d3b66de1ce328aeee288049b4961af699ed7a8b11290a1cf3eb89660b1060fe0b88e96cb6d87c9b476ac2a2d0c7c308b7284043a475e04591e467518ee74e0a2cc4c558ae5144c37e93231e9e28ed5729271921658485823c186955595ef58179c2d34ef751f882d32d2a42c257a32813eb2d6b0cc425838206636d8a24c45294604a83cf904695fd9f498a344af4f86138dc1da72ba10d9e14907f93732521ff243c1fd1affce3277733abeaa7e8bacc82127b342641a747a8045d7d16900215563e80472ac5d28b59286a219838de582922ee4e526b5aa3d7c8819b43f6f14ab1012915490b3766e4db13b8892ede10b91e0303c6a2d9b29662309696023722cb183223cf92cc946d6a7349269292b5ea5d538a1acd75688b7d20a9ec301990e7551513dc6edcf0c38ce84170ed947aca9381bf4f9958220bc83589669a23335c9101054330477e750289fe559ed84ea0003e0ed8be038202284c82b593d480ff0fe2eefebc1af73fb9be1c3a550e866323ce168ceb84a65550caa45e211b3ba185862d37e0c56e88eac60302fa36d45acc16b4133c1ab27434d274b184c2df114d14ee32dc4e10617e08d38080ec77f9b34c42e30973293c2340470308d18c2798a7e409c3f5e3db54bd304f483a561e151ccb70f47902900327cf33557a8297d95cc148ec31d4df7d319d0b4532c9cd7ded09e75d98ea038e5eb63eed092cfdd14b16039bd530a73d01b24ee0dcf2ee89e8fe181e1b2570fcc32a5b6e0af0c127706bb74821fc44a3dce2893d215a35c69ae3e10ae0cb7d5bfcb2d9971ff4b46c648b9e1a501398c450ecd3a402df1f70fc84747a0458cbb24437f5850b1c1d080263c71aeabd36f489869be41324f6877f07ab2a16436cfbd28643dee800d627e8512f41716ec08a042f6808d87b31d669f2694eb3b095aa990041fee808e627be4a368153f4bda3d021166f78c64b34e329c2c6d89f88cb872ab17f50fb5407adcc412f385ff9ee9d689f1c043652d300000504a0b609335c8ef8e5848e7288abcf5870c800a02808d4a0ae1f1ff3e9f54407a0a06d7f3f13686dc240a230aef849d8d74e0814fea3f067e160831f68874330cc74080afa459a6cbbd51620b9081c0709c08b9452c20bf60629eb12212c28aec9e623fd19b53238280af794177d507c04f719f99a44284cc6560985ba2f16d15128b8e9f4caf30a05c43bdde726648ff68e1f4b5c919a647baba9225a4b08f06d3026d2805522c59ac384ca07f37839978aa1e0b7fbe6891a6f9f83c5404f30df52c75303a6edf4c40ead230935e81dbb280eacb8fc85cdd2c10b52e79793f0c00dba10f109f5cc16dd012e75d9dcc2283eb580c1c9de28ce670c9466c9488fd427b4a8d2ec04bd1394e8bc365b8c8f1f88238b16032c02b7348ad976eb1ab1e4272266151015005c334fe2e5275c22379adf6db7fe4f22072ee1c5ff24a13d7bcde41526d25c148e9580775c3f41a2d7e1e003b02ea595a87f82ff8cc39f35817528931f10800271e222cffad4efcdb17d846b4cf40fc2d39cc23fe417de4713d84bc4ce213de6bcd95b3701018a6199de7980c234ef352548940dc1de4f648b2c875efd24e09fa819c766542350dc2ba434ce7e3e836276addf8036ef611a68c207453fa3f60a330d651477f52d967daf67221497b301169e3942d25d3a483303190a7557c59574ed4dd966a7f24da7d8631747c2af733b616dcd8aecd1273c1b6e6351ba39059baab28f3c4215961a06162c0bd799a20e424da8b867a4c70bab8fa4686152ac6574c939b00f21361c140892c1254f584f4e8065f7ae4b1d845ed71aeb7c5b35089286c293edb4066a8409e45aa22442ad0963c0df0dc26f1efee3a273357ebd373f1353b5bf5011a785a42f45632d9c52fb1bcc20922dfcc046c6aef131fdd053f4287c03c97d0bbb85d35dc592b14a5cd8d4bbdcca85ddfece736dfc0509e20aa64b26f3d220847cef7c57641bfea17930e6a91641f521b12af3594155c201d0911459ba9211c60ef2b2bf4f2baea8563fda690ecbb4da0b76b2c80e7228b008566929a71609381b07b6fc801228a1b16beb8efc55f35727a7c182359d44b51c348903984fd7aa85439f0e96a246b5c80007201d06fee2e936f461c7910b43c8199f9e13ec283acf90d10beb67973d413575f98d84ac57afba17160ade6f100d2c1c7d8f6b3c741f4b25cec964105de11da5b4b802965f5a894a39bfff4ad89749bf307dc982aeb31b6ffdac96b0269004de658b35c8a390d42a0f6e25f14618d68db93b88deeefafa786b6198eac8e3ec91a00d842bf7913e0fd4e4b5a1bd89611704643d537318beb8c5696081deaf2c25763e1724df38a0fc347edbba245907f9e6a393fd51685ed1f57a76f88281f15343a67988cb60a43d9740f48291e50669bdea2abd05370963c31f46aa89391cd84ea64785f83c4551be48ec94c8a3f66d241ba5805a1e2df8c12e2d4e1b16653ed1e766f94d8d8ac4fc0fad1935d0128b1db10a7ab4caf13511a0e7328c88ec5bca68588c7be3289986639c2a23e1354d9171b9ade61448c6118a4112e0304b6235336dc3cf19ff00a38acfc4b9421c812fc75f957770d4691ebbcb8f8f3701393f3d1c237af75a5f2c5a60073ec78d10fbde0566a87ccade4d09ed20c03813d47cbb16eb0612fafef769fc0b5d6f6e5ff8bde4d635f26efc8f073b9065be9ced78e9a91480e1471c10de8244c588b0b5e99baf54364cbc77b8dec9298ecccda4bb23b5853000bf1e17d78f4d1acc8ebec81a547ffc1405efaa1e29ae2640842bc36fd546bb9848c7253cacbc2f3c6d57575dc03969c07103bb85d86623dd8a05f12f1b4ac613adc7bce2f41c54826fbdebaa919e321359fa5faba563ac2031c814ed0dc5f84c614ff54f735f1cd496e86c790e81e96ccc1d2353fd34fd15436cfdff5941189de3086efa3ea9f89253c86de8b58b1fca61022ca710dd1d3435f08368d654360c87eb3985b47d89e2364cefee992f11c0d5eaa899451202f725a04bff122bf0d434247de7737f01d5cbbec44ec044b78e76e32ef09dd357827702772c0ef71ec793104599476ffbd18e2d836bdf5fa3247e8d3e086ef6626bc1c799cf5ff4c6d5cbaae8fd6c754938ad8c8c1c48d68ffd382f9e5876f6e0d8f461dd4c8c51726ea940bb23aeed938ba60f813c2e28d2c9994df90ec0f94f94992f0d4ac512a9f581bf19c933d92ae694b6bb0d6c2fb4e53608a408e6b9f53327695b09102b9c091c0c6af541cb43ae0fdbb4812ac5ab44888449891070db2cae0f4ed1245fcc7b2687545385fb0fae0f4177ee3beb94b61108256eb6f6fab0486d257ecc1ad6de3e6ede77dd67f6689ca5db3912e760d8781766f5067a4b0149c8a83e3c8485e891d9c774f891b0062d6a96dbf11bd47282ede0035de69aa925c787ff9d8b197419d79f6e1b67cc812fbbdd45ed6672e5039478042b6c38f8eb77d8016b88886bb0e7aae4b1a6441fd6704051501f4028d71f99b9b30b9427223e5dd2482d43a970426094c2562ad4a5ba5b2f1941cdc2125371070e9cfb1e4e2744028c1d0f626374a1d1420caa2fe90cb1bd0df1d2693e2e129ceb96aa6f9a089283a07dfe8c684c985807836bdbefa487fdb52bf1b5a824d59b1e055da7977479865094f0413fa897d09dfcbc37f4086c9f2a96c3a5b62ef6514c35e1ce916b27f86b2a267d6b245e10c93109d7e70773cc89180651a7acb3031ca2048e4084fb0e551040b46e7314384e028dcf85d7e8c9c65b87627834c4c22de9ebc65d61161a434a60943c4a7ac61c2e5e8ce72e28b60ed176dfe5a01be333599cedb6efb363e8e7d6a3fca401e0b83fd2dfdb46cbc6eede528adc01c90e940e620fe6efb104d247b01f892a3076d0feae90a3b747b0e7bf5be717b66e33ab63c71246a221bd7b85481fd2443f450cf4ad7d05528fa4fe79b2fdf977dcfe65febdc35059483b066a22bca4d38eb9037049fb0bda65902a71a45fdfe17d12c8424531ec9885f0f95bd96b24e1cc4263c629c2b02fdefad145688cdd8c5a6b74a61be9e4ee4cd314af2f0c785501bb6d7d408f8fbef592e9794cbfd04cebdac3e34e5d7b649bf6f898c3dd762ffb226ab0f3d80671fa0d9e1cf7cea8a31d38f616e807a1028a491d3f7d1c6d7dda37bf8e6b261cd9eeed2fc6be5b103a7e3ae913385bfda283ddb61b4ed744aeba8e03dcbe28e03da2e8db816b7f35d36f742437fb76d0c2b0c74da4d3b56a4bb6ef0b74b4744e1d4fc794145183318fe925eca306feab1d06942449dfba498f28a9f7e96faa99c611254160eff1d1dfb44575d6b9d5e3267550ad73eef4d2fa801e475defb0ffec52f7d9ad4eee3e8fe5da97d5651b4992a4cd76ba8d1c9df45647bff8c956c7512f9d743485d2479b93b676c3e9a3eb1f77240943ce659ffabacb6f2e7bc0e820745ad5cf5505751cc99174750cdd8de49fe59f32f87202a4a32d0c399795bb57fdf1c956bfc023e871247359e68d9ec732ef0536c24f6aa6dfa38f71e0cb639a098f583369262e1e0464a629cb9acec29b5e3a499a28904e65e1492f83580811f42428d5d1f19d75c6b47db1b97b43bca9a3433e004551f0a89f6f880f8fb6afe963baba364995f475b7730715c62ca4f380146d5ff675da102178d0ac63f01cc0694b0c8fd6475a63ce99cc4e92635026c72cb4f3d067350bf160f1594a82ab649050e67918ca3cf3749dd6c35090c9e3e72e092759341e3dd67aab23e9d904dd8e59882c5a776bb6bacd83c599653da82cd992f4d24b375dafe490071df40a39e9261d33c08e5a64bc3e6ba501aeceaef081edb1dd4cf5a4817d45bc2981214d54a47dfb51e6e1d7bedd019968744f2f3d3d4bf25f1afc4afef67347bef6d345fca992786d3794ecaef4db2e75db4ef59edd4ab25968f3d0f95e31c0fa7c3e9fabd318f8b0822e62a8b15cd5d4b7bf208326e2c0754e13f58d0112a0a06d41fbf9837dd9d736cfbc0d2890da4911bf1d28f336902ee2c9f6c5bab6055de66d40816c5fedeccdb7f778caee7a762db08e02f259df381f49ef695b607728209ff5771c7b106c4b822c3462f25bd0443adfce6add8ed51d760febec06d6d916c4ade5a1f3edf3fdf82de40e3b77e8d9bd1cac6d5d5b0c55ee70d3f6f9615677688104280841e27e7c723c3bac8edd8d7edb79cf0e97fe3d44b4102371438cd39119d2dced3268221140be9c24819969e26388bbbd054d24a2070bb2a52aa7366584ee38c6e9885816251d6bbab8dbd39c7b5647b62de06071548ba17a9c0df2f0b4ac937eea60df71eca1a2b290dbfcc5509fc3bf153491eeeb04fdac9300053beccb1809ff32567a4177d8bec7afd7bf027b6b6ded9985cad8d33760800307a23bd86d5841e7bab606d8d5b90837c52cb97724d8a16017220b6dd7ed5e9001fb7e4a596874755fb62de8d831164bed6c51bfb0d8dfece7b9fd35fdf41397455968f4b22cfd2ccbb22447ddbe3a5d1661e2fc86f453c47b74f4a78f2311d921e7efeec953e5719d6b47bdd38e1ad7da76f8dd4f37fdd5d97665f69383c75eee421c7ddef808f7d3da61cb3bc5f6f0dac7536b131c00818cb3eff3cf37219f9aa83705387618836387f1a5c60ee3bfbade14e1d8611c8b6172fe14e39c333e21e728bdf3ab18e30dbb1df3b32dd273ebb1051a07907d6f8cbdd48e53bd3b737bee733cc9582c82c49a491adf18f462a02e038d2590e7878d5f38c735f24f13f20ebfce0ebf34f892cce7ee1581821059082be50e18333d76dfcfec31761464de6e59f01099a75b1ea863ffa08920f095b59c5439ddc8c2f5a5848bbd08bb0b6120119d21708ee110458f71765dce243e688cb11256c249f8f7012b8965df66f7264320602c41c7c90100e0ec19895e489d672c416597f2eec2e61734111e06d7f6d5ad6e6bf189822c84733e9fb0eff9fb7cc2be582abf37c0a3cecf0279c378a889f098ee80fd3cc7866f08768f3a1ed378c41aa322d096852c84dfb3c5632717f61df158c6658f33998b0290c44c080d3544928ab8d859ecbaecd3a121d56a6b82c66fa9d11455535507455da787ae6be92676157b398e2590bf55dc821a7ce9a60afadf14847a42eaaaab5968c8e21d88d5b16f0555281dabb87d41683fbd4c4b1440a0ae8351d7f134a3a5e355f57437fe5e51ac6a5f777a5c53546579f04b812249f224d95585d2c9f6253d2d5128492f77204ad7782541684f7d29b9dd72378e1d46a15c83d7e58e841263126335236529a0fc9a5cf0703ba8187679a1d4634b8edbc1cd1a2d4d846a5eac5c0f905ebc4043640a0b69673c27c54a4c195d55b8b5369be37cefdefd7bc43f6c649aaeb27e9e2be9e769ae0f383df5b42c7ded9527909765beedc6b7edd877ebec5e1527693fc911276125bd53d3f3cc6251ac74ae38e93cdbd724493f7767fe7327c3de8d8f93f00898245d072bfd78c3e538eacc6a2212ce68b8a93271a2cd0e114ad620ad05e3ac10b3e58e3ee2b2119f71f215452dd547b9e5b1f5e8e31e473dfac88eae1b7d1cfd1c7d0c1a75c655f250cf90973ef379a269fb9eaf49d2d5dd3876204bd2045227eb19f4cb02d12d9b85729b33cbf2e894582c06803388c743f0a010427010da838402e0da7300028085847090ceba1db463936c1648e70108b31a687ff691b11a3aa740018dd0303025cfced0967c4c5098a698884c52317c4c6d98d298c6309131813175310d99aa967c4bbea5dfd2d25253d25a8bab163d5a0c5b045bacb5486b31a605590bb0165d2da0b410b6984a5a4b5a53e153f153b164022d090dfb864955493a928449c024b4a43149644960495d495092ae92a4927a984033816662ed84efc40f8ff0fd5013b5444de441511371f81a4b40c5328f1dcbbc5b59e6d9cc326f3dcb3c154d1301ad615f18d81ba14f48aef98d1031c6e713e1f3f97c3e9f0bec4b31676d4eda1be16ba7819006431a1069505c437ced31fc62588aa12906600c50310463888a412a06aa1884310cd73cbdf6187494680d6448f3adc5e02bcb1461000506533020c2406a8d4f4d1b35696ac6a8215303a6a64bcd504d559aefb5b7c0d7825f0b965ad074b6f4da4114417c8118036106e20c041a0835106b20e084f085f869a20d65cabc76106346a39437c633e39df1d0786b9907270b69185e08434403c1e3a965a2231bb983d6444668249c2c8f6884666eb226102ede362096deb532c4325765aaca4c95e951464719a732bf3223c2105fbb098826289ae0cb0463645fafdd852617802e045d907281ca05a10b562e0c5dd07281e842918cc86b77618ab7658a35b500d6c2550b5f2d0cc996c852908d186b33963636668c6cac380645ace9b5b3d0c40290856053160206a38ea48e844630e8de4867b746686318d1cc03440f143df0e58131b125b19f982f6c2d8c18e3e7d4e554e5547412d2f8d118e1d4c629cd698c1399139813d1e92ac62fc62fc6528ca6184038702ae02ba2a1ada0b6c2d80a652b8c49f9da5ae16b85155658a1582c168bc562b128e5ebb5a7f095c2580a296c1573ec3085610a5a3c3829542950a5203492322a1a89198d19957d197df188463518a58d46a98f25a0ec0d4ee6d9326f557f9a08c868cb4868343422e66882fa412d41353d41799a7a223e493db5794a7b1af344f604f6d4f5347caacad194a3a900430f52bc216f0402c6f07c0830e3097953bc1e3c1d3c279e0b5e0a04ac2120ad00c3d75e8061018805287a307bed1ea43c083d0c3d6879207ad8f250f4e0e5e1cbc39887acd7eee18ab7f5c5fb0a2168b64d1e82228c11a14b0433118a1e801e9c3cb8f090c2c30811da889026c298086021045f7b08c110a44210b6c5d7de36b5c036d846b5522d552b6cadda614b6c7fbcf6b6078fc823f28a3c2fde16afc8fb32a2e211330f1319a9a9b83542e3f06b7fedd20eca6e6a47dc49b5be5d9b5dda6ecc8e6c07b6ebda0d77551c7eaf9dc38fc312872623aa8c00a1d1d0d4f18847411e1e70c0612c0145ca3c36f36eb6556dd2444047255efbd10823aa5c6b246594230ad2f938f880ae807a000d8182406b4069406380c880c080ba80a0000981a674bed7aef3e97eba25a32fa32f232a23a1919591119ad46b1ef148ca071ff98e7e474a474b474c474d47368e8047c12315affd28859198d1d7cedacfd54f8f9fe14ff067ed27ed67cc0fd90fd84fd70f941fe1cfd4ceda6bdf59cbf972bfdc128fb863b673b663466329872fc72fc7128e2b1c3d700c710471ace148c3310607190e301c5d38a0e010e298a2b14463c9895404da44802c026b1118931294a2438a9314175252481911052dca9813a44e109e303c81c8dbe2118d784423b5cc538da8cc8cd454b1af31339c136e04ae09e72b42c15de1aa7053b81e381db8255c0a3333b1b1a2579168a4665a11d51469ea0f4d1daa55ea94da43d5a13aa92e545f1b22b1f8655a994323291ed188ca48ca08cd08ce91efe877a464b4663699359ccca6b104f46606cd28538a47cc4bad07e555d9a31c96c1b5b43164605d50ca29ed3c293c28798947e46df18a3c2fde174f8c37c6212319a919a1adadc159d31df4d10f4bd003521e107a60d881b40e807500ad035f61c1301d614e612ec252848dd0d2468b9916322cc1d7ae81a006a43420d4c0d008cd68edc877b474c474f4d31dfdba7e1af8696049034d1a006a000acbd36bd7808e0c40c9c05406881990c2e2bbd2e64ada953157c8ae805de9ba32bc52d5f57bed15f85560a9024d4668466a47bea3dfd1d2918d23a0d1da51d30cf635427bed27fc4e583aa1e904e0095027044f88ca3c9b93a7d77e828eb107a537d523f6a49cf89ab46992d6644c13b226604dba9a0c9b545df95efbfbfef74bdf14c26ec72362a05100dc844ce4d3444744bf7f7147bed76e8466b436aebd8ebf38b4d750c0157c2972f020003b3e3fec0d07007248123551083eba188d2840c423681fb9a23c01733e16a00be9fb220e85521d5074f09995f160e71c5a10886753163a6b989d6546101272d7e94eb4142b29655ee9441ee45c8e5c5614b01a92598a025214a02a3519fb8e5c501480a24070ef7884e0e92e051b2934a5b09482520abf2c9402520abe2c04676d1c001a100b8c2e50080ec20e89839f38dd206f773f9d1bd47a10148136e30835d43e02696f5efb7bca781dfc65ef0b5c9e4c49922449c740d6a417c178f2e8c9e2934132e8e3c4ce93a48fe4487c92b4ca5a6350af4113ba7713ea34d864931796b046d69b3e8326d37419ac3d3343a944477228e088d86f9761c720f88505842322675ffa2eb1a8ac5e60152133c432f2e54b8f61ed95fb9666780506308cfd4c19c69a4c7953448d0b944dce7852345990a6ab69cac709206d4a47dbb444cbd27cc1da335db0f6c82dbfb7b760eded72005a24d2c8c92135c31653c6931fc921ca090d5147865b62bc603a0bd69e89b5e1495f0126b17015bbc0a95202c68afb0e7d0c2763ce9d0b1323d0bc706521e3eebdb70a42600d717a9274107bccf2ad610dd7b069d3c57d8750ccf4640d2982ca468d1e6b5dd272aca56f0aa0ecf88d3555fced2860d3bdd7545151668615901767dc7748fb7c3e5f93bbf7dea8efbd318cdf7b6f134b50107dd010264b89bb374edb972c8e45ee90b3e3399e60ed6dd44d80d1d583de4dfe1dbdc4be1ccbc6b32fd77284c3e15f8c8495be7c3113b681a14a1f5f4cf565f15f6cf5a583f9b2f493d5b9d010992fbdc80408ac0084cd97fea1051e5f3a0a5e98fad265885ae20b62f543fb120b480d5f3a6e0206010b0a0122f5fbd2b130f3462ca92a5f7a0986e446492117bb37dabe6491043f9e9ef44dfa0850d2a888d44a031b5c2f7c70b508e3856c471160f988f37bbb0b9b84271a6b6ce85082638d68bb255ba40c5be44a9221d20fcb9a310b957de92d6c32a83be0a0d0e64036f760f3216df371ec6dbe336f7d9bcd96adac54f902820221cbc6131a5937ceb270687de921182222009a5b3a083e50a48932b02a898ed92e03491265e10a10912727ab8695dfee0194c471e6244e8a164a3f182f86e8d01ec468bcc0f1e3cb981930dae6607b3e263b7066d1007260eded20192c8bacf9a0f5d5e3f7570dbf7d033a226938c862058b0670018680e960d449220016ae33cb0cbf3d03ec991d068eaa4e2c2f7efb0558a9ad2937bcbcd69ebc294b175f1a79f3e5cf9753d4588971c38a192c4132c8b2a59f1660aff812f0db2b5024a967052f2a153ea802da12d0e5cb0f2ca016293e0a78a51061023ad214b3126604560a3857487cc855594a60ac430a45a2ac11b0221442a14a8b03130246fff254916280df7eb255e2fcf607e8cca32a4c503b904c759992814b46a288f88d555923d285c690346e5982b12f49249bca13c862579bdf3d54841e566094c8a223ab0a520b2c22d80185ca8a9a2e53c0b86589b2a4796b4fa1ad7dcfb47d59b47d750ec8c24c845dec7908f4bb28e5b7027e77fd7ebbae8becb737c049730391a2c182491107188baa142a111a70d814677c49b95644288ef832ca977eb23a17fa2115d08449f9d1c005c77085f087cf0dbc504152638d94902813d6dee6010a12818a0c302a6818409a213cdd664022caf7e49b9264b6001e11a614406b8a12ae26ae325fba02867ae85082e6cd1ba5264f949a54016353fba1f6e557862a4e9329f9b1ca0314b47585e808ef0d48b0547cf912464b6cef8d553cd1797971ad2901e6c9d2d658c2d78630ddbf244031b2250a8c2f9d8d52e64bd7b994135fba90142f5ffad096922fdda888480a0ebef4736f5e09bb254ef9fd040ad36f4f00696e610a1e5c8489318a7e3bd1da0b40190d64c88993860b88c2086f4df14409f1f7db1160840c6eefed24acbdedc108f62fd097414da4b23841e164062d2772bef4039026086a7a4c03e85011c3c22ac39285442b2b4beb85d6992fbd00a419228a4a0e352a2f59ba60e04309b74cd2daf0250b3628bc5058d991028593c12c84a5487fc92019454a99ed4b1687a404fdcbf3fbaac66f2dbfafd4fcc61afef61174a494b96548a281e5a5081a938abdc7f6de297e53057f6f30402f6133d024c19ae16e6fc16c4929324866e026c0feca6db9692d49f365152d265a36b48642b4ae94bef4010c0549a9cc1bb799de6659abe8f3f94cb86fa6ca56afb3526e02bef637dbf0e0dffc66e0eb1c7c928884bdbe5e8f4f6a9030ffc565bf7ff1da2867a987da8c21968d32f7c5662cdc9421f65063668a97fb6234ad4c9481c0ad17dbc0c119afffc55128fec54318a02842f932b6c58612f7c55214981305498f35244b46dc170b5f3b56ca4464f0c54caf5f7832aad9fec5d8f7986c7a8388c85fee80bd48cceb7f8f5e9f781135780821110c4225ca0df71d872b38a3a695020d95b020eed46b13af9798c9a1e50b0d2f2e4c6e0e1c33bcc2b85cc15283fbb2afd75e956b0be8dfa02fc70cbf2cfd64c790f9d27564845fba9741fad23d08edb5fcf8f79a51decac431393edd7dea02587ba98f1d9bdcb0f1192a03cdae3c8af5a877587b28cb7e3a42162c9f5bba101bf592548f5d4c9a374d3400db4626a1c42879013ce90038d557dfdc239190cfe72331f4f95c8ce6f37de9414a9928037507fc0b13e73709bf1d84b5b7819a882496196876cec9429de2e3d3f5953d24b732af6ccb76030aa8e943fa7692a7c777bb0185bde39b55bd6c37a0507aea69fbae5eba8847db9703d7b988374d3388a22810dde1379b7eefde9bdbbcdcbda8a7cec14eb77b7d7c5ce7a98f8fcfd2fef9fcfcb8ced39f9f9fb5d7e9d01eff8f99ee807fef2271d82394c2cf83f39ca7381c4e0373b99c6ecaedf0e3f492ee70bb8d3ddeb1d96c5fcfa6b7db6d0d87c3a13dfe9b19bbc36f1bbbddbebea83b609b2d136fb75b1ede56c8421445f52f4d53ed4b77f851922475da777f99a659d41d705a96e5268200020820b47ba83b6037216ffc798bdd15cd3451069e9f1556048ac8d41232f765bf442a92033756818344e2cc8a245c36dc121c87a1f20106aaa8851d79e29bb3568208d1c634e2499293b03221353c080384c349c2c8101dd0da2b771e8c5696d71ea6c66bdfc07220b2a387081c37464600d1422207e30ed238008112152927a4a03892e6be6c5992f8924ac5973b5fd69822d3c52a0b1630c511e31274b8cc86f61f2dc247d3912548b4381d5972dfa124ec99d7f37a441336afdd01acd67ae2610584098c8c26576b9fb5a77b00307a7525607c8facfc3b6a0d4bef22e64b285263577a90b9f9d287aebc10f992e24b8740e68d575fc4be749eb5571e41c962ae4bd50e0aae88bcb1421b51430ef7654ba211cde7f3a170b5d6d8f7bacb6beda7261231834a092251acb6a810bada5b20356eed69f5e521e15fa02029ff7a7806fca824f4a59f2cd5d596375fba972e24e4cb2b2e6ebe74b66874c2a5224b991f41920899e3640e91b20339c6743102a6c4570b5cfae9861dffcdc29b58f1e8b5db76cf9139e8977e8a5101bdf695bc1272a2fcd24f5eab86a571814a19204d4a465c084170326525899a280b85588b258399376e173baa13f644e5b59f9bb4f53c01c28a58a123ec4a08168f3852dc36a49b7102f0dacb232c90d75b441293a42157aa28d52033ca191295eabcc1a221560c83b302b31196c2a21615ed6bdf39ab205f86c51f9299fbb259977936e10ddb977e0ae5e086cac1352c49dc4280d7ae8322f845ad157f4045a5b9afee4b28266a9ea0ac50d560e6be435f96fe21970e014d44127507ec65e9fb8cf3a51765de0887376639f9617ee9ac26124124ac4d590932272d2cee6826a8b58663e9cc8b19b76cdf10a3d9936d0e026b60c7df47d8370b1ffb4b12b350fbce7fb3f0cd429cc75e84cfe7f3a1e5077bfa125e6760263a5dec39c8e37b13adcd1bd826f58129fdd8c2c04bb5e3ac3759aae6a96a54d5aa4ed5264d3a30c6ea7a02767c93cad05aebd5e6f36393269f4d254992b4dd7ec698a669de58109cb0aa8e8e8e0e8b43ad706a9aa6296ea7c90c233beabaaeeb4e6e672ba7de6eb75b8ea74915303c2a0e87c3f1f4f4a8b95c2ed7e3839bc147ede9e9e9f1f971d364868d1f55ef9acc58f221a1aaaaaab626688c5f11375bdb02fdb717ef6057b3ab6ab6b9cdf1288673fbda72fe6053559babb69d9a3fa81f326fe743e6253956cabcec3b9e596c75fb9085f04d6dd91f4777aba7375384fac166fb60b37db0d93ed86c1f6cb60f369b4ece6f6eb3f9abe336d4b5efd8bc6737e60ebefaf69be3706e730c83d6aaefec704dac6e61c8ad37dfc1be7fb720d0ada2ae92ed8ebf3aed4efb8e62afaa690b02f54dfebee150aca2369b9b904db7edb2af3b14f5d4d5ddd9beeaabaaa33dbeee52dfe82ee5397d549d8fea3c3b1fef39016d531f95c777a8a7e7ee55ff749edd3eb54dc7b57fc837d82276f27a42f5bd49b3ec0043081586102a5a9b71003a4631ada494f4fb90a444b6aace26de454eb27d73cea39ba52635d63af3f24d44897393b488b1f64de467d01a1e81d56ddbc4ca12c9e3f9478a1def46605f96270be1a1ad8e4facbcf0b3517dac2788287b6ce6eea52d03ef76d36edabbdca4937b37a5e70e76c309fbb3e72f1a774238d8a3ecf9ec0ad221528ccb4d92eb6e7998a67eec3aec23f6731c6616e9f6b13dc9b0d97958f5f4726c5ff36ccff10d71f4d8c78d94e2f42cc733937abfdaf156dffda71b56bf1863fce2b625c2ae97d1f7e8a4de95dbc4671996e521db078c3f7af60d637b92588bc56359fac6f86cf70a9c7d3c11300e60f41d1936bb2802de787e7cd53f1d9f68589e4de70c8b5f47476748c7795ceb5c73e03e400ef4816fe0e01e68ade35a3b07b4a2a3acf559551dddbd303c8ad176c38feff6dda0c2ea7ac34f8b821e1f86c7fea28ec3dbb50aaaa3aed7b5ddf0d3a2a0b6633b6aefd9bde807ae7ee0bac535dd54adfab85200ff07ef76b5c535b1bb0df181eb16c407aeb62038b8f610eaeb3684fa40ee41073aae390071e0acebf6ddd04107ac8f0f073e1cf8f8f86cd44d1fd79b031f67ddf471bdd1f6657db0d6399bf54ed7bea42649edac939ad4e71956c7b1eb38c63acea383eac0f0f8c7c74ce48e551fc7bb37848aee62d83a7bef5015f6569ddc6935ef38ea1bb72aaa43b62154add309a17e0cf8758a8e4e1d1364785d83478b483fd2aed5dd96615531b9499e3f8b8e727a8e42a4fac2b0d1b5a7339e32eced41dea9f2c1671652d7194a697aed3a26f651f7eaec3505eda9eb386a8eae4ec7b5e3d5d42b0aa783d071ede959967fbe3750619f3e1f0cbadf9f5d0705bd8b217f0bf41c387ffafe6c5d703a0ce79b6f9e90b7ad05fa753a783da1d4b51bceccdb70b62dc0bfdd05f8b763cfceea5e9ed1c9d89993b1b357591db9231d83d6747cf83712bd30820d36b3cfafedec438c25308e582d4141745fdb8f069c2757487c0d8bb8af6dc9032a325654217265aa87fbdabe8064bad63401b3f6c47d6dc1cf6763ce586d714194e3be3621092b21616cdaa05081c47d6dc32d6b9c2d8ffd5de77c5edff52caf6a53d4296a9ca25a54d7a81529cbbf6b13967f57a995987d5dd7b129e0131e494dbaacdc77fd81a0861231be668ca989b9efba8404eb08d9d4308b86fbae45d43c81616669c70c33f75d839f5f158e92394ad238c3f44dd7fe2a8a95273c68480169b8afea9209620644f8e66c8afbaabe62941226488208bddc5705d261e60dd89a2b2aacdc57950015176ccab0789296e5be2a1a2a44b880635fc430b9afaaaaead9ab9a5df957257afdab5af9576dfaac227d76d5c8e77f533855fe4dbbfe4d8bffa6c5ccc379f634154bcbded42cf5800c234d23b8b8c12273df74441b1627be90886255c47dd3a5cf6748f4588224756586fba6469250658902e3a3ea8afba6c1f40dd1050b376a822bdc37155e00ce0f2f1d5e96c45972df7408040582eafe45a550d487a2288aa251fe45cdd01b3a37747efed501eabc3a3ea4261d1d9db157c7ecb3ce195e71e215e77b2e9d6b54fe3db9fe3da7fc7b9ee779e53c6b000b2b645c31da1039e3bee72fa844921b289646086bb8efb944a34c091c535280d090e5be2770e78794549727301762dcf784424364499517323426f73d850470412287991740886bdcf7b48119c7ec314ddfd6bfa6947fcd286f9ae698d8bfa6d967f3ecf398366861bea031a9b9aff9c24594b53044660051b8afb9c49615418283acc4d9cf7d4de027b95264ca92209034ee6b067f3069438314304cbab856b864d1c205cdcb54d17dcda10aca38664a9e7f4b382f945bc80f90715a204b1f529354497c4bb3cf65598e3d09e7a7cc99c08ef35977b000961725292b314f90b82f69e6cae7432d46d71c28ee4b06bfec6f9ea16412e9b393be7f379ccfbe7d48c47f77d3937fb793dfc5ccf3da62bb2cef331aace950b29586e9898cfbee9f8dad281b4b4cbce9f2c37df7d20d967cd912e58caa489a3c65e28d9ab3311beebb856059356a84a50073c47db7b048ca92124e5439d4c870df3d548056c09ccfaf866382eea07d4dfed54d529af8d9b51e73f1fa2c090bd18aaac758940bf7d526c8a4d198aa121699b8af5e1ac038429c01ccf90c67280fad71786cc4611c01fb8be37cf69c7d485affe6a6cf63b12c9f7df6ece5be59ac040c1ac3112faa646471dffc4b1206090d4fba24c9e285e1fc9ccf6e83d1681d47c09e650081028525ec8bca95018590a935412f6445f7c54b2cb446ecd8f242d504ca7d3110c650068da92f43d8fc5c112baa6698620226c9cf2acbe092da7aa2016688fbe2211efb71888b9ae874cf5e6c96f52f26623dbefa17377df6f1c0d96b309630ee2166f279c9679d9d854cb4ddec24404188cc2b7f015fd0789c2043830d2454542c11cd44f1a8e185eb9a88835f9107d50835234ab8aa47d814928f1e5cee2bd441c789af331e63b4c4b8673f86545352bf35306e5013e5a5545309bf740d9589b2906d75548fbf198ef67de9fa17468656d240bda49bbe2489254f49fcd2735148f632fb2a3d5301cbb22c5bf36596ca400c276d8365593a1e83c2656b666899886c2acbb2fcf2f4a5ad2ccbf257fe4ab6f4420557966b6ba50fe9a226a9513623da6669bef45d9665590a7fc02c791f1fcf3bd69e8fd0e747e8e359c7daf311fa8069f13d3d9e816baf47d8e3d30acdeff19c63edf5bc39aa6cea79783ce3587b3c3c3d3ac5d8f378beb1f678783ef857fd32f5aa6fb5cc840d962cf2bceab9c6da5349282f63bfb3e399c6dadb21aa3c44d5b3930a968e15c1c87a7ceaac17124dba74061c1249ceb3be59cf32d61ecb131523c63edb6a8fb1ba58fdba7a665a7b6b3bb2679afae919c60b3dcc4b136063a28c09e1982a5956acc4090b7604524a61c66ad8e89a725dacbd72f5bcb4f656b12c1b823c882509db22e3d32d693e751d17289fba0b71296b3134b2f18df81a86a91871e6be3ad6ea49161c952231b0820061f202e3962ea4aa2cc0b40469a911a6650d561815b11e2bd271ec2c8d52928921625adc77484d6224e741901840ac387153652a4dd354895401c6e555d573d299aa1598b126ec09963953e420a1ea82ae4129aaa9311c5f4bd45d0eaa2a9b0500f435e353dfa99f5f643e755607c6f4730c90501ca264c3861a9b2cee3bf46c555a49e549c789b42fa8b419ae103c4491020565d9f16996e2a7aef31342eace0a65709c883d5949912665854fa09845714c10a932f64bb2c4574fd555dd695fb2984db09e91f095355f58b83ef55c82dd614bf06438d505e6b7634c3aaa47aad0f12bcc942026e4a4e151636765db972c6612aae7116b4f2d4a87b0bca83ef59dfac9e253ac2b4e3ef5ecf369a26db6eebdb3d2f6dc34e6370719b8f7ded96350bf7ff6de1bb8819bdd7b84daefbdf7defb05a7dfe8de7befd4c7619194df3b7befede3b7efbdf7de7b8d675d817ef531c9afbe330f01bfae25d07e4572f2abe3396b6f5d79d0255ec8b8ebea58ceda5bf7da4a54795e057a55ceabaa4a22caab256cbcea38ceda53db9175756dd33499c2e4aaaa63386b4fcd518fb1463cfdce8ee3376b6fc7cdda53492adf966759c76d4e75f5571dafad3d559df22507c9975772c65ccd3182e563c186cc3155640d4b12d55fcaf3e9964f7da77ea6cea6646a5c4ddb51e64c8dad61eded354519346e9a468c11ca488d38c1b106914141dcc2e48a07107555cba6346b2fbd823304a7adbd5dae2888d92282468596101f4e8b381962f2a6a00181f185cb8d1377555fec118df8affac6e9b7effd860c1a164da33d465114dd289aa5047c144551948812511455f1f5e88a1aa140d48150218fa68fa23ea2a8555601e653a34f1d9f597b693055dbd4b199b597f22421f9ed7b67a96871b64929528509202e03dc954041feaf87df568a1d5f5ec5d19195222b2ba90519dd5a0d44c4c6b0666b0f6d52472f2be0745561c151d5c403f4a189b3c2c80f3923a62242064d67881a9f180d4090ec389bc10ca633493480d5c0e2aaa99830f9c7e3f7760c66eded9c0fe572392c1d323e97cbe5b255d6c2029e7d5976ee2b3ebe74fcc54bd1d8367d341d2b9966d9fbc29437cdf11dd7dec43e0c9826d9649aa617a579d3344d93abe94dd3f4d3b4ca1d0009e0df202c6ece28bf9dcd52f6fbebe9b76332a124f6cdc0e058ae01100de03345a2d400040740507b034c431a1e3ed70637687d5aac0c93cf05c141684d33168fad15c82e499c52d44418558bc366cb87e6fb053511b639a91265c9e7e23cf40db5266a22dde55545abe862d75f7a4c4a13194d193274b16fe19826ca71ac967cd8f75013ed146794f996b4d9f6a169a2d1fd2a06814d4bfb97a23c8ffaf87bd4379a75a5cba3588874d1edf4fced98cbdadb59aa10a9589961c58c97d616a1bd7d3eb1b0b5670639a42933c38b12387abc71331552668855e152c443a6ca90e3d06a45d28e186c4ee448e58015676821664b0b14d582826555a1e1cd2f56eac88bbdd32c6baf648365ed9922842819b1424606f0aa0c05374b92805c3394cdd926961242422571440d8c2ca41c236214d3c6ae845c3aaab470cb5407f16b341d5fc1595d5a07f0c24514498b1e2b6baf5c1b40955c074a6e8c80b22349131b34c89315b704bc100395038691b4146e172eae3df4ccb088ca9eb162499810152cba845e188173460d87922b268a81e0282b62cf4f0e94115d5e88a11213801cb0b01969a61479cac01c17ea792c214fd1c33348475b1b8d5a83a36cc916b51137cc1f46b4b0729a9861c3838d0a216129c652d65e69664b94cd8485061027572b7c1861d102cbcbabcd0c47a2c4714d338522c6736602ec8ccb6f67cd2021eacc9f1954c125675c2480b8ef500f311e11564945d0aab46ac05263344dd37ce2a40cd26fdfdbcb8c3561cde00b2bad2c32596f5e61a1228260553951920a626515b46db1696ed4b4b07e5451826ee9427bef6de22a93417134dc683a66e1912eaad9d83946c884cdf538c96285501345734b76ea58c9da4bbf80787470f5dbcce9b7632b74e7741120627912150624cd88fb0ea1297e8179687901ec0a9517ad20930fd3ccb52f594c82918879f1e8a38eabce9da24784262a3c8761d0da2378887138f780f3218df3d1cbe31e87c3e1ca2c25efdfa01343502069a108d3fa4519d96611aab5874b51ecc2091b1ccb1219b2f6d01323de9ce262db7b6f29ac6562ea4d21bb874619242c2b80a8c93169380244061e4ea68c70114b64d97b57397bd3b7e938c8da337166ca3e3163814461ad377fe0110d971b3482105183e3cc0c64daf0b8b121d625660d88d309b774a1bdf7c6953e8c50123db216528c1182072881a48286af1e547c4009d9ec78a02c480f30373c90d4521e2a162d9f30cb88165a23be90a82ad1a284151a86b0c6302945511305c5f4f4bb4896dfdba6a4e44994372c768cb97b9be89b852f509007dcbf477196be8c63458e903929b2e6707da9e5e3f1a5e319a4d2302d2d1e3d7c9cd528b36308d4c9ab3ad3f5e60c99912423c62540e197c70c105e9699a7bdf7de7befbd63ed6da07f83cabc004099236730b2cec8e800a61bd29662f0c032b5c602eb109e7d80e8a6048c32375ca070cb32059e00c8f22f39cc281f3482615ed0f8a801487543040e2d342c25c1aae1c40913c7d530f8fb065e42400b2b485840113266c97d75e688e21c719ebc39c72f42d2cc48197322c7855bba10ead8c6da43d1deacb1c71ca54419ad30af3452ee3bf429c6417686213bfb3a4b3286060c17d79640033bd9801242532ac21635c23940d254e1b2f78ddf47ccfcde33e87166e309a814f5e4ee6d9a7bc6dadb548268a4f11a2fb06a9061d99092619ae909411e69bf3844dcf4b031640e5a82994fcc101b6aac50a431769153192a349030b1203808bb5478b56218b843931a9713d60b769b5463d472efbd5d60f160699b585a421265294aaac6902ba39a14516dc8b828510a6b81d574e40316beb42ac85aa678055b84a186004c4f4a299123b832689aa90a9e176e3c80d1f4db7192ce3471a9cd060e8753a48e7ff805d89ba663146bcf1cb9a244b1b101c5c857138ddf4a7e6f235c6a8238a020414372f746cd749f587b9b674bd052182d2e862ebc5e4c7de9d884599215d1a2b683cd5ad7761ac2a4a7d868e262c3cb165f6a62a4adb5b4e3b7efedb8c40b631c1a6316d271918584c8c16fc7245ac0371fd231dcdb6df837df99a7fb9beb326fe86f4170b8c0bae2224b987b63ffe6d92af552c0bf411ec61b0b42cf7856807f47b5110ed28b99a0825c587a40f510e2a384968f218c2f5a3fd29098018956941c2d20424a6805d1a22564c8978e47acbd729358c4dabb6d1f5cd2c254a0614326d84455358ab189c3b446ac3a5104456f50b505b7511bb0bf1f264921292449b2ea0a470db19410071dfce824cb8fd7f9d14996afd2c598092e373eb23832be2c4b153db8d6accee8c05105b768c2ac93f67cfee8a4cbd2e9a4cbd2e318a42e3f4861f2d52093648c87174f13aeb19d18227c18b1522371e2868c1656bab44bc686265d53a95a5b0c2a56fd14a17a9a1459f8c0d9c94da8a0599b5061f21cfcd8840a963507d30cdea05851264823ad45667acd66c593a531c02940485ce960ecd6dbd3c53aaa205290d0d66918615874a90a13c529c378ed82cbab4a938d176478e510131e3a3a2d9ba48a4e2b091910944c53c9cf8c8f21942035a08c68f98b0ad470a1c609c890cd1a050899d3a54c890c8dcb7d75562b9ef4ad6555e349d2c5932429c249adc70f12619e54947049b224f7ce226a39591edb8f5a56c17f5912cb09d0d25ab8818115c46a4904700d912ba984d21726a42ea3ac547928258fe4444ca9e01ab17446ccf1266ab790ca2d48d0ca52a6844f0c8e26c09249dd7b6fb224778b12bf71bf63fcdea59b11b3e3131a88882962060a1434eeab6351a6c3c2cc5ac268850836866609973551eedee4d62ccbc342cbdb7e7cc262eb5f164573b3ac41969bdce47eb234e3b566eaf1fab5bbd63ec4ea96676b1e1e73a76b21e76f3f3e59fa6d49c700b0e4c96a12c601941aab9ad4a7a943a81b582df63d3ff3949bc79efbd4ece69d7bc792a77a964e9264098274f57cd53fbd34d9ed27cf0816bb4a7ab9ebf9dd8a1883b2b922d5578a6e43bac3e842ae1b7587a2888cb515d294b33e2971b5399cac4afa7baa3c58cefcc6c2e6cddf9be569a5cefd3c3add8f5758b0fccb1343c42f0d0e112d2ba0b20c61f10387ab858f27ac2d2c77f4f1045e983c65f9b2c4898bfbb2e38acd616dc657132462b8d828fd3d7ac7ad1fbd344974fe6678b1062c4b6b4bd55672cb4a22ac989c46245189d3a3696ff8d109590d5ffee8640e9122e938f2f6d6d928bb003f1ec7f4368e63d6e4b8c7716c37f6e1347393e5e9a697e41e578ce64d74bc522c195c252ec01317465efbd63f3f62c908f2ec8f58327068a56369b2faca4b6a6d423edd499234db575796255b6aad4fdd01ebe8f8d669472399cce4c8db24a93de7acdbd1842cc3c996379f79f8397eed2207aca089b63b92befd249f74275d48136d97f4219e1829f01c755007789a3a297688e64607786299224921cc66a273b7e35bf4fa157a8dc50496a4d7c3f4c7ab2b67fe65fdc432d339e3316434c38276ba179d7efa491c3b7d4ce7a79f5e2c3acf110d585454545454545474ee739f9bdd3af63cf51063218ccfed58086316bbb3ce6e21d6f1c96e1d3b14c4bb48c9d2d88f432ba9cfc0b104b2e8ba2d14cc27c6273e35debacce67cb21b3b3e4fa15dc4e2f3dc389f7b482774eaf6894fcc6276ebb60e6fa11dc445983df7b9c78dcf8dcf8dcf8dc7211eb2277beea1223f4fac6359f63c755bb7dd1de321a1a28db10e0bed21acdb434279abc593c57b2c9e45fb3c373ef1a76300581edf9b688f1d9b188df28804c58f38f8a363200dda04d98889329106c47df1f0031d39aa38ad41a1a136220902d7b40173c6c63804588c136c53a486fbe2a28a312795181dff34910c5555c4088770680c895edc2061a124cd1697d1e7f3ad705fbcf6a363b59c62f473f4712c1b73e545188b2e385fae08e1171227a62a24bad0e08e43e3589454530f315e595c0868a2f18b1a2ac0293db8e480b9a30a1c559eb2e658d1f1e502a90db921a746d6d50ceee818692c61ffb882a207b17aeaa3d7408617322fff7ef40f999751fc58e2c48fce8e4ca38f56525ffa2e5de5c93c0ebc745d260a79f89284b7880d518b387a7db979738e3abe960525e44b8c84999ab2a608bff4297110530dd7602d4cdce290c3a466f8eccb17ab655f1ba49fd207fe66a6a62f3d036b7c99a1de1c8ca2ca432fadad2fbdbe14fbd2f318922f79ca379b9d7d99d5b26f0c52ce5ffdcb5ae9cbb289915755cf69d69e7a75e473b95cce857e3c97f3221f9f5373d9444ee7b99c9af33197cb8d6d7e1011bb3107cd0c617227e0c2f5e4b554454b57aeccbf3c63b45431ff92f06af155dfaa8af5e3d52c19af66cd7955d5ca7ad5735a912eeb6aeb753a9dce339a9ffdcb33f62fd0ff3009fecfcf0f9332ff33ccf23f9ed1acbd9f3323da1ad2bb7b36b3f69ccd99f7f1799f8cf43eaafbf8e4dcc767c58822342c7141052485eb9356e4cd15941638c4e4783e07f4b935639fcbe5d8a0f81c1badcf793e535555f553f55c66eda9648a483c4992a407e9ce2c79d287fcc002e9244992a40fd38e24c91f271d6fb5244992248986e9dbd6f398b5d7b6237bfefcfcfcfc7836f3335ebfdb7916b3f676edc89e3e3e9ec3689d71f1ee9ec1ac3d5755555555555555cf656b4f3523f53adf3acf5fd69eae1dd93397eb008e1ac228526dc05ee4724f96e4129fcb79a076850cf1e78406939bf3ec65ede5c8d61e79a6e5f726f1db3dc84326daee76128aca7ee3f688dcdefe829adf5b65b201a565e6971b12b7b2d86f2635c0b83481a97283878b1f62b26c0102a35c167e352415bf7a84b1e2be23d1006b4a44454199b082b385bf7d7c7c7c7c3c8fad3d9f76641d0beac5abaada2597cbe572b95c2e97f3cc65ede5828abc9e7cd275e4599627fd243d6f597ba4d8dadb60ffc1079ec3d6de0743b6bea7a7a7a7a7a7a7c787d818d2b2d6e3b76fdd09f6553464eb3df0c07396b5e7413bb2e7d4f07138d779e6e51ce7411be745558fc3651f0ee72ce0481c0e87d361c48cc52f079517359c8f9a080073581071d02873ca8273b1005c0d21f1a4672cba2bafaaaa9faae72b370f230942a234916af1dbd9aedfae931afbed4257534a5e454ef61c1148d2d0d0e2e243b38586952a6b0fb7e53970f0dcb5f6385c713d0f8feb78783c28f3f0f8c963e349033ce9b9b8f6482a5c45601ec83790e729e756d7eff0fc8e9cdf71cf3cd2773c28efecf8500a77c74f4d64811b605d537e5a626cdc9d23bfae2c57453935dc97fd1ddf5ddbcafe608f5a50747400254914a628607ebb90f0b70f49c9b215fced796bed6de2f8163d497e8d638eb82811d5254c4dd42bf4a40f3de9e358b422c679124a8e27dd84cc23515091329162cb8f3352c6b128454f567e83ef0d9ea1acbd0dedc89e505e6b38afb50779284af3daa6df68ad66799dd3d88dceed643d69dddafc8b87afb778c65ea079d326c81530570f79546939451da1c105ee1043a3862e5e720871df71ed0541205f589c9599d8725fecc3dd40815506cb494cd886ad1ad654fc203211ee40f33c3c9e89e7dadedbfdc98edfefec7876726eb8e224c822ca0e3427eecb7e6e87ef73b9b5cff9e9e2cd9b1c5749b0b839cf4d5cc757075a24398574d6ec491d469ef49c9582ad212ba4d0403a51220ba8f5389dc7b1799c3038e4c90c31278eb838cf587eb5f6b49b24afe33bf3f2f044f3a8ef358fba0ba13ea48b963c7aa4e68346b5dcf87814bd8151c7e8d651234b113253a6bcb4e230f9a5d832f2a40c18266f7e08833ab4c4deb821b361228b85f0c97d47223a0eb5e9ead0c60d13ddd51636afb55e03be5e237bed790949927e929e95f8d6e3709eadd61e2ec9da43d9f8fef47d7a46b2f6ce611b12a66ba2d3f530a48baadefcc0021a6b6e371d33e14e931d9aeee47138cf556b0fd78eecb902ce9b1965664021ba2f1b048c1a05bac4c182f3c2c40c36dced59a8b506c8c1a39e8f0cdd48eac27ac2916344d60e32af750d2de8418c913667c7d218577b36e25a6ae03c497a2e92a96c365b986db5d96c596c02b0f9c8f436df363fd390bdcdd9ac1a7cbc4d0dc5dbd4bcbccda686e66d6a9ebc6d0d8eb77926b2f66c59694e3ccbba2ef3383ccb7a10cbfa90665956eb200faf47ad11fe1db7ced078adfd3c63f6da5934455ebb0e4d93d72ee4f4da878a78bcce429bf33a2b2dcb6bcf43d69e2e8e6fd1ef33297efb3e23e3b79fdbf3d4dadb524556249e030e3c0b597b1c24e1fadb2dcddfdc853c649ef69b0fddae7e7fbba5ddfc83263adddbdff64d042f5caa9821d610c22385322c6faa0847b4b15102d3921233b44874b17133f326a9eac6081f50ee3b12ffe663d8efed3988d63e9205bdd6494cbcf60c441735a2fd00ee2080d315f5de8b7faf8ed9126db355076d9a15d88c314b58c284f1d2a18d35d460660dd04b6a0e0e1f40ce4c5c4912a7449635299a0d708143439314736674f580c012a9af22699818413a43cf7801f104ea37a386125b68419e2469d2cc59ea925116b49991b16548361c22a7cd1b1e5aac66f0129b72da0262443dfbd2878471e0f8b881348608e596ee34000d99a03073660e570e17b632e395ab184cc69a88d4009c416bede43bb47aba77bbedd92a0b619f00152bb11e3fb2ac9e5cb37d5932c8882f7d93b1057971e34b8a176cceb8a57b862a772bf45adfda3c14aa60473ce66dedabfbd2cba7ed3bf4a5128f1f943655a8ac719b5049b3c2e6c9871827d76c4772b7af1010ac2f7de7a7f3c76fcac569cabdb9b3cffee6d4d6fecd91bf1df2b713870ceea07dde5943c3a60d8916692cdcb86fee9704e48b92215d5b61dc2152cca6b448537a72df1c308b8a91351b334859e3beb9602e97cb99fd9b13f36f8efd37974332c0bf3bb8397b0d1727e3326ead02647c98c1e052840b0bf7dd510a1e298ba1c4cd0c68dc770748d6540a618eaa2b25eebb430217130e31628074c570df9d1abc11d290648bda5a9afbee642f61865324a63c61b9efce8ed867dff1caefce4ed967df29665ee961fedd2182f977a7ecdf9da69d9d1b6404f02f0ece3663b7198bc6a2adf13063a50a894c8fb532f7c5957380534864a185c9e1be38a41d4d5b6ea224097be1be38e067364d9c20e9f0297172618031f6d5050c192171dc17277c01149326668d8d09f7c50d1f27f6d9715e678f337b5cd967c715336f7ff917e7e55f1cd9bf38f25f1c8ea9c3bf2c1cf2368714dededbd9677f6f6a9f9df521fdd8bf6c53977f592effb2c4cfceb265ffb266ecd9676759b1199009134486d209182cdc97656305d6f52587192443dc975d4a53c22486951d5c45f765819fb5d470066ccac7d5e5be6c10041464654b56556a0c715f5628d4710686050c34f7658742ffdef2922d2fd9c66caf6d8d832a3168ce4c01a3b1c47d6f5094e23481c282c61a37ee7b5b1a01cd09373952f47802e5be37a09a3235647408295671df9b4f95105e69a283ea8dfbdec65210bdd4e4247913e6beb7e1adec76bb6df9f74614fbf716f6efade986f4d96f3ea7cffedae07c769b0f49cbbfb626b07f6d5fffda889fdd56f4ca36315b19f0dfa7a6a894ca9670a3187408aa211200127316003020100c07c562c1340d032544f914000f6eb6565e4a9788a359142739ca18858c3186100119100018a14d13e058b7ac2e3b5ab64d37a6759387557e2900f571356adf37c600967c2c5af2848a14e78e205123805c5491ec1acf1edc7684200592b96d2abe04d21b163a45504d431e8f01feafdbb490b6dc21f288aab6dbaa531446a182cc72399c564a9b6cb0527852cbfc84c69809b30aa93b2ca29c9d2c2dfbeeeba8d7e8dfb895c72fdef950741cb9a9b7dba8c5b1d4f118c8b11d4df2dc618c512797c70df8abd7a57c7c6392e9f456d29343a88d4aeb751462974ecf71c45a18fd387c83c5d8869bab38af6e5f2cb4b5e1647bf5915c7f8879f50a929b4b5788c3b6fd380ec28576eb128a6a6bb99864aaaac1ca28b73e2858b9e69030e70a66b0160631a59d50823093510d84db33661461280692bcb41fae4eba828744e6388012c3592941cd4bf456cd02bd04e4e69206586a235ba5e8325eba9e55d0e9c497d09c87a837d74dc9d1920e407bd09cdeba51f50fbfcdb57665c823e57e5d1d41372ea5a928a1fb9632699b284df3f4231e2e4685ac1003403788c766210b806b9f8b528e5fcd5da49b4bf15731fac886c220428bb6b30178d57959488f1e79b8c345ba4d4b26bdd54a8edab69a8559a77896bcf93df3bee0bcd0cda3bce41413a82ee6f561ca79521c97fd0ccee54bdb99492515104ab08e9ffd2cd6316748cf4c659bd5f7c0983f67d29ad942d86d88327a3fc2e8dfc4a683d137de3bb1d42915b23b6e076b0733956d9ec8b3240b91aa335ae8b19d19693426474804e2650e5406ed958079a6a495b3ea9fd0454999465fe2fb03571edbd428e7c3a82ea4b24ce82b1170c210c26e900a11e503dd469c2a3a1ea8158b68fc8c06ed6723dc7099e16cfbf7c5b5895a0b9e382719068db01a1afd2d573beb9d06cd1a4769a87fe0ca285d9b5c599eca9fbe98a5511b7f95210e019339dae6f7a4031cd9769463098cf278dd0a49cdb5a8d17856693140deccc7d202005af34f84d08dd6ad4ff41a2aca878d0157274691c45a54da733b2d306a6c200e35ebc30db1837238ba03fab9f4a575991b8a32e3f0482b71eb3a682802ce748095eecdc049569936dd582179ccf3070b63db1a0a45dcb6acf8cf5994913f894cc582b626540516a0642d6d0c3e518ccf0fb42ce37260b1576d87a7bfd786c58cb9728539ac6d2913a0ce9948c33b19331d65000f3d1321066f1909b22a4b1f12a556ca5574f204336ae964271b11152e12d2dea5ba7c76e57408d3f23109ce31a7896f3d383aea1583f86920937644bc7a8c6db81e2f5fba711355eb2c91480d4afff44a59126006ca7a170e56068b838772e84ce669c5d2ebd411c8d848ca13a9a693736236c509269232fd68b2d4156b4d6e15ba22b4fae7704ba13035a0b5cad223f28d396fa7c3cf6c17733aeb7999afc8093d502b1aff7eb9306ea8c80e3b745d05b6c7fde2c6f3acdadc1ac7d47b651768b06826a2ab3f63dc16f5de64548eba9ff8a2fb5eb86abab8e429273034d302bfc5bd29cdd660cb7a6277b5937823501524805f6b063841911e1f615686ebaa6c74b8bd704ff4318353bd124e178ff83186b51291931ae95ce6613b51a275a5bb72d2b1ee5331dd564282e347729dfa9ff954e0494c36fa73dbff1e2f8ccc0c8d20efb30b8d28de4c163e02d40298398b3029be12c4e37642ee99632b2156f7245c5ff3777f3e1451b1ed0ee26a1c6189271c1027642bbe9a7feb8e0fc383adb37b42b75ce7d911b61bcac66dc9a05f2f8feec296eb1250dab1874f6ae61e419167c2faab8425cf3ac9be026f6d383aa5f00969a71220a244c5f7b7dcd440f56dcadaee104771bc1bc097b718f1d8df7221a9cdf25ca12ac86ee971cc4d57f8413c8cdd75fac3c4c83683d042988b6fd80255050ce351fbf9a717b76bcab5433f1183111662881c4d6147876d85678d95f9626dac0cc18049bd2e3e94bfd6907546901292381699ee8a79fda1b017a697295efe2908bb01b19d7ac9147f35397b7d8272fb4070ee3a3fb342f066227b2942401cfe6daddb04f0676d847177f000789d1e759997336c161df9c4d57cb2b7a049365e705e8a65b19428ce30b1564ccfc41b0cea5824e2a0979272c55b5753a6b8ac263d9050c43e64e51efd236a29bc7670ae0f3370d441067b6cf5bdb6f45bc97549ff347b64baa650efa98bd0eadb5d9ec1906bf1b64eb77c6d01b132c6117f1111135802500bd639a352835853bbea17a039b0b4b2aef6249af4d590745b6c027f2fbde7f8111c2429e5594754941c651a93a31a9d9b322552f080a21111e66ff9c19c54f6b6b09ca9c910af9d4ec0d3843e017a790ad1cb6cff80e6356bb442b8867126deb2c171008db94a27be9cc131d1807e33d8b422519b9747aba2b3f22b8a3cf1cfea9abb8e37a5851aa52dda8aa1ce37850b8424516ddd12c74adc147ca191bac0f8df56e4372c7849b463f0d9c1470fcee59473421a494598587d94df7ed4c173ffaadedda28dce512f83b0cf4ff3ab58631a75370a21a05fb1567dcd7b7890faa68ab4fccbdd7fe3875fd5a37a581c7a53f0d18d3dcc94fa829e0e6cb0b68e7c8946749cdea9f7dab92011c99cc39bbfe8ca3d9f1715b0d37ab0b245f7ff11124c09549223461e55e8d55bcc4bf2cbdec751b4a08a816c4d34a14d508d86f1f75018ed7f7649ae803f824662349caa832ec5fab4c46fb6a4914e305d97a017c00dad5b49481d18f3b167867ad6dcc358334caf9a356c18194085134735729d7944d189846b9d503992f189e895d8f6e4a3be4d8cb5ad5b2b5e3571714f675acf8813ece33dbdf0239a48e8cd838b3fecf6529a5d0f0fad1a088ed36a3ebaf51b37bda91bef31b5e17f64c23fa1a392565021f48be5a1cc070fca2c0a8b95d073d688be2ca50a2d391a14eedb7aaf874edab79a08694f8ce2b794c0054852b29e77f82454ba24e1262786663509ed756314018d1109710f3ac45412bc4b4fc7ffb857c0f0b219cdf4d954c49283c95ec369c97e321d9c6f1324ecafd7981f468004293527d311bb096593a22fed4cb5ade2660246961dafdcf8b634c42118760102a96105ff992556906bd769c9508a1d03040f0cc5fcfadfe1057f5d717119f3681ee2ee1f7ab886636b027685274e6e0bf1b788cacce3156cf59f6b89b3b614ae304015d1eb1446dfd4c7bac1f41d7ecba9060fadfebeb98c1eec2cb1cf6f7870c699325d29fef582ea989f6446778b23dc964835dfd8cc702288f244088e4adc1605bb41282bcacc0d9c4b5064f334642c0b1b69e770a281452cdad655ac58f16a9c6636b5d64b4843238bda78da311f7e566f0c91084eba1d40c41948878c5a07a9aa07eb6b95691a860be0f08522ce0336e20baba9e0fb5160e9ee816bf8e429d6a3eae69fe501b86f95b8bc81e1bb8393356d068e36cd291209aa49c06ddf5f1cb48b1c14416e2a00093392de93e1732d6fa7a8c70698bbc835436041c51a4cebbc28e9d899aef095abbaac3866e9441fbd7823317a103436aa6ad81d18f739da0f9f91d188efed1a8d49f1b73828ff9f53901281d9d47df7f216ca3e98a98c0702e14a84ba47d732d7f42a0f285ba28f7707f52bdf3763956262e8dcf67896d90b843842c5e74c00306b0606400d1246a9e60371d953dd95b41ab8381b02350b30e61dd3f0282abacb79f92887b804f1a9d57588f95582453283b26c8c4b61662e487b141f78712bda62531890316b800e07cff59456a9dba205b7e59d8f0f21e858cc1bc9e3479265c6a911cfa19d7b9afb074fb71d79466c92ab78ecd5b5b057f9af3346f81d84667f9122679e2d801757743b6e417610b6d2146ac89a04a3b383a0eb186f493a22273b456bffe2a30365a04b55718df5e99a5b81eeefb9acef2c113f63d30c71f690e80c32847dd99241abe73f7e631b43716e3f5ffed0a0e729dc48ae0758f80ad96222f8c571f12fe3a7536ddf306d81b769de0fe08c494b92d49e6fa9e6e28686403d4f25c25f9294c48b13b6101b2f2aa8a424f92e8ed7539ee15202ab33d66f18ea68463def5d16dfc578d6a71bb2558e0c3dc26c1f340b82a92d5945150514e42b2258b8f2e61ff3e4805d281f79124b4d939abd26e6c574761c80c992c50cc01863be2ba724442608d7927b4af1d1c5e580a77cd5135abb2acdc60d4d480f61bf1c3e30acfe39184fb3a1d03f4b0afc4e19533087dfdcbc97381cbd1a785f6406210a22db1c9c25da95cbd019d99e279251cd0957e11f8d110b85279e4e533612bc16d3855699fafcba2b03af1b495b3e9baa2a6f2c0bae48643c6e05f385292a5be8026b165a517a18d21dfa7a4ddb22e53f14e669a90df14a90310a24ab7ec590a98aac91831fe28e869ab4aa9fc2cb38b2326a46614444c3fe697cc932df7388331872e33554446ad6f8eb5d13c847f108e4d0c2e31a4a288923506bfa3542cd6ac395240391649796810b8af8232b1c3eda5b3913b67c61c3ffcfafcc86ff336630c26f13d08f870dd8b9b4c0c297e4d6a0beff83721f85354a73b5bb9846b2f91218395b313517c99f1959665626f9afe435a735266f2b992174eeaf327219715bd492dc48b92e83ccab9280c683778de9644945db3460b737447fe5e8066c14063c8432dd47f0ed59a2f2771bd75632fc38a499269280d214ee0c6a0b38e7cd4c54a8c823fc077ed6cfb93adc6ad1371a07c3657cd0f686c5f287d3471c9f35f4f9feb2094db9e082393121bcde55b1dae63b1dd142a4e61db470f3c218774239afbcfb3ad422ce92f12e921c85f22c5d840ef3a0fba4062199ef7c52ae911974402289891777e530c9b0f67f42964bb07e7912017de73a787ece4ed713a5418a516a0e12bd236dbd63650995f46976edd473ae2e212bf02287c9ba6c74bd0b23a79209fb13213e370093304687071a99720cc3240d6f4761536b6410710ab5dba3d9b31dfadb9e66cd146cac0a0224a3dccbe9ca5cacbc46b13e5e8e4b992ddc29a7aa92fc9fb4e3657fab2a944146d3cc483b08dcecad59823626b166c78a744db1b8af3b613a40bf88588bc90c230894b7799faf7b11b0e5e61e8f86858b8e3ee347928b68f4c532e65da730d67af5944cbbdf3d3e177d5a5c1c23317fa32b5e9b25266f2d17bdd4dc2c8fe71491548888d157ef57b665fc4bbaedc374215dbe3cd0045164fd4c5b0945a5a13b160a7a6cf8d62ad29e921c68e88466d85fd40d5876d20e8e42d32c2b492a296e92d7bf72a0bb2b013e0e840a6d17017a75e8b34e4e6a25277dd2e8e5f79628a8d0ab20fc3c14696c1c92849aa990c227be0c46066238546c780e53ca33afe50d537511efeb33e7033b0c179d9687373966516b6a0f06cb74c0a45c3063cd9da3c0d687a844a56568095998ee3adb3c9e5a075f7fbfced42da93e316b6121a7a036c2c3667af6dfc1bc2f837c62bcefa3f790a6db865789bc4b62857ce82651ca1a330701dd7562e2816e4ce812b2ad6749b6c9dc094d10a9545a34bdb31410c206ba82fec990bee067ae2329714e006f2af33d27704e09fea0255827cd5b913a15da1176e89d6849562c8d3d6261b65b862289f93dfaee2073a50497e0fa8bbe32648c43065a7f4778a9580dd4ad0963b52e10217c871a5562ebab2655fd57622b98c9582da97b30c00fe22d287b7305ac895facfa885cc327fc6227bde2e820313a085055b87f2dfbd557549e935939e4658c464197a7edb36f74c9fe935473a213c884313d602e3221cc211afee86292175fbd666ac9a32316eaa1fc3ac7e734549650f52752e72e0f629304c5c3f7257cd7bb10b0b6fd9bdba4bf0694ac09a01d18a868c328859ace097cb967cf4d63723410d48d2cb3736908ed2a202a5cc0eba8e58662730f0dfefa964f1e21c7efad735435ad70cb95d2624664b48780f82fefd693e7cba6a3a5020b0e8d841530ae027c9584d3c5b0749d3081dd5f045e0caf5240119b4d01a2aacffd9ccba4a4da5bda629a4cb67092fafc124005b050e71c32d8290a5516c04d8a17842c92a72c04f3fadbc3a9f0fabf78e09d7cd91e6423623e117ee577326d7ca1caed0a2745cc51a4bff5b896f5aed646cba753219a3dcb3259780d9dadd091558d84cf56b3b3b5b9d4524d9a94c5ad282d8b6c24f52bcc6d1c7d30c25eb03492236792946b5e3cf53612bd62939682a92550bcf58c482849ccbe86bc83250a9736dc84e030eb6c323b4601b6cbd9f6da4aaf2b30944fe476b54a18f74a0ad819592c4b48a17e1966b175141b684c2ebcd7262d3afe2c7dd83522e650976e06afeb9416359c6f7ffe6195966c3de379360010a6de782d945ab6059e6328e83e282ba67a39687a804899a3ed718a6e6284acd0aaca0a7992aeb9ad11dd3828071f253b03a6b6a75a90ecbe344fee0a241dd8e6aca6a09d295e13866f9a7274702c0134d7c233eb30c480a615723f3d848ba4b48d846ad192cc0821db83ced3f0121e719cfcc91997cf855c440de0dce896bd10e04a66a46d8ff8bbf5846e68d1658130b1c91670b742153765e70cdeb01990aee542236e48ba7be30f8f37da14f786614c87e2af3860d83d026e55e04a74cf95e98e7e05690145378209c82a05731ba9d0b0360939506a7bd4b8450af04d43061df1ef7076b480685a69e166aaec0f13dee4c3242470bae1f4fa1ff5e7d870133484e84e881ef5ebfd022a3b4edb596968f3e2b6f9ae83a09272e0810be8f6e4bbdc098b1f759d5a8a68588a1e063bbdbc8698d2bc73f2861b6212bb1d82b64e885d7edef0b1e819784bb1991ddf8a7739ea0209c809de31b9069496a77cdc30c7fe26a6e866dbf4965e095facdce8ebf8a5eb2d4e029c925fb878c42779aa4e3c70920774c5f93567ce562540b0646493b55e043a2d35c63cb0e4a38d1994f905ff9a78821e93ea9eae0409fe7fee4de456f2299a6cca6204634db67c20a924f309a6d01f0c7b67c13701b3b29231840aceb76ff03174ad8da2700ceac59409ed071be65fdde4e803ec4a51a8ffa763d399b8916d1068df48888edce8782fa0729cada46905cb2d035c59ddc995b5d0c4e148202b0618b2f1fcfd69e6cf754f8953144db7f409870280f4ea9267428f8a2da10c650037c0e6d1548d07362ff9e76310391ffe5b1f7f46dc0dffe5dfbd530b3a6c34bf198e5e3ce2264052245f1623aaf0543cda8367c8acdb51e10ada6cdb9e4b23822f7e7911228bfa66319622c27555d30d2e65ca76950be09a1bc4dd47716fe312d70b30957bfb0daf081ed02b3f87e345bc7464f8adb3791c0b0a381533548974302f07ad41b865681f27a429cc73a79f1f2b1428d5c4f4d0137e4bd1a19be7581a483762df2632dbf050f169f041dc96021eed50c4db120aadacd3e35a0e848eec69dfbd72c1928a67c5e568e6b5281f20d00dbd80a5188ee935ecf1c4fa22cbe1d90a8e3aa7303d788e45fa66b1bac49614337764bd5ffb272c223109a6f5ee7713ac8cec586722d41362ccd5f62d5456f15b26f5da4731fd10e4717a69942fcf2d3b456f624fbbf37ac92eb6a4457453be45ee170574b5d9e68258ecaaeed00614eb4faa51f745732ce794662daca668e6c7078da1083bc6148781845c491d9ee4ec9bf03fd8cddeb7b693f75f79cee2ca57cbe2b25e070b8413f5919d5252aa70121b1cfa22f08b83085dd3e40d00037a3c6e4f90d230cbdf436031608cdb500853cf2e4214ea9a048d041751e9d975898fe77f6ef669e937d020ec29272f5d6ac96d12c7a024c58e0dbc21568b8c68d8ae5d6e5558f54acef8cc418923e6018606ed3def9673d8f82df1a89741287e330a7a41390761a8a8b44a4eee54a98146215163688e88d5809ad8a6a99222ce9ac3858c5822fad737cf7f3cc982a171ae38b9a9fe20712d95b46e9dcb1e971dfe1a61b2d665258c74bc2e70e2ff62bfd94ebf55ee829178944e10619e79b01175a316edd5144a5dae1700a864a86fd4f6da2b9ad069b04a80c46acc196eee365c33568c6822cf7a231bd88ca4e82123e753a3af69e9f7e4962cd7b7b962034a4eb8f65b185743d094be8c20c56f2da5d1894d6e99779378f55f71add89e60499cfe1596935ab442a01ccdbba01f006e1e0a031351c8bd151cb00e40d2cc45160687c4aa84d97dc02dc93eaa3a5e7c59b92460c67664ab0918ca972010a300543fbc6b94e70d92bf517958f3b90421a2cb963bc96aa7e374516d8f271f44d6fcabfacc63aa402ad710597d842e4ea09523fe7a7261bb053c41562f6c238d1a1a4df57fb0012d36eeb803329135d24516b39756c54852a3d9cb164c852ebdfb1446acafc00811241605d34301a64b72f3f27593eaf3869e1de126f7fd1ed82ce1deb066519d268bea22656765da7ebd9632bdafd5683a9b9dbf829a36abd86bbc58d72e8b8a841f111aa809e0cc1fc60d3a1cd8a95a6635aa7623a94b96cc18df9415fbc73d7ce86308aff3cf96e437dcbf0f230df0d85b4329c8878f90b9b0982aa534cd1bd91d08e89fe7c659c68c218cfeb8508906c1c8de1dafda269e334c9ef1777cb51aa6e9bc052e1658fc7da8bdaf4b62cf9ef7116623a3cc27c6b43966fce0e76a41052b8e16d941483da8748674d97e62880cbff68af4c41540d168001a661768cd1aca6b1b910775233f66906669dc1c9c8c0b409a7231409f383c8f3494dc989f85ff630b2ce6ee7714352e85aacaf207de5e6885559269001a678c5ac8c46623223b389b2794e2be3e6f70cf30f5de4ad973e6061c451b1fecf7286bae8db78c096f4c7f62a0bd1e6f0005839697fa1527f989429f88e3d417568e8bb9bb2f26608c03188ef7159671e1e27989d53f0cf5f104987482fc55894f4cca51cc1bc3a109a573e0b3048ab0ceb5e05da9a39a65c52ed6df8af18a7052aac59210c0b6a81e191771c284b6655fea1343d196501cd821c3a9b57963f2d510d31fa948b0c011488785cbf823393b378ed6aae69063d970649ae56be6c63bc15d5873444cc82f1f2da06e3e53cd82c2f65e39520406312ffe0951ba1603805910c925cdd9fa7372d32759cf5082af7caac753c2b18bfd8e59b84938083112d0e127cea0c67ea3acb332c690d0f2ce42e7e9b108f4d4edc5555ff135b66e5e7ec771690e710fa2063150877a5c0f280c685a055164f5035a4acc8218040aa59726c216d6162b2de401b0d270963f81667fb4e59267f4227c4ac53aeb96daeac12b73a55c39e1e1642feed468e5b3f1d6c49675b0744c35d8c0967a5b90ec356480631f7ebac74d074048767d60259c42a6874c877313e41207e1c115a6214d0d30d3e145f4d11d146d0f72b85c68004c87213729341d5caf3a1dc62b959ed3c10bac97c6858d741ec7c4bf4030d999c217899f0eb7647b855c3a95ecf01a5e23f108f5903e793eb88d391dd4360820debbff4b2729a9cd66f9a78b4759fa731cce13a5420693ae588b8afe04d8b28907997d6d88327c9b40d4b5f8e2fd2e047b4069c7b88fd5e20fca02235a95b8fc73944d2716be50ea9c6609b490701b729e06c38a2fc4c5e13468e1c3d4ceea26214cb5416d6cce2dc2505df86bd367cafecbca789560717f95666c3e7b549e318c14ff2300e33b6edaaa3b47b25a6d62b6d9b10bbcb27778022ac695b3f89f95df4b0db2a78dfa59425d337d8fdb2c7a264d6090a9e6aa89ced22676f08b2d08ceb7b21d5bc79ce40a2a2b1f649534e5301fd0b43071a47596aacdc18d3dc6a4191d47b285bb5ddf6c541c1e57332bf8843bd4ffc2c6a9cd65fe6589f354105c5bb95b4d6a128eebdfea09e9983166c370f9426c589c5b4562e0d17251ae13384b2f1881ccf52c24b888c3f6578628406c0171ae54d413400c8d500eb2e4b600bef7dc68793a883e5cae3a9a556f096d9811586f77a6d104f3ffc744139862db40a0b927f59f0a5f10efc648e4505b3d408741a582800e9ac96cda7dfc390010ae8ae5c74591dd84cad3fc7ce100d0d2ff5a0cef3df26ae93358b4ae4ce7d09469b92a5a69bdfe428d0a0bb687ee766f2220d38edbcfb8cf5111ab085f2bac401b9e1976515084e8652cab0b0e3a70af1147844b6ad93c64f2485f7b6820c8e42cc0041919e90d580eb2b3ac693040c2477cf26ef3849c37d4706ff6e4047f7de44304cfdaf62b89e9d23058e8911fb28dc4268801e7224d5f37dd98700d2ecca29ec2bbbc3ea622353d1d179a297adde585c3efe04d50d8c8401d0b0a76820a9bb721841b24fbb1f01cafb16dadf8199bc30c45780806f842d41c6606ea0ed433e0f2e6074fa406dfe06c8b1df81e4ecc0c8085800f6f017f922714d23919d865a90a8f66a546fd1322ac09a19c363a88b6b439409aacd45092c2217c114e008ef37b0402bfa8662719b589f90419e838e0ff01f5ecc064b3e9768c3328c2e353a198b5677d1cbb7eaecbbe2c463c6a3e56c0d7ab58c12ad7e050923fcd8bc389987238956a2f603cfb24231c059338555fd9f866dcf41ae46a8636d0ceb0007e85ddd012d6b775c5c6b1146b17656e15db4fbe34a6ba2a67338a2b3d9b6da79b50c516e4d5284a0a4537b7a1e9f4ee44bfba2046e0eac5676e34fdb6adafdcc827bff7d0e8e6529741a0b7fcf5bad86f6008b484dd7dd4cdf26d4d11bc4cd1d4eb67b82bc57fa66db70c0c8c80bfb6a26ae116206ab44c8219d246bb22c86d98ea58f28267201d52a4dbe25f7556ae99c2f4f5ccaf43b7a42907b576f8583f1d045cb3b1be617f13b5551fea877e94258009445bc20558cd18838e6b8d541483bf39511e7e4f28aee68981c279d0c399f46b33996d41f2e8c0c6b206b5d5071f92ee3d4aa1ff259e11d6b9c2a687fd821ddf989057fc2e6705842dd95644968df079a71227ad13912300b6100b6860c6bec71cac1a6823cffe9fa0a2a712af55239495648d18d2a602c84009b0149ad316abc2bf5c704a805b4f9a831ef9f5edd002dd913a620280f8598849ec1507683a729d0a439f2ca047e4b1867206b8a420882ea89c747deb425273017a8060584ad126ea2f3b43573e03e268c68b50a3131ffea9f348a0941bd3065e9a0428a2d1a06200f2d2c33e81c4e06b1a63eca68230f010c90192f4c7d9cbcf88d6f194101b2211f40f0b08ccf0869ded40c8a6e22e27ea3a37d71774c442dab232acf15038b1256b0cf60692d25c44bd13f899c33ce81de01dd86c595e7bacb86315d49831fc138ffc3d8e76510b87b38d68416f1604bb515344894607b3ade0caf5b974140a57e3b71b372897ca2c49cced9a3647b68df098bcf0cc1300e7b509cb06928d6375f6f35cdf52dc0788416329958b561d8d8fbfbcadccd3c5d736ded674176c202552a2be9ac78c59d2e7fd6d0ca56506bf1036f07bba5f251256199da5639ac4e5bf4c1a77113fd145364f917e3a9442370b18d9ea0c5d7f1b19edb14a1d8f8bab47d8a95a5e9ece4841810e9d003e46e241d3fd48b5a584671069446c5de347bc452b1f53d34b0156e26bfa420a4e635889af144477bc618307f97cb536c06097f93426c204e296909eb9f652d51e91c93bcf30f9c724bf3e952243968bb274a0470837d55a8ef7c960d7998c6d64763f9c915b20b8214a0ade3ef80bc8cf4a86aad246b7b2f1d8483ed39b2120b431281eaa9b6bd70de08e0b1a6bc56004cc2f6a265aa8ce36050f06c0f3b123bd351a7eda5b20c6c0de448364a08e5786e56b03a2b36795bd9d7df938631161d2edc8ab3acda5aba1a3a117376c32dd5e52fa4a8b074f1be79aae58e20895cea2e89bf703c15b7e44715484a9c3ec94db7c21af42a10d2d7b4039e663a0735d10cd9b8ef6fdbc79e8246573d8a452351f386c136417ef838f535d49fe489d66ccaa3119414d99789572af89169db7c71ac901595ba3dadaaff1c21374cf134d52904b06ead24f6fdfdd360113e1bce0c4ae55a46f099e1598c7e4a9b573819e917c71cb4d622c9073aa6652925b99941405ad26bb69fbaff6708a22ab28d08dcb21e1b1486fc7e755be43319dc67bd3f8583445e31825b74afaf3e7ee6e372285fa8747d61bb15bac66a1b04337d26f73aecbdd1d1cb58763a54f30953dfe00406f959ec76ac95830f03132cc35e18a4a889a8e15d601cac5b918074e1d42145d5a1f9e0c0f7846a4949161b27929d77c3f57d248186213e554131aec0ad196174fad0ea63cca1d24e780ca99eb53508d8d2654118c79bf8de3cd1dc72763b41b98d34193b301e0ef0850f58de4dc45eb42e04cbc8efc31609e248c47aee6abfa71371d4c753cf81653993fe4670b70bcf97db59785b06ac9e87c2ea61a757375fb31f4059d4abbec56b9779dd7da54305dad4a360ddeebb6f8ad95ab5da8f66016fd688c949b9444c9071ccea2a9e40bb7182db0722f5bc00f8798cbdc56bb39a12456d9915cd4b9704e944d4e0dfe82c90e4201654d446c0ecca900cec0637448d1dde776f8bc1f0435eee820141c5b112b4cfd877407fb2cbbd77daeb3a5df7efbfc70c9ae4ef9b60da6caf42572a96fbb5c3705357a42907846c841ed800f5828edac0f32d64ff3f6f6dfe3ab5560f264e00fc38258a08c5f650a1eddb2dea1a6b46861ec1b715642f536aa1a261dafc06d318c1be32e2a32a8b11d11219a84b311c998b028c5fe9aa5f0a195520c6d8d71b9d331dc96214b3140c6b4d0780848419c87bc817bb56bf84744b7d9c220a55585b66a78116c33a533992afca7dccca2caeaaebc3892158110223f906a6069df0d63d2d0e348bb291789621b7668445c78f05044f842d27909756d85eae87e74f38d5822f1437334f224de521114a96debcd8651754a310704eabf2088185029c531e7086a8744d8ed119ffe355604a6a4c0ccb894c61f27133d524e60d62d2cfc78e16b950e567f0274ddb7465660d5e1bf07db6d9ff1a5b228d8b14aaab0092c89a3c3f5089a69a5a8ae65a244fb8d45e02fd6433db161e6adb01b285b2c8005900668b0cf6844dfd8ed206003e60e7895c3d302da723421e8ba9cfa4536094c096c1984e70fda2bb830c9832cc3b40ab6063078012331ab9f922168779c3bda2315c18d543e61b8ef823dab30b3c7cd34ed5109e1181feeab0453f32e0c99902bff305d3830c340b4e50427550fb73d92d2349ec0f9a2b80d073f994a2d7abc4529ddc3a733f0b84060f6e1de4a7e57c28f5cada5958e8a96d2afe03ea07c498ad284af0b5867d0a10a5aa4fd57c6c53a5f22a138e3999ba3950b425514acf03e0a0e78a2b12a455747684ba9e025cc804317f3d9c3c9a3d74fcf720d6dc1a8182016838c186986ff75485b7eae6ba297bc7ddb729f828bdd2c5eab5a2ed5ebb762f3b7022c1467260779654ee91f23b186114e43a47081c12ff57e979943940e59bfc3ffba05e7b56a8bb5be5af893f1492f2eaa86dd815b03b373b5048f38f610f61ae48b1a02b094ebdeb9451a58166e451c749ea83ba55a47031ee2428f8d536515e7b8db3d6d14bed51f4e8e113c2d58b55f3e7d1952ee1e0a0d8bda7dcad13f741ee9a107237cecde77585564d62ed6232c186e7099cf12082ce625731f6577a7c803c70eadf37e4afa9e48ffe3165170eb7020a94bbfd87063407fc31b520b72ae154846ca9a19b43e2ca8fd37e41c6cbb59c386a4f0895cce5ab8c487a6dac220a49a80de153db061614813d5747aa152f646e3ff3621eec385c941265ef7c3cbb3eb2c5519b9685bb12577e4421d6c4c460b463f794d725177b8958e60096ad33fc378fbb64c98d1aef639b9f90a6d5fce70959adb15f23c8daffbed7140534aff784f4e68cfe92914ab2fefe40a37fde503846893ffae4eb80c5a6a03096478961ba341974f83175e4a5f6724351bfb9c3fd2df59c2c7a8e192a20080f2df14cf88a7aba66ed344d6bb38fbec85c38104f6dd9bda48ba67b26f2f1a018ca97612e6a87bd6b919f29e4fb7344998045aef2047ba169b65f9033a7479d9800c58cc1a0061a617e9f4c42316f6c6399d81ad18183c09996a0155d0eb6a5e4546f53d41a7e12c51777439870d442396edd0208a0695cf3d0429d048cdad0eb3ae80aa0e3e56ec5ced00ae7445a4eb822ad1919324346f188e932a51bc9a933214b5138a570028d3ef221ce2c4ca05d3da2cabf2d83b9f06bd11a45beaea6ef158d4a3705409d22fc9b22c2c4e5000710b4ab15529b4c99f06520e8e9ac916c0a9b262d0d2c8d5f18139604a015fea214be20d8591412d343c63478a0969d859d2eed89b14733a1106700a3b14c0d7194f0e4c8958a72400f7ca3074048dc2dabd4e3004a4740456ecc684bcd884c5404338078304fce2f0d54307c1d178ef4ec46a2defa45be09df82fdecbaa6ec4b473eddad6ae30806e2398b4bb346cfd7445e6bc5a8437c3ccd7a331c01232c0716700fd060de01eca2dcc4b08b4b897b42b0e0cd977da3ec9b17d4daf2ec09d329220f03e78761c090e054ccbe8a3527167ce07eae8b2ddcfa944feb3a50aa8c91740228487e1307fa93f410c78e771cd0b4104d7a0ed907b2c3ec27384ebeb84ac84d291881f3d6610a127c3d2a60db2280631cafc7dc66133d904238033326066afe653b04f72467fd42d564198734e95d658a547cc700429b2af2ece3b2aea20b6cc7e184b9c43b9bc3047c39f53d0dd5ded8e2031a6f8480692c2c8f9709f5593863d3328cbb061c29298e348f42a2f4f9abe4ad398fe83b75afcaea8b8bb40837c5ee3d55cf4fd9a66f1aa94f99b81220cf91d48f4097459fab1749bd157099b700d1da625c90f20f76547ee88095a03d9a2e5e1099ec9dc62b14bc79d00867bb6d52c06f4e20bb7ae00590086a9c8cfd28f284d43910340b805039f3766eb140400341a79d54a0dd44a26e2c6686c54315d525544a94921c30584f90b4398ed9b75cee337d421d255afe3fe21aed90f0493c59c990e0b12d5916a347db1dc4ab7a513980270a7247787c8457f286a27389b5fffd1c4d46a4c168a8745ff9028de277a29975ebf695ad00d113b856fba12c3eba8a1e0ea6ebd9dedeb0e92236bf4dffdccf3f13b4683c03ef2351d0cc84ce0bb7a2ba448675956ee0c7d4b3706ce2776311393ab751c6894d1170a88828426592adec2245fa87480860458b97445ae2d6219406abdc93585687cc20e0974d4e8fd758b1357165cd666ee6f6cb6e9c8663b3734d4c51315416f34ab675c13d03f841b8c3cc0f55705883a371b13cb9e5e0b1a8f485f3e82ec81462058cb1fc5a3e3d472a9e90d3af8f5374edaa84c989f397c89547cbbcc6324b982e25714a2cb5e731aaaea80b2ff1cc034f425099831e960ce6ddbdf999195a7bf65d68d1fadae1d633ee077e9916ad023c2ddfa8d33a939f8e39203f2759b46145f94591f1abe79c6315ab46255cb9c168301e166f82e9a32d8f1892ce8e8821765eab1ae93d9f13f3f29098f01897a242abde295b605bce4e54f629d8fc2d1aabd7d0518ff27764c24285d1cb778b35fd913e8406ada62df3755b06d261394da951384824ae62a4a848a3428f4fd89644144e1fc48df3bc57e4c5f84e06457ecf281b4ef99129105b4872d824916c7e5d8aac46c9b798134997de93cfc07ebade243c8288a893e79bf85081c41a73f1e1275e23c58fe8e6314fe7d0fdbf1e8500f0b4947f494000b626e4ebbe88d21feb175164998ac7173dedb585dcad9ee17d9a3eccd1232062b685f313dd25a64644d023d9700fda9c262f9128b41dc238584e20efb25ac668afc6efa820808c7d01dd9e954024ef9f0e0ddc99b70b12ee1e11f8f6715670af12535e850a5d31ab30d743bd63a1177abdb3325e96c768e5c1b997655907659bc30da5804eb3212ce4eaf9fe92d094714da0e8f082e66351bbad5d3cf151ef78585c1df22b88f43306b7b3866cac302d1e12e539921bbc6657e0cc72aec9834b0e2f25be701a25290011109644d3aa27d709198920312a148133355aa94f168b2da62e29d20dbe5a61c240200ad38aac9ca6061f8569c9f9981c818cfd78e0148e50ad26a548a89064302c6456ecc38a9a389629d3353234ec9ba053816d04830353814a2ff2ba201f2bf83e047cfd9080c882debcc45319135af7411db1009838e42c32726b2fda4f43e4294025e2a0ab08d1eea47422cdc1bb661975427f2f88605d733a651c522441f252ed98bc86c85a2328cdaa57728b297a352d167384981eccd8714dd7560d99755537cbd0da7cebe9c87489549e508963767ec6a916b134247b781701d7589e7fef40b46c7088db2296fcdaac8f512409625d15aa647b43ca901f4674e2ff00bb7a7a3b4f8f472479e6125c92d466d2cecb82fb4c01e3467b9da4d2b37f1a0b3c706714af7dd1b728e852d4dd87560153bb233bd68d1ab5cf8491fc55778f053fae174c24a0108542b67145dd04c593705ee9bb08c80e4f5cccbcc96529f0678607a070f338573031240eb11909479a64cf2c650e4c785c1a9ba7381cea43bad24ae50b7a01f6796a4f5c1bf43e4709b2cdfe11f998510dc633cfa27e7c1ea190337988919670df2938853b5763aaf6bc4ee0dfa7cc3a587633106355775f0067ab0de53a5448342510fc3d5395868d254d7594c2a81862d35f608b3f737bb8690ea37e31812358a6b0913d9d8334570312d3d2ea7b50623a006fce1aca2f12165b60de51fa9d8c872c3bebd0363a1e38cf018c4ae50daa061b5fc13923f108a337b77404cccaa8aa1e6d6ea409c6797391c776d0061b22fac1d901bf95934bf4207d9c3f0359ad6af33568acc6a3d635ef9a50f7ab124c0a2d1388af54ab6f8500469935d2508dce7c30c6c57394590bb6e36643e4e6d67e48fd5184b41788ad1a29d9c04bc093aa060a745f820019dc4154984f6945f93bbf500308d060ef3ae102e814c37308d26f10983295f38dd639ace3ca37ee924e2c2387938fb29bbe040ac734e30caf53097b46dc894e9d59910cfa1cf442e956ba1fdaabc0bfbacc5afe7ea67a0db5cf78e26c6b9a88562663a10440cb68d07b4e3fe1883b889565966a13c96e45fd5400ec407336c977f7f53a4cf74eb1d4987cec92d28ddc28e9a196640af4d8d8d585f79dcec7d05e2c9013fbdb3ffc6bf380e4fbac74fe5ceb11d7746348fcf3f085c08426a99bf0f0681bb47725b8c96294a3c017e2b3e06ae27d4f3cdd18c3e5814ce71ac2b21af000b45ca616aec4ad719b90fdf8a7e0834efe9f0f79bd17d8e80f9670043cb896ef07b34d6241e2be12f3bcfc1e648ee44e30cd1b9fbe4164a57b6a1ecc712e74ef12141c785d8f0c132006b77be1d64df52da35df8368c08368d275296e73229bb08bce24c699a381966f8bdf70c378f254df7dfcd0b42682f868f164b0688b8a7d8b7cb485bf02b4067024d15bbcc985e4822e4091a5346ca7aafa91ddac4479e1ec4059c71532025f4e5d6be8af1e4e41bbe9405013dd9178ca6869a3e0787c706830fd541416c8c6bc8725c93472ab7806d0e9b9cbb17a8c290043ddd35fb1128dcfc067d8af67ee0307484a456330a12bc3bd85760e81479282f3c14bc38c6cc61048f7bc1b9a097574243358640fa381619367e3c142323a74872ee5c1c0d777c7f758b59275997f1d4ff0bf007d3c1c1a1829a7d219e33876c52a9af966e8ac7a47e64a095ed2a4f1ec8c948cf046201a96bcf1f5b24a5465f4804d9485b11e15102979e67b358d7f52f31e665e110611b14778de21c739bbd57333e17684553d88000ee1cb63a6ca1f4ff6ba71321e86efc936ecc8575a2fe86e2a6991c35b7ac8733623584ed850a9ed439d963288aee03b845a5b888770cec2c0e1dab03660393f6d4bc4508659ada9351c519158600f1481b1577575dc73871b4471613d86a67fd991f05ab9dac4e9ed0ca28de2f65c44cb3dae4df7f3d3c83b9ca5d5660c412e08687ea5e59f0f6e8c9f8bca48dff612465a2280f8e0b8712004f64c0c2ce37b092a637b88445229869ebdde0ec7d3003899e3415524b90e96d050b63f690a55b8f48b0fe852a7455801951a1de2c606914f8332118cc4fd31471b36f6e51dd66a57873da2faa574894fba6f162bf0cd4e0a772a7ee80957e3cc160fd1ef2753f58f409404b5521e683a5ebe8d1c7df608099c834d990bb2354029d652a15f9f97ecd709abc442150c36ec3c332e1e47457cf7c65738d4841326bda35974c6d53375ea46f6c18f3e60fc38c81aee3b859bacc1a880b0252b7542f26921cd5448465ef27a8000706c3c0f41f35186c6416ca22dcb5305ab2894f99c8c1f52097491a7378edda02559725863f4b26cc9c8235a491d3b431de398c43768eae2c9183bcfd79e8a9f8fcd781f6840ba2874b0efd000992e8e8b6e8bfc9e62ca98af07940ede2732cc0cc9ac5763ecda19268ec5ded06dc4f83ffd30fc050b9b462f802f5f3a4686f608f8be4e69b5e3d7aab235c2ef390dea1502f780aae573c47ddf13658febba5c4cc61f576f3d95fe70a5228de7e31d416e7f38d594d7839e656c941c014dee6a34ab0b523fb78454bf333ece45ae9014529f8dad254b0908457267ceb3b88c6b4640eeec8c583d6f0665b892a42bc70069dc386bce2d303c81aebb50f0a6304ab5f4809170fd39a16591f189aca31ea5962b4500f8c631ed8c91e19b8a0e83444ad695d80e70200eec071274c0420c46ab1ea80aa6048e8081f2fb72d59881c81da4581944501c400f7802ecf9e4ef8871fa3a39f9def4d9d0a811be514deb0b8fa5127ad83f79a474db54d8f8cf67485547fe20a08dbe9b8c0395e84d48eb7b2ea888e21a15af4e782769fbdc8b001d3ac99394f6f75c06d0d788bc09b422bad73569321d8796e899a2ed712f136875892f1adaa2bb2eea94acc7a142f642a5b54d10b7f60f190735d18346ebf7e28587415b4b7842d3868998b6ee479f4b6d4e1f3c985cff0a2efd923946f36674c8fdbe7d2f36dee96a437c42de15a0ac48016643812ca82ebac2bf4a918584eedc6b6d2b0e0f82db5bdc64637c60b5e9334714dff1f0d8e1667e862565eb8dc62a4a8d3e83a69ade2b6de30489546d20fb137442c7ad1365226b892aa84d0ef4702676e4d67b9183bfccfdde0c2089a7168d889f3f8d35543b04c604b0763ea2a26ac3603e1003343c55abc14ccd2a4a552843061c654b891ae014ed4519ac606efc6a24b773afc0ec05bac4f26567bf0d09e7b318aa06d945c848fcd159c92e6ce346b1b8b58cb10510873dbd2f8bb1c6d1b788bf0d54bfb4c148ec1ee026a84f82a281be1ce4e49a464cc5754aa75b1a245ce5c4f375b3ebe96c49ac1d2fbb35196adbb4a85a5a0c45abe2dc8322f3b2ab4c33d10952ddf1d1b6856d26508c62f239ac8f4117788157c64e117f956f630485e9592ba786a86bcd932f206d390b5ba2fd287b7c1b08ef876554a8d91a75bf4cfe251506b8a9a7567735b9f01ba903aadf424d5e0489cb5642ba52cc1c34e418d2ecb53610cf1a2068eaa5fdad5efb4293bd0152c258ec7b83f4bdaaf2f86037d598563be9b710bc3389911ae628166f5df04e43ed8326d236dbffc6d3b2fdcf256bb789d305479e6c165c14233dfb1914ac8b2124fe0f86bb627016afd87115a70125a7735cf50344fd8330699c5c31a52bdfcd0f521026f59cb7c5f85e889eedb7788c5337a9ab075e9324304cfab8d7b8d0d4c15e7035fe1378c69d3789d3641bdda4c4e0d05ef5f949101b6de12e068d12fc567e5af98fc95af452bf4ebe164f96a0dd1f07bafb2a56f4c6a186a4ebcfb0e37f703fca5a1c3e6676eee9c6e802a7852779701db37021dae3615b524d1b915f6c5617127fc5cc30970207ed145978aff565d7d5a2b90000cdefa8f9710f0b986160029fb46cb58701907af8ed126d3ff3d68897946dca61d8a419ee276eaf2e324993706677c72a0f1f8391f10e47e13b99c312491818641c042870645c74d62bd0dafb2005de035dc8d232556063cd438281c2cf0a743f1bdfad27af9108a80b3a97865b24015559f2ec0c32ec4ea494838c2196585c81f837785d8910ea12414c243ec5bcbb81e48f79a98572e9028200b2dbc8b2a83ad7a8c5544524fa7759ce87d073d4a6e2c9cc7d5c1d85e7641f4dca9eaafd5a8c1f1eebe3ba1226db01416bdfb4346d82a4455a0de642236352fcd5585ddd887c507217fafbf4ae896878cc2b8aedf523bcbe92f991a126d25191d79cbe54177251a121e0452d34c209b54d693d4a5224ec1f2e29ebd01badd1ad0e410ebb1f722d7948ca2d0008c07148e7e163f75cdbc611b236d93dd7f4aa30853e269f079865f410868ae0ab6b943ceee4ad043222f06a46055507adf098376d178ddc8504be65e5f2a04d5d104c4a4d0e844b36fcbe38057ec992a393e591054ca048db9a8f3b28f0c2c57e48a10b0cc5116298873df9597198e9435dac00a4e2fefb3041be4de6e083222a036f258b65f0ded28dbbd945feaf70629e2f54338d2792073433972cb129bac7b8403562853a34ce26896807dce55098cb54ad34079761279533ba0a6792d72b72ad36308372b37b7f8f38d59ccd347cd1e7b0f4f506b9869df8a3da59222c0a22c30f333f92bfde7c9c51d11bc456e93d8822b316535612a1a4b1b946e3663fdb756a949fffb32a6bc963127d60ea10407b60c767ff53d16fc9440ed617d86d485c6758182845c6339a8d335cbcba690fd2076cf5253f21b44233db1435dac04918c005fe01399773a039612ac92ff6e6d34b385ddbd1d4a11616e02d2629a41d9dfc30ada6ee33b5f24304432eeb1068fd078773c9a25366e11ae322b73c315ff738fdfa3f30f43c3d5b8e7a429d150a4e122a6ab41e7d02c0a01150b3594e0661bc525fbabf524aa46682b34509132ceb4e443f42e54e48b7560acb5eedb9bc8a0de121409e6d5576571619a37634bf4d2b57f9754fe20bd001a312bec456271f71e6845267b24491686e513e135ebc5811a00bc993868c5526def38e06e4cab9efffc25e3cfafedee6f28c9144ae0c42b9af0c77388e594531a1d818f5c686e68879932e7d3b9432dc23bd81752a46018419ac339501b80b9e8108c0f9dede6d446a579dfc31287b724fbeab5846c91aba2645614c29a03fc356d4a1083563228be6e01e714ab90927691939578ca850df1a87fcefaf3a4cb810de1183feb7e759f0e5d7816d421caa1e0761dc33a1ffc3dc06830188aa7103b844ff9aad146a15dd5148872016fdd7cf70e0e928403e64248a7dbfd4a2e3ea36dd9d5ae050c3ffdc74105574a708ac91295655e91890a522763d2c3cd010405429d7390164ba39e683a36f8b0096347bff7d37c612fbaf768d00a20a7ce6b1c5edd3319438c57fc0dedfd663093cbe2192fcfa576744ed94f22999ae69aba6aed08fb04299bdc97a4c0b882a343e77efcf9f2d5440a7e1327f8560180651557451ef85da9a0d8ad724a3e73e73dae3a0f823f151a4ba473bc77841b6f7c74161762d692188c077dc2d5002edfda700278dbd3c6ab818c48df6ef7f28265214a1ff71943078c81689167ef1db28e688ba76f9b3d81e278a72ec85e3a275eba9fa4ace3337d1a6bad4fe6ddcd61b4c87ec3f4ea14e6108185d52b1e19a144c2747b9f478ff138799a36ad6c54276c395e5c851d5b08051634708ff2b9aa4c95b603c87fbfb2fe9f1bff2842e159a8ecdb8d4bd619382659939d5f9a25985175667f04f30e02cb26dcdff6aa3bc6a7b7fe2c3219b51f612bae0d2dcbe1461d8d64304aae45c257943d8514769e9b564295f79bc2e0d55f9ed97c728eac2d87a341a805135c861e9fed26fb28ade1b74ff0102409efff0652ecb7aac98f3528bf26ad0a504a39a4cf8bb6f104f22b42ea51e75858574575f4f7a851197e0435e0ae470c337a44ea7680bb1ad4d1adc62d5508bb4e6d495d0e5402d8c670668ad296bd66842591c3b2111daf7440c79bd52f177375eedd2719f0743cb8a43b4ac2870b28c8d6d202c69c0e0e95cdc97b74855294377da4a40201832eac25cf55c956cc5fdb3e9f47db6a2b5009e3a765c9d48749059cded992f195c0e2cbd29482ccdaf28cbd60a803c81ee6e033e1f820b70eaae768db7014821b7de48e7a8c68c5ed31d4a1b54045bcbf4ddb380a87b7a3a348e7a39743d9d14528e99c69e579a2e8b840dfd545b2879213ddde6b99a65c3a2f9acad3d1a9ff20cb9506b65e8369778243860524b272354036c0782916f36a6a0688433fa9d4a3ef865210caca7083f735bd922b5ac7b936c67dcf440f1211407ad8acbb2a7f5e6ae718adbc5eaf8461cca69a8a180e816989d06e18679b0075b4c72c1d5f03a5afd0886caa71246e44163651944767dc32dc33aa2a336f63521b72de2209bda136a63e6feaf41b604db570200801bd3d54b5eee518f8d5b5844d8172d13423f90cfb3cdbe6b994499491e24a66d639bb1dbb8ebc2cd10773e709f4046a666369b8db727321dfd40160f4d8e205513d5e4ad5ad77fbe012cbeee28ef0b2dacc88ce1746b7d301f4b263b19c7491d7bfe0561f164d1f2bbfa5b245d0cd44f1cbfa0ee887c3af60929c2d127c41a6ef95a4ba6c65c1ebbdd6cfdfbeda0d696b9c2c62a5257af0332b720037534cb3cbc4b905a0e51ae2235eab4f291908f3e634af54168dbb419b1dab4e69f2afb21f9a7439a4abad39aaf4932955425020d6b453fcc1f571f7a8a0372a46674e2a170f677e8ee265a4b9d92e355215b2747f8292a9a5b3571dd7f0a813317966fcc07c94d92db5c0ac1e8fce19621e8b8612a6a954b02396d29f939b97af576a5cef492b049613e77a75a321514ac6165f371860dbc9df07db4710099458620be6e03e7c59ceb9af15ce7a10f275ea1cec8f1f2512cf2a3c1e1d0b4c207cd2a67cad056347083b7142a3501b458e7c734cb0f8b4386e9a898d61481ba19b8ec48d275f3fba5d36c5f74e4c2383905e68b7e8ba939d9bbfebc0dcfa25380044241b631b75ab93462d1b2530eb638ece89c98401c2d85b9cb731f57a33b6a7a1a855e8e327089f1d9217efa7d93e65f578ec314b84a1b5224446186ea8fd6f3f54e0ea861529e9a6a34f57d45e2b12f41f4fda027297e2266453f68bbac698578f625ab4972c16cd5a64c6628f1c04492529d06356133cec2cec294ea280d1ab1d915cd5076595c657326d837208c80005c8283043f4bbe1b044ffdd2b667530e8a8680d02f4283222897083fade6a0c3b482c1d5034d6914109cb5a38cee4fe667035bae8183c3f03e8193de6c680b4bd69b192b3a4cf2ce7adb795b844614615b3de8fe183ea5a315c488214c1a26caec0933eac5df88215d91fa8c80ad12038c4b840c31c0aa8879b99f61f666888e3bae8a44f98b0980c372a6dd5de7a0801877beb88dfcdaa217d08b55bded7a0d07cc1af2b5cfd2deea1adc6d6601292ae621fb459c16c6a973b8dbca95a7ba5f1b09954e46ba6922031ca5c23f54dd5cdadbf1ba5fcb83959198f98bd6d4308b4ad60206a5bded95dfc2c2254bba8db5ca56364b9f53db5ed7aad63634e8bb7e96757a66edae90a4c4206641fcaba53b2e1342e86a216028198ee7cb0f8a6dba76aad0778ae01ca311810ecd4c4637da69df5ba9d88d23208bca5fe0a488be829c70ef0dca72a18dd4f2b1ec9c427029f54e637ccb96f2030e08cc73273417358f7c18a7a2213c38ba88f37718a75311fd08246ef9a9d2d1ca264386b95651fe2b320fd56a1d50ca72a46926ec50361388b8f554db091c07ddc1b3fd11fccd1b30740b53541284acdb8c6b35855449f7ebbeea82e6bfa5082dde7e28f801c2846927199fe811fc1b7538bf196f5e0a2a9a6141c77c3df27b7ea0ca4f9915b51f83aeda6dd53fbda98440130ff9885da26eae3dd5a6486bb7c4494e7fcdd80021132b1754020d63264b9306da6fea4f8f054719d1fd9de794af72e8827a66a2d986e814a9166cbddc979dc11d19d289b39df19e416ca009543b289ea907a072e784cc144195721392df94978e66ee98ec9a622de1c89ac789c9d1b22a595baafcc39d1fdf8ae236f0168c3a03c0aec518e7946fc844c14ae9b59cc702b7f0ae43b5cfb15c938a1f9d07b56f39762f52834a2d17b2443bec079388f88b2822a240059e1b2660dac32c038257efff4160c95bd1c9894f81f9d2f18e24e53e2003eb035db8212980de51188aaa624fd3b3027ed29514e11aa6b0d458e4a28937ad8d87265b8e42c90d2ba89b7f264f670aae7c122af451ab8719fcb427eaf18165869df02e3366671465ce9f62e89b8b284c6287cae671806a2603a1e9dc0d47058326f10feba79554ddd431f2bc59adbf59a9d44b741412eb46804592088b9011fbbf1e0b21a74f644ef18f63069d55989e0a59d54e282ab5873d0a2928f94372051aae21f2a2e09b8bf7586c5f7343bbe4cc66fe3e93a8a7e585309f94606ec8a4fea99138858f2aa026091c119811544ea1b8478edc31dd05f55d85a2d54a00f24edc07063c357538f75f6d0e51678a79efa8bba1a2d3fb0bae2a31e254c693291bc43d83f9968c45a825ea79164d37d2e2210753c6444310a5a3aca8479da8ba5a270e1399315aa74a7c0bef35158b438ac504267e744d9fa2b2d0640f2d60b5087d5a85d86addb3e8e052266c38383151e08b01dc38a9ac16a35303a513813413b2cc48a48e9976b4c04bcdc3f7bd2e51e123b3b2a804ef5e9544d38dd608d14a6bc84697e5b5418fadb96714bb5c81fd89076afda50653aec5f9d1594c19162635bef5aac9ffd48bfcd0797629f3c35333bef1eb364823c68f8e41e7be5dc2448533d31f79b0be035bde8c62928ea2509c8c9345ac73f2e4b013917945a5bfa6548bdb92547fbe146b091129a40b5ed01fb5da574d4bd8bf1d924f1a628e9602503a6a515ee46fe7a8fdada580b5c80a01c179f1d9d852447f727f2ea67380505201d734d398b48c6d850c1448146dd85e58275e8288f1e2aa9368e8c518b96883fa15cbe84487a20a876d7363418b16cb1410be5a3b22a74c707a51ea232df922779593277ab5ac5ef5b133a2a07de7e4fff55ddf0d776b252ee059803b358083c04b2109879c5c80e0418b6881af6a9895288a4c89c3fcfeb1c047931ef734e8ef88347dac5c6c481c63a47402e438bdd5205bb369eda724a385e5ff1490b457758a1e13cb7ea5767cd059ae25e5ad16859f990f16a158729d087c699cc824d4e8a77dd4b9dabcc7376bd07e69f772fe53e9bcaef809261b450a028c21d5287d9c49ef15adb0b32ae5084201eecfb792c1b28a3e629e213f5f3d8b7887046fb50ba9d8c8df8d6ce5162e53c7dafa787fccb65b8eb13a85f7b89447d778d3494d823d47da5c382d3ee6d68f20596412f39a87ce2d0c63d36a5b78ce8441d6d1a8bcd2fca6cda4a2f96f31a15b3f5583ca107cabc24395bcacaa204156b606e27899ec06ae41c5efe4a96a7d0c8b85041f32f05d89dbdc46ede60d5b63e61162570ef47107c4f50766b3c998e0f726d76dd981fbfae82e73ab351da8ceb9f0af8d58ba5a0464d713ada2d5554b0c8836144b7304aee8617399bdbffcd8966cabc0311f1cc4c673cf3aa99a4e50ae0ea81e07944fdde3704f1ed8402c1d9d8383596ec40a54b65ab7eac3ea6d79f221b73fa9984d2a365e30b03f1700df992f7f49a45db758eddb0b662218fea29e719c6ddcf40f448340a1294461e5069954db14a22fc37021d8313524e6cfdf135a9867222177bdf425bc13c3e2b235cb6eb47f75a61ad3c01ee4c460b5c3055b4d69b7068882b5de74f047fddb2ed7823aa7ef1e81e743da8fa63893dcaf424306ba73c58c51d0105badc78a7ba258fc8e38b5ec4913fda7ad475aad65d5f076f29f5558594c25176364123c95dd2b076895d7c544d442738b9360ec0e62976b43977eb7035ae622fb2f7c51898e6fc45ecf90072d325d8ee04c6ad753308e40dcda0ee0c383c434a1aa799d260c8a198f4e77c06621b26d324a1d94a66a695ef7c5d9f3896c2e67b9946e34b93dec9fc5d94fe81452d9752da4b825a03819a932f528b9b573af003a709307d7a821dad5bb300259821609dd624d937c46f5b208334b70162a6cdc7dafbed66469c554082d1e599ac883def0c0d9146640c021fc15d520d920238fec7dfca62eec61a0686fb6d25645db22fe28f9ec3bfa344cd4bcfc19790a34c59f5fad2eb293bc6529a4381a6db1c611cf3dbdb6269fc0b212e6ef6b98f71c7c87316a77c0e5c982a679d57a1abbabf3c68c6db07c3711ecf86c6be2dfbd3a3932265a95847e368b6d68b2f25306e87eb98290335f09894d941281d76dbb787645a16d9b819ead4af2a321f756e3890b9aabf15269001934d5f13e4c46e622641cac5951bfade26cf3c1919e46cd13bbf4f286c54b8cd8760cfe09f8641f89105616e6610ad0c76313179552583b4c4ec945852fb61b1e006eefd61c173e7e79f4beff35e94f5a0f52681b165111b98844daa71ef4e1895c5d630935e0cd29d06d13462897c043411f1ee5f84bd995436c00b71e14b7b0e4d7891624e598770f6d081872d74f06ada3e913ab848b2c15a418fd1de1cf11e70c806c492a6748dde02a1c2521c30927ef9c4cb8f87f3b9fa73007d754b9a3b8214d4ccaa662855ecae6bab85b00a3de7a19ea14430e5c7510207a4d82b5452add59ad308041257fe230c25ef03c0e72be83853f76518ab56226c4ff6990031d3ad2282e990443f5fd1a61d2e31ff309c4048d69197a26084fc955ba6621c50ae79411f48f425c95d03fb4ca41f20b388cd2c40fa5b3b732f7c6841cfc6de8b9f25268a5dd8315185a294f9480b69b47aad0c30aa8f6f5e10553f0ccc0a7f8b7417ba728d5f6e0ca7c6cabdd405a8441c7eb1e919f35e629094cead144de376c79a46e33c3b43ff6f2e2cbcc8839e8b40d6436e82206a1b032cd894cbec500064ecad0e62d3bad936078beb4e7bb6584e62d3db9c5c5266c1ca08395e045475084bc9e65eeccb54ebf4d4882fc38bb0a067913c6bd256e1f6d194144ebe24188e32f2488cdce78eecb28c03e9a64ca2d1dda72d3a01315a3584a35b9260591980b945e4db3bfadb54ab3c3d092c23721ca5d1b40d5d59312434804998a52970f9e92f9503a0c32d48cd13241a4091571f59b79620d36e068aa69f614d3ab61f5484a9cd0bfb48ba7717180ea32589e19288e49d9ee73e252ea9498676c3c70c5909b86c2042a621322b29aea416cc81ba5f387b0414b621ad03a071b2f15838dadfe5f63a660438c60236922a10173b838b069fb6cb87efc7b5fb371217d0d45418284b296b90f696e4e0302138d4895c8f8f0c6343a5612828b99ab9672dde0c3114cb5262667a364bd216bc45c5091aab1caf9f6121553185d61a3129552ceb4458c7302c986d9a0ce480a896e87a08e43b4ac56a432c283b80ffd12c729e8573cd2f86111db0429c551b01d65aa15c71c228cd9f0c457b5615781c8864eb477167279efb19570278d1c9547c49b963f4861a02922ac1c9f16ffe3711d8b14ca3041d9d640f939eb1e8a76da23a74278cf6544564d0478ee72ff4914ff5b409060ac522be06c0faadc53254e42175505fb1fe3a73d39ea70596dc899bafa6d105b1a49146d2d6cad0752e4575d1919d008e0e42aa1c964dd504fafed3f1e8688557e3a8fcb64319fd410ff110e0115c6d317049c42143ecbc0fd9282a8de23e3e66941e49ee8c3091e3a08078f1aa9815ba55ff15e738c9d430cf091e4b5ff808df73c140f306a94840040e518702adcc3dd661e8a70037a288240624ed1c4f350f45abe6989c3507e4ed1c36804263f336a907e471cdcaa96e1a5fa9f562cc26e36cf8e722c798a4ac2ac7c7ff22480594546226db280d407a4a2b56be0cfa88c5d51500bb462bea89abe349ab2526200e5decab61cf35f3d8b03a2a5953e741d940eb7579cdb1f38b59a42c8c3dab08b297a762c72693f0e0e01054beffc1e4e0288da45d066cdc44ccddc394c2835b3b9b62b01b21166e97944b42c6f0ac5f717a15b4795d16bcf60f65bbf18a4244eb2612dfc0709f95d63055cac502f9ae8155474134f5be0d3f2031e4169aff4a6baa167b79d4ba1b02f635aa06aa1c8cc21b644c9c4d2dd4718f6d23ce2b36adae3e7ee09e2453de051960bd8e9ba268e8afc4d2fc572229c21ccce03a1711089f6444104fce197789891f757a66a915eeae3966a6137b8121a1722d513a95894b40e684613ec8c1bdddc59866c814450224f80725a3ca0312a52fa6dd10d9a75559c250f95df03f4a345f5935d731a3ba4aa79cba08dd2301f23c421628c3cb7d0a0331e4f729085ca1076927ffca469d03a120310965b03b7e5b84e724e6621782af84b7b39e993b2887a123644d7fb15386000347783948da7131fa9e86d688eacfcf297d56f2dc5914dd5f020f544c99bcbed735e2fd1271a22fbd4c06d1019027234ac6f6ffe6754d4aa50b4765449e4061e8a42d02180a245da5e2f27cd0f0b4416949fdc8535981770a1fc6821404e75caa2c862b76ef53d3d0355f9d237727d4d34e6a0cb7e50274f54ddea1f77709d9aa9e1b743395e819541584a6cac2a2de8e49869f0dcd0fd2aa511d8af13d1861b87f895cd13612a904fe5bab3ec753308608d5d5572e48fec40295252a5c8b0612847415c91999eb59bbd5efd5281b7c663ed7eb6d4699977d77a8f397f4efa38925c6ad4d934342c14d134638776ce0438afd04ec98cc0aadff8a472bd0eff1313f70e1bea064c3532759a03c836119b8017c346a8f58dbe9ff7c542385f0ed72a5c70d9990dae5128f80bf7001854162fa9c9ed20876d9e5d8f683826c35aeda6598cecbfce1b71a179ad8213976dc2cd7eac9ad29aae629a9177873be5c68a1d0d708d3d77434d69af27f7ca34431fbff913b206324c85be055a78aec45f7314027904a436d345c47751707010464161520b25a4dee0c16396606bb949db59ea8aab9e46a331b007b51b9500abc7e64c7871cccb835b11914c4e6b6418e8387c90ddda320202b927b6bea5d64b5531d41fe532d93e2cce4fb541603b6c4e61f1b14ff364a166936894aed439a1ba5acdd699ab42158d3d95c2c13f73077f221f7c8d426c89aa26b54b0ad3d4bc9458aec34c84baf93a8bb89d5d82386baeb5aff678181e405132189c6c3b8bced0d6a847e1e1ae79a471fe5af301a3aa000ce87143d74888c5a25ce362b044d3fd2375eac9377837e0ef58dd4f060abac98a0f601db8b6513fa9fb99eb060accf2943ecbb3a2a86a57b08dc655caccbdcbc6db4d533329469fd008dc0db8c4c6fb3445728f289aa087f5421777a979b5af51e3b1981a18f985c0549a57e70f3c6a648cf586b405a09883605a1e88663552262d6b2d85b0c6923f1a6f0a5666ab24538f61f4351280c9ea95cbd423e2723d8e432961cdfbe61f3727face17cfdee2d2ec092078f15977a4274e26155bca985c70beb5bf2b590f5586c98df9b05f2968e27c147ac3ae4ee71a86b109601f74c63aa70c078155125c188ac0c825d3bac144bc120ee3a610acd7c46207494cdd42bb85396daa6cc5b6c56acdc52b1efb43cc633f8f79ace71c07a0a340d6f20c35996f06803c51fd8ada81bf599930069e8ca3aa934ae60e2336b10417df31867d774311bdfc0acc9159fd0bcba71200d6501a2c2a0c33a38c13d2d933a73d834d3e67f8821e3d3a80a13afd4bc04c06480998b806a34969b004c5d3e7de9eb1c72d3b70c1c3704ce6228bf19f6027e6a3799069d3f586f1758800dc57e47d49c0e432787054cafce4689055fba8ffe5337801c0cd4536e54674a4bb4c36662c653e697b1850fcd714825cef7b372a4fd8b4e3352b32fa2b08326682e7a998ef458749dfb3f91b7687057c1d276684378bb7ce98ed683b5a813601953a56f569a098c2cb35763e09739bdde84fb113fd01c60724c52b5db4c0900e0a5220b9e4c7348fa5528217f13f7c8b876f973f65040f18752811fe4c7eff99f70bb5f89145140fb288fa4c96b144c2f6ee5bbca79e2b3edafb4d5b07e0634587c678c963e00dfc5a13022852f4d5b7781abefb49aa0425afb7c4b83495a7c0cadb83f01b86d11ef86b33c6137f24a1cf85a1088c5c32a11b4cc42bc162db49015d2c7e11564132413c3a9ffe5cf0da661a4f024de2e14497bad9b778148c00d214074de19cd86209692425484b2909491d0f3cf79373122957ae43230941c4481587ba5dcf92061fcee87d94360c6e36f8fb499baa6ff1b66d0e5e9fe57d56d35c8daa268cb8981432c1520b51a171e67aa570e95e1c36a54f94cf5eca088b44ece31d69ac56fe8d114c291e8dc830ab13b9ce6afc620c980f2843cd057ae947bdc73d4d3844f1a19dd417633a3c1bb1f08b9066dc059d5f50868535e84c0c4a53952de14be70c994704b309dfeeed912639bec5779bcfbb052ce27c284f54e4b67520ba2dee7ba3f05449135ab94c014ed40223143315670a5c9bb1e24b87f63952044dc6cfca3cbbc78b960d1d9480a526e00a510f3f9f549c6ff1a6b33861897dbb2ed12bcece90a35e7decff9087f20b22c52702f95ad3a4491b65adf808c419893c513e7e05200a4df8325340dfe2c324c018698d35040a9d3566023f49084719a716ed8331a99af7d7c8f1a2f29dc2428f1536fafdce5bf816cf16d355490763261709b2bdddc99459fd24693441818cd143345421ee145c346be54b8866de1327df0245872f77f282d7bec5c3157e3be21feeae58402b58a16cb19861fa9060d6dfecbedf067eff509011fc932d5718df90f23d6459117f328e8db5e080485c108d416c3e8df3d7fcb015f8600c24ce21b90b59c67b02fb188f38081055809c087efcc9248ea72c223f9411fe41082f03f3da2a3cbf3bd6f72d1ed9e2d5e572065cea6778c87f7acc2d974e4f953cddfa8c9ff9cae9718d88204919ba2006624ec247532b3e8630dc09eda5145249ab027fd3d509816ab2a7b20d3398925f93d6fd12928cbb880c7edd6f4df5ff5a0a2304a21517549b40b44ed01c854df02d9e6df2d77593cc38e97865ce883fbd0d148f43a0be41ea08646f01ea42bc8b63bdc18fb81b8be83376dc4d355de067458a9d0165861048cbb1a1e06aeb5bbce35da0cfa04e753554e1fbbec5cb4b5bbe45798f3513e85bfcb430a87ee4ac21283456b90d1f940bea0a6a86a8281fe3f32ca2789045140ffe62f376f22b0f5dc0b06ff12678c7f9109f31691a9b5ac2da5282145316fc81698427308df32493f15262b93ed454f8d8487b11c1bec55be8b0288dcc8c887de4fa3382d5ec919d449d6db1b1f33219900e1fcc2fe13706a23fc032de27d9310ea73daf24dda6e62d9e0573db147adcd0b520c021d6241c96a44380d9559e5586e7e66043f02a347404eda17c966aebf4a978b0eef58d863ee8996da3aff1dfdbda843ca1abf8d42d8e0b3d6b8eef63e5ee1f7f9549ffb46c53cd8ca17d159f713862dca9168f2d56bcf281fe5ca4a1b212244acc608dfd60fc2a7e934d738f9f4a3cb947bc8b87b0fe2bfe31d410798f4a555983d0bb86b039c9dfd606d7490675bfe2f153445cf8109926537d0d9b6811831650ebfa4fca3bb7cac9db1527999d5ba2f6481dd0842a2776201e18870efe0a478e582addf40b24ff02eeaa9f64881fcc675c21fb20fc585d3bb8ffa7a80f78c18f3af42116645b04df0091cd258a8d40ac6e9868a64124b5a3887ee13bd30ea938da4809c617d24a9b5d950862d60122d1739037a03f636af24cb83b9bb086f521173ae3094c7c136c4af2ef57392f73bc7f951e88f9340b028a80c5545b608cd852073400240e61f4239d5308a5a0c525f006364b9bc67f4178155a812c09847de00402f36dc1840db4e92bd0864f835fc55ff029b007ffc02f7a70ec34c28dd2c69c382ede9fb79614fe8d0b01ff0792b6a54c52eedd64078e050c052b053a9ec0801918fd86f17f14287e5dfcea52fcff1ab89955e960b1e108f9fb09263e15666d18575f89134cf081cadefb755b2d1cdfed2e45e512ca7cfc5b028beb35a4f85b8dae41dc5099bc567c309accc6cf7b8f1aeb46f7b4e84a92c6bae7bd860052992a49dadc6ace77a707a7f55ad40670756a06e3a7f97dd775defbb8347e98a992a4710c6daa2469ac5688d1a02b491ab7c92e18718ed3289b1bdd129316802f29c36867c46cd7659d756e11b3c8a6a6995906606e64ca2ca64676e006e6a8c966458e12bc37ab442c12a7caac0db1051eab348148c5e5a9fc118154c2c008c50e5a8b0c9e0cae7068e869b17a4a3a621b31b2c394f46a339255e1782c88713dddb8fec2b1039c247ad87c74b6b4902262560acb588482794e25c53d685b34c3db910725cfc60520ad2e288d170f1342145a1f521c3199906215379c482805c900bf7eb8a68e1387b50d48e15893051a50289b0a2ae68091c3060586868a6c476712cf9b6e0a202967c8203e893ef9b5004cb8183b80e88076a105872f5b800480e3d11014a67201aac354f56b1aabb3d65ac9dcf1161cb3ca833e00a9f801c2b16259dc62964547cc3e88d91031cbb2117488ddb038aeddc8f8b16c66df02bea662be9499f3a0235e7b0764e0804b9616f18ed3250b560e9ce2fac6f51779864309e3a8adcc0408a4022015504c21f4d09c21a5ecc0bac8c51cfbf460b1beb8c7c661b1d861889db21fd584c536c5d9c7ca041789b167d89b8cfb23e118212d0ce8c398d1d4561a254228af58d3cd66b5c8cb2c2aeeb1c4da11afebca8bd3e5d55bcce37489758313816a6a615828ae7068101fd8b002c98cc5324414063c3472ec6011fa800dd50f6995538cb6e60f0b96b634879ac106c65e6c61a980195ba1c200afccaa9ccc23325c92891c3e1b845117379ea652e241650a1ac4622b47111752a72965758dd5b588d775edfd19af13c469128a7c16ab0e2d6ce400b618de7448d55064a9c011c2c559f694013e5b327888ba518f8a60c29a481499e92897e0d88209aea7b8be71fdc5755fbac3d1b000c71e31aea7b8be71fd65d2395ccb42e5cdd5d855e197976427f07895aa5a187a712922b554d4ba76d1158704c8504181925494d091b3d207cb53477ada005c9ccc5739e79c59e808cde663ceb9372189d6c2a3c3bdf5c50619a09980320396a19de9d0dc5c633ab63c8600aebd08577c26be12df5aa1af376028c67e380c854082c2880045d8e06b82f161f37109a6e870afaf157c4f2a49a4269ba4134f4934193cca080388060b6c4b2fc850245fc87cbe0a3be7e12b5149703dd96225cec569122d436cc1177b34298880b20c4726c8c4609521d9e2c1c60a8ba9ada6a76a6606090312529bd452ce6827464905d416c5664580385d4ad9c41f71ba945211e181eb29ae6f5c7f4be44c82eb21710ad5c48a8d69298dad16c5b8e4d88f99732827f9c3bd9149b178326ad959c1213d3ef07bf27a6b9abd1115a94469d68b1c440ddca02b41097075d58480c2a08268284dd13441f4a5c18bacf820a9c3c4d3127d9a150f007436a5f682680603ce2787928414874b2be0521209501b6c34e82ad181ed49284799852175928a86d821a11eb3192928b3a00a7ca9a4a83292aa51801dcc98116519a26f404c1924dbb8329c31d500414e979243169253d98f88e54d8b2d1d1de1d4080c6a746cf012b6107d7c8e8c644c8db0c20003c301c2942b96bcd2922d3d2380d6387e61088239ab71aa51d2cfe69fc0533d62b470ea11d2d9c0551343f3d0b4443171b4b98806792acc1b4943500483474999c20c4a040300cf86a318693a1d867e6b4fdf01c46954cd336a588c2df0b2ba8a481f30244abe10ca72bbdaca30e2dcc679270330a0a2511950b1a8f1385c4fa15fffff936de30cf62d589546aa785dd7be5dde8338551a93e21c4c6cc1d54e9c053a961402ea4ef36a01b7aee94aa2b5deab05f28455559723580bd82038b7a3103dd7272268fb0444e46947113a2e692cfdffffeb0c57a063f7dcf22d32b419bab9871932c4f0e1c30439c3f1f831ba5ec35df003058f2ee841b324d4b974477d808a4f34401f949c27990e8a0e93b8b2d37c41b36394ba41011a26e1a0f8008d3228c42371f8babc1785e7387361e7c72984d6ec005f0971ea84648120e4cbe9dabc826886f0fd3aebd2a646393af506b355d7ebbda7e3b34563d13ddcd7ceea26c4a9135283ef817bb74930170070ad8739def493f5ebd72158c1a664a347b886d5e4483011136f54f5e3352674b5bc01b299a01bb9b667b87cbfd6dd857b0f06eadfa5e8b5a925e7bcf5b15ff3cc7b4b34b5aed2b148a2ce48ac387736e79cf392c8ca7b4b1c8f3c546452b33ae9d4e1b93fa6e4513447f02a89850547d34e5309842e2458d46af43c779b9255069f3cb5a533b9aedee9de5d8aba0c1369735d6bad993908d0b5555bbb7856ce07512c32b44814d4c192c50ea12af2f4526b0ef2babc378ab892a4225abf7e9d75ceb94371b7bb70efc15852216e527fb8fd7579ef1514c464b9c4f7678f38e79c33fcc37aea9c73cef9f971effa15f16303d73d413d8674eea9b8f3d1ed51b7e6bcc4798e029a5bcaec2960bbe6bc64f9973a72b510cd7bad92ac90db9d00d9062dae6416984ad64a48964e9c3372770d59688a4a2293e6ec3f8d3c157db0cdbabcf7a8d7ad766577941d92ad595bffa0985a6b9f49898fdf507d5a99f5c346ed5d45e4bfaaa2ab95cae4abba3f1446aca80ef9d65aa05fbfce39e79cb3ce39fb2e10b4d75e72c9e70eeca63db1a45b31c393c95c94cc7682b6339468de04901f216334ef4d0e77869dfc73323e51c8fe9aa4b4cdfa532e65b51b95f79e70b25e394a0ecc999f89230918b113520cc80f2eb3bf3445dd14c4a9938817acab5ee8395dab7aadacb909ee56e17d523cbe4bf1777633c5ffff3f32b25ddefbc669324693d7732aebc1dddb8812a33903258c3805f40504d1334c866168712ea13893ae0f0e8edd2860d0d5c40dca17732549f705388031befc7b97a20281b4b9ac4b6622e73d10d0987adb8089a87504f3d481c55a33a52dbec27c440c0185d8c93b155bd1b95a6b19c5cca5623dc68cb5d65abbbce59833176523d408e87a42d9cbbf67fdbabc7746dea564adf5fa7c4de1a3267bb018ebae4bb1eeac8ee79cf358b295d01b83c6bab34f96586bad35dc61f529ac186be24f6b8d22c3b992a41d8639f65effd8d24d602beca30053f0a1780533cbf7de9a6775bb5be77276eaddc536ac1fee9c9a4688a074315518ec4707eb045a8c30f6c9cb4189dc3442058d2b2ae2b00071ea64b5b6dbd1bb2b1cef6e736f1f7947fad9b065f97ed1db0d9c392afec2fd1de9654b2d0990373bf2df1f725bf3acb7ce35036eb40fab07eca3005380d70a2550da6a2dd95744babcd1868f26028dc4aee06a27c7fa600abeb2a009d78d192caa191a162ad088196d4702033732a2a0397668a0750584b0be707f47fa593247b70abf3e9882cfacc91eb1ef4ae6817be1fe8ef4b3e7fa4e684ef1ffffffc31a865fb8ac99b412d35139470e28c1f51207c0be0b6a044b4cd8388d02a2c5164a2858f29d8eef52d4369036d7b3d6f17d8399dbffffdff2346de79cba9bedc9dfd822fecebe032827fd623bd67d5ddecb56d4ab8b76ed2edc7bf00de34a92660e7fb49115c37bc924eb5b2bb86b32feef5be7aa0b6873c771ce7934b892a4718e795f772999f7dde3dd42e71b78e95959b1a343130b32feffffff7f1b4777f7e730ae4dd9802b499ac2b7841215c6f5748c98151882ef8e1e074d08cf1d5ecbf141188b08d4c1964c08901715140303f2321491f174a33f06369764f6053b96403ec078b048b9449ddd05399e1f49192e353a17a047db4c4e65697716d36a0c5115a04e0c26be60dc121aa984714b103913079794586215a710f182b7a3d026767126c55882f1cad02d46c7da053aded0629ef9021c505782d576b7fb9ab8effbbaafebbe7a02a18877b71092117629b9e55b687cd0d99de37c85c5cdb38321e64a9242d81cda4c6861f0e5b19bc78af3683d70b5aef1207311de5b735c4952073b27e3c50b99299b59e3e564981e3c83f05e228c4c14cbc432915d4a96c15bc15c1926079cf3cd6ee38a51c68863fc311a193d18934274ce5a8628c24706b10c65209c6baef9bfcc0ccf63b37bc34fbcc128bb17b29c2d3e4c41514445c26c4cdb551aae4274c84008aaf4b563d820f0bc23aa24a95171ffd67ac770c0b38e08462612cb44651eef8a41072d1699126e2c6947156c8f9956a94e28adf4500d477c48cb38ffffcf735ac7b0d86d9d73afcb7b8d9a2b49bad3464ef177dd54fcff2c8a1544ad63a4daf867a8738898f3be3bef2fe79cf3a2944a923277d375becf0e55493e2e467d26ba9727c40c6d76df006f8237c376054ba9c848ad2aeb0687271016ae14061972846d35a1727cd88aa10979de8bf3c481e2445dfebe896876030d8188db45b650ba3237f3cc7b7d923e523e4cf7df0e2239feffdf24c621db0ca5e3998bedcc5377b35be7c975a02eb2cd59679da1feb5dedaad1aca72ac612d7fdc187140fd8428537ad96a94264afaaac171c22b0a4588ea0e9f8656432d1facedd3e2f5f3776271bc372e1a72e86939d75cf3a0a3250f483453694a6f740115ffbf062ebcbc7500832295f8bd4954712bc7b91ee1b6c5b48659e2f18e9185075934021a9636c2d8f6c0f81f05038a6e6dce9f0f38ba4c3a2c82155bef741fbb14554d87d65a4be56e726dce681fb91bcc9dda97db7617ee3dd80653e7b6e2b914049e6e76db28e694ecbf1a870af651ff905826586a3610c164d3f920a94f3b67031bc7b0201023569fda4bff0ec36c49be0105daedafcb7b6f0437d4561181efd7b9bb70efc1d1d76e2a203821359c4058decb06d418fea56d83da6d64bb65cd5255d30749859650ce257ebd61cc3e5d39ab215ed1abae628a952aac4fba6930809209e80354b3e7ea46501104d5e5bd51277b9353b2ff35703e34c7ad41795b52ce4b6c1ec884c8194738a24f9d8c9e3955e04556d1185b880e42fc2677ac31642f582bae297ec05e78a2a8d2be8d8583a495cf56d40b975188c3b6053d38e17b1f10637f0c15049eb7abdb3a5766a8dbcc453860dfdddf912e34e60df4f2bdbe32d1bdb9047853788a79c1c9ea9649ae24ef5aa1a7c2ace5bcb89eb0d9a3d0837bb91b30c58fed7c754e1c8cfecd202f73609851893586282f52cb37311418628968feda3bb79fd5aa8a73ee75b897ec40cc9524e56c526bb9f7b7b9fd0145d520979c73ceeecb73596510f07141badefb0b4ffcf0c20a35b5b1650dca3e42f5c8eee0d8fd2baeca9da88cfb130abaef2fe898fc0a6e21be5b64cef93632e65aa7aa0bbafdaa5cde9affebf25e0d43a9dc9288ee2edc7bb05173af3a1bb3db5f97f76af81f19b6bb70efc1523ac925a7af3e139360dea5e48e6423446fb57338c3b3cd1a5ab05c7f3dc01545570d2b5627242c900c4b2b841a77a7d3ba20a409769bcbc7a5dc2e85b779bb414420996fb7c83f679d755eb9e6abd641361ff4e4a98ead79d6e966371171b7500ff775796ff0dbe7ffef74d9eec2bd071325b5dbffff5bf156942168c953114bc8ff931051bb0bf71e2cd4648d01abd62e4a4470e1de83939c87ebec1a3dc8fcc3fd9915417efd3ff270ad5dfc043dce8aae0b9b56eff6f92e39fcd8a5e4956b17c156d7d94de3e99174f139de5b16dc8d8d11ad6bbb9646528781f0fe94cad5ec27c1144d910d0551b20c2ac3a13910587cf1641945718053d1acb9d65ced1e4bb64c179d217eaab46a6b9e3fddec5e5a4952bee6a7e7598f39377365cdff233c7277e1de83cfa4feff75ce00b235cf2cd993ebf8ff3f63c6af3ce3faff7ffeff3b33abcfc4f7e49c66ff36487240a88332876c05970f1a1a9a5a04ad9c35172c9c50a8b9b56837c9a5a2cb5be3dc1f0d225f0e6d0091148303d09306ac129a0200ea8a1963072a359a19ae64f3c62e7d42ffffdfa4c3bf3162049e2d8e9998cf3926ca71a8c4e89fccd20e92c9c1777b6161881a6dfd099b794c65b2bf9861d3c58579ba6feecdfd99181dcbf9cc31a75be5cc8596e795f72ead2469deffffffff603cc9b58e72d51d1273feffffffcf3c73ce396b96c3d1fc4cfdffffff3fd9ca79d7bf52e8dcfd689afffff0488e2eabeb8307bfdd7b5389ece052bb95449edd45ce82d87cbfce19facf67ec1cb0396be099dd41e7abf1357a43bfacf82c9f1ccb7b59a03afffefd59e7bd7dc23867dd3349969824b32ee85afeaa2d529bdda5ec96f3287fed42e47002e467070a30a2242624f243eb42a7422cc7456c46058c30186d433b89a5967f2eceaf7061055b51430c960d826fee8b0c2f058d8916392f33323869f0d13716ea2b76213f9eef2d04f2d603ef6db2fcf9f3ff2ea38d3b111a5bfefcb9058c2244b4d5541569cd087d7ce8a9cc951143446e40cd34109c73ceb9d09973d790c753d73d9169e69cf316d2c8f94cef745cebdce49c73ce5a6bad13cde596f8d2669df75eeaa8b8aacb7b8dba6813e7aecb5d1354ba82593b3940180fe57babb97cebc7b97be7f95aaf6d5be836a312e79138f70de57b2f739e39be5feb48ad24691b902f891772cef9f7ef6fdbbfdc81e63c018dbdb71bec11ee727e7e046368741ed19b5c946ce6c4e6f815735243dc0a9e0ca59cdcbe82cea71ba00b881c1aa20b900dce928b4c4d4eb105470d8d544b19cdcdb105c6d03da181ba6f128c8408d27daeb7845d74c67befcedb9b657f46ac6eb33b7cbbe09c7360eebfcdcab14dfd945b8ba4f2015e2041bd8c60cf2426e7caba1a4392592ba1e6a5c5c4f3d65c7d777f47fa51e70f3b8efb1171b658818a75ccca172605bd9e7288437edff75754dc1e20e252a1538524432b3a8bff95456af15710ff15026c98ac889e30188a74ee413c177aa763634069addd13aedcaa6b9f7330364613df3ce56dde4933da6ecde594336f4407dcbeddf7dee9b88833ab6d73af63778c626ec44de6edd309a2465792a610ae5530e77f88edb84afcf77c22f6dd83ebc83d923bdd7e7349bce5bf4f62ec7697b2c5a06c003acc25f43a9fd083c764c670c67ec68cde310f7d2c09ce14b4c9d1576272f22cee9efbeba5d328d6fad52dd831f774f4e0302fb8a0c95ac630c65a24d6563ae709b66308ca68e3a77d262561c930a930e64918dbb5d64baeac58eba389eff831e164acb9268988b51a6bad27f83c269c8819df91106fdfb914216e360ca9368586fcecf62a5349d2b513afb737c50cf1cdd905f4c4451418dcfdcd263bff460b7bf2759c313ce91a76bd40b75a4e5e2c2d9956314e9cecfc714788766eaeebf2a62ab7d559e59cbb278827278a3956f82d899027ab659387ddca890919d5fddf0e807d25264e1aa495b45faeeb02600614f17d792e0c70021a08c3083378821e049848a8b46c5d298b044005004319000000001c88a2340cd4566e0e14000625e850749c6478582a8b83227120200a056110c4510cc3310843510843635c3a691d01d066223f6143ac0d72054b8c38861affea6ced44ad7f6241e66d860cd43727ed5436496409505c03388c554ec7b86dbcca4a47ef5a61f8d6bae12dd96394839ad15bc8da254239769cdea88132c6a357f47583bb4195c2a8015160215b8b8fb3fa2c18db7227058a898f176d0241f9ac051c746337aa9c86edccf4ab99e1d185ca5e403d6870228b311ab9e9adbc07c0e8443c3b337942e3788dad087940d68256a3fc6ff73085867578506b33d51eab23607dfbb05d7442937c3d46f6ed96e0810d918294b794bb5dc3fd22663b828646ff40bcd1768a04263342793c0dea6dad08d9d61979dbc2fdbe32cb7b15a9eaa93fd9f1326a00e3a22d9fa875775f9ea013bcd1ebbadfdf7303e2f26b4798ad14c8dd6695659211e5440126cc2a7426f48d7382fff7ab4270650542fa408afba40ef42624036af43afcac84483cb45ee7bc734555309aae7bac5d2de3010679d36db7388f538cd439e81c35b495da3142f99ce884df4f7c90729367a3161c1a67d8e4255025e58b0d45e39423c32ce2bfb444d6768eb10db3bf59015dd2f29cb350583219357f37217498b9eefed726664b426a8a35de64cd2971e39a4d659171aa49c973aacb921fa79096228e7e7c74357b05c339717f68f90d6075cc943db8b28d23123c8fde08cd5d7658cbda88f03edd0286cb0939fd3d0696cfc1d2f2e4779001cfec39dbadad3a5e9647851e0503c124aa1ce695b02ca490f86232f8780883b88d50c2db25eafebf7eb2f3db742e25f148cacc8e054c2fb4b3c980c0ad5199f81cff1d32277341b20ebb80ec5fc51449a5c9c49423fe8c267e2433a3c5cc8f68560f6729f645541c1a2a8ba4855b31e83be0e6432ff5c3b21e720e3b55497e750567bd99c7354253e1ad6f80e987aa62e65fa7bc01f93262b16e8e3a80cd2f78a3e5af301b5321e8e4c618de9c63c64deed08a50c3d6dc931573b3d318e37ccc80fdb01c6939c3998dd58ad6360f63f8c374a672d086e1d139e6bd9e6828885f796651f9d8828e5817d04d75e9c1583ae69e78b18830aa412b146f5df3a7c68120ee25b4a38b3b81d20e653cc539d01a8887390e2ea21a34ba3fb27c8c47097ae77e74b0f11eb9951081599fff0e61dbe2d1f6d2f2e1b6c89a56012b312c16a8594add2f942c3f568b8ee96530128a55d7a6d1c4d16674c2a1a21175d234e23b3ae4c29685f0de0933172111329711b49de48518bea31ed7860bdffd288da9b96b9a09da9d58b1d4a803d9da3502341ada287bb3ec9ff46ed033242353127077880de464c72d0e99bb58667a5b63bd44ede51d88a73a167dee15821459b0513a1c077831d7a53ab00e7f318dcd7208cc25568285029809feea95c513746f35e01e083dbf0350a81af038c6dcc515f2186c96c07d414d3b5fad4feead4c94b69c5284110867bd22340649b3c72ccc0bfee28f43514e1ae298a7247ccb7632da0ba4bafce1f4960b82e88a1f78c929129986b2bb8cffaf0c5622b1e023a530436c2b3ea970b0cc5d86e617aa391e3b729a1249563c94c404f95ae66e985076b0018e81c1ea91eddb5b4136208e7925b9a22c142ae36d136df224476e60ddb679d1a668f95c73773a4749e19ee7c3ecc4d50b7d6e1d723ee91f4039395d10349834bc09f97126275c99b8c5aa3163d6a38343ab7a62ea6c39314adb40c22ab500d02f16e8629292220f6448ac3b98e399567c62cf9edcfccdd95317838902b76460b1da7ec62e29a902c7335772801f64381a3ea2c751bee5da09f1627b06f52b25831be0c73e3663c875d424c1370642a1f8d6c0fe718487678931ce4947a82d36b789c76db5ccd07d336ff66b0c8dd1d8c66b73678d33b85f3f8182776ab199b98d9042c25798dab7680769920dc5406077f8775d75823bfd07627ff80e318212fe44dbbda55508e7c98ba62b93aa90264f16a3be7812b48bb9680682e943a7863f2cecafc8914a729251b95fba4b7d714488896521143bd7e800ebd4256eae25569ed5c0f09d26848a0d76594dadc6ede43d3bd74c3dc45c5d56278467b357024594498e939784d4d54ae7996d3d5b41b090e7b66a34485e08bb4ea9edfce6da9db2b0d0383d6f5afa3e46026b71423211b1723135a884b9c392081361d7e9c60c154d07cb0274cdc0d435ac0f18420e65907cf466269b5077c96341646c903d4a5449a205dfc852d09c4d786c14833c1e0f103d34e30de9dcbc39fe48d9b0fb7453f72cf8c00d2072a145ac2f56196368187244ee2e55ec24594ff88da48a42e2d67bf4bac02b06fbb5034422a6f677695009c866e315df705c7aa251b7b3126bacfa168992179f8e696321bb597215eed41bd580143ac173183baf83abd681b42b96415264e691f378cdaafb4f8b763e43d96e793899d8ae163ae3ac5b53d1d6d96b5ca1203c86a33900a8c8fd0f847d3a5a458f8aaca7bd3c71876a5292a277aa6686e898229e54d43828df932b42e36391a1391b47eeb4c717035501ea33d1f6f7812fad10d5ea4651e7a6e46268258c61419beb3c3e321162a8b2214bb3e2643c3e6b1f5241c1d5b50687477c74952832a7982320f5982dd076eea6650a70f4fcf17ef1b8fcd4b1c48c5daedb0008ca936c90869ca810aa6205288a50f6c37b1a119d318ade905075db2bc81c6ca723f0f9b8a2d391eb1a4a2c54382faf27813cee0e6c708c8169e4bf5cab5e5eeb8e848d579f9b5e3eb015c10a4a988037442435725baeff1ab0f1ef20e070370c51e5b36ada146cd04623866b48c686c8b5e3ed97338685bbc6090605268c1175c766fe65243643b5d6171d4910f91a7114f453cedb990fa5dd22fea1d3e77ceba766431e47572467dfe616e279da122a8039fec24cd9f241e95fa56ced469a420c3174308e66ef248d4366072b8a621970e6c5f34c9d9409c5561c5eab0107b502162b69959000f1b630fdf025597d4b233047bc1ed5cdf2a39c413bdb46447562e6937195cd62941b82a4872b8a34f84e5dcf5b2b9aab2dc81cc4751f7620e9701d51dc8e89ec418e74e274269c22e54d6450993f16dfd9b663506f4d8462fec932ef55453915132b6cfe909b044a0fbbedc085f095953e9b1eceb5573aa82ef5cf2b5c931b0925ed450922b5456e8428161df79e05a8dcfc1e62c8b027686bb826e159a30f296688324102aa369de4661123baf8f24ef51a275c07a3116e96ee8458c09f50b7a84034c5f764d623b25374de595c1d5fc2ebc751c1ce2bade73416aab12ddcf20f490e302fbb9136f56516ee755cf91c06d56367d54c18b988ec23b305c2db5f9e8b99e4ba4284da7f2238a83092a040cd3ca87bb8167601656953e5ba1db4bd06a07d7c8f7e42a5ca5c0dcf62dc8d0c0bfcc83f6220e8afadccb7adae86bc620365f59da7b30a95757458a1b057cd0b6af5accf1e298968d9524b353a3f2bfcedee2e1daf468b3932acbc992db0b5265856e7d80cc605cbe8abbc24e3b50ed976a93dd98312779ae6958e4f86d302dee0d194def8787600fc483928e462a74eba28868b866c1cb3a3803d69b980b63116f68a1a458d9b9bf8e11508bf8d5e52814f67ab4e001240b377a69175f277b5e64cdae543bc126eaa3482286cc3258b1906dd107bc39c2f678804f4ddfc1684433a6c3813fcf162024e2fa8d9b6d3cc46a018fc21f720ccc1014dc5735bc836a2406a0833c917e46027c0c8cf72c9da1caf9b721f16dc5d409f43b7d982c2573870fea5c387189fde2086b4373a9046612e81a19b3206f8e5eebcdbe742e058e5b8102ea994c45dd4aad03f43f81f82e8ff5cc79698f5c5b449cc02018743f6c51689a89d7b060524a163c342ac831e18af45616cc8ec7786def507c037fd657dce71142397e2797d7e2498e4eb835feae43edbe47efe299135f78838c8dcc9e9c12e50d81df1a8acf8b82490abe049a681945137c9dafa3dfc771ed262f8deddf40f3c53b1287d8355efadab03efd9e040db320b2f84804338551c7cb7f35e10c124845b8451ab3cbc53fbee1f09117eefc1112e791e6b578bc827e0588aff910d6ae1c3d44279772230a2848cdc04ec296cca563e886846337393c5b940a9210daa8f98a8d97f4322365d780642884488a22052a01940de3f10a754d68cd3210589ec22dc32a7f410e7fb468f485fd4a01f8601e4ac1dd30f1694c2da649da2ac75bb0bfae2bd22dc470cc38184627bd425fb29edb20c0b1f7ffdb78598ff3d0578330d309ad46db9ea2e1febbe00a44d7e7593c98adf572906395c31c54a1cfd4619d9f81dc3badc71087bfe4f2b3520eca960118cf062672500fd44b80ed990f9d706ab99939c8ce630173ca930ce07a83b5b32fbb7d2cd1187b73cc45403406e295723f1de6666eb73b74b9fc4cec7c060a61c12d8f8fbe4e6d7bfb92f26a90d5231eed8829b0db142bf2984a58d1038a71c1c8ea27ac319c50a14905cd1f75421d20ec3702c813de22aa77f8bc3347af437c73a39cb7088236b46d0e61c82dae8322744dcbb0fe8315e17531f09d1de2593d99599dbd226d6751a1c9fd7a47d214b1c583cde6093359b1402a238abeecf613d8bc8020269fdfa10583720a3572599c9cd9407acfc128549c1c61c88a322447de69caf24351c3828432de6a3d2230ec6234fe3b53c53047a5f28ac325c7cca6b6b0a04826d7e1bcca8738da9c22bd150fba6fafe2c7407404e7d32c507811609cf26f332d207958d348637cb775b0f1a4fa90013e65bb0a7c51a293860639f7a34b6c198cbc0f075b0b672c39feaf85a45a2a9e5cb48f3da619de124d38fd2c0267b171a9587311b71893bfe4e11f9dac5bbeee73036c8cd3f5b12baef22cc99a994b2176c26db00be0c94aad47243fb67c6556dce362d4c6ddbca1ba03fd577b4ad50f569e0a09a3ea8454783ecae590ecb3a560bceb68d62b4dee41a1b345792ef93128fcde44d3e33ea4d74b1fc5101363a427ad33537689e1ca7d46d86b4bb89e772b02b545982babdaa10a9c33f57de9b4bbf4784a14e0e7baafb34cbfcf2b926e6ddac492c04ac9e2a56c9629f9dfdba3f495d676503f1985aec8ca5b577109688187e439c19856e85bbc40bf31dc3c68a9cafdda496c34a6242180ad31b0f44b38cb4b08e70809e13ac6fc1ddf491fff53d8e5aa955586dc5f4d02baf95eee0a649b220c4c9d8d17f95259ca1d44d988998ba17c9d1b138a49a00b9b5792401209b78a332501dcfd30590428c58c5e104882c2268324f41a9295a0223d71a506fc4f4c051e0435168170b49692c6663fe4535e3993cc0030abc90f745b383925061ffdfdecc1047c3156fe3774d7a2297512d5a4339b630cc6d83e49414a157e2d397dbf8a2f78545f761d955b3c4aec20707d6e01eb61acf3c738ffbd1d0c6d5b343c2c179bfe1b3dfb7c43886db8a1b9f57658dee7c063a05badd0ace4dc49cd6b6673310421ebb88daa16620b0be3ed029c4b8d1abcebc4803e7c839a3ba5018d758217bf4d0a99c5647f0cb4dfb9028cfa009f40bcac9af5af0ff980dcc48d50342dada90fc467be18d7ff6281cb1f7022d626480110af49fbd68e49011d2be8cfd35d309fd9542b0450bd1f5f2fb70a44fb961518e279e0629cd6e45a0ba1b69fb017e3b3cb6bade6a564ec41711db077e677d26848db8c0ec174866ad24045d802b58e0817eaa00682f31abe29fe29b445e62bb8c264efd872d8f102df007796acfbc27a91d1bbf698c0593773e0fcb8543fcaac4d7bce7a7810a040d4fc300210f81b575b102f903500e75843d504d5c72393080240333935d007f5ce31a6cea6d3339c9a869bc98637ffc9991a0b0e4554ac16fe1a1ac1cef3cc4540112b89c137f9f5ecf1bcd1aa93ae9b3ecc1d6ae77285cbea2ea2d66b13dbe5c90a3c72f884788cb28887e2d1790ce5c6885570e31f1c903a5841ba83cc6b445a54768974ac1fcc7ce01197234181b51e0788ac852cb63f10cc1e0d46d9f98f5e9f4cb8822975a1193ac68318ae12cd57658c9f050d334d3b66fdea928d0329ffdc8695223b91b81a68e5af8ef40fd67b1a4320147ebbd4d0be5926b9588661af650556a7a62253acaee2a206a3d76a80a9ce623a0180a4a09349889ff4a4e8f15eb7a0aa5e881110a3762e125a1d2e85eac76a5118ee57ba832c531fc815d1dfcc1327bc7efe2422d618a4ece5001ea02c48562161e5a821b21c985d85357f17b755b883505c61933896ce95a967e6e4b758755e94112f686787fc8a15238f407c6730c4446208518c9290ff50b4b5a3aef6a28402af2a52bdae3cfc7fd2ea3a40104746eb31b30ef488f6193faee5d799639edc48d04ef73c0f21ad9f4fcbcde40ee748d0bea1a76e05ea89e6f7721c91000a840983d1d46a82c3737ccaaa6e9e73ac9a65e45fa9b444cabdccc11779a6f2d80b862a593225c8446bd4965a5e5dd7b7f00a32c1e73bb0f86b3bb89199004d183c7321115f98c3a4d2d3e582340491b57218dc222c5b229799d98a3c9df8cc0d2e6e8764d87cc49ca03ab0a0232346a8a99cbf48645d674c57d7238876ff00aa24f24f99ecc360512c0e4e8278ddaac8b3d5901b520c7a390dfd1815faba006a8520327b45e6f2e43e31bfb1cef6e2c85957a71f59cc3083c4a17ea4d875e3d671b352841c2be7bf72583f8c3118e9dfba8723813a0f0f87a147d68898129f634992f1f737e4777f1ed94e45fd98b76293e227710b8c7c151e8ce6c85c7653029102f66c86c448720cdcfaae42f0b3b3362e2afa61501e376bd216a27ced116024f153b1e43aa686355d1b637f0874c3004df666a316633fd1d7dde8787a3778fb03dbb597763c1d1c0efcd954e5f601806425c520ac7231d49c4f1a7690a895e4e6de3703881b4afe9fae750561d3da10e113e2c668ec17a39d63178c57eeb4e3c57e3263dfd7921a8a344fe4baedc598bd280a9ed207d729d1fcf0c8e54a5c49a4c7b3f870e3be9b4a8f135cbfdf1839e70bda1999f5d95723474a15025941f53e666080c2f86421bc0832f469a63a62804eb61236f778637a5fe2a30646227273bc58c0e0a2b3d1cc54cb189abda8c04f6301e244f0e7c2c38bed3d4824bcf1b5f21762b3ee706502cb89cc3c8f38ed97cd368cbaa1ec6f5f4e5d4595f4b932eee213515b38b8a7ac6fb7d1be76ba889c7dc682ab13d4f30716a26041e1fbc4b89d591264d50270ecb3faa5a71752df5fb7f7150ce0d3252578978de35606c905038818f310add748ba2fa214ac842999189cbb23d09c565e3a7b64e26b6b6b5cb14b26c81262a7e179bfb73c929eb698e3a60e20613c3199b91c630989bb18cda716ae24af2b42dee00a2840d8b3c6ba82ac4872b0c41bf0eb453c7155bfec67e22aed45757c8c1b539d8961f5d80b68c88ec77521656f682c540be100671d5e65cb6ac38cc5960cd51819b2b2a55fee96a01fc0e4033d6e45c21422468f6bb3334a4454f90fa6e26629d9a5072f20b697fba2f3c5c85e6559e65868f08833c5e5ce3da90002ba6048850c2523a507341911b2f670c82cc70069f78e4fc93c29327737c1d3b5d5ec3e710f497d7b5b8e2151fe3b19613d4e945ec3786b36a5586f4d21248520945c1e8530f716f7e7d6f74545b49de32d0168551a278fc0c5d04988107555ad1784b118d60e2fed4f75b4f6ec835608254df25f64c6301f2371baf7cce08c81b9d4cda5873e8b9467c0c399cd6da58c4f841e5394339e374188fe3e4555ced74e12666d1167e7bc0a0dca1ba59988dba004b6c4f50cc5fe5c37cfda575bd0d5afd627e5c7475be0da090322583431b3921fea8eff3c4ad66cbd01536c8b593659c962e4b71254ef1e3b16ebb84f50c319f576542235a13567b6587604d8ae9ba2ddacede5e6e0cb7b36c51cf79f56006098d1a74934064db07d476ab9b468533247c69bbca80782a1dcfe1ffc73f771b3977e546fbc72c5abde923067673966e4ddc9b0e953d8e592a3e7b094b49f8ff7f22483180b9ba2e01599832411445bc6695f4b3ad8d8ba8451ac5aa0a7c735663b96c3849cbcc39372c8df1f0b810afcdb818dcf4f199455a655f2b8b5f17d32493a1042114989b882649c1c4bc896aba188bb3e64c1f5345d61148ec3b655b80e562b5b9534b601cd13794858c845c5875ea7dece57c86b134e389c8a8ebb1594462b218b63b00c6540450c0f828eeb9c458a409bd7c5fcf50ede506cd6bdc3180c05c2cf6a996df504179d69e222b38738239671245c652c1e5470c3873cc1156877b8357f62e0e4006d53bd346b9084d73594cc4f266d08642fac91c8caab2a2066142b1120f38521ca459183de91a003523c9d8539bf63c0090b53b0164cb443f581fa4f2a37c5a16300c03aa70b7a27a79698d57d908fa90fdd502e0956e26d3622278100575f87029c2eeed2a8da925497b9eb90a48a4814761637188b571a55dcd738014a985588b956dbbc6111e17bf8554794e2cf856a7e59a5d5fdcbfc7e972e01c0a26fe839e5b6d7cc4cdf4c72fa40af8ef6c3885d6a82ddfefc3918edd9116b71f1bd907323defbab23aced03e7de994fecb01015c8926ab24f46949bb7e94cc079c2a742d5719f09c586c492819ca8107432bda0f5a5799f4591f8e3514877e0bd74c79c80b9d8272fde7ae94a934487a3141559b07e735385146094c65ae3607fb49b5c463bdd89c906f39414caba68442c47e1b87e8b462f800ce093a8ea2d9d76595fed65c54757a40cb0fe493909787259d2018bcf501669e4209e8f4ec4f6758f9af44f01c58ea880b5a41a165c4152dc9f997bd1c8d83a274e235038abe926e19d4f146c7dd4f69846898bcb433b5a165046c05596e7e150cc4df9983f58798d65f40c6dfb1da954d7f928299d7d5a64dc0d731116ff5b7619b89e7db87886db1a1fc727bd7623588076e7507181b5466f76c26ffa366e72c8f6fa6e11b875ee02c60c35e74b6e1b7d406aa50fd62239e991b64ce3df7f71b539a7ca23b36d2db5d86a437a82d62dd5058359855c49d80c6b4af3a9bbaf9df53eecb890850288842b1974c8eb16ed0ded2f8a86e63c63b0138d8456110167f499273ec33598874781c2b6915d466a0314a77d80cc7ccdf00c2f5469e98d058a02bd7a876c3b08c90b71b51fbe3dcb4cf0b357aaf49bb199b472a93a56fad715596d4ba9cf4932558e77ed4eaea83e926e2fa52c86b092b5854b2f8cd4a7bd8e10fa1522c35a76bf08802c54a2a80835e0d4a0241531ebcfb24e4ee93126eb8dbeefa44c81b986aa4edb2cebb6f96403a4d77f9be4bcc8823988290da657b66ca3068a3334f404ecba4f5572d193fd64a4cf51fa97e2d22efada9ebe41c2306181e43d7343c640ccdaa6bf1ff749b49be4b1fa91ccc5456340b55f1815524b1f811ebdabbb5c29d0635d7c40e5d3cbc5c9c65a25a0d7ebbb15235eba8ca9b2f39574ec6d43289e587ee5530d685d7f8d9dc4161519a410781839f9f722d800efa7ca4f47138868dadb0b02b99a99cb2e0b43cc7711ceb134072658922f09ca08e8d3c2a712c4b303599062a25140516370ebe1c49b1a0c86f6c866183518c5d2b60264a674504120d49545a3a614c7792957fc224aa70896a544c2b88311077a48dbfae86719dd8bc01611f8a59f5beda16d45a930e556bbe9db3f04f5ba3eaf06de03b17aa1dd618fe99fafa76060f7f5866eafabb58694369fca4d04bdf4c0dc0cf063ec8b2743b73d44a4fd147234f8b6fba9d018852b078c48beb90dc6eb919fb36f73b59d7033cfbc49feae9aa499cb6b5deccc9a386451ac15d6515a8abf5b584e38a827db24266c4867c6fa0312dd6aa6db7d2a56f3c0a829396b06b9156afe38111a2ca4a6ecc69658ac0fbaaeef83ac559ed3900a9cee9adc6a2284090317a364116f54cb99162c959286fa728153aa27e1ceab99b931bff34cc4b707552ce034a0b8d5c3139c2c121460ab593a0d6d315dc500b553a1aeaec9350f3690524d26f2ff7a3fd4eb30d440cbdcdc5a7ba74fab6a9edc90293bf5fd07a29869f684db4275528b5841f65dec87a2fcbc27db99e735901c79e11fbb14b4654924ea4d68e5e7a39d28ac6ad8a51e1ac441d1417a1fdbf8d01c49225f48046c052309fdf011febfb042f645941b999c6d913b9f55e3b45da313b0b92ac77cfe24e01a5dc041633bc2329819272ac84b050af330d65aadece8af040c98d8bd89b0651f817b8de432ee084b600d8d9f6f1b0c1ad6616aa010d5b95cb4118a9947f035800cb4e3a8a7ece1323068855e88f67e46f764655849fe06b68c3b72e6083df00375d85d35ee506cf84a2b931a5095a875831878a4eadf6c13860a87186d74484a0884215d223189b0d41dfdd1b294c13f28f4ec7c3112b7652f4d6ea81d97590f0775ec49e82e4831c14744df68484c43c3c7d4236e809bfe65476a0aa40e78431819a316010f6a0ba6486e1b40934a024df4b074dcdd3a9aee58cab185332d1f11ed0722f3151189b91222120c5cf3e205b441c5666009bbaf915c5bfdc6410a300a10f8515886397bd6807d8e9b31988a311d4d1cf093412cb3de5ec2d39d988a01e065963fa1a2251b9f1a35ade6dce4bb0aa76306c140991cc74d57a080e321973e67af4afd5dd4c5e102ae4e9ea3d42ceb031206325e4aadacec5200b688b301d481be5973391b756d2a3ff7ac29bdcfc06d318f1d17385b0410b277ae14fe8de37513d8011722d6d28b005cbf8c837e6ca5660847d34280bc8c05345acb091e42cc9f5e075c734a91b39619e34136de38b0cf3da60e114200439860c451723bafbe0583af29e800b4bb245119dbb2a9261c66de780d41c200f931a5e4747383837cdb62675dfebe0c0417d3fc53c2e37f1240816fe13b635a93be447c935c394ec20b77ed7f8b2836326a1c5c088f1387e7a1720bb7a2169cbb9314f89fb0e6e345441ef7a03555cfd7e23c610856211a1198446ff02453e052e2401515583c7ecbe083ae6fa4d3982981a9b501443b195d575d4a04b3d6b196837518b8aedf892afee5e250f554145f67c376cdc87d780bb9249b2e4942e62a5ca9c862caa3ac4986eafb60091779818a90a91d2d874079c743b39981eabe48803da88b5f12cb0448732474e3d10366bd1b5b629a587a820525a39950aa8b2d49bce9a4dccbaea928c50174d731d46763afe86d7fad46f054bb50450ab41547187f0efcbf367138f0194b657766da47da7a3aaf6b15b8166872d6daa726eac2526b51600f585dce01abf2eb0b0067eadd4b23adb8d8e083c7fa735a4dafe08cbd3a3c3532826324c4bb7dca5d78b9952ae2fcd20fc5190e436c9ac60e2d85572f4b21ea5892902dc09441b6542a4546b90c8897b880df1a27f2b13efb8b91d333e8ba9eb40572c60493bfa21abba381ba76c34fd923c54136f76b68d6b1d90791b83e63736c25f9e43aa87fa02a9447b2bcbc6fd0f6d651daba727e32aae7df9837bb2d33aeea2ee1cd3ef4944d5136a0d5c40e1449ef2664d7890ae80da377895c42dc741713fbd08aa42b1e9ca72f0f719e7ddf138fd82d0e463be0499fc285e1c6b554232b6e47b2694a4b0d805bbc84264e4bfcce62745fcd3b4ece14bfd6b3385896c0cc7532604017040580266bee5f2726eaeee0280d7e49c5db3df14d2cc4974ee067d0238db494094103966f90bde892b76af5b6a754e6c36a69c0ce98205d5e505e406f3621d2cf0984f5d0298df8c858425740cf58803e64b72d0b8b329a01219eb48bfa63246fd087015f81557a5f5d44e52ae5ef7a33a72289490d63b238d54555cbab8aa114520717f33a49b79c7e98191ddbf22a67149f8aeeb0c77c49203651b50d2035ac3f06c20d9e9313e954155c4bc9794aa6662c5b4116fa2e3337c2b6ba2a6744269984077b48123b0caf4c0f1dec359fd70f85de4d997662c2231282aafd9b3d256cd48c4fd941c798e264f5b1dcb33bb1237eaa972732d01236ec8502c96ea95fe41604756d2364e4bd21401b76b0de327c562ba316d951232ac5ffa4414e754b573b06ee382061e296f807339ca11219664d7cb989758429fc04f59e2e25170504d038643d0c444931a2368a3b392b5ce30bb116a6dd1ce187ee1e076d84b0cfcfd6183df99b38afe698bcea6e3b5434a6a763b940018d583185e4d8ae884aed6c58f56220ce5fdfd269701614e64c58db7d5b0ea474ae27e5783213e03b33a1110724228692dc080213858c8d7bff12e47f6c9f43f78a51f8795d65927e4828d3bea94bfa9e85e8bee95e35077a3962f0b0ba41f5a3f98c3af9ff24eea6f3527788ea94a210e0fb2d1ac6a371c9e6183dbc8e8c5fa50ccd3384c40a77eed1cc8382405ce76d2dcfa57d954d5ecf59857ec3b4cd4ffcae96257d39deeb75d9b8ac194cde5c4dac2cc611cd7f11e47f6fc2c915501a60e5a37495e18aa14eff3bb3db92b92c7cb165d3f51c4ed94ff7ef79e9f72462a6e00344840a8109399738f4e3c92ae136dc6efffe477932fd241916be0b42697815375ddcaa7f78ef060eaa2a4932d4898ff57a0a2bfd9c18550b7ecc940eb2c0718f44833b5eefa548ae8c976e3ba3c7d9575d29858f59a1ba0061e0e27093bb8a240972568c9ed4dcaf7cf6e59d066fd53f86024f2d3748f756edb841b60969d7710a5839ffaa1c3b716778c7731466461f03ebb4ef8405c0ebf7500f97f99b0f2a42da850a735af22b7a44bf293bdfd340d32615f31047e749e900cd58f3bef7db879dcaed2105ad40fa3303d3eaa755b1fc1ea802b5e8e634e9b22c26c841b496e780aa6a6878b43977bafb0ee53764e4fd3a46123a1bcf12e9815296194e8f8684052c9ca77422960ad769c7129d6224e860b6cfd9c2aabf4f7e6e2ba33f15e543300b59f1a904de3f59cb1b43e534ed4608125635370cb033d3c1e531be06109e904b40fa2513f5ea69b3205d37105b6c445f643c05804bc8fc852089865c435cb0ad9fcd925d264c7c79e6715c38cccdc5339a94a89e067e4f431423a4b33aaa0cf9ca6286d5d703919579576457f9cc7c58ecc23efd6a7d78c53b205802dab6399a734202e4392f692f9d9eb21ff759f33fb9dd86edfc98931aa27c64f2bdd17f0ebf8a2a84383d1fa3ca33a8f5afb6e2eb2b4727c0e7eb48da688b9fcc4db9c63b01ad2269f5a2a94435566862644c6d17f5eb9fe6050cae8da01ec497ca0b77405271797be8cd41ff8e544a2ede4b255fe9ebc6ed5a6e11387694b965b93e7ce81080d8ca4361c96c8c71a1e15865aabfcba9fc3330a19f613c5de51dc84189d33d02b401561e64b24b5fe96e8fba0c713e1249c1737b5c11dd65c107b8aa93f7f608ecda4affbec423e1d8480a24a5b978b300a93d49fb71a81483c4f462b84cb6099fe3c9011f2720fc798d311ae0f1a589fe773a3c39e29ce8f1fbfa715a80b0b4dd71e5aeb438e0945d2502da79f898f3f7e1a102d28d9eefe9b15bacb969a031dc2e1a911201b734b8581fa45d7dce570411e6bc0302ab4950d1b98566872a679ea7a8f3f7523acdf1318732546327372cce2103a7b1a06194cb5dc6fb25e9ed369b4b401159ce1f7c509aea4ecfaa0684b50a2c0d48e7a58123cd3de6775070a7fccf9e71effe8b9672103afed46b040235ea196026c763d0c19cddd5c6ad93b95026092a2a303fb661a60f9f3538583066a4d4037de3c1c5972512249105429503a868b0057b02532e3db9317d342ec03d5b595f49958eb0045860f1e119b17d57281050d3e42ed10f03f65e6219dc7f9c05b7f6043ba5b68ec21040baea9b6e089130310d12a3ad12dc08b69e87759ace55833570e3cf381305d46b40f3210b528f84da5bf97d7f096321c1c79de65eceab8d66085f2e4455ad67269136a64d6251ea84011b9a3b2b9878cb9f07eb1a479374518e158e6782d88c7de9f03f57e8cac76db94e864b6a27ad6fb90917cc5d86d33c430ec5090c4dad90b343fe08101331a3cd3ebfcdf61e4596b271698e3e62a88807ac0dc31c890ce5310cd1e6d57312b8b14849b44cdea94a532382ea8a62ea64e77ad816e9d0d06d174b811eeffeaff827e397f452042333f08fd26152b23aa6a8b5d66dc955a35bf543c0e2b86b50cbd2e4a2296f86dad50ecbcff83b0841ec178dfa835b28fd5624a73e3ddf9621f05e410fad25d6c32fd75edb7a97fa8bed8591160d8790f40766d1c07d8e753ff0e998a48e9ce768d431efff23ee56c7168f2a04d90ed82fd310ae6ab34ee7ce2922581a2ff74deef97bb2655db2981894958f3d30f79a661e6445956841d77c661c308b42c7f2a7b88ba0ce820576e16dfbeba9a8c062891506439f37b567e23cc30892c75babe22bafe4d01abd515d168d32ff8fd36762351a202cc998f0f9fd9d232a5845ddbb053e480bb292f224e3f5047179960f32889b9c5be05128622e50e88267abb6319017e534efaeba7174eb4069657f3325fec91af4901b5ff332008bff58d53afed94928a32f2f8de499eaa2a77bdb9551c2e0a1c4ee7b0c8cab19355895a35d0c69bddc2dfa2296ac1025225a0c628014e0d273e221ee3ecfa810876a49dc09221ad88b7372eb085712ab3e9a445458279d188135d35b74cac5e9284409bebdc97f1a74bc5adb2e26a74ac78bb4eb215806ef43df3e4e68f09f98a7c9fdbeca23ec6cc3b64d6cfe5048b84a8b5d86d61080782632e198f536da9c54e32eaacaef6f594882093f5975894d958773f383c01ad91e0acecbc4f69ef0e302fe583ee0c86a104ce50e3070d108a9bb7dfba722ab9c1c070bfc2eeb049ed4222bae07ce911dcf303d4bf22a79072092804e07d5c8092a5b49296382c4edf34ad692aa1e2676f913ca95099fa6ee447095d45e393152cbdd3dec2b487a68727336c73a955a04d3a1ffee896e06f9270d35d5c8f14732c111edf224d1a6808bc99265486cb10e48fa99b1799b58837d9f800dcb15472b7bf9110cee1dbe4dd4514ead9582ae01b256a5c2230354d9067e022937cb78639884d15d370e891e35026eb21c2d80e54660a09f03f1a91be80af691902562aeecc961f4669bae64a9ee88d818626ab8c93305162b6dff3da4743a38f7cd5f634f56c10daf5d8d5e198a5dc651c7660b8c2a41987a3048866d2b4283cb34c0ef20b158f2d6a33e77dd232cbdac0d17ef1385e5eec702b08707f9388d75b895210f47cf2e6944914770d75ebee781d7d518f414e691ce54169f6a319866105843aaa925ddb0e238f0d23946ab02309ea5181b7236ee2d8487abaef4241c4557dd3108b77eb18829b452bdef12a38d693ddf072c3ada8030066324985f84cce17edea08a039666a102f15053265167c49c8457e8d7d1104fd41664b306e2335ee81738bd0e644ee1b1be7e64e6ebad7b121fae6f4e08cb19b069e920bf059da7c308923f47014184a0368231c4cd701fdefe2353f8275a44b613b935e4a43d184101bbf4a2122313a233090061e42b125697dfa4da8b86475a5d62787bbf634086e57d3e8a0c391f6cf72bfd32ec65f000ff8b593d776040e6919d027a08f3b88f5add8e43aa813255218839c24dbb47a22825b0b63ee0482f94f241f5ad1f0ca0a32ea85e9c0006ea043a68c8a2eeaa7c9dd7e71db74856407b490488ced3d7ad080cbf34ad6e70e93926061325fc293ba36f963b758211dc31df37bf42a6a1844cecc624e710cb102a43c780acea4750afedc005f1c5778b0e1fae48ddf9afaa44938a209c3420abc1813b13f992a3b3574196aa9d27e5f871cb44808dd4a5bddd27ced1627036910a018a2f0289fca5308cd65bc04d6f39bc9b8547b0f19cb48a774864f4d6ee25a6c44ae98abb07b11ec6bd22740592429b4247c7f051d8923939c0e01346b01aafd7c3a515050b53ad7c6b3aa0633da2ce8345d14759117d9ad55aa958a112b34860b1b8e82165c2305a8d48216a7e6478b0d4228c006005a9c2c4a2851aaffc010769fe49082e6028a68558cc92632c99452e4960186036d03a203513f8f5c3509d5feadf650dff976458c47e9b3461a4bea5e3eedbdf7de7bf70b7809ea5df256d0a16ead887c5ae8feeea7aa28ad1f17beab2907ab0063466c7407c56f1ac642b41a02aa85756b3584532389621ef66ecc5a8a00ab3762369c3c979e6b2a3e614a030cd0c29d41c34b0bb22abc644fa03ba3838a65872c05d6896b2578b56284a6406b1ebb44b7684c995a1aa1fc04460a518d94b34237ec7d7d8f80c7c1b0a01ad5dfd89cb529c30470a8aa993c11a23165822c21334a516ffabf2d2f4fe1dbc037aaa3dd4ce14b65aaf12abd77ef5520a9d0e9bd730e152f51a5b7dad76d54a90a2805dffb38dfe37b6ed8fb1b178058b75433193552a6e59e5279744a2688ac664c048029b057a305854584d532e97ca730d37192dfed2ebbbbb2f7a63381e4aaecb2a17ad32634d59bfe49f958b7521325ea8fba95ded86dc9dcf7de7bef6fdd52cd943547dd52cbf4f2f67408cfc92dddbefd752194c1d13767f7de555925ab7a2b0929fd00c6676dde7bef676c74aa2e294f7e5b1ec5ce78ef7df40a570beb369a049716c3db17550c9a2faf142a9e998c045c60af31c6ac5c58126812916b67404e1dd76d34094a44dd46b16d35c7cc88662dd76d5409857fae40dd46bd5ad41f359207c13c903be753e28083711f9644dfd870cf71facb333de57372c83289acd377233ce539b3ef0b835f8ea11f26c1873314c2df65c6cd24f6e86806ea563aa352e2f1fea7bb102e628d5a00d8db0b00eb6c996f3841609b301ff08800c09690f19077325fef40f69c1fae694ca2dd9e87ab8c0e755090ebb4e6c38e788582f1b881d5e1eabc91f36c7c5c933d1d7c741e5dd9158e3b22b9eb860a076b8d98a5af19ba2c9815aa17933c6712d3a4ee24868fc994d1b376a9d839fdf04eec5aee6cb8d941fba43168f8963649fb4758c8f2fff0f74b7e10cafc2b7994421fb2b0eea383389bf89d79bc2f6dd6bfe7a08fb4f198822567f5181c1c883a963ca843b8c7fc2f7164a1e4fe3d3cc4e1e07b96480816e7c0d99b8f0ec3806030e0d950f63e5be2a3c3fff36f12b824c4933bfcce32712ee1dc242d12f79e8dc39348b1f1a55d3f1cdfc3bdafbcbe8bc8f9277102e6a11ffb8fd95774703071b8adfcf947a1e3411d411249b02dedc319d2267f60be1f3508f3b358cffc8520384321fcc5588844383a0f761f3ac8f42c13e7371c90b48e8f38ac7f57bfef55f6d8eb9041d32aab05978f5b920e097e2a7efda13a1461336d4956726f5f0e51aa1cec76a8db6996a84612b9930c4c47cbad9d159c2e17cd93cdb0a25479e67e68feee2df7de72dc79d75dbdf7de46284712e9cd0c962d8dfcaa8b4b862348e5dfce39e7afefbefbe793e39905cfbd73ce39e79c73def9af5babe74987c12b8821e8455c1fb76e04dcd3dc07694f23b90fd2dd7bff79ddb610c4e0767af8c65e04c96b4f6f1ffb2ef27a7a23791d1ce12ed8540928bacea2683851504569d0323e67595c4b2b5862f4962a57520e82b4407d41c9f4ff7e39fe7154081bef5dc4fce9b978b5534cfb247e216539efb12c0499331ef9b3fc63ab154630a861c8fce9b968e504e1158543fc59feb11e89d5ebf5307f7a2e86857031e601325d22d1fa427a2eeee94c0875a823f8bf146d2aa556495780304212b1f119f8b3fce32c9890b52e62fef45cc4aa2ba27d12acae10b39cf788450532e68c47fe2cff182bc7188624a4e74fcf45bd912fa8610819086c140e317f7a2e569d6278bd1efe2cffb8fa03f262cc0364fef45ccc23d9fa18fe59fe31954b44d617cef45cdcd4a4906a07a002527f7585560cb688ebf6eaea8bf61aee2df2f95bb757592e5c37d8d311bb10b830d72d04e94db7340f4a2d113983cce0ca0c747fc13d06e9d64ec9e28ae336d5b765d2479426c07cb531a92a6d46267cc4844d121441b6672df2886ca1c8162cae6d91c13de28e20e56090fe41ba24487710a44d08d23304e92033480789821ab85eaf640b619e7cebfdbf335d9c8b2f97526f28b79a422bca9adabb6736bc4829e160924e94024d3c4faabdc12ffff8a334f3c868bcbcb02a91e29a4d10f8576d82396ad94a92bd2cbc28b9e8dc70e2d646577bb76cd380a639cdbde0134b5e9357af54091f0a7bd20fece1cf67f7182c721a3917f9f123fdd6fa81909c8c169aaa4eb6fb1b78ff59fef1fbbeef9bd4dcee4ccf45eec4d5dff7cbef0b1f7d4b83ed464c5a0bb69fa598ac89ee467328a7af89cce4f5ef9556d37d6718f63d4683ff9296f5a6bf7128728c22b121cda891c6f88e82162d0e52f052b2854198cbfdbf7b707c843a6fd4e0fd33307f7a2eb6688a53abe922aab2dc687c92f9d373916a2cee2ce73db2a0831373c623cfc0ba194842facff28f9fcc391950c390f9d373718593ee1a85434c31c97579bd1ee64fcf45292a1c0c0f903fcb3f8eb2e671b17ce1fce9b90895168735c361ff59fe719ddd950f4ccfc5fd9494b3f29d7bef83fee82483174944383e59ef9e3f3d1751d49b8eef3adc3fcb29903d635c507c5cc8d89921ba80138461f559c9a47a004db68ff37bef77efbdf708a34e5b09e36cfc755bdd61a991c6922f92b5a5e90bbf291c96aa9d873f0e52ae7d737a604c2e2773bc1a4453efbaadea94a19508df4dd3ecfeddfbe55d8747e8bdf7ded3ded331ddf9e69b1bb9df5ea7e6b3d49ee6de5781eceab7461a4bfa680efb9deade30e7b39ff7de7befbd53c562841289f30f4d3dac91445a68b8795a1960d1c0bdacec0a18d1af2ad43c0a1282d2b93bace50dc54c762567991501c94809a3cde5c8e77b31a528d7b4ac28f4a87d20381dbd106b5a91753737143ed1ee97ca11bb77f78789372ca72849599bad197c25645ba8e0e8548d9223dcafc1904e0e5ad605d20b2995b8f795dd4b6ba16675718b4a9f43e331aedba854458d34c60d853629f879ae37fd6da8c98b0362533bc145a467c28eb20b25aaa84505544bb72ae4d93095d4a2f2bd35619ff21e30434ac20b5a3a9963c1e2ece54c3c45effd5dea5a1126c513c896136685b24233b8217763ac6e0cab7ce931e9dd770e6dece2b5d6b7026b4ebd690dac29ce64224c087e5836e0705ad0d9dca125e3be963a707f5b3094cdb0ea6a512e85ec56303be1f57375aa3eadb810526ed5ddd489284da8b414a984151db17eca193a2818253aa64fd30e48464e8f8d6f8e21075cb7531568933b177693a20ce86d4696953bd7eef9c545f9ad498d89294df1d680b05240c971c99d5004f872d444a7a473a9f9b1425bbeb87ac68da0242a438b6922597df7efffa2a0c6769415285da113041dc255f1d530a9a0966029bb9fd81f522e19ac3f38bfbaa7e15b8da732a63821a9c02f19455f5a2148b73f48cfcf3cefbd0d3766cdb040b2302967905bec0663df98ec84a4b04bb7c5fb5bc290c9a1a6d80b2a8bdbac64983396564ec28e825c3cd96003a2428be6ba5ea236061062caca18b9c911a5080a72f94c17e7e213ef27dcfddb35e90e5453dfc90a0c210fb7c6514cecae0ee739b3e4f2f7c42e2b8529daa26209353dd8c85e549548ca5d9182755b6daad5c3baad36b142295025d692bac26e70adb96b24ac153d6ffed4e0a466f9cb74d505a8ea02b4adad4dcddb427b5cf8447dad3d6b84e0baa596b514f9385ff80ffee350b7564126fe7c5270d1027954705d3532ec9d8a1a4451b528d755e3b861a3c9d2a1c82cfd1c1dcf39a76362119207fd8b4efce1bcbe0624c03c264f9ad5cadf5be275d382417a7d7c2b4fd8a6d7bffef56e918b94c82eabfbecb5e674cc3997e31f076d2bcea66448bd88ba8262f1d4e464d4748209e7863999a53915157f4a78496f4868476146d6a22a51d5d0530a241441423a41723340722b27029d793f713e6a3d623c5d3b593ad09c281c2513286e786c9a35712dcd38149abd9939269b0c590c1666eb45ea32d5b2c432b4e2b3b451817b51c2254bf425eb526c0451cc82275f812e00adfe9e7e4cd9a23e279f89bdb718bd37659edf8d3b3cb73b1a76607530e8a87354724e714770406f396e6ecc36b7a50dc01a37d8e0d6d26035b1b42bda168de9d9d3aca9ec882c686c47ac39a3cd25ac2d09969571f7f5e6958615bb5ebbb6624cad4f184d2f8e5c0471ed6c35b56cb864d9486265ab77d4b7ab342bb1e955ba15ad31fd2df49941130647170459b0534193821a2e13d4484a908de00e82b707d21c106be0cac0d602d392a7024d091c21103462e780a608361712b6e4316bc05d016f04a419c506b88e6c894ce9674853882301828a3b013441acb900b0969cb31fee3cbc81a411c53a5c3fb63ca6f2b3a389e3884350bc336c7ea1da0baca6fc80af9ea7eb6dfc38971c47a0edf948cf4531d9755db7e438c28223f6fdaf2b22bb34f2c7ae04aeebba9d3b90c655bb34775dd7a51d705d07b8f2cb5dba4bba0b5f1e83058bf76f676ae945dcc922f39bda7b99f7de63c8bc2ffc5bee3bf17b3fcf2927961ecae1ba95c650a99132fd0c4a6da12eb7eb8617bebf1cfff88596e68a579dd8d527ea665d4240a4d45c5e955a56213dd373719bfc514d7362d0a69c512b88ad82020d0da5732d4ca668180222633423c50b4688ab6a2b1388cac114594185e06e40f1ceb55191f6d2f25080aea2270428716622eb84d7de5e5d5ed4068e0e61bd640afd6fef239d3160e7a4350be839634b025aad0f63dd72ceb91cd51c40768a19316a11f179a16d58425a42f8285504d08b29c2b904005603e2aa0940cfd4cb4ccb47bae728e6834ccf32b16787e981eebd37d59c735a7621d83408ef9cf3b78873ce8f34fd875e887d2427a7430e0bf3231be331f722afb5748cb170506f38dc6013e3fcd00c719832c2ac0d2c07f34d98c9bc26be587c8f8a4de779e1266872b67cd387d38ff24d1ccc7cb3b6d2f986d2b4cf952e397aa980a694eeb03971cdeded64dd7be788e253166155c1314d7ad58956fbbaadeac4b9fce572b5a7639ea53c162f3462f0c49975ec14eb52dd32f029cd07ad811ebb2c510f96130c216bc74629e14f455a8d40ab568b8ee8a63fdc6938fc7f37fc5fb92bdb56970dd573e8e76b9fd47befb3a9128fca0a67dabd7339dcb40d4c15613956415a46494e6701811b00d549058fd9a8c48c9e886606640700631904008060204681204aa212c70d1400071fac605478446c5050481209c4c58030100a8481214118088401208662488eee389239dd00be5b346fbf2664dad4959b426ef3d36e12a3e69c69d34a362dfd3143123335e526a9d3f4bc9b88b83937d56c944d5bbf09326d76a52629a7f9b59ba9f0666e02666b11e6d26f82459a9bb949c86dfaae266adc9495361bcbe6e56b82459bba5353ca69fa5a4d224ce6bc884cdba279fb376191a6aedc2c749b9e76131537e54d9b8ca279f9374392a6aed424ec96f9b5cf44859a99c8662bd1dcec6b8653da6cca4d524ef3733551a1a65cda642d376d5f336452e66e0a9394d3f4bd9a54a829136d1a89e6a5bf09993477e7a694d3f4b49b89a829136db2ca336dbf32c125cdcda959e8067d46856393e95b4d46d9b4fc9b604973776e16759b9e7613316ae6a24d56a2b9f5c00c8b9ed99d9a859dcdafd544859a336993956c5afe26c8b4a9999a25bbcddfdd44849b3293a6916c5afa66c22264eeca4d6957f3f76e52a1a65c9204135889d6a06f4141df525b832e837196a3a406f5982b9601e8a9261ebc295a34b9cce6e869c6cb9a3eda4c230ecc6fbba92535c9394dafab89869ab3d266936cda794d7069b34d6e12719b2fab990637f392665b01e6ce3f131cd2dc4a9b649ca6df6a22c54d79b4d95436af7e1314d2d4353765dca697dd2441cd5968d3549a79f791098736f564cd32b7e96735d1505356d26413cdbbbf198e6eea494da24ef3673591e0600ed0c36a3ac1deccb7792616d4245b347d46d3885fc103713f5e56280e98b62bc29c532722cc57e313a3d4b393ba20569acd8a5b71d8cb6e394e597778334da6f7f1b377d02c7a2a0c8bf4f4e3728807a9fb73a8edeb0986fba42278739d41d03bb8e2a7c9bc8afa82599048162a663e9a18b11d14cf75cdb8c92a8cb207abdfac596081af5bce65561c489372aa9dbae688b650a82c2a07aef53e3f6eeebacd5ae1582d8fe200bea9a949cbfde1874ed55f3f174b19c532d3d276f10568d1c7dc9fe44f6ffbcb8f2654db1347e40bd880673ee4b531443d4483d9bc072e6f276acb9eab50ce524e9b1f2d09e75ba4a736026f329ec2e85007e0faf8ffd6fb1ba995e0b4727e788ac285599ef767a62626ab47471eac597ae632aded3752f92782ed7a2a80d74bc2299389500b58d550975faa36190b78e492af8f1d9890b460a0a4cf862658be95b123724c8a2c43b9a93b7cf67d7e8131314101d12c4ed552eb3dbe856a120958faaeeb8913e7e2ddfda1f20a195f0186cb09d554fafc0a2c77556af9dfc96358b049513efec322f222bbe05b90bdbe5c2038369babf365a2354f659a889607fd55b8500cb129b7c0844587af94d239a08e8073f4c86ccbe536c5842887532ed943e35a990b2097238c5da385f0ebb228b1d7a042d472ad4bea0597342cae2a20645229a99651667b80a07bd70f6d8b1879eed078e04ab1bb2c708b39901d4e9beb62be66f1bb2f946792cdedb518f86343403f4091a66ba3c7e90119177f8d639f33afd7acf941e89501f075c9ecbad963afdcbfc0b58649933b7c005c0277f67e2c7ca0fc1bee8957270801fec39706669a38755ef8e12b31decda15ae4310fa4a1a078f5bd8070fb4eba2c9974ee34aa410723ce6dde7845290a5038de09d547961ee51c10eb3adf6cc02dfb1ebf3c4cc7568bbbafa18bbe30edf19bd055b9b2a259c1b5e3dbc1bbafd941df104d6cf7b8e8eef1e3d56bcf7d6f75cc0dad4060ee87491698010f320276834be7923b5af621e463779d743d6f1fa2be281e4227ab3b427290514a61546e996b642a69e6d00929a64b6dafdb31d31047df71f99ad441028cb19299e4e105b8557d23c005b5bc736d914e10cd3bf437d9d72d2b1db0c70efd8268c477c7bbada14b93826ac4ae3dfe6d8f6eb405d18c433b9c3bd5e8a253c3b471dd960fa5961409305eda6c01c16f7d9e339aef287a0e67ef56b5c85a35fc222cf61a8aa08bf2b64e7892d2bbfda477aad682530d37c90426a6df1d2c9ae22ed8adc6fa79f723483c998bb9f8c4e85b357e3055690e0c59858fcd8e14a310dd6305cbde2923b939d29ac6ea2a075904fa8a44cf42cb8beee4a13b2a56ff1ede64415a900c380bd14e5d60ef52220be08ca8558a79d2bf53704e645714ad8204ed4960d31cfd3a91120d52163a099222faf273e322417bf9cf94f656b4054a78815bd693ebe28b12c4fc27f8e6d2f57418a7a788bf6a3d56bf9e3f5034fdacff7f1d30115fd768d438f95d673fc2170a349b028ab4361aab73ffd6d3002c379bfc206731c5a683c16dcaab24d36e7462dee0379605245434ec861056e30652bfedf5c05103a9c6d3154a8505541bb7521055864344d4acc04917c64881b2c482a3bed3c5749338e161a41f8b8a0062bbf014e67388d248d90cb8396a50016a98c0811ad8358820e4344a5f198e775e3792de29dbf0632825fa41feaac5b600d3a8cce527fa7b16b7631fff7dcdfa6a9c24e06c8d42d9dc5393c7219c0532b83791b5fac3a8bab223e903c41872d80d686b9dffc95cd80e57f8d09b91280bf17b8689a8660446a3142b4bb074e6ca48e98995d519db88eb67ecd3cbb201eff9e22e05bfa272cd0b451befef2b98ecb696b58f367f15b902c54f110a8eb49408ff8825e565e40945f96b408af7d90f650dfc16e565b10f60fa437b876d3a7d2bf2899164494e411e12a9da4e0a278aef0498290ca21f75dda41778c235afa2a151570e5552006c94d988cccae21be79ac257dec863a933749eb8b6460f9b9b3893eb4214cb48647c29d4d6fa9e1c52e410d94430e203104230033e2519b5ee6842c85e514bba120bee8dbe31a0c736e8d8f9a166a5f0f169cd12e786828c419bf25f76777ebec41f73c447a5606fff65e919bcea32aa1c541a706ef93f810a6b68f09c7ddb0f394a17a804ffbbbaa173a19f75224e420a2e486417d4dc27e9ea6730f1beae46cad66ee05531003e64c0a625ded44a3cc44b47c02e47912028e224ee2d6a499f55f1a5abcdeb7027694315ecf231729c2cbadbf56faca50e34ec3244e3031b133e70f4c1afa8b5e64e6eb39d17023138cb0f7cbf781bceca17209cc8edfb624cb239dcac20b40ffd9a67f7cb1c1a865bd097e831e3427df50add2a17c918646ac8736440869332a11f8e1052d6d45f069e8084121b72eaca06f7c4e900caa57406690f20945e6b2f6f9017bcbb4d867cf1445e2eb7845b9c454b7e6681ba3a36c8cd51e66a6ca9efe42d59e59d39a8841eca1512bc44b7901ad4bba1d1693791991c42bf41a9a94e12a86e900ecba31f7347ed8c95b5878e24a2012daaf09c587ab610f50d30f010f439955ed48015b3aeb121298bff5f400ed805c4eed6bc8accaa073c36dfb3b9f581bf10c078e1545b77fd65560b8500e9b1e3dd2b38056fc0ea571bb08e6a430826db8a6f8bc104354c963ca04ed6df2e3f7854a28bf8ed429b99f7121e0418dd7116e72a4fcbc5161f67d43c1e5bffb9f7a726725c090cf4a2432eb90feef702cb2cf792814ef8e5f77a046a469f6f7ccf98711867d678b0109e3bbe4959b6935e204659606a6122d6ff97282c544d56f205dc56d73814c8264de227ffb6daf3ccc2dd42f5e409ac29ffac93ac1f6d9c031190c695e17e7ec5bbe35bf42bbe94550bacc61466bc7185d12a73d385751dad2a7992a4613e4e0646ae3a7a85d313b24534aa822f2c61b4e1bb8a3218c79ee81cfb2236c3edab34451a41fb444376bd42d5622fe855ec0e4be387e760fdb2af0e9c3d5e3bc4dafec564668aa9f25f45a1ffc3e1bf2ce606163f680d7b5f7f666adf9662508ea09d4e305167ebef85cab8375ae0db1b28ca20f62e85098259b20f247bf32dae75ce613dc8d5005829ee24fd9787890e8af716a5374e70faabd91fd6d8614704197bd75a8efcdfc6d1c2e05cb52c75be19852667998d0932cbc931bc393aab7cefec8e64d64144448e752aab91b4437f186969739d734547c48c9ca01d7e8349352e26e23e4b9420c2224023586143a45018088b9f589a7aa0670ab82b8496f2a361fba8047d2daca42f1eb311990b48eabf6d90ede124cc64d89b590a82842c4726a1d7482a69677dd8b1ad6343a25a294e19274dd0dbfce74b8c3668bca3b9f5d21c667edae8ca19a2ec243ddd44ecb9883ede90f055d5a6c33116791b6e95585513fc90269df23fa841b5fbc1d6e5f32548ae6ec366e67e3122af9c613ff0fb4c59e7a052b6f0d88aaf26a28eb800543c99802e09af0c4bb00534f032c1d2915b13d121d3375c5cd5e481a78ef1291a4b15f1a0e9e6c335a6d43d47809c512d55841ac67c503f8615f06705be14ebb6fc845189fa7517120aa30e81302eda0e50e724a96497d889994385e745125ed76c048fae8279053470d0f3a6608a815e9d7053c1d80c21a2dbac23df98c8fbe5498732a905fe451752f99a7e17ab12fb3d808501fc27013600e9e6083e9a75173c2cc25f4b1f0d50431867369033498aaf0edd43e7f368dabf8df07d99b4866bd59f966e9a6848f1deeca9fb211132c1c2e103980d48ff5317211540fdc24caff7eaffb88b50d4fc5b1fdfbb2ff34313eb7d856aad66feff66c149b0ec3152025438b259186b7ceb1ec48686437957ad6701f6d8826f6eca9f2463b4f0c351bbda30a86727853588fba6e77414792f07d8d54a316cfb17a84dab0cbc9d4c0440cc744c58c7924dced27aff6ca520be21caf68daf250622260556ec6b00aebe1e0c2baa66ba2b7033e4864d4bfc5d30bc16fd2f1bd194c6b69cccf645a60a7333d58d60291a771eb7376b5262c1369e0c4270ee629d58c77e2c11689c01b6ead5a738353a75f4fbe47763203f9fad4716399e1c47d34c7ae3c9f825424fa4d0b74eb7d62cbc7fb1079b5c3b9314bddcf403b26fe5ee2bb9af4c9e61c2b3604b9c0738d7abca83866ef4dbab83aa70844419a4e655c68c872a26018c1d6ccaf60d8744b36861efefd2891c1d3b244f1f102313a5968c1ba2a47c4c828f8ae38750f7dec29d3a8d9428cb369af16e6e70f598f58a48738211b29111c9434409204efca0c7794e3f23f7cc88d0aac0c2ecbfe16620472dc68f830f894b01ff9d150c82d08519996c598a950da22b2ac75892979816517a9b812e39b05b80c7cd237545e408ecda959aef5913aeb8a17354e88a5d888bc8a0e313514c0f03abe5b66db43689de6873c3880c9d352f1a44b076d3cfd10ba7b27aab51775cf3c8a84f03b7851b9831ff87caf6db61b60a647c9f665828017b70623bfa674fa32e29e4215fde1ca374e8374b46d4285452ae89bc052b92da9e47e632b4c356c689ba02664ba616d32d4ad4721e27380858230a7929b641f7750c444f51402ec9fd9b2e1252b271b486db5258b013ed719e9176d036e90f853bc9d6c81b58479f8927bfc73160f97b7865f66b0a47a108cc8f43b91b84f4151a7f0f2f99c72e2d5134e53bdc2bddd05a44cf961921b904c5aaef4468e4ae74232b858b52c3b93c2b9825c93d6548e1f48ff3f2021869b08b15f3bac458cb0cb8084658d97a2b427898706b7a91905ee77105295cd9d41e30ae6d3d1a255ec9c6f921b704d782e9fc7b34924f0ac30719f58c5ced3d3e6656e2d6d8beea3e74b5d308bbfb4001516544a3d4eec773568d3e57b231357ee7b9688deb851cbacd1fb846f8d4268165d458831d88b7c45305291b5c88a2331b915208c0f2ad11f772703f09cacb33e3fc102b6a3896e271643d70846f54766db86e8528f1bd1297089323646a23f2406c114725287ff14afaea2485c3853894c9e3c2222a1411167e47a6e62c9a2effce23220901ad463c069f6941e6383b631727f4dc33dc18c824577e11c2f9079069e138dff49a1380a6e95ba750e32c3744aa4a58831f871cffb405c5f644c6c94e4159114983d1b4d182af995e443cb4387a2b5fc8132f4009511bb910171fd7212918c1c889cdb3b9ceaedd0bb13f2f56082913179ac81bf011236a0a362036f42d102c5630a40d05a644f0429a2e9411e6a0d3ff1b6688e17b6a956f0ca165c520ba6a1fc38bd0cd3049614851e280f050a3f6ad56df153443f89d321ce2423e864dd143c5fc5c137369d51c5134a6218a78c001a20c3743624101d1e6b498219e4983b0c731acdc0e467e8710c6ef2d16a2e24943cfb51b42d30cab9203f5fe1d337351cd21da0e95e09ccf20780d1d2a35c89a4fab9c41e356233a0fb71a3c8c293642ecacc391db54db477b2f88d5af8d93cd8540887e9f0ff160053511db65e921f3dd4a200e2d8cc74150daaa8f2a702547fe10371d39068105f2a1f29dd2409bf3b3de3467446cf180733fd6514421aaa4917cf12b0189b678848b9ab3113b5ccc9b450ed0aade232d8a844f55418b069edd653eccbaeb58c9e206ab0064d518011e5054067686175daf358094a445353024c3fa77e4c1be2cb8233a21d7ecfaced3fa125624a192bef374c1e5573771b1d44a03249539423236e582d0f535a17bfe2b22885afe4433aeeb42fe4ca54c90e4dd1cb0a7d5ad2af27bef0fee2aede1117669f5e4d2fff3e40cb60ef33842d210ede1f1bcc98a552c0b6f5e9e403c9bb957a44db15c017b7c9724e5bf333d3027c2237b398fcd111ad6c3e4bda931d893255eff057e75fdbb7b995c28a9de6bbae5bd37137cefa0bf159a43b2bd4e5fb3deaa56a37787c099c7208320af5ae91ade18e9bb3b68da538c13b8800c17dece8e6238a3e10c7715364f06cef0dbe606da90520bae682dd015c484ee3c76312a3b6cbcc3d180d7a2e042a06939b970f294dc8384bf599782d1bbc28cb1cb146d0d11a4dddd7e1f6e32133e2b641cb0120bfd51f07c6f01d2bc459342292eb81802d4e7ed74d3a1fd3fc892f1b0c89409d403e8430c72ca7a587260600135e39784dcb4eeb136753cb21f78a5d67cefa3949af547c2da385f845690fda3e93734c19c0dc80d79cb8741811ea017a70e850357f57f4948d3a06985df569a422216870fb482874148034a0fc0f063eec2665848841e5661ec96118d0c0e93902855299dba11278206a61f8e366ad6a2620f1437fecce6646eabc21f3b7157a354eacc7d5106f6084235dc04e40d2fbc6d94a90617b7e4a6421a27b31ce7b139209258b42ab32c7a573d28974ca359ac4f6458b5001103de354b1cb6ffa9706b4cf3136875eda80b6c811700e0a246aba26c0bb396bce6ea21e9276d0d26529e3b55839a3257814420fa720dac32552e75bc766a3772bc5760161f89f93360ec257802b9fcdf0f115da962171eeb2b5ef855c6740118c8848271af549990022fcc85909f96e48ccd9bce518466a9eab68ce3a560e7f535a6e9d5742b0c42fde9c78b4d2c438645eca91243643a1cad30f6088978d291c55bfe70a553a94e7db431db88048a880f311d576195d59849c741c8a1d3fd02a78bdd237be6d6d2518a3a08f264d531876e9cf71a988f4d1dc6c2e26511b517ea380a3874373f13753032833ec4e874320919355d6e9e3ae56463ec2f511706ea30ab8a7d94ef12587fb63ac4b61e6d117c08d529ce0fe547437939679c2f62659bba7af00461245863a8b3d6cca0d9e59cd5a1a6ec697a79ead8d3c343d85820b1d3da02d102901d1d3885656161877b3f782327b43b2a942772cf97252b3bd2dd1930224aaed8c9b420280f3134bfd5e8b754ba8bc50e7d171102903b2a0d61f87f8e89395473285f77a8a214cb2a9a3babb014c8cf9ab74868029474a6331d4cf19d77ae2e7375fd3603a0a0b2dc1ddaaa4ed284f947771bb17f6c9f95419e774a501a5000d9a8a80c7d09053c8b1bcdd0adbe4435d75e29d8bfd44aeb5e421374740923e5d92157eee20e1d475cab68b7d334f88e78f47e65e4ee54231174ed2a162a19188cf11c4cb4e8e3d23be89aee2e9ef0d5f936416ac9ad89e0545b9ce40e485b3d7917006820d3dda9c596429fb4fa3d8d227fe19f88a04711c3c63aad343be72c290e259c7dafcc6cda5301517f4ea18b43eadad1a3f5dff3c7cc0cf950f42de4b5250d29874393b858f30654fc56fc97493864d942ac48ad04133eb93a7be178be46f38a5ef0f3d28c358b383e28bb8f1548a1a93d652816eb3b2e755843d8560f5ad463e44d7660d034980b68dd55a66f2a1b09a429aac534605f9461b7b2f2d6b521c34d78621551973c577b19b149fba2cd0a01ab52611e89046b3404fabc40464c00c2f10b61eb04bd490e9a4a735ac45e7cf1fc57cddb56eb797ab1903b7476ef04ddb73579dbdf29ebb2bcc409f048cc68ca5c5b483ba579826e8fe0595dd0a058e5779094f8dda0f3fec5ac1f69099c23d21c25c498a8ab4a5d488954dcf997600aa9ca213f22d4b30691c589ffdd5638441caafce3f87f29068c03eb04c8ec999982ad09761c22c313a6f14d6e14357fd6814923e2b258006ae4616e8af2b45a36ec0aac4bbd1534b709dc0271a5ea6edad1be398696f5688f5d81f553328178344b1a5bf0330ad2cd604dc7b37f2901229a4a21443833766d624027f5d1c45e4ec328aaaaf0d56afce05d0f63725d7805d63ddf8cbcaffeca9d3f013edede3447f2de7cfc64ffabde9786baf031fd2f44da6124abf4f48c2782456367a10992fbcc9411fb8c3884392d4c35f7ab59825b880ee0be92be80d15f3024a626e3b21155ac4d33bdf0929b0be9f11c489f145a1216ae90868c4c761882240f2d53932b44bcadd21dd7014f2c69db7160a419429e66d7444e733db165b1c7364524d6b7d26492bbf21f8a54fd65c5605202cb4bc6d3228be83959b48aa430122162b13292cf10df66209498745efaa0ab726a0178b5a0157e47c2a91b88780fde1ea652de6cf2fca39415ac19e3eecdb650ea97e6d7e438ed8e71bfc57a118d6b4a7eb331792aa79cb6614cb4fdf05bd8ef3efedd5f44b8c341684724c89c163d198a96d27f0c1f289c577da6a0423848685969fe0bf1273e95deeee598301628470caf0f52f5af6af7467d0e7c58070f43306e338269138209c904bfb968d394ab3570e44882ab0d17c411e544c235448e16c52c9dbdc39196ebb7fdc432b3f5c263e9d9b1185663d57df65d7cc902f20e99a12e4c186937e6bcaf6b4b542768531bdc98422a61ca7f74e7f131f58ca7b4d6f158d665c0d03ec5ca87e25314c53e2dfd590a9ddc413738dc8dbb90a1e77e8b2f97e16f48c09e52f8f2a454b2ef67a19f2155c83aa9e1fdd9cfb2fbacc2ea79a4037603e282227bd6ba2a73f6b440e9e51b9081a6e2eb8f32159943efc35d03623ea32b529ed3e28e3ef97a6280d0a9f026604f7c1ab4995cf7505e77049240a78fcc34a8a31dc1a45e8558f6330dbe2d7430c4bf46c0cbe4db704128477af97f1be4f3633c004c757d130c96e23d3bfbf217bbf673c002c7b390c47988c489785c8cb2eb15e146a895fb3051597f76562289813f6c71ce18100638c89ac881b2b1ed30de78441ee8f2cb46059f017776d580f9861acef1587dc878b2b8bb12076731a7a19e05926f922b8de06b500560fdcec7287492160ece909c510bb1f2047cdd810006782296f7d7b120b6b9adbd5004341a792b6456f239250a1f4bd61502e46d4bce8b7d0d6251d8adb492e3d2d2e0014b329a48963c5ad8c496b7b06821f9b85441e3341f1e195f16b8a4ee828e0891621821742c3ffcc42bbe4c0f82a5c0ae5bae556bcd39cf10df2ee0bf10ffae6074b84b572c0520aebbc13211a406bd4d4054db8a0ffb377e0eba46e4089610842daf2dd59d7037f1b0e58cb79f301384637d425248d6f4fd9cbb87fce6f1a676faba08a0179bf3744cdf68beaea8a25df1f346af21891fa5e38fa86efcf6b513c4f2ca20df8060e78ca138a41faed1bb023fddded97321fd4508898d0c449c8865126a03ca2a17256415e6a62890e18938360be0f5095d283531925d3e1cc300b3041add4644d2b35edf42dc7e3b31b820ce7875ec72f34bc8391063f6f2fd1250e9a01c95b4750d164dca78a37dc827e38a1061b7806e53fc986fc716116d4fa4b836946f2929e8a3c416ec2c75ca5f4a5aef82dd47a4877acf5d2a5d3928b405c81df4de5f6eda7aa8b58b204598eff38f1be79e39b5194f7fdc38f72bdb2ba853d4064a694e6f8c673dda9c7bda2f0f77a33a405f70005d4d141a96a2a0a6b2693b18c7c2fea1b8e92bf7114787f4facb5d1d534f40769b6857bff8313388b89209fdfe8e3ed493ca132eb90b168ebc3448fa0680a4f2209fc2bac035d638d1afa123a3c46526c4a369e2b19b185b775d12f965c4be5be203c15124280fe0783a1c1f116d70d06fa54bc9a9f31615d1f7824f3343a9e31d69acd64f41bcebb5112ca3a36dd9a713ec66a6989fd99c2a34a49a4f51f4da1adb5c1196394919155bf9035f61450645f77942d4ee2527e656e2f1b8e5170764a158e19d4f21d42e83e0ef2b81e9f0ac81a176a79ceca28016fb48d5a69bab3421d7819ecc96eaca09c0b1b41ccd98691c62f1e657f52926d9132f9b53c4724a67ee026c4cc60cb333a500f438dd23300344eeb4a775dcac8018b4abadc46960f7aaa213806b646750ba9bd4efb4fc5a665a9cc45a3d118dac47fa09e733022ea6809442ae2ef4784d102d1bbf39c3ae02511888c27934d908c02be546e1cb34c6d138af7b4010aaf0528113e0a2c5f7180d980e913914af436bb06b12efea3ece6db048ea9564d15d578f90cc47cbd5c00c72dcc6b45b186a265c37468d126675a407b002a60da8e551b101106a6eeca3a2e3fe2bdb7b6f5c1ab09540e6c40952c086eba541cdcc8b70b885a09d05a1707c0ec7d7cae6b62e27d67649fdf918c6250f9f1691b67d07314f34580b9b76fb8c6277e1d536ae9aaa70c9fa3b37685ae78edf57623552309645b250d4a9927a7970f03d8f6c5a76958ec3758a40e8d78cc9b6de0f89b75c03b3386c4baa0609d3d1dd1d3335e347c106b16d5474b616624db3d8c3c1802ba20627d73473c0082fd57f89149e0c0fac285b80b0a601e961ec672652bea3719bf5a75590e66b6e4f2065928ceb004aa7b42551700e6d7517809894607c06924cd8e4165c80adf1254b9a50df2f0525884a9c12aeb8009904c4dbb276b52e26b666544e26b02f14cc0db59369902bbb551cb6a077e97ad55fec6c0b1f681444ca2463510b560249023b02366c40df1f24bac312f258944d5f504e241c2b007845849628b7b71d1daf18afa2103af0cd2ec75bcc1d5150b747969566e4e5239317d366dc4a6630be1ec66a55c3fefc33e6dffe9fbec7f1c2b79e75d548c337c75bccfff3aa8c00bbb7afec82ef8ea574ab2cdbf3a7000324d2d3f255d615a581558e62b25cdaa412644bd7af0daf7201a3d1427171864ca17a32e09413d2b098a2556e585aff7743cf59ebeb4b18d6468f8ea791eaff6ddedbbe81ee2426cc8ea398daddb5d65abbc7d3d861d45abbbbbbf67fa90ddfcbf116dd49bac125bac30e0fa720a17eb57edda979fc305eac680d30b17487a4a25d33c2284529473071274d93b00b0f4311f12dd5fe9fba3c1371f732ecf8e1be6b3a091c2fdedefe11d188b9cb3978ec557ddcb08f93176b77272948ce82a4389900921cde0f0dd54a08b6eb4d9cb60573ce097fd0c0cab62cd956b258ded73d9c937e1f42f30bd9197e7e86bc107f2e042467134747926920a78e1faed6d11718ab66c57225a94d7a3071b2b343d71f342c584e068f914cdd8365041d5a2ea910818c3051c0a9ac2d05590d969578ec5d91c8e347d19843007f3f043c3a70884b3cf6ac7262477cfce8386e65fd2d8ebe8df5bb67b9a9bcb78a27e2eec80ea80e872e664e4e8585dc480c772be2e4d0e250c075bd55b959db46b041d784d472d266d0e25854c4959ce599ad2853231b4bb11dbb12c3a22071221a3604b66382e6cba504dcc9160ec48b45171b17d9d697364b0b2a6b8a95745564d55365430533f596947a4346d141b965cdb06057ad55eac9a9aae46444fd99369b9624dc5298dc4446d82dc1893806525844f99bf44b24a086043385d09c9088b01c24e6014c1e1354721f9048a6bf000e456a32273433cdd199a12026b962b5a952ad2d6529e44e8f5b929d988a9c1619163ea4297de1e4847d29395b924eb93382996c11f342d4c8ad8435ac0e47280913f7fbd2912d45148d5c85585bfa977688248b6c455ad4b789ee0eae1047c393826ca1857596d080951ec84d4b9435db179024a8ef02eb7f39e5ca4cdbca17099833ab01e683902f159025105e6849cfabb3e8bafc3a7e148d1af2b2feffff0b0ec7de940a73141e7b536a89daab996021b889a93d293ef389854982a4e8cc27b347eda14632b2d6dafdfdddb33b5b079420ebf62102377bb6217089eed0b32680fe0fb81a2698ddcd5a09b33be052311af09db3528e21d1c3f7887e9f9d81def61de5dc50daac75d6295cc049e7b4426667943f4832bf17e9105a924af32aedcaba64f87e055e65f684448745f2ebe5456e63975e5b1c991088b73aa81e6c8b97e2fb62d3863901a3eef01c167ccf1d7abbc30b05970104ccce067434cfff582de067476048f41bdd347cb5463a406ba0a001afcbf1166f8005b82fd11d62953f02ac452e1cdea69b071812ad570dad5d80576b6c556670a266f1fbb56badadc90f01b85610e0fff68691e80e7fdbfd9fde323670bcc57f28a1df538a9461efa92bf8796bf48cbeb7d65a6badf5084917a3392b185e8e1cfaccb82569e9690742c78a6aab35d644c3900845a6f5920bc0f304e0e2e9ffde938cf03d67f4b66fa81daddf1dc745fc69440323bbd655baa030841349a6f60da609c69904b274004deb926b41c21641473651296120d44e98bc4842b878ba7cf8e7051071764f186a9a4e2a7e46acc07698da96a78f0677291ec0cec490bc5c50533b9a8a9bce5c377aa6db923a2714a40d4e0b16eba428072ba56a8347d8446601a1ccc4d5953db390b8b0484614b0c302dd98d89a99cbd83382b6295c9a9112c8d4868e54d7768b64daf4c1e91dcc444549e5b1f00839210bc8e9dafe5425d3625e468046ff5d648cc79221c3257f1c66c9cdb5b77e5c94866dcf57248f3b4461c7186369d5b1bbbb94e9f8d831c6581a3571dc81e32dbe52e667ac2fdeffd78e1dbb14e7fffdb1b4e597ddfd1d3f5e1707184dcbf835b9fef70cf6db43a2d3a1401251b9d67860338339b19d6c5328158d454ece2763fc02344a860753249373e683d9629cb62dda490c3eda2b4fcfa8fd7f779ae1dfb87d6fd7ffff8f14cc4477f8ff8fdd23ea83517c043a30fe3788a33241fcff1edd39feebffd1110c5f6ffb8e02fdffffffffffffbf1cc5e78b16a56da1b21b632194c10731af0604373176aa2060236b5173c64742fbbd1ae7d7d821c0b177752e5fe4389c6862317c4dbe75ce1716e4c90c95a86153d94a71c4d8871d023153714691cd6949b1b9f546f8c681a618d5c72d286e09dfbc608415a22c038b42455cf73eab0035f634b622e9670643a547aca402da98148d00435b5b7163e4d9b363a8d211638cb1c773439f4b2547814409e88a4b69878413f9abc993e6996c95aca4e02d8ff6ffffff038f1f4523d4fd757777777777778fe7c6b126517d7bbbc11db46bca8ab6f9482579ae34212671d9a757ea00d6b1ffbb61d654173a506bcd517cbe2e26f48c73d65a6bad37f27edfcbf1167dc3854b74873fadb526c14e6badb5d646a23bfc6dcff0fd1bdecf66f3c49ad2acd535fa81820574e3120707e3faffff7f48741f47f105e1a8e566acaab4960600925a36a46a0a69f7844463c601cc75ef330aa130e7d3a6a40d08ad20e546aa83d285a2a2f47227b62b84cb5758746a898211c2c8f214143556364d0366272e73dc9b38c3c5efa93a63bc7593f6e8781a73667a9cf35256723c24628cb163ec9f947376c78e1d3bc638e39c7334e79c73ce3963c78e3d3af45edfe79c73ceae75ce39e79cb3fe9cb331bf4663474dcb04da57f73e9f1c31c618638cb114e36bcdd75178ec5d955333fceeb5a41c9c16eb1b5ad902472a65216327ea3c586d316e72c18cd984b420a249d151b26518f9be8656a8519944915c6b84946341bb0e28c153311af09d3dbc767def2c5c200c4f2ab61595faf0c34f11aeb9e8d512568b0cdfafc0db81d5934b0c3b54663fb8484c264c040dcf16162868008b0f668ddef6fd398b38fb695241f3a62ce15e198830d0ba62027a823b71136a18120370b56b6004852fc0cfd92bc886c86d050d2f6699e30e99a0028a8888042d0d8f032a5ed98856b5e70ac2f5524a95a65252a8bda9704dad6aaaf28aae401bb0d0964d6ccb7364b47d197ace6ea6bad07daab51e7182426464b6eda9424137e0a0972b8d8a123a2259ad1c6b42017f6fb846a23bfc6dff81c0e424cbfecca99c9568a86c00c646a2046c6a666aab85a3b46d52158d50080c84a1158abba854ad9e470020982d00f3191c401cc7a120c759b51514000920d24058904034404c540c8a83c2004118068602c13020140a00200863480ce949d031b70400f1c3b9c8a4976d6f525fcc4dd8bd539e9aed3dcf2b46ea0c0954c9cdcf859f9acbe04af3438b7687b61882f9cb465ce0d636ef6030be0f62c8a432051425871fe924ed3004c0f8c652edd37ce454c4dbdc420c82dc809246810cccc6106e022f32a199dd15f6392aece8c0689aa511d8de1a1d1aaf5792470bbcb44cd108667dfe4c805dc20fc3089c3c9bd2217e9880af5f614c5cbdb339f417ebea7138c306c99b4e7ac091f56c22313b723d7a0e44132939293554d5b724fd6c56c83aa218ceda32a0dc8694066d2613df367ef78904424cd02605cfc47f703000741699da207bfcdf221f21bf4c9942356a72a6bcd105de3ca2613a5a698e7eb02afac0f9c54dc5c0ac87f12e50e78e60752275e992791866556f64c7816771a2230fb51cd887ae9b1afddf6f67c1b727512144e82f61403e1544f7715fbc81e4ddda7baf3c6b709e6343945317f05cdb01df0e0913c3b7aff0e6f6a8d44aeff8d4b736b5dde92580266854d6308b0eb668a8c272f30ba436b9049af6768bf290aa317dff50edea8f085c8b3be2c01c209f4574c8f4faad05de817403a80b22b5db1c0c1dd95152c7430dcef6c5ed06efbb963310948faf3671c8852c7c55345c0d9e592e325e35cf044535380d02c59372c00eda2be5a498dc59cda91aac61d0d8a645e5a77792a8f44856ab88edcbdab337245f96a3fb3a540d86498d6bcfc1a02883489d2f51628ea9c17c6e6e6f9e05563b2241969d2530ab0667d32fbe6cf357222a3b0dba4f25ecd6bc78f90f41812f13f84a0c7c8f1be97c8129473788e252f6eb86b8c61bf5efde3f7f9db4c813187f2113d6ff92b1f7acd15db0c9b5c3b7031a1fb89c4b509a89d9e15f77bc6f5f66e24a796d2949daf0f3699cf5ed4ee03a32b42b32f1522ea6effd1485aed30044d171dcc3be79836d67d8d9ebfda8cec523f40c20fa81085e167041341168b79b4127471d02575dd195db75e071ff63eb46bc3f0741dc23a1cc4ccf04fe45166724fbc107a7a3efcdfbec88b7a25df05d277cba1b185ee8d10ebbd6475b03bcabeaab3607a1f21acf34c726ce5b279af1f1a675bd90ff399cdaac7802a2195539adac02911e4f8e0d466ea182b3017449c6c8c36652bb050897fe050ba6bdf444ace5abe07d1f74ed758bae6fb37094f883938187099700e9333f864110e8ac0e553b416ee60f3aac241cdb5503b53a3759263ac85bfef5b9d73f280217e8f2377f591f5c4e3d220248f982991dd5d8f4189de346f393271ae5ff3961cccc7d1a79013aab63d9af1cc63f305a546fd4b25fcc01ef9c61eeb9e2feaf11b564ed107ae2cd51e942e4583b386c06a2e74e4b090cca69ce9509ecb4544eab63ca29bfa2abc5f6a072fef24e4b07bf3cab73654fb637378a58f072d0fb1ca0f411db3bda6971a5879b134b3738604708774c9c15065910d1958a7ab6e2a2fcd549ca0b774c103d953f11106690d358254eed5f5dc1893432aa43c952f86a6da092d04b452706318bce0458b40fd61ccdeb46ae40240d727796ce20554ec2b7de415eb89ec53083dcda72c8d3786d5dfa3ed6408354c3a1c4c00378927d1aa6f40cb2bdb03142bb959b418623669237f1d0203581244c22846eb5c90c455da86598913548c4e6e3438a28ccb053ee4b06ee9ae43baad8175f8db8be41a273b235f3c97132210925d4862f5ab4fc2c70263de0a55d48fbc4a042b47e728adb256238c89e5e82a98f9f0925ad87ed9815ba457cad89007970814d17ab28ce26ebf7201557b2c331ebd54d70da9004d0172297b110af864c80cc28cb41425e71f3a2faa2025e2f6d81c2d3284afdc6519f7da4fe7c38c874b05b3377dac6bb089a1ce4a43d303657166ca4300e40b5e36c741a7206c85488f1545747764c2b187770902b0d81b059f375888394609e992a3807dc5d29bd85ee2a1c2404909f0190fd3b352b843e37c850f35ebf645de81f5f76e0ac1e2412b3a39835fe3bb8f6647406c3fc719fcfb07d2598e61497392132b677b00aa50fec1771af426f1fbe4fb007399721d886e72bf0152c40d4488729c0c848fa525cb4f53434e006ca02fa4de3f1413a2eaa2f05f2b9774dc1d8624d2816f6201ba1ea356850df0c5241426917d86c1b28eac209cc686aa20f524722a4c05a17c2e4e70fb22932b180dd880c02738d4746c4294b8de18486961531bfbf930f529983c5028809df17d879a0fc2326fdde677fdc0751916a300354442a8b42c2de26abe95666da70849fb7d46e19202b34d3fd02c37f7f4f0640d023dfd76e56d7b41dc15f19202f630ba94cd14d290f5e18a9e398efd011438cbbff7800e5efc1ca5fc51ba00d4a9a60bdd32feba334e92c3426a10f8ed711f942b92633bbcb0fa1997f6db6a58df6a4ff15621926dbaefbcc6230693e1bbad5664cd00f12d2430ce5baaf9980cbbcac9d713f15d0a0a97af02e630b2f5128c0b06cf3a445eb62911f1744ed5ab8e46b0d3ddf2acced6c47120c922475e2cce3fd05bcae89e5909e8b3e2bbd0d9b813da4d34b5c4be0494fdc715d4b2915dbb154f832650c7fb6d0c4834eee1dee5bf7387dc83b1aa276ef1b44b9889a47c32b663d5e1ca724e9832d5e14d5ef4ed86a913af60d90859f15968abca9124da5b6f5c7e47a50877727444471dc4c218c63bebc298c5e4c0f98f5397500d2d4ebac3c1d7d9af48dbea025b1c2477bb155182c3ec72dcbf6998aea65b1b0b5dd171267903b3c8a16209e57768172bb6259745172c8c53fcdd0a8eaf0d7c043ca7f94f637d1d0f3c7d4eaced74da183c9cb79e35be9e1f0104b4558b32824efed8fa8a7d525fa5b5606cc0376090910d724e1134bbf41c0b9967efa60c6761af048d44fe4a06faa470c51c48c11784a31910af37dd16e60d80da583e2eaea428c20b5f0e75d0ff0e37818a5d2b3c27da2d0f8f78811026a5b494097a90100a08cec0eb2466a312c07fae483438b9411f298c885cad572a5202879be02841a13694da3c6501298634b7dfa0d6ba1b33ecf8dbe88a7fbf34b25239d9c13161c4e046576d3df141faf230a91eec9775cf7308c114e68471de510b070cbb53605a5c04dd386740a112fb1daea286569f75b927d3020f846ae5c3b8968f461bf403ff6ab237d16968696f4e25b4789ed9e97cd51550743e4988a6ffba82c714b7449b6bd9b888361cc99df147fb5bacc458377ef6e25bee5fca31f312645431465dc846a41b8fbaf964b04450c712f2f1b85ffdb5bf4fd8a8505cd559b678df09d70e97d852026607f8e7dc646b1d15b74441fbb55afa97aa25419ff8d07725d7edc4227fa79be12842f946223202f3f68be267edfd43115d6689d1bbfc0ded4f242347a21c53285215a8585ccf8bd46055311576280e82da6ce830353f3c50668cb79096f083d2a6fd109e870ab26f92206e836df2343cf1bf3736a291892fb1863983ee45075e755caf3e611fdbc23c6407ae6e71feadde0bd591d3b9e394d840715bf91aa102cae1352d14c6e9d424ba8c5ed0ee871325bbc2276d541590434a70d7d0cb6206ab52d6d8f46042f5324266de5285fa424dec52ec24f9549b7e84d01e0f2bdc8cd73f321d759e43235051f89338e2cbecd20e1fecb4c386fbe72553d696e747ea7ca0c50c6e0390a91861425a8d8259864fcc16ba03e2244ca917adf3af2005ab5421f52214c04e5830e2244626d6e8743ab15d95d637847411e7223ee34c855715bb1d335b30192b76fc746904c46b08f07ddc9b0ce8a52f47e27d058061a2bd46575eace1c6ce795b8f2abdec250537913ea35b9f86a3072e635426e52ccf47a603ab3a55987034cb1be6508db00ae2291e2c054142f395583c6665c4fb54351949c60d4809c8523fde2409f1d51fa81a370703dcb0459ca32b5a754a615d89f8028ad304451cbc6912b778ed79390c358353c84c8919f1b2b404c467b4bcaffb56f3ace83bc86d81150184322709e17ed29175c82ae4081b3de5bebe3154b6c616208f058a1009d44a849a1e474a1777a75a40161077cfd351dddd74626aa568ed465365c76cab547af4c63da7e264e7d73244ba3c31f9689ad5c9918840b0f45d6b0fb74a5aeec5c3fc6a45fee03461a6e782b21ad631a2473d6dd5f89cf96e43e7119c15a67d6915183ff0232e188984cfc29bcc4aea86b21bd1c7af3835eb6a468bce1156da026fa9adb8f84327411ca44d9b798bab2162ab8ca6edc2e93d28d16f231cdd851d00b3b29e04d1d828db325f61777f68cf01c4f64e66d4cd51beb61e786c5041fba20a9dd92884e118e226485674229ecb3b82c50aca8f5f2b72a3d723c46d99c9382bc368e2a3c8f38363d02bae55039ed83e6194404d357d65ddfffbc0a69d667c41118fa17982147497048340acc629a722549255523a102535612e275cd54f2e5683333ccbc8480888949e72e08883a0d744eba32b5441a24267da5427b6f60fae574c96b9e1225199e48f2b08f7bec805f59ef047d3dfd8455a805485084582d4039200b1da5ca3426d9b1e005280339d827523a66b83a65bd16093a99700a5c0db84cc46ed32b73a5e703ba57dec9a3ba0e3bb9e733061b4a748a6639bcd61b2e44ff52144c28f9a6d2310a2f434b2978b3ab42487920f11893fce837c54e889de299430e460cfbc9d74c822315250a04f0722fbd33e2c0ed24a700cef71b3502ec43100f435b31106affd3cf13e6a156ba3a7495f2c0e306dc023ae5def46e1f81dc43d6d0d5885a0deab08299b3be11427a25bb4a2aab891b00c13561d6630651a5de27b910ecca81b4cc23498abd846f0c1371d46895cee61536a140a038e9491b5a4e582291ea276cbf417cac045052e1a3e124b460a67637d207c5edd55ea4aef64878d8a4ed629e2f08c1667948d35d5474ef4631bfc80416c2cc66d9335a9a24e160a5a2f7ea3c7a5de49baeca1029503cedb12c59d73492a11fdebcf1b4c6760ab88434b6737ff3ddda2d0f802b6bf3a4f979003e479038df7a1a0c0a1d3cfa970a247c5a882b60c660063b3f046733da06a0aef5440e688deb2926a7a203dba244fc22cc8008b80239c0f773f4de01744d4eb67cc75a01d3486641b1a88493c0b40c7e5f33ea6e319c97c9b6085c5059b40cbfa94b08a813fdc342defef9e270711e4128e23cd97e2e949a44856e02bab15d6c716f7f58891842da3accbad8ca03065361dcb8acf07c1ace4abdbb10cd0226e21aaeb9458409e6eca569536662e7863e66b0cddb51952212d0c568945fb773f751943651577160d8984adb8a16d0412ce2302eab0f5441af31b82eb4a73271afba359b170bd3dd97687a8d25513153b0f148ebb5f2a4e267ad994536d727920ac7d672a2aed49d7e4aff38ac506a9ccb43ea3198951c701a06b9213a44414db58af9d5c9c9390b5652c8edc6c1150588e84b08741ae6de65205b799f488fbdb328102db06cef7859feb8f92b0e95d1570c4cbb8b0ad7c88a3b995c5a8a00e8d8b2537cc350886c7ad1282b1b06ce2d519677f7e9e32f03d54ce8dc65bda9320cfa2e15f3900c11b902a285dcd53c6092c2262119d705e5556b9b312e1544bd89bbb2b0754dbc273057e63cb603dab8aca39d1b6390d48cf15aa98c586ad736b0ae19c1f14011e70ef7eec655e3684f55710e360e286083edd619ebda5a2e05e60f915ea696a9a246abd6284801868da26c477b21506add26b2ae1262012fb57e37071e75a6a5bd1206ce49163bd66e90d1fbb7c4ead51e8ca168dc882857ee1cad4bb38173c7739fa5a088267a4baa56f590fa05451da888d4342634ce0e3e60ac7c4def1e6042c4d7b8fb2b27d25f0496b15d8124bd8c35c49ca796148b64afe6230357a947a3bf42a2de141d191b0515b13c14cc351e893407966be479ab233aecc4c9e2e004a59fc8260e58523c406643462223ade6d74f1ca2594aa1940895111775a47d438d1674c3feb8f00057be94b83e3e65b542ce0e4a5c5ebb459708ffc345d22b0b32eb990f39cfe2ccaf0ffd26388d64afed0ad8efb59b1d16505da173d4780df17f69eb9f186fe4cb43a031723069e1c9fb54831bcecf09c3e959c50dfd3c4f078f1a2281c321cc97fbe38fee54e6afa2c92b704127a077b6e94d3b11a2aacdd5ef3c096d8031e918246147fa188b99cee5339d6f6be47ed8fda22ab58874b75b28e57b40424a94147db5be9457238a8767a1aa2839c6ba274b3434b6aa4810fd0ec34a9a53c0225a0de2ce1d86077198be8cd1761b00052ce23e041cf3c538e90b1c6b5f6afaa29242a8d03ca42f128439e611248a4bf40569e399b99eb7f99e2fc200d8a7823dee1ba02f72c3b9eb3cf176d6c0641808aa575386632d4a02711140e41986a880e84ceeacfdc7175f25b1d1d6799d3d3dac5e56da16ba70bb25efbc0a49421f0b4f400824b968cbf7842d109c8298c40fefaf314bc4ec828dbec984f6609062a5b382169f06bf9b10cca91cc9153e3e7161164a2038b7b10b38dc0d3a14a9d7ddd0a9ff7650bbec6be3d41c2b3d1957d05f7902dce3706d8052706613a2e624dec4d48e9e0cdec7afa6ab2f594d47839526203ef92de202dc5bf48957109a2aa0d8f10ba18c9e1965ccebc3b4977b8bbe34c103ae2c5d7d71a136a6f6945f03e9d01fc57525f473dd228acc6ff99ae1a2094b5a965cbbf81db7d640eb0240531ac98b11eed61a1aadc970af7a5da782867e9948302fdb237491261017385281c7f8ba24648808b3f06e5004a5692a6e0f8b375ade33f8732930e57e26253af1809d0bd6b40a760e354096ec80abc3dce7fbbf76792860fd87bdc3a58d0376333ffd0a529a3dd55be79ec63747677be71f485bff02669b354de6cdd76d93906846749a0a566162facaec389b04a34d5bbc79326fba6e9b24c96654a7a9b06a62fa9b1d479368a46989354f66ca74dc84494836a33a4d857513d3d7ec389a04469a9658f364de74dd3449896654b7a9b46a62fa9a9d4e310946cab4c49b27f3a6ebb6494836a3ba4d25eb26aeafd9713409469b9658f36cd674dc340909654674c2545837717dcd8eb34930d2b4c49a27664dc74d93906c46759a4aab26aebfd9753409469669898f79366fba6e9b84c42b702a62fc29041a9353b75b2052b29a745554217e6957e25aa9dc5922518b78b7ae9b0267ba1fb83785fd91f7679e2f596b68f13a821ba27715533ef6eef673a30c0582be98d5f3b81748070f75d2f7516d3bea5e1e6f9ffa7d5edb5a4b885a238490bde5de01ca0b610b7a0b41290095b06ad516d59b4375014479a8a796bebc7d8e96bd7e94a1408934d6a9b29c4307a8b3a53e444448410515474e2ce580062d090e39ec6005340461841217e1ebf5d7ff8abd5eb1bf6e3fd98c8ea433334850b85092024a0a9bd4809555a67cc937b2ac32e529d7226e4540d5229c14d1a4a8891dc0786232737052924a4f66930caacc4f08675dca1ff983e334075f5f73297f0470ee47c75597f267004f5dca1f117e74de3a220c40470e01046026c30180106ed8a8227f623e3f4b207f665c9826903fab4ff13fdde7270cf2e77502f903933f369f9f31c89fd8e7a70cf2477e7e2e913f389f9f47f2a7c6e7e70cf2e7e6f31305f227e7f39306f9f3fb69b10c1e670d79b6f0386d689d855d789c2ac893068ff3863c413c4e1cf2bcacc1e3cc21cf1570f7f03875f0aec2e36c92e753789c3be4f9e171f2f0bdf1387bc8f34ba93caec60648e362b5642c6665fa9c55a6bfa911667a1c55a68f5d2975d8dc4feaa087d1bfba2ba50ef1d67046c70d0a272aa4bc5d311b89cb1443b6520f67cc5a0c4f2990483c340178767c5a4ae9ad65e6719ecf574c009e1db8a8addc10c3cefde4ac5670be8235d4cff97d29086900c4931716141de1e006862d6ab0431730c0b8e005144f96b4200865dcb298075110d432191ea841249922fb21b3a630a5f61409975b2d5a5b2d1c557270c1133cfcc008232a25ea8831bc804282074f7ce1c5931a540f4ba620528a01194304e10533ba84a1cd83d3ba0e4e14587ad7eb9d5d46a0fca5eeacdc2585ea1e7a9a1a99baeba0eb4e1b0db63f12653a6bb3e699dece3d12d532922ecfc87cd6a88c8c8ccc55200aecccae99778febf3b34bfbd8eaa2ae76f9705dce642ef3c6e38bd65aeb575395abe365329db1470f0e3f554bd174ad995a36ff1a5f20eeda53671dfceecca909e2a51d5d24bb6907ee272d9b77e176d24d79d623ec386d4e28c6aa3bf37a654e6fccfb284f1999aecb33ef44135861c284c933eff0cea29996b431076938735be1775baf60157dc47c5fcc14a72cab4c69a21721cb2a536ab96bd467161d65babab375bba9b4e5eff5dad59df9c3295aeb2dfd74eb2c50ed64b3394da82cf3f634a3b6d46e24d3e961df6aad4073ebb2752afa685d658bc42759c588a22c453b831d672d570cd628967e95674deaa096b638ab163b4adb90d7cb5a699b5b5e55a65297b4724f4de9a4ba45a42db7ce6105b44c4a4ac1532aae5041a50a155db2ac4285153e595679d29267ad7bbcdb3c5179926263a3e201794090070fc803825ff53a11fc6743affa87e454bf5ed67e6f708636bfd23d369f97b59170d9261585125f6481c60f645ca1226349054ae060c9135e7056a292b875f1c513337c740c307880e1882d8838524185c2dadc3ba558346126dba4525f7ffdd1d778e391debbcae61409976dbc14b579cae65304627317e5b2d42b347793901b538a79b8d6536f99f747ee8d479ecf7b8dea7d56b3deafb9630b23e9dcba0a8f35a7801051bd660f1369e171d668adc0cae09a8f1caec163cd345322dcbda73ec5201c26a23a973dcc638a906261249d47a29c52610f8f3cb9c1f7ade2bbf0348851a83c52a97a692ec514fd78f2298f39c2d78928803c29d9854b5d905e9a4b1d1e4ef44143732b7deace148f29c2bdf7e570ab0e44557dc79a390e48cdb98fd5137fd49c3bf8855354dd5b61e66ef1e09592470d4f068feccc33171f059828be4ccb3a01f6d7eba91a631fbeb5fa666454aaa7ee389453dfeb02f088a4e90788b2874190931ba70e445377f41ebbdfc18ac7156a66e12673af9f220af48d2bccc30b20ca9c4a7553afb9a377f19cc8009aabce8925cc4c737ac77e0af755a5faaa68467a15ae344f612234576122de45d299e20f8b5f5d2a9a3023832beb148fadd796b54e709de03ae8ba630b7d41f07ba7fe81dfdb059ef50fac293cb28e846670ac3406c43167c59cde185ceba765bdb25e8f5371c0a3c69f181664e6fd99371e55394524f59709b0bffe3a508fa9ef2a95ea5fab0ed699bf5e4fa9f0d859f55692fcd5709eea34775dcaeeb9177b8b86e6aa2bb38b06b3309b9bf9eb85c7d40288be3bd6fc9d36fdaaaa716d1998fa0c7ed18c736dbeb931f131a20f563773a00e32936107676e1f76ebccc5f71dbfcfccdcc3eef865582dd7eaf4495b58b34a334eb1be58e3bd020d13264c675ae3df5dc1cbbd0202c284b139ec1265899174b6a971eb6db0e4b1e3445030850e65e0000c9725243046184c5efcf0840b2e785c199dc9efd0a1337b776a8144d4122c680022a9890556be6c9122c6520f5ca0d508638c1ac0304113a6256cd11428b6181161850d6893faa014a8bba1ba65aef52bb05e14bed76bbb74175384fa8f7e777570869da4a15a56570dd574052faf561ffdcedd5127a7a6d746b59a8f5d9b53a88fdcf9ec7ed12438e7aca9f084b2a53ec759cb56ec3850efb8b3369f5a36afaa42d8af65739c506a14cb9dfb0e0f1978c7e9347ee3cc524407487751f5dde6c0d428faa56f337fed25d3efabf9be8f35184937d48f995532acd319ebfabe736bcee34a39db716b6aee7dd66662b095c1a375b9febd855918099729cdbd77ea349822e132782e770dbd87a9e7f2528dc786cadfa7baab7fb7ae3eb3b28a962e799c46b28a162e79e6094a1116b4e30e90b41d3bc6a01df77406ca7a6bdef77b432565900bc57b27d29d473b787c67e7f2b83baea4331ad5bba1ba50a92ec5c62bd0ac127da868eab5ca6e5b9fa6babb0b540aa89bae6a6a17356fa8eea9af798b3e6a926a6eed2e542a55e3ee628a403fe96c862decc29406830fafcc33f75ed308fc77af4695bacce9f8fcd5a89ef22ee9fc3e23bf57fe6e7f805d635dd2b72ee90b8faf57f6b08753584aaf6b3278762d7faf94f8037c8bdff4ec17d677f6e6e751f78078ecf77435a3ee69f9d379be6dddc51c41e686ca400d85ed7e5969ebe4d44170ac3955638a52ba25414d249bcd092acb5394ce7bc89c74c61eb9d64ae9e55e6fab56a0b9ef121940942b7675b4eae46ec77910d580f8e18b28529268a20bd10b34786184134d59a4b032af539f47ee457440b0f2b8f54b7d68088a108fefc0433bce030ff150e1b1855bae2752faf0183403a23c64deb1c250ee5e3914ea0a34f3b892b6e34a9a14bb3a91a6cc024c14a32da200618b19681300549e3c51840ca000c30bda7cbd126899ec2c9b68410beaa5046a99142bb8456102063f582a401a2670a106209c6851c55cc28b0d52a2a8c005232cac0db8e080c90f4a98d1027089350013a43c3f8bdac7c70e4d7a26b38f1d9cb44ce689447d3a2044942e30e8418a1764a04d06ccc0075144dd60861112b4f9599b9f46452d9bf57dfab2b2891650c164c50b54204313b47a396b325899c7596b8e48a7a7132e34343434b4b26c82082636033a62c82df2bc9cffe65fde173ba85c9d9979a9b264620636c8e34ca572db00a7fab88eab3655051a49ac2caba01143973aaa606a0f7925d327a030cb2a5138c0c2ca1532f862822f3d08c1650624ca840fd0d82284931a9c968031c39082460c615cf14314d40a04b6d4e0490a248458820959bb0e085e11edba94f5660d33008298a59519dcb6789ee7794b64a8b14e3530e5d279d999d4573b5b038c6a0717ba884183105e62a8420233d0984205891280b14469115f9e6e788207189ce41752801962862c9a50a2410466d07083188aa28079f2961041193e70028b253466a8c245888c254e5750c0c318b6951251456c51e28b1f8049c3055dd7755dd77151e8e7759d93c7714a7495721c15aeeb8ea81da51c2783a695560ae5288d2a9ccc0088339290685ce901081cf000091d808106a5f40625b8b8e0d1c75ef5f33856db2f840094131c31d58ac4903243254a0f6e4248595aa28929ddfc2b4629a5f43bc2862b404451e44210ae10c1a248d8b8941103315cc0a28989091a41d48ebba1d383c749a707cbd5e8a1fabafaf2cee8beaeebce09231bc3135298e0a9e988234b9c9e5822e9079b0e4174f8018a891862882245658408370882096c7065076150f1bc26b4845c8da995d2ceb3adfa755df7434de52cc7794922ab7e499ee7c97075556bad5ce5aa95ca71615739517e9f0da0133d78de085750e0e48c1f3ce15464a7dcfc2006286882c50b30a2ba0e0c65a8e779d78158c11b29a14403155037b0420c9a2282b2fc60830e54b680c104b229ac029dcdabfe7decf17dd2be14b284a97f505bf284099934d5274df5247436dfb2c14a9aa4811826a47aeaaaa7709551d596e7551f6b963c0f6bdc595ad6ddedcea3ed4de9a6ced556bde4b9e475691987842787c439519f1044018288264a3ef880046dbeb3cc77d314270b82368060cf1b11edbb30a16f469d8826c516ec87bce2c50a9810d577d5250d26a47bea29acc47b37ce5b9e62ff7d89500c0b4284c3b0202c7426422faf78b182667ae5152f45f9bb92e619998109e994a4de09514293620a4c30a16ffec36de43da59052820979fffee1a146a21dae595a8b0579b063734a1f11d73237c88353acfcccf2272ac10bba3801172f9c51822468314c6162b0898182a72368f2f605cac7f2cc1da4668a972c9552079c72045b1ba253a2f59d12f5a19dd2143b2f73a7d43d334fa09ee1b4f960555be44f0172bf6381ec94e44ff71364e95a95dc46e42622371ebfce05b93fbaf27c8cec916fc91feff356fed08b0f3ff1383f4e5b4dee227da8139d7131833272d3e9c5cbde05228fc0beae043a9bdc1de91177f49ec62e2af7e98aded662c74e891a719758075718366fbf7aebe15b183657675d8a41b0eee02d2e328117264c181a9423482c0c2f2b5eca7469d3147f74876f5ddd7aa3b39ad4013545e8cf0a46eeb76e0d4312a06fb912c89115c31296be91e495a04ccd4d991856ab6d0a37850b77c4e4a618217fb8bfaab050e4be9c352bb9e79cb3451f757e5d77cb4c3589fa886ffb66816ee1a0e4be5d926402151ebf0f7bf855c329479867e1cb6377cb7db0c379a70ea4087d4efc316d5dd745605af6a5d670de5ad66d247530d9b1fb92db03a7adb5721cc74d1be7a34e5b1f0c98bf29dbe655ae78e440ee6e5247bf69a0cc5662e1824ab6c9128b0e9eb20d7dd896b132fd69d41c81e269a369c89f89e7165207f7c3de194567b56ac5698ad0ef6a9509b9ea6ab5ab55a715768242035ba3c8cd25ade08509422dd70b33c17bf7ce3483a9701e4162f3dcc2263aa0692c3c6f498cf5e22b06a958ea850383b92fd3362f07c5dd5ad64addd34e9ae9c99446a23eac7f9fb5afd77f847be5a25ad64cb9ff3d9192fbaca49ec239bdac6d8a6d0a378573caf2b42573365a15c2726030f7a5657d28dc17b1019256b15870da7955b9d61c9c9b18ac86cdabc645332313d3b2ac951882aad4e7755ca53da58e7929b22ea765e1179df5e7ea765eb725b713f5797dd6563cbe7275ca7d10775996b03d3b272dbbd98e09090b7632774f3cbc041ea8a70dc4b2675da714d583fa807f65591ea72cd328ead351510da03410778dcefa4758a46c4408367944a9b6c102f9492b5ff29f1f73709fcd611bca907100e58d91d6c0ae033d4a3d8f7a1ef53c4abdee159c6265066db092cec676c2e2c5d662479d8fda22ac0c42105c224216566a341113d174786260479d3c67444c69e20917650ca1c5484d8817fc70258a1667d0e6757a748fccd208283b0053061543b4400c128ec6a859c11404a31c8840c9051c7a880107693c3d315925d1240b140f5c6a48b24145185e1c5153220733a6bc010f7e30c2055ba400ea0b10a0bec042c5124d6a473968e086265b8c71c512267e5471818a2b4d7e6002c949492a3de1c105881fc6f8c115348896f8204b1730b0008aa21e66ad7283c2890a79c544e232c5484095276198018411675c2171e084963380104605b626e4acc5f0940289c4034c28fcea2b3cb47a78229a786142a278221a6bc55af58a655b2dcb5a81938266dc52234811c529cf1124ada1f87d5afaddd60ed6de7ab48c07eb6ce95bdf242dbc923645d5e90766f6d1dac18a19069e1ebc6c420732b214818879c9e8b4f040ed19800952fe96c2dfee81612af5864a5d66f05cea159c612a480ac7bcbc7243e5e9e1fed25ec2f796b0b76c69d9fc4bb0b4079d4dfa29935e0b08972c2d939928cf39df0388faace659ab2be5aca98933b218d212801ed0858b15a3206088810a6d5ea7477f69d97c91dc45e9e4a9e3e1b146b5ec26c5f6bf8030b094d6dc4566727335f72d4a4a5a031b080720ac00420b6dcaa16dd9d03893fb9bdd3475abe863258bcc647a551219f504441210480df655b668dabea491251e7574f2f831c9233d5a3a92d3ca529639ad2c39e539a358270d12618f20b199d2d064e4254f1f499ba93bcee4d4c1b0ebba0e3dcfa3e1f77df53b2702f9b0943afaf3209d4da98aa96545503e4c9db48c3e6902cc7f5bd8911e39f9aecc324bd9e27769a6489549f77c556545265f52f72065900bbf0b7e2959fbe354563ca80ab99082e1773bd75abf8361f8dd993f2965e394852290993f555da5defdc352ea008bda098b1946390910eaa47b1acf1a35ea9e21ac10363c08c582d356a076c1b6777a3dd0489988921b2bd3a3277694514759fc849a29db141b4069229e363aebeeee685ff9fb30e5782e9296c9dfb2b4c2c4841ee599e428cf0f75cfa447337f8d948f7c60e6143ea2fa0f9b0cde1ff3957a039a26690a8ffdee40b4c70e1769a4a82c5fb191d60ef6601076248a22ca395a265f60256da2c9e21db67492bfac8692d2e4ed6b6639e7c447661e43daa11872b1b25957235196bf116b999cb66542d45ab9d872edb0d7a5ebbcaecb16b62dba740942adb46300522c50d0f934e7a47503964e91e51532ac60d1c79c744e793760a91457c868aa3580b21b89eae086462361a1055312c8a26f5004dba7e7c9fdc67283a7dc544bcf177e328777507ac04a2c3780ca5f96335359f7c8d72b33b55e0c8b0d8cb2c4a245964e50f192c1d65b74c05bb8f6ac2b602978632d0b4f89401d2b74e60eae0edeb1850cce1c8e1f68410c2fe58f3deb4aa9c3e211a41e4889a8300b33739db92c35d8927f32788a472c37309aa20905c820965247084439ee406d83a81a40e5d4c1c971549452073d08b2f038330b4b0da24089829558b430caa95b2a86a7417e323d07da03f527fee09e82a5ce7dda8378ecf0e108da3b72f7b883e02552e42753ec819f4c4ff1117a245f96528777ef1e472f59b7aeeea87a3d05c383233d8864291e89c24c4710dfc3aff135aa300b33bf68779d9675d37f3887c773c2cc1c26a18ba5efd7ebfb38ac839f67a697401d36014116d87919d228be7aef4b5d9ecea494722639c97349d2996d993d9d75b707774b58724a81ce5a36c7c994e72753f7503c9bcc27ddd378a97e1ad569946433329f647e880ab46910c05a41ee7e52477f480d15ac44238f616e245ca61c276b133c54f1307b1926b1943a9c28aa41964e14ed20ef4872d2b4657e8a148a9c2d60e91379fc7c9821cc528bc435fc150e1d78f4820b5f111ab5d6948a6611b374a2c84bd7751d75a2b682effb3e2c4ed454406b2f88609658c2a4b16a7dc10a45511459b6092e2e0e58b4b084c922cfc4b45a3386ca8474d22b58b6f821cf804d802b50de6882e777861d3f266a8801162d39c0020b29b4be610a1da4600c148cb182285adf483f497ff6bbec91bb314c080fc9f1cb30a13a345f31118de25196411eba8a21d943c2e5e6660ea0bcf16a59ff46ee1ed37aa7a28f21b93b09a10db1f7c9f37daad4ccd1b2e6e91e6f4ecc02973bdccda094b91cb92b8ee988efbfa88865e796f5e7029daedf98bbacbbab1fbed197be8e54d639f2e79556d038824b173730a1832de5c309a66849238a0d54409b975f0eddddf4dd7452e19494bb9172834c6cadb204972cab2ca125f70b906595256cc8638edccfc1516ebe9b8105795251d6b2b72c05b66ffbafbeec7f5d6765b2c10eeda08136d4c24c103428f42dc86441637d4896d1c5d38d36d4c208524471a2b1de4227431434d058180acc04ea5d1606655577ab2efa508dab77770ccae255b7888eecfe09ab7ae843d54fbd7109974e565c7dfe864ca5c2637f15be41daab9e1d7e86ab109700549db0e0b4dc0b8375092b675dc2cebc32cae281ba6f55c24a113c502ba0eff8d60ef6e31010ab5618a865f3253889176642d7ef2eb30a574a19386b07ff8578c908cb48110cb46cced724ecc72f8faf7f1f88b1ccde3c92b762b1dc9d8951b1e34c9ef33726f72f5d9edc486b63333d853debcb8fdfe4e46d944d250f8f393a3cdee0b08de171267cc5c0dfc82309b93109427ae84c31852c734a6692a2100a45677da7d92444489078a056ddfbd19954810f8968a17c885b1402afc243aa83a0bce36cbae3540ad2a1b329e2d7486b599a092694bae5f086e0413cf475d28968f474466772cea76945cba8903aaa9822f413a8c5ce536ca50ef9713ed55ad7aa2e4f58a4f89eb2d46c0f1da6595b5d5e3613f569a439eb2331d9dc4d7f8d5ece11be5a961741ee76e326e7023b36d2fc38a7e85ae6301775b95b544632eae6bf5ab928ee2377bbbd3cdbc74571514da27a2a4dcac28edc6d5eb151dd33f608515cd4176ef5495b61a390b67a3bcd79569e2bdc53e86c0676565b37512a2ce5a66caaf8234784b5ba08586f7575f509eb70100b4b3a132fb39074a2ad703fd15977ddb94e0a4b0dc00489d6ef267b44eef794390287975655097c531bbde5a669d83a0b6da746421ec0e8455bbdcf6da13e2ddc418978ec8778ec27128c7ad0561f7b890e6acb96eb399122f455d589fa78355a959672ad9d3c198322aad210d4f321b7aad6dc2d7b40e4be97c5d3e25d6919c54b30a1d647efca1d6a5d890babb7304c48eb318fc14aec5b18cabca4d9533168d5f211c43a16ebd5a88fe744cefa4f3e295e2d5309c2ca3c7a4e3a2823db3a489f592467738e200229c2b441e2207be891721ff990fb0735e476c1529a953c4592a1c96a9af7e45ad24839d63d23fd8ccd8413c75e3359f6483fa7ed9e89c3965191c595cef4f508929a976a302193d67dd23a6c14d2ba4b3a83d1cf0c0bc2caf4acbc34820e775e588a851d2b6da47c1a40909efb73cb7307e5cd714336f37823770e09d4524eba92e7b2edbffaf2ebeb3c85aaa62c04fbcd6ff0908dff309c73181eaa254843e98936147b0b50bc13d16e4e747c188609c18e731c3c740f23a2c9df541cf419f54804727feda4963151a2dc05c245a9669524adc2e2fce6b0faa111787144abf8881097f485867321dae48b229068371f1ae2e2862c37dacd25ad7261d23299817039ca603d102e47dd0384cb11102e4dda072933e12233102e4d40a2dc7d7588fc9937373737bf39ce0d9c1ace713e76546e2815936a88fcf990a48e7e4b115533a24cb469daa06e7d1a5533da427d2a67d4af50fd7aa35390a88fa4498a44a3727796dc4d992ae16ba90873953df4b5dea24449cafd08dc34e0e638f843a2b3a0cfe84abdc13950e360d972c867d4076516548557886872045594fbdda5bd8453f471642eb1bfd209267ca8d1a478691bd2ff6e1e819b7f4ef6bf57d2ba7cdff77ddf57e4eda3f3a098c8b935aa96fbad65e9628daa054e1b4e31e660e5c1b6ad7b3c1baeb05282dc6fa8f6f98c7aec2e48a9d42b9df51c9765e69c5faa93c1548cf9f4d14a5dfa1e327d37835206bb8377c41c7765fe90c2980be3f06794533073b075db49ebdc6d272da3616ae2996692e16238ae7b2bd160b9733178b42deed6dc36d69bf510b39ec2ac4f5c03670864f5cec9f77ddf10ea037b1fcf1c762f672c964d27d36967661e5ed555aa57d6673e73ae6d5e92fc39c0943faf23d9f1339a475ff7e8216d52c26e70724ef1d87df6d091fd3917e7de5cd87d8ae6df95e1c04ff431e72753736ba91e19198e76f4a39386b445632895117ab232dd978969c9261effe10e73f855a3468d8336afd9883f52af77f51790d56d5eadc4f529eeb2b412c6339f07c68ba23efdd44f5aaeb4ac3f6d2d2c73679eb9e35794fb3566aea151c90049bd5e2885efb396e69946464373297d86bc762dd76ab51a876d3dde4aacdb5c31e63636977529869fb514b7152debb6b5ecad83f4cedcb6efb3962ec1ba78515b703fb5ac5f8fb0fd7db5d61da797dc4fd50b44e69883aadbb696756959cc6b2e03825a16834b006770e1fe0a3377e7ba3b735542b2f3b276f3401d8a0c104d9861824c7c020d1326870f592b71b85950028b278228a30a295a7c081d6078f242920b4bc0ef3bea3a248ee33efc19e5e82e122e879fd1fd903afc8cbea3eea94d394e3a75b7afdd59e2d773ce5933424acac2ea5618ca215073e167b80af192d169879d8561f3335f7608bbb34bcf7ace2edf840aeb73edf119759983ba7306967b97cfa8070d1e7be8ac8c66f02893c1e35b38c45dd781e99ef07def39c4e390fc01512faa65cfb3cba4f5ac5aeb539887852e7fd803d3b2d6f1a272df8bea1e11b7130f4cf7b0f012ec627ed78cf493f487a800de157ecc0c44e6a51eb4c862053f0081054c2a90c3105f6c63d020053e801f13255ab4b0a2a9043af04286068ac001aa87a62a68805919e5f99c2b69b02b69206883d591429b6650b1c5ad6b95be1b2a090bd6206c67a34983bd080604d060379a349c8fadd4da618888360445e8e638875d66a1a6e1e02123332c1104ede6528405c130ac1e76499359884586d315b41b0cab3808e73797349cdb37b761d7d6465debcfc8073bb6edb3b5d2d7b44a12607201b2aca204520625d8510a76b5765dedbada75b57e075377e6567abd5a4985212dc3c00cecf3f819559fd3fa2d76e9baee840e2fb900a51ef68602a7b024f468594bdb90ee19fb185040cb5a3ab513d89572f6b5acbefee8963c01860e7215a9d451ff9ddeb1482e32d346dfed5acbba6b436c34c83f23236ba4d44f8c9660ed4489fa740dd6b5fe8cbaa70c283da0c1961b0eb72d8e54a1039816d410c40e34d87c40e4e48a14a6190031c51359d01aca9518a03821c3cdc912970f4b46b8c04b16b52968cdc50d8c78508517232bb850210b273e34a15285132b1a1005058316347a7084348128804822aa0916b631bce081144ca294b8f2830bba7f4ed80a72ffb274513ac6107285ca3d53421eb917e99169db7223b5acff1961b160ecd62c48464e349b0c94b8228c17aa189104f7d8ad4953b038d1a4e8a37e461f934b0f3b32a23e43609f918f21565c2088275892a8a5d183135abfa3dad65036bd811a2e6fb906d5a74015c0d10b5442cbea48942587f157836c473bef3db8d447ee1d06b9cad57a221cced1b25aff6dc10362a07bb8d93454a17b8a70148fe0fb6091994c652dabe786c872709403393cd61ca40308275cc0210a8734be3ca83e857aa0fa12ea0f7edf57b9944a012dab97a00455b804a096d5571ea5d33905e8606d903399c72f67b144be32505720708aadef1ba88576b4c352de519eca771f2995a7f244684ff9f56bf7750ffd64879dac74cabaaa19ec4406745902e94cc7283263c5a4f90b7b36e52aed496b775c77b3e368953f72a459fe7097ef56929de7eacdf334137593a3e224cfbf62dd53a95891e76b78a5499d7885e9841637276cc09441f0ca486c9e7301567ed892bb07b62ca0b274ca82491ee712793e479655b240223bdd90d247a747965247fa04d11ca1f4a941f2493e19914f495a36650b08972e7994b7c64664b02305c2641ae42e64297a5ef8bd6faaebebd0efc3a195b9084af7961969d54109721e1ec3ec3d49f7341e6b703792e4442a46f2a561bdd4c1cfc7f72f0dfbdd0892249ec800a21ae699bd7797e07c620449922b7636e1c934996a2a454506106515a62999bd3b2753cb66909a39bc143e6999cf4c0a939866d24c62c28e37f23c68c58eb562b1325956c9c2876cb3a4050c2f904205366092635cf121071980392a4305b4792349e6ac1949e214be7085085bee29f20a11529a0a574337519f6ab3357513f599d506a6c08edd649b229d6af0c5d10f74f08216511e90032e515cc1440e5ee0c394ef9baf50d4c73b5163a1ee2a3cf41a7a11c1ba3f240a81e141587b17d618d600efdf85745761252a25508454f8a34a249d716458efdd61fdef92066b21a97f5889f8d48580e1c14740f5efd3e84a0a133289a0628817bc307164d8f0b3a4541258c54a1acc6683275f7ca034a730495a0b862e5bf0c056a38d73cacc72c9b0b03e114dd239b7d0a68df322f5494b5d0914a15049f81d2664080a2c487507489a0a4b3a13d245dd10c60e3b64a9d568323a9b1f326a9af81654ff30ac0f3efc38b7e4f9d60d56d27ac8a82c89c114537411b1921654b896c2b0c641b2c06041925a2e6130a9e5a5e3b78327d2f8c2f17b71fc75c7224872ecf7397722d1cb8a9bbefe7e9cb713703c46247699ef5b4401cc308a83e078ec381ebb1483bcf2183b8e03f58d1d0726123b817bc730cc8426c26122f4f68d8db44c36b9397779171e8b20c937a75dfd28ceb97337774e114625995e4e1146121c198952192753cac4073bb38dd7d8784f8b6ddcc6e63931efd771dc03e021dc388d8d1bb7a8db1730b7a8db173046b854adb917769154d8bd3790d4fbd79ad38460e37d3c6200841002c6f13a8e170e1c3870bc701ce3c0386cc4e0c031c731ef1b9303628c5fafeada1dfbc4b020364e6f2327e736366e632348ce6d9e63e33636cfb14632c58921a9d9e6291bb7b1c1638e0d6d685b16cbb98dc7ee5831929a73b0cd6b0e4455d7da5c99c39aa76aee893e302c084db671a0aeb9f1181ec31c3b38d658a59c1451e06cceeb54c4b1d739c27decdd1c01c763213c16a3371e9ec3849c07efdc8fce76ce73d075ee0038c87377389e1d17d714f2dc9dd95431e5ba3081e6dc9900534301876229b38f576c2e79c18270d9752ebb5caf47bacd287aef3958ad56cb2ccc3ca350c0c1f75eac91996d5c5ee69cbe4e6d3ce6a08d1b735550b2363e4a281b3e303ec1756e69e7382eac1ec765be1756f10f1cf91eecb03f297646cd5bcb387169e79263e500451f4b3bafa2091cae77e69d9cdb710e80833bf79e1ab54cbe8564ef65cef967ef65440610e52b693937c8c53c47a20f1d9da65bd337917cc8649e4bec488db2fc28cb1207cf2f37b34936cd24cc8d61e93b144fa05f81860993713c0ce1f29e480d6ddc5f8a407e1b076a9c73eee6e4b42ce7e3cc39dc5d97483d77b0deb86e5c1816a4ef3a90be2be7068ff52cccec3ace893250bb5e15dfaeb9620fe17e5247ecf7a6a48ed8e9ad5384d871dc6e8a103b10b5716506c01dc31b772c125226f62a744fcc2f6f84d2ff98a62ca64dc400bb29cea5e8a3fb381f67d32d2abcd1a50538b8c190c41619449c831616b4739803246de73021973be7b93de84c7ee74a3a5b3d7103142010e1a456a3f17ce720ddb93c74876787b6738d567085cb195f1c39a1a145136e5e398af3226176dd5c166606efc263cdaedf9cde51671c47fa9bbbc2508e8c834255a17b702e732e716eec8a9426b93fe3441f393eeeecf4c6e8ecb1e3dc48f7cc2e7170289d21cead995e290299bd4f64f67e1569ad5895736397620e2ed232393b50cf29b3a9093b7bece36ccab728d9a56fd184fecc8567978305a1a324ca38b3d99db94818fb8cc68e9373fad93532bb32cb5468d9fc52298e17ce726e11d9e5a2ec28a15c076a23588596c917f99eec28a18ca850448244b90809999e28d73ba38a5a26efbae19c9aa6e079639a49b8994828218bb4f926489ffee6148fb265b1533ccee49b13e8fbdc25d21c876140385c8484ecc223779cd713e5ce39156a997c5018f60927074b2a57ba4766f999656a994fdd03a332cb79bbf54cfefbec685faf2794ba1b1cc22854dad525736fcfa3d7533cce2ca200e68a53a8ed51a1ae5b03d37bef653e8d52b8f7f3de7b655cae145c53067c9776feda39787363383784a7441f5d6bad15d3a750298e9f7bbdf1fa11c7d18f995d97edc3f3f1e6f463088fd5d78a73fc9cefe09cfb2be7f57a8391d09cf3d86d25d9103092ce391f8fb9c7e86bcec1446e700ecd7d0323e94c1ffb880323e97cf3181e2597dc8d8389dc3ce70613a1e7720e46d2f9de503c659847b9ba6e0d3015d6a84173b0419edb73508a3f709ef3be37780c6bcffa38b7e7ee9ce7ee1ce7e6c4766e4fcf772ecfab277623df1ca461cfe53918c2cdf9cd8d1de7e6cc8bf39d4b80f0ca9e8d36bf08d0c77167beb97d9e4b80ef5c1e9c73a02640831dee5c9edf1ca8715c99732ecec19b3b86f9e63cb7f6ec3738648ee376beb934af71659ea191919189394dcc6b3eed2be6b0c31ea37fdfdff80d1bc7211c0031ef39457e4a9137e7def7e6ae3b22c9ae9b7aeac2b09c737884a180f3e67270101c2c5bd6f4ae0351d71d5db7a139a78dc2cd5d6f9ce360580e0e728325eec7eee83a0d8edfe07873afafb9e91b1c37b89564395c24ac694c04c76f309110de2fc2e12261c68165cb6ebc86709a03e08e35e353d104314808b8b6ec06feeb8d471b58b60cbfb60cd313ee652ec513ee657ec716b20c9d62109a65645cf764de57e6af7b326f7ace85c7d7a5f823e663edcbe0ffd57fdf378d81afd76bfff5fa1a5dbbc69b3b96f9c4b02031a78f89c50ee3620e8b39ecb0c3ee18bb2be630d863f5d29ccbf6d939fd70ee976bfdce05a23677c51c06c363cc15de5497ebf4de8437cdc99ccab83091d8633e565c24cc310c3b8dcc309b67eef8ca34b7b923924cf3aa0963626a2521d399cf048e48ccfbd29c5e7b49719130c7c4e02e6addf98525bfbacdd43279f1f69396c910cf1b87860555a9cb244bef52f481adb3a97bbedfa2be3bc1cc2f2d93bf02832c593a657905064619e9f253ecf0bc75b1236592e5291326a7493b972a3439c9cf2c4d5328cd4def8f93cae5fac7cc554a1d9db9db4b3bcf7da79496c9cf26ea33917690b29c482d93e79a8ab88db1a40633a0887e38819420ecc003a530251040942635273110e30c32a47cd7e4db487edee467146ddae9e9022b603d388404f1f5b7815f47c5c284540fbf870fdf58488987bf8717fa1e62d8144a5d1586deaaf51656e211c55c4660e63417d23a0d560245c8bef599cbfad68cb5d96258d0ab66be6a5e83012d4b410258a86543a8cfa4d9d45fc665a3437d24adaf3a3d1a07953031d0b2aac29096b5d87a1dd294eb1bebb4ac42b11deae8ac7a501fd8f42ed4baf779cf7e8587bcdb0fadde3a11adde487d92fa21f52ad4dbfb263b3ec36eeb36d7d678bd06765fb7b93532d70892a7620db2d1913a64c08553f451438ab01e22c5ca2341535ec2c07af948cdb0a057cd5b8435ae3ed824d4470e913f5eaee792e4cf08d9bb1c27d2ca019266838b8a682ef3a299c79c8ab006b4feba50ebaf156ebdb1907d0d1ef2545f5d88ea2bac048a12f0aa0b09c587e094934785982b7367aeeb86ae1e3ae0554f41bca47941de817a26d159bd088a17bcb0f9d589684392ce30088a5fe12111ab4067f5a0a48943e8acce0391f9c84bea98ff4edf71e285098557fdc284f0878364eaf3b00e4743445be68b9442940851c2bd9334d96b72574977eef42aa96f4075400713e2fe5d9810ed30572fc51f9dc9d9d4d61dcc9226695df87921a1889588ef4fac048a90f8be92f9f0921686ac90facc4bcb7af7aef525fbb065ddc79916b61dacf685550c8b00eb7d21f6ad0be9c76025acf75b58091421d6fbf6923663295e6a1da8ed95b47ac396d1ba773deb07a500d4bd041686a52e04fbcc41b18777d240996135bc7aa365ddeb9781a8cfa4e1bc9b46af8f32caa67bcdc19b2b69383336aaaf7bd79dc3b576402deb5ea170b4ebb02b52eecedddc3ece0d656217ca7cff05314645ee600de527034b5fe33817f629828fad9052d11fab0c24c5d24ff10807832f773e8e7c87a570508dea83e5685ee4facc53a0dd6b94fc19417c07247fbedc5179033d11c82a5718d8aef1d85380fde6520cc2e96e6255084b028779784458500d583f3c50c3ae12f1e16b5c2550b82b99b006ccf785e6c5879734cf01537480070bea0eebf7ad3e8f06529bbb72ddd6cc657945fd3004c3db9775ed6ddd982b7363aea4f5ea12d56c7f2deb2a144b3fd6216cd1c4b02a4ada09cd2474d67d9e88d6170a566fb08aeb271e8252b1d0ec3e710974d65d6249674434a2796527856d491df574562fe98daeeb570cc023486e8cb596bbdc1948019884f9346dcf24d8fa136a6e1162e94cc847e50da1b1a8248d53e5a19c850a9a91810000002314002028140e88c442d1603c22a72898f90114000c8fb2466c4e1608a41c86619041c600420c210010036008800c090d0a008fc363e5fda3f1fe768ebe74f5e756aecb1691711b74d60dd7f93452c81046d35c994e4bdf174d8b211928df0b29cebfcb2ed6d42e55a5bd72d4164549208e9f1d937dd335f6ba2fcd5ba0a19fe6c31872f356c469fb746204b6efd00bec048275889133e7684ba2e07432ac97dcb8214db7ce6a945b0a2b550c78e1b0728a5b29f3827ac41265afb24dca18ae6ebdd2363f70c5614bb90ef9764578bb202a582d900ffaf52a35afbdda438ab94ce85910016626b54ad86b8d962ce3878a966b0f09ce4c6ce3818703c330c411621805e5cd6af6e8d62460377bb14736755a58c4619ce7954ca0edd96b1f9f4d8c1b8a5f8293fc566d212199de338cdb1d1d8258acc10b7733fc9e0ca4972846087c24f8323acbb13211e30a991b87a93652ffab53a83a06112ba42d54dfb8f614949fd14edb747cda42e014a93535c2afd8e5405bc8bb6c2579a1b26cfbff420af8b6b0c39a727e10dd07ad9a1a93bd01dcc7240c31d6b9c6acef03c47480db4243dac5f73e2b7b2f5d2619b12282c75362609f57abcb526c4960c1f80db690fd7be7f4d4a2610c909f3c32f7594ccee3a9c06d5c9b411f98f1900f97461497299c2d3c91673e6bc62023ac1d8ada3a78a6a323128802879c0d172acb59b07861246c5bae3c51a6609a3fe66d28559253aaeacab786a2114d94294894888e0351be01e5e4686b2a8ac604b132385e55f4dc49c72071e4052422a5029bba9cd495fcbea65e401891d1b0c6d69523807f98fddcdaa5ed950f79b1be8e74d2ca5251975a446b507fc0bd78f197ce541670200407e68298d5a4024947d3e4f39648a9f70aaab386911c06d8271636370aed099b8550e1db4a4d870f8a0e9c0bb8bc7a6b2285188a105566432c5188e316f6b4faa4c50d4a02297ee007a480444ece37675df0613f94f38ec5fc035199015f30a6f1d8f7073c0b4d8b55b793138080dcbb19018b054be462302157d4f9ecb161196afdb6440683e36641d3c4657608760f4c5eb8f47bb31e9e32ddcd94b2e35f395ea0774360b0fb945dbe915bac23b5ce91b0a4b74d26c32a84c71b5f791f428d14c24ade3519999c4f9add313817221c5e5fd73ec5b8ab699c9bd019212bc599f14c9b33c2f5394668f0ad530e54f2b046e2562df3d693b51a136dac89ac4cab4f49ecf4b289a3936c580482b6c9d02b9797202928152c28889ab1d1c74819670b7d44a3a7b859a6583ac1ab32a0188ef91b122b7e7fe541ece992248cb64d5d03606f4cc6f7bd530ad6586ee40a2f410624b4edf26ee5da33d9c5c5a51c463c0eb3969189d4abccbf72196725d1052634462f8690781408a3a4e769401d2a88db89b27ff160ca6921504200c93ded22d64eb83dbd6a4a09a6e4eca35aafe7a668bbd8bf68a1a7d001b4a77f6675003edd6a79b86f27f47580f80fb238db1e52963d3d4c79d580251e9582aa72b996d799f14ba96d30fd1f9e644251541250bc2123c68110981b27edee2309ae1186c316357973db37c1627ee104ed5840f6c3206acaab20118138e0d58793aac657a706cbdcf650edec3af28ae9888af8af39e6955ab7d3bb2fafa305f4214e415fb19548b71ff51e7ba000ea5254f91f8895298c38fd77a0af0e2870010d01102ea66aa6fc1ce5d42a64f19d4c9f72e6c6834cc5dbbdacafafde8b2a4d298bc1e6d9092431924fcdda87d44d1d16a96bb7e177d1273d3622833b4eab8b3910e8888388d4b51757278845477b2e943058de1fa727b16a96fe5a34f8a4f993514af057650de63508551fb452763a626d6a0a4fd1ebe161c76da6ca85c8c529bdfaa0bca9dd6562e4e418be716810aeed36b83753aaf882eacdbdf5ded99105b9500577d21596d19fb3c9ab5ea5608363d12f950fa2da1cf97c4886947c850846e2e902f79e04a2eadc8b0d9118092ac8fab242b282ea74e5f7eb28dc01e96a7fca1a79894b8a2624a3254bcccc909d28b880c8975e3987c518c05237d6afdb54524682faea1ada7611519892ed5c06f98f5383032ab616ea84f30f21df3f70316a2be889c64800480254d1b9694455f824538117db5662ac3bfa5a1043f90cb28d8a376629155002708e781b7a4b0bdea78aacb15c97cba3e1ba2d7622eecc3b05f3604af69149212beca2795a0d64608d872be91a149eb41c0f8c19e26cff3e67d4580129129ee170ea5d40b528e8debcf0a7ca6836f42668ad4eba1adb90ee8afba5bb28bc676711d5dbe178f5fdf5d6d9c049ebd720923f9280e33acc4efcf1139c0397630c771aa4635a001ebe69718dce169431c0a3f72f6acbb955fa7b41c6b06f2d4c08d7309191fe84d206957bf287f9eacf9bedf0b19c9a392716d1eb97de9a3b16dcf8afcf327183e75f395480c1a50f942fd98dffa4c7404941b47ce62fdae53b4f18d0eaa72158dab250594b1b3c0782d7882ef38fb1114b542fca212048c1193603789336a0ac1b5e4213001fe54bca6e83efc4004327e6c3199a535e5e1096227109fefc4fca3539b3f40768126ed2d90c567d406876565332a0d9b499fe64cbccd49d7cb144f38b8ccb86e7a7b8b067511ae033c6f66772dcb4edaa8b47c5cc1d0ec24b722953562b01914408ca97003773573924adccbfe4accc8db1cc829a97e1afd005a8c0578e53d88ccc1775ba5fe47feeac16a00bc68946708fa099039e8ad5970477672e3d4eca1833648a5c7e2ed341bd3daac0f8306b7a843423bbfa92d5f853d0ab04381c1e7cb1d750d2600971a96c09538f3141bf9606d15449aa5838b82c661058e4c60503f83c14a4a31b44082582de27b2c6f2d434faea98b9d37f77bc0ef2ee88030d241a073d651fb35bbb8ebd27fa5dda84ac95131891cbd9625a15f4047e8cf418f0f0e4435b514ed1ec203932007540d14020ee8e557245cdc77b0cc7c77a6dd45ef72cf7dba6945a174aeb7e2b5b057448773d9ca138aa43aeaa573d7ebdc4b827c820aa2816f15ba188665681b7e934a615c511a1276486607e61aa799552d730c3ea33b8e87abba3c469ef552a2ecf830176f39f25e135e4f93e95911a1607962b18473a647e2996fe104d7930442d90788f1ac56dd3b656c26f00a828ded11fb11b62ac226998ab8838e90ce350fb3e6e721938c9970465c4852dc0811db648d8be148a46435aeab67de98715c5a4330570c579166fab6564709152f9069c71032809fe23c748f95023ece78b288577ecc6970865b42b3153f827c61737ca9d798d239c5dfe955dcc7c3e30ad302d06af86a2f222d9bebc39dd1c4b39b5fbf9ee98061b88d2a817f3c8ccb62f558728c47e50768615c5896c97ab299b1a15ec7d6517f3060867605851e0b60829ac3819c46be2663996fbe51911f7e774da6604289c5bc96d0a56801c3938c2b7c45150a2b513e9a30f149445b34a3e6ed1e0eb07831d07f485f9fa0a53e2bcdc9af00628d42456c016c77a4d71ff2f7a21eea3230efb1a5694b0ceab58918ba8b7a264f43439e138da75969b5689ecb16d07482c166d395abddf9be63e3611befcccc06f62ce071282c617ea119589f29f77a68dd5f0b190ad0c165a9fbdcbc4abc9b1da952028d2fe71ba0efedede0e28045f6d19b95433d37bef85c09cb7b0b671997b512ea729a0f9a908c492e6eef0a2227c71f9dbeedf16178373e89de262fe7a065e0d1a53de3056cdc9d605603e23c091ff6f05818e6807b89c485d06547fafad34a396cf10e2640731321232295fa5113b9cf666951b420abbb9b35edb19f650cde8a167f4e8230b0419135ef4864b24c3192f394bdb3da8fdda60b037ba053d37f7ba349ee11471b82902ebb00b605416c2086562cd834f6c1f0324e65e5dab2c35a1c23cc1d94e4496cbafe88bebee243367ce433be224556854b415e3d70f61a11ea7571ec44090244d9c47831b8b184bcf3d458b212a32994bdfdee51d9644a1ab1d1cea4cab773defca16d49710957e3ec9963452f76c5fcd692c68c357d0275becb7109cb88741839e3e88ebd2af6e1e85c93a5e0a2715f011977292dbd7d618cab54b28359bfd5b15c8809ab27c4ebc11e9aeb93804566e4ed1ba93f44144891ed965a768b32b46bc9908f0e817bba6c4853dacacc98d658fc142908532adb0fc785d853208d99b72203d7bdd02e8820b9320e698abf38a3e3b765d07dab472804a23c0f022707fb98ad077f7f4178a1d5c9c53c1140465634eb11aa2d4f9ec4af9f2e20804806cb8e6f5442b87a0f0b2a4fc623e2d9a8862b90686f29caa28e055f81e532d0a82a00f772c61fe396b4efd78e082fec455c08bbb7153d59556fa0c49542a93308f0beaf21be9b110d33d7e24ba87341ef23f72b6fe0f11c0580c9be17852d0f0e197650aa574e5140a7aeb44159c2a022a69682a4da4a2a50aa5d87f80aaecff078802dba38d3094fc7c6a2f9de618bb29cefb9d606c5301d4a43312864ad4421aa1e649f7419c2abe9feadedde27c4f818dae73510d377617bae9e4e3bf2b044b0b9b3306ece505fb923da2c0ebb646d10bd104a1dc433236e70b7c2e2a16d82bcb66ca5e07761057054b6ec9b070a87cd10aaf146a55477c1e680e1033261ef0f01e96eb586b2c2660cc61ef756a23ff4c3728e792ee85baa0a0147650b8be039a03a8a883527045973ce6fad29c27fca6b34ff446b46ccee2602a0c524cea9108e35e80b538e4dabf422f6e1e99414ae88ee56d12931fd078d3f7b09808535150967e5728e108dc8bfe30b8608ed1f721ce46fdd90c6b5557fbd775cc0e615419472ea37ea5e45ff0c8faad7149cd980c2f25f585fe9d201eaa39b501fa54cefcc62d27259401e2947cbe33529789d9a72eb1092d3059a5b508cdce37e95d85b6b81f0072819028ed8212291d0901d9316c149a5e13547c0cee5ac03002b1e8428f90289605822a09782e2128a1db6f64b8b51c6876ae2f8d0faa405438ddb1116bc513c451569927ae0442401f5c0e63ba0dc6e1062da7ddd0290ee811e4afc0f7c793928dc438cc5d162d12949277b5029d41a5969f95d26c0177f2dd8307d2af79feaaec3362a343f1ad253ce1ae10a2e26b99b2fa79a0633445969710d637df9fdf02e05eddac728614aab845ff71f1f4eb64e430cee3dce6a51dd87333cf61f42208eca7552e318da689270f1fecc279e4874b1c044fb848bc357fd2345a027b36affb24432fa19bd4d1730fa310498e4c3f86635e05aeef7be040576065dd4556002274faa59cd0cfd97e629b2ce512bac2cd13e8d2c1407382b7dab831bfbea1edbb3409b11aa06435f6dc78188b4609afa4183bfdbc88ad1af82f54cf85fc66da15557f8afd7146aabfb17e8441775e73b23a2aec2b51f560c8fd65a2aac0de54167b3f6881e6e8e162efbd78adced295d93d7d60a4435569f4d03b83aeb62f681af139d8106980c9079ef2a177ce49586fe4529ea1a3ab68b67bcf2be5dd04404cd6c3daa0a9479ec7ea440408d0e2d9b402eb754a88f6d16d95bc361af0fc413931c10303c769ac4e4e1a9ad90a62f0e3d79c32f41fecaa13e992623108b1367734f46bf30c9d3a9950f2c861437bf1208b756dbef0337c7c17193786f4eb9c2df344779213e7c65d35e41e4df7bb5a37ce039a7e75521ffb3ef45aef6cebf289cdb5130c36d75827cedfc39a572d10a59b5178f2d9953e41818651724c826b23186a3f4e32fad86267586b417bb90fdd2a549bdcc8b7d73459ad12c0eb45d487b20f40b523329af0df8f437f03112f0a07ed98bc769b4b87d6e821235615bb680e9fb798f3e4deac35d3ce21d055387b769305324231a44b5139fd58c61cfc92041edc7efb032f0d05f7576025ec84e8604a36c219faeb68b595e1ab1d17379453674d0994e78712ce64b97e4d05899f08e952454e22e48188c00eb9863de582481f567ec25a0224b2b6a446c465e368512017274bd13c2a7eecbf6c80427c4918573dcb18b4f1b9a6ea9c07fd7d2c261ff9d9445c7d6788287c20f18f4bacbd7a7ad45f7860b45b27906aade9288c5603104d8d217d08396a33d339316817f9af5ac7d9324e256dca99927fb2237a3f5161671ca800d941d9cf760addef3941458c528dc57f2ce7d1c20591026b2c8e70d711397f4eca3f59bb7b9efd6923b7db68990efae0d4ccd76a4cf8f9475fe020ac67e5424bafcd25aa4073890920ef58fadb28bd1cc5f77f434dcd825c86a1067345e3ba2ce3246ccc82630df34ff085f20568bc00b814622e8d3625d24c22bc1e514e0be61b395d5caf2f6487adb5c4cc064fde41e4bdf1d9468e7647a5170f41970a72e7004b15d18b1133630ca7081aeaab57525cff91e05602c87c3eff3b75560354a1fe2c13cd692da87000cb29cabfd808f5736dabee0a20cd271e10baf33b854ad9c1639a5f791f47c0e55f244b9de43ec1c23648364e0c8b24320a3601a8bfef3770f8f2ebad8af96acca43ff4301bd3ef4c5ed5c9a2fcdd840dffbac72d5fc008311471fdcac9d947a34441c853d4148548fa768292834c9f557dde972aa28b42f0cf2b3d688b53d5071ba5f5a8bb37132dd34dd51aeed46697d82f55d83a6dc5d15a4a483a95702513bc622d046bd8cfb35272536a7a599de4200e51aed2fbba9fe9097630e3965c832425b260e8814deea5decd34956db2753f32c3288b293af39e136e7758aeba0ebd7b3cfdf31b21f47bca59485589cb0e8b5ee8e5a63ea5764867da517ba814885a726d5b1fa740cbb2ed4f638e876645891a5b9f768a32f2a03e052b3b9eeb956635b82d3f9c55e8da481da19539b20a7b53a4d112e74dfe24d2a321a63184a7598ab02ea281eaac6b231c6cf4b3af204754c33509d491d7315e0b7bb63dc543b9881531974dc59fe78a2c7b5e17fc2b03ba0b92e22d211b8b381165d1162b1c0e28760f58cc06f06a29aa40d8b39bab798ed20b6b795e95e35f2843c31b4b03e4729d516e6f0f1335aeff9c00675efce84790a842e9e0efb35f676cc4b4699a0cc33dee81ca260d3d1a072211004b41f271b5dec2b7d3edc51121ac531302b5a32c05e8486ad1913c1fc7811fa2bd4756e8cb7904cbed42122c3a4f72460cb15075cc71633e0e1f42beb25e7d55aea39bdf6abcd01c5fc879b51c9ff0a356bd350fda381ee7af2f5ae65879f73c49f29ebee93d029cedd46d77ff03074feb0cce158b0f0004a1117a153b1745c6f137d970c07b9419e19bde213d227ecb4a14e5a6121f103f1c95216d9ca4d342f8401b99d90a45d4e73b7292a01eaca0d796f9a1c7437ca4bf47320082a3ba2b73c4e9f1412a14e1cbdf03088a13c0e4b3d042c4483e29df59b9f2c9c50a02160b75b137829f14a54d9b32f5eec61c3455b068a184d420be9f868452deda1632a01ba15c43cf509f52d97567688c4b8e90a21580234383739748853f7a5c876fff063e6f45f52ab3cf964f5ee469c91dc47361680ab21f68554dfa25a6efbf8117ec263496d9683539e25c0df67e6ec4e052b6cda3eea7980cb5ab385f2ed30782bb1458a5cbf75c1b2981770cec8db61f1ed99c005ed4cd4414bed07fd05187de3ae4fa999c5a45959527c0f49366e5ee1ee1753272d4130859083e5b8de6f944743a4d86a8b591b184ee2bc533b12fee4075e97a218b3c91ede4ec0123130efa15c34186da611078e0e7045701794ced1a9a8187a24af395cded4e6d3f293573adca4bd595faa4435df00e2b7c0cf943364eca012485371096640bf23b07b199a0ccaedd8ce3642d5ca89fdc710d77efa53e79aef536052185e24de422c161f66effee381d7f52f2d5219ea6c5c5cafe1e5f2e65a0962c57a9077cebde7e4bcc334b9c18bfc3d698fd6a300d39a6591bcbcc1584f282446606ecb4254219651e1fa8df195b419e0147c6d4345b936732154aeccb5f074ba0301b2d53f241f25ba89469c05c01448043284dcb53bd570895341970f57ba0422fcdf1e74278789b3ce7424775152204da0a21146878b927e0bbc63e8e7f22adddc11e72385a5d8ccdb4235842a7790cd9099247238194a1eb2d2cfb34b9fb1214b4d12e9b4f9eeda9f02cae30d7183d2e72c1e078848bce6444141e15e0f13d5c26e09f0eca5dd99f0b3b0386116d2e7e70747a07915a216402bdb3a0f75cbe74c00f4cc61987e44bed4c564197aaca07338f5a94321503da5ba052df028961aaee39845e571f7f279ffbfcf6b98ddfeb60d0f0ccabb902d092ef6697d53c8017d23a258e8a081b183788d63b188a649aeaa30cbd51a7afa668a633b6d325487dfe26289c8a5881924f403dee5b10e0a23bd2920a912c6365a2dc76a39ee6e2dc7489a907e4703cb5f4422c6b73c1f4d56575cd40c89d69e52c6341d11b1c7b356fdbaf1de250a0175a41174c823a78bff73594242b102799219c1d04e750b0242aae6da90073470754befde41475f89ea461d0ffb702865aa9f8bdc18ca2eae7e61c7a57fd56faf7ecfcf26a36fdfaabfbb8673dbd4140027f490d87d6ee60a71b740016c43f53d9b87a868fc852779f09509a23b2d3990eb83b368e9dc9a0b693cf293d5ed02349d811a1fe6cec2668e719fd988891d4746f1e6bfcbb24ec3c8fe8ab4672c4a8758a10ca184278faa486c6e110622040c3ae20167284855a4646364af4d0e69f169b916a2a08290bcbeb3ef5a1240bcab5721630ad3238b56f35584cbc0721300c8c9d1294ea1d55377540a1e3f72048638fdb1481681d3764af8545766b529dbd1e4abc2a9b0ed8eb7f887c0af05c67a8187910e0ce78a54e7ecce08e34cc6d24254a0c494ebca04b1c9daeb43eb05bfd826811f8f61b46606b8a6376ad29e1255c5f12b08007f1fd2e2c66d9b6f5e87dae618219d76aa27a5e70f76d6b697e3ff9d9583c556418f6a31af7294c990314762d94281c97ad8759485d0d078a39bf51ba1fa2efb1e31aa78571d53a302dde9d87b258dd66511e1043416e0ef3e4b5e0d4455f54c367a625276f05581087608f2da44c5f9856dc0b3c8866897a4f102093133f4a79d4b350d4678e72e2be6f1ab01fd7675bd68512815ff792adc3fd5d56c620f6cf980bdf3c65af54d47500429175c8c2d04d0131f87bd8daa54d8208c75e881dcf109b1fd6532886574fe1549f614c25273539b8579e32918d9104221d7397534a4ca123aa6ce3c14eb2508361d1134983a18b94365aaf6164c3b68a68180deeeb86600651c0d48e500d3e5e7a0a1b20d7ec7203a604def3fc5130a8f3b193f4fc87f79246e7b0f2cd4fc3441231a8e0dcca4452dde4f79e54a226816e264ac8404fb3c8c416eeb74559c00eeade4f671d806c62e5a0eb618568b7595c9bc6edafce8f9fbc10847f8a7ac0497b7176cb3d204e479c6c0ae099e0f403d14d583151ba892074b750efb1861c8e98e217894e6dfec1dd8713297f6bea828c26080cecb28ec63eb58b469ef6d719221e21ed9ebb129e2d42cdd02518686f4047c53ee90d7fde1846c5cb5765a2089dd5242d7538e8a009b4689f1323887932f990f54156c3aba94893fc6010e6128d74450223d06b78435a9280a6108a27f80c6e74feb544e0d06b176a7dbd76acdeda6fc0ab93df6b93475ff5cfcf7ad0f900f1d77440e49e245e9f157f167a817d530c5e916ddcd711de7acb49ca9ebcadab784f0f1fd4c478cf4a7a178df19e2db60691c3568113b2fa2ec73ca10db3d8394871f6793317751d2beed6747ab8335065b6d2f6c44305b3f1ac19148b6af332b39b3b7d952aed5a4231cfc784b7d6556bd4d278ac6265df363d516ec92a44f25ea4b2ab4b68afb1892b18a44af49b83e0a02d385eb811105f9c3be3bf1906fdeceb9abab4dececf89361c38fd0eb687619da60d9c015ffcaaaf79340b4fd4e51e70f2d3f2a3f72cf9cd2c21b0d60dd4f02ae967ee4edb68f721886a22142d6b3560bd8140c6f6537e2b2e68dcf55ebc009d3fea68ccf80e75a56b0612ecdb10d43bcfc44271e2bd0a01846f497ad371ccce67cc2fdff8091f0eac1d42ec632300ea0f21fe08833961b1f4e20fecd7595170b57029f64b27e70fbc36c2f613035210f936172096de4ff706580158743dfb0c62cb00154bdc4f5cefb620f6f14c6900b9f72234f0b14a47c74456a49acb5ddb9da6dfcf26f61c77d7c017eabb0145684cf9399a1efcf19dd0ba5d574c6a78de7b9f525edd9b40ab8a83f90f9239206f2c9556012bb51a0481fe363e25371f355ee271d0034cefc6a477e5f872776eb314bc8641fef157acb0dc068864992c75216dcdbb038b9bbbd2532934336720f7dbc16d720f90249a1bcb55aedeeeb80000843afbc8f4be38d39168a754a69b2d3e4feaadabe20512d22d3f98019ce0c462b3177c659f9af196171d21393ef89125749ea1a5677435df2666992cb21f2c271348924c23611b5bea8ef4be650aba0ca7bfa6cef0aa2bb2ffb477f820299ed2fab250f9d73474bb26f2f925bd7a0f8f4f3546249042b742e7b64cd063570d0c4728a490f2e94d991aa364b28e3fec6a324c61d657b7d22e02a38b7ef802d44ad4cebc840e4503576e6f237e843cea5ab7493750d0423e3b70f5f5220a36399ea1fd597e2383dc1481a7c9ca73845561e8fe782fedc133648c1abe797bf981022dcca040566ed745c568d53625ba407bfc4755db33414c0ac1caf9a3c24d5b10f4c924dbbaf0ded27a7b51f27ef3e39c8348c4462da1cea7a67a62e33003c40e1ff81c8a576c2bb630e7e5ea47c936149392dfae66c828e9a944b70f85c5d5641f685a6e5cc080832ea2b06149f4498ad78c0096e36fc59fa7241379da8deecab0fb04b8c776f7aa6697a170d048f1c2b06d002d2f5599a02ab1e7cb262d21e87ac0c9a958aa3acf6d0263adf630d2c83b15e22f3cd7170e6f3f1ea5676e6f9a1f03f8dafd603bfdda23b27d2d151574065c7407988a9dc87eb39ff6cca418473158ec073bec67175ac07e5b3e1a900c3c4d3cb5428269ae84c2ad5f393e2ad7faf952db3e40b47ff3a84f06b37bdc484466f38e1c8234606dc5741361a78cfc0f7d4c18b2b6decfef68015017dd005bac5d9ba5624d56494a2c6333c95547ec8757a7324107280ac5fd5e008ee79ebfe368664d560c9deee8739ceac9713484b738d9dd46844cbfc522b66ed1004a82e193f5b75838f2e63af8e599ca2aa5ef92ba45e580eac931471b73607f9b08bdd087ab00610a220f28c3a88f640550240577f552e47f75b8aa852a056e2231db3e6f9b893b1e12941f3126303e0582d6a17d5d792560336560a4432cd255933cdafcee7be7050023ee2026eb7892115c291dae3149c9e14710454ed7ee16ba791a699eb7135885ff39b4d5f623a25bb5f1862973c582c036f9179b7c17c99ddad7ed91064424ab28e6cdfb08aa53515dc52e1bd7742291f84b20625f18d78d0e0e7d311d33a10f741c8f66a4a2a8037642762c6c868b6efcf1d4c54e3811a4a21074a85582365f206cffbcbb33062ca6f8577a7426841f04838f7bfbec25e3ec99d00510295ac14c5cb9e6611d39121aac48d38b22d0695aa732cd68df3aa072ee2069466b3d550b1c241b93d8f5af01fa833a9c888b9c5c77c0d3f2abc33ce4da374e757c8399fe657da7c64792426040ab41b389feb8d7db96a72a07bfc9612007b45f964f54062897f640ae1c64306a0cfc68a13451b448c2d14d6f23c1200b6578743815650b38b404eb9345c77d95f8b8c3246965550efce0f539aae731894ce50f6d809fe15335453326823dafb60acd081d6b608b6ed88902bf82f1c3bb41243375fb313f9a2e168e04ccdc8c9428c0f69577a1f7f06056c277910017e47c4f18e78775222e1c315660f1040c391b8d75694bf29d2ac8266dc174051d3a4bbc40ff69079bed802814468cb70e6c914fa9de7b9c65200479d83acd13c7d5f1083fa654c92d5fed42c6185fdc651d30ad094e63ae63dd3a211de6bf9918262e1e222a16feb74dcfd87591cc5c77874b09aa60415f60ce3094a231ec4d330ca5e47622d35f30bf6e8cc73e14263be97b788283d35446943e81f1ec005226f84cd1d0b5916243631e5f508623836774f83930ed19093a411b0f343432251215926993ea8308b6144fdbca8b99e34026aa81213b7fe3fe45070a530e71f60818774252e0d99c0681b7a61b6b50d389bd0973fb3c17d621b98c95fabe0aeb7e6c3ca2820143fc59a9a1680308d32d07d3279f64922ead7ef999afebb2fd3788f030c01721a4f5f4e00f281a76aced325375c006dbab8e1821f52fc470c368114cf71766715161986f406bc4a19f9b3a580c4751ee778dd83394cf1109ef38ec140ad80c6684ebb63d246371f400678b6e740e7e7b49656ea17ed607676235610e5bc197d9b09c851a6daad38305045e9b67c97b799809c2d51c6d4476e11f8f30bfb770ae93436ffb901d1355ae0d8e2077f6f0a6b4e76a4fff7c7d25cd4a1b8787702ef18aea8463b58348c520fc114bed99669ae74939f156daa21b95ba8296bc66e437cecc1f37a7a64ecde7f53945acd360e91b49d4f673dd17bd353290f6b8328b9b1c221b440143c7a300216fe639d4c22cf2df67f19bcc30c72179420bd2bd39db1098e4d96e87b3710b52618291549d709bef52102be954ab65dfb1c63e12a8bdff560071980fb83a70e94127c0d563664094ae065178b4bf787753104ab0bd8010d9f88719ad60e9e26b37409c0dc39d1d6072f6d21e26af534c249825a5c1221a94bc8193a2ce18c37b449b955a50f5bb9edc0252ac059c8913a2c5d5405c72124b34be688900b90f42d6abdbae500018bdb00e6e2aa45c92c70578ad7b14a9c5a1072e967ba48c073fe4be07ee30d512a6b3bc1db8a8014066ecc2bad7a1badf26c086bf559d4558687380543d0839999084e44f855294c7d2e714fea0b4940e88277502c8fcaa02c8cd11072781d5e129e0d6fcabe9859600e787c7ad9daf7645a19fdf78a8207ed448a9a411cd5bfd38610077fe801e7dbf4027e115d3a46cec477d7871795c9f42a7c4a33b2caefd22881af5472d9a8e8e8afe9fc4120f0147ccda8cd0e2213e31bfb5d48dae342f24d6df84aa92e2f15f20d0138629231d4f20c61c2e05df5468ff9f056a3ff5cd5bed50ef8fcdaec81f691b553c1b2dedad7cd43c9c7c70b2b7319ba2c1c37438a91e080b00da22df309b5f4bfadc115378e439b08f246450213a9ef3bdbf962a4dd530ed88642eeeabbaf78222dfba87feb9b9193c92efb0cc0f5a8deae25880e9d76bf45a210431a9c4dc05b7d380329304c8e88ecb92cc9b63333a61fa79fc0118c60e819678e698beb140e0d6eb49f540c83f05f14175c243bbb67466d3e7e3c098d362df669e13c85e41b0e51a4a2c64206c9869e71de44e6e0dd06a378ee14dd7638ca210adf90b86cc9b63f5b5d352dbe2216b96e0c7b3e2038da0647780c805c9c87712d57ee3a25963550bfa61377f08530c35075d448220604975ca9a192a82f823b57fd1b6a1f1da2c740cd1ba04212d13a0b64e694c4c987ff9f2aa71a997568fd80f0b7edb1ad5854068ad78cdb6653c088617dfdf89d4143bfc6addec67c0e086c1a80b36a6917ed0117bcd98d807b9e01a73446274db5ef11b8962e5b1a9c44975a62b8b4f7689ed8bdeb72674edc745945715612fd1550d5dd2f3b83dae5017b350d5385882afd967bcd65382dd7eab753812c925d6abf1d07ace8fee34a6fb95a739ebd363786e08c1fb3930010f899fb80f023efa1bfb72228366b5cd8f516b1cb0af29e76f1219155edb5f9de09d1365633543507d91efe648ed9b43057681f10aafecdcd4ea2491c2f86f7e4700e6e80e558724278c650c3a7861d8729bedb8260d3ada9d7e4b9c968c0d5ce55131ddbb98aef2301ae828c300a806c6a7618fa93f5d31357b3d09577f03b9e82af2e302e84ed34986fab847e5daa12d7903441b519d475b4877363c67f1387be53f3c0ebbbe4188de50c77dca40ec69c55ed32cd482c3ab867862dfb46d8392038283dee76f3c8440733391d22182963e6fd87a4daad9a3ac12f1cfd0f1a8f3757221cbecbab7d996e27fc7c048909e0c03fd2106735ada213d3e1a54436f062df4a9a2855e7ef2b35c5343742d91ea22e83cc7ff38f9ad7af91d2b676f33857af59af8dce7fc711a5662ddab4989e98ac47ef7a1890cbe8f5b491bae121af4b18823ef4e884d4c60957b642e8b27729bc2a5c35e43dec0f5e6ea1f7ded7b22b2a8c1851144af323f9c31628533201d5b79c01a5c07d6d5baf6793fc1fdf4635818d6df95b6d91d0f048a8d5d64206e1c5a3eb47016c5b9702e6c9f3b466b2c5b9ea6f3c18442bcba9ad44c14bf3ab9ca2ec4bd75b5256fdff50d8ec26a581418348a88a1f1bdb6d851b5efb84e5464f5e0e0f4ac463c4b1b1f651e786a7e3f00c20a83dc94b89ed615b87e2d268887be5a53383c9acd62577a29509b316f86212a2957262783e4a22fe81eed4ba2796af15aefe345298cd24b5c56b0c6ed914e9ef6cb1cad6ae0d96abde005050746b54a77cffacc955a1db04fe85f9cffe027063d6ab9b6330176cc7b08f0deb5d60e61f86cb2eecf457bc4b5f69707f8f48b41bacbc6d233b2dc47321fc18e4cf7ab21d66eb3e0aae051f24c51f4b96ccd26961de4be52927bdfd3fb6875cd1f7d845c730ae685e5710f919e8c3c23c8564065be23dd3322804a91c010b0f43f7551270fe9f1d652a6c4a1f9c0daec1e2036c93db22b694b240b71a9793d88e02486a9e624e3437748f1c2cc81f41847c06f9df2ce8c2cee548b56adc56eb5708954fe7c9060574bfb63091dd8402a49916956b39468bc9a4d0bd09eb5574b3e26c4415046268179b4ad59e78e7f6e77f9c9a18bdac3b3fe35c2ade8a50e6c71a587b0d0f04c070ed612442ae95d247e4826909361872a6f450d95e4ff837d1fdbef08e48bf9ffdb6f77d1353b21e04c0e3a22d6806c7905a44e16f09954ed0b9f0b918e6a0c89c5e7d02d718bbf69bd332c8c3e105fe234e3777d90382d84e68d6421cd6948674469e66384cbb0ff609b0cff242f0749cf33b3087408dbf856ea70e734b5cde2d4d67842bdc5d2f11e3b5cd855e9b0944c41cff37245205540d74d53e07f1550e91f3c6136eac7d96bc10e70f027f1c751376e01aab061c01f2b45bf5c64abcbeb0255eef431ad9303813814d3ff22ff73b48513293cf43f92373a93f99985c06cab767d3d3724be92a7bff16059fd3638f83828a3ccd0ab017efb80ce105867263603104aa6b1040c162d17517923319427affe4643f8bede7e5e1b5f9909e5008344b092ddb66d01435c8c600b926fd2203a02c9367bc0b6daea71c96dab99cc6d6756fddf1686fd283edcffedfd4be2ac921d4827d5feb8a46a0270ce146c812fb8a003bf6471c6011cc410ce9012097ece29e576626aa24639a6adb0dbc0345b612ffbbfb42b6c7348c41bdb58e44b6e43cec39374fd28e43292607c7aada271faeca4025869bd9da1469f26209636f8eebf545538680bf3ec8cb5a457ab3870ff63ffba246dacbc5ff283f6017b022162ab7fc5695ab7cbda876095b92147662506de0545ab3f3fd9d0b8f43e5d83fa60c3c571da3e6c41238c3b1509de7c411779225d46162ab68e90ed84a15b6db2b878f11d6046d1270dcfcc5e689b62b8ddfd21c981c3cff46ef2459cec6f0b5b1d7865c69af0c534db88e5cc8c63b126e0ab734354877c6fb9357ddea5ac46532a0ad90d36f4a016f600d069ab5db6c42d3343cdccdc2d5f7519b0636cd8bf9ecbc94d17e15b53a1ad9901504cf62dd46669a4701a7f46863f06ec4e0813650b687b50e2c31a989446539d2446df61d2fdf0ca500b7a600588adf60c2bd4060418b7e6fc6242ccd2831b6d61e8e8f70f2e6a1fe8e934d96b4cf90ced2ee01c516fd65b572b551d7c4eb55536bb3bd7125f5e9ecbb8be472f2c3929010d66bd8b0c6e0147b7e5674867ecea66d35b3dc43f90d7f607f5bed8f6fd9d6bceaef1e374c6f0d5aa780bf5e6f6ad7fcebc6864d06a32304ecac161910c2506e1d8e86cd0e67a2b8246714d0ea01c287e6f4d871c3cda8bfa681307b0b1037a3d5cc115d9213ba082d2148d431d4a8f4ad6ff69efdfa6cf6e4fa159c86b6dfbf69d02aa05db14bf6bd8b1af1000b9b359bd03dc6e00f43672a63df7447b936397e8ca1d68303c8807cab75b1f255d419209bf4ec444f0c0b5c6fad273f768cb1e098390290e97edc9a273b89e55b805c032a3672e93929829da491d52696de3d2005448a871c920d5dff6603651d8c8ae08ecf3c3d8cf3d52123c5c80b4c4525208aa74b16fcd484101806c9998e65eb50b7af701f96576ad52436437704a73d4d6e7e61e469bc48034c2abc227275ba0f8a1c1b53330f6de30a2872c97f612789ea50d28319bb97e64c92a87ec95d0ba110c90ec057d5de5e1e36496049eb1ae4156d7b3017a8e6560381c0cc289ce183f3936e42a4aeae643973e220f6b55ff0da9991b1ba301658b103aba8813a20569b4f38d8b7cbab30a0a03554a818c72fdb25e465fe4f4098e9caddd83479cb2f219ef2e9bcf2c23384a7dd94f6e3fc1f1dc58580c614b46f9d3458957b68fd318cf80185991ca6f713368f1f925afcc8d0101da768be9c36022aa5fdfd043299b41286fcf7a92faff043101b21b28196bef0157b28a5f7e0a710633ad17fc4227b6bf748459e1b27d0621f2b9a4c60ae08d8ffae4f746131d1310bf3188f4c26adb030079104fb7f8fcace8c44f4dc0c32901648df5d814704dcbc920175114807f028e4cbaeaa04f39a7722a7e0c188d0949de363232a599827d1fa9eeefbddcb7257ceb616048a6bcfc1b99961762380e3a06b6e5fc35815218f1e7d651b444a1a766270522b2b185cbaee77bea2ed583ede8050db75b2652e44f230271571483f718b1ce6e8bc4d673bbeccd94c49bea3348388016008b7098e6e44da549d603c5350a47ee968711c3e9b3dce4724404a36bb6f44ce04b54bee9e58e1266df6e681a34c21833f3108207fe4288605900056b60aa961874b090bcc0c688b62154be4a5d2ae44422fe10a4864b79d785bc59b943b67f67b31666342ab1a62c4e988d671e2cc7872898b5e9d162a784e806e3f6db2fef8a003814350645be4dd68a84e609c53a03e227436004c9b65ba7da75229fca39426de28051acd6523d185dbe76457ad964b1ba4c27d8d7e2afae03af6fd2b5b992f3d914c2afabc58f4450424ca7a7f977cfc3dcfce3f15f69110a28438bab05595e59e513c14bf0456db986c9ac7398fdcbd2abfe9edfb65341919832ca87cf3841496f466b40f494e9db859cc0f557b40b2fcb6486f86443af373a2293d542aa9ff0ac857977487a09f9370b12cec99df24b6f5377eb9bbe05ed94c13c3038bb3bf6a3f343fc73c2b341370f2cbabfe529bb1012d0eadd04f277566a559385eb379dd176138c135bace69f5ecff8e26c35976a86177adc7084e3e86fbbef1f8992e898ea0aadaac03ac7c709591de2448e1968f95f248cd330e51f889731a011382955fde7cd41010589cfbaeb5f3a635a24fbce3e6440e09a7b840620193e2d4fdc4c5e02f3da8dddf8d1014cbb914ce8c58ff7227d407d5798dcefcae5a1ee8088a72814727d264f67aa0cbe5e41f13354fc9f331f845c399df96d2452eb375283e96dbc8b3de456ce9dbe17a8643009d5b71536f21efd40f23e1274c780ffb023747516298ef2acc011a4caf2b434e99695c7141ad8249247b1fe9a045f9e8f885b01790454bd4697ccf8b94bbb4a487e3dd0d1d6a45acdbc7c9ccbd3e5c08f292ec3b4a449712c4c0b1c275cbcfa8842bb0f4799f0aea6c3245db707f7a3c08814615d00536e26ae652f090ede1e53758ff1ee63313ee7e116f147e043d4dfa6781b23dc202789a7aa3202e8430ae19fd9bb948a08c63da2ea835d6114c6bb9963a1c647f404c0d4c9972792de3fdcfd8eed93b55fee311704a414ae4d4c90d81af3e48176c90880f1b7e218e6c185c3503af71712525d42ea95e5159e88e150a9ebbafff548a77cfba34945b525eea81f0576049791f1c2bea67087affa9685d6077c05797b39a32552de7da7027e43ee58f0a8344ba05ba2a5b005ef5588746c54601818a631686707e1acc26f87acce043211552b4f47ad66c8bddd919dae5f5dc4a59c0438c775586f81a9873102e5c410035f1cb685c0115094d51f4743e4eaf0b2441d17b91053370093b73f890d5bf678b7c56c8fef4cbff904600806714fde8e0c117dbbb18d9579adff966555cc1eb080604ba07d15583e0d2c4a1a78646d870baccc04a3f3dbddf1837c88badde4c6aee82e376dd73fd8cd078611f86021814dccfa5c8c4aaa638ce839d61a502c92dc122c3111933dc6b4f530378292c778df8b8b9e6a696e9fc4b4f251fa0df6d1b012446b5ae2a1ec18c11218912e7ba9e775fe62595aa918856b31bf74cb0c93ab89c3e4d2158d8ef01449fbebf1a1afcec7e54f08bbf355774c3209d9f35ceb43be495a6eab7e316e57f85c1c23aa8c105ef59ac2b34aa4b5d7f75d90829be82ee1205d11a314f4109675275e2922b8c243e050c778f2bd72cc1d16cb7cfb351407a97814bc8369fdc0fd7644d54f2e610242f5455517671cf35ff4046b3bc007e9d38ed050c595e103a6f1ea2d983b610c739d95791b3cd8586f4ef18e9e94760fd75f5f64c75069587a4efe5cf9f43fd9aa9f19f1bc975a0b3ea8523b275ce3a19cf8a1f41ccb638a9cfc520f06e64c21138a2c938ce0298a17ebf4a989660730a529ce44130a5b168f41ac5ba9f44979daba9bc6d2b15dff1b95b619c1fcdcd23b736adb9bb801c0f6b2233939074c5d7614cd43372fd3e3d700c5eed9a689eebf903d3c7be84f09111a9f1585429688a84eff713732b8364622bf9dd46b8ac104d6e0a2a8a6315d4e534a3369358ddda5a3c14d2df901134d4aea4bbd2f7156111646394a2030e8d6e5d74ae3878830676c84d0f18187d087674acc073c4734306502a7f7406d5464353749d9abb05c575358d5a7f6637a3bd5b08d54c96ee7455b7acc603cf20e973a5c5b1de4c1c891a872e1116861f4f09170866a26a255d2f71a04561684cdb4231e3e2ae5950cf746f1fe6ddeb8a450652a8408d4c9aac6f228ac347017eaa92fb3bd75e08564055aae658305a3c17534703412830e77d64f82835677e1679d6d1578e0008b9d5db72a1b6b41a9b441f1f442f4d498fae25cc5b0081c1b65f0a39a2f85a9b52da6ab1dfe53a14d36543ad929cf200a4e2dc314059d7c17a6820ce72e0ba334d86303f95603b67f928310dacd0aed7df8d0fcd77c68e5e82b8408cc6372626ad835fea6ca6bff3b4eb15bdd4199bdf890d05f9a3b44e68ea727c6df354e95c82c30d729f0d6b98f17ef1cf5554043be5f975b07ba869c52fa5098205329f08b4e905c64c0e8c701947b4e4006c64d216de06f4b2e5541c188a7871e083ea95b086ccbffbfde5bef1b7f222974aeae36c24e2308928e2bcf3490e432891eb518cc586346155fe6bb080e51c809217a03c863218c567b2bea370eb8799359bc6ccdf561c922d778d859b46d3a7048571d8628778d98c28da219a26076ec05f6d0d1ae7d711b2dbdd83bdc045a85690128e029609209faa8acdae6e414bda3f81d6eab1fecd6211e4953b24ef14207433d4573d380e5ff1df8ec12ad269013c57ecb11d79738da63df1289bc87f29614f629c0ee528cb8b7734a13ad8445c89b0ee167d7d2f0189e8a43120c6e28fb114092c778ced1840c38d7a27e2192800df96b8182dbf8b883bbedaf3c042f390bf517d5c1e30dd8150d9c88ad9eb4c5cba145a978862c01d04b41251ade57d0a814ae631c1920a255cb16203e51a33d744809f315bae15d3a4fd404697ccafadb308fd047019e787c20bfb2ee7ab17d7dffc7d962b8162d2a15d5af38bc1ba244989531cc046e46da626cd245da1ec349b9a87e1af3cfb9ab2095799eb7e42678a6f520192857f139b0a711f20b23828a34af753be6fa61df1100a2a4d8b473c8762e40ea6c787f7d1ab57d7b42bb5afb3db524cab409fc752620330ec4c1ce10fbdf2d12e684ccb3980ab55a108564e295def99306fbbb7cbb5aac195f8f4e706726e644ad14130e41eba726c54ad30a6da28807c22b442ad361db6cdf041a2083a45bbb8775893a2b486cbc731eb1294a8dfb7edf1deff9a699de7bca8292c230e0f4ee0bed65c241ed8dd20bb21e32f6e72ca22df93c76f82af519ecdea0e6194a718fb2ed7878d81ab53d0529e33a17435df4edcf82f861a6f70a8af3be7a22e961dc1445a65b057f0f4e1f463582e7b34e023150baa1e6bf69614c98793b3be7b136ca1efe44f5ec042a191d6e815b44b70d26cfd91f7c933ce2fa016fec6db4ffd655e2e293962b8d2ffbb8cfae0e90866366a536ceadf67b5f51c63a7b1d23e4b8ac527aea751e27b8f2ba4ae880df66e060903f96a3ef45618261eb1a8892bb244df0b5497b8b3b1753ce3fd0c90394009773f4a9f0e003d7c11a2e2276261f6d807ab44be0301ea7cce24f9b4d40536a81982bb55a5b1aa98593f9ec2c956991dd084ca4982c180ec9a00283b2f59bb8c111eb36e55ece013990d87c000dd68c791bcb8355b62a046cf7e2fce1762a993c4725fb3d655519f53459729da588121cd5b74eed2f84a10fd1c4ff6424684081e0b750c2d65151bd26f9b20484c5a1e41edc6b6e0113a679d1af5b2fab65ad6228bc5ca525ae6757604b85e252015d096f06e3610ca5ef42a07f3331aabe791b0c8dc1f6d034d340a61c1d5dfa6a58cc15c62bbed2bbdc947519f0c03140b1ea5e8dac46052f06ff656859b95783894ec5827101628a5f4bcc647d6093776855de3b3f795c70ccea0a7b5f357c5248268ab87f0773fbf8dee7759691369f1f0de7cd83b730e0e9536c2a72f3e5fb4ee62ee095654521109373b3606d1c8eae7ef54d630c1c07a519502d0378ae4a65181190c326d48a70b3e4c1476529868578395de5e55a26a0ef16f98034731403964403910bc32156e1f2cdd02f450099c6f3b25c0cd0a884120e10aaeae9598824aa93068d9f9141217e2a44c8c9f3277aa745d09b9cd038619c340f5599191957e571dc153ee60c06ba68acdfcf13555140c020991cc8d51d9d56471ac3ac1b7f031ba1ff2024f046f0c03a59a6a6ccfa153250d04da2c95a5ce53ae37551099049659e3b966e29f15d8a26870a4b8369133553b1b86d27d087326288d61a5229c890587567b68a80365fa264966d1015fb60fd191752cece15e26c875e4d92ee8150d2feca8be96ca5ad9410a0459eacdbf7e70fedbb32e92c6580b400e717f51f428c5dd180988fcaf0fe20073b0f28f84d2b852238f1d01ef82e918a2101a454132f85ff966f19056c440b15f10113486dccd00204cdf7bc574ac6f4ab8004e712612f3fca869610d4bb8e81b7a182dbd7884292348f203ac678217ccca57750ebdc33a32506ace43f2340048ea62625dfacf0ff18c37012d05f2fd4963388f6366d9e0644d6bbed0d5bcaac890390db3f7577a4669e6925c42761a18e26f59fc09c9a174c821fb79db46872a6e20cacee0110077e87649c594ab55677376256a45d5f2c51a6a4a9a92ada0113933960d47cc00a8a0da6422c84a368878556dd0fc971aa4fb59c3127464932e1d041dd18c4fedf214ab3492923bcb64264650867afe1730a6b498ccad35f4450a5d42515cbf7728fca23c0d34f85f9190147ca0cc53df21effb9216dbe25ff85706417c6de516a099e8ae9aa87558c95ec297c8557281b5058d13dda783a8d0789fa8c167baddea12c37ba679decec157a613f49c39de15769afd8b6a92988d40924df0a8c87d4501c5ce51118cf241007cca08686d632e127bc2cba312a18b4fdd7409b5a755147c8cbfa03a4b50428b198f8d60493e60baa84dc61e380d93199fbc2022faa2be04db244adf9c2219e6d0cbdf2536cff475d40712663f06c52541f95c99439fec90102da2132b45c1093b756512d2a464b085581102525f647ea20c53b48207c61042973ced197c7690d3052dfd32b088fc0f28eaaac1fd0559421f9127c85d3d7d0a2b4854f74305784328521fba69412147faa1a7890ed4d16b2747330cca81614930e6c22d0fe55b8d5fcebd5cb0e18484c49456835dcecfa2124ab89d426b1491569d688d64a893db1c5d05542c78d29b31c729e94c835e9b76a5951c239f0b4e8abc08466521ecb023c8236e78b2ea13e4303f28beb82b345407456d4eb4edbab8983f35c4b8721c1ffaee026f9705df285ad996e681298cdf9297ed9cea5694d93d86005ee5c5a5d18e1349d91e31a61a0111611c9f9207d5ef9b12ffd4d1edc4abfda3da82da52267cf8693b62282dbd2856520990ce0f44904a7e6209cf63e9c94caa4f6cfa4d5b7453c0b589d2657628bdb1590b47db65add45ecd6625a0bbe2ef1bf0e74a23b1da52837e72087c3627193927d9903af58c889c55c5b7c0e0d3b4c7b7a483d2ee6588a356501e33b3de8d267db29965ec908b14ba6aa426bf7e9dfa3fe1ebc814404fa8c458e78d9299ae593f33472f3ca2f98c68c03ac5dd402c0e9ab9209c04a8ce173d1e0016d1971bc1d6e66a601c49e9b0a11274ceeddf8891428b167896e83fc5ce5601875742d610cecabe7e086a27438a323c0b5755d7eb88206c12c2afada7caddac6125c917454483a1122fe23132cee92e236064b4b4e3693aa3099f0900c5ca84489a9fc7b5d8cbbac8f25ed33eca41bf0cb7194836470747e05a805dfa2c5084158f26c62625f17404b500fd63548ca6d61993807e01bb209540fe1cf3f9921a44ff0b9cf0e88b44a1d100b0429b477c7f6140f3ee140a6821acc5326d57c1a467ffe4444176ce33e5759975eb3b48dd40922f34e623494e7924b892bfc1b4bf085eba201fa2853964cabe0d049f4eee635f027b5b142fe3cd69f10fb59aa40d7b06bf6d9fbc1f05288a6181299f6568ceed998427694ac64a3a45c0786c50e05801c200a35811a0a89e8a5ee135fd8b1bd0eec44b62c69c6ceff7865c952073bd8a9b94e1423526e10fad5871186eb6932771e983d19f6888802be3c0bc2e3a069442057b61dc6124a6288964390fc520e50f447e2727a6e05184b3cece0512074dd700588405566889ed3522d0283daa0909edf0198597b4210356972c4147a089ac407dd4dc09d99db0beb611f8c91bade551c10c831a06f7d7bb0f26f0da1ab14b5e550b1d3b36e2810300dad6355fe90f9f0bea1f1b0a43bb26621f4b3f722d87d9c41cfa2aa0ec2115fa4d44a14e4bb2beb57027e2107827749ddd11970892f625bab53b15a8bceba9865bcc8713392548fe19b4d11eb0fa575a1da42ac86270d0b103471f7d3adc6cd3a4f4cbf858c947d3e36d9f6722302993c64bffb95d4d108ef5fd35bdf8d8fcc8946e6111b139d4c476024b2ca3a9e005735db898253bb6a7665f7bc534fea2c9853ce1d4000e714380f2d5fbed9da7cbb3bfeff44fa2c90742717ef2396ae871a05fa90ba9fb341186e8da40482f2dfaa830f6ad68235b4c0baf9946c2564dea150bad8e9526e84b2eb9d50e629c0451bb80f7f50c0808c50cae713ca1580b0b4e50805f7e833e58b07c4560614e64337f43d90afe5f1cd0653f5cbf13df2cadd63b076c6177a0e6370449326c3537fe808f58384221f8fa1d88cb8e9e2a7b3582725828a39141d0bc99bb403b9c078b551e80c6fc260727204676914eb708f6bb8263c51c8985ec7a1fa2bcb4f96f09e779dcaec6390b954e1d04011b54c4b31ceb3cef764da975c5dbd980a4709677c92c407400cd9cfcf0d254a599f0eb88e50b006e779691dec6560e5476547fafbb694fc7211db68714a6d8a2c84347245a0bc6c8241204c20f79f191ed243e3337872f1278b15a11aa4dcd965803e51a213d016212137dc91c530c2bf56d5fa91184b186cab94209358fec5879c28b0837398cfea655d52559d9ba19c85692b9c3761e9ce50942d44516ad078b5d04a01545a338b8363a850fb192a74f6a9ffad92f68deaa43812d09f9efda111b4f229f86e316a2024e285e27e73fc11ee830905109b794a51bb425416276e431749d7ab1845227dc6ead71f98f9f2e7a7a1060b563093f79f55464f102a8003592cb8cf22e45c9d6aa6fe282baa047792b23764a19608fbe917814ef089aafe418d8f1334201bec245875b73dc1b52565109f1e3925250f28cb39912f123a0dadd13408fbd57d7ec2953f350b02dfb270d71e70c1db9bec4ae5beb762af66e8d3e007b55b7f9c457375379f3a008e81b999c8550dfd38ac997905934e0d854b76ad6d68958d4e3771e43c50ec38798a090f761713f0572ce17eef28b276452660afeaaa478abc4688fbf2afb5ada163b4034d05babf74ad7511868bf9f730f24c3305ac02a1d3480b8308e3552e54514ac25e8187df34b80c494af28c8d8381f120e64788b5715dd3c89ad1f4a8fc7827193856ef738cea7153dff4210ece8e7ba20976f29d6477d1c9aee7553a7865650b9210ac33708c61862e4a9064553d6fc5ecba5e7e6018606031ddf512d78a24a324957290a58f681286e1be50db7a6c9ade2c703e1416db2d54292139796821281d3cccade14640fe03662a21a4a8e0436858ab4562c0c8b974a136a3422a79a2e82bc772654106480d30c7f1b6f579645670c988d13868575a848d4684e36dc261d9e3f4de4810ab9b5e57461c31784c29dc671ffc180bf8f1e841d81d26e7d22c3ed43c0dd2812068031ac6a009d3c793a94940175d2cd4f00572e2f99ee687404bb3beb5e4a53efab3ef38a77ceb8bc25d63cf11606ed352d2912e7d6af8b515ea0173f200369782bcb7d3c982123a40bf5ac574d757feb02901f4b6fb7ca6fe85543e6ece47b230f2260b905da28b55320b49cdfdad2774a9441dbbbaa1aa92c517419a755561532e5e095b9c925a191dcd4ec07c0346ab5fa10f36266bed092247336de747a0ed5a6952217ddd015266b41f29e464be2273a27e44f668c212a2e025d767891f76ee0a2ff12624084a34c9c133bf0817d75f9688f96908a5c8580f0ba47b9d02f2b3d72a905f3c4bdf437721768340644e08a820622f7d8fbf58b0a53691a0a9a5ff335d20cfdefa7eb1d7ea1b56e15f320c498e93fd20c1b8f1e47fcd840303d86956205325f70558b27d104ca1691cf4d04152c12830f5fd2be29d2f79a3c3ddb207463a6cce911086f89287062b04296b30eddc4deb9e41cb5cb52a9abaf9dcd36a43f580b4ad58e9078ddb3a783cc1fd28c5ba74ea70ff7ff3c2beba8c5e466c0b51bd8090f672d5d9d1635cee3cf1ec2051a313921b0c43913e64af1c265578187e72a1df111491820d142599580212ff82ad474382da61ccde20c23c896fa59fba16c3d6c1c0245d284e6e398c5f05e6d10dfd1c24f43dd7f74e405f39166d0f40823060e35ccfa4c4014d74f528c2803199343d4ad0f4942a68cffea5e02ac45e20baa8d1a18d51f8b0e85e19fb94095fcc458e572c94cd84031e950f83ea1d00be5127034951fb9dcd97a0dbbda4bdde8e2520c4aa8520e0d0d3d376a5b5c7c61902f1c43785a3dea4527e8378d7cfffc07b10605a2868ccf0dd7a995ab66d94e5d966273bcf1545c82c1bc659d2694311676945957f8468e23712081ca200240b208ad69697642653a004ce2ad132955909ee71ec6ca15dcacf25da08ba4a4189381d55fc25b39831a43e2622d9a4183b4dd007d816e17293a01e1793b1d49e3653ffa50dd4d7636495f0b9750b9068da012cb86311eca7368c81a2a63b4eb4a55c65007144935203f012417089fc7508eae59e310069a308e1d52cc1012c0c874165086e9c186bc79c5301084b3da5965396322b5beaa403fd2d32876caa960184ed8a4afe1756041fe86de33177f707630f060a2bd59ade7a40f1fa88a5548b283a636890163c90670df44a15c2d6b902ab7b2d8469560e2593ada629245d28290d4d09383b0d36599dc908681173214552131c5f41bac29314892d6988583d03adfc0db1b3b4a50dd8a4c20edd7092649133d4d8b83c2e22c105a814662999da3b70d9b343ee5a2256dcc1acb10b2504058494402debf16b32349de8709e5c4757e2aed5392ac97d86b1acd528ce4eb3b240ff41364a198e7f9ab5ffd702f86c73ca144c8d078cbd998740aedc64a43a04ad40d4167c9a6f354b6dd7e068dd61410d976b8a7c3b00ca4df3e8f21c68054a6540ec6cf1898d52c3da620b6056a03a2ac500d4f0cb9cdf546444bc966f0e6d707ad51c50e267b7af2500c5852460c4a30384958daf2a695e0042c242ee7193aa00a579acb5c4d378daa189f22681c60ba97ae16f6bb0946b0540cc05c285fd69ce7e4acac87d569d0b406804c65abeab9acd95b1a65d661fbc30ffe738d26873e766012c1ad9286e7cff8bc1fe521898042116a042a4732d071762921e1fa6311cdcd0b956408a01fbb7a8c28ec3931528b24c63deb50228a27bafe275ab259579460d13f1fedca422c40d114734dac2ef0df69904858fdbe34313e3f45d2ba05965cb350875f25a996b05042f321f5dc8d361049ccfa3fc39b80244a37edea4220618e31171effc18f1fb32a948c00661a04992ae1b6db6bc9469aa212f0adea4224d71af78f93203380ef47fbad36a56019133960cd24332aa494580e7ef878fb67a490ea12aa0392dbbef5401856abf8f2bf80aeff1d947a20ac01fcf835737d64ebe0cc2ffeb431e18155174552a8dab6fe4208f82c9d84c059e9a9190df6cb12b3e4a0e95a4900800d90d5778444542de39e41e922b3541f51ba16452f4a0a3fbf89fa1c414d890fe3f2e6d428d4532905a20a44b2d7fbb4e36f516c62d6e4ab07f1c6124c7eaf21644c90f07ac4ca5c057f8f380c601017b17cfd816e48e8d3ad8d141c3de42c16cf180e0616e0375971379950d1449d9b7c94dd4bd824bcee250a2d80640b6adcc8b6ef0b6322030549087e64156ae42a54b6113fa805a5b6e2339217e4193f8b0f097f69929ef5f2fbe550404ab28f6c013da687fb9419a736b411b6a94a0dabf4d2a59a559811e9c89ff41e1a1ce875f23cc08fe5a8140051c9ce4a5f1f5231e6c9edceecdecdce82fb1ebe26381d0e356ee39ccf6e60f981c6a6fe22f2ea8317f541f612681f1ad2cb05e816cf0a5d75a0df79fb349490d333554e005db04b6f5a705176e82bf51c5c2ffd8f3f0f217a56619852d87d529bfd374e82cb264b2c72f791d2dc863bf46984610bacad8e3d1ef6cad9c0f0a3ef0aee93d5b5090535fd3a5a34740649f88e21439487a31d6876ef0bf62940a125eefa9a7e853d8df03a36dff59bcaa0438ffa6173c831de19b53bbc3f026d017be6e2f44ae540a66df8773e68b64495c48a7ffd9432f94cc9bc9a9dbc63b4c8365356174332f2a76634e7d8e57ca134e0be2dd5e156775e0ef9175b89580b5ff0ad80d7649c0908cfea22f2b2162d59a02ef3e59db0cf135716bec02cdf2f37f91f144eb006ba128921e3d3f25bc7ede5551fcb9fb92f39bd228df24bdc77ef4f33e85586fa95a2d01fee6a30a829069052bb6a8c85ce95d0bc4838583d540f76135c695c578d64f6ac7f8b2f91f277e839163508f81fac2e0c2622eefb7c802bcacfe9ae1b1cffd39ae7690390499cde940e1be867fca1b555b165da595a7e81a3382c9477c185245f8cf3bb2e5dfb0d4003a60b831ab29f38947d295634ef741d4eade30c5681bd358b82839b1b12bb0bd7edda657d5d9208f27bd744783cdcef886397b34aa586df3705ff18af94f6500af5a0b5ae649dd61d3fb0c93370e5348a6da3a6b3c3d20ba972ab9062045f920d31e420672f269a0757c52e8af4096c746d9515c5b5c0e0be28d45e45904186964d956e6b2ac342c989da546e4aa6f68fab5080ff9c40f3899d7b39d115f03267871aab349a30e88102de046a6ca54b7fcb28a17776986d32ed01645cb96489042a40de467dd84e6015597b4a47f99fc91cf308c33bc3efe83bb95d813f8b73f400392029f98a6504ce94b6ca05f3f73ac1d2e05dd8bfa30960e4340aecf59379574c757f487443dc10f959986353e1de9ea54e023700880ca6ba2a51ac2c7577d0a2cb6339856e4e00d565ba7aa9d6b153f579a049f62f12dc0b2dbfc97f659c16ce804c1eac2d832616209666ae5cddc33e80d28451fa63672a089547f260241c2795191a5e57415c03b3a2ed3c152ffc0c809c0d931f0f7a596d1bbd06cbf8784ecbf8bbe28eff40a84d93da43301dc3376abd520086e260d6004323da4f851246b6ad258fbfe40aef72f6b4620ae5683796418218861e07e0a58ef007fdc274011766c4986014f3649300cc80e6129738d0308b1e04eafbe451278626ce5ea92b2d091335b5809c4afc3ecfae1a4df0a8c4f1ae03f2841907a65c1675635b9cc4cf66e6e9292399267d8efb7155ee60987f00b8ce0e51e1a2cc0656cb771a38d176043720b23e8a1c9bdb15d4a4df5cd192c5371e2530b889277b5000330061085edddd7c08998572582446c19178a3e1dc2b19a53889d659305a036d015d34148e6a0754a9d0fb285992bf0f26d59010154e5430d4c41b0747c812472809a6898acda78a86f4f3fc2e3d948cd7a1216c69af992ab48c9c7caff310da53d21b6a0101b66f961ed35803f8e95906132730b9a8157edccd86909b0083809930bb3c8bc9205d0a5788ba29f1c3bdcacd8b1ac396eae883b3c3c51b4987890003243f7ad6cdef9241c35f8646dd7063f5d3c855e912074257a465fa033cffc98aae553205530af8e8f32dfb7d7ec2ebab3a080871c4f1a500f23cb2cf89edb4b4a1ff0570a9057b680ff982b96211538d8eeca336b7ef1edcad335580c04a7c79759e0f6ccd0af87fd0e46906cd1e09c7935f2510469b95cdcd59d49a9c40d386780ed61cb08113f995760dc2210396bb08afd1498094f228e8c199935f8997df4f4b2ba25e1888e0a1779ff68c38f14692f0faafa3ee701bed93c40db3fd6371a8179bb91e1833252adfd0c06710b7dc9b8e92648267bbc224441ed550e00ccce5b4a5a4ff4dd32bd5100264d35432d80529a486bdafd68a823e291be52d6284bcbb98f4f2153ebe0ffc63cae598ea77d1faa289d5ac73536f25d7e21606c0ebf94e99600edb551890fe47276f7a7d14ca55c4e8879263e7cb8ef0a18a581d26a72372f6ec795134e05cecee4e9c1b328486ab911ed5363578a5ffe3aa0204ba1b263075548be10471c18038f3669041bdde3083a5bcdcd46bba10516d87b1230d18816bb15550836b07aa95a5ddbb9f8365c76ff6e1378d8096fd99ee52684eeb36607933ac681c546f9ed25463a41178fdd2c1724d0a75c1e8ce5a77ce2493a41c9ff4da5151e91a6afe054059cf562ebbe4aa20d2ef71702a51b22985b9b9fe2950a05b3263c175b355739e9971a71f15b7d38b1ac206063b587549e74a541304be696cc89630dec162cea583f1f62292032a06f5d9750b34710acca301f276d07565fd28cf5a6a45e7845473fa73d68a64a6e316856722583ea55726c4de641e61cc51f98a5ca75287b55a6ac180d2fa9cf7273c4badf4a95ea6aa91b75829847daec563b9f23ca683053478f236341488eafdd2d69f334e13a4741e138e0bbe6bba46d7e5a22f2e85b348c2ccde2b9225eb14ce8a896c1cd9aa4a8b74911f5bd7184734efdb2960a5478ad3763da31d0ce06091e2118672a702054c24232860c5e2f5445bac7724aee7f31b6f2719b6c31f7a054a42b32dd2142a0fc28759363e70513f3a3c98c0374576e083c034993b99db9ea0ca8298b9019bb5901e8a6e486681f4e4c2c5ec4ebe7dd1fa12453042ca10d3dd8bb6d9320f417e78aabc5e97930df3e5c8971720cdb2bbbb9a5704a247674380a7425cae4ffdb18cd9b057c8de46cb051bd08353d19bca5a585de9c88ec3ca4c074fb70849993882a353bca9f2411c5bde3911007fb35c6024b0dee905b24c25438c92d7d7b788d9370999725bfbaa01153255cf77875a158c3b213ab8db8b545c99afa9cb89797089007621ce9bf0a4c45b35e0ad83ef213b34fd0a6633adab9bf1006f9b8c747718a0ed6ebc3b6ff2ec45abd8184a00de848fb9d71cb94b57f7d369a83cc87afd72f6ed1a837153cd728aa855bd1779a27810da86fdc22eeb80e01ee7a39b57ed581a88135e95525fbf5d840f3af0d64f9866db18466a58b8e7765aec96bae47bb55e03a8ed25b5e37ed6bf9a2cc7b18657c6c4946cd5b61fcb428b367a9e61b6e7f97ad2f50bd924521ee4619fee5f504d03f9399ba4fb322c8d7e1d6e08883c9cbbd9d50a2b7934ae08d4701c8fd63bdee03de694c3cb4097127800af48380ed3ed4fb3ee07d63922f6d4f377929bd13b7a077d2a31d34ecdd8a182345cf699d10a2c8503dd23b1ff17e35d1d08dfb0e9a11488334ee1ee93d1f78a7363122224a5832863d5a8f1484d5d62d3c32d98dffa43bba500990e7012ac084ddf4a685f70ae9fa704795f0ba69aa8b04199c25835eb869b958c87cacdb341544c4d40fb06ac4dc61a9c46d1ff24e63424cbf60094b0c21fde2e009329f02b97c0938835689d8b44c9a199fa3907ddabb6bf496f81aefbfc6b836c140b9a6a161b3648d8980c74ef390b0ad2060d3dcb3187d1e790c1a839b7b9038cdf01d0b976dcb0fb0c9d1b91038a1d8062237bf84c475313d1040ac1628786538c63b97e94d057edeac71964211f11d15f9b3e3edf333ec8fb459979d624fb9e9b73982a03d229b39b3f139ebc9fa68b1703370e0c7cd950f965ef5f4f2715a47cf6d0edaf73c7037223631208a95ff7d25eddc065978866ebf89c8f91dd2a0107733cfef117de81334f6ecae9d3d2fb2bc4afa33a4fc9a2fc7f2607f0e9daad179453917254494456d31e493393ed3ab1f4822f717e212debd0c31021069d14653c0b503c74ab6bf76fe7d1956677a51e3770f1aa7f4a555af5aef382ab8feb8dfc7223285beabf12dd219a0f4d88cebcc0107a5815e4c49af613e334d95984ccd6fcc519e4c0f4826b68f735d94c6e375ac3207ad1e189027ef1c48e0ccd73ab975c2432f3eec40f76fa60b5bf899ca4d20b6468da8258a4a08e2f2d22d20d031f57a58010653e75df99646e9516a1a043ed8a7862edfa571f3fa50b8a90fe1d48a0260a56bb484ececbdc4de4f25e527386223076f4a516ea93e66bf52bfd44d0e84e4ff95be3944d48c056e83eec252fd3f09666efde32cad279ad7beb8ad4b1f47db4b076d3c2a497babfe7912c6a8d213a0b0cc695d9dda398c8aaf0fee199fe49be48a33ffaecbe2853dfcfa87aad867e241b17d719ffe2d6dd6624bbfe7076440385c6afdf9f4850cc75e2441e0f73774bbd7aa90c6a4f4ddc2bca8acbbfc517d8d43014c38044a9fbfb355305e51493af93830f437b870c9841694647079ac7564742bc5cd88ed8dd08e09bb3917ecd7b783433800a9004010b4ca1bba00895bbdadffc602b7df0126f41e6fc75e1e7f1b5347d7c692d808d9846cb2f7de72ef120b7c0b090b33aa1f50305eb0a4683e7364e6e8e6ce18b9b939fcccc97d59de90dccc1ccd1cb9c1b8860756393a5d15a39a2124705d46a46609f03347cdea6a86668e34ab5b0dcd18691676f8192d6a86800ebf1afa21270032705800f06115a3071a182f66647e54313cc0bcb8c0f72e2d2c29d48aca8c2994117101f268b0c0757308c9b1232f67bea43473f4542572e3b9b1f1081c3ce22090e71032df3c468f977349dfbed273f3c42e40e81057d344a7047ccd50b350405c9ed886cda3cdfb259fb75fba35bff97cf6925be2c1ddc09beda674837dd0f8cc110d2b9a6e3d32739c894dcd6ddbbc816c1e314aa88668dadce496787036dcb5b1b1c15d7cd71829d5bceb460935ebe6908487772eb93b52eeaee5f46ecbddb1e4d67277a9957736f7cc3b54ee2cf78b772bb9b1dc9d4a4ee93787e5dd95bb4bc94d737728b967eeee24f7e5cb29397e67fabb98bb33c9fd7e3926efae94bb2bc9fd075f8ee9306fdcdddce6f6e6a2842eaa850a6a157cf9881c6de66f6c3054ab71e0cc9156d5dc99a3257033ad6675304442cd824705a17634cbc21015e0f007d22ceef0ab183dd0c0783123a38ae101e6c505be3f38a85b90ebbf69eeb35cb9fba8fe4a5f65cbfd943e4affe49aaec9ed47d32fe1c9cdc03a3107413287647812aad5492068f6403a2d633543191600e8ae86607c91341fc47d3b3ff7edf8dcb7d3735bd90e0b8f2803cf735bd9ce8b321d4b8f0cdf52e0ba99a399a3192d62b6ad09710f45cbc00311c201612a0222c354f4629b8a3a9bb08032367c5276fb08e233334711078628080c33739421110a8628c3a386503c502d94106b68a797e800a5dc112d036f84149c068d90f0312f636215773a12c20492ab8c8823ff606baa6e152fe97d52c723b9d61b708b7c9debde107b51f43a7654a8fa5ce13c03f7766edff5a755f5d869bd8db7696c0cfb88345a557bb44c7d8db547abea4ebc473d727d6cd547a1fa3eaaef23f5f6ca8832f5d9a54ce05035865035b2291465eaeb5b0a5cd747b9566c6302e99e2f80ef07ad959f13bad0ca283be73b2072bc22177f8a510810cbb594ddd0942b461bc29e33bb9df6665445bb9eaabae1fca3a957a9f08bd6cd477af817156c097f82ef9585940ddad3a20c53b3ba950c2a72d0056c0738226cb55a2d1c310b56d6d75a0f379eedb50c1ce9da6dc76dded20bb82e893cbf5dedca5659285cf59b01e21675c824bc82d12a0d53c1694fe0b66b45f2d168dfaef65a5b356bf4115fbeaa102d236fa7bcae392be46ab44a4a1ffa53b57726f97ae9fd700018437ec3217939a4fa8975eafd8182abef9e10215a255f0f007f40c08b212fad90e5496e112db3dd1ad1acf95ece763baf115d630837df3d2b7c8a4001c57c3d76beb07c34f5f5ba54552c63eb91f9c2406835586fe3d9689cf1b6d8628b2d36edf31ad6988819885641f9682e19cdea2610f35246ab649ef3a776bdded78551402609983210ad9232b2bc8cc681d132f24e04d9e9fbb66b04462b384285118e00c59d1006220f1ca10b4f5cb17344c4a94f66d6904e04d9896fad1bd069d0011880ec3489b4bd95e0fd448637718df854e64821c5b151703d762f39ded6ebaa56452965ab70c43eeae3cb75e5837a927c1246b29473ce39a73ca550e2c7aa2c0883a79a3cb48743fa9c70070c8241506808c2e0b1a00a9e0afe9190e2cb7f619966351292dc80264eb54e19764915bc1c9a829783a1e0e564f6f0394eda782a479a9fd884616bb3f3d93c96636660c64cba413fea3da0840a1e2b47b3bafacb06c43966a90255d8da6aabe0e5151b5ed7f530d27b34f3399a95a3551406354b9a723fdb66dcb8400a668061cab0059f1638492011718a7844460ffe077e25a3c7d65b0cbabb4f50bee5a1b0efa5c62ab630247790479e873daad0c2913c0f9d9837c8f1a30646227114d7d89ee11c753b762dbbc9c50e2fe924777bdf1f14db376e7c8a32f3dac5e049af014fc248bee11c32486e6282cd93f073fca861f2c6394cae71a792ab4a7f3bfd764c48ba9a2f19397e1051c239e00ee924e7ae067ea2ccbc7c24e122a2cc7c69059c7cbc0672fc48c0dbd9815803f16f6af041f21f803bf1070a017dfb1a7d8b73fc986fa17e86732081a150949987f888514ff80e0abd9df732b10d287b66c13e2aa0d8911f1542d002e74785108832cbaa6675499752a6cc99f2999282c29d8e8c7aeabe9cba9d704bcd39274a4c792a95326f53f3a90bb9d4672aa65232954a792a25535266eac6cb9bfabc29ab4bfadb5246b08274efe36d79427eb4b20ff909e981147214f23bb2108e94d4dc48da0c800282b984b98e6c4db49a2bcf721f96ad6a8c02c225c7dbc68382c2723b1d99c53e8c9a41babc0fa95bb68b0bca51ae1359eeca51aec94917df1218dcc91c731eeee9763af2e9dbc663721b73512e77bb4ddd2e2939e1a1553ae572249b0ff694542af53ec95a89639a65b2b0b0c8b3cc986b03e61bc872feb1c4c494de2c3a3dcff2ee24ee3ac3c8be9418a66bc9826de0c35cbeb350937f9b0160302ee1b36014cc59ee620020f9be7cb3c45c27c674e92e2cc77ce69bc4c252c22c27272c9bc662a3c03030f7657cbb0bc0ee6ecca223c794f350a8210f966b23e61bc82df1a1cb59dec1a1dcb1dc65c65cc694bc83b9cb598e6509b6d18ff97c0783f12dd43e635830c6b7fb3031b85daedd92935c1e0eefc9eb55b94ec48a68d5b66def36193347007f70b12ba517709fd8c6314cb35866a05c6e73c3a898cbbbdc45cebbbc04a6e42af7b50ae62797872b5b855d6e63622c65bf04db784aface1c735fb630e6028ddf17e616766c52970194c70d68ca1c7321be4e6b313795ba11cd62792a0547007f803975144f0a3f0eee7041b9cb636ea723c7bc379e181f96cfebc8f2a234cac57f1b8ccb51ae8edc1747678ce108600c97d46378526fd5717c4b4b4bcbbbfbde975beee3bd1dcca4db3ee9f10ac118f145902e5fbefa161175ac3cca36b9b597064d361e130b744b39e50adc914d4c564c6e943731318926263a7105ee6895c9ca753aaef435b9bc2ba6d38dc764e63aedc205070305058a8861908782657f063904d28750480e0604e2e21dfb45ebe88890563da188139be85a046d67b8c5b88eac2343214082c4f87be3a073007f80268031dedffb030f070e3d99771915cddfa116cdeae1ef1df4725e7e31e056d025e8d84d4481ebe0108f66bd269ab5d1d0d1d3194a2143940f1f341f37ef960f1889188d605e05bd1cfba744b36afe8ea359367fa8bfc75727701177dc24c11d2d3f371ed2e3957fb9f0da5ee2e93d5c5e9a97ebf332cd4f1745f39763dc46ade6da9c74b7b31860bb0d460175a77a5f476621bd06a380641e6deaa65cd4854730c06991dfe5dfa644ab9e91fc8056afc149b4aaaeee59eeccf66feba9828b7123d0aaf71eee11ad7aa7b946d80b3bc3a047f38e44adcf28488988f3769e4fe7fa0418f7e5ca06ae834757a4dcc55dfcddd63570f9c5db2024bbc88f8aa327328c0bb3111198294d53794c2a86842426c6450c9749528ea53cdb78306ae6174d24bf48e16e70f9853c0a9723ca1c93c8fd793b05e5de782edeb74b650e6e3c292e4eb71918c8c20eb2d023bff8db7ab8b73cbbdd0d25f28b7377719990f905b6c1bde5b6e5c65b299990b95322dbe8b3745b4fc7e934cb5fbc9667c45d9fbb4eec58300e255edc975d707826f268d5ebc6b30d5c742236d1aaf70edfe14b1d6e3c31b736e6f776f8f7a7dbe19f60605a5c5e5c30be2f7f19e625f514b611d3b5fcf47bbb96df5b39237edfee767db221eff2783b2e4714dc6959ab286779ad9ab8c35dcb2fcc753a9e6ed78293c091637eef726ddcc89161fe32be376286c1a81939e224628eb13d5f10bf722f0ae8be7fdf3ef72eb883d905bbc4982152dd8d63ee72837157f3e984bb96eb44970bf36df9cd4df5ed629e7acb799687820334cb325857489d8e1b64297a40857cddae364bfed9cb212cb6416f6f83640f379fbeb596b4fde85812cd00f41677f1554cc1898ce1f7682a499552fec977f436e8fbf23d189d01e8690fbd74fabab00ff143810e0cd223cc5794e14f578a680a81a611ad824445344b1a410f4f21e40eaf82e74e5770f027f8578b5ad059c3db18b9be11c89298d79a451ffbeac1c56c1e3bfc1117868db059d61bd0c4f2888687a74634cb88231a77049048624ecc84ccf02a78ee643429ad5c4d99ea18b8ee7f81b0a3a67a81b893b7f25662b4d28b52dc71454644487a71959e6a42b86b1539fbae98b519f6a23d99db9c7c1226291f258651b7b051d6f9ee44afebde0b6b7e2ff96d325ac8b5912ca59452cabf23b0e79c73ce09e1e37db9a91092673cc22a4fa18873bd3f87224efdfbb3c761908ea255f36ff351a3cc9c9f33489066757546d1acf972fa730bab3c83e4d918337a34531524cf19fdf2bcaa592820272021481675c08e1c984342cddad1aceb13bfaf54dc61e028cfb9a355f373880245b97b4f620ecda16e814a252323a352a954322a558a4ba920d601fb2cc96b167cbc361af2d190c4d6cbe9bf6b055cc7618b1bcf3685e4de7a6e9641ae12fd76d26d5cb73ca463d73e5eed3d4fba98dce2b6611f245aab268f15f61a678a9cd5aedb57a96137e01639a5359c42e211982af0f07759611e533c5c781e78c08f8b3cbcc03cb610345c3183ea851e405ececd12c8cb79962d13f4c303708b9d1f32563944be670f20cc1e11620cbe9b3d62ebd1c06bda887050f620827d2fd99cf3c2b0392f592b8430c28853397bef8b323e7f2d39bd9de1e6335f42ff9b9deec53e713ecbb5065c6682613f44b46a8806113f3a78437cb26b3eb427660c572cb8ae9a4c27a62678340be584ca6651773e75eb4d3775210f2720902662fed9e2cf89e9178604f64a03ee64e5f2100a791845b34e962449f2a4db937b3d754d3f5d18450aca8550ac5c0824e61f49bacd28f7e59598ad4da960ac7e66afa79fa69b8e9dfe624d97d12c0cbbc9450199bcdee43a32c6fdb44a62d48c935fbf5e96170f38a472b15a73d0355037609eaf971146d2f5378f68160ae8faca577097fa8551402b2bd7917564236e9f02aebbdc3e23b83745158eb2cb51d24aad081ba95fb8881acd42cdb88e3a0ad790a896a3301cfa75e336e3bacb7b036ab90bee506fc19047ab20ac022753972d97874d34cedc9187f346cba78ae5739b800fcca9b7609e14968f860577a8ffb44ae6d453d8060aa3808e2002e695067eacfce2158a01f7f818e7d0b173b16a47de5e2caf0f7695241450cca9c79cea369059fef251582aa69fa44e1c67848344949127b9855c8b3c0402a1b830088ca255f248484e722a2731bfd6b40bc31d1806c9b3dc7a032eaedcf46ee6d4572eeae4a6b3b060a8f2eb95065c7752a2554640b2c581bc72d345999e84e9ae9c48f9130c877ebdf2e0ba485c257a70d8b3d315fc9e2a251f4d0a772b47e19ff736a0158c02faf5154c44cf88003ea2559701275c672a0a45542ef67961c48143f6843b0e0577a7a11970d8e1d0c5f8ba38c639240c8eb0e302ffe21c048081508f1d7c6200cc848130a936e0b2d3798a3870a8964ea753b3627e3bf23a9b8fcc7088889f212e18e0e2106e355eee02e7785ae0c1ce0b847108011647762e7e5126e6d25d422e2133e97675bb43dd3392e7090e5dc7600ff8041c823c3a0de054abe450ab7838f153ab6446f129e6b0c02f877f2ff0f86fabe1e22f3847cc09765ce05ae31ee31c0f0a74f8426be7626cd6f91e4dc53ae605e79470e88aa156bd897daed80185b0744c0d7ab08672cf83780adfda3873847e80eba7624c9921abdcdaee91c30bcad0f2516554cb88eb60887cd0380c11940f35abc0754f4814f2682051c35cd1ac9236717d42ea14228190e36d2e8f5ece8c5005488ead126d9e909ad8a59ec41cca2ab796888359e52915c89954ded2f2127793ec2b3f41d9a8a0a084e05141a81d19ceb8b97929be6d86cdbba4e6719660a01afc5a8581a3dc2f5d27966e57bacbb5b9ed9a771ca2f49b47540d062ac5dfe0b629b95de9a9ec37d927b639cbcd4d56e2c1b13c621bd96fb00d942731e750ca6d30ca5347a93cdef488bb156c6a8ee3faf37672a668f3791327678a7d9b1bdc9954fa7413ee20677a9bde7fecf8474bd48725871805a4f279954fdc65b9547a4babbca5f496966bfbdeb4b4bca423dfcc799b92cfdb2531876e7a860a50bf0577a5f70ddc86e8c6379fb7e636b79b43d966bec6e63ab16f679bdbd9fcdebcbb29944b3e331eb9e406db285de536388939944bb8e5a9eb442edfdb913cd161e028a71e371ed3e39298439909985554300d3c63a465e0556aeeb93f4c210842de96a21db0f6f5103894100310fa8e1087f4c66c54c41ec881e497a247b3354076135050841e59cca0e4146b52a8a19388b31a8a3210a7660875559eba2b2fb931725c15b50caca9a951b93347ee8c9178926ca1567357457785c55d95a01c7e9572f89aa1939493d7d4f0a8c135434446118746c4f9393c8ccc2f865a35733483054c110c51b34a0e0f7345b322eaaf596f65745758603163147f1e673cc608a91601e0812b86a40db86ee6480b29a03600819121f08873c1cc918b055cb72af291d94701be2a6a1616cdb239fccae8e5cc9bfede0fab211803fe94aa4195bce6f3361755824d3587dcb3880120e4d1c0d7c010c15c0153f468e05743f087f762940e4beffa354c9088f34383e366d48a5f9481099221ca065c876ab90479393232345131a27284f351315231aa95e3504ebc1c98e1ad159cc94dba29943b54ababb993b9e3723773f462a88391bb99a30ee36a862410b028c40da2f19e9e0b82efd0a0717fb4910c8b40356c810947a40d62c8c0f4184fbc1c951d277f2114718268c0bf186ad6e9f02f9a6856cae15ff068164a2c7d854894813741fde6aea4dc9b9f62e449e336de96ace52da37c8594ad8c17695ea74972133c542e4da671e50e0c51c4795f21c2ad105909b5805bed887815b4b205ae9b395a05d53c468f9aa1d35d35d12ab872a228e2cc38fc8a51c429c0e1578eac1c451c1a07b21a6a155ca162e6c8cb29410d6b2d8b9a959a36b58d6aa48d06c99c37bfe9af50b13204ce49e373c667013ee77c443777d5c48a47abe011e456455647aba256c11516b2fb88eb5643f9766e3e58ee3f1f3f5f0d459c1f0c431465a0cf7d4476f081215a406135d42c2cbfbc0f1fe3e8e5dc1c96bce6401abf143d9a2a701d0c918ae8d1c021bb6aa259a5c3af78bc9c1b184d44f468e02dec072304f28c9016b8cf802fc0fdd07d8f56d9bc53317201f268b2c075aba2d5aa478637b9dd8c161d0cd3ed62e8a09340b0a99939cad60a4eded868373f413c08233f86fc5c548d9f07f12052b0f363536d823015998a5486500e058a4d8a0d0b4d4b0f2e31beba406001b818c049f54200181d1eb28a4cccceca8b99140a868d8d8d8d6663f320353c526ecd10ca3d9003f921e74076b20e010620002056317aa081f162464635238607981717f8dea58525855a5139158084280037099110a918a15a41dcf7646c502d54cbe62e40de7a39b55bf9f016781622cd2251fda71367e3aa0867550400d3c9cb29fdf9e4fab0fa01d7ad824a25942a649c77ab2119ef6a86688e1e0d3cc955fd1c573b468f47034f7d50ba6d8d04e5f3b6e45591f65a39ee74baf64ec53ab933468ea4601a21f407d7ad824a8f667e15d4acae6425d4ac6e03d9f41277f32ee5896ddc3ccedb3636998f2082985a10f7e771f3b9b9b9b9b9b9a1373794b4d19811450102404294e165dc2e720087753bacad00c0ed302b7cb85de40069fbe1763587c6cf0d42885551c441b55a06fe74aa548817a176b4ca0a4e46cde6f6e6e696448bb76bb61a3c0fe26d0de8b90f46d5f08135a0031482ecf85cc78e4e0771513582388dd3c0395e1626d809e266fee63347b6e43097e00e0299a4f56860c9e78bb40aa634d12a1e5cc953decddfe099a379678e944a3e6f63be84678cb40a965efae9dd9ca5cf214ab7317f739d9e39025b7a7089f1d5f50103c005eb0547450646060f0188c959092f4b6c426d8a2434915f86145ea7f0a22e480f2faada2c42f809e526e5cb2fcd3a556ce3b9b184f66da3bf249c570b92af04e9755dd566d745df16afa67d8083f94d310523395ed2d4e9456e3ecf0e9a0633bdf608a66d706ef4da7a36cdc4f9486cf35191db66e3c09d80837fb143c308618c72e2ed4595026ea3d8ce8183b771e399620a67c8f2ca57f6b93e5fadcd708b97570563ebe91cf10b564dd9e6a3220ff3364325cb0bbb7e491b07eea297f49aa47a9b5d97243dd934c66ddb5e9bb51d3edb786ec02d2e0d9f8e7247e9af79785dd4bce49cf65df6ce6618bdaefb329417e6eba55973f67598fba272be1435b080483ca534c6a7bd172faa5e53c6f8b088691816297d2fc67e316a319a9a75ca3052fa78e93b6a20e03aa882da09b852867638c118dfdd76ce18b17a75cc2e9f456b9af3d4d3b9aaa864194f3671a72347ac0971f9f4722acf3cbd9c8a4f8fe6fd15e57738ffa689d2f7e89b8f3e19a534356b766b508b83edbf97ee2cc64ed68bca88611986d17e977fb367bcd73bfa87a16a1f75a168cb27a394efc22ced6b944fcaf76c48dd5c0f0b5f55308c5cd15d6a15012bb44ccd92f4ba3adbec46d4a20637a0f772f0151d2356a9cd8c6e97f65e0e96bbec3e70d9bbadad020b455693b766f7d9c86436a55893e9bacdb2ab9dccd011c509b6c89d8e285aad3c8108a4952515ad5696b893ad56bef012435ad91e4746241e69e5ee0969658b51600c18830c70b8eec9a3313509161c2429039792a3fdb3d78909e576369dc873ad2c9bb501e98862a89527a06309405a56b3b79afd05713d69565e9bd92bbbbcbd280d35b3a3b0ec2898596baf7b23662967642c934f0cd2ca16482b5b7c231e696589331823bec218f164e06036c4bd523f80b3216f3349a2693d2c494e1225914817a99248248c64491949ab41ea1c90dfa3c9f6b00a2b00c9b60a2247285a1cb8ecf2526659cb2ccbeecb52cb7a92e4781aff002e3ba5f2da78325c6f77a275305b2c4aa0790c77f2d9fbd8bbec99bd8d0ce8a4bdbf67d9edae67aff5aaf6de88f9ca916d76bb09dfd167f5280c05eb51b4ca6ca5bd7153b3b81cb52bb2766b719775d05aa1286bf858d6c92b630b1c6c7c8f37e5b745fc38538f95f24113c7f5cb3f7314e2c1fc6ee3c0f52ffbae8ba2b2678eabbe93a82a8f82b22f987b629d6665391291e595d1aab84388c6b18fd79189f7a15572e03a2dfb60821e99755a15af95807b42b097c11fba652fcde678bb69f26a22e0deb51df13a2f27cbf1960443a5eae61b2ad68a6862b024a9d3a90c243890dcb0c9566924e0debbbaf5bc2259cad32259e22e725bcf855133e8afc3215fce21e8af5799c1ec659dc54bea74e0205f87ad913a07e46b9ee2f9885827ba556bc53008ad35f6c07590a88343b2149a15b19099d04414b90faf681684196291bb5694a4335af94a293d4ad27a2347264d1229c68992fb3844c075af88955adc64aba00838120beb96602c4a7221fed32c97f76910d12ceefd1acddade2fe27d2ee21ce1e2dd2a3f23ce02adea23220e143aadd747b431d68abb0a641af18557f4cafb5028e2401e3c84babbb5279e803e605cae0f1ebe5d1ff842d6422d6389b94eb3dce803c6070f3ef06dd5b227a2e6814822c5781b298661bd451c492449ba4819e63870f150c25a2b725ca4918b5c8443e6cb0d82450d80be8b1b24f41d180c82efbc0640078b641e8ca5a48445b294b094b0d4980bafb076903266d2ed59ad169d49b7eb804568e3467c18b67dcb342bb163180a08c37cde17b2cdae1602ee4d910427f26b82109cc8b7732627a552d239bf7d7ede5e729b9ac566cdb22dcb724bda2472ce791c5dad361eb3310f73bd5de7ba6d36d332793a4fe5454d49a594b3ce394feb9d33ce37279d70cb308e66d5f7853c0fb9f826d5b24bcb4af00dfab1fd8f41b504894178c4ab81a083cd91bc6d02306798fb7610f07660feb6252600733d4fc975dae5db8d5bfcdbb8ebb4766b5154a3d46ad8945ab63772644a2ba590c86a1fe0b2fc9a1084a05c879058091c5bd54830ada4554872bb69a9d475bac26cbb794ab7907371e1e11eaf1664ad0673e1d185570c3131b945d16090880387b44cc321413ca004cca195a7920f98cfcb072621795bca759a8407285ad0d369950b7376159fcea4cc03269b16afd6011389f60b8bb88d03db9622f393820864e0ee72e35b2e2c2a61adb59dd0502ab9cfc6cb72ba956058a455445b3c2de20b775e2e2c7a51c674879309eac2221e120c89ec5042d5fc986084286495152dde959b361e4804f38a16dc8aa90e1965e9c075af08cca92d623b072e65bb01f3c96d8b3d826d3d9d495fb1476cb62e252ef0941c55e24229dbabf8c0ec033f55e284926cef76041f9853ceb29562c06d47d8b2c5243c981bcf8dad14038e24bf2600810724d9baa894d64a6bad95d27a9229c501cd16468bd71e2139fd6e6db8f2965f13808006ad5e9949e2ad0badde9ab50d01ef0d4120528319480004268c61c7be5cf565bed017ece5e5757c8124a42e47ae1816f5748644f00a3970170e185a2ba535d32c26a5ac52962e7d6f3dcf0e3d38cf5b1c56358fd163283a576ac5b04f3a27e92fb458abaca45a3b89d22c2629cd66cc19a6937ee5de88999e5427a4143bcc749b919231fc2871348bd25b0f71d895ade7d921cf5b1aadde2ae38bf1bd175257813c9368559f2bb98f763edd974ff07d3b26242fd7bf8c0366fafa8a9a54de1b31cf59eb29a5f7e59a23a380eae55133b6cb6f979774de88131335abb39d37c6b97d8341360e5cfdeccf7a51522766efb477f61d86ca704f96511aeec9723ccae29e2ca330dc93e5ce30bf3c6fe4c8120edc6bc20a8e7207b728925f1d7a9e1732761ccdaa75087923cad34b1c1bcf0dd96aa920e3a087b9b7192999e2ae0219abdd3b928412381a870bd222f71bae400832e19227a0a366f8dac13bc1c6e0e01f156ce80ec2db59486682da37705166ed28dfb83213251b09bc316f4cd0bc042cca4c68f9e52c015bf9060132bc6cb53204e25a196620d8ca90c8be6cdbc059fb726dd68b31f2bcf8de8bd1be1e57e8428600f7cc90df6d15b02a1e7ead6203b4f5a56112ac108954d185a32aba40864334580bb967b255742108e4de8b391dc621acf09a29051b4208b9aa7121a3e28847ee62bc0dbb4e631a15702892bb53370e87713875a21805447fbd3b69f618a623a3c9ba0de4ac9bc0063276d235922efb1549cf6ea72353cc06899e84d6d30cc314b672973dce0840b6b8c37e75f4576b90522ceba1efd160f2992591ea693d893d76b3db0b9493b1ec1dfd75921efa8ae2c1489ee1aeb30ecb9e75d46677c3b0637809ec22d193aedc6e07bb790973666f3becd92fec19e62a762660ee609e959bb06661df4b278b72c4e049aa206cb55a2d213b8f489489874f487e1b8c45325614772a4824c3446251c4e9a128135f63511c5aa9e689e3607c0ea763a723d1cb797988b3010f5bf9e50ebe5b19364e8e1f10bf47d344880cb56e075b30076cede84499f888e3cab40f5bb9af4cb10d9ec63798d0118237870c9fc3bd9d89636b27ce217757ee57851ce790fb3d5f60c2533d56cf179af0542f772f0a39be8343728422c82f3f3404cd410a5bac400e2918b213912084341021cac10ea880841d208a10c51a7e60040b473cd88938f061071f383862440d6dd8897fc4795608411355a0031b5ef0012becc4ab228e0e1874a00b28600217e64034831d1729e23084257401047448c34ef4c291106c8002181c61c21c64d15585f8ce6dc7f07019b84e7b555c2194fbab8873fae93d1573c430b0e0de4fa7d41da2c8f6548a1e3891bd769d657c672985dc9b0fbe42b66d45b6510bd94aa26ca9266f4759910352a0e18a1c2f5f0ef6f8f972ea23a679668c0999b1d7bb23df202192a5e8410fae8e99ccb26c66593e64f8799d96f076a30087e557c513b4c8295d9ac2ca1f5764527e55f4800dd976b3b00f82723f25e1ce3bbf2a7c60833c6fb240c611e31683eb4ed3d45cc855fc2892fba997274b17d65a45f1955f153e70224f6c823192229692038f261298a289042638236a86fc4567f7e9d42a530aaed7b7864c0f2f3a2185f105434f5c3dae9611ebee2d4a4d081a3912638c3d7277cd006af1c290e3db028acfc3f9c1f4f89d9753f2f8201e8b3ebe23408e3831728cc9d125c7948e24c75faf5f0ef7f8f858f3154123ad825a0ce108eea2d85ac1dd8953c11d87d2aa27dc552e0577dce92ad50aeb1e5796655976eee2db7bdf45b1d5278eab95e35aad56ab15b3e9c36a856fcaef3d3d16451c985fa55ac9c89d347a7957e3f6f7505cdeae228d220e0c964fbce068f44414f284906d62998c130f361f4f3c767d5e3e3a3a3a0281add1aa3e118f488441ad13b4da091e3c620f9e78228a202408a275b69b96c123ad6a2069592ecc7428e2502251a6bb13c70d7dfe6a3ce03a7a94a916471d2d92839ad5ac4894fb9710d5a27fb56811c8926880aa7ecb2c5e1a1e4dff571681aa3e2542fa094a234d07dc15d42a239e88af77548bdccf7e1471e8d093e9d7caa26d521832a488475492041246271138a2a8844389dc167847e29436a4ae0259cacdc7c709b8f5340f769cec1012aa439612df805bd88ca1dce5a666a15cd7361e9478036ea1d566c5d9722bb548bfd0d78b74b95aabaea36040576b15f607b32d6d126b50709789269b181aca72b7dc97af63a96b4241ea362236b5ea44d384c0a1502144086d79833c2d424bb69e2986520a1440805c5bcf2b83090e263798dca00709608fbeadf3b3e5f235a26c3db485b6e0ae4fb621e6294dd1b2cd277e9e368534d259af79c10b5e178430a497a5b60d3125b673e08e4879d42a699422a1f133a4a4492b8810c1b059a2c927e47ad6a461da10f2319b5343f9bc3eefcacf27fab53e91b10bce2c9e2cd2aa99c553f5f3346a56c99b0289b34877aa7d531179f4686070834c817c522097140805928d1e4d3fc1759448b682445ecfae2602ee7a0b5a5ee0ae2022ea79987b6299ea24fbc81bbc9c57c4c868c6286f7061645ba2659737c0a255aaeb1d2cba28aeadbab0ecd1aafe1092a386ac6092abe02150a201c6e8a75c59e44a353c555f3e814f707732914f94604e66218d648fdc973de40d4c4e8e102477d70ca411c719ad68511a49a30cb54463b993b753c99d348246a016d2481a49a34bd26bca39a5d1d5e3b61062b0958b2fe74dfa795154c6ebbae67c94315e71ce0b426c6f2dbe2e8c6ca3266b7ccb4753773ac6eb8ad7755d935a88b181e4bd40f8a890544a29a504a2555db7edda866bddaebd39926baf41fa46fa856b905c23c1aa28d3a7176a27e11c27ad1e6adbe38a5adbe980d1bee9d56955ab6c1b38fa4e468419562f3aed8c79098451f91e152d5914e78e621d2ce30ddccb9d8c950c4829841976ac5e536699cd32528c8f0a21a284a144b2262dc14ab8022079fe92f232998edf7124ef4ef9ba708763925cd23625123a55bb14b4292dc32abda426a53dbd9ccb27956adbb50d16c2abc5806b20adfca83812ca7d9cfcaaf0c190fc369e1a5d6ad52f2f03f172626e2ad870943b1f729f3bf1e0524a4d560dbe93524a3827bce09c730ad97a54de364345b201be9652caf7761d6e3cf20a725df59a53c334acd639ebbce60c326fa376ad406e43c0e04ef24eb58a32fd12b9cad9351849e0b2772f59d57dc56b5e184fbcdd2ee944441c22f482425a350f8590c020904777ef48661f240c0812659a073c0254f5a13d657b89bb938d580bc1834678340d8304818343b08997034f2f27ce295ed0ca90069192520dab9452795dd725e5f5cbc471b5d6edba64add766316cd32e18e422d56c6f079590fbf2a561548b05b92e292f4da3d24a098334eb745129638c9262355e53ce790529dafa24052935ad556d92010733bc360319704f0a1ef4206734991ec68bd289d54829959472f3320def578b81d637bef77b3d70afdf7db94956d8474b5aab64ab4c36c608b38e0a5b28c7cb6e9c09b51d5cc700c8c717eff6e5803a608458b09df6931f8c1a881a588054ad646bb3011abc9680b7c34599780aa57d5fbfe8b90ce9a4effacdf1037e03d98e3dcf0414a0dde21cf6da15f0762cfe017fdd048480003b1a3e4599f84799786d9b8165883b224240801d7bfb6ce3b9decec663adb442e8c4193b92ba0590369eeb72ebcbfbd3aaf8eb12d12a89352470dd1bf2ca9097789e32a2d460c7d84fd6dccdffb48a883770930626a255b18726e4f937f1935342794d7ad9367073e26d083aa30e91aba4f4a226a47376dd92ca2bdb66d04fed04351adeb681ab938866c11cb3fc0f8dc6e176e2df2b3ab2efd51ccfad5edc42155168ad2e9d68d48c72ce4661f5a230766cd9dd9d02fbfe5a0bb97f280c450883a488835aab1e7e5007f2360e5142096196a1305485475d304619e30c8965ed7ee730d856cc39e7a473ca28a5d62719fe5d709b9172994c5f3075ad81ed6b28e0ba538e5ac7752b1f82e4986316728c7da1937a5119312cc3301489d58b4a29a39431d2cb0636febdc8e8688487b422779a94f20d5a6429a51008a117de40455f114e215584f105c25f1784f0c22a855996499e397f5d7f3a3ddf8baab306030e5ed7b547b0881db3d70e78e4f8eb91f29362072320e518a12abbaecf4bca79d54ae9ede9e9252f7a9dce8a5d765e93d2edfabca82dce3929a534d2d3a6951ed67c4d3b85e4eea5210a1d80bce0055248d144968f6ff3b152482194e3a58f9d97b3150617b8800d43e811c4cead47c2a00c5048437e4f258bbe4022fd98ec004cdc4b6e1279a2908f12ed62cf2e8dee4ca3553f529a386ebefc9352add64b884773a54ef2dda97337cbc679611f277f1b037ae704ff449926e2d66899bee9be0680c683eb9e90924ba3651ac32c1042b3688022bfac5d3aa7256558b53f374abaf144ceda1b2d4622fdc4fca6c8028b2cafdda705699add6e31cdda5b4c8b27d9ded2e576b8f1906ee3db7c945ca7a39d1b0f8986bd70a7747d94dc64ba89090b7da7a4051a877f68b080b36fe321f5e60333e956dba6c8e20a39db922cb925d924d71cc7c126e47879b73c379e29b228c952a9f426a99b4096f344e01f1a5afca91c89c4693fadfae1e87b443bda56abbd360edc1bb2914ecab0ba3daafde85022b97b434ccdfae1da85887d2f1d1cbaa0cd307a5d35e29438099b745d421bccdc0dfa214b5e2a3908be538ab674df4ebc2f4313131fdc4b57e83ba597dc20107ca774a1ef70b76ff6bbc692d24d4a2525f8b1847370f3144d3a9accdba92816ad6c09e3c53e6150a6116ada49cb36ab6d3c37e812dbb56b9797361fa916e4c36a3561d045372064c88075a24148b399a65d9869fc0c39f1b19a36af3d32b71e12212eaa3d0c62188475d2eb6a2be05ee457c5165a99966e8e1f354ae74a988828d38fa57330bbdd23cacd836a80c9b9d72879a9e417ae61720ee7f871dd042b11655a47ee6d891adc4b700e0ebf2883c43603cb17ee88e09eedbc9dd23749bb77e466dbe9e816607734c1c177709bd8ce81dbb699e53745165ad02ccbd6da9a65196e70070c22691876bd8341d72525c9252f49b2697faf9bc669d750ee60100c0a6a718395cd8a5b86557a5d5b5ba9bd66c91ab518e7bc9a505549fca28237a795926e95527b556de399f3da78e6a7d5b0cb395157c4ae0bb5d588611776cdeb9212067e51413cf2361e4be57ddae5658211acc8766e08805b027c6a9ea75b4f6789b38b5e799b514a6ba5d7e99661d73ce9b392485aeb0d68b58bdaf9ebb5466dfb9661d57ede6acfbe56db23c32a24c19433584d04efba66bd2e9bd1ebaad7ed76039b734e7becd2eccec767f36f93e791a7d727a4eaa8044c17b5518e3a45342200001000f314400020140a074542e1683853759d811f14001096a04c684e17886110c32884103286000043004440004440300007a2192a27db2e369a1bcbdb9585b6b8dae05008a6c2cfbb6dd988f6a68a287864374b8eb56c4876a4bcb25c94f212656ce00c35c8e83ae1a0026f8a3c2ee5be9899dcbd03b9d30390ea0ec10994ab5dc4dbe82dac5a1ca7dbf35767514860799b18eca6573a198ca039f0da456ce54102e756863754a55f090f966bc81b1e94e880da0e42d4486784638feb3c32172764aeaa2f567bdcbf29e715acd5f82ebeb73eaa5839ba281a1820cf869fc8779b1af5817823eea96ccd3b6e05961635760c17e0662976dc38401514a7634ec3bcf7fdccd52c6b4072923770130b700662a0914cfdd4da2686b96affe3ccc112f65dc360f22a8ab245f787f49b7bd453b0764576f6f45a97932bb8e52ae75263483e26bbf2ec993c312d17ca23aeb0ff35ba0461cd2368aed61f582f8a066a52caab7315bdcbd02bc28569f60610d37935efc4ea6b12f77eef5563758b994beb9088e3c5eaaefb482daed6e295ac020a07e5a53a60ce425d6dd92d9caf6edc15ea89acac81e862ace1138be58e06d9884b5d3e588eb062075a8098fffff57848477e554bcb08918bf1a83316abdc08e455d1cc015691dc91cb0ea856cda42898a8b1386e0a73dad04f2a8e59bf3c9d74eb374904b3510cc1bb08684d7b7102712671119cac1adc0aae9b017207d4ef1e3936f51d5283574d4974a86883fa36b5bcb7d119319cebc42a35777b6601c47f1441b43974372ee96958f3a9cdceeaf40ef0cc1589625805ca9d1a8c8403ac0a226a495743265bb6308e60ea365106e647cc32405cfe567daff9ca38c2dcc33b50ec285a5cbc00c8e7f44bcdc2d3863f18308f89772c498b2c22d42a8239cf7e3c09c49c8c902c2696643d2076d03bc7cb60ecd2ef6c90475e8ea61646caa108b1540f840a1ac3223483fddefbcd5a98de190690f56f372fa1a34fe7155586a85d50f9dafcea5d4484cc14fa452f8f98ea43023ecc0bcf102cf4cb41f88b1a1103b9acb966a66652f0931f7720d5e971f595026268d9111963ca9da35c01c8b660a85abde589d023c103e3442642d4063ea6897207ef8160efcc19ab8526b6902bb307c05e2a8e210a066d74f00b26ee4669bd55c6d14126afd021f2345d775b0b931cd85052e45c5838b37b045caae4c2652545f7d3b9a5cbf7d51d101dd504ecffc9c37422e221883e61bf5fdae68d9366f5693ffcfbe1628a4ddc75021eb7493522cbe00cb3ec318a06c24b175b69d2a351749af5c43aeff56597aef4e979f8213416c76dd6f02d524aa9e302da3c04e163bc1e1431ecf40eb341e1d3357c1db28cf813ae309bcab205188189c2365724135eadcdcb709b17d7e33e82df8a78d1c66ee4f5d0774673e395126e9c7703fb8b395cfaf95121bf5e4d18f1b69194dcdc7b2a14e8a9fba220baafc713a44103784cac6d4970aea1d65f4d5da5d7d302b01ff0d94602737c76fc3e86587c48e27e4273362b8e6f11b35a6c0708324fa99340fe12ab0cd4887b8e38ace14bae1d19e343ce4fef2c358c6340d51c7e90081d8d155ee614aeea122eed02094fc2c4a896967665e19416b63729489f44c6903857d1787200992b82742160e3e60e501efd2f4b41db9bcd2e246a25a3fcf5fc388b657b2c0426e8530915dfc9a5c94276bb4149d91f77ba7905bfe674936e116fcbfc308758d5b7732a577247941a262271f5b74b3f7b3087f0622b168a53421c0da6e256ef10302558993532e120184419a626315b0c688da2b061022a61ecc068e29013f40e19d06e24248a320b0118e02dd4d3011f5f3747862f400ca0a7613afaaf868e7755532edfee785e96182fee64f7696a89cf25c962355069f30519a1aec9e5ad8f32556515b525529e420ce53a9478a7c33d0123e7a3e2c9b20cc14ed01602004825335cc5138aff2fe27cc5f9114636ea2f24d5ae7caadd59a1fb77de267a582798bb82d2cde4198a0737696a91ee020e7dfce49f6bf178cdc06e11d65e011797c184cf93424140b875c42e2c092f84522ecbcc03238d479fa1c8b4e8792805980b2457824aedcb8cffd3a1f16530c08826649f70cca63296286684f49d22edf00682e73d45c212f91f686a79996f1f7f2ed516ac8652a541daffecd7d3f606b2a3f4cc68a0c1051a2f65d069ebbb408626cf9f142cd0074d8905e18ec22d6e0ddde0328edb30976b48b5e354294bc135387f9914f531ac302071e918747cc2dff5e87b968873719c7cb1daafb19e41bed85ff6983faa22d10336be76585e63d3176a4e025d26f62404e62bca4949c3a165276cd9e6fe3a85ec371f77612414dfc14e032be8f5e8b4ea34e0f26e5de4ed3255e4e8e133b31cea22093979b70eea3bc7fb27e9b99c51eb7054263203b8ebba0f854c8252aa0873c39d1495f328e3a3432c0adb4e77926fff84d51d7eb8f44aa024ef8d0192734dd4c5becc657c35f3004b5af32dd6161ee3de09150cc8467ab2bd8f1040384030fd05c47de7150384f37151832c6b604c2828d05688a0659d70b969681907e0ab193a534044e5b2da6f1b29e67eae2b01a14c4f6894d8579b3b2444e0d60b4c159c437d4e59d462cbb69a17744637f90d13ebd4be880ad6ca161c73c59b47115a2fb0ac96cfeec951d7678bf35ead87ac000dd5be8d0e488ea84af0c5fd65dd42d78c0a10f23df90e0f9e9f2c82ceb311909ebd215877abeffc3d20f0d58b5696a77a42a9db0263cc71d781de755f9d2966d4aac137ffef574bf153011e37a7f288874a9913a0298c7527e8b97f28d809b6878efdd11fa94e5b805c71a4a84509edc68e4e7d0a503ab439c55fed1fc8a5cc3a0a368322700c957bfe79281f2a580f026e001cdb290b707b7280068863f381d5e8d7d1e594975cc9f6df0fc5af90dc6ab9039346b6f066d7d4fefcbe2763569b38d5819cb608f249bf9fe73a6c5a6e4265738949993fdb3aeb5c36f9214b771933bd76cce18abc82be83d768085e5f34a63a4b7de34852f63bd7c519734f5d84bdeb6cf81b45c07139b7c4011e1786977e741fd23cd8c4d154f10b6df7ed3c7a607c88e1000d959dc0f66e406f30e8e4552f217e137db8d87194c944e3edcbaa95a8cf517a0754b7d52882b43b0482e87a4f72a2ffe254a7c76ad7d68090edf373851559461752857147985761e32fc17e5a242cf03e3db45c4f1bac8a3dd490bae760b6475afd1ec624e21414084a6cab45ec0142606192bc8b9ae0738c2a8046bf7d7cbca9e577a072beed18572c8b458e1e7bba2590df8a0fc09f263bedbbb8f4c346d8fec82f6f866c9f9b9908dafcc55fa5c312cce876a6a6eb29a6e191dfcaa238c55ca9afdf0717d48f5037adf4fdb417e4fcb4f6661af80375e2e9a2a2a7219ae5528aadbe81d40e7f9455db8674d4456e8cff92a09c6e35a37f5546b5d3c9f75e37a58a557a6560ef321cdc4ccce66fa9c7bce4d965d2df77cc8b1e82a408ca873c975c5d4f08919649aff466a4de77e6257700097c8ea7f3539910a0e747e312e4623fa620ce4be3dc4272a6101f383b305387f2d0500afbde028b9cbdec43e1fe796e692fd62209189d9e55e10b52b79586b7216cc4d066e75d70dfb787462d503bf0dcc063dc71cd04212e7d9d33eb5493a1921acaf79b64a70b13c08066dc9ec5ccf0a41d1188e1987633d7236a93d280f3727519377f90a96e15709b90436a213596be011780e086cebfb5f6fdd2079878d78e87b0488cb11fb21e403e797073224fef2654545802f580945d0e6dd12237c459027d42c0645107f5720206dc008f7640115b9d29e774e980cd4505084c4bc51125192ce6a19e0aeaab4c55e8fe405a485d446cce3259f626ea6c21516e22a9d7014aca3ae5a0d8151da5dd425a54e049a7fa5f8790b5e7fac7de9a591474b4dd75964b9963b7273de23b6a3d8f5288791305f171ec5cf48001285405561fa638f89e926b8240bc086e59d5e604eda6f525c596342b89be1dd135c8bc626c3aa04ce009cc041f20d1bdf80e9a07935c79501c7ad7e8d9a2c1bc6226992e8d735a4e8cbb18270b2fc9e27348b1108be27df45b8e30e14d5802a50796ec48b75e9a4cd5b14305041a762ad924770eb4d4b445165ca157b31640445b17c4db3400910b4d0adcf10aff62d2f648ee6e7eb5456aa2837b92fab82c78e67600ca306e27a1a08a04b9a7005c19c39a18160c289fb8e530c257f6656ee572dafe5916d3eb48dfa8391bd7e2d628fe68bf39e508e4771e2e9c0e4c987718035147e8a9de19e58c93cfaaa1047c947ed7e3c98dac586da0940f7688d9af6618d5eecaabb88b4993f6afd89566231b8839e6840c5f5bbd64d4e65603ba88b5d2945304394e15561f682e1485819e19c75d48d19997ef188ec139dd49a9ac027abcb534861dc20fb4c6a52c20aca870951fcf575302ecab07485e2ad550b5171493279199cf047348a48fbf00b31386c50d706a81bea53f1188ec73bcad3c08d96634635a483dcb1b8cfdd0c53932c7664e42d7769156909d6c7e29440e41aaa58b4ae6e6b7c575ad6c576cb5627ab240b36aa14ea390fc2bc6ef62b543b4f6ce9b232b0f071fb1596e0a5d8438dfb0433a0cf65bdcef9683013474e6d9f4a113f71b679f4967b7edd02c22b4fa26a03f2dbf4b77cbdcc98ca965159199c2de2f4fa0a109cbc433010b8f77c47de228daec4c9200ed99d5da03bece1272c6f3d5fb2b5ab600ef5f1a00c2a0845fbd1758856534b75ad0628de5905b7a2bc8d95dcca9bf9ca3f008c87b7213bc2af68de80bf989cd9b93ee4f03da2b495f02f823beacca31d260c216e6d1e98133bbe6fe4a3fb8b7cec00a12a50314e705847e69d78b2260e7bc6963bcadcd0ea4d997a828c6ffb4e43303b45196a593b464ad4abb529eff21fd9503829f113100f0e0cbb5175753cc724dea399a7d55c879019a645c08a2c509c1208a71fd2ed96b2eb4ca05ae2aa78b9e20f3bf28afbfe453a513376591d66b11cec3e04361ea1163ef31529855629499c9a22b74c144a40de73d8c1ebdcbf0454e843d7749cd415d5ef6577535628c7fffd76cc50e63df00c3b8c800eb9c3a62a9497f442127c97fb2483fc6749c53aff4a3fac94e1602f275e7a8919ee5b93041b9dac45d24f2fb37b5718536c1a8b5cb98f937e9ff53cc978671b393a8e12a1ec4c302e7f08f21d27166d6efdfa4b792b95843f2a5685d4ea0309f99e92770598223726823868d2d3ba60946fc62f5ff3aebbaf1dc1ad1f6a3c6dedfa308ab278684e87aef79b00ac75e0d9b5d7e1ad344cd238fc66f93acaa7ffa74ae6d6f429cf7c7bd7f1fb0b136fb4d6c160e90dc5f36a47bad117e05bb7c19100a544271ba7a9c7bec0ca51ae8bfc7d5b67ea2fdc9984f253731dc346766de4afc0d0cccc3d6133865c196069284f157ecb18eb399dd397bc4043da41c81eed1a466096b74fd6823ebe709d73b812750347b6d95a557799831218ac4a653776a001271365817a390b31424616310f50da906e0e7082cec366f1baebcbb5c488a72fda461b585e03ef80d37318b029be1d4f07dce2ca38ebeea0b33838216e370273e7417a413e298c59d230115ab09921ca765efa133c4d29453d136558edce4aed21b2073fe382083c17f59cab46a161e695031108fa45c22f779c8c308d89caa463da7e4ea6ef4361c55f2d24b374eaa13410f279239ce2dc5c87f79aa447c99273bb49e181491b5ef04783c78932ab4fd83a6139241a89dda69215cc38387b82fb4ce068e8658b47de2be7ef75d04142e88d705d41850fc0a0f38eeb63488381a53a9d62273526ecaaa6cbd33543d3fc4a5012a4af08095313512d510c2528f67f5578f473ecfbe58039d4512f9283ed8ee408d2cb645563e141cd85fd8c18bc5c07b0e79ee60e08eafc7a63a92024835cdec72d4b7b89e9d7da1b2d22cbad3ae976ea27a0bebd43c4cc3ca9c36382b45c285c44af8a701d6a8b33b31606ed9d03384c5d096f93070b298f6060d85a1f18af97b052e32e75d44a6f018114a1c2c27b690977348d7dee2d0b1f9abde2b5ba9a328ef30ea7797728739d439f554b57acfa23b06f1f02abb9d8c9d2a1257119646a8561912f5e1d649a4411307466020443fe68510d72d4ce2a62a0bc14060a52d0fc2d21f6d3102200f52b21c7b04bcf67a63005ac8a0ec958e6f60692786e8b9022855af7ba450ec5830cbb54d20089d79d8dc9b5ffad8282e0a6236da04da6e12fbad9dc8329e0c711f8d8eb90d840407b9238a0c3c47b1143b2a428fc3839c84113b44f2fe615e44ea418c73f81f9640202f8cd51ec1ee67ecf260a0bf5cb8e25783d553131a781cd790d2476b0289fdbdbc590041138d9fcdccf4bfbffe0e363a2c8403fed886d52cd2d9e70361087bceac4bb1c5849b54d508d3190cfb53241bc9dae03a56e640272de27063669d5f4268ae02edc7cfd44605fd4393aa84eee0c407fd2ea73410d668e691f1797d3f844d78dcad42e2afce1d38a924b093705ad1fca4f6d76f9054e67e726b277f5724c553b74514e06d5c24159112c8a42fd2d920c7fb9643786a3a8793e060e8c6fd9ed38b9b7c4c15e2c4a3e141bcf7213f22b4bf52d4e81cc084595d4868b404c8002b0e0406997861b467f634fb10bf89c27a302830b8d3c7fd198b2aafc17ff289c3a69a137baa9015915b15b0b47b3d9b17040dfd24b618e5e3f979ee1d0129b9c2f03be77c1a10671058bcec8da19ed3ead673f9100289f7532bacddc32016c35feddd34c4c1b3a8d9379664183d9b1936d0168c7d664c098b90f5505cac319433e59ed1292fc1bea80d1b4415c31a94c589fca365d0ef0cb2b05bad9a38680c4085c9f0b24b1752aa01f4ca2aeb8125339e68c1845b4b792a0f11b9b63e00c3e29d3479472e349e4212a68b4dce77fa34d55796d4562a618dcfae3a4b8dc6498bd91a4b293d48df73c9a6b6d43869b560719df5c20e9de123e562273fd423935deb5947a2a240156e6d0ef3ea66d06ba2fd9a47cbe7a79fe7417aec772766a81b4db216b9d74b6cc65390dc08bd30c3dc0f131dfa91eed4f14adc6468e00f4970e991548702c3a7a5e15009efc441cd2a83342113c7008a47f705a84cc9fb047ca24252b390cf2d1dbe59873c31f88ddc4c49db87f52a473fea33e641ee45fe331b39dfd083a0b8a46f466b8c3493c11e6d5d980e574a349e4ff8e535f03618584a6e4e27e6a9091a0ea8645e0af0cff77146a5fde162c5c12d89aba8f3f769a3b7e5400fbf1fd67b3f11d6b4c24c1f8c3c35524a71d4d202a9cdd2b3d64ff8b1a6571700282dc39029fdc6d44c992705383be270612eb2169328b713539cf724aaf64ca361892c512a7c1fc97c1d8a21ff15bf768e78a4f3a1092c0c2f6c63170c17ab6c383562e419cc724134f943d1a15601a8abf2c015fa67ed6c62ac4977bc0bd5934acda7e42daec3ccae222c1f91c461c9754e92f2fee513a8096b299e8be3415c2c5e0ee6686e4fc7fa66672117ca7c4c1ca2ddea40689c03f68c729d565fad2bb5fa270117f0cbc76662448707451d918d91b4ab719a6800b06872245a0bb4ccf9a163b202e5e651cc3324524214f52f3553e758c78dc81ca0615f440c4aa49b1e59a23f36ba83eb884882eb03b34aab2512338492bee72dbbf3f20d6655e8b5ae9771cebf4182ec99fca27215f968b7177cd5af08df161e24c5fcae82764c8019a51ca79c3c9ce2538f357a1b777e10cc90ba6f83da4986b24e6a2c2318a77fb5abb965654e5adeb028189387536665fa341fcab7c4fc0608270a6e21d073f2c184a274a4b7a3e8c7c60d3b0af4685361fab8af8852543fa4e4e933669a1418ee27d751567badf824ebc4ac4f1ebc84809910d232567c8962601e24edaead886df87ffadde67672f347dbbfae8b6b3a3761c5371217a18d7546bafbe7ef1780d0c0a6ea7890b5113606fa35e94d4675f9f7ee2cb2d60307bf470246c3013f51a1ec7a129bf989118086f50b61e28e7117807cdc5b9c9fa163c54eb1acbcafb559a255d92918d9170c69f6f9f497eb6b188e5d6f471e5f9177ba510eea8180afe401ab2ae1e5ac40eb1e4917aacfc38490c7635ae045f1d83e995c05b2e67a0dc84871e3efdca6cbcd94596d56a66024ee3c98aea1279a0ab2922478e36db643521353cb1be9a31accc72c8777e7d8c87045d398dcfe2dd0bb371f9c6520bff0822c3e104d1ecc835b74d7ac91e03e086bb63a4c29b0a38273ad0641ec2fdf735334e2de19dc2f906fbfce342906f41b72451481a657673923b422ae3781a259793b56ad8d075ba8c4c9261934f26703a53869de58fe55e7e75c792fc6482edde4c759095a7c9252dbaaa8b7dc29d9d348e877b876bd7536754df7c894252070b66f764edaa1571a359989b95c6a3d07d09baa554d2e820879c2d6fe903c6c59fb38937867a3b6701a84343bc5d91c410d40df6e856d464e39270d0b6112c62d621359ab46a32d8140178bdbdfe440e6e958aca313c9b70ab17c40d54e06045cd3147cd015778d6d70013abb090e9df5b56f5c59e9f2e634c2c455d887a878ab77270c2ed15c36faa0e9db94880ec30b64af600fe76c2bd5dade82dc5025ebd83834b2c7c1edd5b6726b59fc1a2c5b40a5e4560a26d6b9493f28708d94b42ea422ccb631c8c38185bfb6d2ac120d8b1609afc5dc548e53dec62a4922c9e3665614d6a086c6633bf4f0dd5d51e381e06d81375073fc5ab8d01212775d3e9518c108d10e5ebb6ce6e047a4cdcbdb4edb0dd0e8ae90c28f282dadbbffd2536b2ba06b28430d51ed84f003408f7a409e226a075006dbcb034170534bebcf3085acb1bc9c3dae2c3c3418dcd9b28b808fcc453abbb96dbde5e1e578f45a5a4f4f4d1f6a1f9374242d451d86f5626ec8d22f779f91aba79a24917df703980d842f8109d4db9910638d770edcc984c7b67820e0226dacb3baddbabb43cdb8cf4f2b8483e1439f3072f2db014a3f675bd86f433781d80d52f4944cf2d78e42dd1a8c43e85144605985e71251995831c09697d5c39b3aae9e1baf06859904cd41f184f833f9b619c89fb4be6dc80ce2a28ff90eda120b8869b9523c1c130f065355462256f6020095b2aac4190187292ba1ef904bd4d998f58cda436f3ff496982b33bd373d14cea9b796e8a856321b4bd29b6f4ea2e16cd2ee348d81c82e10795ebe9c0b97f3f636580cdf3a45de7117f6c0ceaaefb8949524963593bca2dedc1d32d433fb2625d15c222abca7b449d4814a7e491ca8c08289990db36984cab0210157e773f07e86ed0d3452231c9966c6228e260d0869ad34f1dd3e1aa6eaebd14a871252351fbdd072b50d4a8242eb5c93fddf0fad17ed84bc98a889fb2c8d4e2fe0e6a2aa4665819a02c229d824261bb5032c184e3c1f84c3363b210b21e702dee6b5348e34f6ccbdaccc217e4c3b936e49a1ca21c2f5c8d1c42219e1f9efc6a57db1e2f475a51846d65cb107f87980992f7aff6e7fac1285fed98af9378f7f1e44d10275f6c0fd054e2a97f72340c1121b501340c3af6dee88e622c02ba348ff13d91277924bb13f1e77f80b388f592a82bb126ed2fd8e2fef64079587c098718adc8fa304542c380a2b9a0d0baeeff7d0559c9f8fd07e33038fdaea821f89157f1f7eea8215dbdee775dc7353adfeae6efb1ce327cd948de0094d786ce25907488d0f2b9656cfc40814ec0d68ba1bfe55de378b8532614c49be91fb27684edf100fb5b445f8ce8278f726c8060666a16cd80ea01d1fcfb0891a9c7bf3227855010a37e78c6a6c05ac9b90c3ad56de4edd63253fb9fcc1804a77628a5d8e2183362b8c0c8c3848bafc2497c6543a8320bd97f50f7d97c888b47cf71d394232a0f6b2554e439a1638f218695e764292115c262f9986694a966986b20713e807f2f6852287e1d2bdb653573cf5bac0af095ae129268c20b5732468b1bb66644db03ad9cb259a283d04750f962f6fe1931ce1c8c84c3ba01ec31e30725b66741da0a5953081cc6161780ca8001b7862eea72aaeddbd57c7d427ee6506ac7d855fe894e3c5aab4043d0dc15bcd0ba1ba45f5a928f42aff24e7a15588ae1ec46833d0fee8a5f89a7fe57fd048569d3a265c4923cd48d6f0c790b81424291b6cb478fd7de929f48596ac437a796d9c0318762672271b1bd0e99891591d40b8ec850913f76f3295bde953bf405934d38aa4bb2aca4219a5de834757770036faee79bda1249a3d775030c6e39533ddeecd170c35d28f9e29d11a685fd743bbcfced45dca8d726f91bafad5b891fa58387e3a86ae876b982183fe3eea5fc42f92af90eea89887cb65685325c7317ea05c254f3825e1fcae91fcd19fc9d07486a8599a675f728a1de546ae74dcc784fba61e80c7e4772425c6fa00b52cbecd3606e610c59ebe393fa7894e8d70e2bd4794f81926287d04537b92c3edc7888bf41092a51493f6ba344272ee5ac10040444a776210bac517b4f7bbe2a6012e8d95008f4af3b2a808dc0bc5890aee026d11b8381264659681c8e00a77cb8d805c0b976b66d7e443a082f99608e539f9e3bf685c601c2617b9a58642959423b9521ba98c9d06c356ea046f26f6a166adf5c4c91d8cf9b094e653e59a0a26fa1f28304e83e1c11439784136f9210aa14c9c9530081f1e61c1a218c065384c7c3355c41486791e1e7c2fd52cdd41cc428de8e2129e3bec0b1c5c36333032e072106440d7d6a81ca03c790510b79376c7e7aa5012680e3d5e33d1a31f522feb4bd9823d5a75162ed454a0f04b6920ea44bfb31648441a1ddeeb95275ea41f4b6783ba08c1d27735c6462114070431f7c8f50f6a6bd16502193a1b63582c1067b435105da467e22d74218e8bb118a985e243711e0a61bbf8f4cda42ebd07a7b1228874455f7b6206132d9d4e5d3b84a48442c9ce472901a7ceb6993a1304acb35e5e9e1462e710d606bff651c8c0c367fc4a622d2747c46bb15612d52ecb113b1f52ed460c62a83897b7146e5ad557d1233d48db65fd65a65d9b01306c227c12b84a7cba94cb47a1aae4d1cd263d554ec948e99a926fac8115ade054a581443d1e2d00e18c2e91d1e99179533684509c17deb71ae051705845c74e980a70d21154db9baf327fb3a9289091a195088b0741103c6317002a07fc23ca419af557dbb3600332e8a3ad20f4b6875e542cbb03b19cea938e6ca74fc21e3eca233eac84bfdcb694530251ada0ac920adf10944318cb0428b75325da055021e2084a39c8b8e7f80f3094a13935a64fae122b5713864507ce6dd9c9db4927d7be39d8eba35c14a1d5783f770cb0be318cbb8851e0d874f8ad5937b7504b9c1a3d0e1d994cf3e1a81c07007f9bd67785462ba0b9ab68a66127d6fd2ee29451945fd7cbd40eca4bb8e7e8582bad50a529c01bca0a31d81d42df534ca687109785ac7b2ce28c58ad9fcee40842053a081f6830559011c36181deee31c58b154c0802bd89e53e83190ee06bc1e12631764f82dde099a9100686f8fff0b03cf5831511c45b267440031fd7fb8f810874d7cbc02df1b82c3920188f78dc59a9837c51bb66a71c3537c95c3eb3260d4a30372af75e91c0ab170ff45f5b8c5c4869cea6899106a0b1ac0cfbcc28e626c11130ec6a489e49b3755102d96b32d2066881c6fd31560a467461ac0cad694ddf392bef9161013979a72104ac8a793cc7b996d95602c8b5e889c9a6f94334a592581f492fa63a51d20e1a024436650a7519ef5520c375f5d0905c7a4c62c5c66619dd8fc767f853f7e4de2a2bdd2168f83764843df51068180f8daa343536e5252491b146893e9f1a295ee6dd78c1b4efe6d99c9c2e10a92beebe5194df750af2c76452aaf026c91fab6585b28f13f35208028172433840289f6bd4314b1dc26458d6e301785058ccb6169e3569ef2efd88a70209f7e3acb85a9e54e10a12b7f5876726fb87eccc586a6f9351313120175977b59a47572c301ec9c3f68f6324f5b029b1ea4db4c8a675e45d982e1ba83787406e45ccddf6474206c3826231bf7542f88ee0e97bd86d6aef2a31ff58216b4a4750d16e92a6cc167096711e960bc12541c266c169c342e730b25f30596d83eaec2fb8d77c413dc2504281f1a80b9d417378bd0b0a35aeded999508304c8fc392862988d9e5d18abfcf36042526d75deb357b3bd7805d922dae7bbf0ec7f7ebc52526426efc7e988a5fa9889b8012164eeda59f55d000accf805035979b3b700de1d007f03e0dd0760970040f99d0fa09ab1f4d019913ae1def0bcafc38f33035b9fbc693661309d525a155fc60afa0fae85c4e6049dddf910776f8a4128a7b31242646875ca556f0ef835ab0bb7465122e810f17e73516b92ca178b72416516d358196ffa54c1ece38622f71cb483ec18611c25d5ca190730067fbf94bfc0159b700ea8c66d290b500b4882f28db1b3e2c0e48388e1710c5b0fe29bc33048a06488871aac8b38bea13054baae51a8f3390408bf9b24437906b7ecd0990f39f99c5755ed65114256d0c6325ddf03d63660b310de0ba1ba9a2b2a26035625bd396446094c628910a24ae2b1ee742a71f15aff81dded2816dd083ba916347c3f6216b4100a0b19d83e0c6d8c0ee7c8772a0b9b13e7b673b1aaed394040ddfd9526121cf8d2e8b4296d3c5a5600a180ce2cbc56f576d99e5f09f6ad1bb1d81f92bf229b2b7ec952fab435cb13d673abb7b42850627b49dd70974e0fbf98010294254990ae526d5b06aef7018df2c58dd10bcae134abbc45106aca026d2269d8ab52b6dc30a0eaf4e0a4441e1fa2ddbe6cb3cf579887d7970e2951b778ffe6071524af160a31a761730944b1f2a1c97f6c8c40601d96f6f0f1c360d5e9586604d9f0f835e3cca313abb1ff7ac903672b17c870a916ec35abaf6993f7367ead387e5c2af9a0d2f55e33f393516cb436dece496a15454c881af6292748fc6ca121cbe7cc2bc67ef2461bc19e4ebf669a2f642c50586bb4cd9053e7422a6b93e2da7f0248ed056e420cc353fdb9b6a609690f33593f6c27a205f5c008bee909d24f948a9796b9e2e1c416ee7e6de7348b3e1eb440862e824eab6193af2f390c0d9f36f8469a5f27ce064afac3250a64081868e1c722ab89d34b4b645349dd14d9938cf3813709a1ce67dab7e1516d3e83a05e2a2b3804cbe19989fc1a513b339020784441ff402db9195c890c9331b526e9162c490564220f1466ec0af4cb61f27a690a00dc740075d44a715fe97066346319e7dc06b822728a3bf64dc5eac37853527a2d68eded6aefe7200c96f7fa8dad3ddaaeacfae20851fa52682652209bb514e26a9fb23924370ae7c63b262b89a6bdd5d7049a047c28fd56f287d7a3523d26e15a54ccca8558899105470b0f174f29165321cf88205580cd88509f5f1a10bd9abaf11214c176bf2537143b5ba3e81811486495f055899f2d8ddf77ce37192bc5d52f5812ff0cdef95e26513275f0b8d476d76b1d8cbc3cb83c2fa2e81a36cf70459094862908115749865cf2b82298e4440c04f920eb9a547c262452d4953ac26e80c9ec6fa61b62b4ff3bbd15842517a28aa786aa6e8b6b937183ac5d08bec887aa8fcb17a64a5bc894fbb5160e836cc2dcdcbb3462d75b632368a167bd3d7ab011b843c4161bf8213596b1c13dc5d3a191aa84a9001bf639239c49283524a74bc2b5bf7fe05e2677a71317b0b5308d716491fb8297e2177589ed48f891a9a34d9b1c8d4e39cf9ca48c0d8ffa3223f6d0626a14b6aade73d01756c643b82baa2c9081366597746c41b4b4d8a30c4d8294254c78022439c92a4524dcacba89481eb84a1c114d3c7bd1aff257bf30d354f748eaf7135ef6023f9aff3b90a2a8d72e3a7783d6c80be418f4600be5ca72a0b664e813fe92714132367e8044c2e27c68605fb8077e9554a99fe3a9b55fff565329cb68964d886ddb1fba8e3d68f4cd5f842f112ffa17b0db2332e63821234e10db72d93d91bf3c31ad25705d25eb23acbbba424b8cd1ddcbe2e85d2153cc3503b92a6acfd9325c0a065b15fc6196a468b52d06749fe2cda01bd150cffb048bb1fc154e43e91c970c6d8513078b06244d2a6d57d29b837eecfa0f53cfdd7cb2849c30015848d3c7e0b1bda1ac85fcc959a148c094c46219aedbd82e3ef0b8854c4fd9395486f756ce19823e8f9d0cdd83a3bad9526bf63689e9faa31e4745f542fc46ceac734d82b2e5bd3ec21b42f466422c4aa799fed308d9cafe570a2f2dbd07309a90afd556dd5d824bf8256c4dc3ae0d8c927725c83796fd9aa790ea2bbae1e3de0dc58e541c5705a04ef59658315e3e263f7436ae9cd6664ea465ba522211c8c9787e78dc12f7e23570739ef468d3a38f65a5cacca2e332449a2edea38949a290bdec01d4af1801f85742bac115152d986d867f5175136f3f53bd822df0b6ef8f7a54cc618a1ae3560307f17d9ebb16aedf221b867ebc063f42a42c3a39f3b91f05f6126a3de2baae19ff1ff9ee35bd9d62161a42fc895236624c818bfee9dd2244597ae14064c80295d14aa2dac4564327ec46d2a07b77df83ad545ce0ae2a2afe672061315e914dc0a44aa4bb43da39a2f8c3d83ab0912eedde12ab3c471c8d6ec8cb48c137d911adf51e2038a1695e1919520f801ce1bafdaa127559a146e3bbfc89e857cc388cbae8312d304e98b466878ad95a58bc70f959b75c221702c13aebec99aab68096ad7c8dc955005b23bfcf0919cbaf5239f8eb40398f1656c7432090e3b7a32c4650dea5fbd170d440809cbd124236b5d1e5fbd396b3422b52fcd87b2956e1c442d665336741581bb369baea7811178a60818c10543eb13a64dbc7f2acfa25bf55ad2465821277602c8069a3249bcc02d4ac84f145b3941f6e63a5308fcbef52610055bb0611c96f8f335284c53a50786e376705d279240b8020c0062c910ed2a4eb4b8280fe10bec4e2d178bf8cbd33cfbad9fa48b510a687b8cc506922386bbf84c2927f30776c465613d15c5ec28e32182e01f27abf6cea73100c8c41926c501d392999bc113ce419a241dd11a0f1b55c0852fa82b224efcc2019bc4dfc34516fa9ad08f9e4903ee44e20e6bba1816e6b97157e9c0fd36fb0ac188e2f9671cb2af1efe777a9a7013af97a4e8ad8731ec2ff6d912da6f5c8cd6f6a528c2a327e48629b5147941b9953227fe4b6ad62114d8f178208496c89143322597693a6520caf903d35e8a44bd08dc84c9c003f70c8b333d887087b870fa21177e889fdc108fb15b0815c345f86090f5fac842cd4a68cf1596cbd643cc07afa021738f6056f913234034cd1945f186063b8a826aee607353b4f0e0df7d02d06620ff2041e9e4e30b2d866f7a449ee123d8c4c5e6758b3739c6c98f410949df426d34091132a2cb2897a70a6d2eb15cf65bc7ed8768de946125e53bcad55043a1374f790cf6221cf08dc0f96a4476c89143bb24391c0195ec6eac06ae623a6ba9ae31b99df6ff2d3865be689306cb002969ba59260674dd95dea78c808043399af426a1a050def6154a37500b19b08224ac4f6c1ec7eacaeb32a4936a421616364794b67c12250d0597544fcfe5387258bc8a1d0587d3a8e20cf17d0eab36bf0f3ffb3d2c36b677364d73cfa2a25e5a825fbcae5f6f37b5ec90f4f7482ee0dabd2e1a46188e1103dbeaa9ad5efea211f2ed4efe5371b32b5d62c51a42a76a3109d4552a7a797addfd1b3b7d2a8a0493c8628c1757001ea983c0338d399b8e28a55573268673a9b35d146a8f2f200e2fd9932f5b2547f3232b626e18cc1e1b35eb2a7d900018920a0cd5bac10a10032770f8bc476da362c7aa2646fb1bcd8574a62661cabfd2c775d223485ff790e3e28b60ea1857066a428c43359bf91da8bc1b825c974b8389549c1110a1ed335a5150986b0182b74fcc58f607bf7102055724112de0187139f560754107555af1f5bfb395499039f3685b45d6dc60d344d88b7a0ca508738c42ed4f7038613b1688c3cd54b59323136c6a9de7d575f30258e81da35fcedeb13ce45bedfd3daa4a8074a766feb4792a435654f9f9e73a000c113b905b9cb56d4f6d193cb34f93324e0717a790618e6f58b33a12bdcc4104de19851e3d9d9e46c0eec98794bce065366f51ed30e69c68ba7499a62b2547921225423b590fbe74b855650c467746584c48f7759f50f6bac62830a31f801dbcd65b2877fd3190c877137b4c72c5d3b6480805ef487e020b0a865e90cbb78de09081b8ead08a5d76e0751e1e9a8010387cd04fbae105a989f4bcec53a584f5efe5ec9892169964bde564c41002ea98700982c2d1be67a01481c5d5e757a12f46cfd3a7998738a519ef837469ef799da6cba0e2508db8606a4c0a987a22d6312e1344c3e2451b269df38f284a56648025b4485a2a118c07619ce858d7712c664b6a2205632fd12e8b1178dc6323a588edc28acae1794f501ec20056ad17bd1204bc28ac5af78563bb4ab9c68c374dcee2088cc47236f4939838fb3e671beba769eb941d250f9c70ad64a05340849635236a64d6e07974bc89d3498a8d1103936774b8fb869ac7e18288071824d866954c1c107541a247103a83e3982250e5583e533083291bec519b40337377116ab77bf4a1ad1a752ca118128d6d4b971af097a2dc38fb19c589a2d2a864dd391eaa925ba1de105a50db517e4005bcfd9d0ad02838eae122dc0239295d65ac26d3db3da8d45c0a1788db9efb953719d5baeb682ba36c513cfeadd7d998f8b8167f35550bf8f60e307feb0b14238c61916c5ce1aa6d9ea205728991b4425554e1f9e6bf5617f27f1c3bb756223a02ab1247fa1b1e04918e761698c1d71638551e49099c69cc7a985b18cc30d75a4465b08b492748b1ac17c2297eebd287fb1b2cb26687780eb8216cd987cc00660771331f5b218cbbf7dfc03c137132296857fb53c5b9120d747069c6f20280054e927631428c9f3af5a3a6d40d4aaa5c9da3b3cc3450f0ea24d173424503cc84ca7119d69f196cf5a129efac544028a45522877cf882fdcf7726ef7967521f1380930607c4ab5c172d7b6e0c22d65a80c2c862cb37069cb6fd69f6d15d68472f69b5ea5331f85a8e17703c63ca2b38c5c25fba37405f7b3ec93ae966a5d3c5954fe1b89b3dbaf475916ae17d90d8152a79cb3d31f578e98856b1370224a38e0c613fce13975fd88f731b49ba9c1fc2652bca7810683afe1a25be30875947ab5da1ae52c6ceedc9212fc291b029bd4f8bc5100d2bbb067dbe0150980e534dc26594b85c538dcb97306e6a0f0c92848660ff9ba1655f0737f617c1177353c4dae81ca9a9bb813dfe6549168c529e37f1da5e1ea633e53ca99e2af3d1378aa969d876d82aa815c179431831fe7766297ccea38de1630c9d4f5b1e63b443d029c93332c065cb4ee5f90c670d90b2d2334826c59b88f5805808822d282b60d99e47153b6137c89cf752888b9e3189610acfd3d2e9c93ef6b544773a8047292654d8c281541e46ef355bab89482af25aaa60593e2ed619655e9887f375a528469515af9c18e997efc12fce5059fa677c82ab86aca4a611ad8e0e5c7c5519d7f7e6c7302ef6f5daf55802de82d3519838ae9f95c1f9527b8591709541f4cc4487cf934e5fb2d15d1f25eabf58320dc359ce490a766922250ea7192d765a4ea849ef252ee0a56e685bf618dd62b07d43f696255c315798aff64e635a6b3bb34e857485f39c5c016a5e13799b8c62ab2c637e25d2ef0d3c5e140f590c7f2517688b7491909a84410ba1c98cdb943eb1f3de23163f505c069820771cf73138f49b0e1f29366f0f7793dfb33df460a2aad65198e75a89eea299f1b3f9de986c0ea51efcf1792d1a5a4017f6cf00da4602292ecbc46d627bef4be41707bd8dea4870d1ec458531383c865e3f91b62e9e4237f033482efee1eec2db0c241b0160f01ec65850269572b28baf3ff047b1a94e9b354a9445b7138a81631f5524f6a9112656d40166662a44f6c382eaa836289004f5cfcecf97b3f2b6b328c572f58ee1a617dc2beb8418ec040d5017d36a5f13c567086d946496e6413ca6f97d65be3f5f447082e4b25cac19c0a53dbb72c3fb51b2033a9213c9271bfdafe8561ebbbac6ecf6d1b9f697f8431d14273008faa9255a179a6342a173b4fdaed5ed30197fea0462100feb11f88e2dd14eb1c52ec2aa2290937029fc24e4c545b621c86413c1b7fff554821709ecb548d67784052f5dc43a2bee9a6a02fc48eb857dac476289219d605d68a8d41b330aea18bd7fa342481a53bae5fdd451d8227da74af424822dc454a89ccdf009ddf448c4a2b7167e74ea22c364d36ca36a497d33de403d3966cd4afc94d6e0bddaba1ba0ca1b77c1a42c5f287711b40683087347f2a0be0af35cf90b8c007f4215bade2331aa093d298eb4ccd934d3d88677274d526f3796b1bbcc50e6a2e5cac0c32de439ac9ca77660be96c3231464956ad65e0943ed02adb7952ddaa269b0fe9d6f32186997a00470b0337b4e4fa087ada0112d48abecbdff7158984a3f77b9448375b202596665921eb02c3a4697670d648c82c4d426e61b7edde2dfd28961efed9a9853020b8e7200796b8360fe6a93503e77eae96c2875e194ac03124afc49b7a484bd1762892ca18f1e505781f281da838318c8e6aa1fd44da9c2541737bd560690ded1f17824f64df9ed4eb99ca733d42a82af08fd809e8ea672ca7a1823514a7c6e0c257316b72d1b54cb60cd2ad75178b9895fde8e420cca9af261310acbf120c08507b96419aa4f2f917e4d6546c026963af8daa4fb264135f726e179fa5dab739f825ccb669c2a3cf376a76f0a188caa3066113e693b7355aebef11eb3357449415ce592aa42076755c31abc6d88ff063529a46b614606b6a927136f98d2c041b30c00908682184fb0230339ccaa5dd31868f7019a90539758c3ed15e1569e6b78ad340bc4b57452d4dcf90feffd1f1eed56a41fe49a1e35081990fe9a837e43015084ce5aff35ea7aa7c8a25970ed0a2553209e86c2b507cb386ec49a423fa54d9969c74b25dc927a0f7052706f26c0d344eb9cabd01f63d9bee2d3ff80d354ea1ceed5ed2d43f534abdb4bc9665a41ad45e8f967cac23b43cf649b60972afc2918b2a7ee94d3a1954c59f18931d7e60f72a2d1b93b1c1359b7dd30aec03926deb7a5986299d18482f50e0778cd1225bb3b177b18a78dac3c1378450d219131821e8e58a3896f84353ed93742c51659184bd992f890e09da854c3b5d605a2bc78be99806ed6a7e688c89f4fd8b51931592a38c887cb37fb0628f9d20f81c86ff6440ca159e24b634e0147510a6664c3fc0528929db031b391e219a35a3daad1949f9476233fc9b7210fc4d27419b8672b218d0e57d7752cfa4eda0acfe2581527ec9f32347284ade77a51959d70ad4530f1723033f7566246a6b842400643a850002bf01852e341d0acf2930f02f78f8e5befcd3ce4392909f80bc19e83f05f038014f0444103fda9e356b9a2710f7836c523b71b998e28e1f1e5b68c473ea4c4258f9aa2096455f58d3c7db04db78b49cdfa6f8031191ce6d4f8c1944ff2ae121c087559131207aeec22eb0b258a5df397aae220296f47642fc2ebff0724152acafbb4cfc2c4a443b1841570034ba24308737ec72a106624cf5f7afa1bd2556b31f95f04d1f474f8f8a390f2e92b8f3bd5a40200dc6ca05e596a9017269874e9c813fdeb80f40e5a963937b7a63f6b62150cbc73da5606d8978581e25cccc729277855382b71a8292056f8bba464e6094a20bac5d92fee7f61165de7c791316176929fd3b5d4cf9b2e774057a97be4b99eebb9e0ca6aeed7cfd2021b3c3680f203f6318794afa313826629e0fe6dedc4bc249420170f5eed2ddc84fcbb590be25cbd1367d156cc610b62623ec034c7fbe917d6e63e9ffdc9f123c2ff3a27c7409b04ce15602bdf6432fc20f27abc5c9c14ea7bf33baf11b196aacc5dec97e33e1abf6c3c2897abcc68ac2c66a88b69b0cb538ba46ac6820d6faf468902355388f90ba12e83c21dbb6b15a22b5d9a226569fb808c38f1dc9c10691a39ff6ea3eb32584091eed20ffac2d88ab628b008556e44851833c84b1cf5a789e04183e4fa0971556c09861a316923dea520918c6c0946b7f2437eb64cd9c5991a785945a539851beaa324ab37829d10e588af087efdc6c74663975434e672a9301e0b24c82bd9edeeed60488e498f58260f4734512e817c4013146674768130322efc4b0054d0b7f4a46763b72d629e28f2f61b35bb22eb7318536461adb180f00250155c51a0360e8bd3de2f22a4c17d23d3d472f00dc35d6a3779fdc62c626d07f30f8a0e0650c37eeccd23e9532d448b9c590e7705feab2deb0ad42295a7dfdedd7ed27e69312743541da1d5c5c99da32ba4c94081c1e01b95448b2928f9d5d99879a285e502d05d98b633cb4a626bc051b1809e5d1b54ed5260c4a790ce9b257843e5264be459a439fda4a286f0faf0320c07cc6ebf0bb84054d0fa1c4ef968d8a6f0395d5ad4888142c2a3c6259fb0c2c3fe502545965caaaf2c926cc1dde1ffc3927496df44bbd721a2bda89fa49602e8b74b42c83a95fa400df454a882ca720c0320faf5cb2d6a9daf824920704ba8b7f7f6a5ccc4f0becc54a765e989efb0f437745975b947c024647481a232ee60806091c9b2760c2e0246f1b90e316c011857e4d8663da3f983ee63cc7a07c9dae119b889293c6abd643894f41e338a10ddd2389df2d898c20b3c42dd8cbd54a2cced1343b9454b7a30915a295342afc711f9e6198721e04d5237d2d367803722ff31a6c9c6d68f5a2fbc41d2631e36a926c2cc5bead6d40063ab4de06f7612d1115be88662b078deae5dcbcfacc0507aa4021fdc5a7f79e40556f78c7868f2f0d24874042e052b58a2c1432d08fd97a385ca92defca75096949624e401e563e93c0f8679dcf954d8904df3ee383ba29e9ea99cf2e189ac253999b465ccd99d17003caab4706c02d38e70172998a25296fb097a127d990cbd7a64065aa4aabe14d896ab79d36fe6fc38c28ae6cd1c448a1e6c5133a181022d83eea257ff79b8f65703e732054015a341d9056b10f5c150d881917f1f170e07eeeec791e79c9f974ceba072f4ecd89a202ba9ac97b38f96dcea5f49542776d8dced2c0af55955fff752b0d224cdb01ddcc02b0144214fb67ec65e4f2f158edaad13fb545e24c526b3debec4505cbf95294765b223a1f772f91c375e9347cedc9b9e6a31000a5c8cab9dab0945901d458ec78afb17a83bdd52422b8dec963906e9ae15a4f088b7e92e935c263e7cd20c8fa011c5c9bc1b311b281bf6d7479aeae20f97902629510b96b762e19df7888b7c80d0bab1552a194b800ab8b071cf1da0249337f75a7b7a503a1441bfd0703c0d88283319c0e6885f1fe262a53d8e8f5fdb0b58c5f9f2204e0b9c22aef8afd396221dd2e3ac84fb71b1f60899e6c1c54581cc56c56d09c9848cd6e5b7edf197950a73a759b6b315f8522f87156c1d74ea1bb5b4f6059f6392e34817feed4fcdf12c42742fd81897f9fe4508bff016486a6efe2ada0f0cddfb3b3de86ee5a8dd59112039bdcb415b34a905353375cb2256ed7e891254cb63072049819ddb92e5d1bb8cbc37e8f41980c6212be741d7ad0292251084956849ec621d2587213c852a8b2db65da8569bae1da4f753e4fba16fafa0269b145209f5be9205867d1b85c996286ca1e734382e9448ea5d648ecb800a890efaf44aeae4def1f4443536aded1e6beac88d1577953756ad00b0eb257370a2efcba1d1e63a939a8bb8e9213edd6cc5c777d7751fcd76ed521629852dfb77f5460322153175ef88ed0c1d7c9fc045812a6e38f06991b2560419008b89e1261c43f503beb4f0893e5901b01e41e95ed881734231e3114f4b9080f89a3e87d87f010f2f9e021fdc9c14394a3c143351428c0157a94ace8f21cc0d60544a16d40b41ec1430ef4768210e52932437ce7d00d555636b79299b292a14330dd21367abc0c8617df4e936e291e87962d1cff6441c9c8bff85a5a56190f6e6cd9cd9e83f3a65c039bc915322b17061d77703ce5b88f25c527de7b6a83c3cb350fdb6103253351695645dd8390cf0e035795aa5d5975c843fc8acc2cb7442ae5d2c94f537a0e6c2aaeaceafc27e6a5715e907f9c5cef4906bae95d68b86367fdefdef193fcb82da8906f379f8330229c9f2df716e6f7f2604941dbafbecfea0188f9231ed44c5c29bab93c58d67fd259f9d4ae47558569be3827db2bf3cc643085d79d1ce0fa4bc4c17cf38bce77caf5084f4f93869243636f53ef4f729f40e1b48c8455340b3b54d476c8c811f1836dec15dcdb8f82d4adfbc9c9bebbefdc3141e502b2da166a75e484972fa5c212e69af64f9a5722aa23217038e6b25b8bb75573b4c70de37087fee00a2574540af19c60056463c52ba240103e6daf65cf535aa504609097a099b9d6f6b64a2a7649cf7c40d3a1ae7ea8a0ef03812305024f35932775ee1d91d3346972363752ef2ee9cbdd2ae49180641f0c56bdbe36b13804b861289886d29a7747703da24de1180d6c39e53c02f25ee15eacf38d82a112018581a41e719acbeb4407c8e442b6fc09ed2d45b21f78d2c3f849bd47cff55c787108b48c273d2fdea3af3fd458d0f07d1f9631ea02243f9e9d63943e6f191edc234053a06de797d87ce6663df4c155b5f379ddf3b9a16eb1b9fbd1a143a52a97aec758cae016c5f08035dcacf6284070d29393513d5842b9c31a9c7e37ebfd689c16e1b3a53e21537bc4777b5ba9f0efa04abc5e8bb4f75a3b3801580169bf9223652cf9fb0473cdb4476df832773238f480349300a31a8c73ff475d14c8e56939d4422ffc388235527a1e990abc6762701ab2f2edcdf9ca7dcf2808558d49190aade3662ac8f1d4c851f567ab9fa09f075a7f031f8595ea25fede0d3156213fac145ddf0e55bd867426cb486bdcda0952ada5f56146cc80b3723d29adaebec2861bc342f2c92f27391d9781d6b46e8c3ee15eefa1b3f8bdbd0e2060f34a276cb5249e384d4244cabbe85543333cb88f12fad0268f8f8b92bd11465417882e1a3bbfa4a609deebd6084526257b086c4d44c996722cef1492f2454cd06f960e31004e1aa8e4892304ee86ffc742a5390c9b5935f25a652e176962f69a5616810c2322d841e19845d6b0f0769e8e1095bceba2828f7d0c3605579314c1bc4430c712e2567668ed9c0d3edc10c9c04393ef1994e892bdcc8639b21aff733f29ad307d6fc2adfbc1353bef16d8da0dcda9f467d8469bf2c14c448a455faa6c1b11760cbae948faff1a51fe72357d4442a4b3fe6820bdaea90f91573c7739af2bf51ebc9c4f5ccdb394f354a94fcf62301b8edff108b4a4c695911a01191f86590896e97718581ae4d05cf2881f93c75b3018fc7069493f8d4555f8b8307d372a1f17f3d000a9051de20c85682c1335a2103305bf412c92bb44f25a1192a1e331927ea7519c79f000f133cf5c48f873acacad613468a177cd006dc34be1627194c4a880979bbdf1806305fc3162fe868e767ada150ec3c6f4e08941b3c56e62c6f8c7969318f1dc31027b0521f189f689c6185f043774617fc3b14b6a0383f1131ab0b6c1734f8327a335b46ec61fb8ea88481f52ba7402327825316681093b006e1210c35f5d2ea8417e7b62d36156367e4930415adbe6a2d8cac4fad6e52867af6de0ac099e5ba6af80c2341770e3db015f02fa463432eaf4a383988b25164ec9bde9a14fe15f125866fd019f0552a196d11ee24116360bf2f5d2a811d511c40070e72bb39a8fb2ed67392eca828a4f4e59be699a8de5dd5097dfc350d9d5ca0d0f9c2c7a763ac6026303b393a579d6904e3a2c3cd4ed549f7bbae16987fc3a04c0c74b432c8caf06df86c4420d7de25a08b4ee194638065d0f79d8dae92b6af2fea6bf2f8b10559787a3b414fa56c93503a2c0b79170176e1d1e6d4284e0f91086cf75970303c133913ae37b31ed491dd0e6329f27a529bcb775152414a26efa170a269fc2f44e9b1a3c1146b8f1c881c6e301583d404423cba3360c6d0dee56eef84a6c1e189d2b76d7f45f48ac3939fdae1a60e5fbec52ad1240c85947ac04df934ed541a5702376122f628df84c4c3462fe6aaf93e3bfb7dacaa9843e0dbecfd0c51045d9a0c13f37f92af44cc2a1d964aaea28efe313b8c4f0bcaf16f16762b7a8d0dc495b583385821bb9bc86594801acf63f56ecbdac5e0b0b6a4018a941782cdc54f3db435c1f2a4a6cbd6ba294356f9341921b9be5b67de44654f0f07cde28a654db30904426e03a166ca724e19ced33acf2cf579c7467b4f8e51c62a8aaf12fc87741835c797a7eba9f212287a789bb41d7c4c8c18b70e7aaf57f4f69ced9e314cabb08cdbce04b054dd417bd963645e031d15a0d570f00ce8add1153901262cc63d3641ef72a9457967c16e90d7fe6a8a9635c02011d91f3fe5ffa85cc7ef925a4e3e2c4b140088420eeff595587572c4693c459c5d7fe3bb7fc2abb0b837c742d8008588f4dd5ee95abf4e4235eace2d3551b9a5d0d83f1f81b778d6072cca3bb1d31ddd321fa7f5b7659422a06147a6999928b53f9b1647f0d2cdddfaa616fd22dadb9aed39e39d0fe6afbafc91e8aea9d90da754bafe876b8d09aed1d34b236a5644bab6e523c13e1fb8f1035604d4688f7cfa72901186157ce1fac2cde7a0bd56621190ca61e4f8f3119128e0f44275bc9d759dc63c7c3b033120934d36179cd2c955f2c0f14967be990d968814cef6b4998701954702f6967593abf27d5f7add54615331753b6b73707053348287138b28d6067d13cd3e7402c258fa19bdfbd0ac5d010981d8c2c4d02fc591bd9b3a2c004ff175ed212906f6cdcdca14d631987551cdb0cc3cde932a4ccfff0245b6f9e1b6aa0087a0a8f87761b0a7b1dc189f45ff11c46bab1c6079fb81a9cddeb19d525531d00954e30b2592ce41c74f2bb268fed3064363da5d947a3ff761cc8e40519feff7dbdf4ea6775ff44bb4285e8953406cba9abfb17b6a58a45a4600afead1abb2faa66bb287ae536c1c1889e932e17dba8b39ff3d5d853dc4b16ec9bd16b8dd6e6a802f037c8ce966e97f7579f9c038a1e662b79ddf5d8a6118de4b858a07162699932986ae8d99d682c411e57dd616153a13d6a28d993404ee2b8daff4d143a101eba5515bd12edc88c4fb1a4e319e4e56849a7b5cb90bf280d123d48b53ff2bff4110d2fe9cafb3e919f291d856afb8111b044fd1d55a6fc9bfa5835dbcff3701b98e2745b9e104a1da7f3651b3794bc839eff962d5b7179e5c3652de0b0646b2aff13711b1ba659420c39ec6b5d54fb8f319d4c28a7f29dc9dc5cb1d075bde5059ddfd206460aae70648f9be114bfe91db115935d3b299747e28333964a2e393240a12eb697e41d91f87fe0f39b8467760720b512cd32862b26368ad616587e318a67357b716624271cd5128dc168ed99aa9e6f2f81273eb3e80ec9cefb3a3b028ef90de3e7737e5b7a4fe89416ad8493ea72d3b5f5ba3a182c11ac8dc17e88fe2ae34cb64637e996b3aad66f5912970e20136624b0456c533b491e15580a05d165ad242e2b9ffe7bdfc3d1018af45db64d8bc578284b035688bd9bedda808c67fb6060a7d7e80ec29c895e75da1eee043d97e6f14f60b6f64ab090273226bbd40c606e507e4fed9522c826b78f08218ebee0c680e13923c7ed1a87e0e19a229c7ccff9a05034b5f4efd363d53b9516ad34ae506381fa0620fdf895137c457713f422d5e3eb609eb1bae04ddabf3792ae4bda4d8981994156e35e03f7a32b73f27fd92e58fb499bb5a87598eaf8dfc9b3769df62608599b0faf07ba7ebfafa2308e738213c27d5633c1b0023b56a7598236b2c2784a04f7c23dc6e22623488923cd907d454c1903472138842cc64af181a0ecb118aba6e907da4ae2dca78e3b30787781fb6f16e84b89de42eb802a01a21fbba8d9eaa239074ad8f1420f6bbf6ce437f4b874bea84cb42c386c4980026c471769abc7ba26b10a622c3083b7cea18f5689bfffb6c8ece418160c1cecdf1d7b6aed8ef29d2d3cd5fc83921da4be20557a4aead77a2031727a955207d5e3f239b341db951a54aacf20798629638d18031218d492bb20e1a3594b34eb9aefd46ac69624909086b90d85db56c13ed67f89299dffd9ab4af3f0919c7efb368232cce4046b680cc50e683a8da7366e08f9c352f14985117ec3996530093982cc2e883314e4c4de59a02d9aa2b66ca7f635e5adeb74014d8e1b96d82f2668317af601376d56682f78fe7200f45a2c9f40b6c19d8815c14d0fd53f286e2d354953df50a364f7de563a256b8d031b210068ac1b305c3ff041c2873f520e6771b0d6571c44a68a037d290e90cbdb197a25cbe243addc68a66fa628d72d2bd807f71223410955bbf5c344cdb43492de7f3714f26ebcff26673098fb125b2326f870a50b44449edbf0e69e0fd19e16520bb51048d2aef6171b2e21e61b462f9fb22b3f63d376eb9687d6d3221c17e67e8b491adc8a2a0306d5c4a7c3b136483f6df900b9e2065e89f17d33e8a29923f5291a51868b88b8478765bd5bcab474a7ee92c0af34b76e4b7bb680936914ebeaae64d705d49c648b50d0b64f90f656968ca7f06954707db8fb073393a7c68d6e6a96771d969246ba4893a924389ffb85f71b5492b8c13943c3e1efbbc79b9341bbaeb01fc0dde58beaf271140e61cf47d7e50a81621330dfcc2c6505dc614cfdac32fa702694ae02780a8158f60aaddd1152a78e2154dab37fe93eab02256b3eadd099aefc66b1225b1a829617ef086c95a082c096ab31265ff1939d2a1b553e206fb77bfe0f36815fb069f5505df09efb66652107056a5174e83340f146a95adcef67d193629b92a85ce41349b62829181366d5955dfa049a40b91353ed857d49cca9a44a99c0d4fecdc144952588aa7a4260b7053417387bd6e6d5620b4b7c68d6f08334f18876169ead4e17aabfc0585c81c92ae0ff23cd056b72cefcd21b13928b0ea9d46b7eea6a324d2c56729a022c136ad8e89a1735c6733613fe69fa62f677028c86142f04c3f1ba15eed49b2eef483cd65d90685490c152e2612969d0126a7f036c676377188a9aa10ea54c955e16891728208fd3d0e5b0fc7dd52b4baa255fa6fd25a6812a1e6f4c710235f5660552bdb63e91ebaf631f86657dc0072c3817def1b1c552dda0cca79a612548f2c60a953f360e0dcab84f90d31950a664c6cea0ccd3a15ef58fe5f48ada893f67c5c3a0ccbb818a2191c4878684e89d924507c64e250f6b3256401fe718cdc5306714ab773648f9b5c46307d7b6ca363471b488975ddf7bf53c567d78020cac83e95232b40170a4ac3a925986acdadef91af59d6a51ac5d0e6069c44c10c1a7d2cd39c602dd8a82dce84ef82d2265e2d5d507d73de2e700f6db2c1ec74964a0d5643282a99ee8f4cfae0a0febdd2346f749338763e387c7a9c5e2f3a67a34a9f075bd1640858234d1a4f001f590a90cf32047d51bf0ecbc5acb907532ddf432e367e61447a6702644cfbf808586cd270c2454b81053f30043b9c465273f71048d901b462559308bda5670e7b7546072d09988da4fda82c71c1fa7aacfaec7c51a65b47bade117c31ecd2798888c369d847affdb10f089017c74bc15091ab3791cb318198cf401ec995fd94ccdbc65858e044c277a78cefd18ce4342901574efa08af136301f85c10e34b62ccf07f61c4e8b26e3ce3dcaec74e9e0cf76a9f37c22ce380d46ea6afeb1eb6fe9655c4e46ef95ec6cd82bb9b7243d59153b22098e20e2c794a39b15de5102cebe539ea29163555ceb27296b9148964c88b96df1a41e3f89153748e8f01186596dcf4c11518712fc4aa0b42bd7140aa7d11fe199384ea9b1e3bce03b897ccc4bcc5fc7227340f0d395d2bc3a3958416d98e24f072b0eaaa01668c2104b674e3cc7e401159543bac42ca796eecf702c3e5a99fdd332a514cd0cc8d0203e1802dfb56c6375f0feba14d15e14766219530f5f9f1302a513ced124538fbaff0f8cd15aa4cbcc48a1281aaf9a93167282c19878b136c7369f670f8eee00bd91234d0e5903613dea67835a84d83c066b84bde219c5b67ef80d315cccdacb8ab5b10164f4245963294beaa4afbc1f7481d27fdbcab9c55aeafaf792e40383aad6a6d1d9adf74df6ec34829ce3b4fe719e6f0b900b568c1d37e17487f4638aa82dbdbfd99ee53b226a5ca64bf3a72b55f141397531553053807b63f14f5c02f331acc8cebcb3aae70e3a6e318d08123840c42f20ccaa348c508dbc828865ae70b012e62893de103b6d71a8975a07ade819303bb8282891a57935ba7b8ef8d5998ba89006cb2b808c3e740b102a3f99ae270b5ab5d13c0b3c99ccb4303e4cf48491a5629172410c36ee3652183ab8167f7745bf78040423d61a5e523c6715f23049c53c412699e1b3586b9cf785282d620c67e67abcf074f3f730057dfe412537df5406868cb44f5709849ad236fd47ac2158355233d7b477214bbed003d2e1ba9fdc8d17fdd4400c0cb5f22fb763f3240b54ca9a2f87a5ca3932e8e8e44606abe5364165f3ff987939736678913f2f8af47e6f31162dbd9044151947044a7f5470093fea5a04259db7968a5c2e667412747d9fc5f78161ca870c130d3696a4ab7be5348277bc98340b91d9fe1a84043b5b4acf20fd8f682959cf6007fb41d34ede3e268f999aab106998ebb51fe5bf61e984999cab7fcad9e9229effb34021267fcf83489eca75222179e82f9840f3facb4f1e7a95e5e923d4e1bba69cab919c148668891ab354f333524d7d259f76a2d7d08b2d1813fc64e724e74431f44788a8242b7c5e58d67339379dd0c5bc5c1b104bb54a76a64edaa5d33d43dfc5e68cf8b54c64dd3171583b42d2db612f5de32bbe0d912cb5fe763a0f70615c0892a0440a6236666263f412b473c8526130b13ed762e05ebdfd334b14e9a8bcc9e688519ec3cee23e9052d8dbd22eda205043ea2e1cf5dcda3de0c8081e202f4a918b74180dcab91733731a26f0e07430c14e51fe98805d79b8f31ea672a8d38ee7506156a24c184df6cb5ff4963c1e3ca1eb4703cc9ad995d7a60857941fbe5a75194bde9641bb7ede873502ddfeb55c21f75bd4e1eae2d970f03fb0bd86b787eabd547b0c3d088f1dc61e99371646c71ccef0135bd3d47245993e437bb50cd3b3c5fd1226eaddfe338e8b2c2a3f7e62343128815954683eefdef7d46feae0d1e04be28c72089aeb9bf1c774b10c66ee8d13cc8daa96c0d8bd10700e04bd71a03ba827db9964c4b095f0c9dce7366e59e2574e281cb9d2fa640ef7714d4e78bf2387e9d85764303414525ba38525fa5a18d604792fdd72b567a43de18cd9a7bdcce4c641d174a82445256e5343b64d7634231644f491c6c8705b13a96fa232cb9c647b30efc675a496abed20338e27f5d8fa9fd2ac251c7861c5a8edaa71da9154138338b63a45c04187c473b03d128b0e27d637fe1d9b46910393be99985043c933ec4e0ac9bf69374394506b21719468e21f90f40f952704ac01307f5b66f94c030a8838fc22dff22d93c84fa582cad1c6b43f59f178267683e10d7d1d32676a1d2feb5aa2ee32ffa74138a38bf90e2912b7e3bf16493c341141ba0acde8e0bcef447e30efd9cedbec1ce7c0722487fd3cf95d5f1a989fa3bf9ce5c1c130f22367f783f1d443c4ccef7f3e87e87b422b9b490c5834f89ee91eea7110e5ba164821fa9380911ac05238d47dcf70ba859ae3de007950b59a118b3fe961039c30ca6dc0c1093860e5e9b5bbf80be3012071129f5432fc9b9703d7047aed5b4a606c10b2998a3a0ec64a98031c0f8c16c690355778768fda5c7a83dd0e375f832c2ad0c100ef7d418199e44136ee8d8aafb11cdd3b6eb1d8aee009891c365c19a0e4b4b940702d8ae14fe15575850b5cb52ca46d3341dfa09d6dee48d84262b2f6eb4d889fb006b677eaab0e756c5eba43fa7b1b6fc379af8d7408d0fd4b67bcef3f255460aedf77823abf33a5d76cd7a543617968de717c8da8ccdeeb780f5ef406f72f73626d7a825ed6491826dae80c2c4fc5de8c668ffaacf33364b8e2fce426a46b053d63c72ddcb2719eb0b7a616a5e8232f00c8bec022173c0b9d079190427bdf39a0937f8620d57a09bb3a145ef21a31cc50ee3904667ea309ae1a53fbb97188ee0a3558479d42900286f04f0175202f4fd67150f24e5fba4047d377cb9d0701ba7b82f878f831c83a1425dc6a8280fa2f44ae98e313b9ea33be47f0bc9ae857a771c1013cdb0b3b25a660de32f205fca12ca6af1fd45555aa08d86be255761b985186a205eea9a00adc7b2b8e15406b09aea7c56437af90716de7c6c0cb52a0f12f8b7c9051b0bd8c9cdf4519d81919ac40028d161f65ae1c15b453ca124d15eca45053b3347ede7705958ae89afcd1a1cdf59f8ff968494e718ff06c2729af74820f7dcaa122b15847f093f1546a3213213793aa45eb65f61a8c4627f8ddad33eaaed0d6778f86921156bef86558d0628e8375b9d6b0471d7f5232a9598aef90bdc7403088b68eebee8e8c759df23a2c8fb085350921ca6e63401e2af6cc4248afb96a83d54da0c5cc798c55561dae52af246ffd774ace5b4608774a282cbdbf26eb901091730f27f7dd4ba60a6affb84bb2aa31e8a1ccc6ba3f0af8f9b1dcdc16986a4f16d4403bfdd76e4817ec3a815c146b0217f8fa1cea0a35dfaa4c5ec6dcb04c2185d539733bf2bdf7745d93fc110a187c199d9a3647eeb4b3af8cb99ef1b21d46dea830ad4c399953a25e940b7515febb8b7f8bb6869c7d6a1bac37c0c8d1ed55406ab08fe12153f79fa1983a132775c7514e779edc3bc8607e6612f42df9ad27cc2da5a32b2ef1668207c09a251296b445fad5d24e4871a2da4d6f33f26899bdabea1a7015ac02953c75006215e45c281097b54cd46634b18dcfe7cc7760823509fee0c52a8d8bc0124eb9588514d9888084a978c5bbedf53e3e76b4287e241bad64d983f7625fa90b3a43e76d4d4e7f6d98db404c38271520360f0d43bc96bd69113465054f0af6cd632facf119860f97c1877cec6b1fc141f0af094e2fd60c782cb2dc128a6402199829f1e72a86b20fbd740edcbb22d630f17d4ca36337a9b4147abaa73c15d8cef47093b126c5eb0d5c4c9496aec26da27a818576c1f2dc1456ad078c5f299675692b9812245e4901e54944a02a479c34da31e1e17610b84e991e8009dbcaa27526260839a60da4624c9bd71cc328a658c001b1a5b07314c929be9c0134d7f378ae1a11888467a24c962ad452c8b574b0558c1cdb63f9fdc0849e69416ca828b24b12e6239cb0cc02fba2d6d7d4cd7d6fa7d3b6b3295d89fc4bbfcfc7a03daa2ed4e9d01069162a9a3c252d1ce019487cd4fa5da6150967359ed72f732ea9a82e768f5bd97bdae88864f0515e85ff28b83e7b477d644b3233a29461560f46aa15b7ba3ff366fd5f01d67222cb0a18eefe686605d98ab1d60f1d927bb21a9c80777d937cff0a2aac3cd2b6aba9bc11dfb30423540e41a9e2a263f3eb66959df403e3e22a89c43e7bde56935f4071a548b7896a56e6f07597c4f628c0b329904144c080b927e774d5095ddb28a93e68e32074e944f137786849d3d1f7d075cd3e967606157a178d1c4fbf5941bc50eedf039aedb7fdb47acb32bbecf7f669cb4b1a7cd894e3414df23198356dec101f12c92861ae5d09ccec67eb934939bf81dbd56707bde1e6dc86c36095fff70df92242546e10e1d97abaec3a23b74833ebcb1182578b583407aed08385950fd88a0418109b9067190b21dcfb275bb5d3d4d157122b103e24588743d844f3cfcc6b48ea841588bbb6764222c2585df23e778ea65dd8361e6a3c55a1c164f097ed52ebca76a744698cd0f4023f122b9ba40baf2ecc7abd2a56abf70078c9926d23bed406b3193e5e178c6b05d79cb02e10aae260365b9b75510733931112acdc7651ebe8a56c13763e65234e7867cd0011b31271a043898109dd58e37801ee717830b413989157208ac167493a394dd514bed2cc8acb06891fd556e3b667f8328746bb1bf01664e5805f317983d6c01bcc4bc942a3465f516ed2d7d358184dc81060830241ee948e547b17a857ee618b152a87e990b76e2b26308613b8c7cd472d3bde1c0dec854bf1fad179cc0484f46899e1418f535807891e650441bf7742408de296ae0b465538a4859b4dcf40a20b57598caafbe7fb56eaf0201e9fbedafb98b103e0be13f4c84faae5aa43e2735331552bf74a3443cbc663755ffadef1a216e513d93f145b5b6033db5af4dde3a618b43c41101d8644b1a1c3506fb2af4d52718a08474bacce05fed644290f54201e954d07b92e31a8932bffcd226553bb95fecc9927fbe0d4bd0f5b964451c1a8b4d43f1bac6f384c0b684978ac24b96f45be47c18982b162c187c8bf88ddb0552a41a04cf0682424a4edbdf7de7b4b29539201de0ea50e2c0f1ea6bc00ece761ca0361531ea67c8c85b1281ea6fc0f76f330e51ba479d96c7e9c926255be45f6f362716182e21b95f75ec5c5aa7c006892aa6f8bcd8d5b3e5a2dce68fa9ce9ccaab56cd94fd2b24fd202e0496c56e1708959edcfd3d5b7f80669007063ed1500ec6cb11187ed83f5286afc9ce97814557ece743c8aca491be3aa13f030cbb2eeeeee19b3cfdea1a837dfd0b0a631a1e11bf929299ff2f26d6efc1f6d1c6a2d265bfc61c0c0dd9f29d528d83e68351e56d3b19a4f4cb6b61cd7b69c986d8c62896939f773a693631b9f8a904cdb4b07f7b603c36640b2c533a2eda5fd944ada8f26e4acfebaff349e486233201e6647b08bc8b1d89c252d31b51ed8ffd3846ecaca73dffd3662d04624b276e24ec779643d994ec4998b26c996100fe3fd2910cfcf8e50cf916cc164cb7f8a9cc8290c8909adfe246182e21b9227798fe4e42bea4f5f3fe5adeca7d6df9c85fa5adf3b5919a3762006a67f3a3141f18df66d8a304cd625c643d37b118c31de1b14c7d7b4fb1eca1858de3989c0fd19ea4f1575370feb97ecf4b03e683f0feb673fb295f296fa5ef20dd298d44bf233e40c27b12a5f627306a4e259952b84eda4e8a17521d96abd3ffd116558bcf6325ee6fd678cba642bc6aac5a7f2040ae57f8e45b4c703e50974c37df75eaa6f2622064e7da77e864cd916d7460cdcdfa26329dbe236928746e28bbf0cdb2e193b00db3f4d245bbc48e52c1811a9b3fd52ca9f21637cefa58d9ffbb39f8c2843721689e693fd6440349e0c48b606f0fe59916cb584d83421d9e23346f6c3ca7e60643f73c85959be9c42ce920fdb5e20b8bd60ceca4ab108ee2f454d481ae193f727824f4c6ede4a503248ff006ccbc6d2a430a268148be09cfd60bfd19de5ae1775f693a9babbbbb528370fe59d48453c7423fc59a17691874be07e437fff06240047e20e9ba3febbb96bca43ae56bb79c87d7f3a82fbdf80fd7300647c20c2f8679f53a98f9f511e67169cf25551b7add6981595edc4e6fafdc9864fa2a8259fe3d0c9a3ac47514d4e1f97aa2878fbd5e682b767b1bd6ae54f6cea5736ab30f72c6c0e31f72a9b633077b38d1833b582623d0aed54736c1fc0db0d89fa6a8487f51d8a7a4f271a5c076212bee17efe66b9139b63502bc7c05b8ec15b04caa1cbe9b70d6f1fde52788bce5a7d46c1dbcd270f7ec9f6517c7177798b7792bc48493d25b6318b08d4f3e33eb57bac0afb255b9cc73bd9c624d6a3a8d97bfca7c76138648bbb50d67b3cf4ef24d3bb23a1ba8ee7bdec21948df86404dbef4db37689a9831dc886766223ee2dfbceb2041c71016fc5c73131ae6d97ad2a972893f2feb70331f0cdca7f9fff9dc5729fed6fe5399bb7bbf22b17878a4db1ad23bef4bbb0d1b6f43e2bd48d090d679c1c7cc3bdf79bed1cbc7dc75dafbe47c2e2a30ceaf4abf76f1fba47b65cbcf7e4ca926343e0a79c75f2fedbc927a0c7bf2bd4bc0d6194f722787b533462badbca7aa83a21c2db9b94146d4f82b247f0f63ed8e82d2f6cf416161bbdc5858dde726df4ed33f799f6269b678e4391e808e7686f68987e67f30d0d6f76db70d62f6d23019964c1d3f104ed97fdeecad1713ba75dce9a33c735e9fd9650b32a87b3321768c10a6bc0feaa4fa8e6ced9de50654e1168778c5916b32c66598c59c7cee697840d0d78e8df41bae8080c29ecb9f3d04670d21442c8c1feaacfc12e637777374aca23820e2a6afe70cd59836480cf8012479499aff55123c956fd2e7d7f27798e6c994e7d93c0109db0038e3f8295cdbde959a271ee1ee7711e3060e7d1d132ba47c3f8b727658feb2ed1384b1e38778f93d57cfa3b0caa44518112a85fba4dd477cd191da577629b313d687ba6c123e64cbd4ea4c034537a9ff1ee4db62310a58fdd734078374fe71142959f9d47f2c81e1ebae4a1f5a89207f6239f6930019b12310f787b6d93570279bed9c0f37739693667b794524ad932e2d6e92352d251ab28fa1623b3e088892d24648bc79027db3cb49f3b1b8fb3c023c4d07f78e8a7a74fafc6e3e18e4f9d5ff3c359ddc3fb0891d53e6268a364f9f789a252f9c9f68fb7f8b78f28e3bd7f0b21ca7cefdf41e81e51c6f4fe14a4015375fbee4da5cfdb74a4a07d44d0f68f6d202e84b74f066efee519edc4ee61972748c3518d87b3260fdd34970ea47028714895aa5639a3c62331631185e1a1c754f93162e0bf00a63f4b5eaa821759729683fdabcc9ee3bc2ecbba2eebbaacebb2ace35ecac9d98de3388ee3b6ffc00d6f993ed298d447deb27dbfd7443c8ee3b86f24cef4dcb5e1af26f2839a7d6e239c243bf0e6dafd77bd9b3f37120f03e48ce94aa1a0193293445bc4deddc95d1bfeb2916388254530fb6e07fc85630bd54804e736923485da9fe5686bf07a26b20ca1e676f57bfe6abb76b80e186a128e374feced9282bbbcf5399bbff010041d277e46fe14c285f09fd8db41a0a3b6176d0dc7f2080668bfddd08f71b2e06c54a84d418083e31b20bf34c23e450f18768fd1b9248654d42d7f6cf9b1a5efaaffb1123870c3a1629ff508f64fa13cb1655996dd4c55957e4ae3ec0daaea202ae97657f2ce4f06f5c3aa9260c053006107fe80a0037bbf90a399064bb0c2710a240499264aa3cded1dbbe79c936a33fbf9d37f7eaf3c6aeeb43b46efe9ef6dc3b9a16eac6cb77ea999770b00de664f37d47e9f3223c24191148e530022640a4de831450eda6092724ef971257dfaa665d1ed9445ccf79772befc0615c04997b163dc5e5a7104da88479d1544e80217bc2c033f25d4f89ed4a2bb7bcd0fd8fda3cb28dd6526e58c9dd988a50d37434e0c3a38bf41053858a308f931914a01089b26a55946b38cc62ccba4f46c9b0dd3ee4794720532a74e3fd2e994729b9645ec33cbec8a6694caf74d93d3a98dac97c6e62cbf7eaff4ee66b07d96ad7d8333e20e0f101344440843c6f6fe0d6819b2ebec38d90ac3f0db680000cb272a12b1230cfdb632865a6ca1f44d9872dbcfed8fe0ee04b6bbc4d34d7292bb749372f64d00111efa11484c6086d625dcb66ddbb66d3365c19b420e5e918a22ece0f3fc558d0ecfab8409c76ff50930ad4c4c9c5d25641e1aa683e830e03ca3146da062879091d7efb5ad21f380071c1f40707caf035784e0480dc7990927b8bb7777bbb7bb0ba094717ab8201a71280bd8a988617f1af10d68c06e0620d85f0c3d1862073338211afdc0fe85580513b09085f8052143ea1085724e806fc8149637e33461c800c430801650aa95728d297c10b150054c15e11b6aee152b4208ddd04205559c6eb012842845ce09f00d4f61bfd90341664c297f200a271bb08660aff18ad0d8ba205d76a51c02228d0c34b21a60a739c0fe83804c67b3a246f69853ce39a794734a29e7ec2a4a19cb256047800908bb0cf61b71646b4110327ddd7b38db6bde4de0cdf460ff7cb0c14d89ed665e261acbcff235c92a6dab1addd7f4c7f892fd0cd9df6f7665e33d58dade14c11a9d136ffabe79e296cec486b9e76e8dc9c486b7bf797b1b32580969b29d07bcdd4b8372508023b880e80296b29739f185be777bf6fda6871e719e5fd58c20e5f64d7bdaa973f60ce280850e8ac31382e28084398527fc088a4310da06c5c106599665120c2a1c838ce0c1b7387490912238c59562c3c4a78117595a867f9c477cf0f68ebdd932b26f198e0120714a36c9a50cc78f2d83caf8f744cd36195fac8c30b1c55fa2ac944810fbcd5a84d93e4698ecdf37fe546e7e9778ac7d2b11f380079cbdd7e48bb5a74b3091e1ed6f6c580903e0ed767cc1deec58c331bd2e1e4ac9e2a1fc515970d327deb64e38e690e2b871387e8c32c286d1629078841d075112ceca3129c70534e0ac36a2593f74e8dfe1e6d2325e228cff908b0b0cf6cf00b82e4968407e769192522aa94bcb88d8c5656a9f5d344d4aeda594d225e7c342cd71f999cb99bdf73a6e73f79fe12e8b98b108e93de17d3ee88d52ad888c92c08b2cda0056fe39001ffcb839cbddaeb699758ef9b9d77133cbb6ac676633b7520670623800ef0f4a0fe6940b4a985a20941e9401c8910a24f0b88ffb0001670c437050811a84780e00be8308c0c001c01a9e049cdd9bec4190dd10ace0f94d901f59680ec7d97cd240e248059d1a78e8ee3cd8ddbd083f7ae07d3ca62f0875fef6ef833a3f93d9c778933d554076371cdaedd371bff9a8d91bf105a16a4478b493dd83edbdd7d95577dddedc38adeb7aebb6ed353b57202062bef60888d87bed418023042b58bb375ef6bd8d0e7bef69a08d86a319a2c0c15002a219a2c0c115b0d77ddd77d8bb5bf7db3bcba3b72ce5076c2af0224bae98be97810d6e1e08665f69f33c10f440f03750a3f8138217849ae777db4bf09be866e47b76dbbcf48ec4cecce78320d4ede5d398db0682366b0faeb4ccf36dcb5fe9c1f7ec6a7629035735b4e75e7b6e036dd31278b311f8db3cabd9ec58e39e856656c889a57b2c40f61108b58fa8df8e952a0740df7fa3dd52fa90e72ad9a2a9e0094df0221067be6b02efe3cc97bd3600950c80fcf83fa8de7b34c766431b10c123580c99210a1c0c99210a1ccc783f7d40bd776e8a1f30d7716011361b81b7f7b6d634aa757fa6655996cdcfb80de4341f7453569e1a719cf16f4d7bd95a6f3932d77ee5daaf38ed5753db34cfaefca5f6f207acfdd4aef6d9773740820e4c7ffe2a5bcd9ffed31bc2f24f5ebe17c127efbdfccc363e82bf2f416104c7e048051441d8d33e695d4e1cf5a6f4dfe7d2bbfc0f246246a9542a95feb3d161ee35e76ed67ebb3e5412ac89b8896ee609ee6587a70fce7a60ef391dd87b13143a38fb954de9e9672fbf71303764247fdafaf5d78134d3034b600dd8bd57fa3ccfabe1fdc99bc01af2bfec7bf9add5684f4da69bb9a72f4fbee2994f1ef8c006fc127460842e90e10954f0ccc4d872fa0fac616f4e4eef815f83344efee4e5cb3fd9ec7fe2f3bbcce5f95f9eefcd9053be7733c7d91bfa22a8913df81eca9a80f68624c697eee433b088f9a6ff4a7f62b35dd994befbd277ef6de034f969bdbf293da8bd77337defb9bb32b9347070ea5735505f7ad497bef4967b94f5b8efacf7a0cddc7b26071b1067587c67513e5c3102315ff5d472f7c67b5abf8245649f298b929fe12950bd133102916766c8125b8383539b0d6fbc8fb8da1bcf6457365ee9c6008bc86e3fbd375e2300270a4d20000707cf6b02138013851a6dae6acc1cd80438723f6d1398c3c11ef70e763732bc841206c0dfdfc8b0121a8ef1c5f499006f4aac60eea3d704defe8640856fa83077b79be967201133708c2e34b4a70131e84c9c31fdaa1f09d9e24b1cd1bdf70d883346dc1c44e0cc7c0f16dd95113a48be7befbf273a30b3a2d7081da57fc208f0e6689c991c85704ef7a71c92477d048d20b9ab23504ff2a84b49ee0a023d83fa9e415d9c19cfe2cc747675c4e9bb3f65f7e3912dbdaa7157f33b9693831d28276715ff7b986cade25d31a0fbd343c03b9dbefbe82f8ffc3d9b846cf1ef2cace68884933a7964e995de136a976e942de0fdc16e2a2a3a4232c54c4935478210a83c10d8644bf6df8ecd70ccecfcc13e5f1e1d0dc9a3a4529229c7e47216b7e365d231ed48134f94691c869a71f007d2709a17869a3dfd0ea4a1f1aee26f1f31a559428bf48787eea1e663843cb23d2618bda61ea925f5c04a422522d95a41a07baffb28547484148b329de37b13a0a0fbefae20e0fdf75f8eeebfbbf580467477e3912d9e7d6252514b3ba59d124fa907f6038484144b2ae5945ca5d70ff6ff010285888a8ebe2fd40cba4017f8ea2cce0cb803f2803db215671a3b4f9471ec8fa365a472b03f09a20cfdaef1698c31c618638c31c618638c31c618638c31c618bb2d29c65677b524fa1167c65fc6646bc66d47b67c3df1250a55debc09edc856b693555a52b8235bddd6b93a57278fe411110ffd9172c39450239e5454f992407227de4cdd2079b053a11f79d4b99c956b0cb0e7ce8577c82322b2883c9a46f368167534fd231665a46c75ef4fdd105ba61ed962f28c05d8b313c4cf940e3277923c9247d94e77b9a222f99a296b5a92a908bb9664eac9aa1a4d3dd8a396b419d992b6587c71ae08fb3fee5b4aca9d0b2997925cde3dcecaed9fe4acdc3df8c8ed1f75f3184ff0c9c02f3dcc85e89ff80deb9f18fb63c33cf49fbefde31371606f865442c31a8e33f7bf8c3ffb22317f869c57344cfc2568e283a0b17cf769d84fceb08d0f4b4f0835374f448932dafba7449920b59e62c79f80b71a161f892b5a064d84c956f596542f81c4472c849a6bdc5e8235f4f3b6db37d8a0e94b36c70fb199d2c3bcf74ad5a704932d5925ac24611ee6e834c0664a5fe58755555280a66938999452ce29bff9691d683d2db69772129bfbf6d3c6ec379bf5046b58a870cc2688e1e6e9c8235bdee32dde3db961eed362befb5422e860ff140a186a6d1d38f76c491f6f7109a4858f07869add47c2824898fb348f0ff66f1e1390d736d9926d9b8dec9b7ab7d19bb74abfa348d8487d2c884945e5bab87411028c26a2833d4a29a57db9084e0e85a3dbd3ffed7a93d2f994d2ef2b562fede9f428df4748f415283a2857701cc762c5fe7b4d9f5a1f2adce71223e911a547941e517a44e9d151cb20e2216d22d3bbb415a3f427aaa7467c0c1989e0d2e5be458b3bdf88162d6eb6f1e1d2b778f0b2b8363ecce2730bee4f9edad34e55dd1b12b3f8e7fe66fb8959dc1b136ae3cb363eecfd8994f986bca2af6819256e7b8a29c76d44f05c9952f34d9eda0ea4f04df726efcd4f65bd3fb1a56badcafb50f9520356fe7f82341ea5f453d9f927b6f42ad69ecc67c0caffcf703aef0c2f591ff6575ad8fb794bf7d4cb3ecfe4553526dffd0c3fb13e54baee55ec07d23079bbf22a56c713a5161f4194a7dfb700ff7b24ae8844f00cef426d0c7e63f067f8fc34939df46bea4d648ba7275f427994d5b3f87833e54b4bc19ff355b1a3eda7b5a193bb2b04782f7f03010ef6b20d2c3fdbc0db6fcf65ee51ef79928915ec6d3fbb9f1ce5fcaeba8b001cecddd30eea267ffed7cd7bdaa9734e93edbb7bdaa9db2dc2e4bb7ba3fa6923b5a9fefb1416e04f15cac99f7edebc62c1e274f2a5932f9d94a82dcdd2d3eda4f4a7d2d35309a4b445e9b6f8538ba7b60535399d7e9e7e7e099db4e4eb425dd9f4cbab32f9d45dd5005f3e6862f2a90dfc9489c94ff053efc50998a47087b9ecce395fcad2bc99c5739fb564278f7a16369fbcb7d9809ffad4cd2673bb32a7b0742c6d3e7992f7df88507d4e6195c983f9e4da4861939bfaaf628ab2d906fefe03694e36529889c620f89f8d6187009f956fe4e0fe7befb331aca8e0e7184378e825d9751a98001c4cbbfeba0ed3fb58abe1318668a9fcf79bb3bcb5f2df0c5f899d8bb322d7dd3ce75639ae278abb0842139070a40247299ad003dc2a1f59743ca1bd133fa3f2ddddbd7a15fb44bf09621388e1acfe1b1323c6c47b8187e1a123c1fdeadbc6b0e12f9ce98889e142f8841123012d849ab79557f9959be387d8cccaab7cdf1c57ef652b14abcaaecacbbd12af8f0ff2d0817e26823d838898182a36c6162b88e01047202b5a80bd1853239015467004b222e80547a02042700c10b115f3b363042ae820095b3032a3612252caa7940205b162ca79fb0ae9acecfa13115bcf8a1efa4cff042212f188c8527de7546714ee13ee380718aa97da03ee2d2597b26988c84a7dff8c7880c862f1fd25b185844ce3fe2d7e5186e4fbc12883f2178ebfba290f51a26a45a5aab5458b6f67cd47792f731c1c74e0d56fefe342f9ed294823821c57a7bdd97ef55b8335b65fbdb7d994ff00ae3285b3f9c3bd8a8162730cf77115b795f683f30d4f090d139ffbb6f139db3e0dd351090dd3cffda6b5121ad6b8e7ac16551f4fbe8535798fe9dfb61ab38273cc4cfdf62c6cc495d36cbe3131f7dc0d5783b3f3399bdb26fbfe54e7c64a447b63b2b0510a5565bb87898eedd404283004fb5731602f815790017bef788b6f20b600c5d691853b08c501fbaf013b12b961b18d88e0f6b8af89987b1c1c719c7650a568c20d70c4c16d6f48acddbea26126bd5f0ae53690ec2d37d0059c956360207184fd27108908a1ca06422248cd31457136118ab3c0413432849eadbbbbbbe77ff386917704cf08755251bd276a04fb73fc0ade470fdd3d76dc373bc64ce3be4d62affbb8af9b5ec779a58e2ff1236ed9130c5e7c519b254f20e77121fc33eb3d2e84bff769a1462b34eee99a1296d18465cf709b1daf4e3434bc42e1c63be4adf1c5dfb1f7a366b25565f5c935d50304fb7b8f8982fac2ee8a2fd97fb1e9922dfe1dcbb5933a49deec39b9e278b3bb72add99d3941354f1fec3f7d7ccb72708f2b6f58f6fdb619cbc9c9818127fd2625a51bb5527ec4262f8034729b3149b74d3e9537caa772c636db51db4514d973b372dbbaa776ebba9fe1db7b5ef6f506d26c947e3fc329fd2ccb721358a38dd469b92ded2b3eb37dd430dbb63d92879bd679b7bb9f870d82a5164a293579f03dd0ce2ed43731791c5c32f9b8c1e0924f953c09aaa49afae3ba9b71e0eeb7adc676d37df633d629a1e1afdbb6ecd8d37eb374fbcc760ed2d0fbd9ee3d9b6535b837b18d4bec128d73146af0234c0cc9cd610b06ff71aee0052ff81d5b1504413b138083b3ebf4ae6c26a63f312dcd89bd066b36ac5d22e24b8d1c850cf06e8881869831845fd082c98a9a6370b6012347a1cd7a94bee775ef81000753cffbae121aeeb6d7e867560369b6ce66f43536340ca576c63ca4bfd9ec6926afcac3fe923659810a005610a10baa6d6a9a26df67fab7e9618ee1dfe7ca756107dad63e7b1a3fbbdbf4dbc4c4e15cbac08bced27efb997577b7b775072212bee99737b7959c8ed8e2376fb82662a7e1d87bd36e66232261bf6cf062ec28a594b2c8080fbd2045421ec347d0f1443f8c8f2cd1663f2de267f9ed72232f0e0ffd6fc426100e1cf60331d6ea19200bc3d6ee9733539cdd0cc8439c654ba8d9632d6213c8944194b1bd54de7fee4c1ece727116cbfbab58b0e9337f268fb302f0fe12c959f6fd65111973d6bfbf34e22c00bcbf4c92479cd5f23dbcffd4e1ac17efc3fbcf1dce0adf7fbea20c8bdf664003ecff5551331d1510f6bc18639432c61c1707474d5342622d8299bf5a30502f4d523767f44afbfeda3ec6f813a489a5dbf674fad4fb0e189c5e3a103ed994875d1eb616a9e93b1ada63f2481ebed358de1d2d236279fde561cc375c7a2c79d4473f653fa69b37ee4130df90f8f4f2e61bf3e4b4534dee8d89637dedbbe47217f513c77b53e3cc3726a6dfa8cf3764c3286ed3bda11f5fbbc99ee2781d06272debeb306818f9d2a6deebbe52e9677877408573cadfc4f7e2d7f7e4376d9db67b966dbdb4a7cfec7b5af726f67bcec647d9d3c3b0ad12f044081a19b55ffc137b7a216cebbbf435f04ff6e45b56889a9237bdeac4c617226a282b1f86654d548935995e7b4aa3e44df4c4ca17c2b2de442bb19365abb7445adfc4d6d48f263b511686adde323fdafa538847d993e72cf8265bf2d1ced47b2436549e7a8741cb88389552423df92c0a389c35850f1eb8bb845be311631910ecb5fbae24f7efcf69f211f5b5e4f4e0a74af1b38fd1c66f2b637c2e03ca7e32209e05614f026bfd333c6a156b77850010e0e07943b082e35d99fe262681fb93c099f62ea4e99b89154cbf3fde6c43bbab79118083e95dd1bf99af3d9daffdbc2fdf64b396801311577e172d8df494b3a7f7b453b36b43d5c57b73fa796fb88fd6860ac76b43854f57de6c43554a9d7ce44a504ff2f1663095422900f5f56738cae62670adb6662fb5df400548547d92dfeac7ec6a3793fc0d894f3e4f939b7170bd264ff233fca38d323ec9cb6f11656cf1510975658353dfb7e47bdeccbfa98f6011277fff9efcbd3f93c0590a25bb51b7d69babac1ffd9a7cf62693f79975f12636db50e1d4734f2d138d5336277fefcdf353d7e699250270e4adaf59d3b7f65a5f99b9ffe1abbd99ff9d3e95fd8d2cf9be25afdd92d3bd99253673d7860acf7bdffb19b285ad3846fc83cd30b0f72e6c4e027bdf81342436549889d6bc976ff0e45fac66a4b7578acd2a9cf29fd592bef72c526da668310ffd3f2cd40d96b5588d66240be2e1e6a3ddfc5a6bda0f76fca9f06771f0f692db56abd04b28a619715637369972b237996eacd1642746d950e17e146803002b886005eebbb2c138b8917266f673b421c5b2aa28c6aed1c39b6d8438037aefeb49a85913da5e4574909c15652bce6c5b8c4a853385b1c05c6ccab6bd8bcbcf7097df3ec5be7cca4f6705f129bf39eb7eca7fce527dca5767917ccaa79c05c4a7bcca59319ff228ce82a93fd45a6bad9f0b179ffab6a927b1b931c9579b63e0fa9fcd44e0effbfbabb35428cff239d3b1c18249fea24c34ed9bdba62325eaa3f55e43d9f8f0e927d66ce432a3ec2823e2ac93ac88b34aef2525252825d0c6b8d890e53dfce1496cc45ffde15dd8dc3f3c0569ee8db54958b0ea49401b941f379001ab262651ddea61cacff9c32727cfd90669b4f893003cb5ab9389eb500de2ac8f66f59fdd02603fdbe223c8fdd642b205c40711f3decdb54309e116e902002d282178496c360df9d0d6668a332ae72a3f8ec56a42ae28131b24a2b197492222cd8fb90b701507d73b6dd0301910760a04e5b3c6e38127a8bd4d8a95e83ce4b82e6c73d5f4158532791c5cf2267f0405c7209f2be020251441b501fb93e018e47306ac841e388348414978053521865f700c6a0210f662cba0a63e4b97118e6690bd231e4d839ac108740423ec0f160163a011f9543ee538502315a8e0832f8e54a0c20b07e14107734fbd68811aa748c111f6e28d1aa7d07184e7ff2cc208114cbf4ba830c58e172f409a952ce3384a41d3d7b569b5af0d39ebbbd1c57b9fd586ac16f47dd682843c741049a24c2798be046b9ce013e992d37aab9fe12c709f70731844eace72efa5eac778fa3c34799207914a3b4aaf928eb3668987ca962b56f9a8f226367a486253cec2c1f52b98f2b07e0469566c35f2f0a891648b2b427d9426ed6b5194a7cfc3f925b12863dfc3fa9cadcf15c9bf79bb5c5189ab793cbf7fc5ce6f519a29ee27f7d35924cffdc67d8d32b6e4e97b1d48436b382679cf5a253e50a2807e4aefaa64453f4b578dfe92bba257c27694aef4b92698b7b88f207eda4a324d4a4a487e9a949058b088e927086b02e22df382393573459c91b332c99738eb86842be2be106556efefadac12265cf2241b58045d408d54083ad2bfb211937c127824c732d198e482463cd4c75dd30f128f243d4b1907b713b57d9ce58214beaad66dcb435dcda7bf9ad726c4f486209276e4ae401a2d86875a5f7ed662990bdb5805b4df1dea098e5468c1119cbda32c7b43e02ccb585070f6794bbada64c122d2255b60cc5bbcc41313536f0ec357d1fba2e90b221da9d93bfa729c95290cbb9c95359e230f297624480bf2560fad648d47e3d17a78eb24245bfc897e603f15f9ac9418c11c97db0897d4220f5bf029c714f4d324e4e10e0f513d8e781461d48908e334b143ebe1a1b3542c4e2817e6be630bc561ee661b21a62f9f038be0ae6988c80ef50634d2f8b343bde1fe461775de9bdeebacca9bbc95c964fa1077ef993adb99fea4c3f4fe9dfd55f7f6661c6cdf7bcdd6227b57ddb509b1e99e748031d088b3b2e94dda73ef99acca73b61655a33ad41567b22bee572bee436c7a2dafb86b1362d355a26358091dcefa95e969578b3cf495e9da84f81462ce252d51c9158148cea2de916c715411ce4dbc30f7992b3a32996efe006d6207e65e2681b9d72c7773f625362655ade76a3c1e3aca052a00ac419f7b4a9f32d198de930e3a54ee3388a4f1d0f7d8f2aa7734bfa46a2af2d029ac8235a8408520583e5dd984a71c230f5dca7bd2e1a173dc3505f1f0630169b4f8edb5a23652f25e5bad4823fae650ef678de87e72a8b916b120beb874c5a15eab05b1d146707f47412455882992a77d9b6df12c303d61ca618ae9777453902267d168f1dd66fa196e22cada83486011539049c834245dd4d5922e6fe1acfd19de048e4439c4dc739792bcb54a58259ac09c25798e23b11162692bf6fce348ba3d465ad2b820b87ed6621e9106e98d35068348fffe49b215677ebb399c20127729d6ae77e444a5cf3de8f5f78fa5c99b7c462abd37a6373df79ec904d2a84aecc49fcd1567940bfb9f80299ca5ebbd2313306fd93484fd556c9e3138c4b916a9de5bf94aec3ce56844ae15392bd29f4c61ee21ce14e64fe4987ec9e266154e7d8e4535a9f7c0d30e6aeab92b77787853ef2388f788d049ddec2f6c8258037ca61f0469b86f9b4d10b37112c083e0690772078834af74c917881493dcc889b0621f2b8134209287d2b5630d354b97dc912ed9f28ebc23e93a450f8948809009a4999f1431c76ddbb66ddbc671b4724560116f51c1c14710cf0571513bbcc5bd9820803011000c0a437d1e4194a1f1348ca71e4794a9ef1da15e2817f719e542edf08eb498c6d33250288da769501cb7a15c1ea648be4106f84ccc777def57369d6f3ac775d328efbbffde0022c5a40b49b66a114aa8659c841ac6bf168148a85a74126a1931c294bed65a543a09617f01d887a1227949f213ac715c7da8dc50734c328961434c100f0410df3340040184003e260820de67da2500d49f7c0a6853f226af02d2c0c1a837b1d9b1c9374803f53140b880b03102914dfee4aa8036258ffa159006753348c3e4b6eb8248f1c53f464271bd5da40d35c72404a062accfa0be5da8fe1c438036a6af8f02d2d4dbaedb39a52ed2492a0f4472a15ca81da897b3e29c9b768076cdf0900d35c724d008f6cf5c1158048c816ba8392681ae972d9648c41045309070f43bea07ef1e2aa2037a02f129fdf85340a10347202fe8bcc0710a9811f65a07a5d5e3629c36fa8747dfec028937fb80ec2a8edd5d03fd00f54f03f19e02d5a1d29cae81b2ce72f3b51f20a0ce80fa474af9d9ed1fa0fe692020f173ff24d152ae3249b5db2e12077f456a9ee1c7985ff3c43d3cece922a422468890adfe11ea9fa226f263d31660c1f1867ef78035a84d09e26d9f1f484849dca21ed4dc3d7c7ab4113ced120db4829c96360239819473d269182e2cf21b679618d5c5db480c8c0f1604fb57e923cb584296b0710c334b386b20851a24e128051d2318064729e804e13672d6e48c6abf84f5e8c991b3c323a8853cbcc31d86b48e919591018a34b0010769f20256031efa4b3b686e9052ca98b594b2bbbb1bd66d07198fe6677d74cd50b3ec3d32d4dc413d2485c89a3624a1b3eed734edb5be37f23b7ca3354e77dfdc04b68964c0b36d60bc20451e9ac0d96ff4ded88855bcf0bc1d8855e41c38bb59e22a5e9a9452cad316a49452d24c6ffa7dc037d428ca2c11837d803138b790c76922477b1fc1fb5d1d4ebccc7cef2299f1de63b0510a93e0eca32793fbb39ba5cc7d7313b8231970b721fb0edf81fda780f148692100e30529f230c37ddb9c03f78d8d48249fb08c5408e108df689cdd0e4422f8fa304113b18ad74c77736215af19139637f7a7b037bf4e02b18ad70c7773748fe3c063093d5802ecc87b9b338b000320a0e0074f98d1e1c4cb0cf72e92994e87133ee3bdab0033dc7fd65580192f871151b6789fe308efb99be32ff739124539aca00a3ed60006228c610b8f5383a127f08007521421010e3371a63be27372681256c8055c2e806f508f0c5586218787a72f74d16d220ffd1d84a94da4430a3922f256cfb8f01d86827207c52c5fde30dc410221231ec1b0bcf2066c82a9082e77e82167f595c1b9bf83863a287710f6ef213b38abbf73b047a0ee914424827d9b391273ff681fecfdd27ca609463ce708b0ca4251f4034ba5fa75dec77dbd1147ced7cfb53bc68f31c68b23e7f49d534d319aeae7f8387262528eefe3c9de98b8547a8fb9bf9e3ed7c7516352cde1a19f4c36734938fcc6c4251b1ff670f0f638d8eb6aaaf5f4dee9743a9d4ea793c9544d76f330e66191239dd446acbb3cd4e139b28523c7a8e21843457947755a4f0cd51b52730ba9b9913c2a6a75500a8f52e7711ff8cecbc80b5e207fbced1b437565af45999ef138abf85ccc2a3ef73833315691fe111bbd399e88f708fadccd91e36e5bdfde691c68b7b3db2e99b73823a350b374459996bf444b97b3b2bfa44bee30c2cf16fbd5ae577cf12292fc5df1459b81a44060c08831c587be7594c28b2f6ac5de861c6388194f0c61ff030c798ec7e4cf8aa78d56fe7cb93a82be7c7a7d088687a1f4f12da4e69818181e933fb6d89a1fe34f20b08dad28e329c696942e5746f48d52e0936ca2bdb590059e27747afc202243cd1be6e1c1b383853a81a4983fb019393cb09d8da79166bb4f8185facb6a63c237fe35ca96affbfb3ebec49756d43ca515f5f39b4f38fbcb77dfe69cd35bcac18b2c79cbe1a1c4115f24f7337c07cb3e92add78e6c912fa994f272377bf98e6c653b13e63fb009f39e09cbce33738474c2e80f0aa33d335cded92303da787af4983d4453072e348b889c35858c3cc88c7d63a8ee4232480a49207f1a3f89cc16adfab5c799c991fdfc23b29faf5da118b2c5b32cc6c3428d7722a121bef8c79938436366e4cf89145f7cf6c8162f922d2e54e431fe922d473587e18cb54f2fc8389fc52502b15646bcf8f811f7cff9c27e0faef83dfc77e8ac9e5d0b6ff5a180292515d34a7d5a72b2a84be2223349b168aa136e6311b6fd7f67f553393f94adc3c3978eb33ac67867d53173668ccde2e2da5f51494159b560a13a312989312a8a805324a8533595c0cfebb84dcbec6c59258b773e06501521a93daba3ba102a17c29f7e9ef566f5ec13dff7c374c6ef7e86ab9c152f4d5555bcbf8134f33ba8c6a8fa3f5a9aece35d65df78098a6f4c3cb5efc620a1e6185c678cb7e6ccd32a253073bce8c37b9ff1a704138013f30644879e57bebcdb949d271360382bc7c0885104a0f74cdf67541f77f65aab7f6b2f7e8db5e20bd6f8dd7bbd7d8eeff10e116308cff3bc6887f030c6101e4833b909220007c7cf3198863e6769e28d71966f34f2db7af393cd810dd2c87790267e667d7cef7df7a67f3ebddbbc9f87afdadfb246df79bfd85eba9b0b36a49a74a408daf74bfba49c73ce39e7d43419bbe367afa95a38644b91235afc2cfb1c67651998525231add43f59d42571b1a9522c253d98bce0bea50f1e65baef538b8e325106e53bc7c3d89ad6499e136fc73c74a41c97eb7096bb8cf8f0a2071617d7fe8a4a0a8a8d2bdb2d2c8b7e559ff49bf497f4a7fa4950fda73681a6185fe24b1fe9c771bdea7842bb9de4a1e7b81046356ff2e75f4d8b378a9a3ba93f93df72b694f2e288d3b4058ffb54f79e12fe351187f1a53f66168cd23dce4c7c16160e85850565d368f6f555b5bfc9aeadb2c7d3f1849c2fec3b31eaec8831be5cd9e76e89e4ac185f5e2231febc2d8f3e2dd42c3bdef83c687cf9f2c84324996dc4eb42924712c946238243b6f47589248f1acf97b3f10ac708a6631f2ecc02c72910f1685fd782ced5306d39dc7755e3be6c7c1807e3600e9c9786e3ec364f7cf1f73c1f35673b385a062a07fba8f20a79d4307e1465c61065fa3fd874755044d66441b6238f3a57e7ea5cf228dbd991473b59dfe9f27a6ade869a48c439b1739540902676aecd08fb07f1b60f6c417cf1075d0de39f84fd8f18f1d08b9862d84d482e900551467f67537a69132afa60df17220b84228647b2d55dd0253fbfe7923f18b86d5fadde05bfa3ee1ec50bc2e28b3fe8ca76228f6ce16430a028d3b18f0702abf912285b4d69ea81fd0011459936bd6209c754e4a3e28832f1fd471065c831c4972b1ac681f87898fdc0f19b3d1eded848d0b93a976cad8ce8fcbb57b7d3f1743d1d2cca7467bdefbbea0fbdcfb1eabb04d83dcecce3ccf45da20171a674736cd7693f1efa67459090b0d3f40569b01101e5110d9553a333a8d2481615797452f9afa300efc4cfa440e6210f334f74523e1292729ef6a16c11e0e3c798612ad58ff13d93a56f7d18e087a0415a7b92a35366f3bb241f32265ba64bb6e48032c8c130200e14e42d43f17f6aa94d776e935290c6c7101305157c6f7e262b29100fa230f075c11754986cf9a1300f6340411a8d466cf266b8e46080b26912fc32a42c49cbd15c25af9ae46f1a37b30efc3818078bbdba184754b21de6625c4ca87b08fbbdb837d0a09852ca610acbba0d67d96b204df71a58e3786ad8b31456a3d8344ba310c329c4d0ffd225442ac40702332f48485e6dc2342ec3bf6dd24e9dd76bf2983b3bd83f6e4442f1c5e7a70a40ae10b4514b71b514d630de3222f6a75c6b252b7107d34cdf3dfd388bc8b0773b9a052bc8ab715fc9367e8ea86574420d23c411bdc017d0d0bc0beea843db0f27d4322816220c10cd42274485bc9d899f7ac7154aa832339315ee829ad77d3565e5e24b4efc4c015c990d923257a6d330263662bad3932561ce39e79ca69ff36fd4948f32ab9fdf3f40a68b9ff7e78b9ff6670f3f674634e7cc90e669fa3059e6d45e73924cedc79c1a6ccea90dcda911cd39b522736ab139e7b663ceed35e7dc7eccb9c1e69cdbd04ccd16533537a27932b72293c52c995b6c722d98a8f919916c653f51e66613ced950cbe05e1061fc5f50c54bb6bcd7005eaf1f2da32b42f2317ec064ab8bb5602cd850cbe89086702704832808a296d11111c0cddec180f881c56260b4d88e96d1fdf881fd7fd8f1922d2ef6f27afd6819dd8e00fc80c916470400580b6ca86570455244b2c5a98870c55b9196c10df5c95604fb6f31d9e25ad032b81f0d83c4628bfd68c176ba79f381e522ddfc4638fbbcd09a70dc0fdad383435bd2753d284f68539ec783eeec604b82294833dfe631bd54e703e98bbefe4190a6f4600a0aaf581f0630800168520c22cbbb410cfdbd57176b982e46c910c510c310437f942862b884e88418fa1bc0d228c4162ac42bc42c442fdc800dd8ff0c31d632681118de805de5c66a3f4e59d51d2e178ec2bea53e3f14080d228ae1ed86f604c48706c5a6378134e09bea17da8aefa43a680e8dc25228220c9187431e0af9fc00098a2f5350c1c485d6843dd317dad209a441310a850251de938034dd938035245f68bf0c497aaf9e34c552a221201e05f25e9324b45eaaa404a459f912b0a6e473d1e1b711a7583a24f4a3932105c9efdee47bcf2bc996522ddd4c7fbabb3bb656da6814f18542419f10619cfe780824be4401fb674869c0fe25200d8ab37b6426258596c3269b111370c662df8af531840f509090b710c5971fd886339d9641b51061fc29176c80fd4f8a9c80130929b45a11910af431858488a8c07974f28536c39305f6545f68295ee1ee8f8f21ee84813e668f1b6affb433089c4040ab1548d3e974af16df2d808d33a19543d838d371b14ca765704411a64bc2b1cc85d2bd3a9d6ec7599496a404024b3b44aeb8009f55e0cb2f8025801d22a58bc96ec7bb57d7e968efddacfa6eca8df2aff6f59aaef6a59b57320cded77fd7bbf27aafee6355e14c9798dd0e0baaca668f1834797850beae53a3a694af282a2b17d7c4f6f0e25728ac07eb75455a068582e41671fce2ba8821c53a241315944ea823723ba1b013ea88ac2e85b9a0364cb6bc570783bd5456df2995d5a5b0c6b04fe9ba21ec413b9d112a588ac5c058b7c3e47d44454a442051918edb604330d850467f344b7db8976c5120dc8f9641a1a04395bb9906bdb047115f9cfb7129cc05264678f585b6f18af531c44f4b611efe80dc107fad0f573833c4a540bcc5dfe4d214184c25c53b9a94e48776621736626913a774d11febb2241cb51638bec75686245bdc3b43929fc9be1a7d513796ae2635489ec56adad77a089fe55dbc781fb4afaf69dfd644f29af62f603f301f20b01f980f059292f26ff307f0db98565f575eabab5b6345abff33e4dbfc7f625259d5d752fe5fcb1b5ead6e8d94fb26cd6aaf62f3ff290c5fab6ffa12cda6682961aef5de28227cedde849f726f5ebcf6f6c6bc37260e4d2ffef43ed83cb18b97a00dc9bfb8d3c31e2e8b0b1726f751eea35c1414cda2d4373dca6ba68bf22628afd5bfd9048544d32ccab56f625fb3d6f4a69b3d136bfaae266f32799366d234acf27d6f56775583e4fb4956ab67a142f22c56cf82e459ac4ca65fb9294f61a6949b376cfabf268bf27df2d532d158e5bd411b9267c1e2e6d5abe45596122c42ae7cdb7f93056bf4ff9d21abe955bf626f568f4a79954ec129f766f524a6cbe24f9a8d2a9b1f9ffec4be8034262517ac518249deebe1eb7afa1e409ad473af94e57c50363746713fa8d79e83fda0927ce6603e1e090a65713a0ec6f9d0d38b17208da7a35529b917b7437d5a5073f7ea7838cb593acedad1625126260024c207017e23c07f6c2080f574b6ed3f67997ebbf9c6c4da773cf5082388601a6b672b6da5d26b5fba1398980544a2a87bd94ea7dbf1767cf05e2f0a735613754d83843a1d0fbd7b79e83da899c25e3ecef228104fc7fb6d27478b00efbdbc97a7e361839f062e70b46ddecb593add4f6f11e0bbef184c0007351b49782ce00762b88bc996f7925c1c62abab41e462b2d5bd64addf0b70d227c4170a856e710a935d0d628b2621d22a28154f61142644613e86780a1bc2d217200dbd14968382387c48515989ce02000a9354e3b8c011793cde0e8704efc5c1027080008033805c38acd96c0e110e316b43ccd410437faf06b115a31d22076b19195296060e09d8ffe5b35896a4e56c58d21f409a39c40f600c0f0606a4a11a9e364342d260401a09032626060eb55fb2952121bd905e5c8c4bfacf5bdd4bb6bcfced662e898b693cb81867a47bc95617f32ef6a2e154b8a7e5ba184a4ca5ea863aa24ea813fa98b38c382b897694ca2771e9800adf000186dad7760a205565105f10a023c100250fea867386e459110f6320cdbc19d214028c5f893e952d208d007c31ca448f3ba148b814576272c2a958702db8158a771025ed2f68e3c18cb2e04596fc4f6c1f9fd07eb34bbc66bdb74bbf258ee8ed3d1b1b1170dbadb16df688feae0730adf8863a20621cec7d1cf8df4300fcbcdf381dde57abe3fb930caa123109c7998c6676200dfad32608acbdf7d59839395a839fc94e7a52ca0f2c71d72607a626b086c4370a0069e0d4279870ac69b723e71a1a3c2970a658036da40d0e14a450234a9151ae8b318018202c8e3f411b9c28602a059edf81352210bef1bca32c79c7e90649e9c49cbc29c1294f76dc57125bbcb5bd6f97c55b58cdc2b295be18654edf813616b0784a8a3dd317a34c9675608d96340d5e9c38d8d37272c26ce32fb17c6dfe666bcc9c1c267c0998fe1baacb75df25b2bfb161affb1cac31b14d07d60015e02f5f0369e038fe36261c674a48d75aa2419bc07c29e5043c6e4e4a29a594ca8f0341db3cbcc5b96d9352822fe94b8e637989a29aa00c4294d12848d3a5aa4f7cf1d76c2721be2821be2c21bef85350f2a04e9cdb077b04bfee93200bda27aecea236da539086bc95e3401a6e9bdcbca91ee2a89e477fbe06da5800cb9f138922ad484e1814b4b1009e2fbdbf5fda5860dedab989c7480941cc50796017384a8185245c0511b6384a51c50f0c04b3e20b3f473806fd106101c7a025ecc0de51168480b2c00367ef28a8c759acdee1320e387fa8d89663ce39e79cdb9683630535cf9f1f1e3a0c3f013a51b31c122404fbe901f32feff2fff77b807880f8fc38f2e281f22d7ef52a6f7fe54fbc8f38e288238e38e28823c63546df97fce94d9ee4b5377dc411c78a8ae15ee5ad5a145db2b38f2916679d843c3c0d79cb9187e41119834745ad45cf5d0916d13927c01ce71da15cdb75d066480fa17e44dee2848a702dea9afb6a0ae05e2bf288a0845042f422b910fe59558b58dcf5818227fa83c8282194106ac859ab1af4a634cdf33c2f8806411a1bf8c6460ad3a772db8450ae9310ca751242b950aecd4b71dccd366ce0ed9b280767ef284a9105225e11ecdbc63d17c3dd7c126a4ab9db27211923464c4c18fedf53f4b0713df2d089640be5d28864ab511ecaf33c8f1392ad4ea823c2feb5488b79471e110fc9432d46617568c2609f1d73df97092f1ca7008511bc8263d04f0c7345dc4f010d3d534003cfcab742839cfbb9ec8fd805776d1daa443508a8829a41a39e1a2318f76d7170046970b630d4cc151569198dfddd85b37744c33158867eef689b42cdde110d77534748a99fe13f6a8d110c0604d718f97858630404d451b91feed61801d1623188093cb83f05a469168e11ccc388bd1635463dceea9e1f0f093bcc5bde91b7f88fed67cec9d51801d96c8d91cf8f1e16608d514f8f1f27fd5acc5959ba6a8c7a925a46c431ee008a32d154c459d1e546ea4f0562d231f1601311ec2624ec5f2344c759d2088e18c6d608d10932016b8604ed384bc20147fc626b84ec08958035438484e4384bbe0147ec626b84e4c05260cd10981097b3a41b70c46f6b84b87e48c09a213f46469c256338e26b6b8c8cf4408135437a24394bb601478c626b8c927a4e60cd909e97b3241b70c42d6c8d901750056b860019c59c25d780235ed91aa3188f09ac19c2236487b364111cb18aad11b2034809ac190244880e674935e088adad11a263880f08d60cf139e22c99061cf18aad313af2e3036b86fc18729644038ef8c4d6180d0939e28135428e1c394b22e1884bb6c6e8e815657ac8ab88b3e41970c49ead312ac283036b86f028729634038eb8b3354645435c1b5833c405e42c59061c31686b8c806251a685c4849c2589d41809254599ae119244c459920c38e2125b634464880e056b86e804394b5e81233ed91aa3202146265823c40891b3e41870c426b6c6882827caf4909c20ce92473862125b6314444794e9213a909c25c58023d66c8d11d24e94693c6427be445c6364e42c3904476cb23546464376e008d60cd9115f2266c5a923b67cf2983ad8e70eec591e71232e8b7c01fb1ce490b3fc08145186d4d130fe3f128814923df287844519fa8d5b7146ca28248fa396a72b75541712c9cd2aed4e95004ead922e3fe22cefc8431d2d832b6a187f1309123e82a7d481b9972e49724bd48ad8e2540811138b12791884fe00b114880e15b50c9a8408e37409d87f7245d427bef87396c2ec106570efda4ecbe0eed57e105ffc77565fd3e2b777f133dcc5caf71e681b97501e0a2504b2788e72a1581059f455417cae319f376c2d1057f398edf6f0d15995087bd953bafab65bffbd2fab41becd467c1222ea57fde7ba6d26dcd049e82474122ab9bccb8b8b7df1e2e2c3bf70f91717181717985fb9c0c0fc4b0569605e6e5eb9b8bcf0e15fb8b8b8b8b864200949b671442697133a09791d27d471608d2ccb3ecbb21aa406a9433f7cae433fd4203fd84ab46d5c298234d7c524cb5eb6ed65cb4c4cb22c7399e1fb873d7cf41ebe871eb6a7281c0a00bee5bdfeb890130a334e88e384b67b637aeee9cda6a74ff2752d791290a6366e90867befc47e37b1eaa8a44c74d6a920758a462000004000e313002020140c088482d1784028d5b4157b14800f95b6586c5416c8498c21648821060000000000000000200104f460c46872819068fb6fb014a2e054049f1f162263687278b85cce911378f2dfa186da6b2b993ea85df4e74426e3e4a37cae4204f75f5ba18779dc15274e84a8f7461c05721b750590f9d5a7bd2cc88f149f615cc1f39980944fb383a1865f687206286a0ea4d8a5709d278f19402a806c70f4f692a553d0e41858b35a111a98361a118715141ca9ff97de202817a0bf1afd9bc598da55f5babbfb8b4740841c3edadf5eeae85bd7e30f48b7b65e18d50d43720998ac61b7076f47d46824c15250101a93418197746f997721eca8c98c6eca21a94cb2c3c641e2bd5c331ee82b105f59bf6e2ee18be4d96b4cc88fbabb43956ffa46e220a98a74829c7e83e87c5c5de7d62eb475510acceb5f06e195e11623ef8c685ab146571046bdfc3dd79bdf6e70359f99778ea1ea08ff372a0f0ae857f9d6c942d86e4d2eef542d770679d28c27a341edebd374aba33caeb998308b419b4b1e840f0ad6b690cac2b09b8e0267b9be78673e2840e760cfb9463814dadf31f66ce7e23e6dbbbbaa9388c8f76f59342468d0589cd39af9fbbb9f71bbc7cb788737cc3f090e84d484c05330e48694e1d90768cd141354a957c44321699543e8b2d41038b6e77c56e35ddd9f86579ef881464350da4eed3a4468428be72bf71d50bbc637b389d072f503a3a085cf0d15bced70881d4682d844fe4dd345b65c30f2257b0bbed39620db0a1d72485ae9d7156d7b0e1eaf82d0e426ec1167e5414f9d56b6bdb186da31b625f78b366a9840cacb4802f8842778bd9a5bda2340a45af16006805b23bdf35fbae15866b76050e7ed3c0f1ad2280ffa90eb63e7275ad5be97981cfd1d6a018bc3e7fc84e6928064887a92140b4c9ebce13cca2ed0c46102a3775942adab86ded59ac24d8805e2db8f0be1720b25b7057a782cea0c3882d84bdc3275be4b22c746eae010c919a965e8fb3432795fe3b59be78e08ac60ca7bb5099e792e9a02fad0249a37ef5c3b313a29068162d9b1074338c5c1778a26547da7000bc937ccb08a8ff5ece398484a5509cf201c73c26c754a86b38010d7f02d66e13a50647ee197b15e85f50e45e8eb0314c1b01ef6f5018d0d47e8298dbfc183ff9635b0af335ef6d924250833b775f2301f8ca0d17fad3cf9baddd4dc9bcb1253a56633cc85c61a311d036f806f46a97767320c207d48c7a8c3d7072ccb04c178c41fd416abff03d102de92cd528b53666c928c21e77c788a613a266fb2180ece0126da66d01de0008cd2da33f17c19199b1f129ad35f6a9480be599543f654823261d8ba03d06ddef7e83a797d3dfdcaa7365f03c5d22f0d271b258d5fa42619a0a409663e2e2708d10035451004d310d0dd3bdc8f2ecdd9d7ecac3e625d1fe010a19db6e9adfa1082950e8459cb30c8b95e9402d5bfa584beb19da3897142f898c1cfd56719dee6acfff273a769bf5febb9fcec94ebe94cfbf11d8f7c47bf9aafffb8e37a3bd6f6f14f77dcfdfd6afaf695479ececeddd9baee1e303e5abdf15e9cb9ed8cfddcb2b3fdcf07a6eb037cecd3d7a2d669f6ebfe8fcc0fadcac5a5e576a96609ae35d62e9dea8d9d1c1b422a1c52625c23ae2d81657408a7ad221d18c8e922f868e251b66a7853ee94fb130886640ca2e19b7c4a3bc4c5a418ef638f5195c34f9fa38996ff48c2dfb1a3344535b836568b008569268e71d375c60cc1fdd549b6c59bce12599f7a85cc1d8e99c69e1c2906ec135b1e5a0d6c387dec8e609d1068f112d9d89be69c4519865b0cfe5aa89d86ea390e0b238b7a23ea16311520adb9199d702b8831e7218af537177b01af6df21e0a16b2f9c8ffad2e5f226b3031c026cd0f3ec64deebf940cdc3466898a7200573f5941942965631fe8b5ff8513a67c60b996c10bc88f9ee8bf76c63e4656cd0e64295f6ea3caa0f77e178e68becd7089cbaec9e9a1ad3c64fa822db59194e420cf61583e48646124a288ccb08cb324762c601c871c1ef566a247c864b34e7ce5bc901c9f2d16ff8ccce16e861dc9d20e539ab6f36bf470807b3e36877b6c5d229b9f88a31b608cd1611a991ff9a463f347a6fcf66304a77f9b8c494e078a004e87706f32c8065720c4a5160f3b5871ad15544824284c23bf139ab9f267b1e9081f8444450274f9c524f86726198280dfd1114b9368119606e6c25bdd08df1f65d81e93f6fb30a022ab1a9b9a37102e0bc1a1c9066b893db225cd08e34d9a4ca124016880b27d58db7309667e33025f6b3a7cd2e808650c8c0f6242196000f02f3144e1f5eea6b49304a5c8880e912dd0dc52adaeffb6df53b046ec50d485e9b543ce416e1ad2420b21e15f3ff573714ce7bb55cafa0ec786a24844db8146e7f3faea35b3c461eca8169a6bab198a158e86f6577053325da1dc93b627bd088ffbaa655ea1f8d27e9b587ad5a58337a7d32f810ba01a0bdddc5bde3b9b956c52feafd2ae2466ec9b3dc03c11ccca6924ec62e66d5b906a31dff1f463e420c55cb0fbbf0ee92ecec8081252e0b4df5c94304958dc97bbc98b253e9e6066759f2001d71924e01a02d9d9a5ad6e9b3ca8899742810124e028c7caef4f13fcc108751802db507ff4e0080e13cd7443bd43cc5ef6e59bbf77b29b8ed47222c4cf2ffb251981284ce13d8dc24ec614c99fe2ce9fc0c3c5e94bc2249e10d5372bb34599dc5ab37b5a2a8b244967772b96a600f92242d79f5b6a9f094e185e3f3fd33469ee42eb1615af16ab09d03d5c33ff1509f0b8b6b1f6ef25b00c3fdc8da24f964ecc96f881614417ea8a04b816887739d70cf0daec62f91fa232309286de643717dfb97824485251fa03acd53175d43bb0fc9523c3e258d5c57d0c22be5cae37b0e7b7aa65269e34596540324f9ba92f1e189c4ea0d25b4a0185de8bd8130a76753318a502481922c38c2478d224d293f08a888ed08a0478e6b52276cb962b0f6a4885d762f34a29b2b5bd72870a41ba1a8721a4962de9969db5c390e76d11f13c883287dbd33e81143cfeb0bedb50d73d98413bc712fdaa0421c29f888709bbb61f9a281a10a7e4bd3aed1f41a7b2b830e90950bf129ddc3aa0bf52e85db0ad808afd30388bf6c38bf6e67411518964e91f7320c58b08f36d19b4f63d6efb275e1a10e40dd2f0a6bd23872bd96a5e07f514fcf341c77d3074c2306fbf7ff2f4c4a99b9981d96006f7365281042cb676729d0c87e722ff4494861a11f43d5a57efbbb66d768126986fc6fbefc28e71a5db4016c4a3563ce4fbcf637d4a676a49aa8efe39ab0d80d1d30d05930d195656ee16101190ad5679b8ea36e3c9c58b2433a047cc8f4438359226aecdff3e0cc34f470bb125245d7f170391cc6d91d28b20133a85f810cad9bb237cb0183380667a7baee6a4e6bb2ad7505d240b2664a324ba971f7d728c2cd0a59120c757ff77bf6947c5021c043b32d009103cd9fe08f8d450755e8689c8c76dd53314bc9db0250e001d3782c695385360e1b952c03270c592b21c07866897c621dacc3a93199bd972570adb4b5b5ccd932a04008ba834b9f8b0f3531587bab6ed38511b032ce751fa76c9c6337a2558c2343612264d4ea86e5ed2007111dabd7d5cfc8871f8ea34b5eb2d10e8f16160f23ba6a290eb0972c686109a78d1159e44bec103f8a655b8e072e12d3030fe42140ad06a95de05960099859de4392a93949768150ba0586882977f7786f5e0639696ca14775e3b33327913c5b791ea328714714f68a904e1b4777784998fde18733b3e13824d9cbd05eaac48693421c06906ba7040554854b199dc9a29dda915024db2106d0f8263c23414bc938d4ab20bc431eee3bd730bf2bc4fdb90b8ad4f272aa4adbd163c761f6618254d4731ecdade6c90b06578be6fc2dd10c72ff014ee05460e0f4037e90368977887e0b4642a2685fb14c032fa965d9ff3aba061234edecc075af22b3e4e649e9a2304d3e45df43be9cbab5fec933ecb60434c00c30d7a16fbf00a0b4ee0e5ca0f2701dbda4c14e9ab8e499f01c1985bf0403154e6f830cdeb813359a487a99ef4592530e78f2a73f63cf831fafedd68406711aa44e583522ac39846ed6178ec7e9eb1fe940702c263ba26ee2b776e0d058d19ee228fed785ce0d9802f477847cd32ffd089316eadb3cec49dd8480163271d3c39bf5989c5878ccafccdd4fcca7d6a0137ca322d21e5df8cd287ac3149e04630cf7481c85c934289114c40c9af53c91d7bcc47af2669aacd0f03b42bb3b9424983c5ed3157aa6a17609265c6627e284db9b921acdea9198498f555e9fdbc4432dfdf02064c62246b72d2ad550d99c7e81a74f985e75dfbbdd87dcadc50e6556e4d95745147572aacec2f023461c9c079b05512a694c7da6607491420a9e32b2a84352ad47196db24493e1e30da60a65ee1e9bebbf14e6e5d9a6d067e5120bb7c576c5eb7233b4edb536c2890afe5a626f84c7218e40ddb88bbb1033f4f855f59bba8f4bbe083ec55f75083ca094d5623a31bd907c6e52fabc23ae6ac23348caa261e7369c6cb6f0978c95d889b9b9dd0d4dd579393d7e7de64900576b1ef067596b39e5aa3bcd044db55a65d460d6696442eac2ca7e7c21bdcd119a63435e0dd67670d5b29d0c030e5a2a0e1f8aacfd7039ada0d4c95f2c2c438d2ebf6103d1a72c57d07e444b6e2e50b966c6137e7bb64b0a56a6bf3a8d9648f075842c96e4c72779f684f75fe3aa1f92e445eff174d22cb9695127502bd357f664e4545e1539aa8dff3d6d733bcdfb61bcb87337bdc52fa4d67d13db896bb8d9c59b5a44a0ad1a473898fccedd2848dfb4968a888b2c15bd5aac31d0e25b6ae4c5a554b22f0279a6f49cdb326df74335e35e01513892a1731de4b4b261c276cad33530d5afb7f196ec764b28fa0eda44d417186d50fb49df168cde17cddae510deff6d699fade450e6802020ecf74a6dc7ca80427c8db9093a7b631126408d18bba8b0578e9b1984bf670a2410308b4b5c0113ebbb355af089e3c4ace2b6aac26a0a6a5746a83c05a10314cf364da8830d2fb95664a4258d5fe56ffeb7ba9670667549ba7264f0eb80048f6ca595ac562bb619fe502919f94caf5126713779226ba2b50342c305a30904406f6c89f258921c65befdf34d08de183bf4c398b3cb7580745a6681d72a3b4347f6696aed683129cb3f825b3b74fc37fa6b4875e3a0a9103e78504d45d73809160b10003c45828611d3539174b454058ca45b3ae1157484f87902822c2b3c4f8b241c3fde45df3b12e164dc56b629f0a380ee1befbc709a56dbb3a046eba6ef14f297894ae5e79cf00d1cee9ffd135e189405d2ba7489fd602e95404819ea2c6e84611927d5e1a29e4f8152a1386a0a6ac69cd88454b2cdc88e10a7e4f2371852fe5eb3cff1161536304235d0020af05d83439e6e51a3bedc68a5cc77b9550be1a8ba5049a1e73c1db7ad50f50d8c42b570d99b5f1f02dca35e7adf5ca4cba5fcb8a6ddc9a7ca4789935c0d358f18f34f931d2891d1d2c73212032eaa8cbc59ee426f4b9a6da387d45f4a1723f3ba11bd8d67c79333589682409b4517f560784ca548a50bd0a4cca4725b1a3883da59d4e7548be69bfb8f90b1b9864e08c98b8222095bcac3b0f1173332f3668e440df34a46a3ae3cfc2025080c4db1a2b93abdd090dd090c5d2bf3597df4fa8ffc53b5af38858fc15f5f4724310c14478b1adc7672933e629b13e5073ace50db7593692bbb00146fd81995dc871984eb4a9d1a803b0ae86509c750838f4a58c10a74b56c2e41a87743faeee805927157203e57ea18cb8b20869f34ecc8c9678e2cec1306ab9c93a5ea85f2a6213e418d5f30ed44cf0d01e0687179e17f284bce67320e0d570e8a52fac1088e1e0bbed82ad0c51b6fbce8a45ec14a2bc7382c26d24a470f6d0967160960a3f5789b7cd39c374793d641b9002e5befcb156b6c7a8c12d6f0f54d180119958e55bb10d3c2b5924cd64105779488bf4d31f9459945ba24771d3c489c880891deb09509a6a100ec0c4ce9e177c9be68f1c0188841bd91843169c2d6a39f11d03c841ea0f759411578cd3eb0aaee20d38237f418f482b118ae3c6ac6d3067ab54e1437301f4a8e33752c739f01622690c1ec42033af397077007a0c5d1ba11cbfe5e57a2877011b381859e148d4b6bbb093f56d58d0d351416e5f497a74fabd868cc5be43449371ce51ef21a184e50c5258d48a675636d1d48a104de6fd54e347b410fd63077de3e218ce95e50ab057c0bdfa22af7c488ebbacaaf82b88f364848c0b408677529cba46375fdce99619a7688ba9b9e62d96cb65291d3f793b51a033a9a7fb6eda772d83effca113fff76841efd9ffcbf01a03522ea9d82b8798e6583f2188c290bd7fa962ecf8e57b323c5cfd4ac63ca4255746b8843ea26f6772bb287efbd7641430063016b89fd48da5a9727ab8caa58b0e83263d3f87c9ea7ceb09cae5826b20967d9dc26c819883592411b5261e78d4756b4da7a4b7e5f10a407dbb704ae122c379e4e1d3e129954f6273b04d7209f765ef3c8bc44a009456e1da98bea4c4555f3889b94f48931340207c695bbdec93ab23179d218b5e9c264d846a48a21b5279262f832d78f382bd057dfd21ab5a7929bc460ebc34cab4ddcc5c2f43efb8025d01da84dea6a64a273b0f5a05fc63ce863f63ad3cb775f54d7ec60088c0bb107f9dbfc5f63b2a1580c94ab659830f9b7cbdef3716317fdfd31365f051935eb75f6df21133037c548138e87943dd9e4d60f2d13b237f54e13868ceab7401d576661b41ea2c749f9f969a3f7c1472a3318254752650ee1e2d54b2525f7e31e6e3d803d6ab0700037a3a22effab36131d420d64821052dec3460ee22af46041ffc0fe22cabcc54c55157b3090d16a4b949b29761d565d7774b85584d881425e026e1c8166ca6c914842745fb61ae454246adb1679162742fc207104b2203a44722f83d7fd0624e9ab68592c54fe1ab3e2550faba52c8d2676a4da0044bb8935cf66ecb5a7d67597e41f2a6a56f336a674813a3f10eb49f03a74ae35d24ffd2e927c150751f8b4b001ee514ab37a73d5c2d6121338cf4772aa3d8ea17798a68911dd5dbbb527f0927cee515c335f3a52ea166a344a582a25c29d6de08808043e48dc362ff952b3dbe0271943ad769fc771f290c5ca4d2352b770f62e8ddb33d368305b1d16633d0954ab26729839271fde816c70b00d8e89c4b213b403bfe4febb0bee3755bb600bafc96cb30be38cacd1cc1e21afb6385064787b34ecb8a65b5206c920b103a1b0ff8c9a129547f4ff42b5237141a7190816e3acb039d7f47848af536f81c6bf5dc2dffd986220563ea9138fecd89c31bb1073a4ef4d027e1336f28232dc882f17fa84bc7b60017f0456eaa07386c73dca970ce14547792405ce9987296024e74bbcd4b78052137518b5b66991bcbe942a176e035bc4f895eefbeb760e2489c4e5cd9df1a9470f4661865418480277e4d173bc81a9791c77973c880f2214e6f51e8d829f42a80cc78e07ce960d0ac107e39fc2947ec1e553c2be533939f845b59703e44dbb418664b84ed40a2878761ea0419694b0786c9b7bcae52136325fd50215c0f37c3bd457641176bc4e35898a745fbbcb8ac13a17a3246b69806cb5d8d16d59096f6bae9935679dfd99478a5a1fdb4e51d78d2757cab4c9ad339fe57d0010588940350d5c1ca8dcd25cf1683f2fa3c83c48cf1646784581455f1c2574fd1801d61a1f8cbbff4edd5aee8eb66cb7764c5bdc288873bb775f85e4430bae20948427c68e7007f05a6051f193f3b5e6b20ba707896129394cbb0680ec89f9a83530d088b667b48f4019495b3a1ed1d1e2e36afd2ca5bc566b82a7e870b15dd2ce3950cafe66979de9e350b3a2b3cb8cb5a592d09f8fbce70fc87ffcc4b98c8074f98a144446eb624ec08673d20e5aeae06561979fbb03e0fde258179550b2feca19121463368a189b26a0a8d4a90a3ac3369935f112b96034a2e1e348db99f715796a836cdc16ab15dcc61919ea3d8a9a565a7312785c0753b6f93eae7485d941b78d5d398465657f093b6312887751a95b05f0a5a3f1c4b36ac7e608a7ec7b2db00b5dfa074db3e65aebd4ec15c9b127aacd1d2c056a37a3a49a7d507261e1d4a2ff12bfc7dc780e0684f483bb816a437d1aa8f7c071f91d0843a9e22614066ad3a3be35b363ec017a48065349157ba89a0ca852b3a1be935df537a948867cf4ec139d328909769a42fd6b77f9293b597ac5eb25476404d66dde8d232325abe144514643a8533106f9156fcdf08859a36979da32a8c1001808f07407017875abff2f0280ac1288a98340ce584b844a323af3c835ecb91bcd17624e213e4d9ecc5d5cd4d8759e9be297702feea6fb7a70afdebe3e2483cbafa60bbd066fbe69059199ef0ac3b47573b4505d8ee83169060cfd431a7959380e228eab0a84aea3ba709e79f9f312711519874e5fbbe30da9ffb9db33994ad076ab37d4b6bac93c0e259a7f8f163fddcb219fd91079a08f31fdc2d83f704332358b8b84784ed604bb4fe5f0cfb582eec629ac316d6cc030c552d752f26792f6b79532a2261ac43f11596c17e9f8427122b406d7c0aee043c04e2361e434cb0ec75df23aa13b0a3398308f1458d06b585010b9b407e7cfec5616eb83226c815cc7e91b5f31dd09e4640bd715ad43010a744270987d42a710cf476d872a7b11095bb80605c1c100e6b9ea23c0052b8c0b746a914f8634f04e9c51932f078c2bc1b81c478698650472ecaf7165c172c8af5b22e8dc53a69969bf1e8c8e1ee804579a81963fdfb80ee0eae0842f9316853d5a0d312bc084240b4b6fe5381336dba0a0d7f5ac721a8e3edecc0af5f2b6567b553973186dd56db37ed93e2437958781640a87cbb9791da6a59efa6824b54821d88443bf4c634ada9a081e92c5a5cce0c8fd48f1b57dc64437b10651151393f6542e369aa21455c02aa406d133591cad37eb9f2c6f45478ac7b51e50d464881b630316de6554f68c2b7d85cdad1ba2bf2ce7469df4b93f678e9a79db6bb22a3755be4dc69d2be3f3dedf88ecf6a74ee14590f3dd09bbdc157be5423b2187457e43b74811eecc8ee8679110af3f9c5700b34fb30792a8198455a41bf8722e8bd1dcd22c1dbc8fc3a1aaed60f01b2bc1dd1b21ffa8f1ebceb22ebb09bd446bfc700f26629d1d75a8bc1ff5aca810e9b27447724390585380df8114a640f793c4a6cae760d669fe40ae6dacd440e30b6da39ba5cd7a3f8f2173eebb7652f3dcf635a944ac784d890d6c57bb384669b5e6b9ad8f85737b11693e3466407b4d74ad96d82bdc64f67d6a151225aa8b081b906391ee6484605fa0e22f0041b958f98ad3e2664b787424e1fbcedcda13c85b7176f3c35ff8ab70731fc563feb507e1e5c1e58c04a530d5b6ba105e93a3754e19dfcea3ff05b26f4e313f5cbf6b329f766e19da886c272fb10103b5141ae32064f294b43d2ef511ebf743f31fb72cb5f83899572da03a4213845ae1d698bb12993b13238e3e5ab6447e218e2b519fda439ed422d47a018d1e08600de708e8ca6ac025dece0efd00c1448829f430ecc1ae73cf618b71fd77af26032d2bd34559b766a8a75728a6fc9eff073dfefa312b2213465f5125a5c811d231a4050ec4b92a88a7d13aee1c55925543afb7013c87fe113f62df3dfd3ad55665cc7d7673e7942709b8886cce99511c4166c9c70f4ae115c5582d72036ba2f23cb5108989185dd4b1678ed6567e1f88aa675d81c8006409baeae83c74b78e5d979fdd94a1056962ef902a96ad01a2fee8bff536d00d7cfd0c2da43b80734e23da1b6de8a41b7ef1de41b1c83b6d9e4fd4bfefe417600618502cc08f5c7825cd7f3e643c912104c661ad4e324e8a830a21d2dacd8c1702f29bced42801b890646b9cf295748be06c237b217750c28d544b4028351f0e6799fe9d93d14e312c4eaacc20e3a9577e9601d8add855ad3aed89b689b6ee9c88fb13e1f71e8f462f319e69e8edb2304bbe7ef99fef4664324779fea3dff8ae800b1b76ed85a5d9a640ee9d0f5a60b4d630e1ea2ff85345f2783f429ca75a1397be895902d7474b28b8f8edd587fa63474041a9116b20e58110408c6a3c3c570efc7391d50d8bd667e723862722e30a2762c5dc195b2d7eaf3eb4fe25fe2908e691d6caa709da68de605256916a9ea564e756d9efbaf57ec5d93ca7eb15dd56909ec77bd4379fd520121bd67af33f60bc4dd6f2cb68bfe9a767a6658b0c687b2c3da424cf3426c8525c92832199cea25fe937a3f4b9470c7df40b6265f733ecaa1e23db0ca778e2f80ca76af2cc4a55f4ac232e2d00797111760455d066c283f60a5b3d1eb73e968b0c7f166bcd1c14dad2e5fff53e196ec4849650a62a6fe21db8f5b47d27c850c5df383fbb5f6b76fa56256e9fa1e5b5c0acc46c99109061f732254c666ed72a5b9332f271e0984dc4a4084145ef8f9ec2008865f214943aeafe356cd7fdfb65552ac85dc6781c2eb6c04edfc183a3956157710a5972d2a0e2a9335d6b5ef9a70717554549aaa08b19285784f31178b1e14ac2832005338fc2c36785c1545d5ec5d6b591b665589df800239f0febcca26b9aa8c860bf36257a2428fbe1fce376db1104d6d985adb1cc9172405cf79cb100de842206859a8abb01f3e104d969e6cc5922d309eac40f612e43dec7763c5ceef49c1d62b3f12ef228f1c0ce381a042f0f0a7e08197c8724eaf1e1dd3825e51941b17d8d07d74a6168679f47c26ef22e4c59219a777393887e459e177342d63004cd71f7167c652d110b485ea73e1d21708f97b3c88470e61096886e1f309da2cf661b631690c19f1a5f0012bab3a1db1dc9ee84500c9288f48bef51b0afa5182759369cd67fff3eea19637b3e52401a980b98241cfd8dd6a94e462069c75f2bceb51853fdb2cb2e2f19cb7144d357916da444a91604653608a0e2476dd0b44c18e5af602765b5f90e201431f709a395796c6464f1a53058146a830966320e7a40942fd34d12dc066f965830d10b8af62672695cdc6e05ed21d1bf70d515b24d16c36730d03ad095b20847092e646908c1969127d2b574a9f67cfd83af170e964eecbc7fd907c27cd87c1c933be80544f6edd3a64363abe0411dd1ab7028d5bd0bc5c5b7ff1eff2373e7237085c9e77c4472c2d9e5ba98032cf4dba063a20f6687d4d8da9036a0cc0690ee4feed3ca5fb33060a1b7026b7cc67ba55a2da776eaa1254b5206bd2f0def408f4437646a9cad2da6494c6b81755c19d7b2d1c27c151d9d0041d9c9e58474ec4555e99e3c5aa221f81db4cf8b1ca09cf963ef0958a119c232cbaee0dc0392c807051a40d96b6cc59333ade1baf6dd991aab3285e8a5620cd1049634f8968f471cea2a3e4105508d934b82002e01c3f1685122404d2bc6e5c5ea7bdf3a9fcdfe7ff32bb8de268e5ab33a696c6fcdba17d6f61ea61498d6be287fe10311a87f0f1ff6a19575c110827c4d8749015ef0d6023c08d741ce148f1f41678772a20b2fa378c1ef76ebbe620d819338d49f3720fa81eac90cae260a2ac259e30afb44ccb9f9f41b3332b2a76387a219b6bf74ab3f442159f06f773810eb4b4393b88203668fe868ea22df2612c0a0ee0a98204e02d084590bb933216817dda6a16c105fbd744308a5a34b0dc330b1729c60797c37d6f7608fae3663eec1678ffca433365728e161afb813b21f6de49edb17ec449b5c50b60e4c3fd344d5ef3f656b95438eaf6f771f202082381ada3eb3ca272aa78c967c5713498f85861756ba8763b259ca113558a5a084a277b824cb3e0c766e78dc49b7b0f3d625083277f560e5bd3cdb839acba6c917d749189071c798874f568a5b45158f5fa6546de1230fdad800b37d2f1e47f38dfec2e06bd2621d6db76af36f8d0af4a9ed1bab0b0271aae5aba12a869480edccbbe9d6c7178831db1e0f4bd6ce79a20599264dec297ceeaf6a74929ae7490f9c9262cc1fde481b8f40dd17428ca80679e7effa6a9fca904f490968ebf40ef25659c8b6d25610178e428326405b49fc4e59a9f26824c71031c9dd70538e5d32fe6495b61c923ed3ee48ffe907100741de9556edd94417f4ff02459fb5bb63c1bcf11b86617019e5d4a2f8992784d91874656de1fc463e0ed4377d39decd6ea3cb9012d6b8c53c328c0f3fc5b200f4fe2258136f64445c3c1037a4d5a46aa9aa208fd5c5aeb99f183379f1156c10a50510864a76113ebbebd74c14d55aabc53ff3f81f72b18bd02ddca2acaa4583460ff5253573466ec4e59f144a4f13a3def5831e8935ac4893f18a581b0dc3f3a17f427796021fee28cf972158ed8e039aa2f21b5ce7f91d681b5181fa431964b25b0d7fea64e8217d5db3ebfdc9beadb825e5cc73fed692f16a1c4be6eef598365552f44074b70e7d59fc3c697964f0c00549ded7a99417ddd03430b95f3f6af88e1c0cf1d501bb0eddd6f9016aec2c95da968dfb38838376f96c3cae8b0206707a70741bda6ecac4f4ce1ef8e90a6a85ea5885a3e5e78a287065cff6160e1853263ddf5f22bf905f3959391ef2ded811518346e38a74f2a54b96d398b00beb0bd0a71c795a8d1075383a29662c6f09e70cb4211a9c152e6b46adeee0e1b2fccafced37b93238eb09b7ae137b625f0a96e6bbe0933968282a3795418e44f8276918cd9f09b089187dcbc98cc14b63d097a813d87708f873b156fcbf25c1dc93f3d05022ddd2bd941979f365e9317636210e28be3e3bbf153c0a54722c5a4c613bd67212fe6ffef41621a2d8fc51c105a398c4e76deea0e08947b108a0f148bbc267815a596bcb402dccc00586a812115f4cc7e53d274274aeabdabc98c10549af03641febbc5e35ee7a10c8682aeeef3890ff9c85cc3230f35af005a6215b1a3b8542bee5169e07376f7aa7893766cd7b6bf0bf73cbbee7d12b3d1f2a3c3fd17f3611bf1ff45b3c3a44315a782f036ba7d17d02129f7291cb3d964e0706dcaf6c4836f311654bbf0fc15cc2a9ebc11e572623fd1a00e923c40000b4b0cb1b7f5d5114e0a0c43599efebbf807997b371b8ada562570a02fc228e978abc5423c427c8573d0de878f893790b2d575cb9a4913a09e575e0231e3507591f39140528ca7d0a161f74ab6193a6f54ea77a3135a63bdbecdb2bc470fdabd0fb5c3b4ba14d0601b4c83f8be2481f02935bbfba0671d30050b6fdddde111b1119f381e009cc18cb6415f3a335806d3003c078d29453b1cc277edf433b28d5baa0a9b11e2b82c27106d12b8d73e0899cea9e95520e0f3cf47912b904ab0263f128e22134ca6950c64eb576697f48a6929054b655db73ade2633f42724d8b82964441fb407a02c91533ea143e0b7e5b625d57719f7a05a63f9385b1cf0fb542bfd82768ec91bfa17d38365b759dab0417432d4d0d1463dd20dde87b9798550a45efab020bd8e024ea930bec54af917c2a58debb550bfbde25fe27ff50038085fbeb824fe2c3b98bb3f435b2620d7c8330d3f482f6bde797dabc00088f539db9ae4e1b71321558254396a01fa7ee4131746fd6d45fb18fe8eb5f25cb6290426e608565b4214c61bf6b386d77bbc814fa25c862deb05af83800c3934933015370b667c619d40679510bb39bbf08e9684d468eec8737e4b84b4a25b7270e5972a96f28a9f959a8504d96d7cdf6cc1c56b818228dff569dfe475e5cc51bd7a274fc98d89c8ff38b25bcf94696346d109d2fd85c1988afca18b78bbc4b654db04f85d8fc2b94f789612b5e63978e2b5097ec54cafe64c7457af4e1ea5003153cac7c73aa07a6a00b7736b3edc39047ef3ee035227ecfdf76de5c5005e91b5447f6fcbda61ed63ec0fff16388cc6d0e43aa207edf08b77efc77ae37364f5536c1b4a7410e605ba6e5c79877007bcbe1f2665d1e4493a89c6674c3dd4d26620cdf27cff00850513288cea85d2df64a130c881fca2c0732da7dfef0acf557bcb7275a880de24fd699a430f757b69228fb1f3575712fcdf1fd2e9abfc6ff78a56b116149a7447503f49967774004b20f0d1cb6132021e3ba57aa1c3ab4637ea920b95b348842e18087d20bed6d6839c2c7babbd746c123d61ca68eedbee9d04ed638e2e22f15ef93a0027168fbbeb1fd81867f59e6f017e78c91f81c2fbfa7d9be2c255c05c947c0672cdc1f51e8c1f00519d1dc3e1368ae5dd0048bb01cbcec8ee65ed06959fa65fafb53f00d8c60d593d4f9272164a9983bc6666b929ae27e7d8b92aa4aa47bdcdc726633a41e84c6bd89042db7f89337156586b0c2ff1a58ff73378a0ea8b6d1cb27022596bb7372080fb3b7f69cfe4f49534825ed6ad2b11bb5b5e1cbbc072450a8094d27581a52aa90eba59329a69d4efebacd26d6c32d7d5c241937b3192fe97205188e2a2cf1676edc4c5708d70058b356f696be5a75c9317240444667480caf581f9ea0b4a1e8c4d1357237c82a8c0355209ec6891979d5611d112042c01b5df984564b938937992e47d6cd9cad500b62b8d986d4b22614feb93635708513c2fcbbccc784c8558e3b1ed10c7370ea4edfb15b65fd171c2a6f44e6ae4b66d3a839fe70f60290568fc05704ca2fbd164967415b46342fed39814c3dbc862726ae6486e53c56324e91625143b5e8b4917dc1243bea9f6cbc55c4a5aeab5b4946e261905a20ea7012a966dbcc75fbf510fbb3f3d98d21a058b7429400ddf823324db2c9cc89ec9f33b3a0650e7b63c9583860e02adeb410001dbaf4f19f06113a145bb7070365abcb8a5f32be2775781adb00e6de5109c30140fea98fba4db3a598c5d30f7d468f37a3ff53c20244fad4b53c35862241e9cdf94e41f51f88040554e69a9921451a0518c4dde47389d568857da31d397b0cfaada243d426499d9e7865e4e6a584531b1a52c9ded76877491183aed3c18bc1624e3375725e9887f759f3c2e97ec2f66c9dc501579fd4c3bc5901f0ab413331d40bbe8bfe4f5c8a56186efc1f9b1d9026c9518d68e910d37a79c9c14651a72ea99b25aa760424a1c8ee6563c835e040c1ec4a212a0acee487e2957608908b50d3c68b05aff03ff9af80cc4609a8294dd753796e2b01f585afd4ee377f0579eead7d6fda9dc1b1236881160461e91b13157e337e6e38867ff269b4984696837dcff8ba2b5470939863763380df4374399f536b3c00abc4abcb7826ebe6280af46eb36854be82390abd82bb02a0846c52b5f8ef9a806775d9b08dd7b372e2d8b7181286f766a4846b5ec143e3feab20928e947bd542f32bdaaa1e92917aa5b15661b185efc80592b4ff0816e9c17d88db04b94be99ee3eec92c7299ae979485a3dccda4b26032abe06aff8c45d4595bcd9c2131c6356e96891dee38ad7e67c71f32e9b1cc93a195354a334245d5f1385bffc29a52598dcab17dafd28914a4b342985d4d9b1ccd0fbcbe23a502708ab19095af549d86eae13df2de0a7176ab8c39c319d52054f0e4bb58ab600598159ee25ab7075262ee755cf8946fa3a90f21ac6b5a0a9ed56213a34d4823f10dc5f16b6fce1dcbe136779ad55b28c6550f74b28e1f630218748a98072b80745ad0fe60afd28e275e27304fc8a3f0d2daa9dbe028744096847093f754b2221646ba6d6886080b64cf59afca172fb41a450395d25eefddc2fdce38188ae5a3969b5fbea39ffdd40328502b1ff83e1b9fb8f4fcbd3eab72fea5aaf9486e9f5889bbe16388ca3a8e274e5ceab096311d581e12b4e0bcdad581da26687a9207226350525552c58bba53c3c500caf32f46d609a08c2d73ef279aaa21c78d6549c1985a8a6179ea38c2836d842649df07ca19afd97dcacf201dbdbd068c40ed5fc83a228d8fc409291ab98e7e7b7ac6211baffe7e2124f05ad44dad7c34b72d175e3d4ddfe473d1b3c6eb45ead97835653a25901fda18fc11f964a6074da57a11389dc0572ad26241d797e8eb05728b1a9719c27aefccb23d04b62806227aa463b6969c9405d6d27c53de323fecbe4e317a60eed228b23df6ea024a70aeb69ea6299d2c7419ec370793a70ec82866303ed037a789124d41a5d9b007f0974dd0a201c26c773aba1a9c7620bdd97cd6b9253f62549281180c771343c6be84b61d9766a2a5cf948273793c92a66d4315699bcfec4cb1b2e8febb3eff7bb3d87bd900d905902276e07a8b6d2f263bbc73ad363cc26f02b5c123e89e36718fcb4f97c3e651044335ddcf930893e6a89d07e8bc6a3c5365eef94d7312f1903ca07ca25460db077eb1cdfa94e92101aa452c2fd91cbe00f7072211bf7f14d3d8c5bf158dc6359e2ed3ff754296df335ad437b77f69ee957e8388a9dfcaef6521819667a05cef193d722be7da3b097c039a25079417d48f46ef505080f92c0f949b30d556ea1b4e364e9a03040886f1cd3ac93083175c3b4f60c69ed1269199a2a38dad26b7cd1410cbd4987f1a5093a4d81adc28d7a0cdf34174a6eb008aee2fb49acdbdf41feb53143ed0fbda1d752e22f6012cb86f27afd5d856cf2324187093d0d7e22942ed5ff604c8c9a3aaae0b4ddaf9eed2605ec84b69cc09deed743a773067cad190f8ad374d177b03ce5dcf49a7f250e09967058c880bfbf87ac9f8be96e86b94c6d2caadcb00f163822bb4670e25151468579bf993b7ae809b7f25eb2f06a61bdc8bd500dd928ddd9ed61ff74541d69bf4087a6576363e350130802236fd69bc086cd074614dabfa50b1cd1b209be7344b1f7bde3049a6679f94b2fd20845ffd94be53a36b845cf27f94c42418423f51a71714425eb0e1a6fe17598e90c5f1573c0029c0980c87e16235e013b8e5c79b6975d889189a94b6c852cac62b3a4a3a5d382006accf95430bb9446b78ab00aa77cedf8bd6153afea39eed20144f8d29208b301c8333b168e2edd0f6f5bd970fc9a9607b838e105bb36213321bd14b27abd023eeb67f6d1d6cb1b6ee91d7ea001820bd1b1015ec643ae67d8b8abe338a78f684ce85b8970c18911455826f8dd037a47c0beec90e545c81a0cea9cc733473121f9100e02be782f820357df2896a44952e84aec41b619fef6db6062071576a1e03b326b4e7048552ec85bb04bd71c6945a2912c22d2c50937b47ba914effdc9c8ef9da6ec73d256aa418a1b086e25dbe3da54b5a1b87b446cb83c10cc33f62d3e235440941ae471964090744c6d41f63075a4832fae6f79807a05f8a418a7c34c668ed4cf2153d88d82408b23f9017b380adac112777a02ee9e3077501db5f711597ad0c2a74e56c4753ccfe0e6854fa3eb895ff404afbb500a6456177e57f9c128b00e94aed6892bfafbce99266fd00d5574ff318a58fce725d20e3611c55e55700560a2c0348e78bf8f4afdf2b2e641b6f021841e57a0cc2d8f4dc7e84e8f8f682cb974bb3531c89acc6dbafde2180bfd97cb9348d20f7f13122fac4878f1c63a412f9b85393ff22d02060e19e92c43ec0c709a874cc6c3edbb29a65f5555361a4e3091a55565ebda0df04530c761c3a07115e0a3bc393bfad08d1f65ee131d844f7c112def2725be109681cae451d1e1d6ca02d5430f4fd88f340443fd4102cc1eabc4083fa9eba2c58cbfa986b2a765019856e5af990370e0ce97a48d3970c8b604b54ef17f228ef536b5dd8f470b67f95f77796d332cf2f51f3a94648878d40e6ea43427b55099f20135d3dd307e7c5d150830919ede95a7dc8094cbe9061f6954bc402b7045d626c6e5408227167320204be74193237b7aeb58b4f87c70c56458c2517b0d26c03aa2979be309f4b570fd4213ca4519637abdf4889c33e88ce8f562e885e84b0553f571823404b061dd63d0cb57f27b08ef3ecfe1a3f5d3b7c26260c3ec0568ad06fd35178b03edc4e53e025486d59385025ac57b35a8bef1c56772df8f3e9f008ddd7170c00f5c8adbb79d72ad111462506844f3f752f8f09a6d30be19e880c1cef9ad9116ffbad58323379e848b8610b702a7522a2ec3deac8e4f90833c7337daa562d468894e59076d836c2ae6adb85d69112f206034c86afc7aa317a9747ea1ca45a55a4c701acde724bc2bb17f83a09daaac6c3a1ec2628b96d4484be71bb49e190035158b54f2455ace98cc0d7fe4d6c896a0a95eab2a31162ffc2899b22cef0917fa47ce1cdd42b818eaa3c07e460c2fd6adff034a30914ee5cf9057ffb19ddb4216aab4ceb351de719bc90a0727f7b147383f35d607a207edcabcb2a3759418139644024da7dc0ea5b7ccdcf1e8921241eef853057c4be619861f68709687c9d60c5b96c5e689a9866e66adb6144ccbd7e5193644f03a4ab2da3e011dc3ae0e838f61c340fa0598aa494389f50f7d6be50d998522e9620c35e9ff8986333276ae6c96f34da13b277cc36281d64f647957e66b2d47b35060510a7254460434a5170030fed9dd1e5d156301b88b2aec8616d9f5272503668413872b96c05699aecf7c10b3b1e1361383bf6526f19fb133ddf4269b2ffd267e56330649ffaeb02dbc613c2a927206aae65156ec8c63e38ae5afeac19cd4071b7187e79029a9041da4d033261aee310279f0789e9d1d3b853dc6c5f5d5f8220c05b3f1c69ff38c354cecd536e9bcfb42e32cbbd8dcf80aa7629528eb81eca61176e83b996e6a59d2955710bb4df930925a6b38aa5df31681aad7f28751b160b3736a5e2d5710348a71ee7f7c99cc954869ccc9e090199de40f33cf7ac5e0ad83edb3fff8028f32d92b95cfa5733d090047dc9c5639dc6641b22f7b2c1a2278abe784b9af828e1bdb8bfc6aebe1c8039563330dacca5fa2ceb68455adf8c3a283dfb39bb83c5382fbcd7e23ee1828a95b5d3c984673a5f31f221a14fd51e5282a05a3792580e2f38514d9c95a20258299523ab0e7500c918d22051b61c4d391b394380d77264ff68e23d39b03e225a3dc801e67c144ee842f4dadd92cc4f248de1bb7a9b8a6d7bd71c75f430cd76951f9af6d881e44570f01d0fed9fb5bb96f76fc1eb88f4d5fdcc326ab258e98e7b8cf50e2344f1ae180a0ea926d7ffa29029928e7309a54cc84aa26a89ad0719bd29f77a84228bacfd540dca83928a56c3cd900544b37044f302630077a5a7358e1a6ea6a79b6626b94ffd81c15849b2a18c281bc191f22a8cb04c04f285d29098c6a40d84ada527d6f984b198c5e5c1d9cc40d37bc080057676b784f4da9c8b0a45c9222e2d2c8836dfcd53cdd9582d1d499d35eb6eb289d3f12252953809a91cc273349411e51907405c88b8913d8e385078106b808a1280b868095a1cc5e07dff7c1c46871335aec1c1e9be562e4d959cc0687dd6232587c1698ff299f7be9410d8bf834ad8f99bea3d584e17cf6ef97bffd9ef21793595584698af533f6077a264be88195bd4a1e43a660013a763e6dcb95acd2db384413fdad93f8b47b6d03a3bed994f40df71416e4600c729eff4103d38b37247c141d0347472113189e6242c5cb4ec1d4a68da7c6abdbd17ae7dc4602f68d6868ce6758b90454218fc5e61646a3b2f7d257be009bbe3f18d361d2f2001b709111019f8a79f92bb2dcbe904ba4fe8abbb27f252d4b74fd9e79eb5dfadea924267537ae9b0f26b7832c3f6351a3924b31f8c79686da6d7de7b13c63ec4aac2d55141aef6eb5d66dfc58d81d55325be49d49247699267b87728780293ee2bc20c12d6a01c80d4eb6a3c0ede0ba771fec9a22cd60d73c26be1f3e7f61b4c61d7dcceb7fba2727acc726ad0840b3a1268068b3734bf7ae54db4b3e40c6000bab05a5ef002b1f1284c6350d6075d4f1e8e0b192507fef82e14e2ae250fdf8bd5b6421854d2cdb5cd145e487405d55e5e022e44fea9b8079c58d034d46200fc7a0e29d8678204b08ea016b6f28790bb247873017fe83c88debdca1727ecdf8cf804aca12fb9029df51a4100a64dfcf284978238c96c8439d4980a540503992481bbd0096a092cb648f9c6dc493ef0d381b96e6b80dba4c48ac21d80603fb912654576ecf405c5f12fbbd3c55e9a636b78e58552fb2ca83b9cdbed91882609b4b7f69f185f344de37f2ae614232afe848cb33976e66c9178a20088c54b3bec69840c711950ad2d2073313bcb7e72eeb567f9d1218cc6136f41ba15d91aedbc6a87e0bea6d05cb3f257f2f7c3798b02edbca79d5f5568521682b22c540b29cfd93d8cdc0ac5f8385125fc84972b1afaa7e60671680d54d4dd6bd312c4640c104b488137dbd5e50492961ee3653896c262fd99f94653aa97b050a07ea30a4cbc291983c4bc4974497a63cf7bb4c294812c69206dcbc7ff65c1bdf0a9508177c85f10aee3e5ffb95a7560d18a27ad9d9eebe1990452f2d1ca126a281e55db6d2349fd615f19ec1620d53cbf87c0af5f57729ee95a0923c6b109be9061be4d9bfee05175403028302f4649b6fcd8ac284e0e792bcaeeca7de41bab46f2367084d95007ac243ad25e1be4d5cad7f68ae20b354759f745f6da855060d00d26ccc9efd6d95498e59caacdc725cf533cfdb531f8f6b0a5c8e96a6e118c7995f43c4ea18d41fa7a298c8dd8a2ff01c0f31d2ef32bf3911c5c5522cb80fa2c266bebd2e22c580419228346e3e425f831c60ac9e8b8537f30fe2b5653e0309e9bcd8075c3ec12cb2829a7edfd2d6e3104563903ab60df05b1db8c037449d93c5fbf27d36c0c3d8c2b9510bf89df6680e332a23146431f42b01b1b039b9c0713c89980d28809dec40dec9ee39742aceec481fc5eb52798880bba6afd36eaafd24732afd1d8aafc324ccdf00aeed402044592156a9d712f03d4379e3a8b31a11a38f2647eb9bd16ae7f8d8592703ebcfe1f93142500fbcc85e6e2634e702fe5b6007e7ae554dd88f83af8fb6041ae8b20a681bc9f4a9db78f1ad04ccf60bdc27f83adeaa476cb90d41c842f114ab3708e94ed6450b593a7c0d817739ccdbb5d37282cbc4b3608b66fbb4c0d9e7b2e4106d729cefb4b64a89efba27bacda1df09aa6593ab7034ad06c1382a406ed802c2e021e180642a0719a26c609d9bb42d5998b8259a0511faa52fd37af9dcd93ae2ba2c22105bc5bf2ce2c2889b7d4f19a9e2bd6e8567564f4ba0cbd237665e8ba90606fc9786365918ff863d3962454c51afa9220874f9674c59877bed9b087469c0175dc249160730170db0e6a732762a547870bb4578617f1ef2db224e0ede99ea226c6a8036e8d66264143f35ebfa92a4bfd0af88b08d2f7638b0d5ca7174fa64b929999e93c34e4359b0319fc16414969256c1edb57010abc671e3f19a38e6b56aa0c7265a76022b8eb8ebeaec5f04b4b67aded448a0a69f80ce0db9cc59726983184f413bbb94ea9eeaea89c069281dbd874a83b2289430f7f79f582c0aa8636909d05f0d3e38cbe7bb791e99bf793e80d379229c838dda22cc6d4842adcf9dee7b0dd58f786dadc1338e3cd8da45ab5ad9f4af96c7746a5ee90f4319408a7be38325ba9693780dceb569a39c65d6b8c994b2d5f11a83550edcdc129cd9f75431802295a8da43b29067bd6474bb22d65fa65653802834024c362b3a4ca42516ecb149c08e2869bd75ad808f6b24ce2b6ee1da90dfcd2da22f7073844e8620e1f93fcf465a8b9dab1aaac568cdd41241a004253a2cef8fa69ff0f2d7cd0238e9dd1c99f8dd74c2b2fd578f722145bf1507f44bfca596c0620396f42ab80432b0d8de3835948a1588765c95a6c6f9cb908373e354ab3d4963ea36a82bf52220db4e9c50b0d1c345cd0ea067e89d739535b76ec9139d285f79fe6da1e804c889246e3d45859ff9ec33bff8834e7323390ecdee453178c11f42da916203af80a0ea956a232f017986ae36df462f74d13b278012bb70d4b9b46ee2e5b8608e5dd3fc49cab82cc89db1b1580d8bba3f6ecbf3fc1a1e2bd099c086f7351bdfb2a85560cd35c1153aba46ef27dd7e323c3209a85eed6f3e410d214193ff3e0a5f458992b01562a9cd236676868d62c9a1cae178d40f0493328a931dbacf46ad783986326eeb004add0595a827591cd969fa9247df0724e1ab1f6590d2c855177dc77a9165950ad21036a262e83608c6b13452ac19e965aacc2610bb1d90977d3f0701770044fe5833423d07ebe80f811e106c7eef284e2d336725fb566d241daebcaea2fc4cc5e56a96e9a29996d3d34f5a4071d1dac34d1ea712d07e91ba05f6fbeb3ae0e759bbe5e9847e40a7ef44011795efadda38c61f43f90e2b77f60308fa6cf89dc41808604d6fce7c81c3b3838ec1a2a202b156317c1529af15ca2f3031b03b5338298181346391ab941002e0c63488283ec323a778c1f0b97fdba022af40784e62949e66fa6eba1b0c0cd0d5ecdc7ac2bfa64bd60f5fc2e649e5e4410f910832654b1708dfa210018bb42d263bfa8cedab338a7e2d8b5ead0a2d4b1ee75632bef89bb5a4a64a307cbddcfff2b121256f9f9044e4b4e04c2bcf862f97a563d927f860dbd91accb40c6b8503fc21d5f1e806f7be2c8abf4b8bd5aff0dfcd2d59f995de78ffebddacfb0767b2b74a64e85af5c994ea1b8da6a5f3b25ecb02c9a8d02cb43b11e9f3edf3fe2d1f29e45a5e1db692adf02c4313099786647f86e663514ae2d7b8d564af1d6fcc4649ce0864a8d604f53ceae9fd097d404bd2cacb0db28df304dbaccae3259a0d8834db9f99e1e6103fa6a530aca3a29d334a57514072151d62af063873fa0a73c5177f73d4439c1c59181895f85d8da8a9885bfd0359a557b8bb8c121c98173a16b2eb0ab1c20fc33ac61c90e6a111295d913dd1a51045d8916bbc362dc4215802a3185607da0e6e91a6dcc0c13b71244b78cc426562ad845e76b4e8cca9f2d444193826ca2cab8dff70e85a059ba6e4dbdff2fddc30d4fee5a458c5c5f151e8389be8ecbeb8b2a5e25f46098989550bf0b1c8132592567366f27db34e6a11dce68fabb0324bce624e054dec0a144101c24f6b17d1a95d347fce8379fbc493e957c8443cd0e9b1cc8e28e44b1b2f3ae793837daee4064ff13b4a30299f5ae54d26e9e9385df93f3bafe548befb5457d129d4d1873f216656886b74c73cc52a76a4f238a83290f7c329578e80bbfb4d7f19135c1f97eda27b46fa1ca02340e0b3443f44c25a500e89ceb49cc0236576fb39f397223b9061f731d9d39b40e0b4e4e5123301439e589432c263c72163c841edaea4a1d74d74466949fa99764811448ebcd1f352836bc14e657480837f139234482d6c51abca9632365a532dcacb0b5749f7734944dc0c7a850caf3541744364e1ae2a810b092ef9fe87c1463dbcc331b6a4bc01233f5d90747d272e0fa3c16e92f466c3e73d78ecd344a979f131932eff363d1f741a17bdc9b98adbd14da94dd4e6f2a5782863da58d8833ee29ef3ef038899aec8b6a3f11e45363c5263888a465a145fd05881622586f40ee78b084808307c3218537f70b66a98b3f16875cb2262bbacf8e15359202fb49fd1f8a060fba0b608cbd7384a7a1f143d01542bee6955579f4c0d18e995b3f69b0d1240c6859d0e3d054e87623836d6d0f3997c4bb331267317832ad8479d8d1461c8f1bcaba5ae0f3d2950cbb706a70467ecb422099f33ab378f9c504b968f3fba52851cced9a865a7ce99a0c3e8d4198663162b165780a0107551cacfe000e03d427c6a73763f035f2b131cb49885f5638ad27940223bab57b2861755444356e77af13ab2b700394dea5c41406da03807006c641666413d84bc4246e4c350d15b367da40ab1e4f0d1285188cc826c47a68a179b6e1cfb388b3d85945291b6b829f4272b476dec4e8ca7957de74a10b9cbc9a0d8215ab10ede8931664f45a539967ce933f5022cbadbdaa1e320acadcb0109d34268bfca9c673acfad1c84bb36989be690f89b8066266a23930034e5e2d036861f3de28cf04c80a1b8e351e184026eea735961c946d3aed5ae82e73f0ba213ea162b88dd241b7c7497494b44646b2d90e5244e34d3960b7584238a56204c72bf2f299a928ad6752cf93c778b8d4a054611d2cbbb66569458ed8f6586b5e002f552299c86151ea6de8a06a1d4eec0086095b76216628e1fe409756ec7da143321cc093e531747f8488aee32903d919f303350aff931f9d293d0ef804db714404aa475d518e6a0f54240311730eef3cec07117827c81371f39f3a86f695ffb1735fb2838202f1060b5f3fa629a0cdb8b1f2ff2b16f21b6d0d947683d713b63a680536bab671a99375432422a19568caad2563fa7331ef226547e43834692c9a515d214a32c8e91b8c083c44ffab03ed03c5172badd8b641c68e2e62182adb705bf1b2125d0031906a0d2d0ecdb8481e4418671471f42c852d889f38b3d8c24ab006cec27ef9db052c1cd741331d186720e5f1ce14143a6d63563ebef5a87e8c6f21c23a11d1b4cdb7e7aaa8f41949ff04c256c59823606c9484bbf372f44309fb648ab5a502f3fd9b11ae9e991a0344ad4968dec3a0a393476d862f08fa045030b399688dd642cd277f70d122c52492be37f39fd6a085796f42292ac7c88688949d36b423f0c45dfb74f8a6dd606f6fb3a6dc3ebe75e6587cc0f36b8f3714cc4d14af1497f5fdd19a3067cfb2df50fd3b56dd10e87b507bf3024e41c3cd6743ee1b8cfa4c38ed11764898176e8db01dc9d452c4af034b9bd90858fa2872373692fb200a4425c57be39d9d44ba4930805bf19eb17ae453579436e47847a2c648c818cf13ad9771683430f09efc19c268a9928335c90800c343121f7a7964b06c9401d8f7fae8541356fdb77a4c866f8c341a521d9c3df4cc1d7ad7fd9243121e1935837f0c3d303d8f6f89b2021ea44c5343ec814725c0057d43f4ea061587d3d903f03cd564a1ec103c55dcab409771a58186fb0d4b75e8d2ddb662b856a391d86c54d57612336c5b81d613887272407b6cb8d613210dbb216b7934b70a6d1b7a28b519cf97492533e56986f4358a66447df57590b341e89ee10b83b0e233d99ffc3fcabd84a6aa44653714191c07edb9302d78377e4c622f8bf48be770130e6cbd04d2b25a6c409586d4009cabc11c24c20106e657a185a0a1bbc067d8751b599a8c8830db674a50df566cc014db224b21243a3627970406c2653b0c42920e9893d5a8af7d89258358395eb54e9cfc223b27ab6bfd460473fde39aaed4dd1055e550bde84019a10656a592ebc09dcc453f77ad9ec625543d126bf91190afd4ff21bb27b216ab5ae7d75ae4ef250ab262fb8ccc5ca579a03914530528c9a76fb66bc41e56c0b8d868f0b58571f532c2512efc0906d9491135b5bed1ef0f11579b1a3267157160b687b4533ad8ad5ee1ff70beb867b4f99310d7d60e75c6233312afc8ee6f9ad796cc9ab53a1d40e763316833e56adbc8892940ba37799e3690741791a1c85074885aeac96ef06b1e7f0542eaa85bcbac57e3a7c568cb4980d5bd2f15f2105823fe360e1d42e302918c483113741a9af27b8be5670fea1321d6d29001307b66429f56f81ff0ac03afe1860b4f1c395c16ce2a4eaced98a233d953a7d7d30ab3b3583022640eb2f9882064bd99a46daa060af209b06e38ef3632530d0eec4050487788206fa1ab51abc97c517706e70895dcb028aec413fee8b9298776c160d063a3ad64e64f15f836deccdc6818a69745e05c9063a0c568fdeec344036ee0cb41d215f7ef8c225094b5bfea26a554c3b307f883722058e74c26047ac313ab05a619f733c4ebde53618f7e97a333089a2cea541943a805b60562b4c1949197e92a22d8aa52f44488f8b02e10c37ebc2043835f46b5cb01db934ce7e7222d8af5c3d9f97063a47792c8f4760d6bb87ea6444db2c06a979176c805e2cf4eaed781b9cb91bc01f468aacf1ae35fc3720cdc35ddbe32fed36e974c7e2ffd350ac3b1b56d564c9151cc310f7fb84078e8ad627c452c5f237f213914accb7eac2e5f28616a0f77dcf524cfca415b30498e582bf76dd67b13e932b4084547c3969b3503f4ad85904cbf6ccef3b5ab30733c9daba1bf38d3b7a97a6990cd699e1147ac5b273c9a8cf2716232e480e2e6fafd0c80b61af16b492eab4f57c8fa2ba9ddf9b07d7eb9c9e087fdd3c30975d1072aaefd5eb69ae962d3e80eecae0dd2d7511380912f26ad28798eebd4c568c2e65f498ffc395768f842aa8ad0fced5670113e0cd76001316302527eb52a5c6d1d59691a998081f3308aea31ccb0f66a6f5343d869dad1163aa6cbd306a8f87e4e27a00786478f8878371e503ed79b14b0e992cd0484a923630a5e6736fe0061327b3fd98c11c8736142fd836c2026421229c6bb8d3b16b53b648c5efc9634bc72303bff2de9c17da25a9347d3e773a04e9f74781117d83692166473469fcfc02230843cd00512f6c0b3f941e6eeb6aa242fdd2422ebaf310bc12f663a5152bf66049de3391fb195555deae16b91e4e7dcd3a8a4ef23182c53c54462f2e2238f3190437859883410fde92a178c34941eb0bbe212b5311e32265ed8116150bde31f7ec9922e97e6bff31f7579a05c8dc7d8104a1959978481615b226a9e20db3c05dcae121adda89fbbaf380461f2d062c306495ed935d99dfa34ea3ee140d1cbd68d7a4137ea8feaf254cda99989e8ec9da24873fde4e8555b24d0d3a430b6f53bb30796f7bebaa76378832a205d359e3ecfb4ee4ea9812f0ac720b245623e804c36cdf4beace478751afefc6344a877a298c8ca0e80f5bc0626005215e3f3c18b9146b15527435a9f583f0dd3602ae5d02c93a74aac694ae354105153444d5d0127c0c0f90124d98de154e46d1406903507b775993fcb110254f9c4614563a18b951406fcf338e00689bbf1470bf847b14e9cba0a2b2ceda54223af9185c41de2cd88542dcbe2e5e31449a8260cfb0303834dc515b35045a653ec700c89cc7861ad0339912a7372ac9dadb3a42466e6f90b8af6acbab8a86f46417b6db454f255555220461611a412d3ffbb877d717edd73415a6c3f929f1656bb06bc034a48838389e15a8007f449e1c4d89843be0c92af2d2f80ec8d878578d78501002641a3a3a69e34916b62b58d44c059306a54079fac0f32563256e94ff1feed84e642cb1cc147c18dd29a2825c940f2abdc9674d968602caf62d808a7bd0f666160f3e0b7513d3cc16f668d0b17d1f619ec48bdcc73b7e3932b2072d50ccb305c5ee1f29009462f23560bea58433366d05111e6039880ef872af63d98ef88b4f568a8ffb25f2c0b0d0ab9618f926307a10d66cae0fc6779cd6d2cb8b81ab671b36f4a50609305330f209205bd25c7ca8f7d4abb6df51350e9b3094d0a4d7ef8d0ed5c39740b2023cc46a1bd21d23fd5b92b1d9f8bcec3522eb22ed41e5cf7eb7d13e1da424745369a576e8b7fe82863c96ada7421fcb59afaac1f845744e4e8bdf5bc12276ec76cf86159f081f6c9f2278b3efc3aa77ead96a3661a627cff12a6e3f264942907ef3f497d9b9b6fe85ee2790b898ac15f98b1661824862ee67cb928f98a936ba612c3c81e5f829ac10756abfac3ae7dba584a181adddc866d1b5346888201b820dafdd0af621f4a6ac8480d470681076bba50f1e327c8776432ca3e5d6c42179d27abd5073e6aa7e525a5e4492ff6ba709c5a5e76023e5f94762ae10bb2b8fce0f3a801ebab43dd8e122410c9562b838d788fffa0e77f9c83f0928132a503680148753f05f047baa3669dbd7d30c5c1e08b2b2d376ec7df7fbeb9da764736f511c100bb85e2234ec039aea81c3f7d0d3d94508cfbbd63547f21a407161b1459cdb0d42c3de212c886d3222148c709887f3e99dd9f7064e72ddf621bebfa9161064e90b9ebdec699b5684e45a641d08e453b9baa6d0a69b79c1668d30a70f2a4ab584bfe6109d290eaf5735dd1a8f265861954efad4e47eff783352a7711460683bcc8c8c7d8f9346884919824e4dc6b57d68c58d6e1ee182f1dd8626b4799817b6dd18425c72fa04c60e1a7730962e449de074e5e78888540293378187590aa77479b948667b2c68168b258096f947c0d0ee0278ca15afc1f2a059928a7ff34d171945864e7a6f5e7317e253be3c28ba7fde08e3981858060242082e1caf91dbfc7d022d5de39ffa7101424fc48f20d8e962c31623ec54ec54f02502f89ecc527fe6274832602b9b403ffe24b75999647564763c2a644859407ad0269a835b2814e804a8d76245259385e100afd8321e272bf134bfabb1da606df98e1c695f8f72ae521925c9a5fcaf4039c8b3f63dcb82ae3352aebf7ac52bbedcefe9b8c21be3a439a113110199989468b86d366f2f90434317a245f9b4615ca5878c73a8e190f7a56c6e7989a34c1c20ff4f8fbaa210878c446ce684a703ae926a03f39c0fd4712aa71aa2cb4414833460d9e40dc9f7725011e071d49c5c4dd5df81b0c81e84c27a6b05c4fc5488f60bd89e80d8e85c0c6042bc8e4e45aeb45093aacecb50ca2c406557ea0c6470c2948bd857cd29b1c0a97d6f7a631c9c331921383f461426fb48d101f10a78bed6ab88859f6007744d1c163d99306b06ba9a2434d461589671a9534d5715160c20857e235addbc113247324f314e74f6eb52954815f1356cbdb9426dcd66a3f04642c325110d814bd6302f462971d7c883b665fe01e99e24ae5cdf9e6fdf253652ecbbd19b2c26a4f8bb19c60c6b108ae663f89a1bbbef98f6504d47c1cf4554d543a813a1ecdb86ff686c2b61f08abca68eed858a913cfefa9835395a23d5da62a1679dfd1c198af4415aabed638f82c62bbb8a0bed579a34bfd9d7e320269bf4cced496baab420da2ac2312793126911dc196d0c99b700ee2acc6827a84d010ef8eb2656542727ffd4ceee548b71200520998cd436c3c5da8bac3cb5168750982930198ad7ccf71737ac1735e3b8e81f44985deccaade5d7f09acab927abf06e132731cac1db18364a5a2b687bbaac518824de431e61f26c56056631b8521144fc9d96a3e70f9433549a0c1f1224292456c0ca29e4032f738876558302d42bde9c4c3b9fd296be36e943989404d80414068402dfc24161d12d8a0d567b5ff4d1dafe1265d7afbf6d439bbdf9ad458350febf08a5715bab33895cd12de4311a044f5e89682d052b250354c1e286f14479cd36857a5613a193e67006eb2a3e42a6c2855d11c84bf8c3a7637655440d7a20852570800dea26e66e8ca4f684089e3ae029f195b06a2afbdc46599288929239dfb92deeb5b673d63869f77c8ba9e4a9341999c868cc6a2a7b12768bc7fc48605e54e5d98ddbeac70bdb225d1d513268f39f06103b3ca2f6443b2c25a75c2b628761ae3a0aa03dbe241b45c3d519888c14b4b52ae9fad0021cb2e314f7c4ee38a50fc12dade3781ec900128325daf51396e3941de422dc2d1e5134865d4d11f3ffeb3b525453c083207d178e437fc2800b0c24b1cc7497765acae82509f4538842ec56390c07a454715a1f1c5068b2b660926aaf94830bd3dc6a67cdedd61ae8db10013e518fdb99fd1a25ba230b05ff2815728558deeb726d9fce9916066e690bfe48eb75aeb1b635037324924b27bd2a0803f5164f707bf631a5b0025b4935e0b981b6d7c48137687a490b5528e97d0af8952abdec34bada76649eca887fd4e0a4b593b881901d4c8fddcf51338738b91db0c219c643f21de0924a30e2cb18ed67483e42bb41c731728312c589415e6b1274a0c06eaaf18d8ae01235a02782e019bd17c9989e24196fe3bf5a9310f204d0dcd5fa930d44fb45a2b0ccee4450d536b144ac4796ff16aaeb2a247db6fea3e6abad441b363cf4521ed852368d4fa1a2c638d81441211251c7fd15100f67759edffba7ef115d535839eb5a355956d159ce258a3616c2da8ba42ec0fabb4ee408cad172a2190ca54402a0f740c47e8a7e4172f1446012bdfdd9c3f16188673a48f2a09e42c98967c26ff2f0db44a8cd5240c14809dd0eb6c42a4aae6310e1dc596bae6cdfaa16718a3b8ac5e7a19da13cda9eee6d480a356da60902dcfb744aca3dd49ba8805122ddd154af22e3829fc4ec934aeeb5c2e63c5b35c6be9bca01bd1c19fff51d2e575353af5fa5f7ec6fcaf11db9db2aca89b4d717bd8291a86400fe4deeb05ca754fb8cddd815413f1f0bebe2097aac69bd7cae30aa9242953594d789722d5e558585b6c930388446cbb89b711ebf879155a8b16c59a3c3c1c6d3e810097cc83dafbaff490839f21b7e782d7991c9e5f1eb03a4d881c65ea60137bf29cb11f4e050a6b1d0089b247cac05b173b1908b290076c10856db99c043178480ac4c32617124166bc03a1b73f46277c31bf1cea0a36734295e5fd43137a165812eb29925c945b26e931685b8f79b92c23a47356ea607ff7edda0b82d969183601787934ac2c1f4a13076e99bf6326976be84798ea3ab88e3060f99e38b7617a185e2b44d2a0499590a816eaafb34b511e354b668abe3c4d216df8997d406cdf81a2c2962a19de1b7bfb0ff0c6dc44f517856d6bc76631e79618ebc4d447b065d40d6391d5f04eeab18d3b4bbda227731ce71eadf1615c98eb610ad96113cadd0cad085ab33b89f27a52bbde9f76b02a53b5df55fdd92adbcd7e11adfaff0c56bc5c7aa0fb55034713f1f0a79791010f61b5a887cb37483bb4b14accffe08136f90f7647fd709a7c3a4acc75183438e1a99401907cb9a561ddc8d8e6c29cc22a64ad8ddac801926cc661605b61b1310fdf1c76f0dc05a90a016dd7ea42d16c043fb81d9f596349c788e5a637212e45c916020587b927cb364cceba73c652f0284527b0ba8658e030dec41d0adae82b11c75514c81cf2258d7d336deda7d73c21d65abad1874a9fb4226251977de53296f660dab44aa3a33b1fd5664bee34c78a5858711e921d5c7e685b15b1489801245a16d4d8629909931124b84b83e199f69a22d02d6d58d1f17d8df417b5d8248c21010b837b4fc7318bcfe9ba390eb4237491a010d6fcefbbb9b627fc5231039d0904fe8463ee735a06d4d9eb26ba13a6efd513c45e37fb57bc9da4d29253279467e6c67135b035f64572605d0eda9d08b35ba923efce7d3beba08f5495ba664c380ae55c784e982a6f47c5a913e8c30c8abb9c2f89532f7fa525fa0905ee375ebcfc588afc5fbe3c237fa9d64bbc35e76cb7f5bb68681d171206818374974f453ecf0d5f994986a29b72cb7a53e68b7eb5a63e0d001684a0b126ffaca13e3b80e63fb4a40f221e646b84059bca4d6bed116f65884a3cc3158ba2f3122c4dd82a4e8e4c9aa45a3753fea01e0e54f8cb93cd04ba78f6457b817bba6b8342c6bfde24f3859e22bbf0492145e2bf094551fe590a03acf36942ff4f425554749ab802ec96a7a7394aec2c15917abee56196c1a6edacc58252a8826901a0ceef8d72b13de6664a1c48d9cc701030d731da131d88f8aa5853ce9f063370f837313f8d84a16b25ff04b965d621bb41abec4e87f74ec8e27677acb1ae9f4778f1b66a532545c1a99cf3ef9a690b58a2f6289f528f34b821a0e565a5a7c1752d2c0173b612bb54bbab05ba733b4f886fdcc7881562a847f09a27357a4c09da3000d162a48f4af15b2b323b545aed5df16cc0cfbd5f69b5e01c8d2506479771dcca203e7702ae6c2dd9d307621438266da5fc3a2c10f535171d528eae93ba42a114247ccc59ad173cd12fef14bbf6deb237c07bde39eb45bed54c44b36c3c66c8857c212088d5d0384e6c18fb86e716c264a8bdfea541ddb04039a24098eb469c738b48cccb723059bb29e873c9730585fdd3df68be3c14dfd9f5db18c52001787ac9742149d31985f435ea558507e4e931d4712f5b46a0ac78fdc93767b996cd4996bb4690af21873eac4284b4fbb463273cf942fe23d15599bf289a044adc35929419208af8637e3af752e1c9b3d1a5bfb948df2bf6b992ade8e932a8cb38913825d549d749fbe5a28b49e4eeed27517868150d153da59f6cdf34288c843749fd64bb8c9c9b61b0c03a1fb0e60f3f44c553f876111c03058adb974c617d8034d506103dd50f644f72f2805aeef0dc6f68af61fa892ee85828bb52c9b37bcbbaa6a457435429148ca40cf4e428f985486e1642efe8d68c210ce20e786ffad0518724d978b00999adfc162beb5bd060c622d9e6fdfb0218aa24b309f20f9739d1dc54fc3bb5e55bf3216f567ca5133422d81c4e967af6bd670a4feba5e8a538c2911654cf49426d0b07a92ebf13c0b0a76978b717cde0d13a75fdabf80f5f5abb61682d83260e24ea4eb63647136c484af383bf0d9adb67501f580aeee1bbd4b8f761f4f9c7e33b7f7bba22a683746e8960db1dd8df2380590d840728b1c58920556112fbe52141d72de69e49418dbe7be3f341cc962448eededff2a29c1f6f5ef690fd97ea94ae6c063fec4f8dc027506cc26df9da4af3c9b65721d85f8784057e76564bd2acbff03fd0b11c9504a71047041e6592cdc0038565d210c701770c900a9ffeccabd51d59c2db9581c75825342f5e9ac8a41e5d5dcfe9e0eaf02e2b427a95050b2ec7be4c16b9f14b6a22abfd377de2f7698bc3bec523c5c1e10427ca1f0914863be76cf932ecb665666e1a5df8846c84682d8a61aca942e1cafeda7ea330e162e8869a64569b6f4f1c0ad6893629810917385122673b3d22fa188fab59dd9622b489ed7ca7dd89b09132f4f03955ee9a1547ecdfa76b46fc05888f43bd5ca05226033355cb361b8ce936e37e4ac660770eddfe47795cd6ca771f96d9694e928a8e9563b3b1a32b080322095ae3fe9bc59b4b48ba5f0bba23aa52fa20a2e901cadf961eab2b5566b181558fce9415682396d4f4817413584763cbfa453621d2e43d4facad254416a2ed05862ee665a9184cc9a622cd37a18fc56bf6367e4db55f91bb65ce3b232946125996392e266ce8cd05036482b7ae73f35eef2abd7bc7c200b0f3633934908e4c311a898c24c9b6f0050816cbc6d3236e3e0ec5a25247c9e52766c7af7a39d170ad03e40752e534cfb3e2834b36a5e44b10f3d2889fdf5e52d22341a8161fb4bb2cca9dbce0e3a0025836042396e500aaf37c286710b4ca800447438d68b4061dc4484777a86b0af317318af4b53c563fa51ccc2e96a5202cbe875b50346c971220b297cc3fe30223226c05d1d2e008bc543452734feb5dc6d90416374bc5a8118c40f5a4b85948625b3713f5cc40d331d261e6a80f1b13ca2a8c626cf4ad76267c38872f16da5d45bda3ec20e1cb50fb462da0df0278004820880deb5224e8c5229785be4b5c37c4d9da9edbcbb1bcc7fbf483a6da76b6c58c21f3956cf1af677eca86d6b4a652035286000fc1f986acdc0ea61ac29737e5c03a455a98b8a6c0e81ee094986e5b9bb5228ee700148c8e985951b11b67edd9ee2ddeb93a968b398973a802f34db461ff91ae5e270fa9b1a95c3af30af79d21fbccf72263efa9f66a4f1c8736de8dfba69e1986b64097bfb3da141d91f6bc123c0d8b6ac0e4745bcc5e4ff2c9f3199ce02a537ef01b63cbc8ec150f5734f9a6cfeca13769fb66702bdf06d73838060bd905b2dd3a3e567187412555818dd79902901d08559b4220cd5b552c6690376d85862b8421a9f5a93d61300d49de10f06e5aedfceec5aaf34a6053b2964c0a0e0139b9cd488a1f73b7ffc7b0405510f8de06926afe2e734368f536256502c9b07b3232c0b3f23ad4427936202730709bce6a186512ab39d9473ca17d52011f3829390296e18e95505f968730c7cbb7df05fe9e937d6f247f45b8a3df253d88a9c6e5d1a09ae8ba1674b79b291075ac509c03452010f941fb266f7e62fd527c79c9ecfdc661da1c4473e058a4be2a904c244507c670748bc8a4b64234193b86e54815d9bdb1c7591c298fa10a875dedfb1e026c1295831878773a2e8b894640aa36117e6bed1727aef225f469160a5880425716189480c72c2a95d6623a81268337716b4010ced4af5ede11e48a31d8968f14505561097d0bb11bda2065fb90aa8cf36c6e024ac46410b3fcd54937d4741ce878a337257e7ceeb3567cf11f8cd082256361532f6696cd7081be18d6844c78dd0bf9899c740afec3209dc09ec9e4f0fa9b0e0d46735254a5a2092aa2b1df65b31e2c9040b0645f8a0beb93c0462659f409f1b3106c80bc8e84179467ef838c7562081e2c9a5a887ee755c13fe2a4e748ee02f3dbc7f2c97125722eb4d1912e3994930a0bfaad985d03a329812e97fb5a9594c71a1b451f61207cacdc78537ef75a8e956ceb45d60de2d98edfa314b7485a3950c92a998b43e7b521f7af4c67c8150f4c4c88074456deee0d55ee9fe3d7aff1b4280f2ac344583d15cb29f17dfb39c08986c22f289835e2d397cd1b0ea4c74d543e391045c56beb9489cefb1a0659433e8d6272f11a5a62debba883ed91285ac45f1893fd9d776d7b8fdc6832766d5f9161e264b4f3294eaee74d3adb22a84342d0feb6cd799acff0f024e20fc151b602ca4f7f61c7457ca002513ffe696d711d8f29d6f9f5b0fd357ecaf2ee9dc4f7d139acc2e9d50c611b292361a3a59f560319adc3880f149bc0bb978675a378c2eba4ddd9b8da6b06ccd36bdaa15a9df6912fa02eb5e26ab097183ef5832b5c4881d614f7a565cb21ef904d7782ae2ce514d7ecf3d941fc8cbc2c32ad073e0bf5e8d3f6890b68dd3fa574862ff28ba859819517b76c775540027ac151ab7e06572c05e4a252562c3956a121d8ff9ec927786144e3ff89e17f36c13e529dec6a8caaa327eb1ad8f5f85d362185e35088964924641e9f7215d5fc1e48205656cc5004a96e460a0c249c671a885ffd403a5bde07de0f3a7bf33827848a6c4041d82d908f31f0e5138b8a43044469b40d8fa7a934229791795c2bd6d6c554ba1abe516dbeced67f8c36af6f28dcaf0fb721d1722e2ca545df672211922fdd59484bf1a32f5a5892b1fb4a1a04c920aa585d169e8fe172557cf30e085c33bf1e7cd79a88b1b4805ac5f092c66fada64c7c6d295f6ac12c8e23a49144dca5d11b0bcc10e11d4ef900a64ffe03c4118e1ebe73ac958618bb09dde13e8403388428613cbd0044b6cbd843a68277ed3f660f36d27bdda2e200fa55c4edc742325d7f1a58605e8fffa6021a8d008ea6752ab1e48ce6290a6e411b46e61daa32370841818308ca3e2bd6db030b0baa361134f633011fa5cc38070aa9d3447612cb6c2e29d9990aad2954a06961206deb7b5820eccb49ab810dee5f199243b8603bf878729f2de6e9e368d867e981649d692906e7a63ce03df67d5b93cdffaf75bd14e55674dc187b608d85a8dde6b237dbac5b564aef5713771acaa68ebbf5f1940fede5089e52d26bf0582358a675803601001f0a743f6ca6e908329dcc75ec000306d662db931cd948b031edd54db90117282f325a5434e0456a65b0b1fe01dace1009ab7421d4eea611a66b179fa61e5f2d3b66933a0f410aeb65fa3251b7f259e1e8603d36b6262a0aa92305e3d050d6e6393acdaf78a04d20c60fa13153501a7e139748074df20c944351e4612dae00c88b06051b9242a2edf6c9b377379c0a4f02d728222ea4b041587a97297aa26d845ca2679ea0c8e806d2033810047605829f50118a29fcf4816e46c7f53018c4f044dd5542d8a214a7a1971e05fab5bcd481e0b749d07d0cae60be4d22b3e4d315a6d33aec5859996fb4a014b1756e7e605925f24b602fc8718c9bf2fe22a9157da4476e388d9870c81ce843099bb9d4ba2357e1ebc00246a017f7f7e3141ef24e77b57db417ed2812d5ad0c81a7366c7cd5304f86978d3c79276442b492b740e3d7a5eed55a9a7028e5f8c801a6c36af4ee843dcf9956e54fe11baf1d1548b06d18edc22fabe762a329cc9e51faabf760f5585aa7115fd6d55a4263ad9458fba484232b4d9f0a513d222209021e30e73b38876814e88c03897c2b638e7927ac70b0077b29179483b95b8d463943dfad06d5ce899c704fb7cab61985aa2a2906cbfd0232372325195daf8c657c49f33493be2a4eed12cd916291f0ff2c4c47faae91b9d3edbde5357d5070f485268187a2618498b23a6c5f23214bca84db1d9f610427820b8810c9ab4004519be77d42e8c771aa51026b75e01c9f1aaa723c198f1f023088ac23f64506ce56dd51a6400c955ab475ab17c0d7eaba4aec082ce07d0c7aab6796e0dd892438520abfec56c0b97d0f3cf583c1398dd1af2b26b087fd94a9a9ffd31c0562aeacdc88f77a5a244b9a18a9b0097d10756c4935ea17ec2c6f5d4bd0fe96d84332bde6291a36db012483dde603ebedc47bbe6c0a226d4e3da35dd2484415e4f4da6d7ebbe05203ce36c8898d799fd7ae290f0db36d41490998ca6d77a675a7d93d22fb583dc6d3cd3123efda5b2b40975bad38f054337c71f73a2840a20ea5676ae5124e473843a0437d465e8f7f1a53d4549be80ea424bb782f7aaad98260a4c0a0a27f88b48a58abbc2e44dd9e8e08f716195fa6e1c12e4fda69595fa269657bb04903a2bf57d50ac5b56f6623d90cc8aacf3fd47e89415e025970dfb80fd9403693875fff212ac54b0ac4fe431474baae8e99f6a58eb8900dd3cc1e7a68149204e1d03fb8651c540c72c64f6f02de328692ddc6a2279b0b58519a7eebb7d0506d5d519f02d276a806f5c92b5949da37bec068a2d449b88b78c6e8454052543540afaf51f90eda25e5ba175a7b68de58b5fe1e2feafd67131a725ecce3114364d7e2185e85b73be09cfd7731e3f1f1747837f77dc7f32e871ab84bba7eb4caffbb5cbb1c9ffef9e3986f5d61f09a7d1329c31181e5c743500216b787c1bbaf2ee5cd090b1646ff5be6bc458d0e3ba671df6fe3ec168795e27b5c8c9624b907269184b6a7e19510f2eab7cbe8e872ca44e864b4e679c43784557c802bfe765af7379c55f38c2c0f1b2479ebf48464a1e8d1d983a9950a3acdbe837315a6099c3ab02afccccd3c70dc2ce07909acc6a3dfa6cbcece590237d87013d442b1e46797c41a24f2639ca3f72c19e6a4c6069e7644b5bf2128f6520a87e76d2a950cac1022f24ab1f9f7d1fb29ae7027281ffa42cfdb20c90e2f5e0bc37cf0b7dbfc5677f90b66ce31cb8fc6aed47b2fd9a2f30498b4ea71a055dd3c85dd33f8ac87a590492221852e737f71ab74f089fae190c41bc71133af805dab41925048f96f6d9bcf6616396a44e3de23508c9661916748de6dce7ba3d06a04319d4291691d7295508ec0a0b9a7c623f62652f0d323ea19285a6a397094b6c7248598565149eb8e4d997d2caeaac41de1e0aee209c2d1be644f648023770b80a04e572d2780f18a306e9567b70cd2337484502ebdcd7c08a3a4004b48870a675990a64822163b153e85647befe790c504e9895d1f3538db5abb147b7f85ac496c02d2c82180389946c1504a523fac20a9fee60ec9f5afc0de5480103c37e5be51bdb2dac8fdc9938e29f01d5225431f6f8dd69638279f7ea4d931f503483aac138ac289451c325ee20bef22bb0eceff05e3b4d1afcb7d0806c0cc3709e60700d29df49ce4b2d32f7568158a5a5b60b00b3767005230a16c0ea78d64c3da0923476b18ca99718486595291480e5259977b2ab63fd5a093339a1c5f410305fad4b3db5cfa14637de7545009df16ef416af4c301b3f6e04b732094933ddeb2576d8a094d94a44cc836085277d3ae203ae3cc096f3d94f173900a3f0638a820961de896727664c294256f3ec3d94a0bd08ce93d8dfc4c09442c8cab7d92948a80848f14f869afa23511da74a7d3a32c4a206eec0710e0a5ba5a66be2f76ca25bdfcdb881d9cb999695e1e8a2789c561e1fced26434d826388863c5993aea32972e87e134bf074e2cbc09a47196e223cefcae702d7cc7c03ed7c08649cdb5bec7d3df86ef4556a26b3323740ce64b0ba5a2c407ebc73b21116e8073a8674d8a323baba9d9ec621e0c25a53510a6264cd38e002efcd66b20f5596ce069208835757dc73c37e82b584e290e60fbfdb3867f9e3931cb0a2a09c91ce4db50e2f62989e3cb20ada0c16dbd1075501d3e9ab67989019052fb2ee34f95f6710259d05d16ab4e2ef34fb665b57ea202c8347250bc2d161fdb923f2d616334ceacbd573218e1d50fd2339c25d231813e9f126ec4f67140c1d67f072bae8ef227a74e40e8e044ada345521e89ae50ef52905f8d5d8ffa7ce46d77581df1b2b669adcbac9d905350cefe5c9bca004db794c956d391903209b2e7e07d1cb5c0b628e2087f1df77498c269bcd5a0974b8065a15738de848f7a79023395302a57842eb978cdb0d82bcd6430e3fea8aa7d216376ef4ccade37ccee147fe794fee98a25f85020e837968d9277f4a4cae001db8c09399ccc27b06deebf9f16377e899dc4b33e2b1f9dbf8189c2191986e4c0d2068ea68b3305b8add208e0eafb9d29dffda26e358e310e1140ee3b9c62d12def6cb89c0a2a3d32cc799cbc1257c61aa1196c7c03c999f3e26ebe61b209a08198800db913ef9e2bc0f8005240bb53fed73d46ff8a5e67a6c3d28fe22b6de72c22b59cb73b75f3836ebf7e2618cea63128b375e2cc0b724fc1d4af9246e95a7f4ccf4da25bbc80518191fb5ca6be699de2b2617ca77da9d8e273f2b701f1c2311d73a23073f0d93c2afd5cf5e9c840fe7d9049d63a5ac45f943b72b90ac954ab3372cf6f39217f143e2088cf09d5d83124b435bb48d8cfb620f38587fd11882086f295fe72013c221a51213d5cb8dae70cf9fc5376aaac8d476d78f82a5d909c7d111c53df8ea9c1011d0ab577467accba834ba04d79b47f4ec5c195841e7146150b9a3098c0b7b4a516adbfc50e7b042dcf93134060bf8d98a1dd246201173bbc800c3be0478750b2dd842d3d8ff4b3ca1d652aa451b2dcc30686d1605bb3cc77bd1c06f21697bcb03f8665af04ad84597078ed72c42a726120b09cbfa64affc052479d13d245a6795b1418d8a0ed52556b01f17caeedd2e2d9b7be0281544b9ecee4aa2305ca1075aa8eb1bb2ba6e87b5045ce8590a1ac4009df43186f0ac443f6ac6bedea09c18c1f63e2da8aea4a014eeb3b3fd6f548a4d8c64f9153efaea7229574a2615ae34ea0d79841e2fd9f07414c625ecb1ddcd42d4158112c6865dc6fd2b807272d87fa560ef54fadd34942475c6d010fb2f5f0607517241c03e692454a5176651a0c952c089b6d6f2621abed764c02231dbe6165e0c055c39167c5505f874a723d53f2c945ec06a898fa04167ff3c6eec9236405d4184b4bda012a753fcdb188b746775c86f39735342f03123b3b4ac31a9e18fb181df2083e0e73df1bf213f0682e9e28627a20497f4cd148d5aace3f82ecbf3f305d079ef0cb88f15e89533d7508e0b9e6413a907525dbec29bbea36a20f639344337c116bcfa3d42b0796b840714a5856b822a74f06c9c3fed39500c8082ff0039177bb4d4e7d8a75960da5210d82fb33e9539cd09c495569d5bd8b507430e2f6e074649a2620f0e010c7329f7a66605f20139eef0150caece07db1ae3ff20bfbb964ab4d42bea2ce0de404e0d78997b3dd5239f18119402f8df7fc8991bed64cab1328eea0e375aeb9831419c28bc835a7ea64727a58168889664b78c99cf267ed3487a6921a481ff4dc3f07ef5b0ab8c1d8febbadbbe5908e56e84af31b3ccb3271d13de6c7f050774d1a0385efa4dc4966cf63e79049dcbb7ad589f0d4b64b370509e836bcb3ae4c585ac8f61478ea97806c5193de6f4040ba085824f0ba2dc7d2f207712ad1861a32305ed1fca221dcccc2cd974dfba8d38dc0c29353ae1b5342bc4b42dda0c04d1c180fb3dfe5728dad470ad1f902195a953393e85655b6442d111fd361a6dc07db353613c2ec84a684ec840a9b7ce9fbe6c4c58551a5bd5c334f67b23e300fa578e5b9d9223b64396a04808be47fc15190b508ac8b54eccacb256ea3e492b6348c830956d23a5ee0554144927ba74f6f22f11986e61a103a829da4e7c4519d14dea09d7ca4c643158234db618cb10c5dec49b20bb535440ce51a118127165242d6172f32895e71ffa009092b98691a172b1349e8fae31151c59d9b97842bbb73428db189ec61d96de1f1bf200f9c5a02f24e03c088965fe46ce3637d15ef4d4edea56c1ddf35014bcafd6f5639051670960da04834c85771b21fd0bec7569bbb98be165fa7c48141b284f1ebef4561aa1efd46ae1ce95b9a8cd2dba912e8ba4c9077867ad916aa03dd23426226d4de72418eb7d2e6c61942c76e4fd45252fe43c869584f598419975cec81d6a1d3a1586474cf17ff5afda6324e59612ec4891162daa9f8062280d99bf688b2fe0062c0c83ffefc7041ebda35a37d072c04dda9e0829347fc6c37d9a7a79b55d4321a426fa29669dd923d20727350b065621313545b81b895b0c33c79668cc8d77ec00e2ae48f85bbdffef5927b33c6f15c0bb8d8f835810d156cd8c3a81537e0a8a8046e3ad56e681b80d20bbc6129647072518713dc2ebfba61ed9ad88075b374b088a09296b0357735761b9b77a25b706335dafd6e9f418afad82010c47d266358436ed7a50bf5c135e4bbc77249136be35b66899e7796c84394a14c29e6a3a4e31db922d8ad68589a931893123f3dd02d85a1b1eb5967384913d17736b5938c9844295d30e7d126a45daf7fe40e93f686267f7d123863eb31349ea524af20cf814dfa2ccd46da459ea4db0ec8a4cd7d187988f276d486848ae9016cdf419e989500092de9b78bd1cfcce0c4ee61c72fd3f8085c55836716bd8aa286fff1eac1ed519cbec9cae375f78e57bf6fe5e2c9e157598bdcd0ac0c5864cf6a36706032e3d02953665afd56d3ad55121963deb0e401830d5892bfc0419c545d982928043987764aa73feed73ab22060401b2bcbb4bd4bcdd41462efd48f389c43659cf0ecff1635fa164c073db57431293f8d790361118d524540a2b5f56e09c28fb12ff8532a2a56e4f5a4f4cfa677cd880b372abcb5b110efd0464a1ca3ae153731f2613cd80c0875a6245b61f35c77588d71e0d924bd961027e87582040249a00cf3482040262899bedc7e672bfa293676f64f5ff43e62877f646717733b8dd223d532910d5cd84ec1a338e6f1e64195dc83edb5bfea213f4bba0e6905de7bbffc743d654df1c9f306415dc4eb97782a64e49067e1ad22165cac46daf14aff3a4a01612f527030b8c06b0f74e203e12bfc6f73f53e8ec5f6d53b0fb8806c1d70e1506e7949c0dd60a188e1ee2b681f4a536b108485bd5c39b27ef9d6ea0f4426ee63c38a489c5adbec274878e55e33489108e31dedde1ad90a4134b77734f363b42746b8be05202416f17387335fd5c25c4f60a72c229c1d4d6fe9ffac33504d49c302369d8bd83afe7a6b2735136f076125e09c5d2a42b91028fa0688b90a9b27c7d72853da50c149a0f72f165b8274c30a32de8635d0bc8b82e2c125518599d2c670f8cff21c8720a5e68efe3a13d6a12f62b97fe000ff6fbd2daa5ee79df426ebee379efbf718a5e2c4f9481c0f42d9cf6d28284c75c50388691eb8c4831cdf1cdf2eb09f98aa3a8b9db8492959156b1bce5a4e848082a0c011ce69f4f9462a10a01df69a5988dac8d1f6273c8f86dfe8c74a1448e3dfde015c5e7c05c8de487b18bb0b83035fd4c38b7f85c966e4ed97dc090673c657b4e84f89bef4bc703d2dd1b5cff4a58beb5ee577547d6da46ea087490829c2a0e89775dd2f5a220beb9603b5ccbe5732c614aa185d624558f657c518141061a9f409a9181dd477ed19b9ecc2244c489929345de6b5c050379b07e8bc669e4b11b881ee3d2dce726a5998a2a1142d96ea05a76e054b3de1a6a87abf3b1523d33e9092e1d7267f3ed6af50b91d3a4a4eac72960cafcccf2a498d468fb2c8eff881094d554fde991626cc05f28d0e421a0584cd6c72d8204450211ace40b5534deb989248b7d89e0b01f66aa7f9ddb84c9a656d9842cccc6e2a5b16200af395502b81c0e93f262ed6b86d366c569b2dac264ae464da92389e59137d8be8d4918ed32e8faa69aaf8268bed54c683e007c3acbdf2769a456379e94885c718908e01d5aa33fa1cb06750cd039e71fe220cf6a51b3f71349a0b5601ac79aaab065033f1cf01abcb5ae87ef6f40cdc5082708b43b4dcf02a54b585d01968af9c06cf5ebfd6bceb1d233e68de75e14e9d30de58758f96896a5bd24b18d218ee103827b0af05ac98b8bdcd2098a02cd594e8f1e67ded4fde1654d87d509d62118f3a1c5e0bf6172de01c7d89f3c26593d99d1e847226332c6885fe60953953440371ecdc132c44e4977b2f670b03b41fc310b931cbbe51c7a4424897940d50327905c504fb159efa278bdf0a4c88391ab182281c7c8b2b2b3113f7ee19fd37b85758686591c4190d123e7dd3b46de632220d4cee01ca4f16d973c20e2ddd497899cb21958ffb75019ac32f38e362216579839385816376b6c8cb37fd64c915225392c902f2196a0112f3a277cc480aa2bd22f305624dfbdf22744749888080f5c0f1103fcf3382354a9de32665eafa95f72fa4ce1c938368c310fd9946b24be5fc1b1048e1c9f2ec1f036292f649e4094c8046412bc2b5e97cbba1e8355011b52297e33b82a1a4e2888a27a19a43923da3f1c288017cf8ffc53b1256a860f092e66a7a76c31ea1157c8108c16ded0b7cbd9078637a5898b9bfe1806b55e962d7f36f5730776ecbd405ea9230c504918a760371428e431f4ce72c2333ce151294f73d3ef1e0e813dba2a283307860a73f5c5c1eacba9368dd2ef6822b57e64f954b060d8f4776eb5f0b64350370607c25564bc045c0c53a12aecd4f7eb4e9e8b26aefc3f71dca52b7e5f9a6cf5902159b8bdaa22dc84772880131a3bb23fd74a306073c31d51671d2f5a5efdb268cac169c23a903d38a30049f6493aebd878d800b72b4bfac015a45a9e78ce83e15e0095704bed52091ab77cb9b9b04a596c67aa91c0cc4190044dab036de58b164c3b44f94608cbe789282ea80148bdc6c51b13c777ace88e27812fa9f257eb2911c1f3ed175fa6cc89acd112ee177019ff24eed27f5031feb27596f3929510d7531bb9671f23c5c2366a64f70a3fb9e1b0756bf08ca932ada698185532a564cee121e8f0d9db5e60b77fb688ec5b11cf028a26ae32353438fc34005c9c0eba16703fe491e4774a6acb3da1116e724c57c00ecb603b5ba4e0a3c02bf2b5de910a225499c5c89cbe295140bc493d9eda8eb9dcc40c0c2c12d264dfd4919669c379e6f680f0d9f62f2d667994e1da93edc2ccd48c56205cb6a45bed25fb1aedbc27fc4bd02ce5775a497637959cf3d2b6adf4e47ab63ea831589fe52e861a2d521bbcf0ccd6eb309477f72a190fc35e7f610d2d6635da708b182b7e9b18feb88fdbab3b94e3912b8a1ec30f12a9755d6d3ff290b3aa08a194818f08267a7c79e7f880338593c72ca6c7d67adc9d61002f4446b635bf820b0fb98fe99fe81d71784d8a7f9ec03e18cc0d2aae4f3494e99aa864fa7de2af9855743561b6d61fa119a7a919a340079e3ee18212cd6c67159147a2a08fe19db95dc8e4e021b8a523b67c1a6015f33b23e93905eff0799e234da84f9cfb18456465f6739febb8d3599ac9334030bf583b03eedbb621fafd6db132f138cd55cf7c555ae952de36de4391f7a0bda3aa535f5c30aadd1c7907f658446e1138bafcf5c9a816250450c215cadaaa10ade1c712979a90a6647606d1d0bd744c43f655cf5d03d7b7684bd8c43da32874e4fe881800ac294090758bd7c33a6423183f8b55dfff68647602aa3f8d55bc683ec1c24a9e557e72f3e57fb7229f314728c1ef6bdeeaddc35b97babda47d1ac64a90f9fd3ae9dba95e8fecc2bbc4353275da2e27460ff1060aa77ccdb5e3964f261b941e7b52e67604e3c134f187867c2449b5e8a0a9b4c0894c220352deb7de09f8884d2043a8573a1af9255f2d3b1a1ad680398bbac5203aa0337c217d9d7c0c42705ecb00162e83480a6412d24510b35142552a9462cc413789b463ed945e7cc2e9e8e1a01cd11095f9a919e8ae35c25b11e0f6461b605b9b0f2cbe7048c9717d58f12c4aed8f28c0ec1817c0a8ef3b019d17094987bd725847e3e1bb3bdd763e0ee9588c394c54b260f779c889ce37ef976521fc91071479b1f48b12c53b28c464f871aa4171195b1d39f3c3daa1f5935c9f0b9d295c9151edb97f7327beadc87924cfac6412c9ef71f43bcbac6090defccb65404cbec9e3eb372f4c6c2ab3fb30d5b229db29f42dd66d2d229f37c1cc5ac764a2d74182931492caf0a7734aab8629c72914cc784ade9c45880cbd6af4ac342cf7c626c6e4de66b940e2c58d37c780552be548f601cefd8c1898f828039a3c1fbda1199c10392a25d156da6c11eae689816b8c88e207388e6dbc70a8ddc247ba6e857e07a15795d03e834bbec0695d46fbec77d4fbeed2a1abe63c744ca7ff2e85e4f613654479e35c9b11d81c200522228aec9fd145a8f5ce67973a1885ddd16f7cfbaf9f74ae724497617647c4e5b64538816aba1fbe0cd729d57a2363d263315a97e92e17d7faeb09c6f39e7b0e99f79189f84b90425097b29fad5184211b6d417b26d89606b48da95c75652079695b268d2ac5690cd1d8946efb2b2c6304d54330335ba7f9874e48061fd4c6b27487ed6b1a396986397876aaf370e0b224fbad1c576e55293a0dd71d2069783c2e00aa05b1bb4c6e306dc44d8936ae21107f01621d19de9808f7a8c25eb1a3afe5b91d87e4993d7ebc9f23196062fc48090b353b7c68fd6d943bc50a407703bfe45050238788d397d4a2455dee9c953732aec28dc42ed9c82c6f79231d1ae4a795ea7e289d7ce2af5dc76fbbc791c8feda19bfe2d68fc760202b62c07453563d549d2587510d6b8ba25bd171d3f589d0bc820891b734ae794e8a13b7a1f90df485ee4067dacc48ecac4e7c22df013f1a8cf1f57f5ff3b1e30522d61928176bd56fc490970917ed1c909ed570628df2a99da10cd5d72b1f0fc962621a0da47da8a0aab7754e1fb5ed05c03dd48926d7c7c80b0d2e784b87194cbd8a240928f1b693aa03b8f57c46bd432710e70e2c442c643237b1baaea2a814d00d2d91a7ca4e39a625e54390a731a68edd84fc43853baeaea40b828058107b7dd1b0186c39f438c67aa6ce3cb03d80af9b0750f4b4adc2d05de18c4530c55305e15251df93841cc441862dcd6019aff21d932744660c5160e77a065e83861cc304e0195eb0a221e4f43c9d55991026672a8388e4fc0ba4cd3933cc336d86bc5660e07655ff41b69ad6d4236d9846c42f6de72ef280c810c220c31324fa76ebd9aa7267c3026dcc122e06928b184ccaf8483cbb004031f5f9aa589a78d9aa69efe5c4a4b784026bf2c61e04bf45c9e202e51cc7159f6ca7408670962b8c93bdc579afe0eb7d2349dcbf4134f1807972986ef6519be68ee3d56487f40e9bd242d3f4dab7dd5d76ff3729b360c0ab7d34af25a73f1f4539ecbf513ae56118dbb3ebcf5d72bf2d5347532b95aefe2d6afd0e680af9546554a5c96d84673315ad8906bbdd35cec0d95dc14775ceeb4ac71796e369ece139a27475babec64b21aaeb4163fc98222f96921bf2a78fcc8aa8a15e8e49be9b15bec36bbc54e2becb63ac54e5d5c171e6e0773e9a2ef3089d953cfecb95c1dc3258b29f6923d3c86bd244f3deb4af24364eb52b22e16cf40b92e3c5c98189861a8570c044ac9858b7b49d56bced2ed1e5edcc13c8356af4eb22e1797aaea15adaa1bfa0d81b61899a9e81de8f7b5dae62fa8744f3d74cf65ed205cba180797352c02fd55a097aa530f75a5eac4ba80f06b6efaec7c516b716479ca35e57abd42c12ccbb0cc6216bbf4c2e8b3f5ee4596b7248661988fb5d7ac8bbdac0f6ed744728c97163022bd8261913dc21ec370296b22bd52c276ba480897308c83cbd8318c75954eafc0bc85d48b9d62a799adac8dcdf2a32c7f0591e5eb2b00b29b5df63eb398cd81ddda5718cd6c86ddaba65c76a39d7160996699bedcb93b41f698619e71f87a5997120e2e5b0edbb063f4f615a3dbbbc3a54a1947d9535ccab0216cae7a3d18f27686ba073d5eeb15987bd94743b4edc840bfa10de6ab3abd1bbda80add2f01f3c5f61568ebaa67b72c0e7ba30a160cc9af0df955b1029e5c0570bd5e295db9b319523762ee9cc8300b51ad4a082126d6b46aece2ee04b9c27493719a32629d133562993d6631bdb68e569b1c7d7277651d32ae0e415c86fa52baa927cf578a8a2c934e54993ed1d03d68c2d4efabbc26f5689c4cd3b3e9d92b69e7482dbd1c438254f123cb09d0675be42c03d9ad353139891e5a31851e195eabe2899cfcb8905f152cc02203a07200c0b873f10301044acac989c951ac8b09e92626a49289c9b98c7292094ae9a484e2830f25984b3ea09c9c9c9c3cfee424a50a71411b849be5eb30eceb920b17309764d9276b71c069badd5e36b1373293b77473d6c2d7a357469d4df023997cfa8c1926f6d6fe3ae99a7521e192c538b86c6f5f73d6c549af76ab4eda5c6cafb9ead71deeb59548bffe9abb48e772e92ef06bcee21209e3e07229466693cf7830e0574c706909994dbe23cb269ded4db64713ccd9224617bd0ae09a74228934e9500aa31ea2a85b1fdc4e5e9129ea595cd12bf10a694462f168bc4c1d545282bb92bbb0afa760ecb353973b99c501755ec6ec0dfbeccf4e16275619177c342c106ed735f4526f6b67eed5917e7218d24d1e8dd2a977148f06caa95714fb9393b6d206f3b5394c6e4d6e5ffb226df628dbcbf62dbd04cca4778f5e19e1cec547a7a001ea1097bd016c11a3d718177c34de6955025df88484213d066693bbc0f009ea6dd32b247c823b928f5e31c130a49b9cfab53828c984e5828f461130a3c7c00c9f88406ed73c3245f58f5ee9b4d7afc06887a79e591cf48676db822f4eac4ea713a6cd59dcd9bf4723fb14449e7cc8d3284fb78f05f64415ea13ee2cd62123d73ffb835bef82a294ca1564eaa22d0666c9a37bc8153c15ea30c8d443b8a335c8d441b8bb328a4cfde28e443ddb248f0783c258ffe89b8afb474fffc8cff4f6e449dd7a45611c5cce375314a518d2138899007fe2ccc413b7ae696ee7854e4accc9fd58261c96fb3e44c79d2bfee40927b2409f56e977b467706870e80e0a724773d740dc3dac0fee23b28591eef1e490dc9736d246da70cdc5993cf108b182487e39be66f5c5e35a7a07fcc9a5fed6180797e52345c15087b4fb450aa69b6fba7522808798a37037e11d1806be1f63505fae91024f06e5674514b670616266660605f9816470fbeffd253cd0c9340e2ca14d7d1990b73bf9798a58340b4aa3d4502286be129229eaf227c8d6bef63c0694d862de4da73a8a9aa6074c9b63cb13772947511425539e290c7d842f6230cfed656bd3c165ac12d183919c921f113d500124bffcf2a47eeb8d5152a0b8d6a91cd66128dc71d97a9401ce648bc0c2bad81ed89bdb512ec75e8155c688d1a7f40af559ea5fa57efd73b5a1cc9458dde2141edc521145c04c71a94f658679badcb08d5ed3e3af367a34ac95924a296f79e015191ac9f07256118388f2aa88414f8e435c34b2dcf91898e5b95ee9ac17bd122f638847833efe008f46f5f85a6d3bb26c6d3487fc243f4d6f693a65f230c79ee09b98cc05ed0da438529a72c7ba4da594542d752b6d60fbc87737ee6c8e6a5f4c3efdd6481f2fcff78404adb564043a168a53cb3441f53c2581903a297d3445c23698b8eb7c9daa2e4039e8269e1486b94e5f323a82626983185ca2a7604e66559ae8881bf3fda6a648dd64b3f6a5f4be4ad4610ecdb0e7fa803b120aeeae0bdc5149613b0f3395e6219c996609f75d9c609c553b17bdba9b659a7042d6481ffd4902c95d7d4cc3c43b91fbaaa72e7dc01af314963f7217b323e60e4eeaf5fa843b6993eb637afaebe9fa147361987efc749feea151457e3ad5c1ee8e786ed2078c514fdaec5ba2c9f6f2ddba976b9aabf225b8a323dc5d12e90fe18eb3ac8b59bf18663e7bdf06b046a55d8cec7a66fbb6de63c92c0b97b0dfd7c399c8f2c3e50f18890ee26cef7e7f0c7b4e2910f807fca24abfc6c86c1d7431c8e6c6cc6cbd8b99397bbdbd655facc364b88395cd7165ebb0a765f7e48a4476695d2be58b99d24e0c7b3bf7b1b44415f9de5b998eb0b7e6c436d8a49be191f6b9568f0d608d1a296d7275511bb7bd684e56a4a7020f2fbd7aa583b1b93c7b729deab651d1baccad8379567bea32d9564aca48634729e51451dcf8e92f1164735f7f5c74103e8048240e6ef00288246526d3c8cf0a2b10c9555e72528f7a5b3c35a79c53da993b1f8dee8a548ee9717a8cd4b4c517cd4125e2bbd2fbc338b8fcde74dde196e2db4af15d7ce4b2cc312fde2b055f3735b1d71c1ada27bfecf36e36e478da2c5007fac018ed0275a08e0fac015f8c6845ee18638c3a32aaf058641672ffe1f760ece07650677a4f7bb93c3f411fd28dd047d6e81e309f881e9264eaf2e28e66b8bb18f681447a58bfbac71bb8e739a1cf538914c236bc0eca21c737863a0f46bcddc19d5ee76bac93813a3a2e1d5c96599618fac44ec2173358b5a0be940ef6ad2a644013afab358bd5c99d8c1c6feed717cff44d7170cd457c494b9778ed64e428c3861114e0800e2678d4fcc0a142a78811bb4d112d8ee98d3b9cb9e6b4ebcead73bf185dff0459363c6292320649f2bb7907ccd344518be3d49c60b44770b87bf1e00ae65ff48ac5d187531532e8f123536fda1b37e7e84f3be4a4a8cb89a2e20f79da17203285770091e5a7a5b61730c7474b8ae2762999f472f30ef89325ecc972824ff6b451719aa8384d700f2f700f99a28aa0de9f5a22a5804cedcb023285772c20cb47d8129b5804fde2f1e7fa89155a1794e63a46d27b9e3a751289c638b5105c291d8dd03e3e3e3362d45e35353f3b395fa03fd60e4fa63c8ff25473a87eba4a58abadf6aa18a5d6e50a6e57d5e49f0aa4bd45a283444df1b0706626e6ea0b8fa5f2500a219d52784f9049a8c24e951b35618fe61ad2d8b0b1419b9af910a8a6a69243f553a719a50d4813a0009f1d24f8ecd857a3caa94248c0a58dad46083dd3734ef989faf1f19964a4e4e9bcd4ca57f665f6cca9e4ad68a4878767cafbaa6bf2b17e2a1ed8dd9cce0950001422845a77878a442a9eaa0bb95f67bd2eeb227f4d6b27070ef046c69f095fd35293b5cfc2a6b49180194c3e35dbacf2e413e3a78cf392575273ca93094f0a3907c6a013097506b93f2560a3ee1422e9b4a6292355c5c75189b4a937b5a68644ea1f362d65e7c49923e5c43a9f1e233c3b3a422a0d72e8142555d59a922b3ee1464b599758a975dd449b6893838343e95673658be83c4d3e95755971264992581369228d556d76d1adea6923467e62fb34e7f3aabdb22b6e30cf4ddec6229e7c1e8c2963749b71eb2b9ae7c7e4f308d0c7ae7bc916dccedaa19bcc549523711aa7755a08143b51073307353538b85da477766c05ed058922c8c78577ce570dfedc39a313ae8c4fb8d46bc945b7ced1daf8b8d6655e161b5d14dee0b60d6e67fd64eba7573a6b273f1a6f8ab606b781f44ddfc037c147e3b94c9788ad8f0b5fb579d2898b08253545a813851085ec34474119a584b0a39c0f76c4269629b8f371c649d91042c99a3be70c599e02dd011dbdd2c92d72f77a8208c9ddf3915b8a853f1e0c68c5954fe995575f64814fa55f75f724034f05fe084412a1dcc2902243727d1bb8cf0a1714690191fcb6c8cf8a278ae49a75b44eb95da7f84a7bbb0948c445f394a7433ad14f5807a944318e99e9299ec9d3a57579d65f5eb670a91e0647993c6dddd57531d64645994a0618437ec23047dec0c74f7e55d4d06419f95521032319cabea8146e6743be2d6479d99736f2cb2e5ac20861449151783cfd04f8e935f54db8fb40ee4a930e529e2d89a04eefa9ede2e0d2d23cfde8d3569a177d9a9f99fa9d2f499699be34611c3353a730131513cdd18f3651bd7ebd86de3d260a7750647354ea21fb52bbc745815c289d0a5feb1d8d4623eb55a3d1fcbd73546118d1ad3ba99353f804779d45ef1a0c5398a246d67158d647d79e13b31bd3a95387a3eebe255eeadae8750bd917780a64738c7e824df3da97e93033c795a7774eccf0c4124fd447a199aded65114551141ec93431e7bb07f5d93f72a78d36987b273225ebebd1a87de44e9b53a58dae89a6f698ce548c318af07cbc714f691f6d134565ead6c5daabaa3d7eced11c4d5cba9fd026b2744e0eb4b9f6b9855eadced1ded11864a1374d0c600dadaa154674ecd33b1da4678f101d7b4b6397b0aa3555422ddb3a999c3d5a97ec3554494ca43db43d4c033ddb2cde4ab92b4d6e845d669e3ec9ed36177af61adaeab38dba0beb63fe3a6251200cbbf7e2693461f605747bd92beffa7535cd75866bbab52e93f65ab5d047f78eeefc1dbd258ea68736983a1a8da687460f4df724f4d15b7a3a19d5918b50bd8bebc8bdefe634e7bc1886be7ece3a7d443fe152fdd5a6e99f6e170a4da367f7a00db32f2e3e599be3ea60be9d1359e24e54d14a9a8672af8aa23dee68b784bb1b77b266591fb4d249a689d1e857cff4d1f593bbec6e30a13b91276dca7e7ff5c01ab3bb7c72978de67524bb5dcc0877d7919c7d74fa111ebd1b510c333df4d1bc48efba4746e948bb11fa34daee3637995f4378be07c6c87eb2616f8920934d0365b16454329a7d956cd97506d0b3098b9ee920e58961de91449f2525b8741f7ae603da903ac6ce999ee9785be4f9d1b51006d9dc4e07091be1d0740d77dd2367efa0cde8f1d719a687b0d128c35e5917ac8a66be25c8a25779e92065d13391e8827ed129f2c8d39f7ca75ead4fbfce006b5c47ae75a196c22b133d3bb6b575c15e45a3d717daeed6913e90e7f6f2f2e86d8db0ac8ff0bdf5fa6747a3bfbc3cc2a5d06146a71e1a9dfa0853a797c9a2197a4bcc2edadedc749032085f678031b2dfadbb72966dd7b1cdd6ad8a16c8e65297779960740187c0a1a847f9206cf85cde903bcd937a25be3b9c2d3bc9e31e03848087c7bddcc52cdfb979e4973223176a356bd543da092d04e6b413860ce9214f5e12f6e041eda964a858bc4a86577b6a0f1bf0a342cc15eba0e3ba92b8789031c209348405a8d608f76515be223b384078ccf4603144888d0f243f3c4582e0d0f038d2a333e4874d122457f0c878f1603ca9c5f411a90b4f9120389246f238d2a33324fe883649905cc19313c4e708111df8638b2457e45784db7888775b84fb1e8cc733670c91df25848d8768eebd6debe40bae51461931190fc67b85d38b4d4dac74636adc397151a1aba0224b214c9011875a6b639a18e73c35a794526229ab18adb774d7545635b75733e9a4a8535bf78031e49ba66340d1192735a7d97f97a9e0cca9f58aefb940889968eeed5c47ae335c3d4d739da169ae23d7912a48254585d3d2951430067c44c0c738377a5305895590e63a7677e34f2d2a5cc2bd4bb8fdee5ecd419adce968a904da5c0aea8b5e5102be2b75e36bce127ccb4f19037dea6b1af3111661fe7589fe85dae01edabe3c5c5a42e6f71d597ef8d6212e2d2133fc8e4c264bbc84cdd187788958378b620ac34c3130cf18981b5b106e3192e20b4490516b2a9b3cfb26cf772792ba32f2b4c99f5ce3057d1ecbf554e65f92943cdf0b09b1803df088a681e8e9e54ccf776be6e3160de1218453d3cc4fc923cff92a266995d9b357a6bf89d4d35fa5d78b2c6f8a3f11972292e6e69b26ce8ae34f7336cf5f482ef578fb58e24f549934e4a70c42cee489bb519eb369a0ca3c8974ef4f9e9fdec9a09111e77cdcde34b046fc7ccbe0b1609fef17bc95eab3af7799490744ee9a263e8e3ab6514f857adcec46fdda32f5b6d4464d9f2aeb12699ca818270fd59791b802132fdfe9f568d098d367073798bbbbd86f4c278447a8b2c6aeff5aaec427ff2e84f00e3345caf89923beeb537c4171e1cbc55a73f2c1983bb2dcbf3a76a32092600db885db5d59d2e82c7fb599978059ca9bd755f24446fae6cb12c7f385341a6eb188e718893023b5750ff67cd5126969e20cca50100ea13e9a392324e7e4e8d3b393e426bf09c4b855b98ae89c115917298fd06306d09cd128991392427acc20afcc1981ac8b8c50c82cf6945ceb227b0a3f708826b275b2def98183b4ad438a3f58920c7b80c4a321af9f938637d6ba481c241e0df8ee71216750b813cb7a5392315e510998fb2f2519e29741e1962a2c6ef2d1be54598362c890273c411e098546239089a689b49b985c268f462727241209242a199968599665269a89563212e100074e68020884615708e9e4fac9c85a6bad1d69a4d1356d04aa234d1b8d1effa3825c81742c900e69341abd4434d21e04132e14958c469aa6699a68242a196959966559763513ed26265ac948242a198d344dd334d1c805e94454e2e24454322281402412084422814024d2487bc968a469a19115100ea3fec1e7beb325bc4c096f08f7c578df729091c5902c863ce6972c7888f48a4c16441a06497202f2aba24718ea65ab7511c98248163c537cc96267da5eb2e0e971a73f2bb2d8c9cfbebc6451a4b9c713e369164462af44969456e95371a743bb2362a8c59db0c6852c095912eea4427ddccd4422943992a110a8e7d140c92f0332197491e832b962204db350e78e2c14f11504d240a2516814bad90d9598fc30b1d0463427aec1255958a35d191246577684922bcbc98c40229db8289d685911b2295c5c5990d20fa25922c25a4da864833451257e6471881eba665d4225224c2d9c692ecef8f0c335b79a9fc8d54cee301d508d1080a8aa0cc40e7000db0ffc008078412d282ac323f1a1cdc60cd1d68096146b049e3e91a5e4f1708b47a35778309e5689c7786c0b6e10971b82b05c100f06c9e2007ddec41611842d4274d0eb766544b8f11a4faf602c128542a15008240a02240acd1036b911c2886471843eba897519853025591710d67886000000884433f4676f4c3984df8331432fa2136e08040021402290289382b3500421841001080037a992a9930de1c277d80b159392918a26525141c1e645a16b18f42242f8522c604f3979def0e04c39263fa2fec10e93c69a69f91e8d9c4763a6bbbbbbfb9982b25a70be0c875a554f1ecdd13c4cf108e1be8a4e9a4c6b624fad96ace8fb11045b64afbcd78dc9cef62a625e92ca96bac15c6dd2feb8afe5c1809ff0d1b86ab5b6968d085804740084c08301cf45961c4f05c2c307860c3f51f88a90e92266c3699ae634bd6d3ea664aae78a839c93f6e55f9299f8447d91650aea95da60dea6984e6d4adc90b9a17c85df53214196d50d2aa9c500cd143b6664182ecb1051ed90d55930c58e193926120016113b894394a7d75aa7ebeaaabbad89516ced8d986128ec5ed4144f5828e2f41ed7f1b39a7e43ced7dd47a86f029442eb52b13caac44c14edcd53d7e2a04e4f591c1b688d848203883dec610f70522a69ae38c08622e8ec5a1cb12f0f31a5a0156da14ceb82b7ba655de20e2edca8c41d75f90963ede864a6955906bae2e35e7d1c3c8d2c190a7c03d1f544cd49ce23306962656c684d84c0289c615de9589fa6e91185545117d27baa1625d5891e87f5e995c561823c3f4daba29375a173966e548fafb016f11252e6172f719820cbb07919c864b3bc939738e20d09aab9fd9767c34c088b54f2c12b4f30b8c974c8127435a735f7b498d1dcb3314327cb78d1dc4b399c42edee96b2aa8d0108638c31c2ae664ee294e63a1d2fa669d2b73445494924ca28a920753020a92089444924c628a97c1f99d605be3b6a2129d9518baaabc886e813d950452da49caacfadbaf50a454a29d30d8b70bb3e923b1df38775b1f1c3c60f1b39b061d33d367260e3878d1ff792b16046856a83dceee9b8b4e0e41883cc774b848bdb477344b83337aec9568adb758fdce9785b6419e310ba47d3340f0a34d75608b7717c532059529c2c317ed13805e7c2772919de377ecdc197fb8da18d15c2ed604e7e134e19604185102ca810f26016f5757d5debdb200aee8b4f4a88bb263028832b727c2442457e590a3af987fcac90c24d8e8139be9b26eb153c972988717099c232bf0703e20ebea7c48e2c2f21f3f525a8a480353ae8a22757ef74bc1eabaaa85b170592e39459467929ff36f8f8289066795d49016bdc5441f27b8f3c1a7401e401bdf28023f16820f148da51b8d7bdc86fc6109d0d222c17ca98c7d31291e0401214773aa635dceee63b55d79aeb99a74f1c73c4b7f624fbc6443d6e5a35b5dc797ee6862fbbc18daf70a7b5c4251c339372be9706271d4b3debef5aafbcb8b571cd51a7283b06f972dfda5eb662107df4fb0aaf2602986d18483779761d5716cd2c7a8a68bb9ac31edab4e6b067db6d0ebb267ae8d7f6f2b2f64a59966559b8d37135a16dda47a351e8d3ba847049d3ae8d4696a6ddda90b5d7b4d0d639a1956c2fdb925bd64bec45b7367b91f5d13659176b5917bd6c5934975816954b4aec479b75d156729bc3b0dfede596c692b094a5282b5acb52ea9d8ed753ef66af6dd9a1c54e5d52d4ed3d758d74b5df8340a092c3d8d1ed4b8e5d265bd7b60ee6982c7ac936b2b42df46745da269345a17beb822e3dbdda426b316d4e06e66a511645518a9e528a290c032b122c304081e6a6a9be8e5e1b8f2922e469ea948a71fa682ec2ee4b0c778ac0189f457129bcf0d54a79279c26b8d3dc04893c18f1f036d77cdbd8c00dd64c8f505c999acc0289980e6d6aac0ba46c646a884cbde8523285329da23ac608a57c3a195aaa4eb0486f214306771291c9264f449a9bbec5edde815e79f907743c9e2462de919922b9833448201159201122d95a7191e895f71a30dd8807fc556861fa429eb2c8d32986441e8ce9447a069ba2379693bf3f08fabd17824007dd8baf936edb136d4abbc2a617dd44afaf4ed783105e0729831e41106619e8b5d69ee6322a6f9d13b993c931c3d87bcbb0675b1fcbb24a065bc46be918e5bbef468c09cbdea01986baeebdcbad9d88d2ad6201029ddaee15c9dbd0479fd7c9c6e3e42c381127788ad1a8f6a85f73da6462864c4c36eba1adbe52947509fd418803ad8b09fc757aead37f37486d5757438bf4bbc16c85def7a0eb2065ebd3c53866bebf98895fd688972b2eddc3c057bfb0faf5d0d6dd7991c00baab57f0fb78657890b7ffba092c36d74d0a655eb2df19ad6a5be641b410d5eb85b7bed6d07952f275c400daaf5be37f8dba00d3b688b2ef6d0ba28619fbd5e17b42ff2d8a17db1cf1eda9e062f28a6866d28dbb45e788594d2834e5d267743d80d61b7f6054ae12735ad4fb2a82fe5aa1826abedbe6ced75c15f5b1132c38ae52b8bb2b9f49455c9b84d1bbdc17df4a9029021b9c649b58fdb34cddd54d5bba68137cdc9faab6eda95e56f9db6db3d9a7b4da3833b43c69a49c2e0d1a89787b0c63e71a94f5beb01c6907380359d8707433ecbc1bd09026bd4449b5ee95fddc5d2345145f680018c01ac412f0f697aa5da2d4848584a2edf00239a6574496a965873293aa7e11f19be634dfc49a4ae4d53298d3535d9051445e8220c272cc30202419221a464aeb126da642971b22cb9a207c6e83a08b9811073406d55a1ae50eac60beb214da6b864ed6dadb8c6eed8cf1651fdfa7bbd8285e8056fe8d4ba6011c209fa0051630408ecd0ba84e8759bb39f6f6c7bb9b29488ba887089c20e3b1da44c4d269aab97d68807133fbd31288a1bbfc5ae487abb88c4e108cdf5d56e30f6d5626a775099a272759136dad3adbe255a990ced8d4a865798ddeb99dd40a70f6dd45b227cb5d6055eb0a5e3b3eb20e576695c8a18c764a2b9ecb2b9cc8546dce9b8b22d3291ede186bdf634075d2ade4165db39912b8cb5620163c008df2e4a5887f6a57ab16e6db4b96a2335276fbd00f1a35d90f917de1d5428a1b091982572e3945056014f2c2f43488c1cb10723bea5ed143a2cc7979765733266a22d723b2d4b2dce1883c6c2ed27bb8790e1e0d2688ddc7945a6625b30dcecfdccfabca497f5685d3afbbcaedbad93c9b6efbd7f79f9e212e830f7fd8bdf41b72e93a9184c2657d875eab25bafbc0b439bfa6e51eb425154f54744e85448be923279da607e1cf5678f8879a23c9e8947b5456e3ca9be940c07577ee6402cb4c8355e8f9b6f7b44cc11d3e6a270dbc883f19a28c93f22a83fdccdc8ef32a68c877f8027aa7c160bef59f1021ae4a7013a23350d885a6fe56e7248dcbd85efbd0f74908b78ef756fbd3e8ce7d6575fe6825baf3a2fac46d06daeb25ead11ee7d91a9f5a51e242919a71e3c9638331de1e4dd0de2cc4416188448963fc11d090299692091264b08a405f73a559dce78341e0b7c2a27af0a02a2a24fde4d43ac1e087149a44f87708f90e585783735214b3915c957287163cb1773cd9d3ce5f56da00c17510f3a08d72ac4d6c17c62e194e64e2ed8d7c9ebdda69b29a3b9d5e9ed09ae1e9fb2bd2c4137658319ce44d9238ff48a8f1c82c92b241540727c8d553dc915946b95eb0f97f9b14c37dc7bb7d64a41afaf401c5a971fcec01a29978729802a782b425c72ef288bcabb4b23a39e4a8d8fab4fd9de8b519f6df52af55cad105421b420fcaef5ecd5d6554fb1bebdbe62d90d804a00ded24208017a0aee60be4f88ccb2ac1cdb33dc815e0f033ace528278a5aea08c9804b1a504405e65eb24ad225f63bdb5d1e6ea610ac40902814020420869164ea788bc028b5ef1e144b2dcc93c591ac9f242482a24155248b60366d09790b97e47962b06c0bbe9667bc54bc00cfab345808ebb98e550d12bd6254e64a25740b84b39e8f2150413c4636016e229183e7185d86410d025853417bae41049854bf6c4f5e1f658660511a233edf48a0f928a3c24cb894896071d3e713b89f302c230a0e3c3c89ce66490e6e4df9c70b24cb9101bb7b516ad227132e95d9cc943a01048054e0c027754a660088405d77a9554f44acae5c94eadd7eb9aa926aac8d3143cdd4c3537c31d95bf90007179bcc5c0bce198ad5eefa69be9e6d10032e1f40a10979f82f48a45330a0a29a3fc3d946f52881cd29cac37374060494573f2f6ef241543a8bfe9958639e2ebe5cd0464c279341e8ef8fa6a0998abb7441f3694adbb77eba496bbe9463b91546449da4cb69b9b2c3fda94a0a82894446479d12af205073a405d5e474bb3d01936fefac510f2d50c5b18dbbe556a9eeb52aa4d36376de1233f6a93b2b94767523a0036a8ef665824fff041ca1f5a54010743204af7441f6ba3163d91eecc51439f4e8a3edacbb2a1e8249312eca24aa609da3426a936987a27b27401fbd5f4a62eaa7621add74b1f2e2b1fa216b9e525ee531d572731c530f296c8c886523d4de26640fc1a6974aaaaa8057de8b22f3ebc2b7d12349ffc35cb09103f6014dc513a5913ee60d532f940514af8cabae787655954a609277aa24f4c92bbf91898ea4ee496d6a30fac214fe34feee614b5c8f4d392518b3cad4f1386e95753ac5a5a15cbe80363ccbbd8ecc9d67d5edc5112eee835c1ddc51d8984bbe38e13e18e0355a06a5118eaf23da71647ea11dce9b8aa45310cd5bd5a94ba048170e97af6f9962422cbf18d2a31fe71a300c0f0e698c6d89ff258864136957d9187a9a83cbc89bf31b201d69036c370d74732bc219162d53d9475b1d445558be2a05e519f147555b7e8d4f591dc7fa4c886a8d23329a5d3b3e400288aea32b9b798992b1cd90063ccb744aa4586b6f1bb518b3cb7249a6ba2b978383393883fef47664b411582e0e4fe4920f9d76284a4ded246e07e3b2fcf4de1d72a2f9ab352b8dddbc9f26f0f5926a1459637a20136d060a306a7614b2b5f91686efe01cd1921bbbbbbf1079a9b72821ff8e94073b37b487cf4caa431f34c34b10367e6218f667944cc9a3c6de0ca6484119346160e5223982bc873e2980763de0ab73f1d62d99d2113cdc520813713a4a4c8c9d3f41c31d0dcf42cf294863c4d73c853059eca4481076382407a65e2d12b2f0fd2f44a8f5e29517fb97b4460cd74e8a3591e1113e491a713c9c38fdc419c3c9d89e94d4c5b039a9b0e2dfc61adb8dd8934a0571efc44a27f64812b782ad361406b902718459e4e4d90c78331bda5b3b5c28d6f1e3067087dbd62d169d2cda298758be292252d6a9d520a2deb16a5b6bb638c317ecaebaaf1b2b23559d99c55ff268aa2aeebfacbcbd7f578c55bbb5932d9da745cb9c2951430c604244f6f89d40f6833b74832e7ec39e79c344f3823ce9e3dbbe79c9f73ce39dfcd7830e62d912ba7da1796d1dc9c55e8f99732631470e60597d29c9c8f7922204b2e9c004f467673e357e43190815e29cd73a003314dc0cb9f5fe2a0c686566a87dbd12c6964991155e429bd12c2f75ef7824616043c15f929dc2bc41953b8f1bd3d19cdbd78d1135fe0052cba50862a658cb96734273f4496335a450e6177eefcd4805e7979193ea04b41a2272f6e8b6a5f2251275744efea53eaf6a2be4ba9e75ef44aedec969292634aaf88a0c5b1802ce2ea5f7d4bc7c07c6fc51341f2bc42a0d7277ee47bc43de82d5d53600d25608ea99df2684898734aaf28d139a6b328e5d188393e88b722aa9ff6a554f10d58ba21facc32db1b17b4399e4e161d04023d9d0cea20e81046e819c9b52fb34e17685ba2334809d09588a119be18a1c790720edd1c1984e1e342f7d4e28819f4da0fc696d88e9841f83d18216c4473f142a25762eeee8db81b12303ffb80e6ae76dfdddef59a0512314f5f0c9cf56e4c48315cab4bc993457b7cd5361eda597022343cc57de87356b366675edb4a13938878ad428132ccf89447e385f0d55c49f45712e16a1e04c21dd4c9d4755c39445935dc17f1b7a6702f729431448e336cf40ae811c3b05028f4979743b8243a0c06457143785ef436d076b72e26945d26dfed614358dcc19c5cc9646abd1823f52e2547aa9ad394f35114a84735b891524aa94280fc8e80fcbebd159972df911eb10f78067e51a593915fe3f76074004079c76514dc3751256eaf46638804c688db041e17ffe3d5beb01f3ac841f7cd7481a78204d64002c6888f6f10a2861c5f861c2540871c6f95683024c2b6088bdbe6c53cbda5219247637aacf085e1e0caad813c9b2b7acf3b3b537adc3737b8d52711a6520918da3a993bb82151026e37251bd4a2b9786deb622466839b6bcf676dd007fedcebfec6d15b3b099d74935275f1d3387dd3406207c9b1aa24e50099182902994cf10880c88d4ba2bea893c832096c8a6e5ea294ab4b5ce15245bda24e5bb475d4add069375d55f75685aa1879bd314ce814c3b8784b79e2e2d64b9bc551df6f7bc30596cd9de05b13135b72ad966c9d1359939a3629ed3d4bb4db53da5bdac7c4ac75b2471a1edd8ede9bace6e1b59f7dfb7950cf066136b8251c304f87a1435cba515fdde9b7fede57a2fa7b5f753727917d388a0a45095d6e1d766aaabfbfb8ab2e9a7007e9a65d6e14a54eb5ce99e8d3342f73e8afb950488461aad70adf5b37779792ad63d62beb62af5a31fcf1d9c1854fa28978263a7824471ea8436407ce3c1a4568582411b18328c8f1b005394228728438c85127c6215b20896f40af74d4885e994e91882c401ce51df521e2287dc0140ff1626219cda5e494e660f79c3401d230a35766afcc98743aa5550eb72f65a4604f86544e3851dd13bc31bef8705f1e53480c699a83357d00f81e3e6e07618c315ed11ca4018f2245a822ad024fe12e36f1855ba22e93a9e914fd4431a402c31c0a431c38038bcce07690a68896214d64b1d12af090523792483fc7c9681b4d74749a648c119770c858ba4165180a7fa003b971065ae65b03696860210d3683dbd980b7d18007502003bdf2f2c4323af0814ee25948536303718690d1f111e21898fb1814b7bb32bc9ae5118192f202f65c3df50971fb13caeb13471e4fe5e59717bce0a9bcdc652f2ed8e2a9bc3ce16e7e9226398220778c71638144c45f26b9bf83a8932509070707070a9a77b56d1bfa1355e429b4813f36d006fefcfc501774818dd354cc4e72697336c86d1c1ccbb258b8b0933444c063e9244f45dea56f841f196be0ccf03090b870afd078782cd0a64f1e4b1b892af23288c0fde03a20d1e0be20ab20cb2d4b952c0990c44864691c1c23384670707a903304213af0274977646923462e097791e6789abbc248648938883d18c28d47c8f28d8d7492fe49d22b1ded22bd02299c73ceb70ff9ea90e56507793098846234dd03f2f0d821cb24dd4bd24972f60348102804ea34dcc95e6d126612c0dc3891858483d33859be92224b27892af29492b23c723b9205e21eee4d1259449734d4499264a9021fdab667292067ee067f401bf8b305fce91524d0de059da0b4765a97aaa29452fac6fd0c6edd65b72e26db67dbc3ac4cb69b8e2b5f14489d6e6dd3ba541346692e0a17622ad1703b455e4dca4195ff63a16f9a8ce4ae7b27b2d0ee91cd43e9bd24d2cf71547294823a5c9d9611f294bb324833aec3ede48ee3c16470bbe893236a13172728e7b8e8d33528b89351c2dde339c13e6fc705ee8ebba743d27037a3717745d887a3a6c9d3042353e891c76a702410ca43f14c3c3c9125527a6f7d5802913832484d64e9233c15f9264ca1af90e5273cb19adbc99b9b5ee9a804022980019f0c58977f00f742c61033ae972fbb52bafe729d2292b8859ca134b246daec3c1a1616494852995022bd225faf5e7994475b9b357b621b24b2c1213f2ef60e0ec952a739793bdc50f3b064703bb89329d0dc94873ba2fff04e860fef3894773f794772f19dae91f103ee6474b1a6e38e82bb9fe08e745de0eed6bcc7126b5a455e147d4051dcae892c92deee525c7373f372177d6a769a93bf892c92e7ca939f604944ee14694ef268d666d3703ba9e323752411b903fab4af3950f7658f2ed674fd06f9a3577cb4883f11494c12b798a197279797363bf1cfda79d6ceb3ac6dd4350f86bcb5c27dcd9570f7b0e048b87b57d43cfa883f80f4cab35ef2f74a6ee1be40bc847417dbc956a2fef2b3a423f2fd864723dea2db7c9daccbfc34554128a55e9e4c3e3f6f627d6ed3adadc28131e6a9695a5590c9a24e858da5f358d789b66e00593e240fda3a2973660d69164904d6d89ccb1de4d140e00ef298fe60be3698d31cade01fb41102337c47e54fa9014053a91d6e8ca7124f630c6b86db97d9abebfa555515fdb5bdebb1dee4a36b5b07ba5672ddc4c4c5b19fbce4c2e4264f3111897eb2dde6442f79e826076d2f2f97bc46eb6282dfbd4c9a2829b946b85432fae8ba30288a2bff9a33793419fd2a29799665d94b4a4c4a4c48a45fd79f35218db6eca3eb2626d9757d74932cfb75917e5d2d71079549a45176d2cb9a6c4e746ceb6e16d1e6442dad55d7abaccaaa0e2557bf3a66576655a21ada3268efabcbec15e8d5cdaaaae45528749148646262f297974d70897418936737c1af39936727fd5e265f5b77e5eb255b0773c9471b69db3a9a2fedcf8e2e93475ae857486485300459bf1bc8e666c7b2ceae0cd3e65ac65ed5abb774876259d5e5836219b675f515befa51bf951583e89db67525af1505dd64a49d5ed28b3638041269ceba89756d1b5df492aa3a7ccd89aed12cabb20c97b4ec5955490b8ae28af0455927932f868d304c341289b0d02b5128c39e65d54555f54c8461afaa9048f4aa6a893ba81ccab08bb6ead986bd90759005739ab32e93af0ada2362c6905aa7dbcbd5b2f06b501437763c2543b52a659fb8d56b955bec4d08d8ed56a7f76c91598539e7ac1e6dac142f937fd4cbe4c6160b5d03e91c208dd32cd8ad1fcd5936cd5942a0391116f5485ba531655d321ddc863a9d63592bd6ed656bbd6bf068d85b6f1bc01af5d6abedd9b2b69e018c6175cfd61b37140f86f52c07d7fa912deb28b086656957adb1c65b18a675a8375401e7487dbd22e7843deeec5e736f9626c64c4c3db70fe820f5b4b9af344def99e7f492b49d98884bb89e3db3b716f6b02c6c73d46c5df6e565f9f75eb6d2c55eaf35abb55698f9aa5ab32c56eb2d0d5d006bd4470bba9db087c535eb2c862ec02d6d71691efba5ac5bdcddb06e6f6fb16ae32976fb72ddd60bbb115f8ff852d8bae8906c66d6de5a8cc934611fad78486373478f592bbbc50e69600deb58076b7247a345b1d3cc823d6c4718fbfa98c57afb2d6e99ccd966ed67c5167d056fad35a35e551965dfd2192e51c74e7f23cbf1b5a7d93b1def64c63eed4b761858657fb4bf327b0c9b999a32d59520d7d778590b537f658baf5a6f3799a9fa2cebd005b0c6853d72c5f0b3f3147b7db864c4cbd85f5ec6b0c767d8e3b12893adcd36cc5eb893991eba00c698b0c4548444be0a0bea4172cde25f4a1779f294bd5e577c0ffb8b90263794396a7e997da12bdd93a20ad22bef51364f75d1863d6ed5eb46757cd8a2de297a53e1bc53959027edab8cb7e4ad9c48c158b69202d6a01e9f15bdf8dea32a75ea1d512d0a97ece1abd6692bde23ee6ebcc71cef117655900c31fb221fed836f9ec81273ded58de461281cad88c0732171cc79b813c1ca48c331c7c2c29ad94ed9c618238e97f1f2c9ee0439e65709c95d75181f7588036bbc435ce5e4aea2a8bf57f1b1ab8290e0a9f423f0589288483c1aa24b0c825047252186399c6995a68fdb56c5186f69f50a07c688afec0b7d7db53deca1cd3aedae7c37da3a24782cade94496a8d3563c9668051659f6702665773d2acb7089dec22277cd0367a2158f053ef154ba79e46da8abd371611b120f86f5695fa8c354b883d2e6b8ac77049e8ac5932d2c7b5e25057659f6da66a653a601ae7da8f48c95d5552c19a211000000001314402030140c070463b158382a9765397b14800c9bae526c509b66498e53c81863900120300000020000c1244800b5aff221b79000fb1315ba51b9b2cddfa045fecc9eb7daa0bcd30545994d6b81def239441d8853d9a1f557714ff8a3747403740da96f299a327661b427344e438f631fd7adb24bcdd6b3391534ef69def83131b9d11059809991b081022d039433b28717f4b8eb469830018f1c1b2511ee1fd11e73895d2314b6becb5a49dc237c88f7a1732f73db6161185847d4b94f1059f3d3c05a3835895ba4a92da1bdd68d5f6ba40702e7e24165efd89ec31c969d3c9be5cc8876a28aaab5d1974ebf05ab799a5e524615fc90524aaf12e99b4e4da114c7d4a85b7fd37b80fa4d036de13b6ed4033ecff504c59da3a891c4059de49b5bb98a8a88b0568e25f21b9ee2ae50ea1b1ec1426b4f69256d6002bfb419b0de702d27f1ea05544b2c4ff7bb9ae9084818307f9d8209c17033bdedc5e9a9c7ad8d99c487128cb4b7387982756c801451253ebaea3585f2846543af415fd6bb92561ae201bd10529a7a7838673cd6f53f983f7251209ac5d886cc85240077d0b76cfbdee27429730d582356168533a170bb5d36471d43236cfda9d55437299231813ea4beaca8b0e21d111c37011c11982ba2591c6936cb5d48391f092c5287dad64709f6a57aa4ad169c8283551f5af1b4f81cc90bb085aac5539baf380227ec1abe808b2c801d16e4d4fc390302293af69b39e4f2def0b3de389603b9332612f2a51c52df7fc0ce724fdac5b067488bb5c3e8a3c130206180ed4e4b8337ac52f4b542a01fb378354cff0a9cdf1dc181c9a9b7317fdd3502cc0ae5c93910cf41241222fd7e577e5655aa4dbd4accae7a899ca489d3ec80e102da05deb54421410e6f0d1fcc68fe87405ed5a62d9d1dfd6317c5902697077fdea865e9e938678862c482ee2735cb55826d348f7e9c6b56338ef78eee735bbe16e2b103f4cad79c14b83112a778aee2e55764ffb6d081fb641ab92939f6c4bc25bc6495aa1fbee59e81ea3bb720098114c121460bdd9867601219a791aa8b82e07a6d9f8230f0a22700ee0777fac4733608aea3b2b4bcbfadc0e2d9f1d5427887a56f5660934e55e965247fdbc8076e50a06913f939adc0a782a27c105e20fa21e09adface39863de7228227d4ab399d14148ad0558315c79f00af3abba4d18ebf8bdfaf8c4f66cc35e2aec95f531297fe61ecf2b6e51623f89cdcd42b06eacb9dcca6e62e97fadf703aeb38f8bd1c2bd043c4b2bc3e8e476afea18953a2e1923f9d3c60ca95eb29b446a00aa1478639491ed9796a6f40ab97f08bc26749412083be65a48de879f175baa7c8d987350353809adb7a180732ae74e907a44be9cabb1a6f07eac20270e63c4876f3bd3bfb60ebb8870a153facf76bae1edad40388f0ee10c08879d75410063c17774d7c9e4074dc96106d378a42fd2555e413e0827d67ae890db6cabf9d3430cf481abb2124ee4d4e7194e789735c98946f5287eb7a36cd1d3437aa124cf09c3690822cabcf7d1eaef8fd653043285d20187443ab113680090633f5f155ed5017561fa0aad8db34512b2fdf5a1a7a5a0157058437dd979230b93e57eff8f0515c437f040feb9bec366f8d3bb29adb03bd3852c9d1a808b947421f32b32282044b8c8aa0ee434b3c18011e92e240f79e41e7f7a3cd1992da8cdc7adf217cd671c37d01700e5f09e97923ce1df1e281149091b21dcea344f68dabdce855fe30e96966f1ce94461325bc8b311b842f866d30cafb8ce6fba0fad84c0a2dccab8744ac00d06d1ee02fbd38b43162a4fc58265c9ebabb54e8fb98f9472ebed0128f8abd0fa15259ebac26509b520812747cab31a07d437d26a86d82b5a8810e6c83a0facafccd5dddfa4a4a24885af7d6c30e897d5f47834facec1dc22f6ed0f92a65229b75ebe3eee34d610df7da8a1e7a0ceaf49e6f8f427ecf3385d8b0fa8615dedb5d1117438c7f1edd7ab0e34172f44293e85518e56ac88894029b73275e0df7aac58d0d285684f6d593e4debcfb7553c2139adbf516d0d608291fa3e570539e67a2d40a49dfcffb7481ce67e9b9739a8f708994aeed94222824f5fc50d965468794fe09658a086852cef4bc53fd6af89d81d8564d794b64fb1d18ffb88fcd40157b32c1c9db45dd71c1074104ff3ebb3847a1dc6b792919d1fad142819575928dcef261cbe78c8e7e0f1418ed3ea7411caf6f1312a29e1b6e6c7c1bfb3f772a0196f2ab8876f282000562dbb37db083d169536dee71ff682cc7850fc70fa7717367c25226fa600665ca7e99f147faf35659ceee8fe2f4938e7d9ddc957cda663ce198b543a55b74c7dad8194157bdd680b69a9dbc6e5d8ca7931165a6c8fdda192fbebb03e472a2dd3b444a9823cd4387d6a42e0d5a7d44aed54195362e9bf5f7d6b880f740994f10c3dc265c23adb33f30ca386ab90b2f7f430caaaf12a1959ae0bfe1743d0b0fb27747e147682346994e2bab55213b9bbaea1f336dc10ba0414b64353d37bd48f7ac1e865147cc7a1c5a86bac41fdd08f87704b08ffadf7dbc4594dcaf1703873c2cb817a706bb14efb8017e4f13bdee2e2d71012c0b104354b5e32fa2cdf8db5aa327713f6cf6e962982d808629a69bba07ce63a15c5ad097794df0b94358a49f69c1e0e7011aeecc4c47a6a59ec81127d7284cc7b321f2f5d632efe763815e77b1073d1f160c04daa0f478c3b56538c6c1460a5d027fc55d95f558d70b009064540d62284703379245b353c276f3f055e0cbfc5fa8ce22fd5cc740a9da3760f8929c95aad1d17369901d274868a1449677f4ba56c566db6e2cc45a957e98242db5129c20cd509796da0e4b785418544dbe6f179b3e2116867a241c67b5a46930d38200a8167abd625bc7226ddfd3b4b14f9a4086eee36358ed78a9ee44d31ceda216626e8fbadd0467a928b383a5c45203519637d1cf7db6eae20708ebe6ab9d19362dede563f9a68a007c605078481b26a6f120d0e9573d55ab39fabf4da9cbd4d5fd9f196c43a40d216197cb12b0c4b1e01010732eba06238ede36b20fd94aa161e0377fc1b9e6609a1a59d448a2de555dcba680f40b2c9c00670d9aec07826ee141fa4f74f602b7c850786c6d6b0d36b249126ffb4162127617a10c37ca411aef1c46dfc6a3a0ef247698279227c2f2ff56f6fd09f7bf7511062a5346288286494d20ab5eda405436b5bc41f7f5b88b1a12d673b281f8e5fb51d260d4312b692ae6e70a6009326978cc69afa77d420d22f3a796b2144bb2a2d17443ace86b58d3d7a6a3f6ff03663c01ae8c01288b083d7f3405acd41e3567dc8659049d569657c7a73d1c2b525db8854b91df59f7d9482aad4a0a273d3080c686148be174cf7a18baa73360e927346d0a7413937054cb415b4c0e7f7f1dc2ab459be09f1a61f5a00fdf7c39f1990dd81a9e94e7f2b8b351b810798c1af0706b972aff8ab705394019a50c829a621d0a13020b989c64f9174ffe02309cec18a9f7de675cafa003f38cc5f6c6cacfbf3b429dbe3fe44b9e0f89c6aee4d04e11c2b891a5e48c02d850d404cc4b1e0aa6cb5c79cbac5635f8e7e898da4e40a85035d818e4057507dd10049e77372a159616a99991a0c566bef8701df8665234c48135c799b14009d1de10fd00ac0deab32ef815b909ec42cf3391e503f4fcb28d4bb82cf98c4c305e2198903c29f9764505b62ceb186f39361999c36f7479afb0d1366701cc9f4efd0aa35380417ecec931cd0d05f04dc59d09179860cfe2a4ecdd4de2795fcbc414bc28255fd7382ea68fb6d9ef32e3f8fda27048d29c9aebd8a96ddda49d15f6e6a16ce84a6a2e0c6687099a02fe5f53d7db5d8e70749c62256d9d1509e630e2200e87e20b2242dd375cfa1b2884e8874d2d300c13977bebff486ffb3d376bd39a678e6908780ee894e54c40457d3be4c2e3f3d7589d36b8bd90c66e9aa28428e88032b536b01ff4991d8f455562e468ab544243e4059d0fce3ce912fde4ce96f5c5d86be74b400f352cccd2bda34b98d902656225dcca0bf1215d9c4f3a04ee07a102f79607d894c15b520cf94bc20539e30a3139618f0b2ae991944eac33555806ace8815ef2d4942408a0c7dbac667f55464e94d029552666aca6cd78a4f2745f8995e4d7df39c554a4fea3f122b90a8145f134d82e0e426048f7601e5b814318627260aa7e492452584904659a035db933fab03307922c5850f9c3e3f80153ca2f07c105562f1fd9110cf1997e582d894c2256a9d9573bb4489a8474aa41e3693cf1e0a822bef4cf65b11f5a4a8029ba02c0c42a9fbd30b18c701bb695b6c49108a529e83d7adcc984efde72b148bbf9d0d410ac3815c67bb7235279b39263192ec419cd0d1d21dba8ca77dec960941ecec3a73ca78f7d921e2742324299e42e36145272d73f3daaa3b32cb64dc73e7e11ae0724c36444a7f3593f90f57394155ae50cc75c7b3be2cd2b77698d70bcf480d476ff5addbbb62d8c692effff0e839ccff56b39b1f2f3e42c07ef091973e32ad8e576dd62bc5db188246c49dc4e225f8e9b3444496521eacf492bca814b856a092022adc4b357dea27f3b509ef706195aaeafb674f316201592169d15b7e34b6b7dcd3624c4d2a2f3aaa280cf6bc62fc4b625d592e1cbc0e045ea972bcf577e61a54fe508746ac4db594b63ea1479d9213704067771a46c000bf73ca439b138c89462e4b71e60b465863e5a830f987a2f4c8148a729b447fcb0970378090653ee0da33ea42579bb094508ae023b4a1bef594f80a4664d9f8192c8caba682de15f9054085526f475017e0744235633ed6427a1acb49617d864f754ce006a5f3d9b886a969f0dab7c9a0e25c26e52ed01789c521e4a8484c7ac187ab77830d93b37ba7775fe4901f955a189d6d12acc6d774d8a62c32825300638efa3ca2745e7253a6c958a6e528f3e1d2d6d07b7e09a8d6010f8d2c2fbd6f74df3e975e939d13a966f3b4f2a947fed907495985a8bead785312a1639d7d72c4f6bea24990a8c8cca9bbe213d0078453fc6cba19eb9d56383a29842b2887f13adc50f1f070c548156792d40befa3f9b0d03c9e01f14a3ee54832f64f2ea07553fdc2391ef2e11db2a984224cd6d72a96322b39f256f86f5e41cefa96899930cc9b4a5d0a0c3dd51d17a4f0decd6592bb2c56dd4549e6d015accaf663def3da3a096334456d8a55565e8e88af26336c13556b3317d3f3c403744c0622b34cb32e6f0e326a3c900c0341264e47774bb1ecc90abd8d095d0aeaf2959e1d3c102e14ae57c76f3463f39ea8d24ae6a4c0fef2a4976dbf43d4bef935ee62ec91a6e3ecbb0341b0798e700907b18486811672b4731e67b841cfcfd40d657254f9870f8025dc6234ac6ea919f1a0b98f3e91ee81da4b21ad806b8e516bd36c71caf57c147dfc68118e63e75881f3116f2b16a8a04a688245dd4ce602d57a8e1fece5300a88ed5c7bfdef5827e01c1538c652d684fa8a62490897e5a06c3eef44b981423189de5103577ce10c5fbaf024526d2ec86303f3bb347277b133311cb3f4a3b88fefb48bcb1adf7d56d3c266d9c9f2472dcbfeab72476372eb39d94ff204c7b00c20cf62295cb247f0780f3f0c191c699e27ad98bd6ad7d902d61c017ffeddc7809eec2f7e80c3798daa49a98109b9967c5f98d2877904a8bc4f2e7b6402f80b67493838050b51f4c1604b64ad9544b0d8363a2634fa1c225f56330f6b3814e04ea164e1584f93885a37252241118da29b510fdaa614d122da442385e61eae903d63fe5983233814a91ab9a99446d156724996ee2bfbb91c85bbe8869a463b02bef01565d2d1fca5d87ae23939bb532473c16fb7f8150a32202f5ee2eb015168f0249ed84b7a65506e2fa3dc4c0e81ef4cd4becd4a616a6c2312f5213e91dbdfb35344c5d9c7435cab45193fd499fa6f5e31ab83d00ba5bc58aae10cd0715ea6110af6f84d249795a187a95dcbff80daa1749383b310e6c1ee068247a9a2e2c321a81596a2b99a0c6296c9c9b86525394313a38ba1aacfbfe75b48727060e14985187ba0242012d0c22c9b7508194a8c04e825ec9734f62816d4c2d3836f085b9a4d6bb97f7af0ec2a85041948a5bfd2bebb5a1a5339ce729ed0965d2ff1598f3e1e533b95266c4655613c4e21abd7bb0ac82ddc8b4d58331c10c31c8726a981eb3d30f4e28e9863814f42bcdb1666cfa6729db5206317db924f669482766561ad27259112aeb6ba8970fd52fee40208afed5fca1e679942c532456e1aac12a242b3f56f55b592fd569fb384291a0b4ff0d8682e2d9caa8d46386f0ffa8a30aa9541380801f27f5b60246c574b1ca170dd2ea886bfe473ad6e055d09bb62ff5850410e7b231aeea855da2aa8a41b79ff88ecc025902d5298ddeb2a84f2caa44f7fce1912de93750c51c3751f352a5034d253f986699495c1fd794bf0c8be082132943c1896959f231804762f5559b336de265e0370c719cd9ede74524f81dcb8b113a10e29df401290276c786cd4cc09d5d7e51492a054b087d25001c13bdc4bf88100c13d9221e2551ce580e9ed18cebd617aff59fe07eb683a72bfb8d716e84a66a252807fc2c67a452ab3452569a9bd95012a5f94f7e24bb6fa5e83a53713ec4dd8f9b50865730b71fe236aa94f6bd2d34a8c97f4ba56ca4bd803cfac2a9f0953420e4fe2eb6862e041b5540592d9200a09f5e320e9a6ddbc34585810912d0dccc79697064241a9d960d88a941075580053b89728f0e1e893f31b71b12da846bae282b62ca40f9dc61598b2ee2c32dd7708064ab0ac6941528e99a36c3431c5988949973599e47c4988655f5ec961646e9933af5bc9490d159f90a0fb61fd81c8eb8b4771298592e20f3af206aab923a862a3d9570344d21e271588984019e7eff9a8d581442f954c4770eac33e2e251f0c6c8e10662837feffc8245cb11920f7629718d6b985651616e9efbf30c5130bfd0111922889ae233631b11014f1206705d7a93c0f14994f68a82a14e93528350f01189a024391c97ed78222a2300482499a916a2812cc234863a467f923e046446067cf1f31f120a1d546a834a7c360e53fe5c9f0c8d712064860bfaefb7f02a0f3026bb45e4fe73c893c702c86e4bb6a3a5420af1f11c27b43090bf5701810f514eb6ac78165854181f0f1dd3ee0b53263ac31b5dc50f3653eea8df19476688f15f9603612a92d9e098aeca8a5ea8142336fd2b8252d6c2404ab3888500722117d23f50d6231f6876d6b6f2a26eb6b4e58c08877ef647d11be216c15b021e5e33f28a7e5660dbdba11ab3850b0393fce875a0a6ac79fcb21c7451d94e35bdbcbf4d778a80e9d7f51e6b18ebb9e70a454b3b0a26415f1184d67df86be84e68f27e5688b75b5d5748229b4cce523b09deda1b00362eb65298b03a99b60f58483d025c8a5a721dd9a41cd5a248b9d42bfd72202d4012b8b395264d765dae581d182b8e199e48f139174088bea5a1deabd1713464be68240dfdbd662251e2d264b29358c20f646c61fd86ec06d824c2271fb0318f10a27dcd97a9b0e2d3a04c795ad3e0d8e6e9f37a393880d7d3fece448d02d8defc51d8525032931754eca9756bfa267700d8538113b11dd8d704a24225f29ceda521abd31d06bc34e8bf6373d3d5c7b59b0835b099830ad6a61ee3a4fd5cbb92a2f66bc8b30cd40c89cd434e833d104c6daf9df3d67a84800800bbf46a75862ae4b13e0323358e492ec085b914a2fbff3d28e98d339a616f258f9efdc8068be066360848fb02be144fff1197f7ed3a7fc8d9311913aeb9dd4954519adb2300ce2ef744ba0528ec3948f1336df9121292b85cd95fa5a6f990b6a690d3c3bad16359cf77e4329e2fc89054ac03faf94ec4f69cd549606e09660c23f92a2cbf2bb2bd46dc13dc99f772eef219bd41c24d50be0706724fe20cd1e1c26226fe3460bf41cc057c782bc89f3e5a9b74202c9842638882dfd5ff8248d1c2071ff8fc52d22405c1fd91d99e4f1ec0170a1bd4479c560c8ed684a345fb8b5ccbe461252190c362936999eda71772497bce26205def90fafa4411d057e6039216630caa963a7196a1746b59e73b91e0f328c592ecac14cc38d466dd97792a5ae03060b5e26050abab52df9863e1f24d8914447b71c39a8a42a38241dcefa154e69ef201ebec2e2df37143a528bbe324e5b2d4687b2b6da4b7c898baebf42e71e3e645e280bc84080b5f0641518f7f97e89ebe074be229625d596d321cf0cad8e358a1ae130e0d56453b8beccee1a8f4c5c5abe542b18e6c5e58abe3e6eb7188c54ce02afd9092bb2a22d2419e0eba9df7e0ac2ac8a7d6144e62b2f28a4083b6d4bad4134ca50e725c1d82d288d15ae044c41c49a71c6f4e68175a0fcfd41f8f4a0d7f6fd64276719970644709808a528d1bad143be33482922ad7d31345f76290038fbaaf54aa8ad795ceab8df11070a063b79012c831837f4e1b969b685d8d88e440211c679a264df692cf4959ac96ccd1fb976b009cb472a13a8f7b853d16a4adb06d195a6e60dbc9dafb4a103fdbb06a4ff4baaa193046aca8f69f3efe19be810d08bc6b83c11087954475d0e38e2f9829566072c3e69d3347ac3e4f25310d88b9072a9c48278834e70901fc7a082f5b5e0f09a3f85a3253603a7d10011aa11fc30d5293c4d57fe56992342a2e66eb60346f2d7f6c4d18dd8cc6d7683aee6473a3f0f9ea8e6fd1f02391f823c5f045cdb20cc6dff0ea2269544d9dcad8e76794c57a5f87e610bfc3bd22b07d7f94f00786c1cc6c92d001855989b831bbf7fe5d189686f6ae52ae67f91f8f87bad86f978fc5278a060df3c0948a2febe4639dea548d8eced34292bead3d74a7348132d6604b9b6f68546f35e1977eb2e45ce609a0a25db364f2350db7632f7dee01bca235b6e44e27072cc66853c6969638e0cf958e66307c6636ec5a2c1ce37a0ce35c79e2204cb1ace371115124e8249aa228173477f44be82abaa6862ad982f5b7a6d87948fdb67376105d981e22644c57822cd9801eb644bbf581b3163688052b72550b121e3b6134234f3dbe69620b4fb9e2a1bb2d1ae85d4097a4386bc884e70190a4ad97fc47b8bfbfddbfd5d629e05b49f06a52876530a7aad3753c3bab87afa23cc85c21f94aa60e0cb25f220ff00a576e341df2d1917dec00aa8553fef603f1c1dd24aef491b932b6df84d784abeada098583e7b2ccc8d400408240b3fd58f4dabb56c648a5c3cef3019ccab07ee1930a7db4dc97e1845097bafffd58b9d22fa9ddcb9b704214fb7362132f3d094ddf959a159be08c1ef279465ca2f56fd7f2a23216346f91b8b0230a35cd75f8c694174e416054d2919350bff89ebcd1b67fcfcb7f821034eff4b839e85cefd86d1b995115eb8f782cdac6390cf3e284587ae3ac91b46843e51c7e32bcb98c6f3e6a68f53a2299ace4ac5a8f89ad3c8e9dd8f970763114fd0e61318c81517d4c7fbfcdb95d9eecc89792afcfa718ab46e947013247966188295370551c85aeb2ad091495c54fb4a341d45e4317650d498468407a5e1199088a057eac11f0f76efaff375e166833e0933de0cb6e978b7d55a51e4e57afe9a7df7330a170e30554c9bf2d36ed12191fe73e3a310c0cdeb3a47d940471cb04c563097bcfa93db221a7660f0233a8123e68b1b66df074bf566871ee0365bcc68ed170cccd943dea019fea530580e8eb98822fd28fee056b70b56b65b1282846a4f77a3c0ffdf97f2f20a6b72f870d6dc38b6692752c15dbee1776c39f804d74356cb4137fc65e16fd6bac017dd7667c9a10eb2d088d06f0e03a989e21b31bcdf30fa1b6e7de5487f30c45a28ff32b26c7307f6755ea7b5af20f4643dcce820c47e3c512350aa0b59a3918d2d842706078aa1f896971bcdb8addc668199029d26a543144d03d1fd65b49308b5b3ce0a0c167560a198682d5ae25f34554aa6f12f0595b363a34b1eb8563f6f535802b135908617c242eebb50b8cbc2cc6813c4f104b7c37e7ff34048304370ab13d30e8fe19a28bac5549f6e2931e9a3f8d442799d00ae94af7c6e3600cf35ac06d9fa50b2c4b7d4ef88514acdd8ef7200b2c0a91e05120ae8ec53b1d9d6636594205bff6f84ed927768352daf0fd9bd6e83e720e0cfd1cd73178f179bdc6a02042fb120ab33688bae58d6e380113f3cb6b21fabf2526460defd9c03c5c7a219055e1e4ca471c41710691872fbfcac1f50c8a1fe7d7dec17d66c33bd0bccc314a0b4e9a2631885a1f3df67dcba0f0e28300d7fb7b1f989221ef1a9d8b21b6cd08e1e1d6b4efb6600cfc46c87f3e12471f51a0f96afb200d41a441590afbd72d1e9e677df236ab6c112021ce5d0bbb529416bc1e3bb7d7d411ea98ae647a4b48e866f240673bd616b752bb3ba611878b4507b0959c2be4327dda8faf21e5f3bd10de804b518bc7ba1067bfc88aab2189e50a876a83f311e08e2948ba7f5055816cee44979616570b0acbb3aee9d45b91fd0928ff3a4b4761d71062e64826bd7337ab9c00fd1af0a30be04bf35a730cc076dc075f4bb25e68d28ccacf0f7b03d208162a1fca8d4722c8020492c4d403aad2a693384d438595dcaf405059f41348d722bff9a4be0c9e7f53b6fc9193312dc568c5c27e78d6bb0123329fe562b34e1bdd1e6a05ee1d976c14591336c4acf9e6e246268053441205bdea11090685ec2afaaddce46262d9c3f3f02dddb7402dc74d42fa25756738ee0fb1dd503e16267ab574833cd5014ec8deb322d0af6aefe3840f9ae81cf2d87adab820580e266c32ad6df2b966bc06954a0e62936974e6c5dd85d8b431f5208370c92c37fdad9fb78e891a14cd218e7ecc7d01601855464aaacd68d91700ccd2dc8be2e21ce6520bc8f219974cafc642041a63cfeed5fa331154e24a0413e67138017b31f4979565e63c852b7b6721d724c405f78e1f6b9dffba93f3de845596ff5c2b4241522dc592da4175999446ca2fc1d07781df2c2b01449540d2bb16d4375fbd5c98d8590909b872bc0ee18f50283a763b0d26944a5ef14087d37a1cbce9a914c2b35a5eaa2d5e129ce5a606041779a241e36ac0925b7c2e85f1c5eac5cc2326bfe3a514781feb269bb905f5bf766e7737b7579e160f3595ff9b9bbddb0fdf69d2c5b63f0de6263f0547bc288feee890cd0dcc3554286807ffa27f9aaddee0e0607e189951dc5017d6b4290cd44b4d87c470beaf52e8fc1aa7a226072fe0259db9942a90f0b691802a518d6109202300a002f40a1f66530dcceb9ab4ed4798ab94658fba2206f1468cc07cbdf075c9e62af29306acc39a83e844c61428d49c69228f9f052312967b7968751ff3f9f4aec3651353a0163dcf28746c7d6b0abbdf96edc932941329dc71b4936a37534ddcba36408878133a6da6ec8939c08a158fa505da4b4e5d5952368a9b4d1328cf81b040a4e8c01267def160579053da33eef8a8589516c5b90f24033c349b6ca3607009a12e63f94de3d97b39ffe77d01382703e303fdb687908e747906c9d968f8ce8890a5c0b9edac2dda1741bdd1bd27403e1cac94ddb64eff7070b8e0537e226058f60f92c0b23dc6f8b40d9b10584bc44a6928fd312cfa208998dc1361a7ce99919ef210351f21e186aed994347627fe573a15b6f7dd48a6cce38944c75f3d53dc2f1ff2e56ef36f4fe6d3c214f8abdaca68be78257fd3a87c8bbca13429ad7d77ac09e3ea6e9aaf23f3d9ad02f0328246983b93aa0a4a7ba91fe82861b7978e49d823e48bf063005b4eb81a24a8fec76aad56b18b4344073bb6fae7d96010922e2a1519b29ecff9b531f5310eb6b396c3e53e1245494981cb9f5ce2fcce77d12a134fcdaf5ec3fb1818732e77ea8e4bda4be8a63442e50839b2e91cd5c432755eda3b4e9a3c0e2159b0ee9be60203dc6d80f05807fc2189d9b25aa3eb20368ade9161deeca609928a0878599a66ba10ee1c82f476f47ea278d67c6153c126a640c53e2b0dc59e3c19914e0397b2b54c65f72345aa2f18572e7184d65248f49376fc1b48e3bce390ed455da1ad06888bcd1cb7bcac6f9f367eaa00ef6891470c43255766a7a6dda124a6d7c4edad5117cb3b070ed9213a55da93f85b03eff0040649e7b9c5aeb65fbeda528252bd31a41891a99f5915291050b59ecd234c2c4a860f1f459f10095c8866e1754f69050c327fb4589c00507ef8765e87393ee57d4298e005fff5dd473866b2111f194f3143b688095a1397acc2f96e8460f86ae96179caf1073bd0d239e19a41d533710c920ef4164feefa168e9c19df6795a4564b0d532b423f5dd16b7eb61588a7480fea0f6f212e04fe8053728567547d011eb145863a934c31d7c069ee286e3f1581abba4aa6fd95f72c5c81792ff90627d1fc4dbadf623e80350c06b0b138ac5ad4f88ca8599b04c65acf7e8b3b0791092eb93b9685847a2d7bb2e5327236e3b869e4df5bcb3d76ba63c3a44223a779e7937ecd7ab974e07a8a3f381844536ba91e85fd14bff200a9bbdd5914417aa3c22e5777ea5000724298c3a4e2937a6c0e1e443350b786f09d91bacb247900f651c3d7be974ec4e757ec449b047beca1dce60f8551ee8c2a594b1277969a488bed1466cba20e8283d618b1b1ef5885d3cc2e72cbf0e393d4117781ce8611d1adc8aaf15f841dd284c4182b2263b598754ba30ad3826dceac537f02669e25afd70847296ac3d79209f4b4f135abbd4c1f4ac9ed4801e9b2647b4bcc1b0c23d90d41d30207d704ca9da15ecb90fba069e677165b4822e9a6f8e53c730693ec4b83491c8628f78ef84f8405b36d9a9f1354fccd82b12a5d66bc27ce300af332135fa420d86f8b02980c88c2192048a94470300300223b3c4478d7c68e4eb2678b99c0fe8b233404a9aea84976926c417e0a55c3bdd8812a53261c261d9bd410207475fb9ee5a745768ab32234957440b7a23a4784d5c300d09845d27ccf7d63e2340bf14bf5580b32f06bc98cf1b06be0762fb8e2effcdb94be17a6f0df70fdac6ac15e5cf116605fe407a4210eea9dfb313a4f5ec84e35f795bf2067d029feb44796fa298bbd4ccff932aca8ef63f74d1114f919b550b713e11012e578d2d551182ea02f9d531d0a75f7068881c1a8e0f68ae841abcdecf6225e7cde2d565312cdb926459aee06f963e66230e376e991663b354360f0b73fba4e7ac5507a54b8d03c117189b4f100926a1459a9fe8ff537e480274f769cc6e91c699093f3e57d55583b1120d66e7678de4a1c4f0d1a623ce7020559acabf583df422db2005b7899c80e589e1b5c8acdd38ae90ec8cd864cb8275a001fe4f0581051fa5eda2ac7a5c27f0b13c0639f3c13ed7e01134588efa49c64ea2b5962d56f04fb5a8d376b9de831ca297e778c3477d3281a6a2d968fe85449631401e04710ec4211cf0d6c9314586bee9ace8b195e86b197ded4ca22dbe678194dc8200e9e90aab3853bf93f1d82ac34d2acc64005663d261900fce8345d817290321b6b69fc911791f9b75369f418ccad0391f756fecceccdb8546ddd07b3da45d634efffb15a79887dda85b61a92a8b7d31e48c3a24c551367c83de8691aa626f75c0821c0a51e7dce91512cae90f55fbc07a084541e6c2d9244ec2a04db1f87d04e1e9626f1a1643f61c9624743b6ea2404332bbccd3bd5181ac0405af9791bd8454a45eedc8062f47d53c43432ed44fb04f95d4140ad78ed4ef6691b46c96a6897430b0219dabbcca3522b0d651b34578da4867d327fd4fffa6bda30350b394bd7318075377ccbb85ea795362b4682baa59493125caf0e4b30444ab2a9ee900779d14583d2afa0c39ee95cec03b87b3a3ed7b51d8f7888b94fc11513f171e1e0fdcb026da852fac5a2c4d12d088743cb473d8cd99182a96aaeabf18274ea5ac94f339f4f241406fecb496127f4f781ee5ed94061b167ecbaef10f95407b3094f87422400e442f8f1ff4ddbf81952c80a61439ec83f0ee7ca37090f43ec076ce819167637cb2450feabb704a62ed45d1cf2d1dbd11ef55c8c89508791ee5804afef460a6f6174e922e715204c83755e07bb8e1f4ae6a7d9fa9681f6213cc3731ac47bff8df3adac67673f95a91f7033cf4030fa6324d25a4c65bd2f91aa9971e4cf5026cc5ee96b1fb0b71a5eb6ab0e158f30421579fa6a0188adaaa47e19172e0055ef33d9d65e70ce8bcc7ea53ca49bcf523bf0cbe443df12e4379f27f757fa055f771291118e845cb9f85e3cf1e2b5d618e6c2a9de1c5889e910d0b20422f4c54b606b716bd8f545530ae42eab8eede18c4b902ebb4884e0287629680104404d846ae7c9ec897badc2148562b6f38fc503e9b3800a7ca7f72202f4bc9b995e02862266cbc9789c8c2c3df7b18b03b11538f07ca29566f3e9c411d6fc4e448407e7cea93e7bc2c7302141ce4bfe03f61ff063b5a4093ef56dbe1d3db803d4fe7966bf23c55d6eb2cc889a666560ede5df0c85a633d540b26ff0024557fd97928d2a838a7fe0c208c9a167338bca621e29ec94b81bdea6505c130ffe6478f1e961913ce0b4f60b99952505a6f0592413628cf58a4e204fef85e2e2983d5120311efa61582a9bda34e3971469460c32718cc6c879d4e8e8f3c12412b68663c0faf42a8e5983dac7ef6bfa8b589eae1955a669f9e85c00237692c9c198143e2d4205921e4b6f25f88cdd6eb42c0d9dc120c75b1aeed5048a5adf04e132f1b712f093887aa9c509489a1239909ca39959b8241d8138502cc8501f063c42443856d07515447196b84673d97ecf0f7c3a46bbb0342dba3cc755c7d91fa721c0d52b1562e6d3a9a433571c75551d794163c9cc811495c508cbbf029b0400a4ebd0699b0a2f5b7fb5ddd1846c15a949dc09db494393977842cdba3528af48d8d516a6e2ae31f2ed0f4c363f0e3bcf810b188f1cd6d786c711ec15f359d0451de79d0828c0d72fe639c9d5076d692b36d3cbacab204d39b3cedc95207da13c41891400e1596bf6680080c08ebcecd6dba65887c780a43e14f73666b47974aa78840055c410cc5e0404ec1a491cdbc056d4576e6d5ec2e5d5a936b4e5edc54d17ce9b1126cb2e660b5fd7989c0342034fe5cdcaadc7a700d1a17c126fb884418a62cc3ef0457c66f55cb78be99dcfa85fb2f607359837ec05b9b9041d6badc038abec51a3c8eea636e1c7c49f8fc1b3167eba483a97294649051b26917076ad10e1438bec577e577a36b5621c7ad606a9db42f7a7ab2142505875daa430c62aa18eabcd5ff6c8feb8374b9fbcbac8c2e880c96bd85f42348ea47a340ff0fb48f5a9f08210fc3a2d28317122d4675f99eae9a5700dba91d595048c5e72f70f2fc6b9369404b7ccb99c0256a6c1f5a01cc4ebeadb4dd25a5d380f398824024666a098745cb019e9140b7ef6907037e65f09b68621b0db3390406544407bb88728f31270d33a9673b2ab589f3f123270a6ea4d21b0446f252cdf81633e011a9b8d66f40ac8fae2abe7ac9aa0d5009a352cdb3c42eb9636f93f86e67531201e32eb00329add1e4d40121c8175954ea0d8c5dca03eb98872e67e438b4acf3491c876c39df622bc59b73fad563b9f83e4335b480323640d04052af341a8efb7682eed6ec750df956086a67cef0c16748d90499744d9459b3871adbb042a186a64abe97f4d87d0d47a1e1a08a16158752489040d901f284243da8d7cab96dd9559c9c76ce14651cb3f3be402e8e294dc36593356ba23a517071af04d0b57dc07ee2cc043223e067717a414f44bed54408f5ff1d43cafd3a93bf4ee0ae6483a14add40f3d830982c92a32b856a765d1ce37ab4bcb4e6094643ebfec7eca9059542f45c5acf8d607d0c7f00b84b49ddf765d02ae20d025f4783412eca396dc70290348b6d0cf494cd65273aa7890d4a587aed12ade34d4c0a13f9567424f29483cf3ef3cdfecfdeec6f90ec4e310eeb8eb25df1dad9ea0b40623c50c1357997591bdf42e52d957a24e5f446d2c3b21a6b4acccaa48a8b8cbe1265048ff6540b01cbb70bcc9f1bbc9087dcae68a2cdd0ee55d8207c65daec58923997f18ece57e9a7b5c5b6c5353db929e1a11944fc169e0930e15725efeee1875ffd862af390653f71b67c1e4c3bfdba055bb2df6a50a69703059989dcc108e9e14dc37cbc5a8904e94841db4ba5e64754d7cee67fc9fe02bcce134f08fe7cd806cf6a8d850f5292ef570b3b3ce37b7c76de84391ac3fe55ca260273703b11d8abe7b78186e8ae5ec778f65c12da40e8eac580a70d83e6a3b0817d9710daeba299cc4de255086c4a0898645b347b05ccbff9ec111cbceea523f3c098ccde3807df84daab9789bf85386e9933ef04a20cc79c2212d98f4ab0e5822102cc62195439514afa020045dd9bab4e89279472f240119d601e885ada824ea192725fbc78d325c82b15710cd903919850554b68174b3b8469d02eb1e5c65342e9cefe0c15c3b51436b2bfb9cca56594f78d7ed5bb0d2e272d21c529bcce613e1199c8ff6300615268e883f3b5ad879fd09f5886b97516e048d1fa4cd54d7e668709bcef06baa4b47a26b6b025b46a8e914b901c8c2c1296a8121f6bcea1631b3e724fdce92f53c054ed15e31ea29edb2b1821a3ecf4eec9ae45424d14bb4f7a4294ee7673036f086f15aa20f4151559766195dfc26ef3743ecc8d6b97910ab056c73ec37454df9acf15f104c0f47c85b1351e54041db97e0c31374694ddf5a88accff9e9b475140a88d9f5bb6a825e6573f56dbe7574250db6c3d9f2c5efd651883f21024beda4cb4330ded857a891ab008ae2b238eb59d4893217e4180fdce196f439fc53e56bc5d4453417deb2c0d89aaddc47aba000469dbef4be4a036a3967394c60713fdd2bc5b03cceda2c8d071792c2fefd11d63d35a2dd66c5fc3859b6984724d471e4c33850a814955a8b0a6ebc1df4690cd1e68431f808bde1eb2bc8776028c4484158439053cc6113c68355fb8f409d30528971ecaa0064c87028e8b8974c73e46aa68e9b04258865905af74ffc998a39160acf68effff4ee0714945d8f9de31b80a49860a87303b0e512ff01bbb2cca2c90981c51a9d52ed7e091e9e049e2fab3671a0be428a69e53eab57c5501f288e36a347fc3f06c89b179a741e59919cbf0574a8017f825fe050489f6aea012fdeb4c3484fe455d4d056a8bf34e03f30b866032e250f3a8ed6a060415b172d84cb29c964442963c31b3e242c520a792f95ab218b4c9acc13484b9a2062685bdee7520c79e9c3115a479b742c6fb6b6cb088c74784c7ab1457fbd753c0ca1220c4712494adb4d1804c5dae3e49c9023885ef263090b4a8c11688e00d1fc63f083f2d1089964bc4b164cc6d9b79568fa4d6ae2f4714a5521680e27ef0c4bf0ae5f7c8daa1ad39e24a6c065e021d166ba05b1b20535374b20f5c611d6c04b1e7b9d71caf09076d0117480ed377b86d92e992183e1ad81a99b65ed4c190e7f9df647f34c83c1990d7263117f2a44cd64000414623985b0b2d15846f1488a33ba0daf5a941403802d0d3624b105ce30b7f346af5e53c7a7b826c167a4a38ff3ddca79027619d20e2a7f871b9c4a042dc529981040a39cc1a65ba1db8b620466e863d6cfdd6b3060c7781455dc9a1aa16370e41912ea43db1ed519e35207a2f8b3e27abed020a300087230e2f1b4048a593bf8d0066212b5836ced6d56292d3017f46f2c44c1693fce19ab69046dd964b0d2f0f24f5164325d9c145a2285c7f07e80615a579fb86a996d64b6ac8ec544c5cd8094dbe72c2d548503c2a5df80d94f2fe821716a18f3a471e63364a4e40f7e0eaf70912af81eaa9d7797f8ad34c81daa4f0374b1989e895962ce9c4e004c9cd9dbd068a41e50c4f3f349097fec249cb1f04bd060245d4eade4fb4c0584482a214a38c8e99eef99a793417934854cde716f875a2df6b20460d20a9a871358058822db19e1fd74c9bdf4667ea2836b483c06ac2ab7a0d10f79850cda9e9d3e0352064558d14ac821304f18b8f9f16c1eefb05b4b4976b7dc01ff51bfbd724c0e2a115806e9136832ec64767a958b101838a0a3c2692bfbb6afa12488556b2015876b28ab55b663f89a7a0731e12b28138dd2f50a275abe153caf4abc950c8a7c5f4c4a506aed02640b736c3874125dc39ed4d31dcc0b84bb947c3e506d7f40d78051ac529047d5771919e277d8d0f391d6f086c208257d923cf43ccfd89d05aa5044e9de9a1334e36c1f161e71a947f776baa2964034051012f30a61804e6afbaae2fda68a8b627d239e1e34e81c375e0e5d0badd10b79b50c01fa1d81da65932ff651536e58d86653795d2957601230fda9a64a36b10582acd82d9607bce4d0607e2cf773c71f9e537b049f88e0c946942f9bd3207c96be9d0a05e053a62966b59f27bbf716063cd0e28965d0873d503eaac70f9e0915ebbcbcb852ddd1823f2a67453298e80265a7e1ab4c936b1c9e2ca87ec1b58d1da0eccefa4a3c176e134bc0603d6e2ec3580f315b703128133ecd39b7740a8343015070637d37f9b3345df12d7cad114de6b76dd182a5dcfec9da01ce2737ff8559bd6b3a7d6da5cd520aa034d4898848c0957ced6a0ea33794436925e7c71665771c1e9310997fc5d4348787cae234442c707775fb64bf78f735e7a0477f82d96372fc0e5d8ce04975924f6d05aee980a8bc383b31f551816d6d5a3790f732656e93299af92cc9f608310030f072ab027548116e4a92c5a88830caec966095742aed0249a40e5dc7f73e5c1b752ac6b8d664b0c03590ef398eb6553af67dcb8f71ce852df0e55ede5e4bdd8da169c70751da50e5a22d52fbcd570e0b22504c6795a0ee211f6d780fbea2635181fb5d8cb71af5ddef8c26a9c2890a4a5c55f6bf322072444a35f09777b2f8912cbe6de0f8cec0bf4a5d12a571778fc591dc7aaca757c37015c20e1558e0ef16cd16a536cbb440bfb81ea63848dc67d74ee0862ba93b292d3839179d676af053886372ead8d0c10ef15313340310c83167c80fc846f9b677a7f4798377132a7443c4b1ebe4531ae61eb0a8f807932b7d88c70b01d088a439f69e2f898b0d3640042c7fe75050a29f8ab021161c65f8c139d5926d3818cd322c7d4421652f45a87d418e13a1cd5b8b4e32a9f633056aac1810de39bb702344ce61525dab67f33966a707be62ff78e9582d1dead72ccf4ea9ad8fe7f546aecb17dbc03d28ec7caec6d989e6122ea06e9ed6ca95aa3d84438de45158348090b59b552324fa99917336465d25e78ccdab5db0e0834f8e120c34aa9ff917df48b7bd6947ce748d86d41ea14cb4e49868b1ee448c2bf6abbdb6a8da3530c7bfb7a955d2feae6ea59d6c45e2bcc4d5fd4c5845180ae0415b3547d60aeeba1fdaa4380647d4ddc33054a9521562b5b0a0498ad8a23e535914e56b6a2f259e5ca53e42b699143a724a885f132e3ee0a7d8a2a2b01585b74d50da415c960b625a3f0584b60e8caa9dab099e1ba00d3b0a36e348a3cb592500c0118b470f6e3b36a27cc6cb52b1efa4e87e0e5151188649790b04ba112d9cbd7ce38e2069d894110a9cd242b7574850fee71d0a64d251febefed08da0a5ef05c350bf633b520c7850193adc126ffbf14a58a3b8875282025a5b8b783841a461e3f65a90a735af632c7050d7a7aa8c252ca2d646fd02254fc0c5f8d12ba4c38394fbdc395d8653ffe4ecb1614c64065f3c738a2fa402c1939f45434218f245bc0333a6a9ed72ac21c659edcdd380a643092ac6344d0d10aa2460f7784f7c81001d3dad8b8eff535fa305acdba969a5f9b9fa46f09c3767b6e99160837ca3e65abb7251b4e0bb13665216209f5c3050063fb9746579b69a3d33e7cd61111434f616af2b239ebbdebd0015196320db080a0f24c1b1e9c21cc4821211c4e8008b977551ee8e6d45e930844e2feb9a1642d6808123a85de80b4c182b61f07d80e7b62c6b251417808686ebcd65ebd3a21d1eaba7b1a5ef0c1a9d53daf9f0d5f051be5c89e23f9e3f876b26498433f52d24345ab21631719412bfc4d398493eecbc2d559a93fb529b7048b32763098bf9da0da28fcadbc58354a4d4f7ef4016397870ce89b686e131f31f73a663dddcd8daa99b1135dbfd9fbf9325cc878e5f3eb3c4cba79dc402a75f79a7ea6084b70dd08a9591427b8f6795203b530db5d36a7aa899dde432717b979757587135c9d060c94ea359494c8872a4f7fdd42f61d424c23e6a1a70836e893c6106f8caf282636d5512d5f0f50a7884d356a9110552bab0e7cbb7f13edddc60909264258bbc80e1fee9a07a53b2f5e505fb62768f7ad777f3dcf29754c8e8f16e406fc27e8f546a3570a021178705497a7daf0acdb5a97192b66b025d6615e99f76ef099dafb07bcef84ca10bf18a0fa80d59e3f861cf42e30fdf87a5fb1615ec753128e3bd2251996f891e0e1938c52de8ad121c6e0b0b162f4912217fc3c0dda41b6049cb4c77d6f27e621b1363d3070cf19cf76d2993da51c417e53ab025ac769bdee58e0937f17132ba0c8ffed736ad53f4e3147caf00614fd1ad4b316d38d27d4b24c828b8461e924c031e2c50e8fc46ac22c9511b9b0a25a3298a2d1c038dabc23b0ad36ccf220ec68afc7f1942c8b15d9a329b049201b8a10901c03ddd3a01bc8942ae717895c9a632c202987c271b41518c6bf58aa7d293f71865608b97cb3348b123b7635307b73284a46d5f1bbd2767da964632c69d109aa98e520a420c2030767e2b0149c2733dd32108c555bd7e9959dc360da380085968e22455a98829b3a42eb08789075358a8e9a204e3555f2b08070e5db6a993a7082ea68114db1a6692b2f07605cf1a8c7302e040e39897427f0045d20ff4163763174278a8fd7d48b5554d444b358933b1fcd19721995d9c868caeddf972db8892d0ac40e42bd3b1c4055a91d378882de3148dc0337dab6cd5e7033ec0015fb322ba34ba400f2b28bdfc44ee77c67b617c8e80fbf50aaee90100b1a23d8e71fb5991b890b499e969521467710c27c1b566804070732b87ed6e72b18a114498551388581b62995a2989699b26087ebdae73406296929655214a710b76583bdd48fd7e70d5b660accaf2140be6d9692037d577e27dc49ac32aaff288b20d258815274bc41d76f0562169e9f69155b003d395c44e937de1208af64753e0e62329aa6663228a3a45dded975a180d78e64663c4a43176630cf05bed1b41a3bd67567c5de3cdaae5e42a4fdb1b6e3c2747d437a8381bd0c62afe053f5fe133f14b557b2e81dfc5d0aafbce68d1104f92e56674d9f227c5b45d5ff6abf57a731e44fb960a18b35b139e87b6e7583316ec6ff0064d81e395e833a3d61d14dc15bf70b197ae1a39e47d5d3892bea389b1a46472fb13416f906f22cf11d9c49c2a9858b678cbe7637df3998b2b3c5b3ff0a55c141e2e818817999c5057aca609ff426807322ed5a125165bda722716444ef0b8dbcdb9b18bf79dc6ee5f2bf9b78a99e7de84986b533a1f38186c16258ea818561f667590583925cd85614c83f5a78109d650f1917096b3d163a634a67c7e1a1301b9d8b4ad5445b815936b94364d459951fbe1a73d7c1db035dd1ae0223234254da1bcc1f680f95c57b60c5bf11638cdeea307101f633d8614981b09b3458ece96b497d1880883768af286e2f753e951c5e5c8e3c1bae1e34c49875f9a44d422c96d237ec4c082b6cb9043510c9e45caf686d315f7b01e4dc8af39a59961f6b9c8aad40465b94f02530b7391369c615c9264c94514a43d55c304453c61c566851a84033fb37ee12fd670c390d395c5c52515381443a45b8fc9c5e6520644bb7825e8808958b29d5c660013c02a0d98bb524724dad4543c7bb9474fe5e780d28f8e22d63ee5a29b8ad6622e768a9d251a0ba56842bb959d7ad8d1eeb94aad44b2f28e4de14adb6820d365e0c05ac61df8be2aec6a0198b56de4d5aa65f1b75fd4e0f99d0e3fb858d9ad8c1f51070890d601060f973a04558d8a55391dde3237c021849420e764fc44a85208c3c3e1d9fe360d420492cf8331baa589a65fb97cdc8e657fb055582e09d4b79f8f5061517a521937a2a8f720a557b9dde0cf2650205a76b693104efab544f9867bc18b36616fd6afb20b869986cbcd2a32eb4ba0e30d4e94d683cebaa80d1440e25f23b1fa51eb9c946c54fcbf4ecf0ab9533c544339f27d13e3a0751c91eab087b09083e546794679d8a1a1557178983bb1dfb7e2d08428d4c4555b325f13a78b205f930f52ac25474defe830ffbcba7a2eda6f037b4234103a875e1b804b31e23750191a3ace7c1617197c9b6d9d88f3decc9d1fbee35542388061aacbddea228a731c1ae00fc7775756f519b87652c0710dda46aa8d63292b5151a6d9de9b1501e3b7b96cc58cf874651cc1023e9b97c23130ec51c3131be14213d2c759fc715a27b281ebbfde9ed0bbdac19a10f02e3ed5ce52938a1abdb2de12668a1fac534230751450ef5a3f195849002d14307d0e326477bf8248c09a0679e97e6bf2ca86d8ed24f64d03ad9051e3d21f22e9850ae10721d7b0434477dbb8a6ed63631492bb03c0904ddfba80aa8d5c75f638e40491445e66a8eaacf504edf47b58de15d2c62456878d10b63fb8f3fa390377e67b7c94d12e48b6fcb0be9c24826e8ab10532d39bee9b4c008089987de481a165fa8df9894d828fd633e5b5389f793fdb4b08723dee5c3405abf878753c51feaa4f5550e1e0e2542d4cfafa4b159db6053347343fa57f031f4fd19e5129e18ca1246485a4c0007cc8cb1d5f0825115707b364823d7e54610e25e1eff07769e002d8d4e3eedb34ab497bd3e4e4c7d4894570805e75fb98aaed00873526b2c33af88e0d5fa39aa26bf63cb597774fa0ff46389afd9c49c8b4bc111cd0bfefce791d94325e255f31e456685acc051649e35e1116409163bfff7bb084a2b5ab835af12bf6a8f6e3735261e3aefe8c4146e0f65fffe050393e58ea30f157ae9bc973d2631934a409144862b587c547fa73fe2c9d15b2b902b532db7335f3e56a00cdaad3b39f7190fa6d21bdd05a64f49786c238554ca51038bd67cb2653384e9eead82cc43846ec66b65bc78f72350f2528c03cbbd45ed11438134342cf384168cb28fe9cd1b9407062f526b87910677a3fb63306210f378db1f07b879915f072526b6930022305bdbdf6b011b18ad8d510c1424efde2a6b5f9b23acfec05960366dc164fea1b9bdf8abcaedac46a4eea146878d2a2a90769336f6046a8a2c0add69fabcc22658d8b73c6055631f72c9b8f8ce0aad9aa714c89757df70e984030e3e60d9bda3c4f14c1c84f8072272ef94f8b085bd2293edc69e4d9b649a15e3b4156424db19cab9dfc8532f94feadeadbd466da62ee003e7bff9095204baba5ca6430357f8ad08cdb06c268d8c29467b13eef5d2506d231faec44651cfbb728420e54d7bf431a8fad1920e4cee9f9631fe7c441b5a605c8f42f0af8f7686d06502c25220d9f58854f070de20b9a5318ed0bdeb6950afa67325bb7a1c9d103e966d1adb0709fd18d929b622cc948ead87764b3bd705b27fb0f5bff3acaaf642f541f0f7ff20f86c925bdf2c2fa1a3450d0dd4ae1bdba17966e3f3b581a9e1ba19f490ab88669670ec4a62466c01da37b90367a33c56e7fdbeba8dff5a1de0ceb55b11b5dec8af711dc28bf71c40ba9a4659fde3ef4ce376e0c89de783e31a5807f280e29f5728b2f87dc5b9ecce3e54e1c4d6c533df220b6e1e15904b8cdca5b486be2bea2162c261974612aa46ea0716350d18f5371bdd243a76d0e95b50dbe89561c8f8f3eb5f4bd8098c2cfb65c731c0cc86698243b0c178b09c6bcb6b51ab14283ad6990050db1a001d668c01a8d58a2116b34c682c658d1102b1a638d06ac51fbaae6eb26534d151d5d785cc9cc022561400423a2d108a54ea6ec2d339ddcf818d39e05f8336f99df6becd8091c88e6469c451ab044832897e24ce298491c318143103da7714d364d498b356695064492ce26f27d127554cb6a5db8aed06dde44b0f2d4d4318c4122b49bda2beadd59b306c6ae0765cb9df0122b23320a702efac3f744c0c980ff2579aa01fd9e5ad5a6832d4f741227e12f4a6a55ff55c48688f036765e220b87ac5fe0577085598bc5cfb77acf000c2c3a5167993d69d3062d503351f647cf3a2a8a054b8722ea77edc94851d7038af9b34cd2cb292831a1a3acc5afb5e94b73579f74b88ec2b1d8a22dd0e09b69daae4866328965fcd72a648c5201acf074be7410e171d3a969e0cc29718e6e6d8df5c979476d92392cfb0ccd1cc4805f3a52911514cf383981134671928436d4cd2f7070d156462e5dddd3e78b9717cb05ccc384eaccae69686537936c9147d711626c689dc8050f3f867b72972c9dad5d604ce09047681303fd4e57c13c3405a060fe597666300f41b770413fb391b6043a8580703b8645d1d02fb0d55821ca5146b7033032af6ea1a466efe2f292befd89359e13745add7c792c1f3b7a5bd1a8ca9d8241b0b849758166c6fbedbc58b2c4aec2ebe2acb47cab9c0540b901fea0020ceb187f4b1ee447df61ac63177d1a96ee37bb517e63f24872f6fdec23f8377e536f461f9b52e11f1af1d62b621bfd4e86ee1fdd7072138c2f4b928e49222df43b6a3f7065282273c1d55b5ee6de5f01f95af8a28f7d210b19add5392027d01b1075485f371b4bb805a76b5fd1ddbd134cae39187672774ed68c2beb7f2e1b5f732551c08d04956511413725df4757724b020fcba0f2647f57f249c75d588e058187fd94464a92993c61b8c96e4c311ad81d10cd2c4ab0da61d79f0a868795753dece6f3613b4d2136b1dca53be25720c254fceb490b752bed883414faa54d548a1e3e0c57728aea848e6d2cbcf4eecdc2ae671bcc8ce1b858ee9455f55165bac1b4a616de5ddf676322c42ed8e932802fffc0653506efb3af60d759e476c1a0232a1afbdef419f03ba2cd39a0dd9adb78817e21e38bcc43117e40d7000861ae6c8ecd30392c7ea0015f1010ed5ffdb536db62c67ef352752360ffdf17b27025cbc020376a3020a21cf7e59b87110f86c49b7746d06e1a6038141419ce1d8343a3cb421bf1a480331880a86fee033f59a45671f93bde41949321208ce96d77f43f8d7ae55a5917d0ddd3d359f43c447a99d79d73deabb5cf472411b73b630befed6fde033ba77b7a97ddb74ce47255c8a5f9dbb84b6cdb1178eba6e6035300288e3bf8ee4885362bdde656bb0fe0f195c17fa3f28bbe011ca5d4b4d593cdc85d0701ea251bf7d78bba5572a9216c5b8eaecaf11cce1f444ff121674a3d5bd4aeba9e19275f514279fb79bde5210b71e218e10c0bd40fca6229c31ef1bb0ab62314c3bdc196351e8435b66ea35790338e9e6a7792787f633cbc7b2a718b223630d91d6ad858f182a484035d8245b789a60c69c923561792f4331ee6fef78430e78e45a53f0ebf1360a3d68f6d0ae0a9d1dd3ba19df0f1b40406c7cb44dc27d2385a69e38afe7809b9da9042de0e56c4ad0f51ef896be7ce25793075692696fb00a3451e06035cf21c8e1af07f76d7072620e73bfd6510c34c0908b5b147476ae7873744290b86781b2672475e90006ddff74eba420cd701ed78fbc939df0b318b2675728de6af5a8839c30e3d25882e6531f228e43cfe2df8aaaa242213ebf224da6560ef43c8e81bf0943395641fea419f405601667069eaeaf594904db1f8aad934274ba91e3b51513d3e1d572496d05aadab3850683fc7aa40188b498e0b918938b4b3725abc10fe49ef2fb93676455b64f094aad0e2df282b73cfd4241252a5a2cbc286ffb163250cec8fd1b3f35001d760ca8b3705b1ed03393acd6769d3bb2ee80462c7c9ba1b53d929e2a07c261a5460eb5fb914a77c1022f0968c8487f2c632073254ee52665e6aed4455af3c3b855a5586859616e211aefd77acc45e1382f4d622166b7171f0238d3953851164a633d5ad6b66cd3bee1d2677046d99147afb23cbdd7032368ce43f5d96ef6c8c438074cca0b9b3bada5ffd79b8ea00ad8e7ba98ca4e64743c8cf459a7e16f324dfc491c32a8e14eaabdf35bdf8fee2ce625ce9a6a595b4a78cfb666d5e6ca09748d33163cf952a7da4d27af63186532fc2b0cafe41813035404e9a57495ed5d4b45eafa056c18e67ed0a389a282cae583ca36f616e9a84ed5ae5e213a16b07c36b6391c2f2c269ac7c6c2754a8284999492f056327592795202d2735483bceeef953ffcba1f0428ef3d3408fc3760f27ddeb053bc26e3109e29a0dfca1b67e2f32ba1b74c2683ff9ae697ab6e0e2c24417ffb2883c1192cc250b8c332aba04ed1af09c6d34f554b40b57fa201fa53c9c84cdf3218dfb44a455d321bdc4ea18284f227defdc9cc1f5ca010b20f23dacf24e1557141532c62468e94e1187fbda944bce6452e6c6fb883c39db0ea1e8c71db30f90e6b43e12223fb698627c5f46edde673895434f4d084f755b3e4e54c080d654554a57d3718c25696fcdac0c63c1089b10a8b26113acd31f86129f7656563f36168d8d7e6cd816c7a555c6662d0d2d8b57b54a04a8dcb7ac8eaa2f5d11571177e081256a30810b76aa81fb2c809bc370400cc11d1fe69cd1d144fc120648870712691a2e3506ec900ca1cf23ae75ccd5502e443510fb5b82fedc8b15014e769484d91da9995ad5b2650514ac9f09d2afd6d81770203b92e99654c83010821536cc582584436e41b640426c580438915dce8720b8306135ed9a95392457e2dab0e1cf407f880529666122e0a4e6e8be68beb5e9da34c5d8220ad4e61790e020564b2e2f190c6dd0251337e609f9fad17c4b88a0efdae5cbbcc8ea4c70cf1bae3f20784bb310c119d045fdb20510889048ceb2636a22af0df34665b29635f1553792024008b393b5fddc375743a38b49ea65a623d82610dc3f058d0b9d901981bd31a7502a13e5a7833f6ef4387cd4df7b7a62896e6b9d9f014a25fb41e79448974a6840ed006be2c4614555c38325ba22dfa626e60d46d564294f4464cee164ab7e9b419cdcb18ebd0a490106545f2905de19ecd7772968aa80e5d8ad2c748e0d1bb43f18a2e33faf5734c187432ffa11dfe2d00e06ef8e9b0cbf72743349161f184a2bf0744bde5d19c80944d08d8e962580fa3b0a518393d2d3ab4366a29085060a5181b0c362fb189fd8c78703ca77ab5254d143d38dcfbb8b0ad6c2636384d398754cd2aff4b24ee4194d7961b8c31980be3e5579a51b0d1ca184fd50223906d5181f5c117806582c30046efe2fa4b7eab07b47b84974defb1fcfba1600ead5d8aa88008eacf5639851a4ee34d73149bce2380e58fa9bdb35ed7833a99818c7034b9e7ed30b49f87cd0fc062e842cb4c38a80a0607c50138d2354a2d35841e908f38ce5a6a0180c21034079a0f905dc0459b41bff084c73309cce8f334b29b50af5e9c7a2861854274b4a8ea7eab4e48978aa8e463d2ac15f3dd5cc2359f3d8b881f754e4b0e56b86054a5f853920c5bb17ba08d85c0b18a0d798bacd1a6973464a645a910378d570a0675868bb9e73ea5e64bf7f8f438626a769b80a549abfbb4152a51f45c4e0f97c052665767bb94cad19856352ab3ebe6634ae96874e0f59f27cc256c91e7637aece4b94f1751006dcb017d10f555884bf189eb587e541f58a726b7c91561428cc630655ff7be7f814c12cfe5c1c5a99c5f495b855cdafb18df2c7b9cb9878fa560e1b226d41cc30d3f8222952b21af6ab8ca6ef2ba0542be064f0884409cce6f274852e1a979286bb97e036e97b240b62cb0ff7c545f5bf0098f1677aaf6d7a2f532458c5e3fe16a67cefc2b08f3d440bbd699a8785b5f849820672ebab6efbe92aeb5f2321f2aacfee87850ba8c7e17cbccc242facb2a89123efee57b8ebd12c9c4d25681e09770e057d04638d7fffa5f812eaeb27d8af1f10895c51d8801b350b8485c887c86751917133a2710a84053a32d07410d6d3b3cd8c88013ae84058907e72737e12400c57020dde778f0c381c5d947a8e92eeae4ac75e751f93964e2e108d9a61dfd6dc52c1a959818280bf82bb027e9893fdbb5209fdc3173f06f3a20558af597305660dcb8563c778b53a58508b90ab0e16d4f6a0bb3de85ca603ecf284713118416a18532b8499f857a0450cc37289294f9508666e1f38e9c43300eb84f8b245323b9a1068cfc4c55232fa9b74144983057e65c4cf71d18560880a6265c29eccb54fe6387a45ad49f60c266498212c0d16e841cf63e0a55d15d7c988b4f49d4a0c0e5625e30021213c97eca4e4f2e4c36f962370dbbc1d692849fb302cf8a95bc33047dc86006956777b4783629afc55b7e01cca869e0f4fb2e2b601700e747e832b213bed30c14e64041ddad9c282da3fd4a6e314f784e7dc39c3e752d8fb15eeb3fca42a2cd09459b47ee2a181025481f68b4364e278920aa32a2c5cabab8d5f260ee3fc8d997e5daf9f722d68fbe7c8d153f2fb41e1ae2e13a2ff51f7b9ba83271ef4b446390e60d14164fe1c68194606c3f1a7fdd4a45561216acb210f2bd6ae4aab6490fd83dd16dbba6fd349074f2d03da8c24fec3dc5eda776d01886636a629f6a5c51bd4fb876ad69bc04a524658885c587ff1ec33f188b0b0a4c479afff4e5d6c50c1c49169206a4c30ee73783a61e94c964487b7286e05b9aee6f35cb73ec68e00d8c805df4c9f4c25ba9e9b38ba5bd2bdaeaba9febe666c8f768263c8248e35b02c5375b1c632e35cc52d6ed2fa0ff0031c902eba11f5687a918f7aa1f5eae62a110bebb46081e7253dcc55b4b790349ee66df2575a6990841fb039274905203a9d8ff3c91a018040811fa67a4fa902e2fb6e076c2451f672951573307fb4fd538cc5f8a0bbd62fbdc87404a779c57f84f86f06f4d111c4fd3326f6512616003881c076057754d720acfb2f8bf4974dbe1a01b6c39b2caf773a03fac726c396d9e4129fc729c0e0d8693ddb69e75bb9213a48afd1718f56a10deb933508fb7059ca39cd40801f3124aca93bcbfc2390d9e5e857e502b602d3b911f764783c6f7c77b74a945ca1b08043d47a3a49dad7912fede9a598dd7fa5e061759bd52641308e706e3cc18b1c61e82e50c88cdc23ec271e8aec3d8443a5af0f99d3f15a631d0dbebb78756600606a5a8ef000bed8fea0447f73d320ffdfc4e69abc987e653ed962c0b8a6dd5263c6abc3ac80c3309259cb0d87ef67f12db3e0a4582260e0f80aec25a639d5a079af0e7504695bb6c45bc5792b287ba81839c0d15f87cd9dc537d22a96dc7067603c8b56b453ef65f66328adca9d83dfbf5ff2b23bfbd24d0ecc8030b58bed59ed36880393b7e6b820e1993d17d7dc2f53ba5914c3cfeaf51d94744003d98ab1f5d315fb4abbcb41cc46c640a9135e69da0f3cfd8970874a0bd61368a5ee157b731f64e53fe3e65c96b2f1b218d83f8772e60417e7a3ac975045a69bf31e13d3b2b35db7a219b84641d8bb8aa75da318fa0a768d4555d343f06ce0b3d09f9b3bda35d077886140c5a231981e712d4c95624c26a003eeffc710cce8dbc9d8c54f19d5c9a0a61994df49087df825622f82b3f8eeab4a1c7ca6b4a7f2ee991dd601c2483bae92ffb3c96388b3dfd75d8dd2e9d2dcb2fc9b8e863c0e620ac1f583daa995eefcf862f3f7854d37e15955f53705623cd124fabaf1835cdecf772fe580ee7449ee8d39cfa05342a9b4526dd63af5bf5bb5460b576d41bdacdd261968fee3329df0ed07848aceaa7a8ec21b7bba05c33d780d867d2d17ead491ccb93a81799c83e986bf1a4461b7ad055d324dc0eb5eb7d920350c21e82a8702cf9f53c8da690ebac660fd410dd06e679438e3f8feb90c323c9524c0eaba695f08dfcf0d844f3c7f3a6f19abd665d7100a0540764b4030b68af20c763f7d05a466be4787c19a080834739f1bb279e6b24c82448b0cc8e613b579c9b702e26c6417e56cbf003e8055ae127c1ada984c433a4d43675b7223f729b809cf451a5a75c06fb71a633ede657c976987901ec81effdae85bbe1dba43f81571a721de925ff0473713160038777ee9d77dd6c52695c68d27518c3b4ae855ccd67c00371d86f32c1869dd99c7788880bb4dbb59071d15476d06cea9f2fdd530c22a1c6f44f9b3f7c7e080be15a235b632e5efbc3330c4dd0d7c332a2444d663762b802eff8e3238cbd7b67189ed406b1ee65ec41358a2a193086860f22c421cdc9cdb979947e06e3e1ab7fedbede4514597ae09e455c0753cb73b9a5080c2a9d5e743819f51dc9ce83d93b32927140f6f12c47e4b442f86384fc45cc3d595ef093c4e0de93cf20ea888d9ffe643e973d79177450d3423a19ae6d4aa55225d06b9d1f6aaa3397074f93592132f1921399afc498af9f66ec599a9c4e531ef56190bcc53ec53406315ea16485c94a96a46d482db4d218b1e8463cf51ca46718df7920fd973d08c683a354066e8f0412b43b9befd6251386517755e4f8c718753f4d4d2e20e74c54eb61e74fbd8a38fe654f78fda17db737b5ab94afa8f3b633b2481b176cea914d07c1d9eeea375ee88df17c9832aaf37785fad75c536b5a186affcba77265ce32762f4211449a42147f7bc476e1d8bec4e3321a7f863fa1839f42e0651d50dc124cebcb89a5ce57164c36507db82317876e1648f9c79a14840192f55fc58ba27ccf0cc769597df617f4a39c6039170328cb10cf1f24b95c58fe4fe45579a0ca00dd080cee03b21f17d9f444fff33ca9eca0a7762ece509047b3cf3035fc34142cf509a57d16f86a72ed97662f50dcd296fb44163e90bb00eef9518aae2ee6e3f0e27c79dd414619bc3d5e0cfa786ddc34deef518113e7502cc2052162e31bb8ca1af942e487f1fd0b93bb531caffb0ce30ef8c41d3ad419fdfbd08a880f4b489eeb8ab34b3ca6c10e1e89e8a32e74bbcce952c14b72a8286b3e68f01f6313721c105b50ef8451c0819e2823f8b897584ce8840d7cb49fc36b19305d10121b89e15b99e6436481034f0a6c13c49f5e335d2127c2b4a8c032c77e9d746743f049c8b549c241a257de4875e8cbc073c8b5d4f94caad9646a42c20e74fe57b3747c2f90c5b31d09726f69556ad8df8dde3d8dea4bb98dcd754da1eade898f76622e9395851b42c5f90a759443280f345e78d618f033833306ad87d11675c7379d78e78534fe0f253efee38020aef60d929a6421ec86b0cba08fdfb829ce62aa2c6de8b811193573b8555e28c99ac2b56df4831f3a14b39b9c1eab7fc6e854d2f8529157cc8dfa2cdc75dcef8618aaf5d45d67d9f008563af14ed70a828dc5bff3225d8c58aa85acb0e9d6ea6ca8d827953db7ca5115452468eb9c7bdd1db741b8e2a49b9e574f3a5955fef642528c943b4637cafb0df2b4eee09430e06c605d7c80eacaaf14171a43267ddfe294731d93d8e9d92f9170f7299626520b097e501791e3640058b99f68e1c2f1a42917b0c90039da8c2d7af14e098c69e98eb1342d191641e4b6a8c5f6748f566b14439185b6b2573d2eba3b53432004265284296b5cdd69dd5497672d2d55e2de6bf08c5b8b63478600d6300fc7a25ebe204babd62c29a070459383b58c15a7c79581552789ccf482aa2acbaf5d0ab3689b21685326ec86882c8db5a45b53d9715fd27a6a85faf24cc52c02a7b65d628096f3aecd24210eeb12559b084d150b4a2ba5d76f9dd7cd81148468be10c125c7822c62fba9a16e2b76c221a9580e307d8929fbcc85efcf5199ff8e297495f2cde83950df4877c4c92fed8b2548ef6c0fc7852f754f7e8c396a426ee585a018d54db4b1fe5a81fbceefa73271b65cc492980f779dc927d47ea101e6a440ab23a0f5d8d5f75f0840025e7bc6f2dc65309cec0da706401891adaa4550d696bb92eff6c5533fff7fafed4107eb3e3825cc0e7d59fcc40c58eda6454250eafb797f624ab0d2261277a9af32e3bdda85a180372b749f45fde4cecad27733cd3d85ec49233a9314309f3716d8936c0b16601c5e146138c536927692b50e71909449d50f6a078dc85b0141ee8e29f6123c2d8666ce419c1a286387ded9f96af96a6c9a9c387b7ddcefc901226471b68eb631699281000c6367d42a392ee01916509d566390cd8fe6402a4085fc132a3a0c21ce39a183322315cb2e6417f040c25141eda855edc419f2c20919f4665843309003e4ad47d9a43f2ce219f509fcc92ad5b2002c40abbe5d32dbe3153f05ec32793f12c66563241d23f40959ef545b1c9f66ffe7dd11574a9f408538ed6a17fb9763b87e4b6525b5768335b85ef03fffe3d3008a902e284163adb0573c6b1cef999651c33779754aaa222f6ab563431a816c7a9a90938820174338c91ec486de804f78ed4a009eb9f26d32c87dd28af90cb16c3618d8378b616ceac1e77089f95c1ba6daec546f0da0b3465a4716f6855801ec905af3fb74aaad4f48c24a2b88151803e3186b1f386ff166736be92f4655c2978cea6168fd28baaf80d74203b602e0b7a82b3dac51f60c3c0ab8e6053890bbf723fbdfbeb2fa0e3909b6a2e029e4ba85524307eda8e1631b011a4e0a8baeff8a1e057843a86c088c53edac3c5695c147991735135258e888cec7855600b56a97d07170cea4458e231ca5def802875500cfea958ab7a21ddeb8520294defa87d841cebd6692489f867818013d7768828adab58abd4e8e91ac3940158c24328666d13e08622e1bbf8cd40c5315a840b08167da5ac7c32f66bfd0c54777a7e85bc11d557195e08129f329b179eada1f07b7901f34e8adbffd54e60c04628a19431ff1e185d4f9bd1a29d3ae02326b79c0043e48d436d2ddc09b7aaaf4cd494e4dce12b6439b94def3141531faf4026280c820b8875b4331e2c2922822a4cb808eaf70b677bc1351c8c939fcff2af5bbaa09ec4cfcd5c3283027fe5fe60cb3ef7a36b6b10bbd031de8665461f941a2630f7123af76280620080133907590e1df3fdc977d93721bb2d884027e7b105981b958b91bfafe229eec5ae8afb3e1d308b25d4b1118ad66b73a03db6574f1f58d969f37206d7eb7270ed300918fb4dad2524a8228ab25995c90483600eec37e7652862a320ab9a8b3d84f15567af80dfec9c4ba10fba5134651f3e26b30d29105fc6e8658c3e24ca09cd9b6b0bbd5aa26fdc2cb04bbd499e0077852d454876da5c9696cfd459537b51358249a5d7c57cfdb5de7d4622b30106ceb6a8faa7c40ae25341c2a6a520d936f94f5e7f5c1cf039465dda6b128fbc441b5ed0426cd8db68c7ab92439756ca7dd4e81e2d9f2e3e5514bcdc1569a4c69078d6dcc57eb33efcc23f5e00d14fe785ba7682ea37e59c3ccb7f984a1d06705b39e8f60964b6a49454237fd0b31ccafb04b1b4b70177a02f979568a7b3f8c110d43c5eab78a10315ff89dbf99e42a0abe516da8ff65acb58ba5933b5af21743724523a6e32101cedbcdb71dba24ae1573431ba4a71d49dcfa72ec27bc77aa95b16a41e01265fe44089c5afa983f92237fccb279b4102712ce1dd36de2a0f7323fd65a7055b2d691eef7d3f1355301fa33632a08f2cf5523925f2e3ab18fae5fb9930c3cc426b8f7ad4f2ca98acbadb58d0cbeb2e193baa1618ec78e0e7b864bf514d65811f03666fa60ce9585490dcc300c643fe8a62b8dc8e92720ea70c673e7a8d19adfd5f5a5f5473a9aaea851c421d2d7992e0670e4c05a9c1bb2064109f30486600e51ad476137cf659cb3c46e622ec88797c6af0e2c30e14b3c46cc24a6d04724122b53860a245e34acd38183917d7f22ab0ec5dfe282af2aaf2753178b7d308070dccc9ae0a331b36a8951d6d8f840cb6e85366d60988e8b33cfd89400eec9fa29f610b25072be388732c7d3fc6828e6332182a7880e093f834881b08990061f475db5afd9b587e3c74b73f4f86b0317d67d50a0147e02ee4f7b12aa030b2de2496e01da1f0d623acef6e9f447f751fa58df02acf4ee35681008513e1b9628f8890b26173cbf0e611a18762489f34678045bdb51ca8ce8bf90ec1366a6e0d754b2e34790b4490eff3968c138119d139d9859c30bfd4bdfcf7a266406f484d752b9c66c981c5d591d8c919495fc65886077e147fd15a0839158a0ea66d3b4fdf74c2d80af8c3e63289025acec0712e63da8ba73438068ee709ef562a03756c1d16310d149fc44c20858ebf59db8af7d1ffd99ad50faadd37535c5b368e292b5d6d654c858e00a14840b56b232b7262247d99aeccfd529e9e182811bbce683386bdaf51c3e0605e4417b2023465903d15e61522d34ed14e38c2e81ab7cfea9c484adf682e07fc6400716f3f3faa462beb5ac19b707aeb432b5856270ebeecc3f86f5682f1bf1e4abf755a244e49652461bc94ccd0dacd0805ddbaddf5061ae30152668b37119b5ff5988a98ea4c032294946e3a23a6538025f3bef5cffff51f980765e0763e1dde6c78b23f96d45777869d0280ee45fd733c926782ab06408ac28697599c7da1cc9e2e23f106c57201873aa30501cbccbfb6e81a302309eb204da90c91434e3f31b59b7b3d58ef7ea658cc92e49a280a52a4c0c7dd8c362452bed15307798fb33a5558c335f8b3c28c22915c5c473e84bdb95b53f190d684649c0dc79327a8978a3c1f966f2816cda08a3228fb46eee4da81462b44ba26255f8c7018880a7c14b0243ddc4ba4b0b0f99c72134b6fe8d164c385c07938f942f9b0acd8552b218b5b377c4929bf4211df4c710644c4194487a18ef4347e5129de9c12e99e17c918ef70d0306adc84c020f6402353624f7792ce8239cc482208f8377212bcfb0cae7d7760f5e60d29310070439a2c736e9a662c1d54ea935f38446403aecca9a2cdb34a444e8bd424f17bf032a0fb4faa81e8df297de5fb5d552e3c8b40c5558ab6732834d83e1a311b9840b4b6a5331764e0a1a673498190a330afea100f5902d440d46aca61a0a396123a86806d10432385d863c9a75a4b1f9a50d2d271c1148a3144017ebf1d2ffb4b7fc258aa18e6aad872b9023d37052bc6905997722bc6fac27418c5b3b529d243210aafc16960fd7b941321c9f361e9097920d35293cb0d0887e461f2662719f460d2ff18b00847905a07e1f6f3c442379f513249c8388c88571552b26bbee256fd8986dd2c122ce9c08872d14f1b34f403f6737c17ec34ec99be0174f10a9de4455e91f8cae4356680e74c065671806a9b9d44bbd0050dd4016ce3c7dbc1d3857ca35cdf70e6a6dd8ee974e11dc869d2baf82dea31e092df130f3f88ce30cfa9378b4f14d04dfb7bb3aec83c68c862f16be54cedd89c56f401588081d3639d3aa7629419794aa4f0f1ba337ca95456bffe08c6bd68c7c7b3c7fac830551d041e585efba1e87197021bc36d1db8d48cb497e4a296e829b376eb8376c1a77b54e4ad4ff43d96b663e9e3d55bc45eb9055d4175146156c0da117b76b586fde64d476643dd871d8dbb5018532108f5e570eb9a566b7bb773e222a0e43de5b9ec4e4b8a5ddca300352eda71c7e11f9fe3a8f2d1e3fa66fb746930e81c6ce5bebe8b39d7126a744981bb6787ebb5cb266a5ee1258b6e0a7104c7a1ae0dc8eb53f912243f90aa33f06e630c7aadc9d0f7238808cff357d924d25d7bf36e80cecc1637ae9e5d80e79acc30a786dd45c7e1460929606e928f3a897559b6609a6e2235cd2947e0c58de9eb849cc17eb4de5bfae428b668c60181c3f2840bc24cba6651f6f1444230e93ace889a9e19aac2ea321f7029719a0da641b66f68f83f70280e21a2ee7a9b330141aea342bb105a6e91a459e62170de78afd139d78747999801ddd90fe1293bc8a250b75332484f3f9550588362aa21afb242f98532385b27b3ab41fc54aee30e35bb9e9a7c58ec3196cb47eb958a18e8105a23c3c56e1c310a8bcd76d0023f2986c01f26b7a5d2c6f9b025aebef5da69c289750bd19940f34cf6bb1066e409ea0d1aa0a28c0befd11698689bd48666a5994ac765989e6e6bd723667f85ad8c43328bdee488242e5d78082f76de1ab9c043932587deafd9635b0ebdc273d37411a48542c8d4dc6675314d73592f99e8550045a088ef5374f4803e823c2b7e8fc1d5193b50718d475ec85c02538e3007f553b88df7f5c5a273f30847384fcd965ec18fcc0cf88118b61cbd3322f565a64e0d9243799c1b22dff5f794ecf27df0b698a4db0ee2dde841be432a23825a0990ccbb280c785e0cf128207c03a838f7597d563f1c9337c9726273affdcbfe620125d0f4aa1688296c07b444d06fad1e4f0b97fef5a94064aee870fd0f1b43ed8790bad1e3c36fcba07b1f924deae0288113572abe2039c9cd6ee592b7f47f545609bf0ff573c9dccceec93d1bbbfdf99b96d87e8a668ef5e64d422fdcd3b75f945e2a1dce0884d57dd89958edbeaf82b3c4770631f2149c7f191267f91160743d7d8b166274168030c0741f304d38f02f698ef4c3f9d58ceb4c1f975895a88310c4730f9026aa833dd1cd0f5d9fd1233b3d5477fc7a8d6ec128ae6e8922d441c0c9541a5075a2bb25f20a43e1ceb3f58338ab2ad6e5aaf523beabc4bc33c770dc8eed86e3e26ce3737f067846a0adb571203e8609c76259e4bbc4aafa23d807d493eab1fce07906d31464d5f0df4756cea279d710d135e611379e7c8b2c5b0a5a3a38409e21af90797e5a44eb9a571fa4482d828ade47309dfe6da1b66611ac4f2e28f861f39187662c2f6e033d170e91519425fbd1a554ff2ab36e09339ba565587dfe9d46cef37516c9ac41dc54dec9457c6f4520534bb124a9ab99603e046fdf1974964b38668d0156dd639d4f40f7d686818385171241a5d76f01299409a5d518d8c24bb7d474552371a3f18d08d90dbe9f1adfbe5e561966c069c069eee5f7c5b488d238826f79b4fe564a107c8ba86d0108b592e21cc65f0198dbede778917264ae769800e54dfbf2ff5dcc110e92c809c802c739b946830f54249008353b817e24c840755cf9acdb26229c1b6b81cc8d3a11279b038f7036133012778cc575fe79d35672d3de1276a57ffd7bcdcd1122463e1d3d082c5f16f08be0411ba67d25f7f8ad4f5f80269275880420e67dfba4052e79e2324bb172e3cd3c857bcbb793d5e09c70a91e2b50b793be0e10c53857693ae679f62af68b734e4a41c6f7c5374c27f17d7928a29c05a0cf8cbd74bcf760eec0a6109b9bacddc2372666e4e7ea98a2c0df52e165b40332a62ac74b8d4077e3238ed2698a07bea1f238f54c235f3296096640cf0e25f5f4c108c4282284dbbb90d636188d7740488451f5368ae6da7b20200dda6061d85c81b1502b69db8b740fa840968a5af10202352e0ab764ad0dc3c568b01e1509e2b6d859b1e960e3a0b0d3f700582a303c42638d6a346e7825b3e8f24c81fb345bccbaa86069ad4b09f624d6210e68d7805695b415d56140a797145d0efd9cd06d108efd370e5c0edaee5120f9168ae21ee7c64fb29660817c7f8c73cab385fc67fa9000d2ac5e36382bbd6af34323daa37e13d2725d395193f0e6d1cd08d700c345aceb3c915fdf739fc31ee0ecd9ce23228f06f80b2d2b3a537982955c21213db114c6bb4e31df23503c46fb5dd7546e5b2694d0b325c92c2189dc8cf6fa862d6a4a9bad406c645208a3c35932c2f1bc4e408d0072b1856193486f2a97bcbe9ce82e01793fa44aa8af91cbdc03f09379a0fbe4ea0f3f758fc55caeef8867ce236ea86bb87660d3065f50203ed952fd8655e364b680537e8ef54c60153bf964f87ab983c3f605b640f2d848437b8b6623b300dbe318040f458891d99d3d28bf9819f248656117c8879365a4fdf80c5fe06fdbc06fa7e11b84e6648b46ac6274a4af548894606571811c1aa389198120f94619989bbf681cf677503d08db59e7b55235c86f2c48a4ef3a744f3439caecb8cb1168045cd602265b07c7c26a9f432cc3e6266a22b269053dfce48528a3a270438a526ec8464f37048b60bd7d454fc3dcd5b1bf9bea590d9f89b4814440daff9d8513095e215799a645042e520ff0d8b02352491c03193bce8cfc08cd47a994c5fffda39bc728153b20e804c8b389f6ec646d768828136ba0f232290f59c35c0e34d724f6431cb5f7dabc48d24a4af5610353c47cba81e3b0763df6025ace5a0e367ef6ff5460c728b90e89c61ae88aee98966f94446b6bea22122bf166ca8c44e672a3d295a82a1b40914b621c5a4a311782a01426bc1ef04632f194807bdf3b083054f12060b44fb53f9d1e291657da9cc19836b32ffd549847c216370781bb935ba0734874cf7c3f06744f38dd9a5c763577e263d0674dafd9bb19df2831b0ed9f788c39708878146f74d991115898f6a3717577ed129cd637e76527ccf77be04d2b3af524fa30bd8dd2c5be363582e1a4267cc9ab468b56efefe6a325bc30410060ae0a7401fff234ece7e27cda99d3c6183e487bc921ccf08f01f6271b134655272002c0819683d0f4df4d829652c44748ecfbdde8ae49fa47c01780fec7c8f9622f15b244ec0224007b25f9aeb0fbc4fc831c62cc93046dcc5bd8ee2b9254aa36505d0dd6422052afc8c0221fa9d6467447bd187ce64bacff3d3a6872de232babe316cc17254085f31ff8057792b08f0d16f42ad2c409fe932b4d116ace526b9d041b5aec969607b2efe35ceaefdd69692e3ff3e7721b584a16f1e28a37823a8dcb5b0a23f17f6545d9fa6eeeb86885b685aa4c263f81e4596d9e17ddf4bc9ba1350476eab20d40bc729fd4277630b1359117e3116c8a146c694e14b1a56ced0cc54924f8271e94eac3ce17d0dcf6ae51b807a8243838105cc763c3cec5b4669bbfd501d24f648cc2b2f6050dacf0af6f1be45b602525c8ce5c34200889b338cf301b6e19148d5d456eb99f0d101c695cfb0218fc2a0140cd42983af9badd6ec1deb3854f2e06079d525d5c371f2144e0d6ef98b2ce1b3e233ed48474533881831694e9bb176b4e949546bd09146ebcb046c82dd7b1ae74a6a01ba850ef9ed877418c36f47a5490f2237d7bfe3dbf6fde7fa2aaf282475eaa0eba538b8b74edcec806be5da3f8f22ce05744c3d6112929157d359f451caec048b64d704a59367362bd178313855447303467babe705177c1e7a0c5c2702beb6f54643f43b5eee0c0d6c438c9fb209aebb49930b9a4d85a4f3a248f8731d608a1d7444e6ec99ce3a68c091b5891b16d7027d48a76891d5dd675c7e7c94e7b8de00ab2832da0ce8d1d42f1894666bbbe51e538389de17e290a1dca5943627dec2be82f510dbc70f9ffb31046ec334327411ba7e5386284759271dd44d0901248bd400e76c17caa9d1ec4959de1830da9f469314fe2891ec9defb8a7a1cdb7fbb070b2d82c83c39bb1b659030802b5394e464ea6910a2e2de69b0466b2e97a65578fe781d00979a6b3a605f89059c611bc0a1ad2f9f6eac5e51704167876a0996d76c2211a1ccdd68448e60302af2f76a69bea6186a62347aebd08e420061779a45354cb80f0507e7dceedd56dee3750598ecac3858f89c093a7a0129fce52b9661fea290cb8714327a76179050702942867c40ce62baae094018fcdd5d7fee0f4d3f323896531c7ba34363f9ee77a28dd14548ef043f33ad7a7ee67ad4b66742cbbd0418ab8b50c8db69bfd93055430d2173e3529a462aff59e24cc1eed342123db7d1164bc245e0030e6b4155e301b7c48abfb9c4326b3538f6b43bf1a046ed4b893133f704754bf8e5681e998f93150729b35d7e3ef6224c4029ebcfeace7c4c9a1dd924461ca473480b2673008d77045496b061f0503d648d14b1bcae39624f8f122aaf792c4dd6b160999455912af5ab895435fd4728a7001648df9475c7c020c5e20c991c743d8ee9fb0c8888a8cc679d32ad2bf32542583269240a4258bfab4f4a50d64f4c6cf8c0603941d2b328b8343e658cd9b23f0044dc11cee3c087f322cfc90cb0a98af502edc3799dfab434b9ea4cba3dee037cf6d8040e93c79d841489948b6958dbf222f9ffc88b18d995f6e0ea87cd9f080ec3a3be7a280cf3f08b389137734a7e49a45c7553442b15c174188afead0a9d8727e863bfdd49b66d07ea6dcbc17ea4ab8a405dfc9171169bd244b32b4938041f28d200a39718400bf40776ba5644d5f470d6b3f6bd612d6528f9e3026aa2464dd33c0521960109960ecac7304189e300337b32d2c463d40bb114f930ca372524a341153278ffb1b90acd83025022197f9e8e17b19094b919eefe0c41af5c3146244ec6d60a2d5a242f8b12628ba0c57d8aa130fbb070072604f8918981ccbeaf212eb7b7084ebb3de3d6c0b5649b779a5ce94f4ebbde061b982c406a1b031cee955d486bbd6cf9a6d7540fd035186f72c0c80cbd0638228ddc6427fc7d6561bfb712f4a7c74c675945320bf5e75c970bc6c830e86c839958c69a4c810e68419a0dc5b2808deb85a65401c2c187117114e6f791bdfade9358e86494e449c5b11d46e7f2f6cef0fd54b34063e84097e9c4c1cef75192ac4029a6d1cef27a971b163b10d585757d101c956b1392c3a685d9172f4a9b345a677414cae69626b7bdbf8d72c0ece53802507a690c6082fca665c808124455908e005b4f43b808ab36b5551b68acc880db7853ea3971e6ce23765d44e8a15a48400b0841b7d4e3568ba47bb7b235893327084eda983413293584be1c27dbb832dc398f7702f52c957593f82eb3c479a8290d3e9a5d2a74e98da445427c9decd29dab5d0d6084e5127e49137aae1438f2ab6956e84edfc9fb55eed840cfc0f0b23d2edcbd78bebc6b20e0170408ac39f82d5b86c62e48ef681b234fa1c0a37b545afdaba06315f9460ee31e7a967b0053ee46212850b4ae048536d4c2b13ae9b557d0b85e19da2bd16b17b3a707d061036a770a3806a18cb5f6b795dcd05830e05b23fc904a07837ed049361cbf206b2d8d780157a2b263fda05681058607a95e2b4d7f8b7dea2d05499c63b678b387d0e681553cf4e39ec3a7b0df94b09d51d193a49e211fb11a85d87db802bf18ec1e4560e8f2e8f1fdc96656663801f81b6c2b93b1dba124da071c5a7490408bd54293469573a240f4adfa6f5ef02308ebee4aea4cb6d07d980fc25cc1939264d9c78f4ee6f8725a2361607988fba647a6d6ce5d99db5da67af4b2202375b34a4675c7c0c323b00892b380fb505ec0793d8cea4921b8e2418e25b83497a8b90d1f9436ee5c0c65f3d6b82984429729d6739f53325e4e7ce5d4fb0fc88aa913ef04d3040bf84ff5ffd4d430fcc1c12593116b7d950b5ab6876c7596601dc7d13d76b3b4a64c94c1bd680cdfa3dff1bee31de2654a1bb3cb7c6210dcbf1cd0f9c67da6ac5cf93c61fa3ba414a92960bb928a3b79f0ae207a18e2a0dc68e095017bf12f91bdd40c6c770f4a9406861a7c5d6ab0e1f38e46175627d8ea56516b40345c06af559a0d42e84891614b7b12275be8269a1a748a4f8ac394382c167b65ee2277ea766986c3dbc628f5de8981fe15d6835e2fdfe4960087bf1e426dfe70477c713b526ace16999851d6104ee41374c5f9df540442e5247f344bb78ec73394e3825ea02a6c89be734f5cc46fe0589b62d24de060613a99b90452af3aac1486a407f6a86a2674ad506d36a02351c69aeefd5f95735be4d8ab81e39a1a87ee8693b4f60731769d056d7710ee9da8bd5fc07bb680f236d5fb84186fd83227ad67b48aff2ac94059fbfa17bf3afea18adbd84b96532a47a176bd0af7f240c57c2afa359010699c191e22e1085ba4a8353be37640db82fd78ff03dbeda9e154f82c376fd26c816b74f6b4dda5c8641a1734f1edf6d13670a7271635255c8948a014cafc8b70cfa8077cc66c1e60739d8400169c014eab66aa4203b606a695276680604461ae457f70ff7610d5f7c1d8bd805caf1aa76e7fef6fa8ac1f4e9f2e34f95764ab9d80e59935cb83e6698678dfc03e018b7278a418e47a04fa913fb3542020914d07a509d2269a3487d8c522a4c878c0d48ff3ac6069ee3208fa09a422902b83913d0c038e7296acb60166055d4cb2ee67d5a3841b88bcbee7ab1efb821d72b3421a28108908917bcbdd6d4bb9a59449cad80ad70ae60a3abc3a7e27e1ed74285b9ad6b6ad08b715494d9becb6c595b4acd62abfd60ab3c496df9dd46da6b997bce425bfb714b7bcb7f45d57baddd370bc7977fd966ce63ebbfbf8397c4befd9c497bb2109fe3af65b7aceefcfdf4afaa3578736db585a2710e167fb993911601bdcb10a22b888d0da04d8b10a1d206a6d66a9bd41f6a53408106f71b1e82167145dba537f4ae46386f6e3c7ec436ec85adbc3cb6cc0b8f627def68e35b76dbfc5b93db76d1c879fdb4ca8532a06f5dea7fc519febb0d33d545bfbccb1be3a96748f205bbef5e7ac48719e6bb09cfdc38e5518216617c168cb18ec58051162de4b699f7a8b8bd1fa3f3e98b0f456ca6aefdb4affc4e42a697f9db3c21404081793bf85f67f384cf7714b9ae996f44dd266a9a3bbd2ce6cedab69cb9b3ea979db4cf2b7df5ceb4bb7afdf7d98db7458d22907a5e5ac90305299d65c272f4d153a3c9ee586342ea67146dc1037144ff077aeede7c7703accf6ddb57ba6fc9acac9f4f74f9fa6bd29ab689cbefa769fc995b1ee1193b62d3da76d3afc39e557ce0a0ebb9502acc6663a5b1d690bec56adbe9c0b72e838d7b2a06a9b94958b49189693dec2c9d1c1c9d169e1c05a402d8cb342c2b01c916de1e8ecbc88c0745890a5ac3a3b2f2230ce0a1c1d2238393b9c155cac7acb71328e9dad6d7d66dba9729c39559c1530231aa7f118f88cc78086e6877b4c4c4ccc0fefc2365fb6a4be525f0e0672cba918e4d06d72f7820c73bf6e7f9f865b8dfbad4a4e8741361d87a0fb6a698363e32c3738ce92c50e0671d35a87b6fc999cbd9412c759c2ef5e6023ede7388bce8ebfb6221286a6ef0d67ce9e1fc58ea5b5f451075d86cecc6d66861375b4221b0f1cc400e3c21b52a8c3e215f7fd3d70c4d536e28e91308c846c9fba4d9c020a2137db7f9b1c4642a6f779fc675fe9a3fd89e8e2800883460b5b7e18b5f0340211945fbf222228e90ec92347c25cc7070848ca2b53de634f24f6d4b21b0efa53cf5fcac1a9695266d2f1117208c65e6c70deeb9cb3dca952ddfb94d2399feea9dfc11d53a5be70159f2a1e51b6e2113c1c3c4296d72805e5d586a1941f72cbc9051e9fd77526eb6ab799120721bbcd64cd9da93359f7a78e9c2bab751c94380e4af927125749e33494fe722874e420c58cd026b3cfa982c0169d455f624e1a425134d5fcd018a5618f18bbd3e3388fdb30de9dde1e7fdc9c946eafe538382ff76da54f525c9afea5cfc6ea4a9beca7904208c535ac0da54ee8329eac429ea554282946c43b948b1c69b2fc06c5f8e9b97e1d744dd3e1113c70a6e5e12a33b3b1c274491e5d4c0e1d29c6a46a3bd264c9a46be767967ae6ae7ba87ed84210b6e0421c9c524a2b254e0e6552179343992437bcfdac71d76afbb8afc86ea148b952badbdc21dfd82187315653368ff9f7e6ac924131bf711c47728d54422a514fd928af369001c9c17abfb86596d2f58cc150d821873208298848aee4d7228993f26c393893b2fd70b6f6dc564f1907a72379d2376364dc67fc07c865b0e4ea26311272f61a14af7d84b34c0185ce9e930768c6bceacfd2cf973d8ee4e08fb394b4273938915676ca4c1d6799af2d93762875f654a972be376795ea826eb3b30db0e31443aed89b9435ae325fe6a822cf0e634c0a719b1c5799cfa32292e7ce9e3fc790e5469255d38fc6264d6268a8d8918a277a36ecee48c50c74d690fd6760e3028a4161c72980202487b3ac86a83b628bdc7165026166c7297e20b3c30bb45dcad4d60c4d8d74099136ab19251107fd652893b6bfc7c41619e30acec9e18b9d8232b94cc12da5d468dc9266195c43ca1c65ba22a2496b44a7a494d23a658f544e8e83f1c6e58ece910b2a4f25368592bca5b43ead0f437d571d9dd5c3d71ebe1923993d700d12bd9a7ac666ca475d6596ac7ef59baabeeaa3b3a826a5544fafc336be6e3ecafbcceabd455363defb6d23b1d6c29c446d2d49b55ac398fc094975f1243af47df22e74e8db644e7b62424f4edefec8534dc3672c85a2d456129239f27da1dcdf77d8868b9f2ee68fbca595db282a45e7db12cce4e4e48bdbc4c4060132bf8e5417623f18126a4247ded2b72395e4f5c888a523245fffbd3a479e9a9c908c683a475e7faaa731bf8f8efc6b4fd76aab25f9fa234fc351df42879985a63ff2f51b79d55b7bf219d6119b28fd239fd2272a1509c917b789c988c9a3dee447504fc34d4c4850df75ef2d7ce2724a3ad0c473fec9533af18809952637542a950af5269fca6380f2a98f07bdfa56251f370afdec33b74bac8d798b8444734328148c88833526a6e3333566b2522cd5352673a570316f2171561c25e9ccd8bd2499cb09a058106705508ab36285f2a839e2446cc42485f28572a3fcea35a90af228e1dca8b7787572622b09e556f44f9ee4a3b39cd8153d39d1e1fbe4a983272f71895ed1d0674c7e64e48b0e96c89250ee932721513dfd42d56723ee920678de9390446cf226daa483fc41f69f7c263ff2265f90ad2a1979922fe4ba4f7d284d4d1f97530e526fce58d7446c12754dc462352615d3d1fe030b36fa3165080f2929f989e910d5094a26dbaf3f1fa6eadb43b5533f7c5b3da4f52faaafb846cae4ab8967356769d5f367b23857a9f527957ad4db2f85aa2ba020e4abc99cf993d37d8c4f738d2c455c7130c6ecd287f367c7752851528b3aab1a4d958f7293a856fb73da8f0a51aa69108d8559ccf6af4693357f5cc5dfe70f0f0b08124efccb56441680475bd39320c8a6d3c7dc2313e6f499864f2672e852782c41ce827a7729624b9423992421398573e7a77855390757f5e7a7741824852a81837396c0c1e985fce32c40ce2a79d742b0d9720b3b4e01458f37adb57a957a18faa9c73f76fdd44455d41764574f7fddd3121d5da58b57623de78f4c0eeffc992fb6ffe5726a4ebdaf83abf9d9db2c2711391c8cbfaab123aec48f31273a6cde13710dcc861c03c3710d6c94e3ddf27239a542f9158d334a376cfef2040765e77196ed65e9e58f03390bf7f23d48c859bc972f831c141a9281e28a9431b6c3942de7e67dd9735fe925de3ee8c6674f318468c7298060b467ec38c5109abd659cc4d828cbfd5b9695c0413964d3bed6cfde9e94cef8e2476cd15e5efb1f4e0e1e92a7ae75ee882bb36a592471b294a1dd5687110e5b7e26b50a65353f52e98a980d596e8fd9a10daf2197a457e184a21da98801cde5aeb8e20a3bec38a407671f16b37fc72a9e10db5bfcc08f8e6c7bc5d5df6699d543ee473ca4f52f572fc1bd4441b110f4b3bd1a8252aa271680a0c352eb576bad756654c3a93eebd75a697c2be913eaf61ca821d30fa321d7fa19fdc8713b15e61de3574da73bcd7697d7b86b3b4e0397532a6d23fecb07a396ae1dd190bf9524b225cff650f26cd7565218a61ccdfdd8debcf8a16cfd16ef6b5bac48e4feba508c75b846bc5fe47eb3d6daed83c962c9da6db35b11e962ffc26c9f459c7de116dbf7331be3f6598cf7a9a5947ed4620cb758b8c56ce08f18ebd0bc69638a14f527ee52d4b4b9343e3e99b40d47b365510b02240addad6887f37f380c47edbdda6f42d2856e433b9c976e31eda7bb0eb7d89ef7efdf1b9ffb3bafabc8bf917ee1dc36216983fb2f7ddad36fee7c8b48976e8baf3bba6998cacd2249618f782f17afd6abecb5160de7aee9daf2b722dbe33f31b942bab52f611bf76136cdbd76e5dfb9bdbc3a244190adc856aaa1c52ca3f7fec444d0efc1d1ec935be560fc4839ba15912e728b6d9f3a3bba088292254cd8664e7dae9fb7d4976387ceafc304933f878313749589faf0647a697a914ff9e5f432b3606653eec664a5e440fd4c71f0457e148ce9f3c3a0fe0b4d7fca2165c171bbbbe00f51a80ff7e6ac52c510d44a1f6e6f5f7ed1dd7dbed57e037fd0ad69efc3db9ad6b412920eb17fc84dc1e9856d3b89de0f973a6222a68681712260a6e6e44c9e818c42a6ff834618a59b50540205028820aa9659204220360d07dd7e37cbee0ef28d9e9efb52defb975efa7486835ea9d10f8a4aaa1711d99b17538844a0ed39bc4a223176d459b298bdd459021167a935a26445d5863b93673f0890faaadeb3ed07c3fd12bba6a4956f232d499a92255de24476fc5a350de3873f9eeb3849a35e717f4f593a116ca3e46389f625b0784c15f7f8f3699595649325ac83d6127a497428776a6845a552894a29a59452f6c0602b25a50e93187f25a24327b2e326ad94f86595324a19ab943b250e6b5f82bf248cfa17dbc0a94fe376d452e7769ea697e2a7a55f82f6b454e2e897beab79c060fe399cd3f335ee37ed35ee621d3c4abe044d752caea1d97ba72689ecea4b902e3a4e241a99240108373ef0c18d0fa0c099ef6dbf79304396883f2f51d03ba736bf4ca73e4d7b1a73524a8f30c2c1f83c22cf8c983dbf1b925742d03d3320a284492207658dcab7a7c99e24dfc8d7e53c08ce97164bf47bf4d0b43b5f5145bea68bb0a6abababd23818445290abc42092c2fbed989ac68cc369348d28cd96ef724e3d8b2acd64d11da749c2c70fafce4fc1f6bcdf24fd2f891f72dffb94c856c36aa36dafc168443abebd51d8fd5dc3165b2bd99ab74d1f461685fd8c2cdb6b4312867c4d7f46145764d110f7a5930e3317d2a14a4389aa56a7105bb2975f693a96d5f69b9e4330d79e739ad83cb7363fc39fbfb0c5b63a09b9394a4444fec990d4fd9969f7831cfa6b673f5dce2a21f9120d82a8223fd3d4411236d88ce894be420c33afb03edd71f02b4cd594c8cb414977aacd16af8cb3d39e86d7a7434676324ac459e6d574e76bfd4beab7f9f23ea43bd47b4d89382857f7437ab3b3e5d31b67c9d1a144882d767bbbe95052978e7ba9ebda5021f5ab37ae425d5b17841ce71021fc293d5ff3a5cdfdd4d5e9ab63a6e7cb41195bd6d0e25526a6ad93903bf457388b68b509e9cd96f2eb8db3c89c2dbf13429e1f7748615bc696080b31282fbeefaaf7ec37e74904e350d973c8419904ddf2c6c1ca33bff23828ab4d5c916f9361b2ff21b7f6e12c8299b3681e21cd39944a7fbfd0ea92a63007a53669389fc2b48c27d3b4270839a49bc292a09308e51942fed31e6799afcae32cf7e5d79e6a3359f20d5145beacc36522bf60cbb7a181fcf99a39ab54ff95c6596ae4a42ee390c78c26cb951055e46bd794a7894a12392bbeb0743dc8548bb4762b1c74674f77a67dc82b7608646b8f8483d441e9afb822372db6d03dafd8a18c2b537b190ece4ccf8759e1c83ec79723081e64736aeaa0079c65d5c36e25aa113c8e7016134d96576c6f392853a6cf97b3ac4a2f5b449c6555d24380bbf42539e3206c4221b6c823c4956f8783db73dfa6e94e6c29f96bb2eefd57a9eebdf7e5e3325f12867cfba16febb3b5911d5bd3f4c80724c84bca710d5a6222f54082bca45ed10a5b7b8985adfda65f5b7ee9f3d1d9618ff8b34f90fab8e78e944ebdf665a92f4e150d05317b3e8da93d20bea4fe085b7eea6322480ccc86a625b30215c4bc3411e425a3b146238ca83f285ff9d962ca26b3183b7b8f1167e4e2ca06ff55aaec5965719f638b117125fb6e0839e4aecc5e66df01a09db1664c950d4497084818d967cf23b6d8cf666c332290a96496452eec8c5e98cccd8e30999a26e0ec5845135c3b8cb19dd9777ce906b2c36dd712c4c4c4ac60872588898979c1aecfc596499335b1c5944d86ab44a97a57f9b6fcec88a942b3ccf58fa895685a29329d51a9c442cc2db58cb842375f627b20ae501e51e4500611123d60001082e892f247c496ace579cb0067943725c69600d899263b43656df34b94d2cf90a03ca8f7449e20e68ffb2110fa41d8e4888483daffb07163b35bf65dce72df0f6729c18f1db5d60dd7c8b81b7f2ecade31597eb3ea070483b891c359a836b5b9c2217ffed4e108541b667e90edb8c67cb9550e0271bfebe0e4aed6d141a97216df4ea5fc2c4d753bc8a16afb90d24f5649ab54aa10d4a8d8e8e795ea836c950ee536d94e9f6f93ec335c7f8b10907fc2d9a7b7dfe9907ea7df64ce7f4df943d34793f7a69f3026efbde8e9d0f3fe7aeffda6453cb779d97b93a723e020fd1c38fa781fc6cfe12cf912879038bc3fe9d076ddc93f3c9d4ea7150ed59bbc890e553ac8de4e9fefd3d36bf2854a488df33e95c535bc377d23bf6d9ce91bf99310d9fb54a76fee922fee0d73dea7fa8885387d739bbcff4177f7c19cbe7bd5179edefb1ade536c63eed3636c83260d5119bd3b75efbb7b4ea3f38b28e11a3e70d536b8c71fa38bf7271dfaec7ec2246123ee2b39cf33455515257b9b7241ed4529c626839b8181e8b68db87f78db46dc4138d8c51a67e7db54eb7b2d7dbe33492e9d5eee12ccc9c712e1f6a527f95638ea7b9fc4e94b327f2dba5dbfebf6266157dcef77eafb2db13feaabe11f63dcaf1ed7e61ecb989d3ff9847daa9f805d2b76edfb9d4f4564457427ad3dea93d706d7e9f00bb7f73c7ad2618f7deabe30b5f157acc3843ffee983e974e60d217ffbfc75560bc13dfe3b59f185de0763ccd814b661fcf197bed087e01e537183d6ee3899b3cff4e5eefdee67f7d4c1d97d74b0cb626cc91f9e9ec8a79fa68f5f28b7a9f4deb4df753ff3671f7f4e39ef337df7e52f091957baff41b7f7a56fa35d57b18db87de74f5eb1e5172ea1822d63aa80018d631bdefbf65ec335bcd7283efdb6fd46e3ec4e4fc3f3574f30f94fdf7de1e76389158ed37b9f447ed3e3dfbaed37fe14c0629f9e058b08dbf88b57ecfcad7024609f3e01fbf4de97801d71e6ef43ee9386f1efbefb7dbfee6f176fa7ddf774a8dadfbe3adbb8eeb7eebbddd3ea78d3a15ce1c09f1f7b1fe3cae9f4855dd8bde92516a2fbbcc2e13df7618f9466bf11a476d86367ba472a253f8644ae90a28ea02db7dc5b848046c50d88f6fdb96553df9d026a4468d7b6264769e08590eeb007e794eaafd11952293a32e2c5e92491a4208d78502729c0aa67724a970ca3e5c39e2d24d2490ab08a42791f357ed4771fa525118a076b7904abf228e63f9d4ea7ce74eade84d2d2083feaa551a6a62f09d9492349941121927dcdbcc6fac917cc6e9b873a6512491ac92399841ff5fee1ef3a7cea50a6ec9ffd4d26531776af9d3246bdeb55a719106463bdc2dde3ee4ddda9fbeabdc97bd417a2507f7a8bb1f7a8c728eb796fea50dea966f79e7e3b5dd49f3ad49f2eaad3e1cdeee9747a99ef9fee9f9e3b71a89730f8f16f1895fd86439cf1e994b3c9743a3d0aed9e6ebfe9103fea330aa5f39bba3f9d4cdd9b4c9f9aa8b0fb527e14a57ff2bc377959c3e0cfbed33fe8c67afbfa5abd36cb5e35c8f269dcc82169a44b6787901fcea22f3b3836614c9289c213af1dca9a161fc62cb09833a24106d52f62e8c460a2d341a61184b394deff460ee7de335cfa49357e1afe343ce78fb833994c6f236e93e9abe9eb9b74fdd3db9c4fa6fc79d9972061e09deecb0e467a392ae7ac37acaefa068d24647f777777f7d43ec90c06f8d6ba0945eb2e65e65e0a02a4b415719d3be7cfd1f0ee721c9e97fbeef1873baec35873772bb215e9c19c3608102dd334ab050162b5adc8da38354dcb5ed3341c5c6eb361674b7fd2755ed775da4399de9a3ed39f544e3aa4595f1d3fbbe91e3129c5dda49c8300a95b51dd86b6d856c40b026413f24c9b90b70d9936cfd3e11693ad5c37cfe46593a773de9e72dc56642bb215d98a6c45ec91cdf64cd3580e02e4ca38ef168b52ffb8f7da2f5dfc9a6ccdcbd970ba3bc5cced6c32e990ee1c494767c85957d74e75555775ede02f6e8f87a7070ab1a09f29ba4ee3cf3787546b9090906acd9e256973237540642747ee80e374d0515050d051dc5b52928c998374491ad9aa43a9a45f40afd70b68cfdf6a50dcc251d15017ae6bb26ecca43bd225aa729ed415fadc54868c016cf9f34716605a1dc3f756e262523786cb7efcc6dc98ce08d95f664fbf3133c5b527cd8c09ad151d153904b7e4a2b5c2de19f9c6dc981bb3a78b8d4918f3c3ba635c65ba44507efd141041f971b216105562f527deb30a3bb6a7ac353a2a724863ead35d75b8c4a65ae38094346883d32fbd0fed396709234cf7170f397d58bff45bfd30c618cfd7343de99890e3477c1d8c3ee4ee3efd9dd69df6dd97be7edd17d6efee8e5125ecb48f49c3257e407ca9407657dff3381d5ec7357638215ff2e71a3b4c9a09d30309f22244fdad66bff2befb1dbb5b79de7bb576da87f6217e25e61e7202d3c71d26cd049025ae788218d820873ad8e18a17d33711e4c5a49b407dd6dac77c2e5a61cb8ff75bc99729434c8ffa96902f4cc42b5e4eba65f262d22d307d134b3411e4259b4c2693c9647a2766bc987e099396919169cd78c9df025ff2cbb4542ff95bf725bf8c871413a37a61c226c5c4bce49771027c6162de21e625bf13335eb2ee9690272b65075fc8422b8a9927b4f0829ab1828a580ea060069e972037325790e9814f12197e5eae0d9ca0851858a1042fb4e0a5f3921c383a6433bc674650ca0e51f6049d25c68da9623bcc791fe3fc587a6fce5a5dc6a08a3fbcad6d3f6a9ae7bdfb1365f027fc097fc29ff09a4be4773cc77e8cdc973ee47ef3c2897594ded39d97de4b5f4b5fdf72dcd67d520b2b2cacb00a0b2b0c1cba5808df3a0e73a32267f1bf8e9461aa9eff814df0350d067377777777777777afb0d287fe5bb518873fa6311ea118380eda5f553d7db0576be96b2d3d7e8f06eded3f5afaa817685248632c43bc0d17f0ec1f76a4c205aebde5dccd1b075536d5deb57712ce6eee8bbb7be570da64380e854f1ddafbb4c1d168505c81c596ad4281d6a14ae4df65df4defbbed4bdb97b62f6def75bfe1f787f1ccec293ffa5bcc1e7fd3ebfce9431a7d868f7c2accb54b47840ca33d27398d43d34a782fdf1f8575f8cb1c008c43655719076da784ecffddefb8af66309c67ce592ae16e04e3b8b4663fc1edc3e772e975587aa95d7326ba7df8f0f6fc0c14f235aa999cc9c8246d2be32ab6faf8d59bceb22ccbb22ccbb22ccbb22cfb115c234b611ddbcfeea54cf7f3b90f650bc7d4a197fdab9fbffadb47bf7be59ff74d5ffab8f73e25f2a6bfd59e3a85fd2567e1a93d273cc4f6292137a74ddfe4c1377d1057ac500c9fd0f3300e4f2b2177feba2464ff69135bb0e6416c897bde380b9d3cb3c7592af7e253542851eb909067a9f454eec823944a72a724774a72a72477b67d2f95b0165e072fd6e1694e2b2137d661e933c6d17d098683c9ffa3f449502ab4e92a93b5ef45508c1948e0f6c32684c7a86938fd81c39fdddb4783a817e2ca17240cfb34469192621cbc71448bb6b5bf69b54ec1e767db6af46145daf64b18876bbac2c9a86778f13da878c8233be21dbf465685d529f05b500d4f061518b216b6ad55d85b7bea74c6d806224b4615ededf3882dddbf8989c91443cd6a4ad0ddbd0fef76dfc53abadff40816e287dc9de642235a63629470f4a34226dc46630edad782e890abd80f0a69504883320da23cdd11b2f6770b39488392bab759b6a98db3a4a0a4763891a8cc0bfb990eb52f3dae3c275ce9ab47d5c8c1a24af4d59eb8629ffbea14e28a7defab5490306cfdf994b81b5ba41bf6636e2bd36cfb992bb3b19d4e6cb1db7e6d398b36f767553877854d2aa30b0d9230ecf748d92b25e8ceefc3bbdd0f322cb6dc6dbff2c4966c4fa3215518f216b260856db310a9d8f62750f421f7f6612d3a5215e5a12964b4eddb0d3659910649559e3ae47458b77f904cb9d18366274826d9f038d18c0ed0448a2d42620b857ddc53ac03bfb6c242acb86d77b564df4b3eae627fc69010f8a13fa799e8ca1357ecd3afc286d0c1b6d56cc0947e7b4d06614eafb4c77afa6cfb434e6f4b7a08eaed5fef4369f0c27e78e050b010ae61baff21250bb2a657da73d346db4e4f1b7feea6328aca65d00bfbd366b262b88ac3728feae76db6fded05d7d5f78f3efeeae6e41ee27dc8adbdcabeb5f643705bfb618c6d87b6ad451bc67ff2683a3b68dfbef6746b574f9bc1361fc2055b4c093d763fc8324664e4d4f3b432ba48154418b145321157b48ce976e6f398f7ce4b5fcab88dd36b8d904319346e4ec66c15441953630be2139bca1bc8a12ddda56f17006df7c0110e52cf53f24839f83b1c943a66269583487895364847470a2948418ad6d115ac20849490d26cfb5bfc68bf9404caafdebe9c91f6658db398bc7d694bde92bc7d792371648eb3a0de9efee52c44244cf2706f5ffa00c920292463cefab72f896491b3bc3555ecd36c57d2b61fad5d7d8bd5b7b8eff7be5f2972fd202c7efbb4f78f87a7f4eb773fcb50e6af3e6fcd7b73ebe46351f2a91ee5df7bacf557d0b6bffaee9eb16565bf23426e617ffbdf4a3eb9572d1ee535ac63f52dfeaebec56fdea2a4c5a784dc252cbeb9f322c2c347655aae625f6e8e33591e882ab1e5164d1bad5d957c57e350beb857dfddf3c4be897d95fd12fb24f647eca7eca3ec9fbe093483a6d03763dd3787be49643fb35fbf799444633e2ae32af6b78fce38685f7e36e496ef9d1878e6cdb43f715e6cfbf769b866ff12e17fb5bf5787f75e4dbb33c741abe3a0759e6d737cecfdd0adb0afceb08efbee6fdf7d2a1ee2fab594c6c43d2ea87eaa7e66efd97bf6b165cad83289f928ce42e32cab3ff96af2f55d88b3a8bebedb907c1df99afa8afa7afa6afafa5edf61cee32cddd7faeee33f0ee4415edf63ef445ee4ac4973b4eb7425ed6ab36bfd6dcb32167f3f7ffbf1502a3df76d8ff3e7bde9cb7ffa4c8ffa4e9ffa503ff2a59ee41bf99292a73e968899adc9ba37af566ff29dbcea33f9f9c5169f4c143cbc13ffd2e2bb22e41967dda9526badb5560a44b7b0eb7744c8f351eadf16aacf0712288fb10ed5cfe7543f552cbe99a3b3c3c33793684c2bb66449c88df2c58f5ee928dfcd56dfcc71b0fec9374dbeb9e3607dd5375f0ed62ff9261107eb937c13e660fd916ff238583ff5cd1e07eba3bee9e360fdd3377f1cac6ffa26d00c72b0bef74da11973700e4da26f164d23078f269283f55b7c33c955646eca90e95091b310cdbdb357818287831e88497fe4ee72d715d7323011525a29e7cdc4299243da6acd1b9a4a9fd8998eecbd354369624b1c22d3f45db6dcab74ed8a877029a594dafdeb899fa4d8a4bbcc31649640f3823b7a47e34aca8e9ee2607c1129ed5638a48e295b557989e96f748b0e461a35751d63d3df28a5dffd7cba99f2cff4cffe87b34ed17b71fa62b8cae69a9ba6fc857973ef7df80b5b6860f6ddf70e66371cccb2f0409c25c77cba9a1c87e22c19510f3cc490813396cb691407b34f8921c71da676d67d90cf06fd497ffed474e31c4182e458f973dcca758a83d9bf83d9c867a90c958da4ee45e57cca8090b1efcb70d25b67cde8d34d75b8c49eb4d6fae18c17258a828900b7ccf7de7befa63a0412ad2945450b5a3b8c3ff133ee6db819e07861f8c36eefc6907df3fcc31f16268661fbb9fddc36a22c7f7e8cdc87daf6a1297275e8ce90c3df7635afb5d65ad04b6f7f03638bdcf6a3cabe44ccdf56d77e0ab8e9d5fdabc1bf57bfd8f1d1ce2767ff11468dd01a8a41454b68d737c259e8ae4cecec1acad8f5eb9592fef66f2b6d79daf264cba922f764c9a852bfd65a9fea70c6ae11b66bfdee26d77f911203ccb123b6c45d3f66bab40fba894c4751d271d65a6badf59d98f152bf0920f75b50f2d2c41299b5d65a6bdf89192ff69b0052da010f8e70831a3ca10a362f40ae5e2206e1d8a109a0a12ddc218a973c55e4bdf7de7bafa54d64cfb22ccbb22cabba89e82afa4e1539e79c73ce7762c6cbd44de8207309eba928b64d7a9c2690524a29654a4a57844cffa5cb953068fc81a966c4b822530769e852c615ea72c6618b7bf36ac4941409c62bb68c2b32aed4f0edd530e920fb8717dbd091fed0dfbc49df3fa4545f1c92becdd996f208a13162c488b149a9c37d370d37c520fb905b860fba5fec30c603d1e874cf190211d27d627265fac22523d58171646fb9a0173f293d2873c6f00fdc3e9ed2229c45bec9957fbed430d9dff72fa47f3fc338321f5209b9adae0f53b3a02da6845e6cd7dfa44f5a337bb5d2c6e1cecba6132a354252a2323959c1ba20b3edffde78e0dc412c7f63c1c518bd0e7f84093d90cac7d5a30aad0cd6ec992a33fe367b86bc1f09a33ed10c14552ac7951ff17ea48b29c2a81f2367efc71259225be42c185ff6b40340e74307762adf753d7429df6d442da2eefb8e6b752ebedb7a7a7a7a3afddd36b40d75dd86838383d3f1f0ddc6c3d3b5f86e6b755dd7b1f86ebbb9e9ba121111115167f2dd26d375abef4a3d3d3d3dddc977a5a1ae2be1e0e0e07423df957878ba92ef4aadaeeb3a92ef4a37375da711111119752f854a325d87fa4eebe9e9e9e94edf694312461dea3a0d070707a7d39ea7d3787e384b6b4d955652abebba174174d16eec77df7d8fd8e2f5f4f474bfc359b767aad4a16e080707a7bb381df7ddfc8ea7fb1ea2cbe5f9eea3b7ba6e6e195dee4d47bfeb3a1550872a1f00d0034ee978b2f76d5c8ba321fa8888b8d6aecfc245a77b867abe9e9efa3c3ce661c3e1d97078d870361c9e5d1fa505c7626b6d375b8b87adb5b5b69b5d7f85b299106d32442644449bccae7fb22a9df40cf598f4d437516923251c9e12ce4809078767d757955c9252eb66a4d42ab56e76fd929435694425994e233269444425995d9f04959db41e6da8d37a4c5a4fcfd0ae3f92aba6e1683c9d86a3e168381acfae9fb23c996a2ded466b692dada5ddecfa9bf7752fb5ecba9a59737b867a7a7a867c7372561c1e1c1c1c9e5d7f7ebeb7d4b47bf64c569e36e799efd67ddc8bdbf9f26471422c51ceae37360dbb7e37450e2f11d12d729600fec65996e88700f4805f3cbe322a187cfc34c659d6450a00b00f8f6d90c642ceb22ed710ae18db1dfc2f67654848b08a2bc6b606e39f35ceca8282a6908a2bc6d91146317256f67a21555c31ce80b08fb33217904b08e36c67a70a9ed8a2c271564542d2417a619cd560fc2ee3ac1a3413e43518d7239c8a39abbe5e442f238c2b10c62f8938abba248fcb07bfc42f8f102bce8f5fba9c459190a40d120e92cec62f71ad099a2af56f4caaf845105de8117e249cc57bfc3d628b7c11bd62f877388bbea64ac58f23ba50a0c80304fe17cea2ae1c37620b7dfca0b36ca10f1b7f0fd185eee0bfce9a4853a53ede3825b6748ff1634de390e9a6b0fdc2125d991e74a8eae103a0c3fc03918a96d915d41c4d5cd95d14b2e783b54100d03da468fb72a1b5ae8ffa3a16d65a16d6dad3e31699cd58649935f1c09d64597692655946d95659969d6459e6999448b2ac7ea7d24a90b21a2412a4fa78e49e828e824e4141f5b99445d517d0e9557f3365b7baea4ead5fcad5224d16e7aa352a5546aa1cf568103d0aaa7fa390e70ead107d01bd5e2fa09f57d6ae455d3bf53ffa9b91a538c905c6a1b23b215c0d57c248f88873713549ae528578ea62a3dcd5744276ad33a3e1b3681acd231bbe7152ebdeb46eebb6ae8a7a371e8eb3048093284672162b617c72c855ea6f93f34bc4cda854444844959bd9f57de324ae8668b23897cf4817ee8908a37ed521ba4444bbd220aed40fb918ecfa258e060a99f37e72cc31c79ffad50a394b888dec50fd6d63ce52b1113e72d6cad7c7495d4c27b3d9e99a1ccd9c43d2254b18f5739e3d43f7e6ac523dce66b411f4e768266b8bd9391dec8aaa256ce3b78d7177b0da11210f59f9fb5287f868d7dfaecb196fd53e09e4607d017c32c855eafd520ed65ff954ae529f7e9f62bb986934592915f87262a3ec0457e3ace99a5cc6d1a4389a5d7fbae6b4d92967e12357a95ff3ae9b6a6ce460fda38c8d76f562a0c3e0608b5acc9eef5c2c9662d9d854995f7130716474b12e09c3c6262bdad7cb25b7e84550be5632a35f8c4bb0917bc597ac9f175131f4270ca8cebe8cc3d9b7e52c367b3ebd31f3afccbc337bce4d312df240073890b201173c3490018d01232e6081af408b2228300116128800041e80e280d50e1d0d382122c7100c50e128b9614308921a412ce025b5513414900013024e40b8b4e4037833582cd8000428808c0174dc16038600567e08c00bad7455401f00d043663dd0010e6c808706328001232e60810a144181094820021078800376e8680011398660008e1b3684a811c4025e360d0524000140b8b41c60068bc500320a408001c4802180951701f84105f401003db8f8e24ef171f1c99de2f33305a25850157ae8a147e3689c9c1ff010d919929272e3a2c517f7cbb4f8e47e99960a6c5c344cb87011c322c62236148699745424867fa116ab2f6e14221b85084c09413f3d4c68d1e275e23a7109a9c14ece8d0d50506a56aa23d511521b685a316f58ad8c487e487e80ac503424840595caa7249593cad181a207f6124249094ecbd49a69e246480d0b522999d3e71b15771eca43446388413222030a15db71b95c3bb08d613c4d9042403e4ff0edc5cd0911627383970e4e0e3ccfa521694831090e35333272e0b8a30b748182b2604414d3c2b6fdc4c862c858f1a101e285a5379115a3031fd21c0e7c487736f0363a882e39787c4877b0fd236b87063ea4ad0c7c486930f0214d721617ef3fe7105d7a18f1e1acc3f6effda750642171810fe790053e9c4515f8701eb1d842749133457c38bb00145b505e91256928f0e1844de0c3d923810fe74f0b9913011ede7fd64496d481c08753c8033e9c370ef09f341306d145faecf870ca60fbcf99d8a2328a2cf9a3e343476ac0873386085fa121bac8a21c1fba1a88628b894f6449a3213e7420067ce842389c848ae8e233373ef42ab6a7a28df7570d2f797fe74174f19c203e741fb84c64b98ecf6cf79aeda7f79776882eee23614c1a1fca2bb6e75864f98f023e944409f8501a21e0515e882e5e04c487120c41b1c54424b2dcc8e543c9237d0ef0a104da7e84e8326792e08aac49c3fa50dab07c28710cf0decbf850d260fbcb27a2cbccf911595367aa8431299432bb00313e8c6cd8fe22882ed347d2c416fcfe48f4882d17c6879148001fc6d8caef88acf95385ed8f23ba4c950f230f1001f81791358da6cadc5ab477f0431fb6fbf051d543ca8773ee1ea20ba549892d95d6f8db0ee8c90167d9800e553b8774b1423c764c968d69e027031a03ba8774b14146e8d0371293655f17d0e1b5809e5f816834235d2c5011333493655d14d0e19d008d046872a48bdd89408ece64654810d079808e03747ca48badd9e1f3335959908e9f06fc10a143d57c59245db2a31c3af4f9d268fe1d428797011a870e5519d08dcc65438757089a1a3439d225db092267cf8ab4009d179dade3235db21a1a3e7bbeff4c560d9a2a0af849c00f0274a8da5e245d6a05c2dd68b2ea9c912eb5ce1ce9525d748b1b1dc08d66cc5c960e2f8b0eb301b40c1dfaa6483ed2a5d64818f369d02c922eb4003a04d019804e0c1f183a540960e5850e7dbe68a40b05a22eba2361cc0f80fe411ba9689066fba0431500740f3a45d708499769348d84fe8b5bffc8ad7f80b611b5022da24354080b5b7e38dd9092e2130b8ac562417b6e173972bbc8d181a207f61282d6fafb7cbfb5d65a8bf2c5cd02e5939b056dd119dac4967f4385d01aca827f2d5d3bd6655dd6b5c3c317778ba1dd6288680c5b7e0c92111958b088f1f0f94641b235484848b666cf7d0293fb64c2661384807ce61350502691a0a3a023932fee95dcab2964dacc1bccd7d4993833072727dac4f796bd805eaf17d08e9b04890429090e7366cac841a53adaae9dccb5b3e79700c95d0214940523a298164848f4cf96be5348590d121252dc279dd3e73b1e858ff33811972295f29ca0a31a54836ad0d18e1b85f219a7f116e0b88dbbfc05a79336f9deea0be8f57a0111754445659009a9dca8548cb7a541f0989919010000122315000030100e064442c15030d4754db60314800c8ea85060569b88c32445811032c6208300800c00000800000803008074cb0d3325c150dcc38715e51bcccc8cfeba0e33e630b73606434b1a7df34bbc7b01fe4951c1500b481dc2dc5405b01d9e27979f1f7f1859422251c624b2c58584a884ec3e53aa328bb2512d1245b1cc28d333a6c1a164f4232ae2503228bfa74c30d0c2b21e47243efec3afe54dbe3203115a34670220e08ff1fbffca4f76dfe137e81a9498d41430cfa5841a42c95f0003a35285128fbbcc9132a03181782a72ce4cacb5f366e548a5617849d2abedf460c2f5baf3f77b27d5cc3098ee4dc1d352839f2e62356ef3e0a18c97e58f7374b10929530da985b0881a146acb979fe09dbd75f9238f91cc0170cad87641fa7ec32e17806e31bda5e2d77b89deae6f0c8c3fff5558ddc936d840d8c9fcbeeb6c51ff4b6811e72f177d0b8eb92a92cf7fd3b75f03a634ef0a34babf93c869d4668798c02e7f936f630bdef5b185ddbe4e152832dcec74e05d2a61f167b9be8af561a27e80435d9f17019f823ddc9885046a78e446cfbc7bee9769048807ec28b05cabe0a86cd59acb7b332b1cc0db02d953a9714800a897fe88253e3a6820e0d1378da47a1c65e69c2a8443440e86206475b9a5cdc690584341ccd93d8df75975fbe60fac5f9a709b974d5ab9664e65f7f45046e003873feea0ca543e6c63930eff631c284fa862c08a44f9dc2a423491ccc8ff9e53bb58f16762cc5311e84c4240a74070e08abcb983846515ab97d3000d1af465d2b7bcd05d075aebfde643582f49b8ab4a38615ab83a64452a443c920f849860c7b00e3d3d93cc1203bb25716e46760a9e348b4784ef6bf2ad10cd4df87a5b8d896924230e249c7f8186141be8c1627de71bdef3ee6caca575acdbbafb74e1b945d95fc7107ae6d4cc71ff031ff8a80f3ef4811f7de8c71ff2b10f7de8831ff8e8473ff2411f7ddc473f980f797ee8168dcaa35e385b534ad99b38973d4298f8a809219e9cdd9aa7b4190dc520086e449ca79bb544a33340b99b1e14b1d824b4ff992e283276ae46e167989202ed092b60230c5825e72407c3e1e928e0ee760b20f19caac07384b3d6ccd5693d059208b3d742780833d982902741a035183549fa36a8fc015f633e3831d34aa57cb12f1736cabb95b6e1d265606daa304ca8e131dd10f1365c00e8cc61b77da5be3cb463d349a77b12e6c588efd65a30da5adc68a5dc71791cff4f6ac1b9b6785ea00218c38330cbd04178c635d39b6f848b67ab544bcee7b2357044dc5d83c57b8a786a29ba52e561d18dc12e52cd26fc933fc1f18a08ef58c21e26b78644c19cdf6afc43e36f1005137f55bfbf2c443f90302541f4a1c8c5d30ea2a6fed934f75f89f19bfaf10ca23af5b778a12560c53188633c34284a7c0b70c0a41a4447c2ef85e11844caf13776feaf36f32ffbfacaacc62f4055ec164458f5bfd4fc6f08e64f324c2f888edca1a6dc00c4e9d420f2a8bf2fd07e964eff5763ec41e4457f5302c64859ff0ab31c09881805230a33ac4406d1a1fe1d0d14824874965aa8b0b99b6c70484e5104419a13868d10fc3d34483f051109ffff84fa3b75e2afdefa174475f4ec50a00922a56687dbc06ef6c4aeef17447bcc9dd21a44a4797be53e3460c329ce4629c075be3c0b4901d11c83fc206a366833dae4f1865241cdad15cc964c6fec6250100555007083a8c5300005ff156b2b2c82089b7f25719000e4b74fb7c9f2af48f9f4320ea28696c631e0e5ba49a0a9c3e2e9628dc428612eca6a561edc11460e7b2d846179a99d1394d7b7c32e2095ef21ede5f80c1b3d856d52d043cb09687037d1bd6236d41a74a78d0b8dd8e9a4cd9529fc79b29673c2e99fb49f72766d8b50a8687bab89574227502a26ee2315599095568bc55e2ad3cb5c8d6004bc9c5602d6486c94796ab918649b75c90779ba0f8a45e976aa4248e369a6a014b5c99ae8f604aee1303c70436c8d00b7902db8184ad4c1b89b29ccd068f53029f4b40ea5d773c688c4c62e23d1554a148ddbdff21498e248af387b2a0ceac4123cbd99a7e94f2b30473890401b9b461e6d3323315980ae303462681566c2d02f96a9b8d1dd9972ad9f6f3ef361be4b6a7b704cacbbfc40996df982c9df92c660ba3d91b4f6f4ff7fec49c0c64fbb3dc94261d42d99d2a19f8b122303a63f2e450282bb61025aeb65ac168f74f8a67149f52d821630fa3bd70851b12931e3444e09a8b363df548ecebeda7d0bc1f4d68e47ce053b9e4571ecf06ce6b82d9d6466423375f58979104a6c9506d99c59c12abd1d16f906e91220e2c3ff1af1a50d8d3c3656798a19598c2e063c8f504e58c280edf135aa5c931195c0c7114b91846080ef742ac7fb05986319df8a198845bffb0d87718a744ee208653f4980ecfa6fc83f444200960352fe5fe711878606282a8b63b533b5005dfc975c00705a9900abd44ff17b5d71d831801b6b1cf921220290a7ff2d060c8002905e33aedf4f76c651c4ff6de871b4c3c8fa2f70ec816230aab8ff87eb0c12b84f5e52e3e192ee7f6206127b43f6b7717c0e2c8a63020199ff420732e2a2de2f8cffc92b58e0bbb69fd4244826cc8c7fa459c8d7e6423f07fe5593011969feb3ac9c49090aff4b3008909b855fe0fcc77d1081e8f97d6d620a1a71efbfb75c1f30a7bcc71ff896f6056ea420e519f8cc5e29a227f6e7de18c46fddf80195cd8eabd04905f499b96eafe8f635faee2d25b7940a8a8f3cd016d8523a40e2fc95c2e5bd013ae6971f8cbc0da1abf2edfdcdbc4dc813e09698b46d072cae7ca4c4716b0760ccf1907c876f5ffd4ec384ed7829642e817a8421739a2eb3e5eb594a698433bd26e28f08a0cc76a574f66c1baa8c64fed442b745a3b2ff6cc0d0b536b0dd3680ee2138ef521e1b259149a6c5cd8c5469d72ad209284d93c2d266f5b46bbaa0321d0b09171b9c60737b0e52e6fc94d320234b2410689fe5b68ece9c561a3a8ec83737a8fca8fab712ea10394558916f162662cac8d67a091af2c241391d98a317f76d196bf0a68569d83299551741a37c7059aa01e479c63e8de51f5af25ec80dc8cacb05a7e885923cd38b6479e5e80c8c52272d58a564e131c1fe101b4cc158ba0ac5722ea4e9eb15ddd08b9079bd0f9284c6cd3665a8f0a4c13f64f0bc1e99de79a121b54d454fff51e0500f6dd53949824b4b5160a81ea5f928058db1bfb5047d5238458303260300a011fb5e28e903d580166c26fb74b75ee7aca906c6effa286b9310a7eb94dbfa8879a10db090be64afcf7dcc018ed7fc0cbbbf0904626bf5262caee17ab5ed46179188c7fbaae103b1db6f99abc50de7379e8ad116470014b643f9a6ff6144e914bc1b4bf100d6ebc83c46e11476802552e1c8ab738e686a2a917564457f57e7a8506c622e2b1304192d085778635cda960500b15adbb286962c403e0ae5073ed5879640eddba9e7bde909bbf746fcced3d6bd9ccecd7dbad84bcbf3a240e91a9baeb70151f4aba1aab49f128493af086a10c4f60f21c24dc30b9ae044bb63a10400a86466d1e9f5b7755893cad058a8110324cb2a2b836dc9f51ee9f09582cee54906e00958680f04a60b7189fce933fd48839f6b6d8a216c5e1275722f878340976cc8f0a44c273f98864ad58bc7deb9397bbaf1dc9f82c5d3416c0fccec818c729ac808088debd1fc03ed8f5dc2c0b55c1d0ddb4bff8fb9cf9707970cba9274993a7c494dd19b7697adcde4eb91049b75f0f58e40c25a0751ab1742136caa4ed417520294fe730bac6080627a584765f123c472f17b2d9a9f8ccc04640290f1dd86d4b9fb475ede2c4be27ed6e2223b99c2f44dcabcacc835cf2476fcbfe4de8481e85a3b241fb25326121d1ce88588103a78d5ccf3143aa83c9706c1555d37cf1dc70f2e0c5318224ee26ba60fd9618e988bd1851318d244ff9ef3ba027db49c27ddac1c3418f840a2596912e743e028304168e213d3ccc0f72fca1e6226489c8956f200eef1cc3912aba05acbe073a271ea14f499f48ac15b31ff5c5570ba25b676d2de9b50a2280284a10369b2da4d07d207bcb6972e77a9f1ce76f2e44d6f678c685e59d129a60cd7d41328153804b927368168bebc0ab95b75a772247a3f6d1c81674afae42dc062c33d34aea7a4318fb6ced599729db4b77f181fa8873493615622b42e93553538254ffdab1d92d5e45be9432e715cc0d188033b6668a054b1ea54e8c606c7795e9585d65c4ded3fe66906d916c60f0e80dc0ed1b8963143b0bc60fea3576260861fdc15849a3e4da9e64a9658b3c75d980746a6bfe747c1ea3c442343848925f268c0263ad8c71092b200839c413c4c2742010b26894956600a247968a8ea841d1703193b30b008409ecd222af80b62f86210a7cab52f7e57da29c8a68233db1932df20aa1aa3a4bc378deb4be81a19c96c4853782ea19d6d7334d70df91f0f2050604fbe5889bcc04ce3fa50874502e11d360cd4817bdb47f34f0213dc8071813ff193ed014de879a99a01be64ef33d6f14b4ff62e6eadc0c4b0992864a8eadd73b96840ea8a3438d8cb653955863f5d2e16e68a38164c8ad2825ed2a285ec3d65064f106c04d552211298bb12d411e88c404f8932a77080f4a4aa25c029c14f12314de900ea485b279033028e25649aea81ea905441b0a3041d4d6632a503019d26619de209c19d12311d7b29ae347509c24068e4b071b8eb93e48ac98aa9b8a3d23af8047a6a4f136cafc00c0cfc8acf52d03bfcc3b752d10b3da48b0ea58a5ed0878ea5426fd2474729450f744267a9a19774a3a714d113bad0b554e845bae82885e83537136b49e82d191d25a1c7dc2696a5d0b134fa94869eb999184b4067e9e829197aa1f4142b8955ae0da14030d77582e6dc7bc52de1e476c758935de64aaaf44d56bd75e9602c435d9220cc6c613ad75bafb9eb385d6e821e28f3ba40d50de0955e720ee3bb581d4ad88b8454d79830dd17dbdedde338ee6d1a61b2eba048d4dea4ceccdcbd73a4e1d627db92633203e3d2dd29a11cdb5ebae1f15cdb35626ae7489929bda15e0387eec16c209b7f90e327cc3446ba0b1d36e7b5acf7e45efd8a1b578721c53189c9f114ee74584c03a5b339767bb9aeee5a4059e527c2685cbabb0a9621140e41e495ac38b18fcbce24a48884eb558e6d6d111ead3e2a2dd74200e129a2266b8da249066ba0ed8d75d02ad69d8d7a1823e3525d29819c568ad2407b3a8ebb157a429b1931deb48e89b289a2103b2af95eb8a939ee6c1961aac3a1ac16b998a2d9042059f61174d34d56a1610a85f158714d2b81400990d3d1eb1b6d16e0040e85e997ed60399f529c62f390f098ced25a9888bb58a3e1e99d7918662bf65afda51e1a3eda8be5e909ed0f17247239d3bec790627c001775b22aa83f0c3911c6c553cb50cb400bceda085ade02c8d5ac05f4115f898cf73a9b7fc1f1494e07f2bf3540c73f92dab2ec7622464fd2c5930fbf88a93986a7c591bd7aac8fcbc60da4cc82a1109b4cdc8a8af81df76112ec3744f931fe0c6e8de63cd2c591baf0677f405fc88ba0cd05ee86ba29d50d5d38d24ab4a27045aadeff4206f80e17b30674e81d4f03f9d6117f9626a1bd222ef6d99bc08cd12d61a4926a7bbe5ddf3b8245c2bd13871a05bbc20e05a263ea851a2d3d706855d6a32269d51f25fdcd7b7d4305e24f1816718049bf29771bd2e4ff1f2d00060463740322a31f7cd0ea1f17b6848d42dfc2fa60efa0c03021e66cefe882ca09131162d7724d0ad10d1ac7627811f082c6bada8f7663b594bd73d5f100b05bc5aa965da4fc536db342c4486d70a682c0fbc56aaae90368075b916a76c916618763d5da3c0bae5818483fca4c44d8162286a8e6c3f98f1873e8deaf57e55ea4f00acac30f2ed0fdc0a0cd02cc0bd82047685759edfe090cb25670f93085524027523d48869eacc6a47c6f0e8e04ffe079295a82dbc652e4178d4de3000ffcc14928d9958636502b66a7319ec282ae5ecda6ad8e930266412ded58c0219947bc366b4e1ac0a067031cfd62f62213031833dc73ea19505b83d5aef5a4fbe3740752914f166e76605312a110ffcf29820b3e06590311fc4bd935220cce9e2511d4bd67312f77dd6f3b79d050f2049c017ebb9f5cfee51b5d6c0177ba123836f9e5d2a6aced9861a0c69fd4439340ce4d764f1d0cc8e4b0e2f86493679dad390caf851bc24ca1034ed4dfe8fc42acde308c80702de9a9b5016c7daa67cf4c7407e0d4eb78be0d697f6d997339a0d7daa36edac664289f754483a0bc4741d5669bd99671aec3ab4c5c6476907508e8c0ce7f2807a8fc0a1b905fd7e913d38f6cbb7da28d39efd6fdbc1a4ff4b2b321b4010dda44d304345084a5299596d7bdb3590f9e2752b06cdb4a482982aa07ae2e040f0a9c7b4f1715aee14c9a2a74387610dbbaf2a894e8959df35505c775547d28fb4795ce51c7cb67f38bcae615e809a166163556c18131f382229038a1b850206a60c288039a31061da8e2dcffa7aa7f91ed943c0a1f54733a2e65dcf20dd77eb3a2556ca27a50f8ba1785db8bb05b8ffb312a1283cea441f09eed564919ef11bfc44aac349123459e6c6b44c4b2d0b6297eb2c577d08ef05f3eb47d9a918226cff37798fe0e9da1e39376590e4e59aa1a0222f53cbe36eca875b4d46b0552ab7ef32715bd32eb62c2d77cdc40fed4a9866fdc7fcb2d21794abac8d743b4817caca5a45ff1ab8fe1115565eddee162b5a417cd4e63ce4cad69d3054a4701aa7bdf34897324dfc3783ab85631c52bb1c626b0060a95620a3527f224961b198f347b5694f32d11553d5fea1a5f3bb3d98a92fe69d6d6ba43753357ddd47359ca4f21a686ded5e35dec8a04a033691dfc4d5be4f74afb14de308c475796d6357b9207e189a4f7de1b92ca6bb079138a261dc0877511824c8f9ba0974229481ed4b537eda692fd1ada243452c726bf5c71d1db72ad0f52b99874316f1a85254ba65b8f538d22fda9c151a85637252bb1de447eef3547aab738dcdc25c7996280811b05c574c3206bb04512d545c4014fc0f42fe8133ad7b6d7c175980b0056d8836469d7321eb1a7fc02519fdd3766d1322b5abd892fb4cd9bab2ba84bbaa32ffc6c41b19e17e6bac4f7cc1a398243f8bdc9d3ef576e554eec71bde694ec035e953e84c7802a15354a48a9306e3d288d29c089373d36bd517892e38aacfb095053b67410154e3b65bf95e6304f2fe4af6ba39d3a68c88a96b94c92d4bc313eb64f3cccb330a46393f09b13320a3bd2b56049b7c38f6fceb817d79a17263f4574bee89ad2cc8841039f296891f0818d8c19ca0c54f00ed4972efaabbf36662826b2d17cd0f723069db9f6d9d8a49b3978348f3fdaa743e367a3069e634a3f4c6521990173419754b6366c5347f264d0c8222fe58a02a16170cfd442878e942f94160c03124d7fef93c1e040bd369865c553b8ff9d50743813d9990453c4c59c530ca391c13fb808b575ad0834af2c4a71f97969e561bdae1fe8f543c9b7deaf5fb41f5f3403cb1962720081e50b4dbc6837cd9d13045999d77dfd4a7fe4e5a75034e6b3884079dd70c1e498bbfde807adc1c7bcaeea2373277f07af5af0f692ee04014ca95d960709d4737541db28a004ee3024bf8e063cd58f2f6ed570150f12aeb9e20488569c3626789b2528f2e6e85f6ad24468a57b5887cc8f47b0f16977419d52971d71fb4fd9ac025c6e49f3d22c490a10debb8baf10677c17b6e3b7010abe44e99847a21f6b8a418b1832f6335805c1640ace807a68099189bfde323f14fa7e433c5e99b8702ce203830add3c962643b56bc1bc96c22dd537b94699844d86b7ebca271ed834297584b54ba7a5f49616fd81c1a604d8351182ef6e9288b40f776341ba844edcaf323bfa61cac9e38b655a952bf24cff87a1d462d947cce41983773f4eee440f7e6a0c32bbb400b4d70f8096cd8e76d60eadb2bc12f4c097056487b1302605b1f7dc12b17c84a7478960a9fba5a1eb99f9c0f9a31b5eaa968597e7dcb1fc0e76920094a9d78b710a4bd6fc56f19ff9a73c111cd96c20f6d904171e6bdafed797fc2c2f3c2e4c83b799b0780865b07724631543304be35a441bcc07b02eae120f37612882acec836997e7c44a0e7182169cda127c247ec8f120ef0ecc896b6fe9a06b7ab4b79685e883eef546a6aaca52cb9e89f0e39187c36fc0e10dd98486a93ed47736214e9ec919dbda8ced60467449735550a418cd25910ac97a52f989f9c9ca2b6ca4eeec2d4549fb751657d6af8d588800624903b2b57591e20698ea1772db5ba8ffb9a1446ce74f41a16044d4c06bb7f50a55acf35361ba205b74b0d766e983f1b11cf269a40c28c8a41f9095f01c5cd05c0957ee6ef8546cdcb494bb5d8aa8ba28362c773dad59a2e4252e5413a0642d565c0508210c60168da2c4846c66bdb4af87f0806e81c898732315b52f71182cb0d70f0216ca55b8e4909ca33c7730b24b8b98b3cba7f7f261a7f68949f0051c30518e229156692349bdd4727076cd8eddb307e860887bca6181cebdb752e4ca320010ec8ee7d62306241625a41cad558813932d0356aa1b8e0f2b9707552c7847b4da85f9828d0e980c0583698f9a20124da53eb9476d6c0c72b8ddc6a39da17ddaf04d69d72646141269b063dad1b4961fe85d31a1001c0ff126f7d9507a63c57ce93bb115a422a713b6ecb11d4510df559e59f2243d4857b6eefb241632a1f7656536c174986c2b5c182f97500a1291c7cea2c335cc67b32d51a7cb636a4e4d4f071b04077e8384d46e5fc4d7ddb174a47250f717ab0072ce88558697a3b4686a0f0ac7b7a45e6b4b1450eac6fb9cb3ca4647df17e687899628481ce3cff3cd23692622fe3b3b2dd0cd690755178116c8bf81c56005e2419dfcbec9d9cf17883b827120359f74f1c4fcd36f7461f675a23ace4f5485c0ce6d365253d4160f0eac1be0ed7447f2c6a3e6236a3eca29081141f2ce0ac0b5c8fea587b240f81e0f8050d23d86f0e89f4cdd4696521e3f60ba90af5c0185db1327268f0315fe3856cb327e2e1e29d4c57aaad5111a04846db80917815931df7b76c723e7467f49198eb903ece9c7b8ef5e8ae7703e203516240a1f0a0f7eba2b4e3e2e4c815b0dc4c5c8d83baccad4f9907c44aca2a3c6eeccfad6b20326a88a5d8668ea4bac88c9c1fe2ea9646b1dea009b4ec19e1f17b6d884346f24f865b1105dd9dd16a1bb4ad55be6092280554e99862dd6ded5a09fbf28f24b102ba11b0645e436f4ece842cf088ad5bf962557af41be678b826414b58b1dd7f352abdba4258c9b0220a486cc7b79fb5d2d115577a008fbcb36fa7f881a357693fd23b66a9e1365fe98ed11eb4ae9df59e83c33dc8770392c0873a4aed3f174fce8c80348ad5cc69498f4c0d7843a77ccc6e2e860294dcf7b46e6160a67491a40c85126f5bca0fd9c04a08b523691b951555bcc9e2d7a102c33bcde43ac7eb4c9c75b9d59bff4931549836031c47f43ea0e64bf36c97ad49eecc4c278b005956e96d03caa643e9a3fa86e06f2c260d7d2e8ed0db7a56758d39f3933b8c5dfe5c1f9532d85607d53b1ef9bf11aa11556388de8b3b9cfcd85923d4bc5cc9435b806715f7b976cee4e6e20ac47b4c0da66bb6205b7ed9c4ced9ea63006e9d8d713f8f3fb734867713a3ed97e2f51325e0830c1503bf8f5d8b952cf0cdf491fb4956bca6a781a7f265768957daa0452464f7f136bc45e05c39f670e338cd26b0b424338c66a21e7bdaed5a7d88d54792693dbe29d59c95851aecb65306fa2ad998afc4d1d61053c72fa4264122c542600339fa143738bc89f280833177a36e7f7037e1db452aacf793dfb33ae56845afc49e82924e532d36aec82802405957254864d2177f6d3011c6b1e928408d763359fcf9476cf04304cb4969a71f1eb71d9bdb782b7f673838115949412b9f0820f053b75fd93ecf021253d6f329133ea88131a1f00bd01336a74556163d1e4b017ee9235e84abe76720b94589f08841e9207dd17fd48c5cefb3c81febb41ec9052cc032636eb73e3459a1f0db739c6d7691fd10dab91ec641933c1cad842bb712beaf570dedbcb4d01e6de7e722349377db237be7c490a6ce1c0055e8091ce021a7b15e4db7286037c3c37fd05c6bc9d645fe5be2691ed30f10572c14b279adf5626b3036b0cc3a16761020782a48fc10eb9a0e12677feb6311761d653d09fab7c30f0a07897de0e87fbbbd1f92a44c3602abeee607e9ebebe83611cf6b9cb5c3cacbb11059ec2e2d23faff52394f912eccf4c6f0105e622147e12d2b7cd88af567103e74a8f42c3bf82d01c6011f51583c502b473ae5daedf7db94b24e97ae2293e91b8efa9297465cc277e60c2cf895755b45c9f8b561432a5c38b58da5b01c4820ef2c4544822c7b3a924ae534d3ebeb211697d247242d8e5d58ab590c2a731703f22be7a5bcd8d5072a0d0b1e646ee40b8327d94c20ec970684d9d40eb11fcc681879d572a16853978bfcdb2900a0da7e48ca8741cfdeaa3362a0fe2e03c33133aa321ed5016a89e470f0ff79f06382821a0bb518c3c3d1398d46a6dfb2b1de705951ecc5dd7806d2c15a37c65b84c341a028a37dade8d3cea57519bf9317e470ba158e1057a52c804d74a42a2a8a539263424ee57e294f015d7fc26414101343e718b4b8ba0fc894f509667cbc26cca4e2b59163b91c2136206536174a45dad04b3b18fd3fd5c5c88a3bd45472f69753aab3e1ee99c51d03221efa1a2ac08d1b953c5fc414bbd520b66d14f50fbaef62dbab55de6ab59edd26bd9644d50eb7bf5607da05079eecb45168a2d1b076241c02fd7bbc8621f000417929c78663e240ce38e882dd9289a06c6b6c49458c99b606bb5b36b5e89c76f56bdd7f0ff88eea6a547c64ae3d4f721d5aaa971e7cf35bc984c0fe09bc1facb5316d5b3dc24295edeeae4ade4d3649ee667a84f162d9bcbac31b41b62bf13ec20e49ccc07fa8e58a7dcabb3c94e68fa097e02822148c314c5fc7a29de0450941092222433d7735a8601462a2b95123e469e0ae17b670278d431666322898d261da7f76a2212b2f408f82394180ffdeb12677fca724f48b2a7424b21263e3a3c3053c9d3aa07a74edf4ba105d6d4c90d7736bd5025f52063d92c712fb09bf56060e5fd759c85531591d04e982347cd469008c0ad44c152f77f8b917e8c3fe59b38c78c85cdeeaa450c7307c1080f680a84620a07941e82355a1a0a19608bdd5afe54ae141f8f48320d610bc120f6fb33273dce4a2aa9aa9a8cd720c77c9385023c615336cb7099221bad395ce19c121754d31235249effa03e06abf3c8398a1cec01cc81ef745530012f2f0a85f84c95029da16fcccded903c96c0877e8111cdbf84223ed341372ccdc300d74c473c6537c1bb1511a87a66115b85a61aefc51928c7e8cfe22c5a6121ca06872b1ab445d89662c00f11e52a9a561f2a6e9048770d143cf9f7f78b068c03fdc8699946045dbe1608420db3a132e92e9901b0d7d7bf06c73a3a96e9e1c6ab48bad7a31994c53b3930337c2a683642a12ea8849d372d0dd82b5e0b357e3e28ec4bd265da3ae3b26bd5e7336ef9c7a0db07db704c884de02ffdb01bdeef9e22cee9dcac6208707f0cf42486bf91d007305e9c6376f0329034182a186908f35abbfbabe65edf036c658e64074fa0f3406fcba733cc9d45c649a742a5a6189dfc609880b218959a469b786a5743e048ea854316204c0d8dbe0c4f137ca088d47d1f3185204c989521ffb255b701f3bfeb5254560b9b5fd73be9947e6b3e15146407e358e460ef6056c2be830750a3127fdd58dbc0f37d1adaeaf405002ecb0bfc510083dbfb953bdf235a3b9ef83c754b4ff07a4b4416289e9f919b08030d7d93ee829c6c0f7a473ca8d68cfb1af5027979f0af9daed53531f3c9c202280abc6c36d9418758993921b45faef7127cbf86da4ff1bd60f37dc777fddebf95f6353177e3cf8fbd411b71df28a3bd1df21b68caa1617d114021ddcde0f0ce366f6986b1bc6f15f217eccf17631c5361214f4446750a0f43efcbe873eeba46d6ca64943ba03bbc299e0ed019d332a811a3a5ced1d8f181e58f879e22a198d7456f2c7b69a0513fbe9a84cc59f24ae9b1d2cf527d24b976ef54425fc405533cb505f58d880e587177d9e491d939c94291aa4c7060177dc97311d5d3bfb5f7c940d82ef2a6538dfde64de844f109e4fa9929cc9d868f05a3b97de091827c7cf38d425a8848564c8d3a44d0cf148abd8ce36c1cb2d00c51807714d342ebfbe4794260147f30bb0abaa1ae43cbacbe224d91ac552f1bdb01c326d12609200a0757c76d8dbf9427ba3abf053ed93a759552f9835d87c32b649104c3eb04d532246798924e15406e7884a96a33c25326efed3d416257b3d712af997c48493407d304c61fdc4b7893eb3cca04d572b99c8c991b5c38a56bb34aa903f0b195f7b19a96570e503d728d154accc328c9fa0ad6306bc8f9d1af871c8efd9f5b72f859cc90701a3ea237576117acb346785163549e02d13708ca83027aa66ad458f5d315525b93b905b077984720760be134d2a66eee272af5a1646ee3c83c8fbca09958b330608fc6d2692e0b80778b3c8b8fc367c0c3b459a495450580981841b6ad523f1763fc80e4a38dd37ca833113c3c3451a9af4db61dd982f767d007b3c93a17f06f98415b43cf50d8a0c9187e553fe9a011cb1dde8a3458de7976655f96da247e307a2d1f56e611443dde89bcb20068afa5fd4ec323efd1f5314b6eafb276bbe9713940ad1f45c51b49b653c4ec3e07c4c8e3c24788a377f27c2bd280251905177143c0f64c00abb5ffa5da707d217891eb388818e29b3bce6a8f0f6d2516375a1d333e3c9e07f5131c4608088f294bc86b560272fd9d50c328be6cef51d35f04b9ea238e60b27f6ce9b5b4b9c6b0dc1edcc457b017c62ef0bc1059d81050f9a08cdd87a4e9b8b06045cebc203029443a6364581921b035fcedad99b4ed8d82f80f624e73f8657cbe3d8cff6a975a6c81440798126b436533e97b4213c9669ada9f15ba63494db58cf8589e83cb014e64d303e710380de7bec972cc4e05ec586f91af39dce6dff0e5bb7087f9ca6044a7d8150480190ae1502eb653b17d383f0cf3204b16c7a03c88d3a4b0c085636ce8b5d77b2c740e8924a67a89ae3b66fbfad12d369e6a6f417f32ca8ac56c83004c14e141a01e4935ae7f89cdac48938b6d9c6db42039b25b07f34b7b8ebd355b5785a321dc20f2c921eb747c415011ab91a5d54b075fe198bdd703c09795547a1543094a7c4c67ca00a29e6e2e752e7337e77ff2e66b722ae222f292818a8c5a2d5ce858e7ed53f5f55d76a05ef3ebf3e24bc1435d3a01b16130801ffd11db03d61b5882d9eae4da752e49972cf8505cba26d01f515833f04173d5b1d4215ba78e58db0d9547ea73658c8c8bdacd4631f9e23dccafc4611e662a3e1c8400d2f4106325253ff54e244dcc004f6ac53e91f50a272a9141b9c92a016c463834f9fc6194c44468c7d5ef661e51070c26b827f351120f9b948934e6368ba78b88ef851968463cb402c72754cf197a138c308c6012503564cf11e292267996d64dbc0253985db2c591c14d27bd69940c89ea54d902c2523c9e05c6303b186371ba674a06051d8aae78ebe1ac6572d6cb57d488824e582557d85844ffcde60689723b204979cb2ea824bf5b7a9908584be24afb57f796123d0016ed949624f9a0cb17b005a85997a1947003cc42ad06950a012165a7d9b800e21cfd2e948f26b81e592d0dad1838fd36b6fadd69543b3375f6bc9e2759691f282eb49ebebf16221767b08a999437845f69a9e96f6575a9fa82c055b2b3422a88c818f1c5aaa1c54575bb060e8646c85173261c2016432fd59cdaeaafbbe801a362acb3bc3c3dc325f23195ca14f6a7e74f0d310be59bf6b427758322e9fff2fa211451182d2ae3bd41936510b15e7a4fcd6d9131e80aaac703a36904e8729e34a380de374c785856c88ed78077611dff1afb5bc67bffc89692df4f2fc0717702901635bc552e96d94b113100be30c55e8b5cb0096d651182263697558ef599e68b68e221f299d39b2acc44a9b86d4276f31d2c09c7394e03c0441ee318eada464c3a2db68d6feca225ba90f06c63d4e3046ed761a7acfd2e72850b185604d388a0e8b6d7168a1b5d03d344f5f51f64ad3272919246e6a69233d4dbb0bfee09d9e0a28a2add6cad3fbadcd4b3a8b0e2e917e85e9fe3524203cae91787ee11e5f980819bd5fc706e2a68b66476383a6213da7b2401c2cc2f446ba1501eb71154230a745dcb3c50d3214699214b411ad9bc54d15991ff2fb4c48cd56c03f75f116c008df517c4163adfbaab360899133379b9091c341a6668fac978b15bc20284dac8991bbf0a010bc1ac6b5a7e59888806874d22e3c714f1d0e6d897b04047a3053dd7cbaa9888b963a3dd42ff164c07c2603a6c14861fb2f1a0cc20c34746d2ca00cb9a717979a81988c1cb4270943522e7afa1d2a722f0e988ea96d8ac9cc8ac72876449db5dfe0491270ec7e4b381ae195304898ab73f03efd56a578200bd540a759efc865569fd18aa4dd386cf62ff341de7d524189692bbd91ce4c64c1217cf53d542e34cdb996c35166077725791afb635f3da4046a2ccaa8f1358dd1ccd8e1d44a78db8afe8e36da048ff9bccdab5c2cfcdadfcbba5c81e3fd570bc15d06ea6609020188b6b61904eb2685eba7b21f520c70e3ff505365785beca76512f7d526022db53f47567f74e3cbd707a760dfe5d705b046e122f3e2280412bb89d93fd0b4ae4b6530dd77f695b0ddaf3b89f31c14608fa0981ef6cc6eef8c21f4a027c9b25ca56f1127ae3e925e2940a70fab6d8c84758f465ab1d4f1ebaa9ac2582df983e272f5b9eb66b5000c2dcc4ab23dd8ac0ab91280c2a6d7279cb50312170a390c04dcef9bb9c31d70249400c81d9357f4681ce4af9d5b3d15a3d24dde2c978d9eaa460e130ed2a3699375e1237639f6115252def47702b9c2554f39229c92854569d64a892de5c20dc9f26999bdac63fd32da43627847d557e5773adf529f3ffef4ba62446bb8bf619bf44b49b4c8923b131c213d57cad471ab5c47e2c229b415d713f381fe79146a86ae2885b4d340cabedbe285f00ba40b81109a300129aa481322eea721633602516aa5846c4e738371590ec3103e0ad7373da66b250ec07dd172d4506628c608e985506acc04d77c227ab524a2aaa4ff91154512609987c6d1c9081c4f798ca4b0aa8fe230bd6fae6ff2c02dd99f98ce742cafa2b7a229370f16811a6beec818bdef05bb9417279f3946d513f00123d8689e514cd58451192e4ed4e516ac2dd0306fe530fab5590474f02b7b1eddd65dbd1584070a4615fbcbea3723c644a188e1c462787e24d75fb0061e42f5f70224cf9aade8bff23b32fc6c31a6fbbf0522aca76e6f08f5d6cdd8d252ef7cd7efb962bbb0c8272216560f72e604e6da891c44c7a38dbca7e7af0a41a990a4c843799a0a9b3b18867b8e1ef6e42d419f3b05dd618e1366489c35cb7983d87bcdf8b39ebef4d52f18d1f62dff1e038d58b61c16fbfae987d6f168b782c23fee170f3f04e4bea2256d2801058ac92a11410891f4d0d68196292313a943848398728885a2af11debc25854a08b4b9a2d054b5375ef4f3d9ad89724309714a25456f33404610ba0f866674f530c8e9ea8efa09196f63661f3d6ca921b7bcdb9c698c4760a330f82f5629d321b3fea7b71999b2c5e20b32e206cd4fe60ad30aa1af3d0dcbcb9911a9b24d9021fd48efd5e88e52dee0d84f5d3c5301281c41d9020a3372ad1ccb0b2c384808bb7005fb38ec8f30a59c175cb38231dd6eeb63947b085c10844e3362a5c36cfee88855e6034c0d9b9cbb65ce9d27535be0c63fddac60ff6a4059676e8c85fd0913bc7ba0c0dcafa059021865ca1118309988d3ab334f869315a527fb69c5d56bd7e65a242a81b9ecac15efac82f1ef1d362add7ec8571226a436f3b2eb37eeb22a496f0cf2102057e94617e469d89c6d4778b0d9286e088259f10c1e2a4517081d972750b05fbd77b3f48aef1113cd965ade505f60695909c307840bd9342f675cca47a50640187fbe0e728a143295d67b1df4bb7a19cb64c322a7b87e1754510c8d6cdee59072ff91cb27dbe9e0cc689c59113ff1a416c62b821638b0d991e8b9c4d85dd718472c1da582b5d3ff747066cec801a43d2b6685e5c15e500963580e56b858fd90d23609107af01bf666cc3927d669ca29115fc87cef33f8d7bf091da1f5f840212ff85486975cc96234e8c9fff64b1903a0af7c81e912a262dfef7be7ccf8082d2f4b198c3f667489e0cc4e642cbf58db12e605fbd253aec009ced4ceb08f512d97df0548eea40824bca10050a89727c5b00dbbd7dfddb97cdb031f5a051b363efd32dcacac1451d7b47ca430450dc2c1566386d31d19df1ca72f289fa4f49ce7c50efd08a6bd668107c83eded561d01d06a0821804972d879595db43bc2732e9175ab6cffbbfe88e7fdbf0e3f38650058cc3b1cd340c6f209177253ad8cae11ce5e0c9af3685af37ae9be6faa596bf9e3ca0bb393562b556a7df248c404a6a98a2e98046c684711b0e6a16bcede9964b9a46831e3ae9b6b81ed1dce2099015e9e0d59e64ce780140f604841722b733eaad2e25a46825195320fccc8b2595faa08137c509deed96e7d31ab3487f79db028051c365740b22a75d2bb79e67275284bb838d49de1d7496a5217e0768786b57eb6670ccd86b2b15c5177dc8a458fbe354133784dd5ab49d80ba9444ab7a16e3b4986ea725908b0774a9d56acc5131f5a6cc33ba61406746684b6e7cbf03182c740d2f908f2eff5a1f684a83d1b1f08b96f49f7d101fb0bc8f60015b52f71baa1513f153df099c464f32ba4097911b6ae6ccdea54c51b649d34b1d2470a09206461873142db2a5a7dac415c82a2c6e8f1dbbeed6401594b4241a1301417fa35117ed682f0f04bae146100a2630bd9a0487a8c8ab5dbe66a304d5e590344c2044c3c1f31fde60ede8ab274f7f801a798e9ca0e8b45f25cb248681041c96b59098b8e234eef612035607c19b88ddc8feeab2adf41721925f584de33cea97bf32928bc909b6077bad00a2bbb7fdbde1851caa39da1b8c6d831ae89765490811b8d2a2812a9a0453a72fc4bdf5428613800dfa279e179dca9009062df415725148b3ac2afb6fe80b7f922083ddb89ae4c6b87a38d4ef6612a9a2aeb230726e42aa9844cfdce51eeb270237b962c6654cc8b35bb3c11ab88b550a66a041a51a4262239f85a31189d5629a045a4555ab8acce96c544f57d93f92c05ec48901bc9801a90febbe15a9b218b8f085c3065ee57c3a6d16ff7ad0b380eb0219479d1e9fec66661330a2e6aa40e8142cae8b234af3ea37815395668e424b27cdd96eec0cd54e1eecdaa2778ab280a33255846dff96eacb6987354d2d6a6af1ef625a2a7542a26c8186f2fb73baea630c75734669dfe3c3e58c0a1c0215cb91c52674c0eba2839b906a949e7b1b166273a26de851069373916677bf54aeab7fef5426bb65cd0e9abdc7ba684c2e2489568e9460281919705495d8b4f122613fe161ad8f52f160e8a2afb42335e14117a37c2a540d5903bf087d15e84e825c116913d08af57104c2e9d49e8e15240e8eb1c99c041ec894ccda902d4f78666d9461b94d2afbb5df1b76900c024a53a038645408b09009b1a02d09a6048125cf5b6d2b5cc8174bc376a1f2021d550d18d7c31b941585f3dcc46b1f19403da1e21e58c1567003d6b2c5459904d40b39afd175a29a2466ae127e06bd89c65ed3239015384b2c22bd971cb77019f4340bd1eb2fe26167d468e866d081cd9c5e0315ad936e8d07bcfe00fbbc8e5b301e41ac1551b10d2ed2813b0483d2e560f957e8a84e3b7e9c1cdd4a0e01380576be6b424f711cb83d849d162b6770f91a8cf1aca4a38123ea495782434e8087e0151e5cabc6a381a27553133492e788ffe47a227c44c0712de764e3eaec56b1d05549095473bc5169bf495eb8e619fe51a6efa9ceab578a1e5813090d8d3daecc6d84375ca1383a24fa8fe284d706c81cf47610cda9bd0c5832f4e569d14ace0f34b1e7f35fe734a23eabfad7903d5112ec191f04640c242c8eb83680aa1228525ee124fc01a24548c50ea1212fbd74c32ee420ab2f3dc887105e3d309dd9872a2f8d4705b042da267192c966fd0b39ba4ddafb4b46962168afc60c3e6aea499d4218d0e36b3e2b6365f6b006b90c6dbd851c5f5a8b05394c746e48d6cec20620d42140a736f2b0beefd597d64125d0a0b72fed1c06385198781c4bf6653540fe7df0d61e7e63948259060a0a00bca2ff1bf4e445196e54c3f88c7e077e192de9d094d0d656552641d000ff0f0f8559a6a7ce80be11d86f625260cd76fd72f767919cbcc211e985d8936734d04e9fe007615832edc2ac0ee858e3bd734e31ba3fa978b8094c49afb2017f0a4001eb6d2a4037c95a988d5a443821d883f1a0a44af65a5a3e8228da0de5af19928d05f98185c4b05a3d1917521f6a38c89ba4b04e1064d12dc80a6829104bcc75981031b7cc2022629b8042351d7a0b8a623a4bc9c70fb6e70c0ae9e5aa07e85d8aad64171bedc79a57ee5a1aacc73e6042a72dec149f554633316f46a35cb76c1053ca89d978d00ef52db7f590c4ebf9c169e34adede27f66b885b0054a7b74ec05f7556925955f764bc64b5bd4fae26ecaec14393d23a5ad5a657965a528e79af653bdecd7c299b0172880278cf27cd605bc088fbe646cc519362798b3ce72d22510963a8f6292e0da3ae83604e5a4bf5f65750140ea21e4bab25cce8270d0fff53426a529389cad5cc1669f5159f30186534cd772f319ea7f78dcb7f62081de7fae7f5832d0bb116ca5490c17fe6973935abacedfcadfc7e089b21e0efe750229f1b2022b73f78f8f351eecffa2ffeed746c3e98d8e1d4087acf4433d77dba0879727d2006ccf1993eeb365fc5e283314126a4e5ae5b1a0d46abdaa8b88585740d911a216d28587f0469a03d0f11718483c71e8c11dcea13bedfe6b893212a8b2a016cac1aedce4f0d2b10f782de62f8404d2e639e0c68249c846d73b9ec09fa7525308c89f1f54fd6aacdec1f8d01ab669f882b61f2cc42352abb87076e4726af376b51ae736145aa169943f7d6072098f0335305f5241d24e300d2460471741280fd4f95e8e972435c93debc964265bc52d464d7d53c3e6a942e6b86070bc0ef531052920a6f8ab0745fe4c0822f9451e5ff901c342f2c8d4e62560d32f6cdaa78d8df352bb588a59c59e5a82407607b638b5a6ce50a25575ff33f239bcf296403e74c7da0e4275f4d840eba78d815afe319802098bf7b197cb2a6dbe2c2a7ac33fd1eb0f59ae68dd6e09e29bd78b62a2ce6f9342fc8e3aed5f643dffd0495c4d90ca9b6a0a839e83c0e8ec0e3ca43b481e0441c7f09e1a588909a1a2ac0221a973de38018f673c61d2d20603559d174956ea81c762fe8e952e6082ca7516c01d1639c10023cc95daed12f2c4bbd64863c1e3166d66426f401d74ac0f6618d5b5261fdd4bc92628e1536774026b649dc2925ac77b0cdb02e2a41e8a67075b0ff9b288bfe68efb3fc0741002daecc962dc791ca030994a47db7a292a699da1247e2e4136fc557d416082f5944c0050d53075c2fc426880a7faba53c8c2d70a56e40c6d160b64110e0210ef048574b050af521aa23efa48d97aaa71504916e0e7cf3a8dbd1a57e24494aff2ee65265cf233c8c231e39ebd5437b0627d406d9265dbc6b0050ca63ecc9a7952c676b4a57ca3c2581427b2126ed0fac39ee2e4ded3e6b09a981a2aa380fb08468f4a0aa3f4e67e2e49d87b9dd85312e744d81d311c528107313682ded22f9de5fb0f9e83bef9b06d0b3c16bd4ca1d0545e28422a39b4651b49d535c3ad0e4eac583d4f17dd261b942b1d145ada36f718271604d083d75089cd7fdcc50aaaf3a025a82c40f65c28d99bebcd3d4dae80b6ec09936444d6576eb52adfcb1463503de8a11ab35f7f6b173488a7dc7e30c5b9788181aa1361aec95f333f921b9bcf730e264884f261d52b14e44bb2d5052f36d279e228548b568c8c70cfb03fbf6957ecea2569d351bce5fcfb5f2acc4105cbf09bcfd8daeb95bb32d039754987c3b03c861f54498e43c0749b9bad4fc3a4551277a245ee9dbef97464a6857f5854afe8bc035ee97c7064c41b5b0c058284e0e7328b85082cbafe6d22778b032d2d318fa8726015bade5e31f09974fd244f34a9c4daaea9f9294df6aa5d8509932fbf323d6a37defa77836a6386bd0abbfd8266c1465ea387f0a6c3180c7fc070545ec4a340320766486229abcd521f4f573f53f55b4c626fd3a1b405cd7b5ee0a9ca2d1e75de6bc2f1e8bd0db58c8d3a3c1c842f1098b4a3127e78b18dfc83553dfe98afe5dac03a29c0ec783630a7641c285c0c86d31a19fc435bdc0a7ad779c9d2870281fcbe74df3f54eb02e266638a1d274af1e8fd186e655ed1062c3713873ec1785a442c33314a05c4d1f6e8e78b194652b097261ada85fc9752a2249ca3bb65f6c9dafc4823bc99ff6404ec0253d14d68d4607415bea18a2cb05ce941d5a435ac9f42db9c3ace1fb0dbd4a9e7d8bca44e80d4b956ff1bd216b402264992bd160bd019c7c1261b888a69edc060065e898e6f2142094d3308f100a37d69d40cdca86105aa52ffec6cab4357779f12e0ae890fcb2ff25104732c92e51847075736a29708c87b119a13431ca20b1b37906737d37fd63889362f89c0657d009a63a45c7596685a86f2d46fd1c0106b88e944b0a7d50fcd11f2e6ba0ef89ba9a429335bc482c405db79dc333e3b794c922b7177714c49128b1f103550ce613bbd46c8294fc539dc9c1a00cc9b042ea03074109cca948e31fedbc39436d46c7f252448786f1119abb62de3e07e2f34a047364034808d3470510328ccfc4e346ef725e7a0b12912da015abf21522384a81092dfab3373c7945ab4e06c4e20b34a39b762fd0b2fc06690d68e93a0a1595acee0ecd2b8f0e071c8e15a3ed3e46d5604645b9352ea7433d6f722b294a42779d947336ad590d0b872d902327d76fa1c88139c6752c5ab8541e3e80eebe2ed7c1f469c5e28f9624a72a393af3ce10c3b59b7d659115c6d9da13c1031350cdd08b2c5493b21023e35edc5d0952f31176924b8cdbd2269235edb2c80b9db9883d6429dd0423696512eb00683a29b21cd9cb7caac9a04704ded65d98e4e543da1afdeb6b1cd3e23fdecbdaad693a0c1188eae0e24408a0451c0424bb8f4a96f0106a416aa9d100d2b6b740bc45890cc78fb927b123c52766e2c64e4b468e458e79b247963e59054eabafc02d4769eef096c65a5b280af9566203d4c2d1aa54cc6b4bcee5e9ec0d608449dca4b10bca413240402545f1b3b67dc32ca00dc85ee38aa8a70e485ebe2e6d21b04cda20b57a1d609b9e0906bd97a96c653dd449c9a6ab25c7325d61683279629b6c316ed485216505f6896b9714bbc9880f48fdd9f09034a9b53931008ca2e6695c577016b143b161bfc4fe6fc61843cb8c77758ea4372e724152d59f30678f451150629cc278774e8510f520b7245dd4b41ace0666800b29178383016b620751b62f2d69d33875a4371338b7cc5748fc0dc73e440da682461b630cba641a3f47f504fefc1420b7aeef61e40f1e77f2083c0c589048880f5b35f8e70d7deb42c662f2b23caf07a1a34c53995b0e1c466604cf1aa00b075bbc40c474d04ac3dffd9a5d72854a4e2dcf9be09860dfd2d83220cb5ad8ef4e39504148ec8361bd88b1b133da84444273a1ea24739665bff1b9be5276c3729ea4b3c244c7b7568dffcdc8b09812dbeab17921763b442cd4e59e535bf4cbf79302959224d7ef38f962a8c8a99980a4b2d0367cee26cdc6effc41376eb1fd03f80538536457fd277b19c412b32eb615094db5d66858f8ff095f09412d3d4507396e4ba25aed6c601a09dd201cd2002a85136af817fedf7064d4f05bb659fceb9b0a119c80caf84596648cc4a2fbdbf91e8e1a3bce23743804e6b1546e0588acf684070b1813fe69a3b9ac896a22670e00206828d631519c80ff73eda31c3948899bf85694fc6166a945bf3b5fc804181ddde22e7cdcb1de68200c8231b264b30f69a01c9bfd8a9f1bf514dd2a69cf6a7551b1f6ce7703ced9e1b215ff1e6b39c59b67c9828f6a3e046cdfe6ed4dc355bb8dc00aa010ceb4e9fa5d3dd790464d67efa1e8f030f9e53afc81eb9b1dcc3cc57d71d27dcea00e94abb29e9d8b55310e819c151d0df806581f2452081a25722889ff30263cd03029d7a1d61aff1a705e555aa46b2687506faa6472943ab6b5be89a060c11f972ac0566c026eea513d904cbcbacaf4b6855189b760e0ba53345dcb7976a8410e0023080e8606e3e3ee3f00350b42a5268bab477cd3d78ffcd8c96d042684cc27144fb72cec10a2b99b02f23ad22ac9298e7f38d59668a81b4723ba38286b95e2b62a4d58ff9c9d3a5871fab5ea95793cd7851eb48bc22ad8cac42c5132b10825f815a9ab36e8eb402725132538685ac9d168ade992cf3f2fc91c529aad0ecd56bc324235ee02de2bec3bb6648ab2f3363a2ea377c1a281a079c7ebe214b8f2ca4d55c59d9aaeddff53cb8eb2f732e8a0cfefd9c5d7d39b108fd90ba1f998715baf10e2ec7f2f7aa3a99b9edae8667dd4c451d49215eca6dd039f8146af42994cfaede20229c6c456fccae1003b0881421ccbf56995d8dfbaa724961c3b03edf0b4189ff03a43bb6a302e96d02f4e1cddd3e274deca100d79b5dc160a4eb14a31f7b21a97491c9e185bbd0e3eafd8d8e4bab8e62835d1813ffcdae72405140a6e42f76f9a4efddf7ecaafb6a9eef62b7f2733fec16f1bfa809482a857f760539ac315cf0e54f387c46035066dbc13088e9ca871b51842785195726aacdae4ebba5cf6c8294db8e4f70bb50491a6cb35ad85d27780f9444136fe297fb6148f575cf48d4ceae78acf71a18ed2b50ceae4eb97743dd7ed276bd81f34d0dc8b9f65c84d3d9c93ec2b3ab6b79389c8ed915f0413c60a1b780a17749dc8d6095c094d0d955ae2385ec65493b125702c56fdb6657249bc96c5857b8eb6391e24182bb8a912b1228f969afde10ae965dfb8233beaf42afefc0f35af5a03d50ddff32e546682ff7cd3d4d41f3de58e94b098f09168d6f701656b0807bc1a26f5224491e2c7476836c361432d8c5244b6171700bf684559ef92d3c9473051dad5fd95a0ccb8721ae4e2f64ba8e42b2ad15e3b9c65f9cf246d39811856ea03d5c795abf21bcecc549c4134417fef33fd24476a3060c961c68d07577bac97d5418f22957308c35138cc17f1507697a7f05122d32738a1fb7a9ee9cb3df267b00426df8b4a1a7c826fb1a057ab3aa5d3488b96d1123519e5ccbee7893b5e2fa5c59c3d253b4d1d84a71dbf871db91bb32f2013c0821254256c9cf8c2bc91aa6f867313bba9550c54219d74e7d787c54b86716872defe72385fa249d6a0aea208ec031e4cd4657bd13e528aea42bd23d561ea83557d2184285c8ca309aee421fc5dc364fdf0c64e240eea54ff6d8f16c97f8ef25ccd8830746cf8f9d7c94d4977456d6286207eda4b315d02521ad29f7532f344143f54681ee292eb3506cce03c8af1fa5f56f324f9974a0eb723d9059ea65f6e1b620cca1092be07cc901f8a2a9993b8b85e7f67a002e054d30b48247036758af3fbd249e86ccae3a9966bdec9fd2c10527a527f1b4973f8431ceaa1673d34371138c9d839fda8f0e92dafe2f367c673428f8b8986619bbd861ffb4778718c0c117be74dd0fba64c6649a992e727b072bc0356a6ad2e10e480c5ab2f1d9597302397e6a66dbebf6afbbafa09904b587d8471bcead65c9701d947fc7e67eab4b44b35840693107295d58e9db63c18174cb37b58dff7c1051c65af2989c059e3f887726a5f707002ea0022b240e8fe4583bd7197cdaf1013112e60fe5f005cc07d488311fcf51a05ffb91573ada8fa826fe87aa67d3b0b0176f2ee16ace2590ce8a707108caec696660a4333233137a00dda4d33a2609431c8d3786d82b706f5b60ae1b31102aab1874855f7c9697b08766f1557677e4d4413378550f081383ecab009c1cbe0f0111bd01e82371d99e3408a08b51ca81fd36ca0970628de19210f352e67e798e716a56aea3002d1aa384213630119105f02ae7d39ed40072ab6fa324d88280864c07d8becffe698f9b0ab3436ead3703a3cddef801022fe2f086e09ebdf053c96cfb03048b60616f67ecc1b36680e313dec85cec491bd30b0beec76d2405d49c1b10553b3c029b072d72673687180fc755f19fd8a9b3dd2110d4da74d43f50c3582ba31dfa797a21e8a76ba90b2a5dad84b08a84f16f399051a411007ca5fde6b5e4c9a2cec32a3f3e910878a9d3fd3383505edd41524644b423e18729956a74a0d1f7e74ab81ed14fd9f135f7924a29cdecc2d48526e856c2bdd2eddaff05f6e99ac503b02ec63d96dd5e180488350c824772ee8ca0972235877e101b5936e61748ced33d54097840e0f95b65c9bc65425db46688bcda1b03c2199881faa31f142280e1e9a3b614e48f4a98151f6ccf06ddf3e6d431452a6f5813e85e43e3a05882ba9b1a6d0d0b6a4043c18f0cf6021a3cd96666b58f85b10a3141754dbf29e86fdbf1b098b43e9023053b5e9ee47e214f58a610a65bc221c1946207b4e86e2013ff37cc762ead237222e8611c51b37864e32456265be2808ecf26998cc48cbb302555de5000cdcca724e333437d3a1b69c2980a1052e35e7b93a6bc56e3ad10ce6dcc8d77510241113a0822b060dabb0877ac15c2c0bfed9706f6aed60c178d4f6c75f3c2f3a1d4ad987c963c86e5c34885567012e11494f11b8499e976376f6905fdd3d369a63527b45a610007164dcc1cbbf0a4ac294ad1b5b2b177511f21c6688a8c0f0c69baa2a1a7d40a03e7212e24b61140125cf3dd628342240d5fe24027896214205fc39cfa3ba48b320240fd356ec7cae69561668c8cb08c1252cd30cb5e0b687ff656f3e1ad14e6bec6054d56db3d04bb7f8c4a82b0c887b79c7973b2a7ffffae67d6da9c87f4f4677fd19c81fd85be89b9d671ebde85906fa1c95b143355c4115c1333defe29ee2f21a7192370694f9528fcdcf4e51d30827a60060a6a4a53009b0afa28935f90193608f765c3b2043b121de27939eb7ab6af82845569d9f80c2768e9737e6fff52ee933d1edc2a4d24b11cc6ffcde6929851decf6c89a87fd5b89e8fd7ed3a48d205bbd38fc3b4b3f93bec126d19cda0f3084566c37e1e667709183fa0ed0832655c585b690af5738657958cc384246d7ade7197151dc7d67df4aefbc90d223e166a79d82a7877d446efcb0704598e0f85af1d17a734400fe6531bbaee1e595d8605702b8041c4359975485e028967dce99d7a2ba6352e48203a4a3ca2d43eaeb0ed2687340b933b4b79d68cd4558329ee6384062b3aca68e6b0ba347b48c04e9ac4e736566194b5a9732d1e7c3592c71823a3057417d591386dec9c421b17fa453a100de038291a8d3be614043c87160b0205258ec28490c6761479b6ab7dbda7ff6ac004d94db2be4e57c558e07cee33d37eb2c91da9ccb1aa62ed9b9560629dbc15285e3d9b16cb531030a121da79769d0bbee08e03b79a129fe1fae9876fb1019594c45c74c7d0c7f6c381cb96f8190971f05cff91dd4b8d6895bb6181be1fb31a11e75f803d2f67e386d6c17774f90d59430fc09700e7db857a750e82ca6c3ae8b90990e27574670ea222659faef81b088d376044f3604f32df53fc0a46ee842ea3b95012c21ee62225a05f985ea34858d4192fb1503f5086c416aef3360511748eb0d96980cc71701d0d807d3d8126cf670c82628f62328bd97cfd2af1b58aa91811c4522b3d1cd1a5a940070be3e1f758dbb08ce86dc4dc88c08cf3e44dcae1b2d1e48e8225a4d35f545257f7ed3a6da1fe8103ad84904e796a795861af057a2275406d6fa827874bee0b12f328b5d6aa762102c2f78cf0618452744bf439098f02a333aa573a37f8879accc1eab0b3347240af0c07ae9a03a6dde4bb0e3c7e7761b83f2bd2bebd3d3b93aa261bb0a7a9ec58de6d788b0d534d71e1b36b9f77ab8415273a184921097542e613caf4b305e0c43ad63015e1fb1c1f5cf8efbf2d20e1b154ddb86fbc18c17153c236602ff5dee6971733f0418cffc2ebbb50115f199a161383fcd91014b4e461be0da1f6f88b411ac1cbea5748944a9e30db0db3a4c6fc5fa4026f61b72cde50cd2fe04ac66322b451e6daf9de17f33a2553a0a0186899af1467a605269ff7984ccffc8f6bccaa27575f8061be0fb3b3805a0b236b04ac4eeb05a30d896e869164744f3cd7b8926aa8b2cddb3c9a93ee4ff090e1ec85be564796e245eeea191e651ca49e79611ef3d8bb0f601330316ff4b5ad7d5e648ba3a0289b229e17295362e1bad0cc26a29527c7dcd66b6c5a917813d30c854f15e54376fe0ca73fd416ff1ce627bbf189782525bd049f1b74e6e4805fe0c3afdcfd0da82d7a54a85ed996c271bcab2508714704f2e2e1411dac6e4e1cc1ca2ed07b8be5bed41d371a38a2282d68cf1e3e3749c82a2172ac1de5e29d725828271df9d96f0113faab2f813e59a1ac0e0a98d02f03c607d50ab5b1da6ffa9251a0c46a56886f9faac4ecb86a9c62fe259cd6ca5c1be0d1c13e114634063913a56084bc883c41d0e3d3ccded8ba89c27d485607dacc99470bd39ff5e270094d2494493ae88bc5a4dfec9ca629324c47554a50423e1cba2ede1fc3b517a39c21d597f03693cedbaadd4eccf0f2bc301d430ba852061ebdbb4548084b5af225d0dd45d2b5be775bbce34b20160fa6ad2e1222bd82ac9b6dbe24953d91d41e8dee9e68d36cafe36ed0c283926f4f057e055ba3f7d56da4f68e15b8ce95be3687ce7bf416201144827fae4699618aa0b9794a1ade8b7eda6a90bc8a813a898335f622650ae2a60b7729396eb2d209fdac8a8aa6789bea251b79bf0de8953368d8dc250d2e40ffae0966479543048bb77bec94aaea3e2a3665a8a7821d795ae147904f651e13296b97d33796240f7bf0e8a3ed86fda790fa81a5f33f44ad5fb965a89a99ea630a28211189a473cf34c840f5fe3df83a8d807ab44e2f04a57340b02eda084e0ebd8814649df95afb91ada0551486a9f79d6caa93ad6604309c9ea61dbeecd95c3910de1651a10a1ad40cf7e75486256c29c5d5d73fb8540a56a872fa9db1c124d0ce86231f3634fc598bbbcd252aeba93cfc9dbe2de708bcf7ba0283ae345fa2ecdad141455c1133d1ac0236c53f717d2078d439d632e314113535a8f407858d4c092c136141f647e8ca9ec573b238580b90650ba64159e5c22664f02ba403694bb8f07cf921bb50b03670934a8aab2876c32347f477ba7f4102fa5e7cbff364c965e2891893ce3856ed75bff17ee90f406b6e3fdbe8aa2822005ab42c1a2b1bf87f2446c03d5554e8511dd680052065aa5c24103b0267be0ac4119bb2d1dd9240df93f817f241452cf5fcdbb06a3a922cc3cc14e9b9585e7170e05a0856b1b9e3bc83fcef7fbfbf836eab4fccbfab6784e9069a4be7894ece5d2a936ffa4d64aa0ba5ac3c2ac97a3210e545fb343e74d6963741c8806ce905f1884e7e615d8242d2112726491788084bad995ffd54d5d38ab7360a26e98647ae77db9722a46a4e33b21ab947b36cc495b13538868ee921d6fc82a491e252447a62939bb01407196c53575f2ae4b00bab9e98a891e54d1c00fb837c9676d6062da36c0794d880e3c42554f305bfedf2dcba7fcbd2edb4659cdbb3dc373559ee0deaea633f853286156ba522aa4996485eb124018c474d0be47344683dbc958dfdc00728504de69e100b8551f6b97510974c21bb8b9526439182d346e9406c1078e8bb7daaae88bb86d6ffdb5fb0ad280b849f7125099e2ff841d0a97873512c90e9e5a5ce64d00bc4a2fad3743c318674a0f6639af333f0e77d62c26cd0bd7545621e7a6bba88a1f1cccb2fccc32c48edec1fb7aa9e75d5d21a5b85420e2072d66f0338ca6549523490d2e24faba2c5d07c55c885cbe9a55343d41d575be006db1b2ae891fac710467089e70b1184489ea0d95fb66933a39efe73279d1946f4bcd046c82ef038db8e8cd91216e602aa300d1ddaf8f4815a93a0bdd03878bdf7015a1fa26d8124a504c6519b4a23072070cd923339bb9a56a9815b64bd42a9357e169b3e7099ea8ec97de8ccfe82b160a72472840da43681771f60dd2b098982cba3f4fa0e55d3e8652fa2580ad7a20ab27ef2399fc82dffd15524701e17c0a5f50cbaed0159e408bde79b73e4274d2844f50e0e37303bc1a703fddf08b1bdacbf69b82f264264ce141d038a26f2d785ace313dcdc0a6fa7581260dc8166bae0e967ee34b302eb63aca3f8ffe6457aee365059064ab60e0a377344a872269726b197e5fdb4362204c80bdf73f0a0edc7f64b785717a199a3e1d8c90827314369cd03e5f17b2d8acb52a55aa6a0b04a2196355932a63cb34aab1df8dc30f1deaa1830bc38540bd10f8127e6f2c6894bb886de93b959be7818860311229f0134586278f5acabbd84131697ae18d4e091408f3ba0060bfff4fbf0da178f357dd1609b994654a3cd020f6eaa5e8f7063bbc60cc58a80c5120d58d7ae28676b3955be5d617585d495c91c46118a12b9cc9f64feaf77682b0bc8064a982c7aae43d5da44af3d653f21a6f5d0f9497856553ae9bee48878be7b80f515d496f6f7ad63f68b6c1449b657c9200812591a9f24209b8018a870393a49989ba0ebc4b816c811e6d5b7df22fa4054277617407b93661b2308758d8472ada45c36138f199c187314718bceae934c5e6aa47e8c3dca13216c3b512ef31e7a4704e71cac103dd49f335703f226711e3d0bdab8cd421acaf54b3e53bbf3d754288c745f1132d2cbacb540de606a2205955ded5893effca1ec92da677ae4c9d80f3ea5a631b96422a9445d7560d33c83327d4374529f94fedaa68dc928022cb4838b684034ba8b1b84b1ec392e7e18f11e695fcde01390a6114e9af6dd1090b48a3db0a256d7016132e741e95f9df7b38366d8db803509b27cab20384769222e339c4cf35a40edd036a10ec81b5950c8bd12fda440b1aa47247ef29db62c2d486b95c5a75a5191251b6ed19f0e608fa3d2cf6da063d9809922338d7d38cfa260707b592707784aed2b488b2e64bd22a9c256b04c086f69e40c678d6f7f0048fcf2c4ba41895aaf402757fba6a0fdf673d306f86c6f724d981bfeacb08988951d94eff7363d60c24ccd75057e62b848b8ba7fe4ec05819057a9392de62c607dc1592026d716ffd3ee87b98adbd17c45189516775fee220958a0b460d5834eb5633b21298e53c0264da8d6dd4fd4e75ba5016c47d183209dd4eab153e69cb2f9bb7e62ac1da3a1659cceb53f5e02e28f845371bee77aecfe0d83c053e4f04d47dc9b0ab5bbe6ee160482f62da0ca6ac51e68e718c77f0bb647e95d160102e7b82144d175498f63f0cab5989087563887789065ca2e013f6a218b2c860431c52949156b40e223443c895f1de6e65e41d3aacbc27641c3c788b9490c11fb4732ec59c737f530914892deb1e901532d6fd78b4bd87609c7675fee598294087b2ca2458476f6ad4cf0d25d35b50318e2885dbf8ba271044ded909267a8e319fb192e1da7cf40ba67cc0822a4d5fd7b02217b77233265a4546358019fe51f12f84584cbc6bb061270a7f462271982d209c84bb8e498d462c37a5e59a2f20160fe6c50fe236724dde1d27f33be581f5109e473bc8eb5c3c78231394dc958ec05099ea2b6f29bef9d193044470b21289b8f162126f0291ea571a3501e76ff22b6696365f11ca61b2da6ee63e4a5569f0f6d2ad7008314d609934800072165172a7e2e551a9dc20deb64fff874ad1c488ca2c031b1b944f2e70d3b912db0e5b8646de79232058583ec79c43c2f2f20cd0925051d2367f86b39e4e0b2586639f38ec350c103db2a08f9356a33848378798579216947f47b9af69402e55709361b644c30cff56e4777cb0ffa00a20325206c386b63c0c850323699c8e04f3ef467308a42457a05a74bf642b4c153adf646797b1416c66d7377a4bad2bba08088c3ab6def68616c000a6c70895a5e7f62228a471a0b008eb463dd9bfd39c94941947cf2cde697c982edcf4575a450a2842b54523d3607f2529ac5eb1474f8646d3afc8cfaed09ea3774b2512086ee7fa591970e6d7bd9c6d3bab1a4a358bee82d0bc81c98d7aed6248b649b2f4b54a635a6ae4a8367d242eb60ae43dc1a0406608ec7311e8c9652aff5954bb712421e957781959124a89623654e64448d0ecf93f23ece458e9823b22872fa2b96d60c82391125f4756fd1be89d2462188d2f6ddb21b4eb8087edba0159b23026978bc0dad801c7414c70f7c88506c0539cba13e9fc7b19b513f50c14f5064ddcdc440a7a3e018481781d9bdea6d2a29ea22336232c8ac4ed1123417b85a6d680a955b4edfab9bc72158ff50728f145b88b86b377bea9d60bd70a7a46446a3148f9982f8d95e786123cee29463d2a2898297198d15b14f767dc18e66bb800ecabf39a19fb8784683cb44d82666155839de0da4be3e894d840a06ee0528b76145320c658a4a0a6da2116f9d43031642930237b519fd48539f12c8adc71874167a7ea7dd82ead011ed3b1e4223013767d4f046afc9fa8bac2945b2a559f7c83d0f298db6da6880c58d56e77d309d3201a8b9d15f3138bbb4e440546c9e9b8c55b5b9db26b9585f8c21b5bfe7b608045f032205aa0c8ef970e98599d9db2bdeb7932603157f95eea94e88e588919f460dc106407d0251d61b42c287dd2fd03075254a29c88d7cec284500550879b4c157619ebff3518ab738ac3e8f16ad39346f5bb7bd537c555cf8815772e41625982f156be3e12d6d1e0cb95a77e748f9102807b3cc18c47b587fb1949329528958ed00a6c8ba284760396594a6f3c71f75dfe639e8ecbdf3501c6fa37cb9100301767f606130daa7f35e7d6514f5a67d73a656df992773bad31d10a7577d371d48a1ac9ad0f1cb58f0b931914982529af82f4a96278a1c3ad9092302c027b43fa1a6e29fc021f9e9527c23e7e1887c878c1edda80302645b3d375d31b575481227ad6ca668efa5db65d4cc28a424f5b68631830f19362fb90294c211d4ff82fe0a6126fb50dc29a55b569ec7e80361ec2d29e9d6d6cf2cda195e2de254f314636f00ee347ceecc3c2948b8346bcc3eb0e70ccc31b1bfa322efb23177c2d10d1373491d4bd308d038625d13501030d5bb49b943306b65a9d9a3298ecc92c34090f902308d630a142210d8cda6b61198b0a360e3676512a09b7e21cc63890c139aec4839d38e36c840fd0caac955d89144aa82f1c667da3ce9a8ec03cb56c97b55bae50a92b877cf53014a9d1b488633d1627249ed11ac4a1bd5e583ff1089375a1ed8d52038d6907d8df3bde6438040c2c3af802e23f9730db87d54651dbe4a3306391c02c767f9866e942960705761a60b1043be17d56c5a0d4b5cf560dc40821019979ef1ec430a513bf42bfad255835e149abc5b066d5bf2c05c5f5f1a2d86859523597555f348c6725863f0ad0c1593c7506ca59beaff03e8045263e3108114b9a25bf0fe85c0ebc1fe78e00a72fc22fa7899c4a8e4f9e92217654e44214cd4069627d734e2bf288e50fc140fbe4d59fc018e5c287f23e784c0fc2466a1f254af95fc10e620a4ad57adea7dca47f0247414ccc20c0842d47f4cf276766095c3f296c5f9ab9ce810473e62f3901e06f82b3457a0893291480b8d2ba1d82f8c0d66a9dd0566ef13891375e108c61d62f0eacda7e4be4d3687b5032508ba6d106ac3d036db4bdd235b11c4d1e976807a52bc1174b2329ad5b61645dc7438c448616ff84707d98db3f71de9a738b4c11dee1b4230104c7dcabb851f92cec559e41db99adf87bef2f460db83fe6d7b86e076d15b37fb1539dbd9a1a24010a0cf00639badbd8fac095f58061d2bb9d3903d3fab89b9a372cdf344c3aa49d83444878a9f2ddde99d4dbe518b807bd07bc6e10a217c0cb120b35472844c50dec1f9818a420df14eca2667d88523b17c30b433f05b7c028055f4a6fac1c7151d97b89da0e5938815e1ce9152b3e7e5b25103c25f20cf9adde40b073be240d2053660f765ad452be457d17730a437618582bd65babfc3aa506ecd99101db3e1ad1f42af4e4dca531f64002e35ffe9cace68249c6e05d7b1356f33d6ccb74541de30b48e36286cea9d8ca3eb6ea862fdf8a422078a340a57044515071b52459008d8193a47b55942538cfaf8db1156d8b54f2fd2d3b71963cdc6c069502b4e7ee804256326c672d2c9399ebb5d8b66c6e5b265da2a2512a7303d96358acc761de83d1ca454352c22377d93525ddc10a2c824bc82756bf28453e1160924a7ceb386ca4e310de2225e954465a95f1321750e73ab60c18a4c15334974b304e722b48bd4b6e594b306db120fc4ab57a01ea3c0515b68160af095f21e7f47a13d226684a4976682291fe2078ebfe0003102cea234f69361bdc4c7be57da53687cc042aeb409da02838b025ebd9148bb2bd9c0ef7d6280b167f53152d42886e6b00a0b9f6c37c8d1cc1885cc15349d88047b140579f5e99e5d4d7b25a6e040d75a490d8b6141d41be945bd0f299559d17709cdacada18875c4c8113d125df776d344e03011d847664d7c9285d8e6fc81de89a4bb1447b3e81b2a73934c22e99d96dd2c188970750ec80a0561b7726891d5c3377fe5200c791d0da26955513a9421c17a08e48489147c7b0d60104040737305d906517290dae5b410188093490f6fd1ffe2e1c6fb584a9970a45c2c462892a142903c91d29fccf5ad29982a409916d110e1cbe3e5dcf6053468e5733f6f92339c28860fcf3bf454d129b32b273fa20c1585504989d2f70547f65ab6dd50bfd3528448d8e14e2f016f5f3f98614e8a686a6b4f228624188657d376a444602a8b15a318cee707c6ae9b54066a2e0a7a3d0b28f332c9684b737ec8c56f8f60a4c0d0356fb84c9957593c189c647762f8a72fbe413271eb467df759976e3248e6b1c28c930b1875c2bab7c42390f1e26a4aae682a9718d12e347b1a484cab31f1143bfd66d4d4bd9679514bbc580b972153f4dd6ff8b80d561fad83028ccfb90b74b7faa8d38aec282ba5d1c6a193813e2fac611013e58b13d839dfb7655391cdc524e0ab3563c01a2cf4fe72389b9742d66eabcd4e42584c706e6a841a78cd72bd256338a5826cb315c9a7a97767842e745039529942a008c84758aa18ad9c15a622e7dda9448c1c961bece7df51be5f85b64c145b4a1b5c39e48d133f152571c4f4d4164dc14b40432cc14e822c08845d8b609b96c9f944a9e105fcf3f4f60f027337acec38e29050414d368f7af62990d6855c9f8c1b873882781fe1308dafac1dd1637c48f0647ce9c6b13e97d1d89b7016bcb7ed9e4a4e8c9530612f9d08b1f45e5b522b7965a0ba966e400503f742142ec4f29257957c9345234bf075ed33a352a4e5b7e06ba4615fc76722dcfdb047cbc91be51b0b713f9654015dbb0fd09eed4cae2fe5aa922f5c7229263259b2526c619c730848b967147438f5400f50ea0a6f89862097db116f854592119dd9da58f92a9c7ec2d1c71eeddda2fa048c0e21f9de0e08dc6fa67b568682477500004b01c0ede47b3f09d0828f59983531fa79b897b084b5b887a0910314ca7c37a159029b16aaaef0380767e1e94da56cc0ce067752aaed07bcb03880825cff9081ca9fd04fca68b57e304a86d464c7c016058db60fb316e67a2e6f524ef0a09d61f32ded420528ef54c89226a808bbc154cbe82719491b5f69ffd7632e7aa75844fab47fb04587b742f958eec33ddf2b0cde4345d0ae6fda9174ef98804e49e5cb23083a2fc5061e2133ab55d75719830e8b211fd46cfdaaf7da28834bda5f70d1a2f21f31eb837c8bce1325be5ba10b5b218b0b19f10eb4ab4df1533bceeff80ab85d80f2792f88cb59406f19b019b505582b87a94699a74a888d254eb748b75f1958423ff1428e19bb24d64645af5c4295e498e375b15ec0bc4d36865c0a2bfd78f78b1751968d8166303edf66e1b3562e9a833e1c60d1229b376d702ba06b8cea1b59841161af7e6fe99e1739d806ea0ff82dd408f27a52281fbe2384413cc81a930e124f7a4c96079a1a376ba3a331039c0ff6f53792ffdf40db36a96aefa31fffb46073973c3ef1ef7ec3a7dfd9aa0f22a1f6641051e7d4372a720007d26336c079e2b79be3e2d22161128b04887da36fc38b5940948d00e02ceb9ba22be7a324b16111f5ee04d64b9db8f8cde77232fdc457883a3a989a5348055a94a360976cc9297a9d28268a8a32e7482a9c3feae59a3227f9849cc1c34561b0c722cd08bcb5304ec95e9989906009e1ecab691bb8dcfb4616a864a33f606251bd7c2c5806bd7d25b82dffb5054b7f82542f5ae0f8727f07fb3a39bf4a091699ea448c00ffe1bc72bd8bd4cbe61af1cc48327ed32de5fb1e952e595ba7b36541062fa10b40d91f32dac9ac9f448b131b7446d3e57a20a31edc06ed6b045804640b99ed9a49967a48efde7db2996280c57e22c567aa0394b6f91874a6113e568089fc234a644f09612c543262fab3c305376710b98fc3a63e895c52198fcc42602dad190d124562558ed8a0bc6487f1dc21c357fbcbaa4a82c9790d31ca7b86ece0b9470492302dd8472139d791ddd6263e8ad8ae509a7821f2ccc5c81ae3ab15d5e1c4d18e1d878845e0ac001b5621f97e72215b6ac206a6690778673f5239835ba4c170e3022251a98059128c9ce05473120e058763161742d417148c994a427cf96f98737f4e140abbbb5de12f0e808ee1e326dad7109b87a0cc1d5fb85b9882c2bdba5cef6a9c74df718e72a3354408621b37e4ac64a51bfcce7b097671886f7c774220af99d450c461dcd3e1304c0768b41f44d322c70942cc34605d9a70e2f18a7b2a28a0a56b37007141d6b81d498c15287718860dde1f37b8a270dfe9ad18d0a2d34c7c129b86e35d53b008e182d61dd3cd7b4b8d57c5b8a1f9ab7f895fb590eee3927aaed4a8237889c59055d22b4d8ae6f60d79ee27433488ef08b3fc3344314c5b6f011e888a6c6205c15c354e45fc541a1660f2a717d2e423ff867e9f4f2156f8121952bbfa488d0e5d22c1c5c505a335d6778f79ea09a7d9f2f78a0acb6b5c882b7b2dfc3419ac2f78852e7407924b58f17e14593629e24bb1fab376292ea849af1d2e7a6be63783747dd50b442503ba73fe775a409819251d6dfdf24b14a1fbec5b2464610ab1f8f321ecb821912d0d15a9755f5feb5e2c4d63006694dbeb2ae6f111b6cfb489bd40d3f7c4e925e3b115d0ec2020dca937da7ab2c0d78cddb0adb5b61b218434b2f7de7bcb2d036807c7074407cebdbb5889a7e212410421c32449ce1288e3e2d42bcac58b7f2fee827a510446fd454745ec5dbe7779797ef2ee50b98fd14727cd6e91878f58c82143a4c4e25d3e8c445654798d8e218d6e72529d6df44805ab21dbb08a61f5c2aa85d50aab20ac52589d5895588d4f20565f1be22c0fac458675a9da6861350a3a0d9e798787e199786a359f62fa91bf05103d1185fcddc1c2577f95d9456697074b6b4fe5cae1c26a1484fd001aa168b08c83651996fa9dc195c962cbaa57faf05878b0586aab1ab2ed865d400fd9aa6253305bd5cbc965ab6a25b16c552b27a4b25505f9806c55a91cca5675769169ab2ab190b6aaf14955a192fada1076719607bb807ea37f6017d06575b6aa6d59d8056435da7a6810d2a75662ad5c389c0b52038dc0233c430f0f99e0992cc02a38c66a348d240b0b5d8b61c815f2d669b880b02ead2ba5ec96d44ad3daa3adf4655d5132e1e1ab586f2b7135ae051eb1b08893223a7dca82764d5f7405d18ff4d2d18fef653938af083c831d4e9d1e218b75cfdac7da369e95aeb049933e3decc231619127e380661b4a037edb8910bfdd840141400764b0c83d35e017c2646200a54164dc2db0611168a409baf21a7b5811ef3d88b0d1ca82ca837e61914a5a6f651e16a92bf3f7b432ab0c9e6c931eedc7cec70bc7fb5543e11f4ea3c9e918903ceca1071196d9857409317a598fbe04a22ffb52d61e21fb229ebdada74ff06600088cd90a9ccd8f5d267c2369530cea600e2c3c754b5f66775a1c138f853091aa958cdc1c767fd899c93f2bfb1202f9a1390045c52c5575cc594b825f6becbab3fd32aefa7163d8a96bd1a1b78a299de90dd7027986141a4265747e55d566e7631708312450f72a9628c459024ba51289f411e923d247f22aa5bfd25fe9efa56341a0b164559ea4bb5e522a65a58f3ac9e31906a2542a65a4763aed76da3d69c7d3cee71a5956c561fdddcd6982a7f92a89f48a5aa12bc753d227930e4e77b70efd19552eacf6c3a463440ec79dee1cdd71a627ee3ceee4e38287427eb1bac539e76a3e843b15233a92b1ada6f3d390c0323c137ae92aa473c7582a3fa4a6436a3aa45f11492744226597070be93d4296949d2fba849027951e4bbfd13be27390b21d21d24b2152b6427a8924aa6d489f46a3d168d48858956d8dae71167e88b3199df4eb58602f21481f596e48c71c3210a4ec7d9a1aa69374924e42445a7887d331a5dfd092290613151cee2695572ff806b42cab8251493b73386b017669446cd5d335767f58973922ec02ffbaa68f60991687eef0f22d6ae31695cf984afec50b955f91ca2f157baea2a2f21e21aba2720e71140b4fe145432cfc11425e2533a25d3a3ae635da411a49e5c21a5523a62545995262602be169284b649ac9108da67700dfa47bc054d86955b24e0205659e896e49c34f1caa63da71434c48da087c8e881b8283a653fa28d3a1b56b3a482711ed0d28c414e32ca6182a179d2f1fdc1067e38874cc285b297de48674cc4aa99158f822de09aa88ba4608ec9a9a9a1a9546f912a2c53a267dea4e02beabfcb6125688d25f4dc7a81cbe8374123c730151fa7bdd83d10e98868a7826b4d3491afea9d4527d2d2c950aed0d0a6fa2b455547e4d2abf57797543fa14df4240e16fd3a1bea3741fcd4afe29c207b56a5b91b7be448b43ab942de1e2f0a46a01768177750b5ab0f0a219f414729135222db29b69842231b970ddd805c4b00cfbb3d89555805de0ad665b0ecf80321fa82c367bf7236a03bca06a6fc69b6f3e799ae103889da7ea8d80853fd996e1e3d976aa42ca1af1b2fb2ccfe818d70e73839d36dd6fbbd91cb7ee0dff20b41a74ee0d8410e0585a719f9c655958117e61ac3b4c678efbd41dc27935d8d7cf62797f17c2c234955fde6f43e28610d896dd1dbecdd91eb7d98e4ff1ec6424b7c4bff8175fec57103e08f9c125200c59f7de0fbefe81e9923140cb5034d18425381775323eb3f415fd2950347105144d64018a26a6e08b59b83979e74e1d135f396bfecdbe9c7f67f82e0500b190016c2f1fb8b750b1dc478156dc52a071475fbec35fd7a1838e8e5e4d67a36bcbca6e03d5986577fe0292c4f2e543cba2a2aaf7785466c40b4bbdc77b0676ccbbea55eff1d5fc7c35b31e94e886bbd1a35a9d079024a11a0b33f7ca550f5510befa6d167c751884cf90450fa47f2009d90312407a2065eed5e7196c8c3ddacdc1b6877c97ab3ebc832cd0e7790049625d9c2e33e285c57edd7491f449bd3a478a590f2c5b4209d24ba552a9542a954a2412894422910e821a3d90fe839451d7d24aa552a9542a1d04357a2865264c08b41d74b6576bad31cfb8a05ba00b2489b53ea75577f4577450d639d1104abd6561ef8c3d061df331bb5436b325486f5236edc380b4f1988d99eb6c4506b1a263da771ed2c6cc08d7462dfa40459d8c73ce4561f9554a299975b8dcc4f2e5ab2abb44c818638c31468a92524a29a5e4c7dc526597087ba91f104228a594524af9cedc7235e09c737de6168a2ae1a207249c73ce39e7babbe37fc00c893e7cefbd1d76b81cb0973a880940e9708158be807019b30ed44140340bb2202a560ec423f1c385085860c2892ba490c1931ee00f204b4ce10132dcc0053638a2093d38e7dc03ed8e88cd6b388d499f969c805bde6d786112d1364426d13c3fef2fc890f757cdea84f4e9edd8fbb7c33352f00ce8cfbd2b50838c68b0abf76cc67b92883e4ddaa07310ba076b541a004d42a6184bcdc140a063a84f397300b131e68887547c4e07661e988bc051a0a73ea9fafaf42e84f5d2b09086eb2659de1f96ca669fe48fbda7df794b563ece492945c15839df1795319dd43cf31c21db9b8b8f51b68cf2d2ed80f75143e7df21cf50b740a7a88c6d5f42c847f918a511adfd3927159cbf2ebe5decfec952772bfd172bac3bd88924962d74a28865cbb66a6697d7a7f7fb605d79ee729f80ccd65570adf5bbfb3bdb53a331a0d77219906ecd0811481e704355a196bd6e2d49c52c57624bd00bc4ba1a7681af5a64cb3498393f06995108110b1f8f601a7873133f60e1630d3403c32c2c3cc4028e8161192c3c9c02c1c0500c161e4a815e60f8050b0f7f2017185e61e16114a805865bb0f0d007628161162c3cec81576078c803a9c0d00a161e4281516078f8043e81e114161e3a8152303cdc8151304d74c22f1032c1c2c32610094c139ff00b3c54027c826922147e818750587898038bc03491875fe0a1112c3c35c134b1a78708161e32e11919878741609ae8c32ff07008161e2ee1991c0e0f7dc034310abfc043205878a8846770383cdc01d3c41f7e81873db0f03009cfb01c1ee28069a214863ab034710abf20e1991b0ee10d2c3ca401d3442cf80566874b587838031f7ee1993efc84812f98af900bd5d34a6db8c806510da7a1061a564eb3f2db96e6cc316e23c66f5b1b672e4001ce6c00039cf9000738f38d1b67b6f6cc3df4706604202001674e008e33e3f0e1cc3e9c39478e1f74280088059cf98733eb38b302ce0cc49917f08a87cf6a3dd679acc68f2a76953a7aa974aaa6cba8a7e750651c879ac3592a0ebfa1b23cab37bc6bf6d7fe02ea753e584c91f213c5a78707ca13273b4d747270982c519204c99168e4a69970dc8d85d445c1a0a0cdba5f58243e1c98037d2cc494407d2295f9ccece1e03c1c1b1b1b1b1f1f379f099cf3e116e8b6c032efe784020bdf084cef03f4e70b5c03c43bb2c80af5a258789c392928bbd46465d7f4cb8c07f4c2223314422e587888d333b0c2c600c2f0394ffbec30a14a2644f27ee48f349928953ffd70fae1e074765d120b8fb3800a445540d5517fa839aa0f15474d40bd118a854740eda1da7aa31ea01aa0de9873230e4dbd71c98d4a62921b91c423371ab9f066da17cfaa0be29260177896ea8454974395519d0dbbc09faabba9453400d4eb90b0f001a8d72961e167d4eb4870dd092cbc00ea7529b0f02f15a65ef7020baf43bd2e06167e00f53a1a587802d4eb98b0f034ea7538b0f03bd4eb7660e163ea753eb82e081636715d11ae7be23a245c17c575525cf70417050ba960e16780d8fa67eb2b028b985c91d7695d4fa37938ed05de518169a211235680c233a428304d3c72640a16de3de19916871109125849c13431491227ecf00c1505d344254a98d084674048609ab86489127478e63dc134910913287278868722304dc4c131020ecf584d304dccc92102139e9941609aa8a333040bef96f08c0f982636692ff04d8060e19d92b8d35ee00e1ce18069a2132698263ea101d3442831609ac8d35e20cfa81ce1999291223c63ba131d405902debd8069620f0b9826fab4179802a68951dacb099826feb41778c3332b316ab80def713088b2821f14b80fc0d3c429ed0522c134118bf60279a61ede1dc134ce074e71237021b0f0550d9586db506b38a9c2788b4a7a555bfcd58653b53aa8523c3ccb6eb8818505071c72c841868cd3a9a505000008400066cc70711180005e5e60607418000168ecb0030d5fa9316eaa2ba5eaa2eb8b8faacab13a7aacd86bedcf791eaa7559eb611179289fc4c22559f6708cdc708391232c2c4790e08003922439e49044890c194a969c4e4b98b4b430c101000070720210801c9d1933749ab8b834d9118000769cbcbc3c3e8139cc6f47283af00ce0f0b187003e34a2ec701da00c80c712a08786cf0e512c7cfc89912233a5060f313f32526afcb6e5e12f78a8175af91a55a6decbcac7d41dea55b1f2342a01eaa5c1ca0fa0de6ae575a817072b0f535fea75b1f202a857072bef52ef0e567e46bd3c58f900d45b002b0f00f9967af9092b7faa979160e565d4cb5158f91cea6529ac3c0ef5b2d4cb51b0f237d4cb54b0f259bd7c052bcfecc22ef2b54e76917fb5d845de864ad945be865a6217791aaa895de463d418ec22bf52cf2ef2a6cac22ef22eea895de44b7506bbc8ab541876911f551aec228fd51aec221fab0d76919ff546027e601779505d00bbc853b501ec225f5508b08b7c8b1a017691f230ea10ecc252764b6c09ea6c055232134127d38b3973da08a6d817cb4f8c2088ad1eace493edb5295c921722d9604e9f3a04a757d30ba61a0fcf6855b04ceb01b7c0df70c3ca0a89646fe3a9ec6d3c32aea65be0f9e1f4a9e7e19ca21c53028d53ec94c6033327e40e49c78cae021d110b6b9c8ca3d464c27942880d37735bd1f1e45d8dc3a9a12e89a9068eab71f1eb9ab828289c5893440d6ce20363c02df0534e3f2f52e4c2224cec8006a1088745a0117681ce27090d2c3c94f22826089b4cf1c49b30f980e2c0c217611798042a7f69d88a1f804448124f8cc0c7b2587e620439b69188408ae53e8fde284862178e87f3725ccd9087d331415c123ca304cfc4c3b7153414b4218d2662d174d0966830b0100bb6525aa711840b1445b97aa7751a68be98ab0f6763f69c682feff5897daa8a6388d818e9aad42cddb8be87844f167eb8d0852e74810b51baaafa466c7c2462d97290ca3958575a6b948f67adbb0b4775c9fb78f639073a7ccefa8b575c01e2c4a066445b719782a7dae3e174f7d45e96cdb01a94a2063f575cf1738508825851052baa608515561cb1c28a23561ca1820a9e6ee75c73ddddd2ba774f799b939e9e9e9e9e9e9e9e9e9e9e1e2aa8a0a28a2aaaa8a28a2aaaa8a28a2aaaa8a20a2aa8a0820a2a3a5ab355d7459dc66ed535ad00b2a645e9c4e69c735ea77e2f4a5ffd5d3a2e9a816e511465d5e6fab262b7ea9a569873ce392dea947bbbbe2c8813dfba63530e6431885aa4d7c2a22a7cacef4dda8a9a73ce69351a6b529635e79c95b32ceb137bd3cf4651a7d19a93a26676ad4fcac5565dd805026196656193beba627561b34d8a5d55a494524a29a594524a29a5d79c97853deca1ea9a13f439419f156856216cce5fd36a3416139665619665591666599768341251b34adbaaaba335e78538944551144551d49c4c4c6bce39ad392dcbb2e6b4a837a5c5ca0aa0392b100804b228752b76abae698589519f18e8028140208b8240d4af39e79c73ce39e79c73cec30bc7acd4faa4a85fd15a154747ca9d3aea563301aaa85fafaab6de9e740ccd56e62dd1e8f2216c24b20e9af31735ad69c1c9763a394d1d56e0b1a465be14d00f04d69bf566bdc5574ba0dca77859f01c05bdb771a5adb46cb6f65fd99d9352533dcd536cb1ef98ce568268b7dee7b39c78866db4b2aa558daad9eb3ed6c49d5922142aee98959ef1dedf7befbde79c73cfbdf7f79e7befbdf7de7b4f05556b4b07b4fb8d06afce705c855a1696ebfd71848eaeb1fd1bdd56deeb0e1dfccc881ed2f65b16968f50558d32bf22ef068b294f9c2849e2863821517c74728c7491aec102ca93254a1a9136e487c70f2c39a08ddf102a66b9588deddfd88a73a030f675eb81f6c11b22f64e59637bfa39a1d722d2a0d8fb88b4465fe3683f4e867be8371e77e7e911b16c5ae6fab188748c2362fbd78f73b05b6b8f9d9b7ce277f7e47b32ada7f1bcec350c49d528bf43570e28431edb26279373a6558a717a3a8e468d773a028bd0968136d382b1d0c6c93c1dd7d29fd3e6e9e8e84c9962f51fce8c29853e2c2ceb04f111f27e8858fe8bd2324fa75bfa4d7153a6409b973575cd395924016d24b48149e011274f26e5e449c87a3c3af0caf1eb8a9815756c7b6c0e9b82de69ab6a64353aba74b458983ebd26240b736be84416538ca7a30476e95ff976baa51f12f8a51d06057aa9255998f572ecf4a95dd2b6ae3d9cebf78e1d0d84d25efab73dfb78e5806259e3e6b06703a1341ae8a4bdf4955d935b624365506c1f2e71326f0a74d268e013538b4f875dea6b32053e990765d7e4b29e4f2c06051adbde70afb29d3a331ae0c38649e30972a449ff1059d276c648a5c227f7a7e3641eb7b8778ce6f7c4b6655d9fba721cdab4b8a20b2bbe9a514c06958318e4a161fe401b7bdf5382c7b213969f50e2c656d81368cb9c1327f4b69ef6ec9dd7b239a06d590381c3712d6d39277d87e31ccc706c43f7a45bfaed9cd87e3b277deab7f913868a599c40af659d4855b33029e8e51dec0d70a0df936586579181712d8ef4ecf2a861a71528b3ca21730ebee4cb4b78c97dcab8545738f4ea358c732cca2ea5596d58b3b0f78543dab0d86575170e1a7d925caf05b91d6cb0625aa07c87bd28163b59ecd57bed713ffe0f2bfbd4a7e633bbc8cbec02714e5e662758a9f3732b7c3ee814ff6425db67c494d90c7829dd3177dd68f815f9b822337e116d39ab45b4edf1a3c65a7cab16d17c7076592ccb2c1e4e6ae3e9fb8da62460e59d61f9c2586eaf1bbfc78ed4aa1740c124a789657e10558ded8663bbabb37f96624fa87dcc75f6a99d19f2c0b976d1a3f6558d56d6cbe9d373e7c610434271e6ccaee93921f3d225617a670f07c7470b765e41b8631db3f2ee61772c839d5993659a875b9e0f4fe3194277b4dfdee679387d6a991342af56a41d4e9f9ebb29c28768f4d680e88015bdd5dba00635a81501ba3b55a9ff42575d140aefdcb3a12e21aa85ff7161bab72353c83ae938e6dd65cf865ddecdcf2342fa35b9168f7495ece1c031f04cff8584f8340f6db4d146db4bf7876dea7aa95e1b2ccd8a689664f3dc47a0b7d16874d733aa2e8afb6894b99eb7c30e1be570511e95b99e3ebd28cee70b54e47cfaf42efa8d6e5594b9287dea06b2780a554344b73c18d077c180b66d7faf18b4c48bbb176f9582428f61a7eaa558e674faf4a64e939de7a45b769cce4dd53c415c122f329ee6691e1eabd51d7d1f4ee0938ed941ddf1b82bf00c46d54b8876d7ee5cbb7bbb50d6a4635ab602e18d7b01cb30bb1c1baebbe19bac887693fd3de998eb9cd8d731fc4409de8362df3128f49dedbbeec7bee77eb029d028d4632e1f27c405a19376cfa5a3c516f19a933eb148e9d37b3becf276b8f7e0dd11c704cf808e1dcb6e0351edeea74fef52aa9b22057a1d11f7b36363dfddefb3b7799e94ebed026e799fc1bc01ed817d43b0ddf384f03c2955c87a382f87ba700432ec5adaef0b2723ef64a804f4fe2c2d63721953187b27c3ccaff49e0eb63341557db20f3e9a6d8e9aa0f3adb71e57103333e29d1971b9cc87f6b872505da1a68ed84f1c418974d587f81602ea635ebf32204ed6fbe4c35cb97ed51e2d88f62e5d06443cafcccb537565ca3823636e275098a5e2aa59d5e4ea3c34a083654caea57a75669314a728d8ea57b0d57956bf2cc5564d1e6163398ae5276a90d8aa5d33bbde3c0de85a4386f3cfceecfea8aab314959ea8b1b1d7868e8d8eb9d4563109e8987ef51f9ca9bdb2662946a5032a3fdf33bbb3814efd87ea0ba8aa5662962a46894c849371e1645abc72515bd4cb8968d790fe24e9b2b6bdee247659dbb19a43bec93728df47c497629fc0c666818ddc30ae254e8a6591bae42b276337169b699518cef73679862dd10b7195b22bbf435eca17a50d999d137946a4ae0965778eb24b4bd9a559cde59238d5581405632f0f162ba910d75b6644b3f298ab431e6f81965194101a0fe3641a4eb7c4df64a2b12de9537c48090af3f8db96c8a83cbe931072132966caa14c6c6cfca561659a8d6b89315ea536c0b5c463f5c91a7c727792c426a7481379d51a342a102834027a5f7f80c96d4b96d4d8178538096d7cc70b87cc60fae432097083cf35774d1be918173a7383e953cb24d0a7382dd1f9890f34b1b76bda12284c7e70723a264622661c3d7e545a42e5a15a44b35856813ec5b721443899e9aaf8219c8c4a26e325b0b3e38084ba869c2996fa6d113b29aab9f92bb2ed4706e2b080ab5ca3a8374ab6780bf08c9066730196a9e15ae6e76d43ecbc8d886d37385e98f3b71d117b4e09f469d6a831a7a9468e5b4a52af9845977d2cc033cecef398977209eba59eff0966ce1976be15895334d7429702d8ca26db6b8dad39e773b09d076265bdb7f20e61db67956fe81e7d4077e1684e069099df5f9fdc09de8db6dc7bb06d5b0f46ac64b51e05ec7bbcd53eb782aab2ac3eb5e6606ab40c113525538c770cd5ee60b51c94a0f7418f5cabca7de28b81589ef0adde7091ad3e39f79c0fa49ba120f43eeba6059f6b52314bc734989229c6594e332a1cddaf7a8cf157776bddad35b345fbcd899007a8e38e2c4f8a9007e865b1b0b9d768844ddfcbf15a7357a03e4fc11b1daaa10f4208ca404c9d9ab223dc09e560cb77ae39da978e78f90ac67ccbf72b2a6e991702017db0faa159ebb986969bd7e79cbf1e0fc4c2eaeaf5c1a08a876541590ba1bd482516c20b87ccac1012a63703126061e7e527a53033d0fba61533a8437ece9ef2b525f09954b57307626385f5b6215e1f42fb8660831e955b6f62fb366eecca100babd2abe6b16133b2babb5d39e8a5751b362db071d3d885a3c9aba22eaaa3cb7e8847da51884786785a88c742cbfa04c201eb20eb201f3d2d10e8b54f590444ca76cc3bd1e56fb48d16341ad09b659d2f2144d9b5eab57163db2d2b6b0759cdb22ccbb22cd72eadf996ad38d315c22ccb7a6b10c8c68d8d1bdbd89543e5ed52e916d90e25af92896ce8f501df2d694915183fd2ea3f19ca185e19a8c974ad41ab0f84033f786cd8b44b1b47eca5eea37780fec336eb6f5e1b368dc67adb28622f25af0d4afe4e1b37963acf4beb9292eda0cb4b6a4ed01bd55abb035199556dd8b497d14995744a9b47c5c6c9c0d8992a3616c2c3d87132304c94b60cbe54ea9e9ad20f44f52e95b215eca44bd3120b0fe3c7c9d01ad7024f6b60fcc0f881f163e16db4e03044364dea78e5e8ef0865b05d446b60d3cc460b4ca64be56b2c84d162365ad0685a6b190f7863439707bca9de6f972c335d0b8ca11e332fab67b1eedb3db68aafacf6b1d569f6eeb1d18246d36cc5b6aafe669531b571638ad1a716a34f108a28a8ce6af1895652f4027a20b66a97a0fb8096ca6cb4a0bdc8df7093e3ca9052ab4090c252da73ecacaeabbb7bf432d78dbdcfca56e70a74187574ac82da45305644d99d9c5d9375d99561dfab4a44fb94fee1f4e9dbf9619b5b50daa28b744477b445b64374cc894643ef6ed3f0c64e4376db8afe72ac8b91ad64f76680917566caba3b73a7b5bafd76ddfdeef31504963d27b2dbace8d90af676d0105494363cd4dd774d644341ed24123719356434f0c4c8563277d061886c567e198a4ae5a6435ca865ece70408244584899a3bbb33bf9d1d2dfec3ba479923d031a0b77e7b3a20a6ed027410ed9763413fd5172286693c83f24153ec98c1329f5f0dfbf8fcd8995e9cb9b60803650f07461dfd45e92e6a8b508575082902fc9863ae0c7b6186a0b22be33789b26ba2d9a5cd2216b5c69cad84dee2d88770326d888cdf64a2ccf3f8188f19b6fdf29891896ca80f679bc33e92578ef61da22c5e420c717fae5ae7b24bc29edd0c00b1fcd1751d5e382e1aba1b784e349a19967f194a12d90efad09d7bc887a3cf8642a735cc2f02cf8946d326c012e01979475f0ebf9b7d0062bb6b0d621dbbb0a31c83c13ae682758c05eb980ad66597c78caa511086b5d65aebb736450f3b0d61bfe1b05afdaa56f6fa3439da5b59f85cd6a36531712cdf002446bbe10c95fc03129c8ea8b4ac36b5490d99a20101000004007314000030140a850383b160249247f4300f14000e8aa85266509c89a32086614819630c000008000000000000018c4a8200e010440b8f063d76996cb7ae3a07e035d1d39d9f4a213b168675ec2b1c390676ce607a1fc8e8cb70294378f9a658cef1010e2c1fa5d41448908ca360dc573a72a6e68eb3d390bfd3e773d8ca46de51a9b194b12f525299b7d4819df475da1896bcdd963ed7f97671ecfa5f8754e662814634d975a97605b96c9895af94b92c13bb64818ca232021ca375a190543db255bad0471c50d60c54091d7813a5de6e17fc488825cead46c992e737576e89fc07411e3e528bd0b344a3fdcfcf0e52cbe1f667d7c5a1506fda5ef7cb73005843a9387f05a30cc71d1ebc6aadb21045fc1d9a2f39b70c6e3f80075dd29dc0b45b8d72bda52ae21f24273717e79c7e351c225a012c7c32ba1c211b6b1972827c58df08fc1b95801b1521ff5844ea061591cd2d97a10b0a306e81bd1429105424a89e482454db95a423f53c70c202a022c904c81cd2c15b356585a1ccd65a576bf32b2b80353e8def8dae2dec69a32c5c095b4cedaf2a56e70f062126138c9f265c46bafff9a70ed7f0202f73975d3b95a756d7b863a55f5077a84d0d6c1474e62c12f12e64d839e0553a58947473fd32d584c598017301607e09421ae511fb717420a64566b818f0f1af415f7fe17721daa0ce032fc5034933eda371eb49b9bb0a3d9d454f7503d6bbf5df91d7b97fcf0ef8fe1806a838243bab7ae73ec04551a0b5fea718c873ed3fafd35d4a8ded0526fc1688394558c96592e30d94bdc924d778dfc6afb46bfc54d8b7607dbf330368d0880371e2e6369ab767d004b1ca828c825ef4319d16bf4536485893be41992550836ff8f6470887e3501b3eb5e5993c7f8cae51673508f934a2db426355031a91757f044db5b3036dff48aa714d274bed1691446f9a5f64e810f5d38c0e567040223b87435e681b91c2c95a1e9de9acd99e16e04d3793c207f09005988636551be87e49b641242cfbad07b0a093279b33504725ad217dca0942c340e92cb8ebf4dee24571369957c0153aa5f15730eded48338cf42bf22dfee3da951ecdcac02cec13f5908e2e6c04130e8465e2ba0aa8d5199c5ac04c40cad53c57baa213df7d853cbf4e62e816ffbed812b35627879a4fd3f113ba7786b81e9eda6f0639416e2189c0cc805d078079b5e3286456c9df4f50772fdae21461512ad5fc5e2f9c427a52003ba81d4118fe350b488c7cdc5e373c6d11d3061e23f0316da3da1076d607a44b83c2c31c7a852a6db1f92c7e45318f8a2551ca2273402aee0e8cb43473d4538bb1bae603a13931f96f94ff94dcd5aa70aff9a6f05b26a97fbc3b08f695085aff69cc9c388545f3d3fb1b9c273104787630e0536dd71eb2e9b2b6d38077de3f1f18a096a0984e4ae22e4cbe30a7c6863a00f93913daeb6df8f2828b2d36013d073b0adeff16ca149eb788429a76e56b4eef7e5c4e25ee4033635ccf809aaac5271ac1f4299c9f4e4e765c8891eeadfe7c49b464c2c5df4155b0668fee688ba9cf26e0fcbaa61849c0566bdd410ab236da05c4452a4fb722ba1553a4ca801b34521ae914748705cdb880e936af5d3d11b99f199776c44a640827529c44b62aa24492b48be4185c9b25c85faf80578d1962d15024b065623e3346857edad48b7bed1f1ab9428bcb077e5148d74a4bd72403cbc3642b71b15851a92f2ea8b88163101103d1c29a9eae527268012e706c3347f07d83148db972a1621399e9b1469f883649d28bb25525ab6125def46ce747e2b7849f3794da0564f0100e4339d0c8ea09728d10513f0cad36542017a512eab5fcb2ddde14a06efb395d9475e57c3245ca1b3356239f5142b74e8e548d24264879404cefd08234fbc90e56fa54540b622f7eeb7e3f1540ad580e1dde6f56a2d785a4bb922b0a732347a7ceb5792480376f31b2ed69dc2ef1e54323cdc98849de918993ed1bae4bb4b994852ff8953edb15190474822d6b0e569322fac57ae22e6bc0477b17790272cfdb426d6632e0582e6c534da8975e63f6e447699b7f0466a7598544ff3ed8662899b25ff85fee4512b3d8581112bb8e0ed367869c14c46c2d3e704fe2f6b3527ab2889f72db8e3b45617a2af174b7f5febc2c071b2d313195deae2188f7500bea7635699bc68bcc1e2e27d7a40eb6b506a14caf2985f33314e52d5713b3e628be36908a850fee34da0ab2c55202d2367f40dfb005780662dfe4f18d5c1154524303257cccbb520f9573562a1f8c91d9da8db67e8ec72ee0e41b7d7ee4d11b399cf4f6d7671cafca10483c74297271a3af7476d4d222b351dea9656d20da6fce986eb81cf4881ed8f1dfd62c2c91c32ba5940dad3676d40e282419a04c9c0e78bb89aa3ba74c1b8f0e9d0f5621fc093f4d8e2697adeba9f602847b64056db1d69a8089de1935e163d20bc7bc9c225e680e4be6a59c239993d746626d9dd3963a78362a304ac4b4645e3436c3367d2448f13427b8d423672a452dd6bf26fb4a5340f4dceefe06197c067090fedf12efc252367273e1516e7c5f98a5132ef1af5bd2cf761faf4a429d6537b4636a0774475dd21a58effa9ca6e049330bfaa332eca34039d225f0a7fa1c9807b441ac239368b58fd538d23b8cd3dd3fe1a9124bc1345e21cab7e49ec8fdb594ba0dd036da2d052fcc681f4e27661f28045d093ae2d4da90541285b012a6bf00325323218573a68003e25661d36ecfb89c6789f0d79b58be99920555be8ab3bb7fe0faccf660458c62b1f6744496cd953cda2948a475ebe192df915ee40338a13a0b30fe256bc01c2ad4762fb3b686f96c3181df93656c82c91ee266093a303365cd0f801f746c2891a1f509ea4b831ad9f3239332e4c16747b66f3a0fc4fd29c87826fd90ddfd03510fd071656444ec850134408ec525214d729f55e798ec9d9c83972cd944928a056e8dc489b4097d605bc3593afc45c083101b60efc298e128e4981481d300049a9255a037008730289c03e99b7604ace629de06752f2e3ecb8e52a97a949ca6cc66b3c3d78f4b468e3d6c52794588ecee6e32673165969acebc3aefc2f298df04e6ee7ebfa682ee808244dedd2422f486e4cd9595caa85af9e24d2207f12686d7c2d5491e7307c638307ec9e579b1368dad3fa014dc231f90a6e147bf5e6c26ce6c8b633c9d3e0b2f77f824de7592d566825ebd0236248bb93569ac581ff1baf3adfc97e5400e6a91517518d15bf33c69565a0b45ad63c626e4c3db66040a1cd59bfce7cc6d9284b65fdf2267891b460b01a0ad28b8f6907043f24dd6a0060d29683e890b70ff0597315e0b165447c9f63c15c10c733b44dc6d5e5d48bb389c85fdc24094252dd3e208e062bd2a8405729d8699efb9d06797d2798485fe79dbd5c4dd342188470fb02c9bc13c0899155d4336ad9b8dd9686048b801904bea85852388f84e7b03e17b88106c755916aa0f3c14158d8e5d57523d1e082e3dcd7f5f726f9c54ac36b80a37142ef3760b59f03fa591e45afd4759959d3da0a1dfc784ccd2c17f3798176c72ad101e1974500495863698d192604ac794ab6c4658dcc1e6119bbb5144cd513047d10864c85ae9802f7a97b5f0f75d7c242a4c631aa17cc74c1388f2a4852bd8ee8177e500155625dee8ec1944a8c9a12821af634c53ad95579bd20ea84fb57fbaaf21882ed5289a3b56012ae093a4ca817a3c76c8939f1e2be7088579c0138125a0205d32da3c76b473b4e950ea502dddd1ecbe92799e91062ca4cf99b170dd7a30f70cd3d44e46eb6e21bfc66250e810d557fd2888debe04e6d16fa679eebf4f38e4386937ca7ac25cf2e853a24dd54b37dd741a82943986623c8d034f05500819bfde90d766adad185f6b8ad52d3cbc66865f88b1ccf8d01e97f592c50897352143a0acd4990d7f2c0cc6c5e7553136338860e49c3350e75f5ac7d35a23b70b04d1b3651676d3d544801a6bf76d94aecc6bf1ef6da657c5ddf40a8f730db8431f4eb0157f75b472583d353598a26fd98e118bf70e9ddf5bef293c20c7a395e44d019d8ae64f3915496f3adf15e43e860a282f618f4a944459d8f146724b42a6d161994e775c6da2ceeb7b54bf5b692bc12681497d543eb36619ab3bc3fcbb4b41d2df9193e12a85fc83c48a906f79bdcf35857b3904cd953d466dd0b335fc577b3c23e91947aabe6aff63c752dadc2be880fc312e56b03173ac50a016a8873a10bfac48bf485371813f16cb3f72543c269e6003ca0775d4dda97df082f106f86a05e47c18fb8983a20d5b6e12182eadcd3440df502db0b4792eea770600dbed890dcd6f4767fc95a0c0420e7dfd2f11aea0562f3c0074ac2b48b24611d73c85175bff9811b81a8bbb361ff35e0a4c157d4e874fe723ca02fbe1ce81dca56644002479361024992df002d100e995c4a1ba51a2784da336cc4c201a4898b769260fdbeddb4791ee06597f12e63a9585ef7d4a7fe0eec7bac313476c3c33055d1c4752111e2a45e6c22ce8e16b618aece2cf5e2a0c1a48ab726bfe1db183b99386bc4e418af4dea39c211e70107a45a423902939127d90b3bb6fc0f9f9a3fe187adbf447b2f1c06be7d4f411008f5880cebcaeb55d2d884fe5569957139fde0dacc922b9c52b6e1163f8740d344df3fa280816e74c15ccaa7e5b56b258cb4d0be74e55f854ae99de80d14d2d83570040f582d6b9c501076883a3588a151282116a267e1731a679e1b07fce8e57eac7a2672627c2d0b7df2c6bdc251e5e02af3eda1478f0b61d580219c20a6f7904dc21bc7c5bf7b82b5c06ef6d4509fa9eb45ca8abb2ccd5d5a4cd8a1227f027a5150e5a220082aee729a67c08af811e6a2b6915d348ee50001416b37835e3b16a4191545f03021fbe49172519f6fca828419459d8a8a140b34d3dd226d5b543765f998aaefe4e552d1168919c93e0d4b686f26cccf4d3c12254218b8dda9a64389e120966f1c01afa06cb12b56099e5491dd3ae59667225d82675c1dfba31d9fac454ea8f0c9c4df1218a523815c565712de9754b15428c393a0a723d27d745af576a315670b970202b76869794c6eab43f854e5961c54ea8016798eb1ce84789c2a4b0127e6f4a8e0c36c468d62fe42c6ef71c74f388bbcf1a4b5d9f5a626d33ea70690aa71c6565d58cb782ba761c0553e7a2bfdd8be2b3cae3b00786bf9c175393f9da83ccf06520e101e064081b7e623c64f4895db2e7999d42495a1a6c908a2ad93635e1d55df83349115262b95eb90815c38c4f7aa38523964a56297447ede8b3f1d834a1d5590d3f5c7ff49ac954b16a7970b9a33890950198cd4b253887b62a26803acf5ed2f819b8c34976789d0358ab6a4a8efc66244889767f6a83d95124f915c25b09abaa6b8a29ca219894ea4ad39adf7589a8c93ee4d8b8953d0d93600edaf2e350f3989b46d9511cb47f2c217be8370e001b64a0887e5c4145f951fe3246e7b4b648ad445c73f562979ff4560abbc6a806688ad89963964ca9d28ce39e2eef1827982f0deb78e3468da82694d314cb959abb5d0085bf11606b9518c75062db4b270e718ca380a79399121bfbf96f126bed0ed230c0647489d49885f0684df7cbf1272d35090164e0195edfadb3e484d1dccf895a8af5ccb5e7c2cb81c2e0e809394f212a3dfd2b97ee509f44f51355b12813b2056305343f7e821b6c3e17714bbe120b3f5210ecb0c5c8b570f1550edc01a5fc9ff294325d012da42207866a09319c34a580189f4e0e12454ce9616c147cb69c7810f0ffc73fcfa9769ef9ace841e006d4c6053c1740e6e8a66af25e26b392869cad5ba28904eb5e03cf1271875b4f905a41a25dc2847165abdf3b57c6e216116d20f44c7e72ad8aae8c3a03e331465fa1addb2327d3f63811b0e84f89e9ba843872e6802915b20b0c4c53a29889c54bf45114e600292df5137969fb5bc93eddad1083bca400a34ee13879252caf07034aadb899ba2859502bb8e96069b01523ea58281062a00801e2530d09897d411fffe0bf84c21c4d630198e7cab332e443d1c2c80668a898fa182807ecc91aa923e4aa65709f7f3a9c02b3d39a0b4220c68e2256bde8ed52d1bdbf9bc1aea3531ae8dda2f1464dcdc8f7426d554cea60681bc97c7f67ad5e578cb9a0aab42446e359c11d8a37061070068150b6f7990f5d729f4e02cabe8a90f1d91622f93eb45d6e9f13fd3eea48bad61d61e83a9115a827a63a44fba11e1bbdcd32f150f90216235f445b3e31e573edda1ca1d06715748fd33b55b8d1d182f5293078fc033d0c8fed04412e2d51a8237cafb691f1aa4b0f6771321fee828a6280660eccb781d3c818943a88b9390b1dd4bf7c94bda769f204417d929318ac8c7cf9674a3581313b01a90fa5323f8609db19ab9dca6032ecb874801e18526e61c61a9b2ec749a8cf92809630381963feff1abcfc1e6c2e9f5cb46b61f72b727af65595d1e3ccb6cfec7d18c012c81961d0ecabdde4b876af140e2d1b76fe3a1d321176f1b92c242f3e8d6ca66a445f11401b9d339a1959c7a968d999738f015dc84f0dbffe492215899db47f6ba830e76db8929b4a3e24a04ead2ceb6b28ca5ab657c246b7a9fb6702aac4d87aa63624259580f23b31a2dc8b5b4f50c71e2053d5cd53b3f779a1386694b70f1c89413cf9ff65ee85e5cb52420f8e5a5713d6a25f9cf8b06c14b2f824c68b8764237cd9fdf6508c6cd3dbdc1aa5ed9bf206402dc8980707280c649b3312cb241bd2fa4a22d67eb13159ac6a5a4e8308ed6d296fe8ba1a70583d9d903b2317c3da1f6b99942debbc65d7b8b44b74066e22826cf4c6d38efb6e4acf7d4be312daaecf0f2b77189674dbe2c1874bc6a43a21ce445f8ff803f9d054fadce55b24e32a72feafe2e2b550cdd4bf9ca58ea58c5f2fd2d101de70f9d563645164f465222058bfefbf4ea5586f7d28b55339b92646d76b6952bc8b0d7a08fff46d9cf396988cfd460b5c4783ba311606e3b8fe4cf431e628dcc2878cee3869c2d625b12096c44e7a7054b138876d3295c8359ffd2839c85e81ff7b6ec17f1d2ed35b303047bf0750756081d2042ddf674ed6b46bf1cb399fb888e32b41a034cfd6d3e701db1900a0d4dc6c384d5370676bd1e417261b97a5fdb068cb519502d15cdda944c5fb6ce6154414f83f6d83c38ac7122579b2501ea3ab379964a338730b63e883424eb12be3bc7617376652cd052fe54f257260761d7ce51342c750e3f54b45a7b72ceaccb9a41918382b167a6c7ee352c2f2c5d7352e8ae44d0c3ce3eecac507ea52057fc4d144e2729fd017135e6d5d33ccf56e2c0af94d8c8fbc7530cf28ae81c229ea1d16f7d593e9fda212ff141c44e0d1eef4d86f993b475c937bfad5e809381b30a8259a2d7fccf6a5a4e1d8ccc3476c87a7c33b1edad6484ebdf158690095d23f1cd2b0e8d8677b3bba9ed8cd515cdb4883c377281509ab6b0201f1ab21098c215e4bb9f80ab6c4f5859b28e128fd5ec9487a4c771a42e9986d1900e6b0b506c233fe779da7560837d57e02711711d4c9684128aab40ed25e0a3007f422c7f41785cc2cce9ed247587d5865c6ad10b64da503c8a7518ade9f3e25ac6365a613cc20485aed75f429bba5ce848367390b5ca1375ad7c0939483627b69459c512553028b42c522f633953ef8ee5ef86940aa67c6453a970569152e2628586798f241918d9ed0779a38add0ff0c392d465a8d481fb83393308ba46a80af963805c5f9dcb74497aecc2911460ea8813deae46ca408a497df20b33d01bb2fc392c4a6010713201c7af6174d4948c5352815edab6e47ea5e3c289d4b90b3b54b768bc3f56b96c78b863c080c8742151841afaf97f28029f4c597b454da825e38d649711a8d18028adbbf14eb7256c8c77aa0002767428ec06c39a267c3f28f22f95e357abe8bf5f402a37a07dc7aab27a51740b27cbd966efbade8b5dbbdfa51af2fa85799e7bb240e641475a11fab5fd951354249ca4e923bfa43a1860c7fe070e3ed2fd25e6e570135a0ba4f3a720a6ad2e69d4507a97647fc84b4b8a2dd11f9492ff03172b6d1a9c0630e7df8b1690f7f8bb7b0da0ced8e980f7803ce578acf3fbc87a4c1bcb7213df3377c6a14c3758462190216cb035f16436ff933e66fd5a1cb98c6b159ec904d9b21b216fcfce6cdc171c443a990792da56fdc3f9a38e45408d5a556648866c4be3ad08bf8b3532b24d2404287a0104df2c9e02d8fbb33412df51218dba7bb002782b2db17c95582b2da3b8393227ad0567b55d85e809ea47b65a75e5b37daf311db572fa4642f8660fd446dcf627a55efec5b5eaf19f6eadfbd9cac971de83572bd13ab97a0f46e21ac406d0cc4bcba0988c528f6dce865d3c260e904ef6722e74ef4b359e4d510b61a6290ce0b81ebca96e71b31d260aa10de8382a3ecc80fc801f0e20066c8fe40f9539e3d424cc418056322c4281c132946614ce418856222c4981c9b4e7a61acd7e57a914c6c1962148e8914a33026728c42311162148e8914a33026728c49b121a017c4f5224d2f8ef56ab05ecc881cb95de9185a6ab4ee81c67c8679d5824ab5f39febf0e7db374e8ef74771a68a2d17fe20c2d0debb5d4173ca75ecd4c934377eee54676647b02bbe13d5fe783dd9a92b1ff648ef53a323b62729eb752ca8d925c6bdfc9f39de62156f7f12bb89e25a77c4894d1c510aee812cd50114f977810df3da11ac5659c22c300f97ddaa7b7243528e14905e81c67f356699de2ef7a54d5c6fd5390177644f819af5722e41e5fc8a8808df6fd5e948d685442e5e24fce8af5925eba2c79ad81c929234f8326ce361b84f02248db0d4ff15df980c7f3f24e3d1aa73cab14e1e922ef69ae3bf9e75c7b598f47093e1a50e5f2ab99ea3715e85202382b84dbc11633e1ddfd0d51903b0fbc7dce8bd68a2afceb36eefd95dc98ae15907c5f886667979722fab4d3738174bb4ee7ef5eb40d1464c0912005c64315b77c4406f2658e7bd5f839194f49c96705ae0da7dadb3bca3a22e76e91699a82353cf30ba4e6ee3246a34b98e12a9b101689de8246dd5eb4c965b07b3559446872644a1e6556d86537dbeb575b1965f67beb0d38e58a7b705382b99ece24a0a7ba9b66e0e64c16e9cbe1ad7c79c4a75bd1b45b9f1ea9ff063382de6a739bb59ff2049e1f3257013abb8ae0a69d6b1d6036b9e57be46a0d2168a146beac7d1796294e97c3dcdb4fa32c74ccc78c0031aacebb8b28bd01a1868d5c57d04113cee08069306d28575dda50cd6bc6f598e2839063a8a5dbeb7b6cf72442c134f2422db0525af78194267c9ab0acc7fb87583f5335b67d72db9592f1f34281c17ba17e1118b0690a1b986264a77ab7066d79d7ad8da13f7c089e9dd33bbaee0267c3cf42bfa2eeba0e53ab6ac0179a2aeebcea580987e5fb7179df52b70c53d3ffe9c956100763a1bc7604b6c1520a49d7421bb4e2106e797849bccfb78981a97b505912037a1947614389889ec3a3eaa2e369dedd4ecba343d7e3aaacd5bec8667d7addc81a75a1255d875e00e4c4a8698c28c5ade384942d2fa38b4b24c446258a6317504fab86f1c675e57fb7af042ac15248c604c53c2b4f41cd39de742101d9a8a9b997e3c1ff223a83694540f4b347a0e3d0f9b0dd5d767ae8303064acacf2c611c139350dddb74932279e2e6b431c9d83a893a9c23a2b9b8f8693416d13982825e518cfe4d9247b6d2d3ee57bf3a6d9b686d71e8e5a1a06a61b0678a00e32f6cbdc2e9a16647a10683bad47260547d2fb4d6a8ebf8a1fe945a8fd661e55001e40bc19726d6cc40f04495f3a1331a260733cb1e6dd9e3f8db6e9cea7770054ff901507d557fad6f13e288d8080273181bbb09a31c3a31e12a4786d4df3fd404f9e7ae73f59ebddaecabe63e27b8fef07f0df997df9181030f928abed826039186b69cba9d27a26e7e6b855773ea7bb8d66b369557ef9e7e3dc43e56cee215462d4a857310538bc5411422c5fd69dcba08fc0760ea77a452d6a522352e63af6c35f049a33560007f4505675899c7e29e344aa6fc8a2f3ad9a474fa536969d259e6d72b89f15c188d3e9f61a217375260004a4934f41cee0e6718936e6d0d68a2ea3ff8cb895bcedce484fdb0e294332f39b0ec84cd459b4f4eb8454e0e69ca066bbe70328743647543be1c48c7d9f53d5ff138a3df5b654401f5e7c9dd8a55d5ff4061c1bd75f638944e81019f6715d2781cfb370fd4e3fea0c7d5344a3efa32404a5ae3533ee5babb63d6b334a14c269aa4ee286674b24accc5510e2bd65be0466e1669a7aac949984cfb3bdbbe76b5b62cd8a7e95a4bf52af2d8da548e38ea3321b6087e8db8361ffe5d2bd55b9606fbd6b58cc9a53990258cbf8a9e281ae0e1d68f09fe38a96da90f7059a4b927fe48c10a819c2b4afd561f20945a516f5d4184ac119403efc61204be353e544a56b93d43e111363b25b629b2477039af727ce489b9c5d5e6abec20c6d5864d30a33dac2947c1d77a4cf37e38608f301ab0cbdeee08f7523af5065f5b1d181f5d7b018c763c1bf33bbdfda4bb0c429f5b624f47c38683948588625e7bd29788d71fdf255dd127c2800be348c7f1279dbbc664a90b29be7d9e86a7a414d6fa422a6b94d592c658ae2d4c18b8b66b100d084bb89bd52460fb42e73561af2bab2842baac072bc92c1dd3b15654cfd890c9e2199649a82d3e016c6deb443153e6c8bd384b08516fae2c48b4363d5e4a39add5f7144939c7f87c0560328c09921089256004be775ccf8d992e034ff1f66aafff246d51634844434a282ce2a29efca86c2071ae41cee525786e13845e65b0a4ac476ce445d7e7c017af160695fcb8ed1219cd2a5de541e8af7e292905c7b69dd000bab3384b4cc096bc0d474729b04e797433bcc12ea3a87f54fa03ee1e89677c5490bf81cd14f11fd9763718db460a2ec6b32cfd74f9587a7ed42505b0c78573159139c0935272ef6232e4cf248cebce7277bb5e2d8b1311475597ea125d44f20747c34c47bef0ea6c328ab0fa3556ffefa635f8f9bf8100aa6f02e2246e230114ed462702952f8a597dff7136f28f145521504200ab71fbcc2a9a782c244d37a47e4ac74cc5bcd61df2fc517d508f8d73c22d09b072bbe8f1f198324a0a6cf39a7b8cc4690bec47cfc1fb79a6029834558a74032ec65d26157a52f62a40a5490e5fe9e6f21ec1bede91571b6ed14d8b68ff9d3d3c0e63fc67244e9d30b3abdf169a64d8e57927eae7430517686825aaef7bf46e7218c5c15ed7ef518a2e24f1624870ab132eb2cd09b0bbf7af31cdc3e1a09d4b8c961c635290574bcdb30a0bb3f4460bc5d1c1cc034e591d9e242b11dc648b943e908e945116dea80f79c5f108f83aee76d1bd6c6319b99d980fcfc352cf063ab62b5a186dc3873c8d5b2cebafc3374882558f6494605c0ecebe967fa3a8d0da9030a207d14d9ee9960ddf1a1623172d22b08330caefd039f3f1c28390d330d27030598533cc0ee5c03afda932dcb0e9d2262fbc470c8166b9e35afddd318f184215ce37d2e17ca8a199a6a02897d8173783f1a6217200962cb25c9e29f070e9c7db3c19abad35036e48fca67a745cbf6cb9e71ee90623c2c0d4dda96916437286889ffbb6fe4e1e5fa60a5d2ee5bf11c4d40775db0ff608fd1dbae38797daae5f31028b23ea587da2fdd77628a076c0af13fb9b08c26139aa2f32bfa09be6fafe21e6e80778a7bc5f0bd28e99796647d8e9124f5ffec4951e891fd1361d0975c4a900b3ea4779770cd7221d53fe5cad6580a494c57c7caccda9196368db5d37ab084dc24376db1f79a6d95edb143866a2db3962b1d15dab4ca64839bacbb605af4ea5940e2e3c0ae074a541de92a6ef6b316ca5e0deeef1889e3c42990ba891c0cbab1159a0b9bc07c7a116f0e91b43c340dade96d0d088ade85c0221c1dac80ec53de3b48989e45ba1ce90b86341728913c224a45a2709e1199376f2ed25e4543d3a10a451c2331648db4035684de2d8eed72e4e41675cbbb05a8340e8eddc77acaf9ced81bf7202f4e69db3ba3026497d175fbe1025ae85f5c0ac30f83591d3cfa7a1ed6036c2a0673fb38e4773d4f10e5b201253fd1a4a624548f994cb86185328dc7dca7693447e6075e346587993d0c4facec266a4db1e242415ce8dd8e4de1398ffd884563d98ec94bccaaa6e507b3c5a65d98984de09e1d4be5bdb42f31a2b078f57e0b60c0e4ecbcf7ad4d8cfaa2335ea8b62eb1ae257faa183e588da9da05ed14eec1a4f5d0c04e622f9a6a05efe75cc8a51bf11a0e72fc916cff4f561bd6a23967624e46c592889f79b546a94ac37a2f51219762de069df084411b51b0d6e151daa3ff040a7bd04e2818a82c9cf12168112e6c43a03334cd88e82fcce546ae4c685859ec7092cc866941777b30c7021912ce120e74a9f92204515e3d12156950f4a0c2b47719318de776d65599a3f1aebcf8b089a0427aa5e812da5c1b1b10da45589910c7732b9839f483384869a6310e6055c1e6c7421f0960f566d07a640c09441a0d302888898c436d4f412ba37c4c28eb6e299d17c8bbad56549df10f1636cd090acb8ee82cf1c92b77a364b27a136e418661517115d60fe0458109e17e189e83ca6c67749888e85e8e14f67e94615aef4d6bc69ec00c8f40dc4a3b63a23970c00c6aafd4e2ae57a25c00b7efcffc9d1a3fca5040b9b6d68ec99a29598e6c97d20fd015d11884810017fc32ddcdaf662c5c7e6f1209cdad672b2d5581b02a5ee53017d5dca311258a00b442b81f65650b3365c27003fdbdfb054365e954a16e9ca11502c7118cbd98bf344402c9216760e764ed96814988e32e582e059277ab4020579d01e5e82b594d2cba52af5f17a4ec0f0eb9cb5df7ba1bdbf41be52e85a8eb891d7ebc550700cccd210c0aa5104c54e93e19d672cf172b7c7fac750604b7911fa5f3b473016e1399d1dbe7beb10f8cd05092412c33fe3feb3d844d2704e5ebf5a2afc64a23686f001da7cb348d9ec013618bbd7e97c07bf27b289791ae351dc5641a30870eda193ef5ccb6dd52517b7a5ba3c7e25fdb096d48ab6db4c8a5b1d9d27bf62e6bd94a3529c54b9530fb26ac5492f5dbee046e88643b3cd0792de7f376a3a47cf9e53ffc5a78ad1f5f493b89fff44b79d434b7a3bd1155cefb2c1b8d392a937ce8b52d22bd77717994440f132d3773dae85d5a636009e1ba82b63114e913ff22f8126b6722d7c50fd2ddeb6a0005b084bfa5ca2f0336b9d891362842a461d5d1a9717ac731ad61bfc5514de773a81164d81d7fbc4dae92a43fc2f1ab3c2ba194e56f7f43a2a80e18d3d55b680b3a45761673a51b71277bf5b81f8b5fbe78e9c778eaa6e7f125c9210b98cdaef9c2712baf27dfdcb72f000761e88d810a988f3de7cff68853cdc7031fe9fe7a366e20c650c3c36cb0f29bf4ea3e6b9b688bc4fde7b7c1833b1bdc9acf90ec9a337dc1295deb5535492590d108f806747935c6b4d03659d3c519c36af4fd3783b4f482b4d562a0a4db1d6124cf64e72ec396008a2aa4a78d90d7e0fad4d43d3204da11eebd36b308cdd6882fd92cc792e236b00ad9fe23ea2e7845888a9fc2a17c32195cd68a4198b5f31f77721ef501ca97deebf1583ee8c42495d093c2aa00a003852dcfd49767c780bb3de7510fc98bc2625a924bbe7885891b592541dc95f679b185e24bbb035835c2c2175b2e663a2978e5828267995943d3416718a940d831c59e83ca863eccef60a1dd99fbe6f7831ec4433f618f54b681b693944b81b395bd14e7326d27ce3a419646e7e5f6413f1b21f7a8d1a5e91dc4d6eba2a6d375ee2a28f4574707ff9c3686d6892a70914eea2774c564d064e244c5cc92847eff7210b1038a5142e7bc7e0c0d42bd405920722850baf3243b039de4388721fa203709b389fb978584bb41bbb8991750f1eebfe5a7ccfac1d0352695075d5baf4d244a618ee8af9674dec6252cabe9a1dc5783f1a60d780e5536b0e7e5eb19bb0188557c4bc1e6caacbbcaa6ad815309dc59a10518355f2b450b50f49ca0e39a2322dc6aa8123efcd66cf5c575f502befe20a7a6f7125ef81708b822907192cc518e8d4be97fb4f65ef1a4016c9e8ead9ba9f6af22edbca5be62f12ea35a31c8f6444e0c590ee58a1b397eeb0d851245234e6d18c5ab621da33456c042d4342a62f245315df90826ec4e2a156b850c7e1c2113ad5f2ba292cf3a5f2884115a3932e23c181e8b0c4346d6504305543cfb8bcf58a1cb5c417f800e3880d6baad05a5eea20a8d719a929f1ac716f285e1d75fff2257f83289ee42c91168fb808a6cef23dc78ba4ff8aaaf7a249247bf88ba52d411ab189439205a981ec7e577f83834aa71dc148a3165404436999f29a4404b3e12eaf9cb993f9ecc8b2c5ae0bd0e023b9fb893da5aeba67b84ad6095814540cf15b65615ea29930480eeb516159e86267a58f3bd0495800d06122a5fd97d742a10b7a1830f8fea29f9c3ae5adbcac0ca26a3d32513c0d8709dd564363be5daab3fbe12a8e921287a0d1e7104298da042eb3269ae29548542b21488bd5254220eb6eda2c8fda1b7fff800ebe44a8dbe391164c9a905a71d3b1fd2ce0aded407e3ee3fdce58f5798a13fd27530c6d68989d6699d3a1b078499928eb0c9602923a350c7348a0d799f89f57e53946868f4ebd19bfdeeb97202a7dcea27984e4064dc6f23f055533bb29bb051d4de19b2cab87677ce376e01e1ca89f2ccaf24dcc53ef3ad708d8e78f9f7be5312283cc846b59634483c2f2326c821be7d1346002b4a2c5eac3b6b7a02834e81367edc1e3823a9a54d2fc99f8daf612feebc80f3463123d73873f4c2482425a9f5ce5be3e98472a7c342515e028a449f4afff0b773db11527c94c09b87d83bffe194de27d8012938db22956a8c1d0237d8134126de76593b0a7c64a70e35250fbca2b2cfa300e481b76a22686c2ddf2706d1f9a5d4d4c1858447c9345669cc8a22090363a0434900ebb22230ea22f7322dd938da8554be87a9d1aa1842140afb71fa3f0f04bc36ffb2186ec08a93bd0f91960800d3cc6a411cc9eeecc04e8ee4299a83433ce84c41a6d08aa1b1c69ba3f675a096441ed82f9c70bb88513400148de36110f6a7525c3818d38c3e62cc974a3a8baf916c7a6fd437ea547706ce829400bca79a44d5bd5902877f6c5077458d5b0d1270b1d1bb47dad4a8de1685fa5c16b1ce50d34850d7e59196c9bcecb3595e077e70dbf504c5ff83d3f1b0941e7efbb86c5a96f5a0fd8d4ae9fcba9c61ba45a9adb8b9b3bcb5a0fa8c4e98da62c74d336b41e00c023d76116223b718d800262226dfb1068c9bd853313805d19866be2082a4338195520715bacd06f3f53d65991126264ae05718f7463fa2d819d81ffd5996c6b9fa87ba7c2730de07cd541ddaf2ee89e29bb1d675b0208d7dae8bca4bef6096eedb9ca6ec2e9c544bb253284dd547470dc9038edeb3e130106d58c3956c2384ccdfa49016e5f9cbcbd419f73665bbbbb7d70af3b36aebe9d986a9adc5bc0330b727eae3343a3f3913492dcc9e9a61052372743af800082cd296ea5ea352177c3d737c8d8315e48651a7ddafe7ea0aeadb3cf0e2ac92ea532a161391e5cc1fce6e559a738fb4b171820b194801c54ed45efd59910af2ccea502df8e2ddc52254f379558b0924ccbfff08cd55793bb37d93db12bfacb43606b3404570d9efbbd862e9ffd4620d36c2bfa05993e63b902c3275560909d6d0551a60e46a41f235cadf9c7290797022c49c030570691af799a92487153f30f520ba20c0e8c1eb308dbcc304d2f53644b37bbc165bfcd650c07fb22d7c758b551fb0610dc30c7a6b5ab20b8caea5713bd7fac6450df39f74c403c5f800c0e14dd87e38f19266d5eb364170249668bf1ec42a8cdd6b6cf2e10859ddac6d985d385a76d3bbbf0dab6b5edb30b4461a7b67176e174e169dbce2ebcde362ca5818c8c875d1a0ea9312c3d23a57911765826fb16b9855d6eaa7ad8deb0cb7fb41916023d4560c7bedc31fd60261fdaf25c9f178d9b9838932b2f737f8b620253cc552f8b68bc229602349281dd09fef302eaf87fcbc8e0b72caf2e678c6ee1455a26a4557f31368e37aebd13fbd2132f50250f1083b45016605a553c9d6cabe64e0b162b6d443ce489a0674763df09bdacd320fb8fbe6565d8a5f1ec08b92245a891ac2062fe7c7e51cde8927a460dd92f2481fba583196ff9fad2e0b618ef563d2cde6cc089de7c1cfc1ef49dc6b8ec19c53ae100c2ab79b6e4461fc75d19e03e7b335168cf0d9a460366c64da54921f6a5e28aa518643056f9021c99aee93ac9466794083bda0710388e29c68c879816ba8c3a61cc9c215473519f4a91c8438251f800d4fbd3f2fc693d1630019fe557aacf250b5ea700d634789982d8d3c07d0e644f02b19c892b5a6cd0d413dc5f041d6784574adb226ee20af2485fd58bcf309596277f7d4688a846e39eb58a4b764355ef55441bb1d975c211e1a470923c4700c3d91c102c0c7b3a8137fbb3fbddb04a538c2a0e5956ac5985a732e41b6ad39e7038d49c01cd7e1779a19b67e5d4d1de220da2799a1ad938a09e9de00554a8923fd40a6fd49f4371077be959e23eb014087b91a0a700041a3f8a43464504c67cce61787c28f114f3cb57b2515ea6859ae443e4c8a1cb694121299c618cb416f77d0b9ee6441c964a62fc89229a9c000c99627aa1827dc077b408ae7a68e112f5e4ada90e1c38c0644469e0feb75902a5d77a934d28c4f890e6d8ea9d033a822fd787fc6654a2f0d5a6dad60d4a2da4e56116a6566bd29c93d0d4e45189550fec55f1825b00ff366b90fac414cd895454dddbde50098b72b920992c57dd76d0d19b21977f4d555e795454a89a00436b14c4661079b43d14b0367b4127bee184179076e077378be9020b15267d87eb255effb0eb72bd71c390a653cb5c65f3e1034cd2c4f3e0f1064f8e19899c9a70e9470c0d1d5383d71b5eb8fefa12678cc183c1c29ec463de9f94e6fb5e15a0a3d43619b29319f05e9567a125138d3787f646f49081d9c0dfeadefe89f26e3f024109fd036b16563b0fb5bb29694d3b17f54633d9903d97c34857bc756be94ae91b49d312c82612f427ce06f6f1f762deef4249a26a364df8ff63886f04d689b6888eb9a6fc5a641e52c304705f4c80d5a3a58433044b00c989904fc8d878bb2a2b20150f03cb2b6838181d69f07a95038c016c40dbf1117c5d4871c41a6400e5b7440087fdb5dac9f4ed0416e0718003cb48d8c459e8040d0c77a88262f3ffb3df098bd6c181ba292efc4780b511db806540ae3c4b4e5f73946d9a02a984016080a0f0e270d00517044135aee934632245da84a9be80a9d8b0c71c93ca4af34c99fde7a507d383f9afde024c3af372fac2cbffc1670b1304e0e8210a097eb7d0228fce12e608e1d1431412fc6ea1459ed0b0e025a64f6855c8b97ec0452bb7b5cb92827148af7090de954ebbafa647a6b8c0059ce6a0b7a8abd9b5b3e19a63914a2ea1e91b58bc639d224d29adb492ad3320ab54139e15592c2b043f54ad4ea8d8e57d07c4e2e990e8c0f431787c23e226ccde37832e9ea73c31f86be92740c223a5b4478cea0e24b0d2e06962949af8dd2991e3425895a44ac6e9b42162a881ae06820110c6c131009a2970c64131039e3170864131019a3150e6c131019e31be39f051ccb762c2d7bef9ecbb7bb4d7f51709de1ac27c2760cfe846286f5f1b6790c5aa23e69b6339f8cfcbbf7d04355d8e0132e614b748fdff5637634eaaca9cce6ca900fcd0238098ab283417b7e7387c3bcaaf5ae07cdc1ae3e0ad30376b8173716b8c83b7c2dcac05cec5ad310e2e2d04b156099ad8d4b23d02dd3bb00fde9948993d1e1888cb73b724be96625912e86cdb050c574e686268af834844cee803add9e3873780abc17d3cffff363ceec814e0fca50f7721c9d34caa153586f5f3c16fac12716e2602d3fb44839fa737d77e195a39b78f765e68754fd333d70009535a823a0701950ce70d64bb0a6a25b8649da44e478bbe61e8d4ab023f1b1258a6fbc0ebb82b3b5f1f6b75e4825d5634a29d9f2e52f79a67aa8c97d6838aef9c3b5251453ba10c84a19d764024bd6b778f74020cac974f8c640b2c2b46dea6cd412c8b0dbd02068d415a427638bfd3b40cf42eb70596d548b059ffd826f08bb0f269d82d068e82a68faf3ba613cf6a49aa2920b12331e0fae32e6726cf39661cd5a431b070a6093be13273508085a359ae0c70d31284640f8cb8527dfe7a548820f8d98b82676e4ef6a9fff3e0c3d6d5608b4d4f0982df1d37ba62b07adaf0168e18a6ae99769c3c2b320f47ecae2bb47354b0480aa1dbe611c55b40a972f55512c5a3fefcd10a0092b4523dbf5c76bd4a6d6101d1a2a4f55f2e9ba0f6d9425647a7300b5767a549f2199e3e83357411a442c2c7bab1deddcfb3464a56449cba7dcd51baf59d7e5d2859cfeeb334beffffe8856ff0ca14a265f111743839b5c33a408e815a65619638e0e33e63f1ec6b403da279c4cf8353ad7b4134857d35a25615aac85e41bbd9cf34f1d718d4b840132103f530bddf40c8efa897a20fa980773e12ae9e00c030e416c37242a3842fccfa8730131b9ced6e8ba8687141798607e6cfd9c544e97e34d0cb443a91099efa95bad840f4d115a311f328ea9c36e09899d60cae4a7ebde3ebbbf1e3345f6bed10ae418495aa0b2944d674a989320441af1d070fc5093430c23f32701ffada1092393da1269f29ab3f16fb2c74d4a29c58a12bcf5427f4fa4845a2176c38cc46da50a717f46a4f424a3d1503e3ee59519af7d61c4da863d7d0212d56eaee28899b6b6321a767c2a07f65e45a3c244850aafe005acfba812da09529960d6d94fe90b3fea0e6850c45ea7e46f625970d93c372317f700962eda4ba3efbc7aefa5079de634c198f145c47819d8d0bb5e7c320181a7ae4c8a7c8dcdaa9bdf7378d27a826f5cd9beb0890002f0c3774e74dff37673080fc7e48a5058a365cf521e96f44e491b994a4f8813e59a6142e4528f2b22a670515938837ccb391c592913587ae1faf2121e9b070d98edc3aed74c0978a8226602ff6ebe07de1572ab6f44855ce740c24cf92f8d83aad6b2cdd7cbac967e28a4df70503d35d484ed12cde84f06b202f1d900b5344bb0e946b3841ff68ac9f1bc46d23c3bd8932471c34325f6d23d44a796dff13ccf92f63835ee6858f2c77a18fc3852857b83d83606a3a2f67bd8145b0b81e568acaf0318830cbbe108bdea53a5ca1a08413915acab4cb7b8383b1e9e736ac8fb37b5c0734767240e8f5b989d5faf9c4ad66eb44a43e37014fbf9ff0d20c9d80d1f7262ef4ebb800716f8d823bf7f5f6beaa9c7d08f60f2a0e4a05fc080f7af996ca03857766582846013f90470f4a5b579873794440c119c82c440a7cf37e7ba7d7854155709164b8484c174be8826da9d99a72e7e2bb44cd2b28d175b659df943145d2123e535f5e6457fdf0d3f554e0c21688a3482a413a3905268843ebceb25f67edb7d3dce03d1ccdd6c9445f7d52b92b4aa1ae0e9b623e5178b99e27cbb3afd951dc5b93c06d7ae2b9cb8c03f1de0737041cbf405ff4e08cfb25bbb74632ef96ba99c68700e34883c2c74bf2515321503042696a80abdc1f663879b8f484c477e0480ef297781dee73d198810ae57676e0b17741cc34128da32bd5923b02a1dc3e0d2281493dafb48743ace40fb7205472642ea9ef2b93478eb8b81f2c716b917b529f18f2d4f4ade124eb27d5dafa7f56da9e87120b7877f0416a8013ad84b0fbfb877a347bd867a45904abbc8b4b8d704f4c79d185c9b5deb0e85e8fe57f8a881c4c8c25c65b2ff3b2d47ceebf1b80363c6023e0fdfc87af0cd2fb110d0ad0680091c61b4559480ce237e10017817ca9a003f522e9ca5ccaa4f5eeac7110617bb1e41c5701c4029fc39be46675c64fbf14221a67ec820f390723ebdcb3b291b6b3245fa210219ff238cdedd4bdb67cb286050370c34837e3376f3e923c1e3d72567893118a1448af0dcbde8c91b3d1eb0526d3367bdcbe4f70f1b88e0fab9e8202252680f017392ee3524e963ed3e5107372b6c86c839afa2705dca250d3032abf05623995782ee3ced2ed51f93f436617c297e6f36df53ee4c041614d5f0518608081c668b1cc429eab83600b285c081286f5d96d81a85ed2a671c7dafe11804f821eddb40edd5bdad3007c1bf81b58573d9a55d30f3167b2b33973a392892def55d798ff3ebaeadb2ed1e4aa1dabb574b79c0aa883d0a6e276bcfd868812209ac77ada9c02693a06644a77985c24e5739ff9473aeae6e90d66e1f30ad18f2cfb3e1a55cf2c608f7dd907ae908a698415a27eb27bf5112b06d3e29390183b4d0e10276a75c0988788f840db376b705781940ccc32003e86ce1759671ac999a8d33afc26aa35599833986042c9bd89039f6a46b73078b3c6b38d522be1121becbe81d666bc00ae23ec6e4e40873ad458cbebdfa9bb99bdb3d3a36940c860e022dc7b060ac0de7718f9cbb4308fc5d913e8171c6e052fc173d1b40340e5f74f730e655463c58678999d48b76acf01e2705d9c6e224b5cd7b7227d303ee42aca0364e50fc35502fe3e53176ffca7c72ebd0818def39ac75e55632523509f9ad545dd6749d96c0adf87a8e074337e70b281e4a7ab9b42927a9c394e1d17405ac2ddface1d9d7ced5e2870b1cf772a82fb58c893a55e8db1a022d6010cbee762713b1acf53814555d29313acc41dc3427e5b69f01ec41046b8108b5f260a7c333d02be36d4cdfe0cb852c2adabf3fc404ec6774a7c610f5b0d99aa517593b7546d05aa6f8d0238c58317daa9f7b11a74f2df80ff6a091fd0dd29c060ccab0197f07602d64e3876f4374222f649ccf5908602ab8738152824b1aedd1f79d6ca0e31585c2ae261454635180de13b1d78b83cb8c40ba15d6bdc51158c4929854cd6b8fed251087b9a70de7a1c757be64cb02783c1c5960e926d4839c509354320b24c4df86e4f266bc1d3016e3de72ab01e8d5f5a435a5930251208c6b9c7c50d27648408625a82d7eacc9833ebcc88ca1aa130434db2880b4773a185b0c0d3bda6b24a178fa2b8a19c2e293fb5fbe0acbb07a3037e989d42c5b9fae05f39c6a72bf7b1f2d5fe7550b2e7346cd4fa4a98296028ff3b853100662c6f8a6ec96702887203417f3bff2974360c5da352f897f5c4a811292ca032e984d9c6ec9f6ecd8fde9cf9ad5f3c61c794416dd9b8988e3259184d6e6bf1d0208589efa7e119f672d8bc44e9a7e3aa55afdedaa9fffe15dc0326e988409709c8b693438b335a36651f22fb913512febef8e63b854702531c71f8b70cbf57d88ce7ee33c8341a08851a59abb9ff663668b48b0d8486f98722d44cf728e460357a1844cf4f0facf355a655c995a634565a93947cbffe2c1df6f5730adbaf4fd37561b750f3c7a4889085a06506217adf4f1a5be9c22b730378a0c07c2729c4f65f6e64eaa773828395ee91320da0c792ba7e16598a5b79b58da06b1e7d8c42657ff9137af5cd5eee297578abe530c356a3e8195ae9e1853a93d6f6965de5dca7922b5567bbca0d713d3196c5d6a43bcaa36bc6d561e0ec4814237ed8d8ded38f72fedf569e04afc2251a619d9c559249fdad5463a2f45586a0cbc2a33090cf25d566ea52f5b8b9be4bae3de13cc1e40286648a5fb8c4ace6bb32e80daadc6da9e280d5518f27f06e8d34a1b7e9922d0700eecf87409563b24914ef13f2dbff90c333af30dd0f6122a9bb747f01f7390a6cd4051eb8260b8606db2d8ec00a960cc615e18fc952f21f773254d94637ca9ce3a371a46c1dbfaef7e3235810c8944877650b922f0bf2ffa66391abcc9901c95fb60dd2212de8523fa18b13e8064b7d5098846905af08b38e2aa0360883612538d3384032d05de32fe1886cbeb2841fe8d8bd1d230e6d514fb0e04fdc8619167e6053caae3c703372ce58820983d249428e28cc8b47687749e8bf44c3a3ef6b70632dc0ad842856e80310c3531950e400466e35f7c91cdb711a4563511109ca3a742e9beaaa777b6c16295ca7595e7ff5603446f4d8c30a51b9b6073c30b6ba8dbfd1912c94ecac39abb47b146273a61a938b24819acc08550d48647852ea206d3d96399b6c2b1a767b83ecd35b5fce52106185e03813a853f3748d89d6cfbb5fcc70af9f6e52c56f3dd9741740aed76965cb94692e18c3454aaa94bc5871a2e93c203d1e67ff7445f1594efc0ca86a7cd26985d44bdc093e29a953023fe17ed29cc26da50153507ed80eb54dd9ea756faf097970b2920100f71761a403fcb2fa5a9282479a69ccce015301402c8df89e8d2d4f6a55e684998f7dbac2b97df8837cbc84022178b93f7d014006c494ce7eb5b56771e47e0da8af608cf1123420c86b717b672cfeebe12fe57a8474bd55f67f20a253a53270d66be202e5d0b2291eae95443e035e30ba08e60b2e9ff390ebe67ec3e6dc70d907ac08e650b64cac197454d6ae34b1a0dad0a78459dc4421ab61694081ae748a68e38cee873a0d029eb364e8ada51072d9b6b1c208d08dea48bd1190f81ec7456f8ca69081631b67f28f97d5401d9975cca8e33d590b3bc0334540e6212ebb890f250f1bfe39e47b01cecf05f17e0ba2a417e47b7cea42fcbf3e7d1b45fee3798bf41bb20cd67bcef9bef4820a79a4e331ad5f5ec74939c6836b7b6bfca3f329a3d6adf6ecfaea5a39417d0524f95db13654bb50011de46f930b637f9b3672ad63983f7b679e38b227d39923d122f2338a7cf1f8d46eb14aafd8159b1775a7cace31299797421291a9cdf394decefe1e44415ddc8d6acdeb293bcc122eadb1f14254334f9c3669fc739416eb202aa2902a7af4e3111ec80017e1d2cf6e1cd8f920f6bfbcb3f9070b3bad13eb060d9fe0dced5f6ffa35d4c79760d7ab8a714b18d551608587dba349603e67047612eba2cc4be8ad817037350d94258afa38ce8aae081e661f51db51435633f80d573b41966482b46a7dd760500c115a889010e90e51100d967bec0cd3f4e445e6c6bf4b5f7d7437b0d4c8a9e376f8f068e1d2d71123fdda1d1dc222fa33141a36bc9e1bd87c8365e5396fb5b0551e4bdcd065fca7c7e522a538e8d1b4f172898f3623775658e2e53eec81a70f8eee4b627c7ad3fec22a5754385815ea2a00466b8eb40d009d85a730dd7e5b6f46ceee0f7233025d6d0fc4687ee2c23baf2b7916fd315a157d2dcae6b2e80d49ea625762e7a2685d2eb735491aa803a727e57b3c294319fb2f6ee8c67ee7659a8181bacf3e4d12bbda326d73644a6bbb64e16644b485fceedf792c57331853a9967b67608a7a17d6c5c860f1c8dc750818c0845a94fda3f1297a8d253eab459370c12657441b2b682a800cd4da4c64e4fe2a48122019a0841b81500b2245e363e6b95dfb019620df724ce62bdc9b2f4c531a66c673ba8c635079ade8feff6058ef57b0d7972728a663c57392168b68eab9ef7ba1d627a47d508da8322576eed774fc5c0564ac0f061a1bfee4bc8fe61408dd51418580fe84cdfa177f59080146495ce70be104a9d853babd07819064b37db58ecfbb438930dfd61cc6123d90018da13373a2828da38a0b42e733a3801904d9842f443919b8f37ef71851f24265ae5df1b2627e983b994d5ab797910b9d418416ca24124c18449cf777fa08871c83a6a565ce1d3de9b468f4c7a29e004c3fb024d0be6707a3d5b8d3fd45996745ab59226a2862411bc48673d5b1dc7c42e7a5f7dc1cf3f5547ca5dd92ce7aa082dfd987621bf8817825499e598f202a6cd840e6f3c9a49751ca4470f39bfae51f90db718f4b67ed50e8f914d631d4c3f4491ecfcfe6a6257a9bf46ccdc5c78160af59b1e61eb14fecbac0c66d829ab9cd6fb3d301750a63ebd3c7d8e049ccab6dfbc907b50854a8603a12ab4cbf643fc4a7a24d9e397ceacb1ecfb2a1428889822f76167bf62ec7e81b26388066dd760077b77ea503e2a96eeadb71faf6bef8416c124f46d6f1f0bbf23a13f890f4d7400725813f8909a74a73f5b6e7e1e280ee014e697ebbcd62a7d6d14616902807781aa65680dfd2868782b31e0fadd68c184d5d6c57f5d11436a8555dbc9627651869ea6d796f057855c862a74dd8dfe66a5dd3daa0f5d8794dfc970bbec34f2407c80d5a82735b8a44622b3b8c0671b467909fbf8a6385a15a01cfd4838f0d9a3dfa87a7030379a52d178fa8137b15a2d1ca315193529b83852e595c9cb99bb338e3f3c3132ebc03dc9323faaa9b92407578d5ee6aeadead3cf23b2f71dc68cafcad3787651cf4eebba5a234d90ef47819b74755a2e083a6f91573c2d59588968c3b5a84387ec5e498defea88be3020fb4077233ed54d0f87c467cf304d3b94c840b9de46c335963a6bf7cf775ee24d71f79359439679dccdd547f1ea773600e30b57bd12b874a846b2659f35987ab8f8e8e3e35dbd0d336aa809cc52b8f8e2919af30b79a6a1890e57dcb4054dac5bc9e37861c2647b379192f09182f3d37e5aa409796cc945a3fa028e016a09a37b514f2b53c37f0c96377605338219d67c122d269276b02f233291277e67d05c21f1895f5400a60b15d81fa75a03dfebf836868333d22787ea7f2131d8cd318a48641739982ec2dcff25e30d4669f18e98d3cf95af1e7b1677e6c0f6407aae0acdfce4cf0d57c809ad3c0fdb06f2fe9593101b7d1cc2481301fe2c1a88555e229c167e924d6284d983f39de3b05e6c5c789f14b252b8077c684f991595ceb633ae5cc53f80cc58877b97b17a0874b43877961093fe3d6a6b39110cc4bcae803e8bea134c163c8702f6073ac539478a09c784265fdc6257a9b2b84d169856422a4688909152d88ef04f2436a34c33f1a8d2da41864c1a05ed6c29c5d28f2f28072c6eb1930b589c63b9aa45b67d44c07d9c560fc8f0041952ed27932d4360210857430b1d8347ba59b2f5d579882dcce666407cae64ed9247ae3e2cc79bebcb5893665cd8a7448cf3ab7108e971fe31f87d1b0ba939847611e4619c53d3ba3fac5d6b71efca6b50ab58e474c90630b9db80829e6f845e343e3d81a9e459ee573a24c63371ac57ac79bbbd2273592bdf33d6c1e2c9fd172cdc98710605b045d3d5aa3390907f4f189432ea2f2609a27edcbb5110c0ae43803e1d5d2992cae6d4b3cfcc57a3986510139ce0ca9a1abacc18b9a1099d4ce6f4433a65d39db841889e09907db8d5ee77129e50ebe4bec32981638faa35264686a052226cfed09c31a7e9bc4a2818c007c0bcd79b3189c3db1b779926b0b63fcb52d752fc2df3f0f8ffc6fba2b71c1a37b908a1dc518aa517404ccd4273f926b41a8d3813804f35641a934423075dd1fdd401da83c96fb5f021e64ac03faedba9958205a55710e191591500ea913b0f75880c3b762389351c57641e518965f2889c369b76114e0e4864723dd4e2a5702317ec3581a64866168eaee2b746551e4553c0d82c012c72092fcb77f55af2d3ed7767777f796524a29033809b409b409645068e43deaa63963ece9421c139e6e5fd2c8c3e5f6757d4fbc83d376ee8b5dd79a73cee95661ef1e955b23615cd5497cb412219ecf1021bb265171b5a83eef2c93d7868376545b273171e68e30d6155b18b42f1eadb5b6565b6dc53b382b38662f972338ab46ba33cfaf7b4035a78a7b0326b9b1eb534c41051555549144c9ea647b289824745ab77941e0f77940406190368176fddaf5cbf1f5d0f8e6f3ea20097af53145b551746a8f1e99ff64837f82d8fbc090cc6fdaa348e63ff73892f9cd3d96a53d9664fe72937b34c9fce31e4f32bfb82b2d7fb8c13d9ec8fcdf1e51647e6f8f27647ebdc714dea38a64a1a44eaaeaac31d7ed795ba8e0cc7b059638b067ff5c1c3ff43461708277c6dad561bbfa984b25a8af070573083dce21d15e9cb5f781a1389265c93c4d2627d4490a4595b262bd607e3b0ababd5c2dd62ac5df857141dae84885923a419d1e6d599c971484712713d3e9a12a66a924555656b84f97448edf0a4b8a75f4a5dae0d10e7347a91de67810e65076aa25b56baee6bcb23da9014ee7c479b3078aacd2349d4e5eb56abd56bc0a8b4bea123343ca6a5a90b71b748742a25b94a4d3e9743a9cbb5da3dbed76bb5d24474849bb97abc55ae572b95c2ee5a65a314325817677de543f8e4b2f90aec808c9914ea7d3e974381c0e87c3e1a3dc0dcae572b9dc1dca5da2abbb452a149d4ea7d3a570381c0e7782cae572b91ccccd49678bac1192239c4e87c3e170381c3e4ac24747f7e24e26261c0e87c39df8081fe1239306c7c4e240a0203b94f341a7d3e9743a1c8e5d1c0e87c3d9226b64911c2199259d4ea7d395381c0e87235bb830f98077f696939292703a9d4e67816c901db2394b448e3a9d4ea71371724e198873ea54453909c7d2d45da53a4f10e94c52f90d3cc59cf4793949e7249c93720e899d385f9026a0f31aedeb3a48664bef1d71aa11c6d508446dbef54eb9b5d191d3ba4d1bedebe38b52dd29773d72c22877f53106798deeec64571fc5b0448edeadc619c69c6bb5155b9545c26822715e1f3d4f7b682d8105fa2c52ce21a8b1d6e5f08dadc2438d848be0a21b82b888cee9208c873618dacf668b6dae8a7ba39bd0b910d5397c243f2ebae93d731817b9a9c645886a8efd61936c5a073be7eeecf38c23f45c337953fbe19e184d169ce1676482a74ed237ac3a1d14513b53b9edb2b8cdfbdc26aab8adc4b23331e6b655cee8751c81c0372f9e638ee2e2ab97d15d468fe9dc15173fc5474dea2ed4990a5d4159d00f55115116eab3448a23e13415959b2359bfafac6151d449ba0b75b6e2d93d16b76930ec3c0615b76933b0dce65d20c56d5e06b6b7819d3da09d45bb7b4e5174d1343d34ad9b5ecd746fa9502709ae8c0e82199735d34d6ffc5454549c15963a54ae22ba698ede43f453e3a4a49b7a2b3efaa7429d649a8ee688b27c74b1d4a1721305b223fae9e4f83849446d26eae297cbb236963bb6471cc7511cb128beeca6620aeb6b1d5de56b4d531b8c3d3acbd73afaa87a9c2a45eca5d8a38fa6ab1ee7a6a3dbdc7404c1d1b3df233a296b25e4288e1e963571343d6f13b519b159de66378ba9e23ac91b7267e30acacaca8a9b6fa2b29b9a28ce4d73cda4d7272e507467d90623c5457267367db43378b27cdde4a36e1afaca076185627e3e8fdd2ad406204014d406dace8c1443455b56bdada9e92c9f6b3afaf72059d3d1597f56544d478fbdaac6461fc731db9acd9a79f737a444ae899f9b4fd0ede6f399a04b8f2059efad48ee355f6ecb1acc6dd8172a9ebd061c75c61243b9a04014ca5954409798699a1a54691157b86ff7f189dbcf16ddf7789ad2344d5b5a3c5dc1c2e23a77a672bbf9fc802c207a45d3479d3b9ab4ca8a8f1f913b63f1ecdfd0bd897976f0ce44c749541eef7237967dc55f2227749ee9d955743e0288ac81bc829d4b906f1903f9a6a2926f2af9a6e236d55e9157b88a631616f276f3f9014d14751d6e9afeb7682bf16e9ecf9d8978e5e66e9a7d85ce9d99a84dc54f2aa8d5c069c3597996c7494ea4cb4decc56de14c7fa1a6f905d562a8b1ec19fd00900baa8118ba64e79c6467b2dbeeae5ea831d96d3aa9866f31b300db72c7c431d11ea6bff7c03b9c0445568db38ab3a0b8ed16d95b90272249e52b7aaba04020916f482a9ec395a71ca9f4914a05d549fa88c572501ffdcbd1c7e1b1db51183fd64a26e9247aa795dcd335b9a67b6323fbfce072d449a08916e9a4179a6f3aa916ddf4187659eb249d44efbe13bbf2b6e9a494b7a1c27c43c99e7a1b79f2365576d407f1e19836f00935292a43928fe5be78c2994de74d413283537c99049b30d6b1d6abc1f2466cebdc14df59ce3abb5fbb25707364bf2ccf5537c57ed1d6a7511aa02b118aa1185ea0db69bb44bc4ba4e6b8a0e658c79e12397b36ecc0e10a21c9b1846de9e692ad67db40e2ac37a571673037cd36d2d45da53acf2272c9c9fad0943c830ece4561b49ea6ee2a8cddcb169cd62bcef5c630089ea74ae58e821883605963eecd472ce8775685a831d66f0d8d796a8eb515e8a63c35a71eed1e6e9a1dbf888350dc2d4d2938470f6b8c9ec4c5652d743305a7ad52613db3aa1412e0b9d6e77ac6e1662970b8327f307b0a93336a3b796a8c759bfb5830e2120c8f10307ce5de98634512d69aa4f33ea623e134135da254e2921035e76e6fc4ad7705e11b1b38861d3c4f95a71a0ddad8f33c8c51242277e82ae162f43cd206bea9b35a648bb0b548f67895286b1e6a267189dc19e8dee79e83fff928faf7361fb26d897ca0879f77e92ba13db45f226378fa906dcfcf12c7490c9410833ba4356aebd9ae1f93dedb78ecee91f6f07cccba04deb4246bf97d6459fbaabd4af0582237c5570a35065fd20c67765d4792ac65ced9af127f95b829d6a1f7c86e3d04d11bd9f65c2a6e4a9ae1b43b22978a9be29b8b84832393a5a93b11221bfb3d527282d6f3b3ae927bc37e7d8e2e90bd4336ce5e83a0c411ec3a8923b084e244aa1689a502bbc5d841105ff004b110294eabedc4d1f1c103534b7da55063d8b1b07117f639868deb3daa31464ecf3888bcae2b944d38b3e30f04ad97a8eddc65798573fc746823b756b5c4f148bca6697a8dba4dd33fd33f33f49e0d82e79ba028decf7e9fce1eb844dc5956a9aa4a55bd1611c5b0ded9751c8279db327fa17fa1275abf21f4e336f45a8a1f29d6847e9c36ba7ea1f1ba2e77ae872e5ed7fea1d968d421610bb746ddd771be59c7d64c24cebadf6224acad4ab6d540bd21415088d6d65ea2ebf9f5ac07da258c2318b0d7993de82c8f711e9654636864374143a62b1c99be70fa7553d2393393a6ee2ad5799a864cbb7d5df6acd56ea544861070b5dbad94dc64b8b016c28ba80005881002c8104086f8d2a1b4da5b7aed96d56eb51b028810cef2db1563f9ed8a41ba340fcf6ae7129b3163064aea6406ea3463866cabe8964541232956bb222ca89e20ae4d011113141a8a0e0c31819075c66901ea43e7b67614023a0783b1a6a7c959fc4dfc5f7bb01594d48bb54a5f5a62ae164c4c2a95926a158b974aa592ceb9e4953c0178b98483837370439abc9436419d56380ec22bbe569a1636387b9e795f6f77e94c5d88f2eb259b91d93a890c843d259bc9e5ce0b980dfb5a63b2afbcad3335cd8ef27ab3a6d9597faaac9a66573dacc6e4b1a619a5a667766dba86f1b23ffdf50365b80cc1e16664c0502726e4e747262614778a7df02d0686469a5ec53d221cbb4a762998176d7232a5503809efc872677ce29c417a1928e673502ac5e4010dd27b159d59d658e8be476e8adde48160ec284657afa6b88f8f6a2f2a8e8e6e156679912ed279d620bdfffd7a8c044f81a96841c2b12353779e65ede416b929f6b3bcba9b625d8df4de31153b7817393115b88a9bbe507c140493f4fe25e32999eb44eaa84b84d33f9d4589a3e4d96950e58ef6928f2739cfc89cca1d1ba4f72ed40d7d82031bc8d3a3be5a815e9cd0fdc131ec2e7f8380d23b94b275ea29137a6f28a590ddd99d4a6503e9bdca26b14929aa1ca4f7a91b48ef4fb64e9d94250800e93971535c648424eb702c2b41e43aba293e72b94c20943e0a80f4b4c909f503103c5548764be7227db4b00a7bbd06603a525464530383f1388be874352c5e30f1dd2b014873b358399b3880395ad1ff4c4569bf7c46ba31ecabcf4db0502999e8246327346a8988328d0cdc19cd399028d44dde5dffbbf7e53e797d6e82e8a679f5b68914d4e66c4e259bf9c19903e93d89e2241cc34868b9136e9ca4d361442100e9a550bc07b7d681f4522805204dbcadbf9a5aca5a0a8a916ce024b7e092b69438f086c14eaf2959b4943bd94b27a9d4494a9b9c1c55964067c7ae9fc60ad5d1e51a16698cb4e789c7ca1a8aa75236e9ccae834fc60290dee7edac87f142715258d0a47238863df6d9f559f7b9888bb3562dae1df540c09d820ab5f8e981805b850aa53ebabccf12d9a526715a1a9a1287e7da65e54ecfceaedda5dc79a9f696ccd07c1334c5d963ca5a4663e58e6e2941e083f400a4f7f7c507d27bbb354c02f01429141f9da018090e645e623ffc00fb012575f203eaf4c30f9eeb3fd1920d3dd1f26d791487f25036f23cd44745b2f378841d9460679d2b92002031d6151b4bd0be3e22092f929b5e51b7b1eb24e777a7b852dcf4be7cc6bb9cc6b758b068683368d476562f9b81bd80897969e1c25f32e80b1797bbb06939ab863683466d67d59ae12dd7d73dae56ab9567a25732af6785ba3c0f87f901f8cb0bc0631e076ff101709bff1c5cf60470165fb7cba02f570b00cf4a628686458587bfb91dfeea2ed12562a9a951a1a8a0a4cc0c0d4a6aa5dc5121615018bfe3618f6b8a1de64f35c51ef32835c5fef2ac9a626ff1b01a83cd9a6214c7017e7bce52def0dd63856c01bfa64e5a585cfe7f456ca328da926e151595949c7996d3fc0a01df00f7e119e0dfb7601e925658ab95a4063c0b286828b7027b1a7ce671729ce663f8015e01cee23daf79ec32e8cbd562b95aaf1a0d1df87121b5905e481a0944424ae158565e0f3cb0943be3132f240b3894a6ee2a15c6433ba9cd83ef55769079179f296b303edaf3c56b596be1e30ca9bfe6e0ef8cdfa3fbf5d7e776af90f2feb4b079b9432eaee682b26e4017e8b2286f504d0d0b1994054d8dcdcb666c5c60625e5a40c162f9b07e6aca1a0c65dd6a4abb6341b6fce572b18199456a4897c3c4bcb478a1ac24ca9dd87641593f4170f91c0ef336f8cbd7e0318fc35bfc0db7a1f91afeafc365fe72b56e666adce0ccfc6b7fffda58059dc590dfbb6e64c8ef5b1bfc8a6313e32f2f18978b0b8b7453a4940d7eb5ba52c81259a21722a9da2d2b5eb08051e3af18650d36be20710ef00c70161fc3e6b1b77896c7fc0b7f79170ee33902fe87d37619f4e5f2bc858150e039f0dc4f070cf00d7006bca525e06d90906dc0db17a51dbae98d51ed2db59e86bb7e86bf9ec680afb4961fde8370cc85e4bce3dccc7e84e086b080582d6614337fe3b2c7f17fec349fe32c3e86d73ccb6ddef316efc2633ef49795cba02fd7ca5b2c57eb85c33aa150e3783a9d4ea70f9d852f5cc08aa07041e294351734983e17e58ede2eca5a8e0c12f6db679e06194ef33aaed6cbd57ad1487bc238adacc538adac91b78bd3645a36352ed03d0c53e2d0fef94b59fb5087993760f15ef37e83ed74395ab9a3b70b0a03c62661afe3331fc365bff27f1a9c46e6b1d7bcf7c2637ee62f1f3accdfb88ba32f578be56abd5cadd710245be5b6140ee481013d3c2b57eee8cdba15d99385d3286b324ea3ac91778d8f33d017dac1dd8887cff10ccd8759c8d02877f4ae4159b7a219322fd483a32fc483b3781772d3eb34efb71ad303ea381cab415d87ff01693ca00e8463a994d78aa0a041ea7183ffb0a287bd7638a150a7d3e9743a9d24f1b3c3b36e3826043704686766dcafb73e56c8cf8fad515adcf720ec83dcf4ba8d928871c6eb7ff0e1c80710b01b365f7d78a8a1acc5a0ac5b0d3684746a2877d450e2c01b86c360ad76de76b7e735943bd8573ed6a87183843df6999fb9ec6ffc7fe5348fc3e273bce65db8cdb3bcc587eee2322f578be56abd60627c45090f392e1e968402a09b99e7c0731df8295be80bd528887e68c8aa2bafeaf033650ddb604359731a978bb76cfe61ba99870d7d48c012e0c020d3cc4c9abaab54e76962f32c9767dd84b47816aeca6a5e2f9b296b1fc69edb30e2205bfc8ac774f81d9ce65b643ce6a5c34b0fee7a20e076418578f0968aeb0702eed8ed08960fb0fc00a1a0a677264ddd552a241f125b0a177b58fab02437bd5e8087b53c0c4914fdfa8a8705b13c0c0869fcf60fbea99505052c40e5cc4c9abaab54e7e94819b74b6e4be1583796cf4dafbf943baffd288c7563dd6accf517d68d75ab39b5da5bc2ffaf6d7bf81387e79fc794b50f752977b04b0902975295c33492a304018d1b6a3a6af86b475983993700400c8c8e9758dab28265454507aa032575a20375d2a14356fafca5c3571af8759f77863d67a1f9a6ab1d0f5da1e09d220c7f5837d6ed48918831c69966c1ec347cbf1bde0de1b46efb6e62ee2631c2fa3399c81aa773ac552aa37cb30f4c61b5f706e9d36b3dbd267264f672d7321194d347ae9114f706df6bd1aaf1973da00a0494da2012117005539e1645d5aef7f3ba30d6151b996b0213e11cf66e160fd9b656697b64cd8552e8d088d4212ebc1e0eb9372491d0c8d385469e2e34f274a191a70b8d3c1d4603e477ed2d795ec6660e0bb9229d8b6ace0bdf7c6051cd01b2d144b1abbd81f54c71e9e191ce59e106398363288ae10892f806046bad395ead391a5f93f194fa193331c56e7c388608c193591af788226bcd194731043f6f2c95a76e22df7ca342657bdb19cdb57af85a5cf22319eb913cf18d4fe822388a5f6963fe96152c2b3efe297a2a1bddefb097abb54792cccf5aedb1649ea389cc9f3ad9e11f21a2e9499a9e50272914550ab962b55c2f12e68f9239e79c3dafb4f02b4dbbe7587f9ebff4628befbd71bdeb7161ac02c0d8cc30ee9de570d3eb3cd4f4da90c0e5a1ce26006387656d874f58c3031d099016ba0ff6e74ea0ce6c076a8abe15aab119549aeb44e01bfb736736c876a0ce6c0bea2e6c0207fb7ac54ba83330c2be7ea370dd08093e2b2d2883956683eecc8661187e59c4dadb21f8915dd0350c83864d9561acb3be20146acd0161b44a95d6197fee1f897fdcf95160798630c014c70646cdd1645a63ae87697a6dd539dc9efeca2d7a26778a6f44d426dbec6b63b3efacd457483af3a571ff04fdca70cc060d1b6a4e8671d3706314a74c0207870fc6194fa648671739c13b8bd9f5071f8130fd44dd99d08fd34ed7ae6af9ca9d9552207c10c399dd568f7e289ddac59b9e3e80a1589242a79fa2904903d5917d3ad8871f80f8d2add3dde32b7154ddc6288c704684f1ea0cae3a954e6cdb08c2697d86345d4c54e7c6aedf98f779e50da31871ce3632190c1c9cacf18a7b46b554def781a3c618fcb014e3f77d38cc99c4a99c31ea6457591af357a598c21a3876bd7261df7a857d6f5dc2e9b66a8413054df42ca17547a6e9b889a8314f9ca452a7a9ceb0572874ea8c7a433a6a573fa92fb20d6557122562085b6f226eda831d1145d4594661a450dcaa348a3a9d9c3e935dfd4f50f96de8e7f8bbf139fe524aaf298e5d27bfe29890e358175635e764923271506268723a4d53cb459a527ed718e96048beaa143a4f53a9f40a7a63ad453ad86f2a6d444322ec10c6e890adee5ab6cd0ee19b5d63d7a33882c555a415ec8c3ba33ae6488ee50b06d69a931a43f0f3c492142f8a0f8a300c25f56299ab34b6a2c5d5727939cf131ba59e899b39c8334dd3344dd3344d172e34110e8ca7565ecae2230c0ccc699aa7699a2ca9c93c65b69792cdece090dac4649eae639026dafbfa953b59c765080e372303863b26e4e74726261469e90cd2e4555c7f8b119223a42a6e5a84632998171a282dec798763b71fdc132c3fb8a0d690ce6524fd2ae83651e52a725246ca4936489d91aa4872d35bde61939d22b09c8414e3a91893799a7946e6e442d540ea6f999c68161813161816cf2407a95fb54d5254fa53293a48fd27db5b95281000a9ffb45b9a4857e4a6476e8a911c21e1983632d14ee8a217978ca489329226d2b8928f3890fa4d76cb6b24463856849da822c9eea63a1c23ca489aa87cbdf49bb447c260facf22a37bfdd76b22276e6af29fa4b463af77375684a57537c5bae8446b25d6090fb5444499468644a42be204910e9a483ba18be82213adcb483fd04f22252551a27f70ec866355dc74a76f483be80fb7c90e062051ef276f7baf2220d18d6107bda5ac69224db4c2649e264a2a95224200eb73154919493ba189b42e6600939c3d94cf55c4f0eb85583cf69a48eb74118e612dc54d318bc557de8a161fd3343d9de7a965c57ba942c231ec2012514e62d17f5f10e0c128205761929332d20216b00094d4c90250a7052c409f6e32f3799ada68632fc951d441fac806edecd9c0044776d6d90679b7b007bd00d0400690d040109e231cb0001b037af87800047a98800f104134e0870422308167f120be468647e06d1c02dfc21ff033f7f137dee371dcf631dc01ffc2ad069e026e917822dc66e0ed2dc857c079be08b73e47b88068000316a03d002ed7a87b28c193d42f035524cd27c06b1e012e7b1f9cc51fc065bc01dc3fbff91f7cf60a28000630e02f848448800f331be73dff410118f8043ceb868067f9f0ac033c4b88019e85630db9dec516c8df21a11b84634197a8ccb14ca73d9138ff790b199e8b4ff3963b28523f8ccaca0bf1d4d0c3db3a53f3271632501a949a62f4fc1c63c72c72ace1656b8cb2becff5d52ce9964b4a4a8a2bb657abd54b26a69bc562953bdf8ea2c5d328f016b0b7165952112d5aabf583bd2858fe8696dffc0dc7f91c4e8107023a0dffd12ce015f8215cff8a228a70188dcc2dd9e56ca0e4d66e30ed4cbba1a11c5a40baf130221b4ec2c817a942ba484da67e766aae16f6842877c6bdda3dd122f5b3b06e3735ed4c3bd3ceb433ed4c3b1ea8a80c09c19165cd6bd17c5cf181cee25b2ee3692e745b2537ddddf4eeaecf4d6fb7fbe3811fbada95b72c9556fc8ef130252f8a7877f1a0fe03dbdd4a251fd26d60856f170f4f0b8cf573629475a3f91cbce609e0b2e7e12c7e002ee371e0c1b1dbbc00dc75810be4c0e3f31d7458b2cbb90dec057e95030104f0ac212626a76a6fe9d3ffda292ad38a6bbb58c8d676f1f0bce85fb1e0416d118e5d54296475408c2cd24d41ed492e959249c552282ee4892af593fab9331b99237333a4cdb76a50e08df0179fe3868ca7398b9fe1321a4ef39f17f1439c3e0c8e447c8f1bf196666f6f65a5902d41d0f3f606d1b8de85bf3ec70360c4571acc831c08c740cf6706ad052b77be1d85cdd3665f03e76df88b96c700593c8d9aaf398d890b0810473d7798c97739c82169c1a591760a8bc5c2dd6280f88ffbf8cdc6c3761df8c90ded5c0ba2ef60bb9d0aba73a13b8dfa2ef5b3dafdd098418b816246468685494646ea97ed99991a92e5017003ceefc871c306fa2f1500ec7858920c7c48c70d9e732e38528e1b36d03ff74b65c6e52a6b9fbbca1a79868f3372e567388dec3f67f13597f134627c0e87f1347ff137e0fc0dbf791b3efb1adee277dce65dcef2a0d7f03a1c46f3ff66d2d45da5425fae75a02c180c5ded66ac7637d072dcb05163877c699f1f213434342d4896dfe1364fc35b7c0e9f3dcd6ffe06c7791d4e811fc28978206e6f2f84cf78ad9ab3f89d1a4ef333bc8837c22bf016705d441133be1b365e2a45680777e8b821c70d1b2f9519bfdafd4a89efd46868d0f583030a12e2594334305859fb1c56d6c8343cf618ef398cfffcc5836e6f0fc489f82170bee52d9ee6457c8f57e08d70fda51042c03e23976b5acba5bd0f14a2c7080b0c0164b52bbaf9182f705c415c856706150a42030c1a590bd17550ac5afc76f1f0f0fc6a87632c1f21b8218f5da8a01f8a51904565e53f97caf790c3b7e203887f1ceebf6bf8cff57b5bf61548ea4706e4758470700c6707b6c152e2c0fbc32d772971808e3d56eeb0943b9f833ee6e494b5cff5cb36e8385fe3c5df7018fff2186fc3697897cbf8194ef32d5ff9dd72bd1cc9b550d3eb9786db666ce9bbcddd3404330dfdec8bae762f97b6e7ca7feebf9d86f73cee397867e3cd8f3f118b5ef38b5e4711ad6177187a88f6d83a77c4f6851dc370620f5d7be89ea73daddd26baed735bf6d0f1b340f1cb1e0e7f04c13af2d6fe036b9bc16f899124d41c38f2c69e15461fa7eaa636ad466670db3695595d765395108aecbbb119f67519be29cda3d3071b7000a2071f4698c8ed23379676dd0610461515ada2d30d4a422bbb1a89e2089825d8b400b5ab91a20fd07084550e4e444800c50fa9640ba523229c76403291b2ab112323589581b5ab91278e8c3c51b48d18ddaa0a2575823a9998524a1e07c699d37a35c244d0101191cec8108a64bfd6de8a2daed67677053f10ad41dcea40605b570f77ada15261571f7b60b7bbd69c98fdf9f891f8abcd88cdaa01bb6cdbeefe700fec77d7faa24e91db1f6acb20769b368d4e5b456dd573588f98d836ac5db63fafe50da6d1f9a11ebe4683b8db26db42a1d72aeccff5a7356aebb161dad8a69fc523a4856ef7a5022df4cae3bb42ae45f880f63cb0026fd792470c1f1f7cbb963cf21494e031b3841f84bb963cf0145a1081b86bc983256806508c4982e0042390bb963c5c1e70c1901594b7053e5f10820f4abb963c5250a0c11148e6ae250f4b851964e1052658b2e4dcb5e4619202145e708623822c81fd4d5be3c82cedd8593bda593b8eb0b4f00700440f3d8809f4eccf035069e34e0f3074f24be29365580a91ae834b17124931f4d28b4e92aeff474dffd8e92154f2ba7d00d942226afae73a987451a4953c446f22fe20b003c0f4d047fc3832902d14fa584b1e68791369245ae650a2379166ba88de449a888366db8448f7d193c4160a499287597211bd552a68e510a46069c79b553d6fbc77885e8d30a1c46655b41a61626857234cb8608f1e895fe847062df45a737686625063eab6dd173b434375a6ee8adaf22d6f785ec330fc20a167a087765a608912872668a2b843973abc32871a131ca185a8113658c106263862051b988008b4b0460fa1d0ebf651c416ba695aa823e54395954e7a101d9b6c87b51a9d5e69a4dbced2892e81dd636c1b90d3f65185f002236ccf4d4f0a22011cab475e69e4d0166df58924046ddd0307ded581986c1f19e907bbfed8313af6f22de091baaced3822033d342496d0de430b5d973868d0b6f416677538267a69241ee942a3231b6483706eb3414132d0435b02bb290467b5c1d83d809cb60fd80d984083204be0407ac92b8e95d020f786963fdb766f24ea7369a1579a88561ceb51519ebc3dd4565da33d6af4ecea4050db87005890815dbd3e7186dbae28abfa1047b66d8821ec7a84a5891e3e129726a2aceaa2fb80b7db0d7f1037d000549af8c35cb2ab8f45352766003db470d717fab1a1855e4b001c5197ec5ce78a7fc4b78416a2208ed5074b52084b2944f38991d401996f50e21abc1231d828b2be12496cd44dab11254c647d233270c146999c94f8b1a73229df14a5e4a40c52803f73da6e112ae8ce6c57b76f2583111910ddabab39f6344b65bdd6a484bd5a5db2596063f41e7df7a5841187b39e8c19051b45cf5a1c5bea180238bb8775ac73a6c174daf4b5c189633638f8c604e2eca62f7d7ad3ec38fbbca35b94476fcf6d89c3024b962c29dadaf3bab14300676bb447bee6cd27c0335075679507ef1b559795e0dbcb20b97326f39833d069bae825cfa8cd732fe57c82244a7553f077bebfcea333cfc53d257bbd308ef64c61acf63e52e75e9b3ddf9c6dd567eba6f5a6b70a1c132251880087d4a669246164bb258aa09ffef987f1978e63e93f0f9bdeead1c74df2dc5de232832469376a86f2efcbfb3b214b7ff21537cbdae72612741358ca1bf55e63b49f1e85e43c4dd7c1e7978ec7b2ac8d5b7ffe4a37cbb1fc47bd0a49054b27f8e4c11bfb46d175dea26e69d1bd15b7e0f7797b787bee9538bcbcf1fbe9863fa85a9001097659736490811884c1075b7c8e19b555297a68cf1ad5a171532f3f8d9b7a37c6d69d8d6e4767e1b03eba456db6ef615fe7a6dee9ad3bd3a3ad679be011e527b78935d175b0f825b73611e5e4c997dc267a2e394a47ebcebc96b55ac96d28963a50dbb351a8adac69d7c13b8eb034f206782af58ce58d1a3392d957dc667af6fcb98882a50ed0c7920649d77ee2e2dbb27f27280b07ca4b8ef212eaeb064b193549953a469be89fa7507ffae96d26a8ad67f3d80df6281d745ceef4ec33657e8f12bacb27c710ccd7e28b4bd93cc2e9b92d6797b162ac4677aedda82b7a60bcd6cc997523df36deb5bc71deb04b3e881f35e976db3c263b74cc43ee50023b07f143c6be35463b8fb7bf20befa03f643c6b63546fb0fbbc4860aa3fd7b5ccf66cbf3e7632ef3e7b5b4c1dbb9afb36b1f537f7de5c8cecec271dd8d0c39b13f122c47ffc41a4aebfac92d8aeb37fdbec95b7766bac5a50e1d3d78e5ceeace9bd41a13ba2e7564b75ded1a65a1a03b3d1be52c1c2937f1949bb8898f21a93f1f6169ad3b4b7dbd25e92b77567fd82df4a3f2d2a75c2c6be81753bca483f1e92a6fdd59e9734b1bcb1a7a4c3dca7b987c7ebe4ddbb09750f28340757c8e3d7c9c9b620fc52d089cd5c8d0146059438f0f76ad3063e8a06c02f67a69df9ed4155b301ab16fcfbedbba456d46607cdfe29859c20f966cabfdea8cdaacfbe8a141d2c628043cc846853e23b6f52ab06dc641b6d5a804302a14a4ba11a6d1500f6eb40fbd55bfa88d88ed3b9cd568ac5e5772bef5d8b0b36e881ba33fcc5dbd2e61cb50ec77c9ae5f6b8c25817f9e0c50f80923006d7cda18e38d31c628d4f7aa15bb3e51042f14e18809635db1e1935b4fef1add6a4e764b853dcff32ad1f9cb18e3ba60358847f2cc26e4fe40d49d61cf8536683f8b3778bf8b3f1cf690cb1c9084a80daa31d7adfe10dc9fb7c73cead123f5638bdf2661818032cb060d61b546b1a4d15cba331459ef4cb44470d8617422863a220ece498acc39952a83a8792864eb43a18672281b99ecc42c9d28286510358bda2a1cbba2094c9a9e4ab2a452e14c5e1a7e9c267a4d6d900d7a21b1d2ec90cde13dda119396c88d65d4069da6921e453225afc851770261d4daf33e30fcc0d0db1de11bbc84bac408380ad9b11146b2c337b8489fb8c84bc21ee825dd19fe30f6bc259e18c0507f9fa7bfacf388a0dbf703635d519df500effa562d9a73b01b1a4791479dd689466291884474c211923b13939c5067e217c49c4f3cc237e2f873d32fd4d9288ae328eef0cd38fedcd93876a0cec6511cc771ac310319a3df217c832393e18c41f8468663191c83ee4c26938da30ec1ece995d665218cba6f0a3607ab76d6f8d35aebfcb9167e4f8260c641fa471c82edd04808e7b575cca58ce2ab77dee20cc4a12acaa0de800ea22ad106dbaa82543708a226a8244cd9aa82d631432202000000003316000020100a86c442b12c8b924490c50714001076a05c5a4a1d88635190c3288a621832081940080100081818a0a199014de5438c2510b0eeea60a775540f78b1cd1d211611de70ad4521ac5261533442b96b22407a85193880aa823155439935a9f854375e852ae8b0c9c2b3b6ca26b6948125a6c8531a4b13de2b913bcd2b8979cf128d2819561c58f2e13b4f8d061c025fd1771c1c4875184856630f6d07b0ef7d4017ddc8c34a5e417ccd27abe13d9a74aa2007e30bdebfa51e9f1f4605bfb3f0cfbdc8739ee2242490ef7065a54c57b63e839f0c0419412d431319c10e3447221a9633600b73a47b91fab5e99a4d0b579a0bea210b78f6e0342936a071254eefad34efd8284d5ea9c35a1c792e709aeb6f25682455b972baec2325b01bd94e47cac3e8894910ecf6721c4d8d9c33fbfb80e540e575081658b90f8bfbf778fda37c00e1aaebc7ff64b24ed6f2d2a3370926d05e5de5f9a792f9e45d3bd38824de113bf68ed8d1ae5a2ff623e9edf29c4d555956551df14cf455678e11a22426ecc6759834a2f4c46f1866ff1f03fe330de34088e968ccacab8ea364e11b548b748bed9d01ceb6335d14189c67a02220d7102767fbe4a58a51351bf51a40e5af6355ca007c94f362a7539c26b22f09e55a0ac142dda0f4b7c285281936235fdd1ea8580ee319cb7d4e667fd92a36bf19f08435af838d9920f2d51c968c74956354c6be4b6da91fdbd05c12241121c3873d701ab75e45820d4251fab08a5ea17c63bd46a7b28411d1c3727c29c0ded0094c1896945b9a273a76205b7c269fd154b6b6227f1440fe53c1ce058cb5886e0887b09bf5be6ebec059212cd039e8258507fab6d067aa92f4ed6213bdc69decf79ef2277427dd77a92b1392fc68fed6672d3407b03b61d0076c4a3394eea3eeb283f2444084ecc224d2c06225127895b9d3e68822c9b1a219a0a3628de48d0f027432e94631ffd78c6b7e5740a20f8ccd3fb31f4a54b38fb9301a20ede6e6d83e37affe15d564e434124c2ad84436ce30465420a09b222cdb78a08a38d4a450847712fbd9d3069d07290f67884c33a0b5b7d01939a3071ac4c61efb24682b52d07ba5bcd605d6eaa3413fb4bdd19346d6e879ec7d679df535d393631a7878dd862e656702e5b723b7a3779033afb61531b15af2dfb68375d4901abfa05e464b82ea9504f3e4f7a4ffafeefea1b9cfa1e7f04a967cc8e323d0cc9802a0f05baa2836817bd7ba3aef0ba29858dffdd9b4455afb8b9631a0a3babc1d36d4efc436be6b80f29e533fa73ba0934da0c6a637251e05982c7a330c3b43a770313207a239d1114d4bd79e6aacc5f6988bcfa8a15411b8f9ad97d48ffc64117b12794034f5cedd9b1e39301a223cec997df9ac257951c50e9d4f0b41867c6245f999954164fe365fe46ef0b207965c5d4e301cb9a6dbd98d289a42fdd23cfc2d6328c9a10c159f3d7e5a77c7d136895ad70ae6f4bd8dfb091a28f903064cabeb00140f73affe16723bd398ef1e69fca2fad4e9d7179911923379a0bdacac4027183678475053824caeff181f42b98860216701dc7c302d509de15e6c06f4d7a44668dc0d14a969fa09fb1d960d5627fef12782608be8b579e526c0dca0c3c5bf7c0daf12e91edf5324816b16a07d739c8702796367d34d2b1a2c3ccaa6458522aab754c6293a7007bc1147a8bc1dbc3e13809acf916955b5591384a530eb8e437725de32d65750641033f7d1620f0a9755b40d3bbe55c1f0130975094f17f1320a29f6bf5c3557fe0d6e1494656f9ce9ee46b4bb6219e4ab5d227d4ae69c50b46c815f22b8c483f7c5fa52a3d643bd96c41e38b5265e11d61182df1b7b09ab6e541c827b804b128a0bc3821d698133f2c13a1c38fdf27c9d203ebc15b7850356d6aafd03806a17288a693a7e669cd159f21b0615f9ed963c6a9b529b8480480f8e0a0b7422571512c73e3ab546a588309b28889f13b84bd81497c56ceb92ffde0a5315d564306ac4808b03ba8b308b386ae453994cb8e7118c916670283a9a70ef3c3dad9424db69d9a0526fb03c009aecc6f98563e315c8786a3ea804e0110179aaa6ec97c19af133e6ef718677008b08ba831e8829ba99b1bcb9c9e960791747720fa22ec9d99426f136dccc0ead1e84aa39499518da753b8bdfd4b140f5d1d16862ed58da2122ff92be6f6f0195005896b8b20c780ee718181e04960da593feed130d1b430828619d72c6e51fa14e8a8cf84aba6981ce567342722b3e677e7a0689554974a3081098866ad6dfeb1e92621845557a5da9093943db83fbd6569a3a0485994f3f6ba5fbb718949b82cb002dd73cacf29560e9f256dde3ae79179159697995cac8a4ec16da0a9e630237d639508befc789432028064c83261a1d1f5d788ea9a69402ad35ae130126c75ed4385b0f4ceb9437d0d5a01af71d0276de1d3bab52c64e6998d62a9d2e48f0439ad6d60710c581e669a01c008fe9906f5a5916379116b2ceb91d9c18ee8977f306270c0673c804d0ba24f051f8e89ac6037762625126e4623d5844423662f2db4215e8b96df897625b71b6d01a71a33947cf7ce31c64687c89ba42f2fe4c74cc0821e0bc827522e7604d52e17cf25156d617d9b8f8b94b58d843d2cd35e2af9ae1b8e56c562538791e97b5f97192d99017e3f49d698217ed8c5e2d1713b14c8d6eba5b720a416ed334a601d8621bf4f266be188daf80f25456c26336fc930f1a3befdcea73b006f3e494cd18599c15c79d25ecaad3d1190c644785bd9cf4c69431f49a2c224db2cc9590a320001582195523fe4f4d6a68e77c02e2f1a34dc7f4757fd82f383db3dbb44702f224b2d65e97a73a9d370d43c3b437f4c7b7841a3d0b9ace6e36f0f53ea89eb6af78252bcc26ce5ec09a12529cd30ebaac857f618e45121756a0697cf98e8053daed1c6445f062b640f47adbf6ebfc218f826a4b34186647f4f7ecda1699be1373af0ab2a95aeec8c6771a6cc68812ed65eeb3831b8ec326e023c28c064902f9db1497c47a4cad0024f183c39725e6e58d39056f3e49f62c4e5a05beec524f3ab4031671505274c19d3bdec1e7ac97fa926c776bc8500eece2fe92263081bca3e5c50996f26106e12b97021e9e387a315c80806a699f914fceaeb1ad202774c6be1831105d66595401d172703556de1d2000eb8bb2d09ad3ca13cc9d024393edd1e22dc66e1258a7bad9b466a49626513e46a1048319d6144f81711107e738d73e2a2f5f462a6ae4e26aa593303e8099393bfb9cff9617f015cde7d6d8fcc7947450673708c9cc44e28bb30c24f542a34b37ace4a796697fe1bd04e5924d981d6235c906bdeec670a47acd028ff615054224ecccdbcc916a464ee264c82bdef563408f3a881d3e11aa8394efb104cc8f109eca08b450a07d722b7c007e9df2c8361ba48f181ee2742a6b5a0b57ad53835369d736e4fa65c0a8a773d8990c210b2d86799c9be7268aa8008ccd9e06f9f1e71aab08db56930d9f908ee76a5d6a0cb1d84480e6d76efbfb1f5fdbba0e896559681e750667d7112a832a90671665b1a16c66eace931d6061374fa2239eb6227784dfc2d2cf57f22c605667cf9086148332e81f92b0aee539c1a13f5529498f4e77100c491e40ea6eb9c7a364a7b82e24feff82fed321c853039f3e493880f1b0fcabaf52a4d7681807fc043b724e5d56ad63b152d55efcf6f9ffec3b64c4bc790eb0d7d5cb54654ea65e8e96724700d2cea17f27ac5c660ea75341e6cd6bc7fc02e2e1a4bf1f6b5097468fcb7d129eef6a8498a5c35d545627ba13d37e6db3b42b1296aca97320dafb03dc1a2d9216ae6b73e4b60159d99e9562593d21157e9d4f7aa519ce9954383f665fd5ceaf4efe4aa761f56bf2aa7008d024d6ed8a1b986a166d821b7df3b564a156f9377a9cc98caf74cce1998bb9634403cb0fc8d8b8041acbea39a1a4e324d89200fe6ca917fccc44cbebdda0c781dde804a6d5e548be787341934d7a3fd40945953599293f3325c4185e01a547c77be8005c42ac91c17e2c35ad51ac60c186b37a975b63f8ba297c3879c499fbc7e20ecd9e1ec43b885c49c7415f9c85c5f625166462c4275454ff7cf8c11ab5bf67b49428273f74a88661a1690494a1c46a47d2395b4bcc8733afad93c634ae35ccce33ee6a49a4394b6c35631829775f847c19fe51cc51576280af21af1db338df28be55f57e8143cac849311247c7626928bccfe800a2bf1d79e4d131c6a9c8239621def01f6e85f5bc3860a414bbd1492d1b05b2d2aece48f711d634a796cbe498d9accceda7b3ffc376015d3318d007656708f8008af60c9f6c615f8b4fadca7f001ab8e5fb3966afe64a1c6c669f12b3c7563e050529440077c2bef6c7d77bce8d81f32c3bb3d7ff1403f215d626490dc71ad7cb07447090e8e8742be190229b81fd62d533459c7ac286af8d25d9e07b4a6f83683acff6d1146f7f9806a8aa273891a18a811bc77cba23b8bf3916c69d85155400f62969ca1007ad77b6733f0a42ab612546085b4f988532253ea57a8538c820188120199ea87dc0c50c11208a89b4b1c5f026ef9de0f085273980cc3eba6854baf39371becf2c8ecf402329ffceafa0997aaf6c46278e8993a508eb13343ee78382422b23ab279a3bdbe3e7251c13f9424ea241438d453cc201dbbeb81ae1605e7c963a929f3b54a635623b2e63c9c8792169f46d4e28b7178283fab866f18de35530dfbb586e8651f0ce0322e21e92a3f6d92bbeb8927dc9a88b340202e493ed0a6ea8da997069ddaec75ebbff7f2744582f25e1116ad57fd83b7df83032299b1f108ada892e9c101268d4a1431c21e1231d427fd5845113c03f5f81ab6923e7d0bec39a16bf9f3a74212324adb07c6125e19731d17aa070791f6447969ef99913c79765f201a6cc3c627516e81b536b633595c9790e59edba7b229e7446ce5eeea1cde80fed9d6653ca8188f6c2934d380f93d35ce82f40e69f40a66597a1b025b5002c1b83f588bf887dbd7a34486141b889f2821f6cd626c8f141e09b2843d7ce07712208718550689f0c1f4971eeab88d5e18c641b900589f74b226da97845bfc780b54747760fdd69bdc67bd025820bb84c971b88c4f73f3738dac6d2d82201f861a3b5904e0619822e20553cd11d511344d919f85c6091d11fd7c528164cdd7abc10b3dd3402ed48c528a09cacbc9274b9e9545951333ee154bcb9ada6ca6a1faa876a35234e95898c834c8cc9659518e70a0b09502bbb3cf231447878ef974ef250e1a95a024553cc9596d05bc45e9c558afd6cb8f959325d934b642fd33897963b6b17a35d95451ebea90964d0f051282d6d0727d66e8fd08585db9f95e269cf99a3c16679933586c7aca494bc79ed9cdb8210a9e5a063c73d0c9089f3f0ce5baa426c0bb1544732c98da62135349996f715087c8d72d577841428803dbaf3b86e0f4fbaf74ed49049d6b1f83cec5e08bb624f7817676c622628248d6016a92470e53b97489c78b60a487b10008fb972043b7771c0de736456ac314de01ab5ae22a5e863dc5449806e02f91d5e412f9099c72808a40552acdef7b575c135b99bf47a8be9580e6a99a192fa841a71c7b29dabdf00135634ee72fdd270c91e91ca9932ede2300ce3a864931208674fb7713082c2b16fe521f11fedb1b761bd0c316b12793d1c7f9328cf4e6a7b7d2bbd28bbddde95eec22c433efbc59fe4dfd9d06e552abb3a64edf252df9d043e55b3f5c5c97ea0f49a4a12a3b06e9271c12376c7ef4af395b87a1328ea3943f4bed9d823bc8706c799c351aabb56a5178238a526a822f06d8f21a17e90ada7b62277ec0f8054532b853290eeb8b0ff8b2b19a8bb01686dcce0fd2b60e7fb81ca63e44c4126d8411cfdd8fbef410b548496019f36609a9b5d4c1a8705b3b162f5740ab91ed44b120efc296959e71e20984b1f9e06ba88920086523f80d2859f2400dc3cb1bee5954a1c99d47eec5f0c0ea7f3971d4aceda3de571e3bef7fded3d4b33b57e745260cb4b6cbe36d6fe7b4ed271d0f9d04e72be6e18fa029a55ba6703f349f0efb482b14f1822257a444e43b41ca2a25c949c1ad7a3d5b5712325f697043c885312069660a400551212abd488c1156a3eba95647960bd46568851641a33395a89f1c91399b48560e1f80e2746057a11d756d0b0d07eaa57ca1c95d80fb42711df2e6703a03344b28082eb5aabb275c3b5e0e3be2e2f808ea74cacf906f8fdaa9b374272de200d50b8f22bbfe6c90ca9124a6755283e32022137277d5471669b33476f3974bcb43f7a09417ef55fa23c5d1dba7206ca3e739279bbeb233d2e5d899cdd96d1f66545d5ef85635ec51e1b92e17042f56b071445b15c304df68747365637dee43658d8dfa61087f013f8805a029d115bd5190da815f9b4bf188d2a123e15d4099431e0100c784449a69f022d1ffbc2d6666147a07bdf7dae1dc9dfb3c577a365a3d83c31db7e9bbfa3351057d5ea8446137aec9567b9d3d2b3cb9c2f265b3ee246ae8922c2782040afbbe4352136b1c6594ab31033e5acfd7386f02237ec2849ee997afed7bcc72d249276e6c0f616cd14f4060371696c82e5bf54b264585e2ca30c8284387202f5abb0539ec26a9cd4a0978cafbec34ce4f811718a13710a70cb27222becf0228e3e164571beffcd05d8d70b5e8970df674c817b12a530b8d078afa44f7f1dc79e9466d351d4c2608fa80805504eff869815cc2ec32ebc71b3d41db99f42664f8b05be17a115ff76da0c7c318eadf67c3e78a9828f37b693c7e3168bac25bddc9dbdf68337aa4560894578e21bdce07d3d88a7eb4c578db279c6c5d699941bd4c22134549078545755690ea6a94c8cf40e95c4da544c0c0c6da87973c1b178d116703741cd25e226348b221a2fbb19aa26a8002dc4139746a76a75d0cece439bb9f4969a8b2b57ed74cba5d4b9a008603263c14b78e37d2e99b770b8f93faab7bc3554d4bdc57c88a66bc1b2663add242568eddeb78e9ee7a7d7b78809cd26982b0fa113c435c9cbd20227123e09442461b148b5584b49d755bd8aa0664ac2dad71d5bd0be7f8c64781b1d4717183ffc0ada7fae1cdda80c1bd2e2e1be3d15cd7b54fd4197afae006d4fbf0a86d2639efc992f59272de26a80b3cd237642c3ea6bf2dbe74a2195416cb4632e573f7a1775abff79ea5e5a385e2fd6a06734498286b3e347b46919d0817bc7c2a1dca8273a56a75a815c849287d825de8b64357559fba98fd343447f48815a73c90093feefe3c99a2a75579739737a06072de06f2016aa9751f0973aadc3c655cfde729ada5003822ef87cd773d0e1375cb47ac2e29b3a57f65d3f214c5535a4a45726f3526d586247f9d7b7cae01388a41c7974d9c7a53ab7f1f8a9327d268f3f020580c3703948d3852e30ec138156cdf4ab3d3e1bdfcd0b586f210e6c1c58b79fcc10182a1de8b89c2e0ded3b81dce97ec2325d590bebf2bb5a827c76c1f5e11d21ecb30f8e01893e5a16e7207a42430fc444df4cb0f32955740b663f72bb771dd52479019e5228c5d0c644cb6f00726cbb9399d6bdcd40ef912f269bb0893ab6e8126490069f860c90f816ac8d44caec7419eeaa6fef884e87b87f538bfd906bd794c766446495594f94ffa437649aadaf34ad214eda1de682ba5187399db41b5299a2730509a37d11d8acd880e93b1f9e32e446f7b1f27c73e8a0cca58e8d5e280f460243c1dcd8e3867e3ed1d74ff56119e19c6b45c84889526bedd847060559ddfab50243dae6b89d9271183654830f9d466edc798585dd4625966048f5ef4b8cbc3af125949a515db2ef43438d55cda97452d702286b9779193f927ce836c6947630854f1149a1b71e1b394728df4f0507a49cc2111e43f2c1ba913bd0102142daee2e2e55a2438e1a54484a941959478bdced254d19a68346ef332590d9f4d4a0d5e7e82f21a2667b2e3a297c5bed77991b37982f441244ac992f09f3172d9e93915dd0cbfc25fce77980fbbebb3b2be52e6f160aa7497b4a249164f0484c29d3f537c521126d3029c66ac18bd9fb7098998940174f8732c70ff5514b142c1f4999e047dca03b72ca1a3b73bbf137911404042da9f214044cd34412966633199087f4efa024d99efc115c05d1bf3101bcbfdd68aa4747862ad2e761dff63f78040dc805ef191c302ab637d6d6c227650e49eecb7a65eb98f598204f821854bc1334a341a73f39243cae164a97af500d21eac61e1921139fb0571c685029a6ae88dcbb5502028d26ba140a23efc063c1f382e75bb43482e363fe3c257db061a0fd680636d887254c4fc8c346c9bb08e3839d0db501d9ac7d4ea57036a96b0fd2dd809b26d6f08fc06990ac9bce3b987b05bf5f35df89bdb087c92829c31cfa760d323150a27d88b6486b37cb2060af1cd336454acdc2549034ec13bb4512e4aa65f360be17d78d7f46d3a1ae692f0729a93815737ffb8a55062d8ae3f603fbe50aa640df9385abb9f4b5cde3e259d3df8992f3929820b399e02b9ec6888b656ea22f9e0b6a76a939a34659a65ca7030faa06395c30c742c5508d434591b621225d26d07e7b81ec64fd5fed05054b5e4c0a131ca1cdc6a00e89398d616451e5096eeaed362bebef70db8d3069a7cb9d2c33a7d093d0ab0b6ddff535bc94824012fd1065838ebcc5576f4d92854e7eacd1405a2c74ac68138ee68e9372dc73a4029de2d87b6b8f71732ada2d9b96c107fe51199a082993592ed7a5dc538b09c2740ff2193f4abda93f28df6c655aa8421018531b870d4aed5c4b7d9b5139d5f7ee9ff6299bc823828b583791baf4b24cd2a1a91831b504a076480b255b3879ddb1620f2592d3a07cd56680fd081826d3b931aad02155997756d91c528ef9e1c5e73e64655d741fb4d9dde96b559b0296e5c0df756c63e95f67c4b1ca4ed4abf3ffc7a43ad8a2100a87f608f8dde03befa2bccfb2975fcddd02a32452a5f8b81e8706c5d0d268251ccccad8683643e182e987be82acbb0ffebda847b55246cec5cf1455fae4105018e938c88dda3e3af91b94111e379d38d7782c12f02fce6cc3c8bbef277195dec25c435918fc89d22ea33bff036d8070f9372851e9011127353b5558087d3492cdc77334667ac258275c076aeab6deac7e1b9ae9c379e573bbc0ab10a369181edcd8c6c3b68aa4024c9f546a60c80149e6f08ff01a2f67f9d1de195fa8483acef39ea55cf5f3ba37139450eada6bc9fcd804a051af9627424b75a8596b92c3a36dbdcacd3554a4d3e4863da57775d599a940ede351aad8f020f50ae46765abdde407e8e8ab91d05b6a081e420f041e70f75551c66055f096ec31f0c6ec9ea0bdce2a00982d13d7657adcfd20ca715927dc0c88a20b780d55351b2a1dbe5be2d9368beec15817ac094ede3b88feb3fa86835bf4991df5e1069f08bae11a16b1b52b06d4b826d8745b2c5a734e5e4f0917058416a0472d6bcd5bce6b5be6155b983aa1b17ea21c9e0f4eaa3dd5a60e6d80d3f2311a50d7e5544e40e7fcd71cbfa2c3a545957cc781a2abf1a07d2be832c7f269a5a7e17d5e7eacecd67b1afc165aabb61ea21581e69a6126c07f31c43de761d0920fd4ae885e89a06b23c8d0ae2b4a5303aa005512574d9e5535c82a5a400656d4586b280a86076b1974b435b0d84bd0cc4c815f7ccada5701aa54d72040358ee55625b36fac665ca62299bcd4d6bb90a01b8e7f3668e65abdda9b52af545b644528b950601dd2865f90df2e71010c1e48c0bfa1566a793027292e2cb50d79b8d441a64b4e27b9f75e2ec5dde818ab8ad8d8f1b1cdf301f3403fc279d5da246e289cdedbad2403afd1d26070a150cc891b7c00a6beac891bd05281fc1ae862101cc84c23eab72c95652831de2ffc6233aa4055a46c97a170c5ba440bea86eefc73122e358da8c0b7a614d61f5891a1c757bebc0101c1cc8ffe837c03cf97d23c794b20a88b0607269374d9361897dd9e73f20df83ae6bcf286d20b2e53dee619358ee85548bf620d387075d9a6153ebbe4cc4fb50107ec86e75646e18d49bd13aa018702f2094e893a0fab9a3799accd47dce19f5bd91d241cb098ccdd580fa43eb9261ce6bdca556d01b7de77d7862d16e3e8f675e6d6c1c70cd3860ece4506546993e98a830b829fe75396eda20b641387de8c035b413d03604fd857a8e0e0e950e1239d5dfde57a5c2fc86dae75e5256433abcf387c2f34789e245b55ee33bb26714b0dee04673b5b5f52bb7fbbcb58868e41b2169d5aa552de5316a8ad430e8e7f79e920ccc7b144c0a2e03e1cba210be1afb26febe1a61c56ac2d9c423465145a5420480ede403c07122907778a5500a14c1d8142dc9e88715a97bb03c36234683970c75021a0d208c761409db8532a5103ae268f39f076048a0a186edae5e53f9b5bbc7bff63e9b3d721ed0f54f339558d46bfcb7628ab3507feecdbd07617d526433ecc27b82b1ab06064b127413930db658e1d75c554cd14a3e9c4fcba3f054544a0139d548a454572399126f72b8f39fce51e2343ae188752beacc90697609a6210ad4f28e936e58a6b1cdd9835bbc2b90e0e871939be8dd373184a751fe13dac10055efdbb5d906b6257b7539b384b3f6bd20e2c6fd7c81091985cb10a9f4ff5c1164abfab5cf1782521962bf6a2e2930e6e62b910de7d42d8e3169cd333f64ea11151e074a50ba17e0bab566cfdaf9cf7fbf3784b002c2d0c3ad1f92a6e2b41cb01eafb75b07d574f00eb8a8734c6d1b09e4be197bb450d87191f7927975e6863f50f5c00714b6a0ece7ea28edf6f9d5bdca6d71c988fd764bdea119d01200fff35a6d85ec40a58cefb6046993a1e7a358735f0d774fe9b2d870f5615a4f825abbf089b5c7ccfc1d5bdd79fe33474f148fc348c8dfc2fe720630140047de189e6f36fe4852d8cfa5e0c303ce1a18df71c96d0dc41ec993557895f158fa6996b82ab924336c48ae8f04940983066609a96de73f01a9d5f637ef671d0c11c1cc6ab1ac6ca55fbfbef6b99b542d5903f6e5db3b74d83a493610f7569a515fbb09b031b1faf39fa877d1e8a513226d4de437382e9e63edb4a9dd9f6185c5f752b630c5a04a7fe55768e40245bcfadfa55e6b6d4e75cf7ccc0c3867f876a84bfde69177681cdc2e58ab4468625ac3594f1563de6942786f8dfb56d095f17c325f1b0bec4b326c085d78064d35674e12de397af4c77045258650bd356a4606cc22093850c8c7d012ab273a3d90b59098a9258847b49152c0ee9ff25bfb3b9c966f1e355d686a1e7f2a5983b001798205a4affb7ca9fc57b5288d4f24be7873234ce239ad0767c05c10682aca9feb2a0c51489ea8421b823e62e1ceace18f393ea25b2abf33293b65ad258d3d3200c3c3a34db6571f286821a49631eb04710946fc02583fea2ad63cfa29cc46227ca4a6d06496e48771fa03414d1dcdc9c191fb8787f8c22449db5baaaaa94f3057ba4a7b8d1fd64f7fb0ddd91f28039d251dcc07db2fbfd760f55a22074c7945abae4aa8034045b0387e54872946f947d54f6d0d1dd2a273dacceb046a7b621b275cf912ac412dfcba96b6fdc7d039b938f7baa2bf79062d752434e069d15452c94ce0bc03d78e7513cbb85f1512ee7456dd756f9d9e88d93c38757bef05a081f3ac9de4540185c61e5d5384cbc3b52b35252f17dc74b1c0323cd43272ffd5869da361e1da652f1cd3d1226899af10765096b698728c57ee2d745d421d3a600c31b21fcf842e8877506ea8d38ee36ec42140fdcf03e4c4db3488d4c0c3bc4333f5035208ca2e7d38cd4d8046d2ad280e6b61b20b66a0d1034aa22e75eaf65cd2ff5600f8c688b1be07ad223f97949c23a49e84927bd9db64d400919f3d99a956c61ab0e0a9e8a551efe8f7f5164ea3a1dacd950c21a555e3e33f92788608b0ccf5b1186741537d1a93d98c1b53b52a242ef6ddc87b1bc960f437f782b7ad0be60382b7f1cfd87e1f3672b4156860c1938cf4372ef8369aaff374839e7978a4b1ea2a70578ec2cfbd9020f3b1041b3fc0fa24ddbc9f00b9123f94a54b006463c61a3bcaa8c868a61422c733af6f4cb131f57ec8fe16e840cc0dd835c917a879074ec6a96f6da1f21454064de38a19aeb3606ae52335957a22572c5c87fad2a0b3f62acd09ee21fb8d887c8152b1b4c2816ef7c97daf1dae27935a2054dd4b47c72638c974e3fffcdb5937be2f91961d74f7e60a6c2f52f7776cd8f47359ea810f6de4ceeb767bf6983297c194caeb8b4b7456f8d190855f3f6bccb509260fcd75ca48cf3f2eec9157596f46626e49d8c1b32523db240e9af981681e51d27af5b7a214f4738aea544e9268dd89455359786eff74b0d92963a69a44f625be22e0d263ec13519b432d5fbbe0564a961adce96c53c1e810a276868624562fa66f5d29a9b785bb17cc4addd795d8178fe7c5eedbc1373a30aa88e5efab71824529a205595ffaded9424076ec33963ea96cd7c562a44227cc98831a1a38b587dd0d15c38a92046952dbc5c4c42575cfa868afd67ef3cbcf25936a7b59a593506f9814d5cc03606a94ab5a59ad6d67ac14c3c5547e6415244483e52ef775938dbb549a2b4449a692d5162d512a48f86042e14982ea65c191ea68b319a599ad849b714e764adf82bf287058b65e4d532ece1fed9d015d7c1f3524af24585255934463e0afd2c98040c85fa95a56879c305bdb5390becf48759d074206501ba729d19065f60a14216086652f906853288264a204200bccd8eb81e0fb59485ef1efa93e300228101d17a55764becdcac666e81a589e592ae550aeead1b70b6ba228cd546b6ce895600f6acf30df075f526ca10de24d36b37dddca49bc82582d522cea1ddb13723067f3ed777ec6e87a11bc3888c5eb137f4de400ea716e6d6e2bdb1cec9d3980596981a75660119105ab35a5e3298a963c44d5118820129f82c88583ca8a30366e00bc87d2a64d859f7246c397e172b405e8ca935ba01c410fdbae2e9317e888804c5f52fdec0c165df3a9c7d6f15db34c4e535bdaa4a81956c056e82c7cbdebdbc7419cadbd71523830f4babfa50178a177b4ecf7472126395e97ecee2d1b069658f2a82010d5385cbbfad2b0033c8095c90069dc1cc20187d7103ab7934f480482cfc2b538c3ef5152bef18bba555eb01e070b10beb64f1488a31292d6087461b6ace459d0af669818e199e7b0e4c3a8db2462ae355a3216219e2410cc1d02abbc1b07330055694fafae6193ac6811601c8137e9c16573cda4442abaca7fb04375a6cc3f57662786d9ec3df4fc4bca85db37e65f6db641dae317bec7166a91d51b2e6ae58f73cc4991c6cac28d34fda7a0706b74c16d96f0a132b1bcc1326708acddc5a7ee3b97f29f08407c939f1c91537c5aacfd66cb45ce877b1b6d3322981b52ec1cfae2635323f5b23519d063f7ce0173d5c113cba42884b34b4cab668afddf094a03f8d804241a849e3a0676ce632d91993e6db7d67fcd14eb3b219d67b31dd42a1982b89254ddca91eb460fc116478c5b84c6d722c44653a85d2bdc035d1285468f102fe540e0fd43ed58f16b9ff8046642a37e703cfe94284b84115bbe1cd7132c1ef845a4724c631c3c658dacd79b0b696b16378c5b80f22f38fc961dabb649dc6ff5761414e1fb8e054275e3ea035d16831aac56e104427a2205f60079017c7022a1c8a11960aaf6875edf5f83c617a3c95b7866d89665c27a61f99e936f2d2de871c093880f3d6213cfea86694c02e16609a685fb443f82b9032c91cf2b9e7a1f41060492a886360b5827e45d700e1ff21f38af10358511f4c819f35598b1e48a652dcbd3dc4c0558a235246ae1070b0545ee3b47ac7ee84f7005cb10f900d129e5ff056d9316e46589cbdc992b4f1f82f9bfdda47da4380c405f138ecea3cd64e44d52bea1ed35ddbe017ae5296009c3929d862d0ec8b386970025896289c048a75db49b76f6dd389f9610b3311f8d0bac73e6500f1fee1fe1f1f6595c1f502c8173ab93f07a2ff9345bd623c55e90de62d821cad2f72e724485c05af132cb81c8c7e972d067e93cce2bfae2b74815877761041155e15deb6057131e240a0ebb83d2cfe9dee87585a0385a1587c8de8396bfcfb6c8dd7679fe20f4acd966abfa4bc7e15bb681afc2b9bbc22ad807d30dede5260c77657523384eb178bc699609aaabd9984b80092a5a59c862d4c1fa26613a9199ad68115afdd502204059dde20b72067d1bb6e265f97df33e02ca948ed9548cd7a608cbd197d99b62ebc9b2a31a8d2e9b85683b74e3bef66f47f29a347002adacf7c30df853c7068a98f4daf3b79a2e419933ed7659f9ebbbc3a473bfdd0df0a1854344f8a393c7209a08cec8b87da76390cc88668dce0340f032fff091f1a607006caf3fa084ab420ef8219b93d33320bedc53aa62b604f2564aa6c0f2a4806bb0ca90afd397dc06b178d2cd66f4353d043b372008b4d236d88163977228839f779e234273394e968bd1f423175b37e00d530611e3e18977af348bc5b7da76d13bd9c042d58ab24967a78850f4ed6b69de973172925422fb5fade14f42ec7df8684b9b667e554ea9643d8fd7feb46d9450490a61be9c84a41b1b8f97ffe9015c849aed646c33ef318186edfd793c468e1d459459683daed9691bdf5b24c02344e4a837d03aefd1289dd12f8f3270f30e8985dac41969f65e1cc99b53f7f715d2925bd332f5cfba98e489d59dc60386db10257d004b842be1d8e340951e6613187ac7cb0ec01d11d9d769894fbcaf42bfa2f8eb73aa24d2644709a6c4796cc17e4e994942d4a96a7376776d4a6c979f4c702f8467b8271ea970ac96c9578c2beff5aec2c86cca92c641fce3bbf01282144c2fe91807de694dfe2eb17681f68b698f7b2bf071c9930e1b8712a5c1c41781667ca4964464692df604dcf979e05f5e921f25afd699811a93857dd6d07863f17ade165642edec47eb9585906225494017d76ee2c9ddf03096f84ac5de840e3f2561a3391513732edda28ef75c039e078578295d58ad11e6d63f2827aa6c9ba6c2322c79a22e99ed7b4c391f0def400f7256fe84993be4eb09b2ef1fd1f01dd1c2a31e6283f9e71ac625d12b5372df30085ba1da0d738a0c7c7d9980bfb0646af81c9f73df930316f3de63c7c29b0b62723d6b53ed715925afd5d51123f664bc6132e37b3b1222d07476fe234e7b7f4b9ba27b9ecbe0f6aee024af7c79ee4c607ad1f153a16054ceb1289d3eaaf2b907523a234a21b79251d9540c31edb9a85b9d2f8ac22c94eeb6c56705504f58b724176eb43b71428664305e8da0340abb3bd26e6a42e81a276c10f9a910958212df70252ba6da34c57e828107bf1ff20ddf014286239b6431b38a7af20d35aa4d44d99bd959bffb99c062b54f060f7a67bb0cc3ea1127f9565660ed7cd7aa3a05480a038890532fb1387a8b66d669ae2f415836bae24e223188d2dbf9a94038b7a958d08edf48a1a191ee716e906c3a11db4c2c6d02ae46ffa77381f9d3cb80569aa3fd298684018065636990b2c966aaa3f8df7ce6ea89af0e213e603b49a734dbf3bd211454c213bb2059251fdb9f7b020f6ad89875f277e695938e2af28f1bd6cf08c2f70609da46b81351b9ead10f005a660f273d4fa4d6b66ce31c6df1bcbd186a54c6de515f92897054731a65ce501cd748f81751827d83bbd23050022f85025f7ec8b1d8d90a43ff3f34eafe73d70d80669dc608716bf419d0e18957abd5cd30ecdfa8b4e9ba1a7d08632665306a31943afec28fe9b8e7e540dbd9c70156095fe4feaedcfed444da05d7fc9c7006a2105c56b4e45f377676ba63aabd59a19c45cd41fbc60c4f1e0fc6151cc4049afda5f1218b113ddfce47f9d186b1f613e0a3caa0c1f8d65ae3fcac414dc2257215444ec0bf2a298784586373a5088524548bb83fce891448194941a90ae9954dec3a0b729fd56fc9890f7d1ce416535d2d25931f564a3a70a4c61b915d31220a74a5bb088e12067cad83937f0031c34cb0ff7085aeb0463a81b691e166b48114173ae93348184aeb84282beeb3c97fb69f791a8d65a213691e7203a341792186a2c8110e8ff3595f3df20328a361b98b262501e6442ad60d2db8d12b35267e244e398431199a93eb73d8cca81333942363cd90f765c0d9f912bb473e9ee4c1a65f40e08274e99d12526f3d8912effea0fe3c9162505dcabc5f66b49c108d6847189087282d4948145f42f34b6d7e7c73bf062a765f5530881596910af7879f093be3c81e761fd866b3c32933eca2c45cb8dba562a21adb128aa66690379472abe2ecadc8f078aae63812eee4706466bd2d35a96c85871f84e23f2029a08a80c3b1e8955d0edddc47e87d7d590f8bde51b476a882c6f5173ff158a40d9891518004bd110aadcacbf9e7df498d149ee1a7b0723b046427bd6ec312da55f9df55f5d4713ab8e056cd9abfdce0e4ab4ce468246c83abe914d1451677ebfe5a023c0dfae4673eb4dace0e84ffa68c23ca67c1a7a0e3f04563a73f36a2b4131122ebdf308187ae26a0e2a2bf5cd86c5359be63b9e346da58f83d134bb18f640078b5b33430b33e5cc27b55164126278c0208b74946fb49fea4abfa28a100044819ee20ded57dce87758c43d0a8cf430f5042e0a1116c8286fd03ed54e1632c00b727b77013c0ca3dc3da343d151f401be37ad16b360d6ca7b11c52e0186e21072d9a543ef8a8e6920bc6a027c61c2382a53da59c168141ff0b355dcce801a203415ca996e95107799e90a746816c6bdd38db6889d5515cdb877847d81812a65fd69c41ee076efbaa7abd36d9e24077c805c0851eb8e255a1daee806dcd99d1c119c84abfdaae79f0bd2d79649fcaf245ed05df2c4ec7c24e6295e355c94b8536b5b4edfb11836f7b735a0dad3de6d7883f97a617b2e1e9e18aceb08acefb13008974accca9e5d3bfd6ffc9755ec71ade09535d492213f2adbad7499065c2132a847834d074acad087625abbb4c0257eb5cd4a9cae1a2ef0ea816c53ef7c60cce1f2308dba65849e61a93148ee9b0615f36dddbb8e32a3fc030f3cbb178131d747bdf4a6ab2585f8270164722d83bc38e5953b93f900b842885f40b38b81a0987ad6eb3c099871f42f529b217baef3ee5d2c3cf29aa7a32bc51c0ec6b820e0e49220f45bb9eeb72903d6340015c8e84839a5628e7ad23b00cd74ed49c806f4321754e5bdf3434f7e76b099ef9222aaecd65e4e9bc91d9458ece2b0f9c5747ff94f027f1e37b6009c401d43cca299d0970206bc02b51ae9bcf4e900a2d00ea6c7bc777aefef40a013d7054bf2805b6a2671796b7527a919effcfc3f4bd64667b6bf2340558de2a0ca42b0a7cef774a168064138239473bc154c7472dac1243a0589a0e823ba16ff06e7bd8be8e5b804a680d9edbd73ccf340f5e07e1749f3a9b19fe48d5291a8ec582094661067f3bd3b2e7a66b63d308b4f67e8a3b3fcee2cb9df2d88ad569324d490c1086fc6afbd7a746963c867ed2e643b5bf229d3a9493d2ccc7155fea5f7d10969dc16c7a2b97fd2f76ee3f31de010fd6f7cf2c9d7e12e47cfa08a6687e25ec3096546575fe5162724048bfd55243182f0430b19e2dba1c38c0770fedd9ea7feb950d2c807e520c6775a8784ec49ba8ded2a2709f5ccd75e96ff01cd904cc5ec3429b02447f54f885c5d062a2456ed66adc3075c1a6876ba2589e7318e82e8d2ed54e216d16ab7f61658e0bb83a44014171e16e3895acde93abd40e04c605de0bba337a58f879059a1df825dfee742c93bc2bd039a9db865e85e38248867ff8131ebbeabec0d347712bdf8743ec101cdf6e84dfaa1b8fadfeb63ca04d2782892addb8b9545bf13df191ff7085d02baddd73ca610c7f91dac02e5d81e996468d8c43b6790c3c1d35a18b89113d797489d69c069427d1596bf1f046e024685317cb7c642fad89bd882ba216ae1ef0b7794398919dba0cbcf9d5aedd1a0ad213e5663811b8f262af370653f549c1729ec4c2c738c1227e3c9ef189f95f19f8ce889db10bd7ff2df1db33647908b859efac3fd96947d411aead35ebce625350ec1d27b19470060d6d0e08cd8c06482e4b04c95eb4c4dd001e949e4f184f6d0bf17e360a0ece1bd761d1652af79dfbce3e45a3c52c1221c667b095c5e5cd6f3e104832ec0491007359f29d5b8a497b9a7fc95620d973b7d38bbe4a37390c8d63a0fd97543423717e0657ac0ba737be750022c10d1cc2eab92702691a948d33eb5b57372b51314b54b0b8de4a17b68a6d5fff53ab5ac17371b2ec98fb6eebbed03402a6d0a7268f19da261c6d059866435f25931c38de766ff53dbdae52f5858cc9116a3711656a39e61361c8361b57ef133eb052f67fd31d64c2b450e0e53463617d6ee4af1b76054e352eddfef511b056d5890a0aa219aadacb14f772f36ddc9e654000d4f40b8781f23351f50cdc8e9e27b9ea2834754457131373f9605c82d98185f45063c2a4c6e1770da36b61809b59b3be62e5e17df454f8010c0d1cd42b289597abfbeea949284c4912541ce2b3e14d8257d91b09a58c67762f64a4f4be3bbe8cf5b5b8fa1349e6cb0fe83caad14c98d2cc9709ddbb69406050536ce95ca6c4a22a23fb2c2b87def3d9478808a1f002c13e90adec487a1f66f0f8642b5652d4b99b65b4d246b756a8fd7408ff52f2644ddcde693bba89dde31ea4eca60d248358dfc33d7415d0fde823a70608c0c5fe6b10dab14ecbe2024f68eae8c8c14c8a1b9cb60851bbb343fcf2081ade4acfee8c19077e5b7d35cf8e382ce59b644084a708580a69a1afd2fb5a7fab9ad2bb5dc6583aad2e04db606ff3834eb8f9e3ae93cd5ec118d46b8031fcdc52183f6482f2239172004e784370c9c90fe94ad3ae5515cdfaf0d4568b68273600340604ffc35a7b4aa731ee39734716d47ffdd2b38e2afaac706e6ab6007cc7322eb75a96f260c2fbe1b80f0b74eaf33e1f98671f7089aadf90661e38f99bddc0c6a11a79805291983618f5f58cf6c051dc4903da80324fc432492443b08abc7f1f26d2cef63097de50552da777206f967a6d9aa8356d46d0510dca1bf8b29f6cee936dccc8266065375d5827cf8ccd88df200f959a0969f77584cfcc54683495ac3feb306a0856b293fba941351ee48f8b329ee5c763d29ec11365dbe797e8dc4a240f0a3a56d839ef120a7ccbe782e47b1d1de72d7a62a3d335425de09c218766dfc2f40311c7f2fb4d739b09084c21672b6d64efb254cb64fad2e1485e3a2835b6aec19394c8c75e64cdc0278da6e4b3798cbb1df3b1034b64b23e9ed66b3f3b4c740e7af3138b90fd51272b232c5f91f434aa0d8093b33b39a20a279336a53c7d2820de79074768fd3eda1965109c9b13a70e9023dbeebed8522161a946f13f4d8caf2a3874ea51aaf5f67e69b680d5f34d735bd96ada7c4c46b24e67ed4ef7a0088c684aa8cc7699432cd7df04dc426cb98be9da8a03028fa7bf037a9677374f49a4e498803d20e7f744f94dca6b87cf529db8cf3b41882ad1fc6eeb6434d82d6880ba2e8422534803975d9830c372b538399131001c2ea1149eea7dbebb4fac6bea0011c625f93c443ae39a30c9615d1a0f6922a8702be8cb67de296d4026e320bfa51c8e6a3c7b84eea41a800a3df78c921afba79ac313a3629a2e0789214552c10c0851437ac8757ca314fdf7610555ae566ad1216de52b946c509af4aa445b8b879d414047d9b7e12bdaf28c75c3e8948ea234c94dcb803bd3907c945eabdf8cc0f7d5accf1ebfe8754a025e32a6d39d68a26330bad8e19319e05f25a58c8034348f4ca7a8018364c78a00a10572ed36b158d0ca4836c00df79d97f063551e7416909bdd24c9cd5fb574e3df0b446df4dcdf65b2f599a2abdfd6ea4c6683d046f27afacba0c72172b7bef847aed886be24bd97758db2252eebd3e14c82458a275cf5fd59fd3ff33f376d7eb7ac92d99331c5641b390c936b34e78f855db60365c47c0e546a4641dd783e6a7add6acd3dcef1fd03258549bbbd37200cde2e24766e6524c9b813e509c6f27f3a351a6d488ec11a5065957adc3f9e5a05480be87304643093d9c9d829b6969d12b6b03e89b1cb7fd3b809ff1e8f6318dbdf0357787f5cc5f5acf9ea6eca4d762b1dae186d4848ff02c3decea4bc1d54c5695a1928ce7ce866564f18bdea34ca045e06c6c446d9b1e3a68c6e9317152789053335447ed8159cbbccde35f1bd30f62e030e763ee607e6c74f3d5efc67df5c1c7898bb69231b64838a1a54b4a19f9ccf18b4332b2cf0695affdf9b117b7ebffaff9eef996654ad7524de40cdb725c37f2f6cf9a33ee8a35a293ccfba19a3dfc28f7e9407ca6871d5da21f1b6bc96f5801b86d9ab69cb4dab12c50872bff2fbadbb9e6d27f6d9e9780f1a2db7bd00f6d10c1fb8f47f84947b5dfacfda9758201884a67dc4fa78d193d60d78b0a3cb90e9cb1314b60c389c9fe2b933d1e83add54e000759ea95100ab2d43b31d404ed37e62b0d74a126078bd96734645af4a013368132adb66e941202f58f1e8811634bf6941ee8811f280b1c5be05209c5787f6919473745609157b560054d2d7fc0c44fec2136276230cb59cbdb14d49fa9746f61684d718c0c46e37d9414f81628180af462784588d07a5d84ed05956411435bdcfce0477c1289d97a0da926ea3d81ed41842e0829bfceb37ea0460c7d86ac084480dacf9ef16b0bf2d2647410f07bf044296b1ef01853cd6353dde4b462efdfbeb3ed6a0bf7d87f6122d296087a190bee579db9102b47619dbaf7a20bf7c824643966300fa4c6c331580d39b204b060f39fad24ebed65e8ec91afaa6575b0b32d923d2964b9512b7b2c98fbb8d0824e689b06b6f502e53b07981516cb2cf4e5f6e7c3cccd2aee045898515e09b0805379ecbb63fbd141ea6eae4b7e948bda33ed32b828bfa9794a4d130bc57c101391a6e7222867a41fa8f839356446a8925246f22dd74baede6755849956ad5521bdd13fd9e31b90515327a435f7db25a712bc1f010861031c40f2ee9644235929f07e21c3c61f05db394440ba0d32a46ceed3bdf4e2ad92e4ace1ec60f59aad82f49ecd7da0d6b1de4bf39888388923d75e2bce843d9765890f2e2ff3e0b0119b6270f8de6fcb1bf144e071d4e7e5bd928f5c3c4170481befc155f76635cd821473ad5b6cb969ce40b3669c6d226720209b598be48eea78b79e936446d9024894f8924b7ec84b4c46ea7681f83de44f82b71c2ba0b2d173318af7d38941e5e82a81f46ff7f141f4590c8329c9654a2775122f9940acb4dd3c69735c9a65f8abebf1a02f60333551b16041659de229228ae4a31f9424a98f143a0d5f8090730ed2426ebbca568223852fb088a13c39db183c650a99d62d6a9496182c82558fdf7ad1305799fd0e539599909637557f53fa2e89cb8e263d0cbd73560dc0027b3c4afc12fb96468786f122e0cac455b0a98a69ee0c202052f88835d0b55ed57415ed3c08bc5677bdb8dc62783de261185d67f205d1bc0f81cdfe23d6a6e40a4408310536c9a22c2c9573c93e0c313043468b56ad0510d672fcc126c753de79e3cd57cf8bbcc2a74e46f7606b2fda9298cd415675c0a5968992361e27321a84fa5dff761f1f94cb1f4c992c9dd12320bbf167580b4a6357dbfbfc4d6a2070e416b7e8d846e7073ebc01ad1232ca25068995722b9a2aee12745132fcb94644769ff8244fa6c2e7482f598ecdc5b1b2cacfba1557914e57393bbdcace8d53ccf18a79ea5c173570ebd4858f7cc010abbfdd8f0b2ae2c33326964f14a3b34ec71e9036a8de110d593c1ed745dd73080a2296ea6e1add758e473abf441b55f096ca4bbbb687134eef74f99406c1d00a5d278414640d0054074ebc9aebc2f2c53ead1c31546362b94254400d362391f10b9f843128e04eb50b5250a0027cee10e154d0668613439121ca852a511cf123bec52de3ccfa831dfc58237444da6efe997ddf3a27dd96aa11a1fcf90a045e0f674935a3ad2ec1bf982deec3d9b41f55be2f6f25852d758000f680b6c6a4a4d6ba199100301e8375daf57e261ab5851e5a1e25fef574f04f304745cf30f569ea7ee161a43d89661a11032c0410b27d83ca7a056712482be59a0a70a87d532f3ab5c0edd7a7d6234adbc7dc951fd0e432eec9391b708280de32ddc88bf2bd54c2e85b07f120ef42a2bb9fccac9d98d8b4e4c491cd2e4217439be0d726600cee9c80ef4b6d3b73b72b31b3d5916db9235d5d765dae07fb07120bbeef00b44e3b78700b152693fe79b96469e03169c30eff3dce0a2b41aa313ef58016d3428b36c365d29b140dc7446ed49d5802b48dfaa953435bffe9784fd83eac971d22ec1b9ff091caa0407c4ed5514a00412c573aea613123ce8e7ac68ef434bf7bb89b675061c4c4f3bde0762c9357c4058322b3b11a9e8b39023780e5bbbf65ea13776033da49cf0c74d61b3218224c9a31e2c3b978411d3a686fb69530585dc69b9b9496a678bf63477cccb0c3dc8ca3623e7667d0c229cdef7678cf0456a4719eaba87cf14c922353d6a3a340172b9d586a935ab2593ac90b766370091dcbe59836197176826e5ba308c71de83b87a121f2fb6a15a654342cd9798ea78160751416ed250b2f4769f29ff2b408cfdfa23106a53d34a621911a8a9357c0d83dd96f02ad2508602019154cf37508f75f10f39c992512faa761dcc0330108737ca3ec47cc9de21a13be64478794601900bec72fc08f3dc9ecd9c5685e5e730ebb55f30476c3bda086888d8b228189d3f3c1a5c957c7eb7776b4614dab41f42e81c6d3710321a67f5d1b3822653146ad27c4694048c157f213837bc21db57d4aceb058f2ac6baf12a5a9c4bb4357eeb5769843f18a14f2941cde7d11c18934829506171118b70adf9e0ca1410aeab53b980a8421bab07270af849323aaf6655bda0983a5b1ebe0df74a623893dbae25c050e12c88d53852fc6fff9dc47ccc3d975030faf47886e580dd96b16b6e2adafd2d04185b58ff14f9f6d99652dab4acb01cf326c59367063b9d0ea8824146a808b1c756fa6dd47cad499c5fad0dd3039b71cf7ace778ad2773ccc8374e2928abfca8cc0bfaa1c7fa946d34fbb3b903b2c646d8bb4628e4cff2e568480486e9a396035c121cc04a41f551fde0c623d1e328634e2ee374e26a091dbd5e3c6db97b60e769c887cc26c5f04d6229bb40c4db04d7642e5c0a89d5098402667ba9fa8b23385643fc81f658617ff8648774df9d5c795aef0bb84bf6c21498ed41dbd2ee84829a6ba915d37b10dd099c3b66aaf67b6f76476ddd7c68b1497ae8282433fdfdc4d036e61e19c5e16582c1e1c4e3323a7e667b348e9a34ed00689e62b936db391bdde1148b9ba948396cd365b56d06e96dec0cebeda77ffdcadc071a74acafa0f9b7e788d481c59ab9e4398ee73db18a6281af5414351809b716a30d37f37dbee38458c9583a9e44fd43c17b747c86e419958c775675adaecaa611af212635de2634d4006cb7ae5179799cd57c87e3ddcf5ecbf95ef772c3221316240a7d99455b45572fa4e8184ddf27d6754d5da6731b506702603c97a21b0033ed5ce0146a7c46602bd300307067fcc9076002c95ba4cfa767f8bd16490503dbaa46c80ef5093d470006004344f6f1f3f7fbd4f097e9953cabb2a050997f81e306ca96cf38cb808811f2a5224d4e23cd48d5d788bea46c660614f89d77ee22d0f1339ba85f5a84e49eb2035366eeef2dc35fdd449c2cfe754de7184dc59246ba0945db5a04e2c626af3e661fa79b55fd0b407f7f1f7a4685281fcf2ee9a40eceb8a755541a30647cdd2c23da8d73d9b9adc417864ad2b9b696b3157b5cc7254384b9e49a347e17911bb77048353b08627bdb2f8542578158e6585b511ea9ffdb5c0ee7546f0137a907d9de0fa61e10daaa680fcdcce35dd1190c6d750c7676cb7566b8b9823a04ee6bc3045a108a2bb342adbe70035272634cdc289ad81a0c37855edd942dde7dafd7a399e94d2f900c156859910f8e196e34fd698e62d96d77a6c1a9e4b4940f4646666acacede7bcfd1b389a3744b02baccbb299365b8e210bd258ddf16b1c9482d2664d6b50d8dff69d910bd3149ead45d5bb14ba427df1af880b0015eaecd8289c131b1354875836d82c300d87ca941cdb629957d13c0681ba2b3b6396d038844e54aa9b4ab37011f792d19027553eff0e46c0557eed9c0d83c7ee7597c2af1f4f2d9b610703cec11d0be5de37c54d5a7893e8bacc10871b882080cf4b66754ab7e1f2b8e827cd66f1e230ea7a841d181d91db5e752993eb56175e9cc68d1ac8059fb36ab829fdaf485f49fa266e2449a02180673bb38b39716f54da59d87fcf2d5ff573bc3b45cd7556a189e7ca1fb1a134a752543f43c17d31f3070c3a3022c39322bf844cd99ce6a1eae914daa431b7135d5f4695e5d11cd7e1ef0710583688d356a23652f539c1dfdb46389461ca6e9730182e836732dfcc691ed3b30d6f09bc04e6377f80d055513725acbfd65ec034f9321c0beb4ec0ddc821995f7e5742c911fcf9b713c445f91b3347f2e72f7e63b5436634daaabe92696d733b5222951d2a4c4f926f4ee53a83bc35a4fd6b3315893ec5ba658b46899b9cc26b59bd7c309c7bcab7197d3bc4232399d13f384ac965f51d588c92ef33c48f250fbef3b51535506537015520b8a7d9aa519b328f76cfa26bfdf265a9fc905652c133553c83bf9b55f3b783831e8947c7f4e6234dda30cbd6d8bc5dddcb3d186c2c4ab032eefd9a87b2d912cadb3983b38ee242be55f10c0e7ae2c3b728f1ec30adb6b82b2eef67efb2587686260a4f2d49018b31a057c3680131488a0f7462ae436fafc8a7d83809602b4b9ddbb4f6b61648036bddd0612fd452aade8b6763a7903125bd93752471b097aacfeb267c5bb067b6c5da6d5d90018d20eb90efe38235c84b4f8367169c37c93013393108369d30ee800edef9dd01a2b08e5c9ca80c2b0270f28ac5af471d0d1c015d55ac32dcb92c1c94158d457710c66a8baec5688fac774763ea36565d1eba0f4953c630f061a4e9de3e81012c55646ca0ff40db616654d76cfc631c8785f34fcd121f1a2530d3a20cb486ac632a54909b6fee54b6cedfa7b0c201e57f8bb4f33f618ec98065709fa49ca85775440fdc1ca23bd1b81a68e90470ce5418d433400c0d40b048de29bb5610587d4b775d1065d45167c5217b58617b74761936a0eb1a5e9ac243edf3a4c3717c200728f2161e07270ca82bc231d19526bed3695f7e0acd02fa271f7c1ff04e26c407c4c08538a9ff4652f4787e500869b269928da294fca781d40d3754b28866275ac1071c1f5a4e66504426074830c37938a0d9d4f1fd83cdd994cf274644a9b4571b27226d1328a8fd040126d7d9f3498381b375ef68195560d6b8bd4357f0e96c3867d81a811ea32ec32a68251f312f00328439f6cd3c2753cf5277cb19ae108f7139c3f5a17cac1cf23830bbca050e6214afec7a0fe5a32fa3af86fdbf4f7ddf11fe6dd15b0c3bafd0613056490cf6a9c54dba2e74aeb9579eef9d4bddef4d49f5c235993c74945794046c40fe5a130b04dfec89495dcc08efd8e3c888657ff89caac3755629afc34cc5325286e2d632e4b0ed1350c811a9b1d498bdf4cc03f3f119819d06aeae1d8cc0e84eabba495bc3472a64b4d0eb1ef79c85cdc8f0e727c401b11663ec58991606569081160da9a670e38a09b5bc1dd56416f77666db6b542288fdf7e36339f99061d36858e71c7b46f21c5960100806ab68816d2766e66cccccc4ed74dfe4654398167ae44434fb9759c501515fc1f5f427f9a6d27c4aab23a32a3f1f1abfb61430b86808c3267d42ae2e9c4e806724a4e1ce9309be8f6e58a0b82439fee4c4c577ef9f049789ed75eb3f4379b76126b63343ed46583cc144593b255bfd852ab8d9d70e0329a6eecb1a50cc5903df446cdaf210321c62e60520eb218c16d0bb1b3a5604abd0d2c828323bc0882e48d66d2291550917962e6fcb2708c4cabc528b87fbd2fe65831d1918c5e82ef8f473540a68694d5f104936485d5567538dbb83b64896f6a0eea0186750ac9b3dd385e52c334c09d297c6be47198b164906f351cdcf478467c214a5a40c8a424c62ea595beaf35b6ececcf9adc6c54a52612dc7bb2ba3a43391afc349971429788bd91403271376759306270363f9d47f369f0baec6f675c2088cd030bbbad9a6048a103682553031d741e515c93590985e266ddbec63ef1cdf405342f272ed65d491055c1e3d38ad65ea7226c94e91e92b9eace3c6d46a6f3371ef1b099aeb51a3c7a4eda4b5472fd4da514168acf5f1aa71fcba7defe1bfca7e0eb30762e9c679a530354ba83ce97ce396602d0d446da5a87829da2a4f60efa02ce05fdfec2739a21fa78f80426735851a2688e400134a16c3cd2636d355606134eac9e8da9689e364dbc9f89c115da50f95553a055b422ca4e82d15c8b61357bc0c58c3f8547e6a56aefc8662e9dc8d98df140c743363df4565ac812b874522b32ca2e14b9985a099a9f3eccbb5ff8fddfeab8ef125dcbe93227f828cf1d3bbd210b2a95540fb33ff5be4b8c0233cd2b0d4b278609595fceff05ed3254c64a27b6d02d005759aedfb3496f5dac1d30292c91dbc7d718920de9a08ad30958b1bca406d03a3eb8367096122849b528518d85a5b53e60e201ad0a442a2435eb3f3b8792258e590dff697931ca38c535023997acc2d6a23cdd0ad0f2d9d440ec87ab7c8829bc790fb6949c5daff684882feb25100dd890f930b68d60cb4e21e4362f63a40a2c8fc521a17f9c84b662434dc9bc0d96ca789f5ab08e0d5c78d4d4053e7b76db136e8f8a8383f0824520fc9122a6919bc3373b78c79ed65d7112075f2520998a7024d5f42204cb6fec96e5da75a80a26d3ca3d8f092fd1dc8113a8440aa8ebdb9526ea7793882e23132e4b3c95cc6bcf303247beaf55ed789955b64acbf0d1d9c5d0b3527b07fe37e293ceb48293df4801cebb58b5b568b42126825b5d61dd7b696e5009050ece0a12d5708150f6bb070bfee7620e5dd23d6793faca0530d607f767949f6536e39589fa9fffbf4990e92ea64d24a5ee42894786f445da57955c0f10af8cec67323a6d0358a2761e251eca905e2d096a19ea1133bd3da5a6a074a1dbf5f66aaa898d030a9ca35fa980cf4dc6f8d782e2c63edb34f5c6538c143308f5344616d79e29f16e2dc82ecad7ff5b1ea626f573b75ce56d10791e40c85d4219e9c7ec23f154ded42760c2f52002356b3aa770a60e844473b9ad96b8a32552b0ce1b12e6137e3de785d7f07dd13df43e36beab440f497a90b4d3c45f5d3901f616afa5bf3efe483e8886bc941cc0a628c2cefd1f733c5f428524c0d6fc8529d8a2262087d02cbf9edcb297782d273c7267fd8d8df4a1456401680ad2ef080cf12c6ef92f3b23212592e66a1da1b06382c3397a799cf88da32097b47a41481c074665d3e61d1d9c39c5ffc5d8ef092f0a006f91bb1eed17c5478a05d674292717324bda743545e71aba2c4ea2de0e9b1883a619d45da140a52e04f81cbf152fcd915e73539a2b09b8b5f7d60ef00563fe7b73449686f084dd81c098196939183d9804e4c469829cce6a8ba051d64aee973992e41c2ea7300e3d9b0794728dd3bc5f5a437eddf3837ef01b364e6cb6a416153426f520d33c06f74286e59b8414a8d165d68ba5f7a6811f75f721a091286ed18d5ca56091767df91c4fa5bf08930a7dcc3d6c36399cab8897a48c070913ba322365d321b1ef336c17928318c35e97d63736633cf0983b25db180f7f5fc6c396960f322a2be4e5df51b495b8776956190c04714b46b3c17f494b2e65ff8434ba8c7107b7da30fca1323f6d94ed597efebe65449d6c9fe593f2e8dc8494e11c516fcfdfa5e5ff3eba966f16d189ce71ef89595b7ed434f107d3cb8749fa84847680fd1fdf53c13755263d5db8e1968f77382fb853979e544382c6c33bfdc51f646a7e1fae70bc1e5077c51021e37fd6eae7960d232cbdff51bee476e2d3f71b6aba679edfed0a0b562ff87bc6523434c09bb2005b370f1c3a3c6f10abfff0d7148f2986e7f7c6a3fecd7a41e0afcf9c4f921c7ec2f6b1837f38b20c111164b6ff48c7f8aa366547bb41205427be702459a29a1cf842b9e3f313501df86ade658d48f5da26017914a11240295f79567c282645942f467c9483b25afacbb70dbf9b05da1e2e5a1f4dac110c03cd4641b3e98d9630bddf48c15ec8e9da23bc25e05dd0e094b1892f3c3a6f09a3483f0d850c02f8dbe3d59fe9a851fa04d4255bdb4d848aafec13e7063fe6e103c94fa45d24c90882a8a6535c3de657eaad543af4b3ffde66ef422ca0294b624b3b22c27857f40a57a92220ecb3853dfe4f1d94fd9415a15d495f8e293922106eee7410725f4f7b2f6906a0a919007f5972e123def176a17462041e6384e60e561038cc6a737c1e9b3beddd1f692896083bb47fc417d1ca7e1b4266fe066bfa5aa2da915e464ef1c376cb465b0b9bbf8a4d7bd38b1d8a21e778f01caf3d76a1901b5b93c239219d53442770f4b6d192f5d226524a9902980e230f110fd8f45be67bdd0c59b51b2207f29e8a47013575dfe47d4b3f3de977338f375e3ef1dc04734e4d7e0ccc4ce67bbbee6f57dadc045d13346b9de9ba2ef366a8d6995ef3c0f4da35fd1b87eed393697ee39047999fd769d07c013b69fc55117e1f86ee618454aa12c45f8da7bbb7133fff0141f10b5561287e2ea16fe87bd5386a71b5fac0573d6b1c520d8daaef637ddfab54e357dea8fe73adc64fe8fb583636ac7114ba2af06b29d5872ccc62b158acebe04a253482606a687cd57f2ea1b154852ad57f2a30fc3e7114fa48707cd523c1e4383482ef1a47218f143f2f6a91ab51a86b5dfda56854aa9a9a50bca2288aa20e9a51fc14198e3524b9527db8da6163b38324cd90bc244992a48a66144abd4a55338a3f8ee3a84a95526e19b10c0a4d55e9be23845b226b5c22ee188b66c40f674495ea79a86ae42d63f2188958bffa9035001628744df1439a4b43434343e3185cd58c42aa17778ce3b746959812ff5395526e99b10c0a4df147a16b8635e2e7125295230df8d18ca558a64aef71a7cb57e1192240ef536089f3cfcc7b0faac415487665edcb1a8ed97d65ce33ae2fa45316b3e66ffb31f1e3fb35a72816d62ec03da9fbd9a786c77b1765e28e8bce4ba705c6d9c1c3d589c185f7741b702dcee8ccf880c3c4ce030e4b91e1b0ae0363746274643a0e74617460741be834d065a00be3b016996e8d5a1702137f87063eb2e3b12a14c715ab033b324fe6b6664cfc2957cd0e1e2955288e2b96efe0962ba50a451e3c78745d572ec1a324776880010fd70eed8e81683440101441d87dd8b99e3435984dfdee3abffe3abdaa3999daf471e8ca7853a44a1581df2f6185843c33c803c1fb7dd8f372d769adbb9c3d8ccd1a2876ae4f06f29a3530a5e39fbd20cf9472cb78a6cbf34c4f08d0d4a6ce42e20f2ff6eee7688831af77c57435ac8579350e038779f5677de1f0c6a06b9aee6440d5182a317701dec73a6a1507f8d461f93c34c488e9b296ac4547612d3019f3923e6224f866c8bf7b217777f79cb3bbee70d7755d8731080ee9d725cee21d83f42804baebae74f98e945b46a8fbdcc1944aa50a532915380a6553ca2df3f3937352aa2eb4b1098b3a3195ea3ad510fe2eecb4d61dd65dca3d548d18bb88be2b92a438127def8963d13796597fa8b1832b3d0a49b965c6a03028648542538766574ac93f0a5d53680c4a99526e1907c7ae3575d9fa0e494318e6fe8eafe980e9a114b8d00bc6c19f18b88c7b68a114dea334c66762fcc442f609bde41c1c6aa1e43d21175e4c975785e7e0dfe1f2422ebcc78b80e368817b3c2e180757e1302a3c0a78537852785f1c36018779f124e0302fd9c773141e145e172f021e04bc271c463e7e8f8bc35aa1972b6a5e16476a1e93b9552e962c600be2c09f52892f2863e2cf6c4be3ca2d31b55c527c073fe95ad97614777cb8e355a91d0f7ede8e724acdbd22c3ef704dc95d89f34c551a4d98f83350a1e11941d6ae162e7708eca38373f2e72139e39c717632f9270ca303876e74970a2baae81cbf2649efbbd7fa5efc1affe3cc0a85667ea150287c013b658c8708b17f443795ca8f73ce395f0757f91df41ddf71fc589bb596897dc769f0902e5d2edff1c733b925340eddf2fa8eefe85188fc3159decf4fce71af060aad3016ddfcc6a01a8c797852a314d209f2e60baab00aeb72c8eba4dc32a62e6f8654a6945ba62d63b211662d5c0efbc25791197c7f7c8ba43efc184020a82debda92ddb736e6f7eb8b7fc94f03a576beef5cd877bebfae0f2f81e6d7cd98a0eb5d1df807eee33924983883efdff4ffcaec224dd0a5bd1450e889a10b040a3f31747d402128862e0f284c89a1ab030a5562e8d240612886ae0c148a5ea7fa44d5cae5a2314797e79c16cbc43438a7873866200c1486d771a8572b73748540a2cb81542e9b9ce3b906621c9cf54a3f69239a9e4b77e1a73dadc304f1374778c3c4e95e8c4531eb2e63f00669337fd8f95027d499d8c9ec6eee2bf9e7bf42de0d0adf7b5f947af0bf328f429def086933e7ac49120485f24dd1f7de137da557dae49c2ebfcef975f6a12c94bf2bc19cb33766577609b9d99537fa95f2107efdd925843fe8de083938e620d055545ed04e1aab7a08c34b628c2fc638b82cc5cb44e6829de8b2832d73b91ce00207eed961fa1cd8c78bf25cc3f8b5ccc3cafd6bd90170809ec118ba47ac690f8ba805e3bc17957d4072e54581516054cf132c84f740711cfc21987d3c1024491b9b7f1cd08bd2c20414ef111b10e54a15e139f86b5ca91f3c07bfd800ef49ede0384ce09e54168c53442a010e23c261e1e34f0de1b0d4e34f09e1b0201c0684c352a91f442dd907f4c161ad1e1c36e3301d8f3fb583c3461d727018ebf1a7b2388c14b5dc11b07c1246b0f000d17c2db500137fca087c84e6f1876388c0c40f82f7f33a700dd377c210b8ef8862b00e570bae02b862be835fbbd0305d02700d8000517c473497c0c20354f32ad712587e806a3e05d6fcb7442ed998ba5ca2a67421352f01ea22e00fbbfb9935342ef33e96ec13866e6479c3c458c2398c8062c2c435d43c2c220f5eb28468904790351cb3e6636431f1b3e0b0ce09b3761dcc2f8a5c66f0aa0221fe9085ffde4b3ac6d1d97118332f691141621cec229720f3d3e3b041356689c3b8be2b029c75eeb4f6a2a2baaeeb4ccff33c2f8c79fd416c841164c84445dd2ce6b8845400799b7c0ede0c99baeb12ea77bf576310c4193f4e22f43e64910b101a62dd307127f3c6f3324d1695eefb5f7732ef28a47220a82be07f7f45758302f8df17816591aa0453258847a194d038744b2f3d70cc3f32e9baacb5d6a3d04704fef7dd58049636a54dce09bdd1f3b27eb01b853c2733fcc6fcb58820456f14ea1e0bdda1f29631bf51489bdde39b02539fd7e9ec37b5d27f4d1f83bcd7654c1f9d78a55f33e30e7f63847ec15128685573328708f187413572c4a298853c146c6c348d0b813426cda847a1cc0a0a594fa0aee45cf946a152649149a44621d548e3352721b224539eba38ebcefb5242770a7d35b611c9fc696d76aeeb79218b755b5a9660ed1964698769dfb9acdb53f361d2e09c8f04b5b6b939834139dff7c719b4b42cc1a91bb234eed137432953ff357559a3e25d30011d99fc74afa831ff76a552fe37c7a025fa7377cd8bb3eebc0f4ca942715cb1c8d68c0e9a9a1d3c6c30c8e0a6c792aed4c077ee6fe03b9703dfb95d38c618ff15660dcf61e2afe99864f01b188e28acc9acef8f937d561f663cba1c4874c5f0405bee879eb7257f985d79cca6e7f1e49cbc727956b93cca259aa20b4a155ea82d1eb825ff96ef43f775c9c64cd56a4c1ee67d6d5ecf795573c1fc4ad277ae6a54dd0cbdbe2e9738e65015a652aa55ed05f3963f39ae3005a63e4fe53bb7fbc9395aca0b4f662ef53703de94ea9a5e199ad9754d107b7284516eb392a2c7125568a00d1c62b8e28a130d64cc81822b4fb840032e80f23a7d930494170974b1c502a000aa916072884243993e6060e00811448511a28a6c3a981bb6c8376c91c31cb1714605dab861082cc4f03c2f6320bc57c7c48f69fe1806336a061e4c5cb3f9018c0c53bcf6cf59a5ea9cccebaab5a68704832e27f353ea721ce187ac94e7e994f77daf552c3d769d089a597f2e27d3269aba03faf33a283664f01105d5011f1a0a8c59a3c9a2ddeb9008c20360b8487145095e00460136983983814ac2cc1d9839e71cc50e5d687a1665baf880131e06310e098a9fce39e752c7878d09cc9c73ced7cc36e0f7c03836d9c707ce599411c3ccf9c59cf3fbb83e7ca85c38553e60d67c0c0182616aadb556993a7b5e152b76f03ccff3aa405183e784a9bdefd39dd69ac646f3f0e01e9d3db04a027228abd89043952b58aa3c5d798a2386a714c8f0640228f0e90b73c674304f1478914b77b317c30e32a4740c31d800ae20cb47021a3c3662e83aa03def0a066af0b7a206ef0a143580b9a244161836f094845923554938fd8044192f2d08838d144861c52b80c60e4634600716d0200490bfd36c62180c08a3013631f565351860764000753e787e8644f10ce1c93e9f3b25badc3d4ff9f37384ee481a9b2e6b31bb37b3fe1ad8755fce588d1bccce04bb2731cefd3af8a9bd0f9e2cd4b0400be7963c363c43602055a667918608cc1acf0a869bf58bbceff789d0df75eb8a0b665c0993e50a1833d600ba626600023b7421a6052cb002c8bd754bc7389806264c0dbabe3cb80747d10095718ce8965746d13084a9a3ac841e904e3e3a285ddd971a635d3e9993801ef8fe9e4b9c83e480fc1e6a4bf73e401536003f406a406a10065db3c7cda7bb0f7c97b802f286bcf14a9bf273cef73839e7fb3e92c67d7c4184196040ba0e6d48a82dd826747c04ff0d59feb8e441de47825fb89748b8c31ceabeef33c2738f35075943766f42087e80a4d1915d34b38871488c137af6f191cb2f82ac89ddf7c02f46c5f086e951323c99f96dbcefc19f9fa4c13e0ee44b607920afd441668cd10883ae3943426df156d8225d9bfe65f0bbee311732fb406dd1afaff7687d4df7f2c6ecee9521ecdec32b2049f2467be5e79cee71724ef7505b2e4b05648d34796e969045ae42c7ae30bce4d52b126a0b8845c00fb5c53f867f75e0f7c1fb36d79160a77bef1406c8028413592c2146045f806aa459a5878c2652c0850732bac002c8df91b28f13102250838637561044101900aad9989e7e323dcf733114d0c50a941881153b7801f2ca1f337b0dc7cc3c663ee38a1542a025890f3cb101167c71bdabb5b41155cb001727c0e20a0d84808d33c0320298c38b233400810d28808c2fccd4125c6cc9a10b2b36942004403ca6fb7bead483186920410518095ca18367610617b37b11f7706076ffb827bfc009092f5010c504b0e8401465564098a9259a08bd771f350f733b1a97e7517932b3aba65d7f008e6b3e995e8a34307818bd05e9e5ced9283306015ec811040e6200755dd7755d59b3fd98ba14af1524489a9e85196d989ee95998b18359d3245ec2bb99053700e917f5f7f85c929ecbc645e3031b58b21063cc0cbad3394a9324cd687a1662a461b24c07f3f400b346ca91dfddb1eb267503de7cee18bbdccc187bb802d2cd8b1fdb701de6f79addd7b489f377d9cbb9ebaeeea450d1d9cb7fafa94bd09fb58f2cc290319164ed64ea6ce20c84313b11df22b5d4b7daac7ddf823715dfb4aab77d63d79777eed8e5ee529c741b7767d7976c2fc5984e996ab39d3f9ad6733d426d3f642bfbe308b51da1b61fb93469674a2e456d3b29939a2aa5b99d213db19e9f293b3c2f117c5e407eb0297ad26436556d7fe0722d9b5b7fac7b664373473ff64da5fd70c739ee18c71d7fe0eedadd45770c80cf036e841ef5f4647afecc084118b686c81fe6724909a14bc99d0d84b252e5e2c73a6b9da1085b40dc7b95ee2b79ef4baed65a7bffa5f4f7aef383e0df5ccbfaded739632ab5fb9ea6b284dbfce08319a4f231b99f762979a952c9d3df81ef64d6f07b4a5e2905bf3f97b0f5c3bd17d7c04f3d7685a1fb5036bbb5d54bf8bdefb44b8a8da9e4bd9baa520a1533f5d825c526f5a0fe0b9652a8749f3fd77429c5ddc4b80236e4fb835d8b07ec3e3a239de8c20f64055f20fcf7c3ac45118bd8bdf226e87b4fe92b9768c2ef954b34e527c10a94fea7fcf7314e3d1e9fa45ebba05c08ffa644a7a7a7d015030940f9552e282c17287f0c2400e9cfa295fcf74717d4f8581e287cd005f594ff965056f287e5537e550985e581c4a7fcf84597951185fcf99fe07751e5c272b15ca0d4872ea8184800523d960b14be16c5d285100a84e24062e9c296a2f0efbba07a0cd4a5bcbf40ad1c48295ec6f44aa5259af02fd1a45f3fc17fc71b14f4e32fca7f1f1c9f64ecc11082d9870a9517f0e77fe1be7e2a5b8abe573d15282c0fd41579dffd0ba907dfa9c4f0405d49e58554d9bd57bee03d586279a0fc5ff98277bf2bf3fbbfe0dd14e8ba5c58341496186e0c5ba490705d31b8a0b06c914282793f065d6e91428299dfa356085b4280a1e2e98d2b4cffdbc5f4efa04cff2f09b303b3050f6617bac3966eba25375df9255cf3fa3736b94dbab2e674e36527fffbb7d5e6d7e47b77e964d7a63736b94dbcf70f07dddc5bea98fe3a267eef7636dcaf54b96eeeafde8142178b25feaa7461f522f90ee442f8e3aba07ab27481f5aa1f4b17b614b15ef52eb43e0c5d37b75cad5e2c6fee8fef0444457c567973cb1b14c2677d51f8acbfb72c52fd585261bdeaa9b43eacf11df06fee7fcec9ef0424ba6e6eb916894f8236e39325152a4e3a01b14a2a5b6a4bb0be7c623dab7cc105244f7eab141f244b128b00feea595fe3d961c52a9fe49c560f1ec6e50424ba9c80420ff1752ddd12b2eb3e893f9654a8e0724e7ea3724acec9bf1239102de7e49742e440ab2772a0f13e892c34a460f35e236e1623b4183184572fba584b52af5db75c92824dfd2cd78d1ad722d6af4a2a5456bf2a2fab247220a8eb859559ef40abaf5d2e667e24997581c22b8e17c8c75bd2f80ef8dde8bf0fa42a411bdd306013335d9767b23733a3c5ccbc7663666646bb21cecc88332228aa728b5c8de08cf8216e6112b3f00a8f58543da8c7e8317a4ceb7e6370ceef647868379ca8b8e1f9e7ef260fffca9a13151eafc56837be771e8f24f370d5f41c3cb2c9e39a3c348f37dcbfb2a6c968323cbeefb3fdd87e3c1e3cfcd3f1b53ed6377e1f8f991f83a779cf3e19fccc93bf1279bcea3570f1f81e2e1e7fe3e2f119b8783c06362ecf393ccada8ed2f663d680a50e12db989f0d1ecbda975faad463f4183d468ff19c76e05412974cd58ce3387635aa71ec3ef0c74f93d164f498b1e67e4dcd6b37eed7e839ccdaf87d3535ff7d5a0cee199ff5da8d5be4d36f98b5915553c3fa6aee7f6559d364ccf1e747ff25bd9ab2c63add0769ca1aa8a39ca97d0de7b2caf1bfb2c6638ae1a7c7e831251885575db772105cadc0cf4ba95eb55a81aa5fadc01aee0204c70741f0c515b812555f66bd48beb8129f14c55275bb8023985721f8e3083ec65ff017fc057ff998f8becff90b432f0cbfd03ff40fb37f88bbf8be30fcefbb5cf015a197de7f1f2e09df47adbd9a4dfc0cbccfe287dff78de32a3fe9e3eb70791ec7af19593d1ff91f49b69ec675bb88a54d3453deeb985195adf61e7ff98cbfd064128354b4c2b00b7117ad30ec5af88a1047e12ff80bebc3562bfccba5f5d84bab86bbf056187ecf0a9f85af68858f04b7eeb3ca0c52dfb19ed50a75b8583fe3f29cc32abfdbc54c7dcd269ae087642892e16bfc057fc15ff0177285bf383c4ce891d987754bd72d2c57046f29ce40d678c06f065229f59d59e331c54f81aa510913d105be8fe2bd26785325fef2f9085d383a3da18e6321af59e3e93efc055f21830f9d6f06f29a351ef37e4af5e2e7fc4af097fb432c55aa9f2e788618c15fee8f8bbda4c2cbe5cb2df281e5cae58925fe7249b0cc5388a487386543e83e3468a332f2e32c506cd1f0b54692a606b2e6687c38904aacef5acf1ac9996fdd56ebc71fdf0d528b61957accfdca2216a214b11005f7784e43f7e9312d0490de5fb3e6688011e5c381bcf98d66341bee213f3fae9d827b567accfd41962c56cde73072c34756a9ddb83fba4782cd55f7e9314e3f66ad7bd6c9f4bef6632396351e1cb0fcc0fb947a41e8e3ba04cf85450379dfb98a4820cf97f0745973ef0999739e30053c45fea0bd5c40cc13590bd682b528e3ee0e47082e13180873ee12fadba005a6915a09b326820ed31f45431593e60a11de8bb3f64f043f30890adc7bc19402a272ce29151254745da70a8f98e2fbbe2f148df8924aa552e2588497300cc75502a218c725e338ae58ae89c05dc40bc60b9715088690c00ca0e912b012451cacd52886aa9478730942ff8b7337baebce4bd04427de7b6fe769213e2472cede97313044d775dd07aac08b0faefb8129d16feec295321d8c171b3a2f2501115f1c44683a1828ceb8f7e20c8518ee3b190440682da67944ea1f4cd3c17481c2dd47bfda073052247102d525433e29c2f842fd3fa9c568328e4ff01d7c5d4fb4649f22289e941b361ecd63efbf54a88335e2983c66c6efc6fd713f2d06e3d4505e2ca596eca3a3ac81368fc3638a7a0c95f2d363ee8f7b73eb0a7982c31cc915a66b61640c79bffb9a1113fbc033588545784577cf387311e23bf97a1f89c327d987e5b3fa9c7acfe3f839075495b53b85a90a7fe5729c1396b5dbc5547d8fef57622ff7072e8dcafc24e7e45459f331cc5c7a3ff8cb15821f5329c1ff727fe0ff5e30bd560c644d4854cf875f08f6e220f177f9c9a4b03746172c0be08271abb197cb250a47692ac85c9f999172cbb05c35fcf96612fc106b70a61b99b839d37a3de3daf13afeca7883c28ed7f1453bcad6ebf8a29ab2f5340fa6de041f831fde990f41f07e1ff6bcdc755aeb2e670f63b39be9bc6fb5defbfc97748dbf7a249874b11e49f695cbf6638ea51e737fdca0ce043f740565137c952be89ae0a75ca44bca2d6382be93dfd3e102f3bfa09d58b86b010f3a2801c50e0d28420c2f4d783d6ce0c51a69c0502507304eb840c00206b4c00a3010688307a724a4c0c0d31424c862c453143f63c2a53052c0012a36700618a82635aae8228b313350a0090554919d822893460d32a4c086123cb1f40e62fcc08232aa2861011ee270c3898a16f090850251c830869523ac2c20ef70440b8e0863650b207a606207333f6801f0f33a9d71d6c1747f57bbaeeb3a06c4f04318440461831a43a840079cc50d6b7881630927cad8613a1823d4c882e45cc0567081097429a3060f60e81c5eb0040868b802864b19739c61acb165072e88280201592ed4104058208604e020430e5698507cf779f68a80e187cb0b12d08231e10f171f26800005c8400128ca30230123d0451c61ea179f94f122470736e0822e6e00fae1c205fc8ad0a1082c668d04adc8df106144f0b5d63aa5b5d775351c336b500f91854a634da3bdaed35a6badb5eeb23b98a3b4aca1841133dcf04606340e37081d9c40820c18262003694343e60f93a00d28cc80400992f05286039f35c9e5838041fffb7829c430112502214ed08307fc3dc9f33ccff3bc110261065bd0020b06c428a38b2f6db831def064021e4490041c69546183077e5a835fd779433440242373c95c54e61dbb1c17e90559d39ed9e5cef49deb323bfd4dddb74cadb5d61dcdbdf722c125e83b3934af67deecd2e605c10c33c6f87a0e57f84bfc2098fa84b839e79c7d0075ce39e7c7c1e2236d481a1f26d03650d9c1021cd042460ae060c16a08080f4ce1012178380105b260c01adaa6878fab4a757180f6545d0f8ca36b509d20634b96359a78c1530d4260e4c0c51822c8640101cf74303970f172004d2ee6edaa480101821d3070adcb90c1e6023319fc78805fa7830d5eb6d15aef30b5aed13435d00001840e2066c83223c70d2d13d440b28100561933acb2f0617ca207514b113a845ab2e0a092a387d4181bc03370f8383083374510dd0f0dc841ffa00310d9e3d04276ee43096cb89ed9c0d201b1021d76b8c9925529d007224ced69ad754a24e5c0b20519480051051061e82e1230b5d62c53d3606aadbd0c0a7600c10c5c1cc1030580740f9bacb5d65a6badcb9a0f1b1f41c0e043fbf0a1862f68c0e2234af7e082212194106381196680401728ce087d90c011488869830636e0706344009007a088830a34ce500102a010c3f33ccff3bcd074303d789141ddc304c02ef595202922c1a9ec799ee7e5ae872740a72714c851011b9ae0220b2d3ccff33cafd3369fe960ba7c89000f62b4a7713a06e49c3baf89afb301dfa647ce3923f169d086044533a050428d2f8a480205542001768181110f8832c3041598401143649bb7e981d383109f5fe1c5070f83362428f6c0c3e775363d70a230f38b3a3a60bcd830c3e88659f31182ac4a7958cc985fd7753d6c7a3cf8815d5a19b42141911c928724017a3a639bae73a2cbaf938738200fc18142cb8763c3a3f30345115dd7759d91214670b2cf10287630bb6e48873364c84f6dc8ca0c1e0d7a1d1434e49cf3e3f87817dc00ae40866f0c969c73d7755d171098397764745dd7755d3260e69c73ce66eeba74d1759fe7a01ea34a1a1560228d38a0c8103173ce4d74f9e2032a8063860a58c91df9bacc34d987e7e59c73ce397b60ba5801f5f9ff7d7866ed79c6e81cd4e871cdda0fcfbb4779603a981cc4982bd3c16431c2acd174c9294f531183eb5c66094461769dce5a6b1dc41a1da83b4df37d5dd7755dd7755f07268834cc0e06a0aeebbaaea461990e26082e3c68f1aca85266a4b2e779a40d0d496303ba0ba0e0b0620d1560a9018c28dad06880337400c3146b8ce009322070c4f703055c40b085951e5ef003191e1615dee000153ff820860336104518a6e7bde8791ecf8fd656a832d8798f13e56388cb41451055b4a000022fe8e1cbcbf0c2122ee832022f7aa0a28a0c85a8bbdc457165d5e33dcff33c3163c444e1010f5cc1a2f374d6594f91040c6590110115c071030f5a523a062725def8620608aab4d144193bcce151364e84b56be6f0620c3ac6faba6ecee02db3eb7a405e3c3b2993ba1ed1d893d6c3490e9e707726d586b4ee25f5ff69ecc9242945d7160a0c16c3b1adecc4ddd42430986ccf54998a940eedd9b926e152206ad9d304b445d32103a0b63345839634d97038f3087bda64b175e3a69cb729e7edc894f32643d9145ddb293bb6d9f368dd4fd8158e04119233c2b2a72d8992753f6161b0d8edd2caf6baaab26fd5f4f70d6dd3dcfa48e8cf762bdbb829fb59f47fd38abe88516c5563b34d63d114457a20775fc99cd420cbefa357db9fed96ddedeff57cb6b5e54ea43dfb6d3b42d9744361d717dba2379e1791203b3b4adcfd3a4e32b36d54002d2d09dd4ceb5e3aa1c5e5d6554d12343b81f65e83642c7a83c1d8742ba92d0cc6c260edaae2703936b66fe78ac4e6dab385b265e9693b81f6468ab14d27ae6955db73969e4d6ce7ba7127d8cedbaa3a619bce2730db5edab6184c75c26e01d0d893498a9eb423476c679baa0640579576c4886cab80a4aaeb132830d846d7368663cff69cb5e95e372d4593d89b92f68cb5e966d3a1d9b9694e9464aa0d28655267b1d966d92d5357dc913d5393a80083194955b4c59db067aa2c36436de7528c69a7b8dbcac4886cab7024857d8bcdd69309975391d2219b4d4d321bdaab2a8bb17b096dd11bbaa66812ba9eb0777b26ed3529c98cb5ec696b5974ca8eb1b6334d4259d6869eed5602a5cd9db06f3976af38759dcd6c2a8ddd2bad8dcdd28d6373ecd99e4a9250a4544db2733b8782bba78e4b4a51db110a651fc999eda419ba1e993846645b0536c6b27b4d4ad1a616959db833b6733b27254693b5278e4567b373d3623229b79894db0cca6ecf164a528a269d2cbb9ba4688a9eb7bdb62a8dc59d291bdbedd9b2b1a6d3b65718ecb65bb6898de162edb6d94e5c8ccdd972b79cecc8ebcc86cef57c62047736d97b2d024a4a5135a9cda931dc6da5c570b75c9be654592c89bdc570b75ccc76b66abbdb73864b2109eeb632f105b8fbeae40050772772d2c6e6ee62cff57cf2e9de4ced3efacd9e7b95a5e837d96ca70c4dd5564dd5dbabedb3b3bd5325996a3bfa135eb3ddb6e8eda6ca6e009464e7d1cfb6cda6aebf8f3e3d65df9eb45676b2e9b9b69f6e9cfaaa13ef03277974695575fd9d74ae6acb6297933ca6acfbe8964b71df74da36d175770c9ce4a1c4dd3f48d9adce7e766edab7e95ecf27eebee3ee3cee5e83b732d0f26a378bb6a8ed4cd7dd4ed96f4bd5155d4a979440091d65844102122260630b263a608400359e130885aa05c51739bc1406c0690aa2e87105045e3c605d310108579631480f4474e9b283021b1f6cbc08a309252f68a008012398e1b9098c66e9c6e14ea3a7b528d3af1bb5ade7fed94ef73e7af683a6b54db73b10ee5ec55b1bcc665bca1769d3cdee15f7fbe85b36777bdb4ed393267bdc6da5fd6cafa74db6672d7a436dee18c81d9b54dc3112770f72ff827077276f95a1c41d9370048fa0e4ee1a13c9014dddc93c19f977fb5cbb1ee1fa67c49d75adfb39eb763beeea8241b48f671ef4061f06c14ee77b9d077e39f68b8226e1fa57a4739677fddedb75437088fdde9b31937bbf8befcd9e01f0c5f7c33b88eef5eee7f88eaf8c3d0f47f55763acb35c7d2f565d15e09bf2ee6a9cf7bd357c2f0653c037f8624fe34b027caf872f0a97c7bd198316e8f2b7ba3beebd1713c13560be445c7c3d7c2fceb18bb52a35048bf708783b1f7984fb61ac816415c63787d5730fa0818441f90976ed5889ab338eeef0cddef570d5b88e9d2449bf7ef5c577cc053108f7e20ee37caf90fbe38257c418632fc9fd00638d2f4f7e85188000b8e34c06f887db610caebef93a7e825f75b563d4f337ba36647759e03a922c70beded5df1d6fd6823108cbf7275f8cf563318573bb7b3f1e0d84039e8b551e88bf7b6117630f64efa6b0ce4bb7c4b97bf3ce4d85f882dfc548f0067803ac41f6ec97753d8cefa8c9ac310618e3eb5d8d74533e6ed8e1dbdd95cf0d1efac214be47a0f8e18bc205efcdf8eacbe46a8089e01e38c41fee6ebef8e20bbb1ae0107ffae62edfeb73f3c5b9a92bde7b8bdc0db02a7f17d417df0bbbd7db8169aec6b7d397080e6fc61bdc9c31d6585f2218df0cb0eaa62ea8f1bd177635c0aa2f5f0dea7bafcf5f1b1040233984eee69bbadae6a652b09000371bdc0ef4c5d8c3dfbe640d4fc8e45e7cf1bd77c73fc7f9009c2e19018cf117c01162c208c0b5861b2b9c6a3c208534d0f02217190ee5880c6c28e7174e74c4144410b9d4135038a246e6c939048909476c900226670f1e2247d8fc2072ae1ae093c6e8c3c7a5ba3d695c17f418954940cfbfc05f46726cb063c404d6416301aacef3801082113a26e0c0e8450e9ec78c1ba1a30537ea72f0d730b86777f70edcfda80587fb017251d8f5b571a78cddee51fc89bbbbe0648b85b33d67b191956f32154fda86276d8207c2df4f0555c8053c759df801808c2afa08209a879844033c043c6913523b543d6c60784a09400f206f10b69e0806813f9e2a17b151755c3c815e9e68a25449f9642250209ef1d49579eac40c38f024b625154f299b15fe8a743f3a1eb0d48418fc6045d7f0c472b15c79a7f503b46995b1d28500fe7c46322b1b019378ca4d80fcf0549e039e72e865a0754220f96a51eba882ba103e017819782aaf26d28834299bd48e4f00d90556bc0c32172b9d164f1ed4f4ed631e68a06122cb6be99b777212fd44e4e1e16f85efe673d2d5acae17e64e8b39679cbf0ce694aa87ce5f0adf0ceb89aaf579dfcd9f1ea27fe80b62906faaa438e81af0b472409596a76f402556f41956cad87b9917b4d181313210660b2d72495072c8b2048884117cd4d404637e7c40b2c08f000338c149192fc0d0000738f068f90149106788f105982a24e0c4123f5e00f021d7e2c0ae2a38019932c200030b289c5e28409401b0708213a1200e36e0b1630a299c9c78c00b2ec434e8a1a61cacce3043caeda9cc0b58b0822804e0b1a32506982caca84202513c81c30d33c40a2080154e7032f48517596080025a9878808c2fc0605105150b4882862b309c808c18615441c51410807adab3a125ad910c1b6b9cb10516527ce9d2440e36ec59ac005108b0c2d09222b09cd6f885175b1021440e507b5680000c052d29e26cacf1851717c8428a2f5d9e6842871ba05a08c0d00845603e4380e4ccb4b49761630d332eb045165848f1e5892674c8e1061ba0d488b51085841faf39e430a104d6ea033db2d440030b2bf02061030d4d53b6a4cae41760177472e038c0066806e026f0123708069279ee2bdcc921e4dfc101ee716fbe0c3206d746f3b83b523a666632a959e28a1c331031087ba85aa90ff43eec795d97af7b502a0fb878fa525f4aafc09e2f9535108baa3829411c4f05fe689175b5e8c534531e734b8f0143104fde0a7f29ad336af0f38027950ae24cebacaae021375d0afa7a462af03482094a5a3060add226e4b0e0290456400853e576b0160748aa609d41dec15dd7912e84309e3c8f832750352ca02b59a88a0c4f18a4561069441a0304d5e04056b58227236d4ac84807f24be5b153d233d45005d42b4f83cb1252a50d24522070000a84e387150e3b24ad8f882e6113808b151d1d8e2a4805002f8a06e12362650247085961000e3b481ea851660202ae780a734842c03006615d157ae4221f063d55541f114f05aeb2cf9050d64015b48227d53734420199dc2c0952a5988850664626f0c443ebf4a83c988ed153854bca022ce0490532d9e08886a72e93ddf550f0545d110f842340612ef501c8c4537d188c4a523eb493140f9a1e00c86007086008251001a08a0a7c7d4246213e434f3e517f1974b0dc9312f5078fe44b7d2afda32b41ff20b9dd4d76753b7852a02c135952c40654ed48f95449e2241c02e2681fda87c7802710565a491742b741ca87eec1029235b0f2f4fa713352ded1b93b4059801da85053271e10268a8b130c4802014e2e4c619590b6cca8005106c0820a29407962420098c07e84e000c0830e5e6781451913b8d10609473c2833c0e03302035d2cb10014969000d3a0460cbd2ba6f8b28589259250c01146109102ce073f5e42045104a5cc1c6f1c0dc00463aa88a92d1d7040918e14517d4ce490c527d581319a600246a487074da802bf1e37128822ca9e9de0240043414b604380e4ccb456a34ec00d33c8308386081470e2010c705a41059f1e1b1a9d81302950e1c8083da9cf7b22862f1040c2871d683840110948000e27383952e403f1ca91e3c07068323f068bd16de0343a342e19580ccc81541822183803f80b3c057e223b819574edfab81c801a743d460c300f5c73695a3aba19dcbaa45ee1b053e11408e2efebb0bef95ecfdd55dee306703244623b3adb145d713ff64c95a1694ec7fda654516bcbaab2b0e87b4eaa4e77079d5409c0dd01e0a44a08a9c271a347523fe771fef70cfd16fd224debb99e34d99fe8b74d47512916903e9c70f795932911b8d127a5e8a6317d0ece08463e4593f6510bafd78b00b424f788e07817e4eeadb7b490ae33f61b8293200aa091146dd93d7b9aac3d6fdfaae9b35b9d7d0ece96ad3995053700419fa5bb3d9ffdc4ccd24d7e517c493cad4d4ab7ed91d4df32d4c6feaa22ad67cbfe4e4acf35f5f29408da01eebe736bbb59db8974474004c81ff975cdc94078983beaee3827bd2d6eb9b405958e0a07c7857741a5a33ac0ff01feffdf1d1b71c745dc318c8887e561514cf087915e8e37e3eea4931e767f98ea612dd2b6fdab8c5a5a12bafeb748db66c49e238c5006d94de1fe2cdae68efe5974d3da87b1b334a71e3d92fa6d4e7d77fca3827d7bfe6c2bc9d0f4c4754f4e0098bb67e06417c56d47679bbb75a63f6cb68fbe6976eed576b6b926abbaae4b98d4755581ba1eeeaf17bbbe66eaed477b43daab2afb9cd435b43ee0c5df88910782f3ee9e7277d6dd597052bbfc08b501d96177dbd4aeead149ba4fd1da9d270a1cee1e8505155428223318ee5eba3b76326be15e1eb9631f77dce38e4570f72177ddd2d9c71578883b16e28e83b86320ee98c71dff70c72f77bce38e752ece43f70be5ee037012bbb167aa6ccf785e22bc78767e44608f7e2001e1e11101c879741424c8cc070852cf8e8abed8dd9eabecd5b4b62c9ab4d71f6ad27acaf014dea2361cfb46ed69b4c3493cc4dd679cc459dc6de7927adb6b4b0924eecec3495c0077a7711207c0dd4798b26729ba6e36459f45713eddb637f2fbe867b69c4a633fc7dd83b85fd5dd536f7d000c771c82fbbbe399bbdf9cbc3cb437a4eb85bb5f0c82afeabaee4fcf9fed74cdb57b6dd37ddb36dc0dfd163dd7f69352b46dcfdbaa22fde9170977579df421dc7d74f2bebbd7387943779f6d1b7a223dbbdba6a37f24f553156dcfb28d63a7b4b72d4b55273058d196a56afa855d5fb3742bc9cea3d846d7b647c88b6767a7284d76de767670ec6cab29bbbed875a3eb7a1e0159f7c5b8849b6930b04986f6aade7eafa7cbc11386a4911e44d218ecb6e13e022d27931ce0eeb673b3ee449201928c1ef6ce84cb5d01aeb79d9b4d51a42677af39398016b83b90934842b83b09462e55b6eed9aa7e52aaae4cff3aec464fa29c19c32924d1dd5fb374b3e7b67d7bfe3e6a4a692de691f3c206c3fde50ee2a155ad9deb5ed514bdc562297a9ba5a852ecc84dc682ed6cd39389e95c672d5a9ba1272e4d813d519b294371aa0cc5a945ed86b2676a1376efa07643d9b6a373a7b0aab6935df7129aa6b0b6ac7a8bb567cc663b65ab8ab253cedb5e4293daad2443db36dd280e95ed75e39ada983ae5bcb1294c41cd764359b76d969e4c36143667c3ad3928b33487b4899a724049293ab3a94c763b650951ba65ec56b29edb9624294559d596a4c56d99cc4c37ee04a6ed04775b99ac1b69cf768bb22a6e2b613ad719ad455738925b5b768890a523466e321660b0204b37190bb1d9926d3bcaa94a509cb9c2092f1477feba955695298684a4bed6adc49eedef2021a96f84c5d98dbe8c62a96af429faed66d520636eb8661b5d03337177ed9808bbd1d69c723681c18a3e65b7adddecffb9e6ced835223664d4aa362846dfaa361649fd5565d12574f6e76c9fb69ccc76ca5e6ddf7db85f36842eeedecace74c766e96663ea6cd66e7607178bc57037d9149c67256a29fa6cd3c9643bd9dbb99e381f214280a06c130cc6b653f6abddecab2d9b7b1da375279de9d9c4e89b8e6c43dc6f1a2eb6692bb1e8ed81a840012ce4eeda31111907ba00f982cc4983244092bb8b45d9147d9ecd9e6beee469a76c1529455bf6e7c5b3b3a3dad8586e363bdb74b7291adb4be7b6b1676c96aa47b126597bced0597aca62b6a373dda92db794c2d8a65dc20bc59dff6ada4a1fc2339d2b6a8bbd64a8ed28875b62829904cacf767ba6bb3d65a92a23fa17fb463f486dcee867a86d1f9de8d2cf36abae6adbb6ec665bb5692bfd6e857eb6374b634f5aac6577123a6b73381a7b326955758dd1d89309edc8ba67e7660283c950a029454ab22ddb38285bd6a6fbd6743ed949eb494bb2ee59baa1a8eb1e40aa3a615176a75ba8a9456d67bbaa4d78820411c274ce864e96ddeb6c66a2ad2dd7a48db24649a32045398a12254a19c5dd91b8832e21eee0cb0bdd3de6640a5338bbbed6cd06b9cee23a08772f809329e80001f2e27901d94955b616dbb375b3ebba44e984254429a836d2c9b27b23d9ce5c2b3b9352b4e9c4c568ecc9e426636186c64e80c1f64d95b539f526632146634f5acbaa329bed94417180bb43a102a504a237d4d428b695ced6e8935254e96c9b662751144446fe62da2993fae7cf4edacb49221cf7170a2140418bfbebf6e7afaa0c6dcf9bdae6cef47c5a524e5d69ed0c49ddb422145af774ff388982ebc9189e93aeea11ceb728abbe52f3c9538ed14dc6c22cdd50d8dc6e91549c74dd4ccfee1df404c9092338e18713841c8a934ede7062c4dee991bae29e4df752baee2535e96d672e3d9be070ea6ab3a14c4db623946555dc6f5acbe6d47527a5e72ca7cda96afbb373af4929fa27ceabc9c6e6547469af38d969c339b939b1f117ad4599ce2663f8b957227727e26413a8262f13cab0e5d8a6a39fed7627cd72e9496b7f4d7a16358102a409adbf5816a7b6267c2570f12d650a7b32a5e723a95fc291008861d9197bd202c0253d67fba606e0c90327030034e486bb173939a4c55f4639af331b32da6baefda593f6690e2937fb7d54c4c8663b9318fdf96a9ba23f4b734bea2d3d8764432b265edc5fa98acb9d3f4bcf23b57d1d9df5a64a59e2ee2738c9248ab3b95f81c907421a10a2e2af36a7fe6cdfd096d6aeeaebccfe445bf475d6bdb4d3a6731f7dd3797b16a515fdebcfbd84be5007eeae8293411898e56cb2146555d9b32d7a6351f3d5a23fdbab9aaab4cdc49eb41b7ada92a0e71376efa0348526a2b38582820d3d839214a55be92cda2c51d3469b66e76689d214da744331978ceeee6dba97da742f2d71770e9c548286bfdcdd88934ab4b88e1224eefbb6aaed89b6e80c3d7139297b6de2641231ab8aa4b63b7b4dc2c553f4b6ee76cfd80f3670320916f757929fdcdfd41589f62dfa5b96a2ec8d93494897eda46a0a14c681a6bc5295c6a24cdf9463b39d389f32a99b560464a324536d6fb3a1ed6c6f992cc7aa69ee37adc814e32fa45445cda857538bbbed36ddecef23138b6cafa69149be729a2461e19154f457dc94dda2afa4d7c641c149245cd8bd91d4d9ebb83b13279118bd66bbdd2beef791ed68e98d8c4c701209d8949ebfaa482c8af4e96f5a110951eefe9aa53915e9f791eccff6dcb4d62401ea5925996a6bbf880424e41132eeeb4642ca1d6dd989631f497d25d969fbf359dc495bf79357528aa6e8e7a8b357dbd77ea138bf732cad557fdf54f6d993a9c8dd03e0e4112daeee28c9362dc9911ff7474242674f6bd1a6f4bcbdaa16b9bb8f9323c0e1afd9468d8cbe688433dc7d052747c082beda26a5689b53d74752bfe9647a35fd73ddb4f6379b3b65fb68dde94e7a1df6649aed152d1a21ca2d97ee3732fa4d2b9aedd9912336db99e4c8b3e7171939126b8d4c51818e1cc9c1317293b1d0b27b76db2d1adb1be948d37aa2321469a7fbe82663e1c81415c8c80f69c45f2d1881e064112d803859048b1761a108cfab05231b278b90af168c7e38091bc35f2d18c19870772761535e2d18c19ebc5a30d2c049188ebbbf5a3082a9fcd582d12cdd2c0cf6c48800bf37941b7ada64b1d98edd645362ed2c4de2e44f05dcfdb56db675e3be4dcff3d9143ddb544db2ae3b65528fbc4ece4f1020b9d799ed599a538158599be6d4dbc94e399bac1b451a5af72dc7a66a92d9aaca3691094447f6bad1f57624e727f73a3f399ca6d83e6a3a6feb9e6d365571ec5edb9cba6f68bb97d05676c658b43d9b66e7264a4ad159ba9f34ad3b87c26b55696f3b8f549bd0ef56bdedf5cf4fd59f6d25996afbbd9e6c529a0bfa57537a3e12fa3a3be96cd9673fb8bdac4557155d717f3e7bfe6cb334194a637a9dd96e71b7ddb6e72cddec9fdf9eeb7ea3204272469f9eaf33dbed29436db89c927fa9ed6f25d4c6f49be95f48eadf36adfdd9bead2a528afe667a36ddb2bd7ecbaab767cfd76177527ad2646b4e7db57df6f77ab63775454a67fbf7d249b3d9cc7f3dfb6c4e45d773e999d454e937136bc20c655355c6aa34a667d34d6b5fc768a7aa13a3471afad7b3e83749c2c2abed2bf9578ecd76b6e823a10fe45b3657cbb1399c9f6d1cee5c5b16a5b5ff48eaced94e15feb5a227ee738c58a39feda5d75171d893f63d2204f9205be9b41d35ed12fec5e2ceb5fd76b3ecf94929ca6e34555f4debce49b1a1e7d2f92dbbdbd3a645b0c476ca541358364d81288576afb2544dd2aa4e369b423a344b736a50ab3a5192a926a449e85ef7920aa5559d98ac924c35814935a15d55dcb6eda2367782926cd392ccf611bacad8a31c14d58909b313e8044a87d876b3acd9949e4d54b5685569b2f4dc44499a5adc6dc9b61da1edba97d2a15675a2c47674a629d8d0a0bde66ce819344b379414b60150f696bba153ce9bdabeedcc49d90640d9bd3e8bfe2d81bbb7e064083bdc935020552d529dd86cb9a0981adb6d4eb6a7ec9507c8ceb66d766755655b969e399645632d9babcdce58bb59762fad9bdd6b9ab3d9cebd84dace186e6fa5586ccb561589d69e7b1663526db633b66ea416b5a16d2e164340cbfd16c0dd5127733a771fc1c91fa4bbb3eaba0df04929da644bd59f9ddbf66afb6c8b1e3d8a8494637fb65b2494c6b69b6d9aa2ae6dbad92353496c0389c558eeee82970649288bb6b6dc2d88909d9da414b525a5e7ac693d6fe88a8b2da92b0e77c6667b457153366ecb64e7aa22b59b6dd7cde662b3d989e6a41ce5d8a35cbad7d9ec6467b68dced098ecdc48b176b331db96a5a72c6996abc55a76e7a4ec753db74dc61ee5d858bbd958bbd9f58ccd66678bb6e99ea1e79a3b77c2b85f2fdc935a684c51946edc09aa93212f9ed7cfce4d360506bbc9a6c43ec019012f71f79be41e71f79993383feeb33d4397d4d99ea9b2747f93ed6ccfd97f110fee6cd91bdaeea43587639bb652acdd2c10f6281d32d9f575634f261182ec6cd989b4b38363d9f575f4136407773b5b76dfd0d674f20337dc7daf6a9a34346b65bbb6d736ddb72d4b736a9a9e7bcde1d61c2eb6db73af3276a33b369b9decfa3a6a9aa2aeb89d59acc986c39db9d86e73679beea51d9b8222ed1567b3a14a4ab24d93c5da9c4a6b51a658bb5976279db818eedcb458bb59a5f5bced955d5f471e4480cdfd3efadb6e876e6a9b9eb427b1d8c3f64ca5c9cebda6b99fed75b7e97e588acaf64c4de2ee39ee778bbb2739e9018fb3eb8bc8abe725646767db4e19bbd3d4a2eb89c31ef8b8c17f0423ff3023a36fd913f75b969e4bb3f43c72e4276744b65598d94e98a526dbeea4f52c6ad3bdaeb9244decba5124b4559decd986b277d2d94249429ba42acaae5b850eb4604fa6b7d94e9912273b9822e464073827edcf4fd1db6ed1dfb6a41465df244b32eefe62dbdc115972717757d3595983bba7e064e9e3feb2d936137bbe4eba97d0a44f4ad1965d51a44752ff5f4d365b0ee9653374f6ec7e24f55973b6836ebb1dbaed76885dd5755d426bd115b60d775393ccf66ed3219aac3d81da74a3b2d404a202bbd973db36d1943d4b87dcfd03275d077077274eba76dc5f2dbb939272ecb7b424f4f61bd7d49e9bd6ea6c5a9bee5b2e693d7fd3daddaa4efe35dbb4674fdab3cfb49da42acab21b0ad376d2234290bd575a91d22993ed127a440872d2a0f4881044652ada4aa70d288810a693088810a693884708d349442408d349f41384e924f209c27412f504613a894408c274120d09c274120909c274120509c27412f104613a898800613a897e80309d443e40984ea21e204c27910840984ea22140984e222140984ea22040984e222040984e22224c27d10fd349e4c37412f5309d4422309d4443984e22214c275110a6930808d349c4c374126d254332166db27790bbe3b89f4e723086bb339d6b909790a18da8146d7485454c32e594a111190000000003150020381c108a0683e180208649eeed0114800a7bbc4e624a15ca83518ec33088828c31c020400c30001800424353e3000fad6d555244426786c2764cc76ad55c31310c571d7f2ed1ae1c5020377296dd44e2cf3d659d01075025af7afff82bcbe25d941214800c75b7eebfb570868bcf74b79dc53ade15375117b07f1557ddbe21f9f21978e202767684e4891c9e490b335c9d4a845a79b7f60fd73f48cbf3f68754850f8ebe05793f6d6d8c93d56ec2877a77d46f5bf54edce942d49dbea98e6513b07a599067e649b3d5dc7712349a9494c78f015e3cc49d4f36bac732f8898166efb44fa1bd25470579a7a46b36b95b4d5e03c267594126c3bc2efa0737eff6db6a604e04f14828288e9253929b5e1dc13c7a4598bfe7e5d946b5a28aec41befcdd937e129e8469fd13e1c9b8416f8d2e5d9f2225b8da1c8cd6ee230e0d3371cb125ae4f2b2ffc4c04c742614acc30838b8755479ef7c07c1f1c6b362a0e36154c5ab79b98bf7e2338c8c27007ada70821753a10b7cd111e6299089e4ded88d4c166aeaab6dcceaaed53924f326df4c4831298145a053d65c8e3d74114fa7ae154a77d701d391eb1848d179c13564d99933e62469e49b27884bd997b26e6f54abf0c901b8dd8de11a1d30dc62280da2f0eacfceeea618f9511690c48e0e17f396a7507ec594f0586f5063bdcfd37011a01443f161e0bf99dd86f6337a183a43832a91c215d747cd18a0838b371683ce250d9883767c8a06f875587b85b50ad19510e28e5c57d3780ae7e4ac4da07b619a710cc6381caf1cef54382b09f3020feee7e16fcae7ec24f80e097ff271b9b5ab3f27248642cefd9e1a13c71fe57c01fb56b0b70d9f5cc023e74a06ce36538235676be2922c2af94b62cf432eef19b3609e0e6148a052a394f862e9a216585abbe51ca85445b993345d172700f3a6a509ddf1dd299567ea48f217cf833ca600c5944109861217e38fc4317ad2c657558ad9cda8535d37a084609b0c21d700fe012c6ee9fcfed03fd6646fb1fb8ea7314ca72f4cfd5e01fc8c882cdcaf8b387707f0c0a3f14aea9f860dccf40be7cf79e89347245a7803518dba82569c9413766abbccd312c1abd37a2b29a31917988f61f62c4b45e42db546d9dfc1f82827ea5d2114b8dba25f1d253c6f38a2bf4b56d7c8fe9004b0e6f55986b12c27049440a00d36375c60f15162b89f7d999315307209c9f7a492b58dcb500a12fd2d25e70cd4d35744ca72d779ec9ae13d4d63c1cce36c5721fb547c374b59ce9c96a0a2acd1ca6b155c9c281c807f67619547517d1a74e24c5bbd9be4dcd7aaf18fc10d3485d348159662fb6f77f161722611959d450eea9dc9245d1dba90da478b9781f1584126da0ffdbff337b67e05b4e790102c59f1e6abc90797c06b012db0bf1c4eb9a7ebef563cfedc05c554988f196203a5365f4eedb5d86916c4febcff3fdf49879074d4209bceafb98230780e78027694cbf39e5076b67dbc79a643415d49512f21371e1e73b97d8f9403b461151df3f3666930a5394ca56fffaf5fc0a44f893dd0ae4d7e4afbc3e332bfba3153ae2f15fd878bd8513a7d139c1fb973e32c840b82f19edede10c4fa905de2703a78ef5f81d0f56e2a8d2bde2ae12a51a8d959f9500ac73d1785179fb3058a1880a6b4a81c04f05ebeff7c7a65f410f2526ba5df7d8d4ecdc9f6fddbebe04a15cc603fde60c17b2c836baec4a6dce6f85a7a057a9a4b56c996d5ffb76491bc81e4ebb1a9b4403215cfd961efb0dd4c6dc97777455babab7d5eb48b4ce770f251f2824db8a11afb66893bfcaddb26c023a9a7b8a166a7ff1709f160c211da7afb337d4cbd823316ac7b73a6b5dd4c7c1f180043cd313d8b1db9a2d6acd0465e0b975837ebcd85032f055ebb0b68c89d2826b17749cfa7a3498892d4ddef51bfeb9d5e0944804a8087387367eebb8cb965c90ebd2645c765d47ae2ca6f32878d4399cd3158261c3ce7c7d398c784b99b7956d4867dc3c2c39977c708d8f9307560918e3c8682c729b3820c3651be98e3e093a2d93d113e540c0363da34b83887cb8bbf93fc9d307807526d7aeefdb0432ff80ebe06be91dd97c7417ea9ed3c6b0a71ca64591ebe056904883347c657ee6a715ff4c5a3982548b9f7867ad0bb49e22e9f8f6bd2f56904102434302dd14847e9f40fef12f77505b932d4a900fa3d008ec590e46bc4c6f2b48c685e4b6253d2a33eac15f2fe5e966d550c9b9bcdfa329e13533d3f2a3874e283fb6430c7acb81b6710836fb205578c35675cf54da9de6634568b849d3f36d4e2c773bc66e7925ba80984fed71f98a61f8fd8bf0bd908fbe61becc0ec049f6ecade38cfec100027b298d4de76c2e3339936d759011d36fa8471ab033d0f858dd1d7230986957fc3ad59bc6b3d4e1ab2ea569058ec8dfe3f87bc34841ac53f9ce7ac384c377a139f520f1b4a4f8c89c1d452b1895d4452820c98cc0b7736e35c1f52279b8a50c64bdd9136179ea0b1492d21d2e9f6d378d4ddfdf77c3e0b87b391e897241422a1e22f4851698397be29fedff277eebbb60ff86ce376ca6f3cda73b87d5aef4511c8004a95b482cb13ee83415d7bb7f43dab84a48e4afc6fc03e4c8b2eea4f936b7538617b86c1548356d62324679de6ae4948f3f7a2a0478e6fdfc668ea8e311f4fa7b8d0d466d7c05bcc25e825a93e8cdbacda6eb2273b72c6e7a53fab252007858c87609cdca1c343a6d0ca1a3a8f2a457fe3966756ae5c14b88dffcfa50dac0f6e1a33e12dfd0084c3eadfbc39004acf67bd69a68220f98854c781b95b139368cf3e70abb1ef8d8a0866a079662afc6ec108c2402b4ab254a2055281d54a89cb945453f95cdcc1c94a1d1705e9b94a0a61be1ea2b35e8b5fe4366d583224efbe9ee3e9e8d8137bc0dd822103883bf4fc9056122513b2c00c857c052434fba6f44f6df4f2606a69a31eeab3dab7a0ee0568827cd51c4d0431e182e6eca202d5c339f478c2b892d867d9b0a685a293699518df6dc2d06320a07e313288e92191f723c97858c6c308f67602c8a85d6324282e614612b9190005a7587c9a0af368a015117f7f534748581a0251621b90c53a9c7124bf80e1647b3592d05d9104a1da9f33dcb8563380e78d36b269c53e5830416bb45ae827f4798370717fe073b50ebc7c6eb9c97ad105c6dcd2f76468f71f0daca3826b5185259d01246fb21a16cd13e9a50788649b1e8878b1645713663675d273ac47af6e54d58512103132c6caca58cc9d546915298fecea4c2e276b6f5b09f968a39a535562184010f36e280903412a222dc395f7de757066efa335c69650cdf0cb223f0a9b6ecdc9be0ee0cfddbb7cac608938b282767ad11114d0396680967e51d263f33639e75359dabc0de8cf6a648587724bb9c626a32f319e7b8c5708b656a0d5dc7687e9ca1542d87f04a7d488d394cfc162d23320d800fef6cbc8e317b9a5bcb7e67bc678d7b6ea1e4a077f3861d65dbd0d40f0ccc7918272a3a024cb6f894f1e18254955d737102507b9cb2f6d694c0e8e7185228fd52b485a0b562f457481d5f549fb9039958487061cd730b8c80c1704cd3acff64cfc925a962511e74ffee8be80b0bcf149568e3c777884b8bcb736c3372b034e9f80df5dd3eba9464350c69eb3cd4274ba4aecd604fceb3f2a80121f53a70a497cb2387635acb4dba547fd6319782cd5966bbbf24bc6e2cd0667a416414342a48dc6fc4101872519f62e55b55be84ba04a30799a696db3390e18ef9fa39afc2e7c498475c66d0e40c186b7982e7911008d52b820f8c623866451226549435d1476259038f6c1e687fceb0a6036b00d497a144a4f9cc4dc3c64cedafdc38196f4d2d0b8cff81810ad664075865663d37eecf67727c56aafebb8a8a5ad79efc5ac41e95aa9a43e94b276e167ebf3ecbaf8a60db3a1e34cbb1ac6fc056fe9daa3659e666cdf16e93457846b8822dc9c4987adbb2676670bb94fb20e34e88b1ccddaaeb990cda1f8c7364108c62e84ed9e2d3138f3a231fe2874058d93277550aa11c939e4226b4beb352f9bfefe610c0fb8ab4df7b348bf54c708bee81254835484236cfc78a17a176188a89c46a094f1df4cb18eb93c0d07340667e0f397b028161641f5d75a7208aa8927c98367fcd1d10cc3ed6b7fce6073751cd50b9fd073150a7f141c435909eb2ece98f8ba88e40b103689a7a79241658cb552265499769a2262c2132dfacd430701eb31ef0f4a8dfc7be221af90e5d1c6208ac5437edb87edcae9e84ee6f2cc3f4138ad6bc87862afc9fbbfe16598aa394b5a638e7d7519ba5a65730d4cc76923a102a57fe47cee35d56f6f37906b5045454eb7b744520a302e383bb81bf51ad7171068732b1a670218ad19c7cd28d2929a8d448a92a72c8eeaed4f8175828e59c05196e2ea8d96f5e31ed08a156846ad9eb10c63f45ffa34b14901cf1f5d99d87503cab8145ce43530fd970bb7242074d2f48070c1ce98c8d1cc55eaa67161c00828e84c1f6384acf5e6ba18f54f8f41965c5d6223219589ca237c3234286468269b6141211483bebac9ccbed68697bb0aeb6b3d4736a862d817819b0b1398c842cb68cce95993c07e0417689ba710aacc051544c44294ad96a3b4bd07737f96170022fb190408461d130a9e0862d5e06ea6e5dada20cbf3967452e8d94694f09ec5e5b1324bd3c2fd3f00368423d635cc7d37b078588fd5671752d38840fd83a8f0c0c9f1a3ae64e68c368df81b27f46929205d5c1bebd0b4f3171f76b0e6571ac9ef948b8aeba1c79a285ed8d283d17ee1701559d4c107036915ed23ddf849a685d81d601ff0354b97b8f02872768473505024e336b257bc1e175e89ee072ae34cb060b3c1c33552d899438369ad4b71a3aa4dc0287d967069a41305ade70d13246395ee8f3942081f26a86a6ce7bc910d77d494f85766cb7bb85a3d8e2cfc1f30b05cde42a9a4e44e104d93db25af6e8c11920ff1ffe81c397f5dc3251a5c86228cde1c7d5151d24fb8cf4d1492dcc2cc3905067d9d0853621ceac66cc37205e0a7bc613923515cd675c44bbde2199b610b707daff2000300c1c36de10755d3694e1ee9d6fafeceb1d2b4eabaadde9714833448ea629f3ba17725bda7645eb11e51fda0d345eb7a61f97716bfb4c2097048bc2b4bb5e1e4a87be78866b5ec061ef23f56fb6cbbe97e8a9d43837b1c22b5f36394e53de49b9bc076a8699de4c1319af969340e9297504b12d05f4ebe75580e43deb7b3cac6befa5cd88bbad506c09f27c501f6192f335f052d0a89566689df0857e2417f59258d103238c49e372fa01f885cbd434fac3c6c3dcdef63180710e6109768d94640a63276526bfad7ae11ce4a36b423c4fac4f84eba2d004120c4bacdbf4c62b8c3d7f86b4d3f1ac507773983c9ff3d7c6d7cc2f4d4b3fd62c6148f75eaea4fa6f8dbe829a87117384c23cfbcd214a0f1bcf3966749feaad7ea462bacd6a5bb4bf548bab1496249b1e16170c7a1e8f3665b229b460e37d803848d00f9643b8e43f365d64c160e9721c1a5aed34d745386f77439902cddb28da004f82dedd8f9e0045ce49ecd0dc0ee177895c3dc12b6ea2bb419e02991d32ad51142893040a55d223ef64af4303bea2b6ff15ec2d63060def59e03279a1339908eac1933c67e9cde533330c17e3524d8ca6e83c0c953a6f530bb4eb0c4713f4781fa8d6ad041b7f65724f3be7c60fc64eb147ec540f7abb4cfd798a1fe724800c32c19a8c8f12aa51f7f7240c64ed7d916118da4295f707609789b065dbaa49478400d6b90373b9a7aabde32a077eabbe80e54054bbfa9ee95ca7728d632ccac510c56b9623353f90f29709013ff9dbc451e16d709584e11154ed88eab183ba15a00b673bd342ec88bc27b73aa3b31f65ae0d3d8006105a59cb17eedf7ed7fe835f27fb5c5df0d9979b9cf47ebdee4ca375b0098b9ae0c79425668127143b77c4244a051e0332ca557bfefda8620a74d054389a995b68ded1f91dfe5eae4813f2975825e52475ff36f1cb37a7170b3a5631416ea9362ad6963763d0d86a374d5146a1abdd1744d4b33492196245818b6caf03bf98f3c8ae6c6528d88eface9836330b84469db118a5974dca97f55bad01dea4662ba21d4ac44a8376ad8d45faa6bbd6643ed7f43efd2eb65cff2dbe299dc9f8279cec727c2dcd4bfcc708727fd25df625bc5f7a6ff6dd1d0d5ff70f20be585dd9ee11f17edee0c0093c68df2c1ff2ed5bfb612fb902ded5e6aef061960fc564495aa41e6f1236d15bb1deba6f517a72793e785f32bdedc5f8fa17f5819f76be5d84f80ff5b37b8edc350ec77e0fbf76c297f9c9454ef2564c731f2e4e8881ebb72834df62958bb261b7a5a02feb1a944fdbbf2e8742a6232f0e58684833b407ce9e25c7daa253fef8c0b03d4d03fc25ce521bd06c3058a6ae804ce3dd757adffc6b2b85f4d7401d5cec7eb888b428453365f3fc258f8415e7df2147560378331f747608176383f4f1fef6ae89ad3745266ce67c6753562e5d61bf87737bbd1d8a7f45f321bec75e13f452eb4c3856083a9112dc7e00002cd74c08239e45abfc6ffecb3c3e2e780cc7b17ae5dff8fbec52c7c883206b349e53a26e8870d2e5b0e0817fd74bd770db58099fa3afb0bdfeb205fc0ba5f0d13458d8da46f3eb73df26e37ed1363fabc16b68accfbfedadb9735a0f711aeb1c6de12bbcdab8f1af43b379bb57c9362077cfddc88d9206aecb4cc971cb1a3423daf20862270dba88b39f7a680c37df466cf66091e75825dfb5e16d0a7f29d19ec29f8baca33edb5f54a348333a591d4e33c8bf2303891cc652b43fe0c3be50ebc74cbed09e33ec0b406accba17a2b30075d761da8f34fe2b76765b8d93f8e83ba37977f30d37e1a38bc588aa48a0dcd619bbfda4c7fdb449b45ba1279e371451e2880eb022f728f8fd01629130c15f04868bfd2160b3a4d9276118d41d8782996e34177f1d5122264e29d970bb60b8ee1e6d6d23595812f7a0e7080b7c28a224fb2f938638acfd31e0182750a4d12c481015c50e380eb094590bc02653237d6721df8ed79403d406c1aa513d38717c567eeddb8c9f1a15b2a03c65300b7ea1008c02778da3c833bd0a28b8595c207250824180eb35e29291ce76640750fb70ed6a4161ed97337df68007adc127547449963bc8fe604d375df50b3e064e282fb1c30fdadc7e49a45fa6dbf7737e6541f60d41fd6a205d35aca27755bdbce49d5cc35942091edd42d1a8bcbf8b18e2494e0b33f58b05eb59062cd20f15797bcf80c09dd26ba59566e7361c70fd0f7b421d1dc5d2c05ce9fa0a30ac92bea2709e5ad935aa3a2bec26fac8f3206bba713aa022b2f82df10b13df73be4ae9ed2367ea8ca59b58385c2c7729e5e16880cf174f55b60b0875eef76293af61ede12679c168775f91af271f82f0f8a414347be801305cf99e40ae302f52c9041609d5e98b21823ca9fdcab64f0c66d3efcba7bf8dab11843b1c7e1c3a811a6ff3f2230b1a1da86202c85d9bd58117988ed2075d56fe3c1645915b60c697fe42bb39a89cacd165ceaa3b9f15ee58af76e8f2204e1057ef782b144d4f326e08299822fc738ae49fb69636f1e8f9d21e744cf48848ecd7e398f45ec589d5d09bd763c280cbc09293379be25774a808840257dc11afd332ddab6a7ebb85670f066d3cc0c70072249bdb9a64e6c4a5d030f12119b37941c736d75fe1b7d22447c99b7fc88e2e4eb4a03ee9fac078d7e6452565ce529e744fa7942fa6ee77da6cb90ad030fb698f8d2ee8b93044bed9cfdc48d5081e8db6dd099882a525381270c367dfb42d12d018104e8a8b4e47742875d5de562ce2f4073df7d85a6f61856c094e70562068c5ffba375216581452884562c9c8f4dcc37466e6acdf0c1bb83f38026819b16bc627c753efde8e7f460fa37a1f600e349c4b4a3e7243376acc48eac0b19a8d7b2a8903947f78435603c885df546c28f72381c14ef551e390db4ff3f743b6166686b7fba876c58947a7a48e726b1c445edf20f5f568f623f41e197a315fe687463730e474855e943b884d919e5c8cd8f79837d5c7878c9a06fd305e17252909f1103f026482ebc9139117b25c0925ceb7076be3ff5eae74385f73de0e70359d8d155d66ee479a065abcd9791103189d07ad58865de7c40bffbcc91fd6cc7172084c94e31d3135df359526edebb0640cd631db2310a690253bca9ac93cc68a802834f6d8f8d06c86bf287d545a467b812f29378cca69f13d29c44fb7e20baee730d3e84bdcaf2691d7c15f164c84c0dac680c6558c2854bc95731ba01b646bf9382d1804825df3872ec95a0e56beb05da4101a227572031d1f3d301bfbc734958e88e4e89d439c899462faea23ef0dc03fc012e1a3ae0476b01e72fae78ae0752328b50e1dd02ae1fc100f2804e067bb6c6f46631f17172dc8443153c5a2e81acbbba4cd54042b0d3b0451de2441862a596f505bec95833b198f518ea06855bc2270338ba00c331346b8b722b98288dfebd7988d000b9c0b2fba8437562205239c4f47b9e6d9d9865f33ca8e569258b61141e0a766ed666b8418ada18b28e92d2befdf59bcc776dd3c67cfca24de0257c918671406460f3f920d0b0a4efcb945b9a6506e9d1e6ba28c846076bf6a548e537730aa860e83cf5e3b15d2fd897e49be3a1eb30d8011543ed10a922d0d9a05feb65a1cd1aac495f163818b08e8ec977942ee8f88ad6ef6ed5835818bc564ac74b03612fb240a235f0ec6f30be048a97c742f34a532b3c9dd6818895747fe27dcc7af498dd02169061376cdce155d40a874c59703ac7303c19239005c7c21ec061388a0537b28bb037bb733a0c94fc044c6f9b540d257b7103b5439e9875473e4b1b25bdf44197e0a1acf26245038d405991be3f652585c247b1720abb658ea8405f11d856ffb455b4e119f31035c0590bfd660e49afdb642527d452949290f614edef943cfa0a07a64d73a0e926047b98deae2170768da9c32f2da67006322ff0a0b16a4012952c2c47f8884a9327618e73b5bb7c4887cd4bcd65af9a9cd51efa4a5e3fe25b4853516905e49c48638e56d8182d69956100895a73fd041b46676f64b3439a6e19b8fe7574d64dc7f935f13f6103e84ad89579fa8453ddd1ab5edab172b494c3fefbdb01f909fcb520bcc20a06c1cb6ff9f110c4d1605150f33db713d0475894589a3b78858b4d32031443bbf61a489643a925eb450348d7944cb12bb080a42cb80b957b67b073a30fb39cc7d55f8940e43c16d5cfe9d375f5ceb08ae42ffb65ef12e76f8f37a50f595c284e4dd5bf4e9101c8d3382d3ce39930162c1ada7e2cc0803a620bd3a6400ca2f58e7680d8167b07e3c40fbd17efe2a900ce8174a51d353ab4fc1022d398f14985c60f2e5aee7ce23202365eeb289a0b94812ac6595ad09afdba4654b09f5706c48b24a5024a0024653dcbf23bf6510120192bfaaad784dfa01bb39a8aee2a388bbf4ffa2f718beebafdd787504e86838ae8ebf3f52c0d7f3a343f6d9e8205cdd4a1bb9b374eef54259abd93b229d4666bf1b7b61f86e2c83148112453ad3f1af19170d6e0e850f33cbfdf23e567051a80aa325c053c417723abc41fd6d5448b510c7457afe515985da3167f3b0a78ba96216ac754869e0accb8b02688f7950907542a81ea12cea20268b3a9eb607063fdfe3ded2cd15d3201ef6b574f18228b15a8492c74f7d01aaf830243fe4ea6a683f7c8c14084ee622c8b670df6d11b524f0f3b000c07d3e9a6f6033f9292aabb3825edfae5cf5a064e55ac12d470b84593ab1ef2d77f3c3206db6c1a79130b9231f37fb04de13b6789e87b666b197c5be7dcccf8148552ff1bf27717d14ce53acf424b7f7289e45026177c7c0786ab4f17bbbd5af07aed6a10c181d9a31e1a14b683d8f50bbe41f6cfd0f5c95f60bf9edfafe71890b664dae76ec4c7c8dfdaeb7a4f05c804377785dab69abef1fbd85919fef6660183851e34425561a31bcfa496f0866cf9b709fb4ebf84f5caaf9fa177138ea2e69fc7fb51a41563e383ba5e9cfc8c761ac1a5d9680c9888b5dcf5379e60778f05f54d4a46c404d98b8bb231158c8789a0cff370b18a4888fd8510d79d8fa4038f50b21da0c186fd9c5d36b43b0ff29abb80be046a6d0f0d07701ae3547a896b243d1cb7b2fcf75bece4112894d49c7102e3d20d4d4c04c3e5d8f86397627f4bea6c055e7d5d46021ec4ba2ec1a7490de614da627f4fd0a97990512454e516b2426a9a1a7f40fae4714ea32aaec52bdbc4ef236ebfe27575c99f0cef5a47f461ffe2592fb268c5c017765717865c9e7245b3b2f6937bd56836fe47068dd1feaedd38e23859def1e133fbd1e6fb9dacbdee4e28262e92709d27af31be0ea0244c1ee5431d828864f1db6ac46232817c26b09d90306bf40eae51aa0d87828b021310636e981f44b52998ce1616180f7722a62d3230a792f1d77c925eaa48b4bf630ecc7b0e5e40dc050f739440e4ab46af73d5f2dde01bd0839b1f002e451a515171a909f5cca0d0e7a91b87ff54f5011eccf6870f66f6332766d14077e88ce471dc7c70e9c7d8eb113e735af4a91a95c8259ac3c92ee11541ddfadfb27e4dc5bde33678c66e5d3accabe16ba39bee82d5b08bb5fefaef0d6bf0f81a4a66bdf2f78f19f035843b1aca11b3396a930a4111ab2c894796594b219d56de51aae50627a48850a1a729479342614949412a2c027ae3ca3882781cb3e50b2a5241db35b69d9d217e55eb917958bcaf5653f2424cf9afcd8b8006eacfc43547f46009363e4b31e75a8bd74acad314f7c4d1f614e57e335e181572437d76108bafeed9e92702dd1929c18f70ee37907d3015abc68925d129d41480479b693bfa2534e29835f44cbedb84a54a20d1755d32f1795fe4359f0868905b6d12fb4ca795e8c5ee97dc2a662e85ee84fb9dac187f288dced8e2fc0eda58a91e152602c1a47b11479e8f342abb228dddc4040306fb37b2f7bbdeed9af519ea3268e538b0e94259dedd97a20e96713cbbd09f735de42aae27b8e273f9d9ef57035911fac399e779e7a918c8e4796dd9b706ab240ce47738a6ad9c4d5d81698ae1a4eddc28e519893ef6d66079a840b83cdcc138628621938c16cda08b5eaa93f2b71495a15a904df96a91931ba5d29e5b4961e68552a4605f14bb2b355b2c87b02f4223684b343ab0a1284dc31e34a65f6d8153235f3b5af614880a37bde57d73667acdfcd28f2deccb08296264918b5890b991e12e464c3f090e078cd51fa72a7c235b7e571122392c1de4ee3f1e6c99fea365c7d4ee8d3dd23b7377b6befbef7a9ae45de09b7f89b1a46fb2755902d4f6d69b0e6f6a90ea4db30b8a8452e07941ff1d85de3d619fbf47696dd804bcfe94bae32819f5885408d8cc55affcd67acf26ac036a510f642d75d8ddd7d2937b9d4942394c5e8e75424539bab8d507a5edf3f42d5b9d866f1f0bca38b942c9592d524f7cef5d7e8d95238b7bc840742b312ed90cb28ce404e09834e069e2913440d2fe5def83f704e095c94f1d46413cc00b32c98e6c5a91d6e2a3045ca1c48516e3e1e76e17ec0ff0460db880451fc4a1b72f760ae1a106b89125bd5c49dc92a83ba817f5e20aad81ce5d295ba46fd82b35e182568f9a9396b5d43394977ae28aacb99e9bb723760ee7a5d6b82059860127f8b7ac9f7bcd2b0fad9f27962571be7d609473b77106698ba3a24900bd5b13444ec33240c283736f01ebb7e3c559f8ffa553b3c56d7fa364838f2fc1d2ba07d94ca75f77c23876329a2ffbf296b9fccb938592fa757c284c0378cd9556c071d67515ec38d198bc3f0c1191d2aaef05669286ea380a722bc26a12daf551dabdb02de2c56fb26cdf47d90f561387d54ec845788d7d77e0c1020f0558150fa42578c97ec88a64d61c81abce403eac09d084a7719d8cce5dc2fbd1ab156e51974c91f00d559f05468d5e394c4929c689e6ef7567234aaa507309ed0db260a85fe0635d0558b51015b08a065b0bb6ef9223138b00b0ea84c72135b1ef78c706d38898f3c1699288a8b7b678ce7a125f5f51cc217df58d5cd2ffc812a3b34490fecfaf439109c92dcdd12602c7592e7ad07bd90d21c69cab34a3efd7bcc3fb35af987a728dc46321910a8d04fce622b431225452bb516733624e5fecfd53d7c77f795eccdd3b9278b8571609f60381eacc79315b7d9c56ede41139aa50bd1a4168805a09939a7c2a321e29a924d954bd3ed9a6a9ea16f29c93f90e15234d7e49072accf691dca7dec99d662a87bc1f57e0ea02c7e82a84fdc564ed9b61d6b86c4b427f151626f839dee8ce7586f0e27f5280dc8b0cb0249a85b44dd3eecdcbcc277e30f8e5d1a75b7628754686122a78184605a9b61f30b1864701edb8a067d1f12549cc057cac3c0c00c7474d952b413fb8a3cf5ac1bef8a9438bae71a9974c977ea4096664fee8ebe7e86233772550e3d998e6130b5d261d8b81e7139cc3679944d83c264bb8355508a8a4e94ab32266d7098cc5391d6820a7b80a49a659537ef9d48cb8e845b0bcd944dc657f7170a16d8701e6c3d808fc26d65907ac1a66a4fec8661a3226a9ff2422af952b5127ce656b1227502619ecd416f6f9edfd12e7afdda6c148fc515135b5ea405befb7b5fd528915bda8f7cbeca4a512f2cfbd88f72142208154e70c910a8be7f04ca670377e8cdb3d3dfac6b390a1733cd4da8762856a8fbd6203c30f555eafdf52ac57f5639545f2802ac069c0b6d782ac4c656766b5b68d8658ac62957df7ac1b73ac97fbb8df633efb16a134de474a0cd973adc23df7c71426bfdaf5fb353919896015ab0ca51c23311dc7186dd1d06b1fc687fa86ec2424c01dde8611e40e165bf01bfc6ea1a007873a63237b511a3c9da183aa49c78acb21b7b147fb390f67c2fe4a8d465f1df8a18da76e84e3de96adb0c6a42d2f3a05596637e2b056474f35fdd30ffe987a1b7bef9d363b6c461525139afd172a8d7053ce057fb8dd41d73bba500a56e73dfd5132455cb654949f92e75b086b9f8dcfaeeba9d2ab43bdeac71f5e67c45931fcb63a2fdf57726bcf6112197d6d9ac470e9acb88188b1b027089c71241180eb59d6593db262cf423195383ee83cb61d09fad7fd772eeb781183c44bb39fd9497124e9fcc608e42a630d235d50ee53d8fe43d57c97e6d93a17ab60854f2c7c653a64a21dd193e9922246399bcf017a3df313ceeb3d383a207c2d41a6a4d224ae83a032fbe29f05003b95762af8881855a9110448fdfa0a8055ba153e4da131c10d64289119aea8d46536f4ef54a8064fa1f78bdc240b038063187f651648ff679f95eda621dbd492a9f1b7dc5c2113f2bbd963fda193081f21ae5bb0b97197c83cfa68a1e473ca62c209dd8194e83e4afcaf68c7c8d96a3de31bb12ec633980ff8742507aaa6ae87c08a6bac31af47d51ba9533d79c9d9e44cc19ae72600140fe2ab36dc170fefc3a40cb8ee230a151a82402d9ddaf8f6176008859df59afe9511aad6b87faea2a32a3ce4ccbc6b9214024d962d2938daf51d373f6e253c3d2261c94a22e96cd28154701fa68518431d1879e587ae2027adac3f20ee5245b71ba46e6d382d3f01902f02ea090e0d552f8d1ef4661c0ce1a9427d361d23b96dc2fcdf6e120fe15dfe4b3b081f726376502516e42a7e0601bb0197f81bdf26bdbc55e93543f45af8a4e8962b187d0243a5360f5b6da327f2940180039e795cf4e80ead99a4c567fc12bf1db3c24fe91986370017bf603e8817944b125f05890bf8053593281c10228760f00512ffedc97d7a7f783821fefe2d90873ef52968a0f85135004906cfd00847e2eff35a36dac7234f1182c3205e5cad92e74066ca685e65b54ab761b4d610ec08ad753407e92725d9588c1b2cba4c6cc64dd6e899c73e85e8e8bf2fc2fd126388816747a90e552fe62f420fbe7928d2eda93357ab0da830051edc5d792729b236e89c1d8a4c5bb8bb951c0a9e56492e318b21fee6b5f1e102d769d43cbdd09ec77d864b0dc1ef4bfc27892cf02f42490e96b4b27ec40d6ef457b97a8a580509e9971a1df84b59bc300cf7b446dff6f3a81f9bc104dd961790fe2fc47f9d1481bd9404cc0fd8623002fea80d81f03ca62b02a62e46409a87ad71f87a42b8931110f113fb7e23fb6b19313feff625dd20c32c54ad66660c78ed5f3f7d66ae9949d32a9a64dec9b8f053a3661decc68b9f610c119946c7f108507571fd9f3df23f74c7c90d29d0e0036c61cf765c3baa5b8056e7227dde0af734d3f4ab7c1e00e3c46aa5f850730ef923b90700312ac1e0b54aa0e8833ec612c3eae5abbf542f836ec0af37e0445353d3185dcefa50416022a388f6d399354a7f8b5fbd16fc4574eacbd8b98a9e2988d0c84090e7ea14cf735510deb9a330de1ae78b77b3ddec539ea79a36e5052631784d6028b36beca1b1925198cd433f83a692db69ff58f6a80d0cc5ea3486c3915d48d23e28682be879a9dd067e4c280f3bb6c5b2390f6ea996ab2479ee63647655034f1306d3d2e487b32bf5ab48a2d03fc01d7973769dd5c2a6cfd62ab35b7602964a1f3006f3a69478ca68bebc309634917ae03682493dad02115c1a90487cdafd93701716220caf731baaf4312113fff720efd62b57a621be8ec0fd6a3da97b88d76d0072409222f56a47af1400bb45eb772f898f6be0da444d3310fbaefc65dcd26e3ec99ad1858f03f7f8c3b4964a90b1acc47bdd45d610fcbf64fed1d2fb5037a61958ddb0b05c91c40031d8b911ba1516e97b4bb893e1eda4bd3a8c4d709d76cbe2e07e95d1742b57d164fa5a997fea9ba5e6653e3d2043030760651f2fba1396f6e58941c91b5602c42c3fd71a2fd36a7da21bac72409b58143117942b4be4ab55f60a94251e81d056b2fa6117b3402d25bdd57ab30e3b7785c1eb4a80a37fbe5575c8e5ba8dbce3d4d14de538f17ae09dba4e6c54c7219ccc32d3c84c526eebb429ea2b886101477f60cdd7eeb452e8bbeec4471723b0bbe955ee8649df6ab7bbd214204fc0bf2775ec3deabea20ec4fcf111039fcec224159f3240735746fb0608dc0bc93fb9e49363ddb82fb8456242c9b012a04d76b348bae85b4f18139873a4e45b72e231a1a37101943f077926ff3fe8155260e3b50e8715473e3cc99b6f07319c18278f13ef0948a41a8b84d207c358584514f4b80f14161a5c39d37a59f1bc10f383fad77c075faae37df2ac6403efb0a52e5f927291db171de7d124079b5cc106d98bc19bcf484b5b8e33d57f5d7015a7639efdeaf53c73e6283bc7d07c3ab986bd93ce5cf943f853e144f0b27f5ea2617b91e8de54f3c736d4a99d60498ebcb50ebb04ffb0d619e38872737f10997657183cfa9c822f6a11053308cf86354e55e88ed66b8861e184f0f85d07d2e1dbc1dd5c8880a6edeb523ecfa070c379bb9a2bd6b540b93372a42c030d4956e31c21959eedbba64860ac7a35996e113d64e705afa0080eefa3ad2a3610a20c56be5cd14121131be5498471b52a94fd8d465e17611599e04f4632c5af8c678a5f196502ff32ca247e649409fcc82813de4fc699ea3e19cd147e329249fc653493f8c97826f197914ce32fa399767f190f26b8c6cd308926e608430f6f838996b25cbf2164d8de246caa260cd9275b659668ce1c12a7715385a2accb62c24e03eb2a20386ae96da4905c89b8d8d067ec0d20d9a79066ee9660646cff58ae51b54875cc7bd08dfe0487123cfa9ec7278a9df77cad36d69d52d3e746569669eb49a193a687a810d1ba19c737ca900541732f1ddf28fd175bbff946c80b84b921631a93183a6b6ab0fe854c383a15bd4622b151eb5871c63969936ee460e92ec4360f5179a0ca90b302a4537953c6b2401bb1f3736a6bfc4952c3e14b156c10e5091695cbf3fb71c1ef1be6a54a450cbe97c8df4a467a09b529c6dab49790981236891017007add3690ec2199f4ff19cd2bfdb7baedde1e61245faccd5ae9d14a5c4ac088b6e4a947284c7919b8554e2eb7401992611cdd58384a434ce157478e8eae4c933fd25276c3e24a3bd3e04d9f41584ae64e32d4eaa4645410bd174fefad4e28e8d4b5d24304987e276d5adbefbb9f503c994b00f5495684c6c037e8a303615153f224a382360574698c839da777f1c0293cf0e694f2d8abcf85043960eb7c2d76a84e7c34163cc32fcdc9b23fbb9e7a2ec4e7ab87ede0673f388813e55a6e46ee1fd4336cee402da66d4be95255288e011ba5eca115aef09573ca516385a711fa8fb223b402b57b254a1a75c7ccc18fa0d6ed2f13cf239ca1425c24914ed918e8cc64ce053aee6d8bc6800ca0ec18c89fa41806c3c2c7c777369ffed3e5163f3258636c4dfb69b6e90a676c62a3b068a9e08c9162171d4ae8c834d4b2116441b1c3341e8dea658975f6c1d3633853a496a39b9cda9e32df3c844013be4b76c440940fa6cd3cad1b535b788acf2eb9bb3198e0836e7e87c7ce5275eae024b34e37e6cb05fedd01cd271c6be0e437e8c3dac85e4170e778bfd6ea076bd386fe410e621c64b5228b4bccf76122629a3415fbacc35bb28fd18affe7b0aa258ec66105a1f1300211022419e0bbe81e8d84235207baceef4c4803aa56fcd9afc4a825297eca79d494bd62461b711528748f64360969f5d4051303ea32c8fe4c9246768b5592d781e71a1de03686a2a1c376e60a1ab660ae7fba6b1c3a18de2c52f85f95e9edcb489a785c9e7742681d466e4052d14c185c454269d970055dd73c79860bcaabea79750f07faed190d938ae2bc67296730a2fd101e1c3be2c968fe15ca04cee1b4b32877f5c78c7088a673b6d7df928d6e02856b90a7750d5a8a2e7c9388336dfe045a41a1355425a566fac6c0083b58238c85f8a6a4ff6f3b1e347793488340125a63d89080ada42a71310a9a9523c0d859df12f1d7fc133e436700b65f7f860530415145b1c61759518b8a2784cc7bf12650a1f2f18423fb900563b6a6f74fa41db385ff6740836410b84c6cf0fa991295aaf50a4da34988bd439a31a3d87f8d12baebb45d30ae4cfbf7210aab6e5ea133e9b6676dc6d8190878f042cb9838d350397b1450231ec279be4d980e2c97393b8c998ba6c9481bf3bdf5803ba681f0e5ff23cb68691ea22f72ef98f900fba1594f68d035b71328f8910a12936566c34960a30efeb0eb61c2fdd9ffd70cba3072fd0afb7aaddb3a9de15da5428241ce3d597aa93dce4f6a6bd77c3537000593362a7c1a2a7e37f2f0fa39c95bbdc6949fc18969020061274b10b33b8232cbe0311665496e1d24a1b44c22e6ff947a347a3221e2f17f94006f4ce276c22cf4aa02cbf04e0bcb010b841231130e4340f7de01b7e667dfd67a6d201e17d741edd204611d9ce0ef132700d895f4e698693abebddaa7732adc60fc39206b02f791b30de8956680a84522a855bb597173ac096f2d733a519d5ccf6180b05fe3a6c20037f2f74b5a99a611eef72dbdea15cbde0a4873df888b0ae78e2b9e55a228a248a150b6a9cf19d1e3b14d0104d2ddea10c1fe6aaee32ab86ff74fa8e5587c4b2f29d10817cf54c7c4f87a824321b337179a299d2db843263068845749753b1c4f27c94bbe552c4c5b580f6cfdeae2c474c164d06e6aec631bdd02a9923bd97356899317743ca00590202e285334f943f9398a92d7770fedfaa17cda648e23b879be3c9893fe05790938b340f43557cb449303b9c4bd283139b5061d922004b06557899dc776d7a0c3e0db90c88a7be575fc814d63051c125a2d4ad14782a39a8b58bca582b070a7292bcfdb804b327cc1e5bc86642b9d2f5234bd8cd3040845a40837494cbea15a4ada3c507e885cb2a726ec5b5815052705f5bd29d5d82891b1423d4cdf0509058bc2eb064a6a639594597fb6f74d49a6832d3c74526aeeea5f4008eb28bb333e15c305e672448c1410028bf2f9b2e0dfa2cde2bdbe055a74cd55a468dfa70d7a192b6ce493b29172fbd0e2725695921576addb0c0bb0a108e39ef82e40c2b5e1f754ce68d0b131adbc3f729becdc51b46f596e25e31f7960639596b19b6f2a9088fe3cb150c8259ae8dd350d22ed79af31f9c50bc979bbe96dea8814521b61d496c612bd5a5d6b05388654c6e6c61524f193465a6d5efa06e05f4e26dd3e213fa7415555743d102aa6d0532e4be7256926422a2e10f7e2445d24ca87dcef79f761d8d5a49c75dacca8b8ddcdba9c57d7fa15770668b48da95d69c50d376607983630841947a71ddd086f42365bfd853a60d2a42e6c55638156cce1dc701382165154602b5e8c39ae754ce328f85b61f32aac1d2f6258733c00ba6b3edb733183499f22af5454441903cecc4494ee788231804ae25dfd1cc3f281ae64562cf7bdd44808e3563b237212a0ef8a5ea221a6ed19139f0d7eb311a09c523f5d34039e5f90de0c7c3219280bae79c4086f25a802ded46d69059108ff62d1a78c11d5f93df8c76c7414606ebf8c95da4eab7bb2b720b5a9ee3767a7dc56faef518c809ac6621412116d490c550a4bf721d225c3595bab72e248069412722c08a838fa6fb090ecef12386e04f313b91ac6a38475525936d9debbd337552d2be74b2ba87c37cbb4e6d28578bb1559ded291d5c66b0a076b2508a875232e20ea75e873dae737668c040a39c8d215a260c997cad058e1bd42fc631fe453eb8905b0dea737c4a13512e616385fc5d219ed09f06f165008dce1f6ed9bfa75004990350b24dacb0cbe451a14bae9ff07005231f8258dcbaa6f768b0e62008d2e13b8839079de1ed6b9000a8e0c7800dbd2871e3ac6b590fef0d5b17af461676704b41f878f7e850b89fd1f1f6c0f85ed40652d896321547ea8dbecdd264e76ea3abdacd4fd7e01923ccbf669f18205941d03360c0acae92330470c0164491a26c2153b35d5fd74179928995889fcd5d08373ebd4efebe2889047d6f7e1741243c5123dda63e5fdb6e885b874991d1c8929a273f09cd21f5164d25b1f0fe20c784e7ce29797e90b437b34289a8e85cc78e423f4048fa94b000e2b63d678983bf68a0cac7ab257f54a80cc3edaa959ea85873f93c2e11c98bf944ee66983387764a7cfc40e345f42d3109b5deca45f7b1dcdbf48d3b02b7a649a053b430729a3c8426fc8d3ab193367c4265913f9557ab0f9e049cb3b930774cf331ab7b17a6d3eb44d43629b44d02d8682727f441132bd199062194941fde2f1b37b663889b580e01eb28bb1ac03ea809127f1e4a3589a8ff03b47db7cfe9134203a7f565cd7579bb87441e57f208c17eef58e7a2bad11f4d9a106ee0a6066dc61f8c990d414f9a7c2ef1a91ab90c835ee2bdf77a4eb3728b52455cb998457f04f9c40af459a391611a88a77b091f6bc27fae83787cf2a25d33b1d98f69a9b08167d930632076eca61287172076d484003cc8f14a43812da5e63b0700af3757a64378402fd14ae6c5a1e6da20baca4b046418593b5c694a5b764a3639e17204f666da53a2c0e770b80677432f4e81d92801806192bbd224516028c6667d97b14df5d6e5a3e07989222fda28951f06bde933f52e61629d443b3bf80f751aa6e105627b219833a927366515fa78ca074f3b99f4b2dc20e1c94793e580e6f5524d456d253eb510b15c232533783b4f5a881c122457d43a7b7a65768e66e760501a43631a9d5b5d8110448f1c0a3a97a11382789eef8616a451d1433101f9753197d591ac71c528975ab0d3e5d27f72856c122309dae3cfc09cfc114248da35ebc212fc809db0760b513d1aa2d98ca8769414ee4834e9a66ffe90d8929200a3993d77fb5105fb3de7aed70373017906223d44c6bcf0c7072dddd0c34357dbf46b253e72699eb12eaecda7fa0fdb63d59baebaec3d3ae1a4d9ccc43646d8c4a24e2b5d08bcf67611760faaae613d336240ab9175521cf05a3ea2c5db77e71c93fe6e3952c80d300d1efefb9054e610098b9bcd31bff49af046f92deee5102fc63d20f37384e6703f5e5755efc242a295f4a0607c53be896fd80dc0196ea383cd13f792227ae855e3b52dcc2289c75eb7cf46918aba3d2ac433da2dae5b95c99f7b75028b686cc4e41a0226f53d359d885e7d3d719a756f31c25f750f3621595ddfc731d12a31d2571d0430e5e803c96d5d6a12577a4cbc668aca8df9c9ec840fab0f87193f11251ee01faa58605a5cb1cf3a3fe34c091ab1e7bfd04e4466bfd8ee4b00dd500aa786df408e492cfd3d6da50e66a05e7d795a1ae522c8e62531c9c83bf4178bb7e93389cc912d3d36a28ec71cc6b8af8d6d5eac01b1c03210a58ece2328c7086f5b8ebac5970440b46844757a702b34627fcafb12c8a91d42deec9323e8a012f987df27e60422ef15a4dd41e51fa5c7131863c62eb97daf54123c539b209ad41bf09440d571921a747ae75d2056ae288a71246abe0415f8468344beea8789a95d2a4fcffb8ddba078bf589a7985a923d0ceab885a674cf3200f2a6a10e285876aa85c759ea5bb0966d0e55c1c10ad84d4918a304e62d75582d83b34d80bcef2132552b2d5021cb9d10228dd58c7a5ebf2373b47282cfa8a97dee0eac95eda3891725cf66d547c689436ae761719b40c8348ff65aad71ee7155cd5dc477b6d13d4257bd668bbe46195dd44fbbfdcc0f64cb587b54420be90fbc71be8350fb4a8cced069abe85c054247d47a9af80893aa27137e00d3b85585f9982b9f6ed2397ba69d6d2b8295300c599fc0adec3114f6890f7dac00c03d99043e5051cdf3eaba88fbb0473271d4d0524c582ef4816f441b0c52057dd83a6823ef3aa058bed78cd31c0ccf63e3fb24327240388e6f586ee25f194af6f15d3f5a9085a052a0536d630c968b3c251d31324c7a76d7dbb40182a6de4ad787bbb7731f2f06e0ee2d1bc6ebee51c6ed9e6a25932b75360ce14cc4b8bdbaef4d816eb7dbb369c09c0431111322423b74af7ec3c86d4a158edc7bf85b9abbb03e24940b3c46fdbf0fe58bf7e24453098b08be6fd9d18055ed00209127ff9f25f9e3ab987ac0b7d52f1ec07bf3512a424228895bbe346e383de4885a0d4830b056b36310195216e66da8b43bd9a7e5e473c4e880bc9709f4de394fb47b4134d2c388e79d9f6fc6d18e27434783c7005d000e32c910fb4b2616a4374a566871be8fae8508660b161565566b6994ca43ce5ae41df19dda3bbeb9a80e42dd7fa9cace3040afb05178fc284c86c9cef7e691091e0a712bfb0347378bec5fc269d3e193fd1386a60a2ec47770267baab8b1f1f6659fb34c5cae9218b5dd0ad126e63170088b60c7b466fd3525eb4dc2b76a2f0ce09c667a3dc78459ecb4008ee575df98de954f33ae09e2d82f5b3fe6e02d1beddd9535bc781ce66949d1e56f6a490350369e741cb74cb033657b7a24538ff5c75001c9df58735106c55d1ece9e38b6a45b9a33b0a34828a8b96a7a2070bde8fb77aab814527546dfda818dcded48894ec4d9c625ab834e8d66f94d02f70032717ef2428e1df652273413cfd80ae296debb542aeb44509261716203191e56ccb1d0edb12998b2bcceab6df853fa921c1d3ebcc5b33d8a1d96a21f3ff4a5055a1478ebd14c1b60279f219a7a556e52b0b464b997d60b5e5de72cbb34108131dc416c7e0a845a3478287df84b08a62675756221009713a730ae64802da89268c32841650872649840e1259f81103154bd89ca9815361dd793c213620bd276dd300366c63845b8c5f4a642b394a24582d40de5862f7d857a523cab413248b2ca74b3ee0b217a3b6918fc2ed2250a9538031995910453547453fd09cf9e7aa5df2b3a7fd5bdc0a6804196091b2e8db1e4759e14823609ed9c74735167beac451f5a09d167082b2d1622abb62ba3a4c92f7f3b27095e1998c22a31a3e7f0d04913276e8d8ef7b5b5f1046fa37cc69ddc4656d7964c0ea30bb56ee4bc21a34b0caf3b10db40f0f5ed1812e00793777dcdbc53a0dd4e14e9f54f2d90e7d00787a42920e11d51f3993198edb8f2dcf5a6b047b3489d4e2829937e325ad4cf4bb829bcf3127bcbe57723eebdbe25752009745d4bb29655364ebb3f74ae950a690579a97a0c815e2c30ede53ce68a8604505c0e828f7ba775be975febfc09f3eafe750e8091b8039bb1ce347cdb1359aa5f8ab00d10669387fda0628c8e32d1b49bd8606005bc491ada5880fccef3891d6cd12e1f38833c7141623c11aa2dcf43714c48ab14952ed6c77098605d0ce1746ccaa3f959cb2c696e67c1c28155450d940f8f053f3dbf0d68e8c7a6dccdd7cc40c8d3b43f15f561455647f704099f1aacf2d755f01a57184e148ac2a494de6a8e88a5549995b146e7b12a62d211b6a9b82581d70630d0d951ea6c8547d5dc3ee5aaf365553141ced6a64f80bdf029a34924c42e4be189367622eeae4accbc05e5976f549edf0a07e1f8a8590faf8bf70401d1e7a2429f9f32d7a4426fd6a074bf79ae86342a12e43ffa7691b237c0125056d5b2e06a14f890430fe1745f7b807576204888087a6f55606732c4d9d0a608959c1bda07c09e6f2bcbc0b4acc06269e5bb6346b9244689a292362ac7fcc48ded19bfe61a19257b04116e1f3adbd9e862aae615b66c5c60a8c19f12bd4452ed329c40d87a13ebb47472b517e457e8540d4e0a3f2b1b28a79e6cdd8480f3685d3e6561529ca70652892e3e90f94c8187dbe51082d3338f675094e9f0911d8f3083a2abf3dca339afacce713a35fa21025b8ff4b0f474daa2f324e6266de9d0667a4fe880f47c1c906257ef89ad765a625238852504d7b31f831b4778ed5b313b0379406f6e67363664ea80e349801a79e7956e8bac0bf0f081848616813d1a74d12cecb42244d95da0da6c1ff6ebdb088d04fcd6e4d587d2806b5112f703319bee20abfcbe5466d999475f8038dc868ee23541114f93021a28cb3ae095095f1e51f0e641b43efbbfff8eac64c9c98bb8bd727a198ed1c2b192d2bed587e8ede6055363989a03079b477569e602dea2df34d6936c20419769cb3402eba1c296943ed0931d0c4db8d5f784f02f79931762d3e5dc7bf9ef06d52b5aa6588bc1d12c03f9d2b8cf5d4e98602e56fc5267016899e26024b143a8d2a05e9405083bc791a12a80fe4c3b4aa8293b89eda6f3dce04cf38c80acff9f708a163587b27521c64b02082d5d081b00160ad629a7b57bcc42a046be42a7876eb5cb10f54d4f75f45527419938ef5337cab7510e7fc2f2b0b1394dcc697ac7a0efcac30ddf7624bd89e5098b18e27d7d8df42f33a36fa4d0bfeb0bd48164ce5050504d2ba3064e7ad733397790430ff1acef53662e9888f377f9339f0bbaa39eeae51e4871d139f33aaebd37a00b0abd37b1f3769a73bbade0b8ffb5f36f5d09f614154f439842a031d8e45f41c067bcf82f56a71f5e2c77cd0d424388f90dfd0be185801cc12a11506c2df01038529753f5e08d7e43f540faca34d6418e912864b7b09651d6313e18120c5f2a69c2cfc1fa96890602cc2cb7f0b692d66cae6a1029fe4c0ab84becb707d9b85bc49f1c45cdddbf9c0b70fd0768e540067c0cfd15b03f6db72c7bc5191a3fedff65204b6de1b542699fb840f049050c260b6646a7c05fb4ca377a3ffa0bc7743e89e9e480a9c5036bcea8be9d1ae8538de6a6252fed40f9041db00258d6f657b048f1e5171aafc26777c5e30f77476663c3d51f9df072a2c9251e626dae722ee1255804f8b63be2d89623ab6b4d147e3c304835f6e3c2c5f6479c0282605ca62812285b69189e89c39ed23f924d771c501f8a5046d11bc4da3dde6a7fc3831a767c0fb2c7eff375b7f7551a9cbef5ed82b3213d31bdde44868198e6c2076e82ba21dcf7c99e5da1e5e400ad3951c09d07e6b3de4966afb0295dc9b825dd411c3a69b233ffe6454dd00377a4413815b5ca86a5dae74d97d42d4e3ab14479a39b7e87fdf26601cc00b9e08bd72800283eb2467fb6f1f2da847ef288375f0500a571e5a972a71b75159563115dea4b7fbde7c8c0360f7d1a0308934f09979661102592113e51b78d2d233c7b9dac16b030c6b403e6a51ce23f130d3764d734c426f3a5dedf41d4f33f0c354828b49d99fde94437998259d22c11a4137180c373b8e8ec99b5b49165d282babd074238492a35ad54120b65a50f9a79cb0a943e38b996bb9f5cb0cfa839189d78cf694caf31075d27fc5bfb06b5bfe73bc55765ec898affd2c7d52d069d0e3ad359e44aaba9eaf602ce33d4bbebe2b775d5057017ed588f50b16ba547edd48364040fb0f74edfe3b8e3d95544721691978c81142a60cf32034551d2c73ddf5c52f4c25e55ff9968fb75ab43c0501f087e1ed01a6b5c4e803aef2110135f3a61ed6191b6ce5e8b482281b076066c4484882d5611b58d99d0a829ca486f405224e2119100be27a2906767776c312161c60c0f84d01c2363ad09c1726896fcdcbc29694c91b5494dce68b0b00341959fba57dca6051ad691e44df6a4cb27e079a7a68cfc2ca86b28750755704118aa6a20561b20389d983e57582513cdb765312315974cec211de61a6220905374205156978391d88b206b91388ea38120c040835bcdc2f1679d072e5f1d3d727da9ec84fb16ea77da06368d1c47eedd8baa41f2282881443ce8e6ba178e225e4a97c66341f5090276a1316da5985754a9a791b58e84518248d68681737bfb843d56bd9508cb2d5bdc1683f64b6e98ba13038d3aaeb179c267404ef9c5ed4016c00023e133d452e0e167868612a8cc84f802e65ee76d6611595fe1f2229e9f87220d1d915face1882ef69bcb5c2a24e0f9e6c156b2330223e0dcfc465bf74a993ff307d930c8b9a42843a08602a1a80672391f941b13aaaabb9b729d61742067fdaf9d812f4731fd87950ac77dc347f4139c546f80ee4553e73d69e9bc9736bd77d2a4fb5eda74df499fee7b69d27f2f6dfaefa50d42100240f779aa8c9322b7083f2321cfa3a38497ff336c1d019d9379e9717992f97b7c7ecccee7289cf1c7adf98ecc2e747edf8d0a5838daefdacbb09ed51930b4748e73aa5584edfbc8c36a90736a65d2ad2beb2cfef5ae38d221e6fb028e1fc497f2200ca30ea0ec1f28d9b708f434412860c2d0476ab71c06d6d29b0b640119546d0d6c2a9c6e09177f416dda348bf5f391518abed3ee08f5106f093a88ca6ffc814f08499f67154b04fcf400d62060b3fba7dc73487f4346f94da4c9b18a1c224af0c82c84fa9007430495ce2a1975515f0f4e32086238185f8883de29eae0cbec12a8300012e5d03fe7e11c38247c3b8a4323ca87dab67f942fd7474de4061be76fd4c8f47b383e3b165686a108d53dd823022e0567e6b405f4c0e7f97298869992c5a5afb0aaf441f78f95a898078181d0007f1d04fcfe252d96b06d594e73d28cd9554d52758f4a9627c3f64594e4afee406791fa2f6d94f608ba5b3aa53caff1332a04705a83b448e143e443f55774303f348a0ab069c0561ca3989f913bfc463431ca89f3f68561fb880a83e80fe30844774c195c039d8123de6631923d5b3d1de1ba07817cbe6cc20bebc827fad3a26e7f26aaaa9b15f9442fbc2fb5d07a59219a7cf99a1a86ceaa2a1b305e5d7a7ce4eb1739bf30ded11f28083de711991a6ec3277ddf672c4e9054346c0f8516702bdcc18da2d3b888c87f89871b27203bd2e216de3d7475e821dc42a1906861059884dcd11b5ad03c5270b53f277de4bd0b2f68702e01fdf94fef6cf746a8501c89a22a78371a5482490056a8d0d895300df8d965ee6e299a5d86b0262ad05b80467c41fbcfb9f68caf2656d49951509bfaccc8a520162ee69c009c95f951e2259d39089764a0c3c284ce63560dd4dc66b08cf36fbc5e664953bf783710f92f8761df768d79c89fc8a8b39ede631b39848cb4d0609a263fa4db47862a45947d2a8bd6f1eba7794ff4fc1d8c9589e17906ab036f3da5e74601f797041a4883f40cbd0878b492b9fedb1d7b26bb0e3d5b3563352868e1037d611a5d919a82c5f8f4cb096909ae62770b8fc710c8b84e1982b582fd4ddf15e4fd3cc8acf5a16c3b2d0afe5b101e6981481fe399de6037168ea7c45f5a2cf20876b16ab3723fc89cef8de58e90882361a1f433368fe9b6b42e9ee5be35b8a411804ca7b04a45d58973a1ac9cad03bc692a030a16b2f2bb392f9dc658c8100c1485c5f2b6079a8d6694ab4c41ea25f9fd1b45763f192a261ee53170c1be07dbb9ec820f42be143608676640101b9e7d81739248fb0efcbe2ff65fe69f176c6f752a41285924371854e67e627c94a90d86be0174bfadc507e83bb24ee008a028f0c3d8c728fe6f776cd81c0b261daca665920a7086b7e690774f9290fe8477c30d30fd3ffceb6a94fb39d15208c0443d81488b801b53595c5469a530fd5048f0127ccbf2ba52e31df4d10c62a9825825f5645ffb8ce483228c5078c6ab81a327e4165e27d5f24b704d5111364f5d8b9929b0207f031f49d113384ba23cb612817eba7052c257873705e28b9087f07173c9557bd230ca83c7c3618daec31fde0dd3791c66c36a4afc609cc2769bb4c5898ca8244780342d9f754777020945dbe707d28289fe35ec9ab25c88cefeb77ab9caada6a1da715c34a931b86c526371c1a4c6e052f0f9d61e5b2501273feaf673cdf5741775c66af34d787f7a3724726997e574d0c6bbfd348f3d4018e611f2ac73ecf97d03621a695565a2715ecf01ec22abacac76368cb433ec151ddfd660c4967df0e7449af5e99c17c7e1e492c508ba86cda0e4c58820d1c0d803194ab720a2cfe73a35aed26ac2eec00812c84da9a7a4b847f27d69d939e2b36475b0efd5fbaea095869e217893d54e8c7be52c9796cb462290be432fc1addb138166304d825fa1e8a2d6b2933a8152835ef5d7af580449fe99103c884f71ca97b0d556a8e9fecfd9fdf85ad3d9e566f082f947d337095f087c301404c0fb514dee398f9a543cb9274ec49292f0f13cda1f0aef7119edd7750ba109e3a00075bd44160a6931fffae69682c0c9dc3c5cc27c47e7f6b1d58153bd032933f3f569c6764f5addda9958e6be3ea2458b4240ac5323124c5c2d6af3a5cb3b75f793a225c386747a6dc697e9998b8250ed585b1b92c80fa0f77a995fcfd74ebfcd7ce343ed29ce687879824b6ca01362505fa8b9b7fa72c514b641fbf1a9bd55880d52f8cdd11ad5405241b09230f1a4a9ee506cb75fcb148f781b8a03bad4dab5437a4a401def03a60715053218ab92702e5b75983f9420d13b420ec4acf0c43f3dc8d11642c1bc8b45a3387d93a52a882bc3025a5cd21cb85cbbc841e634c80a652ff35d3c3a6f88ab937c97a979750127171914350f28a368023c96b39cf6c63909965c12f787d5d835c0560531c87df4a76a6b2d15cde0a052a2a9b006c2e8c8887b5eff825afe66af1520d803d7a63b0ab66bbdb2f0ab0c3859a56d129c71a9ff6a4bf26e739009f68119a6e21916d8c888875bf96c5f02b6c75e175a3155dc8b9691908b39914a8dcb9aff1e960afc551b4fb5c78e872c0335e5543836ce101554958f9166c757275c2a948778ccd3cef5e60cd9f1482410d3ded02a00b662c202af9a1be29f8e3fe2689b7fc529abadd3837b5e1fa57df8f99f47786fe33e8d0492587164623591e05b27451bd8c39d37b3b0c6dfada364caa18832c3c83bc83047e9fe460e8d1becdc8f40ffd4a7d8117df3bcf449abaa039f2b2a78765404bc5324adc15845ce28b27a0e0551c0c59c282c1a98640ecc3c442dcbedfdef973af4abd3f3ad7f26abcb606de8c33fe956e80a3111b02c4996f04088bb7e784b8849a64393d5c43a5bcfe63a5598b332a9bce0bcf436349942b0209dd405968f482ce5cd07a126c7ce1ef4da3a838ea3b8382e0a4bd72059d3fd60504aa8b0aeee68c7ace4ae8ad58fed60c76139ae35b7d0514a57c26af925e932d1b0a89f34a4b2a17c33c8642254951d3e53f81c6b2888cda24cd7d937715d0bb8fccc31eeee3d32d93d7d22d9965b635679e6219e8bda8a92c8da0fce46a9bff2e648c2c44b17d5a79c63d774efc526f91883a78a9511b9ebbf4bbae78f65b60e9db73b1f4127a7a611e804051b20cc1f961775cba1b0fa4eb5aef33878c864e20b35320a3440ae43214e31f6e1b653c8c9ac99a40c1b5d9a9e6219cba5c85d83e2677da0c13cc1b30d8f232eea3950ae34b07a11d198298ef645e7fcc0baa1a3d06342eb046d5332995607c05f20f283a620abd8d42b001d25b0117f4edc26c0aee7880d61c0c90609c99a51eadcec8ea20fa27226e6dc13f5da3057d6b5380a3150a84714e4a01142d1a5ba87fb81b495983c2fb8325e11217e45deb0a97bdd8da8d846759ce8f57c557c1d3a220f51847685f46ada96a899c4f8797316cb697dedd56d610658b5ccdb2faf9ab7ab0092e5044242c759b527001714a5a1e85dac3d2aeea0054579492766a8f5c58ac62eb3b9e9a2cbec91769752cc6a82f8ddc7e9ee97049f719193bee48bf11de2cc78758c01f27d035188a01979a3155768a26510ac9a1b3e6dd17791cf50212b2c0c078dc2de2ba23541049ab8f9c17d9806984003eebd355a1cd8d4b79c93227a250304b9799c87da37afeb077e8bdc123a2dcda733ae0fd7c01b3a7bbf3641d0cb23f1cb78ecfa639d52355f53accb284a9ef98ccf50bdefe0746b2d8d0736e2e7a77336e859cf2ed72b0342ad02069ae6254a7693e0d7c5655e8c79026c6d70d6068866b695843e70891fe7c87183f2f42fedac3ae24a2ff1b63a72ac4f77c7d53889d56627249b49570b1a67a6d4e89e503b2ce1f8eef53221421e5692462dcae7c40e576ca1d949f57ed6bb021ee5487de2ea042bfe4d56fe15a0c405fec90559d9c69039d2f4e4123aa3cff062f2e3811c0854be4d2ea1da41159dac58ceaf00ae929259c8dc4a5c35cabeea287795b5d318be361e70aa4c05bf1618e189aba5696825d3096f8e22a6c51c5455d2ea26953fef614c4ef655b02548b8788eb628ebaedb40c4562053eb89d8d7270a94a4191b123a1b2bfecd605e23a2355471067ebe876f1c3e1020b5e60189c52434428e866902f952c2269024545d210c9b9a50a3b41175148b36dc926a610ae9f827822a9562baa40829287580041f69a22898697f0ac3193b20951ef40d47cab50f0b8389c6bb8ccc90f67330371283bfeec4b7f391d9b9bf7f4ecb39c453e41b63d23ba0ee73a1a71f6b7fbc6de2271a656f0f61b2f671efbc36bdf3d86438e6b997ed3a2ceccbf65a1cd73b6f4def3c3557635e04906589af52af5ffd2b1b24fe5d3cc2576278177c626f3a304def3c343c333c32bdf3c6f4ce13d33b2f4cef307c81be7aef9d07a601cf4bbf6ad1260ba952bd52ef11f85a58913f7de7686982c132d8a7efbcc76a6ac16090b4730f24493b27e582783007f9152c7dfe89ffb6cb4ad8f816fcb75d56a29165efbc2e5cba7cdb7638eedbc6727b4d987b6399bbe26fb22773d78f7b32d993f9c2ce7af795b9c3ba3ae90bab407e057defa546bd77dcae6fe32ba70723141d4c10e1caf7e5f4ded65724ddb7284deff21ffadcbfc003d852406dc1e87365b46041ca3491a7e56a812cbdf3b0f4ce23e04aef9d2e8e0d87beaccc8dc59a263fd10efeff2258cc8dffcf65f0cf5f244917c7fe9f81760e04fe3f1fef617e67b4c21b008d57179d0dc4e9d20b27817801c92fbccb0410f20bef3a7e3ae0110602cb069b5ab4206f63dc004a087ffba2031471fd85decec10a9f2af7deedda814fddea3db76ba2b1068a09717fd68328a7424ffa52b2f4a19c7c281a3b87f3a1c2d287969d7c331b7be13b83bd97f27148db6ba7bde63353f9cc2cbde833cf7ca6974f05a4b236dea49dd376384dfa5430e95d056abc8db8cfbd19a4124d99f324f8caae6ec6f31ae37d3a9ecd6bfbe2d4c9afd95e4323edb93208ccc9ffdf82e46c93704c8e997d618edb353df7edbcd068d7a646a348e32ec9f2be7d4ce2f2aff33829d75ef6f690c4bd9d2dccfdf0df441bf6a48d07ff179c1f7ab2cc674fe61f17d2fefec42f2cfeb99aa689a4cfe582c11ca45c7b9cc6e97a2c80da8e23cb4fdff9895c2ef8e1daf6710d3bb6fbb5dccf8cad2c2c0c381c7ebbb0b0b0b0229e432e07f9855f24983d47e2bf8e9eab6d1b27f131b2946b9bc6653caf691fffd926f1e2ff74a55c90ceb6cfc060bb4ebe6d3bb24623f3dacbb9bd3696db6b3ef7666d4732f9e7344c0bedbb0d670017b3bb3f5dec6f3832f9e33484b94cdbc9b58781f2c78d62b2ffc2311bc650f65fe881f61c50163bf3b72f02e37a0c5530c8abd23b8f4aefbc29bdf3a4f4ce8bd23b4f80de79507ae73de99de7a4775e93de794c7ae72de99da7a4775e92de79487ae71de99d67a4775e91de79447ae70de99d27a4775e90de79407ae7fde89de7a377deb177de5def3cbbde7975bdf38cbdf3f2de7978efbcbb775e8fde79c5de7976efbcfa80de051187bd1be2d1f1e83d6d0c6e8d0d079a1bdb191954a3b106fcc1187b7bfba901cddcc6e2da68006d8ca905c960dc7b9d07b597b383debb10bf4bdf968fdebb10f73ef732d9af6a78f9217f099fac69922e8efdb82ebf10ae9c6d92cdc741142edfdeae6fe2c0a653e94f7c1c6efa8d830bdf864e47f8ebff9914c6f45790fc7f1e2b71bc48d3c322d1078372916884c9a3fd4696c1229ddbf81037922bbc52902b4814640ab28b6c4116e91c98ffe10aaf229d77c5431f035b90c7fc0f55a820ff6dd773f4578e1bef60304896453a87c92faf229d779160c7e1ed8734b136de60796ddf7330487abcb6e99ab68b744efaa1cfe1603048deb46d9328d2f94dd791207f6e2c12ed38181c23ff9f8143ff87ffcfc0ffe7229d8b89fdff02edff19f8ff8bce6bb5e3accbb50ddf79a2ddafb338f4eec31285d5c78735a563054d1f96cfa7a89772413240b9b6619fefacfb48b85e2a9bacd7c7d70bd27ba7d17dbd2e36123f7eba2fcc31543ac23e0c76fa188629b8dd5ff36128da3cc89a43f76150eb63f22f1669bab7da26b3fb6b66767f4d96bf2c8fd9fdb50bbe0be64ff35980e4b3c0c4820d9f85e21fd2423bd257c18e0d93c7d86eadc29418dd57c1ed1d3f41e7695f859e8f42250a6f7a698646d6f92830e925597b1b9d42d70451bd9fe8be097d680614e86ed2f2271269f21824713b96ff5d2c170ce69069b23ce23e8d2cfd11a63d59d3385d77f78dc4201ec4836489935ef2ff3ae6746d2412edb88b94ff171de368b54d6667a7d9361cd1be5fe0749a0d8796db6bb9bd66d3c31f8ee28def0111df8333df030e3e0711f40e0412e33b21ee853e072a7a89b7a9b99d91f5585effb7d886af81a28ee7746dfb1a80e9be06c6de4bf9ceab9564ee8b5e2e18cc01d3778c7f799e6db02faf387a3adb34cdb3cb169691e58fe9dcaef33f37a4fd7c1be7e3d0e7432391c6c9234cfe3f93b29dcfb85a990d72aea6dbf29826fafa28e37039eded86b60d93ff98d3607ec5afed7b5ed37565ed9ab4b3ef3912271ae3c832182483746cc17fd77ee88d3d6cbbdcb6e30f93b3fd87434fc4c9ffc1ee5f67df9e288ceb0fc305bd3d3cfaa2ff45bb3988b7a995d9206b5a76933d19064c2b7cdc19dce8bd0f7b4f4e4b5858fcebc2c2e41c0716f17fdbf12ab90f5755b8404f2f8376bf0e92175cb0660381e56dcf643048fa32922e8ef9db38e66f63eef1397be8c9affcb685786ed7244890376d9cfbb787c170b4b6b1e37098db459278db335adb586d178dc0dac7e53cfc784e7f1af7df8ebc83b9275bb420833869c465daaef3313d670f617b88e743da08df60b8271a71dc935ff2dc1f9634c8d2d7740dbb4d1eda76366d8793df2ecfe9fbdfbefe75f77f6bc371fc540f4f7ba62ee89d686a9102a6ec7459ae6db21e5d5c7aef6bef9912f6de47c8a6ce4c7595f264249276f699fc7123b0949e522e294fa4b490b2ebb51dfb7fe733d46aff89248ae3f00f6d1cc571e849b520d57bef41764581c151957a2fff9c1f5566d4dba815bdc43df9f17b0eecd7f44cfedb5623cb6fece18b3679ccf37f17bf106e54842e8a53efbd1465a78bbad17be915bceda0f1f6314ecba4db9ff36dbfb99a163521949dde7b290f6d12f7c23b14925e8602001427b0ef893ece69bb2e82cad27b897f634dd79fcced1a545b297f589ec0be8be4d8047d7a9f60ca9c6f9be04f80e153a6decbb99a3edef9bf73fcd70d3f4eac1bda5ff2ff79ed6f6f9c23f3db0b63e35bfee77cf1fba0dfc2c2e0fe9c2f7e22d23fe1882b8fc3201e1686078df6f138fcf4dc1fe272fd49af2ef91bc9e3ff1afa981692352dcce39a8d2c6b1f1b63d80b27671b1ffa1c970bce6cf5bff36ac11c353d93386d670fc9e370e889b73ddff4f741e3df68db73e418490f8b44facf793bf7c598aebbe7ec3c497a1df322f183d576dd25d7386df6eb68fc36e246df368487f4ed6fbb48fc70b2bdf6e77c9bbdf687b02ffaef96db6b68f6fd7d1cb922d2af7080cde9bde777bfaefb77b1a6e73e2cd7ffeecb35da9ff36d62622cd66ea30d0be7e85f038fb2ffb798d8f741bf915f2cd094869dd768e4976b2cfa2fcc713ffc3ee8b7a2ff67df07fdf6e77c9ba64dbdcb68b55d567ee337f6b87f3ecb7f6ecec395c7dad343dbbe71213098e335ede73c89e3bfbe7f1d69c465b2befd1fda7691946d61fec9bbfcfba071609d5d04de79626edb3710b87696e3347eff36313816f9c781ffdf391c1696ffb7fbd7766cc72f63669bd9ee5f34bec97f66c361e31b7efc327ceecd8a33db6dbfa0b36d32fcfe3fb76bf2ab26dbc8d22893f2c76ffbbebf3dac3f9168c7fffec287b49fc9db26f3182d3716bf7cac3d59db388fb9f20b83c11c0dff745efb2049290925b8dee5747c51cad04b2304164020a9cbe920659acca1a3542bb341f28410f4187ef224f1de17e8bdd3f59ed054a78b63fe368e95fe367a5298d376b78de33ffe3589d6364696f8a781b93dc4736f935fc7a1bf8d633299db43b277de5c4a8c6ddc9f1e16ff8bfceeafe16d3464da4cae6db232dc98e3f6196ecc7dfe6b34f9cff9ba3ffc6ef97f93693321eecf7033f9fef54f1b0ec764ffcf7e4cd7ddffedff17c7fbd7d1c36f26dfdeceeeafa9f9b43f2cd237dcf1fe75768cd3663ef766b2ff67443bc78d65325a9118dba0bb3df1feb98fc3e934fccb76193e9cf39f38f7df6a1af8a7cde4daa6fd3f8b7ba8f5209ae5b84fab6dda0c4d69d870f2d10f3f7efc3264fabe7f1d5b9118dbc071b522f13ecb6be3cf9e6bb4dc1ebed9d96bbde5cd3020b1e9bde7f610a771f9ff201111c6b927e23431ec512ae027edb9a6c9d907a19bef7aefc2de73642abffbbf779e1cf7ce837be7f9de794160efbc1dbdf3e47a3a7ae7e500d33b0f47efdd43ef57617aefc6de6be04d8feb8fe31fd8affe6dcf5f1224489030a1f664c7fca665f2df6c649dd3b71d3996d5084989df6670f2d019e34be08c17060c2a6008d224de8d4e3dafffbfe5212d8c43f5deeb7a6f9115fccfddbfceb651fc394e4793451beeea45299374d19341bad81e920149bcb473f278fb3abccced9abc6d12ffa47118178b63e427da6a6161707676ade8432917cc3f0e215123fbc3571212113b2ec6e208b795786de7b4bf8d635f2fc8f213e97c08d3f86ddbe146bcfef5c76d614cde46fb0659e2c6dcdfbe58f4a46cdf4512050a3b4f7e32b2c4659bbe7fd1b68564f0cfc0da16c6fe93b34d92f597ed3af88d771e24edbc2e8e2c7f5c7f638f8f93be775e1c4aceb6ef7dae771dbd77afde99f4de2115bfcb2f8c7d4c17db43b0346de66a7aaea60dbde9b5fd89366e88482f0db5956386b87a591be78665767fad109a5e162a76bb3f177251168a4013b20393f9899ab42344a413727bb7ebb141957aef7d1018bb416dbd3c7abbfbcbb5f1487e91f69aa054bdf78ed3c761cd2648512f6f9b44c90f0b02d34bd2ebdf36b18b3cfe5a90db8757c8623930d09b404c7a0f142ce582814a3ca76b63e925a37d7d75cd760a520d92e56dcf1eaf7fd1b6b3d3e2eebc1a8db9dabee3ecb5bb46bbbf7cb37dfab6edfe0bdb86b3d7e40fa7b6a7f72e26c622af69bbf889345cfd8576b73d76e7d5f09af6c43f43fe7479e1394d7ed53489fb2e9224c7fc54a27d91f403c64fb1773f6d7dac4faade4bb9f6b92f8ef5c1fb4ce913ecfd08e3deae8ff96f3e957a2f833f98d3645efc71ec716fc7c74e2ff908ff3df3318140a59cf6c49b1c43204befbd8bcc6f7b0c01612f6f3adc8f21b0d57bd016dad1d9f650aebdd9b14dfeff6e93ff9bfce9ecbaef061bdfcaf2ffa627951e3b7ab2f412c76123ae8748a9a72b0fa4daaef1b73c76f24c3143cb53ecbdccd3557b12bf8d716ce78950d3707814e5f5277e3c68cab91acf5defa5fcf198bd93a5fc85b1ff379e08bd97f5a7f3b9b07747d47fd1bb03e9ce9b3b446a3bfbce596ed777bae83b117aefc77ccdcea0f21b719cbe7fd10e13fcdb19f65e8a898979f9dc9b915f5db011c72784858991b80f0b8363011b7138163ef76673ffaed355a7d351d4e9a0a173d74bb9209d333abd39a24ab9e0a05eca05e780e9386cc4e7144bb9e01c177d0e875eca0545c9190446ce5d97d326878cc3a9f738834ab9e0ff731c3071ee781b701a878d78efbc1ae4fdbf0c76ac3d9ed3c6615cd3e4d71d3dcfa5fc3d4eced5f45739577ef26bb6c9634edfad11efbc1a89df79b55f04838d7859fbdb0c0d3f117bd888fffc78ff624ce39eac647056fe9a1ecafecbc55f34e672c1b0b01c479278c7f927bfc8afe39d7d178f76247e1cd2f2c769e4b5a7e7bcb6e3635effda1ed6454f5423cb9bfec21c37e6765df4443238b3793a181c921fbf7f5d5efbdb16da9144728c0c06493bae6d3ab789e4908e6bf238fc74f4b06be865dc9373344c1eedb5af991e23cb1a36e2247e22bffbc273fa480236e224c85f47e743b0fb178d387985882552061b980db63838b2248fb7279ea0bf5e90e55c93388d46fe727bcd5ec3ddec351ab9bd6676db2f7e6dc796db6bf69afc7f1d0de34817d3f9dbff2f727b0d878d6f575f5f59bd77dc68ffdabeef9f71869d9df6736f36b3e54636d9b661d476762de30f614ffbb6ff5f88e1e4d76dcf356dcf35da31c763dc79b5daa6f3ff6779f8e917329a3dd7686e637777f43c1bdff04fb71dc5f09f1fc958106d1cf8ff3ddbb93cb4ed7e7da6ad3493aa77f8cb327acf8cfceff82b183423346366e7edca5850064defbdfcc5632ed7a51d7f9c2c635706c7ed21991b6db29eabe92fd2ce1e7e98cc8d70991ed67b64ecf4deed9c0c935e12c9b8bd31a97a2fbd209563c004c71029c71c61321f1be37e31a94a2fb98b94c5bc29bd6e9c2692b73d8bb9ebbdfcf72ca68bee22c35000cb3fbeed17f2b7f34238f9cb9f4eaee918ff6e68f2777b23937f5ed36af217e27ef876e7bef8dde41cb7d372dc68267f3b5bae7f6052f5de7b17eb3d306f7a2f8362f2d03e836331b3d59087b6104c1127ebc8313067bdfb7c088643ef65f00b27b22f7dba9d3d24eb7db92b3f3dd3b24dfc32f4f79708bd9ca385a46de75e14f55e068377df4b98de7b49d3a9f0f9f0cb622ce25f232c0ceeff7b06dafdda2caf3f31c78d3ce4b19b96bd90bd940b7649d56550972cbd2e5ddc522ed82542ef5c26a17131d4f13baf561eeba137ca741d2dd7f49d57abefbc5a49e7f827e72f991cf16b3ba76fa35de767d23623c37e4d0f49a29de7361959daf7f741d3e46db4e93a2ffc70fee78e9e881bed231a59bed96624e9c9a291ac7fd10ea3c3e9fb36da4732f7a48d93b67cffba6f679f9141f903ff6d8c3f5ed3c14fd63efeb2efef8326511c8743ff6f14a4d13e92331a3982cded87835c1b3b8323dd7e70633f3718e48f8c847ba3a14696f52fda354d64906904090408297fb28518090408e9d585d3e5fff72c7fa25f234bba7fcfa4fc05bf0dc9633d4696c66090f424fe71236ee7e4f1f6775e7f99c6e76a7be8c96090c43ffe85cfb3fd657fe7443232f81634da37c86030480621493131163ef766e4d7dd467e89cdc3ffc682480bdf8a5eedcff9162449923f4892fc43ba48b463bb0e06833f1200d2ce8745a2bffb32e9733c2f713ca76b2369df1f87cf87df4cfeb9afa3f3d87f3334fcfbf8ff7e81cb43fbcc7fb33f34ca5f18bfcdd5748ec35eae7ff1eef7abd170facef1ef76cc699936f6a0e76a1cf1b937731b93d1e8623b0dc76fbad84e93ffbf677cce0f5fccf9e15c7f1ff63de3bf78ccc3c27864240680d47bf7e46d6f0d404688fb2f03c8666706e82a6b9b2e538513962a79ff75345815b7f752c6d7aa70e8e5d0c762773619eed1f44e8509152a2e955e9f924998d3761e381c7ae0afa3735f47df5f06e21e58e2f217c6b91f0e7d59e7a2428e878db8dd9c29bd4fe726a552374323d77a52a6f45e1269123f91d3a48d935fbf8e1e92b95d7f19528a2559a485b81417a7ed35291566dbbe8bf8f1cb080b838b02a94739a03c7eba14645046fb3282c74fe783b51d24f1fccf91391a590ae3db7f9c3cdebea6619af4a4d08e947d6cdf364ee6c54ff7eb86b0c76939a6f1e3a7c34f7c1c27e3645af861728ebced9826dab51d7f72aea68fc3fbcb3959e2f61a7efc32ecb5e39721cb68f2cf3d1ddb383e66aff1467479480bcb8cf2af69c8bf9ea3df72db76b3f36e764d0c0302d7d8d0dedc7e35803f18636e6c706f4060581fd1738204bfcbfb17875f0804a26034e07a29ff1e644977db76a49d933c483b27efacde73d2d5c930d81ec2e41adb5b8c1100740e73ef359972fc74c0a18fed6e34d3d7f4285598543acb13ecbbf5ce9bd13bafad771e5befbcb5de796abdf3d26e1b181656db44a21d036dd9d30dede2a7b38bc7dc16dafddb5804de3613b22fa954fedb981b673fb684ccd771b8c45ee2f652aebd37ced130d1e3b47c846f63911c5bb261cc4d96c764b9ecdfc636f92b99829ff8c563ee7fbda7c445efbdc4ffdc1fd275f45d24f19cf631feed7a38f4654a86b69d7f258174bcf3e43cfc38299725c9d28f498ab95d9349c8db26e5ff6f241774fcee0b717f361cfab2fbd776be88b3a7312c0c4e0c8ec5cc5634d2d9761a1217487abd1fe154ca058f0c3a02863e7277a4ed48979154dd48a3522ed8afae7ca2fd46e2c0399ac7bfc915262946ae90bf103716c91c37c670d9a010f76741f22b18246b5f7ab167f198779141d293425f931f06fb443a6fbbf36aa5cf7d57fd87a5575749a620d13448d2f99c0cde761efb175fb85108479660ff2e923e1824673bc76be3b048a2a92c7bf2fec58f7bb2f2f8e9825e5db3fd7dd0f8d0cbb2276b9cbeedf918cff6f1d37591b22712875f487efddb93388e7ffacebe8bf3f0bfd96b724de30f615fd3c8ed351ed789ac7e05f7deebde0332082d4d305cfe402050c5b138946de2d10fbf3cfcf22f1ee16a7bfe66c73bfb6e13e25e38f4ff168e7d630fba368685ddf67d7f392c0cce9e6b3451fdc7a0de7baf6db266fb812618fcc1a4e8edeab11f367aef9d347beff5d88f099dc4bddd98fce5eff687435a86dd5f937fee651cff716c7cf3c1a4f4d1f57b474efdf86445ef1ddb7aef65d02683ffb6cb86431fd3bf23d97b878dc7007aefce4e2f712ffc321dd3c6b7bb609fbb8d77d1bebf0fb0fa8e855daad2eed7f12fe2445fdb25eafded77fc32c48e9f0e3f7e3ad8887fd98ec58e5f06f1e7b45dd1eeac9772413b0ebdba4a75763a93ba609d8b5eca05eb7addc8c9a8a6cd5ddfdeee9fd3792269e7350d7bdc7f37b28c7f11278ff9fd8bf65d2449b82b8e9388fdb0f86fd25ddfe668fccbf8890f8384cdca4f67d7d53459fbd8e75e16e2fe4cfeb5f12e9239fee5a1dd4516ffa723926a697125fe8db887c930dc04499664f013edb7205906ffbf853989e7764dce34e9d5457e7ce85f90254e93c1a08d93b2f186cb713fdb64f0137d1d0cfedbcedfc832c7ed216e14e67373f49ddb77bfb6633a6847ce74d0eb4b0c8ec56dbfe80a0af13fdbc238fff36ce374ed85f127c6fece3f7de724feebfe901ec660b9708e1e92784ce7383d1c8eb1c07f1eff3ad2ffbb8b24fd5c4d178b5e8d2c739c1e9241313816419228fb7fd7f6c77d4cd6f46c83e5469bb4e7c8dcaeef6c32b2fc3e681caca6c93f77fb21e96bd86d386d87f66f7b26fe9c0efbc1b1ad91254edaf8d0935f66644996c1fcbf91253957d31ff6c24fd4c42e12274bbce8d5beee2fccff9c9d93b9b138f45e358ddb7064698676fba131a6f3db17c9e1d03817fd1786d534e43f57d3c2dc5e1b0e7dd927da6575eceffcee67c3d970b8fcffda27fab5f817df1880782041ef3dd87b261a08891e276fa36caf7dd98ec38e45fbceeb0ff4775ed36142dc9f8585c109712f94edb28f7b61dbc7bdb088c774d1cef13baf8d76d9fcdd707bbefffd7d006bbb3e064bbe94661094091376e9859bdd06e193396f5a09069966a80d9ac380a42a587824c8092a82e05227170b4b71018d0c04054618521cd88a8d3babbc200842c660432a394e6d74ac4dca12b42a0f07594d9405b66182b8201430616074c24709003910c20d1437a43c1b301d6670ea22e581a1140e4fc6f0e95a03200e8c1ccf063368a2ee2c3112fc3b903e4819ca79364920948a22820e8304af1b826454ba42678850c10ea60e246e221e37af0422764bcade31824064f01005817294a030445fc355101d17534f03054336fc0c554c68222ac58314413a1df4505ae3673d629a94868899a335884465c0d2a1868a4250a718a07a8b05008513bdbb087c80680cf3d85c875249626321622bc7151d07347c2820240c0c53553804512dad0252353083db2c451ec88db5e9e0a70781d6006c170fc036aa830d737bdca85b17849a21ca821dad7e28a99f38a02208a985a584a4132a86a0845c1b7625528588f87e752c25e193e51431501b136a5222cc1ec4f051d440ab1c24d05a44e0c89210fc91060f87cef8b468cd8120cb59c3e97b1d7d0638fa7421834feecb11407aee745a62e543da932cb43b73e02c8b16099232a90c1e0d63c4181b59a1e2a18dd138c437d41984f5a108aa496567d0e2a8a0d8d34529d0fba1021aca9597021a281eecae5c401dfdd950e2713449100b258e8000d5f4f8f313623d19b406d397f88b6f55071a2716e832010836f98bb02c5f6409ac9ca2512108a11f1bf6783130c84707104bd4c84d1a83a5118cb52acf85d702183116818223e4c3b16e4e0838814b5252ddbe1941381112d4b527140736061204a0ca54a4335826a8dd09643e5937bd64f653dc7c3a3a4160805120be0810c632452e5b707ce8f0999fe458e08803a61d204abdd1c23108ed0c8e1aa85440902501264c7f4a999d8109fb74f6ab02e500110f84a91bd8218ef51d2f2245e8e4834e87206aa3ba04e3e652215f32300235a84a06590c0726352c3ba758655253568238d66b3b2db5b5403300aa562146249ac1a56e75908047870b5c7ce2c38a002e4238bd1364886009930c84103949512c0d863e59c0d593331c4eaac522749992f4b3450deab4850746862b414c0b17e0aa4488b325a9a7e517d54d5ad567428f496360a49c19e0c2e7e1820242642d614cc1b9520b8078a37bd8212442a13029f492225bdc18b2d4d5b5329d60c20cbaf12c5a4043099b13d97d484ec4910326c7203464204072430991fee141994f7069200b91c2c80f4e91e95d035d1d51653abcf4f821a7cd0195b6de7da102dd4814448600174c71d12077d1fb87031c51c061d0dd25b0385ac0e0397597402530c1390878c1883348ae8276ab83265486e05e1d6062af51807490e1b3e6ce296f6489292e3140cc242c40216701462834848113c208cc644a880d76cae2680f320345918870c05295e8485aa243e396c8fc2d48cd488a25523829dad209121006779034b9e81ccc5c22f1821097609b24bd67d99933c741ad210e020d7a172140282611de70b91102d37b07b11b2f182812486a44a467382b55a0e9d108206a7aef9dd8a4420456119349ef1d1ce881891592ab4d2e7a8636a6eaa00cd43bbdf79ea0f8eae24db1d2fbd65dd9d1812e72c8deb5c078822288410191de1395e8815a03557af7b085c991a5506dbd6b1900e26e0e1417dd670353904a8bde3df821cead0dea5d831a97041298de7d808e6d2522fd03dd29136aef1af42410624aef5826974c2e3a882d2b627adf7056c7a9772c3040b28340f47bdff00849ef59588a7a0f818448e7c0a3f72c26bd8b70d13b64e8bdf7de7befbdf78eb54603144043367c24d8502543459225cc061a0fa83005e311284306b45eaeca205008448ab715a36e20ea24648b832446309440b05664705007893c400a7909ef8116e48206420e3c6814a58b122ac18736b52d0fccf80084edac099c381a5a8d8965cf63f47d88e0085003030650c0402142e8099380080d632044ada9c248025475ca98a12bb49ef0c0c01f3ab26382c958464aef819e3f3d7c3025f9c1843951082d39f268b0aa5aa295074b0b0802c0a47e4810974092323b4e1e5004a98056cc63c0d6a53673cc58a161a9574194136d3419d58a0ba45161f2618e1badf784a325880506d115a5399d00b8d4616b891010adec6c40eb64716364369228f5acb859c487d10501c078d5050af149025d863b9196d882169d11d2467666ce5008d481d30c2f197702ed89e182d095296d0bd8e99de89d44701fd8356190553ed0226986164384655e009459e275010289cf08221dd22891bd951a668874c4ec810ba024a02402cc062c4ea2606cf9b8346461a921139795c0053a0608f82ac6a02380214f6accd4e13007eb810216d48122279f629aaeb4c9212cd56062e7a38c9def6911054c189920596a755a31d89cf968287871e4e232b300079251015de21808202b85b48108a6c84808af0845ccda281005525f00c4d9d14c0c960365da0a7dda7284d1892c52935148d3862917c8ac3af3272e4b9f300f2a79d9f305448eb5d6c277c0044244113acb1288f8004bf8a4a829058646768d208880401a706de0b95113318711a1275f205cd4c9e100ec03a01b95e6c69ce5990015d7944c67a03b5f051cbe5c04b260ccf1d4459212c0070a1aeebcb46da8a62c6240820c54d20b972e7cd0a080022556230425f18d3943166d61c01765c596768ce68ac38a83cfbe1426d61a55c888031f2062a5555eb40c3dd0448f87ba0509253554b41b2d1c6c1163c426858f4bd33ac0a94a6d1e0502a0080433195bb46a117f5295b2e1805a1d361e4d6b47912d4267e2d4315560085302cb710b0e3a247a084450e42604049d401d216cae38c06920c3044f1acc812093c09a6947dcd50e08626c754da000914c164e95ed98f3c90f9d2b937a37ac6c294ae9ba13c3c3194715160835196c557fd20e20b5894b185624aa1a65b43a3c498552a2644098238582a459bfd6708800454100581e6d6982690f882c23765e54d6a91b9b10d0e4872d2940bf4e275d580ea4de7837607a1cc11307813a2d26303b2242850e1f5b6702604a1374f32d08af90c90aa2e5501bd1861b091e18b6eaf2724b38c8f50064266e229179632246ea28875388dc055b0b3591a8a80979ac19c0810489ac08684e254e0615a0c893f500b3b56a6c28b4a80527301f7e901c07b0705728d21a107b9420825d077a64c2824a91a355546a601190bb908b976c5221a4024b4a76f870b48185af2dd74357b260c79d2d2728e8f00404052d32543c21b911c60aaf4695fa020acbc4044a24a5689d04e0ababd62d3ba5e10d1a4e545ab5fa737c14194bf2008ed4071d8c48d019d22a00120e8ca0a20946a7d28787c1a90330b45a621424c702159f48c969e842522ac400ade8b757cc6b01a7d2948703cca8d0e4b62a431361c2201f96c2e0f8d8ce4c0a75e98b1334070ff6a421920dd01a43a501ba07960c25bd381b82e97b2279a850172310a33467581b222d19d42798d1db4408941e33344414d6385999d4adbc698dd0c3838e860e176b24c4e0c9e0e2cedc168f14491ea088d3e6d7c8106a69dbe4a76724470a40a437582d286018015c34c5810c6246b5fac4800e0d87d416495047d08aa183213743383988f361888741a6c41d9e5b4f841a86510ca48c4ac4e550202c0384c9339c20df2630c341951d6995aac55d13063a989c849cae4c91a091dc8a8234476c7e228290384202cf292e34210194aa5421ae46969b95ca29390eb06d406d4a35844087000e5afe508093c080e4068f30142c91406645883ea91c0c9d06f8b60231f2ae43166264b9645b13525c447c496b4cb40c61b2c6e14197ccc62e3b11801b09147c28f18043403820c8a32759a330985033c77e645601560289a298a1f3a92ecd1d0a385fd3930f1bea18dc6df2192b6f8e56393e41b04b20de90ac610ac2c05168e8cf1c15eeab030b0e85b3b680184f110cb901a7c51100226990200039314664987180920902caa54f8a3e8c91b2522001c19429352ee012f58153039fa6b788895386b670b072583460f91868000a8aa018a7452551804c5d2089802b651e50dd71e050250b37be4c9162810524cc8acf47a32eb24284383d1d36fc270290e9a2e54013b40bc304e21a117262a07a5848c0039b272107602192a0b5498da2c6c20cd5e72ba542858c3e25dabc21e2008a33373f5a35ec0a2c08f14645870f6130e491e67a6cb1a1a0ea8e261d619462426f6ebe2bb5de9a254032a85045c69017b9465931c028cae088ced161452a0bac929c42e30002adc1560506702839a1c027e4c4bd6507d7965f0f8611b614741c28040ad299305b8e22a890e1066c890232535aa889c240130f45cb5a073bcf16396a72d4b4d0249eee84e2234684213546c2f811411c434ecc68e80c709245290615320fc879c0957207c6ab4c8d0e874720d80b5996b25ec4a93128b532824b44054c47a86489948543f0cb878ba317314b786151582b265f30b0f0704828e30e260e64584a08f1e111881105127c8cec402317c20d4b171015bfbb25883cd930056e3956292f47b52e4fe8e02ac529d1c581524d36bc51b2214c03502f5070a014ca415b910e0497335d9abcf07a24e7cb864e81c84051825584d31fa3a14826145daa49e931f1a8d1061270a92c31456f927c8861009d29c0a00f9d2c3000d205240f9889e572fc2e8013868535496d93842c099b586ddda0b00794021ab0580913341477c8af02136aad0d8fba0f2d8e84ecb002e3e323888414246c2890e533330c91e5e5012c6ca294c073caeec797861e841259940cb0070b1c03bc0e68e0062a0f5622806285c665b3cacb9629114ede187d2c925c017a01300c614411a401e8b841d37a62a6023aa586304c0090e4821d3237246d819a72477e03c3462836b3db8ca8e8d66b600b8700d417962b86f89422e2624eb526f89ea33475f6fc10334054b06d489fad3455342ac0956013e9428e4f77f29737bda287064ec8c10225c2992adc90d8a50532402151a847983df6841cad22042e70f9d3c18014412e4cf82a748894830426a85246aa67e147d9152807ab3e1bcab664f8c1c32e43cf015507a022c5aa08224311070af86975d0eadd8998130a810a5c37c4b475473844e08023e0c418ba3652c08a13305d51189595259f04291000694720f38305889cb1e320a48ad61a2a3622b0481ac2c408c9005c082f6c0162e66039116411908798340ed26491b044968123e4cecd981f62caa419e36483a702d024020181864869389eb065a83004a1a9c81b2f130d2e5328f5284938806109d69b1ea30812d12812e989193d0d084a3367830ead0891ca50589a514e195278ad9000916ec9e8313a5540261fea920b1054a1c00a4054dd09c99148a261b09130010bf06848f4c949991258226000e328c1080561693e1cd9d466ad5ee5805987381997e2107af32d2a1e9ae160c79942521c49a9dbe41a698051a1d57f4167c69ef4508a86c988e60192a200c4b2c49abe88f071f141aeca16df9c91134b4488d99214d931f1e1f91146cb0f0c47b8e9028545095ce1a1c16bab8987338f1c20928128828c7812d812c7a7e8b5d2dad262ca882a1669ace089a0ed431e2db148de458f31759e3052258116320074da8a3245d5942815cad48352c9ddc217a69e96ad2d15d810b4e9b7d8224624020b0c19f878b254a05445202600ef02394146568750ef007550d8b911c524a382a6c2a447bdf5c8056e3ee2b4a920f0da2221c2843319c8305930d721e80095969c2b43312cb47578f312e682921d08b9a4113cb10f53c88840936410031bcc4870f3494086688c1c445984deba187123480146324e427d94cce81cf2a0417209c7b1ce1908562ccc33995c84e854c5cc87934389ad12410cb160008229596e5bce30e0c5800d665cfde50183145b1c4e905109f400c703171063bc1074e4540421ce2cb65d32caca0a265c201de55237b020607365490e051794596108322871e0b08180385e0e58cdb380113c4d4238820004881f9ffe900af3d3e90f00748a19ca953258445cd523f90e7aa7c6883ce486494b364450944aadc5a621736bd4787102d148820f861cb041013c708c002b72e0123100f0b1ba3476810d1d9298b0fa206a4fdc5a0d0d42b860fda8732cba1664be3eb519e1e94388b20d5b317c1b1e58b0e09e80c463f655910054b18ee1261ed455c6611319112d546478546832e9c60578d0374a23b2480f460190486103f7e6072704383992208e93cfebee76c0901c506a3dec662899e1689416ee48ca1431315e951035506293a6b4365b8a0ea5f95a0c3937ae62d89e122548bd3f43c074bd01f5a60e9805927449e1695386522298a09350e8c8d48477a2419da608b6546ce2118095dc54084f646f14b002464b4f4e9498393d84380cf026c1cd0f209882198c4343576b2cd861e7c4a1ad2d1d20ee3a5411b4ea8f860ad8f9e4438229c5e54804aae32a948b1d40ad1028391152018a4256056cc4020853cac71047936604d9634a100755716a899c146f883864a5cc24b01eaa44b46d4694112bd8737cee2482bb5bc02ecbc821b510d70905c03c6a34c28aa1221338c443c62e6873d691608190972a565e2d041020d60f4842b80ccd5891df05510526cb421e3a01e6d61cb5c252a0cbd09a9e061b1840f1a2e8870414041ed5ddac48d03900a1400ea9c2283a15a00480c3b0678d8340585b68081134585a758a035c13474e2e71d940567656e8c3963df70e9a4d1a18972320b01a6d5d30e60f9b052868b001f8321883952281299334dd607375e34f942d47c4bcd04067ce1c2da0a80d576f52944c7602e9831c93c051e7d3873f1f0260b568559b283e04f69cba3ba014155533ceb42a8300ca514349bc1d517a536767c6d72a832315583ce08990080a162e56b4a410202412853c407c70bf227520f0f380004704309cc1a0516aa5a961a984a3fbed0d24b001b66ea0387ac86253800169173875b9e0a2aa14cab8a1f74946a536529acc80bb2e15f0e94a1a155a27764082548aae0c9e381f8a9cc993e563ab072b0583f9428a17f092185f1a48377a4afe74a0857c75384a02f59331e1849b01cdfd05d0a43a2220b949e0a8cb21380f3a2c9202434e035c9b16982393f60b60128c1e005aa030e0a0ed45d00319b00646a7b40c5f4344397881a4810e2e52e520a003264a1dda2f9f1e643131014885bd7f80d9b1414492259b2288a98082ca8804c316136397ac38b9a86f62929dad347793e21534231cc0b87d09295e3131e22d518a4378b65c0a3168aee3a5021e3b0d9a3f14f091804c52560b17e81f41a6921492708cd48e22448843852901e0c75167583c81d4a60028162b426090c3d666a3f65170b3808c8a3614038b902238555ab34267d45cb4da1223e2c2062066932850406bd50c928a580431cc2c0291a386565e97034819e19c285abab429c1baa18548484815d826dfe348f2dce03484cae1e2cf057647ff227a24e46992e0c31ab4572acf95b83b4cc6d4c8188019e3ebd42a46161a2d6a303ad5a5088dcc6cd6f0f98010e301850d135278831c551a20e2a15589298a03158fd6a8c0a0c06de784926f48903548805a682ab48a9634e784ce212d4a3ac44431652118444f026e6344798887b8d4100aa767a74b8a53330383f678f16920b2a3951b3538bce2182c035177444b0759c7a7001abdb0427176de3035e2da8ad365c526d2090e0dc80466841048f8ea19a04a87026faae46d40656072e544013d1924a18a83ea431d9f03b416355713d8a5d8c23a05c6d4254c8ed812e8198c081b9deac9700089960bb6835191885460a04892ad0c3b1265e2e33641503d83ec39884053b043dd114a2a4c087044cb24cc000107309588465c8e2a10653ee2b2e34f0709262a0ab2306179a0c35108257ef2bc6c651028a0020e93f4083245c14cd78d02c21829e5981d115a29548dba20e58028729a40b9552d3291455c01844dd3219116b30154821e00c00687332739ccde826543825030de61f45586c0c1869496d08503ea587beb8281eac54ac566839a0740cda3e54d29555f1520d940e71108f2cef0aa13111026aabbb70408325030093709e27d922bc85a03468da504d2053f531ef043540d0b8cd1f85466435714ac1ea7b28e94ae3e146160cddc021f48c1c172e1b661a3869f58cc0b0d637eb036b8614543b06b5917821f1d22093a68e85200020cd06838602048cb51203f31f0c3ef8a88c4839a17667624a5ddf5d0d3fad690986e2a31e83a956a82c1100c2d311ab424002165edf220d31bba37043848a2e0614b2c9762d0e0eccb07255d6dbef810f9c64288d81081a536710f460e0c8fd0915a54be99499172d8d0b376964810991fa7ad537c7a57da48959ebc2406770488837b0e60e121e78645ee0d4497a5b75435bc6861586566ea4c0bf50c267c8b1305c3dfd6db05049c0c5428c2c02429118c5121d4e8e54126512271860100501c2778d0911090814a171a353ccd5080ee1407210c2265f274a0d3400d1b3326d840a47618b9114c84a2e7fbd369cda6479658c4fdf0d93d50e447060d69991a11208a648878a38106188571a083873e51d814303643c8d91b1932ce9cb08980df1c10d787813293223db023c4169b4b595ddcd875908e40508386109e458ad85ce090648b025c943184aeb85de0b504c9235f0833c1285e07a4e5a9e04c9e5482b982a3ac1317d88884c13e05044d03bd07a5410f368cb2c0ee0d2083942446135c4489c3030104281f311ad90911aa8aa0438ae04c80a609d69c0a7502a5b268e4d1538967ab4d6a6c80d99cd4a9809402051b0e0c285cad590322ec12312bcf02eba9b8100c10fdd17005cb6c01ae2f1ac108eed4b8ff04b5ac85d0e0e8aa4dcbe3ced6093618ee547cc294f9f0c4088724bfb9201c2c596c744239b9e07b74b2bdc90872a9590d7d8b68d041d390b66a4c570817901304206878e10900491e2ab5a040aa4420534422134990ca7c5ae41b9a386117c7c54602b2b1c9dc9c1c065a8254c0a10176a43e15a48a273f63611a78702de8a2e60e538c031e4065064e15093f1f832e644e9e44716340a1ad41a5053f435a664806002b6f1c39f484f111866783d8d695327552f9b8208ad41a42900809bb58e8755952c58234b41a58d6ec38112402b82b430212d8e11191834d0b0256387237f01cd08102001a407306c5926601201072de78017bafa3df4438c4cb141037484d01d54152863319ac3cfdf9a244e57a63af5e60dc3ae0d8c1ca4c1c18737ec01e78c2cb23cc89784301026dc10e63708e6f6d00f92610c95aa00096140b0c842e786a94a6a59399291cfeb848c08da1ac3c6e660801fbfc3635042945a7220581a4e644db8f3a6f849019cb8afba3054d94333c6c5451735b80cd441a0e60715c601d30c30c149d4a678a5812f516e2257b1b76642200859c850138071b21d62539132e6c610b1249082523938e32fc6ce012a642153200e46684c0125b79e4050e882384d8e82c62a396995bb0f06141891cd62dc7c0a2b23560360135fd0e9de1156cb870eac58b46043419d1527a14008e29aa3e2c3a000ba4267a52d0491e21c270ae2d160303bc6caaa1b56544293395bc84f829d380648b923029b65c752a4ec99242d063800f25fe08d1ea8afcf915e420e0c29185543e2c5a8a8075f27518724214059c920ccaa3b56a480447f90a10825113a862ce8475f2008492038ff6e0a9e3c88db088a11912c8f84a0a9c4c38b2728026b0ab1922b0cc40d03a46b1644279297db13356667ec4c664eb11a902f4187016b7c48cdb853e0200c0a317081598391308c0ca11540acdb5c192c8906a0e934b425148bc2a511e94d4656bb6584b9e3e947d95f17137242194d088801eacb668541a0b360d9f945d29f2800b820c3e2280e146ab83162d0590ec8a9ef5de79dd470f01de99f96dc3636d6242dce3c4dace9687b61ddf79e2fd8b40a2b1bef3c42fdbf51f028f37509817bf0c04de79e25c4dc7f511f761616c1d4ef4b76f238beb233ec6a381069d50518572a4908bbc17797e9062a4d52268c8d1241f5b5a6c3ae5a28f152f99584461734fe0c4a78b026a2224106a885a8548a1102825e6864f79a0c59d050aaa98ecf3552474e4b79671421311f314a3ce6e98415000efe3a0c7179c37a73ab4205a5c2d50800266b8c405503b31d22a2d4807084c6a8a83188dab274b4b191d602cf0081313012ce008abca4f23118f3ca638062a18a0c4d78562869ea924d30389180c214f01aa338320530bb6565120791952518285072b617c8c993834c98dc19a728f49a107220a6ffd48f77db2e3775903ef9fd340a27dcfc0f8177115f1afa304a4f72ea37dd92e0b0bab7f5d5effbaba9f4cdb35c2c27e11089c8026f6c5e2b687be2c2c6c4258181007d65f966921902e7a6011c76fd81d37dd6ca41ad5cb11fb6c74b2e1800d4136f0d858d37b7fd07d36ca74626c23bfb3e71aed8dc1231b5dbe383b403a1916e7a293617115c8b04664580d2e64580db97732ac86dac9b01a3406916134a0f44e86e1c74f07a461830cf3d1f8c0890c837b4386c199f5dee17a6498dc7d6f64de8664588eee7b8be07353d47b27c3dcb8f44e86f9dc5cb7069d0c9bc1a577196d9d667095f8fdf34ff4751869e7b2278bc354a8c055dc7da0bf8d9e18dfd9f3d89bbf8d63f9ddcfdfc6b12231b6418c6d10631b346e5b50efbc400af4ce4ba0771ea03fbdf3fcf4e1d33b0f813dbdf3f4e4e9f5d55aef1862f47aef573e35528e42c17874c74e010b7aef3c986e618fba3440a7de3b831b45b7350d646855aaf7de008d98346d597906b5bdf7ab00aae4609bd2a48b9edefbd5134f22bc6e072cd6f4de7969bf00323d39f10455ef9d81961445a0b064d1b3a8f7fea0802ba9ae1a85b172d17be7613a4505c805582eb5bdf7065b8210b4080df1a0d47bbffa160add6220ed79d47bbf6a04a30ae810a0c7a40e161626d6562c8ed97061615c24ee59a815e9fdf865c8b71de3b40c1b85393d77ff3ca7edf23fe789b4989c89922b5c630e16f79fabe919589c2b0e694ffc77f49d7b22fced8e7e58c469d9133d6ea403fe61d1fec5e38ddfb98a63b187e961e060bf3aaef0eabdcb755f9ad7599a60b96ddffe9ff9dbb7fd8ac4fbac0cad48bccfcadc865ef6dfed78e7f54ff6df4d2db76db7de7978ecdcb1538747a7bfe1c974e7d1283f6e0f63f22effc639922cda769c8409a5fcc917122694f87c43ce0e6ef8618bacf75eeaeaabac5f5970f56052ef851c4de99d37e7d78042035dba8fdee30105d4c088d778725ab58a7b41805a77f783644d97755ecdf30fa8ecb0f1c0a4e7e3b07ed055ced5f66d4796386cc48571ed6fb20767b018846860caab0b88d32378717ae71d1001429b6cf7ce83d33bef0dcf80de796ebe98b9353dace91a5778ca2a953ac67ac742fb3b5f31f4765edb244c34deb110371681765ed3402378f0617d7bf2d7d930da97ed3532b31f74b7fde27824c3f3db176fe3b0ed38acd97ceee5e39771fc74267afc3254f6eecb758da66bb517c2fddb56b38bf6dd96e3fea7e56344bbfe32d1aeef17f8fd61e257fb316dd738de46dcff1baea689f2d8c7eb3f7fb3a1a7635a36c618e2f4dc4f13c61feed7d1f7a7a36b5b2da76b1a329a7196e94fb4df7e6daf8939791b6e5cfd35075b824cf8fa6a21d682f4ba93e9ae7cfe69616e375b3eff349224c9093fc83b9906fe39f9031fbc121e4470a0aa500bb1f90f09b5609182acff100894873683490f7081f021c765b2450b32be71d824c51c707094f7debf6cd724182e2709d68214967f4efe9d48f73560e5061c5ad958db5819c982bc93e97e55f4357aa0ab287ae289debba02d264c9026d96204997f7c9e6dafde1d8839003361826c2146caf5ef0dfe3490d3204a83180dd01a9c3558e163a4e3b671153fa6878c5c74dc4deee7e83a5fab5011f4ea2afadbae36868505633cc5c3c2d4b44e4dc3c2d03ab4861a1696d6c9686a8db486fc716358982ae7b6ecaaa6a898dc49aec8c122bec7c2c254d99e6b3431345cacfe695fb6e1a357938d37dc9b58fdd33ed1afdd79357baed16e9b87277ea2afe9629fbffd21eccd6a1a6df61a5d6ca7e55f2db7d7f0ff5f0cfd37b3d7ee7ef2d068c77da25ffb0d87c617f21f0ec770b1f4ce1365b4a3fce55fd3080bbb7fd1888b797da1293e1c1ad78ef51831b6717fdcf8b656d332f022f1269385358da2bfe17e1d8dd7bf78f7b36d38fcff177335bdf68df65dd3c86fbb68f67dd06ff84f1eda677f087b1b4ef664c3216ebcf39a464d834d1ed271dfecc5cc361c8e0d8763f2908e13cbe33139f674e5d41fa3c1f6902cbf7ddb51b6c964b4a36c938989a1290b34a591e3b55de6a2a7d135aaac510e4d6534badbb6cbff1a9a1a798485a1756161317aef0cba8f1025428d7a27c6774508e9785b6343832b5ba3110368634c2dfe75403affedc4dee25f0777c0a0003a7e97b82773df46e77fdccfe9db4ef6ff9e6dfb06ceff46ebc2c28af1af81d3c5319c2efab97a5824d245dcce66817fd9ae81f855aa4060d4fcbf731c86986cd76958581891223f8024d0a8779fe3dd0b7e971226d4b65cfbda1eeb9d27a7bbdd98a4f76e771fa02de0ff4379689fd1a8bf0ffb7ef173ffef323b7bf8c98ec39a8d466dd3bfa13ffa347bcd2da789749a195bd9da0fe8c6e6e6f603fed26898b1a9016d8ca98585795c8e7f6f3fdb867feee77cd1be8b69757faeb68762731eae0dedc7b7d17ebb69d86bb7ecc9644f86e33fbad81e9209f39b9e6dfb6e933dd9bf8db931a7c7ea4f67c3e1b8bda626c622fe35f0397b98dbb65bd1f83ffeddee7ff44372e8ebb1db18c7b69d3d9ceb31fcb6d7fed028db4452f66445239d8dd39e58db4618ff332d7b615e1bc97ffb17786d9ca371f9e71e5f41972489fb0ffb21897ba317defdfca6e1b8f6640d7b7591be4613e2feccdfdfdfbf755dd7755d55555555555555354dd3344dd3344d51144551144551f43ccff33ccff33c4dd4444dd4444dd4444dd4444dd444dff77ddff77ddfd7755dd7755dd775dbb66ddbb66ddb9665599665599665d7755dd7755dd75555555555555555d3344dd3344dd31445511445511445cff33ccff33c4dd3344dd3344df37cdff77ddff77d5fd7755dd7755dd76ddbb66ddbb66d5b966559966559965dd7755dd7755d57555555555555554dd3344dd3344d53144551144551143dcff33ccff33ccdf3755b765553f45423a2f51b3e3870f75711d368bfa6e7eadfd0ffb77fb7117f8ed67d6f7aef570b10716f47da6785f0bb3cc2401cf745e0d0e77e3e7a3a1b27bf5814f11a3264daaec1a6b2b2dc0f07da1bd0ec87032d6d0ccdedf706fcb9d1801b5b8381f6e67139fe6559769e0d9f1b436e08799565d945fedcdadcf5edcdc7f1ceaece98e3778fa25d13e978d0c2391c376cc4d5a001f7e636a36d4d2d4d468c33182f7e666564632a4ab0af5629509018418ad8a0a155ababd9ce8bc73bbeed18ac880fd03bd1be5fd47f08b47360d10874e79cc670e8896fb60d47d682a7e5cf9dab430c28f2b1199ae5f6f00dcfed219edbc33760b1e8c3c2de735dd11b0f0bf3b7d18bdd391e46c4bd1d0bfbfe388e64b54de3741d6d26d7345cf4a421ff3bfa4504303e35a27aef6161c0224e92b73dafb981df2550fe77f4aca260319d7fa230a76f0f5694c000cd950b5ed7d5a37ec500a2ab4163d0f4f0bb94fdbfb1ce70b9ed58854d771dc67b36d6396c9cbf1cc3fe755b765553f4347918781478bc2b0bae509581d4874363ed2bf3a6f71e0c92794ddb65a6745f19b9f75e3ce6be326c59a6abf7ee45867d7d75f9ca38207341276ba27168c724f96bbab66fdc1389f6dd17ced9f76dc46b7be835d734988a14e46d936b7e8dccedb92ef2e7744dcf64eeede18cffdc36f6206bfac39feef8e9bc5e9ca669d401669aa669d4d14592411241e4be82614132fe3c609bacfded8b2fd87e43d8fc10c1824d9e0ea91b94a9100053bc869085cda88d3880678805141e3035903245c823b84b1f14dd91848851c316c3450e4b42889364a8e9033010d26262c1a41bb90861f061d5ab05d59b200b5819a4c30b4a5a902c760fde8c683121485c85aecf1696154154b4b199a78c4a054495851a76705382802430614d2040285c20532234a14b045701901b67c85e7058420110ae240b78f1f100f843141d053816b8693ff098513a924280173f9230d0c46bd262d18fb6449ed6302c927e6c69fa8d407563878f4c491a78f88231c4079c960502c0f0fbf8f1c449d06d63fb7821610511b038283e7c602e989db0291e1f50054db0f3a1763433e5cb8a2a835a1c6f0b692ad080398f2c2c650dc9532347081ec80ee9a0e0ea6e1190b51863c7dc5d97bb393b77e8048346f4fea8b26385e642dde44587dda0302d803e09796337009c81cb1ed4841d90011c9805478a765d89ea9ea8e082a3ae940329c44009a255c7c70f251e3e7c9eba267399400d5a535107f716c206183128752499903669ac1c193b3158652943a15146398958add945e8632462e653a8429c33c618d388529b01148c5a6c9386e07c58e411548083fe6915e76b6014e9c440162fb971d10234721f1cf231638f49140cca905308f5818038334a7047362ead39ba35c0c354a2434250ae081f16b0a7c10d5704672d998a72d421c2796b02e04080146e446b6e2c35a126564c35b9613e10c29451d0e80663756ff932eaad072a567f347410e0811e805015021f8f2ef5884207cf2a2a37e87ad8a8a2e21ccb50a30700684af8e9937cc550b8bd45b52241f18e97092d406ae08a48484f665c989415db8a1d00e9213248c7101b1317021011351cb2dfb4b07dc011e63c3862c5fe79084341c7a5cefeaa25351811a4024fa92ec36513160b8a0ca97bd42bd48448c16e29f5831170fe38f95381c84091c8054e439e2a973411e7346b0891b17922a2236a846dc10118aee2013025959d762828d0b0ca143c05b8821818ca0d4f0012c25268b1d295e219da61cb28e810e001c1aa210fd4d031a131e444e9f2d0bdd96531d555c3a41351c28f1233a2d27870f274e5261160028f38a154b0964c041e43701e68483a30f2412785075d09ee89108c99235a0d49c902a2b05174be89c3a347300eda859d4a6cd8ac19404ff033e7a34d0c38c206e69258b0a7011cc23022bcc0acccce8474bf50bb2acc8270f514e1ab909547c22b268ce222d865cd1dba1062d4192e4f7304f43800c727104de6bca928060010a3d1dc179e20991c98299929b0004b271e5ddcf90f4c09549e37aa660178b4c2042c22658e9b493072944a0a85161f9408047008b9f3df4e87af75aae2f48fc040d23325e8d35f83c4680d0ecff039b431422a9352265fda83aa125b81950d20e0c6aca7520df978279bb56579a93f81e4ded78aca4bf82576a0520d1b642e58c564e2dcbdd83287c6c5386c88db2f939844b1035811bc85448856997a23f8c3a7b76010235471d40a3e90a7e275e04d4a431698f226fe342a615f0028482ab827b824e81604d140dccf509d09809b2651a293001c058cb32153a8b038278042a08ce120e7e9069ee5006609b0966d0418b083d2190d0d9be286ec48f340cddd1dac433b720734c082921ced70d1c08c4b0dc89a1d12c0101f58f258728d8c7260663660726e1290e3d1a2d2d9154c44399595da0308dae2e4baa1e22219f85147214a5b9db0dc72e8b802448747c15c5900cdd49102894ae2121ab51c14e4f0c325c65b029ab0e48002567667c50428396ae420112148998d0b8ce0f81409769003cc0b8e3a388cd89da93241a038d49e9c39d561101b8e1b9638eda1d5743874c3cd980a0c7552dadcb8bb51e6e7c6050b7c776763ab0d4883220502a3a2b0318691259788571e1bf61dda542753c0c64b67a3819a1c3c950b15a748ccebd41f3850e2b4acc210aa0ba74a717221dcc4860988c499352ae0a2e7869db01635148861c2086485550d2a114c7c59d4335423878b16878eac61d528416354d1909c222b001a796828710bf5409083181a332495d210e705271a709ae00e406b53c20aa0207041e060c061e1912027a818e26d12054618529cf8ed4c2a394e6d74b0bde1601b26880b52e14dcc0d1437a47c9bb7084fc6f0e95ae372632446827f071208b72f6eb49bea210a02e528416e7d06211f33ac60e9504345316846f02e021f201ac419287eb49dd22a20550333b8ad4f9b13601b0d2c25249d5031a46dc4af8ea5247cb4b07962a3e3e1d0199f160d6c45d8d2d8d62cadb1a9808672e5adb06657e2713449508b35b22783d660fa22af59507ba42646ad5673d918481080aa536a0c6e7ac9eca9a42502612c53e4e2212d4b5a9ca642862a190964c9989246068e31195c0bc41015034f8c2431661410032d138e0647071a10b4176869670f1ccfccf8b37bd3598b326710602c82e10586f0128cf405ab17835e0cb0e105f08557a79fa95f9f5f13de0f6efd9154cc3a99cd31236226c3ac2c82b235657565636515c81c9189212392b5643c30401211a28fe51192184bd1588984482a1e8098487171c305570f4054efbd4b71907bd57f08b4fb75d7f1f6c0db0b63204e97f3f0e33cde830b0f2ee07759df3fcf7d51c59de3c5eec33205bfcbe3d08cd09a5f9b6b1a6cae69f2cb47c005c108990808d2bfdcbe67699627d897ef9fd3313d2cdefd3ad258ffa227dafd9a80dec92b98f2d8df5e180feabd07c9fbcffdbca67d570c0892b5ff43db868ffebebd5703e0ee53aea8370e2b6f84b92faa38e6678982d9734d830dca71a31b29cc7d911c0ec7c2c21aac58d31dd47150c72ccdf775dff665dff555dff445dff335dfd775ddd665ddd555ddd445ddd335ddb775dbb665dbb555dbb445dbb335db9775d99665d99555d99445d99335d97775d77665d77555d77445d77335d75775d55665d55555d55445d55335d53775d33665d33555d33445d33335d31775d11665d11555d11445d11335d1f774cff664cff554cff444cff334cfd774cdd664cdd554cdd444cdd3344d0e7226ac7d2a03e27617c15907c91ce965015a71d7e0121bc18898b2a1d6268c24c28b0247f60872c0e46c81b73e3fe244a2a0830c06d873d8800881425d4a80d78f5419589cd9218028064e861252e8b81ba1a2829e992493d80d2eb59e4624de04b7a00ceab0894598553ac08254304103b5794a042e32d859b526a3ed6105c7b164dc2c14e9bd0156416a0b63f53ddca53a923f2a60de5202978a43054b8414a6fa2c828382a28596cbe6a523bf6354436eee821a0979e49e2a48135c9a124ce3c3e4768f0803d3f1e0954383bbe9eac291079ddad6440de2b4f018605681db9c5822370fbe2300968d0f2ea168d0d8273480e09553985aed10e541118b222ee8a304ad7aa8508d0c19dad2e0c29c9bf10802f50bb801450d0b313f7c874a25f134e8cba84e1144d0026ed51aa10f3f44b06093a71fd630b8b2204f8929d73028532100a6745dd2c39bbbe00a1f1028b0c266d4461cc0c346688b92584dab184c40a0f080a981942943d0a47ae400826f666103dca50f8a6e075ae109b26900a7139747586ad862b8c8118116af4914033f4c821c414c92a1a60fc093c28042872f5c2c5c89b201130b26ddb8a50c970811a40179a40652d68755af165406d47903616b0c16ac505921ac0cd2e10525ed460732a8865c9e3888e060f7e0cd8816122a45d0a68028104c2a75c8aa42d7670bcb8a2db5486da9188c34f910d1c6669e322a150a0d5ea5424020e2118a0e166ad8c14d0562e2cbd39549c8104a701926ac090408853b8c74015927cb9c56d68bd0842e119c2a5106985b5f474f45b6c319b2171c9650a096a903201f3ad668da9321c9025e7c3cd841a60e8c44573484f254a84747018e05ae0c3aaa1e04a0e68e4fa806b6cc281d4921c06f5494e29f24402b4d24b41868e23569c140140a028488f1a895a7b55e224f6b1896489024b480d3c0514b130a5b9a7e2350ddd861c2a8c248a8ae5368b0b49234f0f0054348121450847cde50dd41e36b5920000c7f4ba305a905832affe6e18993a0dba64600d420b5ab83149e080d125610018b7b6288d40be80d46992d693e3017cc4ed8d88e72781ac3100990161f544113ec7ca4394991e8c2900c10c04a0d53beaca832a8c58a1a01881dea39d883009685341568c0981798b5fac50a0cc8593e58ca1a92a745060893454c5a046c10706cf0407648070557649bdaac8dd9740fcfb080acc5183be68477e2ee0f77ba6a8001310093386acc32790e3e1f2af013892bdd9026cc0bae549d2968ffcda02d1924008435c1a011bd3faa5c84d5e90306482f0f2f049a0b7593971c5a5041999bfbda44a50b87302d803e0931c00d704c924f007cca8564c119b8ec414d94e8c0e6a5c61100a6c82218c0815970a4b822c701048862601191301c12d53d51c1e506210d5d777dce482a602bcb811462a004c90006022582ba12b4332d117e28f1f0e1f114b08a4c8f028a4617243acc65023568adb4241f89a2652281742dc35b081b60c49e706aa3c5ecdc58293d7a6442daa4b172f4862ff95f630a0410658bc12a4b190a894a92a44cdd868df0df6448c46acd2e421f1e0ccc2811b78318c244cfcca7508538e789746606161c51983c6d8d6944a9cd80098150945943c2b6a9111b2db64943703e2b18c853e766808b9854c357010efaa7557c418502a61249498383e50146914e0c64f112a4030b3c990ec8b076446bd10234721f1ce40ce6152451eacab03e638f49140cca3a5286c3c742dad1898a87501f08883393c4cb22af395c02c86a8c68b07169cdd1adc1900b4b1200d1a213099eaf121d12827245bfcc4bbf6105c7e9ea43017b1adc7044c4843965dcb40ace0cadc192a928471da2b54da8a82891cbecc061ad098003014e28a30478c60b1d2e03d48188f1c35305a71a31452d154e2e303b7b36d4849a5831c5a448a93663701c890bc40a8b0f8430651430dae21537c7128fcd971304ab7bcb97516e5424f1694277a9c48ace06567f34741040d2194badc28c90b1f57764a12a043e1e59fa34478b9a1c165a203285a0836715951b741968fcd19ae00b14012b385451718e65a09106021582b8b812661764a129e1a74ff2c1c10194098b0d08458444e0f616d50aa725461845005149859cba0e5e26b400a979fbb2e5810742d24851904006d293191726649a34a0793154fc0364d0dba2a128c89b28c45d58265b00611a830e80f41019a443081613098849d3c2d93090810b0188881a0cb111c1608e04357f449de905f9f5e0c262d1e4005a2e0c0d611f255b7084390f8e58c1704412211e8931758296873014745ceaee449720a89c54af303d4b5640e90992424a85395fe4944c19b1e6a1c1882015784a3260306175c104222b9a16974d582c2832c41e12b31012d35184f1c570a374c19c9612a2e2dad41e521a6a1ed48448c1ee2863b64a5842532004a84b1a46c0f9e3e40f85396e90cc81a028d3134e3e3951d6150bd8093ce922f725d20c16783ec069c853e5922608bf41570e4d295201200d69d6102263f3f4360063e728d2d5151a6b448db02d38092b0ce20c8075766506078207c0945476dab757c40c3a0e6c01a364832a818b40aa147800ec80330af8b0a46911d6143c05b8821800322ac71d1e83e6243182902307284a0523dec8570e082c845a016a0320212c8516ebd6024d2e71a05082d0932c9ea11db68ce207a49aed853da39610820704ab863c5003ecf346c8230e46d0d070a031e444e9f20c4174a315968fab464ab2ecb298eaaaa1424b8f0c872e0cbaaa5b24a2841f256644a575c9019515c3812da3da3878ba72930820010f0a1b18ec0c40fc58c80aa582b564200c1a51a9828d496601451199c8b31b0f6e07121daa14a5948362ad03920e8c7cd049c960a605911e0850c0442c03ed866c508d0a3d24ac3a8e5629c0a03db8274230668ef02e59fad921129aa26c91942c200a1365e7021373a44aeda31819367178f408c601464012115a44bed8ace8d9a9c486cd9a1b271028caa4e690a82684b6fcccf96813e30d04e71a0bb31f5b7517b4e69258b0a7011c32709059c5e08a9b0420f944788159999db1383bb28a8b1d1f06953cfc42edaa300b602e18a908f2c9f220d5f214e1ab9095477173186e6ca1951a50e063c2282e821d161bb7bb8d1b291dba50f97021c4a8335c9ddab4d50112438814d888861e07e0f80482891333aacc1559ee39abcf5414030088c1488c08b03e2ada744d41f5014f904c0ecc92283a2d21eaa065410e1f0d1660e9c4a34beb801f232ddaa8e921f7b1604aa0f2bc51f5e34a65c5c504079c102078b4c2042c2225c53a8200309150c859b581c9213a072c5081c4944d6be2449007d02a2c468e5249a1c08213fea9890e3904b072081108e01072e7f14f6dd0588103c04918870e5feb54b5498a28271394d519696441160c243d53823ee1261a70c26547a21ea1109018adc1e1599e7ad0503340214c9bd0706863845426a58c841f1f8db2087544e0c9da83aa125b619d3337e6e31181695644107063d6538946280a5bd6789c65f1b1a4c32f839b19c78e946d400f50608e167cc9d096e5a5fe04ca01054a8e126a25aca9f7b5a2f2127a3160cc1820201ed9600bd1a1520d1b642e56655af4e5eb82277d8460c910e7eec596b913099a2171a68d08c5ea491980ce80247ed809503626f83cca41b635c4ed9749cc02089ccdc8ea81924ad1450b45d376e254e63f3843d6e7549426317aa7de80a148246d8b44080bd841214c040f2442b4cad419c939f2731426d616175a72326941d2d3c8ad9d00c19522d342e49343e243515f1224813c89ecbcaed64cf0308811aa382a850b88aa648c92b44260a721acec4b8a0e47f113304739b41280a3ca3768dd1340903b36314f7c96ec1445097ec09b94862c28754097356c8af8c8d970a5e14fa312f6057f4ec508855b98bdd85c61ad75486e60e1c9350045c7043b236acc81201117d635aa0b1cea852a357dd6380a1bd6d8944b4ec0f140ea4b492295a3c402ab4c8d275fdc4c69c871c093352942d24c100dc4fd0cd5f924aa4a9d5f8c21e671d3864994e8240045f5310279846975c30211591b32850a8b73a2cb6502b5a9d50f156921a08ce120e7a947012a1cc9a86028958c361c8a468e98f4e088800f04628a63c024c46509b0966d0418b0d52ad35a1f234e8894449cd1d0b0294e08152d35a6b9b6cc52ab0e0fd4dcddc13274a60da936b72a5ce664c9e08006585092231108e4c08d641a50b5e93530e35203b2262d0b9a178a2dbf2aa33a80213eb0e4b132989064eca5b26714c94024ce9db3953fe0c9520216068032a6f6663660726e005d0ac589cba3342d3aaaad1695ceae601a7ed1e4a2025268fc16ae0cacd41e40d05643d30c4457a24cb065e948cf5071910cfccece580fb33bee6c0ebb4569ab13961b8e3ec239616d4fce30a9a135e42ccf98a41f88c82916e0623e11b17c28982b0ba0a978a4e68290171b004e8c1e90a8242ea1497be266810b68847c2903a581810e4e74c8162c9e40a2708755a644a37c5c62bc25a0094b3c268b8515439e2af8f900567667c584278bbc2401c34309021f893438e16245c58a311732b57183e2708003c08a10a4ccc60546ee3655590f4eb5f1f03f44821de400eb72448e1f3b1448b8a9c262839687160897101eaaab60044e4fd098587667aa4c10e796548834119538224d807872e65487416c405340c658ea5143cba30d623e2590014c00432828f461ce89bb1f59589cf6d06a3a1c9a811134a0720b34e88110632a30d4496953cc5261d4933a64f20138a825caa4ba4799a8340187a3af23538c593a3a7902ebeae349536d806f0f6b2145080b7c7767632a9b319864b05d01e0cc8cc3a04881c0a82800a0d3c622003546c0b4598c2cb944bcf2b02950e1825679b6c4018ab8439bea640aa4d53fca9f4a5508561dfc88297de531e6c91504ea5410cc9425839a1c3c950325010b3b4381fca610593d31af537fe03c9980902a9b814d9f3860e8b00a43a82e9c28597ae04fda910a6c4aa56528849bd830c1104e6fb614858e44fd19d30b73ca4e16d7fcd607c88d09eefa6ca1b3c545cf0d3b612ddc100d00482b4a570580560c1346202bab243d4a238480425a81115f04135f16f50c697831828423468a055b3cb86871e8c89a6f4f8b2b441234e850a58ad621562d564817cc555b28908a3218c97c4543728a2c3101b018c062cb454f6e010f9bd630ba0b510848894c5f141cd27441100d6ea11e087208738127107baab4484240219fa4521ae2bcd8b48a09262c68ce764d031f0608e1c44e0f5cc518910f5e84141b261a1ee050ab32a5a304a2519f82ab28a28858686d4a580104c41385134812588042292720c8dc8809ad6987f7e6e7e5578d4f7875cf16f5de3d0df8cdaa775dd8a3b3fff0ccfe93e7e687c2e67a7af99ff05f513555d503786d7ef157d1f574dbd464cdb5f52b9b5f7ba2f03bbbe9fca2adabceed9a5f1ab3abaacef1fc4dd7f46fcc0597c65596e7093c5594a7e6a7b66b9ab6aaea533875d719e5a5f9fd1876e19475597736d3774dd1fc4cf94d637875577345d3d345cbd2059ee9d9aee1005e0dc03bf393e3d7cf6bfaa2ea3fbfe9cfb5f33cddf0ccfc5af7a3718ccab3ccceafebd9b26cf5f0cafc50173d5fd7fdefcc9e2c9bc6647e72fcd778fd311cbf1e4ed759d89ee9c9c2e08df9c13e66e5f3f4ea89baa83ccb769979eee189f9996ddac26eda9aed8fdfd4b77578617eac0cb32b6bbade6cd5d73451d34dc203f38351cfb26aecbeaf5fdf18f6bc2f3fd5b7ad2b9facfbbade95d718e779f9a1ac67637745ddf46dd3ffbaaf8b85d7e5b79af12b7bf96559d95ce3962dcb14e571f9a16c0ab7aec9b2ac7baa5f5d7deecdcab20b6fcbcf6d5b5696db9fce2e7bf20af8c9ae29b3ea9f4f9ffaf955df75c8d3f28bd3f545d1d66d7fdcaea6ccf2b2fc4c547dd7394d5f0f9fa7899ebf2c5fe0b98587e5679edffd2febe3f994d734655fe0894ae111f03bdb3376631fab3e45cf345d51f4ca0f76dfd74465f7cb672c7b7335adfcd6af7ef84d59dfb6e7d9aaebfb8537c0cf8ce7554e51f34de1b475bdc9abf2835f5896e759fef11afb76f5547edfc3f18baef2bcbea80bb7316fcaeffdef475934864f0fc3f1da0ac093f27b57d7c3299ccef2fa59f94c5173092fca2f565378554f7866d737455f14e509f093d5f68ddd6ffe178ed58fca280ae537ab687cb2663cb32ceacefe449ffc4c39f6a87ab626fbaaaddb9a4e7ee8d9c66bec4fd3cb300abb1e459bfc52197dd3949d59f894d1f6fc328a9f3b784c7ea8db9e6a9cbeb0fc4d399ecd253fd355dd574659945d5d9785794a7eadfc53f8fcb27755ffa62f9a9ae125f9bdfec368ebca2fdbba710cab6c78487eab0aaf6c2ca33e56dfd96d659777e4779aed6fe59fbaa7eaffb99e6278467effb3ab3cab673cc76eabb66eca2bf28be1d5bfa96caee8ccc228eb8547e4f7ce6bfa61d7fcabfb5793455bfd52b63d59b94de5777ed9f6ab60ae58fdcc379d3f9a9ae99aae6ebba6ab7eeeea61363ecfd49c7dabaa6a7ac14f5ed9ffbfe9538faa707b9e5bae2cf87d779dd1573e53d975d99f9eee0b3cd50a7eaa8ca272abaeaa2aa7f13bcbaa7ee9a9c6a81bcb66dafa3476592a57a97ef08caeb3c9b6e9abc2efec4d54bf346ddd13756596fd6f8bca28053fd3ff369de79fc6e96c9a667beae755d64d63d87ddf1876cdd474d77000f32b53bf1f7fd6bf697bc66bbafa9315b627ba96fac9ee6aceb3eae3793e7d9caa29a9df7cbe712c7fd97c4f566dbb1af58b53f44dd355765bf6fdafbbeab812f5fbade953156d4ff5fcf19ab269a89fcb7ef4fcb3ff73bc7aafbe2aa8df8c7e37fda6299febacb2333bc1cff5ac4fdb76fde9fa9a6d6b7efac1aacaba2c2cb7712bcb2bfb534f3f3695dfd5b3eb8bfe754e6157d8ae6da75f1cbfec9ac22e8aaaf3eaaea7043f59555d579ee3ef51d934dd97d32ff629daba722b7bf5b7f0dff433cd759e51b39d53337d5717d6f49b65f8855d977de339d36f75fddab62ccac63e5ed973667385e9b7b232fc5b15fd731cb75f362ffd5ad6bfff35e5f78c637486554bbf788557b37dd313fe2d9a72c9ad91ebdf46dc1ec65c706be402ba689fab087eace9cd793de5b4d2cf3c7faab6ac8acea9ba9e5e5e7345e9f75b733dcdb75dd7f63ce73315b667eade7911821f2aab2e3ab7b06fe1ef53d74ffab93f6de3f7447dfcceb13ccfeafbc0ef45d114655d595e5798357dfa4afabdac09a7a70bab6f8abe2f2aab6aa49f8f5dd99551736e4d34f6f05c9679a9bec033ff38ee5735cb95033f3f9f1e8e61544e7fabb62f5a96e6093cdd3157907eaa4767f6fd291bb72afb9ef10b3cdd30578f7e6c1aa7bf85d9dffad64c65394d1dfd5af49fea9cb627fae3165d55e0f9a60dfc4e143de1ef7ef4cfa789a66d59a656ae1afde018f59f55dff7943d2a7fb82c53463f5636657446d1378dcf59657f9a2efaa1b2abbe9e9dd9d73c6716fdaf01570cfcdcd83ce3f7655dd485cfd394f1b2344fe099bab952f463e13566bfcbc6eee9bff94db6b75dc301acaf12fd5a3736dd34fd1e465f7475d5057ee93cbb32aaa6aacb7a7545dfb24ccd13789a279ae60ad14f8561797ebf2bb76dfbb6672c6cb9dad2b8ca1265efbc9806af0efd54d66ccd794ecdbfc270eb57626ca32c55770d07b0eecad00f9dcff49de7f8c3b20cbbc29cb653dbf34dcf423ff9fca89ca2acfc617386db3f8c7f1df03d57f75cc3017c7145e837c32dcb7a15fd2decc6e89c0efab1e66afef6756339564f15f5aa2ae887b66edb9ee92aab710a3cd340bf559dd15935633485d3d75dff70e8b9e0d2b8ca12ad2bcbf3049e681d7a96b952e007c366fbdbb98d51544d638f0adbd3cedf047efe3465d64461934d51359eab81c4f8ce448b2bba8603787605e887cef3fbc6a89765146d61d544affefc3eea619455bf67d7f4754f3fbff3bf5ef6eeecdff8654db9cfef3d3ffb9e6afbc2f2f9591fb3956559bac09325c677ee952b3ebf3535e7ffa2a9f9baf2cc9a6a59b27565f9024fb60ee57285c00f75cf0fb3e8ffeebbe7f7ddd66c5fd4345f179d5bd3855b5b22577a7e683aff553e5f934d67f36c81a790ab3c3ffffeb47dd1f59c5bd4a37e7e9b7485e7c7aae7ebd1944567b56de1532e4bf5049e9daeeefce2b7fd3efd327ac6b2abc6719b1b17195719d718575b9a6abcb2f38353d874df186ed17885d3d6acf383618fbaab4751d5d3f9c129fad31fbfecf7f25fd359462bcbb27c81a779bee81a0ee0d59bab393ff4645fd5cb1e7ecd199571da3df1219d1b5b5cc9f9c52f8ab22eead9b57d4f739ecdf3cacb559cdf9a9e1e3de3347e4f1655bfdb9e8aae0ef8a168ecb2efc9b631dbaea6fcaa2b3e2c12e915ceaf6de55596e31365e1d87f6fbef9a97f4563bffe977dbd876558d89e40bb5fb3a730f76daa30f745f598a3e6b98603487665c02ff5f20a7f577dd3b47dfd1b0bdbd39eeb970b0e0657f1085796c0133d81a7dbe8cacdeff4eeaac233ec9ef3dbcaea5b96c0b23ccf351cc02b28576d7e2c0c7b5385d7f8cbfe9de7380d72c5e637b7ebeaa62cdaa6b1875ff9aff9fdf975bf2cff79764ff69f5ecd2f45df3546e7ff579765d7994df3fb272aa36cbab2683b9f2ecc0adbf3bd2a7285e637bfecbba6a78ba62d2ba7aa477d5c9df9adab6cbea8ba9affc768aaa6b899df97dd545ee31fcb1f765bf72df343e5797e4fbfc22beca2eac992f9c5de9cfdeb3feb5dd6c7b12c6ccff37835e6e75f9835d35985d3f3c3b09785ed99feb812f333555546e3d47dd557f5b03b0bdbd34cefaec2fc7ebaaae6ccbaefdac2adb9b6c2f63c51fb0accef6c65b565cf147561f7546356d89e5f7ede84bd89ca2c7aca70eb5d57d89e2b8a5f79f9a171fbdbf5f5ec4f55339e6dbbcbcfafb02ccfa6eb3d3baba93bbce2f24be5365553f85de5187ee31516b6e74bbcdaf2f31e664ff5cbb22cc7726cc67305fc7efb7ab485cd0fabf28a7a1367795c69f9995f56e71696d1384d61f76dff8ddbc2f6544ff5a4bbcaf27b5b73f6af2bff7546d9577eb1fc7efbfef79d51747567364d4d027eecec59384edbd66dd1f4cbf095dfdbceef7f7daac2f1dbbaee09e3caca2f964fb8455ff47ff34dbf390ff0f3aec9ca293cb3308bb6f17a56f99966aac6ec9ab2669b9e711b0bdb33bda2f27bd1b54d65754ed7f9fd2b1a0bdbd345e06aca6f355d14765d177dd1d7bb6fbbae77aea4fc5035f51f5e67b98de1734653617bff2f8c7d59599699ad7ae74506aaaea2fce0cfc6f2ec5d385e5defe554809fdcb6a98fdd533e55785edff30acaaf55637786dfd59565566ee7f5c9ef9be9fa9aa78c7e75fd71eacd13c795931fcbb2adebba323cc3a937d9153d2b4b2eb8b4b23cdb3b2f5e35f9a1f3f9caaa4fdbd77bd3afa6b03d87431fabf50bf4bc62f293d9f7bbf1bbbe72ecd70fcfe919d3c3b7b5b22c4b563d4ff6be5af2fb7f865dd774cdd7f4b13ba7c2f65c6b3f6cfbb2bde6c272bb8603985e29f9cd73eacd5796553fb7b2cca6c2f664b9e060709565fc65b834aeb22c81c0d3547295e4779ab19aa2f2fbd3765ed5af0adb33ff73e99910f7c21f9d2b243f739de319f65f9e5918465555d89eed5959c26e655c675c655c6f5c70695c649fbee14a22f0e71e3dd77000afc45c1df9b56c8c9e6bbaa69f6d5734f5c2f62ccbf8d71dbf0c21eecfcab8c8ccd4ca1296815c70695cc09a6ed9f3ce8b5785ae8cc4f685ab223f38f56d2bbfec77e5f5954fd4444df44cd770008557447ef27baa2b3cafebfca2703c9fc2f604dab22b37e4e76739f6ed39a7be75e10fa7c2f664cf59c8ef7fd98c5b7736ffea9eee9f93fffd892b6a07f9b96f2acfe77fcd583dfdd9c2c2f61cfa9fe340baa1115e4f2e381876d95c4dbfe897ed5afd407e671cfff65457364e4f177d5d617bd6d10167ff8740f5e482835143c6ec7f5a19576e542bcbfbd3dd9e387fb72fdb6b67e58aaee7c943f4e307aff3cac6ea8fd5565d5f5815b6a71107c6e9b9d6f6b0ac2c6b709571c9e0824be32acba227966559b2ef1a0ee055141fbff7c3abfb9efe4c636fbaad491f7f6c6a9ae92b9f266a7af4544ff78d68df2fcab22cff6db344639dd277bfd5b7ad9759987de1bb7f767f3b3b6d87dd0ff6727c9aec4fcfb56d7fbcaa2c5cf79b3d2cbfed9bb2f3673d6bf7ebf4fe6f77fe769eed9de3e96bfc996b0bff987ddd33f62cb0fec3f63c16ed78e5925723171c17bc1ab95ef4e73f785e7d0a9feafbc6ef97dff40cffb5fff4b1d9a2702cc72b7cce5ef8e2feb9f0ea573fa3aaabbaafabba5c7030b8ee64342eb834ae3f577bb7b2fc73b5bfcb122fda67bb860328f7f8cd6ccabeecd9caa78baeb3bc02dff3cef1b5f843531435e5196565b675df175ddfd6fe99eac9cea91bc7ee0a7b3486cf3bc7d3fa37aff399be296aaaadebc26b2a6ccffcee03e78cf09781ecc9050783ebf642146f6f2f8cd537e22f65e1179e573456d5394ed533c7d5351cc0dff0f7cab06c7e597efd6fe1373587b60d9fd1fdda73fdfe54e554456156555923f0e3b72faaa7cae337a3ad9f5b18855b36f5b319bbe84934d62990fecdf0bc7af8a3f1f9a2b0fc9ec2f65c739c4e7b85bf17feb2ea59d53d63afaee7ffc3a211ce9cfba96fbba2f35f5b7475513676d373fec9ea7ab2f367ddf88455b5fdbf9fb63f6de7396ee17fb2694ccb3ff77c55588dbf397f7676bdf9f3a297c764df56962ebb86033817ffda1645e12fcbef9fe5f7fbe1a7e7f5ed3cf1fbbb39716601ffd6184665d9fc2efbc2ab9ba6c2f674e7dcf8e279ecde399ea6fee7a63e65bd6f67757661f98585ed0934d3b1e00f56e55666cff54d617955d155d89e40141d0e7facbec05fba9eff4cbf1bc32babceeecaaee100ead8f163e7754e5539354ff784d9f42dcbe1f0c726bb86037843eef75df69ff24fe7b9fdff6c4dd4858e9f29cfef97db3fa32ffb4f753575e448d1f2a7be2afa519365ff8fdf34763d8edff7feb76ceca6ea39bf72ac7e1f344ea32cedfbfba8edba2c89c6fac6cf45ffd9a2f129bb287cceab8b8fbd366cfc52d75c55754de33345d7d3345535eef755f55dbd7bae69fcbaa629bf70e38251e387ba71fc4ff8744ff8b3aaecdf15347e2a0b9ffe4555d4cfb1f95f54d89eb22fa625dcef3d531736d9366dd1f89b3f96ebaf92bdfdceffe5398ddf1895db765d51617ba22fdc7e26dbae2e8bb66dfbaea7cac6c2f61cfa7beefb227ade3f7ff1e6c4397567fcfcaac6b2daa2e9bca2edfba6c2f65459233027ce6ddbef8c65b535d7b6f5673cfb7715b627db4f6de3176d59d87dd378765157d89ef51f0259745dcdd67ea6cab2e9fc7dea4f786d6756d89e320dfcc5637eacc7caf2587b38365dc301fca90181396ebc7d69bf16f6a81caf668abe736ab2b3b03d7f5cdbef8f6bb6fa05ebe2453b95f1f3709aa6a80cb3f069aea80b9f668c9f19bf27dc9ea7ffdf455b154e51b45f1ba767eb9ef16caaeb5f3d1ad3b9cf71f43ccf7e1e5565b55dffecc2edccc6eaebc2f8cdab29bba7775b8f7e383665617bca76d88b5fdba6efe99aefcb9eeb1cb3ae6cff7eeae965173ee13935dff9c3e8699afd7cabceb1bbb2ab6aa2f1ea4f617ba668d9ef7b39fd661bbf2f6a7aefbee87992fddcd75c4fd754e53446d3d45c85edb97e8dfdcef7f5a97fbf2bb328ebd553d89e45fb96cdd7c5ef34d3af7a3945e7b89dbffa0adb735824d240f9df5e88bb671bc08f9d613fc366bcae6f0bab306ce728ba42ecf7c2a8ca7ad6ab5e955d157685ed99df36ec0168f1f3a7ebbe3f46bd0bc3e89f5921de9e2c8bdf6f5173565bd33ce734fee8296ccf5fdbc31858ffba0fb489f65d3cd1750d07306cc58f8565f4fb373567545ebf5785ede9fedb2ebb7d0d18554f760d07b00dfbc9ad8f5f73665f1975ff4ffd3cdbc09c1e16f137edfd995e9ed75685e5b73553185dd1dc5fcab6b3fff189be2eaacae69c9e2c7bc6bf2e456b7fb0ebb629cbb2ac0bbfa60b97e5cbaee100c2eccf8cd119f6a8eca6e809af2ebce6c4395d7f2e0baf5e45d559f672dac6a6b03d85b8b108bced19c89e69eaef3461d9bb6aacc6af89ae5e16b6e7ed85b17902d31faac62aec9aeba9bee779fa54d89e778e03df9fd3775c5996a5bbaee100caa1bfb7f5f19b9aef9ac6b00caf7ece087fdca7eb1a0ea0dbf99b4ff3ff194d3d6ca2f089c2c2f604a6673e34e2ff6651f3e7e79565e5f68dd9375de7d80bdb7335a1e237bb26eafed535d9198ed15315b627103dd99c38a76cf9fbb2fcaee82ac3e62bcbae7b0adbd3cebee780270af683d5787d4fd68d4fb73dd7cf0adb53aebd2d9f68cb0507836b8cab8c0b8e0b2e8d2bfe35ecbcdb7be3ebb7a6272bc326fcfed484e3b8956bdaae36da35d03dc352fc7caab272dbb2ed6a7a189ecf940b0e06179a1a6f7b2ecb9c38975c266ae41a168934175c1a17105d8b443a251aeb3427ce298ce227cfde653deabeaa69a6ac6c0adb3327cec0b99aa67bff6dc7ea1a0ea0e9f54bd53fc7aaf95b177d3faacac2f604b667bbaee100ba5d44db060ee51b089470e206e2c61b08dc327102ede19c3dec5082e42201400a34499c18d1457689f80a7102048a0fa607afad131df00e1cb636d0c51e1e0e6d141a64ffef2dadbb5f6738817fae43d6897fc0eaf2a145123d0f18ce0f174a5840e59fdf7d14154ee0177ea030e746208809314e13494840239c400020a0443b06fe1b083ce9d8152dc61f07b60f423870d1936ca0b2c03bdb2e07c1003857d342dc0b49de87ab134804de76eee3fcee87e83e2f3d5656ae3ed1d70d7aac0ae1a0d0054d1235d67911f4ceabd43b8f52ef3c087ae74dea9df740ef3c49bdf322f5ce73a0771ea4de798f7ae739ea9dd740efbc46bdf318f5ce5bd43b8f015ea2de790bf4ce43d43bef50ef3c43bc371e120a5d90a44f63570fc67c7a24759f9e02ba4fcf8d17224cf40daf4f0f59f7e5b9a0fbf2f8e9be3c62ba2fcf5df7e571ebbe3c69f7e5f9d07d784e751f1e3ddd87874b84b6ce22abfb003de8be3f1474df1f4fddf72753f7fd71a0fbfe20eabe3f7ebaefcf9ceefb53c64205df1a54dd67e877df1a50117aa5a3de2b15f55e69c841061168dd274245ef9d46ba4f8487ee1311c11701abfb22f0ba0f02a8ee830041f74150a0fb20d8e93e085bba0f0291ee83c0a3f7a034e83e0839ba0fc259f74150bb0f4257f741e0d07d10aebaef81a85ecf82870d157c50cade83d2d57b503cf4de2ff45819e93d5677efb1927b8f139cdee364a6f73845e93d4e407a8f535def719a7b8f935cef718aeb3d4e69147a0f12a0d07b8052f51ea04ebd078852ef017a042881de036440ef01ead27b80a0f41ea01fbd0768d87b8074f4de316061a05081422f4894de0b72a4fb1285e8bd203e7a2f88dd7b41e682d8b8f2213041f721e0a8fb1040a06f4080acfb10d8d07d7b22e8be3d78ba6f0f98eedb43a4fbf6cc75df1eb3fbf660e83e3d15a43841b65a367ae98bb443efa1ad7a0fe5d47be8a5de431f755f220abd8726d07ba89dde43ddf41e9aa5f7d025bd871e7b0fad7b0f957b0f8deb3d3446efa12c7a0f6d7b0f15d17ba885de431df4de5941ef9da1306c39a8e0a360c10116852b79ef5df1bd77e5adf7aec0e8bdb4edbd2b2c7aef4a89debbc2a1f7ae3ce83d2ba57acf0a04bd770917306cc0d23a7275a9f7ab017abf2aebbd977a63d02002031e0308bc07101e507830c237e2ecfd9cd1cf9e1a14bda786ec3d3559bda7a641efa529d57b692ef55e9a47bd970650efa5a1d37b69c0f45e9a23bd97e647efa531f65e9ab9de4b53a3f7d2a0f55e9a16bd9706acf7d288e8bd34bdde4bf3a0f7d05cd07b6848f51e9a4ebd1704d87b682061e865d010a1f70b167a0fc38408602a54c8da1a0ad07b4320bd372cf6ded0f7de70adf78667ef0d37f4de300218f7ea8d03072e7a6760f6decd96c01032a433418bc0c5172fbd735972d6939ce5fda6d5c87c4d932b50b20459ff61fd87aba5432d2830d5db7403cedeb54ce9526af4b600221083dfe51086e9086611cc8c4450571344da73a507bfb58891451f03ed7ebdc00350775faec77aef6e947ae9599e60f1af1b0e3d51cef0be7fb13d1c8ed573f4d07f1f349e1beda34f630361c77dff82643d61128afa88fb26d989efb129be495df6a5de7b044b7daea681431f42157e97454f746db436581bab0dd5466a03b571daf8f73f4353f674d5a3bfef31f9d7f4fce59a464de77f383492fddb2eab693bce69329906128dbf383bb663db4dae7f8eff384ff4b8518610f7c2fbc301a443a8345129d6919a041942c81802836a0600200163110030382c1c8ec7c331d16c4e8f0114800264a672a6521b0ad424c9614a31640c013000006040004064460d4020604c91dbf556b4b72c5800ede52ccb3cd7fe5f4fecb7b817f064571880e895de38ebd1c3aaf8fda00b8259e2fdcf546cdbd14b7269be90639433ad79fa32ec7ed15b5e4aac1f16d6893d0665c2e8922e21e329219760ec4cc72c86b14f899418c0cfd0e069a89ecc1bb087bc3a9a66a7037b1eef3ae29b4f0b21880154a6b34a234d9968590eaf5dd2a0a83cf93f5d500f605f95fb4584ebe45ab25a5c6db3a16802fc6cd2b14b2ed2a92885906f68063c137172fa448b154e5a9db2babe411cc01d5e809f2b013c354d7d38364f4c9abb29bdef73ccbff449b4b15969a13c75bfb31f1932f53e6ee74ad9abc03762ef80c59aa77ff2633a7599de53d23f7508c099880f36f37891ea9584fef6659c8d05c18ec9e7a3fc03a5a845b08ab49afeb37f52637c4b4854294339fe6ff15b4a58d13684bdab74dafa5d11b9e01ee23d5647215b881fc4a86307b5c0a2d0fbce0e924ed7458ab790a267ff7fe1a68d392084a51ddab31396ae6224287b8bec46e13e2365feac664b752bd5e70e854bbf70ba43431f00f573ea85bb9c43f21fc99bccf19e4eff3eb3830c4e9f5e18bd2fec502adf4a3ce8c5b9757f4a05c03d5b54c41c41aa45f2da8d65c2aab437c1cc5c0bcf48cf0a82016b8e4c31c3e6860a8abe5952c510def5b9ec3a81628189ec61e01c6802afc365ed7ad8ccacf684b79c0bbfff5509a5eb261ff14acf7d906e895971a3dc583d35524aefb4a648b51c456f295055bd9436dfada4a23745001c8aa3180b9c6e16582c5f966890ca1fd5cce849458f046831a1fe3d9a79507f6d9eaa6e20e9cf920673332a7e992a8862761db8d1c11cfdc5cb0c0b1030a94752ac681ae5f6a41b5c73d3b82d921e5f2a248d7586a37f3e38119424ee7d102237205cdbf1a08dbca83be26705c2a2f330ecc3d065c232a8186123b6ebbece41cf45f47866a6f5185cf235450304faa8136d0322c27f5adc47ad0cbdf7a32556dc37c00508808fbb64965e29712fc466592c882ecc4e3ff0d81c33d7685e68e96816aba6fd951a4948e155cb6f8188e5df0dd33db06a73f77bc4fea5844d8a931a6a831ea3a167747821614560f5a3cc2036be5e944f8a8968512f9661416a315131611b77d0d191287aedd829f31538693149dae3fc1a4ffd47dfb88612b68aa474449ff9b5f4a16046ffe3750c79094c24f4da31546ca2e1f9df3299ad8c131b499d9817d3fff03a1e0ba3029bd2c703c38a89f837a8ccfcfe72652b0cf3f50e2ff3a1689e5ee409cbf803d36d49c727f490369c1c1a310a4217df341bf9cbedc6107220265a1779fe94684308c3aa34316e05bdf79204864c7e42cbe5f41543e43f3f1242ae3159a1e4033738d2ecc5752d8137f6617e9b1d9dbd8fa320cf575fa2451bc6bacb2df35d959e7d5a25a7018e8541def3290a9b084494eb6297f336326f4d403d85c80cfc4198db84f6ed08bb37146852345ef49f27ee1cf47303bbc85af0fe1746f53111a87fafe2051601baada53c75251c5ffce6aec153a632dc940dad16c346faa4a8cdeb17f946b118f76d55ca9cc381d28f598bd0525e87632ba957e9133d34689f1bc83fb2489c03268bc57dea0d3528e22f97acf01359163423aaba0c45c1968d587b07f849a3e4128aac52f2df70dd7e65e67ee8d23ec3d4a585157d8a969a468c68ddc263c190442232062877926f66514071007cc85e72b5762b8138c31256fac0a1ba04b373716ee8898d73e0475d2a1aa416983db3d60d9167d58bf4c0f3649733b45753eaaaa14baf44bd98dd2bdda4add0982fc95f1108a37d6b4200925a43268bd92df0eebb7f9cd376d6b34487ebdce1e8aa5341aef689075f38f5a6144d06e9b1cb18da76eef9fbb83124d2a73b0e2986083dd929ec35963e46176d0a2dce113a4713b1f312bbc29c0edc276da5b1734c344eaaf13b0468029f8c9a32e19d4c5a5282342c8d8a0dc2089695a880391da5a47b77e097cc2f3b15c6df59f0f52d51c6d3ea0e6f35e692b5050069f30d3df6710b097d155b1af2608bddbcb016ae85252d234122a27920a3713ed04d414f07cae73eb6034d16a7d5145dc680bd98c95a19e181c16d68c1879ad2e28efe02d75b7f800ccfc72d00a805eb91a74d69e8df0ab58eb955db761a179c4d9bf92573f559fe88918c31c7fe753897f418b25dd801f2a2a7d667b200dca52a4c488ecb3bf48328651888d7ea349a8ef8f36e447bd9b2284668bc43ea7d4af7ad0b4c0364c5f04092ffe2cf5ad3d8d6ea8b9ebd61043b2faefd56a6e0fd7fe3b753202c8cc089de02a4f2d246fdb9e185fba5f2a4ead6684a4629f4beb6d9485cceb57dc1e513eabd1d909ea2fa1d69c8d7db482e906711ac61773021fc437d7488750b06a33f1dbef9cdb7ac714d35b5c943f6c30b7fd552f5fed022c2c63a74401fe29e54e74f204bf56a4c3478d7b24054c5a37b5a5b8717399680629918ca1de7b2f8a0735b5760f1d551574c2807ecf2d53153edcb83038bf16e9e851287921e3178975fc767a3827edee74b21d74db10b385483cec1e26582988ce908cc2d19aa9c6b82c420222afb731e4ee782e2269c762f64a3dd51c1c81a67ae0a3151a558469b89dd16f5e3160068d9fdcf5bb7652da1b6ce0e30e2d9731f1a6029c68954e2d2bccc1751867cedf1bf3ef9497e6064b0c91e1c5894d4b38fd54edaf370b3cfaa852647e2539ec397c6feaa1232835c67f4e930f28303d099800bff0d3eb8302763ff77fbf7221dcc52ad31a5da23ba3fc00c17047a99dad5645a4ba92c6eb569ae9779b3ef2e48d99847126a862fdc7498a62cdac3cc7d71e28d4cdba8bc5d8e483227bf523921d0fcbb639a6d5637ddce8b3157e55505eed5bb7a548a1dc35f50a2f6d86e25f4f8e21fa0bf4f0ff71b804687f7ead82ff754e3994be4a771cd5d4e848be4c517d33d54c7f5f28d69c23245efc0d784dc1263a633a867a2d9c0421b7dd74aa6ebf59856af626a7ee291487441d53c11fa0bb3df4b682738cca2ca1be4726dd6dcb56127450cae144c807d823367ffe603447fb81f97400743a3d55640c6b8a8ef8181f89d09706c2d7962562f3651abf24ebcaa2adebb0aaeba6288e90d6cbb7075e9007c53e4577167c8c45073447385aadc0ddce9917c40b7f398a4598c2c2d538af58de664150cc8557022cff54c8b90193186ecc3d3774662baeadb12395734ea6bae8920013784230ceddb3a0e1aaa8d4e5a7e1d5b32f4df31f2db659002932dc5d2cc2dfa115c2582a3559539abbb534fc83c57cbfa6d1be4408313a8e978e47a5c9db660f49de679696e7035627bc0b8aa8f9ac00f05cfa54f64cc0b079d68cdc9f69b86a93974bacd72587b34d2334e198521ef4ae4e3e881196ff12eda6f6da4c4a701f719e54593b11a9a4fcfa4020215d0dcab7007d451fe4c2714d17328adb36a30402248dfcf033dde53a61420ca9129128388c4fb2c1c7fce71ba1b23b0968f69f58a5aa38bb3a687a41c0839c679c5c3cdc118f99b310ada0bfb0e76179282f18c0a8d004706185c79571f80302f6918bcf4ede1800a670d47d4cb11c4bda14f5ea3cdf79cbe0838d4fa8d9b62ee0da331d08e627da53bbd1b4bb7a5243eee57a6892a3e1bcbad896bd302b4edd68b0b5b7b2f8458a88d479735e738ec19018698f88b2f00587806c7fb67d4f44bb195cc92cbb71406bfedf7c8c3a31774e0b7b06da3b37e772dc44631bf451367f7f33c746c887c578ca2e19a9b1612f58e0248f4eff8dff468c008e0fa021641fb0006aae0a65e839e295ba750820876b8cc2620326b91461838903f3981493c29453f62107fc344d06faa8ac0d67016552ed005a6382b07353bb3b278eb3e19623e896fe8553ce798b4287a3056cac6c0e5baaea7ee44ff31d5f1b4b78553e2a34dd16c02db0eb5a45d1113de7cf9d7bd1cbab02288431ef609a72b216e47a5caee47bf457a484bbb0451ff86d37c52e0bf34bd5abf124e457a088ed057f8314952ddf6af714286577dad1a5adbfc46dac52a3cd0a327b5f2ea90d449940a8a950ae333468d9cd8e79c36725495bec88825081cbee07a625aa25a1dee757edabb490060feeb1265e78045fcac4746f5763e653557717889f60be78f7ec9f23dfe2c3843d0f38e9721d90ec620d22f3d928377d5f740ddaaaf63fdb0a74626bb4b8242378bd845870d742c0f9c32222792aacff37c9248e2f1e092da1e11d905d02d21d5daf41dcca76399511827576f1d7592548a30993da2140057e7fc6b0e140c8011b386abaab6b53620fb45eb28bccd1a4878ada1b70fb18221719958e766177c34b59f2623cd133902e59ae9dbd130849678f12e2786295bf2b2d37968b5ba1f544aa362924867d462d43ac3bf13a85b6779a77d401bd4dfdabbee1fe8efd6b7e7f8ac364cd28b1027f00e5af94486182b562735673883c80fc9aed667e465c0a26e9bfa111fb608db433cc23f5bb90bd6d911134d62bf48c03d896eae6d3a4c02328d697c9f1260b11c32f6bd80be24fac5370a78bbd9f57d9b80c59ac5715f95dc977c5af3742321990380318be4c3df1c52547fe0a2d20067ed8c9f90cecfa77ca2e72b3f25d498a853891c9c5af4e8671017e5a75c511f113ea33b3c82d931922f7109e1e60e003ab87fa54f5c1e5672ce88d57cb394144314d95261dd04d46aa0e88dfc32e8bb15fa39db1dfde9cf7d867415429a989aec3e47dbd3f6d8508627ba61eebe811d725d3a85f489da85f42584ee066f8d1afa909fe0b5506b2afe3fc615600238870323a2685d3d5166bd09c4b87cd6390e910e6d1f314d1b4c4a90fa85c724f818ba48314be2a822c2d4bb5bfbfed6fe19c22f931e272b92f6b7947bed9500d09a40b7a264ead6572e7926b577c56798ae656b838656efae11dc68db0e59d072b8af6018385abf4187a26de5d9ad8e77b83e8f01f8a41df362b1431f74947a674b0f8ccdc6a0bac863330f3f311a95b38637ccc6091bde5db765eed7429127b36f67d2b4bdacf4e7bd721e77e37ae6a51c90ac89a5523e1e0b636b1ffde26abc21d133efe73a5f16c6277d38bee6f98916ef21f87fad2597aee4c432b9f89eccbf9c6b7347a8e6fb41fbdc01c829eb864e86bceaeaef04c95da6ff9a726eadb076fdd24467fd656fcdeba2cb706ba09943538dce13c7887513e6d3107f539ad547015e8e462ec4eecd6bcb7bad83cc17c261ed5b5371c11225ef82dcab9d8928d67511c930fe07e8c467b9248dfe28d0c248f4af9631c8a419f0ae9651df1dcc98e75e2eacbc3e379ced255bc47948bafcc32692d902bccfc4325adf3383f810f2ed03f30919867f6b606bd1858e0de3f8bcafe095aa3bfecb1b9d5b790fa34480c3cef18b73a0690d0dd9ffbe8e17cd24f26ea7432b3e41ccd96cefc92ff87fe8436833ae8fe3f6b7e439e64bb9f57670117ab3ca295bf02172e17c6eb41a4272d38f78040f559f1bea11fcd982e4574a33929f217d3aa8eda1e3a8cee920e9603deabaad6ec9f4a5a90fbe6ec05c2c1c0698d127d1a347aa5fed7ebef96901933ec4dfb1cfc379baaa5a7e97d51f6a33e0616f7a4eefd8568f3c9cf92edb9d4c8b24e5eec158642ceb91cb92e3b2526ecfcc1f8ce8f5639ddceb9a52a2da5b193d941777b5870565534f4f3c96873aee1ffff0dc86cefd859a7350431dba1a0b51237319a2e73a1f5466e69d2eaaf6d2701aa0f2f8f795c8737707a39978d1771f05e2b2ca4f439be6cf3f18ada7246c9a033da6d0b7dc172a2d94c1ff90807c49c24ffc97c58be072c87dbd71f4828332badc891f5e43d6ffffdcd8613923dc82e98adb1bda3e74dbd543ae24a8b33a5d2fb468df787ad7c0372566af76ce77b8a18cda361cba5a58c1fa792ca4660f29c9b5270e2136956f0ec1f9b672f589a06bc580ac09a5ecace20788c45763b3af1492f5d3f8a2d5d9599f0e94bd2e8eb48af211ac9401b59bcf12e914473e3eadeed7757a1a6bc5eb7413cb91bb4f1406023b6aab1fd5cfa8843e4dfa74028f506bd7133d962f0a313ab768877f414e7d585d9743f4198642d787fe40114b92a2e25957a8d14b8d8f0a5f005a945b997ff163962aa7e66071e6e3787e184a9eace9b4c775dd1e87117e033a8e8ba9e7dd47f9b7bf4e40da22ecff3f514a1bff8b930a94b80f8aaa47adb74574a7fd396b8572a97721bd3ab82edd37c2cda4225d6b3d84cc92f6fdafc6b1b1df1807089f3ffada80392f9bcc858af3cf22b1c9aada7bb6f2add61131c3a71c1df7aa47e3127207484dd99cbcbc98a08e08f30cd109fb26a41f8c8efc52acdba3224f68bf8ab7960b064d7bee73bef5c57dc7b9fe5b8e5d28d63694ba7a80d98c460a21f9d5438b8cf13f154310d9fa81a753bbc07f87413479c775464bc7da04d71df6dc18bf1ea9e63a52a23b15665fb7db86f7e34172d98f735b9b819bb96186ea68338b785f79ac19d0a55cbcaff41fad7f1307b70afd42ac736d7cd7e419be55347fad6806da380859fe56caa3fd42ed33244f6f1ba69ee37f3b8decd32e55b681dec7b8379a0e9eef8f74e0715dfecf194eab99e6f06e519484c5d8029039b5c4a192171159230b045594415a22daa230a8a174c6a2ef5b29278040212c6420ea78c81b2f37cb8d783e2c8e10bcf72e977f137d2ba47ac00f263b2c0fcea7bcbf7ce432221e655cdc3e16b074a54321f9d105c5722e9effacfcacae6d5a4697c531aeee59cf43604510c34b2cf8d0ce43fc54c14081963c73a35add148b4d91fb02a1ca077fca2b2fb453405d67ec3a039cdfb976e66e3df22c5c99cb9955ae5dc909610056f6865e2c50dbe4bfe7efa080292dfd2f2a3e2714efdc7782c2253759f3b91bdd4809421f72c1e5bc66209b92141ce7c7bf1724ed7f881db00ca6822d74e6e99fdc7a7b44f9a81503b238ec5f2f6321b33c0ab60b60d34c13b9a2da13c68ed218758fb3f21d67661d773faacea51cef787988c4cef6aef7cd89ac626b063639aba1a466a53b890f63345b0d197cd7ca36343d12ef314dacf3e02e1a236d1121add527a070b69c49fb5775e4205ebc274428bbd515faf1331de54a05245ff5f402be9c6aef3a050ea79d2b87d93e1a8850124d2606800b23049981afdeb2deb9b8d292038b49f05d1c6e33a053a289a8f0aea24a3730896658e8ad894ba76d42b9412d1def126b6944330b6a44396d5e76d2462b7469a3cbe8d656981e698720fbc8586b6ca054c3912f389b8f6c44625c2a5e60ae3a9ed5589ce312e595d7bad275bd80f4cc938e98581619e341d37ba95b6f5db5bb7a5acf358468ccbf12a0aba706def5e399c3985bba83738af3f314001c028cea1a9e9b30abf945041f466bfcae3311be08d2f707ce6441a16b600a0b202f66716c80fc005eb57f84a448a0f6ef6679e98db057f0d7dcbd1e5277fba562a62c990768d29de489588046658d37fd71d8df2bd81d2467aa030b209c5ba5a4cce0991e5cdc9bd2e3a9ae3e9eec7de8e0af674a0c2ab3da856bd133738d27c30534a6f4ffa42da9a61633e5b99e425095c6994fbbaf54adc29c1bfecc265275e7a5671a308ae7123d10c55585d5acdae1bf9eadcdb9074f374dfe1c6a1958ca3b98e50bc21459bf9a70b91a4329e03708ce20cc06cf3ef27bbedf7054cb94fb30bfab9285dac24f4fc5099a9c75847571c92f1d818a7f75edf25c15c40ee5fb7c064761954e9de443ffe5e7aefdf10d0cc2b3bde4fed1dbf8b9aab6ef314faf2470043b4a08a53bba91143eff046c7ece2cf27dbb5e434c847330b334abefee0f7e776377fdbddc9f9627837d1cd8efacb33ee83776c1d4606896df901c69fbe4a66fa1bb6f0ce7580f663c2e837e0bd57f7dbed2dbccf11e9878010aa18de483b903c1d78d52ed418c822f55867718e80924c8308568f685812c330d4dbde85c15efeaa5fcf84db10e5c041105ed611453a152c5f6718fca9fb058d0b77062d6d8b3a07baa67800c55b4a9761870b98831be0d3562a7789c59c839c0854171cb1ce1495d534024185005a4e556a388bcb51be5d0775489b7ecc889f15ae361e57aeaee502ddc6cb1ca024cd57bc23bd66af0698d1bedde42a4c4766535a2d8c8e86437ef53e394cb82d0c8418b5eb5b5ccdb4eff6ee751d0543ce4a9c725bdddacf7ecf971ef8715d1db106fee9d683ec6f22ef71172d4ed7f65eae0ce2b91152f4c9681452707553a64d1f38586398452cbb155902f99a1a1c5c527caafbb57c05c45c6172b1702fc732d645c279780e11d82d62e4ae47b55f4cd62d78492fab335abe0342e269d83e26a59d3b027f96a5c1d36048d22856234d2433f89829eae88257c48f9c1030e6bbcec2f893967dcdcbda74d25a738c8035dc3b55d7f32e1f09e551e2151eba527b01709a300e0579f7ba034f8a37a8e90404df5fc1b2da8a449d5a51b6f85b787c936cbb3751a1c4ce0049875cc836c274201daac2846575ad5207112e05524c44d773a81aee03d675b6879fc621c1f4bef32d5df902ae1f8e8624ffd80803ddc86d469bf02762fb3d6d457afb855026b8b0ca8cac91246cfec1deda7a939168f8ff14119b504317ea2865f04e081bd897d6a4d10297abe36aebcb855809d2cfae2101d7e7775f5cf274613f66865db5b9a132eb7de366c0fef85db48e4a2499e761bdaf43951da6ad1b577d38b8d133b5a621caab45760ea7007aa9af9a32c1a1f9c05e18f313c05b9c002622b1c696019fc01e49e4209a0b84e4218c94817a084370899c6240223a0af980c52a8442ad00d18964169c408e2112d8701e447460287a1e23ebb1420248717143ea3120410c623501613a4600aea23849d8c44214af102916f401a3062fa0ac8220d45a8321d606119974680285ea2b2982104a35837319844a41651841f80bc4692c122d055941c51680295d1050e8fa124a248711197c10c3230657508c14da60be192b69619e486b3cd126d3566a38a2d9bd750583353ad44d488fee7cec4cc2b00a112ad2c3d20e1332d91502471102e9b61680128af9728bc4948294e29ce40c96940327084e92b403e69a8c456420f78b80c4b4a0441dc84cbcc0c42704aeb25164e12d28b52886b10321a930c38323a8a934b1a5a2295d0cf741a89c848b510844f03ce384d9a4ce52e3b87a023394f208250568f802041898ce28ec41a1ada8f4ffc1ffd3343e0ce8b3958e42ee2d416b8944d0e4523425802a574e5c8f0096a22c88c8c9f9cc91e710aca95d02276f8398b24c670d49161e27ebbc45d5953936d9ce76871145d75006db9d39c0f570ac337574f07ad9df7b3c3f39b876c4b90a63dd942d642448e9e1ab4528b673a9a5ca22e3617ef3a729b6d4c83c902f329907949f8a0e244e9759632802c476ed6e6a12c1bb71709366930e381ac6ba811cef870c87338ef7f5a8d5f2a1a336038d77e2c90e77fe7a10bc0ff040c61a53be4ce9cc14a7ffd4deacf1759bdec73a07f5031f65d2d8f5fb49a6186fab17134fed2f99da23c3ef947b97566c55346fa1dcb39683baa04cbe5edf753480e2ac79df58823dd8ca3a9c79015ba398cd1177193cea8553b90fb815eca60ea49ffafd36e22688af5b7e5d1e8a295d0f69ddaeb27ee209339e509969acfc3aa59b6393e24264f373e236c6dde129d51b4a6db43f361f161c0ae8bf5410267c2331cf3cd74f0b9d0a34cb8baf418fa32c7808903eeecba8fe69d92f62ec5765f17171cfc5e23f2eabcde7b8b85b9cabe661171dda638810d1cf143de05b6bb0752ac5b206ef749c3c9a05bfe06d8bbc56c5c49f1a07d6f45fc4c2fd41d1578ec386fe4037a93749d4792332a900fa7d984a37b534c1b36c03f268cf1b3d8a82e234025828e1da55fa1eed05ee7f22cd76addd7cd628b961b57e15e5b21e0aa1f6369f5c03360db22fcb3203a5c8b8a76053a7f4f71c7115b27474e50c7846ae7d50b635f64774dcf5d15b460c1d86051d1864715c0a35b718c553f1af01ed8742e4711429082f0c56d0536ea62f6b5b1e53f8a7e600bd95c0c9d4b8cf46df742772129325255500060c83ff3f6e0f8657e0a716906b7396e1b7fe46222e9fd263a2e69368aa340ad897c3d963635da2b0c601fde5aaa6dcac4969d7f79e72c3b12a491e61a0ea0972c9b0d6e91d4090e0f32eba3b0842c4819940cced45433b0fc9b9cf07ad2323eea02b70acc28690cc46d3253f46b0d5d47501b5c5f7668560ae199f30b5204e89f268dfdc204284d75466de2a84e28a33c3114a88941a1e08bd472950245a60a40d229b2ff8815b27f9ac5f9956bfc8817cca25fbbb484610d152b52c8b8f22919aeffe48cf597a64dfdc206642d6d73d50d71c95b8102473256854356e91893d46d2f76d057ed3657f06094bc02a8792457f6b02f7cfccab758fa40066adfa4fa872080755740564209c42b830ce9e07821044c09479542205a58871892a786b8cb21013ddc5c106129e26e49c44413ab2b8a5caa88b62c52ac8b0b84113c65dcaa3482d5c6bac491983ae2238f1cf471ba40024721b725125f8d2c5824a957491c3249ad4e6e144a2028e538a9444b2b6b88255f6a89442e59d4cb05c1049362ae904ce09a59976892564d8c6493bb6eceb67082a18ce6514d808556e842bde1e496e345eb83fbff2af2071dcf72a37c7f8124305c5e276489789cf768608b37dd1dea9a66ec0fcf4ba55b26669bf2bdd958a84fbea0ff4a7b5f20db3e415a83b59f18eb41c7a26830cad58e52f6cca5d7a8c7b5881409f9f8c8a8b326c0ea40d3beef58ee441747ca88f9e313e11656ad185b5e668655840fbc4b330a10073f26779fc418d7f2ea1d676e343792dc3417250e170048f834d3a86b5e4be26ea1a77c350f7a7678e36b3bc2171cdc9685441d3d079122aa5ded316337d6ddf01239a436d20ce817f4fabf8d26dc006fe873f060fef6b61d1e3f9c87cfc6b23e2a2c2ae42e2e13024519b04a4d36e6b0e01a0f73e198063876e3edd4e66cb854594e0063fcf571ef9aa3b2d3e3c99a6259f7390cac612056a7f790e18a21d0adc365864da8a3a10f863e32f4f9f61897ade73234167e97b1bc69b8893b0e3bca156a04948f8020789d784bde623409d2d7401b0c7032a20481437a1da0dae4afaa378b9e724559ea0e5567f4fb30bc40db81aece2211be34e322d596556b6a4b8df098f51681ce277d2c7d9d6a8581babed73f2191ee1294b690b6fa7078034acc2bf00000cfc49e40c7bf64f3b81419e2f252e15b8777d983140a8eb4da079c1759d596e009602ff7ba0055d31d7fccbce52ab61dbc4440518b131351f0de147d6fe8157fc816e85ecfc9561218eef7f2c85fc844b618b403eac64878235847bbef67e8183d67ff8035535b2187ccb5d64819ba9c3cb44e83b4425b198f95b50b659ac4d8ecb4469fd8dfa77733d937974939692c50689e4f189d18e661486f4a73746cd1476c65169f48950b265baac243a62e121b1737b8bd121b10d579d94161130a5c7df24063ba8fae403777d22905523f0a210b991247a6283e096d999e40b3f2a936225a28aff1c7b8cea02e716ab4a895207b5806419fbbc0041637b773346265849dc913a430603a140ca492e98ed82e4808c221d84513af6124d914afaf4f469357ea9c68ad26fc93dd7930bafca012adde566b077605d77a70ce0b82fc644d9bab45be28d2d9a63a0a87d50706a860a9111e2dd1b213207d057c514e9bb678bd6aee15045d5aafadb6905b0bb9a910333be412a1225e7bea0429dea9676e4591abbe146359c058b80392a07e1df2ba95bf6f11b30f8b8010f77a469a9b407716452d4eb962fb75a833218841aa3b8c74da97abe7648a96c510be9f2125ecf6f4e765be3460372d9f9d813ed91e1ea813df194dda484d4dfbb05180bac4ab37250ea06b171568cb23fbcd74923a400242d07d119447f1d446e288df76bb967a6f04c7d837dc128c63acd1246e2a5e25eb6d7a516186b306b9afa5fb7c7fd46fc43e6eceaa7d6566dd20d0782836d23410803917e805b89da30024dbdcb0ab0104daaf9c1681c571cbfe6fecc30324011f60ce8851f8bfa43c5b03ff5a9aff5adeb0552b5fba6634bd50e0f07fe6818def32b644a3d20322037d907c61f3a61c316dea35ea62bd154e6800def208e7bb0143905481f702b3c5f8055d043728774745f90ed3970d525a38ddfd4551629ab6e2f38953bfb6ce40cb7ada7ba652884b8dde0af9c6fbf5bbdee2a2e6222e16785cbbbb2b99fef10dca89b5f47ba0ad1c3d47d609d7c6fb80d5df3cc503174276585cd0d47ef7cc777c69c4546d88bf9050fdce05aa36c2d4c57d0a5d8ca69bcf9e130be799ad336b971f7974a3a714d983ecf02e2017349488b1b2d35de684ae0088d8d359935327f19c48b94cb405330bb5f655eed47253cec1207f58a27aa047f6b5246114e0b855b3f0baebf11e1045741a32413bd53147e9780eb72a04c5dceb3711f2276f3674d52ee3fcfe238e32e6420fa87408fe1f956f2e7cbacfef979f7b5b98fadf8bd4dc1fdb24daf747d96ae4fc5d9aa4b4fbc83a1e708bae164edb2b1ed09ad387eb0b9839a7682390412c5a2439091fd43b317d78dfacb0e698b504ad32eac3f12b8867faa588f7b2841ee7c98bb0d075f557c530e8de2c9641aefb577b2a2c5f31188f595546c7cfe6f52e290aa701d78500a02326ef7901d78340fa054d73f86a970e7cc5d853fae54980217f66889ffb18888feb9abf6d8a8a19f302896fb83c4eec0386134ab47c0f716176b2f0e864ac8d3ee97d93af84d9130dbf4b281ddec1fbc0aaaaa345079f97198660437c8ba4d7ba80cea5aab178c1dcf00d725542961150e7a9612c16248e44429681ae1f41487f84c7afe7ab63211d3506ab9bd606da496125e93d7dc460d0a7b6e9a14e7489cfb31a14152dcd39fd520c6b62c8427fad3b1604af6ea8631a8185f3fdede488a3fbaed77badd27dc5d7334e43f104707eda89a79a53cd3467cf4e4c37db9bb4109ae6f38c17f9ea7ea11613e4ca531e3b4fbcf93b8f14720e014e84f29036dd9cf86e392312e67d1b489803263904ba76c31a1fac959c10cf2e98f3ff0ddd651bcec4898da3d43bf64d46f83623ff1dea8660ee6c2cba139cb7ed31a5ceae49a5dddaf94c7eb188687402db583bd2e685c92f9f763a713b8cbbc633190028bb3d1b2af9cd4ae42361dc7bd4290fcc6bd023065e6c2587e29e0a4bf7c46e7f1c356d9dbaf1241b76bad0017fd691ae88de05cff31d1335e3ed146476e8385d3b83f5d16e2bafd2799ee76eb9b1667af6f54b98fafd0a9d5cb144045b870f1298fc62c46e414da512aab13d7287100cc10bfd1104c1ad75f59b3f98950cce8c5935efaef8cbe3fac8e56d000c0321e7ee938402ea9174ec3cbdc42b3910edce9a3e8356fd6034feaa7c98bb70064b0807198e8ceedabcf764e08184ec75adc78ecf671de43369c7bf335823d7cec596c79ad0cbecd8c56ad53206bd8c45b5d78eecef3507b98b37d6dfff8f81ade54156ee8062eafca429bb4d23828e260001092e0ab496bbb1fc78a33861486c0243d6f077c7c6617ce9e9fbcfc81d7c7b27a279236388bdc13e8b030c6397d48e31f05e859cff8248f08ef8c17a1e69e8a0fe12cc4a3d3ccb980d545a4ad7354d0c8ccb9c853bfa73477745782411e54a478e080ae549a0959b681231945fc860cacaa7da0ed0b1770046c2bfa5cecd555ec894435458cd02738f2d32639f649ff5026464f67ffacb7584417106f762314bcaa472e07f2a5cbc2bb7b03dcf39d13ea7b5749ce1a632147805435d50ebbd2965391eef59f064b7ce8db5c32fe38a7ff4306504056af9fcb3f212e656f7b80e873f4c35bfa47fac40b8558577cad5ddb17623f9c963cd4857d3e93f28f7d5e1ef1aba25f872c284f62f917ed0d7d97d40cb3701b88fb63710f173551b31b66c9121c5558302b6567cacd354d691bce5854128f0a62c96d6cdcdf911f069adad74c154d5df663f19a9bcca16c1877cbec11e4a22986659ca60adf9055141873487a115c30eb5f30b931436cd9abced3376e4cb74a07324757299057b2298da6ddb313dfdec0ac64ac8ae3366ce2212250fb64139c5256f029bd6eba925b251fe577b3883d33378906bb4651965ae4ebbc145d86a378b73d5963ac901290da40b73e265fd7ad594ea48e74300052900345a6836040b45e55d40d603459b3d25f08d74c05de576075ade6271361dff757ea61b46259eed97bb1ae6a5c1e37693ce68ea999f67ce3b60e4dfa3ae1ec0820b9882d33014b341cfc5cbd10ec3e217055477f10b98d0dde2a2713e8c7eb04dfc7f851c3ec5d816f0ca53e18920eb1fc9281a18767b42d420ba438d77af5494374954d2be885572a9d7453abdff71ed218696114c47b544677e57cf50b6960461b27bb628ef8c6b37d08f61fc78748d0d8fa3a66012ee24fd403cc1eff0daacec41cf64fddbe95acf19738a75245f41f815a9415a813e6451a7486f9b3df0a150d52f9544db4537db82105d47c55f51226655004f1d4c7ecd01d0086cec9d85f1e00667c1e54b69537d91877b36a6b563a8bc33f13432f7bf780eda46fa6d854f4bb0fa543cf40d9dfb091e9663bfd78522a9c7ca58caa36fe298013a48cf033eed60d1188ec797957a6903e459737b52db46c0e594f6757ab5a01927769b2edf24cf8eb45b97545726a33b9814b9d01993ddfaffa6b01d10a02293f3d53a61cc05498c7ad087d5743e8cbc3b566cb3b4deca277eed7660b46b7b3481ec9eb6362d532c5f88a0ed05336441727f8e9e9917b7ec525df587930b43e9d4a08667be9754db97360c3d4d148e8fcf39c07ba7453285de4ae7e4731014b9db47c66ef46dcf91c3dfbd011bc67568d2661e415e2b96830a8be9f91f59b8cf0dd3fbae925af531e86eacba66793f2399a68016fea8f586ece0b5121792b5439ba42d09c489f1c06576f784dc487ab02d5d2b0c6221bb8557633641d9e27923f6f682a6b506e78a08f5bc8becc6381f8c52f7ec17dd0b36a9be768fb811fb600a9ce246d829b527eab774f3a857e5b87f28c9f67a0fe190100af22dc230f97b26c3923390f758ae5ef1ad05c987210cdc65b47e096847581fb2a9979977ca7666d407627157bf06cead4dd6fbc856d8ec54862ec9d2950751a5a1e479602c4d557496fe979ba52878e5842a02aed9ad1dbbf745d97fe1bd5ee1f72efa6d65f77a56c3ac6d42bbc01c4fd5504773124bd7b9e595f808d028b3c7c60ecd4b5a208d158474b6bcc8fbdc61b6bcdc0fc6230ad81f75b93c4bb5d30d73402abd212d9392c2a1b3ef733d9bbc2c1324fb3c98f72ace60a7f8f4622c1771de46e80d87342da6927060f593d4f7101b1895593a796efdf00ab1e41f02e76c0161e2cde8a60357149f179e6327ad5b0cfbf16ab5b78a44745909e8f7c7aff3c449e4183c844e75d345b8a16193ab847c645a61e415247ee41114aa88082124650a8987c8899884838b2a885c9e4d34a3bbb2bdc994704946b2db383a3f77afd48d6310a6b920315f719773ae310bbaf86d2ad87443d9f356a9b06ce3524f41760afc718f3294fcb163d8a0fa66291ff3565eada10776202e08060a1efa25b2e49e7faf3c676cd3490bc901f42939779fee0c6b369dfd1841e9236589f44c78a44a45fda4bf6864dcb2b0de8dbdd2ae00b765041d59bbe94682d6aea7687b94b98a968843c10f854b92fa9048656e88d1fee766c771a7f98d083908f3764baf9cc564fa834331d0fddf5c106e28d4c27651ee7699cd6741f55481e1d0b56ed27299c8e833819a615974171703abc57b392ad7ba36c0b0f42e90e6d3122c607f7d2e5e21f56189545b0c3c0ffeac3611e3a05fed982c87dd9533b2e5a0bd50b028e8148d23bddb950e3130b6a3a0eb93b7a68644d344244fba0d7acc7c83cbba7b7db963f835e00172c7be9f920a755cca73149ad2b3f04ef2a62964f4c32a84e40e8e262024274c7a3f305e0d5c8150682aeddf77b1b4189c9310410c4e1c9343ad19cc42f771a5c3baab59d2c500e1a7a22a87ccc270fd37dd00a2b2ab4347fe29f67701226d60eb009f7f012e93f6d656d612a60f4f6d767582a5784c8aa40ecc16a76458825e9816f1e967c42fc854282752d9976ad7fcc1e455c13b3381c9e03c650b4555836a373767dda2db4141d757bc9fdb66124272af38e2f8729998a6cd2fe095734f37c4b5aa2d09abd966cf6a70138cf7c664423f25efc5b479c986360e42561e87912940fd662700eb8e422c08d7f04ed8e6b89b31858142017d553ff66a0875a9b8476605fd9bf87f5e64d3d84c5a92abced709a6826a3820a97a6c9b1042bf4c36fbff3877b3e1331c70853b0943c15b07c13b58b54f65508aabf775cc3134c23238eac2820ee6488068d63d5bb2ce21dba4ff04f0458eebcd24176afa04a2977a3d9416141cfef94b05052666205972bd893e24852838f34421bbfc320e5501bd389fde4ca6611fc0de13bad0670093d4d171cd6dd89ca9a247f8ae15d41f3cc6489328d21c83cbc5b59ac916ca649d9754a7189d278f925802ef8099401018a2451160e09ba95f8c15273c7cd80ec5a99e3d3f1707a6f0ae6ec4c91ae7b49ad77c4c9c0035bf2d93be638196d883b941cfa910f5b255d26b21a306926ef19aed64169178ee285d053d84ebe5a64f23c9082174d05152e61e48ddb4b60f63a5adf41452dabbe252532b88a3e01318322c70e7e335dcc8f08b23b58461a09dbca87dd2e2afadfdc6eae4515f4348ef1967a0a20e4acfd113132fecfae006ef37a5a0913fc89e07c7b370c7cb1458537cabfec0ed217fbab1b03b210402f68adf9790a84202e3d789517687c7ff1c8839f3877b79d1f848962e1914abaf03a717e1bf12d0a3b20388070c41973f7a648b4fca8f7b7ebe70df51e57e06857f0c2da7ea8746c830b63ff92f5030e3db9c550c36d64e97318ff0b7aefc10d22435e9c0cc3a5f7bdb804e0d0195ce67864ef876b6b5678ee0bd96052a53f49b8d39e3cc69cb58968f0ab6e80a927758e4328002fd111c09ed261e3a766769aee66d483cf2e02e7795bd12a3b3a300099e1df09a1c78171980fe4c0e7734c6d3313e51ee6baf29390a1d730fe74d1553ad63c335f314bba190568346aa968151fefb5ba675940c170db83293926ecd182009ce01fb1013baff1c1ea4e5b723d7aefce71a117e4f2cbb9b9748b6df46d6ec100626f7591f75876bb0a3b158f0f14472eebabb6e638877a8098056a94f9f0cb9d227b51228be9bd01356130c89c6a5679820597e33abb472f522ab45e19d5e4f911a21a2b9301bbdf302d8788a7be347527ed2ba58705b8cb973031476c8261fd8219c981265fe2169020f45b2f5e06fd033cb0fbd27b0d93f978aef9982da6754add3c6e907d91e9569100e327daa7f5a92d9236856747dae1c35ba028239d0c782b72c07cf7799a57dd70d8551e4254346f81c4ed0210e058623489e304a9e13f3b880b2401664b2d4055c4cc3c74424dc6812fc6b81cc06408116ae59cdab9606c39c348ff970f0d671205d112584114078557cc03d3bd1acadd01cd7e74bd51823db71f5afc9d12753a85c0f8fd8dd9711a5cbf5309712b598cabbd5f789345127b280e973600c896cb17e94eb8dbb7a3a11242685bc5d321bbc2f65b052838eef9f69e238eee3035b054ca72c22a254938fb76195cb1d8756bcc4703019e6801cd47332e0c650dae2101962e0462ca57d71e3ea4a77ae05914da77101d7e383d591aae1a6314e33ff10e568171ee3b60bc6ee6d9a6a6b9306015c03fc37a20b5c65e91d8eac1ac3b3593f0a633f0f434a76f9344509402f0815dbc93e89836aa5c1a7c854e4503007533f5e7660b07a12803d718ba4da8974714f4fadaf0ffc89e60f1ea0174be4e4fd9521a09318a0fecd0b43e2ee8468aa04484e2092ca194acb18681b6dd84acc87f0c5e1fb2b0310713b290b0d373f393df2f024a1c7e0c185809f0f21723388ae15526c5daa7d8a6c471c83459c0f41ceec84677e09ea49a789c832bc2542c933a214215a121ac491e43e80d669f9fa8aca0d42f2cc2043f9fd1349e76678ce6f79eb3eaf961fb83ea307f7ddb032ca874baa40f4be73f6ec87b1712566df8b1cbfe5591628a7012c5096d383735412c42311a93482f956f1d74ee4458deb6e1d3dc3547dd472cbf3a075c1c82831ee84aaafe1dc246343d264b34dd236b71786ca2de103ad505aa5253c679fc9407c0b93c64b1cf2ce50d7c7f2c0d5e14f73e1bc03b14800fd18ece040bc2e03b6436b6377d8a528707882042aae2562c04ac7256bb8171b23b8fd15bedca50862c9d9574388cc99f0e4003ffe65d3852e1fc6a836528fde6b98743c34e58210f8667a88212d93ea66ce128b1eba292ddb22fb90e97c92049fe25574d2812f8392e60b37b6624d8e47da2dd0343a66a9e2a6bc2e4710f6fd457b0e15b8c0aa2f11d966bf95a61b8e58bd1d4501094f1a63253fd5ac588b4d51e0cbdb580cbd1381f1dc702ed677324f95a561f6031bc46e14c79767408012f93e1f17813816cb1bde16f1113a6d6b6de6acbc8b868aeccd98c8d86b60b357841fbf28cabcaf94b565ed5804fd5954d33c6ec6ca0885819f5ed47a31e8ae582c147492e7550306ea8836d0681ab6b3c32d624e9db32c4cfe6d01d246cf0217271bada4a7fb655c853528ff28ac56b414b8fa0508a43d97618ddd92a342f2ea69794cde3cf75973467804f5cb76d9e2ec2888a19e95b2ef0a09f64f2ca961fb88e0b3989c80dee10b443587e336ed6ec55bf175cf254db5eef3eaee5e5771bbf06e39fe4f6bded6ee365a621540d978c3b21ed6f71b5ef6df29ca3d33ca21ef108dd4ab835825367fdcee65edb17345c67950ee205ae44a1ba4b79c5b02a4654f437fb44c98626ba9b8ccad75bdf53cfbd0ced33060eae8fb79c2770b927564673c3a93643b38163d6b72d2d98167041b261f9bbbcf1bfca69ffc5c5ed26591b9d08e6e954e21299ddc7d11df47fafdea3c5a78a7677c4b9b046acb8d1bfc430d3560bba314d9a73aba9af562eed567c2ce75c5463f52a1add4bff28dbbd42857623f7bb7326997517004c13243bc0ee255084d2546914423f6d68fccd6201339983c3a56a0acf386bcf557ab594ad22e28eb56b08fd98a90a407a443d067775ef833aaf4cb7743dd91934bc8bd9a5d17cfd24587f51a0844304bbc98ee6cd5b5e858b0344bfd16ade640d9ebc1570f7f9602da052dfe997bbb9d99bc1ed51c2b636a2424ef415530562042483a06771d180a1110f7b8267589722ec4f5c0a2739f0364fc926239285a2da0f6bdc3b504114175e0c34e29673a84c05808addc3a4e48f8391d2969d50acf0a17c829a353e8276dc70148a24063f35fd0483ae3e13649007ec8c29535c675021c6f8ce9e091e0f12f7ed311d82accd0b7279e49cc6878d1184920f781a499806572d443eb9475397e4362932811b20a1b1b819b80d4ef98603bba038e2a2677616f8087d1832125e0ec38304c04277efcdac7a837c40f3284a83a2ddd956327e9f4e46a8284ab6d3b75f47c66f6a5a82acf40d15f6f9d046c28f4a8c1c408f6c6c7664426491facdc371bd4a66f008967efbd8262c43541d50088dc2943e0a99ceaa94b86be84f6ac4f61605c5e6ef8d4203f316035376ce9aed32b921fab07b3cd97ba1e0054f4cfee742d14463f1c7b000577891c42e3d0d159a71ca82ebb0b6579d769d72e0ec4a9017881b60c4e1c25f2c873cdf9df4f2c689db1687eb05b8dca1779c69bf0786f2abd441a78716209c7c9b8438b2d23ff3b4aecc7acef3eb3f6d6348e257098574f174e54c47f48677a4b53f7cbb65b58fcd4f2de739807da7e0d2049ccf7203f13a7869d490a4f70c32a9b13cba0b1fed31227b0ba49afcff23f1f468d26b5f6a8dfc61d679cc7a12e831382cf23519911d13a5b90f27c08d9d9b2741dad88417fae4ca694dfce0e7cfe0980e8cb980249c71d880c830704b9bea742c45344aaf6764124508b113db8115d6166c527425ad214e3ef4836638966b58742ad85750bc17ade634b6057054d88099c0106405bbc0dbabfa36039de592621e1167b9b895ddd32e7a1420d55c88aa7c656003023ea3d485396464d4caa7eab6358a833a44645d3e1a01b4eb6c2b1083dccb7a46e52f05ad9df8eb944e09ad636755cc3301b1d4226889dad1a4db85a47d39ee9c73471238238090c3afa8e2b47b54c6de0dcc76a9903ffa12c060b3b1f818b6c3c4f12bb6411a65685a9b0e889e1104dc1364a860450ae8612d73b712f4796f6f08c20cbb3071b7c38064753c66a07360f1c7f2ecab67387dc9f9a40fa9aeb904c2d464717860cd0b19b5cdc0c234104144f43709f022c19aafbb3e1c53abc083492412131c59869a92f68cb842948d9688e492b823a5ec453deabf93a8cf63cbbdec4c3d08f1e1770785271a8dfd0bd3a5aa6d04eded1956c8123913d147f8812105939ab4dd2b80141f80cc0422c759a994c3db115398ff803a270662588f6a23c5718bde38e9f0bc1767d5a279e101fb35c70ab30d8e84b504355ce1bc89af23fd369c23d6066d9b2234edf2c759ad69a31cd8204104cbd1b3e848bf5129af3e6f0116adfac93b188a8c97f41057c03035d555deebcb3ec29c4631d3e6be89f316a1f6f323f530c55784762fedf40ac3be4ff6dac9a7182dbbb66c73e74f893c25528db3d520227f21c147c10df9a2824ea3808f76ba25e36ca06a789b912db33cdcb59cff3bbbfaf9192b7d7748ce7ce6fe61cf2cdea914e1e38ee6a7070ae151d3aa94d86345012b173d172d51c41a82e7eb49ea7fb501f72f277dff1956be74d0b090d323d38240575d8ce9723c4cc9dcf11b0ce983221b86f4c7982d9e08b866cffbeeca58b16e472fdfff4daa0cb82973622daf1a5ed71fc3f3b90b66fa1c7caf2eb31c5cbbb7bb35ae2b8ba179ed05c9425505a8d6ea169bed39e91d75ff04174a2611f62a372a345d84f94d5d052c64ac19adefb9c0928355e8909b432e8fd84fd0e239a90454ebcf5b6cc8912abfa9543592d516f3b76f1ce67e335e63cae5b5e29ba731beb618de38c5d3fd6717c9646515e9d5031d05d98c1b5f55e899accc56e4080de313327a3c6e8035f0780ef37b98bf7a4cd5257d86eafcca00638e43983b679adc653f8c7e746ed9ff59afa37f64b2fd2f9af8004f209cb400a94aa92e6e9df9fd18d03c05e8086f48fd306f94d76ec3ae8e08f5befbae28fce42b6faf48ee786d6a404475fa53b362a3350b893788d44c4e3351a36cf6f40f88954793240b03bdfd2078cca5cf341c1a8359771448fadf4fcef5e04157dc528f281f5fca30e58e1701f2b280f7d9c1d1607e3a62a3ed462960fe47802ad8a8fce04e719fe0567c298163280c059472efa33c04acb53ec506628f144dc3a8fbe72adf0d4b214aab14b5b3274167472a95b494242af20070d09c9c0b8b08efca65c65f37dc6d276322d3c2ebb5c8fb7b5ced251a4513b4ab889bd72c36309e46e4e3a60e2754ee8c525db0cb0c7fdc1038a677934675d164ae66511a4834904f595ec39ecab04ca5fa02c36f59216b715da10cbcc3aaaca09ad25022faad87abfea3d885ea68909252a5fe8fe39aae1fc394905fb91302af950c2a228544d664e8a173417d5c484bc402f69b9e3a3abf3fa74bb1b7b0eb6c8ab0b90d8065236d971429ef382e68d6194d71d4dd8345ce3a22e5dc14ebbf7d402c59c6bdff5d7d94861a814b2ee7d9f6b19b54fae2bb792a3c52abf736ce4cdd266da0f1807d4aa0b50da34001373c03a8d9673bf3e10bd8c630e97730a38de32b4cf15766757044d7642168419dc12dd4285d62b1ea4f00bd133b16d48fb5d81e10ab8b1109e0b2574430b4be463ca66b4ac08471b877122ecbf661de113a95c6982af38edf8bb5ff7635da62712a718c700b7a382c3c63ef2cc0ea10ae2fb8a4761323186f24669296332ec1597d97387293ecaf0fa573813766d57f5f2675d9e32527771dac4ba1a891412266386ae32cd697aee4659076d00821234e193e688a6a973627f1a4e3fa90a5181c434152aa9fa60156d5e053bcf6316c2a688cc9f42c2a155dc12a5668504bbf863dbd3d9002c2a94a5aadf139489531203c46302bcd68a72f2b66aa56326a39c863402df8d46c0201220595950d1f96e101a153d71d89f72b5ce35a404e8444dcc3d0b4eee189670f44626c72e535f5c5229cb5f3223d4ad01a8df72c847a32c5e624615d6e24c4896e0baa0e5149cae14b8b0197bd9c0d53993062959d664a6d6c24126ea1b9d2c9c97da4d04e09119a6037dfc48279550321ab7c7d777f31c2e9326ed5aa2d2de2f144ad1b26521d89c56329202f623ffda1ee87ce8fc373a7e41a2bd9f02c9e232648abb229c99416c330e0f6ca10fa189f0e10a7eca663845608317b34421f4bbfb44524a68a9c9ad007d0b7c3bed115efa4d268834bdd6446721d60e5c9ebef44264ad4c57d7ef20b8751e90c8421b5a0bc3c2262e1324b71ada9903dcbf10f90590689262e4c0fa282f24673ba4333467a8bd176408f67b00a3c16696ddf69de72ce428b272fd60f086290d670812506d4353264d0e0a5340ad411862d2bac1a3980220cbcdf3390bafd861617b8f70c66eda6928148d843681df576c1116821a5cab3ed6767adf29b723415ba361f7cd4318a9bfea7161253c25fb3254bb88b372659f4d0b9179f48668ca495b99bad48fa4fbc176e1db55c03631d0dc6b17033f3db4b5ea758ab8eb4651e004911f22505679d2c8a1676f97e3b993d665548c01ab42dcf78ed0b93bc4fe74c387bd31fc0409ccc3739d3bc5cb15a34dabbb566c9d570e3d0d1c24ee3f56d743cc0439ac071dbffc491f4c5255834938750c41e28fd54c124ddc8f31bbcf0f0d9aeb13ef58babe918d597960041ac80ac03ab8e4649a01dcc3593093898c646183e4ba2f3af37387759dcbbdef94bd329fec4072e700359d57f4d4c6d7270a589cf9d5c26428d5ebc02550c1d9d82670b8024d8841057f3d85e4cd758c3552534d2f0b3d246121e014a7ef5aca39d760dae5a252564863e3017e6b285547371bfde928e7588a6d907552e31a047fe2753cbbf3215b50418602f595c2165f0573a0f45c8fa44947c2c3de031b58163cb9621e9513489d49fb880aa6b20b0bbafc4da88122e193c3d93b5f998c6504d63b5c347adcfe879b7adecfd20b5476834616bd1123a4c2c9023fd339844ead4844a147b0fd4678b02bb324548debfda963670f4d4b2ad4ecbad109d19d02dbe0439ca68521a8533361f5f4943496829b983b745d3975a39b55a107b8dba2ca2b96827c81daf0154b6f5bd97e65c45038e3b3ce77ecdd920e56614dcb683a5f90097959f73c861362562a4673cd8f852caf057006dfc6f9c3618d3c33d497acac2414d2242ad007743c7efa4b00dc3632f9a44fd1bdd96722ab61bf1bd5bb81b32c77053851e8cb5bc810622b6dc39d62e52904c2f6cf9dddaf45be556ec6eb4fe481993b382f6de470b521e408286079b353da4dc92a17b1b2ffbf30fc8740e257e7b2409a02265bb4524d8b1c56590e8da18b551533eb33d96e3cf535cd50bafefef0916741122da620b5161a5b4ccf03499fc22309449e4d0ee11b44a373f27d2874866aed6300b3f98d2a0f21cbc313f2288a95892df83691d24b6f304d25ab3ef8ea8f95cd67bdb02977446ba7a8ac06fb6337f9fd7dcf9d48432a47a2c26dee9471252e3aea1129b5dbdb1c89dec95e51f870d10a9724f6d0179f548ff04e6b15efb4c9a86524951c433852a852526d308eb7799002f94809409a80510c81746927651a46d4c5a664d56b642575c50bc9722d5648b2d63916eb60c0129372faf9c52153cdea6f899826ccd8195b99315aa71e3dce35ac87a7ee8ea2830f28c1e4f42f6ed9808b229eec441dbb91c770cc17f8dd9e672b49d573820a0dca7123bd112da282337590b82e149dd0968a4e15c5d13f4d09bd5125f2c86ac50bd59865183b0008fc497b4c4a0ebd4fbb517409f138ad85d8d818a9e849cb1a1998c6c735d692eebcd76ff060e05286fd3a1c1317bfa860cb296e9c34797706dad0b3d4b989846de1c322a53fc12baeb3ac2f41ef780247854779c0b3f187d02a767a718d8d64c3653a3fd063eab280a4d9c8dff263eb3704f3db30cad2a05f72b657f1d81c895031c0b894977cacc618942e25330c6d56736affc61815798a7eb98c18cb3f00db5da5df122cac899b973cc21d8a4f526d1b76698d40195c8ea2c2fb1f561ff5dbba09715b4e7cfd13adfaa82d0a7d5334c11d291b26811a4f21a823fd84191df959e7b1538eff36c2ecdfd81761a95be1873f6c6fcfcf01fcc9182f3ba07a9297ebe9d51d86fc970dfbed49eaeddcff81070ccf766a3fdf5c34b464b086523ac786410526273ef14f7d3827f23cd938676847a4eda93d8e1a52a8e5638b8c39eafb04592fcfecdd68183f1036e70d27525ab010a2dcfb7fad9df5e60fd962e2b5039a873eb33d85387e8202ef670232243dcb08895ae11bdabb7eb92ade29c2dac1ee5e132ba1546ad23981e0bafc34a9d74aac1fece1d018dc7f04a48bee769eb45660cad4fef33a21146bde4ff9b95965447f0b0a92e79a16370891c09cc99979607ebcb085995bab1301afb7a6729e16e3e1666bd861951ca238f882a0e14f5787ddb5cb978edb755df38bb133c451c354e0787d810c8c20fcd2130806bc3280cb3aadfae4456a6c105ad629670733173a26ec6dfa477a8cb74c8f5da56bcef21a3dbcc22765758f197868d45fde1c6d0e71f81b3068a14e0a3f6771fcda2d84c55951e96e90b160792c8068d2a161f406122991f067853dbe79cc2c5400b7ade3e36df029a92adec86fd49ddc23aba2846608c840f0d7ff96b307c88b5da0b7433d34f7adc06cee2c5e295277a0e3bb3fbbf6829bac3fdc73c9af9719df85f43424954ad3cd8ba7d93b24ed8c7dba58206701c80986ad8c1a91e8c07e755fe4860d90a10a2bbdd4a446f08283612c843f6963e87b4297068c7d758953772ee5dee5bcc32959de876a2dc1c855039dca3fc1705abf3c5914075b2a53be607bcebc27a5e0238d6c71a8cd32b288ff2893452846035d112792e4975211788917afa358526901cad92617be9dd6231aeda8a800287408fc664a5db7746c89674a798a7151c2a880eb4545c075764d1c8d307947ac2e50abe8ce633b2a6209a85163e3e676790fc9ca73a8cb8634f38619eae0a4a170b071870a526477efd67b02193f77408a0f63e62302d36ce6ea9dbe797bb2040eee719e0913ed9b2d2081bd787731b106e5a82e4ed37fba6b43abc978354a86869669a71f4152e0f09a1db1196afa4467d2fe59d185babf053ff7e6e031034246c2847afca4d6911e9248d5d29b23ae6d700a2bf74a3978b3961b9a7be71feecda769f85973afb84b502017531cc9cbc16b4a04ccaea061f0f3678faac2f6b32230cd5c8d312af733c1619c16a01f2af2034c76dff3edb9c4609c716918cd0e590460fe490c3e326ec521515ac91846769a691291c576da6c2e0f4aeadc06a48805488427c4c486008d3687aa48dc46be88a94e82b74633e3e1e63ca45f7baf89e62f4be4cbfe616e82bad0b93dd038f32454654d63b7be09e0d4cf0e4e634d31af37b8f718ce098a6eed60d1fdd106890ca2646328ec4096acbc99ac07421d72ba47621917b45e3b6585b06cd62d8405c976e845d36c1f0c2f59c2c1126cf7c5b4a55b613dbd467ddae939d67c76ad2b9fd9bef0d1f7a831e5b656829ccb5e8cac7e5632695079b0279b7c9d2637845d2cee961e80f0d40c4e41c362cd2c0e32451ccbeb8429b30c09d054309a885965456b5913bd2a204211f3f36fe7e27e82e29d982335e6abc268dc93399d92485a4387ebe9c4fbfdb4afd2006c4f855b37ffaecfd254e517cffff9363b811599ef833d6a204073d7c2aad424e7da781bc1c803964a0683d1ac71590cebf88438179b1943a0d4c2eb8531adf12537bf934a8ac624cde30fb8579c04a9ef522e90a206c4a7e87c00196cde6e2252d4fe826d3913176f8c0fc6a6f1344b7603489da5c3b01d99b5c49990e5066538c48013227d89a1cc7d681900ccce199eaf6bcb0d5720afcb15019999d85a07582692be54263cb49b4fd31a3126e4dcc2758ed385841d51dce90a04e4a298c14e0c981c2b9bbaaade121ea36247f9082aebb51562108f10ddee2fdbd65b8238ac9b97643cc92e69a7e19315a6cb9875cee36f973b34de0fc7b303c9beccc6e5fc3d00c0ac219bf1673e421c5b8de1affb060d28a72cae8e864aae7a9a808018e72ea09bc43faac09aacfe7738bf738241458976acf0c5ad4f3421fb9952f78363a27298cb653dbb54289f0bf391e565890c6816476d7dd088beb3a4b724f84151422b560089e72d33e284127ac09454c15a1fca5bfe4a1e10430423a4666956442dede97e931762cca45927ef079dbb61824895a30f22f904cfc4e83d68bd4133a720182010ecda087e07d60f726dcbaca43f703aa8c00b3d5c36052e8386b0b590bb3899807972a52e086c43943c24cc9d163e70816f51517fc93594df98511552611db4742273dace6fabbae40c51801d7ef45907f329ca6ed55eb43da08b3e4503ede23e20599527b0ccb79ebde181ad5a59aa3d0f77d6e4c9b2852322862418cb3d9a7ea549037e8b54ad46f93918f8784af604fbe57572159979eaf1be6c4168f3789099ee0937314bc0ec7a48a4b495ece16e75348447d2403ad3dc4f8583cc39e1f46966da8999d0f41cd0c731911beb14810f4224f9c1b949ca75f79981c01684b031a79e1af0cce080a3f93575e8b245d1f639d5476f167242844263485df04c4db1fa7ae6414a44085cf6aa9ad91a069804adbb04fe22daa973629dfe6dd0203f53a546ca8530a811cd0c3d77b50468f3ef38027452d52035c4187d9d96900fe09e2a115ba46de4d29ca927f5e67a332a728896aafcf0f3a9aa60316c0828978c919e64656b617f76f488abdf250beec58d90f9480c7f85d589577892666a456d16718b9433f9a713c98c11eca0f2746db383c1117871b67fa7b13942d38d05f7e0f0179b5124267435a8fa62689d2a67ffef886bd9004fd439a5861ab0f3a5b4bdc29ea3d6aa0e50c3f93f101cd06c0e2495b30c8d3d6e7708d8f5615b04e7a06cf98a58611a1c37e5ed4e86096ef6b7b2cd75514140d681d9ffebce9d61fca4e4c9f721e23211b6d271b0ee64db53942835da43d472e3ad066f400f7f5cdd7702f7089e3172cce192bbfd5fdda918d941f26dcb8f39b1e0e9da326e4b8afb4b6196ca1690a0592cedb6770a8d9239ab94d0d00b77ac074ac428ec7f1a5bed0f320333fc8340ac6b46952f694405d2c183a53f3d75c932e15a1506ab83718395a32d0ed088f3fe012dabfed987e48b77569416730b9195113dde652810bbc6c0046e7aa63448a681c949c338dc4c0dd616bf30d276cb7702c99d48482789282303238fec9fd5fd60ef2e25f69a2aa01291ffc0478541968e252b6034a16cd10a7d4bf1fc99cb20f2ffcf14ba2236f033a6f432908e562fc0c0c14548a438382196f5be2f864ab9a006d9d617696be47c0f87f9ef364a2748443aed37aa44e891643de5f755302078e0406c1d2127e037fc63dc35da4d4ad1ec5f40386ed93de5edd9b6e2369bb6935cf2c4e96ddcb7dc4df952a568f53d6e4245ac7e8ae37c7a8e03dc9fb0b0c0297a9757b7ef55a6649302e7bca8ebb280d1b6c991b59c2fac48bff5a01f27c350327a0d472d076839f1e7eecc5d9a9f5d7ec203bcea9cf229927dd2cbe8881eeced15c941fc0a7e8828f905f34ae04e354cc9950739f3a797ade1dc069f6e4917661dc54da9f2fcb4a9860359e74a995ac906fa1c34b04a9a4321048581857456c6002032bf7ae0e99c9ef07e32acc6852f5986dd5201d1ae680c22428a69003ec2615b3fc9d88bf296402540dc264d1ebaf1800a1a17fead6ed8b9c290396f189cfaeb4c3a24cfa3f9aefa63c9912d76f3219cf1d386b6c50324ef856934763a40c3532ccb1ba2a757d016de2fc9b87f067203f178f4ee26cab848a21ccb4dbf42d82bb6b10fa5e40ad1875261a674fa12ef2cbd6c7d678b17f57e1a224d30f184b4e28f6ec188abdb8d98a2eea8cef4e67666555db9f595a451ff913187518f49211e78804e527fcd741eebafd00b5dbfa2ad0a5d8f753dd18fa9229d0097fe3ba07b549a2652438fb0f107ab0a57647101030ad9f6863b162fbc2250958250f7bd46adff6422f0d563d97fed8c40b7062b5cf3389337a573d6e959b1ab648f8cf5763916820ca5ffd94b328eded46fabb48ba29b390a4434886149da8b9086b1b980cb1703c2d050b9e2fa0dd31532baad12516a26b714d7f7ad93146cfb4aa13f9da8b046d76f3b0929d3ce0c2d774949f66406553863893b1a07dd72b7d0fb8fcd38e854d22060e58e66d28e537461f0f374c7ca1d1305f81c079e28f13b327595314f4bf9b7dccb56a5b749ebde0cc8095918a209e880f140e5efce3e48bb447c7cf3445c730a29e443b87d46b371db183b701398696572ec1ab76be84c1e665ac65a2ccede7be4819e986c2f4e1009b025519ca04dd5596af053b93edc008fb2d17d0c1a45c2590ad3e3ae33a2b9670120b208177a7a7f49d878c4ac69692b6042d44656ed3a4c8885f0cbcda15fd12e709757853a0f41466ee4bb7f515ae927ba299b875d56d9b8621aa58a508bb9db57cbd43f0d8721c22178267861a4e14ce269cc8eebbfde87ae5a1f07580ba88a59cc735046cd396f310e494448a92f858061f77f3faa58d65f5eb392cc9261c854431fc2cf7c2aa4a1e2d3960a068e8e5c1bef190c202e454dbaebac61cf41c342d01e66159f11ca0dc9ec2629bec07a41eb0b1a2f45b5554e3283059844720059808c3eaa0b8b8dd569a2badb57a23d097686ba061b4934e044e96477df980ff80e48f21031f887b6ba3df3518640241f8db507381239d48ea55af318e6954a35f8002d55d20bb06150399ce1273236963902769a72b85bf16394368d29aeb04b3a90c705a1898636795faa30c3e204ba5c4d9185c5c577495380ee39637f851750682267e7ca121cd1d6fc7e135645e58b80c2e2dd25a255195dc35a6c690235a8978633d094c9634d46383c042207dac32ad1c930149503e0694744999c2c41799d8a67318d4a4ba09e33dd1e8d10600402725caef66a579e2e93e1c84c4b2fcf20e094e337cf236a34156ed14655cb191038cccfad71736291167e287bb7941728ebef774aec847b5532e6cf68b980fc2bc0ef66a54c1644ff903f3b872c25795d8e38932425846c022776b8ebac8f276d04d9ac0a85fdb992be8c62bf5c118b63dd194aef7fe6a8706fe6fe7689f5c812f5ccadc3985ef6312b1c6f6929608ee1bf92b84fc436dcfe34a4179fb362acd61c50eea323144d21adf51ae6e779ad11e1de0c3bfa31fef866231aec7e18212471fe9242f23e20b3cbced45198f4c104e2d4f5be1b78995e99a430039da2ca3ea7da163f5003ee58942809bd3face4e240f1e770ed17617f343f528188be64c2a13866955ff142d8de445159abbef4c0bb9df1ac1aa40c3cbaceda790558536d1db26f5bb692d9f5523b5c2205b8fbebd6c0a67c7164d6dcbc65a2c3129b3da9549b21e3442ed666054a91e682f057fe6ca9f7cc5b7eae982c4aa11839753a9dd5e1fb8e086ac8a0f1df293304991f800b033fdf736802571607f86f4dca083bc27540e128e65f6d42e2b88b2ad053353ce3f7bf9abb33ee0c59b618ff71ff5b47a518c4e0f22fe782f3d0bedfe0f152d75b78638b0ae90bc7118396d39ce5b116a381da034c6d70570802dde18bfba829982989b5d46c371e7682c623f1accd52a82b09c68ff50fca07f63a9ec569555add0950c64ca93a73dba6206c2eab182790af5937be7d2807616e1a62aa8b942e24d3d7c3094a428d2e8254a0c0aa810e2b43ec26c62f9c9e6d0ca2e279cb351543a9d5dc9dea37b1fed70a2933e910ce4aa2245fde80a86d20a8027a583aa181bdd4efb25a011535aba8543b0c34d7055799115190a4eee26d6fb2bff05f5b808f8c6509402a1df785184dc7fc405332663340fbd2eb8ae630b6f60c78383c4ab57a241febdccc645203f5c32f73d31962fe2bbf7be55171115a34d234ff700de7cddfd5f43d1fa2f279593babad715023f8021290ffac9b19dac0cb5c9a25f793e0895bb86dceda58ceaba38c3e0b0c440dc25480619561521314e33f4750723a4ae8d14c39ab3a382922e5eade7d13f9ff0414df827edc77e13ec7c6bbe9277da311c959ff7f9944770cb6b5176f5cd6f2e8f9bcd6414e80610dc83f4f2674b77d85cccdebc9c9acfb8e18828894f5b5b6864de96ff87eedb0ed82c8cc950dc3d3dd9d760b48a2d9292805703123f60f7abeda8f78516bb739ca61448f82a1a7b6fb548f8f18c3f20a3313346233a947184f2584a1b3d59f2573a3baebd45248648d9adfabb144fb6f9c3984f001178d6a9c1b1a929c3fee15b398a66ed2567c4a57fba57fcc6b77c0347387e56c573dcd65a89327327814e135e87f3fc947eaf3339452b1eb97f3def404051b1ce0e0fbc5c7c98bb241778deaa8a00314469c3638b2f27ca6780cd31cb0398bf626e12a6d0a17bf9e6a24a44d286bb79a40350f20c4218845a6d92937e0434d16625715f78f59ba2886099f3b463c86bd6773c5ec66f98469ac2c227aa22c567a95e7786c5095c2ae7dd407d71b005506757346a72c803bd8be23dff2e1dbfabe31c0f35424bc97262597f9556e0461e322d3cc1577a77611be3938f32e660fc1f0b4f5e9a7e4dba22d7b8b4ea3cd619b7d23b81bed26051ba346a9e4da832704771379776d327a507225486dd5a2cd315769c336de51f52f307e15b6a0405054202932c618a63314f4413ad09a0e567863d131d1db864384fd571a1f59518e3e4ba468a98bd610bf08a5751049b11883db0129c74d01b99d9412f0a2ce2f55232adb4a95d8fd0fab4c902fca92aa98ee1aec78d98101c5981ee560f073914c9a7cf542cbe014263996b716508f7525ec476dbc5656ef228351de47f78be49b5dfc0d8e4884a708b9ebb554786205ddfb753be0874898b2ec41547fc5e7bd300abeaa0443291368908e1117d636f890c3415f92f543078ea53043104d8b4cd0767dc181b9cc97e9330da183ffc60b5333e6f07083547998f487acc75b7176f64594060804f4c639c5607c305d90e866b7d1d7e8c2ee4660009ead109f3004228ee483d607b5b801ecb8890ecd491f376b0447c87d1cf31b7fd522e8c8cbe315066d7d8f55e2b9df3547c50fe4cc5bd63a7279ac3abab91dbae5827d94dfa809df56f2d5399aaab9b79a1c2a6b12a5f5a9203016b33e6da36079dde14c43fa4533ffd243e467e9c504b294b0a63c9b6e638de2e1d752bfdd87e68f10cd305cfa1afe3248aa9fa10a36bdaf41251c42084feb74b5c5b4c5d8424387e11b3d3294dd2e58410d71c9927388d944d9c24de03efb435c34a2be01303d07aff53db79b5ec080e4ec19840bea0210014ff55dd68c2b3e47afa53ac20969c80ccb3294e87d2129709b11d987fe39be97f1997bc7cb43e3aec053c18057d1fc728eb45de16b434dcd0f8ddd0debd18bd61f5a25824f06ad682c307bda8712ec3b417d3a8d1f6b918299d774bf13a3d5e66e5b0383191b4cf8eb3ccff3ea674820b246d45db712dc8817a48ee9f3ac5f6e5e5d02467e391024d5e98441a4969c763f5e0e61c57cd58dbc064b610078a7eaee1a7eab9fd29ec11f3f12c9a7dc7862a1be6822ed09602388629b78f0aec2c8958066145f97aa7e400d21e64b82d4d306979c68bf6e19501d0952eee3f52e4dd3da26b4c98311dacd2826480315855fb75e0a2f40c4a9c3f46edbe5b4ee8d3e9108a0b71462f5d264ad417cfca403b89340e1528f7a68fc862a64238ee361c63b145d467999a0adc682193217e5dac5d4fe01e50087bdaf38a5264108721a69e00f08720f6efc16675fe288a9312c9381f9643c7675ab967da4a5be6d16d641ecc1df47b49a3d27257a825c67384b8caccbe7a1771872ce5239745617797d2a16d012007b5d9de990356b5f1880414f69c3354db9571025853017cf958621260cf8b23ed8042601f93de4ee6c25ce36b73081420637497c830deda1cdccee42e60a9ef8be144a0f14cff27a503dda7da653c9eb6032691ca1d7112099df77a85250594af01610354c84c0cb4c7e4bea6e6001cdd4a80f143a365efd5c2defd5fee964bc62ac0ed68f3c6cdb8b06ba23add24430821f80ba3d5d9cb46676f1c7f61e0ee4a44aec82ea40369a029d64b78ddb9fd96cb3981a5fd919234ea2710a21e2475ec254ce49775e00d125a2f607b90d482790ad86ce1db4615ecbc2796b9706501f8042bd829449710e035028fa646ff79dc8d5498f7f1e323d4791c64cd81137e57c55aab45b69d06c12d4252eba3a4dadb622f71959185b5144f789bc50bce76181e441deb70ca86b26ab6b25bf564d4ddb1dee1a8b5ca6ab110bd5146405c497ea963610c1e8849c87163da3e01f729750238496eb22a65124c86dd488410cb7e2defd7b4ffd3970a40035274c3ca10bc96c255e4012a78b705515cfadbf7e62f7afb2d788f2feae918a57e7be67286a4c8a84619dfdf380dfb43a07f23e0f63fa71a7fdc8854920fe7c88039efea5fefe3df2390176eb598cef05fefe4bb170a6c04965b2ca57a8117e399300bef731ad415c02e3739004d233423c5a270ceec9a199af05cdd561e54f57537112709e865e430f1dc7288af3ad094675f094c81f32594ab6620038a574dcf4cee5ca17dd8f1202080d53c5641b7b61537c798d82a8ecfe9e58139258e766d9cc3638e5268455b993cdd4b2dc6b9a0b54ded6acb2ef61eda07e2ed1469bcde72557cfa78859c29b2c16228974993ca7ba18c0115964d712b2e4f4de52209d45acf10899bf8cc22509d0cc27d3a42e7b71ff5154bd2f4e9de9a127492e37080bcdd3f89655380e141a64e0cd23fde69a75150db227b2fc83475a301c9d36f2413015f096727c21a91e09adbb2c9d182228fabaa4f1003c2b860cf131ba22a685ac460adec1614e6923fc3c1203bedd44b30c3d60b224c301ff000000000000000000208ab546706b2da11291929452b90c1a6cc069714652a624534a91ec0ede05ce4c7c3a33f1e9cc1c34d208219897cf0cc50c780c7789902a87e80002ef965bc6a8eaff019bd14784698a596b14d1d6d0e1034677e75c0bbae4cb949467878e1e70e9733fa5fc4c16dd5372e0d0c10336a459d467e983f6b45bc70ed852d57ff23476d4de221f3a74c0884e324f65ceccd86229e68097a5944e2f57b805a9eac0012775892c5959339f991d3760437f07917ff7a9d51f59cbd461032e7fe61853d73b8bceda29e9a801ab3da5d4a94eabcad28eac6d8d0e1a30f23363cadba6a28cffc89a990f3a66c0be564ae8f68d3219320e74c880d3faaaef97f693976b6774c4804dab41dbf4e5369d11d030c064b27c043452ae161d30e0fc569467775db7a45a0b2844c70b38b5a44d9ed6f282fc56870bf8b72c3d63eba092ca515b2491bb1914984c94d0d1023eb450aa4f98aad2d96430d0c10236850a224dd525912ab22a74ac80dda0d3bb149da2c2f4237b4516225b74a8803fdd57a7c57e47b33852c1e514ecbe7674d2cb71a082d1762e4f68886ced1f740a6ef3a7fc39dba7bb8a99a6e0a33cf51a935a4b2da514fca607a57eff21113848c1e9aca8d3ad4e9674161147c1a68ee9e38d523a5e228a82d549a3da183ae98e23146cbc1875969ed50ae9de85e040c1e6649b5450b5320bf73ec1b6b0b4d2372633791f4ff0aadbc63528d995d5da094e67fc1013f5a773908313bcba081bafbb1c53d2e1d80423aad9993948b5594a444d302ed5cc936e5139fac69109567d5cddfee9f5e2a9706082d75a486d39634a2735cf7109b6e3e9944679ae14a6b604ffa35fa8c61e25d58e58093e43c99517d5f28b881c946083a5746f5fae59af67129c78f7eb7e9a6c114f126cccacf3ba8ca751a594094482db8c9762aedad7ae960157e08004db21b5ab6e309929968f6085bee8d2fed2a2ec9401381cc1da0ba5fc74fe6b9dab46e06804236336fda042c67d37318237f5a9e2af1499414639816311aca8d4cf3ae7290dd9e25004ff32e551774206a5524b042fbe3af5640ead4c8710c109bd0fd24cea96d62f8e43b042651552b73ee81c64380cc17e7235dab468a1ad5185e0378e1c9deb4bc5741b071c846084ce9e925097cc73e53806c1e775911ebb9554eb1b41b0a533ca8f69b554a174130836ef68dbd1db6a1e5d23f03503069a881d1c3800c159ca595daaabfc81cfbd6ade1dfb89db8871fcc0ca786934ea68b9f9b2367c0236bca40f9cfc38f641b3cc69d359060e3e705178109d772b94a6d11e382dae5275053532dda685160d23091c7ae02de7d2b7b9ad6e1ae271e48115efcb79ef47b4bd161eb8dc2946adb5b9d5db4402c71d184dfa515c9a6e9176d2b003df52f86617935275528fac211438eac08f8a2932a708d336a3c0410776c585e91cfa317b23724fe098039fe5caac525fbea6df236b4b050e3930cac592365f1baf8d4e81230ebc52995b79c54b1a143122382970c081bb4f4249ad36bd94c9e378039f83f9c96fcd0dcb311c6e605d834e0d5d1fb37c1a59436ae06803aff752d037b25508a99d81830decc976f5975bfbe52e47d6ecd8c0b106ee5e6d65536a55538e856091801211984c03871af8d4d6fad72853257911b1e11d58b3e1094035e04803bbe54aa8d21d1535ae37e04003ab964ba653d3ac339e0c2838cec027212fbde7bc99df4f3330a6975e06d3dd3b1f4796a30cecc552964e3488adaf1c64705cc8df5615ba1b1c63e0a4560da5c972c78a510e317051ca8a5acab52f6867c4a8e20803173baa9872b24b16756b64f390d8a811020e30f09eda3d4268f6a5bc620e38bec06793a3d9843c9951c94c2693c96462b64d72a3370b1c5e609576aa8a522ca98b9d2eb0524c2b7f2dd73da7242e30b6e36117a59a5e2e6db16818800c1c5be0f3a98a9993d03a425b1a0bd3060e2df09ab276a765a1846e3bb266568214c09105ce82cbd68e69437fc3b5102c1270001112378be0c00217a3d242ef6b2d25f466644dc4865a0816568478089448e2198c90c22110b02244111c57e0ebf2476f0f5253259504f80d2dda90d04056e0d35d8c6f1f9a5daf5222f3024715b8a8f7d2e5a9d7af5646056ed4bfdb267dfd2c7a8e29b0b6f27dd46a3ea5d71b59b37143c6b171c30133106038a4c0cb149d756a7bde46978c182325931094e488021f3234ead44cf7d1f4c81a89dbd0c249ce62340916060546e6cba35eb8886ae83c814ba6a57fe6a07394269c4c2613b573022f75e7acea83ba53deda1049374af642b048c0029ac099e6f32f0d5287686c64edaca430815fd1d2727add3996c06e6bc5f05da13b46ed8d1a4ae0553f3f092d85ca2ff49115d9e34802ffa1df738c4108ad2e9533165042720306ba220b912d3890c0a8d1d23ce772ff57e66442f2001b33bc03317e060d2522438d60329941a344e5c0710436c75ec9a0de57980c0f871178514adf8bf06d8bc08adaf0ed5ddd770b7a010711588b25374c67ade466a3c231042ed69fce369a6356917208813bd1aded25aa693ae3080297dc6eb7f2b7bc572107102c5db9366e28211a33387ec007fd5aaafbac52fc770e1f706a3aa78af0cd5f527d038e1eb0abd95d0955ea4bb9c6c1033e7d6e15b4766a95328563079ca51d1f8d49a666af68514252003535638b921c00870eb89844691625b567c6e4643299e4c91cf07949fdbd958e32b71071c0dd870eaeaf94d6adb32570dc808f4a684d4ae6f3ac5ba7030e1bf03dfa5d79b9cb2093364adc465bb1028e1a70c92b6ed020c437d7cb93c90c3868c08bdad1d0e9bc2ce9f88ad8093866c0895629cbe0f144ad90cb80d7c1830695b4fd67f91f470cd8ac5d3ce56d1e99ebe48001a75b9eecf7d8f9a3a9a40d385ec0895abd251633b51ced0de3010e17f0a93559fe1ce36a1d3f395ac099262ffdca7f39b70a0bb88b4ac79c319f1c2b604db392e3dafcf4aa1c0e15b05a53260f52a8ec97f954707993d6f36db56df947055fc9a5e765bd42e8c59c42dbd5aa2a8505d5149c880a325f8a276e1e530a56aaf292ba62d6ac9423059b5b3fc9cdb3ac447da36065f667cf90f97e7a1105ef9592798bf62cdbdf50f0efa9a3ce954665cd1b28d818b5cbd62edb63c5cc2718e142bd50de299d129327b84f9d9b53fed7eb979d603c8a7a887e54f92be504ef5bf1c63f3cb350cf267857523c09d9a939c58a2638a9c39568d2410aa58399e0cfd44d864615cca406136cdb97b9add2f79e4997608594a95b68f9a946972cc19fa991fd1595aecb9b4af072fc44c5f3cb14328612acd9bd67bddbdda38493e04764904a74f586d64f129c5aae515d518904df79179366ef1f998404b74a794b8fadbcc6b747f0afb205a12a970c5f8d23b8cf14a5ae0faaca5caa116cde77bdfe9ba52ba97245425c46b0ee212b05b7acf4557e117ccc8d4a57de88681c15c18f5cdd153da6c5b7d3c89a86609100922a12c169d5203daf7dd0752322421588605fc95b15b42a19539d87e0567df3b7770b75a9637650852158a14cb96859eac964323922664c211811964e3445ad9ad21a594302a882107ce977367bf3afbc392db468049889a049105d9185085731083e09fd29b7921ed4ae96c811042fb3768f6b2f57cf0f04e339346aed48d11bd1a00a4070be41dfe80fa662f668498f4060456c8b2afec07994eaea5a796f8e493fb029968dab9715a5298be9032f65ba7f7fc6f8c0a68ca34f86b6b70dd3f1a08a3d7041cd835ea1e48dcca21e78ad43e90e3ae3dfc7d511a9220f8c309d954ca9f5a675a119a9020fbc0edea1d3bbac1bbf91e9dd81b3ac9d4b9976329994d8882123861693c956610746e5a42f3288efa999eac0bf6a8ecb1c3a7bbe7c323113b133862ae8c0ca18d48a27d5f9399d93892a8921633251253164a4ea15aa9803bf27d5752711debe3993c964828ad5a00a39f0abf247fefba995a79e1f541107366a5253ef0f7ed23423c68888932046091cf8df55cdfffe516e2a95b416301010aa7803173f6b4a3a424affa0966cd110984c2613113b6e6055329d858c9b5bb4a7897645162203a8a20d6cca6fea76a5cebeabc9102c1210528306c90126931a3448d66452b248fa4602487c8bb6428b6603df49e6555369ea85cc1b005d91850809aa58039b4d06ddb27dd5feb42ad4c09e7f54579116b5a467640d2d20044608163268902040798d094c26280d8cbcd8f15f65512a9af6488e94b4026cb49a410346ea086888008bc964a4a447269383065694320fb522a3ea32cfc09f7f5cf1f06590d040800c121a8fce09559881534a068d1edbb246b54776324186c4460dd440156560935465a675320dd54217b8220b912caa2003179434f7e8f1edff75558c81555a5d8bde34aa4c53f48a2c4456156260b3a225614253a41cf5c89a0c1a249fcb2dab08039f548e5949a9788fbf22364868948898b34142a324ab00032f6bb37b90372aa66a236b1d9811638b558cc46d2c80868d190b3057a3656006aaf8029b717b75550a65ba59911a2d63155085175893a2b55bc1a3543a35b6b081b605c93907a8a20b9c0e51dbe0226599b247d66a20090d08d0b031630193c9cea00a2ef0dff9b29f34574d2793b4104c2688c4460d3c41155be0959eb9ce57a36cf3a6049c36157b4d088f9a3d9ae1410a4645f939bed0b993de7d148c65b5af4cc7986a4c2a0ace63d2f22de65bf09c0e05afbdce467bc5bc99f5a0e04db69d46a192ce4d39f4f804a742870cae532821ba829ee057aaf8fdff771e9de06b83cc5a06d5c1846547d6b4b82143242730994c262ef0e004abc99376552ad4e52f6d82d751075dfb7ea34baf34c188885067515acce0518f4c70afdc2e89d4c1928e6282cdda41bb5c3b7956f625381d84969ba7d0c9d267c33ba034de8627a00e1e9660c5d225ade32e63d2fb8b14f3a804abf34b136d25843af56452a2cb83125c90297970cb52c84edaa403336284c0207140088c90102cac984c5ac44ee13109defc635cad349aa57147d644205212438688fbbb2320044648490862348977a067b403dc11d0811931dc7ff5e021093e45fd52458f955c7f6acdb8418344648b24926823463a6722256959784482119e5995d4f05ca95c48f02f555fbdd2293fbbe7f1083e7dccb25588b692b91f596b12115c8d26b1c06472030f47705ab4b2a8ee35a133d4467063b175fd9b45ad764b46f0ab37e9dbbe949e3448c3101e8b6054c7cde9d73eadc86dc443119c2efd9de32aa8c8f047d60ecf0d1810b02204460804ac30791e8960fbbc4b6c4367ee30868c185a88e021221a1e8860c7ed54fa6fe811a63a049f4269a5fa73925a7f66643b302346893b0226130f437059c7a829d69db42d8b4721f2f098c92f17a3e418c08310ecebae151ddda3fe98e42435cece20f8dbb60f11f26f5d2236483c04336220033c04c1c7fcd35c2d7a5a8eeb1108d695d652e6ac3ca6b4257800827d9d52e5d6b45e41a9a4b5287fe0d4a7dcea9298ae4b0f4608498c864049890d2f292185871ff8ce5153a34e59e674d17811b4127581b57c8f3eb0de414ce5d05a2a95f38750f0e003db7b52083db615a3bc6f0f6c8ed1844969593c3df027833a7125aea91d9e39c1230fbc52955493fadc1cb987400b1ae75cc0030fbcf012167589109e95740736d767e9c14cea7e8d7ad8818f9dbea592eb119d94eac0658daeffcc53529f3e746075ce1b1736a294dfc7630e7c78961e432bad2178c881d532dfaa99d069de6b123ce2c06ae95e1555df1f2a070e6c0b75a2725eec130be2c0e30dbc2a99a95f6f8e2d94d2038ce0e106bebd73a9becd3244a6d0c0a30dac25712ddfe2a9a8a18511e2c1063e4f2ffdc8dcb2bc656b60e508fd514c75728f416ae063b7b2a02f0997cafe3430ae57a7ce59b6213c4403b75957bdb4fc91325f0f08c1c28a101b3468484089e07106366e7ac71359ae8328150984c00829110881801521ea61063eea92a12affca1cf45506465384c8cf5f1bae3132f023d453da865e94ca1d03bfda53a7cab9973495626033b3561644c534ae8521522e040b2b42426098bac1230cac6cfd521f324bb9ce8daca12dc04310c34677c0af984c42b0480005663c6032e386c80c1a93898c18304248dc060d2c2693122d6ac88871f08a2c4438a6e001062eea513a4999bb1a4a1d29692d4a52091e5f602cd8e9d64795b3d2a9177899829866e524ed84d8056e5b8850af3a69cbf9c30576e3459dccbc354b6f5b60f3d3bf9d7be87dea688117255f2afbacf3aaabb2c04879ea6c94688cab42f6040f2cf0fa294ad7f93e93a9ff0a7c6fd0f320845852b65a819177da85b786b9bea44715788d2aa38fbbe9eaff5081ff96aa265b0b8f1957236bfa3148bc0257642112c3630abcd2ec5f3178c6d5312b055eabf690aecb734bdb51e062868c2d94bca063050a9cbfe7ff53a1f7b20c3e81fb93f6b51d3a236b2276c3c3098cd4d3d641f587597c8dacf907da46f2c0a309bcc7fff45283942dfd1c590f26b0c1a45052c9d7d729374be05f485d52791c9d950c1a595be7a1043ecb8e7f427eca4ab45412b81885c5b2552b4c4b2181f74ccdd5517d37787e047ea48b542f4ba29e2123f03a792cd12e1581d3d9727efd15854c7d791081754ffef599b3ee1cb51e43e02f68b9d9d7f2ebe7ef2104b6cd53ccd599dc4dba47107891dddd9e56880a2a6764ed69888c94b402723d80c0f8e64e1f2c69a9d5ca0fb8d17e39dae327a39b3ee08366cdaa5e547ac0e97bb3d89ee5885295070f78db556a757be3c9fc8fac39c98d1a67b70336ddd3976a954c2999e4a1032ea74daba4d672f333e891034693a74a224cefffba34d6b90e78e0808db9b9f1b3664fa64d55f0b8019b4bf458d6aba754c5cc990df853726cdc848bc7a05e03426084d8133c6ac0cbfc19930b1da53ebe5a78d0803ddd1794fbe98c1bbc91351212f79801a7f2eb9ea994551afd461679c880bf8bb995b0fdecdb5c2d041e31e074e9d6296a3c27f777642dcfa0c00306bcefc7d317a57e5bf0780127c4726c3f0b6a3fbfa4000d1b33167045162210f07001a7765a457d97a34afa198f16f0aa53ba4ada5f67bd92070b384f4acb525928adb552f73c56c068d128a6b5879aecdf0a0f15b029943acd5759f3643702b77143c6b14b059f2cee486dafc64f9f7051c1a9fa16d1fad4bda27c640d4fc1c8f3f22494c5ec235aa6e09514157cdf831066674929385f3f99eb59d345759082f397a1db398bfacbddc89a93740d27a9814c86ba80171b05af4da8f3e0dd22c3e51da2605c55d0cd9c5a066d6d644d613820048605d68c1b340c40e3672ce042c1ff464bab2395abe8d19135efc08c1e5123706306147c2c137e5f3a6b1d9f60dd84e57c5affcd53623cc1b7ccdb425db8dcbed5b0041d9de074f011a1d525ade31d43a4c4fd39c18be54bea46c5cde9a4f68a2c443ed0b109ced57705ffd5573a003a34c1aa14f4a7368b1f74a56a6c81c5647245162229e8c804fba5e99ff365feb0c4fd1351d08109467de998d876476dd7c8aa8e4b304ad89652d74a9f465362095edb5dfbffff4eb668646dc4460c11a8a13da0a312acd4d30c2e7c95942da504e352bd6dcaea82fac85023c8ed98049fdb3fe3c8f128b4bc2b92e04baf8ea582169abb957335da010750abd1328a4582eda0734d55e4906055e94b4fea6db3561f7c04e76d59ad097d4949993a47f06f1a33a9979ab34ef18e46b0abe9e32ba13a2623f87e15baee93afe5a872b808bee37fabdc913225d35204a753e524c563498f3a1b828e44b0ab1f7c54cedf424a84c63a886095fcbdd1a24d4acd2f0a1d87e076f47cb5501f4f5a33041ba4f48c3a4a1ff52c8eac7907487a4459073a0ac18bccc16ffc549e68c60cbf018218332830622386052693c984071d846094f45c4fe9ce65783b083eeffaaec8b451b3e78cecaa200efadbed694985190836c5a8a24b8358569ebc1018207400821519dc4bffe93aed76c71f18257df7a579c6506a1c59db82c4c6162458e075f8815bf16f4f71548aeee0c81a081c04ac45c7b05143c6d92bb210f140471ff88d97556f058b254ce7032b9346f9a2554c931bdd03a359844a2285ab1172d4039f5cba07d779737bd0f2c0e9f374297f9f32b70f1ed82cfad46553f1e2edeb0e9c96ab53f54799cc691d59134943d26107c69408b9adb59d572c0b1d75e0727a15a45b3a6166b10e3a70b659773cdb27f5143407360bed4a42ef97e6556fd490032744a58fa7d85f6ab33870a39598d42355998c593870de19ba54efabd74135b226848e37f0a2af5b32756c751eba81b79c929e5032b6695376b4811f213c46ad41e68a890dfca7ace9d47a56bd730d8cad304faa392af7bba88153417abe2ff314742e0d9c68e5991d262ba74afc6ca0030d6cf84b535a6e87f2fccfc02ba17a35a5b56d514966e07296089583d20f5269cac0679585f9b8eaefd1970cacd2bb64f79d4efffd876fe81803ab65142d4a0a75a25f1a59a3c16713e8100367715ff8e9a9e8abefc89a12a0230cacc6d89ddaf48abd3cd7c0c0aaa816d523aa62facc17f81c957e99524b559e6444b620b151cc0bac5ef3a0ad9edaa57df7858e2e7039275bd34232746bb40cece0025f519aa9a464054bde405b28d722750848bcc46e0b5505113ab6c06750a5da25e5a874c20e2df042b6dc7f1d5d5a70a191b5650c6581959bd2885629e816d95a336e9c007460814baa426b995ccf9cf5c85acbb0abd1c56ab40c14e9b802affdb2ffb7f28cac699162a81bcb496c28af31991c5a153fe8b0027751fb55477e46d68edb681b371ca03be3c61f0a745481cfcf2df5319d9296a6830abc5e2fef182e2be553cd98025faad1bbf776958a76081d52e0a5de34ca4f85a2c08a4e3f0b9a3eb7788dccb4a0030a8cbab7a8d2ad8adfb22d363a9ec0c8f528de318950a985236b22349692a0c3096cfa18daaee34bcb16b3ec6e7434818f6fbade7da392b29891b5624b2386488d12eb6002a7d2666c21329688961d4be057bb84727996cf94e9846091001b3e810e253052d7b9da7c31a8dccec89ac88c5649602dc9358b7af9c55da948e0ed95dcf6533245e921921b2533dcec3a8ec0064f1b956b289533741881dda8ad64ebd4f4bf551c3a8ac0aa1a19d25df4ade62c2270d284b41c84794b993243e0b62ef6add4964d06770434486a0881bfb8af7e478686df6a6ce80802974d490fa105aa89a636a93aea8f28186179a4ce1a2a34db2b14eca83bed97f4f75bd640c1a5e459fc63ec3ec1e7984ee4a57c7b82affc3b5aebbd34bfb1139c50765f516aa5bb5777c109f6bd548eec51a53506e126f8704f7af5a3a65a2c35c1e796316a29eb4bd5ca33c1cad50dfdd2e1bd310a13acbacb8eab75eb53fb127c52fb9dcbb36a8c956209566b519169ae32473555826f57d5fd69930b8f1e25b8686f4ab554d4097d9904bb4a294ddec1925019240946c7dba02f474d52662712dce5cc68a7bf36ff4b9060377b47932b5f464d9f47b02fed345da9d42131b870046332555049fcb369f51bc1c7142a269df5a6f0f518c1eb86c5d057725f7f8be0d2ea5656662345f0779babaee2cabd984f0497d483d0af6e5d4f062182cdf73ac928cab2e51c3d04a32ac80d1e2a7dcb0c0dc19f56693ccbd2f9f29a85e0fb94cac1eb345fd08e10dc47aff7ce3154b76406c12631b7d3398da8c78d20d8944676d0b4f94030324f840ee222eba448c416e1e002108cfa1bbf242a7fc5b1ffc0c81ff9eabd51e9d3ce0f6ca7dbd1ec7732638ef6816f7d59e996361fd82cd74b7984b84bdded8191af55fecf59bf3226f5c067d4a79ea3f450224224b8c803b74297f21c957aa5c34428b8c003af29bd0e952ba58a19545cdc81b1d3d9a993c778ab2a7660932c4ff1bf55d7f48d580756e4e9985a50311d440736def64635ae35cafc55022ee6c0794bd1598ad092032f637e2f19b42b330e9caaf49e7fecd6a39282039fad5445750ddedaee1b38af1c752ba1627453d5851b380deab375671dbe77bb6803ab5a5d63e5a82dba842ed8c0b84c77c16f2f66485dac81d39e3f0b57d37722a52ed4c00ab758510893214d49b94803afde25335568e9d1655ca08157c1530afa3cbdc960bb3803174ca724a48be66727d5e0c20c6c26ffd651bae90569d6c04519d8fb6d6f19b45a29bd3e1764e0556f8da97b29b5ead018b813733d95969214e28981979ac7524ed7ba1fba30f02e540cd5499570d558155c8081dbed93d264e7dc2cff0becea3d5fa933aa18548e1778b71b1579a36d63f92ebac0eabc6c9bd467555315175ce055e7962ff30895e1ea16188ba5774af62ba5366a81335761ffbe72b38594115c64817fa53d2d6529f73eb7b0c08f881095594acd75f515b8a8be7408ad5e5b05df0aac6a9d7579c56ce3eef9818b2af02abf65d55a8348db2015d874a75629d52d43a6e9620a9cab5025ee5d96851247d69608d22ce0420afcc7e4f2636fca45145817711dd39330a13177800c5c4081152253bee8f71fad655c3c818fa5a5b53eaf4d32756d70e1044e848a773a76c156d804f665105a654f2a4af7980b26b01b4be87cef42089772174be056ab51193be8d7593725705e6fab6fb4ce319b4a0c910f687123ed69e122097c6e7f8e16167473d4b84002273595e8601fb3bcd323b01eeea35576eac208fcc954a1b6354dedb25c148157426e8c323b4cf596d6ea3205174460b596baabcb52defb281743604d7e9e58526b0c174260a58c1d2a25a999fe5582c0078bc144efe2674f1d174060454fa7561d856bdb9a868b1fb09d4dd7630a5eea55e80324344460c3af385c0b98d101449570e103ce3f34a5eaac52b41c84111282851521250510299c70d1034ede98aaaf6815c1050fb835d14c5159c77d8dd9017bcafe82995bf43d950e78a184cc5fa6ec1c3072a4c5129e515b0c4ab3121738e093a80b39aede0d781944e6ea8f595cc7930b1bf0eed9a4f02def132db9a80123e358d4b5a3b5c50ed180972a9deb4e5d4fd59b8b19703255ba261983aa10a11b20706380102cac28c0880b19b0f93c64bca032e8d249d6550c2d26a062685152808cc1eea9aee73fbe0b1830ee669ff5e8d56fd690a190e4017a451622222e5ec0252d743419946aede66452a365884c263c70e102ce9577d051a6cbbb6af581b67122e0a2059cae10b28290392c6074c6b715ae3255efee62059cbb3ccfda5737e78ebb5001a35aba255ab808098d35f6910a7e5373df28552293328dac8990d010593387c46dc448181fa8e0d47edd9dd96fbb529f62d78cc6872918bdace3f93cd5c956b231a35557e05c8d9681a56073db828a12f9a23d11eb190f185124ed25fa870f52b0b2d534ae76dbeedd46c17d68d9a63efb6dce976ce10d10056bf153ca29e5b84a974a28189951f6af6b6e86b6236b67256732d40840c1c5f233552d5a260d163e3ec187d69016b39bde8a9a8d92ac005ee1c3139cccebfd5f71d40946bf5e61716db34969d828587c7082f1732deb4f08fddaa53e36c145f150ad184c83ec8c26f8d8a1d274ac24f4f36701336e8c4c40c5d04c30ea3253a728858d5842e367c43021582420a400c8ccccccccd059355ac0f08109bee3db685ef0a8b46596053e2ec1a9ad2cde39ca98a274d112ec6896b54134aed4311f591163ae9560fc3b6a6d9949c5144d1f94609526a15a45a52b4ce5120d2d3a20f23109f62de54fea2ea768fa4512b09260652aa1d5de4b7d49ab98e02312dcbd904afdc8b859e8038a8616f70145c30a912bb21011c10724f81e1d63eba7a847709f75ea2085c5d4bc1a912d486c9c2318f9af2ee7eb4ceaf434b236994c26c56cf0d108f654aad9c6d01fa32719c1291d9a9ad4a9fe0ecd2c82752547ab349149336e5a68d13042b0b062c4460c0ba87d2882135abb8dc7749a9644f0296b66a5d5bdf0a84d477c20823d15552aae12baf2854af07108f6735b901f95db059d1982dbd741e95ded18fcb43e0ac14693ff2563b0514286108c125a676d51b7ceaa93239b828f41b0ebba1a3ceb66b7ba56109c8ca72f07a9bbf3eb0e04176dcbb5b0bdcf1c521f80e085b69c9b2fbacefd3253818f3f70224f0a253cf669c8a41ff8cd6afc758e1574daf8d107c6356f6e1dfc3f67ed8dac2d043ef8c06ba996b5a39eb562c8bf27707b60c365f6a43c7ea7249eddad343df06e52b4e69c35c34bf2230fecfb77774a494aadbf8cac911c127ce0814f66ae3c68b8262d5a67858f3b30bed236ba1cf93f424bb303af6c3d74b4556a63f647d6cc42b048c08c074c26336850e1a30ebc69bf1473329d8407251d78293533ea6c71b5905a227ccc817da5830b7deaca569a7d3ee4c06ab55aaf1574b298e2329a04019389b18f38b075398616f37829aac495063ee0c0a551fb290a295ed92b49818f37b0af6fd3ff46d5524c374a44969b49e0c30d9c5e9daabce3defe8613f868035b9a554d592ce0fe93c9072693121b33da46c92236b05abfad0efd9b79c394b906c6dfa44ba19f5f835f10d5c0ba1a1d854c4a95071bd5e0230d8c4a175b29592a8567990f347067f1d2cbcca8bc335d821f67e054980cae6263a33f65640f79e0c30c6adda8e49ada33b25622429276818f32703ac5bca03468e7a0cb354706360b53116d2ef48786808f31f0deab5b8a8a92d8a8f12106569eaa3495d5bec9cef908039f745ee51e73d9986a7b451622fe01062ec7504947e5d7af7f45257c7c8151e94aa30c2eb4d2cb0bbcc8acb5aa069d2ac9d04717d878dea74be5577a2fffc105ce4cca374f6947dc02ef42542c99b49032068d16f8285410f2e35b32b3c0b8bb54b255dad0eafd0716580fa6f583afaaf0ac0a1f5760a3ee523e5aeb5f86d20aeb9c3d262d7d145e1518d56f265cf3f969b42015d895514f77c6565227f7a6c025cb19328e794e0adcc92cdb93f7ebdfbe18055ec62cb43adbd3ea756a64ed030a6cd768798c999b46059fc09dced0a15d6b6fe3894e60b3342d3dc81e69fac52670fbad7cf5856e12aeb226031f4ce05fe51dd51d75cef755a2123e96c077cad23fbf5529299e12d8fb31712dd7965b6712f8d6ff607ba7456b7e4e0b1f4860b5588c7e52dfafb23c8c838015211f47609436cdf154cd4323704265562929152fc5f49e113e8ac06b19f75baad4d27011111873153f67fb13eeab95c1c710384b237fa5060d0a81dba846fdaf879e78d288f0110456457d59679992e9fd0504c694d026b6da6a5da6fc8057fd173725e1f2016bf194ea4fa384c2470f58d5949b94bbfa57d07ff080cfa654aa96dd9d2ea51010022364012533f8d801b71a84f0cf72a4578cdfe04307dc2a5d3125cfd1aa62aa091f3960cc2f68145da73f69cc59c2070ef853d17f6b73936a537fdc809317b49d5ef7d1ccf1c306bc5cd37293b71f848f1af0de59682f95b2dcecae0f1a70f92fab7a534d9fa17fcc8055135e4a7d6b8e8c103e64c029cf24ae3e4df3ea2d3f62c097251f35422badf5a40f18705aef7372cb3ab51e9d8f17702eb45217734f5984d2870bd4a0c9470b58a14f9d7fd90561b2fd6001a3da55aaf4fa93e9a0a29d0f3e56c0c6549d2d37b8d6cba10f15f0613eb27564caad4d425378a4828f2a2febac69b350938c1b25e946c91a7380072a38e1dabe5d860b8f76512b760a46e6daf40efbd6da3ba6604cb4b68eda2c9aa94b119c60b3121e3fff2619a4d22ab709ee46a82c85fad20b4d70b1336ece9f1f5fcace48492b200446c815239a095647f3d55a9b98603d87ac71f7ee17ad92c18b4bf0eaf3eb9e8eaba5847232394bf0723c980ea2828ebba90e81110223040b2b28309964175e5482cd54c2c7559bc60f8f8889e00525b86c6e2af89acea85d4e82cbfe9ae1b943f4a9921a192f24c1b88e412835d3651b8556bb889948305248b39cfba1f1b2e84082fd959f9eecd5f578fd08deeefe7252156aef5d189309175e388291a236b34afab5b7fa9de1452318579953b9ae28573368cc3032bc600427bf532ecbc27b742b0d1c5e2c82959ea2d0d25f4a9a8c998818aae18522f8a8d4de63f6682927dd86cae14522589dbe6550d9f5925669113b86083626fd41ad5ef96432995c493140bc38045b71b4585242f7d7d6355e18821f971b2a07d7160f2f0ac18be73d4fc95b6b75ee1adee105213865a2ef2b7f3a086ed4b7d5a53d69abb582e073aea83f6798eb8f36107cd82677a9ba4ab67880e04cc88c31a9fa2475b97fe04f2a7dfb9c738aee427ee064da2b9d298fcb24634078d10756b4a8f4d1c14669caf8c0e87a95bd54e6edc68b09c28b3db03a9966061f111d75ad07be7db46b9ff4e4523779e054b36fdccd71a5592cf1c09ad4294bede82cca477760632ed1b3dfde68b137b784177660d4e2b62b0dcd51e6fc19e1451df8d28ff9c9e44a5fef1ce1051db8d57e19a49f8ee975690ebcf6e74d8d5aba8e3fdee0851c78f3689e2674ec0da92c36781107ce530c4b51552ef966c281cdd598837ed99ff3a6dfc08eca3244bde9a4855fdcc0be88c71fd91b940aa20f5eb48131f58ad992e6072fd8c0bd4e223c7e36a146a7a9f0620d7ceafc6dda2df927b5ab81d794622e6dd7a45e96155ea48151af63de7bfbc17bc3c20b34b0529530a9e6a5339b0589f0e20c8cd6fbd758ee5b9682ccc0768c52b474f5e1762a59841765e0ee752b5b4c8d396d90d2f8bb176460c45c65a5d93d268417636037879b4525a6e469a11878a53fb6bcf452950557c5f0220cfcbed69ae346bd573786e10518187f197cf3be94498aaf3a78f105ee47bad427a53ca5e45ee07c544d65e15a9770d7eee0451758d31d37c68b596ec7950bfce80adb17423554785be0df33673a598cff1b1308c1c28a9063a6f0420b8c99d639e54f9f73a8290bfceb522d4f691d7d1b8305bed3764de36767e6f415b814a487c8eca4eee5c80aecc6e4776ad9cf64295581735541ff594c6ad55ba8c09e692c213c6f53e02f6715661b5f83689d8895e185147899f44af9526ab66c5951e0c7d6ffde7269cd495894f0020abc6baae6de2cfb71a9102cac08994c9ec0bb4eadb3ab969f7bc8098c6c51ff6a738c2e1a6f022f5b6f36999eab4dae2130420eb6e1051318d94a8ef929ad65c2b2044e5caa51c192f0d617182130ce162f94c0e8f89637ea9dea14a349e06252636652a490c087d615b54bcd1138977b5a545c4468d93202a321d2cbc373dd842762fb861745603faa4d9f53fbc6b82522305aece4d62af923bb6583861613984c44ecb8e0c510385d8faf94a8326d2d0a81f1d40f519179d495d48b20f05ad39810a62e3a26028191f155fc0c5b7fc0bb6e29da47573ee0bc4b5bb5666a19b4df0356ad6a88c957ae535578c0b88f9061afa34a2ea376c0b6ab2e9545371d70aaf37b3ad15b4965a51c707a32afe73c5113d3f1c20b1cf0ca825499a965392c3f994c26ca861737e04e6fe6524acbb6552763c20b1bb02aa8b7a97f935eb77ee0450dd8dcf255b69361265585067cfe4d3ea672542a938a0de1c50c585359438a68ef0693bf90012f4d84fef4bb5a28616ac28b18f09bce82d4661a430ad1bc80012b947c8faab77643682f78f102465475d0c2dc548c9fb2f7c2059cd629d7cf526c91b60a5eb4801d1db9317579f6161d1114bc6001236e31c83d5d69a49f2b622978b1025e64743753ffa94b765ea8804bb6edaeea9f7aaea204905430de7e595ed4b9ae82a8e0b26765318abdf6eaeb145c5299517c6445995d05c414aca814de2977fac71fa98ab1050820a5e085ed0abb18f2e58f66866b216243d929008414dc596cb9e7ea2c897646c177923abe5252d7ff28818882152a7c456306a1d59842c1661ae55a5c6b7735060a368fb7e6ce51e5243f2762ea24209fe0f38a1e2ffda642695ccda0714511403cc19810a1472b4b2d354d27d8cda8d59679ce4965d4c81a490c11b38501c2097ed43d5b471945b9ab37c18bcb742555525559a62800d1043b9e326ec81edb8daa162099e04c459d2a660b52f6aa98e0b4e74c1b2dd495109e4bf031a86059a8f0d8ef424bb0513cc92873e8a8a2973500a904abb2ccaa72abeb8c490a84128c6899ee21a45e3f4b5e918508034026c16e1442ead08a9a31a5926065f4dacf298350520e1209eeb49a8ce5eafba33f209060531695215d07edfaaa312cac08b9220446c803426084b00c121a0ff2082e2bad1f640b0fa1f4e8083e7b89ccaa5552b12482348213fa7365fd6c797359de2530994c262ac604a90084116c65ed214df96a8f4286208be07c734ab5de426a2dcc45802882bb7b11d2e47f5e194d04afe1e29753e86add0e12020411bcebcca979bb560a6519591389f15f43c602b6304049494360d18031994c14e4106ca79896948a6dd679236b7e250031042773361d1a74d50a91a342b0a294b691aee37aec0e84109c26ad51fbf5ebd2ec47d662b81e4006c1af14223449d5af54bc0882531b5d319d652ffd2d108cddea092f91ed264340b075f2d3fcd4be8cc9f3074e68bdb718c5b2e9ea2233627c9001c40f8c8be67e4d7a79b44f0ad8682d103099cc701b365a8bec03a3ec65fbed9bf8c00715a2dd62b63a6b86b300640fdc96906d1e83207a60d553f28ba5727bff089207ee3554d0a51a324846d0cc0340f0c0be6e9ec552e239069d3bb0f13bf575caee6f516a07c693baf1cfe9939100a903f7c2e3becccb2a425703420776e3fbe9dfceafc784e6c0ffc8551dfde38e452139b0ab3cf5a8649fe94cba0711207160b5c5f2676151aa2f191cf8537aef3b4707f20646db0b2155ce4be739ee06c64743fd736e13aa62206de05e7a3e6f55ef5aa66603afe2a26d27f6715fbe062ee78ff134756b1d61f10ea881175349884ac94be83ac108c101481a183db9d93ef6978ea386117258e3ac072068e093a891de1553bf8b6905c819b80fdafd3ef556eea0998195bbad527d6ba96a9032b02de38a4e6f2532705b31af56fc2c5455670c8c909b621096bb63c9241031b01bb51453b55165942b4818580dea596816aa9a49050206568b8ae2ee32e5bc9805f902abd54ebaeb7a2929a55e60f7bb941c11bd3a9fb20bfce66ef7e966565031102e709f4c2b7910a962ae1c640bfce5905b2b4de8a76946d6cc0e881658bb519b9466a9eb5347d6f2072059606408115599842058604b694ff5f0ac1f950be40aac16d39f4b370b62052e5bd0bacff5df8bf6aac0a74a164d998ea3523449dcc60d2b0ef00f20f1111b3158530c2054e0b36ad093d1734af6e929f063fa9d2cadca39e282488111d54ac895494bddada3c0baccf146372529533b50e0923e152a35ebf71ccf1a22365a44c46dd098612130429c043126d08186c05e833c819359698d96377f537831007102ff9e7b5f677e7972d4921b5d43a42406428f00690297538c5a42b5e67b6b060d5dde8119331e3099d0c0820609495f3199280284096c964ae6a81d9ad26b13c8125857adc792adfe18fca3042eaa1c5c46a95b69340a24096c48993e2ea350baf30f82045ea4666e4b21744cb5408ec0b85c13aa31f55ca8c5086ccb1495102a2b39ca3345e0c4536875372e835d7e32594080108135332157df95f6514120436053ae509d4ce5faa77b640dcd001102b7e934beca32b3e63b08bc7a51414fa68a318e3e013ce521304320406053ecd8b5a1a57c19ba14407ec00ab9b7a6c6467da73701101f307af485095df1b45452901ef0ca4f542fc8246adc03e101abf579de0d15bb3e45236b93c96432994c265af00f203be0b6a28ea6ddbb6dbda20356a4c6574f9a2e8bc972c0a6129d42f5855697351cf031a6a0e2c99cde3ab30ae40605994d18d3a36f4294d6cc290a2507406cc005252f678fa26f39066bc0e907a9b4cc4ddac22b34e0b4dee90ef51164066c7ae6a7ce2343ad584064c06b955f57495dc185f40f24067cbb9dcc2c4477cb98bd8301e3aea2aaec8d1dd5f5772fe092e5949a7f2f86c698d204101730aea26b0769e3aa238402480b1879aa43294f9f84cc196405101630eadaa2d6ea6f94ac0ba20f4056c06b06df529af4a9da7007202a602bedcb4d51a6ecf459a960454b3d2dd4ea2e2fb50b54f06b975feb57969d95e3e214bcbcac356ad742e866dc852938d7af2dd3fb25a3ba4bc1c6bc51e9ac31349d3c49c1a6e74cc2d2e6172952a360740190c4a8f45146a3501c0c05822084410000a3e7dd0073120000000c148fc6431291603a2e3b1480044a3a305c3438242e1e120d06649138240a07c3a150300c454118035110c4b134c773a4034cc89c9d7724a9d6126750f1d5e05161227e40d761aa3afe55bde0076c7dd00c2ef6b6474b208ac30868bd8e316e3d48039449ba572a0ae9587ab02a20d2d49e9dac008ce700c868b5dbdfa9331938501fe5e7febfd56e6a1d3d5e0e0bc2e7ad84b83467558106181e2fffeb167a331ffb5e167bc302bccd7a846b83dac079f4c1a54b1ad0794728ec6a68edcdc4416a464e1bcc46814c4f5bd4ef85888a05c494e864c5bea83d14a43b0ef6133c9921ebee92fcff2cd910f1bf255228048e0c11743611c306e1c8872097892e6e40da854484d920441ec894956bcd46886e49de6a4a968f86889a60982111fc7800ce9572332228d474e74aa1d94a1e45da8b4be4fdf21c1bb29269808206a0ca022ca2240d8b08a129f427cbfe38f9b117b5ff78e4176cc2604d22e68ea88fc8b9c42801bb7432b55391ccb96681669f00ff258360c34af28f0a1dbd757d7f4c87b73dfe8e024980e70767e363aad0431c6fcd7b27f94dce853393f759a0ff1fc03fca40d834a6fce3763ffb46dbfca0b461dbeaef1874006f5708f5d0d61dbd3b5ce31ac14fbaba7eca92e856b6cfab86448cf976b7b02b0b0ec66a00b722ccc499ade612097b990df94d6dd9fa5e9b157d1d834be0ea99f277361985729fda5399b3cb55b00d0b3ce0d3a48e36033aff1adfb9d98cea413b59e610fbb94113aafeacb9e91378477466640d071ac740c7e655318069f3d3730079c20239669f2752600cb282b4ca28cfe323a4e16c01fb825289c070808604cc918e96809e48e587b2a0e6a61088147524b4e59cddd5c2f2f445369fcceba29cc0904dd2e1b76ae421993192784a712796e9c1a45406048b60f68a726d06985db813788637a6f7de3bc5975c7cb04a4593530812d9a3057a40a286255d603d22184113187fae13e5460e0406c0cc0a90f2914a643035e5455846ca2973332221e267295b05a7e0589cd58ed872ddfd6814cad389946472a8b60b74ff76b6f6abc5feba8522b3ecbef67d822da7ec2fdc114f3f2096cbefafbd21d40fde1190ed303f49828ac6c1246b93159d5598a8a42a4945b856e098890a39469ace4d912f0f07ba054c01295981a1988063130d31ab46d0b098e22adecab9faac07854475c6110035e06a3279d3280fe6070f379347e200917482a4de30ec89ca3143b1a4dec1d25978c71942fa2eb153093fc6e3da334c43a2a642459bae5ed227689d95d3a338e9a0177615ccf02f559bb00b91545277476d756d5a9a5de8002688f82d4d5055186bb9ecd85f944fed04cf56bd3316c24a279080c53183fc247e48ef20b655fbea5c7dd9d0bf1dd3a536249803b7b80bdc717a99b8c07d17af322b6a95d5074aca9b27303e3d5efffb3fd68ef390efbec93cf2460113d0de8d35f018d06c8466c7c2cd87daa22da1fba51f92d91b0f625dffcc4136a3a3cc3a53e4a3d4a71821c00b46f60d9819ad34bcdf31f64d2b73d60c9da7f0ae312eafea696c51f32c9f151dfd9e6ecbe93968044f21eb5fe236e8fdbdb95c1514f16bd463d2a48fd71536280f1faa3d7ba756c9ff037eb0686a072c4bc9c9b202a2c0b0d478cd287139fed5b04366990800feca20007c76d472782204754e6bbb81a4285fd03b28c85e3ab22863dda9ca3b7f6c2df76b77621ae260ed2b79dfa1db586ef6704827ac1e76ed8de52170b8a892a3c25c8634d55e6c8c94f200d74e841ae481f2a793e3cd4c97be6a87d1e716f59ca8e23e5a5d82d6a88766aff41ea8e8bfa71ca8b19b769966ed48c0d3891e0c38f473e442618199d15d66148bc84f7d7d870e07c5be3defa0d267b09837251e195999511b15e31d51c1c0ff5f46a134827c376cfa8743de6541ec2322b33c90685f5a78e5ef52727ac0bf318ef9a8dd1c3134754eb956425aa08d5a1883d367cf0abc51a46f060b59205a227c7b4b7d5606466312c606ab75d028ba880b7591c964928df70c053ae3c9c3624aa29da58b73eeaa9086d4c6c42b1e24f653b16d7be8595a86b5f0dd9fa14914ac79e2bebb17d7b95e756330726bb39dbfa307cb2df4e5cc5067386781447842635ac4e9cb52f4a470e898e4fe331aa097294f3d73845e1b4d087821843ea973477101c02e708e25394c4fe70c0beb8cb10f090b2bd00a44302404ec723cdef70f9bd9fe0f1749a226a165b23732b60738f6e6a30ce952e3b6aada87938e2c5fb0cd528d610eb5f689d57f8a7071df4b663edcd9659ce021839c852941a87770c26e3b985a6e45ffeae8291f8887e0e71327f2812953e2dc5996ea04799a50d27c15fcf320514438b1a3bca769572e12f0f67ec578e4730cab25152ca12423743ba03635f0088b4415cd99c727eeff5839dba65e64608bb30ad9253a313e2f05b051226b6683c76cf5381120aac6669dc8c71875038046041645471f723b7437d600713a54057b18df61e65fc94c7ac57b904fa0fbc23a0f0f1b020400fbe5c4b5f1d52a5acdc75b134811601508387a717f1a93d2520451d9b1a198a63fbb03bd71e7ec41fe331771cb0af682d5617b4248ef6821cd3cf2ad94bc534b138369606aadcd0017e05085026e72b52397ce0ba458d002bb007160740f2ea95e9695cac390aeb5492577e3664e585e336bbdefdb355e2e5a26c19d4151a1ee4f8fd89df5e3afc74b3bd16cc8772579ac936a36e7195fe1436b6b8f2c83868d63a807dd79c47af12747b7bf1de335e32c3603f9f4923da0d5151bc33a72b1c6f233a7f674decdc43f8f41bc677da92a8bbb45bf09b591c7bb9cbd3a1d8e70cfd7b6ccfeb5b839b084d70a8821a421300b22018d5ddfcace73f419cc75a86413192789e15d35ec56633c77921949dfd6fa70e50a4c6666a8fcf873d9ed730db203a0995dc6e19f39d29c609aaee548582c0f23e1d57df187a04855bd21d32d9f3218021874b0872f6154ef97a1c56aacd461e7a17904ffaf26bc4ab000a336a677a9450a99a93684c8976a619a324823e6e6a73b17940cb145e12d8123447f4af5bb7e7466c05a88a19e4a820458540f58cbb253444d845d28b56ab898967687593daed2dedf88fb6782a7b97ebf77d7eedd697a132b5db7a471aa035881d390285c8859a1343aba29f9263c737ed4e12853e1c8a837f72de7b7cab484aef863f91fb006552897961873407d019f3d72b42395b3ba75d78988751530e0704a52bf46f2840e821794ee76b0ce7713ec168399f4328da9012bd81d5a0f3c4c9c91256e082cae9019c31eb37407bff237784a6fecb06739cb11859ac402423c1a098fd0d3e6e9e20550e9ed9c6cff4300b194a985ea2994a51f8cd20a2df3bb37baa5f74d8137ecd6d7ed31053a9dcaee064a3e6f8473f3e031ea56a10e5e871cc3011f0f8a868d22ee5cda78a22c27ed3e907b8fd367a13039cf497342b609034314f2d6685ea1eec2f7f7a30b2fca732ebc81d644645759315fae7ebd789734ce83817b59b663fe4edf83b3b1c3e8c9e79c969415fa7f1765a8be4de0abe4d991ccd57bc8d921b20cc1a425966c9d24f077614dcc15f5d3b561553b53aa2e6beb2930523b199412cdb6f2390a10631dd59f8e16901cdd52bf60bffe939989d644e1d2969c35b07cb26cf0d7bba3e90a98e2e9428129a6544e440ac7abdc5d72217e093e3c00af30b17b0936ab75d8b7e44ea9aef1c884975d666fa58578919f1fcefa90482c379e02e2c50d955836c529c37e1474bf5f3c1c0ec335de2b89ff179c913b494a9f6bf2c8e5ff2b1f701bf1248ce8a54c613a52129c430203c6615a2ca2e5d25c176837c3a61af5f83474a30d660eaf1442e919afb6632e999f94a4c4b00bcfc943e51d88139efea41c8acff24a19c59c2da706d34cb01c7a65c6071206a48b75f3552b236a494481ae12d24b57f34aa1b0f81494250906b9d326758542bd288a03427cdb2491c525db0ba255b45d4a87e8366c33d833df7f98597a998c0cd0722692ca38705696cb68eb199c712959c0c1a8ab06f3b25f73ce40b888547ad31207a9eac8312212be1dc51b4863b8d2e0219559eed306328cd7d122197fe523c858d43fe68feae14cfe07b3f4a2fe1ae30a2677063268fa024e8eb175464d4ffdb5354bbcb34655a3e62e81a5e961c0360b408d3862be24c523dcdb147b480a19dbfb794eca1e163dae99034b9340a300baa1b0e9d63da24ee0a9ba697d0d96eea8fa8deebc36d65b96f4978a0f5660de2c0688ef9820815aabed9fd1900afcd129476bc57a4bd1fa5f4596741c684a4c2dd883531dfc738258d20ba3c914c3bfa9dd82b62fcb63d61f4881b8ccb841f17e99d7517aa59bd791a8f66afb09a0bcc0b1095fe90ecc11e9c936f7db30a0a01c1e20712c782c71b70fa6c280f2f8aa78307f7855ee35e26d14d27cf75ab4d88bc47a25ac9e5866fe5b83fd4841fc35adc21ddf207126dafd4ab88a565e44476c04648c9c6083536c2b9cfbde66086ed1714e3c3fab1b14219e87d35c6c9b4997568823132d0cd2a24cef7b1af27238c9a286b029504123744c96c440462aff5f76450c57294b99f7deaab9c47c1c1ba32dca49c334a0d09324427f5b33bcb9994ba41819baf2ca8e7f1d23b37688d5f43ad6dd8be6d057d987b5d3387bff4fbbaaef143b430d8ffd2f92705cfeaeb227769f558dba6c37b506c407368f789ed7615527147cf71881f5b0db02beece717063ec97d737716c17ffea2ce03a2d2f68702ef63fdf80bc7811386fa93c80adb21f2b9c68f1dd59c9f9a143cef0d896143051479ad75090d179dbe4edf65f69ade77b9bf2b624ee74d2ea4eef6026268c4024561d168101c8640387c366404be186471ce8dc16470e7fd0603c883455c653a9c8f1e62dc55c17986841493b9d2967f48946b5fc75ff837f218e65229e682034c2aa61cbf3e1288200aebc71e7cd621086014e44400344c6fb6787a3482f4deecedff42a06e646aac5d4be3574efba47b88f76693f830661f5c961125587148bed34c86c9b9b2a76caa9ff5fc3381576e38fbc2a104217868a7deaea962c21df76cd1f622981ea52909e61ad4a4fd9584f58ec1072d2ba9c2351540fef08fc4b3a4ed8a1413dc28d418c64fe6061656a9b7e7b2330a41811b9cf57001aa263563ed69802a3e9b985810b4e40e0884c071d9fe760b6127b221aa2563aad4bc91c76705824a18a984867d70ab6c5ac255860a4a44e6e7f051616b7aea00b988501f351a5a3a373f86a3a034846630a054a08c174b750e0b2fe68b575679f7b7126c1b86a1f41591da69a8bcd4d919d71fced94dbb188881ee124aa02c083faf098670d154178d9be684fae1be431c9cac1c0aea4974ead8b83dcd7d3113d78b4a7ea1338c99d2e0d5c21e8574722e37d9ecdc008da63e88ba7a419f0196147066a443e074631bb00fc956e0cf9ac099eb55742bb7fcbb2111b032ae359d0b0350c734f3cf43af19f73526472d089e5ade31a4ee11f31b52cd53621c35529317e57a6f8e60a8f0389a727d674eaf7c17479ed121afaf88b2f0d5fbb7686b089e784ab778fb29b0f2486c02e620a62893973c82f2ff3a575793a5cfe9c2e8f86c8aa2cb85277b2796139cd220e4947fd9b1078a67c64456bc1940a5e6e7621af23217d819dc6937ddc9bf82b605e98de6d5d8083434807478a89c0b02a0cfcc7fc98bd05410bc1ba5aa502f2d38da737a2a8f91f081d3b56f067cad6ec6856a9023dee1021d4d128c90ea7ffd59f27555c51282b876df6f8c610c369d95ab7b1020a5dab65251016d514a7d03dd48cfb0d0192c0a0f57f5ae3735eacdfbc1db2da1593b9d7f254e8c728d809af8e0aba9486874f968029b072182adaff3d88b54487941832779bc412010e9aba3449da013cc6c12f34bcd51391d58daf5701e1b3379ba5c1d7ab669a8a5acf3fe827388bf9c6f4db806f47825f83944f0155e6c062fe114f21e3b2b09877a78dde7e9b8f7bfb1246fc5c25acdf1a3196259d5603519555224155051c677d70e8a76edf375ed4226f9d6f7fd9d248ad7b386513ecd466c645f54dc3a67c0f72dcaee39d1ecc01bc62284fac471b2d6f7a66956648028c38e39a5d4f7aa88d1978a95e0b3fcdb98e558914950899346294b910a35569f6032aec75be3b2bdd24d136de5aa6e1c18c6f57874292c452226b50006d6779d21de5fa9ad1b105bceb2a26e2aba3936a3164d0687bba58faa659cd4ce7b1305b71a462390d3d6ffd134ed32a555fcff1a1177ede4259bea96aa16999937bd4a3fa56a585096e67c59f3c6ab1f01470f4a92c32131eba60871885cca2ba328f7d57cd5984a4b8d7f4f1f540151f30bf3778141c35cf863bc701511ecad7d548838a0f51399ccb94bfcb2f48f35fe49b94b0f572a56a5955b39a990ce956f8b8ef1f4f2472efc63e5826d58087d3e30f5694a8b2319213b202f2e4e842da0b61468f16ef10f105133f6beab918f7fe1de8c92f78723cc87d023666fbbc615ca3e29d4cd06fbdc3f67814ed4942e85701c038a326459ac7061307cbd6aa9575162a01267adf48a56af486ef879dfdb7133860ddf409204de853a83fc4c079145e22b680f7e753bd4ad5ebb5191b0b346e189fda126eccf4206bb17701e8db66b678a7ec29a6ce931b0a86426223fe2aa8a01310363a0a81bfe1384a4a89c6540e4540dd055af072e8cd51eb609ad92a0b4a979d84c7cc5aa86181016389d7c53849c8842130d80e6071bd542dcc4052a97e70875d177040a85ab82812c88e5468aaddf14f2a1fe9f020ac21ac2fc00cdc293d1e911095b981748ec87f40e479aa9b30836d4c0d81d2ce00c1d15a96fb4b8f96ca1ddcd4be4ab7b61f6c648ec8cd848efb88359f0316943fb5b844bfe9f6258fab4381739c4e1c2f33f88c860967384f8acfbbfc125a98bae8d8a92ea25089e9aa49872e9eb9f750cfc5e3ad6f5cb797d8560164a163493409b9c7f36f1c673798ddd83272a2a2c7a74dc9c63b1dc77408bde869d8e8bc2c19275cd468a3ae542e86cafc241602af8c46ece63fad06f210e4d20879924340886d67b3c4a491d4dd54c47c769dbb7bbc91745baae16d823a36c2db88e9044254e1ca8e29444c658c52116e0e52af3198fe77973cb481206ac00d8da29b54b62dcebdd9ac4676c15a009810354f5346a81811380f86fc8fb8207196f0831f20683210416cac3d74bbfa69165ab694420843e902c1842748e7ae8aa08e8f6972ad8f9f0f97a2b6e7bd63b1a9552d260dcd4a5039c50d6c35e326900ab75874854aabd87ac4f370d32f0700ff512912cab1c5d4c4461aa48675908321b144ab361fb044a74879fb079c8ba7f415d9bfde4926e3e83fb0226040154ae6e31d6c290a503e445174a98d699fdf3a055c0bd94aa8b12fe2c10afa4c7b5984831ef24329922c32589235fc7f694a4de00a494846243a28d7eef0215a3112b9c30f4301d66911a9246bb6e7819982ca1e06d9e80fe3d6e012df31577b3b29ae523f7eb275df8dfa983871858b2288e11cbda9eba6e9bd5dc9d4a0222295bfd508259fbd53b813a9eb35cc467a14fb3f56fb048e1f8be0c74b7517529e666fb98a4677b1bc39a8e4ff63e2e1d280d26caeebb7c600829facc51a02e56a4b3936da43df5b72fbce9b50f6ff8303b482c8cf09b651824b0faa0dd87c78063bfc28fb747c9dabd29905cdbcc0af38a312522729fac46310564b26ba11caa5579427b38571aed8df3e8f820429f1d9d8ccad1cf01eb05e15c4fe69e6cc00c485aa5fc213b257e22288fea1ac1762db2d6083a381a084be3c0976747eb47d61c5af366fe4527281daddc35bf415d25441ed2c4e3018ad6e2c816edb0ab0cf5fe6642e1c935328120b869f51a94241f456485a11c9ec210da7cb0bcf02d112ae72e617b72383dd0281de4230232e6716a8cae9447cd43045f81cd3ae0bbbd7b74dda9594fa3919c942e84db0b0343e6eea1815611ab22d24a8a2279001bf6f856b09d86a661430a9c700864052d657404cc2f54547d452ca152132c7e0059bc6052b889ad29180036d3e201c441b9c1b9df0987e6527aac45b5ca025a069c8d9427872d1993d5b644420ea9000d0066fd4792c04f5ab743242c0de9b1ed56b3ba7bf8aa2420c1084a033d7b1a8bafa620754e79697ce4aa56dc4fb29bb74aa317102b0716f59a6cc9a6d4e44c4f52d16a28070bcfad4c5f88479663df1a8fb2242590a1b04473e90aea8afc6d35f86ccac5527ae22d463a001cbdf19354c921e7d3509e4b4590de6e64389a3777765e87a0b04b52e975b133d46008dfe1448ccc9a6c0de0334b276616067c27d4c393968f1cf660e40c910d4450bf9687d6ddb81bac64d52074a90477e67eb4ff802c5a60008c150500e35f9f3e4c7cb8c690212009901a74d3edd526112e015d9062bee8dcecc1207f335953123cee0720a5c0cbe759edafd42378e19d1da9a3ef927a8791fbadcd38a0af7a227487c34bb8a25c15ffb44b58104046cb4c9212278246801292c34fc97c8db3fd82722ae766632925f53240db60a677dc9f77266b1f1b8a420e558624e5ce95ddd50ff0b9742d42740046302d7df5e85fc228438c68b7eb3dfebe2c7470cbd42e2b56e4b1143ef291b2c8b9555e3a1f45a7dc24ba800b55825b1d67a039ed782447cf3215f65e74e05adbee922826eafc4d75a93b98b37fa7df5a9db55351b5bcacd7b6b8c7c6a86bb8a02aa1e7ce99890b7fd8504925c4a228e1d3e6b0a1c3b14a3c22cb61a78761ac99c6d19ec5ba9c26ba273d35e698714a4a97b0a7ed301c6a452920358d66b48018e5baf595304cc0cff2468a24979521e1abee4d99b503bbb224c0589694eba7c3f05bee5dc53491fa0087af8c6ab272ec36ec0761fa7de69f8cba4cb5661f42e79a174d8559817ddf0c68628e15d1d166ed6be49c7943950478cdedc5c07894ee443f629307f7a40a8a49a042e7db875b5141086f0bb35032889ae9555112372620dcf8761bb7b6e65e3a887a832d5cd661e596f6b5b5645bb6c82ef65664e00238ab1cf4552d770da89c406b4932ce407802ce7486b12f34c98ce9025316b91d1ae3c13077e87cd91d3432ece0c3b4ce4957ea2a3d63e5e93f6c6a92d28e42c4a52810294819224cac9e2b0c21001a3ceb1497436745d2745a75ad3f58915a0fb3c0c2a01dd197786579dfcab7a2288d6cbf2a979018a50231443e77372c3d2e8a4c4344d1d38d80548376becccc4a91fcdea24181a334ae85ad84927adcdf446d8925a9e34b908cbaa93465d7f11bbcca2dcec6d6a9bcd4533f22c99e8022f8ef93a18fe9a89519ecf8459fc6f0733853d67c5a4013196094eb8c26ff93ce4c42ade8dedbd1193cdd8d287385c37e20a47fb07630dd1cc0dea43a4829e734ab60b7aa9d3509560282eae75b67665de72c2ad305641f8904b74ec400e23b351578c1931f299d5e86e6c0cca276d4c191427398746b0f7bd58786442d4987904ed8e0daa05e72a07e4723ed2371562dee352448524b23cc20bc1b61909227b90afb3ac490ae70b7fb2f82b48df6171f9fc2a2b96496e9192b96928b35ea9ce00043f5a29b48cb2197cec099b5494f6c9e0176cb52fa738f0c768d2760f7e86a6693e9e2544dd43a960ce7e63ddc05abf828ad91a4bf3fcb06e9d73fc2ec31f9f4a638613efb13a56250cc0bb66a1dd024a73fb2637138a3870c131710f663f610768007612f61483cbdff7fe2234ec8b4112d34dc5f61f503c305ca6b42aa7cee3641f991eb85c107935732ced84c01dba38885f6fd2bbe1e0d26ea04b16829100c02301796a8559c2eef8fa68739e93b82971ed35d1beb9fbf2824a78083632e36e6acf1242428e5bfa96969fda73db8180f68f6228fd3c128030ed7467a5955e8c0ebf2670fff89100c3d4146a480c4f37a087a2f7afd4c7947073780a3169cefe00642ecd5831782ccd4a6d13518d2495e46212e5881efd1195ec889b4d0ffc49800a5e2792226f18ab1eb69e140ecbfc008b4f59f3e164301b3d92780a20ca0c58f48468beb119629e9cd4685eda8dd39d4401067efd0c73cd7438a9e98d6b228b282d22d5f59487bb6d60a3d433eee597a0f3c3a0953b838ce6197967c1ae44c35a657fe9d7588a1cef2682fc0f7469b68ffb34635399f9292a8688727cd6016c48a94caa6280e58a3971713875cae6afa9a1ec637fbede9308e9c25731f63a9fbc4287c9a9ff324fa877428de1f828d0d14fe53657241b63cde3699c6c8c6df586ad1004fe607fc318732b3eaa7ad0a8851c2a41dcd96e6f1d82daa27d307d7c59a6a9d19bbaa7fd720cd6b280eb409bad0d0610e7cf3270ef0fde16117e3df396980d69c5f8e047ed5be617b52e368a0c6338f1a3982a936b348d9c47750b968a36a9c1f06c8d0e0337615677b27ac6ad56bdc57e555d58a4c2160278a95fc004c62f168fb9cf70a3f4edb2f7f9fb17901904f7994c398ccb922ba90527ade8c43af41845a7b77e34abeb909d95a32c2d14a6d7743ad91ced91bc1ccae073ad79a45c29c4f1a8fd544da6b75ea185269d4c05eaa0251a6e0cedba1ea0b46fc112b43a32118c30c2b6dba70c6a1024cf6badaad7483243ace3a5e9ef362cd8d678635a6d8ba65532dd6e44ecf650895801fe6d6a2997f81946330b2d5a5be6ceed0d38e9cd8a8dda7949bd08fc30a3e3ea88591a0715235743bc1ce157bf2181107905bc20cc8455597d5b301642cc187d92addd199c35daa78abaa9d7fa7ab2ca1fac1c1fc7dac502d2b3f4599cd7527b560dc69c41b11222ef2b3162ea993b5a3cde67092aaff0e2191dab55224b6afd20d6d5143c874b742d48ecb8c122ae2a746acd6f8d2e12c082d80b96eca4aee401f820a38e2e7f5cc7bbc81714ab4711f5b7fd702b26c25917f3c9c9dc0fa9e78f008d1356b5545a315d716601d8fb18a9043dae117c7f2370dd323c72140ae0e318bddac9bd1bf74ed17124401bbe259f3507c851769e32875aeb577e24afc45289289676c8875e6829fc04ea1f6d4ae9ce79b91362c9117b4e9a3a12b0021b0ee61b6d2dc41913d4204e2a6cee3b0479124a0eff42196e5ced3859118308c03f23ada615066246480f1ffe4252b6de82b6b6ff27aa01c0d0d0690a4b5959768b5aad340e19aa8b466ce2b4d9c7ca9094ae10608efeb2245e88929586ce2708ad9adcb49b8936e1ddb3ae1ccedf5c1c2a2613eb319e600ee024fd130519f4981b2061b301843cd034caef5407c3912938d1342e0108fa4150f5872344b61ed74a81a1a0bdbc79bf6176e015ca5b2daedadd68ae28ef31843bbdf13983398d404d9d6deeced15492f92d84ae389344d266ddf2baecc684aa8ad2ac6b4885d82e264209ad904c570c8745c9f6fcc91baaf499da9a99b0dc6da8da682de10f71fe82c957539cbe16800a04bd8786617b2d3344903399f59284a8a08b398a500710dc8523644dfe70820a4927fe2f52173fd7c32661e7bfec5c92202e90ce6494e6759c979c99cf2c266270c9557c1f0aba6674c74035281698007555372d9eade152cae282816b678729f2d6dcaf9a3f8292bf6c98bd734259aa660bce4db2b606ad3e31b1b8937499cd04915e5331fd0106e7cdb2615ce5c0384752fe52fe0e26ebf6d3e6f189293bba1827404462b8c4d212e8ab337409e797548e06c70d184578f03b98977bdefe8b29e9787fd44d811cd708ff10aa3567b235e745b0fa2a5ed8bc8ec8a9867e9efee4a1f8e7eafcffd05d8f1eddc6a4cb7cc9284d934404a0d3857faaaf01ee9eb44e5b41e79d807a9f65d2181bb8f024f0023590be08bf35585d0957d8bf007047a16729b5133fc405d21dcbe6930e19e5fdf6e1dc6839dd3893a298500e4ad18a83d6f43e74cea68ff1ead6998faf6a0722233ea02f2177d93b515f3bb127cdf389873130638c0ac073766e969a632a5ceddb710c18ed89066d8511609ba7bbb86324e429e28976b1a1f4f6026a69a3f1ac4f30db2929f54dda36752eb715dc643b5e32a278ffb1cd7642ba77c6ae217c4a2be8c6213263cf5068106fee7943824ba8fe311e89a8a3e273259b1cbf35502c07863b6f74b245cee7a84bf15b6e7bf65efa8b4f1f4d565578854cfd202319440e832152f717cf4c9fa99990aa369a2fc0c09005fbbfc6840e98744e1d4dfcbab6c36a413c11237213577c49bca466780b5c487d09c5eacb400d38cd2d93065b762fe89c9d9c538acae5adf048663dbea78cf7f810d0dc386314fe79c415b58d8c21f05b4553bfc49f911c27a9e9ade20608580b4f2ba69520531d4016d204cfe59a99c34d82d9393ebc61ef0e18ad56e3743a5f862b2970982a5f90875dba298d48ee959c2571d5dc0621fd00b5df403e6cb528219be7b8909e183941a24789547f82daeb48e33334c049ca23a9ceb2e249cd3dd1cc8e13e90d460218500db501727664014759c694ad7d98ffe2a7c92bf7aa9c0ce189bd2e42a4cf7190683f14ba46985ddccb042d67d045924a213670433d9e9840090e70be033b8ad3e566d3b9afa91335ee154254849c3677d93079089f5670b1c407e39d02e53a058191693bf1f27e77b940837474eaa785417d9285442ba01e728938d3a23b0943f84e4b2029c0275c320639632e410db24465c5dc5586e74ddc0684ad2326941257d01151472dbb6e0ce854e4f1b0c7728310a3565b87737e85a4b4e99cac96e0cafd0222581310ed3740a721a427456f49a921f7138fb4be07d75f2adc813a6a93181a3e5d5cabb29697158cad6d6a32645797d4fc9cd8dc2856ec53d27aea5c1210749b12fd5d7076cd7edb44b8cba459e1e17d6a29451544037cf62a990cb35bd6e70ebea1fb5c454751f66a82ceca78771a860ce281c22e5f1917f2910f1e00b02d1f110af41d14363031c38eb5f129381bd61e7cc52046ae2b0c96004cd6bdab8575d6bff447ee2e61262cba8a686348e54e16d62105786234167a25e9123c815320bf8aac363343db4620e1d399068349eb31b149af1439ac1a9cc3f0e6e8db102247372df351667e86fe735118c3cb20ff39dbc4fffc09505792be7d67459b37b9a064698b300f6595c8e8aaf9d8e7debf5956166923d2aaec8d1ab20ac207ce47b4924269278c7d174db8fa9a0217435782af78778994e8b411780da6ebd0c6836d699ae2d374801b3a40b0c515b71c3fbc6ad76f473be166761ce252478e46c566fde3ed15bb51bbec0db628f508b81bc54cf97878e3d661d29f4f7126b164ef1dc14ba546f2112f76e140f34c73cd0a6ee9ca3d1cd5712a7a7a4cfb4ee553611ff42b4b2b185523dff11b7a77773d83d5d89d0d461a518d6552312d406807d9d72821d7b6263d130c7058bbdeedcf8f7520416a13f03011417086b56368d6f7083758079c4bdc01ba82af6ac7e627501c3fbcbdc66d432986f5b4715cadddb50831672d87c7612d9486e9135dc8ed3ea8ad89b3ea7cf42769bbb5234bcedddc4241647827bd5041aa100ae7a0bbb0594cc058d7ea03cdce625832e3e06f5a41e65e5f585b7cc4e542cd9617ac0abf33e49af4a27407f0fca20964fe4a442285a8d5d72fef9638b6eca9d1cc6322c2300d38599010dcd1192648b759ff6fe77045056111c26c22de9ab88500716241d83ed0729c671230d461c7f2f0246ecded0bc7078daf91c9f5818f5dceabc30abb2a245c50071e058d7e521eaf0224a6b98054a0030cee412105291c1749e1a83a21cd690e07fdaa5a882aeb629a5d0eb7d7a7e9d03507b56c86d30972001003cf289f598441f8b05c3b1c6795ce0b02d7b260343265c18f9efcabf1abd8a8a3dd39c5760809e02eca3f2fec96434e3646261c4b87d9923f93198cf6e448943b86ce27c909a34d931d663cae3149064278da609d7f53da77eeb438d99616c7058fcc0e75c427aa8a47dc67374e32c06e623509f7bb859a82b3932784094b6401ee15e5b947de631e48413a3f7b31ff6ee29a50f7a60702e9e356eeb4e6e8314e344dcaf5b1cf887dba9f1b92831975e27a551df6daa69602269a33173502c12751e206e0710615820f90ab56699a38bcebd85938e0005d52f03c74de0622554e0d9e5464759c022270a061d541add244db3f08c75a9c8d32246fada43972aac80eb9b54a773c7aed40dfd15415ce98474f5dc3238e2f942ef66e0a614692773799ec154fe2be142fe3503a73fde4c284ad9ec2d58ccf2139f7648a2cced95e4aea15a62480681221523f32683937c116a2c8c4bbceaae8c48213a59bbe0b8109e935c2c5df7d5e5b7190193704c5e3452279657db772adde8e8e943409aa8ffb9d0468cc72005115890145f969a459f4392d3c657a0e5006e3fb4f5fef24e64b1ab785f21160b870c0e3df3ea4a25e97c6dd8958f09c79c8b6f26f13aa713ce3cc1b20c67e1371df8d90980fc427c094515f8366fe24b98fa669230c7e6218f42f875acaba0b8a3807475313fdf39b0c079fa5d4a1e0dc7f3692b703f468fdfedb9345f69d3a5fefb6e00f7711621b5a6186d24ff9240a286adc4a07e0026073bdf70e8fa051c988ddbe008685cad3c013d0ef00eac10389efbfa069a79970d563410840d20f013b1db10bc04e73f7b2e0024ca1451f1f4d6ddf524e99a73a6cb3aa81714da646b3d5d71c6e2509dd3be3037e13bc86f3c0b86e6c6a187d51753b478776598929b7bc6f503f482e97d20b94717deb30d6242f1acd669f400d814f8d46efc0e2217138e7651d96397e48941573bafdcd46bd49ebf3f22d37402e649df9046eec9e66d182cd58885faa155ab1fd10f813ee39ce76575482ccb2d84e75420d5e5b629935332e0d13fcaa0a3be4fac4636472549e709f88ca382af5e5c029f8537374501d17b1bc0fe3c3d698ccb4ba333fad7f012919528f594a8dbdd49239670dca94f938fa25298c78aa35a10cd67edc3ffece81a7c66b1d2c29cc7700e6d76c6b263fec352a9abf8d2ce960e675bbb36f21021f12ebb23c42c015be37c1a1b90d40757e304a01878464908ae7a3b20c9cfa1769ecf010611f525708a79a42de600296a85c46ba568a4e4affd09c30b5f9b8cbe0a8e17be98a92522943d38f54bdacc18563ecd71d77453fe7c08a273cde33a6c74432135538b9cf6c1913fcb1c67253508780e73421aeb5bd3a2acb55428a40016cbc20217032d8a87bde13192e09f9e113d5f3a3bb2f28706641e9c8434ed44c6d054dd52234b68d86c46df9c25deb313e4271607c40b35dfc82e2847e2fef50221a7fc51cc902d381f0976dbda114e5f9038115b3748daf6a69244653cf58c2920e97f748bb029a569ccca468c44f07ba674273b0d23588394a8b4bd7df059188b558f4effaf9490156d619a2b638054dc04f110d33aa945e820e505651336ce6da7579855b41c965da71af3ccaa85ec010618ca0851f0e9faeb5ed850590bc7357d60522c06d1b63bb45e605bd7acd2278ea4642d4b04703854342538f61a95902a6f7b39635b53504dec1f75efcb343b42f5edda7dfd254f70da0e64837509e5091d4a9bb00ca57a11b7d9fe0685feaaec9afd8fb39abc946a892c34cb2bba6619842173ce422e7d473164c57472929d20010d5fb39fad31424a27b009dedd5e7c106190aa9a4101396f03f6117d7828a61eb2073d176271cca5f1330602bf62dda29fe83c99ab9783a807fed170dc0b302ef2faa9c97b34c414d82fd8c9b70e86b9dfb4bfe5f10c0f38016a62840e34887e1acedb886f7706ab902fde752928df19819853cc9c2b66d7afd82131c35815a91ec09ac14682b101bb3da639d633cc905861d894304e6227c26cc36a83d904eb800d1e63387665989358916588b2c560c6f43fe3a60d166320766a1821a745faa4d605e67e5147e24eaebdd32923cb092b35a0b5950237d481706951c4a0ef88f6e8cb7566a06c5bb479b8dd311d87cd1e21f279382e5238f6fcc8be0e0ca4f068e794dbf8f6b13188ec9d131300aff00e814f7ae7b9b6ef3764606a898e58b37aee2c12b698833dbe1103e78abc29cbdada14200c559a6f5e9ebeb84774ad5d84a50f4b5ad39bc2ca1d561c3d2a7d9dec72cbbb5f15c1ff4cf6f00c3c92851b1173ce91552c170280e2bc2e241607d23801ae87151a3de5fae9ca94d5c60faaad2f67b2e5c7c0c544094b0004198d86a8405b44cc6404c800e56544573425201ce7e0c24c3a045d1a63f9dee880349bcd9353dc85df95ef71a8b54664263651a305a5a8670cb080e93b51c669c37ee5c4dd74f7ed95d728e3df615e6055d1fa631ef92e19e30dcaafe89422c7123386e99edb173708aba2dc1fc1491f3b9175bbeaf7c4a6a972951c3bb38002ddede0afe1eb35ec812518cc4aaf1b13ee8377607ce2ecadd14d2991a93a1634c47c44cf87f6122e860589c6529ee65397725405d010852acf52209bfb3b9fb0d16bcf51d95414cfb4bdbdbbb228af72e61ab4b0c96496a8446221afb809365035e19a577beb267bc60f6635678356e25cab4aec4cc03175925b691ecfc7b8bd198a31a5cdd9d699f591905b601f149935c538cf4659479eac8924d9f056a1025b90364202cda6977de216a77614f05f94755044d3107bb99cd89d5206f5c6a6237a73203832bd22e52dd33198807c69eacd39ab72cf96f7aa0493ecb9843d9b1038c0d0aba8441bee85992d06e1d261ce59e0fe47c98b0f127ee9dfb14a09560ce5be6ccb6700870ff2ef8886268d34982117aa4902764fa5af4686481e09896917bc8fdcd468bd13cf622bceb972096f2d51612d59db86033a957d5808e540b7217bb3dc448a5497427955eced417da5f7e435e4f71edd46707d3fd17466c8613e4952fd34eddd84c67ffe94351a2978a4b99e03bb97326f4a409a93968f3a49c49a9042d62db60a7b7cd86d42b2f08fea9c7073a0c4ffefcacd7a05cf3e0e7d6841ab9b7c32559b8262d39f3cb6de38a328d202b2468e6358a4594dc83d36ac3a2e819bb182af0db45c9f4f98cb6ddc34d1c10d723386c1193d2da6c5416963626ce324972f45d018d92697417b360b4664f5bf023e7004b10b3730eeb4d0013cc3333cc3333c1a7cc15910355a23dbacf94b824c69cbf27c62114ed22f28294999644aa2811f00f63d0221fea989087a0f7d0beb0b840b9ae036ad4c27b392ad6bed4cf0b2ddcf837671a5b39c9364430561d8480118609861a6b2430726e00b1f98e0a474b15567599ac86df9b8041fa2bda4963596e0c5b47b42db675914b72bc1d9b8aefc961bda750ba204ab4cbeb8999ab9ac3a0b728c61038c8f49b02f9d6a3057b5a5f43b50ccfe865a3a7c4882cd2865ce185d9bfae84f52ca8e1c2650f98804a7f32ba5494dcba132cb0724d857af3bbfe46a0f4abc3b7c3c8293f742ebd6a89a546a47f02b3db7d0f2efa589d7083ee711b57fe9c5284c6304ef39a7d4927e0d523ba3554cfe9789123e1671cba9f429f93945b03aa37ef1e57698e2f091085e945fbe193a88e0d6a3bf27fd82978bccc721d82cca9cb39ef057172243f027d4e5297d6f388a498e9464821c639c1832301100203e0ac1cb59aba82ad1f8a17442b05ad6d76db2468b12fec72038cdc9759645eb38f021084ecb71a36b39cbf84184816045a631d5e39de12f0b083ebbd34d6749caaf171da0b80e5044505272b20345a54b4a566e7cfc818deea6aa9def596bd449322363a58c9494120840111f7ee065fdfac25fa9d2f2acd4075e3d4be7f2ca8c19d2d6c1680b1f7c60b50acfddac4d4b953a43f48f3d706eeffe62f4ed6f5d4f927d9ab9f5a1075eac8f326a7174304dea3cf062b9205ac8133277a8375427e2030f9ca6cba4296378ba51f7f071074ee5bddeacb54c1b13d981ede89e1f8367fa8b4227c930c718c910f151075eceb577665aeead311c7cd0818debe29bda94318e6a7dcc81d1f2662c2d6b5c29422907c6543d47f52aa3c7288f039bfae9a956f3695da99364267e2365b9410e943252529409c2547cc081f70d42b5924aafe61c1c010b6ce8e1e30dbc1a6daa3b081d3dd9981f6ee005cd59dfab762dae37f86803abab3377f8cb546719292927371ce52e0d1f6c60cd4db4544f26b50f1a1f6b6085dd8a521d744e99bf9364a906c6646b73ffd6e2e8320d9c0c3a66d5f5e248efac9364e8030d8cc6d213ae329feae018609cec4081c1ca8d1b20b001860d1b60d800c3c631f671065e7639b8fee052af2ef32419173eccc0eba4b41c6588ced27d94815152f9b9485dbb39a597850f32f0bdc95b7aa9ccc57d19032f426a90671acc4fe629860c4c5cf021063ee6578ff52f66312d7a92aca464e59ce0230c8c8f287f4f52b9686d3ec0c06d67dda05fbdef5df3054ee820ba6c8554a2f6f9f002a33a77f505f7b6914935f8e802ab32731e59639b232217581df77d852e13eede6f817dad5798fefcf3575b0b6c2aa9ffa5cfcdf225a118288d5651e97c959405c747167859576d949ffda2fa8e055eabd2ae25b5597c194b57e093dd8bf5715db42d2d2bf0a3c245edcac58e2dd72a303278cc59fd07a9b5eb830afc86da2c4b7daab3384a480c1998cce0630a7cce626acf9a2fc88dad31c6982de2630df6b40cfa5679ea430a8c8d2c7d4164a67a29458117b46af9429f0651a6f401054674b81275ebd25d684fe0a4ab96528896a7edb23e9cc0aeebcf2964d7caac5627c9ee6c90418256d9f1d10476b3e5a4aa852ced9fe524d9199fc33e98c0ea696e9dd1346b77f36309bcd42cb56ba9e58da7f9a1045606194d061db54c3e92c0491b0f1763a70d3a5f1b6490a0a464a58c949493277c20812d6dabc9cdd5ba8cf711780d369e748e52c816e6871138d3527a9aab4bbae45f045efa90aed406ad5e54bd0a1f44e065289df4ade97d509d958f21b04167f9a6b4dc84c0bf8b6efed3621f41e03cf7fc7316f63d3aeb0308fc08ffacea55b8a6674a4ac4f0a10623c293667f4ff78213e55afabe73bed1dbb5c18317acd0f1e5bda855ba56d72e182d4ba559b554aed4a7c030b13278e882d78f2ab3d3576b569d5cf02da66bf174a4f0b60d176c6ada4c17f37af8676ec19f7aa9eb5f4c15172537810d3054f0e0610b5e4a57225c55ef3dd7b5603c879dfccdd7cc59a5057bb6b234e697446b179d052fb6b6a9091dcb05f14e16ac52aa34d8c997bb58b04a54c6dacc315f6be91d2cd8d4d9c5f8f26dcb77fe79c1e3158c944afeead49cc4a4e6ce15bc745f2175fc846affef5ac1bfa06cdc34a3b8cbe277ace0a5b0974fcacfad82ad9722b52c07a141c6a88235cd4179a82c2d5d2e53c1482d4b7b0e9a65765422a282d1e65a5e97a56941bf86780ade74c894e31fb59c3e341ea6606434a543c445f4058f527052cb3c75599674da8c23928235d7ab94f49843a9f3208ee27cf59216d456bfa2e0955e150fa2692858d37af73444d5a77241a060b47d6ccfc275b4cb297a7c827f97a383527a237a82133ff70ef275d34eef0427221accb348115d174e307aebe2f7418bdf426713fcc6740f2d6b46136c27ef249a21a3668fcec904efe2282dfc75e7d899c204e37ff2ce4c78cadee025d82c279db5f4ca5fec96846809debc63f6e9777df44c2578ad35e86a51778beb983c28c1bb2cbb98efc5b357f55ac36312ac94374a0bad5cf6b83234828724585fcda576f3c612614682d39973678bfe3b72b4182578408297efaa3eb775d62b3b28783c8253a55e5ea95eaf8c4194040f47b01f3c9a6bb59d3af8c9a311fc07132d473775ddcecee0c108be36aa6ca5a965d07270117cd0721475ba5e8fd0ef3cc143118cd2622e47f3cf72e89744b0a9a5cd9d6446993e4328292f402686c303116c0bd5e95afc0f0fc1caf6d3a6763d43f05a3a9d594309cfd6973b781482f10f9ab46c1b73bd6921049f2ee8e43a87102a473808368b71e346ed04c147a9be2e4fbacba27ab135780482f1349e955e51faa268e7e0010856941e9d055b595af5a6c22525adf2281e7fe0ebc595c2755a136efb81917bdb4a43ef6939675df0e803afe6e297ea9099d328f9c0f86f7ed69e5f556b760ffc79eec910aa5c9f6cd103af377d856d5a7b596bf2c07976a9a5be363c306a5d54959f05951fbc8341fdbdbd989b1d781bfd7daf4ae7a85099e05107ce056fd1558d6755fa5b82071dd88f9a2b33ca8cb1c56d0e7c76b832d71b3b8e149203dbe993bb283d8c03e7f28bdda965ad6b74d4113ce0c0ab3e7d9f65feb42ba4c7e30dbcd0f55a9e7a0d757043f070031b45896a4177ba868adac0e9129a7348d5d9c0bda471859f69f184f0ac8175d72b639650d1a76b35b05ad68c79b59cde5e0e7aa481cd3d29947e5739ae231a38754ad428fda029789c813fa9ae2f0bd9e28f7031039f1d44ba9c84bbe99c2f032b6fb45c705d9181915a1e5ab51cd3f49f63e06bcb7547674162e0d536cffd56b701868d1540788481137a74b297f91b559ec0c027cdb270ddd99566907f81d1c2be64909a469a8a54f0f002df510b9edee2698e51ef02db4abbf851ee4935aae2022f7ebb79f5b627cddb16f8ed16c7838c7dea9d24070f2db05ad6628eb6bad4be8b9a207864819784d249a5e624f23f080b8c962fc8ac2e352be19e2b70aaa7b3d279d5b3cbb402db1be548535fabc06956e9ff674afd7347054e67b1fbc5ac25ff251921784c8151e6499310ae4147cfc282c71aac165d559ac876598a3601c1430a7cd2fed95c7a0c5d5f14d817940c336f515d561e283022c27db5a8bb1c470686c911c2e309fcbbded3ecd9a9256f27f072d82b97baaed7c426b0ad7632b496b5a09a2526f051d9e9fb30a9e95c24068f25702b3fd99fd04f5b6a25b0f17c47c79665fc3dedd1c12309ac50a3b15473c77f59460d0f24702f086d695a4b9da9e5c1e071045e16d35d1c9de56971311b648461d0e0610436c735796fda59f87687563c8ac0e95c4a4bd5ba5bf6fbabe041044e348b2f6e6ebdba052d59f018021f55dca3523a768c997a0881cfcdb25321db94cc790481d5ffd15bc6184d355c7ee0010456a56b8f8e969e5de83cd4e085d4b9b77a1a840e2f0809e805ab5dd2195d4c1d8d62f3821111bfed9242280a09d805aff3764bbbaaf5e9a54d75c16739cbe052689683c717096c8061630460d81081e682737da73e499daac36f5cf02dcb18f79478cadc2e778704dc824f225b5099b1b705abbc656ab9fca705b525a016acf6bc9dd36b7d3135b401c61d2201b460b3fc9d931ca53ec7471db3e0364b0bca847469a23c59f0d2457dde5f7e2c58d9d9d3a6ba2435e8cf1286d0a4c50d519f4670f662cb185cb6ace4a63705218ce04dff2bd1ada432972e5c04bfe99fb42c8f4b19b4a88483104570fe2fc66c4a7ab69f9a501092083ecb12ef14720f41049feee55f8db1360bc2c50c8d430ec187d8ba8e56bac3e4b7e36fa036c820818d475121034788213811425d9f0b5942cbb9722b042fbecb6e15f33dd11f633b4208c1893e2984c756a55cd61142c820d893eff52a3f75f7ae6c081104675aa7e597fc3b46fd4e92a1ad9040705a52da4f576779aee56a47080104274bb71c757fda8716ff03af3bb6b9cc7c1ebb34674108f10377abed3579fc339989e7e8e5554c6ed15c481f1811524493d098b32c274d42f8c068e9a7cee49dba293c493d08d903fff9252f1d74c3bc4df6217a604dcbbbe3482dbf62ee5176a02421240f9cd0d24d37fb8a6731f38e073e9a7c61bba25968fa310c2177e0368792ab7e53069942315126a792b2a3056fa26325043bd0e092921d68bc1542ecc0b6a0e4770b1763bd56aa032f47a5ee2b42798c1242e8c0bdd2fcd0427bb4e4ef1c1891c9c5131d5246fd9224089103efd175e997e9751c5fc58155526eaf961e5cdafca21b84c081d32a342619577396d5f8065eb335cbf1059de3b86f087103bf26eeae253b95103da40dacf697397496b4eef64f8e33c6b811c2064e93ca1852e934640daccc392afd5a94eeb7cc122342d4c0099d5a3aa1ab39c2f427c95410868d3684a4813f2dec4ec54474baa404cd10820636691773d2abdb74502e2167e0734eedfcd2c95129fa1033b09ba54bae1dd26d5f1b5206c6a3d04aae6b0e5a8a4b0819380fcdded267fc6dc19463e06599ec4c6a6b634421440c6c7814712dc91b6d6f1858d932546f8e2564262a292667b44ada0942c0c07ee96e793af5d35b3229215fe04508a177637dd607215ee084693bd79dcf358b2d3d6382902eb0a9c5965f84942a4f996e788e2ec1182c2809e1026f5a7c59ba8c2efda87892ec7780b2621bb205e36acc92e897836008d1022f9bee119a258fab859f05f6b34ffc3f699921a4586077a5dc973eb82c6de715186f2d9fd49feab5163756e05b2aff903a8bf7d26609a902fbf173e9ff298ddefa102ab0e9648c2ba3d24f81535f2f376dd3d19ab306ffa55d8e7491141817f44ad5975b4d741605464743a8b5db57a32e2150e0a496cbe94c4cd4e51df2043e77b5a465943ae6eb98102730a63999d27cd15d6526a4097c4ee3319752f3cffb843081f5f4fc1d3a0769a35a4b60ecf34677faceefd10a51021f64dccd13dbd1db584812f80f91f9597452da5d4c08121861a32f3b9e8b9d7492072147604c488d5a5c2793172146e05c6a796cbd434beb31252525480f01901052045e837097a347b9db0a4f564a4a56fe06296b841081d749adcc4a68ab37e1870c8171df72d7bf39949b9eb712220476b54b2373d66aed525e0e4282c0af877695d935d528971020b0ee2d35fcb4f849b29323440dce3ba308bdd95fa88ee37798a0a464042cb051520206905ef0392ee63493ab438ae377a0989cd12a682d00e105a7596906f5ac2775f6bf7276c18b6c59cc5950591836c808e38c66013a2d01882ef872d7f1655976b946f52b7de30567ff86522839100e4072c126d150ee5a4cff18a327c94c3e478a1d0892a91832303901082ef828b524e37db6db1b794a0ebb05af1aa5bbee7c79752791310214d800c34609406cc1a8dd14575799dcf6ad059b844e42293b4c6000420bd6dc5bfe6f90ed2e894e92ada9a033360bb66588d4da62723987ea24598ebea1a30420b2e05d7649cdb3649ed5b920b160cbf48eab2d97a9e59d051058b019c24e4fe816c82bd8f2a4f3cbeddb966a82b8827df37c2e6f9449089d0904482b1829b4988489085fad5b8a00c20aeedc5f16d392091995d22a38cdb2bfc67454f3e9270944152220a97800082a6c809c020320a63020a5b871a3c120c5282e00220a5e4b51a1f44a17fff40f45054040c14b755b2384ccb2e5b13fc1eb95224c4afdf184490e4c2600d2890880704202209be0d5c52434b6a0fdb5189ae458263856fa0c93dfd12a3b561035b192c6a380022099a0000826d87dcd5aa49b99a697f91c280a47ca72862e618201104b54820fd342fa66b85c953a20946035987c695db56779e593e0c75c9641a792a6f17d494c0024120f008104a3aaa1640a9df4be500204c8234c2000e208078034829732eb4cad5c50a1c2250d29803082b373293fe650832c821f5b293fc8f4ed822a4f928128827d9983b8ac3537089044f02b7ffd5e5afdb7a93f496610221a022087e03c47a499d413a159e6d80b4ca08262724c07a88262a263e58018c2e40b9042b0c105b7cfd8b5265bf224d98d1b6d924ec73b1a20846000c820d855f6ba3b67700f2082605de8acedcdc9b47d4d079040f07216b7a595e75a72b9650710402800e40f20207e30a900481f1600c207141d2068153340c000903d305a9870f1544bc485aa0756a8973b6b175ff0953a397a59c903e3bd5a67df77579a2a1ef8deddfc32b38be37abb03a783b6a04a8b769b74d00eacaa972f7f740bb2745307d65f4e6adbafe5286a9e244b3140e8c0a6d4ec83cc81f7f596a3d9c99367cb81d339836dca975433e84d19207160b4e49e1edd0307de4fcbeae975c61e11be8151da827aff13ea37b56ee03b6ad5fd93b7a6a50669031b958caae4af78144a0ac206feb3482195eaada4c46465e555501a9a2b2b08b2064ef9689df3b96dd49ce99d0840d4c06ddaee96b43769e0b4bbada87f4b264fbda0dc5066a800040dec8b3afd48a9f5af960f809c815526fb4db75c372d3c666083d2d6a33ef6e748175f005206564f66ade5a0490751aa3b1780908111f98246f72cede4ed50691d07ad31b049282935a5eb2062e083ec6fa1b3ba3cca460f12065e76f1d4cbab9b2ec3e50639526e808081ad532eea8c3ab34cd14f92a1f12705205f60954c3d295b7cb14be7e04059debdc06a8daec1948b2fd3b8aca0e8203700d2057644e56b7acdebea430c03840b6c4be9f7239392e6eae52459198dc3d81658fddbd75a96544b6759c6f81c639001a205beb3e0c2b75dc65753b3c06fd6a2718374b1c028b5a994dad8720b99bf0227b57ecedc2c35a84f4f92fd590ebe05ab2056e0e39f1472835e55ad671578a953fdeee7a7ddaca1022b5dd699459b7fef8b9a022f7d543ddd1da164b83409206bf02eaf9d8c6d7b9a562d054eb8ea95e9e29e9673688649ee3003878d11b0c0064814585d2fdf7e4cd575211a804081114277697fa55c0e1f419ec089cba875694bbd2f99d0728038817db3df16f47bc9d4e22abfa2d22a387bbf10803481ddffb831af4cd2c8d1680c1026307aaa93b8e654ead474e6204be0ee2519844bf6dad2a527204ae04b9eaa119ec54092c06d8ac8ac5b274f9299a081b2ce3a0082046e54bd93962507bf72045668b8b8f175e97e8f1d046204f65468693a991a2d45e724798e4f0c52043eabd4514729358472bd1944605ff36b214c6b59d0ca73831c982043e044b6dcee59cb0a81d77266218450aa554c27087c66dd2e772a2d20f0a1a5fb3121b3ef6635881abc4ca745e5e90f3a85965eb02f5a26759e232ff82cdebbd0ea64bb60bd566b4396decffea20b5ef76a2d6452a5ddbdca05e32f2617cd3437b966df82929277fbc0055f1b2e46735f7f97ba91b298e80a3e6ec1ea9751a8539975d2ab99a4bd5f8a210393f4610b6ebc764d3486e693ca5f51691d6b830c12f4b3a0a4a416ac76dd310b7a574bc7d14932347a478e34565026faa085b2ecbfb5904ae724198a4919ff3a120b4460f77e2af898059b0571a15e4aad85cba5b1ec053796f78f237cc8824d2363d2d532dbe69c89052f44dfb32c5acb7cc042d34af88d5a6e6c2dfbb4ec5a07a18f57a4b492e5c31528ada43f5ac1c764a3a544bf74ea69c11d567066bae5983677a534b60afeb5987569bdbbd668aa82d12d73f6e8ee53a2b754f052ed6dbf286f4bc74605a7f3b7e93cd527b2c5167c9c82d1747f793d9b67edb19212cd15650a3eb3d4b9b418b3a0f5a9313e4ac1a76a8fab223794eb9a2b2b26293bf234575ab028f82005fb9af3b7b3ccee90e68afa1805a3a3d61c3db3adb9b2a21af810059f34cb55a1ee756edb829212955f29297957f98f50f0594aa1b47442cb5a108fbf8e5e56de64a9a9fc0a1a50f0b7e6fa4979dbd7979fe074a3dca4a97a4f70b6b9a6f9772ed7da094e9e797be72c7bd29288136c5add51e596be09467b0679f77dbc6e59293d4f777151080edcc7ee902eab96b494396fe05f6e4947a5ed94d6ae7103ff2d3c93cb5aebfe0edbc097788e9f474847d8c0caacaa43d4e84f32ca8cac8171a5dea30eada994fc8ca8814da1ab6fdb4aefeadc481a38b5a3a6b35c772c5d8ea0813317caa38b59ad4ee58f9c81177b73410ba9471c3103ab52bdac5ed0d64819185d2943a86d5973dae4f260840c9ceaf2b5d5a055be6db23a063e9e5497e5f84aa11b1303ab5edb8a1ca1944e42280c6cbfda4eaefa2b2eaad28181376d975d76965b9bcebec027a566c2858e5199fe47bcc0bd243747d92a44a5cc47bac0698d2a838a6614cd4a2e70a6ea848929d362d051b7c04ad15195ccb252b61f8446b4c067cb99eb64ceb959ca029fcd4597b5de78be5773308205bed5b9ced3265ba9d247aec0694e9be4deab46acc09799da1cd3659d370847aac098d4ba596cf96529b713c20815d82cb949780b3228fff60c235360f5dd6bfc2c8bd97b700d4eb5329944bf7d7f909e388c48817597773fa3b62866a384361205fe858c77324d6d26991128f0e79af35b78697bd08c3c819746cabb7bd9ddc25cca187102bf2fd5dd88f2e077bb19234de05e5ed7eba693e917cd0813b8d57a5f6a3c741693ba32b204be6559e7a08536d759fa72c068185102e7a6dab2a85cfe17549bcae88741f29124309ecb33b7679d4c99c63be5064ac10812f8729d3bbdcba59ae3a6c30c933252526ea8adc006186b23476093270f5acbe7ff19422346605433dbaa9623376bfd4811d8ce2eba983355b4410609d27814e81821022f5a34a993a83a043e6b1b73f5927ad762a9831121f0f1e3d8b8e0ea5acb2f41e0bf655a5332c776ccc7f1e98c1120b0ee5188a88a964495d60c236af01f75eecfcfdc9fb516915eb0fad495a98c72d44e080d115eb05a996795ad6ed50795d176c1bd963b95bee4ad88e882d3606ebb2e3b4b9fe59c0000412417ec676d41a933d79a85d44932e5262b6d6c0504211081ffd23a5a90c6a3c00722b860a4678c5b5ad6ee4ad722b760a3de1cfd75707d1de6493251498984882df8da6dc1b73eb83aa1b42609915a30263f74b9ec2e84c7d288d0825b2fd7b552b72c3dc64e92cd82d7ee597273bb0ea1b37ce53d25c759424416acd0598ea26b5f291b993146091e45850c4088c482f1e8b2958b3afd74765a1081052fc3e5cf9d2685105ebe82174adee95c2332aa96ba829372b51c63adecdd16b682512665fdbfc6ecea7e56b099ff9d35fc55bcb555b0bb2973525a965c4f7eaa60f466e936678a0e0d2ea9e04e7ad041a84a4ad2f820820afe3ebaa8750b5f4ffa5370a675c6d014d114bc34a569d5be5bd2fc2a05a356b8bde44a470a56fdcb63a23a9fb770146cee68ca3ceecb56261205afb5a6636a35fb1ccd50b02ed3293bf9c14ec81528b8f756ca0513e159ff27f2093eae6b144fa7338ae878827ba9d56e92418b4a7527f818659674efaab99d8813ac72e91e6f65b809b646bbe89a522b71595644139c96ee1d95d4b255869b648451525252b20202914cb019b4e39a965c30c1ed885ca56551b8fdc8d68e17229760958b6efa64eee8dba513818825389783dc7349cb5909991983482538f55a96b5d272bbd64619084428c148ff0ee5ae99776c04e35154c83078024082c824f898e528fda58f6a65266507da7b8a18474524c14b23f7e556f7a9228322c1291531edd6abe5ee28020956e64da349a6896c45cd2358d91a6346db7cf7a24e8e33525820e208466e4c2fe779f76d944943a411ac470d95a9a56c9941cba1408411dcc9e8e931baa435e58bd98a2c8277d329d47bd9a80ffd249989e7e81b7da8868822d8ceccf2c89825995e4433249208366feb4ba1e7df651a292a3b56de1322582d8469599fc8ce41a827c9cca02072085e68fe671da3de2ca3d639113104fbab74a6d7a75eb215d1405985e06f7532ed9e5284606fb32c28293be67d29640e182360810d48880c82552665bf14b105c14bf245a163521409041f5ffb67bd19771140b05a2c2ffdb965565ad4aaa4989c1288fc8197838e5ade9223836eaf66fc8e34427043c40fac8d16858c99b3c47d24d20756456aa9ddbda1398bc010e1036faea7eab5e8e9525b640f6c7ef9353766d9dfeee780881e785f1dd3bfeade60b27b9563649cd12cb03ba355c210c9039bdc6b5fd4f82d5a68272b5d028403113cf019736ba5a5b44dadd228ae41e40eac0829437f4c4ae8b4c21b2926c90ebc2c7db7ef55646af6769881e3062275e0464bb6db2ed49dc8f324d9e210a1032fb7efa930ad2aec95a3554c6c0e8c10cad54dca17d3537923109103e3a173fad00ea165d7e5382325310e7c77478d71f74fcbd38271b2d225d0d3d1384e2002074e3fa4f294da5779cb02069137b0ee1fa3268f1a34c44531b13144dcc0be6e5954e749ab887a120c9136f09da55f6be9f3780a9b0d6c94b72fbbdec870cdaf81f30cd36542a4349d5303aff531bbef979605ffa48197dffe45cba774489784065e7834cfeda3be94e8cfc0af867892723d3fabdb64cdc0794af5ddc97d936b4d186b9e2052065e16fdb9651fed7b51c9980819b82dd5265f54ca45d182e9296298639131705a481995f0cefa950c5225220656efe3e9966a1d94dcc238b624100903efa2dea5532f26b5241130f0a290aa65d331ca2c63e6e4e045b0fc0becde8c1cbc9b2caf835581c81738d952fdb9dc207aa5d40bbcbbdc4c6ff20557f5d20576b4eacb41b56ca225e3027fbe22858dfc34eaa2c816f82cb3a8abf43c5b8592d1021b45a7461da931559e59e0c5e4df8beb1c529f100b8cba1a3f2d2e2d720576bb5d16d4c6139a65cb0aaca7667539ba73d3738fa24246182255e0a4f9b7cc0f1e15d8d6a8c5248316d35b0a9da4a4bf03e5884c814fdafe258da55a3a3d8aca0e9301913578a5a369d469f48d5929703a68a98578d778ae1d05de4c6b317e8e21b424f42250e08374517b7d546b883c815b5b21f65aceac31a7292b39521633742b860c4c4e20e2047e5dde154247cb72e9a709bc5cd283feac56b5bc322630f649d53668b804be5c68d1e57e54abaa5102ebaf4ac9e0b2ecb29655912470a31eb4b4cfa5f7462582043e065ff58d2245b534123902afe59b256f71f42246e065ad37d536c7a839f422f082aaf08fbaaf3963274204ce83283fad9d615ad04486c08bf1d3bb74dadf7fb588107871fd35b78d5edf7d6d201204467ac62c2b0fcf104480c07b34cff4e8deba6447041135389932edcdb6d387bc437ac1c70fc2f5c8d287f082d741672d9aa7dc927a2442c82e7893aa5c14fe1e436774c1773673f19c21b45befcf0523947996859e0897366a84e082113ab6ec7bb7d5a2105ab9059f75ddc8af935a767b05e5c6ef4039b1059fb38ad232d7590bceeb57af87d2795d1665468a89f7abd082b16ff972bcd3a2b4201e84cc8231a574ce2854713b59703f2ea59716a6fd2eca19272416ac965dda6f6e397366677c8e378405b71a8390dd22ec4cf6afe03bbed6cd5a0ca693d67105af32a71731912942bd92b582776d6a84cb372e6a51a12784b082cfe972b99cc5356fe1626e158c48e57aea5969d1f347159cacdb2c5ccb7d2ab891d9b1655b7b312f054d0841052fea63942f7e927a3216720a46482dfef62684bee43921c414ac9626b4ac6932e94625c5d89582f7e449bbda92d2852691828dae3a77db8bd672892769474a8a0a164246c14b9ee926a47e8bf56dae183230b91051f05a145accb275ebedee6f2e65e530c18211120a5e36a1ed058fea73091b149c9e4cd7a853e7e859ec137c7796f00ebab476f4049b3beb106f9d99caed04ef25c75edae82783aa39c19e6a998bfe1ba366dd2638a9c24e666126846a4b13ac967332d192a995a6d7410a8e5731c943b6038d471984648211c2b3fa1cd5ee5b68414cf0636ba6d6a3468dc113720976a4b892daffb4d096156209fe657e47195b7d922cc719ad63c5ac12ace6a445f3a8934691a79364376ea09441093e68063d1c4226c1a95a8d6a5f377596ddbb25844882fd20e52bada7e3328a569ba099b13d844482510d3ee251bda81d5b35844082ff987529e5a6f165e4408fe06469174d57f906d33a8ee095703f17b0cbc05906f0cc4d60b91a647f6a81094460d9b162864a01029086ca00480056547e31c353547424a0032b283a1a2400670040003270463c0080951555420001f48ef6920204a077b4a7a8941c00000368400254be8ca577ac98988c0020000a38800e1c5b6083f060fb5a1c757ab34e92e9c0b168815be1e9f9375b1e9362160ef00516f88cb6f1f35f8e9ea4128ec791d017574843c762056e94cbbaf7d4b8669f27c9d2d0b1e0781c08c7e3c82faa80283b3c0507151065870e50dc0c1393047c31053ef8fec7ef189e243d33e30cc7ab98e800c54d7c791d2b6b3b72a0e04a0e941d3750be58034d10f08514106587cac9ca0d1393047c110544d971e364a54d4c12f0051476fc0a8ec761802f9ec0669ede5e6d5aa8fefb0b27f02f5b16bfd7558baeea5dd19162628c035f348117e48b791f954be1a6d5c19f1b8d822325471a375254f03f02bd95117cc104ee733a99f4e60ba55cbf04ee339b4c3a474c6707298153bb6974fc2c8bdde14a0227b4996dd64d6a842abf40022f7314fa9386fc929dffe2089c52a995dd98d01746e07452952ee67621b5ee22f01df7848b3a7ad2b1435f1021a94abe204b8e76bacec9fe6208acb7e898dab5caa0a215022b7cd5aa3719b390990a029f2ee966b97c73f63c0202f7a2fcf3cbede6bfae2fd4605bfb57b6bc318a5052bde08532a1b2b4ec4ae76be1052f5a4b6ad7ab233b47bbe03e74daeb8eaa3ba95d17bc0e7eba330ab5a656940b76b4e8a6652f8b3a2a71c1be98ca252935c9979fbe05db2e7e7ce9fc6cf34d5b70eaa35797c6fb975d550bced568cd204bf6ad56d202a95909affafab957b4ceda3c8b6416ec7f7e905906dd2cfa2291052bd7c55cc7a094f6af28166c49ed5c8f755a7aa13c49564693010bd65ec811dd42a98fa393bc826ff9b316cdb2eb8cc4157cf41757ffebf0d25989a415eceb1232e596e8bcaf3409125630da32e9a4346bedf1b555b0295b9b8f1ef92fb78e2a78b3cdd23f75cca95af09c5470dfb9d34bd9edb7793f24a860f4efe7ef2cb34ec10995652f0719cb955c99821765e999bd9d667459a5e07b547bbf8eda5222450a4626fd1b5cc385eee8a3e0056d49c8dfd244c1485b9deb4dc64c9fdf50f0492bcddd7a9e6571a5a0e075ea9750a7356a49d127782dd5ee51bbc6e8ad95238d154fa4ee75b3d00e529d60d347914a6f6798e96c0a249ce0bcdb34c64dbdad8d2228906c82f10e1542eb4adb8ca2144834c1994ce97a9fd3cb942e138c7e761937a3fee02e6282cfa384ee952b3b5bbbc881e4128cf616b5aad34d9d5c95c412ec8b7f7fb2b464ea5e84580946b9acb3fc3e1725f8a4dea6646649c449b031890e77417b889260a5cbb156be89aa760d31128c162e4b1f5f9992f51d2224f8ec3268377d2af5eadc23f8d55a4797453bd362143a826fedbf25bf3bc446f05e3287bddbcba459102223f87ab973163c467ba5eb28902c8297429d543accf45fa314c14a2dd929d78fa6fd454912c127eda1db3a6bd2fabd6302092238e9b229dd4278f61fad2e901c82ff1aa1e5acdb62ab54278921d8205447371dcf2ed42f042fb8f298daca734742085ef75bbdd4eda8e19d154806c1b6fc183c4bfa4f09db90088215ba93dea4dd2509042f9a36cad190f93184f7031240b0771e42e69c5d66162a2048fec0c6a0c27567cef6fb6b22f103afdaf5db673a53ef5bd720e903235b536d9a67befc9a840f8cafbd5077d16d9ea7044193ec815d91295f14e12dfa2e891e18994ca44e9d41454ba63cb05268f9c54f13f235fe78e075d9bad8e2f96e643c478aca32496290dc81fde4b2e538a645edc0b8d07773f30d5ad6fa5407c6440ba62eebd5aecf111d38fdff514d789773e0337b5489b071d9a4eac881d5b2f075176a435598481207b6348bd1d3d607e1c0bb641f42bfa7eb175a6fe0e576cf5a48b575ef326e604b698ba1a5ccf592c81c1a90b4818f99c6d427992b546a900d8cf6aacc50f92ed76b0ed7c027d5318b50ded156fe246a6035737671947e19ff83276989409206f6bd379dc67639e8f8224103634294beecf27850a2223903a3c26b84c6cc3a86694f92ada0a451018919d81bf3d74d327d2865e6202903e7be1b3c9e4ca3a32e123230ee5198a7b9cb423206b6ce5c68d6b9eb65374f0c6cccbb41b998a1a133e748c2c0676f9b6db6d1e5e289040cdcbbf0d61aa3f4cfe199e0b840f2054637e7eebb7669e93d3c122ff01b33ea156a5a27c94c50182008c118619000254917389945e92fbdb36b2c9d840bbc989ab5bfe620922df041988efca095da6cfb8c14304a4ace48515121d102ab51b53017a3970965936481117ab3a8c5f4312458603c543b97d42eb63a13c91518d7ddd9b43617345c5e870e33acc0badeeca4856d8eba9dca9f9172e3d44052057eb3d7cfbcfb75e8f246935081974747f52e0b19a23bc6039229b03742eddcb4697974bf063f2ed9feade78ff682d806122930a65bf014aa2d48f1a889ed80240afc66d09e95549964ea8a040a9c96a3f5b620c75df0903c814d420a59673bdea9c556489cc0c85aa134cc43e714cf49b2004913588f2d32aed4b2283db99030818f194c89aabd0c5ea7dcc0c4244b60fded6d55a615427698021225f0f7b974abbfa71432ea184912d86477af65e5aa69ff41290309bca83fad3a15a27e63b772043e46a5f5e8332132b433029bdabcdd93672c256a17901481132d0a29da2e75c99813031222f0a984729da3b75afe9621b0b12597a3e868aeff1f1221f0fa84b02d35adb49dac062441e0755d939ed424bb17900081d5275d99cbff252383440db6fb75ffc6d36ab47c5ae905a3ad95ddaad2eca27479c18b51ae69d3a268179c8eebfaca452d6d165a5d70db6d9fb4ea970b763d876652516a5298b8e065fe8e8a7790fe2b8fdc82935a33d58b35da82131199fd835acd0523b5e05de71c65ecef17b26e5a30deeb234c53ed7dd642c62cb8cd27f74ce3b8a0c5f41823b2e064cc49df471d548bf993241889856596c08233ad2e5467fde9362bad2c137425187905abb524854a5d7fc415dc86d4752eebacd19516b58213a5df65d9e5a35f23ace0b4a5cb276ea79fc57215ba185dd0bec2a5aae07b579454dacc5ef79b4652c1fbef772add4dd39e194105ab577688faacb55eb9f78a2f9f3f183905dfef39964bd35a363ba1f125282941e34f464cc1462db7dc39a6d6482d5263a414dc69f318d328ed5e72c31152f03aa6af10fe7214baa54f52c9c828180ffabebaf9b39c5c296fa2926223a26043bd750ee6ff493234fe44652414ece7285b699d5b32295a188c808215edf5afa596394bd12758f9a2502e86929983fd239ee0b58f76414bdf419a52473ac1dde773dd99e5e818db114eb0ebe1f945a5fd7f32cf91b27282914d30a2b4a60ddd11917d8f6882f5a842947816752651a69309c625d3ba5dd00462902185114cb0264bd7adb96af6a419b9049fa5ce5f72e59a48d91ab104a74be8d041ff4b2ef33e49962ac1f7ad50a2df958e9e2d4ab01ff7b5362f175bea5b979149706a946b0da15cd4bfae931dad829292931d3d22093e7892657f72b5fe1b8d4482f36e41a5acbf53a64d941c287db28c4082bdefb4e75ffb516552498e9147f0b2a0cbfec5b55e5941d991a371681a3b76bc8a0e64461a2a28860c4c3e30e20846aa70a13a4a6fa4119c549fdf3fb75c55a52c29413c8c30828d326b31e4bf2cd7d4ef16c109b9397fa7085e752cd5b6223aa9d677896063eedbfff451cb98308c20820f7d2b5d16c43c57662119460ec1e91799e5ceea5fe38d8886e05d4ea5f96d755e2de48885e05c7394a105d5e6b27b8884e0fd74e84e2f6bfdb2387a616410bc365f0dd32cc70c79436144107c26fff72cb310caf4371208b6b3a59694abd5a2df86531801041b42b7963f668df10577e40fbca7d3db29aadf45ab47fcc0aa8fbaf45ed44288129ed3073e4611f9a33dc33ba4f8c0665e2d4d5c9432c76d218eec8111a64cca3dfd42374bf5c0492dc9efdc74afd5c7f3c0ca60df39fd359acc4a786063084f9db5e4e9c56cde812d6d2b75b79cdb813f112137ead4a02dd73a70da3fcb945916d3e62374e0366be7eeeed7502ace8135d9d165e72c4af95267440e6c7cb9fdde5a6b8cc4218e10a8045186f250200e0643a1400c03001c56bb06017312080020281a8d8663129154d5a61f1400045140264444302a2e20160b47448140300c85028140201088612886a2180a03819247dd06822fbe2a97396a9c6bf8c1d11b10e16002ce853ecca01d6381a6e8876cad9a2eeffbef0ca2e99f1fc7251b01f460d17388c012a41a72aa4146f87e7aca97fedbdefaeb9bb718b467e1a77f7ca6583fffc1405ed1072c7704341bfaa92dbb53bcb51a882d4f7e9fd7dc37bf4851e3a10b15d75115e50ac94700215aec70c2b7b5a2724dfb1459e96999ca1599975743953d67b448f150f53fb533665307cd019cf50d728603eaab9e973e4c1ec7f436faf22a4f965ebdac69e8a29500beb7634b6a79d5d369b38bb9b6d463aee4660eac5a022ef04951cc643257e90b6ca3ce891ee396c0c52508d5bc366d1ac2ebe791aa5e8e5c1490a550e634a54275eec6005224a6e7be6ee02d35701990aca5c2279f44d57829f3c9f577313c98824aafa26b8e38d8cbe24823ba454f7d497129f0ea243b644280a9467263c17c1b23a80388e13dc7ed89ba335b603fb06c1e5ef025cfd1fb835b402681af00229ac36725137aafaba52725ed0f6a24f8fce129f20243d54884fa05eae592de32041ceae1870a204ec2eed8c6ee008383245a2690e2ea0bed4c43c8c811c3ac33ce437fab5bf19dc830b9ee8553ab4106a70fb5e6d4795ca52f8c8177d721a27559010995b1e864e0533c2df8f503df98232199bc7184d9f83c903c5d9d39180c0b38bcbad091a753a58f0964d2eb8736baf0552f3dfbfc209c285fbeb86736a0bd404b84dc04ffb3c90ff46ef51a1dc973d0be99e2842c536931f7936cab22dfec35acf19df7a1b2a1860680951bba87eb59b8d4f11d2e3dbc85c8e9a6121afb41daddd6997210ced801fe95b177f6e123531227b5b6f7de414f7a57ee089aa5f59af64053c1a85031d04b46c6e1f3a8f1713550b2e686cbabc563af23835820d68aaa2cee1e70574336d902d83446382a7e9abe213e0ae6f784764745cb7236eadac167520d7f14cdb99e79918a50f6454e82fd1c29e125c23589b6d298297327c180db9016bc4569843a9237f94526801c27ee280ab1387d724c48811e36dd56dac5d24f6385fb114687c065cc36168c89ce6008e2ea38318aa04774c411c0d72d6346c0e39151b67e02ffc3dc8c56a254eb6849fe8aadb62b3fb322090623f1bd141f56f001855f94ad424b5dc917c66049b174c993af70ba2e506176917d01a1e94ec0e7d086b8addf426650b8f504e7885d538183d40a5de29153b843b512711ecdc34e4b8aa080e9b89a1b5a8faac4e3b82d2566955e800a7547a1f74b6f63d6fa715c21c4a914710c3a56eed6468061b0884777785938396cf6427cdbcc9221a2ae652edb07faa54678b95959fa54ce55b065e420a656b171dd8bb4bf65ab4ce1fef7fca80fc75d749d9357e117eeac03ff58a741e98e0460f895b82edf1aa089fd57854f5dc4b055d9c155a07bee0f3962e654a55f023a834a6ca54ee47c2f828cb21d7727bd2a3cfba0f5f0d29509b8369b0ce3162cb02a1c6ba168d39346d5b6419b6dd11ebfa20a51b13121de56202ace6aa2a1696681222a1339494ee37f532982796ef26e91d23e0fd0c73c1a1a2040a2c3ecfa2dc2069fc9a778d999b2d4be69a8f640508197cd662de5c84e9811c6774c7c04157dcedde866cdea760dcf499a38eaf282c0ee918e51050c37c5761f58aaf8173eb090940c3571e840131613172e64da669ead18915cd0817763aa6a3e35d4c8733e44d8b6702252282ba056e0a2de6859dcf78b183c92d3e68dd3e2b01d87f9824fc869a780649f60bda5b5fa7bababa49a4f456763edf5d261bdaefd24b0c680d1abae3437ad3c0552f8afadd3e55b108904bbeb5f20a8503cce435c341b963173d10d9801d1c6f7658ef783030d8e5045af6474f1cd0de3ecbf402f79ffdf65d6257f8543f2c0f770d50169d7cfba011ca6c210ada2556e4cfdbc06611a25207a52264841184e5b1169813c1d990508406f0dacd69c978609d3f9c661f9506e16da1877a82078162321735b2666c9cbad5aa4c3df95ca36ca3ab5e6f2f54e8eecede2c8279f721cb6c9e734e0a528e85f28a6c73b67372fa5e165f0278e5cd0719d01c3eee0d72d324e21220529043068d82df0944c9ca71a86dfa33c05fcfc7c98a4606883fb94aaa0d7489430df56a35d04a9c5779beee50d73648f288a5a92190b5403a30a950c274f87634d7e44f23bf26db352d8dbaef085450b95482ca0623096b9c048990e8e27084a1310e9b6dcbfebe8bea95d1b4c7978db772cc2d5e3989e08f9bee61bbad126c48e8de11f068f1b4ddd3a0f8224e4294f073f387d24f65eaa305ad820a2021153979f2fcfbc5c2f60b0115e380e12443c9443549516dbea27f812edde32ce5336cada26e2f07e6014c25366179d33f4fa26f666c58539d3a1c39f8174aa84359ab00deb85031b0730591d96a28a35f73d775bbc85c5402f7952817bb6f33541f58d438777c6448bdb889a1e6e5c28c1459c4256d47f7ef9e5ffaa87a1bf2323375a5af6d3219d498f9fb13a1da1ea0ce5ea5d4b78cc9a34c89f98c1bcaf73d76ef6c4e672d06e60877ce7d0b888909e0ed258e3a24bc8a87e3e0f5fcd8cd685b371ddfaa59d63aff17a8b043ab35b380921ed2e05bc25b2bb45667d72e658a4138ab5e70c5018c4080ebe9cbe6e19a71bacb6ed7194f72fc5b04f28a39ed969b8335840f5085c0dc72895f461720c73e99e1a56b3f199ba58e1704d87602997853ad0b4d1722ea3f0f0be45790dd69eefd150a7ad8982e789566f9ce09144d5f0daff2bbe306eb5630a9ee9666c50bbdb0255bd820a2ed7b820099a5ce938510db629786dc0ed7a1428a5b01fbaf3ad2f4834fcd9d963c3de46e7ae10d57baee2a341a94c5ad926cee9a65a52daae14998136d8db8c2151c088035e27031091d96d7ff38143dba946041096f07b4f21a22c978f92c9eb4e4b84a7247d32eb5f5da0d10e94d1d28157e58d007a3b1a10992251a8020f82c9e6e0b480b805613d0c675bb8a621efa602e8952dfcf4315e8c53e917d1e8d73854c69e2725ce2ef660636ddec04f76c22da5b110423b6f3e00b7f8220dd8d135afa693d7a27bdd0a12c62b75d90b0576e78c048bd9d8829679a18faa227671bfd00d084a7b45a304000dd4260d96cbfe5702e825963eaa74deca740478d4ca7be7f6bb512fdc79811eafa3f4d2d71d9e3c4a4ab86634baeed275545d2eccf590053460b2e88580f423998acb2cfd1c45855b33a7038e18d3ea789a6bf1ed3af83dbbd4a757b89744c1f0419b1419e40a3a147a2e662c16658b44fe0cb4849c38342d3b14103cecf3b24b70b046ae8fa19c2af802a67fa2f34c5e81f3739ece14847018d2501b56b7ab9d4ade7ba251b7a0e9c4c267e346b8c8df93e99b0d7cde6ea61b4e630e9afeaf6ba396327251150dfaf98d7b3a1d7578c87bc4587f8d2bfca698f0a35cec03fd79abf9151e30bd8a7846294696c3839df449262690c1c7d0bf6a117b47b8320efa3b2aaa2483a37770aeb09d1e35f0e1ef70d26f428700528fabfd2ea0546307ea9adf5b28fb2489796f4486dcb4ae86ee7438f3f9c3fff683e6c660a56f90db97c799453677f9df9753ccd9ab1de69b9e76149b71b44eb8bc822dd634e6185b53f96b4a12c78253bd0247a45de39d74439e0c441329a6610eabc514dd9f4743e962c9b4781363e9bc7f13504cf600b1437c7edc31dceec2891cd286af49e31e65ed7e25e8bc5316a742fe16383aa71243c6111b144aa5ef0a963c2ecaa122623c3d921f513c570db2b47f9fb5679ca7cbc1e1abc3eb59d9eed6dd00a5bb3f05b0afa2c9409f08c5b8bc35629c5e2eec0693367034ad178f6001aa0b92d0002ac30c955ad45ca54da94f3d94a75024fa8b3fd0b8e0eaa458aacc06cdcacde70c90cc7bc2c779b17b61437237aa20f0620d0057846a9eb41a76f737f082515fc2aa5ba80c510ecefa4f3ebcaac32bf73a47b33d7352df0fc39cc477b8f2c9964d7267114aae1a68b2273d892f9c7f3d2487ea8b6d481e0c6894b8d1c70c858d6281f18330f2cc7b5d855986b9f75a5e6012c1f9f32b7ddce5b019a0420450606d71fcdfa6c6283d365919e3b46d1880cd9d4ccd5484e251933726c95e8c105aea2d2703a1ac4b0f42e8243c0b7e7eaedada5d95a6e6401efb895c5e6aa3238e4806ad3a4b95064795e670433c4c1a31feee4a8f8cdcfe8c59a1da97e07f353895fb8a723edced184f0d52a815839bda91476314f452cf8b3196fd5ced5012c7aa972d1a542b72b8a940a0c52db5871a7b87184fe0c9d143515041648a1355cd10d5a68becd2d0ae2594cad646fe6a8a248a98b71237e7678c2849c459f9e5236313a820f791e0b68fe7bbf2a5b2a16c9e54201fd416c9128d7c142337dcd69025597d306a436eead88e241cd405eb2ea8205b7b6db53b9d39e562db6cecbccf21fbaf30cc56f9c4e0fd1331d2a15df53766c16c9d44574e68abc16157b81a1460f4fac8fb0b2d51e294565feb05eec9e2e80f467976a6eea7c1296c9d4d00ee3daa7f1fca7470112fed2ab5ff4e53a6e906d9b5e006695f48d12b7f39be071f681f2d2cdfb84606982eeb9c4d95851865fc8451bc2178a21896c632b1c6bf634f9e837981a210ae68d0618456789a90827140683ed1ec812c44cc3fd1b7d5f22f706f7bf1f29c9a43f857f37aab694524954b6fe2802490083c4b7a5fe4375d9b11236fa7b6240a858f3e0a9e39441282bcd8d20ff050f13b1f5616c29da5eec87474c873a0c2d0dcc7690a829cc333c08cb8f58ad46a2d1add1800996cc0dc8a9baab023fbd7e61fe72c47865c8621ff011ab40429fac01cb7697c7a10fbc43401d9605c27c7e5ffa7ac0506b12368573708a069788e5861856ddf9f0ec2003309c1e978ffb0951bd3266372c02ee26a23dd7258331f6e2058eac96945391a30ea1f05914d0177b66be1ef54873b4320b42703fd8c1d568d68e6a985a5151e524dc40961e3ca851a308a170d3700cfc144497b998f00a1a0a8c76715c8ab2678b7dd43bb8dc03f02977bf1626b8628d309b3196232ad2560d12be5ce9fc38dbe7a39ff4ea7415ef441f88ac0a93f15b143cb7ad168dbe45d5d02d38f2e8e3297294a0094041c0c39cd7b1396d27522c12868949f7505ee5d983a62b7e49da6a8506a037b9f748b2bd8d816f68d8d397001a5977dcfbd5dd643f09635619430d7ee23346c82d8292a91518a6fda9e8e6b0793272e47481606834df3459dc36c7782688b9b07594c93f1ca8edd1549ec2b4fb2e05282550b25d1c31f72e6fb9188a04831a1f6d163ba94e4a623457185539792a08a1852e103139308b0ab1bc1ea98abb232e9add912dba517853393f14580764559a3df53b4846392f5ee0c045d65c8563b7ff52729865e810346a01d29008b85befab2d37e9b687407b2a8e9ffe217851227109bfb9a295d1e80970633cab115f8a56839c9eab5915b42d5bafa60c26d1b26a23be0b568d6b61e0b74a7f2db8c009dfd1c8c89f3073bf54bdd3548de220eb987b349d79a48e4f25d2bc339430cd4337a6347ffcfc14db3b36658db33554c53acb1a5ce504d28f4e744881d3b09221f9ce95d429a2c41e6ade05ed148d220b4b7a6f9c90149983d03a8d4e5f6367ec885645611216c2b056858afccccb32d1cc548b334a07586a4d2d4bb19f618b85359906ee37223e266ba3719ac9db73cb6b43157d83fa1cc232583ddd099a4f58284368683bccbad16290d9739b409f8b1c4e6673d81d7ac982890be66bef502c33c2a518b69b5962fc9346cc5c310a91d89318556f589032dc4577627a99b657119ce861e6a3577ee0ef138f8afd8ea2a596b6d75b9d35177fe311500b1865b1381dc6719ddaaa880cd22d143319164f5462623511712adb678e1b7aca19add91b4c53502ff3a51d2e48f92c2d3e8a07c0361c11215015fe597e54358515d0412b44e771ec6f933805a9e68ccd7e30eca53edecfa1a3c258cdabddc5c71a415c6e322285ba110051cd151bd49fac422f31ea120922696b5c4d29470069336ea81e4a0e47a19f1232169b73aa6ec25dec51f01985f1dbaf05af8bbacbb36a969e18f3e893fd849b119aa32e9017293ff7138d63f69ff8a8016024aeab1fbb41d8798ecb7762825ee08a1f3294de953d938206f17538cc0cc5f795b1ae7e2bdd1f85edd3e2115eb1c1fa784412f8c05147878333a5e664ae4badc9cc368406fccee9dab103b29d15139a50553fd1cb5a258fd197cafc86b7ee9caf79010b7842beab995b3938970927710412876569dbfb8edca0713ac18f492c6637acbbe3b1df72cdd9b70dc28e1bd8d6a3fc3db249212c4a9966be5cff90d6f3fb3eed9ec25267c5e32a0dcc3b722a50d272f7ba0ad31e41991dab02e0704de819b9fe96ce2172fe706dbeb781229ae3693d45e51774575166b0ff1463cbbb69c982656d84954178bfe9212041d5cd869c927e42ba336eaab331df1ec75d0e3703ab6d351d69542d8f7c101ea7a088c171fbd680444337b6a807bffd82629fab0001a6df3ba5f7443df6a30374d68f7e2a248298522f89ad6f627474a041a13f858119fd526eeaf358031f9925d1a095e83c1775b7e961108baaccf09463213132e64aa4b7495ce6b75278e72971dbb8790e06ace907ed15782409bd852874bb33901d9e6e9f2db801abe431244375e55f0dbdfd8c5abf9e878c2b8f9304a435302f7857c51420164f420010ad6c6608b52358869d5d41dcb167fd343805e1379f5734128c943bca2ac4a8992900d809ff42c663b4ae95f68dc0fd4f7d9600d082be668597253968dd2943fa163612881e0dcea30c7610273f3c14f0431ac2eaf185bcc7815db25f03c64a894099e2495e7e6cb1e9acf0ba44f5c7c6ca3f2c4632a58911c760a6403afadd5c8ec40982f54010940e1ee70be8a6fb68af7d8d37c61b2e18bcca5b99de944077780fdbe330d82b9bbfbe0e72bfbb267ecbc9ad03f9de34639dc4ad60eee09c17182a1ba31b2a3c3a5f1c390cafdab471c01deca30838a457495366f924e05c01ddc9fa26882879e37e6a46e87e18ca506632ec18e6c12ce6b44f8b7a94b51ed2cace0c11854589cca0159e8c64b1da2cfa03b06585828f8eeccaf5cb7693553ac0738d6cfde3ac3e300571d17373fb8f1bd35033f040f3cb59e99f00d4afcfeec4fac63c92145a21aa8daf44ae7cc9f17269524acc94e396bef2573f3823f8c1a6f0aaa7372e136d0c36235b50b279b5b23a538648542ceaca3203e34426f343766a1068cb93add97657e51348fcd78802ecf94afbf4ea5c951d82a8d735e35ed73e7aaa94a084041582833e5e3b6360d9db031b0ac4d7616e449699bb52d6be46d0bac3073c3f789fb91cd327a2834bcb9c153952a6774afcbbb7ea964a0e03f5e9a5ee4672570f432c2463f1ef220fca58ce7a66208e24cee2939398e2421cfdf0e5648a5d6a8994e628ba8b3fce26423824828dcfcd28f1ce1c5b8f2512d955d9a5ec815ef46776836159b33d652cb30fbcd3092c904d0654227a5c997273454a770dea69832233b2313f39946026acdae8cb9e25ed685219c6683cfa2c1c765ae54984ab832bc5185e861fbdcb3e97aa0566fc44fde60ca1c61622ee361644796706a61c88492a7cdac8a71804963f5724d41e5f30f444aad092eaf95566cb471d5d9504ff88961684573ae863137ac5e12bceb2ccfb7d1bf0552c2188fcd1ef02ad749ce5617e48d270660921e4f15a54209b3958d11260129c25d31d5420a3df3e4227d5261fd553ab8f36c82e16aec4e4148ce47c6bb3531533f9e5d9d06b31a408ced402efcf95cd08ab8553130bd59085ad192f381c9d0a14cb90e2a16bcce95ab5437d488fdd84d8533997cbbc38d7ac7c86271685c2e0aaca4945c7055800223bc6b047d61ea0aa3d02d367d552de22028a01f058d2458fc64c843c5a747111c89725cee6a97d18d72a15924d92e90ea381056df82d4341359ceed5b10701a23e293aa460a528f11dd2a37b671994a9fbe1552466d18ccdeeccacb129fed2dd85a26a3ec0117744a68cce91b251c453f5a87115795d74878dfcbc0b3a858f170c72215bb25b82122b03491616f225171ec283e22b95820bc10b0a180a14c2c4da008072f598fea80c3ff174e7f3ee51410119c91ca464184458c499e1382a9e95ba826092147d95ce7e9d27a0d3267368e43bfdbe300db2ec50c27d4171ad393370065ed3d372740e6f383f0b1c94719f538e337746b30d179f1da65583c4b1d133552ae4985731f0ef05fd2e280a70f9714d8055805b61a43d56b29feba04f3997ee2338b0fde98340945c4e5d0c43d7dba301a43dd93226a8fd55e577216efbbdb174c2ebd968ae70453506920fa558c3cd492c0ff8860cf8e7a7b8e67bb078368b11142561a47186d7dea84fe249b21d67d27c61d5c5024c4e2b515f6585b3d33642be52ff2c509bb02c4dd713000d98d2062938813b8309b4e2f135ef6dcad8705eecccd14ba19a983e0e122d971bbf536e86b3d79756e0b82c7dbc7e72f84130d773983a7ebbc91e12022bc1a1c24e248dead54d40ee05662a5821a28975aa8fc80b518eae74b0bae62bdc9c4955279116adb769d680be30a85dd45c6f128c452397827240af1fe6922eb8106db8b9e62df083d75cdeddb3c1ec88a51b60b270959448b39353af3972ba094bb7ae3c91a22a4698ca86cc27e4141f955a0f5647e4c02a12440222af34803bb11dd7028b4af78ec03fc6488090c21877a8f39b395863983c47c0edb0423f7aba508f981e95ecda6715f3995a6fd09751ada4eccc73914201bd15468a25f8700183a2fc23a5e60891af7f578c61dcb03442cafe416b880c77bb4ae2f934705a78923aa08f388d8293d3e3d56066457cd166cd82ef4713808e28d63c0499e515954d6e359344a53898db882e7c76252a906e2231c27d5136d8c7e409171b5fc963a44c90434f2a90a8a928fcb8c8f2ccc99906dc7e1f81bedba321201c53b340adb81732e559b39686734b8f99f94a82bc2c9a4aadf7cd5121204359b4b58de2aa87068cc7724e53b7a2680ebe16b99aa00d09e4903c1c45af0f8bb149a85914709d07defb2f2ceafab015d9a2b61282d70447da4930ef3a88d92cc9b546a296f35fc04d6f416ae46812ced1e5ba8baabb3e347a791cfa5211bf4134133eae70a3583b200e31bca875ab978c4bf724671432120ac8b233b07b2440b7b2fc74cd922e81982a5584713978827064cce2e26626396a6207218480e6eefc68d30f721b8f900685bab9f04405808a1df22e1c03b04d11e40ec4707718516076029f1d774b2e84c435bd219538de68ef8882821123f7aa5277c18c0783cb2be1c1c1351b23cd707123ad0d23e24f38b0b2d76bc9d1da912d30b1f1f324a33cbd38e06e35d0a16310f83aa7293525e0814806b77b1872a311bafb14b818fff7e9de735e3465268912f832932d011cfdf3b8d9739cf27332326294b589ec3d549147bc876fd7f6b94bd9bc42eb43cbbd194e97b9b39ac0ff884ecbd18c1d0d378e8684db27f661906043df4a40daf8ab3fddcdaa56aa53cddc2649a76e44df967d2699d93fe1a124e9727600b3c1c6d00f51d2ebb39f96e14f5beb36204bfd7e406a099990f1e6b518a589d8c77d325a290fd415ee2c216d4de92d16f0f2e7eeda3baa24f85acf5bb4396ca190c701e3ec719009bd911ac14774c6ccc1a1e0ce84e7ce0b4da5c1244316cd1f4f0005fb6566bec6f91fbd460b707e4f6d40f108950b86d1bdbf5ab8ada17b85c16aaf4181324606395fee45b70ec5c1a633115ba620e4f975c205d784a1f16650dcf5bfbba40b642121710184315f048218b5c4a6402357be2af093e38464002205f812d21d8ebcde7b13df465d573d1d4d272d23dff5294b9fb9adef107fb2fc768d80454c8b69bc60b264b7959356eee038570e69c1ec9c72e171014dfd90c0733cfd5842cbe7cc46c3e00ae0c9226b03465dc63e69aa57af0f4634cd8839dcfcd81950515273e0ba206d6e1cd80717a0d39bacfbc7abc25aa1b70d4fe6d3bb508cc0fa133e93a2c6bf0d072f3f37b16ab158b7aa8f5968d20a6dad5ac7947e0aac0f327852f453abbdc2903fd403085b8c9e353e9854c99ed3fc61267559b885db1a0941c52faf4ebd0a679e083fb649254b7c555a4c78f98d7b05254baf1d0a6656c9eba38028bebbd4d50adac2c37731d2cc40751d30988f386dba7a088aa62fec7d911e14ccf7c3e95aa5642ab24c0de2c80d0b9fc846935396a752d78f406ead32bf23db88c1697fe3f5ef84c770beb7aea7d2fa51079500ea23c967195f0d4925fba82e04a01eda1e38618ec289e41e69b2a447ad9d12af6bc4c5ee7c5069a933f3b09132a45669f712df525d8ca08839e5940cb534ee26897d9da71304a6b6701266f5bb8ce2e6e5cfdbfc403d8c65a56e37755b54c9f916f0beefee389606aa3b6ff44e0ef90e77d15f1dfcf9affcd0c9917df92e71e56e47fad50b704a12a91db0f3cc21fbb4a2ae6429714c0aa16812e27f9e8a0446239ea442c12a5ea3ea60804e94ee2fd74172310340b2e87921f76ebcd978e6aa29ef3bd51dc235944b9ea519518981e62e3814d221058460f78551300671c9a2be2d163840604077eed122b832a8b8886d98454f40cd6e8f93374eb9a935d686e11163403021514f6962cf379bd082568b272551bdd1174c91b3090c513d8f14d2deba2d38750f4003b5d294abdb9405b0061ebf497c9b603bc17287a02c07027df8406c0cc2ed457ec1f65a1d02b0bf4d3ae1f34482680b76839f7dca853ed5be73d4388d21dc9d5b09b94b307dc5098842000c5f12f3119c2d1c1c35275f4fee7ee1d57e8bbb04955080648b16009b5700b84c58fc02f3a2851788050bdd0bafe01fc560cc5f5b84c7d365f803908c424e731192e96b7b9cb52702a64c1356ec48d5787a087fabfd2124614103e125c62e1d48641d2e6ea6ffc255875a4a986f4a176fdff044a429fb19b3889e80a5c8898c413725f54adeaf23c5606b2c4e47612905a3a588a76b62def0a8e38d7e604d81f8c635190a035a20a7c6ca729fab69bd15b77dd21afbade460d1dbbfbf8d6d476e9dbdd7bffbd3b475c1dda9a38746713aaf403a4960464365c3e9f698872be5a15f75b0ae94736518680fda1e701a8b2bf83d57568b722da2395e0d662da495ad989446fd2bc833ebbbd3624ed746388579a372d0a1c5ea411c1d180abcde3ad5faba90e4d4397b6275f46101945db198cc9664bd1e30d15844225fd2c26bec1f9a4b8443c9fdf666d976952993408cdbd86902d435a72ee4d5e1ab733fde92c8b939e1f4dba523325fced083669398365f1c5c4847f8902855222d06e0132645dc64ff7c30825f6feb36eebeac50fc2bafe0018ac193ab5aeb9cc21665349b99e6fff18826fb766be9367a8aac7913df63d12bf684ad82a422f8198409d8be6342ad9d8a045dc8913a3b5d5ace19e1fc01cfb4e4b7980c0d76adff3729259e7d2718a26ba999e0bacc4d71d523dc9ebea6694f87c276087a9a037dec28cf85c826b5ab379dbaf09ced4de525bad8fbc15d4733ce9485e49d1fa98ffeeffd9c93fa5d709e392dfd14c247cd2a27863b31e0f50ccf9ea43dce490b6e68fd9362f65c35d8e71e6cd065da13996bd0ade38761943834496e7a63f64212d0ef4d7eb87f5efcda71a2047ad77771a6e66200ad41872215184fdbf91a9e1817dc23dfb9ad38c70f685c94cdae8f2840604cf42f4743746feaeab6d671155385259baa2f08a28d621b6cc9bcecddfe3d659d0fc6bcd85ae32872d6e7923e33e48318cfc6de888fed6825f3eb05121d16f26c94d25992733aa7f38d6d6eab8ef739860a6b6e654eaf89f40066b8a2e6ac27583e924f8a36eace9733ee8b7592d433cae457cd51755997d4fad335cb03119f1be1e0ceaf1f86a60619633345b0a4ed63bb1c8f59e61285f6afa5c953288f2d229aab62c79874bac59503e0be754b737f93d8d26862ffa564f9f6ca3df554aef16183652b651dbd0e0e5774c2ed89aa1f91155b0d746c069a1f7b8ed0ef4ddfa1a63da72078cc827a093c06ff6d330de30bd9c89fac1d50cb8de80321da17ebf251cde69e6719b94af3a78ab7a77463f4357ef72571cc5a9aed8fc4a831b837d8bb7c4da5617d057254c97a099e7baf3a26f36c45b3d14fb597468dfafda966f5f4793ebda8f000073b0c6b8550c5c561ba6407936ff5aed96eb7798ac42b23a7f0b065c31a551772cb39400ae3b3f9a52990318f2064385aea687aa54de4dadf741533d80a1d01d2ea98f2419e81ece4de00b4f9cb2e97f542b2d25649bf0ade81652ea7a6e12f6c281841c182da45881c48f134847fe6310a1a14773552c9c299302d8489dcd880b15c6320db6cc02379065c485679fc92ef21afde0cc1d01ac4b6fe0a5b00740883493cd296f9f349fb982e172d60df1d8a00af73a1c626a76e54ea0a6f094b2ade96c0f527933f384426634535e7fa55896e2bb6aadbd6895ba1f4e79d3796134f84b133d4bfd6e39d79afbc58a038f070189ebfe68ce3f226e39aaf08dccfa4885cee1bd5dfec8ac140647cca7b85ec4973bad899d06e348c0806a291e3ce4c09103e364208a06f09ca6b9c75ba9c98c2e986402bec9e31fbb929c24e94e21a9d04eb86e6e60a1ac2ba9036fa18aadda28e8bd5d4b1c842840d55b8fbc365ec7e23f5e9a9af407f5a1081eef1dd204747504f5f1643870a403700391c46b01c7dcd66bfc0e45ab5eb5effd183d8856f6b0ac1e627b33e2858b516144e70be0d0f2ff75fc550704dc8b65bdc403dc4c869a086619113ef69f811ad861c82b5763f8ca11f1cd476e4045af96b7a62d910931f89c521f96b8e80cf5599caeb217d73110ddfcdeab20038e39a84b6e2183a3197413000e93aa255caa039768e0595ac9c234b7f64b3281e1a1d16e642ee218c0c370f44e90acd7e9da0cac47c7ab1675733636d73143a344dc3f9b57fd3ac67ee5b1f2b369c18a8d8248a73e36be818ea2efa51185b72a85730745ee612e05793388ab3b3af3759c084b9e81faa099a024834a7fbf38f757b532caa16028ed4f0e26efb508793e6046c594eeb2f5a217cdf2f94bd165d88572feacc6f406d4ef409ad42978ecad4632b8c2f6675c71730d841739ab2e9c8f555529b16d248f16dbc12617006cfcdc5b7652b53824b45455f1c3918541bfe829b699a78655e80cab829d4384b68e6aeec3c5c32b8b5dcaf44b4709d4a4c0a30824f6e11a3cd1056cabdf1ec9d9635b4ceb668fbff1ff697d73af694212096af601022649b61bd97e6f8c3d61e60535aabbe594c0d3acd3035b4b4b66d5a2183ee0db0698e173e80e491be68154ea7fd62eb4acbf0afed3687eab641ab0547b2847182a272fa02d6237735ab0817f26f22e08d5490c7941b8e44e06a3d7b36fb370e91814b995ea9e92a0eeb4bb3dec0fb9c63677ed9f9a621df51985469a85e0267b7d316044c6fe195112d6131a2c76e306bf4e31839d874f071c81f734b971a20e0020407d0a2335e7b2e6f84a82898da32119ef72628571438ec736019cc193deb59f9db09c7133aad71ff00f3b5cd1c10213af02d15dd74a816ca6c7ab20d51c7f27a36a949c24a11ba6ff0a71868e5e74782bbb2c6ea65c94c1cda6c2896a0680197f4cd09744abdb4c84a67c6f27b5c794ee5a7c29ac754d7f354f403db011f0bd40943e34a1f9f692824867b98cb38fd58e2533adc5468978a85344bf953edd49c71c3458bfc9ffe42fde433267488650c6e3f92bdde25229059d80ef804a523dd7521095eaf8e2630692f3e3953481fe27bacf84c29a45d72a81a469671c2b6d0cd7aa6ad1865840c404f3c3b7642844e068e42f9c4d78200d356554e4e854475d2dbbb04329e5e577e834828522f358a6a9a48c06faef731952aee790c5511054e2e567718c64de715f6786acf0564415a157679874aae128e1e95fd1d8af690dd26258463b27c2489b3586183dad5ee8283666a24b0721473c8cad6d2c9a046ade361a3d9ce2c458a839d869cf883b3492de7c14891e7a34c3c9f0cd31707c2f867172b282ad00be2823b3508d7df324c972ed091235cdcb301af0f4a9a9ce34ea24e8a12c827831c5631c74e8a3f33fb00ceed39eed40c37c9187b388b2dcf710541f954f4081a4ee43681489998b162f9fab1903e352f90001c1425f0c30eec310a5687b2f5d4f57b3de754e98c85cdeaa7f0bef9805dd1918643fa8ce15b55d2b92c720c3907c66abb8966f63c39d467e0850fd69f05015a03cc1a30284df637c8a145cee4e6e8ffea498b781e0e30c234685843ccee199098a1aa861fa48dc09201ce43926897b679f420ac21da7d85e8fba33c32d2132f5aaef532211de0f905f51988ae18d18d2bd32cb5f948ab0103cadc850e8cee64403efbcf7ae4d83ec9eb884ec06c16bf4f042519922ba661398ec8ad7e9bf39db83ce68d724cc3603b6070fcba48aaea7011eec0f6688a616381716569d9e7f4b130971cfed9815c00ecac819e5d15e235a9304660d07aea61830a6a5466807cf17e9fc179dff67fd232ed6d457d04790073c2714fb9c30106b2d015ddcfeac614f499d5d59f8d65a09c51f44c83ed8f0ef7cf80a4acf5d0ec7fbc322f8302acfcf7eece15863b24536f5a113bf92041d0a1f1d4500e4010183acb3b3974a6f93c593258be1880511e7c516cb51050ab22752c6d6ee88d0a3cd798c10359c07", + "patch": { + "balances": { + "balances": [] + }, + "collatorSelection": { + "candidacyBond": 533333328, + "desiredCandidates": 0, + "invulnerables": [ + "HNrgbuMxf7VLwsMd6YjnNQM6fc7VVsaoNVaMYTCCfK3TRWJ", + "CuLgnS17KwfweeoN9y59YrhDG4pekfiY8qxieDaVTcVCjuP", + "J11Rp4mjz3vRb2DL51HqRGRjhuEQRyXgtuFskebXb8zMZ9s", + "H1tAQMm3eizGcmpAhL9aA9gR844kZpQfkU7pkmMiLx9jSzE", + "CbLd7BdUr8DqD4TciR1kH6w12bbHBCW9n2MHGCtbxq4U5ty", + "CdW8izFcLeicL3zZUQaC3a39AGeNSTgc9Jb5E5sjREPryA2", + "HmatizNhXrZtXwQK2LfntvjCy3x1EuKs1WnRQ6CP3KkNfmA", + "DtuntvQBh9vajFTnd42aTTCiuCyY3ep6EVwhhPji2ejyyhW", + "HPUEzi4v3YJmhBfSbcGEFFiNKPAGVnGkfDiUzBNTR7j1CxT" + ] + }, + "parachainInfo": { + "parachainId": 1004 + }, + "polkadotXcm": { + "safeXcmVersion": 3 + }, + "session": { + "keys": [ + [ + "HNrgbuMxf7VLwsMd6YjnNQM6fc7VVsaoNVaMYTCCfK3TRWJ", + "HNrgbuMxf7VLwsMd6YjnNQM6fc7VVsaoNVaMYTCCfK3TRWJ", + { + "aura": "FF4CWRg8eGk8zEmGxswx4ppBQN96HdZhkV35YJU6rfXabpV" + } + ], + [ + "CuLgnS17KwfweeoN9y59YrhDG4pekfiY8qxieDaVTcVCjuP", + "CuLgnS17KwfweeoN9y59YrhDG4pekfiY8qxieDaVTcVCjuP", + { + "aura": "HEuPjdpQ3yv45zwk6h6985PNK8wszRyeAjDd4GJW5dZEpNp" + } + ], + [ + "J11Rp4mjz3vRb2DL51HqRGRjhuEQRyXgtuFskebXb8zMZ9s", + "J11Rp4mjz3vRb2DL51HqRGRjhuEQRyXgtuFskebXb8zMZ9s", + { + "aura": "H4s9sGNMvzdjFMKi8qMBqnxhGJR6T7Ytx6foFz9CVhGVyQn" + } + ], + [ + "H1tAQMm3eizGcmpAhL9aA9gR844kZpQfkU7pkmMiLx9jSzE", + "H1tAQMm3eizGcmpAhL9aA9gR844kZpQfkU7pkmMiLx9jSzE", + { + "aura": "Eis5y75gUQtH712YCyF5q6PjE8UsZzFJ4q3tSYQv2QifZKT" + } + ], + [ + "CbLd7BdUr8DqD4TciR1kH6w12bbHBCW9n2MHGCtbxq4U5ty", + "CbLd7BdUr8DqD4TciR1kH6w12bbHBCW9n2MHGCtbxq4U5ty", + { + "aura": "E7XKeXCdv3PF1UMmBMU8qH536LKvpwHcgFCVSUbYwK8QrqY" + } + ], + [ + "CdW8izFcLeicL3zZUQaC3a39AGeNSTgc9Jb5E5sjREPryA2", + "CdW8izFcLeicL3zZUQaC3a39AGeNSTgc9Jb5E5sjREPryA2", + { + "aura": "Cm8X6ekpTVidkFPUmDF7dHFLeWQyrdGW1RhEeuijeR2Pntd" + } + ], + [ + "HmatizNhXrZtXwQK2LfntvjCy3x1EuKs1WnRQ6CP3KkNfmA", + "HmatizNhXrZtXwQK2LfntvjCy3x1EuKs1WnRQ6CP3KkNfmA", + { + "aura": "GRvavY8h77mnRHbEQsFvUzWpw3kvH8164aVUgKqoyMW8rpV" + } + ], + [ + "DtuntvQBh9vajFTnd42aTTCiuCyY3ep6EVwhhPji2ejyyhW", + "DtuntvQBh9vajFTnd42aTTCiuCyY3ep6EVwhhPji2ejyyhW", + { + "aura": "HeSr4JUpXgrfKNwZGcJYU5FSn3znDoZaXnYxWB168bw5WUM" + } + ], + [ + "HPUEzi4v3YJmhBfSbcGEFFiNKPAGVnGkfDiUzBNTR7j1CxT", + "HPUEzi4v3YJmhBfSbcGEFFiNKPAGVnGkfDiUzBNTR7j1CxT", + { + "aura": "HppWoUUWibaZn3zgmcaWZY3BLbZzRktLiNK5e6DUBxHuniE" + } + ] + ] + } + } + } + } +} diff --git a/cumulus/parachains/chain-specs/people-kusama.json b/cumulus/parachains/chain-specs/people-kusama.json new file mode 100644 index 0000000000000000000000000000000000000000..7a55435d12e895f1544dd338b2ec168085569f9a --- /dev/null +++ b/cumulus/parachains/chain-specs/people-kusama.json @@ -0,0 +1,96 @@ +{ + "name": "Kusama People", + "id": "people-kusama", + "chainType": "Live", + "bootNodes": [ + "/dns/kusama-people-connect-0.kusama.io/tcp/30334/p2p/12D3KooWQaqG5TNmDfRWrtH7tMsN7YeqwVkSfoZT4GkemSzezNi1", + "/dns/kusama-people-connect-1.kusama.io/tcp/30334/p2p/12D3KooWKhYoQH9LdSyvY3SVZY9gFf6ZV1bFh6317TRehUP3r5fm", + "/dns/kusama-people-connect-0.kusama.io/tcp/443/wss/p2p/12D3KooWQaqG5TNmDfRWrtH7tMsN7YeqwVkSfoZT4GkemSzezNi1", + "/dns/kusama-people-connect-1.kusama.io/tcp/443/wss/p2p/12D3KooWKhYoQH9LdSyvY3SVZY9gFf6ZV1bFh6317TRehUP3r5fm" + ], + "telemetryEndpoints": null, + "protocolId": null, + "properties": { + "ss58Format": 2, + "tokenDecimals": 12, + "tokenSymbol": "KSM" + }, + "relay_chain": "kusama", + "para_id": 1004, + "codeSubstitutes": {}, + "genesis": { + "raw": { + "top": { + "0x0d715f2646c8f85767b5d2764bb2782604a74d81251e398fd8a0a4d55023bb3f": "0xec030000", + "0x0d715f2646c8f85767b5d2764bb278264e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x15464cac3378d46f113cd5b7a4d71c84476f594316a7dfe49c1f352d95abdaf1": "0x00000000", + "0x15464cac3378d46f113cd5b7a4d71c844e7b9012096b41c4eb3aaf947f6ea429": "0x0100", + "0x15464cac3378d46f113cd5b7a4d71c845579297f4dfb9609e7e4c2ebab9ce40a": "0x2400c6f7906ecf1460717a95098a86e69df61cf7d72c2a29232b602acbfc131b25026d79399d627961c528d648413b2aa54595245d97158a8b90900287dee282160e8199042942b28db8753a29cf4ade28435e4594cd014657d3aa94bf821c0a423a6a0745688c52b4709f65fa2e4508dfa0940ccc0d282cd16be9bc043b2f4a04c46ff658221e07564fde2764017590264f9dfced3538e283856c43e0ee456e51d46f22cb677963c38e1adf0e1f79c9039164a3eaeaa810a9a18588be6483ca35d4e6d6256f56677bcdbc0543f1a2c40aa82497b33af1748fc10113b1e2a1b460e5c49f7bc76b9e1b91566945e2eb539d960da57ca8e9ccd0e6030e4b11b60099f00168a3d082a8ccf93945b1f173fdaecc1ce76fc09bbde18423640194be7212", + "0x15464cac3378d46f113cd5b7a4d71c84579f5a43435b04a98d64da0cefe18505": "0x5005ca1f000000000000000000000000", + "0x1809d78346727a0ef58c0fa03bafa3234e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x26aa394eea5630e07c48ae0c9558cef734abf5cb34d6244378cddbf18e849d96": "0x000000008243cd7379c4", + "0x26aa394eea5630e07c48ae0c9558cef74e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x26aa394eea5630e07c48ae0c9558cef75684a022a34dd8bfa2baaf44f172b710": "0x01", + "0x26aa394eea5630e07c48ae0c9558cef78a42f33323cb5ced3b44dd825fda9fcc": "0x4545454545454545454545454545454545454545454545454545454545454545", + "0x26aa394eea5630e07c48ae0c9558cef7a44704b568d21667356a5a050c118746b4def25cfda6ef3a00000000": "0x4545454545454545454545454545454545454545454545454545454545454545", + "0x26aa394eea5630e07c48ae0c9558cef7a7fd6c28836b9a28522dc924110cf439": "0x01", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da918e162b79f1c44eab552eb92cbb903b10e8199042942b28db8753a29cf4ade28435e4594cd014657d3aa94bf821c0a42": "0x0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da96639be2514832922403288b3139bacc5f00168a3d082a8ccf93945b1f173fdaecc1ce76fc09bbde18423640194be7212": "0x0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9835fb70434ad8c544e7161ee304031d7026d79399d627961c528d648413b2aa54595245d97158a8b90900287dee28216": "0x0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da984a8eecbf1a9cc434fb17f34f62d64d0d46f22cb677963c38e1adf0e1f79c9039164a3eaeaa810a9a18588be6483ca35": "0x0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da992f26db9e1a10596464efc932b402ef1e5c49f7bc76b9e1b91566945e2eb539d960da57ca8e9ccd0e6030e4b11b60099": "0x0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da998f5524a460ad187fe23dfbea8165c7ed4e6d6256f56677bcdbc0543f1a2c40aa82497b33af1748fc10113b1e2a1b460": "0x0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da99f3d89a197a09a38c501b45a40acfb1c00c6f7906ecf1460717a95098a86e69df61cf7d72c2a29232b602acbfc131b25": "0x0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9b2f4429c50834c52a099157f11c40a473a6a0745688c52b4709f65fa2e4508dfa0940ccc0d282cd16be9bc043b2f4a04": "0x0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9dc607cc9989171316a1164a926215f70c46ff658221e07564fde2764017590264f9dfced3538e283856c43e0ee456e51": "0x0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080", + "0x26aa394eea5630e07c48ae0c9558cef7f9cce9c888469bb1a0dceaa129672ef8": "0x42283d003470656f706c652d6b7573616d61", + "0x2aeddc77fe58c98d50bd37f1b90840f94e7b9012096b41c4eb3aaf947f6ea429": "0x0100", + "0x3a63": "0x", + "0x3a636f6465": "0x52bc537646db8e0528b52ffd005874bf04ce0e06b71250106878940e68e5085853077037f7e0ac00e39f3ce5d32e68cd9920c41d6c0ef827f2d41f397370f8585ab3819e905b19509709f6cc0c0dc5faff31c72dca4555fb9fa2d2f837217befbde59652ca94522e14a311af113edc879f1e0f12254a64c3b592d338129b6bbebe8f07891a4ac439e9e448e470ccd7e7e341025222a851a2f71c5222e896e6441a257a740976a2e7394e7224682891c9e43628118d976adc8613d9a044a6ce4d4e64c3332ff90d5fe71e0f121725babcdb311325d2e196bb8eb7e526276a375122291d52a2cba113991c7324a29f28518d1ace51226c52a2e9359813d538468934cd8930b7f119083da34452fa4589344a84e39743cda113650e29919c7122e93c9c3a11744a896ad4701a4a44e396e53994a8468ed358344e9dc8724a8972a696e344b3a34ba06628d18cd3d0b8cd0c0d8d0ef7ebf21c9cebc2ae594363b241d2a0d5f3b2a13d8c46966a64d6cf442af5abb1a0062f8b0693990d938d575322c96b4e0d83160d29833666662259fdfa2ad5481a4dd298b4a7d303625daac11c45a2978ece8c09d3260f1e4ed4ce83c7b4614387d3009fd390f5e8e14497f7e851635925d7e13cb2cb79481a6870a21aa741878657a281aec37b9848dec3514e64c3513c783811e63c280f4739d1943a3a588deb701a248dd3d03a3a3a3d9cc8f21e94484787a4398a521c27ca1c67ba0ee791e3386e03e53c9cc8e43c68a06187534a44833b751e4e74b93b11d4d1f9cc4c9b5c87ebe0e0b8e7e4b88de3b8e33811c9719eebf88e13957c8783dc38ca894a8ee2ce1de53b4e64c3dd899ef3a0e1e64687dff0f01b27aaf11b7622cc6f9cdad8b8e750221c4a84e3ee36396ee34499dbb01349a74e831341a78177e83891e53a9468878eeba0443b3c27c7697022cd7538d1f41d4ad4a3877794c88612d9f8cc8cdf50a2d3c96d28d18dcfccb88d13d1b80d253ad9f8c98932dab33bec9da33ce31c87129d28d1c9713ccb5c87135dae831271ee3a9c08a343ec0e3be72827ba6811bbc38ea2443de812cc03734a89aecb6b50a21a8e51c79c68d21f304a74617e43892ecfa6674e54431bb03bec374e444315b03bec3450221d1adf41897450221d4e3b4ae4385c0725da2c4821c317655e0006144cf1a94982124f8451862eb4008924f82051e33d6f676dd0cd41f7edace3a0fe76d64d74ee0e7b0e4e8ddf50221b1b7ea244aa2058a1852e5e6a70033082e053a372c1114e38c1164d208397287c6a9ca8861295287783ceb7b36e83eedbf1412bead749f4e4441a156277d84d9488862ec13e48685e8312957c862e11c4070992739448d3bc44895434b892c6151a9039630b5ef021ed13c658318313b880cc1664f021391189125934c8464f6f675da3fb766ca035875f873487a64976873da344185d02e58304f48b12ede0832cb850c5194a1883039f4997701f24746821061e10c1094994410b3e48b45b4e645122497d77d88922e5dece3aa4fb766aa035c8af3f8ada1df675d52bead10040420a24c6d8e1faf97bfede43428a7fefbdf724db1d6eb580e189f74ea13a5521d7a9769d2985ccb76b9d7adfecdfd3bb3d0811d9ef162184617db7eef71ebf4e6b54fb0f8ebbdb731eb3cf678a63841d3abfcadf8fb98b6c3fe366eed5b64266a72aff731c382290ceac35eee06b2be4098f7921eba3d428654fe3eefd16456a613e8a465a214fd8e8850ef0ecedbb1d8146bc15e18c9e5d337af6f692edcf4ed5f6e7dbce5e5ff63a1f5cfb3bd21ef4e86cd47a02b2f8bb05054ebc2927db1d0e7a904ed59943a72ae79d8a8e43a7e0c71250f9e8399dead4fbaa7d0df2d1b779daa76a5f4f1f9deb547b7453f4e85aa7d8a3af4ea441bbfadda162662919fbead420ff3ce36e3f638d7f60a318ba6f47a05b7436ad43efd92f37752a9399c4305a31bf1c935aa7a43fe73a85f9f34c76fc19d66da3b6519af346a41f364aa355f3cb65b7af7543ef31cf48b2dbcfba7dac439d9e7df747cd7976a6d5f2e8cfb3c76c75fb57370fc03ebba1f8cca66fcf366b6d3722d299d6f9ecdbbd6de50c7bd5fe7906b785335aa3741af5dc726f94057fbda77bde76dba876d8557e212e53a64c99afaa5f975d1d7abfce7436aa9db79fa591728d6aef69cde49d5a7f8eead47e4ea7fc9ffb5821ef9f579d7fbe3a0fe32845b63a956bafb377dad7b3e5c105e1762545caef6a0452be96be5d00bfab23ba7c6f3f4038f6f6ed94e5edb053cfdb67a7f6dbb3de7e2cbadcf3d7ed5b1d7fc6dbf3ec75432cf4031b05bd08f7cf7953c06ea3aaf61c69557d9ccfea2afc0a7de8bdf4dd7ea2f77496ed4644d20a5ffa74ababfe96bfaed65a9f1043d422def26d94e53d6f764244ffdcea6ace43cf5893ddfeebf6773b023f7642ef9fc36e1bc5bedbcfa3b051ec4d83b8df1d2a8b5f12d9768a977f3d2b6da7f6d7b753ed75fe3accb85bae3dcb5a63eef9cd4c150efa73f6de7e982ed7feba6dd4f3acb51b2250f0627fecef06e936aaa777fb818d7a3dcd1b0faa6fdfed47c5cc6164ab53fd9f678be2b2e5c16da32af7c3cedb90228c8c8c8c78f6acb5ed14fb3aec54fbfa6eb351cf7b9a3bad51cf7f70d5f4cfdba1d7f9cf3353a7b651ebcf4f9de27f9ed329f6e7196ba74eed3fdf0d7651743c14d5fcf6f94d718cb4436f8774889f296cd4fa6e45d89bd676f69eeee9d579cdcc854930c5eeea88d5b3e7b00efb9f358063e7df1ec0fa6ed9f2c055eddbb54eed962060f1ed5ca776458229beddd4a9f5f653a7d8db735807fef6d5691ae4bf3b54cc06c87687db951154bece5fe73ab55b8280c5afcf4e2d1746a8f2eb5aa7f8d7b779d6a79a7e7d759606f9ef0e15f301b2b581abdcb3a33a55b567673f75aaa29e9ddd47a7f8d9b94eedea882ccf6eea543ffb360ffbd49c67d73ab5cebe3a4c8382fcee50313f20db1edcfa5a1c19e6c11963601c18b82f7024e098e096e0a6704a704970487052b811704770467046a532a53394d22899a1548612194a644a63289d510243c90ba52f94a2501ae3e1e0dde0d9e0617957a6131305f304138ae902ab05160b660b341f6859683fd0b2683a201d411a02090cc90b2433485a20298124464906a518949a2895a024456906a511948c2095219d818406c90ca432946a50a2c1b44296850c0bd38ca9452626fb423626eb42c6856c4b7684cd0c5b1936326c64b6316c62d8c2b08161fbc2e6858d0b9b199b98cd0adb14b6305b1436286c60b62f1b13b631b6246c5db630363036246c47d8bcd8b8d8b6d8569b10b6206c40d87eb061b159b1ed60d3c1966512a1f4040d8b39867406090c243290c890c6401203290ca5284a30289da074b4254132a2a4020d08590c4a52c8aec0455192524a41c9a8f404298d9213251464514c25e610b2176429d0a4c8a46830b219f01137c12698623805bc02a020802065a1870420c087c8909f1e03e8b080220a4891be30000104a004859911cc1c3163c48c1157863b03970687066706ae0c1c196e0c1c1938317061e0cee0b6c069818302f7857b02e7851b8313833302f705c785d3c21581db82d3825b7130e05e4001ae89d29852174a6694b2509ac207a204712d201161bb62a3629bb28d603b82a7601cf00dd8068c85af700d98062c05cf8065c031602b1c05c3805fc050b00bb805cc02aeb2e4c540ab42cb41e98b768312985218ed4883426322db426646a685ac093764342889c9ac6450642ec85a90b120ab92ad2053016606ac0c9818b82e382e382f38227047e0b660676060c0be80790133834b02a7048e0cae091c13b02c6058c0c46057c0ac805501a30216052c0cb6050c0a1818ec0ba6052c0c5c181c1238319c1338305c16b82b7056e0aac095c151819b0227052e0cc6046c0998185812b02e18181812b02fb02d1817ee09ce09cc084c84e702cc0b0e0b9814302e60637066604ac08e803d017302d604cc0b460636068c0c468627059606860656063b4366941d9119c145815b023605ac0bd908b032b03199940c897e42964436a58485d2164a5ac0bac0b8c0b46045c0b6287101d3025b6144c0868009e1f100cb020b020604ec0718167d04cc07580f301e60576056603bc0748065c1aac0728051814d81e1a0a180dda0bdc0b0340db02bbd05ab0146034c0a6c06980cb0186056b0283018602fc05c804181b500630156055b01a6022c055d057b02730243017602ec086b02330156028c0a46028c096c096c4a7fc192288181218149c146c03bc08ee0a0c08cae32dc09ae335c695c685c66b8ca7091e122d32fb8c67089e10ac375c60586eb0b9717ae3157172e2e5c5bb8ccb8b47065e1c2c225e6bac26585ab0a57191715ae295c52b8c25c51b8a07081b99e7039e16ac2e5e522e362c2b5846b8c4b0997185712ae2e6fca15c605c68584eb8beb0897112e2f2e2ed796ab8b8b8b4bcb558487c4b5c5a5c5b5ba88700de112c295c515840b08d70f2e2c2e1f5c3db878705d715971ede0d2c195e5aae2cac145c535c58583eb06970d2e2cd795ab060dc545834b8a6b06970c1e0bae185c56ae282e18b40bae175c505c2eb85a70b1e0aa72ade05971a9e04ac1f5c4e5c48582a7c47574357199e02ac145e522c1b5c435a5b35c4a3010ae242e242e29d708ae232e233a8c56c23c432fa19930d398684c334c32330cf30ca6627a616ea114c6c4c28c9479349b98269825985426092613afca5c624ee1274a5778573c1ab4142c8085f1a0782db8be702a28598143019782c7c45be219f18cba4c9fa1d36834da0c5d86264393e931b4183a0c7d4683a1bfd05ee831dd85e6426fa1cd682d74161a0b2da6afd056e82a74194d859e4283692f4d4627a1c76831ba0b6683d6d25c349727a573d054f4148d83be01e782b64163e92b5d839601a64457d131682b1d45c3a05bd02ce815644af0105808ef08ce827fc041602cd807dc03ce01f380ad601d40f100abe089100632f00357820948c0480d910a19ff7276e5ea0704458906900ca10448082448327e41340142a264484910489060cb404c34a064a809111b40320404d09325413459820489cd8f1f9a16485a1670342c2c07966ca08913a02125404f8080b2040a501320223a9a18209038d94093224c983841c01010404c983841800dda1582685660c24409104c98284140158418e240132026652c10d006903819423224040796007960479bc24261b244c910501048808036d0438bc23ad9409325483ef0048808a10f2869806b505820209a38698244099225433c10104d9c3060a809114e8000e27168608270020450103ab4272c940f0005218102e50340469a385902050a10043acd09eb812543fc13a0a0274e2670a4d3bc2cd09092209630511205091011404438c087208038c001253ed8a091b150828000120208252c94a126404f808468b2c435319a2cd9008ed665815802a5c9922743450021f9009321865082e40950104c9610e113048413263e395a180be546f3629520c9d1b66c079028195212849221a01e66342e40b084899225434b9a2cb1a169b141403861a2012440434400015404500d6db5404f9c2040d388b04d9c0c41049220982c214203489a280102c992217ea809500738000481208082208209104d963489809227447c0f6d080b0568c9d092274e84182242098d26846de264c990922744048164c809132848960cf14a9e10f136bad904abcb162818e15795edcac8e859f56c642c2396c143b00567666666dc216fce63e67d3d67c62b5fef3ee65e69bdb5aec75956a6bdf8369a2e66194d6bed63b9cbcd2b795787ec850fbedd071f678fad66f9e02e7cf10017c7ccfc9e65c1f776a5f560c3edbdded32c8bf9ada5bdbdf6f58bfbb46cb9d7b29697dfdc7e72d9e265ed69d6a5599ad597d4acedebf5f526ef3e299f25e59cb3b77b3237e3e00c6049b9da6559ef65f0b1f5981f3febbaacf7de7b6c6d05d876574ad92bd7daf798e7e465f97a9b9f0d66b3186318ef62d86218b6d862bb8b6118864938574a29e74ec96bd5d448b9434dcdf294bbbb532e64b8524e3833b9732543b82b57c296dd4db27877b775e0ad79371273f74c7c2b44beed8ebb52f64a295b6ea97b7bbbb77ba55c967257cade96cdfb5e33491240f6f2ebe57d9b83e47d8f59cae6e6b74fca96bb7399e7cec9bbcb524ade65c97277b38ce53e9ad5c1fbb21b6f27cc78f6f15ecc248b997b9b9bf7edaebce65a37fb52ccf0c696765f9b7679003870b65b0ede1c33cd52000190cddccbfc76776f30377397b6be817737e3e5c9cb162fefe320cc8ffb35d7db4078e5f6b398a5b5bb26de9d6b69bbcc9c6d2f899744da98b4bdbbf5e47d00789377b9e76eeff20f9e73ce655e669ebb4d9252ca4dc285737b77e75a1bbbb767b7157997b97b59f27277eff2dcdede5d5edeed65def97a6577afd6d27a5a66bd8bb3628cccd6aee47749292533c3d7d6aed59a7ccbaffbedbe65962ca5c5524acb87c599b44142c852c21bee9692e505f9a6861de66df91ef37bf17a39cb2be54a282db88f5b6eece6c870657835b63ff0c44907803a206fec0d1c70c20409079a2ce100079c30b129394d114041345982a4c912254200b1810d38a10260c264495010548f1e281e281b3e6cf4a0a1069d20a520982c11020824434c8850b201a020769e281982d2a304c5c6e6260808251a60c2c4c9931a7628017a7273020a4232540450931c401cb0a9016508ca92228072e210104aa03451f26408c9d0920e74c009cac60660c906809e0c41699e28016202044e29882640430ca104091007943c71320485ee0d434a9e003501e2000ddd0660c88993274882007a0214c41327404b9e0cd55004901039341b182202c95093254f8638ed0d1d5832d4848827488080b2a40334004fa0e0ec0d1fd8c0922740519010e086010c20004100edc036004100418102f464880e380102c913a0284e80007a82440994208000427243506a00011802082028489c0c0df1812740f0e4c8210037380e29244538f1c0108e1aa9010400490080829430d100120e345922041425427803013dd9404e9426406fee0d489a385902e5095014241d40f2c4c99012209c3061a204c950114039a234017a3d3422f4aa54aa2cc9aa5458925549956a1615a9649222de242abe8a8a8aac22d5ae4aa52a7a49b68b601215171575d14b52c4aaa2a29744c545aa4ea2e2a24eb2aaa222952a2659d595648b5445aa57c42a4e52a42a52a954f12529e2a2a24eb245aa4eb2459c44c5459c648b8a8a8a547126d9a2a24ea2e24db245452a15545949545ca4924954ac62554ca26295aa93ec2651b14a0593ac8a93ac4aa57a4956a5ea243d0f0abcbbdc01284a36657c1563bc007eb75461e5b3cde057a6156e57b95711156dbb5545f0ec16fdf59ec7ddfbd7050911bde5fbdb55aef2ed702bf21e3a5bb4f2c30afff2f5ca74a9dc7eac1fcb77db19afd24b5e339fbecdc3b9b5636dae0df55b8e3969a70ebdb73c9268dd2f9b26698dde3ebb992a5c462b167d7a6f44aa2ae851c9de171dea7f3ed927adfbe5a1b74583d8a547e7ad08bba45aa3f6615352472ba818f3ddef162abef8d514584a24af9cf46a9abe6991366cdfcdf22c6b8d37a60bbb88b3cb39aab8eaffa0f6b67deef689b820cbe357ffcc3b7561251c72e84ab4aa3ef3cb2fdf2de39f8bfed02876f8d68b24d9e5984e39592f8c45fb3032130c24d26d940838e9d594d3a9cb9f1371fcaed3290bcbfc791092bfca5f990906923195af43fdd8162ab2f8ea3b381557fc731d1fbb6194a730106875959ff443a3e09148ea60a338becfbc0e3ddfba6d5474ad838d8ab442bf99690137d49fd18a495af9a547b75016ad431d295d9db7f145832d3fd0327b87eb54f4e754ca18e383fc6e99420a2a9f2d0f8eb3f82d533cf1febbe506677cb6d96ad6768414bbca5fa3d7985d9d3fa5774bd77c3b35e397c34e95fca21777f926a1c70b6e447e6026e0f6d3a7463d6a6ad4abd1e57835fdf3996e1b359de3e12d2f3d92c76eebea7ee1a367d7baca547eb40cfaf31f3a05bd9da7b00efbededd0398bcfbab9fd808043b1d7a94d5a550fdf72eeeaa4f13af4be1d7a95d0af8ea6dbde617fdb91ec1b46b7ba2abbba5f1e52668281b0f7f40f9dda87ce4cb00efbd0e5f603e9724ce5b98e694440e5d32e82e7483caac4017cda9b1635ebc8b869555526d83f87dedb91e88f56e8915e910e3722fb57a6b88fa445980f15cfdf66e47a486b037ef7c7f5cd5ad3aafade47aa11f8d2f20a5956bdee2732d8031b3ddc8e702fe983ef41fa1e3b91ed36c643d7b43c8400f4cb9d90e22f083cf1d03727ae78e8d32b0ebf5e77f82df9e6bb7eead4f4f51cd7e994e6eba84e5dbe1e24874e5d1d8cf1450bc3ba7d6b4ed7f64bd37b1ac748e6127a96917cb71eb20c23656e791635df8f1a1d6279f488b9d5f147e99156fe4cd3aeed08748d0649afd0a1a8fef2b91d81a27acc832e879ed17a3946a3ecf652bdec36d73a158e91e89b47df1ca355f558a99b8e056d0ea3973a2952a448297912bb3730fb24b17b437d7fd1ead3f38488bed4adcf543d147a3f332fe0367f9b11e897bfadc8f48bd6cd27c5b93c73e9bd15d928ce458d686eb9e69643cfb42c48eba1358d3fd27af9c41c27fafef4abc3897488f4e993ee637e3d16af20ab5e73faf34885b84cf47704faa4d5f2cb31e68f1d7f11abb0ce9e3842e3b1cb19ce076ee16f516a94367e6d85ec2ea9b723d0c8e8d7797dfde7c9dcaefb0ad7e361effe900e9d3bcbdbdf3684dda2d5278e118bb263cf31db76ee60a35ab6cbed08f6ebd80aa90cb723d9fe685f8aed8f66a397ddee8f6e23bec7436a6a2db2e7afab00c70e8170757e734c58e9f84d15e0d8b79f3874156479e96f6a3f2499f20c1bf0430ab03cf8e5a13a85233d7a033a55757ee854452511a253f5b45c78e814efea09311fb1e7727ddd2f657cfcba66f0449f0aff71fd91a53fe9bbec43f2975fa753425ce6c9fa907ce9bc1941f2edb27db9e9ae0f7edb0f7bc65d90dc7870de86bce76c85e0a51389400445b3e8a56f57150fed4193d6e7eb550e91fe8cb43f2a02ee9e67dc6de4394b6a844f9db23c7ace36e1a0731abf5b82800567da951365bcece2739d5ae9d1b3de7848238d339ce1772bb33ed665c7657e37a3f5d146463c7bbf31d7964c88bf358fde1d14fe8b06b15fbe822cde86df2d529ce16b7f74ee9ef0fe883e345f68cb7ce6bb0dd11cc332a618bfd655e9d1af6e3d5b0840d73cdb0b70bb5ac117fffcbabaa8f56e5d2f7fde9b11239a5f9e418d372256e657a739dc8ccc21d399eefe60ef69adab4d797fb05f9e75b59f7dfd8a325fe89dc1e8d7adae0eb14a726321db21dac57c24e3a19113aeabf85d59b1c17714bf2b1830f1a8dfd50b80f0ec4eb8b7c5ef8a05649eb5fcaeaa5cf13e7e572bf8f22ba48560bf0c447a69856c1a3c92779eaf2fbb943d5260617f48dfe0f748718505b22f696d5a8b3e4a3f079ef0b35f268ccb346d857481042a2f54fa28f3d99f4bd6617fbff657f9cfb3a7c5ad4886c6d15722681c15915f893841174808f342499ec7c0e0858a485f87a6008553145f87b044914de1eb1009a610bf4269020f6c004297af50b0e8f2ecbc1599464645de5664cb3c7bdc8af80bf14bcf6467f166247ad35a03a397de6e6d43a443ef795d556f91f1158aeaa55b9dd0962953a6551dc5060d8c1ecec0cb77df7dd69ad54532be3b1dcf1b11ff76d945b101e9501b71e9b10b6a979e75d71b112e13dd8a14a708f4e844a0473a94ed4a0a347ea8dfa2b53d0a7f74d5771fbbee7b28fbf605a38d56cb8f10347a1b066211bfc832967560315f7ebd99677dd631d6011afd7a66696f1bb25fac39e7943de7e339238ac49ead40cab35bced0b3d8d16fce98089a5b1dbbd60559cefe36229611cbd9da26dcae9a78e231b79c8f70bb92c28cc75ef32c7b1a6f4466bd3cc8ea2ae69667568753041a19fde6f0dfefe656d7bf794f5b5adcfd51f276ab2379a9ab16dc86584ea2dedb10cb39ef795c8763c472925b4ea21d8e11ec2dc7dea237fb034ab7bc3de31ecffa40b73a53a3a0979cd4edef8faab9b51dc15ef39b15023d6e4770f607748dde90481d1bfd6e44d8e8ca8cf734f7786628ec1de8b044ebfcca05598e79b57c79501101c330cc7b3a831a6f43d8adb715b11c0b22ed0fe8a5fd018d1eee0fd8010e1a19f19b6757b6d192effeb84a4ebabafa3e735246ba32dfba27a492e63d5dd29c946d9a5f9946777d64f47afb57b76e55f695946bd473faed5b5b54321f38f8bb32411a3e70f177650232bb3f768709c47cceefca045f3cf4fa283f6fe8107a2cfa17cb7848855e99323088096db2601cd547d9e56e47168ca397f44a56f43576b1c98271f4d12b085e46d9a40052561fe91511144dba45fc73f6ac61f77cb70a5c1141d196e173f95e31c251021a3c61e5090d56aae0623434c496f1578c8090b1855194024859155141f0f1882dc3e7a2465b860ffbf32b4637a0a0831160c1c8c867a9088a2635820e691de29fcf48010a3538831423239fdd7aa0f9d8f206d9d1b7aff7f8badbed03ad902741fe0a74d55ac19f2fa4914a49e2874ff429343e543a65faf69b9923ae32f9f5205f4d5fb70a0d90123ba6d2a8f6ca55a6f2ed75abf0ed44d0b9b71306287c10850fb2843132f289febc72df3eaf33823830c10c8e9081107ca424f1c3e7f9141a1f282589f6913ec5003ecf6337c5003e4454f8f09ca8016fa7fd75f9f6e84454f8203d52a29eb7d32e2911153e447f94c8df4e7ba441eaae56cfeb76593128e1c5952d38e106521063c6096e7d5429f84208308081165e7600069ff5815e837cfb6e3eb89191cf732a9deaf1edb07bddbe9da3df1d4550c50da9781076d199ad18ad1823ccd9f87755822d3f1d1dfe087199872e694ea322840f7687f17c5748f4f52c3e7ed39ff427fd59fe7ccae74ffa7b2f935a60ec56ceb44b67e938d0f9fb716011a4c78ee58c1d3fec76f545e5fef983ffde7b3e35201cbb9c611f823df3eff6d36f5f371fc9a467196f3f98670eddea34df15b279f46ceb545f336b0bb27c3debb2df5509ae78b83f626fd7ae75965f1d7ffb76d3b56efa45847dbda727adebd3b3ed6ae6ebd9d366d79bf376fb5b17343d28f376accbdee5590f9a6799f3ae1014d56f5e3d608634ca3c94ed82e509267ea33573cc7b5e96456d767d39cca436bbf6dd8818d1682de22fcf3cdb8dc8d2ea711b8239e6cfdb4f4683b021982fc57cb722f32f1a34bdbd4e23edd3af6ebf5b55c63009d9ae10e9eb31931d0e8d8a3e840fd2a8e8bbd59c8ffe760342d3729a07f3e83bac10df1fd3a3fbe814d7a8797974acdbde99aed33c13e7238fa977a6475f28bee2f0d17156087fccae2ea751d3dfefaa0441e0327206faf4e7bfab124cf9136fd3712c7fdf8f6351212ef396efaa0458fc76918319bca9e38be6346a5a5ddc1febbb41d9f1bf2bd923f268effad8ed48bfaef24b1e29984ba1e2f9e5eb597675bbeace5a7bdad56d18a3b8f100b723ef9f63ddfa7416b7fff902544dfc3c1264c730a0e7a7bfcd4897def28c548b8e58eb4d013ddadb14d0f3d37b23d2e4858adef2dd8a685547f6b4de16a08ae2a7674f83db109595174af2d3b36612a91659591f99a5c9cd9a1a36af6e7db24bc3baf5b9baf5e9ad48bba4959bf7916ad1effea8bb3ac1132f1debb8ab7323232323239f22d01f7d9b5011528e30c2e89f6ca3a44b5a5f6f47a0bf0f7a1e7d3705ec5b9488d30f9d5ed2dd1ff539bf17c40e3b1c23f503dfbebfdb4f7b4f17b54a762433c9f4e03a9daa409ebdea3cbbb562823bf540b262c50496a329b6fbc13280db9509b27836fae759697d752a1b7d7bc6c3da760ee082d8888fdebf5c8851e6f9d97b33c2462f7dbb28b008f7ebcf778554e83845b08754a8f4eb4bc607f948eba3d07bcb7cd6da760de0d8f9a958e74dc885b87f34878d7e77a822b70db20a705906845b37d1643e7090cb56ce688d82be26574003c440390674e873eee3d9dea9dc577fe9d9ee70d14f3d9daa53019daa5c924e49dfa153f0a5ff70c54bbf40a7decbb75e5ee6f072bf78e9d07b9a8ad14b29a594be3a9206ed9836232b6239f40c76adc1ce826ef5349c97f734ecf8a74bbfbcaa2e3933ab8bc20fbb28fc96670c3bcbb36edf1f30c8eac1f20cba500ecc367b1aecaccead9eb4c29f2eddea5e435aa7b35bdef366b72f44f4ed6fb5d573d2d915366a7a6f43f837871d9cb40ef50b311abfdbcfe656572d8fc23d136864c4d7e942161a4694f928f3a7c3ae6afe3c76419847cf324827842e34a51c61c43f8922fff228d64351fd45e1f329648d79cde163ded3b31ff3ad137a8f519c22bcfae870fb89fe3ae83d0ff3d845e97f9e75f3fab886f047c73a68d1ca6ff9d555beba2ab5ebbafca2d37b9e94ef2b14d5b343d7e810e81f69b56810a442445fdfb317e1bebda7b30e96d6f470a0b343ef0e077abbe519ecd833de14d063393becb621ed96c322ed96e52cc4659e0c69bb1519a248929f3ed783a05b9ecdaec287fe2efa4468c71819fd508d9ffede90f6f3c81058f744e800dffb03fa907ccc6b3ff4ab7b82f990fce9bb1941f297f7f4ec8474fce558277480e7fd7175425ce62f9f5de58717ddf5017b1b121d3a6f3f9256d54b87dd9c1dbbd5edafc7ae6e3ff0c9cb58f34206cef88b9ec56e9f378e43568b4f562a9279e69986f96a8e697e398675a646ad5f1dd7adb367591785bff267ce5d14fe2ccb3cebe56d4862dad3591724fde23a95b9e5ebbc6525fe6cb79f95335ca3300ff29af3f6c3b4e7f53477953f48fae52b84dfea7c7fac739d0af2eb59c7356ae75b46a45fb4847974e89af3f600ce317a6ad4ba464ddba895ce9e65bb5db4aafe72ade34eeb2ae617462b7ccc33e7ee75e5d7bc2e404584dff5a1d18af9c3ba7dacdbe7eb794fb7107ccb7bbaa733d9d5e8ecb3c3612ac46fd11c2d46466fc38fb7ba9c46f14795c5110b19849d03b820e83dbefe6e090216bb426a908faa5804fb98c5e815d25af4d0ebd5c352e123bd327dbbe9b193001032b428e3b30ebb4af43088c996f1964baf451f7d57875d2075bba841981fe2b768932de3855e99322fe91511142d18473e931a2d184795e823add0ebf5cf7b1eec7a7cc6daecd677abc08271e4b33dbe8855b15b0c128ce9274d78e9c7b3238c559632786006349cf009c09626565ab444410a61f82c4785d31ac56efd7621052ecfcf99a0c2b8258b3138485096ada67a37dba87e10c28e7f370b644988e9a6c8180ade16e00204209982a1f734a493aecee34076806d5429e30270bb2d40f51052157302eae9dffa7c0e7daaf64e640a281eb7cedcb6b7c6dc7a6f3ca8beb6072d152afaf5e56aa0c414bf2b25a87c2d3d741b7eb76461c69720cc9863670e6e3ca85ef5ecddcd54c9def613fb69323a73ecb1eb20117ee93d3d3b8533845fbaa4f3d963c7bf3a9006717d447600f6f5ac14c4dd4c0b98e9ee906c9fdbd514343efeaea640f13b936d01b4cf4acc496ffa1c46dff64ee10c697ffea4b3c34ed5e841cfa14b973e3bd5922ea77d4ff7b48a997b906d01b8acb49dda951259fc73c8830a3af4acb403f7bc5da8e8a1103f6b20b34c5ef27d3b35780dee8f0709cd9158821d876f3b1235be6fc706b781e4482cc1be6f27314af9deeb86155a1246d8afa1170bbeed545b5342df8d56c83c3bf6335e764f66c746dfddae9210f3bbf14a892c5eca977e6943269dbbf041684929a5654108df8b7346191f8ce2f98ca50ae79cbe3cf343a3a49be0d4e6f663993a351dfa29675edbcf9c31c68fdb8f6559d69c3146eda18c5d85dce517adf09a741b15a5252b7c18a16469942d0ac63841e689299f6d126eb778a2ca6725e90baf688e75fc373355389c22d031878ed120cc2daf58744ba31be07695832b5ee7779583a35f24dc6e8182302f5d85751562d8b47cdf8ce55de1abdeda7eae465975a8ff22f2254ba7f6314ae44b9646ed57ce9e3f912f586491be4fe4cb149de227f2058b46ed5f57e619ad30c3e824f2258bd911f97245a3887cc1d229d5eff7b63d43e48b148ddaff32c56e46ac3265ca9ce12d4ae40b9646edf734273b0e21835d94f092a11184cba153bdf1f60384abdca9bd8374aabf3d87e6f1f69ee6719f7605748a8715f2be94c33df1eda353da6f14f6cbf39429508b63e4f6236687e6599f309263dc8ef1ed20b1975608104ed21c8228f1c5b7e30077f8f6ede8769146ec0d5b641076cbe54d8d5a1abbb93fdab3ddee46082e7bade7b55f2b64bf3d764c02239ee36255c6f71455aa90e25bcc4680db550ec47cfbaea698f2555be180ccd749808cc83e3b37eaf11b2063297c045777f5eb9b5959211a8e4ac36ffdf1dbe3a3571ca270df5edfafcf0bf375ce6423ea301f4f90b7135df33a33abea600ff2787e783bd1a746ebe4325ab920af43d2aae36b908f1b5cd30a69d8619dd628e857371b05a143efeec910b740e0a3a6fd01bda7e7e3b1b13bd0a3efa676511587875e7bfc88343c8c38b2a7bd2eeb2eca7ccb7f783c6cf476a2cfc971191bc56ae3a5d1477f5b11ff1af4ed195c6e52464dfb43728b928e75daa2a45fdd5c94f4d9c14549b7badd21264e1b32e143daf4ca14f7d9687c5dff051a15fd87f5c256665b58780bae9a624ea786fa1ffca1fe226d6434d4f0d921645e42b69d7af041ca8b8a21f8f6f8dd45e92740e27bd80ebf3d6be943f3797fc4fec83dbc97d0b3a8bd280d258d7461a7e06b55e4de41f48ce7f2f5f7b61fb8429e2fdc2b976752bb3ad83b742d6b6b00ec013ce6ae4cf6c9989b8d8a8dba3aad7762a67ab432d73115ee799d44b445597eea54856fd153a3a25722fab86bfbe949e76684cb942953e62df8bb5914a708fb73a6b051d11f8dd29fc324e0eae9a301a6b8cff4e8a7c97dd41a159d47c03d7f0d71906dc74b70eb59f75b08777f2cbff748db44b63cb839c4ad9632647ebaef98bf6477fdc8b7f1a07a9be799e7eb99d97785c4679741b439ab70d3afe972e341f5d333a849ce6185f45b960b4180e5996fc7726bc3bcb565bc199c16272fdef2ba498841706894e5bdfd5cd48714aeceeae32d9f97cfc971d77ccbe546c4797ab63ba3354a7acde12d67cf6185bcb77c874e3db72c29e1ea583468c744197cf9c70033def2fee29f675ab278cb5b7ae6d16bf42745b887d2fe60e65daad187f81f65b7baacb33a9c22cf2d7f34286bb75c6e45326fb7a250e9a1f81e79143adc8e58de1146e16f879e95a6679bf9e516e6703b223da351de91e8fc7c4bfbbb4d8a53c4f2e7160d921406b50ff1c721428f0af1379d18c31564ab5379f5704ee7f7b474cae2027f3e9f6f4ee7b715e138b54861bf94ced2d9a222b5ed54171ee3172e677233f25c46286211c69819a3cf9b91e79625a547e9118d151a53647b8129def209c55bcfa316543eba9ca93133e33a3934db105ebd45abc69379851f7d69cd3a2954d4e81d145d7ac66d46584adf8a4497bedb155dc68b465a2defef79da4927c80e0af021099322a41c418185afe854ff66367ad3566668d7bca16da782a4c76b7a074db7bc9ea4376f46580bcb729e5ca3d8ea3623cf2585f0f17624f1caea2d0b9d1919fda4bba80a8f106dfce745a09151947e02847de8f44c2b147a65d068a367fac4f2a1095d16816f15118191e85ba850f9e7aaef8d88ca9fd4ba5ff34292d07b4bd2657f5b0f91c2c9afb2b8cf90ad43ab5ba859decf1dc76c761805f09b61f9e39be9fc16532ecf3d8d627f0ebbaa82734e27b23f5df5ecd3926c75cf65a77a8eafcbb3cbede7d12f9e7dbdf84b7e5d64ab532fa387bef3577b7e5e82939e31c34649efe6f7204988cb3c4e91c8fe9e69257af68eb71fcb33e668324b769696a7d57496168b8bb56ad429c7c95738f0a28512be7ce9570b31a2f0d942600a2eb2581427b994f1cf39c3343e62293ca5797438743e6228580a9e829fe02a6c85b13c746d1bd26fe39986726ee74b879db298391ae7edc7e41a58216fc3a103b1a9b7281b0e3d09ebb00bc486435f1da71aaef436bccec77c97c7da1d1b8e0579deac6ea68a74de245d8eaf8d07d510bff11a5dade1d2337ece21c73173a451f839dfb6219ccfecc686a7f8f1c029389cd364c7531a0569b49a8ea7304b99c2953c3a94e2a11459201670d5a99243c752e1140fdd7a5ee1150f7d2bcce2a1cf28c1d51dc346071b653977b35196732e69e51adb90fe1bba8db27084f82d8f025fba50a97d3bf25cd228fc16ad9cb3c76d087b10e7d36b6c448224c72f6297e6c9e1da8d0d76d9c1a31ea351d07574eda577a0674fbb40a7385aa5730e9d66231264e3439495e0ea8ef1d06d3a78d4db9020ce250d1ae287541a053d336956c70fabc8d3cb1baffed2865754950b568158dec906ad28ce2d48e2299dbae1d0339b68c1671349d6a96b2e8d829ea3eb2f7a0762f9cd6b8761286c745ca5e327a690488e036e43e25b94a524c1b1db703845f348a1e2463a740845a79ed4383c397468054ad1291c870eb174cac6613cc3a6bbe1a70efe4d772587cbeeca14f7c9e1abaff18c87dcdf50d955eda56756169db24911f13fd578852fe74b7f36b49ea856f3b609a3dc380ed9556bf5d05a7de1a58c31161a539eb03205165aba7c1133cfe8548e4e0a15f2e6c621174d4c79e9393db0dfd04a7bb0b0a8269959da8d8edbedc67bbab71f1bbfd1f5671207dd055273dc46d1e7e4f88d1ef86b3aa122a3b73c839b117649ab7f8ee7b84ddc8c5858340abaa415360afa0db5b26814749b6e3f6e8b0457ad2b1e3af4dd6cfc6d46d873688dc27fa3e3df42058a26aa60920bcbb34cbbd1edcfad0867b90db734c6b4de70a84d4764dfc66fbafdaca35623c7c78d888e975448c74bb7e9f89b44437ab81129955efa0dd7d888702fc46386f80b711829fdc6b38cb7a76bf4a379b2b3fca6ab5ce66fdcda88709997d26d78b60d91ce6eda8cf0dfe8f86f3a03bcb51139c04b2a74809736fbb821c98642e98f225f7a8d0defe92c3ac50f9ddfbaa253361cba8545a7d8a15b59746a6d74346eea20148db2d228e8335de59ff16c462363336666c548df15c21467c6e1c797cecb93e4ed40976e05a1a1b00a4be1ea86a9706e472e2ea0f8e7ecbcf5f084f86bd4f09eb73fd3ed7375bf78e8a4aec28da53c74adabda5758a59eb0ee89f575c3d49cafb0ca439f49a2b3d729bd72d68679e83f74ea39741f2ea0d33cd013c0c36a0a2c4e1f73be9ebee63c645ae747afdce7742ad2ca539e1dba11b58d9efd32ba698f2263eea8517037a610c6c85d3bec58c8fae60ef3dc653cc7b8fd70116f41e89635f721fb6eb221540103811e9d3b0819aa8081b04709692da29d3b58a513b260d711baecdf4e9b1cabaccc56a7c2a3879ef1122d8575d8325466e277c9d4fe6a8087feb0407d7d55827c7d55eaebf2d05f9576e8cfcbe381bd03fd74e2b82a33ccc30ac59cde189d470665f441bec2290f8fe0b6915821bd2d60bf0ec1df588b9b47cfc9f1de7e723ce36d4bf2b68ec6779bd1b74ef53431d653fbec5ea7994c9af734971b94c1e5b5777fcee521c0ed961c60f1d9770eab5821c6086ef32c9bd1789bcf37efe98c66fbd968687cce9e369968684c3426addb9f9a6fbef96e26cfb66e3e676ef3b7cd6d9bd3b74ddb369f5d555953db9f6eea367f3fd3b79fccb9ed67f39ce6612ca0cfe6e18c8c8c8cf0810eddd4a91c877eea14c92daf385c5e7d3cc4bcfa57f8d006adaab7e1b3ab715377c369b81b1b936b9d9a3e3b65e3d3b3d769dc366a9a16b0ffda8c7f9dc56ee2a0711cbe9dc2e11556a981eb6e5a8722ad9cd355fe1cafb11dc9fecd6c4474784edc8f737f3aacd2a9e8d3b9ed6796aa3c1a668038003ccb1eb5715357b937cde734269ae73426ef79269b2ee8c68bfe997298bacaf0df741b93dbbc87e3932607b57193f7345401eb40e3f3f9111b5afb6fdc69edc7a9b0cacfe78fde7886e36fbef71e8edff87bef864215d0ca8fe3383e29ce8dd3bc2a3bdef93e9e1dbe8f8787fff0e793d622cfa73f9f34366ed3cd54e14c7ef20aab3c8debe82abf0ee73622eeb3e434feaad8e06387d6f94cbe43f34ca48dc8f32093fbf6681c7a7b313da7d9f1e561f21d26da695c706e6eba7d9cae7ee0a767cb8dd34dcf368bdaa434febacabd8a68bae9991c3e31ddf42a9482a60bb2f1a27f38265a556ff2d7cd93d3387c8275784e5321145f4f269c9e86db91da6fe339dcc64f9ed1b8c9442bacf2271fea9f269f6f721a37996868d0741b37f9a9674c3e63a27508eed659b97a7a93ef9a7cb722363e4ddd848fd34de7ed48fce93736f4c12718c8c9737438bce7e9d041e151a34eded3581e4f7be99cee701d1e4e03ca677e38105a513bee1e048807d90142dd33a891a00a70f8694edf4eddcc49eb10bc9969015787e08cbf83063dc7e1d3ebc9b367e4f98e3bc571dff193b797c7d358de0e7400d08afa412b8a7314ad7e83f3a0f5e43b68e5a8775e02a0e33e68e56ea0fb7668701b683d4d3fbd9d1e5e03adf3b9296f073ae73710fe0e4779ed30bf4367aa7043f13baf43f177f8c971b8b611e93c6807adfcd37978b61dd1bef337658737fce9285a3bcc9fbcc79bf2d01bcb0e87dd741e3876380d8d6587ebd0caeda07528fef493535a270ec7b61f1c2fcaf7fa815d9e7d3b39bc9e7e3ab73c5de5edc0940e9f0e3785e3d3e7a6687cbab629934f7f5b0f38bca34331e37e4daa21f8f7b62211be17c9b679eaa90c1baf2da6cd88de613a75e3d1a10a5807fee8a48e1f1e756a3f7a4eb7bf9dd2e1d161a770684c1e235d0e5639794febe8984ca3a0e3748c46a3a0d3746dd428e8a6aea5340a7a57a9e1d077d23abf86e7e82a0ffd54e5ebc971baaa7a1ce7ed07c7b367f2cc447114b06f7222fb263af302cedfe4aa7f5de5ea3fddd4d5e9271c4ee33dad7a9a6e283e0e0a55c0404edef34e5d749c2e2792793cece5ed408773d6783bf594dddc78c6da4dc7efc58b171b32361eb71b2aa627e13e54d8649636b721d377854cbafb63fa8df3f673f33a7ee69eb397e7737a79d3bd3cf46b1b62721a67ee394db7fbe3b9a9dbfd216d66aa70363efd713636feb61f9b472b13ed4d3ebda6c6fa534dcdf39e3e75b5e8697cb79f77a3dbafe9b65137bca69bbe1bcd8daef27393cfeeb9a9e3290c643a4d57f969bcb79f47d74d4eb36f763dcf4443abea697c764ca551d3df0f0d15b2dee43dfd3a93eff663a2f152c75baea8c25bc933de7ea6eff653721b5de6b3db2775fba64e739a6ef3d8edd7e82af795c93cf499c6f2d0b9aefad757e5a1973a22fb1be97907bbd9a8c7584cc7689ddc73bb534f3f697352a8d82d5430e52d5a4f5f198b87fcb15bd8aa1f1d001d5c336610c2ac0baad29f173d43e930839ef5b348b1e7e559a6b9956534cb2ed7ba20ccda32cbba5cb35cbbb2cc7b7ac330b7b8cd35af25dfae9eb97cdbe845a16fa4adb90cf35ab232df9cb4d1aa6597e5edd8352d5a9f4b2d93a0832e927647cfba75b0d241151d4cf900fc6ec9324677fbd6be45dfb6dea2e5fd7e8bdb10d55bf0ebd2e7727d5bdfe4b6be49ef79b2fd7541f0bd64df3697f2bda38d0abd67ae9bafef16b7edf46246eb506f9a47af4df22d48d2ca59bf924be7e47449a2439797343af43ea3d1b16bd269d2b6b6b05831c5d7f0bbc58a1d8c7936c1ef161d84f9ac343b559fe3b4ef5bbe9ef93a73d3b34c52927357b9670cc318938e415217542f8f5ef4922fc730f812f6bca3fe4885de57e6ceaaf067a657a6f2cd4cb8f42c2b394622612412e63d0fabd24b5dd0e6fbdcbde748b4aa9ee41877153e4b2f615ea2fbb84a12157a4ff29ee6ba5af441ec9bef766473cc7bdabde4b5867343cfe231459257e99c9bbaed1d8eca195af7cb4fe7a2733474a89f4437af35e8503f4649ce71b496e8503f9324e6d037a975b03ba23d46eb35a98916792e990906626a14476acd208b962c507c5682ed43fdcc5d0eb03cea774b0e8cb250f91ebf5baa0836a72c59b264c952636464646464f4ed377470308d21d3463d8557930bd7e5e465b55aad56aba3a3a3a3a3a317264b5bc992254b962c8da5b33416bdba3166cc9831636cac56abd5ca74747474744453234b962c59b264f9f6991a0640b3e22eec250c1fad56abd5eae8e8e8e8e8e8851943a68d7a4a1f7595196eb55aad56a5a3a3a3a323d20bf3c2bc302fcc0bb30149d5e0a35985ad60c99264b55aad56aba3d5d1d1d1d11173e12eec258c986d0cd556abd56a951d1d1d1d1d1d7d3b26009e99242b66c9b0111c3366c547abd56ac555d80a63e12c8c0576ad56abd56af5ed3395031764e6c0ad4e5ce098970485723f9d386e8ae1c69c968c1bf194c99d7cc231161c23e19808c74038e6c13139680c068e00a56f8f56de4e4545af7ecd1cbe7ddfaebc2e17afdba57da395c713bbbc9d768dd65927462b37693d495a3dd2ea9056d43f5a515fa395df3e76a14200d29c1c773ab957d4776fbf543821dbaf673a68dda553367e3dbb48d1173e69943191311e841042ee1632c320dbc74385742aa0cbeec95b5491e8c3f5cf033bcf792b72f5f6c3142a8472f8a0a1f7d151aff2b15c766b75522c4f820aa11c7ee875b263bea1aa5ef5d27bde5b9fee64578b7a3342134991b23ff888208c2f76bc3f221551faa1cb08e9d2d8308a6c75aa75f4ed99849af6ad69dd3ca8de696fcfdedb7e508d6a29df637efcf8794fa3fed12a3dcee8a35393f69be249f1a0d8bcbe27485e1f957f5ef2faa4fcf346a3795e982643db2b9397259b9d0f1d26b8e95507d5a87e615e89d649a295db683d69b4baf48c56549030df64bec22a37fea20f4b2f31c56ff4de975252262fcbbfaee20a14fc8bef39a48f3679597e1bd5d3cb5cb847b751d6d1ef0e1589e518ceed8f757642b4acfdf12c8bc2f7203f0ec6c752c6f8de7b48ab073e760e4dc841fb48f70a19c4e2d9a79867b75e956797cde5d9233b642ccffed87bbbbb77773de3666fee5eb7aac8fa7472d7119bbee70ddfb4de7b4df9bdf71ea4efbdf7da3242865dbbbb6bb58c70777777775dc7fc7e5ebbbbe7dbe1eeeeee7e2c23715b52c82e14b413efbdf776b7bdebf6c7ca084d269a1cb8e1cbe1f7bdf75e905ff6c29bf5e4f71e86f990d68307e17b5a1af27befc517e394c82088624418e9ee0f0c05199301b3fcfaba2557bf1ee1fa2383c9a80fb3ec8f1dbcf7de7befbdf75eef73a207f3681ac0d0813b22959de553c79503c391e56838db0dc9a674e26a666ed4984ba399341bda0dad463b69361a69d3b06b5a32c2d773f69813458abe29cba7b4501fe9bcc690b9eb881c5782d37af0f5b64308e5f7eeeeb64308217c43bc7c77aac7130c6fcafe80fd04c7bed2b3b7373ec246c986103adc88d47ca4fdc0c83a05dbdddddde5d7dbcaaf5b637e5daec775b8feba53d0dddd1709a74885f2dda551ebd695ac7b3705e1ebd5217a95524a19af48bf323ddb3ee2a0d08533bdcd8736f2999eed16f7f15c74caf499de525e995ea55b9ec96e364aca6bdf4e11ffa25b746631c6a0a1fe47a3bcbff281e934df9b0fd0c888371fd8c8c867fa6e3eecca67d27d64801042c9a79343f828f7b0f441d01f7c938777675a2fc58b5a8f10f6a3dd04cfd9a9f50c76b35116097aa410c2267677d7fa47fb096ee620cb98fbe94216980bdc36aa490b82aeaa4cbef71e6f44c068e9c84509c87c017eb9a0d2844cdb324c2302468b962ef2492702868bec8880e922b97c418980e9a275aaeaf8f6e7cfe7dc7e5e4af5dba9e5d171de0227bdddda84b621fd289bc1496a6a543b6f5ca3ba8b16305980c9024c1660be4081d1d23c0e6605e60b305dc07059659105182c1ccc0a8c8e15b26f91b1d2620629dc77a9aaccb220941b1130583a85e50a2260a6b03a2260aea0c259be5bc04cf1bb112102c6a244c05c31a147ee2d2260ac0d6a8163df2b1e1630568e940163058c153059c060012305982c60ae0033051829c0580163050c140f8c1460acbcb845b63ab566cc3fce02075d7ab63c46efbc46c98ec7801adc86b4d350fe52f9e7a49589ccf2d0e5171e030b1c7c5ea0f7f4cd4c154e56f135bcce136c437262c761f6c7f38c1b46a9dddce0748cc515cef276b270d978d5a8d5d4588c0d63793bcf49db15b6f2769e67d7a59dfeb915bbd35b13bbc141c155b854c96cfc73d31833db4fa4a62e5e70fc44a39ecf6c7c74a4692c66d3f80a5628695c054e638edb7e66b4340a0a5c9d592d4d3f520d7ad3d14ce99f9356a4554d98b7f3bcd4a8d2ccaa26cce3317589b4268ca9cbd1cc36e4f43556ca98d1980a35349e02c761384d7b16f3786ec6bc29385d1143bc1d3063fe798d959a2e2bc49491325246ca481929e34c477cd3f194b7f36c363662231b37b4d865afc4d7d08c7ee6a8515120ad6aaeeb023f780922491826389b1062fe797643e332a60f395b039e199615e70e39cc2e013d2b1e1af51cc7a6801b299fa5b042261a2b64ff398f39a3339cae888ae85be356741bbf11bde6e4996bcc9dfc06adf0ad99232efabe69b9e838361e5438ddfa98726c4522d569548ecdb9dc7441decef31c1baa51cf736c46de4fd334e5d87eaccc46632970a62e9dbad19833798c1e8bc8b7e8ee8fc86d0cc359dba8da643e7a45bd89c3ac10f8cf6574cae4cf590c9bd1a9e9cfe10a8e592136fe329f93e332afa7e77c33af9ecabca29eebf233bedb101b1f698d952870dba81b1e777fdc308dd199bc34ca444d5d4c5d3486028739cef653e31c6685e4fc1bc36158cce3c1f167eab23d5397cdf7f198babc9de79bdf74f3ed3cdfedcabe9de73dfddcd4e5f15061e3cf4d5e3a75c39f9bbe74eae4cf4d611ecfcd8d8e3f470c016f45e28dcee6b3a7dde84e5f8313b51bdd8db751aa42379db53b96e3307d36b51b1dcd679776a3abf119a6dde8669efb4cd36e74a5cf48a4cf48da8d6efbaca4dde8b4cf38ed46977d36a3dde8b0cf68b49b6e7d6e74d76734da8d6e5a9fd9d06e74f2b31bda8d2e7e56a3dde8e06727ed46f73eb3d16e74fdd90d363837a41b6e7de046274d2e4db482c0a6eb45596eb315816fc3b39b854d32dde86eba88f787e536db8f0dcfa05693f337dd8c96de797eb3fd9ce8ccaa51cf67709a374292c96bbafd1b1dceaf8d68519ceef4769edbd87e26dd8dc170cbe1c8a1c5ae73b00e2d76399ff9ae55ad3775d99de7357c97e7c62fdf4d459f593d9e1b4a5af5cef3475aadbe70ec190d5dcd0d1b9d89a6eba2c34e4d13ddedc7a2e9f6e113feca612a8ff9e75c57a1967f5e22adfe39696645e69f6b5d3591f16f8cafa62ed5f4e59f5753979ff6b819998d1a83bdf017d8a94921cb2c46d84a172cf3778b14a7481399e56bc6d4f40e26a484b2e34541192184d28256c7fb0346296374d94060e680b00db106b963a12637a107766910c5edae36fd840ac2e998a951038769bb2c171c3d4d4079901c4e3574e498711df00925dae9f8e0fcc44f78efedf0eb42693a281596f5b265bde4e8441b50fbde7b2fcb9cc0b13fed7a3fe1f0226c420e3be01004c5fd68200ac8a1093914c0049c59a9c2476f671f90afefbdb70400fc8fd389e3d699d6e746747c50651febbc3f6c8835c81d4b8c23d414a3077679e181694c060d99ced7dd5d8d3b5999be63d3580ba74527a751d3a227c7c2a19ec3e79757089f437f1e04af0e36aa2b693c06744e6325e89899536a6091830604518c5803878926c78463437befbd77a346e32544104431e2e9c606e7066777352e71f58b43d3a2183438b41a3a72ccb88e2a9c6bcf797f30a1443bf82eafefbd775579129dc24ce0d86b3cda76680c8665d5f9a8a6a3f11268e0715d3d50d7b5e39ca6699aa6699ab4818815b6eaa286255c57b441e3254410443122843e345ec25a614dcb01bb3c18608cc1b147d45b2e75fc734cd3eb75f9e5ec4157cfb398a05e844f099a0621fc81906611aff8754d8b5092708ac809c42cbf1eb1fc03c00f2000080282284604a2bdf7820001c00f1f36d4b083eac183069d1db4731d397004d9a10cd9e27cdddd7d37bb6d33e1096a5bf3757757c61b96b4f1de9abeeeee4e8dc1e0b7faf5ecd21eb03e0f8bb7b3ded38c049a4bca1a1936a3651ab462e5b94de34aa48d9b12cbc37222913459a5ca6f12365845e35ef6f5bdf766b4c5beeeeed6b868b4375f66d21e8cd6af363b551dfafa73f6200806f734de1febf26b3e20b990371e7cd1eb7bef452b1e6b34eec2b1bf855e77778f7efd4108213c65efc606e7945383e3468ef9782c6f1b3a4c4ed3d5a0333b389d120d241e5b0f0d95ed60355c364c1fd60f09800804067937740004704382be6f87c3e0e09f706efabb7d6c8e169dc3e0f8eb7c9c22f09ff73f5a811ed275303876f86257b95fd8d5f937368d73c39be568bb2dad445d7eb3fc734602c7fe98bc2cbf8eb3fdacb316aee9ebe0ebe673ce72706e6c4e35376c98686acc7025d2a665d8352d19e16bde1c12b7b325db4d41f85a876efea027fc4266a7b2d26e6abdb6c3ef0f6a6f5adb3b1f1c7fd3d94646abefc79d46f638c8714f43de5f91a7c723a90f1f0ff90baefaf87e3cb2eb77048ea111b8ba5f3c0f9daa7b04232b649f737a873d6e3f8f9ebce0b41d9e7d72696e55bd03f3b011fb763e82e090a9b0ac972debe59f2f6c2256d8aa0b6cf5cff9bd0f7491597e9db9582632cb3b6be1aa8f67afa77fceddee831d87489fc4870e2993b7c58b31e8366ab78b2441a7d6df7b1da3bf17a1f6ba99c3f0f66b66e676e6addfa33846fed121fe5e31d1c9c1c20b65e8408c2f27fe399c568ece43bfe44a3bad781006c93d9a63caf1d51526e06123232323247c9e6bcdb33ecf4d9d823cab03e90a9ab0ee74f3abc50ebcf0f277e5c594af26bf1acac089962084318223231c6481c51463a5e16c91022a7cc10b0eccb89203ec4a81184a90b8488219208410729ca9e6978b3088f034bf5c2441cc576ef6e0e62beacbe4c08cd50a9eb082177cd1aa34b1650b13b6e003246aba60940614be408229946153322289218cf185208c410aa0ad42192e300186195ad0041931982723566c61852a541153c505a55f2e9460c4c35f2e9450e58a474b5a51e6e19440075654c10531c0410fac40026705185ab3802838b1658a1198710422c8282e6082162464e942145fd4a007172be862c78d4d021558c620410bac488117cb850faec000092b3001136058d1024dcb15baccd828410c9ea045155b5c49e30811729ce9c6efca0a295f3929a508608821ed200ca501fcae76b0fa1dbf5caca00bd4b3c3e79e7dd927fb693720644cb853a3d84f379ab0c208a898c10a246cc1c7341f8fea8a323441cb1434c68411069ff5dd00271fc718638cac0557a1ece6ce2f175e7cf9fee5c2084e7c855c0db2183ba19f752984046bc0477f1dd308bdb2ec88f037aa28fe6d14fe5128aa7ffea8021ad5acfa0434aabd9404aebdae966fbfc119cff0f9c2477186ac7f4fefa2d66317bbfd6cd747ac3fbc9e411ab4fef615215b1edcae3edb1d6ebbb84119289a2e6ed06c04d7ce7013d0a977844f5d2ea646b113ae700505553cb1040ec0f8ecacf1524a8b064e206305093265baf8487aa25ca358e7dfd71c7098410bc400450c840003323e95fba745129870c59632c4e08a18f8ece3712a44410331541063822d7cb6caa953dc3f7716fcf3f978381e2c21082b29539820069f5dcddf4ecde7e6771185a319e409f97220010b4f500205475d84d9c1d10b76945454dc400657aa08430f6460031f28fd514e762793f4ca99f6edc088528c333a3f1e0e9ef1707b08218410728d628ee34cdbaf962c5cf095835ac8ea7a61a3d5e3f2ebcb3a6048fc7a0372783cd0677d0dc02487f9be480d29bc7082490e63747103297ebbb0819500fc7681850bcf53a8f867adf198b77c42ed75d2af2e12990ff90a8efdeab8e565c4523ab590d6a1975d1d9112381c0e83c3657cbff4ba68bce58db2780a532989c145b7ea7c31cf53de72a24e5d6e391b49f1b1aecb79fbb9e872de3d5a87f8c7b52f7c9d656a94d6284b0c6e7a9d6f5996ff70814e41b73c09ebc0fc9633198208ae7fbbc062c6433fbdc565b06b96d71d56be63fcca1c12d03cd367b79cc0cacffc6e39cac14a0758c8a04b3a3bae510cbd4e22d1d43b3c3459e4800aab2e53a488f1a9a77f5c8841836bcb1329f847fae7a8c7037d9e07e11e8f019eb08230b468e2085e90e1f3686592c33fcec2ed5713cff4615f93e9d43bec5c05b72f805f2d4198f233bf2b1d78f96a7a4d28fd76e10589968d8512f4756bfb617e653c289b27778cb1351863f482352d0bc3ac69f9e218c3b2e69cd3b2ae3931ec9a976559d69cd31a018431769bcd3c9c1a47865e7007e1e6cc6954f4a1cdbce6a793c699622c0321b4bcea98208411426959324a08218c313a9441b63cb8e8cbd2e5ee9bb940a3a6579d977eb9e9d4a9e8323a8c5107e56377e972eff9ecd6b22c6b3f6ecc79392debbaa6354d2f99eb94e5193b079157c85667b6a5592c9d0631c569cb2f8f7e5153a32677ccf3baae6b4e2ccbb00b9b73ceebba260d72b983e666292dd4b3945246eed81db9de89969cd39216e43e76c3ee96318af9f235fcaeb26439238b952ace786b83efbd39e6f53216205708219bf1cc0c9fef7b1032f36ec7d8af9737099625e56a814f0c583e83ddcfebebf2e519211a85798550335dd7c58f75dd0d61774308df9bdd3de17cb28bdde428864bc6fd4bcad9a898c3cdec437f754a79f19cd725a5b4649731775dd6b46454410cd370938f3733c827a5554ddf2ba594b223ec1804f9e4f3dde816bda755b25bb8c3fb7b4fc618a3cba8c48957aa53450d828e29433334234d4002b3154030381c148dc643822869ba0314800f91ae504e9c0d83499005218aa220a40c22c01000080043008c6ab609820f066add6b28cdba8be815ccd6ef959445d8275b5675c6028a89310e3187c708fec4e9fcf41329bee07292d3cdaadde2d9374cc5dcf7a38c7d7866582d164be8a3ccaceb16933e07dcf0c0f05b25b3e402071cb4a9c865cc7288332ab02f3ded698b52a29f4cf0d5426bb72e9116dacd56db726d3ef9e03a72af78f332d53b06f467e2b10d833e47f46a46ba125c7294bc65d43b366826e8fd93419471641a8375920710811a40bb2547cc717496a9fe31a06c7ac640308cabac71fbaa2c697945c692243651ba1f3cafc62cfac7c005fc755b2bf24b9d0b9c8443b922c20a61cfbf3e3a951dbbd99457c7f4d9ba16ac063087f2f9803e95d49845ccbb52a720c9d48379af070bf409ae4e6699ea1b073437c185ba977c82f8950ca72b424916ae4e0281577f682c1a4e9321fc6280650385d4cbed5b909123197496617bb621f428ee7d37e923877f5142edde47cd244f624f161fc9d1a24ffdc256d0da0cb9c1a30381967e9c78f289d34243d400b95972ccae37df9a6033c82a486b0ed8b3e29c8727b971a6218c10bfee18403799c643e8e15a403e607f0a4a663020a1ff38a170c4ee856056525abf4c0d68df71474607613e5f7bf551208a3a0cd6cf98ca670b2d9d3ecf01a749ac18c18adbc4efc458d7f9d3555bb3566934600805ebf344da292a09de69e4e5f0056219eb1d071aa66e1c84068eeb2c41064f8edca07b050e5cdc39aee4aed6656c6e955b19828058f46572c5cf70188ce5efa809c2a9bc777715f6d1fd0fad03f0591d1a433e169e989266ba71548033ea9c2442c9948c5de82c8c460001cd1319c19ffb33124e104a67989f3131c4c2995928a2e4da23e38413bff541292596b924fb169c4368d4aaebf2812af053329162a13196dd00cfa9f3400fdaee9d48d6c3877625a8a74b8ca58ac4597816ff248ac3586d47cd07152f8ab695a1724cc3d3ef605b08a5fd00fca21ec823a0cfbb38cfd93228fac2e02af2d3dd760c08f5d628c5873c26b43b49ca192e8e7387239f43d633ea8a23f3baa2a46e6c01fffca4923f54e33c63782fd79b57ba7c69d6df8ee34c276c9215d881e811b40109262b81b57efa011f31e80ac18627913beef70daf0998e85351b9b6c2d26026a04df52b25d516a1c390c8ddaf99d19102a0782823b5fa3413f8169309ee79d425a71d63f1599027b5868b7f17c3e6286eaeaac60148ca4e27831a08dbddd3d7a4a811b91d4c0b4fb9a0a07a5e9ab2a2bfa623a26ea107cc8eaca6893b32232ba8189fc19501d4103a3d9a31e187965c20cf7624c71742c221a02dc82beedfd015f5cc5d4c22f8887a944cca0ead74ae680aad7eb53975b193c74e011e2e56508fb6092587225f9c9d8e669c163988a38b30b8ca32e7f99450b642196071ab88a03cbd05395c213e6c214cc2011c2a02b7dfe580488995cbb7514a21e66ce54f1f601874225c5bbd778ca0654c2a42e30f89314880ad841694fd0e98d69c66a1ad5542b05fa265cf16dfa318bf20e653f9e776e68fd7f46f9ff7d13fb7b138c4d9e1d63004212d235f4fa6d71cf47884f48eeacac798d31cbd298f471241e191a90ec727d0ef5ec34657df515d7323cc2bd6742004bacfc9b9dafd08a0bbf46af3d27f4ffe6568267859233f51e7cebd567f4072dcb8219239cd975e4430ee8704c509830ef51c541a87a0f21b25fd080a2d3ef6d2f187aeaa382b05a398162da094f99d169ed00b832c2a9c3221b4fccaf993972bcb4ad3f791822f868a2f9bea16659017c01dde70e53e63156390b7c96345c01bf0190b1468784275593db2ca286f4f27a4380b51278502a33727768873b8714b28a5a205828e6a8e81ba474b224e6a7fe99349bf39635e6dd765b2d43f9047380755b0f42f1e38eb5bbd171a706716534890796165ed6f15927b3c9fd42866e8e9547d52cb94fe5d2be17e49a4577429a38387f6fb90414b6943942cfffaf3f5160e37d111c55303f2b6c5206b72b2b4fe9d9e996d1ce75b9ec8835e56cda0a06c80d0e0df0486e535b32c6d2cf541398b511b87eea58cd2bec28045592e0d128f53b920316992d6d11ede5d219068348beeecf9638444c30e4653dd217e621a71b74c14217cf7d8a8ac9bdecfc1364b0241674e93fe628b62f478b9ac6604e8991b93540511bcd2cb800da0661acc9f07154cc8ac62fa5224cdad5f443558682886f4f4c672ad29736de832ca1f672dc3b4cd471133b9d316ad7f76fa093d5f35ee263825139345063d6ef1b233f8f86337a9e89fc32c4ce24fe844627560a3463c40f284de989ec6ddc8dcb507cccf5549846fe6db98d06c84946cbf9a12f49d14a050b4ff88af29a72fdd730fc795efeef169ddfc6c1d664f20d86d5ee71d946c9771680dbe230241ed71c888befb370e68926454941218994ec2bed35ea670c8f6f3f6f402baf79030715b51073b0ad0f84e315ac9bacbc6d23d248b0a192c1f47f1a92fe9724a13f0ed9427f1b9d20255ee203f7afc2fec3160e655ac8a4a494970b60d1efdb3239f4077026ffec798be36ca2d5493ca20a4b518cc3b7007e849fe6c23468ab312055e4ace0a75e4e0f29bb268d2da42723296c56bc48e58001ce177221403f923da65bf0a862b553c7e6258236a1e1d51e2484ae68ff411a26a45239f49c750b91ce3e98c3c9751467318b29b01cffd8c48dc34a7354dfc5ec89d18b089c6fee4be38372882081b70f6b1325ca646c010b6cf0e307f7431dbfdb867ffa3f689879e0bcb523f74d44c01f1a42e03c06aa147d95b62a4b2096311d05e63319d4bb6bc126153807ba11d69adcad6e132df9343a36fe8bdc644dc12b6c008a1e740733daeaee7dcfc4ce2dbe250f52a02ba1d05c1401573d8ae9a0516d58267fc681301613340dc2c4e8acbad3b8d6a9f12ed92e1d93b5e04e9cc4ba0450d512f3fb4d558427599fe3f41d7005c4946cf6210a0949fd9b6ffe01a4c7dad4a15b4b99cb21230b0fab502af39792500eaef5eda1712119c7bf5b80f47d75fa0048628a79d64bdb10b8cee4d1fb67d2aa35fed7fc699405498c563d5ff695ef6f0afb1b870f7d2ced0894d1a2c2a5a66e529f49e0aa4161caae69cd55500cd320230f348e2bb53c175a6570534630464e621c5e2a2cef4c8a4ee47f28946256778c7e4843b4edef0fce40f6fa33ce0de9407874bdf8f3965df647be07706a4e59b4edb104c001eaeb481fb9115c15123a4e085fa30b841c21bdc47ac0f1eb5a1083794c3844b22a91fa8f652f40150157ae76744bcda58788e9a209400dbb9c5511c1c9aee9285a6c7673df7c33121c5aa06bd18021351080211592102dc23c33f24c3f2eefe10828a3ae6f565f6f983f1fae6274c6a59c5df295289308adae83927a66623c8b4985bdf9ecaeb2ec693c7a6ec9efaeb5c7bc8a6890b3ad164489709fdbd9b12e1c40005a112a983785ee5b2bf83c09ea4e902c96c8e308a9a966665381f135202f8683125a84b04951055be4b8b818438445eb7a20e8215302bd198c69fc6668481187aed83ee496fa7f662f19368a9728d8191a6e1c437df07691c0a3a4298e8ea7e625a754fcb9031a3ab5cb0c4f76f74797b292aabdc0e2c797f9ea5515ad8c2b42ea3dc8fe1c258d1d15292fd9ad7a12d62181d8796f8f2fd3995603fba961dce3069dfd6e621128e050ec15a3cb401a7b7ca16fa632bfc5b59d243c874a7a491792013410a596de384c30fa599511a8f94c8a450ab1b0542a0f3701811cdaa1365cb1939634b34ab09f4aeb46285a4aea091f7dc03dd07bc2579012e0ad743b8211d2435aee5e7277317cdd4f5fdd1f18d3f31259b5dc4135eedd895e924e910e622cfd7afcac13b03d9ba40319ba453c9d5296fe62b99b187b730acb7481b15b32bb241c73e65b420bccc95606cc32cb9a11384ec589218a16145d97f6d13b61e18b670633945d258ab6134cd006ae598cb2e445135a2dde37e8fdccd93d39fc9c09fad3a36bc36445efab63dd65f481f0858328c3fd602f30ec43ad1e386746d3b6edeb3e2c87bd5d1841b4e07b4453f6992ba6422dc885eeb8dd90c6442086298f26bc8b4ed290b80dffa53ae2054c33552b6b7cb6a5f82a4378939f524948ef9b2f5c9bce724dd88a50d70de61438d3e65081d210fd24b1ae92e03381c338e5ff5d2a9bf839beef034f0fc0a41519cdcc8900295fde4471a94752cb998e619bab7737c8172f5598c941ab8129d38979c88e06f6e851f0ad438d8572c5475434513fdcdd99f8e0849f472d51aa20259ecd64a45125d4b37781456152dea2c174d760981c470587e76a0be59063e405ed73b6722ec9961c7a6266bf125641b8f96e35157834e593a5e4e457f50efbaea4c767079e883080694e2f79432867558caee3ae685b14c011bf2f59f9d43d0cb1ef0c4245ef26c8b90fd69a9c78094398283e9fd220bf8a16d76b96466a63a9d4d3f92ddf0601dc24f775078331fc3669d64adf6849b6a253be66563365e4b5ae2612a9a5c77ea24e51aec80f0da1ccaee81aa820921376ed90871ea1bd80ac69232bf461b4800b8a0c42f1445e9c06e613242647456fdc3cd2141283ad6624e9da6739b3febb6a26a5b7284c3c7bc5a84c73ac12a7045eedf91c608783236845c6d68bc510c2e986871fc9fd21a3a579d759b39b1d002030fd6ab799a3e5955dc6c5291767a4900d18709b98e9a569712ea4a2e69143b7725041c0e0157a16ad269edd06a406176c19068d8201900387bb4bd8c89b152bfa3d47eaf8374f1a46a36f650705453e46e4a32c20e04e7fc090a4fcc8d3823acb539f943cf4dead779b25cdb8e16a2be4929bf18c6393219c952090dba2d6c35b87149312a54d9949e0cbd023e105d57683aabb62337351a70f572e3cca716fbb40fe7b05876332ce8236b30a49ff073c21524f05adb89e42a7a1fc471de3a0ef6aa80e94a0e58958c0dfab688361b43aa3490413d4cbe2cd874495811ecf0b8c3acc345a714d51f92a73fc8507babd77eb80dc1fb9b4d840a950feb6e6a61796dc666090eac2bcf771b3e4ed25b7e88ce254aca73813c60920589cb74b91722e0ed7170c0b28b27c505c4b4f8f2f52c5858fcd5dbd4e6b3f61543076edfcb3c72e2a7f1fd05c853acb16a3b83485f8cde6cb36415001446a6546480731ae6ca314526c0804c6276b0ec842965636854f4344e80d2207bcbce18a00142020057a27057258bfc5170cc5f094a15968531098f232e1d9a90ea2c6453bda88b91218e2abd10722c1350ca188624197041877106dcd46bc86ae305b995943e931006483a1e02a204585cc6746a480ca2d2e5b2950952e4264276cd24a02c618bb9b53e2bf6c7ac5327bd03fc6186e4712313cce77db5df66c821730555591339e12ca949ea0a3b88a16b6cc534d3f913323a07dd2b87a47695e6b56d1675d78561d99913a951bd5da9b6ae54a532cc2f8cc3e59de18f4684b907d00f23606789ad30014c1bcf13022726c9cc8f902a73758795214a973c23e956df5009eaa339d580e691902ce0a522f92b8721bc093f5514a071413f4faa5da03f42b6edde89b68891a646f9634f2f92040b0e51d01995b78273925683ced5bb47051437b03f6a224eb8c644deb42a50924545de7ca06e7ec980432ae0b9f5edcad6fd7948477f0389af4890a67fddaa7d1bf4cba3f5ad2063e4047491852c60ee626cfb6eb0ab206b1db520023cbabbc2c902d9016c574e6fdf340a22bc0152c43e4d17c974dfaacbc6ea7427ba24a2c80953b1ff77b260c1648c6bd06491f0afec7ee945c6f6bfceb8af2aff7fc5ad5c2f696bdfb7955435777b1eaf5a32fae51d0e60bbc89123fb5a7ddb6ea825331b27aa83f7025a26751c21deb585beeee49d369afc141fbaaa4e3539430473aef7f555a2b18c7d4090d9b4373e73a1f6d3a867c35679f6e129ad0453ee71e25381f937b53d8c43cf5afd77dfe05e80e87805b2042a2ac04f518997cdc54412af888dc274e16b27d3c3eec54e0e7591e38550f8efeda758103a994ff3eda27ee57c8c27d26549e55c64b1a243ae44f6a94f5e0773a4c46c8971d0b8ee0449795cab0eb4f2274b145f3ce3cecd8a0e99dc4672743a1b324c744d3e67ea67b3717a4082b665f47e70a91ebdc14b46ff031ef39f8b1ee705488ca3acd1e3ab7c863c33d16b53864f539265a4eae865b312c0cbebde885e0602bc2bb0f3c1a4a35c023d4c1953af230db47c528052c70653ba01aff0e66ee6e478698157181bf0726016e9e3a039b0541f1aa5b734259f333e8109feffb2f3873f3d091b3c0d2bbb89df7e0ac886e0024ba40a063640bf6247025d83f708728a6259eb4577f9f9e838dac3b3817de87865d58fde73fd73a144851ec7977fcdf3e8c58f2d4ae00ca4fd0ff4e7880f6e48b1a70afe7aa21708f805d07b5fceffcd9f5bccedaa3b7081495b00a0bb5b48677b20430bf5982cd780a11313716bbf69a9db63f560dc97cfe60dace7794373cf75c9d1e46d7d87216b1ce28a53fb850a9b527663e3587290c2f63c1331798d697712ce04c04020ba94e78fec53e03315438b1c364725cae7c5def7d26c23092c8799695b14c584b42b8a0e8045aabebe4c5f5d375f0b51dfeb7f69968e345bc126a03ed056bc23e419f70192a1084ff74a55191e6ebeb40a5393adfb734a350fd54c21e3ddd95cab096973f091c4b33247f2e62ffd7d1d607197b89cc375b0b73de76493e8fc57d5793842ab9dbb68fe6cd505be10fe0e9f43bad2362c305c550484ff73a1353e4ccd35d7ed295d137370ab123cf3a259ff74bbcc1d9e372eafb27ff0099fb0717fe4683b78ba51e0ed6a66875d789183870ec5c3b1662d3c1a66cac50ec25c3cad1443082c3addf32a3aaa9fc4753237914075b17bc31afc28cbe90eaf2781710f1b1f6fa0f4a0076f8c35f9b2ef007030a37a1fdcb907a60612710f53d7f45ad3c1aabc3f939d5d88c31c131d26d4a1cc724d231b8b87b3f1f962c685ba4dcb008410285efa1926de0583628722a3f4039885467dc8810424104ab9ddfc2d24c88f6e1386d37858c3c106572e71b82b69cd9b9bef17084c7e9bb617359e300e1e784800560c8445c140177830f12be2356630d025d50818c47f62dfc553c4fa857b05c544782c01b91d839dc985bd2d0894e74065ac606eed06b86943a5702b1a86b5bb350013df3e224deed381b2c70934d7dcc5cc25edc52545b2c1c44460634dabbe5a7ef369c45c074be0b307d2bcc536a12b880b7d5929bd7069327a8c9db8b7efd17ebe5d425872631a041cdb07e5da2a5918a48079d8b5949e661c42cd0bd984bfbda7308457f45f8d051820211ae5a8b94644910a6d1fcfd79c0500bae1c2f6a71c653817bad82c53f18292c7e17bdb48464cd645332c24407a627cc9732bc7c48c4f71d38c71e9171135210c4f32b5814b9495164992ae13a3f33b5d94b8e562a6d24f604321d287edaf8fa3abf6b5dc1eb32acb845ceeefe731e04d1203b68801dd6ea1d881c314af6dfa10568a5c0543df037cd5a4bcee39b9ac54d7ef6b703d04b637c1e31c13958bde453a734a5a9eb689325a35944152a964de386e2041c365e72f536a3c032339cf558277f3d1c874663a7ca908942f342147afaa43e7749cdb1dfb87630ad65c4daf7fc57ce091375a1a8bd4c717d9eaeb64bb7356ee2cd3edec0a7c2aeb9e13f0a183eaca3afb90f4b9ac6a8bc3ff06a11d6250003e8759ef50ff9279e293a8509d3b7c87f7f91358a39d8d77a74bae68d63eb85d34dde707fb2e221add5d9db68aa2780b977b83c2fae8fbc6da5b562d4fb56298ebab32099bfdeb28784b2e89605f0b60070e372d13656a5d04f86de8776e7ae4aab0e4ef7e2555a02613dd7b82eeee68fa05099aaa37f380e91ef7817837de077cfb3668377172ae4cf19502f19dd9294c67eb3dbcb1a3868dbcd61acb11ffa584615a5a218fabd152acc8931f685e6b2f660c7d8f5b24d3abb9950c975b0a878bb95c25785b79a087bbbd8655ce0119b9f8f0fd94243772cdb13943eb36eaa1535e74eb77b0cce0ea7e5f05a96c212719cb945233a552a68df1e3aca0fb5e9e334de3e081359148e6c78216eb549b208a7c161e782e2731b55986cbc640b2cdebb21aaa85683d73b9703424f5ce80a4c9b1befb96197a07a6874c312822936481592a66077c150b76000b24fac99251b4fc072233414053a2d87a96fc16bfd281ce0a8b1bc86254fb53ccd50c12c04a4fff99961fae7e647bcfa4ed76b4fcdf914617d8feb0fda84c95a3435905bbdde9b0ba71160bbb95a57b942d799223fbf2a05239c68be8050fa514f285e71470b1d0e92600f80cf780477d7482cc7ba4b4416a93c026cd06926d345b4836916c90d9a0b245678bca06992d920d349b4836d06ca18d09f21dc6832175053ea43247a95afaf2f6739bf9df32e249ea6e2d58c3a631df0f5d7db2f34a38c99920b3fa39b8f907c4b9c537356053554cc6c60dc965c1953352373dc75e385169f9a62a3341bb2f4ca183061770b8abc581c2cd6781404429cb3f2ed64b1af327699f9814e14e6323eae1a64109235b2b058f2e19b65be3f09d475d4ae5945179e37b89693df2b9897b70052323145e158f4b8e23804910436b7e3b0d545d233c6dbc98c1f1d411354b409972aefc184803e442d89479ceea67ccc568297031f41441bb97ea5691dcff490fe35449920afc14a3833769cb24e3ed292ae4e266b9744aebc552dfac971c3d985b205e12d0e9bb4a35afd2c46c8790de9a34a1451f07a553244bc286e222bae82f7e2d064408b3aee853f54a45c056d68fa5e132fdf96448f687e5aba5e9543fed3ddd680fee02eeac3a2d721b5e3836bb742b0bc72eb9ac6f5583bdc08599452704cd6fe630a4a46edaaadb8be6682af6999a2a3cb7f37ec39def416514b2f7a8b3f53a29c37f8168bd2e9ce8061e36c2183609041ccc8b0fa562dbb40f6726d8daea31e2fc9ccc969a7ebe1a731c6fe9af545005432c6a62a524e3c865a32990a7f04098432330c2ea262c2c2546e87236ce2b90f398d0fe4d960d7508d92ffa10f95e1f1bcdf77a3445fb83b8e5e61d1b64d20e90e504ef120b6cefb912134165bd8915f223dc56c1953f57374a01f5f5a89cdc33b47d3fe2e56e41b11b37606c90a398ee12bcd2077256c5d478d81c8bee0ecc91f2b7ea1f74c200eb429e8cb7d91e494df9a4f18430e7d5a2008d2844247795d185ab332a10e261744a1d80d2c42cf3ed6218e7c36332b9494c374d5ff8c838136272906c5b5b6d1b1a6cb2b1d6133b8d88f48c0913219dbcd33b33d4f474b2707a4c33c3ec31449ad634bc904207024986e4e61b7eb1bb1bb3eb43e46c8721c5e3a78a8aacada3f7411403624645271e455c60a5376ebff5b449fdc7548fb52eb0dfa88664a58ac037c477803857e05fce009f10fb4e5c0e7abe5c1da63cc8d49176dcea9db4d3cb1771dae2a6a9c175a157220df36c0eefd320d2fd1345d1be9542b224a33bdb476d42bc1e6adb49e85d284507c294a968e9dc6b221ba4da186bbb03504d9a87ca044b28665ed402178db2cd98becb8811a6089d793b336af3e20b20e9e6f12cf42cb06446518c93771754f3debd34224e0d7febad821a50129c75cb7bb30e5b8fea59e845ec578c1ba8f096151124229c32e1d7a1dd879b7c8f0731ab04493cb2a02786d31864c52c8d9e488d5f42ea0f0b5e02285ddab35979d6f0ba9a8b56ba2ae1b510dea7b00c6040b7f92bd3bd72b6a7f6cf52bf114a70f14758dd56dc98212b3f745a7bae4cb119d49d3031eb4bb6859019bccfaa4976aa800e2294df8ba0843df7b4f25e39529e283a9e2b7b3ae669ea5b9e01c17db2d59dfe5167e6bea5312302260fe44601b5ec3a562722be64810613305abf8b1b27ed818d75de815f021acce3ac09d70ec91e4ae22a083d5d04dfaef74c0f0e95a43cc3412738c96db90feee22c639f7808d5315e7fb8c6c5a5751d195eb8257590e52dae22ed09f4d5f5434220a816c0ae41e5edc237070bffa9a4bbf82e0bfc0c61775400849ee00a7aaffadec4a96c163e7e912503ecaf27d434fac56382fc72b845054de72b1b60310eaf67b0874461e8e0f0e3a067b311421e636c9fd137d16118d68871cad085b8c7223bb18ab838f8d145061616f679e1c4f631c4d6446233d0a38a88d21d0efebf27d269409044c869aea0a03041575c135badab12ae651adfa583affbd1a99af43cb1c0f574a003407ab93c6d542a196b4993de7645c794112d098dfbe1d639ee8ac6fa311464c50740d1fc89a6fc8270d182bc3100cd5b392b727e6747829033f479d015aa039a372a04cacba802ee82146093bbd4ea07001d01ea785948e568939d0067a1edb4db684062d0df3eef53686660d21a82d976bcd9ab9f6406b87d950e19313980feb25f667949495cd70904451bbf29dd90d7cbc5b252bdda4c61e0b81a3ba5721652863348acb30d1a1cb3ed68b63642bb308bbf2092cdabae919806a7451042546a528d9a5ff524a13341755a98ed47e881f2265d791ff6292b1a231dc2640b74776631633133ae4161eb657a96c7d37d6358d644b74c0789c483ac5284f7d6eefca2fd0b09a2d954810a470ee5acd8f0bec619f0c1aae436e33c01694fa39be3e666d864f1c4b2b1ddf73ca0c904f507f480a0cebeaeb5f56d1b0ad304920ed27475896404176e3f38a9029f4fbee2b0ba3f31013385d6a639e8ccebf65b8b6963b4a415d60a8b7b51a0b7bdb14192597c2337d0d8070b62b225230747f65b94814c5fa57b12d3ec9cc4b23683a9e807a8c82ec7968d15b78ce039bc9ebf2641c472086f02e183fb3606dd8e9e6072be189409428f904ed53581047f35f24719b3ec0146047833c6a3382a9d4190c80a453087f18b94cc8e365e4aec98c83765c800c377f6918ccd9d94b82ebac7ea917cba912a9c2c16559dede7502522809c7ded28fc8afdbdb109ffb14dc38d8294227e212b1d62d2389de45be17e1d69b2ad3c45b868293e139c7a914bac05b1673624c2478c80454cfc784e0a42e79133d87f000941f13743238971c2bfcb195ed3c4b81f851d4b185b4c620fb51024797bd44b8feffcc64d404bb8e96322699bf090b3d79341e506ebe495f1f8f0a80ec41aa3799c64acd878c49dcf8557b87b0f7067a6f362a5d54c2729bff285d874b87b3623e0744393ed8a549eec810c00d1ad4ab5974bb31872252e9a3d897285467faa5b4b8696b1eb62a929a6c8802510d501cd6ef8e27dd3201aadc6d40e8363c11b0d0af6714cc90d49fc40a363a94dd4de2d39ba6aa4b1e5521beb9394dee7cb37fcddfa6ef79e8389bc9edd47d1ca317c2fefebc6ed5c5aa5248e1747e02cd6718f06d7654b2f8700f6884bb9e8a981e87a748fbc6d5ea2efb63de532317202032cf0980aced40850d8d17a712ad654e2b8a15fc68e1f3d1ade04f2ea5f0dcae5f2404467f3ad161da42af60d0f38e37a328d471a4a75f26ce2674a748b396a75473ca07d21a2cdc0a494f8f7c72883f979c6e4b8303f4448ac159b14a121c6c217b31bccefc30d1b0b76d1bc3c6303e405d98827621723982cfbc02cf9a584207e674af1a7fec755c6c88748e1e0d9dd7811951014850cb8e4f3221c06ec067edfcd6028762af1103dde0a5fce9f597351ef4bb28d60406e5a120b99e2453c6623c41bc53312ecc5a48e0d8d1a24b312dfbbff515bfcccc8ff0970eac768562bdc86fa41ba71588f66cd0463e0a210bc39e2786b361153c914cc036698fee73ec5763c9a791bc9f00c45d17271caeba7639ed96c1f2240ad35db6c345db130d2fcb3c158cbec99a8d85746e2f1ea486de69efb20111e17fe7c372742030c9f95ea317335e77d0e4a072e0c45a5cd7af9e90640fefadecf2343efbc587a5a0870ab291784b84e5a2daa49b040ac36c1224e8c29a13b030d03a2442c755969ac660ad40595c57d2829315d84a901513ff6870722115d80e35315aa7432c4ab120155b84f00d350ebd556e1230ca61860ff792d2eba2aa8e57e284cb2885d66754de91b3aff24fd7a8cda9a0006eda18cadf44fb0fc12bc55dc957f23514ca7770a4f7613c6c1e47afa3e38b0cc5e820d208624b08c007cc64fd6da1002c1e8041e59d0661f73ae7f49cf056a93dfc9007b3c66137575f74b809830f73c06c66d2001c5ac255f112a8454c7027c7bef9cb8705170a1e56e3614fa1c06217c6f309492d0bcc32b9f679c2a0fd7bf0d50cd7a9d0903edab6f7b255a4cbb12453d912cffa395d18a2e42428f32c8a4cc7e73084e5ee9e91e13bad923a4fabcbde69820656463630e957e82b5a26e8eb94e01a7f1057a74daa4f7dc188fdf23a4a2870418413a36950b8aedc290289441aabb1b0ddd77704521bba94997b69a61294f8e52422fee256db2e3bb172f104af144fec3a9b9e0dc01b1ee91f4db390eaace8fabd9d98f9ddf893e8c40b73d68ae7b7e6ecde869be70cc5c5d83c9d1b28f79a0cf994708133e94908db032d02b0d99b806aa2ea7b99eacc17dac02953d32741138c2f8f9a2bd1abd26add412840b39ae394a92cd00c226705ce183c0c8f04004901248f285d6d5311599d1a707e2bf38601c0dfba157fdfb4e649cfd79b21f0c3a61ac993a20b2c468eb1cb3b5279f1c3396de6ed334a5370f4d3a47b43e3dd1b7aabd8d761f16788ca488f222b53e6685dc1e50a62c5860a665df9343bb0b1dc60c1d3f5c1ca4530928ab3a354f4d9aec524ca5c77c6b8ed20699b35ba13d5e24db4048faed988a08963e60eb1b9a747964f9725cd047a8e07ab1b58b1485f1bdf859801ff33fcda6caf0b38bbe588d3c2730bd110a9e277bb5925c24672f14ba3a22195d259296b455742934a1f526458114c330ae4c03f9264fb88ca19c961284bfd1ebe2b9f9bb601299f8fb825e8b458a4bece6a6ffef7491cfa8c40484b887a32f479a1655cd5f2b23027a0507fe8282aec18f1659d2f5f42556a52944e01d9850ff526d5cd3e94ebbe8d0487377364eab1fba21aa2238f4e495794d66064588b4605ef306215ece798ad358d126bc6651b69d735bbabe01427487a266f85eac3cc266c4bfe02ba9ab69cc45c5c8ed1b6b4d448fcd32d69a61b444c7f7db98e0757351ca40d882076a5605ed1d56771b2f1027ea31277a12b961af0e24d51299b2261a7bacc41a288099ce838c6febeafeb8476c1591a63de62d007b924fd2f6f827b057f2814c564bd4ec61f63c602905e9abc9059a204a4761c0cc88c66d584bdad5cba0d38a685e0518c01b2c584d7fe6366ed51ce7814e893a06213f5e130e4e45b950762bf745d15e3ec15fc48be6f92f0ba670345b0baaba62f1981d2fbcc2f02dd899eed969c65b65049cf5f8d3f1a8fdab83e68aef33d72fdd0ab7ed005cdf2e519550432cd62ad3a06f55561007781aae10b8ef2738dd319ff1cc3f12de3a28218d181ebefb55018c92a0500ad60d3a28c194dc25c141d3c5d13b3ef63616a8c60e8762571c4864c9600d9a44f241110516efbf060b43ad98677ed524f03b548022fb4b49234c2924ae7c47e8356da5b1fc8238161d24c2caed187386697c74bb0659f0beaa48ed161111f7667c532560191c0aec3e8f4489b0c350f04390854f80d0499c3c9a76acfff7e520edf21cf4f1826e2124985336450a75e14e91925c1b107c02209fa7b152123c4fe0c8bcfd30df1743da4212fabaa9bf66dd8b94a2c280b893464bd676bc2bcfc9b1c63b0b532dd5722c15af9304c8d85fa5e61cad3616b9377cd51ed4003fddead3ce3190905ff70e23003c587a63ef07efcbee2814c60b19bfc3c12a903b464d2c1eee02a77778ea69e7e80915804630dc6f5e51abfda299e006367595df0e980d37676e9460388ef463c8491fda0bc945356e8453663aed6df123103ecc85d4f14488c1d3c6be682632787c080025008e5368e200d40cb302c8649124418108be52c11d4258a32126bdb480d7cc4a18f9c690c5bc871fa782e9dd3f0bf095dad946c7d4f9e6428a5007c6af03484b4d8c59350084544d760888bddaca441b14198dc2bce66a084900c2e68d34f323ff233c061dd46d3a274c02b48f2d9ad17cbe964337d94cd6241c456d0b83ec3ea5805bb55b0737b7aec3d16b63ebab120ffd58339c63254c0ca3305bd57c68dee3c5ff079c431c244f0f96c5c377ea606910a37ab576274a91532f5626bd8426d4cbb649d7f8b9285dcd2a7a69fdbc2735bd26f720b927732832f541e3759cb33760896ad61435bb372c2471ed038dcdb9718a21bbf47ff3d7e09322b312f28af2accc1c050c1d70730209f0776ad9646396988de022e68a751d19d36f4e9862c3c77942714a9f1578ed108d5e87b9b909819280e239e4986fe408e82538bfc61e62ee425e430e3e6e935eba05eed13a70b0ab4270e8b828cfc9c3657e75ee35266c8467866f23ac8ca6b25409f8f6f0ab59a1053897021e3d6b8b077948fcfd9e4b0126c566456aa176f1bb9296974bf9f2e139ee05690c603394251c0b7262221559bff51e7c1f4b7738776db31f6cf29ddf55ed0f6f1f018c4ef0e4dbe67e9c09b5667e30ee03b37fd9dd9462faa21e35709d00823747a3b4511122580b50b4bfd297a1c8eb0cb754530ec28c52e6981298c6cb28d82eeb0e346607c635630fd265664f18627dd09dd161ff4bab5e5ccf121c3bc6feeea85ddf641dae30c0131115174a659ea20e9a900d3f4a696f2e51b1218d1b574818c7151caf1042d3a9d301a8f99b8dfaec12ca8d3ae1c62630c9ffe09946597709d03d5290e80e23a4af5880b0b9037e0976ecf6ceda171ede91d88fe6dff4f64f3f97ed996f380168ef58d9e1c78f9c1c3bd17eb753518138c51b6838dcf3f1bb44a965990ddafc6daab0b29f39396b4c6923c909a547191bc2d6be40a171b87dd2409434dfab1b1c5830f3e26ae4fba365835d1a7dc412dc429bc708ceb855baef9def2aad63e23cc568ede236810e4f2e62d04ec84c6fe8d79de81a25c9bde9bedb4b399bd24e00f8d998c89e3fcb4f8034d11bfcaac0180684e16b6bc5eb09c6087692dd1b55376a0a4639a7d9929ce40b830eb90996d8c7be097c5e2821b3d4e4f0881aeac9f00ba52d1d09c436c309d418a0b119840fa62dd969566fc83bb23079df588d8790116faa18b09b857276d9656ccfc197d41a2b0ed2a961e0aed6f4222e4261cb2eda4a9e5f820bd94ab8e3f26eca73f218e83fde47511f55f6d2abbcae3622f025ad163620d7964b8510617e7bc8e3378419c4bf25282a6210923d22b3f4ed8912a4fd5e86d1d045729361c59ff13cef3f286d149a6db04b16902dbc2a00cce9ab76c7c20bb79ace3666978216354cd931ebf54641ef1ddb59384f84c32236ae71c60f12c2eb553cd7d6b87fc7fce1fd76dbfd0e28cb3bfedeb1e5ec51c02ec85b991c250adf0eb3ed5a6afb1e8546560ea0709168231cb2e682aef6829e27e426769a15ce709dccfdcf363af410fd5218ab81e9bb696962f39c121311fa64e0fd112aacf38f9d69fd1fd0b371686aae98e838081fbcde79d2446d5b4852f28b9559368d2a6663d6643c1fce6347c53040db0ae18139459655e53f8df6a895c59059aae14724b36c90dc61c4bacac15c11e3012f8c4c477b2f1bb9d4004ce230d22aa4e13301d40391f7a10042459345bf80ece98f6ba88437982dd044df82508747bc20518c0b048d2194c922fd9b08106c55acf0100e56a10045a24bf0df7dc84c62de3ace584055e0d2b68ecb6d51a52fd96269da94bb122723d2c358354e79585de9189ad6b26ed101cd5a468902f9fb70d810ec6986a95b4f0fd33141502822d048b41725199096d096f0a2ac35ec0d8079a90360c56ca07f84fbac4aa0748f0ea2a70fbd547462fa924d414480551012c7983cec08da5c3da2282ec75fc61d99120e8343ac1966ec72d4d0386c738465f765a1cfc40df5787af7583ac3bd64cbb7ede9c99f475d3e9701fee864133c80cddd60836dfa441a96981b9da19e4301dc4d0e14b109aa4c0cf9581b49427561c3c3997f29014448634cc738582caa3c52a4741f3f4657e8215e4cc9817aeb6612577d2a955fabf27c4c6bde3bdbff20369f25f7ec82be0cae0459e5c28d946e85620c1ccd939a62248a85efa3215ac372719ed1caf4ef9939281000ed0a36c10d13cea99f82eb024d8b4db3847a577835d053016307f2860acf730217b7d35c88170763e8da89722d57e7da9c64776d991e6b4c096c9cc4911b841c2a230a8e7c84e591a1b898eaf1e951cddccd1d43db28264ecadb9735afdfe747a79750e96a9f7ad264a0b65020daf06dde4ec72edfc032ca347dee9a24a39cc37c58d738bcc2e3f277c5753b118a2e597c14dca4cf60c42ca03507e973dd62346d0c516420de8a52191aa6b22936d70de89afbf40c31d999118f80073e402dc457744ac6f546bdbde6dd09b377c3d7fac1dd6638191ae7256c8754781351558a94ee20237ab0d1082e526f83acf18e83326fa58f6d8b074db0f44d7ea467fbbf3a25ed0710623434d7449814d7af3d14bff68c6948ef3a0390ad094709f5c274d767b9d919306619d8235eaa1280bbb7decb937b0a86df32d59d2223cca045a8e9b30062db72fbcb89c040cf0574732002747526e9152e268162a5263f5b2b84653759fc72b61a4eb756da8dfda1e4570e753b73538c561f9b8850215cf06853096e8ec4207b533c7683d63a4b0cbca23afea585ceae2358123c49e5010e810194dc536b03b9047325a613aecec54355846e808c2f4e770479e4cee8c142cc0d57c6496ef354c14ac6946422c34d2cc5aed9c7eb33dfd2702d1b957700f56beb3fe8e97cf379817042f0b5d2ad3d87aa0f86f6ab063953515f6ad45e14e455e49be57d255c7f1c02e62402f3c2f3512e95b953116ca21145441e12afdd6b31513fa4a8d12f04b58bb7a6b031567f99a165668a95580936e132fd478b6ab8cf124ec2f556508506cd6c2e8def50db963a4f5251d1088df02c2f378c690ed4683ee77030059839e403a9057acf2c1c4b503d5fd69f8e9b7f0a42cf5744d287d8bfe55fef35b7d1dd7f47cf9a4fdc417ce1ea649164d1296a7941d7c577bb62da4d163ebdf23b138e5782eed79402ab571eb3b7b87bf7b94e107fb15618ac7bbebc18b525ab98dd7e8cf212d28cf43bcef9377aec74c9c5cb6dea82fc6d079f11b40002a9fb4750506dfde021262523bede54f188994a1e1c2dd69185759933f70d70a9e9591dd3b57544a3780e94c39016801e690d60858cbf98becfd3669e9d029537bafa66f886474b5cbadb0f5a4117cad7e8c80eb190408fe89e6cdb44da4e773b4233070f49560af4f4580f941c1449d60843abf8f4d82ee20c8083582a0fde9852f70fbb45ad122de71207192fe9407e3bef28e2a74ca4b2838662fedebe7094aa798e4c84f2ec6e35d1e4ecdea8dbd12b0646f36a4db41751fa6fb64db45de4a4e19e20634c8911f9b6219f2d8e237f7f879b41b403aedf954c68318b2c7a28ce9b58c4cc7bb0b3c5263185a5336360e6063961d9b871812cf43ab44628d5025dccb0b6632acbacc84e0bd015807bed39b57093318b4b842f3366c1b31e6df20f7bbca88f07afc66702c56c39be5bc453b8f0b7253780a45069c0e0102d04a615e9cab183398931a489e481a73387bca41498fd1aa9cedeb41cd19804a43a76d219fbdf7ea6712cbf5a94465f73455bf02a3f47ab88dc31b3ce0294142f51ccf1545d9ddf5611b50301c4f760214738cf3e49e58d1f66a6dbc1482a63495b9bd56d73f45985f6eb94250ec8efc30c76aede199747fa9890781111c34447f6c85dacc4f3333f4fa8142671b63edb2fc5055b3248dd334060ae3764891e63dcaa9c7e5b714990a22f2c3bc2c3bd042b50052d90782953114f8c4113144372afe7de8cefbf30b38ee5700218c0c4a2655efe912e8770910c4349f2e16bfcb94ee133ddb746b23c320edbe71a2794d2fb1db59d83663166b61e2ad4ed99b50b8f801590bbaa534390e507c3cb79bcd1fa1c2ab5bc1c7d92ac95ba5ae7d17cb57b9e0e509ccb531b7d967a4bb41b21b337340c0efcee314ac6ce65d7c9e12f15464d1d8721ee604ce1cc662844462234e19358674e58c14dc37e6d44533051013b5b910589e2af1b77c331715e9b6dce4589205d824ee159e104e14683aa947651b162be5afa0193a0ea0056741b716a5e2519d935b1f2eb0318549f6eeb890a00b39e343869d9c06d7b3c5cc81147f186aaf1943cb0adc23d5f92557b11cfb8f3a34da213c5a9f6788ad203fe8909bd0637175133034ac503a39f374c07ef0e70e7f390fdbc80a53e045cfd55a062c71d31bf043cfa72ee9159da989bb1ccd23fc2d70b5981289a576f4545b03c57f20bfc12d5395ba282693b4fb75b138312830cf10666302385b4a23b950e99e1e04974c5573ab656138e50565e3b9e23a6693163d3513072d8b50656de1575e624c21982f1c843f2ec2748eee62f32c6375af6f7227a2b7ad604a03583d799605a810e0056e5cb0ee11a8879422131e4640574f89013f23376f4f891a37787290286a47d97de7a15e126356dfb6d8f4d90f4c7209eb8cd740ec6ed58f3edd1e488047dc0d1a53e845c33ef98b8b4ad0236886e38ea45ac604935dc1b8801c9234a9a2dff9e558e7952998f1336ef646812af82b8d246f658b04c25c7997b1818f6f6063dfd7f40dc5ac6c3ba610f69079fc06aaaf292bd6e982f1e5e9e6e4d6f9760d9bd8cea777fc7a0f037556013d3ab2fcc727615f27c74640844df6158d364f566412869fad5d46bdb7eb377b7e6d2885d2685408aa61cb1962fd00e081011443b1d2d26fe087b077298193b8118c84e69ff8e0989175bc37465aa01751a8a6a763422dd3d121a357d6d7812f3b0f509b5fef30a22af0cfa7077fea0deb6ed8ad8ac0e8f8bddb64a80fec23058b5436692ff95bd98c89ff7e2ad1567264a131b765e0574395b80bbea65bdf51fbb0c5a219b4c0b32e2a1f6216b32cc631411248b2d3dd94ad64e73d2f204b64a0300e0a6cf152ac83385b19e73eadf7a10f568a451f26bf68b23f9260e4d16109d03e49da0835a0dd5fe31162807368265f8be93ec9ee134167c15e58a51b6bf7ea3cc35ff854ce9199df78d1ebcf7089ca6716ffedff3bc70a37d00956e13d61843f9ee88c232c5711825880088cd06f68a324ddbc9f5e09abac2e9b5f05fb02ae39b4a4dcfd1ede6a95fe8aba153e4e13be760a124a0aecadeac43a1ec88055d659f57a8fd4185fee6b8b4f3d2a5b6b6bf470bcadfeb49bd4086cc1abdb50b6fe0cdbd9963598fd8899a544e0eaf561aa6fc57efe29bfbf792498dfdc820b299a0acfe6f73eaf3abf8521745d82cc19d86824916091bc4712629ab42c556371d084bb88bff921a86a5a4641254c230ac46ae09bd09a93e3fd65524cc0d139a9f4f055e36cecce5f19ec4b1e6123c053fa3c18a1b01048529238013e754a9bd5d8c6749dfa972ecbcc490c737ab2c1629f02a7ca31a9be0e78520266412d8c2975a48336848cf2ce57575b86c99e8a184fc9129a22e516a10800003fa7a7e3c5f055fb466ad754673b7caaa7d77b67586a587973e7ac26f8a052ea7bcd63405f072a576ea2aed2b9c7020cf228eb1e318eee4848866716563255d243415a993e06e0ae39a614baf41fc46ffc664a93cdd35ad860254e6b3f5fd7865d3609360511f0aea219460b62f63c0234954d066e26f311d80c21550310406e1e388b40a95673b23a9a2940eb9f9d6d9a01266c947d8ac8892781c29dba3986bd70110e1eda8334aaf5bcfcead3237f80cc836f50432ce9219af286b65cb143aa5c7ccb68c472347da911600bed06345db94f92206395eaa89f9b78f40f35f2a4423f9e1719dd00cec493b6da6c4aca74cdb840730d1c3b7da33b6ddb0b4e7e40bb28677aeca671391f7ace5583a386f19958c2de27baf8c62a5df7f930e326c6390f9a97ed6f86858d58030c74efcfe7888abd849474897832991608a3bd2cde18b0744b00fc56a807bc3955f7e1c54bbd520a28f718524f544c243626427ba98b518630db09048c41b3faa6335418e8c97bfc9cd2525729125dca32871c110ddc3e773cc1ba5246977399a572cc591e3a772de94845e869aa35d9498325f329c8ca3058a42e8f296196202333804df4a2b51bc75c9decb0bd95b5efad4091596eaeb532a5dceac286366584b49fb99775bffc5bb2dd4cb5a528e68a59602d6eeede65ae09d203f856b2afc100a2c563ca55b094440ffa66b3323715788611b2cfc64338bfaf3f2b4d86420bb8fbcba3eddb555d39b65ecfdc2d62c8df6bbeffa8adc889485ed054d9359e2451c33b0a7c9e96432fa9b42c1327385ac6072d37a195e0add065f3d19c268807db8f2f2fdf052314bc3927c6d82eb1b0e42bd14a06e4b5194932c3ccb409a2f1efeb392b1e01cd8d2c9eca6e25c6bf340f5d04163c1d88b8388c7075760f1a748996e782ba2f00869a3a2207c14229a0c344bebbc7d46cca60b608968aee68c846e7156baad9809cab789b5284bca024ce67e10874340bab6c60b311566724b0d7104aeef5a90a77a793760b91266861200302a6bd8f3daa81bdb99f8b75ab88c205ee196123ebdc7f69c945f8b1411a16767ec008458ff5aca2e01143614c3a965746bb5b26168924a76be1e6b7a75ca49283be06089d93a6f0efd81e5450502ce69f1ed906483503e6e6c5c0c02ff2d507419a73eeae9e0a8af465442c09c7df4f867ecd169a8e8a1d7dfeb74ac89dfd70c0cbca1f592bc85ebfc3c32a4f7eb5d9495282244a31d4b627ad0d694499cd70069d698c470e75adbc8bb2ca25e722f47956ca21a4fe25663abc8fc946bde366a683e3195b8254f7100c814e30f1a4a283d01816c8916be67621808d87538d1c94b4f55ddb2c97f9e5f4965d48706780fa485cdd4464dda50f3d08a5f8abd73b691d27a5c9417ccbb922cf71734a025ff0af5d591b4695922d9c3af0f50dc535e10e595d1397c992063872d24ee24e12940c999f7b96603daec6d97ebe2e15f3d9f15ba62ade8c2bd3a3a87ccb7b01c6ba07073c69bedad64c608ee6daf4ea355ce7cfbb92d91d8c63425bbddc40c62964e9fdf9977440eeb26d741ead758f299c07df8afe15cb59cc4673c75da916d45b53e0ffb4526f52b4e060bbd227fd32cc454a1ed2183d97d796bdaf0d031b3d08302017ede20b85440fac0e08cba1b6cdc4a7a663d8ebbfb2fd05c238d7ad4ec8457ca815469e15a72771ca745a0aba9c72943aeef46d1b6d07ed3f2938508c68e875d44d7283edd31370540f1c2c7a652d782409787988eb7d653a2800f3851428e9c4d5d02fb936baeb80249b9dd2490926a4055221ca2ee4f2cb990f1521c8c45709449f0980030577948796806fe4fe8d985a7df95daedf2f9a6ceec4dfd9531539acca4cb6d3690d53925bb270a7da17480f933619c6f51d5dda54696854ee2c0dfa1aeea077d573d6c39485cadabbbb32d7965ea58d0ae1e933c428de80a19a0c5ec9321f29b47d4002e8a2f42fff07a3117db71023230a9c061314edd4325190304899ff428814c8724ca32c05c24d3a75f0ade2da029eac88ad6c24af68f382bfc14bb2bbafdc6062d1a89c009c8ac123dd0220a37637a411fa239446cfd88e84ec5d19ed97460035a023c844aca07e399847142e76fc1728259a90fd6fe79e79ab631e9016e0c8736fd1834b00e2b5aadf69f98597b7d3532277887319bf407023f072e4d67025bc0a9cd780d71aea2dfc094832012955c89d313d818947ddc6117eac0d48663c8497d4e101a6b4a8e8f56c64405ca242e95bc98e34dd5b2725bb909b72e2a04d25ae712c01cb94d7a6fd1949ba7411634068a62aedb773db5aa0e19390ad87d5040939f94554da78e5a6a8d6ac80d1184a1aa0441840e1df68638ca5b8934210811b5a6501c9ebcf8b3c70476caf228f5a9c24c38689f48b2509c9deb0d1e2989b0153a7c29ab250c5e6dd308bb2314db2303d3835512688592c18e310822e98902fe079219cda5833c9e74a4859d886c2928d89a4550650dcf131722ab7bd5de95c8202704eb89f95ed389e9a58f8a120b6dc2d0e1f9889dd18e06d6744e2beb6ec89cf611a10d3b600c7244e61da0ff4c893df344de0a4129de2edaf7fc311c0a3a1f83893c0348758ade5798946b591609941900cd0bbb5cccb4883dca7b084e8fd63e82c8550c631484967b705ad1f2b0f410b1cb88e39b399d420233f5bf767b5b32ec24021f4cb03fbcc01236d63ca2a7a3b080375298e90b4087086a3109a4d3ea581f2aebcd0fda092e261c894582a8b2402d612847f09c7bbb6596bcec1b2e4075011d1cea59376708a07152591e1190027338d13e78b3f141f1bfb040b563642e59961ffc89081d9ebb7bc1f22bacef114023e1d69afb070fc956360e6a445cfab8a6a8084ed1998a200de719334abe1e0ffb2286a8b1a86af138dd4f7cd7f97bc011f802b6000b07c83a7549e16c8a2019a7e5f6e3d4bf62c5452d3c14fbc0d9c0469fe1f524732b716859f70722c603eabab46f4fc9e43d63d8499f76c293ab128b8b1b9c861d7a3094eaa1ea243766de5895a1f7c672ea8497f8d3b31737e506996513f47826bc1da0f12bf5f818337d973179c65c9b36365cfc898f820a66358dad386a335e9b16f2943318816d9afdfed2144fc5c4bf453cf0068fa9bbcdb3c47c48921d9ca5fce62fd54093377efb18c389f7ec5b6c389b3a34d9bc049d78d2e5d177aad3e6cf2463022386ce4873d9a36aa730fbbe711bf27616394fa78b50d7b0140dd5af6ceb2cc852d5e1800c5d442b3f7c7c4864cb5d2dfd4bb9d6aae8c80c0dc40ea95ba6b1ebd851732d07d9b24420d633902159e47023de97f0d0ee4523f0e80978f695ad0a0074ab83596d3fe9d73ff960ec75f4b3b53d65acd12b1ba51c1f1ecb4818eca3b224c6425ba84c953b6cc275bf1877df05eb03fff06043d3daea3706009030eefb0fcf077c5c3af9d7580dd7a3728ad3f884d881eff0872358a59ed428ef9d16192ad8c78a7c1b16ed93e32054c7758e5c2b6176e92f6ecfa7badb7a43f17d0ee41a2fca201b55860059ec2d14f0fbf96a170a3899f2b5ba69852ed9817e625579e9c4837989581eadbb0980178890eb7c20c22202bea07369f1b790e2b862b2d99c3c10985242c14065b8ce3226bce13390ffc2ffd5a77830d19a0dc36b804aa527cbb00d7cb9f152b7cda2a211374affb6624b9241f25d955c55f4d7b2b4f0d151aeffdf5221b9b9c940eca4a5ed343d9ddd2538a59057f0d263e1fee0721626828959a62894c37043e3e605f8d1fc54610e9ad2bb876bb21a038fd6fea25472c5367b9126e7070c2b982468cc36a170bb50611f8d821aaf45372712c7396ec7093cf082fe5e9743602f4d409af6629424027c8dbae051105d3e9a61955a1925397d83611cb08b79fd40945a0f82bf5c858257750e20d29f5d3e7758376c15f4aab1d55529ba9ebfbc6f16d26ca84999160a48d3c74eda7d9e649724330c9bb0bba29edfc57347928c8145ce83028b696d305f07fa5892a4b0a7cae4b5a800740b6c796f738e922c61da3b8ea5a7072656cde49d27ed311fc9b5e53bbb3a9b6723f4a8e132e01e549163efac48e88b7184280087c0f34d66e807b49ed18f4bda5354194a061086f75e3d9690f31e278ddf237b70851dff2cbf97bd146e18a237ea4d711fefe86b66132fa730878c4806270f964071c9a7a000dc7c7653f7f467edec78c8e67a7817230f90db1ad4a88ffd7d6788a4d1dac930ba80d51b99faaf30de9ee4c4b06a13f580583547f931e3c56aaaeb4aab3ee0c6f0a5859b1ef3686e5b0c30b6dc5dbb5c97d120303a078b423792c67c7c3b3d56e41254c95b031574efa593a32131e5307e88dc602b5d0ad723e3133c7910dab490a5cda24d16742a71b2d6b07db17cf4996deb1b39b7b0420764c063d73951c4a3e334f548a58ce0c41cce721a5b61b5cdc5493017782579923b2e5574aa5c1bf15c50370f8931ca7fc64a489568b5f6866d61e1cb0681070b6374fed2e14732a1b1ea0db02e82d9a77e35850129c04ce155195cf49412e0db24a86d5ac334d9aca7311e8dd54e534ee05a87346cbc32207a05502e7e12292a598eefe052cd62bcaeca3a8c3954ad94beb37cd1cbff292dfe10ed140db0b4de4c48f44655b15da52e6fec1d59b32ea2340ff9668fa9891c8802f4b3f0f2da2cb54ed8a706c4c4fa1dc55c6c1ddef64ac84b7ffeaed8ef8f1389116ee85c2ac88ca048ac265cc6960667aa9e0964c26fce428a69753822e684ade5c3e3f561d6d95d14c35a46f91049869b1414ccc6f89c5a8dcf413f61bd342e6f3e4266c6fc57e8af900328961e0e7784f7388e89b44b9603cd5c2966da57ad8e7dc8898e695b7da273563494ad783b09161fbec2dccbc5c269914b85de7ef74e19b9eeb0523219a3a16711a1509c87cefed00fd6f2a4f1417863d005721a5265dd6568e29f61e5494a4c44ec8fd49be089b585f1cd8f45111359b438680d1eaed5728232496676dc3067f78ef4f60caee231580b73ab7345bdfd10ee9300faf491ac0fc53e8a7294b38e97901d07ea5874f5891270440ae59df7037e796884adc02885659b27aa0de815e740f43a026001555a77a2ba454046edf145236cbaab5870aef0b044425fd4f9a210fb694e05f11436d322b04c01d3e08240a3ade47ef395337328b648cc08c1f790722317113b9c92bf6034ddaaf95711ad3b116fec5ac883eeceef8ed7acd070043d1edd5fafba2d25d6791e3edfe4e604a7a8f39ff86f595f934b55980544690c033d54bc22fd10d62befca97ddf3049c381cf3a9dba5a4f01b682823175a98c0cdfa60b6a5da000b067f1bb31e678ae18382ec113cf1814ca5fd586bffebb904d3ecdc6ac1d6d92c25909b51901186d40791d7ee3c6aa269a29cbc9c1fef6beacfeda7d4dac60484d383704a354283aed83006236057c4a670c91bb9623e19708089f53c356d87fc1129b3c9e0a2279a97e9b1e42238cd66b6bcb229c80886b003c7467ff07bc866e1220de8600262308f5d46016d55c02131c82da69d43e21b1d5f74d08403fefff8fbca3f4c01029420ec267beb873755d00cb8662a84b4583e243aa8aea09599a4147e11b312deba159647c1bb2e24cf71c0c58003d944a3a9aea50b67cfc6d6062685a2c35b1a1453dd1b2681d09d89b8524246d4dfc83c794a44c28b258aea12f24ba7e8ab3c0e6aee32f06352624fe5fa1ea0c4be8ab9fdd8e3059796407517a0cc3c058a2cdd0aee9ed3979371fb0ea320f0efbb1c7b610f0f8d59243bb69f2c3b98de3e0706e87cd0bd1441f1d59cc8c951aa9e4a53327b13e3177570d6c80de3e2b303f1a2f901227f4dfb0e84a99f55bc0b84cec52241ccb708f485b2ec1268383e8e73665c686dc2a218997a88641f14cce6c309eee29c332e1a36b12845e61e22d8170ab3f070829b38e78c83964d7d9491498f08f683d22c2c9cc12d8633e3a061531f4564d62b32fba160960c0d4f1f70391347349a6a285346dc61369f4489102173394a53a77ed3dee2c81028f15d8a602e1f746133c449dcec6a97f8a520dd354c976dc46301f65335e50b3905495ccb77d8609c403385483901715df306b873f475a86a9e7170a039acc849870345083453889413697180898d9b726d6621ba4e63c9799407fbe38fcf78482616afab82dfb408eeddd89c5662ba420b7ed084fd98bdae125fa6eee8d11a4ea56b9a2be8f85a3654aa7594ac12b6f46fb4000ec59806a22e63d91b710975d36bd28cade89ab48303f89f5e0be85d372da94462ff5e7b0b73541f6593c1ed299557a5173c64da676f2bf7227abd8acee2c52e653f782fa2cce8739422cddefe133bde9df2bc3c4cf0b83e78ddb84362b7f4deee248683ace4a3d8e350eb410f71982de596e97e2c5254e86f3a3e72a8d39434803cceb7b735b8528bca7ee13e70e96094940ff00df4be6cd49b371d5325589760d905fae18f5e0ce0a391e67cf0ea3163406134127ad1da80a0980159303b319e1c30503a0920aad00e2c842e3ba9d2a2407d8432124efe7770dc5fd639a675b61346878acf9b95a71340b673c2bdb16ef22fae43e4cb1880e6130cacd07ab01921ceb402d361e98ad60a68aded2b5d490169649604c5d464a904932740b5580a928a1d2371c601f2a537517e07d907d696b224be0bdc301cb7a04e055747aa72f8f0c5205a6ee071c8df6e8a46fc3a9f06a42c296cc7c88c2847d0afe41893aec771491d8261377c62333678e2381e0222acbc89f0be7106475842169ab77c2838ec2094110821ebb510c65362ff32a62819446f1f45ddfaa45c92a8ff091c12138571019379dc371262e1112eccd82e26dee8e2fe1563e1f563154be40813da54c85d7c81f2a997f7259213ef3977cbd3d26a83a5ac2fe931e279327f204e5943c46464f4c853a9bf9fb47869bff1866182ad34be070eae8d918be31582f9990037edc164ab7588feaf402043214a0d4a919522796ad99a5539a239e4f563a949286f18250921b29aa3f715172135ed444db0c13c23af434b1a267f2bf7dead0efbe91f9da1b39431c05aa612289418ed741a5d90c1dba6fad5bdb23c5e91b413dfe420b4accfdc342fdadb450659410ba60e7901eca151be4d33e33a8264478a0d834167e747e9a88b242f7fb9bbe24b8b171da7aee56f7f466126a50592e3466561414cc93f2d1fd0e98aaee0a54e2f283137867827608b9b8b2cdec71ccb36a1b751e3879e0fb74d9634f690770b675f5549e8062d80cba41572fad0df2964c4c275278aaedb42618847898f602d112c7516c43aadf0616546e801a32ac539e10487e8acdb8559d2b7f549c71c4200824756a6624cd7376e4bfc9239d413fce3a51db700f189f068fb993d90f0f0931d6588de24143b5c2d2b5c0d6560f4822dc02f4dcc6b0564db585a4778b7ecac89105afc5b6e5c77b78f349c903579e34560c9cbf0342a9704d640981f7be3375c93548bf3df73774c71ff68cade815f1a74c1201a0a00a140541f0695d7ae1d94a9c3c651b6dc827b44d5adecd31d35d00e6b45efb3ec1734e7d14ca8b9caffe55a63d044e9bc539757dbdb5c63cb232a05cd41b8100e09b64ca7fd3875e02a7f25e19c183a518598b31cbd038ce292b18d1474fb5a48ac66ec8906c6d6d4bb2e1951b525d90d70f83243c1aebb68b8f7258b77fb30be4acb28f5710c43c723bada758685d9a3f95d4458da37e9cfb2483e0bd90722ed9cb435c37a9fe6d2486c4f267d403518006539ce5aff4c1a8fb90fdfdac34a55fedfbc5ab2e5876f261a76071a65603ad12b8a42c6708450063800bfe40f87bf19af4ce7456d1070114ea2af90ccf373d4544067f21e4b8b113019dc65974633b58904f93caf5f5d68980fac5dc6e6a7010fa8a0ea3d0a11a75d140967c279a0286a4f44c91916618ffe81ddaea9d102f38e19e83fce77a18176648e432843f339891b03df3c3a72d8088a9547114da775d18b9a420c8c3f2355f7029e912623e5da03de10ad8ae6341ce30205382551482c5c99c222ab28fb8e96fab7c7caf3771a7a9babedc4c4ef466f5c37041e0d44eb0c54205a52a50395e2d88bf9cf76cf1643d790ebf3aff01f4ebba5c8b1f53009cb9bdf0d171317362d010f628f90a9079a1a705658993926232cbc23ba5a1ddcd850948a6bcb1662625a4436217bcbbde59652a62465430d8a0c0d0d19ea60224322d30ac0c1ce1a5bacb145f7bc3ecc39e1cfee398b66b793ee8e3ea74b8f1dd7d8a19485ceef7dd2decb7bbad55c4e161f7b6bba17e677dc9797b92eafe3cec7b73e1177887725bd251965541a330ae8421dcd22f88ac0fb4f22f86ac0fbcf26f0c580f79f43f0f580f79f42f00581f79f40f045c4fbcf1ff822f2fe730974bdde7ffa40970eef3f7b6010d7b3fe9b3c9ff4826c23bba4c2279d905d2ea10cf84221bd5262005bfd9f2ccafeb20bf84af9f156bb527200bdfe4f6e91fd6516d09522f4d20806e10183d4f0feb2090c02e43d6528080c82f3fe0d6f28c0fb4be88a79ff0a5f45bc7f075d37bc7f0aba7ebcff0aba66787f17e8b279ff87ae20ef2f035df91d7f4634a24c3fc39e845e57f24447bb07bb92226e122b1ee689dc2456d0509f889bc48918078e153dfe898a33c4df50f3f2d9863f52b3cbeb70934022c6916fb6a4dc8f3a6a57e5e934a0ab3a013d1492bf6a8fc700be6a18f0c75f95c85b42edaa469f9203e8aa6640af59f8abf12efebcdf81bf5fc9e06fa503a39030ea4b19e2746c32f6d6f6e6dbcbddd1b1b374c336ecdaade62ae07fdc20dee622e067b809f820f7006fc335008fbb80afe10af1afef69e8f17d55c0bb18a0262f40884f014124000107b8aa23035c951a2d405c2d2c201825721b29a88fbc75d42d5c27ad9174739363db6478225a28c66d2e17e6199c02dc8635f4637edc14f4e8cf7057d0a36f735da0473fc87d48432b6cd10e7af46f112c6ec8cdd95bd30673618e21bf64ef8fbd9c7c984c58d7caa753451151aac1cb5d9701613d032e05be0177021f81ec6f2e7d085c237a50224a44a09c555932232a40810948408bb93c3c909bc3d770b31d9e015702fff2093c7679104184081d584e2487871d78727841724182419a48150989b574ca9c1641e4c4e9d830ec286aaf1eb9af1cf9ca91afac1ce9e07454594504860eb6875d1d32b1abf91d5cce8fb7b1b379c8e504799b639b57c7d78b2d767186b9cd64a8877a8b6e12a4c8c6491311e5d41475519fc1b59151abc5e5fccd3d6e101110c0ac226f351111ac1e48e344f730315d457bfd2dae858a845ee523e6e5c21c8363a8a9b904f81f77006f737df819ae003ec80dc0db7087b86e0fcfe302f135dc1fde021620c010202eabe787dbb26401020c40003e04e0aa8e865c951a3440dabf871b210d7d1a1926900b93b10b9361f08724cf70399565c3ee0b0d765d729501bb2d79861b44e471f378ab860b8a4bde8a4bedd3d3d340355cfffc6c3972bd30da704131c95b9df443db5699623fb0ab9ae165c3ee0a0d5c4e0c6b89b5d4aeef225d24bb43c8ebeafccde5e16db819eb217029f00fb81578ecaab0321eba065c237e0237e244e046a3a018d730e246246ff5efe0e2d11a473b0c7189f87af1cfabe35daeccbfdc1d0f73ef4fe0429c1d2a7059492c246fe9f07059459725c3e55021accc85d3c1b28a2804402e00be869b83907fdd1dfee6b2de864b3fc8d5e167b837bccdcdffe3e2f035377beca6e4bf41445e020f53b377b91a904052ce41546474848459472ca3cb22835524e4b28872b82d4b00b82d4a2aa994b52a2a2a2a2a2ad9551591617486eaa83d35b0632e478787ca4272787181c1747278d841480e2f2e30980e1d5c8e4c6b8bb93b0fe4f290f3aeabb383901c5e5c6076747278d841480e2f2ed8ed328c0ca73373f7e36fb89c19fe86db91b9e62d9cd986b8443c764f99861b34c4571b6e6a3cef7fb57aa94f71300bc35c30970959afcb727259446314f128d51b4e67e61acc8303c289531c71c411070e91e7c1ed48fa36862de6ea3c90bbc3d770fd795c1ede75739e017702df802b818fc02de269b8f46f6e967f868bc3dbdc1bfec705c0d75c1d1e02b702ff804b81c7ae0986081d8ed2f0f92c7cd22dba6308c9e1c505e688089d9e8fd50556176010987378d8e1b320045f9f1cf0f579c1d7c705c3600ceb00001cf25519f9cce6515e113929f2567f052830010914c183d3993976af0fc2e5d0f041b81d996fb8dce30611f14f84081b8c88cca740605c304699e50b48d305ace97f5d95131aaeaaa812a13a5221792b290257b5e4adfe209ccecc37584594a4db320d37a888ef718388fcebb25c97457431cbc85b379835c4eda9384430ebc85b2ad5dfc0ea7162da5c795c560fa4e9afe1b62c419a5649a5ac8a8a8a8a8aca8a1a45445c1591b7c8303ae3080720d8cd32cc8d4c8686b668d2c40900b84884dd1a7363153970514808bb5886b971898f4feeff1ba7f889b9910a2e02d16cc3104e8808e1726630d29e9056a2bf7f881b7bb8c8d35e733e78c6c111f2638b1dfd1f5c4ed0108f5d9b6c69d8622e7d201787afe102e0795c7fd7cde17bdcec5f57c8df5c1dde86cbfa20f786afb9f987b81007bb33d3708388542299a543d118482bf0f9a4b7c2cb7f352eff793019dfa3dcffdd9edc4484e890c3184500c00169053e6f854f7ac1482e180906234d8c5431128691584bb9ff86ab22625d9513af591da2c5e5509c2d76318fc3e5fc5bd6865d995d97d504d2b40d5f9d387d7fe5397d3f8fcbe201725b926a4f6751a8aef674b5a7ab3d5dede9ba141baeea8cf6fa6b7ecc6073556404b92a2358838adec05cec7176d8a216baef9382dcd6db70bdbfb932fcebd2fc10978877dd99afe1c6f040ae8fc7ae671a6e9003fe6fd0103fc30d2ae2ab031e6688ff716deecbd540cd353888c8bb5c0dd4ecfdbc1aa85986974af9632d41e07e92b7fa1f70bff2b4ebf6b413d0754700bd1e7f5d1f0f03beee112091bf6e91b78cda758faa19d075d3805ed778deff6ad5f5d49eef221d5dd6507bfd3497e580cb6ae2adfe99cb121a81d6a37d7f0cb70509d2f4fbb82d4790a6fffad8efbf4728dabeffa6e199fbfe7bd42e083daea6c6f3fe572b7be1777d72fb6453eb7a57e5a43d98cc03b728419afe064107dbc37a442e67561e17c65f56ac885bbdd541710d2277e5adfefe87f24a1fe597fcc580efbf3cfe6ac0f75becca901970554e9a8caea19f074ec733c52aa2259acc807b9fdc8f6f6f52bb30ec02f3f52b91af5fbf6b57f6f553ed0aea799c22befeaa5d2f5fdfa55d3abefeb74be6ebcbb46bc757fc19f12c766f527b1dbbd061ff5da4fba4bdde617bd83cfa3b5c0ef6f45ea4f65c1e7239306f63879dcb79993be3b5d73a2e109bf63aa8888f4545601c6e606e1011225845c485aebedbe48a7910f27205d043f37091ee937661df7f93eaa5a9d88897b1670d997f014fe61cce0748942746407bfd391c10edf5cf6498ff24f45c5e871b32338c8a48e54445467bfd0cb8aa065cd591b7fa77389d56c6b0aa680b1d6c0fbb3e32036e0f5c0e1d32a9e9e55b19b6cb1fc23cf62f2e435c0778ab7f072e0706c3f676e0845803bbcd43cedf20221e8608ac72d2ad7e1d2e2706ab889ae8e27faa1d9a191b62b001c3bcd8c0a25ab121a562830dd8c35c985f2ecc2e770816979379cba74acafdabfba996723fcbfd58eec7ea22f7afdc4f8594fb53f76bf142ee57b91f2b8adc9f723fd551ee47ddaf850ab9bfbb1fab89dc7fba1f2b8bdc6fbadcfd5a9690fbb7fbb538a1a58d8f75831cf91ce7437d4fd2aeecfbbd4709c52a8661231a910fd0095f3c91bde30b68443fc0286424621c406b0061d6901847c6f087448c83067b0ccf9d35843c9883616b54d11bf691a3700d21090434a42acaad22ea56530134b99d3580a65011e56e38b8eea51d4a19ea60028544888e31e081b53176e7e86043686e8cf4012542e4ef033d72520c69528af4440d25a03449aaf549125214214ad911192ef1a49bd02119caf05b024953b24819765bd7cf71395094327ca4ceb44452867f8223c33f713b2e79a9432da1468a0aaa5351515151314148f32d7194e13bbc350d3a14818c6e408794a0f919d18d204d7f3c5a6aaf1d8eec4bb96951f6264ee4affa83fce5c810be1b59ec469c08639be8e30ce50fe3596aafbfa3c078b4a1362333b2ed4d98f5bd7a3b6f75f556d7189f74bde442d912228fc8f3883c22cf7dd8e8eefb6a6594a10e1aa0321853b13b0ca8a34c9a0ef554a2403008fdfe19a55f59123ae44074c881e89003d12107a2430e44871c28e3a14f8086a6156de43d30887cff3ea35fd55bfd9d1aab270fc5fb6cfc26378644b963f5d77cb2e446898d07c747995072fbb84f7bbdc491da6bcc8a0f334b27c7187fdca72691a07387b24daadc1f13f9464833bf274b864f7fe80ffd69afe9cfaa639b1cd339996c46434cda6b261042082184d29bf890531ef7b9247f2e29d38caffab04728d79b9de199d196653e19110c827d7fb6a45f1b15991125ca8c285166448932234a94196546b91d6f4099514ba7444399cf134ab4194519cafdb6ebbacbfdde10babbbbc4ab968df4d3e59e138e2849261c4a9264489728c9904e91fb3fba244387114f770cc396b1a81d486795a7527c0294fb87862c94f932a01c638c104618a1976344ea5c9464970c5da6faa53df41fed522aba4581c4e8607b3d93da45bf9ffec020d9f74f28fdaa51bad5af861a4f9e4081d251a2e4cf7f1a8e8623535c95da6b0a949b564c31f4291ca8bdf69ff6b0ff64f20d6ba31b1d6ca0a874effddaa8819488a20f448a6e74f0b15a4dac21cd8685321fe52152e21972241f22373adb92568dc59d502a2b77d5e202c3e3ead8e1c3f3415363f3637ba161e369a016eaa16ed2445da454647484e4433c6dc4c3c3c3c3d34748494a4b2eac961c5e1ad0a5b9a115e5c6300dc95fda92b794da657b3437a0cb6a9ab5da92bfaced6997b523802e6b356bb1c8fd76a86be8b73efefac15a0bd1b03737d65a6b6d107c7936ffabaede4c229964897e708a41e4af74acecd9dd5cceed3c6bb5f1464d48ca2bb3a55be4268e57e61e4d482726674658113aff6f027584549a249783cd2cb51d68423007f055bfe295ffa7f520fbaa892e4e7a1a1a2a2a2a8241609c3e7c59347f7e889161e4a970d57991fb2f7342eeff7ee4fe966f0e39ce9086720fc9ee26b15d4e8ad54cb31b673a75a81495d48a8a6595a385e5f28204c423875c582d39562c30312fee03348d90542b29951454ccbb00b90faa3b99feb2a20f55e2364b9572bf76714bf4c18894b40cc33a72c487df121ffbe4feae3e3a6456b9226538f4654348b91fcb86b221968cfae920843460d8a1924330084c869f693c2b3d96a77b52ab6f969165f8333287b27b43d1f90e72fd6f9681658abffe1c9a4396c7d1882d81d8d8e07073d3ee32ff339ee735c7ae7359c9198b66866f27910bc1235b86163ff04809366a9d7995153695de9ab5deb7149079963d534ae92de2667f21bd59ab59d3944f4495ab542b365eebefeabbc9fddd643a681ff107a760ff836c6cff413432f71f3c42eeff6018b971e570b7e195c5d8b3f9084813c3306987822eec75b88137c09796caf057e00df4e97f2c193e3ee23ff8c5cc47b4c7d3c52332005d8e81b4d74518c60d91b9bead5a9d5c0e854154e097634ef897c8cc36fbf0ef2aafecb6c1aff5c6a67573642923a9ad95e57f3619fe8dbfb4af9956313aa5dbdc9c69836ff37937072acbf0237c45207740f6cf40feaab5abf8eb5658048a403df207957ae42f02dd23fc65036cf57721064f197009b921d20a6c96f8c666d82ecf4ca7ed4a08611095d54cf38d2692daa93490824cedbfee85437f363d78ab5d42b4075d4440afbf077f39c05b42b4eb882602ba32008b320eb93304228946f37c2dfb272a8ef60ef097127e44bb624f6700bae208a0d71ff1573b08c61dc01ffd4af82bf6b42b02b53702e88a34805e7f2fc148c31799e4fe276c70b0c8fd71a86b8868c056ef009e84b08e6c44a2dc9848f68f581cf2990ab996a5bf1ab664ca059c1bd2650ae42fed5bd380765b0279f22737446edac71dc057107cbdb73a68f5adb0f9cd448cdaeda93819ae1e044be011b6292291d1230e3c00b18948b4b1305828c36575eb6010bb5d971596c97886ffabcdd84d75407276b5bc75b6316adf0f040718846e13c3d53fd05c4e7d4be967d9a973d9c64df68b7bb86dd9f31787814420b9bd0c244601c2d99e65acda9539c959cd5e3c64f57d855d1b2fe21e280eedb5e39bf61a3a92d9ed020b652cbd598647d0285b8fd0081e2511a1911050b6b2818480008a4b5129dbe951292e01c9202a755113654b65137551546aa21f9f6cb1e9f3d3443e9ee448d956ea489ee4238523c9267228db0c9343b28923c9a19ec993adb6d1cb929fe59a2d4fa6ff55efc943525e9125b783e404f771299aa8bb508a6d0045190051063d42c67012914a0c214d3f18264f96b8c2d82e27c5b2cc445f15d42d67cfec421c79638eafcc1f567fece9578cd179513e9d63120772fefeb17a4737d129bd934d7839c89002134fbe3dc97eb5ab1ffbf8f2a27cba7ee81d63d0d6f92b49fd0cdb566eedbc3db28d3b64b45be38aebd6b0d3528bd96a33ab596bb76d5e56b6dc366f4bb6a66dde1cd99e6cb7cdcb922dcaaad4ebc411a624f2a5b0257f851ba2b2cd9bca369582ca5d3e6553b62ddbbc5cb62ceba2e52c578c666c755819bbc3f2b03e5a9e693e0ea5f8eb40f60969a607b2d720bd6e79f7cf9e70c4ff6ef5434c8ceeab75ebd7aa9bcb719f37255d3e202f21bcd56ffaaf3bfdb7eafe7bd47ba8db5de8adec4f177a4b7bd385deb20ffd6584b7faa653abf65a08ef37c25fcdc1a3fadd4ac3df2a834959aeb807383a214e3f48466ae512f1bcc93ea472ffd6b38c1b6b6e6feb76644e2a87db89b9a39252ef48ab893524cbfd31378643b85b7482b5f1768c31c69b1c3f2a757db794d3366dedc1a634d2195f01b9b607df0416c676394fd4a7c3b89d58ab091ad91a633bc7e544daa63929c5726aad59d65591a309d96de36a6ad5994c768a0c1ffe9cb6d82dc9f991b9835d3f2a856d4a8aca144aa556565856585858522a292c2ca88e8585e5c462e25858587a98b037acb55d65bbbca114629d4b7bfe9d522733ce723916c6ad4d5227cbdbc66d9c69eb4ea7aeab2998922a2a5b5795bacf4625955a59e17252ddca25d5a9545c8ecba4ba954baa63592975f3adb7d3f74cf1b781b875144bbbfa158bc5e5b84bf7f212dbe83e0f2626e69fcb894a1dfdbcacd4ddc718c7c0bcb8b0306ec9b162c1aa9514c65805a7a0708731c6352608693c250716ca7c73287bc442577f4a255209754ea75fe6a69ec755bd8ebbf2f7628f2f7db9e4e54718e45f7ec31b76bc7c095d2c2fbfc20dba502fbf8329e88a79f92be84a79f92ed005f3f21fbe5a2fdf832f1f2fdf06be6278f937f0e5bd7c21d0f5f2f279803dc017cdcb0702be6478893f23f028d7974aea954be2e8ea7f5249761fb9047593385273ea536e12481ca959f5ad9b24c9138f43ff090fc70aec59ff44c571028b238e3870ac58796bb36d5ea96489bcd247486eaacbe3ab52777a6bb7544d8ee9f17566e66d8f9bc40a7fd2e3354e47cb2caf399223f5d0eca4f2c6dcbaae14e4499e247934ce977cc9e6c841332e67cae06ad8233fa296cb99279867f2efb80d6b529ee54ae8a5fcea56e8a57c8edb412fe5636e0a7a290f735da097f2acfb902665835eca0a7a297f8bd8b82137a3de7676de18b229e525ea65ca9bb81c95b727151f6718199dba548b8ca2a20eb5e2392122cafe1505478a6a4b5d999fb747ce71651294289367f64c9ff933a758f2d616dea449f6af292a1b0f20169797f777b9cea43d7f9517ec432d5702c1b4869aa8703a360cf3ee6842e4ada22b8dae3ce3caa32b91bc95923f90c657dbbc3a8456dee872bc8acb89791b3b1816ce2d34a8c79b71250f39eff11e5fe23eed79d08ccf4ce486c0bc8acb818181813e85ffc41475739523874b0e15152ace815cc5b990100b0b6b9bf7e61c57fe4c41851cc252c85b1edfe85a39585e85cb6179695d88c3c2e2495838e7e1c9fe2b96189d56ce8125d016e685a9f95af3b6e626b1a2e1683dab97965a2c97d9c2e550976dde17d6bc2e2e517e9b7998991eb88d82bac85bfe33b7918edaf37ef11c412ddc4441dd242666d54c7a6888ce98bbcdabfa795732bd5cce184a5da6925d2e4c528a028777e78fb7268fb7a0b4b7f4726396e1f64f50fb78cbfd696e0b7903b5e72f2fff9e67638389e09837257b77f64c1e6f2d399429a8106a4fc95b493a5c66c1f2e70bb576dd6af559c71b32a6b79107e4b163470ba5a4a7a7caece0dec61eb0070f1e3eba4ed23ccdb383c7f6367ad0ebd1039e720c7ccc9a139b186589c2a3476cc196e74d2a4cd947941820b9c43285aa80412a1c14c7a5a5dac3dba252a7bd8d3ea00f97b2c5e548a5f63cc619a53d9712eb78ecdea75c66b932a93dffd59550a22c29c5282d382a29b1e89449fe923f491ea7c365f9f385996dde2dafaefcc911732515b28a2b9b786bc85b422d4e27cb72e80d9a2d7561b6994628edf9fb884949ad6ddeec0c2323358e8e9eb4e71f0317912acb8d64c4227f1bc3362f9623138f5b7874e2d8bd3f2f85b94133bfba412dd6caccd7d4db995ff9fa2b9462289f4e3ecc2ddf920f84130092990b715a64e086481c95c8c0c59e22ff1e37fe04451f6ff9c7355a327011a83d19381f3cffcb50531395ba4f26cd1cd36ab5b084d2ad57b5e41843c2609f0406471eacc6668b1dcbdb70392ba54e7e5e66b135dbbc327fcc5d220756c2650b9553ca296cb81c9636ba4f266df37a5edda099cf71837abc8f2b9362b852c95bfe75e6637a3c8c8fa7313c76837a3c9c185e753550730b0ef2f12b3828867fb941ad77b976e626b1e289c799f9c8e9649905572f7471be9cb911fe9818cbcdb28c4176def2713dfff67cf2f8abf5fe32094abb94da15452ef9cb93818aaec17f064ec733c5f26789267b770a75cb9f861c1fdf56d1ae89552b2d548ab76a6161d9796715ed7917baf9dfa422bb507bceba40a0756d524a29e5a55f0397339fde49457bae5a41a5d8e0d09e3b0f42526e90e7a104d0c3ca0d6ab55412ae2e035a88f6dc619e6152d12e3aabf01c73fe9434609886a97ab922550f6445fec8292415edf97b57b6ae1cf2967f0d9c4e2bcfeb237b574ed12d7f1797435faba99abfba10d2a8708f7b84b7fc7f70392b18ca2c7f7046d0b0cddb3300d9e68d99d2e0dae8ca3f75355073c512a83d7f205c0e0b9651bae86f6b88a175e3ddc4dcb0a8566e522a3737f3615e8129a8972918b687657b127717e6d335719bd592a64fee9752c9127894a52d438b156439253cca73283f6010d4db87120b33c41b68ace9b7df5249297fb4a5a661960ffedaeff86b8f24dbfb2d91ed6bd7f6b6ddd343cebe905ee14f66fadb4592ed9558883534c7c7db728598fd36e5c66c5ffb9f9c7d52b6a7cd5a95db3de8ecc3afb77bd061391ef9abababa3fa9f97bf78947229ea6690a63fe5ce6c53dbca66f1b7ca36d3b44b3fd380e74f897cc4b3ca2aab3c7d152ea762a892ba3247952ee57aae5ecaed5ced757b9b85d339fd8663976a4fd37eb342dacb425a8359c5e9c4cf3e55dffee95e402617899fe16f753f999c6393c99a8e1c2e0e3d8f731fa63cecce9e325386fa2c0567d59eee7549e50d6b5f61bef5e3ad7833229353f8ab2951e5462a221013ba2f1ec523352252bbecf7c727edfa8cdc64edaded4e167f2fb5ffeaf6df96e35146f2d7fdfe98148ffc55fbc2c6abf6ecdb8f5c8e76faec72f24fcf597c44a66cbd61120b69af5fb5028d04d0a8ae3dcc5d99eb6909fed672dceb7899dfb086bfd89db89deee777f223d206b3956fdfc4e5589b616a912cb1d9ec377a8b9c9e899cdd0d7f48f22673669f6a4fb110cf5436fada0b699b15a97f42fd707a14fe3ad78f49d9be0ab67fdaaa56fff471cbb287dc004e1a16d24730ebf4db63d95bfc0dc9de7ef676a3f64b3db67d774fdc8ef6d6946d29acb269dba6c269f88bdb66fba79e4e17e66aed5f6bf1866409249b21d92f46c91ff647ba087d26b2cd5ed6b87d448a3764bf61216eef17a168d9f6d86bf88b49197beeb56f41b5a0abf8487358fb4f62cd3e7ded3f0c55fdb5e3b587fee2f1dadbdfee776d6fd67ee47e98d9fe89e22c22c51aec532ef7a86b7a1e57c7efb8322fc4bbdb65380eb587d99afd97d92cabdb67d43e21de8031b1ffd90d17c9f017b39665df9c0fda6ff6b3fb1dc12cfaa7c7ec63df927dfd2f32c9278cfac9b6c79e7b99d3c93ef6a61b9964ec376e27fb221bae59669fe35ee372386d5eaadd8f03597b2b37e77cd0bebebddf114d7b7b65a6f5bb2edfb7bf316997bffd38d42e98edc727c41b62c66f7f723916c32e26c524edb19e5c8edd308b5580fb321f047e1d6f0088932404f7657008f0eb7824d9deafcb36bbdf1139fbedeaa8d86b1749ceee11992b8e4f8835d80b716ce27b2ff456532431ad83c6c96b46e516447128c7c8244728178049f943f2938b989e7bc8e97c3029c7df4cf88349d9f4dc67d7deef26dbf8d595ffb6d47f9dca7fa99447fde792e3bb5afe93c901e63f8ff5dd7f40f2ea23fe72b06ef7a073d6bffffb2be6dd5ddebff33f5d971b9f75617b7f61b7626c72cc2db77bd07dabf75792271ee7e5fd570e93e3d4027361b75e2eec1a72dcd58dcf72e3abeeca4da9dcf82917b687ea2e924ee713fe4c2fb9bbddcf084cca55c3b08b171bb9c9f523e7430a15629c40e6ec529b96a65d38a3f317d2357627833032990516389863582105192020c115a46053041dc0400a2f9220051a69cc00210c2cca905f7cc18c544a0fe81545531c91e18532d2a8a940118c965821045d2c6d81240910d858a38b1ff4e00855c810c7146cb0c408418002c6c4e8133c0a599eb2945262f3076060d6941aaab22be38aecfeabfaa9d52ac32fbe00841f9091bf141324424a442842146db4800c10d0644ae913805e60451661d0c2046bcc208162063ab8228a272298420f742284a2222908b1800b2f5001922652c0022fa054e1032d92100306d678c32705638c000d38280085102c010c3e70428c3454a0833c4bd004e563e98d2564618a204cc10b27aa0cc328c14fde320ca3044a7870aaffe190b790e77449318ad12235723021ae4c8c62188629c933528cd229461379ce39e79c73d229bbfcdd64ffbcec364c58c9fe9f46f6affeb04b752bb2e4afc36880e4066f2ca10655a0a209152b7843250b12b45a4a4b6f20418c183ca1046ed0e084c70926446902859011d8607963b461822c0425a9a209a103a42184285c117484262d6822846a92c54a8f0e80a00a1e1af014410449ad4412d07842d1154a50a468c282d317455fb0f0f0800ac200062d1801080a2c766448f48328792543274d7841b6a7c6648c3146ec73e6ab8abfac7ef6125720393e9d32bdb52bebcf1e7b9bddacb3ff2ec35947b386137fabec2f89d30f2512ec8c5d3fee2e8915f39f781c2bbe7e59fbe5530c6f4822cadb1906911942576ff27ed2d5ff49efa457f72d7f1287ce4d4a77344c1982418410a40007988e9a2118629cf1ed922b1799a8655564f9f2a594f3b58c28db2131fcab95642294a594524ebcea9794388637a4e809a3080a3c4fe07c9d1458ecc8ce86124ab0851940f18612173ccd300c2986a81443390a012261074f480118a4d0061c6cc8900104a51b9c200a32bc6803073eacc0038e60052b7e94602145131d108c104c710537a4001a9ac2a43380418b194001470eccb8c20f70908121c619151fe1048b2df860e88da325275b606122fac1095658748195460c7ed4100a4113204801165d9ca1e3d260c61551888146141de8400d33a4d0841751c0d185164dde50b9c1ea8150818b134cd10535a0b002025160c38b2994600a30d0c0a2e74484c50a52626c60030a39f002880963f07ce10736d30758c068cf393de98e67b0ccd0cccabf68410b9ef0e2c4f5feca65e52f99309a0c25f12294e9979491f1887c804617f993b1992ed0029327262666a04e1912317152853a0140a1ff40cb79e204651c299d91021b00592fa230729836788aa068030c5564714406231862820c4c90e407075c184e74215f7a00c71b58346185132dc280e40921b471f402378848a0051f8060fa000ace450933d0988209d800c3164ed05d0c010b52765d4ab5247f1d36038c4e2fbe088a4286a80b1c0481408648e6c8f08b2f4c21731912f9000a1f87b0a31b327acb8e328bb531a75b2ac37884ce259555089b4a994aa9a4a41ba155b0fa5641173fc2983928367e104218a55137bf4e77e7813470361736ab189dd21b9f20a4995e58e9de10b634390c96a8a0220987261ce548c484496e424fc6c186fee7eeee94fee7eeeef47377772a45b77279191610f5614640f3e0507c83b6affed27092276e70ea6fb8a7e2d8efef3078b5af370bd2b27b4496ef94523a25cb001027fb2520110e07ea73207b1a72b3fc6166390622c336b42512acc01e7e16376bc57cec263144e6393de0c94d4b02019187878707cb309c611a86b0f56559a23090fd232a3bab00f6b50fc262ed8380a81314814919090e129cfe29f1179364df25d1de2f4a8a0e09b89471ec47f8e313e2f44aa7213a67aa38eb29a574b7c229752e875a91b19e66c89652ca295dbaaa8d9c070639a35ffd24c62e76b18b9dc48d14db62aa16c4d89dffe492c8a12fb79c61a9958b96eb8d497894c41ecff51e39426909253ad72b01071831820142cc69ca3ec6cfa29d37cb35dbb6becd4bb3959356bf718af8f3e37149f4d14cf3a9cd90d3a2504400105b9609b9b9c938a86932a90ecbf065dd524652406c6cecc62591135fa65639de204dfa8ce7c92472b0e77ed31ebe0b734090f6d6469f320a75ab7fe372248e54a42215b97f2be23a42192b6792a658dbd485c79350f7d57cd42e556ef9014092b760927d87d2ad7f67e6aedb917593b5723b9ebbb7d936b91ea05f91fdb99dcedd5bed77b4ef1e7243b4ef10a082a123007aebf326d977b0ac3dea6da761ed23a7f356bb3b306baf6156ad986663f616fb81cbdadbeeeeee76777797524a39e79c94520cd37057830efbcaed6c1b8759356f18b793f25c0ac77119e0de6e0f75302ca7bce96239e52211e340e11d2c7710d29cb0e93b56f7454e6ffa0ea35ed0b1869cdef4278ce4df5efdc8edac64cdf4367bbb549494d4a449ec8171297b8c31c6d845d9fdbbbbdbe74f76777729a59c4db2cf499d9ab0c974bb2a3aecabe9d461d6909abbafb9c35f06f2f6ac21359fbee613fe3290b56f6ee7f4a6776ec8091f657f1316d259e1b0ce4ade306ccf622ae4f991fc9630ca467cc8b3e8e23b769f0c753cf1de011314387683c34dcf52bb5437d428374d83d223da051a07fcd14f8bfc4591bc75d42eaad45e1ad045dd805e11ed828791db89a07f015fd89207cad8923132b60408b624f73b96047b22f7633c14c95f4ee3a04b4e91dce512559abe5125aa84511a07ed42d02ac34c9813511f12604348b0f614bbf8cda1ec9c9bb8c86df369876d12aba6b7759b950b00928c7a4127f337af68d3db6c9a3e243bd99bbeb921d99bded2cdb91c2428c72a40ea557e881426cafd2a43406f7db3c90ecdd96f54879eb8ec23a713e3c859c718638cb1b91f54b97bdbddddddeeeeee524a29e79c93528a6119ee74c0bdad5b763b1d706f35ee85340a85b9afdc4ecaa3525018f55c06746072f728ac63b90e2311b9b712e374684622c64133e436bc43b369881bb23dd603ccd96b1fb99d9d1887b55f218410421bb326b9fb638c31c6bc257993a4fe598a452db91d9ab7b7be61b7fe24b9fbe476a6c48aa49494db9173694e8cdb71fa5121242ab7d379fb8e075df6da67dc4eccdb5b6dc3381fb0ccbd357d483286b1af19c39efb9ab91deeb7776e08a71df5fbb4f8d37abcdc479f3cca8d3f3a5f88538961078cb2918a832baa5360985c7421841c5f23824ef8020a8d880c4b34893423ad483bd2d2d08afca52179eba85d9a52075c64610d99552e9c9069097028a5943a96557291844c95e0504a29addfaddaabff75b9d230327d497fa394d2879576f1e96f94523a65b665d84512bc9067865d28818ce904181946318a9d61293502bde95c6a14e10d2f6e300436ceb8c9be041e0415818b29d698010d8ae88c22053ce0c209b4b0021a5cbc20e3c206f72524094c8c200223043dd9019d74d225191722d0a670c58f1fd9bf06613af542a80a958b2632b8060d7ab20004161441698a2048810b821b26578a1b5318630b1a5441033004e128086260128c4c6267582f5460043ae9945dec32f4420530984e7c64010b4159f04116de28726203339c28084c566ac8cab0c21a50ae808617521912050128db0cbb98c214aef057e3c0af50e6e5c37f7ff9c3f7fca5e978fcba0fbf077ffdc307c25f310f5f087fc1bc3c7c23fce5f2f08f70253cf2f8abc75fac872d0f3ffef82bc7c3d5c38f42fe6279f871c85faa871f9bf8ab47ebe1c7a268b43d547998827af871c95fddc36f9eeef197e9e1b78ff78fbfb299ec372482a8a7e78458a27bd3cacaa3e2a9d5f568f5f81915cda73c129c5327c36332fcf64870682e102a1feda42c2b96550e1697d58bcb0b4c4b1233299615cd4f9ab7ac9fb949c44f028920b2d77ee6934022887eff19bc037390fc24845822e6b9cf5e8825fe4d49c45f59f99abf8f04c7c69bc4cc23914410ac20bc4f7d0a7f20e6bd8738321f042b88d4fb781ff803383bde0010c7c7dbc80121f391036207e480f0819d38f158b9ac9ac78f04c7ce5c03409c24dea7de462e8898f77e4688ffd4434e08eebd879c10a64f61d6ccfb23c111d242dabbac99d71e094ecd0542c7dbd64d7d8fbb12717a5c56105ef71e660581bdf71ed6baa72d86df1ee2a8546f5bd7c5e55df00758ac7d59cd0973230ee47282e8bbdcd6bfdc1e0f73210ecc0b69dbba32981544eb655e067f20e65b98158416c36b3dee0ecc0aa2c7b7be853ff0df03b382f0eff13df007bcf787381087c78d38366e3c82640e103c5e487bbd841541442cf880083c383ebef54b30e17d8ff7d1c24c7818760d5f5791e37f80891e98c7d5b0c2121e9cec33211e3b6ef5567c99abe3da782b3ebe3742bc15ff6f0fde8a1f7381f0567c982b84b7e2bf5c07782bbecb35827563cb8d3e396e5cdd08e4adf82cf155370e792bfeca8d4dbc153f752391b7e2abc44fb931c95bf151372a792b7e77e392b7e29f6e9b6ef7782b3e77dbe7b264d8703ca2c1918735f3ac20b2c79eb7e267b8812e4b060c44c5b108c3d188060341f111132bc19ac14048cc0aa21fbfb7e237ee1f6fc5472299f02191726ca1fcd51cb700ca9008083cf9eba11c9f26432220b8917b0806e9204d3440e3546f15a1fb7a481ef96bbeb104c4c3c3c3d30451137f452d626005d190d011528eef4042fe1af217129cf8de04a3c10d6ad053e46eb4e433e42f5864e4af152a7c210b3f3c38118910e240f257c489df4bfebae106464338f19da7e847f27827f90be2788f1190ecc9b195249257312bd5e20b21908ebb558aa89b6d689ee1634ec3088115462033b1165580c28b28a67422e931191269314656c9f08b2708e5afa35db0b11ac071200cbcf0c2093d5a7091444786445ab8408b1244d1b4242c246191461a2100230c1340a9370072c40971aca0c9132ba8810856320cc30468649a61182720816441193f613401c50a425a3c51b34892340431a982073ad801d29227154002139468a102276c2086d015d3891016dc0c4998c247054d28420d4630011c3cd182163150020ac0f0828a13d0139080fee041054544c0c1185ab0c2892dc32e965ef075fe62acde82b7887f96a17f3b131149777c823a18a2905286886a61043259407942460a61e15f300304591839e1850a74906586445924c1d77cd117f6b5622e3f76b0d53fef6442c6222c9471d48e1a49edc12c73d7ae0f096a470d2736c26e9343e8c547d5f6baf61a07758e61b76044eda871467b30ab6448944512327c28032313fc6127ebd6bd572901198431a86830c810cadf0a0c22fce47e979691996e5ddaf8b27ac445fcebfba7c59fee5f679ab30c7ff1e5db17e2118925327d1b3f0345e447b911755936b921f333fccdf9f18bf8d7b8b517313aa9a4dc90223e8b78e4fce72d225f6efd8a38fd91b3b191b2d142e8e06aeb52f1572eb17749ac88dd80d7b44ccb322dcbb44cd328a5af515a5d56353ea59452ba1d993589b5b1ebbe914ac82d95658c2eb03676b0dff117bdf6a49432cbaca536cbb08b61987c2b5b4a4823df45769d90761c743219a3f5932ee91dfb064aa94631a554a39452ade28a39a594522cb365918ac052ec78560b638430c28f30460961062184f57e479cce643a7f66eb5bcbb9c9c9e9481d8973c5eec54f26d387f8fd25104843e9f73bad9fbb3b9c360b0bf17793a3cdbc5e7bf06d47b7be2d91e76358c5b08a61159b55ba497273a316d36a96550db3749b9c34f9a9bbd8f0648a9006fea4b13b3ae9b0d8bd63b748ff8b31628f61ee2becc69c6a1774c1307c24c6ffa17e91f8186e0cab185631acd65ae7c4a27449efc6b05a6bc5f2218df6b53d6d62188661988c31da98137fd36e0c42d75b8c31c27a84cbce19e3fc2fc6d83dbf678cf1e3cbe972ce19638d3fe79c73ce39e79c73ce39e79c73ce39e79c73ce39e7acf588ccb1b66036abb8ca2cf60d59fdac1ee9af5f5fb6576b7d586fad5f718d314eecf08ddce4e8ef238a8532b2c77dcefaf256af9b1b9d7112b1ae9e496ddacbe5f85b6bda22e672debd2d97c355a2d46aebea9169e3a7289d696f4e19249f4cf625fc886f95b1f9edcdef2dbaef264f4cbf6640e8b06d9b73ce59dba31ba5f4e71769a798ce774d4aaa517a7db2bfed12f8953f6f2b8935fe14774f9720d6f8cff75bdba73dafb5baffbcb57ed6671891b15917cb7d86d55adfbf564a29a5544a39a7f6a96f4ffb6fef48f62d4f29a59452e2af72394af0f0f0349169bb28a5e9fc338f6e3359cdfe357bffece96bdc10ffcc9f62f78ed5c896a5fc285dd2bbdb9dfa26ff73770e4af993524a29d5b417e2dcd56a7b765a7b04876c629a922ee99d63df50dbeb1f69e9d1df81ccb49775028034d95b779cb9ccfedbcbb6eaee9eb9bcc9d967abf632235976c2de717452293dd2ee1e9d74df16a19396ffd953126be19b93ce5b7eaa5d2d535d1633d93fd5aec6fe9b734e6a043af16ed2999af34ddaa9d10cdb52edfa5c3ae96472bf4cbb646feda5daeb4ee6944ba0bdf82ea41db3867c31cf23324ba46fbe4492ed9cf42546e99029bf2333cf9f1fa514c87cecfdb2e8d75a6d3ef9f3e91d2265c430ec33028de8cb09b921ac21f393382233123bb3cc901b12e7ed4c718cd9e57f8e9390d9c88d11e82423c9b65d4e8a6d4ae42d2620ca1659860cc3b88192aef02de4768cc87362f3b18fde5cc9df6ecc5cf6106bcde93f9fa57d91eceb6bd9d7cfb0afd8883c8dac3210f9836f6495fb3bbe6bed4016b66bca0dc3b0ee0ca317e69ef32127ff0664dcd9ef8dbfbf5db55f1027be77dff93de777fbcb9ff690e4e912238165dfdaabdf5e84d215ebeebec95f0fb9c8e9edf7d54ef8bbc9a7b78f5d999cb9e47eb134fe3216fcd5bc72bb07ddf6f151d7a5bdf7bff1178b0bf5fe3cb42be5fd7b6897cafb0ba05d9b296572317daa3fe5f6a33afc9d5ebe10cfa72424b7d26ecd2e362293e947ce0797266d4021d3c7aa8ca75a86c1fa43990994b557ca76db4e68745fd5a9b97ea470d3b2d30943c7906805f1078b7ec31f34d23044fa6c2cb41fb78ff6b32ccbb22c833088cb7f3639c39f1120f88b1cf783cd9afd8ddb49f9967769177c98e325941cbfcaf1f62d976353d7e5e9ad2a2915cbea21647d63f8eb561afe3ec39f67f157933f98846ddbb61d69ec16a110b56d1816f31a0af5d90b69ede507147ec15f67eca552d658f8ab415ae1cf5b020bfebe0c15fe5662a480ac0ab6d6e2efb336597b5c047bbaa90c806a9fc5fc863f9935ccaa2c2fb9d38c79d37f17b74df5357e4aca6f3676fff8ab89c12f98b5c22cd87e6551e1cce56adc8ea6fa2ccbbecbde94fdccfe943d97b14855ad1308c330244b682fa14838f25751d8f6128a8c523114ea33a9545f62a14aa55c9fbe4debe640016559fba83df636b9aac822f651311e01a9680944653411a38b6883f69f4dd6ec57d4db2dbb5ffc28ae1845550925d6509757b930bf72e3a77c9fbf9ad24674ab677931ffd554973722067f35de0bfebcff15fe56f9834927fc7547d9293b695a26738659ac8f4fbdd535b9e6bfab99112059fbcf08907cfa97ff6c72d44ebffa4f7aab77f9c9ed685fe4e4f292fb61cb9acdab6573b3fdcfcb81b2f87bc19f4da62fb1e0b2cdccba30d3cce280c442bc81fe7f3fb27df8cd600448cefeb3c9d6e2cf0890bcd90c17d9fef4f63fe9c3f6a7df64669d1e48b637d9e290adb5169221adfda01af657d206064979fb01a53ba8348b180ba39a748a21910100000000d315003020140e8904e3e1384d43d10f14800e84a8544e481ec9c2308851144429660c31840000081063666868260e9508ba105d5b444b511b30e76e69b6b60c4aba29bddb069816740e87e2b6d666fbf09bbc3e512a3e617b35f85c424980e76f56574341f1817986610a2129875f0e782cf4715a41e18c202ad9c5aaface8c912cff8af99a4be08a2457f4de02dee98736f7a98bc33f6a7dbbbcca75e5a70922a3b544af81b28be3a41ba797450a3dc58dffe5866a449f069ebf8aafdffa2506bb8e8f391c063eb86093dff15088fedc24ea87a4a9bf6cb869d0c3cb8529d89ae4463e8f51916d4ad5c3bf2f288338327b69a3e2288352d7d132cb1a81db96dfed08adf8b5a06b739e2910c0c02f7f3b5a3549e0a13275d6e99220d754618479912d76ff7dc166bdc22f6353a722db7cd3592ff5b1d1e93c9ad325b6e5f732eca0f5d241f02a94daad816a0a0fba28536c7c356be3ce1d90c7c7beaee5c83deed1c91646892c2542e7194f1837e8e199c2791ff257f23f3b474c6c22310ebc8fb0ca91549df388568bff86151808656215056c1afeca2ffc455c88885537b4cdb84ca8cc3e55f03c091996c388f94c130ede3212dc7f24b05a0d5871095cd3ccb4dd9049b3b73b03dc3ed3f874c9243014e567326b25b7dac6f1df0dfd69dcaeddb6341f6ce0921a3ddf11f2e66fdd9400cd9d63e03e8cd6a1ff0e00a69366c442e35b9c4a648248a4d3ebe1e29b33d9671f5f5a3d8aa23425192269e5497591d8bbf71f02ae40b74c626d9e0f6a0134ba5432e9ccb10161ef224a053c7c5230a8febd860b849a2817567d6c466d71c40ac7313e1220842bd2b09546f8b7faf1b10534a214efaaa555eba56ba7ae29ac6ebbeefeb6a5c7e857083b11c65b9eb07d54c51fb0c881055997f8e0f1d3ad5ff512a71e1ff040527d25f7df4e9c1e5948b18b83b13f9497a67beb40c63af1161485fe92b570cfa8a54b65b64b9884274e589fe111666bdb4089f126809eb1a547b0de9fc49c4ac23b95d34d4410ae3cd7d8bc87f0d7a05795c7a883596ad6235afe6836e5f0775f073f3c8d363ed4f37b5845eb41e28df1f358f610c004d5bffe8130a8c5bdb55ec5a1352fa4ce9535b7deead8f8c67d2027d20cbe8bf612a28794e1abf25137cee01c6b35491cbb6af806720c83f537c02683ab2e652aa5fe81326af15c7507653566a4ee0151522059a4ba95b59c7ebb3cd8b5ca9b713980c161dfc754ccbebc191a902d8f3c81dfda2a94f793517bd8ae4232d5baa87b59fce61f381ba77aa50c84d96cc20412289af4b9d0048fe40104e102f50057de63f9dd8964a764c0f70126c59e44de43a0d9fc17798a5ae2fa451806f10bc4fbe98c4bd916ea0610d25fd7e78840b8abbb29a3feeda5041c594506e2e7758999d0c10a6587d972fa0e34f1033b1887785268d6355265eadcf6e822533ca1ccbe1f8ba3ad92185e4b9c5784ee56c4c5c0519b5ec5cc95911b1ef65fee57bfa8ba520d37392d10c3f065b62d352d81bf8040bc05d4e44ef07b483a3ee815e362ff3dd7aa65ca4ad0407fdfc82e0f30fdb09b71b94d98bd3df2f5b598055a620a159ad7a21a03e3fee4863cb3dc0952c698fc94d75a00cc03260b651435fe44f6d78c2a5b9fefe0c9e177ebccf420e82c00c2da993d5ca3fdff083fca128f1b2106b8abf081ded1c4e5f30ce92bcb7ae2026b671ac8bd775841dc10bf28fa2a02d065f6a6908e15afa95abcc09873808900843762343094e0c0601ee82ec33406bbad75c0c5f3b909023e8c5faac3b2ab55b883587ae43118f419162d596c6f087f208ecb403942fba9d224982dae763bd1577b10ee0cd825224652a751a133d4586144500ec3eed30d312ca22e620c02892e606117d15876d7153644962fb0f998b0af5efb5640b4d9adc25efffca46cb9b08f8be767d481e4365dfbc97e319a67e15f7133be9312d9c9e055c0939f8a2ec13cdc00787193764add653411445553cb202ad8ba928d8eff4fd1dd45ea00d3bca50dc843f05a8874a2a34fb627875101481cecffc41e201c25336455e7f8812e20c6ba75a7f26bb465d73b1febbc03a00bb4c41e2bc1f358891d04f0d46705dcf318d6049088f60cadcb32032ac870b93ea23786d701f3337a0dcd7af079d451d7474c4a9ddc2a18834be662b224377258b0e99ad92df71630199384b60f727e0360e243c936849ddb1061a3b81cae9bbd545177a18aab38fa6c65dc70f71e74042de4b2f3ad3e0b7cee50637fc8e44a08b112d1088872e2fae115deb44ed3d31ecae688580f49f8a84f3729135319ebe03b4038b2e367c3f252b6e2588cf318a11785409fc6191dab054f2b52dba7314c27fd6777ce3752077c06c46c58cf65e933589323a390b000d6ff926db87c3f90197e902aa44f19b31e8b55b330b1be7a34a1dc59fe16cad36249fcea235b3e3a88f1949b396854055a1e2805b1cc0c83b33c951c9417b326960a2d3a2c4403f5f2f3c8a4a37a05956a789ac7dd6099ce43463ba0973ac151dcb7f50fabce96a96d7d534d3b4cadeaf8d570f61b681a17beba232895218f9751387b250789b58480960f9bd88eefa86fd5db97b4656887fe401ceec1912aa6e4dce56e4be179d655c21dfce2ca9064231d605f112152b5bc032f1714804980e531544b33a6b8cc0fefd9fdf58db5a24dacf4c49dbbefdb3086fc8dbbe7b78a52468292619cc5c30d9eba048cfbc6a634980d8d0b5ccd08e59a0bc3b7436efb253d221842580d5be499d1e29b0a1bc5b06a9463f1c0595cf3fa2b0d46994628187917f5911b9762cd3b58de7b69c072c938f3b1385d8be6fb069a2de93a2f490da6547d0350351c8023c5274f5e3b560951b85133e8f8a930ca11f860b9f04ecc6a8225c3db0cfc9807ed005c724b4a08f90c178ac9097d1cc004d6267ea654e1038ccc45b3f1f0a1d08120c549f9e6204ff62f89035233aefe4312b5a5ed5d17c3a838ac73fe01b33af941cb423230697880f82b48777fc45a697a0810053475d5ecb408c8412436e4087469417edf32894c7f8b796bbd9f5e92c8a94bb0c99f886c3b2323b2c394d7499d4846d2fe3920704989aaec86d7780b2cb0e2ab42eddcb5d1f1bb1e83f93b6a40d58eb7f9bcd1690b6ef1ea5fa30f272390debbbdfbe938a6cc9aca7c5787fe47095f0ab2b15dd9a1e5f2fc2b1cdc119885b7dfe9a9a58615c2434f60ab26341f0cfa7cb6f4bc9a4f9114ba7fbd58469728150a3a33239949038c927de048015c5a9c3a2f8fc1600630783fa9c952d5678479c6fb5eb4ac4a8bf6ac4a0a989e8c03e7c131604eec70723965df30dab3969d3f6951e35ed0ba0fc33ff2115cb4cadab2fbb4c17640cd5179e15190ea635e2634f1ba9d57e396c3c9a5532175124ab1d024e49b8e1bf0565f5ef17f5a297a27c1ef13bc3d02dd41307b09bc9bc0f711685702ed43f05d82be4bc0f608769f23304fe2731a5e529b597f92574ed3b8ae805e29daf5357738d71e10ccdd22b5306592ea2a287cdc45fe6e154109b83711da721c7d853f60734be34edc01648b89db78f1c94e5dd50b4c2e8890dc2d11690926acabf8322f5202e5e4c21c3813f705946f87b6e038f0cfc8ec84bc1530f9f49b8e3a02ca0e2cce22e316270808b4ccf8695a655fb3538d236aa05ae7ff9a32f36f0aecdb85dbaba51ff7621f43ef448a2fe9f220b41f41480421cbcb6d91005a53278aeee5c877d2bec72082c5a0f4189393a0f6e0ae768e2d1958584de3c19dc2284eb446307ed5c47b84a328fd452b571e7e81a213f928b27628f4c084cfa7945b24658a7a8768ca949b85e0a261804bed03f85e956d7c50b10061a80888e3cbb51ee3c1dba943871fda668675426d78b17682ffd88ff9b0db44e4f082605857f0103dbaee2104d85b5ff13fdd8719b04867b9c17e1f215e6de60cc80830ee76bdebf20119c5400100d22b26e748323d99923feebd7031cfbd061ca2b9b74325a9da394f8d4cd2bc387b75fa46d05b322fef2bea0fc968a61d5241ccd3df269ba1dc579f8f2b4a244283f9a69e5d0b643392f35e7d9e9e35bf71f7d15a79897d87c734a46cd6bae38e0c57c42a1116c10d67c5ba5069644da9b468d046666f6e221a9739b43b9060071bff2aa6e80f8cd3c08f913d9c5972a5fa628f17fab01bf925347439a4522c8340a36ff12c21e837b59f0c6d761719df830856a67689f0e2c546c6edcdfdda0e0ee4249deebbd9957a148b615b6429385025f97860d738dfeb792583d34d871cc949269312a1f325c700326f7981676ea4568d3b67e249c310d026bd487ba3d2a8e1b9f6ce9ffdc5bd7621203dfa1ee835088479569f1e183bbd4ecd463c46e469194d6cff96711de2d3748a4a2310f14d006b1cf71a14b8515faafad92f321d5cc686128a4445172f8db1624e522d20563faa6cc0f5e640862e84e171139caa22000199c886b65a951c7a0eebd3a9c8c93d92eeb29147b6d705f6e540c88bc6c847465d8059da590e0dbdf6acd171787a7800a0e13f73df78540898c7561479a0e363ee692a623cfa1f0ba3b1bd046d97bbab28f120a67f27282e21ead4fcabacb84df934b6e2733fb6b50e56936a285cef6b7c617d90ef5ccaa312141d0d8dfc2cb04af483491e875e6f5ebcf7c69257db1f8fae398519807c856cfc3efc5a5a4081187249bf9b7dc3004c6c447e14e1f0209d297ba732b93c053c3085ddd9e8cea7d00ec9612fbb157bf158786732c3c8e3222a202678d0667c96a1e3777278004330b1230536c69e5106d681f349399db18eb9b1a7b8e9ff7ca00287a7c3349ee0d0c779457f63afcdda87557af9e27c7a9a7ed06a362980be999da3c752ff5fb58c22164f607a11d8df7d930190f7c1170d38b3235bfb7c0d9b0e37b3eef0ec5760fbbb80063b50b9a28adf0e5d73130177ecc7507c89ab5b9817dc77e51c57d1743dbb1b2f025eed59e09b190b65bd5ff6aa086e1ca6ea573fd532fe33778ded4a182b2b0aca8b1e3e4dac6aeba0fc56a97154968d0e46ae8c8c015817ca9414bac38bf588cc7221255b6800004ca58a6d2daee6b1856062e7fe426b3f81da51dc34d08e8be33171da4fdeb656cff88fdbd4e1837ebbae4fdc62f032ded2624c44ae98d51e0b445a6164968daabf745796db2d101a9c7f2bd5094a97223fb3200eb09d8432b1c9e1628bcb86f537d9cd953e6a7a8c93917a08e121116ef6bfea23eb495b6a81fa9d53445aab4ffd88ba5be205d9aeadc2de57062797a5211b556f83b0a7ff6af1dd93a77106870ddaaeb0918716fa95f457b2f605e5edca05366babad6232d122b58688d27802df0488ec4dd5cbbdd93147f25a030f9edb2ebee7f72b21e28407e09719c0ab65ca00204782a00f6dfa118a06cf35bed338a6fc7bad734db69d4e8b5cab7a5b627483eb4d0627d8c95dc3384f34f613bd03f8efeb230d3e5aac1461070801372e8d5174f4029340b6425986b312a3c5a9279070588329a888e0cef1fb7fd45915b8f87a06b8a22a22e9f4997d50698d352ad2bad9368650ee7e2fcccae464dc146e9efcc02a2293be575f4024fb2f31a5af8036e7b03d9c99c22564f50bedb3ffe796983e80aa8a69f1808dd858e8941387867d9c61a6db7ecdb28886bdefd02ce6da312647ae82ec5d14a93e0ec47b267b77b4326cc8e25e6947470822d13e7710b2fb429cc9c3a40d91439995d0052a82c0ddfc5259765d43f916f48da4a878c13cc385002410148b71cb781a23c19137926f814e718592fa3174b79d9acb9220ca501626460bf9b7e0c1247fb71a53c6bf2e6113c1adc10127c2f75748b3e1f0d586e648575543a8908e3f1c50a967a888b18b0c81f8c5273379f9a5c34cbfe85c0fcb72f379443621b1595daa34ac490902492d6e9194a23db040c46a945875dfbdc1fc435fb998ec497b88d7c7655261dc0b38e80d80cc16afc79a1deb1d8da07f63d57a0881dcc9b496e18c473ec7a3e1b7f20937c26f9eb7bc78f869d95697d03356589185f87cfcb1f86191c627166d7c624bc337961bbf63b9e1855888240a807d9ad811314aad1a4be2c4f4e00a973e5fe9819a1145d34e351c97931b74aa48b04de58f8bfdf496c0fd8dc87bf3f6c5f24071d189cc88e35148c1fb63f88522ebf8dc8f8f52da880decb6b1533579f04a179964ee9f4c16f8d9073abbc48ff409395ff38a912d0f1895fae4930dd3379d00d479ac751fa489e4566e3f8e8c41e8255f10f5e15854a1a95e45f087f13250926d5e3fbdff8bb75128f391dda108a9e60bc5ef39a38a35dc06e948a915222b3b9e6875998ae54771658a3270f5212c7c0542d6e09d55c277316a4aea5d2b2adf6c0cdd3eccbec41966af3acfdee276db12c00e5bfdfce86b02f6a956a5181387c286589e32a016140e8d0b8bbcbf089e0f09f541b90c7918c819e98f8c6c034a3203b2d5b5610a03736095de9ab2e2e2506c570e007468927cde88f1a8f78adf51bcad7e009ed9d0dc2c3f361f8c046dfa4356761d00bff319e1a41847c92ab81de5c20e21932107b3e679eb2144756cc6f24737748a643a39dd150cd4f1a727ed749a7119ff0a993ac45bed090fb18f5d2aa2bb7ad610cc73502aedd77d7b6c9afc32ad990956531f96cf0a906c0b4af9baaf8f7acc019df8c1acfff89944553b2cc41f0495e2356b1217c7acabae2c4a7724e539d30c0ae6a2957516bbc3f60c7c17d0ce122605c0f43468714102985acf84812f1f8a20029ea7a8a0ff5a9da1478da8cda99d54b5404dc0dee8a0f17005aca3c7825d6a73bb226855d4a9ca245bd2f5cb61e0ac011a54e42764ca600fd1ff20090f2770e9e02d1ef39f757407688c0a7c9a49007854d15282fdb756f4c2f29e37a919242b5735281f57492a0d6cb746389b6e5d261c594f044fb01965b74a11b9aed63d2dd8bc02f47fbae03354bed7b305ffc178853082a9080e6f56167b12ee780b6aa267ff26b94b0bb5387262c1f95eaa0fb284982d4e577b45bcd6085a07d830cced2cd73b6ccb030b0350f0971049e6d3fb916a43bb1ad761ce409df64d54ca591499aef62a79950284991febc6e7f5d386f02c2c81b3e00371e5491a226dfc77c502f5215cadba7ef70ada961a5ddc64080535a03db85fd7eb581f4939076a8756be6fcd3e19697ccb8bf1c9533acf9d487aeae009d1984327176d63edbd5d518cd34011a6b02cbc1170544e2a40d894738d2911d8e6ceb0c6681bab60ccf11043dffa61ad3ea9a11e6ac9556b0d62e0e79388cf89ed70bf98fec949fecc169fead8abc693e5dce6c88e13fb24907ef7ef8197f18301128490680897481138d11164f2bae3f6f53b7683040ccaabbfec3f56a4b439aa2be8ab1f87ce7ab2fbb39d19900138567db5a5ea0de8e7ada9cf6d18e923974783314b51e53347e2c9ca207f78577ab430e2d1038f3c0a205a54625d3bbd17c493d00d4c78dda67c56828da33ae8a0b4836b27bbc31dd9ce49bcf545cc9820baec479a6ec848102c47240e7f1201e4064743533fe44ea68edbf8d1c59b1fc2a9da1809f468ef060a313ed94585d4b1a5cbdf232bee78d6f3b594637b5369cd76eacc7f0dd38cd20ced90819c37736c6c8484af89fca0b330ede4263e365034d25e3fdb37d2fcb5a3a52643116ea43197400c930586ff5ae071a1312b64082433f619d75657bdc372d62ee768aa951b56fe8b3213074e595b3e51944cf9f1eb118b0d99649b36341ba83043adeb65966a1b79960bce3afbd64cfeac47298e4d03655f15e7d11552e39036e71b75ade24b5525fa216fb936a3d074edefad0af62c4edad0b05ab08ebbb7b0f620a7e5814c28cc39032627e3daf911f4db4026ac5331e4e5e4ba4c933ce0b806d97ae09fd99084ba5d34aa4c171f9abc96f832029283680c917154ee08313efbcea05b17a237f46845a774bea6bd91221003e1871d414d502fdf1a65d5a1766c8972c24e831959dd4e67d200d37de99d12ed5633140a100a787a06f10f23bc603b8478f2e3a70e4ae505bae7b0533c3d57a21a17d59d51e93aaa01a49aa492b47c20bf5195938a5b72afc1501b231fa44b4a2baa40206ff5902d7a0ad0ddfab3663e7c99a9e4a63a67214248f79bc827cf6c40286ee16b8807feccd869883488a939840cb5a171cb8b390f234a021f0c69fd6403b1452db3d3c0b381b82261c91c25bd10903f11184af1afb86ee4dd5f4524db05943acc836ef458ceb8c7a34992ea616c106783fdf0bc9da4d1a531b55cc7aa34ea5cfe086c90d10b2340c993574406f9b9ff0f9091c6a64c95a536c5793d9c411dbb4aee6aed04c3e76f4bdb1757ffa9aafb524c10b42fa994b974bb6c008524a1ecf05765fab6285b6d33c92c4fb5584a46d655a5bbac0f7bb03d9cd3ecbe1b4bc5c2496dd54c83daa7d846bbdad26c8d1580b80e6b6b3d6c8e5aab3a4d025fcb5b8be58e955c08991b04c34f610686018b95219e31a2cd0f76aef313fc3ae9391c75c93ef2104d9725940578b4ddf8afbc1ec81804615bd3d2d1122199d409214bed1e4216531b1ceb69f17ef3b15d11108d808f25e0b9721da4cb0a37e2d64d76d995f0a69ecda9047f365381c892c68b52d39c3ff1231fe39cd9be1c08a7d15ca2f79ff9553c8c3c8acaf8a9c58cfec3aa5458c6786faae3905d7689b4c37f2285dbc9e05d06f31ed4f556c541e72ecbe2c34594960517c9781d0e228a32f0e8aa9e0681fb0e1f0d2c19fec2577d5a6a84a5228043bd0e57d5628fbb571203180b587e90998f6f38bdbee3f62f7126d260bf671d8613ac7f9a0db80c7a21430b890d8104c86fc6826d99c7e539cefd9457276221e82d2f25edc371851280d2242fa2d35d28f24858f9bd4af63fbbe179144ec1939be53830d58e99c450f8b4f1322edd9b836c3bcdebca157a74c1b3fb0f06fc51307e80ea4534189e485faf07e9c0dd3485beaeda9ca6d93e5d4e7ff1f2169246fa8ff22c5ead1ba6584f5be392234d66bd186e9f590b80ad0e03b90b3e7136d0302810b895a491ca00e3c94102142408143154de301d362a29e06cd38e09de61fe3ca7d5e121681fea7e43190232f105f739091165b23ae7dec42d373704bd61516e1e9ba173a61b222adbad50c5889ce9c865a51efdffebd06827213aea5e3c5668a4a2f7721d2b34e3dd688e20edd0cf4b48b7e51e7491a1bda9c4d15b4d1aef3b9534c876efeab7a08b9ec22897f691cad2349cd541599a203ad45dfa8ad4a834a41a35876876159ceb1a7c7cac390fa908fec44d86c7864064518211f9971eb0c124a69d96c967840ccc1c61eb2b7e39a95947ec40813ca995a601c3ae7fc1875c72fdcea1e99ae1e6e81799f6d56793f58201e0d895c42b6148477eb89f1f2177dd1951208be963bc308db5e6ecc5462ca68442c40df9e54d6610cab2352e8f987a1962e00e851c4f8b90ad9ec7e834dbafc123bccb56341e4702f20e6aa6d4d189f60520cf020a88a6844d50782cb20f5fea7be0024e004b991b6a564ad6d36961c4080842e607043b8dcf8e7f2e4a9de434a2cf85b8cbd655660adffaa0ca1888ed4c07baf99d163ca27b83f814112a2a2da6e85be7b737bd3448dafae2873176c730ee863169e5e2045d6a60d6d7a7b9bc65ff79b535bd09122f893e2de938d6afd0f9348a9abd08b42ad904b5d55487831ce68c6f471af11490930f7d4d52e53b19c4c4c6864a47533d34ed34b846676ae43d0cf1132a2e97c0212f3dc07857ad972a84dc404dd35cc55e1692fd6c55f5fc469c1c909169124085e063b98d09d997aa0bb93a8edb62f140a2678a230e490b3611d09096a8adbc01fc48c83918d2f5dd6a7dd38101fd19111be9dea5514004a80336541950232d1c02221e935dd79b207d44deea3b40b86b5be430304cfab580fd5c3d921f74d17a6f7c964b4e8d55189f45fd3c5700c5237b90981e9f6902efa6a31981fda143af62f8dccce30e638c094d76898db93d5769e7a49a03d9dd4b97cfde2975c6463e9a63218d117573cec9e58ca8a265e34370f6ecd6278118068a88317aba89277e66e0b98f337448b69c19f3241d359925d39716252536c1a7d40cd9d9cd7ec907e8abf4e66cd74a3770c2a7f0f5a276e7de29c8e16e987b13e4fdcb46bc28290e9c1db52da19b720a8ac0a1b9ee3696a4e9ba19b8be793a64da80b25c898d6397fb658b279181351f27855a4d71504e65d1e04b2a28b1ba8435cad4ac11fe44af55ade14dbdf855cc2d79c165995a7f3bce9a4cab96a38759dd72244100c38d14906fb8702fa399724167f627b979931c8e26d96a4be094656e9fc9c44d9f7cf9583bd7712ad55fdabab735290096e4dd93e47abb0c0efee592a4776306043b81b42d417c659a68479196c8e2d65899aa371a43e65bf6328578ee9e470f55fea5ce8f3900c65cb4d3b3de071fc64b44384aa82445b3a1115150086b1c254dd5e9d52705cd965dc7cfd16cbd7bd34012358efbd2ccf8efc7b5d8fa164fa46a7c1e5a0af4ee447fdc7ff0f6ca83283ce1d891bb820fa4c1ebd9f6b6339b36cbf328567b3459c3f65675e55d8ca3e08560d7aedd34928eb9eb7b4426fd57f7f8b6ee8b6aab3b0faeb25e24795b079cb1e77c2d1b1136891329f4e9bda4f1a26dc2c981870d2827e4369c56609d9580c05a9df2ad88e018d245e9e0510e1ed06b4344b71196b53a34a9e2f82424294f5ae4e95b72f3edfe6452b3769073ccbbcce0ec61e160a49eaf0c547d5ddef166755ef8258dc8d3b98a6cf5ebb5baee886e079a00d16382d99e152a86a874da750ab32bed00cb8506620afaed7411eb8ccea895c875a7dc7db40635cb68e532e8a1a305f706ca86249752251429a7cc174f19ab52a36475bd3435fdeb4c31eb432475a541c7f1d9c354dd0a5ae81ef04ee3d34db782c9d3a18e1ac957925be17fbfc030e40dd7a6d0fedae701621a0801749a074e0c4046739b83bd10ea14d6a8d30b61ff3d4a1c7393d4dc17fe600293881908e5441f8422f4e09e8af763e2cd9e3d8349cf8064de08f009a06e4fffe8212f9adc175beede54bbb1f28e99f13f04ff60ac1a4c447381ac068c018a60159ba57614c357b62b2b8ef1cb9b84e056ffa18bc461a8ce52352f8014d5e63032fad3f43d0cc114acb8d62c242f5a6635da1bb71eb792bf2a0ba957b609274c1d283a6efcb9b9adddd826287dceb589d39b4c8cc41b4cc667a8f18986b96c210895f4bfb80486a67c7e3f80d109a8f6fc5730b418d1cc64caf04a4a988c234edb0fd0b56cad3265e57c2d2b68c482810087d78802681d88c5868b9f2768c13307945933a7b652000b23f2deca0a8fe762f64b266fed6a7e15cf1ba1719e4ec95949cf85d46665c2ad3296ea7b702d260ae491490f6c728e1bc73d8b43b98e41a239d76ed9dd2a31cf61a5aa8e260043a8f2c7acc18d65204b5a40bdf4207c9fb068647b563cfc23c5e2365586227f21b0b34a8223b41d3d0e20130b8529de01ca6f3aa66b07e91f48df14dd50f5fa65feae455d38a65ff490ca764fb6ddaf55f212f5526368247242446e41ddedb27268a30d6363645423e8709383ea4a8fee3b0b3914423ebdd295cd1394a0dcc744ad15116935b1524fc79b89f628a70015717417be5d57ab90fec58d5bd50a90e4fefe261ed75023928087980a603318ac1f5ff6891be900505e194e23da27a32e81188077b1b18662a56649f0647534d9a938fa062cf83a407bae595ed517fe8a5df2378680425a702007226927916ad26651fa88a51f0d76959c93b659b554c25c25715996342838b580d4a262a184b713db29fbc4097e0810f46345b829d550660505c9431c66efc60b718a9ea6ce88225ac311caa43b3a8f81c2b65c68296bfc06fbdc846470a62ed89ef1c177f4e1ca3251f0d208ec880dd8d687afa3d7e6fc7b987c8559902c8195eae1e564a5825bb037592ea9084e798f1f07c0b1b3b702b8a6843b1f2fc7b4edce7b11208fe11d4a146a0e19ee0ce98127bb92282f108ec2dfc77299665c01216d29ab8843c130f42f92bf1b0abc529e419bbc01f5fe0a0b1d0ce60480abcde2d929a4a366346b92880358404a02b85094400c1296361849b67eb4acc4effac0540d621632b53a457340724f7025a3018cf28deb72662f13cd1a9eb977e570fb0a93055e8230c700efeeae40022179cf825eeb5dc03d78fe56ee77107cbfd26675d621cfb41f55e0d35160a12a84eac5823fb1eda80a0e37c4586f1ef65ed876e7924aba0877663182fbf6f9038fcd7d82eaef7fa2035bdddf83839af987fbba676b628938fb5159e219800bb050370b3bf2afc8f2c258235b1dc4d99e60428ac62facc987b6a412766d4f3c5edcbe6ad67e0bc8528511fc504172293d75269cf84435fef814e85e2d93215a01eae9af0cec2d409e336845126482bffffa4451188882fc75a08c59cddcc1cfb15019d34d0d76a76cbe5c02905f391799432b610a7e6259a373acd20a6e36eb85f4db9f8c526bd3645a988a8025a856fec51ead03fe40638d44ea134c0a5dbf57b8332215ba20008585344d81047e4ca0b1d3b132b996e8fec44a55ba8c28b9f412436d63b73d99b8b5c167efd6000edf1a58cb4258ef3f1de22e6a30da3c0d7c7a5841a5ec4e240474b8808dd3f51c00c567dbfccaeacce29147bd1ff433a3e40472bfcf9c1cf8574148f3bffd4386e62fdae7f86c1913c481686784d88ac9107ffe228e7af71e63bfff2730c74389faa81d6d7e1308a5fd7f88b432a6f9508808ac799dfd2390d1a785b0791ce737b6b5c1ad4137b0acdd39f5f9e224583199efa1d37ff1b69da75e2b36b943c160aec6a4794207bf8ac8b44be8146b7048aee2f884c40567162e6144c9d7604593730385a803179f8324398b1f4c3837a535ff9afd16a69ee490f1becb66d1d045fa992d0ffcfe5451fecbff4527c89ed25531b94df33c1a297f0c314e467e02e8cc1c08dbbccb394b17eebc4c40b0e07b670f38ecf59ccdab43efec73d674b0cce9dcd614168980c610a6d33b924f029c027427bd8fe5df703bbecefbc875bc49aa24110fef0b90adf863ccded091d0bd929f314378d3bbc6fbd05589ae7f472b6333b337fcf0dc83de819c32d14f6bc9b8aa048f79d019b232013522bd2f49ad6d67e56b7148239db1bf8896c675bd1f12256b70cde5804ae9f60d13d217a8d717a56da5d00f97616942047719aa98b1bb94bad9d7fa8b980a3bd574dfcc94fef0f804b63a0aae64c4c6f74b504985ceefd5f374fbc29a7b3bc0b7048b40d4e8fd2b52de68a91f73ca0daade64de49361f9bac093a42ffca83398aa3d6c8b2eb5c3e33ff70dccc65ae6f90424874d54a89794b644e11c64a9e07df7b446e2e919efd3d4a185807425763d93f7f416d54748e2c56b42dc5efc035d300cf965ada12dc62e6ce1f3e38f0a413ac8d0a6219695c3b554e243c1a2152a2aa59aa38c7d0067a890ab2632802d8d234d6dba718f38bbd29d3d9a67a7c9c5ace806c2a3541725762f5ef60753d34c7fc407528622bd61dcc16042838dc03fdb6f691df14755b75c6f744f84c54a7f1daf7975a1c45ce397444dfa7b9d4a2ededd5d2d2c4f8ac1e35dfc1ffa25aea129aa61295d9e11325422f6e0aa463ca4a62ddde689ca6d2ae4f1c92e51032b42d6ad499be78436d00b4502b0931e91d421903357f624b8b35652eeb3bec9904094b3f184095b242bf10965d598584fd73168a8b130ef480052763e7572167aa834ce80d8e11f9807ed2cf23b6ab266b1e3aa6746656ba7b4b56eaa8f1ad15969801bcc6b35ffd86d95a0688ecd611cea08a95cc98cf04cd5f0c87d366964346b303d1eb68f4cae75043930172119abd89a5c985ca2ce9d70d08c44e7abaef422f0529c171191d185f0d7321cda7bdf8120cf520544f10cf8f4719ddd68cb1292caedc14f69e4ee9c17f6946d119290c19156e9e057153e4e0caa4d0eb2564694cec93584c097f9d6764334948c8ced4171f7c2c63ee55eb0a605d8d5cabd6c9cfb6a8e80a594076baaca69a061a41051cc1595b2d6c6b7bb031b250208160791738a9b47dac1e7b7d2bb79f3109c0b99e04399320f718290825c43df78b58343fc2ee278069fec5693e6b09c02a4e0aa2dcd77ce9e818ebef8942cd881da6e8f190e6323684236900665d6ae1ab377f67a576f5ee0758e380a5a6512614fc16f63d7833e9681163752d4fcf27aa6abe0ae4152af252875e3042a65ef8e52d44b4fd19f219f3ee29757dc9a15212f7c39ea27a6c9ab3482889f1eb259941274fb22f8eba45d463640674edfdc739192c50734b5e4d132249548eace347a2c406041a25097a73d1d49b3eadb952b9eebd63705997c47f6c306568e19d6d6388eb06534a40da18f2eeb7b9c7ab3ea6c045e79353a84cea4cc65d8a6829526f9db390fae0666badb4ca1ec81fe85bcc4b8a8eaf7c3859d35571346b5eefc8531f559463fc68f0d97f12e117ffc4588153d0f7a9ad069d5d74dd9ddf82891c9f9e39025346270fdaa81310f6bb936c964005532f873feca6130246451c2346c377848652d95249e3329c000ed3b6f2dd3adc6d980eb3c849a9fdfc222b63a4e619cc83240a32cf90d87c2ec2f911e00a2038a5a4c7e426fac4e94c713bb3653a3ae6e35344078b4e62a35166532ab4fd5617e90f8f85240ae23fa7f722765dc665585b85a4120beee51956a116b7bb178dafc7cf46b39fb76fcabacb7534a3ad0e05bbf134db383cfb202a4088e8784fc9745e8874719357d9c14b94ea1f4a8c6748e007747eca808bdc69c48cd3905436a92d032ecce9863dfc8bc90aff3a4368adc203a981da864aba7ac830a68b83bb14317c3281e631c7c713d9600e7cd54de728cef31214912bc2e28f3846f999457cca441c004d850842067e8c1d0878fcbec2e41b56416f45898a922fa9abf4b0f8142ae2ee69d717e6c6a22490628cfe535488928b3651151b6e7fc37cc16c1c02e9bb22771503728ff6760a0c3486c157d339518126194ed31054288245c99608e412f85fd6328e82e82a30d8798dd17a04cba9ac3f2043f5a7fc250a8b09d9e8fc946b6058faed4e64577212b87bc555268fad7d1cca3cc94b00f5df09b8306a19750c6097963d9cbe2a2f8d2dc2cb00614cab48d3ff2a3d4a0058a01ee949e63193b86662c7c642a2e61545fa7d39ba92b306202624529bedfd38f292a2d2abdb117ca0397624f172f49a70a8f6f9280c6182461d9a01d48eb99d30a898a29d0a5c8818eaae1aec4b58607c37133b495750b1480e77d15533f99768306d5961940b2237dda5ca6d73f8a46a5807b5dba817dfcddc79336710c5ca0879119f967cb84b6cb399c01db1815170fb00be2dfea844bca0ce23d7bceb876d343f622e6b1bf929b949b719de1782780f32fca8b1a49953cb04ccb3c73898de20203599fb47c6e9b873d32dd3a58b6173df24d1e8683a4f2ee346184ce95cae5aa99d67ea87b84f21ff86bace154862b975a4e495eba98149b55f31268fdaf65de0a7fe490920d465a3defb33b643b48c4debffdff838290d6c337e20fae8bf202687259e75b365900962052ef404c22ef1d34af8fb119bc1b25c601321def3fe43ba807509c5fd1e3acbce952c7737ecfe9acdf4ee0699c75152ef6d8cc4e5bd8bc8cb42dca8647469cfa5d72f01b62173e7c354af5d350b66665c82c19dd29ff743143e7c724ce31d5c6f6d127c0965a6e52bfca53a5a037c731684969f4dfd8395f739922535cc05114e4db285dbd1f5f14e7290b5e4335cbef5b7c86124317970a9d1635675e0736e6edbc913c297059ac88c0393770cb1b84743ffc178c2a7af37a64fee208518186c0b2ebdb62b26cc42204638110aab27c8447c5a8fb1ccf9a151d4514d6ee0b857db11e51708260f8ae84f8827e7d88bf487366e6cd310a82882a53a84f2018733403c9771993302eb3c1ccaf6363932348152142702967238c85d36b4eab09ca2284ec4156f6710876c36cfcaddb86f5f100ea42242c3266cd8cdbc95538b7c1c1a6e13dc24448add992ed8dde8493e31a432f5a80e226f0b63b364c34e34f82f044414e1b381c21c914718e14d69c7b9f52ab1d3b1908c85c265aa80edef45d005923b5042f9b95b281cc036f7d972d12a04b7197ba12da828a25af6835341f491cb4117e876a21c155434c889aee98b5a3533f1693071d9ce895792f7af21987987d6a8097fec47d91d6f130ec552b8478ea34ceb6eda96c93564a27b4d3813ae8b47fc588a43ccdd32aaa48f5aa2cd3383c6d4c00918fce703467f6f4825334c68ba74ae604566365840b483978049090034ce41134c89e324fb646a80dc30b57ace856ba2b8f6c15a071533ba3a584fbef62b0f7f6459fc3685ff7ec55a2d511347a9f43c5cef678eac4583e865831bb819d5ee9029e628ed2ac988e58f22d2fece9bc67c7b000cdc1598d9b592622bb86e4e78d10e637e1a06f6300cfef8850179f2cbf96a61150cebba8525d98886f1dbfe2674e86f84fa5d5fc2902e481f86f93eb01ac2e830fa28076a2e250c245361b063e4e503b511663c99942a77c8bf5c182d1e2207220cb4aa88638c42d659d9727a02bc88778735003b3a1a96fcb0f1fd71a91ffd48fc8b376eb3eba4572d866497545e1190c23c6c8ca322d3efb051b4ee4af4518cadac5dcbec091c64de6da0284fd5c14571a9dcee7cd8272a564d0bcc92ac55c1bfe763f1fdac117a47d8007c15e01f9e2b2f2e6cc8de76e1bed95dac25459d69da0359dd0b366dcdb16ae9825ff88678f4b4d5ead5f6f4259efe493962219018ae29d0748d092d3b2822e0ce353e56b153bc158a10ab20996b986ce07cf5a2da3f02db5fefe1dd468129c742d303461b6c35d4fe06ed5445e779df6bd681bf3f83a19e75da77ed19e107166b4cbfd71ba648a44693316f421fc730a473f3c080518e8ff9edcc589a01714a91bee251956d7acef265c883c1e560989bc33c4666498c44bf46d5ae229385fd66de5a14c318cf64d070d705578bae3c38c388395b592f57d993fa87cc25e41aab8f7ca88fdc67ec3eadc000ab832be4a28fcdae75f1ca884ab9a7b6d01628813d81730ebcfe0c39215546232d2e7af110381798bd9cfaa57dfa1bdda7cb67b03ecea6cc51c359217fc3bbd6cf1869a3660177ad9af53df44de0240311c95ac1a163afc831ef1b83cc2ca04793f847444fa1797d26d9bba440a0f33b8eba8b680fae0135e6b6b6c5f75641fd3f49d003f106827b02a70d01d0b0ae1dd597e8f0bb1097596edca783e24130a72141e33310ccaf3f7092c68a86c8601ffe0e1f9234697bc1a6e8d59f406adc187a5b5cff18c6070f8a449f4b3df755107021408401d57715d51c5242938f22b1876722d9b127d3d3cead6c850036f11770b4ad0564e8ff829b85a6a31f05961e82a3d57af4ab5a93ff540b2620e0e75868e205eaf2bc9af647c645d905c7972bdb5b9badecc83d088fe625eb1169d3b92d93900f92537fb7c038f1cf1b85124e99123eecd2ea1a16ee7c1ba8713c72655cb50de4b1547a1fb396e6ef57973af2edbe8cb1f635003d7b375a0213f87ca5910adfaa709561bde8af809fcbc95407a8cc0a22df3422e8392e5ea9f14d38ff3dd1e80fb6387356e8d75f894575074985b0295f63960ed61ea908ba8ca4af139cd5cf1623523737b14bf384045f1771dd46d00520bf6c2ee053e4809c59b2fd66eb5a7124264bf1cfe09902607a75be0c346a1d1cb3b91ec4bbc853366fbeb6c43b53d2dce198c6674e880087e836515256146be82d3b8cd8e2717431bd3fa9523092b3423eb89317b437fe145b158f49b7fbdd2079db55081776561363ae446b9e85d02554f19161081c4157fa39fdaf901e99ac7ef4733fed5651523a7a3115a92c7ab3de422fb3ca3ffc4d954f7c04d02b14a191df5448f4915d2b76c3138c54ede8decda9f4d6f9d444759e4485847b602ea3ed5467103a4cc86cd923413ea37f5a5d98386d7e9b83fc8dbad4562db3a4b9b6a823be89e0d39a14a4c706b204d14f215a53236a9d43e48b70203c61a26adf6a7223d6c7b683e214bfc6f865d1006836a229a2fd7f3ad4399cd9845b3cd0317ed86858b54197efad92550ffed3801e98b3558f69d48a7f6b9bafa6b0ca4c343cbd3efbafb25917414481cae973f77be92fcff46faea09834bf12e597096a6bb533f1027a5de8822eb02ebf6a93e80350ca4aa18aa11b5f1544002377f2fc4d02d76bfad43609a96e5f160c2701f0350969d4d63b54a0fc4c46de6c150c5453333d6cbfdcceb7894e3dfeab04a179717b59ecbe29c1926dde869cc592b59689104adb5c275c742094cda372741ee7de156bb4038197499fe44f8ea32a03d78edb6aab0a3e0223883a7a80b9b66c036070f85ba60c233c6cc61e649ae13cb37bfce256266fca18734c482ec9ce931ae5dac988d82360ec3a966a53216bfa5a9bb2fff54103501f92337111edb838af7dabdaf9e545fde8e829d36c4106e07987ec0ddad039b48824d5071578196c0845c5bc223dfb5dcb2c2101caf8435812b420bec73ca0270d8f9b8c0a1540392a6a47bb5ded2687524787501a52b8813b41f267413dc05b1d6e91c3de5678448dbfe0a53e751e0507e7859eedb95945f1ec9a93130a326075c48ddc683268b0c0b301748df4987c9a62d4d32dac517c4ee5ca0d21769d2d996fa70605569b84d07ed235871686a7b0005fa950985597356f3df95373348b8dd42c3de40c363c7bb1f3a5e93688dd8da604709c7a761db935940e8cca99dee0d2cebefe2a477416dd71344f46f15381915c406099b63b7e87520b5eaadc1392e8cbfa55b0952bcde31fe278df9001116faad5082a667736c2c7987f09b02571c80a07c83d0de79b7f7327252f11bd0c8e1aad2cf6561b8bc0f3dc226b9cb285f31df0e27f435a03bd054c9468de0e285571736e3abcd43ccf0935dd9723ac192a5340fa32cf358116b58dd698319aa62d6c689b4172f58fbf7250a86bd4d28a722f5e47fded680d3bd93446a8611d66a228433f2a84d193eec946a2b61abc8b7f2ffee6014ef1e36ab8d300f1f03b668a06bf3b36304fe187202b9629acedc0aab57159ca4ac1044d189ee109b22d05e53b50713f1879ba22a9467ebbc0adca3c9c83a380a76120f83e29e0acbc366fd5e6fe9538dd46707f98ef13f9112c067656938f8d233a2582640a0dd73a0fd727607cae3e058d05ecdf3ba9c0655e084a580efe60166efddef4dfba01644760b21984cd922dd9f9f8bfa8468ad11244731ab770e44d18c75ea4ce32f8e9be5a88dee24288d0f3f37c12e6e5580f79a1214878ecfdd44d72de35626acbac158f08026af40269a605eae34c9d2b5279e736c462bdfc5b9f747968d8835f620e967b2f8fc8f01b690920cd22fa5f2f4c9162b87db3732b12bbd7c5a281c6e45a451c051f44d0c208c856703efd00976ca68e824ea73a42b79f2660c93d8f1f7bc9079723eece362aa26bc99898800704371b2db32738c83acbb0c612ff5c0de39a3d3bd7faa0355f98f7879310415e388961f0fc5e0d414086e934dc84f6ef2b2c72d7125370e0a00929c64b9cdd3459001e0a706b28a492a9db44f8a98e9efdc20871443c9c7b6276841f8bb430fb3a08b6de7797550f6a018fb56d60a3b6e2808090ac3e27583f773e802a5bfab854706b29d151e69885a1c29708ceccd5e37c0852dcb322f1cb1cfdbab45138f680ec6b83e08358b1eddd0b8bc202d2628c1912b40de274ab98d802de870042d103fa8c4d7ab32cf1ba04acc8fcf385abb7000b8715808049743416f66a8601166c4fa64e4174712913a655f8d23d0b3086711eb192c0ae4cd437bf560cf9acc39a0c35cc148446a217ce0bc241ffa8547e323ebf4232d08d6638946a2287b69abe598b5fa17ded452a8fe72528a915bbc2bdceb4b74495161f831e2cd3c18603a1c214cc585447795164261b685070371c211ed0e6db53d6b723c064a93493099ae20b321953a804d80c803ff4f42096c9485ecf58ed0bac831e1ec69a65427b140fcef03ac33175852ec213110aae3e8817a230af42aef8319b3ccd9e4759d57302ce27c16a373de9e0ea637cc363621739870c3b1003494ab02d692b5ed101a4674e46f4a2fa43312dc155e6dd037842a51b4258d1d3282ebf33a1448a94b536ed30166979540b6194eaa60ed5feab43479d7240ea233e755dea98c0488f7c28c2e80594cb1a35478c1010514cbbe810768c4669f9a699bf21ee229cce1823d0d080ac4b25a0341416ae5631be9ef3da91b62bf21d2fb60a9a5f1c988633aee74cb614c4ddd1fb69801bc641c8579b724854f72417739a365d8d4a2c6abd516bc7a29af443b2bbcbed8178666de69c7f24b1bfca939d9f6051322ad9405c79639977096bec8c4a01242c07267cf127d132c8321437f64af53a2f542156facbe284c2f481aff9089f2a3e82e109ddb94e354aecd7ddf0d33c697e6276e6a108db7a5b7aaac1c43c87acbf92543dd56a9ac113828538559ab3df17f8eabdf33800e6b9e2bf1ce84a2df838c6281e5610795f059d67ab41c111aeffe373509743010eea07696becfd26460f42e9e2da9343e8b6a380488f0150922990bc831c34442e2dbf214b3a31d587a6bea41d37f253eaa84eea3cea8866a22d476b20253302027ae986f0ace9cb15fb50c915e2f01e0851e3f42569490da0adbe6f72b434bedea86d3970f28ab85682592a066e750d4fc6ff5542e10749952abd66e10efecf42d8eccc24759685bd6dc5354a00c90852554bba59cae05fa4b6d7dea32edd57d03ad9c2b61e090dfe4090159d21df2d03fabdf7d6d6e4d5c322621f305fe36a2cdeb01f55957025b1040868005e2e9345d12740b50c5b93d77d19f159a4570450fe2cc09032a97e65bfc00fbfa439c1b08695c7fd8205eba6e300888e400f8e6aa0536b7aba8857c467783fef891d8dfbf591693bd0108d118899574ec6997a69e1597e72db349161b4ea59b2969b16317c5f0e991bb0e3f641234652455e79a94d33e900dc62be124f6595c0cf135aef43bfb683b5b2086aca602ec082adb2eea7e027c483f19e139f3c8c68556a47e86071e2a04a4d97a70f4619a92e214f34995eaca3a03c97d0f2f79348c18f22ce59d92a49e7850c90e4d5b2d88a21e9cf685e4ab30f90c2066d420165cd8ec320237c3cf753c85e9d23daa7a89eac386f0180d1f4c959c8ac4b35941032aad8f882319ff4922cfa9351739ea35f62211db0e4b88c993303804fd818319050e8378258b88fdf6a15fdfb62ca490500f8f8af3f823c5628ebfabc27c3137f8c963093adc60ab406e850bb61dfae32638de7666deb7b66742f1206b03cdf2c21b7546092363c7cfb7c78101ac8f9ae172fbf36e889faf0cbbd7839fa903b44a9bd74fbdf9d9d0db2275589ffa6029f52409b29af38795650462379c668ff0b9824067c0d0cfb087831effc9a5c329821844d9a2ad09f510822d8898ce67752ed152a884099189d33d4174fd3d567076d3ffcd24b37a9a6e9e2f29ee31b37fdff5ef593967b346b8e550bdb1a283bd2ed13d8d7dda7b9bb5286ea376e015b317b1cf74b3fb08c6691e9dfcbb7dc1321593eabbff44c0eb1040c227bff9ac3d0336a74960f6fc601a6d27bb74ecf7bd63bcb6299ecbc202838df700548b00dfb0153273e218ae3c2950cfc58730b32c53ed00470b6ce07188ccab335eaefe4ba152b729cf6a7050a0463d1c90ebfa2538066abc97ac40071331052c88364130659b884508df371380adedc4d8e5124e6a42ba65253af0644cfa517acb2b9470ea8cfa131410d57dd722d5a8c887ee08a557e4308217c182a36a1e43a31f600e6991812b28396b905b92b79cb1aeb7c8b73da211b8f99f03554d3f6acec3dfd8af1dfab6993977432bea976c182f8b9bb16b09ca41f57904d4a1d13ba567ae79f0981e89a78d629421a2d07bf4fca5537ea1a6df773618f894349585764cb0f845a9564c509390e2524a0b34ca91d90bdfc963e0f69e7de8a6920caf0abb05c0d9af6f2cbbeeb668eace0a9f358ca0418be0532029c284ad0310a85b0e7b8e4e006621b5b6a0f0d9ece44128fb4229f2f3f9d4c4b2ef291963ec81d2522bbedf0599da691ffb3c1fb6090d845a921806752ea80cc7d4a8fd41b95c68dd20aaa464b9a51d9d2e1892400ac86f2250b65f8db81c1e719602deeb239f1360d47b25c3e8f4d35e963a45f2d1d6e0d36fb6b0eae9aec17c254967cb81ae1152cf85fb0e2c856adfdd5c03380577788132f832df60aae1b31825af8b02101ec2c33125fed6d2db157ce1612de86aa9bb92b268eb0acc2df1cb0ae965930bed610693bf3707c12d41a2d04188f280a71292b78724f01f4fd06e77c4ccf66869ccab42b8130ac0121d4c690477fe0021bdb0a181fde0dc7701c65d31b4c8a0109aebe128d73a052776cbb3159a1152bbf51986c755b6afda974d1008a8d8e426e12cc14f260e1303084025567537d417a45eaf83111660d382bcc91e61b41eb07f9a43a583fb97a12fe95225e38e73af7b2886c55de1f3efc45762bf5a365239be6337c77dcb94086885abdad7362494edaf4b0eab553ebf4401016c1ba86f3b16e8a3af012b777003d8b7bcf6b28f1745a516c413ca8824f9bbdff5d26685243870573eb05aeea8d3a187d82a3da46ad6e789351636e4d6e34adb1202a5b52b86fb48609da1980bf621045f33610883659914a1653dc12b3c70e6cd302bcf52e127b9b3599a8645447a24d1955b87561e82e4c410bb6c522b2bdbe756fd48ca15ca0aa938a1389282de6426d4c77f581bed84c387221e5f055141e744389c72eaac24aedc37eaf6e66156d924c02d2298e585bb9d134ad77933614be395154ae9835f2ff90a47a601014164ee29db285ea6aeea90c18cf56d998f165447d0b5c34e798042de784ccb1f411f8f2376caf19bf4fb111ea79e978cac40a5cf58449e22270ac226660a3804b4c988229512ef412939c338836949271d6c2c5f2c267dd355e5a40d9d416b9ca8409e56ff92244200e44a6bcf238f340dc4fa6bccc31d9478c67693205f48df64408070a8b4ea9faa097ae07878b7b025fcbbf02655938e59e31563ff466d0db889cf2625413b602940e47768d161d5130cbef7a98f37a4200691188557ff17a40192d1057f5e421b7e5894cdb8b3495bf2d81ac8b86bdac0bf8bfe9b8a9680451d635a9a0ca9893d616a09b9dd51d97e7d26d3aa2577918085af0b9d007360aec434411e562c29744a55bda82253d4a29030de460cdb7111c47884585f9d219857c2a2b0fa20d36a59d9e5f81a0ecbb5c6e30c4ac358ed15f32e0a5018def5886b4b2408f0fe39faf08d6ddb9cef2fd81eda374f27a9ebeab53d9454e43322fb3df87f5988a4f5c92cf34c723fd3603800d4d2a9b5148a8f8681793cd15feef7cf824e8f5c27cf1515c578927dd1e3481401b79ac7e67ab99cc53cdfedb0736e8e1e3eec069de6fc98014751c7ad952c0e4fcf1e1e3aab481b1ee67b2bb7bc9a5f38e3ad908071a3c49f6d9ebb926d6d192017ca3c367889cf6f54193bdc2f07de98f01e19f70080b2ab96589a65e1d01e65a24459b79483daf6a3bb9a66324a141e163f6d37f9f477551fd7615d4a6b01ccfd41f1265e4fe72de882042153e29a48f5ecb4418c56c854f1f36579eb8bb0a1ffc94bb5c62c1adbb42df4c854f52d59d81645ac5b95d5a950ba30011dc22a61d4c66d4769b646154f85099f115282ce721362c995a6bfe6d7d45b14060e15f213d967548d668ce7206da093986c9bd746574d0969a6915b1490f3afd7bc685b8debd5f84af02350cf2e83dcd23c28b59bf9fe549543af91173fd1bda7242af2e073265e6b300f4197f157b3dc634f14afe40b8925c0619e19ad32ba0fc98cfcb717908e7b7026e20136142c651c6146abdc5387e6a46f9e4e2bab6772f4f970a0a3ea10be2f911946e1eb30a007885932b72018dac7b9cbdb50b115af7f481974956882c334bd1e22d2872de287609ea9e38b1c979ffb256ef097dd3e419fe142357118a61e491d2cc5711e7eb12bf85168c619816b3e6b3fde23b67da186ef283b09e6cbf8de394a5c564225e1753d1ab633a0fbeba8008c77af937bd393b2f253f0cdb880176331983e72ee2e43ec0e3de3522e57d75aebb30c9ebe48e8a9576dc5597e56322596e6071c41894f2208982f4783f883895a502b8a8825bad08f4a9405bdbb1609326260f6a1268276da28986199a55bd331351b1cbbe657fbeb868dc2e73980c3f5fa217811cd0bf76b1789808f6ae78555417c17bf4a00e022031d03cd543f188385eaaff8e2679044b6913d0a9cf3ae2870f32a540c602fd46672543c803753538dfea1e9b569856774e2dcd1dc38a8a0f2e802f7c9dcc3e23b1615fdca45358320543015a7f4b9975c6be2e0003416505f29aa9908080efa3841f1e8519ed31638b66ebcc7c1c53e792b7c035bfe287b3af524d17edc59b8a90cfd90dd6cb53827c423749a40effcf22d07f31b78221c1915bb852f783b3891a8f1f13c91f32bcad91f728fddd8cfa624960e87748a6a6c70701041fe62f6775517115211c21fd5eadbe7c2c66eddb40b6a79562106c2cb28eb9906b0a7d76c96b795ade983bdf834e3ae4f23dcb5073884a292048322b82faf4e4e569eeb2f73168845e143d3773e346ec1289541f40217ba5d87b998c3796ae8c98fd29392bb176110d6b4b950e93c37832435933366b434e5693ecf84aca9e9fc9c80d2380c111fab4b5f67425c32384137a48e08ac8684874c3f62c6eee8dc8547a484e68b1469dd215811e905c33caad34e44d0c21eeec26ab94f3e65d5c469dc4c6a293ef97b710082dfb0ba3e902a583ec4b0ccb49545b02414acd68b90026b71b94c56aa510b7b4d9041a0c3077a5d693841cfeffc1ccaf39f24e7a4166278df813dddf5fc28b64ad1fec3b3f37df795810adf4f6db5e3a1fee12004133791b1ba38a7c8eb47ac8e271c4ce40b39252fe72eeca65659a7cf7f290da196240dc9b12d93f8c5d0f5c477187d6214843d25c9c68a30394f30655ff2835550ab149251e0950a3574916da5d1873e49be21785014f88d05d2602e23942aae9a40b71055f56999f2410eda0ce080b5c246258e19d00ef773a621f3bc25ac8f856b5e7c3981c5933c7adc7517a034173eb580e864d3e25a54b5bab2ecbc2443efc3593f2b02554c44cd3865fad6d04b6b3ee903024a60a682e91ab282367d63b2607121fffff2e86621a8d810f2779d09ada14860cf5c7e29ebff28ab9490a3a791dbd67121df86e4dda36396dd332259d3b4d1e7e3e362ef05a4ae44e19a959030fde889512e00a97ebceefc1ce519737210dc31673201bb3d759f97cf7a9bb269e7f95b0bf5bca11a268f55c51466d1e2938893baa4d169202e3ee232ab06b4646345d0302570fb9b11a68b9c0225b8ba683c21581a31898b153dfb465606869ac06a0794c6152a2c15ade1fd9d280ca1cb0378f49a8d70c25fa4c3aa46afc1c51f02225045edce0bcd6df3c10a345bffa69a33ec46876ab936c75ad65ea939e85acd901f3a800e8d75294df785b134b4807eb79f115c40d8d543c74790a34e80f427136c3c1a021a7237e88a35e119e3a3d4e90691169a4e8f7125e2fe5ab07dcee4deb7caf759fb6ea675afe6de164256018f35b3fcbc05b51f691f6b1e75bb3c782f09954f212196df7578d6d91bff70a58cfb755c135dfabdd025e48773e6c6915f74d92e851cd80f715e316ac51e73cff86308be14b7fb76f3f7b31556fc27809455c3e7585917cebdfe172daa97936a22ced0f9c41c323708c055c9200e2c84afedb3b741f38f8c158baac84c980ade4b79d76cbe278a48430f792dc871506192c97d84df9e0a13b78f083071a0c4aa5957018f0d57fb7db2ed8d6eaa824783855d8dfa8cd0b7156a673220ae56259c6b6ffd0056b3179135a86d9c46a71ae7e1d5e3445dfcc7077d1b47d3fabb03669fa00a1e60ee80cf781a7137481ce3606d7a0d371c8ab1c6ac0d24a409b9843277bf80d475085a7d1ef53085e5971a96d614438abe7ecb462ab586b4e405bf771bc55df645cf97b46372dcc0a386049b4d915d9a8c94c80f4675b86b5df9c78c46d4cd6f204990d03b88507fc64a390fdc8031e3c280caca9a4a9f8f940383337d0bb839740f02c0d26b9100b0501b6f39dd0239bd02cdae1368a6f86129c48a80741e692910365cb17063aae02145899e91b008108565cff0cb8df621448c01a8d8f078b814a5cbac08b492a21c2bd4802cc1e9227c7430713216dd0b9811008ca1a745ce8008751b54a05fb4bf408c9dd2ad0d6077a01aeff6ae5fcf01546776fccc3ca1198d98b3011585b6d985820fae62f24c9813dadf305a53f1746714c80a120de4fbae4eb4d04db7493d64d8ae6149108c1cc2bdde10eb809208e9105f492c7eb6968e8a61b81ea7c879174e7f3c28b5252b9972f178c5c033c2ab5602b57e8072cee15c9fe92a8eaa35afc4a18b1c6b587c9b072fb5f0c72be93920919f221929b2d60b25680fa3b5140fb44d6ef4bcccb532ecde144ae719a41591020ae4152808294eaf134444d93af4546d161e7766b85f10593b80bbf2aab6959342f2f31aa3a49405a2376d66ff00874585669878096783ebec16a29a481f3affb5e642cf0dd0d7c7d2e4018401781bc9d5959895801ea33544e157d924938fa803008a93095518681a4f151ab898aa80be7f80b19b6f8544c2721cd9c8b58cb16ad2e42edc28c76b1390a76005eb458123bf3f00bdca7d449fca167f77fd1b3c9d5cd68c3a8dd368fb7e3343ecdf510c264e38a3099280b8da39f683808fe7ca3b85237955e6d334a7336d9b7f59abc48425bc6591efabb74deee630c1b4a36b5eb2e019a5ac090a96b4c38dbd1c90fcf8eea7430ed3256055d479340a05813b6cd6249dd8b0347af1263902bac43ad9108e6e0f327906f3c6f75443894ff24e7113554b29baacd4fe4319e0e3f61666b7b7e2428b91e7f672650a255a21e357f4f66817ece1defcdb7a04fe00ed05f264cc6edf428e3c7f65b86d93398efe41c14dc45b35675940d59ebb14c04152ebfffa193d5ed95c961965d49d61bd083cecaff3b3c3165a959704b7ed90792a8fa7f278a48e4dcafa81f2f6759f698899b841a94a3a899e3503adf7b903221d5f6ee0901523971d7b962b860f41eacca25cad025aa4e50addfab7537879671fa6d7b8c646184fe81a0dacf4c291336e3ca5804436a009fa472e999ba8798dfee64e6f9ae29597300161903c8043446338523cb80a212a05a0d435e33e04084fd5d7d0ad882de7b90f2050a9d5b7e994011476abc1680a1cd41197fe0a1aec03f80ae08889a9736d9024d694e977a79bb8eb28847e6eb37f10c07932d788a6f38323d10ae4a3a2935090a85522a13a3439db5f0ecf86eae0110dc064faed1bc8ddd6b984798fbca2e48187f8b07970ebc4b52d4f420b33d5cf80a91fb526ca2571e3648ab41a8c8145099cef99e64c4e739b123a8ce62eb202a9d804574045af38a382161de4c45aa71bbbc40ffc32c89d3286227fa654f214112d5390231cf346a331c28ce7231b3a000f0d58e78c5c07cdb5f9cf1b41c9fba3518db8f4d2ee4abe126c6d276b90f89a383cb392603b9dacbb3ccd9b6c27f1af912e125759922ad0f342a98950565992222b58e3b1f58c87557ab7e1ec91b96482f42f22213d2c0cbc089864c38d0c33fb036767a03a4d662dd42403f3f96ee0ec81d03d4898f158a6936a1d24960d08e1cc88fe93926eae19ce5b512184acc26b512ab52f10bc0dd69c42a8dec248ada0c57bb71aa368cc0a37316aaee69da617f12d572cedc53b722defc09ba91cf9faaffcd538d4675f73387c6b2f79987bb31f6573da9f094decd376e205799ed5f4462e8be09f0da3fa19094857c9b1f37f63f7726cffdf59228f11ef9aafe775b66f1fd7be33a323b8bd5f941d8f7f9505eaee7e178db4556c215675400e3f1a9fddf5f074027cbc3d82dc4c3900c65337304a162212e7240526552603e174ecd54e025ce172ff9a6cb3c5ce48204b27e3f6c2bff0d56c8549e37b8e44d5c49bc7c95056b94cc57a5e431a4a032a0314213657ec3b5ee75961168c29a03ae884d7f47454a5c1540da39f9ad8f930042fee2a3eed80773a02cb58424770ac5356d7c2088a09ac9bff3949eea89120590a791db23a6c578338920bf5f9f6309dae02e5aca91b9154582992fbbd917ecf49d78e2cbc51bf6a1cbb69a7b6fbba1840deab557633df00afa3c6664307125f610c26a13335649e06cd5dfdbe7f692fd3b0f75cbd5f7d4ff6755da2250cdaadd731b38074c8abe02e46ff5f8d57fa5d880b22826402653e2bec162fcaa61df39d6c487af5083c142463a5deb4c553e676df935516085a7dfadc97c05df6fffa3a8ff6a2d7b2fe2372e362f0c6a4052043329a153fa61b44b6f2d6dd3b7075fe2e382e0b5d5b00bf564690ad76d5de314992387471b792a7d1d5e1fb6ca961e5f1744b5932f64379f01fbf7e53badd7625e517ac38d4a58a7666f19f9bb57565976855ed07e416868e45afac2b2d527b664a1a15b6ee98f06855ee8a091e54f3105f64b360ce8f40b9f0803a1007ab56d39f07263ccf82a341fc16cbc9f943408b74c13b29408566710d9ea459b0ffee7ca98b577d9df6bf5e812a94f585515fed466a49aec5e8416464efa66528c95c9a21b9ea0f1f134158b188dd70d1740a4d47d20d783dd43e02e5d04921aadc05e8bc54e52533b653779d374084412f42979b95338d5d08290eadb04c8fe9293de7234dabf3ed32873860f0dbc4649355572e63673d65447771de4e3810b267c64545184c76c0d04c429a05c90bb1ec9a8c43bf86fa8fa5f1018bc6075250b188180bf8b6a0a8e53c50ef5067539e0e2b1d2cb4d1ccb52683e6abfb1319febbcf4623101565a8fb0552dc5076b78d341812dae1ce4cc0f27a5ca48c59683ffe3add4e6a2cd23f1578049bf3ef40b8ed35ce9e107a95732f26e81b14f36c925dfa59c65e401da388f606503c651b332ce43230834ee7418d6fc82d87e3f291210dc98c6219ae31bf8873c28cad26133eb90fd217bd24c4919ca5afe346452ff2be02444e776ec86b19cc38d80962eab9270922b6c0ab1d01c6977352856aebae76e443abfe65edffb82c5100bf429d41d583e4670f64e41dfdc603ff4bb0051227f5566e13ed0335c04e94f125fadf4d6c10101a64181e4398cc14b8169c6cb5170a244536c89beb888b0bb8f447f543dfb48378ebe50f0cb3db3c9f5ce3ee7c1bc15e5de6897d94c4a0e848e591e11a8b647df2e9046f4e7e8f876dcecb71008795d6bb6aa373bb842b9de7832571bc3111c6cce931f03575faa8f1cbc0812e5adfb470ffb483b8950cc4406ace851c2b9c000b813c93da86d76f3c6e6c00d9bad09eeb14ada9e040ff59888b4467bc114e50b636b0e82f56f6affa631890b0031100c2070b5f065fa2428b74765991e0484b8591fb0fa3e5498c61b3cd353749b60723a0981b8ef4c88ac6d9140ed739a0a50ad8ffc67e3a6b1acd28d33333252c8a9107371d32d92bec81b7ff190ed1376727c3d8668d763400fc192d38778e39c57af49f15190ee0e4b45784f8fe3dca9c10ca30f6a3fbe4b48fd570998f4037a9b25e836d66802e47cada3939158104ae21dbca078444080b37b78479a891c902f02f95b555ba54c1ef65b598b500ce1358b77e559a209c3947fe04e3bdfa6809865f4b1d742ac393aa4b2202273b9a1ca8c0f0d861521d97baf901eaeea287650247378842e53de396d36e2efb19da8ff8c80ccd20fba3dbcaf7c8bfe306cbdc9dd5b8d221a2bf97e4690c64785ef3ce12cbacbb814fd6bf242226f0812d9be6e7e09abf7ec0648ef96328d1bd46f025ae379665a30ccd1930e1760d41a9dea165ebca8856b9d3bf1cb8774236ffe887f57c059c423e831345335c05bcf5b15ee28eef4c0fd749df4b4a91a6d8ae06dd2d42de4ee9d50db298e7b32cbf7a42a330880901a227b93bdf796322599021e0706067e06953c43908b38b654501de44eabdb298bf3d3dc912707a62c950f15e1ea20c76e1fc7c555aede00e36cab5074112fcee78782b60ef9aee6795ead62de8745cfc3d5873ccff3b0e825fdb0e761a1eb7596a88a2d56850799981d3024890283508bc98f7190fc61bc647879a18162c5ca0629a94c71f5700881349e986c386e88381936c236356a33ccd8fef3c01f4f0450427c314912b6b4b435638b44981c347268b2b1c393dc1bfb1d55fbfaab3d54d2a4a23c715d35dda033565eb9b9c2820a6c72f8c1c35aef7633d070720347e9e90c8fa4a91a18142c68f1d2c5c90e585b762b89465347bab96131eede8270a1626bc77417df7efe5ff8ba31240d0818b219a6845f30d0a5883740c8b03411523e69a981bb0e6fc141b5c4d440035ffce34014d7726f2961c9b6dc5a71829030f3095931f42c22a207d6f067c3dcb735561b6d2c3eb0d9c82863c42a0d9b266dac8638755b523a72bc904a5e96aa3cf14812b35e79b37e7c1dae17776fb8addc0375b6d6c6c27a235992d8cb32cba9058b6b2dd11ea82f1c28ec17776f382da97f2c2198282ef14f59f6409d3fec1f7ea276ac2f59acb5925e42918242a5811a5133b0c421e284069016b4e2041143eae1c5c9901d55536ace588b773cb6b5e20fffc88085729ab6804891810556232bc899fce5ce6179fd5c70bf9a8a295905b00bc1af80d4beae735723c96f857b7e994e3950e71558451ca8f3f9b1f8705e7658497297c3b2126da5f8661b550fd4f9ff36e21c88e21c98251b4b5546e764937c6846a863bfc79d87a9bb87bb9166f748e0a5c55e1d8d7ce84fa34cc7185eda2f2f6d96ecf9f1d9449080923a57aec5621ecb3148e044d776b8bb51f4d2d6f3668b4310c1e2112c2ec1e20e58fcc2deb1ba02b60000287c7a2a3881a3c044891b0f899dab936313c31af8799dadeff43f103e48bb0a8e0e70204a7ae0a5d23591fbaa4a935c735f0901c41554683f4f00b968850aaae23fefdfe6007f4aa1324557ffaa46f7b606a05c51a4c2d65a1f67754448e2bcc7381f9c551b3be2dc9d085c54ae28524182121718845c9191c1d22503271d6c901cd141e5031a0bca22a13205ae062a385992aae030fb0189062fa517a6aaac39e38219008aca15452a7c509283529a219a8a28e392002e4959c868ddf01203191426f09291f4c40633322e6140b6a608013bb3826535e613822b3668d5e0c44d171f5b38f801268d15580f30585d7a58900136841492334268d042a6f9910363650b48105a2a1840171bc218098286386760512b78d95216430d60aaac9cf0244f42665471f151240b093a0c79a10c91ae315553704ee25c2909c205ca161fb060c02a2d07e56b0995285b149011b9c1cc6ceb4985a62b1b6cd94156c64c5754d795099d2439ca5c21311b228395dc1b314590f16afab2e4a444592454a6d8e005238820691a32b5e56b4a882d36746c45bd61721bc1865298d4139c208ea812012c6b78247d89b2c20e243c5d5b47ae5899a98036844a5fc182b6c385b11e6580b8814451b9a248050f0f4772c86066d5420d5e686e507541e5e801063664a72c122a537c515283982a334ca5f161ca09a91b725fd05ced30c3d48d03844bd78c16645819919281315031b4f0e3a9096d061dd10b9623549824c1398b622343e543871168c8be44d91ca41a4f528cc8305345cb4b9706494d88f4d001864b101eb6b248a84c419968d05033a38735655c0330020cca08244a6c38b16ab262d8560d626280f0b271646b0246824499c1e14c0d1f56376c7894068d170d625a6c98a295c3105da0c29cb4a12a82855a51b9a248051141ac783942f575230a8a892438f4e82149080e5a564a60592454a620e343d753d70f35b6b0b22e50066acacb112c6caac4f9ac7618d321cd8d1f92c860810102366406115770c8bcf1ca22a1324550950b5d6e2083a56ac8959219a8194762d0d221049baea85c51a4c2485999233b96700411c7aaa11459218c8f1b58e8414b8d152a5320d110d565ab8a87ac3347780c5e32e8a0850c0f4e5368ea8a221557ba647893a50d0c5d593a387184694d0b5e6ac0a9519e7d592454a6a8c0492aeb8a882366aa1890002d30cce0238d1522ca272a02c2bd6845918a114059b29444cc531394056477cf31b6428d194f4bb69c01a1e889be31d971fdc4ebfe913e5e77406fc92ae2858d920ea529f35391ddfd035eb9afa535b9372f980e82072078e0ee58c439f6c03d00a10c04c15aadb57eb58f821da53915af700a76508bcef5eba0b635d01ceafcfc942928071d85e2703e9872d05c2af8d83dc52cde1be5a0b554c83e761d37ee4a39e82c15f2fff7b8c84fd2a6b93b88ba8fc975c96159e2c97dd543989c5b3b6bdfbcf90202e643180b4138550e4c0003151d3650c951464c2df71595d8d60b514ab92a33725394aea892642ff7d5901917dcc6ede5723de4fb951b8b7deba07639b5db0a8204082567babad0309181502736682c5c5cc6d0f8f0a58822612a84b9a20ae366069a93f884068f02908624a9e2654d5a8d2b190196143dc4b2e5d0455bf67c7eb98592a70eeaa1164a76b4d921861b96dce04196c5b4e5158ecb5f0751b2dabe0ea2fd64d32a4c32d537d674ddfbb1cae471d734565696fdf15bcf3dd4e3af14cd73cef5f8a9145a5ada3b957a4fec6a15edb00eabe4277ab60f32f851fc8d894d0a506fb7db915b15c6a68fb844ea5b02f558277fd4db438f16a000a65b7c0620538bcf9e4c2d3e7932c5a1c554899b2e3b9f5e0b256a1aa800d96b8cb076f59cdae110148970372f6fb78e831653701a83ce2da6d2ba6c16b5c745e7bc5cc16cb14fa5b5b8f94381c6691ac7a2855d69574a7d6786918a954e384f640fbbc6c4569e4ce2ea30a17f4318d1871d9fd01bf48b07eabc0fac85a2677b400bdce5d013ad8d85102fec050c07aaf8cb862a0e735f3d51c92f688735f1041631bc743c650412aa8465c71df0a1f184aceb9856b9621e8184127ca8736c2020d193f694c8b7dc2472c5997e18860fd5be7abacaeeb8be98220208fe389c5d767748f0dc4a98b0943c7572f548180ee42f6eb867879540820f5d7187e756c204053610906c166cea393d15b7b5d65a6b714842a439902b537cee64da441e3877da036dc9133c7728e9979a953c4f8896fe8339e7096c2d280440f28c913bf2eba07e9bc5a189176f5fbc254f9ad46935aea8c914d7d6b1b1a075b4b61662a6b616b4dfbd4cc19d8e5eea408ebdebb20b024ad4e6d9651c743ee90a4764c74d8b187ab20151515d76a66403a264680c3ad32e7710a539133742da5dba9097ade2492135032f31596e1bc6b961d8ca0ab3b184ca0cb3032f5c662d18d1611566369c1c96c4e460849816cc0b7a28d2a5c392286640989d3ba3b92b0a2d7232c52e6ea61ec87d42e7c7877ce79ffcf1f27e5064c892e945aa94fef8fa9e60ebf57765de5789e9ba785aac0530b4c932c62acd0a960e3a5ab70c88354ab93032472ccdc8c116e9867c37658baa6c4d437c114249cb143750a262f0ae840002885c6b5531b643141b1f2f6cc962d66aebdf7b43911b4a545216735f7d05c9e7b5517df729c6659cc289daec9292a78ada8d71e1cb99fc626edb9f85b5c44542424d666277bc8267ba05e8e3153cf33192496d2c421f210407acc8d52f129cf0a284b16ca4c74593658a9b2c5352f4b2d19afa5bfcd9e2ee8f3d1468f37ba08a914cdce6e3da91ed1ab4e9b89226d024f7df2285aa9270d24cb1adb931f5a1b78e2d769b0bc72658f256f2bf37e8da41ce42d824a551a4b263f7c9eeb9ae24d9cbe453aca735c16207f24a9e1fc5b56d1f58dc59132a7651f1936477795adce15bf1db2060826c73cd2658fcd8baa8b676b608f8500c1c77b697ba9e4f9fec8e69062dfe15fe41adc0e32e27054ac776b5c3d58563132a795f841f88b975ba7a0ea97fb59d27d2e60157af3b8bc4a38c8c216f86f0c23253e37b412cff93393bc24508d4114f68b67490e12571a12d1ab8e42ff7d61237425ffbaa8f1ab9c3f5ebaef8895ff936056e2beacbe3c83ebf5c7a367af0c0d5a5668b889bdc7564482e309112e603c9952c33a4f8f94981c32100b81b80fcf81302b9c0443d2e7ff00fe69272ebb3fcfef1aa961f8e902192a58c9329cfd526ff8f6992262aeb4b121a2f51e657ae244fb7d6cf71c590ffc9fcfffffa5a66e412b9735c4b9d8d6ea2ae4bd5ecb01d45b866d742ba4a9e4dfe77633f50d656d956da5278f6577ea70f741dd7f18eebf813bd5abff331d76e87fdf2e743f576e329eaacf71ed5711ddba25c6bedba0e7787bb5a71d839aed8ebba0eecf0576bed6a31b2254f8a1b531848968a65fee95fa0f48a768548b9cbf0fb3cafebacadf5df9dc7f9e5a75e363e1f5bb2bf0eb256c277fa1dafe39d5ec73bfd8ed771d2b15651ff6acffb75efd76dfc45714f63a4dce4f9455dcad13e576993ed318a698f0bf2bc3e5c1229879ee8e3f5e1360e3f30c7490e644a8268bebf167fd705132cce4bc774f4c9f1b892297886d15fd7872cd9a2f3a56aaec5bf642915135f0aa35469ade69e38b0f69db86a6dd779def78160adf64dd7c7d682f4f1d2c52f07e7a5634bdd92270772e5b2530ee4762a4765622a63aa5c654cde335dc74c654c1d933395315926a6322626ca84a98c89a98c89097cdb75a79779b5b3b6abde7ffe2d5c6a8bf850c55f0e626e2fc54a7b5c3452862156918e29d40c03676f74fc72f889e007828d3be7e4274f0f8c63368096af2260e0c1f1517f51b9329d4ce1535d421cb1c48a0b074d4f54461a1c514ca32321aa29263b5247945f606c9c9946471c78e590331d1f511ed6bc313d032cf3e8164302a8121a19444ca3a39c1f229a1a584e5f5570a098ba761081328d8e6a63a611c747df8f1ea611aa810fb3715fe09852fa56e87bddc636bc22751a2efbf74f2af6d1622761e072c520e8b46c02c552dc49052453cca31d22a628152e5d889846473b4952cc8a8f4a50214203012880ce10a6898d79747367a61f0d994e6919f61319b59422c6922a36323a7a7ce4498c2063567ce4545658321f1b1d20876974e4d1302b69c4f19147c37cd208c58d8f9c4a20fcbad6b133f88167da41140f60488db42626dd5ae2052d03ac9f7225b544ab2871fa72373b7ca9b2410acaac8d23fdb24549ae032f255c666dec718280275bb83c1d39b031e2e3f142113c805f30d4685313c1913a919501316b630658661836414969b252268d1b9b088e1dd89096668639223876b044881e66a823826307467a6499e1dd5263666a07ac86ab1d244470a4497429ca6db27ccb274dbaa00a489392099227648065822409ba2e383614245a4cccda385631c3122672725942beccda78bb32c34abf78d08224c595dd72e149a714c54c088fea1853234d8aab4f8cec0c788499a69a1122e284508e6822236ab1d08211668b319f884a0f205f7ec498358c647e60cd6ae0c3a446dde554439a79e45ddd7035f02144415c7b22438979f4edb061825c34b46e98479fd50f13ec9c7f0f4457845042addf013d1618e1c50371fdd67dadfbe443b9e048a548a3beaa5a6a631e552ed3c843b9142399ffe452f296f392947ba0523ed4b9afaaec984ed122d9718f8bdab9580f6343d4ccf079103b7c5db0c79a702939e2c8027c00a332418c64d2aa0e722af5e4eed029168fc3ee205cbef9457e4c3b5c4718b8ec613f02d6c63402f1111d62c68669c4622433ac8de0587117d2d373ad91357014016c8c6422992bbe36b649c70ea3708402cd1eae1e49a9a4b2ee09a3d3b22549f77a44208d68940d696566ad2e6183a336d870a199e05897b031bfafa57881c2c4ac8d3d634c00655219f3f52238d2ab277172666deca962ba8e3317c2ccda8862c9a7a8094313fa62210c015c34d0ccdad8a60820aee11a696402281324fb8190ccd0b3a08d02c97549326b630f0e6608d2053889536582a3d8c30c29065bae926a623f510fc58db6468725b3e3ccd8e2eaa1248a1f260a246608d66a637f58b7c9b27ff1e16988a6a2c4062b2fd646a1a2abdb649927d326ae215226381e2087195ab136e2d2ea36593e716dbc0ff4b9db64b9c9f279c129f388e74d02ae8e789934eb879509925f8307d8a24399287e4f54c38d7bcce922a3326b63e8c5ecac2761989846de17f3e846c4ac617034f292e0e46a357cd459914a326b585b33a8cc2f1c9892cc9ef27425cda438cad4e4ccda2894c40cbdef6b8a1834b336fad430435b941d69632698d9f8520e72c49ddea089443166e3fb4444539a487599d926cd5ff61329d70ea2b5f18368d16001cd0447510cd1942652a18e581b8d9cc70f68e6514e1073470447a3f6328f5acb887629313a0ad7a0e54c101fb5942a6826481ae9a1182953f2a499441835520190f2c504491e11346a303f249946203e32409a3013243f8a86539a25131cc5296678136ba3518f1521651efd0eb35d83f3464d74987322e5afcd6419f2658263e865861dd2ee777a736ecec9953c3d909fec1f2b3e25b2d326b23590534a29a594d2dbb808c59df8c09f5b6dadb5fe9bc9a798ddf1e74e43bb09c2f07bb8dfc337a157a71675777d6c2cc29a8d45b7ed03308bb6ab736f7deb6f9e5b097713dfcfede27c6eb7fbf1e7af54147157d0737b1d703e1405937b96190016508cdda977f35c85edd4bf36b90e52c7b57b13ebef70cf6afbd0ce32db6c1f80f9c6e4a2ddfbf8da58b40e97a2ddc6e14efd9d9d9d1da76d22e744ca389dece4b9814cc9caa4831a7b5c2cfd4e69e92797c6859a335bfac981811243961b5161947e7215cc6dd5062a0b120e15c6ba9eccb06e7cd10ae341c70c0130d0e0e406315e57d00c20b7569853ee726b7dd941658fc8b852a2c29a264e564bc6648bab0fab6c0f906d1048525b9c94e01055a64a1c283e8ae45026898f0fc5a831aa55ad95be57bf51b18a14a49f7bdf555bbf2afa50edbe7e9566ddb366b763f889a20f9de8926277a7a028d6af665c075197e2c297ab5cfbacf952b93974dafe27c8014e6ad408e082019440506cd2a4a9b469290f79b1dff25b7ecb1ff1622ff6623fc4bfb156e85ab04302003c2450dcc470603fc41b61ed1b2196e2e2de08b1f269f98989f9fc888905611c1c3005e4f8b307fbb33f7bb47ff36bbace769ef53afb605d67adfdff7f379f28ee88e279ffecc1feecc11eeddb749dfd3667d6fed9b77930b03feb3afb67d65a0bf667d6fed99fa515a579b0077bb0377b30517c340ff66cdeccecd93c9b377b360ff6666ff660a2288aa2288a6ff6665fbf56fc45e0ecff5f3c15fe9a5ff36bd67c9c8ff3713e4e569aa6ac21beacf25be5c6e7bf55fece6513be7eadb5d2efbb1787fbb33c8572b976ae83cf428561f7069dadefb8c35f1339f6bee27f4beafcffff0b695c6774dd9d4b51386149f2cdd67a3a94dc98769ed5418d699399e6aaefd6e2c7d5e26a49b1d6c6200f1d7a9d3aa6feb82bc4ffb6be5314681c2be18fb9b445e7942e859d5b570aaded1e6afbd6bdbda9845c718f1fce945afbc5b05961d8b4b11875ffaff576505be04e2be98d9df6bbe327ddddfb21fca54cd31c378c4ecb7402e1aff935bfe6688c4a1141a5d494a04bd325f9212a9aad7aa347f3474221bafa9ff93783ff93842f76bf7a66dfcc7175af6ea97badeaa0af12c4bddd782a7d6badb5d65a6b9fd66acfcef667bb1f653ee4b562a17cbee8d65a6b29131b7e128a8163bb8462e0b8561f29134b9978e96fb1b5d6d6a755071feabaae13bbc11e298eef287bf844ca5edbae7187ebd8b81bbdd1c6a26bc55db514c77822e5c62b1e052f37f6c68a3b16b693e08e0addafc31e0e3bfa752d7313dd066a5cab872dedba7f526bf5f0a3ed94a67925be1bc853038252ea8197fdb5a3e5da6e3a39d576efce8e8d85e8a5b783b95ac2d7c2c393a2cca53884076a0c7efebd16cf0405b69ee8b17df0933b12ccedc813e7dadddd59fe642a0a04b49008d6bed023bb149759d776f5afef7c635ecca5988700359f0ff3e15856aee8fe18ce29983267ac64adb5d65aad5c6ac52f977e8e530cce1af57229ae653e6bad95d65a1f8b1daede915fadb57ed80f628e4ea853bb3be08ed0f7f5039df87e24bc0feb6e3d96b025c46a0755d2c1fe76119f82dbf5ff0177a3cfe5521c7629fe3e31ac59906375ee7badb556f1f3215a6badf5ffff9b45576badf8dbf148505bdf443b05f404ee036badb5fe96efa3df0792282177b88edd6d4136e1ed4deceedf7e205bc2ab89ff2dd77f8b16f1c4576badf5c1b2f3dcef6fd4bf5aefbe1fb5b1e8c8f384dce1c6d53e1daadf1eae5d69e3a7fd5fbf63d4dc4f411611932d3ae3fe13b2ed3c7c765dd7d50e7f316a7efc58fe0a05b4d61a962851b1091b0b17bdc4f9fcae8d450529a0551e77bb0ac4133616fd7d2d705db58d2baec0c6a26bcffb380a4a2da8819fd7853a392f01b1b0a7e62e873a29d49e0f68f64ce60e6a0684ee1e42438527a5ad1452ffe07363927650e3c6ca7d9569c634840eeabc0fa498524c6fde07de5af84ec3b639f5036ba1f84e45b0166620dadea9ad6d4e590b455bce3bcd097b2640cd10f24eb665318bb52c8e600e6dffb7ff688e8e48c79ac34be9adeee14e67653af6785607e51239e4b995b8262878a714b4cda91d74bb5192fa57eb5f6df74ebb17abcda0f3dea957bb9b14bd7c77c74e9eef73bd1c769ecd147f62cf075df64c33059d76cd5330406e3286cd3785ee824cc91462f4fcf7d3e51462d85c82192923f5b8a8f9492fea75bfde7393ef753badf149f1d75a7b1cdb3298c30773db5cb8e75aee32b55cd8ebe1ab02abdca9ff1a8edb43b3cda12d852e87ca3d6f0a36c380ca315c07c76d4c71935192300ec7bdeda460330c22720c271fc7b56d7589e5189e49a4ea658f07c821580b453aeee45014e9687368b339b6fee7e4386d102481a31ec3e65b456abb1efb57f1de8f26d88a4b60f1cef7d0ef6932044bf60375ee072a91478b1b736d9b137e5f4dacb8966b36d72aa6e3e75aa5a3e7306cdc62316aa662a61746973aa8c4ad972431e990492400000000531640002014108b856251926579ae7c14800c66943c504a36924702a1501890e34008e21006421888011086818c81cc31a9900354c13f840fe23e407181ff6075ad623fe9745c2fd3f647daf80fd40da5a656f4719933075cab2f700fc3a8418e75a85acd35fd25d0bf40de882969b5f47334f9839e01332c8171d9b598f723025c6dec10ee44e8b3dadf0fe7b9ce5d5cd730af7df9909d7a5618007e4db814d15387702588839ef301de6073fc83ea4d235b7b2e3084f94d7b79ccbeb89fef4d4f3c2b9db86725ce09e0fd3f3110ffa2e7f6c20bb64df704d9344f34e96fd195472b07fbe3fa5b0202f895a05fa2e05f6bdff0317a04d81594e9f824f925300fbd10e5cc0375901020d7ae2c06291e597fed4a4fd183e031d40ff7c53dea00f25f413dada77e20d274b708b9c004121d3d0bee9bd9d69cdc3d4571ef3d9ecef266044c72bb2a31377f8859ce71e90aee3011dc78634a807b9b3848617c8c65ed5d0a9493408d0022bcb1b9dde9102792e3e6f6938ad68fddd1c076a14fa10ab5adb06d4217c37cc7667d0edf1a52ed1f3669fdf3c609fa732df964b54555e38db9a5344d69eac720b68f378e7b7e1d7d815e3fe1cfb573f9eca6145ba610a466f52d886cb75ecfc027c120b8e3ba23cc62cd6fc837fb48be279a827d7102603f34a60cf7614441f8954ff675d7afe36eeb154de2cd3c52d69c68338a2c0938900f4463b5861b2c5ebc641ee487be13f471d36e56552889b3c1beff9396ec2d9a01f71339f465d30224cd92914ed75b4d1d4544e264192010f08e02b70865f74add1d721acd8104fb6045b9540225ea2548c5926add21ca5a2a2b180fa721e67d4d727a9022f97151f75fbf5ee42b079294cc2dfac98514a5edf2a6fc9f6fae39e2719ae422499909e16d78560dfa433fd8a1e1ff8761ec07c1e2d78be3e34837d7a18f8de15f05b9814bdd0a2db2a776de8187785bc575b95e9a9f90ecd82ac29ca033dfa13fb81272cf762bfeb246cb1171adad0da25a07aac1a75014f1ca9f150c117801bb4468a443a34dbc950d1971c80f4e89bbda9e7ff5106f6b87602130abb854434042cf8fc9496232a1bde643e39abb89edc8486e7dab0742a2b82aa9bff510f076eb8a7f733274b428f59e4427139e617f663e2cebb10e308fee40e7308d125928baeb341da089cc7d0b8214ec9d619f2d11e1094e8bba308594809282792dd4b05aeb9102dd13c91075fb659ac5476a3453b2abb08a120151c71a0fae8ee0fd9f88773fcd29214e623f00017c262e5c701d737b1c768e8845b2e1d02ffa217d1771bc33ff6e87a2861555b3a18597d48b329f7aed52614043fc48ae25d45c561160d5a7a1eca141f0344ca9a600b13ea5518e58fc8dadb13a9093e7b4366b913372158ab2dcc134136c9a152aed47cac1ecdae9efcea4c3eaa3ec0f4a8088116c82bfcd34df46b94a03233a3b309a3ea388fd5f3435d587883feb8d00331a6d1a3e217880ca7bb53c12fe134514c60eeb6b0efb80e5b59ecf0661b739f753dedaa0c8a168fd975859e3503ea739892232e4df7d82095e58974b8ddd3f81f4e7a66e893d3d6db9502ae693d3ddffc561d768f9549004c5e1c705e552ba5cce9430c4a2ef25ab7902119cfd5191a0221db9f9dad1b6d2e86c0252cbe64480de8692306baa70ace83e87668124b08395d3b86fa9fd3eca38005ad8e1c29696961e7eeb36d69f14821a1fbb1682028db0a2e05e6eddb34293650e56a61c16a3607486e77b40557c22e80abad1918414fedda809049375bb0a535342e67006c3f00dda8ce368eb260798444af8c6a991f09bb1aa8f2a7ea675943274b668d5a56c305ad75e426341cd81677cfdb97011e44f1945da5740cea9c204273963ad7234c09af88f7cf08bf151c055ac41ac261638c521ad30172308a38e49a677de392ee09e9df53ca3565ec6aa2b8c236ceb2d7467b7d37ca4f214b4a356c5f1f31a29e94736c13253e09e75b0677183946b6cbfab701c45d529aaa32d7293988bbfb4032dcf79c0c13b9e9c5fb8a09692d6064f73873ec7c29a43daa856435aaa5f23fd918b832877005570d72fd608990dcfe294776c1252b9cf3fcd4e8503f4b12c069cd3ec422f608bf732ff2f44b645343b2a7268f2ea9ec25d3009baea3aa8dbff53851aeff0d6d4a933dba777bdc1ee8364aca06ae0aed88ac8874a26eaf051be33f7523eb59e237047c39ef294f6f4d7e97c55bdb0a341b3d1a133c0e7286ff69af946f68c33ec64d477fc32ccb1bc5e6c1c2d233387af6dd9a34f966d5010d24dc20aacb81f957a6dff1f328b492b1925d9d6c751a73d0a9aebe1896abc051a7575d0d06d951879e708fb555df57ee57ba4629cd766536d71ffac304f871e90412cf6e313ba2cc5bc31f45e5a1e616270dbf82cd1616c25b8dc1946d16a52367d8683181d07abad3e3720d96659900a99d6f76ed7ac61b50e0c9da5d352d83d86f8c50af936ccfc5689e30231959f56505f34474604833d642f6a615a4cbf1304f85ea0056b497f56fccd1fbc84cfd439dcc08b4a33f1046eddc609df7ef6eff607f1f35c0d3735df51e61f1c2570275dd307f997b4f8879b75837697981111c0ebafa2646c372556c49ca89adf0a8dc1715b06a234400efe287c4718c6d578e5234eb584d09608e79a3164e6b2713c22b847ae0cde351d59ba5e884ab02209810c4574833d01e3adae2bfc941b6ff9f8d804176f705153dc1cc82f4e426270880608192513e39c0f6c7f8e732de084974d3dc306f659cccdc438da7c7d385a9275884387a1837016e40d0c121846ac0b650c6bd0e5c6fec840763038d8dd317f6fbd8a8b62ce57375ac0a0167acded643a8802d785e112167bdb466fee68986ded3fec81fa23b7e309af20abfcef73f8d2207ec9b47197f367563ff208b40d6efe600eb2227bc66b00155b4b90d05e16cfb9d89a7211bd09a073f7308490c390e5c5c61bd1ed23d3796b8eb194427c2d9051e1b844a1df755d9e112c7c7b3f4ddc4141601a7e49dad11faf099e586a46f0be15fa1924c0d7e7b101f054280f88b804264ee1c73987a6637118a8811ebae920e2386ec4fac6335ccef3cf014de609f8a171094be6e15335fede024b6a2e7a0581aa82a4f65f41433fe6a18b185e56e1f104052210daccf802837e6687ea9d0033f35af737bdf823fb7fc45047de5ae003f72ee6ed19f290c83353065e720c031cf9b708be3e497e03ccbf33a8029406813b323c4ea8e91eeba291777a1140099eb2369917bdc63bdec43a8488f07967c31cb721bb2cf180032b1ae0c7047d09f549ceddd2711649d9e578ad5ba80cfaa7d44513c6dd6ba187fb12535bd860120acc6096d4fdd35bc20f260c1797427bf2b8c4a426c09bb7e530c95d487c54135dfa30318b83f51f9453752951647dd4b96ea0a2b9f2c28d2cc65b566857b696ca659b3baf7737bc7807195838c1a1b88bcefc9161044ebadff97a1b83e1c3b3c7e3a7ba81d1ef80081cf9bf383af080af35cbcf4b6f4aeec1bace55384ad1d1ce5d23a37fe550b82ed6d98cfe3a601f82ea12a595af984737740440b66efc8a0c1d03d28c55998607da6a9891e1f661d80c2ab5579258cb9a4ae7d5ecfbdfd679086c8b7a2415bfe63ba8c8f47f8aa7ca3fe8ee7b71ba8a0218ece725d7af8b5bcc338f067c1f1331575e6c3256540e80b3585e7d8ddd2801a7fdf2fc62c87f44f6595d7dd573559a70e3fc7bcfc6ec7d781e74f405fde2b9aa70ee9bb1f56cfc01181df6aabb673e332f869b04baa9cdee6eb850b3963ce4004dbe828f0a7bf72da231b767d22b79b9fc93552f11b2c0092b3ad9d1150c1618301898ffe2845619aca1224908134fc704121124ecb766e111460761385c360914ed1a5c62c608a040affced5a4fbfa761fe5365885dae27f88dd757a79b97dc9016f3c2741f7d7718e610a6610b331a161a16d5ea3825b196017b78b0376d191298cd1b0e62d5862990aaa436c9ff427eade34ab35eafa54f675467537eccc14bedc90b6e9f66bdcf42c8ed1a8b062122153c7288f048852e350e14d4ae6d520abd0783de3b136f64c205237581e81f9308cca0f24185fd0cabe3de96de115072af2c10c13b5bb7ff85137c234a05461c111b0206c245b826d700bf30ed9d2d12890748119a34a072bee1aaa225eda445f218210606a80f0e9fbb4ab18d9b3bb2e902d55689a501940f14a60b8da3e9706683ef63f77bd86e46fa75c821cf2c0aac787a5c37094b63c4a914c3118befc3108647fb2616178c7227309db2eeb533648018bd16f3939059033b78fefe5e28ed802edc94b22dc19f61a823a2e5450f5f104247a18ee68f418833dfbcecfae38b2aec42e0045dd286574a796d9df7314fe43cd40518feca4cfcd3b0ba681447742a6a85ff2c3c004ecfab77c26238fffd1462fc5578879f29e271b09c6182ac9ce715cd068fe4a31cf4465691988d47f16f8a7f2117b5d1b1b0b14e76ce191d41e433e0aa548cd1fc3eb91233714414b0064b255f81cde2970d6775ca4cb09ee77a434c11b574a9fc04b742cff8c063ca5146a5c9d7e257c2d2bdfcbfcab4d41cb9ddd389cdf9d408c39fb6ff66798bfba5da5a5b0b6726f5881c383045d39bcabf39a3860277e4946340c135d58c6262585844f2197ab82f95d503fdfcaa066ce0d7ac77a2cd20bd1cba7bf2e2bb0bf8fb4e991a3008c9805926feba3fd44b0710277a7107e16b1ba0096fae7a06696396de606027de91a2ee4bc08d551b3fd088be1fba0668bf8f3aafe750149e01d98056024c40cfb304c0a408b3c9d32f1b680fa149cb1cc1b9ae80505d81240990958ba48186c3b0be2c43e4a03d6001c4f667b3de65540d1f00ecd39be286acdbbc15e48a80b69db4378b743a8a373788e0186b415c09e659d43b990f3c51919c3bbb1fd0c3a9b762b9878cb8922f31d97c05fdf715569b9158ab51e598f7e5ab8ad80a0d6f03ff94978baf97afb8e4114abf6d610b24eaba83ba07b2331712c86dc652d059f8e6022ce1d2b419b34d556c3faba78a45eeab9f812efcdb9ae2d7bbbac581717520aab41625a9ab876088a2e9eba68ac6e22e17536b31765751eb820e48d9e936b3f5323ae4634d8d0cfe6f6a21fd64c4564f8e0937d4fe712c2256b37c4cfe9cc77b9d4ad68d55a9f2b649c162d6640382134c15699d516dd7f24369aa1e8eea2dc0a3b25fa9e216b70e8c904e542bbc113b9dfade8ef09efc914dd0090e87830bfe6410062b929fceebabbded55bee1a36d2813ef149c07b38981893ee7e14fde64b18d5e9f44bc4b583ea21ee856aae520e0c85ab8541586a8518ba2b41d7fb3e0ede484e8754111e17626c36ba6a66025558f53a870797cc59ea296f438282bf6f9f3024e75ef787a0185b51b8aacdedb76684ed5a73510f313e71b0d43622882d87e65a4becaeee900b08b551059f2afea19d42ae231f69ac172bde033a3895d2af0527d18bbdd09dda4699ff41b251080b73611924e7642c4d5c91f48eabeb2f32a7ee5411a009ec50776c8fba93f98fddf524301f5fa15763c746c74aee52823fcc6ca69fa12cf19e5101c418cd623eb6fc01da31327883c387df523dd3f601a9f1eca44588b403873571c0c2f5c91e316d29ebdcad85279ff6b768fefca6970b07da6b008ecc4920298fdf5c61bb01bbda14a6c5d1d5565aadc1a9b40f947633e0766843f3f86fc8700ae38ecadb113357a050184d06d9410e9f44d03341f6ad316fcf06c192311340b77e10a7df6bd71722f055e0430fc681963935e1ffcd17a311f0a42a656649a314744afba9ffff6021bb53a9705d052240bc34e307b04b83a7f43fca1cd5142c77074dbb1f248015b345a19a3b2677253ef80dbd66081ad41826f122d9b5c51bc46f2d3786edf2ec6f44dc1cbbfbf6f5599bc98e0fe0493e7cde17878001ce9ddcfaca5ea7fc1406922416defef86ca7821edfaf0b81683898557282c4895f479aec3a358b5be3bead4b8daa14d5ddc6a5269c7bf9445b84ddfc5962962457bb5aa50acd634084a07edb32513890cab74c13d9ba1957e0f8072ee373a677cb8c4a60e336eb3c75e971a18ae8968671e1315da11a8102dfd8377a9248fdb5d93f5c58287cd3e3d90fe934f2d6801fa59c4344bb421f2d0cfa2089805ea0597d062bc9017e5e553f767df52f81e40230d8ee18a2133a7b6c576dcef9c1d58bdee9328eacaa663c82f865208ba650aef1a82f36440b614766e461199db490106a30b483469239230ba48e0f81fe311224889d5261ebda6b48e01b79522aa93571e2ed09841e141f9179e27cdc2dce2489db674ffe970028b0a8f579af7a1395bf084f81e6020ac161b149b41a185a4fa964dcbcabe9cd160e7d7d5b4342837875763530fe9b473cef967fb6c30918607a869b0a1f24d3b5814a1c5eeb760ace511089322659e1d3bb28bec8653d53d34ff7832636bdf86b94c65d4e1f749ec9e729318716a76e7dd964a8b4964cefbd3b212f0497c07878a5d2bca0bbb5c3526e1dc95f46951138d70be8794457cb3424f1704fdca125debd942d315720532efbbdb02fa6e8c49834a166b5e0cb88cdf89ec9933b867bf35707daa5be9a99830512404a1501c720ecea77306f2e827adccc1eb519aa53be78a54fe2ee4c457b101ba03d1b3ae654303cde2e3605a8c9668eeb322868c35711c387fbdcf432ada6bfd57160d2f1742bb8b5c1e81cd55e34675cc8152e0a1a77d914838d3ce88a2a59121f8162cc576f72cfcef7dc5102d51aa6685f5e95a8f75ccb924f54d850e2bfd110b2d3a7e0df48aeea61a3f9025a15885c225fa76c26e180103a6157172215ccde24a5200772aa2c7cff255e72b2a7c4b6042c0470e2c02dfa74d9a4d705c7af18756345da8aa0e43274ba8b71de50e7d0e2c057c7584e03c65e37e1b28425514d2550f8fda4fa70bff56c801f8767fd19b11ac5a507a0b00cc472c63b4ffc826864f797e6cd5b207716da38ad82acfe2d6f8843ea68867d011bca08f95f8b668bbb86a25027688702d8d43454c7bdfd34cb92a14462e27181cbff678a31dff7a76b37d6229f25da5dd5a107a27ed4f15b33445e05a6a960753c6292f9628b2924b5f0d9f2733b197f2be5f9840e56f4488d7a14a2aea49ab6c604bfec932e998291fa25290ac883ea0c313b8373d68acc6c4787b5c3246be061969ca4f182d4f01c487c80b16414911b9ff3a45444b17fba077dbf96629aee584be9fe8dfba131fc7f0b08d9930f201fa31c7851353da2f7a2af68b750529e70118ee0d39f5577b31a01ac421d89d21696890390afdc3c35ca958464977f82539abc2aa391a32cc11d743000ebad6186cada0472af6d47f67b7c00b2de43afaf64789c31f56a9b009b4bc589cb550a5cc4f24f5ea10209aae601b6e237c0a54ba38107c7d3ca505a2c3a9b09f4e00832187ef119c54553d86a22dad593a5958042c736ac344f8e140a966ef8960978268f2383ea10c714b6a3cf3a251047dbefb4dec77f2c30d1ddb594939fa9719cff248741d82d362c026fd377749d16dcc94a2e1f6ed51d00fa10bb1be2ee584a5424d36362d187f79096eceac551796f2a3bcd78514f42e55c2a291a4b05178d0cc17e1ae95f5b407aacb6cb2f9f31c12c0ebdbd0392e7e8b8e768a732921ff6c2cb28a3cd5a6c9c728a5403b63054316b7897c7cf4968a13805e5b84c4d7d74fc3d5ab486fc7a860839bb64df0c07e533a61488727e02931e5670dfc55f53dc2d99ca4f6534917f134500b5d9ce0db186e96ee7bb1ccb457e123d063da449de0bb62f090f430ac3f7268d9d4ccaf0ae97b311ee817bd12cff9b35ca5df207c4d0a6cfd4a6bb4e6567b79740a53a06882aef88d1ba4fcb76fcdb11da1c3141ec5bd718c0d55925a9325e61b2e491ca4e61d50e43bc3cdb4fb7ed9d1d90d3915617cc9e781df1d7d19b327aff406a413f7ab4a0ff361aeb7734a2032e2c03d21370df5f163215697bbccc12f488c6ec7dbc8bfff529052296ca0979aa322c824a8fe5561ba80864306f8f10eb756244c7091f074574c9dd247345d724c59e0dab2f83e088ab29fbf0654e6d55994640f1caf3307de84a1f05504dcb26a33ce9e4609939a45cdbe4ef016e5ffa53948b88316859bda1000f592c4be967eeaa7df50d1ddf5700d45814091d0ebd2e3888263f80abd63e4f41dc10ca87a460f8df0ea773701b3adf69f831ba915eb1e057b488ec73aef1068728aa4e4e0a1088fb64c3e3a5ef65dc9c67c38e3efd6fbaef16224ae9f42ce79df28e874ca59661d6f6bad5ff570ee2a8a6603ff3b106c6145816b91428c6fde2339eadd69937d7200144310a97ffd2506420557d65ad9a4e50061f6efbbb75d4c0f9a7405b98ecdd681bbe4d85557394194b6bf863126fc39868f32a863a344c13b08a8c6cfa2da4ba05c9c4a6310df6b54943b626d0a0747858bc30351e3edb0720f0a3044a5d428cb0fa5d5dec12082e6370076ff105992ba59485ac502c57d02ce9fa8738102d3702ddcc3df91fb0c5ab56441e918d97d9e274f68d4e20ef791507f249e4e32ab51e41a570da798e5d500a1a5e4a5ec0cf7cd6bfe08193a2dc642f0e859d72a5ada3ace12cd5741d7d0734ac463b0786b26b6e4a1ee51ba7ab6c742c29465267ce7979ae67bd7680a2cde15289f8f38a265a0f48313e0b28155fe619469322162c39cacf242b08256de3e21373746fbd714b874914e40da86d26927d9b1b6a6efd7b1cd0c1c834f048556d0aa1c208e30768811928894a308b44f2df6af50b9927c0f10637948ba2df5434278d306c54115e79833278a317029178eca246de0549e669fd2a8a4079e8894e67244ff8c0159771f3c7dc78b9cca0223b3791e1cf89f405fa490b1aed98d5c8ca1f875fa7b6f846de3d980d64887a1899dc686a72943592b66698ff36180485d83eff5bfe244fec19738387d2663710f101bc4f712e8917b43fd90971d3cc7e62f77fdd605e9d7196c48222c5202fe0e9014de201db19ccf88de4402e25df478eb21e858879899230bf8584ac12968a35cd3233a2f205abc34af5651831f0086cadac7625401fe292b279b9dd730c61446130c05195c77008ab01753099156143b93c0d667bae9964f079454c6caac1800fb48009dc49ea336fb6a0d32b5938c2ce5d19915eb8600801dba143c5ce9aeb7834d44821ea0375cebe9be7483a92ac42825dfc0bcaa234921ae0a5f6bf1c2d313bab3daa1c24410a91f1b83574e963a9755a9adfca807e3f553c607ec20b2d897c3cd57256cea35885fb6e90bed760b4363ddf2b745a6b4261624ea9040525a7be455ccb61a121774922919195c21f07490148737b4b34798d25a9d0694aea62f402902dc05d1ee19d5009554f2a9f42d38d74263175b09f75b84060f7599576c1c161e912da3212aece720655ae34d4bde39c637ba7128b6cdb4c1d821a1915793e5c207ad6fc615d89627e8bab240348be67d6ee275609c0d0cb105cab03e04a2a29c2c498b211f36d3880772f1f9ca10c059b3ef3348aa8c464c428bd247ddc46a878f275436ad30641206465afc26b46e50ad972f615cce2a5ffdf7945c0e900b11975a4e04274c2e67e44dfb65546a61c1d2425cb976817aa6c1c4e260c48c407093003afeadf045be415132670426b68999da575b0065025b75ad3e79ec8ee50124f681f3abb6839112d20a84725a214b4a17275a88525b75d3303e600af45649dceae0cb5f1a44693933dc4694fdda6642ac879cc019a9c90e43b2621597f7ca45250acd99bc6221ea7345ff8928f9e81314c5815e7627a8611f6a3b299024ea26ad9252e7368fc20bb905f64d06e7b25be40bb69bafd433a155b15a18498b708e3008a9168276d8dcdca7c10ac55c79370530087d12e3cee626974eee7f4eb14b29960ffdcd80866e80534245795fb48c7ee8f9b441ea063470466cc009b28184157edd45f805c062a7ee8a39e6cff6946802c105c68c6c63e6584c8b8a1292c40c022dabd48a94863f2d6d5245b8a3228ea9dde8bd3cc97087b1df75851808264bc79fde69f33be39c010126b1d2641b1a1b214d9787f5e0726f9aae53e3fd1484a8ee2b737de089e278fa6b403d4700da19d3f2635929e2c6c4b260b1e16d4ea389b7842b4d980ef0e6f4943626cac4d80255593926ca62561136eea9a9872216bc4417e9a641aebbcfaf1de9b9c4c859546434fae7310906c19e9f3e573810b0ee45f01a2a6e9cb30d84ba81dc325f51e4b829e6a77e9832941a508daf123a6b068002c593ab869d5e6ca7ec003c81ac2fe47ccce1961f78d9671afc38243c4ec331cdd4e365a7532a330c0dc27487ae88ca0a6db396cacd913d19e7239fdeb91d481aeb9189ed82fc4d7868a224b2e2330e5a3cf92caef001b9e6d278a84252f8dadd0e7153a9e1bbbd4f012ddceee9a9dbd22cdcf430eee981fa9607bcfc73ed4a1c1abe9d4a5f0662121cbc46f7f891640c9a624489cfb85ddb05ed4d9fb1c3075cfd803edcb76dc4a0e2be895e18616eafd8c25cf8bdb6c1b6fef33749cd709ba2ecc7850608bd444bdd037c7494b63e6daf48b986286671216f46597c36fd5045fe146778a3f3ccc5e6160106c91531a2e7825d1995ffa69e329123d20bd79b43e069e504af3a5e40e83a93663f014f18026c22fe6f81a97f1c3b3f751bb0a5d0cfa5f2d5969849100ebb10baef0013f6b75fd7217e96e6190ddd0b521302f0ed12bf3cc84a216e00b5337e2e90d200282a818574e7b682dd7efbdcc28e80b57675d95f1f70fc6164741b5bf3538770985bb735b4937e6e0638daadfcfa1042218e59dbd899ee41cad2cc02b8ce6c6d6918093a67664d08124eb32cb5106ae896cc537cb5b559c97f8f44c9376ef4d3ec00fb27b08c2b36f9603cac389a5bd4fb4e91fbc361c1de8b747e30eba3b619fee8e5330ce64bbb9be594298d0c8678a91e58533006f2db0b715adb13aef329ecfd93acbf77dc5e5d40e7e11a5bbb5104b4df6a32d67ad74fe4d2394a5a81a5e3eaea4c8f4a7b11a6b9854250c4ca908bbf01759165f7c42436e68de98936b3a5f36cd2e545b96946440947634d9c8baa37c0d3c161f5095efae9c10c8aa55beb6d7bdde2cf262a5df2b9428763c6e061178fc45401616d1269a985965d1e6780c6e0aea2906760c03efa56632f7354ede700120e0f811a4506be1a0b8a6ee54d22029e7d0afe4aedf9ae5e29e04a0097986d6d29d88c8ca989a5e3b34cc6621bc9e94a3e0a54c9e7da13673a21beb75faa533bffa921367420fbd77c10973cfdcc8bf7f39d9f9be1e080f978c360babcc92949b4f6786518d1f6fa23fbb42194c86cc2cc815964fff2073adc9f34434a5d53cfb2f9cc49bb2a047d30a8d36217bad310e4fef9cc81ea89e750c7e0acdc9e87c81300d09d44541c49449e8775513c087a6d474ebd1a1105d4038d27665a30138f08605b2742ca95d59229592e9c048ac37033e68254f6808a7030300bebfa1254497d2e68d7e3c70aaf990265b6ce2667933346584fa32c966ddba8813c131a7974b06754c64f8e35475d907782e9ecd0c1d0dd2fe1d3f6517c58a1d16ac7a841daf595cc35c6da2ddc52f25dc66225cd6356120b47d99f27a201ff363ed9745edd4857a5b2a98699f680949fe0267578b94241c765527fc76d868874d9eb049683b7978658d780aeab81f593d9295d7ae665f9c2b51c01c0c58206cecec74332301ecc68b9193bed4d3dcbd2a9907266bd25662496f2227ce8ca2f078f6b5eff424c8f975a21d820465ea2da6f0cf612ea7719df0580e9b7bfe445ebdca5e320bb87adabee6f9ad1c9a6f8f5dc5c55ca22d6038b242047844335be682fe25e60c0dd921919242fc620ba5b0a10a25182ff680c62b3d821befe9bda7778931ca0fd5141b8dedb8b25738ec6c7991df71562c08911e4ae89f82f5831e01d236fb9eade10f009994dc2c655e2104bce4d4d503173e00d17a7c9bc5b05e384523bad6c77c5dd8ae5d15560e68bfc34c37979272382111aa2f6227b5119262865afdfbac2737b69eebf00c446b8746b29d5801ea36e9d020e452cce76a7211d9b8112feeca7b6c3c91f8d011a5238d3d862cdbd7118e547c6dec1497fc237bf15f293bff00dbc7c0f0ef18d932535ebd9015c02f2145e4d08b91baa902ac35014284e6e843329c605fc59323c5118bdbad744c289dd2d4f13d5a1384a987462e24af458be445c4401e59594e5e7bc251500c2366b5b0fd50965841ad7d180ce024ce35a178bb147ede76a1ad791e3b6a84c38f7a247d0e7102ed7e1eafb4c1e71d5582576bf8fa10703c925c3ddd040553acf562c2afc6d0df5db197e80c8a4a05b491048ce6abe6583ed5d551553fa5bc3f02633a0b5b4d880649fffb2c7ba1dde4ecf267c0057fc0fb5ecb09ddbdf6ae157294a6e698b84bd1edc89b7608f6aed7b7165212061be0e582e343a2e1d112643584b5c8353e811e97f208c83210acf5e830f283c695a829f4dfbe9d0660ff31724c60232c1de8483e4e08c194a4ff46ec1468f9e9814754c5de6c4bde9e47964da060b2e36e71e282b269cf99f9becf36c24985cf1ced93c5d69713331e903103d30d051b8143d884e3a1bf6a2b8fca18cae644daedaa94a297b9e096655f4b3f6a1f26533c28ec6fef5f2e5981e6e5980ca8311ad6a620988e0f6e20c0b925885baf62c546c27d7d6e9b6d8ecc444a3c9b68c19b050663b0a8f44f38240955f2c8b7795c9b81cece8be9251d0e87e11898ed1e129062375fcf91fb52d1a3a410dcae334cd70f27d81318396611a43ba507a23ec4db0134be080b63360f4f90c6cae5b76c0b3e888d9f9b0052d3c81f5dc07c91815f55679fec375f67248fb1a1666f6528832b1bc7d320c6661e321a397dce728710790a790fee04cd1b4ceb15796628a5d6a6097596f9035ac0485a7586d453f449fd4966be12cfd35f1e058458ccef64120bd4017f607f7a406fd06e3ce84d468a9a273bf854c5aa3041ae50182614adb71e7934b781d8466bab04aa617393f0664c48ecb20465911903fde2d8a0ee5899e27f6fba24c544cab1b03b7d6be7fff468b0c78385b52fdb5cd23f53aed46656cf2b2992fcde2e16272cbee85b5119c91518447292e42fc6422a833caf29a3c8b017ec5ff2384f690df1e5ee383a631e868d7da16c30a4f09ad055cb20d515aa306eaf10b025ffba39eff9cd0089cc234ffd3d7b147caa3dc2bc770b494d3c47a1b8ca07d9b00c296526a66d08d5a5d8fbd498418f8497706866d39e241dc1623e167f84d39d73a62de3f8b6c5c01e0c8296032a301a7525039d281deeca04bce89c1507c01a4f45100316061706c54e54db34f0efd642ffa8b1df7ca9d9d485fee7639a491b35002227783499f727de22450d7479c4a42d8a92ff756004206993ed1d12aaa031934fb3269b075edd82c59fefd459f90db546888768df2ee5acd3bae957174e984c9409f1f8b1c8c81e4e1b3b0828e2347965992777554d697a1f75b8117bbe3e034f437b2c249c30d7d919c792ee116aa59b5fc791e2f2e553c4e4aa571c0deec798e503cd5c58c538c842e95789490b640c36fa8be39ec769412623ecb04b7fca8186101449f0fdf518f7d4950c8d01e6596c529353dc8a88095cb5c3364fa0d1fb6cbea53993457204f00e3c8eca4094b863ecdd74b6c2b122e03fd0531d4685b391bce4b7ce8dfbbe46e5bf087d9a851a77efa97ea9d2f67e92e691fe5fa33199434afe14510b71d45cfb395af0c1039b743306c317c65a7d6323db7d69b93683c6bb1451df9ef9868d076748b197d7ddb745b0934e2f568b6738dcd680e159ab52fed9618383aefa45c33868081fd529584d59733ba74b090785362393ec6ce080ee87f00eb4dbba0e9c7c041828e78906aaca0480711f4ae6710189f1036108ad0cadaf867d7845dbfe627dd4d3ae794a259a37cef68b8f8775cd0808242689632e5dfd9248b617b8c895a5cb2481fdecdc30d26502b08b3507743462288affbfe24684b04614be4da9c32f3a0c30e1812af4f5047d281466fb6e6652a3a2d8c06a2c8836756c53c96080aba7f25ad12bff403276ec069962dc53dae28808988072128503b140125f89da967093f3c035cfae75895499cbd8e12375e05c06a8fb9ff35d7eb05c3db5b4af19602a58ef65fb709284a49777f1486971a645a2814bc94b1a239525181faffcce531ae214dfa237a1ad1aebdb7200ff5c9832d4b4caba4a08adf772e8048cfe61244738d5f9cfc1988080d4352b95f1b2758585f75c4d041c1dbd47ed88f543bf13d07c8872fed70f8698af46775abcdbd45ba020a6b672dec4912ec4897386361501c0391f9a98014a786d06ab240a3f8853e313c81b2aec28fdb0edbbac9f0f4a32b58a41f6efa0bf1c97e993a49aa1e9a6621ab3e5e3d59461bf48dc3c57f8a920c23071ad305ec773e3d785bc597e3b4f4472d6fc819a9ed9db663653849933a76c588a6e6ed867fb3791dd6d8bd9fae18e7ca4e2a3d5617b2d759693ed9374131ecb4047a1e1aeb15363a90a037c74edb7583a507821f0f4720b0948a7fc9d04214a04583c3cefa72cd008450ab4b75cd27be74d120aadc568a9f3be674103e5eeb613866048cc6206129a0c915e26fc4540a63ef8d013d153cd06f28ebf56e02d023d4cc4abdcb9eff9f410f1ed99d8c665f7272f60dd32523ddff895d500d947f39ea20578e97305a7f49983028406809596055c0ddfb77e051a5779057dc82aa9ddaed95274fa51f020fe1e354a2c53d2b7664419bca25aa7bde8d7c9a700cb60baa224c3c8048714b6e8a572a597a184921d11cf0725b8d4ab72f36b1edc449b6314033bc779cd3d6a3396d1b6fbebb067a90883c1956e569bf513dac51bac5e2ba7fe8b1d0e9dea9b0b088296a630351083753bb3c1f12e8dab2a66afecfa7b2ceefe45405e93c97776c61f8a1d577ff94583d96c20bebedf0cb496b11ac4331421dc2529968415472235b69c2d8dc12b9ca5787a9c3a6992fa7722d781a63e5a3c224dc222bccebc21acb227a0b84bb1f5a6e28e47ae8e7c5d0f1421cd6e6afe326cc521eb500c384dc07e423ffe2e5ca6463b85a2ff642c99a28a1c0982571111a8c367e428d5b2caf527ddfb69ace2ff0986b9a1a736b2669ac5c5cf0dc901218e50fe24ec27854e707278767476577f026386fd490caac333bfa90aeb25f6d8bc7065a2601a34c62720368e00d90729e72c36cf6fbfd20390804ac4bd84e8ff9fc78671304d89fea637cc8483b0951083c7f18916f9a01c1ee2261df34fc714f6594b7167ac926861da83737bd682e80ff6ab6036a674c5cba8dcff52f1744e5d901979006bf858ac19f67fc0ac1c78e9b7a049751629d0d45eb4611b906be439f1af44f3bfb10b96318fa633fc09181c7a8ca956763eb8e748d275103871ba4b55b090c8efe11089907540ef2db146634996a695aadd0144564c02e8ca82ea28ec0ca7558869b68ca3a364bf024dee8289b06df76534efd204b42c8427091667a903848d87d693f17be16e4659cedcce271191cb14f90c474d114105b36b5b263d55a93bf1db19f15872cabcdc4557bd529a6f844cb2afe295eb04b62113cbc847841fc8d0a9a874ec2e2a05e0cb8d9e1bfcee0b14f001e56a094f1ce69c1db660244e1014f67954d11e49460a13f1957e31bf38ceb7336fbaad8b2b13b0734581fc3928ac8291a431988aabf51ec1fd24cd49150392674a801e99fcfc89b73e195691e27c0df48828ccd1c4525cc96858b0bcc1affddac86cd903c73df46afd70a5b175705bac486e44392075c6e8e824d4c70de287f962c4d03d23ccfe37d19c30543a043bc69c893c5c12b1e4f5ed387da5f7fb473fd555d2feeb628e104f5b1ab3dc221cde761617eb269c6de587f97efc7e19df6d476e0c99e433a691fe983f203b1b7f195cfc40491f54c90e39db7e997493bf19e19f073f4774ebffc0981754b1388b2fe23d226105217680881c8169fb15f1006a1966c7199915f50f07b93a3eefa5c44bf6aa97c2414ab9b972e36a2f8d36a10de95e9ae361b1171971f1cd486d90a2ed794a10b3b8dc01f951a9cf65228223e46dd0421c260f82dbed4fb81506486813d9d715363629c5bd5066f0b65a68be8ed0ba2940a0cb76ef96275157fa8bbb121655d3ed73a07a65d2bb726c1ab438bbf0dcdd0e39c64d9dc8cd4e05e5a905b92fcc7c97391dfe17c1ac65c858ddc1d78a64fd847f618b0624e2afe79caf5b26bcf9580fd1a9e947e9b23e15dc20acd4540f1d71a42809fd5fdd9c5d20f105833ba270307502649eead1c8c690919f4a8176a74c2c514906a1412cfa014595008853b9d15c3079370f7693159cdbef82a0abfb6d3a8c5a5d8d3a19e97ce0a338e1272b6c5f88cd0d95900882daacc287330c5c327b4916ddec2d7992f23692c70ea644a1e88e9b761c717134058c6c4d69e88ae9daf65ecef41b11ae6da3c4483f0e59c2081627d9b6316e909575068a08dc10a901f403b0ac951d8dd25dbe3113d693d9eebcb91c6bb04ea61e1d79f8fe6a8c909f6d3161c70521547c5f31de58c2330ca4d524195efd9c875d92642ab457437328999c994a249f71e64c91499ba051e5e4b6b9496b24a4fb4a8b77ad6f6ef834b0655c9513c2c480c064ab3e6ba244145882c6ef48547d583519cd7cb770341c402bbc81edf4468c2c66b41872d138989b3678a201945b1cb1b32a5813fd2d0791fd4652dcb39398827cefe023a6640258479d58db88998d55a71c43f9451e2c6fc165bc4bc0bf1d716c57276587b01a12eb2c86bb2c2ff9a6c09440c8b467fa0384c02583281c33693306a9848deb229b79fda5cca47d59dd7a7d2f213ef6d053dcd354cbe83ef69b277c38c667e8e28c262693df13c70093f93770214768231d084a7f894f83f6a711eb3dcbb540c802a40b8da5f80fe8d3aee33266f0a4b15dd6c54f686195d3ea0366b54d8c05685564347ec75c8a89e00ddb2fc87d2a6a8652843e1525e38407ec2bd4a96568a8c7430d53df9bb140830b2b7b3a4a32e9e459d16fdfd5be8d0439595ac2d9a683a6620d5c1c9c85e26ff46a0d9fcffb7445f932c6704d632c670c21753a8c6fed988ffeb5e2a3a2f204cac74a880d7bdb7c8c884f800ee37b4006e7fe21bef1071c3418a8e341c2824cd27e5a5f3835538064c4aad456789708b93296072620532013a631d721359e355c6e0dd16bfa58ea7d0687e24257ba3bca014d59120b907dcc24afd31f21fd98182fcbd5fdb95539ce139aaeeaab2c2a5ae1422058df255bba9259543b952c55474e55775574b4a6e75ad8a2ad1d48feaaa2cab1cea4a29a2a2ab9f4a975a56815b719bb9e20886966c9bb20ec12c156a022ea1e77bfc9bc4fadc952b561d2cbb02c416125adf68c08e68342595afc6a2ddc2dc6b2e08fec918e230a06c9ff09e72ae00b225572ae281e90250b1c00dc3ed23f730bc0081f096da6e3c9c5dc16c29fcae5e4e0705ce389ba8a6698430115601de1fa11040312127d1f4d452d8625b42aa04a6e3773ab5e186168ce2fc1d5f1ba6890edf3d7f139281884015c8757679fe624ca70061bdac42d1d5c7b958e2175dec8281e754062c0c72bb343a8d11b888f4104e840b028ffa22cc6e04a8701cc232f156cb2b4cea5c602078d417c26857843003846b24d342bd412f43f48526932dc908e58b93731370516f2046a950a84f8d8b609d76fc9200eb82840446314d285f98949b402e054606252ac76d247383d19f9608a40af5209e08754ccd81179175d2f10b82569070192d02a365b29a09bd13f8cf82c0820b2da46529100170a2b95d27c67c51800948609ce91b1456123831b7001bf53ec20b03a1ab4945f865b22add0245cb10cf8f5260b48c6c73e3ef7aff4f00088e0346aca344ad5b16c01a212ac1e331e98fd61f2d410dad89810b2c42378d3ebbdf8f81205c018f84c07867426b801f965f80f1439a02a3903ea3fce20093c88508bc2c06200c4e24a7eb069817058d892948805353a09b6bf0d489d88eb425469cca0098a857101f9814682f7a0d8c80b046f3ab3c8c8253a35e4494c06948ff97c7612675e406c0080444cbce363f7e8ffe2790a0700f3433d9026e82e86871f6563d04ad06fe2df24c7c9f725dc31b382890674928476d4983641da7bf43d497482a527cf490aef23e432b3f6c750cfa002ce3e3d546a9fdd884ad38561ed7e6f26056ede8dd23b150857a61cb21ccda3d382fede11b90fe8ca9589daf71a7ca69b07fe5a4ebeb3771b546b240bac914dc6c6e98838119dbe5636fc9a8e9881f2c6517ab69c6f41391a9edd60ece905bfcaf34797de59611db9ca7be451d9d0310d53e17fd15e42f0631af5ec87ca038f0d836bcd390e553824fe6693dd68f7c80827984ddbb8195add28490cef413ef9e2bb5dbbbb6e5792473bfcb5703af353dee817cd1efe6f44d50a35a9e14d9e204611e391501497ca361f61ed16ae5858e8a993459768f6214d8c114c34b0fc9c2285abe11025ca622c4bb2a7e5ff2e15324d9b6be075d78a040b823830d49795189c70203211d368a3025c1c809c8a367c0cae38dbd6d3671c8f805578a9c2171c31abf74662610dbb08546a8854101184d08576839b667dd25254e8f0ce0a20dadac9602b0b58491091d77fcfad9387338fdf85b6662dd26e99f13ff0c379b520ced8ce903c8af77e070b329c560b6c1dbf2c1e3518fbe61f03b521585e3b70d67f07119a8c78c10010b86a18ce3b7c945ecca215ee919a912a25d92a63d0f54725096b5e3e8ca75c1351014df031a0ce79b57201ad6a803ea2ff58753f34b3c1c4f61950fa7c6995bda52c00d19d95cc3489e17025c33c3ee522a8b15098c052c7540c075748060799d9aca94adaa58c1c00f8723285b87db07caa51e0eb5269fbbedbdb7945ba69464a809b009c8091e8553e1473c89afe48c573c8459bef295afbc880ff1d58a6918276774532251af9ad52d161b5858586c980d80700039509e84f5c32f46fbf0d3d152fa0dee559b31ce160650b526f4fb3b0cd96248d2f470f49ab161341cfd8be66dfabb6ff3896ce9afa0e7b408a5459c99cae1134d9764e7dce0d8c86a3ab664f44dc07353c06598dc3bd7612b6951e3ee04975c7f4df7e9eeee23ffd1a7a3fb7a397c3d638595577a0ee3c066d80cc621a5cbe42e4892ff77391cbd068ddbfec5edc7c16182ee9e8679899dc851bf17607c86ac8db80dc3912d51587ff912588b38dce7686f18d7b06e983f69d2d83934c859e77889fbfe9ec998f38a082f49f799cf66db56e347ed10088182060a2529d2249230f2a54d5ddcce2145293d202e6d3ceaf73a07bbcd2aacdc428bd9165ae448137dcdd3ea102d9aaa8904376534a184159e547184099e40830613a84803094eb2a0842236f0411a66e488a1830e8c30c28c18385105244cfd3a78898627390599895ffb1d3d0c9063a2af855dac82dc51baba5801b9fd12904b32204d14052db61cf18744864081978000428601326254d88225e40850fc28421a3d583161085e6c0144870dac072fb5008b298ec8aca490a208a6fe0e784962a1a5ca01c2148e30061a98bca0051e2489d2440f689063eaa780972480040c08ab3038c182164cfdfd4d2aecb86928d07264cecbf76fdb76a58f4ede1e8e73d78d7b297c55b90b76cdee79684f9f5ddc8524351aeeee1d28a7af648b8bd5f9537f0d746eabfc92028cdbae98a6d1b40ab20dc7f8c5303424290252eccfd16204b8e63689c160174f50bafbd4660e97e7706d1acb1c39a404648fbeba2b09e36a6ef62f2e7fbb6a10720432c717339dd8366b452297c8cccc342df6ac47fdae9ee5b01d295ded6a57bbbc5d21fb7cdafce247bc885cea3478d4cf5dcfeb683fde40dac22b3f645becf709330b49120e526cb1455efac217ef28ece2236666e79726a26406c95c5d772bd362333b2bf415103bb6ab5d3099b796d83489e6d5a49a58c765b3709edcbe79b9644b7f276c978ffa27d863c81619d831d9d26d05c6616c57339162bfbc73fc88327ad6ae39851da5cbe57231bbe6129e342e2ff9ca572ef695af4e7794ae27fc39bcf4ef6a46d2333e5d7e96090287872820a701724673923597dbe6cae9e1149e44b528a59c53ca293f3cbf18a6a19460a728fd1c5d25b7fc0976107691ccdc29293539e56b20ff94524b82753489d2a47e92f4549aa4a34994e9523e0ff2fde54b9e02f8d37dba6b3da534f1caedce0d57bec8250f87bc7989610e6318bd218a117f73054c1d3caffb6f125309d3bde7fd3d29f68f24696bb1ff46cf2049df4b1edaf3985fbf574d02a25b0a491281f4b6cddb3696609b18f4dcd1fec0b28ffab7cd5a0785d824ed07ce99b9c43617560353d0a38229f0344e1a48a4f31d38d36ad686d3472e5b56c5b04c8b3d418e82ada467dac1168124b116a4d8df382d6aa191dcfeee23526c1fdaf4853dc48eacea956bf4dda9b3b6751d509a1e04b9cb7d3140c880903215ff0136065895a8871d2d6add697f06b9203938b2a5a714b6573426611870fba70f6c0f2d767f47214bbc841cf573dce7234756a9a2b023e3ac524d1a250c87717ac8410130b0b3757248c06a9abbc65dd924972d6a1ddf18a9c9fad16103c4f5900239985dbda4495a8ed6c1f5f97c4039dca8fff976f0fa7e670d5f52e03133d401f4f2f2a2423b2a9ff6dcadc12c52999dab859f0256f962b4506cb17fc9ed806df26a742828bdb091b983d28627f29869d040e96ab1695889aa85dc7eafa38079a97dc0b2b1e0d1d855cc95d57eec95e77238a1b032663a61717cdbacc591891ce2f4aa57acb986c32a2f7dbe7fdc58f5f209ed7f4a285bca5aca3a876bc383220923fbca5a949763762dd4b4a669b11bec482fb56c2eec9227ecc838576ec164892b6509081f4d27ecd8da47870de3f0c0695c661ced478672fb3ded6548a459c52a79fbd5a451ca6ee7fb7bb56dd68a44cebdf26ce8701700df05388dab7daf5aecef225712e9f4901619a73ba1ec114eaf34c669b147c6b99d83285bf8bbd611f386b07ad5a70612c546169b518244b64821379503a5044b6014c8e146d3786ca5942c33063112e0ce85056edaba01795ec18aa17341d1cc90794c04cb9773786c3d897da60128a5d4e1e54a29894829431550f28c83700d240729a3a78c6b32936ba20910134cb02cb1c40d95aac5e53de8eff9f57767f680fd7acc6108502a20542868398007566bc00378603518985a2b034a290d5c2284259823478e1cb30a54a00215983b76ecd831030210800004acb79bc80611441041b452333c3a3c787c313a9ae4f0f8743481c261e95f24e214bf38d682d20e483aec40010a48c001883880901704083180015a70b8a999dd51a9c105382851801c941045020c2047e6bce970c78d5f30001ddcb841076108064085da60e00a4012367c1235d46037966d0625ae1956d2ae17a752a954cbeb31434a44436a65a546a88530106b6daee7a33373607534c96992d364763dee1f13ecd0a7a3c9ac493320fc3a9a4401270eac0e9b53d80131d84a54be79032b81b4289bcc9ae4d826393a9ae4e8b039bdeeac4bedea913781a2d99c98351d36409a446902a5494ecaa7a3494e9327edba4da07c632bb9aea3494e8bf27a2b69d2d8dfad9ef9172ffd8b44bd79c344e08425d0a2ec61cea9896a50912d92d25aebb67d3a588ab245fe36bbaeb3313afa6eb265a321a265102bc32d26455a3badb5d69b6b7898bb3b8718f18bd1348d525a3705e82065a5dae4d8dea8614aabd1e9f119031b588d766a60c7ce16032b434da334b06cc389841d3bde3c42a43251568634b09d49033b8fb05d0ab7559a4229adb5762cc7715dd7790a88d1d1d793d2aae8e8bb75e60caceb06901c2d6da7862639b7c7b05babe279feb64576ce0976becfe349e9c8cfe7c35dd769ddf4ee3a96292f365a770b316657bac41872e512ae745d61c855114998ca729b86dbb3e63a94ebe1107d5720ba2311a7d3e90e21bafcdb8f29578e9fdb3f863c383ed2a5bf2ba597a10c97078f21b6cb633e7dd9e2df7160cb16ff0df4bbc92d1cb5dfdeb550057ef9cabe7c73f40cfdf9762804df7985e03b2b3835d9d2af8114acb245ba8f3f2ef3cc420633069635f9e9ce114d232cbde34bfa5169510b6fb4d865b83c58b6f4f389c3e0623814bc0cb7711b8d8ab4e7d4dc0b4a0870c300babb5b0021f801b0010035b0d03083c84677b74a08f4b1299eafe375dc56a936bda594524a29a50ce1d468736e73ca3943ad04e29db3fa9cd335fa3f27f5cfd1744eed055a8e3639b01dc1d3a03e438b7cb33157b4ad4608f4b1299eafe36d956ad39bbdd65aeb6b359c4c354dd3dcbb60f9a7b74a67ce39e79cf349703db49d169ea321061a5040030a6878012091cf9fbc34537d9a7d9aac169b90a4698514fbe73686156d735933355bfdf2129bb670ce94cfd6e6a3f67cff94a2be36d8d61aeddd44b2d858676ed79a620feafaa75a54a566126c55d59406d3727c8404aba580f468dc44df711b8fe570477a6a8fddb8233db5c76ab8233db5c754ee484fedb1ce1de9e92507f1c6d7201a6bca7634f4457fd2d894ef9ee6d01995511c3ad3a24a755d2a59bc5acadf4ba1e7f784a0d941eb4a9a1dac70b89246881997cabca4a5bc9ebc14fa94466554565125ebcf0345d2059299c9f1206f6ecacb665a6c970d719c22394866558958696612ebf9e1f3a01f543e145225292fbe8ff8a98bba5eaef71d755dc0fb94f7429d0f1c7fdc6f54c18f3bfffbf13d1b1ab092c60c2097fef4ae5d1d933032894db93c66e7dffb0ec8b23ddfce7b1cc842430fd89fef01e923aefef4cb63fa77ef2578b9295fc1713eb929215542912001e5bdf1398862cbb8b0a3d6d25a12464bc99623b2a489449f8fd4521e161f40fff91da0d0473b5e7cd49fa3e716f6eb34bd13fc38c11ed6d410daad2a2da5a9b495c6ea6e9108499764bf5c09cc697cc9079c2e1fc5648b6cba3a779c312c3ea8fce777a8fc27dcf17950a8b57cd463bb3ea0a669d1d42e2f69b01ef5f708046a2dad85f2569346ada5b5b4192f81502847ad784cb6786c0607a52cd193ed78a926e135455197e6e0f6b37c13f0d46e9bdbb6d1707e9f16eb801aac450d76016666817989cabc1f3db75b9d8514dbcf4875169224a58f8147ad26b917e44479ee486533065aeaf67f3a1f2fe2298ff92847b6cc64cbe8b1bf1ef31c0973862c692d1f27eaf634e276a6d6f212dd428e9a7e717b8686a37684db0f7e13f05c0ea94bb668975e4f001dfe78085dfa35358a786021a60e0ac83b5f87bc33fc38615fbb5b38f2b380effcceffb8f499867366b65c769cad71e2dc7ed18d7177f4d97524cc4c5dd4455d335a8bba8860a9114eae8499da49754612777a819ee8a94940bcd9a7b37cddc6c9d9660abc9a121ae8e54c35a99590242d0b996a92d66a1114d2939f68d8a5857c1968d3e7bda67c74a4b62a4bb660c1a3feaaaaae26dc4a841af2837f3d07fb720eee915693a8abc52c24897621c5937bccbba8455c4daa5448f17bf00c7820031a53111e2538c164848587f9fe7e801c98c63a807a44ca9ae4f684b9ee112cdfd151d3c5435a5c69b0268d7dd26a8af4e9f6774fd874cd57aab6e69d5ad81ced282fcd2de4a8ff8b1418b7271394e8f6375d38743669baa1e3e05f06fbc6248cbcd3359358bee394ddfe1bdf0ef2e67a210be1148a53285910f66454d62479fb8e54569390a3fe256a14b04a45aca6d87dfbe9739bae395d3acc391170808fbe8780cecbfdbefbed13f04d603efdb791c58c60c79aba47ece741bf6dd68a44a0301cc5d10b4bf072e76f1f28c47cfadcb743e77bb8fe2f2c3e7c1ef41ef83c28f480ca4b9f14454f4aac4ae713f0b1f8f07995f700e843df0147d0620788986ca4279b12b4023af4444f1488c740dfef9ec7fc26a452e373b48adb4893c7bc444f35e829464f233ddd1f54c4800738489828430b31342e6646c821c3c917370081f403c6623654766514c74b20d08701d37dba37c08534891f35822e38b1c20d1358a0821729d842155f7882939a23c8cc2679697a1e8ecebc99afe9220171b76770fc97f46aca47da7590bea8ab08d67fa4ae4b5353df09df0b6b4a0a3bd6d44bc238e076e747eb75f3ab017908c09d44405f8580428fc562f70b359813c18e8e7294d370dcb64e385aeb85a8ca83ef585363951942e39c2fc6455f0ce8cc2456bb63bb76a871e7e76898ce4c62fb7e3cf8b501896507edf26b97430a48eea3c3c646bba3c76a2a6673fbebca4b320c3970c24c15418270c488a9bfb2bc24a53084295c410b479882164a30c92e94f1c41144b0c291203b30f55795977e00c14110a02c418b9a5912a6e6598beda809705caa422e87353563c759533555533555653e55484d79c9511f544da11c357172a66bbaa66bba7236aeb34a69a662635a3b1fc80b69cf83baf333659087e70eb15dca208f2136114b477e9378d0e7a17d3f80fb3187cba259eabeb9b05a43e9114721c20131429f0b811c614ddc737f84359d9ac4ef9e95f763c7779dffc21e3ebef77ce77bf830c2fd0f1d7498f95e9abaee7fe8fcd7f92ef4e1f9ef3bdfa3878feebd37b2c3f35f07a4808f5afc3bbaf77ec7f79e971f0b873e749e970de3513f90f9408ed8fc8fb0a61a3ee662d80bf562aae18fb02600d4f81ced415a7495cb842ea4c59e43b0e326e432f7393de323951f3de6326fb90bf43f3a8cdb667ac64bd2d42e1a7a0a453f7ef9f5207a4b7d05d20ed8790000a5c9d449fad544e8243417b7bfd333b24508766cd80764790bd2f02170860781a24fe18f7f82443c9bc9f3000051d6e47d0d70066caaf13580408e7831798fb226cfcb2f05f39985822c34f46610ecd8308f42b670a077a0e78ebe5ac0e8555c1afa0a891d1b16808ef412c7bd4898f909b8f20f207168259f8247fd44300e2d7421ece25370e904a10b418388297cc5a3fecf921370ce6dc6c1674897fe2e8347fd3cb83d932d9eeb21e3c81627594c2c2c8c3b6267669c4e9f52f8aac6240c8edbefac19ebf9fe5ebe566438230d29c44889f1e334c50f9c6081c40848b8991f8b0fdf7bff83e73bcfa077616d034a39f29088fd1cedd534cc4b3d6367667ca54494d50f50476882091953bfcf78690347fca00c57e8c29022f8c0d4ef2b2ffd98410eb290c48bd68b095c98dae58a225724e109408082cad4ef792fb9f7fc0fdd7ba18fefbbf7843e8cecf8be7b1f9ee75e9a58f83dffc3f4812c1cb2f8c0fdf73bb8ff9eff0b7b18e17047f79eb0c7f7ddf7f0f47f60e7cc961db70e105ef190268d8ebafd8e92306e6d07725e87bb1ac77d31fe1c9d1f0bbfbc3bb8f758f86a33bce86900a5c9739027c8d243f71990a6ee7f48f982abc6f4ad80d23403284da21fa72fa6072033f8714a7995e7d0837e4a93373b9fa701b43f03187a11087a1b60caaf802a5f03645305e5fd7c9026209fb740baffbe874e0b145291a980d21402a509044ad30794260b4a539702fe38310d1308766c5810dd646ab0be0247e169ce722671824081c8711df8803be5a6bb833cb81125c028c3f5b8233f0fd89311ff228c3c3fcb0482f5e767a1ffe3d20eb4e840681c77342642b6f84acee48c08221808111c8ec77ce5ab0e70290c36df59dde34f67665c2a367808b37835dda7bbcc89081515151bd3ad70299c88243917c982a3f0d50ad8b7035926077a9efb1fbeef421fdd7fcf853e8cece842961eb867f9e153bee08282a90b59e67b2f4ddffbe0429619b2f8d07de77fe0de0b7d78cf7d27f4616487f7dcfbe87cf7d2e479696a25a07b66aebbaebf601e509a3e509a3aa03479a034c5f4e02b1f5d11f64c8bd38815f96816b1f2caf526a603a3a2bcd43da1b382aa93c2003a18e847faba01f435de478d15d0af7ce87f580943610f5b23ac305028b45bf8a4ca9a74d324c6817909f45c98aa3715e6b12096c3b13eb9fd38f5b9ef22aee6dadcdd7d7c7777f7508821b45b997ac61f570385e009f873ef699ba609519f9f32f3160ac1ef31585b522ec4b9fddfab45956f49070b6d97416993fa5a352dd618ac45ed093bd25707861cf533817563c4bc7322eb60b07b83e32aacc26a85354e9366777777f72c4007024c98d0988ad0aa206202a970213b585793829230320997e6d50be8f73a180e1daf51b6539d552835560bd0614bdfc3e18bd11e874f47dffa2d1db695f5c5d4222d6e215bb8009b06d4cfbdf6c56c740985d197e6849dcffd485fb77f2c11462b0a4a78810c694061eaef70bc1443c40857503dc9029299e9c70d6ea2004516b430430a5598fabb98975cb08a410fa040820a638099fabd2fa65db2a5a3c37db9fcf5c74e9af84392449f3f4592b4e7df240e295deab389c371085a592d360d585b459ab0f3c73ac35aa49e711bc8ed19d6568bcd841d2bcb73912eec9e4a469dd528dba9c50ed6c13a586703ea6a3a98971ad41dac7b499d694fb5a7da53ed2977a9d458b1219a8106961a006043001e0c59aec8ae144011db0fdb4d061c78f2c6e8b14b66d504198b12338142239d2f2204c40b93114e015d988ca0486874896fd206b2f1e3cb95b2970195812469a0493d684092b80cb2872671948ed2a49e8114cb4059decd4818e9c58a97549ab69aceb48d3ffd659550e8516f5279693f293347dfe0c8fef31a10ec484f97a268aa49429a64659aa4bdcab7b59f12a24178749ec710dba5464897fe214497caa013d2530d1f355e45e56bbc8f1aefdff91d35583aa10fa00ffd0fa00ffd50e355422b32c30a2ac860922623fca305a99016552dcab4d85f0364aa4153291f67153b29108aa2a7169dc8cadb00516fb2f12010c8116fb2f1a837adbcfcecb436caed6db6c93e9f1332ce5b909f28b123e3c8fbb11ff309a5b5361c59764879fb361c596c4ac843e50ea1dd1f97659b71a76b6d7caf7cbf36bb3ce61d351c8efb68369f508b05b19ff7d8764e8b3db6ccef0aa8e5684fc02712c67ebfb60559a246488a041854eea8d9909e7c80dec6fb08fdcac97dd878d0fb58f9108bfd1da15f79f9b1d8f0075068e38750b812f6106da10950903081c2978f12569a548aecc0244d46b495fd84ec82c2f2741b7d41a03439d137e4e7d0a48ffd09b293325240282d768b34ac956ce927507468329606b15daac5ea7d8e9e472c0bbf8dff6162611bbf03f436c21e46f87ba83c28ec616407e857be478db7f11cee58f9d04ad8634573df3e4fca33385f9a7af430b2c3868d90e5f3d2d4c3c6b37c3a60439619fac044a4a088fbbd074c015fa7a9165b9a401e52d50a58034401717ddee0c8aab0ece010daed684fc0f91ed8505a9cb50a285d5e953bc3ced18c580fb51c0da745ad08567b1ab495edc291ca50d526933063c8928683b339d1c4b0e5c4b6282dce70bcb48de124e7768e18aa7079f01de9899e64cb7ce77093c91628ec0cbb6b5ad48860b5706c24b7c6c9b0a38c75107aa2277aa241409fa35bd6b296c95807f8e43216ebd886e294483581f652b6c12dc81148182e01145ec872cc50c28c3270102389923492a0055512afa9f642e2560d2f242edd5043ab4d59dc6e915e3a76dbf8d4a346d5c038640dd2df433e318a4f23903723706d042d7610b343b5cd138ad8a53d5cba41321046f1a9457e82cdc1260b222811860fb8e0041305944421238a3190f42088e9c791321c818819496c6ed030f5f38c97a4168ea8f1020b2fd4c089124c7c4b23e8513fe12222c60104bbf4a3e0062eb180a54c24e32c00425a210863803f88f7b00460d851de5cf9d281268d35689d3b6b743ee3a0219ffeb20005ce27c6b1b14b3faf9c055ce229b6137779870e2fb2a55f660a21b7d909e9d28c032882dc0066fb8e1c24663ac172100e526224dc6a821d5f5aad961246d2f21207a9415a415aece7202f2f2f2f22169ea3d117d9e0358c83862aeca2798d8be1353688da733daf9535eab35d9d8419aab04b12b864038f5cc5065f718cbf9802c644bab0129a542258ec76f96b0976de915fd37dbadfbc82d0439ad52b2658204d1ae5ec3689dae08b32c6b87ff9899030f3fb5d204b7df246b111b73b8544f720b56dde2b1b363ced99e5884543b83d3214ea3259e8365e231347b2e447446f89de12b7d00572d6727112edaaa2286e9b0ae3701976713278e4322ab7a9a651aa691678119d9021c365301a4fdcfec938343deaafe92548ecc8afdb5bcc2556b6642b1c79c85c82d5eec8389fcbc2ef48523db4eb0aeb33ad16f9251b60842cf117f54711bffac4af90833179b54b142b11754684eca149e326b6d8e2ddd1e2e5ad47b14771c9153d47d4d15a2976a1476859682d16fb47f03294d7528cc351ec428fe052e5416f9ebb551e704932e36830a40b173cea0fa306b7bf61bd454bad49324df2e76db37614ddfab3e3cf9d7008edced75482f5af5fbfbf18ea94a641fff91ea00f283432bf883a03d32734d2f976a1a4c733dd632005d2627714c974ade55124bd9a9ad393d6a21aa533b4e38d119b9d2d2c693c9d8ce1e46ab19cab55e13691cffbcf2ca4a8cde91e1b658ed62ed06f2db775a64e215335539d99622a93d1312adf8e84f1dcd9ae39c7973b3f47f7c783bcc2ed6ccf3f535bbbbc5da05f4f7e1f27ec7b276c149fe61653c645bb640b12b2d45bc8513b8a9bb3bd1a29a632ef2608e924acf8e439897c1cf46de3968f78c647fe342e97763de425af17d7b408a32e17a5b1e198d6d290704bd0c2891867fce00b5030755f20b2032da860832fb2c032452712ea9a33dbe6fe9e10fcf49d7ee7bd2f2c5fda48bc197cf68935984685a9d56851e051bf334942f6b6848d42562a3af365bfef3c7b2fa98b7178a1d662974d6b51993b0e1332648cc39d481729b016b0b061b2d8a796cac16590279b3419860fb430622ac2638489e923a297a56dadd88b56d30b98ddedfdfcb15d0d04a6d534aa495ef5eab582fc3bcf9df7eff4a9f3639f807c8eb61d4e161d0245c23e27ab4954d643a0489ad4abd652940bf4a60825837da027d918dab4b9d30a938914e74bcb399571f2e6cdc49963481cad62979973c77985db0fa4c5d66a5ad4623d52310e0d0ce9d2afc9ee4c18b2a599b81ed8d1603389edeea8c12e206faef735e5dbf6ee2a2aa0973eeae196e0e57a311d9884613064a9561812ac0f233b420f7a1f2aff791fa107fd11ebc3c8f63e3eaff23e401ffad1639f1dbc67d9c19fbdb0fe3fee4c62edfff07995ff01f47995dff17995dfc21da00f3daa491d2fa4d2ddfed3fb99c44e6f7b0747befec57861a34e3d004739cf5eddb0cd2ea64d4dd9a7d985247513dd380881b08b07398247fdf9e031e859a0b05fdeadd8d5c1ca2dc6307353de7bcf3b1f998419434a270177ac309f5558855598e70136363253110ea50926239ce2dc7cf9375eb256f953164babb5d65aab06d6202dd65a6b65c160158c27b08be7bed4cacc18a8a156514cb631bc3aa9b05a6b0d7d4d8b9e0aa5aaa74e4d02cd40ec62e6020dcb26e7f4e6520ae3e606521cee8e142788f564f5a6f3e7a20a45aec8d9c54be097e498d909d7b504496234e4ab497c6217a6e150e62596d114a3419dc896171d438ab40c1ecdb419fd420f098322450d4c456853586232c20f3ac1a4ddcd6adfdd07ab309c169959f661803ef71e052b8e7f1dec73b52b6c457158719ac4e1ca87ea7bda8ca53f56996c9172cef1b0fd7c1ddca4425ad52bd6eda7d607d6bb1a2c587f0e59b8037edaecee4871bc3bd2af07e923f7670c7431212d361376ec603eb0a9553ee2260e37dd65a312726f9a3452d6ab42ef2fa50deb86b5c2a07e715d962fd80525e370eee54f699226691a037025176a290f25bb88b2b64a9b719795b86664cb9c60074617eb517ff7042ad3c93a980dbeb981c3cba65003403f8a1e80da4c2007a04413e847003400a58309f46300aed486604320edbda62ffe991582953ed28260411f7a2476a4acbbd510c8c27d8dff6102812c5c07eb42a11595ef61e343cfe18e1aaf12f65079d077c00ff62df95ea15028d4f96a28140a854296eda5a947e859362e54bdce7f5ec87b2f04ab0db025612a4cc21c914e9cdcb1c260ac65d1c96877b3026e58d88da349c2bd472565f7f8b3cfb812578bd3a7cfe94b523933477dc2805115c8995286cdd88565f4092e311933c641533c6b56ab98f3b6e7dea6c566cd0eb63df70a698cb2a46449182a58ac5a512bdeca53bdfd3cddd357e87f98583c20fa199e7f0650280aa589431ba16456582364ad8495c5a32134998d6673fb8fd8b18379a95d6dc3d1435d4f387aa7b19b75425418d2b0838d15552bb76d5bdd6aad95f9bb63abf88e94b583bca12f9128a42f0af3eb5bd8a83edd34a9b790e1b839517f4a98526571dbd4884ecdea19770ecb39e7b270966685246d409024ce595e048dd52a0e8552a5b62115dc569b8c6c39b9cd8c477128fee4c68593f344ab2a12a156f5132c93a99cad5051b285d38e784bc270d378387a2c57f2a367118e9e13472e2be5ac94cf782b6f8827d379dd4cb67450ba58cbf6ddee6c675a954573c776a55a465fd485b8ab3c5559340cedfb370f88168edd19a86d7a12be844791aab05917c53b819e4c05bd9537a4c594a73ce5322e2455613058856d325d67be2941d280ad486f437c3bc936946f2a9e3a3c94b68b568dfbf975b0c6d9b69ead3a58076b6de1646e646edb9ee3669df36b976f56f4bfe9703b235455298bb27418e94bdc2c57914259ac0ba5c59eb5d8952561a86075b0ca627530d9127639b2c52a516d2049399024af4d5494aa55acd60cabf48961b093edd4994a453fc1386a12e952aba8457882a865d0a74a45b33cd7764bbcef5e0382bde9709a24c4d63d6952c747e8413e561e87bb1eca4b9e92a3fe5097d3cdbc936865559b97baf60a2b4da190a5879567d9017af76ae539b78fef37818dfb38a1fde46cba9b16719e743050fa485e6eac3577f4d4ade952ec09ecc6e67627f3420aeb42fa2a62474fa53c09982fe11ec5ad02f3cdcb4b9e4af98bbea60e8ada843048aff7b48e36bcb083c996ab59612bcc61fe34ac5b480454835096fc288b7158d6a28cddb99f3eb9e9353434b419b75554c5c18c716c2155b10babe2804bf50a4a99d0645edb73772f6e99c9d28858558bab163b28481cb5b36912cb5aecedbb1a09b381ee485fb4c3b63e83a02bbf1db6dbf51dd4b8e91c7d55589d4569f154574336592ce52f330d183de5a91a9b15f6b97194a5629756b1ea15954563f50a2e49a64ca40b55026dc204a52ffa7277ef782e1e319386f1d886b0773e17c3354857d34141baf4cf4e8ccb33aca98a6a572fa10b49f222b601e930ea19ede2b8d936a81234a50da12f7696311934c538b6905decc26470494b2375bb59b26589341847532199b0828bdbdf2ad9e275cf1f0f3e01b9c1deb83eb70ef7c574cf79dc46a9a02ccaf26ee6a5963961f64e9739ca6a910329cf78d6242770a51b262e94f6c65db5d81eb2ecc0bd2321bbdcffb82f1ef56f9b27c17ab663fbd3c1922d2d636bdc91f23f2009932bbc50028a0a4a4c23bf87544557dbe5e7e7b85771bfaa97fb96c24d4e58498f03e94a4565ea95f432bff61dae54d5ab266954d891bee68f1d8c03298b1669b1d562b32e651569711c27b7e86012e6fbfee8122475822485c138f8c52efdb4c97db5266345b73d6759fef939e75a1433903858b05d9fcc02110d248cef007af8db1332ac458e759ebff342f0733bc39872ac493e632dc2b697b786df53542dd3244f0f6912ab494de0e813bb78bebf18fbad92304bc8520746abd886c7b9f3969202b2ecb03dfff63fae0ce8b99d9f76936971755b25613aa5488b355f2362b9254d4a81d534c975a8dc4ed6d9745dcd89717460c82e0cd912830974b0d01d3b98e763b7dfe37907c7fac5783eee6cba9aae9bc27642ba52fdc0aaaaab8b3b6e546cac6dc84aa6c5de82a092d8c13dd5282fc651cf902e68b08ca89b8b3b8e2ecf6e4e2e14a706c03096356d428aadcd665c23a34db054422000c35a0677865e328b326842150ab519c3589bd5d98575362628d4108b6a1257d3c538af3912a6fde3ea67811f773ea7c9581bb7abf10abd6a155caa1176353dea5f79c245e886089d0d16578a8aaa61079b77f4990aa370bb093cea31bc0f4a3589beac60a196b04b37928af28d9b56d01765d55814b69a63b30404b6c9245bc2a486db386e0b733488cba1e18e358707fe9904cbe0cded7649617bc653334d6a1180afc032b1e3cc6d256da6a5b1857d62176de6a556f9280d2ef5135c78fbc438a88a5dfa29cb47fd0497e815dc8f2d5b2a0a892b387519475d42baf4d7a036d11325617aac28ed8bf17c45a5f8a8e58b498cca341fd8efc8f7eaaf2561b8eebd6fc9edff60639dcfb3f359e0c79d1ef05bf21d91a3fe2f1cbf24b759f273a5dcb1b268c883efd8c134b083c9968fe364ec0cdcd68953084baee0514f16d722e7a8388cfa058635a93a61598d6da7315459cd9941a24ac958eec79a03ce703d03307dd530ee265f4da2ac16c39024aa8414bb49344555b408bbd025b7b910a77a41b654148f9408e336c3a4d8d2c495b22a8ac5a10a4a37eba234697660c8127dc951bf1dc36e4c6e3be96ab62e1676b0163b09f3852cd51605a3ce30a92c1b577edc06f311acb23a586575300e941526cac2edb1935d8e6b15f7630fe1b419485371daac51614761674e8b4f5ac46991e74c79c9c6d7f8715bf9d18ade53a91ebda8e420d6d8b6156b43e10c62b7f7d856598b1da2f7a844cdf357492e15cd000000000073140020200c0a0644e241a95c16d4e20714800c809e4c6e5c1d49b32488619032c618640c21800010100118289859250060ee32c856da863d5f561dbde373353f2146e8c4974213df572fadd0a3ea9d9f75d40d2fe38a94e9a79201f93c3e258e898902c3c95c96116dba9a7fb8e65298b641677c7fd6d2d1d0899e0aa6dcee10c020b76446681b5850453afe37b478964744e5cb2cb3100cc75ac6abca6068336f680732b081b1326a61371ef0587f5d088e01a79ee30f81247f86676f04eb3fe189d09cb8c555ad71f0b00c2df8c23f0cb40b14c38616f2c096b0cb64ad06e32d01217b295b03e701d54b66b7c9c6167920fd6a0853af5bcc4c51b0ebf7ab870ad0e8d2bdb8f53df15582ad90c8efa31a08dc7548ce1faefdec55c67ca9bab28287b4ffc8201da83c9d8e6d52a6bea508a77447a19a871ef49b3728bf5e1826804eeb3aca2d9829316e908abf801a6e8d64bff30af99ff6f960840058593d0a8f1085f4de94ce212892be8d8e6b526d14ae8179263e33ed740dcccc927490d3f436ad751ac8a2d70325b29717d66cbee6a729b90b2e04c41599a8b7a36414392af43ab5b5671456d806d47e1dd2a5744ecfad06802a555543a9f7f9476bb975f922bf6d759bc62aa3fde6f00e992f55f7839cc8e5a3621ba63aa56ef0ee4be106865d126146fbd44d3c9ec6b95db7bc0e26f69b298960d854db8abcdde4a3a1464803a7f85623c2e09a2266ac8ba3435d364c0ed45d4cc6838abf3d81d9d3be7be8c5a7a761f323d66846f4f9d820344cd71a24379c2aa08cf4a278c54d317fa7edae9eaabbd3497b9baf347f36c59bc1a2007f5092b77106238f3b7f76338246724afc3c3e7ab8c5ca30e4dc115392217ac235b498ae24845b162350dbd93c5b0040c532b14ddb5ec7b711849c4159b578edf4a4eaaf3416bc6cc03a9c3a8bd61ea96f3561cd89e8bdc5c1614c9c1bf7b47aaaf2124f8eb6cbaf7896ee0a0d49c500bdf8b5ce52f175a62a37731a2f5e18bd4689d8339e05c0e4e81aaf9a6b2305a0b243fa1edd15e1a0179ce5db03541c3bbe4a55f001b2471ef768846018201dd37a94c9631691dd239d0c98c8c8936201a180360aaa2b47c31899eef5db5d9ec645769cfca210048e293f113c32112f7c0942a3dd25c36df833bfa761c4e664588a67ff6c704df5d1244bd7250fbb613eff831d75584585b94f31250166c61d32014e89a6862e43ddad4225ee124236ff7edff0b877f0c7f1962db1d4921e697c3926230eb0f3d53ce1bc691fb4a4f768c1c30e14a162649254d85a0d5ccec64fc2238be906592933a20e34e7ee4052583cd0d62a2c421b6bf15129a2ca5d27ca2c3aae33473b68b6abb5d0076f3a9a128f25fd3861ac16b689152c0cd46bd32dc29d902b349284af11183e1b0a93cd27ee5184558ae3d9aeb6ce242f88b0c02dcaf0e64c5ea33fe1ad72e1a77035a85cadf52a5faace5015931dc0f3737ea88cf30d374e16ca0f23e119e9af8d30db29f54a18f43d51f1c943ebb60792c78e8c254b2ae21eb3548f18ed4a7114e6dd393134774614301848c3cc64513952db3310c5ec5016330183459729b8f4d76c4a4dabde8a9d664455e4cac86859b6ad34bec4a124ae744a20a7713ba161d7c1a0ba6cd790f1caacb83c1c3c53c9622e4961e104cf982a14c734a9a6ba91943b23155216745331b2f832c6203692f66a1a002a5cbb23e65ec20b045bd0a78071777f0f1edb3da11debd3a4ed4458bb3071641db6e427a2622c080777ef1a833b7d4a0c48dbe809d610f1527a56c5c9ec14b6c0b87d2cee4896a765bdce8b95017470def73a673df49cea4b9680bc150213370dd3891c90f1accd55115169d751b98377eb08bb216b739d5b925e75b278b63cc17a348b3a94242a868d26ad09c8c326c19b0f424052e48c2e5519c4a05e53d42b4b1f5ed0b5371258889d608cec56aad25f144cd5df930b6911aa1230be4144c14086ec7639daf844125b0a02b46f1f9e3176c3fa40a41eca32cef6002d83847d1c99d689292767e0b39ad5b5a4b80af013281132ef0f25df31c1b104c643734de641f6f855ebd44493a80f611dc9897e20051a3165244e9609b09ecec20723967d0c06013882027668fc21f86102c8fa2e8111f6aafc809a7e3e5715fd856f5730568592c9a6fd013bfec2a7cebc10c8a3bcb39f0ce968d9c878e7316b3b62f5daca08ad7d58b473d809d4e13729e72601a8a078745a0361605dce4d277824335787c68adab1e068bd82d2a9f5a76d30cea4f2e238a29362e20829e69a0a7fc6e8c813581360171abf8cd10d1a47c6a0ad17bc1ca0f0258eddc5c2b9237cf217a04c5b58e61f64a7490aa248f984d9bd20af3c9d4baaa1ddf2f7573f8d47e36cdfa4ad73fb7ccd469936e4861ba44bcf7b64a8ee28af27fd417c7f6c5bcf9f8f7b4d863a793dfab414ef4d76544d49dc9ec53bca4a0517aae120aa98757a455d2a66cbeeb033cfcc4bdeed2c69b470484bd1c18c4d0581c10e3e54314407596e145758026d2ef19ca2b8fdf491f3f2a72dbb976d0a4f23d8c9d491e059039a89b33f3ef81c716773f2cd2894031034dbcdcdd292d3677378ecbe23023cf34affe0c282a02727fc352b1c96047058075a49a4c3bbdd3807d5e70d250253c7c42205cbe3224728d13ba76d4a74d1a5132706f16de07d0a69339d03a11352a5ffcf74cab15da3876710c9b1e4ce9ab11186d9e06b827367a3d1d9efbe9ad743e465746e540590e755920117392d1a6124f02afb864896ee6eea8ad3b54becef1df86ade7bfd7fc719a3d145d619b9ad114dc3334a0bf5d63b866881bb7c75085382019416bd2d86b53512d2727c08279de4e1f27d3b56da5ca2ec91f796d284f6014adc635096a334f426ad34d69eda15f1f991aef84279aea1ea50ea21fce95c2fcd903c37df5ac15c4305baf6de5bdd69ddcb72a65f2516efc7595fee603bbc60b11ce8a8203872b47282c2df00e55ae6a881598d852cca9593e3a197bf4ce97a501e0df89ac572dda1615bce63e61529e5825cae983c90cc719771184565434593564489425970b05398cadee275507da078ad2cef60eb25a59dedc18d3af2ab12f5761bff1a708b70e7b6a8d33dc24d140b750ae234f7e841cf9f8433906e7779bb89c4b37a197413ed87770aac0db77fe70b56467c99c2f0dbdecb07755ea6480a49b23ba8c36d94e8ac3486a10dc228090515c967e7e42deeecd53cf86e1b0172c4379f5372bcd607cd031473c26d148e08106c0bd028fbc1df602302844a40e968d9397291dc9acf701d8ca6ee9bde1d8d348ae3291aaff8863f74fa74121cf357a82f436f8795ca23876862a283d3649f4c9337fc664b24aee63d3f0dd0a871b913138f011780470da8db0312f7101e3a00a8f9960bf496aca62e690c03f0e77e0f87d28a26cc13a2dd629af0a35966a467c386ccc169ebe9347cc9010f788222fac05c07b9aa28245ac304a2c417b561f91b1c640294fe23c8d3de434bc5a26f995a2e441c40414ae7750067fa21eb9b9548573e3851e7b36e20ea26c0db4e0c9596c7f1e0ebacc092513495a12a353c9fea004521d6beca6da76c1980a37173b43d5243467b2e2e5c3c7f728b0a4073223439c472b8d03c95b865b0337ffa43862e798d8ee2da29c8c312efd193bca9419beeacfd44b7cf529ca7218bf84a0456b1a1da4b923bdfefcec102bd446af6754a5194b9214cdcd769c01085d6754a89f7b81327f5cc0b015132bf01021d1e1a3f785a3200accce51ba08232c1f6b8f423ad42fd21813475ae56e2b91e25d208930e568125dd8894c7c35d5855a0005531ad79e420fe71175205b85af417e17c67069c9c5f1933c822e3034d6816a37db5f637251438bc61874112f1b313c969a1437c8b8c7d2569def8e2d0f701b6965bb57a8fee3a4a7a908fb2adb80818562fd6f5cb27ea319fce15fe9e00348e228e12b22fe59da24e61e8cd47997cb857e36d613d6edd89932a0b2a511d6aaf4a3cb749871a8bc5cfcdf471c0036b1b8aea7288b5e2d86505c30337c4fedd8ff61bd6ecc36b780afb2205f3e764e93ca33b7ffb8caee4cdde7b096bd48b47af2c16d3dabd41820a63fa4592995cafa810dd5faf3c4ceb42aabe6c2e86a5b126aaca8a3d8ff3db8cd0c8f4e53af4c55e4d1fd65cb9f67dc33f88102d3fcea6d7d076222666489ac0574dcc46f70b32c9ce22bf4a7131e8315e3ff1b2f6c2ee0e8ee27d563eaee5f92aab92092038c7b05f9770207c00d8179d03280427ff3ca69f9df15727181ea0fa81e497e3b785ac3131e030cbca748b09f6882bad2db2cf1243e2f60dba8190efda70c5e2cc1356769fcc3332af93577abfe1d95045003387c711e23b147c8fb984d80abe3e0edd6dafa08dcd99301b5b12ba444026332cd1f27793e4f5b316995a68dd1db3590fa749c1d1636ca80bb0cea50d534c7c2da694a210826db0f748f6abd807bb4bd08bcef400a388a67b52b0960b5caf9d6cc26344ba0aba7e71a29535715c425b2d7b6f84fef710b2b97dc9c9ba4e48f5d982f2e265a0bf029038cef413dffc7abd0d3ec895b172970cdea534d8573683b75d5b631e83f58465632d9b522322ecdee848406d2d3f70a091dc8ed41f322eb86c4239040f893ef5648bc32f624d4165b36009738871a7de66d1e6883687576057ec6d93b8d6d876883406c8de220eb1b7d5d83a1c41dbba68de72eea8debe2c387645fb31d58b618b85b68a21ecac4f007441cb7763dd9190342a42cf822cb2ca71782dab88a21515ad89c7baab79898188568dd7c8ab1187bd28d8622ed6978cdc27c50a0d1844ba98fbf5e6760d84aac04e765db084ee9cf05a48719ba1e6206279ebb2c71c3a6486ce0a9ab2dd842ea6e3580726b7a5ef1c268a06d698a6ae0109c254bc67b3624fa6d58da0016564bb13367b79e169a443ba62e8bde19733479938e9a9e4f40c549c0cdc3c0b34472e89876ecadb8042d9e353040160d4a06b39ba76b2e98a47815e21db0ed71b8ab4e88e8c68bcb3834b7c5d2238a72f5d9e54f1745e9dec8dee6024ea2ec928dd41eb726850339df1cf99ea98f0f863acc95e75f26269496e9f72a32af29b0831ff4463c21a152839197cfcd274a65c47cf86a9a24b81edc57566c2ad0970d39c146c5d1529c278525e62480f38a24af4e6c0f921a78e8f9201b3f65d4d80bbc68e4c08572ae15f560ba1557a5b5a2119ed99e01ef624e266ee54574e20a100a360909571f78fe07d98111019c3c5ad6d8f8716b6ffc44004bd8e670305e1aac3d261314d73bdf16a2d90b1cc73c3f3edefefb7186427429b647f09b929c1923ccad057301a081c7169bda35c27968962ccb3093e183a11e649b15e9f4de556a16d483d4539f33998b96450f88424464f8f28d1a7acddbc0cb697e9d818ed06dcba2e7efd73cefb2cd6ef365245f4c69ffa6859afc48adcf0aceb50560ecb0344a600b00aedb102cd1f90955c4a262107dd334e762dc61e3f2b52afcdd44eea3f6c4faf8d46bff56e64d5b8568698aab7c008e9b5bf6d233df2d4a4e9e858d2c22c222f895d39d78d82b07d57293ffaeb4670894df13b091d81fd774ad4648a711aad4db0213a6d73c61b32d159b22e92268df50066ef2e027dbf14194a9604984ca56da4df355e0c3c8888bb261127e99c94ba05ee7b858b9f0a6a65c87f610e228a49cf61d057c1052cef1b9b9ae5b3ae2ba75cbf0972ce20838cb4bf623e470f941f01d282ce088bf23d28d464e38fd2a0b3d4031d1b7bea3ff2696143f1166e50024a4255330e2de957466249ac56882c401ddbbf74ad9afa18ec1788c182034a467a9bffd901a780913ea80dce8f2b209591b9abe5b048a4071b4f4124bae55d921d1c4e6f1148008f8b8bfb58f0be5f5bd50531b99259f77aabcf380fc962d212d59ad5335bd1a6f4b078078fb6151eba1d56cfb13795db966a939494ceb7ad30f0aafa8032480e4b0973833b82fa9e7732f3d6c63b49ddb5844c29ca42800ad089cb0f1b3c31d0a93135f181d26962ce6c56864c3df64c468a24f91e38b6fa263e710c975cdc9977231f27bbb1cbef141d7b3e73daf4426ea2e6e6bd8c5af42165bd7ca3584ff208504dca4a4c203e8850545b62510cba86941fda0e305553326772655f817658be2c90972f40f4ddde6d046242bd54eb154a34c6b6a9580dea88d5603829d20567101471d59c6f58ea88172a9d2b859c046794cea94d827706e1bf673384f3ade03b713978778be241a082ca81501c16c3cf4498333caf3c8d77e57c5c092fc4a7d8ce856d8c212190e2b8b68564a87dce8698cd56b571797aa64c4afd20397a8814c238f634de6f82c99e1fa433296571bba2ec67d18e15457bea93fce3a54840cd23d5be0b241e7292c55f41409a89e3057f22f563066ab4f4aee31f3f985412de83f824c96a30236cc8187d01109c3cd33ab2e18244424784c58612791f9dfcbe63066a8914fd9c0af26119168e9a98c4f570831e63e6fdc5c7758ee7aed6744883570efd4ad64103c6328a69508bb58c75416757601efaa505ca659963e720bf2f26badd76412cd3383ad0f7818aa3aed89ab635927bd846395052161b63d9012c8f263998a3f22196cdd145d41325e7ecf1b50d400c4769985cd4cac760b4da53b91d2828089352aa5d4ae9a051afceb9bb8c22af081a65d6c4d885aa2975ceac6b728d6b37dde4cbfeb6320d96e98cb97c1cc9832615d3c61ab0d8cabc1651af8b7907144bb9b6dba7b962c647bceebb07597eacffd1303208556d34613d67ad084de06578801afae435ee804d2d966a6c2d55a6256ae1ca59d9cfc2a431cf3ddc4aa079d282ec6dc98cd77d3e044cd2b2bb78b42706d36f4cc066f17b4d13a86a2e6de6534392fd80161f4f577dcc87f23f0ff69d291a4c0f8e5f56f965e31c1d1841cf1ba750a30ed1274e7913722e0ce8730ecd0a9d3f71c0b45c9907f35dad99532027642e5ebf7313a9c43cd3768f56518bd46df64d567e82c34374900e9f74d0b33ea5843f409a133aa899f5a6ce4074f94e7d9dd0534e21cdd338029a519d9410de71286670059ed82039e138028609c00dfc363933754befdf9e5057396d5a2b5a2e515ffc61ac25c94488398a6d121f7dcd181584dddd5aef16843383520a8e920e4b75019131959184b195215d31d8a5ce53bd4da2756d086cc7e81ae341266e481d9827edb8cfd2f6f6248bf745ca17c3db2dcdeff1089b50a8ea062745b81494c454595c6fa8c030e304fcd48974247661cb6a9b869d8d6aca92681d959a229bbdebe91a331a2fe7917d64f72dc55950b9f5e6055805e31f85ea6b4ed8cb102617b564a0ac3127ac60a76bb681270128a1a0ec5030717c750167ce83173dacd3e3da27501837cc2730c320bff75cb6a6d6174f29fbac92df9d61a14de6791754345b49398cedb46c9fce9c90877a03c4f3baa6495286e4651b2c3c82fb2eb224b8ed4883598e15b512c92d9312d74ffe169c0760b1417b8b6a7b847381c751ce5a10183ea5e92ab3bdcff355058c35fc2b86973874051d875e1435111db723c03a42c79798467b0973902bc0c86a697e0584bad0f420fa2ac8a37613af0d0fc29bd9689e6d5e82dd3c828d1f7b9b5e1dd42c390fb89c722a114a919aee18a235c492e6d98a4e681fc40dd50fd646b9c63c9cc80ad696bef2148d58ade69a71e23548c7fa262b140180d81a3c38b52f65a846ff2da3d74498f51771f932b5dae908b1710c0f271714399a142716e603d5eeb7e9da5340b42e1628b730cc36317f36044d609b8a7ce8a91a254351323dd5d7b83a451e45370645a6e241607b51a87277662d467940e18029a5c9e06bbf4cf8189373c0c0446d85b2caba01493969e49f568fd887fce130991baed3203d94150b997f9299accded5168fb42e3feaaf4d381e77895b798526380a675f3006de16838d368fa42c3e8105e8bbe4a85de188c5ea7a00b9d1b127e077f78fec713c1c23b2824ca9d28f61955765180858c33d3e410d6bde54bde6979cbfb0fd0ba2936865da9f22d18141695d384b78c5b1900351ec4482c8cc1bdbdb72d8c27b885107b6f814e18b933eced00adb2303b7d11a67b4ae59894bce79a1fd6d44fab7eb417b45783ffdb8a3067132466c4cc4b3807df55515b291f36952b709845a877a31ee8eba127a6f658d8c1cd1cf081e93034f04c6badde75d816c905f03d71533a94de0e6eb8451e8f5896fcff7944d92b398b90b392b229265e82402305e4b8acbd78f24cbf53ca3c5946397f8d58be956d7b90f49dc6a3b11f208ca5f73e43c5ccd382a4a1104a52847f32f4b6b98b8fde5ee40bf563a60c0533ef669ae9a7264c65bff4793800a500d9a841fb10c2cb24673bdade9c28148d43b61b59336b60b81b550b820d22eab9a932637795199d2f41d8982a65fdcc98acb902c8da955c9089cccedd8001b5e42430d37cf0ff5efd2b117a799a394b81106a75ed295f073552bac57c5bef788e13180a725394559136092bba47947c1c3d5429c184ff7aee1eb18d8556ff748453c060a4f7992188674068cfa051fa877ad33d2a9dc9785ce83a9339d4985640d826ad32078832e7d02aa0adc045f52859929b20f964176a74ae00e50733e214a4057bf1bfc50ceea1c00a5762c2ff890d1d6dac90652e488384a3770bb989c526a5d4c242c1b7b33f47ec950cd3cd991e5508ed02b9be0b04c335c2635a4d412f186325bf493cd18dce5809ae0cdc7464d6387c9c9f0eb704bf51ad4a253815a57299b4f8e0c7bb275a1f4c3a76e8b6540170d797f702b8daf38c486880375945bff0cc104488a9e625962ebc2fcba6e732b09887ecf62047c7466aac241da2f70217c6ab5249fbb7437a1501efe8dfa9d238eb5a50d000a79cf86b9d0c7c6059b3b0ee4db2d05b9ce44d2a36890155c75fb322465e6d15520d44a18524e9329663de0b3be87a8104a47c686ba655912c9adc7ec8515de094758ef566d3333d108292a53052317eca5c2d0230a45219c95a7a75d155e3d4f6cbf013b3a69e78387f7b90ce375836bbbee0e00b761fd3f98e19d683c8118910e22ea06900b1870431d17dacd54d2ee7a8a7823fc96d66bd00d8dee704d8b66afed8154eb8647def347a46a8b6ab00522431ec84e47eac4d4921440d26d602b7ba49553a2a98378a4d890fdb2a42cc6ff82b587ceb659a51993f78124994822881e0a00574a24807c009067220af9533ba1547728a3b07536aaa2732802924938324cb9c3fe0ef3f4fc79832b442fbc1b9556877dff4f0c0ff250d3d14ea2a9d7096db9086c00bc51b70080997094ee410f23edc601f42144ca73172ce29b1ff657bb14a9a1da3ef4538adad59c087eaf512a60b581ea0b5ebd8ab4db25952e6663368083e9afbb3ae0fc29b297a1e84477451f39f728d42cfdd9fe3941fa963ec9c76d481ad289ee41551f77338c91d0995be44941e0f48f2fa48f252380bce111db40f4566a7d2900b2c26873bf93d6f9c6f96e42216cca4e6c40314891caa54053f9b174d4d60d851ec835486d9620ad8c2ef78f7b9f16ae292d190ab9b05ba2a9fc35a2b17dbace6585d3a3e81ff6d08c98cadd42c34605f8d0c0848faa71af3ff1024d6f6c5ff5fd70c41c377deffa76982576ac3151541ccd1be8c7106b77b8187d0466c312500bcabc1ededabd92576e2ba2708070a6c94fbdf0e88988894de79973c123f69b35a6a91dd6854f50471479162de34e5711b698639b43e0a783085f10de7b8b3269951960d9b62463d6fc18cc42a172450898a0032d7e1de9c25d92ccc08054fcf49b2c3887a5e1dad0ea1de57bf9aa88b2741e0278b73c0005780b74117c34fc2821de75b66439cfad2447dd824716a302667665e08e237fda7dc16491045fd32f37fdf3a0ad27b747727f8dee2eb130c0101f5f2b5aaea18c42e2b4b2dda94b6120821128245521f511a68b06744a64d6d973d4f2dbd69f21dd364bc890d11f009d97101273f773f1d157b1582430d631ef0015e6066968e8c1eb30a90e03438124695b64ec5e4dd259b20af03080f1b6b82c38563e1f0302ce0dc94332ad4f040919d74e2622f85d898db3bd16e22fdefa924fbf1d2bdbf3cb755506d0b172869bc7c831ad1b89bd512e59a23118202890bedd0925511976d4cf635f10b64e15592adbb10316e1101318cce7d9475522c53efcb557a7f8aab27c19318e1df624c332f4d9acc684516d92bee8a38e034ad0ac41ff84c597015938d47febf2245a013e1f77c41b47a9e320ff10600c23c66f346a0ff38910c0d8988f9d2086fa0b586be2d323c08ba3d90ddeefe8b6d90791825f3aa56b804a18ea7fca82de958c61ceaa61afda38348c55c501c6acb44697cfefa8d5acdca6571a8844e3bc1c9f694922ca23a7e004e4b60e897ab35718419b44f521dcfefe247e6f10bd6383454d4cf64fb95d548b828e483b82892c38c9c12039689fbe3699cbb0c545ce90d62ab792c7d16c258b893fce3b86e1fe3edaa41fe8338ef63aaa13f7263c8c8f44c440b9554f41046462c7cc488c99773dd6bb1974c8d46c64c29387b960cf07ad022dcb2b66b32ade9a3a87837d3c3b6515efb9af1698000715c03b87be8c05fc2ca6b68b02808497868ddd491e1bb4e39e4bdb7ad65710aafc167d7b5d8b4ff3a0ec9de80d656cf5fa9c27fc22f2dea93a08fd786ec50d6709137d15e46eb312338e8fbf180a901d4f86727c5ea7890f8ecc632bf95af7553bd4c097d0026fb283a531bc1b3d0c7bf8d31c2f6d62d9f16fb88d8fbd17985e68b67e753fcc42793ad3a89fb0b8fef6a4a6fbd000358b501e62c4edfc04efac512fd153f8ff06b344139b6e003d9d06f5de52ea7325631568a21634880f2fa150d0d2810cd316d836fe6ba8a323895bd788f1370efe3062c6a4d4631dd5b50303002595db7bab8a90633f8155547ad0012289a4733208bcd0342b9291dc81d11e53cd3a232433b8215c7dfe3f9ac533f284325ee13a3cc0caceb25f1c033046c93967696232ef9adbc81fc5ebfd5c1a9d13c5cadb57ab430e7da248066de804373a7e1d9a448d8821d39e9b6d237487b83e336e40d6d74159282c1676dd096f762cf1eadfd8cc4adb8778ac7edf68b9b0f2c606daebd3cac82bf8a635d4daa968ef9e0612a36697f33e01642e0bd843d489dd791b62d252cb7be04b0efb9265b565d172533fa9200cea6e20022810de1e2c51455094d5d1e1b6563630be0735f4dfbad82b677c066a36c073a74305001314ad8478261c6d6b088a86fc93cc683eb7bba9447af076abde590f9dc707de803b4b7fedf89b13fa86f0e5b26777dae955ea13937fc7e44585a94ca8b17b4ffc8cd2e185669407c95b6b5ab41c60d1aeaffee86914d521c78d1c3678412926d5c92fd0211081e72355d3aebdd7b70d2f98a1bac383cb9c28316154e11184f5f46149fe1c1978d9f63f2fc3c85cf4117bb016660889fad71542a5c8750eae01d7d9c8f4112ea049d778847f0a0aeef79e887f1f6fc80f778f84805078206783e38ef47a38985e02e09bd2c9f1a0edd4e369db0289ae9c1631f1e980f08b8e9c78dbf3e600ef6e80b026e815d08e42754f1602fd1c7a12ca14046a0bce7724d324bc0c6d46e818abfdbb680a327a046f6ed5234c1f406ed9fcea4690e3a4bb2c926c5f00fc818bb9cd3992f5a539967c976ae3e01077f6d6d318c841eaf1ce98577655dbd29cb516f08f24475b3dd9cf72519d41113ce296ba3791ef77072ed4a55571db30c6185a83e9dba4c34749d737f728482b86bdbcd4a5c53d8c6fcd07eb033bf952a24637a185fdc0cb5073b31b56e1322e8b54aac11f973c947555d4143ca97bdd9970d2fc03378aff04a9832d0529880afa13d198ca17af3317f3eac0695b48b1e9aca7b5b30287d90c53429dfbef2e9866523073af009101f0ec37e1b0da2b8cfeb3a75ed29ce0495f4d9523e152571f2820103eace9f34e0a6a18c4dc0571ba1e0c6bc81438c4f346c11e27c3a064cf49259020b6b0e497d2aebe23690b57f969e34dc95561e35c7959be3ab9b401c85380bb334b7b2a21b7fd77dfcede63ca90c7c3449360cc78d8930f47e91feaab51a18725c83921016c02a43a3d843b9ec101ccaca606da84eafd4ae8568a3bfe1bd340e63ab197c9b2cac0e351c5ff0365804076533a5542e62abc2cbaf427d63590c1fe93ff81236d48bedafe24b98e818b6fdb7b66baac18df7a82a88c16c5f26760bc33650420c1dcfa93c4d0c5b11f0c84d454284a2e1f0910855d3f945d6b7e25420846ab70189566cb3cd5585cc23e985a22e91787d2a295aee791704df4f16f98c18d6ba90f818ffbb481b80e4bbe736346a026fc5982a22afeb89ae75869b0f389ae0ce606d97d1f516bfb1b042a970a448b3b33f3dde6363795f7d94fb8f0828d44b764ea5d3462a012a08c3b97e57ba5e1cd2ea51c3b254e3a03aeb0649bb347d072a4d32c6bc3343dfe082e0cf50459aa334d1d148e3fd9508984335607e29f37305257248a599ca1a0a248d55d6b40d1ed67b000ba0d999ae57fa47581c08a087a291a250924f52cce27f8a1915a50ea40a5133ccfcb5d00ed5523c44f26509459f51c5a88672566e8629667063ce7a0a8d649a33fd3406bf9a843ee8d77f61e660b0e80f98bf688f102c3d15b47e0fb93b31107019ae41942bd453763129239c59bd61ca38b65754f77dc8ee31daf48aa60f915bee18f1d108a2a0803114aaa977d14e1fa59ac0f9b7aba4a1e4c61af3493ea2b4cf31937a02178702ba2bedb86e64e0a6842895cca8e6f9367c71a1874ff2f315aef612da6fcd0bbae2a89b76c5aa3afd76a62ce6e441a996790969953d1ffee1b666459d80c0f139d1605758e346a7acf013a3915aaca3649623aa7750ab0c5f0be4ecf8b52fa56f630c8795027646cf4dd27e93a09caf4f113a8746d9fd996cb751cd1c90fd486adf3b926b0bbeda845a3f6644b9170c54ab288d1d6db3bb0383e6de2ea1eb1727b786300db869e69db05999b286d0d2a742c6526a40e3f9c90220d2b68332ab99d1d7cb2e63b505fa6e00eaffc129d87a44887a83db6806910442f9b810c60b8e4168595ac9cc0fb47810922f3d7e3006f6c1cf29fefdd90d51b807114d02b29c1556f32839610dac92cacb2c693a62bf47ceab91dc5489c423c9c85b9425d84076150941692b992b70ac45a8ba74a8eec119989185037685c063cab4f20c82eadbfb57ff1cf6cd1d86a87ce9158405615acc7d6b04932b520cf1da29e7a8f53c9341a1717a312066a522932e07576439b03a210f5a8b1fe5c0a60e35b85c38200879a33be03a49dcea17cb734e0d6674ad7dd035e8728c78345541cf09034075675a0a687eff89d77bffd6ba38b5f63c51da062601bfc1659c21c14619dce6ee2e032ee7e78a96403494956abf0f589d2d3e6c6f573b2594d15e431b79b7f85b2f4cacfe1cafe284030e384887e03a7e275142a4e104db229c4cc99d44c10401d4230549143320e30957ce9a7711933d655ce99c206b9a8c2b782071b02cfe465582b8ae8285d8d5b2d706ff29c8a83674e3e9e6008bdc5c988b3b68c2d448b808a163d9e230672f9a01f9cd7fded254e1f345286db11f35fc821bfab91e49631f74079fd021ecd7c09fe3dc43b2f32cc1915fcd238f68e52b8d28a56461714984d9c1507f147e5e5360f16d532a9cf57cea12d565f52e951cd8fe45f5292759e436e5c17e810a3daf4cb24ea6cf2b51db633116e67d20e91c02d651180eb83afcfa73a0de99a94267eefea275345a9dba86e9a9cfae31b83b06e9a87cebe99c27ff064e1cb592ce8d26c85307152f3b312e503116d84fdad44084b7af7d84bd77962110ee4293662aa067a209d3fa6f5e461e77b25ea19185df75f9fe35f1e1fb66f267fe253860b9d2af7a5a8dfaf4fe32af36a70e9701db5b6931e2d279f3622c83fa120e8a9c271ea836db95b9692300c66c5829179c6e4cc77cc5277bc1f9d85942f3c23a35ef9d8c6384d2bb5a74927dc8215de2a3dcda5eda2e68e18e0f70355cf62412e07771499c7b15f440358f4802758c9673d0d78234fffbf5a80cd7a81d2365ef567395ec2f8b44c84e4e8933a7f5750766b4c339b3eca6276e7b3cac2d9182ece19edcdd2b09ac26d0eb82f7150059d89d98d9a02a8d24cedb71be0fba1efa75994d3925b668a57f1f73818f2af45c6a2f0bcc2bbb462914b0159018be921d8d7e2b3ff8f4dde49302dc7c534060f0f2a880dfb5dadace83fceff65d4741e234df5f8d42fb2b868e862c3d5719caf88debb2c29e417baaeda27762fc41a5e2b3c395a279d338c8ff492dbf590437a4b181d81a41077d414c74819c9f852bba37683725cb90107e5f90ca5e6d5fc6cb3847678aac80c2ab8ff0d9853c52364888127c2a8e86bdb29405d6f0ae3c6a1794cf040b34e07beab878fc0d221f53e697168b64f22b7967cea874a9ab26b9bd05f41a320c858d9e58783e8c4a7b9a78c44c942d0d97ee6c8007279c912ae403b30a6f0ecd21f927000f64085c37aa8c0afa7b1b3ac8deea4529c28ac68b25c938fa097402eea4a96d5d3cbb2dcf2bcb9ebaab83900e0b394ff1a2db67174a582a47a8bbf0848e99bd56012d9f84099aa67e113493ce33b83d2a8c8f5b76f1d9c2c59273b0dfb691603a2a804060b915af97b1e1f8bc7cba72b3bd70104d120f650d17d2ef32bd74c06208bb1881a98b0620b140ab409569214bd578d24eef1fdbfd3cac566dc4d3c5c713789b8ca2c24b944af86a9cc1a8592e613404409450ff32a83af6170a7f26203b140e04b3e4abcea92827b130416338680f4c2c41460c81ee3a56c7dc7178c043e44c034355c48bc19e88ca170ac3a2bffe3a7d076b112a8279538e00ae75f9670d0a8f4b69d398cfe3097a699948c470509fb5bc8a5eb041879ccc718dc4398728598f6d23e75ac950d6ca40777a4fd47052822860351f15aea7f39671ac0eb09555f4349f7df10b406e1df7ebe2830a5f242fafa42aa8b1451cb7cb1dbbac261a1ce44a392aed4e10fcdb4e860028215fd342ca79f72c9c2c4074c787732f3c97108d3dea8290d914dfbb14de122f75c8f8d8b855fd7de51767d1e73f278510f8e17ac9d76b50754a7530a1cfc82c0e5aabcfb44e1282c10cc89801eaf357f9c97b1576b91b218c209e980b4118db6b9f68ab3ab127d7a4c8e14eb81596d314a4da7722b688299d6f2a7309e2cecf0689f6484faec5a21a1a84e68656a26cc099526baffbd83597f84e6adb66c7dabc838f2902849c2ef3aa8a5550700b644b7725005bdc74a0a6060c5020c1df58a07b300c138262af9987d5d7268b3233d92571341f2ca96fe4baaff3b17d17ff3e23cf6ad70a9a54d141b31b2df54dc848d19638265da4ebc4752e28c84a41275d8a5a2ee3018847c9a88b5919ea5c09f512088c488dcea6cbbcfe192c04d61491daacb245177ca8894f5555b302e0230053b5d7dc50f4ba4876dd90ecaa5eb52faf00bc7e96e970e39230b8c3f9a65ef21008b3e64c977aa438754cb705b84447fbdfbf1eefa89bb3057ead53a8abdd54008e7f390aa371d877e29b668ff50dc115ead64b7f7da803556f8cab2a2570f9f73700e38aefb8ca6886e0dfe59ba31021043824d4f97d93e0c8e836b5b6da0437b43a28f6fbcb39dd34377b8ab1e5798996e99ea0496edd0c749c944af0719136c6845b450c79d68060ebe75afb5b7c311e6ae3584a95e7790bec5487f407676fd95609864f00e9ab0f54c0be276a7529cdb3df28fba81ceae7d1a767e3dcea9a3c05d87ed3d7ea0ba2f06cb9c29920df7ce94c4a333e0d15fd1d20b291c5e58d7adeb4ad354648f63fdd149e909f7d5558adf1a4d18d54cf95a0ebc71aa116ccfcc4c9fb2131cdb80b2ff83426a31ec4b82e6792e7c502cd672c1195adaa64532183fd76d6aa45c9642a7b102335319db1544d285967d1f32a96d68516e62957c04f1be8244b830c8f4f976debd707c2a0d36b75ed295eff1f62ed78c2b8e8a9e6a61b46e8ca6f6c4d7b254aa66d075c26ed9ee7310aaae13d82f9ce0e26d103c6de5b2cd67ee66d0361597bdee7a9a3abf4aed43fb913b849ae447de0e28bdd1d8acbeff08e41d11e98430b7d47a56a609356c6a8ad69b42f78c27b57dc6152e907ce846a006c2635d0a1e629f64908863cbcda38af805869d1e23970460790a2bf596e29492bae384cc67a2223d5e3e1b815af04443c9ad3f951d34452f1ab169c89333e80ae7d9405d8faf89f144858b3b2d25e9ea1809921f1f948cc3ed2f25ccf6dabdcb7242daa94a8a334e73639fa335e55080e50ca8f56c98018095b9ea726c8b3bc39adf29e14c0b4af81d70fb4bbbf888920d05a84d7cad1853a6d8f07b9233ba18406b51e8ac2875e11e14006d035c58b99eecd0cb2f6e37165f911fe81246d0fcba45d394b5691bc0b349157a31a6076705b8e978747998676fee8dbf5b951b33cea9550cc0766f515aa05e30c871c4820b6c0beb193bc8948fc748086727811468845b9c464af277145b3a0fea6e75443549287b729a20ddc3ac9235718b5fcef3f04fb1d6ce518a581e8f7cef0715edb5ea18d5c2e91affd224801927ee0f36eb8c748e640ec5e4691c98d9157d99674d1fd12af5fabd9158aa91817fc66075b5437ba5e7a59c22348b1c70f40fd5374abc0115a609e63936936e59eda24ba6e416581060513a1dd25b2dba4ad77e608afd18c1b470a639322c1e36163a66317f5a35fc1855abe6ce08876360a82590ee04e53ee64ecd0843510080df20a519b3a27f599443b5210cdf4ad11fde31c225f8e83a243d7fb2b9cd697ee02786a573ddd96f6ecb29801af8718d407f646cb4d5d886c9918677f6498e7ff3a00708d796410c94f89310ddded41b8ce074a81ab71a1ec04b90c873036440ddf9a579be6dc22c8793350f201b25cb75b7cead4e2af28803f38f7d0e350b088e4eae6a4e451affec0680084915181bae45ac310e86b038cbfc207009bd01ec4c761aafac1b608e30d2c7c7ed1e77fd52410fd5ab73b52a0c5149164a6d79825c34e04d882cd3ca0c43e4a2b07cd049aef947d4c0afa412c1750438009b598ad550f5093cc3d2539315ba93121a02f500918b0b923fbcffde026270ef74e53be04dc6d8721bcf8c5407b0450bd9b0d22a0bb2bf7f2f0545b40f4e38557f75dea24157e86335283f3996abe1b93f8e12b25cf30b28499018051d1fd95157d4bfd0a2186b0e423a0be50b3e64ab890dded129a5a9c14f7d073ec85165eecaf2dbaa020f62d1027863322aeb71cc00af143a60c2f5b830fab70d199efe1424b1dddbf079705182c8f73c1beb6d2e37bd7139aa8310e54e6e2e8b856f5fe517b311223ac51897a20873480769096c140946503c1050f10feb43bbdb0960ab63b6e931d269acd960b660b5d1e3a220298672f26f05e63c04e329e1a9547a5b4ff90a069175bb688083d73422e8224dff06e02d9e718b8f8985b946aa79dea4c02e5a731c56bf5f05017e8bea812f8ca8564197057c0c96cb8540a00a77762a4fafa9b260a0744fa17cb49e06b4840f6fb746c6f814510952abf769497277ef2e7e1673685fca7190dab13846e210270434bb8201829cb8edb2b14cbd3e0c4a31746b6a2bc54b213577d0a93f671e5c0f55071601ce2f2b7d7ad44e26a2a62e077a4cd954a605e38301cb1c88f2b43aead528e4a68f4a3e45bc84d510b879819f86d25d1b6215be3c24da06b8fcd61816ff5dbcfd8613785ff03198d392282e2361b512e9f8106eb22ea588ea14494ee0aa7e85bdf16f2cca9eb60f62a6e22ac3d19cb6630bc31ea5421a73b2e6b7c72ba483d38584e7dd13e360347026a8dbd940cf6aab82227996ceea3096800313f5debb262396172b31b2a23ac171001a5bba04ae5fe66c1e454327240691a2fe35e2072778da37daaa9b140208e1db0d8974b54687383caf7536a19be342244b3f2080d1459f71057b5bb0cfa1a381c10febf81a073ca08ad4df57dcbdd237561e8b667143f2a085c30121ad48746564dd95dfdf5baca3f9ef12f623d91f81fc24f0f17ac3b6ac903ed4fd225767369344b8a3ba834ac5cbe57c6a6164a0122686e5e5f6803eb53b99b49e0d4eda1bbd2897078c6aa2448c8be206e132b90cb25f0baf9e66795e07110c66b48c0f52a763f9a583b3788eae30f1e9fb4e9000b51471518430af46878e484f6c4b3f416f0f87ec8ba231268819b030e76eee55ae58d3b1caa129c2f8b7a3f78c149ed1f050fad9bb8afa2aa9461ead513fd1bf691ce1235fcae3a4c1a09967dd905130e89acdbbec96e8c84d9c02357ec52bcefe4c234288fd13035414717e28fde4c58ca702a3c54846fb00695c570fe99113e30cc7e54cdc7428e43ee1aba7505ab97e54b7313b39fca2346ef41a865a61d2126bbd14442529e9bf020c653102625cc36514241a0817c7fbcc00c11490aa5553362f31ee7bf26efd38d6a390669579bff44326eae4d4d90af487352fa85c31e8c7af5b47e5ce53e10d2daaf3a20d0cd2db2e7b96f4562fa7f270c724a700f55603ee0d8a5474674572453f9493e19f930818629ffa11f387dcd4b4085a3b47a3d5abb9e408e3465b2a9e047c245e8959605300661109a321afcb3e87200d220a4c9abf864d850e7609c11119a481d0b4086a398190c5dac94c9923e60803dd9d809648ec55f3029978c120980f38d4a3e53ee0301a3f88eef31415e5aac81b021fa3b57409246b844b0cfae549dcb72d5b16f28d2344b52ee35d0cec8f3709678b71440bb33db600c2b925ed50e311200f0b6c20c8b6cc3e8f9e22a1ef16e4e3c9b8075500295b684a0c6964a0c37d851e26e8e4f3e1a37debf81186ecfdf7687c38e9f4258eed6028b993e2cf9b158c14387f602c02aa6354b02de422d597c16f5c0157bc29722575808ed7c83c7b2171a7183599e0aa9fdfb9eca7ee83ca977e63e14f7d1417c6761670ffe568d5f3e8028011442be018742dfc07312fd227351cee2315644a80b86fb94b0d1c25b03a6312377a7bf064d036d2e3c320e80b7b1a67507118c5cd050b3383120d7a0c119b491852e36558794e2c2a1019a210fd5ad22b801e0d82637b22dd92fd38c378f9d7abd364e0ed5f9c36ad26ffe616bf38ab030917575327b1c78b7428a0b197283104126fe219f8041814a204a721444b6d3cd769423d358076fc801ed405550a602f2eb114262ae9d0a26ba143879ac361d94bc2001919c3cd59ab525dbd00360495f2bb01cfdd74c7a0634edd4e82a0eb5e81300352dc07d514f1c078066cd639daf605dd08a6951201c1a8129885740fe90d4f21efdba4c3d96205a4b47d555fcbe88348cdc99a6ae015241cf292acb9f54cdc54885ec4a43ace0d3784e4594114410ef946f402cf08bf16e303ddc7c905e335a37a8359389232bae37dae733b37e2284df96949177f87e3ab237ff7164aae8218eca58715c2aa64d67ef8d612ce27f793c2f3023b9cef8326d2bf2169c7cf1d82e1aa636b76cdd679e9431cfb1ee8b1499d3aca3fa87faa3ec9b187245753f1078dd4a82444e261724d949bb34b1e0d928bd1257f2c972d0993d00153ba0846411cf1a910b2a84820dc2d8b998e3ce2f9d9791d0261d4d584e8a4653a78e4a2ae366d03f3f109f6fb86ee2ee12058a4386a227ccae8771d5787a93ea78706de19030251d72241a48d64fa64b2ec6401f0b766c9d7fe4125cd7ab8a5f35a95cfc8bb38793c1a60ac123c7c7682266a66bed81f08e621af9c364ef20fd3e888e7a48998bac4a3a827c4e883eb52a6ae2af047e9f306da6967107512c002a48cab250aeb375487d977128b790185c1b99e7b7ec5ef7de153c2e242838039e6efdc5d962d962055cd187ddf74c36cd22a032029170b161b57488e07028827293e8055c0612f72a3f2c623c6e58ee6068431e4104a6ff336062e3e592f7e226110764712a01d110f53e2de85d856dc5af21e6bbf80f863f5b3c737beeeb80ea8be69cb706063e922ea48e90b8b81a829ef7b767684d32da1a53b3cd918d76fb4eb85eedc53690039810435371a244409f3e47bdcc2252acd67c8ac971bef26038174586e82b4faabf01df433813365924e459e11bc3a35cb088d933109d4d5f1013124581315979ff53a16b4be478090fe10864245b1f6848c84da341350739bb2e79bdfb2dd7a104f0ffd54f21605cb05f28c9f0519f4ac28598839a990f6e3c8e076bbfe976a3053a5575f4764c16e39aaf8428c8aab41f6a004c9a85afd62dc944226af4a9e0b476cfc305420d74e40c81cb2aef03570bceededeacd421bd4a70515459413c3d3369fc5906b880b41e469fda42f0311efb5438424761c4ed2230f6518e6b9df91b31afca05b1ee2c0b7642f5a0d70975b4b962303bf476d9bc75e886267c3ca8c60d20831e85f05f904ca08b93a27a52e09def31f2dcf18f1ac32d2b7640f207d6284073f2e3d4f8d29144bd2292652c3bcc74cc3ca47cc5e4b26535ba0e807fee6e6e844d0ad1d25b010567c2de8401d460e32ae800d568a5ef5c4a04bf3c907d2b578877b11d5f97e157d435f2096e0e5ad69fb4eb272d68559c472540dbbd3ef0f184ce476a182097800709c8ffc6fbb4cb3c7c185507fa18f97da77811e26ed97ff4dcfef995af5eca676ebe4cc7726fad973d468fefa94b4ef459ce3b1433c576e492e00853f8c8f4f0691b2343cdf35540a510334021e7480831b20e1a377c1c2ba7a16bed0fa3ecec51515bbcfa7c1206efab0e5c94a84922eabc892b383b9b52ffb58f2a2025d1eddabd80b086536603e7adfe1dbdcd2ea1dac86d32b18507a573e010b643ee0830879a50836d8f03b8825fcfa0ca4936a30e4dabce21e0402325f0f96bae344f08d8d5cfbb6b29d54d4b67d2b20e745e5a13789c776e205c23b6d2649a43bddf671668a4916e755b9c0d2ec64c42874a9d373d6477e833f19ba701f4570565595eda243da52b1950aa787a97002bc4e0f4990b61838ff01ef86a89406667a5a9bcf9f920543718df9fedf80aae665cc1121220a31ea1cec8e0126abf1134abee13c0b713c859fc1cea1f8723138537a3b740e7a525b278a4b4ff8f7cf55a371e3b0517a58d42b1bc0686ae5ac4643a7d85ec587de7c1c52f1122e57d1aaa71b22194672932a245adf39ab78925a9ca5a2bc274c8d25d06ba5037a29f73cdc5df9fc0530b51018d4fd29e72ee9b5a4e71d587a4be948e19ca1058d3bc1ef771f264b2909ca49045fd3fc0d985330c57c8e898d1192006910536624dd48eebcf295f28289e1e1747fdb2b22ac2e0b797b41698e1256ca7d9eb1a2abc2cab16ea1fc82e00f0e018ac8c8ff2ae4291fa306db6162b067882a8abf929292ef90cf3c1d5df02680b67b5546c7682518b5f82a430723e57110762b3454d885b7d86802850cc532381af2a86f4ef2697a6810c9f13b54a324f32449ed0b22924277bbd9384933df5b9df5051646f678d5546d1cf2f7cdccfb6720a98afe293405d9e77494e4c04645757a009286ea9e1ddf1b49f913d03d89bf0170950b2b137a22f24d59d9c627aad19cf108ffdb749f5cab44a78d71addc455ca7f27a8931d40c268e88e8acd8672693db89e9d9e72a7c220981bf442496d1d3216ff714e68bf79d251e31be1604fe076ef20149e3491c29c183155db4d111902749633fccbde3b451ba950604a4fb38b1924df296e3a7ef597a8806ad79236ff50c73a83e8cfeaae7d7ab74385cc0485df05dc1f17d07af027320df82ff2ef79f53b98f425d4a17a64361b262c2c33ae01321bff8b44a205655a32dca3eace48053e0aa8981e871dcb413747b28cfc740fe16bf65c8ff2ae4484bc2ff3b83ea780328a983be1ee19e83fd9785a641a9719b2205aadab54a44d6da57c4e6cc12a10d0c0438ea0231f7e2d36138aae18ce55e010ed131b912bd62961a81067b12621c7b2762ee3906ab03c8fefbe83da0d6bbb23bad4f67bf7187390937d99bad1ecaa88146ad97308e01ef4708279593342db000ed3ad7cc6bb1080b921645ad9848966423e56c457b08a0f7551ae7a2bf8e058c152e5b2b37dcc6b3b9a63091af4da3c408aee5b19dfdaae3e4920ac3cd253520904059e46fd8cab9ba51b59faea4fe29c6e25165d1a69efd6c4fd41e86070684e8cf9b2bdcda2bcf59de9e7390b9e02c70cdf801f979654bd300c72439f2c0a5c1d1a34b30c4a6691ef209905e9c005db380be2b3cc9764206eef65b0ea46d5011d83f0ecee4e88bd6a750121e63d7230cecb917b4b58693557e079d0a25bf528f30db753bb2b58f2423613e5f9d8c46a5a95e0c836cfadc4b0f16a35ea0490b90a89eeb00c1740a8005e7330155a53037a67f7b0de41377fa6bacbd60ec07c0f955f74a24915159384d4144c460a57a1809fe1661ff54f4675708bc9c04495255d377a6c760b1b1ea176fcaa5574454364885f8320d17a7cff1dec0dca0a37faa2bf642bce9c7d0212a171fcb2db1ea7a023886369f6a25da84639e84c19e7b82b85a01a6dee90ff38c80945a352b0e4ca75119c11418a68eda3f6d0781ebbb6c91a62d1f34139626fa4a0e63124fc546f5d34e62daa191a79304889dd7b3354d145822f606d1031c6fca142d603a5230b99d26bc34afbe98e21c364bcc9c7d39066655af2c44327a81b9ef26cb0a4c659b880a3cbb659e13fa1c8164a3a373681eee040490cb00fd3a1735e56e87bd0d686eac6827d962e558a9c16b28081c12a5352c53d3cdcf5442d4b01faa381a7fd401a7619de65141f0e16750540849a6a13dc3d155a6d2331c94511e0d07ace054d8388f0149c75e628153269a01402c4f34204e4ad337f41c195270bdd086e7774c37f0f2f91cf1400cf0c72de5b37be53134e631c34bad7ae6c377deb58949ede498b6babcaceb751553ad98f4725c8332777a19cbcad47c6c18d2f216259be39871be5a994036f125b2f0eb123fa9ce56c7b665fc028f940eaf5e5a88544f912fb58189fca52ef4b2722a68b0ce88b45fee6441c4a344e98349595166a07cbe29ec8f13c8c831135e704c359a3d307f79ec84061fdee6704f24bbd50cb0aafc1f2f1ea6c7d3edcef10482bbdfaa0ef4eebf659aff6097155559bc7166b39e058687b186bb392484a51ae7dd990d196f96319b7220ca96e28afbcc2925617815fca8aa62970c73eae1ce62d687a2ae303c77b4de4a8ee54695af02f072c5048b49b685acd24835ac02f54017240e6cbb80ec3e1144561ccb095849a9323922a31ab29a41036bf046b98ffd8d6058a040ae49d896cf7436b034de0bdfd013628d026b08ca8fa22ca7041cc8f9e6d931158346db85a39188da08ab3ab50e34cc86eb393d615f0621cc3c45bd01c2d2f620c21c9fa2f2b5ffba63552862ae260cdc2c5e9d420f07ac4efd7b99b53807589db506d3ba770aa46d0430620ac969cbbbf53d1ad52a9f4dbf6c5eabcdcacf659e88298996441f28804110a72792d226930e607a0c161ff6dc13839f18466e51e62faa600fbe5bc192b1a37788f987a640c5816b4c213cdbd8bafadba340a502353cddee611684831f4133f451f764daa58b22272947b80d4d51e1e32b59258dbb13cf95cf890a486d9c8a8eea1b0ffe923b7213ee70d660c4c763bd84df480ef022279d28a4e4f839cb1145fda5b43722138ae98d92fb1b78d4137f99fcca6fd8394743c874b32a5e995752f60bc147e468cd3221c4523fd7e918c68e705ec3764582dddb47b34feca1b767856f51a2c2d0f18a2290a6da796f8ac425cab3d83f9ef78be25207e402a5f608363ae7c3a7fe233d85c88458a16e1553783ff257fa05de590c2407b0aa8e651a5ee8804f67510bc68505253a7a3304a616a52ad5eba641b62a00ccd7cf74ea16805ccf94ea236747bcfae9d00c82215fe90deadfc15f4266d4175ff43e84b25ce834482902d43f5174a79b7325b250cc932051a75d959d6966d186705b240ee05df503e5a1d5549dbd05719236719b24681b95d5a595693fdd6ea3d93cc5b949de511d9621fcb86e67a91db5483edda6d821f1f3c08fc5757a1d75db70c210dea47948ee428857a7db3ae2c3a12e8007f11fc411521dcfc2dd70a5844b8ffe15b4c7a446977eb7c28dea38d37653148c2e4eb9791239bffc51fcc332b6d6c3284795b9f17c24b2672ad4a3c4f806a78379640b9da08bf841e88f3f2888f1d1e8c21fb9df48033bd219c8c9728a2eac73bbc776b2f9c0b4a173f549ecdab40ec1b62f9828273418f3a303ce1d8cf3dd4a9e2659625127c51b8841c526849a5059f2ab69d2e39978b73db2405fc15f7b5cdae128cbc88d8dc641ea737684f8e528709b8a0d29b3c9af8e6aa4bf691e1aec36b6883c245fcb9fc4b1dbef31427ece9fe0544b4b01c8060d16f701079f1a327e7329478dacb6cc79284ad518ec4b2a17a733615cd9247df12895095d1fccdd3c60141173a625265c7e1a49c40a2c3ddb9bdc00831103b4155a52659813c6b9e7f7514efad8c0825ba51809c4792a5a3ef9ae3bd1d735c22467b463666efac594812e132e804898074e676b3b5871ef2656fe79c8a0dd0ae9ba344c791792612ae9f5e7f0769c792cbc15b310ac3457c62c51ac733b84adef0d4e07a7cbcb35ee595d027771679f3ee486768ecc98f59655b9e42add93c5fc878deacdd98618e7eecb93507b761ccaaa4f848de1816b451b2143a3e50bd1ef3600ae231eada2b665b0a50c956329c28bb16a7b9b0cefaa4628c53c0dc00380ac1175271e1beb01af60e42274903dabcab43aec535ce06733899ff211d0637fd0b8ef96cea3c76571b1e4792f5fbf63f4806defc473e906ce325d608c2f0057507d11917d0c65fc6df4738a996b4c33d9d5488ef734c092c3cc06730febd9475af5753b7417643320ebfc2d8d28050db88a5e04a26b0f0908fd9027a87d173711526ab48a9861242d4eabc21d0506afb45d1519ed439366eba1c3028229acf2f341ca5088d276ecebcaafdd10b81dcb10dbdbe7470b9358b26349f74c7e2cec2e98d974161e926748d90edbb16ada569851b6f806121afcee38ea33c123de3c2abe699ffadc410cc3dd796e53b88bda7124fd824a08004b9c6c84a862231bda0e039335e3d6d5736271a9d09b7ede9636ff4a59335e3e425681253a0f5e7577a23bc8e0ff4bf38d3e2456baeff59c6a7c30d3cdf09aaf3bba992d7acb25fab355f3506233dcc10aae997f629fa5dcd58a11deb613cac0d484b8575984b54deb12557dccbfad1ccff4f8b4ae1a2e920ec0c506c17af3728dbb138679ba7305be9231642325ad27a443b572d452f3b4200a4f73b993340695a74db67deeef2ae838844e73ab7bb9857b565cc906ee957025d9f381671e205fa6503540fec54a1a2d6a310e1333e3734a8686d9b0e379cfc1951a98006e0a883b526fcd4c0ced31b33bac77f539e32be22ae1aeff3f26c098f723b47fef4875c8ea9dbdbade79a814131edd78bd763995ccb89b4d4b290c16c48d04120867441179e1887d0d66aa1702840ebd86c7f10880784727c058938ba8fe9630d1bbaea290ad78dc3097d3c618131df3c0b7c5274c58c2f6ca595510bdacd459e5a1a3fb2f81ade7e8649b46942a1fca2f190a162f6f47ac0f4cb5da2bd6039619e2d5d58c02408923357d209706dc901a1dca9f679ab10976f594a57177c8b2460e3bc2730155c9580bf622f5eb48b13dd1aca124e3f6166e2bf701dc43b3710bbfdead6b4596f8edfd07c7fdf0c387b4cfbb7e24983cedae27954f3fa899ece3be8cd38500f4715705f5ee59b2333e82eb59a6efab51ba561b13693d8820cc1241c34fecc78e2d9dcf1fb7c8bc8ab1bc841d061729866812b394b8d820f5556c3c3f415dd5cd4056f971b4fabef98fe36428122447f45eb3b73c4e283a57180f951a4b3570fdea1e067c08a5b00f627c2e202d84d8dd65db5ad8fda5668f444ab3cf3643b33f1195f682b5804177cba78a569e8601b6dbd17b0a306b9416bc52ed11afe882536d4260ce75fc4d88c0eb5f552522b4909ac3015253a016fbdd2b8969b21a50a724610e2d4cfd632aa7c3a1315c69a8c899830653f012c11d990c5ccc890a8153675a7245538d02a01eed0010c9bf86d4dde15eaa34052e813dcf875770b3a9b614dd91b1b3036bfae2a56b79a98d1c0899fa03b460df5ed6573bba9ce4338306d05a2ec3b08e5943da2d72ccda16c4b8c2d8d9c5ec514da28996b8096efa7174f9bc1e8f8713283dc46967f4286feea7e2e967214fd90959a0ff350bbcfe924fad8702857fc1b920119e9524df53b80605ef73bf226408cd2ffaf2ab9f627db9e1bdc7f6da2c264e4d3e2c2ac6c6e3e46d1c47bed00567e494ae4379e44af5ed88f342a3a7109d13872cc556642cd0d2a52fe1406107c0f52886927e2fd60519e7d08f2e17d73b3a98bc7a97bf916f05967ed549bc04470e0105938462c58fbffab42010b8739c6a4809a44b67864c79096411503b045878c5a9c45d08cc001d43ea4426f3931d0a4b14b1a531296091f07e6c20468bf9ab8b1349a0adfbe855cfc3103c73671ebd044746ba3586064b63d0d72b86fe2f96baa0f1181c727ed4512a3f4a6dfb063751d45d700d0a295b0408cb13f26dc6140d0c110b6fb3d29ba46a1220ee8c965405e836dc9644aace019e93f29a3ce32c2889c8b6a7651ad0f605d97e387f657910e5c7523a13d4d04aff718f7d244b8ed30fb54f4729228fb7a5ae0fb73e5e83eb7da1600b84117078671f706cae13d0788cf4fdffab10d31b0acf3f5cf53314590c089273727a3caf9c14e3088beef5d8d53d1e28e1cd22592caa1661c2ca0814a2279a78f395cd49eee71fca41b0933c1308c985389187bb4ae83de22e6802c337a9e8e3f83820e22fc745a409ec9544736b0527c707fd6149f3adcead32df6c4901faa1e997a2cfa41b9a5e29ba0c7443d32f4597492f34fd52a1cfb8473403f906c5191c460f83940a96799be87278e3f437421f0e230b17ca3beb2fb1df706bc1415cbe2dc50a616c9cdf90a86c5aa3df700d8c53f7e87ef2c100ebf733d36d889a7d9a5e48bc7def45a8992326977fb46848c55c904aa06e18d5e927fee90e348951a0a382fe3757cf810abd04eddb4537d2f577fca8ae5afc20e6391a0fbf1a80a7e6da0a3278a8186e85ad6a5ce99e5bd4ba4af3df19cbadb086c1ff9a6afe86e5466825164d2c45dd038f0dcc5424ecd2eb393642e4c87a82546d85d971421b136ba5986826a24515f7d9b5ee66be4c0e09d6c84e76b59e7013a647dcb93586901663b3737db222a9f9e80354c5bc4835e3a093e5fd9cb9d622b7a88fc90d16c6bbadc9ecadbe70b019024615534a7285ce26f98609fd63c6174663da8cae49f80b66839093e174b8062ea5d754070591c10316e083c6d3418dc256e64373460865e98ff13df792ee5b8b9b26127b1c0742163bfc41dba1bb8a2755df45920cec6e442106e312a03cf63aa1bee9ca8a0dfe4c4b24de5de0e08b83aecd34c455e8481c406c9ab9067904e3c29f42dbcae9c56e5c022a8f8d6eeac684c04f467572d735cf954f4af83def5393708e34dd9b4bceeeeaca638f3f79e47574993283cd0d9088358e03288b1de7d4647287d3bc50191587acf4d6e24628621e67057e925229d92a8bc45e1264be906cb9c6cbe6ccbd158d8aa5c45fc903a434f990964f774e948aeddd1dc4c8789ce9c6a5c9d3b7bb0040262ec6576a7323b9188d4320e5b1d16518e638ad1c796ec730050f9106849fa959b679a5e67c85e415fbc09b29dcc12653696237542053f7264d6212ed947f66277546f7aae47f0f47b710fdb905fe71bffd7d9454d6a5537e278c81619bfd5079aae573adc50e86a6f9e1a21ba7bf16feee074ee904b83d5c2466f31c6fb500dc8235e8dac94f2e47c5d650bdfa56ce59de33743b422cef7b302447836a0a76a83fd9b460708b9e2c9d30f7a0b9c6ef0760e1ae8d0597778fd6ad48a74161900f62b75b181404f7ade13d70bc0561ad6787065aa13da3db51d0048fbe4ffa026736c1589b8029b5e54362a2f37ab9acdb5e866be812861a62daa4370741b1091b07b229e9fffa75db9e66fc2b5c234cc97138b00f6fd6f78a9bc6ddfa16f063cd2d1551212a03fa4edc87419c0c8b5abf837fe623b876addb34a3b0d592b9beec9a7e00b7b46f01a004099f99af656f5731a8c16f65dd3d132459fc578b293637ba80525c9c9f54e050038bed4f2927317c25cf874c425e4a8b61ec0ae1b92419e68a21ee6e9b9058ba2ca5081102c8f37b94230ba9fd2ba1a33e308ec8c725049e4e402188ef37e485d099a56f698a082f05119ea5ff662fb123507de514ec87913ce8d970ec9fc2cfbef6be274a8a58ab0e7e2377ae148edfd162448a429b628107c5e31175e5349c84a986133ac1493d13908f3ca07f0a4ce16e6de564c20ca80f18001add244781598966bdcba2ee1c248091ebab2c45fade1dff388f64524dc2174835a266beeaa7f793b1e10304b5504ba237363c13335078678e2f58e8ced1a98be091699a4b14b6c56d2a8812a86245ce76460a3e5afa8c82dd0dc2490cc5345cf236a47234643664d8d9848aa05f26d8eb192cc5d0a1d8d1cc2a71ba92001c1f843fdf1d01b51a3184c7ff3821f288e0131c8589483cdd9bbd46852091e0a8150a5fbf701fc61acd42df6af14b992aefb051a42c69738c655c58b57a85c20ad07cab86f4a873401926cb404e3387a2e3b9815b0ee54ec0bd93a5d42dc81406d5ccdb01404003a56c9cc1e69d93546973a501896ae87f99d43c4d5d6f7895503875aedd4ea9d03d4a63c3a315f0407b82d56446ebc7c997cfdfa2a49c965492015221279e0ae201e1926b9c9b316ed04e69a32b0cddd00225d18f2445303abb9d02a022f049d9a9e025ef17c3aa144bfb0db06b912fe59c0a61eab86062fdcb5fdb1a43065c5c6e8a683adc633b0a7d475c8582b66c36a1362b28909f48d25df918a2e891901be68a37ccbc6b6e16db6839019656306b76b1c975d8b666906f7c5b06a5e70576a072b2b2bb3cb103878f6600f866a24990a77814165bfc58cc674c333a0980311393068c092dd274902b8cf5cc56837a61fa429fc5468afbf7dd22959299171c15c60c7e5624867ecfd069104479f909da66d3723f3f1522da396ec0446a455ef1d32015c83c4736e64f0ac74fc34235dca8d3a507b481ea46c48f15feb61a9567a6418ad65dee585d74247dd9f0f511cb07aebdf7042b3a3b8a66fb7eca17bc826dc4e3dca3201f044c7dc0767bcf2b158c859546ef6eb79961fcbfb8217123a982dcd634eb084af047d83385d9d036f707dca3d15fb449dc0022ab40aba114126699d02548b5e19c76902304462a6c675d30907aaf1dc5338488490a523ce9810be3e262f9cd6ef86b6c0b52c86506dd5da822822401bc1265f48c988c23e08a20c6567725c38f62ddabf91243bf0b92894010d2eb5da3bb15b4109ac12402952909684f3b4eda7f54903857f3aa7444841f495ed0662062efbeceeea5127547aabf486c59b185aa971eb4073e2c314eb128bdd744ee8be2eddb4a8f47c184e4eb365efdb16f75a9a045d192fb06906f6e3e1b01d37c0bb721bac9fe09114121d2098c093b210d452845bef466e76bac792bcedaad786bceda58f7d69c55b7f6d65c5620485a2641c20f1e927e21bb8f40357c38b3225bc3bc4f1c2789822a18d8a036d57be47d9d1563c55b75d66ec55b7756c68ab7e2acddbab7eaac1a6b6fcd59712b4fadaad7f04a1341700cf32d2ec154e831dc34d83c5e339addaf9c7a3ff3393adb27b23414037a8fd09d22a5b2e8f732ff281a345838cde605cd508f4752b5829ebf8d9f5abcd858239d6501d629668226addf808fd63245470a0ed01243f4ea885af9ecc0c541a7ecba8a0e27480ba318f8e30860c93bc02e6d05032d871c0cf437e41b56f5d5d119c0bd823e653722138413e044db47c92aca92a56fd4b59fb74a2d86e542bbf90b2d1fd8c213289e0ed5abe0a086fcf44534b41859ef26a0d5b434763d17838e7e761e7c1cc888d4cb8b99b8bc3c0b1443df4a5ddbd99f52e36d23c274d55b8a1b705cfcc7c0303d6e157f33245f2bf17a54d89596eaa1c7af16aa624c9c97f4daf6ac1026721e636e8f691ba2fdc73944835fa61c5ddeffe6f6f887eae49edb8c14b0603060c503b0ad7e6ed2ab673d9ee5dbce47891b81fe1064eec1fb16784ee6b81cdb707241351673e96e511623698ecfe5689fadcb53827db5dd38e97fbbec3d6a4df05390f18174b53cd275afe5baaf75edebe706ae008e4a1d0d846f720fd8bd49329e7043a3266fd19618cd69ca809d8265dc1b84200358e889885c3c1b88fc636c48cfeaec9b7f92743a5523d48cd1a249a3267349193bd9090b86b6a4d459e8a873bb2806cd635bec63682d17562e35f89f0e73ddd9dff2453c684babb68103fb043e34bedf6c31f1e15c8b3fe6fd5b40965e93d40bcc3623c3ff00f62ad44c49af99645f1a41c438055e75c44d0e5720da554d07d997c169be8d986dd3958f17845141f42f062f553fbebe51e6357452c31c0a13f51fda0a4f900a51f500404b808128c97126c36497327e88d096910dca4dfb432a8d988663b3b6ac6d7befbdf7de52a69464420e860e3c0e9e8c4f823a86e8dccd8e4374c0d7eae8bb8239f357aa907e828b3154a59f2a0839043276b7f71ea7e712e1d82f21a591266d583c598fd2affc8a15c2a2524d3d547ee587a84615f4582a0f55966fb13c644dd973ec57aaa947cbaf7c8b65983565cf627ba5e327536623d0aa955fb15c14f3a610e1d82f099bab706c1f9fce91108e1226c570bf3aca18d5246c1ca2e323db1f3276bd5f5a489a7e0678aa87ba9bc062c39c70fb898463bfb8f0c1adf306e1d84284dc4f1e0811727674e9ceb2ee4cdbb452e632e2c0f13574a4c1527a072399d31972f8b0551492e647d27ca6f21e19b8c0d68af988b5a8e3b8a99919e3ac5abd828dc8303a82f4c0daaa8e420fb18355aa9c670f13437c93d90bf0fba9c6943d7401bee1184e0e964c2e6b2569829034fd3958e7f24d1b216ff4ab0089f9f54ada38912282b0f125bc10c74d0d4e8fbe91a80c48716be17081455bab687ba56cb12df6438ce43d32708116fb43eed1282eea0c5cc04fd9bb15ba21aaa6c57efe800f29f28d7e1cf7c1d34460b1bf9f006df7f8a9dd8e5b8d3b364fcde55979e51a2868256ddaf3e810e1b6e33df2d42f813a057ecfc0e51245f884dc78701da853db4b9efa5db625a1d0f672262890a92de6a7fe4d88d0053286c4ed4c65e49e7642b8ef7ea4947bcabd0ffa425a6c9a793f66ff438b2b19c3695e352afb7ab2ccc57be4e9fbecbdaff2ea8716c11c645cfa427e685446eb0fbca29c4b8b1df6144c29af7e08856caf1f8470572a09a3e86e572a19228b3b7a0f8c0e11663ff6aa8bee95a08ed9a2f6cda4c5161af2e87b8fa4e92e64ca73208170e0389d6a7d794949e1865c108e32767f701993316f4a4498c58056de4b6eb3e41b6cb7d816db62316e5ddeb6307471f917451c389c5bde04c8435b6bac196d68b55a357cd3f2949440db92adc56444dda9fb885bc57ee4560e64ea073fc9ec03747ac05a14ead3a9bbd349dd63f20ab018b7f200587f70d945294ec475fa49c3e84f14b305e136f4f2134f98e178a245722f42a745223c3c3c8d1a439e468d3888744af6d04ea37c686868c331aaa29ff8412015a5940afdb454fa47da74ff481bfe941be953ca9be85314f2c673e04b14a1768b277416509d9057a111c2718bb15711fa532242beb28db4b8c57cbc6705e1b8b55eb785b6217ac7fe69428708e7d6da7e36d7160463264ca93701ba91167bc8bb875afe1ab7366e71dca2dcc2b1c9988c4d3be2a036e6ce15f1253cb9fd6ec49ba0d48efc5c8fd7391e3b3349c2044be1f67bed3f5270ded3233c6ec8bdebc6e085303625844d50e96e6e28881b0a1a92365d7043cc40b0fcca03e1f22aef6a957779205654dee5472ed62bdfc3e555569e0716bb6291f4b09dca8a45f2832af184102e834f43de7042f2463fdd522b3f862c2ed3457f142f05ff8778990621f83ae41df2d833e656d64a02ca2cae07b19c465a6c46f9d1d3239a3aca6490bf734d4aa4519e16e617a5ef9f569860481437c7f0e304c36d0253425113ba586ffff263d7929e4ae7f220bed1c1fcd45dc1833a1f494383ee0a3d1d0f6ae0035602cb5c62f67052e086ba295cec4bb80917718c328c5a7f79900765d32937c449a1876fa89d49664ff7923453489a2ee826e9a8d8028a9f2370421c74044e71165ef5214993842cbc0be94af0282441a666cff4d1e2b613b76938c2e51f4e425f1a84a434a0466c94059dcb658cb00bee02634b829c5ac82ee8fca9a30b1434793a1f4fadbc4ac7d36257a445ae0b79eaa70247e4448d8ea7e3d159ad6ac8826612ce825393092637e6106612ce82835a2f45ed74b83124cdea762c9063e0ce0540185deee773df36ba40412eca138ebcbdbf0b73b14601a15da744d2704f3ad50135914e75d4762e16971f1de69a13ccc980801f64bb2cac9557791e5c9e65e57960799715cb3dfc2b55aa5c2cddbefb1f43a4b8d90f8dbe67804fbea7525bd55bf46b529a4dd7b4e2c537999d49f8c6ec9956706a3291c4837c32c129cf82993b18674fa91802e826e04a2a8650c1f5648d50bc06e07a8c14f19829f8cd3a5fae29b208fa8171313ef56f1b4f9f5a6b9ee6f11984438e1a3bd70c9aaf468ddcd05df2d38ab09f2611fa8f9d4bdad040da501f692385b4c978206f3a18dfa8017746905d135dda6c743c39b29bd9d984ce0e96fdc80d0911238344756790282ee613f31b70efa14814f691f65c15b828705390a839c40df536a9c38c784f8b4528a5746a93ba80a44d569435d129d9237713264c8456c230a5e3091dc6b2b2d222c329e56299e963f660be0caccc52b9c80af24678190b92a69f61dce4e12cc03298c35e868ccac3c3d3c160b0d88a49132727ea4edd3b30c772437c476e881b6a14109e534c25928649a726509ffabf3bc3553ce17a5304585ee5796079152b443a0f2ebf6285b878a10a2c76542ab687ee085f84a1922a242a9d8f8aa5eba9a9c18143141df54302753c3208fd75e420e3ba3da2b26d2e2edf4e98d9294592169108935c2bc2b9ea5c784296ceb6892f08fd8e1e5481eb3f2369f88778f9679316dbc4414e046bb1cb02ac0a58807da1c780010000000840e7ea5c2f9753e7625c8cd311623169c24d2794d6e0ca04d0c118262469f872cb064af04c313a1f4c306868c01cfa3402f8983a33181b33d174d262518b3086318c9d701386d122e84ea3464ee8f2704259c7fca5c312e2c9e14bf0a0dad16000a00e1e4943efd8f1d8f0d9d0d1608990a90ab698b49155dcfef9054f2a38c53079ea771943e805f7303625844db82e130af43926dc931517a34784316e28ab1c8c1b9a40f3e5a9e90a031537c8816a7418ec67a48d3f853d285eae13643a8166d074b5c8b06b44384e97c3e4fd81111531cd68ac51a8d78b4abe3102e0f2bba783d23967033a259deb0a303ef5afbccab750c39ac89fbfab5d11e68ea7c5aee769d7d3286ab72d0c5ff294753d2df2b4f857deb1e3e9e1f208cca160c7d329fecbb623eafa0861d7c3032bd2a8229d7a557fa724d4ae546205102ebdb20a25766e6b219b0a5c0446bffaf5126a91612a3066ef86cf00060073b837c001be1a1048ca07d96ef8d335859c9dab06089567792056dee55d07e8e1f22b0f04cbab3c102ebff263073b009863f2efa1f22cdf63c5e436022acff23ca83ccb8b1582a407cbb788ef624dfc52d56285b87441075970a262b14f95784208e21d4930447befe60561dfb1a3d4a9ebf0debd77d30ef0fd7580efeeeedf737db0fa17a5eff72c904a76ec316e4b2c4814477a921d9d48f7d5aec727ec94b881bcd13c5bed78282b44b1d3a783f5f04feae38e83c1bce3e8bb53ffc97e1ae59ee9a0eed45dc727f97e0bf83e30071917fcf92eb08ce9d4d1754fedb7a8fdf6f4756c4fed8ca4d17ec89520a5af435e6a1df643a4cf65157c067f538139a03da2f25c3db2f22b76ba9c67ba78a6023eaece3b578df2e7e97a3a9f8e87157e965d967f5aa43108472ed66dd4bad8eef8e80bc2ed76aed8e5d6125c4ae4151245dfd56d315d9cd11817eb74b8d8744d57ac9f70f6946946999dd6d0005e0207c99407c1201ca76b0e216fb8c52d1b77f455a388481b4d8c4ecd9e2ec89b99846ff47fc1a9cee5a7a642cc173a2bf8d4ef3920a33e65ca833c8b69998907798a1bf22c38c549a1bd334a334ac5187a31e11b4e886f0c798a8bf9490a9ce238f42428e430e784e68b13e2cc1074b998a7e6dcc209b79fbe20d46049f8867f3a2b3a578b6fa615e48d1e4fcd39935c1b779c2e578f9d4d244dbba698af1fbe995ac81b57e04945e9d222c2f96307e3e996901d4f67834e0989e2ba56e98e1d4f773c1bc849e70ee629a7823cf583b175211c03e6b0e9baab169fc4244d77774f972b9baeb944054865ba1ce613c6308631eca4e329d9cdb06658338c612b523312247872664471deb814e9477b2590104160a24ac186051fa84895096e351f96d72518dda7547e049710b501fab5214f9566e6d3a869b526b22634e738cda78870beb771d074cf49f54809a73fe731f5203da9c7d4a3f42ccf6285887eead17db64872bb97143d09e1fcf16b702c09475d970939e12bdfdfc1545a87e83298230412e8fa40798e8a2b105d49c5157c6e5c49c5157eee8bd26f9d26fdb86d2f6510ca522b496735739055a04f14499bcdc5ab4b7bb9bfc6d033bbd99734601d655cb763d705fadfaa75e6dcb62efcd1e374109381631ccb7849d6da8fa38d7320380f9c47db388df39fb39d30f328dea2d6d4541e08951f351f176f71f3815829fda8f9703cac3ce979004d6c23b0f2a49fb687ca97a4b81308dcbe2bdab4227eee6745e121fd479952bb2644ddab1b4a9137ac7c4ba10f652b5cef3b7a8b27cf2cc835aecb8236d139676edbb85783dc3bd73d2d32639ef93cd9966c960a2d044f910e4ecf22c231e608e9b98e5b1876500f1f7051c22861bcb9cb28420ffc91c742b36c2544f9c247f9be2f9c9a4f17c51d82cb59ee8151802e6d08ddcb7140d4bd56aa5475dc844f6e7ac7c5264c4b42941c9b8e046b3a45f00d7e727b076e2b95b68d82deac7d49ce4d7f424a8f62f32784f029326e5b9ce1a5842a05db0eba5021f13cc8a5e8034759967d9ae779deeeee9d79deb3e7bda7c30373285defe79671d47bae7aa3793d0e12fda43da98e2af8023f677a476f959ef43d4a567b9295de43fbe6c97a321ef6e91ce484a727c8e37ae536e092cd7cb85ed98067e3d17c5a6cae8214fba1d09ae01b44b41f90fe096f95de81c0a792751e3fb50b0a2742a98799709fa88244513248b169acc5d67428199ab8ce03295e6103a1972a0533c9132a24935f414141de07969ee5c72c88e42c3ff9787216117a9f97b18af459dd6e773f3ea9b2d4d04ff44b95c539c759530edccfd7c1d9ad7bae763f2bbfc0578b9fd7f545bdbc0f0a49f0a8523091704285c4d963ccacf9644de8e8b8f65c47577b499afe321f12a98b356a6c577737e94b25307b6541419ea2b1cd0b89be10852a05ee85986bdfdb7bebf050ad09ad45ade693fdf6a3e6e33ece721ead664d6c2c2324cd11d5775acc9ce53c7deaf71e9f393d94cb2f339bb51896f96ceedd2b26699eb4b8f28a2c71770f03d96f5e654933bfab5d336a472d1be94f1bbaf01dc3a9b252596a4bf86f739b1685cc011f34618511566350c288129a70f285156a50a42383b7618ba18b5569b17f0c6f86c3534386d0023390e189222044d102181447e0220b434c1185113c07f0c3108eef3a28b14227064aae58824500269860a207448841185640f9fa532b8f8032004028b23222042d88c10b618431c50d969881929d2880397f7178aa035b4082158e70814815422a89852d60b1133b02d00e78a0f25aa0c5184c88428c2655a84a5a5081051443d08145a1eaf79ec00511fa9520f81d44d8ef600ef80ee6706f3342c08e11b703afacc2065eb8267eedc1ee1ae1b769f4a347589856be36d43083394758de9b20f8f36ba80187900bbeeff03b06b99e047718628356105f48c20a245c4c4125fb043ead601de9733fc11cf4bdc771fae3bb47745ec5626bfae4ffd5230ce670efdde03f6a97fe98d9843fa50de9a95ffaf4e9b3b45179fa2d6d4a4fedf8e3fbea0d2dfa73d5862d84df8f36dc9a161dac9b142905df7fa5aa9448754a1afa2935acf451eaa53faa97da1a726cb7c11ddb052d8e46713778daf7d91f5f0e928b1e70d1834be7f59ebe67bf107c17478bdfe5c620974a91db7c1072a98fede9f6dc3bb7fd7bb6fd665568181e61798f45fb1a1a356a4f5d7b6a6b68d13f85156a2f2fb3c7acbdcd2c0e9716f9b20bc2b18616679df9cd8b902b35d7044fce6cdced23578bf27e11e268940d8d9a5f0db70d358dda64dbed8a307eaa70062c3081062a7e174fd13071850a66109bc118c450318f0cbc30d2852b0831a13201169238e2658528584f54fcae243c203aa40e4a6b6891af3d923d4edb6d0b4317174ed2f0cbeadd52362753fc1c97227f7cb9e336561c304fce8ca32f0adf100f3c98070fdf10df50fbb9187cf1c029d009f31bfa5c7cf32de11b313f398153a019be27f787166effb764946530038b715b6ee1ca33783fa44dbb463bdcc88bd09415b9247f20fc1387110e3aaf1aa1a03e243ed6f66dc163d2cc8e8ad022af5111be19b5e8a8086b256982d802df6846a08405c081434d8a6793d6e080836fa87500dfe8e7e138708a872997f0c0e300bef9be2396c8e27e2c4933e774973ed7658670fc866e53d676cb00b6865c497c6e0a7481434814286db24ff205297277d4f2d1c807526cc58c468c04b3b4d5289bda4a5bc1b4a316dfd056c0a9108c5a7c53b33d878ef224a44fc2f91fcb8bf047f86d95eff422ec583297b4793288610b229698026b09aa26e8e08b241cd1c50f112254438a50c5113d60607da14415545d812e9c00c56a0c31a860a2b2f1c205002403180bc19321bc8163d4bafd73ce8cd28c6619a519a5a52284fe5e098cadb4d517fb883e30be31bea2fb91e1e58e1fd11c034bd2489a20248d6684bca17335156848dcfed1861bd421de0acc31c2d13ff89ab1b02f6b3ada4a0c21378f36c2e5974c046b42c81418eb534b1bd0bb231b4131b314217b6108b7dbae3bc1206d522e122b01899292871349a381b1463d2983b4d46e4efc73e24e29cd5c2c67b158f6e325cc32c408c76fc9763f960c8dc847f439617dc1e52970a75f9e02570ef3d427469f8a1af569418afd601117a8f311c15ec6bf28d62292262b22021f2936bb41b603a2ac0929868ce70be1a8adc058a7c2d5185e17232e59fdd1f214780679f28144816490a24fe390e2a9140b0279ea6cd402c3ed7f724744dcfe96e98570cc78584417c90e52157a0a6554a453d288b4e1ef470a4933e291365d08c1e71fb7199acfccd76ab9e3c79a5e84d91d3f56d3e9537bbf9a1d4d70b99f45a1f6e3377424e5bb9467700777c19667271742b0e5a94c0979027da44df7200f240ea46f231a9121e4a9ff05da2a3bf25dce6aab2d84da73effdd442e8d96fa8456dc853df12ce7e4339f4fd967c2f69f339f9b490a84f0b44df122227ae46694055b8aea549be1f69f33991345148d4a705ce26b9fd281917f39be8cfa751fc39e9537fca47040b757eae2bac2823268d1a851a453b808346286d3422640ae55b742d06b79f4e9b69216fa0d8ccd535b82e49938570d456da1297a7466ce9c6695e37ff592ebea56a6abe243e9626c5d57a349e1abee1c137fabf243815829a1430078fa4e1c137190fe48dac063c1f11e94314560a2bcc98c5bc7dc6d9967d441fd1a72d71010535ca5d5ed456d967c79a3b662e1ca28bcb95e1a073d2393357006ad05601d056d38bf0bba3b67a692b6933ba338c10e5991a20499ffab5d5a8f5b09126b424b78bb491cb43c11c303e56a388982e3f8947dacca7a92cabc9b20364994d96dd64d90d5986802cc3c182e090a4116af1c8e8e7a822c941bb591155ca93ddb1ddec1b318b35f049c6edf00e338b9fd2e7a13f7dcce769d4b4bd6d61b892a7e66991d5e20e3fef348a7f8e98c53cf6e31981b18fd5220fab45774138d6f41142256178a59230a4b8de9555280105087221512c83d78ea46156e69a7466ae8c283b40363f10026a79f08d10b83b0fbe015ff295056d216dda0b2f42530eedf27317bc63e6923623b6da8a281c3f96b6e24f06da4a00df68ba4f77143067c53e9dd98788e86634e290e99c948735aaad4209e0f66b2bd6887c448da2bfd2c142e8bac2a4933396a251dddd04f89a8a90ab0f42562b1fdc0c2b1890eb43e263b9bf80cc0280f459d0ddb9ace09eb59af89c1348daf4e59e2ad08cc748a328f8ea130f240a2c8314fb339f26c02792a61f8c7d110299e01760eca6be9d8f458510c8bc314f65401d038a4238668ee227f1a7800e1872d9fe58c2ce0dd2e0ab51429dca60a1bbd38c7a131f18410d0878bdc017df801fd1b7057e65283e85a4c9b49037b6c029c91f91a7322a32d714421c32fa01bea1168c4d30268970c0e351f89cd39d524ac339e7fc2dcbb62c33a2b3aa5f4cd28031bef9c69037be30c031dc7e948f48d280218570cc5c44577e2c6739cb85e5595624dbb6cce5ca5ce3c7ba3edd84d66a946b2b6da5ad3c047c3e3f7477b088afc83bc03775c2e932e2e2eecde73272fbbd08bb3b4a2737e5b3226d249c4b849a1169f3236dec88c5eab93428a25320ac41d80ee8ca9e90a20742b83a4072b31af0a97fd47670fb6f00331e4903b66e77946e08f8a64e880030875f06ca8a342a63128e992b0ae1f8b5eeb7f3f1348a7ef6af46f1f76a5188a638266666a6861a6cb0e1868ff559eea969b1b72184d46641130a3545fad43537e0481beffbbd9191468d3c1a2519fd683f7fc8a10bbea68d8a7411f2057f1c15e919196931013857a58005e4e4e0ec47ad4671738bb05f822d3049a386c271c42a72fb3d1c128073550a5880a67d39a003865ced35fa2091a469c2ead18eb4f976463290a84f06df88753fd67cc2f78470cc5cacbba5b22236e371420864661fcb53bcd3a7223cb2d9472c4f8d6c8330b089b4c980248d15242aab428afd1b08bb4d6de6e2221c9905fa348a8d342ab31950e69a42e1c82c1ebed9f8bb414340e61f0e747e0998f4c3f1eba9a87dae7cf941a04e115981a842429f0892ed3510a85348b6ef075d8d929914389d655913b0f24d40021200266196b4d9e169541169a3b111dfcf48f00de40de516087a1f08da0f04ed38e47a366b92058139648b573638b708658bae4c4a1a20204074703685cd6820698e8c3e73796a645dcc72654c8423b3f84626f1bcffbc470173bccc061d0de48d94373a0b843323d246e3321efa23cacd76206f68663f22275f9118408284281f18e40d6da5ad98b59556048f34222babadf8230259e04ea3e67f441fd147f4c9cfebc091eb6b7e42079e9c19b9e3388e7bf7902debf0bb651e3a357656a3343b7aa869c37b5ba7c80849c3d347b0d8df934411211b91a3691a9d539b73f21326531530cce5a8ec6143a04cc10fae8332dda7bbabc6fbbc22b3874911a00e26ac69397e82b4f991a2519313fdd4efa7f02fcfa94d8d6ab387468d2e1de813fb67ef12bb26a8c5173da64567ed87148c806ff4b3cb53c029b6a2c88a11f00d83216f301486a41788bc2149d345102177471e1a7266e540b9cc625204931d66db813a98ec30d9e971f6d7c184c7ab0e263d74157a11b73a98f4701ec86708e9cfb4d8bfd362119ef66c991451a479ee4ea798d5a7661599d3bd87a7451d4c8a68d4101d4c8a60a2c38435d9ea60520465dd998370c4c162b18aecb438c40db178e8ef778ae3afec96b5a64153d14aa592562a955428a5d413527a3ab31a0219f3e80a0b474ba552cbb370b4542aad6859a665d9e6a91eb808b6525bd55259c555794b556753a9acacd8d1f7b910b2f43d78dfabd4af15ba79bd8fa3f48d72d9346dd3b405882f69bc526d95d723a5575159b1fe435428a31b3e4ecf2ccbc1df7dd64de7324db31bdff08da5c0370ce01b2c852015a863c42c49d3357418c0376c84641520a184eca35946b3ccbfc11d5ad5831052a354a334cbb26c3a6754a359c64300155f51f9d1e5aaa8a8b8644b327b3df0d9aa5493f62c3f4455aa26fa7c536ea35c940bfac8533fc8715cd64385d61ea5d20a8bcfd78307a2340becd7f763be37faa63729f56fdbbce999bc9246a946e9763dcc7eaa20ccdef34f86194948dad06f2e64aa7dda8bdb3f040e429e9a350416dc8e40ab7af0538f6ea9b66a0a11be8f8f8fb6699aa6514ab3eff7cc8552aa6d1a951ecb47bd96d1e3b47377452391c09cd17b5c5b65c4aa96daf2a54a64e559c0aca50a296dcf0014c9628812b2248d11928605d200fd2b52162085f49e07f331083ed76c6bd54a0b4bd6c2d2d2f22e2d2dcf524d2e2c2df4338ecbb8a755e0c0c8a5ef85dfbc2098c3e3fbcceebd9792f6dbd831e817a8ba3e02d43e8da39399523a25dfd0972b2a9f955e55c2a12abd4b8bd90ec7b888011570a952d537cb6896d12c5bd262a9ea6caa1ffcb49234ad02169b7556e05c390849d32bcff22c2b3f44e5ada89858ecf37fe055aaa907cbab3c8b154dfc2b966d045a55fa92ed41f6cb7ffcecdb5acc5e823d601fbee9d56d26a202d6441802c2ed56fb486d6bf185ae04c19c8cc11cee816adb87d9f730b263683b2492f520e107adb59b4b9ea4aa27489ee4c5216fb2e70f65aa5f7e6a02dcac667ca3ffe5290dc8533f185b175e63f4d03edb16862e7674f1d19e528d360fdf64fcdfab22e71bfc1e0d9f5779653ecfb8ab52a58a06d8568116fb657b323b443b5bb461ffe5d98e33ac6cf1f4b3c5937db1234bf0012d2ff32d754cc195b932ef6d0c3e60a43f7bb8a4dfc007f89561f0016310bf2d7604e2cafccb6fe003faca8ce092ecf8f241fccabc0473ccfce856cab0e3902b6365fc0bb8a3af8ce72ac38eec0ff3d38ede4b9dcfe1cbcf3abfab41f8729079f99d109a72e0dbf27c5bdeadf86c4d3b66de7fe6dd8edd85f101f3f63d0677743accbc8579fb1298797be475edc33ca98e2a97f4b48e3f2e753bdf54658bd36b3e26c68edb9d763c3d7d93c9ca3ce9719c546b3cad297faae30f95dbf2325faa25e0dbf20deee8dbf20ce630f3f625b8a3e5ad1d61be85c4974475b880a37c09a75b6c1d61bee5bd963af68df124a823c69e7e56faa54afa96961da52751b963bec754795b6a5fafa3cc7b7faa3e60be9abe05dc215b14bff4b245f119dc21bef812d4a1afc9fa80f919b18e32f687ca85b1f66b3c8e7735b4a3786b3c4a1d6b6e8d4fa9e38f5be33f30e7c5ca9057f7ad0c7fa8dc12f09d799cdeb172671eac9dd056ebc8b7bed76ea8a66abc57a3762f2ec2d1347578b2765c0c7fb2ea8472ba275b84a3bffad6c7f15beb90fbaac1b7468d1a35ac0c7d5e56b905a0c1122b98382245b06ebf89bb2598d7876cd1c8ccbc9b50386e30a16d8b70dc60f2a278a52db63d6994b76a94e9fb39221c0f5016c4b852e84aa02cf45c8fc11cd173ff4922e5409f5f07fd71030d2e4fab8bc5118efef2178ad7a892d5212f0a8a67b22694972b35c8a8fba10c43701d610a5880e1040c2c810923c48a3801c6852684f235823bb508f9e55c02018f0316aa9fab77ab83d09463be5af4180ec21b30b8c3cff0e4f26804777e1bf197f36fdbab97084762bc5ca8bb474015c25cb84117825429f09220410515928ea8e8b68c968c8213551ce10635104308469cc00760c07ad002229e329421d68d216f687c7f4706695343dabcb7e3f25eb07943dc1aaecf481490520d5f0001bcff2651f6fd3f89aa3770bcbf4bcc4b940d34efef0ef3d457854e511053145145154a8420d209fa7142c409cea4c576980b6db027af55ecc9e7433f6eb8b2c521772bf29407b618030b2d4c01831ea8c41f4421840d5ea0e4055750f56fb08d68ea346ae5fb86f16342e8f234fce82f6933e3fb0a225e86dbfee360f096166e68fce860d4f8d1b370ff4777727b23da6040484fbf5481943e00ef71dd5e087c940632ad40e893be5401602a994a5b1005d94835487849efb5977e7c771b424448892476900511822084d4c2144bac4882958591262b50fb52c96eb0ad4913c2718395be7f2b95be348216fb875c876d2d37a4c17aab7a2d4178b996920a8ad5eda8a05c3a9eace3e9581dabdb89c562b1582c539121e3fb3b56c7333b3555ec39ee2ee35dc64b304786ca83600ecae3d0008fd3f26b30c7644721d7f4fed3a8696dfc58330ee074fdebf57f39bdff1776aac626e6fde59436f4fda9b41149ef76fc71c39d3ff3a53ace5bf29f99ea2d4a066f79127f79aa7bc958183b862d2d6fc3c5ba5161fb826ff49fead66423da9cf449f2b7d851c61d3b182b639d061b633731240dec05297d5b3f59842eb654c3e73a6e60f099eff79fd64ff82330c700dfa17ca46e47d2ccccd47929e8802177da1f37e490a203a483eb28192acc734e1851516c7606a8dd4e8b3c2d86dc8230e5c78e959aaa9f165b2dc6bc85854b9e241658bcb0185aa9a61cac0f7ffb39541ff3eb93ba24351019600bd9bdd942dac890f42330a74b3241cace3f99525aea7e48b66bb5dc932019bde5ad25434b60a525444b8a38f4aacd78cf3f9e2b55b2581f74f0e7e097532feb42355cff94cf59129327b9da7442963cc99b838528b51a986b79aa63712dae6375ac961955d6a8f27677ec8ec8dbc36a017bfcab6b852db6358346ad515dd2f87f9d92c6a93cf9c760e19b6181b94ae1b40bfdb4ba5697a493a251408d1a39a2ced5285650a346ce09cb5348468e8868a533593c1e00aabc5188d92b81a0b0a464437d29ce2f4015a5381f00357c006ab033529c4f801a23c5f903a82e529c8fa3aa4871fe8d1a4a717ead9f14e7dbba4971be00ea94e27c9a09e6102fd750e50d4095d7c11c3300c8f1312e2ae1c7dfadf3feba2958d0d6108ab8e08223c040346407442431c30db6d0738620b6261bd106db96846317eb62b47b42afc7a00f24e06b7a1e50984d55872c51cfc2954510298b5716439e8dd7f0dbdc25369d8983973fbd728a2740716baa5479b246488282145048e23027b79ff4a4ef482f2fe94952e52492bda1c5fe9c1a76410db5f648cd7717abb1b02e86dc09e7f6d1d401ea6208d75fd2460b1dd47f7498935712422798f4b30221592039f09ddf23ccc17796de2b9724d82324c9762190c7aee5ee3ded436ac993bc3464617aafdc838370dc60b40653180922d5c5ba09779cb48b957e7489f931947998a730b68b91ecb8c9d871a3c1c6d8313459f7e961187a51a3c2d71802816104088c222eaff238eddd5039062bb062a5f2b62bc2712bbafd3c3b4b08c78e25e70ee8802139fa6e4f244d9ba65bd38eefbafdf1015911050d6ef0842caa2084902082b0859f2484884dc11ea9f90de6a91adbc5ba18ac8b6db06e65e519cc61f91baadc220a245c2a3062574e71251018492e12d7c571a50b09eb7a9ecc7b2d3df531a76cb1e583b8f4f8339998f4fc3a48cf3fe47a1d855c7fa681d621d76b90be34586e01df30fdaca364724d8fe331557c533d3da9ca165b2a4c1d879c1ea74ba5c7712e9564aabc2599f7f7fa2b5599aa5359477d1bffdb15e18cf7e4a68450021981e88e1dab63356ab6a4cd0e47246da6f576244d7fbb9d43489aafa95d4f9ffabd8ed5a898efef761a25f3347c7f57a4513d9d111289345fa6366af23beb63aa64d2ede8c04faad48eeccf156871b2ed8cb4d8d4763d2dda949011ace055dc022e80bf10ebb4434158fad15bad4679921f96c7aaa92b7815123a793e4e9378b2cb1683f8a5cf2de01bd356a045af3952f3385e53a5bcf69dc4cc24d27ba5d62bc27a3a2d823a6c978b98ef75822f2f307faa9e583dfa30d534432c3d9146f9702122bd6a948f2335efad5aacb15ccb4f357e9471675c6666669466de931efd64d4b1e6caf8ed8a5046cdfd9f600e1b5f5fe2b48d3ad65c1bbfc16c7c3fd7f254cddb78921db76be36bd8781a2f3d65a3a6ca3ed978af2a92c6868d673b6e367e722d1b75e56bd451068d0a1bdd0ab68e61ada3ffca7f1d19705d5ec64a174b423876b1ebf2a52d28941788090ff700fd14dd9e4061005d9b2b81c2d0b94442444b943cd1848992278a287962e7a2380a21d71341ae96e75250c85b9316f95fbef49e07e6687996f72438e776c516829a5bfa594350737d909e823a5a9e65ac21d9b1e6921ee65deac8d7e5a5a4b9f3471beefc51a5e6c795d48f34d8fc48e3ce4eddfcb8917ee56faa4cb5a171fd471aae7f4d75ff187fd33398a32f0dd6ede8a63a3a17ee85a92f75f42f3d571f2dcff21b98b3f2a3e6b6e8e0bf11b17c0bb5e3ca9dcf8d2ab7f4f447cd6561b15ba96eb079372bba57ab45553e95bac1c62eb635994fef0cea9e5ce9c5900a981003085ecc20881a452072a2066008420b84d0b53ce5a5ae45ea5aec2f2fd97123f9cb27d77005f2dd20db3d52f30cf291d4e3b457e3c9fb28a003865ce71d6e7bd45456b10b42a1d4f7fb2b25d4627babd88f5e45386eb0268dda9c346aec36d846d4a8d18b6e51a31a3576495ed275008b64ec5ab7d5a8f9394b7ee449bae449de207992394b5ef2242fa803b843ea6b7e83792a654d3bc80a78a14409229c7481072a0114a9a42a556379f80b2854020422572a79428c2be34a254e3471fda585b4f13f92fa06799035476a1ea7bd5495b207af6a7ce85656b50bf95fe942527453ecc8465e1b17ab70e41ef797fb4b49a83d08beb6264209eed8a810fb516a10b07e40b68c897de2770511359118e175be408becceec2ff657a3dc1b359d899346b91542117de0f24b9bbef2993419f257a324101326424cae13f9cb87260f427eafc700cd5568d293120e6006759fee6827e7769352ca174317da43d453a6323b63bddbb65f664ffba7bac2f1ef26850c80a270062b9ae0c403980004215e4c7802851854fddf2ffeec09c16712f6cbbbc3d073f9e58c8b738a72c6d3bcb520573a1432cb38cb64371a855ced4e3beab8948ab08843f91d51a3b6d67a1265734af9b2764d1ec79ddf63354adaeed5055d1166df1179d28659caef601d518b7cc70ed635e9881ac57c93b4c8b4d535e988e4ebf24bf943ee927ae514334dd84522f9ba9ee66d9fd799eb719f571cd7eb3c3a27b34c19492bae3781ae977d5449d8df9ee6745249249584fe128ceb699fac920ad7db66dfb6a30fd7fb02dd2bb228e2d2da2cb76deb6c64da41470672a9c542e84ad9dca5a61ddde4f2d3dcd3f59a29acc895108e94e8f29b72e0cb0fa4813bfa8e13d8b8e5f904d214488fdf1dc71ff2c5042986362f221ca98b7b512bc2ec8164b7e62ec9eec70423374803f590ed7a23174a164f6e905e72f9c7ee8e9e4538ba641166efa56c575a5a4598fd90eb913e598174a54f566bda21878680cc3bfe90af1ff275e94f8b2a9fac1428ccde932b2b73c59ba5cb887e773daefb64ad5a5ceffb64ad03b8dee89335e57a289facf47ae1276bbd5eca272b107a83d00b44d2323a6557e514d7fb4c515c7ebef56631afe7cdd2a5677fdb0a7eaa2494e2725b118e747a774f96da88fe481afed1f40659a2a068b7eda8e3d2a2cb5f6f5647fa73f98a2545ad95a7a4158230850eac5044061eac544c81264ca8d0f1c10a5820858abf2bea623eb7a851f22915a11df956798b9e5cceec11eec568913b183fac457e981cfa628c2d96208630b45a205f457c100b83104ffc6008f37ba8cfbdac2bbffde97b52ec6fd0a95fbf12f422ae2b926057f4cc4f5d9e6269c2d0164368a1051f9c41c54f833c051304286a5084222d2802122a7edaa23f56845e8c193c077872869925898391f6b64c759ca4b194994e4ea698b9b9b9f948c6bd6d17c76402c808ffe28cb4e1de468ddb346ed3a13b5f5e31e4e44eda49febc09245a740144667547aba14bf82e63a8b988b76ba46afe209cf69b48288c2a6176bff70341c33ba541e6e7fc9fbf792ae58fa0fc91d1cfef8e4cf4c397aa946aa2d66401f0539e87d1a33c0f291f5a20c04f79149b2253ea886af608caaba4a768ab4ff3274a2b05c7fc9af93f5f9cd6e4bda907833cea12618dcf9bebefd2e1367f2c6d3d9daaf9a2a7eccff9a31c8a1971fcffcbff8c2a55b64a958c2a552f3d355fceedcef7d3d46c8ccaa4332d4ef19188a169de8c3a7a5b4b2fa3aefc57955a91ec205544c24779099ab8e7c13fe579e807bf4e2184fc0d5209c58c1abead28d587cf9a3ccb2344790d0899075f460502490f99071f081a3ee5bd2984f025cdfc990408f5817e6775c8bb3d10427ee61186282f41cd071e4460fee54ddc57c03fe52bd00f3e4a35d19721e387a8c26aa28f327a94ef317a94a78f628520a1b647e965582132d6f4a517428335516be26c04fc53be473f38fa212a8fef5677607087acf2d5aa89c7e87790aa51e9bd3655a982a952f5a2f1203204e95d1ea765cbb33c4e677c632ae94dd5e5616acbbf54964fa92b0f5695cf565e65f4a591ca0acbfc96f92e52c552a56a65f47e9a30d3899089a03cf844c21fbd0479a47c15fd341f6504ce9f3f08b78944d544fcbb6508d725233c3983e306dad9ab5499543187fc2efc92bde04d60888abe9c59221cc04f2269736333ba7c801a4f75ef277e1e65918bfb51beb21f25cc53ec2eecf69b93c890d56ab5b2a145fe1a1c2de220e21d14ca1f7154130fcffb09845082a0e370edb9df242055b46b8d9ff83d27520d59e1f013b70d5be49f4842f963485db335317872667cff584af9f2c48fa3c65338f2c4807740f36854f6da87f2c49fa439a40b4778a7f56104df95526efea16f567608cafe95276b8434de9362f8332f677ef4ff16457f1a8fd362a36a7ca35c7ff951c6f5d1f51f65ae83d74d3fd2703d06fcd1bb6ebadd95f911e63a7765fcf872fd55b4eb2dd7b3fa230be9477aed8f2b77e547955bfad167fc58bafe2d6db2f71f53aeff48da341b97773bd6787faf461569d499ff49a346a521d2b0df4c9d2df673188ee16ff2c4768644e6cabfb76d86ad2f4386861813cc8b4b0bcb8a4a91122b7c70fd4929fea176fd5146ddf507bdebff79dd48d26c95250d9d7593346e694844c264153d505c1abc11c19bfed94b95c9ad2902de6bcf43f7990522fbee350b04921ed9770f8426dfcbaa8987f6a61da44a33f190bdc7a00f39f0e5df41aab6e7e68e8054e5601edb7fc099079196eca3dfb46af237516b8a80a665bf5920b6cfb6cf1e08eeb5972aa9fa408bf3bdea27ade6dba42adbfc347f74a0c5298bba2775ddac51bc8da14a8bd9cf9ac9cb004fc9176f6ef62eb07028cb6426b355c8b7cb10d29736fd7434b2dc904fd98f59d56ea334ad6e446c97c19c6eb33dbc17a2fde8a5ca41138fee7b096e2f64bef79bedd1fd678598b477f153a659d5d65a0d89b89ef6cd46754434aa7566a3b24c1b69b589b8de56b5ffde7b0b7cef59136701f04d9c3545c0fbee7b78df592148b81782f2de733fb24246dffd109556690e7cb9df41aa421ee16f35dbc21afa29e36af61b0fef77902acf0281847b20e67b9d05c2bffb1b7e8ff9a195dec35ffa895efeec33ce6a5af65ecd50b207abf4d3275d28557e55aac0d04f19fd69317bcd4e242d5304e67bdfc3bf7bda6a31fb4d8a9bbdd769da668f7c2a2da32d4fd19e3e659f7d1eed6931fbf066d97ff662f661f62ed94b900791f9fe541b32dbbb81272710fab704ea42d11d7f66a23c203a1aa507bee9216e3fe5d9007318ec051ec36d1cd7e6a2eecabc307c53f6a41fa23265d66481f053be074af6289fd91ee1a77c8a15324a421248caf08491d54a15fe10d5e8c1cf7a3e93f294fda80671e5a84a15833a84b7b347523eab99911633564ac61a33d6ad91c51152e8810ab8f0c4125443746a00c4440c6014612406aa7e5a446321f54228555c0527c260a206ab954aaa9094a0038b903881084560ad56aa093ee0fbeeebfe7f7cd7fb6a09c699d511c7388edd671fb8d9e3f858c3d5dedbbe0fccc9d8abf2763accbb3d577df0bbfd06e66cf6061b6221154338d222947b2098937d7c63393c91b02c1be275b7839f1f289240f1f3d34a5a4597e64a254e2c6188005702456189bbc11a05044890f0925c3ef3b86e3d1f68f14714421a6cbee66bac909ab7f921a9bff91b2b04072c54a91fa21a5d2e87356caa1004fc0d3f33a35263eb229c2bcf535882881430254fa2b0002b943851c517432481c47cafb37accc73c4ecff73ced63f064c721f7f4733ea54328d371c8f5c931ef1cce39275779e78c79dff198989898d367323230d649efad4adf2fdee2a59779af54bd55172bfdd8c57c94de8e1be9a524919e8239242bc32f7d7fe947d2cbd82ed6a2b79a9764bd6ec22cc3fca592cc6513934cd48ff0cae21b9e81396c1be6475479774cee83764d384d9f54fd69ce7c538d79987a7a8f3f99dac5bc558ba7eef4fdcccc33f7f4a798dab1eee94aa0309a5ccfeb8f411da737d9f1866b7ab9c9f42f2f4ddf6272b9a6a72f2d302f2d3024ca4f5f073f2591a80c49c6c697aa2852ca325486d95469d842181be20dd7e569a8a9379faa36f3b924365fdabe3b9260c8e41bf44b243b06b9a4d2538f3f93c976435a600673681742d3934aa00416b8d8c20c34c8c2147438020b24a090842788844168a8517da7e949ef996a37b485d064da82dc713e69d6f1bbf349cf608ed9bd7e7cd764bb212d8435d5669248964b551cfee61de4e1006ff30ef648fd8d15f249a14abd833d6adec60a414012ae2155cde378833914d4f1f2ce2549959ef4a612c9b46911927e3e3fbda9356f5353cfe0034a6fca312fcc9b4c3fe49a5a9ec098bc558bed625dcc855ae401874fbd047938c0d758217c854e1845aa9a97600f9b4f59212623a86c5e823d6e5e08032141044b75a3138e5dec4a92f521a12ee687d323d262ff92dbc53e26e62798c3efb4fe7222ecc7e16d2a7080bf799cf6b22f556d5e8216a8f91b2ba4c1500598aac6a6a67e92240d9d355ea68eb38e3335f307a8ae85501380562a1caa7cad562aaf06870354173f75318fc8edd04f400847aec5b51a356df7844bd2287f6d2f2ea28042c8c80fca90c5189e206206621c6102135e7cf162fa36225dfcaee9678ba697617a996a827999e7bb524d30bff2a7f74a5008477f7936a8e82969437c8fc152a985c697ea8c27493067864744a7e43b2509e6c43c4e93de93d6b483f4f475909e32935a5e82dcd24d6ee9713ca69a9e34ca54b25d0bc88e93e9573e47e671dc546bbc4c95d7461db76e46ed588fd32f75fca1d2b57e3a22ac46491e8ea8c5e6c4e8221c3b22b7bb221a55bfdfeb88342ae5fb3b1d0fc25010a4b89e7fd4671af19e2e72f9b2e5b9f385e5e9f3dbe71f7d27075f120d98524ccb8fe2cbbc9429d3e95fcab734ecb89d2c8cc9c23c7fe9f4a56fa9b2c5d2d8f2334a92be8d181b84de18999ac2138a3648df981f594ef465be411d3ee6cf1b637d983e6696dead95f9f145c68edd845e93f551fa98a7cfe08e92f5319fde18da6283f485790775a0253bface3d8254bbe79a627780eece7d4d9ea4599a738eecb1c5f152e9536acc4bd0597c43fa39fa0ee9bd1b371bd6bb09c98e4c411dbccb96c4757ec3f87736a071c89c73a7543beb3526e653de59313129393156860e74bf989af29e0475f06ec35a9cd68fe01b5e636bbe644797d4f3cb66c6cbb0e396b236fc64e3655a349e56f1bfcadbb1582c96f8d48e33b7633d3f49e5d292a5213b960d1933be411da687f9af7c3b16c9b29dd62467d8717b7919d6c68b9ee8bfd06f79982ac11ce2d3f7b68fc17f986a7ad6767a69f94ff9af7d69b5df9dea4b15ebf863a653de8fe01b7953de77ee3614f2a5f1d1a87c6930eb7a4da3f2e5eabc61ca7378a2f1dd77ffe2335e1e46c6cb68f97fd1c657faa4a794868d225856c70b5ca64c9932b5a69827d9d1a483e9e9bdc0f5373dcb0e99f7181d484f75307de9e9b64d538cdd61b225eb2f635b5a52682d3dd31696a00e2dcfd647cb97ac0f1b3333b7c5da78fb55a46143c6cb9f5e144f2f0ff3127cc0cbc3fc0b0c0c8c06f302f3a7d7604e303466c0d8197fea19cf75c68b773a9d7efe683444dfca78b6a61d34de9fc6cbcb77f425a8038def9ec107d0f8ae7b9ca6f15df72f263b0eb9a62fd571e60297f4311e13030363635ea6ca1663ece872e7a872bda5c5ca3c4c952dcad8982a2363e3491ff335552c55fba4caf236aaf8a65a02ded139d0d8f142d241f6cd419a759cd9e15fb27d671dc55721c978b7332dca789c26591f2f4fe365d451b43f66ee8bedde3e8e8f6a78abbc2a759441d73e4b1d2f70eda78039a71f33b704bc63e5d278ae76349ed66ea84d3f6e2de4ba1de9dbf7ec13c249e2978919372945d2dfd2e374b76a54c98e422e932c47a3cecbb69be2d5fad2789cee5e8db2dfdf09f5cb8e51b9f6657fd7feec5417f353bf7d2b4366dd2ee6a9294ff3c7993bc70b5cff8ef1582a9ecefdae67b9272d1269941c65b7caa16167e4addc13946739272dae1a85628fd4788a1be288b821aec5b93c25b9a8820a927881175cb06304553f17e4a91a863082188a2c39c2041ca8fab916f7b33921e43bf335eeccfbb0fe19dc31f3d6c9ade1ca2b7c5cd7e7894f4b860d989ff1a7978d129fc6c3a4f0843ef8495f7ad2732dd512534a4dcf9564e525bdfb30591f76c81f97f43962def4f27a8cfd71fd4d96f4a64f794f4a60e6d96775f9c5a22b8ec0ae604228f33c0677c4bc979ef44c82c7e9e95faaec03df1da6d20e137f4c1d4d5fe329e800982f3d0519c017e6d9a6f084ef691484005f2ebd0421c01766a45fb2293c21b53f54fe25a803ccb3f501f325eb437cfea13252fb43e5daf869c71f2a57fc1a4fa38ef39edec11c6602ac15a8344db3864d903aa56844000100001314000020100a0744a211a150a4ca6afa14800c899e527a5c9aa85992c31452c61863880c008008080098240900d3c4a0190bc5f8811bd27057cc12c1e23d3b8932872504bd8c1be85aab93a8e94192cd753f76fdd23ed920deb5404c58354a8d688e8eb01322e2c8daa12bbf94096ca649b334780548f9f193fc4449a0d4252c9b0a1901c4670084f28c283bf465c1b688d64d81420a527242ca8a66711617f0b20a74f68bd2d5ac0debfbf8424ece81a1f5fe37629344b496702da8c79e96652514d611d09433d62b104c303a1fdf9b7ac069006f7a2dc4586668e6360c39995e48b901f97f2cd613744625821e4a92ef5e386d3086974f816b284aefa8e341354170e41e89bcab44dd82b433888fa4cc4583265f5afe5c702c87d57bc9efcad6515da0d76e666a54d0c2b45480dec056d2ad180df932fe44add35d275f88424378bdac82bec7f68dc28d6d80200ab508e44024e8575b75a8b183bb595d4d4f651d69070b9950a7fce124d247c4be970f6bd2d03dbd51e63504f580268f56397bcf54e1a13ec443552b2a99d3c55d6f2588a13373174710a95340f58eb9f61a6074139fc1f4a5e43352309528b500589617749187d430b56ee794e7b62be49f017c0033dd423614ff1ed4e5aa3c6c6af20c3653b5ff338ff63aa5bd1d5445f3d10a251703a65c24b20a66793450dc4f5d1ca15abc32f63278c3028a45618f610204e857bcd3b9300d248fc67390d6b16eef25d5b01ac7923ba179de121b02b3a02a7ccc1846da085641cb34147d981b3d7debcf1c98580f2f3706ca6ca777caedb2092421df8e4d12a48cfec7921c6ee5ca04b46282e300cc0a1c005cd61ff86d7875d2d12b6ea2994bd5bfcf8e357b23294ebc279748e9db741013d32516f1b4dbbf62061c55a67ca8c09af75227024cff112f42782fad2ed8b27ee799f76f52447e43cb4bf90f2900ab7add106671525470e89b7953a64d2135ee226156ba3c4d4f50d65505bd8407f339db0fddda432f8ff7633ec7101f144c4d6a55ebdd1647878baea3ac76f8a337eb231122eb28faa28b158302d4e1a1921b160f2516a7575d2452476054b566317ce2d244a84053efe40d5242d7f7b1136bc038d5bc6d785b74daea1b89f06573d4d435861e20a6801f4cadda1428956d588448d6152be60eaa9f82e904b2a030af13d35c2f41154d894a01e6a8a86bcb9d94fda14d8e000200d9e730c73a5df40cf8bee0d9a798823fb99d88a86213d14c2072acf489aa010b8dcf62022438e1e80aeecd5894a984975453d992ab993edcc6683759b95029c60eb4b3346dfea42d5a0b743553c93ac274ec41355dc0f506ca67b54361409e9276a6af1aa575826626245177467aae05a5c6e91b9ea0456b417d217f1bba5cfd0e7768a53b662603ca8fa494e492b0197a7137988cda43656927d00132d4bf24985c62c8cfc387810b008aec84b0885b6516b50a4a78d5cfb89a19170c74dafd87ec13a9f8b287418744137914f91e38fa1d33f4a172ba663e59798da4771e195357b0b467d6fa008d20f85e818a1aa15b77903a8361fd545b180bc1103976fe48b54b2aa7918062ea53225a049feb2ec305378a3fd10bc6f167ef8dd7416768635c647278a9faa8328cb74c5305a7119afe6113fe6cf56fe5982607daa765db4a8b566a3296d8a70cf22e84744aa57097a43a6884c4f41e9119b6f35047f5e7baf2443f9c5d8b868f20ce593b3dc236214efdc3fa2216b4d6113de6687d532fc69963a01b6bcb1fa7ce01c485e675ba1a6b3e917a7250468c4deb31cafb938993f618f555d73f06468c0847120130121436507f88cc0b65e1e78c076fe1b3b62f6e0026c6954a00bf5bc1920f302a60eff32e66282b3e609b3b657821177e0ef0a563bbabd287503bc3e03867abac8e4824a28d4cd1db21a9eb6bc8305d402ebc717445c79a87e38c69562671b72b38f87d269a59f357f483469d64ffda0ecd4b7e60e3e00cb98b5207a84a6af5a544b40933c3196156281bca747326a8364245fc584ab532939559c694d008f979a82a0e4efc767606c958059cbdfae3066568857af4fa0615ba55910d366984bffbda7208fd1d43bc606ca49d00b5126b3fd4763d78f5d310d4f2035cf2dd533b489d32f88b9f521dbba449cb18b7d8a5db472b328f8c6d05b87411e5ed6741931e0a078257b752e96cb7e516e6cdb38da1263955446c38926254425e10eda9564424ea351c00206ae16ea4aa39e382b39b501b4ed60b5514ae347118a6625ac3d3a8f2994189c039099f8a94f4aaefab65c3e4a525669f83796d45eaeec4c92fd4c801d3c09befcc2601a6c54695526bf35f42bc02aa790878ba86d47b9dd3e294c499aedf1905e5c82be87df504bd1aca3c5e5489831010bd025f19eb3998d451fada7a24e0dc3109088f52d7e7b12dac12e6b8e758e668b03de8b9f698c1aa566e0cac7085412ced27b490f586d6153851a3b3c0a918f2770d2a4a7b062b8edc23d8289f99669701ef89a2405dd2cadc10a3cb004bb2b6477b71567d2875da378c4d6e350d6168c50fe4bee44fa4f470a3d6867d6f06f456d080ed11d7130b07e0c6d31cf1f4c496d4419e2789f1f38df66622723ec335876f857c8d7fec1ba3fff4df417f95370996b46532fadba7030d2d85a0aea55648ef52f2e5507432b0ec9b044272a20bedbeca1245a881152dbfaec391f552a3f5d1708553a5a697c2a040ce6186ce23d4f31537a900da219dd06d8e437283b21cdb1e8b380b356f68cc6cb5a71db16f31a8b28c45d52c20e970ae0bccd8f301709eb174b031e535bf6eb68ad65e1720a8ec169321c94db8ea14479f9825bfa4cbce7c762803694defc65205cdf791c4e7fb8445677efd21b4cdd3d6adddb8a03436cbb7becfb0076505ce54d12b1ce7c15ee2f5a37b6def7156c5f1c52057faa6ce020738683af291420102accc1b4f5787759e227f6e49526508a456e044ad02f138376567249f73a025bcd0fced45caf97365c3357f3967fad03c981fd988270b1e1d2eef7ce5cdc5b7e2a9c676a3e424194910f7c4d5edda9077dc3782c56f6c28316c2bd12793819841d47f616f11da6bcf1bcaf787b69b0944df49694b374adbe7aafd885264a0fd6591d5c39bb0d0a3c114f18c32e9b8c159cb22b2cf02dbe04d24f1ed2e55778310f8d69b36d8d3ea664a147a2d32aa2e9ed93c89e493f2562efdd504d5fde20a7b105fa2e6a62f7475e0f59f398247a01c6458d6c688c2fa69606747db84e0605d77d191278804b8ddd09326d5e6c32cbf97237d49982835a5c1370a8d5e709da063d65e79a68642fc8ea5f763fa522b3ba0a215c6c520bc67092cc6b5d0e657026259df38b08e3f12ec78597db084e5d4ccbc36a30d04a7a9d1d49d84c66051fc03668b11bc191ab6e83965d3aad96fff1a1cab60c082a7516eab2879ba625bb9d43e2462a3dc6422f81feb8f77f7e7368bec2bd6c4d2ea831191351aa69adf2698c57f1ec7646b76896e2d713b88a1f80960e7261bebc3f8cea7e7756a905623ebedb64b6f66caad0513d29c7b2fba583252d275aaf2277d154a74f7341b0a1a630dd50ce2029237cf7318ea7604de57a694e01c4217d52c1d6a0e9b19f4317a15a7ae1062a5656fce1518f12d7fab5454d0a03494f596b79106308681c51ef8c2179c71a9950f5f480e785091abad7579f3b56939a02b9ead4941e0f5559e7c5709f8aaf24675af84b171a2e49fa22fd588b761a13e007533dc415431e700ac090d57ed0a2aeae677f441b0f8e02a0d9a1bf8d6b2c59fa48080a5251e4577d78a444dfaac4b07a9b86cd3f0e867ab24816bb505d44ce1cc601e84f5fe0bedb53b984a5f3500536c7c4dbb0bb564a912f512a337126d0cb1fde46e84fbd81520082e1c4826a5cde8750fcf8f37f93dc7837d542744c9b5e661e88360aee0a1020d5be7a8209362ba61e6d4c7a9817fb9a2bc9dc49655310e674b6482f2754d7573b5fd6f2f30608f487aa189c654d04d2636f376f81429896af147afed3f6149bdea363c79db0369d43243f2a57f9177d5b1decef33ac914b365c29256931e499c9f0d864ebb5eceb6b144bdd854bf30753e246a7cb336ccdf83c429abf0a409fc333c1f92a3b8a95b7393abb61acc152f71ead427f90643df8998db83b2c9f280b120d2eaedca8a56ed394ab6c57343ca348604aa9b9b53720e423b2578a100399295235780b817a4c133a7431343a82796d8c3c05e07ee78f6b61051e5970bfe6ae44d53795669a3fac06dc5130386d0a96c2492fde52d072a7b8b2668a1182a32833ade80b4b8ca7202f148ce5a40ea87e28d8a9675b11ec8e5087c0198b49c4455cd92ac3a1e7a457047f247b293775293c63eafad527249221a13c14841d14981dbccd574699247634f464ba58d13f14aadd177aa979ae846c76f214b97eac6506ca0fbe8690ae81d9ba7b109614dcc1580e41670c3e141ca8b7cf5687755af94be8acc791cc3a66a654c371918134acde18d3578851adbae5ce4f0a23b644bf995bd104fff1ac507a27b07fc9a7943cf09f82678aa52a3e6a3d6f0cea46ed3d0a9eb5e184bda5628fba4109727a3d28afe9d810dcc79e7048187405288d04eb79152d9d481107d0a618612ab042f4d2659adfd12766d5a66f04908b9211404a0f17f739a82adb7a18eff9861e5908588760e376cf184bb963dbaab7caed503118da2da8ab7b5ed53c8caa952139f5a059130048805804ec5f5dcd082a441dc0dc9b4602c465bf5358247c694c8cf31952dc6e0fe2f5c7ad7b0ddaa10bd7789788530ad656548e26d436295a0d91931fa0ef45da7fac5b86162d2de8a985dec2858bd47f4e1f6548fb43537aeaddd15e46f4e92a105547c018963eaa249d289f678a8809da09604a538d7461c58c4afcc9cfb9e4e3fb9b8ec4c0a6e29cb0b18f784071cfaafa1b097d71f368f7d9a6e854d778e26b8daa12627d5c7d92049cc7e105dfda31ca2f5bd4cc88e235709032638f448fc4d2b390f35570184e5150196bbd59ff9e8d49468ea5346ce1e1a38f177f9058813e9328da39f2c8abe73a01e20fde7d6938b70a36a5a05fa1aa0174209ea0a18045a57e2cd0d8733812272048fa29086fe85ec26536dd11b5d7f7819ca11b4143649c7ba89ba2e9d05034ca6c4bf5286e8e86d036c6e2b8d01036faf17c3512ae092d4bdf723b7f8f749b6b7413c6aa1c45e7d0d942c2da4c382a8eed145decc1318d1e9362ae979337930e9e9c0ae4425c887ae67e35e7f695d0d27883508efa719eb705af17424948a4067ca68c329bc2280613a3b27d3c5fcdc5cf3dbf5820c0976248fbf6be64c80be8c3b8583a37d6904d39992e08aa2dd45eec9ed00b2c6481c44f4a0e402941b46ac8b9c45e78fe56956c6b203df7cb3de45b59de49f1e8d9313c234ef274d8984674889a386eaa4151bdb2131224d38f81d354fd3c8f9b2d6b7a31e7d3251e5682015fb43858024b1166b7fbb7edff57489c9bf4b59f0ea2692b98579e9769fd678a35172ed98d2024b07f4e8cf4b08804810c07bd56d848a1ac180544a21b0489abab9543a88e1132a9b3c4e8047a23a1c4708f354c7f932a694aafb0264cda749cdc379201e652c2c5dbb9107f227cf44c709afb44417cc87100547d623d23b9120a52591b23e44e6868e89a97ac21a0f4b27a531003a26d6de57d790d624e7495edac913af3f93850983c45a8e8db9d43412539d0c6426268724961a95e56ac01838f3da36f6459823d387c8e29f60d4ed040c6b3844168d177c207bd1f0044d173e732e7172307a4f8cf8ddb6e906ad29212147ebb5739852b97128e5bc32e42ffd16c33359fa03ff42148cddd5b69781dac910517a397de05fab7f52e9034cb73d112a9dcbddff8e65f1f8405210e6a184fa3db4d44b87975a45cdc944ef0d5c2f79714151b25b4d3e199686f925e9b0cf529b89ecaf014755935a377ce021ece521f78cca68a5193f3b95fa81f48f440d0dec37c31f59548637d9a79f92950729c47e386ec9af12e699454d733ad453a21e4547042b18998ca662e4a271aa7e6f093154cd1ffb204ac0a599d77188a72ffcebc5947083f62d86e13e9ea223ad77fcad97ce809a19160bd6eed3a21a8dab9f9f13b0abc316bd3235990baaea94452e37d8406fd4b34cabb020f43e6448f3f663aa73e96548643d8865773235aac4b82654ca88adc06b2bb8941c2a3e2250345dbdb141d58d310d335f5f820624bacd0d05fb13f1c1a125f788c23e09a0cd0a5165dd47598371ef2115af9b6d75edb644f233213348e3e6f80ed38590672a25a89ec111aaacc8a1151deb4e9fe28d33a32095dda42c00ac65617bdabf0cfeead7dab328e5e40222001b5d27d8c41b46b2f9096b301c2eb56bcd9b1148822b9156c8072cea8536e86a643ac7d263026c2844afa47b4c16fc228406df729b001a905e9cff22df19fbf4d2aecd6d0dca9d8627e8df88e47eb54685ae3d957486fe6c2cd70ad5e7e975c23a871e88f613d3828007875308d5534a0801b15171540276134a1b0c40192567e268480ed35488832a1ba6c0599e4e859e9e51a977d84e284c0aea57b7d23f2a643d39b04ddea63d4411e2efa4fa14ef2bf75c68504e34935fa77c3a27dd032c8d14d6c5ff9eff246636a457f8a90b9722cf77ce5049ff234ec7d265b37651c061f3f1b0d4c2eefe594f824a4b22414fec830163470b951b1d96e394149ef67e57c4356fbb630f576f9ad280943deaa6253afc17c299006da5cdec371bf0bbc2958d106f51c9936acd63d1f67b51c912d4972e160b2c83cedfdd2a98c70aa5fe769873bb80b8b6ec0ac66aee0a511d153e4da2f5042d82f1ab03bd229d06109f2865d09daf540c8ec6d3308d706aaa02718b4847073c9c71f44819ead690bcd214190c62507ce7957e4d660fe462231864a6dbbab0cdac3c83549726b78e7e95050cc20e5089f08cef76181cd06ef3d62577873158e0d41d35316447c9e7f9a91bee804811452ff004e84b5ed3051f0248bc8a080582eea2543beb96fbff3402415987c42e06e2108453cd4910ae53df153fe60ad595e919134b6fa88b3c60b85f1a716043db524ac35343c8169c0833e09a6b2b7ffb427402703679e7246b3d92c8dd5d1724b9bd4ecf92ba8ae8a608f8b767280b27956a0a49f2786928d1edfc7e9ff390c3a2b36ff94a6b2490376e09dd5ac1d4b265174aa73b66e593b898d4ecb7f55ba03aad67cddaedc34330c4cf663979d6c7ea4713d120018d1393602de3e7ee7edfab31a63f583f492ad092bd628c06f0fe653bf5041bc3f14c4a9da076ee6f29d602b4ed24c330a63caa027ab04e9875b3b1f4b1bb8a456ec6504e7fbcb169c75a17051c21f02f030fdc0259a91cce06109c1ccc6f3fcd0cb699f6c87981cbed598c58ddd044d7fa0ddd2f6f8a8c19f9527413b996751f6e4f031d47ed28ad99170b8eebee03a306ff22457a49ca239f37763068d91d399e88e4a2e15b02d082130685ddee2d4d69e8004fbcb0ef3af841b04855f43f54b9dcc07e502422b98c46a117d124be78055d6635ce79d7b341c16c60cefec2142c58fb6f80ce09936cfc65794fa61d3b246e0c309f1d7e439f3a40228607121566ca08d37fa2946c02bb252de4110b9d7984e55f1d288aa70462b5d6547a04364e97ea87ae36c006d50b9c7235d5622a7c102af345d1e597baa597341f86e3e65b0345d8207128d826fd2b32ad1d7024ca232cbd9539b8d8db4033dd9877630ea0dc4115290af78bb1065d3a2ba0ca0606889ec970586c6778c7cc506ce2c65f2358863d4d86139e5f451ffd1f385077e801e865396006b817b0f6ed9cf3c5d59cc165431db143e106c1192e8bf936223d347cb4357e301a6e6113d653cf200608c68026a6b371e6f9fe037e5c502185d016049688030022145e4b425e639c095518d07f5d0dd74da5d6154bb1fddcc0bd2024606474a67f70a391e5a37aa2a59fb711b560870d1c9117145258b0b2ae9e29ba232672e95a4a4a8b27765ea453d3f820925cbe532dc098d8995cd39e122fa76dae182269bcbb25dd8e24b1ecd7af33937953e4f34c3b2c3696a55ed0c0838571cf487eeb42a4bae3e5b27bf1b4cc89d62062417e15d4c8b50941c044d43a456cfe9417aad4fade9573a5fd432d4668703b24883e9f3c2ebe8d7636e8329ca10ebc91df57756378cc64097fab75050a9e9f73fb083f7005b69d329b7b3e8ee1c3f48cc54a3109b074a96c16d18fd58ce1e7f9d365bc46b5eb1a7942fb5b8df442ab7666e81c0b16a7fb09b8ba0dfdbcb5d8e533d8308cb206d83701c6128c9b1c5c62ea59c3491693b67555eebb826bbc0295c3e8e5f130cc348bc21433b5b74e46d34da912524520bdfd7724036bced1b8322cbb7faa833e73a28e8a701f60e5ca5c41bf3738ed89ead393063d6664d3dea3b75d60b51dca39615161d2faa9fbc455c38ae373cf6afc7fea12e502fe13120795c256beb8004cf644f80831ea0be0d55016c252aaa1a2cc7c2a712cbaa80da5586867fb3bd0eae76754ab03c455c6d798fadf9120db4953db30438c5e0dea4f03f1d0d5704fd8c655f29d1b2632e4e2147ca413f47775c52ea142cfd4beb990d063eaa18d2be9aa9296580e1b6a214c7a9f868356a4bbaf6f062da082b04745f3fb64ecf930647877215c7a5a4b9055d57eb4208fb96841ee2e09e5e3ba483a4e0e77f8667250d00090fd74cbcb00ba43370e11026f7459593e439739a9fc7359bc4ff719cc7a864d7dda93e7009af7c3e26d09b033aa40477c950a8eb2882f388de12084a4e77613e80ef282d89481da15b43211443742f4cda038ddc28298709ee90505ef3e68e31669b54f6293c53fdedae3732837a980b4484206f6a4172b7323c538c1a0f734abd8186a003c4e5f8a47defba96f7615ca0812c676a5777bec99e249956f860826690c39265b4740f45ce8dba98b983f2291a3c9eceba5cd218fb11193d55f6ab3ea7c6173852fe6eaa9f27b6ec5412876732cfa531646fe19014ef5acce33fb7a336557acf2129acfb43c5b715e5e615a3a8402dd08b04a9d727389f4259fea59a4aec3024a3bf04d133e1df94c836e66102c80337aa7a90981877eb936391b264d770d730e9583166289ce36a6cd5eceb87c76561a2b96702dfa7915b92e0034ce30bab8ea52702b82e6fff86b9ecc1052cf5c41f29ffe348923a3bb0fff2abaca1e997b177da8ff87324342d87ee31a87e70d7dc531b0784ef74099aff1b3998b4c2186a1d783b39d0703ba20b0076ef0091fc087f50ebd1eca6f94a3ffce876ef7508bde21312c3afd0259a82291a6e10fd1eca550aa4159529337c09b5e4abf15eb32f962b87a245fd3e26335b18a15969af4c263d16af7c3305108445a408d0e3eda8806e9f141e49c364b2783db677ebc2b50c9325c2ffe6763033ec9a4435929105c645e09f3367744d90fa1e38a9787346dc1311fbbcb061598e935b3da5cc164d7443067549c5af4d6e76d014775c011510f0055b13ff2e22addc26ace0c9209852d0af4047ec8ccf64720dc2c5c5404d9ffb388fa8ee3b879c870d33ffc440f5d067a1416a4cfc009bac76a7b1a165d4745871640ade788dc79166a1ad496e8d961c3f581c77282d56532ed6924082675291c1c613ee5f6df9694cfe5c3bca477eeb3edd9285b34f8a7c014664d13b80169904119d10c33065c3af64d4760740e2a47212b8c351991aa812122e5ad7007ca8d39c094a80b1232eb9b851204f792a79c9a5e19ebc35cdd3b488bf2240f09d254137af83f6ea23e937effc663b4ff368705217b6ce54ede3d0f46a955549ef03007f05a032e3582ae4f2e49c90224821d8024c397a2dd940a50786e982810205680021c1654f294860a252425e87d8bed810c731ae8794f151418118685782098c21b3cd3634aa9b8712e27dae49b6ab8886301885126dd7ce8a2b40373193b835c1020deb4300da592336aa94918f0c2997e57b147db655d2fd0d8291947a5e1c4bc221d662a80a4841aedd1229da51fdad533ae4aeaeec7681cc67f4df85b20e8812813df7a3ad42783c721dcab8a53079820468ddd553a46ec8bb204cbb5e9fbf5273c4cb03c8e398f5767f87d13c61e0edb7e8f95c9740633ba58937a1eeb9028d8db462015ac530217405695998a84b33b29776dc7515fe897e240dcdf1b593ad582d00718abdd33c74cb2429b3eec4b99250a45ff9704e40a71c9e8a28b534c82726ac361f4029166c3c918323736cfe541b068361ce351cb497221892444e40ddf23a7a72a2ea058cabd967e14372063e19c0a2130974b6b403bebac61dac2309fb135c18d98b3c1d302a1b82375d784b83fb13406cb04ffb5a9a39dd602de0564fef30e4ecc957aecdb80013d6dffa1cbe64e4871baafb96c7fc5df4af4954918be099fdd42dfa689fb61a1d8f0fba0115bdceddb487e3c7667014c79230823b95ca45212bae70b934668e60001142818e63801f56a4d9a527ff7e9d57c0f13788b45fe7a0c4d85c0b29fd0f4444487a2d886f213d986fc4605ddfd26caf5651193aa51c51aa171e09d137faa5647f7b8100b8085a31b98521fb34ab89e260cc61d7c169a5b5d809ce77bad2342aecdae6bfc3edf289fae40e75c53063a8f614272a6ba02cbbbc01f547abfc8d15473825b4cf81ac835af482177d5154911ca3f884dab9093379cd802df5341d1dc8a9462d55cf1de6a3e9e1ecf51035d6843f6bec1183aecd4273a8e197aabb69a64d8cf78b82fee7a0314ffc2b0e0da4bee99bb216c17d8342c8d97b17641c11a0fe90e0a54f0f02dec92def6d7100f4fed5499104b35971318b2d08b0ead45c2c01e480a54ecdc3384d6da1577072418b85bfa82c17797585ab4ab43444b158866d16881d2e87d1b05305302099972816f41c60487c837ce1a4f20703705049a71084e599707044119b7fa420800b535fa12eb278ec10a22dcb93e010fa8f8d973013c0163d9bb1cea9bba2991310a6378289018f18118e103f2ff31a3e76a7cbf347c50450910002c310dc3fcdb4c7654061987b41dfda858491acfab64861e3301e95fc159d9e0dd694d98b33b8247ee567e0785a64988c5900a5e8675d965f07e00796011e42997ca4c4b69227ca6a5c0ad730eb469aa87544c9d88f1f347943a7e4ee4a24c5b8932b3255f4413964ea37b2c87c8144855d44ab5db3ce71f51705e2e4d85724f780f8822fbf4bc3a3e4700aeb80d5062b36513c119dca646c4f0453b96df127e7be203e56251e304c86f6f272ccdb185dbd912ca031d3f76710977f4a2bcbdada6018c120b38b80005143174e02dc9df80e8d1d7c31230332a3882f10d583b317f00418d9dd787f34e68ff6a5fcd2bed1810366c2af4d84ddac57b8a33583080acfe8cb474b7ba201287c395eb06a311d8c367aedcaecb9870bfb7a172cdb037cd5daef2b4bcb9ed89b9437d64d08280041b7e41c34959ef22f5a9591c086c3b8e07a50a8a6aa218124492c897e361e1ccf6d340491c4933f8fc10e4c8994da5875a9c4b6711fd634d933fc3f4109ac5c5fef4b4689b319ecdb3162087e4868af91d1163b316ea50fe8f746647f781636cd11ba36cf8ac202a86c74e8cdad1ebe60836012382255cd290b8cb5f0719d3834c26e47469e235b919a031ce81935b0ae551d21dd6c45b755be86651d590861a43070f3d6a414f0d2ed7223c704eedc0c8cf36b8abfbffa930a3ea70e3ac82c3f91a3096b1cb41e634eb96dae0913b38c6cd8289db68854b79350412ad26002427165aa190900aded563a55cf6a657bfe2d4f0ba3989d7494fc17dcb2926e01400fbf539a0573b122f1f3af2f686f199bb83329c0cdf6029cb9c48d7cb0d5eeb15bdf08089e730288aaeb469985ea395cc06992486894e944635e7001f1833ee01d9312eed3d79d86da7597e6b82c97fd4ba6a87f85ccbf130097842479802839e268f89c1167fd51907e37b3f5a0dc7da6d2cf08065a68d75ed23b4c18d39edb222cd19912c8c181e501ce52fd439043ef428e13875cc1b2d5a5295601e57e1463b9147d8490d1670a22598f001825624eee2809da0b5e02fcdffe127e06e003a8bb089dea9cf0e0fa7c7c31b6fbc0f0fe9d49d68d868146cad910c1e9dfbdefef9aeb9878a62acb0e494e80dacf939b1e7193b042bb7d92c63f61f06e03728ad02517a1b0e37900939d8a1fdfcb553162175e52d4981812d67567f2e1952418953fc217b0f4541bd904b4c2447285aa26df9dd7ed09cfe498f85f8c2b570a560ec69a1c6d1905a4554bb7c70dbf984e34c580608266a9542ca5d73ce70eced3124b29a3ce52ab432568258dfdee926aca5fe94b5ef0c36e21aa9fa842adb5036b3db22ce2a2ababf1294da0bd3d164e325d7f3f21ab01e2be3200e465599aee8733108edd70a00a4c97a3af50280acc8c596d1dac25b70a7ec174147400ef303e5ac3f1e51bbbec467ff7a46daec1d9a8874074013f4b4159032647007ffb8900f92ed7a88c6cb87e1b358cbda798505e9820236b991edb7a1577c1fb93d7536e059a06e534b25a821b285396df34b73b73a47bca2609ddfbaec4da0ffbc81be59c38b0eae29dc699871ba19257123e6d409df3a93ebe487277feb0e362f232754431038b85cafaac8a36fcce05f0e0f3f44642682f85f27b2d1d4e8372266e6f7f7e746129f96d1085b922e68b93376aa1a8b3f3900f3fe70ae276175efa53f36fe8f20ee1ff183541139c0bccdc9ed5d6bf8b704457227b5388f65381df3581fbf1e8de9bd6b48cbbce3d332a2c45b8253fc7c3cc1c620f4675d24faae42d0e54a166df6d44a3b437da0f0b5c1533865b83dc1a92d7c181cafcd4f8f9fc5ab36da18f81124fb506576e29dc5ff317dcb57824496d3df9f70c2703fac289564e0425cbb1d8e4a69714da912ba5a1167ee13c5c597b0fa6587b47ab93297f8dbd34c11d9248a2e5e82fc9244e26899c2d9781f99f63edc7d4837ad0a2b07a2bc00251b6d73434896a7d282f89958bc0622e3f9ed10dc6fd209a6a9188ec8bab674f3c7ebb066df7323fc5c73ff9537abb08391e7560285c691d30a81f734ed32d034d3a64f8c385dd6043a5d709385c6d116c91f9a683b0f6128af9d0af482cae83f11d8de017a9408af6b9bdfe40895673feda7e15974b8b1f11c1f5bb3c60b6d085440bed380e36ec298ba396986ea6b5c34b8c7b68fc90ec54d2bd9e311296ccfd53edf1b57ad4272e44ae19a55485a3ce05a2c1ff7529382ba3261b1e5b2bb990640264dcefacb15870883b0bfa2e636cec0223080fece002e14df7a8b2c1ae448918bc691e383bbffdf4dc9ba2138019f27c2be0afbe339aaa0c1f84ce1289056f5eead9975398f23cd11fa763dad0f44f1d24361a28d03d7cc16e23855e94d7dafe46006481372a650ac139ce046864e7e1a19a9c52e58e37a343673c40697a6f4035ffdae03f54ae00a0d942e83edb891543a7fa8adda5fff4d54a54ccf02526174db511169911ad2172ea41922e429bd2804ac93b90d0b517abe110ac12f21ca409755be746312f4a9c9b81201519a29107a433c0229ac35b7fcb390ae49586165480b48a0157ac8ef4598381dc1aaf5e393021a070723f24db214bb53a0570d83dbe91226d672977c31f064b971781dd7f106db7013e2767237a27154ea537b41966e31cb046b8ccb787632b47318ec4408f5e30a32f3aeebb215ee72d210714db807bc40d2cbc236c800d99ad0370dd40c8dcf5018b5f81e93e001aafdc816cbf15a9f8ccf2a4caba2e9aaa80d4268d3a2fc218fa22f13544b8f2a37243aa9536d3102ad3a7a9acfa39539919d5d3fc32893b6e01aca940bba98a4e7e12718f6c755d73bec071bdfe8e7232c1eb625b85c17bad47a736d50ed3efa1e0c9ed16f1bd26cf9553d65cede6e640547866ac5a46a3eaab499097e3e91f2ea6692951076b175db849c0dcce3508bf31b79f9dcead1de0b1d49f939770820e7775f4e08860cf801060f483bc2573a006074bfe9b25a9cd4f0991e10cb032754a8b60978007c13a9210bca03f9748c85051581f299d34fd1d303e396065fdb539083be7c798924285a68a5e0c33510848db4272b39898ac49190cc60a732dcb68629627d424813648826c999c550149843af62487211d5036b9f145a79edbc1f06bb9e05ebc664f4a4f476124e830b6fb19b67e2818a7e76d792bb8f99a397f1aae58c49c1345681ac4eb683ef703bb3dde85c0608be3ec9cb59409628fe2da025e03d6313ef5d97e5eeaac99fe9ab4344a9b6e0158a0a59e9c607a54b84b8e91a5fbe4003f89da405bac357193a97d349fcd9110928604c742d283019e18aaefdf435619f8018bae112ae9e09b196a711908b75f6adcf0c65b27793da6ac17aa0588fcc435007546841b08dc1fd04fcc8c3513e3a8e95c2a091859d8aa16c92852ece7f62fa315c35366106a9ea5beefc8402b762e2f17c0d64866799ccd3280d931ecd097505b0d87959787722d65f86606b497273fce0d486c3f0115d84648b960eae52d51038f039202661093dc0e0eebce65fbdac8c8d3a203e366a808bf79736e148fc06983e2756f30aa302dadd8cfd7f82177262c2d6555279f8ad6dc95df0be7bf9126b6bda2530aae0b8fcfb96555f10442d3fb166ef50fb44f80f15abbcad582efd0b466d725181507ea2656fc3b1a7cb311adcce9c5814647b2bb5112ee969b13a222b0b2c1a37319e01244d3b6c3146b1a901cdeb0954d1d07563f94c503091deb5130ac0c274d99422a13eecffe738d6ea982aaa5b56f40af822cf978a1f75b4ecaba97d00f882cd2047b1bea7fe9a96661a2696b502691a587d12b07dd8674043fd21e26af7cb42ff304d213a32de0b68c24e5444bc8c30902656f172a70d564da0717ba1fce59008c4f5c425907e8a7c5e30aff583966769cb9c7703f09f8228f6bfaa975e329334f8f6e8cb4a65b28267ecfe1ffd4e3057a5acd8cc1b4853c2123b81f6c473b802842338729aca96693bd31d4b3d2281fe69992ca89a5f87973803359016bc8cf5994c02d1a467728527336ce7da7686cf679fbdbd1f9678bd4cf23b44b88ad0ad7d564a2e89b50c0244cf6fe909fa311aceb5d1255572119818a0e1d00d895a3305d7d081b6c842a25f1d38d62e18cb0f77a1cca6c6768217c12e9e0322ac31784a10ef8b16215bffd6b66040c4b27c8408ed853d5bf17fd8a2340f0a9a62b9b4ad917c85478dc9f542dc511a900537fa4ddec34b6242ecc4f46880c5dd9f918fb4aa371e392687bfc94cbbc732915f865317e522574de45f0154bb12b7ee8b0364a2016a00dfc8bda2a501e1b63f904b4a0069cbf29a34a613fea782e3897f24909de41d2435e2247796726016bd5c41c37b0e05cb05e7593f05a5bdc5aad071be3caa62c8074bf917189711f1f5ebd8c70ee23d3a5dac68ab2b42347de35a04e0f8013e19245594d2a6b2ab0caa35646bcc389ebd925c282323670de26c35a93e3f0c11817ab06e10a3d541ecbb1a4269ba39493a4698c86343f9c41a353d3b098b93c6cf011e2b61b8c10d62847e86556cb527813c6e1065b2cc231c77e5e89c18d93588149cd578cc5783809ba6bc7705e93cbaf1e8525c83c8a4842a72e437e66883389f7fe437f67987cfa08e6abbb98902610f7f06c45414fff4ecae5683e7342c57c637723f40c6a567dc30b192fd412318b815ea56493f3c7cca00620723ffb9208dce861426fb2db74d64e2a30276e4daffa80aef16577424129c187a85349f02b6f5ff112f25f9aa08e3db4929111d868e5bb8794ad27c71074a37f76333417f6c6db3a0f2888e088ef6f3df00b62d8020ed310b0a8c8ab96d9536f325bc7da838ac02f901dc4bf12f99823c0af292bb7635a0cba5e86a8280e526df1c145ddb5554d61d4e6221fe1f583a81234e0da93d976ecc0d72da360d3a5db9cbe46a4e49a6259091beab84ff2db8bb1d8b3aa11770277c19fedf2f1cbb8d7b6e4e45b38bf154bf2ce8ec6b7ee54a1114f58f56eae278e646d8c48d358c0f4e6893faada8cf82769e50f4632dc5096ef2709d0680c4c65ab743486516251c7c3c6e4d6ed1824e4b707cfa66cabef6a607bcf53ea87e9b10cfa1338254f719aae4ff67a1d0cb6788f6cc599b711d37e718fab41685b8312e98c2dc3fabf74a72d7dcdf4fab7a2f165b0088080be83b770eebaea48e2ce8688aa27988e011c13ea473f53e3219bfbc367a2eeb488ef2c2a18f5047c8fa1d19cad331a8973c087aaee676a0db010c4a797bbd28a5934279b954b3cc4537136138f93e7f28958b31f8611c92e7c92c04281e280c9b898224fb435a810d84ecc99036a036713bc42f97c18b9e85488ce42b090e32b61f7b65cd47b22fd6377d21edcb121e9880950c50741f25cf82681c4d6e31c8d54d7ad0285f88c1c233b4714e2ebba5d04ba78cc4cce5078df80a1ea5d265aa5ec3252556a23eb2a37209a0e5d5993266b46a8fec8420ce0854f5d1e4c71eddcdab17ae3b448830bee342f279f98c41812d8441335c9491f09e4eeaa00540e2e55beb5e1d2ea590f18f4a8d41f31934f246913e96151beb599b7c4f1e1f2e5cc90f3c9eff476e75cf0d378ebd371e40bb63fa5109c60fd90b1e605991efe3a15216e3023a9550437c009608fdde2c0005d70b886062115a9f1c0d886795f987cfb5a3f3b6d8edb7ba72aa1089995cc7678619cf67ce06f0e40ca55ceb896b13ae69a1e9f39dfd60e526164193c15b40705a662a36316e7e73c46cadfb1059475bb00778742651f4a0e7660f0eeafe5cf0103f93f45ebc5ffe30893526104651306489df9a7fea563a5c7ad86e979e09a8ce9c841e886262fc14d711b2cb9bf836e8a1a83bcf23dbbc7f96f97954759ee4898fa59f5b839e5db6b8a10075fe8f1e8f2ab26974aa0d5253a3df21695589e20983d92f5d80a263510e16c83140ab733e44c356235e32143512dec0e8eba0992e275dc4de60754e318b5a9a7b4f60a7f8adbaead2a500a5a7499b3b979d84fc32acf27a007e9eb89c407540cc3d01b71f79e0d9f12094c211febb89815878e682e12c212437acc05ad0baff8d5ac35e8dfa829898e8beeb071b0c0bfdaefe4bafe1bacb5fa282593e5c73e9836c4db0880839991b00222589252ce942ae8048e4abea3935696a21179795f00799dce098a513f824c125990428b2e08cc261d69cd36a52655c87b531b35dabff8be8d253924536d6beb98c69e630ea78187b0821a88b2d90c8d8e552c5fcfc97c83a0afa62a4a98f8e4738fbd343fab4580c91ab85897c03da4754532874f88bd5911410aecab4a59bc24908cdb029f85509e8aaaf1e05d38fb73f75ea1b94f212ea3ce8bab6ac2ad35be1d11dbb78d6252485b0fc3764bca78738b02cc791c13b4ec038d489db4b881f078db9767aa33faa1a262f002071640fa5e4f307ef6240284348fa1b1fdb09a3ab5e08ed21f46cdf985eed92d82a4d02a17c0712f8799552dd3acd0b6e6a4f8569d306fb1c5fad404b5be5d577851d9ac60b70a4383cf7e182c710d3b09ff150e22fe379402ea7db3333d1bf236ddf625e4c23e870961dd642c758ce54899581af4e39e269ff481c10aca82175aa6d2c368ba1fcfc2b27d9c9fb4a30a1a2de16a178db90f2297ed9116dbb529e9a75a5008f09e66cee2dbee323879fd78949f2aa0dda0a87dc18bb0d122956da2979035daa362cb8f5c2b3dbf4f35a5a4e25c367d7cf59027b58e6ad2087c6975890c0374e05a928129c2b0a46a002b1414b42a3363ae82a4f772a098341ae1d3ccb2ce5998294e69e8e45d4889da5a13d2920f56a5378112f674f3cd448a42b96810ec898e71d55c13f84bcd1a5a48092edf22046e20000c7d3c1b6a33859662483796b87499a5e38132a43d5f183f21c893a3e16e4033d8ccd6344573f2d8fe71638989fb67233a6980fb8f2d1eed211dffd9b9a6d2e76783659b79b80adeda3646164e82d4b7de0a8c138a31c932076a8c7da7a8daa9a0a5f6cc787f5fe08045d61072cbfb8a8662c9529830eb623735d5cf2098a950c4d4706eabe7053ae03a574157ef15caf7d5b1841135576a12e4da0015e22802f3a102ada8f69051f22326b2283fb61fbf24c71441610dce018eaf861e7398621f55a5ee03719a1ea56cb39a69f4482e0faaae51fe577b08c8bc1b50393d13a47130548e2bc74a46833e339f4450990e4735bc0c3734870e182f9b14fb5ca64e340e423d648cc828c541e4e18567eb5ff6084797add97929871ff06caca2333214860e98445b946fd5910e179a07d2b4f13140c287df1d064f1fcd4a58b333152886a8fdd2063c057cccc310b5881c52be58107aa02a32e1441d67ceaf617d7eaac322bd2e8b1d763417e5d7f92243121eaf753f9ebb682f41abdcce530c64855bfb1eeec7de51d84898d2908647cc4359574268ad600e87792f41874e9827dc90cf8dcbb8f8884e37d8658269d1c4c65db74e9f0fa4573f78cd5cd0d9bab3eb4e5ceb6a3350a4ce33b45af8410ca02050e2dee930b4cf341b497b3aaf9f76d4ccbbc70a0d8ede70a81f13d8720d24dffd8e687cc088647256e9790f5424b34321579c18eb5d211b6eefe90dc4df1877f71f1ce88d1669a6e210d4c9be60d1b911c5f54f47088a55017372abb6dce80cfc42ad63927d93c3bb8d5dd46fa6b8829685f03156cc89bde2f96e42511d7a5a937038802c31763fdaa4e11a0d4661423398b7e77b9c127c615a5e027b62e5ef54a48bd3e82d5dc099f40b3fab8404e2875375f05c604e4a489f31b0de829ee3023c1ceb7cd907d066cb505d1d4fed358e59e4c8d966657f28660c9e2739c6197424dd0cd637db2d5d54eda2d629ec2bcb6d945eb4373ec6661f4e7750e1efb99dbbafcb5ddd8b325c7caa8ebd4752364d1a3e296073c921b876c749a0ca6dd4d8b6ff482a6356a78a58654bee4865a8dca2431cc2c2a6e300508cc43953eb3fd800c7187014009e6f68c77d59812e9b827523e06df7080d89b130f28f8c7dc7801b84b803259e5b384abe7419b688da913cdd93041129c18e844b7752c519528cac13ee30bed5fe6c3b2aed0b21f2e24233e5eab1c7069a63bfd70db91676257b5bcb61ea46aa7e014926b4dded7816643750c48b21895bc92020bfcbd082a9041bf20a3d75730563fa84cfdfbf044bc2e101c4d0ce4e1b389770c384f24320ad4c94924081b1644d0929c8a2a2a9d9c840f5063d882cfec7fec3a80e3174470fbd45e59dee0dec0462c9e73be4f37b00a85e0a4c1745943ed69815a5980d4745db895365f063f92c166576391f91c7c31bad8af9764c2d633cf87b2fd166c8f264ec750c2af810894199c31a96a20e9ebbe159336795caf92a4341d17acb1c0c9f145ccfce0ccd4af05e073bab95b779c3b1203b48715a88c18048ca99cc90c9dc188e2835e6381c3f877a016066885b438c8fed7d76723c444eccc0190484e3df6a4162b29692923634fbdc14558fa3dc803f85906f2d4fbb2563d43e18029a6499c2907eae50bad9fef7237f589742377c4858019a425e280a2aba0622ba0fa31c7dd8fa667b0ecccd0da0665f3c2850d5e8fce05abce66413eebdf953dee519130c409a81d9c5e5eacee94debf64b4fc3a2c2ba40b3a9199826380900f9fd42417a95cf3cde33ee005e8b7226e00b9f0fcd79e9c262eef38003d09a6988c9038e360bcdf16a1c9964d464a047fb7b744b2544a4ff5e7ffcba8efea5b99a2a696cf36053ca8436756309e748b9525d8f3ecc3c908c8d1ba31dbf066961eb46dcae95c132fb054c9567ea1244ef26b9be4241cedc0db24fadb96b603132a8bd780c535e9521e9ca637c6a6816d9bcabc98b6f94a642d62d5a30b2292ad1e0b4f0020d3899600010381f202797100f861045350e7e0a0e5718b4a0c498df2841f48a19d2c4cdfc06b8eb2497f3176e4301548fb3a9269fdda30df143d7441545fc3e26670504a417a183e89ecd500abdfc26a9d5f6583074b5b264d41426fcdafb0972cda46e9f80f67992920126add91b7431e65c58d4ac81e729c8b03bc8babf5138f61b1d476e0662b85732dfee3c56673c54df250a02caafb0eca875f090f85ed7a3d32cf462fe57d484583fa0dbf4c1ecb53d60b3a2e6832a6c2a9f46be32cc9f8b339d9058aae7354924413ecf9f51ea3a987c55d0c30971cab3e23dc4a3d96c07225f501d784647c2909805234fe9d455e91abeee455b0090c6a6321712460233708fa6ba311dbaf4386eec8600cf1a26ef715dc037bee4ff65b231823f8c8e61eddc3a3e6b0161f34be4b7c49fecdb3101b5818c084c8203269fb2600ba41e0154c533cf330453ecc3d10845c04b6a1d5d1539b905f34112b5b5a08faf29a1bf610932dd6b7591a059de8d135e1e06ff683f565be9ef6c7a9b2b287d62bb898f4a21832453b9e7c00a40d2995f0fec9d143b83258ee944db1aefbe02e018acd9a139d42328448bd8e12a4cd82db0aeccda7dfa654f0cf3aa6fd505413e754fb2a3ec7fef7a04ec5a334024c207adb04ec79d404664c679e10fad8984e5a9961eb30e754055ee7dba4b105305d3d82720837078bc1f05eb8ae3119a71f25aa2d600c7340e186b09b9efb1a1e5581565c1a732d49c4b3965e3abc5728ffb4d791c7f9e27141b657409f1da3500ccf423763d305a712422fc92bbfe4e920023ac9b213f51713d201dea3ba620847d8f3ab3110f8c5f011f726cbf30b1755bcfd875e2e56223f21ac51a943507ac3683b0f9fd79dc67cc2d6cb23a25da2a57c8ae7a4e765963ab6dff89c241da0a4b3825ca08b0516c84475727c264da45d2fbdd45146777d2d4ab909bc753d45f63f76b6170ffe3e8e91450af043691a82fda7b42b3104707c6f1bb50bbce6c2e62e34108062d416422014d46ee4ffc0671968584fc9b76863a507d5222f124259e87fd2b49e8493e98989fa58e17bf25a82b2c81b583c27cefa8b8c275e87efa0c718cf2824a0bc768ea57db43290724682ef23b396ad78d4f44938dc82269022b73b28d73b9b757c841e52c4f2a4490cd18ff2abd3b096c32947ba36e464235fb76c94bf2bd909d17abc44819b48afd7c06c998821fb16ae8bcac71c789829b16d4d4c2486f6aea18fc6adf328f4d318f78984982228d25b8ddeab6506150f1a3918537ca0619502ba1830b6a8f70fabbe003361852b358fd66a433cf3f1b103eee4b4484b042d126f3502f27dcae467e884628dfb84189ee3e76c4e9e4f7ce0e11528fea882d0a71657b1b3e7d63f49213dc98a8bb2416d1898f4a06c816808295ba5f556c77cf48ee74b02b385860758405cbe63abaa1781270991d02054186fd261c24f93301e2b41fd93ffa56a536be71b3671729525c9b121abdfc161691192960478c03a1c5e62e9e73620d443d5844432cae4fa4caa346bd05452b9e7bc3e0e8e645c9390bfc870a4dc69aa1c25293bec5761a1341990388641fd30973fcc5a338077dd8ae8686cb5f03a37a81b11cb43d0b909708a3c0266baee4021279acabbc1a736ea20b30b26b73e458db4838ecaad0d485a59c1093fde98a1443eb9a1d1289f0f58162c26b8ee0f66e7659984e2627dbc4f10bf444319ebfb59574aaf362306550e7b48dbd351c2552b40248fa5fe7532a7f1520ca1b0b032c7421a72c02849752c5429fe0b3c41b40c0471ecfe1694bd128d19b73378ded9039e68e429ab121278cef67495a86d4a53b7bcae90bd6d692c182948936aaf64354e5ede46a3bcb26f3f7d7d7c1326c78e4dc0041ce7139ba942bf9a4edae22fb35575a6d46da0df761c69dba99136b709e85cfc259f730eb665cfcbd7e37a46ed8a06fdf4de816c2d2cc7b3abba8ae1cb3e7892dfccacc5db132ce86c8891bf9ee8fe1b8c54979c75b0d858d6ec58628d4ae32b5fb81175e56766e77405d3bad11473c2c737287ddf5e3793e5dc2eb5632d5b166e48ff8f2a50d8664a474b669a5fe2e2877858c6846bd1603696dffa51ef8249407fb69914ae6dda57ad84eca0cba00e63b512ede09036b703ea760cc7ec171d44b41383a78c90aa9fe0b396aee04f4f5bdece127eefa3cedc9d2570d01468ed4e5b117df9a24759c0536d88bddfe134fe6e820e49178842738eb62c81ef9b1a08e9c4478960a6b11aeceadcc98f73d259f8052612ee762ed3e00087886af51a8ab35f2b18c9f53a03225fe82989206559f2858aad52120191404a223c0e95eb81f3cfac84cb9e75adac62c96efbd826d41866533bf89a86e7ece3aaf232d6703022ea7bad7bc7a354d0ea29490a5ae5916a5e99a695591214784b7bec0dd8a8a008a3b7637fddd4fa544ba48bb890c928856c8e2c4b492a2f3f01f331e8eb248661276c2cc636ecadea654d27cfd2ee4d416abe03677a524d4966847d6742e2af3975455f92b158ae30f800710e064611b93814a327f3433809657c28522418a1b1f12c0d30ecb1a5f2b47d406e11469496314042fdb98005109153a0181c1921de515001b8a1690a25b0d62971a2f499ab9307a29ba73aaea04e4049cb0c323001ebb9d0a64907752c2c556387210f49f25151a7de4bc8f1ef87f3e937b5913fa1a86c5924ff16888ceaf6d99b73cb0fd66078e2dca0d6d8dabee74dc1fa9d12cbb9e145fee216959792bb4e36b5781db844a8ccdbe95a9b03fb886c0f3fbb5696180bdab4a0dcfd1d04b8cd6c5709136500c63d1eee6365a2c9445e619958a08967708ec6acf4165e0b14d31e21fa2b53b4a43f5ec8d8291320e69b12cdeb622bec66133a34c66e42aab736725f75c4303cf219544e43cd89f10c683b8ce10f106d319725479d23cb2610d615732d323643a55cbdb49695fd38cf63da13e72e9731c529963d9b0633663e406115239f2b889bd31093aa64e672d3e7a902f18e586d930fb3b1900c35c03f4fe6d7cef92a70f0e4bb833b60d1f1e7eaf8b9d887a4d947ce5ad280dd1ef376795ee8a36faba506d2474dd3b7d493be58ec9a802242a08dc6ee3afbb0c88974c6a96c150ac2d046dd24e5540e926ff79d0ea77ce2124143032c808786a61a04888c6be47e322b5e732ccba44fe670bb8b4fff249fcc630868cfc2f6b6b3f1a57b75f2cd8e4e980a8830472e88aa5763668f85570510d00af6eb63221c73701e0d753f44c8103470fe6907373137d9b0a4bdc3e1f51702245cf48ce547d4953cac76fff310861fc1a8d080d38d88c3d61af09f2ae694e1e2de5ab8a5e8fd57d77dac79b7cf388ca2685dfea1c8f0afb7046b6ada5cbfa7c23a093559f0d701c9ef61fb07ae13201cd3edf01c686c7fb543e06440c1f84785500cbe146a1cf3254dda5842a96620a9b2688798f0189d17cec274ac5cd352be6222873103c80715433573c0e59f052f45f7e154ed5cb5de2dde678f67f2f4fa111803400242c1dbc237023fec1a647a619a01c8c437a5181166886ea6126befcfd3a469764e44dd9f88bc971fe5c4a36fe3b81a2a81ac0a41574c7cb685888f589b3c5c525c8efeb3f485a9713430ce8a5906d4d153c3b2ede75fe159400e9b9c56c541ca6982080b65412559b0f2ba70c644fe2ff900aae64978b3a05a1c891a2b55c7a1dcef02aeef374aca70371e597dafd3c22d79a2227ab42dd7f78b9e2b40f38d11174f8b9b991ac5cfbd38408bf4349470655eaa2cfd69773da11861acdc2d8c2ea2ce36ef45de5650a975a2bc90b311dcd156e0e600af2955f581a1bb1ec90a4abadc6d6742b5ee275feaefd7449596e1564422de0baa8c1a854e05b8454f01f464cd001dd8ce36c2ab70676877fb6e28bc700dba0fa3eb94fb01c558ff358204a6d9a813baf724b215d6bf0c7244f5e4f9f2dc151de7b81e9a48e978a099d3814da8bdc89fcaafafeb1afc031ea8e850ad44afd7d047bf9dfabc62e7139653b97845ac278ecc44f2f0a7d7c59485471b7d4c6818a06e9c715ef7265a12025b30b97450af55d570882b1352c1a23b8ab25fbf3446b1b7258a401ad8a789afbdd4246bc0503d629dcdffb61d36a87e2b56d20a44dfe0717926dc922c4547b00dfdf222c824169db78c7bad2174da03b567e86700b8790302d110fd27228105e7bc98ce76441bf67c45151bc35344d2ae89a321eaaaeb0d0975bf517c667894f29919c17171d98ee4ae293d2fc08a93edc8b2ce562fab901126c13771ed2ad6687c91bc6322316f485abbaa7d06572b22f8590b56298b65ae545274296b17e4d76cf52f4c2c68ca28a141c53e82bd3570cb9cf6ba0b9cfe770b5de63374535d1ce12618e0d4fdbb2067078d33c45684d43209d066defb44cdcb6dde89f4d9676808d95a6a01e7969796ae5fd6c68d26a156a0e415e5029b2bfd77250189b7b84183069a1d42fdbcb1759baa49700d9a8c9462a595e34315ebf03458910b7c3be09452bb4972375af9d50eb4be886598b15a38a84eecc52a7407a3908089475960f37144dcd8f02bd377c38037930e8005947d4431e0e747ee91aa0760d465c17c7163ea94e77c3fef35fd8ac6a099c0d1dab712c69798c55c39e5a66eacb62546fb60dcda0a6f6ea113153bc127d186e03edb0623d12be3fcb50b7d861daeee39fb498dbd179225b451b9ebea99f9aaa649d59e816710fb7ad86ad8064cc61976a711ecaeedc97c65c05200c1835d2ee7ec1479f4a265caad280f7304bc20e7d89073ec4bfc1f789ad4bdc138a12c0959169c1698119b357bd030094194bdccef303061026e833f01655437087bd4accdb8fcb7580a3951ee052d11ece56c3e245f8780ed22ac7fc9a82b837b37c113a6bb3c316bd8fb49ed24aa326e3a8f9c3b93b61aeec6e2aa51a7bd65f482c8cd349b4e3ab387ed684f16d873b2ba39424f5e22f99e736fb64487000cac56da9415c9edd5091befc624dee00fc197f7bc9efeddeab4e7100ef0cb73df42f97f954689053366dd8e070992d15856a16ee4727bb515cf5148e485236cb111b77311b5404aa206231ca4d8e6b8733cd44e464a4eed9e16a5d9a3c51ecab29fc1e0e33000ca6782a0417278e2b3653fbe16c491242f32be3f77822501e396a428474ed1a3f29afb8a94b644bc4f64b7b4a81ccae38857caa949aae2c116c50e29039289950cc4bb7f9cfec3ed47403b6b822cf04119162810959fd856855c80a9e1f6bc195ba4e4ea5a2794ede2d68be36e9e4418ce37b472ba8f944e61ee2f7f3c80607b55915d1ea856665f3bbfa124ebb78d9d5315e843df34c6b482a290984420b532068bea8bb2294388886f7fe1229ad9a14739858f0bb147d95233b2217bebbba1fb02760f428b6a851fd725a8a4864402e2229105fb8224995a8a3ba90851bb00d78017f049da915363258be204d8e4bad5fab960562c69d488e4f2d3b42fd510916f2773fbfd81e6e2030e14379913f3e5e63422f7faec9c639a7e510d53a987126445f740a22716e84aaa1a40ab6b59ab7e82857bb4116cc906e63219f4c49e165e7084900890a3f7498264d1bc10236ec8a0f5f5018591ab3dfc79d840d2285c355c8e30dba08b683f56b8412cc08bbc7f45ce5288b99766d20fd90f0ff04fa83b5282af1ef91b7b9010a606e604623a4e07c109b671bc4a09cb48d6676a55e068080f8193d1d4746cc20b388fe7306491c0188e9b0181c801e62a408f599c11b402758a1f708f2e34f8a4a2987f89b8f9691a90f104ca95f55db87441d53ba2741afe616fee6096ff288339868d09700db087142c69c563966d625b5e5f1f0d432c0ae134983404ff2469bdb119034e8f38c46a00c560e8f1ce47d80b3d0ae3927798afca10c9156e7211facacee0aa6060195e0dbf38243b85cf0dd07eac10f4ac897b04cab51503d616bdd75fe4e9468aed87c9d5786edce899a218c7e869e4969e11cdd0f63a7fc27db8e3b5c72e51da6bab16e46dbb60408216d9b6395aa189354fb52d5ea63933bdbddf7d99edfe7cab599866105798c4f3a9cf4faad54afa8475620722ef02119a9f5839522889f16ca743fc26e18c4ad956eb9b1d4816167df889fd6f61523e1c9a9018b208b6523816ab19e6dc39d73042c9f613baa3292a323cbd4eb055f0a6750a9e32445bc06499f32637fbfea2c31083a083aefcdfb983c9baa09cf98a36fbdcb341d82b0b1560d343598a471852c592721976cffa629a548f3daada23a610162c43f68b96211a333c1033c0607d99c762b550e773a94fb59ce94883b628fefdbab0c1f868f185d8524d5b1995e5ede248ff99d92b29d56c5cf94a4f48033e1588b5159e2286cb7c07cdacb0bc4fb712b213d68aa91cc182b45bfa57d96c7c494de11f7182ab5cd69f61d1ea6156a13c10c6a57cb5ec033db421c5e2037745f1f971c23592d02e1d1c39749dd6747d391211fe9bb11df5962e4ca47cb8802b0ca0408d5f8fc521df9770638c0ecfdd1cb918d25865e3363110f15dee3cf5d5556dba1144467a90f63adc58ddc47a6738931e336b04c13b9ba7e9653cba7771a31a43490e6e5aba42f2cc947c62585be548e106a2a3b60fa42cdfee59e261affa5312edec1a7f23788dc1ddf4880ca510ba9ff7d7a6a2a8a9505401c08799a6f0d1cab916bd865ae03f7898a4258f37a601a3e58e8e8726b96c1c0d30fe61e425b14ecdd899d62af6f08ff9a7f2b8c7a1969d6aea837bafcaa3e504967df9a317c888f38f1d8a5d85709ad78788b3929671a1c37239d579828a19e49a4291b175f59d64677ace0485049747fb00b2e88795e87009c395432492f400d1d7c57b7d984e13c9871bf67e4c1e9924509614c3f21aafcb0d0513d45c2371e4610d2a8411db94d1f07da3ae2102cd7ac99aa06fc047f84c1779fab726fdefa9e1803d26e3c5f390ae610182dc954b21b9229bd4d3625de3b7954808ed3a2bfe9b893c4d18a040f413bd6a331b5116f2683c1a3b985e28d82a26809aecd0667d8357811fdedfd22a341580c2687e2d9cf5522c8921e4ddfad00942d638f6da17a1f4f51e0091a4292b619a49fc20d83fa9cdbfc33c8d18e0b5df3a19f4ccb4182095dabe890f3aaf6f95463997bce607f9abde62162ab867a26a9226eae05e5dbd8329cb05949cfba9bb03f30918ee3bcb4d7d75d601c4652952ee71951ff5b508f2f979044d645631f7c953976fec0319e944a60521f4abc82ab5aa8771e8146a8a400dfbe66d0a949ead5581853b244be70a4ebb21b286c13476a39e546f1f8177deb020170ea81b44e1e54972c7e02e80eb819fd3f6332873c6edc9202147f7a448507a05f0cf7a05062c9744d4c0b3a985a797e9337466dec557a7fcbe52c2228644dd23a6a33cfaa3d07ef9d785109223936ab82aa7d689828bb679793428a0ea897ec8ca22771d95dd6f27266df286f97052b872705bf8dab4ae32967896c4d10f1a9e9d6527b1202a8ccf3fb0ad61c241fe4c388fc5c397952ed5a2717bd1e69b2df37b91f7cbaa9c614eeb953f83c04033a2ff1ff5586ba583616b7ef1300c06eed66b1ddcdac19bc7952eb86828e75b5c31546957a1889fd0dfaef4b179ad810541ad9c3604bdf0b736d850ceb8e25762f9d8f9653a1fde15a60302cefba103e6faddcd92633038623ed9f97b200612c4b2d14cab1e9c40f89c62af1ea6987e63f185270ee51d8f1798ad7bf8e0a9abc486f72af41e3c0a6b15c374a7b180f81f0dd2af9f83c0279256003e407b3094045f44bb35ff1a4118206e046f111abe76c8e97eb374e61d2b1fae022d18fbe80ea0f7aea986c4dea49243c2814c2ac2bda77547335973525e4d87ade040b85647c260c4141b6d151d2698d2b32403da0f3d8db9d37a5a0149ba630e579dfa175087c871760f21b63e3d175c503bccdd7931a8506d3e8bfc7aef4455d616ab43eb4ca5af95ddce9ab990d91181d12dc921c4bfe3b97a97ebc0e86a9b639559ef449b612480548b7a94b648be6fe82b7ac9aebf175292143729a7182549817371b6006ca390e15c16d98c334807fd9462862c5a4b47e2d73b4443c60c901bb0db09cfddc409619269a41d5fec037aaeea43d6cf434ad40fe088175d3f1c58d8ed07324e0499810bafb82780ea67fae113a221b601e3f6bc1ca68fcc1c8806139603902c96d302f132e0b0ef6cdd5ec42f1318a439816c607bae4dde873ea3b6db1d5bb9fe0df3b7f19d9a8b7370f74f614aabc418c12edbebd85347c76eba211407e211e5f54a1fb01e7a1dca37a0bbcbcffee4ab82513bcee48e0500060ede555c10577754043498680a0afa6a7baba66b12fa09f2bf712002882bbc05da551c981b839e9de3a57bba2d4f031e661ae81ac921430fb310abc438d0f0b1b101c667150870a4eae1124248ff78eed633278be4551b2815c42a11969061ade5633b8e18ba49bfa195df06047fa583674020457d0811303d529f400685684d7b9d7a4b7d102fd75b1d1ac98bd6fb0acf7ab4c852382aa2c05f03ac2b7747963c102de0ad2c31d97aba132ac049c6a1cd2c258e8db14947c47c787f840c77917ab3c4f20e11c2d4283ba749a28854db2e6a33d822aca7c5fdda7f6cb3ed1b4b0cba2332ad34e9de71159620b0c569639374b00fe76b39473539b0870ddd2448c3ffd10621c85dd064f439005f31bf2da45d064d432211cb7ef529c58b246a3c179d3f624c9b197283ce74342c069bf51c9fe9f315b8954cdce18f672066585cbb4d44322e343b3b48b030267cc4e0ac536d14481ab19fb16f547a479e3032cf23b72d80e68b30438ae2fedc83630a5e425184e1646c6885d88976cb264179d06f1235cee0c1b3cbe76d8cb57d0efedc14009b0b736f66f127e1e46b8d64ddc5b57999d9ab0a290a9c004f66f3d7bb91503c51d620c1b4618a1623d83a930a11e28081f93b57dcc8c7446ea81750b0f2e6a4b0bb950700bf1b163b295c4e5b172e49ae00e547263d91718fea1bd9b841377db75ecdbc372bbd3fa7818b26f7a0c0fad82d2045aed879d3ce0f4b0d8df110b9b98d6abcecbda223bb0baef38df5baabc048b4c771fd54589635c01edc757574afef8245e1ca111cc09f13d45d175c819527ab2fe0b53cc6483bbc297ec23a63d2f27ae97c0551b403fb0c3545e35e5ed8eb3bece5398382d3e3390add717941d23bc0ea3b2958bf8de7bf2a8b12f8f831b5ea531cf17e4980a86292aa93b7c590bffbddcdbce33f0e050e50da0d7bc28fcb63fe3e21d43f7a02f5eba9514f13fd1cc8f43e08236f987df191203f82f448c647f9bbee8b199655d5d12f51e145cad353cf4d50b9da010cce4279bb34e6c14f7781e039aca5794f22f5a480124461db7d0804d11b1dbbda14a3f348267757bc7a8c821a7e6c143191e2c730d34218bb540201b751a8758a07ff00361d431286cff7e6f78dc9955badd24e24e3b4908aa691f39e2b40a61b407877044825b916db7b2021946bff2f4a1f4f150e5c8da8d4f20457a0d381c2466a9bd8e7718c48a6a2f3efd3ce92e5922834353c7b660d1da002bc21bfad11f97835f882a5adf49bdd2a1289b09f182281b2ac03fc98bcda6dadfb4c548f3aa52f22118794c178e554470405d89b2799a4c58310a704f7ceb18302d47cd8361f28488c74b0e36e134131b72a2e7a574d1e8c7ebb4ce7c09297547db0af92ccbd33e43649ea59ef6743adc8b6a5cf1f53f9d15c7c375638c08a37681ba650fdbd4a025d238d1f338b1fb7aad6a70eb0a309c9ca5aedc015e613a1d50f89a1cdb41c26af43e68f68fbc7f34a9e3fb74fe7aa670e19367e39b56ab173bfd867126b158822d94c8af8336d63faf19c8d03663db66808b54e0322f9a84ad93cc48b6f85ce2391af10f22de32b6efefe120b1813e6a96a1e06ea78c9105d58e3bac38a40717c0dab099c0afc2039a27798b4cf6779a777c01ca94c947744f09ae76b2eb3458287d8d2b8122e706a0b9372b4f3ac0b043a49614e3d42ca04bf281adeacd85b055e8d8266b48389eb5fed5d4c4e31ce89bbf63c8abc2d9d1f094a554980eaaaf7cefadfc9b15b0caa60736f6593196b3b1e30942410d9a17935dbd9dda3dacee72f5c0c70352bd0877fbbe7fd691c501e8c9a1a09474539ae93fe1cc2266f0cab40c8f801c644e2981e6da01b2cb8348bff2cdd658d4395e8af07a2716010929bb719c5eaeb18796f1c3c0c6aa01fc7a7f19b0f5fe5ba19fe34b3563ce4b11feea83c033dc8bc10560ba270781d02ea1f4a9068402b266368ce2303208ec95437c7045fe8a5a3bcc3f902657adee91c019d1967962ad5643da33d8e31972774d9900ba29c8c6191fab38942e7858b7e690829acae1a1e89bc11cc7172cdc04fe44574bd0c459686d49bfe83afcec01fc6388ff16910a282daf7879d0a84f9e01c564c55f9520e188897b0e9ca57c815f253b958bffd4ed9788feebc55f27556e048161f05fa843d087f1a0024d34ad42e494207dcf661b900b944923802f2e9f019b3e2bb807e36f8b690f9831ebddbc04c3b2e58c0dc3ead864f38e8fa745a70466634967b27498284dc141f95df9cafe08017d63cc3ee11fdf0500f72f057b0902b907232396c83c17a7b1fecb3981162b97b8cee2febd33345f76c2b96c846fffe1f76a7a7944022eb0fed70422e33bcf13ff01ebe5da899d2cf9b41753d69e5d0cad17f4c53100027a4afa2440f149ae908c76cc39b956d083987e0f2f2d6c1fb50631a06bf4c1f7492a0643b536e1856301013ae0ddbd8ee597dc14c73992d6c1d06f0fc74c3ff9d730df46278ced893e3418547e477c3edd1c7c738cc2704da1b647b72af8d040a353c625ba5aaa94427ba705c100ebca704408a5318054c3172f00bc14302a54d6c35a07ca49e8791c6f81518c92ae3edf6c9735e940b638c6c2eb0fc56ad642a3d518f7fcf690ab9b42b98bcdec90abc58531474b082c53cc16405009d7c2d68816546e48b97dfa062b85ff33f4d55d89f13ccb1e25b47da70021362a9444767513c4c31629945306311d7774949a602e0cf4355e90c9ec480695db0502b115f6f32d955ba38f4bd46ba411055c5e9351bf66088f353b045147cc066baf3e06555585dc563951101a06ffb5a2efd952ab9329c10861c6a20963b80585a5565d40360da8320c92868324e344e030271780d25279d26a25de688645f971c5a2da944c5a599e5d26c009af012c4d71642e30e2e773835a2a61b74a742548a7b225a3e1d3ab09cb58c0698c1c10e05912b04dd14f46430f2640c9b883679aeda8f04a33f2182692dd7b4dfedf1f2c1a76256404e44acff190888e350e5fca61e77debc4458db6aa7074e7cde92ef4a826dc0fa169b08c4d92154ba6f2f12e7ad51a9c48cfb29493ae586b639ffdda2586acbeccbf015f7a28c992d59737b94c2600313a84ed166fa88ae58250e1d8fbd87a8de4af5f57c01aff6835ecb0a3bd3db0cf8049ea8302c778916ae06a95f1e7c7433fb4233758b944550ec417828470e6784711a484c58b67f251cb5abae41ca58504f45d231f8f0f5ae2b9887338c7a58c246e3fba78b4687c26d222a63732f15e824c73e8aad8044213da0562696d1f217cd0092bf5caf100a452880284aac8922dbaf0166d6bf4dec2b9008ace2f5acf6662b16edabb39fbb02590102f51dc79c06c71e9a3f6b2a26cc2a7cc53fe8f534147240b9355d5aaae6065d0c5c02c2b91dd080ee01b0aeb16fcd5ba8b64c85da1910f06fdb867813461195409635b36d3d3c168bcc65e2d8f9e0f7f7a47131eee64a894bcaf4d36b6310e3c5770b307f51e6b4d82ecd2c03407bf2e51461451a89bb5b9ead142f2e608be3607d317c325207003be3e30ba0c0ee8c3f4ad9ae359c4bd6fc161c73e3d8b69ba785a7c39cdb0e2ea93b018806541de7a0d50b9645003170210833cb56355fbaf4283a866681f2162a749a03173245ce8e7a25ed938b1b4d5cf9009beeb0e4f9d869a8682fb7fba4f5831041bc2c3cea9ecdef396c61e9736cde8fb1fc00805c2140b2ea5bf3411a5633428bda219181c3cb974fc782ea4a2f1486d8ac2b287c0bbb83e74d513276489c8fbc29cbe3b15f928b6474baccc8b711079c3a28cbdd8a53e9fc86449ca68e914e78a616402e98137ddf191265ce4e26b958546925c36c9d8b2a6c2c1727e47ac7842cda8c978e7b0039136772db8da7f1cc9db4943a3f7240293ac3c9433eba90aaf7bec8030396408b858c43a9768bd97262ddcb520bf48fb421d27b1353e0112065a41953ebc46e1505629d61ca024317679a0e7f9c1c741656290e149a3e9248d89030dc147d30f146af2565600f47bf3144cab660166768865cec72a3fd354bc76db4ed32f192656323d3573214e84cdf9a4737d406149448c85062a1243d0458ae21ba3600ed466b21e79907caeb26145cae5e3feb43755925a92eab39c1d5609325b6f3d0b6abc4e84056e8a1b2afc674911e3e5e65d58b7f60394841e511d76cb47544cef8879c1fd7d324a6bf6ff73d827d9f04b135a4f0bb408abcd1d752bfe8eb9947f48b16e01794e3a0ef999a4ea53b24934af4ee6609129ca3087e61a45e9d82a8b4ca182330f328d7241598a2c6b076f8af679bcc8d524901d43c0c8a38dcd3e2b385c0561cb14d8f4b5ef473fc086bc996900f36a279548adf0012174b7d04d27b217b121693e8717e950174f8d0fd2887e50dcb03779343805c071b87966b3372ddc266edffd988cb5f07eb97d486ca0eb9539f84397406083512fb20013e8a241cf7a087b228b0251405bfb71cfcbae32811d1e366a4f512336d627020b5bff6a82e87122a2fd3e3025c4c0e8e414d5a527267a330af649cf2475822064032c6483978a24f8518ec3e7feca64d740ea8a9fe359044f2d86247994d49e652eef690be2bc9f58b8953be3b0c904a2d98c3df30e2a7a88de62673c67f494ca35560e02ea5ce3679b83715488acd06d200601e78247356e56babb3c33ff865f180e34dea1b1ceba972cd8f3cd0858b22c58a7c55b6b4935117690f43c9c5a8f820079a8252d70b0d4fead1a67cd0ac00884c2e204b52664c8fa183f493ba81e2cdd14776c847425d59e57b5bdeb7ac5bc4241a79ffd7d8d677cb6004a641492717da4bdf707e8bb320231413dcc3c3d6b7df6b08c53d86b2a88cea65d039f7d565b4a89697b8225a623437e5f8da8c105ead1603d65e9c669fa09357a97dbe4f6809d3c9a70671f3e72372d8fc91431d55751620da4c8dcde34c05fa6c8a03061ce7718d4682b87518c77104ba5f7c95a9d5141c563e04983697e69f768f97505bc924a6001ee0dcfe6c3e1b736547b27faf0f2e9a858e0b4e7b9a8110372246b0c2304081ef56606110b27f2b063c96c6bd9d4879dc80c67abc0f0d8a3d0c03a0afa478a6f2703b0f80f864c48b47d7f2653e92407741bbb28783158554357ba3e5a28bde4d555a178d62da553587d610fea7221086f69c6f3da50f99f9ce3a0afb96ff7c7d027fbac51952364ea740f1622ffc94530526754b9ec970a5318987dc41ad6416c91973de2b2ed8e899d933aa34667982b342f59b3d8227007c449e00c72001ae38ca1c62fc417b6c34eb5317dcb0f1bf19fdfd07c3e64db040b81b2b12ee863f059e6d1b59c887b322d802ac5bca23a42a7d037c3c0bf4b46d100cfa187cca49ee2dcba97af1de532cce7b05642735317cc52013b517d5a50d5d7cc90045394c8af2ed7c8c492c6ca5a31dfe43614eb10bcb98a3568e7b2ba0c6e6cb36d1a1c940587273033ecf2d251e0e5441e5c3471948f21cbdd8d8a88e33479654f731523a22125ccede6eea38bd97e9ca618940a0a403459aaddb8fbc3a5a2618e7d09310a30218edad7050050add6076d661d982628699701c99988b27f8ab18b951a75c93b9a32eb82a5ce5d82f7769968d7a51c3981f71b7907820504d81785306dc8b4b9e694920ef425129ae710cbeb3aecd549e56cbe16d883fe44b3bf9845c253d91d8fd20280ad9215ceb4651004fb136163243319e9d842291c8439265ba9fdd3b7a610a7142b3e6a46312075d73b73c57269807ba2512a81477b4e8380459239dbac92696be5c7610ac8b8aa4773b94bb26782a2677a012acdbae4904b954bc2ec03a4d81fc68eaf91d8cad2c3af82b4391c203b2d1b628bed45cbe2298e2cf2af835a1f54321a6255b3604ee748826998883c4c76ec63f04b18d73529449e1a9b2f479f090275a7226d9310553dad6f4f5781bbcff713a0ce64999bb3da13df581919c0830edadf5f47e985c3145e22c8257a01582253f3e380848db00dc13116df0aa2178915e0a015f868230d3fff388f45ab35ef1e6a34497fdddc97107bfad7ee0567369d73456d8592b152899ee24f7362506d8be1fe8465f0c26c90cb42c403062aa181a924db9d10060aa7ae9c13fc5d4091ebd6fd38e78d0bdc0fd4a76eb6182a3ea8e6b9c72ce0af8dbc5a08dafbd3664990774d478f027b226dc53c1fc824a80d469d348a1f95d27502d31c96088087f804d379ef25aa9c609d7fe7301e00af8b2b3ce8c20de77dd81012fed4f2649bf33dd4798871f8e2f5ea11f05cb6ca1dec73ef316b43ba75173feba84c37208ea4567ed0fa9f50675a8f4626a745c5fb0ba2aa8f577a542bf398330971733a3bf88e15f7a83e016a81c9f529ddeef04bcc138490d3bca54aecdca2fddab7d78939c6a8818b2c6579dd635bc91c4d62b792d4cfdd95e253f51ff3f5cb775f7ad6e56cdcffc746a385d49865e9d6ecec5afc8e6a8895292c6541fb74a409fa4baca3032dc08f731001c41e281a34a34685c52367ae1099d90dc0837fa42cce2699981430f559c3716f09a1ac549c6f562a0d05cfc1762e68ef769cc6927563f25134999d57074205a039520a9b0b11033581e3da2e6ab70a50dc7bf747e6fa2ba2f4114edb62399827cce00f0304b24ef2a3dbab2f7d1086d14365a599b2325c9e08bf7d5561d9ee55a15c85bf40d8fc4ff8d68fb427a25b3fc4a5af4068339d6ae49c34b4efdf0c0374c82a12130b61edf4bc4356ffbe79c52491e67576f41c6e1212dcf1d4ef488dbd3270ede944f2b14e1951cee2dbb83161584fcbfd661aaba8f7dc18882d0600a00267428d2669b987ee9e416fbd87ac4f417ca0482f1170773d895d496c230ac70512b3b4e771193972f5bbe4cc3d7c9d7af9a174f093d91d8027c13a6ae0dcb174b75dbf334fe0927926dd42e5b99d7bba47b60324bc9b4ef85e71eb0014a407f04a1610a24043b1b97c4aa18180f3d0b50787c9812b9dff0f5efd364cea3a2722658024d22e49b9c521d16abb992931d1f6b0eaab15c318deb41ea9d84f1e0d6d0dac7e0e2fa9dafaf3cb617240efd277416e9038cedd686bdb55dee3f4c22d4c2c6ce2260efc1dbefd6d386d49a2f486fc91020b60f8110e46a5a9602651aaf9207e161c9591e1a1293c0eb9f7e60c7d695a8c04e24ca037620e091aca6f648498e9fcaa68e77aef0c10316910a5f88517c86e134718ff09f5bab2e89a1dd921b86d6ee465f225615ef0e58b36864a9f32a7fd2a343cf1d27822c3f0e9492f9007bde305acdab67ea9c02ff2089fad445bd0fa4719e9d8e4e9b4572c97da5ace29dc03c8b874f9ceb148bd6cb066e0c3c8994d5ed103ec34c5ff9b9a5a8927e746705337af56890369cd286433c059fff834a042417950d82510330f0f8f9468803937dc5c5241a6e1035d5067bc492aa53fb50ba3df43689b0151b099f87153d6333dd0010b148060917f92efa4b7d95a48303a4aee51390d1399191233ba51f54497005ba8a49dedcc36c95115e89e7aec21a40c8216d313fb445d4033e193cfd0f75075d06812a1b2597e2186a7965a4408ec01aeff02d9693092da3da352c53133ca891954a55940f23dc07bcaa13117bb8d13b67545ceadbfca1e2970e9ee6057274f908bb30c668baf6f9e40c83d13cbad5a1012998e6d3f9e0131bb6264f2b31af24c58047c9f299887e06078fcf9f9e84ce6fa2bd9ecc5d985ae0a11bab9dade94ac2e40438c366097a7e801a5b9f1a2b62a07680bd7aebd6df89e90f417cdbdea71352c8d4001f51732bd425cba7f4db38a9324c1cf4ed65a7679f48cc07dbf457aa6713965e1ada4a14ab55a6c87e4be48121af1a05cae342219c49e8af6bc2d101e11f8c63fec76b392d4a06c3f09406701f23e8428b8e3ba2cdc32fc7b434c191bf11cf641c096729047a781eec2dc17a3dd242d493f104181933e090b38b8e8c409834b935ea2b64eab671f050c914c28e8626d55b3d9f294c09d2a8a93518bfba3d0dd3b2c817e22e0c31d34db08d2142fa6501ba5f8993aa47c9eb0ac8aa4e6f1fcf7332853aad878ab5d80af44b73483638a56bf49ee4dd220512cc6a270c90274407f939ff64aaed26e1e55628821b1ea2746f2bee8ab534ba40c30273488d38890765ceb4fb10b1905dec42f457eb2d0282cb6184200c05a3c2ad25818741e8c3681d6797612a00f3e93d96d194b025f5900d4f388b028850e470582e41fdcfb08ca5f4d4a84d4fef70e49fe42e88c9f4ef735fc37bf0fb46288b8ac92fbd991eda3fb3b1f15dd127b63a98b2d671bc93742dc074e08b7e650bd489c09c1c2eb73aacc73b88fbd335cc371b321ee699a811c35e0512b9bd41eeb0e080d4ffa424597f904f21264f71461dacd9f79c88ade17958c7b4a6599c3942ebe1576bd653547284614e67af69390aaf18e36985812897aec8e48555e4e27ccc3462d1c7af4461a4328cf18e178799def3b89bba69aa25d120ed5dcf52efa8bc7ee9d21eebf7a52a9c90762a9b976a61f6cebcf26edb707802a060cdba74162fc318bb1eb0e82a62bbde0d6e54daa00ce598d643b396a1bb3788c2db258ad30834b4b624050a115152389fc01e536c5e47d6e77b8f0e2005239217bf945a895ef233a804ec09493bda3f86435a9e88d4728e82a0539c240326934d1622ac638e5dffc98875dcab7770c0278eae40f9ad22501ab854e373a2a2540bbc4359565b8b78e6598497d3e4969c0b3429cb38f7175a94dea64ef18a30632b918841fef3268d6cfb6d3512aadb7d3bb08ba9b0a912fbfc40e322290b4a5b7745e206790373157a1d0d863b07e599388444831e98054a4f651ddc8db93671f80efa2c06cd2317330243b9a8454fbe3a08520a42f69387609e3d853cc23aece8a03d2a65131feea5624ff980f7932f2cc439212146c06151bb2e78956697f8670e877627212ef712d0b10727ba69904ce9ed1776dd8df44223526e3b82750299e2fc6bace203029b217337851676b313d4db1e6fefc2f86a2e1797ae42bfecaa8651aaebc5ba9b17477bf8cdec5faf8556ead0c2d12d5f3ca9ea95ac2eb04fc7998d3f75ff7a952e6d5456a45ad914f94aeb617145f83055f79a144675c860ae51859e0426d8cab38bc8fabbdc4b3f574c3215f1cbcfff827147390056dab8fc0054b48a6380155bbed65debeb0505b8f00266c0324efb58740ff0d84616d10bc344ee7aeef68ddc00ab24796454df90fb61f0b5c8fc980434c47a5009979651828f66378e30c94df7217db6e4fedf851c99f4206f741d53b27d873a1b5b512cf1c7167a6c52e0dc99d1f6c95bf104a8f6eb85b0a4437574ba9a33a9b618a063f0e8e91f1384af78f945472caf6b413f16500c2ce5303ff827fda480ae567a2ab6f68ee543fea1c40e31b85dc46f4262a937912b5d28b0e01f68c8496a08605345c1672130ff7a9c89b3a7ab074ffbab3966280cdfae557285f784f5fcf37dac71f0f1a0e022694a80beb70abfe76c0879d18135e798740b9fde014126a86eeedea16f81cd42aed944346c81c505cb0483540f1e9a8eb8ce4dbe409f9fb4968d73858b9d78938484595513ea0faee3d764b6f7032d77eed948e33703944bd7cb6334501704443b1f541b97db8aaa3589a4649ed4b23f15d638e56114c0854593af2b49880209a2f3f24833ff4e902b0518b9ae0c519e282c108500a194e412e94533ce39f25263c48a288df007ea991c66808bef2d26bb18838d777eee05b9973f0bb62f427032c443ec48720a939b3571a8b4c14e89b05db9302021a0fda0a620024dd6eb88555f52f75bfa129939f27d2c3011e12055f3ca74481de5a64f0a9cedf0a9ef13d7d076286a7208a33baa36cbc8193639bac73cb892cd562f51aa0f597d576b38cb5fd3a51947159897828b0f07ff862a60a0b17a738c00aed3ed139ffcc9d448fffd37153a7d86ff3b76cc069b073b6cff477fe064df39994ad30ebe5acf5740594a41380bb811c91d6360f0f84b45714c3e69ea8ea1189e032e0400fad57ecdde22dc84a4ebdfc7d00128a83c22c2ee5abad031c5f39b78bf5d00a46585b4e60611132925711a7764adcccf976d6aa3c436746e8136bc87a7bab00a7784d1b3bcb089361770e00c9cc9df8bb14ccd52d1684dac4c7e9f0543ccb05255bd44da6c7a78d7c0c03974f50bd0e856456cb0b23703e72b293207d0deeefe1fdf654408a611693c1105d74cd8adeb23ce44c3338316ba24c782cf1690b47d966f130ad2c03715255663bfe23b95a13398c297a6458c79a5c1ed5898989f4fe5ccf6cd58e3b82cdcf940523fb87f3f0fa342e456bbbb463b5592e2c69c4a961650a629a1f404a11e6175edfdb56221fff6ff6f4251e8d99e66abfcccadd5b6220ee203128d80f963175ce0cb601597310c4199e3f43fa35725703401d31e68150bb1ad837f2588db791c6602c4f8b7dde4b1dfe9cc3dacdb1544bd0df9f8175a6d2962407a169482abeda8cefaa1ae55de6da713953d025f832eff9f2a8ea70f1a89320ad3872b4e6eab2d4afb377ed3824947b0115cde6c30246cdeb11a458091855f771b696572179ed45c0ccfdb5c8d7db6900b784df9abfb6fb2860be875023dfea178966a6e40fbbf98a7e1c1a4a6c2159c789475d1d4caa54ef0fbb3d263390d82b329ecee52a9db295860192aa2db9c7eb1c4d49d2d6fbf0bc463e284af0ccf7a5d30ec0325446d8caf91964b723d8113914c536af082c07566095d3b91203714d7278e8fa4ac0799acd5cbfddc41d4327ef8f735c0f3c1ddde3735412c45d2b9f43db50d425faf9e6c49ae6da27d3d609589705b83e91b077a4dff8e2705311417535dee3910962414692273652e6defea41a0a30a7dd9b961f24f19df773f8d27b3f9a5980c259d34e2689d5629e3eb47bced17997fd9660b91c2cc301d834daa83a2f67999ca14455b21174211a403dfee86d9ea15d650e21b0cebb45d838d8182a5e5a2a99a54ae58e66f47af7529a6b8c558df13cab30af106068d5eb1883e024505440a06a4c5b9786de61153aec3b4ec6dcbeb153bbc42abed9391ec90bffa64d887caae74d6aace6454713914152910627526e282252f869688187a5ce199483e493c2aa2112c430b21b0bc28cd86666694a88e7faadaf6094e74034a550f89c3cda54936bd6cefc0c44e2f6c6bfbf6f8a6895520a5ca7ef3eeae282158242a278dd39b512f749116466a82a5db0e67fa4b7491ea2e0261ae7745d0e2cf38799f231a949d45781036de19d53b97a6e292ec9e81d2ed2efe3302c9412bbee74012da81a65ee2a9c72346c53de3735961bd1870b1d73b53989f05601354c5045e1e04be0c56205e19251df96c99e913e9b43bd2b81a4e883e746567aeb1fb29afb624fa19093b926230f84be1ca723525909145d73410e585449a5f77b68c5aef38824056d6a2bc37d8b0a227b26dbfb5dd1a21a4914dc8de7b6f19e00c920c8f0cdae1bb52eaf037a10e3f73ea0eefb9c01c9ec6cb8fd4fce2f03591656408b84576f12335cb1ccef88793213cec9b96c34788b3e3105ad25958aa98c3df882c1d58310e8f23b2641c7e876ced1c1ede87c699f1ebba9d6b647b7f14f0edfe24e04224401342886b1b472a59d3894508216eeb28e02680c74dd70067b940bc747b9c740f707a65b4548fa30cc0e35a10b7cad5f503f400c2003c66bcfc82b46da56db3db66dab6d3b6b16c1b6adb52dba6c9bcdd9f20aeba9b6d9a781d2e4ac68d995143c6451037886ba5161ac4ede68106d1992eed82fd3c7bad36377a77c85a89524ba989d213a52c94a2284d51da4229d5ae8d5e1a3b6e778d2fb6876ad3bb5b87acd54d75751ee3ead07117b7007fb938ee72739c747f989173e028c035961f72e028804e6641a55a5cba17986c535d9cc7b8393977716ffce50ae02e7700275d02ac6e0620801bd750041880006ee0dca0522d2edd0b8c6ab4a9ae8dc7b83ef87017b787bf5cd65d6eeba46be305a0c5eae15aaac5a57b81517106b069b17ab01180944bf702a38a71a16daa4bf3181700d848fd101ee0c900b88bbbc35f6e8dbbdc9a932e0f9f21239fbafbd3e3e90471969f206e690851f317329acb8c19dd8c192f3366c0cc98a19a312366c60c173366bc9831a36936216e1057e3e176d7d4d8e1d2d060315997b8bdc80d666e2abac55c9b8b1794ea701d626c6a8c19f433ae75707b919b6a6e317473716d2fb04d46460c1c3d961817351ab7ddaac3bd1ee35e9781652e1135cfc0f1215f9fc95a2907558c8b1732bfd86ea76b7a7751b88433c9747a966b3026d34c0cbdb5b82de985eb9124936066b9905ecdb46d777498dbdd09cf8c3417719391dbe776e986af2d879997bfb86017b79be6a51bc1703d927023ac9d367bbd6f77f5d1f54eefb3a66970f5172ec70ab7f562b81e49b2772d7aa78779e5510ecfe8d1eba2c6a8324cde6eb52fb99b81114386b79a816d3a703de8edb24bd660367a5be84da1b2e6629371ef92c34d77e6a30be3322c39c6cd11e22c41dcde1f2170cbd5ce7504dc96ab9f2070f76b308e9a7997c361f0bd06e3767b333960ef35be2c5f99e2da34ab193ad0a0d9a146cd8b4de6a48d5e5c226a7e79b934a277fd74674ab773b9a6eb10371a72a399db0e74ab716d353ca85ce098ebaa7b5d9331e9408366871a353c00a0bb4d63db68b66d876dabb16d35dbc6c3b60160db02b06d77a3b74463c35b773b6fa49ef168b8cc7c693bc0ad46dc6ae4c6c3dc0040b7005c9b8d1e5c4e332f34f275172f95edddac56a3266e3cc80d00730b00dd6c5c5b0f2c966e1a964bb960515bde6e65b931dd25a2e6d3b51ab8f1103700c82d0073b341b71eae8dd53a99eee2e54b83b1d1ab658d07b801206e01985b0f7463b5b0cd86ebb171f8ca646cf4567ab1ccdd19bd6db5992ecb4f574e35b12ca72fb15cdb81cb51c26d5900c0f5489259606e8e05b75cd834d7b75b63f4ae932e2a7ad7ededa8cdb0b72711359770355916dc5a71b3919b0f73bba11bceb5ddc0360150d34d2c31a7eba65f6b0da056d2491677d390ae8f6ea417eea05d226a1ee16a85dd61c6ca9341434305f3d2b9b4d4a83a5ccf90fb01fb7578eb736476e5292672c9da2342a089f4894452083c4a4640598c80600f4422063006f00c31c805162e096a2b64ec421e9e48f4c1336431026a2b62103c430c72c10848fa9c40eb996f06d00828b6209da75958c9e5c0eea337c262ce393ff1a8288b19ed881c4f933c86898e472f6a47d4e489fd4b45c1439ef83c2db0a32bd11b4591b1f3d45a6356397e0494bf541439fe5be53a274dc3052e287908c4165593e1e808d908cc5f2a0a1e32c4e76981fd309e1cdfc5c749e48292e1e7e3b1be9933804c906d155e7e3a319dc85f077126d43450b05488f2340dbc4fee1c5a2bc12c27c6f5c0701b418b2518659453ca3927bd28a5f4baaeebc24a946846c9f0d54a96b2896c128362d0952bd00974d2434394c8723f640db1be8ef8a670d062cc79764bca6d9300f5e2aa75f1f0f0f0f8d45cf39c335e7af80ec22492a045155630f179013f843cec77fdee57f8fea1cf895eb4dd599d5b07165ec6e8f3991833338f31330361c08001672084331815bdb8450fc67362cd8cfc4c133330fec1cfe0ee12e27739c280f108e331aec18871bb99c744d64c8ccb1918b7739c99c15fcd53bc21c382bc56338b6529ff5dac57f20de12107e75574751dbc6e9122a227e33c52441127d8cff33e719c4db0327f33771179af0888273d693f4f9ebe5ebb28a534c33fa333093282496419e4013ea2279d20bf43bec7046ab78a48ac6fe67ba4173d6923cb22b2d518fe19d1889ef446427090e84de8334ac10bac58f1c48a28425a7c342916667898e112281c02e0e8f5ab19e6305fcbb57727d2ad46baf5a5cbd5fa97225b37943de9b268d84602827be93991544995544958658024df116a3390249bb00664320907c9a5dbcf745aba1cea25fc0df14c044c36bd74c821c09e8449e7388ee3542cd80049b209935e3ac9f46e6979c592e5b0925a3e1209b7bce2212d67c1435e5e4df708cdf5a5fb91f0119a61cebdbc7feae0eb0bcc7cc59fd675a5cf522af554e9dc35eea66e8a748ea65e4b279d4b7d9ea65e4b2759fccd14e44678f459b9cfc81a9dab1c573fcf3dab5cad52488799f4121e328a58c503be74f812fe46793464748c343af69ca8912e078f611f99f097249bce72edfd8264cb71f893c9dc4b4795f027f3e2850b1731312a150ccccb4bd7b9b8b4b4a45228140bcbe96432595b2a91481cb76d9a361a65594b0b463df5d55cc232074373c905067f57e6de75f8bb72e9a9d2db057f33979e7acbeda649e16f66eea8cb429de3f077ba7de9a8dbed95f0a7f5eda53f91aedd4422c163a463f81b9d44ba1ce40c90a4732289843f9849f6b2748bbfe752cca5fbfd1063ee8dc343469f868fd03cc2d8fb167b0e927b086c8b2db620ca47268f54867f81a824a49452c238853e3dc45d67ad073f133def5ef4e094292584efba6ad1efbafb56b61a0a424da46107281001138ed049f2240a29409103292861680a3afdf642f74d5522821a1dd27bac8e7c7f8bad4804c43f123e5e545ccd5bd2e78c45f2277d3e88901d20a9cfd028e13a49a4ff48bdf41fa45b5cc2a9b78e901d20af3448a99a22ddd6b96cd59a0a226407c8287528142364a76f7a80c856eaf32daf4895d08de8cd4f1c750708f4396cd2fd833d704913b55ceb6eebb8b8adf302e6e5d0c7fbac38c7c6c607909de80931e19d3443f2f1eee292fec21ee696b40b738ceaa9a30ef398db3ab706c3d5bcb60310a0ea2f6eea91ab8fa95835ca4234cd3cbd41120057f32dd457c87327bb8e1e22bb8ece3eb0d0886a847754a963cfee8e12252e475d49cb61aec98d449a91e7fb3fb055f5980349ddc5ebce8ba72e9278eeaa8b44f5d48e177747aee65dc4f4c031afba4d644f5d24f2a49a7da48e924fbd621fa8c36023e251cf89a4a72e77d44d1de6a2849027dd873ce9199659bb128022bd6c6739dd84a2dbbbcb72977b7acb353d75ed51b7c4cd701748e9347be60e4b921a532a90b226fb7ced568d3166b7d2b0f15ef72322236b1ece4ca426c7dbf806223555661e291d506107446aaa6821ef2577cb9cae95e29f0b47ab26ae6a687c3543b05007f05d278533569185c4d504a2b0f3b84790c88af887c27b45514a5fab97248400b2fc4edf60597661c8f28a2cabdcd1237af218c6113df9e739c506911722bf230f44be5e2f7a551ec84e116cfd74c2b65c5daeea3ccc3e6bef454ff2d02b79296b2aae81c2ca9d7cbddeaf26d7388f11a9a13123c57e3394684ea1a978c0d833b3698e78abb56fd3286b02bb23b2de23a69f7322ab6bfa36fdf73d211b4c91445c426546ebba237af03bd1831712579012892c0c57aebbae5fd8e94bb70877b77935ec1289132882c58444efbe57b308ec09b91f9e872892e5e104228b1e5e0891c8ea5c93250e12bd089bca0362ab87cde13d780bdf2dc9220dc2119ae511cae33c3c3c3046c176ddbbbf8be9ba9877476d9f690979ae28aa0115a04c3901d1508f15538a4869a59e19e5be84504208930841e3e028a26fe4a5a41ec35f6ce9d0ab88f300d881bef9700290e371c4557d00c4814074ab46afe27b4ad3c47fad051d38e2e71161d1fdac7170c01af19d71409c1c58237e3e07e2e0f8010823e27460f1b0c8521df00811217d536b36d2368e847106e0891e76c95d871fb858b46faa928f9b91311553ca9f97e3dd9a8616c1c2fb8c9a683d336b6c551e1e1e1e219d68d3da9193d3ad9a9a6e59b982ad96cdc99c082f9e2ca1ec1b52d6a29545444f3ee222493a8d2e6187e8567791be99f9c687367c204b798d462e0791e8490933c5423a399bb878e214a064780b9d3c891e13d1dbb1235b9d0dea82baa00c99647a082f554074b2b52357f010daaecb504726e1d1e9bc1d720569c428bc456f8350661520d9ed841c73f4aa619421f8448e07126468686808c627704913ec0910a57c6126b295ad204343434319081790900320a12550a8526444949b0aa655d02a32d4b1d2da068ab0271f9b4bd8dc57fac6872504dceb35edc4f5a84d13cfdda96da49235713d4ed986ef28bbcc19fe36b015d92880299a8d4623c7df084f9c204ad00da248d1051d1c2a00c2104ef044080727d089ef0a978043abd066da63cc2ed8ad67e499dc5758ecd725acb7b245cab4d1eb9bfb417fcca869b797f4d2e5be6d8f9c0f7b1236a293ab7afbc8f9289dc34658b9aa2f3dd6532dd88f46aedf72e476b36ba3d1878cde55727ba1e221353206b2566b71d7d8837c5f7a8028479985958744a04f8e4d06ad67a48f798a8da0bfb011560b37421daa05cb85431c681dc3f6b552bc5661b43dd4e307adb3434b3fe7bc91b93d1a35d7e8fca6a9e67bbe9b9a97bdf155b18b7e0a691dfb068350aec322ab1d1659fa9e3dfb5f5f61c3d09de1dd06ef03f005ddba04d2372c59d61ad89fae071742a6df8f703845a6df64f1b263d83bd912229b05ab6042640b2e8142110c9484bfeac915bd06a78061d808ccd486d2f7881e3d94ecd337317934faa0933c822f181d760b2ee915fd6874c8829641a6a7565898b1cb0824a5c43089d9c014d95944e9bb6f96bc6fb6d3ef882cd802226fb784c8afabc8f277d23f1e3e1fb60b2f7a20a774bb69a82dfe643a12c5462087e9e9152c2cb250c80af68355323d7c156825b6601550284aa6a743961e3a61d22c08865641b36095e8d1be199d66a72ca74350327de30f4aa1f7f3c02004abd0d1354dd3344dd3344dd3344dd31e3395191e48df6cdae1a17c623749af7b346afaa6fe3ac925ac1cdaa3ef9a75162d87662d91a7bf3c95b4258dbcdc38ba952cd7c3347ae30c7b9884455c6c618294524a29258c03d017884a95884dbcfcaca9f1bc3f1e203e498410085abc16ef9c829daf4dd38f078879aa541477e724145a40eb86dd1659f206775234752a778c4b6e6c43de07ee367d833be5fe0920d377dfe8b1d1e1f01657f41f01327d175992bb922646daacd845a7bcb611d72349ae9a36ba84c7ae6d1a4aafe5d1ac97b9e26f0319feb0c9bbc1ae434096479f7dd34d2ec785bf1df9b2f1faa6a3317a4dd3d09fdb381d2a4db5611e326b9759a3b4468fcebe51a5720bd6e9d872863b2e073d8dbec94edf9fcc1866237af4d9b5691a7a3a053b4f95d46e9a8f66cc236293e395bbab9918644bd54da306ab5df4a20755b13df8cbbb52d03aa22096c2365b28d8066d76cf9e3bbabb714ef46077376c1a88a3ea29a85091b18b6a9a1851f0f2337771051f3d9b1e393876440f7a9e67436234a287c25028a18b0931806c0d0c183536306a60c4784eb4912143c6b5a9b1510323c6e36d62c888516313037fcf3030eaefbe06fa5e6323f1b44ae0e3af207b26c6805891fc15636465a05b15d737c018679caf15cff899777f55c3b465c5938afde0929de8c9cf89092972797becc0113dd91591ad79c3860d1a34666662cc17933fb824cb2bd8af898476a490d0d504ad539a1c42645d97a4cc652d6ed7ddf28baccd9e304e3931d2fc2d650de66679b98ff1d86f34341a8238b01e288852115943f4894889324681fac6468e7409a555723c85429744ca247a4d28109d92a5bccd89a82b7d5384ca22b22426b73ad2b06da34b644bb5933dc346409dfa243a1a5d4293c8cdf1a819c33f1965a24397c816aa28431571a8222054d18b136a50020c54a42871844e4c72032c085d41a8044980030e74e229100d6a0ea3532e1a8429d010ec578172fc25718ae78a5a1633312c8c981c196f19872143c687c0e3d891430e8ff10f3e67470e8747400e1f02774496f752f74f2643f82243e822431893a196e12843980cb30c2196a14b8657862d19d20c53197e4289a329c353c66e5c0ef1e71d5ef3ee8e1c1c0d34731c393ba097b343063e4675d183f108b6c6864d0e8733cf9979fc8e193cad9226600e3836d0573383a3c74c8e35706606dfcbbc7011a38279e95c5a52281618c540c509de046fe14bf0240e7e83d746f0d9456f849710420942ae91954406cc9ea0e990b9a59c524e18adedbabe501c34ad042d8c32c7a41756bd9079c149d3f4b58d43759694056dd2344b9ac62e61d299b2385135d88f3a41a5648040d34a16568917942ab2368db5d1af89c1e8557d5044164554b91c9b93182b2d2514560ee57e57b71e242c678760bf67398499dc2f713a6272c684d2ecc23cc2cac330c9dd51a13cb30b41540855017d201768162ccc900bf203d3070a0b878294c8d80d0a0afae407600da68ffcc0f4a9504c1f0a34bd30abd428354adfc4a6e9ce39d1a314a314a3f448f4a21004bad531e56226eff8e81b4f0142f46a267f312ed97e3118562bae465cc05a5f0586e5c0248de8a263fed9ae2ffcc1be09fa01d638c61047b65a721d04ac11ebe123a53f401c0330418a1c65a6af5bd3c01b00e2701d04c489b09421135a087b4becb57239b0245d4790610af017338cb469600dc89d801ec6be20ad428764cbc31fb592a93744b1c894525ab15a6ba573ced9dd17a594d64a29a594527a8cd24a2ba5b4564ae96844693ddd4129a4c7d137f05a94adb76e3556d883526aa39edea01427d3dbf44d3d3dfc8cd0694729a5d829a554524a8f51fa7a7d507a4a29a5f7e8e97b86e22125225289286387760836c66b2d619c50381d59aed71a0ef6fabc8c651a6b3bf69195c82283d5b803d09905ab1a026e91ed53b9253787bf1dd92667d75a08889a479f59b032b7cc167f1bc8a3e7c41d1f7d638f95fec94c2a9d74c8fdb0e591bd94ca1432ed253af4d1fcb510111b1ba3dbe4cfcb5accf46a18e36834b34d4261b5d16876d7ae1316d96d66c18eb86f444414595562cbc78e14e0c53ea2577039344ca9442f7239b46bd9f5d134d8e105b280ae81e1285823f3c7f421d9326135e7e4181d3b8fc6e9b1a36fb22734d0e85f4f91b1e3e89b9145595ab71ae1a8870d1f1a87882a80c6c98137b07f5afe6c640c2763b7f9cce9ed62a2879d0ad9510ff6d150df64c7646949d360a750b0d8b32b859a06db891e76787d440f7b7681401c06740decd8b190b17f8d848c4920539ea6c11eb17b34628b52892bec58c574287ad8898632f69ec1f09012d1285a2680bac0240a3e42528a90b98a3ab28c6cb93b2833e5d4439b61e7b984ed74508755a0007aae831a008a00391e9aa1c1d02cdab3458e6cc8f15a8fcd0199c85dbe55aeb2c33c898e2ac3aa067430a967b8a57b129d97bbdc3e73b92f99cb8bc53f2d6fa9180641a0ee7a29aff346ffbad6713900e95f7622dc55405c49f285af77beee10d3af5945f4e290101174e2038be015222b255864a1157b6a066bba13d6b832fc8d9edd62080483a6c0fc41a02f492e61086461903d84f982381fbc70c8e7bd608dcb4228a65b2da66400e44e82164bae6b6330431a72fc8468a8a15dcff295e9555d6fa02e1c9167cf664fcf3eab648c68fbc7f249f48dce82a195d1598e80d187b0fc7400ee19fe58b21cdd7fbac32ab155644db7ef0c3324b252e22651e9704a0301d91bd1b381514a38c33fdda1502704854c183e81e193e85133d82fc9079f1c60c21ad727be608d3963addf72e9d9b5d2854ea257fa074bbfee77247fd7b37afd70dd3e47421f225b2e61e804fa1001a1152522a8d169790a671fcca30b0b5bf10feadb854455a0955a6112d18b49e42331ff741deeb89a30300936eb00b45cf9eae13abd98d6def52264abd4abeb515e385a254d645804d78156620f552091914954c58a119a97e423314fe041640b85b7b882873145d78d95889ae935ecce5ff7b6216b11ca8e9304afb81a880b4599cb015befa09a1eba8a4e3175456b1a597926cb5f9452bcc19a65f5f48397e94872d775bbe8c951111dc38e8c9d8a4152283272360c768ef03432337689d86cd48aa54c64799be5132b6c866bcf28af0de37a6c186700dc34930a557839117db2fc623eaf8683c7461fbd8f8a2dd844ae5a3b1a62d124bbcc9a6439b7ebba606cf5582d72d8a1152c8ab288ac7a78256bdcbfc893e5c82663db3bf735bac5db19de1f6e3bf69961122cd43007717c121d2ee29f129631ec357d63934ba46be54a9ebb140cb675482f9d8b4da2278d20dd06454f5e335dee767308b01942274e36d3e5a0137b9bf0417a091b21a98c81055be890f0e54a3e09fa055b7f5d977a21aa78c099639657c43fdc2f0d6a9195c52c92e2b3f8f8d81357f2b066c8e588d7364ce6d91314afb48285411a078bec757fb6d30b396c84e698fd484149864e9e4416a4024a6c913014ba64a655ec1799f464f926b1b57d26c08240a6887b73f148c41677f9d8c3d17cc1b843b660afaeeb5f5f397125bf43e228fd7b31655d2761b7362c24621c37e8bf1b3a3221b205833af9a0a018242f1824afaeb336432b72251f310cfad9a8b82e0c852015d1bbca307f4126593e32892c2aa5d0ab66e52b5768af5bf90a1382a2273b7f300808961cb12bfe7650645101856ca01369e52cb9a3b062099d8abf6a2ffc759246eea6b9bef91b9145f14fcf5bdbe52afab4b0414a2989f4d090d65a9b48238f85be6ea32cd92df1755d57cf8aca1313e929a3484da001691a79655c0ed816482c123df9231613b1c9f2822c7bf91db295ba349201892c23dc8d1ca9d9025d43fe489731d034b2556402b155048789348d125a38207d43caf2d748d6c29de53f5247712a2158def21f2c6f49fd07aa05777225edbfae74d27322772db49884bd5a5b3a34fdf493e90e81279d64310966fb120f1510a5211ae40eed752d6ea5db19e29cbadd1b3bae00ba863c768fd84c80a69136145316581b6b8fb4b2b7d843ac5198503ac1c29e521a4112b890e11418ab60adfd574dff2ccbbf672ff5afa6e5392d37755197e59eaee9da8cb600f264230c748fc39f57b3e1af264bad8172da8b873c3d2589948cf1c4581f873022638f4132f658d3537a4aad405cc4a6008568402bf6694b56aeba6bb2e429aed1935db0f14de9e7253fa758fba132112f4b2c89a0750c8b9329edc668d309270d4abb60e9630be3e1e1e121820e7db76da05e751be66d340b635dc7c939f1c2eae73ffc93d1aca3f88111f294c236573377a0f54ccc8cec06d0731d8d068c971c10a55cf3a3619b1bda67b8bbdd96abecda6db9cab937ae0d785bc2c89f03f27519b39abf08e4eb910382660cbf69e23569c444bc1c69c42a1e8ff8025eae99f234622b2676f25d6da21a290fa4f0410b31b145597e2e1164024de429d0ad1d64c8354d23bf03c88a2c7db0b4892400e1111087046b2889ac79c9d3b9a1d190e51bcaabfbeafe9492e7e74cd3cc39af6b5e17a59316e5ce210985f40751b821880a4c5061ca8c1aef979e9f0c188db3c11ad7a67e869e40d39abb2e8803a36bc0f76a7ec27fa43c3f54230ade12f284f2ba44bc7c01c998690636b5dae46913679a868837c2970a7eaae07bde50416c93b3c47629b0f09f25ba7650e3c9e71bb1a51d63414d7e5de589b2248a2bf91a85adaf784213d8ae57f4d2e601915573c52bca6de5cef628fd84e4eb2b225f57f61ed1db215b369c8d0d1ad19315069606cf8c024aae93be6f67edf1eae8cc7d1ea175a9c9768ccba17d04731cb5aeebc9aabefbe65aa269eabf1c702e25ba467d1f616b4b51ca577414dd0af25d3968271a8a369c210c9d156c14ba2ea1fe1a82b966a1715a0ac9a049255f5bc8f5b589fd2c9e6bb0303f6b583c945cffd5b42e257a8561239af081fdba11dd9534fc808a0e86bb9b58605b879a20043e3aad0302b9c5163a4dc47fdd96bf4f8b4a227af5823ad855f9b88c50c9636ff9856d5257e52365844abe055328497464904db65dfd753db9aa975358fbec9f97312591758a2c96e9d3abfa79845cefd341619dc8f539c8f557159b2f2dae2cae29950a5b45ae5472fd5ca2e70e7afea02711727d7d81ad39aa0b2c6cd23a90fb518d3e97b0f5a3fa6ba88a4b896e5121b9852722e4a1123b269647c995c5776171f95429d7948b8a4ba3344da550046d21d32884465888a87361da44ae2a294f1efb51a126b95e16c17e748b5cebe9167d035b417a553ff157e916444da68f8d56e4aabeb6e008cbe5ef1c10ec9713b9ba7ef9c855954e3ee9443ae99b110d818d908bd7e611f6bb7c1050fa374fbaae07dc2174740612bd7a1e253c84ac4c2cfcac4761d9247a9505d72ad1abbf381d273c4b57cb1ab695ee2837d74d72ad42d1ab873cf98b4d8cc091742257f5b58e3a4b27f4953a3145c995fe9340d7f4914e646bfad49274922b69f4e92359f057472353b5783a895e25ddc94414ec377d723d13d38946b91ca449924eb0f423b0f17a92eb377c3111bd7aadf1e5d334f522d0e2bb4ace9e136b082c8cd7a0c040415bd978c9349decaa7c60cf8e61dd92d12b7959a25242fcb9d878e915fcad147f2e39bbf5dadb9530dc72058734d08cf2081a6cd8b061c32ef5f56184c4465c5ca80214f14974121075a207248464a0355362f5c213c698af4bfc751947febb1ef1dde245edec3a6b639ddfa237259c6269e4791af6c2465aa24c83d6dd90d4eaebb305e175e712a2276908be2087d7ae2b9bab41c0ab62f708cdf3fac9ec1122a0a20915aaac90e02384ca10851dbeeb9beb12a6618576e372bf91e04314e7254f1f9f5d18e5cc18c6f03725f688fb4a15d878986184935e58d3a03a9873223c81d6a51c59ad96ab899355ec901b8df007b5eeb4ecce4e76b2de19bd9a29c5f2755d19c368ae35cb641e8d3619ebb66d19e93accf5c2b0eb5eb56ed7a5d975e7486ad78ddb75c90b398ecb48d72f659c92043358a1d07a265e8f524a2a25a5d7bcaeee96f06a8853452942d60ef4e25bbe6ba217e3553e6ce916efc85554f9b01603a936b0b23ab14c48a085255e649d9e622fbefe78a43b83c0069d8a03fbd5e478a343d2843c0977aa1fd888243a246ce52ad61b583a04c4b2161bc6383d9021ae4cd8243a4974f2a55d39886c95dacaa66177e6895dd5c44610b0e33ab2639f99e6e680c88ee1f7d7812c21eed63a0244d7865d49e41d22553ce887e124994a3cf1d70120609e4d731de37e9859ca9c23afeb6e6fae3e27da44d6f6781b7de3a3876e2da057b1a6fbabc95cfe6a72c43b35b0d9d7427509ab7d74ecd6dcb1561ba3bd176d6aa2576760353c714de936b618a5d825a57c86d94b62d78575506122a59431d219634bc8b345531584a454a1a80a54602a4d92a0d224895290a2d6ae4d071524b4b845acc626139bb576b784758babf98e1d01a26a24dbfa8694e7777c4496fc3c90c882efe99b46429eaf36b023ad2a61bfe70d153dd50feea4eb1cae51fd209d3b87917027611bb99a6f9d897df81c405e0504fde8233c4455f3085fe02b228fde4023ac0262fb8687d06b18c708efc80f98e76e90d8c33c36bf80ae31f14e0d2cfd0010f214e7d8e8cdf95aaded84bcd7e4ec983b950616b5d519d878a87139b077d6b05ba90e2a4c2e2e4796516992719b0e2a4c72867550f1895e63b8b326af830a12913577e26a62b1859a66b1a483ad6866c1d2f78742e27462d99a446f4e6c629a945c8ee744c9e5e867f376fe79794e942fcf895a9661212fb9af8db6606716ec9c5c8eec73e2984fb9b3c0b81cd9e7121663d2374efa06e7fa4b8b583125b9fe2aaa9b505cd51755a069ea079eb8e106b9361a72fd87cde083abfa0f6b8190a6a9f4cac482fd36a22b4a6cd50b689ea1e6295822d1abef3cfaf6d65e24d32b7d33b35f55e2aa96feddb0ff6cd098896943b72ad0ab7a23e2aa1e3ec9f5df65e546097f1791c5df35d4562ea1b67205e5cae1af0a699afac8fd3073868b88de46b41145af5e8be8d52cbb1482cdb85f3c57a2574faf10e512e9f573c8924ad6746241a5aa88ad97d76fd5cbd9b5b9448faccf7044afbe08203fddeb677478095b84e4f1727d11d9da417dfae6e6ba248889159040091294d0f9604fae2de7619ef80392339c13bd7a98ab0e73d5bfe7eb46e8e9daa6d56ca46d1c09db4a5c8f5fb1d9ebb5ec9e548fb930cfb298c360238a88e9aec24614e9845cef6eebc4dcd699a70c73fa95c81a723a3dfbd4845c7763a269ea4f7773225fee0625aeeae7dd6e707f72bd9c54e143c57bcab524d77f3772662367ef99d8a257bab7ae2871559fa17276d8381b51d7a8cfb8907d469696b3d7c83a7179de3b3728f5fb21db9e48655876a3e59f9733d4bf9bb3979cdd94b3db88ad8d48d644d67cf64cb2e4ecb56f4ecf700a6f4f3cd9c2c6fc6d4f646b1392ab9abaa2c8568e5cd55717fc59148e827a0bfe64f2e9d22b4d53cf93eba1cd3ebb907d76e1742984d3a510ece9b0c806e5ea23345bb40dbdaaf8bb98c8f5292c94ebd524cbbc9828fe6a3dbd82dda444895edd9e8850f2e9777be26e4fa2573fadf06d4f727d4bf6cd49647d31cf57a09cfd23027df2e6e46e3e59b031cf7f9b4fae4e226bb25267d99e882cfafacd27b250af3446d988be2b0ad15625b62e295794e8d5c7fc5d4154cc39e71f1059d72f9f5ce5137b31115b34e212d9aabf7c22cb844abdfee2b9944416cbebaf9ec86a79fd854464d9b071d3512dd76ea98bba5b14d942d547c9f5db93c83a41391d9e9800e99b513ec57c3af96c4c54fc61d9bb5bf44a2b91b3d337746beb89597645e9557d964dfc691711ba45afc855ed2b4a3ecb3f7a856eb4466fcebe7665238c6341a15028140a8542a15028140a8562e14698a75dd948db3852c966236de348258b6d948abdea73222cb2d93c12bd7a219185bd9e4891bea1afad45aea373acd3ebb5110b0b0b0b0b0b0b0b0b0b0b0b0b4b3d9d4ea7d3e9743a9d4ea7d3e974c26836e706e9893ec345f59db367f533eb5cb38f88cde4729c2e24b298f44de7fa23b1d53aad85925c91c8f5140b761e756dded4b5e628a557b05df4eab32221d1abf44aaecf683dd522b688c4557d9d5848f4eaed87f2ea379eb6823abd446c72a4f09644f4ea7322ea6e4ca2574fadb027bc2d895e3d0bde7a3626b99e56c17edfd693eb85c856f7fa2291655fbff14456ccf59b922ccbb23f20b24ecf4e573eb15ef4aed388ad6e7bfd8cd737da2dae8fe91b522932aeb5676736548c1887818a89818a21e33931c6f3bc1b8392713b540c198f8f9121031523234674829dc156604fe869cbd8f410edc9730c163e81c18c7d56ccc29abe817d793967d7bed1b2fc8435e8964dc7186343215cd7f375d993e575c9272c615b0930b8923f9b3c44afe2bf1a957c3f3bfc8ffac648faf5102369c247bf1e09ccb2512dd2344dd86f436ddbfb3372e29f984eb68040dc710504f6142902be753428cc99e529bffd478cdfe291942ecf7d6eff41fd8774fa049582c2249f97b7ce867a416d54ca86da509b67bb1d0edaaeb91d19152d5d15f56c5037ebb38fb04999a04e7c8e958682845efcf35cbcc068a8cbbd7449aa520c942128b2d53a344a9e53c3db9c285b45c39edd7a8590b72f4da28ac4148fe47479cdc545fdc52dd10bb3cc6d426ea6db3a261a25daff9037c9dbcb23393dbe75e0bc2623c53f56075efa848e9c73fe9eed2697c3c8b5514e55ff43defe47fc76991caa1d8e747a2d37e2766446774706ebe8513d10797b20f1db55d95fbc755c5c7b17ffb1fd054662fa76171849133e4c58957d7bfc762427accab0aa6221ece57d6c8fb797dac671246a3117ac85b25c755d0e735bfe7253b717f5ed965eeab0128e2ba1522d2e2cad83e22cccecc18e1225a46f3fedd89b6827571b8512bd894a5263cb19b49e693c291405b0325e9118b5458f06166200da983c13571d5950a74efc0de269915082166bccfbb0d3f7edb03f7f1d8db766ec6cd3fb3cef163d1d6c9109424064743ef0b0aaa9b93545b4b8f26b9ae8557c4f0d106a1194903f1915c32713f648c8a324b21af6744f5674e5e682f8681d5828944590dc75d6ca2aadcdf1b5a97c7711cd3880f9a63ee28a62217265a588edad33cffd87fc26cfc923e13edf6880ad6e28050871aed844b6b677b1046eb802e442a66f28864cafcbfe319e55d94f6f1d5a3ae93fec8974d349f490881e5aa1874235397245a1d8af81764a58b5d3451831c618ff6cbef00ecc89141172f1f0a4585e4ad6844addd67941b1f0f4f0f4408917095342bab08b8429215d90e7e592fe7b8289711897899c466fe0079a86b6e01170454f4fa751fe20cf28beb79d1ff204e1c6f82f0c99c39c322115e8168c42afe86996d92c3e1bc97e3d3ec68801e3cda9307cda91c1d74d40eb4097efac94c82c6145f64d678a93e9e190e530d4ed7f95985e824e281553a247a7102c9c92a10e3d1c92ad9fd2c79e19fa4122ef32fe2873bbffbac8b8ade3ddd699b950e8a150f824c3900926323d3d14a2afd99bdb79fdcd2e7d948a21141917e6de7d59bdb80639adb36d24fc804aee2ce446820fb6c8dadcb6d2f6124652fae6a384b72369399db0dc91d85a2284486ccd2ba19f3fb058363257b77526102ce48ca846ffc1fdffb15de6f5abdb3a9453ed742ebf7e5a122b69e29a71d20f32c9340a4d431f2f248a9e14e08a7ec22b640a859a867e3e6139ed90bbae496e6775edeeacb012fc7b6d8485e0fe03d92e73cf7bebc8f865fc87cc3d8c64bbcc6560244df8d82e7324dcffd6d1e006498f711fa4c730823be917f6713a0c6cc4f6d35b270132986aa77b025aa7fb0f97cef7b6ce676acb5dd498ab9e13314dcedc96e7705d1cdf98dfabfa2fcc65eecb61fef2022be9eef2844bf702a38a71d1e2429584270a9410b098dea79f48256b42a56e4b7a96cb7293f0c4eba4edf33e485875c96fb8f4ed3f48e7b0ea3a12d58555427037fdc7768b91d86f3761244df8b0df8ec4543a5d7448aee84d44999e6425d38d9e8b3c999a6eeb581e58d883214ff4e8e7e5f522091673688116ad45c5c6ae4d5c491bd193346ccc4baf2d92e10f8d891ec51628c6e80229ced0372f72b4dd62d5985adf43208ffab9c4d63a04c4229573cadc59bd5b7b34e63131d3d6e8158384e16e1a3af1b125a65882145744c92dc5154ef20eb9a520ba92eb0f30637687ec1ca619d87e11592b8e56c95cd2413cbae5c91db3ad90e7f4646b875ccd779db571368700992fc833b91f608efd1d7d18a253ee77ff6b219ce729c703e778ed821d49b0691a480459e4061a014fdfc8e78f4456e39ffaf922222bfe6b2df27c91c89282088b7c24b2e6fbf6144488928b889027b21a5f3677ad75c225d8141e295030591886c5f989ebbc6a920bc616683df3d5ccfafee65d3166fa787feab51a4faf8761d8bb1e2f1e314e1c13bdfa5a3314a14c1184cb896ed55ec597de1de631970afae689c8c2a25c52224bf64d4be1823bfc5d3078c130f8bb94e818fc5d39c88fc1b0ab1ed3181673af25f76a123d0a85fd6ac6ae84926648e0ac277a9189ef7a92e3f65d4baed3e393bea9427d9345df688fc79af4cdf6784c0a46d437a4c757257de3a46fece32b157d637a7c2dea9b9e1797798644b6e40cdd924bdad035c8789cd02de9c409159c64c189179c6091836e4921212784a010aa5104e5f81a826ec97a02db821cafd419c82b573456846e4d9f30f89cc1a70d3e95274809414e08a242c660d0ad59a4866ed1289d1345580e8a94a8171c9a60213841bea2d02d0a743551d485c15e0164850a045b841c9520ad7501e5e8ee7071a512d9b30485fa5751ff4a4e52a9544cc9c49b6e9c22d4d222d422d422d4f2e823afb8b8c82b2ef28a8bbce2f24f468ba689ddbb77efa64ff74f66a8696ab5b67b09824f6897c82c8269a282994530b3086616c1cca22cd375d6aaee8ea691e93a6b63806ab5b693c9f49f4cfea8951c254ff46217f399a6897f7165ee07a39700733fa8820f0221472be408872f2af145256419f9c9ddfae2b60e0c764dd67831b99a5c4b6ac7441922ad6766c3771b2ac6cad585f9b66dceff83e168d560354035d193d2899d426fd060bc123d082115b6f13ca5010760444fb6503d61fc9b47cd181359b394a74c9e2ff2e4f27491674c9e5a9eaa3c4779c2e499e5f992e76bdfd04f2c4f973caf3c5bf2a479a6f2f589caa87f72e61f4b9e8f7d837d9af23ce599d5cfdbbe89f1792dc68d41a1b28c878f81928f9111c3b8d5097626077c2ff3c2458c0ae6a57369994fcd25535891a19d47cdb39ce64df376be34cf358d76b38addd834f3d79d7306622dd0befe37fa97fdabff5430a7f2f7cd7ff1b6a3cf488b6ca83e11a7344d5f7009c5626e615a9944c6732d6ef18a6e453064f948d4372d91055b328f98fb41e696d316da72af9ea6a1125712090b2fef1723257ab80e015978288764cbfbea9027219e8ff82b4522f90831fc2e126419454a892ca0c8fae9b98ecce5e594be819797415444d6bc1c5d5e62218b26127d935d7e2e892ceef2934964912e3fa1f44de9f2f3891925b2b6cbcf2afac674f9391459a7cb4f2a91c572a95d7e6a4179222b75799a04f589aceed2e506e6f2744a64c55c9e0645968bcb5f3d7dd37279e944b672b8bc97bf48d0adcbe75241963d7802e25c45e8ab085710a888ad1a254a1551a864791a45e3d42a54ff68129cc8566dd2048a8c92e5e90c1aa73ef104ad4196a74a620bbb7285227185326943e354266fc8f2978f6c614444b2850149202b12a8880a8d8351a1628594d8c27ca2cf94e84385138d8349919f4d640be3912b79f97982c6c192484194af520b2225595e86a1712e2d600d792dc62095d038171548abc4561d8a72888a9ca26241b3c8b2488b2b59febb94443a61c5461c29b35be9c46242a5b4cee5e51ab42e605e391d57761153a3d42a54b80a1897ae3679a236a94d9ec8f205a750572a93ee8acb95ca24cbb746245b354a8d4294e5b51a45b6ea50771d8a12eb90cb3b772c19a53da51da53dd5b10cd18ed2b08a072aa38ecaa8d41d7139aa14096324b560c9b5a4ee82c24352d7527769c13c52584767ed9a86594e18968550c62208d342969fa6cdfa48f1c1a464795a2271180f96c4a6613c581259fecab04aa405119116591e1b11552a40b255ab5c54204eb542d790aff8ab5958fc552cb2945890af5c1d3ac2bdf1fec8c45bc884ccad52e24abe02e17f5dcee1117f15a846318285558acc5572996bdabd978e06b77ba98e16b77ba78e26b77ba58e36b77ba38e766df7429d1c6e1d922b795cfae290781a4d4bac0a88d290789b3b77fe2256f1b099de663abab77522c743fafcaa43b30ec51e86d0cfdcf9a3f3c21ffd15f1107a158f99e7679e5832217da227bf4a94e56b942a05284795a9d835ec1211af63f111c6b4c46640e6f8a687179611ab781881f9ab4359be0ef5cd5064b56c092769089923ae434d232f7da06422b2a8ac4310ebc03f321f92c17d13339e9888a9f08162066298b273f2f5d51ce329add8b4c15ebb95d5601886b59414b78c3226a0ce23578e47ae490512a21044454f137c0070e4b23c3c3c472e28339b7602d1834288d8c8d6f64cde932dedb274e112ee5e994e2a034b297cad453adbd5eeed95fce8421fb2d491afcf8691f480c8c2f003601039e5912b4b22ae1c247a1005efc15bf8aec60b0a50a01777fadaadedba2e6ec34ee925af4bf906ba5eb57f7534bf2e5fb5c6af5ef4aa31a974a8644c75159a1e650ad10c000000009314002028100c084462a1583ca46b93f70114800e8da2566c5299874990a328841c51c00101000000000000800d0105b3b5d9835a4972a5c3b71d3dd93de6065294e6ce6f0ad6fa916b062d212fb3c4799170a032d150a0803d5195896d60415018d4b30facf00945050b7fd700f772e0d98e762129405aff7c5908b717154577f7dee431c49b99eda5408f87688f96583ccc42848bd74a6582ec150a9b158b1c2b98c20f6ce3031033d1f12dcb9e997df8891e05481302731e01f045c7a10fbbf2f076b4f123ca654701e3c097a2ad95433dba8b45f256e8ebe26eae6febae3663b28bee707e02678d453dcff3781aecd79362913dca0a8a4cdf5d71116a57378f3f8658d6491be025a5d9afaf6cf1867266d32be3adf50c88d90da4bde781cc9e0e65364a4fcbeaf286f2b865cbd52602b672c1965dd38f30c8b8318f81d1d47236d8a60efcd4436191f1b298d109154f7672c982c54d37678b3505af5f7407c1ec1983e3e34266074689271d82f1dc94ca66a4d8a6b5153a5d4b5424688e3f7ee5cc3118ba4a409937c819dd0d2766d61cf1be37f5390cfbad6c0dee430c2af7a03178f43a1e1588e7471f7bdf8ff1bc9ca2ca27f087f0f64fb739e144b5f4f9d4dd161d0db28ac230454fb435440809946df1c21220b2a560fc97a0730cef104867413762d53bbc271009d9e0e70dc326fca782c91ba138d3100ad470080ab90479825be079b1fd2422f8695434dba27a2e52b97fc757d4dd53e38f98d584d9932060e06cffcde5f7553691642a37247e74ba0720ee2227daf5956e7ddafe361ba750d52a492d8073c28280ec278e13c317497d9b3f282d8e0a24e992d40f78b08da39ed7e956521084f0ee73731e845522f58d92ca4a16459a5064a5e6e255208571d4efd109405858677a01670cae2241d8379242caec75aaac99a8bfa6c77c5c8fb89b6ca8dd61e15c857a8161303e609bf823889fe3e01a64ef19dde381bd1ac3f79428f892c6e3249d4b95662927001b6d845be7197742cd9e3f85b1b720a2d5fef6e38217b4a62658980ffbdff6a7df4810464130beddc552a7b70d12e869ba9fb44ef2e06f7ab08a6637388c381494a74fe035ae3d177ca18fd79170b320302d6465883d039fac301dbefae55e088f7043b6334de237825bd298cd1fdae0fef757fe0a30bae2f4ee5c27aff0c61f3c1349073bf93c0275e10aa6bc0b1a619f05ae5a4ac2e67932d98b95f35c5aeba612270dd1c67c17af0ea9e752b5c7fb9d060fd8786ba634c3b27644a2cddbfe37e9b96b3a0974a8d1c1a0fd99b3a7d62f94d249f080dfcd9b83418568ddefef42b71f2c1bc8d749c008fc14a07fcf65660aae3dbd0224e36f23a2eec0143c3db7cdf81c0eea2be4d9f8b5e8b012f482575509e28126cc8b335960f8b194b6452b8be3cc0fb5a4bf4dcf0f553502e37a6d8c957ad4c5390b17305aa8530f5cb05d5fa700f182936edcb7646c1d3f0399fd2e53e1b67ebbf97e2c44a278ebfb4b3616a9666eb8654a59326e048fefebaf698832ba595fb2ce57af7c7c43589906c24acb23aa496b83af79f4af444dde5d718187a0e98e8653372fae44a09b852dcc6af32b9257b6603ee9f8f663641c69dbe641b97b82df1391a54efcf7c9bfa90908959191c9a62652571addcec63f70caf75965d97c4aac7dd3158ac004b38a515a9fa58581524c9a78e7295eaab4b79d729c3cc10fddb65edf1b7a60a60e3b25a6c729f8f8c717fcb8f0aafe8bc6e30b9d8efd8c86c394f91ce3165880d40cb2948b639761dad527911c53f79d8e52e325f28b6c21e0d94f9297c3abbd0e6cf82d4677fca03ce0ee77c7e3393b4d268cfd022b8e1c3f4adae0bb201efd18e530aab636241d1e4272372b8f23912c09fa1b7dcefa4f0162da054ac56d112b5b46afd07248fe03d962a975fe640d07ec96d83077c356f4a9f8e744ac9cd8734b79e2aadb99ae4d6f16821dbcb399ab724a80a01dcc242ccc9440f51f4e14617848fd16c0cd94dbf8672b16cb044a4c8b7457728f4d075e3f3d91a92c29f2398049d72267f2285dc84635bda9b929ff7325cae547ad6026edef062325111e79c30a5b260115fc7063efb175c61b72e4b20c88243cc7e090071e17262ba936b7c66edd1292263a83afb4664ad91e1cc14a338d2d49c45fa21e75da8fd1b7bf6936834ffb75abdfbd13b0de53070e641585bff4abab9758650b897cd5cb4445cdf42b38da5ba9871021719ff7b62dcc95fe43bf1bb6966233da4a89980cec943327b7d048810a67877b697f5a1e05b0e9249d5046777b26040aa3daf1dac64b1180e6882429454cb2166bc301017e2b32723a10c284529a81aed31ea35402b864438261a8e9fe93d85873154986065ef03818274807583a1609c1ca4ed0a90d8cf5d4cbdcdba213f56d65696259a56d4b98819346da164bf68b2e28140b000091b5f0fdc89add87cd7e5193a4506a82c2abdc34dd683379909ecde7bf4e51ec997e6c3af8fb1ae54583173371e929209405c51ef77d2250c21b8f54fdf396a5ab548b3953839d88303af5f725b7c89bce1001208de16e3242b025de680975188bc4dbccb40e628d8847ca74fc0de51c3f8758c6c3f9286b4bfcc24d2a16c7dfa525d70e5ea42a68fad72b52b89b757082218371fe218e1441659269b0ba4cab97230e41b18ef437d968d055c6cd0e80837a3df8a43d1c613a20fcd199550a4754a7ae9a4f55255252785170bb5c2065e952d7b8ada3f4e51cee626387aac6da53663b4459d6f3084a40366429cc75730ae04bc78b8b9d39b84027432ed8cebbe7702a1677821a6d47bf0de208494afc065aa4624307a988b304d1a697ccfb5b780356cecc0925d7d3c326651521c74ae857c32a232e0409616fd78db4f1fcb4b5a89cc4c7d3d1311f068db9cd529f11a4373c8c8d9cddfbbb306e5dbaa35d98907cab158cf719cf4e49ade221f822f4e55d6c0ee28969a80f307d95f840008d936b2164f7be81b0e230e5b97667c4f9e8062d86bd3564b146eee7816ca7daaee95f4c6c478b97446b43448566751d5f82897628c9dbad4b97613f8125fbc4899f4aacfe35c3173eb8a51cfc823d9e0675ba21ef9ee98c077f29bfe8090627dc5ede41c22876bd7e8221b12ea386f508192236ffabb14690548ccb36c0898fce90778a7fa06cb669304d06751c246bbb94528272786b6d4112b9961daad62dfa106e609f6065d57519a90edb7d329a3ad100003413e64ca2794801b14d59ac31c8e744927441498a15cb20938854e96963b42de11f6378ce4e8592f5cf3e8a7dd0569f9be5583b22de972d176f3fdf9aba0c4fa802c32b99eaa3a068bc9ca42259db009ac627c5a244b6cfe9ad72cb4c08794f24d482964bb1642c52e819e826690686fe3dc06bbda589114005bb5641f4401b88a9bc518194340352d04600b4fde551d90648db7aec90f9f1d111a55d32fd6b092beb0c77cffb581d4ea9536cfcafc86a53f1391d763bb6d16f7704432180e908e351fd6e27e03a40311ede59b5b2bffe0449f2f4cce9fc3ca2db985dbafd3d0adace005a21a5c5514a28a2083fbab3138d768d5405ee620a2edddab4b5b13c90ae061e8d67e08d672bee3225ba092982f3c49e4c8b4040125006b236361414dd8d4d8e7e8f2f3910b2d65d90ee443e989082a5534f6e8a7c965ac015ee298011e2e687144547d9be749254d25ff28f73943066b81f0883289deda80b8ff208b776da1bf42bac844edf68bf7feaff9e24c028d804ec400be0ebc1f1c5d6709cc83c2856070242595df52da278aa09417f4e0441d382abc64d77d97c7cac9974ff4a9bd4a4f8337b73e24f2f2a014961310bb6eee1d3b626e93f9be330411675c65adb409de5da4a62cf8156a6f2d31e082ddde7aa6176a5868d7e76e37a88a63ed255f8b5d61a301075c500eb92d7901b93efc3fff219ad6e623b29c59670a9733723eb78d83afc9557cb4c7c55084e38325b6b5ce1c8e4c81879411b76fbb4ebbf5124ecce71d6e62af5d62a4459326f4de408474804680eda40e598db1a0cb1547738b68caa03f79cc6da3e7c67044588d349410202673c424bf5e8ef13eac9d912b588f522db73812a2cfec34e91be6faf51ef2567da6670183da4c3b5a55c7584253c7a63499d43a3b16422be35100d8fc5d949b5d29deb095c5640f2231b8e5d256b00241a9e5c29555d16fc5955286a6587a82c84483610f3f21d7ee0c0e3a827db479c4a1ee82722b6f868a937d8b1ac61c9c5fd0cbaf81e1e2c4402cdb4cfc265134e61f0eb9148cfdc708a35b6b2decf3f97fe3fc87ef706dc9c9d2ae6c61589a67ea38c13e1355c8f9196f4dc463e31ec4e66140ed938e4b23f26fb7507dc5937d628ef33eecfed0c61a9b44cbca23b4fb74c003a9927f119fb51944578217fbb37796f1e1bb55fcd359512fceaa718c12ba48ff18ec1c308936bd2353949250c09398c74470adfec2934d12a181f2894f3e0d3f09927aaf136cd0d58b13efbd26dc73dd71bc2f38ce78c3dd0a6be8dc8e0452a3bbf1edd29458ad090833d5e0eebd8be166eab114682b974087f13b480de9a6b3404cff5d742da74406a6897c8a20362d76c62f15e54ad8dab59f585f7aae8250afc12477028db1e90ec58d1f2df223f674d57496d79355860065ee73dec9d7c9cdb52d5d82d2f62167c3fe36477763aafe5b8b1926033684c23d3a2a73564b178d696d6945c2ea880eff5c3ee283aff0a6d679c0e40e31227ee01ffa098eb62d466e1a81ed4fdf0b85202966fda35eafcc80154d648190ac91f06ee9c7cb510e68f9c1b7f00a87c7c7668361e1355c7c57d58a07aaec5715884d80d3b6e6aa5758a7420e44dcad0c2716021c7573091448c40069dc1e5b881cb7c3c9344b7bd6cf47c644ca4957fca5606c59f5750d564e5657757d27dcb2e7b198b64dc19ac56f13fc65ab9b33f7288f2da060a88a7605f619c474fdddd1b14f73c108d68bd9b170816d488b6b0dc4763615a5e17c108e7fc46fe713deedf63a8d8e905592e1d0ed37c2a1c1f0c963264457f6b8c3fc6e68160d4d69cba3929b8f663f9c9510de2cb162c62bf4ea9060cb6ebdf5112e1280f31f7ef98aef681428fe29e6b889b6cbedb96620a7d214f55ff59ebd5089f1f53d55054fa2dc4d9a2759926624186cd83b135f61575385285d729711c8d8e3c93f9969dcf268933295da67407bb7964dc1ea26a9190b7ceea3940a4ca196000c9af5c00af776f83794c09b84b1c91c00b7a3e754aa97dcefed20acb1db447a2da758e4526dd3c584d4846c06d6419725a5e1524e06cc3d1f3121db951f4160cabe93122440b86a1cad33a66cb907d2d8e9ab0e24b684ef5bd65b3ef12c9172173d51927ae36d1097db0247c64bc5fbbc156af0be240fb9ed8105be2d4b716e0243c87181cb9a37fa78b96dfcaa1d6736e1b8cd821aa1e5a7687b76a0f160c950df380ec72124dc7840dc2e716ed66653fce9d96cae6083e74673470127df28458be0b6f530eb26b8f11583d2a0498bd50017b0325c81b5083791345b03739a4953a6669daf20128813fb456c7fb1f0997d04ad99f35520382727b1e39e821e88c1eaecf93368f053c7dd9110bbda0c0e96ad837c060ce5a39d73810a9ea8f3facdb903564f8040474c8b02c7dcbb62565215778133f860effdd6283606dc52e8dc8dcad1f9448bd637c6b9b3958b0803543047bae4c0716d15b706b9839659509924baeeadb3531e06d1cd7d96b0e0460bc168a6637070f24bd9ed2aed36ffc4975913a4be18309dbec2c8d8423608280cd7b401910d77fbd873da1a15f7434f707dd4dec9600ae1ba656349d0dcd9e23d63e777e6264c486928c89fbc013b8361d441d3e033efc5ab0ef6484512194919cae7b6b2ab8e11e598868a0e903be5fefc9b5edf077bd6c9d229a05fee07cd97954e6e4dcf1bd2ab12338de31cbe909b4555b032efaeb4ba1b13c9f65cf7e07695f58fb56743d8901f36a76788c46afdee6e91df30fc8254a865bbb092c9ecfe1273f423be12c8c4ba1c6c8582d1add7d4f3e1d46315b818b05fa81a24d5ee6cb6713c7e05a990a0efb386c423c6e29ece386e877b971c20b85a660db7c50662d446468e824348c75b59a693b925d3c6c0d009e089b4d3986371287c386f0b95f0db906e46f479fbe03861512385f2c2ffc718625e8a510854823a8caa1dc83c926ebd79d29ec067702601025ece790075146a11791ae34f043454525b993014df1fa6991eb7b9e184b1a6c8ddad55ff8d9c7a61901ff506936c5b73081fd810ccccb70ba4bfa040f4c38d29a470d568f4c72c56f96c0ae6f932536caa25a1fab0dc0c25165d7b41d7824d73effd2fb45c5312d660035cc9ca8cb259a6d09b2115d6b6db1ec6ed38a9bedd869f33fc65c128252a69f5c6ed3fac99becb4d37240eb4df4e29bf0594efcc84404f7d252c1d71c03f1079d76d8e53af70d6bdec0af38ffadc42c92639d0d35b315c178f45008817f2bd5e425ae6c0e966d34d386cc6d834af8540409d641b9c62da3be74db84a63fc10e77e0f22789441935926a55a2bacd1bdf00d04df0d006ed3c5215d8cc732feac351e9edc4d988ae2ce121f7207e3c35719f445de3f27e7b8f1268d18d6d8663b0731251d58193645353915649d2c754ce1d04cbb3523519b2e73ea2a480b321f368d45448df9e8c8008a6f01ba85445e2ccecd4c347270b48664cea300e0125157dd72e2362808121f66df061a5eeae246508a68d36bb205e1ab701916836879ab9d5c050b518f619d17ecb031b0c53f26da2d27865377fcbd8e9fc48672b1ac5a76f1207f28fedd26869c70ec3ca91be8f6f0aac3a6dd8ea295610ec88cd3b8bde55f49a3e5d52505b6eb5531fe652c39a89151fd31a9eb13bef527677c85b3c0092ac8ee0814ab533e126c10a422e3209d06e91b26b57f417c49c60fc9f04168dfab9b73fedbffb5f5336b03440d76edd802e7c8de4d68de82a39ec6304d0e9c88c9dee6bc3885ea40772fe25e364f62235368175cb53bdc75eaa126919514eaf6de7171d244c85684fe943d298e3b0187c02d758c9c4bd2356c4de455f70ed86d1c27344240185e7bb58f822893aef765e0334ebd435627d1f4e9a1175e3f6459128065ee2a540a1492b527e41744f6e396b701633e900b9c9a7404a36453bd1ac3dd0d76f12b73c4d08ed996b6bdae13df3bd6b0f0eec1813b9ee3ff389c8d06fc7f23fc743190d8e5313f3b3dfd3d3a2063742681eecd925ac3ff7b2d63fa50013a7a503b1b641b60ed0b8409994e0460fc4da8544c894364e4bd95f34a275172550dcad8f11cb64b066d06d0025c02d87a9a657dca522fe7dce6883daf4c34448f219f74b6ced5322e5ce1c3941f7ca280a1fdc70905f2b6bc195b574aa71ac796ec1ce2f9fe5624236e9bcd35897222bae12c3ff1f4e5a4a433744a019520a84d4da7c2024b3ab40d867eef52b23413d0aebd8cc59a86bd0a0e0b1150986274d457d8542f86ae024ae9b46cb7ddb74b5776705b311049408dfe2e7ad880d98daef3f078a96a1042ff41dc60c34053b970d8657ba61fdeb23b6fa2131a0ecdef46e962950971e80367a58603995b62cc4e9f41d4197ec3bb31fbab53b39064c5014476e26f0836c97a74b1c3e69c39a66607ee123c96d1d20621cb32a04e34eeb40ca83f1959b31995ff4a8d119e4152d152e918c0734b9e7fe522c83054a28b4bb4af374b20abd956a4caa48d857c5ff950fa7b400cb7aab67589f711c0086018837f21b2f55a4f0cd0cc990be88113ecaf2fd93228a969d3a08da5bf9408ed7274db84fdb72794e88298965cb07200e03906950c1855418d71548a1069a41690deae3a500dcff9e7fd31a331ec2640cdb469f72f06b2a0cae00917054fa2a567b1426def8a68df4db9506a54342cb37941764b5f7dd1b8531001fef57d2f708cf04eae38eee13ca98728c9403f7272a57c751488d88471a2f07dbd6ca7666364ae8082df05b1fdf2cc64b03379b9bd36640e405a6c582ed2f987fc3cda58c5938da6d269c6d27180e4d8c309d238a24453bf361486acc07bc02e3e9bd92d663545a3109d69c4e68a29c8d5face1b54e4ea07c442afe06ee0dee9b0d37d20fb11359a89213ab8e1590d4748afef5074341bd14271976d86186102ec23ad15ba21f8c9273d0096ba23b589e3b88a877244659203c07fb68cd82716e29d1e0395824042a80b09794eddb1e30babe73b080249bd9a076c488c67c0520bf00237d72711dbdb72c8540b12296cad8dfeb6ca1158d1c6b60a949172182d720114c5409fb3b1323d84afec10eb0c2c23a5e6fd0c00441bfa1683ac1ca9b26a3839eb40d20f656b69776744c335eeaa1dc75f98e43fb7f6a9a769915bbe465720f6bb19460c39f15af9192b91b6850c6c71b86b6a21b34fa2a22038ca071ca571cae6c331a7d624d362df51835083f16b269e717a72f928139499ac70248d534ff02e820fd0dcf29a8ee5d9ccd7e156b1743d14fd2ab77c79f0e9b38e9c18af9c63ad630983f9b60f190e2ce01536f8219343f47db1600cfa4e1829c48c055f8471ab44a83a07cb389dab5c5138f0bd808f9067aaa64fc4da4aaf60ac3cc61333ecde9331f7093489bdc4bc83b8ccc61b55e03d15944ec40933e77ce9c44fbe3557391f61b80bc7e8f7e00d0037f0020be7f005cda6170d17e1e206fa7e06235d5cb0e521cb2316630c8e00191d660c1d6621e2a63218df58e53c011126f382bc281040b6b4266f6d512468f32166d862181e66bfc2726921cc15ba643d2760818b56a37f0f9d458a20181815486b04d151ca0c5c92b9676757c7cfdd92a914b773700c823d31ed4261eab0e6d589e69fc8dc39c400f3e3b192a10a67a2116e956d91b37b204803735bc2b81161ebec6a2603145e4e8fca2f06b898711a1332cbae1b4a553d206f9aa63fe33e626ff2c43890d78f62b1e8bd9d01b44920b1608bf644e9345bfff55520097e2ca700dbb83ababdac625c3029a781febb133b0ac8f807f5c092da51e758cd40b1c162a6c4fa60d987c8304a79c80632de599d7d8868cb0c244dc2a5ceb4d43d5f7e623645e024a890af8e3e7caa4e7a11e801afaa7450378fe1696605b1b0c3a907230cab4844b4f63027a208b0bb0db50a5c872fc82d187953edc9f5e5abaa8daa396781bc9e2da142a74118c117d1880b02a45cf9c460d9825d541593c70a16502ea622ffaaedafc4f3138b4bcfe8b80dc8248c2d7422a55b204c4eb926a5ba5900ddf024880214f30cd0053f5f70996b4e633667198ea2cbfbc61382af41f312aa7d1b926306e8965b9ba77a2111a7697f183b3d8152594fe510e824069f40ddd8653c763b1010aecc4e27eefdabbb6db13e8bd8504e66d62521969cbc068d66b28cd028ff9ba74873a3375fff8fd61453cf260f653556cb3e2ce3b5a1760fa72633cc9a6ad42fe19b63c81bd536a73423f91e6398a15e2a8a29f39fa1388c90a989fab5c4d7588a81a0c4a6474458133878b6ff2debe5ed3ef79a37b4bbaeb533d3cbdf4b4d244e67d696468b4bd0e57d9bfbd135d4474d328781dc533f1ee55fd76451b897b371fda2e0254ab471a05ce3829ef7faebd9412388c93852238226341b65c13050de9a6bf557fac971e411c1384051f82edd30ec42ef5c398a4072e0ad861c100fa6711715ade39721175704d098f1b5cdf0c90232bba76ee584561f919c35f56eae25f76138aa7df0267c494cbea5c0d7bb00b90ebbed12af1015af73e3e0b35f4b72a5d132209a85bdf4a43045d13f06f5fa6a1d8b3aa9b3b8af9cb010f0ab6b1905ed59a47caaf1dd6f8b4f20571f8dd4ec90855f7e1a5557e8ab768d8cac2c0fe34f967767f50e18b8485bc526c1671919fe217791127203ba3dbe7bae2207b752503d82e2934eff74e3ac4ed421dda267206b60d47739e70612b7635fe919fa6a94d57d1d8b4f8e56676a34ffd6cb08369261c1ae94695ed18b9b2c10582cd714345702b7531ef4af9f36132ee497c7bb71357abff431224464c9c929eaa545db3d745e406e047f7bc1bca5655741187c22487d2b2327ca0ae85c4f4c6e18c873b240380a22521098886ba691d9419e21e9b855c0d594c30376418d3b29729dd1722adc8d7e882f2b70e45b966d05521c529d9fde1932d9828b6bc317be58a7c144687298c7737c420faab79a5730905242eb5a77fec0a889eda79d4c85aa4298b13b727e0dbbaf8c6e2060c1ff91aab1ab04e0923ba25edce2c5ab8ba7803456c8487d76cd05776c6a028792d85429d67422fd7f5de5acfcfba1dc12542c7bbda42f9809af836cecf03c994529800282af4c3d0fd012b1fc45f6d01b21a785bb52e1b6576a6c81bfedd4c4977ed3ca7ecc44cd0eb5cd3da0e781bfe76bdc55dee121e810dfde06ef74581c11bf38affcd01001ef054b3232fccbb9b03c5df0bccc29168ec5695adb26818b0bbc16c80fd6e06df839727e85f910bc30fdcad0d8425474b1400f7010bb606e3111205b09295f017bde58d0064ccad0362811bae6b0d10231582196cde6f64567f8b25276e4744202e0aecfa686f32fbb56ca9581c91e526aa3b25d7254d1613c029a5d115a4ab399b89f08586d244b4c18dda41d2c06bb4fc43cd4f4353edbe9a525b5a5bba219cafa61b98bf4c354b99052d7d26fd47c7e933e46027ef8b4c6ea74d9e86eca16b0d8375f29bb6301f626a3b34f505f5a13283edc02f745dc9a7ac3a94e9852385400f7ea32f76e800a947790cd08cc19661c0c2a522bb143644da7e0609a8c85b9b9c485fdcaf183226310994a264d08d39a5f42756aa6828659a43c10101c5e5ec4e8d6a3859ecaa6fbfb4d316e5f01a9538648b417055f74fb6456fb62f1c294ac6e757951cce8baa4f8de93872132c4f0be372fbd97b6de91aa95266fd4e6badd9ad97cfc7e3709e2b07558abe067515c4f26d221248e4658d812fcef609e8a181bca165aae03f9eb580f35f150d63dc7c91f31b9357d1bdb1b1697e825336953c0ee0cc6a842ee949d262865388129f2bdc994ae8d86c0bf2e89a6f8de9009aceea3b7a3d635673b445501b32cd528e8e0cb06e9e744d073bcd151209a6cf6d96f0ffe03d221d9e2ad941bd57f2a73c281ad64297938153db167f53d3cd0c3eb8b9d9a102d76081ee1c2dbea37e671ca92a4a98c113686f098e56198719f129b9d476a4993b823edea10001545dcef644eb79982765afb9209413311ba28c88d5475fa304a992d2a29c07ef1c1ae60440656ef0a6faced862f0fe290e67acb18c9177008d2f8d5ce84da1deaf638019ea34211688da0f8ecef5f916856b3c831c0635b45dce2368c43a18fb62da2ef093204e4ccd5e5c251416cc2dda95e72a4225a8a8d050780c8b69f0344bf24767517518832e5909254e0ddeaf786b2283c2744b1d445866f30272bbd6356d17961305aaa84bf85768285b62136e41981379ee5171c675aaf42a52be71e28a864388881099f790a0b090c370921b4a44c5efb8f29ad571b1507fed47049045ecd5dbfecf497841daff47c361bc0d5499b3a80b5a299ae3a19ed2ff06c9e4aacc4a0035df7986932cc418b715fa9932425ecad6345fcd63995f6a8f4a959d3fffb37b316023ee241dfa56cb5f901eb9611b2ed7aaaf4ce6519dc1100cce586916f31c33fec4ce7049eb0af9778df8c63bb9f9179051a3a9f158f83a7236471e7d42785e9a3836c905d8c829528e203dab82c0d7d2ad1a95996a2289b40bc44c8e1b00493285b8461e5250044310b764a9df757f732322956dcfd29c6446bbcc8dea6bdfd250d0b82d9e1232947a01cc8674e9c70e17ee28c90e85eda31eebde7186c271c36248eb631ffa895f507807a7f4cdef1987e114f8f7623b4c84719d988ce588aba6b12f1347d526fd288d5f65f27bb71e4189bd98984ef3905e10d66c9895939ef98053fb6e3b0c46292fd8abb9c79a0508049176b29ed694a0e9535b4a25c42bf4a5d88afa89508aa482a2ba16336e44e96b34b2e3d91cf987849ed3671ce2c87c3857eed3a8bbad51cedbabf2f8dad9adf670858058d5bdc37c1021ebedc63952337e18e5a33b09d21b6ea4b836502f8522207a3593f4c269659394880f5d453a50158330a401eb6b4e0f371f7e447a1c9bbf608b34e8574486c8fdf3ed0838fe0aea7fc2901c2f91205988cd446972cc053b15100125532014f1f4c40d31381508a91778690d760635dc267c74a2584906157b4dee696ef4e44beb932949bfc4910085e0aaff97d009db0142e14e4eb7b07ccdda88d8840d358f8cd6f07d1e4ddaa469b5398c8845b40c00cc57b05b2998e49e7b47fd84c5fa120885171f3e2a0415078deee75ff9056241ffd417030834e1a5bebf2e6b8aacf0c612e5d90d53716cf3b2645ba8c250e5d4e403b160b63ec14587c57a5b55108dc4ca0ba1e32d7b526e23ffd50e1f60c4d817ed8ebd4dfa722f692eda8a3541084bc758fc6bfad34eefffc4f65f9fe455b79656fa21d3c254b1b2efb50acf067cde5f83f5c295d8b53f21dca3cdb4b4090141144c9ba95eda3b92f6d2b8d7f0d941748643cb2d76a42d81835f6877058385114856b265f314bad529ccec6c8d480eb4a4a27ba4d63ed7722579912c95db6c09d8ce74a283f6a001ca23211cae3e031e4299cc2e77cfd0a9cb138bdbae9744b279ffe514cdcdf7405a26075f8daf3258cf01bc07688dcf79ee130bea62ae75b621683d18ea665409051530c60745c15bb6fd0c1ec3c64d56cc538b2d0182e21be53c2aa6e76002935463d2951df6c00db316caf061c81058206e1e9f8a9206091880c9eb2038ea01fe85f2e69b7e8d6bf41793e155505d100bcb3a415f0ef4aab81bc2c209b651d71b2b4c72ea8a73a608a0ba759863544e90a2046c19f40e7a2cc44b8d44773ecad4fb675d646ed15ff1fb404f7442d04a0c94f90a8543b9dd2f5e6cf6a58fea908e94a5073119609098ab29278d3e0c6c342c7be803422d245cdc60968bd0b2b52a557123c3db9b915bf17a2300f46f7a8e9c975456537a5472ddb233d5ba0330a39113150d470dc930917802630c8b386e14a46daaa606c6bd908a71dac445fa10e530e869013839d68eaba99bc373a1c68f8ceb781a18eb4c717df20d6ad203cde3321e4402179251a18f9b094e89542378429cbf819d18724b095b09eb19f94a37b49409648d51939af69c1d13b22efe3dcb34a387e232ba82f784235a71279270a5ead07e6202979f277a5b9a433119853c75fb09d0a42267ea6501ecd28940c47ad506d607d6078e5e69bdb3b8fa8d7c5b0b78ffb59a99fae287db44ef88a8bf1b007bb5200b12a1e766d8d346b37c46fe53d02da63d840c31cc1cec5a03469bf71ae6f675a6c82663d0c90bfed794f1529069a0009c6454fe9bc1650c8168a9e10b626d93181a1514e325f28fe3d0b4c07400136bb66eb513ae5a3a39a56d6c695a31eadce7e9f809e72818422b713a1b968eaa704eb939d0740fd8d810b2270dd46182b0c37d27508fc2a7ed30fec8eac2f1f0f8da0b9706f4dbbf93c97f0df6bff8f125dc1f3923a0f2a9bd13871113c829d23530404e7b9b45da5170f28db56302c551023c33fd4e94aa6de0f7e3ad0c0634c1d7899116d5c1ee2e52e0c2ebdb8f3f2c1348666cba7fdaa7881a5abc3b3dd2cfd36b8ecbb86712b5a57f2b2698613eb07afe7bc24d8108349981b7323f860945928aa4f0d3890572d677973b2e9b47d31e0d0d11f203d1257ba9fd02fa0bf5dfcd70f1e54d31e1600640f62eca3782ddac1df7eb3ad8e7bf8322ee4e76dc99c57dd06985bb52b09304aa4232683d035fb997e9b8b5d1bce738f57c469ee1b67547e3b1cbe739d02d86830eebb6f44f28bbe2267543fdb1121011a6e4bbc25e859a504a1ccf73c1f83ac9f174d1de405661c4b75610b7ff6d89618cecb9cd467de98991c7feb7fe7154f940f74b85c96d032bbc5ffd6bb38ebf6c5436a2f67b8d6272e0a69da0d774a7c8df7d6e4aae5a15d27c63719459b32a7eedd5d83cf6a757cfa841c6f70d1cb9347032292c7004d088ab7199f39ac34b2affabc84b37c7818b3196fd4401a38bb35fce5a6eb23d45f53ee292a6f1fa4ea54791ddcfa536fda46aee7442ed8a298930af67b68810cbcc692ee96340f9f565231d8088612fe6a0ef30600342e50caf82e4af23b960e25deb3a7c77535dbe926b2b254eda26a7aebcd5e831ba2030652d416c9493962cf2f34568b436b949675a9c766b5e90ff39544d77d94be59ed01ac18349c5bf4410a68f5b91d36dc8ba2def2ad0fc94be0f1611c5f635d867fb760c38ea3aa0f2bf866a18150c51f348fcdb25462265d6b26de6e183eada69beab6c715d67f348b6b4a89ba75c3dbbc6e12582bd5e10a9533a55a5056ad1072cc1376893cb09273809ee761416b8c34a3b6dc840cf296069c54edf1e0e9989bdf64b2b1432b8f0be1a186f0de2a96550981fadf7976c92cfd231368880edc2ef11ae155f8997bb071b49f1047c71b688e9d469cfcbdf6b1d095dadadc3a8e3b58b458c46a2d79c8a91dc4c412186756162125b7ca1d5a0c9a40e882367d3174568bebe1cb0ccdaa3722fbefda24160791578a582d1b1ce0f4037949354a7b49bb79d19f864dd62e96522f3ece53a78dc7b9325c66fca224d24939800d048126949d63a58353faed178e85df8c567d39ef84625111f04cbfb401628a50b0ac43eebb5a207dde5fbdd7dd5c7a9ddb1a55191670f8d968188df5caf304306a7fa1fcf5c4f42f8218b1ff985df43ec0e32dbb14505931d036cc186f73cf998852e53ee34eb7c76ca87b74069d43c48a46f4ea580805d4347ac22fd05a5280d49c4063237676992155448c1ea3296f7951e8a74bf2eb4b0227502a940957d34674eeb394268331feed2c3c94024944ae22789794b244f836559e6072dbac936419eaceddb85be91003b851702884232e82ae1b86fa07bc2710259759bd302202a0e4480b028a0e900ddd1b1d4251f4118218fab416d8a44a198da682f638862f93c417e4b1c18eb68eba01b1e933094eb02f6170d7941be03ce7fb9f65a680b9f02dc073c9e5eb3b1427710cfe5176ba9664000626b8ff901aa70ceba50f84b8c3378dd013751aac39e09f33976642f498cd902804d0a1a056db7883541f7dfc7046fae6010fe938c988b164c58cc94e97b43f0c785085df5ef2285fdc7b670c1b312c0db8e29fd1fa8108043aa5dc8f4679a0d6b49bdc5f7a9221fc99d80b75f8041208d062117fef46c66bb0cd454063224095affd02172a155683532f1e6855cd0281a859d84a4538b21f45ba684ee8866fba18ba2e4d5d79c08c92256447e33fcd742483a31faf61276c030abcb226436b308b9feccb82e79a6712d1247f5c6e31588caa489844d7f1c241bfa71001b771a1786610d9a57657eeb10bc728f406eac48cf40abfa339979d2a65979deda37f403f72aa27bc1e56f92c35915e9733d854f58ce06b1c210dbced00dc2cc098e3a9fabe5b95890e56fc7e346d7794ab1c915906061c90fc09d053d44979134c67796493432f7b6defac53d07ae33b4a0b926df59897943af8238a88e273ab2d57295cdcace3710150b18b8b434d2a9cfbfe594856fa8cf6008c930ae54f9b4ffd302c808ac6511835fd3566bb9d6cf13e7d30241e30adba399344d19301e5986a448c9bb0e94890c106008918199e7042b400fccd009cb30bb31d07c0ae46397ea26a7de117196aafa22984488cc7c9b565108212e8c87640551374853e6c9b7f8eac97d9d30227c0ba35049fe12693120408969d2975fa1ad687cc6400431e325cf183003cf58525dbbd67e5e9ebcdc264ad9de4689b3e47a0df71fd30b5821932cc122d59ae795d1cad625a492f26a1a09efd8076a34034cc0b4ae226ba566651573af560e40cae4f39d512f972a8e4faed028b762d3b8d5e578c011d0dd193a701f07d1f6dd966076afb8816ae51a930c0f0ecfe4fc9bf1d12450e8788cb5c84b4a0cb15a0312db8a3c89fb45bc29300b6c35b58072269e60223ebaca178b27fc93710c147d4edeb5871f1f76c04b56a27ef3038670739a5797ed82c6697fa688fbc0e5687dab7ec0154d65c40864ae59794f04632e1136e17f9dda4fb88a907522be60543c2590ed863c30882552209036a3ba9f7ff315036afd086a58403c600402cff2c102e5fb837dc912895bdd1dfc6bd70f394f7200e8731e38575d0c1b231e16dd5e4845b6c1558790f13ea503c5c8e50de90b756c2fe92f55837501ba504ef4bd5e0423ca9ac04778b7ee904673f03c3f943679ff147df1efe3540f490c6fb79220a2fb6b7b8fda7ef08e6fdaddbd35fe1f52a1d4b8968fcca96a3e7e99b56aa6504e28570b13e0aa8bc5e7ff98c5b3e2788ea5239113399cc3a81339e4e67e75359086c6493cc7bba654f82872db22c7a4b7827d51eba461e320e01b4f2b00d808fea301094f52f1092f7451c7c6c1d24600af5982d7670f62b61031e813e32371c0e4b79a7ca00c3a80bfa93c5f11f5dcf7ed9c4d81624d47f834f7c92daf77de0bb52866c9393899309e56de131898eeea26c7f0551bb8157c7b818ac1034490bc383512a40c14eef6b0f01f192633d940d8e20b8b6d724def5f24d80e1507b65392842ff76a63b9633a1df7e7377eb1213d029c6e6433d132093d61b5338e0461a5d787fb527d4afb94feb2140d0f2d589b8189fb58a22dcb98f8bd3850c055d17d1dcb053b682502fa069dd87db7dd35f45b7f3e5c138d945169ec65101bca7dc8df2d86808f9673bb7586873369d4ce8b8bb45c20e3153a4d0c2383e32715bb1fa419196cbc0425e32c92d4567fad9c8563f8b7816fab32592f643034f17e73d40915935013a13db9a0cce19765ecf196f9010f28da935bb9257a2feecc396dbe7b8615eeadd1e33986d47eec251ece7d2f766a65614e2666e9fbd4f6707f7571024e9f520aa08095ce192c3622ad994fe31139225563a670da99cb9eff5bba867aec82b2c8548b5f06d7c288fd783c0fc276225475191651cd5978b9ea2ee122565f03b1bbf43471ae3a1f8e7c5f6c72d97d8af78903fa4a15ef8343076d258af585039a56fa6b553c611430b3963e0aa0d22824b8dbf081fb27890121e761d49919346d603ba2f4db73adde50cd045f0d3ed4f23fd2625b1f2e67863068168117571ae516277a62134fbc9cf36e7a16647f902dba7eb3dd063f2b05028bbdb354a2192e5beebe0ce3547c24f7220b20945ec5291c6495af86ba82c4ebedff158448a687e7eb8a0c8aa6be669c80e0d8938cda04f1154ac5cf6980d00b305373f592127e453f8efc0a564a86a1e1ea82cb2c8649b7be2a8cc5059cd59ee9ca03788d79bd67906d9e5faac2ba1752f8d71fc00ac85b4d4362640ed03ef4ede7bd3d8d48056dc7b884970a0322747cc89b271f4002e8e8d5e3606f3e202722b210dcd200de6e76bd18f4bd8aa3b0fdce775a4aeadc49ab8fa33263814f3213cf06b3c94cf28165c4714cbe36267340455a7d10c89e28cee99b3e73f03b1b475cb7368ee2f9b7ca29375ad5c0149af5857b0edc6505a20613b70639a0a0bde9ac81c346e80a8896f0366aeded9ad0091258269bbb3b7b257bf701b07f77e37a3e7823879d788e3808d87401f42d5cd3ebe8a1ae2e559ef2ed23ca100760d23bd924c05cba08be7ee8837088f529c321848e3934a2d5ca7c0d495d0d9ce24f3d3aacd7e7b0fab7b6402a6e966b4b75b6020184b2d0fe47ad01bd0dc5498ae2a47707d876c8f77aceda7e64f8e51822571a2adfe655fe25abb46dbdb95384ccc20f5141ea4a949993840bde1ac259b0becd7463219b5256cec370803cd3c9370eb34da0c5f4596b569614805e420cdb739368e324862b98b21c914b063372116f17e6392e0b316cc664f624062244ecd4c422b8819e626bd8fef92d3e2b043182b8cf764cf0c9d70a082c89f49342a8e08c5006db0216ae82ba62fcdf780a9c5d23c629cc7945c41a19934ac57668ce8f47e6c0d94e85d9219553591f9822c6d85c2d9cd8b134fe26a3327b3f7266a07f896f358fc33f3a6950f6822b4837d3c42e638c184803a1cbcedcce6acc9a6053693b5f8f32fd58858816269346dd9a2423fa34a31611346c3e557b10c946577b4e923390b1052b071f2b963ef0ffe025e9151b318c16729dd8e3ff039dd2b7897031b3367cdd96461ddfaead33741161fbb62f620a92f286e2c0e443d1f5427c452d5a04d61bd6669052cb3543a8ded247a83eb770170c387e88416b616d9add434bee60a2a105c8f42df583db51b4980e72ab40ae70f8d14903aea075574ef49e0226a3a90bd28c09dd559e2ae794f1e6b3e548eb991badae70edaa6d627460f27478526905d1e188d2fcbc8263716171a7131c8fe97e82e00a659ff182ec45c95e989eea2695faceab435cfb611a58e9fc6f772b0dad7518c053f782579a12e4e15bd9544dde97852dc380c8c903f6057a02371a77cd075a900630b63c72039ef386ed2110ed41702a84b841eb94afad1c3c449e5f3ca229cf24ae3b6f51d5f46bd687810ed49146307950bd3de225456125990adb44e36ced2a039413e003ea65698d647bd247d374659e7341a0a347b4302c11e39c2f6d0e4e0299619bbdf98eb5d1dea6d36378b93533e9842ab250ce8e8d7c14f39a633c7bc50f07815a3b4cdb6fb2d2002a50dd1527edc84c34b0d366a85b362326ef00e93cf873f67cf25a8abc272385c806354c343b111ef55974174b90625b08421c295c381d9ca307572fae626252f47cab69e2ac3ade7c8e3510cc3edcf4411bbc4833a67832f4a497a8ec8af67d3f27399feadd583ccae2cb7eb2f168d5f815089de864c938e5c4dba3e002196934a43494e9b966af1cf1f946f616adefc0897157c2e6cf3889545eaf56bb20db8a713c4045519b88668e21f323e70cd4a2b0b501c5024dff373440560d38c38fcee2df5b6ee0c1b0a2d43b36c28db99dbbcd4b6a2331820d0a01f0e73238ed8e5510729a96432da704f221cce18cffdc4280c0de75c3d459dda9828ebaaab97e7f38e4b9f1fbfdfd56d6c8fa2d389736bbc093ec0d15225bb383974aee7e8d29a8aecf77ecd7b36b8613665f785fe2b97b6683e8fd9f0b0fd621be24cad6820c124569146e3ff9058cdb02cab5c514af0d74854ead8844124e557511563a551547089728c129e7ec40fff3d855e058fa006b71e4c03c80c093bd1c9375ead66fc1164fec71ae91991e2448c60b18b0321b4d6639209d0646fdfe25a6be2cdf57329235518b626142d79efa791ea79b43f0b0e198edd64f61eb8051750fda64a46634b0a0d45383638e503e0489f6710480b9550d2c1acf506fb48057525b506a465dd2ce840c86f71d9e8cdd6be9d1011d670d8c13603f5ebad5a375079163d497462c92f4012aaebc20aeda3cd5af9445235f945ddd4f9f0d4fc496627a0318cf8e1b1406540f526cdda97d82f9a1008b16bd83d6b4228a8b7270fe37144f6d1316faa9bb39ecf2724efee1e8929508b6077abb3971b9c0a1144d9f4be10d3a4ee4bfaeb35e8c90bc0e23f19c242c3fc3880beaa632c6ac29622a269fb95e9e7b56c8718b459663cc3b2474968eda766749221dfae1b3ee1528ad95d8355af51f8d8de8483203ad86b7f600d03238a9795800e2820cb741dcf4bdf6bbc6bd84cc92e83ecf3f921e4dfb95746fd8f81b8842369050f8b14a42611f8b60180b17a73615a5bc62b0cb9cbf6701a859d44800debdab5089a24b173ad01dfabc2e37077137bcb2007f025ac0c97f280899a9e88302bcd86b821d1b80c5f4974e183f3382aa00a8979803b3d95adbbe1cfa1ac45615949dc639d743ae7682ce69b9775d17a88fc0a026403c61bb22814001c8af663e3aacd415f7cf03a531d2381b2a39dd180d158d168f483dd90d7057b604107033eb0e3f8ed0e12514ece89d8cd196b0308c4bc78c4cbda566ae3dd975aae6be68ec89990291ea54ded919045ddac4ef22389ed1aa0f12b1ee4c03b8efc5d25684326efaac11f2bec9d40162992063731ac2e7e0bcf6d844cea221803346aaf489dd3532694d1a81b6845807b7a8d0b5fb1452838e9a6161c2d3a1ba47594c214f12f3cd7495de71fbad8db84b54eef2eb757ddfddf6d9a280d1b4377e77312f4969247e6976069e8e02fea2739327082db20684d1efbeebd739b6af2143bb7442ffeb37c872e19716058c9d2e150c9b31dce56e9f0db566d0694492e79c33403f9d17d02113cfdbbb589ace91f0a02720f1aaae8c1c434489030218c68a08cb737dff34a31fe903d6ef7dbdc3b325e03e3c3a7825f4df1964c3572e3d296157a0fee32841ce718d1585684b997bf38bcaaf6220770eb2efc531266d7c80f143db1dc73a92bfafa1fbefff5bbd57fe731f08f58a52d1522d2fcce013f9356df15eb14a32f384d27974cf38a77056ae11462c462f93164f1714463dbe79f912a349b6a017275c47eea4241a60d3c030f97241aee7d7d96d99d4e179afb3040a8050012e3f4abf8ba7a1bd90d6353d8828cb747cc539ab171f929722c38fc1baa9e5c8840a7eb2f34668a998b6b62e03391ebac3ef730e5348178ca482343e7833360672349b64ef9822556e71da7f6381ca18fa9254c36fccff12232446be6d0274f40d23ffeaf15ee014eb2f115f02c95a95d818922217a23a85857fb87064edc1a96c5888c1641773954c74dd6b16fc06979756dc5e2f250ab44bf4954ba0f6d290e6db1f431e0c159e5026e0fe8090f747c7015552e7de9f88a8e5d2668210b62731e65b55d00f543ff28d9e0b925db89b9bba4d2476b14d27923997080c0ca5adb1cedf1df7723ac8487f6a4b25d537713a9c3c49e6aaa4b51269f092fa00d4553e00536783d416248fed70d961f065c60d2530da0af9aef37a41186988a58af099750147506cdeafabb345b871ddd41a0c1411138cb84ecc19875e1cfd7c6eb4c8a7f0e39f943d00b469420b8c782ebf95b88de173d1ca00979a20695d9e2f51574a9a7d2b88c5534002acb1ffcc5f0b7ed8a752d4614489110a554edf570976438c0f566c13f205cdebb2239a3a92f38ab88c0c41f510e7312257ec7f9c28513a37443624b932dc42b1f612068700c9f8c655476486604d8422a4623fb9c84ea531b895166d7ed551ffef163bf5eadb9393548b884ba53880d8272d3c1baa3c19a75a530416095dc0796d175db8b54602c3f24cf34d5750b34351310ce66504662aeadca2ca8ac8d1dbeb3b3cb6c3a435d1f7e5a83974b205a19e418cc5cb709bc553c6dbd9532b4e883991b902067a633fe4a7c55e310054d5a85eaeeb7d105dd35f7baa17c9910fb283b74936feb59ce007c1c016633ec81c6c445e6e01a581418f700841f41b286753267ae3cc94b3271bade223325a59a55ec79bf09e9015ca931808f41379a310de0683b8b517e7270821b048aa85aaabc11a0cf6d6eaef3ba92a53f45494a3d8ce9699b1a8755e4433f2400eafd891a4b9004d422e9f7f69a45aab220026896d2e4e25c1f19620e4e080c83246e1dc063dfd43abc33f8ea94ca4a9cc3ad91637a1b1af47074d12789102376c60ac84634ccfaef71b2e48f67fe4a9b7ea3435a2d7200555801d723440188998470289a9d4aaff19f2bead2437e2dc976518e971084d2c2daa0e36594e338f8bfe6c04e9cd1128c4b9ac8937582040b83b7a320d4351eded8aa724430eebcd0d88e992b4cc2216d42e59bf894acebb4f307052f0bc3ba0ee9b709971ebbdb4d5f546baf36e869a811cb6414e4e176078bd699183cc0515773fe58a2a52cdbb85615d37db68c8b6b8db0318a23acf36bc0db18878dff881b4a2720610db3508b046118b02d2717f3c3e8a93e59c97c488873f7ed5239551a2f0576ec0290c78ae0d4c267245d0bd3c9323db6de57994b90bc50ab1bdf30fa3cca6f83a41333e7e14e96e87174e36e80019d036f750ccbaa8df9fe7ae8ae3a0a09314023be2a140914bf070bd3e2b64bf918d9499690054502f133320af031467e1988159f34acc0281621605407444f9e31366d3654b5c83d5b02854a6318add6ac1d8fd4a942d4e813e222dbf32b002a1e2042eba9401b2888e621571192dd3748670d87d5d737793ba21d6d6e12c94b034c732c1b2aea973d135770016d40630bf12e085f07a1a05d369acfe3fe2267ea9c6e6d2c3438f602af08de5b3e88cda6d3840df2fdb794a30d165715a3c3409ec0a94ff4c416dd8571e7f82cde1cdae90dcb000eb21ac8b44c88349fa67b05d0e07d80236ed17ae6058c4fcca56ebae528e367c1594c0e8b78477b72d084b375c0bcb5febb640a7203125377befc73b2b88c9607ffcac20e68488c456f72fe6d15a1bf7097123027f626b4251bcef06a85eb00da5f80b58978faa1e5e0364050213d7b4defe34d533c60062420a04e8c80d5b684bef193f7aa2a590c42ade9bc9b1184d958b199c4d4b6e0eb487c82029410d3411cccde79b47429a04931717298115149818cb0cc06189be8d5b2cca2b0f1aba7a5945766a740f3092d31eb679794ac532862e6122f3a3dc077a6fc20c214cf4ec93f53a50649f8cfb592a41227c38fef6e0858dc57d08fd2d93515dfd12fd8a05095eae91a2f97fc65de0a14adb5f89465f4ebf8a4ac132afc217ec12d58c2a93443ba48f8199d01457c47b9e7ac9582026b10145deeeef2ea565e4039e37b6961e71b3c032e3eb1d1bca617363b64528222a5c8f48d3915f40575bfad01f94faea11ec40c68446be5909ab11d7545a13d000017f88761e29b07083215f2c2bd74a2bb2fc8dbc54718bcb0007d8d3aff7084c3a41d2123ca7fc70bdfde176dea5ae5f040f311ae6f142a991a4ee7b1edb5400d61561f98242bcf4f9e93f11c09c2d3b6c362f24b97220b22a04236551e84a5e2c2abd35b1ad552f5f77ba6c83f0a55e86e75c1ba73a87fdc2705ef1029143c4620bbd014cdcc71aabd8262fa7de2c879232dade70fb5047a8ad4fbb05ea0f0e89e9cbbb6555ab82235870782fae57365ee987b8de86cc7f6edb015545ce30951ca585aafeaa44cd56198742c5d1108634e1eae12e80be5fe6facedb65fb0a559e8586961724819c63f94241262eefab0e017fc2a8f8d78508d2f8a63b33c444644a8c9f45e7eff2320d84bbc20d2a0724a176db257217ce8358e18ec74f05f77b6a734b1f31f641cb6a4a032c144322ff919b9c2649088a82ce02812214fe0c5f68ecbe065e0425025f5587214386cf8fbef30c55248392f548af6543a167b15d256fd04a55a22b76b1671cf8b769c998be6b33d6fbb63dcb1ed06f2faf6b96b7f841658be2ca67041e1098f3002542f6f5c64b07ded705c3cda01ad68622a9e68472a308ea2a1d5139d16976b0c23ab97f6fb495779f16b403f0d1657b53b4787b35e618a0781b0cb8cc93ba727a588b3aefeb90ce3d2af886d76b3ccd7d984347d69387be000774bb9ed5c33ef58fe8a4cda572f551b825f8d02c5915c406d1ce65d56fc3b75e04107da63a69f272cf37a52e1b2fe341c5b6d600c787a506506f71cf42f093a1a2ab68092d7da83a39d6f1e5379657794c990fbf11506542c3820e52ee370f46e92a4f746af0abf0a634f02ddae2f447da1bb95de7f12f03a986f0d1d597d3313c13b89f5ef58e8eb3aa752d496dc09deab8c67106fcd335236eb421238b5f4bb21f5511cd3a60933f1243c5dbf96c31a16db74e0b545b32ee775e13994eb09aa71423fb0e6abf94a31c400471d469dd0b97f3a45c39aa9c6cf72770fde55972e9ceec0402094c13ebd9f404c11673f7c685ab42d58cb7421998205fb82a13b20f5fd1a5ad08249fe027d03b615a3483b85a90f0ec1e1fa4808d773ac1c2ebcdf64eb076d29cf30b11f3e4dd5f3205691f85b8459e7970dac3484b6cb122ef92e6f32d30ae862f05914f45aa7fee94553b3163cd424d2805dcaba4dc0585f6b5610137e24a9b8659197a7c0b19a887cbd44c588ab6dff6036dc530e18ecd2385fa3901c5ac669dd51c7a8f32b3c508cbf19cab173204b6714884d6d763509791107cf8f77319d9723378f95d1e088f69fc611a2d77313932c14f13453efef2309553af9d7f0a410948f32490e1d604c5cab80b6852144083b60ab3c3f923d6ee4ffe5dd715c1bd7743c097531ad26b4eba14312e00303cf4f97f15135c249a6405a9d303e3b2f61adddf18a0fde0f73606d51b32be437020ceeedbe36f1c417b4913508ebfd9e4e09ebfe8fae66d132eaeb8a5e014dcf25dd569648f8538d7698bef655891e184e0c630ecc541743435b1f59ed537448a5c22ada021d142ddc8f9baa10724491fde9eae5f81f98aa3c2fce9e82df59a5d3f4ed946911fb29e44ab7c7bfc9806563e0e34afc1743aa31273343db5eda8f7529da9dc7082f1e82c6167e1f6ee8bc44521727af5bcf1917e8e4d6181cd0c35f6d0cc7ddee80b9ce6c61dbd6f821b09e77f2cb76a654009f8de18f1f216f712372b411cabab8e39c8266c58b3e790e0d05456eaadb4d017114a604bb4e52aaf25eaa26069a8692d25ea2fcc056929d60ee2de1f7825fb8d2e60b5a106de00e1245df3ed3f3c4041127943b001e532463202b9fae89870f84224a4dbdd2cb53ececa95d0c336b392b249cf782604f4093aaf1982c5ef9c3f52f43afedfd84a528cf6480d22fc0e68815a1e863309064372d8e05585f184d88986054cdcd21aa3475aea56570195855e7aebb9352d6fc5a19b88535313fc02b09fce447a72ca7122d1539ae47e1cc7175d7676d87dd04300af82894c92a5f00c929cd9eeb52c5cc2f25cc2b7a71888764e7e6bf599f52aff77b817f431b23077156146646d57ea04ffd676e0dc7d614607e62f543b1c420c577712a75983dea30d74613925e87b81d68a890b8b5abec28880004eac63ee2f281fac5c6900b893f3cd8f063526d156af821a91d4cde015fddd92d29e1436d781554c6ec68d04906c6897bb06eb4e2b444321bdc61ccfd1def3ea7655aa46888e42f34a18cd6160c80000823284ecaa73d40e2025340d47a3af2562512e3b6e486857f0e845e40635400e940c1d132455296a239294b4a31805f6d0c005cac12f6cbe9a7e5bdc68d36f84b549602107d7aa54118b94319ac1edcbf79280706cdefe33db01c98225c9bc4390da58d0610c5dc68f310acd19bc63464b4089fe195ea51b2ea37b03f7ef1777eab9ff7a168bfa9cd5119459733e4c1a988fe638b64f5b86bb2050d885584e8eb2649362a7a8d4277d7820911f31a261873bbfa6183d50699aeef1e6331da71b1986a3524d055d918cb17cd8ec47719565719064bb171d370bd7b2bfb886997a53505efcfe85ca0d650bb3436eb63b5452143904e76084e04f84dc61bb08fc7a326b970c63183a28650299f52e5e9ad9d188269bd09dec555307d571e6a27c3510c9a043eafc5a3462bd14121588260ec11cc512a8cd46b7849e429be31ca09ab6fe588d37c9849cd9597dde9d51a2a1bf400680595bcf81b9db492999f2768f9a138763693c8a689850814a13ce408f7e3211fc7136c45e46eea9adbcb8588df86642e02bdd8f7703a582bb94cb1455c7011d8c97b90ba798ecb096acb299898bbe6aed725a717592b5b93cc84c2d19f7952387a610e0a11e74366781a2898ee5a0e04e59fb428d14984a6afa5e11b18f0c10a7726424727885542f945221a73f490172472b87986d187154fceb3af0a11730fd344ded9ba60ae90149be21c6a0ae274002f4344d0e1b66879375c54fc71df42947c0746b3700fb3af5545f09b9d4895e7a0faab188fd01a3da4d38ef85a8bfb4fe57fe2a0544cdef3629d88abaf8aeaf3ccc6f1793c9f5fe22076482974a4dd66fe461d8d09cca8413dd5b840c50f9ad22815f473f6fa8b26032c16ccd13a1e9036d3eb7798ad3d180269af9a769887bbebd85e5b0fc7b59c0ffc42659c91a9437451780fea7b5bca036e77deb01bd466fcc19021aa12832ebac2804e48faf67265863da82d3f7d366a0668d9f51863c8cbd467720eba0b69b8c0dd2cb1045c8cb2c015cb61295fd1bb09fae636b250955a028318692372995b23dfc83521c11c4a6b4f2bdc20511f0fa76b2ee93d89c820750babe164274cf8d4147afde4d0da23ab02e18786261edbb6aa2e5a7a2ec8d9d79f72fb001bbd6009e68b8ee7c63088618a392eb424af6ab84331ddea1be805b3726aa64487ea8607ff94819ae8ba073b80cb542fa9a5332dd65c17db7e00cb71aa02fe525112b6e7d8601495be96786b2042d5f45ff719966f886b1574b50183127b6097850fffb81c512205114d70f47f18a12f46071c7e92c8ed9756581437633ba622002b9573a239f4937450f52112edf2796e7c9ef7799b5e3f892c428763023d99e191aee4ed52769af65fd7c48e3a99b43bf74446b767c24ff239699866a3c229a8b0b30a191171941773cbc9bc55f91333f9bb729dffe17789963f1398fba4cc4c591f24c546b7521b455cbe206a43984b956614f64813c3d31b7d9e51fc1667ae687f0b5f6f551a702430fae83eb192f348690a26911881be512a727bc03794b52aa8718c3cba37f0af45ac16e17254a7994c8bb44ba1c1e09533748f493d7360f8966531ef42d4146debe8c5ac59a667fb8601c6406cad4ed7f4e9d83b38feba087ca9055e7b9cc6852819c93e5a408b62276b42c9dcaf455a27b6413494b1523791ee8ea479eafe258506cebed1336647c16b49ad0e5239cca303fd588ae718714952b1109f09dcd27cd0e4c903b3a10e87dd8bf8fb54ca1444f1b480e48fb38777d8e3396aac53386933873cfb3524894318c39d8770e224b4b02376ab3791eb640d9430795f3e2243dd4747804ef11a76a0a3f01712c91e04405478b5a0e75ae8a067aee598a9b2bbaad0637a998ac8e21622f29561d95dba8533c4b1b182989dc1539462e274c1b544bf7668cc21c01ce7051dbc6ee46d389ba26f78856393779de814b744d30f10cfa048fe5b7a523251d74dd1ba7756fa7023a3d482d37b208403fa2f5209d147368026904fd0c9e2492688ab24a995cacb8611d42f95576fd837aa6516f6169c1b0c001a27656c9f9755b8ae549f58c570aaa8b8f7c15addc75613bcd5a968b69ad539df789328803bd51b07dfcc28186234f0b46f33ee7cd8ac35ae162dc146a9d7c8ee4ea10e528befaa57bf91481ec155d3f038539ba025a551fc4d14e81bafd11194f4ec902fd0dd7c7692b7e68396a9c48d15e2185ccf8b1a650fdf40a855b75c613f54da380891c1a0ca83afe56229b410ae013a52c00e07602f8a6a1fca80f2b39cc877b40b1567e9e3157be457ac03ea3f9a598abe1416739a81bc300f45c234f5d6be7a879ae5fbadf333322082c8cf586ab23eacb6ebaaae67697908a675d55671a43ccb2e01ca2bad0317377a21bba15d92583378a9bf66326dcb086e456bed3fa482ee927e3ca86e3bca2682a314539a72d43f61d83836b322933b805dc321a5c1b7530bbb67b81bb902670755abaff43f45f0d2e2f633fb8759192a69baf9d9371ad770cbff10e46575b4a2a88f2bad2c3b8888aa36c5a81a773e6aa23d08d2bf37c4460f16104465cdf2321fe148a7c816fe8079a0ede8f2407867bddc27095315bf6dc50db69278d07958d0f06f1b9a3639e9ac3a3f6b457b7b72b7cc91d9d72e2f9c0ec7bf94dbf39428eeabe26dfad716b07121ff345634e0ba7908700b3e377eaf88ec33d8069ec1ea44fa0805f94e6c29509ef2ed75141a72220c45620811d549d1723f729a43bd06d971c1da2f8227b47fcdce2b6a0329e654cf5e1e3835bb1b67a1e24c9f53bfcc786ac182f87215f4b2b22662f29d2872da7cd48751354c4bd9d38f5279833226fb523f40a4460d292ac8ee39ec2bab44288a6295492662e593d4f1eb8d9ff7e9c830bcd266c46369dc51443dc2dab359016b7c46a5ae5ab3629bfa2eec5802e76052c91d57c4850a8c11f8751eaf7e3e35f22578dcc73c8906a21cfaca576d72c46ea4ce206024379669987fb1a373d8683e27f0111b1e45577ca697724690615e9ee255a9ac2b9028aa95749717d7083aeb262079196ca80118af70544c49257dd29a7dd91a41954e4755c738ada4dc16c198ad5ab84383f73435719b183504bddc008c5f3045a64555fb8457389f856612e60b4e25677362b80b2752e13db375cd15fd662b919ec52b3bd01fb29ff1f191909af4e982598f2c23fca4bb60467b735c16739896a8d44a546565520d02a255215c8a9d60834652321e3f4278285a2bf1e0f38632f1ab720248c9bf90e4a995901c0d9e6df7d9f12f527e26dbfcec8ebc7f8c881722803e5a0ec4131de9f43477b9abd8d4ccdafc7acefd75541c763831e1005ecf4f9566164ee56a9250531a9d524544ece3129d9325a204c9047ffc49185ea5005aa1e549940101cd3c6c4879d63a15fd8b727a4248e517b1a13cf44ef4400eb2b1833fea117ad34514346dfb3bceeb6b43b0a740c1d8470279481e70960702bdd5ec609f9ae8c0843b18d12fc6eecfc7d6602e74778b70554aafddadb514d3de2df1b7b68ff629f956d487d3359da48178b5725067cfd5d613ae82d25c607aed0fa521cc801bfea4dc5541f851635d51005bfcd462bfefd9bcb3e61cc13bcbe68c7c65032b616e531a38dc61e63bd2a0f898cf73473095a19cf56fdc048292d5aa01052287b1c74b0e4ae8143345e2b6845d6c7fa8d35bfa0e26ab82f81149e993ee4784d170b8c4170b5c764c9ef439a85387843c5bf6709c85c2f489213f3c596b8f40945043a53ac53027565b93b4ed61cc17b898edc262fc4b68a1f72dcbd3a436a9a852db776b0eea1c28e2dcc21d22f44f6c0668e1516609f537ef39d74176ceff84c35e44d0b84dcc224da4d8371cc7e5bd3a0babba2d52e1be8ab7cc5217a25c40564ae59fe8d0dc7c7d7f4bf5754e46e3d792611369e48a200f81b14a5a63e46e5c1eb7b60547c20dedf3761d0e0e110f9230a5b18a5ef5e1e737889ae0719358537e9b2fe0d366b081bd6d9c1b9a3ead81d601429ddf688e1f07983ae80bf480384af75da292dd466bb2cbb9cd12a45dccf39357a80e52a90cdcc37703e43f42ed43438b0b2d1f5fa8c4ef696573a3c12aa410d24bcdc9e800e32eb637dacaff50f6b664fc5297788d109e6258b6e8c7c4475405bc5c116bf430e9a78d2ef718f4629f17ce43ce80fec2d4f1d41543503193f49bd9bc216ec482a83c53244db21ab6d9215a0a988878669e2ec0d011f9bbe20d47bb7f5a23029fbde5a9c3cc3b1b703c0f43cd66e678372447b6a48701c8375b83e26de3186526af8525bc12f6d6348e86068b112566aa5ac84956c0bb3a6e487d518bf8d2e48d80ed17e1b9ceb241cfa5072544bb0c5e939da5d03c17d30b746d6d81a5983b0b27d2ae21aa83f99c10a0bcfd34ff30f391aa2a689091c12be396162ea7d80177344bec430a6a297e42417c9b535b3e6d6cc9aac0958b925aa3116a83302a97da0f109fd88b01035629912da5dd351e3b582d6498f70b7e2c69ec886cb7f1252b7fde8632f4f5d7dae636437b45d93bd9fa9f24aea08b4953610017c0eef52e9011799bf115731805c139272f4187176d64c9debaa5011408fad316edb04d5335223b0416031ea1ddd55e118ea013e82fc62e3d31fd866c02caed6c66a594dab6535c26aec55e81e30893792a76315436274c6363a4df5a251c04b423c498e241aa002dd3dc3d89130c6c88901002f549714ba653baeb35f83b9cfcf59763b5239cb6c22d6745ba8f2389fce932853bc59c14db2b423126a93b4390f215196bc7847901a2a35031268a99e2573b10422c2ec322018126d71fb635a63bad79ea489801f23a6e705c4328655e1a5cd0752f5470af790e6b86d0eea77f6985e11ac0e19b1c57ac3b71058cf86097f28f0f2e97552116d2970b3b2ecf90f0d4d8fd29144ccf4176477252e04cbac54d4ed87377a975afa17b1543e2f90860562fa02fcac0c6ec3a4ecfeea013ac45bea2bd19490887de4b3434573d7a32cce478d8f512d80291ac6b32ce21ae7d33a18889e7f44b2d874b2eeebf582b2a3374cb960e2199f672e4f7c5af89584a78a234f5b0e1084298bcb9db15554dd88d028a2e60f0cf8027328aca228311e7d184d5431c16144aa88504fbd501ba3da84ed23d51a0192f35ae12c8454d00be2c3d63e56ac5c4cdadb729e04e7b204258d2e9b21dcfc1bc8a7444436a2bbfd526d628bad472821f31052e8505b0f653c39883b4b42db2117746efaa999b5bbfc8e36db50c5a1292d34246460b343885d8836c2e85352dd2245fef35e2d53e66c3b9be469011520be2fb12ca2509386c1587ed3ec8aea69f0702f726349eede6ce164d24a4b1a462c228fe1728870f7fbeb70957648f92a5c5ae1741afe9d48121ab5b7ab873f0c73f6f9fb5d924367e9739bacef9d97fb2a43ba6de1a54311dd262c7497ba97aa277bfbd07033d77ac5bf550fe96ee2f0a54115f1534b370125ecc85c785b4b40e015d44aa1b1c1784a77fbfa34da643b3081a38df2912aca0e42715b3987b646f5b7c9ea47f9e59ad746da826990458686078912dbcf258eaf629f624b8b8d3c91349c82088a20607fa0f502db2adc1136a7b666b351a831c90a4e511de1424e0c0ee19d4f8883b3769f471691cd709dae926e3d82585bf98ecb32d116c7cfcb285c52c10192b0a076691fa49a6c745d594e9a37cf77b779298db3830c1a9627fe9698d23f48cd6bd0d47602d16c3ec2e7e3ce707a7bfce38d79ac5f372f0bd16942240930fde6c9c4b55416b702916aea8c9829974b53b8f054172c0a5a019a0e71272368b116c015d3a1807d339e41103958fc569df3d77d3bad543996b3c124442a5de5bae99ed1431092808e7f2452f38f782b0ad349d0d200cc8d03c3151c9c6308880b82af8140fee2261d27168a839e15026a908c2a07bce3ccae076185ea7149ac6bdeeccea6e571e3a9416ebce3f907c5b441eea2aa8c081557deb06c3bbda9e17a500101ce4ecc240ebb14a1b9cf892b93d08f0d2037962749a5c760d094520555a54186dc529c215728a6ba632844b02b31687841de09af0d35fddd67b9877b2ee6eca764aa07f97c98c48f8047572dae223901316b57c985c6376f83b80743653fffc73855ee869251fe0e8310baa5f49f2be915ee50afe3530a3ce9f94c5c3c8ccb87630423402acacb4cf02a913b65bfa45aee7e541951457d0f9a0911273580d78d6cba646975e5f29cac2aa592a613d444bf0a5d396ec28c46a8859fe33f2037299ae3d551d66f0673e19298c3eeb9ecddbfc876764c0b039c9171e213625f0b2ab5ad0bb5af0d1ca6a1eedc913061f629a8741353ce6ad3019c7b25b43fd76b5ea81536a0be456680dc66de76821889412f53e2244b22389b949cffe81861f6fcce2c5a549ca9e0ba085ffcc43c804fbb8c36705f9f0ed9d9f2209a618a5a8a32174840373d8b490d7a52bb7567f3b1bfce57b6be4f9b7c4f28e50b0d4a25bc8c0f0565679afa343f9492a74c44564129a79df166c1dfbe078edf259f1cabac9f9abf1ba1af2c9500dba66562d1457e6da5c22337182c318bb1562550cda440f843e2bca185adb4e0222f97bda09f7aebea95125aa7207e497cfdb746bab1fac353966c6002a88f9e8ee9ad710e04b756ebabf182a38677739525ae5b75926c398ceaf6a6f693c75810ecc99270ad8fc5d7ba6056aaaf4c920346707a8078ee1376e22b0e9ca94eb09d6935811087d0b1114d4c4c67544b35cccef54afaa24b459982bdc5c7f4e6f7ea7654732d3193bf9b457833c72fd1881dd29c5f1b5d1325a61ed0662cf39308d27695c9fb847caa5cc7369e1a2f684cb768a3a6980fa6e87a26ef370c8607e74ba9851254e8ee919c42f4a469fb79437027bbfef99f8ae0be0e2cc42f9a1873402df2e0c7c9344bf83906e1c92cf3e164c274e2418c90328294dce926b23f72e4d10ad31dcb83d4f84a6af509dace1c0fa24915d65ff3d95832d575dd87317958bb2b9309b10401e9d8efcf521d5da29caeec81623fd0313801979eb79314fba8583ca50742c6f82c9d16a0b08590674f66370e13992f3b505bd866c4b392704a3c8ad46b8e3cbf3302d2ce4ad2a71463caf680df3877964588ff75ccfa2fd88d8d4f6b5031a8323bcb8632ca2ea824c1bd95a48994282d06c3f6100f306cf466fb8cf8d9e428d8b4560c8ca0d14a72afbbb9f05c19b428a384aaab755abaea552bfc9f67efb379694516d60d1882b3459476af2cbd62e54e13da83109470d04b43f3ee1d9c65680f67510ce3f5b807bab11651940b4c83f60f2e63a06505700f7c948958285b4e9644f5d7ca454e8610d6ce8cbc10a9c96c5921aa8759f943aa8d293243be8659f284b466663285a456e6cb855c1d66ca1c524dccc818d235cc921392f583172d9c483fc0d11496f013deceac9cd8931b755372812b3191d0e513bd79e7bf99cfe16bd22bdd8b4333b4304c3c1dbbd72654133d668b3e53cd986e95c424c02fe6a3da049468fe3441a7d891829f37bd7196fe58a14c968968e97d894d80650368173a4ee02d3a9bef804cef5a7aae1a8a8873666e2a7c1414b83bb10984c1afc5f407e04b5e09d07001a46dc5e38854111e092f5967cfb017e5e71d47073b424d7b32a451ac7dc83edf90bb06339243d3f16c0e621107ca01c7bc719e7958d171f3b8f7b384c387b6f30dfde6737de103b168d7b045e987839fae6dcdc5c152f88ae3ec3c3e5a59a223e54160aab9de3028f41965a3fd00a24d4aa13c9a131553ad5c829d76f8003dc699a47d4556da47f34bfb0881cc1df125b14898b4a8abdb744d35a6ae792c7fc29f6eab9158740a2bb9218132b5535890d2fece04a2c2a03bfb7bfd2b0ab64a87006bb2085061889bd08a049c78ba0e5e4534b552fdc7520dd44e9495f2004da8d019b29e012ab0b2d0286b2850546168ead2fdc4e14099ff5fbfbe03917bf08e3617333fa22aa8e565c92a2a808a8cc5dc961d4be155b14013327e89dc10bfb3240b3f1a4f2de6d2dd3fb7c4fb67659ee6fc0b7e05be51e351212f5accd8d43f19136c975ccc9dcf8e3cc7b82c2ebdfe23c5199bb65ef34e1f3185080f82ec2d26ec0b0b09fe7be63a5422f91e713e17f327307b45af73c4fc8e853f10737153f762be01b121a0f700e4fe44801c2a326303370d44f4610adac4c87ca6537a18121332a31e071c46ccbceff333473277ecabc3b4fc9e71a6cdc93d1a2d73bc36f1d6505cbd18e267f2122910a7e299dd599b4295563377f7ea9c0dcd57d708334c65fa5b36c279aa543a25565b8f70cc5baa5f983c19c3a4077efc747ee3e7c1755fa9223577b4d3430e12bbb1744db121b5210b4d32b7a68fa599223017e555d59ddfa8fcec41e5e8bf2697a7d850acd79fffbe2f620d93070b16457744d20014d57226a00bc5f23d76d2f2ebd580b4c72d7749550fc0a9bf95e5b21ebe37c32777d1e095045fb4bf5db960c2763d11feb8545b63eec00f93779575f848e4687de2e5d821c9fabc61d3a7d511ca2ade6862101bf0d8b8c212c32a67106e31759d8f19529d44e902e129c9865bc440860ee31d08de5727f30d01cbc46a6648f7ef73c13f65b41c9044611fa27a9db794e22c4bdef7c63d40065c83876019ec02e4b11b50a3f657d34608cce2b610ebe48214209b872ed1e576c5e92335e8275b803c2248b6dd79377225631fa9411c950c1daf7521440d6070e700bab38b2ea669439b3f4825e924573e18f246edb7fe2351e56df20d871fe29c154ea9fd981127e5293f933fbe9ed3272dddaae4a5e29510f0e2b893228093ccfa0aad3a73ad02ecadd07f8e41ec4c69c97975c46a606d6358aadfe3815931447d76e7c013c90f3cf7fe24ef6f97bb44c3fd59d09d396203c1959ceee173a7fc3a69ba1b06b36e7b834aa71a6a5821c449a8b7e5c4f9efe37f7f38fb1c768eff02b5d5803781f646765b4a14bd5159cf1cbf0687d307e16e9b2c7c67415638de503f8e400cd69f3a9928655555a9e61cde2c90532efef09871ff26a6218e437472f1e3bec066340f24c4b2804492884c8271639298935c6b5ce63a53d168f0e5e945f08c456e03ecce6f628c7380811121b2495d00cc146ef051625f631c45d3331699447777d4aec2e9f2228868e8ced34f5c43a6a5621d2c2b06da0e7737da276e986b8512b2a08f3621232e57461ef77c84b9a2608e4e0f43da18aaadc2b5b0b72e63eb37533ce6fbd29638082c576d193b7c625f8159084ba181228e518571ecc996920381350bc5eedd74cb407cc1f8d47b1fc7921ec80f500fbf37efcaa80c55c6ecfce5a8b1581a4cd2df597d50ec3c1bb0bd32a54c348b19751df0f3866857d66667574df254e58ad552a9ceb864f3bd06a7780ee2a96606214c6dc841afcbab81daf3f37a6c30ae26eed1301d3f82f308f7f4b1c758a52ee15e63ef7135518e338819c370656a340b490989c4cde0b7550ee5e498980c1f8ed3b5c6d02af62332b86b80e68187dd149d34ed88877e99df3216ecead0a58ef0a1663047518339fa9df8f055a172ef653843048b0a8b5e385334f859d7df51b99ecaac2fd6c8b3306058d22faaa072a1cb52d789cad2b5d547ab44488424eb0235c43549b22f20a9d9b3868add1159344005f8531232eba5e6df546c83ac960dc1822941d56e94e1eda2c1f5e15ea300a38461f6e04d648afc541ae07e38b7bf8ebdc1a702937b2462b1883e0ce0b904f29601127c98dac41799826fc4cf237b623ab04e76fa21310e2dc6e081d8aef0f25020c090533a1ff2278bdfcdab66620d99b1202e37d2c76f2a608547cbca13af47034966c00a23e26f2307f9a6669875243d78c00b63cc9f6afb0b4dd7c6693caeac3db1c29f5c77ce33eb812cc1ef1aee470febd4712aadb7fd174d38a71d94394a43d3c338f762bda7ba7716a5a79802e149a3a79d2638425d8b4c041642b9960d988f5705cd3ca850e663561622ca7a0e533f758fcb1eb9a8e47eb2b198d0f8f1e949f3839ee27be73cb896afc8562867062a48b2e6b4308557a16aa9dd478fd0e446efb23e710dac8b9d9126489c2c02dc3b6a4f980105cb9a507c3c9079b1e19a7b072de7d6d0e954e1528f160acfe72260797bf48b25c62e6b465eecaaae02979e4a27bcdefc0cd1e9897708cc7da2f3de1146701252e6f3e69d5fdc0ccc5d6ac2c36e87dd091ce30bf8cda8030d58c557e261022f84b78497400b03cd06a2b6751371e878e8f9145a2e3a494a0be4a3ef3b2584aee67c75188f78e33e663a52151f55885f3173e67fb0064381b0a5e29e83ad8e08922b91db17e85999336a2bdc7103c5b295d01a2b34bba552eaf6fa79dbdc6f671c4afddb650fb6d2db47a7d958cd2e8ba96404f0f35cf62fbf669b443fb7625f99cd3812dcdb8eb04680918901566c25f8f845c2ad6b1610cb2c4389d573a7947baedc54477f42a4ef31f78e005ca6b9fe66e1e79e5daf02a9427b1cddd2c5f91d5521872500f38f20a0893108a78259ea590491be8bac7eac81f34da90a2f1094e533bb923392166595a56efbfc2aa7061c580902347215c4ec470e289de0735747e7a0038acc41185a40011cc1171de7933e78687d5b407c6af9b05f5282bcf55a47bb7c0c384745bf3558a0bbd3389bec1ee29b15ff594acbd7faf267b4359b77bddb216b58f80f7f3e6cc5294a5489af467d719c2c8a7565bfcbe737ea6bd159144d5964d11cc734af237e89d0fa88a58fb867723edd095343c6c976de9d51b5d41064e61e50966c9cf557a6e0aebcc4435edd2616af3756a8e2e5e9a37dd6a79047d1d106c255605b33325754af4a6d06f5047a9e7542d77155262c656b676d65fb109404ca02f4189cac34546f9af23446ef5397132d34795b68b520607b5d6bfca61be88b155d754b535fc4798cffe625b24a69f81607476a28ee70154f819588450a5481744ae0bda6c30b62758147c2722af1c310824f190b0bfa19df0b4824ed2f6d45634fbb07a861ce013a7156c1add2b6861559dbe85a3f0993aa8a7796f8555146c0afced74fea79abc4abbe47ab16b22e919f170ace403e88ad3494b4efbbef00ac249060780cef1222057726aefc75010a477b2ab503ca20621b270f99d4dfa1bf4a4a06f60b6843a87738dfd57769f4d23eda634c8d74c27a67c1490d455a9d09893ea140346691bf5d1412dfb2c2808cb08cddb30c8fe58e8429133f2840372864e4de1809d34b49ffa15b3b48352d554f50305869a872b3e204863b61fe1299d1529548d7c6d885e65058bea4b72db1a5fe9220b0635764c05246e793498c813374d0512f808b2cfaa3ada49300354182f08731987472dd7532f0550d77b960901765791bca85d2b1a5550797c0333f24e8cb2349ea3f2ca372534968a0d134252f44652e46346146d914b634d0b577bc915fcd8526a7a59973a13750227f78a352b2cf9200091074e68c44ab3338be73edd8dcd48229eb8bd303959eab6afa7b3d1d2fc8edc3aafb46284ff7603483d2b52a3113c78af08c0080c183b42282c18303c49104aae2d7c65930d89549077dcdfecce3dbe933b2d837b04ede8a9a8aaa946b35b0e926dd60d8aec41d350e72d4e7fc6474a0e89d3ed83fc001f85fe724ac6bcaa039cb1ac46cdcd1628f9a964ad100fa124b409024646fb9f7de5bca94a40cdb0b0f0cef0bb60271a76a285932491cf4100d349f66c1e35b0e1b88079927a594524a29a59452daaf99831a6983218d4c6f32fd0f25822e33fdf9b9c51625e2d044d0df69e8a334c761f6d2c394528cd28c528dd28d528ed24a694729d8e0f6f2b5dbfe59766d6a841a635a32d9ac67e3c87077b7eead49c9594027ebe0cfbd7d19f6725f1d873a99c7590cd8d131fee5fed7fbdb45c9a102195b914fa373605e76df8beca616eaf0f4cf0f31dee57ff87ff14ebc9316589b51d45b806c22b2fa77882cccc321778860b748b9c217cb2f77253fc60b69b95c1e2e7fbfc7e5efcbbf2f1f0303f97f792031dee585b42493f5be3d1b980f96e551fec3b1830c23abc89416cc7289ee7f9708e655eecb242d51547f922ecff9d4cb243a0766abdf2f8be24e8adb8f9e033aabdffe0538e0392ffea8938f1147c7e6c0821bafe00aa8e820efa5d12c7fd5ad7163a0e0501a9d4426d944288f42999479d6e964df2fc3add160f6309746b3b29f2f577356f62e377bf76e6c79c36083d96b7726c1fa532cfe70f96a690f065a50f6cffa0809636a6aa2b2a865bab2912a9f098beee64025e5d920fdd852b64f8a855af65b832ecfb8236912eb9fdd3fe6d960d72ceffb3548b3b0f39d76d285b872f82326c518e3766a55dca15d977908001b944f23898d4cf38b1a63c218d309199b7294ab77d4091b52a5ec3bb5fdbcdb6b3726e49458247047e094f2e422883ce79c2f6721592182294c140af0436a34f338d45c5c96a509cb054b932bf7a7bc3c07a6c8594c8d0363d429568838305244b08b525eb73e11593052449cba4404dba871ea50834fc49d3a834a24eec47c7f1d529d883bf7fbab0ce20efefeda44dcf9ef18df5f89608a3c07e6c85931883b30df5f6110775ebebf3211775cbebf2e117758bebfbea02a11775abebf0ec59d150c4c51ee8f331faae20c4037ad990f5572585d5d8019fcf303c4b7661e889b16f834bebfce78e1632e11d04d8be6652e11904e8be6655c4c04f42d9a8fa1019be7e3ab812f4f4c444304f4b57e58ef7d0f5f6659fdf46c10d13ccc9196511f6aeede9e9d9cc6c57c3a867e5065e6462980ef69ee0f105aebe7050cc4b76430edc20c4cc388c1940bb1a65f06a618532d5c4cb7f0987e116bfa63600aa4d3626120be4584071e7ab01906532cc49a896916624d7f0f5a7ec1f40ab1a6df05d326ab4b5b2ef522d6f4b35c6a055a05095e9a85c8ea9fb9348cc8ea94261a46a44d30474dd40a932993e7d4a1c8ead7b4b00e51a63aa4327453c06830cb81e589539a624daba80c35a8c2c4ab71b6bf79629522fb21cc51ee0ea392624d3f25823df9b00eb10cc51aa6c6719aa2a22821982996b245d742550e2993dd0295b994262db4e1875f13ba1482394c69425d91d29461ba8468e6799a2acde0d3f73f4b669b7294799a9531204959ba8743cbf309269be589eb50ac71810d599a98c0f8c9f34f43e4f99e11797e97449e5f9d893c9ffbd838f3b7a6a6dcefb29bdcbba1cdda7737fcb80d872e4d789099d21841331a250ae9235f9352ead4062ad6340d29a5f44c084b6fdce8e41bffbecf487e93e52b4f3b551768d04a61438b84b2aacf85a2e24ecced43ab5871e5feb9e53c6f0d239517119aedc186b2028a895316272038152e727f9c2e4c44ca657b90fb230a75ca22f7c71310b93fba7783dc1f67e737cbf3d2b037b061caa5121477e4d2d61d81d52ab82d7043b62d5488c8fdf295727547e47e59abc8fd92db42ee97dcb645ee97589e37c606364cb9528ee28e7c13601a0fb28c2953426b0fd23613e4fe4eb9341ee4fece98727f375684dcdf735e971ad830e55231c51df93e64b4c86c8217b9dffbe843cc87dcef29172d92fb7d3621f7fb5441eef749e75515b141f06ec2544a306173b6db286c987225c51d898410e47e141f215c28579cbce4d0c9ab9f52c7746639cce0b2e804f397cfd4c92bf7fb0d952c71ca8544cab56ddbc9b1bf965dfe8a4ba50b1689c2d4736e5c4f23364cf9045d4f3b75a8e9c9af98b7cddcd1a3122e72acd2092722c7f7a0b8c3492de4f87d1477b6a6c20ba6b8a309e58e993f21c7df1177b08f36c81f142b4c582942e548ca155262a0d2c2f3293f287263dd36b755473d1c2ab9ae30e1065e2922f791dcaf712957e89418682a2d727fa669d67e1f0e3be9082949e9b594f249f9a47c523e291f9f9437bfa63c8972b4bd11eb46ac7c398122b765822d0275e47485530ca292fae1091413a6c3a19239a66a9990fba77cdf6c11b9bf27ea486e7abac229063dd445ed6aa3a346924cb2c9a7818264d26b09250825082508250825082528f7a75ea957ea957aa55ea957ee4fb952ae942be54ab952ae2b3997ac8507d4e1a046a122219de038e969b16d1e50eef73419343b1ce4fe2eabe14d96150999995443f285b4215bf4b95443aaa1dc8fc2247f898989a98949fa3031e57e9423cfb9d18e2cd297f44a2847dfe7466cf66ec46a2b0e49ee8d0bdb0cb4256c1c124d6e5cc8fd35db3edc6690fbe3b6041acaa0239696162d289b02ab02159ac459f6218bcf14b99fd3f0266f7813c6970c6a7123764e968c2d913b4936b125b224f195e51bb1f23ffac313b089e90f5ae777251381c58762169f58c3e2935bbe4a66497a218a2a3f76df8f83f7120791ef7de320447ae47b1fa4bffbe8759de7ade2af5e48cb235ef1f0befbf81d064224e29eee571808cb770fa4e5bd17d2eabcd5f3b4d7ad82b0bcfcbe4188f4b0bcfc202ddfdfde8a47cbf7e7c0f2f2eb7befa7275a7da83ae1557cd4c796775711af7c74ef3d0e2b94f727ef571f5baec50f5577154fb1156fd7604bf31c7ae42b1eff1afc6ffc753abcd25612e679bac6954be6fed3ffc67364ebc52786e68e611a31d3dda73ff6986331aef72fb7fbedca0c73892c00a6bd2c6a3688715dfee5ae5e7adcc3ecc0e195166f8af0903d8eb843f638629e330a3b330fd3b3c1c34ac33b5c568f7d7677fcfca8fcf73f29bff2d5e5c2fceabe7ccbed67b9f2e712b606ff1b7f1dcf9151c93db4dec37c8ff730180891ec81f47b9fe19eee5f3010f9ddf3b4cbf57e75bbff6e6cad76b47cd4afdc13caadafbaa99f3f278fc2ba1d3f3f3f7cea7f7e4e5e88cfd5397952aaba5bed2646ad55ae306748a5edb7fef5c4e17495b75bd537fd084a8dd870e6d52b47baeaa690665984ea5ad05a0bffc96e54770e19a8c61865d7d5b91937da988c32747747a1b2d349f3bcadebb85a2bc775dbe69db22cee48548861317477cf302d8c31c62d8c314697d2638c31c6184fdd12272d6577b7d64ad27dced57c2159f5285ecd527f72fad8382a9f62577028857283295875824339149d65f10963fbd90d870fe6302ab90472972a3d897caf599f2ea58c4d91468c6d899227b0c1e8c90eab92d3beedd3b82fab5847bd93e6a8b632751280c63d7dfa9c9d6c29434bdac858d3d9a42fb8cf9392196a3418431d55d3231368304a2c4e71b3ce9335279d554c2c76a455a8e60467a7611d187343a3c1f8592767d06919bd763732821dd3607c79c2989421e89dc9d80dc8b1c139e75cd1bcfee8c5f84327c78f299caaa2745fca8b014faf6a309e9c2c4a490bdfa96bd04bb9d49075bcd0f91aec1c093e5d562ab74d1739b54d8bd98779165a6481749b0ec66bb9bb18e33e05fb232a398e605409e1fb322a4f1c3e20fbcf39278cd638a1c7d8c9ad7e32f3b013454d1b65949452558a94f846c71dcf77567cec6adaf7c5fa9fb3e2a778aa130a2a654f4e6c0a254f2a2fa553f9ea0af76d2c5a8b4b0db83117fa32613c467cd9ffddfe708a0a257562512a9cd7929e4e9e8df8337e2713e51d2336e73c7537d6f894f3519e8d3b7be67cabdf3eb5537aa3d02a26159acc1d25eae43d3b0722b55b6b54b71c420d65ee70369827166218eb245f5e1e66fea19369e3550eac479656a8a1b4b2d6d8e0a9ffbf9e734e9fd363cb9843ee0c0229c4db97d42414c93da8d42a2d156a902691e38d94372edf6d603d2dd6b81fe57827a6cdce690ec5d894c2ce0f67d6ec67334c7bf640330d238c303440f3bcf12650a8d939fe92f6f79424a0b95d68b4e9776cca993d86ad323c5f66e9398e76ce3ab3e77969e24c9411c17ecfb189ac7e69d3e1e7e058d33accc7ab1c9fb3ff9cbdf695ce9691529ac99ce87c0ce38879fee590b4a438f9a18c8c3532a7254b3e96a0fcf8b5a4baddad531a6be6102f65f430dc4dde048fee2f5d466745c7ee042b7f4a297d5621063df21b03912e9f130321d2335f663ff11110223df28110e9f19718880c7256f68eb30feaa199c9974739fb7a632bc6645807995485ccc6aad07ddf7fff9fcbf7b9bcf7f756e381557da0abe46721c80553645d54f9d50f511f721f761f7a1fd20feb635f4f34cf8ab29da395f9c49d4ecf9df0f4bcef3c555769ad4f2bc73dc6653cee600edddb3d1b137be737c4b2cf394b106bd6659e0dfa9252f974861a999c21866d5ced3a8c04d1974eeca4982aa553f154add2cd1b769eb75f284c8c1b678cb171cb9031dd9dd1b5cc0c68592ddd0b2b9716ec04567e0d4d8799a0a6c384008087ee18a5d4a6c38470a73730741fce8f6e3bd700cc062386a1c34a10800e0bc2ba0ba08b8d336bd488a18b5e8c3a31b01ca4d441071d74967b8c0c1c69b8471a9146a4116b62c4f73567451964f019bae8c54867c04860e51300081b0213e28ba1a3012727a7e3d119c000ba1dcf46dc9121ca19ba16010a004e6b800e0b021b621ea0c384b05810373a4929ad21c698e3e70cddb50623bde17cc732f5196dd41bddbc21cd73d66024b0acc6d1d9e0d988357439ba3bb120b0203a5377fa126545f18d16900e4adfa42eca9fdc14ca05025b275f6de84e2ed0d73a01fad6c9d71bbae839405aeb44070d7826eac0c9f33400bc9ee9e35373f2344eb075d654800276ece08101551e9e8dd8e12a875c619966cffe323a0f1b00d4d0a041750c4635a25cd9bf7a4f2da616731a01353439309a6bc246d06404cbc34431d12c7fead9901835841af21c6a441240d8906be29a38303a8763027323b03ccca1ec40581ea6f74140ab99b5cffe5de778ef0d76534d4a4ce4bdf4261a945d660d8712908f4989b58cfd40ef575491cc921b82224bc984a35c90fdb72803aa05d1c65f6ea822d4d08f9d1fa286328a090ad438400d4a1a94b5c73c075e23f56edc2cf176146bfc39212f01b18b3c9f0665194a0ff301a44f5dd86b2f69509e1e460d65d7b2d6597fd490e7682d7f54918bc08634880e790e8b6b0831c84108861ca9a21501a125b6c8a20a284c3083963f0df2a742fed5a594524a29a594524a4ecacab9a6809933d7b406bdfa704d4fb0f243ae09e54a5181f3ff5ca40320c7c76c603b5a93e3771aea4f9c9f6e8c4bcfefbe6a96e33aee672673bd5f8352fb8cbef603cc36301cedec7e80993ef56c6041e2842866e3d0e83a477ba1a3348b1a2b2a6a1fb76b33dc4d8a65dac639266bd6b8bc5d4bdd31f7cc5d73dfdc39f7eadeb97714fb6f9d133baa859d948bd450c6b26d76613b7bf73426d2fb0406f5696a902937c9d83765ec63931705dbdfa1b64dea49197b1bdbd3bbc2612508fd958fad795738a80499aff2b15569146cd090ceb12f67618fa57c9a85fd772463218d0d29eed060ca98877d58ad59ad5aad5bad5cadb5d6ae56cf3b3d4fa3869c7cb58f7db53746d05af9f6439ac4f73c6d69d07782512e8c2a6a10db81b527f5ed0bb32fdcf68788c534a8412ad431601f7e27971a8104576257f5c3066349c6fe84a950e3c855c5e197b13f3d0d6a9cd3634f8da042ee7998872caf6c964df9874e6a888c7dca07d381ed0f533fb9a941cce3c1c1c8d83b53c69ea77d69087bcc8865596dfffd0f425af459ee6a7b96ff41486bbe7dadec92e7acb696ef99dff21beea1bfc240bea70f8405b3afed43cb646e8d895a9ea7a75dd220665f9e833a6a411dc516451d3588d1215a4483a810cb8dadc92294b1ff709014361e15e52abb8ce585ac7a5a5ab06c7216f6df0b69b1dc1e7216f6dd169216a9bb629eb6b1bdb435bb9dd420f6daed244a4a0d62288f62637bedaa9ae87f5836f978ceaae77b9667c140e67fb87d9c85bd9016f68da471622369f036521f6910437d0d6dec9c540df21c5491d793dfee09675ba86be78d2d5451f798d6a18a369cf201338e2d946a9576db361b1b8e2d5e38b678bd706cf162d2382f87b0fd31085b2cc9d1c3c124e5828cfdb66d8f7936b697e66d39b098ab97b660d2200ef6fa986bdf10875b282d69afcea141cdc23e661c5b28691c99e3d69d7e76614f16d0bc1b27b30b1bda575ef5502167614f5f486bde55cffcef3f0c840ebd101ae42c25d8d0be82e6f46ce0d8a23d2fe5716cc124e5e2d86249835b286db17dccd3c3b185922d941aa77bc338b6506a3066fb4ab9007594b1f7b7afb8d38fa18e6e729f6cd95b30cb1b6e0f8257def08f53f63c1eb650d845197bb7af8c7dea867248c6be4bbde24e912b63df49de42473a476bb5d18ec6f17ea891040165cc2763399445181819eba33692b13026f16985ad94b19747316c1f2c39f9238bc9264c7a89128994b12419fb88c36d8a302ac9b48dcbbaca71f32d0ebfec2738b4df9f70a8ddd50d1ab97b6bbf665d4bdea100a7d3bdd1792f73e7f950f9fe765867d9e4186b54d97e7b37502dde028b03f59cf7f565fba4d80db57c3a5d5bbbab5f83e7acbccac7a46c3f7a3d2bbf83c759f6a387034501f54f5fed0da94fee97d427d6f4f497bfdc73959dbd611f75ae7f3a5d99ede5b287e590d6a0f7d1cbd1b97e957dc3e92d23cbc946c5ab1c349f3ccd275807d473a8cfbea2b06fa6b8a383f79db1efa5c6be62614ccaa7f7274e7ff2d2b34166efa4b67ba1d619fb03344e3fd6360707348ef7fd45d78758ead9a81b0d6a107b0c07b67effe679b875d8e8032346997bd44f2f01dca3bedea8b97e7b3766e46a3fb3cfd35a6ea6b8531ffb5e6a1cefb16f2695c6136e4f663bc8307256df7b263ba3bb8dac9703eb7d9558ecf66edcd34f2c6c336910fb93634d8598620df65aac9127dc4b0d624219fb99850db9a1a58c7d6f4832f6a9310d8a35d86337b0d65919f6f5ce06b36f0f87f472a0afb2f23cdd3794439e8de8757fc7b4c7ee147e20c77ab9ef9b7ddd3c1bf5b95b3ff6a6f9098ddce19a6dbf72636ac8b60e0c6a7f9de0cd8dcb6f6c623c749c255fc759f1eb74aacaa14ece84ec8d9a71d4acdd90b146bedcf1f3c30fce8a12c78d35da86e38636f1d43c1c607892230e0f47e7692d8fed177065aea8709b5fbbeebaaeeb64d44e9a8743c35c945cfba458a67127fa188e3d64c754625bd43a81ace7d0d6e0b84debc97ec340b69eaebb2088544c1183249720641446afd6aa895677513f2471b5aa4b1224b1820b042d05d00a965add67170437455a1deeae2b19416a55ec0853ab665d77a3118010d4aa9aeb8b1af8b4ead67577d5f31dd62210a070a2a815ceee7eef12444b6a018ba0a4af76dd056f68e084161cb5429ba58eb3fcb3cbf302bb22424bbaaa8044502b8a156491d4aaa7aebb71085330b52aaac9154aad6a870cb5ea49121440ad9a7219b52a4a97dd5517adeec6a31370f16a55951349ad9ad26577f544abbb72094dbc78b5aa4ad75d188aa082ab5557b83082d48a1d43d8751704b1085eb85a95850945addad27537561185a0565d75dd8d47d84252abbad020091647adfad275573ae187a25685e9b2bb2242abbb120a11b0c0a7556358e1d5aadf753712c188a556bd5d772312205cad8a8d865a5546d75d21adec0a69d598aebb510853686ad51849b14cdbb8da7927943d49a1c89695cb0b8c9432c65f2c6346cccd697eadd1c3b07ab7a777f37aea6f18480ebf793ddd6b18c80e67f977bf790b88ad1a9ce54f95601b29b630eca99703d39cd5f2e4147a204f3c5b73420e61511c310439748321fbada03ccba7b470a7ea79af827aee4fb786cc867af24edec93b7927eff4e14df656f6391cae70c830f2897b0d87a7b086ac7d5843e63ee61ab2f6a1d56ecd71f29ae5fe844386516fa8a369d67edf3f088637b9ae2cbe21c3c8287c7aed4faf7df5fee48616e55128cf7915e5a150c2d3a3f089903d6105a0bc8775407914d641e5bd1f3a27fc4327a3e0d8e0ca57958fdf92a28267832bf8e77b3864c1b3c1142f0135a5fa942a5555a9548a4b55552a55b954fd52f8fbbe6a6b7df9b5a2debba14ef6bedeb0865c59563efaa77c7494938fee527fc5f2e5fa2b9feba780b93eca473ff1be05dbfc65ef5570f8a5e0f0b3f72a1c3e0a0ec1ec7d0a87e0090e6fb2f7168737debfdce82cef870e8e5a2feabd3e0a873ab9d61b320c9b03db7da8f34347a7861f3a590372d5d60435c6f4c4a190be9df684d5227df9180ea5d6bd9db2c780903c5f871f3f7ebea4524c108a38926310508004861c838002a1fc4576898443882bd3f9f18bec3bc31209cc1f4a24093a4f7728c428872d84ba68716795238c8ce150fb59af4c8a35fe340bed651839d4b08d35aebd8675a08f7dcc616603d501c31a26e23e66cfe1705323fdcab3c1ee6d5500f6d955d90671102e7ff26eccdcc27239243749e9851713eaf531c9fe2b2e4bb8e842e512cd909921a394c368450a50f6675d1d493a949ce52fe3ea7039cb1fbc3a56983c4787152b4c3d666e0f98dba388cbede1ea31c4ed11d4c388db43c88723d9a7717a4c114120cfe9d10408283bf80d657f99db73e42cff19b7c7c859fe31b707c959fe2fb72709c9737a92245192bd0529fb7bde8d2f7fb807900c6ca4a2a88710e21539c85444197818f540d238dffbf748ea91a4717a20c59dd5fbf3f0e1f1d3393c969e872beeb87cca87ade43fec25cda49b58e14a6264852bfbf358f21c1f4934cb5f490a0eb525a1651203875f935804a01c462d90c01cc62b96b27f8b514a7ec13e849ab0e18c17ea0c2f47e7d5cffbad5ab8a4ec1fce50ca4e7d72885aa2a208d5b224fbb3bcb2ff875292fd7918a18e90fd3d09d9e31546d9bfd250b95c12970400ddbc1c1218ba95cb51116bfc63b82522199f7289f0ab64602e09e85b18732f0274b2a96955800ee5caa5251a3aecca4caf8cd59bb80752910d5b9490b27f8b92e770489264ffb0852786cac1c4b06931ac5a58be950c4349c54027f5138b6a195d4ef279fa4466d48d9ecc5cccf7c61652f6e790649e926b5032e184c0f4048e50d938f4e3d327b476d168f13c9a814f4a71bf88c858d320c8fe7276d31577ee3c8542728c3534c885c548b14cc3289d199661dafc38e9f47aa47b3df1a86e5cedbc8ed55daec6f79e345872f998c632c7322c7b1ecfaea6dd2ccb1c9b596b92ab9d534abd936ca78d853e43ac765a6c6dd80e9f7713eb40314cd3b4cf30cd59a70ea572d750ee11155111156da7c59f716e5ae6e96027b0b2e613444fc5184f40153bc9c83a5113d41a1ba7f3bea1ec97ab76f7ee183bba741174776318a518866118866158f4667b0caaec2ca359dfb4a49492027d4bcaf7ada994f2865bd6613e7577779f5adfb4a2f6f16613086cc538813ec6f729e3c7f874051533016602db8f8a3f87c4d49112923ea673626bc7f631f7b44f8b7beb39d9f76b5907faf3e50369adedb5fb03844e6bc3d903692d0e6b98f6db05d26969cf690fa4d3da66d64d0de799e2360fab19563d7fadcbb0d76eb6c3e72920cb184065faf1ee9065c73a509c61df81ec6d8e137b996133082b5fcec6b0c0c471f45ae7382e7b553fa7c43d87c31fdcd77abbc92979273918b2f63c9d51ed05a11784e28ec6fdf6dcbb77e3267352e6ec0521fab2ce2b73ad9c05a252d6212a651832b77d987244bec91c8ea154840d39a5dccfc91983bb8e351c5f60c2b868f16139c29430254db823ec852dc1aa800297c7aae09267f6a1a7c44b9e182589088b2d29490c8a9c5d4c0953c294588e424f0917ec0994244f89972c314a121128492d3e13870265f9ae64fde50f2a699037a14132084ff8a1415c520e63e69c590d9dee9e8102451ced67cf9f2e1cfea04135b09f1a3ad887710a8a349f46e3d00092e77b0e6c489168ec934b20c35b53d084a2864e4f1a94b1056850eeef6e2e298b393f3ec8305a44e803a1b54e7e80d05afdb51a6cb5ccf90142a7e53d90d63a7d4873fc180b00a4b5bc0fbd7cf2214a8e337a4e7b243ac9971c7866530d9ed3af253fa2a133430d9e1a245093f4c9732ac5575caa2b18eb3973ce79038207a8a1c17964c4678fec898a27e8b34731eec9c35cfbe2df2f37b64e3e05d39267119b45eb0f73fb85fba739d6cc977747ab8faae039d276d0be621c31672b0eef70efc780904c9fa727d28e9f9f96fffe87e557bef2c49d539e27dfd7fe767744613dbf7c0edebfe095f62f1f5b399c7ea5e1158f937f791c4efaed07f13f79c1417a012bd86ac7c989cde80ed4ab7c5eb9b155dde5a27e7555bee5a63ccb5551944f9dbcfd6aef494a49b5a4e2b383c759730eb132c72c1f45c8d6a82e6a8c991fe76bfed9e3d0418804c9de2313fd0b70c073b6a7f589b8efa141ca41a0ebbe3e0edb733808f7db571c844890fa458d7edd6e772fe03910e820d020a5f68b5ac51c8eced29c45e377f6fe3f68df3bfc85b4f00ac31826a4351b28c73982d50eef2c9b0fc47bb46f0ca45ffb5f617785e11ddb671f5b1a072ec0e4d3ad8d60b210e98f59aab2942859ae5ade554f26b91b8ba0dc2f8d72cbbea92c57d80a7b55a6f262df97c678595225edb507ffe88fb8f7ee89ead323cfe97095f889540ca4fbed81d4e75e48cbf3741eec2ee82cf7dec7c6ecb997b8677b9e3e42b271f5799a3bb21d790e75551c9bb5f9dfe83c88b3ff00be00f80b1f6bfc5f7bf093ba19c4a87dcf161f88f61bd67a38ae870cfbc27e9ae78037bd05abfdf6a1d63f29cf3d8016ac3cc230d8e0a6c5240742752a65c8b6e8fe3870bfe120db73efdb731fc4eb53eda9f744dd7bb8bb408354bbb56a9af641bcaf1f5b349443481fcfb9406c691768903e68bf1f0feff89c456d08ace32044b20fe2dfbf49fffe1ec72becb7f76fbc9a19eea97885e1158f0d6b3ddbf76f383a875713efe086d8f8f673167d1be49d41f1b94b95caa5311c52d514ac7fa8fa2ef65bb6611f65c6f0c43362de75fec50c27404796982109f6ea1aec3a55e36499866df67356bfbb7ba777ff2fee9c7c76559d6db03fcfe171cdf2784ef4694ff017592c0e2990af2a825f054ed7aa7e78b7b317e8aee6d339c06d3f8164ec2596d359553631c77cceb7c00c79b6fc97959814be9ba83343cc2ae09e23996896fcef9392892cb32799286a507e76e510c984166c189b300e344e0802699c30876ee9e39a16e5c444dbff68507e053c2707f93cf26b907fa333c378ed68969c3a4726be010cf96144e278064c045250be84a6fc1ade3566086b64394383f2751a9435b2cf203dc62c7981129880d081120984b8941459e108114924e1095dc43e2ad33ebeaa7136ae7ef44efe312682fea80b46d0ff745d22e8efdd2f82fedd5545d0bfbaff76b53823e88ec564ec5d3e95ed289d351a3cb1f23ff951be66db8b80d2b6ad89f56c6850906d05dba06a73d518b3c25e48cb3fbeb6e3e707f9dcff207110222b1efdf27b3ee29efa2729b0b1b57df6f4e4fd69fb1ef9db966120d9fb9f4e270b0167d1f7bebbf539adbf677efbcfc7704ff7dd4bff1ef9ce84e10b388b6adacbefd1300d63f80637062231101ece3e3de2065458410c827c7c5ea9566cc556aa155b325661064d72c0440b6630c5135ab1259fc7b9a97d6bef4f370c441e398b3e919e7e8981348ece9a4e5fc3f4d59d55415b622d03d652dafc8ec466635a385fbabbffe8661026963d7dec3da49fdd3929d6e6cf39a5bbcf99f9310dfa94f970fe370812f17282e0053fa641071f0c67f0a735e833ae6dd05d273cc5e8fce92465e877eb33647f50271f45e18be9db123fba98850cb270e247970565aab3fe8853cab0c59dadcb1836058b616fd3ef80d60077b168d38de50cef00828dc69aa6997ee355f631af6ec89ce1196b1a3ba041d9de8d0954a0b3216621832c64e0df6f812e43803251630ca6c2e18f193c6a4336c3d0b4c7215fc3336840489eefb76b50d5607f61bb8da82e99b018b358a7f6340c1b4a9faed1deeed9cf4b431ab9bf6f1627d680dcc6230dab1db1a63fc789f4c00120aefdd0d122c6ae488e318295cfe3fdfed2fb880f86604566c9a19dd9aa4015860872edee0a19a50b4cc82bf9361927f75d492c3f02810b5cc811085d18922b6dc2e2a7a808491950c93dd82c6f6a48ae5a376f3794ebd6cd9be2820972e5ba0602185ac8f4e75dd15765ec6bede6e59872ede6c5bec6d309d7f072df080430bac8b552a566f9d32ed8f04649e25053dde4d038fef184b2272914ef0655977908a835f8d7d7b0c4dbfbd397e770de9f3045da628bc3617bef71e0fec4bdc77d908ee3b88e0b368676c583fbed7bea7759c9bf765b6f4a1a7425cfa14848d9bd4342baabe6eeaa3f7bee7964cf7d4ff61cf6efd17ec3190c2701c8d17b90fdc31bee64ff90e5e6de609d9bd9d604fef1862aca0e41103bfb18271636beccf331ac49196282b297039594a37f9c1e0ecc862d471c6e20c7e8b34fd84f8f7a3864ec1386b168c33a16b21d3ffe1d10223d15858ace423d877b4edf6120f1f4f5bd27d2a37a7f29bfbf477e774fca771848f729f8ad6a5e94772b064264c5633eea7b26f740eacfe730049c95bd7df912570c84e7513da8f7ec51386ef51ddf382b7b20da893d79949b56ea63cb865a46b94088ec486120b2857afb2737c805fea40814963ececab23f4981c59e7e10204416105bf47110fab1154a9fcedbf183fd0fb2458f2e91de97a28225213181c2122e94ae4042855d9d4e4e3c1b44f74f3abf37bf5ca2184f2fd17d974bb48af1ffa7ebf29f4aca4b8cfb374a0c315134c46509a1a5248e804250ee7fc1e14c8aca89bb364a48474bb8507284242a8e4c11c17e1a97ab82f9de54aa0392c228870f721ce520420e24254db3f6939f03488a88a30309a3c6d121e48388a36389081e358e8ea106891073743c11599ea3238752e3e848ca918488a3030bfb3d1026812c617202963ce7260857132b38fcec107420a14348c7123a86743ca1030b1dd89589561cc97d440752ca7d51b92e2bdf1ff17df9bb2a2360b92923b0e16c59b9dcd4cbdc1f9907426b810fc44d2be66164906484209334e3c38ccf8c103340332b98099a199a59c2ce14d9789142a34453832880fe984b738308031431867e952457f9141eb42503438a8a8c8c8c95499271194f069399999999999999999939ddcc90515d5e5e4ef27ddd2eee1246020be125f0107e021761232c056ae223ebb78bfbba4b33770985437b97301258082f8187f013b8084b818db0bfc0a8569ea761ba776972d9c28bcf4b142fae17295e8c5e82f072f492f4824504fb35ed4549d3346bbfef3f27d48466a0ec7b1f5d5c5e8a5e7cb2179f179fd58bcf4b142fae17295e8c5e82f072f482c54bd28b52ee47c9ed65b40228829a00ca374afccd117e1384f5626693948fe1edf001853f8687636695189d5f5486b94452de5e1e545a5ef5b329470eb74032f4060746461a6c2950ffbd94c0f8a289174b5c2839c2b7a8562997a64883271509031b5a2c061891fdceef69c617d45f119fd027840fe9c3e24bfa96f0297d4b9fa67d42421f934f0868b8d196a28022da14316ad0c891b3901a44d26092520c95151d4a3a9474ce8c87f16c60457c419fd0c7834fe8737d42dfd027840fe9c3e24bfa96f0297d52f896fe63ca3f58d9981878995ea2196f2f918c930c14174a17282f1429a02ca164018549e5a3f22182fd9a5501dd00194191fb4330879aa6d130e120da2cbd9ca5e42c9a24344934483447688e688c5c1aa35823456e1a28224d9108f6af68ee308d0b0616c535337178d344ee47e1f02d0e6f94c8edba39c29582c31b225c285da0bc50a480b28492051426958fca0750059467189de477fd76374d449bd34b192694b0f1428888109cb8f0ef95b91deefc56a020a88fcf3dc9d0b834252cf6027bfa98af91a7633abf14c39c904e423825a17c40f9a0844001a156800a420da1965049f93c4715c15c9a228dfab97a3b82893a09e184744af25392774a3a25a59c92544e4948281f98a07c1ac7060a282196a0801ac7860bd40a9450419e6373056a0924a8a1c6b1a1c2a28a72ff4a72f24fd8cff06c10c9fcb497e87e776f5cb1c627d634ccdc42917c03450c4111d111440461d3c4a464f345132f96f2a4a1f941b4313a3a8214840ddbbc62cd9095b9a1cd72c68c2ec6f6dabad896382438216e096e887b22b2b822e78c9aa33e28eee8e46fb7d7d6c5b6c421c109714b704f70469c1438d4301cda6f5b42e1702687db12107774d344b4298a35435c0d166927f250ac618a354c28e14538a382c30f628597929098406109174a5720a1228296e606b1a606d1c65584bb30d9afe7182f73695c97c648834748ce6a981bbd1b365905d31831614f46f604933919d7e27b9291e9fcf6cc4ce757c618776eaa0b96e9259279efe2fb394be2c791a648b3304ce35ac28613ec663c1c5b5e61edc2e496abba2cdd5d618936f24f397cc8e1d338271194df5f69747e6b72ade9fcd2909141cd179aec5d196bfcbe908f0471e455c3166a680283885628bd727f0d4d356c8175d3f965651a88a061e9003e1cc0678606226858cafd07f039800f200c3b47ec30d120040d402ea2dc0fe690c6e517cc323b47ec30e57e1a8068106226001dbd4432de5ea2193f2fd1eaf2b09a1183123134bd6e8062cd4e117127a86f8288ac7ed74cbe694209a123ec0d1140373e4d4b51fce49b10480146b6f92232651b28441b2ee2923ce3d218d10c21daf4cbb8342efc7269906890c49afe994b93e42c1a22e4fe19daea431a2d94108aa129f7ef04354e02967aa7888893002944b09f68e6572ed10cc6099042c4a18922828d43e3b2ee7d2e2f35636951ad70dad65d9a656e74d6cc9bc6ada85a584e597d7171f160e4f5bc69dc8aaa85e5743b6f1ab7a272fbb964f5e59b3173b12702d25af8595aeeca4724831fc316cb365cbc8472f8d1b89cd5ff97c688e6c859fd32de0d989c826d5ed890a5a9d1612fb03739fe0c0f074cde94b0a74ff990c6c5692ff3ad5ede705695ab43a9719210713a6c638de46950fecae5c21895558d183abf38e3747effe925c2d86f8c4c6566441bedc2e4180fc7964f78c2e43a80bad3f96dc9d45e22999f5873160cb6cef2cb92e9ac335402747e55b916a0f38b92ed2592f1f412fdc43c105a6bc6cf190f339b1a474752cf2d441c1d58441fcfc9f172560e214457e3e4406a508a88a3c389081a358e8ea220c49c045021262007508358449c1c4244b05fd3acfd3eea437df2cabd118a35fddfbd2972e3ba2972567fcbbd61e266e82689066f4e9707ecbbaf322ecd0d22ab1f5f1a1e4456ff8c1f20bef59d585a542a4fc3039a1dc49dd4f7d3e880c648dca1df4f23054d0e687040634473031a1bc49deffb696a405384268ab8a3fa7e1a1ad040117754be9fc6157756fe08fe900608b99fe6a80b107369cbe5c65833736384616513cec872fa496ad2942c1f25b59265ccf5d68a4a8aaa85e53bc5dc6eada8a4a862ae6ca15c22a09b96cca764fee4d28989fcf4f66ac0e6d3a3ae06be7cc24432f8277cc932c61842962cbde7e91937b6622ed6927183dd1e6c4622f7ebc0c2889cd438374444f0e539365c44563f14a858f2c2da7c91fba97879087c72038d20f7d76ba3746d926cb46b9343084a7220358ecd1122a8c389243a8a1ac7e68a08520129014b9e6333456409616324f7f7e7006a1c1b1c447002e5fe980cdbbc862c8d2b77a5a1f3bbf1747eb59a3bbf99d6ada81040005e003a182ab7d5d0d0328c86bec09ade6a19bf959b13978bc0e4d2b20a243057647294e3ceca8df9978fdf4a8df37d8cf171f5f13fb67c7c8fef3f8d03f3f15dc873647c043fbe1bf991e7e08fef4839be17c51c1a829ce56f2385087a7c2722e2d82c35c824e63840495bca1edf813c67e6593e6e3131a746530c696497cc83ecaeeef5eb9cd3b3d17da51d7d714ab1c66d785f312c2909ea156b3c1b27eed5a0ffea35cfc69cdc51139e5e21f16cd8afdb76f295ebe8156c8862cafe5c4d7ded3a94e790f060036b62e3c4a4c4060f386646a1beda2eda883ac593f6bacac913961387146bfc63ae37562959787ab562b932571a82dc460a364b0e50f29c1e238d86a0ac2951aad1e4393c966a34fdbcf0327fefcf8cbf5f69135b79f00a23f7d02f73f46cf872630ee9854b44e5652e10df22a2fa199748cadf0bc4b76e0ad0cae743043f9f063f2067f90fb52079adb5ebec8d7e240357db55996b455de9ddd8496b595a5abe8f9e8d96e76919e3ce4ba6f2841f4f788251912be553625d220b882d193e9690c0e42329d6201d114a628889222424f171858f214830a205530f2567bd9630c99ef26ea86417ece368880da31225ebd331f8e3eb52a294659e8dd5671e8ea9ad525432d022c9a76388b4f196e962c4f23160565e8c5470d84a5438ec254cbe6f30ae785db1d403c80148b1e627872830e64531c51aff5553f66f6992fd750cf1c20ad9ffc361b462069f430e496606b73a329463a8d210f4b1b40cd11094b550b94433c01eaf1e4bce72a4cf8721d98df82299195747111dae1ea31e233d478dd3f23c96623cccca8bcb54b22416c127057bdc0368078806a058d34a94f492252f386c26dd64629477e3cbab1a4d1f0bd00e10ead5944a7936e6a374598ea206730c49a1a24865f537b89c553494841053131bc0b8c1e7b2586e68e2869f66f9bb7cf821e5287296cb59398c7218a1e2089e452dd386261bc0e81c1f4a1a87cda449131cfacf103ec427031bda2ccd2441363356f8793a25c50a2b9eae307829e908a987518f2397e68a353d8a7a30d1630887261cc0f0f92902c5104908696144524ccf51cf9124485a700fa0149795ef5bde9fc712be3d46643c1b2b2fe3e198b9e53d07d65bf5406a1c96971830998a2ae5331cc62b98545429b108413262601f422fbcb2ffb579c51ab7dfa77836583ec5c331f3eaab4a6785eb59acff7c88383ca488200f231daebe61e806a11b8cb821c886251b98d8c064439306fd79488184896cd438372811417f244364ff959f1c45395c0de628428591ecde8d94dc826d6872005284814b5a752f1e8e94fc4526006939e4909810a393b6e5637836bed5aae576d98d396a1123e3fa38f2c1727d18c51ad790221f1f3f3e8086086a30e67e3ea87ce0c08711cdf24fc222f5409224fbbd3d469ae53d4640d81c453986e470f910f29144fb408a3b2cbf82c356c244855fde06309ae5af445b6299588114ad487ac161b44229c905dbd0f4493392fe885392fd57afa54fcafe7ff448f9e44ac7810de315313d46a1f571e4c3880f231f413e8cf091848f211d2eef31f21c1f8d8422160943342d7a20f548eaa1d4a0bf0e97e7f450b224fb0afb106ac2862ba3378a35fe3c967830e91cef815464c3559151f65f15b9b27fac33522e918c8fb93d909ce558460f2d62e417dc23c9091bae80645c4e6905e439282667f9030d65f711ca8e6a5a0165ff2a2366460f24cd5272964a92b33621a1a1ed4614206c189f004401a0f8840074274f011da82ba824cd745649cd32a64604000000e314002028180e098582c168344d84d97d14800d829e506a501f09b42489711452c6106400000000c888c088cc3001c78df9401ffa78fac760c56d42327a326cfb3b366ea55072b15c38c8291105b5aab19496cc0f8187582edbdcb332dede99a3ea81e96bed5219b9a0b8cc6abbd72e97b2edb3ccf18da49db564be31d222d9175793b82498369d6dd4a2c06f6088142a32992895ead3d6229632331141ddb9230efbc98cf8205fe268dcbd8b09de249f6df99682257c9ae7d79eeaee7389c56d4ca3110084334f5672c31b2dde9bb2e62d46111850069c5382112fc7839e59504356a9b25487db57673f682cef07c3d71d85fb4980f87106ced9ac3815a3209319d796a111183805cd5b10f4094563a18dfd115d1026859cbd1874b8e7c80862bb4368e5b047bb8539d5063045aea5e2de9f9cfa8cd7a8ac0f01fd44204e45747343c6d4643bbb9b584aa09896abda2fdf29d7da2e5bb9ba03e08295fb63512607ecfe8c772592af033147252e509b1c4a1ea19d0a340f86029e1cce98b44a45e61e658452704d8ad8bd5549187baecce0c785411311c2cfe3eb124b89857cdc0111fe06c31cbd08daefacbec33600a36ff1604425469ff4612e3ee62e265f985a006ea3ed35825450f81b27e584c43d090c879753c0f56228cac8e30e4607d6e2374a2002e7f2b7fd3f6016f9ae1f135cebd2981912f4bb8e848855fb0abe1860d8cd688aa23cd6864771fc2a58991d0d4865f5a25cf80b4d9fcdd9fed16500c41edbfaa39f95a2d69cee419e41d6d1d3dcf4bfe99d6b65643a22b6bead68982cbd754dd3a91ec35d1e9806bf32619b577611cc371fe4f87632acf179fcf40687916c28d4977d485dd1bce99d8c4705c1209e7dd3b17d5614c457fe541a3d72ec044b100b8db235eadec8c3de1e2757e968699e6ad6c3110227a8235a09160d89e6e4273c2b91fc182410aa3c080effec588fc4d6bb21a5b062885a66e2fb20b3c929f34eee957610e63c537bb843246db670336cbda360f289dedcde6121e1bd276a509727321e7b3223582a8511476a3633197c98367bc0471cca54960026206894c9951349f3814c1742a62e2218a3bf87550d2491fdbbc8eb04f8c0d50788007fb10e591eabcbf252024fc9c040717241624d6c132f6ba4bb28024e5063b2181b38550adfe3a8b4b4cf12465e79293e7588120b42e97715d69b8e622774afee269ea1cc3772deacbed5d593bbaea50e30b6e5ce71d7be466735d152ed9a9dbdad233354f4d0601299bfe8edb5dc0fbb5fc4029165283dabddb9968c763b8d8a4ff426de574329b370e8935786b6305a65eecf719cac641f34f8b894dac7199ecd72589048a0029ea55bfdf67314b3a85511251cdfa513573cd8a075d89122db0386d160b37cbbbe09b866ad2ad9abd530109cadbc1c923d282eab69420225a26c71a15cc796d926823947f276e3fc1aa1cf0a4123824b726a59e5aa04726c36b7a5ff2a35e783a60f80181d08f1414651a961ac39c50ecef4ffbf9da13b26ea752662316c06dd97a5453d091eea21061f0cbcf6d2b11d8bf8bc13cf6d909530d8ba2eb4db96bcd0b5873ac9f482763b690fbf6579d31963abfd62879d04268f41f1305cb2f501bf91c04312fd0c5870088e9af41bcca06bd7cf77974c1961214c007080619caf02d6ad986e311cdab3057757db8b2a886b07c294334a888e41ab8950d7f01416962420c2e659d2c497c74f8b8cb3c5ed4bccca16f540885f2992355fdd20ef6287d12173033a4682f64a2575e4b2a38dcec8c2bcacaa19a9bc11be35bfeeb93a376b15904f6207b14a75cc90c32609e8eec257a9b17f9867fd3e32c474032118225c4b9c13787965d6ae6e0933e52d5caa6ea1dd60bdc2038233a7869425917c8cc0e0a6293ba146b3f3f6739ec942a18acf522d36a333d64e6d612a2933bd42e2a86fdd04668e2700ba22318bbfc3f84d2a5ccd5c0e1186b41681c3991405bfc9767b5342e04e9a3f4620180166af04d4766f414019fe1937b56b4ef6076655887c8e6a0c443344be4fa7ab0b87e803465eb4c96008e8a1b95d9b8898fae29404c917b13775b7830fe62705d813d4c465cc620e6658a553cfde13b2cd76176e806b57ca650298cc413c9ae096f045041e2f4bb22f0459dbc7adf14ccd94536ad1d25d3011c88419c55a500ca1211bbab6602fff1195b7a119d9639726d0442f58019f6070621ac85b1d9acb7d3a9e41413de82afff67fa7ae6adb168f30d8d50a0e77de45b55aa6c3c696dab82db53487d4d4bf29305ee959318d233a431aaf878f75edcfcb2fde70e04128537d166fde3b5d29c0900576073ab19a2a9ce28a705b3f8b912a8a2c18b63035924ec3507d22978ca1c97948ba1ef9a0df245db99f401f255310dc115c288e2f16fabb33119e7fd4e81546d825e3eccd0e247fd60dd30328800e44a5696a18ff5cf7b6f8f363a2292f9a6e95e2bf891eef5152e39a0f3a687faba32f4c51a6a878dcb22e22a2525fbc415fae4566484ae5ee560eb80a4dcab5964f06ed124a56d593c01891432396e4a813b3109af1cfcdb065266c5f256ca75ba8bdd42bb99866e34715c26c19b31fb7b2067019601a07b839413d0527eae5b35c1a8f597880f20ea92c94965062e9a151be158c4eca73585aaa5ffcce0f902eb2640788648b2a4b10027d1167f12243651ea1ae07ff842cd8771de4b5c260a8ef5c48f556c805d57922b54314c45340b4a8fef670985570692ac03ccad636c75f258f14dd6f59882c7c4b8408134781c176d8d40b3acb8116aa06fe8ac1e81ccc157342a832483ac9b185eb49d99ae8bfc6b5464f2831232e86ea14198fd7c029813a0ec8660270fd24544712293bdd3a4cf834581fb42268a3d011e53289343fada5b9a0f1cf096fe5fcad244ea4e0b697264c7256a5f6adec7dc6786887b52934b52263dfaa9e6036ca12ad84211c3c9ada6c6a908dfd80d894b13e2e811576890625995070d2940032950a81743392bffcf5aa8a7b0feabf91fbbc715dd028706977e6ef3477ff66dac2d20e6ee194db483a45f6fa697d0c761cdbfcf92f262bc261533ad041ca9907a1cf4c8b287a390ac3833610ab2bfa679597a3e00b15297657443f04cccbe2e7a6f1a259c8c980b5e15a7d8a82db174a968656ba852cbcf9f40e59d29f1ad98a22bb7e672901361f247140934efa03201cb8f938228326c4169f2cc827812c56581729bd3d240e853499d7db25c481f387c61627be577c9f47c25c24e74d51a84e4eaff6923a11e23248ae953007321fca91851e09111ed775f6b45b95fc20d295152fb85ad32016fb0b12c83c02269f028d117e6c23abb989b5d5f837c50caa781bee408ae11d6d156ba4c0354f00d79198066d8e5667ea717f58146d30fa2b188a0e9e3d3abf89b58611b9e424096f394b6c7318a926195a1cbe04e8abe860aff88645f93f941bde85337f531a4fd3ab386e3eb2e6a03ca17d346237033e5f2e7029f6123273274febec1993f621652ca73e279d0295da3720d0617434ccec5575c1351460e289ac3cc540480877c6bda7a7e56b2d88279c0d90fb896c8dffbaecd4bcaafed9fddb3d5add53dde7f77767d5fa9f4856c3f73c8824588107c1eb574af5e0af295ef96401346028fb767c5d2ff01d54d311d95e32bc8a2b1e3da7db3dc0913156d30a359476d363b29d8afe70b931c140aeb8450664b189cd1d10c2391da0c906377460b269cbfd15bf2f28113b1cefe9190b2148d1c0f1a4ad1484c37a0b60255c7cb1b896cc0906a27130a6ae7510f26af0cf6f781f8ef7f452a1068fff0248c18175c674d2743f2aab6593821f743dfa604c68314a091e8b052493f75266ce750d13a044b605458828c1b41cebbf5b0e95e53de03e0c89d292c0c827f67757ca1f3f6db34f7c356af0678a8018fc8991c8f2da2510bd3202b809a7f44d50188c3a8836b0589f1bba937a096c8045aa9d7da547f8b104808d35a672370c5589ebfd656e8e7923ab4e2403abcd233154cce0bad4e646bbb4557bb02e124b4e2999d075342af1f32bb671e1a8fb90dc60059a6ad1c0db18d89a7580038a62bf88621ec128ddfc1005caa722e7b00bfefa4d4e09dce131e2fdfcbd3fca3287f4f9ef7ef0aa93feb9eb44baa188d165d789a09800073b49bdd8a40a285a85af4cb8f21077dafcfaa211672f80b76a8ce2d4e4d4fcaa51870f80bf5d35948693d27e97a279ea20aee2a4debfcf58cc1e5595b8a6b1f50b34f223d8b4a4cdf88bb5a9aa51b5be1a90c618b17d552f1aebdf29493d163adcc26a35c469e22f25a2b7d63bf472f89497e3d8e4ada236674a35cc5e773add9979bb7be1a219eb7b988a2e1c94edf39572850df18268a6a311d3c2ce381999103b3fe3b0b4ab004e767ba0236d8c587b2f16be3b426b940f3352fbde4c9f33dd3ad38c218eab75ca1e59c8ea30090cf73b4337396c0267a0fcb4dd24b5a6929930a89b8470eaba4bbba1a70407dd32a187efcc5a4e20654b6dbc322460510b39be260c4b8e7112f52fd8de27acb8a64dc1efa6ad62bcfbeba2f767e42c2b998cd66353e95320fe8aa37a40223f5dd2d760dfd06034d22dffa64ac550e4464f5a2c750463195cdd44afd311ee03c4f60eff94bbaf2e795fe1b1f251df67e5667955730bdb9716849001411e4b50eac086e84e9ed24f4fbd631ee5fb917b215feee7253b1150eec145a9acfa5d1b664b15c9bc595480d8233066fc2ada14ab38e72c422c6bb6dfe4fa73286b63f769b5aedd8617e3fe0c5464402592e07bb8a1dc8f9baf6985fcb673dff57dc0954da59b5265704397460ef09a98a838b23df415279f47f315030f8d90d2988ac5833bae66c05b06a34029402ac29b8785e06b662b1782c341e11d136b57081b5248c2229c22fc7a8bad1d24aace43a18086d7dd93826fa060977deb9489086287f2807fcd3c035b66d224f41c31c2d3af48d4e2fad497eaa68e698fb33a007f6062ed40a23e3b21bcff5fad035b5260b1b6adbe42e7ed2e6aec098b5ec18281a2ce21636d35014c1c25dc9c5709696d922e9f418c09c7159ff333e81020774ae2e9d5eaf5f5430bd30303c6ba61fc2b897468109f079edd02553b96896e040c681a7a86217e10318173d1b6b1fd24bc5e9435a8baf2c22c310aeab55bf255d3c200883174c267ec06c06f43ea443fca81ae3c43e8cb024b52500400ae08a915cf8c45c84d572239c8abad80f16ede7a267f29b651c163f2bd5e6168a79d56bb219e580142231518f8a432ba7f9e83dc7df7857c118e67edf6494a475299d68b04bd33b7141231e9f2565cf289296cf9ac3c4605a374ca5229cb0f5983967db6fc0dd06c4bcb983960c64cb1757cd3013e82f9c4c480982bec2a2835e7460486ea6fa0018c3dc5ca11099f1aaa7830de111650c85317e15cd7c645b1185ab725aae842beee48e792f5df54b2893cd61048cacfb235ca4ec3106492c38cc4442d24a6c80d4c43e8c461074023877688f72894f84a59b7107ea154a4282de1a2a9f37bf017783c7cec7d59c498e5345a6090b8d390099f210100e66f783bdab0674b5e3e3addc271ae0e06a9424e7207df2dbf6ead20da50be05eed2e7a1dde225c635a461a1265de2e57ab96991911e0845348f3e9ae77b6a5dfa18e7eb57bd3080ee92caff4af87cf972699536f2a8610263512f4c70aa19db479508f2777d280c3a4963a9010864e6542b96d851b7106e6db530aaf33b12a10e471f2927b81ac62b88f1ae88fe10437af3110b8825c2b7491c8d87fe0fe419d0322f26d32c38191190eafd3e44bc11c0ca1937854167324ab114f5aa303d66f1f23fdc4c6305b5e7cd17a9a27f6851df71774429834be1f6ce0cd8523543a9054c4845a1dc07cceb32964c48136d089c51232cd73c38dcb2de304d25270346e00cab624b9701e7c32b305f96eac3aa7705dda60d8839a7420b564383a410c028341ec82b8403a43dd67c3d1ebba63d52234a3087a969034d1876a323585f8a69e292bcf403ed4e4a3645e3b8ecbe2e68fbf7f99c7bed56620a51b0d184666b27bf59ff5f84e84dd8a7e8cda96285b38d4e9340560bafcd082ecb53cdfd9c297579dd35e19957a0b6be302eea24f4bb9afba9ae4ac36ad42428921331f05e1e6718afaa3d13843b4d59cc0ea5168eb00dd2deda168b135e29b518226d360773375c9c0ff6dfa8eda8f990972760092e8e02d05d3b093036c2666b0a4b49741917c1eb29580420eeff998242cad23b3995904c81c2c4c614012e23589e73dc1564aac4abb093f5d313d865e3a4f8934728e4a919599320f7f9faa6a4a4819985b62f8a82076d37d38966e3a67174269ced64d0158479ba672402923b0278037c9737bd2e6dee3e4da01fc4fa8ee61a2c1ecdba9b15234c6f45610049adae4f126277977f26045a935fcc6f8727b4507cbe2b597b88b2bac581cd53752b521faa4a8c6f1cd68a06cbc7d9ad5e7cd3a343f89a2d30d2d644d2ca34b1081c16d5a0e35ee1ee0eafa3a6d147c951592c733402128109e1f7ecbfc4b166ad51d0d669a54636991a176fe6c23b514e052b2a5a8405d307e40900b7fb7416b9934bcb030b1ad843c1ac5b428deb5dd8dfcf713b4807f1d8edae113da864c2975d0ee0ae210c4c9f25e999093ba5ca2b3cb89933dfb9fbd50c38c1c621ed40dfc78169439a61da783138392bd9bbd72c64cfa4c124b0b786567f6d053667f489377217db32feff4de6446541f2dd4ffb9ec4b9274f491fd9de145540649b83b0dbb8ecd3b0588b42aa1d57c03380b259b99093e699fd49a4c08e8d8e0ccc882814b6b51edccae3f90f2c318ca9512067c8a2ae9c20bb7f9101d365845667465e4d68bb7790f0c6d1a174f6e90d8b1c80903a1a6aed65c7a4c4f3191a6b5eb08894368ac11f5e94086970720c24d28780c833c2fb7011f6d0218cfa30b6956868140932be8179248c319249b4a71009eaeef096dac9017adc217c9a387e5d54fbdc5d6e470a9b9ae7ad6052ccef8e6b41fe5b73b9c58d33d4eeb2d86a0bbeacf52d6ae3bb1d8ece8b21094015034931b9e8f235b72d84aa61c5c4e0c5502addca6d542486c437c9e49e4e9c49c05cdae412b93466618091e81fa9d922e671a9e5381a2e47b673b04851c863679f5ba4bdf78c7df7f34db97357b849e55c556b21629705ca7c5ef0d8f4162f295a45b22cfad130612e746735bf4cf8cb86fa76a4c0d69bcf8f616570cf93cafe1c2d52ed3f73f99eb0f047607717386a24fb14e95b9c82e8f0e2289e65df237b8d3690b8d752e9ab2258f7cf97ee3b0cd319a8975f6339245cda0fd56c9b0ee13a0ac1d0567cd78657a71e61d2ea92aa147a9e65713eb878de7ae28b4a3036004d14b18135e8885043fe62007e837587d794fae876c57e5f8f9614e8008288dc4ea63d6f22b1f7ae07f0f82f9b6430104079e3c643aa82288a185b83a9385557d258bb3cf069fe8b076d53fe8bde85a19dff2d4e4282e7d11e64bf19029203fa868265809404f4521915ee31f2d8ddd8a23bb90d51fa813a0e4b77f522b00cc39ec76b4962245c4723dd2df8d7a43a1c7aedcbbf8ae5e5f84e0239cb3f159d398d487857bbbc432e97cda05a50d26298fa599939cf5368451e8d140fdc742041fcbbd2afadac98df6aeef9ad69b18402539d9166203fcf2a76781bac2e1f1edcc3b59fa3a3d398247859b9e4812cb8ce13b41fc185106480c21a3fe309b1786d8e437c77216e155aaca1b1eb3c7f228065283b3409c5df5cbe645a81557d1851df4d6b17ee409c159ce61f502b1db6adbddd9490b6a5cf046823a07b647d6589aef0eb9a2c344dc4b28a5edba808e3d604cd9750ebbea054ae8a01c4d60f8297ecf566fc6cda1827d4f7bc6e600fad179132a608b29fb12030ef926920cdfc67b303dd4a20f4b16397180f64b3a277c24d8ad130b828fe73c2dca2f78e36d57eeb8bb6dc791d91f9745b11c4fd057aea353c1a12c126ff5c1d11795d0e3f957baf21394879ba7bcae75236f94ad08454ba2723a4d31107ac770c56f25f8f051c986c95167583460393cad16afe6441f53821b42697a30019134019d7fc03604cb9f8259cb56243b1d5eabe4450427bff13675aa8fa7e27272e7144f5afcbd0befbcdd18e05a13de49bdcd968364b67a476abfe9af9c842b158b3e5e20002ba69999db00301755e2a43ef63b88a519a8df9894d086f43d72304dab839371eb54f47a569b2b8350fb6ccb3612420115d1ccc2e848398fdf75bec39c8f813a57603517fe9ef11c06c7f47fbe7c4da979ad4ebf8d4e28726b52684022fd5172f5a08cc24532ed734e83421eec8cb6568b39adec40c0563f28af554bef43224e1888f7846b41183f9edab86734a2236cb2d4c292b98bda6c5eb37907a4dfd1b227fdf4bae0be69d8b81bf15d3b0e0bae62a8917030849d508e5ab0bf6656ebb21ee82a987aee8a4f765825c88226003f3da5d317dc90f30e6e86cf9fc9b4006437753055d99ed9755e23aff7beca4e9e349d962c0bc9f54f93d2a8570075f48f07e93a7e7bb18a7fd1350ac2775389ab60fe193abb38343f8250030c3b22514e7f8e06a3da8edc0056ac32f4c74260d32f47a89f409960bd0ba46f21c74fb1d2e64a4c4fbe007019b7aa1e676fbe4f1de7ba629a009170efaee8451d7c8ed8760e9e42c996fb5f0a1c631ff6e6991c3f6a6890b2b23a5e8ef455aff351a5704375d2d56198faa3cb4e8f093403e3b420dee8030fab1b10d5d7e62d2461cd89f5e618b0d75dacb9b57791a971a3d7316c308d81d7a028226e0f5ad6183900d3badf3de98c0ff361a2167115a4281f054fec655bd48bbd1b40b8f23308885c43ebf9f179b0c0ed8e8cb2f8ce8e1b8d231e9aa695599715d0f1a29b016bc004b29cce9c54cf4e6c3bd0ad6cc9d9edc987c3f8c6106c460b33546e5582c7103be05effde56259e05e0af1cc827468f7f1b458e3bb3c84afa94090a017607582882857f3ef96f5c014028a0f4ce8b7089c2c1d5600300e5602ace28022cf711f4915dc6082978e8661aa7b0cd4f179509d555098f7c92bf14ea65d8abf440a3a62f3895b1ae47317cd0d6bb9b1eec9631c44ceb010bfff0f959582727300acfcad2cb05c06e8ecb9000a32bd56b6d001ecca63c05822ccea99db8da6fed843dc1f8fca71dee11cdff18ac6fdcd9115667c06f01118f7df723c9a0171e5eacc8bec627f2c80589408cc72147a20b6ee68fd4a1dc5251574f700d494ecd9de35f46ffce482e607747e862cb55f48ccfd0b59b6d41108d080fc0b64d5d9f55d9a9f9ff3207075d3dca52071b1280de802a340d842348a658a86c13386ca627ea946bf36b16a60407f70519f6f4d13a3ab333eaa65050aaae5d1f26d08edd0d5a3cc089260b7b16514eee4b495a54c9b6129d9519c86309daa500c37e0447316266c3bd0e08952ded88c3a3b3859436bf0bcee35ba4a2a2429dba77f4c47cce51ae6e1f15d35d232de4784f4697f581b44a2bfcaefebdbc7b10506fd3ab5a228e53ae314b9b06e657aebc01e144c876ee1c063828f25c6086d95bffdf11f088a3e78ba8f5a3d211c4d441a31fa1ee0ca52d20f9d1d0d1432ab353fed1c69dbff426af9b1982b8aaf358a4aebc2d32fc8bd450557d760a01ee3da32bbeba02f5a7e687fddea5703e239148578f0cec6b0cdce32f303a40a0bb13c4d5df73f20373ad6cb90ab1f5231ba63519bc0f08e5845109c876d209cc2ecc7c0f48572d43118fdc371c5e3c20fa72e3514fe804cbbbbd9ae87e1680ba3d13fb001be428c2da59518dc3546f76bfbb9b365ddba40d21b2043da0db62d8bae9800f6d7f9f7f4086ecf7d5b784d4c76f94fc63d53e01b99acc301db2900cbba02c87e1fd99ccedcf842e6f34f48e3cba2ec5080e1e7be361246f479998b983b3809822bea37e477e1ecdf58e2ca711eb224707b5b8978274299f78b379178b285fa5c24630d035961a09bfce58b11ca7e03fbca77ffd2dbb485a2144ba90040d64e67c0a7d49084110d29a34a6549b61e8d59be0278e9ec2fb22f2f99bc9bc4ddb1eaa4cebf7221fee8591b87fadec7a52d4b6201c3dc5993caa62c219e18bc10f901d106ecca1e7d5efa8b536c79929a36457f675837917b26b39063e04776c72d3d6f5881d6cb855c5e213077dc7adc175bbcec4ecbcfc89f61184cf49a46ddb625aa45381c50d30e75d23eb0c2058ab71e279f0a4f45773cce4e3f6fad42f2ab193bbbd369ecaaaa409032c35735ffeb16c6900e14a9fc3c62dd133de0383a8e4b84ddb296df6b8d941c6de9b478ac5c9f9fe3106b87f88eb3a04a9ece008fc75c29a518b0dcff5cc1ca265f53fe58fe83db1e69717e9e0e4f8188d000b7dc449828df3afe9d9ba5a279009fa8fde64c826e9a1c619c5b7edea24e29fa7343ed3ed9ac5bf20971dc840d7ee4a92967138d12576a6c41507d0cb917fe8d6baaca956d66e67f13b5b2cc862a97abebec156faeca326863728ef3c2632dd8c8c89ef9a2b85ac969d4b2b3e9bad24b72e9b1eb4d753b9557c1e6a6f2f54c78c4f427cb7e04a9d00b2a29feb7baa2d6d266ead65c0b8b7173a4f27c406814c9b0b1097e912ca1ed780fe88782ed6951db51b857dab5d33c43d461bc7675a352bca560f89672a41aa25e48ece888b2e30eb71070f97ac515cd1acc5b7524fe1720e3d59a4506ddc60803cf7b3b2c1d6202568bbf7178292a8d72c1c2dffda943fa5ef41682840e141981211e247a8a9d89553bce02ddf745b5d9482627b51da9df5a4e1f1ce6d7460baeb6230188aff5a5816f11ead7f46ddbf11da8c69e6db2047a3dfc60f2f32a62d26689bee1b47060dbf1651cbd113ddbafcebb671c87c9c8761c208a6e69134c6d1287707234e80e7b93edc8b614cfc689de086450516cd73d3d1602b40712d2ce33db9928a954bdbddab08b56bf3700960e2aebf2fb3157ce55b9aafa53790b38d009f89b40d630a5d3e60789cd2235997ce3ccf5cb99558fcfe9693999ed35571daa06233b9a1d58fddf6087df42a80b60ff299442f12505e49115814b09eaae24c40e2af52ba2903f8caecd27d055d57715801c62e6cab919ac29c55197aaaee2949201095d83813ce20f00aee61a89c3c4bbaaf7de46ee8a356c2eb18aca186f58df00e5baae220ff51b2beb2da37990d31c6998fcb2d12e7d033211280b50d468091954a739afe238e8004cfc7a620511cefeaeda4767dfae3308000f0faec96377657112d133bcb10fa199c7521a1085b6947a15d9f39fe9e51f87ebdd9ef9e16c569b45ce86639f024b1e3135256b9821091d99ab49514666da5eb7a10126c7a7b9734a5a57d4fc4f333704a27d9e2af36792a36fbd5234751607f90b004f6d964ca8bd8999ca9d3df153f957cf5ca649d9fc8fd8bc90cdff88717cfc0738d9f45aad1870cbee3005455c09a9855c6c7aa0c031609215a4504f976fcdde2e218772ba18b10450f58323b5d5645a7194e0731bbd71fb50ff356a875d391308ca02d003cb7e52c9a299df152c15f5745dad9b11edb1ecd902c8e99e05936b93968a233bc8ce695a87b0a1f8644f9a6cc87e1b481b835345efa854c9c4a69da3ed742579478507cbd16a29c4c44947c2ccc265a094f70f64999a8b879815a8e9431205692d5113dcf905c6c2a03bdab2ebd827eb192dc1d226650ec6174b099ad7b92cec5fbb4f40a95507cc38ae3658e43828f9f4fd886bad201c87b1a969384012dca2a6b529879d2a5009d8cf293dc815afa20eaba5857b58c40da02a72086da733844149717c4096d04742bcb6d0983f3c879dadf6b914149aec14dfc9f3397599eb8f9cfeea937ca2b18cd1e1d56da79e8f8d063cfee135577a7f2c479c0a26edc21efd9f2923d0e2afa643514341640bec278f028a646eb52b5274eae1c32754bf7aba447ed78dd3804edd989b7a677abef11d85557a64d066f0df50c2439a3a7bcd29de5118fc29cc6332aa30e39400613271ae703db1b15a836822b10d2e3de4762a564b65b6cab455dd3337ac6c8f4ae85ded7b5600220168cb9bd069e7d65804225b5b6dbf077ae8fc534f4b80e76769599f64126d63677f260e6521aece993e9c74abe9d4260bd7b7d1d46d8b198fd206c9638fa2d37c3a9a0467df4756e28f51be44052f3a420b16a68db90b0c4de0d6290611185625d99c24071c66d7748b4b2f264ccf7b2ff229f2f8626c938f56036ac923a52ec2b6da95e2f7aa5af250c5a851f963b22b568c69e42485dd4a937c95a23ccdc33239ffd180c9035535a229cbf05d34d9ac5ddd54bb41b08a5a96f0df0282035403bde4e6b7004e551091732f506fdb2a76b012d9e06d8515a8ec31f49a6ea52b9a0b8405628efb53d2bf1123a2cc7d7299bd90da87f908fa977bd8ec78a13a8f8eb81f53020e6d121c63e9e5149daf88fcf92a24e8ab4288424ae6e30a47a71230ae988b4e1f8a79da2f2ed5ae5ff79feb4162df2646e6f633361d14c6b049b9c6ba2b6e04681f594db9a40d10a8a68c50459035b55e876117760c4df119969d3a2ce32aab8b33b0250686926c65095565f09f49683520445c5bf9b2fa6037f94c8de2f237535f9af29156c15f09418737b22d2345377f9cfaf8783172cfd981bde3110578922cea1d22b0a427b1a8e891485bac7da90e52503645da690ff3fc54b9aeed33816c5cddc3bb1970ab992ef64d1e847ac2415d798a59dbf2709b4048ace1afbe62ed6e30811747cbb312586a658fb316253ef6264cdeec7d20b55cec34f5031d7bddb686d3abfbfa1d1ded6c070d37c2eb77389349e18ec8a3546742308536cb73f2f5ee3946392e905325ee24a00ccb4009da85827519aa522428116a9e59cd45bd57223ae181bf2eb1276d79f2901955abebc15caf2ace35c224016005ae49017028d1a74dd5485dd71c32faa7ab2774383126c26ad8590f7fcdb28e8b85e9802debb3d151dfc708a8896503edc71cf917e95ce4d7daaf2bdd931d7b3e0e283202d0fcd929e39cd1398e8867bf675ea9981a99ed6b082f1369fb2c8e29214839d2e3510f3a6a65deb67cc1723202f90f2ee0cc734c17b85e2daf33ffe2d9060e4c819d8252bf2efd667043bad6c933807cd32934c0ba3e54d96118d147f537c6e7d30ecdcc75c9320cdc867784fc5649f439f53a9aed9242578a18dc11c27d8e8e6b175694f4613ee5fc8992dcc5a0f4a7dc60f4405d042e1295f90dda507c2514322ad5223e3e354325ef9ec0b7e7b93723559b88cabe651275001887cb1d1d4afdbcf3bf4208063ad0051ab8db493a6855b507402b57a7b9d98025e49b28799432e9d6d62ba1b75058a4fbb0c16425058dc16be5a423910ab88d8e8d40d7456e94ed228333b20ee4a3567e26b14fa2325278474597e03d34243a9c38407451b8c5f36b5444597bab1fd4754926cf319922b99febffd407a57f0fbd875dfccc0a3d4ee4b83c3e2c4e6176367f1adac5c11da91075c5a43ff0731c80fe2142fa26a77ab9641cfe4369480df5d9b173d963767fd9b8f1f048047570c241bbc522d34172d6dcb89fb09f5193bc34523138766b086e449f094f32f3a9e29536683599024c44f49e6cd1ef313f22fa0a3c668f9208d51049273782436ba40312eaa2e5d62fc351fb18b8bff7d816c91717a0c99c80ae2e0d071bb32a9eba81793e11db418fa80da0319ce53f676c466cbc121221b195f65fcc6689d9ae904839456c3e9d9313119b2153c4260cb4d1fc1ac6d8241bc644dbcbdd8f564aa77ca062376ac88c83d9f284bdac41a048db56738e9e248839b8ce555f0299e0f6fdd4fdc40f9fb968f4bbf580622a91400bfca5db6747c0c85a078ae4baa88378724a71ecf09ff0f5996a4b5a3f7e38501049cf7a3f494c7c241cffb405b57c5450e27ad9c3fe71382d6b19b1373afa7c4b4af5f5f9a82c903424a0ed77a0692e9eead84ef0ad27371bdcfb5cfc1a200ca1e7b65ab40d219f7c3e0cf3396e1c322eb8cb05013c502bdab9271dee27d25e70c7964c847afa4ed49218c83a7748bef43e4681b586f7f8925fda488116e01b3129b7cf125605470c0328504f3f2c2a3c4f7f514c76425a39c87b9ec4e7183e9203d291d1ba4de075d6b19ffa91b6ff1f32d82a69f87bda0eab5dc7950f2fe9e3340802ca091fe96caf2fca80f8a5b55af2117f49e8c1e9a06173ff67e26d767a43e269975eefbc7bc06e6375ada682214ec342dffafbfdccf9c2fa4c612151f654a48d28386cda6a2e3c221f03bd0f5eadec29880eb9c108716f4161e1c9f8bcb138cebe61e72ddd98fcba025d46e7e8dd68b28168227ba5a0fbb5428fcfe8e86f6480cacf64df14ba6c88761af04a0ae405bfa4be3ee906b39067f4385b431b59b9039361c61ad30be54a1233e947ee395d94680c4aeaaa2bd9fbbdbb30b3fc122ddd8d3884ef3809713fb73b489a920b6bf3ea587333c056ec121dfb6dd5606bbf64ff481d745a76cadc0e968b291f8d00dd530d89cdf81982ab31adcea9748f3c45030d449b1a9ef8b72ee51c81aa7013a7f830d5f62ccae67b297460001310d1ad2d3f0a24faee226bef5a9c911be9f81ba742e43bd2818c6f09f8df1da3b08296555d6d4c50761631a56482f4426dac1b8874609174ac9a940b35ff4bde70c5acd7be7f78e8f3ab898874467b62a87b920e365975384acb82adc89320d16ab45b86e2f371d496512df2da0ca836350848a4e2edc079905def0c0c2b8a3a2e31112dd498c72c154ca344e2e927549f9bd6f599546d4c954add509ed3fc2172b30d2f160888528e911be7f3661a9d8afe01f7adca132289fff0742b7bd4e4dd24d8990ee022b7be2d619c7ef1463f87fa447eadeae27c8d174838fa08c16b60df9cb07040926f90c722ddd2a71f173bc34ee7d7bdd8db2a9736c066536f4e9e1e46ab674b882190753ec53457af659fc9173498987fc1446e20795be53ee21dcc22b4a907979a9f4000557b643c3a66b2ce52c9e7a32b4d188f94686e5187360e3c036c78bfe645b9eb04cc34d94398a49225661aaf0a7f1bad24b4da1369e0ed7815d574e11a9265aa327674a612bb7cf374d75021a7ec32b7b67f8d201a3102d34720e4a4304da13aadb9251655d275e6cf50ca9bc915786e6f8a453c083188c70841708a192644cb51083d32016d40401dfbe6a77f44d23d7c792a2c08c8c186d705dcb6c1e2e0ceedb0dbb236ff3eecf0d567494a2b568bb5b7a5fc9541d534ed3ec5fc4becf1038435edefeb70cd9964fb5da4b0c79c7749ed055e1ac907ec1b8dbb191b86677e64f07883ed504725c3d023c4a24de93dbe7d4e4b78f4aabe1dbe8dc921a3d57fe311bc3c5f5a7c266abf94ac431287629d82f86b5a683b085255be651726c00d42b110b75177b0528159f59b548cce501ea3aeaf5b11ce2f4a638bf434adba60953df1988be2b7097845e171502ce4503447ceaab3f4b21e1082cd68603c495573dcbbbb0c32daf7bc97e3dc496772f912b5f56bdb43671ac033ebb72cda0ab7c14057c7dad11338b8a6027d58e28e8bcc8e6a056855891be3856a56b1401c514e9faab2ffc3b6a4a676f04a478edb0fa725a1eccd5250c2f5e501de28874a21d0e65626e2cdf462102ba943e13966734d2f33808e81b093a37b640ecc855dc0a3a33d6e004df97a07eab547502de658ac9f8a663900fa6d0d2452ecc6027260728c0db2dfb9d1fcd04de912ca045a589ea78a5186c2a4afe9feece866f501e9ed752d0fca354e7eade514a0e91f8f10c55e3548b24753599d7df0d16103ffeb2b53916d868474cbd8008ba9373915cd6c4ede4c8da953413c864d2549edc4c2cb0e4970f29716b44c36bf5446139883111bd81e7ed46f89064f16fafe9a84274099fe99efa0aaedc10e8959a0feb0c88a39c7a69a86d8d8ee0195ecbf98ac5cba3a97c1f932bc2a2947919ec58cd78cb8be70f5cf75b1b6aed86a9f6bc2c067fdb5e509cfa51061c15b4206cd5c2c21561181806014ad40a898ce967d0f586e92a50d9198b14576eb133fe70a0bd4fbadaab7c628e5b3d1549892c7e0487456284d501eaf65f26304d021398c06efaec97218ccc4fdc8f1a1bbab8c0d9c640d00e61d72c826fe0dbe2964195ae9d1eb3685e9629509dccfe971fdb792d78f18f038e38f8b8b58c44691dcd9e500c8f4cd49157da20b0981dde7f516946645a77039b4281d76b839d9dbf9de0925dfdd792cb132b2f4fe80b7357d4c612778e39aa974d9733219e8e77a21e57dee79bb6f81e29f0e63c53c6ccca1c259720e1e1911aa4f308e293f193a697f81bd100172bba0f67b8232302d7b0b7c6af1fe02628aee8f3ab19d0771c34591002a9e08980b52d588c801632dc531c1731ac9a76678348ad7889703d84e04b8e962e49beebd5e39b19bde4ea68fd2f067f980887fc374b75406421080315fbd1a289620b9f4e494b8999512bf9ad266e88a2b687abbc7ab403d8e0b26d3c310a7dfe8118f699b97feae06dc10c344eda7a2297436e17a2f33634b66b1fd27d5871bb2139e9e3773cea1f143a09f47609d1f1b86944750a27a025e84761e031e1867794a2cdb9a01862cd56880b085d2d27329a5162866b150d0e54eb291e9dde793246b3deeafceeeed43d8c269b87fa1bb91b421c4e494094ab6b299b28fac2014b8bf08628d56f0325287ba5e3a563a30aeb06b36aca6760a1ce64bd2a2788e5f5eab407e98b0866d56a1135b6c85f4c4b48fce9fb109c0b8531a0c678811571539e81513345f1e63049da83e2e4b49c684aa287a5fb98668ced80e07f7994f7ef6c285d001112434fa380b2d469ba1f60f0458748f27ea18be355aa83cc5c652671a6480fed33c26ad5ca8f8719087dbd0599adddbe158f1a121bb87a69ac70e9fa0c6e4e110cb419fc8c305386dae0e5d1118d4c12e5cb118272544f294007196164492ea0e99960cccffde09179b2e05d4fd64e37e9df23f5bafd2ad930072c7f741537259ee63aa2a33a43827135104e41b9657188a524479bf92042e2908618bccefcf4de62525ea2b90603d7d2f6b69ff21b2746aff511446657bc571f16b20275fc0df5937bb63f904c5c95a1ac8003df3a4cc5c1694da96bdbcc273b7b1445ae16d2b16da8dcddad1347c925732025f1a72065e6c91c7ee4dc8e32f521c6f18f826381762c32711ad758245ef6781d702845bd11958c7a0b8c3c67365e33619d975aa7dc5f7a504f26f5502c846965ef1ad96e2e82f29fd3f2372110176c0934850db1e81542e1f1b566ad430d6437f7b2bf732fabfab4113b84d096c39f3193747447627862d178d1b8f1bdf6d2547e89237a110e44b6ff0a6b53a388b5fdbabb186ae693962a44a111096a15e09d468328c16895eb7490ca391a7e80ba0ec3937f71b2fc70ebc483f55d72aeb97c6d23e6866f074cd14fbcf45ac89f72ac4054f309a4fd962a8ae489aa12a34e48420282ba2d22c413d31c4834700493b65832073165215bc58a72dd3e716d5e8563ff7adc6bf0e0dd79131f69cb507806e693c679e22cc91596c32157ddde871a13d4330d88c230c2ea37d6a7a59f49123337965678b3619950d13c6a00d73604769cdd2ba74db6fe11ac44a3df14634134442db4e33ea9f0da7e6de802d5ac5d6027c015910e98ec2cb0a289023bf38e59136998071c95c52c04bdfb8aa96404a7febf2618609478980fc378c664155e9a7f5ce6ff357bb296df184c53a1b4e416c47191a871036ac4ba82cbd5acb6b92b87e0d382aa9760bc701b9644dcd3099b26d946ae13d9c79bb183bbb93222842770f1d8ebf1581e5f031f79ddcc6d81b1801979d92cfee3b49724085714f67a7f71903f9c3c4c589462a7c5c9353e13724d9741487665abb9249748d688d0776630fcce9c2d4a2811857cf5e7c30bfca1a96b8c2c008cced99970b8ddef0075bb01503aada8624b9e5a6b6a02c1d5a73cfc2dcc978be1aa7bfc8915fd12bf7e7174fc06f316d8db4d9508d7cf995239455dea479367fc92fba438b0390d1837bb41bfaa0fd72f4d8f111327fa853f42959ff73bea059742b4d538c85ed2ed19c92452d11724c8fc37be63ba4a84880db6f7f3dab8a05f68ba49e22d7c238a5b145b6f10ce2bed8f73f6211be868027bf123edf8d27bab6f25e8f1929048e7d7486c8e719f7616e046f5261b1ded9fe62a730f0e47598a083e616bb9add19e335eea0e46ec5fd2f1b609edbcaafa195ee69f1eccb7470b07d2e33bf1f44e1ba2a75a395654248ddf7652b42a5763e35bbc12eea7366c2d39a16d36d31fdffca3120f5cbe465698a1b211c9b9176fb5e8ce102dfe298350476c63d7a5ecb787c3f0ffbc5658dd91bfed078c360c5ac42ea74a0564b80a3972624315d08713edceda22efc788c02cd7839292993cd36f4977d073a57c0e26c1686d00bfbf78cc705794ef660e667bc407dc6b36ab8f48e617c8c0530d45e1612684f4702d1cb46351db61edb00997e6f21550e8200a554d45fd629c830f022a2251464d1dc796028b2903812daa585b4fb431cc42655c30be315daca437d8420edf91302effb473683f91fb68e5b4c89b658d131433ee4502d06d44872a757f3aa6bacb9d86ec2efa453d79b80ebda41d24e282109ebc2b097ba82f305fad5213d7bf291287873fef9884dab08638c7e48fe2a3a7f820dbceb5c726690850176aed8f503223f103aee8f2182e2ea7ae8c16a00c1b40162aa3a556323220e77f9055d1e96ed9355e974dba11a5f98c0c8df01240c20e478e39c059f0941de66982665ebb1afaa2c77e9bc224ad240f51285555b044bdd5689e8a24a447416fa7ba6f50d07f4ed1fd1d4bd0e2bfa109258bcee0dd3cad87081ee94fb5176300b46a53b7bd40017337b9f3d21c461f8cd668070e9ab66845807fb32bac6d00cdbe099da6d0e025d41f8cc1c67d58a3d177de87025c5330953ecafd0a90263d7fc1a8d80a24d3200f0f7e6442f243fbec516dad6d26f9c4f83b615057a784aec10ceeb212da0dc40fe78e6dcc51cdbd2529cc06015548b3bb158c90a28bc3d242f0b37e9990fb8fe8ff3c718ddf99cb39435431d15a5dd783184ee6c6d1871a9f6cf6d2e09b7e4dafb31b054cc057c1d513c019294fb92e89c902a09775e1ddb835029d884f7e88df4024500c940a884a4889cbb27d278e89aa6e347c9bbde7c3a459ca595de23ff753d4b1ea8f9ca23ce9cf8839bb4e03d60b0ea51f4a70633c2d1e0ab72cfce4ab654cd1834ddfb158b7a25e281017e26c2bf3e45ed59296de3d8c70226f5f37023610efcb1910914647ac5be8406490505a91209809da2e77a1da3de5cf4389f61e6e52836d84ceaee644bbc2a0b9a63b9106819d85c718e511cfc392209ec4770605f085341af78cf583bfeb445308aefbc4f388a9cb60dfafec121f667105d392a0989e8b42bfc12672d54f3a1b5a714dd954c0efb07b4e77bf7db4b7d2e0d50646e3a2e640849ae1c125dfe5fc855a64c716c97795293cb62efd5725d3f2e3b3fe00bc59974969b55d1fe99d1fb425c90b9a4530c3253925b425ade5aed0288cb934d1ae860a5719178d5346a3d4bce4ee67b45ecd4e06595d72bf9402548a199f92862b2646e4195ffa8ba244e0f8aad78e065d74b6ceb635099f6868b70155bf3ee39252a005d94271a4649ae3c84e1db013f749b783d0fdaecca5df72797fa4f16a4e6ad6b63bb92c275b411ae7ff4718a55bbe70829e6f7120ad64f396ee60e9b74f30de372200f2542201c96082af70c78e4ce5e381ab701a964c1baba7e7afd705eec3ae49ed68bc5db8d82ee8ea0f70b013ef4361479259467d0c0f2a0856556e1914c5b077999a4ce464f5b943b916c04039361f00a8e97003e23194fd4b93bd13eebc1dbb476b549fdbb2d230f1aacfc861137815a960c271ad3f0a35669b5c003f9d36ff2b1d0216394ca305f7a197b609cca170a8c3e068bcec01aeff257f54a326ee437a1f85df445f8e3e2361ac0ffcab2b034f5838afdeaad510dfd11a928e2e4aa78191adbbae0f2bfd6f5cabd1f45981acb1527c9cac77537c3be0a2984ac222c77958d1898d891ae2a4b1d84f4cc4693662f9d89c171114badcf6175034028be0feb284769b6322e88e3af8c8047cb9a98243d1d7a3d1eb69bc50f0d42e71e3fb5ee023ba238836a51e5bc94b7264396374f1fb0dd2c76ec0cbdbe1060c21707f3510ba9109d3d8c1c8fe127dd6717313dc13b3c786e16e9237377f0f61f4fee04cd8ad59950f946352a01f5180a3fe947190b6c995f02060b37f1df5e1ba05c822243e3831e3f7e5b6a59fa618ac874f6a2e6dbb46edca4d5a2adaa4cd14bcf6053bc025aefefe3d4e38d829691ef44343ea6d9eaa806808a66cc981b2cd16c34e6e729a2e2c2c1a90402004502bf74b701838519873c4566d18e957ba1d10588e5415cffa994b726b06fa05fe21079896094724b9d5aadd3a8620d88a68cf03e28370a235c18da796614cb126a0109b6f36bd073b18f2494b3a597102cfa5286302e7692692909f84a8b9f2218f57d4254f6024ee0c4b45c61b959b0a30f90d9bfa02477891ec5215d4e2125cda02f69399e192de7e78b96db5368397141dabe2fe7f89e4984dc379e937b92be278523ae43a39cd3637e0d86dd83b5f2e99ff3d1757f02e60e1a004573f6ca31a039a029e080424209640cdc9c15c00724b6a1118cc321b374497f726ee269ceca10eee2755340480a010f90abdacf1fb54980b600c465e6c0b5cc4180a2ab98be75a292cf4359b5485aac83b01b71609fae57b861d47a8a59ecc380d4e7acbbd433a4be0a4169d04330b2234865116b3dab9f85468e2e885a8a93b1655ff8a93dd5eeff35b112b06da25428283bdfde087f54a2d427833c1649c4d65f4284caafccff70aad78bc70b6af8d7606ee5705781eb99781886c20a905278519325870d07340b9dc7b5a79142785fc8c0d55254703fd73a2e025366ab6805f126014e0a99bc2517aa5992c52785a9c24dd5aa4086c1956d21440dbbcf4e1040e48f0d73e2012beef0aff19ea58e550ff6f6e4d43070699020d919e0b5d39c46838802ab0ff75ee35ea9d8ef85b42c952c89e6b0de6bed21bccb8adc811254682a01bf5e611742e3b58b1c002f27cdca7fbd9e03a76bc13f8c438d12700b38c09a05aa3c751fd7f928d5840af4c66f9b00a8828a1eca2e93093030ca0e2e1998b16eb7d10aac19ce91ae673d33e21299639fa81f101a1a32e58b0ca0ed109a95820be89e1d439844f965a4141711a9d4a5111d87de62c52d24803651b81d4c823f06594dc3ec04b0ff6b5a7f2230f1e0bc1b0e27134cdfe0a620651f49c4a2a35241d8ab46a901e57408266f7f4a0a57c7c3a1940e74934d18235b15b1a90619965ba4a81b87dd0df84f73d704acb80ac6c1300456887d2a2d6bdabe5d82e944338c980b6beffac5fa03517d063da8667d517074b160a22eac55c97d049cc2e74e0c8793de914d40589a6fcd1809ae876219e29c4540d93a990ff31520ec76f59d872a02f1437111fee64fa8676e5cc125bac59729af6df44c1a7fa6cda471c57f26cd17b12b16bcea983511f1a82dde2112410286f03e7874fb96ae093d9b3527ceba85ede7435981dd869fd074399f12a27b400572bffc84ea2f1ad2fee512f8e421433f8acc0b9ba87f820191347613c3db44bd0f40287cc196d1043ec2d936662b7e04d46950eabaa0fd1e0a5f989fc73fbcc6de8c4900731f11b6653e14330eddfaae8c4fb85ddaf8d6b532df1b1aa14207477b81027bbda10a16358be84504010957d3bfd3ec49f0519c1aaef4cc10a4276742bdfd0211c383d1a013be0ed0374c30419e2670a11f23dc44d4de40886ab47625a25ae8be69d22b8e52a158f204277097ee95a87ddb2256e448016c34fd9f204504d1b15ba82e896285bc6215aba7d53d3a04e0386c0621a60b830ee69a79ca5ca882fde3a7fde557c1b369e25155038a0dc2e7fb482404e6c045fc7ac137cbbcc51b0e89ef98fdfdc635f9d47a2649f2c56939f37fcd4a05e3390bc3b2256b0478845a95b3a42628b823231192cc48f1a400927192b2f29aa40a0bcb3523c797bd5b868bfe31190ee3a8f628a8c3fb410229d00910b5cc5b745a9b5d108384a9ae9e7114c5e3d2b3ee91792e78e0c55fee246d51513c7a35389692faf5e96aba2a6afcdbd820869267bd0f2b97b5a5a74951e122b969f16a2164fc07d4ab3be92de04d6e9f04f82ca2a13aad0995a985692be088bed9a62a69031204dd0cec4dc2429508777bae57cdc4a906ff4f223970ec1603aeee982b156fdaf9c57c395fe5c05dd38fac1c04b7e8e8fe6816d0a16a55fad53e97504166099abc5c188f40abeec5dfff9a4edceed7475330941aae58da83b55282a955c09110eeb527d0a8dfaa85b42354e11127fc70d1f65ff7fdacf780341e6adeb892000b31a0578415607b5d444712ada0f5882b07a09ab865b938989cd2d48ba4f51a988629dfc810ea4039d87a6fe22529ad33da97423a8848cdf17fba5ede2ff509c0bde574120d8d18056ebaeec101ba5449f76b99e4bc706ef9ab107dab1f3c66dd67b8dee91a8720a6f797e90f0296bd28d06c80b597d13d38b93dfe4f54e0caa5e50fb573672db669ed99b99a3a805107fe9d8da689c8dd395f6026b095528baed1dcfb8dd57a38e989de5635e574f69bcbe2e35a0bbfe9e85da6cda443f85634500dbf68d1bccf205483191295881f0fd86f9872d0d573fa35914692ef8bb91a7715c0616642dd8f510edebc5cb7189f902eacb6aa675cab536653a16b43508c36de6ebc30eaead1a932199eb09121af05d0fe3a56a61ef50647ae6eb0ae0b280651a0f4421cc3c5a86cd2c47d5a4c4e23b489edac086890b7163ea0abaaf4046f6db0a5fa3baa8d5d5192cbe2d11440c7de1262e695081d61f90a25959bc5b1dfaa842f456b2c8ab00c6723847723eba7bfceacdaad6570f255dcb702a9fe1a73e736a8952f01a7448862dbaeece0f5c14722d735df1d6752bab4b7e27ba7cbb96f535bff8dd3dde668b7f5433c724017a4ebb1f8d30df6bb69fca282ce16a2dae0c75f544c8a534d8f4edb6aa6ec73da118c1379218ab7cf1ff674e3c0ec982aeaf4a7b4d9bb9162cf991eff22b87b0562687c1cf259be243b89dcffc10106c061194d32f9dc6dcb16632de68af67f436108bbabd09a185120cc1bbaefcb39ee81ff273dfd109af529734958d8e749e474f2151b3c9b4331e83468f8767fa3299e53eceefc08855992f7e8d7ccc137a921fad062bac93e9d490d53434d2c80919e0d46d4922d98d4d43a983929868b42f989322635e91ee4af63b56076cd562962eeeedbacc724a85aefed00f5a96d371660b820737c0ba81ea47c6e7054e9662cbb535271861fa4b89e36a2f37cee85150233a3068c15554652ee508e9be790fae0a145e369722ce3518d15843a872d8bf70af561097d4584fb43fc738e638ea739e2beae1ae8b5f2ae4495548d5be91a25265fd8797ce71de64169dfec305f10e9d8a61cf4af2680060c08747a88cd5af4309ee6f48aca5095cf0ff6ad3d9a47dddb1323d22abb631bfd4b56e71a0e58d4ea54da6fdc7f18409b1f89b6569eeed6ad6235e1a261001c53f0f499780aad446b838bf2f3a8735eac4b7b4d4831019e844c5eb2f820d64b40bdda1b260242b5097a1b1dd24fed4e3afd1551a0636c7a5994557e70446a9238189bc49a51118c2e3649b332c00c667a0fd37f473b212d36d1efc5665f9738cc8fd7caf668e8584473cc12649e5635e243bc2ba10687975689b8f0a3aadf884112636bd7e0c08164a29e083f3eaa82c6052314f21dc4ed478940238a68860c3bb7d8bb1ce1ba64b80bb29d3167abb9b54699673ba7b06176cbcd9d0409c61a94f4e05f6be802ca12e5cd2b211037e558059d604584b0e9bb617421ac0b9015fc4b7070c736ca9e9e605ba0d5718793f08f48ac1077a527127492c18655b4574f6da0483daffd13ba60aef2804728bdfd5e670b589a92cb9aaa0af43b89ae31b5ad0354a5514de1333ecfdd147ed44158debb74fc4235f2e9506feed30fd4eb1f08a9d044e33360384288bd33358f9500a4a321956c1000ee2b86e68dfbba3c665acd8e19846f19ec395f85bca3026b7719b0d0216a63afc28f0a30099d4af6c144c81b86fb9d86af8ae78eda80e8243d3f1737bab5fab7bb486d41f9099986f680f81b21dab3bb593433e55aac4f80981a05ce50d26a658274b8e5a4d91ee3218a708d222a818ffbff57c92c6e2ea1bc90c2e4170cae52cf4f56e005d2f180c31cff6aba82b8aedde10a0250b0c057e9718a9f40f9898547dce74b71bd658add4894a6f3739c767bd60aa6c1e9a133875afb507028298da51c71736ebf7909e64176dc8b12b624ab81673cd25569183ae6314f05add4eb600f0dd9c54ba7a938ef74010f6b85c650322170ec1e5305ad85831470c074798ad45cca5467fdc94ad5779e429fcef1ded22bf074c03714446eba887cc3131562b25ec9aaf702ef8b3927bd2834f30a36c51ca8f26f178fbd19946769eaeb3231bc82375c37a4375075cead79f98f59610ef61c145c336a00af24268d97a4b9c8f8bd6a2b32c3a318a7cd2b97eda63d08967f46eadf8a01cf007377ccb2fea64e3a16169926b26f6eada7f6df11507a751a8eec652d2a6323d4a1b422327ac05bd4c043873b792baa1e9347741d74329b90c3e08c0c14e19785db4035bb825179149c806f091edfc8bd56c7ae9388ed46ed8bf97a8dd3394203589756d81560b299fecfebc460b3f9cfb0c2da5151b353ba477c71d649b85803b664a501a20c4bb3a1380937f5df33cbb406c888c745300011fd54124d360c061b03e7fc6773ef92ab7dfa9384db4e99ce88af4f548013d80edb9b566776f8f55961ac72867da2400e64d1921230c5880da320a9d66043b19ca0f2c4e1b63d28c00f96cc7433b80bd1b4084a0ebdf1e18e60e03848ee087645485fa09cdfc4b7cd710a19442a8f8e5f31f5137f65dee085818b8c42a871b4782a128cbc0aa05d5c386974d159b0fc27da46dd114dedcabf5086bc3c4c74a8b1752790e6dd7c0ca33ddd5fff098a53828f04174adbf880d5ea7a9a1aacd38ab0a7d0fb6ffa0f625a4a760c4ffac7f0514327e7ce876b567fc9838c30516ffbe771df08fa43ddc3f51a90beb1f57c0c6d6ebc0638cdf8b6c32828c2f057f6bb21b630d337719aa97e3653da552a505997e866816eca23a420811d13710cb064ffcc6d5f80afbc540d122d7cae1c27d06f470ba67666569029714e1e162f24209bd0fca6d4b87b738d38225e3fe2bc27cc54032e9aa93aaadcabef3d0946f113aa10eb392e60afcf748cb8051d230e7c15f3cb13e69df753cd49490b2847f8d2f05833f613e8e9b4343d7f1f229ab8c3f29bf399ab8d0c140f7ded5e838452c80df413990ff93bc868fc5b55ad48f0086bd9806e18910aa17eb2a4db6640d0686df67647a04eb10bf3891efab15e9ec674cefb4de9137d9fc4c32c942900bb19eb8da6dc4d43cffb44df4c123a41a0176e63f42033d574437ca21f05254ebf4e1fbde8a780093fc1bdfb44cf8afcb893d2a79df92c9f45cf9fc839d283366c8944143ed18b98bd15f7bcad992374434d5a51102df4109a49e7674820e089beb3d687accca1c8108dde5b8adfe9be3aa5623e317e07664306e3e4df344978c91eb8e206862eb31e5bcf34bb0df524bb9d262f31e0da023c6520461aa952ff94fe03a97a443f3e306bcc8ba8e945ad98e0dd2e35915b1f61a22a03360e4b57871126543447e20619f336cb346cba6718780c8a4a09fb87b296be77500f795ce03087011a1a7effbc5042ad1948e3f55c26e3ab077b7e7c9d9c505a0524883ef3e1be434d39dd540bb70aafb1a4b54cd251186d907ec4c36f3f2a00644778a7aac451d329998e2ee8d81706294d3c1c859acabd28143c6acfaae7ca13ed01861c35fd5f6e5a10d70df0c96353bd0fd0b5fb0953b74a62509193bd8cad15d362b3fe16d03fc397c213d50593724f0716dbcf6c1caed5614fad5ed3ad4ef59e52baa9497e0721b2a388709e83fe3062602c4f8e9baa60a94f12203fe5ed09496533c5b224029f502f140956ac952cc7ba40dccb9edc5c0f400e9145eaca21d626d9290eac36672d714a195122fdae726445db03c04185647cf67803f63f29c91e7cad63498f62125e596661f8301514b94aaa2aa48381f73f1d8cf2939ae238a58389b9e1518e93c8c6beed86775bf0d2c56f6fa4cbd1bb8f8ee6335f357bc6291f32f5f8b2df44ed38f63b01da54a37d062e9885e7ddebb0f481fc67f27d292376416d4c4699c69fe67fba1b1c787d17fdd1691a9edcf4097093a0ddf2c20a810178e3cc5dcddbf75cf19b40d9e6d173acf511868ba0d6137aef16bd2003fdab021037cc99f10ea00c16e7a8135e627af68e95c89abdb42d54151fa8b4d55e95d990514d898a18487ffc076d42099d84f3d9c4b56313ed64b046a09ccc9d1d87e3b725dcb583dd62cf22f01c6244304db65dab2571cb67f681a253c4424db602f719be7acb5b79bd7d0521d86fd8d2123ad1cf29be3b331b920b1227eeb4c45462a72801abc4b4259b609646125f8df9bc12c9474d9c850683a211237bedbf65d1447e98a10aee1e512caddd9f991f84712c64520a9774704068db976f6913fa7af71692f5cb40f9eb920849f8f40b914434985ace87a87e8fdf3d6099089a65296415d35472e59048962d1e4d7fa71a124b589513e29cab28f37ee8b074be564cc320814f5125ba75d847ed1a60f9f6f684ea53a306bc378dafc6ae9a2b6865d3ed478c45b6413d55848e4dea932ff93f0c92a4d733b4cb869b443cd4803cfc60d49fa29007f1627b96caad3c459b1df115ada00969235d604f6d02f93416c235769a6ab15362ea72d1788eb1e16fa7f597e9527cc910929b93036621a8c1c556ae804e0549fd89250fd38bc0455a0cd5d5f8134191a37df5973ced0658365110275151dc2056725cb98d8b1b7cc1977986eb10ddda4619b30f66566ed47cc2775b6da24e510a2c935ec6476c2ba87a1564a4d11bd42f06568014a69e6fcd7f15424ec5a7f45702fa7bf3906318c27716d2bab83e3f1f4d58d387986706a3c0e68d55012fbb62f44da2af2182c05266465df15a7b60ea962784dc9ae864bd62b1a82ac2097605ef2c9d50a7642a78455091a51c940a1fc638718bdcc7053f0c8b1578bfdb73394c4292cd11f66b12c6225cec86f28a1b03b20a4e4aa499efb977a4c45806cf5bda095839c2ebde1035ff8758abab0cb7ded5302109f1cb9d3632a53fd88aa720916fad3b83d2a3c44acfd15914fdff9b1e50fec5bc5b13e84971c9d7a97b10778140aee79e391851ef93d815d270cf62f53e3114f71f1de01b3fef02ae17e485085182d679cafa61e4ed6a55e77d780865f23de0475aa9502abd524d15b517cbfeaaa07e453f6ec057615f221e70bcef75e63e148bf20515c5437fb14e90e8264b95911423995904dd340fe22f1a5effeae9fc4aed2a2c3af0d187f93c9d88ca9600029506c5dfe65ea49617eca06f9f32ad40d9db474c02c1d9a261d252b4804db3f25bbbf4e2dfc0f59a67c432b9a0ef666d21d66f3d63c01e2f948bf5b41165fb7628d35fa3686278a693b322cc520d260716b90e4b0946298ecee138d2086d05d6067e71c8cfb396215ff3897542d62af1bb47f52449a93ac2ab6ddf918026702711d3e65cec1819486ed8a307e937dba7ed370870ad41fe87ca8cce8bf957a254535e7828a2d5f6e5f550904e361cc9cb3544333d15b706dda5e687fa3f4b67c56394f8020021f625076205e7ae74b198bbe484e1b341875a6686e4a4206b8aa7297d5e69368dcd5dcb710c56e4e93c3e10bc2050621b527b35e9ed5c3bf25b75b37a34e9f95e6339429fc430c0a342152caa75ee04162b8d6f0833a0cc53366dba60fe218ae299ef28b7f304b8c007e581abf58ec1bfa9ae7b692556c6effde247a209f61eb706134cd86082a317664b97d8d3f5e315ea4d90f7b2c7115f35bea02c829b326384d500f773509e6bacd037c6c52bc2211a26b34c8dbcd68279d2660f1f164dee0770090675e76147e39eda3bf0564639c42c01f0b8b1c55f007746fde94acf5b6094164e8f66fef42bdd0a18b110007dd6bc2ab3ffa8936f7db0d71abef105cd1cebfca4a748e48b3a13b534df1d6fc185fd70615060b1a801ee11045e20f59b41df6a3adcb9b461d0d1ab7a228689c2965e1bcdd69bb5b7d922a0d392de3f1d16e22bee6990d3dffa79a029589b3e3118c832d5d454e20c5415f0db501f111e7c5d34c7fec4219e7c5473cf82038d2a2d941ce6e0731f000c28dfdc2b66358cbda11cfa51c702a68ed0428159a7860f3d217b648ecc5d80e2d55272044e20ed74a6dd946803ad464d929d8b90ebc985c6009d450579d051f2071268beec218d4b506d2f042c741977c3e697cf21e798df862f7701944247227959616774969b589d25fbba883d9bf07ae547f955254d292c9d162d74b1fb6149effc464b26bd5ad95f27299596d7072542f4b9aea989de00ca885c06d1188b4c2728ab4e92eca5848544b9dd691adee53b62a15e1adce09c898ccc25299d63597655ab54fa4add731b06538b817007b341e08255ca512c54fd4cdc38da76d092f80195c79e9a45df27695ad1b231b2145ece4747cddbffeca2b10395ee521a0234bbf65815541ff438819aec0aa306582e41e280c132c950506dd3080c86fce369d58050157b0f96a66ab5fd12cc464b4736da6c8533c94c5cebc317eefc80fbf075532f9ae9850481e2ce6a3bc35a418dc3e7d051d5d6dab984d04d402e7747bca353a327941edaf7e766bc00cb6480b0e62b786263ce3a519d54d4c05aaa180b1e137e9dc8bbbd87a65d0831f6461a4e8926fbc09fc4f6eae50e3230cd6c3e2d0da679893fe359e544ab7cbdb1caf979bad2c2d7d6bae6e00de32f90c142b8605f5e96ed49d2827d2bc3c8aa2166be1963e79436fdf6726c447b9e9f10925a56d55d58d792c67314b6551d480595724eecdb5140941e8658c5b90cb49ddbb01783d8133063c06727aefdf361891a8d191cfa17027f6601255a3f66fd5eb9513635d86c7aefb452001885231b251d00dab2b386d00cc8b63bb9225de2c6c4385c8357a7d115c0acc05288f4a3d14bf619794d7984f5372ebfe702ebf49029270b19b611fc2a9c8870d725aedb7170b1993ea2db81a5637c08bededeeb87fa30170016f299558b89ad8fa6363cfa4040f77b14a1801b09833ddb0646d8fac24db338d733d354b36a04b370a305194a1120ff0f9da0ad435968bb4bdc25c2641200641ac28a4e4005b106c2f2711df758db221e3ac9d229bb166a58158842b764f2e51181386cf903f241cfbeb58030eda24d1048096d789f0d20dcb0e6edaa7b598fa08f188bad86a07f4be68dc4e0b934ec5996acca69ca634fb03bf7e7ec689415db3cebdf6778f2419edb8531cc8a24d3e9779abbf9094dc317546494bf2c36d8a211808008fe1104a2739140d0519d42f053c62e939b7043ec1c95cb40cbf61a02881373968c799a23d92e58468409736f30668bcc11bd6c2d63ec0d860f681d1a1a48283507f48ac9eb5fef2d7d0c2df3a03241f10c8608e74978ce0adefd68c7529d1541206ed201623664168ba27dbd9bbc73520434b33302024518b7c136e5aa49497e09e12c038d1115183a24dc7027df1cc1b9f96a209412ba23310c7604597eafec99645c5cd5d5a118907b31143f2cb9f205af6550211a014895fee3fc3fa97df2b70388baa9484051f5b698d3dacbec9eeb3bdd2c4ecfbd29e82206d5dba0fdeb3ddc543b1dc245a215d9527c5362bcc1b882f8768e11463254dcc80d039e7f716bf6fdcf147ecda59ceed818ad14482f8941596dbd84360180643f0651cbb71621fe1eafdf8864f114f714d090586a07a71bd7218c578d4efe3a177d479c594c39531bd7c6ead7b4145de4f096fe202eecc5e9a45c50e62cd59499c0655d892a87de9d2b845efefc1bd3468ec6357fbc67f2befbc68ad6512b1e8991c2216566714754ed31335e8ddbe1a6013c708f224cbc1218709bd5025caff91209667b86481cdeced74848fc5e537db0a7e7022e93bf2af604318fa4aa02d4000e7d67ea41b33ea363c6e5d09389f880bbf08873c4f729d58df28d7b3513f21d8ec8b3139c9e2a8e48515fb98fab72074ac057e5da0adf71f16b26136df96430b27991438396c11762c4efcac53f1c9181f2da0ea4718b2d7d722e0b9fd87c13adfffa5a3dc804644f5c54631db4caad83e6e1bc574feb205e8c693d46e3831e30661c9fc6339e5eeea9d930b1a16a75443c7421b121adeef74fe0470fc52cdac928436ca1b85ad84d0a8828fb852ec819b3a35501e8c57b90decef7aca84b138a0b605ed0fcf89d2130fac8deae128f37bf47f1aa3818253921160934c526d0f304618aa79300f4d2d98c0fda77416b444e307c4f1d17dbad7108c02924bc6cf4b16c79c0cd96848af351d49d10d12f237bb332839402126c1dbb480c18fc1e3ae6358c1d14bcb028bbe99e75e33efc323205bd6eb1f17dc2996b86a6b1f53927da426af8823b4c25313e08d0796b1a01a9cc93af796eb3dc1c006f74532e066ff3414b257f1024c893f335b2f9053e883c80d9e7bd068a0e80b7c1cb6fb4810637fb24e6dd5ad826e5a49cce4319969b64628f0161d31eab11ee6a08b1a17495440943dec17bdc9b9ffa3d5252e8ac20f71f973a7342caf89e8902ddb594facc1a8e0315fc57429f3d9a9c15ea03ccaf8a07e54fb0a1d1435d4f3d72fda546150670b70268fe8623e78b80bff64a8e0434d8f2073d8cd7ca15a95ae70264bbb66eebe9bfc91f508f75dd40111d403fdb4031c9845a7e6c3c64a4dee1c2bce054f026da7cd2f3f21fd43724b4700142fdf3e6433bf5b0daf9b9f001e908b8d45f0f087233bcec0e1a9a1b46a27b200b7c43c958014380e2733515184790cf4682c473b03af671a2fd5d5d944296b69ada972d8d0159b64ac2cf8eff54a31f5ed2b22add56e5145d640512de36057badcee7619140060c147b76c9539151aded6cf6c65142da5964717cb59f74641f7775483f877eb6ecd64044f0ed538aaede3bf3cf7474b9033a6f4260283764913cb5b23d529fdffb201781c71481b2876238341934c32e2f90e597aab1f1fc9a7738f94344c150a82c9d51527bf9fbb898b4df6eb7b578f26ad595b76ad87583647e6958cd553cd214cac36322d7e256595f727de225481f10f200c3f2041512e430e60322eafa80c427defd6789f905925e610514a08ecd80a60ded9f1420b66f5a85c8582f68c14c451b8072b9f32122469a7e08af135ba33516a92c0cfd490e17b70ee003d6ff28c86f9e2bcebf4ca37571403f8c82ed27f20dd1044987cbaccdb5e60ff58d222aa199098fda7d5ac61fb510ca7d66eb19ac7a7ed9a06878818a15fdbef9a62afe2e0b7077f173a4f19a3454a213ad9070dbc6f07c040171f5fa1dbdc3f636e50131fd40eb09ffc4b663ca816f29c499e23ca9350749522b6ca308d8389b818dbb469877052ec98d53bc7b52e1b70bfd29565b27c71bda20061c2500f1979df2e15011ba595bffac36aaf168b9a5716e347f5f325f07f073cc4fae1c83bc88fdc1bf0f6e67a983e89c7aea43c2b53887ee88afc22d0544e11027126c3098076c7aa3628c02eb16f3ce17a608e603e0de3a0b11c035308685d710c61c93e0741b06ba5203f69b97e1fb4bb7ec87cf2143613b5ac6bff02e6cc2d8931eb9b555c647bb314d2333bed22ceabf8f59845b24ceec3bbd5a9a9f6299d4c3bca6789bccab305ce4049f50f675ab79d055d62e1da3516b203a0265056aabed84553fb30f47810bf546ea5c7f04d7aaec5e98ddac484087ebf2d0d7831994d0f664bc5a88f115d19b750eaabe38901e75f49c1ab65dc6b8e725cec59fa9a230b9df560f3182aef143eb38a03be2d04aba606dbbd6a5fd0503089dbce9c438f3d7e8a198002c4d469ef060ec241dd88d8ca3f873eb7c00a12c98498b8c2484015091c1d45b29845d2126f62688002e94c5d02771c4400460543388ec629b5ff2750c5fe3525c782577655c52d0866d2113377edd5089cc929fa224fce1363325d7e44d0ed5beae842d87e34c316d90ae97f169d081bd9745301a8a36ba0130304a4298b73e1a50e4fb155552601118b55fe4f85fe21b697a8e8d8a151e1d3aace19611d3542e1ce6725f12cb56ca69be6d6a3c3bddd9edc36ee92b9aa976003dcd0c299095c5a20d72b30861839f192de2e56659e967604d030f2484c6adf32e182d2e1504811fca3ccebac6953c83eae631df69bc1481f95b95280611335ebf7c919b4083a38a2d6dc386a0aa2b6661801d2668e680929ffadddf9798813d5dec9431dfc95b5e97bb46bfa15b49cbabe3c226610d86710820500c02c4ac56fa058f4c2bc1424619e5d67312dc136bc8c31ef9df21179b12395ef6ae06388e4a9d61532c7c91c8119c12625ab221f1d656b25ff2218808efaf0194cefcb5811427c4392cc07c594c6fe24e01b6c00f0a46543120e46eb3e07eb8bc50efe05dac61179a181f29ef07e9d5cf5296fe8533e26083c0ecbe486792386dd8dac286b042b973a7cb72d66450be04ddbbc6f6dbb99367a9032713b7781ea75bae9afefef37f1ecfed52f63fe59e1c53e848080397b64d43c08c4fd84ec75610a60cecf513531cada1b0ec8054bbb657eff69597eda88cf2dc68b86ecdd14822bc2c2ad210b764aac97d72bde4e413cea5208449dc6bf722566c33901b4cbe0e506246775d3f7dc4ebab8f38abffe7fa55662f3b9aaae8965145ac924ca3891514e0ca56d722c34ac47d00a3f6b630c428f777749d0489bf34dea1f21ec44247761b2a0b485debb38c4bd75ab10dd59cda6cea7767e74b94c65031a3106047cfc292e9f33c01658b245e9f12f63d5074871c8b8ad6173e383dd4851749dc4e75c13b031c577c2251141a6321916034a6014e91b36ccf610e043b87ac479f6f3d60a6dfe3fa962b13fc6544a39a15b11c5d2c5967b1edad2287ed30daaebc44dff8402cb4bc62ddc1eb86d234d7819ec6716904c6a9c008a86a6bc182e376baabebc8d03a9a9e38fa3699cd85e2f0faa42110f48661c72e4ffd7f9e3b5deec81f32f515b3e978133085ae0c7003d8c240405553814fffcab4b18717560fc5f206bcb5867447da42757d249f2f324bd9f3163283d36307e1d23518cd8923c85d15869b5e8537fe20961651038d7f8af2d9c68695504e301c2e9ba868d3d4588252ee6ecb7b01c3c92637367f1480f6f90c74035273bc880533dcb41d1f36a79cde306585dadfe27b4d0b127322b21169fb99e814841b962215a23c90fac1250b20ec4d990a6bf630072fdcbaad413c50d0bcc1eb2a9e99577d3ebb39868a38ff8ff0afdd0fde1dbd9c972ec61bf417e313ed448e1bd851f62ddece269a058fd2b83102254a72be60ae916f4b65660f828df3098c592a3a5099e95a9b0add6b6b8e5184244d1e27f1ac8e571b96f239d6911690b67d085d7f25f65c47da3d1d0508a21e8dadb98645e23abb5c1f417daf51a6da77753b1cfbf1302c09ad435b677d9a1841979e58969ff301ddc25800a41b949f715b24cd0c01136ad53ff1a630bdbee863243941e3fc7ad742d0c8b9ba14d4322e7d35541b4a5272223c9e98d6379cbae07c07b2feab6c4b32b15990fb950076919b370de1df2b99486b66f06f6b9dcf805ae7000ea8cddfcbe1e233e5dc9ef319d3f7da20dc1c93ab6dd3ac27dfef960c03170cef8000a06407b8488c7cb617ba00a7ecadbf7336646f750f50a9ae1dca8f2a38e779ab7565b25d61eaa9b8a2267a046b5cc1817aba85d4f1da008cd395c2bfd15bf719db5ac0589a31051984543df3db3fb2721237d75b7697014dc3832c216875be0642883ea80131580490dbb54f91e6df2d6c4caeca0400b60344c761e5295939fc48c3cca8e3a6c9b0408785f5e10a33d74abedfeaba9b3b6e103c42de5cf1c843c61b8fd86dadc6d2e89afd6db58b443579b7abf12299ccc498e514ea27b279656d960566256050eaed6093e62f70a9d20a383ad09c6210e20dfe09d2ce3c04a566dcf55f1ff3139ebe0a1f37afb6059c28c6d97dd3eb73cb9c2a440910d2a7b0892aa9bedcb268418e8af082a232df3d2d5a8b781bfc08a00cf523e65730a4d5e8e94344452c5316af888acb73619ffb483e281451bb905eaea6366d87eab844d9bfd567a9386828162491b1b28acc3868d2482c7cfe010897e56c1a4f2111502314820de957724c7343891e696c21dff807a97f6bf4f821139e2e5e835da18acbf80c137bdc8b4a748240f692b8f76a01544428f37a0284d8cc2bc95557a0c83f985273b225bf86788b7250597ee5f380310c840a56054c1bca933e9f40b354269508dce4cdcb8c32705969422202ca899153099b06c6f59d467db1dafb377c209548de2b11b5b03391219f6c6a4bab61ac38776d501d747623cf2cae5d870e055300ce4a6a351895c6352e13c8b8d3d66ffb0cfa0cbfdabeb467edc9d7ff45af8da3e8c7087bbd64a17c3f0e2751498c780211c314f363d728dabb26a9ad97d9ab2b9ff8e555339e9d082b22ee2d0709e363dec9eae602cb1d2653959a191af20b76d77ce5d04fdf15144504ca659fb1592058e138073e96804cfb0af21fc428b285a9c1eaa3dad8314c4e29cc51339fdbb5b1e3f454fdcbc5a205a53b4d5db8bc07c011c0fe1ecf6a5837c211455fb955650443ab35c6212458d8c07f3722826fbbdb56766f99929401ad0b700b760a3335db935b14dc949f1c11d9bfe5a4ce101f3d6108ea9813061d0c31ac9bd4d993e43ef8325036d40e3458502e1a20140a8542a15034345a4aa5d28f8f6832d9bc894cc0dde1c176d9395f3cb562f98479e26dcc560c862018768dfa8913062e4de6981306dd07039d574b57b2ceb2f913ad282d5c6b4aeba755a5956b01390bd52a22fbb7a0b488f8b762bdbaefae7aa9dd98b5e6dc2f914aaeda7ab9675a2a954aa512901289a4e5a596fd5f6a2fb697db0bee4bf1226abca6e984f9624d9fd40b9297d90b1bc3d99c75de9c658373d6891db058215c9608506dc13caba65272a4c8102056081f3b4b448b8de1b2bf8de19c85e29a378f2b7130c15104470d870c8462050a152852a04081e2040a0dca9127baec3f83ce67d8f1b8785e343424cff82653c81664226d84997cd19631345a046bdec6ecd1f9d12927755e48942d5a6b49abd62bd39f387b92d8276b1af5d3283bd5541f7314f2027b89bdc84a2925931257d65e5e2f3b945b4a2d2596d24a49a5bc954e4659f61f65a39031d6ac9bb765cca34030e6f479fd0e0a7b627c8d3f6c4efff10596a0eb9a3e27505fd0e8129d8847449b381377a216118b6845a4224a11a1883551893fe8025f20ec0bfa763530e8f235c1b7a68fcd579d170c41cdea49029e3cd82e3b27de1f061d688e8d9e3057bc8df97f32efb33055a4cc16cd534d48b375eb165903469e395bb56f48997eb84f099f940ff74d197db9efca0724dae8bcb287728c872b537bfb6a9fedbb795b3c2bdececb7db4efc857e41bf201f97c7c3b783a0f0bd6f9c15fc787bde9bc747ee8c07484e8c47488e8c89c55f32fff279a34b199676b49f3c49c2d9a27a54c2d6d15f3fe76498b27c69a14f6a6c63c614e017a80ee013b08b81ea0e401431e407b408c0a10152b54a8509142050a152754985099512952a700657f1d403a743a760b70a958319e4c9f9a9ab345f354cdd6c2353aa5519fd479226b84b9758b95693de2a643870e1d3aaef4aa9ca2438702742860ca942953a64c9932450947dcb2bf0d36d8c0623c61a2f81bb2462a9f5e9c194fa40d9b1c6386594c892dc693e973f3d76cd15a4b1af5b7315bb6d6ad4563b6aab472ad5aebe705e50c379f0137c3cf0cb9da0abdff0c5766009a214baf44ef4f96c8fe3358a933c4f79fc14765d55a002d9555eb0caf2f80aeb6609e6553314195fc9153917248f6af4f8064776527624b48005bf62780cd5937ef4f801b0170ce5af1fe04f8115d8c36e68a67619a7fc244f1221aaa78815fa078017ede8beb289a17fd62e6c5c9f4c2be78f1e245455522ef59dcfcc9f4f937993e2bce93a7ee974c9ff3ade9a3e27cfdcecd99c28379eabe799264ccb630eec7a080316fade2dc7f312faee2dcb731bd13a627f3d4fdd2f490347a7f647a34d2f46a5e9346efd7981ecaf46e9eba2f7a37c8f7bd2315c6fd90e9cd2a0e9a5e26f94af1ec10a31ea7c680108c00cd15ef8d624423f975e67b45f352c2a021d1e66b0ac8c305c93941783f727dcf475de5c464bee620e1b9b6dcb4d8b0d4ace4d0a8b072669e72b44b4d39aaca35eaa88abac2bc7953c5af702cc4c2c0b146711015c532c74ad49463a046311560c040d1ffd32967a6235d1686585b3923b36655aeb5657bc81ef265bbc16a04921a90d0be96d520abc108e8693542480d426a8835cbfcd4357d522f9a34fca0e145832b07971cbb46837459802a4e0ec5dfac307b587c0f78077d15e6ebb4839e2bbe07d58ef9680e2c15461057720e2b545861a22993070801e00e0b1994691d028dc8109e64ff1d9aefd4766c9e47f2e4206152a6395800bb37cd5f61feab3053bc889a3de8f93da87654fc8a8fa1490cb6188888e126830f32b86480c91004fcb04c86d8ceac94a21e852a007f1526cf146a8e95aae31f024904783be8c993ab39fe5f0cca3467164393186c3110515735fca085cf189a64ff186ece427732f85059aa29c8e072962a2703ac5739311982d4554e1031dc6062b8c570fb62b8c5709321b633b333543f3b486aa89566218e2d361126b4b32d5a0cb48a9333eb95f72d5bebd6a2b5300e8542231d20e8d87488d00182ce6de5c3cab582ad82ac622d243a361d22746e2b1f56ae156c1544e7a673d3b9e9dc746e3ab755ac85a4854405908aa0ecaf024885ae575e5869f4e7738aa32896e7ccdff3b5f0bbf7c26bc1749942306be6cd2cc2540a31cac4a9b872fadd7bc1749942306be6cd2cc274a6304aa6cb74b95c28d365e2545c39a9b8423295420c9e3397e6442e2783c5fc5de5892cd9ff44ee8433295ffc17c5720493947fcd1caef8303b484e245329c4604895cb02742557717258a9475822fb9f643092c90998331361cad08d4199d2e05439d59566999fd254c9fe34389a9f5e792f8ae348daf032cd3773ef577ea5a13173a0b931494954126989949444761250c9a7242bd14a3b20994ae189528d264acdcf0a330749a73c2767f6cd9048a452a954229d290cd289930454aad144a94245e66b4e9a2838186819ca887e62a0c963a5c2b852c2a0219367d72897465daf14cdc9e363fe8ce973fe274499be70bd70c18001c55eb098ec8738ce3c49f2d03c49dab89934cd172e2ce4aa723932c889d550abe107a65288c12f67d6a510839fd931e8cec5aee2782d82ac46ac060bb3c6ab464fd77035ea8fc2983c413c59788078ae346a65894b9e3c4294698e598b510b3f4dcdb27f2ae62c14ef9f9239cbc61fe68abd3c056b92fdba5c59f59313cb0902e7ccd02ee84e95532d018a30a1af869a8511050a56e5ccd02eaa25c09c99983383c9998572665fceac73665e0d357f7284c19170de93f1e3604633c7ace2c42a8ee738526539c7909a034815927f8e9072c332273526b4d9dbacd0edb8f07ca14bf64fc913647f514c11b02c4518c9fe34c09c86180db25e8dd0dd17f2bc4bfa375fbf73f32ab0103b83ac42e6c8254820918f4826a289761062508441896a30512c8cd38b9e17ae469950f2e478aef000f5caab6267903f1646ae57aa9f46c925ea4ae504d397aa647f12c8a7b272645065ceca89798a26da4178a630f099a22f9ee9098604429d2490a896a34a8e9f1c533a07aee2dc60a2d8193b48c81f3b238794aa724294fcd3ab1c502aea4ffe09264a3e8212b2bfe9fcc9e1c2b1ab383278392bc70e3505850b8e2d15b5c1c8a92a17aa723807aa7245b2bfa8ca0dc9fe30aa1ce6c95da938fe3b48ec0c9e285418fe3c53388780642c3fcd99e528fecae589eea2e09a65faa4f0c10a1f9b5761dee058af6aa8351a445dd5f0838aca9c85ee3ca54465a9a6a0cae5c41ac554a8ab9c2060a0e9bf7c7a2ab14cc6cc41baec0cd58f8551c30faa647fcf41c595435671fc63cc1caf8ae38fee9c95a3484d4d219673ceca01a4a68238c28f9c58af72f8a8a89f290c28d99d3c93ecff72a62725d9bf3cd3f20847b2ef321172aefc260f90c9a36b9ea08ae3affab13378b4506154227021fb5fd54f76d1990356718e28d39c9919635671fc5798d5c625e34f739664ff9c99b3fefd7368a4ed09e985081159b3cc5761f25ce9943f0cc9f39d3c392f09654ac260a490164d37668a176768c615a6f92acc33c58fa64d7ef3ba5c3ba8c993134d9e2c8df2e87876640d183974f2001129537246845cf62791b43f39eb95573649c925d95f34d578976a4832353135b6c6ce60b07e9ea946647fc7e73f4568a67ecbf74f22199fa0692bce7db3344f5ef3d47d1bd36d9eba1fcd88b107aa2b8024644b02c6922be96b357d7d8f48af66bebe27eb95ccd7f78cacf8fa5e7d6f8957f36cdecd1b526788522f885cbd50d1aeef01a9abbb6bb4ff25f376886df15c5ab2f7aa2e0f565be3d7bfb9da02ab50a92b8fd6e80fa6e4fa574a5d79d53342f56cd55342fdcba4ae3c5cdf9f8bbbb6daaad516feeafdf42429bf87dfb179d4a72c323963f4670d8bafafa2ce407dad4169db849171b870f08071f93a91e4e9442ad56abd4235f10040b3f87e200e43a2ae443d69aec89ee99342e4834265536541a5537941b5cbf121c79503cb096222bdcc89fd3821853983426573966a8799ca56c446aa6c4054361f2a9b2a0b2a9dca0baa5d8e0f39ae9c2039b09c58ee47fd6834baa92297a68f797e0fd8c63cf5a0da5971ee763a2017b9dc5dda398328535c9a29b2599ec815b34690d896d89ae4fa126896c559caa013979e5cdfc276f4eafb2a3fe514a5ac4f0690eb8bbf39d59432cd6a59e35ca552a95c75f429167d5af65bbf3471242247174314b627369bcd6603130283c16027be1ada121a8d4643b97a5c2e976bc58e5c2e4753953259a552899e0bc9d1459a10cfd89ed86c36db0926040683c14ca1126d098d46a3bd88c9160683c1603698e776905e7362cdd55ce8304c8e2e923028637b62b3d96c31302130180c0693f39ce73ce739d7da6c369b0d0683c16030dc36d0c510bf805f697b62b3d96c239810180c0683e57e918e67753a9d4e776dd66613436bc3d6666da0d57d2e8658f48548db139bcd669321f396c9aeceea7456a70bb2bacfca423de6d46b999c7adde3d5dda0abbbbaabbbbaabf32665e37a45ca75941b87fe9f4e7d5b167e8a5b86e6b465a1d3c3352af364463a3cd3719491a9a9b9b9799153af71cef2a674aabfcacf95dcbadc5e9335c8ec9d1e4ee6e1c8fcb94456014edab2d89fcf57ed97dd87467fa7dc6d501e712771a3a359773c13d71a3de2d1744910adae04c1c8bddbf200cb1d829f879108739e7b153181e5422f51adac3839f4a3531d7a35da211b230c07604d77c8c1d0ac69d4499ed00343100cc11004cdeaa0d7d62ba8038f746fbbdf5315a351cf964aca14bda647cba8b3306aade95d2b8346c551a25b424997bdf6b552482790d941cc959816c014e1850bf7de1a490ae904323b88b912d382ecdf3045c8fefdc285ecdf35ec8959f6924a9982d10f445944425425880ef4322ba9942918fd40944524c4f56a8c18bb8c34d18ac8023b44c863a411639791265a1159e07d2822b28741210d3013ac96b06f2122c2a0900698091f48e30358fbb0b40ddb1df601ac7d583088673e1864f78af0158076f6c1c02ba2060e4f5cfc09d9bf7e6749f6c345246dd4964d0d7b4d53ee916d4996247b4956715c96dd7ea9a40bed2988eb794ab277def3d2ee7bedd7fb407cbeab0a62bd49655c33cfb443e895dd2bea21973599a315d494ffc91cf95057231e56300262a482da2adf7ff463f4436d91ef3f4a416d89de7fe4a3b6c6f71fbd463e845ccebac1473d8c50505bf8fd47fe231e6a2be6fd4727a82d99f71fed505ba4f71fb9702e63fab4e43f82b50ca6f3f435345fa21e06f523f2fc40f981530e4f1fd4cc27e171ca31a81bbe0fe1425242490829a1e2f8d798a15cebf89f4a26b35a01a432194573f6f03b3067e8092f674889f20c25313a43552a8ebfe80c35813c434e18cf109573267486985071c2338444c5717c86967086a6549c2f9fcc101235e56f32434ad49483f90b2951cb1ff70fe19c65bde2fc74e5fe10ce5923d7c835728d5cdfe75f83fe9d314a5c23578c7f3a72659f652be3227528c84947865e3ce7591fb93f7df1423b783e4238d1961d728f6e1ea31bdd9c15b39319dd72c7e870b99fc6fa7f4e63cc6beda988684bcc6e748bd19d649fbfaec70475aa63747e9e74570962bd496b727745fbfbca247b5feb8ff52118c83309040f81f141024949cfb4c9303fce32bd3cd56f8ae586f9c9fd9eabc77335eaf534ea9ddeab5194121fb39c9a5e303f2697a7bc1345fb4cecf25ede09e2609e0b344d3d9d6a932b09a5fdd4e4c26172588dcbab81f8d91b9a3d3c8cf0832f6293870df4aa45c6f57e9ff77ddfd7f7fa4589dc4433585bc7c35eaf0885e34ec0ebe1dd3910abd72fa1acaa72d64896666d850e6251fcc0107bdebd9e77ef773d917f0f7847fc90d9f392b1237e0f7827f4327cb4a368e217de195f347b7a90b13396a57b1545fe75a5f2d15479ca8a2b15ab2cb3e8e2153df173f7333dc3f2fb6ac85651749f46f7677ea2d993e47bf14b96f5d952e5a9067f7c5134eb8ef8651cfa1e543be293efd5aa6ad549c36c5f1c6501a4e4bdb7efbdf7da2a8a4653954f67b632f933af180a4db3e2bc68624f9539246d88f93b5333dbc7b65116c3119336445395ad0d315f317b665a6dd98ef9c3e04b8847be16a838dc6510c4d0ec4982bfb7a6e89962bee6f5da5daf280501aea18c4d7b6dcd7abd5714e63187e6a953f79479b03b08e5c94d9c1c327b925cd19d6407408691ebf798077c7c33806600cd16f8de7bd1c3f7726c1497a17971e4644c86a09ba159368abf923872726d14a7fedfa7e1f9d9ef1cbdd0acf7c3b13cd57c211377aaff4a29f12742e1f8b2f79dbd336d40be27763395cbcfc8a9a659de575baefa14cbf64bcb03daab309b4e5f4d1895454df5a3eaea1b0600705eb868515be0f7a76a0b7ff7b3a82d1537294ef36d0c698cd2a7abdcaf6a194adf2f7a5e2e914c342cce39c46048149163d924991830dbff30cc8b69fd666bb3e8f4e4e9473174faf003e5074ef93b7d4e27a9ea785f324befacd7fcb2c9ec4952424bde2cdbb72fd3588a1d22e79164621e55c5e8150d4a7efd196e38abe6ebdf20de983d494e2faa3269c4889d99a56761a6a8a9317b92582228b73154101f2cd012e4c5025d105b10264194043912a448902141800471b1600b10b66c73d6cdcd598f73d60a2bc47dd46016881d54800508970a8080a801a10488234014016208104080f0a1829d0ab4f8a8f9a8f9b0f9b8f9c0390bc5c53f5ed6b43e68b78bebb5e565e5b57be57cd07c1cf151c4c7101f407cf8f0b1c34bf7c2d243eba1f5d47a6c3db72eb6ecdfc3d5e3d503d623d683480f590f233d663d90f4a0f5a8750922fbf718e285b6c7bab6ec4cb0f3826e267062822326b09960d6c4ae092d4d6069c24a13549a90d20494266a4d28d9b2cbfe22d88dc03582d708605a78657f1e371e381e3f3c723caef000e29185878e47108f9d075c414b647f1e56be5009427005db8e87ed6302c6c34707b4f078754017640b6212a424e8485091a0214140825c59d872055bf6d7804d03370de034f0c3042c8da5b27496224969e992b49636496de98d891b64fff4489d21eac874668dea20d1a1e9d4749a34caa3d10d44e1a543d359d2ac56954eb9b35ab4181897e5e9f5e0ad4afc54404a0598540057811a13afac6262072c5bb068c182058b152c54b0dcb03889c22bfb4f6002139880ecea72b1ec8fc30f0e391c8070d0e11084c30e072e3b5c3b7a76bc76c09c8552220bd91f072d18932648638ade9a3e3a3fba270989e2c104ae9df35366e87bc4f2674cd43d6fa83947aff3027f854f0ae03004871d7088e1e05202a70414259c28c14409254a1c51a2881230257c34e127fb43e007023908008d3f8d56c9016569e9ccd6aea5a4b5838ae31fdeb345ab38de84170420f07208c09cf51040717f3bd9b2d726d4b27f6dc22b248a31efdb983d4924d0a8bf582dd9a21404f99e3b4ed81890176c89c15eb0b3b15bcc498c494c49ec48ac486c48ec15dbc106b9e59bb36e70cefa1f1b24e72c142569830d2fa22368341b968c463136c86c3062832c020ea84788fd8cea117ed810ab814a0d4e6af8a9c17604ec081f47ec60c41623b41881c5082b46e08c8092239643966396e3072ca63c822b872b478fcccb45a24c2b94201c386060489ed1c390366e8e1953187427cc9bb731577cca7cd46cc15a445a3223ad98ce6b072d257586f8b5152a474d7a25ea1539d6b46860d8b9abf5ead58c8e1b8086b80d811be267081f45b40cf12aa2bb4043301942c91047862832c49021800ce12ab24508217e9c8522264666c6003754ae5b0b9d8e2b8693184762d862cc62ec6268898125869518546248890125462d8612952bfbab5caa970ae66296fd5be85aec5cb85cf4b878b9f8e102e642888b980b990b1eb2bf8b1dea0cf1656c8479043df22d08921e098a31267e9dd888497386f1a40182ffd302a8c59116405acc5ac05ae45a506921a50594164e5a3069a1a485acc51015402a76262cfbff4fee813ecbeb3ea857a2e7d2abd17c3d15b2ff63a9334412a9345a5d99c3cda9ceeb544f6e4dd164227960d9da544748769d1ff69a3ea8b73175603ab1d641e9bcdc93d22bcb6a2d69d1ecd9a2a16e7f7bdcfb40a1e55f28746f7b26afe48f7c911ff240de85620b0a8542954a27be640382ef05953127104459983004b58ebf8d09c3aed13f61f6b45cad039e745e2d201f9b55675a9e38d313cc999efe46738267aa6a4cf2f8832b08491ecf7d7556b030aecc7f248f57d36974befccbcbcbcbcba7a57bcd53fd280c0c3d8ae650c8f33c2f4173f49e19e3e608f49aab50f4ff742acbc6358ccbf274fa475195ca7bd133cdff47418a3fbf491402ccffd7619ed5533a529cf73cefcb53d6fa3769c3eb5b3a69e3ba87ef47dea8d93b5f84286f267de93dd2c647da00c1f3d62a8e8b03a3afa6eb30c6188f4cae73dd9de95428fa5f869e90b22ccb2f3ffdf25334558d30c61863fce2c8f3de7bd1fbd17b18efc9d00391284d9f7a42542a148539d3ffd3293c63ce66dd9817afea057ae339cf11c97942c23c42a23c7dea09f97ec6ac5974cb92fb63f08b5972dd4b4eefec3afe710c1493451704726957f78017e8fbae6e1cc7514646c665bef6fbbf59c73157af6dad7bd3be3cf572a636bfc438c801ef9a9df1fd7dcff3c2d0bf33cddef996d6b5be9e79bff6b8bd82f9fa36fcaec5c4841ff34df2c49cb56c9df97f1f7f6dd6f9a9ad896325fded08fa282de0bd47dae0652ba457b05ebd25d2abebd9f27df90fef7ea892d7634c1bc4dc3eb0306c064f4bf3174fd37b1c66dde5ae46bdbfe729f4b5432f5a1201dee8ba5e85b913d03bf625fe35f1bf6977bcf1342f924edd5af594b31c63dd49848232bdb31ce2fbd875ae2befac51efaf775ea00f6f6e8671598efece90d4669ef781e0477e7a75fffdd7e52cf3bb7cf19af7ffdef7fe34bf7b5ea0afb946fbb119e68f09a5e8d39bcbfd34fcdfec9dd24c4f39751d2df7943b4bc79dbe4b6a4d6cbdba4fa258dce79d9da57d6067d41c82e6bd8efdebdb7f93c4276e94e4b1b5f3d83580282fca7bf37bece07ff375fc9b67099278f8f44e1dffe69b6709feac5ccac715c75fa6d12eaf509e6aae50a62f811b7ae57e5e2f02afa2d1ab5bf3576d5a8614945aca14dbfab88ab6d4951705df878f02f0f1eb90c47b1dbe0f5f07f0f1f7f7e1ebf83e3c75808fcfeaa91e1bfdba50deefeb7d5b20a63c6adbccb447b63674b6998e998788b105c1fe3ef7bc7bafe7fe3538864cd087d266d1ecfb4de2c067ff7dcf664be2c06705f1d3f0f6818551bfcd8a731bcd95c4d66720fad7effbed33e03bebd9f6ac9efa1715942f2ae8958d01174e20cbfe9688770f0f76fcedb8c41051b27f0c3bc3667febfa9d6e6b0416eecfd88f5d38f97bf173c00dfd1d61f1efcb94e0f8f7ffa657a2bf677a01343be0336fe042a943a4e35ef386463b74920793a64c39fa94a7721447fc219207d71d2cf6874c9fd1db1f1ebf0d1f5b12c77d4c832adff3050a7adf7b3dbff7330368be240d03f0481920bef705aef5861aa9ec802e218cd0a8c5e8bc01778396520c89e0776fe805dc2b149e4dae28da67f2299b6e2993326882230e7c240ef17b2947591c4599cc22298ac66b8a591c892f231866f165bc2606b31833ca90c4d2681a2f8a864674cfafe278ef8920fb5b1d0f85056bf22963654029e05ea13c6f7bdfdbd9b7b5406ccb2b3ec52a3e2d6f7e858a9b333d65772b2382d6835289679950ce9ca52302762604cfce9a9ca90e5829820f9ea93542f366773603bfc78603402b8426ed45e927d7f6ece855d76a6db7fbbd9ef77d0e2baf3bc6221ba5d1fe8f09655a734f76b4077ea78df26447a3fda9ed796b04f4c5c9593b9e589bad67edf7c8f6bca146bf681455a3b3ff0d63a3ad6af4cbd8df6bae29b0a3e666cec23b5d6f97a7b646d8619fa82e20a322517adbcea39f96c684321ddb9e36ea0bdca8f51ee55f733a001b357b99ca181bb5e5901a051efce08008414879026ec759f62b6edf7195b3bebefdf254f14e7ba1e68f08655a77f9bfeedecf3486bd85fffd17e29c85d2f191a2cde1ce6ae8c14fe2a70ed17f6709be177d09c0d4d246f1472b73164ac788fcd1f7d8b18fcd1274aa539967a24c6f081a7d52c676dfe9e48bdf21e854bf8d555bbd752773c3cfb4240fc0c3e626d2a8b5fff25657de8f88f29ed645811b8e1f44791ffaba233a43cf00d1874e1d92e8003ff43a6006e870da98b3c6d3de074d6c7e432847274a87a87aea9ee4896200f8f8f1a9c3379e281da1173f74dad8896200fed0874e1dc2b4241df031203cededb4354fa119b4d16ee39b5877e8ea0e9d93281a6afebed0436b6badd87e5f114a7b366a23895c5ea2fcea7968f64c8f45aee40142f9eb81569eef4be24af63c89dc8fbb9f3f409d449624ae54f96932892ad5656111acd47552c4939cc3cd17d62bfcf7c507cdbf69f47e75377328650e98c095c3ee91d1462fac74acaa65ef5eb9efa0a7bab1ec9fe702ba65bfa37b9ec5ddf72bbbeeb56e77dd668ccfeabddbaedbf4c23ccf7b11c9e34581e5fb6248d4ffe2660ed82e199fdee3afe401b099e20cde9a9b5e79173cd5fc2ddf27f47fbf9e4d8b918128ba0fcaeedaa87a9fd5da7e9b3bb4654f0ba59fd232d7c78d760b6c740ecbf52ff9f52f1a43f4b450822fda192e366a6676b94bd0c7be8cd0add1993f95a00dc7cda128299e019ad1392b849b01c2b9137b8261ab3b323977999ccbe450641920219469e8f6fdf566600ddeb2cd95e409e1bc10ee1bf94026973b34b34c0e15c71749d35618a11fcd5407cfa1b7240ecf183c7bd81c9a81d556f8232a33404a5aceb41932a20254d2cc1c9e660edd42b7461b9f1d8a320394bb86996d62a11bd02d14a557a08ffd178d9e2a796ab4df2f1365db8c76346284c72cba7d7f9b492b6a2a6903b27f4d85f9be3dbfcff33cef13c550288a6ac5b965133ffcf0c30f3ffcf083678d781f123dd366d1c75012f03d33071cd756d423410edff7def779e0f75dcffbbeee5cef7e201836f87d9fbb83dfe721f87dd98322566725b95f1f27f9feda8a7aefd1681d169fb6a63c0fc47fdd3b53db8373beb487f5ebe0077e37c9073a7f9ebfe0e301f8ddfb2df96e57f41b41f6b720bef7c5bbdeade3581f6355ca9c9121738150e65e0feba065f7b4329d8bd7cc55e59565653c286d8bc4fb4308875bc60988c39bc31ff00f9ec31ff00fa004765c800240d88c00e900f0047fb0b0d0fde1db817d32071ef06f64ca0b5c3ccac450a9eea783d25e7f81a236df1f5b86d7ef84be7ad7b3fd70da8a63b39ff7074b13e5e09a61fda9b82cbaedafb8992c8bb76537d49695b9ac88d5ddbed9182c8ba0078b59d8e739078201f11c786bf6d2ae8972b75749be6e73561c48dbda894e8b95d9223748e9eb9d39d87cabebfe8df9f9947c4a483ddec49b78136fe24dbc8937f9681fad6c91334251ad386e719f6dd7ab929b9a0bee69ffe14288d41afb62dfcc655053fd26d35f50531ea4a20e6b54061e0317c28978100e031fe2b1da7a416d7d1fcddd05de0217e2419c05b555b65e683137e235c8fd2ef33eda47f33ccf33994ca6fba6eb71f99eef072a4486972b8b94296a93e9d0143c2d94d6137bf4b450564bda689151f070c036e1852e99c77d9bb1593a0da47c6bb400459adca40d34dfc677d6b6fa45f54de43d289753969ee28d8b91bb3aab779e6a5c9e7e95f62e8db1731619a553fd535c555e576059c82092cbec494e454712da85b890b72265eae944ecd5afc89f4697b26847cf3465d0f43cddccd35d5110b1de34f126de0466d3b9689e83ddbe1f9e11c9d14b0c8ad289a6e6068599025d81bac001c088ba3a018c3da559b5af7496a036d22c1592bc44d544f5441525d76f990d6ad60ecb25d73dfda38510c9f52dcbc260360acc4e81d92ab02b59ac9066599b256203269805cc92fdbba798350ba8cbe56e3f98b3aeecd3d686b66dfb6d41fb35a92ceb4d6e5b053ccf50df98d1eacad08b6de27caf78b1775fb77ab528f9892bbb68bb73b6daf221b55beb0f9ac2f014863361481386a830ac09c313616813865fc5096a540467a0088226380365f73b83af4e795727d03e1df822fffb5e7e7ccffbba94e1a74dfb9a28c31679a3c8f3c6d33e913951dee963fa9a634e9fd2e823475ff8fa7c483027ea3b6d9497b3360ada4246ce14832008865ea5ce5f8cc6af06b5d62e95653a6fb83edc15d4a0bc517192d0e2366902ca4023e04c342a5f60626448a0ac5761febe50d65c22dd6bf612d297ae017a492d37adde0c70a357b73f0cc3300cc3300c49a550087e18e31992a421491449d690e40992b421491424f924f9e119024ffce1100c41b7259e7e32056b60ec4a6ed19fd67503dcc1aee401cd5028d6eec753da0b65e9499f621cc8328927137701f55ed228307e8c4d8c4f8c53607c83b10a8c57606c9b64f041901482df18ffbda36bb60d8fccd404390c9935df0e89e67d300ccd7aaf2863c3f82946f26dc138f4f5a6f8be9bef53f17d2bbe8fc5f7a1df97fa3e706cf17db8e2f0f4f9ed520c82a78d9a9f7414548bc010fc36c3272f49921f68daa8a8f0b4ae46bf7338c0f829788ace2a8e46af89f2e7f4a6f7c7fe7887b984aeda12dffb4421a0f4a4337cf1472373343a47a314a3d1cd68a462345a311ab1188d9a28ddc9f376a3deb8505ad80f03f40a74107c31258a2d44d18528be10451c51048028c21045952886a2f145d50b9ed0f911518e674fa3193449334565804d1aad619cb3702c86bbecdbde57d42f9ae9e8d56c1b4dc12739dc2bcafd9efb1c63bdaa604dc666b33fdf0fca97eef9f1d393fbb95d5801b3a0e96dffed4299362cdbaf24d397cc938ed29fce12e820bde92c01fec1b8a675cc2833dea0127cf069ca6f0b65f8e1f9ba25f64f0b25e94b6f7ad3e99a48f70b2ad3329f666a73c9f6edaed11f08c9d5083e886501e46a042657f23fc695b657e30cc903fe2de5fec94269cfd267a5bcff2244197e3f69237cafb645698f7c9a3535a2587bd5b64ba4af5f3271ce53f6966d099a240fd8a4517feb0fde2bbd026a1bdab7ca5d422d4fce3291befbac3ff9fe54d6c959a7134fb9b97bbb5828c12a9456d62b9cec8f8d340b4f199164d7b2ba2593d44beed3e8fad39324f4d0f740fab0bb9b88ac75fcad4932f1cc538e4f77f5ea9edddda0ef74e5fdd477cea569a08966e7e265193ac330b4a57d72851287eb550ad6f2945e757a815306bfd1ecdff746fd116b6af0099227341e8003b64bfe4039c301efd225973f7af147f14fb992ef3df81db67971f9650aa4a75c36da3cd6bcc0698a1546b346648e28c2d50540f617eb4f76b1c10ebbc3b719ecf09e35276c50bc79a6b8babbbbbaabcb658b63eec6ea76a3d12a949566ebd513afad3157b269b42329c133c534ab2b8728fbb14d162d9945678171597ade9ef540512f19e55b6bf20d5116d9b9d18de61b59cab469beeb947f37695ad3dcda9ad6a76d49a7fc2f15ca7e19d0b9348a7e4c94a81a613e6bb0941f50e91169d67b466a0bbca0effa552f0315cfd1da7c97eb7b4c94e08b36678535b94d16d9f6541dce36dca1b5216b456b476b496b45d68eac2dadbd7dbd0a43e2487a648e2c411f7ec2c25362c4700ce370ece626a738860b4da1b4df397c23bdb2e70b50f6e3f68993bafa4a59accee2ba76f314ae6968e7b2bfad82516b53d6b6b0d685b52facc5b11600d6c2b0167716a02cddb430c49fe22a210e61fca1b0a71ffbeda6e89996aa106e504c71339b21a1f9f53e1087a19ba6f97b4bbc9ad7e47a1f88c39048c3e172381ca8c2d9749648a84c278532c53896ca53de2c199e72d0884c0638ab382e03e9c70f5dc9fe98452a9d780a064f8cfba2e0bb66d1b8aedab2fed6667b9b779230974e39ceff3bd32f7de8c4675a7e78a6780069d330ae69271c3695e5c9eeae942928cb8e63b72d0862100c4130048222088e204882a0e8da2e1bb532590ccf62315bcb6a8bc51812e105097509d90e208d011d40b6a9d1eaca6e31baf8aa0b173863ed9585a1a2b941e5cd37a8a419bd56f60dc0589d65612e97ab879dfa5fae2f63fc96006b19c500930ea87ed3cfbce9eb0e494709c500920e28d29f9ef475a774f6d8e933b5b66c366dc66c13458375e5dbacd20a85c3953f2b58f641a1ec6f1ac6b769afb252dad6f19f316db932c531dff52ed6be8bb5ef62edbbdba74499fa0e26d7d293ceae3903486f3a6fbeabad58b3ba9b746a4b8d8ccccd69d3527f42097e6a6d5acafb2d00ab2b77ea8badb15696e9ab35426599ce527904e9b448647f71c6e83151c6e4fa188771599e4eff345485711e1365d33c753d26cadb495c1ccb96457a92d9344ffd345aa5aced8428cdc25f13cad4fef8a894f724d5015c1a3754e800621065b01fbe256d541c02d4b06baf6418bf9ff23e48d6d85103f5213dc6e11f2653648cd66c9ab3c09a97415dc3a0699f541c22541c7fb0e62c5b049bf277cb046b840de77db5b646bb94a9d3faa7ab34cbf4feeddf356795de7537a8a83f397bd164de2e2b4ecb7c3a67a177d6efba10860f89205cafda47528bb5adf775ef7e1ef899fda20dfb7c9efef0edd7b6303441b65f73f866d8f9b60f2c0cfb65d3da07b8ae42f258fb6dda3743008220ae827f1af529b74facc3386bcf7ed24c3d8f670e3628ed5b46f3145b25d7ab3e6dd46cdf71965edd1313d1f50a654f1c6b54d6288ab9647f558f8c34fc91bd8465ef131bc9a190ecff2da14cf1a738e638cbb28f71f68217b412e855eab81b11d881719df2a675ca1f3ca794d6fec0f5aa2aa1bc6f47573ed14882bde1388689f4ea8a0408431a6198c370270c0b10863384214f8d108cf52accfe7dfacc4bdaa99c7d1e2b0ecd1f93b2fff6925ef5ce58fb6b0166180930d65e7dae4f929f94f2c60d322c6beb945b5c76b7b7ecf596258770d4552ba906a8ab5e52517f7c360d07d67ad5a04d2c00c63360cc83710d8c6d607c03631c18e7c0b83f14914a620d16a5075fce2a9da08c04ca5e0f9a6106419b4fe9455b5a2bda18efe7c09aef9c453a710cacf9d7206ba0f95acb23814671156bb10fe941b36bd671ec46038e56718e28538cd3615caf42e0b7eb556affbe839f5ea0fee4fb3bf3d351f974123081ce2cd9ffd3f5aa1d89ec958571152ba17a3b81a73f23cafe9ed2ab3eafe33e24e06a8b94fdf14f6d79f60f65b535664752a6a191ec2f8af7de0effa2bacf10367d4a6f4d1fd2dff02f95dfe9f40f9ab5fb436fdb864e1fd3d3686beace595ba559a5b3ec54a7bac63e78ba39d9b041f278f77e386491453bc652b93f87661c7316c959a4f386c7329afbf4217d68f60d77d2897f80b28b3d36ad694ec3b82825fed0f77f6fcd1c40f0ac11e632fc32c6f50afcd00c738aab34094f69d49b74e6f6afff8a376e90f68b281f65cf1a61c6b846611ae34a9289e30832a41c1f11ca0f4a794f64ff4cd3d0307eb7326dda9266dd685aafdcfd3f2394b8ec6f43d290ded0a8d790356e9b678a1b152b58a029172f7000004395231a0540003174562c1930b466940388410602d0b009b50c9010eb8dc74469ffeaced466d157d06bb2cbf4ed6b9e7eaf875fc92c76c6f7aebb9fc6c8de8b9b1332d983c9b856f0481bfcbdbf5974d893b9df992f7b3573b38cbd020a4392272479eed3701ce2cd598de24cb14da7a3a8844c7449452b19a201000000008315000028100a870483e168228671aef714800d76a85268509e49a31cc8739842c61885803106000000000080c401382a2002da1f5388ae64ba89ac390c5bcc9a5000eecc8e8a504c9d1d5c55a32cd239b8d4f247d3566dbbec5e23f78780f0f9404ec2b3950068e604bc993141deb302784c8e3be976bfee21c94b4dcfd0a951402be863ee48022a4dd6a771d7e7a32b303bae737d4de993944aa157f36be9e0968de5237b05b266fa0839dc7788ac1ff5028bbb1cc5ae97081c83bfda3aac3ee70cdafd1c0f3003f844fc348c01a33dcb55cf44751601f0aedb5a18a2d91a012b08ae1c580b2b84838b2cb976eb208b417e81ec975cd464ff407b309ff6f16341343d93b304be8bec59ff4231fba457fad203cf89214bb57e5bdafdd21b6495dc804b232a55eae703fc124721392333f695142352ad3971e5028b6df91b574633d50b447b6bdda7d477f5e0976f14ccead18811bb49c42a16debdeb54909dbb0aa202f62e2d9ebb99513830aa9f9f327be65f43a6a15ca9c68b5a2d8278a4e4c9482c07a45153014c7ea5a4a4ad7fd3a653b366fec44b7f262517f6a5a5dd7bc7628e32ea99b5b2ee753f9d22c6acfcc283e66499e82c9bea1f791e5468391261dca2e4c7f306a570dc3e961ca6cc73580a29e66262d7e84dcbab35a872e551b17753868097971b03f02939db70d84b5cc36e15f0d161390c1be1c4dae2003f03f4bebf025946fc30cdebf92b6ba6779ce07164e569285b82e9c13ba75b3abaf70f81e77cf1a297c303877dced71dede0b7355d05be27a27b20aef51eb46a731640431444248aebdefcb4c1306787b8c46e55b585eac5bbb51968855c43260ba79ade4d80b5682cb967eb9fe5ea8e15fd84a77d6d57f2814e01e5a3693e80c469dfa610aa6635dc9552019d2f178a92bb27e307b6c58f7f6416326691dc928811f599ef405ff2a43950836e9e75e495eec33a74338b904971edb41a902dc130362aa80ac806f0053c4ae19bc0eb922da43e8f0040f9a2e9835656c62ed8c607ced9340996ca1e86e9069ea69ba3d464fa85c97fb535b57259130c70195c4dd3bcaf52b862446e9f7a7db1fc12bdbd839e819098e4f3dad8765040e8a11f7861211135d71a96a39103e9c1fa2542f3ab202a4bb6c262d3876d2837fd01b9fee36c431075b2ff54ee3788ab640eda5dc60888b1f109ce13c047e88ab8d0fe1037bc603c55f95c9bf03c824cdb3ee63d9e5a9947ee6bb3891084a6946214f7e5b2d485cd2f362182f082e6ffed560462081c347f7c1cc1b1b8da914cf8c4ac2e7b75e7036fca27e21b6950630d36be8d5c5d9b6075096e2c27f3a8d78ada566742f36dc0273411857adc93eb2ade0f143afe2d13fbe8bcde5af412a58c814c81493a91be3c4549f38ce22d110a731bbc87ae0d98078299f859815d5ef6c877ad231b41966601e4b3cca5a0aa48691742881695eee9481c05cf8e76a79123d76099b9c8ae9256f017682c53ee1bba5f1b1b419bf02a74b6ba3952ab21da23dbbe06799855df7230e3fff8993e9057999e42a910dafbf1672efc079975ac2b1a83ad39fb8fd27a983dd1bdd6bee2ac8b1bb2dd7e9502c5fc0c02b27f9e0eb013cf9bd9e76e72d91c7f2428493a9b7d0272de6f3c89b3d760f1f28f0ad0b3d621ed389703005fb06431df0522222ffec44daf384687fd1bc0582e1eed78690451063a6c6eecd02b91395c34da64316951d788d8f51132a1801045ae0606f90d9e080cad44068281d5c5a95c305019e33dba7174e71831cdabf1eec8758397fb08c7c81bfe526001990581bc049446f95b021a1ba1ded237908eaeb714c39c320fdd65bde9946018c0594efc9218c36f5a54b08ddcc7f654a9d54acbbf611b680b5cc34d0b27b5dead1afda7546bc88e1882a27b705a6771e258717315b469296d7ef467c1e898e4f6121944172ad1aca6320ea8148620e9d05593f8ea0b0660052d8f6fbd792b518f9b6fd2d780ead130b99951ce96f6dc35d6f9750f4e4b9786bed59e4f4192a823b6d20f01f76df393d93dc99c90bd5697c6cee5a2ac7982b177be053b090f42b594de75a31628958006152267c17b915d26eb11f2f15a915aa46cff3734a236c155f86c79b39274681df30d81300ce9904a49ddbe81a7d1af908cb6dca66af7465be34e88a81351b88ea5aa8bd2d5574e5afec6306927f91704d132ad39cf62bc8d11dad44741e886eda445ef247fb531ced65770f3b79980661367c3df87af8d75277a3640c85376d75e590c2c7f9b42a067cb7a26f87f0e5677aecacc8b8b56a567ca65b3c0bd3bfaaa93ad0c3d18e76e4c544044311a49fd523324cf579b050e11c2d1480b86252594298bab4d596d08df2a04c8acca123555ab5b57e3723c368e8ebbc8b303643f67d62086d182859d91ebb3b121b4095d42e7d653b55e0f295b1a1f89e0d770642f03acf5317900ddf8dd0b79b3bed95c575e4586e2670d025c699e91d33a51121b2d8c004dfba2a6cb1c2f84e1dc078c2284912e80c3a6e37496783eae82d1492b66ce57cecc475751a5d9a1281a644fd450a334dffb84e2cc828f19fbcc3dc33208f26022ac6398cc2e02a9040fa103fe82b6a4d62fa9ae8fcd86a82d78159e597c531a22378de8d69684776bf25fd375dc4922db1d1008300741a1cb9b57d388f8e1195d4994ec327be3895c93fa66c1b3f7bdd6371f018c01a9721d72d3ee67fc753b58412a8a85b9d03c061b0f52e90148513feaf4d017839d2093d12f96717bc1a2123e820787c9efc64c99645c5386c591d92e1446cbb2560e060e2efccb2cd7f7fa52270012f40cfa2d2e1a6158870ad8348014342ef7361756fff43162000155f0622838c1cd340bd2ac2530d1b80d39e59dad77a846d079ea68c0cec73cc52049b854c6b39d12fbeafa5b404dfbdbe26e2de8a3dca02180d86fd11880c11517ad282c61172580ce5d52732219890e6e0bb5e599b375b406eb64bafcfc29d63967065d692ed73143290eb164edb111fa6a9c0ea3afb9fa9519cd8544d9b29fa6a449610e35ec36659a4b5332fcd27d4991289a0013e39cf6bfec18572814c8f129f95ce9433521865e8ce940994edbc67410930d4ed83fb2a541f844af541fea416ca4c303237fd2df072d0fd214b7fe024b8c99333ff0972d2c1db332cfe5bebff91d80211278f12fdd7102a68e00df0172a388a94c4741b951e20f9f68c6f4461c450f052c87084530b199ea307a7b67cfc32ae29353865960badc648d9a50ac4d3a3a6728934ce6550087aa48e31f0d9697d5669f3b6a3561846f72b0fd80660010b6b9b1d54b3f313babd526eab334a994305962cdb33337fa77fc459309441de8a27a9e3f3ebc664743024e8308da7f1c3fa5f6e4a65b1a56458fea9faf6d1afed32a925307d04a234ea2467624b2440a8609ffe669a246ad4b65a880bb5441a1f0380562d677491d50e967d115bdfb526f314e3b2404dd339b8854bd27b6c388f7a45ed1e66877b7d3c4b5fc83eaa7adace192599be8b91bede3e7b12f1acd7680cdce9d5e4a77a4333baa640f68055b1330c628a2d0a2f86e041a14e99e813777f2eb41729bf40bbfe35a4355939a4278dba9ca1b04708c57bab9177e12f2d591f0d433098b18c42b8a003fd0b71a299f050485639242557cf34a7e7a76316fea844eaf6b720665aa125826ff08ab18360db4651249de20292ed61115268f55a95923c2bedfd36bb93e36b143f7a25ef042d095b9360839d3a3fb8f624ae3c33df6c461bcab4ca4e587d2a2a6e704b3cd3f6721bd27b0386871cfc9b83a653d6d4113a3f6b53f4670b06795cfaf4b85eb70d00fee6d146cf20367f2d7a7e7d9b407cc123c5414b80eb2be81d10001e3fcca3822b4193d3770a21838461e3d16d148cb40570397789e72c3cf6e9d7077b50800947fe2f38ca289b2241cace258dcebada2b50911ee671c7027883198839cd8793a40a1b3a0c413978546636f5e5b17b5b21f55865d7bfdf3dc020b5e20e3e16781c2f847ff8ff996b144361dd4719132014ced4d9fa8b7ffd51082ad649143769b2b80451b36e95fe2d51d45b8df51ecd192ce513e670dfebc80ed59b646dc0321a0b96d11a8f2c8c6228c620cce72cb30993a8986bc85f08554b74a7128151bc16d64c5ce6dfdde88102c668860a589474f7c68e790118db54e05213d12ca4df0b82bb79390abfc00ad2c5a4c6ee59670826edf484c8dbe7b08f329f92912cba6156cf7f1ed54d0743083c7a00e529fb4c757db4c9070266cd208b29378a155ed5bd571e5051e18f1c6ace9823c65da31334d278b0891e2ff63df5bc0bc1f9acccaabdec6d56b06270e5dab6fc346230898d4c4d958d6959c7773244719e03c5a6433c0f33b929ac12701d049d741e1521fa5438c689524472e9268e625617696edcab3c16b7489bb0f71686f18ff2a528980c0183eba8293843131bd68b18364d1a28313190426e9d401a02fb2ff4a23aaf1461ad458232262b3f1caf4963520755b7284d052f4838a4883661c8cb6a3e77f708477d359727fe324194516829b163c2bf8edd58e8f89e8476ecdae4f690e578e059d188f3a1e532737278f8a8a6872beb66deebcb94ae97d34c89c45a3edd2cd9f24eedc94599aa1aa793d345485b9146b25c9039d912d3cb57027e1e5187ad173278910efcb2a16bb32be0befa5308fa27ace0e09281015c9d3f3398a6cfe5c9d77b2d7fef347661bd9597d758a5a47d572892092aaa370f7aa611b48383f057ff76929bda9353ca12b488b7415ba1ed43e343b9e3d4f8932b4c0f3b850e8dbfa2ab12951c8d3307a9dbb0dfd4385cddaf720c182529950a56b60acd76277112a64e72bb010ffbf5bd102ad275db3bdb6e3349814e3ef71c6cd94d93581d225be776441d6fc9207b75cd25fbb9f671faa95d6d221be33ba34c166ed4dfd8092603b8f468733da2e3dff4b8b54e5927b4e744893e2b77ec9131791239c35c023f5dd8a4e3baf10ac4923c785c98cf3ee511e48a02465fd64b4743c025de6a749d86d23734e8fc167c812141e7ccf9f3a8b09285c9574a4416e5d2ff58851f383221954c051c3b63fb4fa31aed7e9836eff6f87a90a5315a214dc8a875bb63e9e22d0a71c7d44203954ee38dc7c1b9bb176d02d6cb274aaeadc844b623dff53edb6f471474994d100d768a31b34f6f49e2b1728b9c5fdc79f609e966ab656931955c9cf40df00726bdc70da16b2937242938834b7a8e4db5592773f43f127059091fb0119bbc1c2774f86448b5a2a54192bfa1f9c8e8bb8e149d12cd86c2d8e64e13c86c8e6c8e6b5519d53e3664015f0099d6e42c6a0d32ddbccd0867231b5530317340de033629f3b785b225f3acddfabb02389e0ee4e430fed330ec1c2172ac13677eac2a76bc3f72ec597aa42588ec8c0761438b21a29151c33147cf5dc4c0bbbad169a4f1d163b7ba072443ec53bca85e2995cfb15413a5519cbb3477f103544deb67186986f7cf9b46c05ad6177a8d9eaa4aa3bda891aded9f740693797343dea1777efd510a8943a8cd6b13ff47bc724b6329bf5a92c902901d1652691a92f3cd61e32b5e8d03adf638492a02023579de7d9d1e3bf1095d241f958ba6a76ad204e97aff6ea5391eaac2ad354fc6cafa0aa360dfd1866fd56620a91c128bc632dbdb2fe4fc5085a9cf0c1ed7b1f2faebe72ff18e7e9fb5d2d903e41a30b720179abd0b738e840871e7ed0417d101f601b1c44836706aa5c314eb94b9fa7d375076b7975ca23baf1861ad8708d70e1c036dc7ca37c2e01683e5cd034ce6814340d0755fd6ba5f33b316e88ea6d08c642060ae149d6cfc11956d8d29c5fbcfd3391e46e6992578e4e1dcfa3cd2b2c9ed1926260163f81c9fcc598eb87c10249544194408bb2911dd4e23333d3923eb06ca0957e569c8ab495341202143e1d1b72c776d1c86953809519b8fca1ebd58b3575084c7e13a734277724823cc14274cb7b1a5536de1996d39b21dd9a7baa8cc8b702d11dfd6e09f23fc442de329a6b6edffea5549800ebca8f15a2a6171c84e99b8a602a4e5b6037a9dff9284c5b7dabed443b1124106f378a1d3d3fb1d6dee5ccb7ffec609a22330e6efa3a138ec98b276b594b6a6e9d870ea6f14eeb59834b97a3e460410714c1bdaee50659be7f8b5b085912789d2f5d6a7124bf34c914113f68f64d378d02fd2bb56770e724bdb86907cd0afa5d0874193bf77382cbc84df0d31aa8add50d6122b159c579b7eb44e888de4457d5b56595fbb1b911b608ef0ab5a0573d54b382cf64707553b96eb951dab8c6125c8d0e302f4646b14b4095fe61e63192e8b1a512d48582b8bb6057239f18c1632772d042fdc5485855af188a92a2c8e9c54f8a0a2329e9ca37f26e098123054bbf345c97d8aa6bba737e83e9ac0e74c9f46ad0eaee2f4bbda2c63cce342a69c915125eda824d124c4780701a38d000bf2884bb0980c1816e2ab5f4088e31f46071a1d51c5cf8ea9fd4288ba39ece03ec53f1078876e4e867123ab3cebffd512900345d61c7a7ab726388bd99c528ee108cbe10eea1b2a07bb04257a9880a959428702f5e4b57a942e5084a0953e844c2085ff1a9ec640999b9825e0dd9caff7bed244af7b230b521ff2a5b96583c03f0793e0e2840242cedb538ecf6dbf874f9d9b13215d5ba2b20df9fa854237289592c5486fb55da6eaf36e943f7b4e5b8da98fad114fc48c9b87b7785668fb1035b715ae406b7326fa1c09cc39e8ef3b4eccabc29a00a5bea6d81c8015c40b22b42700b39995e31a0147705be35f81ab9749b7d733fde53e6a6787fc5923bd220db824b827bc3984bdab706667895007c170275071977ced7ba4d2d6a843736e0f3b8d6a136e8185b734545ddbda26f41a3ae60bea99852218a1d8598679f12418ab67ea36ca2d8b5c6c56da1b1247dcba9dc78f5771faef73f8ab1e2d9928ac2293be0cf25ffa7d06273daceeeccd1abc556c37a5ba3353a6ab478d4aaa7be9cf17bf88423d5f09e1c1dbb43e1969797101961022ba91264412af038cf0cb83232e169ad5a81ad8280dc4e8e3cd1c7783a363d22639e827e6136d467b4cdcdc703cc0f9891580ba177787c6c1a0502ba3b24006b98eb837b7fa6a4da0d426727896cb4263cff64f32147f36305c44bca25f2aa48b4653ea6b058eab63a755d536453f23d532434b8267150f7523b03dd27df3091a8e6fc2ca2ca0a2b777ecfc3ae76866daf5949589d313b3bcab65958eaa202a69a82ef308e1e4de3173a65acdfc881f4789d9c3a2b9cc087b10f9320368d52e01e019e2a6d591973ad4c1f5c1a6d92b2ad97dff3251293b5324c6069551919405eb7aab9b814e9b9c602873c1ff36a160e76690bc7b474164143adcb4c04492a650561d98e325cb7837f5260747428a54d00165291133443824249a1b3d6c5aa9ce6af035cb8138c17ffca1266dfebd75460b46c71209ee8aefec0ffb0d98dbdf9665e5353e97743eda612f2f9a93b54db8afe9996a038e7729b40c53fdcf89526386bd1128d23bcda07d5e70f5d8cc84579eb58933787d0971daada661188604cef7377de0048c3ac9c91ca5048be97a964bf7abed0405a56ea4d67b6bb6cbb0f976dc445bb679b46fafc2e303227ded01780aad98548d261dc5c4b0622ebec416919b00eea064c26f4895ddf1de28ae4c60edba0711957ad08a36d76b467f2469548cc80afb97e2d637c73fd8b4cf9cad57f8b1109051def98479a6904e1e19e786f7947f90237275a92f185c4b36ad4d4d7cea6917eed6121874c157d365ccea51bf9dbfdf81042b7cd60c9eba1c14c7dc4cd6c67c2f73f5594fb4b25eebfb6f132c9cceec0bd39809430791a9349aeeecc64c40fd0eb74ff191bca5068bc89ff64d4099b4ccf21cb39a2efb3af814cd152bf6d178fd4b66cfe2d79b383db14da666c5f9624894e8911087a493f75e186823aaafd635b363e621238d5ce418d1f4ff3ba3b17046d2ade0f1dc8dff5392c80fefd6b6e2b078df426f43a0a5f7fbdf636a739a23ca947e8e8a88875c5003153419effeb2bdf9b8a837aa94e0938a6412ae209910cf255ba4592827823d1d0b0a0e5536ed2ce284aa6374ce657808a9cbfc4d6498379896da575b63b1d5289f1015673ceb79f2916c6ca0fc1d261372df6bec751d879a0a8927cd2516a6b9b8668c6c33e4df7a568893259d3aa84c506d0d1ac0f4a4a7750cfe1fdbc5bc7013a0d65813313bcb10c4914a96340f7a3d01655b8105ae9c489a96c78d2a3d18723f72d3e5ae4b145fb834340b5837accd50712281214f019a48b43fa9a4fda635e60e044f135e75b5be995c9f3db4aaced2477f71af73fafa7d6adf88cfc9f31ff70df34145a3c152ecd5e8d96b1663c6ce0f385210adb30ec6a68a9777a31f79f003b82ff639a4118a3219769fea674803ca452fa553acf55786eb843b7d3a254539540101a8f2219afe882a8f5723f52efd1b732d8d7e5a70cac72475f9b3bc5b6a4bd0467eccc95c923b2d421c5bfa21497464d046276d01eca782677041ee44abda38bbf6133aaf572528128bba8c2d3ec60176f47a31e6eaf6c270e9646a08a28843e378c3ca3a34f316ab9d44d20d11512f16a4329e99c422681974cf9e720b33a931314696f62c55d3ae8d105638b72607129d6389b56cb58d9f54e350c0aaa8c80dec5cbc6a71606784bbad8ecb4f80b98b768c6ebd84eac481e15234d814e7ee654c0f08f13d1740c2c804ce56dbdb431e675c3e01ad3fb16407dcf190acacb32e1c07328172981bed16b2bb2a146b431780d0846238b543202fe8ec3f5abb1156b87dd42664ba7bace6927d2a4e66b144c2048e833e7b24d992bd4280dd14ebf8b7b3115594d7fe238f03d21746367c5b04a9ee57280bf9dd79d80c16af87cd0806c21011a2fa0086901d855a0eb6c2bfd6685ce0ba3abeb4fbca9ae1b65821319884dcb0f6e33dd939150b545684cc9e001a41859bea5e65579a8f55565c5856fff99de25006938df236a3a5ae58be81d3e0b7e314206b3ed4b53323865cc1ee7b3cf055f6f0042ad0bd3f313a4209fe06e6d0c6d6575899f496f891656ae1339f952d40ea817c9ca1f186c93f03ded0027f70f0ae816e44b7ccf7697cd743700cfc34c5377fc6643f7afad370d6f38436cb1552195dd493274cca9bf25d020e1f7c44ea57dcfa0e4755462a6542121621f823026d285dc3d70bdcb789c7599dfe31ab9c44ea1d8ee2188293e20c4feb0021423db9b6fbb471f0b0c567e8aa08e85cea6ef32f4a2c4f598d5d00ca3257f6f48b45ebcc96d3502bed81c8eb7d3e47ae4e29b87798cf1242f989b444380d9a4f5c3082a98589a34c6435c4e0bbf5f3789455241e6125471ef5b2cd3629d1492fcbd05d1893781be1d9fd73e05bc0fa08916d09742a6b1f76aafc20373f3ee1104a5dd4bdbe3a288be36af75382e8e92457955e0d75a9a26230487b0db1afe6ad640b91a4ddb12615d0a5673da20db94ceac39a67d99f177aea4ce03ce29377c9aea8094aa4a9a524105458bb5dfa476943c2261b97751d210695a819ec8add51a01683a458f145c367ff050f93605113ec11db7b34dd21e1ef2514e1316ad88f83987dbdc08c86ead4294b30cce32ad255acd1c0cca61aaa68c9187e52cc8127bf6e0c92ba3904d0549b97c3f2c6ebd2f0249118144cb1220291bb055cee5c3ea959fc32ce71480252d884af24055b8e5414c39591cc9b7132bbc3721cf243749b5366192362cb791d2ec1b755ed20517d159d3d62da1e145ef2356b0c3e730c2f2c8543c25e9f49ff87a3580679333da8d510d4168fba091df58fa5011bf3c4b14370c1df22f2bcc1f10a979cfefe82427ce691db487449357cd831118616d45c54bbfc379305e963601ca59382add0c225bf5ad85be77c1ee703a0925eb2757e4743683a7d133583330034bc43b2ed104ead06bb93176f0500981faa443f5ebff6ac5c8489a2e17d5cb9b142975493d6d4e75912ed0233c8a13f5113ce951c4733c40b849b792375209920a4da00df178e8e6c33f30b9ed953718aa0acd2588ae4d764ba6c167c19702805edb063f935a2fc0777dbb7c92da6a5e3d78f9c53dd59b32e4caaa458830ef1e4834a92f3f43025fad779c00e4c55af995672b7586a0b53260c266676c1643d42b6ea458981f84de79349df39e140dfa1f1cf56695c2e9f4cdd39d13d6954715142fab844ab020037b5ecb43c0f917e099e823e1f4ea9bf54cca63f2a0519be649eac3940782826ac1628cbadf9a868f9867e3a32a7eb631b7e85d4ad92948108d760f223135d4580c67db1b65db8f4cd6c5570b8c6a7d11053a63434d22118217f9509647465490ef7d3a9a548c9cb19ee563f51db68a9c1ce539b0073a8b8e90d9e3b2f578b34ee83b84707b269c77145ab7c9774d5838acd0774a547ea5c206ed5ba539ad04979674f96e7516d7db0d66e2869f034fd04f40e856f64c1e3ae9267fcfe27c8d2390b9bedb0498a6d10a4d84641abdc512b1c4ac96c916d0dce819de264044474459b8ad41f402682283e9ee5a14bc84830fa7b02e1247cad0f96e64c50e762f8811c20cf408c571e86d9562811e40ca116d7307a66ceef53706c854af92a6040eb03f61123ce500903695ef5c0de81eba22c6244de0fdc2f40841f4303810e978c95966d76146b37c56a7e3a2d772619d0dd4d9c26ebe231d008811c32ae4abcbe3710873039638882205163b8a2e1207f641869a9483bc70f95f17f4d6482be20ba2221c3a45dbb2719d7867be3c11638a4bde00d73a2666de9eee6ef12618542e9da414a31b49564d6bd09036dcc95b4305bd583dd6981ebdc5d8bee084403e3cd7f17a9ac418919d1d05d3d0a5ae142f0bd6e044a7f7392118077a53cf45add0214fb16d0f5ec2c372177a23e3d390620ba4eee8b2e0f4741a1c349a640f5a83faf949cafc9494eb85a23d18972eb6911b0db9971e4d305e40039e93c53f3f0187fe50f01aaa26ce263826070b2e020dc65786230243211549fa42b849b503b1a3b9e787592993cb9e733b0465706105270ecf721d28db1aa438dbbd58957153ad54794912b76188848d2f3f05c203f8605315c9e0717ede874bded459e28a6e10a9fc422d7b45fdfbf7416723da55f05ade50a5a2494b822048dc657f7da0a7b476d52dfd943f1ae166d56d3466aac2251f2ba5d8215df9644c94ae0a87cfc2e4ab2ac36a1193062e615fbd55e357402afca2b4617013d5944e4223297c5e6be42c94c1a8539a281991120648678720f28295c23f1470228760859a2cc8b7619416b2f77850d40f3bfe05a486a6e469f195c6c4a6f2ffe362e0f7599faa819a41ab5b36ddddf7e958c6830bee98e07ec5972dccaa89eba5c36edca3ba1f46b50a1efe5b5ecedcaebc88e95ad1203d29d428496558d2c695ab05364d9b150cf35e7e88bd889da56e3d4e2d4978b2d75e6ddd0ff8c8226e52cd02a77f65733738dc88b92aa20a038d32a3ed023eed2de4ec7b6bce35bed900170eee09119dacc11f8946f7663387c3fc7a604034ba8beb4a4addd67b19c4e3f7e967e34ae8504f1e8cdd03514f7a0ae5ae6db9e6b56642cad5029b3c2bfd16f38825d0127d5ac3e05c7985a75a7800a9ad9062d955a87ae9de66485aaf80001c6da491b5909fb765f26b08e61dde05a07369e291a7d8ee0848b2c29b10f36de71e98445496e4590c16b96bad2decd3451dc389a1ceee6431053520e2bd65c52a4ab9dc64a572ab78fbde4098ba9b9b064eb08768d201afe2eacd75e579f60fbfca1d23fdefd01208c30ed45eb108a80d201af8536ef30681dc34969b65dfc9781d4d22c4287baf414c2f0988ec353b54021c1004331ae832471e0d9f98a8f5d2e50dfe9f9e243004955953817450c1cec3ad92c0e3b0372a43c8600f0bd7a7861f44bade9498d4e7e042efef99169833780a336dc339b2f8de0d17415653a7a01f0dfd7e2487e9990faa61ecb8940847c7114f95c74e07c1272051242a4862e77164e9e4c2448d98ab94f6038c03580e79d5008e9e027819331d9ef3247e45fbdb49845789465294771bef51f8d004dcac53dd31305380cc6efe81c28f371cf0d2ed2a5106369c120df6fba8baf12788856d293f629d8f5055082bad348358aa2375ecc3feab691fb31ed10b2263f6215cdda7da1ac21bef0796c384a15a32210c9b0e65a07177b327aad96d8fdb3d8ace00f27a304ef1664ab535b7d68f40907e1899240f7133be79c0736176263873c5d3319664560ca66d3dc44587930d346a5f45fb4fcae6c7d6f81b09a7d8312e21ec0ae34ccc7f23d2132c1b1e1136268502d8917cb367e51fb5e1e5f181c44296396fc35edd3b365ef84c53af8ac44cb6c95274030a2c33da141b4f923d574b250a7de661ab8f09d0f74039dd777f2f4c9b6c2cceccff2bd44990400abc8564675e517996b721b2326dafd61028e5e9cb188a34d031aa9914aa774a88610e3f9b5a759b6a1cf38d98ae379d4fbc40ba9c43534b2e77765025c53f6feccf40dca40a2b6af38a773a2a5109ec96d119c84ccb4e540bb61abb33cc967941ec6f65ab0e4d8550d0c0f39842a7fac308934fed5586a9501549b405932cdc815213559215ac81bc9d99e459ad192169d06ca336b12314036142b2385fd8181a4195a64170d1d9284f87b988c678efeea588f0199c65ce3f19849909a90985878ca3bc1ca7b0afe75792e48900b6f9cb3b370128a20862e2e19e7f34c4d325bd544c528e0667f35c421e3db83556fb7561d65c0c57c487176c15a569e0b00436ab177a2d58dbbe722c84accdd66b7e678c83b9c000126c037052498f794ed5f1f8164bcf9124871aa3f06ce5ae9a6034d0072d6e6c2698caff2ff4a7a3b34ac28889f2abdc8210aaa843d866cca9f5ca8cfdd3d27b3a0f217dc041eb5c4ab081254deba207aa40594ca9e674627ea426b8be01555365ce585d7535c7616ec7eb08731d3e156c58a59da889de6a2ff3248ed3c087ce85ffd6390dc832479f52ec40b1ecef41d8a9a4bb9b4d9d886950ae8ad4827071dc58d8ea62536794d29adc28a333c954850a4e62986bf448cc988147a2b2c970c023c1c227fcf74389fb568f5a9c32cbe6ba5a003df0572254aff89ae024ab16d1c5541d155604934208c6245977530a7eff4b570d7ca6dcec686558c12f0a31fee8773140b7a2283c6cafb45f9c66f8382a386b5bd511433140778389e8f1c3a10267d6cd02130c5ea1d72b02620d95b6483e00b9fb19f52d9005d446c061eda90823a79069126c409f76bcd0c18bce3c68ce713b8e4c0bcc694d65d6848c11f149698b88a7e408ce2f26c155ec3513b2f07f61c836cca206bd49a95a8661f684bd879abd33af9f320a510e12d8969631a9bd4e53889d2e5416356e3966272b3921d5905e1422c35b940d8362e2b8c5d711284d5c549bc496cc392ae511a49683a44fa14cb3a8d738777aa413130316273555370580d7febda7f46e112ee231ed6f4a31c2de2f18e43c2ca299c4e282d733bc8743d3cfe84a317f02f0b301993002d12eff8a80ad3f41e5975166e08dc27a02f827b831c930fe70b680c2ef471c4b270105d609d25000a98cac8d11105bb5cb861998a632ae21a0bca9e8c8ea492f7c9391a0c2485061a69b8e59d5d9732d42de52085e17dec7389e5647cd08f357b828dd53ea9963ff108a6c209dc0adf7aacc13c9060b006cbeb78701a23dc1726701b89b29e6244dca64db006edec88a7d9b5139db8a46d4107d94cdbc684a97d514a9e729add6531ebaa73083033343d5c17895a188af53da5b3d452c2abdc1acf227e395f0a6294a637346c7c9b0635dbe8c056befd8871b7d02f099dde77b68983605f50b80eade7f069ba2ada62f8aebf4bf8bfa0f8d1ae4d3233859fda4c17bfb4fcb6e6f35429c11e6e650fd4c4067469c999f8a4ca94543f6ec3781406d6c792f515755492d11491321097057ce08f04747194bfe86712d2f9eaa991a01ebea00636373217215df046c416a3d008e5ea9a6a28174f2180eb8e1453b0d61a4b9f34f1ec46f72845838e97bae9a63441860d59644b0b6e0ed4cc69ea2b6eaed2590555ba7e20e74eacfad46b9eb4da8d99a2a3ae2ca9cae22692226a840368966a5ec1049ccf35c51e5a622abbb41608601cca19b8f310f459c822b35dd5df6c1b49b970298152568669fba3c3bf30e268568b4388a48da93d8205d155bda4c1147360a3eed78213dcfb800234c67756b107073f1c7145e490add12885a4b689d22b521a9f852f5d54acef918bc410439533504c227d14291610910445fdfbe027f3fbc5fa780c5154b3d536f2beec381364c47b29ad244a43e1edb926b9a18468af437895f5c61a2934019de616de5bc0493483f7966266e6a41346924494ea44c7d99afe2ba1af78ab92b648fab892afb83c8cd98f8d6ec875d7b40c2befbd9258a2350bc14d5bc5438c646a32b10c933ca197a4313a34442f0f51287280e7328fec50e0e54f487441ee1efbca93a5a11aea7548457954ca64f95e233f56b95cab03e2e48c50bff32350faf9b99e903ab183447cd25997c2945b591e23cbc3b920f586e3a202cd62797be7f46696e59fe0b4b733d7ddd6b21393bbd24976d40be8597247cab9d588e1f81417807840bc6280cc24f5563c398d49bf9d3a97b542e7fe2853ed818795ed994014ed0dd0fd3cba275279d8cfd0c9371003cb9116b99aa2190044de990c90c14d2d991334d921c4445f80b85585f1c5bcb17867cc6d382b34d1ffcc555b6c5bb0ba80e2810300557cd38e15c052070e7b045b4142454064602562a002cc1ffb754cbcd12f95f6614fbd16e203e4212585f7aec79262f17d49e647e04d79c22985b9f1b1c018dfa7f0005dcd3ba13e4a8cf6a5c0d85d881598fe62a07ec434015afd203467bc8dd6e21a462ac654323a8aa38d3e688bb75e4dd6fb809f77f455da9d352de0b2d7d433b0b9b483f6b0fc71a20c75af73a66a617ed2ceb814420b3379b78121118cd0528b997bbd58924875619888112d46ff88b4b21a2e2c017b4d792ea61fcaf0496a1bb545b813a45243309c541a35aaa95891853619289dfd59a91f41984572b8d77f3c9b63f66474387a97b080c6243086d020bb01f579d1fad0ace7ec98cc0a9d53e912896bb6f37b2465fde1aa6a1797d7b2a979fccf9e30af086422a0d2da14df00eb88a8f04526c3b75977fab71a0d658ad103075abe6b4efe45e44e345b8791dd454112b22d361f9c143022da5422be2330ef23577ddddc27ec14f0b54464e2514553a40d771e38b966ad2091db9a9c010214df6243151272c5700ef98e618dc181d5bab3781de7e50d7021e93ffea1986c0c0ec3124fc9d5485ef680872b98bc9e29640f31c7da2a7d3f0bcdb1911cd09ee2e093a5f5d9f69902cbe554e3a51b0c1c2874dde2b52f362bdfc535f00251a9ede275afefe7676bbb28dc8ac148c3ff36e807904f5d3b79e06d4181a5f856e8e81b84d8f7e0811085881034dad007c93d09d2a77c1a9c30d59f965e9a01b5920ccc17e4bad7bdfa4c316b7ce9a0fd7deb40504c06a6a01ca292fdac76dadfb9f46f0f32ff78b8fa070ddb65f253a49a9cf85b04a6d9619ed67fb7498f78d73b5d9d74de259add3790de452e5907f05f00c81f1b216a9da28bc698634908681b2a6b2116dcf9fb42c1f608bbb7c80493267a284a202b2db4942db0eccf7a4c86ea6c027e31d2b12d27626f46455e6dfb5675ce556b74b38757a555920790fb3dc3743150d73694441a1a529b09a7c958154ed4d61c3c77e2968e4018052607171843f753dc297774a58b47b6d805d04218544b9fb01a3c171ce3d0fa91b3e352d58cda2d89b521b6d8d403d802708cde711c6ad0916988c2cff24389b1602928da0e2731468f295051673f895a325f7995082eb2388efce7c1652419da2a6e4aa06d5c3d70fa2465bfb1282938f8f14092950380e822a9391d40f62e4ae9dff0814173b10d238b1a4f835780ff7a5ecaccf41391112a4773676f379ddaf9b6f9f12dcede9bdd6ee4aeb3eaa5227f01dd20429e10475776c741433070fa3a3c418c4372208eb3f970062a452505c8b27fa68c067d74c0f70e6b3a1475171be57f01f0867a70056a97bc40a5580a3d50cc258e2902adb403cb3911c026aa2ffd45168195f8aed3d5f69492942e588877e6f0675918cd47199bb743c3e2cfcbb5edd894bed56d80f0f98ca8c1b86e13b95d210f2593ec837ab80fc8fa10584448e999e68a1423dba89eb3f286beb0324fd3204e0a5fcfca4368d0da4503bf9c71bd496928ea7419b3f40ac85dcda38786b903d8f07550c18a4b9489b35b2a0bfcd0332a961799757f661906654ce005817200b190d33dacb40f6166a3f28f53a95eb1d794960dd7e2a928199b7d33df21527eb71d350806fdd59d29cb9b169c5dc0fa252210690f796e74c432f9ec171fee92713827759a7bbb0cd7826792025398210f6ee2a1a2c9ce7639f0a2c2bb0f7744fe1c041a477ad5af22734a2e2b76d121353d8745b89092fb025c7947181d55f42b2eee0b5a7b5053170a55b96803ad0363d6a2a3127ab9915456d0a7a4022fdca0aa5fc91349fb25b4645bca353192f43c4b1f5db4c3ac9d8c41696e6a0be7e2abef44c50d5307fb7608b402018a4e8801d256c962d2716460600575f7f5762a374095e4227a4a700294acbaba69baed01732943c15f758c69c21f4d804f56c5df503800063092be427fd34385e0c7b1df9fa99d6d429919fc7f7416c898ee8643c936cc38396958a9c8e544cb9aecd2161a309b0437899c11b7535b026772859583a2305a863553ab02e0d701e35e0cb97fb352e87520e75e17f4b895ef1b905cd3fa049712ca635eeb95a0ca0565a0c52095d52a06a50ffaab55b300f943a2a4214f21812a741d23702c16093e4ea9b6379c885114440fada79acdee53c79c0105938561686c0037980276343e0953ba271094050071aafe217a91fca3d009750994dac3483544d8a52c3e92feab6eff2553e9278928a5948e22da8af5b41ce0b55745b9cd35a065bcbba34fcc40b08c0e42ec15ed6fdbd8f3e24e1c417912fa24f473b9d4d83c549d7dde2a3298ca9194b0ddfa5416848f6ad02bbf8737493eddeb36d49b509e43cc59a46a8537ad972601343ca873228c39f2e0b55ad71d8b1e63f1568d8bab314d37b70c29d99c0e451deb8e837751360524d0507f93eae98418eafb74a930b07c0631762ed744b641b16b1726cc11e960f76739a08de532ef7ec6a13e7ebd5dc651e164b259ba635327f1c8ce0c2d2c34f7cd78d2a75d5038226d171e39c481c840a68aa6ef261da91cb570c0aaa3438d7de6f9ae9da9ae3662b6e8cedf853e08d6a25eaef2ee7bacbb7eef0189ea111e3727279788e90f69c2d628c62fa0afd4d4677a5ed0169602c2f0fe5884cab4b95eca827c8bb698cab4951765fbf74214c39c82c2df3cb322df69061ad0e963a8af4e3dee5aa6f3ab039345f725617ab1477b2ff4cc204ad6cd21d6ad6e1695a9c42eb2e0bdd6c6898d1c2566a607bf6f55355dd4592100278f2b6a29fc74a6e7e56e6ce3f5ec56073c491df3b1a08512dc5375d5eaf423dbbc08bc1a724eaffdea87310d6b148a127746f6dc3d3e5a4eb2f38b31bf4c88bc1e8f2822b534d51beb82d46dc23f1be349668056e04533bbfa55c12f5fcb0a227d74483e6c52025d3182482f7c485fa0b1091b19cc8e375a469b0098cc1eb1dab7d9e6b7133c18390dc07bc37176710da43b3e78844376054a8271eaa09170e742611143b486912d1ef7657b708f227a96951940b93e37c5e4034e927f58c221b8eef9c4faae5b8e835e3864eeb07d2f51f6efcd0faa4628fa6e1fc49edcb889f1b8e39f2e14faa228e7edfe4dd89043801cd433ca7689326185ddaf24edf7aded5e3e08873a4bea3c27b63bce91a7f52a9e54cc732d5a2862ab42dd69134f628742c9ffb3e3ca715996a767c47ca47d143eba9bf4d0bded68028ace5240e327114502acde512ece1493538d2f8112de48a33112f4c9f8c4f91c62ee8018995ed6407ab551bc6a7e818bfaa0374c821d0c9eefff229d293d85054a37b4307caa1d162d483f93354840fc751d1f9296a113d453d34928bc7293ec585ce6c0bb799bdf429762ae475bbcd7676d7535f2edba649c3bf4bc0873982561b2d04abf33114587b0d743dbda3b3264f99b39b986780dc95133f45fa0eacd897645d039f42c06e22ebd673607c941ae6ad9bc39181a51d454b3c55649cff3246d93deac2f7d8391cd30dc88dbdc11fd4a39eb22361044fa99f629ced97fd81c30757913a4f9844fde0e5d9cba88c215e5eea28229b0c5e15907397e695dc8f43ccc0a1d2942603040642fd143d6cdc4cc51c2ea9afbf5a5ca8f28740c986e4e475f953bcc61fb479ea93e607fb5db1506248cd0479e10bad80faf2d237beca53cc3aac860ebcf95f435f909712d69f8012266f9c0e5e63c8462431b806479178e523fa22d22463dcb837addb90e355666e488e5567101db83416844c1d3f6a6ead922fa7da77b50e897c9d5f4c61bc990931245ea1e8c0c367ebe781246bf8c3ce470422b90dc7b1e5e43f998132c4fd3054b4cc806b56c037583043a9add953d9392c23b323a85c419fa30767fccc8274201571fa80f64d03b7ad0fbc47a61430acdbf2c6979c88d183187d42d5be6a53d281689a7b809a23a85729b13031a8f6d7ae133c2fafc021490712d14637e5337f585a4e9d2ba72f85afa947e9c0a37f5f13834d7f66259572f6335544ff7d6775772830c2e8f61dd948d70d1c6601ff0e87de2fb305e365c0265353449b941aba5be360d363936cce5c4769360a581deb5279bcefbd98cb7add5d01324486f8b226994315cd1ece41a2405e1712d57e6784b8fcb5417fc558bb2afd25e89f2beeadfde1a4cf48e11e4cb48d0550c4ad2ee0eb1c1025adf98f553603808b2c52a827e7c42abeeb67acdfb150e06dd1d7f5e24cb68a06d584d92ac686fe83095f56b4990456c16387ff66d1ed2a1ec6b32838db78e02a3503448143ea0727007715d154af07a8bc9bd845948a75f02288a57f2bac03a7f9d0eec0fac0b17855cdaa0a4934c90af382ab6767c18e6dc31df4b83d3e253e2dc265d2c974c057bf112d1158d167a4412bfa8498fcf2cbdbe4fe3949bec45a613fde516427f1d896a5e047f4722ef8199adc4bfca451583960128723a4f438a7bc98df50e5bce0579472f592e5e7b09e6ee218bd603b50c66fb4722df47ba032e4fccc13ae2dee24a2804eae453f4728560e30a5c245ea3d7a14d1c919140c3fde6e7193122e95d70a6886bc9f05844b851132afee1b718e7a42ff7cef5c558e32ad8e542f603d612c343cda25d5d16aa1646e197a68b3c3d8234a347eb8126eedcb7fcc5edf0f3ad713c12b73a7f30395d769b0caded5f383f0e564f08874e357c39e510947c0cbc88c9dee58d97b3dbf08df4e06ab081d9d1f545ea7c14476f7b52aec2d4278b35ef6e3f53a3f50799d06afec5d3dbf08df27838b48976f75ec719170fd2d4766ec74c7cadee9f941f872327844ba3aab612f54c6096bd9c7ecf5fd46e73e116c64ba0729614f0ec7e5b314a1d8891d91d967ac1a7b6154385d962abd5170d94f1d64b521e2108018c156dc5cdad3d8bea055824536fb59ef30b3add12d7dd73a94b232584740f1052b6f1e72d9efbe46286b4d804e8187d6e92d58f064777d44ca41b9449983ed29ea5052b5217eee0baf527285c162f41e9095b477be97d76231c2fca9d1e56b6bf4cc57771f46401c46ee0d23920ce3dc0be32b0ae37a4e183defe6c2e4f92da505b6a10946e407c66904c6d70c189761deb1e500c2257f51442548c3a824b68e7ed152965fccefd57943f4457a3033d467592f66e51ee392719b3e907cb18dea2739843ae1df77de7af12b74b2ce0665465c4c99414c27f0bcf69ac4590f13861a5ea1633f5613795b5be04099faa15f7aec59b268cfd173aaa009888038c16c3df52bfe4c5715161c15e1f71668d08f2e6727fbd3a21019a37010bf65550d73a24869f5ab0982bbe317360d8bb5ff180189e106ca0234c68e06889f1edf3b597e228617e316c07449ee0c43d68f052a60f487eaeda9af6294c014bd710caac4df4f4c462e04e6b5743e4eac4545df818ded5e9b927ebd1cc160b0901f7201daff76c5f87c94f3627a5b7b878d2ca7c027deff4155fbae727da827db64cf2992d9b10bf47ecca23801ea607b4ace41f1c09ac31dea535581680f8dfcde88bc31976e73403e77cb4e15cf6a4d9e2355c7e7b306e065b41747804f08ddd3f63f76a18b1d4caa7b2411e046bf145bf4eab2d7ab64a11ed864f2aacb90ab719625af54796e8a0dc600d3ed12d9553835403444b39f3e68eac4e71e04fe3e0dd052b4fed5ee65aa28daaca9eb9a871999a4c7344f0ec332bc59447240bcc193252a07220d7d4ed2253d86fd05779e89570afba0e9657dba7d5eef0059b5b6e0654ce09423488e2e3c5ccc6abd75babd4c8888a9625e9e00dde99a7a99cdf4cfadf2c717ccb2d7a5c51f6201edc95ff25d206c6b5748812f59c3e48ff38ad2a1668f009dc1389561b40cb0c29e59a6605170ea4a9d2e740a2bd9623b3a17f20a612b756bebb04a3002d3507b9c39ad5a59ecd8de7ddbc516d2d72eb946b9e7b6701ef52e74fa44c05dc2e5a19e022e8fd0b122eaba0eef9f81d0c99dddf463d771a26ec1aaa6a3a773e0141e62eb7438822c2c86d7d23c66f3f37c010bb56adc0b1716583c890af517f05118204a1950871a385ba37bdea070e38065939edfd50d96616c4d437aa66177384013e522c9e40123cde09a385d5513f2a277f68e8f0967c62825f6e2a3c8a0f509d416b3dfa0c35091ff220146b76099f582b1b5d302f43d5be1f8ca11a007caafd5f3df9a8959b3367a98f8593d4055f6aa0df43c43f10b20abc1afac4250c4bc3702474fa29f950755655cda869e4744b1981f2b4d64d61ef78e39509eb88d08a6bd82a0e295fa24810bf6622384995bf32d146ee4b7c7b227853bd670ac4c4374d262f746ae195dd7aa198c857e3c9268e241deff9e1fddd416341ef6460f659c0fd9923f02f1b2a76a31c93e05d1cd4851e8d03ee43cf70f6131b5d2b81489bd27e1447db5b0d02d198bfcb76662d6ac551a065de04ae94eeae9ade7a95bbe601d3b9bebca2f612f492496f967cd04d71ac2b82554e8119bdc99d7d1241a6b008d080b86f60753c61d422ca9b1d137e7a560162c4330a3caddd10be1cbbebe5576ab603ab720ca0e6236d79b40eb37855fc2e950e3c4df7d22602d4c4e0c91a6646b879bcd799076c1456b43e16375feb236d156dc0116e63e2b0e54cbbcb4d11a0f48de3456b530fba69cbaf99e656fe5fb28a547c72f34de075e3ba603ab77e9ae7daece3cd7d9c97c49804e5ce0be0f6006e92730bf0f4da9f735eb7ecff08db6539c0df0cb26f288419a6ddd59452c67846edd2b10691d72b5188e961faf09beb1443e56075733463d9b5b4ef00051acf0db8a135a11271cd1ae70a428cdccdd774db75cd660b779605d831f40cefc6abb7dd78326b9e586a921df3053e5061a8f24ff55ab9bfc16d47b968f2c032b4e3c2b598e7cac3d3381b2068d2d16cfc5daff60e956fcf6bd716cb8b57c56c95f6b4f60b537bfdb5000a1b60cc1b5f260aaaa7af5095abc0170c7d8be86741958df145d1ed147b1adca79d807e9c15876ca02384db0c6c8ebc75ca28ca4d820ba86791c9bd2587f5e111e4c57dc608f648b1d25d8455bf6cf4f2c9907b039713b78bf2cbcb14f954dbc0d9dc6614d93d946d00698c56b9f51e7825b56b4977d87c10522a43f68b9e42ef9679b4efb23c3fa26be5917d03d5c48f27a6469e6992d3c3f3e2e3a4b5901fbab1cf870cadca233197cf8b8b1582211aa741b4c10387e89d423309e36d4237dd97ff25f89d7ae370d8142e91d2ecd834bc183239ef740afeecd6024b75552c473b03f745253c05ec2cecec9bb750436f69d93ab368bc1f724b128534a2c883dfa516cfd4b4fab2917ed06ab6a13c21a0aab4ba7eaa517374051a21525b91535a41c318885593ee51a17580e66859554b673da8ff34dc89e2484a5c4a2b0171692be5f5d204a0f2fed0cabb78f78c06e15ee7df9560e0fa5cf8a70219ea6c4b675d36aeecc5a40cf02526e747f7e51845d096a5a1f7f134e264c10fd0b8bacbc079c7fbfcb03c2eb0dd4685bdf7003555f8420f4586c5ad0220ea93b175954411749f11884b6627e8f19c57ead6ac607053d24bd8e8099a184618b88b737ccf43d901e42cae0fdffe2d46b998e7ea94e7ae144cd366a96ac02f60290d699bbb7e9d158cf9c4198ab5007b56bb63ab3a6af232d5bade6a8bc7b65135edb14296b9c4b79ce21e172dab3b1976a4404317eb77e52bc0438c6084a4a83146200957e76f3576ff92927a30e55ce092e1e6251dfd40d561d53815c0978d4c2274da4d04ff33fa430ad11533c0964a5c9e9d980028139e4b4950add940ee68d23c0ce76283973dfeaf0091ddafbf227ebd32094565b1b44061ef65b4ca9c45576b5bc9bba8c2e6100b35c0792d0ef203e34a7a308654be09a0cef50a4054c347ad0f50df5e75317eefe4bbce0d4a9e56e8aef11b595e281ddc71133804d1dc1d6c0f00a4742585dad1d71cca0274e2b178c094bbb111471e797040c21b42d97057186a2290928bfc584690743b45f27d601a964815f8348125a31efd5b425890e263b2193ba3ea9580c7fed787cb22212688ed95fd632b35bda28ca245110dbbfd164e0463708ac201fd41a032255383e1c3519c055783b1247b3cf50772868d7858302848bb6da5a4bc45d6b01e3d73a647e8a469a27f989e526c50b0a2f36c0e8d028c4b8cb7a89e1521cb35f95453b8768584dba78caef9046809411763f24c1809f20543c1a14097d7f4306255fcc37c894730f85c6c7807edb081448f139ebad37887586406cf449fb3ffddb3e465faf904e29dc031b04e4c63150e905cb9c3ca94d69d7672af8caf25e02d1ab1922d91ff1fb3122fb1f7da2c055a60007361191a3c87bcee9a547b78edccf137851fcde433c5d004c0744875c1303d86fe9d79de72f053b618218f2a4973eb3d1a1144629b7f006bce84048d2c2fe4f9fa1bcd9af3cb041e0036d24aae78757d14de71d225cac69e541e4d0ffaab25ea04474fc7cc6d43a21283c8d53a19c724af0b998446a0e861db63f95f9472576b8132376bb6d3298f46f5a67a97f33ab0dbf36bfcb6523e2ca441ff45a8d846d0775494b23b83830cfcac4ad8bbe18b9c98021b4fb2f42c6f7b14eb367a7ff6aa2bb8984a7062323f1e606d62b333e65e4cf83bb9ab27f804eaab939f8c1831f70d8c1b64f5b8e075d1d49fa9c8b5508a3f7adbc1111dcd61a7280c7af1e7a80f7a29b540c741e92574e5357690a53e0755a0095e4327b38d311fa2ee95495b4dcdf2f7e774088a7509febcd5de8bde1fa98b084fa11e941dacb147d71e7e86b667abe4725689d25ed6b6cb4a64cb3d137815d9b61040aaf0411e57cef804a2f0e7e298120c8c23e87a2c3bbb957962caa09513a7d4d1f4ba2b94e8d6c41ca4d139aa774f8353d07b1c225c8e60f7cbe87b55c5645fbec1e4bd33149900e328ee783dd82a3a244278e003495cdbe7a0322813170dba23407bb8d901b5d391a70388f67de09d01afba8de62969ae600833e2bc2bc9c9c5af2e3691f537659fd00a0856c382a6af33f05425f8aeec350f466700f241ec550abb0627585a216588a70461d568594f29a67902dc0249a9a836ef20907307978ba94756d0f3f2c30259bc08a0504d700a84d3b6e7316aadaf59785f958048eed585cfb94c00523cf54ca1c85d4f95f8608b099b36aa56514aac15033b33362aaf258972bc7909df804a09abbc6a3dbba7b71e5c741bb8acda056615927a81a12a5bb44b0c38aa5db1dc83d253a720d69f90daa27903ac6adde9381b9513e51c845785c618365571b2ba64b1944a520df7b37d073e1f48f416f2e41c5faa1768c8494823403bee8961bd5d6707becebfb7d9ebdec2f1bc24e323bc1b274d305cc186859d4538683b01f08a9d20b795add74a395d739a0f12065122c83fbbd4c63842d241db525d4cf8f9ab831abd62900e376f02c5cff334d0dd0c06da9f08529413a1eccbc27c6ca5265004e886b19bf599a2919a385ab3401c0447595cfd47296ea7399938ae61b4cc1ebcd5ce945c6de8f3d74c2f8c596bd9cd1f0b2a8b104171c30567eb13ee7a483c9e640b13a92eed35fec4412d5ad16185a6954645c24ee238979b47372dde3fa987d54c87f82cfd671d233171a73b406f927353a9ff9044bd1087a141eeb3d418c52e68e090239730bc9ebbd416e58d893367ff4f44588be4b9ec58314fe54bae474ea96ec176e8400f14af52f1e57bac6b680c67fa7a5b17424be0875f706f48351056351c6781ea0eccd869382428718edb24cd6b119dc608d0be4894896441a28ef7276ae815230a383fb36c1df8b3fc13da5e85defd71871c2312e8f88c1fd214f9d35c819dc052bba99238e236965ccb2a709cf7714102ba002cd90d523797981c25374e5d64cc6affb7659eed1e7c40282e04a642aee08dd717de0914431181a536e6eea3e4c25d15ab2250cf442cd99664960159c0dfa6de719cfb3aaa8f9388a73d1a5a95a55892d2fc677ea661004350511cdbf8d3ac6a611922b814a413c108be36ea31387836c252eb68aecddb9d809278e4600ecb3529f537d8e594f35c1569471eab176f3e5883c6440a4439dfdcd81519355c780246101d036a7e6d52279a4e4b30a412562dd8e3a44216eb44ec428f870bf8617ce024a97c2972efa6780e2055ece826431b909aff64529fb173fe5ff1fa1139d57ce926c87a285edd1056f8a5300ca63c3835b16419af7035e08d8d562c0cebf6f6a2051d03119d683e0c5a0acf4b306b6dcaf8ee9729d05f5b1957d038c2af7b6fac080ce4e98100f6b47cbe79aeb3a779a57446118e4ccd69e2ecb0640a58414ab7a1b5b2ae9adba6dafdfd6741480402ed9d80a0dbe9c34490f267ef2d498d7084af1fa00d63166453886bba0df5b26709fbc028205aa087ec2aaf16542addd45d9147de8241bc32896dfd7dcd7d923d8612a61216c9ed428f1b723a68350ba06b804a5f54e071a0ec889f2dd572f8b9f8ab54687287b9d557d3868a41b05af5ee1a30b9847f4afca9c3c646e4d7d645a9d1a6f4b6970db88ae81db823332f75e55562e0266faa87d03236348476fa0e229456ae3410a35f514eee9cd70399f776ad970091bdf1ef92a372e6cb632d8fbbf4e9b2fc4372c999e4e25eeb46acf36124da3294bc4a7e0b4adfe1b24eb8ea19a524cab86b99ee99ecfc989b8a1e4aa939476a0d8674293d8ebdb8177a67abd089d44a8a79b34b32f3a33d1b9fa49be859eb80882fcd62678d44dc5aee708f11069cde845b27c7b65bbf34b28512c286fd964e7e65d89e11b2027512d431ca35eff7999f7cfd3dcc63bb55d995cbdb94c06c23f62acea3735c45a5fb5195f1c2d614dcf54e6fd8a4fae99970dbccff0eb8a9762e551c5589df8aad314348f03afead27dd3e5356611a9912cef86c537f3123f91582328e4d9aaee7f9a7906acd654742277a7f05ca845c862d4109355f71b166f5e4a844d1f010b9309e9f3d7b1f296d1c27cbd0bed54bc9a398cd7e9a6ab0994c1570a22993314e2ee1e87780ab70a1c5e0c53714ca8b94e985d79cea3456af19fa48c39ec3125147b2c87a7e31a63fe25327ea0b2a0b303bc17c4bb4de1021f5a4e795abbb2f1a4f64733cf68686527a76065a3feb6fae9c897c2c09f2b42760e1cf17422f10c5a76f66376a6ac74d2593a09aa4590280c7b483fa6bacef0ce917cf5e32575787a84f8528f2904e21b63619491e36634c9b0575929a285764d263a196125eb0fa996f0d46162fd36cd7db16761281a5ebd6dfdbd8b8dbb5cbb7c847648c7e8369ac7dfca9a3ae63232f8a79ce54c69a98627fa443c4da4e16c5b498b783257c29e7434b93e42feee8f1bc79570ba15e6c6189aab53018585b6415ac8f95b07c7e9a501a3c6cbf7aa1695c4a7aa6c2e264c6df523260a1cf68f0f1402926a6a795c8b5e5bc2f7042d0305310e2d0a4373c3086451b727a5d9b54d4598889fb283fff65fda9b68b44521b195d7cbc1bb84cbfcd1ecc8f4ce21037877deaeaf20eb931dca0cffea454a3ab9869ce6bfd650b43397c4e3afe00bbeae268f0e55cda98eed7cd5986e9e74aae14f800bc0e96fd25a60dc2d6b6b59c7e8af754fae88e6395c5c180a8b8621a12fc953f533d9272bf8e72a13a58cbf039eec4086d2d1edd799f5a68e9d20832332a05f13a27cb000f9b6f5bce3413f7b64867a7c05a6f649fd3dae545455ddb8a66c506f4f585bfdc408dd7c7e6b96c2801b61a31decc9a183930419fa5493ee6fe820d85a996f2835ecd3d5329f5919b5bcfd9eaffb25eebaf7de492c59a228a45b2557b531636fb4f48e59360ec7f7c4aa4c37951fe0438d84573a3f6ccd653f1ae0ce9eb12bdab98e30876d0be46bff6c628167f9030ce54648c64cc4b51c02096ed20a49851aeeb3c680d3d8734435deb18adf3be6bea6edb935a2124fc5160cbb13eeb55e57f64231d8b18bed643fd90474e3e2a4311a86f269022585562fe0717ebba9f6725787d309b5596d2709a6545f50ac599727e2971bd43870759232972c7c49fadf906ee9dd411a3af87365dbb2d1ea39c41682632aa5014fc93acbbd2a8acd97720b860f25c9f09fbd2e2c1c3a28818ef6dd23820effc0326f93b46abdbbc4a5f38e6cc99fefb4f0c0177528aba2ad1815465e2e533f8ebbe4f8b328c45fddcb7ab7fda4827ea83e86b621d5a0e1fcc8cf02b758f1b472c5e35807974b1d7cc9f5de7169f0580d78a4f0c8fb0d8e766f938d7691fb7689bd225a9c824e82a912ba9a5898652ebbc37b90cb79899b30ba6bf90bdd32af65ca241d2885834c693ac8b3cae9a635ed0f74ff3ae29346e1e2cfd65f678e60643dd9ccd4552280c1480df6a755c5b277652389c3bb17dfca2265fa71258ccfe02c91a2363a22884d954b0ab71974cf3f3d958d7cfdc44677f219be61b09c894e0801fd8a5ba3ef585ccdd0bcd780f814c584fff874a21a310f1d1bbabb1325d74e771863c09690c8d40160465ecf98118a327c6b6e8b30fd744a613ed807132a6463f3439bf9e3f47e589e9a42f00a70473323201411b8c30eb3508720e4ca04cbaf08008633f188ae126810250c86cf28c636a5ce342b59e22c7ae4f494733ab03dd67593b8336476d18a6c917ef0dd7263b195a0748f16dd884d69213255317c27ae624ddb465f085b76f2ef71f631f56ca4e99d03de891c8fa6790beaecd089bddfa8b40e34f90bd03f05a5abd694cf25aaecaf75c1682ecb0d1db4ddc66e471c3693155e7279bba33de1a2baddddbe25d3d1f3949ca9c2a987a538d07f8e6dbb51c82f5e133e6b91b1158ede8aea996f5b033e2343e9029387cf0c5d74be48ac3d053ebbc0ae5c6bca90a0675bf5bfb4695544ab37d4e88d45bbe112bfc5c8e887815a2b896575cb50c446abed078d4e52735acaf5aae6522da74a014533465f1bc25d7eb44e5599bd0a37ec4e98f49ce33e8de332fb46198762711486c96fc44fcc3dad45f5e5183ab6fad8bba272f0159e7ab8d240be61fc24b7fbbe93e41b2a54aec57de6e8ed9e4d9c6bbf69e645007afecb06235f5c213e567843f053567ec97d706aa8c4df6054f40d9df8deadf5392a0928e25885eb6adb4e2cf4af1d4de89a219c70e6a33ed1e4b84f8fb4818dcacdcc3106836fa2975fe05892c54aff2b939aef2784a3aa609daa939fc4eea879fa3833a2c2f6d7fab5d2aee506b1cc4bc734b2f84c2a21972f3a5c3b2a9c526eba2036899f22e3d202479a9098b5ba00c3999de146752398d78caeada62bc36e49d0e7956644b23baa8bce82de168736941d94eb15db30f10f82724016b071b16372c1da0c4287004f68e7f457e17fd7a38ef41a327026f48d3a306c0dbc3e9c6c34a0213832619afd5582b48f548ba8b11142e06efbf801f1209c97b3b0e9cc87539eaa3ed938a0ecf9847203e3687165802c83c7656863066266cc4472a9cd06cfd93c82d2d47c5dac04ce6b1683cea98eb310a7261022ac502af7d17a66bbe213f2d1e0a08ae4217e3143906cc471445f761d524b47fc54552943551e3d356c3155af591997bcf3c2aa5d8f0be2b32a6ce825f07e14dd73c4f20b34eee5080da88dca3ec2ad6c517556a204750cd8df39895dd0232bb3bb51aaa1da6bf89c755a8dd34e47cbac8c5ba8169d9b25c60167599692324b835605c5c10cec6b3c07319a7f1e0b80787446333add4dea03c306fb110997a434a0187fbfbb4ca9858c8eb9b4133b8f89a49b9a0d106ab4c3ad3ec6a6ee4353462267b40eb10d6aecfa0e0c9af47d8d49c3a149f5f5ccc05c657dd2e563c76b8323ab327b46d9b802dfd5ac4c3a2f0226bf8769186b8a825325b649c5ea4e035ba1ac889b1759fdeb2d9bed480e4e5a1061759f07ef0e0140b86b60bc0870c646fbf013ddd2c8a37c9e20b5460650c110fc3f9291f6b2bb0704db09f9518570556fc2377242a3470535994102f41fe3d8f7640477f5fa5c119b0c48d30ff1d121bedbd9e75ed32e3fcf646749c9b74666a6a90ae94a5ac0e4bfedc12ceaa0b38e8e2b6e9787b93f19afe70a546a764651b08ff29d4ad9c1537e722a7b5be51b6565695ef9c3b16c822cfff61dc35d5243ae9d5ec9133d9875aa79f92c34f05d652ac4abcd6574f94a4f191493defce835c6d0d6b673808796b084f48ef003273f2dc4b3d328d0fb3b5de085c01d1a32d865fbcdf2394b3da8cd861883e729d29d51ff09a473bddf4e12423f551d435b2117887f767821d0e58bfad88c4f87ff164db2e67cee8c34d96787f36315c3495ffa46a0998bc6d52f7c60db61d8640105e65a34e742734f51b8a2b0805bc171a02bd0e8107ba96eb6d081a3fe19302f2db342df14cb43d628fd27693da4500d501baad387f27a58da2a32b8f10c0df9bdec76386fa600bf084f95e8ff35d11f9055b512126ce68445387a6ced4c99f03a76e3ce1405c55bd2c716af031e4d86e38054c54ec9af3f44300e4e693bf1004d2cd8af2fa45e7d65edbf5ebcf17473cad9b9ba3d8f4c9d3a4ad6845bea3c1c822a015725fef4dc58e6fe0286a73db9d4dc49558d3ec5097b7e49a8bde33b414d72558a28dda46a6c3d3dbd31d042f737b23ad1d60ae54cb95914b4c657670a5e6cb25989a52a41dec978d9bf4d0ac17be1b9f789ee8f84d2dd3effb6f9bb6dfcdbb6d494ed627d1ed2788fd7ecfa5dadeaf7c47dec460a50354f836570916735ccac08b7ff197963002fb0e3fe6a33326589b17abc28bc0e24e2341a600f4f32597e9d53d7bc33fcaf49c9ac8eab0e6aaaab703a078a85563d41c1f57160c722c21e9b5540af2424b836aa6ac1e805f75243e2f9fa4326af4063f04be178c9e3fb0ac1c08fd773551e2fdb0691d4600def252aa9044b6d66a5de95ebdd83f1d25290e3c82d2a5aed89918be3cde7548becaf729197c8bda0587e9516e47ba319965b8d75d3242db88aba6abfd72ca5718ce01ea52a781dcc7b1c1335f72d0e17c5a0e105e041175166115ecd801281cba7021902835724a6b200964b97971a4c5a4572ff85e665e87cedde753aa37d460f787fa3978f36e763b98c06d10cdaf102f567f08e6aa02fa9fb7fc41a47cdeae1fa78cce5f5453d57a22330131afe84de9cabd5236147ff4c181f4faa6692377348ac46c2f9dfdc8c919d3b11a43efa60850066cf8084157f3427ecfeb3b1c8cb13b3e526beec11a2670e9761b2ba10bdec6529bfabfd8d335d6312eab6c8bd94c565704e7cc7727120f899955ac066bf8d32b5ac573528f92aa463611af9a816abbafd7deba2dc178c42044ffbf73738c28c48fb4f0571e200727b4a0db2e9fe07e41802fa7582bd35bd99a2e9ff218506e2c94ab01f12097352a5d1a573cc552ea6ade041d83e27c474ab993b1b3408bfba160d06810197a8a7710e7ec238904399e916131129711082cbbfe4fd800cf28363613d0b33f8453d44b78bbc287de383673a8408078d9d477599cb050a7817088d170aab5b8816c0a61a56f27940e83520aa0d3bbc8512484256eb9453ed1d650d6a09f4811858ed6e8b477a4e6b39dde18ca2342b3aebf86aed979340498f2af002e6b4d85c17bbe0395f73e3c5e3e6d482bc07cad004203d9392a0b12c6aa5162244a94a2aace447c1f09fec81b0bd496700951f977068365c4cdcb3eb74c80fcab44aa30f45e0260a8fc3db9811bb23b0f1cbc040421a2ce28c3de4016356625e864b77efa761bac4846c6b7c74e2e97e9ff89a7f19a61d142ff0ea4a86f4f6814ffaeca33ebc9ffbce30a5878d006291d730c4ba079a33c5b968bc7b718eac9087996098e75c184b5018cac845bdf01b58c8b7c1a3ab00ab42ccd4022fad902f73047cd94d7c3ff27d93b791f444a958bfeb9a54e320acec100b1ea1b767ff8b859b9aac33e741c0b6af14b4f9f98ecde5ee8a55078431c7cea61ab7ade8c355306abac2b514d235918819946c1ac625123f6a2ba5b4f04a7d0621d25d953fde645c623653f43a04dd89de1dc84a200da3ae6c6b7238404a32c2c0e4cfbaf9718eeac4596fdb611f345d43b619446232f19f472de71e2ff220956c83a536e752161c18a80d2807cac0c6c23b8b82903f852d2f81a148bce8d3f69f86bbc2fef3a057db7342a6be647cae5d63b5b2fbeb8e1f0f05aead63c9d612b79b44acd4a1fe22aaae338fe1c219a7fa32cce0be0d1081da215555b11f4875483cbd0fb9f2186ec7b1323970a5824c63ca7b406e28f597f1c4e85dbcc3b6c5e024971f87c7e117723583f9bd86004941aa21a53bb3f13a75a01673f247970f0e14b924b318b291a20a762c147cb567a04191ff30c09146e1bc89ec7e46e40ea3c6ad63bd0ee1adc2f8efc91b7cdf06d0537dfefb86a515a7a676b1c3af107ebd9697084a504cb0d98343f596e23ad739de530f92a716e544c85f2aa01e226d4e15f359451d7baf5e5197950d242766c610bc0010a94e4ca5620ccc3d4df386392352064c68182b71b6984733a7402a8b2e15b2d488f416928201a141165e4c20419f52d26fb5ab386bb6413ed47bb3fc1f61c5623a5edc139ac1cdc0686ef2195cc2522413a4420700d81fd1486c5c97810b0279b761de14dc35742c11a5d29693665a7350dc98d00d7c3cc325a3d10ea385f4288359e541db4f08553c87f65d37c355d8ce38c9c806f7c8903cdba6ec426e2ad26084908290df2002b574605c10018a9d31f47912133d1b333d323cfd0af3f06c0bc60ddf39b20feadca4f7e4dfa32d2208e92b79b5d2fdcb1f2de7259159eb0f8cd758249fed36181e1b40797b0a2087b3c46c44550cc521c8b82534740be884d229e88ff9540df848556fce11c731d4651ce85f1036f5bba3fb17bbc396d00727e5cd2675e51dba6044d3db02ba554ceac99fd63139de61ffe501b9eb6501a0649eb49e3c83d73bc6bf2a8e712e6bb47804e69714f93bdcf4bb2727f1d15eea9968b58c977d37ee25a89eef96a34ada4304a72ab14fd40b117e42829083957b151c69c2e240ab90fce6958afd595c0cfbb15fd79db993b38fcc1c304b475adf1322866fda3283f3e47a2f589270478a4fea0d881b36106318735738eebc26f10a7aaff0dfa6d51ee25db3149cbf09216801ebba21de80c530240ae1d1d0f9a9adc8113ad50b06e181aa1cf699f0e4cdd035f5c5cb309d48b48893f1c15cbc20be701cc8e93d6edc16e4d21a160f64870d48859b5b000f5ea9363f692a00ceb677757579a6f825b0367fa005ee9b742056f46028954d56209d2b7a80e95c3c842f122135e502ecc75e54beef5ba524f19f8bfdcaaa70b7a431c60fac0ea183c3baa6464982cb8b988750a4f950f456efb367842826c3ba8677548a9457af2739307119d2fdd011f145c786673ae8a1f315dc7ee21f87d71118a9312d07ddc40813383293566e27d524ad5dd8d8e5bd36e9bd002644f9e0a1dc235e5bcad06090fd491cfa43477f0c5f27561b8d08fab49725866cea4268ee969fb5634eaae762c9e30012307ebe625153f32c908b827924822e5de8bbc0c0fd66e07afc4003baa74b724690197c4f4f378d8ae1674f33a873abcaf2a97829b7ef86f8b1ac43649d330865c9271db4c6c6f6adef84aeea3313475714ad021a80961c78bcd5ef047b85cdfb761e7937ee11862bcb1e053bb6a24fe0cae27078054e2877b523f895a10b599ea058b7926465cbbe53f5722283b308bb31b0d4fc22334e42d23a869c43533810c89b5f8a6962d44a1ecc7b3ca5cc5f93949dcf78c1919a9e70b2715cfb7b81891a4d359f118b47afb9e454dd432b4cf7d0e289eea195153fc1730b9b5ef89615b997f33289126fe9e6612dbd1d5431c70506f32398856df30e0b2fb39b4eaca965b2db8790416890ffc675074edf2adfe108d1cdc3b3fca34836ceddd840fb5c5d68abf02c6bbd906ace8569ffe0934c810966f9d7a8df876cd3531987822f9930d4006a9664d3651dc8fa0656cbf2181df23a73cb8ac07160bd6fb1b5ebb5e3200be69e6f945bdebb1304d6100812623cfc9a5f63b7fd77ade4c0daa699bd19449022387b5ddbe7fba8108b0df02454826648dd21cc60ac576f74bedb31b4133e2750f044b03070551ff2aefed6a4932b40fa0dc54b6129a8a5efaaac2de3f4224012d9e9001e2370f5061ddd48df5d35bc7e5a23d23065f566ab08c76d78ecfbbcb2c7a4aec5e9c64d04c5b65b9b7b5bc7d7ed25899006fd1e35fc09009b373db7c1add3309af695af4043885d4d619a7f2d705a01c30f756ffeb98a20c8adc23ddbe6548c0265e37e8ab7139e4ff7089b69e7f4763ce259db57fe1f7b7be3ec02d2062ca724c562b4a9a93646e95e84ce3470d0765fdf6ec8797be64aaf7a10708221295434a54404fdf6ff9ddb30cf69d4137b01d8d1925c684f88f3529bfe2cd81f54080095186941ae653e74394664373b9168b331714fed135fd27f4a4011e416c74e437acf70461140fd11b46305de4b84070d53205c154d73d97061298338c3955571a419aeac8a8387d8b0f8e00c499ce1c27264cd3bd5916764f5812a0054804807b8e463296df32d73d9c45feb243db301c0221b9052c7ebe3dbefb5bf1b69dd444448c80e2c0d8f0c050d351a05f37011778110c22215f67bef3dd8f71333f7909454b8788316424a2ebec3576fda2dffaa9b817423d12b0f33fa7a6196de49e5fccb7a08c0c74b55512aea51f024ae182fd31e02c8fd4ace3b4f6f755f2b7a379c00fad74d7102e857d52d5ccd54f2f46ea4fca21348241289448a558cf155355bb4a452a9140c8a5061733fc4855993033980a6b023879a542a55851532f7b5138c41d2c8a8c209ba6099c8940d3e5c7852934aa5aca8c172df2387984aa55231c822b369431127a9546a05459650731fabc21fe0a0934aa56cb08329d49a27b953a954aa065ab8a62085224e52a9140b58be6051a10665d049a5522e1003cdfd4a068d934aa56c7031d1729f66d136a9540a0675c8dd9f4b80508724a954ea063be00328f725145e4d2a957a412a95031570f1924aa55cf0540a06d00a3c30c353a9140d8b0ebaaa20e9ce6ff1d5122db2c87dac7750d5a4524726ee49ca126330b02e6f31bf2988a10f19d62c213796840c5246c52456c4505d570e47fd24a9f175cb770f20e36cf018431786c82fc608f10e13d823f34020cac19c1c20409c171108746dfa733f1a4984392de71cae2accb9cc870359c58839267dd7a7172386b71705cc421c4e6e13549ceb9112c8fdbc421afb79541293c45be5ecaf29a443fe1c36813a5109f686f3736804d23479af87513617f9f3be79bf1e657cb2e3c4ba9cf0f38764a7fa8434f6bd52ecdd8fe73b3a7a3e07d227cf3f9fcf3d0fc9839ebb1c0b4804629edf3097c9e8e4cde96c90e66e6d53a333ef8ac43252c00931c4d9f976ae9c0bcc9ea70df5bd0bb3b044fa2d519d4b75ce391723847ca8cf89752258ca79b3f239b110ab4eed4272c9f1a50885ea5c581ae608118bcb2d44d568d3ab30c5304f9ac1c61f65389029736c9652ca476047eba1d65802eb6c3829ba54925ac03a7948e710d4faec43d54f4c4959458e324736d4faec7bbfe788f4fb40d3db0434c1f7094897e0a77338e08f36c1376185ed6fa492bb0b49ca99c9f47b0fd68055652d09556a132c391b32b0fd0d93a7f817637c2f937f59bcbcb442cca54f7d52bf9888a277a9ecee044459b874bd98889f0bde0d781be38bf1c5d8dd8f994cc75286d5d20b4b524017bc1893bb81850c91d829391bf09008962663524559cac13e52e97a533b4fff639e569f24eb135b0751f413bb1ff5b3e20a9ae075a16853ff9d12f262cdac334f8b544d27c6aa2ed5c4863ba872c5a34fdf1d8e99633ccef879973541c5ca63bce6bc15d181a45ce540481f7d473b881201117ec4f8e82258c12bf62a32065eb178458417a0f294ff50c129ff31fae5e5f382c9cb91721403611f0da4f154241210688af7e4647b071bfa8e1e5df47828208af40851ec37983f248bb7071261e76cd4e80a3a682a750974b7e738e478149753cadb372cbfde2c395c294eaec831e5ef0ad2e343a9344dce7bf73169537cca7d4d9ce4689dd82b8a1997e9e753ee522ed6a6d7a6272acd0af497f3f877d444f68322fae8c63641cd7eb6a7647b369bc5aca84befee51a04f7144a2795cc43f58d24707128146a53c94cab9e852bcca7d386d8a377eb0b14befc68a46a5d08c1e512efaa84546ba14e3cb41b9db4392a36cb2e3c5a34394d8e5f724fdd6b8c2d05557d53e58d123cae39fce23f5a71f450ffacd76299ea54bf1d8b3a35cf4cdca8d59a03b88d26e15454fa74bf1e590c16ed6551245cc9f1ccfdd30272880679c903eb9962b7d975decba2e2fd6998c7536a275365ee7cc642a29ad977272bb1cda330f56deca81b72a195fec183df2d58d995ed75b949fd2d2c808448db9abca5af8e00b8cb3305b7431c360dd7b3c6abff65dc0021ac26c26c21863742c1ed75dc42f221d6293f8456c129d442796655531beac077c842fc94b42071818887210c2d24ba9ffeee4bdf7056631a50f49cfc708238c30c20850d42e2c6336539fbdba1c9fe8123c05ba042fe4ae4b56555555e6f9580d14ca960069d1be7fb62322185b7492e5296c29b35bc52e2c169dc4f8c5cb4da49beb9d8bd572a858eb2b8743084cfc227ef16e48479a151119d62fde8d17bf70e2b487656149db79b797b779d1e3dda2c532b5de1f29f136e4ba5e391ca05fd6c2db93f5319b91f7bc769344a2cb32aa5837a5df01b5ba24bfd34f3d855d6b7b2ed6255885c166b86daaca663a4291d8b1634ea89794899aab7cf57cac060a8950309a21a05fbdc7a7459652463a08ea0b0b95ca18efa169ded93cbd60e5dd0fa00484f1883cad47239cebeb3a5841537c75611caafa7c09a22a2c6ad33c9ed3621cc884ba81973de09e5d911dae9c8d5c3b63a2f316825cc9d48875d6a3ca554228a584b2e173504218adcd9edc78bb4026d2ef354d7e773996c06e36df5784c660ab724b01ef9a0610d5b94c1f169c94524afb9fbc04667a58b1648735d62fba483d5897e4adb32c4d255b525213d8f8470351454878392fb34b49830a5d56d655ef5a07e8d8330c6483c9f2a54a1a2ea294a5744d308b943f8012770927afa64b12c279a7e425e9927c496a962481ae9d8b9c44aca65da8f3ce65fb192cbd3bbd9b19e85fae5254064b65bdac5864557f4b6a8ca119b132d5d54f7ca87a57b112d0141fb185e56025cb8659f0eaebaac0852ee4ebaa24615944e8d78651ca381bb38b9b2ee80e16baa8c98d8774967136e26b655d15eb2bf243beb287338c8b1c3dcee33980b3115f2126af145d8a87778a977a54b429de9281b052bc54e3ed559163fc134a44ab5673471c82ed6cfd7afc8da4ed8744b0f09bcbce467cfceb8c3757861c1d1872dc9c1672fc66edb0b01986857f07106139beb31d7190538978b923caae54b0a9c9f3d52db15628b1da4d9ed76e204afbbc860351f6f35a0e44c54f21f2bcd64473a2ddc1e1c02ebf693eb0dbcdc9f337e7eadc350841e37094f274f4b91d6c2ab197920a834aac0f2c3dbde5beb1dc0c91596eb6142579dedd20728a9294544cd96d9493ca330aa39c3c4f04113bd5ddcc1a206f3fb306c46b98087b6ba4a4404b609fc5a991b13824b09badc1d9ac4d626b200a89c3917dde06c1e1c06e6bac8dc98a36cd2bf2cc3c1fab814222a8c4c203207b3e560385442832522546fad403c8288bd3a6f99c3cad6f35aec8d35674ca083ba7bcefcbddd7402111ca2845009a65812c2b645922cb42b1ac9165a55816c9b28878522305519d04113b44ecd43052a3265ec1461fd8218a1051e370b8c06f4234d9c0cbf5f1baf56cc65e617360459f2c237dba2c187690e72189e57ad79415d996575ba999ba261579be6791a982c9822b499ec7c9f3edb9f50d54ce46db32b8989494c5b15df4c9f3799be3707c524a70863c5faae1f9e75dbaf589a989a981164602c7f38fe5f9a4a4524af0b2e5eacd191ef23c96873c2fbccdd4ab5e43cf8926cf9f6870dc381c34f2fcc9c8e98a53cd05618510833083d003e107420ba106a156230031353135998827b508bd88d8b935525d9a313595a6ec46c40e113b2fa64900dfcfdb4b923c5f4528a314924a8c950dbc3062821053d327f8f9182c6290381c55cc10a012fb9cccd71a33703116e7dd9870ab51835c8326cf1a56e4f98a725da3eb4ab92ed275a95c578ceb5a61f101113b10f53e5fa38a3e5979fe2589c361caf3355235a8c873ab5124cfd71910b64078082f8418421a10ba4018047cc5b218067b9823fa1b8cdc99ef5b048e7d41e270c0cfbfec381cd6e78f108f90372276f27c7f94381bf3d20b76274f29ba34ad97caf316e79120cfcf670230e42991e4f99d26ee90a7fb95c9582f5b47eca17036e68413c2e99ce4f9251c8eeaee13010e3b9b1a0084519dcbf6fc622c2a5827355a5222bffa66e576b4931a39be94490e879d537661fb3be093b1317ede21b2659197837888504a7a19296dd9a4dcb8d4257937b7244a89034d509dcbe6a2b5736600066fd5a9f5ee392d9735de94c87d186b42082184eff3d1b710983c4bf074d2178f509d4b9c119246958e94d8bd1b12ab2a0c13bfd95730153e529dde075c20ce06049e09bec2524818c78657c40b25b274384d4028e21005147dca34012f1050bc7a979aa830c4a1b99440a8840b2595cb642a1c67c3bae912b4b8d8dc0dce8b29526ba5b1bebe478bd058034df0d62bdc49704ddf527737bd96bb7137b04b4ae0e0e0c80136a99c8d4de662880c9bcc26a61ca70d0a9e3a3a38d98bebf5badbc3717d6531de19b9428c62d6b57265b3246f01772a24b1ca2256496285a4c2e2a257655df3a29e7ebc9f6c31502b993a4b688d75e916d44607a2e8122e9a641831551286554249d70caf84159a16b1b151a2243e2f9a64a8648b880449d39af762bfd8fd30c5a20463bfd8340baa45cd755d530c4d776011d87407a2da499be077526dbdba175b8553a3937492d8969225ba04ff5ec4a174a0748861592b96c56259322c6b8665b558d62deb5a16be7136de92f9bc786e473f9be9c4493ffca44b905231c1e8d2dcc1916cb017de1e17d05a1209c608213412af8858442be04ec490090e0ec48931468aab9a67d35746ee22c3575dbca6dfb6ead697e813ac6a8a74e98a4ed234eed4c4587d1b65e73e1f2a2289454a998b6eecde0d5a139140d474f2b688c47242c1b81b963777f39ecb690ce528982a8126f86fb6c88bb1b07b3724ae6abaf4036703fedd0a08af5a4286b77055840cb3ca08dd813bb97128187ddade29181d99044929f02e2ef10e6f2f32f0560ae22d783b8637123e096ff6a31c1aff0cbc5518bb36cd1002db18c43b62d7261907c54fcaab9bf2da0d618c52ce4969555991cdbc3c229247aef2a4dc41d309a040024dd17ac115bf884e34fa2ccc843112331e2f8f0eb3199947d7ef23032ee04ca67899cdc03c9ab9802bc5370f5c297e8e5ee9e889ae7136e2abacaa5cdd2abb2296529aab4bf39b73e6aea4941946cc8a31e67841087375619613abdd9dabdb79663c46d8685e745fae3eade852fc28a5e2d14680f44934c4e556652937d2697c2b65393fc48d6d9aa771e7f19d13ab6eca81f4c9b2b208c74f9a3ea53ca2845642219550e8f57dde96f74df438c8e2608cbe69796cb9a7e5282d6769f94acb63b45c25e51981c92d3c486fc929d7aecbd9953d7dc372635c95bbbde4ad6f424db369796b9a4deb53cbafc7964712de84c0c416d897b1b7603a79c69f5dc15e55cfaa47e532ce82720bc23b95807fa9f4f2127a0ade94c85bca85c0e4d06190d05d863d44a15028147a4086df1e9053422117fcc3890cefa029140a8970ca4340320c85429b12197e5322a7e8a060979fa243c88137e79c73f4d047b7c7ed4c84d50cf4404b0e7dd3728feeca0282b8cb7f04811d34b9e01f58cc78c8e9acb311ba3c5e18a143518b8acafc0c95cf5051411102b385b01098ac825d973c9f286f619128380e81126f32705c9998948018273d06894422c5207d85b442c22a09d7afd4acaeacac1cbebb05da31e80faff4c03e8f65d92b0d7b95bdc25e55cf422118252a0acbe8152506e97864c9a81e1416bcfd5884b712047dde4d084c48c35e3dbba66dd9b5570d66323025f4ce6815763e843798ecf429d7681516f40d2683b49b92828364c74042607286abb77c076cdbf2cfdd94c82d8f99ccca0c180c6bc11ea530f473ce395b5e5b280b2c86d11574a630995e22b96920aa6fda14bbfba6696e685a482da216dcd2d2d2d2f2ce645afa660576eb1b2760dc7081d3450e131d2f9ad0a14f176fa2dcf2f78cd0d0ccc30c29d0a739e7ac0e13dd4745bd2b0f5d957b21b1108410ce29b0cc7ac42c9a532412fd25a987159fc665e833e531313c60738cd067c5338443585e086d9e13a08de8b6e0ede596cfbbb2f2fa56b2b222b3b272ebcca2bf2982436cf5dc90bce78654f07827fa749a6d0364b6cc4ca6e5533c27767a40e620f310bf548cb1aaaaecb9d59c94d2ecb994523ae7cc9e3babaa925266cf959665c518b3e7c6ebba2084d97361adb5bbb3e736a4b129c7523cf029a147a04b72c6096723be81f4490af1d15da35c8e72d7a820bed93c12e2c636c14bd726970b2906a272ad0c49342ebed2dd908f514357521ea2cb3b0abdbee5bad0bdf2e82c7723e5118e225e99fe7afc4b51d12751ad1505f665ebd44a21a1c9aa76eda128e312e52b2c9ff1fa20a1a73cf4f91abaf2f3421fa3a7fc6e4e64f95155b9d08ae829785b9949f9c45b2874979dc855f528ed39a194314609e1ec7ea43f9594932840bae8a1fb72e8be4c8a81452a787322a7bc30b2e81feb521e73e20490f8087891237cad2feb41fa147d86665e187924a55c11611e2f8c3cc21b786154d5a3b4e78452c6182584b35b8aaef25a8d54443776297497cd883e725d0a7dc443f4d145b87236421fbd30f20e18baf2a4bb894e2fb32558947899e5f250660a7839a4809772b7d04758336243f8d9250ec2f2110e825d0e91213c446616ecbad4225fad4bec9e4bbccdc07108cc1230f1ca5d960094af7c0479657e45de95d061cacae57ce810056f22c82bf7bcca12d079e53201f32128720ade3c1f02f3cab70865ac6019f7c8b8bc32f0360466e9398459822494a04b8a02bbe2e36594bf8cf289fff04a0f6be2edcaa1d035946b0f5db3ae690f1ddecd893ca78805aea8880e8424c2a3faa9fdf3141494bfcc87754dc35be828285be828af28776b98cdc0daa3cf9bf29e4fd901e1bcfde80609bd121da58aee32263a8b7090d0ad8987c81cc21ae8da2c3f7773c29359d75f66fdba8d83fbe6c2bb3dc3585596146f729458eb4cfa860abbb99c1b98ab4b240381a8a6a9a485a4f9482310687aa9ec0490198b0abbb5923e6df14dd3276985912b6ab0e81392ce6265de652d7e9ce63c108703939f535e988585a9199d019a1a8bd8aa7294be395b4a1863845076e7ade2f1a1452291f75a0542f0c2d27f3c1e293fa24b794f96cdb8d3c73e4de9daa64f998c9ccf642276f77aad125bd1c9d3e864fc0e18efd65c583708f61164193dee56bcb5c47930cb490bfb473a8cb96f436290ead8a56c27540eaf60a787f20e6f3d1cb5e2e92f2c9bb1773563823a19a9b58e5e116fcf92d29d56eeca9931e79cc3f4f26ed63dba6f22c82ecbe6226ff0433a88f5116427ab5f2a3718ad4b0f3dc4433abb5fba5b8f32c6a344b7eee4dd9c73ee98254fb319f7eb4f62f88ff67741ef1bbae7d6c718b147eb980f792b46bc529d1e5ecd08158265eca0eba0c9a3ddd8a60c6f42b0ed6931431fc4c2d861c60496298dc7ae2b65aeb60fc45c7d1b12618565ebd5ebc322bc849574f24f0bf9eae5e869d115aedaaf15c3bb61437275ebd66a55ab5ad5aa56b5aa55ad0a2dcbaad6557d475fd7b2b04c31bcdbdb025e12a91e8c82bcbc1168b211d961a10839f6f38ac963d7755dd775e1f73c593683f2f8f89a3ceb346ee817caf19d7f02a25eeeff192c3148a3f76d91b1a292f25a2b4a29ad6e90ea4494563007a95e9910fd8b17432f1f8d8bf0d6b99e06de3a8f1ee9c5782cefbdf770ad5e2b1f784554b95cbb831e7b07b3d23fa68312d0e3fafb7b933ecd881dd2f9d55bdf50322c6302cbd7e53ce826bcbd94f0561a4208bc9182b8cbbbf5f950cd66e48354bcbd8c092ccbbf9ceb7d1d74fd733db3d73d17d6e4fbb42c5953c92cba2ecf2c7aef3dbc452253c8cb92f149deac0fe920281f417e31eb0133bd2cbc59dbdbd1316362eb8c72fc2d3ac9d6bc45a5b46e6083bca35c5e3752044d8d2232c5b2f304a471945f37be8c099477bdca6650fe1d90c60d1d5fd151aecba0bbbd5c7b3d4700706393272edeaae3adb233f06659f0467ae9e52587fe526baddacb5f3e55adb5d6aa799e7d83c919de84c06409a8f7687825bba806bee49450725e8de7d74557336285c0640bfa75eca19bcdd80701e1cdfee5685da446a75c76726bd734cfaf5bbc718048f6fc836187990c5665ce66ceb60fe4ba15e1725d04210e528f0981c9990fac1e663d64aef7dc98b3fbae03e0f56145bc864b4c25e15e7e1735aa7a6c62659728df07806b2dacea52bfb6cfc9cbe952df7e6161c3525fc9d673d228fb3679771913558adcaf3ae912910ce15dec520cea169de48ff6aa618f8672d04f205ac1f6a0ff10e1107cec68e52b94d5cc642e4dd3362ddbc3d3aa9af1bc6cb3aa55396a34476de6a8c91cb598a30673d43a474dd3ac476a1eec9c8dbefbbcd8334f6ecc7d07ac9787ccf4d7b54eb10dddb869790491c8a72513abc6be6f6532f4ef8270ce3927adeecb4ea0b26dc246e7c546cad8032275dee3e76d024897e25f11f5bd26ba1437c7c407cc0e1f117d47cbfba34b6d82c12f5d9a51b09bcd714e29a594eef3c239e1dda39c16422b71135d02d246c41f5d8a8766880ea7be891f40e6adf784389c5c1f85cc42c460240fe95c1dfe889722601c8eebee9bb359e2aabc1b4cc6ecb71af9bd80e4f484421e2941337bf6d65ef9ec3be014026359cf7af26e32894cf2879d8fd481a814dc0434553b7db268fee04e960c9c4563c9c09d408f6f02a240b13fadd90b3f8548eb9257e6e345610a51e8cf47eabc8d9407174f95932efd3deb6ed140540aae76ac22551edcc96201ca957070a678d1957670a668d14053913e491d8b05ee24dbe04af131cb36380907779a833b5d7b4dfb6857668b26da1b9bc40bb3d479f9ddce52e73dde97251c1cca0e363b691d2f877304d8509c3ba24eead1ee6846b9220dbbda449fb4c7ffe893b58f289a116baf1df47a598fc5ae4bae4b10c7e1d01e4f6760ad86b7f979ec9f0b3f3709468e7b100293641977ab5c5fcdc732cfc76ad912208c6608a8ee88e849885e4517489be2cba25b449be211d15f204a84a54ed4115dcb8a3635b66890c478a923bd6854116d8a7ff8c507990c7dbf179be85377fed1a7a62738a365d777d56b18e5dcaa0c1f96b77236c860e1dbaac129d0c9f2efa2ef3d9aebdffde45a61b406f6248924c3cbcb2410152f2f6d7c6037529604c8f22496bbf409bbfc8be3e2069ae4b723b29417ad97b5d65a6badb5d65a6bed8f689374f9e04de2640fde8ab0128674591e07bb6159de353c3d7de9a54f3532fd948f7db2320458d5a427d140ea605d4d01eb52531ad88780240ee45e50a2c7eaf3ed524094f688b7aa12591b229140bf2d952abc9566aef0ba2456bdc2acc3813d5ed7758d30cb53f1b5b200fbcf7f58fcc10e9a7e388867152cc51b3cc4264c52dbc2f956e523f226896f458d82f615512a05a6ee9dce5bbd2c266fe52173cb45af214c882bcfb82e7faecbb45b39922bbdffb2b8d2c39ce9cd9d5933779c70f95cfb10593eb2e348dc224f0289e740023b672af22476e0e74cf49a0672d4dca39e0a89eb92c8715d12eec927b97036b8e06e78414ec1c92a381b7289bcd96991ac229345e4b57275254ad6a342c9642ab50407a4c3d4bfaed471366e6cf2c4e2c5c835b81b7dd90620e4fee8c9288b3b3b9936d149c98ec49c1c30b2e8c489bc3304555e198fe4c051253b1295b84049ec228b38382a198452381724608eeb92f82c72a5da84c58bb174dc8d22198bdc67c9646abd57cd850512019872fc75a8b9034dfd1c2824be913c8f47e2eab839ae83a6500aba2579ce6f570d16b0d65c78b3210c9a3bee33775a727b2efccd898ee2e58a2199d1a6643275942d4104fb28f3f1494115d690312c6a91636431268991c9ccc7889875659e0af4d166d890e9d7858615220f71966c66665c9fd8489b117e927b081a2e3575edd0a8a96b47e5a62be70283c695738191fbeeda54f2b2b9efbbbe47c90f92e56bb9787bf9f72dbf788b79c6755d49ba40724521f4015da92b75a5ae2b344fa6f3e4a3a3f3a4b2301b263636d266490d44492eac2d5e8c9c82bbd1974caceca20ace466f3173c43fb0f022267925f3514515ec488ed72b6de48deca24b3aae6492e32e39b0e4a23d50650ccb25190f99a50d16b6ca58e9e7461eebd951399dc321447639bec5d0f10d9491f87665f746e2eab839ae731360e2bedaee6117c44e9e7ff9fccfaa8ccec2f219f81f1a6f11e242981ec45d8678e973d03fa7571bfdf3f9104ee44d5f2e915cd883feb9f6a1bb4191432ef3a18556661c84b71526ee3fa053bcadccc03d2e765dfa80ee3214993ef41d3074b7d06368af95ce38fd30611ffae77eabf2ca0cdcc3e290f6b99fff6ea18b4cb7a67fae9df44a3105bcfcb1a6ef68d0dd40b758336241784824dd654c98fec1414cb738c810ff9cde0d8487c46cc2ae4b425c1be2a2975c46ff0c21048dabfc83b7205c5c288d04d078cb69b4d096cf6d015d0bb5fc430fba46a3e52a2dffd08342785369197d4e3fb805e3abe07f2ec6dbcb1f6dc6b58ff66755ae7dae72ed323eda47c63f3ef85ffe296ef9c32b3d46146f579ef12033cef2d159669c65741696cfa07783e26ad206865a4eef36246696c738e8ffcb7c8cce7216bccdf8ef36e37ffddd3a835e2113f0d7ded31bba76379bb587f00e08dab4affcde20338e627f8a6d975aacc541667cf496bb697848cc3330cb45df01655c9b3f2eaf881ee36e5064d187c86454484ef21098479f91f540c9a3d77b3399948fac255d6a944bef0dca3ff4964d0fece8a39cce28b719e512c9570e445d357d12bd6f2dd1b0b411d9b4a965443b9a0686338c593516923e39b9840776bb6aae2cfab455a97c6151a5687c2e8dcc89233a8ee9d0712f266dea0791c95c978ef6cfe7589f42ffe0edd2a9d1b0b411827d93364f808e69ff80348c7d07a4d9e73bfaa2d6d98f8587441f4884114618997ea54776fa0c0ff140cc187631df0c0a2257cd85c5854408ccea5c39d20647fe42d2a5ecf2ec42e630e993c41716f2aaa13bb07d6953df18f63ed581a5b5d65ff7d299227bee1aa5e31ebc5dc75e319a034bb30a4b9b29b26fd2468a1d1bf395733545e938f6f79275dc0b499fdca5546437d925f3513ddee792bd22d2069ec0a12e34b82b0551570eac4a1b10ebbab852fdbc9ab3515f87c084c8e2bcb48128d0850677e540947326eb8d737d85375b2390af534c1fa7c8d7e9258d5da23f9203cb25990cc4d2e65981a5cda3194225c68a8b1e49e5140200d8cdf622631b4e968e4bc9ae26c95d91644785dcdf6aadb15c8c65f36e7425220244644072ae1a598f3b6f74d5c55c69fe5deb4af3f507b506a244ce64233b6f964dee3b011b598f9b6315801f01c89ab87123938934c75ca7c8d669a9e2673db991c9c8256e644ad497974ce66232e7006a0e131debb151396ee14d08a69323bfc86192e3562adad4f808982ef561ae1c263ad5fa7c0e80bd64ce46e65a035173a74d5d65016432b3ce7ba5b0465d35d0d4f517295f45ee95bac2c65371d540544dd5542d028310c279026432f1f36635e55253bf1793eb5e3a574e8dd24be6c3fa95baa8b88a440bc76a4959de663e0020062188a1882e910490bdbcc401b00c20233524808800993d92e331477c8e22b21ed67cd2a55497fa46643213cf1d1c58acb7b993fb4664d58d7597559d300fbd34653211c74a44353f569ba01912a1cc51ca244d9518fd0820618d4462faa5410f2400884108632041f8de1f8410c2d71f0384f4433ac33b08894c4107f807f37cb47aee5b74e2308510dad21d1c89ee202ac60acb3dd5b195eba029c675d0a4721d349152ae10980a4514c21b097ff076bc9530bc0981b9b010984cadcf430bc62fe217ce8606a1aef478ff34146c55519ab78ace9cb76a4a192384339b819db3190b857ef95dbd05186a3dd84ba6b32dcbb22cebf39489d0ca02528e7208a4a0641f5d743b132b285280cb447890b3cb47110f297a9d0ef693d243a426678799e8220b6f446872f61d9de1ad3e7449ce061cdd631f9a7db409b278b3782391fe7ae10a6f2f2896aa6468036a5a537bc067f75959807cfc0f89a37baedb86e182ee56010c088b2cc800e64dd0371767effe9040140a165555c85a108984e48936f52b054a3f8954dd3514ce8b87849232a5503c2cfa448136f5df43f290f4857a595cf82181025696e4a4620a3cd128fbfe8bbd0fbfebc2ef7d7b48a28814c98679ba5ac2b6c50acee7aaf7ca5595aba4a8de4adeab1c2b28ff2a37a4f3c3b37a05512048b15bb755d383ae8399d28b3caff49f576f8bfc095dd726fbf1e08ade7ad0d52ebc9a119be1ebf3f018be5ef1f6b4e86c662312e4c2db3b147258e120eff4ef144788459f9e4bea065ee6c0cb92c75559d9e1c4bb778f97c505386892994ca5d9ac2c8c5a3cacf3b8269e71ae54650b98a115b36ac6000cbbaeac9fab3c349bc130e33167ecc416cbb06cc6c2b7664d50718213540f86653c6c6c32d4bab4abbe5a6bad9f8fc5ac8a5d990c5d0096cdd09c6532a08c0199e7793c1e8fc7da4ac3308ab1b391653274019f6c8666fa1ac26c2613ca18e020deb219ed699aa669ae2b0fbd96f1a899e20ac23e198f9aad89d98c477f8b15d55e86957bf3553ed44aa67aef7537c43018b31e9855e38a128e48b66ac3ec47673314461289019f7b2060ad65c5acbeca7eaef2d4efe87a481f7395afba2fbb4b67409f7b7e02edf673cfed0fcd92d98c3669d6e3bd99cd585a8932a5d9cca7c2aacb80cf3db7b21f1e98aabaee0cf6fa2beb8159d90c56653328346302c3ced9a8d98c28570cab6eb6bdbc3032965923d82c9b79b9f6cb1cbc3cd99f552f8cec3226b0972bde86581b78615c74257e06fe9d485e89f8238844aeae42b8735aa6b71caa3abdbb5e5d36f3c15d55d65ea7d9dd0b237b3c1e8fc7e3a9d80166400761d7a599d0414a64ed20bc39b1236b78b377f6c67feecb9e6f44a0c4f036bacecdebc25b6539d3bce8529a9221d45aaaa1760a6c55513aa7943142f8680aeccbcec1e3174696c1ab1333f5ab196cbceae711ec75de0874a9ff60ebaf22601a85bdbfe3007daa50d9ef8f0ba44d4d5477776953d7e8d366631751060bd3a67ecb6f45e4abbe2ffa59e1ed882e75115dea1d50278e41cae71e0aab581a8561282a76c9afc613b0aaac25919accc156704e12a98a4f588f22be95dc0ff3b0b2ebd2a49442c136d128123445d47166acbc83897542b2ea7d653ed127507ea24fda137db2198aead1925eca78ab2c6b5a16b5accab22ccbba2cab5a1666594ff4c9939fe853f6449fb0fc449f6a7ea24fd7137db2accab3d2e3caf47376cd1584ee280703c447c560ab7eb2c5586df1b38a96b311717c8ddfae2cad6021b6554825f6c5d3ea92b67892f049dc81700f7613517a4a5bca532cea524b8959bad4cfd9d844ef1ba574562cf49234b1c4972fe7517a51975844a41ccbd227791691cb9ba882a23ed1aaa2797b59667a22b9d22bad604b149728a5cf8fca1ae57440acaa83efb9e7a6670b92e5931326c92e5da278a547a478abc00a3d914cf18d2b2fc34cf14a0f22b90a7b25acc26e9226bfd7387165e5700f14aa9b27dd5ea794524a29a594524a299db0dad173ce7769bcf0114208e1eb6ef8e0ebceee611e9de1ecea09d5d58e57976445e79c73ce3aad0c0117b53cdd8f989ee05f5559104e6b7664e2f1b692d94cc44709dba64b704e182f91bb92dfa5c7a373639a4508a6b21c43479d48f37c106a9a5743692cfcf6ae9846244d5c71f965339d814c0147770922e5f33d1f609cbe9153008973ce39e79c73ce39e79ca1510a76730c70c2d95b98a51a8d12e2f32477ea9b203e43a1f998275e992792e74a8f39e38c31e5ce2c44e82e41cc091f0d445549382152e6839877e92d0081a8529be67ccc514e17a30c396cd6a844a4170b73c48ccbb5d6bb9c7d73382f2383c862a4fbaea8f5624fb9a2a7e460798af264c9b365d6c845e43927dea6c0a4d73a2f2985447a6c32fa1c1d1691536aa4b0e494142ca73c36ead5dcf5a97a4acae128e5708453ee4c497974323399997247dfd18d9d74639348070cabc7de9574b7174f274327a04c951833fb5665a49c7d2365194efe886842a2900a9da489824dadd2258cac1834c68c8132e70a2944f3f3a24f33748f8007d861b384125d82372a73e6b70687831efe3971389c2806e9a1948f48186584b79843a28b3219118bc8252123eb31435846f69b171959c907cc544445323299d0163aa239e70c85666886e656a22c1385ce94eb9feb737daecff5b93e76d2258c3ee7536668a2d090136a0c0c36c15a8f91cdb064eda64b50c6bc30bf2610a5023107519a4d8c5b1d81221c1c118e96f3041c52f6d0c022039bb765bc3935edcea1545e693610a5823d365b65d3258fcd53462817857e6b9ed24f1aa220cd7e3c19562f8d8b0c5f75c164c628e3a8670801bedf03e3759340242372827571ca8efdde79dd04fb1ac3304b2bb15b8d4c04110e878311439d85091663c97d18fbcd295f64509d105616b9520f07a61c0efaf89844a6f28b281a2646bc883176139e5b1e21bf6f577e46c85b4582fcbeb932e4d4a549e8504333b195a40457771188a25db4e99d098d1746e890df2918f9bd27f961216f52054d90a92210539c2558d8b15f74d173a5aec8f5131faf9b988ae6eecbf330baee1cfbe4a1d5ad55563476e9b93e58f77728822c7b529ac95425687abfed6edcca61ce3a1b9a33cdbfa9f2b004728f3ff7a0a71a419673baeba1dfd18f0895cfc5f32612523296c04a89d1ab820c4ff126c4ede42bd8f82dce545d82d5b7a7021a03fba2783e2ab8e3a35ad20318e458adf4e8c7bb9d4ecd07a50051f1ee303e3438977e6d81fab15c09ca10bcf8b49091e572f6f2313e41443af6fa0b534aa5cc8c92528a87f86809238c30e6e527c6b007a485b18a1d0ba37899c6c03ab7033b95833adffbcc1c4f44be0ed49e42a6421432fca34286af9f97610af02280529e73ce79e7a6200537059889c807a7605594d2bb2a487588a34663a9a354b68431c61823cc31c618adf82a9ec618a38c7408d5b96cd6e198772841229411368c314619238d305615c5dccbb59273c6b72c41c532a5af4c4061dd07e5afeb3226a0c8f2138abcb90f893608b14ff32852bda2ebc2b44f4ba4d920f39fd35b0f84b7aee8e3b9d8e9c4eeeb3171742e9b978feaa239df18aef4b80e7f61ac4b31cb8abe981f16ff69d90d21ecee6e9b542a3524bef7def6f29b0237063ff5ba2e7dfed900f4dc8365bbc56caba75a6cafb5efd96f61efdbd1ef73ad7a4377af887b2b78a1c3b74586af2bb85bfdbc1aafbdbcef596d0cfbb316c36e6740cf24b6619edb6bd7f38e812eba5a0e2ce8f6d877340fd02f7c0405c736c977917dd811948350506e6c53bd4fd6c42ba091b6e2e58aeb5f11fcaaf87c7b55e44dbedad76f1f5cb1ac78c32e3ae8f5a20b02c55cafe10dcb557b7d86b16f42b01cb39c09621f33868384f0f632e8987dbccc0f84837c8efd8383d8cb8c49cde2ed5591abe75aaf174ac9436600cb41de3bc3e4dff597c96077d9061efc7b2b7831ee55916da83d4878a14aa8aad02deca3a390ae625dbb655deb9f6b2d1289c5e5241697ebdaebdd86e4fa4a7d586b050144b2a5718048f6e00eb4640baf64d633eb1e6c0dc9dab5579bfde381969731a1ddb23c2b15238048bef0caf5209ed75f9ed77b3e9f5bb75bbdc3eec16edd1e5ed67561cd88d5b0100c5a3808760f0e42ba102c5bffdc4dc3967477158b64e16d645f2d48bbada05bdaada5d58f150a3d3e14b28f7db2d67abc3db5aca584aaaab4ea7a55ddedcafeae8a3722791b923f3140d8e3b97d8cef80f662ffdc4d0856a3a621808896dd7341ffdc7a7b372cdb434fbda7fef3ea39c876b69a122eaf680f62fff94a0ffbcf2dc6eec1f2852b673f0423b5e706a4feb87bb2ebe783da87b85fe56cf47dcf9321de2ee0a626ead27b93a0f6eb6701efe5ce207531c618fb551e1a28e3dd697e73c75c45ead2ab1c2f63aca049527a49b183a6e6820d131c1cd1fbd6352127201bcd3a9dcf8b27bbdb1ed8779c3e651dbb801828bb18638c3146189beae63dcbb38920cbc6db902c718c22426887faa494b2dbbd8644e2eb7a51d1f1354e9c8814c7ccb0eaa9aa9aaac6a54e01c8ce263b3738537f9381b252423c4b079a5c4c65f36e74a5e32a9deb04bd599bcaee7aafaa9efaea9561d8096c8a6a618952463eb02f8f2e1a757d462a373894b48233f56d2a9b1a9b9ed8452ab14cc6925610d1532ceb7129cc6e6a405895dd73dc97049a904013e8852a0af604bc4c70a55ce9418723ce177ae938ce4e4ee973e564f21ed1f19903c9913622a584d97ca45da453a938f39454c871ca5cdf2bbd5b3487c9e647f19ca73766683d8bce57d0c94e9326f3d64ecad279b7b38efb7220ce101c8cca2e2c1d26161b72df9abfae7a8f60d70348fccab141e23e1df7c853d22e5092a7a4105fb1d259a50805cb711d249852ed81b4a935d2060a8089869df5d02acdba34ce2c73dc4adaccfae7592fafcc55eab89a0672eca159b773acb21e52c77549483c772efa58298ac32123bb1c4f91ee7672dc8a459bfa7307eed85ad35a9048d6c2f8ebda23e32805730ec78cfcb21e51768e3b4e9c3469a2a393938383236faa0f60208e67d18a219143c76b4d4b76b7e23677e6934ce113acf52cbb4c46d224dd10834920121ba8042aa9ae5bb395f1e8d7afc6282f4853049a8ad418e99291192f29e707bbae952b12f725a1e3b6936e024d4d72a77aa74b3bb9a3b331a7c871c67add2a63d7a539fb60d67d73e6d8274fd623e6eaf5e36c7bac995d9f2acb735d5945e9c5eb438eeb9c002cec63b1a802bb5d39d78db9de233a2eef911cb873b49256d238d074d3bf72fa64dd7af54982b548b05b4de59aead376d56487c3e5f9a44d7d2d9339826d265d9a3b9d53411e6b51b0eb420dab58e6e4297d7df009f6ba9d2d9ac43e5a04502623adf50a9d60ad571427d6b273e7fd63333c0c653216a645b0ef5584d5cbf2c84f3931e770fca95847c1b1386b8e0b718ec01b780375604e4368d16ac9b668a4d5a26e8ace130439de95667ef20f3b1bb363b0c042870367f7eac5c4bb5f2f66de1dcb7197df9537b2617c02776026f33025827d87d3890ca4935259e593551616d20136915f9981bd40141544009d0a248e82276102e87e449fa2d8000c238c1cff6864f74a4462712941940eaa2dd1c48bb1647e47763cc7f5e8b854e44cef9d3e3febb4fe45892becca1b0b3b29e1b4b422714db02395c40e1ce35d7624a6d01053d10834d1a0c1c2434c5e9be38a9c69ce39a52bc92a2bde4290e7732599e775494d2ee912b5668c4772c41258cf617ef2a6b9e802870ec1a3e34a90b4e99210aceb520e99c9c8396594596d24642a4c91582c0896c27e2c9e3bec47ef384ae38ce4cee68bd1a218526550bdbbe874450bf39c2a548e3b67e39253960e4b76afd495937a2fc7954cda64d3a525d59537b5535709a49456965876ab3cb1d36ca673bcb4044fb5cf85aecefbb9570d44a5c0099d9038f06156ed22474e4cab2a93b95ecd28e48754198b9a9a984544d2af6ae70a21bc52a74b4c729c8d0ae755062eced0452565ee1c47a05de76ec4ce2f422bf321a9357f65338d6517e60bced76ca6737e8fd2b91206f23cbb636252cfc56485359bc7b2fb32c8d2793157cebba14391584c8f582775ae6472a5cd25d1e06ea801b3e4b31ba79c326a0b66a251a31852e52166cba940c189e0390a4a4910c1c582745c9f4cbb7757628926fa14c5065e18ee3f8040141544081d054f22c7a940c19340c215d988c8b30834b5c9c54c2c6a1ce2ba8c049a261225b9a715ea637597528dfa25fa94795e2fc4e1d05eeb87f4e9f3fa47e370845e67bcfe19e9937dfdd3c2e1b8afa6d7bf2dfaf4d7bf1c8743e5d5e595c6ebdf13876388d777aa4ff8f54d459f84787d2f71385a5edf5670a8a9034d7dc4b7e642ccb7eea2a65173676b24a5206a176914c551db08205c0cdda200df5e18b9521b986f8f0ea86f0f8c32b818cae4f4ed9d2157aa63c4b77753c4b787a30417439f10e0db6342ae9500be3d2cf24bfd83818ba9aeb8f1edc920d74bd1a82a0036ea31e062aa2d6a7c7376c8f53f1a55d940536f8e0900dec3c5544c36b7855c2b4cae7f6954a5034d31be0d91eb837031d5937aac5156fd7331d60d2acaa70e44cd01fc08bc559f1c83b74fdee664f262ac1cb81ca421f7690d8e9a51cd162fe67a327a01704dc1d8a0f0663365f262ae9d77c27daa6304b645e0272fe6028300f889cd00f04d2af592bae2c55c5b5c5be4fe8d2b725fa900d4d8a8d9e2c55c57d4d8c206a22c1d226c0060c3e4c5584f5298646b4527dbfce4c5584cde8d3e9327b96fa520caaa81377831d616ef46df5a9295ca28f80695086f952de1cd926c98e41ab12aefa8aab6a832a9444946b12c2d6412d1756591492448723f94eb61e6e3f9618945cd640d866532a1ea8272cb3db263c78e0b7187547916d9813bd523aed4af35a977a3a6aecc83b383a3510527b1e0b6e04afd1d577ac199c8e0cee0d4e0e0702410b9cf07674abd18d9440ed90404eba60b2d95df2b8c18914b725c24ae6b2336d945ce69934e4ae60a6b59c6436690c7e648ff5ea9b4e2461d26394b6eb8e8c2d9100319fc90fb1ecf277b6cc643664dd332ed735026931df4aa61f2627307d69aa7239974898b2eddc8251025713ab149a8148d35e54d2e999a11010008004314000028140c878462b1703c28aa8aac0f14000e93b452704e1888418cc31032ca1840400400000000000000060138d50e273debf883c241e499633a066dc70dccccb3f2240b1702a0f51cf21862644e535ee0f45ce1d3e848cd708c75aa82cdd1fb85bfb0fef2d19495625233e315ab40f5acbba50db520c6b0deb9d11ab5856c0b89d95586d378ff1bdb99a663d0b59da31d8f21480131faddc0ad5af5c0c0f4ed7b86aa34735048a0334a8f0986e7e8cb6fa79cd9870584f57e53d00d8d0254ca26310b488d80651524208d8e88b591dcc708f00722b78ce81476830e53a3dee5a5bc71e61f8f1f1f7cad33a8cb077b5b37f762511ec760d5d02877aad7a6820ec8948003ed336820d9e35309eff1096cf19ad5282f92a6a849dd2c8cb54ba8dfe31cd6cfb541beab0b143641b193e736308bb7c642e18eb7d6d0bf41d925d93148e7264da3f74eeb59c7a075a323bd2ed9734bb269624ca8a96a592614c7f584386e53d57df3257eb0c178d73e2b5601b43d3a68c265068932c8acc148fbad47eae4c81eedee89def3a30cfffd2cbe47f8689906ae863efe3a19d35606e13afa447a1974244ad45cb3b30b04e6925bba528f25eaa34706090ee3c28bff62eff24f1fbb92a0a4dfcea17b03f9b3d301c4598d5d148a36b7a4f2bf67066b567d4da69d0feb65d073a5ddc873b82403369932be44e1385b673e4e80d035367cbc9741fff71a9ba7bdda4f7b9979ad2750fe0b2435006cbae0b6bca68fc9244f8e7123e21d92171300e2df3aa63619038d4c0c1b58aed9775cec21a9a54b3d4cc0e3bf0b832d6ddb161196b8a8496769e10cf9dffd4147d5f7db6b0af98a389f08b1993e9020a8c73d9ce2e2d6e794d607add6278d0d23b08ee95de925305af78b9bc546b97bbab3193915afbe819b4486528a9f3256ecfcbf9a942b6edf78c0a442e197064ff345f8b01042e05fd993f74fce3fa814012cac0d4718909b9d88ce5cadbdd07511a906d31925409baffbe95f2208eb22b02d5f38222fe4249aa4a618db6ca7ca95d5556599e96c1bf92ce7e5a98602b99605df9756b2b39522bd20c1686e4b64f3820460ec84392a1de97db1cf98038c0595ae1e2d182e25bea5aaf2f3e160fe89081c5847d11dc39286d8df81555199b91b7fb2d9245bcc0f25633adf1b1cb3bfd3e3fcbcd76f176818d3294893267bbdbe7e714caf94ea75530a9ad786816c4a7ef0a1987031ecd6ffc1eb2b12ee8f4a2f29e8c5c5f563386a84ff80d0052000702c51d670095bae1a980e02162515d263120883555483c4c90374c361db9b2066c3ac85ce11678ee5309b146b5e5323b1039587598d0467f2faae4d727dd3524173558aba39aa83f363c47f5c9aaf8a945fd7c144209a6287fb24e3c82ca13a63920436d9112b3b9636e2754acd5cf503ace2398f3cde7adb38c0c4d221694e1b5f209c0e9de5b54587387e12c4b8448acc5e0e6c235fe1960dfd10809b2132739187c669650cd854536e21dd7b17bd13447fabbbe311851eebfaa90af490705099fea4fe792835f7d76ee2bd287d91fc353e4599370c82a6e42f599df76993d12b0eed800f430d06e1f70bfc1af464aa3fc852716b8851861775d18d40db747b48a4c8dec3676788a3132239e169eef60a5dbf48c28873240b456a0b8a8a6cfd58a185c2483fed74e9c714084fb922e0839397dd1357294b69b634b547e9354cba9d5ab185c93d6c19583698c65036db6bb6c26947767cdebd111afd1002afd3cb9c7da664070ca9069bec5bfa04d0769b5a1c57abd5e122a6069ad03109849e38742bdd23025cfdf72a6ac492238fe49ceaec05c87e3465a9dbe57e339494b7a6c93ac18c4ca5202d2fc936e336069c2eb19924d163a4bd41c203acdb714713c09305f389cbe37093bdbaf8852986b8416580ef24f4cb88a901aff3ebb816b942c4afc5437d5074fcfbfe1ca570c7494e9b9e1f6803d9d2ca7e28f96ccb48cb7d5094661e0c1d0274920d15865e432b8e64e1b086e4ae5e3064bf18d2c0bb2fe1c8b432bb0024dafb14cc5414de74830a9fefdc7762d77a255cb77a84ba8c10533587bb2dd5cea07111d4ddada416b638376e11d810f49072e81e79c3bd7f95e2fc03a88e2cc922ce2655ab5178a6d648ef0c7a69bd577206c89f5d056e06b82821d1127228d9edbdb051d1857e4da224ee7f614b906aa8bf49a0108b53ddc2fed4a2351419a92667fb9522dd5f8128f3c5c989af070951a8eb598a6233d30d83d5ff1c3985f6df4cad430865d1398d50f16c692721d3a512e9f946e2bf7add6bb162574f5c3a2d08f42f6b9b06307a52667eece4e2fb727173817178a7902470eeddf94619e20971dac549ece635ab3b963d44d9f23fc79ac4ed27ac4bec43c319b765f3eb7bc0c2e9d488a4c598388367b8a380bacb78cae1da70f5c4487bc875031472d296301a2e1739cdb5598113187f3c467a79741ab04a113cc2f86c6996318af42a776d6bcb5340726b8c9a2fdd0e71f3cf5ea4738ab874948dac19062734f922409d00f7c31461efc6695134425a3ef04d20921bb2a0ad06dfc47d0fc590fac921ca21e16241287049680570b5cd683cc25326b3d06628d20c29606adf14b27885bc982eae0d2422f9290974d30f69862c1a81591089eff178464f17d45ffb22ea5e5d961241dbbdd3479aa1f9d40ca723ba8a72e58bd3240b1c21852e84407d20234aaffe9bccf6e0fc7404c75416021cd44b1649a0c83fb88e3c052a26f8267ab3d4fc78182858fd44d0baa38c7372cdccecbd9ecce9b8001a981b5092d4d0f8373e12f1b03c5ad50f08e69f6d737fe44ac74560600df210d7238c01ccad891fbb693eff4906d7a8c3c22be2d9d76cb04eda19557e9dbdd92d4e159abb994f0e9b6624af9abfc0c956ffadcb7851a8adcf7de622836f1a52ca641d701a406fce6efd32db6cd1f87fdc961fabe152d9b893dcf1b0139b234c80ad332e738d50b924bf4d8e1c649d995a04207ab488b56dc182a43bb554864eaf2d52f06e44060320903e948f6a0cb05b57eb400812aaa7112220e59c60e05bc9292a6c09d90e53408917a9ac1b871c6fa10f91a89912cc814234b20e6c81b2824db49624bad3695b2380bf10005f53ae97a9bcbc9dc26e4dc15ce62c3802c2e9875b5378210604e112c2df9778e20f49c770892073ef53390307256d9ba79c9bf171335320ce131aa0becdd192ec8e29c8c898772a0c12faa763a8af6bbdbe734c520a4b41eb73128115be2df7793c1b5dd12062065bf168ccde14650de4af0a8e3455a235984c4e9f112ff6881451129535c0653dfc389531cb0a2ec1bad8a3a66689230a96243941e1cfe840c9e3df70b82fe53a6264c3ae622dc26b6d0ff0d40ad46f20cce70ce10073305aff8f1fbf497d301db97a1f2015acff4dc29476fd651d44a57e6ef65ca93c7f0f2e204bc3713cada245eea53a0100c5d8eea0eeff21ab13c8654820d56ec0d9be141e639e5a0abf7e1e2eda0bb8236eb5c22afbae084ee0d7551bcd79137e48995d02b6ead8682f5f78475968108987180945fdfe1af15c70e1e1a3fd6948886713085a2ce807cfe4cf04a1f55d1c92a8cc4755b709fe7d37521aa066fa337030ff04add2245ef9a38d431aa3d513763de5d628b277e6e7bd84afc10afcbc97ac6d2375e45511f61f71d8997efd5d08e89c18e54c4bb1b522eba1e4f8194d17fdb7fff509e5c13c90398eccbc7e124adc640a520ebb0261a01f8b40180e3e79d6113f6658349fd849313f6da061489f4c7cd3b1b23a55efa14a7c739f100aca7d6ed9bf674e37824cd4504755367d0c3fc351d0dc232a284ac293ec4833a085191ededac974a221ef2fc5ccbd11cb37e992cb4bae115452f41682268160200fb65e45479c1925da5c241ba69379f1702014a5cbdab17e1b0ab831e09a2485ff2c3ae9673babc89f676aff171fb06b9bc644f81e33dea8c30e461fa306b221038ed6de0fa1d63807783fdca4ae5d6bb6e6e7f5cd373710eb9943136458baf9a43a910fdb270fcc76ffd1fd22dd994d60d9a7ee297a40ad1f79dde05b9c297a476c326e740c993d8dc3a2ed823870e06d4298fa4ff2e5f411104317341f7518a0a9cc69482faecdd184f724fb53e65ef32c71ec4e101cb7c6b3c375c2904b8921271d39a2323297ddcbbbb2ff61e46cc6e59419f2a4f68f6f50c8498a9f8949bfad6b5ce4a40f02c36c805af40486dd9da3d8a2cfac3ed6229f7f1ef8b7bc9e5c5e2cbfbcd202cccbe6500fab6be7762c8d8b520b0c8911cc32ffac11b4e3d3a265236752b585f04f18b0ccd561d95b35ddf49c77bf22ef84c18b112136bd15bc5c2cbc83108803ca0ee96434362520915f2f922f1f4e087d67c7760b5150a386ddd7217ebb6ebca2a326c3fd76bda399c5591634743604309257ff815af3689b9bde4fcc68dc7f6bc0e02cd33670e6e2beaea5c8ba7315b988b83b892c53d26d6ca2bb8afc0bbf3b89ed2af22a3575f309a1b20bbf3b69fd10cef58238a6916889015633d4bbd32d91c5c83ab3042870c93c66f13a0b02da500294655ffadcf63b5cbd8afcb17a4dddcbaec681b5fbf59c942d6b8815c86bcec99c461eb4d8f019e4032503f65f58d0dbffb1fa9768b0d6da7f9f50a4760c15512453dab09efa87d229bb0581a8c22bd578efe852dea14005d1cdc5010c1a5b31848aaf021240ee2d2eeea094435362093ded4492128aca9dc88896bf3cf6a9b2b1eeb9feec0e8ac43f054af247fed758610ba357a71edc52f63ce6fde8189bfc1e71cd1ec0a21bd8e6217aa7b1e0d3c0b8805ae1dc24f93fa5083aa3775d9245a5838baa2fa9d48a7e6bea033c427702d6a7665dea01eebe5ff08279cff0f81da07268b1830d2bc10df085125f1ff5b898308b40d4e68af55e4dfffee7553cb099ef7d7b6cb540ce71418560e9c81331dc073fbfb5e4a86408a1c693b5becc54d7db4ec993b520ad90d99125aff0f0ed30fd34bf32b0c30728afe6e9f0c251923b791a58413f347183381cd5b2f87084ce92569027d96c680d21b19f26c4fbbea15f4a53fa2544ccd6445e990929a0e8a0ac5da6b65ab0a639a2d79a5ce3c4347f5dc02403facd06acd0339db1b903c89d84b3e7ca48972f28a2aaec1f0a6f136da70ea46d5b7aa3777a6cf7b614c1bebb5daa616ee5a48d22b0c21224102d0e08844e45d247999bb9955e33c2fc8aa35918be8d4d5816fa1eedfd562238cc3033bbef143ddce9f580af37feea591d335379229896f8851f075f0ce0b5d1b5d949319bf4e0e1ffb6f092d12638ece073ed415fa7a21c7a549408589a15a627ffb2ccd76bd6b4d0626138fb703771e96759d32c9818cd4768d01f1954065e0028b67d7f4170189f9dd52d1a145563f98c868c35d92091153ce36671841efc4771ebd95de470042c92fe6464912bf1793b7a9b262e7f58c1d925ace1520c2693449146cfcd0d12172be763ae7a7b5b9ad2fbdd22d9fc0a1a6eb1440297a55d97f340c9dc947e7cbc91422f68f332b93a7c60c719d6c9a26a3e7a40b2c1329e77d11a4024835a98aea1dfb240d2e3d8d5611bfb3d4ca02aa47d7885705e92db2dc8acfc49efb8f3268ab1f6a242e2c14676c2687fff871c983d02ca4cd16989a0de22df1f6aeb0460b78259868dea040862c7678476a9c8684a888ad36d6eae56a64589a165a94714067b52b226ff5013a2cf7291fb9db5e94293b73f529d86584c5f5800b3dcaf489869f793fb7f38aec596863fd0fc9a2629bb8130c82b04a5afd27939ebce98e37aef190c9de0bd418e748a6d3ab7ec150640ffbb8fb4728aae129e384a9b1ef61815c33740514f12964f47cba148b419fe86e2a0a30559c3d088f623115e8a5ae517542ceb217f006cc892fa5ada272fc9c3a992b5c095d4b5b8848da33bb04e28355a31c11b150be802a4dbc0818205ca5295aecba3dffb66898f4b801de1785591647e15e5b9e13d39020d721fd8a62339f2b52ca4af31485d656410f28c9f465dd88936c5753449fb264327e87e5324a003d0916008bce94493ee38fae4c2533507156e4c899556b4e2fb4dd4f0a3de450ee9436a16e9c78d6fd1e865b8c8a227b26a51bc65010a4dae1c71328fb9c839164000d8b5fd885bea5b3ef53bf9fad44c5eb17681c2f82ce2f2be5254dc36521a60500a08d8acc73f4739f6cfdad926b64fd6f67c02d5b061635ec60c921b0c12cf86c59f8f0086a6791f9885a0b0ff3ea943c4111dc2bf8706891e27dbdba24fd39f9d53ec5eef1bb0a7d524b28587bff68cb1191923e880ea75b7a54df8ea8e9c02298088008a18482c12c0a54bb25e800a8b0eca772cdf39aea4f5fe3a5c196f490e7613f22363517eecbb8d116cfd3842a7d83cb136d67d2a88c8c857dd8e8ab7592ddcbaf52b58e562259fc4955c1b6251b4605e126916c975cb7ff043b01c1d2a992c1d7ba9618ca9cfa38f558554c423488be28fbae395de74e3b42174a761c63c72a42d55a246113b4367b2f3e1d051351611c36b4df53cf9ecc8b73bd906acdc51bf1c91e42e6307396daa5a8cfb0ca10d3017c0b30da21aa211fb15bc87ef3d06624ebdc2a963dc22282281239ae82bd709f37e3c190a4574881ba54466e731cbb747a74fe33ab59d292cd8272480bf0a2e5948094aeee16c1f1b4f31f32cc5b9a98a050addf351bd548382ed2113c5fe44bcd862e6118d9d6a85b57af1cd7ae376695c0af274c82d8062e759b4c32c18e22cd6b671777fcbac8ea3f9df598ac00025555d3284bc80866f273709b66738ef3ef429c6994791e1b5994af2d643da718806e14c8ea2950f883dce766aec6addaf8c3b0ec7937be72cd425f61cd0a274c29f426dc98137b6815e914ec288c927e6d680a70447522840e10440db83e51e7c6c6b8fdc0fc86e97f65528877e9b27ba9b031842c55be285a01f561223cf2770102b52c99a1bc89cb7b6d51252361de271521272855dd7008698c6695283807a56269dcf6785ee923abde26e9a7a4a037402a8ebc337585cc84f7e55545967b6892017deae4913724ca18cc966fc376c196062d7853ef4e258f53e30e088c180178d79dfb429abb8ca8be38c13dfb1858134157d61c5a7874a7b0656a7ca02ace23a94cc4f9a8fd3fd23340e24da5d8523cb2b0f61bd774a99d743640333781e5af61c445c271960eb6984cb8aec4414d2beffe8d965867a852a0d3618c62f0e18180ab721bd1fe3b2539099743273a502d26883aeb1c948306bf85224b594f9b0b7cc9e8951ee7341e4e5e7c102c4c07174a011de9df5a1a21562832cb53cb32820c3ddb691fd4830c624b29a85322f267687889967372d632d82f5add045c5c2a36f53f4f087bd030910200ca099105f00a06b975de24be0dace7787cd57aa0e6bf4f4897e6b6bf4746b548ca9a02beae2999776a85d00b123529d100224e0bac23ea1222401b1d34fd419219dbed6ccda99d36153e4a3dda7ad1c844320486bc81c22cf4e3d88bfebdfd87549d89039511583aaf6183dc5db5ea2bf19145b0b89501b2b381d0442427786d41e42176b86f2ffdfbb197c0f7b1ae2024f1012af9967a45ab38df8d3851a9e66e51a4e61a1c1238164ca113362232e3eed30dad61be62bb22d71e6134ed4bd726905de91a09aacd62329e16749ef7a95e8c80c25ed2a44412591ea9c88602596930085a356a396dad0c87ec914d9a72a6ddda2b1496c56fe83d02e2c5eb3c737da9f56b6ab071a556cc81b8aea2171197ce681f14159a5f8b5461a0f584ae423624f7335cfcba819870f7ee0c81dfd72ae62bd32bb9d5c4157fbba9bbd763f2f717fd6c1b6a94c56ce712c4833ba3f4a8fa3bd88b7049dcbe9db1298a34c25cf5614aa47dcb4e4a848410fc56c8e6de95bb52cfc5b58a9ed8d84bc6f0ad3875c82af16084ef4e17d2104c90c8c1054b8da508e4afbe9ac9faa50a3c18c3f22d6ee0ccf555da940ae04501096a4edde6d718aa1896c0ed3e8afbd7780c01b6ee57aeb219a90ff0bf3a6911c052f2a8c2afd0f0871c340282e98db77fb298e9acaef389295386e847ef0baae76c69e702fd98e43c4271778bfecf2bf3d61d8be058f0c594eaf51e4d17169b864508355b7a805a1f207d7e9edd000e8d71b5c1a7edc6c462c01baef0fb4f9677e6867d3cb59a86d3f9311a4247f65b2bbfd84f15803163c7ebe98b243f75e62504800cff6ee1a285d0c0a008c7f622286ae614e4c0458cc4174077cedcc69d506165480937adc2fa949eef76de88d0cba905baedab76355c48acf01ac8f91744520f4e3c0f1ea7740a42a0bcda06116fb8cec5a7f5e2ac4f348759ab217147aa19a23579903daf96de0ee331a2053be4295a2c9d2e15aeb593f92beadf55b3a93e7b07ad71cdedd85309185950b973f1b35fc57570efe929032f9e9f36cc06bcd11b15e38ba8ecd73790faf6257616d39ec971692637eba91a83af1fd4c24a8bbfe083bdac7f1fed1681f3bb71e5c4d109d6d68aaf7ee431b8082c31b402760c148b8f471724ff7b67e7232c311d004c4123ed1140142447957d592e818a12585b25374a0e2021b0ad870e1655972c64ed0af5c0c8d5a2960fe24433bd497083baf999a3d87e8f6985ccfa8af2491fa1830e8c7d0d502ccca18692243455f2cab9886c8a7810e57ad36c6b3310eee7ee2f7c74ef657caa16389907c4cf46a23bba718a44731516ed7d38f236e97aaa82600e13a04c125895c8ccb82075be9bd457424efe46b2a9083885c4205a459a16fb2042f63201212f8252960794d7e21feade077514809fba043bfa6b6db4f0387186ae9cc91399a08609b69dc78e601b63d27006bb9b5e46d88b3df7258f05fe22203b2cdb153add5ef01a01339590128ab84df50ae39bd6af0d8922a576fba5c45ec2f9eafd9b9b85df023d9df3a0f190738df4abb04f25f0df2219d4204f75e4a44a2d2b0ade0e79f70840b72fc904c51235fc7952bf8225c9cb278192944346a2f13601b2eafd8250c4c319f85749dd9ba06a5a8234d6a48a941fbd8b342fcfdab3ce55e9a612ca8a07a09546a842d35a9a45368316582d1887238a162d801d36fca79cde1a64d945a2d840a351f68106ebec6c2c308e9a2f92447741062da4664a15a03dd29ea2fc9508b9511f282d82da1e40f029c44fcff44dfddd02e85e9ca0a88d32a2603ec80440954afbbcc58e43c74b99f36ce59e9290300975bd6af5e3731ac781ac938845653eacb6a1261f54f2a125cc1ae6c8c2469fafa2500aaaff7333cc9553dde495cf8d11a217922bfb9aa5bd778e35a825a202cfa9cb5cd5ed1a2ee2d3a8892024384d1b9bc40a36e8a0435d68d0f2da4dff4c1e0a87851dcc8ca375206452608827950948a8ac0846b52c0bb4005c545608effceb0646a408d4338107cf7d777ac0de2827bb76a9c0b285cf03226cdfe2bd3b87421a50a22fe281e87a3d8aa73c76309b0156ce2088f81994bca6a370bd746a462e439ec4ad1e34e384c513f6325ed8dd2400f8fbc3bdff75f9a120aa3f1ff97c1229284d16d0f4ef3424df3369d933ea84a9970aa34254d5902466d60edf30a7628d63a1d802873195e794d43fa36117d70a4c1a1e60083c318bb4004a18572115585acaadc980392f38d4c06e41d5070342413015dee054773ac9b65a99efc7aabd829716a73fd01c1e7d3c3e9631c25d5fdcb950c66aead2d9e1690ffcdd83baf16b8b55d5662a4fa64c2a8f8d1d0c050c508d28d3f0617e628d659653c1fe16588e577551398addfcad305940d2583dd736088ab814c94557ad2e2420c94b28c82c5668e4e5e29fcd9a1b8491544fa5b7ac522efdddf20bc47b760e51fc5bcb67daeb20509dcaa3b4d6ef15914eef6b7c30f8bbbbf8050e8fc0b9c439f091577d59352f34ae5d8a30c8d7c7b5090c3408f476ab6e4e858d3431c7d6a19a1b2384d0a9d75ab2036f26feb4638fd2ce2842a0eaa8a87c6ccd09173a50ecc5062cc44426312aefa4c62d0bc7a36b5af02c355c2a9259c118f4a48264df807430176cb9f1909dffaee7cdbaf8ab26fc0fd72f07f6b48fb672116ec5a109443574d27ed01f758152506a2011fc439201f7e21f05a77edaaab59291bde3a07cc6b7c2b501f190cf992ceebc23012abd09f35c831450332cda70beddf69fcdaedc4d00657e83c106b1c25bd90d66e47190140423fdc5d6cf78329ea9ebc7a2542712eb3214697c5f078df868e541564b7c28e4fc83e49eb979b0b31bffb6983f486d5bb349e85b304f0ba6fa970948b0d9278f0dab657ca46362706e6814eee239a8f9f17291ec4230eaed8fed3993839f78740d3670f2a31f12605240b13dbc5d63b19c91698c8af28dba2a9aad525cc5732399dc65c0bf267a73c6af2cc304167171600fec5a57dd81292936a8a126113d769b88e63012cd56b874e3f6e7a9a05d2aa7792ad73ac44cb10d504ee0ae68ae870e012375d39d4d4a0592409abd54f368ed3367acdf7239f778fdd391b90ba8edd9c1f909ad0ee6c9d5366e126706956a67b1a04117fbe052fd1dc52daf93fd5c39334cdecadf9eb065b4cc78d94fd8aadf36cbc0b95f50aed1e10a8c080dd35f8a783bc9909790b3f8bb431763cea0b3b1b9acc4611bedb6e7913cf47654ad470da96cd9fa4a5f7e7ccddaf5a956d5539d868a97b4adb55a3f51215d568a9c8af1de998b52ea8296aa040d39588c64b159f166c8431091217ab8ad571074fe9a9ac47b1afc4b3152873b61b94709c60ec9370f4e6777d5ab2336b03ad7ec2dfbf2f8376e232ae747a8f857ab04bddbbdddbd2f93bb58ccaa8c5e3662faf8625ef9485f5d4612c97ab0ddd123f499e3408834235f6143413d5adeb35b3743de15010036471d83162d1a4c773a9820780351d78498811513354252d6852dca09663cfa35488b0208683390dcdf28ae852ddb95870853602bcd7301835218529e7b9668a9f1d88db740e9ffb1247822f53f754e4d745fe20ddcaca38e53c460106651afac8d1af7a2abd972e8b11233cab3884d126f1c192239ea1016a2d7cc1c41d394fba8f3f2380323f5ab83c293406500f7c5240a089fc2a1ed792ef2a8fb23d2123430501a3a6897246f2debee4f751adf36d74e4dce5416f9c8e245ce853b48cd76e9ff08776f42a6774472cb3c159db879641ef3ba8f65621e6f013b5447ead2b2e5018f48e0c75272f59a0b2291d62f48c57807e661d55ac3670016de598417fc120616f340ce34c94f78c58a014b52ef7a060211a4717fc90dc8826b787d2b8c7ae986612dc08696497e8349a8b1a30bd16bb6568ed3727490438e2696c8c807db01d7a80468632bff0104ec337d28b60ba2606b8b247445f7366866312cf9f8619de93e16a59bcc1f100517d92a506a7f48b114ccd9c9b33ee914ca60c5675975a648ae6584a7fd08031815ee5e81a9968b071ac7f15d0a9c91a882ebcdf769c65f474b0c6ce53eb9f229b66d3c25ae9ab01db63012f133a06cd40536e8759ab420c4134c2015789b8cc75b006c758c6021ff25f93580710a2a26050fb0564a75b0be6b4fa500fb156dab25f2ce4668b66ac32644e5d64d9df7ce1e0a54565935bb05fee44b72caa82fd13401309b12949b3f36c007a273fc6091c8ee79cb74c40f709acc577a3fc6dfc69efac8f88831d3eea3927c1bbf4934379142f0e71e105f9676c64e8010a728637527e6ec8c2e7b8e9d91e21990b9f5d8cf084de384973175f604564ada603c30118427af3ae45ab9e2f8ce27a310001585981a4038e70858196cb80fa56aba626df9ee60a5389da75377b2ac3670d844462eb2c1faf6e8dad29815e2fcbd86d009206580b63bcd6516093ad7fd85318ced1863511e226a5d3eac7445d6def980355248d14080c81e6773432b0ea6e376350f13230a364a1112f39dc92ce03f08346d3399a046f55c32bdd76c47113dd9cd446aedbdf7eed01eb2810a91381ada7f179be045cf77c41c6108e380dccbbe8a90701bed76be3f833aa31bde878c13c4c07a262be8a600ce3082ec50a466c4616b509b5c2490062a7b2135f1636cf35375ac46fed211ee7351facb968665f72ee521106a2dc9047c968b421946b4281e6d5a5320a7697427f3ec24807f734f1470dfd591856d3dcc7c61cf0368338e494f9a9300d459718365d5b76172707b213bcf456263321a2ed3d7d46c1d17ac8d3c18a372476ded9d9521a9aa5eeb622aa2b3a7e4bdbccbc65663e58d4cd20120e888072be42d2b2dd43a05da2ed0225149c360342a14e640daa698e5629440d0e5932520fcb330a1153a4a5f1ed0b9b60f9d190ef18c49ff35f0c648e84d8b935e1822272981761e07d81c8c47e3dc9d9d780b34b815c71c8392ae99d4cc96baf5cf972bc7376c9249067d9fc4d09a0704e9b2f3ad97484f7d7520eb809211c9b3c720f2a8d2b5b5f4e136979adbc0234457c98a2f1ef4cbcbaa6dd253f2b3663fbd97c99944e8b8573bf21cb9ef31e56511bb831acb60b98d1c30227cb329438bb73d452dfef61e4fe971d1de33731c39e80882e0fe95fdfc23dfe9e73a0252667714e15b1d420690818512d2657d137709976b54320c1010cf33a8d849ca3d8ecf842c78e1f1dd8f19f7799ba0c4f238516a6e10094c292469a68ee54b899d864d2eb9819e0f6e8583e234c17c75fa9089d191413ecb7348b77d4d102beb0fedefd70354203ea75f77d06cd616b117b237fe835ee2ad8c62797dbddffc5c829f86550ad3f444391ed10960207f983d45f703de919f537190691e1a8a8bf8594bfe7287e04f7e771bb60f54949547a89d7a2603e4a02d6764d5aa00517e1f54ffdac49ed9e1eb945468ab46cdce4e38b7a9fc006a6160cd45db536c00dedc6fd623f857d776a411bc0da9faa94b2e79984a34ec85778ae4bcb707e4ebf7dc64c3b795592ae1f893f35b4011eb2adab320c4d6dbefe19aac861c8f7122b56b65d874b8adedb00216041280a539c6997b9a4acbae25d16baa8526ca9fe20a8df11645ec1e857889f4267d9c2bda2dd065824c0f89824b3a714343e0c3e540941b9e5d49909267c41938322d64b4307b8ebe99fc58acfc1d90a47813425f13ecafbade6ca125c8876153718e093d408eecc2dc959a36abd756d95d62fe6c9cd9ed50ea2c613814ec3562f18b6aa0340b5b8bac706f0b1b2116aed5241caa1e7bfbc75c9757ca0608766205074ad04f6a9647f60b37ab0fc9403d632952bfe4862db5a3c55fd8db34ef3d189d351263210b6db81df58c5cb91272590a847fd7777ba12ef5a37bc2bf28123638ea496750e855130ca6dd679ed10c876c300adcff11740f7a5c55fc9882c7a3b608ae9e5326dbbc0ff9b8472fa7136ad79a0247a300f711a235c2828f60d638882066848b137a4b53cf91e98b57c83f2173891704ec7762135e6cbd837638ae5c8ea1165d934560045e84100f2ee3520be2cec9fb18e2b7923f52517a466a2f46993c51df39f31765acce26d656a6918d783582ba6ffebfa3e52168218678b04a208fe341d49bec239e4cd19713b746417a858b5ed7d244241a982141f8e7af0d63dc13d2ed9f0acbe1016618ee80104a11b68ceb6e6a74ca2ee836d8eb7e965e1a10125502b7378946a09c9e38f0ac273ed22aa800e31d29cde41939ef081a4e258acfeef94bd24570b2375527ae706c1cfaeca94be73ae6bf148dd3ed483cde03133e44d42319d9483144ec2a3e622dc53d699d2b387b8adec6f8a4e9a716fe7d9faf378d70940af7e49b07ee19d2e6c175af1b44a4c3c3bd0f5fb12df1bd6ab0dc08e7bed02853836ebf714e20ec704f323e08f61a0dcbac4e2b88233d6009913c40d35dcc3872b0768a7ee3f3d6480ef3d4545167999f03a07ca5dd91b8d3b283a735348640b7c28bbc4ee3e98cea5d9c5fb1aeebabfef749a71df8cfe45c16094d337e2fa6500d3cb2f9c607e0f2da50dd8f2bd388d4fdf37e7cd173d5036465c708cffae088b88885d1c2242a309f6ea7aec41d61dba088f0a2e8dd4c0b20eaf9bf5a6adab41351c352197471823960dadd1aff9659129d9f88c31bce15836a0d6a1a44734ecc37831a34e360870c22322a83436bfed5abb2b1c422d26f7f142f552d1888afc2e9e7be8bd3150d4edd81d295374431ac7edcfb9f3ac47d23d8c997ea6263ebc6b204ef774029a88f99a3f5187ed70c5791d948012a97d91d7c127f36e331bb11f9010de96e45176092c85d183d83570cdd624388349fae564ab9196277986469b8b4bbd3ad3cc819282097764340a0e641dad93f5ca04a8eb3ddd9e88f97e1a4b6f5dcbba37d9951946d07531c039f23b4e86d3e6b688f1af20625fb9d8eea6a3205dd8850e24db354c716844c1a847368a0352f0186c474b8d744c1c1ec04e0fa2af5cdb00d4c5b1bc4e1381299843fb9dc3b7395cd11138597e062f4431c595d53299504b696b4fde937cf85f86ba639f5424f0cf322654dc8c4df4a578964b8ba81701e534e2d008be300d8886d5d611bca420d321552f9556c78c074446b8139a2d7e7b5119bc2dea23d3bc36edd21e0402e8e273216b5bf80959c2828d8f55edb62f45e86e2bb2e30f5b08a0bdf1b70599cbaacdffafcc7e6ab437a24e9ef68da47fb5a3cabcb69536eb76e703d83ba254f4e010e8b3708a91ffbb20f6f3441740170eb9ae46a87a42f2d5bc851ea7fb38ccc3444da8b475a2d240978358125aa5da59223b66e04a4898c096f23938565743d5681f2f7f0e4440870681240f8f73f8dd793a6e9dc1bb09f329bfe7af16b22c53cbf5a44761c086f9c9f4acff40a2d6cfd0568669f704c4eaece984afc204a8b866e9d9476d84b1181f9043a5d256045c1a62c4f890a66146cddc2cc98a3126935ffdb03a65079faae8f7dd3819fd330972c6f5e2b231ed4a56567b347edd20cf4e29621475fe8ee1a651c08a6e696bedea0e24be403ef20054c959fc70b7960a910e5aa2fb9274fab96beb8d909e00b5c09f55b1a189a200595debaffb2cb8a93f44c35fadff20415168497c7cb5ce199189eb78e0337411e80fff6b9d7220bca14960c3968c5200791c44709a84c3e0fc33b747d359ebc4a0d23e93e200a684de63dc2ad4ba18edd3ce91a244d74c67bbf07d9b66872cf4dbaa5d73d48c2afa52286bbc37a41eb1b04957fe7e368ff3f2b400f284286c6316d037803dfa38fd1d9e99098d7d31eaedc3be4efc9ac137b0c07ca2e8647f11650996692aaa13064a340055d4a442199bfbd30420e4fac470a676898e1bc5179da0e090df35f50d0e1105561feea1cd4e70b164fe578e5d3281d649bcad181ca488c57f52462c475846f9d0caf25fe8ebd0cdb75a7f80d59b32d9858f99d371ddab92929211227506d56467f8f80b1aef68306409d2b4df61dfd91a958b87251d159e3c64621dbbdf697e1ed5aa9217cba28b99d642b447027b6f39a4d5690759030d65807c32a579142e8ecfa88d3537bd77f102f2f8e8b4f579603608c9e18bbb6bfd96ad8f4c3c8a2c41f304bcf97652ac2522fdee9f639827f0f1b8b66bcd9be1138cd79ad09a88467697f73dce6a913fb7b6732b8768e97a448b59cda85c2b9a61b2d8864406208c59a87fc603dc0787b9310cc01750e9419aa857f2eb4331535995f3b602aeb7839a70781b7546fe69c96c68a41337aa38afeaf4b1103285e5a8b6a7c850f666a0054ad8e9f09e1b76eed856cd69612bad9e83597b8c686a38281d7f16de59e6fe9986c392eb0c7346078371906bf948120148432c09588b7104c094e3c93c0eac6598c1222804e271b77d61b48b2d578bd97f9a223c491fd22f09baa8a49fa1c172da453fba5c6c32aa2b104696e49b83f4a5355526d416253013679f40cdf156948d63b99cd46ff83cc1976f26d249c6ad970e2e84afb93723520c379fa801b1bd47280e861343b41e7bb945ebf1958cbe4cbe8d709cc06b5da414632ad78f30d5df6cc6735c1e88b6474cd60fa87922fbaf79003f0db09dd6aa9b95d1de947b7ccc8f0227ddc23a6d13eb5b621191d6f8347fe5c5416281790837b73b203a8be8c9dc8554707c5538e1685c25ede7b305b821889aa37f03429f6087621d4dd768e94a7b7e01fdef00d86261220a16a63c8a415870191afe9b5e83ef926efbe9f6ef5c24f999599beb76545342d0f2d58adf2b42b61a553574bcf15a4d9918bc612c69580c19f67d7dc72820ce01f129811408c5d188c2eeab1356fd1e215ad5441f7ee4c3c86ec91d74a246b9be1955042010f0643943cb052d8909bfa7b3ef556b0757ee6c54dace72fb7175769ca79dc32adb8c653fb3c68e4cd899cfec49a6ef8affbabde705ba6d43ce374ade9a95909510e85b487b0d2bc39e5d5226905cb7b7f30a81a7f22e40a758f00361a12b778f4965545118a3d9669f0c970f8815813ab54194070bbd03c83482544cd0bb2c4b70260654f5e9c3a00216724169bf40ca3fc4963d3e4de54d93546892ff4323be43c031907381e3ddcf46c2610bb05bf7e7a61460b83863fcfc3ea96ba920925c73156f67cf916e98b3c281962982edde930979d2b06c1331ae544fc16a715a0af3302e5267acc1a0c3be6d7f8dbe4edd3a64572ef85e0c879bcf4bab222606eaab0c3bc3ff2475257842c4d601e3dbf3ec45ff9b20b1e392111b3ccadb6ac20fe1f7424c6203340d9a08631f9a4ce463bd1adc94a4fea3c675fed051a2f8c7457e06e8fd787108f35fa1c1db8bc6a84dca1484f0cbaa07bd2dc7acf0005918561c40bdbf686843f4a74c067a7a432fbca61bca642119fbc9f03228205f25dc29df7787ff2e0881315aec457d00439e456791d98efecedff15692d83451abc8e7474a17a2f7e45992b2e8ddd6cb88f1c64f09ab0e9894e6e3954f7c88209984f4e8568cc9a4f50384c9604d03671282f57940217dc93920e7bb79520d0ed1bb63a3f300752ba8903b58bc5b04200059429a0de627383b5a091a0bf4993e5d08fbaa95d82833680813ba4dc68619160a7baed58fc1793fd2fdedb4fca73f2f983fe8a0bf6374012d35b07b7e8a08cca52e1aa8eaa44b019b38b5e81f4cda65c49e8824116e4670ae391cbbfba6d251c168bea0b79a2920ea2c3a99cd3b481a89752b36bf4ed837aef1819d0229e0f2429b5b780bc9cb506dc2f1d9ac3ee0852bc13ea6f0140677ee6063f66d8db18a645d5f7a8aba6381411e119cda48d700db73ee0a19f3e3cd857b15d7a5523d132cae293d3f248c1795db57b8a37dc9c078595546e2824884cf29c9939b859670399b3677d31046791c0516f91bbc639fd50a4846f8c90acde8ca204dc2f8801273ee82cfaa1b736ce46f80a9ff8a34b1cb1f7b4a62678ae375ddc26518d6072736a03bc3601077ab869441001a6eb5714b31edf7f6d235d5696b93bca11b3b3b094b716bcc5efe56222579c2480dcfd3325eb08305b20eed9fa01e596bfe1c8f74465b8bd798b3f0b0a3fed134e1a8715f6faa364725248bdd0843a37e0d0d1630488b60371968e34c03b67b9ceb2a8b84aa300028e1557c3b2d525029ebb4ec3a9df174e507f3b1f1c3fa637721c9a523d0fc51d45c5b42bff3f32b1a9c122fb239f17442f472805d3b4c15526fd58eb64b9b4c3f0e0cbcdbb42ec9f9f5691135cf2866e001d60f8c0ce2ca0b3e0eedde3f9bd2753d8343e70b2edec66c0bcb79a1af6678b1483244b56059d9b0bb000ce85c160d20babb10f1ba06e4c4d29e3f843d93067e972d127984c88ea3d94a7cfc7ba6a7cfeb5f6a718005198a0542426921014bcefc49aa521cc38106c05ec3f820bed5bd86af587a6a837d262f8585831fcd93b08089655f7feec0379c628401d4fc84cc323e1d51766596dd77754e1fef9e262bc85a7c1dbe188353431bf77a26a4f6878854f2c389a0d40eb0e6ce157761c180ddf8ecb95ab3cbedf862be60e4830634bec1fc2e549cf7d98066d01bcf7fdc7785402b49fac85771b01c09ff926be8a22ff8f134090d01933d0538f080f583df6505198a542915e2cea08d5784c6145499687c3c511bca17085454ce3763143c4320d3284047c4019c445b1b35f06d5d4ac1aaa8ddaf709cac176c5ff3f6a06b90df22e2b4fa9b0f3ee62dd45d3ce8f032df8aa025c7d696fc695ef091cbf9045692b71a056e47e58837e77e07af6dcf1986f0cec4815c048c0de291aa2125a9576648b6ed9a21606abc7faeeed9e3e805c8ba0f598ec486b4f6fa1195fda8134b0d836f18fce857de892380fe1923908a840eb73062fe5a4e660e5bca8f70e4ba6fd6beda158ab686b4e206ee24bb79075b797ffffccc44c7bef74980831aee490513a73515b0647bffc1c7829d4958328b418767bc4c6d4246b8e04117f04a261f179959b07e9718ca0bec72d6d7ae1fd60ecf653b53b1007bf4642b67aace194b4dea7eb3212a3e20200c65e417e784c21786426c5d7d0d25241d991018e7653330d2005c0ff237da49d216c0c3832791fa71c0276ba23edaaed66281edc6086452b403609e6510efb7f303aa5fe5eaf5578f51751aad09727839700678c5de19ba2373279bf200b830b260ac04ce30435125630af0cd19de56596994e55ea4d3f77570950928908ba94929c726fcefc431a33dcc349201771009c54e983cd2984c4cc09e3d3469133b35690e01f698b6d9567e2e8082d74fea838344717cf58951ae8003cb74849985dd0a7a53167db673fbd4d1404201173fe2fb0a01e88eb32f57ae28b01ad2fe954c6d6421aaae983f2bf09af296ef66661dc578648d83df9721758f16f147e96aaa115d70959b3bd32006805298aab2df99536df46bd830c6c414a2d517de0f0ea3bef7d336383fee8cbe8fa21d4b4e8ef89cdac3964ebd7e1a179855ec7c936c3e38b9120d74153348b53dcb45d1928ad356ed87b2de87937c83b180d9d908dad5688da5b8e636e746405e5b7d601a5bfe2fc3a8bf41bab97cebbabd4725c3a56c0dffd52727c02240d1f9bb330c85a939f0b6a0a9f704dd5cc271f0e7f57e0d92429737d1161cb6e6b9e5341d7695c47cfb3fa5e6f91f0f05371b81559b069c51089af04c3e89ec53d38b7ca241c8902df785cb54bcbcd1742f6a6f42073c49fc46558b991e25f803c3fc0c9e6c69d4155fb50d412dade9db97d4fe8fb1c198f4c718433cb0bdcdc1e0d7a557b9f04f0081e05c05dfabc2ab2775bd0e6bc23a561f22bfd6fa9e6af74416f7dad62f8e271fe9145f514dbf0a2a6efc22b4d6e21b232491e2e0d2facff4545fb9c4411b6d803eca32848ed64a98a08ed8547527647226b6492b5a23f63da87b910578125dcd095e7b94e94151f02049aa2b8f96f150950c5ad1576a762b70443d87b87fc784edcce361b6416b2d332172ec4ff19b6c30da432e611b7950f34043b6c664685a632c610e61f7aeb33714bdde7a09d5e33896fa1a5ac5feffa8e8b78dd472c0caae69af698679b84800e6eb0e3831fd7d224d8f60e24c5153c0ba8a38ed052c64d3db67ba983363ef774bc82ff6037559f53f30a0830f917b445dda1a8738bcabfcead133cdec5068a6891837c83a3a08afd8c7cb6bde4ded7a0d49ce5c32d1c8a585200b37c7187903f792698ae6126f9c9871de5e95a9bd20ca0f1e2ba3cf43021b0266314b87f951a1f7433a3ceca1b545f5d90d422045c3cb3550a8dbe77bdbd6d00a7f66eadde33a96af8c84874a66a6840a28a53b539951893ade1500d108343738add97004f069d80e26a86a7cf216deeaeccf651e690a4f03b437f2c25ba30ed7825a3a64ca0ca380f60ee311462a8b6d541014265f01a87f83d0caacc7e4a8072fed55290a98561440cf9c3e47e284feb623d09fdd1ecd66b7edf7537fdcbe4a5e66154fb03a7d5b0c423faf2f1b60eccb396814d6921cd9ad30d3d776e3f01480d68005e300b6f2aee1242319479136cf838104bb0a2a0db9f0e5c8c7252b9b0260651e0bbec32b73e7941dfb6f4a175c7f45baf8fa37881df1c63783874d81fbe4ba8cefaf749a6e65d426841e471a16df30be651e5c61b4d748816c0754f61c539b4408e219f4eaa2857261751e1e4d23efaee9e290230d5f590d9a9cbd69bd4b4973ac16a4bbd5daab4883c649d0d663ed56a756d9402bd0e867b3bac907adeae972694452dfdc39710bed96e7cfd7656d2f373b8e3515180b83e21db08a57646c85684a9797cf85fc07ad1f4ec949a33f22cfb8d910f406f5fad966928e9ff573fc7dbba68a23cc933ebb92fbb3e5734b70e8d58c6b9ea0ee696066135125590a30f60675d7b5c89123b73c670a36152d4fffc1afe853766c9326d38890a72c136f83c8efa3d17242982db8775c309d6bb9d946cba6720f9c5e287f44a9a46b8e553eb8284aa51faba95f13418811f50c803586523e9571c0707c1e21d16586263e5ad1abca02781ec2ed97a5464bc8f8c139743037458c65388b9dce6fb44af736e5074be93eb7835896b049874803efcaf94db06e45d7c1375a39486b11c5e9ade762c116c75e6836d0f8c3c1592cac62b09d12f7cc405e0a32cbca0826cace70a0c10eba046864e0199ff930403af56a4161eeebd776a3cbad1e14759337d030e563481a47c010f61c4d9dc970ff7eda4564673c577198cf4bede3fbda365918f43fc1cf58776d6ddf947670a406bd9421d8d067c98882550e5c7b2aaa5530ef6a7a8430c944ad6f2d604eb3cb1e5c40b67146684f8441e83fa4671eea8443b86edb8318d3032c81383d3de1b815b7a0277a536b53a909242501a6272094049c3a815025205d02841ed8f662eb104d4330b0f7134e33cfc0ac29ed01dbea4990300e527b50ec6f0715a1ce49982c8b5b114741f5fe1d1d7773bee92c3bb0ed185c36043738e50c8d32b91a7fa0f7fb0a089f5404d00863a6cc902dd61b9911c7edb7848df62d9ef459aa55e5a5b47c77c3b607681a7cb713b7336c261ef7da8a8b214537dff4be7eb9b0c796d8b2b3cdbcf15edb66a0dbb0b8adee102b0240f5367cad3498039e376e7645b8efc7c51243c0c0498b858d074e63dde1c062d189d0ac82745d54074e5e5fafadf2ffc3a3597598dfe1ae2cca5235378a37a9f4b63a955edb41afaae29de5bdf9a9dfe2894aa64adafb8e8735b8d81f8e13e1f759faa32657f6796521ea39ff125b133b4974a6e0e60e1fe6eab9f8bac7681bf1ac5bb06997c62b768d5d12380011d04480128bc955268f3f7a27eb21d334280a73fef25411bc84b58229e26ec95e00a6590b329253940bd0af00e8f541989c5778154bbd5e1bf3fb817b94f32927c1cdc5b74c289ef9735e63e063f5659900399e1b52e699352bbfc5d295dc1167307b56da082df3068ab56c2db7aef020fb5232f40e74251e66b4dc49282238efba0569f3fff509ce63c4b0221be7b17c106cbaf9d711d4304cd33b73827f4fbe73de65edafb9528a75fca330eca2cd28a230df671a13535113238832096f049d2d93c59f45344c3f9c0e477a81bdd7f550e6aab94ed4945708b1b54a0173d14ec50c73566e9e92f5e9c949a3816466a47b4cb23cfa9f0f957ac8c7462292823f833160e97f43da91f5df2d693443d6493b845e81cffd1b2335f0a6bd940c7139a3a507966a5b0ac91b40b64408bc2c72aa172c1735b58596469e9adab628957ea391c1d8a488ece31935f87b9cef9969f88c5011b23af2f73f1b07dea4ab44c9105e49eb116840f86ccdc1db5a2add1db04765b7f396258e300f2e3a0836f99f0110ced856f91e949f70cbc911f59b43fb204bf7fb0df18120c9e83fb5689c97f771f39dfd7f1bd899f4699c51c976ae2df39018c801a2577864b5c286eff350466809b53a86a0b275722b8311faa4b72f475457bdd26e5ed87f5ed88bc993765d330436eac5f28a9182605a8920c0a4ffaeed01f18882ded867836c57be74d3c1cf3933e4d1cf7990572b33af07cb9bdeeff22e3054566a3dc9499d3643ce18e846f881d086364f4dec799d2c94aff758c148f070f5c6b9de0ae3c9aec9950b0ae9a19ed7b612ea1d70c905df5f4ad7b61a2310f0029c060d96d30a3ff7587d961a237a18a0c2bd9740b9e0ce904cd00531658d12305081b27473254bcc73031ba9bba2aab97b758c0636edcd0dec2e28a3abc42c376324aeaf816f5bd2dbeeb7019c0171cc66e5ce6c91e3b1ac7a6ef170a9a7587b772b699785d1248689b03ad0b619f837b5926614cacd6bc83165a951310aa2372c88a2d5445ebfd0134ccedb904bd483932c10b6597cf0caacd78c3aae3a93f7f40c0ce2c203eb2234c7b402e1d1f4c09d8381b384355b427d1d6448604d86a96c822b1c2c508132d17aebe016de75e3cd29d8abd69e1893534deba5f645b00665713a976cf5d790f4d2a3073b914ef32971b362e66c6d2b468b39acc4f79c2a85a5b5da4065981356fdc506420fbbfc122f8103ad27d1b0386e7126de5fb299a0a8df5f725f016b8210bdb9ba6eff6a8d760b892d478d23399a9813b9dbd4b95e14afef41fa8be1262128eb4b176c602c9c036059c16a8d1f5f74cf28b2ec95f2fd7caf8e8a6bfbd6357615ac0aaf958a3d79773833d6ad61cb1c938de87ba18badb8456f6c4532a4b62888bce4039d2a4dda301101a69c6d2dddbfe7aecd83c3b193fce5b52f925a04bfbc68ea21513d98b8e9926ab4642dd4714d69ebb0839ee919036c4869eaeb6227dbcd28a75d695c6e74977a3dd415bf5f9ca87992b6f77e4e515e4a96c01bddf1bf0a37bbbcfa5d4d8559f6cc20e2e93aeb306b2b65d8024f725c5556f6f2d21a534a77aaee6cb214a01327364a10e271a5ef7f16b7fecb105c8fbd10c92ac642cd67981c8d2c83f5b6f8755a39bde893138a66c16d9e68129fedb70f17181cea252ad8747b81654c654b7f3252b599d1ca302c55acb1de005eb424504828cd16d052a5052f09bd658674f5e92ae75955717f5809a082da19338a8f90803f0665a7d5d855fc011dd9eda4c0e9494f36675e62026dd5f6099d91481ef86a4ef8cc15a84578583af5a4bbd29604f676631ad0bc5c0000c91bb49213416442624507c4d0a27c133ed05154b09a4b7b49675621c973c9a054bd5a6b29da527d3e66849aaa4d28e63baa887b55d65492ffe2653785dee793b0389380c6a7b25f9ca0691b315c8354f3dc2958d78478f2c341ae0cfadc8dd211fea5c3ae7aa8d7efb76f442a1586e99e1c3b22272d1dd41cca12d8f1756754952614a42be57d0820489e00bfa16edd028d78c58f1a79fd134060c056f0bf35cb48ecf00d058514d8dac617911b30e532d4c2f7b5caee6aee33111bab83858d0388000dff1e282dc2f2ff0ee473e16199c05d0690b910c5937a7f99d5dac70151aa21a5d66ced85cb50e9280a39a41fa82180738d2f593360a7b01bd724b9bd782bab1c1524e7e6878a4ed9380fb0e0e8f0a5f070aa3c9406b081caf347996cbc4be6062bbe762fc2673b399eb95942d29bf6719dde4b2ed3ebb189dcb22b47805fbf7859d5222719fb9d99463b8aedfb49ec12988a00d0d69e530d7c49ed6041a3212e96f6d2a0f6226478c4126ab9dead9ea4c5b61ba4cecdaa9bb0b4fca4e4ec6af9194afd3c986f8cc908d61d63d92021c45d55ef84c3ae8301a83c37d12ac008abaa0adf09067cb69a72d479da960503fd599cf9c425df3748d1d0c5901b75a96d50a03b42229758edd4bb1ee8b2c52c977ba13e2fa9ff25f79b59ce17c87909cc561b65650a085402d3c98af3577e5b6d35f3fbbf68ed9e33b4bf8c6afbd99bdfcc7a2d19fbdfb6bed6988e2a1cf3e4c2df91cd947f8ec8f0a0bdf4282c6ec86af29063282714a8e50efd15429d3713a8f88db928ecbc997658588f6d3aa01be3c2e34478b0ccf6d281cee6c41276126cb8254a11ff5009b3a7dd22e1f2a42f94820efe75f3ca4d6807ff977b1f898ab59b67d79fd8ba011932b9973a9414ec704b69fff4c868e5719c42eeec930f5f77895fb4c08231e0fa64f4c2bf4630547891a4be6633fea8cc610c880159244bd772ddcb6682b3b9e630c5817838dbfea7bd6232a24aeaec42319446b57ccf65c9c846907ee5e5007d68bb141c6f1454d41f1c5cdb141de3bcd66869e01e3578338d2f23f4dcaee31fab013f40b3f67ae23a616483cf6c78d6dad9b690fcfd518ba36bcd916777f3de4e43db6d98adcf89c0f106fa1596ad967f3d434ec220b900952040afce7e187b57f5806c23466494bc87e3f9a22f90e8ea5f7316f0437e150e76f509e18a9ca23e5fce71a72139ee5573a0283e79553a1116248721c9805d99fc262057f8b551f51a611c374a006039bc931ac5f10ec1d1c0bee600fbfd50c66657479f42cd0fa6c3391c27d82005afc5c99018bf690db041442e6414df1c13c7c56704759040d0533fb120676bc60079bdb56b8f2ad617bc3d2ff1043279fabff3a1c8fa1266dfc1ab309559b66ebf51912533d2d0c317f6a3eb9db371ca66518e1d13a65842ccf3fc3f0a7ace56bfeefaa24a8341126edb88b4d170d4e732afe81eab64346ffe9131706b93e908614d9f18cfd6595592d1cc8d70ce79e205ac5986772c6a227e63ba74114b860cf13fbe4cc284a88d6063c02e582f204bd619a33f6ac6e684a8b2c845cc9199951a0eeb064bf08ba82fe9b13d34194da04b48b8803b9e70b05e9e8b5ea016588592a41498a284736b0f84c5a11a2c4303891552374c4b8e50084d1d5387975fd3e5a863e7800b732df1f4019a99fb55e6e1443b68aea3a62ae599d7285f648755889bbb1d8f3e9a22a4166db5c92487623cee59caab7770b8816f7e2d0e968667ac0d408fa44fa67eaa67c15c3cc9c72b90555167d90689f7ece445dee70101a566313ae5e56cd3a1a62694a3a9cb99091b40475f42bf02d1a0f91ca35876ef5bcca40ed6d748326ea3460f44f1f8f024e689c527552f8f1ab9316b04f9020b733fc6c4af8fcc6e183e746398b0126b65de52abdf6246f114460778a7c7a746bc4f4fb37ef9335aaa73a734e83ab97dbb166bf794ba5b26fca086903a6e2b4a182bf85717ef7295682d0865b647cf9d50523cd432a54895340fa4cd7366d4e043885aced3151c83a152ebfddbae16531dc34315cc0933a290f2dca9410c993b4a55eb923927c904f330538090abbb0e61b296bbb0193b647c76a7c71cd5655ec351bbd36a0d88c4b559056d5e46e6eb8db3521286007923a037296876f060f8b11b4243215bcdc5b3237ccececa4e5ee55b9aab4bd182b7a778fc21bdef0476068ce6e010f8fe7e1c9ab3b95dc88f4270e7992b39b399d30fa155dcb3c4e2007df65f132a9e0bd2b0d294c1c954d2821e0c64f4979392d850f7978171bcf991ff3c2e8f13301d592a1cc0191adfed98018796f987f0bad5a479e91641f8eb78dbafa6cbb0f6f46aac78608cc83e66f60dc6980f535db290606fc698417015742d36331198d54f48440881f404f24a8f840aa17478983580cf47e4ded987868ccf75cdee293d2546df683ab1d3dfe7cb427ad310bb1631bcf4eaae2832ed7bc08149e9bdf9b445ddb9e60ed51a9fed4d7b174a47051de8da15a91d6fa6fa11a0dab57917aa2c5dda70bad8c6214192ac35a17f56e626409413f9d85373018b82d004d6f615740199a82cd0b5959130790a9faf310dfd40f7393604f4335f9dc83a779292354565123afe452f3452a430762b5be26817ba311087521337a18292df25920c51705fbf28d77717a55818a2568400264a439c7fef553cf8f8963b9cc2528ace84f48209a5e5227e189cd2e40e424c113e9bcb60b9c9f8cc5210df4c39172b1997936d2a71be4c893e277dbde57e17599ada580f17556d5c090c2bd743c89d875d2ec3710b43c4a76bdb0881e1cbf5206dc182c1302cf97765d72b0f3aea5eb9802094ad14b3ea6d65ca2e0848a145b6d5ed44996d92d9b865ff2aef6656c625c51a8c85b1abe88a7454578211bde51991116ada408a41edbfd4598a15fca8b9780b1db44d930c94a7d3ff8c98a1af9d221daa3fca5634ce645c8f5e68dcc51502cf00bebd7fe7a7fc4a9b8b43236aa0bd03f5745c3044792773e51990f393ee2baf6bc8faf22cfadc76492f39c20980d58de7e062fc7fadc18b2b5e60a560e24a69d1f3d8d0811e252ba6bbc45f6c6552f7682c95eaf1594cb1aa470c79296e55a3a2629d873409ae4629e097c24f7c7efb265d9e9108c2f508af20b1c3eca09dd09f1efb78d57ac03674a588088dbbbfab8ca2becf11af57bea562e37aacaba1bc2182d8b8fb9f601819f7a731c8059a541ad6c9f26794aeabe590fc551b426da1f822512cfc85100c9462a732e9b427aa2da09f7d377d06ab61766685cd6604909ea07b459033f403a5545123b4126b3b2ce127c67ad916b240b79d7549d4d4bb255f1ec944d7334db9bd7c391d3388bd56ab57d3bd82a3580fe544ef042a105d70e204471b5d51afc9371a2987421418c770c6148978fff1b07842a87f5dbbc751563fd48582bb1a5497f77777e776bf7ff96783f6d5826a98c89b9bb38ae489f31ca7e43bed43b02347275f209d9d558174779cc8ca7a2ad14ba9a2f266be9c2acbaba7893b47255e8746b5f85bfeb53dad9f2cc77c88253f0f7ea61e10dccbd04376021b9d2f6c3d7a91a52d5143439f9facc8c15b5c446eec27c7d48c952ebe733033ec0454ac0e8243811d08fb14a2409d4caa50dbed581468c52332a2ee667f8295c3751aaac8589afe2137c04a1dd5925bf209bab95bc41bd654bcc21b14a92c8b910053019b2ded8b7e4c8c62210c7821cb3c2848f1f8fc9018f41daa75fd6d24af657f759de7613cc0fcea483c39cf2fe719f314a2da4f74abac1d96c309efb9b06302c339b86fe5114f7f023ec18de84010cee0662a142c17a76e04da800aaede345ebdc06ba329cbd93fb6edc002d05f54aff2f98bbf2973288aedc5fe79c57efaeb3f580b391f7ab30370032400f320ab28a122d0ad82a54db988439d5a15697596a28f7d4ca441052de328ee638ac25c0b8048f7181b1813073dacdd7f8406a865c6dec299243a77e64d1a53d5f4503d0dc958b45dfbe7cc232a36f734ebfbd0a193eb556267c5fd13e1ef21f21c9975ad3d7e3917316b7aa4203ed0c61cbec8a1c081263bff7b57bde5cb1ed548088a52efd578f72ba26496047e6896459fa39ce04766a92ca2e19dc2b42c92934e4fc05e2e9b4a71faedc30300ba4e50c872a02fff31d9f5be901f1c7c4ae5190237c2cb29b1da62eff892ae0bcafb6078e3a3a4d340e2226d1a4262a1300a0373895a6738ee6e283103ac3479d6a83ba3aa454cae3f2834821aade458a259fdfa04034127dc8846d8a89ac85de7ae547571fb5806bd3e05ee24914157992e4cb069b29075c5451b15cddaa8a4ab2a5f4f622e6692e261de01621c48c3e61b74cec0a8df4870c0d101ce2b97a48d03e8fa256b16f906550b7397a7d0b11b10f703d44367d181d5cd5f5367793244778e8660c0bea399da6b329d2f9a3b4927ba4c4b7eaea94a14ad404c343dd66baa4ab734e034990a98abdcaeda1dc28cbbbe069c54cfad48606d3dab6f22004e8252ffae786f9db810daf3efaab83cc2355d4d790701b3056c8c0408ad94a62acc47d5675c19afeca84dff8224f4e9fc975041c74665aaf540e3e187aa4466d463afa5106431cfa681251fbc9c4bb419f00cca686ee386045c96ca1f17a8b6d4227cb1c25fd6908c2a5c70f8e3b20639c70510bb6436696b828d5e0c6d70a23af712680c145800e422cb3d3f7cb854d244040697e6b717d4a220be607ae8f3b09ab0e4c0845712a280f948d1c4a92e0e9b7d1c67bc632b9aa8663a04263671fee5cf2133696ee6b67929666f1d57bfeb687712dc67d60a6d8a54678e5913f987d8b500b8f39f5cbc20593794b0d16888431757da3712cac467eea7f8fbd90d03f0a030e9bc2b6db0688f85fcee9e710ad82ad54bc73886d16a865d46b6c2e341c7e1ae6eec2e98c5191ec356a6c9eee3d74263d946cd0069abb4d5776dc3a2de681c79ad132a363e93f5bd2e5d0af7c79340b6f304a3dc210158b1bb47e1e2b7dac620cdd98e5134e535055c5e8c3fb14f42b04db53c0bdb6502bef14438e56c49c536fcb528684ddac13b06e94945d67d88a2c038450f35a04187818baea4623d995cee7eba2353fe3efba57fa67e8bc2528eb72735abc5294c1439a3a4ef94f2f94b542412bad8c658785707b341173bc47551e0b29ad67d80ce0df46a5d536cc8b94d818e3a20e37395a372713f1ab91bb857510a1b227f1f10f60ee255bb71a73d873d9b17c56744397182c6e79adab7898c4e177b6be147790a48c6d34401c2b669882b6ae3cc33ab8be45313290824cde4220e141319a3399e0ed8fe763351dcd6aa2eddd167d568ba60d920a9f8337731fa54736c69109631d5043e750a530a59207981de7396d78efaeeaf7e883643c74de47f5153f9df6a1affb39ac4ff56b3d85fd44cf6a79acfc92326582bdaa93568bc0b5675aaf9e5d7f8d764cf68ae6762b1ee01c94cad9811931a643a8a53f1694e272408a00f49e40c8e1860a540750a8eeeb5f84a6f9e042109eb4094843c98fa8f45f58f97c07d86f150173c47ad52cf9fc80d30dda7008125d0b185c4e196249aeb88d738b61a47e11ca063f492337c95253414861e53b20e277e7ac6a0d1becf45c42cebba1cbb8db1b1bacd53161054be000bcbdc457d1f5d02c81635806556125eb66b4da4bb196645a321fcaf4212aadafb8beb229abeb9fcc57955f04ee17e067aeb352037e69c0b0805c705a002e7024041e315a2e4818888bf9e188a278c3bcdf29f4d9600721a038b451850870d122b810eb822ae661b7e66590bac71769c56f3ccb9055375799e8604f0077dad996a7c53d2ac00661e7b437a2fbdd34de97953c8a98bcea5b98569b0125fdf77bf32ca3642f0627b9a9d2d3e865eddc4da498df10eb89078be54b7d5fd243848fc74f01c30b910e2117db301224f1bff6340be6761260847b756326297c87f02b6d6527c5e4b6bc7008a62e65395beae6cc4301070e536cfac799641e164b072787eacca84471a010c956179e55e60a878969383f4b90434ef6777a7721f7ba5298a73e8eac6527c19d1e4fe2925a6ce24550f69e7c5ed5d164d7ca905e46a5952fe67d5a3b0a1f2b9e13137fe951d8c0183d4393576fafdb343e595ba379ad48dfb0dc8c6ed0664e3561bf865ded6627c8ddc215f130c744648d22a2ee49978ac748d5f992be1f29c243167b4c5c158245a04b15525003e0c0e80995a5d5688a6e35fbade661ced5b9658a946458f571016c111c4b040f1895308e5d96192df22561fc6ccff7a2529e72fe3114f251363a1b1c4f739345ce74266cb4e9466c65bfb11e3d4c6be3d3457c779405c782398c7711d028b8a71f4ca2662bc6198826477f406c20ac9a742342b8b8e87d73a63eaa7415a76829eee2e33a9704f62de1b8021ad724eb836d1474475a94b16d6f45311ccb645897b87753857f80e13622c7eca10bdc0f40f00b42e9709a239e3fec188cfe54f939df177b37583764eb0a3b260e77a2b3c56c3b0bf00b940ce6d1ea0250ea6ab59b79ba900f6b9f184b42b6cc1fc209993a53beffa5ff59dde4051c49077acd5915e6b7f27ff082a0b48c4f003584de6aa45c2fa60632373d4c6318ab463fb284d928f6a6f7146a0318882c9d72ccd815d805ec676a4aa56b1a6179b3af8f55242c3448b1fe85f1e345633cd5dd55770e19fb1417c25c21c0ab35ee111575a41f6ae411a4bf254fefc65ba64f9a5fb9de71477a471c64df2fdf0304eb6cbbd2f41c7bf27052370041188efa845b0fc10c2625920fc92e5caa9dc2c3b84305a1600dfaae5aa1c5932797dfe0f042c33302ab36ccb127a87cc3fcbdd90fa45c0459033a23414b950251773623dd72e6afdb818a31409d3916aaf3e2a88e5c3a5232df9580370796338cef6d1b80cb2697d71793e39e756d13d68d3e7bcb58d818623f6d93dca315f4400af50748a8daab983cbc0af1a17b0303e18d417b11ba39469344cf569b530e894f19da893357ca4d22a47ebdfe8f5d2aa0ea673a398704544fb259aa283a823bf1529df11e5f75ad4064b930c9f4180a12fe0ec279abedfddbae9d90011043aa8fcdeb7817568d77ccd8c128f2185b685bbb361efe5122487f6a8e9b0903e0ab784f085b9e2a1fb26d82924c87145f40b15dfa8f19911d3df14162cd3ee5ac1a8b96c67f4475e888e053f1ce3126b8a8d379c3ebf9864156b180f76fd66b09d7335dab5240b1f5c56fda050a5caed8141c37cb47be124297995a1f895365f353566805a3ceb695763bd969f3ecc4073adc718a4a42afa71f1792fbaa4c7e7e4e6a9442202aea00da540c1e1f748d49120bd6d2f57c1f31ed2255976332dcda08242817101a080b120703e5d889719afdfc93698fbd77275c01d59bd452947acf4e71c1349f225bfd0c813843b6e01a338fd7a75c8e8e7d0071a3713e91e4cfd9d185f0b66681597913fbd6a8cbfec6d8df981f2c62380bfbb08456664541ec0f6654a96528d606f56d791a0624801a1a6ce6b3c5751623d1e8d06170503d48a8ea05f499c7e5841f6bf972ee2fad19b4d30b5f4dc9c58cdf302ad7615f8f3ed0627b9b3d36a550784e614ee3a77149fac57ed4f572db901c80f4ed9342b60ff73ff21a3cdfe850140df71ae480b0e048b050f70e34810c365e89664c8e908d024546adc0d91f684243254fbc736d83b59db0f26a7ce81d6e93473671a339505643079de1bb1dc0605a4050782c5820341e289af9027bf55a73c6b7e3fb3d6bb7f2ad0b498a350920e336def2b7a41a4c95d1aca92cc2b57e7599235feb1aa73acab4f1dd0c7541a604169bff2efa6b1cc79cb78e2db90160461fdba08cd6bf6304501dd27c17a86ce38ce65b56721e22264fc0ad28c39d1479105633af5ac9301c446068fc12d98c7f2c2568255bf379a4100e74fefd23fc1ec86b47750ad67604eabc72f39e2581ab4091da4382954d7765046d9b299c3a2007b4b7195f526e0b8918c19c9b877368048114805390360a40ea9e0c6cfe869524856684d1901b71c42b6864c9ed84f9992bc6158bb8d0aea2cf278426305f0d1b7ed768d9aa8e6c3677dcaa6183d173a0296dc00190df15fc1b5c97b88128cf5e22fcaaa04da9bf3643e0516295da085d6bb1e7b5063ef5259a4046814e2425534abb04b630d6e0880831ba3c7d70383b65acb4b53888deef4b893b807966e81f36fe1178d59ff639eafe0d0cd7e014d151b831b004d6c3cb2fe763c9b16855367b3bd3f9f522a3d882b8d18f6ec2014177bada729633b03d5235562f7ea95d90016d273b9b26833267f79adcaa57fd695fd915a33c94050e9a31607c0314b54bb04fbc8faca55038f54947492da3c61f6794bab4589b9ad472b722b8bc161d3b481034385af3b767fcde2532138626b705c587402bc8e615b1f8363d895fa890da55bbe8c1bddaa01e8391f97a1733055bd63270d25b59c9c0c75fad1c3d7f5776b165e8a210488e9804bb9162ef35341aaa8a7eaeaeb7d70fd5451f5c82cd95a91f56d549ad4c19f3541f3d74cd595f6c294d45978a556601199138e314d1a5b4d47d9bb9abdf23d95c5ed6a47626d3ca5f8ce0bb5f84b7ab65016d64433fe7b9c58a7eed48736f6cdfa699dce7da90f72c3e1a78b458b1477430f98a9afe929d48c8f6aef29758a4107b2a69b9e2acbcf98d8c75b2cb0825a50c6e789e13db3be7a61f02e5b57d97c96526f8d7a1ab94aeee242a287a327a33da03b07c508c842d449d12977b0083e3caf626dda45574caaf4e79471218e85709d9b8e237759bdc4a9da15aeabd9847c2b92979a5e316e59f02d6b5add450f79bca119652edfb74e8916474945b7632206755d6982c38b17b77de8a6b137fb2302a382a100b1e080a0fce36121f3d47f7082721d1fced3dc42ec44d71c03edc6021bb52eab17fbec5bcef272df448f11d356f89c36c5ae35f0cba8e4d8b64263d8784e04066f6443afb464e0658a6b9013c5b1df591100382d878a939d1a940e7d4351552100a477d00a95400229efa42c4c2f3069448836dd9fbcbd81b9a198449f63e123c761a3821684989bd23d021307733e3bfb7b947612ac916c494ef2bf2107af8803394154f4ea8a2804513d5793b50d04773b0775334a03f248382e57b0f1b958e89c3fd638a310d029fb7744f4ae898381a5813f5d8dce759bcc66845cbf7e9921d705a6f2985c12a8c7196c7cd3a79b7fcdf8bdee646bb9cd97add2fd69ac15bc0c6e06bb65d5696a37b4e8d19aca4cbbb6da5adefa56313a92e9ad0ac85edf8480bdec19e2c8319d04ee5e0fa68c84e45063e881c6387a711375fdd1b7973aee94385a9e3e36b27974af1a8887ec7c164c92dc79c53011de99f74fc2b434cad4a7a4b3a49068c33f6fbb720be89c7847d34b79dcb92aaa49b37265c7709ff09d7ebc9966af8edaf5dae173b9c7e7d1438fc1a8bf197f51fd52bc53c1b8ec80b093c7ed5efe6c9efba60721118f576c5faeb306f688941dfbe038a3c4ff6ffa7a2a7bab99e597c2e941f80e2ce07f1ded918ffb803ca1f7e8b2ce162a418a3ad86cf674dced158d69cb799e0ae07e95a863594449c65dda69b981dfd3e78a4c55d20e8df178f7fa82864cfbeb6622f9331288f87deeafefc5177efcba63a299f6f7110c62affc80a7ab94176656c237d062da9c39dd533fe9e674c3110660efa187f018eb32e06179af3e3ce521fa39691f95fe643cee859190fc580cb3ba67e47f1cd450dee80c15257405c8a80c052efb466e2b4eb0ff49e0e9ecb2120a3cecb2cb3f99be6222509e66785f3e422d4e09efcc991b8abd45161bc4dbfca8a974608aca98a519b0708d251cf7d32c3675cf7c8a53c3a9e783c7c9f4a32f224109ea094d3620ccaf726c475ec74d8e828cf59962773a7251c0b924dc1dbf5568c9f147a596b375bb69991e5bb7e37d2f6dd3afcd131e42e1200998ad7ce441cfc7fc38ecf2109ddb379c91492b0a90bb6a6a2ac7387c388227b41b6efaf6877e57cfbbc91bd297834b5e536295eae56266b614a1b12a512e8e4a087f16c84fd297c8e0e5624b22103341ce38fd345f701c21d01d823c572be66896ab4c16d4dc4ae3d0eaa5fdce4e925fac7d29eaed4a035960bfee58fc7ed3354e81f86e7bd03484ac6bfe39afd7567418151a6c6ed6e72cb36eca8c7903f917953e704adfe9ca7841e23579a8210de671f41511ddd0f2f3fc857b3a1af974c868f5c89ac41d26ab0014896c1ddd8c0fdbcc53738c07afa21d5532439404c61c2385047f84d65d4fb2fa2519b1e7f83a17bfea474a8ea7fcafa54f3e22bf1d718c825520205b97cf90de11d4139cb12602651b3a7cc3f7248c7d35551036ec2d833c4a718991498e11b129dcd646727023c88db3d94dd06d417f55ceaf2caa645eefa29baa8dac33224ff9703010654a7bd7d82e7255d2d7e5a5f2e7d8d7b21ea84ca8cfcaacf69f4f97db54b18ccab973dc9dc9a567230748de75efdf9b36842153a194b2073ad38f25542855c3ff47f4faa58f6b75089590d875f688560fca8689ce6ab84bb90fc3211530e92dff18bc5bce8b25ac5ee1c41d4d3dd6075c9a2d45ecdf428370bf8048c045929b601856ed452090d350ac48fb5ab6974699869e0d1699d69e943cda3cf4378e2d1f577144300e98e5fc568f6a3f0d3de3d41a7ab7f34c23e57d5e44e31c38fb7a5a484a7f266f971ce093208f7db32ec6d74f12564ed1932da42211179952120246c584e82bc1ac48807e0abcd6d6be7081d7b8c208f2a20d8971cf9809d4356e08e42d5d36f9503e5acc857dec8660c3e1cb3736f30e1997e895c6b7b2b09a79a43c19bf7fe3830d51999fdcabdca557114a38feeb6c52ca5ebb11f9f3e24b166b82b10983a6869b2076a94c3cdf9072dbcb7302fb414d369ccd7ba10e20b3e5c41b606066099866a41b182568a6d56132f46e87e123f5e0d38ce4474365fbd044dedd0092734617004bd7961d754725b630efe0ec3bd646d39fb04ff70b72be589a9ea2beedac7729c0726ad9539ea29762b160090e01f069b7b4c98f486cf9d6835461c3c054604b19e2b56b365ab9291fa46560ad493b104dd2e4a18c655b9df4aec0f43ec9a7d61439406839646d00ccd83628c540cf0ddaba61daca59c51b0832b9cd6dc408e914d806a7002bd269768584edc0c2f408d92a5a889cb0e3c6115f8fabd021048ad847f768c09f1576a669f5dc0109a4fdb85ab9038c8558e9b22416a0af4d65096edd57dc8b58c6fc01709a2c771f09b1bce9ca6092f390152b5da766e4bac3d18397783f068438d485376ae648a751146760a49324fa1d5d1bab4c8be3213902ddd17e406ec7e4fbcb16c2c770514083ccccdc8bfb84992712277aeaed021e1a02c8035f0f972177cb6e8d3da13c4d271cb05193a2cf6d1b37a9dd3f5e548f917deaab00ae070c9c672dd647b8f8a1a6bb7ca8b64e98b7382a999815a5a3e499e95306a9073db2dbee51dfb6c01d7c77e8d741993de9f4aa9fa27177d905f244fb377a921dc46c5408d38160bf57cae99523d0da92d123eed7d8efcf9a0bc737fa08d539d6db4bda158904a8e3b50789dd4bbb9af309706120bd1d559c73a87223369bb34751ed05bf7ba17bb29c3925c91c5e25ccc2ea99dbe05004233a20a6af929acabc755b49c25faf5f3eb3d92e329c867ed1c6324e9fc140f7a0f0298f3a5779e20e227e29b67243d58af8bdbc8dac0b3dbb262132dcd041b425c2af431fdb05ad47414154b00667270e6713514ca5cd96dddac337045e3dec1f24f6a8ad675ff74113b8a8295178e390fc05195129af7707e19569898692f3d5bd15f89ffd257e88a493ef90820523405eb29f5a40809fcf1daa5789d08f931bc0d01dab493d0a6fa95713876ee1ea5c0ae85d41c38b547bb0e0df63e6c867f51aa1652da9a428337871a5b0380ba6f557607549608e3e53d7a4ee8c60cfee0fd6abba58a52c04a6c6253a7196d69354de7aed75aa5e03648fa69c2bc9df6fb2c91884ccbf04a44814076e2d110d60470f42150c2793ccdffd8afcb1f6b0308fb04e8c1599974599fb690a770c3d8a7ae9c2cb54b0aae4d6cbd08369143fbfa9e102d1b378708e78e911996f276b06449b343eb1792871dce959700cda88b219e3a6b4b958a1aea153b48eb6f2f580097ee16706bcc7419bfb4a857ce7041eb8e107c48901baf91390cef5a23316d063e377e6f5850387bcd5df07fa16e3bb3abc8df15bbe11df3204764817684c78de687ab027a31f84dbec207b8789d8e63fd685a91174dd16fbbc9b880fb6774ab685aa04a6ef41a5610d37d371876be261bbe071b93ec87ae2bb38a9f178a7ad769a63c5190a30648fbb0c0dbf9fc0aeecb977417099312264f17a33acbc993a3e1a0d4efcd88da7fc2dc2b353ca724513543bd0eadbf0578ba96e4bf9c5bdbbeca4ca7d9207e14deb6e9960f51a2fc442cad6957e62fce38bb4440ece194f66dd9e70caaee43b0fc56aa22835aa18a8e3771105e3be696399067c3a127b8e8fdf0847827ad04daa3ef5c2af177aea1259bd8db216c0a33c3206edc78852b118383ef9e5127f21515d1509f57f4f83fb862bd405aa1bc6afa826339f22ae2f150c9eec361f82f006bbb419e3b4276e544f42bbea09a5663d38d302530f2268c1864149071cff20bc975506c2869423e20d6ec3b4c173b279d3acbb51801da6314ccd97e4898557ab1b7fbd37fa1def6619488c78e05197f5c4df99b1cf4ebcc8e88037f85f0a90e2dbe59fc9493112ad5ff8bfa4167b4adb2984ad429cc14aa43ed76cc6173cf85d34849d977415f4f53795a0f15241fedf4725a95df69bdff4b5777aa59f13a12ce0c9f0073d4002c6489c3530310108f6ad17550013879add2755f73e34c71874a4ce3487cdfb04b0214a5e19800abd26a382f05d76bb51504a5710d04351f81ba9d63bb0ada3a8ee4db71a00632ab8e6379ccdd1da819f6a7b1c04434f4ae1de1e8f3a4bde615703845aeeb510402dc93e1d3629a2d18dafe2e2585224fb575abb0f4aeb6be84ab4d008266516fc62d69c43296d15fce0878ce5b7f338b29864cfdcfb8f3b8d03d4f5131cf7bb893d12f4fefebaf48d78acd7fcd794ee22189e1cc656e857906d1d90603e8e2c03766e17483fca3dafe430ad60357d7bb0db4bd02ecdc6c49def3e6ab68d4bc025137487687a646985683b5d8921d61886827f7d08fedd6373599dd99259bc48add0aa4e81c867fba37904cd9485f7636b60514a8705e93f066d6f12f3570b5f096ce8990f37f1ea33db5f1b441bfabf627d72b602924320047a044edbd990b20e2ced24d0857caa36d9d02f088240d63dd43b9ae0e1d51c5b114d868b2ce2fbc60e6ef2f820320c3f77916512ea819ee7402e99b4ba6aa72e622a7996e4c720466435bc0890bf7dbf86fdaa33fbfa7585f4778753569723e46303605dd66303d25784327decf53de5883deaff1c75ff3d70fe3c76f83bbafe1cfbff79e25aed78b1542d821db0b57f983989403c5ab579228183e2715bb9725c1dad7eb5ea2b90c7735966c730b050a3c5c147495807aed2876694897d12790cab7c39cf253f6f6887dc462ea6923c2c90925c604a9fa8cdce03613b93b3de372305bac20e08b24d3ad09e0af3139645a15a779b28c366091abfd3958b576d61fc48a44915950c0f2bef1ccf07fc678c8e24baf49d8cb5509a3a8fe13b867c77147a9d7d49594a383d4a6395d6836d7089d58b29e2b4f27227431e9e11ed276bcea79f28cf3b1d94e2dd4d43f166f908e7a7274a9f6af99be1d4163f815e166f4128a1b5529f112a6dcf4089a91f1c0455135cc2b51e2bd473b5df179e18dc2bd4e720f32658c1f429be85bc1506c7e12825380309c9dadcf8506bd959c03349780d59c6558894ebd4c95d15151c0b400a3e3a83ab0433cc4b8d6c8ff35ff949d86043eac180607c1cf0e04be463ab21cfe32058d901c1cff815ccc8e2f0f16c85887bc323ecb3e1ce968a1b04b0b66141a9ca32c3349373267a89e7ad825242feb5edf306c96d73e651df3a4fea2bb6db37331a6ac24071edf3a1e797c8c0e9ca5c1c7f3e5f2619844b3adf279465ce21a664aad8d26c244748d6be926fdb723f199d4fbdb82c4526b1ba7585ee5f69b7c0254a2a293f7775e85eb1338ca813eb35d96e3dc5402086bd97ef9b383c4c918b609c31530bdd5af317d1257ad578af42915d12e6e50825a58eda8a98436c09d41fe94f265a444d031e90dd1a13f5dbc6918680d0936daf76e4fa297ae46999f7a16ff466d8e472e70b50f5cf1a287d6ee336126eda157bf7d78364bcc4e31f128763e855ac0de2cf47353b059c336a0069deaa84cd9930da88b8ea3aef544628092de0cd874844537daa71d6ae5b8046ca14895631907138fd559f57914b702879c9699881be3b8a8abcc6b99c1ed068f691ec66482a131698959b8272c5d6025e35d5735b38047dc6edaa2938c97d5624cadea7d68abcf61c8cd8caf21fef61eeb3f74dfd3806bbe425d17c0ed5261370c97fdf3dd563ba871f4dba9ed4f5c0793e7b4c56c3340de252cf63e58f5809aeadcfa0905850c373cadd501f9a518f4f0efd3ebc84ef9a28813b9ac52919be5478d833bbd76fa367387248e2a91cff45664e689c5da1f60ea0f8c2229aa744bec767419dc0a86150c575ba416b3b0334b5ee2d4d0434a9bf5c71cd96bd20620d29259afaab65c4019de0c1e8b09a0b4eccaeed8d943ca1e2399d06e88e5b56d27cb9545c5145a688938f7c4b5941907edb32f62375a64c0c118473cfd692a369560ae147d66a2ec0a59fbea460735e276b9598711dafc7cc9df2c37600ddb10af1bbfe9e919a82a3725bf3cdcc7c29ce0c37fa588eff17a009fb771016acd3918dfc1b92bb6dd201008c08a59a4fb922e1b7db26f6138f433d61d6ddfd2c9254b8e7b75eccf49a494661c89997ab1220c68ec4fccb152d9d66849dc416368aa3914aee0bbc4b1c4f3ac6442e9b02ac77ea65b1ed770602df3b4e5df0006126068e9727b6ea4365f95e7246889eb0e2c6403ef857af642d13b8feeceff2f14523ae78b5ba6b31affb3a2f85709e818d6646046e87e0904b6dfc204f793fcd7f541487fd924de3bf293ffbee92360d269a27dbcea413a6ccac2b0c1ab4830564646c594853023bd3422ab3074fb20ec287842553a539554e0c30c455b71ca73ca7e657837b0432cfb79a1a4709a0865d7d3444ee9ceacea7bbcca6500afe77378ec89969893b7d3c7aa03376d512d93ae0941136d7c5c231d799d799c156071eae0750cdc07472d6db1499cac956c95ff8ab9c46d46fe6c39165466adce0359d1588e9d763e189dfef4cfafd664d72ab5015d5fda401af2230f28597f868c600fea6d85be5a72d9920e8ef975a449a6ade7eaf4e058e8e1b9b233508adeab766a86745a4bc5ffbf93f77bc72cf8e19a46c8f153695f72068e24b645ecad90def88ed8c0b395351c0fd2e2016d2ce1dd4fcf3867bc4a09227d86b5528282e381090169cc1bc994426c6ab67e10a7e7dbf695489d13ab1c1570600db9e698a14d0b19020a0e147c2e9ea55a7377e751488b0cdc915ed7c82488f3a2f799944768066c5556c67e5602234d96601d054ee2e98860e5c014eccdd57c464954df632e07c6b4c74f600eb04b2ae879c208315a0a88fa928edf73d2b8e75ca9535521d1f48b2d909dbe1a9cc7e052a6bde73776f4ead567681cd07f1c259622ad2393dd99da619604510e6a8a3c58cb891469e134790fc6e0aaecc1ea6d8536f5576d76bd26c776dc8a9f330f33d0d88840db09e5f5cbd9c02e042176e437c379be2866b1d3d73fdee0ecef3fca72a1011c989d05654e26c7e31af2bb6837018a12793676092e20eefca3d69f5323ae74a44f9c18914b62ab97464c4adb2be6ce560f673288b406a4be5b05ef4cda93ff84fab44ce5145f0b357f53c11ef05b7d0192ff727101f71877a7f882b622bd292956a5c8bb15077db3f199de2e63f18a607755a53f37d27ec3a829092be347bfbabeb50fd163372b809b7fc3b5a1b7ffa3a8f1ef41a18fddffd2b76cf4addbce2b8698a937d7f1d83eb1a389efe0abdf98fffdcbec26eaf889b2b7f379b02b1f709ed1996eaf14ac8acfe04506cddaac95e08aafd785ac380ab9071a264775789a55d6860edf15ce5ed32443251a4a41141049af7b0d66dd300a10cc2224ebca0aa1207b2fe0a6b587a052bcf060aac6d114bd5a2608842da2281c50c0787529b25b4b4e8dcbc7277afc09d2b0e379320587d52f08314f7414f2cdc07ef9b03305da333eee294cff0e890cc7c64c55aac56eb0ac6f27f6feb0bd2613444529484819afb853449107bdacdb42acbcb5d6c64131426b32495db8bbbbcbd6cbe69ab59eb32d7f58ab7ede6f1bab8dc617ddab73ffc890b7eab5e2733a1f0092f134a2e774c83084b1110cd92eb4b7cd5e17b846aadab5b1678b9c91e5c9f7e810e6a119ea6d3bc41c0bd2dc92b0c6f7558450262523b930663eb52fa8bb7823d2aa501e7094d7dd1cfdd179d663fa75c21dfafb54671c4a083c6e3b9e813feacd887db1d527acdeea73f839ccfa37bf1ddd71ad7f2c9af594efcd14dc6b815af6375d6a757fb36ca3e553f77c8d4169cb3289307ba55e17dcb1f5640ff5ea8d62672f8ff610a6b697e8f4dded192dfdb86d76f9be1a9d5aa1c8f7bcf4ee781078842523cc7c2b4cbf0abc95e01242875a72e056b6dbc51410e5d11d04e249acea0607b7a725f767afa84e544fe71d0dd1260eaad9eacb16b5450a325bb3e989b56e8e695776365b993e260f1cbca8ff4c1ad5c8a8e695792c251ba06d779204821316e56d8a247b55d2bfd94b1dc51d1460ac7f9d23e01869093e8a4561ff237c7825119a3b73583d796e9699def61cbee1d0b050c375d88f81c98126e792101e424ad976688cd9916c0d3fac6b8e0b870cee63c71393dbf3335bd3d91bb36f723243057a7634790a60457513e7c05221871d84ce78daf566a71ea1fa6c9608817996a6f306c33ef5b60aa4609b86a98ed129a403e82436828350dcb938fb7d1a1cbecc1d4b6730494811e63be96a898a21d3d0ad459d08bac975c222c26c92791ad0448fa4d9aae3d8fd9da8ae5be27a6827d20f70783d5a13e829ae210525a9b220a48b9fc32fb12f5158293ec2c5a652a4e32623503ecf0835b182de14133c40519c007e66987ed06ed9b801007958eac55b1a050605a9099b663c09b05178a8f8885058ee70d0678ba4ec81e13ac70e46bbdb7d4acb98aab240d44a5966ed1c31dad7a667c4969a0cc02b3386729bbd84c37236935db1e0b0749a8a20e1855aa32fbfbe1fc483d3039776086f0a479a998d2fe9bdce367d9b1ac6795f089059aeb39695d72ec8227920cef0c04eb1d90fa8b41363ed9048f16c86cd41576006ec389c8b66822f2bf9aa1d61284835b6c1b662c685c0bb520684a1ad56259ecfcccb7d85416ed36691a7ab497d0f50e00226b97c7d1c31031909b9346b3b4b5ed4ccbfd3f174defe4aac5a088999a206b8fd0737a426ef945532049cd3ccaad15be33ba0df3c089c380fb6843749cb80002fd752ab4168412d5fc51b96783294167f29a1f85101e42c93cf1b9c6bed214166cc836c04f70aa9ec9b9e27d46855ccdb6e58c4d05d24228309d9e5f4e6ef390d750e454d3e3030dc8026cfa4f1f972a7b3cf108224ea6225607d13ef7e62cca420fa523b166d03b51f12c9d9622571d6948089208c16dbc46c9101083e251ff7bbc4c76cbdfc7563a70f086011c158905dc5b334d1589a142ecf902ac60dbc2923d127b75aefbbefe1d827884dd7a721a4c1cb4088803710d553c442b1d4b5ac732f44b277a364d709b666a1a40f39007572e3fe44d9dc43e58d6424a3be07f62841e3d65d34b8eb331d86d6af43167a9c0652be245321109a8d60be0abc99351b5c8fa1bbd9d25805ca1d0f76633fe199a5d05fb2cc280ab340059941ff92088c60222bb243b6fa7906b922833f261d070ccf3f67fab450efcb42cc3074d82f23419eff74d7ee6d2a37686c1293d55a5eec9a0de8cbbfccbd3188d5042011b9511fcfc64baf3dcac7f98db070cf3983a7365141369c74b449822ae6a3e0b6fa186ad910b1bbcabe84e18372b8509d8eb3e86611373088d2d66cc051d15da040e34a3f63cc657e355ed37552060ddac9dc07193fd4b30d0eb49ce2f6bc2c7f6ac070e204c7a5011fc153bad34613aab3a7947124ecc8bc965ca3096556b584087ac26d04b753b3d940743a51c16caac635ef16b11e7c2e312fec248408635845e88f0e539c2acf387c7bdce51872fe7020daa1d86bce2db23d825e4684f059dbd435235908e0333c43c60d033d3238fb39666c3b712aa25b0c1bb2091421fd3c9453b6975461694552a520892afc9703756a6ab0de751164abaccaf0bcc5d68b1203325231a2f62c1f92135eed3077271a5b19f1b84125aa38a06f2805eaa2010f77a40d92e79b39fa17c03ae00e13b93c69da4ca204f5ac020683fd40ecdf3e93ec07c41ffbafef915c05f90fa017e1aab1ade28d866a4a99c9b8de6e52b2b608fb08b6c9e1cd025e920fad5706910d83b9449f2b8906e6e4bd3ea63b2a1916f03984f1ff8bd2c8ad8e1bb4cf1660e62210aa5d059a96610dd9fe03b5610d8484fadf07d1e1cfdd595cffdeb412bb011bf2a9c73d0abd5bfcbfd1dfb9fca7e9189d7bf77367c846a9c04b26417db7de136e9a1b1258b6563e7d76331f7286ebe53261eda52ad4c36c4aec7d8ea0e2481e6d1a0c079c3dcf8287aaaf8f4b6be981e953f713a26a24e103578efd813e2531d225366e09a6d67dededd2b65dcb3fc90c2787673be199dfa326756b1e812fb3af2f08389d86ab3d9b22e5b4e56211ec43207b5a252e61c68e3647dbfffb8b123649579ef43827f2c86e9b5140f9c7bcf531863c92b13e6b9940c26ecd494de41943ff4c3cbd8f241387d923c0286c23c08d98242cc250db681de56ec0a7cd0fed158ff6f6cebf958db2f283c9017875381b9913cc125fbcad9fefac3e666342f0ac440c7b62e688a16108b79804c14f5e12b55f5cfe1db84ce2e07e6f496bfbf67c1a66b9a0e83f2fd93f0a253795dd6d2016522e68508ea8b13f132712465d7ace5081c4c606eca92cdb87cf59df3fdbfd187af5ce1e423492a74f3f721a1826d193f48efdc22046c510b65612b70c04dd194203953af0defcb220abde505940b0f1d00f82bb5ebc32c6d6c0f64c535595c417cb0b04092057efe9cdcb2e01aa8b4b9721352f7e2abed6c123990718fe277725948a64b38f1373a1e20991dafb314d55cc457af41d4bffea656e9e953762f5b1b7f623313d6adf56f82cbf9b5db683986dfed960e4bff07021d09bc25aa554aa964c9e9203782e72a0d3bf4b625da5cc708a9b47c64bd41cd2d02cd700b78a19028e6384145c7fa2090ea60c591ee288d3e3c1daa4bbea54fd4de1354dd320d16284f3fc73a135c8c33fd171e9733b5d9a0c3a48fa91ea5eb808f6ef695826dbaa5fe3f206672c02bb539a5f15f550e7fd2eb5e325fd7d602bffba54ecac155feb578816efa57e5fd100319b9e7b718f118f337ffe8935950bacf73132f75f105b82bb247aa95351c8eba423d170b76f7b6e2907edc14efc175e27fcd434b9c72000dc94ff9ce9118319e62f39c672ff6e75ede825ebfbc8489b195ba87d8a798e067da6f683dab2c7f197b93c57b2db6a1ea3720bf71b02122df0135ac154f873ca8c2f971c3f39640c99d3ecdaf0892f0b475c555863638c0429e5b5930d103dd977286720acfbb330be6c820e572f135037b5aec9178469f0fd2a2554e0b6dd01df8ae6643dfdf30990637cfcef62b2fb1757b98dedfde0d40f5f262049fcd9242a1fd4398fc89ecf9598a8298f36996d02c641618ac838a99c97227ba74407c68f3a80074c6e586386f1278e5803a1d8dec2e03a8aff3061452cac13adb474d32c629b3c3614f411e3d07787ffda8f5bc74b8da69106f78cc6992d9d3386e3454d9a8914ef193f07fb25e05bd871fa6e368314505dbee3cde069a2a2b6b95a33e40f8308dc2c9451c799a6c622d688c8941f0febc5785ddd2db72737c46d0d39827f0d5882f56f12024a1239643a5a4cc69af60551c4d8cd9ea39955232a789166fb2bffe8a0057154f2dc35415c17bef67c0e961381fdb11b9b1b572ede0106bfa8848a35bb33130f97262cfc48c69ff240b2d83c3a904ba790ec7400bb3b9937166325710a05d1e1e4c6ae6cd2399aa69f1ddebc223049764a2700479ce1a682f73a4e53d83dbc3f5eb56232f2dd1087893033445033ad226945b305855550779c43cb39cfdcd3ed39e09d33ca685fd9f092c9c081c2801834a7f3811ee30fa080a9e403e742c8b70cce05978308a3744b6a669c2f99e6df734dd3b354dd3348dcf92d63b695b57f57ddfbefff7f6ff96526e29e50e2d0936094a09327f83df145184d7f06ee8808029823e265a569acfae800414a1430e08c0e1008fea6e7894c775ec3a07f1b7777bf0ace7fa40115a9a1f7d86050859cf08adf2828dbf61cbcb4d5e0cd597c77c2a545f2f6ff11eaebcc670f63a43f5d50ad5d76b743c3a6996e40b8f3de3d7f8f26cda604e9250ca722ccd56d3149d3475259146332f3cc7ebd801739b1ffde6731ce75f2a46a010f8857e8d30d2e467709987e1333fc3690ff3daeb38cdcbe0393e08aff9d16d5e8ef3da5bbccd613e86bb7c8ec7bc0c7ff917387cff891042b82c7de19f3345d0c7c40c32f8ccf05496c6d2562e9964bcab480c1b2c95f58c085e158f375cc137c15d35a8aaeeadd679aa5c411549699aa66d84b5ca12fd729887c97c4ed7f449de16b96af0ee5c1587e3b9399ca9d3dd1e77476afd7af3b222420081483d270be2aeead383692123fb09572e706a920502cbff707574c78c8183232f8f5d86e6662b4e51dc155ede001ef30570972780c3fc00bcc50bc069be86d79e86d3de069ff998cb7c00dce29cc4e20c40801a9f9dc6cb7e6c7899ef5d411487eea0399407d5a13c4eb151a3421bfbd8bac76c326d7a053b9936cc2a4d5e6bfe1065dab0ffeab277b1df0503446a81f0eca64c9efdc1b31f1bf4bbea2f655a21288446d6fca1cae459df6ae5fb5bab4da7b788135db15ea5aae55ae556b94bbb95bed217b228651e26a3e66b709b97c16f9e06c7791d6ff1390ef32fdce5478f7918fef22f17e275a0de755c26c314411f131478221cc7db9c1d6f5393672d1444bc858264c60ad9bbf88781e401e0383ecc9931c47b8feff0ac061968d09961b5faf1f550a9d4688442a150a8179ae3d1a13caeba570c9ce1556338ed65ccb07918cebf601e46ccdbfce5948308c2d3f105f3a013be2128b82c4682a2a86ec7a33bd7e1194feeaabee3b860b8b25af982234f6f2db2f4a6c6d29be7d4833bf5e02ae71a73305ee4c8debdc4e4fb5d567bbefc4d9bf6376588265f830c3338cdd3a0334346fa2435d030830c3a3364a4bf923c0c06cb71522d4b3ec75f1e7bcc8feef2da611e06cebffc06e6352fc30cafbd8c99b7b9ccc7dce4b3bff033b84c4f11f43191bacb3c9c2145ff67f09dfaf69f61a739ef2a92ba82572de294e17de71d77d52241280cc978994fb8d2eb29cbb22c4b9769182f62b0f3e524242a4a93a7c165fe85cfbc8ed37ef4dacbe0343f83e7781c4e810fc277fc0d6fb179ec380f6bf1301ce66deef2ee311fc35f86f00abc0edf4f5a4b9e27849308e1698ebf7b4cf794f0290c99e44c8e9821237d922021de2593798c86d257fa82c1195e0654c27b32e8b8cfa73023759f8cd47d69eabe4fdd4792ba6fa7eef3e01a8cf1ae2228ce06e3c54832928c2d59ec9587d08123881ec9e832d3a6711efbcd8f6ef3da6bfee53b3e08a7c0e3f01cafc3691ee6339fe3423c115e811fc2f79b376e688f398987393287c9f266f96d95736d215cb94ef2ae2cb88aa038f4c6a3443c3ac4a33a1ec5f168108fca5cc19d7356d6fee6bde69d4716b4404bcab340ea3a3cbb38a9e3ae7a6d52cf5d75d50b57aeff5ce00caf5a52ce906baebd8cf6325fb87251a9d4088542a15028d50b10ef0ae219bac3a3e3f1388524ddc1a5a6b5b172ffb8deb8ea759292d79e7e0cbe5792bf4197f830f40f83fbaf2fbcf6fd7a75f9308890c87a730557b953ee9a98b655ce248877c1a3a901cfae9b4061a24d4cdb56517159b5cb7c8ecfd41e3bcdcbf0968f79cdebb8cdbffce66738ce676ff12ffc65f4fd794d1fc7b8c2f2cb871c0a53047d4cc0f05b4bea37f561a92be8739a82977633f5569d971179d98c9749211b9211c3364590091f8c344d3ff5f4d64a5fbc2b98f3ae2231152a4cdbe8e44b59b23acebbcbde05edb19bfc4af33260b872fd4d4990fcbaa987e4d76b2ff391f5842ba3d15932f54aa65ec9d42b997a2553af64727914e70ac6bcabc8a32d1ecdc93cca1362277914e72a7255dde25538ceb3f8cdafb8cdab78cda778ec5978fe154ef3285efbecb49ff9ccab2ef327be1faf25cfbbe142bc57e03fc73f05fe496e784c100e83c3d3979417847fcac3e1fe38c69545c54d3d976692bb498434932342b5876ba50f3721acb913a110aeb90fcf8097e643262b84348742a8de1655756fb5ced3d45bafe9476779d9cacba4507919f065446442e1ca7593234c72f7faec65eacb743e77c27d43654b8baabab75a65e95be5d6eb2ade15741551732aebe9eda68dc4c959fed86a49d2db8e11c78fb6adc2e48541bc0a283c886bae209e5d1fc7f30cb6ac286eebe0c6abe64a69f238cf4c1ea3b4987cc9f38070122052579114d3865357d0154499cda83333ac956a26859a99118d7bfb4af2e12afb708dfd0be6fb35a27fdb538cb882a80ff59165c1d79beb6f3214dc6432b8a1422dd908642bb88959586faee058fe4dd6819b0c04379909d6eb84f5e60ada440f6f904b1bfdea714471aea02bb85ef1ef13f867bd6e92da21816b45a0c4de015ec18e01143f3109532fd43edc23c25ddcc32cd83f1684210e59d05a45ba189c53c02cd831c02cd84de09da8e70ad98a223dea1f59495bea6fad2cf157ab6ac5e20e67d96aadb5d65a6b3d7e98a3b5d65a6bad750556d1c315bb5debb61b8f236681f6ac8fd83bb8b4ec57db1102d8176e9d901ce42048906c05279c10f2031ff480089b079b07a1d64ede5845d1e8e5ba77f9a2f9c28e1525bd87918f4e8e461f78586fa1fb50ee18d92b039f219f216b9a66132b9f934f132bd5e9e4d3844ae5a17952ad3c3455406c4dcaad4fca59a2e9a4cbca4a6f64ca34d3546a9a6e81984d9843664ad5848feac7f466572b204dacdcfaac5643ab26542a55133eee530e2202e127eecfc90527b7404ea9f5c937968ffcb4f293dfb29face3b374bbb4939f38bdb9ac27bf293fb999aa6e2a3fddd251a5d487723d478e12a53796397293e9e27aa63d94487e9a8e42a53797d5aed21b7ecba6269ab035a4d347a6e7f51ca9d21b774d954c5b4a6fd6673d79d8846d39913ffa6914c9f4666d63292dbd78d51149e210d71e4ccf1e9a31486ecfd3ad694379e949a793ed5472522a5e95d7f2d28bd2f1ce4c1f7d765ecb4fefe292a4b3f5e39d8ddcfc6bc6c83e7ad368678952e4a1be21aee3559bf0595ddcd52545b16bb09fd84fe03c0316106bed6214a7107d3ae56c22ed158542162fa07ed7ea2a47ca3d32628ee32651fa5b2b6a8b4aa5914e533f149ca7a9db343885f60cb60c48e5fe299556703a4d2692269d9ad513031898cafd82d3fa2def72999ff1d9d7388dbcae3ccfc658e35ab143c29d705fee88969b7af3564d8ae24c70ebf55b49919222218b50c6e2654456bc0c88c4ae4673e288dc2b4553583af328cef5e80e8d47776834d425c6f70f4a2ffb61214993e93ccff33c4f3c501cba83e6501e5dd80203db58469379128ff9d4615ef59757e134be86bbfc89b7bc89b37cc9caf30ee0b2e7d17095e7dde03abce7f0eee33f38bc031dc061343cc586a3dce0afc731aeb39467c3d1c731aea9e7c731aeaaefdfa599e04c2e10846b3ef481b066c2011dae99e44c7649843413248286828282828256badecb802a5e4644163c79d990c9054c70262feb2979d9ce874c3860923341c26467923e44fa10e943a40f913e440ead97e4b7956ebde84e8a6ffff61495d1e61bfec428d7c675948be2509c0fc5f9505c6eeb80c6d72ecd0a5e0d87d548d11d16a62d96a2381457b3a2b22265a6aa383129215991ae60ad542b52a8152b60345c16edf9fc781168cf0a70b09399400659407332108c00054e107269a2a02122510ec5a1b82040263d6b484284698701aefdc01422d0e4552e5bb14a31f474a92933d82b0cb25394ce1195aba856ca49d587abea4dbc849d20893d117ae21b05e5e46475b28abd5d55143116bbac95f92e5bb162a8aba51a21c94c283c74ba51749af1e472a2114ac53b29978a59d0cb07cf58ab9355ef05c3427808cf7038c80497d3f11077620f0e221922c55057cb49d78846a1b050505cbe326dae974b556331576cb5623939127b1c34240a200ea254a47808cfb0aaae56a8fa61ce8ab54a7190ec144bb110c9a2aed4152cf552a53e75d78ae22e94131455f5e1ca535575c55ac5d098ce2d4b6435e2aebd829297d8137d2210d1053f3cfb71551fd885f57a620f67327b1128e5451ffc238a211f9ef57090d88bc554986432f57467ad66b1177b3fae2a43e9ff2850a435e5c5a13b03820a89beabfaac862e4d742df6449f0844fc21f6ae8a5347bdaf5e64bdf8430422fa883ed7480b076da15c598f638f857014588ac7413cc3409c0e61608a8ab59ab156ab14d6aaa544bd7b7eed7a1e8ab39ea7b65228be4f2a1265640406e5c39c911355265bb156620f7d3ce4aa38157fdc19c641e28f4b135d8e5df4b956ac550b1a1bc143b0100ceb79281e7bde89a7bcd8f3e199cfcf13a80ba5ba6a24d54259adc45eaf87855e6064f0102cb44a71100ea2d168ac958a9642d168eb59127fc49ef80b8344d10e924b4315c81d2e308ea1373665ecf446b38e3e92668c71dc576bfc591445acefdde57ed168efd14551aca36fcf43eb98deb463bfcd587da059af8b43b03de178b3b6c113eb3d6ad336ee9d73493a99251479ba6872515df39873c6d9c7afa1344b4e66d3369a4e1eaa85329da6d299964ad366a6e1699e4e25c7241f95d290949a6239d2a44e47b98601d8208ac4559b30843fd8025934b25738f188c4a71326cbadf179474261707c82041e0883f88783e020b69b92fcc9fd53ffdab10d614d0c85c2a110180645b73cc25a4a4893b9182b51ad4c602ed3888a17aae2a2d710d6566ccfba1d07d98f85009ddb6f38c88a7f291632d32c949bfc36fd046ee8700d8f24e96d3ccf569ade5afee9cd55150791179762c642b0cf79cbbb938bc7e27b449f38c9f23b4b601f2c8e7b58b098f5c9631fc63f5884c12e0bee21ee763aabacb192bf61cbe9aa1743f5f4d58fa17a3aeccf503dddf5a9503d7de45fa17a3aeb3d5c39cb503d5ba17a9e2e965c2c3959da599f2e965c3cc7130a0f9d6e14a1663cb99c689452f10ec661df2352559e9ec4f3abc8beec937f8052ad22aa4d9ea8d0976347ff1279a517d87af11784674243c0186417cef0aa2622500ce2763eaf7cd6992250b88259657e1212cc4ba62d5d5ba91bc4f50aff58cf3bf99da4467c259e7c9833120ec1bc995ba033fbed0699603014568a4248488a3b749e2ed88b406210518828240eed938a540cc2422ba0d409b555aa97eabc4f9ce6fd699954a908243bc152f107b4da2e485d9f942aa34c9b86a588e47fa9f2bb584e58d2abe3dddcedd9ed7ce6ed5d15f756fb84e3d960ab95bf65895820b04524ff6a44e5da4ca0256952e647ada88fabfeb82af6f901c2331f9ef5b86aeff5765d791bc4b33f95b74350bc5ee3789ead96bbaa8a19580478927c7cb9877b0809eac1b3ddda6ab9af2f2dc064a12c16cb6fb2412c9005dab098872e93e53f9ff8f9d93119f9ee214aa9ff619f773dae1a4bd19c5128adb244643e72d2a661fa2f0405fbc8671faedc73559c7baaa04b137269435c70556c7d7cb60301bdc8494b1292e45d9a9ab6dc937d5c15e71e629a77574d2953d7ff9edf5c559f579f7b641fb977d5dc638184add4fa7cac7bdf8c61ae2250b9ae5e04127f2f0a11870ce19928846741ae1a7455eca990164e1faef687ed892c0fdb03fb28316d4f8fe551b981b1af5e07b627402e65eadd5b3954719ab9eb79b99494670f51be5369a81da5653e336db298940f73642a4c1d318d21dbc0abe1c78399c355b10a1306bcc6625a85695355d3b6da5bb5f32ec6f56290599a7bdc19167f238e51305ca0d4d9ccb4ad7c6f95932e27d7dbc0521a51f496ceab1783cc56cf9b39ec79278ef259c5e71e9c7b78e6cb4066232a5c7f2be5a97094eae4ec779698a9d2300ba7f5198a69433999b255a8adfe89677a66f22c14ef33b32502e119f6713ccf5b0bc58cd1b28abf7d83131498941815a099d58b27f167da54a948e4b4244bcaac56abb156aa5a0a55ab655f512751f47c96c49b5992a35bdee59f153b16711021b64733018220b667b483e4d6a084892e1c79e446d25a710927760f85dc205715b26fd0d6c106b23b8e3dff84358b01c79e7dc29acd800580b046f408693cd076708063cfba90b600c79e73218bdb2de3d42c38154424ecdfc8013ce6f08804767105216ddcf5e0d807c70f706c43162f38f61bd6d870ec62489b80bd40486b404893008d018efd15d27e70ec1ed222e0d84b421a04c6f406b9423270eefbbb42ae7a5db64fe04d5c021fe33f3c8c47e05b38045ec61ff033eec3d3bc87aff9ed69dc017fe33c7c8ddb0c7c0eb718780ab8ddf91d16f80a38102f84db0bfcce1225246e8df89d9d168f79035e5267808bdf18d7f7053c8edf1857f71ddee6025d9aa967eb20a49992d83f5c33f5460e84355313c61cae9984c6dda59980231221cd6485fddbbffddbbffddb3fd376003c89c7f0a9c3f0efebbbbb7899b3f898af70594992cca58b8bcbcd832faf83c77c0eeef2087098c7c15bfc017014e0b44f80cfbc7be5bf4255e4e65b11054c9fb5054e6b5a6dea9e9c6a2c051eda22cf4634e2341f8b3fc2f2e6f58ef4ba27095a944deca468fe356da3741be1d43d463145c289e8e48ace22eef1f1010873f44ee854f3ec8999897f7e34ca114eeb3805ab983631dd4638ad8b2da2ab983ad79a36118a13035931b1cfc7624f5658466d438e368f7758a7ebf58cb71cebc62e72bbeeadb7d676d45ba4310b0a895b706a5f29c937c56c3dc5b4695285c5a524bf0c02813887713217334b493eb9ae8c38afb0b88c827ebf2121a1984c84b5bc8c46634c49e2bccdb9f9ebe3f301e1d9cf55713ecc29cd17c315932cc9d1f88289f9a5247fcc3025f95bd4168d29f5ef0aac18c7843297a4cb54c3c494f6cc3e53929fb188451bcff8ef8fdb0bc3179c8632a5a881f356f2912fe6e7d9a457876736b9db9302bd8b81d73d043d676ad8858e607b8e4edaf0b228c9bfaba8c5d12ec2386e9d8e806cdb476cb924cd9064ef999d5c916d3c5b22ecee10ce5bc9b7967c9776cbc11cb479dd23e8bc3bbb8b1b59a2631105eb4deff04def4a311d01ad684c149770bdf9c5158b79bfc06c9bdcb3cb365f127267d7f3ae9577272efd6c915fd0861a26666b9b1bddd33d7a57faed17ad39e70c33c33d5dd116b58de837e24838136d4d18b68c7ec5b1f4cb7925f30902a6ce2986aa287abbde7c9863f32222160814d7f0d2c65414539280a41f907ea4c63676bcc1c9bd600e9ae48f2b4eadcd0ff16c1013678cc643dc981813bb8c29e302dd9fbbb58c5e3db05e9fd13238ad0bae7a7dc6b43e3326765a5e47adb5fed16a25cdc45e33655c71fd897650ad6662a7316560dbf3adb7c7f6d0ac28694cec2bc6bcf39d77bd79ab3b4b9ecd95af91780d82b0a5c7e8b58fde9d5df7594f9fde852b3e92ef464ac17a7d057616e4db55f4bc1b1f8d38a51f9edd92cfb65cd7389fe3071bfde3ce6c8d068106a29160a17742a8d9baa6e645469ca1d9d83c0f9897039e5dd729386935129004b4ee03d22fff8c608182607f76607d6cd0c239699665344f5569cdbb5ac98767a468bbc18620bc6a8db52659c503ac380d5744d73b1d621c565c724204251faee95d38bb367e5d2311d66cd21cf43498c41a1c400d762df970adf40b4b3f086b19df5aa522acb7a484f5ead24f05e1cad54dd8d9d5bb3b93c28f094046c83e3b68d960bdae61b0cb59ef7250b5de7250ef82a0777ad7f4ce8a58939820f94a42a52092074a3f928ea48981c69c315a61eaf8aac5cfa12834435554452f01c155fae19a2a9ce93649b7de140716a68e8f35a64d845163baf8b1b1316dd85a1755511ae61e36a62ddbd8e89b22a7f5bc967eb89677e358faadd7714c9bf8230921055d1ac62312708bc62705917e2421405c2bf9ee88b4aea68d84718bf4bbea25af59f295947cabe7221a97832a4115937e2421a4207204cb601953bbe85ac4115bbc5ab848b9b0368e6d70d8fc0d67a2afa6ce68738fdc63dac434efcadd7a3dc71c8f385f8c44e38bec349ab0642299a589348d44a3696b533689f8da1852f61290c5b53548826909bb441886611886360644b420aee14806a3cf8d6368fd62adfbfdacbeed838c3bc350b4a50c63b7d9ade85b712a6a19b697943dccb80bd4230a1289824443ae909c87f98b7f398c47ddf6d963fce8359e86df21baf4312961ea25000704e4a0438d9a8d97152e2ebf655c8edfc42cbcf09b4805187e139d60f39b888418269f690aa621d3164c416f6139e1b64d0db11b66525450646aae10fd7788f6db151294de2137fcce123298dbf89d255646aff1ef19187368f8cccc6f8cebcb6b62505f01e337c635973eeb7553efd2f6ef2a11d2f60f42d5876b3bc83485b0367ec034846ba36eec316d21a48d49b4a839e94df517e9cd5b30d25bebb4a5265f8cd4e41b7b27dc25c95be2f2f52f6e49ea5d96a56ff605f0942780a3bc005ce50710f300f06c83b7bc01fcc501bef20ef0b1008e02a0a565b5c1000ec8f1e878ec00f0680f128b0ba9c4b2b58dbf3edeede1d9fd31afcf554b30bb6421b990509b1a62299f0a55ed2adf0a55ed28ff0a55ed32efe18a1ec3993e43556b91ceaf22274925b93f6535894ca6cde564098544dae76c2d9546930df23c452c2b1c01bf00c7e177f004b874f806a8b001ac61c22b802257031eddf5f47c3e1840638fe32c4fe32d2fba7104bc02fc05efe0fb4f6ad8a8b1c2856de0dcb0e89d2469329d2a6c280f8d43432b5d4984f50d36ba6032f6c6ded81b7b636fecad5614c785fd24ad998f98b61427ed89e2a16993b1d1f81ab0bf3b97e7aa3999189414c5dd1495d9eefab83db057b9ffd77f5e0d1dde53cfe1d9c5d5d001c160a60dbe4a477962660cbcc68230190e8d49d11eb2598ae6662f83a77c0c8ef22fb8cac3e032afe3313fc3e565b83f0ddef233380f0ee341861934f8e4501c1ac3a33c303caa7be1511e3a8feed01e46c8f8944567376d23abdc0ffb3075ad2acfb3e1f687672426cf02e11990150a0ab2403bf4fa308ff687677d4c4c4c9bcce424b6d25d5ac8220c57d284c5cbbb7098c7f19817b95c875f80e7f00cf0fd2897082777040edf00dfe16d4e02def6f0ec0ecfae37e0adcff6a0e8ddd0f81a3e7e0ccf6f73f461f8eb5f38ec737c870f736e18f0def31e3c73f1ce733de7b81216a4abc70bc59d942c5ff396a761e12f7fe330eff29815aef2338ef2359ef2349f2900cd0ac0e574bb9ed477ae731ecfb178c721b1f309577ce46b081d820de5a1710835a443718fe678743cd0dd557ba4d846a29a360989692b89fdea2c8fd3c25ddec50d0b9a170a5b5db4c0416277c382e685c24acc18794d7115d3a6e22aa60c719d3919aa9434bec6caf368c4c0e48e98c08d33b441d11cfacbfb8ee390d8f958868ec88d2a331b2e9ce56fbce5b1fbe3b8cbb77004fc0e8ec32bc013f037f88aa8c6559ee6283fe3295ff3d9afc8e11720fb1a2b6cf87648b0a079a1301f0adab9331725452eed56b285922dc882382ffbb9f1b1a079a1b073458d3653e3c25994471b0c58c00e0af0e11879b5e78bb398b615673165882b8cb9fef36ab8ec79361c562346d793848dd008980b0c6fac432f10ae1411b65c7f797407cda13cba1dda83f6505f021ef5618149515cb9ae3cef06ffe7d9f097779e771c4cea391abec3b39697f9b0b40091ebe82f030a57aeb7a05229128542a15028558f5c8d477178c6a3e3b17361d92f5a612fb217cbe3c2ec1516238bb971f7eb3586c68e0d19d3a692a2381b99193c1736e0d97519b386abca9830e0d5c646e6e5c5b4f168784c197bed2c4ff396afb93f7697a7f17f91bf3c0b87f9151e13a7ec27ad4b7e1b3bb0c6786596f5e1591f10b63f57dde588ed8d2753fed66adaa2558fdd680749210a5240a1542a7349ca4c78821386f28a3572d6e7f8219b481fc9911cc9911cc931a53b995679c4b4b894aa24d24b9c2214ef90c355b1100fe3005e660da67cb239e2f4305c64d8116746ad4e244b9552b929653a79cab49d60999563a64ec631ec123355945beba8b7e1cac963a60dd584915346a54e59e5d81cc7711c497a0993ca945342826c2826b84c5bca73ced964caa66cca281737b7b20deef8cd5d9e4b3b39f656ea971af229a1541431646b4e750c56af53f0ba309bf72a3321e75269ef1513dc744a43d3662a91cc921c89c6bf5d21a99fce2c20eac68ab8e29a73167bc059c499dc18bb769dcd1876843919a7e5113967ecd85ad2749ace92a92714b2d29c52a8b334e3b66e6881d0d8f3e424694f2e62e0bc5920eb650288aae597c57215cb4972c4ede962390ce6a4cc477793c449489efa97b8c968dd7e66f9387a0930c4e5d0f1c3aa358ad230f2d1a637944c75466978d5315c7f58addfb4a34e92d66e1f45ae7d44c9544794eaeca3977fd3aef26cc64072916773865d493ea6d9479cdcd69cc1aea388e43bf5110f4d1a483ea63d905c94f650e237c4db4e6f882b4989abdce46fe2fa8e4d18583efa35754a52f1aa24a9bb7c4c6fa98b577d195c0677d3fd6f44aca675d3dc9eb58fa68f6ebacb47d347eb5ba73797dfc031587e1bcd54e6aef16536bd91aecf6e4f97e7d15d9e3d36e631e6e35aba4d4db729aac372eb2cb7e96db492de03e9b012c67218e93096c3604efeb0da91c873606dba8539eabb2cdd9a30b0744a87a537d2cb5bc2fe46de2e0d58645f5bd7fb96fde5a3ef81f495c84b1d9b9e57354b1a4867f92da737c4954c61ae721738f627aa72d2b4b94658eee29a3aaa95e52a1f4d5bcb59eee2b6de06adfe66d7951db2f2714c6fd60a61f9cd0a596f90d0ca5d6017d7feb9ae7ec7fa637f547edd06e51c2ad52e2d10eb021d4b386ff6c732b15ebf4c948eb247e8b8b39393b84b1b53ed39e7f47672727c8beb39c727e2c4e1704594d94927914c9b8e711c738cc8ece1eaa319c30e33a7ce538b74c6638e4b3be12ce6d1c511d5d93efa4e5f638a435cc575647fec135705b2434242392ecde6561d9716aed6fe641a6e67341aadcb4f38fa1c3ab48bdee274ace398de449e43868eab5e92494a4b1a46376d24892cb9ea75d35d645731c7a58dfcba8eec23176fedc4478e5d4ec6711cc772cca38a7ad5abaea30e5cb3b8db5355a01b06c36014a7b53b4aaefb800c4b6e25fc03faf1f1f57a4a3fd891a3168d706c6e4a3f31ebcd425f7b6c6517395232dd88cc92943ac156a8d3c606276888480eca4399884864738383f3376ff33abe71d9fa70cd3d640f49be206cb94ebe60bb3896842cb4cf08598c7c7b0c355c1ae9db7d08599cbefd874b23f9f61b9766fa76ab0b59987cbbdd29df25dfa8ef93ef0df3fdf2ddf2ed77af7cbb7c9341bb66b3d879b77ffb966dbb49e05eb163bbe4d934bbd4eddaa6edf2c79ed9a56fcbec985d06d930bbfc6d97ddb24b2936cb2e817b65ab6c9367a76c53b751f66c9b3fb6ba4fb68a6dfab6c93683ec924db2cddf369fb0d3ed6410ae913f3564100b5288ad31a3109a5108c27a9d04e25ae9b78204c648208fad29fd88390dcf7abdd4e15a69aca5b751f7c3d6947abd315806b135251f30e40fae95743af2e7e7876b24a0cbaf450a5b53e229f1acd7594a29d6eb2510d748bf125802796c0d498a141e1dae917c28ba99ee87ad2105517f9054a4bef52488ad21fdb02dd74d82acd7cd1fae9940f309b686c4635b7625e96f254979d6ebe9137e67f36e148d38452749a65539f2c24eaa8899316cb02459bf2221e19175aa92129e9ccb39d6a74c4c72c6651ceb51ebf6932227a6180caa306da7ab489d5ab468e1abbf31ae530869252184eaf5d22f0777412184342d8250255bacda69b0ea17aca4c53b5ca30967faa6c7dce2cf6f852f0f67da45af862bdacd570955ede5bb8432a1aabde4d329abf65b2905ebd564f8b36622501666a5b71d2ed86bf294220204a270f48fd5a762c47a933a9b993693cf504ad69fabe87add3382b516c52171c8e7aa407c3d7a7cfc085796384108d6eb33522d595f5ac959c97a528cbcaaa8a8982a2b2ba6adf41553c65d454eae94ac2ff30e977eb6e53af6790dc4ec957e62ba225229594fb2b8bca5a55c995e9252df3ae52131ef80eb4e1c4939ca5ba693782d1c07c76d704acf794e8bd486b3d24d6b8947614eb952bef611aea05e97206cb99e7ade7a9d6462d72e0a514888f5a275cc3144677431c5a020d7f36c7af47ef8eecc275ce9b9b3ab773fae9988add12b085b5a8085f5fa8b10f1e752b27efff8c0983cd1e70b220201b15eaf3bc6d4115795933025eb7388679967938a3b51f7c3147bbd9919d3462262adb51928538e842b0eb6f930a79583701ec235d22f13b135245f501eca446c24208948cea5493af3cee6068774d171fee66d4c25df0e9280d96f242091bcc3b5704c53533a9269ab758af82760571290448414bc3418d3b65f467f19f728f2cc98624ecc6dd724c93c5129f45482bd4654ab96d39832f4faba47f5ba47e987add120d07a174b7fdcb505eb957a2327f4758f920f58f055f251ca4a9c3a5cd33b9d2e447b584b6e4b2ed4654b2994f6c1835b836b69032693f49382f4337f529c6449f205496f1ac899fa828c44e30f928ea4fba14d20894703394d2089272bd13284c5b3f1fd7a77d51efdc3a7c9119b54fb486b3435edac17553a451169d3c99277b9977dd9a734a64828d2dca392a666e33a920e58f2917c2460e947a41f26fdacb5790de4ce763d74cf4afaf92038daa2358f56bd47fb77c9b745273d269f147d295445371f15aaa29380b8c61245dd33bdf62196a3bcf7389a36d3474d9efa7191ab0683e28e9887b0614bc62bd63e404e128b4c14f860e2c7287e5ec5d4efb045cc2491a9838758f10d574e221fe1752472d294319677cd245409435e470f2f6d2c91085748321589cad2db1545f2d99a1cb42d409f11b6124eebf31a88de99af7d046d8d5641d872dd099f784a115948be8323ca221e47daa6bc214be669dad9e6c770b6bddcdbc92f09d5fd0a67db8adcbab5dbfac88a30110cc4c08cc9e7b570114e8b14ff7818084808075d158b7c14895491db7c2a9c893c9e7aa8046b190cb31a3234000000000000b3160000181008040483d1340de24852ed1480146ba4605650974a84590cc3300a43c8186208010410006008088cccd40d18862dc5f935fb7e7360353550c2f5ae1f5435fb845eff001653c7899afee19bdef63d9e3aea1e193328a402ab0518d701f0451e892fe53bf923ec9157b3f3045b09d7bd08469f7d515b992a7987164aed86ea1e3a722dfdb80080a8452ef73d2c02db412d10b29768c317464a53b09be44fe7103fb5ac4c9458416a5ca858ba15e2d15b6b45d96fb503103342662f9d01601ba2b387acaeec3795c457e9c72efba998e1a057e441baec9f8bc40932199c5442e99acef6125d3dd2fa6c882367bf9f62a78c1e641962df0965f2fced906efb9ef6440aed2377a987ad0386ced44514edaf847b83b9080e85e825193c1ee3164c1eb32ced37bca619f9f4715b6acad8b2d17a5acedfde7425793ec2e511628c0338c8e1e37a9ab08c732f11ed5b8c637a8d52a98721f892a93c336aae6818a3d573f46c43fc221894f0fa4ef812eec8f671a0f98a90477e75d2d5ff4415877bc8734df3866529c83b735bd0102400fb8215f7a67c3ba1f981e27c392d656c62d9f60bcb07f2cd643c9b16827ca19669fae34b1bc750435332b9b90fad4a83d1a14cd7372737dcaebf3266276cf65b91dce930e04028c41637789767c14bd5f515ca2fd7969727b7baf780ce1997f73aa05797fe2f863f17f64f6dc3051932fb133a9a55186f3dfbb782094988bc9803f61cf6c3f3930dc9d92f4beac76debb09f21307a30e982e8fd79194bf82dda05cb228db62290a9c53cc04ae364e8bbaf31a27ba15cb1bf190c5f3594c1e40a6303c8df5fb27fb620f06777ee11263d1b51121b84dca16c142621c0aada9b60117ae422614c1b45f008611fbfcc7d5b4290367fc34b2ea44e110864078e4f5523385dd92c93ef12d900833e88dcfa29bf7d963b4feea0d07b3d8d8bb6b19c75c1c71b1a0fcefaea788343eae57213f34cbf38c0b6100a9e9b19180cddf56cb17b2317c226eda212739a6fd0f233c6495f0a411c3dd847b4378b034b4e96ca7f05e07e400f7c512c3aa4f4f52ac62e8b2af517ef50d0f945801d7a80c26486452f8dd4e450d533396e4c0139e928ae8845a7f0839890feb7e31bcd1da17dcfeacc54dfeb2ffcef5729e5b9b496cbfbd8c11fbd905885eeded3eccc7f39e2f023878e131cd728bb390d909306f7b3053e8b187defb85c08ee2220f97e04746b1cf11e3a3116cd6b4536eaacd4155b64821a5f8e6c54ca5d7cc28b66f1600d9818b313c977d28255f45688a82a29022a22a5844a6b1aac4d0a05eadac025162013515051c0df4e7580b501870f03f4b7b951f3ab0d03cb5606189e72d83b7f83dbed5b9ec30876a52cf38a701b1cbcc624a44ea9a271167b819ea213a731ff355075b959b187dd42788c50d1aee8a40ffe4e1c872daf2957dfd25a712692bb185062852cca74d4401f2e7cef7285bae1c6483696496fc3501e83040376ecd330995586829c32a64dd135fc1a33e8e6b638152bc6bce5f963f99820b2f9b1d44472228d4d003780a81b4800794d3175862859374e775ddc060883baa146048c9d7b9d56042ada0b4f3f428f0400a6474993f910d1fddfe69b922f4245a09dfeef4531a4a0cb58d50edc15ca891c2c3b2118b6e88950d1c0e102418e5cdd0b5e6b850d92201c2ec0d54f4130a9fe177414555e057840114c51ef98b8319a29230c45264345e113751a2acbaf7746b9080769831c144d1ae7646810fe69c03312a895968e642b4769150f83df087e435e54e9b949ef7bd01bb055ecfa95e8ff0ef613b9e6ab0f2817892d669d89a3ea7d43b26ef44705bda9a1a2a8b906d9c2bd9584e6aed8a0fd824e87b9fc254188869b7fc53e70c2cbfc501110927251003491f24f6c2161cb6263a11529ebe023e7f84541508d044f1af5c5277bff100b52111501769e28d9f66ef8d890affc777b5b242a62910b512ad12532b168f6e764989858e90a0e6043c8b769126562c73d1c7254aa80439ec49eaee890917373e57aa2bc34ba7b3091cefb7807445aa08804e0d46ab008fd9f7fe800edd0344df52a1174485b6c88b3958834658906e5f3690460d91cb5846985c1a442e6952f80b0176a8928ed5e1261319b8c23726bbe2429182248ed505545051f3f03b83a4d3be2e0d7534b6616147f30603a63093b67e3b45d5d2a03fc16a222ce99a7863acd9570bc2a488a847691ea8ce48e099e113098fccc7526ae4b754b9e3c50c126e5c99e037c170e5188ffb1284029a849999143a38a70eac8f2cf23da590679956f83b365975390e47f202a216f6b7dd01df846b76bf12e17dd1bb110ae82862a42ca524f150d67eb3a7f144fa1d0324a8cf497829352150d2812aea989f0af544a49ed3dcd1be8a764e39304122067f2f0b22ac00a9f607dc781d4df02b0a6683fe855244d0f8d50166d930d3f6eea54f900364503e01425edcfe3db25c6d89b5a0bc4023c21e853725c0a204b2573e7a7cd7a52c25dcc2c71edb0bd9b322d6a036628124ff8dd0e244515bca1a22852e6a1f47189de5c5e2155ab1e138023cb4052e72b9c83f1f669d761a3aa563d2cfe876ba5a5ffee072a2221c929bd50662d000e53a47e3acc43ab63fbbb34cb5c841ea01e98883c080c716c02d713c404e8e32420929c044d2811ac1698abcdd23f0e5626102b87755d2f6737d6f59af3854476512a15400e5760dd6825968d6495523d7a321f52cd797258bf26583f4c85c58751b78e9444924c9b945b8d951e8613953abb3c5bf35183394ad547c2fa2caf5a7bf38c4094cf126cf610e27e21c94a9e4b6e4c4545de7062a00e6797bba308356acb318242b0922761754c8a0c685038f3e6efaf64cb1705120173a99a45fb290a04287d743cf29225547287d7ee6ad3d43cc8e396be975d777edddc990f69228d04e7309ec9644527e1c9f2f52e3150f0132607764cca35015883b18bad12b7531883ea932246004f69c893e57ee20fb6777dc61032452fed65bcabb0e1d4c04f5dce668de4afe97aeaf64a2a7fbcb586a55b22f169bbde1a5d914a4ffc0889a8d636496971e653cfd86e6fae38d2f8af401139328778e93f2b0ee8d0fe5f715fb58189c19345b10e23e9f330bb28fcc5798a3688d05acbc79c04ced0435a75e79c22e01542cdef70ccad17d2404bc616354cc4b2f411938bddc0d549c5fd85dfc2689545b75e8d281195eb8b65294873cde6bb41b4f2340cb550eadd1ecda8d0cbf2b839f2a997f3c3c339e37e60c5e118ea5c04c24ea1804d03faa394a5cc099e33ad14900e4339c80ddc7d68108fc968296c73b430a8c2ded3761aa8aa48b52e58ed136bdaf298425a16a361d5e764248db952b23264c5b29efe97dd2a1e4062d7ae008878d66105da48863eec8901536804895aa3c3b71aff5c0341821a133176ff4865be86ad25bcd21a14f641cc55399f27cb2d5b79a9621831c60bbed3eac2d7a15e0ace730e432e229b2ac1cf0f20c09b5bdbf9b79aa9bf4aff49a1ab91e113b956a8abd9742d8fba603377d967897fc7eb1bfa028ead453747d91f904f79eed52654236468d76a29be4b3acf4c19d847ae48b59949401d69f8b26f885d234fc0ee73bbda0d5d96ac7d90205a1f82d491dc3519275b999ed4ef4dc26c421ab87b4ad3530e46f640a6ffaf63a8e3f2a4ac7bc62ea20d27e0ff333b68b45bc36e85d0af10680ae36bd79ac55bcd7ab04028f858ea876f98e7f488fe0cf18aa113ae09116ab8a592c2539a94942aebcc2526fbefe7e1fa604703ac55b7cc441faecd6e506a26bced636c2dfc5b8d206b50155b72730c822aa8e18fb3c2e2092bdb6c73f616cec5d48f654e1e3512b3554c1284465bacd2077d4ee3642b6b0c52ab140b51945400916d8219d1bbc34454d63fccce62bfea09bf3dd6f3ca38f6d66646f2a6a27be26712d980a93888a1ca976553cf5638e234d0c6601f759e15f7069f001641de1ad15cff2191de6cf2fb020933eda496edcf01199786016c427b802003afcdd536cea6c23803354af3a264b921e782d423e4e827bb5c9a81236dc25225e7417833a357ad7ab2fc419660151fcba26076b380f25e5dcf34f4bfcb845b0011ed0b29caf21be80a1bd1b7843119eadb4ae74fd6ecc50c5ed69a00ee552ab693fc6a4f42369aed8b69caee8da83acfdce46ba43f2a985b99f910ce32b772c181f58a89223f1463ca4f3abebd22ac19bb2f487ef523ddcad0be89f3e13ead62e12885ddca80dd990a373d84255ba53cfd28d05e7d6a3858f4919549e42f65f400521da3be1b129d0c2e730767a0d49d2c08f8134095509a944f1a8dfd7b8ee20fbc7e2d2222f1275a760675d5f54c4035c6141d5a459805a15adfd8b2acac0bce6a1055f5b5250b1ced957e8c2e65e00c4a16a21c7b1bc5f323f709de538185a9bd4fb05837861b2c3fa9c6d8a2416876273f534dd8ccd80eac251366327e971ddda1cf1f414c0c0280647acf0660181acdaae87dcdf30e9e5d7cf527fcd8e42778104178b85214fc45179a487b0b0aba7a2ce3c9c42852e5693091229faac719e9e3eb7485af8f45a5cfdbe02c41d0678fedca2fef9065b36b151e2d2612138c31b161dd084bdfa9d6af8d70e8334a71252af3679c8c77f31fc51508b78f09e44043b7102aa2b8f28484210a8368cf6edea0c43102aa73252414cff2a9be73ead31cc93f5cf85e992a4ba16ce8d2ab03681b3e222dc1aaf0a173baa67c4cff5c72600e8809388be24a9db482b45eaeb7e7af6ea606ba72bb14e6fe56c2e82d29fcf66536f9583375bfbe4d572de1bef5a68e895aac6c81b6a1687a59ef7335b8c47c9e887305902876b2e046e68ac6762c145fa5215bb59f9e2f3cf871a6c69a52e06002c587761fa47909c281061e27b962e6e0c6478344d0c977f8af5e738552cd7fa26aae80e7f2ade661ac1ecc1715e2d57c92cbc0534b5123c2a1bcfd2ef9d0500221c9cf8ca7d0ad01f9a08d5b5a601bb48d4ac5de65d379dc13b62b5970581a0fe622e123c61b180037c5fbbf57835df65843c1b440e5232fa1f6f3e6da5de468cd15d6889dc2b9a2f631e953af0dd272bf85992b162244ce32293caac97cf049fa920309d5b0d554ced5af2a17eb2ae3d930e2ae467c8fe8a8d282d9db791e77bedeaaf7307e389da300378a01ccf384588c46a13cc9e588f09b97893582055b8a32c293b3dc2f4be67fa02ac078406330b95215f75cbde3155e64853aecb992c6d821f4028b0b2525d4f15893c32f71f188fe8f84ca5b7713916ba1b7a99ee5dfbcb75d385084b92b826775b2b074cf75aeaedc4a617f0d98d47aec440e9983c28643a4a9665ad46240221fc8a80933944a9b07a6d0867f3b7082b27ad4730b964f1b15d1a300d9939f63d17d2b405abf599a6405bbaf6699c014ccfa2b480b02b9400da1cb7f38f7476ff0fdb31cc881ea4dba12c8d1f330d31a871ac86932a4685e6b1f448142b6bfa60b80caefec77959bbc419a7400270fe024e30589120c2bc33988713f4c2115a0eea08a29c2ec18307d2160b2371441f93e974c41597a39724f551cfc38037dcf0955dcc938fdb79a294c7437c40254b1f51b596aa4562c9d2cc6529896324f0790c7c08aeb1007d3d0ca6aa399e2f93326204340b30eea28a3dd040a78cd14d9552842ce920328804b2062012c36db3012cb9fae1b5107020035583c94097056ac83d9486087d7f3d6382408deed0269e945c914a81f950f7dbd536f8f6e2a253c3c192d238c0a63d6bd434b06a0b308b14c20857d94551437583e9bf824058f585e780f7b4e13e400551a449ce2d93011c990ac3a363d37360063c042e40f97de5f1462451c187a0a1a276986a154e9539277ed5d4ef8d67f0afdf7d565d93580d4447f25abddc71ea9d3d976633034702a7ee779723147ae109d1d1689850e8a26099985f9eed8210469ac21e1015a70586b06b1162a8a526c50a3b173143ae1ec1b48426519914e36e3e75838089292457ae234cd1f8e1cba5aa8f802a2a0609107c94d22cfb2f175d2733fefc1c101053ec8bb416d7845bc09889f47b141da438037bb412fad3e591c2ae2e67e6b9b533681a1762138e10ec4dc9184df278d8185bf8cab821bc87503f1f205de61871acdaefb0d5790cdca602eba7fea8296667782af389f887cd8b22e035d1157a3fac9970937b6d2bf96ee0922940bdc3cfff01406a2af6e73f06fae7030145b75c0d317823d7ae6dd860f63f57fc50ea62fe0f67f49f5917dd4436fbbe0685c48d076a666221128fd5c14b359bc5194a9340beaeb8ca6d0061c4cf5b4208177d00df84d15b682792d5a11a50283b3799e1df9c00a2675945a0b1e56d8da2375d7fa1356895c31affa239c27e8f0ae561132624461efdd18ada99981826b78c77360c44e0147714169bb3e578cde281a0b889ea99396d1ba82942bf00d4605ef0b296d349ddae31e226cb2f05513b7fd11e701e1e2e6176a9462f36c062d9e8cc9bbc0cd309015796dddd46d85fccd305f412f27a51f14d3931360cf328908fa65a366b24222f8a35c007253cf0e3c8c9c86924b435cb8cbdd45616cd1a7cea2c488c07eb2f568f0fb53def90d7e0e7aa852a438ce9b6774bb104176bcae194573449c2664d438bd8257525658cbe1194bc111298d13e3ce53076f89a01fe8e623762a109779a523772cabcf6860ca3916a6d78acd053ba2d350c0dd64d90ded66724fb9a86262513474747670c11723fcce6251caa9db1968f9e7e5821046020c2bfe6870c7cc26f06a94c24ef8400a1979bd9a0bdbe447033c6a7e79d67df8ce8f06a62e8b7ebdc5b6f0d3c360f2ea98a068ae5a874bb79418031132e5981c50fdbcab0752b45c077b6899be332a8fb6a6059d1b617f985bf8e7d36b0acdc28d864103af30f84f31273a34a39063822576834466afd941c0dcd8f888d9653063376e5babe0da15657b62ae0b114091f40953cb908b032448f94fb1eda3124b6b95c272e2158ada2337ee6d590f8e132c4391dd54e52b6a33c4a49a4a5485aa80284592118505f7fbb0d206b874a27190d81a36eda21103a648cf39ad4652d1b0c4f3c09a48b47cda55680de03e63a05dda52547f0312ce04349ecaffd4aac020c8cc688266aae7fcb9432308c402c6c0f526e55742717ddc516c494b702f3c9b4243113aca359672a0faa2e36fce73fe9f2792c7b1bfb95597e7ab5c9850cad3a4aa4b2b91c4daa72c36339e4dfa18806267e8cc39b7374f8827a2164b8e3b7c6afd2f38cbc0bf60a7d88c5d714605cd7e6344dcc9284d0af4fbe134721d6de8a1739a7261aff5dd5a069c4b13eb8b7e344c05fb377e35313d7d098dc80cd1a5681f7653098c511ed186c98ec0bd5dafb62b05ad1297fddddce93bd50807027c412455a7856f50e3613e541ead7eedb25d9113bb382598edd198673b15c60c3c22efef17a12bf3f895a890d3a76ce86caaed275ce05842611202ed97ce0e4ad7d7844a03b49f4da024964ca2e7becc6820b01e9558e52ddd2faffbd11715af7e2177b921ad48513150e564a88373a4803cd74d321370144d087473c786132cfdbb9d0dc4b722f1b9add63bcf172d68bb183bf1c8d097df3c82168988861299505227da7d8632e159de0a0f64730ad5ffec5a9406e0d50a150871789f1fbda292630b9a0d50397dc262bcf74eee6ed71b4c4b25bc826c52c5f9f5c543dc9e64dc92b60522dda59f4e736f0910cfe7fa614957f4f81c11bf9d182875b7a8f879ee8ec5d1eca9c15e122bdd0570098b8a0d11b832ea5c0f67badbb407260d2eb27f514f508824fcdf3275e15ab8634da694f5967d4c390c761a5d807c7b0ec247279fa0580793a1e37495ab3214bc95942ba21957a62c54237f4b841df4baaf839776228898ec7ecf92986e97de7a1e586da04fe65f952dfb457ec27f6da7e1922f90424ba1a2dcc438506a403cf06c6d8fcd9ffda8dd333b15160e5f6181aacf5c770a02e09dc37c0a460b75e1996d1185fbaf31b41548c444148ff826e5148495726c2282c8e460032a9dc8997c9bcdd8109cc5e8ed3eff28c79c393f6e95391627ffcd46364a2cf7b7956ce2df05920579dd9c359e8c315b5a48a66798d19b93054cacc8ebe033796e14a28ba81e3cb3bda134229d3fe2f01e37701b9378584fb253e1837b89196f7c8a0f85b0f31e885b122ac5d238faf7960a6f08aead141c1d4e6b37ac084ea7d66e7e93792698c60df503aaaf1e30d0e59c1db888d3da2d10b8c25b80b9835abb87557d0c87cdc709ebb5f7472ab916dd13d92587c2e8f3707b7d58495fb483f44af02573a53a9f949dadc3b325606f10450febf41883157667b39b97d9d8d39ecdacce2d93d5ca8044ec3fb7bb1cd57fa9c9115143c9bd677a7fb498556cf856fbeb4e26d0483b9055e60f3898e4553c79070fb53a209bd8481464b16aa2653064d67f454b59192f56d4a33714de77f686d4de44de60576c910028c350228bc3a7c7cbdb5d49de1b7025126ac1c44d3c70c819caf9ada8a22885bbfd5349236e811145b81b92446b96c5b0348e8772295b41632ffe1472a17b768165e647f1c4483790f86e4c0c0afbaa9a9391248808202815021dc01f77efac00a3bae0bf6cf4bd8fbbf995a161c3715a9d95bb6f714193a3490ce1da04764f82659cb3e717eac4f27493c92e1516ac3c09f4f40cdd74f2077458c604ec0b32698e3a03ffeb0cc9b3de4675de7917a0f78652c25b14859ec5c3c358ec50f951171662240be7d84919fc0f6594f4598a4ee7cf8cea8c2081c026aa584caba9cc0351641effa5be6721eee2a541df87857c2ba0c413deefff0f3d5e3abe5d36df580d74dc35002adb2c9bc535d04e76c3e670df7692d0a0c224c394a558b345ad250345c8a0511919e6d6c12ff222b69a8ccc58dead166c8a085c62c458bff131b170ead59c610a2640f104506f87f6dedbe47603432a6ab4a8648b861081e9538ea6d8cfee9e4787a4510609ab7a838811b11197c07264972912f3a7aa9160c997e195180ec8276aa7f1de02f1f15d1f020418d4ea4e82611a809baf8c393aaf214d79cda3d8ba8af0daceba1e3324c410b31f13db2f759fabed4e4202e0d3fe47806986d6dfc15a4231864d32f9adcb2cc02e5e9087cff2ad6ba2c4aa43b1bba94422f692fd4bf14662fab117c36d3dcfc44a8a9133724a62147f815103a0c95bf9abe5d5caf46c96546e538d96c5f039585a70321e381ca5c1ac4719b2ce5692c93a13fe7a20eb00ad0d807c0564590520812e06fdf642c6222a4b432ca04952331c17d9210e6c8d05c403d4bad4edc927d3ab078245275f1c849ed5ce5d8402bc6bc5d0c006518cd4f18ee2046fdc81385539a2b7bf7c1e509fedc25c381f362e431da78bab872606e086d29461cffee1780b4f88b8484f806ed953d2c1d46c90cafb8f94153b5609e1988665dba652dd3be0dc0bf62f371b92d220e384e3c32a2f9516dbaa0b2c6b474f9951e2362c3bf240589c770eb3c97dd37ce0388ed23bb2bde1692546653e5ace03879020f90db633491ea75e47128ba28c623c81c296e914a018c688ba80e66a156d93c7bca84fb80171372c790807c3398f81c02824be898c266077758a7153fb0dae3068f9eb72d6a1737234b228153588797d73d17d315bddaa17ba378ff9b99127db874e156308d5ffc091138d9d6a929ea983e05ff8e95e50f01a0f3291af52abe465a426ec21deacc0217f8a21853fdc9894a5977170f3ad2d024f53975d6cef7ccfc496c238f41b3f6a1dd9029f28802b192715c755172c342037fea4e5088d1ce796210e4184b118ebc3719cbfed500528e6c4c35c973ff7cdd5443654df3be08b9c9cb93104178987307341579b444987d33c2a295dd477c4f8e4659feb4accb016b40c6b4e0b966eb82a9c1b2734aa688d438a23ab331fe775aa80067aaf56d7044af4298d83c8e7f5c8043a390d014eb142c72fc71a790bad660e69322ecd9c5c1c6e3ffd11e3c623e02ae6238288d5d0a01df64a413a00ed2955e3aae8093b46837738755fe8467662402ac3089744c9e61acefcbee8068509b02fd372f0ef9954e09ec3b61a84d1518893244d01e671c57b2a72d3edd802af7f341852fcb381ff5f330406395d2be5152ea077702ca3b1659c5faf62aac5d06a2560bd4ab91d1c2db5ba5578bd55d57dabaca3195ce5efbd101c90ae6a0c82a67a5889b858d5b0ad59293bcb9da37f998e361e0b568c548ee024f3df4855f84aba062bb4de2649be3e1f70f72cb315bcebb6ea98feec223b201ab86419551edbd28dbebbebc51156456d44b564147706297bc7810990e493a20d3ab3b6473e7bc4996f0424f0cad8e4dfad72b3b20202a8aa8b21c8a554aafa83947801ea21971a27af94f397e1cac4379a5fd21789294b3cfee0af0cc8e1557298d01e39294248cfbbb31ffc8f75921d654a9f12536720fb6f7065650584286a23b2d9ba4643909b7e0aed7320d8956f990ae5142e36a8d571ab2a134edeb5edf7d1e338c406a754645d40bcc5e6b4e6b42fe459a84101b85adad5c2a62e5d9799f2e6ae91fbcac73a5abd13c6438b62e657d93a2d9295996888a52b76ade1caee2c7fae234407534040cc1a7f9728e5efed979ee880a091ae14579eb2c12d688212a1004021bb28579e72839b649211f59912756014b7bb8802d63382c078d264f6aa1e4ab73f87c688596925d950ab49e3ba656aadb44ac408182a4748d3eb211ee6d61b48648121b105fc6e5b09916945cadfbcbc38c8651226e43632a3a429980cbf9b37bbf5a71a84109bf572f29e676af31412abdeb58083fb653fbf6c5d409664afd73935c4eafc404a4d87b980257fb5ff6a6125860271e3fc9b52e517d81995e5706272558af54898891bcedf422110bd408af8570f41fd7d91190ddb0ffe07b008553fa70c67e97a24d39b37599b7deae12e84941cff247b4f21ee5f99727de35c26fb8d937a5e7301606d53026c020b834d9c50d04dcdfa3862809ef009e38162a9a1bc1dc8db46e7460a1915698d3a16582104eed98cacde0199b4752c3b476071db1c417516cb2c7197057f33e8ee71ba08ff92c4b187ea4832f9208f30976c9c072441da0a6ba0f4d5d0f194d6886e3be357d53ed96de3382e10dc4ef18983646c03b1f457ea9868c8ca01df314d8e402c31090b3bf79ce7ab2710e931cbef36e0216db5ad3ba06a85310b4c58d96a03719d7aaf13987ac2e49527bde17e452c967146879cecc7a27e5ff3c49920c8af5e4703be9c1a507c6c454af964a8bcb8f3a7c1cf4349a71ca8de3d9ca26cb8f367f3255821c020282f5aa26b9e1d8b9d7fb20f6c49a49452005b6276d65826aee75ddf680f21f7c82763aeca4bc011ff8c0c6d50f9888cefee95b9415bb33f6d037d848b365e0efab724594982a233c2d434adafa1536f327b226635bbb608481658dddecc43044c74b57a094bde268d81a62a466590f30cac3b63d0c5a7295234eb278c079df04bce379d41f635cea671176bc8b7042e7a7a3a136abda65c69208ae27f3570b888b8d11a0825db510f8cf4a40378fad7f2943fb5824b03dd0e50a4d9d1d6dd806f69e5805286db275c1d33d372c18e7b5343aae22092742a26284591bf29d0ac715abfd4f00293a6de0b03e11e40ba7c1a72f7157be807f0e6df6b40b34c017109d82f9ba2b031685636a4a4d0bd88cfeadfbaf84ac278687c85048ea56729ec422d8f5e6f87ab510cee57fde724da8ba46f1cba0c360b74ab1830e5cf6e2101d84ad878aee2e9e01c2249cd2a3c67c1597ab2463dfdbefa8647846ccd916499b3532c874ca90bea57ba04cef248a2724a6be8509d9364568f48b7d093d3c5dd0c88dbb3651b41a30b35627cbc978225469f88028e107ea8d7b030882d5902cbbbce7442a0b6ddba572ad507de07c006323632616c64f28bbd245acdf18066de849ce98e7d819bffaaedcdd0694309414b08723f9cea59dd28c303dea54ee01278c9abc5dab7320617595cc71ac012abd2b16f36a6a2195221ea19c3a90e66f2c177a886d01ebdc29b4931c973c0daa8d6ca4455015544c46c1602bf94f9dbdab3f913130849a0a636e8d9cbcc0f118c00219308585f1788b5e79bac2fec20226a8f24d3f0cbf676bcb1ff1565dc7e08e3e13a618ac3314e4b8fa97c751f489d99f6d4c03ed1449da7cea151d6ea9f09051b123089a57967afdbe80fa35dea120dc2784660223d63b8f3b0a903120ed843aaf47126469518b2f2a9686ec46d4250089db3ba80c562553f93aace5153415164c0844397ad80f2e40fd037d447776811fd7feb8ff56f0e5b662d4ce4efd7c75d0bf58beade3b5000df62b070dfac75f74030000ca89891bf9830b4c7bedf7a268e9b9d711feb2ff186c29d2aa6520f4f716c6b1cd23db285337cf87044194c454f1866278c87fb97127251973a5cf9aa75d31032189512dbb2fccfa2fba5e8805439d71d1bb1663f1910f23db76cfbc1792374d9d0aaefa9c31780b5bd3452bfc87ba21e6b0ebbb865dc4bf98f2cdf8f86cdb04b9253b0b715dfcc988b66a65abc2f01338a711e154ac1a77aa29484f1406c12de8480906062a11e0856114390f2f8411ef8e40c1b6b4f4fef45ad5a69a9451bcc40903f36d35438c7548abf89a0656f6b0a26f25bb6885c4137cb21ed494b2bf97f191199c12ef9df790aafc5538c67db53be0ec4be4991172eb3c294eec119dd7c05931e70e124e003cddc68deab4a594f9776e7bb50cdb84667bf884601fdc9f564ff3b01619b473ab713cd2572645fb5ed69760d41ac0a3ef0a1c134722e5d3aaddc30a608089eaa648bf1ec4df569c7e1421e88d822a6748e8abe512b1e4d8565682d5aca5530ae6ce354c6451e6b6fa169c7ed49e50e31517df10b4d7199b8a4d81294455003fb214a14e30d8981c1054f42eb3545b248357bc7961490e926939af32b694630682a9c3ea6426a666c567b43a68ecc43ffea89ccea9ae33ec6c355d815a465254c1c52da5773cc84d4b3a04f198c0dc1ff68270dff42b3b88b89e503f9ed1cb54378cbca25ede066335fb0410e4eba014ab13dbf202424e5e7a7d982f6827e576be0297d71e281be17fd71445c02ce199978a042fdf2644102f7669230ed09c2a028c25a383c1d41a9c7c8438390c18057b4c6c60e284e856b2c657093d7c4480061b8e4191afacc5c3a9c9c00a22b6b0846e82b6d8ed874cd3b1e58b592c1939c4e1680aaca46606aeffe149968d720a0031cd5998aaf04dd448ac588a4d52a8fc975adf86accb940d944b7a15b09d77c0c0ae39643b01646b4673c2c7eb7a80513f0f2eb089ac73530799ed36af18c655ca1d03dcb7239cd52ace692824a7b1411a20866830d8ac3346b32171d1c3df23a1c54b04ee5c28c28dba469625489ddfefe46e5c03c534342694327118d72e65aee34ba24672dfe282786a4088f37c99c7ab89d447195275417803752f0794d95ed132b84f7ed3a3be7c25a33d508e2d6c638be023316cc2fa71e7a26b742689aab080d131444d70617ce5b74b944421d5d00245dbbf45fa50be9de6100799f40e6d40444254669b389a1aee473787a971cb23a69669fe20e193c30c26736df43160f684fca1e58bc238d806440b08684487d329b90f91cb90c7bb46c8c2d1339d01e4650e3a5822689b0718c608c6c5b62af0759147c93dc5805115e62267d307853b38fae2007bebace241e30768b437906a642ddcdc4d4ba58b031e92763e3e3b7b4498a38d3b12c3720c927f74a1ebb2c0e98c34dc94fd7eb088d1f4dd1a75e71e7e756dd7ccb587db2e50c7aaf74ebbc61e5803bd26ba3f1f39f774907439b5548b21de7913c9e0334a9ea571816c3480920e35acbb7386724bfc67b52d8ce7538fd59590f9fda7fa5b43a4e9e812dcd7b1a63166276459ef2f90175e0fde587e7d5893a3d1eee88024c57e4a905a55eda8a9d8d8525496c703ca11509ed7881aa6a23b2521e8519eca895d9b33124919728378a12be21adfeac26446aa50fe56f4136147a89d49219860e22e49c35e04f331dfd26687c7170091f937f1db00297e0f60058043121d5e2ed1938a63c217d6c629dfb6ce96b88024a5399ea1a09f063d3b3fff81155f5cdd32f482e738d38a64a8e7841b2a731b0726d31834d2137d9eb17f4177ab3c39ac8010db5af96f5e86459ca87eac280e4fa3079677cd0428a68cf17c0904786903e162d5244a2b93cc8a721379610d87d2b48627f1dfbdffbe833049db160936348604752ceca919ce7e3e9ce0706f7b97e800e846cbbc5ed0a69eebb00f3d1aa9924dbc85f397b20c6dc65f47c8492ec90f7cafd8f21a02b37ce25ab502dbeb5c74c80d047a2a64b47eb51db203f685d17a193c90450e0f6929e2220a50b872ef93d2e755a8f1fb91cf6cb017fcad2a02d254e53968714d27ab72a5fa7ddc7a3edc9aaf123910a779ba55a41f61a73968ee33162ea1ed200ccedcd0db56a9f9aacfe1d474cbd472cc1be7a71275699a7b6d46e4788d57f7f028be3c20f52a1ee819adb6edd5d472e13766063a441569a1ae43af69621d7ea0df2d7311f544ff257fbab5fc78857739ff59621deb8262acd67c87ec484fead08a781be753c3c5b6f60241f949acb55c6201b92566c1d362edcaa6e1b524e340251bf069f8e392addc3d0222e3dc7d373181fb59516697dd6920f8b8552506d916613cf112846908efb244fcd03383d79ec57fe549556b0a55c29f6479d924b322c6d8dec71b4afd988160eecff1ad83af3a1de9b0ec75c2f4cd5c3a4116b62e19a58068600a5473178c8db9fa9366fb203c904b70ee49184ed35ce117f9d031a611f17c484386282fd77d28c2f0b48b1ca39fe089f46d8ac48e428485ad1fbf749d23c38a75b0a3cab0e58b5ff9336f7a658bc5d17a03e8dd61b3f5310739ccf7c1624d59f30aebd3d8dae64e78963ba3386b42a873e63734bcaea275339f9fe9c7c4d963bd7edb7dd6b83298af7920c64d68d4dfee094c5b7c5febb1263266dd3c3d5e8fa8cfca55fff1e7c172767d96614e0f3cd7e525843af9bd3158fdc2e6a5d039c22cd79111c49374167ec713061efd6c2eba9cd62ecfdc56e30a6f030b4c6fe6ddc4e14846c533f85408c7243c49682269282e165623d0207142ac00c3a35584c45e9804c2e62a92aae454e634b84e55e3eee8ff96723a3193ff564b359b2364a9eeb81406b59cc467d79f492b56c542616cde0141f0c5dc0679d15feafd174960f0051428411d9920abcacd12215879f73505b85e84e20b2262d587b7830f78864b958226a054260601c61117a9437daf42e94c85ab290f6a0a45925044554d10e7665dc878af547e6863a07a77008852d5b93c38e5ea456f7b8f1a9cb648765582ecc00988da02031d89ff591e0a8167ed09d0396c84fc7271b9343a50012dcc38c61c93b3da50021f6ca358104272d1f4b5bae4ec0e661d465086b17f49b25277fe7920408517730b90f21defe2428afd40deda1025526f49e0fea20274226c1e6515aa5364fbd4a3ec5928fbd1a22487a796ee1ecdf85fb66b18047b0cc8708f0a2e83978fe23d38f2dffd710049a589d82e4292179a99887e867a09eddc3834a920aab6918bb3d9fedb2dedd6611bc06a228558a583143c1cc8e0bef0c42766fc3e365fa5e1f89dbaafa4c7fc0553885d6e0bcee04ef8b888b2fe8bd8223790e79dd6590e0806c0407a1b2edae037bcfeb3b9ec6a026812c0a2c491155e1c769676c8aff0323cfa9fb687eed859e3cbf215224931ae53db0409ac5ce4bc7f15219ebdada51729e6fc48ce8b4a9619a7f22b790beecbfac5d3dcd5135447338918aef8f66d22ca205ad072aaa4428af531f6cb9fc68be4aef95bbb5d53d3492b5011b639cc4ae3b4c6c0575fa94fcfa17be322d20a0e98a72602f1a7ca0e7de98f107548ab5f936ec0d390d413c36d50ef03debacdf0a5de88e0e1c20e08e4230f19c5283f4207579a0f6c64c74769798e97f1a450dee3e685ec972b6bdbd64deaa575016eb294548cfe6476220c63b32c1f5364a5e583c63489e9c9a133cd69e667fe0029dc4f83c03f3fe09a3af0b2170a319dc5d2bd906acbcd243d249268115d8cd90cd1e60498d73674b145c246a421f71fc75efafa7303e1f7114ba2779487a41eebc67d080886f2e9f94531a0104c824ba7cdf68e9b77c34b294325a64c236018c3f86825f05ab354b23ba8ed9cc533563fd03e46d8c68b3226c6abb531fa437a8ed220f8d3cc464d34a894fdcfcb45537dd18531f2e8ccf0f05750c43fb4799b35697049dbe2dc89427fdc481b0c6d570394aa1a0d05cf23a6f3c81b9144d35519ec2951c815079b55a75a98590e1e4844b8a6c165ddd6719019a78917e5bbcf0c3c94691e60161596767c40e1faea3e45f5dc8ff073275c01b70e6676dbcd6bd6a2d03632c0cceec23237ba6eea536fb23dab72db4b11b39bfd42d060f938e0e191678d1d4e3305944c3744eb23675c8590c93f3ce753ed01cb267ec9eaf14bf33105805f99bcb625a5c5bfcf76db700828301cd80c696c75b252891c50981d413e10abd05aef1cf3c20955184c8fc83ac9c9e17ab047f9b9f362a08ca1ba29207a370d19950394da688cd4cf417ee2cef0fc8e1d7006d05aa3af734c75375f5a5747e646d7d4b63a696b39e4f2ca69254d39ab63cef70096bdfcf49c3d10308ba71aca668acbd6910550514e57bdbe7bb2d349dae469f12f62f056b9809109c1399ed097f662400134e7fc6d431dc8c31b7c0acb7112319cce45d843ba6fc8c01303feb9df901d856cda64a7a3c69a0d508096c90a3f4e5d110969e0c1010c2637d4b0e3be1008b7526bfbdfc6d80e0708abd9c81bc0ee1f3543672295e81349c81c141061ee225a83018d8a802f3bd82913933939cdf8da1c948b8a33e51881d12c49c3d044718852f1f8808a2b5bba8351f7a53f41c635bc31f7d3e1b7433a1f65e9e20e89fbcc5cb2538d08069e2d62e8156035c10c02c9b7cba1c12a438726de1151530c592552bcc108616443a0af5d0f1ceca0a0b4f31e94c151b2038c1b010c05f0314b23623ec9536262c3992189ba64be4d4f3fc5d86b182b14311559db0cc9c1b320e63ec6933e8d94e11e82ede6f3edfd80701bfcd7b82ba144b59348d92b86b28abd25899a3317e12a31f048235ef017213542a80b8726987458db021b3dce00fafd0d8aacf6fbb4fe51e8ec7ec0b1f870404fa4456adc44859284a866eda9db73b882aae45095f3b61efc533b31b3895b1b2d1636259bffb96eba66eeb924c1b4e067a80aa70d7ec9a46e5985befb3b22d15235b0afeb3508c1f0e0d2ee8c6c308ee87cc1961b06958694686e75f3f6838308f794c40d0da767e8de0460571e895ef6298239f4d1d62524b499fc3454c0b3ed160ec1a65275978222c9124b5b81c4922ef06aead3283e03842441d854c080e72a40064cf027d930b291ba98a26fe48b3e77a7a267690e1256d8a4c2e2e20b8ac4a9c4867614c993048f908f0b3f12e2c88921cc21905fa981e2487d052c67a11e8e0209b8fd95c40d06d4aa1e25493b8aa36085a7c08c5c551c82b43793a8dd4bffc36579b05068c03d037d001ed8a5243f9f56a5101b1e857f6682066c4e47372a0bb88537a11dd8d2489dfbab2d11fbf0c60dabf3abb785cffad05027cb5b7ab5a76735ab5f7180ed0414cc44025aa07ea0b35d5804c9ab2c58be279a0cca81c2c2d21ac45418fbade0ab97331aaa1d172dac9ae25075142208f466d54267a40707b472e7895a33da69e029e2a9bcf45669f7c8bb597a20d79e4d6c30caaf96dedc2454cb510412e2de98fc7ba584684b34be8dfcb28e6735ac0ed6a37a156b63b6f674e55fbb74bdbd8594582e520b450b742007b4c083105808622eb72e750b1ac9c170045329e28ceb997804ea143520525c3c42204512fe670710c8bd7268348d6ab2d32227024b0dc1da07ddf61e647e6e4e6a299482038e27a9b9e16c7ca073eb8a0a807aece823eac0a6ea2a3acf1ea954b4eeb53fd5d853c98154479f36b6f43e598d9df9bfc924b4bbb9b6a98df0b602c86080e134711328530714199c0e1c47e68d91c2761195272ce889bdd1e1af97644b786ca6256f5250d2fec5ff100ff70f233466a4a1d3b4635eedf1b6638388318c7d9e0b01fea40a1ef89bdd211302e9848c01074340769c3c938dadc4673a8182fb029c9fa67b70bc661839cbcf2b6f218300f25d092a380ed0f99f2fb7c9c4f490fd16f996d2b710115cbe71b5326d58609008f0e7a39a61b7c105a0042586a458427477966466239e6838cb7fdf812225c65287806cd90cd03d6087c7db16f3582275427242435028a33bb24943e03a218f6e63c1647fe5420ffe8902c0c6cb0f9be988c884670a1ff6f7e1329ab970f55da10a555e90852de99838976f81079e9988c5cc811e2bee090e1846892fa04e7da1461b0b1e6bbf03fcd05cff95da2c980f55f43dd6b208fd6b802b78ac3455cb31a46c6e7c4efff4fec32358ac40fe3db3e28b1bb298429e2de55182eae2f0a9c859d9b27b3694d219999fb9cc566386f0db782e798b9ab60916c37f7738c671cbfc58890294c5ae20773a4cfeecb21591181251bc2dfa8d5591d331dc90e3e9d30700a2a04d74051481c3a0315f7cc72ba7a5132e1a5872cbb33e7dc1e71401891ab0378c4ef4de3b322b6dd16fff1998f92b69ecbd3305855a460ed4407cf49647c4206aa926440459838cf6b06e5d32ed23a9171cdca8c7c58550758cf09e62fe281d4cfec78f8662f56084ee5e783ebafef67b0e8c61e967abe6c626be8f0e74ed4de20337a88b95cba6e9675969821d90d5d75bdfc1ccdfcace6c6549c71d9bef94cdc3b3fff18f859bb472649dd498e44946a054f355fe83d0367940204f10f8110415639c7ad967511686b9908d6b50095c113ea4ce60d5ae1a6b8e294badc3813452a940794b28b72855376b84d26d48a12632d4e515ae7e1441375fa6ce8b1afe8bca030b7e604ac74a6a07f079cfdb0c29b0b3f5f504bdc402e452fe63181dc6339066311bc5b80a4062695178e5d8ca4cd8d8ed7a577626e0a1352666635ed29753a7a1681f267144cbe19821ce8ce20d2ebe64c44b409f4f98116e2751e1c6c984e5ac0a66139bc002126d53c181027c9fc4ae0d430c7d0a040748020e0600fa73db12bbf7bd1dc07269e7939f998379e2faf7f96881e9c564e5e79c55a4d8fd532023912c1eadb8c642c8e4540300b0ce9ea211753f29513ec5e7443a62afdd24feac431179f8848ac5a3982dd08126b79c989c54abe1b953695f4e0734aba343ef8fd604e8d04c52270450f2092ee01e1a20654b178101542c7d6d8c3f5a3e3e3ad162d253703141295ce00cff2c91df16a96523b4cd0da6a528e028e3155076db5a8c9d476a4985f05b94264a59b08d14919516fb78be0f523184d1f424d62bd169c3298c0dbb4a01d4eb138984858ed3bf68bce4a9152b53507533003c85792e321a7262184b7266dd4d72e206c492223b484605ac62485cdd4998848e48f6c4afa8360a0eee72286589adb67e2f25290800a4adf779fc0414e70588431c37474176627c0d4814580389881700c3220bf2acf3890308966af1bdbf6bcb8565c31450ba8998476a31b0e1489c9986dce41892d84e1262850f2026139ecbee8834bfcba3a399c85ad5e85175d7837a06c4acc2520f9653e0497ce23fb91b600cb65620682a21b58ea9d37c55ca4059ea0a3f95523df92b8e995bb07aa46d94a52bfb5201ae53421a58b5f051ba8373719fb4990d3effc5bc80772b131e1c8d0b99ce35775100b07b63cc148c72bdfc55e858307edb9b09a0622a9c29ee503402a0223e898f7f6a64d90a41e43a118cac298060678d94eb500e86c6a834df03e3238012e9e85ef5a12f08e4d506045c9513429906b986f78bf4e9584053d83b00439d56dd8ee4383c16c870c983c2ea4734fa593c6de5dea87d80d6af221dac346d2a9e2e0a44da6c996e3841d6e3f5e1aa5eb89e9abe563f4f80b0a61e80ddcaae1b67839fc6f2cf87d2ca864756e9f7d63f66d43961ff44090069022cf92ce2ded3ad30a7ec082a633a225c206f96cb3ccf0542e2a3d9474c20f24a230da7d330da09e3a233816d2c8b30a9f053ec5f45acd57496a634ab94ba805d3c94ac8443024938cdf73c18a5d04c900350efa05718608edd88486f90331d414c8d1bf02e771708841557299f14a04a4c67bbf095767ca323f92614989ea0fa7591a580a93dbdf8dbd79064f9a38605958d69faf03c7f9d0ef46aff6f499a9d8734e15ace75119defc988154cf178af4f486787ad0817ca5e83c52026633b8fa38ae1f2ce8690932ba3e21e2b49e0a245c88151e35fe5ab1a6f3b72cb923da546bf34c0b6b9c97646454e2014c881385184849dc040e2c4594cdc3336fa42b928e7723b7b074a9ac1a5438fdb71ad719066aefc1dbb075e86ccf1422d009754d85be2bdca4d9ab9f98d936113bf226cd95e998adc376f7caf934c934bd70fa5a639b35fd32cbb7eb539e6eed86d4121d543b34408ccd9440ee83fef7c16c6846408b0050bc62fa7c6ccb4fbef9fe28990ed091b605269f2388fe89c1471072dff3096baffe78c2c22aaa5864123cb56eded8b0b27df8f9053666e6ae829930e0368098acab324b400fc450e32613c20dfe14330292315159bf31e62bf13594d3778240627189584c4ce2080e27b22bfa35ca6c08f1af7ed433b7e4cc13d4c489a772ebf44e06d4b69d210bf73a97befbe9fccf99fdccfd51fdef2b9d4576be661406c6250a5bea23ee98bd519f862d8921c7712401d6179208248277897de1af001ded857f66763215fa0799a20d2f7e3d9c5dac1beab4531b76f700b298510eb6790922760a17d14e32371ea7c3c29170a5f459143aef8782901871298a3e55424550ec9d1e4c3a6333f255090f4c1487dcb1ca1088f67b02979b276ca6f717d649ccd66baa08e86d89870c772eae401d950fdf4c853c8d31da9fbffd57537e2593ec2c56805c78794246a5ec0af8105491ff0bc146638003a55a229ea0219d1e38021729d6fcd7b92cd38c99116225960ba6ed06dd8bbb3e9be7a2d62db4d6aa2dda623cf800fb70d3a5362769e50c1bee0786249f32bc01277accb0c27f34c4cb05820841995d7887aebc7035416701fbf78350c4098ce4bf3e04bd372141d8509ad237bf97f04824e3b08e2f4877ca002722c90ecd051081befe7381018b289402a22e87eac9e3a341e44c2f031dda23e89457c5ab7d2a63e797d34f21200b1fcab654e1ad74926b8a6afc884be439922ff88cc0721a29819b0a91fce5cc2a75d036596facdf63e60d6faabf42beb9c9910ce8cf372d00ba7954d4f483b7b423fdca1c527da547f2f245a2ac208f34a631634d4754d5aa9170b5948f721448929a4f7fd1b46bc597eea8fb8386764203ee148690c7a9a4135cc8420aa8db957923a6f116d62320c23c3b443f3004055ea1450267dc5fb2b06237cac2168a7784f5c20832f327f007725bef6041a3cb5e327f20fbe92297a9900b0a8f69be1f393768a6d28f2807fa2e50123f3cc320f963d66d16de0fd61a61743541800462029175551ca37c5ca07ca6c0c9c54ccb783da221f0dc9b3bc9cbb704c0f28a258165be898d4124b0f2d6328290a1ebf14d7150139df213e078f8883628c25435076733bb5ccdf2b96109a7f9f0fc06c99d46b9f5f3fe7dd51b7dcbe6ec04a4724760350699e62c09d0e9036ad6f1d1b8815278a552ded18f4b4015f092a3b43747c96ac373184784893f1be0d5c038053582130aa3b80f121833f120ee68ac3768ecd6c3405f31034426f94063bb5ff9b473dd6332544bc53ce4525f3e1e36eb85924f1261534fbd3b40fd4ef0df0b308b55997f7196ce2a581370534c3ba43b5bc7e17b752f0dd0d360e79fb8ce297c3c076f242a28322dd679c483a3a4f28e2d80d4a348235e25722166769a55e78619c67bed07233fe1b6daa3141c59d6d413accb5d1c7dc716deb455df275440507735b70e1f0e2844f4cf46a5dc7a574bf6b5ac6ef35763ef566dc051884126cf8739345653509e5ba5c5e2ec1b2ec2e9771189b7a44b31aaae807d73bc4d79db144fa91801f6b387631231acb57f81e00cd816443a50dcef30a9feeaf8bf13160e043c5be0ed87725feef83bc88fd63ac9a822e01dbf03827e3e15e0ae0ac0aaa7c24d0e6177ed931aefa2933e1a65bcf838c7a0698a7dc22f5c65796ab873a7bc38d523102839ba3540549f46a0230c16457502f01db922dd380120d4b104d49f5602609eba16fbff60ab893b6d0ce9ba5646219796ebd01b3d02c10c196874064a050e477b0948492f8ef63000c4b69790d12f4f7f61c7e9ebe445181f3f6f3ab6aaf7718c9725d956b067f94cfb4b5a82a9cbbbd27d2f410ab9b4f9199b015e16685230d683bd6b2c2c6da7d5693ac145cdc3dad356ada4c7a54a8f92d20e6aa8160256a246a54657a582ad574be2d4dfc5c4692696df514c18dcc87946f9ec8e8f4bce932f0125445f4b1a65d5307b59acdcddf1eef355eb028f0aa08aa498ec0f5c0fdf4cb51e5fa5517492768f95e94b40f15521ed636bd1b5b23933e661568d5a3ee9723dec615a0c76dd7a170d34163c1b01df3968d81b0b401e0ac9707edbbc2d6b443632c63bc49e99c410472e69684baba99a0117243a8150a4a14ba134ec657ff3612f1a9274e3e25ee5dd0f7b6370a26befaf27a5941b6dd6eaa4d4427b3c3e08f145d7eff09ba6f950676255f57f29ec39cd389b3015ab5e21b7df27e12167baecb264477e1587b1867a66c341c76597757737710a85d10c2d52f427c3c596fc85c3d3f9a3480763ad68c9e2f40910788f586da3912e36b99509c4062df0c0eeb4b239f768821291e4447bf6b15d039f939b65f54229fc6da0c99e00f4616f828a01eec09880de70b58b9f71eeaf049abe7e29d059545b12b8ff6573b7f6501fe9a51b8922ffe942e5a6f4c120b03849a9a8635d2714119c9a45eedd78405145bc021e8a0ece09a2a246e8d85044706a5eb96ffa2310f89d2c4514ddd74ccca4f0cd1ae2835ffa2310f89d2c54d4b40e1c8a144e53911b2b9f84d420defe86a2837382a8a8113a3614119c9a47ee5d1d40bca25e58d53e07a2c71605e2899988ba3d0804a0d2cb4f0d3aca93b4881a837189af99ad09e3c2594aea4a02ed463b0f039a8ec91eb92cfdfe6dc8cde331df7dfcfb054221713ba0d3a3fc22c521b1aed81d36f35c5464a3a0862c1b8313b7fd1412b64b33b13df753beb13f8e0edb7fa41090030ce8a3c129b7c8328e23261603bd80ea3bc20d9927402c5853e1078125055388583308e532755359987e222f073aaeb617a30fd9cfab25f23fd85bfc033fc66f5324592709508779dfca931c7e6b47d56079a250aa0e57f5fd4484647bb218ede3d10ab524668687f4b7ae01e1ce19b64ba831b575568ead23d3685ef0388b023b81743f29bd655045c2d4269d6d9ad76ca0b3996f0175b76c64ab5a1b5307819fb33d42dcb32a000ba65c93334cec368f92d97afa77035f3dd25857901294517c109ebb305506d878a0f0dfbc578d26808c03af347cd89b53c46f4830da66497b224a9440643699163b6149a4a00f2e1f8cd0ebaff801c5027bc4eac7e0431def6e1a264b52bfd50728613890d9573a36644db34d70e72101a3baaf0e473e6ed740bd5a6774e090a98e7bf4e282c4937461dc1c3c7dcc2b54cd75bbe9728f438e7173eed50a69deab21bb7498f01f1629fad01db383ece88d141860872165205d6f62433187cf0864132cce01a83c3ec6c2b2e0ab5747b48a1cc327cded9dc928a5cb500af0a0b3f60fd1785c3876a4a0d8e227a7959203c635baf04a00ae93de3526b2be9d9137d6fc933a2ddb259017a7ffe1a1e66f74003051abd5045b9cab528726aa863a70e0f809f7a40b4bda7af5e3acde8dd48cc7a670bbe2710caeb5f5a26c4231b84a4ded6109928791f56d128048305c63d65283e418900f4b8947e558b7667b34df0fa71c13a3e2a0e71418414a381b96f7efc6e0d029c5fabb10a02978f848f60779823ffc62ffce765a07f21e831e9113b905bc3086933fa34c761ecc626c379f076a293806655799289f0b2d950ee736b7b8e23f74caffb44635a9e0185c9fac9422beeb74916232e1ea9f9a7721b13032609dcce3d01b7463704d25ef6b1eb1b7e6dfedd7416201ece9fafd0f3f294afd3ad9aa9ac72ca43906d4702e844917dcdee36b054b4a6270e8e246f40f03ea5896795a309a516d0e019b507ca2d8838c3bc0a205906bb676da8f18f9ae64639c0acfad195a1b12be5d2cf782c63ff137faaf064b33b88c5a728005dd23fd4726a775688febf3fb2ed7ff52a96d646d64bdfe36b25edab6b2b794524a19c50785070707dc97749817182d726b27e478ab666e033ccc2ec0c73601fe65df78187b003fdb0778d9cee165368e165b009fb7d38be4c83f91bcba29e5ca2a32dfcdea262f192666aeb24da57e66c66431fd53dd247346f489d84d326744b7d8aed9be8166dbf89a3de35dec1aff62e3bcecfeb19b3749ba49d62e1bce0c1933ffda33fcb6c93b006f0119bada985103e7864b8b51c3cdd673584534ee671ba766068c7d13db1bf9779fba49d62ea42b27eb9b33c385238396f52563d470d34bccfe7f62ba17e53bd938dc50e367db8649ee33706464223370646492ebef959fc9ee6f6eee6136f9b26b78318366dfd062bffe64ebebcab9ff7cf3be5947584539335c383268314a2e59c38d898989ca77b26d7c8b7df3317bc60d3f73d9dbd370ff62bb60c4f8d8fe7e37a99be48e23235f22337064e45bf43739d9953509fb5e6cae666f4fb35d31bbdf0d76139d5dcc984c2666c2bcc068d15f39afac4917ab48f675131734339d5d5ed4c8ec121f20589888fe27c693c9643316335f606c4e86ae67ce591313aee7ad038e13eec4c686adc736ed2619c624371490e67a8f85c5ec9e4b8bdd3f66c790f12efbf5347b06cecd9b3be74df6f6372746ba6ab831981c22335c38a40c5a8c1a2eef9b75e4c56d267bfbdf36ff820699ad1ff7991993c5c4768b55d4da69b15b42d06fd536183b8566affc6bcff07acffc6cc35eb6b5cab7d8282619e6c58cb5c8e0b2b76f6191610556aa24e143c55011ca661d29352f01524bd8a63995e7f4c9e6de24739c55143bd99c49e6acb859d74bea7bf5123f430431b9c0055398220c61000318b0c0c2b4052d7ca1c80ba72e84d5f5c4c61521df6d43dd7b31c618638c6d67678861e31098e938e3199ecf661778356c77c2536b72b32108f113dd7ee66f655bf6e9f925907d3a0d54bf5e8d88cdb437c997ecd3ff3579924a8a0c2ca552e9b1e9492a27cfd26e9009e5310c05a5a2e0bcb95c25205c16a461f0a37ddbff26a552a9542a95de844ba5d257d257d27b248c31a74d2b28e0e1d1dd0926c4ce4e3722294762f0509f69f3cf5be5072848080a5b0ac13e45451bde8ab45cac71a5b292521e11a65cacd54a4a49b664603161d4b8e120645927825441dcfc8251285835086b22558aacaed085e24671894e29a8913ba27272a95c215d635d2128eed02d328696c72defb5a8dc92cab6f4a5f42811973009480b53264cb2f7b3562a30949d1e1f2aa84d572a2af865c22913169f70a178c2898bb55a49297f2ecc062c32909c18c03265659572b150a3098b5c16dfeba562720208c82b2929c3257e7e4654c418882de9ab944b292c7257742b78c8e2202c131eb19027948494f4fed32ef96d3f06826de012624beca3e2b248b958ab1513468ddc11d3a61d66c297eb3b7c38ed921fb04fed1f2a2a126cf260a5bcc140da1833a2a8bc4aa4af5f7a95b21431cb841f35ba9e9057b984318e99f078a1805d945fd91808f6c142f00f5e02af4e292ae566442d7169db547698b22981b292326191bbe2642a91f04fbfff79231cc4ed0d42709c5dc2f7c9d4cc5033830cb7cdcf1492b89824281790464282ba302713898b4972baf7de7befbda8ed3d9294e552a81512924f845d140a4c5d5124a93e97bdbdb965ee4d6d323a754b234ba693411141b1361d108002657847842c6e9bb8fef5f26a498b1c5cdb56d0fec8e16b105e0e1b5f7915485b41c961d39b956b517041cbf303015f830811700283a12060d31b18b743f8b03d2626fc00083800027e1ce000282990f64a39c0a6372f1330e7f27ac484dfae6ba149890c183786f044e56e00675bda725fa5d457a7b8545ee509ac0ed9b25c91418617672162d24264e6cd0d838687d92fbec5de5876cdafec195e86dd6d2f58b61c8415882d5b6868aa10b6dc5911e2753533c8701e0859643a164ba69461752510074a988b0c11eeae7c3090b6129321e2ba2b3030303037df8c370e06c602be6c57a69321d2a1e0b2c4c4c4b4d89e73c966deb8980e849f8ce6408c2773799995cc6660e5e1332d76e86106d0079995fd43871c3ec6d3416f2e2868e3fec6595e0690c6f2e2be573f1d36bd61b93460cee52e687ed85c180eb6a40169dceea2ce66337caf7d3796ccc7ec4e86482743b78dcbe1ba70416330352c37a8f5374bcba66fe5389661b4e58bede70558961a86a661c6d980b49715617769a181658506131a5429910614090d3470b7d2f05b7bb904463f1d3be1e3071b7783bc9b0a6a5beaecd34fae7683baa20f841688ecf44f9d7bfa3e2590507353e4b33ccb9f32c8763c17a7c0b46d36773e31f082ac6ca7d65a6badf8de3a04824b71aae7f7b26af321c5566d9e41ce1973dcdd5053489173c65b11768a5cf10cba4e48d7cab1145578f464bb9f0d223cc75969ef0569a52dedbdf76edbddee761fe3cc71ddc8fb4092e638eecf93f216b9456e915be434b10fcd2f900f84b46f31f0684a98b9cf82dc7b9cd6a4cfa3cf1c77c10fe474bcf7a2bccfeb46a44d6f3a4cbb5177f39637fdf7b5ceb97e1e0263ad4d2b3bf9907e9947dca643bf4f29ee1b8f1fa3f746bfd5add29b1c5e13d0e73ae595b6607a31ae13c8b4bc5889f0d3da66cb81adb6d6786f1f6babdf5afb263a0bbd91a565a6f41b0171eba76bcfa08c6e3322a49962bc591acb8fb7fe72ce66af946e1ca798f293afe62b6aedade598602b0534d67adbb8cc042edc70ce5bbe1cd8ea56b9b0d5ad1aa9158b5cb1bd41d8a727e75bfad652ee0aca5941a5a061b54c70444f545105c6b82e210c3fdd49016ecb5f29c4f432a19a281765fc11e3911cfbdda1db1f6f4a1def3fb5e50d83109e25691fffbd96a3340d42fbf57f88d00114c9c9149648e0e78d3acd6df9e7a4725ef0accd0f381787771ff51b4d73c68c993167cc991933c68c316732366748ae6b88af79729a258b79671a5b6bab797ebf2ef05f7ec31e186b3d8edf2b0f516d081f40c2e8c7b31755abdd980861d501755137ca6ffd8e87e377fa67d82f7d942daf0e475bdeaf4b8464c7335fffef4867a3a614003a9df256ce0fb8f2d345cf7c47eed812659dede3cfd97ede45d0ddb8b2b55ee1691658597efc769ff55ade9a41fbf638b46ff7cf1db95b7ee6b740edd6beadbd05664fa7a00db0fad47a056d943ae5a36e6574fd967072b79ece1a63dce17b2fe9acc01d598f74f2e87664bb4abd8d44bfd6fe81b4de52b5204dc706faa9d3290665541eb45b50067dcc4fbae598b6d0bf1bd396fa5e89768a41e0d1c7b5e25a4f70316d498167756c6d00118ffead6116f60aef0a94d62a857ee24e9df04413492c01048d04a5b4d6246cd07908691792e8e9ba4ba205f78eee8f46204ed5e0bd5a48a20423ef08af565a4f4c545bad2988bdf61ad17908a914fdb4c1d532d0175f0c7e54bca09ffae9113e3aca96f88813702ef0eebd470471495960ae0b596f61f3aac03da17b82e3b84b457602775da775d431dcca85204cdcbb95e8289abd507b50a2f667043ee8b586bfd6fa89dfd6f6a9d3a99d511b3beb66a7dfda9eeee81bfddd737b47df704ff70944a7b51bfddd06c1cc0d6701dcf3b7726a4fcf5c87133a10ad8de3c03ded37c21bbd7d2b67d437aea3d433ffa19f3aa19bfdd4a16f7371add55adf0f08ab8ed711f6bbb3c535c045f0eed3933304e2d496bae4e5225bacd5a84a89289293292c91c0cf1b759adb32beb687d0ebe7f71807c18113bb41a1d26ac4064180d821bcfad512c1083f1d654b4a2f3652a202679cb1b842e721a457f433ecb48b02124ce8286ee370a7439078a2f310522bfab9e910249a18753a0409252ac698d344df11dbb66dbaf37ed46ed48daae8f6af0c3e1f236fe46da1dbcf9d0e41e2049d074dea7408121f98e9b4feec91fe884089ea7d1d6db13c84540bddbeed744890233a0f21cdc29023c4d0511aea753ae4082c3a8a3eed470444e8285beac09da42df43d90a6a38ea18320ced61ef8d58d43bfed809052d1ed9f20367db6ec3a1d72c4147d149ac0a327e7c598cb16dfd4e5a90207b1156d44db18b82b852239e79c37fc6d44396f5ed01d47c2bc668c374735089618c37cb1cfc5788970a3e1461f1662ed9c2fe4c2ec038d9a107267a3a00b1b156982ca465510c281341c7a7c3f7afb7d3f0abab3d1d085d9515115a86c14065a8e82ba0d01ad2418ba33f35a59add9320c54563d404bfbd6fc768faa826ebff25819fbe69d792bd8e96a1d09bab72fe836779d57d33bb996b3aee5ac6b395712d0d917828fcb5dd6f5f3469c9977d0edce7ef55aabb55acb251c985ecd967cbc1a0e6bda764cf8f44c7331c518dfcdda9c6ddfbcbbeb0808ce36b682bda7a47741ba47c8d94a374cbabcd2968c6bad1cc7475bff1ce9a0d7b167b4c2888dcbf8725bc6bc2b72ad908b6dbef4e6efbdd7075b0e3c12ddf18dc230e9877ebff24c5bf0dfe84d6f2a95c1b89616762dc63ad966234ea0305b8de0aa14ba7d7cad056a8f95d9af3f468e57da52f3765dc488314d2c85a7f57641de8b39bc4f2ec7ffbd8eb93deaa3eda2bb33312e74c63777748376e6f5f2ce3c1e7363ae88d93a9b9118b91856ff85991736230600b2c5d696a0e4f45f0a79c9935e2e139448ae4ec616ab542a9552a74739519184bce449dbf34cab4dbb884712d529e582724191292429a2469f0b2592ab3145a22a7d26d76905053c3cba238109b1b3d38d50e5edc199362757638b754af588282ca258ac16b9528d4418686cb14e29129548aec653ca844954e46a4c892929e35832c248d245a25022b91ab1e99422511d81a19e04a4a15ea8713ca54c5888e43828167b2f0643c150a209bba4b8a4c0603094882a59912ad184515c104d18c5058eb56917c9d5784a0dd1dab5b7b0b45ae02892ab53ca078a63a0cf0920206f899f9fd13f2577f6614b579765b0526520b60c1252d224fbb7fd28915ce59e1aa4faf8a4c48d816c19349e52242a93885a115128161145b24b5eb5693f892436ad5e2f99970acce52a419a88c2ab538a4465c2e41372ee1971108a632094883257a44ac422e91364359e52fc470943c150a58a68c2a82b48d927ffdcc004c7551966dffefe0ffbe4756c98f761bffc04368c97c06ef111d8310f812df339b6eccf3dfb076c17dfc3a631c9dac58cbda8b91f809d6df63f0dbbe467d8af9fd9dacbf75e732fe061f60e1fdb0af8979d8087f162ffcb36035e66f3f0319bfc165b8777b16937c934bac6e5cef666494beabbff7ecddf6c6fef62390bd25c2c27302f30b239d29224b96d830c3ddf7b57be4f97601d04bbd04467978d33633219126914b3fbcf768e4a8c28032f305a644dd31cdfcdc59127bbc6b7d8357cccc699f1b3ed61d03eb6fbdd29dd446717eea6677d8908c1f9afe47b7df9d3dffd523bb418a51c1747de8d02f302a3453663ac22d1e42373c6cf6473fd4bffdf362df24dad932ecb71bbbba09969971735664c26131333615e60b4d01c08f3679307b45e522be7f213c714427a436fba3fe9cf8c3b337dd7fd0d2bfbbe7b1c9e6965b5771f233443696aef66280ded5df7de7bdc37dab76322c21d288ded9dfdeeeb8e95ddefbefbca6365f5bbcf3e280d1542ef7e01dd6b2c5841bf00e2e03e7c0f0051bb29fda800fa4db80ae108c7081620bcb0ed4f37c027e13c4c237e83f427cea3c47b943e7c52f8a62fedb0e7c6e94ddd9f42cea3871c8591f727598edc653e63cbee636cd999b6ecdec354a04278d222ddef6065a3efbe01761683dbd8b27b3c85cebcb3130bebbefb73a677a5bfb312dfa1bcb31e2eacfbee77b0650745d7bd4d0c2bcbdf3d6983bb86a3a75dd7617ad2f11c992809ef56a2f007dced87f46dadf5398f4a44a1e83ad8d2e2dc4e39bdb3cc7158987dadc35048c8b35d072a8483b6d87e52a02abb1f3f35bdbbdf2c7ac6ffbea48da03874a0fc86d6417886dee87de0ab6421c8cf1a8236bcfe95401cd677bf5a913ccf23c7711cc99dc3455b24f97a706cf11ce4bb5afffdf8e0d9e2a7edae980e9e2feee23035063ed972bdeac51bbe9cef2955515a5f64ed1288333efdc611acfcaca307d254a48b1cffdb67d87578007181fe816f82a7f8e3ce013e109deef3f6ef319873fb6a1cfffbc457bd596bbe57cd88e30a04ff7bd58be37b7fbabeebf819d3c527577c87ed39e8833ffee9e23b6cffc0a7671df749f2153f71174917c8bf376b4cfcdfaa6fedf06d2e6bb3606a0dfdc027c9af05beea5f7cd6c77ad787dbf51ac4f93e078b93cf8136befea95ef51b4853711ac68c2088810e536bc4f1c9a77fc3f8e4383e25bf769a33f96d175fbd6a771c654b51a5d3c9f72c75a954ab2737ca8a4fc11c6ea8a7f8a87d42da6bc79fce417886fd8628d7f3185baec6d1c3fdb4015363f4e3668dd187a931ca77f08b03a6b6e0c147d55340a77f1ff894becdfd74dc9eea5f0ef25d1f0ec2d3ec374695496968bfe43e6b275ff55de77a71f7d43e6f77bdf6096b8efd2c8e2fbe6a9f3a5da5aa1de42d1af5c1c7a90fbe4ea71b24753add3b6c27394c8d89e2db5cd57671d46a35c3c2ee87fd9e2e8c084f0a347a1cacacfbfb313d8aee79957eef591edce67a3a2a90ebb85df5a2596bc4a71f09536b44f03f10dc147c33869e3a303746b559df0ec537c38789b132f1c3b7348a1edaf0ba4af57d2aca616aec9b6165e2df078095b1fe7efa06e10e5606f253a7072b1bf91973a30156f6bdecfbcb616a8c7e9bf594c6f24619ab277fdcdefd52e48f20ce8afcd4ae7ddcaea79fdab593d4f5a93d927bf5748f9fbae2a7b6ede3f69e253e4cada15d7cd73e77581ac6741bab8b086954da35ee3c350cf5a3502fbefeebdef5ffa92f7956eb37f8df83e2d33d7edfb774b87fe33e8e5b64fbbe07b7eac57df2e8e27bdc07d2185be47ffc6cd9583df8b4f3b345f29cd5f7b4f3e8f4c573f526ba47f2e9cac6f7a00dd58b8f5b2b9ea37af1555ce4e3db5c1b0b9eabf752af4afdb74ff0456ef211823f7e4925825bf5bd8a531ba917798ed4ab788ed67fbfc3f6efe93e41bec3f614a7b6fc1f5beffdde274843fff373c7fdf859c2a92d598f777c056fa0dcd5bdcb451f7c0fdcae6fbbc60745d77ff4c7073bd787aeffe88f223f4397fe9e7e2f177f7df8fa6fbfc4a7fcdc71fb47bf0f9f3ec947bfff8a085b34ea833cf515fc511773888fa2a8171ff5a24a07fc11547dea2d48d361078042bd88a3fad6837bdce705faf8d4cac877f11377f0574f6e6acb153f77d87e52e0aabe7b163896636adca66f6d1d1694517bc7da3976d8de710bd44e3f45433fea51fc149ffe56d9a05cf5e05efdb84fdcc75fd9dcf14faaa7a90739b6652a477cfde70edb458e7a8ff6b09fb6699f3cbaf72b9016968ef41db56bfddebeb1718ce8e3febd0e15fcf37bef3d6fdfd03608e99f7409386c794110043fbd29c863d892e23ecab137acccfbfb383c5ad2b7e136278f19316ced6870435d732de3784c0c2bdbf80ffef7b5ce0d3a308418ec0cd1c2097e7073bfeedc190c1eec9c80094f04610556dcdcf7e1fe057c78222cb12d6ee0d19490e2ca5dfcd9ed7ed6d6eddeb7b29b7fa33d635c668cbbb6a5eddb3eb1657d5bd6bff9922d1ab545a3e64e69d746b0582585e2a739e53e8b2d717e953ff397b6c42508ebdbb7b1a695655ceab9a46752cfaf1374fde9eaf9f527d9b3d773abe751cfac9ebbbeff5cf59c3ab99ef99f2a12933f533de73fc59ef39f28f1cf8bf22749cf6fff34f5fc94d2849486f5999fe5e7f7ca6ddad2e6b7d69a56462d7f942db1cafec6f364e6f27bd2f1e3c7a5959d332c5666f9497fcc99d196f8514e4cf8fe92978b6cb156a32a95a91041af617e11457232e50f4bf94960cfefed9e7f945f73f9b7fcd3e9c0a327f91b95db0c0bc3317ec25babf5cb710d223c5d74ec62939d10e8dc37eac2ef5eae8347e77e781bc68f714f789f06dd1e1eee3ed21d4b5b53987e6d65a0ee3a2ed075c7ef81dbf6d1e37d6a2067f082badbb67f9b444f099c7af5ba8e83b4a5fe0fdd7e0128272a9b56e4e234a21fa225fcdcd90be8ce5c41417c7c626a29fbf526dbf57c3fcaee8162e244901238a115f0f410a14d423080f04de3026de105fa620595a9edf0a0701a91cf0b275ebc78e144bfff02c60ae8ccac0206cf9d9943307aaceca507061154f642847e21f442e88510e62f845e08c100623601944dce338d369a9f173f3e3e3f4177460add59ebe7478f462392cc11648264942073041921d90a643cb21e191132203241324a901192ad40c623eb9111212324232423242324232423240382427484e8ce5c45aa5789f7795e29f5f8b3d8b5ed81cf62efec21fb67076d25a03a9dc72d44776d7b60670fd93f3b682b01b577babda3f74ede3be3ded94222aad399c3628808888f9e1d234377e6221a2aa594f62ea2f478ff804d3f12519dce9c473474a4c808d190690516fdbee8d383ea745622348d4a4442444359b0b35714fd3e4b8855c4caf27b9e6a4b61bc9554aafd832a3fc74d442b88432215a21544a2941129202921a91e882856ea47e80279096261f7c5a709e1962a5af1b314353f47161789523fb11f3b4d028580709b66058d19a115d18eec581942d892c7c785f5a8388da8648768c7470f8f8f9d2ff52048533d08e2e00eba76cc223586cda1971f2f3d35806a34d1e9cc6df6c5a7d3f989edc5e704abb1d47c6400e9b9301f28e03195684768453423b6bc6f16a935342b688c8686052f42f4127267ae9f1f9f7e1fd603037267ad1d1e1f4bd4007ae97921827bf18185005633874c2a3cd368b3218a2cd400e2805e7c602130a9f05e7c4c2f3ea3179fedc5c7bef8e0171ff024240add1e5dff0ff8fe49c8ca4cdfb681e4da810f0d6020833e9484290011f9e92982cf7511a59cb80d3d3d44417aeeec05e4ce5c3eb05ade4c52b849144354a0a08344242348404842483de834e79946d2cfde2c42ec10ed1019298aa2d6804586accc2c42059599554045417467e6901174f6f203c89dbdf408b1b21a403da0b21a4da0888888884c442327a952246011b30a669122fd34f4a307355484212586868668600e7d313eb4e5cf179f4eb404a212acb604213b7bbd8fc97be2c7f776013501ab5531d443846914962cfe21da72bf461359e83580accc062cf89c60b53bb3010714560505620edd990d30a0b017228678e9b1321b5840cb5ba4df37f13346a45f582d84d54e58cdc26ab05abf21cb0e8d885674613d3e443e269b668408c80502398132c9400640ececc54d38cdc889c8870f70083b7bfd7d2fb5f77fcab8fa3c96c97e3ddf258f6b35961d268870f0401d038de8ce5c7f9fa5e8ce640c5d5a113d29132db57e8f74fd2765e248bfffffed574f41d9346fd34eb68c9a8c9db1c8872888cf123e20f155912991449196b4b5d394db46d7bfabe4f572912d2404813aa35d800a74f630c6d8c3ef91b2eebefb9ef33c4e6d494d0ee4b8ee3feebfd08be91d09632ff43aeeed8f3acdf193c3946ae6020e82acc55db639e76eeb9ef6cd765dd755b3eb9e3eedbaaed3bceb36ce77d83ed21beadb92e0e8d75093beeffb3069e700a2fb3e1269e6db62baf65ee70cbb0e8f8df4e6b76ddb56dabef4916ca498fef11db6776ffa909f9844b2e10da6c66adff8d971981ad31ca6c650b6acfc0beb4604fc5f7e59fec9ff49899282624b147e7eaf276168df7e66f8e5d78b0c19e251c29c4207451a3fee5a731cc7f5ca6dbb7ede668de10da4558c31de3195db3eef5a33e65ad0468495859ff4fa5a0721fdf3a4d70feb8ff5697d6dd6203c7a327aaa3b8c44fd662c58b9fe92d0370873749ffbf9bde33cf0bf53877b0ad6a7817bc761467434a23823413bce3035968f08b7af5ddfc0fb4623981afbb867638bf041f94504e9f74f5828e8717344471ba6d69c99c3d4187e0ae874dbc9d53cbd7345365436b315e1fd0d07fb386c66588b4fdbb9cfdc66460cfa9383e333788c9396b3edc6fedd42db5bf96b2bdb747f5227b2cddc73fcb3a59de996c7b0a5fd317afb3677568e343fe1a42d8384f44f92d61a5b1bb710a2ba1dff2104be7ef9a8851e784f77fd1ad2af94e60cd2ead3185bd28deea7dbacb1faf8734c0ca55bc53fc098d2edeb3e431d1ef5a9596fdfb6a7bd6e0c521db76f957631b40da46d4f414ab7d79ec7f536f908377e8ef8897b7ebdf11c97777c87edf7357efb30b586e3f92b4c8d65cccffa97c3781503e1136f278f8ebf6ebb764a411b1ce7b1c35ea09ff477d8da84adf8cffa54636bb7fc77c4dc73dce3f7b8ad69ce6f63b9d096faa3ad9c13637e8e3addde2b9cd474db82c22c00681495d634a0c6ec3bd1805ad3d101d0d98cc2ec973c2a45b741696976eb9d25fd81b4a6f6a831fb57e77bf567dda3d600a0066db120e8f6b75a8b286d0171505dd316fc3d721582d2504a533f638edb388ee338cd711dc78d38cee3b88fe3b60e2aa3b40708f84069f05b8e9fd4c83d45165b8aae99931da2688ba5f907a1b602dfcfcaaacc7eceb5e76a7bfddc6bafd75e547d0d83307441e88377edbd381e3db11f26690df40e7b42fbbac710826add0e6008413cdd2b79618efc958734eadbb7fcebf46b78f17d4c23033de74ecbece58d659c3447ad6fb9ced5cec01b7d4769fdd377375de9b4abbd296d10fc4d11df7bdf9db5467f7a9d9b0d3fc9ebdc6cb8d2e4ef5a05286d80f4259e3b6b15e0f4e1e9e94df7d5c7103cd43a45bda282a177afefecc45b37c03ffd89f3383df83a375beb068fd2935ee766fbd32eedd13e2951ef2e7061ddd7da0d9df4a8546cda887ad429221900000002e3160000180c08060302b124c9915815dd031400146c866a564c1889844910c5280a8330c818820c218410600c21644846e80a939c0af29c5f2725b2fab26dd2b96744762875aaffa2a369a49860a2a36aff4d2b2498aa2c5c24d31c7a141bf818ffe04cd7a0cb26466c66e496f18571c71ee513e302041a964473ffb3500092eb6e6c19afafe8a4aaa9c699413979007adfb9ef0ebf4ece24a930f3c8462a31014523cc7bc9788b8bf25ea875e7bf5037f45af0d8921d95af008d30c00684f31451c0b57c27f5d57ed7ca3b5231b7d7293b19bf01a5879515a5ccb87964586712c06f7c36384a805e26197e820f793cabef95292f485e8dafd397c25da945c3d0bcf221a2821259ac2356af74c61fec5a23ef108917127135f855de282a626b2b3f14acae375a3e6668b8c1fcf6a0cee54a408e073294832b3a6b521a1eb4c3371061c7edbd3e2d7828f2ad31812a675255ac78abb7805f0b4c26ac60ee5d6e70d2c8af2efb33ae1ce50d48c889c888e5c34794cd4203f9c8852cc08d8f227e8569f11105eccd85c3330c13db92c644cfd70a5798c99e99ed81991303d2cb5bd866c5e00c2683abe3db0473e3f598615c13cf1236bbc0c8e32bf1457097936bf4bc1c2a4011137d3691a692713d32462bf2ada1a8227ae3b551e68e5c8f67b31509a52711269e3a371cc15bd22062296a95851754f3dfaca806b3f16bb0f2fc33cd26c7d9ca73063d5860ebf466382d880d48c16689212b08d8c10a8bcebb4c46691c3f9e038dc0cb1b8861b78b65744ecce3c7db03d60abb16ed0948e6bc74c1159ee2a48f56547d95835f543ab9eb3bdc41064721ea365917d59aafdf77b06844f73268f62239d2c1fcf1b7c0de46f660e065f2391f232033b7504ca593ce215a969461bd490a26a2140120cf12b68743c492948c5377b47200761a7c5a47ca516d3ea71d031b0a1e1f4a1b3b7c1e88f4d82d6e1335e78893245bf39ae9ee727e1e7c96138b53928ca2fdaea462c0073f76adb194b9782e858b32d4e56265179e0d9a8285d4d358d95afaea445b4d02201e34d5547e487b1aa7bf0b251d8dae86ecfb15c375303615e0bda14440d1827191447c2ae4db3b299b32efa1405a291f1ab89385eb91ea4c853c7b07c18fd051127e0c0e8b500a38116c2dc84e64e0474265466b30371b2cbc19a234e390e0b670648f2317213890d0102513907ab4501960f0a6418c1603f9781414dc672995b91479d6150d3c0794b0b09585abaa5729f26608d7471f34228f206e03a8d6327d780addfd8672a5d31e4c916f8f20befe3f6d0b0a8e3045be532ee486c83dbaf9caa0ca658afc2ba0af7d075922607a105200aaf1640a292c0b1888a5296f0321a38e86232c2276d8a093070286e39efca707cb4d497757ffdf18ce5c10ade02d849698364a5b457fb946434f2a7d18d82268157ccb91520dc5d85513dd61b41c43993bf2ac35971aa19b4c427be4f7919b5838abe9533f8c3c338353c522605852e067ea020029bd49a4e75d90711113a85d8b577e8c110a89ea729786d94351a7fe0f852a497e849d0dc18aba79af6028a1b9fb5fcc2b4a499e2bf0debb7574c24d97eb8cd55b62f828c3549225a5230c0ac62986a478144bb515f404e3ca04bc1e20998898a81d5771354a7edcbb9790f313948ec04ba2b21464abd8a2ada44dbc0b28e585af1545f66fdb29c697b4a568c00d724c8140ee3ea88f404bc60abaedaf5e7461bf2cf9e0d8ca9257dc2bd4351ec660b4106a3a27d4a94e48cba218ad4e96e6b6cbf38bba6d4745784400ba9998914c4a339307a64c4abfd75ff2fc346728e85832e341c6445866f2a36dde6f9df505941ef7bbc7d63e095da15f835d6bd370e02f721dc227da39539ab7f1af2827822e5528a5ad353d4ce205651c728e269785e33d41e2461387a2ce849270bc338875ff8480f087c18e1576ce36afd5972e8d3ee2aff6a256c41ee8f436564f9e18a79332f77e390951ef9032638a8f79b78e74fa0ce935f9c191587114490eb8a9ae9efcb38bfdb972e4f0c15a2eaddd5148b94cc38b42e9dd1b117e8ba76d9c7b933b93308fe6c0af935d7e6c19930ef66143bd8124194ed7394c280a9e6b67739a85bc92d71b974ba06c50963ca07f189bd03bafe5bce92a1088dc9a53e4e76645b86159f2cfde83fc5bf28240c4bc504db3297d81896ec8274faf2c4b96e6ac41f966fe3e42c355b8172ab9ca4544e778a54c4159d8882f16d2f94235ad96b75d0ea84cb7a58c071dcd5c41dd262ad3ac86e449e8e005d17f0a169338113054b10e1c83a3ebabc049db1249504a8a38305437e446f6ca52a0a3a12abace10d2504de9b906ac505bbed35146b8b2db94114f9628d33454c26b599cc982007ab846780d4f8287f6a286ea527d13cdcdf12bfe17fa5984431295bd8315d037a0be74d5502d6334baf38194931556ae973de4c8486631a8975971265943d5db6c360b6061ca5e00e7ef013efb44646bf9e2ce1f7ae4ed7a992af36c0d957eb95df7c84cf4cbb50a73ed8e7c8d26cc46e59e82b9bd660e148cb43a7454b4474b11035574bbfa5fbc2c24e58b8a29b5ac1ec57f8c586df851397c5314ddd08deda9f46510ae2548d842fff54e8861e182dd9b043c541a4eb6d2d83f4a9b9f09ef8f4765b4e3432993d5cc073174b71549a2c8ba66a550e6e3dc5119790e3f680ebfdc8901ab63eab97f311e2acadcce12be82b0960037aa9ba6e974e8020fd2b7bafa581053a0742b62889595cd4375ed34eb3a0f158dd8ff5477ad94fcafd579a868d97fbf62f365693cf05707ba560a32850c4b117aa8fa5a4eadd967a345a92e2f54a849484e19d5babe5c41547ac3996605dfdab36e80c28c52b04593cea223ee11c0755b54de165cbbbfc3974dae0b6523631dde20c3f0a5cc522d895d1fdd7d0d40c12568601b07b9538eda4a0f1579203340c1121b817775bbd92204378bb03c91cfeb5fa347f5c1ace5d9f7b02d29975ace315d5c22c3edc1b348f04be4cecd22fce412931eb2e38c0ff4193247bec5f8e166c582ecba69e7a6e16ea25cccaec4560aee43763f790eeec11ddc9002878d7dffbee273991788e0894b6277316ded5cea272ee08ce5024762a6f194b6dfaf9b498a10b76c8b504f1bbb7f52161377c6fb04efd18750743291200269b4a60121422d69f7399eb2b8cd8ea3f2989771e99b9b55e9b0ac5eb1d268901298710080dc215418776f5be2087d2f8ac8c11bab6c13f0a596629733ec35a3b6e7a8a1cfa7d5d079e2845afd5133eab20b2e9b5bc1fcd7b710f3722642ff2580df10d02b30586c81d964469291503b13d6fd75b813eb0e02ba644825aa94172bc81ce048a2c3fb708746022ab7e2028a7f06df689c8da35418d2d2827857d60f968ed21586a0dba83c022a3d0c8cbab2e2b9f49c95f04f5d722e0bb8dd5f712c3342dd53673473a01928ff0d8fcdf0a9044ff5d4ec2620a9d0a136a49494242d0155c7543a921569b077632c212fe9c1e8e9b88d6115f005f1993faa5cfbccf3c72795009029ea32fe238ada43730a70270155b7f74108fbe1edadfa1a9e5edf7389d60fd6150172c6b07627a56b3fbe4ac3158e26a0eaacd31a4f4eba0069f360bac311dc7b6f084603e845e2f4e824a2a96ba03a0664bb9c6e38eab6174e421e1c62faa88158a3c4886a8d09776cc31cf710c50772ed4bff54a144c35bd8889e3d92854ba53e16c7eaf69b92c9aeaaaa6bc225472ba249eaf7936191faa67e05dfdae6e7b092d10ec73a436efdcdc31dded1868cea5e857475dd653757d89c9e5900779c284424dbdb4fd1edea2a9ff77158aa72286a5695992bab16de1c63f1170ebbc1b277cf6a4b2ef017c1b4028b825a77a228e8a8ba07da813ae7277b931055e5371287aaa1a9b2431b738d959f9a434109067da95b5b5b460068a053b79912223756933994e008a026c696651df497418d3caac42ce9e7ce8583246db2be4dccac9b7a37abb87ef3be2a906e0249ab767ec751f3d325b55e33e1beaaa5d65ff427db858ecc79c368b55146b7a760f6c2589308a84a23406b54a3396b6e0c0e415e07e8d50cd504febc3206510222cc8b37467fc6c323a422e0054a1961f9df7788f3155c2694a9ec42beb62759f437371cc8c36cc4e47b8848bc38d89c63728cb51a1da451c512f1f03fbe43375fac591ebfd18e86f831d7461db3915e8452f8f4644d614a04a163a3c8a08f6154e54a65f9d78f72226edf2e0c0ba33c9f2c8ffcfea78c761145d3f0238c30f2604747a28e1f5e82d30efc613fe51ededa9ecf6d26c1f980798d27db28900ea93c20b9363f68a6e92c9e49928fbb0beb8ccea61dd9b04edd698787ad75a6ae55e1d831d0543157c18cc08e23a633d62d71f285d116631dbf9f4198f3341cee41a70da9e8619265db6f595eac058be799eacd49e82111383392ebb84892156add6a290908111a9843e2528f94518cd84335a23a79a8e95c779c863a669941480f40d0942289b73fb9d2bc99ce9c1047ec3ffb9b336d94fc1c9e5b5eb48392bcf00bbeb1b6ea1f31e01f4ec3f065cb6bad5cbee5a6d3c0f63c7a63a42f0865d38ad0dec32c580e437178a2c464d13da0719b1033adba10915461fe093dd1bdad6fb308fbb6bc1122e0081f0cb2272082cb690cf47b0f6a71658fcd7235517be50cdb14a6caa3698dde8d0531b44b35822e6134beeb8f23ba329d83126d53edcba4ce2eeb6bfcd5303f28199ae5a4adced7883450a63ced636fe968a681e93f61d1b41132daa072b4c9acf424543d13c1a165562bc67da65745c14d8a952ef315ada00c880d4576f0454948d6926106bbb6bd6816fce99283770e65d38906d0a18e1dd3a597fbb87abcc10f9ecc081df3c91e956ce21fd3be5f4ae779dc292d115b723bb16c09b2fd655bd5614ca9a4efc1c95c283b654bb314c4e590685630e8c2384ceb2c8b5ffb70f17e252d45de16eaaa420fdd8e460d61eea59127ea774e13b774f93e8b7d42ae75bffa09ad7b30857d113d81eae3b905408477669e679e41690d7e0ba18535cced84a782d615412b13f4d3957ae848a80d97053c32a6f839e5a38e8b568f5351e4b1d171dbce6c15e5d0f02bf5de06eb290263265910ce8f01f71af1eca030c912b1bb353db2ace9dcdd137d9dd77708561459fa674d546aeb888eb1ac3be96e47e66c70242e782349791f385477664c2ab8e728760735150cbbc75255433c5559d45954f6b73bd5ee3a7b32447d2f17f7ba2cea54126c7a91d4d1bb987e9c1db74f9493b2e2bfb04706e90e4cdc38cec70fb7e5088b658b9c6284e3503f336081423c9b1a83860ae5880b4a3c7e86355ab079641a2b1ce8fe4df5587c51c4fec392f53bdc3b05c65ee38d367859dfb9e2052fd0ffd653e708c05bf21f94d3a6540193214704c84668c92d1716c198cfbdee4aba9b83603f14cd48fa3d3e71aced7415f3d48a9668f0f17a8ad56362da47607cf16125a778c852ac59e6c05225c11f58b49b5b373d629d4dc5903e0a413ec7608b8e06c8d73c14c36be2c1d58035c23ec0576b8cd59f7ebd9e0deb7715e5bc06e7435d5629b0414a2ad2ca1a9b804a11ba9b2e18533d60f208332409ab2a5c46270832e164c39d6ed5a8f18edba9389800701c3ec1dcf405c8ed7c8e68b8c0ec0f0962b23f0c27fcbce4f6f739860a49fb6801242512ac60cc13ce4a5fd28e1593d0f305e66de5bfa5476f704225c736a7239fd68b604e05e0a508c544e161a93c760e3f7839175c56f35cd8b1e7bf7aae1a74425395b42c817cede2f62fee022ea307b50dc8b0b89aa89d9f64409d514e97430d1186ee9cacd54dcc98eebeb5340cf7b7183acd086dce8238360489c4d695f1728cd9c892a6922d262591ec8e4ea82c11a6e47e83dd1aeb9059f5daad1c7156d59627b93b8a7ece9dd480694d8316251a6602d5e1866345d14324406afdd412f471af3dbb1737c2b650d88b91754c35f2a235ff84ce4cece409fb309c0172e35bafbe7ea3ab7640edff45e7cfa1c3e2a39d237c126e54110ae88b427074899e47ef6259856f6a90235506e10cbd6205b9dbcf2e2e8300bbc51df43a501b5596409fe8ebba8de56f7d3a69d80efbfee28f1bae76cbf3479476d90bbdac15c503e967fea76be7da85f7cc98001112630b0a07ea73e900a099eb2c465bf79a1a7b538b3250421876719fc7159fb332d7563106ecef0f9b77aa2f329762787614d748c13a7e7d3c8b048dcd8c24d297a0cc6e1d39f7f27cfc0b31067b5e496a24a1aa1e3f4f58616fcd5f03f87aab843fc5b1100b3d54702d997f83a555931054a88fbae60063d18d012cf254aed1ac17e14e0e01658ea846675a278b6c4ae1a1898875fe9805f97ebd6290965c64042fb6b1926d7a8b3b80525172f40554bf52005d8be5e08eb9060e9138eb8a33196c367d5b938395c6f241ad833c15d1189c984801c034a15c3b96167a4218bdb5232a579d65ffc545c8ca01881c4cc66e2a511df875ecac9346f31cf1458c59f382773e6837f665441258447e47e3cc582bfec1eb3b7601a305ef26d1196ce0f7e5a5183fc0261d8a1f36ff4934ae4482d9461253b316754008abde85d0d89b2c3ae05c6c1fe946e88d9499fdcfa3b4b18148a35d6c3c899f67f979d7a1eda52c16b49f0d1d45c0851366d5ff4000ca6381019fb7ae680623700a570083a7029a0b964100a594a723c20cb762509e0ca4bbd7770d7814d440f60ecda703bb58dcd625966635fcda746d354703d65210f38a7e11faf59743d1f9dca4407fda824d680728f7b2bba63a5dd06d2487a3e0e0421b6a97b2df1a15e59a1fcdc68dee18b4baaf1f51504a0b1888507b71e1d27b016ed0e8d1c83d531069ec305580f8ecd1f67ef8680c1d686a75f31f6bccf27f2dadfb4b5a10870aa4bf7c349fdb3de4643e9a17750ffc11b682327ed3cffeb9e732e27ea5fa4f4ee80bdc88ac115df0535118b685382a01a74a1ad3bcbb590fd3c73b04f959a852f6d4dc0b4ad2625844bfbe2db583072cf4934738b0fb7e28da1dfad7ea0c588120aa07fc88406734b727317df455f30cd028558352f3bea38bf38c4cd79bd0c9f1113d33d425e7fe7c653b9bc17da0009b0c44b17fc7cae01dc839dbca77827eae90d96c64b902ab6119358d59b7614b6f2debd9e2d57fb2514f2653931ef6c322425b14888837cbe6c8194ea845f61580e4e8388f582633035757e950e20e4339f5175cf04cc981fe3cbf5efd9cee297f24b736662e308a5427b3f52cee687a14ea49c0a68b5d3a9bb042b8ed443adf8ad89e74f2996ade88904e8e243a834665ae21286d26b898f4cdfeb823d9114de8c06ba14dce07eb4aa3eca4085e08499ad03464b6dd12645815d93ba6ab92c7819355bb39a1eb2e9a297a9acc019ffe32ac618bc23c46f68dc1dcf3168b902fd679226f1b9c331c0fd2dafb6910a14cc3565087fa26fe1fd69611c9fe1f4e7b20ca83729a0f75534e4b28025912502354e09500f3ccf16725930a314e2265e25c05fcd61cd50c88fa78f2d7da01ea6a8de169d82e418ab4d05b1debe0c1409010926cc4c2d83cdb28625c6f3e751f66667b50c261128cce44e3d39cbfb8b0d84400a8229807db711031d1a51a6381cb8266c27272d93e89968484004de7c06b08351b0d75149663410ec414dfe2c9322b00e854fbb60f9117c468b281a0c7b1b9253b3c9ec6823e72a449c089910fceb558684ed1061ec4ceb1eb09b71ce2a9f47f6c8b3c7598f5b46d21b61578b71e643141fb09be87ec42ece6648303d3ac38f0af52d1939ac718486424832e29ed4c4f072affab0e1fe7bb09a72daa7be51130d34455511628212fccc90b5ff8be95eccb6ea90ec389798748cc54bcad8604c93b44102fcc510334f5f191bdca70f4b3d8fc6b382a6210ce5d61f1fab720baf06790068e685f8b242b7f5a31bca3e32f8507452edf83fbe065d098fee801879d34c4166bc2f834a8d7560a2430028203e66df7d2c8901fafd16e5e9da9058ee9b3f81f7d30e630c401618b0d613bbc967c6dd1c714ef15fe0c4067c542a6cb1fc7dcee5b3862aa792cd90fbfa3137b023174bc0deb1d6cd4200f94b37dd88bc712c00ce33afeffa972647c035e888caa77e92c9de1ee53c147fbe2ba5198d24241205eeda0a9add5ba61a2ad5e3863521beffb59aabf3cd4025a3497831a27b09664521568513fb0f33df612714f7fa353a9cdd1bdea4bf623aa633caaaa61ad066459b4845e6dc2135fd294079f293d63a6c6b918fed75c369fb7df329606c8045aa1ab27f2ac756b22f2af30087bae2767bcddc0580fa3aa467481053722922bd2f84b958dabd6a8c8e0b34127a42184430996b3a8aafe296679274e23c87f202c7e99633844b3f57654d557dd602d9be932f81a4770083ae097560aa20201452dc64d2b79f824a8aad203927dea8c977a48ec257658d3b4568648fe10c2436029433480082400b0cfa9b5b1375ec678c527c45471326d411b7acc649f7fe5fbaff834637ada524bae2b18a87095a83a2c626903187c00a6b3f1cec8afb469f709f04b7184de0fdbe542c4d9a6ae77d46ab9be2597571d319f407e454fa68fed06e3735110ece1cf3ee5ecd8a8965bfc96d7322413ce1153fd262f767681728988d46fc0610fc5dab410a98b6c2baef24c39c9b53c4680b37a831215f59ad902d3fe16541492070ce845a302744a9a68d4fdbb7c8eea591c283ddc304606cfcf84bc88b3afd981145b5494ffa6283fccb70eee9e23bec60b384425cc03b6ccf999b2bc5e6e12830ab249da6ed4a104946ef93664a083da64b62615d26323606f91b814a5e026c28ba71e0947965cc9d98e6864d763580f81a2b22064cc14f70b36c3d75ecf3d0abfacd0694fa0ef07e17aa4712b9803dac9193fdf9e8f47806ef516593a6b837f0a297d3b37a15574df646d2a1d20bf0cbc63e9e0106cc90caf14045af04f286c35cac7329b7ac5a237862f99e16563f0eeef5a3791b7c85e60117ca6591a1c8865928f176a1041f50008144c14b30e76b69a837373c121470dab82c78da14a112047274c6c7b155de8f78ff8e15591e0e74749d21b70f3808c3ab4a6cb476f1c4adb472942059115386afaadb313cebefc4ee30cb9608e1d4ce9f251a7b4d172af6180475bbabe83d08daa374c4af969fe80401d05636fc3c6778102c9af96a56d0c6e2586fe2e336a3a0fc0cf3994f5ad38b0f09024b44ae32bab37e08ec963da798691e9f0fd5b2b8723016ebc7a9a55770d22362c8487c51dfc5d221c87e84c0960ace4b73c591f03a169552ae115a4a781fa100d81b068e6bed8f24231b08b5b1203641d7ecab99ecd1414e0e8431405c817f239cce371810f8cac14ed002505d445c9447992c747325ea74af4adc4c1424a0ea94c1eb5fef0e6acb4ae1db910bff512293cecfe65f4b4ea7210819c5552a3978d5c85748e2a4be4d50d2c45ac1fb381e0da04f4f990b3fe50f381157f0fd1db526f63b5c1b3a008fa6e4ebd524eafd60140e8ee3cfe0ed4c2f56f59e3fd67a0b1e3d77080c67b9d9d1926abc4a0a07d3e87b0ddb7c221d717435fe50c39cc679899e3060215b9602554d3ffe5fb86b31e956a0de2520b849dafcf62d93c81c5e5e0a8652933b095434edac60465c7824da604b6a80ab91aba555efe1d8e8700bfa11c90d8666c9c4f8b06a335f5692d73bd8aa2d6d23baaf532c145b229737e05d64a5528a5242f11094c5cc9ae197d82316bf7fbdc77eb98794fa722bb815c5830d49b5259b5a2a6366d77ee1fa526fc215c1233ef320f673d43e85681b4c6ea3046bb5f84a56e34d051c544fe04aa1b8b3984f37e317c6cec76f0162cc3894e11c7318a6c21f453b1f7964b6b0f2a721197cc971aa0a46a80a4f4f598a61be2a5aa63ed3681d6c12252b3612233d858958d3a3d5da6e5acedbe0acd342bdba90a834e50a8cf5b07acadeb879f0c2df9083cb5c0a885b55c9e274d867315a5f8b1d2bf92e56a63e40b798090914d503aa94638674255f46485546a536b40bf89df8bd98eea5c717872e62822a73fb465e8bce94ef112252521bdd185d48d1b0868bf69e088e05f4df66122508e87c9c671cb2d805a2c3e58aa29955b7a55bf5b1da2557ffa865d73e3c4e8291d81db582921e4b6af03b7eef6534e42fda2856a785f1aa8459d5cec9506e9c9f1c5e3dece63bcce2039ac2907b59607dc7d7185cb6a487ce144de123fa7f80eaa7c00262e88432db4442d21888ca8bc0c955e2d3f45b8b76d0b3ad8b18f491b307b29f7f91b6d9ead89c707853021a1960fb09309398cd77483ea6b2617641811d4307e6631d8ccdfdf6dcfee0fa18756f99150f122168d4728a78ef9fb1012cd930e2be3bc9adf7983ce229d9d9a2d85b6e4261cf44ea86dd51da2b6cb12945078cdcea4cd48095d11d801116c9bbef3363c17c6249be8873750883dde61ad43d592322dc8f3e9cb3e0e0a94aa206c163a7eed9341300f96ac199f025c2043c16f14b7c1ed93a1d607103fd21abd591f65e4c6a4f2b20a992b3dd917381be7f7b9a21b0e8ac4aee220458671a2572b1143d85d37385645b9848b93c1e2ce232cfc8c8db3f22940ed68d90236b0a4a01d44e878822d591544f5322c55b81a19aa7b6f5f04455e9a274a8bcf2bd04148bb0a544111f8c2582f2c0401d9e3e24c2d490115c822461ea936138ffdef9706910b7618243e9461a35782613b8cd16745116de52576c8c8d8ca32db76380c422acd76a9f9881d4b1e85c66c21c6053e6ee1a219e5b7421733594c525d1a80919520cc29a54b1d4998c785ad364e9867d4103be0810cbbb596cd8529ab7ba758f911974187fa5cf4db633e07e7b2d284389ab2b037ab81da6c80ead6ebb78d688b367bd12b6f80ac60d2ba0c42161852a3e9bb17e05db626ca45c53bfcf84da77e39a7a4c56e0889e755835e804bf987f671f96487fef48d4df057c91b5c6a998febae86e39cf36a01a41ac7b6e7a8a097cd3b5a2dc4c628741343104ebd2011728c9e2db2b0975267b5c49deacb0608e02f41b6369c71cba468bb75d186cdb10b4c61a948aa323ab1585e4cb37ea58ad12d7d981c7d3f4d2384549df6df3e996ad999f4b1aae8565767dd9f85fd230ab168cbd0af53b3361e39865ee283b82c2f9a8668d9a75ea6221af28f00da367f103eec98e9234fb31818f04b1bb12a5b968812460070224bede0afaa6b49f6a4602cddecb968595c040505c206f5d2f2117e2eae6a8f0f1d2df435d42bf179399ed4d09025613dc1700b73a2787bab42fd7f5d0fa5ec8c9f06be7a95185be38760405dd8bb6ed1c574b9f2ab866bfb9e7cb3cf6a579997bdc2a68bd216a08c1b8317ba51b421ac14b1110605122503a0314558f7d9ce69fa6a2ed7e555de9336d563a8f103fd28f5fa59561749941a1600cd4b75805dba295fccc65d966d40f6a22e8c3be1b432b0afe7c3709e05a427796053790166202286aae4a527148290638f76a5c326c5300f42800000f59b7b8a6c8b993e05cda80d864293af161c3afbaf5aff343dcd0e86d021ff57da52143ca596726c420d6a1456f8090a3c2e211b53519b3ccf29155f11aefe0eaab2e620fb5368a4e0c3cad8f9244492d0b438374f0cbd5a91134a6c342928e7f11ce3467b5ec98514dff18c8b701403d880d6fed4249a2528e2a4226e9f9d1267eb9701c7f8f8cd1385981e4b9254fbff9309d7fcd68b061e4d62153aa6dd3300a5731622d22ad74dc0515d45a66e44c2ff4b8218d86b32be01fabad359cc1254ef91295b1d48d4b9462e25af1d34df22a518c744af46f7453c5331047c3b0d1ac2096ff89518960d5808ee619b3413b436cd5ba57f5664566811879f3026b2ace18861f6fa3eca21f658c708ad62a8e41bcce2ba2ee74111ce0f822a4016bdd9a2dccfd7a0b888f61bd6286bce409148f4f608809ff0d4899bc5756962ff5742e18184a1ba8754ecb50af4b761011e292ba75bf9b9ddadcb01e0a68d5aaf5a7225b6d627f4869a674d4864a80d540ef918250c07422f342dc2c646929f316df90ddaf2493624af366079ecd38cff236c18c47dd6e6637bc6fe1052216272b53237d512ef5393460d2dd0ec2189464af70f6b9543d39e458efa9ce8030f10c4aae56a53597b3bbcf8328c4097c884a1919da8a62d543227d4b40f91ec941aad219239a1ae3d8424a7d4b50d91e4b44c51cde98808b5604d92e8e16a7b0c84e242f17154c05c0e7fe311fd300b5680357ac6256693344202c25c37bf30d1a49a1003bda0ed1f955eeaa28d9426b074d3c24253ce58cdff25755da02df1f9dbebc71a04c450ecb803872a9d730a27d17423f4992a4b936061c274bb3853647044e097101c79bb6870022eddf1821d9e93ba6b2f4cb001a31d0c29de38544b8c0d8c5ef89ff71878286b729f83841ee50f58d875af6dec9fe6b6aac2cf9a607b348a8e10a1cb756fb7f3ff0c48ebb2798eeb2244f04b404c608c10291188d2b72468bbfe9bece68d4d7e93aafe1985ce86f47a7e139b37c568b42158252904f0411b0dc85cfa53ad5a54cea72096577a7528e1c205e0bb3400a8c6c608b331670822a7c6b690ef037bc1ce4bb692472a091c8689106bb69b6906f592b653d39f8dd4f5e589537c2fee52758f6acc88546809046b440ac0bc9738089c3873afb98ed1a1c0f669eed0e75d5a3adf2b08febe65b3259321a06e20b084d91efcb808f5c7e36f4da319367eb4a0eeab0c2b0c43098e2926753e5264ddfada05e5613c2289d87348928efd1f84208a29b619fdb97eb167bc975ac58ef72caa29e3a7f5ce20b117c3f90f79ebb1a3580797c0dfdf055cd2d5613ca0d5d45932878c9a28a1db4bc3380d521599800195454b4442f37215edad215132618ac9af5f132514b94d724388c2734f946c4bd003992c230ac1615993689eff32c953a3fd921b70d2cb710157b6adfe3203f72f9e74bb61411ff92c07db67a9733d22a2a4270125faf0a46bdddeade908a3b679c2399a1f1878d20b174998acec471adc83e95537f2ad5596de65946c440bd0c6b52ad36928ba9add44c086e599363532e70d71b9564da0cba18409c62b5b69adaa8c17bd64f092cd7ffd6f49b73a50fd1501ada48c3115133e599f49e5021bee01f99915d11018650593e50f4e97b81cb751317a4c430f2d4df5867877e2837881a86d739ac0b1b903410809901911282d9b0e2568ef7d1e0d951c5566437de61eedc01e0ea942f9323085175e999983af668de588d56815ba162d556d85a95518861a0255b07bb0603f5eaafc90ea0f2759354ead24d350a9aad227bdcf5d0a599b9208fb921e74e128c32223933f1ec2caa08595e44ba7c1d854efc1a219090dc5b76bd0dabf17fef4a08ef0b7651316270ccbec50698b2eaf0f032b55695d69c7c0d8ee491fa17154aeb0dc30e3dd121cc1b5ce0b3380859e6407413681422b80a720206fad3f48ca45d2e928ae142d8394205a310b1e739d4413958d77c7ec341ed5345744fff1a43689c4140696d8f7e69b249548d35bba119238cf240df585da982e20dcbe4bcd77cfd75b172c2d7cef0ef80daccee7a6b7898a79e93d9709c5c2f584202f8325d934b6a44fa03e63358592557669b8fe49aa482a0e84b274ff49def87bbc77c2a462a85ae8a491ce33ac2875d61b409f104ad53334648f542b25b7a56b235bf24884b3b2d99b1afa4dde0eb87d91e958ba5e68720178278e3ec87ba9bb19977d05320703315de99035143ab508674efda468a1247c708ce076527da85f0edcef88e11830042c4deb28820695d7cfbba3de0b9722074814ad438a06a88e3ad459d413076c7db4a6b12971e082aac0ff48a924c50bcb0748cfe0dff228768c09a545a10f51c87a2ba4903e4aebe458b3506fc90a9916a56bc5eda7c8d071fbcaaeccb961037a6216e500dab1d8ec36a6c0d3d3db3b71a22ef5f611efe2aa970b0cafd272af8a7862995bf03c981b27ba0ce68b2ccce695dd51ade4302e2acf953395f14de5dc6d2d27a179a2de4ce11aa2b15344ad8effcb8d138a2e7ae845df6385adbd3bd4f4ed0e64dba516b7743f05c7094de1f691c6e50ca364edffbb17525d8325fcaa6c345d898d4ad078859750a4046e6bada45d1b7f96abb68ae450a49f829724a9cd9b0a93112963b496c9227ce963af24ef3d1e4f9103a8d667b0f129104c384d582ad415268e26f9190c210c178c64146920895b735a8a87e5c9224757efbde105ebf8698cd4159a78fdb59ad92c1dfaa998b821ec3869789468d3961ebb4cb5187f54714d624108f8d42aa05fde419164c4836b60b8daca3a8261c9f3b23a45eaa4434511031cce74c71003df83b808331684372b5be0bca6868420a24ba6047a41ce8c5c42604822a56361140fc29d433dbc40391e16e7de303ad9076283ec117b9cf4f2b90c1e2207d9b104a84f4e5c81ae03c679c9c02c9f806a319331f70b1a4ac239ecb0405f03361584c065a620ef6da893c1baa4687a5e2b1e949f7ee46251f6f4e2f1501256cbc2149ef9711695943a8bdb506f20135345a6874aa69a0bb782ec982743f18e2bd775aa7f2c5c5c60840e8a6472560ecf2caa82520a32ae180c3e3ea65968313f6288a87fff051c909871e5db703064892d206485ece64ab7860207862b568fc14c3aef52aa8126b314d8976115ae68f8ecc6c23e7c142734eb948371fc871e871ecc4725753679215234ba9230feb19b6bc2548440a3a85a02c9edb89219827a49a46ec74a7e29b4af328cc15a0f826b1e063e54dc926481f2ecf85c39c67db8d0926ec39493f061b828c8a30fcd983574e5abeb6cb0e84adcd70b882c4a1b66e1b3be9853f5a12bcd88e4ea3088195d69893e812f6877e8daa28077cc6374e5441f4651b54675190234837b7bde0459a783dc4957261d5ec17c2506a0db3ec0a4313813469a260632e054febd8e74c765129370cc2c435c02841084d7a16f2326aacdf402803740d80a51e95d597bf4f96d520b0c857a79096caeadf5a64446a12b31b0e84ada95a6d8069598971aaf90b671f65729227e7f6434a2f2591766263a0873af4107c11b4b194c894ea02cc8de4e8cc4841d1d739255b1ece4e0a43faf5849f31c8c34087498072170c1c86546712aa6e9a85724afa53ba6330d589006db5792568c9de01abc88f161eb1242c19b689d28400563556412290e7b459beabc67ca4bfa2e8d452d0660e85ce2f5d70b8fa9cc94ca9a4c4d333ee30b68c66eaad8ee95df2feab131ad60a05eccbc794451acda0cc2ee95ab800ee91b838cd6052cea4d4000bec205786d6c5d484e8d01db4bd80c0ab414ad610c31df27019cc9d064cc30a914f80817d9381521486fca2c1a072a3ac91873e7b1d15671a242f94a384c854a1f765dc7d38d5655304c116729cabb318486ca9b8070a9148fb819631a40bb280238933d5fc5fb7c65a7790348fcad9faf9c21fa02b10062d9c73ad072a31d942cad92c4fa90fa0a5dc68eeb0482764e9d6804953500a1be122973d2c679df22608598b46a6e37c625d5eb03999a4fbf9293d0ff8510f72bf2b2bfc05d87b6780ca4dd70bdfa139730b9f4cfa56e5417c0c2018be579f68e08c5f63ede8965065fde6290f744081bb2416dc5241f23c2da8df4a1754bf4ebb054e6c6c0a2c601a994840459f91816557426228382b36fd1d16f63ecfb1e7f47bd19dc0816fb129049f8576fce83927cd5d916b1bc32c1f239bc88c84b132ca19f3bf1bc4832166412125929787d1e418b410c84c318000816587fda40c64c801016b20dac2cda430a4b9fb715c3b2b0d81ddd3a5c61e10c04c3c2d1936109c5c0e66f99ddeadf99f1c32902efc51512840e79714207362386e59c49186749388405eabc6a04fbd3892b5a043e7c8521fa03312c6b8b7a360e885da65179382ce38055f3687d7c5e36a26121b79fce1a169569bcefc60dcbfda4868ce79bf1688928a58733cdb3c9a7715bbad09eb5d1b69ed2e65934ff04ba462c62cf6588131f1691dab87d4df65845dee8219752f0bde0a6c8b913606518d8d25a5f3762f11f0021b8243a45292b9dfa8a90631219003cb29c32163f4cb9516b97dcffd7a73bc16b027127808a0e54e82014f45849e2ff129ff6a72b16a83c05388467d0e519633ef130b6f61d70ba584c48f3d2b2bae817f581bd2b97c9c3a344f857302477775ab7b5c532cfeef107cfc562af3d835e2e1641a98692aeb361ea4e1a4762b158951da627938464a19c63590adc73b1080cb4394f0ed2ef0cd5bc757a0ee3983d68e0407582eb11f7105019d9414d291bf72634e195d1e7c532b70203b67fb1346c5c8df9eb00e3c555d15f2c0e69323035ff2bc4a4231cad2dc6820b0a7d58eabe31d53eec5ecd198c743aa776b11e9b2ec6e289eac61a47c6f22987c8146415b6410ac27a67f01339ffdd9e33164215b6c95391682cf354986c1629921a0b0c92bbf9f81a4b3e3062984fb4b1849421fda2cf8c419d9d791abe666cc90d92053b02a53eb4b1603aedc642f59edd907531e7557f05c7c2a13dc06d1c0b7253e2579a25a356ac9ee83896fc2da7f88eb1735bce50aabc91d67e400e5e5976979d7e92a552c4f6e031ea12c631a9b948c7e261be6d5387b789ef886ea9abc4413a96ea9abe44f9e32d1173d062898e27c52ffbc1cca0673278b8102243ba05a452413d496e05f06cece003f6b1180d998ed1711a13de6239cdd320fba5a2de8f7dee6359d905a83f16076001597eb4c449822c670078847be0313069e924bc2e0808b2a484dcbd6b1dd26ef0e1f0d7ca62d241b7c7a1d05f0a19800f3f0431c22782007007b81a37a630e27cc802c7bdb718922121dd1fb2ec49c73491dbaea23079c802f00b59f660d47b972f8022c4d9904485fce121cbfe7674159244168db3a13d2bb2b4299b98d005d5964a2ab2843287b14862e5e230791f81cad28a2c82cf1fef0e8714093b10216a1a59cc003f2100bc234bfb63c43a1959220345161d43bc69caa42cd19b8a2c0cec66a4a3da16682625c050f6c86ec556433b3074b8824dde9b6a7464c1d87f09812aa9b4ff9f510da6c49a9bd3ce8c02a8882f85e903d489950f2c5da73d348338112dfe6a5dd9b6e6d702a20dbc2633dc61559b40c9225a108b6431ddd2ab88fe0619089345271ef35edd1db3c9d0e6dc5da63af90c6f64a6479345b41fe22a5fc5be75472ee760b2ac5b26321652f9be8addcf64d5f82c46169e2f531cbf5471e2ae12007b02094b0138693559b664594e9ba1817d4c9610b19a2cb3bdef6439bf1e98c7454b9698edc0b71b7f4b0f04e29a902760136c62a161534d16ebf31a9adc8060a863050bfa11843dee651b613e8912f5401a1ddf7bb2c01de10f58c707932e01dd0c9174d735350d622091834a49c385ecc922218b19ffc953df9fd18d285ea8c25884e2b7280bcaea3e122d329c2bca420e35327a554c37035eb5280b7edc0acb180ce0b42ff4d963c19a31b12b0030a1283719690391b2604825cefb9560d1152ef045ca22fd00939bf16c5155ced86d3873dca86286d019fcd4bd0c995316a823cdd8735416d7446d6913b2ec2df9cb49571743d98b41c955968fc6362f5e24fca876a395e5e240a17772810b2c4bf3ed602756e1f25e7e26c0b20c469cade9581617803d5b1ab32c94aef6a765b197c2f8b16581b871f07922272248b5c87a7d94111563317e9785027674e8059c22f2b3c122c643064594f990f9a3b4998387ba454ff0216c56da5e9693197b3ce9f4cc35394186bc964032fd78ed6469308b607279311aa678ad752569c8c12c8b8bb3598286209d7191c30e9db973e31d7c8b41922d283237300fe5cd2c17d3b394245d2c82ac167c608b59263ec1f5c72c622dd353bbc73c0ce67d995da21ab1fc62161b138d90da4c04948f20c78f8a1e01a994942015ac20a412898654c68448a51f14a98426b36ca2f85aa58656e55f652ed647031b21ab3e597d1b549b2d03c72ca8765591ff87a3ae659660e32f3d5f661604e05ce8609e84af2c1d2c4cefe6699e338baf5e884964049c595ab72b0821aec05cfeeba3240c9c599ece4501b340a7677e0e726601dcf8bfb3c89fea61b34cd36816b1335c6ceb350b9101bb4551ac9670c8271867e907e5fc95e1420e999c258f7f570e8a72f3e7138f9c667ae6faead31795f3318f8ef23fd2513985a2f451fe9e3ee6247a9ba3379afe1c256056cf84f8dc44abf29fc0e631cc391951d81dc6916a5bf5b1e78bd8f86dc5e3e23fb855e5465cc4033f30a28dabe131fe70cb551b75d925588e8e62d691cd5dc1b2f63538abdd6873a5884a51297c2b8d3712b71dc5a481c788de8fec418adc7c596eb2b95575d22b3b088b25d73d2e428c266746e935134857dfc9222a414d312ab6e9e2bdee714f10a40969eded618bc0b8fd1d06744fe052e9e1ab5e2d8ef618061c56db991f84b4c01e5445d37880ebb6a75658e8847f58c2149e308e6182746ce2cfd48541c7617b41ebd322f13ab02893c56427bf927c973f7f9def876151806870da28bbebc0d42ad856587e4d3a68d961274308bc10cb327274047fadaa616b248dac273df15a6c0b9e182f1a2f278527254a9ca7a21114e99d042117236cf99bf0fd1391587dc41866c0bd5d6212c2426833fc0c25153cfd43c5dd7bc13c15773ff3d3286f63879e087f8c8a967c9b39903ed90124bf88e63bc23fc62f47e22bf7653f840fb01403e96edb2577ebbe612b8faee72188378590bc1c6380b7efba778982e345ac0cc7184a71fbc6716dc9b339104a9e3eb602e96f10fed4bed860fac041ad055f0b33adcb963266a876dc5dfb8e8f4cdb3778cd6334ff9cd37a4e5ddfe24565f4090af99eed223fe6be72a9f324e12a3b0973fa7957cd37d0cf2632fef8458ca6077664eb4cf775b344dd057995fbd6815b1279ac1274b82080c83114a58cc3830222c7a8683247b8ae7db9abaef1b37981d43fde814c021edeeae87f3802b9a1027f5e4ad58a53e02223376b42ed2b3c135c8e7e2d0d19cf07c8a1ced4e1a98cdcfb8123ba80fc980661dc09d9ac17edcbab6d231610246c104252193f528687f95808fc2af1202442a810b385ba232b2388e82faef695118f888a50995d9d47c091f65b8ee02987fbd8978b6535f6ba60691f751a3892b2cd1fe4bf5f5f37a24649d8d7aa916cbfdc61dd24530723507f4c1ab53cc798c3d997d183cd7d1b33da5ce0a3c40f491200ca2cee4b1b9c44f1f32bd6ee2bc9051438c1fb1664187d0b27a8e8b302f40ae34350eb16399facb2a6109c91bf4c79b24657481c8e215e89952676b5fbbef284adde3777f25f0fcfe8007d3d0fdc1683ef2b801afa589e7d5f69d4f3e14a332d7793536b8e61cf795f16a09fb5237e28d3def7e33f012e99df1b10ca81f3800dab912fadc9816dd6082088d0a039369b4b2ceb484e92cc82c6320b07b78773cb08d14dd7531501f4ed76beefeae7347e39ca7b429a7f5fe09389ecd058d0ae8a35aa7a23a3f043d5dfd740e48f2cdbead5da311943c0efa5a3358cc70b5d4d1c1490945295d3ca5934a24b60458a3811207c0b6ba43b7f1bfc3a47a5842b6ed1f8b99c2abdc6278de6c9c424fd7d51e67c0a01bfccd7549904bfaa37a126f15462adc1a11d8c5e0088283c3e92f021714efa7d61be4448235e0aedc94406487b539fc05d07d8543f4d1ad953a79d266400942ffa34b8eb0263ddad9ea0fa3ad79255ece34ae3984789f5efcb9ffde127441a68eb253bf6b0ea530ee99b71a7af72acdf918b9358b8d54b60c334725e23486b01fc061985fb1649d64da2c927682028a149d1031d415b6903fc7ff85700bfa41fec4601ea04edf955dc9a4647a32ed01ef05bdd35d3e23fc20b26e93ecf08f875776755878063b5a7e2b335344f1b541b9a9a909e523d05144f838912268c429d46a7f01d0a4e74b61055d4f7fd888ce0d77edf5a4e0e8c0fc0efd5ce483af09b61a079a56d9dddd40a1b3fe03b9cf02b392e0dc32f97c888a87d6a844403374f0a38111257bd5fb8dc88d8e376794ee2a229e94e03904ad3793deef4150b4606dc9a0ca3f439bc433ad02574ac9303f87ddd07144aa3640956af167e456150875f569e885f6f53fb8f4421ca86269e4ea2a7e6111ad348ba469aac3b3bec6b8a2764a44d7593285de30bd7c181508cdf5769e21debdb8043f61566e877be98d5aa96dd237f0befd73b7ec5f3be046cdcba087913c80fc66a41b5b74cdf6b689e50c3177b6ab2d6779389f9ebdb0c5488fcfe9c70dad8db4f78bd3e3cdb9100dd29ff916ac9f66b8d5f43d849a6a890bc500072077452350d54146fe48fdf0ef7a55ce417f88210fdc4c6b2d0d3b8296189033efe516d73a2926535dba62dcba44803181b59514fcb9a2c1b925fc3c0604a40f1771354d0e5c47c10aa69e35fbf1f81ec9a332e64b5d392811725b6afb24671b0ee47768bd60631bf7292186103406dec577adc46f50e18451f464d50a365776ee619c523ed3a333540b26c96ddc4ee3f3d3b66de1ce328aeee288049b4961af699ed7a8b11290a1cf3eb89660b1060fe0b88e96cb6d87c9b476ac2a2d0c7c308b7284043a475e04591e467518ee74e0a2cc4c558ae5144c37e93231e9e28ed5729271921658485823c186955595ef58179c2d34ef751f882d32d2a42c257a32813eb2d6b0cc425838206636d8a24c45294604a83cf904695fd9f498a344af4f86138dc1da72ba10d9e14907f93732521ff243c1fd1affce3277733abeaa7e8bacc82127b342641a747a8045d7d16900215563e80472ac5d28b59286a219838de582922ee4e526b5aa3d7c8819b43f6f14ab1012915490b3766e4db13b8892ede10b91e0303c6a2d9b29662309696023722cb183223cf92cc946d6a7349269292b5ea5d538a1acd75688b7d20a9ec301990e7551513dc6edcf0c38ce84170ed947aca9381bf4f9958220bc83589669a23335c9101054330477e750289fe559ed84ea0003e0ed8be038202284c82b593d480ff0fe2eefebc1af73fb9be1c3a550e866323ce168ceb84a65550caa45e211b3ba185862d37e0c56e88eac60302fa36d45acc16b4133c1ab27434d274b184c2df114d14ee32dc4e10617e08d38080ec77f9b34c42e30973293c2340470308d18c2798a7e409c3f5e3db54bd304f483a561e151ccb70f47902900327cf33557a8297d95cc148ec31d4df7d319d0b4532c9cd7ded09e75d98ea038e5eb63eed092cfdd14b16039bd530a73d01b24ee0dcf2ee89e8fe181e1b2570fcc32a5b6e0af0c127706bb74821fc44a3dce2893d215a35c69ae3e10ae0cb7d5bfcb2d9971ff4b46c648b9e1a501398c450ecd3a402df1f70fc84747a0458cbb24437f5850b1c1d080263c71aeabd36f489869be41324f6877f07ab2a16436cfbd28643dee800d627e8512f41716ec08a042f6808d87b31d669f2694eb3b095aa990041fee808e627be4a368153f4bda3d021166f78c64b34e329c2c6d89f88cb872ab17f50fb5407adcc412f385ff9ee9d689f1c043652d300000504a0b609335c8ef8e5848e7288abcf5870c800a02808d4a0ae1f1ff3e9f54407a0a06d7f3f13686dc240a230aef849d8d74e0814fea3f067e160831f68874330cc74080afa459a6cbbd51620b9081c0709c08b9452c20bf60629eb12212c28aec9e623fd19b53238280af794177d507c04f719f99a44284cc6560985ba2f16d15128b8e9f4caf30a05c43bdde726648ff68e1f4b5c919a647baba9225a4b08f06d3026d2805522c59ac384ca07f37839978aa1e0b7fbe6891a6f9f83c5404f30df52c75303a6edf4c40ead230935e81dbb280eacb8fc85cdd2c10b52e79793f0c00dba10f109f5cc16dd012e75d9dcc2283eb580c1c9de28ce670c9466c9488fd427b4a8d2ec04bd1394e8bc365b8c8f1f88238b16032c02b7348ad976eb1ab1e4272266151015005c334fe2e5275c22379adf6db7fe4f22072ee1c5ff24a13d7bcde41526d25c148e9580775c3f41a2d7e1e003b02ea595a87f82ff8cc39f35817528931f10800271e222cffad4efcdb17d846b4cf40fc2d39cc23fe417de4713d84bc4ce213de6bcd95b3701018a6199de7980c234ef352548940dc1de4f648b2c875efd24e09fa819c766542350dc2ba434ce7e3e836276addf8036ef611a68c207453fa3f60a330d651477f52d967daf67221497b301169e3942d25d3a483303190a7557c59574ed4dd966a7f24da7d8631747c2af733b616dcd8aecd1273c1b6e6351ba39059baab28f3c4215961a06162c0bd799a20e424da8b867a4c70bab8fa4686152ac6574c939b00f21361c140892c1254f584f4e8065f7ae4b1d845ed71aeb7c5b35089286c293edb4066a8409e45aa22442ad0963c0df0dc26f1efee3a273357ebd373f1353b5bf5011a785a42f45632d9c52fb1bcc20922dfcc046c6aef131fdd053f4287c03c97d0bbb85d35dc592b14a5cd8d4bbdcca85ddfece736dfc0509e20aa64b26f3d220847cef7c57641bfea17930e6a91641f521b12af3594155c201d0911459ba9211c60ef2b2bf4f2baea8563fda690ecbb4da0b76b2c80e7228b008566929a71609381b07b6fc801228a1b16beb8efc55f35727a7c182359d44b51c348903984fd7aa85439f0e96a246b5c80007201d06fee2e936f461c7910b43c8199f9e13ec283acf90d10beb67973d413575f98d84ac57afba17160ade6f100d2c1c7d8f6b3c741f4b25cec964105de11da5b4b802965f5a894a39bfff4ad89749bf307dc982aeb31b6ffdac96b0269004de658b35c8a390d42a0f6e25f14618d68db93b88deeefafa786b6198eac8e3ec91a00d842bf7913e0fd4e4b5a1bd89611704643d537318beb8c5696081deaf2c25763e1724df38a0fc347edbba245907f9e6a393fd51685ed1f57a76f88281f15343a67988cb60a43d9740f48291e50669bdea2abd05370963c31f46aa89391cd84ea64785f83c4551be48ec94c8a3f66d241ba5805a1e2df8c12e2d4e1b16653ed1e766f94d8d8ac4fc0fad1935d0128b1db10a7ab4caf13511a0e7328c88ec5bca68588c7be3289986639c2a23e1354d9171b9ade61448c6118a4112e0304b6235336dc3cf19ff00a38acfc4b9421c812fc75f957770d4691ebbcb8f8f3701393f3d1c237af75a5f2c5a60073ec78d10fbde0566a87ccade4d09ed20c03813d47cbb16eb0612fafef769fc0b5d6f6e5ff8bde4d635f26efc8f073b9065be9ced78e9a91480e1471c10de8244c588b0b5e99baf54364cbc77b8dec9298ecccda4bb23b5853000bf1e17d78f4d1acc8ebec81a547ffc1405efaa1e29ae2640842bc36fd546bb9848c7253cacbc2f3c6d57575dc03969c07103bb85d86623dd8a05f12f1b4ac613adc7bce2f41c54826fbdebaa919e321359fa5faba563ac2031c814ed0dc5f84c614ff54f735f1cd496e86c790e81e96ccc1d2353fd34fd15436cfdff5941189de3086efa3ea9f89253c86de8b58b1fca61022ca710dd1d3435f08368d654360c87eb3985b47d89e2364cefee992f11c0d5eaa899451202f725a04bff122bf0d434247de7737f01d5cbbec44ec044b78e76e32ef09dd357827702772c0ef71ec793104599476ffbd18e2d836bdf5fa3247e8d3e086ef6626bc1c799cf5ff4c6d5cbaae8fd6c754938ad8c8c1c48d68ffd382f9e5876f6e0d8f461dd4c8c51726ea940bb23aeed938ba60f813c2e28d2c9994df90ec0f94f94992f0d4ac512a9f581bf19c933d92ae694b6bb0d6c2fb4e53608a408e6b9f53327695b09102b9c091c0c6af541cb43ae0fdbb4812ac5ab44888449891070db2cae0f4ed1245fcc7b2687545385fb0fae0f4177ee3beb94b61108256eb6f6fab0486d257ecc1ad6de3e6ede77dd67f6689ca5db3912e760d8781766f5067a4b0149c8a83e3c8485e891d9c774f891b0062d6a96dbf11bd47282ede0035de69aa925c787ff9d8b197419d79f6e1b67cc812fbbdd45ed6672e5039478042b6c38f8eb77d8016b88886bb0e7aae4b1a6441fd6704051501f4028d71f99b9b30b9427223e5dd2482d43a970426094c2562ad4a5ba5b2f1941cdc2125371070e9cfb1e4e2744028c1d0f626374a1d1420caa2fe90cb1bd0df1d2693e2e129ceb96aa6f9a089283a07dfe8c684c985807836bdbefa487fdb52bf1b5a824d59b1e055da7977479865094f0413fa897d09dfcbc37f4086c9f2a96c3a5b62ef6514c35e1ce916b27f86b2a267d6b245e10c93109d7e70773cc89180651a7acb3031ca2048e4084fb0e551040b46e7314384e028dcf85d7e8c9c65b87627834c4c22de9ebc65d61161a434a60943c4a7ac61c2e5e8ce72e28b60ed176dfe5a01be333599cedb6efb363e8e7d6a3fca401e0b83fd2dfdb46cbc6eede528adc01c90e940e620fe6efb104d247b01f892a3076d0feae90a3b747b0e7bf5be717b66e33ab63c71246a221bd7b85481fd2443f450cf4ad7d05528fa4fe79b2fdf977dcfe65febdc35059483b066a22bca4d38eb9037049fb0bda65902a71a45fdfe17d12c8424531ec9885f0f95bd96b24e1cc4263c629c2b02fdefad145688cdd8c5a6b74a61be9e4ee4cd314af2f0c785501bb6d7d408f8fbef592e9794cbfd04cebdac3e34e5d7b649bf6f898c3dd762ffb226ab0f3d80671fa0d9e1cf7cea8a31d38f616e807a1028a491d3f7d1c6d7dda37bf8e6b261cd9eeed2fc6be5b103a7e3ae913385bfda283ddb61b4ed744aeba8e03dcbe28e03da2e8db816b7f35d36f742437fb76d0c2b0c74da4d3b56a4bb6ef0b74b4744e1d4fc794145183318fe925eca306feab1d06942449dfba498f28a9f7e96faa99c611254160eff1d1dfb44575d6b9d5e3267550ad73eef4d2fa801e475defb0ffec52f7d9ad4eee3e8fe5da97d5651b4992a4cd76ba8d1c9df45647bff8c956c7512f9d743485d2479b93b676c3e9a3eb1f77240943ce659ffabacb6f2e7bc0e820745ad5cf5505751cc99174750cdd8de49fe59f32f87202a4a32d0c399795bb57fdf1c956bfc023e871247359e68d9ec732ef0536c24f6aa6dfa38f71e0cb639a098f583369262e1e0464a629cb9acec29b5e3a499a28904e65e1492f83580811f42428d5d1f19d75c6b47db1b97b43bca9a3433e004551f0a89f6f880f8fb6afe963baba364995f475b7730715c62ca4f380146d5ff675da102178d0ac63f01cc0694b0c8fd6475a63ce99cc4e92635026c72cb4f3d067350bf160f1594a82ab649050e67918ca3cf3749dd6c35090c9e3e72e092759341e3dd67aab23e9d904dd8e59882c5a776bb6bacd83c599653da82cd992f4d24b375dafe490071df40a39e9261d33c08e5a64bc3e6ba501aeceaef081edb1dd4cf5a4817d45bc2981214d54a47dfb51e6e1d7bedd019968744f2f3d3d4bf25f1afc4afef67347bef6d345fca992786d3794ecaef4db2e75db4ef59edd4ab25968f3d0f95e31c0fa7c3e9fabd318f8b0822e62a8b15cd5d4b7bf208326e2c0754e13f58d0112a0a06d41fbf9837dd9d736cfbc0d2890da4911bf1d28f336902ee2c9f6c5bab6055de66d40816c5fedeccdb7f778caee7a762db08e02f259df381f49ef695b607728209ff5771c7b106c4b822c3462f25bd0443adfce6add8ed51d760febec06d6d916c4ade5a1f3edf3fdf82de40e3b77e8d9bd1cac6d5d5b0c55ee70d3f6f9615677688104280841e27e7c723c3bac8edd8d7edb79cf0e97fe3d44b4102371438cd39119d2dced3268221140be9c24819969e26388bbbd054d24a2070bb2a52aa7366584ee38c6e9885816251d6bbab8dbd39c7b5647b62de06071548ba17a9c0df2f0b4ac937eea60df71eca1a2b290dbfcc5509fc3bf153491eeeb04fdac9300053beccb1809ff32567a4177d8bec7afd7bf027b6b6ded9985cad8d33760800307a23bd86d5841e7bab606d8d5b90837c52cb97724d8a16017220b6dd7ed5e9001fb7e4a596874755fb62de8d831164bed6c51bfb0d8dfece7b9fd35fdf41397455968f4b22cfd2ccbb22447ddbe3a5d1661e2fc86f453c47b74f4a78f2311d921e7efeec953e5719d6b47bdd38e1ad7da76f8dd4f37fdd5d97665f69383c75eee421c7ddef808f7d3da61cb3bc5f6f0dac7536b131c00818cb3eff3cf37219f9aa83705387618836387f1a5c60ee3bfbade14e1d8611c8b6172fe14e39c333e21e728bdf3ab18e30dbb1df3b32dd273ebb1051a07907d6f8cbdd48e53bd3b737bee733cc9582c82c49a491adf18f462a02e038d2590e7878d5f38c735f24f13f20ebfce0ebf34f892cce7ee1581821059082be50e18333d76dfcfec31761464de6e59f01099a75b1ea863ffa08920f095b59c5439ddc8c2f5a5848bbd08bb0b6120119d21708ee110458f71765dce243e688cb11256c249f8f7012b8965df66f7264320602c41c7c90100e0ec19895e489d672c416597f2eec2e61734111e06d7f6d5ad6e6bf189822c84733e9fb0eff9fb7cc2be582abf37c0a3cecf0279c378a889f098ee80fd3cc7866f08768f3a1ed378c41aa322d096852c84dfb3c5632717f61df158c6658f33998b0290c44c080d3544928ab8d859ecbaecd3a121d56a6b82c66fa9d11455535507455da787ae6be92676157b398e2590bf55dc821a7ce9a60afadf14847a42eaaaab5968c8e21d88d5b16f0555281dabb87d41683fbd4c4b1440a0ae8351d7f134a3a5e355f57437fe5e51ac6a5f777a5c53546579f04b812249f224d95585d2c9f6253d2d5128492f77204ad7782541684f7d29b9dd72378e1d46a15c83d7e58e841263126335236529a0fc9a5cf0703ba8187679a1d4634b8edbc1cd1a2d4d846a5eac5c0f905ebc4043640a0b69673c27c54a4c195d55b8b5369be37cefdefd7bc43f6c649aaeb27e9e2be9e769ae0f383df5b42c7ded9527909765beedc6b7edd877ebec5e1527693fc911276125bd53d3f3cc6251ac74ae38e93cdbd724493f7767fe7327c3de8d8f93f00898245d072bfd78c3e538eacc6a2212ce68b8a93271a2cd0e114ad620ad05e3ac10b3e58e3ee2b2119f71f215452dd547b9e5b1f5e8e31e473dfac88eae1b7d1cfd1c7d0c1a75c655f250cf90973ef379a269fb9eaf49d2d5dd3876204bd2045227eb19f4cb02d12d9b85729b33cbf2e894582c06803388c743f0a010427010da838402e0da7300028085847090ceba1db463936c1648e70108b31a687ff691b11a3aa740018dd0303025cfced0967c4c5098a698884c52317c4c6d98d298c6309131813175310d99aa967c4bbea5dfd2d25253d25a8bab163d5a0c5b045bacb5486b31a605590bb0165d2da0b410b6984a5a4b5a53e153f153b164022d090dfb864955493a928449c024b4a43149644960495d495092ae92a4927a984033816662ed84efc40f8ff0fd5013b5444de441511371f81a4b40c5328f1dcbbc5b59e6d9cc326f3dcb3c154d1301ad615f18d81ba14f48aef98d1031c6e713e1f3f97c3e9f0bec4b31676d4eda1be16ba7819006431a1069505c437ced31fc62588aa12906600c50310463888a412a06aa1884310cd73cbdf6187494680d6448f3adc5e02bcb1461000506533020c2406a8d4f4d1b35696ac6a8215303a6a64bcd504d559aefb5b7c0d7825f0b965ad074b6f4da4114417c8118036106e20c041a0835106b20e084f085f869a20d65cabc76106346a39437c633e39df1d0786b9907270b69185e08434403c1e3a965a2231bb983d6444668249c2c8f6884666eb226102ede362096deb532c4325765aaca4c95e951464719a732bf3223c2105fbb098826289ae0cb0463645fafdd852617802e045d907281ca05a10b562e0c5dd07281e842918cc86b77618ab7658a35b500d6c2550b5f2d0cc996c852908d186b33963636668c6cac380645ace9b5b3d0c40290856053160206a38ea48e844630e8de4867b746686318d1cc03440f143df0e58131b125b19f982f6c2d8c18e3e7d4e554e5547412d2f8d118e1d4c629cd698c1399139813d1e92ac62fc62fc6528ca6184038702ae02ba2a1ada0b6c2d80a652b8c49f9da5ae16b85155658a1582c168bc562b128e5ebb5a7f095c2580a296c1573ec3085610a5a3c3829542950a5203492322a1a89198d19957d197df188463518a58d46a98f25a0ec0d4ee6d9326f557f9a08c868cb4868343422e66882fa412d41353d41799a7a223e493db5794a7b1af344f604f6d4f5347caacad194a3a900430f52bc216f0402c6f07c0830e3097953bc1e3c1d3c279e0b5e0a04ac2120ad00c3d75e8061018805287a307bed1ea43c083d0c3d6879207ad8f250f4e0e5e1cbc39887acd7eee18ab7f5c5fb0a2168b64d1e82228c11a14b0433118a1e801e9c3cb8f090c2c30811da889026c298086021045f7b08c110a44210b6c5d7de36b5c036d846b5522d552b6cadda614b6c7fbcf6b6078fc823f28a3c2fde16afc8fb32a2e211330f1319a9a9b83542e3f06b7fedd20eca6e6a47dc49b5be5d9b5dda6ecc8e6c07b6ebda0d77551c7eaf9dc38fc312872623aa8c00a1d1d0d4f18847411e1e70c0612c0145ca3c36f36eb6556dd2444047255efbd10823aa5c6b246594230ad2f938f880ae807a000d8182406b4069406380c880c080ba80a0000981a674bed7aef3e97eba25a32fa32f232a23a1919591119ad46b1ef148ca071ff98e7e474a474b474c474d47368e8047c12315affd28859198d1d7cedacfd54f8f9fe14ff067ed27ed67cc0fd90fd84fd70f941fe1cfd4ceda6bdf59cbf972bfdc128fb863b673b663466329872fc72fc7128e2b1c3d700c710471ace148c3310607190e301c5d38a0e010e298a2b14463c9895404da44802c026b1118931294a2438a9314175252481911052dca9813a44e109e303c81c8dbe2118d784423b5cc538da8cc8cd454b1af31339c136e04ae09e72b42c15de1aa7053b81e381db8255c0a3333b1b1a2579168a4665a11d51469ea0f4d1daa55ea94da43d5a13aa92e545f1b22b1f8655a994323291ed188ca48ca08cd08ce91efe877a464b4663699359ccca6b104f46606cd28538a47cc4bad07e555d9a31c96c1b5b43164605d50ca29ed3c293c28798947e46df18a3c2fde174f8c37c6212319a919a1adadc159d31df4d10f4bd003521e107a60d881b40e807500ad035f61c1301d614e612ec252848dd0d2468b9916322cc1d7ae81a006a43420d4c0d008cd68edc877b474c474f4d31dfdba7e1af8696049034d1a006a000acbd36bd7808e0c40c9c05406881990c2e2bbd2e64ada953157c8ae805de9ba32bc52d5f57bed15f85560a9024d4668466a47bea3dfd1d2918d23a0d1da51d30cf635427bed27fc4e583aa1e904e0095027044f88ca3c9b93a7d77e828eb107a537d523f6a49cf89ab46992d6644c13b226604dba9a0c9b545df95efbfbfef74bdf14c26ec72362a05100dc844ce4d3444744bf7f7147bed76e8466b436aebd8ebf38b4d750c0157c2972f020003b3e3fec0d07007248123551083eba188d2840c423681fb9a23c01733e16a00be9fb220e85521d5074f09995f160e71c5a10886753163a6b989d6546101272d7e94eb4142b29655ee9441ee45c8e5c5614b01a92598a025214a02a3519fb8e5c501480a24070ef7884e0e92e051b2934a5b09482520abf2c9402520abe2c04676d1c001a100b8c2e50080ec20e89839f38dd206f773f9d1bd47a10148136e30835d43e02696f5efb7bca781dfc65ef0b5c9e4c49922449c740d6a417c178f2e8c9e2934132e8e3c4ce93a48fe4487c92b4ca5a6350af4113ba7713ea34d864931796b046d69b3e8326d37419ac3d3343a944477228e088d86f9761c720f88505842322675ffa2eb1a8ac5e60152133c432f2e54b8f61ed95fb9666780506308cfd4c19c69a4c7953448d0b944dce7852345990a6ab69cac709206d4a47dbb444cbd27cc1da335db0f6c82dbfb7b760eded72005a24d2c8c92135c31653c6931fc921ca090d5147865b62bc603a0bd69e89b5e1495f0126b17015bbc0a95202c68afb0e7d0c2763ce9d0b1323d0bc706521e3eebdb70a42600d717a9274107bccf2ad610dd7b069d3c57d8750ccf4640d2982ca468d1e6b5dd272aca56f0aa0ecf88d3555fced2860d3bdd7545151668615901767dc7748fb7c3e5f93bbf7dea8efbd318cdf7b6f134b50107dd010264b89bb374edb972c8e45ee90b3e3399e60ed6dd44d80d1d583de4dfe1dbdc4be1ccbc6b32fd77284c3e15f8c8495be7c3113b681a14a1f5f4cf565f15f6cf5a583f9b2f493d5b9d010992fbdc80408ac0084cd97fea1051e5f3a0a5e98fad265885ae20b62f543fb120b480d5f3a6e0206010b0a0122f5fbd2b130f3462ca92a5f7a0986e446492117bb37dabe6491043f9e9ef44dfa0850d2a888d44a031b5c2f7c70b508e3856c471160f988f37bbb0b9b84271a6b6ce85082638d68bb255ba40c5be44a9221d20fcb9a310b957de92d6c32a83be0a0d0e64036f760f3216df371ec6dbe336f7d9bcd96adac54f902820221cbc6131a5937ceb270687de921182222009a5b3a083e50a48932b02a898ed92e03491265e10a10912727ab8695dfee0194c471e6244e8a164a3f182f86e8d01ec468bcc0f1e3cb981930dae6607b3e263b7066d1007260eded20192c8bacf9a0f5d5e3f7570dbf7d033a226938c862058b0670018680e960d449220016ae33cb0cbf3d03ec991d068eaa4e2c2f7efb0558a9ad2937bcbcd69ebc294b175f1a79f3e5cf9753d4588971c38a192c4132c8b2a59f1660aff812f0db2b5024a967052f2a153ea802da12d0e5cb0f2ca016293e0a78a51061023ad214b3126604560a3857487cc855594a60ac430a45a2ac11b0221442a14a8b03130246fff254916280df7eb255e2fcf607e8cca32a4c503b904c759992814b46a288f88d555923d285c690346e5982b12f49249bca13c862579bdf3d54841e566094c8a223ab0a520b2c22d80185ca8a9a2e53c0b86589b2a4796b4fa1ad7dcfb47d59b47d750ec8c24c845dec7908f4bb28e5b7027e77fd7ebbae8becb737c049730391a2c182491107188baa142a111a70d814677c49b95644288ef832ca977eb23a17fa2115d08449f9d1c005c77085f087cf0dbc504152638d94902813d6dee6010a12818a0c302a6818409a213cdd664022caf7e49b9264b6001e11a614406b8a12ae26ae325fba02867ae85082e6cd1ba5264f949a54016353fba1f6e557862a4e9329f9b1ca0314b47585e808ef0d48b0547cf912464b6cef8d553cd1797971ad2901e6c9d2d658c2d78630ddbf244031b2250a8c2f9d8d52e64bd7b994135fba90142f5ffad096922fdda888480a0ebef4736f5e09bb254ef9fd040ad36f4f00696e610a1e5c8489318a7e3bd1da0b40190d64c88993860b88c2086f4df14409f1f7db1160840c6eefed24acbdedc108f62fd097414da4b23841e164062d2772bef4039026086a7a4c03e85011c3c22ac39285442b2b4beb85d6992fbd00a419228a4a0e352a2f59ba60e04309b74cd2daf0250b3628bc5058d991028593c12c84a5487fc92019454a99ed4b1687a404fdcbf3fbaac66f2dbfafd4fcc61afef61174a494b96548a281e5a5081a938abdc7f6de297e53057f6f30402f6133d024c19ae16e6fc16c4929324866e026c0feca6db9692d49f365152d265a36b48642b4ae94bef4010c0549a9cc1bb799de6659abe8f3f94cb86fa6ca56afb3526e02bef637dbf0e0dffc66e0eb1c7c928884bdbe5e8f4f6a9030ffc565bf7ff1da2867a987da8c21968d32f7c5662cdc9421f65063668a97fb6234ad4c9481c0ad17dbc0c119afffc55128fec54318a02842f932b6c58612f7c55214981305498f35244b46dc170b5f3b56ca4464f0c54caf5f7832aad9fec5d8f7986c7a8388c85fee80bd48cceb7f8f5e9f781135780821110c4225ca0df71d872b38a3a695020d95b020eed46b13af9798c9a1e50b0d2f2e4c6e0e1c33bcc2b85cc15283fbb2afd75e956b0be8dfa02fc70cbf2cfd64c790f9d27564845fba9741fad23d08edb5fcf8f79a51decac431393edd7dea02587ba98f1d9bdcb0f1192a03cdae3c8af5a877587b28cb7e3a42162c9f5bba101bf592548f5d4c9a374d3400db4626a1c42879013ce90038d557dfdc239190cfe72331f4f95c8ce6f37de9414a9928037507fc0b13e73709bf1d84b5b7819a882496196876cec9429de2e3d3f5953d24b732af6ccb76030aa8e943fa7692a7c777bb0185bde39b55bd6c37a0507aea69fbae5eba8847db9703d7b988374d3388a22810dde1379b7eefde9bdbbcdcbda8a7cec14eb77b7d7c5ce7a98f8fcfd2fef9fcfcb8ced39f9f9fb5d7e9d01eff8f99ee807fef2271d82394c2cf83f39ca7381c4e0373b99c6ecaedf0e3f492ee70bb8d3ddeb1d96c5fcfa6b7db6d0d87c3a13dfe9b19bbc36f1bbbddbebea83b609b2d136fb75b1ede56c8421445f52f4d53ed4b77f851922475da777f99a659d41d705a96e5268200020820b47ba83b6037216ffc798bdd15cd3451069e9f1556048ac8d41232f765bf442a92033756818344e2cc8a245c36dc121c87a1f20106aaa8851d79e29bb3568208d1c634e2499293b03221353c080384c349c2c8101dd0da2b771e8c5696d71ea6c66bdfc07220b2a387081c37464600d1422207e30ed238008112152927a4a03892e6be6c5992f8924ac5973b5fd69822d3c52a0b1630c511e31274b8cc86f61f2dc247d3912548b4381d5972dfa124ec99d7f37a441336afdd01acd67ae2610584098c8c26576b9fb5a77b00307a7525607c8facfc3b6a0d4bef22e64b285263577a90b9f9d287aebc10f992e24b8740e68d575fc4be749eb5571e41c962ae4bd50e0aae88bcb1421b51430ef7654ba211cde7f3a170b5d6d8f7bacb6beda7261231834a092251acb6a810bada5b20356eed69f5e521e15fa02029ff7a7806fca824f4a59f2cd5d596375fba972e24e4cb2b2e6ebe74b66874c2a5224b991f41920899e3640e91b20339c6743102a6c4570b5cfae9861dffcdc29b58f1e8b5db76cf9139e8977e8a5101bdf695bc1272a2fcd24f5eab86a571814a19204d4a465c084170326525899a280b85588b258399376e173baa13f644e5b59f9bb4f53c01c28a58a123ec4a08168f3852dc36a49b7102f0dacb232c90d75b441293a42157aa28d52033ca191295eabcc1a221560c83b302b31196c2a21615ed6bdf39ab205f86c51f9299fbb259977936e10ddb977e0ae5e086cac1352c49dc4280d7ae8322f845ad157f4045a5b9afee4b28266a9ea0ac50d560e6be435f96fe21970e014d44127507ec65e9fb8cf3a51765de0887376639f9617ee9ac26124124ac4d590932272d2cee6826a8b58663e9cc8b19b76cdf10a3d9936d0e026b60c7df47d8370b1ffb4b12b350fbce7fb3f0cd429cc75e84cfe7f3a1e5077bfa125e6760263a5dec39c8e37b13adcd1bd826f58129fdd8c2c04bb5e3ac3759aae6a96a54d5aa4ed5264d3a30c6ea7a02767c93cad05aebd5e6f36393269f4d254992b4dd7ec698a669de58109cb0aa8e8e8e0e8b43ad706a9aa6296ea7c90c233beabaaeeb4e6e672ba7de6eb75b8ea74915303c2a0e87c3f1f4f4a8b95c2ed7e3839bc147ede9e9e9f1f971d364868d1f55ef9acc58f221a1aaaaaab626688c5f11375bdb02fdb717ef6057b3ab6ab6b9cdf1288673fbda72fe6053559babb69d9a3fa81f326fe743e6253956cabcec3b9e596c75fb9085f04d6dd91f4777aba7375384fac166fb60b37db0d93ed86c1f6cb60f369b4ece6f6eb3f9abe336d4b5efd8bc6737e60ebefaf69be3706e730c83d6aaefec704dac6e61c8ad37dfc1be7fb720d0ada2ae92ed8ebf3aed4efb8e62afaa690b02f54dfebee150aca2369b9b904db7edb2af3b14f5d4d5ddd9beeaabaaa33dbeee52dfe82ee5397d549d8fea3c3b1fef39016d531f95c777a8a7e7ee55ff749edd3eb54dc7b57fc837d82276f27a42f5bd49b3ec0043081586102a5a9b71003a4631ada494f4fb90a444b6aace26de454eb27d73cea39ba52635d63af3f24d44897393b488b1f64de467d01a1e81d56ddbc4ca12c9e3f9478a1def46605f96270be1a1ad8e4facbcf0b3517dac2788287b6ce6eea52d03ef76d36edabbdca4937b37a5e70e76c309fbb3e72f1a774238d8a3ecf9ec0ad221528ccb4d92eb6e7998a67eec3aec23f6731c6616e9f6b13dc9b0d97958f5f4726c5ff36ccff10d71f4d8c78d94e2f42cc733937abfdaf156dffda71b56bf1863fce2b625c2ae97d1f7e8a4de95dbc4671996e521db078c3f7af60d637b92588bc56359fac6f86cf70a9c7d3c11300e60f41d1936bb2802de787e7cd53f1d9f68589e4de70c8b5f47476748c7795ceb5c73e03e400ef4816fe0e01e68ade35a3b07b4a2a3acf559551dddbd303c8ad176c38feff6dda0c2ea7ac34f8b821e1f86c7fea28ec3dbb50aaaa3aed7b5ddf0d3a2a0b6633b6aefd9bde807ae7ee0bac535dd54adfab85200ff07ef76b5c535b1bb0df181eb16c407aeb62038b8f610eaeb3684fa40ee41073aae390071e0acebf6ddd04107ac8f0f073e1cf8f8f86cd44d1fd79b031f67ddf471bdd1f6657db0d6399bf54ed7bea42649edac939ad4e71956c7b1eb38c63acea383eac0f0f8c7c74ce48e551fc7bb37848aee62d83a7bef5015f6569ddc6935ef38ea1bb72aaa43b62154add309a17e0cf8758a8e4e1d1364785d83478b483fd2aed5dd96615531b9499e3f8b8e727a8e42a4fac2b0d1b5a7339e32eced41dea9f2c1671652d7194a697aed3a26f651f7eaec3505eda9eb386a8eae4ec7b5e3d5d42b0aa783d071ede959967fbe3750619f3e1f0cbadf9f5d0705bd8b217f0bf41c387ffafe6c5d703a0ce79b6f9e90b7ad05fa753a783da1d4b51bceccdb70b62dc0bfdd05f8b763cfceea5e9ed1c9d89993b1b357591db9231d83d6747cf83712bd30820d36b3cfafedec438c25308e582d4141745fdb8f069c2757487c0d8bb8af6dc9032a325654217265aa87fbdabe8064bad63401b3f6c47d6dc1cf6763ce586d714194e3be3621092b21616cdaa05081c47d6dc32d6b9c2d8ffd5de77c5edff52caf6a53d4296a9ca25a54d7a81529cbbf6b13967f57a995987d5dd7b129e0131e494dbaacdc77fd81a0861231be668ca989b9efba8404eb08d9d4308b86fbae45d43c81616669c70c33f75d839f5f158e92394ad238c3f44dd7fe2a8a95273c68480169b8afea9209620644f8e66c8afbaabe62941226488208bddc5705d261e60dd89a2b2aacdc57950015176ccab0789296e5be2a1a2a44b880635fc430b9afaaaaead9ab9a5df957257afdab5af9576dfaac227d76d5c8e77f533855fe4dbbfe4d8bffa6c5ccc379f634154bcbded42cf5800c234d23b8b8c12273df74441b1627be90886255c47dd3a5cf6748f4588224756586fba6469250658902e3a3ea8afba6c1f40dd1050b376a822bdc37155e00ce0f2f1d5e96c45972df7408040582eafe45a550d487a2288aa251fe45cdd01b3a37747efed501eabc3a3ea4261d1d9db157c7ecb3ce195e71e215e77b2e9d6b54fe3db9fe3da7fc7b9ee779e53c6b000b2b645c31da1039e3bee72fa844921b289646086bb8efb944a34c091c535280d090e5be2770e78794549727301762dcf784424364499517323426f73d850470412287991740886bdcf7b48119c7ec314ddfd6bfa6947fcd286f9ae698d8bfa6d967f3ecf398366861bea031a9b9aff9c24594b53044660051b8afb9c49615418283acc4d9cf7d4de027b95264ca92209034ee6b067f3069438314304cbab856b864d1c205cdcb54d17dcda10aca38664a9e7f4b382f945bc80f90715a204b1f529354497c4bb3cf65598e3d09e7a7cc99c08ef35977b000961725292b314f90b82f69e6cae7432d46d71c28ee4b06bfec6f9ea16412e9b393be7f379ccfbe7d48c47f77d3937fb793dfc5ccf3da62bb2cef331aace950b29586e9898cfbee9f8dad281b4b4cbce9f2c37df7d20d967cd912e58caa489a3c65e28d9ab3311beebb856059356a84a50073c47db7b048ca92124e5439d4c870df3d548056c09ccfaf866382eea07d4dfed54d529af8d9b51e73f1fa2c090bd18aaac758940bf7d526c8a4d198aa121699b8af5e1ac038429c01ccf90c67280fad71786cc4611c01fb8be37cf69c7d485affe6a6cf63b12c9f7df6ece5be59ac040c1ac3112faa646471dffc4b1206090d4fba24c9e285e1fc9ccf6e83d1681d47c09e650081028525ec8bca95018590a935412f6445f7c54b2cb446ecd8f242d504ca7d3110c650068da92f43d8fc5c112baa6698620226c9cf2acbe092da7aa2016688fbe2211efb71888b9ae874cf5e6c96f52f26623dbefa17377df6f1c0d96b309630ee2166f279c9679d9d854cb4ddec24404188cc2b7f015fd0789c2043830d2454542c11cd44f1a8e185eb9a88835f9107d50835234ab8aa47d814928f1e5cee2bd441c789af331e63b4c4b8673f86545352bf35306e5013e5a5545309bf740d9589b2906d75548fbf198ef67de9fa17468656d240bda49bbe2489254f49fcd2735148f632fb2a3d5301cbb22c5bf36596ca400c276d8365593a1e83c2656b666899886c2acbb2fcf2f4a5ad2ccbf257fe4ab6f4420557966b6ba50fe9a226a9513623da6669bef45d9665590a7fc02c791f1fcf3bd69e8fd0e747e8e359c7daf311fa8069f13d3d9e816baf47d8e3d30acdeff19c63edf5bc39aa6cea79783ce3587b3c3c3d3ac5d8f378beb1f678783ef857fd32f5aa6fb5cc840d962cf2bceab9c6da5349282f63bfb3e399c6dadb21aa3c44d5b3930a968e15c1c87a7ceaac17124dba74061c1249ceb3be59cf32d61ecb131523c63edb6a8fb1ba58fdba7a665a7b6b3bb2679afae919c60b3dcc4b136063a28c09e1982a5956acc4090b7604524a61c66ad8e89a725dacbd72f5bcb4f656b12c1b823c882509db22e3d32d693e751d17289fba0b71296b3134b2f18df81a86a91871e6be3ad6ea49161c952231b0820061f202e3962ea4aa2cc0b40469a911a6650d561815b11e2bd271ec2c8d52928921625adc77484d6224e741901840ac387153652a4dd354895401c6e555d573d299aa1598b126ec09963953e420a1ea82ae4129aaa9311c5f4bd45d0eaa2a9b0500f435e353dfa99f5f643e755607c6f4730c90501ca264c3861a9b2cee3bf46c555a49e549c789b42fa8b419ae103c4491020565d9f16996e2a7aef31342eace0a65709c883d5949912665854fa09845714c10a932f64bb2c4574fd555dd695fb2984db09e91f095355f58b83ef55c82dd614bf06438d505e6b7634c3aaa47aad0f12bcc942026e4a4e151636765db972c6612aae7116b4f2d4a87b0bca83ef59dfac9e253ac2b4e3ef5ecf369a26db6eebdb3d2f6dc34e6370719b8f7ded96350bf7ff6de1bb8819bdd7b84daefbdf7defb05a7dfe8de7befd4c7619194df3b7befede3b7efbdf7de7b8d675d817ef531c9afbe330f01bfae25d07e4572f2abe3396b6f5d79d0255ec8b8ebea58ceda5bf7da4a54795e057a55ceabaa4a22caab256cbcea38ceda53db9175756dd33499c2e4aaaa63386b4fcd518fb1463cfdce8ee3376b6fc7cdda53492adf966759c76d4e75f5571dafad3d559df22507c9975772c65ccd3182e563c186cc3155640d4b12d55fcaf3e9964f7da77ea6cea6646a5c4ddb51e64c8dad61eded354519346e9a468c11ca488d38c1b106914141dcc2e48a07107555cba6346b2fbd823304a7adbd5dae2888d92282468596101f4e8b381962f2a6a00181f185cb8d1377555fec118df8affac6e9b7effd860c1a164da33d465114dd289aa5047c144551948812511455f1f5e88a1aa140d48150218fa68fa23ea2a8555601e653a34f1d9f597b693055dbd4b199b597f22421f9ed7b67a96871b64929528509202e03dc954041feaf87df568a1d5f5ec5d19195222b2ba90519dd5a0d44c4c6b0666b0f6d52472f2be0745561c151d5c403f4a189b3c2c80f3923a62242064d67881a9f180d4090ec389bc10ca633493480d5c0e2aaa99830f9c7e3f7760c66eded9c0fe572392c1d323e97cbe5b255d6c2029e7d5976ee2b3ebe74fcc54bd1d8367d341d2b9966d9fbc29437cdf11dd7dec43e0c9826d9649aa617a579d3344d93abe94dd3f4d3b4ca1d0009e0df202c6ece28bf9dcd52f6fbebe9b76332a124f6cdc0e058ae01100de03345a2d400040740507b034c431a1e3ed70637687d5aac0c93cf05c141684d33168fad15c82e499c52d44418558bc366cb87e6fb053511b639a91265c9e7e23cf40db5266a22dde55545abe862d75f7a4c4a13194d193274b16fe19826ca71ac967cd8f75013ed146794f996b4d9f6a169a2d1fd2a06814d4bfb97a23c8ffaf87bd4379a75a5cba3588874d1edf4fced98cbdadb59aa10a9589961c58c97d616a1bd7d3eb1b0b5670639a42933c38b12387abc71331552668855e152c443a6ca90e3d06a45d28e186c4ee448e58015676821664b0b14d582826555a1e1cd2f56eac88bbdd32c6baf648365ed9922842819b1424606f0aa0c05374b92805c3394cdd926961242422571440d8c2ca41c236214d3c6ae845c3aaab470cb5407f16b341d5fc1595d5a07f0c24514498b1e2b6baf5c1b40955c074a6e8c80b22349131b34c89315b704bc100395038691b4146e172eae3df4ccb088ca9eb162499810152cba845e188173460d87922b268a81e0282b62cf4f0e94115d5e88a11213801cb0b01969a61479cac01c17ea792c214fd1c33348475b1b8d5a83a36cc916b51137cc1f46b4b0729a9861c3838d0a216129c652d65e69664b94cd8485061027572b7c1861d102cbcbabcd0c47a2c4714d338522c6736602ec8ccb6f67cd2021eacc9f1954c125675c2480b8ef500f311e11564945d0aab46ac05263344dd37ce2a40cd26fdfdbcb8c3561cde00b2bad2c32596f5e61a1228260553951920a626515b46db1696ed4b4b07e5451826ee9427bef6de22a93417134dc683a66e1912eaad9d83946c884cdf538c96285501345734b76ea58c9da4bbf80787470f5dbcce9b7632b74e7741120627912150624cd88fb0ea1297e8179687901ec0a9517ad20930fd3ccb52f594c82918879f1e8a38eabce9da24784262a3c8761d0da2378887138f780f3218df3d1cbe31e87c3e1ca2c25efdfa01343502069a108d3fa4519d96611aab5874b51ecc2091b1ccb1219b2f6d01323de9ce262db7b6f29ac6562ea4d21bb874619242c2b80a8c93169380244061e4ea68c70114b64d97b57397bd3b7e938c8da337166ca3e3163814461ad377fe0110d971b3482105183e3cc0c64daf0b8b121d625660d88d309b774a1bdf7c6953e8c50123db216528c1182072881a48286af1e547c4009d9ec78a02c480f30373c90d4521e2a162d9f30cb88165a23be90a82ad1a284151a86b0c6302945511305c5f4f4bb4896dfdba6a4e44994372c768cb97b9be89b852f509007dcbf477196be8c63458e903929b2e6707da9e5e3f1a5e319a4d2302d2d1e3d7c9cd528b36308d4c9ab3ad3f5e60c99912423c62540e197c70c105e9699a7bdf7de7befbd63ed6da07f83cabc004099236730b2cec8e800a61bd29662f0c032b5c602eb109e7d80e8a6048c32375ca070cb32059e00c8f22f39cc281f3482615ed0f8a801487543040e2d342c25c1aae1c40913c7d530f8fb065e42400b2b485840113266c97d75e688e21c719ebc39c72f42d2cc48197322c7855bba10ead8c6da43d1deacb1c71ca54419ad30af3452ee3bf429c6417686213bfb3a4b3286060c17d79640033bd9801242532ac21635c23940d254e1b2f78ddf47ccfcde33e87166e309a814f5e4ee6d9a7bc6dadb548268a4f11a2fb06a9061d99092619ae909411e69bf3844dcf4b031640e5a82994fcc101b6aac50a431769153192a349030b1203808bb5478b56218b843931a9713d60b769b5463d472efbd5d60f160699b585a421265294aaac6902ba39a14516dc8b828510a6b81d574e40316beb42ac85aa678055b84a186004c4f4a299123b832689aa90a9e176e3c80d1f4db7192ce3471a9cd060e8753a48e7ff805d89ba663146bcf1cb9a244b1b101c5c857138ddf4a7e6f235c6a8238a020414372f746cd749f587b9b674bd052182d2e862ebc5e4c7de9d884599215d1a2b683cd5ad7761ac2a4a7d868e262c3cb165f6a62a4adb5b4e3b7efedb8c40b631c1a6316d271918584c8c16fc7245ac0371fd231dcdb6df837df99a7fb9beb326fe86f4170b8c0bae2224b987b63ffe6d92af552c0bf411ec61b0b42cf7856807f47b5110ed28b99a0825c587a40f510e2a384968f218c2f5a3fd29098018956941c2d20424a6805d1a22564c8978e47acbd729358c4dabb6d1f5cd2c254a0614326d84455358ab189c3b446ac3a5104456f50b505b7511bb0bf1f264921292449b2ea0a470db19410071dfce824cb8fd7f9d14996afd2c598092e373eb23832be2c4b153db8d6accee8c05105b768c2ac93f67cfee8a4cbd2e9a4cbd2e318a42e3f4861f2d52093648c87174f13aeb19d18227c18b1522371e2868c1656bab44bc686265d53a95a5b0c2a56fd14a17a9a1459f8c0d9c94da8a0599b5061f21cfcd8840a963507d30cdea05851264823ad45667acd66c593a531c02940485ce960ecd6dbd3c53aaa205290d0d66918615874a90a13c529c378ed82cbab4a938d176478e510131e3a3a2d9ba48a4e2b091910944c53c9cf8c8f21942035a08c68f98b0ad470a1c609c890cd1a050899d3a54c890c8dcb7d75562b9ef4ad6555e349d2c5932429c249adc70f12619e54947049b224f7ce226a39591edb8f5a56c17f5912cb09d0d25ab8818115c46a4904700d912ba984d21726a42ea3ac547928258fe4444ca9e01ab17446ccf1266ab790ca2d48d0ca52a6844f0c8e26c09249dd7b6fb224778b12bf71bf63fcdea59b11b3e3131a88882962060a1434eeab6351a6c3c2cc5ac268850836866609973551eedee4d62ccbc342cbdb7e7cc262eb5f164573b3ac41969bdce47eb234e3b566eaf1fab5bbd63ec4ea96676b1e1e73a76b21e76f3f3e59fa6d49c700b0e4c96a12c601941aab9ad4a7a943a81b582df63d3ff3949bc79efbd4ece69d7bc792a77a964e9264098274f57cd53fbd34d9ed27cf0816bb4a7ab9ebf9dd8a1883b2b922d5578a6e43bac3e842ae1b7587a2888cb515d294b33e2971b5399cac4afa7baa3c58cefcc6c2e6cddf9be569a5cefd3c3add8f5758b0fccb1343c42f0d0e112d2ba0b20c61f10387ab858f27ac2d2c77f4f1045e983c65f9b2c4898bfbb2e38acd616dc657132462b8d828fd3d7ac7ad1fbd344974fe6678b1062c4b6b4bd55672cb4a22ac989c46245189d3a3696ff8d109590d5ffee8640e9122e938f2f6d6d928bb003f1ec7f4368e63d6e4b8c7716c37f6e1347393e5e9a697e41e578ce64d74bc522c195c252ec01317465efbd63f3f62c908f2ec8f58327068a56369b2faca4b6a6d423edd499234db575796255b6aad4fdd01ebe8f8d669472399cce4c8db24a93de7acdbd1842cc3c996379f79f8397eed2207aca089b63b92befd249f74275d48136d97f4219e1829f01c755007789a3a297688e64607786299224921cc66a273b7e35bf4fa157a8dc50496a4d7c3f4c7ab2b67fe65fdc432d339e3316434c38276ba179d7efa491c3b7d4ce7a79f5e2c3acf110d585454545454545474ee739f9bdd3af63cf51063218ccfed58086316bbb3ce6e21d6f1c96e1d3b14c4bb48c9d2d88f432ba9cfc0b104b2e8ba2d14cc27c6273e35debacce67cb21b3b3e4fa15dc4e2f3dc389f7b482774eaf6894fcc6276ebb60e6fa11dc445983df7b9c78dcf8dcf8dcf8dc7211eb2277beea1223f4fac6359f63c755bb7dd1de321a1a28db10e0bed21acdb434279abc593c57b2c9e45fb3c373ef1a76300581edf9b688f1d9b188df28804c58f38f8a363200dda04d98889329106c47df1f0031d39aa38ad41a1a136220902d7b40173c6c63804588c136c53a486fbe2a28a312795181dff34910c5555c4088770680c895edc2061a124cd1697d1e7f3ad705fbcf6a363b59c62f473f4712c1b73e545188b2e385fae08e1171227a62a24bad0e08e43e3589454530f315e595c0868a2f18b1a2ac0293db8e480b9a30a1c559eb2e658d1f1e502a90db921a746d6d50ceee818692c61ffb882a207b17aeaa3d7408617322fff7ef40f999751fc58e2c48fce8e4ca38f56525ffa2e5de5c93c0ebc745d260a79f89284b7880d518b387a7db979738e3abe960525e44b8c84999ab2a608bff4297110530dd7602d4cdce290c3a466f8eccb17ab655f1ba49fd207fe66a6a62f3d036b7c99a1de1c8ca2ca432fadad2fbdbe14fbd2f318922f79ca379b9d7d99d5b26f0c52ce5ffdcb5ae9cbb289915755cf69d69e7a75e473b95cce857e3c97f3221f9f5373d9444ee7b99c9af33197cb8d6d7e1011bb3107cd0c617227e0c2f5e4b554454b57aeccbf3c63b45431ff92f06af155dfaa8af5e3d52c19af66cd7955d5ca7ad5735a912eeb6aeb753a9dce339a9ffdcb33f62fd0ff3009fecfcf0f9332ff33ccf23f9ed1acbd9f3323da1ad2bb7b36b3f69ccd99f7f1799f8cf43eaafbf8e4dcc767c58822342c7141052485eb9356e4cd15941638c4e4783e07f4b935639fcbe5d8a0f81c1badcf793e535555f553f55c66eda9648a483c4992a407e9ce2c79d287fcc002e9244992a40fd38e24c91f271d6fb5244992248986e9dbd6f398b5d7b6237bfefcfcfcfc7836f3335ebfdb7916b3f676edc89e3e3e9ec3689d71f1ee9ec1ac3d5755555555555555cf656b4f3523f53adf3acf5fd69eae1dd93397eb008e1ac228526dc05ee4724f96e4129fcb79a076850cf1e78406939bf3ec65ede5c8d61e79a6e5f726f1db3dc84326daee76128aca7ee3f688dcdefe829adf5b65b201a565e6971b12b7b2d86f2635c0b83481a97283878b1f62b26c0102a35c167e352415bf7a84b1e2be23d1006b4a44454199b082b385bf7d7c7c7c7c3c8fad3d9f76641d0beac5abaada2597cbe572b95c2e97f3cc65ede5828abc9e7cd275e4599627fd243d6f597ba4d8dadb60ffc1079ec3d6de0743b6bea7a7a7a7a7a7a7c787d818d2b2d6e3b76fdd09f6553464eb3df0c07396b5e7413bb2e7d4f07138d779e6e51ce7411be745558fc3651f0ee72ce0481c0e87d361c48cc52f079517359c8f9a080073581071d02873ca8273b1005c0d21f1a4672cba2bafaaaa9faae72b370f230942a234916af1dbd9aedfae931afbed4257534a5e454ef61c1148d2d0d0e2e243b38586952a6b0fb7e53970f0dcb5f6385c713d0f8feb78783c28f3f0f8c963e349033ce9b9b8f6482a5c45601ec83790e729e756d7eff0fc8e9cdf71cf3cd2773c28efecf8500a77c74f4d64811b605d537e5a626cdc9d23bfae2c57453935dc97fd1ddf5ddbcafe608f5a50747400254914a628607ebb90f0b70f49c9b215fced796bed6de2f8163d497e8d638eb82811d5254c4dd42bf4a40f3de9e358b422c679124a8e27dd84cc23515091329162cb8f3352c6b128454f567e83ef0d9ea1acbd0dedc89e505e6b38afb50779284af3daa6df68ad66799dd3d88dceed643d69dddafc8b87afb778c65ea079d326c81530570f79546939451da1c105ee1043a3862e5e720871df71ed0541205f589c9599d8725fecc3dd40815506cb494cd886ad1ad654fc203211ee40f33c3c9e89e7dadedbfdc98edfefec7876726eb8e224c822ca0e3427eecb7e6e87ef73b9b5cff9e9e2cd9b1c5749b0b839cf4d5cc757075a24398574d6ec491d469ef49c9582ad212ba4d0403a51220ba8f5389dc7b1799c3038e4c90c31278eb838cf587eb5f6b49b24afe33bf3f2f044f3a8ef358fba0ba13ea48b963c7aa4e68346b5dcf87814bd8151c7e8d651234b113253a6bcb4e230f9a5d832f2a40c18266f7e08833ab4c4deb821b361228b85f0c97d47223a0eb5e9ead0c60d13ddd51636afb55e03be5e237bed790949927e929e95f8d6e3709eadd61e2ec9da43d9f8fef47d7a46b2f6ce611b12a66ba2d3f530a48baadefcc0021a6b6e371d33e14e931d9aeee47138cf556b0fd78eecb902ce9b1965664021ba2f1b048c1a05bac4c182f3c2c40c36dced59a8b506c8c1a39e8f0cdd48eac27ac2916344d60e32af750d2de8418c913667c7d218577b36e25a6ae03c497a2e92a96c365b986db5d96c596c02b0f9c8f436df363fd390bdcdd9ac1a7cbc4d0dc5dbd4bcbccda686e66d6a9ebc6d0d8eb77926b2f66c59694e3ccbba2ef3383ccb7a10cbfa90665956eb200faf47ad11fe1db7ced078adfd3c63f6da5934455ebb0e4d93d72ee4f4da878a78bcce429bf33a2b2dcb6bcf43d69e2e8e6fd1ef33297efb3e23e3b79fdbf3d4dadb524556249e030e3c0b597b1c24e1fadb2dcddfdc853c649ef69b0fddae7e7fbba5ddfc83263adddbdff64d042f5caa9821d610c22385322c6faa0847b4b15102d3921233b44874b17133f326a9eac6081f50ee3b12ffe663d8efed3988d63e9205bdd6494cbcf60c441735a2fd00ee2080d315f5de8b7faf8ed9126db355076d9a15d88c314b58c284f1d2a18d35d460660dd04b6a0e0e1f40ce4c5c4912a7449635299a0d708143439314736674f580c012a9af22699818413a43cf7801f104ea37a386125b68419e2469d2cc59ea925116b49991b16548361c22a7cd1b1e5aac66f0129b72da0262443dfbd2878471e0f8b881348608e596ee34000d99a03073660e570e17b632e395ab184cc69a88d4009c416bede43bb47aba77bbedd92a0b619f00152bb11e3fb2ac9e5cb37d5932c8882f7d93b1057971e34b8a176cceb8a57b862a772bf45adfda3c14aa60473ce66dedabfbd2cba7ed3bf4a5128f1f943655a8ac719b5049b3c2e6c9871827d76c4772b7af1010ac2f7de7a7f3c76fcac569cabdb9b3cffee6d4d6fecd91bf1df2b713870ceea07dde5943c3a60d8916692cdcb86fee9704e48b92215d5b61dc2152cca6b448537a72df1c308b8a91351b334859e3beb9602e97cb99fd9b13f36f8efd37974332c0bf3bb8397b0d1727e3326ead02647c98c1e052840b0bf7dd510a1e298ba1c4cd0c68dc770748d6540a618eaa2b25eebb430217130e31628074c570df9d1abc11d290648bda5a9afbee642f61865324a63c61b9efce8ed867dff1caefce4ed967df29665ee961fedd2182f977a7ecdf9da69d9d1b6404f02f0ece3663b7198bc6a2adf13063a50a894c8fb532f7c5957380534864a185c9e1be38a41d4d5b6ea224097be1be38e067364d9c20e9f0297172618031f6d5050c192171dc17277c01149326668d8d09f7c50d1f27f6d9715e678f337b5cd967c715336f7ff917e7e55f1cd9bf38f25f1c8ea9c3bf2c1cf2368714dededbd9677f6f6a9f9df521fdd8bf6c53977f592effb2c4cfceb265ffb266ecd9676759b1199009134486d209182cdc97656305d6f52587192443dc975d4a53c22486951d5c45f765819fb5d470066ccac7d5e5be6c10041464654b56556a0c715f5628d4710686050c34f7658742ffdef2922d2fd9c66caf6d8d832a3168ce4c01a3b1c47d6f5094e23481c282c61a37ee7b5b1a01cd09373952f47802e5be37a09a3235647408295671df9b4f95105e69a283ea8dfbdec65210bdd4e4247913e6beb7e1adec76bb6df9f74614fbf716f6efade986f4d96f3ea7cffedae07c769b0f49cbbfb626b07f6d5fffda889fdd56f4ca36315b19f0dfa7a6a894ca9670a3187408aa211200127316003020100c07c562c1340d032544f914000f6eb6565e4a9788a359142739ca18858c3186100119100018a14d13e058b7ac2e3b5ab64d37a6759387557e2900f571356adf37c600967c2c5af2848a14e78e205123805c5491ec1acf1edc7684200592b96d2abe04d21b163a45504d431e8f01feafdbb490b6dc21f288aab6dbaa531446a182cc72399c564a9b6cb0527852cbfc84c69809b30aa93b2ca29c9d2c2dfbeeeba8d7e8dfb895c72fdef950741cb9a9b7dba8c5b1d4f118c8b11d4df2dc618c512797c70df8abd7a57c7c6392e9f456d29343a88d4aeb751462974ecf71c45a18fd387c83c5d8869bab38af6e5f2cb4b5e1647bf5915c7f8879f50a929b4b5788c3b6fd380ec28576eb128a6a6bb99864aaaac1ca28b73e2858b9e69030e70a66b0160631a59d50823093510d84db33661461280692bcb41fae4eba828744e6388012c3592941cd4bf456cd02bd04e4e69206586a235ba5e8325eba9e55d0e9c497d09c87a837d74dc9d1920e407bd09cdeba51f50fbfcdb57665c823e57e5d1d41372ea5a928a1fb9632699b284df3f4231e2e4685ac1003403788c766210b806b9f8b528e5fcd5da49b4bf15731fac886c220428bb6b30178d57959488f1e79b8c345ba4d4b26bdd54a8edab69a8559a77896bcf93df3bee0bcd0cda3bce41413a82ee6f561ca79521c97fd0ccee54bdb99492515104ab08e9ffd2cd6316748cf4c659bd5f7c0983f67d29ad942d86d88327a3fc2e8dfc4a683d137de3bb1d42915b23b6e076b0733956d9ec8b3240b91aa335ae8b19d19693426474804e2650e5406ed958079a6a495b3ea9fd0454999465fe2fb03571edbd428e7c3a82ea4b24ce82b1170c210c26e900a11e503dd469c2a3a1ea8158b68fc8c06ed6723dc7099e16cfbf7c5b5895a0b9e382719068db01a1afd2d573beb9d06cd1a4769a87fe0ca285d9b5c599eca9fbe98a5511b7f95210e019339dae6f7a4031cd9769463098cf278dd0a49cdb5a8d17856693140deccc7d202005af34f84d08dd6ad4ff41a2aca878d0157274691c45a54da733b2d306a6c200e35ebc30db1837238ba03fab9f4a575991b8a32e3f0482b71eb3a682802ce748095eecdc049569936dd582179ccf3070b63db1a0a45dcb6acf8cf5994913f894cc582b626540516a0642d6d0c3e518ccf0fb42ce37260b1576d87a7bfd786c58cb9728539ac6d2913a0ce9948c33b19331d65000f3d1321066f1909b22a4b1f12a556ca5574f204336ae964271b11152e12d2dea5ba7c76e57408d3f23109ce31a7896f3d383aea1583f86920937644bc7a8c6db81e2f5fba711355eb2c91480d4afff44a59126006ca7a170e56068b838772e84ce669c5d2ebd411c8d848ca13a9a693736236c509269232fd68b2d4156b4d6e15ba22b4fae7704ba13035a0b5cad223f28d396fa7c3cf6c17733aeb7999afc8093d502b1aff7eb9306ea8c80e3b745d05b6c7fde2c6f3acdadc1ac7d47b651768b06826a2ab3f63dc16f5de64548eba9ff8a2fb5eb86abab8e429273034d302bfc5bd29cdd660cb7a6277b5937823501524805f6b063841911e1f615686ebaa6c74b8bd704ff4318353bd124e178ff83186b51291931ae95ce6613b51a275a5bb72d2b1ee5331dd564282e347729dfa9ff954e0494c36fa73dbff1e2f8ccc0c8d20efb30b8d28de4c163e02d40298398b3029be12c4e37642ee99632b2156f7245c5ff3777f3e1451b1ed0ee26a1c6189271c1027642bbe9a7feb8e0fc383adb37b42b75ce7d911b61bcac66dc9a05f2f8feec296eb1250dab1874f6ae61e419167c2faab8425cf3ac9be026f6d383aa5f00969a71220a244c5f7b7dcd440f56dcadaee104771bc1bc097b718f1d8df7221a9cdf25ca12ac86ee971cc4d57f8413c8cdd75fac3c4c83683d042988b6fd80255050ce351fbf9a717b76bcab5433f1183111662881c4d6147876d85678d95f9626dac0cc18049bd2e3e94bfd6907546901292381699ee8a79fda1b017a697295efe2908bb01b19d7ac9147f35397b7d8272fb4070ee3a3fb342f066227b2942401cfe6daddb04f0676d847177f000789d1e759997336c161df9c4d57cb2b7a049365e705e8a65b19428ce30b1564ccfc41b0cea5824e2a0979272c55b5753a6b8ac263d9050c43e64e51efd236a29bc7670ae0f3370d441067b6cf5bdb6f45bc97549ff347b64baa650efa98bd0eadb5d9ec1906bf1b64eb77c6d01b132c6117f1111135802500bd639a352835853bbea17a039b0b4b2aef6249af4d590745b6c027f2fbde7f8111c2429e5594754941c651a93a31a9d9b322552f080a21111e66ff9c19c54f6b6b09ca9c910af9d4ec0d3843e017a790ad1cb6cff80e6356bb442b8867126deb2c171008db94a27be9cc131d1807e33d8b422519b9747aba2b3f22b8a3cf1cfea9abb8e37a5851aa52dda8aa1ce37850b8424516ddd12c74adc147ca191bac0f8df56e4372c7849b463f0d9c1470fcee59473421a494598587d94df7ed4c173ffaadedda28dce512f83b0cf4ff3ab58631a75370a21a05fb1567dcd7b7890faa68ab4fccbdd7fe3875fd5a37a581c7a53f0d18d3dcc94fa829e0e6cb0b68e7c8946749cdea9f7dab92011c99cc39bbfe8ca3d9f1715b0d37ab0b245f7ff11124c09549223461e55e8d55bcc4bf2cbdec751b4a08a816c4d34a14d508d86f1f75018ed7f7649ae803f824662349caa832ec5fab4c46fb6a4914e305d97a017c00dad5b49481d18f3b167867ad6dcc358334caf9a356c18194085134735729d7944d189846b9d503992f189e895d8f6e4a3be4d8cb5ad5b2b5e3571714f675acf8813ece33dbdf0239a48e8cd838b3fecf6529a5d0f0fad1a088ed36a3ebaf51b37bda91bef31b5e17f64c23fa1a392565021f48be5a1cc070fca2c0a8b95d073d688be2ca50a2d391a14eedb7aaf874edab79a08694f8ce2b794c0054852b29e77f82454ba24e1262786663509ed756314018d1109710f3ac45412bc4b4fc7ffb857c0f0b219cdf4d954c49283c95ec369c97e321d9c6f1324ecafd7981f468004293527d311bb096593a22fed4cb5ade2660246961dafdcf8b634c42118760102a96105ff992556906bd769c9508a1d03040f0cc5fcfadfe1057f5d717119f3681ee2ee1f7ab886636b027685274e6e0bf1b788cacce3156cf59f6b89b3b614ae304015d1eb1446dfd4c7bac1f41d7ecba9060fadfebeb98c1eec2cb1cf6f7870c699325d29fef582ea989f6446778b23dc964835dfd8cc702288f244088e4adc1605bb41282bcacc0d9c4b5064f334642c0b1b69e770a281452cdad655ac58f16a9c6636b5d64b4843238bda78da311f7e566f0c91084eba1d40c41948878c5a07a9aa07eb6b95691a860be0f08522ce0336e20baba9e0fb5160e9ee816bf8e429d6a3eae69fe501b86f95b8bc81e1bb8393356d068e36cd291209aa49c06ddf5f1cb48b1c14416e2a00093392de93e1732d6fa7a8c70698bbc835436041c51a4cebbc28e9d899aef095abbaac3866e9441fbd7823317a103436aa6ad81d18f739da0f9f91d188efed1a8d49f1b73828ff9f53901281d9d47df7f216ca3e98a98c0702e14a84ba47d732d7f42a0f285ba28f7707f52bdf3763956262e8dcf67896d90b843842c5e74c00306b0606400d1246a9e60371d953dd95b41ab8381b02350b30e61dd3f0282abacb79f92887b804f1a9d57588f95582453283b26c8c4b61662e487b141f78712bda62531890316b800e07cff59456a9dba205b7e59d8f0f21e858cc1bc9e3479265c6a911cfa19d7b9afb074fb71d79466c92ab78ecd5b5b057f9af3346f81d84667f9122679e2d801757743b6e417610b6d2146ac89a04a3b383a0eb186f493a22273b456bffe2a30365a04b55718df5e99a5b81eeefb9acef2c113f63d30c71f690e80c32847dd99241abe73f7e631b43716e3f5ffed0a0e729dc48ae0758f80ad96222f8c571f12fe3a7536ddf306d81b769de0fe08c494b92d49e6fa9e6e28686403d4f25c25f9294c48b13b6101b2f2aa8a424f92e8ed7539ee15202ab33d66f18ea68463def5d16dfc578d6a71bb2558e0c3dc26c1f340b82a92d5945150514e42b2258b8f2e61ff3e4805d281f79124b4d939abd26e6c574761c80c992c50cc01863be2ba724442608d7927b4af1d1c5e580a77cd5135abb2acdc60d4d480f61bf1c3e30acfe39184fb3a1d03f4b0afc4e19533087dfdcbc97381cbd1a785f6406210a22db1c9c25da95cbd019d99e279251cd0957e11f8d110b85279e4e533612bc16d3855699fafcba2b03af1b495b3e9baa2a6f2c0bae48643c6e05f385292a5be8026b165a517a18d21dfa7a4ddb22e53f14e669a90df14a90310a24ab7ec590a98aac91831fe28e869ab4aa9fc2cb38b2326a46614444c3fe697cc932df7388331872e33554446ad6f8eb5d13c847f108e4d0c2e31a4a288923506bfa3542cd6ac395240391649796810b8af8232b1c3eda5b3913b67c61c3ffcfafcc86ff336630c26f13d08f870dd8b9b4c0c297e4d6a0beff83721f85354a73b5bb9846b2f91218395b313517c99f1959665626f9afe435a735266f2b992174eeaf327219715bd492dc48b92e83ccab9280c683778de9644945db3460b737447fe5e8066c14063c8432dd47f0ed59a2f2771bd75632fc38a499269280d214ee0c6a0b38e7cd4c54a8c823fc077ed6cfb93adc6ad1371a07c3657cd0f686c5f287d3471c9f35f4f9feb2094db9e082393121bcde55b1dae63b1dd142a4e61db470f3c218774239afbcfb3ad422ce92f12e921c85f22c5d840ef3a0fba4062199ef7c52ae911974402289891777e530c9b0f67f42964bb07e7912017de73a787ece4ed713a5418a516a0e12bd236dbd63650995f46976edd473ae2e212bf02287c9ba6c74bd0b23a79209fb13213e370093304687071a99720cc3240d6f4761536b6410710ab5dba3d9b31dfadb9e66cd146cac0a0224a3dccbe9ca5cacbc46b13e5e8e4b992ddc29a7aa92fc9fb4e3657fab2a944146d3cc483b08dcecad59823626b166c78a744db1b8af3b613a40bf88588bc90c230894b7799faf7b11b0e5e61e8f86858b8e3ee347928b68f4c532e65da730d67af5944cbbdf3d3e177d5a5c1c23317fa32b5e9b25266f2d17bdd4dc2c8fe71491548888d157ef57b665fc4bbaedc374215dbe3cd0045164fd4c5b0945a5a13b160a7a6cf8d62ad29e921c68e88466d85fd40d5876d20e8e42d32c2b492a296e92d7bf72a0bb2b013e0e840a6d17017a75e8b34e4e6a25277dd2e8e5f79628a8d0ab20fc3c14696c1c92849aa990c227be0c46066238546c780e53ca33afe50d537511efeb33e7033b0c179d9687373966516b6a0f06cb74c0a45c3063cd9da3c0d687a844a56568095998ee3adb3c9e5a075f7fbfced42da93e316b6121a7a036c2c3667af6dfc1bc2f837c62bcefa3f790a6db865789bc4b62857ce82651ca1a330701dd7562e2816e4ce812b2ad6749b6c9dc094d10a9545a34bdb31410c206ba82fec990bee067ae2329714e006f2af33d27704e09fea0255827cd5b913a15da1176e89d6849562c8d3d6261b65b862289f93dfaee2073a50497e0fa8bbe32648c43065a7f4778a9580dd4ad0963b52e10217c871a5562ebab2655fd57622b98c9582da97b30c00fe22d287b7305ac895facfa885cc327fc6227bde2e820313a085055b87f2dfbd557549e935939e4658c464197a7edb36f74c9fe935473a213c884313d602e3221cc211afee86292175fbd666ac9a32316eaa1fc3ac7e734549650f52752e72e0f629304c5c3f7257cd7bb10b0b6fd9bdba4bf0694ac09a01d18a868c328859ace097cb967cf4d63723410d48d2cb3736908ed2a202a5cc0eba8e58662730f0dfefa964f1e21c7efad735435ad70cb95d2624664b48780f82fefd693e7cba6a3a5020b0e8d841530ae027c9584d3c5b0749d3081dd5f045e0caf5240119b4d01a2aacffd9ccba4a4da5bda629a4cb67092fafc124005b050e71c32d8290a5516c04d8a17842c92a72c04f3fadbc3a9f0fabf78e09d7cd91e6423623e117ee577326d7ca1caed0a2745cc51a4bff5b896f5aed646cba753219a3dcb3259780d9dadd091558d84cf56b3b3b5b9d4524d9a94c5ad282d8b6c24f52bcc6d1c7d30c25eb03492236792946b5e3cf53612bd62939682a92550bcf58c482849ccbe86bc83250a9736dc84e030eb6c323b4601b6cbd9f6da4aaf2b30944fe476b54a18f74a0ad819592c4b48a17e1966b175141b684c2ebcd7262d3afe2c7dd83522e650976e06afeb9416359c6f7ffe6195966c3de379360010a6de782d945ab6059e6328e83e282ba67a39687a804899a3ed718a6e6284acd0aaca0a7992aeb9ad11dd3828071f253b03a6b6a75a90ecbe344fee0a241dd8e6aca6a09d295e13866f9a7274702c0134d7c233eb30c480a615723f3d848ba4b48d846ad192cc0821db83ced3f0121e719cfcc91997cf855c440de0dce896bd10e04a66a46d8ff8bbf5846e68d1658130b1c91670b742153765e70cdeb01990aee542236e48ba7be30f8f37da14f786614c87e2af3860d83d026e55e04a74cf95e98e7e05690145378209c82a05731ba9d0b0360939506a7bd4b8450af04d43061df1ef7076b480685a69e166aaec0f13dee4c3242470bae1f4fa1ff5e7d870133484e84e881ef5ebfd022a3b4edb596968f3e2b6f9ae83a09272e0810be8f6e4bbdc098b1f759d5a8a68588a1e063bbdbc8698d2bc73f2861b6212bb1d82b64e885d7edef0b1e819784bb1991ddf8a7739ea0209c809de31b9069496a77cdc30c7fe26a6e866dbf4965e095facdce8ebf8a5eb2d4e029c925fb878c42779aa4e3c70920774c5f93567ce562540b0646493b55e043a2d35c63cb0e4a38d1994f905ff9a78821e93ea9eae0409fe7fee4de456f2299a6cca6204634db67c20a924f309a6d01f0c7b67c13701b3b29231840aceb76ff03174ad8da2700ceac59409ed071be65fdde4e803ec4a51a8ffa763d399b8916d1068df48888edce8782fa0729cada46905cb2d035c59ddc995b5d0c4e148202b0618b2f1fcfd69e6cf754f8953144db7f409870280f4ea9267428f8a2da10c650037c0e6d1548d07362ff9e76310391ffe5b1f7f46dc0dffe5dfbd530b3a6c34bf198e5e3ce2264052245f1623aaf0543cda8367c8acdb51e10ada6cdb9e4b23822f7e7911228bfa66319622c27555d30d2e65ca76950be09a1bc4dd47716fe312d70b30957bfb0daf081ed02b3f87e345bc7464f8adb3791c0b0a381533548974302f07ad41b865681f27a429cc73a79f1f2b1428d5c4f4d0137e4bd1a19be7581a483762df2632dbf050f169f041dc96021eed50c4db120aadacd3e35a0e848eec69dfbd72c1928a67c5e568e6b5281f20d00dbd80a5188ee935ecf1c4fa22cbe1d90a8e3aa7303d788e45fa66b1bac49614337764bd5ffb272c223109a6f5ee7713ac8cec586722d41362ccd5f62d5456f15b26f5da4731fd10e4717a69942fcf2d3b456f624fbbf37ac92eb6a4457453be45ee170574b5d9e68258ecaaeed00614eb4faa51f745732ce794662daca668e6c7078da1083bc6148781845c491d9ee4ec9bf03fd8cddeb7b693f75f79cee2ca57cbe2b25e070b8413f5919d5252aa70121b1cfa22f08b83085dd3e40d00037a3c6e4f90d230cbdf436031608cdb500853cf2e4214ea9a048d041751e9d975898fe77f6ef669e937d020ec29272f5d6ac96d12c7a024c58e0dbc21568b8c68d8ae5d6e5558f54acef8cc418923e6018606ed3def9673d8f82df1a89741287e330a7a41390761a8a8b44a4eee54a98146215163688e88d5809ad8a6a99222ce9ac3858c5822fad737cf7f3cc982a171ae38b9a9fe20712d95b46e9dcb1e971dfe1a61b2d665258c74bc2e70e2ff62bfd94ebf55ee829178944e10619e79b01175a316edd5144a5dae1700a864a86fd4f6da2b9ad069b04a80c46acc196eee365c33568c6822cf7a231bd88ca4e82123e753a3af69e9f7e4962cd7b7b962034a4eb8f65b185743d094be8c20c56f2da5d1894d6e99779378f55f71add89e60499cfe1596935ab442a01ccdbba01f006e1e0a031351c8bd151cb00e40d2cc45160687c4aa84d97dc02dc93eaa3a5e7c59b92460c67664ab0918ca972010a300543fbc6b94e70d92bf517958f3b90421a2cb963bc96aa7e374516d8f271f44d6fcabfacc63aa402ad710597d842e4ea09523fe7a7261bb053c41562f6c238d1a1a4df57fb0012d36eeb803329135d24516b39756c54852a3d9cb164c852ebdfb1446acafc00811241605d34301a64b72f3f27593eaf3869e1de126f7fd1ed82ce1deb066519d268bea22656765da7ebd9632bdafd5683a9b9dbf829a36abd86bbc58d72e8b8a841f111aa809e0cc1fc60d3a1cd8a95a6635aa7623a94b96cc18df9415fbc73d7ce86308aff3cf96e437dcbf0f230df0d85b4329c8878f90b9b0982aa534cd1bd91d08e89fe7c659c68c218cfeb8508906c1c8de1dafda269e334c9ef1777cb51aa6e9bc052e1658fc7da8bdaf4b62cf9ef7116623a3cc27c6b43966fce0e76a41052b8e16d941483da8748674d97e62880cbff68af4c41540d168001a661768cd1aca6b1b910775233f66906669dc1c9c8c0b409a7231409f383c8f3494dc989f85ff630b2ce6ee7714352e85aacaf207de5e6885559269001a678c5ac8c46623223b389b2794e2be3e6f70cf30f5de4ad973e6061c451b1fecf7286bae8db78c096f4c7f62a0bd1e6f0005839697fa1527f989429f88e3d417568e8bb9bb2f26608c03188ef7159671e1e27989d53f0cf5f104987482fc55894f4cca51cc1bc3a109a573e0b3048ab0ceb5e05da9a39a65c52ed6df8af18a7052aac59210c0b6a81e191771c284b6655fea1343d196501cd821c3a9b57963f2d510d31fa948b0c011488785cbf823393b378ed6aae69063d970649ae56be6c63bc15d5873444cc82f1f2da06e3e53cd82c2f65e39520406312ffe0951ba1603805910c925cdd9fa7372d32759cf5082af7caac753c2b18bfd8e59b84938083112d0e127cea0c67ea3acb332c690d0f2ce42e7e9b108f4d4edc5555ff135b66e5e7ec771690e710fa2063150877a5c0f280c685a055164f5035a4acc8218040aa59726c216d6162b2de401b0d270963f81667fb4e59267f4227c4ac53aeb96daeac12b73a55c39e1e1642feed468e5b3f1d6c49675b0744c35d8c0967a5b90ec356480631f7ebac74d074048767d60259c42a6874c877313e41207e1c115a6214d0d30d3e145f4d11d146d0f72b85c68004c87213729341d5caf3a1dc62b959ed3c10bac97c6858d741ec7c4bf4030d999c217899f0eb7647b855c3a95ecf01a5e23f108f5903e793eb88d391dd4360820debbff4b2729a9cd66f9a78b4759fa731cce13a5420693ae588b8afe04d8b28907997d6d88327c9b40d4b5f8e2fd2e047b4069c7b88fd5e20fca02235a95b8fc73944d2716be50ea9c6609b490701b729e06c38a2fc4c5e13468e1c3d4ceea26214cb5416d6cce2dc2505df86bd367cafecbca789560717f95666c3e7b549e318c14ff2300e33b6edaaa3b47b25a6d62b6d9b10bbcb27778022ac695b3f89f95df4b0db2a78dfa59425d337d8fdb2c7a264d6090a9e6aa89ced22676f08b2d08ceb7b21d5bc79ce40a2a2b1f649534e5301fd0b43071a47596aacdc18d3dc6a4191d47b285bb5ddf6c541c1e57332bf8843bd4ffc2c6a9cd65fe6589f354105c5bb95b4d6a128eebdfea09e9983166c370f9426c589c5b4562e0d17251ae13384b2f1881ccf52c24b888c3f6578628406c0171ae54d413400c8d500eb2e4b600bef7dc68793a883e5cae3a9a556f096d9811586f77a6d104f3ffc744139862db40a0b927f59f0a5f10efc648e4505b3d408741a582800e9ac96cda7dfc390010ae8ae5c74591dd84cad3fc7ce100d0d2ff5a0cef3df26ae93358b4ae4ce7d09469b92a5a69bdfe428d0a0bb687ee766f2220d38edbcfb8cf5111ab085f2bac401b9e1976515084e8652cab0b0e3a70af1147844b6ad93c64f2485f7b6820c8e42cc0041919e90d580eb2b3ac693040c2477cf26ef3849c37d4706ff6e4047f7de44304cfdaf62b89e9d23058e8911fb28dc4268801e7224d5f37dd98700d2ecca29ec2bbbc3ea622353d1d179a297adde585c3efe04d50d8c8401d0b0a76820a9bb721841b24fbb1f01cafb16dadf8199bc30c45780806f842d41c6606ea0ed433e0f2e6074fa406dfe06c8b1df81e4ecc0c8085800f6f017f922714d23919d865a90a8f66a546fd1322ac09a19c363a88b6b439409aacd45092c2217c114e008ef37b0402bfa8662719b589f90419e838e0ff01f5ecc064b3e9768c3328c2e353a198b5677d1cbb7eaecbbe2c463c6a3e56c0d7ab58c12ad7e050923fcd8bc389987238956a2f603cfb24231c059338555fd9f866dcf41ae46a8636d0ceb0007e85ddd012d6b775c5c6b1146b17656e15db4fbe34a6ba2a67338a2b3d9b6da79b50c516e4d5284a0a4537b7a1e9f4ee44bfba2046e0eac5676e34fdb6adafdcc827bff7d0e8e6529741a0b7fcf5bad86f6008b484dd7dd4cdf26d4d11bc4cd1d4eb67b82bc57fa66db70c0c8c80bfb6a26ae116206ab44c8219d246bb22c86d98ea58f28267201d52a4dbe25f7556ae99c2f4f5ccaf43b7a42907b576f8583f1d045cb3b1be617f13b5551fea877e94258009445bc20558cd18838e6b8d541483bf39511e7e4f28aee68981c279d0c399f46b33996d41f2e8c0c6b206b5d5071f92ee3d4aa1ff259e11d6b9c2a687fd821ddf989057fc2e6705842dd95644968df079a71227ad13912300b6100b6860c6bec71cac1a6823cffe9fa0a2a712af55239495648d18d2a602c84009b0149ad316abc2bf5c704a805b4f9a831ef9f5edd002dd913a620280f8598849ec1507683a729d0a439f2ca047e4b1867206b8a420882ea89c747deb425273017a8060584ad126ea2f3b43573e03e268c68b50a3131ffea9f348a0941bd3065e9a0428a2d1a06200f2d2c33e81c4e06b1a63eca68230f010c90192f4c7d9cbcf88d6f194101b2211f40f0b08ccf0869ded40c8a6e22e27ea3a37d71774c442dab232acf15038b1256b0cf60692d25c44bd13f899c33ce81de01dd86c595e7bacb86315d49831fc138ffc3d8e76510b87b38d68416f1604bb515344894607b3ade0caf5b974140a57e3b71b372897ca2c49cced9a3647b68df098bcf0cc1300e7b509cb06928d6375f6f35cdf52dc0788416329958b561d8d8fbfbcadccd3c5d736ded674176c202552a2be9ac78c59d2e7fd6d0ca56506bf1036f07bba5f251256199da5639ac4e5bf4c1a77113fd145364f917e3a9442370b18d9ea0c5d7f1b19edb14a1d8f8bab47d8a95a5e9ece4841810e9d003e46e241d3fd48b5a584671069446c5de347bc452b1f53d34b0156e26bfa420a4e635889af144477bc618307f97cb536c06097f93426c204e296909eb9f652d51e91c93bcf30f9c724bf3e952243968bb274a0470837d55a8ef7c960d7998c6d64763f9c915b20b8214a0ade3ef80bc8cf4a86aad246b7b2f1d8483ed39b2120b431281eaa9b6bd70de08e0b1a6bc56004cc2f6a265aa8ce36050f06c0f3b123bd351a7eda5b20c6c0de448364a08e5786e56b03a2b36795bd9d7df938631161d2edc8ab3acda5aba1a3a117376c32dd5e52fa4a8b074f1be79aae58e20895cea2e89bf703c15b7e44715484a9c3ec94db7c21af42a10d2d7b4039e663a0735d10cd9b8ef6fdbc79e8246573d8a452351f386c136417ef838f535d49fe489d66ccaa3119414d99789572af89169db7c71ac901595ba3dadaaff1c21374cf134d52904b06ead24f6fdfdd360113e1bce0c4ae55a46f099e1598c7e4a9b573819e917c71cb4d622c9073aa6652925b99941405ad26bb69fbaff6708a22ab28d08dcb21e1b1486fc7e755be43319dc67bd3f8583445e31825b74afaf3e7ee6e372285fa8747d61bb15bac66a1b04337d26f73aecbdd1d1cb58763a54f30953dfe00406f959ec76ac95830f03132cc35e18a4a889a8e15d601cac5b918074e1d42145d5a1f9e0c0f7846a4949161b27929d77c3f57d248186213e554131aec0ad196174fad0ea63cca1d24e780ca99eb53508d8d2654118c79bf8de3cd1dc72763b41b98d34193b301e0ef0850f58de4dc45eb42e04cbc8efc31609e248c47aee6abfa71371d4c753cf81653993fe4670b70bcf97db59785b06ac9e87c2ea61a757375fb31f4059d4abbec56b9779dd7da54305dad4a360ddeebb6f8ad95ab5da8f66016fd688c949b9444c9071ccea2a9e40bb7182db0722f5bc00f8798cbdc56bb39a12456d9915cd4b9704e944d4e0dfe82c90e4201654d446c0ecca900cec0637448d1dde776f8bc1f0435eee820141c5b112b4cfd877407fb2cbbd77daeb3a5df7efbfc70c9ae4ef9b60da6caf42572a96fbb5c3705357a42907846c841ed800f5828edac0f32d64ff3f6f6dfe3ab5560f264e00fc38258a08c5f650a1eddb2dea1a6b46861ec1b715642f536aa1a261dafc06d318c1be32e2a32a8b11d11219a84b311c998b028c5fe9aa5f0a195520c6d8d71b9d331dc96214b3140c6b4d0780848419c87bc817bb56bf84744b7d9c220a55585b66a78116c33a533992afca7dccca2caeaaebc3892158110223f906a6069df0d63d2d0e348bb291789621b7668445c78f05044f842d27909756d85eae87e74f38d5822f1437334f224de521114a96debcd8651754a310704eabf2088185029c531e7086a8744d8ed119ffe355604a6a4c0ccb894c61f27133d524e60d62d2cfc78e16b950e567f0274ddb7465660d5e1bf07db6d9ff1a5b228d8b14aaab0092c89a3c3f5089a69a5a8ae65a244fb8d45e02fd6433db161e6adb01b285b2c8005900668b0cf6844dfd8ed206003e60e7895c3d302da723421e8ba9cfa4536094c096c1984e70fda2bb830c9832cc3b40ab6063078012331ab9f922168779c3bda2315c18d543e61b8ef823dab30b3c7cd34ed5109e1181feeab0453f32e0c99902bff305d3830c340b4e50427550fb73d92d2349ec0f9a2b80d073f994a2d7abc4529ddc3a733f0b84060f6e1de4a7e57c28f5cada5958e8a96d2afe03ea07c498ad284af0b5867d0a10a5aa4fd57c6c53a5f22a138e3999ba3950b425514acf03e0a0e78a2b12a455747684ba9e025cc804317f3d9c3c9a3d74fcf720d6dc1a8182016838c186986ff75485b7eae6ba297bc7ddb729f828bdd2c5eab5a2ed5ebb762f3b7022c1467260779654ee91f23b186114e43a47081c12ff57e979943940e59bfc3ffba05e7b56a8bb5be5af893f1492f2eaa86dd815b03b373b5048f38f610f61ae48b1a02b094ebdeb9451a58166e451c749ea83ba55a47031ee2428f8d536515e7b8db3d6d14bed51f4e8e113c2d58b55f3e7d1952ee1e0a0d8bda7dcad13f741ee9a107237cecde77585564d62ed6232c186e7099cf12082ce625731f6577a7c803c70eadf37e4afa9e48ffe3165170eb7020a94bbfd87063407fc31b520b72ae154846ca9a19b43e2ca8fd37e41c6cbb59c386a4f0895cce5ab8c487a6dac220a49a80de153db061614813d5747aa152f646e3ff3621eec385c941265ef7c3cbb3eb2c5519b9685bb12577e4421d6c4c460b463f794d725177b8958e60096ad33fc378fbb64c98d1aef639b9f90a6d5fce70959adb15f23c8daffbed7140534aff784f4e68cfe92914ab2fefe40a37fde503846893ffae4eb80c5a6a03096478961ba341974f83175e4a5f6724351bfb9c3fd2df59c2c7a8e192a20080f2df14cf88a7aba66ed344d6bb38fbec85c38104f6dd9bda48ba67b26f2f1a018ca97612e6a87bd6b919f29e4fb7344998045aef2047ba169b65f9033a7479d9800c58cc1a0061a617e9f4c42316f6c6399d81ad18183c09996a0155d0eb6a5e4546f53d41a7e12c51777439870d442396edd0208a0695cf3d0429d048cdad0eb3ae80aa0e3e56ec5ced00ae7445a4eb822ad1919324346f188e932a51bc9a933214b5138a570028d3ef221ce2c4ca05d3da2cabf2d83b9f06bd11a45beaea6ef158d4a3705409d22fc9b22c2c4e5000710b4ab15529b4c99f06520e8e9ac916c0a9b262d0d2c8d5f18139604a015fea214be20d8591412d343c63478a0969d859d2eed89b14733a1106700a3b14c0d7194f0e4c8958a72400f7ca3074048dc2dabd4e3004a4740456ecc684bcd884c5404338078304fce2f0d54307c1d178ef4ec46a2defa45be09df82fdecbaa6ec4b473eddad6ae30806e2398b4bb346cfd7445e6bc5a8437c3ccd7a331c01232c0716700fd060de01eca2dcc4b08b4b897b42b0e0cd977da3ec9b17d4daf2ec09d329220f03e78761c090e054ccbe8a3527167ce07eae8b2ddcfa944feb3a50aa8c91740228487e1307fa93f410c78e771cd0b4104d7a0ed907b2c3ec27384ebeb84ac84d291881f3d6610a127c3d2a60db2280631cafc7dc66133d904238033326066afe653b04f72467fd42d564198734e95d658a547cc700429b2af2ece3b2aea20b6cc7e184b9c43b9bc3047c39f53d0dd5ded8e2031a6f8480692c2c8f9709f5593863d3328cbb061c29298e348f42a2f4f9abe4ad398fe83b75afcaea8b8bb40837c5ee3d55cf4fd9a66f1aa94f99b81220cf91d48f4097459fab1749bd157099b700d1da625c90f20f76547ee88095a03d9a2e5e1099ec9dc62b14bc79d00867bb6d52c06f4e20bb7ae00590086a9c8cfd28f284d43910340b805039f3766eb140400341a79d54a0dd44a26e2c6686c54315d525544a94921c30584f90b4398ed9b75cee337d421d255afe3fe21aed90f0493c59c990e0b12d5916a347db1dc4ab7a513980270a7247787c8457f286a27389b5fffd1c4d46a4c168a8745ff9028de277a29975ebf695ad00d113b856fba12c3eba8a1e0ea6ebd9dedeb0e92236bf4dffdccf3f13b4683c03ef2351d0cc84ce0bb7a2ba448675956ee0c7d4b3706ce2776311393ab751c6894d1170a88828426592adec2245fa87480860458b97445ae2d6219406abdc93585687cc20e0974d4e8fd758b1357165cd666ee6f6cb6e9c8663b3734d4c51315416f34ab675c13d03f841b8c3cc0f55705883a371b13cb9e5e0b1a8f485f3e82ec81462058cb1fc5a3e3d472a9e90d3af8f5374edaa84c989f397c89547cbbcc6324b982e25714a2cb5e731aaaea80b2ff1cc034f425099831e960ce6ddbdf999195a7bf65d68d1fadae1d633ee077e9916ad023c2ddfa8d33a939f8e39203f2759b46145f94591f1abe79c6315ab46255cb9c168301e166f82e9a32d8f1892ce8e8821765eab1ae93d9f13f3f29098f01897a242abde295b605bce4e54f629d8fc2d1aabd7d0518ff27764c24285d1cb778b35fd913e8406ada62df3755b06d261394da951384824ae62a4a848a3428f4fd89644144e1fc48df3bc57e4c5f84e06457ecf281b4ef99129105b4872d824916c7e5d8aac46c9b798134997de93cfc07ebade243c8288a893e79bf85081c41a73f1e1275e23c58fe8e6314fe7d0fdbf1e8500f0b4947f494000b626e4ebbe88d21feb175164998ac7173dedb585dcad9ee17d9a3eccd1232062b685f313dd25a64644d023d9700fda9c262f9128b41dc238584e20efb25ac668afc6efa820808c7d01dd9e954024ef9f0e0ddc99b70b12ee1e11f8f6715670af12535e850a5d31ab30d743bd63a1177abdb3325e96c768e5c1b997655907659bc30da5804eb3212ce4eaf9fe92d094714da0e8f082e66351bbad5d3cf151ef78585c1df22b88f43306b7b3866cac302d1e12e539921bbc6657e0cc72aec9834b0e2f25be701a25290011109644d3aa27d709198920312a148133355aa94f168b2da62e29d20dbe5a61c240200ad38aac9ca6061f8569c9f9981c818cfd78e0148e50ad26a548a89064302c6456ecc38a9a389629d3353234ec9ba053816d04830353814a2ff2ba201f2bf83e047cfd9080c882debcc45319135af7411db1009838e42c32726b2fda4f43e4294025e2a0ab08d1eea47422cdc1bb661975427f2f88605d733a651c522441f252ed98bc86c85a2328cdaa57728b297a352d167384981eccd8714dd7560d99755537cbd0da7cebe9c87489549e508963767ec6a916b134247b781701d7589e7fef40b46c7088db2296fcdaac8f512409625d15aa647b43ca901f4674e2ff00bb7a7a3b4f8f472479e6125c92d466d2cecb82fb4c01e3467b9da4d2b37f1a0b3c706714af7dd1b728e852d4dd87560153bb233bd68d1ab5cf8491fc55778f053fae174c24a0108542b67145dd04c593705ee9bb08c80e4f5cccbcc96529f0678607a070f338573031240eb11909479a64cf2c650e4c785c1a9ba7381cea43bad24ae50b7a01f6796a4f5c1bf43e4709b2cdfe11f998510dc633cfa27e7c1ea190337988919670df2938853b5763aaf6bc4ee0dfa7cc3a587633106355775f0067ab0de53a5448342510fc3d5395868d254d7594c2a81862d35f608b3f737bb8690ea37e31812358a6b0913d9d8334570312d3d2ea7b50623a006fce1aca2f12165b60de51fa9d8c872c3bebd0363a1e38cf018c4ae50daa061b5fc13923f108a337b77404cccaa8aa1e6d6ea409c6797391c776d0061b22fac1d901bf95934bf4207d9c3f0359ad6af33568acc6a3d635ef9a50f7ab124c0a2d1388af54ab6f8500469935d2508dce7c30c6c57394590bb6e36643e4e6d67e48fd5184b41788ad1a29d9c04bc093aa060a745f820019dc4154984f6945f93bbf500308d060ef3ae102e814c37308d26f10983295f38dd639ace3ca37ee924e2c2387938fb29bbe040ac734e30caf53097b46dc894e9d59910cfa1cf442e956ba1fdaabc0bfbacc5afe7ea67a0db5cf78e26c6b9a88562663a10440cb68d07b4e3fe1883b889565966a13c96e45fd5400ec407336c977f7f53a4cf74eb1d4987cec92d28ddc28e9a196640af4d8d8d585f79dcec7d05e2c9013fbdb3ffc6bf380e4fbac74fe5ceb11d7746348fcf3f085c08426a99bf0f0681bb47725b8c96294a3c017e2b3e06ae27d4f3cdd18c3e5814ce71ac2b21af000b45ca616aec4ad719b90fdf8a7e0834efe9f0f79bd17d8e80f9670043cb896ef07b34d6241e2be12f3bcfc1e648ee44e30cd1b9fbe4164a57b6a1ecc712e74ef12141c785d8f0c132006b77be1d64df52da35df8368c08368d275296e73229bb08bce24c699a381966f8bdf70c378f254df7dfcd0b42682f868f164b0688b8a7d8b7cb485bf02b4067024d15bbcc985e4822e4091a5346ca7aafa91ddac4479e1ec4059c71532025f4e5d6be8af1e4e41bbe9405013dd9178ca6869a3e0787c706830fd541416c8c6bc8725c93472ab7806d0e9b9cbb17a8c290043ddd35fb1128dcfc067d8af67ee0307484a456330a12bc3bd85760e81479282f3c14bc38c6cc61048f7bc1b9a097574243358640fa381619367e3c142323a74872ee5c1c0d777c7f758b59275997f1d4ff0bf007d3c1c1a1829a7d219e33876c52a9af966e8ac7a47e64a095ed2a4f1ec8c948cf046201a96bcf1f5b24a5465f4804d9485b11e15102979e67b358d7f52f31e665e110611b14778de21c739bbd57333e17684553d88000ee1cb63a6ca1f4ff6ba71321e86efc936ecc8575a2fe86e2a6991c35b7ac8733623584ed850a9ed439d963288aee03b845a5b888770cec2c0e1dab03660393f6d4bc4508659ada9351c519158600f1481b1577575dc73871b4471613d86a67fd991f05ab9dac4e9ed0ca28de2f65c44cb3dae4df7f3d3c83b9ca5d5660c412e08687ea5e59f0f6e8c9f8bca48dff612465a2280f8e0b8712004f64c0c2ce37b092a637b88445229869ebdde0ec7d3003899e3415524b90e96d050b63f690a55b8f48b0fe852a7455801951a1de2c606914f8332118cc4fd31471b36f6e51dd66a57873da2faa574894fba6f162bf0cd4e0a772a7ee80957e3cc160fd1ef2753f58f409404b5521e683a5ebe8d1c7df608099c834d990bb2354029d652a15f9f97ecd709abc442150c36ec3c332e1e47457cf7c65738d4841326bda35974c6d53375ea46f6c18f3e60fc38c81aee3b859bacc1a880b0252b7542f26921cd5448465ef27a8000706c3c0f41f35186c6416ca22dcb5305ab2894f99c8c1f52097491a7378edda02559725863f4b26cc9c8235a491d3b431de398c43768eae2c9183bcfd79e8a9f8fcd781f6840ba2874b0efd000992e8e8b6e8bfc9e62ca98af07940ede2732cc0cc9ac5763ecda19268ec5ded06dc4f83ffd30fc050b9b462f802f5f3a4686f608f8be4e69b5e3d7aab235c2ef390dea1502f780aae573c47ddf13658febba5c4cc61f576f3d95fe70a5228de7e31d416e7f38d594d7839e656c941c014dee6a34ab0b523fb78454bf333ece45ae9014529f8dad254b0908457267ceb3b88c6b4640eeec8c583d6f0665b892a42bc70069dc386bce2d303c81aebb50f0a6304ab5f4809170fd39a16591f189aca31ea5962b4500f8c631ed8c91e19b8a0e83444ad695d80e70200eec071274c0420c46ab1ea80aa6048e8081f2fb72d59881c81da4581944501c400f7802ecf9e4ef8871fa3a39f9def4d9d0a811be514deb0b8fa5127ad83f79a474db54d8f8cf67485547fe20a08dbe9b8c0395e84d48eb7b2ea888e21a15af4e782769fbdc8b001d3ac99394f6f75c06d0d788bc09b422bad73569321d8796e899a2ed712f136875892f1adaa2bb2eea94acc7a142f642a5b54d10b7f60f190735d18346ebf7e28587415b4b7842d3868998b6ee479f4b6d4e1f3c985cff0a2efd923946f36674c8fdbe7d2f36dee96a437c42de15a0ac48016643812ca82ebac2bf4a918584eedc6b6d2b0e0f82db5bdc64637c60b5e9334714dff1f0d8e1667e862565eb8dc62a4a8d3e83a69ade2b6de30489546d20fb137442c7ad1365226b892aa84d0ef4702676e4d67b9183bfccfdde0c2089a7168d889f3f8d35543b04c604b0763ea2a26ac3603e1003343c55abc14ccd2a4a552843061c654b891ae014ed4519ac606efc6a24b773afc0ec05bac4f26567bf0d09e7b318aa06d945c848fcd159c92e6ce346b1b8b58cb10510873dbd2f8bb1c6d1b788bf0d54bfb4c148ec1ee026a84f82a281be1ce4e49a464cc5754aa75b1a245ce5c4f375b3ebe96c49ac1d2fbb35196adbb4a85a5a0c45abe2dc8322f3b2ab4c33d10952ddf1d1b6856d26508c62f239ac8f4117788157c64e117f956f630485e9592ba786a86bcd932f206d390b5ba2fd287b7c1b08ef876554a8d91a75bf4cfe251506b8a9a7567735b9f01ba903aadf424d5e0489cb5642ba52cc1c34e418d2ecb53610cf1a2068eaa5fdad5efb4293bd0152c258ec7b83f4bdaaf2f86037d598563be9b710bc3389911ae628166f5df04e43ed8326d236dbffc6d3b2fdcf256bb789d305479e6c165c14233dfb1914ac8b2124fe0f86bb627016afd87115a70125a7735cf50344fd8330699c5c31a52bdfcd0f521026f59cb7c5f85e889eedb7788c5337a9ab075e9324304cfab8d7b8d0d4c15e7035fe1378c69d3789d3641bdda4c4e0d05ef5f949101b6de12e068d12fc567e5af98fc95af452bf4ebe164f96a0dd1f07bafb2a56f4c6a186a4ebcfb0e37f703fca5a1c3e6676eee9c6e802a7852779701db37021dae3615b524d1b915f6c5617127fc5cc30970207ed145978aff565d7d5a2b90000cdefa8f9710f0b986160029fb46cb58701907af8ed126d3ff3d68897946dca61d8a419ee276eaf2e324993706677c72a0f1f8391f10e47e13b99c312491818641c042870645c74d62bd0dafb2005de035dc8d232556063cd438281c2cf0a743f1bdfad27af9108a80b3a97865b24015559f2ec0c32ec4ea494838c2196585c81f837785d8910ea12414c243ec5bcbb81e48f79a98572e9028200b2dbc8b2a83ad7a8c5544524fa7759ce87d073d4a6e2c9cc7d5c1d85e7641f4dca9eaafd5a8c1f1eebe3ba1226db01416bdfb4346d82a4455a0de642236352fcd5585ddd887c507217fafbf4ae896878cc2b8aedf523bcbe92f991a126d25191d79cbe54177251a121e0452d34c209b54d693d4a5224ec1f2e29ebd01badd1ad0e410ebb1f722d7948ca2d0008c07148e7e163f75cdbc611b236d93dd7f4aa30853e269f079865f410868ae0ab6b943ceee4ad043222f06a46055507adf098376d178ddc8504be65e5f2a04d5d104c4a4d0e844b36fcbe38057ec992a393e591054ca048db9a8f3b28f0c2c57e48a10b0cc5116298873df9597198e9435dac00a4e2fefb3041be4de6e083222a036f258b65f0ded28dbbd945feaf70629e2f54338d2792073433972cb129bac7b8403562853a34ce26896807dce55098cb54ad34079761279533ba0a6792d72b72ad36308372b37b7f8f38d59ccd347cd1e7b0f4f506b9869df8a3da59222c0a22c30f333f92bfde7c9c51d11bc456e93d8822b316535612a1a4b1b946e3663fdb756a949fffb32a6bc963127d60ea10407b60c767ff53d16fc9440ed617d86d485c6758182845c6339a8d335cbcba690fd2076cf5253f21b44233db1435dac04918c005fe01399773a039612ac92ff6e6d34b385ddbd1d4a11616e02d2629a41d9dfc30ada6ee33b5f24304432eeb1068fd078773c9a25366e11ae322b73c315ff738fdfa3f30f43c3d5b8e7a429d150a4e122a6ab41e7d02c0a01150b3594e0661bc525fbabf524aa46682b34509132ceb4e443f42e54e48b7560acb5eedb9bc8a0de121409e6d5576571619a37634bf4d2b57f9754fe20bd001a312bec456271f71e6845267b24491686e513e135ebc5811a00bc993868c5526def38e06e4cab9efffc25e3cfafedee6f28c9144ae0c42b9af0c77388e594531a1d818f5c686e68879932e7d3b9432dc23bd81752a46018419ac339501b80b9e8108c0f9dede6d446a579dfc31287b724fbeab5846c91aba2645614c29a03fc356d4a1083563228be6e01e714ab90927691939578ca850df1a87fcefaf3a4cb810de1183feb7e759f0e5d7816d421caa1e0761dc33a1ffc3dc06830188aa7103b844ff9aad146a15dd5148872016fdd7cf70e0e928403e64248a7dbfd4a2e3ea36dd9d5ae050c3ffdc74105574a708ac91295655e91890a522763d2c3cd010405429d7390164ba39e683a36f8b0096347bff7d37c612fbaf768d00a20a7ce6b1c5edd3319438c57fc0dedfd663093cbe2192fcfa576744ed94f22999ae69aba6aed08fb04299bdc97a4c0b882a343e77efcf9f2d5440a7e1327f8560180651557451ef85da9a0d8ad724a3e73e73dae3a0f823f151a4ba473bc77841b6f7c74161762d692188c077dc2d5002edfda700278dbd3c6ab818c48df6ef7f28265214a1ff71943078c81689167ef1db28e688ba76f9b3d81e278a72ec85e3a275eba9fa4ace3337d1a6bad4fe6ddcd61b4c87ec3f4ea14e6108185d52b1e19a144c2747b9f478ff138799a36ad6c54276c395e5c851d5b08051634708ff2b9aa4c95b603c87fbfb2fe9f1bff2842e159a8ecdb8d4bd619382659939d5f9a25985175667f04f30e02cb26dcdff6aa3bc6a7b7fe2c3219b51f612bae0d2dcbe1461d8d64304aae45c257943d8514769e9b564295f79bc2e0d55f9ed97c728eac2d87a341a805135c861e9fed26fb28ade1b74ff0102409efff0652ecb7aac98f3528bf26ad0a504a39a4cf8bb6f104f22b42ea51e75858574575f4f7a851197e0435e0ae470c337a44ea7680bb1ad4d1adc62d5508bb4e6d495d0e5402d8c670668ad296bd66842591c3b2111daf7440c79bd52f177375eedd2719f0743cb8a43b4ac2870b28c8d6d202c69c0e0e95cdc97b74855294377da4a40201832eac25cf55c956cc5fdb3e9f47db6a2b5009e3a765c9d48749059cded992f195c0e2cbd29482ccdaf28cbd60a803c81ee6e033e1f820b70eaae768db7014821b7de48e7a8c68c5ed31d4a1b54045bcbf4ddb380a87b7a3a348e7a39743d9d14528e99c69e579a2e8b840dfd545b2879213ddde6b99a65c3a2f9acad3d1a9ff20cb9506b65e8369778243860524b272354036c0782916f36a6a0688433fa9d4a3ef865210caca7083f735bd922b5ac7b936c67dcf440f1211407ad8acbb2a7f5e6ae718adbc5eaf8461cca69a8a180e816989d06e18679b0075b4c72c1d5f03a5afd0886caa71246e44163651944767dc32dc33aa2a336f63521b72de2209bda136a63e6feaf41b604db570200801bd3d54b5eee518f8d5b5844d8172d13423f90cfb3cdbe6b994499491e24a66d639bb1dbb8ebc2cd10773e709f4046a666369b8db727321dfd40160f4d8e205513d5e4ad5ad77fbe012cbeee28ef0b2dacc88ce1746b7d301f4b263b19c7491d7bfe0561f164d1f2bbfa5b245d0cd44f1cbfa0ee887c3af60929c2d127c41a6ef95a4ba6c65c1ebbdd6cfdfbeda0d696b9c2c62a5257af0332b720037534cb3cbc4b905a0e51ae2235eab4f291908f3e634af54168dbb419b1dab4e69f2afb21f9a7439a4abad39aaf4932955425020d6b453fcc1f571f7a8a0372a46674e2a170f677e8ee265a4b9d92e355215b2747f8292a9a5b3571dd7f0a813317966fcc07c94d92db5c0ac1e8fce19621e8b8612a6a954b02396d29f939b97af576a5cef492b049613e77a75a321514ac6165f371860dbc9df07db4710099458620be6e03e7c59ceb9af15ce7a10f275ea1cec8f1f2512cf2a3c1e1d0b4c207cd2a67cad056347083b7142a3501b458e7c734cb0f8b4386e9a898d61481ba19b8ec48d275f3fba5d36c5f74e4c2383905e68b7e8ba939d9bbfebc0dcfa25380044241b631b75ab93462d1b2530eb638ece89c98401c2d85b9cb731f57a33b6a7a1a855e8e327089f1d9217efa7d93e65f578ec314b84a1b5224446186ea8fd6f3f54e0ea861529e9a6a34f57d45e2b12f41f4fda027297e2266453f68bbac698578f625ab4972c16cd5a64c6628f1c04492529d06356133cec2cec294ea280d1ab1d915cd5076595c657326d837208c80005c8283043f4bbe1b044ffdd2b667530e8a8680d02f4283222897083fade6a0c3b482c1d5034d6914109cb5a38cee4fe667035bae8183c3f03e8193de6c680b4bd69b192b3a4cf2ce7adb795b844614615b3de8fe183ea5a315c488214c1a26caec0933eac5df88215d91fa8c80ad12038c4b840c31c0aa8879b99f61f666888e3bae8a44f98b0980c372a6dd5de7a0801877beb88dfcdaa217d08b55bded7a0d07cc1af2b5cfd2deea1adc6d6601292ae621fb459c16c6a973b8dbca95a7ba5f1b09954e46ba6922031ca5c23f54dd5cdadbf1ba5fcb83959198f98bd6d4308b4ad60206a5bded95dfc2c2254bba8db5ca56364b9f53db5ed7aad63634e8bb7e96757a66edae90a4c4206641fcaba53b2e1342e86a216028198ee7cb0f8a6dba76aad0778ae01ca311810ecd4c4637da69df5ba9d88d23208bca5fe0a488be829c70ef0dca72a18dd4f2b1ec9c427029f54e637ccb96f2030e08cc73273417358f7c18a7a2213c38ba88f37718a75311fd08246ef9a9d2d1ca264386b95651fe2b320fd56a1d50ca72a46926ec50361388b8f554db091c07ddc1b3fd11fccd1b30740b53541284acdb8c6b35855449f7ebbeea82e6bfa5082dde7e28f801c2846927199fe811fc1b7538bf196f5e0a2a9a6141c77c3df27b7ea0ca4f9915b51f83aeda6dd53fbda98440130ff9885da26eae3dd5a6486bb7c4494e7fcdd80021132b1754020d63264b9306da6fea4f8f054719d1fd9de794af72e8827a66a2d986e814a9166cbddc979dc11d19d289b39df19e416ca009543b289ea907a072e784cc144195721392df94978e66ee98ec9a622de1c89ac789c9d1b22a595baafcc39d1fdf8ae236f0168c3a03c0aec518e7946fc844c14ae9b59cc702b7f0ae43b5cfb15c938a1f9d07b56f39762f52834a2d17b2443bec079388f88b2822a240059e1b2660dac32c038257efff4160c95bd1c9894f81f9d2f18e24e53e2003eb035db8212980de51188aaa624fd3b3027ed29514e11aa6b0d458e4a28937ad8d87265b8e42c90d2ba89b7f264f670aae7c122af451ab8719fcb427eaf18165869df02e3366671465ce9f62e89b8b284c6287cae671806a2603a1e9dc0d47058326f10feba79554ddd431f2bc59adbf59a9d44b741412eb46804592088b9011fbbf1e0b21a74f644ef18f63069d55989e0a59d54e282ab5873d0a2928f94372051aae21f2a2e09b8bf7586c5f7343bbe4cc66fe3e93a8a7e585309f94606ec8a4fea99138858f2aa026091c119811544ea1b8478edc31dd05f55d85a2d54a00f24edc07063c357538f75f6d0e51678a79efa8bba1a2d3fb0bae2a31e254c693291bc43d83f9968c45a825ea79164d37d2e2210753c6444310a5a3aca8479da8ba5a270e1399315aa74a7c0bef35158b438ac504267e744d9fa2b2d0640f2d60b5087d5a85d86addb3e8e052266c38383151e08b01dc38a9ac16a35303a513813413b2cc48a48e9976b4c04bcdc3f7bd2e51e123b3b2a804ef5e9544d38dd608d14a6bc84697e5b5418fadb96714bb5c81fd89076afda50653aec5f9d1594c19162635bef5aac9ffd48bfcd0797629f3c35333bef1eb364823c68f8e41e7be5dc2448533d31f79b0be035bde8c62928ea2509c8c9345ac73f2e4b013917945a5bfa6548bdb92547fbe146b091129a40b5ed01fb5da574d4bd8bf1d924f1a628e9602503a6a515ee46fe7a8fdada580b5c80a01c179f1d9d852447f727f2ea67380505201d734d398b48c6d850c1448146dd85e58275e8288f1e2aa9368e8c518b96883fa15cbe84487a20a876d7363418b16cb1410be5a3b22a74c707a51ea232df922779593277ab5ac5ef5b133a2a07de7e4fff55ddf0d776b252ee059803b358083c04b2109879c5c80e0418b6881af6a9895288a4c89c3fcfeb1c047931ef734e8ef88347dac5c6c481c63a47402e438bdd5205bb369eda724a385e5ff1490b457758a1e13cb7ea5767cd059ae25e5ad16859f990f16a158729d087c699cc824d4e8a77dd4b9dabcc7376bd07e69f772fe53e9bcaef809261b450a028c21d5287d9c49ef15adb0b32ae5084201eecfb792c1b28a3e629e213f5f3d8b7887046fb50ba9d8c8df8d6ce5162e53c7dafa787fccb65b8eb13a85f7b89447d778d3494d823d47da5c382d3ee6d68f20596412f39a87ce2d0c63d36a5b78ce8441d6d1a8bcd2fca6cda4a2f96f31a15b3f5583ca107cabc24395bcacaa204156b606e27899ec06ae41c5efe4a96a7d0c8b85041f32f05d89dbdc46ede60d5b63e61162570ef47107c4f50766b3c998e0f726d76dd981fbfae82e73ab351da8ceb9f0af8d58ba5a0464d713ada2d5554b0c8836144b7304aee8617399bdbffcd8966cabc0311f1cc4c673cf3aa99a4e50ae0ea81e07944fdde3704f1ed8402c1d9d8383596ec40a54b65ab7eac3ea6d79f221b73fa9984d2a365e30b03f1700df992f7f49a45db758eddb0b662218fea29e719c6ddcf40f448340a1294461e5069954db14a22fc37021d8313524e6cfdf135a9867222177bdf425bc13c3e2b235cb6eb47f75a61ad3c01ee4c460b5c3055b4d69b7068882b5de74f047fddb2ed7823aa7ef1e81e743da8fa63893dcaf424306ba73c58c51d0105badc78a7ba258fc8e38b5ec4913fda7ad475aad65d5f076f29f5558594c25176364123c95dd2b076895d7c544d442738b9360ec0e62976b43977eb7035ae622fb2f7c51898e6fc45ecf90072d325d8ee04c6ad753308e40dcda0ee0c383c434a1aa799d260c8a198f4e77c06621b26d324a1d94a66a695ef7c5d9f3896c2e67b9946e34b93dec9fc5d94fe81452d9752da4b825a03819a932f528b9b573af003a709307d7a821dad5bb300259821609dd624d937c46f5b208334b70162a6cdc7dafbed66469c554082d1e599ac883def0c0d9146640c021fc15d520d920238fec7dfca62eec61a0686fb6d25645db22fe28f9ec3bfa344cd4bcfc19790a34c59f5fad2eb293bc6529a4381a6db1c611cf3dbdb6269fc0b212e6ef6b98f71c7c87316a77c0e5c982a679d57a1abbabf3c68c6db07c3711ecf86c6be2dfbd3a3932265a95847e368b6d68b2f25306e87eb98290335f09894d941281d76dbb787645a16d9b819ead4af2a321f756e3890b9aabf15269001934d5f13e4c46e622641cac5951bfade26cf3c1919e46cd13bbf4f286c54b8cd8760cfe09f8641f89105616e6610ad0c76313179552583b4c4ec945852fb61b1e006eefd61c173e7e79f4beff35e94f5a0f52681b165111b98844daa71ef4e1895c5d630935e0cd29d06d13462897c043411f1ee5f84bd995436c00b71e14b7b0e4d7891624e598770f6d081872d74f06ada3e913ab848b2c15a418fd1de1cf11e70c806c492a6748dde02a1c2521c30927ef9c4cb8f87f3b9fa73007d754b9a3b8214d4ccaa662855ecae6bab85b00a3de7a19ea14430e5c7510207a4d82b5452add59ad308041257fe230c25ef03c0e72be83853f76518ab56226c4ff6990031d3ad2282e990443f5fd1a61d2e31ff309c4048d69197a26084fc955ba6621c50ae79411f48f425c95d03fb4ca41f20b388cd2c40fa5b3b732f7c6841cfc6de8b9f25268a5dd8315185a294f9480b69b47aad0c30aa8f6f5e10553f0ccc0a7f8b7417ba728d5f6e0ca7c6cabdd405a8441c7eb1e919f35e629094cead144de376c79a46e33c3b43ff6f2e2cbcc8839e8b40d6436e82206a1b032cd894cbec500064ecad0e62d3bad936078beb4e7bb6584e62d3db9c5c5266c1ca08395e045475084bc9e65eeccb54ebf4d4882fc38bb0a067913c6bd256e1f6d194144ebe24188e32f2488cdce78eecb28c03e9a64ca2d1dda72d3a01315a3584a35b9260591980b945e4db3bfadb54ab3c3d092c23721ca5d1b40d5d59312434804998a52970f9e92f9503a0c32d48cd13241a4091571f59b79620d36e068aa69f614d3ab61f5484a9cd0bfb48ba7717180ea32589e19288e49d9ee73e252ea9498676c3c70c5909b86c2042a621322b29aea416cc81ba5f387b0414b621ad03a071b2f15838dadfe5f63a660438c60236922a10173b838b069fb6cb87efc7b5fb371217d0d45418284b296b90f696e4e0302138d4895c8f8f0c6343a5612828b99ab9672dde0c3114cb5262667a364bd216bc45c5091aab1caf9f6121553185d61a3129552ceb4458c7302c986d9a0ce480a896e87a08e43b4ac56a432c283b80ffd12c729e8573cd2f86111db0429c551b01d65aa15c71c228cd9f0c457b5615781c8864eb477167279efb19570278d1c9547c49b963f4861a02922ac1c9f16ffe3711d8b14ca3041d9d640f939eb1e8a76da23a74278cf6544564d0478ee72ff4914ff5b409060ac522be06c0faadc53254e42175505fb1fe3a73d39ea70596dc899bafa6d105b1a49146d2d6cad0752e4575d1919d008e0e42aa1c964dd504fafed3f1e8688557e3a8fcb64319fd410ff110e0115c6d317049c42143ecbc0fd9282a8de23e3e66941e49ee8c3091e3a08078f1aa9815ba55ff15e738c9d430cf091e4b5ff808df73c140f306a94840040e518702adcc3dd661e8a70037a288240624ed1c4f350f45abe6989c3507e4ed1c36804263f336a907e471cdcaa96e1a5fa9f562cc26e36cf8e722c798a4ac2ac7c7ff22480594546226db280d407a4a2b56be0cfa88c5d51500bb462bea89abe349ab2526200e5decab61cf35f3d8b03a2a5953e741d940eb7579cdb1f38b59a42c8c3dab08b297a762c72693f0e0e01054beffc1e4e0288da45d066cdc44ccddc394c2835b3b9b62b01b21166e97944b42c6f0ac5f717a15b4795d16bcf60f65bbf18a4244eb2612dfc0709f95d63055cac502f9ae8155474134f5be0d3f2031e4169aff4a6baa167b79d4ba1b02f635aa06aa1c8cc21b644c9c4d2dd4718f6d23ce2b36adae3e7ee09e2453de051960bd8e9ba268e8afc4d2fc572229c21ccce03a1711089f6444104fce197789891f757a66a915eeae3966a6137b8121a1722d513a95894b40e684613ec8c1bdddc59866c814450224f80725a3ca0312a52fa6dd10d9a75559c250f95df03f4a345f5935d731a3ba4aa79cba08dd2301f23c421628c3cb7d0a0331e4f729085ca1076927ffca469d03a120310965b03b7e5b84e724e6621782af84b7b39e993b2887a123644d7fb15386000347783948da7131fa9e86d688eacfcf297d56f2dc5914dd5f020f544c99bcbed735e2fd1271a22fbd4c06d1019027234ac6f6ffe6754d4aa50b4765449e4061e8a42d02180a245da5e2f27cd0f0b4416949fdc8535981770a1fc6821404e75caa2c862b76ef53d3d0355f9d237727d4d34e6a0cb7e50274f54ddea1f77709d9aa9e1b743395e819541584a6cac2a2de8e49869f0dcd0fd2aa511d8af13d1861b87f895cd13612a904fe5bab3ec753308608d5d5572e48fec40295252a5c8b0612847415c91999eb59bbd5efd5281b7c663ed7eb6d4699977d77a8f397f4efa38925c6ad4d934342c14d134638776ce0438afd04ec98cc0aadff8a472bd0eff1313f70e1bea064c3532759a03c836119b8017c346a8f58dbe9ff7c542385f0ed72a5c70d9990dae5128f80bf7001854162fa9c9ed20876d9e5d8f683826c35aeda6598cecbfce1b71a179ad8213976dc2cd7eac9ad29aae629a9177873be5c68a1d0d708d3d77434d69af27f7ca34431fbff913b206324c85be055a78aec45f7314027904a436d345c47751707010464161520b25a4dee0c16396606bb949db59ea8aab9e46a331b007b51b9500abc7e64c7871cccb835b11914c4e6b6418e8387c90ddda320202b927b6bea5d64b5531d41fe532d93e2cce4fb541603b6c4e61f1b14ff364a166936894aed439a1ba5acdd699ab42158d3d95c2c13f73077f221f7c8d426c89aa26b54b0ad3d4bc9458aec34c84baf93a8bb89d5d82386baeb5aff678181e405132189c6c3b8bced0d6a847e1e1ae79a471fe5af301a3aa000ce87143d74888c5a25ce362b044d3fd2375eac9377837e0ef58dd4f060abac98a0f601db8b6513fa9fb99eb060accf2943ecbb3a2a86a57b08dc655caccbdcbc6db4d533329469fd008dc0db8c4c6fb3445728f289aa087f5421777a979b5af51e3b1981a18f985c0549a57e70f3c6a648cf586b405a09883605a1e88663552262d6b2d85b0c6923f1a6f0a5666ab24538f61f4351280c9ea95cbd423e2723d8e432961cdfbe61f3727face17cfdee2d2ec092078f15977a4274e26155bca985c70beb5bf2b590f5586c98df9b05f2968e27c147ac3ae4ee71a86b109601f74c63aa70c078155125c188ac0c825d3bac144bc120ee3a610acd7c46207494cdd42bb85396daa6cc5b6c56acdc52b1efb43cc633f8f79ace71c07a0a340d6f20c35996f06803c51fd8ada81bf599930069e8ca3aa934ae60e2336b10417df31867d774311bdfc0acc9159fd0bcba71200d6501a2c2a0c33a38c13d2d933a73d834d3e67f8821e3d3a80a13afd4bc04c06480998b806a34969b004c5d3e7de9eb1c72d3b70c1c3704ce6228bf19f6027e6a3799069d3f586f1758800dc57e47d49c0e432787054cafce4689055fba8ffe5337801c0cd4536e54674a4bb4c36662c653e697b1850fcd714825cef7b372a4fd8b4e3352b32fa2b08326682e7a998ef458749dfb3f91b7687057c1d276684378bb7ce98ed683b5a813601953a56f569a098c2cb35763e09739bdde84fb113fd01c60724c52b5db4c0900e0a5220b9e4c7348fa5528217f13f7c8b876f973f65040f18752811fe4c7eff99f70bb5f89145140fb288fa4c96b144c2f6ee5bbca79e2b3edafb4d5b07e0634587c678c963e00dfc5a13022852f4d5b7781abefb49aa0425afb7c4b83495a7c0cadb83f01b86d11ef86b33c6137f24a1cf85a1088c5c32a11b4cc42bc162db49015d2c7e11564132413c3a9ffe5cf0da661a4f024de2e14497bad9b778148c00d214074de19cd86209692425484b2909491d0f3cf79373122957ae43230941c4481587ba5dcf92061fcee87d94360c6e36f8fb499baa6ff1b66d0e5e9fe57d56d35c8daa268cb8981432c1520b51a171e67aa570e95e1c36a54f94cf5eca088b44ece31d69ac56fe8d114c291e8dc830ab13b9ce6afc620c980f2843cd057ae947bdc73d4d3844f1a19dd417633a3c1bb1f08b9066dc059d5f50868535e84c0c4a53952de14be70c994704b309dfeeed912639bec5779bcfbb052ce27c284f54e4b67520ba2dee7ba3f05449135ab94c014ed40223143315670a5c9bb1e24b87f63952044dc6cfca3cbbc78b960d1d9480a526e00a510f3f9f549c6ff1a6b33861897dbb2ed12bcece90a35e7decff9087f20b22c52702f95ad3a4491b65adf808c419893c513e7e05200a4df8325340dfe2c324c018698d35040a9d3566023f49084719a716ed8331a99af7d7c8f1a2f29dc2428f1536fafdce5bf816cf16d355490763261709b2bdddc99459fd24693441818cd143345421ee145c346be54b8866de1327df0245872f77f282d7bec5c3157e3be21feeae58402b58a16cb19861fa9060d6dfecbedf067eff509011fc932d5718df90f23d6459117f328e8db5e080485c108d416c3e8df3d7fcb015f8600c24ce21b90b59c67b02fb188f38081055809c087efcc9248ea72c223f9411fe41082f03f3da2a3cbf3bd6f72d1ed9e2d5e572065cea6778c87f7acc2d974e4f953cddfa8c9ff9cae9718d88204919ba2006624ec247532b3e8630dc09eda5145249ab027fd3d509816ab2a7b20d3398925f93d6fd12928cbb880c7edd6f4df5ff5a0a2304a21517549b40b44ed01c854df02d9e6df2d77593cc38e97865ce883fbd0d148f43a0be41ea08646f01ea42bc8b63bdc18fb81b8be83376dc4d355de067458a9d0165861048cbb1a1e06aeb5bbce35da0cfa04e753554e1fbbec5cb4b5bbe45798f3513e85bfcb430a87ee4ac21283456b90d1f940bea0a6a86a8281fe3f32ca2789045140ffe62f376f22b0f5dc0b06ff12678c7f9109f31691a9b5ac2da5282145316fc81698427308df32493f15262b93ed454f8d8487b11c1bec55be8b0288dcc8c887de4fa3382d5ec919d449d6db1b1f33219900e1fcc2fe13706a23fc032de27d9310ea73daf24dda6e62d9e0573db147adcd0b520c021d6241c96a44380d9559e5586e7e66043f02a347404eda17c966aebf4a978b0eef58d863ee8996da3aff1dfdbda843ca1abf8d42d8e0b3d6b8eef63e5ee1f7f9549ffb46c53cd8ca17d159f713862dca9168f2d56bcf281fe5ca4a1b212244acc608dfd60fc2a7e934d738f9f4a3cb947bc8b87b0fe2bfe31d410798f4a555983d0bb86b039c9dfd606d7490675bfe2f153445cf8109926537d0d9b6811831650ebfa4fca3bb7cac9db1527999d5ba2f6481dd0842a2776201e18870efe0a478e582addf40b24ff02eeaa9f64881fcc675c21fb20fc585d3bb8ffa7a80f78c18f3af42116645b04df0091cd258a8d40ac6e9868a64124b5a3887ee13bd30ea938da4809c617d24a9b5d950862d60122d1739037a03f636af24cb83b9bb086f521173ae3094c7c136c4af2ef57392f73bc7f951e88f9340b028a80c5545b608cd852073400240e61f4239d5308a5a0c525f006364b9bc67f4178155a812c09847de00402f36dc1840db4e92bd0864f835fc55ff029b007ffc02f7a70ec34c28dd2c69c382ede9fb79614fe8d0b01ff0792b6a54c52eedd64078e050c052b053a9ec0801918fd86f17f14287e5dfcea52fcff1ab89955e960b1e108f9fb09263e15666d18575f89134cf081cadefb755b2d1cdfed2e45e512ca7cfc5b028beb35a4f85b8dae41dc5099bc567c309accc6cf7b8f1aeb46f7b4e84a92c6bae7bd860052992a49dadc6ace77a707a7f55ad40670756a06e3a7f97dd775defbb8347e98a992a4710c6daa2469ac5688d1a02b491ab7c92e18718ed3289b1bdd129316802f29c36867c46cd7659d756e11b3c8a6a6995906606e64ca2ca64676e006e6a8c966458e12bc37ab442c12a7caac0db1051eab348148c5e5a9fc118154c2c008c50e5a8b0c9e0cae7068e869b17a4a3a621b31b2c394f46a339255e1782c88713dddb8fec2b1039c247ad87c74b6b4902262560acb588482794e25c53d685b34c3db910725cfc60520ad2e288d170f1342145a1f521c3199906215379c482805c900bf7eb8a68e1387b50d48e15893051a50289b0a2ae68091c3060586868a6c476712cf9b6e0a202967c8203e893ef9b5004cb8183b80e88076a105872f5b800480e3d11014a67201aac354f56b1aabb3d65ac9dcf1161cb3ca833e00a9f801c2b16259dc62964547cc3e88d91031cbb2117488ddb038aeddc8f8b16c66df02bea662be9499f3a0235e7b0764e0804b9616f18ed3250b560e9ce2fac6f51779864309e3a8adcc0408a4022015504c21f4d09c21a5ecc0bac8c51cfbf460b1beb8c7c661b1d861889db21fd584c536c5d9c7ca041789b167d89b8cfb23e118212d0ce8c398d1d4561a254228af58d3cd66b5c8cb2c2aeeb1c4da11afebca8bd3e5d55bcce37489758313816a6a615828ae7068101fd8b002c98cc5324414063c3472ec6011fa800dd50f6995538cb6e60f0b96b634879ac106c65e6c61a980195ba1c200afccaa9ccc23325c92891c3e1b845117379ea652e241650a1ac4622b47111752a72965758dd5b588d775edfd19af13c469128a7c16ab0e2d6ce400b618de7448d55064a9c011c2c559f694013e5b327888ba518f8a60c29a481499e92897e0d88209aea7b8be71fdc5755fbac3d1b000c71e31aea7b8be71fd65d2395ccb42e5cdd5d855e197976427f07895aa5a187a712922b554d4ba76d1158704c8504181925494d091b3d207cb53477ada005c9ccc5739e79c59e808cde663ceb9372189d6c2a3c3bdf5c50619a09980320396a19de9d0dc5c633ab63c8600aebd08577c26be12df5aa1af376028c67e380c854082c2880045d8e06b82f161f37109a6e870afaf157c4f2a49a4269ba4134f4934193cca080388060b6c4b2fc850245fc87cbe0a3be7e12b5149703dd96225cec569122d436cc1177b34298880b20c4726c8c4609521d9e2c1c60a8ba9ada6a76a6606090312529bd452ce6827464905d416c5664580385d4ad9c41f71ba945211e181eb29ae6f5c7f4be44c82eb21710ad5c48a8d69298dad16c5b8e4d88f99732827f9c3bd9149b178326ad959c1213d3ef07bf27a6b9abd1115a94469d68b1c440ddca02b41097075d58480c2a08268284dd13441f4a5c18bacf820a9c3c4d3127d9a150f007436a5f682680603ce2787928414874b2be0521209501b6c34e82ad181ed49284799852175928a86d821a11eb3192928b3a00a7ca9a4a83292aa51801dcc98116519a26f404c1924dbb8329c31d500414e979243169253d98f88e54d8b2d1d1de1d4080c6a746cf012b6107d7c8e8c644c8db0c20003c301c2942b96bcd2922d3d2380d6387e61088239ab71aa51d2cfe69fc0533d62b470ea11d2d9c0551343f3d0b4443171b4b98806792acc1b4943500483474999c20c4a040300cf86a318693a1d867e6b4fdf01c46954cd336a588c2df0b2ba8a481f30244abe10ca72bbdaca30e2dcc679270330a0a2511950b1a8f1385c4fa15fffff936de30cf62d589546aa785dd7be5dde8338551a93e21c4c6cc1d54e9c053a961402ea4ef36a01b7aee94aa2b5deab05f28455559723580bd82038b7a3103dd7272268fb0444e46947113a2e692cfdffffeb0c57a063f7dcf22d32b419bab9871932c4f0e1c30439c3f1f831ba5ec35df003058f2ee841b324d4b974477d808a4f34401f949c27990e8a0e93b8b2d37c41b36394ba41011a26e1a0f8008d3228c42371f8babc1785e7387361e7c72984d6ec005f0971ea84648120e4cbe9dabc826886f0fd3aebd2a646393af506b355d7ebbda7e3b34563d13ddcd7ceea26c4a9135283ef817bb74930170070ad8739def493f5ebd72158c1a664a347b886d5e4483011136f54f5e3352674b5bc01b299a01bb9b667b87cbfd6dd857b0f06eadfa5e8b5a925e7bcf5b15ff3cc7b4b34b5aed2b148a2ce48ac387736e79cf392c8ca7b4b1c8f3c546452b33ae9d4e1b93fa6e4513447f02a89850547d34e5309842e2458d46af43c779b9255069f3cb5a533b9aedee9de5d8aba0c1369735d6bad993908d0b5555bbb7856ce07512c32b44814d4c192c50ea12af2f4526b0ef2babc378ab892a4225abf7e9d75ceb94371b7bb70efc15852216e527fb8fd7579ef1514c464b9c4f7678f38e79c33fcc37aea9c73cef9f971effa15f16303d73d413d8674eea9b8f3d1ed51b7e6bcc4798e029a5bcaec2960bbe6bc64f9973a72b510cd7bad92ac90db9d00d9062dae6416984ad64a48964e9c3372770d59688a4a2293e6ec3f8d3c157db0cdbabcf7a8d7ad766577941d92ad595bffa0985a6b9f49898fdf507d5a99f5c346ed5d45e4bfaaa2ab95cae4abba3f1446aca80ef9d65aa05fbfce39e79cb3ce39fb2e10b4d75e72c9e70eeca63db1a45b31c393c95c94cc7682b6339468de04901f216334ef4d0e77869dfc73323e51c8fe9aa4b4cdfa532e65b51b95f79e70b25e394a0ecc999f89230918b113520cc80f2eb3bf3445dd14c4a9938817acab5ee8395dab7aadacb909ee56e17d523cbe4bf1777633c5ffff3f32b25ddefbc669324693d7732aebc1dddb8812a33903258c3805f40504d1334c866168712ea13893ae0f0e8edd2860d0d5c40dca17732549f705388031befc7b97a20281b4b9ac4b6622e73d10d0987adb8089a87504f3d481c55a33a52dbec27c440c0185d8c93b155bd1b95a6b19c5cca5623dc68cb5d65abbbce59833176523d408e87a42d9cbbf67fdbabc7746dea564adf5fa7c4de1a3267bb018ebae4bb1eeac8ee79cf358b295d01b83c6bab34f96586bad35dc61f529ac186be24f6b8d22c3b992a41d8639f65effd8d24d602beca30053f0a1780533cbf7de9a6775bb5be77276eaddc536ac1fee9c9a4688a074315518ec4707eb045a8c30f6c9cb4189dc3442058d2b2ae2b00071ea64b5b6dbd1bb2b1cef6e736f1f7947fad9b065f97ed1db0d9c392afec2fd1de9654b2d0990373bf2df1f725bf3acb7ce35036eb40fab07eca3005380d70a2550da6a2dd95744babcd1868f26028dc4aee06a27c7fa600abeb2a009d78d192caa191a162ad088196d4702033732a2a0397668a0750584b0be707f47fa593247b70abf3e9882cfacc91eb1ef4ae6817be1fe8ef4b3e7fa4e684ef1ffffffc31a865fb8ac99b412d35139470e28c1f51207c0be0b6a044b4cd8388d02a2c5164a2858f29d8eef52d4369036d7b3d6f17d8399dbffffdff2346de79cba9bedc9dfd822fecebe032827fd623bd67d5ddecb56d4ab8b76ed2edc7bf00de34a92660e7fb49115c37bc924eb5b2bb86b32feef5be7aa0b6873c771ce7934b892a4718e795f772999f7dde3dd42e71b78e95959b1a343130b32feffffff7f1b4777f7e730ae4dd9802b499ac2b7841215c6f5748c98151882ef8e1e074d08cf1d5ecbf141188b08d4c1964c08901715140303f2321491f174a33f06369764f6053b96403ec078b048b9449ddd05399e1f49192e353a17a047db4c4e65697716d36a0c5115a04e0c26be60dc121aa984714b103913079794586215a710f182b7a3d026767126c55882f1cad02d46c7da053aded0629ef9021c505782d576b7fb9ab8effbbaafebbe7a02a18877b71092117629b9e55b687cd0d99de37c85c5cdb38321e64a9242d81cda4c6861f0e5b19bc78af3683d70b5aef1207311de5b735c4952073b27e3c50b99299b59e3e564981e3c83f05e228c4c14cbc432915d4a96c15bc15c1926079cf3cd6ee38a51c68863fc311a193d18934274ce5a8628c24706b10c65209c6baef9bfcc0ccf63b37bc34fbcc128bb17b29c2d3e4c41514445c26c4cdb551aae4274c84008aaf4b563d820f0bc23aa24a95171ffd67ac770c0b38e08462612cb44651eef8a41072d1699126e2c6947156c8f9956a94e28adf4500d477c48cb38ffffcf735ac7b0d86d9d73afcb7b8d9a2b49bad3464ef177dd54fcff2c8a1544ad63a4daf867a8738898f3be3bef2fe79cf3a2944a923277d375becf0e55493e2e467d26ba9727c40c6d76df006f8237c376054ba9c848ad2aeb0687271016ae14061972846d35a1727cd88aa10979de8bf3c481e2445dfebe896876030d8188db45b650ba3237f3cc7b7d923e523e4cf7df0e2239feffdf24c621db0ca5e3998bedcc5377b35be7c975a02eb2cd59679da1feb5dedaad1aca72ac612d7fdc187140fd8428537ad96a94264afaaac171c22b0a4588ea0e9f8656432d1facedd3e2f5f3776271bc372e1a72e86939d75cf3a0a3250f483453694a6f740115ffbf062ebcbc7500832295f8bd4954712bc7b91ee1b6c5b48659e2f18e9185075934021a9636c2d8f6c0f81f05038a6e6dce9f0f38ba4c3a2c82155bef741fbb14554d87d65a4be56e726dce681fb91bcc9dda97db7617ee3dd80653e7b6e2b914049e6e76db28e694ecbf1a870af651ff905826586a3610c164d3f920a94f3b67031bc7b0201023569fda4bff0ec36c49be0105daedafcb7b6f0437d4561181efd7b9bb70efc1d1d76e2a203821359c4058decb06d418fea56d83da6d64bb65cd5255d30749859650ce257ebd61cc3e5d39ab215ed1abae628a952aac4fba6930809209e80354b3e7ea46501104d5e5bd51277b9353b2ff35703e34c7ad41795b52ce4b6c1ec884c8194738a24f9d8c9e3955e04556d1185b880e42fc2677ac31642f582bae297ec05e78a2a8d2be8d8583a495cf56d40b975188c3b6053d38e17b1f10637f0c15049eb7abdb3a5766a8dbcc453860dfdddf912e34e60df4f2bdbe32d1bdb9047853788a79c1c9ea9649ae24ef5aa1a7c2ace5bcb89eb0d9a3d0837bb91b30c58fed7c754e1c8cfecd202f73609851893586282f52cb37311418628968feda3bb79fd5aa8a73ee75b897ec40cc9524e56c526bb9f7b7b9fd0145d520979c73ceeecb73596510f07141badefb0b4ffcf0c20a35b5b1650dca3e42f5c8eee0d8fd2baeca9da88cfb130abaef2fe898fc0a6e21be5b64cef93632e65aa7aa0bbafdaa5cde9affebf25e0d43a9dc9288ee2edc7bb05173af3a1bb3db5f97f76af81f19b6bb70efc1523ac925a7af3e139360dea5e48e6423446fb57338c3b3cd1a5ab05c7f3dc01545570d2b5627242c900c4b2b841a77a7d3ba20a409769bcbc7a5dc2e85b779bb414420996fb7c83f679d755eb9e6abd641361ff4e4a98ead79d6e966371171b7500ff775796ff0dbe7ffef74d9eec2bd071325b5dbffff5bf156942168c953114bc8ff931051bb0bf71e2cd4648d01abd62e4a4470e1de83939c87ebec1a3dc8fcc3fd9915417efd3ff270ad5dfc043dce8aae0b9b56eff6f92e39fcd8a5e4956b17c156d7d94de3e99174f139de5b16dc8d8d11ad6bbb9646528781f0fe94cad5ec27c1144d910d0551b20c2ac3a13910587cf1641945718053d1acb9d65ced1e4bb64c179d217eaab46a6b9e3fddec5e5a4952bee6a7e7598f39377365cdff233c7277e1de83cfa4feff75ce00b235cf2cd993ebf8ff3f63c6af3ce3faff7ffeff3b33abcfc4f7e49c66ff36487240a88332876c05970f1a1a9a5a04ad9c35172c9c50a8b9b56837c9a5a2cb5be3dc1f0d225f0e6d0091148303d09306ac129a0200ea8a1963072a359a19ae64f3c62e7d42ffffdfa4c3bf3162049e2d8e9998cf3926ca71a8c4e89fccd20e92c9c1777b6161881a6dfd099b794c65b2bf9861d3c58579ba6feecdfd99181dcbf9cc31a75be5cc8596e795f72ead2469deffffffff603cc9b58e72d51d1273feffffffcf3c73ce396b96c3d1fc4cfdffffff3fd9ca79d7bf52e8dcfd689afffff0488e2eabeb8307bfdd7b5389ece052bb95449edd45ce82d87cbfce19facf67ec1cb0396be099dd41e7abf1357a43bfacf82c9f1ccb7b59a03afffefd59e7bd7dc23867dd3349969824b32ee85afeaa2d529bdda5ec96f3287fed42e47002e467070a30a2242624f243eb42a7422cc7456c46058c30186d433b89a5967f2eceaf7061055b51430c960d826fee8b0c2f058d8916392f33323869f0d13716ea2b76213f9eef2d04f2d603ef6db2fcf9f3ff2ea38d3b111a5bfefcb9058c2244b4d5541569cd087d7ce8a9cc951143446e40cd34109c73ceb9d09973d790c753d73d9169e69cf316d2c8f94cef745cebdce49c73ce5a6bad13cde596f8d2669df75eeaa8b8aacb7b8dba6813e7aecb5d1354ba82593b3940180fe57babb97cebc7b97be7f95aaf6d5be836a312e79138f70de57b2f739e39be5feb48ad24691b902f891772cef9f7ef6fdbbfdc81e63c018dbdb71bec11ee727e7e046368741ed19b5c946ce6c4e6f815735243dc0a9e0ca59cdcbe82cea71ba00b881c1aa20b900dce928b4c4d4eb105470d8d544b19cdcdb105c6d03da181ba6f128c8408d27daeb7845d74c67befcedb9b657f46ac6eb33b7cbbe09c7360eebfcdcab14dfd945b8ba4f2015e2041bd8c60cf2426e7caba1a4392592ba1e6a5c5c4f3d65c7d777f47fa51e70f3b8efb1171b658818a75ccca172605bd9e7288437edff75754dc1e20e252a1538524432b3a8bff95456af15710ff15026c98ac889e30188a74ee413c177aa763634069addd13aedcaa6b9f7330364613df3ce56dde4933da6ecde594336f4407dcbeddf7dee9b88833ab6d73af63778c626ec44de6edd309a2465792a610ae5530e77f88edb84afcf77c22f6dd83ebc83d923bdd7e7349bce5bf4f62ec7697b2c5a06c003acc25f43a9fd083c764c670c67ec68cde310f7d2c09ce14b4c9d1576272f22cee9efbeba5d328d6fad52dd831f774f4e0302fb8a0c95ac630c65a24d6563ae709b66308ca68e3a77d262561c930a930e64918dbb5d64baeac58eba389eff831e164acb9268988b51a6bad27f83c269c8819df91106fdfb914216e360ca9368586fcecf62a5349d2b513afb737c50cf1cdd905f4c4451418dcfdcd263bff460b7bf2759c313ce91a76bd40b75a4e5e2c2d9956314e9cecfc714788766eaeebf2a62ab7d559e59cbb278827278a3956f82d899027ab659387ddca890919d5fddf0e807d25264e1aa495b45faeeb02600614f17d792e0c70021a08c3083378821e049848a8b46c5d298b044005004319000000001c88a2340cd4566e0e14000625e850749c6478582a8b83227120200a056110c4510cc3310843510843635c3a691d01d066223f6143ac0d72054b8c38861affea6ced44ad7f6241e66d860cd43727ed5436496409505c03388c554ec7b86dbcca4a47ef5a61f8d6bae12dd96394839ad15bc8da254239769cdea88132c6a357f47583bb4195c2a8015160215b8b8fb3fa2c18db7227058a898f176d0241f9ac051c746337aa9c86edccf4ab99e1d185ca5e403d6870228b311ab9e9adbc07c0e8443c3b337942e3788dad087940d68256a3fc6ff73085867578506b33d51eab23607dfbb05d7442937c3d46f6ed96e0810d918294b794bb5dc3fd22663b828646ff40bcd1768a04263342793c0dea6dad08d9d61979dbc2fdbe32cb7b15a9eaa93fd9f1326a00e3a22d9fa875775f9ea013bcd1ebbadfdf7303e2f26b4798ad14c8dd6695659211e5440126cc2a7426f48d7382fff7ab4270650542fa408afba40ef42624036af43afcac84483cb45ee7bc734555309aae7bac5d2de3010679d36db7388f538cd439e81c35b495da3142f99ce884df4f7c90729367a3161c1a67d8e4255025e58b0d45e39423c32ce2bfb444d6768eb10db3bf59015dd2f29cb350583219357f37217498b9eefed726664b426a8a35de64cd2971e39a4d659171aa49c973aacb921fa79096228e7e7c74357b05c339717f68f90d6075cc943db8b28d23123c8fde08cd5d7658cbda88f03edd0286cb0939fd3d0696cfc1d2f2e4779001cfec39dbadad3a5e9647851e0503c124aa1ce695b02ca490f86232f8780883b88d50c2db25eafebf7eb2f3db742e25f148cacc8e054c2fb4b3c980c0ad5199f81cff1d32277341b20ebb80ec5fc51449a5c9c49423fe8c267e2433a3c5cc8f68560f6729f645541c1a2a8ba4855b31e83be0e6432ff5c3b21e720e3b55497e750567bd99c7354253e1ad6f80e987aa62e65fa7bc01f93262b16e8e3a80cd2f78a3e5af301b5321e8e4c618de9c63c64deed08a50c3d6dc931573b3d318e37ccc80fdb01c6939c3998dd58ad6360f63f8c374a672d086e1d139e6bd9e6828885f796651f9d8828e5817d04d75e9c1583ae69e78b18830aa412b146f5df3a7c68120ee25b4a38b3b81d20e653cc539d01a8887390e2ea21a34ba3fb27c8c47097ae77e74b0f11eb9951081599fff0e61dbe2d1f6d2f2e1b6c89a56012b312c16a8594add2f942c3f568b8ee96530128a55d7a6d1c4d16674c2a1a21175d234e23b3ae4c29685f0de0933172111329711b49de48518bea31ed7860bdffd288da9b96b9a09da9d58b1d4a803d9da3502341ada287bb3ec9ff46ed033242353127077880de464c72d0e99bb58667a5b63bd44ede51d88a73a167dee15821459b0513a1c077831d7a53ab00e7f318dcd7208cc25568285029809feea95c513746f35e01e083dbf0350a81af038c6dcc515f2186c96c07d414d3b5fad4feead4c94b69c5284110867bd22340649b3c72ccc0bfee28f43514e1ae298a7247ccb7632da0ba4bafce1f4960b82e88a1f78c929129986b2bb8cffaf0c5622b1e023a530436c2b3ea970b0cc5d86e617aa391e3b729a1249563c94c404f95ae66e985076b0018e81c1ea91eddb5b4136208e7925b9a22c142ae36d136df224476e60ddb679d1a668f95c73773a4749e19ee7c3ecc4d50b7d6e1d723ee91f4039395d10349834bc09f97126275c99b8c5aa3163d6a38343ab7a62ea6c39314adb40c22ab500d02f16e8629292220f6448ac3b98e399567c62cf9edcfccdd95317838902b76460b1da7ec62e29a902c7335772801f64381a3ea2c751bee5da09f1627b06f52b25831be0c73e3663c875d424c1370642a1f8d6c0fe718487678931ce4947a82d36b789c76db5ccd07d336ff66b0c8dd1d8c66b73678d33b85f3f8182776ab199b98d9042c25798dab7680769920dc5406077f8775d75823bfd07627ff80e318212fe44dbbda55508e7c98ba62b93aa90264f16a3be7812b48bb9680682e943a7863f2cecafc8914a729251b95fba4b7d714488896521143bd7e800ebd4256eae25569ed5c0f09d26848a0d76594dadc6ede43d3bd74c3dc45c5d56278467b357024594498e939784d4d54ae7996d3d5b41b090e7b66a34485e08bb4ea9edfce6da9db2b0d0383d6f5afa3e46026b71423211b1723135a884b9c392081361d7e9c60c154d07cb0274cdc0d435ac0f18420e65907cf466269b5077c96341646c903d4a5449a205dfc852d09c4d786c14833c1e0f103d34e30de9dcbc39fe48d9b0fb7453f72cf8c00d2072a145ac2f56196368187244ee2e55ec24594ff88da48a42e2d67bf4bac02b06fbb5034422a6f677695009c866e315df705c7aa251b7b3126bacfa168992179f8e696321bb597215eed41bd580143ac173183baf83abd681b42b96415264e691f378cdaafb4f8b763e43d96e793899d8ae163ae3ac5b53d1d6d96b5ca1203c86a33900a8c8fd0f847d3a5a458f8aaca7bd3c71876a5292a277aa6686e898229e54d43828df932b42e36391a1391b47eeb4c717035501ea33d1f6f7812fad10d5ea4651e7a6e46268258c61419beb3c3e321162a8b2214bb3e2643c3e6b1f5241c1d5b50687477c74952832a7982320f5982dd076eea6650a70f4fcf17ef1b8fcd4b1c48c5daedb0008ca936c90869ca810aa6205288a50f6c37b1a119d318ade905075db2bc81c6ca723f0f9b8a2d391eb1a4a2c54382faf27813cee0e6c708c8169e4bf5cab5e5eeb8e848d579f9b5e3eb015c10a4a988037442435725baeff1ab0f1ef20e070370c51e5b36ada146cd04623866b48c686c8b5e3ed97338685bbc6090605268c1175c766fe65243643b5d6171d4910f91a7114f453cedb990fa5dd22fea1d3e77ceba766431e47572467dfe616e279da122a8039fec24cd9f241e95fa56ced469a420c3174308e66ef248d4366072b8a621970e6c5f34c9d9409c5561c5eab0107b502162b69959000f1b630fdf025597d4b233047bc1ed5cdf2a39c413bdb46447562e6937195cd62941b82a4872b8a34f84e5dcf5b2b9aab2dc81cc4751f7620e9701d51dc8e89ec418e74e274269c22e54d6450993f16dfd9b663506f4d8462fec932ef55453915132b6cfe909b044a0fbbedc085f095953e9b1eceb5573aa82ef5cf2b5c931b0925ed450922b5456e8428161df79e05a8dcfc1e62c8b027686bb826e159a30f296688324102aa369de4661123baf8f24ef51a275c07a3116e96ee8458c09f50b7a84034c5f764d623b25374de595c1d5fc2ebc751c1ce2bade73416aab12ddcf20f490e302fbb9136f56516ee755cf91c06d56367d54c18b988ec23b305c2db5f9e8b99e4ba4284da7f2238a83092a040cd3ca87bb8167601656953e5ba1db4bd06a07d7c8f7e42a5ca5c0dcf62dc8d0c0bfcc83f6220e8afadccb7adae86bc620365f59da7b30a95757458a1b057cd0b6af5accf1e298968d9524b353a3f2bfcedee2e1daf468b3932acbc992db0b5265856e7d80cc605cbe8abbc24e3b50ed976a93dd98312779ae6958e4f86d302dee0d194def8787600fc483928e462a74eba28868b866c1cb3a3803d69b980b63116f68a1a458d9b9bf8e11508bf8d5e52814f67ab4e001240b377a69175f277b5e64cdae543bc126eaa3482286cc3258b1906dd107bc39c2f678804f4ddfc1684433a6c3813fcf162024e2fa8d9b6d3cc46a018fc21f720ccc1014dc5735bc836a2406a0833c917e46027c0c8cf72c9da1caf9b721f16dc5d409f43b7d982c2573870fea5c387189fde2086b4373a9046612e81a19b3206f8e5eebcdbe742e058e5b8102ea994c45dd4aad03f43f81f82e8ff5cc79698f5c5b449cc02018743f6c51689a89d7b060524a163c342ac831e18af45616cc8ec7786def507c037fd657dce71142397e2797d7e2498e4eb835feae43edbe47efe299135f78838c8dcc9e9c12e50d81df1a8acf8b82490abe049a681945137c9dafa3dfc771ed262f8deddf40f3c53b1287d8355efadab03efd9e040db320b2f84804338551c7cb7f35e10c124845b8451ab3cbc53fbee1f09117eefc1112e791e6b578bc827e0588aff910d6ae1c3d44279772230a2848cdc04ec296cca563e886846337393c5b940a9210daa8f98a8d97f4322365d780642884488a22052a01940de3f10a754d68cd3210589ec22dc32a7f410e7fb468f485fd4a01f8601e4ac1dd30f1694c2da649da2ac75bb0bfae2bd22dc470cc38184627bd425fb29edb20c0b1f7ffdb78598ff3d0578330d309ad46db9ea2e1febbe00a44d7e7593c98adf572906395c31c54a1cfd4619d9f81dc3badc71087bfe4f2b3520eca960118cf062672500fd44b80ed990f9d706ab99939c8ce630173ca930ce07a83b5b32fbb7d2cd1187b73cc45403406e295723f1de6666eb73b74b9fc4cec7c060a61c12d8f8fbe4e6d7bfb92f26a90d5231eed8829b0db142bf2984a58d1038a71c1c8ea27ac319c50a14905cd1f75421d20ec3702c813de22aa77f8bc3347af437c73a39cb7088236b46d0e61c82dae8322744dcbb0fe8315e17531f09d1de2593d99599dbd226d6751a1c9fd7a47d214b1c583cde6093359b1402a238abeecf613d8bc8020269fdfa10583720a3572599c9cd9407acfc128549c1c61c88a322447de69caf24351c3828432de6a3d2230ec6234fe3b53c53047a5f28ac325c7cca6b6b0a04826d7e1bcca8738da9c22bd150fba6fafe2c7407404e7d32c507811609cf26f332d207958d348637cb775b0f1a4fa90013e65bb0a7c51a293860639f7a34b6c198cbc0f075b0b672c39feaf85a45a2a9e5cb48f3da619de124d38fd2c0267b171a9587311b71893bfe4e11f9dac5bbeee73036c8cd3f5b12baef22cc99a994b2176c26db00be0c94aad47243fb67c6556dce362d4c6ddbca1ba03fd577b4ad50f569e0a09a3ea8454783ecae590ecb3a560bceb68d62b4dee41a1b345792ef93128fcde44d3e33ea4d74b1fc5101363a427ad33537689e1ca7d46d86b4bb89e772b02b545982babdaa10a9c33f57de9b4bbf4784a14e0e7baafb34cbfcf2b926e6ddac492c04ac9e2a56c9629f9dfdba3f495d676503f1985aec8ca5b577109688187e439c19856e85bbc40bf31dc3c68a9cafdda496c34a6242180ad31b0f44b38cb4b08e70809e13ac6fc1ddf491fff53d8e5aa955586dc5f4d02baf95eee0a649b220c4c9d8d17f95259ca1d44d988998ba17c9d1b138a49a00b9b5792401209b78a332501dcfd30590428c58c5e104882c2268324f41a9295a0223d71a506fc4f4c051e0435168170b49692c6663fe4535e3993cc0030abc90f745b383925061ffdfdecc1047c3156fe3774d7a2297512d5a4339b630cc6d83e49414a157e2d397dbf8a2f78545f761d955b3c4aec20707d6e01eb61acf3c738ffbd1d0c6d5b343c2c179bfe1b3dfb7c43886db8a1b9f57658dee7c063a05badd0ace4dc49cd6b6673310421ebb88daa16620b0be3ed029c4b8d1abcebc4803e7c839a3ba5018d758217bf4d0a99c5647f0cb4dfb9028cfa009f40bcac9af5af0ff980dcc48d50342dada90fc467be18d7ff6281cb1f7022d626480110af49fbd68e49011d2be8cfd35d309fd9542b0450bd1f5f2fb70a44fb961518e279e0629cd6e45a0ba1b69fb017e3b3cb6bade6a564ec41711db077e677d26848db8c0ec174866ad24045d802b58e0817eaa00682f31abe29fe29b445e62bb8c264efd872d8f102df007796acfbc27a91d1bbf698c0593773e0fcb8543fcaac4d7bce7a7810a040d4fc300210f81b575b102f903500e75843d504d5c72393080240333935d007f5ce31a6cea6d3339c9a869bc98637ffc9991a0b0e4554ac16fe1a1ac1cef3cc4540112b89c137f9f5ecf1bcd1aa93ae9b3ecc1d6ae77285cbea2ea2d66b13dbe5c90a3c72f884788cb28887e2d1790ce5c6885570e31f1c903a5841ba83cc6b445a54768974ac1fcc7ce01197234181b51e0788ac852cb63f10cc1e0d46d9f98f5e9f4cb8822975a1193ac68318ae12cd57658c9f050d334d3b66fdea928d0329ffdc8695223b91b81a68e5af8ef40fd67b1a4320147ebbd4d0be5926b9588661af650556a7a62253acaee2a206a3d76a80a9ce623a0180a4a09349889ff4a4e8f15eb7a0aa5e881110a3762e125a1d2e85eac76a5118ee57ba832c531fc815d1dfcc1327bc7efe2422d618a4ece5001ea02c48562161e5a821b21c985d85357f17b755b883505c61933896ce95a967e6e4b758755e94112f686787fc8a15238f407c6730c4446208518c9290ff50b4b5a3aef6a28402af2a52bdae3cfc7fd2ea3a40104746eb31b30ef488f6193faee5d799639edc48d04ef73c0f21ad9f4fcbcde40ee748d0bea1a76e05ea89e6f7721c91000a840983d1d46a82c3737ccaaa6e9e73ac9a65e45fa9b444cabdccc11779a6f2d80b862a593225c8446bd4965a5e5dd7b7f00a32c1e73bb0f86b3bb89199004d183c7321115f98c3a4d2d3e582340491b57218dc222c5b229799d98a3c9df8cc0d2e6e8764d87cc49ca03ab0a0232346a8a99cbf48645d674c57d7238876ff00aa24f24f99ecc360512c0e4e8278ddaac8b3d5901b520c7a390dfd1815faba006a8520327b45e6f2e43e31bfb1cef6e2c85957a71f59cc3083c4a17ea4d875e3d671b352841c2be7bf72583f8c3118e9dfba8723813a0f0f87a147d68898129f634992f1f737e4777f1ed94e45fd98b76293e227710b8c7c151e8ce6c85c7653029102f66c86c448720cdcfaae42f0b3b3362e2afa61501e376bd216a27ced116024f153b1e43aa686355d1b637f0874c3004df666a316633fd1d7dde8787a3778fb03dbb597763c1d1c0efcd954e5f601806425c520ac7231d49c4f1a7690a895e4e6de3703881b4afe9fae750561d3da10e113e2c668ec17a39d63178c57eeb4e3c57e3263dfd7921a8a344fe4baedc598bd280a9ed207d729d1fcf0c8e54a5c49a4c7b3f870e3be9b4a8f135cbfdf1839e70bda1999f5d95723474a15025941f53e666080c2f86421bc0832f469a63a62804eb61236f778637a5fe2a30646227273bc58c0e0a2b3d1cc54cb189abda8c04f6301e244f0e7c2c38bed3d4824bcf1b5f21762b3ee706502cb89cc3c8f38ed97cd368cbaa1ec6f5f4e5d4595f4b932eee213515b38b8a7ac6fb7d1be76ba889c7dc682ab13d4f30716a26041e1fbc4b89d591264d50270ecb3faa5a71752df5fb7f7150ce0d3252578978de35606c905038818f310add748ba2fa214ac842999189cbb23d09c565e3a7b64e26b6b6b5cb14b26c81262a7e179bfb73c929eb698e3a60e20613c3199b91c630989bb18cda716ae24af2b42dee00a2840d8b3c6ba82ac4872b0c41bf0eb453c7155bfec67e22aed45757c8c1b539d8961f5d80b68c88ec77521656f682c540be100671d5e65cb6ac38cc5960cd51819b2b2a55fee96a01fc0e4033d6e45c21422468f6bb3334a4454f90fa6e26629d9a5072f20b697fba2f3c5c85e6559e65868f08833c5e5ce3da90002ba6048850c2523a507341911b2f670c82cc70069f78e4fc93c29327737c1d3b5d5ec3e710f497d7b5b8e2151fe3b19613d4e945ec3786b36a5586f4d21248520945c1e8530f716f7e7d6f74545b49de32d0168551a278fc0c5d04988107555ad1784b118d60e2fed4f75b4f6ec835608254df25f64c6301f2371baf7cce08c81b9d4cda5873e8b9467c0c399cd6da58c4f841e5394339e374188fe3e4555ced74e12666d1167e7bc0a0dca1ba59988dba004b6c4f50cc5fe5c37cfda575bd0d5afd627e5c7475be0da090322583431b3921fea8eff3c4ad66cbd01536c8b593659c962e4b71254ef1e3b16ebb84f50c319f576542235a13567b6587604d8ae9ba2ddacede5e6e0cb7b36c51cf79f56006098d1a74934064db07d476ab9b468533247c69bbca80782a1dcfe1ffc73f771b3977e546fbc72c5abde923067673966e4ddc9b0e953d8e592a3e7b094b49f8ff7f22483180b9ba2e01599832411445bc6695f4b3ad8d8ba8451ac5aa0a7c735663b96c3849cbcc39372c8df1f0b810afcdb818dcf4f199455a655f2b8b5f17d32493a1042114989b882649c1c4bc896aba188bb3e64c1f5345d61148ec3b655b80e562b5b9534b601cd13794858c845c5875ea7dece57c86b134e389c8a8ebb1594462b218b63b00c6540450c0f828eeb9c458a409bd7c5fcf50ede506cd6bdc3180c05c2cf6a996df504179d69e222b38738239671245c652c1e5470c3873cc1156877b8357f62e0e4006d53bd346b9084d73594cc4f266d08642fac91c8caab2a2066142b1120f38521ca459183de91a003523c9d8539bf63c0090b53b0164cb443f581fa4f2a37c5a16300c03aa70b7a27a79698d57d908fa90fdd502e0956e26d3622278100575f87029c2eeed2a8da925497b9eb90a48a4814761637188b571a55dcd738014a985588b956dbbc6111e17bf8554794e2cf856a7e59a5d5fdcbfc7e972e01c0a26fe839e5b6d7cc4cdf4c72fa40af8ef6c3885d6a82ddfefc3918edd9116b71f1bd907323defbab23aced03e7de994fecb01015c8926ab24f46949bb7e94cc079c2a742d5719f09c586c492819ca8107432bda0f5a5799f4591f8e3514877e0bd74c79c80b9d8272fde7ae94a934487a3141559b07e735385146094c65ae3607fb49b5c463bdd89c906f39414caba68442c47e1b87e8b462f800ce093a8ea2d9d76595fed65c54757a40cb0fe493909787259d2018bcf501669e4209e8f4ec4f6758f9af44f01c58ea880b5a41a165c4152dc9f997bd1c8d83a274e235038abe926e19d4f146c7dd4f69846898bcb433b5a165046c05596e7e150cc4df9983f58798d65f40c6dfb1da954d7f928299d7d5a64dc0d731116ff5b7619b89e7db87886db1a1fc727bd7623588076e7507181b5466f76c26ffa366e72c8f6fa6e11b875ee02c60c35e74b6e1b7d406aa50fd62239e991b64ce3df7f71b539a7ca23b36d2db5d86a437a82d62dd5058359855c49d80c6b4af3a9bbaf9df53eecb890850288842b1974c8eb16ed0ded2f8a86e63c63b0138d8456110167f499273ec33598874781c2b6915d466a0314a77d80cc7ccdf00c2f5469e98d058a02bd7a876c3b08c90b71b51fbe3dcb4cf0b357aaf49bb199b472a93a56fad715596d4ba9cf4932558e77ed4eaea83e926e2fa52c86b092b5854b2f8cd4a7bd8e10fa1522c35a76bf08802c54a2a80835e0d4a0241531ebcfb24e4ee93126eb8dbeefa44c81b986aa4edb2cebb6f96403a4d77f9be4bcc8823988290da657b66ca3068a3334f404ecba4f5572d193fd64a4cf51fa97e2d22efada9ebe41c2306181e43d7343c640ccdaa6bf1ff749b49be4b1fa91ccc5456340b55f1815524b1f811ebdabbb5c29d0635d7c40e5d3cbc5c9c65a25a0d7ebbb15235eba8ca9b2f39574ec6d43289e587ee5530d685d7f8d9dc4161519a410781839f9f722d800efa7ca4f47138868dadb0b02b99a99cb2e0b43cc7711ceb134072658922f09ca08e8d3c2a712c4b303599062a25140516370ebe1c49b1a0c86f6c866183518c5d2b60264a674504120d49545a3a614c7792957fc224aa70896a544c2b88311077a48dbfae86719dd8bc01611f8a59f5beda16d45a930e556bbe9db3f04f5ba3eaf06de03b17aa1dd618fe99fafa76060f7f5866eafabb58694369fca4d04bdf4c0dc0cf063ec8b2743b73d44a4fd147234f8b6fba9d018852b078c48beb90dc6eb919fb36f73b59d7033cfbc49feae9aa499cb6b5deccc9a386451ac15d6515a8abf5b584e38a827db24266c4867c6fa0312dd6aa6db7d2a56f3c0a829396b06b9156afe38111a2ca4a6ecc69658ac0fbaaeef83ac559ed3900a9cee9adc6a2284090317a364116f54cb99162c959286fa728153aa27e1ceab99b931bff34cc4b707552ce034a0b8d5c3139c2c121460ab593a0d6d315dc500b553a1aeaec9350f3690524d26f2ff7a3fd4eb30d440cbdcdc5a7ba74fab6a9edc90293bf5fd07a29869f684db4275528b5841f65dec87a2fcbc27db99e735901c79e11fbb14b4654924ea4d68e5e7a39d28ac6ad8a51e1ac441d1417a1fdbf8d01c49225f48046c052309fdf011febfb042f645941b999c6d913b9f55e3b45da313b0b92ac77cfe24e01a5dc041633bc2329819272ac84b050af330d65aadece8af040c98d8bd89b0651f817b8de432ee084b600d8d9f6f1b0c1ad6616aa010d5b95cb4118a9947f035800cb4e3a8a7ece1323068855e88f67e46f764655849fe06b68c3b72e6083df00375d85d35ee506cf84a2b931a5095a875831878a4eadf6c13860a87186d74484a0884215d223189b0d41dfdd1b294c13f28f4ec7c3112b7652f4d6ea81d97590f0775ec49e82e4831c14744df68484c43c3c7d4236e809bfe65476a0aa40e78431819a316010f6a0ba6486e1b40934a024df4b074dcdd3a9aee58cab185332d1f11ed0722f3151189b91222120c5cf3e205b441c5666009bbaf915c5bfdc6410a300a10f8515886397bd6807d8e9b31988a311d4d1cf093412cb3de5ec2d39d988a01e065963fa1a2251b9f1a35ade6dce4bb0aa76306c140991cc74d57a080e321973e67af4afd5dd4c5e102ae4e9ea3d42ceb031206325e4aadacec5200b688b301d481be5973391b756d2a3ff7ac29bdcfc06d318f1d17385b0410b277ae14fe8de37513d8011722d6d28b005cbf8c837e6ca5660847d34280bc8c05345acb091e42cc9f5e075c734a91b39619e34136de38b0cf3da60e114200439860c451723bafbe0583af29e800b4bb245119dbb2a9261c66de780d41c200f931a5e4747383837cdb62675dfebe0c0417d3fc53c2e37f1240816fe13b635a93be447c935c394ec20b77ed7f8b2836326a1c5c088f1387e7a1720bb7a2169cbb9314f89fb0e6e345441ef7a03555cfd7e23c610856211a1198446ff02453e052e2401515583c7ecbe083ae6fa4d3982981a9b501443b195d575d4a04b3d6b196837518b8aedf892afee5e250f554145f67c376cdc87d780bb9249b2e4942e62a5ca9c862caa3ac4986eafb60091779818a90a91d2d874079c743b39981eabe48803da88b5f12cb0448732474e3d10366bd1b5b629a587a820525a39950aa8b2d49bce9a4dccbaea928c50174d731d46763afe86d7fad46f054bb50450ab41547187f0efcbf367138f0194b657766da47da7a3aaf6b15b8166872d6daa726eac2526b51600f585dce01abf2eb0b0067eadd4b23adb8d8e083c7fa735a4dafe08cbd3a3c3532826324c4bb7dca5d78b9952ae2fcd20fc5190e436c9ac60e2d85572f4b21ea5892902dc09441b6542a4546b90c8897b880df1a27f2b13efb8b91d333e8ba9eb40572c60493bfa21abba381ba76c34fd923c54136f76b68d6b1d90791b83e63736c25f9e43aa87fa02a9447b2bcbc6fd0f6d651daba727e32aae7df9837bb2d33aeea2ee1cd3ef4944d5136a0d5c40e1449ef2664d7890ae80da377895c42dc741713fbd08aa42b1e9ca72f0f719e7ddf138fd82d0e463be0499fc285e1c6b554232b6e47b2694a4b0d805bbc84264e4bfcce62745fcd3b4ece14bfd6b3385896c0cc7532604017040580266bee5f2726eaeee0280d7e49c5db3df14d2cc4974ee067d0238db494094103966f90bde892b76af5b6a754e6c36a69c0ce98205d5e505e406f3621d2cf0984f5d0298df8c858425740cf58803e64b72d0b8b329a01219eb48bfa63246fd087015f81557a5f5d44e52ae5ef7a33a72289490d63b238d54555cbab8aa114520717f33a49b79c7e98191ddbf22a67149f8aeeb0c77c49203651b50d2035ac3f06c20d9e9313e954155c4bc9794aa6662c5b4116fa2e3337c2b6ba2a6744269984077b48123b0caf4c0f1dec359fd70f85de4d997662c2231282aafd9b3d256cd48c4fd941c798e264f5b1dcb33bb1237eaa972732d01236ec8502c96ea95fe41604756d2364e4bd21401b76b0de327c562ba316d951232ac5ffa4414e754b573b06ee382061e296f807339ca11219664d7cb989758429fc04f59e2e25170504d038643d0c444931a2368a3b392b5ce30bb116a6dd1ce187ee1e076d84b0cfcfd6183df99b38afe698bcea6e3b5434a6a763b940018d583185e4d8ae884aed6c58f56220ce5fdfd269701614e64c58db7d5b0ea474ae27e5783213e03b33a1110724228692dc080213858c8d7bff12e47f6c9f43f78a51f8795d65927e4828d3bea94bfa9e85e8bee95e35077a3962f0b0ba41f5a3f98c3af9ff24eea6f3527788ea94a210e0fb2d1ac6a371c9e6183dbc8e8c5fa50ccd3384c40a77eed1cc8382405ce76d2dcfa57d954d5ecf59857ec3b4cd4ffcae96257d39deeb75d9b8ac194cde5c4dac2cc611cd7f11e47f6fc2c915501a60e5a37495e18aa14eff3bb3db92b92c7cb165d3f51c4ed94ff7ef79e9f72462a6e00344840a8109399738f4e3c92ae136dc6efffe477932fd241916be0b42697815375ddcaa7f78ef060eaa2a4932d4898ff57a0a2bfd9c18550b7ecc940eb2c0718f44833b5eefa548ae8c976e3ba3c7d9575d29858f59a1ba0061e0e27093bb8a240972568c9ed4dcaf7cf6e59d066fd53f86024f2d3748f756edb841b60969d7710a5839ffaa1c3b716778c7731466461f03ebb4ef8405c0ebf7500f97f99b0f2a42da850a735af22b7a44bf293bdfd340d32615f31047e749e900cd58f3bef7db879dcaed2105ad40fa3303d3eaa755b1fc1ea802b5e8e634e9b22c26c841b496e780aa6a6878b43977bafb0ee53764e4fd3a46123a1bcf12e9815296194e8f8684052c9ca77422960ad769c7129d6224e860b6cfd9c2aabf4f7e6e2ba33f15e543300b59f1a904de3f59cb1b43e534ed4608125635370cb033d3c1e531be06109e904b40fa2513f5ea69b3205d37105b6c445f643c05804bc8fc852089865c435cb0ad9fcd925d264c7c79e6715c38cccdc5339a94a89e067e4f431423a4b33aaa0cf9ca6286d5d703919579576457f9cc7c58ecc23efd6a7d78c53b205802dab6399a734202e4392f692f9d9eb21ff759f33fb9dd86edfc98931aa27c64f2bdd17f0ebf8a2a84383d1fa3ca33a8f5afb6e2eb2b4727c0e7eb48da688b9fcc4db9c63b01ad2269f5a2a94435566862644c6d17f5eb9fe6050cae8da01ec497ca0b77405271797be8cd41ff8e544a2ede4b255fe9ebc6ed5a6e11387694b965b93e7ce81080d8ca4361c96c8c71a1e15865aabfcba9fc3330a19f613c5de51dc84189d33d02b401561e64b24b5fe96e8fba0c713e1249c1737b5c11dd65c107b8aa93f7f608ecda4affbec423e1d8480a24a5b978b300a93d49fb71a81483c4f462b84cb6099fe3c9011f2720fc798d311ae0f1a589fe773a3c39e29ce8f1fbfa715a80b0b4dd71e5aeb438e0945d2502da79f898f3f7e1a102d28d9eefe9b15bacb969a031dc2e1a911201b734b8581fa45d7dce570411e6bc0302ab4950d1b98566872a679ea7a8f3f7523acdf1318732546327372cce2103a7b1a06194cb5dc6fb25e9ed369b4b401159ce1f7c509aea4ecfaa0684b50a2c0d48e7a58123cd3de6775070a7fccf9e71effe8b9672103afed46b040235ea196026c763d0c19cddd5c6ad93b95026092a2a303fb661a60f9f3538583066a4d4037de3c1c5972512249105429503a868b0057b02532e3db9317d342ec03d5b595f49958eb0045860f1e119b17d57281050d3e42ed10f03f65e6219dc7f9c05b7f6043ba5b68ec21040baea9b6e089130310d12a3ad12dc08b69e87759ace55833570e3cf381305d46b40f3210b528f84da5bf97d7f096321c1c79de65eceab8d66085f2e4455ad67269136a64d6251ea84011b9a3b2b9878cb9f07eb1a479374518e158e6782d88c7de9f03f57e8cac76db94e864b6a27ad6fb90917cc5d86d33c430ec5090c4dad90b343fe08101331a3cd3ebfcdf61e4596b271698e3e62a88807ac0dc31c890ce5310cd1e6d57312b8b14849b44cdea94a532382ea8a62ea64e77ad816e9d0d06d174b811eeffeaff827e397f452042333f08fd26152b23aa6a8b5d66dc955a35bf543c0e2b86b50cbd2e4a2296f86dad50ecbcff83b0841ec178dfa835b28fd5624a73e3ddf9621f05e410fad25d6c32fd75edb7a97fa8bed8591160d8790f40766d1c07d8e753ff0e998a48e9ce768d431efff23ee56c7168f2a04d90ed82fd310ae6ab34ee7ce2922581a2ff74deef97bb2655db2981894958f3d30f79a661e6445956841d77c661c308b42c7f2a7b88ba0ce820576e16dfbeba9a8c062891506439f37b567e23cc30892c75babe22bafe4d01abd515d168d32ff8fd36762351a202cc998f0f9fd9d232a5845ddbb053e480bb292f224e3f5047179960f32889b9c5be05128622e50e88267abb6319017e534efaeba7174eb4069657f3325fec91af4901b5ff332008bff58d53afed94928a32f2f8de499eaa2a77bdb9551c2e0a1c4ee7b0c8cab19355895a35d0c69bddc2dfa2296ac1025225a0c628014e0d273e221ee3ecfa810876a49dc09221ad88b7372eb085712ab3e9a445458279d188135d35b74cac5e9284409bebdc97f1a74bc5adb2e26a74ac78bb4eb215806ef43df3e4e68f09f98a7c9fdbeca23ec6cc3b64d6cfe5048b84a8b5d86d61080782632e198f536da9c54e32eaacaef6f594882093f5975894d958773f383c01ad91e0acecbc4f69ef0e302fe583ee0c86a104ce50e3070d108a9bb7dfba722ab9c1c070bfc2eeb049ed4222bae07ce911dcf303d4bf22a79072092804e07d5c8092a5b49296382c4edf34ad692aa1e2676f913ca95099fa6ee447095d45e393152cbdd3dec2b487a68727336c73a955a04d3a1ffee896e06f9270d35d5c8f14732c111edf224d1a6808bc99265486cb10e48fa99b1799b58837d9f800dcb15472b7bf9110cee1dbe4dd4514ead9582ae01b256a5c2230354d9067e022937cb78639884d15d370e891e35026eb21c2d80e54660a09f03f1a91be80af691902562aeecc961f4669bae64a9ee88d818626ab8c93305162b6dff3da4743a38f7cd5f634f56c10daf5d8d5e198a5dc651c7660b8c2a41987a3048866d2b4283cb34c0ef20b158f2d6a33e77dd232cbdac0d17ef1385e5eec702b08707f9388d75b895210f47cf2e6944914770d75ebee781d7d518f414e691ce54169f6a319866105843aaa925ddb0e238f0d23946ab02309ea5181b7236ee2d8487abaef4241c4557dd3108b77eb18829b452bdef12a38d693ddf072c3ada8030066324985f84cce17edea08a039666a102f15053265167c49c8457e8d7d1104fd41664b306e2335ee81738bd0e644ee1b1be7e64e6ebad7b121fae6f4e08cb19b069e920bf059da7c308923f47014184a0368231c4cd701fdefe2353f8275a44b613b935e4a43d184101bbf4a2122313a233090061e42b125697dfa4da8b86475a5d62787bbf634086e57d3e8a0c391f6cf72bfd32ec65f000ff8b593d776040e6919d027a08f3b88f5add8e43aa813255218839c24dbb47a22825b0b63ee0482f94f241f5ad1f0ca0a32ea85e9c0006ea043a68c8a2eeaa7c9dd7e71db74856407b490488ced3d7ad080cbf34ad6e70e93926061325fc293ba36f963b758211dc31df37bf42a6a1844cecc624e710cb102a43c780acea4750afedc005f1c5778b0e1fae48ddf9afaa44938a209c3420abc1813b13f992a3b3574196aa9d27e5f871cb44808dd4a5bddd27ced1627036910a018a2f0289fca5308cd65bc04d6f39bc9b8547b0f19cb48a774864f4d6ee25a6c44ae98abb07b11ec6bd22740592429b4247c7f051d8923939c0e01346b01aafd7c3a515050b53ad7c6b3aa0633da2ce8345d14759117d9ad55aa958a112b34860b1b8e82165c2305a8d48216a7e6478b0d4228c006005a9c2c4a2851aaffc010769fe49082e6028a68558cc92632c99452e4960186036d03a203513f8f5c3509d5feadf650dff976458c47e9b3461a4bea5e3eedbdf7de7bf70b7809ea5df256d0a16ead887c5ae8feeea7aa28ad1f17beab2907ab0063466c7407c56f1ac642b41a02aa85756b3584532389621ef66ecc5a8a00ab3762369c3c979e6b2a3e614a030cd0c29d41c34b0bb22abc644fa03ba3838a65872c05d6896b2578b56284a6406b1ebb44b7684c995a1aa1fc04460a518d94b34237ec7d7d8f80c7c1b0a01ad5dfd89cb529c30470a8aa993c11a23165822c21334a516ffabf2d2f4fe1dbc037aaa3dd4ce14b65aaf12abd77ef5520a9d0e9bd730e152f51a5b7dad76d54a90a2805dffb38dfe37b6ed8fb1b178058b75433193552a6e59e5279744a2688ac664c048029b057a305854584d532e97ca730d37192dfed2ebbbbb2f7a63381e4aaecb2a17ad32634d59bfe49f958b7521325ea8fba95ded86dc9dcf7de7bef6fdd52cd943547dd52cbf4f2f67408cfc92dddbefd752194c1d13767f7de555925ab7a2b0929fd00c6676dde7bef676c74aa2e294f7e5b1ec5ce78ef7df40a570beb369a049716c3db17550c9a2faf142a9e998c045c60af31c6ac5c58126812916b67404e1dd76d34094a44dd46b16d35c7cc88662dd76d5409857fae40dd46bd5ad41f359207c13c903be753e28083711f9644dfd870cf71facb333de57372c83289acd377233ce539b3ef0b835f8ea11f26c1873314c2df65c6cd24f6e86806ea563aa352e2f1fea7bb102e628d5a00d8db0b00eb6c996f3841609b301ff08800c09690f19077325fef40f69c1fae694ca2dd9e87ab8c0e755090ebb4e6c38e788582f1b881d5e1eabc91f36c7c5c933d1d7c741e5dd9158e3b22b9eb860a076b8d98a5af19ba2c9815aa17933c6712d3a4ee24868fc994d1b376a9d839fdf04eec5aee6cb8d941fba43168f8963649fb4758c8f2fff0f74b7e10cafc2b7994421fb2b0eea383389bf89d79bc2f6dd6bfe7a08fb4f198822567f5181c1c883a963ca843b8c7fc2f7164a1e4fe3d3cc4e1e07b96480816e7c0d99b8f0ec3806030e0d950f63e5be2a3c3fff36f12b824c4933bfcce32712ee1dc242d12f79e8dc39348b1f1a55d3f1cdfc3bdafbcbe8bc8f9277102e6a11ffb8fd95774703071b8adfcf947a1e3411d411249b02dedc319d2267f60be1f3508f3b358cffc8520384321fcc5588844383a0f761f3ac8f42c13e7371c90b48e8f38ac7f57bfef55f6d8eb9041d32aab05978f5b920e097e2a7efda13a1461336d4956726f5f0e51aa1cec76a8db6996a84612b9930c4c47cbad9d159c2e17cd93cdb0a25479e67e68feee2df7de72dc79d75dbdf7de46284712e9cd0c962d8dfcaa8b4b862348e5dfce39e7afefbefbe793e39905cfbd73ce39e79c73def9af5babe74987c12b8821e8455c1fb76e04dcd3dc07694f23b90fd2dd7bff79ddb610c4e0767af8c65e04c96b4f6f1ffb2ef27a7a23791d1ce12ed8540928bacea2683851504569d0323e67595c4b2b5862f4962a57520e82b4407d41c9f4ff7e39fe7154081bef5dc4fce9b978b5534cfb247e216539efb12c0499331ef9b3fc63ab154630a861c8fce9b968e504e1158543fc59feb11e89d5ebf5307f7a2e86857031e601325d22d1fa427a2eeee94c0875a823f8bf146d2aa556495780304212b1f119f8b3fce32c9890b52e62fef45cc4aa2ba27d12acae10b39cf788450532e68c47fe2cff182bc7188624a4e74fcf45bd912fa8610819086c140e317f7a2e569d6278bd1efe2cffb8fa03f262cc0364fef45ccc23d9fa18fe59fe31954b44d617cef45cdcd4a4906a07a002527f7585560cb688ebf6eaea8bf61aee2df2f95bb757592e5c37d8d311bb10b830d72d04e94db7340f4a2d113983cce0ca0c747fc13d06e9d64ec9e28ae336d5b765d2479426c07cb531a92a6d46267cc4844d121441b6672df2886ca1c8162cae6d91c13de28e20e56090fe41ba24487710a44d08d23304e92033480789821ab85eaf640b619e7cebfdbf335d9c8b2f97526f28b79a422bca9adabb6736bc4829e160924e94024d3c4faabdc12ffff8a334f3c868bcbcb02a91e29a4d10f8576d82396ad94a92bd2cbc28b9e8dc70e2d646577bb76cd380a639cdbde0134b5e9357af54091f0a7bd20fece1cf67f7182c721a3917f9f123fdd6fa81909c8c169aaa4eb6fb1b78ff59fef1fbbeef9bd4dcee4ccf45eec4d5dff7cbef0b1f7d4b83ed464c5a0bb69fa598ac89ee467328a7af89cce4f5ef9556d37d6718f63d4683ff9296f5a6bf7128728c22b121cda891c6f88e82162d0e52f052b2854198cbfdbf7b707c843a6fd4e0fd33307f7a2eb6688a53abe922aab2dc687c92f9d373916a2cee2ce73db2a0831373c623cfc0ba194842facff28f9fcc391950c390f9d373718593ee1a85434c31c97579bd1ee64fcf45292a1c0c0f903fcb3f8eb2e671b17ce1fce9b90895168735c361ff59fe719ddd950f4ccfc5fd9494b3f29d7bef83fee82483174944383e59ef9e3f3d1751d49b8eef3adc3fcb29903d635c507c5cc8d89921ba80138461f559c9a47a004db68ff37bef77efbdf708a34e5b09e36cfc755bdd61a991c6922f92b5a5e90bbf291c96aa9d873f0e52ae7d737a604c2e2773bc1a4453efbaadea94a19508df4dd3ecfeddfbe55d8747e8bdf7ded3ded331ddf9e69b1bb9df5ea7e6b3d49ee6de5781eceab7461a4bfa680efb9deade30e7b39ff7de7befbd53c562841289f30f4d3dac91445a68b8795a1960d1c0bdacec0a18d1af2ad43c0a1282d2b93bace50dc54c762567991501c94809a3cde5c8e77b31a528d7b4ac28f4a87d20381dbd106b5a91753737143ed1ee97ca11bb77f78789372ca72849599bad197c25645ba8e0e8548d9223dcafc1904e0e5ad605d20b2995b8f795dd4b6ba16675718b4a9f43e331aedba854458d34c60d853629f879ae37fd6da8c98b0362533bc145a467c28eb20b25aaa84505544bb72ae4d93095d4a2f2bd35619ff21e30434ac20b5a3a9963c1e2ece54c3c45effd5dea5a1126c513c896136685b24233b8217763ac6e0cab7ce931e9dd770e6dece2b5d6b7026b4ebd690dac29ce64224c087e5836e0705ad0d9dca125e3be963a707f5b3094cdb0ea6a512e85ec56303be1f57375aa3eadb810526ed5ddd489284da8b414a984151db17eca193a2818253aa64fd30e48464e8f8d6f8e21075cb7531568933b177693a20ce86d4696953bd7eef9c545f9ad498d89294df1d680b05240c971c99d5004f872d444a7a473a9f9b1425bbeb87ac68da0242a438b6922597df7efffa2a0c6769415285da113041dc255f1d530a9a0966029bb9fd81f522e19ac3f38bfbaa7e15b8da732a63821a9c02f19455f5a2148b73f48cfcf3cefbd0d3766cdb040b2302967905bec0663df98ec84a4b04bb7c5fb5bc290c9a1a6d80b2a8bdbac64983396564ec28e825c3cd96003a2428be6ba5ea236061062caca18b9c911a5080a72f94c17e7e213ef27dcfddb35e90e5453dfc90a0c210fb7c6514cecae0ee739b3e4f2f7c42e2b8529daa26209353dd8c85e549548ca5d9182755b6daad5c3baad36b142295025d692bac26e70adb96b24ac153d6ffed4e0a466f9cb74d505a8ea02b4adad4dcddb427b5cf8447dad3d6b84e0baa596b514f9385ff80ffee350b7564126fe7c5270d1027954705d3532ec9d8a1a4451b528d755e3b861a3c9d2a1c82cfd1c1dcf39a76362119207fd8b4efce1bcbe0624c03c264f9ad5cadf5be275d382417a7d7c2b4fd8a6d7bffef56e918b94c82eabfbecb5e674cc3997e31f076d2bcea66448bd88ba8262f1d4e464d4748209e7863999a53915157f4a78496f4868476146d6a22a51d5d0530a241441423a41723340722b27029d793f713e6a3d623c5d3b593ad09c281c2513286e786c9a35712dcd38149abd9939269b0c590c1666eb45ea32d5b2c432b4e2b3b451817b51c2254bf425eb526c0451cc82275f812e00adfe9e7e4cd9a23e279f89bdb718bd37659edf8d3b3cb73b1a76607530e8a87354724e714770406f396e6ecc36b7a50dc01a37d8e0d6d26035b1b42bda168de9d9d3aca9ec882c686c47ac39a3cd25ac2d09969571f7f5e6958615bb5ebbb6624cad4f184d2f8e5c0471ed6c35b56cb864d9486265ab77d4b7ab342bb1e955ba15ad31fd2df49941130647170459b0534193821a2e13d4484a908de00e82b707d21c106be0cac0d602d392a7024d091c21103462e780a608361712b6e4316bc05d016f04a419c506b88e6c894ce9674853882301828a3b013441acb900b0969cb31fee3cbc81a411c53a5c3fb63ca6f2b3a389e3884350bc336c7ea1da0baca6fc80af9ea7eb6dfc38971c47a0edf948cf4531d9755db7e438c28223f6fdaf2b22bb34f2c7ae04aeebba9d3b90c655bb34775dd7a51d705d07b8f2cb5dba4bba0b5f1e83058bf76f676ae945dcc922f39bda7b99f7de63c8bc2ffc5bee3bf17b3fcf2927961ecae1ba95c650a99132fd0c4a6da12eb7eb8617bebf1cfff88596e68a579dd8d527ea665d4240a4d45c5e955a56213dd373719bfc514d7362d0a69c512b88ad82020d0da5732d4ca668180222633423c50b4688ab6a2b1388cac114594185e06e40f1ceb55191f6d2f25080aea2270428716622eb84d7de5e5d5ed4068e0e61bd640afd6fef239d3160e7a4350be839634b025aad0f63dd72ceb91cd51c40768a19316a11f179a16d58425a42f8285504d08b29c2b904005603e2aa0940cfd4cb4ccb47bae728e6834ccf32b16787e981eebd37d59c735a7621d83408ef9cf3b78873ce8f34fd875e887d2427a7430e0bf3231be331f722afb5748cb170506f38dc6013e3fcd00c719832c2ac0d2c07f34d98c9bc26be587c8f8a4de779e1266872b67cd387d38ff24d1ccc7cb3b6d2f986d2b4cf952e397aa980a694eeb03971cdeded64dd7be788e253166155c1314d7ad58956fbbaadeac4b9fce572b5a7639ea53c162f3462f0c49975ec14eb52dd32f029cd07ad811ebb2c510f96130c216bc74629e14f455a8d40ab568b8ee8a63fdc6938fc7f37fc5fb92bdb56970dd573e8e76b9fd47befb3a9128fca0a67dabd7339dcb40d4c15613956415a46494e6701811b00d549058fd9a8c48c9e886606640700631904008060204681204aa212c70d1400071fac605478446c5050481209c4c58030100a8481214118088401208662488eee389239dd00be5b346fbf2664dad4959b426ef3d36e12a3e69c69d34a362dfd3143123335e526a9d3f4bc9b88b83937d56c944d5bbf09326d76a52629a7f9b59ba9f0666e02666b11e6d26f82459a9bb949c86dfaae266adc9495361bcbe6e56b82459bba5353ca69fa5a4d224ce6bc884cdba279fb376191a6aedc2c749b9e76131537e54d9b8ca279f9374392a6aed424ec96f9b5cf44859a99c8662bd1dcec6b8653da6cca4d524ef3733551a1a65cda642d376d5f336452e66e0a9394d3f4bd9a54a829136d1a89e6a5bf09993477e7a694d3f4b49b89a829136db2ca336dbf32c125cdcda959e8067d46856393e95b4d46d9b4fc9b604973776e16759b9e7613316ae6a24d56a2b9f5c00c8b9ed99d9a859dcdafd544859a336993956c5afe26c8b4a9999a25bbcddfdd44849b3293a6916c5afa66c22264eeca4d6957f3f76e52a1a65c9204135889d6a06f4141df525b832e837196a3a406f5982b9601e8a9261ebc295a34b9cce6e869c6cb9a3eda4c230ecc6fbba92535c9394dafab89869ab3d266936cda794d7069b34d6e12719b2fab990637f392665b01e6ce3f131cd2dc4a9b649ca6df6a22c54d79b4d95436af7e1314d2d4353765dca697dd2441cd5968d3549a79f791098736f564cd32b7e96735d1505356d26413cdbbbf198e6eea494da24ef3673591e0600ed0c36a3ac1deccb7792616d4245b347d46d3885fc103713f5e56280e98b62bc29c532722cc57e313a3d4b393ba20569acd8a5b71d8cb6e394e597778334da6f7f1b377d02c7a2a0c8bf4f4e3728807a9fb73a8edeb0986fba42278739d41d03bb8e2a7c9bc8afa82599048162a663e9a18b11d14cf75cdb8c92a8cb207abdfac596081af5bce65561c489372aa9dbae688b650a82c2a07aef53e3f6eeebacd5ae1582d8fe200bea9a949cbfde1874ed55f3f174b19c532d3d276f10568d1c7dc9fe44f6ffbcb8f2654db1347e40bd880673ee4b531443d4483d9bc072e6f276acb9eab50ce524e9b1f2d09e75ba4a736026f329ec2e85007e0faf8ffd6fb1ba995e0b4727e788ac285599ef767a62626ab47471eac597ae632aded3752f92782ed7a2a80d74bc2299389500b58d550975faa36190b78e492af8f1d9890b460a0a4cf862658be95b123724c8a2c43b9a93b7cf67d7e8131314101d12c4ed552eb3dbe856a120958faaeeb8913e7e2ddfda1f20a195f0186cb09d554fafc0a2c77556af9dfc96358b049513efec322f222bbe05b90bdbe5c2038369babf365a2354f659a889607fd55b8500cb129b7c0844587af94d239a08e8073f4c86ccbe536c5842887532ed943e35a990b2097238c5da385f0ebb228b1d7a042d472ad4bea0597342cae2a20645229a99651667b80a07bd70f6d8b1879eed078e04ab1bb2c708b39901d4e9beb62be66f1bb2f946792cdedb518f86343403f4091a66ba3c7e90119177f8d639f33afd7acf941e89501f075c9ecbad963afdcbfc0b58649933b7c005c0277f67e2c7ca0fc1bee8957270801fec39706669a38755ef8e12b31decda15ae4310fa4a1a078f5bd8070fb4eba2c9974ee34aa410723ce6dde7845290a5038de09d547961ee51c10eb3adf6cc02dfb1ebf3c4cc7568bbbafa18bbe30edf19bd055b9b2a259c1b5e3dbc1bbafd941df104d6cf7b8e8eef1e3d56bcf7d6f75cc0dad4060ee87491698010f320276834be7923b5af621e463779d743d6f1fa2be281e4227ab3b427290514a61546e996b642a69e6d00929a64b6dafdb31d31047df71f99ad441028cb19299e4e105b8557d23c005b5bc736d914e10cd3bf437d9d72d2b1db0c70efd8268c477c7bbada14b93826ac4ae3dfe6d8f6eb405d18c433b9c3bd5e8a253c3b471dd960fa5961409305eda6c01c16f7d9e339aef287a0e67ef56b5c85a35fc222cf61a8aa08bf2b64e7892d2bbfda477aad682530d37c90426a6df1d2c9ae22ed8adc6fa79f723483c998bb9f8c4e85b357e3055690e0c59858fcd8e14a310dd6305cbde2923b939d29ac6ea2a075904fa8a44cf42cb8beee4a13b2a56ff1ede64415a900c380bd14e5d60ef52220be08ca8558a79d2bf53704e645714ad8204ed4960d31cfd3a91120d52163a099222faf273e322417bf9cf94f656b4054a78815bd693ebe28b12c4fc27f8e6d2f57418a7a788bf6a3d56bf9e3f5034fdacff7f1d30115fd768d438f95d673fc2170a349b028ab4361aab73ffd6d3002c379bfc206731c5a683c16dcaab24d36e7462dee0379605245434ec861056e30652bfedf5c05103a9c6d3154a8505541bb7521055864344d4acc04917c64881b2c482a3bed3c5749338e161a41f8b8a0062bbf014e67388d248d90cb8396a50016a98c0811ad8358820e4344a5f198e775e3792de29dbf0632825fa41feaac5b600d3a8cce527fa7b16b7631fff7dcdfa6a9c24e06c8d42d9dc5393c7219c0532b83791b5fac3a8bab223e903c41872d80d686b9dffc95cd80e57f8d09b91280bf17b8689a8660446a3142b4bb074e6ca48e98995d519db88eb67ecd3cbb201eff9e22e05bfa272cd0b451befef2b98ecb696b58f367f15b902c54f110a8eb49408ff8825e565e40945f96b408af7d90f650dfc16e565b10f60fa437b876d3a7d2bf2899164494e411e12a9da4e0a278aef0498290ca21f75dda41778c235afa2a151570e5552006c94d988cccae21be79ac257dec863a933749eb8b6460f9b9b3893eb4214cb48647c29d4d6fa9e1c52e410d94430e203104230033e2519b5ee6842c85e514bba120bee8dbe31a0c736e8d8f9a166a5f0f169cd12e786828c419bf25f76777ebec41f73c447a5606fff65e919bcea32aa1c541a706ef93f810a6b68f09c7ddb0f394a17a804ffbbbaa173a19f75224e420a2e486417d4dc27e9ea6730f1beae46cad66ee05531003e64c0a625ded44a3cc44b47c02e47912028e224ee2d6a499f55f1a5abcdeb7027694315ecf231729c2cbadbf56faca50e34ec3244e3031b133e70f4c1afa8b5e64e6eb39d17023138cb0f7cbf781bceca17209cc8edfb624cb239dcac20b40ffd9a67f7cb1c1a865bd097e831e3427df50add2a17c918646ac8736440869332a11f8e1052d6d45f069e8084121b72eaca06f7c4e900caa57406690f20945e6b2f6f9017bcbb4d867cf1445e2eb7845b9c454b7e6681ba3a36c8cd51e66a6ca9efe42d59e59d39a8841eca1512bc44b7901ad4bba1d1693791991c42bf41a9a94e12a86e900ecba31f7347ed8c95b5878e24a2012daaf09c587ab610f50d30f010f439955ed48015b3aeb121298bff5f400ed805c4eed6bc8accaa073c36dfb3b9f581bf10c078e1545b77fd65560b8500e9b1e3dd2b38056fc0ea571bb08e6a430826db8a6f8bc104354c963ca04ed6df2e3f7854a28bf8ed429b99f7121e0418dd7116e72a4fcbc5161f67d43c1e5bffb9f7a726725c090cf4a2432eb90feef702cb2cf792814ef8e5f77a046a469f6f7ccf98711867d678b0109e3bbe4959b6935e204659606a6122d6ff97282c544d56f205dc56d73814c8264de227ffb6daf3ccc2dd42f5e409ac29ffac93ac1f6d9c031190c695e17e7ec5bbe35bf42bbe94550bacc61466bc7185d12a73d385751dad2a7992a4613e4e0646ae3a7a85d313b24534aa822f2c61b4e1bb8a3218c79ee81cfb2236c3edab34451a41fb444376bd42d5622fe855ec0e4be387e760fdb2af0e9c3d5e3bc4dafec564668aa9f25f45a1ffc3e1bf2ce606163f680d7b5f7f666adf9662508ea09d4e305167ebef85cab8375ae0db1b28ca20f62e85098259b20f247bf32dae75ce613dc8d5005829ee24fd9787890e8af716a5374e70faabd91fd6d8614704197bd75a8efcdfc6d1c2e05cb52c75be19852667998d0932cbc931bc393aab7cefec8e64d64144448e752aab91b4437f186969739d734547c48c9ca01d7e8349352e26e23e4b9420c2224023586143a45018088b9f589a7aa0670ab82b8496f2a361fba8047d2daca42f1eb311990b48eabf6d90ede124cc64d89b590a82842c4726a1d7482a69677dd8b1ad6343a25a294e19274dd0dbfce74b8c3668bca3b9f5d21c667edae8ca19a2ec243ddd44ecb9883ede90f055d5a6c33116791b6e95585513fc90269df23fa841b5fbc1d6e5f32548ae6ec366e67e3122af9c613ff0fb4c59e7a052b6f0d88aaf26a28eb800543c99802e09af0c4bb00534f032c1d2915b13d121d3375c5cd5e481a78ef1291a4b15f1a0e9e6c335a6d43d47809c512d55841ac67c503f8615f06705be14ebb6fc845189fa7517120aa30e81302eda0e50e724a96497d889994385e745125ed76c048fae8279053470d0f3a6608a815e9d7053c1d80c21a2dbac23df98c8fbe5498732a905fe451752f99a7e17ab12fb3d808501fc27013600e9e6083e9a75173c2cc25f4b1f0d50431867369033498aaf0edd43e7f368dabf8df07d99b4866bd59f966e9a6848f1deeca9fb211132c1c2e103980d48ff5317211540fdc24caff7eaffb88b50d4fc5b1fdfbb2ff34313eb7d856aad66feff66c149b0ec3152025438b259186b7ceb1ec48686437957ad6701f6d8826f6eca9f2463b4f0c351bbda30a86727853588fba6e77414792f07d8d54a316cfb17a84dab0cbc9d4c0440cc744c58c7924dced27aff6ca520be21caf68daf250622260556ec6b00aebe1e0c2baa66ba2b7033e4864d4bfc5d30bc16fd2f1bd194c6b69cccf645a60a7333d58d60291a771eb7376b5262c1369e0c4270ee629d58c77e2c11689c01b6ead5a738353a75f4fbe47763203f9fad4716399e1c47d34c7ae3c9f825424fa4d0b74eb7d62cbc7fb1079b5c3b9314bddcf403b26fe5ee2bb9af4c9e61c2b3604b9c0738d7abca83866ef4dbab83aa70844419a4e655c68c872a26018c1d6ccaf60d8744b36861efefd2891c1d3b244f1f102313a5968c1ba2a47c4c828f8ae38750f7dec29d3a8d9428cb369af16e6e70f598f58a48738211b29111c9434409204efca0c7794e3f23f7cc88d0aac0c2ecbfe16620472dc68f830f894b01ff9d150c82d08519996c598a950da22b2ac75892979816517a9b812e39b05b80c7cd237545e408ecda959aef5913aeb8a17354e88a5d888bc8a0e313514c0f03abe5b66db43689de6873c3880c9d352f1a44b076d3cfd10ba7b27aab51775cf3c8a84f03b7851b9831ff87caf6db61b60a647c9f665828017b70623bfa674fa32e29e4215fde1ca374e8374b46d4285452ae89bc052b92da9e47e632b4c356c689ba02664ba616d32d4ad4721e27380858230a7929b641f7750c444f51402ec9fd9b2e1252b271b486db5258b013ed719e9176d036e90f853bc9d6c81b58479f8927bfc73160f97b7865f66b0a47a108cc8f43b91b84f4151a7f0f2f99c72e2d5134e53bdc2bddd05a44cf961921b904c5aaef4468e4ae74232b858b52c3b93c2b9825c93d6548e1f48ff3f2021869b08b15f3bac458cb0cb8084658d97a2b427898706b7a91905ee77105295cd9d41e30ae6d3d1a255ec9c6f921b704d782e9fc7b34924f0ac30719f58c5ced3d3e6656e2d6d8beea3e74b5d308bbfb4001516544a3d4eec773568d3e57b231357ee7b9688deb851cbacd1fb846f8d4268165d458831d88b7c45305291b5c88a2331b915208c0f2ad11f772703f09cacb33e3fc102b6a3896e271643d70846f54766db86e8528f1bd1297089323646a23f2406c114725287ff14afaea2485c3853894c9e3c2222a1411167e47a6e62c9a2effce23220901ad463c069f6941e6383b631727f4dc33dc18c824577e11c2f9079069e138dff49a1380a6e95ba750e32c3744aa4a58831f871cffb405c5f644c6c94e4159114983d1b4d182af995e443cb4387a2b5fc8132f4009511bb910171fd7212918c1c889cdb3b9ceaedd0bb13f2f56082913179ac81bf011236a0a362036f42d102c5630a40d05a644f0429a2e9411e6a0d3ff1b6688e17b6a956f0ca165c520ba6a1fc38bd0cd3049614851e280f050a3f6ad56df153443f89d321ce2423e864dd143c5fc5c137369d51c5134a6218a78c001a20c3743624101d1e6b498219e4983b0c731acdc0e467e8710c6ef2d16a2e24943cfb51b42d30cab9203f5fe1d337351cd21da0e95e09ccf20780d1d2a35c89a4fab9c41e356233a0fb71a3c8c293642ecacc391db54db477b2f88d5af8d93cd8540887e9f0ff160053511db65e921f3dd4a200e2d8cc74150daaa8f2a702547fe10371d39068105f2a1f29dd2409bf3b3de3467446cf180733fd6514421aaa4917cf12b0189b678848b9ab3113b5ccc9b450ed0aade232d8a844f55418b069edd653eccbaeb58c9e206ab0064d518011e5054067686175daf358094a445353024c3fa77e4c1be2cb8233a21d7ecfaced3fa125624a192bef374c1e5573771b1d44a03249539423236e582d0f535a17bfe2b22885afe4433aeeb42fe4ca54c90e4dd1cb0a7d5ad2af27bef0fee2aede1117669f5e4d2fff3e40cb60ef33842d210ede1f1bcc98a552c0b6f5e9e403c9bb957a44db15c017b7c9724e5bf333d3027c2237b398fcd111ad6c3e4bda931d893255eff057e75fdbb7b995c28a9de6bbae5bd37137cefa0bf159a43b2bd4e5fb3deaa56a37787c099c7208320af5ae91ade18e9bb3b68da538c13b8800c17dece8e6238a3e10c7715364f06cef0dbe606da90520bae682dd015c484ee3c76312a3b6cbcc3d180d7a2e042a06939b970f294dc8384bf599782d1bbc28cb1cb146d0d11a4dddd7e1f6e32133e2b641cb0120bfd51f07c6f01d2bc459342292eb81802d4e7ed74d3a1fd3fc892f1b0c89409d403e8430c72ca7a587260600135e39784dcb4eeb136753cb21f78a5d67cefa3949af547c2da385f845690fda3e93734c19c0dc80d79cb8741811ea017a70e850357f57f4948d3a06985df569a422216870fb482874148034a0fc0f063eec2665848841e5661ec96118d0c0e93902855299dba11278206a61f8e366ad6a2620f1437fecce6646eabc21f3b7157a354eacc7d5106f6084235dc04e40d2fbc6d94a90617b7e4a6421a27b31ce7b139209258b42ab32c7a573d28974ca359ac4f6458b5001103de354b1cb6ffa9706b4cf3136875eda80b6c811700e0a246aba26c0bb396bce6ea21e9276d0d26529e3b55839a3257814420fa720dac32552e75bc766a3772bc5760161f89f93360ec257802b9fcdf0f115da962171eeb2b5ef855c6740118c8848271af549990022fcc85909f96e48ccd9bce518466a9eab68ce3a560e7f535a6e9d5742b0c42fde9c78b4d2c438645eca91243643a1cad30f6088978d291c55bfe70a553a94e7db431db88048a880f311d576195d59849c741c8a1d3fd02a78bdd237be6d6d2518a3a08f264d531876e9cf71a988f4d1dc6c2e26511b517ea380a3874373f13753032833ec4e874320919355d6e9e3ae56463ec2f511706ea30ab8a7d94ef12587fb63ac4b61e6d117c08d529ce0fe547437939679c2f62659bba7af00461245863a8b3d6cca0d9e59cd5a1a6ec697a79ead8d3c343d85820b1d3da02d102901d1d3885656161877b3f782327b43b2a942772cf97252b3bd2dd1930224aaed8c9b420280f3134bfd5e8b754ba8bc50e7d171102903b2a0d61f87f8e89395473285f77a8a214cb2a9a3babb014c8cf9ab74868029474a6331d4cf19d77ae2e7375fd3603a0a0b2dc1ddaaa4ed284f947771bb17f6c9f95419e774a501a5000d9a8a80c7d09053c8b1bcdd0adbe4435d75e29d8bfd44aeb5e421374740923e5d92157eee20e1d475cab68b7d334f88e78f47e65e4ee54231174ed2a162a19188cf11c4cb4e8e3d23be89aee2e9ef0d5f936416ac9ad89e0545b9ce40e485b3d7917006820d3dda9c596429fb4fa3d8d227fe19f88a04711c3c63aad343be72c290e259c7dafcc6cda5301517f4ea18b43eadad1a3f5dff3c7cc0cf950f42de4b5250d29874393b858f30654fc56fc97493864d942ac48ad04133eb93a7be178be46f38a5ef0f3d28c358b383e28bb8f1548a1a93d652816eb3b2e755843d8560f5ad463e44d7660d034980b68dd55a66f2a1b09a429aac534605f9461b7b2f2d6b521c34d78621551973c577b19b149fba2cd0a01ab52611e89046b3404fabc40464c00c2f10b61eb04bd490e9a4a735ac45e7cf1fc57cddb56eb797ab1903b7476ef04ddb73579dbdf29ebb2bcc409f048cc68ca5c5b483ba579826e8fe0595dd0a058e5779094f8dda0f3fec5ac1f69099c23d21c25c498a8ab4a5d488954dcf997600aa9ca213f22d4b30691c589ffdd5638441caafce3f87f29068c03eb04c8ec999982ad09761c22c313a6f14d6e14357fd6814923e2b258006ae4616e8af2b45a36ec0aac4bbd1534b709dc0271a5ea6edad1be398696f5688f5d81f553328178344b1a5bf0330ad2cd604dc7b37f2901229a4a21443833766d624027f5d1c45e4ec328aaaaf0d56afce05d0f63725d7805d63ddf8cbcaffeca9d3f013edede3447f2de7cfc64ffabde9786baf031fd2f44da6124abf4f48c2782456367a10992fbcc9411fb8c3884392d4c35f7ab59825b880ee0be92be80d15f3024a626e3b21155ac4d33bdf0929b0be9f11c489f145a1216ae90868c4c761882240f2d53932b44bcadd21dd7014f2c69db7160a419429e66d7444e733db165b1c7364524d6b7d26492bbf21f8a54fd65c5605202cb4bc6d3228be83959b48aa430122162b13292cf10df66209498745efaa0ab726a0178b5a0157e47c2a91b88780fde1ea652de6cf2fca39415ac19e3eecdb650ea97e6d7e438ed8e71bfc57a118d6b4a7eb331792aa79cb6614cb4fdf05bd8ef3efedd5f44b8c341684724c89c163d198a96d27f0c1f289c577da6a0423848685969fe0bf1273e95deeee598301628470caf0f52f5af6af7467d0e7c58070f43306e338269138209c904bfb968d394ab3570e44882ab0d17c411e544c235448e16c52c9dbdc39196ebb7fdc432b3f5c263e9d9b1185663d57df65d7cc902f20e99a12e4c186937e6bcaf6b4b542768531bdc98422a61ca7f74e7f131f58ca7b4d6f158d665c0d03ec5ca87e25314c53e2dfd590a9ddc413738dc8dbb90a1e77e8b2f97e16f48c09e52f8f2a454b2ef67a19f2155c83aa9e1fdd9cfb2fbacc2ea79a4037603e282227bd6ba2a73f6b440e9e51b9081a6e2eb8f32159943efc35d03623ea32b529ed3e28e3ef97a6280d0a9f026604f7c1ab4995cf7505e77049240a78fcc34a8a31dc1a45e8558f6330dbe2d7430c4bf46c0cbe4db704128477af97f1be4f3633c004c757d130c96e23d3bfbf217bbf673c002c7b390c47988c489785c8cb2eb15e146a895fb3051597f76562289813f6c71ce18100638c89ac881b2b1ed30de78441ee8f2cb46059f017776d580f9861acef1587dc878b2b8bb12076731a7a19e05926f922b8de06b500560fdcec7287492160ece909c510bb1f2047cdd810006782296f7d7b120b6b9adbd5004341a792b6456f239250a1f4bd61502e46d4bce8b7d0d6251d8adb492e3d2d2e0014b329a48963c5ad8c496b7b06821f9b85441e3341f1e195f16b8a4ee828e0891621821742c3ffcc42bbe4c0f82a5c0ae5bae556bcd39cf10df2ee0bf10ffae6074b84b572c0520aebbc13211a406bd4d4054db8a0ffb377e0eba46e4089610842daf2dd59d7037f1b0e58cb79f301384637d425248d6f4fd9cbb87fce6f1a676faba08a0179bf3744cdf68beaea8a25df1f346af21891fa5e38fa86efcf6b513c4f2ca20df8060e78ca138a41faed1bb023fddded97321fd4508898d0c449c8865126a03ca2a17256415e6a62890e18938360be0f5095d283531925d3e1cc300b3041add4644d2b35edf42dc7e3b31b820ce7875ec72f34bc8391063f6f2fd1250e9a01c95b4750d164dca78a37dc827e38a1061b7806e53fc986fc716116d4fa4b836946f2929e8a3c416ec2c75ca5f4a5aef82dd47a4877acf5d2a5d3928b405c81df4de5f6eda7aa8b58b204598eff38f1be79e39b5194f7fdc38f72bdb2ba853d4064a694e6f8c673dda9c7bda2f0f77a33a405f70005d4d141a96a2a0a6b2693b18c7c2fea1b8e92bf7114787f4facb5d1d534f40769b6857bff8313388b89209fdfe8e3ed493ca132eb90b168ebc3448fa0680a4f2209fc2bac035d638d1afa123a3c46526c4a369e2b19b185b775d12f965c4be5be203c15124280fe0783a1c1f116d70d06fa54bc9a9f31615d1f7824f3343a9e31d69acd64f41bcebb5112ca3a36dd9a713ec66a6989fd99c2a34a49a4f51f4da1adb5c1196394919155bf9035f61450645f77942d4ee2527e656e2f1b8e5170764a158e19d4f21d42e83e0ef2b81e9f0ac81a176a79ceca28016fb48d5a69bab3421d7819ecc96eaca09c0b1b41ccd98691c62f1e657f52926d9132f9b53c4724a67ee026c4cc60cb333a500f438dd23300344eeb4a775dcac8018b4abadc46960f7aaa213806b646750ba9bd4efb4fc5a665a9cc45a3d118dac47fa09e733022ea6809442ae2ef4784d102d1bbf39c3ae02511888c27934d908c02be546e1cb34c6d138af7b4010aaf0528113e0a2c5f7180d980e913914af436bb06b12efea3ece6db048ea9564d15d578f90cc47cbd5c00c72dcc6b45b186a265c37468d126675a407b002a60da8e551b101106a6eeca3a2e3fe2bdb7b6f5c1ab09540e6c40952c086eba541cdcc8b70b885a09d05a1707c0ec7d7cae6b62e27d67649fdf918c6250f9f1691b67d07314f34580b9b76fb8c6277e1d536ae9aaa70c9fa3b37685ae78edf57623552309645b250d4a9927a7970f03d8f6c5a76958ec3758a40e8d78cc9b6de0f89b75c03b3386c4baa0609d3d1dd1d3335e347c106b16d5474b616624db3d8c3c1802ba20627d73473c0082fd57f89149e0c0fac285b80b0a601e961ec672652bea3719bf5a75590e66b6e4f2065928ceb004aa7b42551700e6d7517809894607c06924cd8e4165c80adf1254b9a50df2f0525884a9c12aeb8009904c4dbb276b52e26b666544e26b02f14cc0db59369902bbb551cb6a077e97ad55fec6c0b1f681444ca2463510b560249023b02366c40df1f24bac312f258944d5f504e241c2b007845849628b7b71d1daf18afa2103af0cd2ec75bcc1d5150b747969566e4e5239317d366dc4a6630be1ec66a55c3fefc33e6dffe9fbec7f1c2b79e75d548c337c75bccfff3aa8c00bbb7afec82ef8ea574ab2cdbf3a7000324d2d3f255d615a581558e62b25cdaa412644bd7af0daf7201a3d1427171864ca17a32e09413d2b098a2556e585aff7743cf59ebeb4b18d6468f8ea791eaff6ddedbbe81ee2426cc8ea398daddb5d65abbc7d3d861d45abbbbbbf67fa90ddfcbf116dd49bac125bac30e0fa720a17eb57edda979fc305eac680d30b17487a4a25d33c2284529473071274d93b00b0f4311f12dd5fe9fba3c1371f732ecf8e1be6b3a091c2fdedefe11d188b9cb3978ec557ddcb08f93176b77272948ce82a4389900921cde0f0dd54a08b6eb4d9cb60573ce097fd0c0cab62cd956b258ded73d9c937e1f42f30bd9197e7e86bc107f2e042467134747926920a78e1faed6d11718ab66c57225a94d7a3071b2b343d71f342c584e068f914cdd8365041d5a2ea910818c3051c0a9ac2d05590d969578ec5d91c8e347d19843007f3f043c3a70884b3cf6ac7262477cfce8386e65fd2d8ebe8df5bb67b9a9bcb78a27e2eec80ea80e872e664e4e8585dc480c772be2e4d0e250c075bd55b959db46b041d784d472d266d0e25854c4959ce599ad2853231b4bb11dbb12c3a22071221a3604b66382e6cba504dcc9160ec48b45171b17d9d697364b0b2a6b8a95745564d55365430533f596947a4346d141b965cdb06057ad55eac9a9aae46444fd99369b9624dc5298dc4446d82dc1893806525844f99bf44b24a086043385d09c9088b01c24e6014c1e1354721f9048a6bf000e456a32273433cdd199a12026b962b5a952ad2d6529e44e8f5b929d988a9c1619163ea4297de1e4847d29395b924eb93382996c11f342d4c8ad8435ac0e47280913f7fbd2912d45148d5c85585bfa977688248b6c455ad4b789ee0eae1047c393826ca1857596d080951ec84d4b9435db179024a8ef02eb7f39e5ca4cdbca17099833ab01e683902f159025105e6849cfabb3e8bafc3a7e148d1af2b2feffff0b0ec7de940a73141e7b536a89daab996021b889a93d293ef389854982a4e8cc27b347eda14632b2d6dafdfdddb33b5b079420ebf62102377bb6217089eed0b32680fe0fb81a2698ddcd5a09b33be052311af09db3528e21d1c3f7887e9f9d81def61de5dc50daac75d6295cc049e7b4426667943f4832bf17e9105a924af32aedcaba64f87e055e65f684448745f2ebe5456e63975e5b1c991088b73aa81e6c8b97e2fb62d3863901a3eef01c167ccf1d7abbc30b05970104ccce067434cfff582de067476048f41bdd347cb5463a406ba0a001afcbf1166f8005b82fd11d62953f02ac452e1cdea69b071812ad570dad5d80576b6c556670a266f1fbb56badadc90f01b85610e0fff68691e80e7fdbfd9fde323670bcc57f28a1df538a9461efa92bf8796bf48cbeb7d65a6badf5084917a3392b185e8e1cfaccb82569e9690742c78a6aab35d644c3900845a6f5920bc0f304e0e2e9ffde938cf03d67f4b66fa81daddf1dc745fc69440323bbd655baa030841349a6f60da609c69904b274004deb926b41c21641473651296120d44e98bc4842b878ba7cf8e7051071764f186a9a4e2a7e46acc07698da96a78f0677291ec0cec490bc5c50533b9a8a9bce5c377aa6db923a2714a40d4e0b16eba428072ba56a8347d8446601a1ccc4d5953db390b8b0484614b0c302dd98d89a99cbd83382b6295c9a9112c8d4868e54d7768b64daf4c1e91dcc444549e5b1f00839210bc8e9dafe5425d3625e468046ff5d648cc79221c3257f1c66c9cdb5b77e5c94866dcf57248f3b4461c7186369d5b1bbbb94e9f8d831c6581a3571dc81e32dbe52e667ac2fdeffd78e1dbb14e7fffdb1b4e597ddfd1d3f5e1707184dcbf835b9fef70cf6db43a2d3a1401251b9d67860338339b19d6c5328158d454ece2763fc02344a860753249373e683d9629cb62dda490c3eda2b4fcfa8fd7f779ae1dfb87d6fd7ffff8f14cc4477f8ff8fdd23ea83517c043a30fe3788a33241fcff1edd39feebffd1110c5f6ffb8e02fdffffffffffffbf1cc5e78b16a56da1b21b632194c10731af0604373176aa2060236b5173c64742fbbd1ae7d7d821c0b177752e5fe4389c6862317c4dbe75ce1716e4c90c95a86153d94a71c4d8871d023153714691cd6949b1b9f546f8c681a618d5c72d286e09dfbc608415a22c038b42455cf73eab0035f634b622e9670643a547aca402da98148d00435b5b7163e4d9b363a8d211638cb1c773439f4b2547814409e88a4b69878413f9abc993e6996c95aca4e02d8ff6ffffff038f1f4523d4fd757777777777778fe7c6b126517d7bbbc11db46bca8ab6f9482579ae34212671d9a757ea00d6b1ffbb61d654173a506bcd517cbe2e26f48c73d65a6bad37f27edfcbf1167dc3854b74873fadb526c14e6badb5d646a23bfc6dcff0fd1bdecf66f3c49ad2acd535fa81820574e3120707e3faffff7f48741f47f105e1a8e566acaab4960600925a36a46a0a69f7844463c601cc75ef330aa130e7d3a6a40d08ad20e546aa83d285a2a2f47227b62b84cb5758746a898211c2c8f214143556364d0366272e73dc9b38c3c5efa93a63bc7593f6e8781a73667a9cf35256723c24628cb163ec9f947376c78e1d3bc638e39c7334e79c73ce3963c78e3d3af45edfe79c73ceae75ce39e79cb3fe9cb331bf4663474dcb04da57f73e9f1c31c618638cb114e36bcdd75178ec5d955333fceeb5a41c9c16eb1b5ad902472a65216327ea3c586d316e72c18cd984b420a249d151b26518f9be8656a8519944915c6b84946341bb0e28c153311af09d3dbc767def2c5c200c4f2ab61595faf0c34f11aeb9e8d512568b0cdfafc0db81d5934b0c3b54663fb8484c264c040dcf16162868008b0f668ddef6fd398b38fb695241f3a62ce15e198830d0ba62027a823b71136a18120370b56b6004852fc0cfd92bc886c86d050d2f6699e30e99a0028a8888042d0d8f032a5ed98856b5e70ac2f5524a95a65252a8bda9704dad6aaaf28aae401bb0d0964d6ccb7364b47d197ace6ea6bad07daab51e7182426464b6eda9424137e0a0972b8d8a123a2259ad1c6b42017f6fb846a23bfc6dff81c0e424cbfecca99c9568a86c00c646a2046c6a666aab85a3b46d52158d50080c84a1158abba854ad9e470020982d00f3191c401cc7a120c759b51514000920d24058904034404c540c8a83c2004118068602c13020140a00200863480ce949d031b70400f1c3b9c8a4976d6f525fcc4dd8bd539e9aed3dcf2b46ea0c0954c9cdcf859f9acbe04af3438b7687b61882f9cb465ce0d636ef6030be0f62c8a432051425871fe924ed3004c0f8c652edd37ce454c4dbdc420c82dc809246810cccc6106e022f32a199dd15f6392aece8c0689aa511d8de1a1d1aaf5792470bbcb44cd108667dfe4c805dc20fc3089c3c9bd2217e9880af5f614c5cbdb339f417ebea7138c306c99b4e7ac091f56c22313b723d7a0e44132939293554d5b724fd6c56c83aa218ceda32a0dc8694066d2613df367ef78904424cd02605cfc47f703000741699da207bfcdf221f21bf4c9942356a72a6bcd105de3ca2613a5a698e7eb02afac0f9c54dc5c0ac87f12e50e78e60752275e992791866556f64c7816771a2230fb51cd887ae9b1afddf6f67c1b727512144e82f61403e1544f7715fbc81e4ddda7baf3c6b709e6343945317f05cdb01df0e0913c3b7aff0e6f6a8d44aeff8d4b736b5dde92580266854d6308b0eb668a8c272f30ba436b9049af6768bf290aa317dff50edea8f085c8b3be2c01c209f4574c8f4faad05de817403a80b22b5db1c0c1dd95152c7430dcef6c5ed06efbb963310948faf3671c8852c7c55345c0d9e592e325e35cf044535380d02c59372c00eda2be5a498dc59cda91aac61d0d8a645e5a77792a8f44856ab88edcbdab337245f96a3fb3a540d86498d6bcfc1a02883489d2f51628ea9c17c6e6e6f9e05563b2241969d2530ab0667d32fbe6cf357222a3b0dba4f25ecd6bc78f90f41812f13f84a0c7c8f1be97c8129473788e252f6eb86b8c61bf5efde3f7f9db4c813187f2113d6ff92b1f7acd15db0c9b5c3b7031a1fb89c4b509a89d9e15f77bc6f5f66e24a796d2949daf0f3699cf5ed4ee03a32b42b32f1522ea6effd1485aed30044d171dcc3be79836d67d8d9ebfda8cec523f40c20fa81085e167041341168b79b4127471d02575dd195db75e071ff63eb46bc3f0741dc23a1cc4ccf04fe45166724fbc107a7a3efcdfbec88b7a25df05d277cba1b185ee8d10ebbd6475b03bcabeaab3607a1f21acf34c726ce5b279af1f1a675bd90ff399cdaac7802a2195539adac02911e4f8e0d466ea182b3017449c6c8c36652bb050897fe050ba6bdf444ace5abe07d1f74ed758bae6fb37094f883938187099700e9333f864110e8ac0e553b416ee60f3aac241cdb5503b53a3759263ac85bfef5b9d73f280217e8f2377f591f5c4e3d220248f982991dd5d8f4189de346f393271ae5ff3961cccc7d1a79013aab63d9af1cc63f305a546fd4b25fcc01ef9c61eeb9e2feaf11b564ed107ae2cd51e942e4583b386c06a2e74e4b090cca69ce9509ecb4544eab63ca29bfa2abc5f6a072fef24e4b07bf3cab73654fb637378a58f072d0fb1ca0f411db3bda6971a5879b134b3738604708774c9c15065910d1958a7ab6e2a2fcd549ca0b774c103d953f11106690d358254eed5f5dc1893432aa43c952f86a6da092d04b452706318bce0458b40fd61ccdeb46ae40240d727796ce20554ec2b7de415eb89ec53083dcda72c8d3786d5dfa3ed6408354c3a1c4c00378927d1aa6f40cb2bdb03142bb959b418623669237f1d0203581244c22846eb5c90c455da86598913548c4e6e3438a28ccb053ee4b06ee9ae43baad8175f8db8be41a273b235f3c97132210925d4862f5ab4fc2c70263de0a55d48fbc4a042b47e728adb256238c89e5e82a98f9f0925ad87ed9815ba457cad89007970814d17ab28ce26ebf7201557b2c331ebd54d70da9004d0172297b110af864c80cc28cb41425e71f3a2faa2025e2f6d81c2d3284afdc6519f7da4fe7c38c874b05b3377dac6bb089a1ce4a43d303657166ca4300e40b5e36c741a7206c85488f1545747764c2b187770902b0d81b059f375888394609e992a3807dc5d29bd85ee2a1c2404909f0190fd3b352b843e37c850f35ebf645de81f5f76e0ac1e2412b3a39835fe3bb8f6647406c3fc719fcfb07d2598e61497392132b677b00aa50fec1771af426f1fbe4fb007399721d886e72bf0152c40d4488729c0c848fa525cb4f53434e006ca02fa4de3f1413a2eaa2f05f2b9774dc1d8624d2816f6201ba1ea356850df0c5241426917d86c1b28eac209cc686aa20f524722a4c05a17c2e4e70fb22932b180dd880c02738d4746c4294b8de18486961531bfbf930f529983c5028809df17d879a0fc2326fdde677fdc0751916a300354442a8b42c2de26abe95666da70849fb7d46e19202b34d3fd02c37f7f4f0640d023dfd76e56d7b41dc15f19202f630ba94cd14d290f5e18a9e398efd011438cbbff7800e5efc1ca5fc51ba00d4a9a60bdd32feba334e92c3426a10f8ed711f942b92633bbcb0fa1997f6db6a58df6a4ff15621926dbaefbcc6230693e1bbad5664cd00f12d2430ce5baaf9980cbbcac9d713f15d0a0a97af02e630b2f5128c0b06cf3a445eb62911f1744ed5ab8e46b0d3ddf2acced6c47120c922475e2cce3fd05bcae89e5909e8b3e2bbd0d9b813da4d34b5c4be0494fdc715d4b2915dbb154f832650c7fb6d0c4834eee1dee5bf7387dc83b1aa276ef1b44b9889a47c32b663d5e1ca724e9832d5e14d5ef4ed86a913af60d90859f15968abca9124da5b6f5c7e47a50877727444471dc4c218c63bebc298c5e4c0f98f5397500d2d4ebac3c1d7d9af48dbea025b1c2477bb155182c3ec72dcbf6998aea65b1b0b5dd171267903b3c8a16209e57768172bb6259745172c8c53fcdd0a8eaf0d7c043ca7f94f637d1d0f3c7d4eaced74da183c9cb79e35be9e1f0104b4558b32824efed8fa8a7d525fa5b5606cc0376090910d724e1134bbf41c0b9967efa60c6761af048d44fe4a06faa470c51c48c11784a31910af37dd16e60d80da583e2eaea428c20b5f0e75d0ff0e37818a5d2b3c27da2d0f8f78811026a5b494097a90100a08cec0eb2466a312c07fae483438b9411f298c885cad572a5202879be02841a13694da3c6501298634b7dfa0d6ba1b33ecf8dbe88a7fbf34b25239d9c13161c4e046576d3df141faf230a91eec9775cf7308c114e68471de510b070cbb53605a5c04dd386740a112fb1daea286569f75b927d3020f846ae5c3b8968f461bf403ff6ab237d16968696f4e25b4789ed9e97cd51550743e4988a6ffba82c714b7449b6bd9b888361cc99df147fb5bacc458377ef6e25bee5fca31f312645431465dc846a41b8fbaf964b04450c712f2f1b85ffdb5bf4fd8a8505cd559b678df09d70e97d852026607f8e7dc646b1d15b74441fbb55afa97aa25419ff8d07725d7edc4227fa79be12842f946223202f3f68be267edfd43115d6689d1bbfc0ded4f242347a21c53285215a8585ccf8bd46055311576280e82da6ce830353f3c50668cb79096f083d2a6fd109e870ab26f92206e836df2343cf1bf3736a291892fb1863983ee45075e755caf3e611fdbc23c6407ae6e71feadde0bd591d3b9e394d840715bf91aa102cae1352d14c6e9d424ba8c5ed0ee871325bbc2276d541590434a70d7d0cb6206ab52d6d8f46042f5324266de5285fa424dec52ec24f9549b7e84d01e0f2bdc8cd73f321d759e43235051f89338e2cbecd20e1fecb4c386fbe72553d696e747ea7ca0c50c6e0390a91861425a8d8259864fcc16ba03e2244ca917adf3af2005ab5421f52214c04e5830e2244626d6e8743ab15d95d637847411e7223ee34c855715bb1d335b30192b76fc746904c46b08f07ddc9b0ce8a52f47e27d058061a2bd46575eace1c6ce795b8f2abdec250537913ea35b9f86a3072e635426e52ccf47a603ab3a55987034cb1be6508db00ae2291e2c054142f395583c6665c4fb54351949c60d4809c8523fde2409f1d51fa81a370703dcb0459ca32b5a754a615d89f8028ad304451cbc6912b778ed79390c358353c84c8919f1b2b404c467b4bcaffb56f3ace83bc86d81150184322709e17ed29175c82ae4081b3de5bebe3154b6c616208f058a1009d44a849a1e474a1777a75a40161077cfd351dddd74626aa568ed465365c76cab547af4c63da7e264e7d73244ba3c31f9689ad5c9918840b0f45d6b0fb74a5aeec5c3fc6a45fee03461a6e782b21ad631a2473d6dd5f89cf96e43e7119c15a67d6915183ff0232e188984cfc29bcc4aea86b21bd1c7af3835eb6a468bce1156da026fa9adb8f84327411ca44d9b798bab2162ab8ca6edc2e93d28d16f231cdd851d00b3b29e04d1d828db325f61777f68cf01c4f64e66d4cd51beb61e786c5041fba20a9dd92884e118e226485674229ecb3b82c50aca8f5f2b72a3d723c46d99c9382bc368e2a3c8f38363d02bae55039ed83e6194404d357d65ddfffbc0a69d667c41118fa17982147497048340acc629a722549255523a102535612e275cd54f2e5683333ccbc8480888949e72e08883a0d744eba32b5441a24267da5427b6f60fae574c96b9e1225199e48f2b08f7bec805f59ef047d3dfd8455a805485084582d4039200b1da5ca3426d9b1e005280339d827523a66b83a65bd16093a99700a5c0db84cc46ed32b73a5e703ba57dec9a3ba0e3bb9e733061b4a748a6639bcd61b2e44ff52144c28f9a6d2310a2f434b2978b3ab42487920f11893fce837c54e889de299430e460cfbc9d74c822315250a04f0722fbd33e2c0ed24a700cef71b3502ec43100f435b31106affd3cf13e6a156ba3a7495f2c0e306dc023ae5def46e1f81dc43d6d0d5885a0deab08299b3be11427a25bb4a2aab891b00c13561d6630651a5de27b910ecca81b4cc23498abd846f0c1371d46895cee61536a140a038e9491b5a4e582291ea276cbf417cac045052e1a3e124b460a67637d207c5edd55ea4aef64878d8a4ed629e2f08c1667948d35d5474ef4631bfc80416c2cc66d9335a9a24e160a5a2f7ea3c7a5de49baeca1029503cedb12c59d73492a11fdebcf1b4c6760ab88434b6737ff3ddda2d0f802b6bf3a4f979003e479038df7a1a0c0a1d3cfa970a247c5a882b60c660063b3f046733da06a0aef5440e688deb2926a7a203dba244fc22cc8008b80239c0f773f4de01744d4eb67cc75a01d3486641b1a88493c0b40c7e5f33ea6e319c97c9b6085c5059b40cbfa94b08a813fdc342defef9e270711e4128e23cd97e2e949a44856e02bab15d6c716f7f58891842da3accbad8ca03065361dcb8acf07c1ace4abdbb10cd0226e21aaeb9458409e6eca569536662e7863e66b0cddb51952212d0c568945fb773f751943651577160d8984adb8a16d0412ce2302eab0f5441af31b82eb4a73271afba359b170bd3dd97687a8d25513153b0f148ebb5f2a4e267ad994536d727920ac7d672a2aed49d7e4aff38ac506a9ccb43ea3198951c701a06b9213a44414db58af9d5c9c9390b5652c8edc6c1150588e84b08741ae6de65205b799f488fbdb328102db06cef7859feb8f92b0e95d1570c4cbb8b0ad7c88a3b995c5a8a00e8d8b2537cc350886c7ad1282b1b06ce2d519677f7e9e32f03d54ce8dc65bda9320cfa2e15f3900c11b902a285dcd53c6092c2262119d705e5556b9b312e1544bd89bbb2b0754dbc273057e63cb603dab8aca39d1b6390d48cf15aa98c586ad736b0ae19c1f14011e70ef7eec655e3684f55710e360e286083edd619ebda5a2e05e60f915ea696a9a246abd6284801868da26c477b21506add26b2ae1262012fb57e37071e75a6a5bd1206ce49163bd66e90d1fbb7c4ead51e8ca168dc882857ee1cad4bb38173c7739fa5a088267a4baa56f590fa05451da888d4342634ce0e3e60ac7c4def1e6042c4d7b8fb2b27d25f0496b15d8124bd8c35c49ca796148b64afe6230357a947a3bf42a2de141d191b0515b13c14cc351e893407966be479ab233aecc4c9e2e004a59fc8260e58523c406643462223ade6d74f1ca2594aa1940895111775a47d438d1674c3feb8f00057be94b83e3e65b542ce0e4a5c5ebb459708ffc345d22b0b32eb990f39cfe2ccaf0ffd26388d64afed0ad8efb59b1d16505da173d4780df17f69eb9f186fe4cb43a031723069e1c9fb54831bcecf09c3e959c50dfd3c4f078f1a2281c321cc97fbe38fee54e6afa2c92b704127a077b6e94d3b11a2aacdd5ef3c096d8031e918246147fa188b99cee5339d6f6be47ed8fda22ab58874b75b28e57b40424a94147db5be9457238a8767a1aa2839c6ba274b3434b6aa4810fd0ec34a9a53c0225a0de2ce1d86077198be8cd1761b00052ce23e041cf3c538e90b1c6b5f6afaa29242a8d03ca42f128439e611248a4bf40569e399b99eb7f99e2fc200d8a7823dee1ba02f72c3b9eb3cf176d6c0641808aa575386632d4a02711140e41986a880e84ceeacfdc7175f25b1d1d6799d3d3dac5e56da16ba70bb25efbc0a49421f0b4f400824b968cbf7842d109c8298c40fefaf314bc4ec828dbec984f6609062a5b382169f06bf9b10cca91cc9153e3e7161164a2038b7b10b38dc0d3a14a9d7ddd0a9ff7650bbec6be3d41c2b3d1957d05f7902dce3706d8052706613a2e624dec4d48e9e0cdec7afa6ab2f594d47839526203ef92de202dc5bf48957109a2aa0d8f10ba18c9e1965ccebc3b4977b8bbe34c103ae2c5d7d71a136a6f6945f03e9d01fc57525f473dd228acc6ff99ae1a2094b5a965cbbf81db7d640eb0240531ac98b11eed61a1aadc970af7a5da782867e9948302fdb237491261017385281c7f8ba24648808b3f06e5004a5692a6e0f8b375ade33f8732930e57e26253af1809d0bd6b40a760e354096ec80abc3dce7fbbf76792860fd87bdc3a58d0376333ffd0a529a3dd55be79ec63747677be71f485bff02669b354de6cdd76d93906846749a0a566162facaec389b04a34d5bbc79326fba6e9b24c96654a7a9b06a62fa9b1d479368a46989354f66ca74dc84494836a33a4d857513d3d7ec389a04469a9658f364de74dd3449896654b7a9b46a62fa9a9d4e310946cab4c49b27f3a6ebb6494836a3ba4d25eb26aeafd9713409469b9658f36cd674dc340909654674c2545837717dcd8eb34930d2b4c49a27664dc74d93906c46759a4aab26aebfd9753409469669898f79366fba6e9b84c42b702a62fc29041a9353b75b2052b29a745554217e6957e25aa9dc5922518b78b7ae9b0267ba1fb83785fd91f7679e2f596b68f13a821ba27715533ef6eef673a30c0582be98d5f3b81748070f75d2f7516d3bea5e1e6f9ffa7d5edb5a4b885a238490bde5de01ca0b610b7a0b41290095b06ad516d59b4375014479a8a796bebc7d8e96bd7e94a1408934d6a9b29c4307a8b3a53e444448410515474e2ce580062d090e39ec6005340461841217e1ebf5d7ff8abd5eb1bf6e3fd98c8ea433334850b85092024a0a9bd4809555a67cc937b2ac32e529d7226e4540d5229c14d1a4a8891dc0786232737052924a4f66930caacc4f08675dca1ff983e334075f5f73297f0470ee47c75597f267004f5dca1f117e74de3a220c40470e01046026c30180106ed8a8227f623e3f4b207f665c9826903fab4ff13fdde7270cf2e77502f903933f369f9f31c89fd8e7a70cf2477e7e2e913f389f9f47f2a7c6e7e70cf2e7e6f31305f227e7f39306f9f3fb69b10c1e670d79b6f0386d689d855d789c2ac893068ff3863c413c4e1cf2bcacc1e3cc21cf1570f7f03875f0aec2e36c92e753789c3be4f9e171f2f0bdf1387bc8f34ba93caec60648e362b5642c6665fa9c55a6bfa911667a1c55a68f5d2975d8dc4feaa087d1bfba2ba50ef1d67046c70d0a272aa4bc5d311b89cb1443b6520f67cc5a0c4f2990483c340178767c5a4ae9ad65e6719ecf574c009e1db8a8addc10c3cefde4ac5670be8235d4cff97d29086900c4931716141de1e006862d6ab0431730c0b8e005144f96b4200865dcb298075110d432191ea841249922fb21b3a630a5f61409975b2d5a5b2d1c557270c1133cfcc008232a25ea8831bc804282074f7ce1c5931a540f4ba620528a01194304e10533ba84a1cd83d3ba0e4e14587ad7eb9d5d46a0fca5eeacdc2585ea1e7a9a1a99baeba0eb4e1b0db63f12653a6bb3e699dece3d12d532922ecfc87cd6a88c8c8ccc55200aecccae99778febf3b34bfbd8eaa2ae76f9705dce642ef3c6e38bd65aeb575395abe365329db1470f0e3f554bd174ad995a36ff1a5f20eeda53671dfceecca909e2a51d5d24bb6907ee272d9b77e176d24d79d623ec386d4e28c6aa3bf37a654e6fccfb284f1999aecb33ef44135861c284c933eff0cea29996b431076938735be1775baf60157dc47c5fcc14a72cab4c69a21721cb2a536ab96bd467161d65babab375bba9b4e5eff5dad59df9c3295aeb2dfd74eb2c50ed64b3394da82cf3f634a3b6d46e24d3e961df6aad4073ebb2752afa685d658bc42759c588a22c453b831d672d570cd628967e95674deaa096b638ab163b4adb90d7cb5a699b5b5e55a65297b4724f4de9a4ba45a42db7ce6105b44c4a4ac1532aae5041a50a155db2ac4285153e595679d29267ad7bbcdb3c5179926263a3e201794090070fc803825ff53a11fc6743affa87e454bf5ed67e6f708636bfd23d369f97b59170d9261585125f6481c60f645ca1226349054ae060c9135e7056a292b875f1c513337c740c307880e1882d8838524185c2dadc3ba558346126dba4525f7ffdd1d778e391debbcae61409976dbc14b579cae65304627317e5b2d42b347793901b538a79b8d6536f99f747ee8d479ecf7b8dea7d56b3deafb9630b23e9dcba0a8f35a7801051bd660f1369e171d668adc0cae09a8f1caec163cd345322dcbda73ec5201c26a23a973dcc638a906261249d47a29c52610f8f3cb9c1f7ade2bbf0348851a83c52a97a692ec514fd78f2298f39c2d78928803c29d9854b5d905e9a4b1d1e4ef44143732b7deace148f29c2bdf7e570ab0e44557dc79a390e48cdb98fd5137fd49c3bf8855354dd5b61e66ef1e09592470d4f068feccc33171f059828be4ccb3a01f6d7eba91a631fbeb5fa666454aaa7ee389453dfeb02f088a4e90788b2874190931ba70e445377f41ebbdfc18ac7156a66e12673af9f220af48d2bccc30b20ca9c4a7553afb9a377f19cc8009aabce8925cc4c737ac77e0af755a5faaa68467a15ae344f612234576122de45d299e20f8b5f5d2a9a3023832beb148fadd796b54e709de03ae8ba630b7d41f07ba7fe81dfdb059ef50fac293cb28e846670ac3406c43167c59cde185ceba765bdb25e8f5371c0a3c69f181664e6fd99371e55394524f59709b0bffe3a508fa9ef2a95ea5fab0ed699bf5e4fa9f0d859f55692fcd5709eea34775dcaeeb9177b8b86e6aa2bb38b06b3309b9bf9eb85c7d40288be3bd6fc9d36fdaaaa716d1998fa0c7ed18c736dbeb931f131a20f563773a00e32936107676e1f76ebccc5f71dbfcfccdcc3eef865582dd7eaf4495b58b34a334eb1be58e3bd020d13264c675ae3df5dc1cbbd0202c284b139ec1265899174b6a971eb6db0e4b1e3445030850e65e0000c9725243046184c5efcf0840b2e785c199dc9efd0a1337b776a8144d4122c680022a9890556be6c9122c6520f5ca0d508638c1ac0304113a6256cd11428b6181161850d6893faa014a8bba1ba65aef52bb05e14bed76bbb74175384fa8f7e777570869da4a15a56570dd574052faf561ffdcedd5127a7a6d746b59a8f5d9b53a88fdcf9ec7ed12438e7aca9f084b2a53ec759cb56ec3850efb8b3369f5a36afaa42d8af65739c506a14cb9dfb0e0f1978c7e9347ee3cc524407487751f5dde6c0d428faa56f337fed25d3efabf9be8f35184937d48f995532acd319ebfabe736bcee34a39db716b6aee7dd66662b095c1a375b9febd855918099729cdbd77ea349822e132782e770dbd87a9e7f2528dc786cadfa7baab7fb7ae3eb3b28a962e799c46b28a162e79e6094a1116b4e30e90b41d3bc6a01df77406ca7a6bdef77b432565900bc57b27d29d473b787c67e7f2b83baea4331ad5bba1ba50a92ec5c62bd0ac127da868eab5ca6e5b9fa6babb0b540aa89bae6a6a17356fa8eea9af798b3e6a926a6eed2e542a55e3ee628a403fe96c862decc29406830fafcc33f75ed308fc77af4695bacce9f8fcd5a89ef22ee9fc3e23bf57fe6e7f805d635dd2b72ee90b8faf57f6b08753584aaf6b3278762d7faf94f8037c8bdff4ec17d677f6e6e751f78078ecf77435a3ee69f9d379be6dddc51c41e686ca400d85ed7e5969ebe4d44170ac3955638a52ba25414d249bcd092acb5394ce7bc89c74c61eb9d64ae9e55e6fab56a0b9ef121940942b7675b4eae46ec77910d580f8e18b28529268a20bd10b34786184134d59a4b032af539f47ee457440b0f2b8f54b7d68088a108fefc0433bce030ff150e1b1855bae2752faf0183403a23c64deb1c250ee5e3914ea0a34f3b892b6e34a9a14bb3a91a6cc024c14a32da200618b19681300549e3c51840ca000c30bda7cbd126899ec2c9b68410beaa5046a99142bb8456102063f582a401a2670a106209c6851c55cc28b0d52a2a8c005232cac0db8e080c90f4a98d1027089350013a43c3f8bdac7c70e4d7a26b38f1d9cb44ce689447d3a2044942e30e8418a1764a04d06ccc0075144dd60861112b4f9599b9f46452d9bf57dfab2b2891650c164c50b54204313b47a396b325899c7596b8e48a7a7132e34343434b4b26c82082636033a62c82df2bc9cffe65fde173ba85c9d9979a9b264620636c8e34ca572db00a7fab88eab3655051a49ac2caba01143973aaa606a0f7925d327a030cb2a5138c0c2ca1532f862822f3d08c1650624ca840fd0d82284931a9c968031c39082460c615cf14314d40a04b6d4e0490a248458820959bb0e085e11edba94f5660d33008298a59519dcb6789ee7794b64a8b14e3530e5d279d999d4573b5b038c6a0717ba884183105e62a8420233d0984205891280b14469115f9e6e788207189ce41752801962862c9a50a2410466d07083188aa28079f2961041193e70028b253466a8c245888c254e5750c0c318b6951251456c51e28b1f8049c3055dd7755dd77151e8e7759d93c7714a7495721c15aeeb8ea81da51c2783a695560ae5288d2a9ccc0088339290685ce901081cf000091d808106a5f40625b8b8e0d1c75ef5f33856db2f840094131c31d58ac4903243254a0f6e4248595aa28929ddfc2b4629a5f43bc2862b404451e44210ae10c1a248d8b8941103315cc0a28989091a41d48ebba1d383c749a707cbd5e8a1fabafaf2cee8beaeebce09231bc3135298e0a9e988234b9c9e5822e9079b0e4174f8018a891862882245658408370882096c7065076150f1bc26b4845c8da995d2ceb3adfa755df7434de52cc7794922ab7e499ee7c97075556bad5ce5aa95ca71615739517e9f0da0133d78de085750e0e48c1f3ce15464a7dcfc2006286882c50b30a2ba0e0c65a8e779d78158c11b29a14403155037b0420c9a2282b2fc60830e54b680c104b229ac029dcdabfe7decf17dd2be14b284a97f505bf284099934d5274df5247436dfb2c14a9aa4811826a47aeaaaa7709551d596e7551f6b963c0f6bdc595ad6ddedcea3ed4de9a6ced556bde4b9e475691987842787c439519f1044018288264a3ef880046dbeb3cc77d314270b82368060cf1b11edbb30a16f469d8826c516ec87bce2c50a9810d577d5250d26a47bea29acc47b37ce5b9e62ff7d89500c0b4284c3b0202c7426422faf78b182667ae5152f45f9bb92e619998109e994a4de09514293620a4c30a16ffec36de43da59052820979fffee1a146a21dae595a8b0579b063734a1f11d73237c88353acfcccf2272ac10bba3801172f9c51822468314c6162b0898182a72368f2f605cac7f2cc1da4668a972c9552079c72045b1ba253a2f59d12f5a19dd2143b2f73a7d43d334fa09ee1b4f960555be44f0172bf6381ec94e44ff71364e95a95dc46e42622371ebfce05b93fbaf27c8cec916fc91feff356fed08b0f3ff1383f4e5b4dee227da8139d7131833272d3e9c5cbde05228fc0beae043a9bdc1de91177f49ec62e2af7e98aded662c74e891a719758075718366fbf7aebe15b183657675d8a41b0eee02d2e328117264c181a9423482c0c2f2b5eca7469d3147f74876f5ddd7aa3b39ad4013545e8cf0a46eeb76e0d4312a06fb912c89115c31296be91e495a04ccd4d991856ab6d0a37850b77c4e4a618217fb8bfaab050e4be9c352bb9e79cb3451f757e5d77cb4c3589fa886ffb66816ee1a0e4be5d926402151ebf0f7bf855c329479867e1cb6377cb7db0c379a70ea4087d4efc316d5dd745605af6a5d670de5ad66d247530d9b1fb92db03a7adb5721cc74d1be7a34e5b1f0c98bf29dbe655ae78e440ee6e5247bf69a0cc5662e1824ab6c9128b0e9eb20d7dd896b132fd69d41c81e269a369c89f89e7165207f7c3de194567b56ac5698ad0ef6a9509b9ea6ab5ab55a715768242035ba3c8cd25ade08509422dd70b33c17bf7ce3483a9701e4162f3dcc2263aa0692c3c6f498cf5e22b06a958ea850383b92fd3362f07c5dd5ad64addd34e9ae9c99446a23eac7f9fb5afd77f847be5a25ad64cb9ff3d9192fbaca49ec239bdac6d8a6d0a378573caf2b42573365a15c2726030f7a5657d28dc17b1019256b15870da7955b9d61c9c9b18ac86cdabc645332313d3b2ac951882aad4e7755ca53da58e7929b22ea765e1179df5e7ea765eb725b713f5797dd6563cbe7275ca7d10775996b03d3b272dbbd98e09090b7632774f3cbc041ea8a70dc4b2675da714d583fa807f65591ea72cd328ead351510da03410778dcefa4758a46c4408367944a9b6c102f9492b5ff29f1f73709fcd611bca907100e58d91d6c0ae033d4a3d8f7a1ef53c4abdee159c6265066db092cec676c2e2c5d662479d8fda22ac0c42105c224216566a341113d174786260479d3c67444c69e20917650ca1c5484d8817fc70258a1667d0e6757a748fccd208283b0053061543b4400c128ec6a859c11404a31c8840c9051c7a880107693c3d315925d1240b140f5c6a48b24145185e1c5153220733a6bc010f7e30c2055ba400ea0b10a0bec042c5124d6a473968e086265b8c71c512267e5471818a2b4d7e6002c949492a3de1c105881fc6f8c115348896f8204b1730b0008aa21e66ad7283c2890a79c544e232c5484095276198018411675c2171e084963380104605b626e4acc5f0940289c4034c28fcea2b3cb47a78229a786142a278221a6bc55af58a655b2dcb5a81938266dc52234811c529cf1124ada1f87d5afaddd60ed6de7ab48c07eb6ce95bdf242dbc923645d5e90766f6d1dac18a19069e1ebc6c420732b214818879c9e8b4f040ed19800952fe96c2dfee81612af5864a5d66f05cea159c612a480ac7bcbc7243e5e9e1fed25ec2f796b0b76c69d9fc4bb0b4079d4dfa29935e0b08972c2d939928cf39df0388faace659ab2be5aca98933b218d212801ed0858b15a3206088810a6d5ea7477f69d97c91dc45e9e4a9e3e1b146b5ec26c5f6bf8030b094d6dc4566727335f72d4a4a5a031b080720ac00420b6dcaa16dd9d03893fb9bdd3475abe863258bcc647a551219f504441210480df655b668dabea491251e7574f2f831c9233d5a3a92d3ca529639ad2c39e539a358270d12618f20b199d2d064e4254f1f499ba93bcee4d4c1b0ebba0e3dcfa3e1f77df53b2702f9b0943afaf3209d4da98aa96545503e4c9db48c3e6902cc7f5bd8911e39f9aecc324bd9e27769a6489549f77c556545265f52f72065900bbf0b7e2959fbe354563ca80ab99082e1773bd75abf8361f8dd993f2965e394852290993f555da5defdc352ea008bda098b1946390910eaa47b1acf1a35ea9e21ac10363c08c582d356a076c1b6777a3dd0489988921b2bd3a3277694514759fc849a29db141b4069229e363aebeeee685ff9fb30e5782e9296c9dfb2b4c2c4841ee599e428cf0f75cfa447337f8d948f7c60e6143ea2fa0f9b0cde1ff3957a039a26690a8ffdee40b4c70e1769a4a82c5fb191d60ef6601076248a22ca395a265f60256da2c9e21db67492bfac8692d2e4ed6b6639e7c447661e43daa11872b1b25957235196bf116b999cb66542d45ab9d872edb0d7a5ebbcaecb16b62dba740942adb46300522c50d0f934e7a47503964e91e51532ac60d1c79c744e793760a91457c868aa3580b21b89eae086462361a1055312c8a26f5004dba7e7c9fdc67283a7dc544bcf177e328777507ac04a2c3780ca5f96335359f7c8d72b33b55e0c8b0d8cb2c4a245964e50f192c1d65b74c05bb8f6ac2b602978632d0b4f89401d2b74e60eae0edeb1850cce1c8e1f68410c2fe58f3deb4aa9c3e211a41e4889a8300b33739db92c35d8927f32788a472c37309aa20905c820965247084439ee406d83a81a40e5d4c1c971549452073d08b2f038330b4b0da24089829558b430caa95b2a86a7417e323d07da03f527fee09e82a5ce7dda8378ecf0e108da3b72f7b883e02552e42753ec819f4c4ff1117a245f96528777ef1e472f59b7aeeea87a3d05c383233d8864291e89c24c4710dfc3aff135aa300b33bf68779d9675d37f3887c773c2cc1c26a18ba5efd7ebfb38ac839f67a697401d36014116d87919d228be7aef4b5d9ecea494722639c97349d2996d993d9d75b707774b58724a81ce5a36c7c994e72753f7503c9bcc27ddd378a97e1ad569946433329f647e880ab46910c05a41ee7e52477f480d15ac44238f616e245ca61c276b133c54f1307b1926b1943a9c28aa41964e14ed20ef4872d2b4657e8a148a9c2d60e91379fc7c9821cc528bc435fc150e1d78f4820b5f111ab5d6948a6611b374a2c84bd7751d75a2b682effb3e2c4ed454406b2f88609658c2a4b16a7dc10a45511459b6092e2e0e58b4b084c922cfc4b45a3386ca8474d22b58b6f821cf804d802b50de6882e777861d3f266a8801162d39c0020b29b4be610a1da4600c148cb182285adf483f497ff6bbec91bb314c080fc9f1cb30a13a345f31118de25196411eba8a21d943c2e5e6660ea0bcf16a59ff46ee1ed37aa7a28f21b93b09a10db1f7c9f37daad4ccd1b2e6e91e6f4ecc02973bdccda094b91cb92b8ee988efbfa88865e796f5e7029daedf98bbacbbab1fbed197be8e54d639f2e79556d038824b173730a1832de5c309a66849238a0d54409b975f0eddddf4dd7452e19494bb9172834c6cadb204972cab2ca125f70b906595256cc8638edccfc1516ebe9b8105795251d6b2b72c05b66ffbafbeec7f5d6765b2c10eeda08136d4c24c103428f42dc86441637d4896d1c5d38d36d4c208524471a2b1de4227431434d058180acc04ea5d1606655577ab2efa508dab77770ccae255b7888eecfe09ab7ae843d54fbd7109974e565c7dfe864ca5c2637f15be41daab9e1d7e86ab109700549db0e0b4dc0b8375092b675dc2cebc32cae281ba6f55c24a113c502ba0eff8d60ef6e31010ab5618a865f3253889176642d7ef2eb30a574a19386b07ff8578c908cb48110cb46cced724ecc72f8faf7f1f88b1ccde3c92b762b1dc9d8951b1e34c9ef33726f72f5d9edc486b63333d853debcb8fdfe4e46d944d250f8f393a3cdee0b08de171267cc5c0dfc82309b93109427ae84c31852c734a6692a2100a45677da7d92444489078a056ddfbd19954810f8968a17c885b1402afc243aa83a0bce36cbae3540ad2a1b329e2d7486b599a092694bae5f086e0413cf475d28968f474466772cea76945cba8903aaa9822f413a8c5ce536ca50ef9713ed55ad7aa2e4f58a4f89eb2d46c0f1da6595b5d5e3613f569a439eb2331d9dc4d7f8d5ece11be5a961741ee76e326e7023b36d2fc38a7e85ae6301775b95b544632eae6bf5ab928ee2377bbbd3cdbc74571514da27a2a4dcac28edc6d5eb151dd33f608515cd4176ef5495b61a390b67a3bcd79569e2bdc53e86c0676565b37512a2ce5a66caaf8234784b5ba08586f7575f509eb70100b4b3a132fb39074a2ad703fd15977ddb94e0a4b0dc00489d6ef267b44eef794390287975655097c531bbde5a669d83a0b6da746421ec0e8455bbdcf6da13e2ddc418978ec8778ec27128c7ad0561f7b890e6acb96eb399122f455d589fa78355a959672ad9d3c198322aad210d4f321b7aad6dc2d7b40e4be97c5d3e25d6919c54b30a1d647efca1d6a5d890babb7304c48eb318fc14aec5b18cabca4d9533168d5f211c43a16ebd5a88fe744cefa4f3e295e2d5309c2ca3c7a4e3a2823db3a489f592467738e200229c2b441e2207be891721ff990fb0735e476c1529a953c4592a1c96a9af7e45ad24839d63d23fd8ccd8413c75e3359f6483fa7ed9e89c3965191c595cef4f508929a976a302193d67dd23a6c14d2ba4b3a83d1cf0c0bc2caf4acbc34820e775e588a851d2b6da47c1a40909efb73cb7307e5cd714336f37823770e09d4524eba92e7b2edbffaf2ebeb3c85aaa62c04fbcd6ff0908dff309c73181eaa254843e98936147b0b50bc13d16e4e747c188609c18e731c3c740f23a2c9df541cf419f54804727feda4963151a2dc05c245a9669524adc2e2fce6b0faa111787144abf8881097f485867321dae48b229068371f1ae2e2862c37dacd25ad7261d23299817039ca603d102e47dd0384cb11102e4dda072933e12233102e4d40a2dc7d7588fc9937373737bf39ce0d9c1ace713e76546e2815936a88fcf990a48e7e4b115533a24cb469daa06e7d1a5533da427d2a67d4af50fd7aa35390a88fa4498a44a3727796dc4d992ae16ba90873953df4b5dea24449cafd08dc34e0e638f843a2b3a0cfe84abdc13950e360d972c867d4076516548557886872045594fbdda5bd8453f471642eb1bfd209267ca8d1a478691bd2ff6e1e819b7f4ef6bf57d2ba7cdff77ddf57e4eda3f3a098c8b935aa96fbad65e9628daa054e1b4e31e660e5c1b6ad7b3c1baeb05282dc6fa8f6f98c7aec2e48a9d42b9df51c9765e69c5faa93c1548cf9f4d14a5dfa1e327d37835206bb8377c41c7765fe90c2980be3f06794533073b075db49ebdc6d272da3616ae2996692e16238ae7b2bd160b9733178b42deed6dc36d69bf510b39ec2ac4f5c03670864f5cec9f77ddf10ea037b1fcf1c762f672c964d27d36967661e5ed555aa57d6673e73ae6d5e92fc39c0943faf23d9f1339a475ff7e8216d52c26e70724ef1d87df6d091fd3917e7de5cd87d8ae6df95e1c04ff431e72753736ba91e19198e76f4a39386b445632895117ab232dd978969c9261effe10e73f855a3468d8336afd9883f52af77f51790d56d5eadc4f529eeb2b412c6339f07c68ba23efdd44f5aaeb4ac3f6d2d2c73679eb9e35794fb3566aea151c90049bd5e2885efb396e69946464373297d86bc762dd76ab51a876d3dde4aacdb5c31e63636977529869fb514b7152debb6b5ecad83f4cedcb6efb3962ec1ba78515b703fb5ac5f8fb0fd7db5d61da797dc4fd50b44e69883aadbb696756959cc6b2e03825a16834b006770e1fe0a3377e7ba3b735542b2f3b276f3401d8a0c104d9861824c7c020d1326870f592b71b85950028b278228a30a295a7c081d6078f242920b4bc0ef3bea3a248ee33efc19e5e82e122e879fd1fd903afc8cbea3eea94d394e3a75b7afdd59e2d773ce5933424acac2ea5618ca215073e167b80af192d169879d8561f3335f7608bbb34bcf7ace2edf840aeb73edf119759983ba7306967b97cfa8070d1e7be8ac8c66f02893c1e35b38c45dd781e99ef07def39c4e390fc01512faa65cfb3cba4f5ac5aeb539887852e7fd803d3b2d6f1a272df8bea1e11b7130f4cf7b0f012ec627ed78cf493f487a800de157ecc0c44e6a51eb4c862053f0081054c2a90c3105f6c63d020053e801f13255ab4b0a2a9043af04286068ac001aa87a62a68805919e5f99c2b69b02b69206883d591429b6650b1c5ad6b95be1b2a090bd6206c67a34983bd080604d060379a349c8fadd4da618888360445e8e638875d66a1a6e1e02123332c1104ede6528405c130ac1e76499359884586d315b41b0cab3808e73797349cdb37b761d7d6465debcfc8073bb6edb3b5d2d7b44a12607201b2aca204520625d8510a76b5765dedbada75b57e075377e6567abd5a4985212dc3c00cecf3f819559fd3fa2d76e9baee840e2fb900a51ef68602a7b024f468594bdb90ee19fb185040cb5a3ab513d89572f6b5acbefee8963c01860e7215a9d451ff9ddeb1482e32d346dfed5acbba6b436c34c83f23236ba4d44f8c9660ed4489fa740dd6b5fe8cbaa70c283da0c1961b0eb72d8e54a1039816d410c40e34d87c40e4e48a14a6190031c51359d01aca9518a03821c3cdc912970f4b46b8c04b16b52968cdc50d8c78508517232bb850210b273e34a15285132b1a1005058316347a7084348128804822aa0916b631bce081144ca294b8f2830bba7f4ed80a72ffb274513ac6107285ca3d53421eb917e99169db7223b5acff1961b160ecd62c48464e349b0c94b8228c17aa189104f7d8ad4953b038d1a4e8a37e461f934b0f3b32a23e43609f918f21565c2088275892a8a5d183135abfa3dad65036bd811a2e6fb906d5a74015c0d10b5442cbea48942587f157836c473bef3db8d447ee1d06b9cad57a221cced1b25aff6dc10362a07bb8d93454a17b8a70148fe0fb6091994c652dabe786c872709403393cd61ca40308275cc0210a8734be3ca83e857aa0fa12ea0f7edf57b9944a012dab97a00455b804a096d5571ea5d33905e8606d903399c72f67b144be32505720708aadef1ba88576b4c352de519eca771f2995a7f244684ff9f56bf7750ffd64879dac74cabaaa19ec4406745902e94cc7283263c5a4f90b7b36e52aed496b775c77b3e368953f72a459fe7097ef56929de7eacdf334137593a3e224cfbf62dd53a95891e76b78a5499d7885e9841637276cc09441f0ca486c9e7301567ed892bb07b62ca0b274ca82491ee712793e479655b240223bdd90d247a747965247fa04d11ca1f4a941f2493e19914f495a36650b08972e7994b7c64664b02305c2641ae42e64297a5ef8bd6faaebebd0efc3a195b9084af7961969d54109721e1ec3ec3d49f7341e6b703792e4442a46f2a561bdd4c1cfc7f72f0dfbdd0892249ec800a21ae699bd7797e07c620449922b7636e1c934996a2a454506106515a62999bd3b2753cb66909a39bc143e6999cf4c0a939866d24c62c28e37f23c68c58eb562b1325956c9c2876cb3a4050c2f904205366092635cf121071980392a4305b4792349e6ac1949e214be7085085bee29f20a11529a0a574337519f6ab3357513f599d506a6c08edd649b229d6af0c5d10f74f08216511e90032e515cc1440e5ee0c394ef9baf50d4c73b5163a1ee2a3cf41a7a11c1ba3f240a81e141587b17d618d600efdf85745761252a25508454f8a34a249d716458efdd61fdef92066b21a97f5889f8d48580e1c14740f5efd3e84a0a133289a0628817bc307164d8f0b3a4541258c54a1acc6683275f7ca034a730495a0b862e5bf0c056a38d73cacc72c9b0b03e114dd239b7d0a68df322f5494b5d0914a15049f81d2664080a2c487507489a0a4b3a13d245dd10c60e3b64a9d568323a9b1f326a9af81654ff30ac0f3efc38b7e4f9d60d56d27ac8a82c89c114537411b1921654b896c2b0c641b2c06041925a2e6130a9e5a5e3b78327d2f8c2f17b71fc75c7224872ecf7397722d1cb8a9bbefe7e9cb713703c46247699ef5b4401cc308a83e078ec381ebb1483bcf2183b8e03f58d1d0726123b817bc730cc8426c26122f4f68d8db44c36b9397779171e8b20c937a75dfd28ceb97337774e114625995e4e1146121c198952192753cac4073bb38dd7d8784f8b6ddcc6e63931efd771dc03e021dc388d8d1bb7a8db1730b7a8db173046b854adb917769154d8bd3790d4fbd79ad38460e37d3c6200841002c6f13a8e170e1c3870bc701ce3c0386cc4e0c031c731ef1b9303628c5fafeada1dfbc4b020364e6f2327e736366e632348ce6d9e63e33636cfb14632c58921a9d9e6291bb7b1c1638e0d6d685b16cbb98dc7ee5831929a73b0cd6b0e4455d7da5c99c39aa76aee893e302c084db671a0aeb9f1181ec31c3b38d658a59c1451e06cceeb54c4b1d739c27decdd1c01c763213c16a3371e9ec3849c07efdc8fce76ce73d075ee0038c87377389e1d17d714f2dc9dd95431e5ba3081e6dc9900534301876229b38f576c2e79c18270d9752ebb5caf47bacd287aef3958ad56cb2ccc3ca350c0c1f75eac91996d5c5ee69cbe4e6d3ce6a08d1b735550b2363e4a281b3e303ec1756e69e7382eac1ec765be1756f10f1cf91eecb03f297646cd5bcb387169e79263e500451f4b3bafa2091cae77e69d9cdb710e80833bf79e1ab54cbe8564ef65cef967ef65440610e52b693937c8c53c47a20f1d9da65bd337917cc8649e4bec488db2fc28cb1207cf2f37b34936cd24cc8d61e93b144fa05f81860993713c0ce1f29e480d6ddc5f8a407e1b076a9c73eee6e4b42ce7e3cc39dc5d97483d77b0deb86e5c1816a4ef3a90be2be7068ff52cccec3ace893250bb5e15dfaeb9620fe17e5247ecf7a6a48ed8e9ad5384d871dc6e8a103b10b5716506c01dc31b772c125226f62a744fcc2f6f84d2ff98a62ca64dc400bb29cea5e8a3fb381f67d32d2abcd1a50538b8c190c41619449c831616b4739803246de73021973be7b93de84c7ee74a3a5b3d7103142010e1a456a3f17ce720ddb93c74876787b6738d567085cb195f1c39a1a145136e5e398af3226176dd5c166606efc263cdaedf9cde51671c47fa9bbbc2508e8c834255a17b702e732e716eec8a9426b93fe3441f393eeeecf4c6e8ecb1e3dc48f7cc2e7170289d21cead995e290299bd4f64f67e1569ad5895736397620e2ed232393b50cf29b3a9093b7bece36ccab728d9a56fd184fecc8567978305a1a324ca38b3d99db94818fb8cc68e9373fad93532bb32cb5468d9fc52298e17ce726e11d9e5a2ec28a15c076a23588596c917f99eec28a18ca850448244b90809999e28d73ba38a5a26efbae19c9aa6e079639a49b8994828218bb4f926489ffee6148fb265b1533ccee49b13e8fbdc25d21c876140385c8484ecc223779cd713e5ce39156a997c5018f60927074b2a57ba4766f999656a994fdd03a332cb79bbf54cfefbec685faf2794ba1b1cc22854dad525736fcfa3d7533cce2ca200e68a53a8ed51a1ae5b03d37bef653e8d52b8f7f3de7b655cae145c53067c9776feda39787363383784a7441f5d6bad15d3a750298e9f7bbdf1fa11c7d18f995d97edc3f3f1e6f463088fd5d78a73fc9cefe09cfb2be7f57a8391d09cf3d86d25d9103092ce391f8fb9c7e86bcec1446e700ecd7d0323e94c1ffb880323e97cf3181e2597dc8d8389dc3ce70613a1e7720e46d2f9de503c659847b9ba6e0d3015d6a84173b0419edb73508a3f709ef3be37780c6bcffa38b7e7ee9ce7ee1ce7e6c4766e4fcf772ecfab277623df1ca461cfe53918c2cdf9cd8d1de7e6cc8bf39d4b80f0ca9e8d36bf08d0c77167beb97d9e4b80ef5c1e9c73a02640831dee5c9edf1ca8715c99732ecec19b3b86f9e63cb7f6ec3738648ee376beb934af71659ea191919189394dcc6b3eed2be6b0c31ea37fdfdff80d1bc7211c0031ef39457e4a9137e7def7e6ae3b22c9ae9b7aeac2b09c737884a180f3e67270101c2c5bd6f4ae0351d71d5db7a139a78dc2cd5d6f9ce360580e0e728325eec7eee83a0d8edfe07873afafb9e91b1c37b89564395c24ac694c04c76f309110de2fc2e12261c68165cb6ebc86709a03e08e35e353d104314808b8b6ec06feeb8d471b58b60cbfb60cd313ee652ec513ee657ec716b20c9d62109a65645cf764de57e6af7b326f7ace85c7d7a5f823e663edcbe0ffd57fdf378d81afd76bfff5fa1a5dbbc69b3b96f9c4b02031a78f89c50ee3620e8b39ecb0c3ee18bb2be630d863f5d29ccbf6d939fd70ee976bfdce05a23677c51c06c363cc15de5497ebf4de8437cdc99ccab83091d8633e565c24cc310c3b8dcc309b67eef8ca34b7b923924cf3aa0963626a2521d399cf048e48ccfbd29c5e7b49719130c7c4e02e6addf98525bfbacdd43279f1f69396c910cf1b87860555a9cb244bef52f481adb3a97bbedfa2be3bc1cc2f2d93bf02832c593a657905064619e9f253ecf0bc75b1236592e5291326a7493b972a3439c9cf2c4d5328cd4def8f93cae5fac7cc554a1d9db9db4b3bcf7da79496c9cf26ea33917690b29c482d93e79a8ab88db1a40633a0887e38819420ecc003a530251040942635273110e30c32a47cd7e4db487edee467146ddae9e9022b603d388404f1f5b7815f47c5c284540fbf870fdf58488987bf8717fa1e62d8144a5d1586deaaf51656e211c55c4660e63417d23a0d560245c8bef599cbfad68cb5d96258d0ab66be6a5e83012d4b410258a86543a8cfa4d9d45fc665a3437d24adaf3a3d1a07953031d0b2aac29096b5d87a1dd294eb1bebb4ac42b11deae8ac7a501fd8f42ed4baf779cf7e8587bcdb0fadde3a11adde487d92fa21f52ad4dbfb263b3ec36eeb36d7d678bd06765fb7b93532d70892a7620db2d1913a64c08553f451438ab01e22c5ca2341535ec2c07af948cdb0a057cd5b8435ae3ed824d4470e913f5eaee792e4cf08d9bb1c27d2ca019266838b8a682ef3a299c79c8ab006b4feba50ebaf156ebdb1907d0d1ef2545f5d88ea2bac048a12f0aa0b09c587e094934785982b7367aeeb86ae1e3ae0554f41bca47941de817a26d159bd088a17bcb0f9d589684392ce30088a5fe12111ab4067f5a0a48943e8acce0391f9c84bea98ff4edf71e285098557fdc284f0878364eaf3b00e4743445be68b9442940851c2bd9334d96b72574977eef42aa96f4075400713e2fe5d9810ed30572fc51f9dc9d9d4d61dcc9226695df87921a1889588ef4fac048a90f8be92f9f0921686ac90facc4bcb7af7aef525fbb065ddc79916b61dacf685550c8b00eb7d21f6ad0be9c76025acf75b58091421d6fbf6923663295e6a1da8ed95b47ac396d1ba773deb07a500d4bd041686a52e04fbcc41b18777d240996135bc7aa365ddeb9781a8cfa4e1bc9b46af8f32caa67bcdc19b2b69383336aaaf7bd79dc3b576402deb5ea170b4ebb02b52eecedddc3ece0d656217ca7cff05314645ee600de527034b5fe33817f629828fad9052d11fab0c24c5d24ff10807832f773e8e7c87a570508dea83e5685ee4facc53a0dd6b94fc19417c07247fbedc5179033d11c82a5718d8aef1d85380fde6520cc2e96e6255084b028779784458500d583f3c50c3ae12f1e16b5c2550b82b99b006ccf785e6c5879734cf01537480070bea0eebf7ad3e8f06529bbb72ddd6cc657945fd3004c3db9775ed6ddd982b7363aea4f5ea12d56c7f2deb2a144b3fd6216cd1c4b02a4ada09cd2474d67d9e88d6170a566fb08aeb271e8252b1d0ec3e710974d65d6249674434a2796527856d491df574562fe98daeeb570cc023486e8cb596bbdc1948019884f9346dcf24d8fa136a6e1162e94cc847e50da1b1a8248d53e5a19c850a9a91810000002314002028140e88c442d1603c22a72898f90114000c8fb2466c4e1608a41c86619041c600420c210010036008800c090d0a008fc363e5fda3f1fe768ebe74f5e756aecb1691711b74d60dd7f93452c81046d35c994e4bdf174d8b211928df0b29cebfcb2ed6d42e55a5bd72d4164549208e9f1d937dd335f6ba2fcd5ba0a19fe6c31872f356c469fb746204b6efd00bec048275889133e7684ba2e07432ac97dcb8214db7ce6a945b0a2b550c78e1b0728a5b29f3827ac41265afb24dca18ae6ebdd2363f70c5614bb90ef9764578bb202a582d900ffaf52a35afbdda438ab94ce85910016626b54ad86b8d962ce3878a966b0f09ce4c6ce3818703c330c411621805e5cd6af6e8d62460377bb14736755a58c4619ce7954ca0edd96b1f9f4d8c1b8a5f8293fc566d212199de338cdb1d1d8258acc10b7733fc9e0ca4972846087c24f8323acbb13211e30a991b87a93652ffab53a83a06112ba42d54dfb8f614949fd14edb747cda42e014a93535c2afd8e5405bc8bb6c2579a1b26cfbff420af8b6b0c39a727e10dd07ad9a1a93bd01dcc7240c31d6b9c6acef03c47480db4243dac5f73e2b7b2f5d2619b12282c75362609f57abcb526c4960c1f80db690fd7be7f4d4a2610c909f3c32f7594ccee3a9c06d5c9b411f98f1900f97461497299c2d3c91673e6bc62023ac1d8ada3a78a6a323128802879c0d172acb59b07861246c5bae3c51a6609a3fe66d28559253aaeacab786a2114d94294894888e0351be01e5e4686b2a8ac604b132385e55f4dc49c72071e4052422a5029bba9cd495fcbea65e401891d1b0c6d69523807f98fddcdaa5ed950f79b1be8e74d2ca5251975a446b507fc0bd78f197ce541670200407e68298d5a4024947d3e4f39648a9f70aaab386911c06d8271636370aed099b8550e1db4a4d870f8a0e9c0bb8bc7a6b2285188a105566432c5188e316f6b4faa4c50d4a02297ee007a480444ece37675df0613f94f38ec5fc035199015f30a6f1d8f7073c0b4d8b55b793138080dcbb19018b054be462302157d4f9ecb161196afdb6440683e36641d3c4657608760f4c5eb8f47bb31e9e32ddcd94b2e35f395ea0774360b0fb945dbe915bac23b5ce91b0a4b74d26c32a84c71b5f791f428d14c24ade3519999c4f9add313817221c5e5fd73ec5b8ab699c9bd019212bc599f14c9b33c2f5394668f0ad530e54f2b046e2562df3d693b51a136dac89ac4cab4f49ecf4b289a3936c580482b6c9d02b9797202928152c28889ab1d1c74819670b7d44a3a7b859a6583ac1ab32a0188ef91b122b7e7fe541ece992248cb64d5d03606f4cc6f7bd530ad6586ee40a2f410624b4edf26ee5da33d9c5c5a51c463c0eb3969189d4abccbf72196725d1052634462f8690781408a3a4e769401d2a88db89b27ff160ca6921504200c93ded22d64eb83dbd6a4a09a6e4eca35aafe7a668bbd8bf68a1a7d001b4a77f6675003edd6a79b86f27f47580f80fb238db1e52963d3d4c79d580251e9582aa72b996d799f14ba96d30fd1f9e644251541250bc2123c68110981b27edee2309ae1186c316357973db37c1627ee104ed5840f6c3206acaab20118138e0d58793aac657a706cbdcf650edec3af28ae9888af8af39e6955ab7d3bb2fafa305f4214e415fb19548b71ff51e7ba000ea5254f91f8895298c38fd77a0af0e2870010d01102ea66aa6fc1ce5d42a64f19d4c9f72e6c6834cc5dbbdacafafde8b2a4d298bc1e6d9092431924fcdda87d44d1d16a96bb7e177d1273d3622833b4eab8b3910e8888388d4b51757278845477b2e943058de1fa727b16a96fe5a34f8a4f993514af057650de63508551fb452763a626d6a0a4fd1ebe161c76da6ca85c8c529bdfaa0bca9dd6562e4e418be716810aeed36b83753aaf882eacdbdf5ded99105b9500577d21596d19fb3c9ab5ea5608363d12f950fa2da1cf97c4886947c850846e2e902f79e04a2eadc8b0d9118092ac8fab242b282ea74e5f7eb28dc01e96a7fca1a79894b8a2624a3254bcccc909d28b880c8975e3987c518c05237d6afdb54524682faea1ada7611519892ed5c06f98f5383032ab616ea84f30f21df3f70316a2be889c64800480254d1b9694455f824538117db5662ac3bfa5a1043f90cb28d8a376629155002708e781b7a4b0bdea78aacb15c97cba3e1ba2d7622eecc3b05f3604af69149212beca2795a0d64608d872be91a149eb41c0f8c19e26cff3e67d4580129129ee170ea5d40b528e8debcf0a7ca6836f42668ad4eba1adb90ee8afba5bb28bc676711d5dbe178f5fdf5d6d9c049ebd720923f9280e33acc4efcf1139c0397630c771aa4635a001ebe69718dce169431c0a3f72f6acbb955fa7b41c6b06f2d4c08d7309191fe84d206957bf287f9eacf9bedf0b19c9a392716d1eb97de9a3b16dcf8afcf327183e75f395480c1a50f942fd98dffa4c7404941b47ce62fdae53b4f18d0eaa72158dab250594b1b3c0782d7882ef38fb1114b542fca212048c1193603789336a0ac1b5e4213001fe54bca6e83efc4004327e6c3199a535e5e1096227109fefc4fca3539b3f40768126ed2d90c567d406876565332a0d9b499fe64cbccd49d7cb144f38b8ccb86e7a7b8b067511ae033c6f66772dcb4edaa8b47c5cc1d0ec24b722953562b01914408ca97003773573924adccbfe4accc8db1cc829a97e1afd005a8c0578e53d88ccc1775ba5fe47feeac16a00bc68946708fa099039e8ad5970477672e3d4eca1833648a5c7e2ed341bd3daac0f8306b7a843423bbfa92d5f853d0ab04381c1e7cb1d750d2600971a96c09538f3141bf9606d15449aa5838b82c661058e4c60503f83c14a4a31b44082582de27b2c6f2d434faea98b9d37f77bc0ef2ee88030d241a073d651fb35bbb8ebd27fa5dda84ac95131891cbd9625a15f4047e8cf418f0f0e4435b514ed1ec203932007540d14020ee8e557245cdc77b0cc7c77a6dd45ef72cf7dba6945a174aeb7e2b5b057448773d9ca138aa43aeaa573d7ebdc4b827c820aa2816f15ba188665681b7e934a615c511a1276486607e61aa799552d730c3ea33b8e87abba3c469ef552a2ecf830176f39f25e135e4f93e95911a1607962b18473a647e2996fe104d7930442d90788f1ac56dd3b656c26f00a828ded11fb11b62ac226998ab8838e90ce350fb3e6e721938c9970465c4852dc0811db648d8be148a46435aeab67de98715c5a4330570c579166fab6564709152f9069c71032809fe23c748f95023ece78b288577ecc6970865b42b3153f827c61737ca9d798d239c5dfe955dcc7c3e30ad302d06af86a2f222d9bebc39dd1c4b39b5fbf9ee98061b88d2a817f3c8ccb62f558728c47e50768615c5896c97ab299b1a15ec7d6517f3060867605851e0b60829ac3819c46be2663996fbe51911f7e774da6604289c5bc96d0a56801c3938c2b7c45150a2b513e9a30f149445b34a3e6ed1e0eb07831d07f485f9fa0a53e2bcdc9af00628d42456c016c77a4d71ff2f7a21eea3230efb1a5694b0ceab58918ba8b7a264f43439e138da75969b5689ecb16d07482c166d395abddf9be63e3611befcccc06f62ce071282c617ea119589f29f77a68dd5f0b190ad0c165a9fbdcbc4abc9b1da952028d2fe71ba0efedede0e28045f6d19b95433d37bef85c09cb7b0b671997b512ea729a0f9a908c492e6eef0a2227c71f9dbeedf16178373e89de262fe7a065e0d1a53de3056cdc9d605603e23c091ff6f05818e6807b89c485d06547fafad34a396cf10e2640731321232295fa5113b9cf666951b420abbb9b35edb19f650cde8a167f4e8230b0419135ef4864b24c3192f394bdb3da8fdda60b037ba053d37f7ba349ee11471b82902ebb00b605416c2086562cd834f6c1f0324e65e5dab2c35a1c23cc1d94e4496cbafe88bebee243367ce433be224556854b415e3d70f61a11ea7571ec44090244d9c47831b8b184bcf3d458b212a32994bdfdee51d9644a1ab1d1cea4cab773defca16d49710957e3ec9963452f76c5fcd692c68c357d0275becb7109cb88741839e3e88ebd2af6e1e85c93a5e0a2715f011977292dbd7d618cab54b28359bfd5b15c8809ab27c4ebc11e9aeb93804566e4ed1ba93f44144891ed965a768b32b46bc9908f0e817bba6c4853dacacc98d658fc142908532adb0fc785d853208d99b72203d7bdd02e8820b9320e698abf38a3e3b765d07dab472804a23c0f022707fb98ad077f7f4178a1d5c9c53c1140465634eb11aa2d4f9ec4af9f2e20804806cb8e6f5442b87a0f0b2a4fc623e2d9a8862b90686f29caa28e055f81e532d0a82a00f772c61fe396b4efd78e082fec455c08bbb7153d59556fa0c49542a93308f0beaf21be9b110d33d7e24ba87341ef23f72b6fe0f11c0580c9be17852d0f0e197650aa574e5140a7aeb44159c2a022a69682a4da4a2a50aa5d87f80aaecff078802dba38d3094fc7c6a2f9de618bb29cefb9d606c5301d4a43312864ad4421aa1e649f7419c2abe9feadedde27c4f818dae73510d377617bae9e4e3bf2b044b0b9b3306ece505fb923da2c0ebb646d10bd104a1dc433236e70b7c2e2a16d82bcb66ca5e07761057054b6ec9b070a87cd10aaf146a55477c1e680e1033261ef0f01e96eb586b2c2660cc61ef756a23ff4c3728e792ee85baa0a0147650b8be039a03a8a883527045973ce6fad29c27fca6b34ff446b46ccee2602a0c524cea9108e35e80b538e4dabf422f6e1e99414ae88ee56d12931fd078d3f7b09808535150967e5728e108dc8bfe30b8608ed1f721ce46fdd90c6b5557fbd775cc0e615419472ea37ea5e45ff0c8faad7149cd980c2f25f585fe9d201eaa39b501fa54cefcc62d27259401e2947cbe33529789d9a72eb1092d3059a5b508cdce37e95d85b6b81f0072819028ed8212291d0901d9316c149a5e13547c0cee5ac03002b1e8428f90289605822a09782e2128a1db6f64b8b51c6876ae2f8d0faa405438ddb1116bc513c451569927ae0442401f5c0e63ba0dc6e1062da7ddd0290ee811e4afc0f7c793928dc438cc5d162d12949277b5029d41a5969f95d26c0177f2dd8307d2af79feaaec3362a343f1ad253ce1ae10a2e26b99b2fa79a0633445969710d637df9fdf02e05eddac728614aab845ff71f1f4eb64e430cee3dce6a51dd87333cf61f42208eca7552e318da689270f1fecc279e4874b1c044fb848bc357fd2345a027b36affb24432fa19bd4d1730fa310498e4c3f86635e05aeef7be040576065dd4556002274faa59cd0cfd97e629b2ce512bac2cd13e8d2c1407382b7dab831bfbea1edbb3409b11aa06435f6dc78188b4609afa4183bfdbc88ad1af82f54cf85fc66da15557f8afd7146aabfb17e8441775e73b23a2aec2b51f560c8fd65a2aac0de54167b3f6881e6e8e162efbd78adced295d93d7d60a4435569f4d03b83aeb62f681af139d8106980c9079ef2a177ce49586fe4529ea1a3ab68b67bcf2be5dd04404cd6c3daa0a9479ec7ea440408d0e2d9b402eb754a88f6d16d95bc361af0fc413931c10303c769ac4e4e1a9ad90a62f0e3d79c32f41fecaa13e992623108b1367734f46bf30c9d3a9950f2c861437bf1208b756dbef0337c7c17193786f4eb9c2df344779213e7c65d35e41e4df7bb5a37ce039a7e75521ffb3ef45aef6cebf289cdb5130c36d75827cedfc39a572d10a59b5178f2d9953e41818651724c826b23186a3f4e32fad86267586b417bb90fdd2a549bdcc8b7d73459ad12c0eb45d487b20f40b523329af0df8f437f03112f0a07ed98bc769b4b87d6e821235615bb680e9fb798f3e4deac35d3ce21d055387b769305324231a44b5139fd58c61cfc92041edc7efb032f0d05f7576025ec84e8604a36c219faeb68b595e1ab1d17379453674d0994e78712ce64b97e4d05899f08e952454e22e48188c00eb9863de582481f567ec25a0224b2b6a446c465e368512017274bd13c2a7eecbf6c80427c4918573dcb18b4f1b9a6ea9c07fd7d2c261ff9d9445c7d6788287c20f18f4bacbd7a7ad45f7860b45b27906aade9288c5603104d8d217d08396a33d339316817f9af5ac7d9324e256dca99927fb2237a3f5161671ca800d941d9cf760addef3941458c528dc57f2ce7d1c20591026b2c8e70d711397f4eca3f59bb7b9efd6923b7db68990efae0d4ccd76a4cf8f9475fe020ac67e5424bafcd25aa4073890920ef58fadb28bd1cc5f77f434dcd825c86a1067345e3ba2ce3246ccc82630df34ff085f20568bc00b814622e8d3625d24c22bc1e514e0be61b395d5caf2f6487adb5c4cc064fde41e4bdf1d9468e7647a5170f41970a72e7004b15d18b1133630ca7081aeaab57525cff91e05602c87c3eff3b75560354a1fe2c13cd692da87000cb29cabfd808f5736dabee0a20cd271e10baf33b854ad9c1639a5f791f47c0e55f244b9de43ec1c23648364e0c8b24320a3601a8bfef3770f8f2ebad8af96acca43ff4301bd3ef4c5ed5c9a2fcdd840dffbac72d5fc008311471fdcac9d947a34441c853d4148548fa768292834c9f557dde972aa28b42f0cf2b3d688b53d5071ba5f5a8bb37132dd34dd51aeed46697d82f55d83a6dc5d15a4a483a95702513bc622d046bd8cfb35272536a7a599de4200e51aed2fbba9fe9097630e3965c832425b260e8814deea5decd34956db2753f32c3288b293af39e136e7758aeba0ebd7b3cfdf31b21f47bca59485589cb0e8b5ee8e5a63ea5764867da517ba814885a726d5b1fa740cbb2ed4f638e876645891a5b9f768a32f2a03e052b3b9eeb956635b82d3f9c55e8da481da19539b20a7b53a4d112e74dfe24d2a321a63184a7598ab02ea281eaac6b231c6cf4b3af204754c33509d491d7315e0b7bb63dc543b9881531974dc59fe78a2c7b5e17fc2b03ba0b92e22d211b8b381165d1162b1c0e28760f58cc06f06a29aa40d8b39bab798ed20b6b795e95e35f2843c31b4b03e4729d516e6f0f1335aeff9c00675efce84790a842e9e0efb35f676cc4b4699a0cc33dee81ca260d3d1a072211004b41f271b5dec2b7d3edc51121ac531302b5a32c05e8486ad1913c1fc7811fa2bd4756e8cb7904cbed42122c3a4f72460cb15075cc71633e0e1f42beb25e7d55aea39bdf6abcd01c5fc879b51c9ff0a356bd350fda381ee7af2f5ae65879f73c49f29ebee93d029cedd46d77ff03074feb0cce158b0f0004a1117a153b1745c6f137d970c07b9419e19bde213d227ecb4a14e5a6121f103f1c95216d9ca4d342f8401b99d90a45d4e73b7292a01eaca0d796f9a1c7437ca4bf47320082a3ba2b73c4e9f1412a14e1cbdf03088a13c0e4b3d042c4483e29df59b9f2c9c50a02160b75b137829f14a54d9b32f5eec61c3455b068a184d420be9f868452deda1632a01ba15c43cf509f52d97567688c4b8e90a21580234383739748853f7a5c876fff063e6f45f52ab3cf964f5ee469c91dc47361680ab21f68554dfa25a6efbf8117ec263496d9683539e25c0df67e6ec4e052b6cda3eea7980cb5ab385f2ed30782bb1458a5cbf75c1b2981770cec8db61f1ed99c005ed4cd4414bed07fd05187de3ae4fa999c5a45959527c0f49366e5ee1ee1753272d4130859083e5b8de6f944743a4d86a8b591b184ee2bc533b12fee4075e97a218b3c91ede4ec0123130efa15c34186da611078e0e7045701794ced1a9a8187a24af395cded4e6d3f293573adca4bd595faa4435df00e2b7c0cf943364eca012485371096640bf23b07b199a0ccaedd8ce3642d5ca89fdc710d77efa53e79aef536052185e24de422c161f66effee381d7f52f2d5219ea6c5c5cafe1e5f2e65a0962c57a9077cebde7e4bcc334b9c18bfc3d698fd6a300d39a6591bcbcc1584f282446606ecb4254219651e1fa8df195b419e0147c6d4345b936732154aeccb5f074ba0301b2d53f241f25ba89469c05c01448043284dcb53bd570895341970f57ba0422fcdf1e74278789b3ce7424775152204da0a21146878b927e0bbc63e8e7f22adddc11e72385a5d8ccdb4235842a7790cd9099247238194a1eb2d2cfb34b9fb1214b4d12e9b4f9eeda9f02cae30d7183d2e72c1e078848bce6444141e15e0f13d5c26e09f0eca5dd99f0b3b0386116d2e7e70747a07915a216402bdb3a0f75cbe74c00f4cc61987e44bed4c564197aaca07338f5a94321503da5ba052df028961aaee39845e571f7f279ffbfcf6b98ddfeb60d0f0ccabb902d092ef6697d53c8017d23a258e8a081b183788d63b188a649aeaa30cbd51a7afa668a633b6d325487dfe26289c8a5881924f403dee5b10e0a23bd2920a912c6365a2dc76a39ee6e2dc7489a907e4703cb5f4422c6b73c1f4d56575cd40c89d69e52c6341d11b1c7b356fdbaf1de250a0175a41174c823a78bff73594242b102799219c1d04e750b0242aae6da90073470754befde41475f89ea461d0ffb702865aa9f8bdc18ca2eae7e61c7a57fd56faf7ecfcf26a36fdfaabfbb8673dbd4140027f490d87d6ee60a71b740016c43f53d9b87a868fc852779f09509a23b2d3990eb83b368e9dc9a0b693cf293d5ed02349d811a1fe6cec2668e719fd988891d4746f1e6bfcbb24ec3c8fe8ab4672c4a8758a10ca184278faa486c6e110622040c3ae20167284855a4646364af4d0e69f169b916a2a08290bcbeb3ef5a1240bcab5721630ad3238b56f35584cbc0721300c8c9d1294ea1d55377540a1e3f72048638fdb1481681d3764af8545766b529dbd1e4abc2a9b0ed8eb7f887c0af05c67a8187910e0ce78a54e7ecce08e34cc6d24254a0c494ebca04b1c9daeb43eb05bfd826811f8f61b46606b8a6376ad29e1255c5f12b08007f1fd2e2c66d9b6f5e87dae618219d76aa27a5e70f76d6b697e3ff9d9583c556418f6a31af7294c990314762d94281c97ad8759485d0d078a39bf51ba1fa2efb1e31aa78571d53a302dde9d87b258dd66511e1043416e0ef3e4b5e0d4455f54c367a625276f05581087608f2da44c5f9856dc0b3c8866897a4f102093133f4a79d4b350d4678e72e2be6f1ab01fd7675bd68512815ff792adc3fd5d56c620f6cf980bdf3c65af54d47500429175c8c2d04d0131f87bd8daa54d8208c75e881dcf109b1fd6532886574fe1549f614c25273539b8579e32918d9104221d7397534a4ca123aa6ce3c14eb2508361d1134983a18b94365aaf6164c3b68a68180deeeb86600651c0d48e500d3e5e7a0a1b20d7ec7203a604def3fc5130a8f3b193f4fc87f79246e7b0f2cd4fc3441231a8e0dcca4452dde4f79e54a226816e264ac8404fb3c8c416eeb74559c00eeade4f671d806c62e5a0eb618568b7595c9bc6edafce8f9fbc10847f8a7ac0497b7176cb3d204e479c6c0ae099e0f403d14d583151ba892074b750efb1861c8e98e217894e6dfec1dd8713297f6bea828c26080cecb28ec63eb58b469ef6d719221e21ed9ebb129e2d42cdd02518686f4047c53ee90d7fde1846c5cb5765a2089dd5242d7538e8a009b4689f1323887932f990f54156c3aba94893fc6010e6128d74450223d06b78435a9280a6108a27f80c6e74feb544e0d06b176a7dbd76acdeda6fc0ab93df6b93475ff5cfcf7ad0f900f1d77440e49e245e9f157f167a817d530c5e916ddcd711de7acb49ca9ebcadab784f0f1fd4c478cf4a7a178df19e2db60691c3568113b2fa2ec73ca10db3d8394871f6793317751d2beed6747ab8335065b6d2f6c44305b3f1ac19148b6af332b39b3b7d952aed5a4231cfc784b7d6556bd4d278ac6265df363d516ec92a44f25ea4b2ab4b68afb1892b18a44af49b83e0a02d385eb811105f9c3be3bf1906fdeceb9abab4dececf89361c38fd0eb687619da60d9c015ffcaaaf79340b4fd4e51e70f2d3f2a3f72cf9cd2c21b0d60dd4f02ae967ee4edb68f721886a22142d6b3560bd8140c6f6537e2b2e68dcf55ebc009d3fea68ccf80e75a56b0612ecdb10d43bcfc44271e2bd0a01846f497ad371ccce67cc2fdff8091f0eac1d42ec632300ea0f21fe08833961b1f4e20fecd7595170b57029f64b27e70fbc36c2f613035210f936172096de4ff706580158743dfb0c62cb00154bdc4f5cefb620f6f14c6900b9f72234f0b14a47c74456a49acb5ddb9da6dfcf26f61c77d7c017eabb0145684cf9399a1efcf19dd0ba5d574c6a78de7b9f525edd9b40ab8a83f90f9239206f2c9556012bb51a0481fe363e25371f355ee271d0034cefc6a477e5f872776eb314bc8641fef157acb0dc068864992c75216dcdbb038b9bbbd2532934336720f7dbc16d720f90249a1bcb55aedeeeb80000843afbc8f4be38d39168a754a69b2d3e4feaadabe20512d22d3f98019ce0c462b3177c659f9af196171d21393ef89125749ea1a5677435df2666992cb21f2c271348924c23611b5bea8ef4be650aba0ca7bfa6cef0aa2bb2ffb477f820299ed2fab250f9d73474bb26f2f925bd7a0f8f4f3546249042b742e7b64cd063570d0c4728a490f2e94d991aa364b28e3fec6a324c61d657b7d22e02a38b7ef802d44ad4cebc840e4503576e6f237e843cea5ab7493750d0423e3b70f5f5220a36399ea1fd597e2383dc1481a7c9ca73845561e8fe782fedc133648c1abe797bf981022dcca040566ed745c568d53625ba407bfc4755db33414c0ac1caf9a3c24d5b10f4c924dbbaf0ded27a7b51f27ef3e39c8348c4462da1cea7a67a62e33003c40e1ff81c8a576c2bb630e7e5ea47c936149392dfae66c828e9a944b70f85c5d5641f685a6e5cc080832ea2b06149f4498ad78c0096e36fc59fa7241379da8deecab0fb04b8c776f7aa6697a170d048f1c2b06d002d2f5599a02ab1e7cb262d21e87ac0c9a958aa3acf6d0263adf630d2c83b15e22f3cd7170e6f3f1ea5676e6f9a1f03f8dafd603bfdda23b27d2d151574065c7407988a9dc87eb39ff6cca418473158ec073bec67175ac07e5b3e1a900c3c4d3cb5428269ae84c2ad5f393e2ad7faf952db3e40b47ff3a84f06b37bdc484466f38e1c8234606dc5741361a78cfc0f7d4c18b2b6decfef68015017dd005bac5d9ba5624d56494a2c6333c95547ec8757a7324107280ac5fd5e008ee79ebfe368664d560c9deee8739ceac9713484b738d9dd46844cbfc522b66ed1004a82e193f5b75838f2e63af8e599ca2aa5ef92ba45e580eac931471b73607f9b08bdd087ab00610a220f28c3a88f640550240577f552e47f75b8aa852a056e2231db3e6f9b893b1e12941f3126303e0582d6a17d5d792560336560a4432cd255933cdafcee7be7050023ee2026eb7892115c291dae3149c9e14710454ed7ee16ba791a699eb7135885ff39b4d5f623a25bb5f1862973c582c036f9179b7c17c99ddad7ed91064424ab28e6cdfb08aa53515dc52e1bd7742291f84b20625f18d78d0e0e7d311d33a10f741c8f66a4a2a8037642762c6c868b6efcf1d4c54e3811a4a21074a85582365f206cffbcbb33062ca6f8577a7426841f04838f7bfbec25e3ec99d00510295ac14c5cb9e6611d39121aac48d38b22d0695aa732cd68df3aa072ee2069466b3d550b1c241b93d8f5af01fa833a9c888b9c5c77c0d3f2abc33ce4da374e757c8399fe657da7c64792426040ab41b389feb8d7db96a72a07bfc9612007b45f964f54062897f640ae1c64306a0cfc68a13451b448c2d14d6f23c1200b6578743815650b38b404eb9345c77d95f8b8c3246965550efce0f539aae731894ce50f6d809fe15335453326823dafb60acd081d6b608b6ed88902bf82f1c3bb41243375fb313f9a2e168e04ccdc8c9428c0f69577a1f7f06056c277910017e47c4f18e78775222e1c315660f1040c391b8d75694bf29d2ac8266dc174051d3a4bbc40ff69079bed802814468cb70e6c914fa9de7b9c65200479d83acd13c7d5f1083fa654c92d5fed42c6185fdc651d30ad094e63ae63dd3a211de6bf9918262e1e222a16feb74dcfd87591cc5c77874b09aa60415f60ce3094a231ec4d330ca5e47622d35f30bf6e8cc73e14263be97b788283d35446943e81f1ec005226f84cd1d0b5916243631e5f508623836774f83930ed19093a411b0f343432251215926993ea8308b6144fdbca8b99e34026aa81213b7fe3fe45070a530e71f60818774252e0d99c0681b7a61b6b50d389bd0973fb3c17d621b98c95fabe0aeb7e6c3ca2820143fc59a9a1680308d32d07d3279f64922ead7ef999afebb2fd3788f030c01721a4f5f4e00f281a76aced325375c006dbab8e1821f52fc470c368114cf71766715161986f406bc4a19f9b3a580c4751ee778dd83394cf1109ef38ec140ad80c6684ebb63d246371f400678b6e740e7e7b49656ea17ed607676235610e5bc197d9b09c851a6daad38305045e9b67c97b799809c2d51c6d4476e11f8f30bfb770ae93436ffb901d1355ae0d8e2077f6f0a6b4e76a4fff7c7d25cd4a1b8787702ef18aea8463b58348c520fc114bed99669ae74939f156daa21b95ba8296bc66e437cecc1f37a7a64ecde7f53945acd360e91b49d4f673dd17bd353290f6b8328b9b1c221b440143c7a300216fe639d4c22cf2df67f19bcc30c72179420bd2bd39db1098e4d96e87b3710b52618291549d709bef52102be954ab65dfb1c63e12a8bdff560071980fb83a70e94127c0d563664094ae065178b4bf787753104ab0bd8010d9f88719ad60e9e26b37409c0dc39d1d6072f6d21e26af534c249825a5c1221a94bc8193a2ce18c37b449b955a50f5bb9edc0252ac059c8913a2c5d5405c72124b34be688900b90f42d6abdbae500018bdb00e6e2aa45c92c70578ad7b14a9c5a1072e967ba48c073fe4be07ee30d512a6b3bc1db8a8014066ecc2bad7a1badf26c086bf559d4558687380543d0839999084e44f855294c7d2e714fea0b4940e88277502c8fcaa02c8cd11072781d5e129e0d6fcabe9859600e787c7ad9daf7645a19fdf78a8207ed448a9a411cd5bfd38610077fe801e7dbf4027e115d3a46cec477d7871795c9f42a7c4a33b2caefd22881af5472d9a8e8e8afe9fc4120f0147ccda8cd0e2213e31bfb5d48dae342f24d6df84aa92e2f15f20d0138629231d4f20c61c2e05df5468ff9f056a3ff5cd5bed50ef8fcdaec81f691b553c1b2dedad7cd43c9c7c70b2b7319ba2c1c37438a91e080b00da22df309b5f4bfadc115378e439b08f246450213a9ef3bdbf962a4dd530ed88642eeeabbaf78222dfba87feb9b9193c92efb0cc0f5a8deae25880e9d76bf45a210431a9c4dc05b7d380329304c8e88ecb92cc9b63333a61fa79fc0118c60e819678e698beb140e0d6eb49f540c83f05f14175c243bbb67466d3e7e3c098d362df669e13c85e41b0e51a4a2c64206c9869e71de44e6e0dd06a378ee14dd7638ca210adf90b86cc9b63f5b5d352dbe2216b96e0c7b3e2038da0647780c805c9c87712d57ee3a25963550bfa61377f08530c35075d448220604975ca9a192a82f823b57fd1b6a1f1da2c740cd1ba04212d13a0b64e694c4c987ff9f2aa71a997568fd80f0b7edb1ad5854068ad78cdb6653c088617dfdf89d4143bfc6addec67c0e086c1a80b36a6917ed0117bcd98d807b9e01a73446274db5ef11b8962e5b1a9c44975a62b8b4f7689ed8bdeb72674edc745945715612fd1550d5dd2f3b83dae5017b350d5385882afd967bcd65382dd7eab753812c925d6abf1d07ace8fee34a6fb95a739ebd363786e08c1fb3930010f899fb80f023efa1bfb72228366b5cd8f516b1cb0af29e76f1219155edb5f9de09d1365633543507d91efe648ed9b43057681f10aafecdcd4ea2491c2f86f7e4700e6e80e558724278c650c3a7861d8729bedb8260d3ada9d7e4b9c968c0d5ce55131ddbb98aef2301ae828c300a806c6a7618fa93f5d31357b3d09577f03b9e82af2e302e84ed34986fab847e5daa12d7903441b519d475b4877363c67f1387be53f3c0ebbbe4188de50c77dca40ec69c55ed32cd482c3ab867862dfb46d8392038283dee76f3c8440733391d22182963e6fd87a4daad9a3ac12f1cfd0f1a8f3757221cbecbab7d996e27fc7c048909e0c03fd2106735ada213d3e1a54436f062df4a9a2855e7ef2b35c5343742d91ea22e83cc7ff38f9ad7af91d2b676f33857af59af8dce7fc711a5662ddab4989e98ac47ef7a1890cbe8f5b491bae121af4b18823ef4e884d4c60957b642e8b27729bc2a5c35e43dec0f5e6ea1f7ded7b22b2a8c1851144af323f9c31628533201d5b79c01a5c07d6d5baf6793fc1fdf4635818d6df95b6d91d0f048a8d5d64206e1c5a3eb47016c5b9702e6c9f3b466b2c5b9ea6f3c18442bcba9ad44c14bf3ab9ca2ec4bd75b5256fdff50d8ec26a581418348a88a1f1bdb6d851b5efb84e5464f5e0e0f4ac463c4b1b1f651e786a7e3f00c20a83dc94b89ed615b87e2d268887be5a53383c9acd62577a29509b316f86212a2957262783e4a22fe81eed4ba2796af15aefe345298cd24b5c56b0c6ed914e9ef6cb1cad6ae0d96abde005050746b54a77cffacc955a1db04fe85f9cffe027063d6ab9b6330176cc7b08f0deb5d60e61f86cb2eecf457bc4b5f69707f8f48b41bacbc6d233b2dc47321fc18e4cf7ab21d66eb3e0aae051f24c51f4b96ccd26961de4be52927bdfd3fb6875cd1f7d845c730ae685e5710f919e8c3c23c8564065be23dd3322804a91c010b0f43f7551270fe9f1d652a6c4a1f9c0daec1e2036c93db22b694b240b71a9793d88e02486a9e624e3437748f1c2cc81f41847c06f9df2ce8c2cee548b56adc56eb5708954fe7c9060574bfb63091dd8402a49916956b39468bc9a4d0bd09eb5574b3e26c4415046268179b4ad59e78e7f6e77f9c9a18bdac3b3fe35c2ade8a50e6c71a587b0d0f04c070ed612442ae95d247e4826909361872a6f450d95e4ff837d1fdbef08e48bf9ffdb6f77d1353b21e04c0e3a22d6806c7905a44e16f09954ed0b9f0b918e6a0c89c5e7d02d718bbf69bd332c8c3e105fe234e3777d90382d84e68d6421cd6948674469e66384cbb0ff609b0cff242f0749cf33b3087408dbf856ea70e734b5cde2d4d67842bdc5d2f11e3b5cd855e9b0944c41cff37245205540d74d53e07f1550e91f3c6136eac7d96bc10e70f027f1c751376e01aab061c01f2b45bf5c64abcbeb0255eef431ad9303813814d3ff22ff73b48513293cf43f92373a93f99985c06cab767d3d3724be92a7bff16059fd3638f83828a3ccd0ab017efb80ce105867263603104aa6b1040c162d17517923319427affe4643f8bede7e5e1b5f9909e5008344b092ddb66d01435c8c600b926fd2203a02c9367bc0b6daea71c96dab99cc6d6756fddf1686fd283edcffedfd4be2ac921d4827d5feb8a46a0270ce146c812fb8a003bf6471c6011cc410ce9012097ece29e576626aa24639a6adb0dbc0345b612ffbbfb42b6c7348c41bdb58e44b6e43cec39374fd28e43292607c7aada271faeca4025869bd9da1469f26209636f8eebf545538680bf3ec8cb5a457ab3870ff63ffba246dacbc5ff283f6017b022162ab7fc5695ab7cbda876095b92147662506de0545ab3f3fd9d0b8f43e5d83fa60c3c571da3e6c41238c3b1509de7c411779225d46162ab68e90ed84a15b6db2b878f11d6046d1270dcfcc5e689b62b8ddfd21c981c3cff46ef2459cec6f0b5b1d7865c69af0c534db88e5cc8c63b126e0ab734354877c6fb9357ddea5ac46532a0ad90d36f4a016f600d069ab5db6c42d3343cdccdc2d5f7519b0636cd8bf9ecbc94d17e15b53a1ad9901504cf62dd46669a4701a7f46863f06ec4e0813650b687b50e2c31a989446539d2446df61d2fdf0ca500b7a600588adf60c2bd4060418b7e6fc6242ccd2831b6d61e8e8f70f2e6a1fe8e934d96b4cf90ced2ee01c516fd65b572b551d7c4eb55536bb3bd7125f5e9ecbb8be472f2c3929010d66bd8b0c6e0147b7e5674867ecea66d35b3dc43f90d7f607f5bed8f6fd9d6bceaef1e374c6f0d5aa780bf5e6f6ad7fcebc6864d06a32304ecac161910c2506e1d8e86cd0e67a2b8246714d0ea01c287e6f4d871c3cda8bfa681307b0b1037a3d5cc115d9213ba082d2148d431d4a8f4ad6ff69efdfa6cf6e4fa159c86b6dfbf69d02aa05db14bf6bd8b1af1000b9b359bd03dc6e00f43672a63df7447b936397e8ca1d68303c8807cab75b1f255d419209bf4ec444f0c0b5c6fad273f768cb1e098390290e97edc9a273b89e55b805c032a3672e93929829da491d52696de3d2005448a871c920d5dff6603651d8c8ae08ecf3c3d8cf3d52123c5c80b4c4525208aa74b16fcd484101806c9998e65eb50b7af701f96576ad52436437704a73d4d6e7e61e469bc48034c2abc227275ba0f8a1c1b53330f6de30a2872c97f612789ea50d28319bb97e64c92a87ec95d0ba110c90ec057d5de5e1e36496049eb1ae4156d7b3017a8e6560381c0cc289ce183f3936e42a4aeae643973e220f6b55ff0da9991b1ba301658b103aba8813a20569b4f38d8b7cbab30a0a03554a818c72fdb25e465fe4f4098e9caddd83479cb2f219ef2e9bcf2c23384a7dd94f6e3fc1f1dc58580c614b46f9d3458957b68fd318cf80185991ca6f713368f1f925afcc8d0101da768be9c36022aa5fdfd043299b41286fcf7a92faff043101b21b28196bef0157b28a5f7e0a710633ad17fc4227b6bf748459e1b27d0621f2b9a4c60ae08d8ffae4f746131d1310bf3188f4c26adb030079104fb7f8fcace8c44f4dc0c32901648df5d814704dcbc920175114807f028e4cbaeaa04f39a7722a7e0c188d0949de363232a599827d1fa9eeefbddcb7257ceb616048a6bcfc1b99961762380e3a06b6e5fc35815218f1e7d651b444a1a766270522b2b185cbaee77bea2ed583ede8050db75b2652e44f230271571483f718b1ce6e8bc4d673bbeccd94c49bea3348388016008b7098e6e44da549d603c5350a47ee968711c3e9b3dce4724404a36bb6f44ce04b54bee9e58e1266df6e681a34c21833f3108207fe4288605900056b60aa961874b090bcc0c688b62154be4a5d2ae44422fe10a4864b79d785bc59b943b67f67b31666342ab1a62c4e988d671e2cc7872898b5e9d162a784e806e3f6db2fef8a003814350645be4dd68a84e609c53a03e227436004c9b65ba7da75229fca39426de28051acd6523d185dbe76457ad964b1ba4c27d8d7e2afae03af6fd2b5b992f3d914c2afabc58f4450424ca7a7f977cfc3dcfce3f15f69110a28438bab05595e59e513c14bf0456db986c9ac7398fdcbd2abfe9edfb65341919832ca87cf3841496f466b40f494e9db859cc0f557b40b2fcb6486f86443af373a2293d542aa9ff0ac857977487a09f9370b12cec99df24b6f5377eb9bbe05ed94c13c3038bb3bf6a3f343fc73c2b341370f2cbabfe529bb1012d0eadd04f277566a559385eb379dd176138c135bace69f5ecff8e26c35976a86177adc7084e3e86fbbef1f8992e898ea0aadaac03ac7c709591de2448e1968f95f248cd330e51f889731a011382955fde7cd41010589cfbaeb5f3a635a24fbce3e6440e09a7b840620193e2d4fdc4c5e02f3da8dddf8d1014cbb914ce8c58ff7227d407d5798dcefcae5a1ee8088a72814727d264f67aa0cbe5e41f13354fc9f331f845c399df96d2452eb375283e96dbc8b3de456ce9dbe17a8643009d5b71536f21efd40f23e1274c780ffb023747516298ef2acc011a4caf2b434e99695c7141ad8249247b1fe9a045f9e8f885b01790454bd4697ccf8b94bbb4a487e3dd0d1d6a45acdbc7c9ccbd3e5c08f292ec3b4a449712c4c0b1c275cbcfa8842bb0f4799f0aea6c3245db707f7a3c08814615d00536e26ae652f090ede1e53758ff1ee63313ee7e116f147e043d4dfa6781b23dc202789a7aa3202e8430ae19fd9bb948a08c63da2ea835d6114c6bb9963a1c647f404c0d4c9972792de3fdcfd8eed93b55fee311704a414ae4d4c90d81af3e48176c90880f1b7e218e6c185c3503af71712525d42ea95e5159e88e150a9ebbafff548a77cfba34945b525eea81f0576049791f1c2bea67087affa9685d6077c05797b39a32552de7da7027e43ee58f0a8344ba05ba2a5b005ef5588746c54601818a631686707e1acc26f87acce043211552b4f47ad66c8bddd919dae5f5dc4a59c0438c775586f81a9873102e5c410035f1cb685c0115094d51f4743e4eaf0b2441d17b91053370093b73f890d5bf678b7c56c8fef4cbff904600806714fde8e0c117dbbb18d9579adff966555cc1eb080604ba07d15583e0d2c4a1a78646d870baccc04a3f3dbddf1837c88badde4c6aee82e376dd73fd8cd078611f86021814dccfa5c8c4aaa638ce839d61a502c92dc122c3111933dc6b4f530378292c778df8b8b9e6a696e9fc4b4f251fa0df6d1b012446b5ae2a1ec18c11218912e7ba9e775fe62595aa918856b31bf74cb0c93ab89c3e4d2158d8ef01449fbebf1a1afcec7e54f08bbf355774c3209d9f35ceb43be495a6eab7e316e57f85c1c23aa8c105ef59ac2b34aa4b5d7f75d90829be82ee1205d11a314f4109675275e2922b8c243e050c778f2bd72cc1d16cb7cfb351407a97814bc8369fdc0fd7644d54f2e610242f5455517671cf35ff4046b3bc007e9d38ed050c595e103a6f1ea2d983b610c739d95791b3cd8586f4ef18e9e94760fd75f5f64c75069587a4efe5cf9f43fd9aa9f19f1bc975a0b3ea8523b275ce3a19cf8a1f41ccb638a9cfc520f06e64c21138a2c938ce0298a17ebf4a989660730a529ce44130a5b168f41ac5ba9f44979daba9bc6d2b15dff1b95b619c1fcdcd23b736adb9bb801c0f6b2233939074c5d7614cd43372fd3e3d700c5eed9a689eebf903d3c7be84f09111a9f1585429688a84eff713732b8364622bf9dd46b8ac104d6e0a2a8a6315d4e534a3369358ddda5a3c14d2df901134d4aea4bbd2f7156111646394a2030e8d6e5d74ae3878830676c84d0f18187d087674acc073c4734306502a7f7406d5464353749d9abb05c575358d5a7f6637a3bd5b08d54c96ee7455b7acc603cf20e973a5c5b1de4c1c891a872e1116861f4f09170866a26a255d2f71a04561684cdb4231e3e2ae5950cf746f1fe6ddeb8a450652a8408d4c9aac6f228ac347017eaa92fb3bd75e08564055aae658305a3c17534703412830e77d64f82835677e1679d6d1578e0008b9d5db72a1b6b41a9b441f1f442f4d498fae25cc5b0081c1b65f0a39a2f85a9b52da6ab1dfe53a14d36543ad929cf200a4e2dc314059d7c17a6820ce72e0ba334d86303f95603b67f928310dacd0aed7df8d0fcd77c68e5e82b8408cc6372626ad835fea6ca6bff3b4eb15bdd4199bdf890d05f9a3b44e68ea727c6df354e95c82c30d729f0d6b98f17ef1cf5554043be5f975b07ba869c52fa5098205329f08b4e905c64c0e8c701947b4e4006c64d216de06f4b2e5541c188a7871e083ea95b086ccbffbfde5bef1b7f222974aeae36c24e2308928e2bcf3490e432891eb518cc586346155fe6bb080e51c809217a03c863218c567b2bea370eb8799359bc6ccdf561c922d778d859b46d3a7048571d8628778d98c28da219a26076ec05f6d0d1ae7d711b2dbdd83bdc045a85690128e029609209faa8acdae6e414bda3f81d6eab1fecd6211e4953b24ef14207433d4573d380e5ff1df8ec12ad269013c57ecb11d79738da63df1289bc87f29614f629c0ee528cb8b7734a13ad8445c89b0ee167d7d2f0189e8a43120c6e28fb114092c778ced1840c38d7a27e2192800df96b8182dbf8b883bbedaf3c042f390bf517d5c1e30dd8150d9c88ad9eb4c5cba145a978862c01d04b41251ade57d0a814ae631c1920a255cb16203e51a33d744809f315bae15d3a4fd404697ccafadb308fd047019e787c20bfb2ee7ab17d7dffc7d962b8162d2a15d5af38bc1ba244989531cc046e46da626cd245da1ec349b9a87e1af3cfb9ab2095799eb7e42678a6f520192857f139b0a711f20b23828a34af753be6fa61df1100a2a4d8b473c8762e40ea6c787f7d1ab57d7b42bb5afb3db524cab409fc752620330ec4c1ce10fbdf2d12e684ccb3980ab55a108564e295def99306fbbb7cbb5aac195f8f4e706726e644ad14130e41eba726c54ad30a6da28807c22b442ad361db6cdf041a2083a45bbb8775893a2b486cbc731eb1294a8dfb7edf1deff9a699de7bca8292c230e0f4ee0bed65c241ed8dd20bb21e32f6e72ca22df93c76f82af519ecdea0e6194a718fb2ed7878d81ab53d0529e33a17435df4edcf82f861a6f70a8af3be7a22e961dc1445a65b057f0f4e1f463582e7b34e023150baa1e6bf69614c98793b3be7b136ca1efe44f5ec042a191d6e815b44b70d26cfd91f7c933ce2fa016fec6db4ffd655e2e293962b8d2ffbb8cfae0e90866366a536ceadf67b5f51c63a7b1d23e4b8ac527aea751e27b8f2ba4ae880df66e060903f96a3ef45618261eb1a8892bb244df0b5497b8b3b1753ce3fd0c90394009773f4a9f0e003d7c11a2e2276261f6d807ab44be0301ea7cce24f9b4d40536a81982bb55a5b1aa98593f9ec2c956991dd084ca4982c180ec9a00283b2f59bb8c111eb36e55ece013990d87c000dd68c791bcb8355b62a046cf7e2fce1762a993c4725fb3d655519f53459729da588121cd5b74eed2f84a10fd1c4ff6424684081e0b750c2d65151bd26f9b20484c5a1e41edc6b6e0113a679d1af5b2fab65ad6228bc5ca525ae6757604b85e252015d096f06e3610ca5ef42a07f3331aabe791b0c8dc1f6d034d340a61c1d5dfa6a58cc15c62bbed2bbdc947519f0c03140b1ea5e8dac46052f06ff656859b95783894ec5827101628a5f4bcc647d6093776855de3b3f795c70ccea0a7b5f357c5248268ab87f0773fbf8dee7759691369f1f0de7cd83b730e0e9536c2a72f3e5fb4ee62ee095654521109373b3606d1c8eae7ef54d630c1c07a519502d0378ae4a65181190c326d48a70b3e4c1476529868578395de5e55a26a0ef16f98034731403964403910bc32156e1f2cdd02f450099c6f3b25c0cd0a884120e10aaeae9598824aa93068d9f9141217e2a44c8c9f3277aa745d09b9cd038619c340f5599191957e571dc153ee60c06ba68acdfcf13555140c020991cc8d51d9d56471ac3ac1b7f031ba1ff2024f046f0c03a59a6a6ccfa153250d04da2c95a5ce53ae37551099049659e3b966e29f15d8a26870a4b8369133553b1b86d27d087326288d61a5229c890587567b68a80365fa264966d1015fb60fd191752cece15e26c875e4d92ee8150d2feca8be96ca5ad9410a0459eacdbf7e70fedbb32e92c6580b400e717f51f428c5dd180988fcaf0fe20073b0f28f84d2b852238f1d01ef82e918a2101a454132f85ff966f19056c440b15f10113486dccd00204cdf7bc574ac6f4ab8004e712612f3fca869610d4bb8e81b7a182dbd7884292348f203ac678217ccca57750ebdc33a32506ace43f2340048ea62625dfacf0ff18c37012d05f2fd4963388f6366d9e0644d6bbed0d5bcaac890390db3f7577a4669e6925c42761a18e26f59fc09c9a174c821fb79db46872a6e20cacee0110077e87649c594ab55677376256a45d5f2c51a6a4a9a92ada0113933960d47cc00a8a0da6422c84a368878556dd0fc971aa4fb59c3127464932e1d041dd18c4fedf214ab3492923bcb64264650867afe1730a6b498ccad35f4450a5d42515cbf7728fca23c0d34f85f9190147ca0cc53df21effb9216dbe25ff85706417c6de516a099e8ae9aa87558c95ec297c8557281b5058d13dda783a8d0789fa8c167baddea12c37ba679decec157a613f49c39de15769afd8b6a92988d40924df0a8c87d4501c5ce51118cf241007cca08686d632e127bc2cba312a18b4fdd7409b5a755147c8cbfa03a4b50428b198f8d60493e60baa84dc61e380d93199fbc2022faa2be04db244adf9c2219e6d0cbdf2536cff475d40712663f06c52541f95c99439fec90102da2132b45c1093b756512d2a464b085581102525f647ea20c53b48207c61042973ced197c7690d3052dfd32b088fc0f28eaaac1fd0559421f9127c85d3d7d0a2b4854f74305784328521fba69412147faa1a7890ed4d16b2747330cca81614930e6c22d0fe55b8d5fcebd5cb0e18484c49456835dcecfa2124ab89d426b1491569d688d64a893db1c5d05542c78d29b31c729e94c835e9b76a5951c239f0b4e8abc08466521ecb023c8236e78b2ea13e4303f28beb82b345407456d4eb4edbab8983f35c4b8721c1ffaee026f9705df285ad996e681298cdf9297ed9cea5694d93d86005ee5c5a5d18e1349d91e31a61a0111611c9f9207d5ef9b12ffd4d1edc4abfda3da82da52267cf8693b62282dbd2856520990ce0f44904a7e6209cf63e9c94caa4f6cfa4d5b7453c0b589d2657628bdb1590b47db65add45ecd6625a0bbe2ef1bf0e74a23b1da52837e72087c3627193927d9903af58c889c55c5b7c0e0d3b4c7b7a483d2ee6588a356501e33b3de8d267db29965ec908b14ba6aa426bf7e9dfa3fe1ebc814404fa8c458e78d9299ae593f33472f3ca2f98c68c03ac5dd402c0e9ab9209c04a8ce173d1e0016d1971bc1d6e66a601c49e9b0a11274ceeddf8891428b167896e83fc5ce5601875742d610cecabe7e086a27438a323c0b5755d7eb88206c12c2afada7caddac6125c917454483a1122fe23132cee92e236064b4b4e3693aa3099f0900c5ca84489a9fc7b5d8cbbac8f25ed33eca41bf0cb7194836470747e05a805dfa2c5084158f26c62625f17404b500fd63548ca6d61993807e01bb209540fe1cf3f9921a44ff0b9cf0e88b44a1d100b0429b477c7f6140f3ee140a6821acc5326d57c1a467ffe4444176ce33e5759975eb3b48dd40922f34e623494e7924b892bfc1b4bf085eba201fa2853964cabe0d049f4eee635f027b5b142fe3cd69f10fb59aa40d7b06bf6d9fbc1f05288a6181299f6568ceed998427694ac64a3a45c0786c50e05801c200a35811a0a89e8a5ee135fd8b1bd0eec44b62c69c6ceff7865c952073bd8a9b94e1423526e10fad5871186eb6932771e983d19f6888802be3c0bc2e3a069442057b61dc6124a6288964390fc520e50f447e2727a6e05184b3cece0512074dd700588405566889ed3522d0283daa0909edf0198597b4210356972c4147a089ac407dd4dc09d99db0beb611f8c91bade551c10c831a06f7d7bb0f26f0da1ab14b5e550b1d3b36e2810300dad6355fe90f9f0bea1f1b0a43bb26621f4b3f722d87d9c41cfa2aa0ec2115fa4d44a14e4bb2beb57027e2107827749ddd11970892f625bab53b15a8bceba9865bcc8713392548fe19b4d11eb0fa575a1da42ac86270d0b103471f7d3adc6cd3a4f4cbf858c947d3e36d9f6722302993c64bffb95d4d108ef5fd35bdf8d8fcc8946e6111b139d4c476024b2ca3a9e005735db898253bb6a7665f7bc534fea2c9853ce1d4000e714380f2d5fbed9da7cbb3bfeff44fa2c90742717ef2396ae871a05fa90ba9fb341186e8da40482f2dfaa830f6ad68235b4c0baf9946c2564dea150bad8e9526e84b2eb9d50e629c0451bb80f7f50c0808c50cae713ca1580b0b4e50805f7e833e58b07c4560614e64337f43d90afe5f1cd0653f5cbf13df2cadd63b076c6177a0e6370449326c3537fe808f58384221f8fa1d88cb8e9e2a7b3582725828a39141d0bc99bb403b9c078b551e80c6fc260727204676914eb708f6bb8263c51c8985ec7a1fa2bcb4f96f09e779dcaec6390b954e1d04011b54c4b31ceb3cef764da975c5dbd980a4709677c92c407400cd9cfcf0d254a599f0eb88e50b006e779691dec6560e5476547fafbb694fc7211db68714a6d8a2c84347245a0bc6c8241204c20f79f191ed243e3337872f1278b15a11aa4dcd965803e51a213d016212137dc91c530c2bf56d5fa91184b186cab94209358fec5879c28b0837398cfea655d52559d9ba19c85692b9c3761e9ce50942d44516ad078b5d04a01545a338b8363a850fb192a74f6a9ffad92f68deaa43812d09f9efda111b4f229f86e316a2024e285e27e73fc11ee830905109b794a51bb425416276e431749d7ab1845227dc6ead71f98f9f2e7a7a1060b563093f79f55464f102a8003592cb8cf22e45c9d6aa6fe282baa047792b23764a19608fbe917814ef089aafe418d8f1334201bec245875b73dc1b52565109f1e3925250f28cb39912f123a0dadd13408fbd57d7ec2953f350b02dfb270d71e70c1db9bec4ae5beb762af66e8d3e007b55b7f9c457375379f3a008e81b999c8550dfd38ac997905934e0d854b76ad6d68958d4e3771e43c50ec38798a090f761713f0572ce17eef28b276452660afeaaa478abc4688fbf2afb5ada163b4034d05babf74ad7511868bf9f730f24c3305ac02a1d3480b8308e3552e54514ac25e8187df34b80c494af28c8d8381f120e64788b5715dd3c89ad1f4a8fc7827193856ef738cea7153dff4210ece8e7ba20976f29d6477d1c9aee7553a7865650b9210ac33708c61862e4a9064553d6fc5ecba5e7e6018606031ddf512d78a24a324957290a58f681286e1be50db7a6c9ade2c703e1416db2d54292139796821281d3cccade14640fe03662a21a4a8e0436858ab4562c0c8b974a136a3422a79a2e82bc772654106480d30c7f1b6f579645670c988d13868575a848d4684e36dc261d9e3f4de4810ab9b5e57461c31784c29dc671ffc180bf8f1e841d81d26e7d22c3ed43c0dd2812068031ac6a009d3c793a94940175d2cd4f00572e2f99ee687404bb3beb5e4a53efab3ef38a77ceb8bc25d63cf11606ed352d2912e7d6af8b515ea0173f200369782bcb7d3c982123a40bf5ac574d757feb02901f4b6fb7ca6fe85543e6ece47b230f2260b905da28b55320b49cdfdad2774a9441dbbbaa1aa92c517419a755561532e5e095b9c925a191dcd4ec07c0346ab5fa10f36266bed092247336de747a0ed5a6952217ddd015266b41f29e464be2273a27e44f668c212a2e025d767891f76ee0a2ff12624084a34c9c133bf0817d75f9688f96908a5c8580f0ba47b9d02f2b3d72a905f3c4bdf437721768340644e08a820622f7d8fbf58b0a53691a0a9a5ff335d20cfdefa7eb1d7ea1b56e15f320c498e93fd20c1b8f1e47fcd840303d86956205325f70558b27d104ca1691cf4d04152c12830f5fd2be29d2f79a3c3ddb207463a6cce911086f89287062b04296b30eddc4deb9e41cb5cb52a9abaf9dcd36a43f580b4ad58e9078ddb3a783cc1fd28c5ba74ea70ff7ff3c2beba8c5e466c0b51bd8090f672d5d9d1635cee3cf1ec2051a313921b0c43913e64af1c265578187e72a1df111491820d142599580212ff82ad474382da61ccde20c23c896fa59fba16c3d6c1c0245d284e6e398c5f05e6d10dfd1c24f43dd7f74e405f39166d0f40823060e35ccfa4c4014d74f528c2803199343d4ad0f4942a68cffea5e02ac45e20baa8d1a18d51f8b0e85e19fb94095fcc458e572c94cd84031e950f83ea1d00be5127034951fb9dcd97a0dbbda4bdde8e2520c4aa8520e0d0d3d376a5b5c7c61902f1c43785a3dea4527e8378d7cfffc07b10605a2868ccf0dd7a995ab66d94e5d966273bcf1545c82c1bc659d2694311676945957f8468e23712081ca200240b208ad69697642653a004ce2ad132955909ee71ec6ca15dcacf25da08ba4a4189381d55fc25b39831a43e2622d9a4183b4dd007d816e17293a01e1793b1d49e3653ffa50dd4d7636495f0b9750b9068da012cb86311eca7368c81a2a63b4eb4a55c65007144935203f012417089fc7508eae59e310069a308e1d52cc1012c0c874165086e9c186bc79c5301084b3da5965396322b5beaa403fd2d32876caa960184ed8a4afe1756041fe86de33177f707630f060a2bd59ade7a40f1fa88a5548b283a636890163c90670df44a15c2d6b902ab7b2d8469560e2593ada629245d28290d4d09383b0d36599dc908681173214552131c5f41bac29314892d6988583d03adfc0db1b3b4a50dd8a4c20edd7092649133d4d8b83c2e22c105a814662999da3b70d9b343ee5a2256dcc1acb10b2504058494402debf16b32349de8709e5c4757e2aed5392ac97d86b1acd528ce4eb3b240ff41364a198e7f9ab5ffd702f86c73ca144c8d078cbd998740aedc64a43a04ad40d4167c9a6f354b6dd7e068dd61410d976b8a7c3b00ca4df3e8f21c68054a6540ec6cf1898d52c3da620b6056a03a2ac500d4f0cb9cdf546444bc966f0e6d707ad51c50e267b7af2500c5852460c4a30384958daf2a695e0042c242ee7193aa00a579acb5c4d378daa189f22681c60ba97ae16f6bb0946b0540cc05c285fd69ce7e4acac87d569d0b406804c65abeab9acd95b1a65d661fbc30ffe738d26873e766012c1ad9286e7cff8bc1fe521898042116a042a4732d071762921e1fa6311cdcd0b956408a01fbb7a8c28ec3931528b24c63deb50228a27bafe275ab259579460d13f1fedca422c40d114734dac2ef0df69904858fdbe34313e3f45d2ba05965cb350875f25a996b05042f321f5dc8d361049ccfa3fc39b80244a37edea4220618e31171effc18f1fb32a948c00661a04992ae1b6db6bc9469aa212f0adea4224d71af78f93203380ef47fbad36a56019133960cd24332aa494580e7ef878fb67a490ea12aa0392dbbef5401856abf8f2bf80aeff1d947a20ac01fcf835737d64ebe0cc2ffeb431e18155174552a8dab6fe4208f82c9d84c059e9a9190df6cb12b3e4a0e95a4900800d90d5778444542de39e41e922b3541f51ba16452f4a0a3fbf89fa1c414d890fe3f2e6d428d4532905a20a44b2d7fbb4e36f516c62d6e4ab07f1c6124c7eaf21644c90f07ac4ca5c057f8f380c601017b17cfd816e48e8d3ad8d141c3de42c16cf180e0616e0375971379950d1449d9b7c94dd4bd824bcee250a2d80640b6adcc8b6ef0b6322030549087e64156ae42a54b6113fa805a5b6e2339217e4193f8b0f097f69929ef5f2fbe550404ab28f6c013da687fb9419a736b411b6a94a0dabf4d2a59a559811e9c89ff41e1a1ce875f23cc08fe5a8140051c9ce4a5f1f5231e6c9edceecdecdce82fb1ebe26381d0e356ee39ccf6e60f981c6a6fe22f2ea8317f541f612681f1ad2cb05e816cf0a5d75a0df79fb349490d333554e005db04b6f5a705176e82bf51c5c2ffd8f3f0f217a56619852d87d529bfd374e82cb264b2c72f791d2dc863bf46984610bacad8e3d1ef6cad9c0f0a3ef0aee93d5b5090535fd3a5a34740649f88e21439487a31d6876ef0bf62940a125eefa9a7e853d8df03a36dff59bcaa0438ffa6173c831de19b53bbc3f026d017be6e2f44ae540a66df8773e68b64495c48a7ffd9432f94cc9bc9a9dbc63b4c8365356174332f2a76634e7d8e57ca134e0be2dd5e156775e0ef9175b89580b5ff0ad80d7649c0908cfea22f2b2162d59a02ef3e59db0cf135716bec02cdf2f37f91f144eb006ba128921e3d3f25bc7ede5551fcb9fb92f39bd228df24bdc77ef4f33e85586fa95a2d01fee6a30a829069052bb6a8c85ce95d0bc4838583d540f76135c695c578d64f6ac7f8b2f91f277e839163508f81fac2e0c2622eefb7c802bcacfe9ae1b1cffd39ae7690390499cde940e1be867fca1b555b165da595a7e81a3382c9477c185245f8cf3bb2e5dfb0d4003a60b831ab29f38947d295634ef741d4eade30c5681bd358b82839b1b12bb0bd7edda657d5d9208f27bd744783cdcef886397b34aa586df3705ff18af94f6500af5a0b5ae649dd61d3fb0c93370e5348a6da3a6b3c3d20ba972ab9062045f920d31e420672f269a0757c52e8af4096c746d9515c5b5c0e0be28d45e45904186964d956e6b2ac342c989da546e4aa6f68fab5080ff9c40f3899d7b39d115f03267871aab349a30e88102de046a6ca54b7fcb28a17776986d32ed01645cb96489042a40de467dd84e6015597b4a47f99fc91cf308c33bc3efe83bb95d813f8b73f400392029f98a6504ce94b6ca05f3f73ac1d2e05dd8bfa30960e4340aecf59379574c757f487443dc10f959986353e1de9ea54e023700880ca6ba2a51ac2c7577d0a2cb6339856e4e00d565ba7aa9d6b153f579a049f62f12dc0b2dbfc97f659c16ce804c1eac2d832616209666ae5cddc33e80d28451fa63672a089547f260241c2795191a5e57415c03b3a2ed3c152ffc0c809c0d931f0f7a596d1bbd06cbf8784ecbf8bbe28eff40a84d93da43301dc3376abd520086e260d6004323da4f851246b6ad258fbfe40aef72f6b4620ae5683796418218861e07e0a58ef007fdc274011766c4986014f3649300cc80e6129738d0308b1e04eafbe451278626ce5ea92b2d091335b5809c4afc3ecfae1a4df0a8c4f1ae03f2841907a65c1675635b9cc4cf66e6e9292399267d8efb7155ee60987f00b8ce0e51e1a2cc0656cb771a38d176043720b23e8a1c9bdb15d4a4df5cd192c5371e2530b889277b5000330061085edddd7c08998572582446c19178a3e1dc2b19a53889d659305a036d015d34148e6a0754a9d0fb285992bf0f26d59010154e5430d4c41b0747c812472809a6898acda78a86f4f3fc2e3d948cd7a1216c69af992ab48c9c7caff310da53d21b6a0101b66f961ed35803f8e95906132730b9a8157edccd86909b0083809930bb3c8bc9205d0a5788ba29f1c3bdcacd8b1ac396eae883b3c3c51b4987890003243f7ad6cdef9241c35f8646dd7063f5d3c855e912074257a465fa033cffc98aae553205530af8e8f32dfb7d7ec2ebab3a080871c4f1a500f23cb2cf89edb4b4a1ff0570a9057b680ff982b96211538d8eeca336b7ef1edcad335580c04a7c79759e0f6ccd0af87fd0e46906cd1e09c7935f2510469b95cdcd59d49a9c40d386780ed61cb08113f995760dc2210396bb08afd1498094f228e8c199935f8997df4f4b2ba25e1888e0a1779ff68c38f14692f0faafa3ee701bed93c40db3fd6371a8179bb91e1833252adfd0c06710b7dc9b8e92648267bbc224441ed550e00ccce5b4a5a4ff4dd32bd5100264d35432d80529a486bdafd68a823e291be52d6284bcbb98f4f2153ebe0ffc63cae598ea77d1faa289d5ac73536f25d7e21606c0ebf94e99600edb551890fe47276f7a7d14ca55c4e8879263e7cb8ef0a18a581d26a72372f6ec795134e05cecee4e9c1b328486ab911ed5363578a5ffe3aa0204ba1b263075548be10471c18038f3669041bdde3083a5bcdcd46bba10516d87b1230d18816bb15550836b07aa95a5ddbb9f8365c76ff6e1378d8096fd99ee52684eeb36607933ac681c546f9ed25463a41178fdd2c1724d0a75c1e8ce5a77ce2493a41c9ff4da5151e91a6afe054059cf562ebbe4aa20d2ef71702a51b22985b9b9fe2950a05b3263c175b355739e9971a71f15b7d38b1ac206063b587549e74a541304be696cc89630dec162cea583f1f62292032a06f5d9750b34710acca301f276d07565fd28cf5a6a45e7845473fa73d68a64a6e316856722583ea55726c4de641e61cc51f98a5ca75287b55a6ac180d2fa9cf7273c4badf4a95ea6aa91b75829847daec563b9f23ca683053478f236341488eafdd2d69f334e13a4741e138e0bbe6bba46d7e5a22f2e85b348c2ccde2b9225eb14ce8a896c1cd9aa4a8b74911f5bd7184734efdb2960a5478ad3763da31d0ce06091e2118672a702054c24232860c5e2f5445bac7724aee7f31b6f2719b6c31f7a054a42b32dd2142a0fc28759363e70513f3a3c98c0374576e083c034993b99db9ea0ca8298b9019bb5901e8a6e486681f4e4c2c5ec4ebe7dd1fa12453042ca10d3dd8bb6d9320f417e78aabc5e97930df3e5c8971720cdb2bbbb9a5704a247674380a7425cae4ffdb18cd9b057c8de46cb051bd08353d19bca5a585de9c88ec3ca4c074fb70849993882a353bca9f2411c5bde3911007fb35c6024b0dee905b24c25438c92d7d7b788d9370999725bfbaa01153255cf77875a158c3b213ab8db8b545c99afa9cb89797089007621ce9bf0a4c45b35e0ad83ef213b34fd0a6633adab9bf1006f9b8c747718a0ed6ebc3b6ff2ec45abd8184a00de848fb9d71cb94b57f7d369a83cc87afd72f6ed1a837153cd728aa855bd1779a27810da86fdc22eeb80e01ee7a39b57ed581a88135e95525fbf5d840f3af0d64f9866db18466a58b8e7765aec96bae47bb55e03a8ed25b5e37ed6bf9a2cc7b18657c6c4946cd5b61fcb428b367a9e61b6e7f97ad2f50bd924521ee4619fee5f504d03f9399ba4fb322c8d7e1d6e08883c9cbbd9d50a2b7934ae08d4701c8fd63bdee03de694c3cb4097127800af48380ed3ed4fb3ee07d63922f6d4f377929bd13b7a077d2a31d34ecdd8a182345cf699d10a2c8503dd23b1ff17e35d1d08dfb0e9a11488334ee1ee93d1f78a7363122224a5832863d5a8f1484d5d62d3c32d98dffa43bba500990e7012ac084ddf4a685f70ae9fa704795f0ba69aa8b04199c25835eb869b958c87cacdb341544c4d40fb06ac4dc61a9c46d1ff24e63424cbf60094b0c21fde2e009329f02b97c0938835689d8b44c9a199fa3907ddabb6bf496f81aefbfc6b836c140b9a6a161b3648d8980c74ef390b0ad2060d3dcb3187d1e790c1a839b7b9038cdf01d0b976dcb0fb0c9d1b91038a1d8062237bf84c475313d1040ac1628786538c63b97e94d057edeac71964211f11d15f9b3e3edf333ec8fb459979d624fb9e9b73982a03d229b39b3f139ebc9fa68b1703370e0c7cd950f965ef5f4f2715a47cf6d0edaf73c7037223631208a95ff7d25eddc065978866ebf89c8f91dd2a0107733cfef117de81334f6ecae9d3d2fb2bc4afa33a4fc9a2fc7f2607f0e9daad179453917254494456d31e493393ed3ab1f4822f717e212debd0c31021069d14653c0b503c74ab6bf76fe7d1956677a51e3770f1aa7f4a555af5aef382ab8feb8dfc7223285beabf12dd219a0f4d88cebcc0107a5815e4c49af613e334d95984ccd6fcc519e4c0f4826b68f735d94c6e375ac3207ad1e189027ef1c48e0ccd73ab975c2432f3eec40f76fa60b5bf899ca4d20b6468da8258a4a08e2f2d22d20d031f57a58010653e75df99646e9516a1a043ed8a7862edfa571f3fa50b8a90fe1d48a0260a56bb484ececbdc4de4f25e527386223076f4a516ea93e66bf52bfd44d0e84e4ff95be3944d48c056e83eec252fd3f09666efde32cad279ad7beb8ad4b1f47db4b076d3c2a497babfe7912c6a8d213a0b0cc695d9dda398c8aaf0fee199fe49be48a33ffaecbe2853dfcfa87aad867e241b17d719ffe2d6dd6624bbfe7076440385c6afdf9f4850cc75e2441e0f73774bbd7aa90c6a4f4ddc2bca8acbbfc517d8d43014c38044a9fbfb355305e51493af93830f437b870c9841694647079ac7564742bc5cd88ed8dd08e09bb3917ecd7b783433800a9004010b4ca1bba00895bbdadffc602b7df0126f41e6fc75e1e7f1b5347d7c692d808d9846cb2f7de72ef120b7c0b090b33aa1f50305eb0a4683e7364e6e8e6ce18b9b939fcccc97d59de90dccc1ccd1cb9c1b8860756393a5d15a39a2124705d46a46609f03347cdea6a86668e34ab5b0dcd18691676f8192d6a86800ebf1afa21270032705800f06115a3071a182f66647e54313cc0bcb8c0f72e2d2c29d48aca8c2994117101f268b0c0757308c9b1232f67bea43473f4542572e3b9b1f1081c3ce22090e71032df3c468f977349dfbed273f3c42e40e81057d344a7047ccd50b350405c9ed886cda3cdfb259fb75fba35bff97cf6925be2c1ddc09beda674837dd0f8cc110d2b9a6e3d32739c894dcd6ddbbc816c1e314aa88668dadce496787036dcb5b1b1c15d7cd71829d5bceb460935ebe6908487772eb93b52eeaee5f46ecbddb1e4d67277a9957736f7cc3b54ee2cf78b772bb9b1dc9d4a4ee93787e5dd95bb4bc94d737728b967eeee24f7e5cb29397e67fabb98bb33c9fd7e3926efae94bb2bc9fd075f8ee9306fdcdddce6f6e6a2842eaa850a6a157cf9881c6de66f6c3054ab71e0cc9156d5dc99a3257033ad6675304442cd824705a17634cbc21015e0f007d22ceef0ab183dd0c0783123a38ae101e6c505be3f38a85b90ebbf69eeb35cb9fba8fe4a5f65cbfd943e4affe49aaec9ed47d32fe1c9cdc03a3107413287647812aad5492068f6403a2d633543191600e8ae86607c91341fc47d3b3ff7edf8dcb7d3735bd90e0b8f2803cf735bd9ce8b321d4b8f0cdf52e0ba99a399a3192d62b6ad09710f45cbc00311c201612a0222c354f4629b8a3a9bb08032367c5276fb08e233334711078628080c33739421110a8628c3a386503c502d94106b68a797e800a5dc112d036f84149c068d90f0312f636215773a12c20492ab8c8823ff606baa6e152fe97d52c723b9d61b708b7c9debde107b51f43a7654a8fa5ce13c03f7766edff5a755f5d869bd8db7696c0cfb88345a557bb44c7d8db547abea4ebc473d727d6cd547a1fa3eaaef23f5f6ca8832f5d9a54ce05035865035b2291465eaeb5b0a5cd747b9566c6302e99e2f80ef07ad959f13bad0ca283be73b2072bc22177f8a510810cbb594ddd0942b461bc29e33bb9df6665445bb9eaabae1fca3a957a9f08bd6cd477af817156c097f82ef9585940ddad3a20c53b3ba950c2a72d0056c0738226cb55a2d1c310b56d6d75a0f379eedb50c1ce9da6dc76dded20bb82e893cbf5dedca5659285cf59b01e21675c824bc82d12a0d53c1694fe0b66b45f2d168dfaef65a5b356bf4115fbeaa102d236fa7bcae392be46ab44a4a1ffa53b57726f97ae9fd700018437ec3217939a4fa8975eafd8182abef9e10215a255f0f007f40c08b212fad90e5496e112db3dd1ad1acf95ece763baf115d630837df3d2b7c8a4001c57c3d76beb07c34f5f5ba54552c63eb91f9c2406835586fe3d9689cf1b6d8628b2d36edf31ad6988819885641f9682e19cdea2610f35246ab649ef3a776bdded78551402609983210ad9232b2bc8cc681d132f24e04d9e9fbb66b04462b384285118e00c59d1006220f1ca10b4f5cb17344c4a94f66d6904e04d9896fad1bd069d0011880ec3489b4bd95e0fd448637718df854e64821c5b151703d762f39ded6ebaa56452965ab70c43eeae3cb75e5837a927c1246b29473ce39a73ca550e2c7aa2c0883a79a3cb48743fa9c70070c8241506808c2e0b1a00a9e0afe9190e2cb7f619966351292dc80264eb54e19764915bc1c9a829783a1e0e564f6f0394eda782a479a9fd884616bb3f3d93c96636660c64cba413fea3da0840a1e2b47b3bafacb06c43966a90255d8da6aabe0e5151b5ed7f530d27b34f3399a95a3551406354b9a723fdb66dcb8400a668061cab0059f1638492011718a7844460ffe077e25a3c7d65b0cbabb4f50bee5a1b0efa5c62ab630247790479e873daad0c2913c0f9d9837c8f1a30646227114d7d89ee11c753b762dbbc9c50e2fe924777bdf1f14db376e7c8a32f3dac5e049af014fc248bee11c32486e6282cd93f073fca861f2c6394cae71a792ab4a7f3bfd764c48ba9a2f19397e1051c239e00ee924e7ae067ea2ccbc7c24e122a2cc7c69059c7cbc0672fc48c0dbd9815803f16f6af041f21f803bf1070a017dfb1a7d8b73fc986fa17e86732081a150949987f888514ff80e0abd9df732b10d287b66c13e2aa0d8911f1542d002e74785108832cbaa6675499752a6cc99f2999282c29d8e8c7aeabe9cba9d704bcd39274a4c792a95326f53f3a90bb9d4672aa65232954a792a25535266eac6cb9bfabc29ab4bfadb5246b08274efe36d79427eb4b20ff909e981147214f23bb2108e94d4dc48da0c800282b984b98e6c4db49a2bcf721f96ad6a8c02c225c7dbc68382c2723b1d99c53e8c9a41babc0fa95bb68b0bca51ae1359eeca51aec94917df1218dcc91c731eeee9763af2e9dbc663721b73512e77bb4ddd2e2939e1a1553ae572249b0ff694542af53ec95a89639a65b2b0b0c8b3cc986b03e61bc872feb1c4c494de2c3a3dcff2ee24ee3ac3c8be9418a66bc9826de0c35cbeb350937f9b0160302ee1b36014cc59ee620020f9be7cb3c45c27c674e92e2cc77ce69bc4c252c22c27272c9bc662a3c03030f7657cbb0bc0ee6ecca223c794f350a8210f966b23e61bc82df1a1cb59dec1a1dcb1dc65c65cc694bc83b9cb598e6509b6d18ff97c0783f12dd43e635830c6b7fb3031b85daedd92935c1e0eefc9eb55b94ec48a68d5b66def36193347007f70b12ba517709fd8c6314cb35866a05c6e73c3a898cbbbdc45cebbbc04a6e42af7b50ae62797872b5b855d6e63622c65bf04db784aface1c735fb630e6028ddf17e616766c52970194c70d68ca1c7321be4e6b313795ba11cd62792a0547007f803975144f0a3f0eee7041b9cb636ea723c7bc379e181f96cfebc8f2a234cac57f1b8ccb51ae8edc1747678ce108600c97d46378526fd5717c4b4b4bcbbbfbde975beee3bd1dcca4db3ee9f10ac118f145902e5fbefa161175ac3cca36b9b597064d361e130b744b39e50adc914d4c564c6e943731318926263a7105ee6895c9ca753aaef435b9bc2ba6d38dc764e63aedc205070305058a8861908782657f063904d28750480e0604e2e21dfb45ebe88890563da188139be85a046d67b8c5b88eac2343214082c4f87be3a073007f80268031dedffb030f070e3d99771915cddfa116cdeae1ef1df4725e7e31e056d025e8d84d4481ebe0108f66bd269ab5d1d0d1d3194a2143940f1f341f37ef960f1889188d605e05bd1cfba744b36afe8ea359367fa8bfc75727701177dc24c11d2d3f371ed2e3957fb9f0da5ee2e93d5c5e9a97ebf332cd4f1745f39763dc46ade6da9c74b7b31860bb0d460175a77a5f476621bd06a380641e6deaa65cd4854730c06991dfe5dfa644ab9e91fc8056afc149b4aaaeee59eeccf66feba9828b7123d0aaf71eee11ad7aa7b946d80b3bc3a047f38e44adcf28488988f3769e4fe7fa0418f7e5ca06ae834757a4dcc55dfcddd63570f9c5db2024bbc88f8aa327328c0bb3111198294d53794c2a86842426c6450c9749528ea53cdb78306ae6174d24bf48e16e70f9853c0a9723ca1c93c8fd793b05e5de782edeb74b650e6e3c292e4eb71918c8c20eb2d023bff8db7ab8b73cbbdd0d25f28b7377719990f905b6c1bde5b6e5c65b299990b95322dbe8b3745b4fc7e934cb5fbc9667c45d9fbb4eec58300e255edc975d707826f268d5ebc6b30d5c742236d1aaf70edfe14b1d6e3c31b736e6f776f8f7a7dbe19f60605a5c5e5c30be2f7f19e625f514b611d3b5fcf47bbb96df5b39237edfee767db221eff2783b2e4714dc6959ab286779ad9ab8c35dcb2fcc753a9e6ed78293c091637eef726ddcc89161fe32be376286c1a81939e224628eb13d5f10bf722f0ae8be7fdf3ef72eb883d905bbc4982152dd8d63ee72837157f3e984bb96eb44970bf36df9cd4df5ed629e7acb799687820334cb325857489d8e1b64297a40857cddae364bfed9cb212cb6416f6f83640f379fbeb596b4fde85812cd00f41677f1554cc1898ce1f7682a499552fec977f436e8fbf23d189d01e8690fbd74fabab00ff143810e0cd223cc5794e14f578a680a81a611ad824445344b1a410f4f21e40eaf82e74e5770f027f8578b5ad059c3db18b9be11c89298d79a451ffbeac1c56c1e3bfc1117868db059d61bd0c4f2888687a74634cb88231a77049048624ecc84ccf02a78ee643429ad5c4d99ea18b8ee7f81b0a3a67a81b893b7f25662b4d28b52dc71454644487a71959e6a42b86b1539fbae98b519f6a23d99db9c7c1226291f258651b7b051d6f9ee44afebde0b6b7e2ff96d325ac8b5912ca59452cabf23b0e79c73ce09e1e37db9a91092673cc22a4fa18873bd3f87224efdfbb3c761908ea255f36ff351a3cc9c9f33489066757546d1acf972fa730bab3c83e4d918337a34531524cf19fdf2bcaa592820272021481675c08e1c984342cddad1aceb13bfaf54dc61e028cfb9a355f373880245b97b4f620ecda16e814a252323a352a954322a558a4ba920d601fb2cc96b167cbc361af2d190c4d6cbe9bf6b055cc7618b1bcf3685e4de7a6e9641ae12fd76d26d5cb73ca463d73e5eed3d4fba98dce2b6611f245aab268f15f61a678a9cd5aedb57a96137e01639a5359c42e211982af0f07759611e533c5c781e78c08f8b3cbcc03cb610345c3183ea851e405ececd12c8cb79962d13f4c303708b9d1f32563944be670f20cc1e11620cbe9b3d62ebd1c06bda887050f620827d2fd99cf3c2b0392f592b8430c28853397bef8b323e7f2d39bd9de1e6335f42ff9b9deec53e713ecbb5065c6682613f44b46a8806113f3a78437cb26b3eb427660c572cb8ae9a4c27a62678340be584ca6651773e75eb4d3775210f2720902662fed9e2cf89e9178604f64a03ee64e5f2100a791845b34e962449f2a4db937b3d754d3f5d18450aca8550ac5c0824e61f49bacd28f7e59598ad4da960ac7e66afa79fa69b8e9dfe624d97d12c0cbbc9450199bcdee43a32c6fdb44a62d48c935fbf5e96170f38a472b15a73d0355037609eaf971146d2f5378f68160ae8faca577097fa8551402b2bd7917564236e9f02aebbdc3e23b83745158eb2cb51d24aad081ba95fb8881acd42cdb88e3a0ad790a896a3301cfa75e336e3bacb7b036ab90bee506fc19047ab20ac022753972d97874d34cedc9187f346cba78ae5739b800fcca9b7609e14968f860577a8ffb44ae6d453d8060aa3808e2002e695067eacfce2158a01f7f818e7d0b173b16a47de5e2caf0f7695241450cca9c79cea369059fef251582aa69fa44e1c67848344949127b9855c8b3c0402a1b830088ca255f248484e722a2731bfd6b40bc31d1806c9b3dc7a032eaedcf46ee6d4572eeae4a6b3b060a8f2eb95065c7752a2554640b2c581bc72d345999e84e9ae9c48f9130c877ebdf2e0ba485c257a70d8b3d315fc9e2a251f4d0a772b47e19ff736a0158c02faf5154c44cf88003ea2559701275c672a0a45542ef67961c48143f6843b0e0577a7a11970d8e1d0c5f8ba38c639240c8eb0e302ffe21c048081508f1d7c6200cc848130a936e0b2d3798a3870a8964ea753b3627e3bf23a9b8fcc7088889f212e18e0e2106e355eee02e7785ae0c1ce0b847108011647762e7e5126e6d25d422e2133e97675bb43dd3392e7090e5dc7600ff8041c823c3a0de054abe450ab7838f153ab6446f129e6b0c02f877f2ff0f86fabe1e22f3847cc09765ce05ae31ee31c0f0a74f8426be7626cd6f91e4dc53ae605e79470e88aa156bd897daed80185b0744c0d7ab08672cf83780adfda3873847e80eba7624c9921abdcdaee91c30bcad0f2516554cb88eb60887cd0380c11940f35abc0754f4814f2682051c35cd1ac9236717d42ea14228190e36d2e8f5ece8c5005488ead126d9e909ad8a59ec41cca2ab796888359e52915c89954ded2f2127793ec2b3f41d9a8a0a084e05141a81d19ceb8b97929be6d86cdbba4e6719660a01afc5a8581a3dc2f5d27966e57bacbb5b9ed9a771ca2f49b47540d062ac5dfe0b629b95de9a9ec37d927b639cbcd4d56e2c1b13c621bd96fb00d942731e750ca6d30ca5347a93cdef488bb156c6a8ee3faf37672a668f3791327678a7d9b1bdc9954fa7413ee20677a9bde7fecf8474bd48725871805a4f279954fdc65b9547a4babbca5f496966bfbdeb4b4bca423dfcc799b92cfdb2531876e7a860a50bf0577a5f70ddc86e8c6379fb7e636b79b43d966bec6e63ab16f679bdbd9fcdebcbb29944b3e331eb9e406db285de536388939944bb8e5a9eb442edfdb913cd161e028a71e371ed3e39298439909985554300d3c63a465e0556aeeb93f4c210842de96a21db0f6f5103894100310fa8e1087f4c66c54c41ec881e497a247b3354076135050841e59cca0e4146b52a8a19388b31a8a3210a7660875559eba2b2fb931725c15b50caca9a951b93347ee8c9178926ca1567357457785c55d95a01c7e9572f89aa1939493d7d4f0a8c135434446118746c4f9393c8ccc2f865a35733483054c110c51b34a0e0f7345b322eaaf596f65745758603163147f1e673cc608a91601e0812b86a40db86ee6480b29a03600819121f08873c1cc918b055cb72af291d94701be2a6a1616cdb239fccae8e5cc9bfede0fab211803fe94aa4195bce6f3361755824d3587dcb3880120e4d1c0d7c010c15c0153f468e05743f087f762940e4beffa354c9088f34383e366d48a5f9481099221ca065c876ab90479393232345131a27284f351315231aa95e3504ebc1c98e1ad159cc94dba29943b54ababb993b9e3723773f462a88391bb99a30ee36a862410b028c40da2f19e9e0b82efd0a0717fb4910c8b40356c810947a40d62c8c0f4184fbc1c951d277f2114718268c0bf186ad6e9f02f9a6856cae15ff068164a2c7d854894813741fde6aea4dc9b9f62e449e336de96ace52da37c8594ad8c17695ea74972133c542e4da671e50e0c51c4795f21c2ad105909b5805bed887815b4b205ae9b395a05d53c468f9aa1d35d35d12ab872a228e2cc38fc8a51c429c0e1578eac1c451c1a07b21a6a155ca162e6c8cb29410d6b2d8b9a959a36b58d6aa48d06c99c37bfe9af50b13204ce49e373c667013ee77c443777d5c48a47abe011e456455647aba256c11516b2fb88eb5643f9766e3e58ee3f1f3f5f0d459c1f0c431465a0cf7d4476f081215a406135d42c2cbfbc0f1fe3e8e5dc1c96bce6401abf143d9a2a701d0c918ae8d1c021bb6aa259a5c3af78bc9c1b184d44f468e02dec072304f28c9016b8cf802fc0fdd07d8f56d9bc53317201f268b2c075aba2d5aa478637b9dd8c161d0cd3ed62e8a09340b0a99939cad60a4eded868373f413c08233f86fc5c548d9f07f12052b0f363536d823015998a5486500e058a4d8a0d0b4d4b0f2e31beba406001b818c049f54200181d1eb28a4cccceca8b99140a868d8d8d8d6663f320353c526ecd10ca3d9003f921e74076b20e010620002056317aa081f162464635238607981717f8dea58525855a5139158084280037099110a918a15a41dcf7646c502d54cbe62e40de7a39b55bf9f016781622cd2251fda71367e3aa0867550400d3c9cb29fdf9e4fab0fa01d7ad824a25942a649c77ab2119ef6a86688e1e0d3cc955fd1c573b468f47034f7d50ba6d8d04e5f3b6e45591f65a39ee74baf64ec53ab933468ea4601a21f407d7ad824a8f667e15d4acae6425d4ac6e03d9f41277f32ee5896ddc3ccedb3636998f2082985a10f7e771f3b9b9b9b9b9b9a1373794b4d19811450102404294e165dc2e720087753bacad00c0ed302b7cb85de40069fbe1763587c6cf0d42885551c441b55a06fe74aa548817a176b4ca0a4e46cde6f6e6e696448bb76bb61a3c0fe26d0de8b90f46d5f08135a0031482ecf85cc78e4e0771513582388dd3c0395e1626d809e266fee63347b6e43097e00e0299a4f56860c9e78bb40aa634d12a1e5cc953decddfe099a379678e944a3e6f63be84678cb40a965efae9dd9ca5cf214ab7317f739d9e39025b7a7089f1d5f50103c005eb0547450646060f0188c959092f4b6c426d8a2434915f86145ea7f0a22e480f2faada2c42f809e526e5cb2fcd3a556ce3b9b184f66da3bf249c570b92af04e9755dd566d745df16afa67d8083f94d310523395ed2d4e9456e3ecf0e9a0633bdf608a66d706ef4da7a36cdc4f9486cf35191db66e3c09d80837fb143c308618c72e2ed4595026ea3d8ce8183b771e399620a67c8f2ca57f6b93e5fadcd708b97570563ebe91cf10b564dd9e6a3220ff3364325cb0bbb7e491b07eea297f49aa47a9b5d97243dd934c66ddb5e9bb51d3edb786ec02d2e0d9f8e7247e9af79785dd4bce49cf65df6ce6618bdaefb329417e6eba55973f67598fba272be1435b080483ca534c6a7bd172faa5e53c6f8b088691816297d2fc67e316a319a9a75ca3052fa78e93b6a20e03aa882da09b852867638c118dfdd76ce18b17a75cc2e9f456b9af3d4d3b9aaa864194f3671a72347ac0971f9f4722acf3cbd9c8a4f8fe6fd15e57738ffa689d2f7e89b8f3e19a534356b766b508b83edbf97ee2cc64ed68bca88611986d17e977fb367bcd73bfa87a16a1f75a168cb27a394efc22ced6b944fcaf76c48dd5c0f0b5f55308c5cd15d6a15012bb44ccd92f4ba3adbec46d4a20637a0f772f0151d2356a9cd8c6e97f65e0e96bbec3e70d9bbadad020b455693b766f7d9c86436a55893e9bacdb2ab9dccd011c509b6c89d8e285aad3c8108a4952515ad5696b893ad56bef012435ad91e4746241e69e5ee0969658b51600c18830c70b8eec9a3313509161c2429039792a3fdb3d78909e576369dc873ad2c9bb501e98862a89527a06309405a56b3b79afd05713d69565e9bd92bbbbcbd280d35b3a3b0ec2898596baf7b23662967642c934f0cd2ca16482b5b7c231e696589331823bec218f164e06036c4bd523f80b3216f3349a2693d2c494e1225914817a99248248c64491949ab41ea1c90dfa3c9f6b00a2b00c9b60a2247285a1cb8ecf2526659cb2ccbeecb52cb7a92e4781aff002e3ba5f2da78325c6f77a275305b2c4aa0790c77f2d9fbd8bbec99bd8d0ce8a4bdbf67d9edae67aff5aaf6de88f9ca916d76bb09dfd167f5280c05eb51b4ca6ca5bd7153b3b81cb52bb2766b719775d05aa1286bf858d6c92b630b1c6c7c8f37e5b745fc38538f95f24113c7f5cb3f7314e2c1fc6ee3c0f52ffbae8ba2b2678eabbe93a82a8f82b22f987b629d6665391291e595d1aab84388c6b18fd79189f7a15572e03a2dfb60821e99755a15af95807b42b097c11fba652fcde678bb69f26a22e0deb51df13a2f27cbf1960443a5eae61b2ad68a6862b024a9d3a90c243890dcb0c9566924e0debbbaf5bc2259cad32259e22e725bcf855133e8afc3215fce21e8af5799c1ec659dc54bea74e0205f87ad913a07e46b9ee2f9885827ba556bc53008ad35f6c07590a88343b2149a15b19099d04414b90faf681684196291bb5694a4335af94a293d4ad27a2347264d1229c68992fb3844c075af88955adc64aba00838120beb96602c4a7221fed32c97f76910d12ceefd1acddade2fe27d2ee21ce1e2dd2a3f23ce02adea23220e143aadd747b431d68abb0a641af18557f4cafb5028e2401e3c84babbb5279e803e605cae0f1ebe5d1ff842d6422d6389b94eb3dce803c6070f3ef06dd5b227a2e6814822c5781b298661bd451c492449ba4819e63870f150c25a2b725ca4918b5c8443e6cb0d82450d80be8b1b24f41d180c82efbc0640078b641e8ca5a48445b294b094b0d4980bafb076903266d2ed59ad169d49b7eb804568e3467c18b67dcb342bb163180a08c37cde17b2cdae1602ee4d910427f26b82109cc8b7732627a552d239bf7d7ede5e729b9ac566cdb22dcb724bda2472ce791c5dad361eb3310f73bd5de7ba6d36d332793a4fe5454d49a594b3ce394feb9d33ce37279d70cb308e66d5f7853c0fb9f826d5b24bcb4af00dfab1fd8f41b504894178c4ab81a083cd91bc6d02306798fb7610f07660feb6252600733d4fc975dae5db8d5bfcdbb8ebb4766b5154a3d46ad8945ab63772644a2ba590c86a1fe0b2fc9a1084a05c879058091c5bd54830ada4554872bb69a9d475bac26cbb794ab7907371e1e11eaf1664ad0673e1d185570c3131b945d16090880387b44cc321413ca004cca195a7920f98cfcb072621795bca759a8407285ad0d369950b7376159fcea4cc03269b16afd6011389f60b8bb88d03db9622f393820864e0ee72e35b2e2c2a61adb59dd0502ab9cfc6cb72ba956058a455445b3c2de20b775e2e2c7a51c674879309eac2221e120c89ec5042d5fc986084286495152dde959b361e4804f38a16dc8aa90e1965e9c075af08cca92d623b072e65bb01f3c96d8b3d826d3d9d495fb1476cb62e252ef0941c55e24229dbabf8c0ec033f55e284926cef76041f9853ceb29562c06d47d8b2c5243c981bcf8dad14038e24bf2600810724d9baa894d64a6bad95d27a9229c501cd16468bd71e2139fd6e6db8f2965f13808006ad5e9949e2ad0badde9ab50d01ef0d4120528319480004268c61c7be5cf565bed017ece5e5757c8124a42e47ae1816f5748644f00a3970170e185a2ba535d32c26a5ac52962e7d6f3dcf0e3d38cf5b1c56358fd163283a576ac5b04f3a27e92fb458abaca45a3b89d22c2629cd66cc19a6937ee5de88999e5427a4143bcc749b919231fc2871348bd25b0f71d895ade7d921cf5b1aadde2ae38bf1bd175257813c9368559f2bb98f763edd974ff07d3b26242fd7bf8c0366fafa8a9a54de1b31cf59eb29a5f7e59a23a380eae55133b6cb6f979774de88131335abb39d37c6b97d8341360e5cfdeccf7a51522766efb477f61d86ca704f96511aeec9723ccae29e2ca330dc93e5ce30bf3c6fe4c8120edc6bc20a8e7207b728925f1d7a9e1732761ccdaa75087923cad34b1c1bcf0dd96aa920e3a087b9b7192999e2ae0219abdd3b928412381a870bd222f71bae400832e19227a0a366f8dac13bc1c6e0e01f156ce80ec2db59486682da37705166ed28dfb83213251b09bc316f4cd0bc042cca4c68f9e52c015bf9060132bc6cb53204e25a196620d8ca90c8be6cdbc059fb726dd68b31f2bcf8de8bd1be1e57e8428600f7cc90df6d15b02a1e7ead6203b4f5a56112ac108954d185a32aba40864334580bb967b255742108e4de8b391dc621acf09a29051b4208b9aa7121a3e28847ee62bc0dbb4e631a15702892bb53370e87713875a21805447fbd3b69f618a623a3c9ba0de4ac9bc0063276d235922efb1549cf6ea72353cc06899e84d6d30cc314b672973dce0840b6b8c37e75f4576b90522ceba1efd160f2992591ea693d893d76b3db0b9493b1ec1dfd75921efa8ae2c1489ee1aeb30ecb9e75d46677c3b0637809ec22d193aedc6e07bb790973666f3becd92fec19e62a762660ee609e959bb06661df4b278b72c4e049aa206cb55a2d213b8f489489874f487e1b8c45325614772a4824c3446251c4e9a128135f63511c5aa9e689e3607c0ea763a723d1cb797988b3010f5bf9e50ebe5b19364e8e1f10bf47d344880cb56e075b30076cede84499f888e3cab40f5bb9af4cb10d9ec63798d0118237870c9fc3bd9d89636b27ce217757ee57851ce790fb3d5f60c2533d56cf179af0542f772f0a39be8343728422c82f3f3404cd410a5bac400e2918b213912084341021cac10ea880841d208a10c51a7e60040b473cd88938f061071f383862440d6dd8897fc4795608411355a0031b5ef0012becc4ab228e0e1874a00b28600217e64034831d1729e23084257401047448c34ef4c291106c8002181c61c21c64d15585f8ce6dc7f07019b84e7b555c2194fbab8873fae93d1573c430b0e0de4fa7d41da2c8f6548a1e3891bd769d657c672985dc9b0fbe42b66d45b6510bd94aa26ca9266f4759910352a0e18a1c2f5f0ef6f8f972ea23a679668c0999b1d7bb23df202192a5e8410fae8e99ccb26c66593e64f8799d96f076a30087e557c513b4c8295d9ac2ca1f5764527e55f4800dd976b3b00f82723f25e1ce3bbf2a7c60833c6fb240c611e31683eb4ed3d45cc855fc2892fba997274b17d65a45f1955f153e70224f6c823192229692038f261298a289042638236a86fc4567f7e9d42a530aaed7b7864c0f2f3a2185f105434f5c3dae9611ebee2d4a4d081a3912638c3d7277cd006af1c290e3db028acfc3f9c1f4f89d9753f2f8201e8b3ebe23408e3831728cc9d125c7948e24c75faf5f0ef7f8f858f3154123ad825a0ce108eea2d85ac1dd8953c11d87d2aa27dc552e0577dce92ad50aeb1e5796655976eee2db7bdf45b1d5278eab95e35aad56ab15b3e9c36a856fcaef3d3d16451c985fa55ac9c89d347a7957e3f6f7505cdeae228d220e0c964fbce068f44414f284906d62998c130f361f4f3c767d5e3e3a3a3a0281add1aa3e118f488441ad13b4da091e3c620f9e78228a202408a275b69b96c123ad6a2069592ecc7428e2502251a6bb13c70d7dfe6a3ce03a7a94a916471d2d92839ad5ac4894fb9710d5a27fb56811c8926880aa7ecb2c5e1a1e4dff571681aa3e2542fa094a234d07dc15d42a239e88af77548bdccf7e1471e8d093e9d7caa26d521832a488475492041246271138a2a8844389dc167847e29436a4ae0259cacdc7c709b8f5340f769cec1012aa439612df805bd88ca1dce5a666a15cd7361e9478036ea1d566c5d9722bb548bfd0d78b74b95aabaea36040576b15f607b32d6d126b50709789269b181aca72b7dc97af63a96b4241ea362236b5ea44d384c0a1502144086d79833c2d424bb69e2986520a1440805c5bcf2b83090e263798dca00709608fbeadf3b3e5f235a26c3db485b6e0ae4fb621e6294dd1b2cd277e9e368534d259af79c10b5e178430a497a5b60d3125b673e08e4879d42a699422a1f133a4a4492b8810c1b059a2c927e47ad6a461da10f2319b5343f9bc3eefcacf27fab53e91b10bce2c9e2cd2aa99c553f5f3346a56c99b0289b34877aa7d531179f4686070834c817c522097140805928d1e4d3fc1759448b682445ecfae2602ee7a0b5a5ee0ae2022ea79987b6299ea24fbc81bbc9c57c4c868c6286f7061645ba2659737c0a255aaeb1d2cba28aeadbab0ecd1aafe1092a386ac6092abe02150a201c6e8a75c59e44a353c555f3e814f707732914f94604e66218d648fdc973de40d4c4e8e102477d70ca411c719ad68511a49a30cb54463b993b753c99d348246a016d2481a49a34bd26bca39a5d1d5e3b61062b0958b2fe74dfa795154c6ebbae67c94315e71ce0b426c6f2dbe2e8c6ca3266b7ccb4753773ac6eb8ad7755d935a88b181e4bd40f8a890544a29a504a2555db7edda866bddaebd39926baf41fa46fa856b905c23c1aa28d3a7176a27e11c27ad1e6adbe38a5adbe980d1bee9d56955ab6c1b38fa4e468419562f3aed8c79098451f91e152d5914e78e621d2ce30ddccb9d8c950c4829841976ac5e536699cd32528c8f0a21a284a144b2262dc14ab8022079fe92f232998edf7124ef4ef9ba708763925cd23625123a55bb14b4292dc32abda426a53dbd9ccb27956adbb50d16c2abc5806b20adfca83812ca7d9cfcaaf0c190fc369e1a5d6ad52f2f03f172626e2ad870943b1f729f3bf1e0524a4d560dbe93524a3827bce09c730ad97a54de364345b201be9652caf7761d6e3cf20a725df59a53c334acd639ebbce60c326fa376ad406e43c0e04ef24eb58a32fd12b9cad9351849e0b2772f59d57dc56b5e184fbcdd2ee944441c22f482425a350f8590c020904777ef48661f240c0812659a073c0254f5a13d657b89bb938d580bc1834678340d8304818343b08997034f2f27ce295ed0ca90069192520dab9452795dd725e5f5cbc471b5d6edba64add766316cd32e18e422d56c6f079590fbf2a561548b05b92e292f4da3d24a098334eb745129638c9262355e53ce790529dafa24052935ad556d92010733bc360319704f0a1ef4206734991ec68bd289d54829959472f3320def578b81d637bef77b3d70afdf7db94956d8474b5aab64ab4c36c608b38e0a5b28c7cb6e9c09b51d5cc700c8c717eff6e5803a608458b09df6931f8c1a881a588054ad646bb3011abc9680b7c34599780aa57d5fbfe8b90ce9a4effacdf1037e03d98e3dcf0414a0dde21cf6da15f0762cfe017fdd048480003b1a3e4599f84799786d9b8165883b224240801d7bfb6ce3b9decec663adb442e8c4193b92ba0590369eeb72ebcbfbd3aaf8eb12d12a89352470dd1bf2ca9097789e32a2d460c7d84fd6dccdffb48a883770930626a255b18726e4f937f1935342794d7ad9367073e26d083aa30e91aba4f4a226a47376dd92ca2bdb66d04fed04351adeb681ab938866c11cb3fc0f8dc6e176e2df2b3ab2efd51ccfad5edc42155168ad2e9d68d48c72ce4661f5a230766cd9dd9d02fbfe5a0bb97f280c450883a488835aab1e7e5007f2360e5142096196a1305485475d304619e30c8965ed7ee730d856cc39e7a473ca28a5d62719fe5d709b9172994c5f3075ad81ed6b28e0ba538e5ac7752b1f82e4986316728c7da1937a5119312cc3301489d58b4a29a39431d2cb0636febdc8e8688487b422779a94f20d5a6429a51008a117de40455f114e215584f105c25f1784f0c22a855996499e397f5d7f3a3ddf8baab306030e5ed7b547b0881db3d70e78e4f8eb91f29362072320e518a12abbaecf4bca79d54ae9ede9e9252f7a9dce8a5d765e93d2edfabca82dce3929a534d2d3a6951ed67c4d3b85e4eea5210a1d80bce0055248d144968f6ff3b152482194e3a58f9d97b3150617b8800d43e811c4cead47c2a00c5048437e4f258bbe4022fd98ec004cdc4b6e1279a2908f12ed62cf2e8dee4ca3553f529a386ebefc9352add64b884773a54ef2dda97337cbc679611f277f1b037ae704ff449926e2d66899bee9be0680c683eb9e90924ba3651ac32c1042b3688022bfac5d3aa7256558b53f374abaf144ceda1b2d4622fdc4fca6c8028b2cafdda705699add6e31cdda5b4c8b27d9ded2e576b8f1906ee3db7c945ca7a39d1b0f8986bd70a7747d94dc64ba89090b7da7a4051a877f68b080b36fe321f5e60333e956dba6c8e20a39db922cb925d924d71cc7c126e47879b73c379e29b228c952a9f426a99b4096f344e01f1a5afca91c89c4693fadfae1e87b443bda56abbd360edc1bb2914ecab0ba3daafde85022b97b434ccdfae1da85887d2f1d1cbaa0cd307a5d35e29438099b745d421bccdc0dfa214b5e2a3908be538ab674df4ebc2f4313131fdc4b57e83ba597dc20107ca774a1ef70b76ff6bbc692d24d4a2525f8b1847370f3144d3a9accdba92816ad6c09e3c53e6150a6116ada49cb36ab6d3c37e812dbb56b9797361fa916e4c36a3561d045372064c88075a24148b399a65d9869fc0c39f1b19a36af3d32b71e12212eaa3d0c62188475d2eb6a2be05ee457c5165a99966e8e1f354ae74a988828d38fa57330bbdd23cacd836a80c9b9d72879a9e417ae61720ee7f871dd042b11655a47ee6d891adc4b700e0ebf2883c43603cb17ee88e09eedbc9dd23749bb77e466dbe9e816607734c1c177709bd8ce81dbb699e53745165ad02ccbd6da9a65196e70070c22691876bd8341d72525c9252f49b2697faf9bc669d750ee60100c0a6a718395cd8a5b86557a5d5b5ba9bd66c91ab518e7bc9a505549fca28237a795926e95527b556de399f3da78e6a7d5b0cb395157c4ae0bb5d588611776cdeb9212067e51413cf2361e4be57ddae5658211acc8766e08805b027c6a9ea75b4f6789b38b5e799b514a6ba5d7e99661d73ce9b392485aeb0d68b58bdaf9ebb5466dfb9661d57ede6acfbe56db23c32a24c19433584d04efba66bd2e9bd1ebaad7ed76039b734e7becd2eccec767f36f93e791a7d727a4eaa8044c17b5518e3a45342200001000f314400020140a074542e1683853759d811f14001096a04c684e17886110c32884103286000043004440004440300007a2192a27db2e369a1bcbdb9585b6b8dae05008a6c2cfbb6dd988f6a68a287864374b8eb56c4876a4bcb25c94f212656ce00c35c8e83ae1a0026f8a3c2ee5be9899dcbd03b9d30390ea0ec10994ab5dc4dbe82dac5a1ca7dbf35767514860799b18eca6573a198ca039f0da456ce54102e756863754a55f090f966bc81b1e94e880da0e42d4486784638feb3c32172764aeaa2f567bdcbf29e715acd5f82ebeb73eaa5839ba281a1820cf869fc8779b1af5817823eea96ccd3b6e05961635760c17e0662976dc38401514a7634ec3bcf7fdccd52c6b4072923770130b700662a0914cfdd4da2686b96affe3ccc112f65dc360f22a8ab245f787f49b7bd453b0764576f6f45a97932bb8e52ae75263483e26bbf2ec993c312d17ca23aeb0ff35ba0461cd2368aed61f582f8a066a52caab7315bdcbd02bc28569f60610d37935efc4ea6b12f77eef5563758b994beb9088e3c5eaaefb482daed6e295ac020a07e5a53a60ce425d6dd92d9caf6edc15ea89acac81e862ace1138be58e06d9884b5d3e588eb062075a8098fffff57848477e554bcb08918bf1a83316abdc08e455d1cc015691dc91cb0ea856cda42898a8b1386e0a73dad04f2a8e59bf3c9d74eb374904b3510cc1bb08684d7b7102712671119cac1adc0aae9b017207d4ef1e3936f51d5283574d4974a86883fa36b5bcb7d119319cebc42a35777b6601c47f1441b43974372ee96958f3a9cdceeaf40ef0cc1589625805ca9d1a8c8403ac0a226a495743265bb6308e60ea365106e647cc32405cfe567daff9ca38c2dcc33b50ec285a5cbc00c8e7f44bcdc2d3863f18308f89772c498b2c22d42a8239cf7e3c09c49c8c902c2696643d2076d03bc7cb60ecd2ef6c90475e8ea61646caa108b1540f840a1ac3223483fddefbcd5a98de190690f56f372fa1a34fe7155586a85d50f9dafcea5d4484cc14fa452f8f98ea43023ecc0bcf102cf4cb41f88b1a1103b9acb966a66652f0931f7720d5e971f595026268d9111963ca9da35c01c8b660a85abde589d023c103e3442642d4063ea6897207ef8160efcc19ab8526b6902bb307c05e2a8e210a066d74f00b26ee4669bd55c6d14126afd021f2345d775b0b931cd85052e45c5838b37b045caae4c2652545f7d3b9a5cbf7d51d101dd504ecffc9c37422e221883e61bf5fdae68d9366f5693ffcfbe1628a4ddc75021eb7493522cbe00cb3ec318a06c24b175b69d2a351749af5c43aeff56597aef4e979f8213416c76dd6f02d524aa9e302da3c04e163bc1e1431ecf40eb341e1d3357c1db28cf813ae309bcab205188189c2365724135eadcdcb709b17d7e33e82df8a78d1c66ee4f5d0774673e395126e9c7703fb8b395cfaf95121bf5e4d18f1b69194dcdc7b2a14e8a9fba220baafc713a44103784cac6d4970aea1d65f4d5da5d7d302b01ff0d94602737c76fc3e86587c48e27e4273362b8e6f11b35a6c0708324fa99340fe12ab0cd4887b8e38ace14bae1d19e343ce4fef2c358c6340d51c7e90081d8d155ee614aeea122eed02094fc2c4a896967665e19416b63729489f44c6903857d1787200992b82742160e3e60e501efd2f4b41db9bcd2e246a25a3fcf5fc388b657b2c0426e8530915dfc9a5c94276bb4149d91f77ba7905bfe674936e116fcbfc308758d5b7732a577247941a262271f5b74b3f7b3087f0622b168a53421c0da6e256ef10302558993532e120184419a626315b0c688da2b061022a61ecc068e29013f40e19d06e24248a320b0118e02dd4d3011f5f3747862f400ca0a7613afaaf868e7755532edfee785e96182fee64f7696a89cf25c962355069f30519a1aec9e5ad8f32556515b525529e420ce53a9478a7c33d0123e7a3e2c9b20cc14ed01602004825335cc5138aff2fe27cc5f9114636ea2f24d5ae7caadd59a1fb77de267a582798bb82d2cde4198a0737696a91ee020e7dfce49f6bf178cdc06e11d65e011797c184cf93424140b875c42e2c092f84522ecbcc03238d479fa1c8b4e8792805980b2457824aedcb8cffd3a1f16530c08826649f70cca63296286684f49d22edf00682e73d45c212f91f686a79996f1f7f2ed516ac8652a541daffecd7d3f606b2a3f4cc68a0c1051a2f65d069ebbb408626cf9f142cd0074d8905e18ec22d6e0ddde0328edb30976b48b5e354294bc135387f9914f531ac302071e918747cc2dff5e87b968873719c7cb1daafb19e41bed85ff6983faa22d10336be76585e63d3176a4e025d26f62404e62bca4949c3a165276cd9e6fe3a85ec371f77612414dfc14e032be8f5e8b4ea34e0f26e5de4ed3255e4e8e133b31cea22093979b70eea3bc7fb27e9b99c51eb7054263203b8ebba0f854c8252aa0873c39d1495f328e3a3432c0adb4e77926fff84d51d7eb8f44aa024ef8d0192734dd4c5becc657c35f3004b5af32dd6161ee3de09150cc8467ab2bd8f1040384030fd05c47de7150384f37151832c6b604c2828d05688a0659d70b969681907e0ab193a534044e5b2da6f1b29e67eae2b01a14c4f6894d8579b3b2444e0d60b4c159c437d4e59d462cbb69a17744637f90d13ebd4be880ad6ca161c73c59b47115a2fb0ac96cfeec951d7678bf35ead87ac000dd5be8d0e488ea84af0c5fd65dd42d78c0a10f23df90e0f9e9f2c82ceb311909ebd215877abeffc3d20f0d58b5696a77a42a9db0263cc71d781de755f9d2966d4aac137ffef574bf153011e37a7f288874a9913a0298c7527e8b97f28d809b6878efdd11fa94e5b805c71a4a84509edc68e4e7d0a503ab439c55fed1fc8a5cc3a0a368322700c957bfe79281f2a580f026e001cdb290b707b7280068863f381d5e8d7d1e594975cc9f6df0fc5af90dc6ab9039346b6f066d7d4fefcbe2763569b38d5819cb608f249bf9fe73a6c5a6e4265738949993fdb3aeb5c36f9214b771933bd76cce18abc82be83d768085e5f34a63a4b7de34852f63bd7c519734f5d84bdeb6cf81b45c07139b7c4011e1786977e741fd23cd8c4d154f10b6df7ed3c7a607c88e1000d959dc0f66e406f30e8e4552f217e137db8d87194c944e3edcbaa95a8cf517a0754b7d52882b43b0482e87a4f72a2ffe254a7c76ad7d68090edf373851559461752857147985761e32fc17e5a242cf03e3db45c4f1bac8a3dd490bae760b6475afd1ec624e21414084a6cab45ec0142606192bc8b9ae0738c2a8046bf7d7cbca9e577a072beed18572c8b458e1e7bba2590df8a0fc09f263bedbbb8f4c346d8fec82f6f866c9f9b9908dafcc55fa5c312cce876a6a6eb29a6e191dfcaa238c55ca9afdf0717d48f5037adf4fdb417e4fcb4f6661af80375e2e9a2a2a7219ae5528aadbe81d40e7f9455db8674d4456e8cff92a09c6e35a37f5546b5d3c9f75e37a58a557a6560ef321cdc4ccce66fa9c7bce4d965d2df77cc8b1e82a408ca873c975c5d4f08919649aff466a4de77e6257700097c8ea7f3539910a0e747e312e4623fa620ce4be3dc4272a6101f383b305387f2d0500afbde028b9cbdec43e1fe796e692fd62209189d9e55e10b52b79586b7216cc4d066e75d70dfb787462d503bf0dcc063dc71cd04212e7d9d33eb5493a1921acaf79b64a70b13c08066dc9ec5ccf0a41d1188e1987633d7236a93d280f3727519377f90a96e15709b90436a213596be011780e086cebfb5f6fdd2079878d78e87b0488cb11fb21e403e797073224fef2654545802f580945d0e6dd12237c459027d42c0645107f5720206dc008f7640115b9d29e774e980cd4505084c4bc51125192ce6a19e0aeaab4c55e8fe405a485d446cce3259f626ea6c21516e22a9d7014aca3ae5a0d8151da5dd425a54e049a7fa5f8790b5e7fac7de9a591474b4dd75964b9963b7273de23b6a3d8f5288791305f171ec5cf48001285405561fa638f89e926b8240bc086e59d5e604eda6f525c596342b89be1dd135c8bc626c3aa04ce009cc041f20d1bdf80e9a07935c79501c7ad7e8d9a2c1bc6226992e8d735a4e8cbb18270b2fc9e27348b1108be27df45b8e30e14d5802a50796ec48b75e9a4cd5b14305041a762ad924770eb4d4b445165ca157b31640445b17c4db3400910b4d0adcf10aff62d2f648ee6e7eb5456aa2837b92fab82c78e67600ca306e27a1a08a04b9a7005c19c39a18160c289fb8e530c257f6656ee572dafe5916d3eb48dfa8391bd7e2d628fe68bf39e508e4771e2e9c0e4c987718035147e8a9de19e58c93cfaaa1047c947ed7e3c98dac586da0940f7688d9af6618d5eecaabb88b4993f6afd89566231b8839e6840c5f5bbd64d4e65603ba88b5d2945304394e15561f682e1485819e19c75d48d19997ef188ec139dd49a9ac027abcb534861dc20fb4c6a52c20aca870951fcf575302ecab07485e2ad550b5171493279199cf047348a48fbf00b31386c50d706a81bea53f1188ec73bcad3c08d96634635a483dcb1b8cfdd0c53932c7664e42d7769156909d6c7e29440e41aaa58b4ae6e6b7c575ad6c576cb5627ab240b36aa14ea390fc2bc6ef62b543b4f6ce9b232b0f071fb1596e0a5d8438dfb0433a0cf65bdcef9683013474e6d9f4a113f71b679f4967b7edd02c22b4fa26a03f2dbf4b77cbdcc98ca965159199c2de2f4fa0a109cbc433010b8f77c47de228daec4c9200ed99d5da03bece1272c6f3d5fb2b5ab600ef5f1a00c2a0845fbd1758856534b75ad0628de5905b7a2bc8d95dcca9bf9ca3f008c87b7213bc2af68de80bf989cd9b93ee4f03da2b495f02f823beacca31d260c216e6d1e98133bbe6fe4a3fb8b7cec00a12a50314e705847e69d78b2260e7bc6963bcadcd0ea4d997a828c6ffb4e43303b45196a593b464ad4abb529eff21fd9503829f113100f0e0cbb5175753cc724dea399a7d55c879019a645c08a2c509c1208a71fd2ed96b2eb4ca05ae2aa78b9e20f3bf28afbfe453a513376591d66b11cec3e04361ea1163ef31529855629499c9a22b74c144a40de73d8c1ebdcbf0454e843d7749cd415d5ef6577535628c7fffd76cc50e63df00c3b8c800eb9c3a62a9497f442127c97fb2483fc6749c53aff4a3fac94e1602f275e7a8919ee5b93041b9dac45d24f2fb37b5718536c1a8b5cb98f937e9ff53cc978671b393a8e12a1ec4c302e7f08f21d27166d6efdfa4b792b95843f2a5685d4ea0309f99e92770598223726823868d2d3ba60946fc62f5ff3aebbaf1dc1ad1f6a3c6dedfa308ab278684e87aef79b00ac75e0d9b5d7e1ad344cd238fc66f93acaa7ffa74ae6d6f429cf7c7bd7f1fb0b136fb4d6c160e90dc5f36a47bad117e05bb7c19100a544271ba7a9c7bec0ca51ae8bfc7d5b67ea2fdc9984f253731dc346766de4afc0d0cccc3d6133865c196069284f157ecb18eb399dd397bc4043da41c81eed1a466096b74fd6823ebe709d73b812750347b6d95a557799831218ac4a653776a001271365817a390b31424616310f50da906e0e7082cec366f1baebcbb5c488a72fda461b585e03ef80d37318b029be1d4f07dce2ca38ebeea0b33838216e370273e7417a413e298c59d230115ab09921ca765efa133c4d29453d136558edce4aed21b2073fe382083c17f59cab46a161e695031108fa45c22f779c8c308d89caa463da7e4ea6ef4361c55f2d24b374eaa13410f279239ce2dc5c87f79aa447c99273bb49e181491b5ef04783c78932ab4fd83a6139241a89dda69215cc38387b82fb4ce068e8658b47de2be7ef75d04142e88d705d41850fc0a0f38eeb63488381a53a9d62273526ecaaa6cbd33543d3fc4a5012a4af08095313512d510c2528f67f5578f473ecfbe58039d4512f9283ed8ee408d2cb645563e141cd85fd8c18bc5c07b0e79ee60e08eafc7a63a92024835cdec72d4b7b89e9d7da1b2d22cbad3ae976ea27a0bebd43c4cc3ca9c36382b45c285c44af8a701d6a8b33b31606ed9d03384c5d096f93070b298f6060d85a1f18af97b052e32e75d44a6f018114a1c2c27b690977348d7dee2d0b1f9abde2b5ba9a328ef30ea7797728739d439f554b57acfa23b06f1f02abb9d8c9d2a1257119646a8561912f5e1d649a4411307466020443fe68510d72d4ce2a62a0bc14060a52d0fc2d21f6d3102200f52b21c7b04bcf67a63005ac8a0ec958e6f60692786e8b9022855af7ba450ec5830cbb54d20089d79d8dc9b5ffad8282e0a6236da04da6e12fbad9dc8329e0c711f8d8eb90d840407b9238a0c3c47b1143b2a428fc3839c84113b44f2fe615e44ea418c73f81f9640202f8cd51ec1ee67ecf260a0bf5cb8e25783d553131a781cd790d2476b0289fdbdbc590041138d9fcdccf4bfbffe0e363a2c8403fed886d52cd2d9e70361087bceac4bb1c5849b54d508d3190cfb53241bc9dae03a56e640272de27063669d5f4268ae02edc7cfd44605fd4393aa84eee0c407fd2ea73410d668e691f1797d3f844d78dcad42e2afce1d38a924b093705ad1fca4f6d76f9054e67e726b277f5724c553b74514e06d5c24159112c8a42fd2d920c7fb9643786a3a8793e060e8c6fd9ed38b9b7c4c15e2c4a3e141bcf7213f22b4bf52d4e81cc084595d4868b404c8002b0e0406997861b467f634fb10bf89c27a302830b8d3c7fd198b2aafc17ff289c3a69a137baa9015915b15b0b47b3d9b17040dfd24b618e5e3f979ee1d0129b9c2f03be77c1a10671058bcec8da19ed3ead673f9100289f7532bacddc32016c35feddd34c4c1b3a8d9379664183d9b1936d0168c7d664c098b90f5505cac319433e59ed1292fc1bea80d1b4415c31a94c589fca365d0ef0cb2b05bad9a38680c4085c9f0b24b1752aa01f4ca2aeb8125339e68c1845b4b792a0f11b9b63e00c3e29d3479472e349e4212a68b4dce77fa34d55796d4562a618dcfae3a4b8dc6498bd91a4b293d48df73c9a6b6d43869b560719df5c20e9de123e562273fd423935deb5947a2a240156e6d0ef3ea66d06ba2fd9a47cbe7a79fe7417aec772766a81b4db216b9d74b6cc65390dc08bd30c3dc0f131dfa91eed4f14adc6468e00f4970e991548702c3a7a5e15009efc441cd2a83342113c7008a47f705a84cc9fb047ca24252b390cf2d1dbe59873c31f88ddc4c49db87f52a473fea33e641ee45fe331b39dfd083a0b8a46f466b8c3493c11e6d5d980e574a349e4ff8e535f03618584a6e4e27e6a9091a0ea8645e0af0cff77146a5fde162c5c12d89aba8f3f769a3b7e5400fbf1fd67b3f11d6b4c24c1f8c3c35524a71d4d202a9cdd2b3d64ff8b1a6571700282dc39029fdc6d44c992705383be270612eb2169328b713539cf724aaf64ca361892c512a7c1fc97c1d8a21ff15bf768e78a4f3a1092c0c2f6c63170c17ab6c383562e419cc724134f943d1a15601a8abf2c015fa67ed6c62ac4977bc0bd5934acda7e42daec3ccae222c1f91c461c9754e92f2fee513a8096b299e8be3415c2c5e0ee6686e4fc7fa66672117ca7c4c1ca2ddea40689c03f68c729d565fad2bb5fa270117f0cbc76662448707451d918d91b4ab719a6800b06872245a0bb4ccf9a163b202e5e651cc3324524214f52f3553e758c78dc81ca0615f440c4aa49b1e59a23f36ba83eb884882eb03b34aab2512338492bee72dbbf3f20d6655e8b5ae9771cebf4182ec99fca27215f968b7177cd5af08df161e24c5fcae82764c8019a51ca79c3c9ce2538f357a1b777e10cc90ba6f83da4986b24e6a2c2318a77fb5abb965654e5adeb028189387536665fa341fcab7c4fc0608270a6e21d073f2c184a274a4b7a3e8c7c60d3b0af4685361fab8af8852543fa4e4e933669a1418ee27d751567badf824ebc4ac4f1ebc84809910d232567c8962601e24edaead886df87ffadde67672f347dbbfae8b6b3a3761c5371217a18d7546bafbe7ef1780d0c0a6ea7890b5113606fa35e94d4675f9f7ee2cb2d60307bf470246c3013f51a1ec7a129bf989118086f50b61e28e7117807cdc5b9c9fa163c54eb1acbcafb559a255d92918d9170c69f6f9f497eb6b188e5d6f471e5f9177ba510eea8180afe401ab2ae1e5ac40eb1e4917aacfc38490c7635ae045f1d83e995c05b2e67a0dc84871e3efdca6cbcd94596d56a66024ee3c98aea1279a0ab2922478e36db643521353cb1be9a31accc72c8777e7d8c87045d398dcfe2dd0bb371f9c6520bff0822c3e104d1ecc835b74d7ac91e03e086bb63a4c29b0a38273ad0641ec2fdf735334e2de19dc2f906fbfce342906f41b72451481a657673923b422ae3781a259793b56ad8d075ba8c4c9261934f26703a53869de58fe55e7e75c792fc6482edde4c759095a7c9252dbaaa8b7dc29d9d348e877b876bd7536754df7c894252070b66f764edaa1571a359989b95c6a3d07d09baa554d2e820879c2d6fe903c6c59fb38937867a3b6701a84343bc5d91c410d40df6e856d464e39270d0b6112c62d621359ab46a32d8140178bdbdfe440e6e958aca313c9b70ab17c40d54e06045cd3147cd015778d6d70013abb090e9df5b56f5c59e9f2e634c2c455d887a878ab77270c2ed15c36faa0e9db94880ec30b64af600fe76c2bd5dade82dc5025ebd83834b2c7c1edd5b6726b59fc1a2c5b40a5e4560a26d6b9493f28708d94b42ea422ccb631c8c38185bfb6d2ac120d8b1609afc5dc548e53dec62a4922c9e3665614d6a086c6633bf4f0dd5d51e381e06d81375073fc5ab8d01212775d3e9518c108d10e5ebb6ce6e047a4cdcbdb4edb0dd0e8ae90c28f282dadbbffd2536b2ba06b28430d51ed84f003408f7a409e226a075006dbcb034170534bebcf3085acb1bc9c3dae2c3c3418dcd9b28b808fcc453abbb96dbde5e1e578f45a5a4f4f4d1f6a1f9374242d451d86f5626ec8d22f779f91aba79a24917df703980d842f8109d4db9910638d770edcc984c7b67820e0226dacb3baddbabb43cdb8cf4f2b8483e1439f3072f2db014a3f675bd86f433781d80d52f4944cf2d78e42dd1a8c43e85144605985e71251995831c09697d5c39b3aae9e1baf06859904cd41f184f833f9b619c89fb4be6dc80ce2a28ff90eda120b8869b9523c1c130f065355462256f6020095b2aac4190187292ba1ef904bd4d998f58cda436f3ff496982b33bd373d14cea9b796e8a856321b4bd29b6f4ea2e16cd2ee348d81c82e10795ebe9c0b97f3f636580cdf3a45de7117f6c0ceaaefb8949524963593bca2dedc1d32d433fb2625d15c222abca7b449d4814a7e491ca8c08289990db36984cab0210157e773f07e86ed0d3452231c9966c6228e260d0869ad34f1dd3e1aa6eaebd14a871252351fbdd072b50d4a8242eb5c93fddf0fad17ed84bc98a889fb2c8d4e2fe0e6a2aa4665819a02c229d824261bb5032c184e3c1f84c3363b210b21e702dee6b5348e34f6ccbdaccc217e4c3b936e49a1ca21c2f5c8d1c42219e1f9efc6a57db1e2f475a51846d65cb107f87980992f7aff6e7fac1285fed98af9378f7f1e44d10275f6c0fd054e2a97f72340c1121b501340c3af6dee88e622c02ba348ff13d91277924bb13f1e77f80b388f592a82bb126ed2fd8e2fef64079587c098718adc8fa304542c380a2b9a0d0baeeff7d0559c9f8fd07e33038fdaea821f89157f1f7eea8215dbdee775dc7353adfeae6efb1ce327cd948de0094d786ce25907488d0f2b9656cfc40814ec0d68ba1bfe55de378b8532614c49be91fb27684edf100fb5b445f8ce8278f726c8060666a16cd80ea01d1fcfb0891a9c7bf3227855010a37e78c6a6c05ac9b90c3ad56de4edd63253fb9fcc1804a77628a5d8e2183362b8c0c8c3848bafc2497c6543a8320bd97f50f7d97c888b47cf71d394232a0f6b2554e439a1638f218695e764292115c262f9986694a966986b20713e807f2f6852287e1d2bdb653573cf5bac0af095ae129268c20b5732468b1bb66644db03ad9cb259a283d04750f962f6fe1931ce1c8c84c3ba01ec31e30725b66741da0a5953081cc6161780ca8001b7862eea72aaeddbd57c7d427ee6506ac7d855fe894e3c5aab4043d0dc15bcd0ba1ba45f5a928f42aff24e7a15588ae1ec46833d0fee8a5f89a7fe57fd048569d3a265c4923cd48d6f0c790b81424291b6cb478fd7de929f48596ac437a796d9c0318762672271b1bd0e99891591d40b8ec850913f76f3295bde953bf405934d38aa4bb2aca4219a5de834757770036faee79bda1249a3d775030c6e39533ddeecd170c35d28f9e29d11a685fd743bbcfced45dca8d726f91bafad5b891fa58387e3a86ae876b982183fe3eea5fc42f92af90eea89887cb65685325c7317ea05c254f3825e1fcae91fcd19fc9d07486a8599a675f728a1de546ae74dcc784fba61e80c7e4772425c6fa00b52cbecd3606e610c59ebe393fa7894e8d70e2bd4794f81926287d04537b92c3edc7888bf41092a51493f6ba344272ee5ac10040444a776210bac517b4f7bbe2a6012e8d95008f4af3b2a808dc0bc5890aee026d11b8381264659681c8e00a77cb8d805c0b976b66d7e443a082f99608e539f9e3bf685c601c2617b9a58642959423b9521ba98c9d06c356ea046f26f6a166adf5c4c91d8cf9b094e653e59a0a26fa1f28304e83e1c11439784136f9210aa14c9c9530081f1e61c1a218c065384c7c3355c41486791e1e7c2fd52cdd41cc428de8e2129e3bec0b1c5c36333032e072106440d7d6a81ca03c790510b79376c7e7aa5012680e3d5e33d1a31f522feb4bd9823d5a75162ed454a0f04b6920ea44bfb31648441a1ddeeb95275ea41f4b6783ba08c1d27735c6462114070431f7c8f50f6a6bd16502193a1b63582c1067b435105da467e22d74218e8bb118a985e243711e0a61bbf8f4cda42ebd07a7b1228874455f7b6206132d9d4e5d3b84a48442c9ce472901a7ceb6993a1304acb35e5e9e1462e710d606bff651c8c0c367fc4a622d2747c46bb15612d52ecb113b1f52ed460c62a83897b7146e5ad557d1233d48db65fd65a65d9b01306c227c12b84a7cba94cb47a1aae4d1cd263d554ec948e99a926fac8115ade054a581443d1e2d00e18c2e91d1e99179533684509c17deb71ae051705845c74e980a70d21154db9baf327fb3a9289091a195088b0741103c6317002a07fc23ca419af557dbb3600332e8a3ad20f4b6875e542cbb03b19cea938e6ca74fc21e3eca233eac84bfdcb694530251ada0ac920adf10944318cb0428b75325da055021e2084a39c8b8e7f80f3094a13935a64fae122b5713864507ce6dd9c9db4927d7be39d8eba35c14a1d5783f770cb0be318cbb8851e0d874f8ad5937b7504b9c1a3d0e1d994cf3e1a81c07007f9bd67785462ba0b9ab68a66127d6fd2ee29451945fd7cbd40eca4bb8e7e8582bad50a529c01bca0a31d81d42df534ca687109785ac7b2ce28c58ad9fcee40842053a081f6830559011c36181deee31c58b154c0802bd89e53e83190ee06bc1e12631764f82dde099a9100686f8fff0b03cf5831511c45b267440031fd7fb8f810874d7cbc02df1b82c3920188f78dc59a9837c51bb66a71c3537c95c3eb3260d4a30372af75e91c0ab170ff45f5b8c5c4869cea6899106a0b1ac0cfbcc28e626c11130ec6a489e49b3755102d96b32d2066881c6fd31560a467461ac0cad694ddf392bef9161013979a72104ac8a793cc7b996d95602c8b5e889c9a6f94334a592581f492fa63a51d20e1a024436650a7519ef5520c375f5d0905c7a4c62c5c66619dd8fc767f853f7e4de2a2bdd2168f83764843df51068180f8daa343536e5252491b146893e9f1a295ee6dd78c1b4efe6d99c9c2e10a92beebe5194df750af2c76452aaf026c91fab6585b28f13f35208028172433840289f6bd4314b1dc26458d6e301785058ccb6169e3569ef2efd88a70209f7e3acb85a9e54e10a12b7f5876726fb87eccc586a6f9351313120175977b59a47572c301ec9c3f68f6324f5b029b1ea4db4c8a675e45d982e1ba83787406e45ccddf6474206c3826231bf7542f88ee0e97bd86d6aef2a31ff58216b4a4750d16e92a6cc167096711e960bc12541c266c169c342e730b25f30596d83eaec2fb8d77c413dc2504281f1a80b9d417378bd0b0a35aeded999508304c8fc392862988d9e5d18abfcf36042526d75deb357b3bd7805d922dae7bbf0ec7f7ebc52526426efc7e988a5fa9889b8012164eeda59f55d000accf805035979b3b700de1d007f03e0dd0760970040f99d0fa09ab1f4d019913ae1def0bcafc38f33035b9fbc693661309d525a155fc60afa0fae85c4e6049dddf910776f8a4128a7b31242646875ca556f0ef835ab0bb7465122e810f17e73516b92ca178b72416516d358196ffa54c1ece38622f71cb483ec18611c25d5ca190730067fbf94bfc0159b700ea8c66d290b500b4882f28db1b3e2c0e48388e1710c5b0fe29bc33048a06488871aac8b38bea13054baae51a8f3390408bf9b24437906b7ecd0990f39f99c5755ed65114256d0c6325ddf03d63660b310de0ba1ba9a2b2a26035625bd396446094c628910a24ae2b1ee742a71f15aff81dded2816dd083ba916347c3f6216b4100a0b19d83e0c6d8c0ee7c8772a0b9b13e7b673b1aaed394040ddfd9526121cf8d2e8b4296d3c5a5600a180ce2cbc56f576d99e5f09f6ad1bb1d81f92bf229b2b7ec952fab435cb13d673abb7b42850627b49dd70974e0fbf98010294254990ae526d5b06aef7018df2c58dd10bcae134abbc45106aca026d2269d8ab52b6dc30a0eaf4e0a4441e1fa2ddbe6cb3cf579887d7970e2951b778ffe6071524af160a31a761730944b1f2a1c97f6c8c40601d96f6f0f1c360d5e9586604d9f0f835e3cca313abb1ff7ac903672b17c870a916ec35abaf6993f7367ead387e5c2af9a0d2f55e33f393516cb436dece496a15454c881af6292748fc6ca121cbe7cc2bc67ef2461bc19e4ebf669a2f642c50586bb4cd9053e7422a6b93e2da7f0248ed056e420cc353fdb9b6a609690f33593f6c27a205f5c008bee909d24f948a9796b9e2e1c416ee7e6de7348b3e1eb440862e824eab6193af2f390c0d9f36f8469a5f27ce064afac3250a64081868e1c722ab89d34b4b645349dd14d9938cf3813709a1ce67dab7e1516d3e83a05e2a2b3804cbe19989fc1a513b339020784441ff402db9195c890c9331b526e9162c490564220f1466ec0af4cb61f27a690a00dc740075d44a715fe97066346319e7dc06b822728a3bf64dc5eac37853527a2d68eded6aefe7200c96f7fa8dad3ddaaeacfae20851fa52682652209bb514e26a9fb23924370ae7c63b262b89a6bdd5d7049a047c28fd56f287d7a3523d26e15a54ccca8558899105470b0f174f29165321cf88205580cd88509f5f1a10bd9abaf11214c176bf2537143b5ba3e81811486495f055899f2d8ddf77ce37192bc5d52f5812ff0cdef95e26513275f0b8d476d76b1d8cbc3cb83c2fa2e81a36cf70459094862908115749865cf2b82298e4440c04f920eb9a547c262452d4953ac26e80c9ec6fa61b62b4ff3bbd15842517a28aa786aa6e8b6b937183ac5d08bec887aa8fcb17a64a5bc894fbb5160e836cc2dcdcbb3462d75b632368a167bd3d7ab011b843c4161bf8213596b1c13dc5d3a191aa84a9001bf639239c49283524a74bc2b5bf7fe05e2677a71317b0b5308d716491fb8297e2177589ed48f891a9a34d9b1c8d4e39cf9ca48c0d8ffa3223f6d0626a14b6aade73d01756c643b82baa2c9081366597746c41b4b4d8a30c4d8294254c78022439c92a4524dcacba89481eb84a1c114d3c7bd1aff257bf30d354f748eaf7135ef6023f9aff3b90a2a8d72e3a7783d6c80be418f4600be5ca72a0b664e813fe92714132367e8044c2e27c68605fb8077e9554a99fe3a9b55fff565329cb68964d886ddb1fba8e3d68f4cd5f842f112ffa17b0db2332e63821234e10db72d93d91bf3c31ad25705d25eb23acbbba424b8cd1ddcbe2e85d2153cc3503b92a6acfd9325c0a065b15fc6196a468b52d06749fe2cda01bd150cffb048bb1fc154e43e91c970c6d8513078b06244d2a6d57d29b837eecfa0f53cfdd7cb2849c30015848d3c7e0b1bda1ac85fcc959a148c094c46219aedbd82e3ef0b8854c4fd9395486f756ce19823e8f9d0cdd83a3bad9526bf63689e9faa31e4745f542fc46ceac734d82b2e5bd3ec21b42f466422c4aa799fed308d9cafe570a2f2dbd07309a90afd556dd5d824bf8256c4dc3ae0d8c927725c83796fd9aa790ea2bbae1e3de0dc58e541c5705a04ef59658315e3e263f7436ae9cd6664ea465ba522211c8c9787e78dc12f7e23570739ef468d3a38f65a5cacca2e332449a2edea38949a290bdec01d4af1801f85742bac115152d986d867f5175136f3f53bd822df0b6ef8f7a54cc618a1ae3560307f17d9ebb16aedf221b867ebc063f42a42c3a39f3b91f05f6126a3de2baae19ff1ff9ee35bd9d62161a42fc895236624c818bfee9dd2244597ae14064c80295d14aa2dac4564327ec46d2a07b77df83ad545ce0ae2a2afe672061315e914dc0a44aa4bb43da39a2f8c3d83ab0912eedde12ab3c471c8d6ec8cb48c137d911adf51e2038a1695e1919520f801ce1bafdaa127559a146e3bbfc89e857cc388cbae8312d304e98b466878ad95a58bc70f959b75c221702c13aebec99aab68096ad7c8dc955005b23bfcf0919cbaf5239f8eb40398f1656c7432090e3b7a32c4650dea5fbd170d440809cbd124236b5d1e5fbd396b3422b52fcd87b2956e1c442d665336741581bb369baea7811178a60818c10543eb13a64dbc7f2acfa25bf55ad2465821277602c8069a3249bcc02d4ac84f145b3941f6e63a5308fcbef52610055bb0611c96f8f335284c53a50786e376705d279240b8020c0062c910ed2a4eb4b8280fe10bec4e2d178bf8cbd33cfbad9fa48b510a687b8cc506922386bbf84c2927f30776c465613d15c5ec28e32182e01f27abf6cea73100c8c41926c501d392999bc113ce419a241dd11a0f1b55c0852fa82b224efcc2019bc4dfc34516fa9ad08f9e4903ee44e20e6bba1816e6b97157e9c0fd36fb0ac188e2f9671cb2af1efe777a9a7013af97a4e8ad8731ec2ff6d912da6f5c8cd6f6a528c2a327e48629b5147941b9953227fe4b6ad62114d8f178208496c89143322597693a6520caf903d35e8a44bd08dc84c9c003f70c8b333d887087b870fa21177e889fdc108fb15b0815c345f86090f5fac842cd4a68cf1596cbd643cc07afa021738f6056f913234034cd1945f186063b8a826aee607353b4f0e0df7d02d06620ff2041e9e4e30b2d866f7a449ee123d8c4c5e6758b3739c6c98f410949df426d34091132a2cb2897a70a6d2eb15cf65bc7ed8768de946125e53bcad55043a1374f790cf6221cf08dc0f96a4476c89143bb24391c0195ec6eac06ae623a6ba9ae31b99df6ff2d3865be689306cb002969ba59260674dd95dea78c808043399af426a1a050def6154a37500b19b08224ac4f6c1ec7eacaeb32a4936a421616364794b67c12250d0597544fcfe5387258bc8a1d0587d3a8e20cf17d0eab36bf0f3ffb3d2c36b677364d73cfa2a25e5a825fbcae5f6f37b5ec90f4f7482ee0dabd2e1a46188e1103dbeaa9ad5efea211f2ed4efe5371b32b5d62c51a42a76a3109d4552a7a797addfd1b3b7d2a8a0493c8628c1757001ea983c0338d399b8e28a55573268673a9b35d146a8f2f200e2fd9932f5b2547f3232b626e18cc1e1b35eb2a7d900018920a0cd5bac10a10032770f8bc476da362c7aa2646fb1bcd8574a62661cabfd2c775d223485ff790e3e28b60ea1857066a428c43359bf91da8bc1b825c974b8389549c1110a1ed335a5150986b0182b74fcc58f607bf7102055724112de0187139f560754107555af1f5bfb395499039f3685b45d6dc60d344d88b7a0ca508738c42ed4f7038613b1688c3cd54b59323136c6a9de7d575f30258e81da35fcedeb13ce45bedfd3daa4a8074a766feb4792a435654f9f9e73a000c113b905b9cb56d4f6d193cb34f93324e0717a790618e6f58b33a12bdcc4104de19851e3d9d9e46c0eec98794bce065366f51ed30e69c68ba7499a62b2547921225423b590fbe74b855650c467746584c48f7759f50f6bac62830a31f801dbcd65b2877fd3190c877137b4c72c5d3b6480805ef487e020b0a865e90cbb78de09081b8ead08a5d76e0751e1e9a8010387cd04fbae105a989f4bcec53a584f5efe5ec9892169964bde564c41002ea98700982c2d1be67a01481c5d5e757a12f46cfd3a7998738a519ef837469ef799da6cba0e2508db8606a4c0a987a22d6312e1344c3e2451b269df38f284a56648025b4485a2a118c07619ce858d7712c664b6a2205632fd12e8b1178dc6323a588edc28acae1794f501ec20056ad17bd1204bc28ac5af78563bb4ab9c68c374dcee2088cc47236f4939838fb3e671beba769eb941d250f9c70ad64a05340849635236a64d6e07974bc89d3498a8d1103936774b8fb869ac7e18288071824d866954c1c107541a247103a83e3982250e5583e533083291bec519b40337377116ab77bf4a1ad1a752ca118128d6d4b971af097a2dc38fb19c589a2d2a864dd391eaa925ba1de105a50db517e4005bcfd9d0ad02838eae122dc0239295d65ac26d3db3da8d45c0a1788db9efb953719d5baeb682ba36c513cfeadd7d998f8b8167f35550bf8f60e307feb0b14238c61916c5ce1aa6d9ea205728991b4425554e1f9e6bf5617f27f1c3bb756223a02ab1247fa1b1e04918e761698c1d71638551e49099c69cc7a985b18cc30d75a4465b08b492748b1ac17c2297eebd287fb1b2cb26687780eb8216cd987cc00660771331f5b218cbbf7dfc03c137132296857fb53c5b9120d747069c6f20280054e927631428c9f3af5a3a6d40d4aaa5c9da3b3cc3450f0ea24d173424503cc84ca7119d69f196cf5a129efac544028a45522877cf882fdcf7726ef7967521f1380930607c4ab5c172d7b6e0c22d65a80c2c862cb37069cb6fd69f6d15d68472f69b5ea5331f85a8e17703c63ca2b38c5c25fba37405f7b3ec93ae966a5d3c5954fe1b89b3dbaf475916ae17d90d8152a79cb3d31f578e98856b1370224a38e0c613fce13975fd88f731b49ba9c1fc2652bca7810683afe1a25be30875947ab5da1ae52c6ceedc9212fc291b029bd4f8bc5100d2bbb067dbe0150980e534dc26594b85c538dcb97306e6a0f0c92848660ff9ba1655f0737f617c1177353c4dae81ca9a9bb813dfe6549168c529e37f1da5e1ea633e53ca99e2af3d1378aa969d876d82aa815c179431831fe7766297ccea38de1630c9d4f5b1e63b443d029c93332c065cb4ee5f90c670d90b2d2334826c59b88f5805808822d282b60d99e47153b6137c89cf752888b9e3189610acfd3d2e9c93ef6b544773a8047292654d8c281541e46ef355bab89482af25aaa60593e2ed619655e9887f375a528469515af9c18e997efc12fce5059fa677c82ab86aca4a611ad8e0e5c7c5519d7f7e6c7302ef6f5daf55802de82d3519838ae9f95c1f9527b8591709541f4cc4487cf934e5fb2d15d1f25eabf58320dc359ce490a766922250ea7192d765a4ea849ef252ee0a56e685bf618dd62b07d43f696255c315798aff64e635a6b3bb34e857485f39c5c016a5e13799b8c62ab2c637e25d2ef0d3c5e140f590c7f2517688b7491909a84410ba1c98cdb943eb1f3de23163f505c069820771cf73138f49b0e1f29366f0f7793dfb33df460a2aad65198e75a89eea299f1b3f9de986c0ea51efcf1792d1a5a4017f6cf00da4602292ecbc46d627bef4be41707bd8dea4870d1ec458531383c865e3f91b62e9e4237f033482efee1eec2db0c241b0160f01ec65850269572b28baf3ff047b1a94e9b354a9445b7138a81631f5524f6a9112656d40166662a44f6c382eaa836289004f5cfcecf97b3f2b6b328c572f58ee1a617dc2beb8418ec040d5017d36a5f13c567086d946496e6413ca6f97d65be3f5f447082e4b25cac19c0a53dbb72c3fb51b2033a9213c9271bfdafe8561ebbbac6ecf6d1b9f697f8431d14273008faa9255a179a6342a173b4fdaed5ed30197fea0462100feb11f88e2dd14eb1c52ec2aa2290937029fc24e4c545b621c86413c1b7fff554821709ecb548d67784052f5dc43a2bee9a6a02fc48eb857dac476289219d605d68a8d41b330aea18bd7fa342481a53bae5fdd451d8227da74af424822dc454a89ccdf009ddf448c4a2b7167e74ea22c364d36ca36a497d33de403d3966cd4afc94d6e0bddaba1ba0ca1b77c1a42c5f287711b40683087347f2a0be0af35cf90b8c007f4215bade2331aa093d298eb4ccd934d3d88677274d526f3796b1bbcc50e6a2e5cac0c32de439ac9ca77660be96c3231464956ad65e0943ed02adb7952ddaa269b0fe9d6f32186997a00470b0337b4e4fa087ada0112d48abecbdff7158984a3f77b9448375b202596665921eb02c3a4697670d648c82c4d426e61b7edde2dfd28961efed9a9853020b8e7200796b8360fe6a93503e77eae96c2875e194ac03124afc49b7a484bd1762892ca18f1e505781f281da838318c8e6aa1fd44da9c2541737bd560690ded1f17824f64df9ed4eb99ca733d42a82af08fd809e8ea672ca7a1823514a7c6e0c257316b72d1b54cb60cd2ad75178b9895fde8e420cca9af261310acbf120c08507b96419aa4f2f917e4d6546c026963af8daa4fb264135f726e179fa5dab739f825ccb669c2a3cf376a76f0a188caa3066113e693b7355aebef11eb3357449415ce592aa42076755c31abc6d88ff063529a46b614606b6a927136f98d2c041b30c00908682184fb0230339ccaa5dd31868f7019a90539758c3ed15e1569e6b78ad340bc4b57452d4dcf90feffd1f1eed56a41fe49a1e35081990fe9a837e43015084ce5aff35ea7aa7c8a25970ed0a2553209e86c2b507cb386ec49a423fa54d9969c74b25dc927a0f7052706f26c0d344eb9cabd01f63d9bee2d3ff80d354ea1ceed5ed2d43f534abdb4bc9665a41ad45e8f967cac23b43cf649b60972afc2918b2a7ee94d3a1954c59f18931d7e60f72a2d1b93b1c1359b7dd30aec03926deb7a5986299d18482f50e0778cd1225bb3b177b18a78dac3c1378450d219131821e8e58a3896f84353ed93742c51659184bd992f890e09da854c3b5d605a2bc78be99806ed6a7e688c89f4fd8b51931592a38c887cb37fb0628f9d20f81c86ff6440ca159e24b634e0147510a6664c3fc0528929db031b391e219a35a3daad1949f9476233fc9b7210fc4d27419b8672b218d0e57d7752cfa4eda0acfe2581527ec9f32347284ade77a51959d70ad4530f1723033f7566246a6b842400643a850002bf01852e341d0acf2930f02f78f8e5befcd3ce4392909f80bc19e83f05f038014f0444103fda9e356b9a2710f7836c523b71b998e28e1f1e5b68c473ea4c4258f9aa2096455f58d3c7db04db78b49cdfa6f8031191ce6d4f8c1944ff2ae121c087559131207aeec22eb0b258a5df397aae220296f47642fc2ebff0724152acafbb4cfc2c4a443b1841570034ba24308737ec72a106624cf5f7afa1bd2556b31f95f04d1f474f8f8a390f2e92b8f3bd5a40200dc6ca05e596a9017269874e9c813fdeb80f40e5a963937b7a63f6b62150cbc73da5606d8978581e25cccc729277855382b71a8292056f8bba464e6094a20bac5d92fee7f61165de7c791316176929fd3b5d4cf9b2e774057a97be4b99eebb9e0ca6aeed7cfd2021b3c3680f203f6318794afa313826629e0fe6dedc4bc249420170f5eed2ddc84fcbb590be25cbd1367d156cc610b62623ec034c7fbe917d6e63e9ffdc9f123c2ff3a27c7409b04ce15602bdf6432fc20f27abc5c9c14ea7bf33baf11b196aacc5dec97e33e1abf6c3c2897abcc68ac2c66a88b69b0cb538ba46ac6820d6faf468902355388f90ba12e83c21dbb6b15a22b5d9a226569fb808c38f1dc9c10691a39ff6ea3eb32584091eed20ffac2d88ab628b008556e44851833c84b1cf5a789e04183e4fa0971556c09861a316923dea520918c6c0946b7f2437eb64cd9c5991a785945a539851beaa324ab37829d10e588af087efdc6c74663975434e672a9301e0b24c82bd9edeeed60488e498f58260f4734512e817c4013146674768130322efc4b0054d0b7f4a46763b72d629e28f2f61b35bb22eb7318536461adb180f00250155c51a0360e8bd3de2f22a4c17d23d3d472f00dc35d6a3779fdc62c626d07f30f8a0e0650c37eeccd23e9532d448b9c590e7705feab2deb0ad42295a7dfdedd7ed27e69312743541da1d5c5c99da32ba4c94081c1e01b95448b2928f9d5d99879a285e502d05d98b633cb4a626bc051b1809e5d1b54ed5260c4a790ce9b257843e5264be459a439fda4a286f0faf0320c07cc6ebf0bb84054d0fa1c4ef968d8a6f0395d5ad4888142c2a3c6259fb0c2c3fe502545965caaaf2c926cc1dde1ffc3927496df44bbd721a2bda89fa49602e8b74b42c83a95fa400df454a882ca720c0320faf5cb2d6a9daf824920704ba8b7f7f6a5ccc4f0becc54a765e989efb0f437745975b947c024647481a232ee60806091c9b2760c2e0246f1b90e316c011857e4d8663da3f983ee63cc7a07c9dae119b889293c6abd643894f41e338a10ddd2389df2d898c20b3c42dd8cbd54a2cced1343b9454b7a30915a295342afc711f9e6198721e04d5237d2d367803722ff31a6c9c6d68f5a2fbc41d2631e36a926c2cc5bead6d40063ab4de06f7612d1115be88662b078deae5dcbcfacc0507aa4021fdc5a7f79e40556f78c7868f2f0d24874042e052b58a2c1432d08fd97a385ca92defca75096949624e401e563e93c0f8679dcf954d8904df3ee383ba29e9ea99cf2e189ac253999b465ccd99d17003caab4706c02d38e70172998a25296fb097a127d990cbd7a64065aa4aabe14d896ab79d36fe6fc38c28ae6cd1c448a1e6c5133a181022d83eea257ff79b8f65703e732054015a341d9056b10f5c150d881917f1f170e07eeeec791e79c9f974ceba072f4ecd89a202ba9ac97b38f96dcea5f49542776d8dced2c0af55955fff752b0d224cdb01ddcc02b0144214fb67ec65e4f2f158edaad13fb545e24c526b3debec4505cbf95294765b223a1f772f91c375e9347cedc9b9e6a31000a5c8cab9dab0945901d458ec78afb17a83bdd52422b8dec963906e9ae15a4f088b7e92e935c263e7cd20c8fa011c5c9bc1b311b281bf6d7479aeae20f97902629510b96b762e19df7888b7c80d0bab1552a194b800ab8b071cf1da0249337f75a7b7a503a1441bfd0703c0d88283319c0e6885f1fe262a53d8e8f5fdb0b58c5f9f2204e0b9c22aef8afd396221dd2e3ac84fb71b1f60899e6c1c54581cc56c56d09c9848cd6e5b7edf197950a73a759b6b315f8522f87156c1d74ea1bb5b4f6059f6392e34817feed4fcdf12c42742fd81897f9fe4508bff016486a6efe2ada0f0cddfb3b3de86ee5a8dd59112039bdcb415b34a905353375cb2256ed7e891254cb63072049819ddb92e5d1bb8cbc37e8f41980c6212be741d7ad0292251084956849ec621d2587213c852a8b2db65da8569bae1da4f753e4fba16fafa0269b145209f5be9205867d1b85c996286ca1e734382e9448ea5d648ecb800a890efaf44aeae4def1f4443536aded1e6beac88d1577953756ad00b0eb257370a2efcba1d1e63a939a8bb8e9213edd6cc5c777d7751fcd76ed521629852dfb77f5460322153175ef88ed0c1d7c9fc045812a6e38f06991b2560419008b89e1261c43f503beb4f0893e5901b01e41e95ed881734231e3114f4b9080f89a3e87d87f010f2f9e021fdc9c14394a3c143351428c0157a94ace8f21cc0d60544a16d40b41ec1430ef4768210e52932437ce7d00d555636b79299b292a14330dd21367abc0c8617df4e936e291e87962d1cff6441c9c8bff85a5a56190f6e6cd9cd9e83f3a65c039bc915322b17061d77703ce5b88f25c527de7b6a83c3cb350fdb6103253351695645dd8390cf0e035795aa5d5975c843fc8acc2cb7442ae5d2c94f537a0e6c2aaeaceafc27e6a5715e907f9c5cef4906bae95d68b86367fdefdef193fcb82da8906f379f8330229c9f2df716e6f7f2604941dbafbecfea0188f9231ed44c5c29bab93c58d67fd259f9d4ae47558569be3827db2bf3cc643085d79d1ce0fa4bc4c17cf38bce77caf5084f4f93869243636f53ef4f729f40e1b48c8455340b3b54d476c8c811f1836dec15dcdb8f82d4adfbc9c9bebbefdc3141e502b2da166a75e484972fa5c212e69af64f9a5722aa23217038e6b25b8bb75573b4c70de37087fee00a2574540af19c60056463c52ba240103e6daf65cf535aa504609097a099b9d6f6b64a2a7649cf7c40d3a1ae7ea8a0ef03812305024f35932775ee1d91d3346972363752ef2ee9cbdd2ae49180641f0c56bdbe36b13804b861289886d29a7747703da24de1180d6c39e53c02f25ee15eacf38d82a112018581a41e719acbeb4407c8e442b6fc09ed2d45b21f78d2c3f849bd47cff55c787108b48c273d2fdea3af3fd458d0f07d1f9631ea02243f9e9d63943e6f191edc234053a06de797d87ce6663df4c155b5f379ddf3b9a16eb1b9fbd1a143a52a97aec758cae016c5f08035dcacf6284070d29393513d5842b9c31a9c7e37ebfd689c16e1b3a53e21537bc4777b5ba9f0efa04abc5e8bb4f75a3b3801580169bf9223652cf9fb0473cdb4476df832773238f480349300a31a8c73ff475d14c8e56939d4422ffc388235527a1e990abc6762701ab2f2edcdf9ca7dcf2808558d49190aade3662ac8f1d4c851f567ab9fa09f075a7f031f8595ea25fede0d3156213fac145ddf0e55bd867426cb486bdcda0952ada5f56146cc80b3723d29adaebec2861bc342f2c92f27391d9781d6b46e8c3ee15eefa1b3f8bdbd0e2060f34a276cb5249e384d4244cabbe85543333cb88f12fad0268f8f8b92bd11465417882e1a3bbfa4a609deebd6084526257b086c4d44c996722cef1492f2454cd06f960e31004e1aa8e4892304ee86ffc742a5390c9b5935f25a652e176962f69a5616810c2322d841e19845d6b0f0769e8e1095bceba2828f7d0c3605579314c1bc4430c712e2567668ed9c0d3edc10c9c04393ef1994e892bdcc8639b21aff733f29ad307d6fc2adfbc1353bef16d8da0dcda9f467d8469bf2c14c448a455faa6c1b11760cbae948faff1a51fe72357d4442a4b3fe6820bdaea90f91573c7739af2bf51ebc9c4f5ccdb394f354a94fcf62301b8edff108b4a4c695911a01191f86590896e97718581ae4d05cf2881f93c75b3018fc7069493f8d4555f8b8307d372a1f17f3d000a9051de20c85682c1335a2103305bf412c92bb44f25a1192a1e331927ea7519c79f000f133cf5c48f873acacad613468a177cd006dc34be1627194c4a880979bbdf1806305fc3162fe868e767ada150ec3c6f4e08941b3c56e62c6f8c7969318f1dc31027b0521f189f689c6185f043774617fc3b14b6a0383f1131ab0b6c1734f8327a335b46ec61fb8ea88481f52ba7402327825316681093b006e1210c35f5d2ea8417e7b62d36156367e4930415adbe6a2d8cac4fad6e52867af6de0ac099e5ba6af80c2341770e3db015f02fa463432eaf4a383988b25164ec9bde9a14fe15f125866fd019f0552a196d11ee24116360bf2f5d2a811d511c40070e72bb39a8fb2ed67392eca828a4f4e59be699a8de5dd5097dfc350d9d5ca0d0f9c2c7a763ac6026303b393a579d6904e3a2c3cd4ed549f7bbae16987fc3a04c0c74b432c8caf06df86c4420d7de25a08b4ee194638065d0f79d8dae92b6af2fea6bf2f8b10559787a3b414fa56c93503a2c0b79170176e1d1e6d4284e0f91086cf75970303c133913ae37b31ed491dd0e6329f27a529bcb775152414a26efa170a269fc2f44e9b1a3c1146b8f1c881c6e301583d404423cba3360c6d0dee56eef84a6c1e189d2b76d7f45f48ac3939fdae1a60e5fbec52ad1240c85947ac04df934ed541a5702376122f628df84c4c3462fe6aaf93e3bfb7dacaa9843e0dbecfd0c51045d9a0c13f37f92af44cc2a1d964aaea28efe313b8c4f0bcaf16f16762b7a8d0dc495b583385821bb9bc86594801acf63f56ecbdac5e0b0b6a4018a941782cdc54f3db435c1f2a4a6cbd6ba294356f9341921b9be5b67de44654f0f07cde28a654db30904426e03a166ca724e19ced33acf2cf579c7467b4f8e51c62a8aaf12fc87741835c797a7eba9f212287a789bb41d7c4c8c18b70e7aaf57f4f69ced9e314cabb08cdbce04b054dd417bd963645e031d15a0d570f00ce8add1153901262cc63d3641ef72a9457967c16e90d7fe6a8a9635c02011d91f3fe5ffa85cc7ef925a4e3e2c4b140088420eeff595587572c4693c459c5d7fe3bb7fc2abb0b837c742d8008588f4dd5ee95abf4e4235eace2d3551b9a5d0d83f1f81b778d6072cca3bb1d31ddd321fa7f5b7659422a06147a6999928b53f9b1647f0d2cdddfaa616fd22dadb9aed39e39d0fe6afbafc91e8aea9d90da754bafe876b8d09aed1d34b236a5644bab6e523c13e1fb8f1035604d4688f7cfa72901186157ce1fac2cde7a0bd56621190ca61e4f8f3119128e0f44275bc9d759dc63c7c3b033120934d36179cd2c955f2c0f14967be990d968814cef6b4998701954702f6967593abf27d5f7add54615331753b6b73707053348287138b28d6067d13cd3e7402c258fa19bdfbd0ac5d010981d8c2c4d02fc591bd9b3a2c004ff175ed212906f6cdcdca14d631987551cdb0cc3cde932a4ccfff0245b6f9e1b6aa0087a0a8f87761b0a7b1dc189f45ff11c46bab1c6079fb81a9cddeb19d525531d00954e30b2592ce41c74f2bb268fed3064363da5d947a3ff761cc8e40519feff7dbdf4ea6775ff44bb4285e8953406cba9abfb17b6a58a45a4600afead1abb2faa66bb287ae536c1c1889e932e17dba8b39ff3d5d853dc4b16ec9bd16b8dd6e6a802f037c8ce966e97f7579f9c038a1e662b79ddf5d8a6118de4b858a07162699932986ae8d99d682c411e57dd616153a13d6a28d993404ee2b8daff4d143a101eba5515bd12edc88c4fb1a4e319e4e56849a7b5cb90bf280d123d48b53ff2bff4110d2fe9cafb3e919f291d856afb8111b044fd1d55a6fc9bfa5835dbcff3701b98e2745b9e104a1da7f3651b3794bc839eff962d5b7179e5c3652de0b0646b2aff13711b1ba659420c39ec6b5d54fb8f319d4c28a7f29dc9dc5cb1d075bde5059ddfd206460aae70648f9be114bfe91db115935d3b299747e28333964a2e393240a12eb697e41d91f87fe0f39b8467760720b512cd32862b26368ad616587e318a67357b716624271cd5128dc168ed99aa9e6f2f81273eb3e80ec9cefb3a3b028ef90de3e7737e5b7a4fe89416ad8493ea72d3b5f5ba3a182c11ac8dc17e88fe2ae34cb64637e996b3aad66f5912970e20136624b0456c533b491e15580a05d165ad242e2b9ffe7bdfc3d1018af45db64d8bc578284b035688bd9bedda808c67fb6060a7d7e80ec29c895e75da1eee043d97e6f14f60b6f64ab090273226bbd40c606e507e4fed9522c826b78f08218ebee0c680e13923c7ed1a87e0e19a229c7ccff9a05034b5f4efd363d53b9516ad34ae506381fa0620fdf895137c457713f422d5e3eb609eb1bae04ddabf3792ae4bda4d8981994156e35e03f7a32b73f27fd92e58fb499bb5a87598eaf8dfc9b3769df62608599b0faf07ba7ebfafa2308e738213c27d5633c1b0023b56a7598236b2c2784a04f7c23dc6e22623488923cd907d454c1903472138842cc64af181a0ecb118aba6e907da4ae2dca78e3b30787781fb6f16e84b89de42eb802a01a21fbba8d9eaa239074ad8f1420f6bbf6ce437f4b874bea84cb42c386c4980026c471769abc7ba26b10a622c3083b7cea18f5689bfffb6c8ece418160c1cecdf1d7b6aed8ef29d2d3cd5fc83921da4be20557a4aead77a2031727a955207d5e3f239b341db951a54aacf20798629638d18031218d492bb20e1a3594b34eb9aefd46ac69624909086b90d85db56c13ed67f89299dffd9ab4af3f0919c7efb368232cce4046b680cc50e683a8da7366e08f9c352f14985117ec3996530093982cc2e883314e4c4de59a02d9aa2b66ca7f635e5adeb74014d8e1b96d82f2668317af601376d56682f78fe7200f45a2c9f40b6c19d8815c14d0fd53f286e2d354953df50a364f7de563a256b8d031b210068ac1b305c3ff041c2873f520e6771b0d6571c44a68a037d290e90cbdb197a25cbe243addc68a66fa628d72d2bd807f71223410955bbf5c344cdb43492de7f3714f26ebcff26673098fb125b2326f870a50b44449edbf0e69e0fd19e16520bb51048d2aef6171b2e21e61b462f9fb22b3f63d376eb9687d6d3221c17e67e8b491adc8a2a0306d5c4a7c3b136483f6df900b9e2065e89f17d33e8a29923f5291a51868b88b8478765bd5bcab474a7ee92c0af34b76e4b7bb680936914ebeaae64d705d49c648b50d0b64f90f656968ca7f06954707db8fb073393a7c68d6e6a96771d969246ba4893a924389ffb85f71b5492b8c13943c3e1efbbc79b9341bbaeb01fc0dde58beaf271140e61cf47d7e50a81621330dfcc2c6505dc614cfdac32fa702694ae02780a8158f60aaddd1152a78e2154dab37fe93eab02256b3eadd099aefc66b1225b1a829617ef086c95a082c096ab31265ff1939d2a1b553e206fb77bfe0f36815fb069f5505df09efb66652107056a5174e83340f146a95adcef67d193629b92a85ce41349b62829181366d5955dfa049a40b91353ed857d49cca9a44a99c0d4fecdc144952588aa7a4260b7053417387bd6e6d5620b4b7c68d6f08334f18876169ead4e17aabfc0585c81c92ae0ff23cd056b72cefcd21b13928b0ea9d46b7eea6a324d2c56729a022c136ad8e89a1735c6733613fe69fa62f677028c86142f04c3f1ba15eed49b2eef483cd65d90685490c152e2612969d0126a7f036c676377188a9aa10ea54c955e16891728208fd3d0e5b0fc7dd52b4baa255fa6fd25a6812a1e6f4c710235f5660552bdb63e91ebaf631f86657dc0072c3817def1b1c552dda0cca79a612548f2c60a953f360e0dcab84f90d31950a664c6cea0ccd3a15ef58fe5f48ada893f67c5c3a0ccbb818a2191c4878684e89d924507c64e250f6b3256401fe718cdc5306714ab773648f9b5c46307d7b6ca363471b488975ddf7bf53c567d78020cac83e95232b40170a4ac3a925986acdadef91af59d6a51ac5d0e6069c44c10c1a7d2cd39c602dd8a82dce84ef82d2265e2d5d507d73de2e700f6db2c1ec74964a0d5643282a99ee8f4cfae0a0febdd2346f749338763e387c7a9c5e2f3a67a34a9f075bd1640858234d1a4f001f590a90cf32047d51bf0ecbc5acb907532ddf432e367e61447a6702644cfbf808586cd270c2454b81053f30043b9c465273f71048d901b462559308bda5670e7b7546072d09988da4fda82c71c1fa7aacfaec7c51a65b47bade117c31ecd2798888c369d847affdb10f089017c74bc15091ab3791cb318198cf401ec995fd94ccdbc65858e044c277a78cefd18ce4342901574efa08af136301f85c10e34b62ccf07f61c4e8b26e3ce3dcaec74e9e0cf76a9f37c22ce380d46ea6afeb1eb6fe9655c4e46ef95ec6cd82bb9b7243d59153b22098e20e2c794a39b15de5102cebe539ea29163555ceb27296b9148964c88b96df1a41e3f89153748e8f01186596dcf4c11518712fc4aa0b42bd7140aa7d11fe199384ea9b1e3bce03b897ccc4bcc5fc7227340f0d395d2bc3a3958416d98e24f072b0eaaa01668c2104b674e3cc7e401159543bac42ca796eecf702c3e5a99fdd332a514cd0cc8d0203e1802dfb56c6375f0feba14d15e14766219530f5f9f1302a513ced124538fbaff0f8cd15aa4cbcc48a1281aaf9a93167282c19878b136c7369f670f8eee00bd91234d0e5903613dea67835a84d83c066b84bde219c5b67ef80d315cccdacb8ab5b10164f4245963294beaa4afbc1f7481d27fdbcab9c55aeafaf792e40383aad6a6d1d9adf74df6ec34829ce3b4fe719e6f0b900b568c1d37e17487f4638aa82dbdbfd99ee53b226a5ca64bf3a72b55f141397531553053807b63f14f5c02f331acc8cebcb3aae70e3a6e318d08123840c42f20ccaa348c508dbc828865ae70b012e62893de103b6d71a8975a07ade819303bb8282891a57935ba7b8ef8d5998ba89006cb2b808c3e740b102a3f99ae270b5ab5d13c0b3c99ccb4303e4cf48491a5629172410c36ee3652183ab8167f7745bf78040423d61a5e523c6715f23049c53c412699e1b3586b9cf785282d620c67e67abcf074f3f730057dfe412537df5406868cb44f5709849ad236fd47ac2158355233d7b477214bbed003d2e1ba9fdc8d17fdd4400c0cb5f22fb763f3240b54ca9a2f87a5ca3932e8e8e44606abe5364165f3ff987939736678913f2f8af47e6f31162dbd9044151947044a7f5470093fea5a04259db7968a5c2e667412747d9fc5f78161ca870c130d3696a4ab7be5348277bc98340b91d9fe1a84043b5b4acf20fd8f682959cf6007fb41d34ede3e268f999aab106998ebb51fe5bf61e984999cab7fcad9e9229effb34021267fcf83489eca75222179e82f9840f3facb4f1e7a95e5e923d4e1bba69cab919c148668891ab354f333524d7d259f76a2d7d08b2d1813fc64e724e74431f44788a8242b7c5e58d67339379dd0c5bc5c1b104bb54a76a64edaa5d33d43dfc5e68cf8b54c64dd3171583b42d2db612f5de32bbe0d912cb5fe763a0f70615c0892a0440a6236666263f412b473c8526130b13ed762e05ebdfd334b14e9a8bcc9e688519ec3cee23e9052d8dbd22eda205043ea2e1cf5dcda3de0c8081e202f4a918b74180dcab91733731a26f0e07430c14e51fe98805d79b8f31ea672a8d38ee7506156a24c184df6cb5ff4963c1e3ca1eb4703cc9ad995d7a60857941fbe5a75194bde9641bb7ede873502ddfeb55c21f75bd4e1eae2d970f03fb0bd86b787eabd547b0c3d088f1dc61e99371646c71ccef0135bd3d47245993e437bb50cd3b3c5fd1226eaddfe338e8b2c2a3f7e62343128815954683eefdef7d46feae0d1e04be28c72089aeb9bf1c774b10c66ee8d13cc8daa96c0d8bd10700e04bd71a03ba827db9964c4b095f0c9dce7366e59e2574e281cb9d2fa640ef7714d4e78bf2387e9d85764303414525ba38525fa5a18d604792fdd72b567a43de18cd9a7bdcce4c641d174a82445256e5343b64d7634231644f491c6c8705b13a96fa232cb9c647b30efc675a496abed20338e27f5d8fa9fd2ac251c7861c5a8edaa71da9154138338b63a45c04187c473b03d128b0e27d637fe1d9b46910393be99985043c933ec4e0ac9bf69374394506b21719468e21f90f40f952704ac01307f5b66f94c030a8838fc22dff22d93c84fa582cad1c6b43f59f178267683e10d7d1d32676a1d2feb5aa2ee32ffa74138a38bf90e2912b7e3bf16493c341141ba0acde8e0bcef447e30efd9cedbec1ce7c0722487fd3cf95d5f1a989fa3bf9ce5c1c130f22367f783f1d443c4ccef7f3e87e87b422b9b490c5834f89ee91eea7110e5ba164821fa9380911ac05238d47dcf70ba859ae3de007950b59a118b3fe961039c30ca6dc0c1093860e5e9b5bbf80be3012071129f5432fc9b9703d7047aed5b4a606c10b2998a3a0ec64a98031c0f8c16c690355778768fda5c7a83dd0e375f832c2ad0c100ef7d418199e44136ee8d8aafb11cdd3b6eb1d8aee009891c365c19a0e4b4b940702d8ae14fe15575850b5cb52ca46d3341dfa09d6dee48d84262b2f6eb4d889fb006b677eaab0e756c5eba43fa7b1b6fc379af8d7408d0fd4b67bcef3f255460aedf77823abf33a5d76cd7a543617968de717c8da8ccdeeb780f5ef406f72f73626d7a825ed6491826dae80c2c4fc5de8c668ffaacf33364b8e2fce426a46b053d63c72ddcb2719eb0b7a616a5e8232f00c8bec022173c0b9d079190427bdf39a0937f8620d57a09bb3a145ef21a31cc50ee3904667ea309ae1a53fbb97188ee0a3558479d42900286f04f0175202f4fd67150f24e5fba4047d377cb9d0701ba7b82f878f831c83a1425dc6a8280fa2f44ae98e313b9ea33be47f0bc9ae857a771c1013cdb0b3b25a660de32f205fca12ca6af1fd45555aa08d86be255761b985186a205eea9a00adc7b2b8e15406b09aea7c56437af90716de7c6c0cb52a0f12f8b7c9051b0bd8c9cdf4519d81919ac40028d161f65ae1c15b453ca124d15eca45053b3347ede7705958ae89afcd1a1cdf59f8ff968494e718ff06c2729af74820f7dcaa122b15847f093f1546a3213213793aa45eb65f61a8c4627f8ddad33eaaed0d6778f86921156bef86558d0628e8375b9d6b0471d7f5232a9598aef90bdc7403088b68eebee8e8c759df23a2c8fb085350921ca6e63401e2af6cc4248afb96a83d54da0c5cc798c55561dae52af246ffd774ace5b4608774a282cbdbf26eb901091730f27f7dd4ba60a6affb84bb2aa31e8a1ccc6ba3f0af8f9b1dcdc16986a4f16d4403bfdd76e4817ec3a815c146b0217f8fa1cea0a35dfaa4c5ec6dcb04c2185d539733bf2bdf7745d93fc110a187c199d9a3647eeb4b3af8cb99ef1b21d46dea830ad4c399953a25e940b7515febb8b7f8bb6869c7d6a1bac37c0c8d1ed55406ab08fe12153f79fa1983a132775c7514e779edc3bc8607e6612f42df9ad27cc2da5a32b2ef1668207c09a251296b445fad5d24e4871a2da4d6f33f26899bdabea1a7015ac02953c75006215e45c281097b54cd46634b18dcfe7cc7760823509fee0c52a8d8bc0124eb9588514d9888084a978c5bbedf53e3e76b4287e241bad64d983f7625fa90b3a43e76d4d4e7f6d98db404c38271520360f0d43bc96bd69113465054f0af6cd632facf119860f97c1877cec6b1fc141f0af094e2fd60c782cb2dc128a6402199829f1e72a86b20fbd740edcbb22d630f17d4ca36337a9b4147abaa73c15d8cef47093b126c5eb0d5c4c9496aec26da27a818576c1f2dc1456ad078c5f299675692b9812245e4901e54944a02a479c34da31e1e17610b84e991e8009dbcaa27526260839a60da4624c9bd71cc328a658c001b1a5b07314c929be9c0134d7f378ae1a11888467a24c962ad452c8b574b0558c1cdb63f9fdc0849e69416ca828b24b12e6239cb0cc02fba2d6d7d4cd7d6fa7d3b6b3295d89fc4bbfcfc7a03daa2ed4e9d01069162a9a3c252d1ce019487cd4fa5da6150967359ed72f732ea9a82e768f5bd97bdae88864f0515e85ff28b83e7b477d644b3233a29461560f46aa15b7ba3ff366fd5f01d67222cb0a18eefe686605d98ab1d60f1d927bb21a9c80777d937cff0a2aac3cd2b6aba9bc11dfb30423540e41a9e2a263f3eb66959df403e3e22a89c43e7bde56935f4071a548b7896a56e6f07597c4f628c0b329904144c080b927e774d5095ddb28a93e68e32074e944f137786849d3d1f7d075cd3e967606157a178d1c4fbf5941bc50eedf039aedb7fdb47acb32bbecf7f669cb4b1a7cd894e3414df23198356dec101f12c92861ae5d09ccec67eb934939bf81dbd56707bde1e6dc86c36095fff70df92242546e10e1d97abaec3a23b74833ebcb1182578b583407aed08385950fd88a0418109b9067190b21dcfb275bb5d3d4d157122b103e24588743d844f3cfcc6b48ea841588bbb6764222c2585df23e778ea65dd8361e6a3c55a1c164f097ed52ebca76a744698cd0f4023f122b9ba40baf2ecc7abd2a56abf70078c9926d23bed406b3193e5e178c6b05d79cb02e10aae260365b9b75510733931112acdc7651ebe8a56c13763e65234e7867cd0011b31271a043898109dd58e37801ee717830b413989157208ac167493a394dd514bed2cc8acb06891fd556e3b667f8328746bb1bf01664e5805f317983d6c01bcc4bc942a3465f516ed2d7d358184dc81060830241ee948e547b17a857ee618b152a87e990b76e2b26308613b8c7cd472d3bde1c0dec854bf1fad179cc0484f46899e1418f535807891e650441bf7742408de296ae0b465538a4859b4dcf40a20b57598caafbe7fb56eaf0201e9fbedafb98b103e0be13f4c84faae5aa43e2735331552bf74a3443cbc663755ffadef1a216e513d93f145b5b6033db5af4dde3a618b43c41101d8644b1a1c3506fb2af4d52718a08474bacce05fed644290f54201e954d07b92e31a8932bffcd226553bb95fecc9927fbe0d4bd0f5b964451c1a8b4d43f1bac6f384c0b684978ac24b96f45be47c18982b162c187c8bf88ddb0552a41a04cf0682424a4edbdf7de7b4b29539201de0ea50e2c0f1ea6bc00ece761ca0361531ea67c8c85b1281ea6fc0f76f330e51ba479d96c7e9c926255be45f6f362716182e21b95f75ec5c5aa7c006892aa6f8bcd8d5b3e5a2dce68fa9ce9ccaab56cd94fd2b24fd202e0496c56e1708959edcfd3d5b7f80669007063ed1500ec6cb11187ed83f5286afc9ce97814557ece743c8aca491be3aa13f030cbb2eeeeee19b3cfdea1a837dfd0b0a631a1e11bf929299ff2f26d6efc1f6d1c6a2d265bfc61c0c0dd9f29d528d83e68351e56d3b19a4f4cb6b61cd7b69c986d8c62896939f773a693631b9f8a904cdb4b07f7b603c36640b2c533a2eda5fd944ada8f26e4acfebaff349e486233201e6647b08bc8b1d89c252d31b51ed8ffd3846ecaca73dffd3662d04624b276e24ec779643d994ec4998b26c996100fe3fd2910cfcf8e50cf916cc164cb7f8a9cc8290c8909adfe246182e21b9227798fe4e42bea4f5f3fe5adeca7d6df9c85fa5adf3b5919a3762006a67f3a3141f18df66d8a304cd625c643d37b118c31de1b14c7d7b4fb1eca1858de3989c0fd19ea4f1575370feb97ecf4b03e683f0feb673fb295f296fa5ef20dd298d44bf233e40c27b12a5f627306a4e259952b84eda4e8a17521d96abd3ffd116558bcf6325ee6fd678cba642bc6aac5a7f2040ae57f8e45b4c703e50974c37df75eaa6f2622064e7da77e864cd916d7460cdcdfa26329dbe236928746e28bbf0cdb2e193b00db3f4d245bbc48e52c1811a9b3fd52ca9f21637cefa58d9ffbb39f8c2843721689e693fd6440349e0c48b606f0fe59916cb584d83421d9e23346f6c3ca7e60643f73c85959be9c42ce920fdb5e20b8bd60ceca4ab108ee2f454d481ae193f727824f4c6ede4a503248ff006ccbc6d2a430a268148be09cfd60bfd19de5ae1775f693a9babbbbb528370fe59d48453c7423fc59a17691874be07e437fff06240047e20e9ba3febbb96bca43ae56bb79c87d7f3a82fbdf80fd7300647c20c2f8679f53a98f9f511e67169cf25551b7add6981595edc4e6fafdc9864fa2a8259fe3d0c9a3ac47514d4e1f97aa2878fbd5e682b767b1bd6ae54f6cea5736ab30f72c6c0e31f72a9b633077b38d1833b582623d0aed54736c1fc0db0d89fa6a8487f51d8a7a4f271a5c076212bee17efe66b9139b63502bc7c05b8ec15b04caa1cbe9b70d6f1fde52788bce5a7d46c1dbcd270f7ec9f6517c7177798b7792bc48493d25b6318b08d4f3e33eb57bac0afb255b9cc73bd9c624d6a3a8d97bfca7c76138648bbb50d67b3cf4ef24d3bb23a1ba8ee7bdec21948df86404dbef4db37689a9831dc886766223ee2dfbceb2041c71016fc5c73131ae6d97ad2a972893f2feb70331f0cdca7f9fff9dc5729fed6fe5399bb7bbf22b17878a4db1ad23bef4bbb0d1b6f43e2bd48d090d679c1c7cc3bdf79bed1cbc7dc75dafbe47c2e2a30ceaf4abf76f1fba47b65cbcf7e4ca926343e0a79c75f2fedbc927a0c7bf2bd4bc0d6194f722787b533462badbca7aa83a21c2db9b94146d4f82b247f0f63ed8e82d2f6cf416161bbdc5858dde726df4ed33f799f6269b678e4391e808e7686f68987e67f30d0d6f76db70d62f6d23019964c1d3f104ed97fdeecad1713ba75dce9a33c735e9fd9650b32a87b3321768c10a6bc0feaa4fa8e6ced9de50654e1168778c5916b32c66598c59c7cee697840d0d78e8df41bae8080c29ecb9f3d04670d21442c8c1feaacfc12e637777374aca23820e2a6afe70cd59836480cf8012479499aff55123c956fd2e7d7f27798e6c994e7d93c0109db0038e3f8295cdbde959a271ee1ee7711e3060e7d1d132ba47c3f8b727658feb2ed1384b1e38778f93d57cfa3b0caa44518112a85fba4dd477cd191da577629b313d687ba6c123e64cbd4ea4c034537a9ff1ee4db62310a58fdd734078374fe71142959f9d47f2c81e1ebae4a1f5a89207f6239f6930019b12310f787b6d93570279bed9c0f37739693667b794524ad932e2d6e92352d251ab28fa1623b3e088892d24648bc79027db3cb49f3b1b8fb3c023c4d07f78e8a7a74fafc6e3e18e4f9d5ff3c359ddc3fb0891d53e6268a364f9f789a252f9c9f68fb7f8b78f28e3bd7f0b21ca7cefdf41e81e51c6f4fe14a4015375fbee4da5cfdb74a4a07d44d0f68f6d202e84b74f066efee519edc4ee61972748c3518d87b3260fdd34970ea47028714895aa5639a3c62331631185e1a1c754f93162e0bf00a63f4b5eaa821759729683fdabcc9ee3bc2ecbba2eebbaacebb2ace35ecac9d98de3388ee3b6ffc00d6f993ed298d447deb27dbfd7443c8ee3b86f24cef4dcb5e1af26f2839a7d6e239c243bf0e6dafd77bd9b3f37120f03e48ce94aa1a0193293445bc4deddc95d1bfeb2916388254530fb6e07fc85630bd54804e736923485da9fe5686bf07a26b20ca1e676f57bfe6abb76b80e186a128e374feced9282bbbcf5399bbff010041d277e46fe14c285f09fd8db41a0a3b6176d0dc7f2080668bfddd08f71b2e06c54a84d418083e31b20bf34c23e450f18768fd1b9248654d42d7f6cf9b1a5efaaffb1123870c3a1629ff508f64fa13cb1655996dd4c55957e4ae3ec0daaea202ae97657f2ce4f06f5c3aa9260c053006107fe80a0037bbf90a399064bb0c2710a240499264aa3cded1dbbe79c936a33fbf9d37f7eaf3c6aeeb43b46efe9ef6dc3b9a16eac6cb77ea999770b00de664f37d47e9f3223c24191148e530022640a4de831450eda6092724ef971257dfaa665d1ed9445ccf79772befc0615c04997b163dc5e5a7104da88479d1544e80217bc2c033f25d4f89ed4a2bb7bcd0fd8fda3cb28dd6526e58c9dd988a50d37434e0c3a38bf41053858a308f931914a01089b26a55946b38cc62ccba4f46c9b0dd3ee4794720532a74e3fd2e994729b9645ec33cbec8a6694caf74d93d3a98dac97c6e62cbf7eaff4ee66b07d96ad7d8333e20e0f101344440843c6f6fe0d6819b2ebec38d90ac3f0db680000cb272a12b1230cfdb632865a6ca1f44d9872dbcfed8fe0ee04b6bbc4d34d7292bb749372f64d00111efa11484c6086d625dcb66ddbb66d3365c19b420e5e918a22ece0f3fc558d0ecfab8409c76ff50930ad4c4c9c5d25641e1aa683e830e03ca3146da062879091d7efb5ad21f380071c1f40707caf035784e0480dc7990927b8bb7777bbb7bb0ba094717ab8201a71280bd8a988617f1af10d68c06e0620d85f0c3d1862073338211afdc0fe85580513b09085f8052143ea1085724e806fc8149637e33461c800c430801650aa95728d297c10b150054c15e11b6aee152b4208ddd04205559c6eb012842845ce09f00d4f61bfd90341664c297f200a271bb08660aff18ad0d8ba205d76a51c02228d0c34b21a60a739c0fe83804c67b3a246f69853ce39a794734a29e7ec2a4a19cb256047800908bb0cf61b71646b4110327ddd7b38db6bde4de0cdf460ff7cb0c14d89ed665e261acbcff235c92a6dab1addd7f4c7f892fd0cd9df6f7665e33d58dade14c11a9d136ffabe79e296cec486b9e76e8dc9c486b7bf797b1b32580969b29d07bcdd4b8372508023b880e80296b29739f185be777bf6fda6871e719e5fd58c20e5f64d7bdaa973f60ce280850e8ac31382e28084398527fc088a4310da06c5c106599665120c2a1c838ce0c1b7387490912238c59562c3c4a78117595a867f9c477cf0f68ebdd932b26f198e0120714a36c9a50cc78f2d83caf8f744cd36195fac8c30b1c55fa2ac944810fbcd5a84d93e4698ecdf37fe546e7e9778ac7d2b11f380079cbdd7e48bb5a74b3091e1ed6f6c580903e0ed767cc1deec58c331bd2e1e4ac9e2a1fc515970d327deb64e38e690e2b871387e8c32c286d1629078841d075112ceca3129c70534e0ac36a2593f74e8dfe1e6d2325e228cff908b0b0cf6cf00b82e4968407e769192522aa94bcb88d8c5656a9f5d344d4aeda594d225e7c342cd71f999cb99bdf73a6e73f79fe12e8b98b108e93de17d3ee88d52ad888c92c08b2cda0056fe39001ffcb839cbddaeb699758ef9b9d77133cbb6ac676633b7520670623800ef0f4a0fe6940b4a985a20941e9401c8910a24f0b88ffb0001670c437050811a84780e00be8308c0c001c01a9e049cdd9bec4190dd10ace0f94d901f59680ec7d97cd240e248059d1a78e8ee3cd8ddbd083f7ae07d3ca62f0875fef6ef833a3f93d9c778933d554076371cdaedd371bff9a8d91bf105a16a4478b493dd83edbdd7d95577dddedc38adeb7aebb6ed353b57202062bef60888d87bed418023042b58bb375ef6bd8d0e7bef69a08d86a319a2c0c15002a219a2c0c115b0d77ddd77d8bb5bf7db3bcba3b72ce5076c2af0224bae98be97810d6e1e08665f69f33c10f440f03750a3f8138217849ae777db4bf09be866e47b76dbbcf48ec4cecce78320d4ede5d398db0682366b0faeb4ccf36dcb5fe9c1f7ec6a7629035735b4e75e7b6e036dd31278b311f8db3cabd9ec58e39e856656c889a57b2c40f61108b58fa8df8e952a0740df7fa3dd52fa90e72ad9a2a9e0094df0221067be6b02efe3cc97bd3600950c80fcf83fa8de7b34c766431b10c123580c99210a1c0c99210a1ccc783f7d40bd776e8a1f30d7716011361b81b7f7b6d634aa757fa6655996cdcfb80de4341f7453569e1a719cf16f4d7bd95a6f3932d77ee5daaf38ed5753db34cfaefca5f6f207acfdd4aef6d9773740820e4c7ffe2a5bcd9ffed31bc2f24f5ebe17c127efbdfccc363e82bf2f416104c7e048051441d8d33e695d4e1cf5a6f4dfe7d2bbfc0f246246a9542a95feb3d161ee35e76ed67ebb3e5412ac89b8896ee609ee6587a70fce7a60ef391dd87b13143a38fb954de9e9672fbf71303764247fdafaf5d78134d3034b600dd8bd57fa3ccfabe1fdc99bc01af2bfec7bf9add5684f4da69bb9a72f4fbee2994f1ef8c006fc127460842e90e10954f0ccc4d872fa0fac616f4e4eef815f83344efee4e5cb3fd9ec7fe2f3bbcce5f95f9eefcd9053be7733c7d91bfa22a8913df81eca9a80f68624c697eee433b088f9a6ff4a7f62b35dd994befbd277ef6de034f969bdbf293da8bd77337defb9bb32b9347070ea5735505f7ad497bef4967b94f5b8efacf7a0cddc7b26071b1067587c67513e5c3102315ff5d472f7c67b5abf8245649f298b929fe12950bd133102916766c8125b8383539b0d6fbc8fb8da1bcf6457365ee9c6008bc86e3fbd375e2300270a4d20000707cf6b02138013851a6dae6acc1cd80438723f6d1398c3c11ef70e763732bc841206c0dfdfc8b0121a8ef1c5f499006f4aac60eea3d704defe8640856fa83077b79be967201133708c2e34b4a70131e84c9c31fdaa1f09d9e24b1cd1bdf70d883346dc1c44e0cc7c0f16dd95113a48be7befbf273a30b3a2d7081da57fc208f0e6689c991c85704ef7a71c92477d048d20b9ab23504ff2a84b49ee0a023d83fa9e415d9c19cfe2cc747675c4e9bb3f65f7e3912dbdaa7157f33b9693831d28276715ff7b986cade25d31a0fbd343c03b9dbefbe82f8ffc3d9b846cf1ef2cace68884933a7964e995de136a976e942de0fdc16e2a2a3a4232c54c4935478210a83c10d8644bf6df8ecd70ccecfcc13e5f1e1d0dc9a3a4529229c7e47216b7e365d231ed48134f94691c869a71f007d2709a17869a3dfd0ea4a1f1aee26f1f31a559428bf48787eea1e663843cb23d2618bda61ea925f5c04a422522d95a41a07baffb28547484148b329de37b13a0a0fbefae20e0fdf75f8eeebfbbf580467477e3912d9e7d6252514b3ba59d124fa907f6038484144b2ae5945ca5d70ff6ff010285888a8ebe2fd40cba4017f8ea2cce0cb803f2803db215671a3b4f9471ec8fa365a472b03f09a20cfdaef1698c31c618638c31c618638c31c618638c31c618bb2d29c65677b524fa1167c65fc6646bc66d47b67c3df1250a55debc09edc856b693555a52b8235bddd6b93a57278fe411110ffd9172c39450239e5454f992407227de4cdd2079b053a11f79d4b99c956b0cb0e7ce8577c82322b2883c9a46f368167534fd231665a46c75ef4fdd105ba61ed962f28c05d8b313c4cf940e3277923c9247d94e77b9a222f99a296b5a92a908bb9664eac9aa1a4d3dd8a396b419d992b6587c71ae08fb3fee5b4aca9d0b2997925cde3dcecaed9fe4acdc3df8c8ed1f75f3184ff0c9c02f3dcc85e89ff80deb9f18fb63c33cf49fbefde31371606f865442c31a8e33f7bf8c3ffb22317f869c57344cfc2568e283a0b17cf769d84fceb08d0f4b4f0835374f448932dafba7449920b59e62c79f80b71a161f892b5a064d84c956f596542f81c4472c849a6bdc5e8235f4f3b6db37d8a0e94b36c70fb199d2c3bcf74ad5a704932d5925ac24611ee6e834c0664a5fe58755555280a66938999452ce29bff9691d683d2db69772129bfbf6d3c6ec379bf5046b58a870cc2688e1e6e9c8235bdee32dde3db961eed362befb5422e860ff140a186a6d1d38f76c491f6f7109a4858f07869add47c2824898fb348f0ff66f1e1390d736d9926d9b8dec9b7ab7d19bb74abfa348d8487d2c884945e5bab87411028c26a2833d4a29a57db9084e0e85a3dbd3ffed7a93d2f994d2ef2b562fede9f428df4748f415283a2857701cc762c5fe7b4d9f5a1f2adce71223e911a547941e517a44e9d151cb20e2216d22d3bbb415a3f427aaa7467c0c1989e0d2e5be458b3bdf88162d6eb6f1e1d2b778f0b2b8363ecce2730bee4f9edad34e55dd1b12b3f8e7fe66fb8959dc1b136ae3cb363eecfd8994f986bca2af6819256e7b8a29c76d44f05c9952f34d9eda0ea4f04df726efcd4f65bd3fb1a56badcafb50f9520356fe7f82341ea5f453d9f927b6f42ad69ecc67c0caffcf703aef0c2f591ff6575ad8fb794bf7d4cb3ecfe4553526dffd0c3fb13e54baee55ec07d23079bbf22a56c713a5161f4194a7dfb700ff7b24ae8844f00cef426d0c7e63f067f8fc34939df46bea4d648ba7275f427994d5b3f87833e54b4bc19ff355b1a3eda7b5a193bb2b04782f7f03010ef6b20d2c3fdbc0db6fcf65ee51ef79928915ec6d3fbb9f1ce5fcaeba8b001cecddd30eea267ffed7cd7bdaa9734e93edbb7bdaa9db2dc2e4bb7ba3fa6923b5a9fefb1416e04f15cac99f7edebc62c1e274f2a5932f9d94a82dcdd2d3eda4f4a7d2d35309a4b445e9b6f8538ba7b60535399d7e9e7e7e099db4e4eb425dd9f4cbab32f9d45dd5005f3e6862f2a90dfc9489c94ff053efc50998a47087b9ecce395fcad2bc99c5739fb564278f7a16369fbcb7d9809ffad4cd2673bb32a7b0742c6d3e7992f7df88507d4e6195c983f9e4da4861939bfaaf628ab2d906fefe03694e36529889c620f89f8d6187009f956fe4e0fe7befb331aca8e0e7184378e825d9751a98001c4cbbfeba0ed3fb58abe1318668a9fcf79bb3bcb5f2df0c5f899d8bb322d7dd3ce75639ae278abb0842139070a40247299ad003dc2a1f59743ca1bd133fa3f2ddddbd7a15fb44bf09621388e1acfe1b1323c6c47b8187e1a123c1fdeadbc6b0e12f9ce98889e142f8841123012d849ab79557f9959be387d8cccaab7cdf1c57ef652b14abcaaecacbbd12af8f0ff2d0817e26823d838898182a36c6162b88e01047202b5a80bd1853239015467004b222e80547a02042700c10b115f3b363042ae820095b3032a3612252caa7940205b162ca79fb0ae9acecfa13115bcf8a1efa4cff042212f188c8527de7546714ee13ee380718aa97da03ee2d2597b26988c84a7dff8c7880c862f1fd25b185844ce3fe2d7e5186e4fbc12883f2178ebfba290f51a26a45a5aab5458b6f67cd47792f731c1c74e0d56fefe342f9ed294823821c57a7bdd97ef55b8335b65fbdb7d994ff00ae3285b3f9c3bd8a8162730cf77115b795f683f30d4f090d139ffbb6f139db3e0dd351090dd3cffda6b5121ad6b8e7ac16551f4fbe8535798fe9dfb61ab38273cc4cfdf62c6cc495d36cbe3131f7dc0d5783b3f3399bdb26fbfe54e7c64a447b63b2b0510a5565bb87898eedd404283004fb5731602f815790017bef788b6f20b600c5d691853b08c501fbaf013b12b961b18d88e0f6b8af89987b1c1c719c7650a568c20d70c4c16d6f48acddbea26126bd5f0ae53690ec2d37d0059c956360207184fd27108908a1ca06422248cd31457136118ab3c0413432849eadbbbbbbe77ff386917704cf08755251bd276a04fb73fc0ade470fdd3d76dc373bc64ce3be4d62affbb8af9b5ec779a58e2ff1236ed9130c5e7c519b254f20e77121fc33eb3d2e84bff769a1462b34eee99a1296d18465cf709b1daf4e3434bc42e1c63be4adf1c5dfb1f7a366b25565f5c935d50304fb7b8f8982fac2ee8a2fd97fb1e9922dfe1dcbb5933a49deec39b9e278b3bb72add99d3941354f1fec3f7d7ccb72708f2b6f58f6fdb619cbc9c9818127fd2625a51bb5527ec4262f8034729b3149b74d3e9537caa772c636db51db4514d973b372dbbaa776ebba9fe1db7b5ef6f506d26c947e3fc329fd2ccb721358a38dd469b92ded2b3eb37dd430dbb63d92879bd679b7bb9f870d82a5164a293579f03dd0ce2ed43731791c5c32f9b8c1e0924f953c09aaa49afae3ba9b71e0eeb7adc676d37df633d629a1e1afdbb6ecd8d37eb374fbcc760ed2d0fbd9ee3d9b6535b837b18d4bec128d73146af0234c0cc9cd610b06ff71aee0052ff81d5b1504413b138083b3ebf4ae6c26a63f312dcd89bd066b36ac5d22e24b8d1c850cf06e8881869831845fd082c98a9a6370b6012347a1cd7a94bee775ef81000753cffbae121aeeb6d7e867560369b6ce66f43536340ca576c63ca4bfd9ec6926afcac3fe923659810a005610a10baa6d6a9a26df67fab7e9618ee1dfe7ca756107dad63e7b1a3fbbdbf4dbc4c4e15cbac08bced27efb997577b7b775072212bee99737b7959c8ed8e2376fb82662a7e1d87bd36e66232261bf6cf062ec28a594b2c8080fbd2045421ec347d0f1443f8c8f2cd1663f2de267f9ed72232f0e0ffd6fc426100e1cf60331d6ea19200bc3d6ee9733539cdd0cc8439c654ba8d9632d6213c8944194b1bd54de7fee4c1ece727116cbfbab58b0e9337f268fb302f0fe12c959f6fd65111973d6bfbf34e22c00bcbf4c92479cd5f23dbcffd4e1ac17efc3fbcf1dce0adf7fbea20c8bdf664003ecff5551331d1510f6bc18639432c61c1707474d5342622d8299bf5a30502f4d523767f44afbfeda3ec6f813a489a5dbf674fad4fb0e189c5e3a103ed994875d1eb616a9e93b1ada63f2481ebed358de1d2d236279fde561cc375c7a2c79d4473f653fa69b37ee4130df90f8f4f2e61bf3e4b4534dee8d89637dedbbe47217f513c77b53e3cc3726a6dfa8cf3764c3286ed3bda11f5fbbc99ee2781d06272debeb306818f9d2a6deebbe52e9677877408573cadfc4f7e2d7f7e4376d9db67b966dbdb4a7cfec7b5af726f67bcec647d9d3c3b0ad12f044081a19b55ffc137b7a216cebbbf435f04ff6e45b56889a9237bdeac4c617226a282b1f86654d548935995e7b4aa3e44df4c4ca17c2b2de442bb19365abb7445adfc4d6d48f263b511686adde323fdafa538847d993e72cf8265bf2d1ced47b2436549e7a8741cb88389552423df92c0a389c35850f1eb8bb845be311631910ecb5fbae24f7efcf69f211f5b5e4f4e0a74af1b38fd1c66f2b637c2e03ca7e32209e05614f026bfd333c6a156b77850010e0e07943b082e35d99fe262681fb93c099f62ea4e99b89154cbf3fde6c43bbab79118083e95dd1bf99af3d9daffdbc2fdf64b396801311577e172d8df494b3a7f7b453b36b43d5c57b73fa796fb88fd6860ac76b43854f57de6c43554a9d7ce44a504ff2f1663095422900f5f56738cae62670adb6662fb5df400548547d92dfeac7ec6a3793fc0d894f3e4f939b7170bd264ff233fca38d323ec9cb6f11656cf1510975658353dfb7e47bdeccbfa98f6011277fff9efcbd3f93c0590a25bb51b7d69babac1ffd9a7cf62693f79975f12636db50e1d4734f2d138d5336277fefcdf353d7e699250270e4adaf59d3b7f65a5f99b9ffe1abbd99ff9d3e95fd8d2cf9be25afdd92d3bd99253673d7860acf7bdffb19b285ad3846fc83cd30b0f72e6c4e027bdf81342436549889d6bc976ff0e45fac66a4b7578acd2a9cf29fd592bef72c526da668310ffd3f2cd40d96b5588d66240be2e1e6a3ddfc5a6bda0f76fca9f06771f0f692db56abd04b28a619715637369972b237996eacd1642746d950e17e146803002b886005eebbb2c138b8917266f673b421c5b2aa28c6aed1c39b6d8438037aefeb49a85913da5e4574909c15652bce6c5b8c4a853385b1c05c6ccab6bd8bcbcf7097df3ec5be7cca4f6705f129bf39eb7eca7fce527dca5767917ccaa79c05c4a7bcca59319ff228ce82a93fd45a6bad9f0b179ffab6a927b1b931c9579b63e0fa9fcd44e0effbfbabb35428cff239d3b1c18249fea24c34ed9bdba62325eaa3f55e43d9f8f0e927d66ce432a3ec2823e2ac93ac88b34aef2525252825d0c6b8d890e53dfce1496cc45ffde15dd8dc3f3c0569ee8db54958b0ea49401b941f379001ab262651ddea61cacff9c32727cfd90669b4f893003cb5ab9389eb500de2ac8f66f59fdd02603fdbe223c8fdd642b205c40711f3decdb54309e116e902002d282178496c360df9d0d6668a332ae72a3f8ec56a42ae28131b24a2b197492222cd8fb90b701507d73b6dd0301910760a04e5b3c6e38127a8bd4d8a95e83ce4b82e6c73d5f4158532791c5cf2267f0405c7209f2be020251441b501fb93e018e47306ac841e388348414978053521865f700c6a0210f662cba0a63e4b97118e6690bd231e4d839ac108740423ec0f160163a011f9543ee538502315a8e0832f8e54a0c20b07e14107734fbd68811aa748c111f6e28d1aa7d07184e7ff2cc208114cbf4ba830c58e172f409a952ce3384a41d3d7b569b5af0d39ebbbd1c57b9fd586ac16f47dd682843c741049a24c2798be046b9ce013e992d37aab9fe12c709f70731844eace72efa5eac778fa3c34799207914a3b4aaf928eb3668987ca962b56f9a8f226367a486253cec2c1f52b98f2b07e0469566c35f2f0a891648b2b427d9426ed6b5194a7cfc3f925b12863dfc3fa9cadcf15c9bf79bb5c5189ab793cbf7fc5ce6f519a29ee27f7d35924cffdc67d8d32b6e4e97b1d48436b382679cf5a253e50a2807e4aefaa64453f4b578dfe92bba257c27694aef4b92698b7b88f207eda4a324d4a4a487e9a949058b088e927086b02e22df382393573459c91b332c99738eb86842be2be106556efefadac12265cf2241b58045d408d54083ad2bfb211937c127824c732d198e482463cd4c75dd30f128f243d4b1907b713b57d9ce58214beaad66dcb435dcda7bf9ad726c4f486209276e4ae401a2d86875a5f7ed662990bdb5805b4df1dea098e5468c1119cbda32c7b43e02ccb585070f6794bbada64c122d2255b60cc5bbcc41313536f0ec357d1fba2e90b221da9d93bfa729c95290cbb9c95359e230f297624480bf2560fad648d47e3d17a78eb24245bfc897e603f15f9ac9418c11c97db0897d4220f5bf029c714f4d324e4e10e0f513d8e781461d48908e334b143ebe1a1b3542c4e2817e6be630bc561ee661b21a62f9f038be0ae6988c80ef50634d2f8b343bde1fe461775de9bdeebacca9bbc95c964fa1077ef993adb99fea4c3f4fe9dfd55f7f6661c6cdf7bcdd6227b57ddb509b1e99e748031d088b3b2e94dda73ef99acca73b61655a33ad41567b22bee572bee436c7a2dafb86b1362d355a26358091dcefa95e969578b3cf495e9da84f81462ce252d51c9158148cea2de916c715411ce4dbc30f7992b3a32996efe006d6207e65e2681b9d72c7773f625362655ade76a3c1e3aca052a00ac419f7b4a9f32d198de930e3a54ee3388a4f1d0f7d8f2aa7734bfa46a2af2d029ac8235a8408520583e5dd984a71c230f5dca7bd2e1a173dc3505f1f0630169b4f8edb5a23652f25e5bad4823fae650ef678de87e72a8b916b120beb874c5a15eab05b1d146707f47412455882992a77d9b6df12c303d61ca618ae9777453902267d168f1dd66fa196e22cada83486011539049c834245dd4d5922e6fe1acfd19de048e4439c4dc739792bcb54a58259ac09c25798e23b11162692bf6fce348ba3d465ad2b820b87ed6621e9106e98d35068348fffe49b215677ebb399c20127729d6ae77e444a5cf3de8f5f78fa5c99b7c462abd37a6373df79ec904d2a84aecc49fcd1567940bfb9f80299ca5ebbd2313306fd93484fd556c9e3138c4b916a9de5bf94aec3ce56844ae15392bd29f4c61ee21ce14e64fe4987ec9e266154e7d8e4535a9f7c0d30e6aeab92b77787853ef2388f788d049ddec2f6c8258037ca61f0469b86f9b4d10b37112c083e0690772078834af74c917881493dcc889b0621f2b8134209287d2b5630d354b97dc912ed9f28ebc23e93a450f8948809009a4999f1431c76ddbb66ddbc671b4724560116f51c1c14710cf0571513bbcc5bd9820803011000c0a437d1e4194a1f1348ca71e4794a9ef1da15e2817f719e542edf08eb498c6d33250288da769501cb7a15c1ea648be4106f84ccc777def57369d6f3ac775d328efbbffde0022c5a40b49b66a114aa8659c841ac6bf168148a85a74126a1931c294bed65a543a09617f01d887a1227949f213ac715c7da8dc50734c328961434c100f0410df3340040184003e260820de67da2500d49f7c0a6853f226af02d2c0c1a837b1d9b1c9374803f53140b880b03102914dfee4aa8036258ffa159006753348c3e4b6eb8248f1c53f464271bd5da40d35c72404a062accfa0be5da8fe1c438036a6af8f02d2d4dbaedb39a52ed2492a0f4472a15ca81da897b3e29c9b768076cdf0900d35c724d008f6cf5c1158048c816ba8392681ae972d9648c41045309070f43bea07ef1e2aa2037a02f129fdf85340a10347202fe8bcc0710a9811f65a07a5d5e3629c36fa8747dfec028937fb80ec2a8edd5d03fd00f54f03f19e02d5a1d29cae81b2ce72f3b51f20a0ce80fa474af9d9ed1fa0fe692020f173ff24d152ae3249b5db2e12077f456a9ee1c7985ff3c43d3cece922a422468890adfe11ea9fa226f263d31660c1f1867ef78035a84d09e26d9f1f484849dca21ed4dc3d7c7ab4113ced120db4829c96360239819473d269182e2cf21b679618d5c5db480c8c0f1604fb57e923cb584296b0710c334b386b20851a24e128051d2318064729e804e13672d6e48c6abf84f5e8c991b3c323a8853cbcc31d86b48e919591018a34b0010769f20256031efa4b3b686e9052ca98b594b2bbbb1bd66d07198fe6677d74cd50b3ec3d32d4dc413d2485c89a3624a1b3eed734edb5be37f23b7ca3354e77dfdc04b68964c0b36d60bc20451e9ac0d96ff4ded88855bcf0bc1d8855e41c38bb59e22a5e9a9452cad316a49452d24c6ffa7dc037d428ca2c11837d803138b790c76922477b1fc1fb5d1d4ebccc7cef2299f1de63b0510a93e0eca32793fbb39ba5cc7d7313b8231970b721fb0edf81fda780f148692100e30529f230c37ddb9c03f78d8d48249fb08c5408e108df689cdd0e4422f8fa304113b18ad74c77736215af19139637f7a7b037bf4e02b18ad70c7773748fe3c063093d5802ecc87b9b338b000320a0e0074f98d1e1c4cb0cf72e92994e87133ee3bdab0033dc7fd65580192f871151b6789fe308efb99be32ff739124539aca00a3ed60006228c610b8f5383a127f08007521421010e3371a63be27372681256c8055c2e806f508f0c5586218787a72f74d16d220ffd1d84a94da4430a3922f256cfb8f01d86827207c52c5fde30dc410221231ec1b0bcf2066c82a9082e77e82167f595c1b9bf83863a287710f6ef213b38abbf73b047a0ee914424827d9b391273ff681fecfdd27ca609463ce708b0ca4251f4034ba5fa75dec77dbd1147ced7cfb53bc68f31c68b23e7f49d534d319aeae7f8387262528eefe3c9de98b8547a8fb9bf9e3ed7c7516352cde1a19f4c36734938fcc6c4251b1ff670f0f638d8eb6aaaf5f4dee9743a9d4ea793c9544d76f330e66191239dd446acbb3cd4e139b28523c7a8e21843457947755a4f0cd51b52730ba9b9913c2a6a75500a8f52e7711ff8cecbc80b5e207fbced1b437565af45999ef138abf85ccc2a3ef73833315691fe111bbd399e88f708fadccd91e36e5bdfde691c68b7b3db2e99b73823a350b374459996bf444b97b3b2bfa44bee30c2cf16fbd5ae577cf12292fc5df1459b81a44060c08831c587be7594c28b2f6ac5de861c6388194f0c61ff030c798ec7e4cf8aa78d56fe7cb93a82be7c7a7d088687a1f4f12da4e69818181e933fb6d89a1fe34f20b08dad28e329c696942e5746f48d52e0936ca2bdb590059e27747afc202243cd1be6e1c1b383853a81a4983fb019393cb09d8da79166bb4f8185facb6a63c237fe35ca96affbfb3ebec49756d43ca515f5f39b4f38fbcb77dfe69cd35bcac18b2c79cbe1a1c4115f24f7337c07cb3e92add78e6c912fa994f272377bf98e6c653b13e63fb009f39e09cbce33738474c2e80f0aa33d335cded92303da787af4983d4453072e348b889c35858c3cc88c7d63a8ee4232480a49207f1a3f89cc16adfab5c799c991fdfc23b29faf5da118b2c5b32cc6c3428d7722a121bef8c79938436366e4cf89145f7cf6c8162f922d2e54e431fe922d473587e18cb54f2fc8389fc52502b15646bcf8f811f7cff9c27e0faef83dfc77e8ac9e5d0b6ff5a180292515d34a7d5a72b2a84be2223349b168aa136e6311b6fd7f67f553393f94adc3c3978eb33ac67867d53173668ccde2e2da5f51494159b560a13a312989312a8a805324a8533595c0cfebb84dcbec6c59258b773e06501521a93daba3ba102a17c29f7e9ef566f5ec13dff7c374c6ef7e86ab9c152f4d5555bcbf8134f33ba8c6a8fa3f5a9aece35d65df78098a6f4c3cb5efc620a1e6185c678cb7e6ccd32a253073bce8c37b9ff1a704138013f30644879e57bebcdb949d271360382bc7c0885104a0f74cdf67541f77f65aab7f6b2f7e8db5e20bd6f8dd7bbd7d8eeff10e116308cff3bc6887f030c6101e4833b909220007c7cf3198863e6769e28d71966f34f2db7af393cd810dd2c87790267e667d7cef7df7a67f3ebddbbc9f87afdadfb246df79bfd85eba9b0b36a49a74a408daf74bfba49c73ce39e7d43419bbe367afa95a38644b91235afc2cfb1c67651998525231add43f59d42571b1a9522c253d98bce0bea50f1e65baef538b8e325106e53bc7c3d89ad6499e136fc73c74a41c97eb7096bb8cf8f0a2071617d7fe8a4a0a8a8d2bdb2d2c8b7e559ff49bf497f4a7fa4950fda73681a6185fe24b1fe9c771bdea7842bb9de4a1e7b81046356ff2e75f4d8b378a9a3ba93f93df72b694f2e288d3b4058ffb54f79e12fe351187f1a53f66168cd23dce4c7c16160e85850565d368f6f555b5bfc9aeadb2c7d3f1849c2fec3b31eaec8831be5cd9e76e89e4ac185f5e2231febc2d8f3e2dd42c3bdef83c687cf9f2c84324996dc4eb42924712c946238243b6f47589248f1acf97b3f10ac708a6631f2ecc02c72910f1685fd782ced5306d39dc7755e3be6c7c1807e3600e9c9786e3ec364f7cf1f73c1f35673b385a062a07fba8f20a79d4307e1465c61065fa3fd874755044d66441b6238f3a57e7ea5cf228dbd991473b59dfe9f27a6ade869a48c439b1739540902676aecd08fb07f1b60f6c417cf1075d0de39f84fd8f18f1d08b9862d84d482e900551467f67537a69132afa60df17220b84228647b2d55dd0253fbfe7923f18b86d5fadde05bfa3ee1ec50bc2e28b3fe8ca76228f6ce16430a028d3b18f0702abf912285b4d69ea81fd0011459936bd6209c754e4a3e28832f1fd471065c831c4972b1ac681f87898fdc0f19b3d1eded848d0b93a976cad8ce8fcbb57b7d3f1743d1d2cca7467bdefbbea0fbdcfb1eabb04d83dcecce3ccf45da20171a674736cd7693f1efa67459090b0d3f40569b01101e5110d9553a333a8d2481615797452f9afa300efc4cfa440e6210f334f74523e1292729ef6a16c11e0e3c798612ad58ff13d93a56f7d18e087a0415a7b92a35366f3bb241f32265ba64bb6e48032c8c130200e14e42d43f17f6aa94d776e935290c6c7101305157c6f7e262b29100fa230f075c11754986cf9a1300f6340411a8d466cf266b8e46080b26912fc32a42c49cbd15c25af9ae46f1a37b30efc3818078bbdba184754b21de6625c4ca87b08fbbdb837d0a09852ca610acbba0d67d96b204df71a58e3786ad8b31456a3d8344ba310c329c4d0ffd225442ac40702332f48485e6dc2342ec3bf6dd24e9dd76bf2983b3bd83f6e4442f1c5e7a70a40ae10b4514b71b514d630de3222f6a75c6b252b7107d34cdf3dfd388bc8b0773b9a052bc8ab715fc9367e8ea86574420d23c411bdc017d0d0bc0beea843db0f27d4322816220c10cd42274485bc9d899f7ac7154aa832339315ee829ad77d3565e5e24b4efc4c015c990d923257a6d330263662bad3932561ce39e79ca69ff36fd4948f32ab9fdf3f40a68b9ff7e78b9ff6670f3f674634e7cc90e669fa3059e6d45e73924cedc79c1a6ccea90dcda911cd39b522736ab139e7b663ceed35e7dc7eccb9c1e69cdbd04ccd16533537a27932b72293c52c995b6c722d98a8f919916c653f51e66613ced950cbe05e1061fc5f50c54bb6bcd7005eaf1f2da32b42f2317ec064ab8bb5602cd850cbe89086702704832808a296d11111c0cddec180f881c56260b4d88e96d1fdf881fd7fd8f1922d2ef6f27afd6819dd8e00fc80c916470400580b6ca86570455244b2c5a98870c55b9196c10df5c95604fb6f31d9e25ad032b81f0d83c4628bfd68c176ba79f381e522ddfc4638fbbcd09a70dc0fdad383435bd2753d284f68539ec783eeec604b82294833dfe631bd54e703e98bbefe4190a6f4600a0aaf581f0630800168520c22cbbb410cfdbd57176b982e46c910c510c310437f942862b884e88418fa1bc0d228c4162ac42bc42c442fdc800dd8ff0c31d632681118de805de5c66a3f4e59d51d2e178ec2bea53e3f14080d228ae1ed86f604c48706c5a6378134e09bea17da8aefa43a680e8dc25228220c9187431e0af9fc00098a2f5350c1c485d6843dd317dad209a441310a850251de938034dd938035245f68bf0c497aaf9e34c552a221201e05f25e9324b45eaaa404a459f912b0a6e473d1e1b711a7583a24f4a3932105c9efdee47bcf2bc996522ddd4c7fbabb3bb656da6814f18542419f10619cfe780824be4401fb674869c0fe25200d8ab37b6426258596c3269b111370c662df8af531840f509090b710c5971fd886339d9641b51061fc29176c80fd4f8a9c80130929b45a11910af431858488a8c07974f28536c39305f6545f68295ee1ee8f8f21ee84813e668f1b6affb433089c4040ab1548d3e974af16df2d808d33a19543d838d371b14ca765704411a64bc2b1cc85d2bd3a9d6ec7599496a404024b3b44aeb8009f55e0cb2f8025801d22a58bc96ec7bb57d7e968efddacfa6eca8df2aff6f59aaef6a59b57320cded77fd7bbf27aafee6355e14c9798dd0e0baaca668f1834797850beae53a3a694af282a2b17d7c4f6f0e25728ac07eb75455a068582e41671fce2ba8821c53a241315944ea823723ba1b013ea88ac2e85b9a0364cb6bc570783bd5456df2995d5a5b0c6b04fe9ba21ec413b9d112a588ac5c058b7c3e47d44454a442051918edb604330d850467f344b7db8976c5120dc8f9641a1a04395bb9906bdb047115f9cfb7129cc05264678f585b6f18af531c44f4b611efe80dc107fad0f573833c4a540bcc5dfe4d214184c25c53b9a94e48776621736626913a774d11febb2241cb51638bec75686245bdc3b43929fc9be1a7d513796ae2635489ec56adad77a089fe55dbc781fb4afaf69dfd644f29af62f603f301f20b01f980f059292f26ff307f0db98565f575eabab5b6345abff33e4dbfc7f625259d5d752fe5fcb1b5ead6e8d94fb26cd6aaf62f3ff290c5fab6ffa12cda6682961aef5de28227cedde849f726f5ebcf6f6c6bc37260e4d2ffef43ed83cb18b97a00dc9bfb8d3c31e2e8b0b1726f751eea35c1414cda2d4373dca6ba68bf22628afd5bfd9048544d32ccab56f625fb3d6f4a69b3d136bfaae266f32799366d234acf27d6f56775583e4fb4956ab67a142f22c56cf82e459ac4ca65fb9294f61a6949b376cfabf268bf27df2d532d158e5bd411b9267c1e2e6d5abe45596122c42ae7cdb7f93056bf4ff9d21abe955bf626f568f4a79954ec129f766f524a6cbe24f9a8d2a9b1f9ffec4be8034262517ac518249deebe1eb7afa1e409ad473af94e57c50363746713fa8d79e83fda0927ce6603e1e090a65713a0ec6f9d0d38b17208da7a35529b917b7437d5a5073f7ea7838cb593acedad1625126260024c207017e23c07f6c2080f574b6ed3f67997ebbf9c6c4da773cf5082388601a6b672b6da5d26b5fba1398980544a2a87bd94ea7dbf1767cf05e2f0a735613754d83843a1d0fbd7b79e83da899c25e3ecef228104fc7fb6d27478b00efbdbc97a7e361839f062e70b46ddecb593add4f6f11e0bbef184c0007351b49782ce00762b88bc996f7925c1c62abab41e462b2d5bd64addf0b70d227c4170a856e710a935d0d628b2621d22a28154f61142644613e86780a1bc2d217200dbd14968382387c48515989ce02000a9354e3b8c011793cde0e8704efc5c1027080008033805c38acd96c0e110e316b43ccd410437faf06b115a31d22076b19195296060e09d8ffe5b35896a4e56c58d21f409a39c40f600c0f0606a4a11a9e364342d260401a09032626060eb55fb2952121bd905e5c8c4bfacf5bdd4bb6bcfced662e898b693cb81867a47bc95617f32ef6a2e154b8a7e5ba184a4ca5ea863aa24ea813fa98b38c382b897694ca2771e9800adf000186dad7760a205565105f10a023c100250fea867386e459110f6320cdbc19d214028c5f893e952d208d007c31ca448f3ba148b814576272c2a958702db8158a771025ed2f68e3c18cb2e04596fc4f6c1f9fd07eb34bbc66bdb74bbf258ee8ed3d1b1b1170dbadb16df688feae0730adf8863a20621cec7d1cf8df4300fcbcdf381dde57abe3fb930caa123109c7998c6676200dfad32608acbdf7d59839395a839fc94e7a52ca0f2c71d72607a626b086c4370a0069e0d4279870ac69b723e71a1a3c2970a658036da40d0e14a450234a9151ae8b318018202c8e3f411b9c28602a059edf81352210bef1bca32c79c7e90649e9c49cbc29c1294f76dc57125bbcb5bd6f97c55b58cdc2b295be18654edf813616b0784a8a3dd317a34c9675608d96340d5e9c38d8d37272c26ce32fb17c6dfe666bcc9c1c267c0998fe1baacb75df25b2bfb161affb1cac31b14d07d60015e02f5f0369e038fe36261c674a48d75aa2419bc07c29e5043c6e4e4a29a594ca8f0341db3cbcc5b96d9352822fe94b8e637989a29aa00c4294d12848d3a5aa4f7cf1d76c2721be2821be2c21bef85350f2a04e9cdb077b04bfee93200bda27aecea236da539086bc95e3401a6e9bdcbca91ee2a89e477fbe06da5800cb9f138922ad484e1814b4b1009e2fbdbf5fda5860dedab989c7480941cc50796017384a8185245c0511b6384a51c50f0c04b3e20b3f473806fd106101c7a025ecc0de51168480b2c00367ef28a8c759acdee1320e387fa8d89663ce39e79cdb9683630535cf9f1f1e3a0c3f013a51b31c122404fbe901f32feff2fff77b807880f8fc38f2e281f22d7ef52a6f7fe54fbc8f38e288238e38e28823c63546df97fce94d9ee4b5377dc411c78a8ae15ee5ad5a145db2b38f2916679d843c3c0d79cb9187e41119834745ad45cf5d0916d13927c01ce71da15cdb75d066480fa17e44dee2848a702dea9afb6a0ae05e2bf288a0845042f422b910fe59558b58dcf5818227fa83c8282194106ac859ab1af4a634cdf33c2f8806411a1bf8c6460ad3a772db8450ae9310ca751242b950aecd4b71dccd366ce0ed9b280767ef284a9105225e11ecdbc63d17c3dd7c126a4ab9db27211923464c4c18fedf53f4b0713df2d089640be5d28864ab511ecaf33c8f1392ad4ea823c2feb5488b79471e110fc9432d46617568c2609f1d73df97092f1ca7008511bc8263d04f0c7345dc4f010d3d534003cfcab742839cfbb9ec8fd805776d1daa443508a8829a41a39e1a2318f76d7170046970b630d4cc151569198dfddd85b37744c33158867eef689b42cdde110d77534748a99fe13f6a8d110c0604d718f97858630404d451b91feed61801d1623188093cb83f05a469168e11ccc388bd1635463dceea9e1f0f093bcc5bde91b7f88fed67cec9d51801d96c8d91cf8f1e16608d514f8f1f27fd5acc5959ba6a8c7a925a46c431ee008a32d154c459d1e546ea4f0562d231f1601311ec2624ec5f2344c759d2088e18c6d608d10932016b8604ed384bc20147fc626b84ec08958035438484e4384bbe0147ec626b84e4c05260cd10981097b3a41b70c46f6b84b87e48c09a213f46469c256338e26b6b8c8cf4408135437a24394bb601478c626b8c927a4e60cd909e97b3241b70c42d6c8d901750056b860019c59c25d780235ed91aa3188f09ac19c2236487b364111cb18aad11b2034809ac190244880e674935e088adad11a263880f08d60cf139e22c99061cf18aad313af2e3036b86fc18729644038ef8c4d6180d0939e28135428e1c394b22e1884bb6c6e8e815657ac8ab88b3e41970c49ead312ac283036b86f028729634038eb8b3354645435c1b5833c405e42c59061c31686b8c806251a685c4849c2589d41809254599ae119244c459920c38e2125b634464880e056b86e804394b5e81233ed91aa3202146265823c40891b3e41870c426b6c6882827caf4909c20ce92473862125b6314444794e9213a909c25c58023d66c8d11d24e94693c6427be445c6364e42c3904476cb23546464376e008d60cd9115f2266c5a923b67cf2983ad8e70eec591e71232e8b7c01fb1ce490b3fc08145186d4d130fe3f128814923df287844519fa8d5b7146ca28248fa396a72b75541712c9cd2aed4e95004ead922e3fe22cefc8431d2d832b6a187f1309123e82a7d481b9972e49724bd48ad8e2540811138b12791884fe00b114880e15b50c9a8408e37409d87f7245d427bef87396c2ec106570efda4ecbe0eed57e105ffc77565fd3e2b777f133dcc5caf71e681b97501e0a2504b2788e72a1581059f455417cae319f376c2d1057f398edf6f0d15995087bd953bafab65bffbd2fab41becd467c1222ea57fde7ba6d26dcd049e82474122ab9bccb8b8b7df1e2e2c3bf70f91717181717985fb9c0c0fc4b0569605e6e5eb9b8bcf0e15fb8b8b8b8b864200949b671442697133a09791d27d471608d2ccb3ecbb21aa406a9433f7cae433fd4203fd84ab46d5c298234d7c524cb5eb6ed65cb4c4cb22c7399e1fb873d7cf41ebe871eb6a7281c0a00bee5bdfeb890130a334e88e384b67b637aeee9cda6a74ff2752d791290a6366e90867befc47e37b1eaa8a44c74d6a920758a462000004000e313002020140c088482d1784028d5b4157b14800f95b6586c5416c8498c21648821060000000000000000200104f460c46872819068fb6fb014a2e054049f1f162263687278b85cce911378f2dfa186da6b2b993ea85df4e74426e3e4a37cae4204f75f5ba18779dc15274e84a8f7461c05721b750590f9d5a7bd2cc88f149f615cc1f39980944fb383a1865f687206286a0ea4d8a5709d278f19402a806c70f4f692a553d0e41858b35a111a98361a118715141ca9ff97de202817a0bf1afd9bc598da55f5babbfb8b4740841c3edadf5eeae85bd7e30f48b7b65e18d50d43720998ac61b7076f47d46824c15250101a93418197746f997721eca8c98c6eca21a94cb2c3c641e2bd5c331ee82b105f59bf6e2ee18be4d96b4cc88fbabb43956ffa46e220a98a74829c7e83e87c5c5de7d62eb475510acceb5f06e195e11623ef8c685ab146571046bdfc3dd79bdf6e70359f99778ea1ea08ff372a0f0ae857f9d6c942d86e4d2eef542d770679d28c27a341edebd374aba33caeb998308b419b4b1e840f0ad6b690cac2b09b8e0267b9be78673e2840e760cfb9463814dadf31f66ce7e23e6dbbbbaa9388c8f76f59342468d0589cd39af9fbbb9f71bbc7cb788737cc3f090e84d484c05330e48694e1d90768cd141354a957c44321699543e8b2d41038b6e77c56e35ddd9f86579ef881464350da4eed3a4468428be72bf71d50bbc637b389d072f503a3a085cf0d15bced70881d4682d844fe4dd345b65c30f2257b0bbed39620db0a1d72485ae9d7156d7b0e1eaf82d0e426ec1167e5414f9d56b6bdb186da31b625f78b366a9840cacb4802f8842778bd9a5bda2340a45af16006805b23bdf35fbae15866b76050e7ed3c0f1ad2280ffa90eb63e7275ad5be97981cfd1d6a018bc3e7fc84e6928064887a92140b4c9ebce13cca2ed0c46102a3775942adab86ded59ac24d8805e2db8f0be1720b25b7057a782cea0c3882d84bdc3275be4b22c746eae010c919a965e8fb3432795fe3b59be78e08ac60ca7bb5099e792e9a02fad0249a37ef5c3b313a29068162d9b1074338c5c1778a26547da7000bc937ccb08a8ff5ece398484a5509cf201c73c26c754a86b38010d7f02d66e13a50647ee197b15e85f50e45e8eb0314c1b01ef6f5018d0d47e8298dbfc183ff9635b0af335ef6d924250833b775f2301f8ca0d17fad3cf9baddd4dc9bcb1253a56633cc85c61a311d036f806f46a97767320c207d48c7a8c3d7072ccb04c178c41fd416abff03d102de92cd528b53666c928c21e77c788a613a266fb2180ece0126da66d01de0008cd2da33f17c19199b1f129ad35f6a9480be599543f654823261d8ba03d06ddef7e83a797d3dfdcaa7365f03c5d22f0d271b258d5fa42619a0a409663e2e2708d10035451004d310d0dd3bdc8f2ecdd9d7ecac3e625d1fe010a19db6e9adfa1082950e8459cb30c8b95e9402d5bfa584beb19da3897142f898c1cfd56719dee6acfff273a769bf5febb9fcec94ebe94cfbf11d8f7c47bf9aafffb8e37a3bd6f6f14f77dcfdfd6afaf695479ececeddd9baee1e303e5abdf15e9cb9ed8cfddcb2b3fdcf07a6eb037cecd3d7a2d669f6ebfe8fcc0fadcac5a5e576a96609ae35d62e9dea8d9d1c1b422a1c52625c23ae2d81657408a7ad221d18c8e922f868e251b66a7853ee94fb130886640ca2e19b7c4a3bc4c5a418ef638f5195c34f9fa38996ff48c2dfb1a3344535b836568b008569268e71d375c60cc1fdd549b6c59bce12599f7a85cc1d8e99c69e1c2906ec135b1e5a0d6c387dec8e609d1068f112d9d89be69c4519865b0cfe5aa89d86ea390e0b238b7a23ea16311520adb9199d702b8831e7218af537177b01af6df21e0a16b2f9c8ffad2e5f226b3031c026cd0f3ec64deebf940cdc3466898a7200573f5941942965631fe8b5ff8513a67c60b996c10bc88f9ee8bf76c63e4656cd0e64295f6ea3caa0f77e178e68becd7089cbaec9e9a1ad3c64fa822db59194e420cf61583e48646124a288ccb08cb324762c601c871c1ef566a247c864b34e7ce5bc901c9f2d16ff8ccce16e861dc9d20e539ab6f36bf470807b3e36877b6c5d229b9f88a31b608cd1611a991ff9a463f347a6fcf66304a77f9b8c494e078a004e87706f32c8065720c4a5160f3b5871ad15544824284c23bf139ab9f267b1e9081f8444450274f9c524f86726198280dfd1114b9368119606e6c25bdd08df1f65d81e93f6fb30a022ab1a9b9a37102e0bc1a1c9066b893db225cd08e34d9a4ca124016880b27d58db7309667e33025f6b3a7cd2e808650c8c0f6242196000f02f3144e1f5eea6b49304a5c8880e912dd0dc52adaeffb6df53b046ec50d485e9b543ce416e1ad2420b21e15f3ff573714ce7bb55cafa0ec786a24844db8146e7f3faea35b3c461eca8169a6bab198a158e86f6577053325da1dc93b627bd088ffbaa655ea1f8d27e9b587ad5a58337a7d32f810ba01a0bdddc5bde3b9b956c52feafd2ae2466ec9b3dc03c11ccca6924ec62e66d5b906a31dff1f463e420c55cb0fbbf0ee92ecec8081252e0b4df5c94304958dc97bbc98b253e9e6066759f2001d71924e01a02d9d9a5ad6e9b3ca8899742810124e028c7caef4f13fcc108751802db507ff4e0080e13cd7443bd43cc5ef6e59bbf77b29b8ed47222c4cf2ffb251981284ce13d8dc24ec614c99fe2ce9fc0c3c5e94bc2249e10d5372bb34599dc5ab37b5a2a8b244967772b96a600f92242d79f5b6a9f094e185e3f3fd33469ee42eb1615af16ab09d03d5c33ff1509f0b8b6b1f6ef25b00c3fdc8da24f964ecc96f881614417ea8a04b816887739d70cf0daec62f91fa232309286de643717dfb97824485251fa03acd53175d43bb0fc9523c3e258d5c57d0c22be5cae37b0e7b7aa65269e34596540324f9ba92f1e189c4ea0d25b4a0185de8bd8130a76753318a502481922c38c2478d224d293f08a888ed08a0478e6b52276cb962b0f6a4885d762f34a29b2b5bd72870a41ba1a8721a4962de9969db5c390e76d11f13c883287dbd33e81143cfeb0bedb50d73d98413bc712fdaa0421c29f888709bbb61f9a281a10a7e4bd3aed1f41a7b2b830e90950bf129ddc3aa0bf52e85db0ad808afd30388bf6c38bf6e67411518964e91f7320c58b08f36d19b4f63d6efb275e1a10e40dd2f0a6bd23872bd96a5e07f514fcf341c77d3074c2306fbf7ff2f4c4a99b9981d96006f7365281042cb676729d0c87e722ff4494861a11f43d5a57efbbb66d768126986fc6fbefc28e71a5db4016c4a3563ce4fbcf637d4a676a49aa8efe39ab0d80d1d30d05930d195656ee16101190ad5679b8ea36e3c9c58b2433a047cc8f4438359226aecdff3e0cc34f470bb125245d7f170391cc6d91d28b20133a85f810cad9bb237cb0183380667a7baee6a4e6bb2ad7505d240b2664a324ba971f7d728c2cd0a59120c757ff77bf6947c5021c043b32d009103cd9fe08f8d450755e8689c8c76dd53314bc9db0250e001d3782c695385360e1b952c03270c592b21c07866897c621dacc3a93199bd972570adb4b5b5ccd932a04008ba834b9f8b0f3531587bab6ed38511b032ce751fa76c9c6337a2558c2343612264d4ea86e5ed2007111dabd7d5cfc8871f8ea34b5eb2d10e8f16160f23ba6a290eb0972c686109a78d1159e44bec103f8a655b8e072e12d3030fe42140ad06a95de05960099859de4392a93949768150ba0586882977f7786f5e0639696ca14775e3b33327913c5b791ea328714714f68a904e1b4777784998fde18733b3e13824d9cbd05eaac48693421c06906ba7040554854b199dc9a29dda915024db2106d0f8263c23414bc938d4ab20bc431eee3bd730bf2bc4fdb90b8ad4f272aa4adbd163c761f6618254d4731ecdade6c90b06578be6fc2dd10c72ff014ee05460e0f4037e90368977887e0b4642a2685fb14c032fa965d9ff3aba061234edecc075af22b3e4e649e9a2304d3e45df43be9cbab5fec933ecb60434c00c30d7a16fbf00a0b4ee0e5ca0f2701dbda4c14e9ab8e499f01c1985bf0403154e6f830cdeb813359a487a99ef4592530e78f2a73f63cf831fafedd68406711aa44e583522ac39846ed6178ec7e9eb1fe940702c263ba26ee2b776e0d058d19ee228fed785ce0d9802f477847cd32ffd089316eadb3cec49dd8480163271d3c39bf5989c5878ccafccdd4fcca7d6a0137ca322d21e5df8cd287ac3149e04630cf7481c85c934289114c40c9af53c91d7bcc47af2669aacd0f03b42bb3b9424983c5ed3157aa6a17609265c6627e284db9b921acdea9198498f555e9fdbc4432dfdf02064c62246b72d2ad550d99c7e81a74f985e75dfbbdd87dcadc50e6556e4d95745147572aacec2f023461c9c079b05512a694c7da6607491420a9e32b2a84352ad47196db24493e1e30da60a65ee1e9bebbf14e6e5d9a6d067e5120bb7c576c5eb7233b4edb536c2890afe5a626f84c7218e40ddb88bbb1033f4f855f59bba8f4bbe083ec55f75083ca094d5623a31bd907c6e52fabc23ae6ac23348caa261e7369c6cb6f0978c95d889b9b9dd0d4dd579393d7e7de64900576b1ef067596b39e5aa3bcd044db55a65d460d6696442eac2ca7e7c21bdcd119a63435e0dd67670d5b29d0c030e5a2a0e1f8aacfd7039ada0d4c95f2c2c438d2ebf6103d1a72c57d07e444b6e2e50b966c6137e7bb64b0a56a6bf3a8d9648f075842c96e4c72779f684f75fe3aa1f92e445eff174d22cb9695127502bd357f664e4545e1539aa8dff3d6d733bcdfb61bcb87337bdc52fa4d67d13db896bb8d9c59b5a44a0ad1a473898fccedd2848dfb4968a888b2c15bd5aac31d0e25b6ae4c5a554b22f0279a6f49cdb326df74335e35e01513892a1731de4b4b261c276cad33530d5afb7f196ec764b28fa0eda44d417186d50fb49df168cde17cddae510deff6d699fade450e6802020ecf74a6dc7ca80427c8db9093a7b631126408d18bba8b0578e9b1984bf670a2410308b4b5c0113ebbb355af089e3c4ace2b6aac26a0a6a5746a83c05a10314cf364da8830d2fb95664a4258d5fe56ffeb7ba9670667549ba7264f0eb80048f6ca595ac562bb619fe502919f94caf5126713779226ba2b50342c305a30904406f6c89f258921c65befdf34d08de183bf4c398b3cb7580745a6681d72a3b4347f6696aed683129cb3f825b3b74fc37fa6b4875e3a0a9103e78504d45d73809160b10003c45828611d3539174b454058ca45b3ae1157484f87902822c2b3c4f8b241c3fde45df3b12e164dc56b629f0a380ee1befbc709a56dbb3a046eba6ef14f297894ae5e79cf00d1cee9ffd135e189405d2ba7489fd602e95404819ea2c6e84611927d5e1a29e4f8152a1386a0a6ac69cd88454b2cdc88e10a7e4f2371852fe5eb3cff1161536304235d0020af05d83439e6e51a3bedc68a5cc77b9550be1a8ba5049a1e73c1db7ad50f50d8c42b570d99b5f1f02dca35e7adf5ca4cba5fcb8a6ddc9a7ca4789935c0d358f18f34f931d2891d1d2c73212032eaa8cbc59ee426f4b9a6da387d45f4a1723f3ba11bd8d67c79333589682409b4517f560784ca548a50bd0a4cca4725b1a3883da59d4e7548be69bfb8f90b1b9864e08c98b8222095bcac3b0f1173332f3668e440df34a46a3ae3cfc2025080c4db1a2b93abdd090dd090c5d2bf3597df4fa8ffc53b5af38858fc15f5f4724310c14478b1adc7672933e629b13e5073ace50db7593692bbb00146fd81995dc871984eb4a9d1a803b0ae86509c750838f4a58c10a74b56c2e41a87743faeee805927157203e57ea18cb8b20869f34ecc8c9678e2cec1306ab9c93a5ea85f2a6213e418d5f30ed44cf0d01e0687179e17f284bce67320e0d570e8a52fac1088e1e0bbed82ad0c51b6fbce8a45ec14a2bc7382c26d24a470f6d0967160960a3f5789b7cd39c374793d641b9002e5befcb156b6c7a8c12d6f0f54d180119958e55bb10d3c2b5924cd64105779488bf4d31f9459945ba24771d3c489c880891deb09509a6a100ec0c4ce9e177c9be68f1c0188841bd91843169c2d6a39f11d03c841ea0f759411578cd3eb0aaee20d38237f418f482b118ae3c6ac6d3067ab54e1437301f4a8e33752c739f01622690c1ec42033af397077007a0c5d1ba11cbfe5e57a2877011b381859e148d4b6bbb093f56d58d0d351416e5f497a74fabd868cc5be43449371ce51ef21a184e50c5258d48a675636d1d48a104de6fd54e347b410fd63077de3e218ce95e50ab057c0bdfa22af7c488ebbacaaf82b88f364848c0b408677529cba46375fdce99619a7688ba9b9e62d96cb65291d3f793b51a033a9a7fb6eda772d83effca113fff76841efd9ffcbf01a03522ea9d82b8798e6583f2188c290bd7fa962ecf8e57b323c5cfd4ac63ca4255746b8843ea26f6772bb287efbd7641430063016b89fd48da5a9727ab8caa58b0e83263d3f87c9ea7ceb09cae5826b20967d9dc26c819883592411b5261e78d4756b4da7a4b7e5f10a407dbb704ae122c379e4e1d3e129954f6273b04d7209f765ef3c8bc44a009456e1da98bea4c4555f3889b94f48931340207c695bbdec93ab23179d218b5e9c264d846a48a21b5279262f832d78f382bd057dfd21ab5a7929bc460ebc34cab4ddcc5c2f43efb8025d01da84dea6a64a273b0f5a05fc63ce863f63ad3cb775f54d7ec60088c0bb107f9dbfc5f63b2a1580c94ab659830f9b7cbdef3716317fdfd31365f051935eb75f6df21133037c548138e87943dd9e4d60f2d13b237f54e13868ceab7401d576661b41ea2c749f9f969a3f7c1472a3318254752650ee1e2d54b2525f7e31e6e3d803d6ab0700037a3a22effab36131d420d64821052dec3460ee22af46041ffc0fe22cabcc54c55157b3090d16a4b949b29761d565d7774b85584d881425e026e1c8166ca6c914842745fb61ae454246adb1679162742fc207104b2203a44722f83d7fd0624e9ab68592c54fe1ab3e2550faba52c8d2676a4da0044bb8935cf66ecb5a7d67597e41f2a6a56f336a674813a3f10eb49f03a74ae35d24ffd2e927c150751f8b4b001ee514ab37a73d5c2d6121338cf4772aa3d8ea17798a68911dd5dbbb527f0927cee515c335f3a52ea166a344a582a25c29d6de08808043e48dc362ff952b3dbe0271943ad769fc771f290c5ca4d2352b770f62e8ddb33d368305b1d16633d0954ab26729839271fde816c70b00d8e89c4b213b403bfe4febb0bee3755bb600bafc96cb30be38cacd1cc1e21afb6385064787b34ecb8a65b5206c920b103a1b0ff8c9a129547f4ff42b5237141a7190816e3acb039d7f47848af536f81c6bf5dc2dffd986220563ea9138fecd89c31bb1073a4ef4d027e1336f28232dc882f17fa84bc7b60017f0456eaa07386c73dca970ce14547792405ce9987296024e74bbcd4b78052137518b5b66991bcbe942a176e035bc4f895eefbeb760e2489c4e5cd9df1a9470f4661865418480277e4d173bc81a9791c77973c880f2214e6f51e8d829f42a80cc78e07ce960d0ac107e39fc2947ec1e553c2be533939f845b59703e44dbb418664b84ed40a2878761ea0419694b0786c9b7bcae52136325fd50215c0f37c3bd457641176bc4e35898a745fbbcb8ac13a17a3246b69806cb5d8d16d59096f6bae9935679dfd99478a5a1fdb4e51d78d2757cab4c9ad339fe57d0010588940350d5c1ca8dcd25cf1683f2fa3c83c48cf1646784581455f1c2574fd1801d61a1f8cbbff4edd5aee8eb66cb7764c5bdc288873bb775f85e4430bae20948427c68e7007f05a6051f193f3b5e6b20ba707896129394cbb0680ec89f9a83530d088b667b48f4019495b3a1ed1d1e2e36afd2ca5bc566b82a7e870b15dd2ce3950cafe66979de9e350b3a2b3cb8cb5a592d09f8fbce70fc87ffcc4b98c8074f98a144446eb624ec08673d20e5aeae06561979fbb03e0fde258179550b2feca19121463368a189b26a0a8d4a90a3ac3369935f112b96034a2e1e348db99f715796a836cdc16ab15dcc61919ea3d8a9a565a7312785c0753b6f93eae7485d941b78d5d398465657f093b6312887751a95b05f0a5a3f1c4b36ac7e608a7ec7b2db00b5dfa074db3e65aebd4ec15c9b127aacd1d2c056a37a3a49a7d507261e1d4a2ff12bfc7dc780e0684f483bb816a437d1aa8f7c071f91d0843a9e22614066ad3a3be35b363ec017a48065349157ba89a0ca852b3a1be935df537a948867cf4ec139d328909769a42fd6b77f9293b597ac5eb25476404d66dde8d232325abe144514643a8533106f9156fcdf08859a36979da32a8c1001808f07407017875abff2f0280ac1288a98340ce584b844a323af3c835ecb91bcd17624e213e4d9ecc5d5cd4d8759e9be297702feea6fb7a70afdebe3e2483cbafa60bbd066fbe69059199ef0ac3b47573b4505d8ee83169060cfd431a7959380e228eab0a84aea3ba709e79f9f312711519874e5fbbe30da9ffb9db33994ad076ab37d4b6bac93c0e259a7f8f163fddcb219fd91079a08f31fdc2d83f704332358b8b84784ed604bb4fe5f0cfb582eec629ac316d6cc030c552d752f26792f6b79532a2261ac43f11596c17e9f8427122b406d7c0aee043c04e2361e434cb0ec75df23aa13b0a3398308f1458d06b585010b9b407e7cfec5616eb83226c815cc7e91b5f31dd09e4640bd715ad43010a744270987d42a710cf476d872a7b11095bb80605c1c100e6b9ea23c0052b8c0b746a914f8634f04e9c51932f078c2bc1b81c478698650472ecaf7165c172c8af5b22e8dc53a69969bf1e8c8e1ee804579a81963fdfb80ee0eae0842f9316853d5a0d312bc084240b4b6fe5381336dba0a0d7f5ac721a8e3edecc0af5f2b6567b553973186dd56db37ed93e2437958781640a87cbb9791da6a59efa6824b54821d88443bf4c634ada9a081e92c5a5cce0c8fd48f1b57dc64437b10651151393f6542e369aa21455c02aa406d133591cad37eb9f2c6f45478ac7b51e50d464881b630316de6554f68c2b7d85cdad1ba2bf2ce7469df4b93f678e9a79db6bb22a3755be4dc69d2be3f3dedf88ecf6a74ee14590f3dd09bbdc157be5423b2187457e43b74811eecc8ee8679110af3f9c5700b34fb30792a8198455a41bf8722e8bd1dcd22c1dbc8fc3a1aaed60f01b2bc1dd1b21ffa8f1ebceb22ebb09bd446bfc700f26629d1d75a8bc1ff5aca810e9b27447724390585380df8114a640f793c4a6cae760d669fe40ae6dacd440e30b6da39ba5cd7a3f8f2173eebb7652f3dcf635a944ac784d890d6c57bb384669b5e6b9ad8f85737b11693e3466407b4d74ad96d82bdc64f67d6a151225aa8b081b906391ee6484605fa0e22f0041b958f98ad3e2664b787424e1fbcedcda13c85b7176f3c35ff8ab70731fc563feb507e1e5c1e58c04a530d5b6ba105e93a3754e19dfcea3ff05b26f4e313f5cbf6b329f766e19da886c272fb10103b5141ae32064f294b43d2ef511ebf743f31fb72cb5f83899572da03a4213845ae1d698bb12993b13238e3e5ab6447e218e2b519fda439ed422d47a018d1e08600de708e8ca6ac025dece0efd00c1448829f430ecc1ae73cf618b71fd77af26032d2bd34559b766a8a75728a6fc9eff073dfefa312b2213465f5125a5c811d231a4050ec4b92a88a7d13aee1c55925543afb7013c87fe113f62df3dfd3ad55665cc7d7673e7942709b8886cce99511c4166c9c70f4ae115c5582d72036ba2f23cb5108989185dd4b1678ed6567e1f88aa675d81c8006409baeae83c74b78e5d979fdd94a1056962ef902a96ad01a2fee8bff536d00d7cfd0c2da43b80734e23da1b6de8a41b7ef1de41b1c83b6d9e4fd4bfefe417600618502cc08f5c7825cd7f3e643c912104c661ad4e324e8a830a21d2dacd8c1702f29bced42801b890646b9cf295748be06c237b217750c28d544b4028351f0e6799fe9d93d14e312c4eaacc20e3a9577e9601d8add855ad3aed89b689b6ee9c88fb13e1f71e8f462f319e69e8edb2304bbe7ef99fef4664324779fea3dff8ae800b1b76ed85a5d9a640ee9d0f5a60b4d630e1ea2ff85345f2783f429ca75a1397be895902d7474b28b8f8edd587fa63474041a9116b20e58110408c6a3c3c570efc7391d50d8bd667e723862722e30a2762c5dc195b2d7eaf3eb4fe25fe2908e691d6caa709da68de605256916a9ea564e756d9efbaf57ec5d93ca7eb15dd56909ec77bd4379fd520121bd67af33f60bc4dd6f2cb68bfe9a767a6658b0c687b2c3da424cf3426c8525c92832199cea25fe937a3f4b9470c7df40b6265f733ecaa1e23db0ca778e2f80ca76af2cc4a55f4ac232e2d00797111760455d066c283f60a5b3d1eb73e968b0c7f166bcd1c14dad2e5fff53e196ec4849650a62a6fe21db8f5b47d27c850c5df383fbb5f6b76fa56256e9fa1e5b5c0acc46c99109061f732254c666ed72a5b9332f271e0984dc4a4084145ef8f9ec2008865f214943aeafe356cd7fdfb65552ac85dc6781c2eb6c04edfc183a3956157710a5972d2a0e2a9335d6b5ef9a70717554549aaa08b19285784f31178b1e14ac2832005338fc2c36785c1545d5ec5d6b591b665589df800239f0febcca26b9aa8c860bf36257a2428fbe1fce376db1104d6d985adb1cc9172405cf79cb100de842206859a8abb01f3e104d969e6cc5922d309eac40f612e43dec7763c5ceef49c1d62b3f12ef228f1c0ce381a042f0f0a7e08197c8724eaf1e1dd3825e51941b17d8d07d74a6168679f47c26ef22e4c59219a777393887e459e177342d63004cd71f7167c652d110b485ea73e1d21708f97b3c88470e61096886e1f309da2cf661b631690c19f1a5f0012bab3a1db1dc9ee84500c9288f48bef51b0afa5182759369cd67fff3eea19637b3e52401a980b98241cfd8dd6a94e462069c75f2bceb51853fdb2cb2e2f19cb7144d357916da444a91604653608a0e2476dd0b44c18e5af602765b5f90e201431f709a395796c6464f1a53058146a830966320e7a40942fd34d12dc066f965830d10b8af62672695cdc6e05ed21d1bf70d515b24d16c36730d03ad095b20847092e646908c1969127d2b574a9f67cfd83af170e964eecbc7fd907c27cd87c1c933be80544f6edd3a64363abe0411dd1ab7028d5bd0bc5c5b7ff1eff2373e7237085c9e77c4472c2d9e5ba98032cf4dba063a20f6687d4d8da9036a0cc0690ee4feed3ca5fb33060a1b7026b7cc67ba55a2da776eaa1254b5206bd2f0def408f4437646a9cad2da6494c6b81755c19d7b2d1c27c151d9d0041d9c9e58474ec4555e99e3c5aa221f81db4cf8b1ca09cf963ef0958a119c232cbaee0dc0392c807051a40d96b6cc59333ade1baf6dd991aab3285e8a5620cd1049634f8968f471cea2a3e4105508d934b82002e01c3f1685122404d2bc6e5c5ea7bdf3a9fcdfe7ff32bb8de268e5ab33a696c6fcdba17d6f61ea61498d6be287fe10311a87f0f1ff6a19575c110827c4d8749015ef0d6023c08d741ce148f1f41678772a20b2fa378c1ef76ebbe620d819338d49f3720fa81eac90cae260a2ac259e30afb44ccb9f9f41b3332b2a76387a219b6bf74ab3f442159f06f773810eb4b4393b88203668fe868ea22df2612c0a0ee0a98204e02d084590bb933216817dda6a16c105fbd744308a5a34b0dc330b1729c60797c37d6f7608fae3663eec1678ffca433365728e161afb813b21f6de49edb17ec449b5c50b60e4c3fd344d5ef3f656b95438eaf6f771f202082381ada3eb3ca272aa78c967c5713498f85861756ba8763b259ca113558a5a084a277b824cb3e0c766e78dc49b7b0f3d625083277f560e5bd3cdb839acba6c917d749189071c798874f568a5b45158f5fa6546de1230fdad800b37d2f1e47f38dfec2e06bd2621d6db76af36f8d0af4a9ed1bab0b0271aae5aba12a869480edccbbe9d6c7178831db1e0f4bd6ce79a20599264dec297ceeaf6a74929ae7490f9c9262cc1fde481b8f40dd17428ca80679e7effa6a9fca904f490968ebf40ef25659c8b6d25610178e428326405b49fc4e59a9f26824c71031c9dd70538e5d32fe6495b61c923ed3ee48ffe907100741de9556edd94417f4ff02459fb5bb63c1bcf11b86617019e5d4a2f8992784d91874656de1fc463e0ed4377d39decd6ea3cb9012d6b8c53c328c0f3fc5b200f4fe2258136f64445c3c1037a4d5a46aa9aa208fd5c5aeb99f183379f1156c10a50510864a76113ebbebd74c14d55aabc53ff3f81f72b18bd02ddca2acaa4583460ff5253573466ec4e59f144a4f13a3def5831e8935ac4893f18a581b0dc3f3a17f427796021fee28cf972158ed8e039aa2f21b5ce7f91d681b5181fa431964b25b0d7fea64e8217d5db3ebfdc9beadb825e5cc73fed692f16a1c4be6eef598365552f44074b70e7d59fc3c697964f0c00549ded7a99417ddd03430b95f3f6af88e1c0cf1d501bb0eddd6f9016aec2c95da968dfb38838376f96c3cae8b0206707a70741bda6ecac4f4ce1ef8e90a6a85ea5885a3e5e78a287065cff6160e1853263ddf5f22bf905f3959391ef2ded811518346e38a74f2a54b96d398b00beb0bd0a71c795a8d1075383a29662c6f09e70cb4211a9c152e6b46adeee0e1b2fccafced37b93238eb09b7ae137b625f0a96e6bbe0933968282a3795418e44f8276918cd9f09b089187dcbc98cc14b63d097a813d87708f873b156fcbf25c1dc93f3d05022ddd2bd941979f365e9317636210e28be3e3bbf153c0a54722c5a4c613bd67212fe6ffef41621a2d8fc51c105a398c4e76deea0e08947b108a0f148bbc267815a596bcb402dccc00586a812115f4cc7e53d274274aeabdabc98c10549af03641febbc5e35ee7a10c8682aeeef3890ff9c85cc3230f35af005a6215b1a3b8542bee5169e07376f7aa7893766cd7b6bf0bf73cbbee7d12b3d1f2a3c3fd17f3611bf1ff45b3c3a44315a782f036ba7d17d02129f7291cb3d964e0706dcaf6c4836f311654bbf0fc15cc2a9ebc11e572623fd1a00e923c40000b4b0cb1b7f5d5114e0a0c43599efebbf807997b371b8ada562570a02fc228e978abc5423c427c8573d0de878f893790b2d575cb9a4913a09e575e0231e3507591f39140528ca7d0a161f74ab6193a6f54ea77a3135a63bdbecdb2bc470fdabd0fb5c3b4ba14d0601b4c83f8be2481f02935bbfba0671d30050b6fdddde111b1119f381e009cc18cb6415f3a335806d3003c078d29453b1cc277edf433b28d5baa0a9b11e2b82c27106d12b8d73e0899cea9e95520e0f3cf47912b904ab0263f128e22134ca6950c64eb576697f48a6929054b655db73ade2633f42724d8b82964441fb407a02c91533ea143e0b7e5b625d57719f7a05a63f9385b1cf0fb542bfd82768ec91bfa17d38365b759dab0417432d4d0d1463dd20dde87b9798550a45efab020bd8e024ea930bec54af917c2a58debb550bfbde25fe27ff50038085fbeb824fe2c3b98bb3f435b2620d7c8330d3f482f6bde797dabc00088f539db9ae4e1b71321558254396a01fa7ee4131746fd6d45fb18fe8eb5f25cb6290426e608565b4214c61bf6b386d77bbc814fa25c862deb05af83800c3934933015370b667c619d40679510bb39bbf08e9684d468eec8737e4b84b4a25b7270e5972a96f28a9f959a8504d96d7cdf6cc1c56b818228dff569dfe475e5cc51bd7a274fc98d89c8ff38b25bcf94696346d109d2fd85c1988afca18b78bbc4b654db04f85d8fc2b94f789612b5e63978e2b5097ec54cafe64c7457af4e1ea5003153cac7c73aa07a6a00b7736b3edc39047ef3ee035227ecfdf76de5c5005e91b5447f6fcbda61ed63ec0fff16388cc6d0e43aa207edf08b77efc77ae37364f5536c1b4a7410e605ba6e5c79877007bcbe1f2665d1e4493a89c6674c3dd4d26620cdf27cff00850513288cea85d2df64a130c881fca2c0732da7dfef0acf557bcb7275a880de24fd699a430f757b69228fb1f3575712fcdf1fd2e9abfc6ff78a56b116149a7447503f49967774004b20f0d1cb6132021e3ba57aa1c3ab4637ea920b95b348842e18087d20bed6d6839c2c7babbd746c123d61ca68eedbee9d04ed638e2e22f15ef93a0027168fbbeb1fd81867f59e6f017e78c91f81c2fbfa7d9be2c255c05c947c0672cdc1f51e8c1f00519d1dc3e1368ae5dd0048bb01cbcec8ee65ed06959fa65fafb53f00d8c60d593d4f9272164a9983bc6666b929ae27e7d8b92aa4aa47bdcdc726633a41e84c6bd89042db7f89337156586b0c2ff1a58ff73378a0ea8b6d1cb27022596bb7372080fb3b7f69cfe4f49534825ed6ad2b11bb5b5e1cbbc072450a8094d27581a52aa90eba59329a69d4efebacd26d6c32d7d5c241937b3192fe97205188e2a2cf1676edc4c5708d70058b356f696be5a75c9317240444667480caf581f9ea0b4a1e8c4d1357237c82a8c0355209ec6891979d5611d112042c01b5df984564b938937992e47d6cd9cad500b62b8d986d4b22614feb93635708513c2fcbbccc784c8558e3b1ed10c7370ea4edfb15b65fd171c2a6f44e6ae4b66d3a839fe70f60290568fc05704ca2fbd164967415b46342fed39814c3dbc862726ae6486e53c56324e91625143b5e8b4917dc1243bea9f6cbc55c4a5aeab5b4946e261905a20ea7012a966dbcc75fbf510fbb3f3d98d21a058b7429400ddf823324db2c9cc89ec9f33b3a0650e7b63c9583860e02adeb410001dbaf4f19f06113a145bb7070365abcb8a5f32be2775781adb00e6de5109c30140fea98fba4db3a598c5d30f7d468f37a3ff53c20244fad4b53c35862241e9cdf94e41f51f88040554e69a9921451a0518c4dde47389d568857da31d397b0cfaada243d426499d9e7865e4e6a584531b1a52c9ded76877491183aed3c18bc1624e3375725e9887f759f3c2e97ec2f66c9dc501579fd4c3bc5901f0ab413331d40bbe8bfe4f5c8a56186efc1f9b1d9026c9518d68e910d37a79c9c14651a72ea99b25aa760424a1c8ee6563c835e040c1ec4a212a0acee487e2957608908b50d3c68b05aff03ff9af80cc4609a8294dd753796e2b01f585afd4ee377f0579eead7d6fda9dc1b1236881160461e91b13157e337e6e38867ff269b4984696837dcff8ba2b5470939863763380df4374399f536b3c00abc4abcb7826ebe6280af46eb36854be82390abd82bb02a0846c52b5f8ef9a806775d9b08dd7b372e2d8b7181286f766a4846b5ec143e3feab20928e947bd542f32bdaaa1e92917aa5b15661b185efc80592b4ff0816e9c17d88db04b94be99ee3eec92c7299ae979485a3dccda4b26032abe06aff8c45d4595bcd9c2131c6356e96891dee38ad7e67c71f32e9b1cc93a195354a334245d5f1385bffc29a52598dcab17dafd28914a4b342985d4d9b1ccd0fbcbe23a502708ab19095af549d86eae13df2de0a7176ab8c39c319d52054f0e4bb58ab600598159ee25ab7075262ee755cf8946fa3a90f21ac6b5a0a9ed56213a34d4823f10dc5f16b6fce1dcbe136779ad55b28c6550f74b28e1f630218748a98072b80745ad0fe60afd28e275e27304fc8a3f0d2daa9dbe028744096847093f754b2221646ba6d6886080b64cf59afca172fb41a450395d25eefddc2fdce38188ae5a3969b5fbea39ffdd40328502b1ff83e1b9fb8f4fcbd3eab72fea5aaf9486e9f5889bbe16388ca3a8e274e5ceab096311d581e12b4e0bcdad581da26687a9207226350525552c58bba53c3c500caf32f46d609a08c2d73ef279aaa21c78d6549c1985a8a6179ea38c2836d842649df07ca19afd97dcacf201dbdbd068c40ed5fc83a228d8fc409291ab98e7e7b7ac6211baffe7e2124f05ad44dad7c34b72d175e3d4ddfe473d1b3c6eb45ead97835653a25901fda18fc11f964a6074da57a11389dc0572ad26241d797e8eb05728b1a9719c27aefccb23d04b62806227aa463b6969c9405d6d27c53de323fecbe4e317a60eed228b23df6ea024a70aeb69ea6299d2c7419ec370793a70ec82866303ed037a789124d41a5d9b007f0974dd0a201c26c773aba1a9c7620bdd97cd6b9253f62549281180c771343c6be84b61d9766a2a5cf948273793c92a66d4315699bcfec4cb1b2e8febb3eff7bb3d87bd900d905902276e07a8b6d2f263bbc73ad363cc26f02b5c123e89e36718fcb4f97c3e651044335ddcf930893e6a89d07e8bc6a3c5365eef94d7312f1903ca07ca25460db077eb1cdfa94e92101aa452c2fd91cbe00f7072211bf7f14d3d8c5bf158dc6359e2ed3ff754296df335ad437b77f69ee957e8388a9dfcaef6521819667a05cef193d722be7da3b097c039a25079417d48f46ef505080f92c0f949b30d556ea1b4e364e9a03040886f1cd3ac93083175c3b4f60c69ed1269199a2a38dad26b7cd1410cbd4987f1a5093a4d81adc28d7a0cdf34174a6eb008aee2fb49acdbdf41feb53143ed0fbda1d752e22f6012cb86f27afd5d856cf2324187093d0d7e22942ed5ff604c8c9a3aaae0b4ddaf9eed2605ec84b69cc09deed743a773067cad190f8ad374d177b03ce5dcf49a7f250e09967058c880bfbf87ac9f8be96e86b94c6d2caadcb00f163822bb4670e25151468579bf993b7ae809b7f25eb2f06a61bdc8bd500dd928ddd9ed61ff74541d69bf4087a6576363e350130802236fd69bc086cd074614dabfa50b1cd1b209be7344b1f7bde3049a6679f94b2fd20845ffd94be53a36b845cf27f94c42418423f51a71714425eb0e1a6fe17598e90c5f1573c0029c0980c87e16235e013b8e5c79b6975d889189a94b6c852cac62b3a4a3a5d382006accf95430bb9446b78ab00aa77cedf8bd6153afea39eed20144f8d29208b301c8333b168e2edd0f6f5bd970fc9a9607b838e105bb36213321bd14b27abd023eeb67f6d1d6cb1b6ee91d7ea001820bd1b1015ec643ae67d8b8abe338a78f684ce85b8970c18911455826f8dd037a47c0beec90e545c81a0cea9cc733473121f9100e02be782f820357df2896a44952e84aec41b619fef6db6062071576a1e03b326b4e7048552ec85bb04bd71c6945a2912c22d2c50937b47ba914effdc9c8ef9da6ec73d256aa418a1b086e25dbe3da54b5a1b87b446cb83c10cc33f62d3e235440941ae471964090744c6d41f63075a4832fae6f79807a05f8a418a7c34c668ed4cf2153d88d82408b23f9017b380adac112777a02ee9e3077501db5f711597ad0c2a74e56c4753ccfe0e6854fa3eb895ff404afbb500a6456177e57f9c128b00e94aed6892bfafbce99266fd00d5574ff318a58fce725d20e3611c55e55700560a2c0348e78bf8f4afdf2b2e641b6f021841e57a0cc2d8f4dc7e84e8f8f682cb974bb3531c89acc6dbafde2180bfd97cb9348d20f7f13122fac4878f1c63a412f9b85393ff22d02060e19e92c43ec0c709a874cc6c3edbb29a65f5555361a4e3091a55565ebda0df04530c761c3a07115e0a3bc393bfad08d1f65ee131d844f7c112def2725be109681cae451d1e1d6ca02d5430f4fd88f340443fd4102cc1eabc4083fa9eba2c58cbfa986b2a765019856e5af990370e0ce97a48d3970c8b604b54ef17f228ef536b5dd8f470b67f95f77796d332cf2f51f3a94648878d40e6ea43427b55099f20135d3dd307e7c5d150830919ede95a7dc8094cbe9061f6954bc402b7045d626c6e5408227167320204be74193237b7aeb58b4f87c70c56458c2517b0d26c03aa2979be309f4b570fd4213ca4519637abdf4889c33e88ce8f562e885e84b0553f571823404b061dd63d0cb57f27b08ef3ecfe1a3f5d3b7c26260c3ec0568ad06fd35178b03edc4e53e025486d59385025ac57b35a8bef1c56772df8f3e9f008ddd7170c00f5c8adbb79d72ad111462506844f3f752f8f09a6d30be19e880c1cef9ad9116ffbad58323379e848b8610b702a7522a2ec3deac8e4f90833c7337daa562d468894e59076d836c2ae6adb85d69112f206034c86afc7aa317a9747ea1ca45a55a4c701acde724bc2bb17f83a09daaac6c3a1ec2628b96d4484be71bb49e190035158b54f2455ace98cc0d7fe4d6c896a0a95eab2a31162ffc2899b22cef0917fa47ce1cdd42b818eaa3c07e460c2fd6adff034a30914ee5cf9057ffb19ddb4216aab4ceb351de719bc90a0727f7b147383f35d607a207edcabcb2a3759418139644024da7dc0ea5b7ccdcf1e8921241eef853057c4be619861f68709687c9d60c5b96c5e689a9866e66adb6144ccbd7e5193644f03a4ab2da3e011dc3ae0e838f61c340fa0598aa494389f50f7d6be50d998522e9620c35e9ff8986333276ae6c96f34da13b277cc36281d64f647957e66b2d47b35060510a7254460434a5170030fed9dd1e5d156301b88b2aec8616d9f5272503668413872b96c05699aecf7c10b3b1e1361383bf6526f19fb133ddf4269b2ffd267e56330649ffaeb02dbc613c2a927206aae65156ec8c63e38ae5afeac19cd4071b7187e79029a9041da4d033261aee310279f0789e9d1d3b853dc6c5f5d5f8220c05b3f1c69ff38c354cecd536e9bcfb42e32cbbd8dcf80aa7629528eb81eca61176e83b996e6a59d2955710bb4df930925a6b38aa5df31681aad7f28751b160b3736a5e2d5710348a71ee7f7c99cc954869ccc9e090199de40f33cf7ac5e0ad83edb3fff8028f32d92b95cfa5733d090047dc9c5639dc6641b22f7b2c1a2278abe784b9af828e1bdb8bfc6aebe1c8039563330dacca5fa2ceb68455adf8c3a283dfb39bb83c5382fbcd7e23ee1828a95b5d3c984673a5f31f221a14fd51e5282a05a3792580e2f38514d9c95a20258299523ab0e7500c918d22051b61c4d391b394380d77264ff68e23d39b03e225a3dc801e67c144ee842f4dadd92cc4f248de1bb7a9b8a6d7bd71c75f430cd76951f9af6d881e44570f01d0fed9fb5bb96f76fc1eb88f4d5fdcc326ab258e98e7b8cf50e2344f1ae180a0ea926d7ffa29029928e7309a54cc84aa26a89ad0719bd29f77a84228bacfd540dca83928a56c3cd900544b37044f302630077a5a7358e1a6ea6a79b6626b94ffd81c15849b2a18c281bc191f22a8cb04c04f285d29098c6a40d84ada527d6f984b198c5e5c1d9cc40d37bc080057676b784f4da9c8b0a45c9222e2d2c8836dfcd53cdd9582d1d499d35eb6eb289d3f12252953809a91cc273349411e51907405c88b8913d8e385078106b808a1280b868095a1cc5e07dff7c1c46871335aec1c1e9be562e4d959cc0687dd6232587c1698ff299f7be9410d8bf834ad8f99bea3d584e17cf6ef97bffd9ef21793595584698af533f6077a264be88195bd4a1e43a660013a763e6dcb95acd2db384413fdad93f8b47b6d03a3bed994f40df71416e4600c729eff4103d38b37247c141d0347472113189e6242c5cb4ec1d4a68da7c6abdbd17ae7dc4602f68d6868ce6758b90454218fc5e61646a3b2f7d257be009bbe3f18d361d2f2001b709111019f8a79f92bb2dcbe904ba4fe8abbb27f252d4b74fd9e79eb5dfadea924267537ae9b0f26b7832c3f6351a3924b31f8c79686da6d7de7b13c63ec4aac2d55141aef6eb5d66dfc58d81d55325be49d49247699267b87728780293ee2bc20c12d6a01c80d4eb6a3c0ede0ba771fec9a22cd60d73c26be1f3e7f61b4c61d7dcceb7fba2727acc726ad0840b3a1268068b3734bf7ae54db4b3e40c6000bab05a5ef002b1f1284c6350d6075d4f1e8e0b192507fef82e14e2ae250fdf8bd5b6421854d2cdb5cd145e487405d55e5e022e44fea9b8079c58d034d46200fc7a0e29d8678204b08ea016b6f28790bb247873017fe83c88debdca1727ecdf8cf804aca12fb9029df51a4100a64dfcf284978238c96c8439d4980a540503992481bbd0096a092cb648f9c6dc493ef0d381b96e6b80dba4c48ac21d80603fb912654576ecf405c5f12fbbd3c55e9a636b78e58552fb2ca83b9cdbed91882609b4b7f69f185f344de37f2ae614232afe848cb33976e66c9178a20088c54b3bec69840c711950ad2d2073313bcb7e72eeb567f9d1218cc6136f41ba15d91aedbc6a87e0bea6d05cb3f257f2f7c3798b02edbca79d5f5568521682b22c540b29cfd93d8cdc0ac5f8385125fc84972b1afaa7e60671680d54d4dd6bd312c4640c104b488137dbd5e50492961ee3653896c262fd99f94653aa97b050a07ea30a4cbc291983c4bc4974497a63cf7bb4c294812c69206dcbc7ff65c1bdf0a9508177c85f10aee3e5ffb95a7560d18a27ad9d9eebe1990452f2d1ca126a281e55db6d2349fd615f19ec1620d53cbf87c0af5f57729ee95a0923c6b109be9061be4d9bfee05175403028302f4649b6fcd8ac284e0e792bcaeeca7de41bab46f2367084d95007ac243ad25e1be4d5cad7f68ae20b354759f745f6da855060d00d26ccc9efd6d95498e59caacdc725cf533cfdb531f8f6b0a5c8e96a6e118c7995f43c4ea18d41fa7a298c8dd8a2ff01c0f31d2ef32bf3911c5c5522cb80fa2c266bebd2e22c580419228346e3e425f831c60ac9e8b8537f30fe2b5653e0309e9bcd8075c3ec12cb2829a7edfd2d6e3104563903ab60df05b1db8c037449d93c5fbf27d36c0c3d8c2b9510bf89df6680e332a23146431f42b01b1b039b9c0713c89980d28809dec40dec9ee39742aceec481fc5eb52798880bba6afd36eaafd24732afd1d8aafc324ccdf00aeed402044592156a9d712f03d4379e3a8b31a11a38f2647eb9bd16ae7f8d8592703ebcfe1f93142500fbcc85e6e2634e702fe5b6007e7ae554dd88f83af8fb6041ae8b20a681bc9f4a9db78f1ad04ccf60bdc27f83adeaa476cb90d41c842f114ab3708e94ed6450b593a7c0d817739ccdbb5d37282cbc4b3608b66fbb4c0d9e7b2e4106d729cefb4b64a89efba27bacda1df09aa6593ab7034ad06c1382a406ed802c2e021e180642a0719a26c609d9bb42d5998b8259a0511faa52fd37af9dcd93ae2ba2c22105bc5bf2ce2c2889b7d4f19a9e2bd6e8567564f4ba0cbd237665e8ba90606fc9786365918ff863d3962454c51afa9220874f9674c59877bed9b087469c0175dc249160730170db0e6a732762a547870bb4578617f1ef2db224e0ede99ea226c6a8036e8d66264143f35ebfa92a4bfd0af88b08d2f7638b0d5ca7174fa64b929999e93c34e4359b0319fc16414969256c1edb57010abc671e3f19a38e6b56aa0c7265a76022b8eb8ebeaec5f04b4b67aded448a0a69f80ce0db9cc59726983184f413bbb94ea9eeaea89c069281dbd874a83b2289430f7f79f582c0aa8636909d05f0d3e38cbe7bb791e99bf793e80d379229c838dda22cc6d4842adcf9dee7b0dd58f786dadc1338e3cd8da45ab5ad9f4af96c7746a5ee90f4319408a7be38325ba9693780dceb569a39c65d6b8c994b2d5f11a83550edcdc129cd9f75431802295a8da43b29067bd6474bb22d65fa65653802834024c362b3a4ca42516ecb149c08e2869bd75ad808f6b24ce2b6ee1da90dfcd2da22f7073844e8620e1f93fcf465a8b9dab1aaac568cdd41241a004253a2cef8fa69ff0f2d7cd0238e9dd1c99f8dd74c2b2fd578f722145bf1507f44bfca596c0620396f42ab80432b0d8de3835948a1588765c95a6c6f9cb908373e354ab3d4963ea36a82bf52220db4e9c50b0d1c345cd0ea067e89d739535b76ec9139d285f79fe6da1e804c889246e3d45859ff9ec33bff8834e7323390ecdee453178c11f42da916203af80a0ea956a232f017986ae36df462f74d13b278012bb70d4b9b46ee2e5b8608e5dd3fc49cab82cc89db1b1580d8bba3f6ecbf3fc1a1e2bd099c086f7351bdfb2a85560cd35c1153aba46ef27dd7e323c3209a85eed6f3e410d214193ff3e0a5f458992b01562a9cd236676868d62c9a1cae178d40f0493328a931dbacf46ad783986326eeb004add0595a827591cd969fa9247df0724e1ab1f6590d2c855177dc77a9165950ad21036a262e83608c6b13452ac19e965aacc2610bb1d90977d3f0701770044fe5833423d07ebe80f811e106c7eef284e2d336725fb566d241daebcaea2fc4cc5e56a96e9a29996d3d34f5a4071d1dac34d1ea712d07e91ba05f6fbeb3ae0e759bbe5e9847e40a7ef44011795efadda38c61f43f90e2b77f60308fa6cf89dc41808604d6fce7c81c3b3838ec1a2a202b156317c1529af15ca2f3031b03b5338298181346391ab941002e0c63488283ec323a778c1f0b97fdba022af40784e62949e66fa6eba1b0c0cd0d5ecdc7ac2bfa64bd60f5fc2e649e5e4410f910832654b1708dfa210018bb42d263bfa8cedab338a7e2d8b5ead0a2d4b1ee75632bef89bb5a4a64a307cbddcfff2b121256f9f9044e4b4e04c2bcf862f97a563d927f860dbd91accb40c6b8503fc21d5f1e806f7be2c8abf4b8bd5aff0dfcd2d59f995de78ffebddacfb0767b2b74a64e85af5c994ea1b8da6a5f3b25ecb02c9a8d02cb43b11e9f3edf3fe2d1f29e45a5e1db692adf02c4313099786647f86e663514ae2d7b8d564af1d6fcc4649ce0864a8d604f53ceae9fd097d404bd2cacb0db28df304dbaccae3259a0d8834db9f99e1e6103fa6a530aca3a29d334a57514072151d62af063873fa0a73c5177f73d4439c1c59181895f85d8da8a9885bfd0359a557b8bb8c121c98173a16b2eb0ab1c20fc33ac61c90e6a111295d913dd1a51045d8916bbc362dc4215802a3185607da0e6e91a6dcc0c13b71244b78cc426562ad845e76b4e8cca9f2d444193826ca2cab8dff70e85a059ba6e4dbdff2fddc30d4fee5a458c5c5f151e8389be8ecbeb8b2a5e25f46098989550bf0b1c8132592567366f27db34e6a11dce68fabb0324bce624e054dec0a144101c24f6b17d1a95d347fce8379fbc493e957c8443cd0e9b1cc8e28e44b1b2f3ae793837daee4064ff13b4a30299f5ae54d26e9e9385df93f3bafe548befb5457d129d4d1873f216656886b74c73cc52a76a4f238a83290f7c329578e80bbfb4d7f19135c1f97eda27b46fa1ca02340e0b3443f44c25a500e89ceb49cc0236576fb39f397223b9061f731d9d39b40e0b4e4e5123301439e589432c263c72163c841edaea4a1d74d74466949fa99764811448ebcd1f352836bc14e657480837f139234482d6c51abca9632365a532dcacb0b5749f7734944dc0c7a850caf3541744364e1ae2a810b092ef9fe87c1463dbcc331b6a4bc01233f5d90747d272e0fa3c16e92f466c3e73d78ecd344a979f131932eff363d1f741a17bdc9b98adbd14da94dd4e6f2a5782863da58d8833ee29ef3ef038899aec8b6a3f11e45363c5263888a465a145fd05881622586f40ee78b084808307c3218537f70b66a98b3f16875cb2262bbacf8e15359202fb49fd1f8a060fba0b608cbd7384a7a1f143d01542bee6955579f4c0d18e995b3f69b0d1240c6859d0e3d054e87623836d6d0f3997c4bb331267317832ad8479d8d1461c8f1bcaba5ae0f3d2950cbb706a70467ecb422099f33ab378f9c504b968f3fba52851cced9a865a7ce99a0c3e8d4198663162b165780a0107551cacfe000e03d427c6a73763f035f2b131cb49885f5638ad27940223bab57b2861755444356e77af13ab2b700394dea5c41406da03807006c641666413d84bc4246e4c350d15b367da40ab1e4f0d1285188cc826c47a68a179b6e1cfb388b3d85945291b6b829f4272b476dec4e8ca7957de74a10b9cbc9a0d8215ab10ede8931664f45a539967ce933f5022cbadbdaa1e320acadcb0109d34268bfca9c673acfad1c84bb36989be690f89b8066266a23930034e5e2d036861f3de28cf04c80a1b8e351e184026eea735961c946d3aed5ae82e73f0ba213ea162b88dd241b7c7497494b44646b2d90e5244e34d3960b7584238a56204c72bf2f299a928ad6752cf93c778b8d4a054611d2cbbb66569458ed8f6586b5e002f552299c86151ea6de8a06a1d4eec0086095b76216628e1fe409756ec7da143321cc093e531747f8488aee32903d919f303350aff931f9d293d0ef804db714404aa475d518e6a0f54240311730eef3cec07117827c81371f39f3a86f695ffb1735fb2838202f1060b5f3fa629a0cdb8b1f2ff2b16f21b6d0d947683d713b63a680536bab671a99375432422a19568caad2563fa7331ef226547e43834692c9a515d214a32c8e91b8c083c44ffab03ed03c5172badd8b641c68e2e62182adb705bf1b2125d0031906a0d2d0ecdb8481e4418671471f42c852d889f38b3d8c24ab006cec27ef9db052c1cd741331d186720e5f1ce14143a6d63563ebef5a87e8c6f21c23a11d1b4cdb7e7aaa8f41949ff04c256c59823606c9484bbf372f44309fb648ab5a502f3fd9b11ae9e991a0344ad4968dec3a0a393476d862f08fa045030b399688dd642cd277f70d122c52492be37f39fd6a085796f42292ac7c88688949d36b423f0c45dfb74f8a6dd606f6fb3a6dc3ebe75e6587cc0f36b8f3714cc4d14af1497f5fdd19a3067cfb2df50fd3b56dd10e87b507bf3024e41c3cd6743ee1b8cfa4c38ed11764898176e8db01dc9d452c4af034b9bd90858fa2872373692fb200a4425c57be39d9d44ba4930805bf19eb17ae453579436e47847a2c648c818cf13ad9771683430f09efc19c268a9928335c90800c343121f7a7964b06c9401d8f7fae8541356fdb77a4c866f8c341a521d9c3df4cc1d7ad7fd9243121e1935837f0c3d303d8f6f89b2021ea44c5343ec814725c0057d43f4ea061587d3d903f03cd564a1ec103c55dcab409771a58186fb0d4b75e8d2ddb662b856a391d86c54d57612336c5b81d613887272407b6cb8d613210dbb216b7934b70a6d1b7a28b519cf97492533e56986f4358a66447df57590b341e89ee10b83b0e233d99ffc3fcabd84a6aa44653714191c07edb9302d78377e4c622f8bf48be770130e6cbd04d2b25a6c409586d4009cabc11c24c20106e657a185a0a1bbc067d8751b599a8c8830db674a50df566cc014db224b21243a3627970406c2653b0c42920e9893d5a8af7d89258358395eb54e9cfc223b27ab6bfd460473fde39aaed4dd1055e550bde84019a10656a592ebc09dcc453f77ad9ec625543d126bf91190afd4ff21bb27b216ab5ae7d75ae4ef250ab262fb8ccc5ca579a03914530528c9a76fb66bc41e56c0b8d868f0b58571f532c2512efc0906d9491135b5bed1ef0f11579b1a3267157160b687b4533ad8ad5ee1ff70beb867b4f99310d7d60e75c6233312afc8ee6f9ad796cc9ab53a1d40e763316833e56adbc8892940ba37799e3690741791a1c85074885aeac96ef06b1e7f0542eaa85bcbac57e3a7c568cb4980d5bd2f15f2105823fe360e1d42e302918c483113741a9af27b8be5670fea1321d6d29001307b66429f56f81ff0ac03afe1860b4f1c395c16ce2a4eaced98a233d953a7d7d30ab3b3583022640eb2f9882064bd99a46daa060af209b06e38ef3632530d0eec4050487788206fa1ab51abc97c517706e70895dcb028aec413fee8b9298776c160d063a3ad64e64f15f836deccdc6818a69745e05c9063a0c568fdeec344036ee0cb41d215f7ef8c225094b5bfea26a554c3b307f883722058e74c26047ac313ab05a619f733c4ebde53618f7e97a333089a2cea541943a805b60562b4c1949197e92a22d8aa52f44488f8b02e10c37ebc2043835f46b5cb01db934ce7e7222d8af5c3d9f97063a47792c8f4760d6bb87ea6444db2c06a979176c805e2cf4eaed781b9cb91bc01f468aacf1ae35fc3720cdc35ddbe32fed36e974c7e2ffd350ac3b1b56d564c9151cc310f7fb84078e8ad627c452c5f237f213914accb7eac2e5f28616a0f77dcf524cfca415b30498e582bf76dd67b13e932b4084547c3969b3503f4ad85904cbf6ccef3b5ab30733c9daba1bf38d3b7a97a6990cd699e1147ac5b273c9a8cf2716232e480e2e6fafd0c80b61af16b492eab4f57c8fa2ba9ddf9b07d7eb9c9e087fdd3c30975d1072aaefd5eb69ae962d3e80eecae0dd2d7511380912f26ad28798eebd4c568c2e65f498ffc395768f842aa8ad0fced5670113e0cd76001316302527eb52a5c6d1d59691a998081f3308aea31ccb0f66a6f5343d869dad1163aa6cbd306a8f87e4e27a00786478f8878371e503ed79b14b0e992cd0484a923630a5e6736fe0061327b3fd98c11c8736142fd836c2026421229c6bb8d3b16b53b648c5efc9634bc72303bff2de9c17da25a9347d3e773a04e9f74781117d83692166473469fcfc02230843cd00512f6c0b3f941e6eeb6aa242fdd2422ebaf310bc12f663a5152bf66049de3391fb195555deae16b91e4e7dcd3a8a4ef23182c53c54462f2e2238f3190437859883410fde92a178c34941eb0bbe212b5311e32265ed8116150bde31f7ec9922e97e6bff31f7579a05c8dc7d8104a1959978481615b226a9e20db3c05dcae121adda89fbbaf380461f2d062c306495ed935d99dfa34ea3ee140d1cbd68d7a4137ea8feaf254cda99989e8ec9da24873fde4e8555b24d0d3a430b6f53bb30796f7bebaa76378832a205d359e3ecfb4ee4ea9812f0ac720b245623e804c36cdf4beace478751afefc6344a877a298c8ca0e80f5bc0626005215e3f3c18b9146b15527435a9f583f0dd3602ae5d02c93a74aac694ae354105153444d5d0127c0c0f90124d98de154e46d1406903507b775993fcb110254f9c4614563a18b951406fcf338e00689bbf1470bf847b14e9cba0a2b2ceda54223af9185c41de2cd88542dcbe2e5e31449a8260cfb0303834dc515b35045a653ec700c89cc7861ad0339912a7372ac9dadb3a42466e6f90b8af6acbab8a86f46417b6db454f255555220461611a412d3ffbb877d717edd73415a6c3f929f1656bb06bc034a48838389e15a8007f449e1c4d89843be0c92af2d2f80ec8d878578d78501002641a3a3a69e34916b62b58d44c059306a54079fac0f32563256e94ff1feed84e642cb1cc147c18dd29a2825c940f2abdc9674d968602caf62d808a7bd0f666160f3e0b7513d3cc16f668d0b17d1f619ec48bdcc73b7e3932b2072d50ccb305c5ee1f29009462f23560bea58433366d05111e6039880ef872af63d98ef88b4f568a8ffb25f2c0b0d0ab9618f926307a10d66cae0fc6779cd6d2cb8b81ab671b36f4a50609305330f209205bd25c7ca8f7d4abb6df51350e9b3094d0a4d7ef8d0ed5c39740b2023cc46a1bd21d23fd5b92b1d9f8bcec3522eb22ed41e5cf7eb7d13e1da424745369a576e8b7fe82863c96ada7421fcb59afaac1f845744e4e8bdf5bc12276ec76cf86159f081f6c9f2278b3efc3aa77ead96a3661a627cff12a6e3f264942907ef3f497d9b9b6fe85ee2790b898ac15f98b1661824862ee67cb928f98a936ba612c3c81e5f829ac10756abfac3ae7dba584a181adddc866d1b5346888201b820dafdd0af621f4a6ac8480d470681076bba50f1e327c8776432ca3e5d6c42179d27abd5073e6aa7e525a5e4492ff6ba709c5a5e76023e5f94762ae10bb2b8fce0f3a801ebab43dd8e122410c9562b838d788fffa0e77f9c83f0928132a503680148753f05f047baa3669dbd7d30c5c1e08b2b2d376ec7df7fbeb9da764736f511c100bb85e2234ec039aea81c3f7d0d3d94508cfbbd63547f21a407161b1459cdb0d42c3de212c886d3222148c709887f3e99dd9f7064e72ddf621bebfa9161064e90b9ebdec699b5684e45a641d08e453b9baa6d0a69b79c1668d30a70f2a4ab584bfe6109d290eaf5735dd1a8f265861954efad4e47eff783352a7711460683bcc8c8c7d8f9346884919824e4dc6b57d68c58d6e1ee182f1dd8626b4799817b6dd18425c72fa04c60e1a7730962e449de074e5e78888540293378187590aa77479b948667b2c68168b258096f947c0d0ee0278ca15afc1f2a059928a7ff34d171945864e7a6f5e7317e253be3c28ba7fde08e3981858060242082e1caf91dbfc7d022d5de39ffa7101424fc48f20d8e962c31623ec54ec54f02502f89ecc527fe6274832602b9b403ffe24b75999647564763c2a644859407ad0269a835b2814e804a8d76245259385e100afd8321e272bf134bfabb1da606df98e1c695f8f72ae521925c9a5fcaf4039c8b3f63dcb82ae3352aebf7ac52bbedcefe9b8c21be3a439a113110199989468b86d366f2f90434317a245f9b4615ca5878c73a8e190f7a56c6e7989a34c1c20ff4f8fbaa210878c446ce684a703ae926a03f39c0fd4712aa71aa2cb4414833460d9e40dc9f7725011e071d49c5c4dd5df81b0c81e84c27a6b05c4fc5488f60bd89e80d8e85c0c6042bc8e4e45aeb45093aacecb50ca2c406557ea0c6470c2948bd857cd29b1c0a97d6f7a631c9c331921383f461426fb48d101f10a78bed6ab88859f6007744d1c163d99306b06ba9a2434d461589671a9534d5715160c20857e235addbc113247324f314e74f6eb52954815f1356cbdb9426dcd66a3f04642c325110d814bd6302f462971d7c883b665fe01e99e24ae5cdf9e6fdf253652ecbbd19b2c26a4f8bb19c60c6b108ae663f89a1bbbef98f6504d47c1cf4554d543a813a1ecdb86ff686c2b61f08abca68eed858a913cfefa9835395a23d5da62a1679dfd1c198af4415aabed638f82c62bbb8a0bed579a34bfd9d7e320269bf4cced496baab420da2ac2312793126911dc196d0c99b700ee2acc6827a84d010ef8eb2656542727ffd4ceee548b71200520998cd436c3c5da8bac3cb5168750982930198ad7ccf71737ac1735e3b8e81f44985deccaade5d7f09acab927abf06e132731cac1db18364a5a2b687bbaac518824de431e61f26c56056631b8521144fc9d96a3e70f9433549a0c1f1224292456c0ca29e4032f738876558302d42bde9c4c3b9fd296be36e943989404d80414068402dfc24161d12d8a0d567b5ff4d1dafe1265d7afbf6d439bbdf9ad458350febf08a5715bab33895cd12de4311a044f5e89682d052b250354c1e286f14479cd36857a5613a193e67006eb2a3e42a6c2855d11c84bf8c3a7637655440d7a20852570800dea26e66e8ca4f684089e3ae029f195b06a2afbdc46599288929239dfb92deeb5b673d63869f77c8ba9e4a9341999c868cc6a2a7b12768bc7fc48605e54e5d98ddbeac70bdb225d1d513268f39f06103b3ca2f6443b2c25a75c2b628761ae3a0aa03dbe241b45c3d519888c14b4b52ae9fad0021cb2e314f7c4ee38a50fc12dade3781ec900128325daf51396e3941de422dc2d1e5134865d4d11f3ffeb3b525453c083207d178e437fc2800b0c24b1cc7497765acae82509f4538842ec56390c07a454715a1f1c5068b2b660926aaf94830bd3dc6a67cdedd61ae8db10013e518fdb99fd1a25ba230b05ff2815728558deeb726d9fce9916066e690bfe48eb75aeb1b635037324924b27bd2a0803f5164f707bf631a5b0025b4935e0b981b6d7c48137687a490b5528e97d0af8952abdec34bada76649eca887fd4e0a4b593b881901d4c8fddcf51338738b91db0c219c643f21de0924a30e2cb18ed67483e42bb41c731728312c589415e6b1274a0c06eaaf18d8ae01235a02782e019bd17c9989e24196fe3bf5a9310f204d0dcd5fa930d44fb45a2b0ccee4450d536b144ac4796ff16aaeb2a247db6fea3e6abad441b363cf4521ed852368d4fa1a2c638d81441211251c7fd15100f67759edffba7ef115d535839eb5a355956d159ce258a3616c2da8ba42ec0fabb4ee408cad172a2190ca54402a0f740c47e8a7e4172f1446012bdfdd9c3f16188673a48f2a09e42c98967c26ff2f0db44a8cd5240c14809dd0eb6c42a4aae6310e1dc596bae6cdfaa16718a3b8ac5e7a19da13cda9eee6d480a356da60902dcfb744aca3dd49ba8805122ddd154af22e3829fc4ec934aeeb5c2e63c5b35c6be9bca01bd1c19fff51d2e575353af5fa5f7ec6fcaf11db9db2aca89b4d717bd8291a86400fe4deeb05ca754fb8cddd815413f1f0bebe2097aac69bd7cae30aa9242953594d789722d5e558585b6c930388446cbb89b711ebf879155a8b16c59a3c3c1c6d3e810097cc83dafbaff490839f21b7e782d7991c9e5f1eb03a4d881c65ea60137bf29cb11f4e050a6b1d0089b247cac05b173b1908b290076c10856db99c043178480ac4c32617124166bc03a1b73f46277c31bf1cea0a36734295e5fd43137a165812eb29925c945b26e931685b8f79b92c23a47356ea607ff7edda0b82d969183601787934ac2c1f4a13076e99bf6326976be84798ea3ab88e3060f99e38b7617a185e2b44d2a0499590a816eaafb34b511e354b668abe3c4d216df8997d406cdf81a2c2962a19de1b7bfb0ff0c6dc44f517856d6bc76631e79618ebc4d447b065d40d6391d5f04eeab18d3b4bbda227731ce71eadf1615c98eb610ad96113cadd0cad085ab33b89f27a52bbde9f76b02a53b5df55fdd92adbcd7e11adfaff0c56bc5c7aa0fb55034713f1f0a79791010f61b5a887cb37483bb4b14accffe08136f90f7647fd709a7c3a4acc75183438e1a99401907cb9a561ddc8d8e6c29cc22a64ad8ddac801926cc661605b61b1310fdf1c76f0dc05a90a016dd7ea42d16c043fb81d9f596349c788e5a637212e45c916020587b927cb364cceba73c652f0284527b0ba8658e030dec41d0adae82b11c75514c81cf2258d7d336deda7d73c21d65abad1874a9fb4226251977de53296f660dab44aa3a33b1fd5664bee34c78a5858711e921d5c7e685b15b1489801245a16d4d8629909931124b84b83e199f69a22d02d6d58d1f17d8df417b5d8248c21010b837b4fc7318bcfe9ba390eb4237491a010d6fcefbbb9b627fc5231039d0904fe8463ee735a06d4d9eb26ba13a6efd513c45e37fb57bc9da4d29253279467e6c67135b035f64572605d0eda9d08b35ba923efce7d3beba08f5495ba664c380ae55c784e982a6f47c5a913e8c30c8abb9c2f89532f7fa525fa0905ee375ebcfc588afc5fbe3c237fa9d64bbc35e76cb7f5bb68681d171206818374974f453ecf0d5f994986a29b72cb7a53e68b7eb5a63e0d001684a0b126ffaca13e3b80e63fb4a40f221e646b84059bca4d6bed116f65884a3cc3158ba2f3122c4dd82a4e8e4c9aa45a3753fea01e0e54f8cb93cd04ba78f6457b817bba6b8342c6bfde24f3859e22bbf0492145e2bf094551fe590a03acf36942ff4f425554749ab802ec96a7a7394aec2c15917abee56196c1a6edacc58252a8826901a0ceef8d72b13de6664a1c48d9cc701030d731da131d88f8aa5853ce9f063370f837313f8d84a16b25ff04b965d621bb41abec4e87f74ec8e27677acb1ae9f4778f1b66a532545c1a99cf3ef9a690b58a2f6289f528f34b821a0e565a5a7c1752d2c0173b612bb54bbab05ba733b4f886fdcc7881562a847f09a27357a4c09da3000d162a48f4af15b2b323b545aed5df16cc0cfbd5f69b5e01c8d2506479771dcca203e7702ae6c2dd9d307621438266da5fc3a2c10f535171d528eae93ba42a114247ccc59ad173cd12fef14bbf6deb237c07bde39eb45bed54c44b36c3c66c8857c212088d5d0384e6c18fb86e716c264a8bdfea541ddb04039a24098eb469c738b48cccb723059bb29e873c9730585fdd3df68be3c14dfd9f5db18c52001787ac9742149d31985f435ea558507e4e931d4712f5b46a0ac78fdc93767b996cd4996bb4690af21873eac4284b4fbb463273cf942fe23d15599bf289a044adc35929419208af8637e3af752e1c9b3d1a5bfb948df2bf6b992ade8e932a8cb38913825d549d749fbe5a28b49e4eeed27517868150d153da59f6cdf34288c843749fd64bb8c9c9b61b0c03a1fb0e60f3f44c553f876111c03058adb974c617d8034d506103dd50f644f72f2805aeef0dc6f68af61fa892ee85828bb52c9b37bcbbaa6a457435429148ca40cf4e428f985486e1642efe8d68c210ce20e786ffad0518724d978b00999adfc162beb5bd060c622d9e6fdfb0218aa24b309f20f9739d1dc54fc3bb5e55bf3216f567ca5133422d81c4e967af6bd670a4feba5e8a538c2911654cf49426d0b07a92ebf13c0b0a76978b717cde0d13a75fdabf80f5f5abb61682d83260e24ea4eb63647136c484af383bf0d9adb67501f580aeee1bbd4b8f761f4f9c7e33b7f7bba22a683746e8960db1dd8df2380590d840728b1c58920556112fbe52141d72de69e49418dbe7be3f341cc962448eededff2a29c1f6f5ef690fd97ea94ae6c063fec4f8dc027506cc26df9da4af3c9b65721d85f8784057e76564bd2acbff03fd0b11c9504a71047041e6592cdc0038565d210c701770c900a9ffeccabd51d59c2db9581c75825342f5e9ac8a41e5d5dcfe9e0eaf02e2b427a95050b2ec7be4c16b9f14b6a22abfd377de2f7698bc3bec523c5c1e10427ca1f0914863be76cf932ecb665666e1a5df8846c84682d8a61aca942e1cafeda7ea330e162e8869a64569b6f4f1c0ad6893629810917385122673b3d22fa188fab59dd9622b489ed7ca7dd89b09132f4f03955ee9a1547ecdfa76b46fc05888f43bd5ca05226033355cb361b8ce936e37e4ac660770eddfe47795cd6ca771f96d9694e928a8e9563b3b1a32b080322095ae3fe9bc59b4b48ba5f0bba23aa52fa20a2e901cadf961eab2b5566b181558fce9415682396d4f4817413584763cbfa453621d2e43d4facad254416a2ed05862ee665a9184cc9a622cd37a18fc56bf6367e4db55f91bb65ce3b232946125996392e266ce8cd05036482b7ae73f35eef2abd7bc7c200b0f3633934908e4c311a898c24c9b6f0050816cbc6d3236e3e0ec5a25247c9e52766c7af7a39d170ad03e40752e534cfb3e2834b36a5e44b10f3d2889fdf5e52d22341a8161fb4bb2cca9dbce0e3a0025836042396e500aaf37c286710b4ca800447438d68b4061dc4484777a86b0af317318af4b53c563fa51ccc2e96a5202cbe875b50346c971220b297cc3fe30223226c05d1d2e008bc543452734feb5dc6d90416374bc5a8118c40f5a4b85948625b3713f5cc40d331d261e6a80f1b13ca2a8c626cf4ad76267c38872f16da5d45bda3ec20e1cb50fb462da0df0278004820880deb5224e8c5229785be4b5c37c4d9da9edbcbb1bcc7fbf483a6da76b6c58c21f3956cf1af677eca86d6b4a652035286000fc1f986acdc0ea61ac29737e5c03a455a98b8a6c0e81ee094986e5b9bb5228ee700148c8e985951b11b67edd9ee2ddeb93a968b398973a802f34db461ff91ae5e270fa9b1a95c3af30af79d21fbccf72263efa9f66a4f1c8736de8dfba69e1986b64097bfb3da141d91f6bc123c0d8b6ac0e4745bcc5e4ff2c9f3199ce02a537ef01b63cbc8ec150f5734f9a6cfeca13769fb66702bdf06d73838060bd905b2dd3a3e567187412555818dd79902901d08559b4220cd5b552c6690376d85862b8421a9f5a93d61300d49de10f06e5aedfceec5aaf34a6053b2964c0a0e0139b9cd488a1f73b7ffc7b0405510f8de06926afe2e734368f536256502c9b07b3232c0b3f23ad4427936202730709bce6a186512ab39d9473ca17d52011f3829390296e18e95505f968730c7cbb7df05fe9e937d6f247f45b8a3df253d88a9c6e5d1a09ae8ba1674b79b291075ac509c03452010f941fb266f7e62fd527c79c9ecfdc661da1c4473e058a4be2a904c244507c670748bc8a4b64234193b86e54815d9bdb1c7591c298fa10a875dedfb1e026c1295831878773a2e8b894640aa36117e6bed1727aef225f469160a5880425716189480c72c2a95d6623a81268337716b4010ced4af5ede11e48a31d8968f14505561097d0bb11bda2065fb90aa8cf36c6e024ac46410b3fcd54937d4741ce878a337257e7ceeb3567cf11f8cd082256361532f6696cd7081be18d6844c78dd0bf9899c740afec3209dc09ec9e4f0fa9b0e0d46735254a5a2092aa2b1df65b31e2c9040b0645f8a0beb93c0462659f409f1b3106c80bc8e84179467ef838c7562081e2c9a5a887ee755c13fe2a4e748ee02f3dbc7f2c97125722eb4d1912e3994930a0bfaad985d03a329812e97fb5a9594c71a1b451f61207cacdc78537ef75a8e956ceb45d60de2d98edfa314b7485a3950c92a998b43e7b521f7af4c67c8150f4c4c88074456deee0d55ee9fe3d7aff1b4280f2ac344583d15cb29f17dfb39c08986c22f289835e2d397cd1b0ea4c74d543e391045c56beb9489cefb1a0659433e8d6272f11a5a62debba883ed91285ac45f1893fd9d776d7b8fdc6832766d5f9161e264b4f3294eaee74d3adb22a84342d0feb6cd799acff0f024e20fc151b602ca4f7f61c7457ca002513ffe696d711d8f29d6f9f5b0fd357ecaf2ee9dc4f7d139acc2e9d50c611b292361a3a59f560319adc3880f149bc0bb978675a378c2eba4ddd9b8da6b06ccd36bdaa15a9df6912fa02eb5e26ab097183ef5832b5c4881d614f7a565cb21ef904d7782ae2ce514d7ecf3d941fc8cbc2c32ad073e0bf5e8d3f6890b68dd3fa574862ff28ba859819517b76c775540027ac151ab7e06572c05e4a252562c3956a121d8ff9ec927786144e3ff89e17f36c13e529dec6a8caaa327eb1ad8f5f85d362185e35088964924641e9f7215d5fc1e48205656cc5004a96e460a0c249c671a885ffd403a5bde07de0f3a7bf33827848a6c4041d82d908f31f0e5138b8a43044469b40d8fa7a934229791795c2bd6d6c554ba1abe516dbeced67f8c36af6f28dcaf0fb721d1722e2ca545df672211922fdd59484bf1a32f5a5892b1fb4a1a04c920aa585d169e8fe172557cf30e085c33bf1e7cd79a88b1b4805ac5f092c66fada64c7c6d295f6ac12c8e23a49144dca5d11b0bcc10e11d4ef900a64ffe03c4118e1ebe73ac958618bb09dde13e8403388428613cbd0044b6cbd843a68277ed3f660f36d27bdda2e200fa55c4edc742325d7f1a58605e8fffa6021a8d008ea6752ab1e48ce6290a6e411b46e61daa32370841818308ca3e2bd6db030b0baa361134f633011fa5cc38070aa9d3447612cb6c2e29d9990aad2954a06961206deb7b5820eccb49ab810dee5f199243b8603bf878729f2de6e9e368d867e981649d692906e7a63ce03df67d5b93cdffaf75bd14e55674dc187b608d85a8dde6b237dbac5b564aef5713771acaa68ebbf5f1940fede5089e52d26bf0582358a675803601001f0a743f6ca6e908329dcc75ec000306d662db931cd948b031edd54db90117282f325a5434e0456a65b0b1fe01dace1009ab7421d4eea611a66b179fa61e5f2d3b66933a0f410aeb65fa3251b7f259e1e8603d36b6262a0aa92305e3d050d6e6393acdaf78a04d20c60fa13153501a7e139748074df20c944351e4612dae00c88b06051b9242a2edf6c9b377379c0a4f02d728222ea4b041587a97297aa26d845ca2679ea0c8e806d2033810047605829f50118a29fcf4816e46c7f53018c4f044dd5542d8a214a7a1971e05fab5bcd481e0b749d07d0cae60be4d22b3e4d315a6d33aec5859996fb4a014b1756e7e605925f24b602fc8718c9bf2fe22a9157da4476e388d9870c81ce843099bb9d4ba2357e1ebc00246a017f7f7e3141ef24e77b57db417ed2812d5ad0c81a7366c7cd5304f86978d3c79276442b492b740e3d7a5eed55a9a7028e5f8c801a6c36af4ee843dcf9956e54fe11baf1d1548b06d18edc22fabe762a329cc9e51faabf760f5585aa7115fd6d55a4263ad9458fba484232b4d9f0a513d222209021e30e73b38876814e88c03897c2b638e7927ac70b0077b29179483b95b8d463943dfad06d5ce899c704fb7cab61985aa2a2906cbfd0232372325195daf8c657c49f33493be2a4eed12cd916291f0ff2c4c47faae91b9d3edbde5357d5070f485268187a2618498b23a6c5f23214bca84db1d9f610427820b8810c9ab4004519be77d42e8c771aa51026b75e01c9f1aaa723c198f1f023088ac23f64506ce56dd51a6400c955ab475ab17c0d7eaba4aec082ce07d0c7aab6796e0dd892438520abfec56c0b97d0f3cf583c1398dd1af2b26b087fd94a9a9ffd31c0562aeacdc88f77a5a244b9a18a9b0097d10756c4935ea17ec2c6f5d4bd0fe96d84332bde6291a36db012483dde603ebedc47bbe6c0a226d4e3da35dd2484415e4f4da6d7ebbe05203ce36c8898d799fd7ae290f0db36d41490998ca6d77a675a7d93d22fb583dc6d3cd3123efda5b2b40975bad38f054337c71f73a2840a20ea5676ae5124e473843a0437d465e8f7f1a53d4549be80ea424bb782f7aaad98260a4c0a0a27f88b48a58abbc2e44dd9e8e08f716195fa6e1c12e4fda69595fa269657bb04903a2bf57d50ac5b56f6623d90cc8aacf3fd47e89415e025970dfb80fd9403693875fff212ac54b0ac4fe431474baae8e99f6a58eb8900dd3cc1e7a68149204e1d03fb8651c540c72c64f6f02de328692ddc6a2279b0b58519a7eebb7d0506d5d519f02d276a806f5c92b5949da37bec068a2d449b88b78c6e8454052543540afaf51f90eda25e5ba175a7b68de58b5fe1e2feafd67131a725ecce3114364d7e2185e85b73be09cfd7731e3f1f1747837f77dc7f32e871ab84bba7eb4caffbb5cbb1c9ffef9e3986f5d61f09a7d1329c31181e5c743500216b787c1bbaf2ee5cd090b1646ff5be6bc458d0e3ba671df6fe3ec168795e27b5c8c9624b907269184b6a7e19510f2eab7cbe8e872ca44e864b4e679c43784557c802bfe765af7379c55f38c2c0f1b2479ebf48464a1e8d1d983a9950a3acdbe837315a6099c3ab02afccccd3c70dc2ce07909acc6a3dfa6cbcece590237d87013d442b1e46797c41a24f2639ca3f72c19e6a4c6069e7644b5bf2128f6520a87e76d2a950cac1022f24ab1f9f7d1fb29ae7027281ffa42cfdb20c90e2f5e0bc37cf0b7dbfc5677f90b66ce31cb8fc6aed47b2fd9a2f30498b4ea71a055dd3c85dd33f8ac87a590492221852e737f71ab74f089fae190c41bc71133af805dab41925048f96f6d9bcf6616396a44e3de23508c9661916748de6dce7ba3d06a04319d4291691d7295508ec0a0b9a7c623f62652f0d323ea19285a6a397094b6c7248598565149eb8e4d997d2caeaac41de1e0aee209c2d1be644f648023770b80a04e572d2780f18a306e9567b70cd2337484502ebdcd7c08a3a4004b48870a675990a64822163b153e85647befe790c504e9895d1f3538db5abb147b7f85ac496c02d2c82180389946c1504a523fac20a9fee60ec9f5afc0de5480103c37e5be51bdb2dac8fdc9938e29f01d5225431f6f8dd69638279f7ea4d931f503483aac138ac289451c325ee20bef22bb0eceff05e3b4d1afcb7d0806c0cc3709e60700d29df49ce4b2d32f7568158a5a5b60b00b3767005230a16c0ea78d64c3da0923476b18ca99718486595291480e5259977b2ab63fd5a093339a1c5f410305fad4b3db5cfa14637de7545009df16ef416af4c301b3f6e04b732094933ddeb2576d8a094d94a44cc836085277d3ae203ae3cc096f3d94f173900a3f0638a820961de896727664c294256f3ec3d94a0bd08ce93d8dfc4c09442c8cab7d92948a80848f14f869afa23511da74a7d3a32c4a206eec0710e0a5ba5a66be2f76ca25bdfcdb881d9cb999695e1e8a2789c561e1fced26434d826388863c5993aea32972e87e134bf074e2cbc09a47196e223cefcae702d7cc7c03ed7c08649cdb5bec7d3df86ef4556a26b3323740ce64b0ba5a2c407ebc73b21116e8073a8674d8a323baba9d9ec621e0c25a53510a6264cd38e002efcd66b20f5596ce069208835757dc73c37e82b584e290e60fbfdb3867f9e3931cb0a2a09c91ce4db50e2f62989e3cb20ada0c16dbd1075501d3e9ab67989019052fb2ee34f95f6710259d05d16ab4e2ef34fb665b57ea202c8347250bc2d161fdb923f2d616334ceacbd573218e1d50fd2339c25d231813e9f126ec4f67140c1d67f072bae8ef227a74e40e8e044ada345521e89ae50ef52905f8d5d8ffa7ce46d77581df1b2b669adcbac9d905350cefe5c9bca004db794c956d391903209b2e7e07d1cb5c0b628e2087f1df77498c269bcd5a0974b8065a15738de848f7a79023395302a57842eb978cdb0d82bcd6430e3fea8aa7d216376ef4ccade37ccee147fe794fee98a25f85020e837968d9277f4a4cae001db8c09399ccc27b06deebf9f16377e899dc4b33e2b1f9dbf8189c2191986e4c0d2068ea68b3305b8add208e0eafb9d29dffda26e358e310e1140ee3b9c62d12def6cb89c0a2a3d32cc799cbc1257c61aa1196c7c03c999f3e26ebe61b209a08198800db913ef9e2bc0f8005240bb53fed73d46ff8a5e67a6c3d28fe22b6de72c22b59cb73b75f3836ebf7e2618cea63128b375e2cc0b724fc1d4af9246e95a7f4ccf4da25bbc80518191fb5ca6be699de2b2617ca77da9d8e273f2b701f1c2311d73a23073f0d93c2afd5cf5e9c840fe7d9049d63a5ac45f943b72b90ac954ab3372cf6f39217f143e2088cf09d5d83124b435bb48d8cfb620f38587fd11882086f295fe72013c221a51213d5cb8dae70cf9fc5376aaac8d476d78f82a5d909c7d111c53df8ea9c1011d0ab577467accba834ba04d79b47f4ec5c195841e7146150b9a3098c0b7b4a516adbfc50e7b042dcf93134060bf8d98a1dd246201173bbc800c3be0478750b2dd842d3d8ff4b3ca1d652aa451b2dcc30686d1605bb3cc77bd1c06f21697bcb03f8665af04ad84597078ed72c42a726120b09cbfa64affc052479d13d245a6795b1418d8a0ed52556b01f17caeedd2e2d9b7be0281544b9ecee4aa2305ca1075aa8eb1bb2ba6e87b5045ce8590a1ac4009df43186f0ac443f6ac6bedea09c18c1f63e2da8aea4a014eeb3b3fd6f548a4d8c64f9153efaea7229574a2615ae34ea0d79841e2fd9f07414c625ecb1ddcd42d4158112c6865dc6fd2b807272d87fa560ef54fadd34942475c6d010fb2f5f0607517241c03e692454a5176651a0c952c089b6d6f2621abed764c02231dbe6165e0c055c39167c5505f874a723d53f2c945ec06a898fa04167ff3c6eec9236405d4184b4bda012a753fcdb188b746775c86f39735342f03123b3b4ac31a9e18fb181df2083e0e73df1bf213f0682e9e28627a20497f4cd148d5aace3f82ecbf3f305d079ef0cb88f15e89533d7508e0b9e6413a907525dbec29bbea36a20f639344337c116bcfa3d42b0796b840714a5856b822a74f06c9c3fed39500c8082ff0039177bb4d4e7d8a75960da5210d82fb33e9539cd09c495569d5bd8b507430e2f6e074649a2620f0e010c7329f7a66605f20139eef0150caece07db1ae3ff20bfbb964ab4d42bea2ce0de404e0d78997b3dd5239f18119402f8df7fc8991bed64cab1328eea0e375aeb9831419c28bc835a7ea64727a58168889664b78c99cf267ed3487a6921a481ff4dc3f07ef5b0ab8c1d8febbadbbe5908e56e84af31b3ccb3271d13de6c7f050774d1a0385efa4dc4966cf63e79049dcbb7ad589f0d4b64b370509e836bcb3ae4c585ac8f61478ea97806c5193de6f4040ba085824f0ba2dc7d2f207712ad1861a32305ed1fca221dcccc2cd974dfba8d38dc0c29353ae1b5342bc4b42dda0c04d1c180fb3dfe5728dad470ad1f902195a953393e85655b6442d111fd361a6dc07db353613c2ec84a684ec840a9b7ce9fbe6c4c58551a5bd5c334f67b23e300fa578e5b9d9223b64396a04808be47fc15190b508ac8b54eccacb256ea3e492b6348c830956d23a5ee0554144927ba74f6f22f11986e61a103a829da4e7c4519d14dea09d7ca4c643158234db618cb10c5dec49b20bb535440ce51a118127165242d6172f32895e71ffa009092b98691a172b1349e8fae31151c59d9b97842bbb73428db189ec61d96de1f1bf200f9c5a02f24e03c088965fe46ce3637d15ef4d4edea56c1ddf35014bcafd6f5639051670960da04834c85771b21fd0bec7569bbb98be165fa7c48141b284f1ebef4561aa1efd46ae1ce95b9a8cd2dba912e8ba4c9077867ad916aa03dd23426226d4de72418eb7d2e6c61942c76e4fd45252fe43c869584f598419975cec81d6a1d3a1586474cf17ff5afda6324e59612ec4891162daa9f8062280d99bf688b2fe0062c0c83ffefc7041ebda35a37d072c04dda9e0829347fc6c37d9a7a79b55d4321a426fa29669dd923d20727350b065621313545b81b895b0c33c79668cc8d77ec00e2ae48f85bbdffef5927b33c6f15c0bb8d8f835810d156cd8c3a81537e0a8a8046e3ad56e681b80d20bbc6129647072518713dc2ebfba61ed9ad88075b374b088a09296b0357735761b9b77a25b706335dafd6e9f418afad82010c47d266358436ed7a50bf5c135e4bbc77249136be35b66899e7796c84394a14c29e6a3a4e31db922d8ad68589a931893123f3dd02d85a1b1eb5967384913d17736b5938c9844295d30e7d126a45daf7fe40e93f686267f7d123863eb31349ea524af20cf814dfa2ccd46da459ea4db0ec8a4cd7d187988f276d486848ae9016cdf419e989500092de9b78bd1cfcce0c4ee61c72fd3f8085c55836716bd8aa286fff1eac1ed519cbec9cae375f78e57bf6fe5e2c9e157598bdcd0ac0c5864cf6a36706032e3d02953665afd56d3ad55121963deb0e401830d5892bfc0419c545d982928043987764aa73feed73ab22060401b2bcbb4bd4bcdd41462efd48f389c43659cf0ecff1635fa164c073db57431293f8d790361118d524540a2b5f56e09c28fb12ff8532a2a56e4f5a4f4cfa677cd880b372abcb5b110efd0464a1ca3ae153731f2613cd80c0875a6245b61f35c77588d71e0d924bd961027e87582040249a00cf3482040262899bedc7e672bfa293676f64f5ff43e62877f646717733b8dd223d532910d5cd84ec1a338e6f1e64195dc83edb5bfea213f4bba0e6905de7bbffc743d654df1c9f306415dc4eb97782a64e49067e1ad22165cac46daf14aff3a4a01612f527030b8c06b0f74e203e12bfc6f73f53e8ec5f6d53b0fb8806c1d70e1506e7949c0dd60a188e1ee2b681f4a536b108485bd5c39b27ef9d6ea0f4426ee63c38a489c5adbec274878e55e33489108e31dedde1ad90a4134b77734f363b42746b8be05202416f17387335fd5c25c4f60a72c229c1d4d6fe9ffac33504d49c302369d8bd83afe7a6b2735136f076125e09c5d2a42b91028fa0688b90a9b27c7d72853da50c149a0f72f165b8274c30a32de8635d0bc8b82e2c125518599d2c670f8cff21c8720a5e68efe3a13d6a12f62b97fe000ff6fbd2daa5ee79df426ebee379efbf718a5e2c4f9481c0f42d9cf6d28284c75c50388691eb8c4831cdf1cdf2eb09f98aa3a8b9db8492959156b1bce5a4e848082a0c011ce69f4f9462a10a01df69a5988dac8d1f6273c8f86dfe8c74a1448e3dfde015c5e7c05c8de487b18bb0b83035fd4c38b7f85c966e4ed97dc090673c657b4e84f89bef4bc703d2dd1b5cff4a58beb5ee577547d6da46ea087490829c2a0e89775dd2f5a220beb9603b5ccbe5732c614aa185d624558f657c518141061a9f409a9181dd477ed19b9ecc2244c489929345de6b5c050379b07e8bc669e4b11b881ee3d2dce726a5998a2a1142d96ea05a76e054b3de1a6a87abf3b1523d33e9092e1d7267f3ed6af50b91d3a4a4eac72960cafcccf2a498d468fb2c8eff881094d554fde991626cc05f28d0e421a0584cd6c72d8204450211ace40b5534deb989248b7d89e0b01f66aa7f9ddb84c9a656d9842cccc6e2a5b16200af395502b81c0e93f262ed6b86d366c569b2dac264ae464da92389e59137d8be8d4918ed32e8faa69aaf8268bed54c683e007c3acbdf2769a456379e94885c718908e01d5aa33fa1cb06750cd039e71fe220cf6a51b3f71349a0b5601ac79aaab065033f1cf01abcb5ae87ef6f40cdc5082708b43b4dcf02a54b585d01968af9c06cf5ebfd6bceb1d233e68de75e14e9d30de58758f96896a5bd24b18d218ee103827b0af05ac98b8bdcd2098a02cd594e8f1e67ded4fde1654d87d509d62118f3a1c5e0bf6172de01c7d89f3c26593d99d1e847226332c6885fe60953953440371ecdc132c44e4977b2f670b03b41fc310b931cbbe51c7a4424897940d50327905c504fb159efa278bdf0a4c88391ab182281c7c8b2b2b3113f7ee19fd37b85758686591c4190d123e7dd3b46de632220d4cee01ca4f16d973c20e2ddd497899cb21958ffb75019ac32f38e362216579839385816376b6c8cb37fd64c915225392c902f2196a0112f3a277cc480aa2bd22f305624dfbdf22744749888080f5c0f1103fcf3382354a9de32665eafa95f72fa4ce1c938368c310fd9946b24be5fc1b1048e1c9f2ec1f036292f649e4094c8046412bc2b5e97cbba1e8355011b52297e33b82a1a4e2888a27a19a43923da3f1c288017cf8ffc53b1256a860f092e66a7a76c31ea1157c8108c16ded0b7cbd9078637a5898b9bfe1806b55e962d7f36f5730776ecbd405ea9230c504918a760371428e431f4ce72c2333ce151294f73d3ef1e0e813dba2a283307860a73f5c5c1eacba9368dd2ef6822b57e64f954b060d8f4776eb5f0b64350370607c25564bc045c0c53a12aecd4f7eb4e9e8b26aefc3f71dca52b7e5f9a6cf5902159b8bdaa22dc84772880131a3bb23fd74a306073c31d51671d2f5a5efdb268cac169c23a903d38a30049f6493aebd878d800b72b4bfac015a45a9e78ce83e15e0095704bed52091ab77cb9b9b04a596c67aa91c0cc4190044dab036de58b164c3b44f94608cbe789282ea80148bdc6c51b13c777ace88e27812fa9f257eb2911c1f3ed175fa6cc89acd112ee177019ff24eed27f5031feb27596f3929510d7531bb9671f23c5c2366a64f70a3fb9e1b0756bf08ca932ada698185532a564cee121e8f0d9db5e60b77fb688ec5b11cf028a26ae32353438fc34005c9c0eba16703fe491e4774a6acb3da1116e724c57c00ecb603b5ba4e0a3c02bf2b5de910a225499c5c89cbe295140bc493d9eda8eb9dcc40c0c2c12d264dfd4919669c379e6f680f0d9f62f2d667994e1da93edc2ccd48c56205cb6a45bed25fb1aedbc27fc4bd02ce5775a497637959cf3d2b6adf4e47ab63ea831589fe52e861a2d521bbcf0ccd6eb309477f72a190fc35e7f610d2d6635da708b182b7e9b18feb88fdbab3b94e3912b8a1ec30f12a9755d6d3ff290b3aa08a194818f08267a7c79e7f880338593c72ca6c7d67adc9d61002f4446b635bf820b0fb98fe99fe81d71784d8a7f9ec03e18cc0d2aae4f3494e99aa864fa7de2af9855743561b6d61fa119a7a919a340079e3ee18212cd6c67159147a2a08fe19db95dc8e4e021b8a523b67c1a6015f33b23e93905eff0799e234da84f9cfb18456465f6739febb8d3599ac9334030bf583b03eedbb621fafd6db132f138cd55cf7c555ae952de36de4391f7a0bda3aa535f5c30aadd1c7907f658446e1138bafcf5c9a816250450c215cadaaa10ade1c712979a90a6647606d1d0bd744c43f655cf5d03d7b7684bd8c43da32874e4fe881800ac294090758bd7c33a6423183f8b55dfff68647602aa3f8d55bc683ec1c24a9e557e72f3e57fb7229f314728c1ef6bdeeaddc35b97babda47d1ac64a90f9fd3ae9dba95e8fecc2bbc4353275da2e27460ff1060aa77ccdb5e3964f261b941e7b52e67604e3c134f187867c2449b5e8a0a9b4c0894c220352deb7de09f8884d2043a8573a1af9255f2d3b1a1ad680398bbac5203aa0337c217d9d7c0c42705ecb00162e83480a6412d24510b35142552a9462cc413789b463ed945e7cc2e9e8e1a01cd11095f9a919e8ae35c25b11e0f6461b605b9b0f2cbe7048c9717d58f12c4aed8f28c0ec1817c0a8ef3b019d17094987bd725847e3e1bb3bdd763e0ee9588c394c54b260f779c889ce37ef976521fc91071479b1f48b12c53b28c464f871aa4171195b1d39f3c3daa1f5935c9f0b9d295c9151edb97f7327beadc87924cfac6412c9ef71f43bcbac6090defccb65404cbec9e3eb372f4c6c2ab3fb30d5b229db29f42dd66d2d229f37c1cc5ac764a2d74182931492caf0a7734aab8629c72914cc784ade9c45880cbd6af4ac342cf7c626c6e4de66b940e2c58d37c780552be548f601cefd8c1898f828039a3c1fbda1199c10392a25d156da6c11eae689816b8c88e207388e6dbc70a8ddc247ba6e857e07a15795d03e834bbec0695d46fbec77d4fbeed2a1abe63c744ca7ff2e85e4f613654479e35c9b11d81c200522228aec9fd145a8f5ce67973a1885ddd16f7cfbaf9f74ae724497617647c4e5b64538816aba1fbe0cd729d57a2363d263315a97e92e17d7faeb09c6f39e7b0e99f79189f84b90425097b29fad5184211b6d417b26d89606b48da95c75652079695b268d2ac5690cd1d8946efb2b2c6304d54330335ba7f9874e48061fd4c6b27487ed6b1a396986397876aaf370e0b224fbad1c576e55293a0dd71d2069783c2e00aa05b1bb4c6e306dc44d8936ae21107f01621d19de9808f7a8c25eb1a3afe5b91d87e4993d7ebc9f23196062fc48090b353b7c68fd6d943bc50a407703bfe45050238788d397d4a2455dee9c953732aec28dc42ed9c82c6f79231d1ae4a795ea7e289d7ce2af5dc76fbbc791c8feda19bfe2d68fc760202b62c07453563d549d2587510d6b8ba25bd171d3f589d0bc820891b734ae794e8a13b7a1f90df485ee4067dacc48ecac4e7c22df013f1a8cf1f57f5ff3b1e30522d61928176bd56fc490970917ed1c909ed570628df2a99da10cd5d72b1f0fc962621a0da47da8a0aab7754e1fb5ed05c03dd48926d7c7c80b0d2e784b87194cbd8a240928f1b693aa03b8f57c46bd432710e70e2c442c643237b1baaea2a814d00d2d91a7ca4e39a625e54390a731a68edd84fc43853baeaea40b828058107b7dd1b0186c39f438c67aa6ce3cb03d80af9b0750f4b4adc2d05de18c4530c55305e15251df93841cc441862dcd6019aff21d932744660c5160e77a065e83861cc304e0195eb0a221e4f43c9d55991026672a8388e4fc0ba4cd3933cc336d86bc5660e07655ff41b69ad6d4236d9846c42f6de72ef280c810c220c31324fa76ebd9aa7267c3026dcc122e06928b184ccaf8483cbb004031f5f9aa589a78d9aa69efe5c4a4b784026bf2c61e04bf45c9e202e51cc7159f6ca7408670962b8c93bdc579afe0eb7d2349dcbf4134f1807972986ef6519be68ee3d56487f40e9bd242d3f4dab7dd5d76ff3729b360c0ab7d34af25a73f1f4539ecbf513ae56118dbb3ebcf5d72bf2d5347532b95aefe2d6afd0e680af9546554a5c96d84673315ad8906bbdd35cec0d95dc14775ceeb4ac71796e369ece139a27475babec64b21aaeb4163fc98222f96921bf2a78fcc8aa8a15e8e49be9b15bec36bbc54e2becb63ac54e5d5c171e6e0773e9a2ef3089d953cfecb95c1dc3258b29f6923d3c86bd244f3deb4af24364eb52b22e16cf40b92e3c5c98189861a8570c044ac9858b7b49d56bced2ed1e5edcc13c8356af4eb22e1797aaea15adaa1bfa0d81b61899a9e81de8f7b5dae62fa8744f3d74cf65ed205cba180797352c02fd55a097aa530f75a5eac4ba80f06b6efaec7c516b716479ca35e57abd42c12ccbb0cc6216bbf4c2e8b3f5ee4596b7248661988fb5d7ac8bbdac0f6ed744728c97163022bd8261913dc21ec370296b22bd52c276ba480897308c83cbd8318c75954eafc0bc85d48b9d62a799adac8dcdf2a32c7f0591e5eb2b00b29b5df63eb398cd81ddda5718cd6c86ddaba65c76a39d7160996699bedcb93b41f698619e71f87a5997120e2e5b0edbb063f4f615a3dbbbc3a54a1947d9535ccab0216cae7a3d18f27686ba073d5eeb15987bd94743b4edc840bfa10de6ab3abd1bbda80add2f01f3c5f61568ebaa67b72c0e7ba30a160cc9af0df955b1029e5c0570bd5e295db9b319523762ee9cc8300b51ad4a082126d6b46aece2ee04b9c27493719a32629d133562993d6631bdb68e569b1c7d7277651d32ae0e415c86fa52baa927cf578a8a2c934e54993ed1d03d68c2d4efabbc26f5689c4cd3b3e9d92b69e7482dbd1c438254f123cb09d0675be42c03d9ad353139891e5a31851e195eabe2899cfcb8905f152cc02203a07200c0b873f10301044acac989c951ac8b09e92626a49289c9b98c7292094ae9a484e2830f25984b3ea09c9c9c9c3cfee424a50a71411b849be5eb30eceb920b17309764d9276b71c069badd5e36b1373293b77473d6c2d7a357469d4df023997cfa8c1926f6d6fe3ae99a7521e192c538b86c6f5f73d6c549af76ab4eda5c6cafb9ead71deeb59548bffe9abb48e772e92ef06bcee21209e3e07229466693cf7830e0574c706909994dbe23cb269ded4db64713ccd9224617bd0ae09a74228934e9500aa31ea2a85b1fdc4e5e9129ea595cd12bf10a694462f168bc4c1d545282bb92bbb0afa760ecb353973b99c501755ec6ec0dfbeccf4e16275619177c342c106ed735f4526f6b67eed5917e7218d24d1e8dd2a977148f06caa95714fb9393b6d206f3b5394c6e4d6e5ffb226df628dbcbf62dbd04cca4778f5e19e1cec547a7a001ea1097bd016c11a3d718177c34de6955025df88484213d066693bbc0f009ea6dd32b247c823b928f5e31c130a49b9cfab53828c984e5828f461130a3c7c00c9f88406ed73c3245f58f5ee9b4d7afc06887a79e591cf48676db822f4eac4ea713a6cd59dcd9bf4723fb14449e7cc8d3284fb78f05f64415ea13ee2cd62123d73ffb835bef82a294ca1564eaa22d0666c9a37bc8153c15ea30c8d443b8a335c8d441b8bb328a4cfde28e443ddb248f0783c258ffe89b8afb474fffc8cff4f6e449dd7a45611c5cce375314a518d2138899007fe2ccc413b7ae696ee7854e4accc9fd58261c96fb3e44c79d2bfee40927b2409f56e977b467706870e80e0a724773d740dc3dac0fee23b28591eef1e490dc9736d246da70cdc5993cf108b182487e39be66f5c5e35a7a07fcc9a5fed6180797e52345c15087b4fb450aa69b6fba7522808798a37037e11d1806be1f63505fae91024f06e5674514b670616266660605f9816470fbeffd253cd0c9340e2ca14d7d1990b73bf9798a58340b4aa3d4502286be129229eaf227c8d6bef63c0694d862de4da73a8a9aa6074c9b63cb13772947511425539e290c7d842f6230cfed656bd3c165ac12d183919c921f113d500124bffcf2a47eeb8d5152a0b8d6a91cd66128dc71d97a9401ce648bc0c2bad81ed89bdb512ec75e8155c688d1a7f40af559ea5fa57efd73b5a1cc9458dde2141edc521145c04c71a94f658679badcb08d5ed3e3af367a34ac95924a296f79e015191ac9f07256118388f2aa88414f8e435c34b2dcf91898e5b95ee9ac17bd122f638847833efe008f46f5f85a6d3bb26c6d3487fc243f4d6f693a65f230c79ee09b98cc05ed0da438529a72c7ba4da594542d752b6d60fbc87737ee6c8e6a5f4c3efdd6481f2fcff78404adb564043a168a53cb3441f53c2581903a297d3445c23698b8eb7c9daa2e4039e8269e1486b94e5f323a82626983185ca2a7604e66559ae8881bf3fda6a648dd64b3f6a5f4be4ad4610ecdb0e7fa803b120aeeae0bdc5149613b0f3395e6219c996609f75d9c609c553b17bdba9b659a7042d6481ffd4902c95d7d4cc3c43b91fbaaa72e7dc01af314963f7217b323e60e4eeaf5fa843b6993eb637afaebe9fa147361987efc749feea151457e3ad5c1ee8e786ed2078c514fdaec5ba2c9f6f2ddba976b9aabf225b8a323dc5d12e90fe18eb3ac8b59bf18663e7bdf06b046a55d8cec7a66fbb6de63c92c0b97b0dfd7c399c8f2c3e50f18890ee26cef7e7f0c7b4e2910f807fca24abfc6c86c1d7431c8e6c6cc6cbd8b99397bbdbd655facc364b88395cd7165ebb0a765f7e48a4476695d2be58b99d24e0c7b3bf7b1b44415f9de5b998eb0b7e6c436d8a49be191f6b9568f0d608d1a296d7275511bb7bd684e56a4a7020f2fbd7aa583b1b93c7b729deab651d1baccad8379567bea32d9564aca48634729e51451dcf8e92f1164735f7f5c74103e8048240e6ef00288246526d3c8cf0a2b10c9555e72528f7a5b3c35a79c53da993b1f8dee8a548ee9717a8cd4b4c517cd4125e2bbd2fbc338b8fcde74dde196e2db4af15d7ce4b2cc312fde2b055f3735b1d71c1ada27bfecf36e36e478da2c5007fac018ed0275a08e0fac015f8c6845ee18638c3a32aaf058641672ffe1f760ece07650677a4f7bb93c3f411fd28dd047d6e81e309f881e9264eaf2e28e66b8bb18f681447a58bfbac71bb8e739a1cf538914c236bc0eca21c737863a0f46bcddc19d5ee76bac93813a3a2e1d5c96599618fac44ec2173358b5a0be940ef6ad2a644013afab358bd5c99d8c1c6feed717cff44d7170cd457c494b9778ed64e428c3861114e0800e2678d4fcc0a142a78811bb4d112d8ee98d3b9cb9e6b4ebcead73bf185dff0459363c6292320649f2bb7907ccd344518be3d49c60b44770b87bf1e00ae65ff48ac5d187531532e8f123536fda1b37e7e84f3be4a4a8cb89a2e20f79da17203285770091e5a7a5b61730c7474b8ae2762999f472f30ef89325ecc972824ff6b451719aa8384d700f2f700f99a28aa0de9f5a22a5804cedcb023285772c20cb47d8129b5804fde2f1e7fa89155a1794e63a46d27b9e3a751289c638b5105c291d8dd03e3e3e3362d45e35353f3b395fa03fd60e4fa63c8ff25473a87eba4a58abadf6aa18a5d6e50a6e57d5e49f0aa4bd45a283444df1b0706626e6ea0b8fa5f2500a219d52784f9049a8c24e951b35618fe61ad2d8b0b1419b9af910a8a6a69243f553a719a50d4813a0009f1d24f8ecd857a3caa94248c0a58dad46083dd3734ef989faf1f19964a4e4e9bcd4ca57f665f6cca9e4ad68a4878767cafbaa6bf2b17e2a1ed8dd9cce0950001422845a77878a442a9eaa0bb95f67bd2eeb227f4d6b27070ef046c69f095fd35293b5cfc2a6b49180194c3e35dbacf2e413e3a78cf392575273ca93094f0a3907c6a013097506b93f2560a3ee1422e9b4a6292355c5c75189b4a937b5a68644ea1f362d65e7c49923e5c43a9f1e233c3b3a422a0d72e8142555d59a922b3ee1464b599758a975dd449b6893838343e95673658be83c4d3e95755971264992581369228d556d76d1adea6923467e62fb34e7f3aabdb22b6e30cf4ddec6229e7c1e8c2963749b71eb2b9ae7c7e4f308d0c7ae7bc916dccedaa19bcc549523711aa7755a08143b51073307353538b85da477766c05ed058922c8c78577ce570dfedc39a313ae8c4fb8d46bc945b7ced1daf8b8d6655e161b5d14dee0b60d6e67fd64eba7573a6b273f1a6f8ab606b781f44ddfc037c147e3b94c9788ad8f0b5fb579d2898b08253545a813851085ec34474119a584b0a39c0f76c4269629b8f371c649d91042c99a3be70c599e02dd011dbdd2c92d72f77a8208c9ddf3915b8a853f1e0c68c5954fe995575f64814fa55f75f724034f05fe084412a1dcc2902243727d1bb8cf0a1714690191fcb6c8cf8a278ae49a75b44eb95da7f84a7bbb0948c445f394a7433ad14f5807a944318e99e9299ec9d3a57579d65f5eb670a91e0647993c6dddd57531d64645994a0618437ec23047dec0c74f7e55d4d06419f95521032319cabea8146e6743be2d6479d99736f2cb2e5ac20861449151783cfd04f8e935f54db8fb40ee4a930e529e2d89a04eefa9ede2e0d2d23cfde8d3569a177d9a9f99fa9d2f499699be34611c3353a730131513cdd18f3651bd7ebd86de3d260a7750647354ea21fb52bbc745815c289d0a5feb1d8d4623eb55a3d1fcbd73546118d1ad3ba99353f804779d45ef1a0c5398a246d67158d647d79e13b31bd3a95387a3eebe255eeadae8750bd917780a64738c7e824df3da97e93033c795a7774eccf0c4124fd447a199aded65114551141ec93431e7bb07f5d93f72a78d36987b273225ebebd1a87de44e9b53a58dae89a6f698ce548c318af07cbc714f691f6d134565ead6c5daabaa3d7eced11c4d5cba9fd026b2744e0eb4b9f6b9855eadced1ded11864a1374d0c600dadaa154674ecd33b1da4678f101d7b4b6397b0aa3555422ddb3a999c3d5a97ec3554494ca43db43d4c033ddb2cde4ab92b4d6e845d669e3ec9ed36177af61adaeab38dba0beb63fe3a6251200cbbf7e2693461f605747bd92beffa7535cd75866bbab52e93f65ab5d047f78eeefc1dbd258ea68736983a1a8da687460f4df724f4d15b7a3a19d5918b50bd8bebc8bdefe634e7bc1886be7ece3a7d443fe152fdd5a6e99f6e170a4da367f7a00db32f2e3e599be3ea60be9d1359e24e54d14a9a8672af8aa23dee68b784bb1b77b266591fb4d249a689d1e857cff4d1f593bbec6e30a13b91276dca7e7ff5c01ab3bb7c72978de67524bb5dcc0877d7919c7d74fa111ebd1b510c333df4d1bc48efba4746e948bb11fa34daee3637995f4378be07c6c87eb2616f8920934d0365b16454329a7d956cd97506d0b3098b9ee920e58961de91449f2525b8741f7ae603da903ac6ce999ee9785be4f9d1b51006d9dc4e07091be1d0740d77dd2367efa0cde8f1d719a687b0d128c35e5917ac8a66be25c8a25779e92065d13391e8827ed129f2c8d39f7ca75ead4fbfce006b5c47ae75a196c22b133d3bb6b575c15e45a3d717daeed6913e90e7f6f2f2e86d8db0ac8ff0bdf5fa6747a3bfbc3cc2a5d06146a71e1a9dfa0853a797c9a2197a4bcc2edadedc749032085f678031b2dfadbb72966dd7b1cdd6ad8a16c8e65297779960740187c0a1a847f9206cf85cde903bcd937a25be3b9c2d3bc9e31e03848087c7bddcc52cdfb979e4973223176a356bd543da092d04e6b413860ce9214f5e12f6e041eda964a858bc4a86577b6a0f1bf0a342cc15eba0e3ba92b8789031c209348405a8d608f76515be223b384078ccf4603144888d0f243f3c4582e0d0f038d2a333e4874d122457f0c878f1603ca9c5f411a90b4f9120389246f238d2a33324fe883649905cc19313c4e708111df8638b2457e45784db7888775b84fb1e8cc733670c91df25848d8768eebd6debe40bae51461931190fc67b85d38b4d4dac74636adc397151a1aba0224b214c9011875a6b639a18e73c35a794526229ab18adb774d7545635b75733e9a4a8535bf78031e49ba66340d1192735a7d97f97a9e0cca9f58aefb940889968eeed5c47ae335c3d4d739da169ae23d7912a48254585d3d2951430067c44c0c738377a5305895590e63a7677e34f2d2a5cc2bd4bb8fdee5ecd419adce968a904da5c0aea8b5e5102be2b75e36bce127ccb4f19037dea6b1af3111661fe7589fe85dae01edabe3c5c5a42e6f71d597ef8d6212e2d2133fc8e4c264bbc84cdd187788958378b620ac34c3130cf18981b5b106e3192e20b4490516b2a9b3cfb26cf772792ba32f2b4c99f5ce3057d1ecbf554e65f92943cdf0b09b1803df088a681e8e9e54ccf776be6e3160de1218453d3cc4fc923cff92a266995d9b357a6bf89d4d35fa5d78b2c6f8a3f11972292e6e69b26ce8ae34f7336cf5f482ef578fb58e24f549934e4a70c42cee489bb519eb369a0ca3c8974ef4f9e9fdec9a09111e77cdcde34b046fc7ccbe0b1609fef17bc95eab3af7799490744ee9a263e8e3ab6514f857adcec46fdda32f5b6d4464d9f2aeb12699ca818270fd59791b802132fdfe9f568d098d367073798bbbbd86f4c278447a8b2c6aeff5aaec427ff2e84f00e3345caf89923beeb537c4171e1cbc55a73f2c1983bb2dcbf3a76a32092600db885db5d59d2e82c7fb599978059ca9bd755f24446fae6cb12c7f385341a6eb188e718893023b5750ff67cd5126969e20cca50100ea13e9a392324e7e4e8d3b393e426bf09c4b855b98ae89c115917298fd06306d09cd128991392427acc20afcc1981ac8b8c50c82cf6945ceb227b0a3f708826b275b2def98183b4ad438a3f58920c7b80c4a321af9f938637d6ba481c241e0df8ee71216750b813cb7a5392315e510998fb2f2519e29741e1962a2c6ef2d1be54598362c890273c411e098546239089a689b49b985c268f462727241209242a199968599665269a89563212e100074e68020884615708e9e4fac9c85a6bad1d69a4d1356d04aa234d1b8d1effa3825c81742c900e69341abd4434d21e04132e14958c469aa6699a68242a196959966559763513ed26265ac948242a198d344dd334d1c805e94454e2e24454322281402412084422814024d2487bc968a469a19115100ea3fec1e7beb325bc4c096f08f7c578df729091c5902c863ce6972c7888f48a4c16441a06497202f2aba24718ea65ab7511c98248163c537cc96267da5eb2e0e971a73f2bb2d8c9cfbebc6451a4b9c713e369164462af44969456e95371a743bb2362a8c59db0c6852c095912eea4427ddccd4422943992a110a8e7d140c92f0332197491e832b962204db350e78e2c14f11504d240a2516814bad90d9598fc30b1d0463427aec1255958a35d191246577684922bcbc98c40229db8289d685911b2295c5c5990d20fa25922c25a4da864833451257e6471881eba665d4225224c2d9c692ecef8f0c335b79a9fc8d54cee301d508d1080a8aa0cc40e7000db0ffc008078412d282ac323f1a1cdc60cd1d68096146b049e3e91a5e4f1708b47a35778309e5689c7786c0b6e10971b82b05c100f06c9e2007ddec41611842d4274d0eb766544b8f11a4faf602c128542a15008240a02240acd1036b911c2886471843eba897519853025591710d67886000000884433f4676f4c3984df8331432fa2136e08040021402290289382b3500421841001080037a992a9930de1c277d80b159392918a26525141c1e645a16b18f42242f8522c604f3979def0e04c39263fa2fec10e93c69a69f91e8d9c4763a6bbbbbbfb9982b25a70be0c875a554f1ecdd13c4cf108e1be8a4e9a4c6b624fad96ace8fb11045b64afbcd78dc9cef62a625e92ca96bac15c6dd2feb8afe5c1809ff0d1b86ab5b6968d085804740084c08301cf45961c4f05c2c307860c3f51f88a90e92266c3699ae634bd6d3ea664aae78a839c93f6e55f9299f8447d91650aea95da60dea6984e6d4adc90b9a17c85df53214196d50d2aa9c500cd143b6664182ecb1051ed90d55930c58e193926120016113b894394a7d75aa7ebeaaabbad89516ced8d986128ec5ed4144f5828e2f41ed7f1b39a7e43ced7dd47a86f029442eb52b13caac44c14edcd53d7e2a04e4f591c1b688d848203883dec610f70522a69ae38c08622e8ec5a1cb12f0f31a5a0156da14ceb82b7ba655de20e2edca8c41d75f90963ede864a6955906bae2e35e7d1c3c8d2c190a7c03d1f544cd49ce23306962656c684d84c0289c615de9589fa6e91185545117d27baa1625d5891e87f5e995c561823c3f4daba29375a173966e548fafb016f11252e6172f719820cbb07919c864b3bc939738e20d09aab9fd9767c34c088b54f2c12b4f30b8c974c8127435a735f7b498d1dcb3314327cb78d1dc4b399c42edee96b2aa8d0108638c31c2ae664ee294e63a1d2fa669d2b73445494924ca28a920753020a92089444924c628a97c1f99d605be3b6a2129d9518baaabc886e813d950452da49caacfadbaf50a454a29d30d8b70bb3e923b1df38775b1f1c3c60f1b39b061d33d367260e3878d1ff792b16046856a83dceee9b8b4e0e41883cc774b848bdb477344b83337aec9568adb758fdce9785b6419e310ba47d3340f0a34d75608b7717c532059529c2c317ed13805e7c2772919de377ecdc197fb8da18d15c2ed604e7e134e19604185102ca810f26016f5757d5debdb200aee8b4f4a88bb263028832b727c2442457e590a3af987fcac90c24d8e8139be9b26eb153c972988717099c232bf0703e20ebea7c48e2c2f21f3f525a8a480353ae8a22757ef74bc1eabaaa85b170592e39459467929ff36f8f8289066795d49016bdc5441f27b8f3c1a7401e401bdf28023f16820f148da51b8d7bdc86fc6109d0d222c17ca98c7d31291e0401214773aa635dceee63b55d79aeb99a74f1c73c4b7f624fbc6443d6e5a35b5dc797ee6862fbbc18daf70a7b5c4251c339372be9706271d4b3debef5aafbcb8b571cd51a7283b06f972dfda5eb662107df4fb0aaf2602986d18483779761d5716cd2c7a8a68bb9ac31edab4e6b067db6d0ebb267ae8d7f6f2b2f64a59966559b8d37135a16dda47a351e8d3ba847049d3ae8d4696a6ddda90b5d7b4d0d639a1956c2fdb925bd64bec45b7367b91f5d13659176b5917bd6c5934975816954b4aec479b75d156729bc3b0dfede596c692b094a5282b5acb52ea9d8ed753ef66af6dd9a1c54e5d52d4ed3d758d74b5df8340a092c3d8d1ed4b8e5d265bd7b60ee6982c7ac936b2b42df46745da269345a17beb822e3dbdda426b316d4e06e66a511645518a9e528a290c032b122c304081e6a6a9be8e5e1b8f2922e469ea948a71fa682ec2ee4b0c778ac0189f457129bcf0d54a79279c26b8d3dc04893c18f1f036d77cdbd8c00dd64c8f505c999acc0289980e6d6aac0ba46c646a884cbde8523285329da23ac608a57c3a195aaa4eb0486f214306771291c9264f449a9bbec5edde815e79f907743c9e2462de919922b9833448201159201122d95a7191e895f71a30dd8807fc556861fa429eb2c8d32986441e8ce9447a069ba2379693bf3f08fabd17824007dd8baf936edb136d4abbc2a617dd44afaf4ed783105e0729831e41106619e8b5d69ee6322a6f9d13b993c931c3d87bcbb0675b1fcbb24a065bc46be918e5bbef468c09cbdea01986baeebdcbad9d88d2ad6201029ddaee15c9dbd0479fd7c9c6e3e42c381127788ad1a8f6a85f73da6462864c4c36eba1adbe52947509fd418803ad8b09fc757aead37f37486d5757438bf4bbc16c85def7a0eb2065ebd3c53866bebf98895fd688972b2eddc3c057bfb0faf5d0d6dd7991c00baab57f0fb78657890b7ffba092c36d74d0a655eb2df19ad6a5be641b410d5eb85b7bed6d07952f275c400daaf5be37f8dba00d3b688b2ef6d0ba28619fbd5e17b42ff2d8a17db1cf1eda9e062f28a6866d28dbb45e788594d2834e5d267743d80d61b7f6054ae12735ad4fb2a82fe5aa1826abedbe6ced75c15f5b1132c38ae52b8bb2b9f49455c9b84d1bbdc17df4a9029021b9c649b58fdb34cddd54d5bba68137cdc9faab6eda95e56f9db6db3d9a7b4da3833b43c69a49c2e0d1a89787b0c63e71a94f5beb01c6907380359d8707433ecbc1bd09026bd4449b5ee95fddc5d2345145f680018c01ac412f0f697aa5da2d4848584a2edf00239a6574496a965873293aa7e11f19be634dfc49a4ae4d53298d3535d9051445e8220c272cc30202419221a464aeb126da642971b22cb9a207c6e83a08b9811073406d55a1ae50eac60beb214da6b864ed6dadb8c6eed8cf1651fdfa7bbd8285e8056fe8d4ba6011c209fa0051630408ecd0ba84e8759bb39f6f6c7bb9b29488ba887089c20e3b1da44c4d269aab97d68807133fbd31288a1bbfc5ae487abb88c4e108cdf5d56e30f6d5626a775099a272759136dad3adbe255a990ced8d4a865798ddeb99dd40a70f6dd45b227cb5d6055eb0a5e3b3eb20e576695c8a18c764a2b9ecb2b9cc8546dce9b8b22d3291ede186bdf634075d2ade4165db39912b8cb5620163c008df2e4a5887f6a57ab16e6db4b96a2335276fbd00f1a35d90f917de1d5428a1b091982572e3945056014f2c2f43488c1cb10723bea5ed143a2cc7979765733266a22d723b2d4b2dce1883c6c2ed27bb8790e1e0d2688ddc7945a6625b30dcecfdccfabca497f5685d3afbbcaedbad93c9b6efbd7f79f9e212e830f7fd8bdf41b72e93a9184c2657d875eab25bafbc0b439bfa6e51eb425154f54744e85448be923279da607e1cf5678f8879a23c9e8947b5456e3ca9be940c07577ee6402cb4c8355e8f9b6f7b44cc11d3e6a270dbc883f19a28c93f22a83fdccdc8ef32a68c877f8027aa7c160bef59f1021ae4a7013a23350d885a6fe56e7248dcbd85efbd0f74908b78ef756fbd3e8ce7d6575fe6825baf3a2fac46d06daeb25ead11ee7d91a9f5a51e242919a71e3c9638331de1e4dd0de2cc4416188448963fc11d090299692091264b08a405f73a559dce78341e0b7c2a27af0a02a2a24fde4d43ac1e087149a44f87708f90e585783735214b3915c957287163cb1773cd9d3ce5f56da00c17510f3a08d72ac4d6c17c62e194e64e2ed8d7c9ebdda69b29a3b9d5e9ed09ae1e9fb2bd2c4137658319ce44d9238ff48a8f1c82c92b241540727c8d553dc915946b95eb0f97f9b14c37dc7bb7d64a41afaf401c5a971fcec01a29978729802a782b425c72ef288bcabb4b23a39e4a8d8fab4fd9de8b519f6df52af55cad105421b420fcaef5ecd5d6554fb1bebdbe62d90d804a00ded24208017a0aee60be4f88ccb2ac1cdb33dc815e0f033ace528278a5aea08c9804b1a504405e65eb24ad225f63bdb5d1e6ea610ac40902814020420869164ea788bc028b5ef1e144b2dcc93c591ac9f242482a24155248b60366d09790b97e47962b06c0bbe9667bc54bc00cfab345808ebb98e550d12bd6254e64a25740b84b39e8f2150413c4636016e229183e7185d86410d025853417bae41049854bf6c4f5e1f658660511a233edf48a0f928a3c24cb894896071d3e713b89f302c230a0e3c3c89ce66490e6e4df9c70b24cb9101bb7b516ad227132e95d9cc943a01048054e0c027754a660088405d77a9554f44acae5c94eadd7eb9aa926aac8d3143cdd4c3537c31d95bf90007179bcc5c0bce198ad5eefa69be9e6d10032e1f40a10979f82f48a45330a0a29a3fc3d946f52881cd29cac37374060494573f2f6ef241543a8bfe9958639e2ebe5cd0464c279341e8ef8fa6a0998abb7441f3694adbb77eba496bbe9463b91546449da4cb69b9b2c3fda94a0a82894446479d12af205073a405d5e474bb3d01936fefac510f2d50c5b18dbbe556a9eeb52aa4d36376de1233f6a93b2b94767523a0036a8ef665824fff041ca1f5a54010743204af7441f6ba3163d91eecc51439f4e8a3edacbb2a1e8249312eca24aa609da3426a936987a27b27401fbd5f4a62eaa7621add74b1f2e2b1fa216b9e525ee531d572731c530f296c8c886523d4de26640fc1a6974aaaaa8057de8b22f3ebc2b7d12349ffc35cb09103f6014dc513a5913ee60d532f940514af8cabae787655954a609277aa24f4c92bbf91898ea4ee496d6a30fac214fe34feee614b5c8f4d392518b3cad4f1386e95753ac5a5a15cbe80363ccbbd8ecc9d67d5edc5112eee835c1ddc51d8984bbe38e13e18e0355a06a5118eaf23da71647ea11dce9b8aa45310cd5bd5a94ba048170e97af6f9962422cbf18d2a31fe71a300c0f0e698c6d89ff258864136957d9187a9a83cbc89bf31b201d69036c370d74732bc219162d53d9475b1d445558be2a05e519f147555b7e8d4f591dc7fa4c886a8d23329a5d3b3e400288aea32b9b798992b1cd90063ccb744aa4586b6f1bb518b3cb7249a6ba2b978383393883fef47664b411582e0e4fe4920f9d76284a4ded246e07e3b2fcf4de1d72a2f9ab352b8dddbc9f26f0f5926a1459637a20136d060a306a7614b2b5f91686efe01cd1921bbbbbbf1079a9b72821ff8e94073b37b487cf4caa431f34c34b10367e6218f667944cc9a3c6de0ca6484119346160e5223982bc873e2980763de0ab73f1d62d99d2113cdc520813713a4a4c8c9d3f41c31d0dcf42cf294863c4d73c853059eca4481076382407a65e2d12b2f0fd2f44a8f5e29517fb97b4460cd74e8a3591e1113e491a713c9c38fdc419c3c9d89e94d4c5b039a9b0e2dfc61adb8dd8934a0571efc44a27f64812b782ad361406b902718459e4e4d90c78331bda5b3b5c28d6f1e3067087dbd62d169d2cda298758be292252d6a9d520a2deb16a5b6bb638c317ecaebaaf1b2b23559d99c55ff268aa2aeebfacbcbd7f578c55bbb5932d9da745cb9c2951430c604244f6f89d40f6833b74832e7ec39e79c344f3823ce9e3dbbe79c9f73ce39dfcd7830e62d912ba7da1796d1dc9c55e8f99732631470e60597d29c9c8f7922204b2e9c004f467673e357e43190815e29cd73a003314dc0cb9f5fe2a0c686566a87dbd12c6964991155e429bd12c2f75ef7824616043c15f929dc2bc41953b8f1bd3d19cdbd78d1135fe0052cba50862a658cb96734273f4496335a450e6177eefcd4805e7979193ea04b41a2272f6e8b6a5f2251275744efea53eaf6a2be4ba9e75ef44aedec969292634aaf88a0c5b1802ce2ea5f7d4bc7c07c6fc51341f2bc42a0d7277ee47bc43de82d5d53600d25608ea99df2684898734aaf28d139a6b328e5d188393e88b722aa9ff6a554f10d58ba21facc32db1b17b4399e4e161d04023d9d0cea20e81046e819c9b52fb34e17685ba2334809d09588a119be18a1c790720edd1c1984e1e342f7d4e28819f4da0fc696d88e9841f83d18216c4473f142a25762eeee8db81b12303ffb80e6ae76dfdddef59a0512314f5f0c9cf56e4c48315cab4bc993457b7cd5361eda597022343cc57de87356b366675edb4a13938878ad428132ccf89447e385f0d55c49f45712e16a1e04c21dd4c9d4755c39445935dc17f1b7a6702f729431448e336cf40ae811c3b05028f4979743b8243a0c06457143785ef436d076b72e26945d26dfed614358dcc19c5cc9646abd1823f52e2547aa9ad394f35114a84735b891524aa94280fc8e80fcbebd159972df911eb10f78067e51a593915fe3f76074004079c76514dc3751256eaf46638804c688db041e17ffe3d5beb01f3ac841f7cd7481a78204d64002c6888f6f10a2861c5f861c2540871c6f95683024c2b6088bdbe6c53cbda5219247637aacf085e1e0caad813c9b2b7acf3b3b537adc3737b8d52711a6520918da3a993bb82151026e37251bd4a2b9786deb622466839b6bcf676dd007fedcebfec6d15b3b099d74935275f1d3387dd3406207c9b1aa24e50099182902994cf10880c88d4ba2bea893c832096c8a6e5ea294ab4b5ce15245bda24e5bb475d4add069375d55f75685aa1879bd314ce814c3b8784b79e2e2d64b9bc551df6f7bc30596cd9de05b13135b72ad966c9d1359939a3629ed3d4bb4db53da5bdac7c4ac75b2471a1edd8ede9bace6e1b59f7dfb7950cf066136b8251c304f87a1435cba515fdde9b7fede57a2fa7b5f753727917d388a0a45095d6e1d766aaabfbfb8ab2e9a7007e9a65d6e14a54eb5ce99e8d3342f73e8afb950488461aad70adf5b37779792ad63d62beb62af5a31fcf1d9c1854fa28978263a7824471ea8436407ce3c1a4568582411b18328c8f1b005394228728438c85127c6215b20896f40af74d4885e994e91882c401ce51df521e2287dc0140ff1626219cda5e494e660f79c3401d230a35766afcc98743aa5550eb72f65a4604f86544e3851dd13bc31bef8705f1e53480c699a83357d00f81e3e6e07618c315ed11ca4018f2245a822ad024fe12e36f1855ba22e93a9e914fd4431a402c31c0a431c38038bcce07690a68896214d64b1d12af090523792483fc7c9681b4d74749a648c119770c858ba4165180a7fa003b971065ae65b03696860210d3683dbd980b7d18007502003bdf2f2c4323af0814ee25948536303718690d1f111e21898fb1814b7bb32bc9ae5118192f202f65c3df50971fb13caeb13471e4fe5e59717bce0a9bcdc652f2ed8e2a9bc3ce16e7e9226398220778c71638144c45f26b9bf83a8932509070707070a9a77b56d1bfa1355e429b4813f36d006fefcfc501774818dd354cc4e72697336c86d1c1ccbb258b8b0933444c063e9244f45dea56f841f196be0ccf03090b870afd078782cd0a64f1e4b1b892af23288c0fde03a20d1e0be20ab20cb2d4b952c0990c44864691c1c23384670707a903304213af0274977646923462e097791e6789abbc248648938883d18c28d47c8f28d8d7492fe49d22b1ded22bd02299c73ceb70ff9ea90e56507793098846234dd03f2f0d821cb24dd4bd24972f60348102804ea34dcc95e6d126612c0dc3891858483d33859be92224b27892af29492b23c723b9205e21eee4d1259449734d4499264a9021fdab667292067ee067f401bf8b305fce91524d0de059da0b4765a97aaa29452fac6fd0c6edd65b72e26db67dbc3ac4cb69b8e2b5f14489d6e6dd3ba541346692e0a17622ad1703b455e4dca4195ff63a16f9a8ce4ae7b27b2d0ee91cd43e9bd24d2cf71547294823a5c9d9611f294bb324833aec3ede48ee3c16470bbe893236a13172728e7b8e8d33528b89351c2dde339c13e6fc705ee8ebba743d27037a3717745d887a3a6c9d3042353e891c76a702410ca43f14c3c3c9125527a6f7d5802913832484d64e9233c15f9264ca1af90e5273cb19adbc99b9b5ee9a804022980019f0c58977f00f742c61033ae972fbb52bafe729d2292b8859ca134b246daec3c1a1616494852995022bd225faf5e7994475b9b357b621b24b2c1213f2ef60e0ec952a739793bdc50f3b064703bb89329d0dc94873ba2fff04e860fef3894773f794772f19dae91f103ee6474b1a6e38e82bb9fe08e745de0eed6bcc7126b5a455e147d4051dcae892c92deee525c7373f372177d6a769a93bf892c92e7ca939f604944ee14694ef268d666d3703ba9e323752411b903fab4af3950f7658f2ed674fd06f9a3577cb4883f11494c12b798a197279797363bf1cfda79d6ceb3ac6dd4350f86bcb5c27dcd9570f7b0e048b87b57d43cfa883f80f4cab35ef2f74a6ee1be40bc847417dbc956a2fef2b3a423f2fd864723dea2db7c9daccbfc34554128a55e9e4c3e3f6f627d6ed3adadc28131e6a9695a5590c9a24e858da5f358d789b66e00593e240fda3a2973660d69164904d6d89ccb1de4d140e00ef298fe60be3698d31cade01fb41102337c47e54fa9014053a91d6e8ca7124f630c6b86db97d9abebfa555515fdb5bdebb1dee4a36b5b07ba5672ddc4c4c5b19fbce4c2e4264f3111897eb2dde6442f79e826076d2f2f97bc46eb6282dfbd4c9a2829b946b85432fae8ba30288a2bff9a33793419fd2a29799665d94b4a4c4a4c48a45fd79f35218db6eca3eb2626d9757d74932cfb75917e5d2d71079549a45176d2cb9a6c4e746ceb6e16d1e6442dad55d7abaccaaa0e2557bf3a66576655a21ada3268efabcbec15e8d5cdaaaae45528749148646262f297974d70897418936737c1af39936727fd5e265f5b77e5eb255b0773c9471b69db3a9a2fedcf8e2e93475ae857486485300459bf1bc8e666c7b2ceae0cd3e65ac65ed5abb774876259d5e5836219b675f515befa51bf951583e89db67525af1505dd64a49d5ed28b3638041269ceba89756d1b5df492aa3a7ccd89aed12cabb20c97b4ec5955490b8ae28af0455927932f868d304c341289b0d02b5128c39e65d54555f54c8461afaa9048f4aa6a893ba81ccab08bb6ead986bd90759005739ab32e93af0ada2362c6905aa7dbcbd5b2f06b501437763c2543b52a659fb8d56b955bec4d08d8ed56a7f76c91598539e7ac1e6dac142f937fd4cbe4c6160b5d03e91c208dd32cd8ad1fcd5936cd5942a0391116f5485ba531655d321ddc863a9d63592bd6ed656bbd6bf068d85b6f1bc01af5d6abedd9b2b69e018c6175cfd61b37140f86f52c07d7fa912deb28b086656957adb1c65b18a675a8375401e7487dbd22e7843deeec5e736f9626c64c4c3db70fe820f5b4b9af344def99e7f492b49d98884bb89e3db3b716f6b02c6c73d46c5df6e565f9f75eb6d2c55eaf35abb55698f9aa5ab32c56eb2d0d5d006bd4470bba9db087c535eb2c862ec02d6d71691efba5ac5bdcddb06e6f6fb16ae32976fb72ddd60bbb115f8ff852d8bae8906c66d6de5a8cc934611fad78486373478f592bbbc50e69600deb58076b7247a345b1d3cc823d6c4718fbfa98c57afb2d6e99ccd966ed67c5167d056fad35a35e551965dfd2192e51c74e7f23cbf1b5a7d93b1def64c63eed4b761858657fb4bf327b0c9b999a32d59520d7d778590b537f658baf5a6f3799a9fa2cebd005b0c6853d72c5f0b3f3147b7db864c4cbd85f5ec6b0c767d8e3b12893adcd36cc5eb893991eba00c698b0c4548444be0a0bea4172cde25f4a1779f294bd5e577c0ffb8b90263794396a7e997da12bdd93a20ad22bef51364f75d1863d6ed5eb46757cd8a2de297a53e1bc53959027edab8cb7e4ad9c48c158b69202d6a01e9f15bdf8dea32a75ea1d512d0a97ece1abd6692bde23ee6ebcc71cef117655900c31fb221fed836f9ec81273ded58de461281cad88c0732171cc79b813c1ca48c331c7c2c29ad94ed9c618238e97f1f2c9ee0439e65709c95d75181f7588036bbc435ce5e4aea2a8bf57f1b1ab8290e0a9f423f0589288483c1aa24b0c825047252186399c6995a68fdb56c5186f69f50a07c688afec0b7d7db53deca1cd3aedae7c37da3a24782cade94496a8d3563c9668051659f6702665773d2acb7089dec22277cd0367a2158f053ef154ba79e46da8abd371611b120f86f5695fa8c354b883d2e6b8ac77049e8ac5932d2c7b5e25057659f6da66a653a601ae7da8f48c95d5552c19a211000000001314402030140c070463b158382a9765397b14800c9bae526c509b66498e53c81863900120300000020000c1244800b5aff221b79000fb1315ba51b9b2cddfa045fecc9eb7daa0bcd30545994d6b81def239441d8853d9a1f557714ff8a3747403740da96f299a327661b427344e438f631fd7adb24bcdd6b3391534ef69def83131b9d11059809991b081022d039433b28717f4b8eb469830018f1c1b2511ee1fd11e73895d2314b6becb5a49dc237c88f7a1732f73db6161185847d4b94f1059f3d3c05a3835895ba4a92da1bdd68d5f6ba40702e7e24165efd89ec31c969d3c9be5cc8876a28aaab5d1974ebf05ab799a5e524615fc90524aaf12e99b4e4da114c7d4a85b7fd37b80fa4d036de13b6ed4033ecff504c59da3a891c4059de49b5bb98a8a88b0568e25f21b9ee2ae50ea1b1ec1426b4f69256d6002bfb419b0de702d27f1ea05544b2c4ff7bb9ae9084818307f9d8209c17033bdedc5e9a9c7ad8d99c487128cb4b7387982756c801451253ebaea3585f2846543af415fd6bb92561ae201bd10529a7a7838673cd6f53f983f7251209ac5d886cc85240077d0b76cfbdee27429730d582356168533a170bb5d36471d43236cfda9d55437299231813ea4beaca8b0e21d111c37011c11982ba2591c6936cb5d48391f092c5287dad64709f6a57aa4ad169c8283551f5af1b4f81cc90bb085aac5539baf380227ec1abe808b2c801d16e4d4fc390302293af69b39e4f2def0b3de389603b9332612f2a51c52df7fc0ce724fdac5b067488bb5c3e8a3c130206180ed4e4b8337ac52f4b542a01fb378354cff0a9cdf1dc181c9a9b7317fdd3502cc0ae5c93910cf41241222fd7e577e5655aa4dbd4accae7a899ca489d3ec80e102da05deb54421410e6f0d1fcc68fe87405ed5a62d9d1dfd6317c5902697077fdea865e9e938678862c482ee2735cb55826d348f7e9c6b56338ef78eee735bbe16e2b103f4cad79c14b83112a778aee2e55764ffb6d081fb641ab92939f6c4bc25bc6495aa1fbee59e81ea3bb720098114c121460bdd9867601219a791aa8b82e07a6d9f8230f0a22700ee0777fac4733608aea3b2b4bcbfadc0e2d9f1d5427887a56f5660934e55e965247fdbc8076e50a06913f939adc0a782a27c105e20fa21e09adface39863de7228227d4ab399d14148ad0558315c79f00af3abba4d18ebf8bdfaf8c4f66cc35e2aec95f531297fe61ecf2b6e51623f89cdcd42b06eacb9dcca6e62e97fadf703aeb38f8bd1c2bd043c4b2bc3e8e476afea18953a2e1923f9d3c60ca95eb29b446a00aa1478639491ed9796a6f40ab97f08bc26749412083be65a48de879f175baa7c8d987350353809adb7a180732ae74e907a44be9cabb1a6f07eac20270e63c4876f3bd3bfb60ebb8870a153facf76bae1edad40388f0ee10c08879d75410063c17774d7c9e4074dc96106d378a42fd2555e413e0827d67ae890db6cabf9d3430cf481abb2124ee4d4e7194e789735c98946f5287eb7a36cd1d3437aa124cf09c3690822cabcf7d1eaef8fd653043285d20187443ab113680090633f5f155ed5017561fa0aad8db34512b2fdf5a1a7a5a0157058437dd979230b93e57eff8f0515c437f040feb9bec366f8d3bb29adb03bd3852c9d1a808b947421f32b32282044b8c8aa0ee434b3c18011e92e240f79e41e7f7a3cd1992da8cdc7adf217cd671c37d01700e5f09e97923ce1df1e281149091b21dcea344f68dabdce855fe30e96966f1ce94461325bc8b311b842f866d30cafb8ce6fba0fad84c0a2dccab8744ac00d06d1ee02fbd38b43162a4fc58265c9ebabb54e8fb98f9472ebed0128f8abd0fa15259ebac26509b520812747cab31a07d437d26a86d82b5a8810e6c83a0facafccd5dddfa4a4a24885af7d6c30e897d5f47834facec1dc22f6ed0f92a65229b75ebe3eee34d610df7da8a1e7a0ceaf49e6f8f427ecf3385d8b0fa8615dedb5d1117438c7f1edd7ab0e34172f44293e85518e56ac88894029b73275e0df7aac58d0d285684f6d593e4debcfb7553c2139adbf516d0d608291fa3e570539e67a2d40a49dfcffb7481ce67e9b9739a8f708994aeed94222824f5fc50d965468794fe09658a086852cef4bc53fd6af89d81d8564d794b64fb1d18ffb88fcd40157b32c1c9db45dd71c1074104ff3ebb3847a1dc6b792919d1fad142819575928dcef261cbe78c8e7e0f1418ed3ea7411caf6f1312a29e1b6e6c7c1bfb3f772a0196f2ab8876f282000562dbb37db083d169536dee71ff682cc7850fc70fa7717367c25226fa600665ca7e99f147faf35659ceee8fe2f4938e7d9ddc957cda663ce198b543a55b74c7dad8194157bdd680b69a9dbc6e5d8ca7931165a6c8fdda192fbebb03e472a2dd3b444a9823cd4387d6a42e0d5a7d44aed54195362e9bf5f7d6b880f740994f10c3dc265c23adb33f30ca386ab90b2f7f430caaaf12a1959ae0bfe1743d0b0fb27747e147682346994e2bab55213b9bbaea1f336dc10ba0414b64353d37bd48f7ac1e865147cc7a1c5a86bac41fdd08f87704b08ffadf7dbc4594dcaf1703873c2cb817a706bb14efb8017e4f13bdee2e2d71012c0b104354b5e32fa2cdf8db5aa327713f6cf6e962982d808629a69bba07ce63a15c5ad097794df0b94358a49f69c1e0e7011aeecc4c47a6a59ec81127d7284cc7b321f2f5d632efe763815e77b1073d1f160c04daa0f478c3b56538c6c1460a5d027fc55d95f558d70b009064540d62284703379245b353c276f3f055e0cbfc5fa8ce22fd5cc740a9da3760f8929c95aad1d17369901d274868a1449677f4ba56c566db6e2cc45a957e98242db5129c20cd509796da0e4b785418544dbe6f179b3e2116867a241c67b5a46930d38200a8167abd625bc7226ddfd3b4b14f9a4086eee36358ed78a9ee44d31ceda216626e8fbadd0467a928b383a5c45203519637d1cf7db6eae20708ebe6ab9d19362dede563f9a68a007c605078481b26a6f120d0e9573d55ab39fabf4da9cbd4d5fd9f196c43a40d216197cb12b0c4b1e01010732eba06238ede36b20fd94aa161e0377fc1b9e6609a1a59d448a2de555dcba680f40b2c9c00670d9aec07826ee141fa4f74f602b7c850786c6d6b0d36b249126ffb4162127617a10c37ca411aef1c46dfc6a3a0ef247698279227c2f2ff56f6fd09f7bf7511062a5346288286494d20ab5eda405436b5bc41f7f5b88b1a12d673b281f8e5fb51d260d4312b692ae6e70a6009326978cc69afa77d420d22f3a796b2144bb2a2d17443ace86b58d3d7a6a3f6ff03663c01ae8c01288b083d7f3405acd41e3567dc8659049d569657c7a73d1c2b525db8854b91df59f7d9482aad4a0a273d3080c686148be174cf7a18baa73360e927346d0a7413937054cb415b4c0e7f7f1dc2ab459be09f1a61f5a00fdf7c39f1990dd81a9e94e7f2b8b351b810798c1af0706b972aff8ab705394019a50c829a621d0a13020b989c64f9174ffe02309cec18a9f7de675cafa003f38cc5f6c6cacfbf3b429dbe3fe44b9e0f89c6aee4d04e11c2b891a5e48c02d850d404cc4b1e0aa6cb5c79cbac5635f8e7e898da4e40a85035d818e4057507dd10049e77372a159616a99991a0c566bef8701df8665234c48135c799b14009d1de10fd00ac0deab32ef815b909ec42cf3391e503f4fcb28d4bb82cf98c4c305e2198903c29f9764505b62ceb186f39361999c36f7479afb0d1366701cc9f4efd0aa35380417ecec931cd0d05f04dc59d09179860cfe2a4ecdd4de2795fcbc414bc28255fd7382ea68fb6d9ef32e3f8fda27048d29c9aebd8a96ddda49d15f6e6a16ce84a6a2e0c6687099a02fe5f53d7db5d8e70749c62256d9d1509e630e2200e87e20b2242dd375cfa1b2884e8874d2d300c13977bebff486ffb3d376bd39a678e6908780ee894e54c40457d3be4c2e3f3d7589d36b8bd90c66e9aa28428e88032b536b01ff4991d8f455562e468ab544243e4059d0fce3ce912fde4ce96f5c5d86be74b400f352cccd2bda34b98d902656225dcca0bf1215d9c4f3a04ee07a102f79607d894c15b520cf94bc20539e30a3139618f0b2ae991944eac33555806ace8815ef2d4942408a0c7dbac667f55464e94d029552666aca6cd78a4f2745f8995e4d7df39c554a4fea3f122b90a8145f134d82e0e426048f7601e5b814318627260aa7e492452584904659a035db933fab03307922c5850f9c3e3f80153ca2f07c105562f1fd9110cf1997e582d894c2256a9d9573bb4489a8474aa41e3693cf1e0a822bef4cf65b11f5a4a8029ba02c0c42a9fbd30b18c701bb695b6c49108a529e83d7adcc984efde72b148bbf9d0d410ac3815c67bb7235279b39263192ec419cd0d1d21dba8ca77dec960941ecec3a73ca78f7d921e2742324299e42e36145272d73f3daaa3b32cb64dc73e7e11ae0724c36444a7f3593f90f57394155ae50cc75c7b3be2cd2b77698d70bcf480d476ff5addbbb62d8c692effff0e839ccff56b39b1f2f3e42c07ef091973e32ad8e576dd62bc5db188246c49dc4e225f8e9b3444496521eacf492bca814b856a092022adc4b357dea27f3b509ef706195aaeafb674f316201592169d15b7e34b6b7dcd3624c4d2a2f3aaa280cf6bc62fc4b625d592e1cbc0e045ea972bcf577e61a54fe508746ac4db594b63ea1479d9213704067771a46c000bf73ca439b138c89462e4b71e60b465863e5a830f987a2f4c8148a729b447fcb0970378090653ee0da33ea42579bb094508ae023b4a1bef594f80a4664d9f8192c8caba682de15f9054085526f475017e0744235633ed6427a1acb49617d864f754ce006a5f3d9b886a969f0dab7c9a0e25c26e52ed01789c521e4a8484c7ac187ab77830d93b37ba7775fe4901f955a189d6d12acc6d774d8a62c32825300638efa3ca2745e7253a6c958a6e528f3e1d2d6d07b7e09a8d6010f8d2c2fbd6f74df3e975e939d13a966f3b4f2a947fed907495985a8bead785312a1639d7d72c4f6bea24990a8c8cca9bbe213d0078453fc6cba19eb9d56383a29842b2887f13adc50f1f070c548156792d40befa3f9b0d03c9e01f14a3ee54832f64f2ea07553fdc2391ef2e11db2a984224cd6d72a96322b39f256f86f5e41cefa96899930cc9b4a5d0a0c3dd51d17a4f0decd6592bb2c56dd4549e6d015accaf663def3da3a096334456d8a55565e8e88af26336c13556b3317d3f3c403744c0622b34cb32e6f0e326a3c900c0341264e47774bb1ecc90abd8d095d0aeaf2959e1d3c102e14ae57c76f3463f39ea8d24ae6a4c0fef2a4976dbf43d4bef935ee62ec91a6e3ecbb0341b0798e700907b18486811672b4731e67b841cfcfd40d657254f9870f8025dc6234ac6ea919f1a0b98f3e91ee81da4b21ad806b8e516bd36c71caf57c147dfc68118e63e75881f3116f2b16a8a04a688245dd4ce602d57a8e1fece5300a88ed5c7bfdef5827e01c1538c652d684fa8a62490897e5a06c3eef44b981423189de5103577ce10c5fbaf024526d2ec86303f3bb347277b133311cb3f4a3b88fefb48bcb1adf7d56d3c266d9c9f2472dcbfeab72476372eb39d94ff204c7b00c20cf62295cb247f0780f3f0c191c699e27ad98bd6ad7d902d61c017ffeddc7809eec2f7e80c3798daa49a98109b9967c5f98d2877904a8bc4f2e7b6402f80b67493838050b51f4c1604b64ad9544b0d8363a2634fa1c225f56330f6b3814e04ea164e1584f93885a37252241118da29b510fdaa614d122da442385e61eae903d63fe5983233814a91ab9a99446d156724996ee2bfbb91c85bbe8869a463b02bef01565d2d1fca5d87ae23939bb532473c16fb7f8150a32202f5ee2eb015168f0249ed84b7a65506e2fa3dc4c0e81ef4cd4becd4a616a6c2312f5213e91dbdfb35344c5d9c7435cab45193fd499fa6f5e31ab83d00ba5bc58aae10cd0715ea6110af6f84d249795a187a95dcbff80daa1749383b310e6c1ee068247a9a2e2c321a81596a2b99a0c6296c9c9b86525394313a38ba1aacfbfe75b48727060e14985187ba0242012d0c22c9b7508194a8c04e825ec9734f62816d4c2d3836f085b9a4d6bb97f7af0ec2a85041948a5bfd2bebb5a1a5339ce729ed0965d2ff1598f3e1e533b95266c4655613c4e21abd7bb0ac82ddc8b4d58331c10c31c8726a981eb3d30f4e28e9863814f42bcdb1666cfa6729db5206317db924f669482766561ad27259112aeb6ba8970fd52fee40208afed5fca1e679942c532456e1aac12a242b3f56f55b592fd569fb384291a0b4ff0d8682e2d9caa8d46386f0ffa8a30aa9541380801f27f5b60246c574b1ca170dd2ea886bfe473ad6e055d09bb62ff5850410e7b231aeea855da2aa8a41b79ff88ecc025902d5298ddeb2a84f2caa44f7fce1912de93750c51c3751f352a5034d253f986699495c1fd794bf0c8be082132943c1896959f231804762f5559b336de265e0370c719cd9ede74524f81dcb8b113a10e29df401290276c786cd4cc09d5d7e51492a054b087d25001c13bdc4bf88100c13d9221e2551ce580e9ed18cebd617aff59fe07eb683a72bfb8d716e84a66a252807fc2c67a452ab3452569a9bd95012a5f94f7e24bb6fa5e83a53713ec4dd8f9b50865730b71fe236aa94f6bd2d34a8c97f4ba56ca4bd803cfac2a9f0953420e4fe2eb6862e041b5540592d9200a09f5e320e9a6ddbc34585810912d0dccc79697064241a9d960d88a941075580053b89728f0e1e893f31b71b12da846bae282b62ca40f9dc61598b2ee2c32dd7708064ab0ac6941528e99a36c3431c5988949973599e47c4988655f5ec961646e9933af5bc9490d159f90a0fb61fd81c8eb8b4771298592e20f3af206aab923a862a3d9570344d21e271588984019e7eff9a8d581442f954c4770eac33e2e251f0c6c8e10662837feffc8245cb11920f7629718d6b985651616e9efbf30c5130bfd0111922889ae233631b11014f1206705d7a93c0f14994f68a82a14e93528350f01189a024391c97ed78222a2300482499a916a2812cc234863a467f923e046446067cf1f31f120a1d546a834a7c360e53fe5c9f0c8d712064860bfaefb7f02a0f3026bb45e4fe73c893c702c86e4bb6a3a5420af1f11c27b43090bf5701810f514eb6ac78165854181f0f1dd3ee0b53263ac31b5dc50f3653eea8df19476688f15f9603612a92d9e098aeca8a5ea8142336fd2b8252d6c2404ab3888500722117d23f50d6231f6876d6b6f2a26eb6b4e58c08877ef647d11be216c15b021e5e33f28a7e5660dbdba11ab3850b0393fce875a0a6ac79fcb21c7451d94e35bdbcbf4d778a80e9d7f51e6b18ebb9e70a454b3b0a26415f1184d67df86be84e68f27e5688b75b5d5748229b4cce523b09deda1b00362eb65298b03a99b60f58483d025c8a5a721dd9a41cd5a248b9d42bfd72202d4012b8b395264d765dae581d182b8e199e48f139174088bea5a1deabd1713464be68240dfdbd662251e2d264b29358c20f646c61fd86ec06d824c2271fb0318f10a27dcd97a9b0e2d3a04c795ad3e0d8e6e9f37a393880d7d3fece448d02d8defc51d8525032931754eca9756bfa267700d8538113b11dd8d704a24225f29ceda521abd31d06bc34e8bf6373d3d5c7b59b0835b099830ad6a61ee3a4fd5cbb92a2f66bc8b30cd40c89cd434e833d104c6daf9df3d67a84800800bbf46a75862ae4b13e0323358e492ec085b914a2fbff3d28e98d339a616f258f9efdc8068be066360848fb02be144fff1197f7ed3a7fc8d9311913aeb9dd4954519adb2300ce2ef744ba0528ec3948f1336df9121292b85cd95fa5a6f990b6a690d3c3bad16359cf77e4329e2fc89054ac03faf94ec4f69cd549606e09660c23f92a2cbf2bb2bd46dc13dc99f772eef219bd41c24d50be0706724fe20cd1e1c26226fe3460bf41cc057c782bc89f3e5a9b74202c9842638882dfd5ff8248d1c2071ff8fc52d22405c1fd91d99e4f1ec0170a1bd4479c560c8ed684a345fb8b5ccbe461252190c362936999eda71772497bce26205def90fafa4411d057e6039216630caa963a7196a1746b59e73b91e0f328c592ecac14cc38d466dd97792a5ae03060b5e26050abab52df9863e1f24d8914447b71c39a8a42a38241dcefa154e69ef201ebec2e2df37143a528bbe324e5b2d4687b2b6da4b7c898baebf42e71e3e645e280bc84080b5f0641518f7f97e89ebe074be229625d596d321cf0cad8e358a1ae130e0d56453b8beccee1a8f4c5c5abe542b18e6c5e58abe3e6eb7188c54ce02afd9092bb2a22d2419e0eba9df7e0ac2ac8a7d6144e62b2f28a4083b6d4bad4134ca50e725c1d82d288d15ae044c41c49a71c6f4e68175a0fcfd41f8f4a0d7f6fd64276719970644709808a528d1bad143be33482922ad7d31345f76290038fbaaf54aa8ad795ceab8df11070a063b79012c831837f4e1b969b685d8d88e440211c679a264df692cf4959ac96ccd1fb976b009cb472a13a8f7b853d16a4adb06d195a6e60dbc9dafb4a103fdbb06a4ff4baaa193046aca8f69f3efe19be810d08bc6b83c11087954475d0e38e2f9829566072c3e69d3347ac3e4f25310d88b9072a9c48278834e70901fc7a082f5b5e0f09a3f85a3253603a7d10011aa11fc30d5293c4d57fe56992342a2e66eb60346f2d7f6c4d18dd8cc6d7683aee6473a3f0f9ea8e6fd1f02391f823c5f045cdb20cc6dff0ea2269544d9dcad8e76794c57a5f87e610bfc3bd22b07d7f94f00786c1cc6c92d001855989b831bbf7fe5d189686f6ae52ae67f91f8f87bad86f978fc5278a060df3c0948a2febe4639dea548d8eced34292bead3d74a7348132d6604b9b6f68546f35e1977eb2e45ce609a0a25db364f2350db7632f7dee01bca235b6e44e27072cc66853c6969638e0cf958e66307c6636ec5a2c1ce37a0ce35c79e2204cb1ace371115124e8249aa228173477f44be82abaa6862ad982f5b7a6d87948fdb67376105d981e22644c57822cd9801eb644bbf581b3163688052b72550b121e3b6134234f3dbe69620b4fb9e2a1bb2d1ae85d4097a4386bc884e70190a4ad97fc47b8bfbfddbfd5d629e05b49f06a52876530a7aad3753c3bab87afa23cc85c21f94aa60e0cb25f220ff00a576e341df2d1917dec00aa8553fef603f1c1dd24aef491b932b6df84d784abeada098583e7b2ccc8d400408240b3fd58f4dabb56c648a5c3cef3019ccab07ee1930a7db4dc97e1845097bafffd58b9d22fa9ddcb9b704214fb7362132f3d094ddf959a159be08c1ef279465ca2f56fd7f2a23216346f91b8b0230a35cd75f8c694174e416054d2919350bff89ebcd1b67fcfcb7f821034eff4b839e85cefd86d1b995115eb8f782cdac6390cf3e284587ae3ac91b46843e51c7e32bcb98c6f3e6a68f53a2299ace4ac5a8f89ad3c8e9dd8f970763114fd0e61318c81517d4c7fbfcdb95d9eecc89792afcfa718ab46e947013247966188295370551c85aeb2ad091495c54fb4a341d45e4317650d498468407a5e1199088a057eac11f0f76efaff375e166833e0933de0cb6e978b7d55a51e4e57afe9a7df7330a170e30554c9bf2d36ed12191fe73e3a310c0cdeb3a47d940471cb04c563097bcfa93db221a7660f0233a8123e68b1b66df074bf566871ee0365bcc68ed170cccd943dea019fea530580e8eb98822fd28fee056b70b56b65b1282846a4f77a3c0ffdf97f2f20a6b72f870d6dc38b6692752c15dbee1776c39f804d74356cb4137fc65e16fd6bac017dd7667c9a10eb2d088d06f0e03a989e21b31bcdf30fa1b6e7de5487f30c45a28ff32b26c7307f6755ea7b5af20f4643dcce820c47e3c512350aa0b59a3918d2d842706078aa1f896971bcdb8addc668199029d26a543144d03d1fd65b49308b5b3ce0a0c167560a198682d5ae25f34554aa6f12f0595b363a34b1eb8563f6f535802b135908617c242eebb50b8cbc2cc6813c4f104b7c37e7ff34048304370ab13d30e8fe19a28bac5549f6e2931e9a3f8d442799d00ae94af7c6e3600cf35ac06d9fa50b2c4b7d4ef88514acdd8ef7200b2c0a91e05120ae8ec53b1d9d6636594205bff6f84ed927768352daf0fd9bd6e83e720e0cfd1cd73178f179bdc6a02042fb120ab33688bae58d6e380113f3cb6b21fabf2526460defd9c03c5c7a219055e1e4ca471c41710691872fbfcac1f50c8a1fe7d7dec17d66c33bd0bccc314a0b4e9a2631885a1f3df67dcba0f0e28300d7fb7b1f989221ef1a9d8b21b6cd08e1e1d6b4efb6600cfc46c87f3e12471f51a0f96afb200d41a441590afbd72d1e9e677df236ab6c112021ce5d0bbb529416bc1e3bb7d7d411ea98ae647a4b48e866f240673bd616b752bb3ba611878b4507b0959c2be4327dda8faf21e5f3bd10de804b518bc7ba1067bfc88aab2189e50a876a83f311e08e2948ba7f5055816cee44979616570b0acbb3aee9d45b91fd0928ff3a4b4761d71062e64826bd7337ab9c00fd1af0a30be04bf35a730cc076dc075f4bb25e68d28ccacf0f7b03d208162a1fca8d4722c8020492c4d403aad2a693384d438595dcaf405059f41348d722bff9a4be0c9e7f53b6fc9193312dc568c5c27e78d6bb0123329fe562b34e1bdd1e6a05ee1d976c14591336c4acf9e6e246268053441205bdea11090685ec2afaaddce46262d9c3f3f02dddb7402dc74d42fa25756738ee0fb1dd503e16267ab574833cd5014ec8deb322d0af6aefe3840f9ae81cf2d87adab820580e266c32ad6df2b966bc06954a0e62936974e6c5dd85d8b431f5208370c92c37fdad9fb78e891a14cd218e7ecc7d01601855464aaacd68d91700ccd2dc8be2e21ce6520bc8f219974cafc642041a63cfeed5fa331154e24a0413e67138017b31f4979565e63c852b7b6721d724c405f78e1f6b9dffba93f3de845596ff5c2b4241522dc592da4175999446ca2fc1d07781df2c2b01449540d2bb16d4375fbd5c98d8590909b872bc0ee18f50283a763b0d26944a5ef14087d37a1cbce9a914c2b35a5eaa2d5e129ce5a606041779a241e36ac0925b7c2e85f1c5eac5cc2326bfe3a514781feb269bb905f5bf766e7737b7579e160f3595ff9b9bbddb0fdf69d2c5b63f0de6263f0547bc288feee890cd0dcc3554286807ffa27f9aaddee0e0607e189951dc5017d6b4290cd44b4d87c470beaf52e8fc1aa7a226072fe0259db9942a90f0b691802a518d6109202300a002f40a1f66530dcceb9ab4ed4798ab94658fba2206f1468cc07cbdf075c9e62af29306acc39a83e844c61428d49c69228f9f052312967b7968751ff3f9f4aec3651353a0163dcf28746c7d6b0abbdf96edc932941329dc71b4936a37534ddcba36408878133a6da6ec8939c08a158fa505da4b4e5d5952368a9b4d1328cf81b040a4e8c01267def160579053da33eef8a8589516c5b90f24033c349b6ca3607009a12e63f94de3d97b39ffe77d01382703e303fdb687908e747906c9d968f8ce8890a5c0b9edac2dda1741bdd1bd27403e1cac94ddb64eff7070b8e0537e226058f60f92c0b23dc6f8b40d9b10584bc44a6928fd312cfa208998dc1361a7ce99919ef210351f21e186aed994347627fe573a15b6f7dd48a6cce38944c75f3d53dc2f1ff2e56ef36f4fe6d3c214f8abdaca68be78257fd3a87c8bbca13429ad7d77ac09e3ea6e9aaf23f3d9ad02f0328246983b93aa0a4a7ba91fe82861b7978e49d823e48bf063005b4eb81a24a8fec76aad56b18b4344073bb6fae7d96010922e2a1519b29ecff9b531f5310eb6b396c3e53e1245494981cb9f5ce2fcce77d12a134fcdaf5ec3fb1818732e77ea8e4bda4be8a63442e50839b2e91cd5c432755eda3b4e9a3c0e2159b0ee9be60203dc6d80f05807fc2189d9b25aa3eb20368ade9161deeca609928a0878599a66ba10ee1c82f476f47ea278d67c6153c126a640c53e2b0dc59e3c19914e0397b2b54c65f72345aa2f18572e7184d65248f49376fc1b48e3bce390ed455da1ad06888bcd1cb7bcac6f9f367eaa00ef6891470c43255766a7a6dda124a6d7c4edad5117cb3b070ed9213a55da93f85b03eff0040649e7b9c5aeb65fbeda528252bd31a41891a99f5915291050b59ecd234c2c4a860f1f459f10095c8866e1754f69050c327fb4589c00507ef8765e87393ee57d4298e005fff5dd473866b2111f194f3143b688095a1397acc2f96e8460f86ae96179caf1073bd0d239e19a41d533710c920ef4164feefa168e9c19df6795a4564b0d532b423f5dd16b7eb61588a7480fea0f6f212e04fe8053728567547d011eb145863a934c31d7c069ee286e3f1581abba4aa6fd95f72c5c81792ff90627d1fc4dbadf623e80350c06b0b138ac5ad4f88ca8599b04c65acf7e8b3b0791092eb93b9685847a2d7bb2e5327236e3b869e4df5bcb3d76ba63c3a44223a779e7937ecd7ab974e07a8a3f381844536ba91e85fd14bff200a9bbdd5914417aa3c22e5777ea5000724298c3a4e2937a6c0e1e443350b786f09d91bacb247900f651c3d7be974ec4e757ec449b047beca1dce60f8551ee8c2a594b1277969a488bed1466cba20e8283d618b1b1ef5885d3cc2e72cbf0e393d4117781ce8611d1adc8aaf15f841dd284c4182b2263b598754ba30ad3826dceac537f02669e25afd70847296ac3d79209f4b4f135abbd4c1f4ac9ed4801e9b2647b4bcc1b0c23d90d41d30207d704ca9da15ecb90fba069e677165b4822e9a6f8e53c730693ec4b83491c8628f78ef84f8405b36d9a9f1354fccd82b12a5d66bc27ce300af332135fa420d86f8b02980c88c2192048a94470300300223b3c4478d7c68e4eb2678b99c0fe8b233404a9aea84976926c417e0a55c3bdd8812a53261c261d9bd410207475fb9ee5a745768ab32234957440b7a23a4784d5c300d09845d27ccf7d63e2340bf14bf5580b32f06bc98cf1b06be0762fb8e2effcdb94be17a6f0df70fdac6ac15e5cf116605fe407a4210eea9dfb313a4f5ec84e35f795bf2067d029feb44796fa298bbd4ccff932aca8ef63f74d1114f919b550b713e11012e578d2d551182ea02f9d531d0a75f7068881c1a8e0f68ae841abcdecf6225e7cde2d565312cdb926459aee06f963e66230e376e991663b354360f0b73fba4e7ac5507a54b8d03c117189b4f100926a1459a9fe8ff537e480274f769cc6e91c699093f3e57d55583b1120d66e7678de4a1c4f0d1a623ce7020559acabf583df422db2005b7899c80e589e1b5c8acdd38ae90ec8cd864cb8275a001fe4f0581051fa5eda2ac7a5c27f0b13c0639f3c13ed7e01134588efa49c64ea2b5962d56f04fb5a8d376b9de831ca297e778c3477d3281a6a2d968fe85449631401e04710ec4211cf0d6c9314586bee9ace8b195e86b197ded4ca22dbe678194dc8200e9e90aab3853bf93f1d82ac34d2acc64005663d261900fce8345d817290321b6b69fc911791f9b75369f418ccad0391f756fecceccdb8546ddd07b3da45d634efffb15a79887dda85b61a92a8b7d31e48c3a24c551367c83de8691aa626f75c0821c0a51e7dce91512cae90f55fbc07a084541e6c2d9244ec2a04db1f87d04e1e9626f1a1643f61c9624743b6ea2404332bbccd3bd5181ac0405af9791bd8454a45eedc8062f47d53c43432ed44fb04f95d4140ad78ed4ef6691b46c96a6897430b0219dabbcca3522b0d651b34578da4867d327fd4fffa6bda30350b394bd7318075377ccbb85ea795362b4682baa59493125caf0e4b30444ab2a9ee900779d14583d2afa0c39ee95cec03b87b3a3ed7b51d8f7888b94fc11513f171e1e0fdcb026da852fac5a2c4d12d088743cb473d8cd99182a96aaeabf18274ea5ac94f339f4f241406fecb496127f4f781ee5ed94061b167ecbaef10f95407b3094f87422400e442f8f1ff4ddbf81952c80a61439ec83f0ee7ca37090f43ec076ce819167637cb2450feabb704a62ed45d1cf2d1dbd11ef55c8c89508791ee5804afef460a6f6174e922e715204c83755e07bb8e1f4ae6a7d9fa9681f6213cc3731ac47bff8df3adac67673f95a91f7033cf4030fa6324d25a4c65bd2f91aa9971e4cf5026cc5ee96b1fb0b71a5eb6ab0e158f30421579fa6a0188adaaa47e19172e0055ef33d9d65e70ce8bcc7ea53ca49bcf523bf0cbe443df12e4379f27f757fa055f771291118e845cb9f85e3cf1e2b5d618e6c2a9de1c5889e910d0b20422f4c54b606b716bd8f545530ae42eab8eede18c4b902ebb4884e0287629680104404d846ae7c9ec897badc2148562b6f38fc503e9b3800a7ca7f72202f4bc9b995e02862266cbc9789c8c2c3df7b18b03b11538f07ca29566f3e9c411d6fc4e448407e7cea93e7bc2c7302141ce4bfe03f61ff063b5a4093ef56dbe1d3db803d4fe7966bf23c55d6eb2cc889a666560ede5df0c85a633d540b26ff0024557fd97928d2a838a7fe0c208c9a167338bca621e29ec94b81bdea6505c130ffe6478f1e961913ce0b4f60b99952505a6f0592413628cf58a4e204fef85e2e2983d5120311efa61582a9bda34e3971469460c32718cc6c879d4e8e8f3c12412b68663c0faf42a8e5983dac7ef6bfa8b589eae1955a669f9e85c00237692c9c198143e2d4205921e4b6f25f88cdd6eb42c0d9dc120c75b1aeed5048a5adf04e132f1b712f093887aa9c509489a1239909ca39959b8241d8138502cc8501f063c42443856d07515447196b84673d97ecf0f7c3a46bbb0342dba3cc755c7d91fa721c0d52b1562e6d3a9a433571c75551d794163c9cc811495c508cbbf029b0400a4ebd0699b0a2f5b7fb5ddd1846c15a949dc09db494393977842cdba3528af48d8d516a6e2ae31f2ed0f4c363f0e3bcf810b188f1cd6d786c711ec15f359d0451de79d0828c0d72fe639c9d5076d692b36d3cbacab204d39b3cedc95207da13c41891400e1596bf6680080c08ebcecd6dba65887c780a43e14f73666b47974aa78840055c410cc5e0404ec1a491cdbc056d4576e6d5ec2e5d5a936b4e5edc54d17ce9b1126cb2e660b5fd7989c0342034fe5cdcaadc7a700d1a17c126fb884418a62cc3ef0457c66f55cb78be99dcfa85fb2f607359837ec05b9b9041d6badc038abec51a3c8eea636e1c7c49f8fc1b3167eba483a97294649051b26917076ad10e1438bec577e577a36b5621c7ad606a9db42f7a7ab2142505875daa430c62aa18eabcd5ff6c8feb8374b9fbcbac8c2e880c96bd85f42348ea47a340ff0fb48f5a9f08210fc3a2d28317122d4675f99eae9a5700dba91d595048c5e72f70f2fc6b9369404b7ccb99c0256a6c1f5a01cc4ebeadb4dd25a5d380f398824024666a098745cb019e9140b7ef6907037e65f09b68621b0db3390406544407bb88728f31270d33a9673b2ab589f3f123270a6ea4d21b0446f252cdf81633e011a9b8d66f40ac8fae2abe7ac9aa0d5009a352cdb3c42eb9636f93f86e67531201e32eb00329add1e4d40121c8175954ea0d8c5dca03eb98872e67e438b4acf3491c876c39df622bc59b73fad563b9f83e4335b480323640d04052af341a8efb7682eed6ec750df956086a67cef0c16748d90499744d9459b3871adbb042a186a64abe97f4d87d0d47a1e1a08a16158752489040d901f284243da8d7cab96dd9559c9c76ce14651cb3f3be402e8e294dc36593356ba23a517071af04d0b57dc07ee2cc043223e067717a414f44bed54408f5ff1d43cafd3a93bf4ee0ae6483a14add40f3d830982c92a32b856a765d1ce37ab4bcb4e6094643ebfec7eca9059542f45c5acf8d607d0c7f00b84b49ddf765d02ae20d025f4783412eca396dc70290348b6d0cf494cd65273aa7890d4a587aed12ade34d4c0a13f9567424f29483cf3ef3cdfecfdeec6f90ec4e310eeb8eb25df1dad9ea0b40623c50c1357997591bdf42e52d957a24e5f446d2c3b21a6b4acccaa48a8b8cbe1265048ff6540b01cbb70bcc9f1bbc9087dcae68a2cdd0ee55d8207c65daec58923997f18ece57e9a7b5c5b6c5353db929e1a11944fc169e0930e15725efeee1875ffd862af390653f71b67c1e4c3bfdba055bb2df6a50a69703059989dcc108e9e14dc37cbc5a8904e94841db4ba5e64754d7cee67fc9fe02bcce134f08fe7cd806cf6a8d850f5292ef570b3b3ce37b7c76de84391ac3fe55ca260273703b11d8abe7b78186e8ae5ec778f65c12da40e8eac580a70d83e6a3b0817d9710daeba299cc4de255086c4a0898645b347b05ccbff9ec111cbceea523f3c098ccde3807df84daab9789bf85386e9933ef04a20cc79c2212d98f4ab0e5822102cc62195439514afa020045dd9bab4e89279472f240119d601e885ada824ea192725fbc78d325c82b15710cd903919850554b68174b3b8469d02eb1e5c65342e9cefe0c15c3b51436b2bfb9cca56594f78d7ed5bb0d2e272d21c529bcce613e1199c8ff6300615268e883f3b5ad879fd09f5886b97516e048d1fa4cd54d7e668709bcef06baa4b47a26b6b025b46a8e914b901c8c2c1296a8121f6bcea1631b3e724fdce92f53c054ed15e31ea29edb2b1821a3ecf4eec9ae45424d14bb4f7a4294ee7673036f086f15aa20f4151559766195dfc26ef3743ecc8d6b97910ab056c73ec37454df9acf15f104c0f47c85b1351e54041db97e0c31374694ddf5a88accff9e9b475140a88d9f5bb6a825e6573f56dbe7574250db6c3d9f2c5efd651883f21024beda4cb4330ded857a891ab008ae2b238eb59d4893217e4180fdce196f439fc53e56bc5d4453417deb2c0d89aaddc47aba000469dbef4be4a036a3967394c60713fdd2bc5b03cceda2c8d071792c2fefd11d63d35a2dd66c5fc3859b6984724d471e4c33850a814955a8b0a6ebc1df4690cd1e68431f808bde1eb2bc8776028c4484158439053cc6113c68355fb8f409d30528971ecaa0064c87028e8b8974c73e46aa68e9b04258865905af74ffc998a39160acf68effff4ee0714945d8f9de31b80a49860a87303b0e512ff01bbb2cca2c90981c51a9d52ed7e091e9e049e2fab3671a0be428a69e53eab57c5501f288e36a347fc3f06c89b179a741e59919cbf0574a8017f825fe050489f6aea012fdeb4c3484fe455d4d056a8bf34e03f30b866032e250f3a8ed6a060415b172d84cb29c964442963c31b3e242c520a792f95ab218b4c9acc13484b9a2062685bdee7520c79e9c3115a479b742c6fb6b6cb088c74784c7ab1457fbd753c0ca1220c4712494adb4d1804c5dae3e49c9023885ef263090b4a8c11688e00d1fc63f083f2d1089964bc4b164cc6d9b79568fa4d6ae2f4714a5521680e27ef0c4bf0ae5f7c8daa1ad39e24a6c065e021d166ba05b1b20535374b20f5c611d6c04b1e7b9d71caf09076d0117480ed377b86d92e992183e1ad81a99b65ed4c190e7f9df647f34c83c1990d7263117f2a44cd64000414623985b0b2d15846f1488a33ba0daf5a941403802d0d3624b105ce30b7f346af5e53c7a7b826c167a4a38ff3ddca79027619d20e2a7f871b9c4a042dc529981040a39cc1a65ba1db8b620466e863d6cfdd6b3060c7781455dc9a1aa16370e41912ea43db1ed519e35207a2f8b3e27abed020a300087230e2f1b4048a593bf8d0066212b5836ced6d56292d3017f46f2c44c1693fce19ab69046dd964b0d2f0f24f5164325d9c145a2285c7f07e80615a579fb86a996d64b6ac8ec544c5cd8094dbe72c2d548503c2a5df80d94f2fe821716a18f3a471e63364a4e40f7e0eaf70912af81eaa9d7797f8ad34c81daa4f0374b1989e895962ce9c4e004c9cd9dbd068a41e50c4f3f349097fec249cb1f04bd060245d4eade4fb4c0584482a214a38c8e99eef99a793417934854cde716f875a2df6b20460d20a9a871358058822db19e1fd74c9bdf4667ea2836b483c06ac2ab7a0d10f79850cda9e9d3e0352064558d14ac821304f18b8f9f16c1eefb05b4b4976b7dc01ff51bfbd724c0e2a115806e9136832ec64767a958b101838a0a3c2692bfbb6afa12488556b2015876b28ab55b663f89a7a0731e12b28138dd2f50a275abe153caf4abc950c8a7c5f4c4a506aed02640b736c3874125dc39ed4d31dcc0b84bb947c3e506d7f40d78051ac529047d5771919e277d8d0f391d6f086c208257d923cf43ccfd89d05aa5044e9de9a1334e36c1f161e71a947f776baa2964034051012f30a61804e6afbaae2fda68a8b627d239e1e34e81c375e0e5d0badd10b79b50c01fa1d81da65932ff651536e58d86653795d2957601230fda9a64a36b10582acd82d9607bce4d0607e2cf773c71f9e537b049f88e0c946942f9bd3207c96be9d0a05e053a62966b59f27bbf716063cd0e28965d0873d503eaac70f9e0915ebbcbcb852ddd1823f2a67453298e80265a7e1ab4c936b1c9e2ca87ec1b58d1da0eccefa4a3c176e134bc0603d6e2ec3580f315b703128133ecd39b7740a8343015070637d37f9b3345df12d7cad114de6b76dd182a5dcfec9da01ce2737ff8559bd6b3a7d6da5cd520aa034d4898848c0957ced6a0ea33794436925e7c71665771c1e9310997fc5d4348787cae234442c707775fb64bf78f735e7a0477f82d96372fc0e5d8ce04975924f6d05aee980a8bc383b31f551816d6d5a3790f732656e93299af92cc9f608310030f072ab027548116e4a92c5a88830caec966095742aed0249a40e5dc7f73e5c1b752ac6b8d664b0c03590ef398eb6553af67dcb8f71ce852df0e55ede5e4bdd8da169c70751da50e5a22d52fbcd570e0b22504c6795a0ee211f6d780fbea2635181fb5d8cb71af5ddef8c26a9c2890a4a5c55f6bf322072444a35f09777b2f8912cbe6de0f8cec0bf4a5d12a571778fc591dc7aaca757c37015c20e1558e0ef16cd16a536cbb440bfb81ea63848dc67d74ee0862ba93b292d3839179d676af053886372ead8d0c10ef15313340310c83167c80fc846f9b677a7f4798377132a7443c4b1ebe4531ae61eb0a8f807932b7d88c70b01d088a439f69e2f898b0d3640042c7fe75050a29f8ab021161c65f8c139d5926d3818cd322c7d4421652f45a87d418e13a1cd5b8b4e32a9f633056aac1810de39bb702344ce61525dab67f33966a707be62ff78e9582d1dead72ccf4ea9ad8fe7f546aecb17dbc03d28ec7caec6d989e6122ea06e9ed6ca95aa3d84438de45158348090b59b552324fa99917336465d25e78ccdab5db0e0834f8e120c34aa9ff917df48b7bd6947ce748d86d41ea14cb4e49868b1ee448c2bf6abbdb6a8da3530c7bfb7a955d2feae6ea59d6c45e2bcc4d5fd4c5845180ae0415b3547d60aeeba1fdaa4380647d4ddc33054a9521562b5b0a0498ad8a23e535914e56b6a2f259e5ca53e42b699143a724a885f132e3ee0a7d8a2a2b01585b74d50da415c960b625a3f0584b60e8caa9dab099e1ba00d3b0a36e348a3cb592500c0118b470f6e3b36a27cc6cb52b1efa4e87e0e5151188649790b04ba112d9cbd7ce38e2069d894110a9cd242b7574850fee71d0a64d251febefed08da0a5ef05c350bf633b520c7850193adc126ffbf14a58a3b8875282025a5b8b783841a461e3f65a90a735af632c7050d7a7aa8c252ca2d646fd02254fc0c5f8d12ba4c38394fbdc395d8653ffe4ecb1614c64065f3c738a2fa402c1939f45434218f245bc0333a6a9ed72ac21c659edcdd380a643092ac6344d0d10aa2460f7784f7c81001d3dad8b8eff535fa305acdba969a5f9b9fa46f09c3767b6e99160837ca3e65abb7251b4e0bb13665216209f5c3050063fb9746579b69a3d33e7cd61111434f616af2b239ebbdebd0015196320db080a0f24c1b1e9c21cc4821211c4e8008b977551ee8e6d45e930844e2feb9a1642d6808123a85de80b4c182b61f07d80e7b62c6b251417808686ebcd65ebd3a21d1eaba7b1a5ef0c1a9d53daf9f0d5f051be5c89e23f9e3f876b26498433f52d24345ab21631719412bfc4d398493eecbc2d559a93fb529b7048b32763098bf9da0da28fcadbc58354a4d4f7ef4016397870ce89b686e131f31f73a663dddcd8daa99b1135dbfd9fbf9325cc878e5f3eb3c4cba79dc402a75f79a7ea6084b70dd08a9591427b8f6795203b530db5d36a7aa899dde432717b979757587135c9d060c94ea359494c8872a4f7fdd42f61d424c23e6a1a70836e893c6106f8caf282636d5512d5f0f50a7884d356a9110552bab0e7cbb7f13edddc60909264258bbc80e1fee9a07a53b2f5e505fb62768f7ad777f3dcf29754c8e8f16e406fc27e8f546a3570a021178705497a7daf0acdb5a97192b66b025d6615e99f76ef099dafb07bcef84ca10bf18a0fa80d59e3f861cf42e30fdf87a5fb1615ec753128e3bd2251996f891e0e1938c52de8ad121c6e0b0b162f4912217fc3c0dda41b6049cb4c77d6f27e621b1363d3070cf19cf76d2993da51c417e53ab025ac769bdee58e0937f17132ba0c8ffed736ad53f4e3147caf00614fd1ad4b316d38d27d4b24c828b8461e924c031e2c50e8fc46ac22c9511b9b0a25a3298a2d1c038dabc23b0ad36ccf220ec68afc7f1942c8b15d9a329b049201b8a10901c03ddd3a01bc8942ae717895c9a632c202987c271b41518c6bf58aa7d293f71865608b97cb3348b123b7635307b73284a46d5f1bbd2767da964632c69d109aa98e520a420c2030767e2b0149c2733dd32108c555bd7e9959dc360da380085968e22455a98829b3a42eb08789075358a8e9a204e3555f2b08070e5db6a993a7082ea68114db1a6692b2f07605cf1a8c7302e040e39897427f0045d20ff4163763174278a8fd7d48b5554d444b358933b1fcd19721995d9c868caeddf972db8892d0ac40e42bd3b1c4055a91d378882de3148dc0337dab6cd5e7033ec0015fb322ba34ba400f2b28bdfc44ee77c67b617c8e80fbf50aaee90100b1a23d8e71fb5991b890b499e969521467710c27c1b566804070732b87ed6e72b18a114498551388581b62995a2989699b26087ebdae73406296929655214a710b76583bdd48fd7e70d5b660accaf2140be6d9692037d577e27dc49ac32aaff288b20d258815274bc41d76f0562169e9f69155b003d395c44e937de1208af64753e0e62329aa6663228a3a45dded975a180d78e64663c4a43176630cf05bed1b41a3bd67567c5de3cdaae5e42a4fdb1b6e3c2747d437a8381bd0c62afe053f5fe133f14b557b2e81dfc5d0aafbce68d1104f92e56674d9f227c5b45d5ff6abf57a731e44fb960a18b35b139e87b6e7583316ec6ff0064d81e395e833a3d61d14dc15bf70b197ae1a39e47d5d3892bea389b1a46472fb13416f906f22cf11d9c49c2a9858b678cbe7637df3998b2b3c5b3ff0a55c141e2e818817999c5057aca609ff426807322ed5a125165bda722716444ef0b8dbcdb9b18bf79dc6ee5f2bf9b78a99e7de84986b533a1f38186c16258ea818561f667590583925cd85614c83f5a78109d650f1917096b3d163a634a67c7e1a1301b9d8b4ad5445b815936b94364d459951fbe1a73d7c1db035dd1ae0223234254da1bcc1f680f95c57b60c5bf11638cdeea307101f633d8614981b09b3458ece96b497d1880883768af286e2f753e951c5e5c8e3c1bae1e34c49875f9a44d422c96d237ec4c082b6cb9043510c9e45caf686d315f7b01e4dc8af39a59961f6b9c8aad40465b94f02530b7391369c615c9264c94514a43d55c304453c61c566851a84033fb37ee12fd670c390d395c5c52515381443a45b8fc9c5e6520644bb7825e8808958b29d5c660013c02a0d98bb524724dad4543c7bb9474fe5e780d28f8e22d63ee5a29b8ad6622e768a9d251a0ba56842bb959d7ad8d1eeb94aad44b2f28e4de14adb6820d365e0c05ac61df8be2aec6a0198b56de4d5aa65f1b75fd4e0f99d0e3fb858d9ad8c1f51070890d601060f973a04558d8a55391dde3237c021849420e764fc44a85208c3c3e1d9fe360d420492cf8331baa589a65fb97cdc8e657fb055582e09d4b79f8f5061517a521937a2a8f720a557b9dde0cf2650205a76b693104efab544f9867bc18b36616fd6afb20b869986cbcd2a32eb4ba0e30d4e94d683cebaa80d1440e25f23b1fa51eb9c946c54fcbf4ecf0ab9533c544339f27d13e3a0751c91eab087b09083e546794679d8a1a1557178983bb1dfb7e2d08428d4c4555b325f13a78b205f930f52ac25474defe830ffbcba7a2eda6f037b4234103a875e1b804b31e23750191a3ace7c1617197c9b6d9d88f3decc9d1fbee35542388061aacbddea228a731c1ae00fc7775756f519b87652c0710dda46aa8d63292b5151a6d9de9b1501e3b7b96cc58cf874651cc1023e9b97c23130ec51c3131be14213d2c759fc715a27b281ebbfde9ed0bbdac19a10f02e3ed5ce52938a1abdb2de12668a1fac534230751450ef5a3f195849002d14307d0e326477bf8248c09a0679e97e6bf2ca86d8ed24f64d03ad9051e3d21f22e9850ae10721d7b0434477dbb8a6ed63631492bb03c0904ddfba80aa8d5c75f638e40491445e66a8eaacf504edf47b58de15d2c62456878d10b63fb8f3fa390377e67b7c94d12e48b6fcb0be9c24826e8ab10532d39bee9b4c008089987de481a165fa8df9894d828fd633e5b5389f793fdb4b08723dee5c3405abf878753c51feaa4f5550e1e0e2542d4cfafa4b159db6053347343fa57f031f4fd19e5129e18ca1246485a4c0007cc8cb1d5f0825115707b364823d7e54610e25e1eff07769e002d8d4e3eedb34ab497bd3e4e4c7d4894570805e75fb98aaed00873526b2c33af88e0d5fa39aa26bf63cb597774fa0ff46389afd9c49c8b4bc111cd0bfefce791d94325e255f31e456685acc051649e35e1116409163bfff7bb084a2b5ab835af12bf6a8f6e3735261e3aefe8c4146e0f65fffe050393e58ea30f157ae9bc973d2631934a409144862b587c547fa73fe2c9d15b2b902b532db7335f3e56a00cdaad3b39f7190fa6d21bdd05a64f49786c238554ca51038bd67cb2653384e9eead82cc43846ec66b65bc78f72350f2528c03cbbd45ed11438134342cf384168cb28fe9cd1b9407062f526b87910677a3fb63306210f378db1f07b879915f072526b6930022305bdbdf6b011b18ad8d510c1424efde2a6b5f9b23acfec05960366dc164fea1b9bdf8abcaedac46a4eea146878d2a2a90769336f6046a8a2c0add69fabcc22658d8b73c6055631f72c9b8f8ce0aad9aa714c89757df70e984030e3e60d9bda3c4f14c1c84f8072272ef94f8b085bd2293edc69e4d9b649a15e3b4156424db19cab9dfc8532f94feadeadbd466da62ee003e7bff9095204baba5ca6430357f8ad08cdb06c268d8c29467b13eef5d2506d231faec44651cfbb728420e54d7bf431a8fad1920e4cee9f9631fe7c441b5a605c8f42f0af8f7686d06502c25220d9f58854f070de20b9a5318ed0bdeb6950afa67325bb7a1c9d103e966d1adb0709fd18d929b622cc948ead87764b3bd705b27fb0f5bff3acaaf642f541f0f7ff20f86c925bdf2c2fa1a3450d0dd4ae1bdba17966e3f3b581a9e1ba19f490ab88669670ec4a62466c01da37b90367a33c56e7fdbeba8dff5a1de0ceb55b11b5dec8af711dc28bf71c40ba9a4659fde3ef4ce376e0c89de783e31a5807f280e29f5728b2f87dc5b9ecce3e54e1c4d6c533df220b6e1e15904b8cdca5b486be2bea2162c261974612aa46ea0716350d18f5371bdd243a76d0e95b50dbe89561c8f8f3eb5f4bd8098c2cfb65c731c0cc86698243b0c178b09c6bcb6b51ab14283ad6990050db1a001d668c01a8d58a2116b34c682c658d1102b1a638d06ac51fbaae6eb26534d151d5d785cc9cc022561400423a2d108a54ea6ec2d339ddcf818d39e05f8336f99df6becd8091c88e6469c451ab044832897e24ce298491c318143103da7714d364d498b356695064492ce26f27d127554cb6a5db8aed06dde44b0f2d4d4318c4122b49bda2beadd59b306c6ae0765cb9df0122b23320a702efac3f744c0c980ff2579aa01fd9e5ad5a6832d4f741227e12f4a6a55ff55c48688f036765e220b87ac5fe0577085598bc5cfb77acf000c2c3a5167993d69d3062d503351f647cf3a2a8a054b8722ea77edc94851d7038af9b34cd2cb292831a1a3acc5afb5e94b73579f74b88ec2b1d8a22dd0e09b69daae4866328965fcd72a648c5201acf074be7410e171d3a969e0cc29718e6e6d8df5c979476d92392cfb0ccd1cc4805f3a52911514cf383981134671928436d4cd2f7070d156462e5dddd3e78b9717cb05ccc384eaccae69686537936c9147d711626c689dc8050f3f867b72972c9dad5d604ce09047681303fd4e57c13c3405a060fe597666300f41b770413fb391b6043a8580703b8645d1d02fb0d55821ca5146b7033032af6ea1a466efe2f292befd89359e13745add7c792c1f3b7a5bd1a8ca9d8241b0b849758166c6fbedbc58b2c4aec2ebe2acb47cab9c0540b901fea0020ceb187f4b1ee447df61ac63177d1a96ee37bb517e63f24872f6fdec23f8377e536f461f9b52e11f1af1d62b621bfd4e86ee1fdd7072138c2f4b928e49222df43b6a3f7065282273c1d55b5ee6de5f01f95af8a28f7d210b19add5392027d01b1075485f371b4bb805a76b5fd1ddbd134cae39187672774ed68c2beb7f2e1b5f732551c08d04956511413725df4757724b020fcba0f2647f57f249c75d588e058187fd94464a92993c61b8c96e4c311ad81d10cd2c4ab0da61d79f0a868795753dece6f3613b4d2136b1dca53be25720c254fceb490b752bed883414faa54d548a1e3e0c57728aea848e6d2cbcf4eecdc2ae671bcc8ce1b858ee9455f55165bac1b4a616de5ddf676322c42ed8e932802fffc0653506efb3af60d759e476c1a0232a1afbdef419f03ba2cd39a0dd9adb78817e21e38bcc43117e40d7000861ae6c8ecd30392c7ea0015f1010ed5ffdb536db62c67ef352752360ffdf17b27025cbc020376a3020a21cf7e59b87110f86c49b7746d06e1a6038141419ce1d8343a3cb421bf1a480331880a86fee033f59a45671f93bde41949321208ce96d77f43f8d7ae55a5917d0ddd3d359f43c447a99d79d73deabb5cf472411b73b630befed6fde033ba77b7a97ddb74ce47255c8a5f9dbb84b6cdb1178eba6e6035300288e3bf8ee4885362bdde656bb0fe0f195c17fa3f28bbe011ca5d4b4d593cdc85d0701ea251bf7d78bba5572a9216c5b8eaecaf11cce1f444ff121674a3d5bd4aeba9e19275f514279fb79bde5210b71e218e10c0bd40fca6229c31ef1bb0ab62314c3bdc196351e8435b66ea35790338e9e6a7792787f633cbc7b2a718b223630d91d6ad858f182a484035d8245b789a60c69c923561792f4331ee6fef78430e78e45a53f0ebf1360a3d68f6d0ae0a9d1dd3ba19df0f1b40406c7cb44dc27d2385a69e38afe7809b9da9042de0e56c4ad0f51ef896be7ce25793075692696fb00a3451e06035cf21c8e1af07f76d7072620e73bfd6510c34c0908b5b147476ae7873744290b86781b2672475e90006ddff74eba420cd701ed78fbc939df0b318b2675728de6af5a8839c30e3d25882e6531f228e43cfe2df8aaaa242213ebf224da6560ef43c8e81bf0943395641fea419f405601667069eaeaf594904db1f8aad934274ba91e3b51513d3e1d572496d05aadab3850683fc7aa40188b498e0b918938b4b3725abc10fe49ef2fb93676455b64f094aad0e2df282b73cfd4241252a5a2cbc286ffb163250cec8fd1b3f35001d760ca8b3705b1ed03393acd6769d3bb2ee80462c7c9ba1b53d929e2a07c261a5460eb5fb914a77c1022f0968c8487f2c632073254ee52665e6aed4455af3c3b855a5586859616e211aefd77acc45e1382f4d622166b7171f0238d3953851164a633d5ad6b66cd3bee1d2677046d99147afb23cbdd7032368ce43f5d96ef6c8c438074cca0b9b3bada5ffd79b8ea00ad8e7ba98ca4e64743c8cf459a7e16f324dfc491c32a8e14eaabdf35bdf8fee2ce625ce9a6a595b4a78cfb666d5e6ca09748d33163cf952a7da4d27af63186532fc2b0cafe41813035404e9a57495ed5d4b45eafa056c18e67ed0a389a282cae583ca36f616e9a84ed5ae5e213a16b07c36b6391c2f2c269ac7c6c2754a8284999492f056327592795202d2735483bceeef953ffcba1f0428ef3d3408fc3760f27ddeb053bc26e3109e29a0dfca1b67e2f32ba1b74c2683ff9ae697ab6e0e2c24417ffb2883c1192cc250b8c332aba04ed1af09c6d34f554b40b57fa201fa53c9c84cdf3218dfb44a455d321bdc4ea18284f227defdc9cc1f5ca010b20f23dacf24e1557141532c62468e94e1187fbda944bce6452e6c6fb883c39db0ea1e8c71db30f90e6b43e12223fb698627c5f46edde673895434f4d084f755b3e4e54c080d654554a57d3718c25696fcdac0c63c1089b10a8b26113acd31f86129f7656563f36168d8d7e6cd816c7a555c6662d0d2d8b57b54a04a8dcb7ac8eaa2f5d11571177e081256a30810b76aa81fb2c809bc370400cc11d1fe69cd1d144fc120648870712691a2e3506ec900ca1cf23ae75ccd5502e443510fb5b82fedc8b15014e769484d91da9995ad5b2650514ac9f09d2afd6d81770203b92e99654c83010821536cc582584436e41b640426c580438915dce8720b8306135ed9a95392457e2dab0e1cf407f880529666122e0a4e6e8be68beb5e9da34c5d8220ad4e61790e020564b2e2f190c6dd0251337e609f9fad17c4b88a0efdae5cbbcc8ea4c70cf1bae3f20784bb310c119d045fdb20510889048ceb2636a22af0df34665b29635f1553792024008b393b5fddc375743a38b49ea65a623d82610dc3f058d0b9d901981bd31a7502a13e5a7833f6ef4387cd4df7b7a62896e6b9d9f014a25fb41e79448974a6840ed006be2c4614555c38325ba22dfa626e60d46d564294f4464cee164ab7e9b419cdcb18ebd0a490106545f2905de19ecd7772968aa80e5d8ad2c748e0d1bb43f18a2e33faf5734c187432ffa11dfe2d00e06ef8e9b0cbf72743349161f184a2bf0744bde5d19c80944d08d8e962580fa3b0a518393d2d3ab4366a29085060a5181b0c362fb189fd8c78703ca77ab5254d143d38dcfbb8b0ad6c2636384d398754cd2aff4b24ee4194d7961b8c31980be3e5579a51b0d1ca184fd50223906d5181f5c117806582c30046efe2fa4b7eab07b47b84974defb1fcfba1600ead5d8aa88008eacf5639851a4ee34d73149bce2380e58fa9bdb35ed7833a99818c7034b9e7ed30b49f87cd0fc062e842cb4c38a80a0607c50138d2354a2d35841e908f38ce5a6a0180c21034079a0f905dc0459b41bff084c73309cce8f334b29b50af5e9c7a2861854274b4a8ea7eab4e48978aa8e463d2ac15f3dd5cc2359f3d8b881f754e4b0e56b86054a5f853920c5bb17ba08d85c0b18a0d798bacd1a6973464a645a910378d570a0675868bb9e73ea5e64bf7f8f438626a769b80a549abfbb4152a51f45c4e0f97c052665767bb94cad19856352ab3ebe6634ae96874e0f59f27cc256c91e7637aece4b94f1751006dcb017d10f555884bf189eb587e541f58a726b7c91561428cc630655ff7be7f814c12cfe5c1c5a99c5f495b855cdafb18df2c7b9cb9878fa560e1b226d41cc30d3f8222952b21af6ab8ca6ef2ba0542be064f0884409cce6f274852e1a979286bb97e036e97b240b62cb0ff7c545f5bf0098f1677aaf6d7a2f532458c5e3fe16a67cefc2b08f3d440bbd699a8785b5f849820672ebab6efbe92aeb5f2321f2aacfee87850ba8c7e17cbccc242facb2a89123efee57b8ebd12c9c4d25681e09770e057d04638d7fffa5f812eaeb27d8af1f10895c51d8801b350b8485c887c86751917133a2710a84053a32d07410d6d3b3cd8c88013ae84058907e72737e12400c57020dde778f0c381c5d947a8e92eeae4ac75e751f93964e2e108d9a61dfd6dc52c1a959818280bf82bb027e9893fdbb5209fdc3173f06f3a20558af597305660dcb8563c778b53a58508b90ab0e16d4f6a0bb3de85ca603ecf284713118416a18532b8499f857a0450cc37289294f9508666e1f38e9c43300eb84f8b245323b9a1068cfc4c55232fa9b74144983057e65c4cf71d18560880a6265c29eccb54fe6387a45ad49f60c266498212c0d16e841cf63e0a55d15d7c988b4f49d4a0c0e5625e30021213c97eca4e4f2e4c36f962370dbbc1d692849fb302cf8a95bc33047dc86006956777b4783629afc55b7e01cca869e0f4fb2e2b601700e747e832b213bed30c14e64041ddad9c282da3fd4a6e314f784e7dc39c3e752d8fb15eeb3fca42a2cd09459b47ee2a181025481f68b4364e278920aa32a2c5cabab8d5f260ee3fc8d997e5daf9f722d68fbe7c8d153f2fb41e1ae2e13a2ff51f7b9ba83271ef4b446390e60d14164fe1c68194606c3f1a7fdd4a45561216acb210f2bd6ae4aab6490fd83dd16dbba6fd349074f2d03da8c24fec3dc5eda776d01886636a629f6a5c51bd4fb876ad69bc04a524658885c587ff1ec33f188b0b0a4c479afff4e5d6c50c1c49169206a4c30ee73783a61e94c964487b7286e05b9aee6f35cb73ec68e00d8c805df4c9f4c25ba9e9b38ba5bd2bdaeaba9febe666c8f768263c8248e35b02c5375b1c632e35cc52d6ed2fa0ff0031c902eba11f5687a918f7aa1f5eae62a110bebb46081e7253dcc55b4b790349ee66df2575a6990841fb039274905203a9d8ff3c91a018040811fa67a4fa902e2fb6e076c2451f672951573307fb4fd538cc5f8a0bbd62fbdc87404a779c57f84f86f06f4d111c4fd3326f6512616003881c076057754d720acfb2f8bf4974dbe1a01b6c39b2caf773a03fac726c396d9e4129fc729c0e0d8693ddb69e75bb9213a48afd1718f56a10deb933508fb7059ca39cd40801f3124aca93bcbfc2390d9e5e857e502b602d3b911f764783c6f7c77b74a945ca1b08043d47a3a49dad7912fede9a598dd7fa5e061759bd52641308e706e3cc18b1c61e82e50c88cdc23ec271e8aec3d8443a5af0f99d3f15a631d0dbebb78756600606a5a8ef000bed8fea0447f73d320ffdfc4e69abc987e653ed962c0b8a6dd5263c6abc3ac80c3309259cb0d87ef67f12db3e0a4582260e0f80aec25a639d5a079af0e7504695bb6c45bc5792b287ba81839c0d15f87cd9dc537d22a96dc7067603c8b56b453ef65f66328adca9d83dfbf5ff2b23bfbd24d0ecc8030b58bed59ed36880393b7e6b820e1993d17d7dc2f53ba5914c3cfeaf51d94744003d98ab1f5d315fb4abbcb41cc46c640a9135e69da0f3cfd8970874a0bd61368a5ee157b731f64e53fe3e65c96b2f1b218d83f8772e60417e7a3ac975045a69bf31e13d3b2b35db7a219b84641d8bb8aa75da318fa0a768d4555d343f06ce0b3d09f9b3bda35d077886140c5a231981e712d4c95624c26a003eeffc710cce8dbc9d8c54f19d5c9a0a61994df49087df825622f82b3f8eeab4a1c7ca6b4a7f2ee991dd601c2483bae92ffb3c96388b3dfd75d8dd2e9d2dcb2fc9b8e863c0e620ac1f583daa995eefcf862f3f7854d37e15955f53705623cd124fabaf1835cdecf772fe580ee7449ee8d39cfa05342a9b4526dd63af5bf5bb5460b576d41bdacdd261968fee3329df0ed07848aceaa7a8ec21b7bba05c33d780d867d2d17ead491ccb93a81799c83e986bf1a4461b7ad055d324dc0eb5eb7d920350c21e82a8702cf9f53c8da690ebac660fd410dd06e679438e3f8feb90c323c9524c0eaba695f08dfcf0d844f3c7f3a6f19abd665d7100a0540764b4030b68af20c763f7d05a466be4787c19a080834739f1bb279e6b24c82448b0cc8e613b579c9b702e26c6417e56cbf003e8055ae127c1ada984c433a4d43675b7223f729b809cf451a5a75c06fb71a633ede657c976987901ec81effdae85bbe1dba43f81571a721de925ff0473713160038777ee9d77dd6c52695c68d27518c3b4ae855ccd67c00371d86f32c1869dd99c7788880bb4dbb59071d15476d06cea9f2fdd530c22a1c6f44f9b3f7c7e080be15a235b632e5efbc3330c4dd0d7c332a2444d663762b802eff8e3238cbd7b67189ed406b1ee65ec41358a2a193086860f22c421cdc9cdb979947e06e3e1ab7fedbede4514597ae09e455c0753cb73b9a5080c2a9d5e743819f51dc9ce83d93b32927140f6f12c47e4b442f86384fc45cc3d595ef093c4e0de93cf20ea888d9ffe643e973d79177450d3423a19ae6d4aa55225d06b9d1f6aaa3397074f93592132f1921399afc498af9f66ec599a9c4e531ef56190bcc53ec53406315ea16485c94a96a46d482db4d218b1e8463cf51ca46718df7920fd973d08c683a354066e8f0412b43b9befd6251386517755e4f8c718753f4d4d2e20e74c54eb61e74fbd8a38fe654f78fda17db737b5ab94afa8f3b633b2481b176cea914d07c1d9eeea375ee88df17c9832aaf37785fad75c536b5a186affcba77265ce32762f4211449a42147f7bc476e1d8bec4e3321a7f863fa1839f42e0651d50dc124cebcb89a5ce57164c36507db82317876e1648f9c79a14840192f55fc58ba27ccf0cc769597df617f4a39c6039170328cb10cf1f24b95c58fe4fe45579a0ca00dd080cee03b21f17d9f444fff33ca9eca0a7762ece509047b3cf3035fc34142cf509a57d16f86a72ed97662f50dcd296fb44163e90bb00eef9518aae2ee6e3f0e27c79dd414619bc3d5e0cfa786ddc34deef518113e7502cc2052162e31bb8ca1af942e487f1fd0b93bb531caffb0ce30ef8c41d3ad419fdfbd08a880f4b489eeb8ab34b3ca6c10e1e89e8a32e74bbcce952c14b72a8286b3e68f01f6313721c105b50ef8451c0819e2823f8b897584ce8840d7cb49fc36b19305d10121b89e15b99e6436481034f0a6c13c49f5e335d2127c2b4a8c032c77e9d746743f049c8b549c241a257de4875e8cbc073c8b5d4f94caad9646a42c20e74fe57b3747c2f90c5b31d09726f69556ad8df8dde3d8dea4bb98dcd754da1eade898f76622e9395851b42c5f90a759443280f345e78d618f033833306ad87d11675c7379d78e78534fe0f253efee38020aef60d929a6421ec86b0cba08fdfb829ce62aa2c6de8b811193573b8555e28c99ac2b56df4831f3a14b39b9c1eab7fc6e854d2f8529157cc8dfa2cdc75dcef8618aaf5d45d67d9f008563af14ed70a828dc5bff3225d8c58aa85acb0e9d6ea6ca8d827953db7ca5115452468eb9c7bdd1db741b8e2a49b9e574f3a5955fef642528c943b4637cafb0df2b4eee09430e06c605d7c80eacaaf14171a43267ddfe294731d93d8e9d92f9170f7299626520b097e501791e3640058b99f68e1c2f1a42917b0c90039da8c2d7af14e098c69e98eb1342d191641e4b6a8c5f6748f566b14439185b6b2573d2eba3b53432004265284296b5cdd69dd5497672d2d55e2de6bf08c5b8b63478600d6300fc7a25ebe204babd62c29a070459383b58c15a7c79581552789ccf482aa2acbaf5d0ab3689b21685326ec86882c8db5a45b53d9715fd27a6a85faf24cc52c02a7b65d628096f3aecd24210eeb12559b084d150b4a2ba5d76f9dd7cd81148468be10c125c7822c62fba9a16e2b76c221a9580e307d8929fbcc85efcf5199ff8e297495f2cde83950df4877c4c92fed8b2548ef6c0fc7852f754f7e8c396a426ee585a018d54db4b1fe5a81fbceefa73271b65cc492980f779dc927d47ea101e6a440ab23a0f5d8d5f75f0840025e7bc6f2dc65309cec0da706401891adaa4550d696bb92eff6c5533fff7fafed4107eb3e3825cc0e7d59fcc40c58eda6454250eafb797f624ab0d2261277a9af32e3bdda85a180372b749f45fde4cecad27733cd3d85ec49233a9314309f3716d8936c0b16601c5e146138c536927692b50e71909449d50f6a078dc85b0141ee8e29f6123c2d8666ce419c1a286387ded9f96af96a6c9a9c387b7ddcefc901226471b68eb631699281000c6367d42a392ee01916509d566390cd8fe6402a4085fc132a3a0c21ce39a183322315cb2e6417f040c25141eda855edc419f2c20919f4665843309003e4ad47d9a43f2ce219f509fcc92ad5b2002c40abbe5d32dbe3153f05ec32793f12c66563241d23f40959ef545b1c9f66ffe7dd11574a9f408538ed6a17fb9763b87e4b6525b5768335b85ef03fffe3d3008a902e284163adb0573c6b1cef999651c33779754aaa222f6ab563431a816c7a9a90938820174338c91ec486de804f78ed4a009eb9f26d32c87dd28af90cb16c3618d8378b616ceac1e77089f95c1ba6daec546f0da0b3465a4716f6855801ec905af3fb74aaad4f48c24a2b88151803e3186b1f386ff166736be92f4655c2978cea6168fd28baaf80d74203b602e0b7a82b3dac51f60c3c0ab8e6053890bbf723fbdfbeb2fa0e3909b6a2e029e4ba85524307eda8e1631b011a4e0a8baeff8a1e057843a86c088c53edac3c5695c147991735135258e888cec7855600b56a97d07170cea4458e231ca5def802875500cfea958ab7a21ddeb8520294defa87d841cebd6692489f867818013d7768828adab58abd4e8e91ac3940158c24328666d13e08622e1bbf8cd40c5315a840b08167da5ac7c32f66bfd0c54777a7e85bc11d557195e08129f329b179eada1f07b7901f34e8adbffd54e60c04628a19431ff1e185d4f9bd1a29d3ae02326b79c0043e48d436d2ddc09b7aaaf4cd494e4dce12b6439b94def3141531faf4026280c820b8875b4331e2c2922822a4cb808eaf70b677bc1351c8c939fcff2af5bbaa09ec4cfcd5c3283027fe5fe60cb3ef7a36b6b10bbd031de8665461f941a2630f7123af76280620080133907590e1df3fdc977d93721bb2d884027e7b105981b958b91bfafe229eec5ae8afb3e1d308b25d4b1118ad66b73a03db6574f1f58d969f37206d7eb7270ed300918fb4dad2524a8228ab25995c90483600eec37e7652862a320ab9a8b3d84f15567af80dfec9c4ba10fba5134651f3e26b30d29105fc6e8658c3e24ca09cd9b6b0bbd5aa26fdc2cb04bbd499e0077852d454876da5c9696cfd459537b51358249a5d7c57cfdb5de7d4622b30106ceb6a8faa7c40ae25341c2a6a520d936f94f5e7f5c1cf039465dda6b128fbc441b5ed0426cd8db68c7ab92439756ca7dd4e81e2d9f2e3e5514bcdc1569a4c69078d6dcc57eb33efcc23f5e00d14fe785ba7682ea37e59c3ccb7f984a1d06705b39e8f60964b6a49454237fd0b31ccafb04b1b4b70177a02f979568a7b3f8c110d43c5eab78a10315ff89dbf99e42a0abe516da8ff65acb58ba5933b5af21743724523a6e32101cedbcdb71dba24ae1573431ba4a71d49dcfa72ec27bc77aa95b16a41e01265fe44089c5afa983f92237fccb279b4102712ce1dd36de2a0f7323fd65a7055b2d691eef7d3f1355301fa33632a08f2cf5523925f2e3ab18fae5fb9930c3cc426b8f7ad4f2ca98acbadb58d0cbeb2e193baa1618ec78e0e7b864bf514d65811f03666fa60ce9585490dcc300c643fe8a62b8dc8e92720ea70c673e7a8d19adfd5f5a5f5473a9aaea851c421d2d7992e0670e4c05a9c1bb2064109f30486600e51ad476137cf659cb3c46e622ec88797c6af0e2c30e14b3c46cc24a6d04724122b53860a245e34acd38183917d7f22ab0ec5dfe282af2aaf2753178b7d308070dccc9ae0a331b36a8951d6d8f840cb6e85366d60988e8b33cfd89400eec9fa29f610b25072be388732c7d3fc6828e6332182a7880e093f834881b08990061f475db5afd9b587e3c74b73f4f86b0317d67d50a0147e02ee4f7b12aa030b2de2496e01da1f0d623acef6e9f447f751fa58df02acf4ee35681008513e1b9628f8890b26173cbf0e611a18762489f34678045bdb51ca8ce8bf90ec1366a6e0d754b2e34790b4490eff3968c138119d139d9859c30bfd4bdfcf7a266406f484d752b9c66c981c5d591d8c919495fc65886077e147fd15a0839158a0ea66d3b4fdf74c2d80af8c3e63289025acec0712e63da8ba73438068ee709ef562a03756c1d16310d149fc44c20858ebf59db8af7d1ffd99ad50faadd37535c5b368e292b5d6d654c858e00a14840b56b232b7262247d99aeccfd529e9e182811bbce683386bdaf51c3e0605e4417b2023465903d15e61522d34ed14e38c2e81ab7cfea9c484adf682e07fc6400716f3f3faa462beb5ac19b707aeb432b5856270ebeecc3f86f5682f1bf1e4abf755a244e49652461bc94ccd0dacd0805ddbaddf5061ae30152668b37119b5ff5988a98ea4c032294946e3a23a6538025f3bef5cffff51f980765e0763e1dde6c78b23f96d45777869d0280ee45fd733c926782ab06408ac28697599c7da1cc9e2e23f106c57201873aa30501cbccbfb6e81a302309eb204da90c91434e3f31b59b7b3d58ef7ea658cc92e49a280a52a4c0c7dd8c362452bed15307798fb33a5558c335f8b3c28c22915c5c473e84bdb95b53f190d684649c0dc79327a8978a3c1f966f2816cda08a3228fb46eee4da81462b44ba26255f8c7018880a7c14b0243ddc4ba4b0b0f99c72134b6fe8d164c385c07938f942f9b0acd8552b218b5b377c4929bf4211df4c710644c4194487a18ef4347e5129de9c12e99e17c918ef70d0306adc84c020f6402353624f7792ce8239cc482208f8377212bcfb0cae7d7760f5e60d29310070439a2c736e9a662c1d54ea935f38446403aecca9a2cdb34a444e8bd424f17bf032a0fb4faa81e8df297de5fb5d552e3c8b40c5558ab6732834d83e1a311b9840b4b6a5331764e0a1a673498190a330afea100f5902d440d46aca61a0a396123a86806d10432385d863c9a75a4b1f9a50d2d271c1148a3144017ebf1d2ffb4b7fc258aa18e6aad872b9023d37052bc6905997722bc6fac27418c5b3b529d243210aafc16960fd7b941321c9f361e9097920d35293cb0d0887e461f2662719f460d2ff18b00847905a07e1f6f3c442379f513249c8388c88571552b26bbee256fd8986dd2c122ce9c08872d14f1b34f403f6737c17ec34ec99be0174f10a9de4455e91f8cae4356680e74c065671806a9b9d44bbd0050dd4016ce3c7dbc1d3857ca35cdf70e6a6dd8ee974e11dc869d2baf82dea31e092df130f3f88ce30cfa9378b4f14d04dfb7bb3aec83c68c862f16be54cedd89c56f401588081d3639d3aa7629419794aa4f0f1ba337ca95456bffe08c6bd68c7c7b3c7fac830551d041e585efba1e87197021bc36d1db8d48cb497e4a296e829b376eb8376c1a77b54e4ad4ff43d96b663e9e3d55bc45eb9055d4175146156c0da117b76b586fde64d476643dd871d8dbb5018532108f5e570eb9a566b7bb773e222a0e43de5b9ec4e4b8a5ddca300352eda71c7e11f9fe3a8f2d1e3fa66fb746930e81c6ce5bebe8b39d7126a744981bb6787ebb5cb266a5ee1258b6e0a7104c7a1ae0dc8eb53f912243f90aa33f06e630c7aadc9d0f7238808cff357d924d25d7bf36e80cecc1637ae9e5d80e79acc30a786dd45c7e1460929606e928f3a897559b6609a6e2235cd2947e0c58de9eb849cc17eb4de5bfae428b668c60181c3f2840bc24cba6651f6f1444230e93ace889a9e19aac2ea321f7029719a0da641b66f68f83f70280e21a2ee7a9b330141aea342bb105a6e91a459e62170de78afd139d78747999801ddd90fe1293bc8a250b75332484f3f9550588362aa21afb242f98532385b27b3ab41fc54aee30e35bb9e9a7c58ec3196cb47eb958a18e8105a23c3c56e1c310a8bcd76d0023f2986c01f26b7a5d2c6f9b025aebef5da69c289750bd19940f34cf6bb1066e409ea0d1aa0a28c0befd11698689bd48666a5994ac765989e6e6bd723667f85ad8c43328bdee488242e5d78082f76de1ab9c043932587deafd9635b0ebdc273d37411a48542c8d4dc6675314d73592f99e8550045a088ef5374f4803e823c2b7e8fc1d5193b50718d475ec85c02538e3007f553b88df7f5c5a273f30847384fcd965ec18fcc0cf88118b61cbd3322f565a64e0d9243799c1b22dff5f794ecf27df0b698a4db0ee2dde841be432a23825a0990ccbb280c785e0cf128207c03a838f7597d563f1c9337c9726273affdcbfe620125d0f4aa1688296c07b444d06fad1e4f0b97fef5a94064aee870fd0f1b43ed8790bad1e3c36fcba07b1f924deae0288113572abe2039c9cd6ee592b7f47f545609bf0ff573c9dccceec93d1bbbfdf99b96d87e8a668ef5e64d422fdcd3b75f945e2a1dce0884d57dd89958edbeaf82b3c4770631f2149c7f191267f91160743d7d8b166274168030c0741f304d38f02f698ef4c3f9d58ceb4c1f975895a88310c4730f9026aa833dd1cd0f5d9fd1233b3d5477fc7a8d6ec128ae6e8922d441c0c9541a5075a2bb25f20a43e1ceb3f58338ab2ad6e5aaf523beabc4bc33c770dc8eed86e3e26ce3737f067846a0adb571203e8609c76259e4bbc4aafa23d807d493eab1fce07906d31464d5f0df4756cea279d710d135e611379e7c8b2c5b0a5a3a38409e21af90797e5a44eb9a571fa4482d828ade47309dfe6da1b66611ac4f2e28f861f39187662c2f6e033d170e91519425fbd1a554ff2ab36e09339ba565587dfe9d46cef37516c9ac41dc54dec9457c6f4520534bb124a9ab99603e046fdf1974964b38668d0156dd639d4f40f7d686818385171241a5d76f01299409a5d518d8c24bb7d474552371a3f18d08d90dbe9f1adfbe5e561966c069c069eee5f7c5b488d238826f79b4fe564a107c8ba86d0108b592e21cc65f0198dbede778917264ae769800e54dfbf2ff5dcc110e92c809c802c739b946830f54249008353b817e24c840755cf9acdb26229c1b6b81cc8d3a11279b038f7036133012778cc575fe79d35672d3de1276a57ffd7bcdcd1122463e1d3d082c5f16f08be0411ba67d25f7f8ad4f5f80269275880420e67dfba4052e79e2324bb172e3cd3c857bcbb793d5e09c70a91e2b50b793be0e10c53857693ae679f62af68b734e4a41c6f7c5374c27f17d7928a29c05a0cf8cbd74bcf760eec0a6109b9bacddc2372666e4e7ea98a2c0df52e165b40332a62ac74b8d4077e3238ed2698a07bea1f238f54c235f3296096640cf0e25f5f4c108c4282284dbbb90d636188d7740488451f5368ae6da7b20200dda6061d85c81b1502b69db8b740fa840968a5af10202352e0ab764ad0dc3c568b01e1509e2b6d859b1e960e3a0b0d3f700582a303c42638d6a346e7825b3e8f24c81fb345bccbaa86069ad4b09f624d6210e68d7805695b415d56140a797145d0efd9cd06d108efd370e5c0edaee5120f9168ae21ee7c64fb29660817c7f8c73cab385fc67fa9000d2ac5e36382bbd6af34323daa37e13d2725d395193f0e6d1cd08d700c345aceb3c915fdf739fc31ee0ecd9ce23228f06f80b2d2b3a537982955c21213db114c6bb4e31df23503c46fb5dd7546e5b2694d0b325c92c2189dc8cf6fa862d6a4a9bad406c645208a3c35932c2f1bc4e408d0072b1856193486f2a97bcbe9ce82e01793fa44aa8af91cbdc03f09379a0fbe4ea0f3f758fc55caeef8867ce236ea86bb87660d3065f50203ed952fd8655e364b680537e8ef54c60153bf964f87ab983c3f605b640f2d848437b8b6623b300dbe318040f458891d99d3d28bf9819f248656117c8879365a4fdf80c5fe06fdbc06fa7e11b84e6648b46ac6274a4af548894606571811c1aa389198120f94619989bbf681cf677503d08db59e7b55235c86f2c48a4ef3a744f3439caecb8cb1168045cd602265b07c7c26a9f432cc3e6266a22b269053dfce48528a3a270438a526ec8464f37048b60bd7d454fc3dcd5b1bf9bea590d9f89b4814440daff9d8513095e215799a645042e520ff0d8b02352491c03193bce8cfc08cd47a994c5fffda39bc728153b20e804c8b389f6ec646d768828136ba0f232290f59c35c0e34d724f6431cb5f7dabc48d24a4af5610353c47cba81e3b0763df6025ace5a0e367ef6ff5460c728b90e89c61ae88aee98966f94446b6bea22122bf166ca8c44e672a3d295a82a1b40914b621c5a4a311782a01426bc1ef04632f194807bdf3b083054f12060b44fb53f9d1e291657da9cc19836b32ffd549847c216370781bb935ba0734874cf7c3f06744f38dd9a5c763577e263d0674dafd9bb19df2831b0ed9f788c39708878146f74d991115898f6a3717577ed129cd637e76527ccf77be04d2b3af524fa30bd8dd2c5be363582e1a4267cc9ab468b56efefe6a325bc30410060ae0a7401fff234ece7e27cda99d3c6183e487bc921ccf08f01f6271b134655272002c0819683d0f4df4d829652c44748ecfbdde8ae49fa47c01780fec7c8f9622f15b244ec0224007b25f9aeb0fbc4fc831c62cc93046dcc5bd8ee2b9254aa36505d0dd6422052afc8c0221fa9d6467447bd187ce64bacff3d3a6872de232babe316cc17254085f31ff8057792b08f0d16f42ad2c409fe932b4d116ace526b9d041b5aec969607b2efe35ceaefdd69692e3ff3e7721b584a16f1e28a37823a8dcb5b0a23f17f6545d9fa6eeeb86885b685aa4c263f81e4596d9e17ddf4bc9ba1350476eab20d40bc729fd4277630b1359117e3116c8a146c694e14b1a56ced0cc54924f8271e94eac3ce17d0dcf6ae51b807a8243838105cc763c3cec5b4669bbfd501d24f648cc2b2f6050dacf0af6f1be45b602525c8ce5c34200889b338cf301b6e19148d5d456eb99f0d101c695cfb0218fc2a0140cd42983af9badd6ec1deb3854f2e06079d525d5c371f2144e0d6ef98b2ce1b3e233ed48474533881831694e9bb176b4e949546bd09146ebcb046c82dd7b1ae74a6a01ba850ef9ed877418c36f47a5490f2237d7bfe3dbf6fde7fa2aaf282475eaa0eba538b8b74edcec806be5da3f8f22ce05744c3d6112929157d359f451caec048b64d704a59367362bd178313855447303467babe705177c1e7a0c5c2702beb6f54643f43b5eee0c0d6c438c9fb209aebb49930b9a4d85a4f3a248f8731d608a1d7444e6ec99ce3a68c091b5891b16d7027d48a76891d5dd675c7e7c94e7b8de00ab2832da0ce8d1d42f1894666bbbe51e538389de17e290a1dca5943627dec2be82f510dbc70f9ffb31046ec334327411ba7e5386284759271dd44d0901248bd400e76c17caa9d1ec4959de1830da9f469314fe2891ec9defb8a7a1cdb7fbb070b2d82c83c39bb1b659030802b5394e464ea6910a2e2de69b0466b2e97a65578fe781d00979a6b3a605f89059c611bc0a1ad2f9f6eac5e51704167876a0996d76c2211a1ccdd68448e60302af2f76a69bea6186a62347aebd08e420061779a45354cb80f0507e7dceedd56dee3750598ecac3858f89c093a7a0129fce52b9661fea290cb8714327a76179050702942867c40ce62baae094018fcdd5d7fee0f4d3f323896531c7ba34363f9ee77a28dd14548ef043f33ad7a7ee67ad4b66742cbbd0418ab8b50c8db69bfd93055430d2173e3529a462aff59e24cc1eed342123db7d1164bc245e0030e6b4155e301b7c48abfb9c4326b3538f6b43bf1a046ed4b893133f704754bf8e5681e998f93150729b35d7e3ef6224c4029ebcfeace7c4c9a1dd924461ca473480b2673008d77045496b061f0503d648d14b1bcae39624f8f122aaf792c4dd6b160999455912af5ab895435fd4728a7001648df9475c7c020c5e20c991c743d8ee9fb0c8888a8cc679d32ad2bf32542583269240a4258bfab4f4a50d64f4c6cf8c0603941d2b328b8343e658cd9b23f0044dc11cee3c087f322cfc90cb0a98af502edc3799dfab434b9ea4cba3dee037cf6d8040e93c79d841489948b6958dbf222f9ffc88b18d995f6e0ea87cd9f080ec3a3be7a280cf3f08b389137734a7e49a45c7553442b15c174188afead0a9d8727e863bfdd49b66d07ea6dcbc17ea4ab8a405dfc9171169bd244b32b4938041f28d200a39718400bf40776ba5644d5f470d6b3f6bd612d6528f9e3026aa2464dd33c0521960109960ecac7304189e300337b32d2c463d40bb114f930ca372524a341153278ffb1b90acd83025022197f9e8e17b19094b919eefe0c41af5c3146244ec6d60a2d5a242f8b12628ba0c57d8aa130fbb070072604f8918981ccbeaf212eb7b7084ebb3de3d6c0b5649b779a5ce94f4ebbde061b982c406a1b031cee955d486bbd6cf9a6d7540fd035186f72c0c80cbd0638228ddc6427fc7d6561bfb712f4a7c74c675945320bf5e75c970bc6c830e86c839958c69a4c810e68419a0dc5b2808deb85a65401c2c187117114e6f791bdfade9358e86494e449c5b11d46e7f2f6cef0fd54b34063e84097e9c4c1cef75192ac4029a6d1cef27a971b163b10d585757d101c956b1392c3a685d9172f4a9b345a677414cae69626b7bdbf8d72c0ece53802507a690c6082fca665c808124455908e005b4f43b808ab36b5551b68acc880db7853ea3971e6ce23765d44e8a15a48400b0841b7d4e3568ba47bb7b235893327084eda983413293584be1c27dbb832dc398f7702f52c957593f82eb3c479a8290d3e9a5d2a74e98da445427c9decd29dab5d0d6084e5127e49137aae1438f2ab6956e84edfc9fb55eed840cfc0f0b23d2edcbd78bebc6b20e0170408ac39f82d5b86c62e48ef681b234fa1c0a37b545afdaba06315f9460ee31e7a967b0053ee46212850b4ae048536d4c2b13ae9b557d0b85e19da2bd16b17b3a707d061036a770a3806a18cb5f6b795dcd05830e05b23fc904a07837ed049361cbf206b2d8d780157a2b263fda05681058607a95e2b4d7f8b7dea2d05499c63b678b387d0e681553cf4e39ec3a7b0df94b09d51d193a49e211fb11a85d87db802bf18ec1e4560e8f2e8f1fdc96656663801f81b6c2b93b1dba124da071c5a7490408bd54293469573a240f4adfa6f5ef02308ebee4aea4cb6d07d980fc25cc1939264d9c78f4ee6f8725a2361607988fba647a6d6ce5d99db5da67af4b2202375b34a4675c7c0c323b00892b380fb505ec0793d8cea4921b8e2418e25b83497a8b90d1f9436ee5c0c65f3d6b82984429729d6739f53325e4e7ce5d4fb0fc88aa913ef04d3040bf84ff5ffd4d430fcc1c12593116b7d950b5ab6876c7596601dc7d13d76b3b4a64c94c1bd680cdfa3dff1bee31de2654a1bb3cb7c6210dcbf1cd0f9c67da6ac5cf93c61fa3ba414a92960bb928a3b79f0ae207a18e2a0dc68e095017bf12f91bdd40c6c770f4a9406861a7c5d6ab0e1f38e46175627d8ea56516b40345c06af559a0d42e84891614b7b12275be8269a1a748a4f8ac394382c167b65ee2277ea766986c3dbc628f5de8981fe15d6835e2fdfe4960087bf1e426dfe70477c713b526ace16999851d6104ee41374c5f9df540442e5247f344bb78ec73394e3825ea02a6c89be734f5cc46fe0589b62d24de060613a99b90452af3aac1486a407f6a86a2674ad506d36a02351c69aeefd5f95735be4d8ab81e39a1a87ee8693b4f60731769d056d7710ee9da8bd5fc07bb680f236d5fb84186fd83227ad67b48aff2ac94059fbfa17bf3afea18adbd84b96532a47a176bd0af7f240c57c2afa359010699c191e22e1085ba4a8353be37640db82fd78ff03dbeda9e154f82c376fd26c816b74f6b4dda5c8641a1734f1edf6d13670a7271635255c8948a014cafc8b70cfa8077cc66c1e60739d8400169c014eab66aa4203b606a695276680604461ae457f70ff7610d5f7c1d8bd805caf1aa76e7fef6fa8ac1f4e9f2e34f95764ab9d80e59935cb83e6698678dfc03e018b7278a418e47a04fa913fb3542020914d07a509d2269a3487d8c522a4c878c0d48ff3ac6069ee3208fa09a422902b83913d0c038e7296acb60166055d4cb2ee67d5a3841b88bcbee7ab1efb821d72b3421a28108908917bcbdd6d4bb9a59449cad80ad70ae60a3abc3a7e27e1ed74285b9ad6b6ad08b715494d9becb6c595b4acd62abfd60ab3c496df9dd46da6b997bce425bfb714b7bcb7f45d57baddd370bc7977fd966ce63ebbfbf8397c4befd9c497bb2109fe3af65b7aceefcfdf4afaa3578736db585a2710e167fb993911601bdcb10a22b888d0da04d8b10a1d206a6d66a9bd41f6a53408106f71b1e82167145dba537f4ae46386f6e3c7ec436ec85adbc3cb6cc0b8f627def68e35b76dbfc5b93db76d1c879fdb4ca8532a06f5dea7fc519febb0d33d545bfbccb1be3a96748f205bbef5e7ac48719e6bb09cfdc38e5518216617c168cb18ec58051162de4b699f7a8b8bd1fa3f3e98b0f456ca6aefdb4affc4e42a697f9db3c21404081793bf85f67f384cf7714b9ae996f44dd266a9a3bbd2ce6cedab69cb9b3ea979db4cf2b7df5ceb4bb7afdf7d98db7458d22907a5e5ac90305299d65c272f4d153a3c9ee586342ea67146dc1037144ff077aeede7c7703accf6ddb57ba6fc9acac9f4f74f9fa6bd29ab689cbefa769fc995b1ee1193b62d3da76d3afc39e557ce0a0ebb9502acc6663a5b1d690bec56adbe9c0b72e838d7b2a06a9b94958b49189693dec2c9d1c1c9d169e1c05a402d8cb342c2b01c916de1e8ecbc88c0745890a5ac3a3b2f2230ce0a1c1d2238393b9c155cac7acb71328e9dad6d7d66dba9729c39559c1530231aa7f118f88cc78086e6877b4c4c4ccc0fefc2365fb6a4be525f0e0672cba918e4d06d72f7820c73bf6e7f9f865b8dfbad4a4e8741361d87a0fb6a698363e32c3738ce92c50e0671d35a87b6fc999cbd9412c759c2ef5e6023ede7388bce8ebfb6221286a6ef0d67ce9e1fc58ea5b5f451075d86cecc6d66861375b4221b0f1cc400e3c21b52a8c3e215f7fd3d70c4d536e28e91308c846c9fba4d9c020a2137db7f9b1c4642a6f779fc675fe9a3fd89e8e2800883460b5b7e18b5f0340211945fbf222228e90ec92347c25cc7070848ca2b53de634f24f6d4b21b0efa53cf5fcac1a9695266d2f1117208c65e6c70deeb9cb3dca952ddfb94d2399feea9dfc11d53a5be70159f2a1e51b6e2113c1c3c4296d72805e5d586a1941f72cbc9051e9fd77526eb6ab799120721bbcd64cd9da93359f7a78e9c2bab751c94380e4af927125749e33494fe722874e420c58cd026b3cfa982c0169d455f624e1a425134d5fcd018a5618f18bbd3e3388fdb30de9dde1e7fdc9c946eafe538382ff76da54f525c9afea5cfc6ea4a9beca7904208c535ac0da54ee8329eac429ea554282946c43b948b1c69b2fc06c5f8e9b97e1d744dd3e1113c70a6e5e12a33b3b1c274491e5d4c0e1d29c6a46a3bd264c9a46be767967ae6ae7ba87ed84210b6e0421c9c524a2b254e0e6552179343992437bcfdac71d76afbb8afc86ea148b952badbdc21dfd82187315653368ff9f7e6ac924131bf711c47728d54422a514fd928af369001c9c17abfb86596d2f58cc150d821873208298848aee4d7228993f26c393893b2fd70b6f6dc564f1907a72379d2376364dc67fc07c865b0e4ea26311272f61a14af7d84b34c0185ce9e930768c6bceacfd2cf973d8ee4e08fb394b4273938915676ca4c1d6799af2d93762875f654a972be376795ea826eb3b30db0e31443aed89b9435ae325fe6a822cf0e634c0a719b1c5799cfa32292e7ce9e3fc790e5469255d38fc6264d6268a8d8918a277a36ecee48c50c74d690fd6760e3028a4161c72980202487b3ac86a83b628bdc7165026166c7297e20b3c30bb45dcad4d60c4d8d74099136ab19251107fd652893b6bfc7c41619e30acec9e18b9d8232b94cc12da5d468dc9266195c43ca1c65ba22a2496b44a7a494d23a658f544e8e83f1c6e58ece910b2a4f25368592bca5b43ead0f437d571d9dd5c3d71ebe1923993d700d12bd9a7ac666ca475d6596ac7ef59baabeeaa3b3a826a5544fafc336be6e3ecafbcceabd455363defb6d23b1d6c29c446d2d49b55ac398fc094975f1243af47df22e74e8db644e7b62424f4edefec8534dc3672c85a2d456129239f27da1dcdf77d8868b9f2ee68fbca595db282a45e7db12cce4e4e48bdbc4c4060132bf8e5417623f18126a4247ded2b72395e4f5c888a523245fffbd3a479e9a9c908c683a475e7faaa731bf8f8efc6b4fd76aab25f9fa234fc351df42879985a63ff2f51b79d55b7bf219d6119b28fd239fd2272a1509c917b789c988c9a3dee447504fc34d4c4850df75ef2d7ce2724a3ad0c473fec9533af18809952637542a950af5269fca6380f2a98f07bdfa56251f370afdec33b74bac8d798b8444734328148c88833526a6e3333566b2522cd5352673a570316f2171561c25e9ccd8bd2499cb09a058106705508ab36285f2a839e2446cc42485f28572a3fcea35a90af228e1dca8b7787572622b09e556f44f9ee4a3b39cd8153d39d1e1fbe4a983272f71895ed1d0674c7e64e48b0e96c89250ee932721513dfd42d56723ee920678de9390446cf226daa483fc41f69f7c263ff2265f90ad2a1979922fe4ba4f7d284d4d1f97530e526fce58d7446c12754dc462352615d3d1fe030b36fa3165080f2929f989e910d5094a26dbaf3f1fa6eadb43b5533f7c5b3da4f52faaafb846cae4ab8967356769d5f367b23857a9f527957ad4db2f85aa2ba020e4abc99cf993d37d8c4f738d2c455c7130c6ecd287f367c7752851528b3aab1a4d958f7293a856fb73da8f0a51aa69108d8559ccf6af4693357f5cc5dfe70f0f0b08124efccb56441680475bd39320c8a6d3c7dc2313e6f499864f2672e852782c41ce827a7729624b9423992421398573e7a77855390757f5e7a7741824852a81837396c0c1e985fce32c40ce2a79d742b0d9720b3b4e01458f37adb57a957a18faa9c73f76fdd44455d41764574f7fddd3121d5da58b57623de78f4c0eeffc992fb6ffe5726a4ebdaf83abf9d9db2c2711391c8cbfaab123aec48f31273a6cde13710dcc861c03c3710d6c94e3ddf27239a542f9158d334a376cfef2040765e77196ed65e9e58f03390bf7f23d48c859bc972f831c141a9281e28a9431b6c3942de7e67dd9735fe925de3ee8c6674f318468c7298060b467ec38c5109abd659cc4d828cbfd5b9695c0413964d3bed6cfde9e94cef8e2476cd15e5efb1f4e0e1e92a7ae75ee882bb36a592471b294a1dd5687110e5b7e26b50a65353f52e98a980d596e8fd9a10daf2197a457e184a21da98801cde5aeb8e20a3bec38a407671f16b37fc72a9e10db5bfcc08f8e6c7bc5d5df6699d543ee473ca4f52f572fc1bd4441b110f4b3bd1a8252aa271680a0c352eb576bad756654c3a93eebd75a697c2be913eaf61ca821d30fa321d7fa19fdc8713b15e61de3574da73bcd7697d7b86b3b4e0397532a6d23fecb07a396ae1dd190bf9524b225cff650f26cd7565218a61ccdfdd8debcf8a16cfd16ef6b5bac48e4feba508c75b846bc5fe47eb3d6daed83c962c9da6db35b11e962ffc26c9f459c7de116dbf7331be3f6598cf7a9a5947ed4620cb758b8c56ce08f18ebd0bc69638a14f527ee52d4b4b9343e3e99b40d47b365510b02240addad6887f37f380c47edbdda6f42d2856e433b9c976e31eda7bb0eb7d89ef7efdf1b9ffb3bafabc8bf917ee1dc36216983fb2f7ddad36fee7c8b48976e8baf3bba6998cacd2249618f782f17afd6abecb5160de7aee9daf2b722dbe33f31b942bab52f611bf76136cdbd76e5dfb9bdbc3a244190adc856aaa1c52ca3f7fec444d0efc1d1ec935be560fc4839ba15912e728b6d9f3a3bba088292254cd8664e7dae9fb7d4976387ceafc304933f878313749589faf0647a697a914ff9e5f432b3606653eec664a5e440fd4c71f0457e148ce9f3c3a0fe0b4d7fca2165c171bbbbe00f51a80ff7e6ac52c510d44a1f6e6f5f7ed1dd7dbed57e037fd0ad69efc3db9ad6b412920eb17fc84dc1e9856d3b89de0f973a6222a68681712260a6e6e44c9e818c42a6ff834618a59b50540205028820aa9659204220360d07dd7e37cbee0ef28d9e9efb52defb975efa7486835ea9d10f8a4aaa1711d99b17538844a0ed39bc4a223176d459b298bdd459021167a935a26445d5863b93673f0890faaadeb3ed07c3fd12bba6a4956f232d499a92255de24476fc5a350de3873f9eeb3849a35e717f4f593a116ca3e46389f625b0784c15f7f8f3699595649325ac83d6127a497428776a6845a552894a29a59452f6c0602b25a50e93187f25a24327b2e326ad94f86595324a19ab943b250e6b5f82bf248cfa17dbc0a94fe376d452e7769ea697e2a7a55f82f6b454e2e897beab79c060fe399cd3f335ee37ed35ee621d3c4abe044d752caea1d97ba72689ecea4b902e3a4e241a99240108373ef0c18d0fa0c099ef6dbf79304396883f2f51d03ba736bf4ca73e4d7b1a73524a8f30c2c1f83c22cf8c983dbf1b925742d03d3320a284492207658dcab7a7c99e24dfc8d7e53c08ce97164bf47bf4d0b43b5f5145bea68bb0a6abababd23818445290abc42092c2fbed989ac68cc369348d28cd96ef724e3d8b2acd64d11da749c2c70fafce4fc1f6bcdf24fd2f891f72dffb94c856c36aa36dafc168443abebd51d8fd5dc3165b2bd99ab74d1f461685fd8c2cdb6b4312867c4d7f46145764d110f7a5930e3317d2a14a4389aa56a7105bb2975f693a96d5f69b9e4330d79e739ad83cb7363fc39fbfb0c5b63a09b9394a4444fec990d4fd9969f7831cfa6b673f5dce2a21f9120d82a8223fd3d4411236d88ce894be420c33afb03edd71f02b4cd594c8cb414977aacd16af8cb3d39e86d7a7434676324ac459e6d574e76bfd4beab7f9f23ea43bd47b4d89382857f7437ab3b3e5d31b67c9d1a144882d767bbbe95052978e7ba9ebda5021f5ab37ae425d5b17841ce71021fc293d5ff3a5cdfdd4d5e9ab63a6e7cb41195bd6d0e25526a6ad93903bf457388b68b509e9cd96f2eb8db3c89c2dbf13429e1f7748615bc696080b31282fbeefaaf7ec37e74904e350d973c8419904ddf2c6c1ca33bff23828ab4d5c916f9361b2ff21b7f6e12c8299b3681e21cd39944a7fbfd0ea92a63007a53669389fc2b48c27d3b4270839a49bc292a09308e51942fed31e6799afcae32cf7e5d79e6a3359f20d5145beacc36522bf60cbb7a181fcf99a39ab54ff95c6596ae4a42ee390c78c26cb951055e46bd794a7894a12392bbeb0743dc8548bb4762b1c74674f77a67dc82b7608646b8f8483d441e9afb822372db6d03dafd8a18c2b537b190ece4ccf8759e1c83ec79723081e64736aeaa0079c65d5c36e25aa113c8e7016134d96576c6f392853a6cf97b3ac4a2f5b449c6555d24380bbf42539e3206c4221b6c823c4956f8783db73dfa6e94e6c29f96bb2eefd57a9eebdf7e5e3325f12867cfba16febb3b5911d5bd3f4c80724c84bca710d5a6222f54082bca45ed10a5b7b8985adfda65f5b7ee9f3d1d9618ff8b34f90fab8e78e944ebdf665a92f4e150d05317b3e8da93d20bea4fe085b7eea6322480ccc86a625b30215c4bc3411e425a3b146238ca83f285ff9d962ca26b3183b7b8f1167e4e2ca06ff55aaec5965719f638b117125fb6e0839e4aecc5e66df01a09db1664c950d4497084818d967cf23b6d8cf666c332290a96496452eec8c5e98cccd8e30999a26e0ec5845135c3b8cb19dd9777ce906b2c36dd712c4c4c4ac60872588898979c1aecfc596499335b1c5944d86ab44a97a57f9b6fcec88a942b3ccf58fa895685a29329d51a9c442cc2db58cb842375f627b20ae501e51e4500611123d60001082e892f247c496ace579cb0067943725c69600d899263b43656df34b94d2cf90a03ca8f7449e20e68ffb2110fa41d8e4888483daffb07163b35bf65dce72df0f6729c18f1db5d60dd7c8b81b7f2ecade31597eb3ea070483b891c359a836b5b9c2217ffed4e108541b667e90edb8c67cb9550e0271bfebe0e4aed6d141a97216df4ea5fc2c4d753bc8a16afb90d24f5649ab54aa10d4a8d8e8e795ea836c950ee536d94e9f6f93ec335c7f8b10907fc2d9a7b7dfe9907ea7df64ce7f4df943d34793f7a69f3026efbde8e9d0f3fe7aeffda6453cb779d97b93a723e020fd1c38fa781fc6cfe12cf912879038bc3fe9d076ddc93f3c9d4ea7150ed59bbc890e553ac8de4e9fefd3d36bf2854a488df33e95c535bc377d23bf6d9ce91bf99310d9fb54a76fee922fee0d73dea7fa8885387d739bbcff4177f7c19cbe7bd5179edefb1ade536c63eed3636c83260d5119bd3b75efbb7b4ea3f38b28e11a3e70d536b8c71fa38bf7271dfaec7ec2246123ee2b39cf33455515257b9b7241ed4529c626839b8181e8b68db87f78db46dc4138d8c51a67e7db54eb7b2d7dbe33492e9d5eee12ccc9c712e1f6a527f95638ea7b9fc4e94b327f2dba5dbfebf6266157dcef77eafb2db13feaabe11f63dcaf1ed7e61ecb989d3ff9847daa9f805d2b76edfb9d4f4564457427ad3dea93d706d7e9f00bb7f73c7ad2618f7deabe30b5f157acc3843ffee983e974e60d217ffbfc75560bc13dfe3b59f185de0763ccd814b661fcf197bed087e01e537183d6ee3899b3cff4e5eefdee67f7d4c1d97d74b0cb626cc91f9e9ec8a79fa68f5f28b7a9f4deb4df753ff3671f7f4e39ef337df7e52f091957baff41b7f7a56fa35d57b18db87de74f5eb1e5172ea1822d63aa80018d631bdefbf65ec335bcd7283efdb6fd46e3ec4e4fc3f3574f30f94fdf7de1e76389158ed37b9f447ed3e3dfbaed37fe14c0629f9e058b08dbf88b57ecfcad7024609f3e01fbf4de97801d71e6ef43ee9386f1efbefb7dbfee6f176fa7ddf774a8dadfbe3adbb8eeb7eebbddd3ea78d3a15ce1c09f1f7b1fe3cae9f4855dd8bde92516a2fbbcc2e13df7618f9466bf11a476d86367ba472a253f8644ae90a28ea02db7dc5b848046c50d88f6fdb96553df9d026a4468d7b6264769e08590eeb007e794eaafd11952293a32e2c5e92491a4208d78502729c0aa67724a970ca3e5c39e2d24d2490ab08a42791f357ed4771fa525118a076b7904abf228e63f9d4ea7ce74eade84d2d2083feaa551a6a62f09d9492349941121927dcdbcc6fac917cc6e9b873a6512491ac92399841ff5fee1ef3a7cea50a6ec9ffd4d26531776af9d3246bdeb55a719106463bdc2dde3ee4ddda9fbeabdc97bd417a2507f7a8bb1f7a8c728eb796fea50dea966f79e7e3b5dd49f3ad49f2eaad3e1cdeee9747a99ef9fee9f9e3b71a89730f8f16f1895fd86439cf1e994b3c9743a3d0aed9e6ebfe9103fea330aa5f39bba3f9d4cdd9b4c9f9aa8b0fb527e14a57ff2bc377959c3e0cfbed33fe8c67afbfa5abd36cb5e35c8f269dcc82169a44b6787901fcea22f3b3836614c9289c213af1dca9a161fc62cb09833a24106d52f62e8c460a2d341a61184b394deff460ee7de335cfa49357e1afe343ce78fb833994c6f236e93e9abe9eb9b74fdd3db9c4fa6fc79d9972061e09deecb0e467a392ae7ac37acaefa068d24647f777777f7d43ec90c06f8d6ba0945eb2e65e65e0a02a4b415719d3be7cfd1f0ee721c9e97fbeef1873baec35873772bb215e9c19c3608102dd334ab050162b5adc8da38354dcb5ed3341c5c6eb361674b7fd2755ed775da4399de9a3ed39f544e3aa4595f1d3fbbe91e3129c5dda49c8300a95b51dd86b6d856c40b026413f24c9b90b70d9936cfd3e11693ad5c37cfe46593a773de9e72dc56642bb215d98a6c45ec91cdf64cd3580e02e4ca38ef168b52ffb8f7da2f5dfc9a6ccdcbd970ba3bc5cced6c32e990ee1c494767c85957d74e75555775ede02f6e8f87a7070ab1a09f29ba4ee3cf3787546b9090906acd9e256973237540642747ee80e374d0515050d051dc5b52928c998374491ad9aa43a9a45f40afd70b68cfdf6a50dcc251d15017ae6bb26ecca43bd225aa729ed415fadc54868c016cf9f34716605a1dc3f756e262523786cb7efcc6dc98ce08d95f664fbf3133c5b527cd8c09ad151d153904b7e4a2b5c2de19f9c6dc981bb3a78b8d4918f3c3ba635c65ba44507efd141041f971b216105562f527deb30a3bb6a7ac353a2a724863ead35d75b8c4a65ae38094346883d32fbd0fed396709234cf7170f397d58bff45bfd30c618cfd7343de99890e3477c1d8c3ee4ee3efd9dd69df6dd97be7edd17d6efee8e5125ecb48f49c3257e407ca9407657dff3381d5ec7357638215ff2e71a3b4c9a09d30309f22244fdad66bff2befb1dbb5b79de7bb576da87f6217e25e61e7202d3c71d26cd049025ae788218d820873ad8e18a17d33711e4c5a49b407dd6dac77c2e5a61cb8ff75bc99729434c8ffa96902f4cc42b5e4eba65f262d22d307d134b3411e4259b4c2693c9647a2766bc987e099396919169cd78c9df025ff2cbb4542ff95bf725bf8c871413a37a61c226c5c4bce49771027c6162de21e625bf13335eb2ee9690272b65075fc8422b8a9927b4f0829ab1828a580ea060069e972037325790e9814f12197e5eae0d9ca0851858a1042fb4e0a5f3921c383a6433bc674650ca0e51f6049d25c68da9623bcc791fe3fc587a6fce5a5dc6a08a3fbcad6d3f6a9ae7bdfb1365f027fc097fc29ff09a4be4773cc77e8cdc973ee47ef3c2897594ded39d97de4b5f4b5fdf72dcd67d520b2b2cacb00a0b2b0c1cba5808df3a0e73a32267f1bf8e9461aa9eff814df0350d067377777777777777afb0d287fe5bb518873fa6311ea118380eda5f553d7db0576be96b2d3d7e8f06eded3f5afaa817685248632c43bc0d17f0ec1f76a4c205aebde5dccd1b075536d5deb57712ce6eee8bbb7be570da64380e854f1ddafbb4c1d168505c81c596ad4281d6a14ae4df65df4defbbed4bdb97b62f6def75bfe1f787f1ccec293ffa5bcc1e7fd3ebfce9431a7d868f7c2accb54b47840ca33d27398d43d34a782fdf1f8575f8cb1c008c43655719076da784ecffddefb8af66309c67ce592ae16e04e3b8b4663fc1edc3e772e975587aa95d7326ba7df8f0f6fc0c14f235aa999cc9c8246d2be32ab6faf8d59bceb22ccbb22ccbb22ccbb22cfb115c234b611ddbcfeea54cf7f3b90f650bc7d4a197fdab9fbffadb47bf7be59ff74d5ffab8f73e25f2a6bfd59e3a85fd2567e1a93d273cc4f6292137a74ddfe4c1377d1057ac500c9fd0f3300e4f2b2177feba2464ff69135bb0e6416c897bde380b9d3cb3c7592af7e253542851eb909067a9f454eec823944a72a724774a72a72477b67d2f95b0165e072fd6e1694e2b2137d661e933c6d17d098683c9ffa3f449502ab4e92a93b5ef45508c1948e0f6c32684c7a86938fd81c39fdddb4783a817e2ca17240cfb34469192621cbc71448bb6b5bf69b54ec1e767db6af46145daf64b18876bbac2c9a86778f13da878c8233be21dbf465685d529f05b500d4f061518b216b6ad55d85b7bea74c6d806224b4615ededf3882dddbf8989c91443cd6a4ad0ddbd0fef76dfc53abadff40816e287dc9de642235a63629470f4a34226dc46630edad782e890abd80f0a69504883320da23cdd11b2f6770b39488392bab759b6a98db3a4a0a4763891a8cc0bfb990eb52f3dae3c275ce9ab47d5c8c1a24af4d59eb8629ffbea14e28a7defab5490306cfdf994b81b5ba41bf6636e2bd36cfb992bb3b19d4e6cb1db7e6d398b36f767553877854d2aa30b0d9230ecf748d92b25e8ceefc3bbdd0f322cb6dc6dbff2c4966c4fa3215518f216b260856db310a9d8f62750f421f7f6612d3a5215e5a12964b4eddb0d3659910649559e3ae47458b77f904cb9d18366274826d9f038d18c0ed0448a2d42620b857ddc53ac03bfb6c242acb86d77b564df4b3eae627fc69010f8a13fa799e8ca1357ecd3afc286d0c1b6d56cc0947e7b4d06614eafb4c77afa6cfb434e6f4b7a08eaed5fef4369f0c27e78e050b010ae61baff21250bb2a657da73d346db4e4f1b7feea6328aca65d00bfbd366b262b88ac3728feae76db6fded05d7d5f78f3efeeae6e41ee27dc8adbdcabeb5f643705bfb618c6d87b6ad451bc67ff2683a3b68dfbef6746b574f9bc1361fc2055b4c093d763fc8324664e4d4f3b432ba48154418b145321157b48ce976e6f398f7ce4b5fcab88dd36b8d904319346e4ec66c15441953630be2139bca1bc8a12ddda56f17006df7c0110e52cf53f24839f83b1c943a66269583487895364847470a2948418ad6d115ac20849490d26cfb5bfc68bf9404caafdebe9c91f6658db398bc7d694bde92bc7d792371648eb3a0de9efee52c44244cf2706f5ffa00c920292463cefab72f896491b3bc3555ecd36c57d2b61fad5d7d8bd5b7b8eff7be5f2972fd202c7efbb4f78f87a7f4eb773fcb50e6af3e6fcd7b73ebe46351f2a91ee5df7bacf557d0b6bffaee9eb16565bf23426e617ffbdf4a3eb9572d1ee535ac63f52dfeaebec56fdea2a4c5a784dc252cbeb9f322c2c347655aae625f6e8e33591e882ab1e5164d1bad5d957c57e350beb857dfddf3c4be897d95fd12fb24f647eca7eca3ec9fbe093483a6d03763dd3787be49643fb35fbf799444633e2ae32af6b78fce38685f7e36e496ef9d1878e6cdb43f715e6cfbf769b866ff12e17fb5bf5787f75e4dbb33c741abe3a0759e6d737cecfdd0adb0afceb08efbee6fdf7d2a1ee2fab594c6c43d2ea87eaa7e66efd97bf6b165cad83289f928ce42e32cab3ff96af2f55d88b3a8bebedb907c1df99afa8afa7afa6afafa5edf61cee32cddd7faeee33f0ee4415edf63ef445ee4ac4973b4eb7425ed6ab36bfd6dcb32167f3f7ffbf1502a3df76d8ff3e7bde9cb7ffa4c8ffa4e9ffa503ff2a59ee41bf99292a73e968899adc9ba37af566ff29dbcea33f9f9c5169f4c143cbc13ffd2e2bb22e41967dda9526badb5560a44b7b0eb7744c8f351eadf16aacf0712288fb10ed5cfe7543f552cbe99a3b3c3c33793684c2bb66449c88df2c58f5ee928dfcd56dfcc71b0fec9374dbeb9e3607dd5375f0ed62ff9261107eb937c13e660fd916ff238583ff5cd1e07eba3bee9e360fdd3377f1cac6ffa26d00c72b0bef74da11973700e4da26f164d23078f269283f55b7c33c955646eca90e95091b310cdbdb357818287831e88497fe4ee72d715d7323011525a29e7cdc4299243da6acd1b9a4a9fd8998eecbd354369624b1c22d3f45db6dcab74ed8a877029a594dafdeb899fa4d8a4bbcc31649640f3823b7a47e34aca8e9ee2607c1129ed5638a48e295b557989e96f748b0e461a35751d63d3df28a5dffd7cba99f2cff4cffe87b34ed17b71fa62b8cae69a9ba6fc857973ef7df80b5b6860f6ddf70e66371cccb2f0409c25c77cba9a1c87e22c19510f3cc490813396cb691407b34f8921c71da676d67d90cf06fd497ffed474e31c4182e458f973dcca758a83d9bf83d9c867a90c958da4ee45e57cca8090b1efcb70d25b67cde8d34d75b8c49eb4d6fae18c17258a828900b7ccf7de7befa63a0412ad2945450b5a3b8c3ff133ee6db819e07861f8c36eefc6907df3fcc31f16268661fbb9fddc36a22c7f7e8cdc87daf6a1297275e8ce90c3df7635afb5d65ad04b6f7f03638bdcf6a3cabe44ccdf56d77e0ab8e9d5fdabc1bf57bfd8f1d1ce2767ff11468dd01a8a41454b68d737c259e8ae4cecec1acad8f5eb9592fef66f2b6d79daf264cba922f764c9a852bfd65a9fea70c6ae11b66bfdee26d77f911203ccb123b6c45d3f66bab40fba894c4751d271d65a6badf59d98f152bf0920f75b50f2d2c41299b5d65a6bdf89192ff69b0052da010f8e70831a3ca10a362f40ae5e2206e1d8a109a0a12ddc218a973c55e4bdf7de7bafa54d64cfb22ccbb22cabba89e82afa4e1539e79c73ce7762c6cbd44de8207309eba928b64d7a9c2690524a29654a4a57844cffa5cb953068fc81a966c4b822530769e852c615ea72c6618b7bf36ac4941409c62bb68c2b32aed4f0edd530e920fb8717dbd091fed0dfbc49df3fa4545f1c92becdd996f208a13162c488b149a9c37d370d37c520fb905b860fba5fec30c603d1e874cf190211d27d627265fac22523d58171646fb9a0173f293d2873c6f00fdc3e9ed2229c45bec9957fbed430d9dff72fa47f3fc338321f5209b9adae0f53b3a02da6845e6cd7dfa44f5a337bb5d2c6e1cecba6132a354252a2323959c1ba20b3edffde78e0dc412c7f63c1c518bd0e7f84093d90cac7d5a30aad0cd6ec992a33fe367b86bc1f09a33ed10c14552ac7951ff17ea48b29c2a81f2367efc71259225be42c185ff6b40340e74307762adf753d7429df6d442da2eefb8e6b752ebedb7a7a7a7a3afddd36b40d75dd86838383d3f1f0ddc6c3d3b5f86e6b755dd7b1f86ebbb9e9ba121111115167f2dd26d375abef4a3d3d3d3dddc977a5a1ae2be1e0e0e07423df957878ba92ef4aadaeeb3a92ef4a37375da711111119752f854a325d87fa4eebe9e9e9e94edf694312461dea3a0d070707a7d39ea7d3787e384b6b4d955652abebba174174d16eec77df7d8fd8e2f5f4f474bfc359b767aad4a16e080707a7bb381df7ddfc8ea7fb1ea2cbe5f9eea3b7ba6e6e195dee4d47bfeb3a1550872a1f00d0034ee978b2f76d5c8ba321fa8888b8d6aecfc245a77b867abe9e9efa3c3ce661c3e1d97078d870361c9e5d1fa505c7626b6d375b8b87adb5b5b69b5d7f85b299106d32442644449bccae7fb22a9df40cf598f4d437516923251c9e12ce4809078767d757955c9252eb66a4d42ab56e76fd929435694425994e233269444425995d9f04959db41e6da8d37a4c5a4fcfd0ae3f92aba6e1683c9d86a3e168381acfae9fb23c996a2ded466b692dada5ddecfa9bf7752fb5ecba9a59737b867a7a7a867c7372561c1e1c1c1c9e5d7f7ebeb7d4b47bf64c569e36e799efd67ddc8bdbf9f26471422c51ceae37360dbb7e37450e2f11d12d729600fec65996e88700f4805f3cbe322a187cfc34c659d6450a00b00f8f6d90c642ceb22ed710ae18db1dfc2f67654848b08a2bc6b606e39f35ceca8282a6908a2bc6d91146317256f67a21555c31ce80b08fb33217904b08e36c67a70a9ed8a2c271564542d2417a619cd560fc2ee3ac1a3413e43518d7239c8a39abbe5e442f238c2b10c62f8938abba248fcb07bfc42f8f102bce8f5fba9c459190a40d120e92cec62f71ad099a2af56f4caaf845105de8117e249cc57bfc3d628b7c11bd62f877388bbea64ac58f23ba50a0c80304fe17cea2ae1c37620b7dfca0b36ca10f1b7f0fd185eee0bfce9a4853a53ede3825b6748ff1634de390e9a6b0fdc2125d991e74a8eae103a0c3fc03918a96d915d41c4d5cd95d14b2e783b54100d03da468fb72a1b5ae8ffa3a16d65a16d6dad3e31699cd58649935f1c09d64597692655946d95659969d6459e6999448b2ac7ea7d24a90b21a2412a4fa78e49e828e824e4141f5b99445d517d0e9557f3365b7baea4ead5fcad5224d16e7aa352a5546aa1cf568103d0aaa7fa390e70ead107d01bd5e2fa09f57d6ae455d3bf53ffa9b91a538c905c6a1b23b215c0d57c248f88873713549ae528578ea62a3dcd5744276ad33a3e1b3681acd231bbe7152ebdeb46eebb6ae8a7a371e8eb3048093284672162b617c72c855ea6f93f34bc4cda854444844959bd9f57de324ae8668b23897cf4817ee8908a37ed521ba4444bbd220aed40fb918ecfa258e060a99f37e72cc31c79ffad50a394b888dec50fd6d63ce52b1113e72d6cad7c7495d4c27b3d9e99a1ccd9c43d2254b18f5739e3d43f7e6ac523dce66b411f4e768266b8bd9391dec8aaa256ce3b78d7177b0da11210f59f9fb5287f868d7dfaecb196fd53e09e4607d017c32c855eafd520ed65ff954ae529f7e9f62bb986934592915f87262a3ec0457e3ace99a5cc6d1a4389a5d7fbae6b4d92967e12357a95ff3ae9b6a6ce460fda38c8d76f562a0c3e0608b5acc9eef5c2c9662d9d854995f7130716474b12e09c3c6262bdad7cb25b7e84550be5632a35f8c4bb0917bc597ac9f175131f4270ca8cebe8cc3d9b7e52c367b3ebd31f3afccbc337bce4d312df240073890b201173c3490018d01232e6081af408b2228300116128800041e80e280d50e1d0d382122c7100c50e128b9614308921a412ce025b5513414900013024e40b8b4e4037833582cd8000428808c0174dc16038600567e08c00bad7455401f00d043663dd0010e6c808706328001232e60810a144181094820021078800376e8680011398660008e1b3684a811c4025e360d0524000140b8b41c60068bc500320a408001c4802180951701f84105f401003db8f8e24ef171f1c99de2f33305a25850157ae8a147e3689c9c1ff010d919929272e3a2c517f7cbb4f8e47e99960a6c5c344cb87011c322c62236148699745424867fa116ab2f6e14221b85084c09413f3d4c68d1e275e23a7109a9c14ece8d0d50506a56aa23d511521b685a316f58ad8c487e487e80ac503424840595caa7249593cad181a207f6124249094ecbd49a69e246480d0b522999d3e71b15771eca43446388413222030a15db71b95c3bb08d613c4d9042403e4ff0edc5cd0911627383970e4e0e3ccfa521694831090e35333272e0b8a30b748182b2604414d3c2b6fdc4c862c858f1a101e285a5379115a3031fd21c0e7c487736f0363a882e39787c4877b0fd236b87063ea4ad0c7c486930f0214d721617ef3fe7105d7a18f1e1acc3f6effda750642171810fe790053e9c4515f8701eb1d842749133457c38bb00145b505e91256928f0e1844de0c3d923810fe74f0b9913011ede7fd64496d481c08753c8033e9c370ef09f341306d145faecf870ca60fbcf99d8a2328a2cf9a3e343476ac0873386085fa121bac8a21c1fba1a88628b894f6449a3213e7420067ce842389c848ae8e233373ef42ab6a7a28df7570d2f797fe74174f19c203e741fb84c64b98ecf6cf79aeda7f79776882eee23614c1a1fca2bb6e75864f98f023e944409f8501a21e0515e882e5e04c487120c41b1c54424b2dcc8e543c9237d0ef0a104da7e84e8326792e08aac49c3fa50dab07c28710cf0decbf850d260fbcb27a2cbccf911595367aa8431299432bb00313e8c6cd8fe22882ed347d2c416fcfe48f4882d17c6879148001fc6d8caef88acf95385ed8f23ba4c950f230f1001f81791358da6cadc5ab477f0431fb6fbf051d543ca8773ee1ea20ba549892d95d6f8db0ee8c90167d9800e553b8774b1423c764c968d69e027031a03ba8774b14146e8d0371293655f17d0e1b5809e5f816834235d2c5011333493655d14d0e19d008d046872a48bdd89408ece64654810d079808e03747ca48badd9e1f3335959908e9f06fc10a143d57c59245db2a31c3af4f9d268fe1d428797011a870e5519d08dcc65438757089a1a3439d225db092267cf8ab4009d179dade3235db21a1a3e7bbeff4c560d9a2a0af849c00f0274a8da5e245d6a05c2dd68b2ea9c912eb5ce1ce9525d748b1b1dc08d66cc5c960e2f8b0eb301b40c1dfaa6483ed2a5d64818f369d02c922eb4003a04d019804e0c1f183a540960e5850e7dbe68a40b05a22eba2361cc0f80fe411ba9689066fba0431500740f3a45d708499769348d84fe8b5bffc8ad7f80b611b5022da24354080b5b7e38dd9092e2130b8ac562417b6e173972bbc8d181a207f61282d6fafb7cbfb5d65a8bf2c5cd02e5939b056dd119dac4967f4385d01aca827f2d5d3bd6655dd6b5c3c317778ba1dd6288680c5b7e0c92111958b088f1f0f94641b235484848b666cf7d0293fb64c2661384807ce61350502691a0a3a023932fee95dcab2964dacc1bccd7d4993833072727dac4f796bd805eaf17d08e9b04890429090e7366cac841a53adaae9dccb5b3e79700c95d0214940523a298164848f4cf96be5348590d121252dc279dd3e73b1e858ff33811972295f29ca0a31a54836ad0d18e1b85f219a7f116e0b88dbbfc05a79336f9deea0be8f57a0111754445659009a9dca8548cb7a541f0989919010000122315000030100e064442c15030d4754db60314800c8ea85060569b88c32445811032c6208300800c00000800000803008074cb0d3325c150dcc38715e51bcccc8cfeba0e33e630b73606434b1a7df34bbc7b01fe4951c1500b481dc2dc5405b01d9e27979f1f7f1859422251c624b2c58584a884ec3e53aa328bb2512d1245b1cc28d333a6c1a164f4232ae2503228bfa74c30d0c2b21e47243efec3afe54dbe3203115a34670220e08ff1fbffca4f76dfe137e81a9498d41430cfa5841a42c95f0003a35285128fbbcc9132a03181782a72ce4cacb5f366e548a5617849d2abedf460c2f5baf3f77b27d5cc3098ee4dc1d352839f2e62356ef3e0a18c97e58f7374b10929530da985b0881a146acb979fe09dbd75f9238f91cc0170cad87641fa7ec32e17806e31bda5e2d77b89deae6f0c8c3fff5558ddc936d840d8c9fcbeeb6c51ff4b6811e72f177d0b8eb92a92cf7fd3b75f03a634ef0a34babf93c869d4668798c02e7f936f630bdef5b185ddbe4e152832dcec74e05d2a61f167b9be8af561a27e80435d9f17019f823ddc9885046a78e446cfbc7bee9769048807ec28b05cabe0a86cd59acb7b332b1cc0db02d953a9714800a897fe88253e3a6820e0d1378da47a1c65e69c2a8443440e86206475b9a5cdc690584341ccd93d8df75975fbe60fac5f9a709b974d5ab9664e65f7f45046e003873feea0ca543e6c63930eff631c284fa862c08a44f9dc2a423491ccc8ff9e53bb58f16762cc5311e84c4240a74070e08abcb983846515ab97d3000d1af465d2b7bcd05d075aebfde643582f49b8ab4a38615ab83a64452a443c920f849860c7b00e3d3d93cc1203bb25716e46760a9e348b4784ef6bf2ad10cd4df87a5b8d896924230e249c7f8186141be8c1627de71bdef3ee6caca575acdbbafb74e1b945d95fc7107ae6d4cc71ff031ff8a80f3ef4811f7de8c71ff2b10f7de8831ff8e8473ff2411f7ddc473f980f797ee8168dcaa35e385b534ad99b38973d4298f8a809219e9cdd9aa7b4190dc520086e449ca79bb544a33340b99b1e14b1d824b4ff992e283276ae46e167989202ed092b60230c5825e72407c3e1e928e0ee760b20f19caac07384b3d6ccd5693d059208b3d742780833d982902741a035183549fa36a8fc015f633e3831d34aa57cb12f1736cabb95b6e1d265606daa304ca8e131dd10f1365c00e8cc61b77da5be3cb463d349a77b12e6c588efd65a30da5adc68a5dc71791cff4f6ac1b9b6785ea00218c38330cbd04178c635d39b6f848b67ab544bcee7b2357044dc5d83c57b8a786a29ba52e561d18dc12e52cd26fc933fc1f18a08ef58c21e26b78644c19cdf6afc43e36f1005137f55bfbf2c443f90302541f4a1c8c5d30ea2a6fed934f75f89f19bfaf10ca23af5b778a12560c53188633c34284a7c0b70c0a41a4447c2ef85e11844caf13776feaf36f32ffbfacaacc62f4055ec164458f5bfd4fc6f08e64f324c2f888edca1a6dc00c4e9d420f2a8bf2fd07e964eff5763ec41e4457f5302c64859ff0ab31c09881805230a33ac4406d1a1fe1d0d14824874965aa8b0b99b6c70484e5104419a13868d10fc3d34483f051109ffff84fa3b75e2afdefa174475f4ec50a00922a56687dbc06ef6c4aeef17447bcc9dd21a44a4797be53e3460c329ce4629c075be3c0b4901d11c83fc206a366833dae4f1865241cdad15cc964c6fec6250100555007083a8c5300005ff156b2b2c82089b7f25719000e4b74fb7c9f2af48f9f4320ea28696c631e0e5ba49a0a9c3e2e9628dc428612eca6a561edc11460e7b2d846179a99d1394d7b7c32e2095ef21ede5f80c1b3d856d52d043cb09687037d1bd6236d41a74a78d0b8dd8e9a4cd9529fc79b29673c2e99fb49f72766d8b50a8687bab89574227502a26ee2315599095568bc55e2ad3cb5c8d6004bc9c5602d6486c94796ab918649b75c90779ba0f8a45e976aa4248e369a6a014b5c99ae8f604aee1303c70436c8d00b7902db8184ad4c1b89b29ccd068f53029f4b40ea5d773c688c4c62e23d1554a148ddbdff21498e248af387b2a0ceac4123cbd99a7e94f2b30473890401b9b461e6d3323315980ae303462681566c2d02f96a9b8d1dd9972ad9f6f3ef361be4b6a7b704cacbbfc40996df982c9df92c660ba3d91b4f6f4ff7fec49c0c64fbb3dc94261d42d99d2a19f8b122303a63f2e450282bb61025aeb65ac168f74f8a67149f52d821630fa3bd70851b12931e3444e09a8b363df548ecebeda7d0bc1f4d68e47ce053b9e4571ecf06ce6b82d9d6466423375f58979104a6c9506d99c59c12abd1d16f906e91220e2c3ff1af1a50d8d3c3656798a19598c2e063c8f504e58c280edf135aa5c931195c0c7114b91846080ef742ac7fb05986319df8a198845bffb0d87718a744ee208653f4980ecfa6fc83f444200960352fe5fe711878606282a8b63b533b5005dfc975c00705a9900abd44ff17b5d71d831801b6b1cf921220290a7ff2d060c8002905e33aedf4f76c651c4ff6de871b4c3c8fa2f70ec816230aab8ff87eb0c12b84f5e52e3e192ee7f6206127b43f6b7717c0e2c8a63020199ff420732e2a2de2f8cffc92b58e0bbb69fd4244826cc8c7fa459c8d7e6423f07fe5593011969feb3ac9c49090aff4b3008909b855fe0fcc77d1081e8f97d6d620a1a71efbfb75c1f30a7bcc71ff896f6056ea420e519f8cc5e29a227f6e7de18c46fddf80195cd8eabd04905f499b96eafe8f635faee2d25b7940a8a8f3cd016d8523a40e2fc95c2e5bd013ae6971f8cbc0da1abf2edfdcdbc4dc813e09698b46d072cae7ca4c4716b0760ccf1907c876f5ffd4ec384ed7829642e817a8421739a2eb3e5eb594a698433bd26e28f08a0cc76a574f66c1baa8c64fed442b745a3b2ff6cc0d0b536b0dd3680ee2138ef521e1b259149a6c5cd8c5469d72ad209284d93c2d266f5b46bbaa0321d0b09171b9c60737b0e52e6fc94d320234b2410689fe5b68ece9c561a3a8ec83737a8fca8fab712ea10394558916f162662cac8d67a091af2c241391d98a317f76d196bf0a68569d83299551741a37c7059aa01e479c63e8de51f5af25ec80dc8cacb05a7e885923cd38b6479e5e80c8c52272d58a564e131c1fe101b4cc158ba0ac5722ea4e9eb15ddd08b9079bd0f9284c6cd3665a8f0a4c13f64f0bc1e99de79a121b54d454fff51e0500f6dd53949824b4b5160a81ea5f928058db1bfb5047d5238458303260300a011fb5e28e903d580166c26fb74b75ee7aca906c6effa286b9310a7eb94dbfa8879a10db090be64afcf7dcc018ed7fc0cbbbf0904626bf5262caee17ab5ed46179188c7fbaae103b1db6f99abc50de7379e8ad116470014b643f9a6ff6144e914bc1b4bf100d6ebc83c46e11476802552e1c8ab738e686a2a917564457f57e7a8506c622e2b1304192d085778635cda960500b15adbb286962c403e0ae5073ed5879640eddba9e7bde909bbf746fcced3d6bd9ccecd7dbad84bcbf3a240e91a9baeb70151f4aba1aab49f128493af086a10c4f60f21c24dc30b9ae044bb63a10400a86466d1e9f5b7755893cad058a8110324cb2a2b836dc9f51ee9f09582cee54906e00958680f04a60b7189fce933fd48839f6b6d8a216c5e1275722f878340976cc8f0a44c273f98864ad58bc7deb9397bbaf1dc9f82c5d3416c0fccec818c729ac808088debd1fc03ed8f5dc2c0b55c1d0ddb4bff8fb9cf9707970cba9274993a7c494dd19b7697adcde4eb91049b75f0f58e40c25a0751ab1742136caa4ed417520294fe730bac6080627a584765f123c472f17b2d9a9f8ccc04640290f1dd86d4b9fb475ede2c4be27ed6e2223b99c2f44dcabcacc835cf2476fcbfe4de8481e85a3b241fb25326121d1ce88588103a78d5ccf3143aa83c9706c1555d37cf1dc70f2e0c5318224ee26ba60fd9618e988bd1851318d244ff9ef3ba027db49c27ddac1c3418f840a2596912e743e028304168e213d3ccc0f72fca1e6226489c8956f200eef1cc3912aba05acbe073a271ea14f499f48ac15b31ff5c5570ba25b676d2de9b50a2280284a10369b2da4d07d207bcb6972e77a9f1ce76f2e44d6f678c685e59d129a60cd7d41328153804b927368168bebc0ab95b75a772247a3f6d1c81674afae42dc062c33d34aea7a4318fb6ced599729db4b77f181fa8873493615622b42e93553538254ffdab1d92d5e45be9432e715cc0d188033b6668a054b1ea54e8c606c7795e9585d65c4ded3fe66906d916c60f0e80dc0ed1b8963143b0bc60fea3576260861fdc15849a3e4da9e64a9658b3c75d980746a6bfe747c1ea3c442343848925f268c0263ad8c71092b200839c413c4c2742010b26894956600a247968a8ea841d1703193b30b008409ecd222af80b62f86210a7cab52f7e57da29c8a68233db1932df20aa1aa3a4bc378deb4be81a19c96c4853782ea19d6d7334d70df91f0f2050604fbe5889bcc04ce3fa50874502e11d360cd4817bdb47f34f0213dc8071813ff193ed014de879a99a01be64ef33d6f14b4ff62e6eadc0c4b0992864a8eadd73b96840ea8a3438d8cb653955863f5d2e16e68a38164c8ad2825ed2a285ec3d65064f106c04d552211298bb12d411e88c404f8932a77080f4a4aa25c029c14f12314de900ea485b279033028e25649aea81ea905441b0a3041d4d6632a503019d26619de209c19d12311d7b29ae347509c24068e4b071b8eb93e48ac98aa9b8a3d23af8047a6a4f136cafc00c0cfc8acf52d03bfcc3b752d10b3da48b0ea58a5ed0878ea5426fd2474729450f744267a9a19774a3a714d113bad0b554e845bae82885e83537136b49e82d191d25a1c7dc2696a5d0b134fa94869eb999184b4067e9e829197aa1f4142b8955ae0da14030d77582e6dc7bc52de1e476c758935de64aaaf44d56bd75e9602c435d9220cc6c613ad75bafb9eb385d6e821e28f3ba40d50de0955e720ee3bb581d4ad88b8454d79830dd17dbdedde338ee6d1a61b2eba048d4dea4ceccdcbd73a4e1d627db92633203e3d2dd29a11cdb5ebae1f15cdb35626ae7489929bda15e0387eec16c209b7f90e327cc3446ba0b1d36e7b5acf7e45efd8a1b578721c53189c9f114ee74584c03a5b339767bb9aeee5a4059e527c2685cbabb0a9621140e41e495ac38b18fcbce24a48884eb558e6d6d111ead3e2a2dd74200e129a2266b8da249066ba0ed8d75d02ad69d8d7a1823e3525d29819c568ad2407b3a8ebb157a429b1931deb48e89b289a2103b2af95eb8a939ee6c1961aac3a1ac16b998a2d9042059f61174d34d56a1610a85f158714d2b81400990d3d1eb1b6d16e0040e85e997ed60399f529c62f390f098ced25a9888bb58a3e1e99d7918662bf65afda51e1a3eda8be5e909ed0f17247239d3bec790627c001775b22aa83f0c3911c6c553cb50cb400bceda085ade02c8d5ac05f4115f898cf73a9b7fc1f1494e07f2bf3540c73f92dab2ec7622464fd2c5930fbf88a93986a7c591bd7aac8fcbc60da4cc82a1109b4cdc8a8af81df76112ec3744f931fe0c6e8de63cd2c591baf0677f405fc88ba0cd05ee86ba29d50d5d38d24ab4a27045aadeff4206f80e17b30674e81d4f03f9d6117f9626a1bd222ef6d99bc08cd12d61a4926a7bbe5ddf3b8245c2bd13871a05bbc20e05a263ea851a2d3d706855d6a32269d51f25fdcd7b7d4305e24f1816718049bf29771bd2e4ff1f2d00060463740322a31f7cd0ea1f17b6848d42dfc2fa60efa0c03021e66cefe882ca09131162d7724d0ad10d1ac7627811f082c6bada8f7663b594bd73d5f100b05bc5aa965da4fc536db342c4486d70a682c0fbc56aaae90368075b916a76c916618763d5da3c0bae5818483fca4c44d8162286a8e6c3f98f1873e8deaf57e55ea4f00acac30f2ed0fdc0a0cd02cc0bd82047685759edfe090cb25670f93085524027523d48869eacc6a47c6f0e8e04ffe079295a82dbc652e4178d4de3000ffcc14928d9958636502b66a7319ec282ae5ecda6ad8e930266412ded58c0219947bc366b4e1ac0a067031cfd62f62213031833dc73ea19505b83d5aef5a4fbe3740752914f166e76605312a110ffcf29820b3e06590311fc4bd935220cce9e2511d4bd67312f77dd6f3b79d050f2049c017ebb9f5cfee51b5d6c0177ba123836f9e5d2a6aced9861a0c69fd4439340ce4d764f1d0cc8e4b0e2f86493679dad390caf851bc24ca1034ed4dfe8fc42acde308c80702de9a9b5016c7daa67cf4c7407e0d4eb78be0d697f6d997339a0d7daa36edac664289f754483a0bc4741d5669bd99671aec3ab4c5c6476907508e8c0ce7f2807a8fc0a1b905fd7e913d38f6cbb7da28d39efd6fdbc1a4ff4b2b321b4010dda44d304345084a5299596d7bdb3590f9e2752b06cdb4a482982aa07ae2e040f0a9c7b4f1715aee14c9a2a74387610dbbaf2a894e8959df35505c775547d28fb4795ce51c7cb67f38bcae615e809a166163556c18131f382229038a1b850206a60c288039a31061da8e2dcffa7aa7f91ed943c0a1f54733a2e65dcf20dd77eb3a2556ca27a50f8ba1785db8bb05b8ffb312a1283cea441f09eed564919ef11bfc44aac349123459e6c6b44c4b2d0b6297eb2c577d08ef05f3eb47d9a918226cff37798fe0e9da1e39376590e4e59aa1a0222f53cbe36eca875b4d46b0552ab7ef32715bd32eb62c2d77cdc40fed4a9866fdc7fcb2d21794abac8d743b4817caca5a45ff1ab8fe1115565eddee162b5a417cd4e63ce4cad69d3054a4701aa7bdf34897324dfc3783ab85631c52bb1c626b0060a95620a3527f224961b198f347b5694f32d11553d5fea1a5f3bb3d98a92fe69d6d6ba43753357ddd47359ca4f21a686ded5e35dec8a04a033691dfc4d5be4f74afb14de308c475796d6357b9207e189a4f7de1b92ca6bb079138a261dc0877511824c8f9ba0974229481ed4b537eda692fd1ada243452c726bf5c71d1db72ad0f52b99874316f1a85254ba65b8f538d22fda9c151a85637252bb1de447eef3547aab738dcdc25c7996280811b05c574c3206bb04512d545c4014fc0f42fe8133ad7b6d7c175980b0056d8836469d7321eb1a7fc02519fdd3766d1322b5abd892fb4cd9bab2ba84bbaa32ffc6c41b19e17e6bac4f7cc1a398243f8bdc9d3ef576e554eec71bde694ec035e953e84c7802a15354a48a9306e3d288d29c089373d36bd517892e38aacfb095053b67410154e3b65bf95e6304f2fe4af6ba39d3a68c88a96b94c92d4bc313eb64f3cccb330a46393f09b13320a3bd2b56049b7c38f6fceb817d79a17263f4574bee89ad2cc8841039f296891f0818d8c19ca0c54f00ed4972efaabbf36662826b2d17cd0f723069db9f6d9d8a49b3978348f3fdaa743e367a3069e634a3f4c6521990173419754b6366c5347f264d0c8222fe58a02a16170cfd442878e942f94160c03124d7fef93c1e040bd369865c553b8ff9d50743813d9990453c4c59c530ca391c13fb808b575ad0834af2c4a71f97969e561bdae1fe8f543c9b7deaf5fb41f5f3403cb1962720081e50b4dbc6837cd9d13045999d77dfd4a7fe4e5a75034e6b3884079dd70c1e498bbfde807adc1c7bcaeea2373277f07af5af0f692ee04014ca95d960709d4737541db28a004ee3024bf8e063cd58f2f6ed570150f12aeb9e20488569c3626789b2528f2e6e85f6ad24468a57b5887cc8f47b0f16977419d52971d71fb4fd9ac025c6e49f3d22c490a10debb8baf10677c17b6e3b7010abe44e99847a21f6b8a418b1832f6335805c1640ace807a68099189bfde323f14fa7e433c5e99b8702ce203830add3c962643b56bc1bc96c22dd537b94699844d86b7ebca271ed834297584b54ba7a5f49616fd81c1a604d8351182ef6e9288b40f776341ba844edcaf323bfa61cac9e38b655a952bf24cff87a1d462d947cce41983773f4eee440f7e6a0c32bbb400b4d70f8096cd8e76d60eadb2bc12f4c097056487b1302605b1f7dc12b17c84a7478960a9fba5a1eb99f9c0f9a31b5eaa968597e7dcb1fc0e76920094a9d78b710a4bd6fc56f19ff9a73c111cd96c20f6d904171e6bdafed797fc2c2f3c2e4c83b799b0780865b07724631543304be35a441bcc07b02eae120f37612882acec836997e7c44a0e7182169cda127c247ec8f120ef0ecc896b6fe9a06b7ab4b79685e883eef546a6aaca52cb9e89f0e39187c36fc0e10dd98486a93ed47736214e9ec919dbda8ced60467449735550a418cd25910ac97a52f989f9c9ca2b6ca4eeec2d4549fb751657d6af8d588800624903b2b57591e20698ea1772db5ba8ffb9a1446ce74f41a16044d4c06bb7f50a55acf35361ba205b74b0d766e983f1b11cf269a40c28c8a41f9095f01c5cd05c0957ee6ef8546cdcb494bb5d8aa8ba28362c773dad59a2e4252e5413a0642d565c0508210c60168da2c4846c66bdb4af87f0806e81c898732315b52f71182cb0d70f0216ca55b8e4909ca33c7730b24b8b98b3cba7f7f261a7f68949f0051c30518e229156692349bdd4727076cd8eddb307e860887bca6181cebdb752e4ca320010ec8ee7d62306241625a41cad558813932d0356aa1b8e0f2b9707552c7847b4da85f9828d0e980c0583698f9a20124da53eb9476d6c0c72b8ddc6a39da17ddaf04d69d72646141269b063dad1b4961fe85d31a1001c0ff126f7d9507a63c57ce93bb115a422a713b6ecb11d4510df559e59f2243d4857b6eefb241632a1f7656536c174986c2b5c182f97500a1291c7cea2c335cc67b32d51a7cb636a4e4d4f071b04077e8384d46e5fc4d7ddb174a47250f717ab0072ce88558697a3b4686a0f0ac7b7a45e6b4b1450eac6fb9cb3ca4647df17e687899628481ce3cff3cd23692622fe3b3b2dd0cd690755178116c8bf81c56005e2419dfcbec9d9cf17883b827120359f74f1c4fcd36f7461f675a23ace4f5485c0ce6d365253d4160f0eac1be0ed7447f2c6a3e6236a3eca29081141f2ce0ac0b5c8fea587b240f81e0f8050d23d86f0e89f4cdd4696521e3f60ba90af5c0185db1327268f0315fe3856cb327e2e1e29d4c57aaad5111a04846db80917815931df7b76c723e7467f49198eb903ece9c7b8ef5e8ae7703e203516240a1f0a0f7eba2b4e3e2e4c815b0dc4c5c8d83baccad4f9907c44aca2a3c6eeccfad6b20326a88a5d8668ea4bac88c9c1fe2ea9646b1dea009b4ec19e1f17b6d884346f24f865b1105dd9dd16a1bb4ad55be6092280554e99862dd6ded5a09fbf28f24b102ba11b0645e436f4ece842cf088ad5bf962557af41be678b826414b58b1dd7f352abdba4258c9b0220a486cc7b79fb5d2d115577a008fbcb36fa7f881a357693fd23b66a9e1365fe98ed11eb4ae9df59e83c33dc8770392c0873a4aed3f174fce8c80348ad5cc69498f4c0d7843a77ccc6e2e860294dcf7b46e6160a67491a40c85126f5bca0fd9c04a08b523691b951555bcc9e2d7a102c33bcde43ac7eb4c9c75b9d59bff4931549836031c47f43ea0e64bf36c97ad49eecc4c278b005956e96d03caa643e9a3fa86e06f2c260d7d2e8ed0db7a56758d39f3933b8c5dfe5c1f9532d85607d53b1ef9bf11aa11556388de8b3b9cfcd85923d4bc5cc9435b806715f7b976cee4e6e20ac47b4c0da66bb6205b7ed9c4ced9ea63006e9d8d713f8f3fb734867713a3ed97e2f51325e0830c1503bf8f5d8b952cf0cdf491fb4956bca6a781a7f265768957daa0452464f7f136bc45e05c39f670e338cd26b0b424338c66a21e7bdaed5a7d88d54792693dbe29d59c95851aecb65306fa2ad998afc4d1d61053c72fa4264122c542600339fa143738bc89f280833177a36e7f7037e1db452aacf793dfb33ae56845afc49e82924e532d36aec82802405957254864d2177f6d3011c6b1e928408d763359fcf9476cf04304cb4969a71f1eb71d9bdb782b7f673838115949412b9f0820f053b75fd93ecf021253d6f329133ea88131a1f00bd01336a74556163d1e4b017ee9235e84abe76720b94589f08841e9207dd17fd48c5cefb3c81febb41ec9052cc032636eb73e3459a1f0db739c6d7691fd10dab91ec641933c1cad842bb712beaf570dedbcb4d01e6de7e722349377db237be7c490a6ce1c0055e8091ce021a7b15e4db7286037c3c37fd05c6bc9d645fe5be2691ed30f10572c14b279adf5626b3036b0cc3a16761020782a48fc10eb9a0e12677feb6311761d653d09fab7c30f0a07897de0e87fbbbd1f92a44c3602abeee607e9ebebe83611cf6b9cb5c3cacbb11059ec2e2d23faff52394f912eccf4c6f0105e622147e12d2b7cd88af567103e74a8f42c3bf82d01c6011f51583c502b473ae5daedf7db94b24e97ae2293e91b8efa9297465cc277e60c2cf895755b45c9f8b561432a5c38b58da5b01c4820ef2c4544822c7b3a924ae534d3ebeb211697d247242d8e5d58ab590c2a731703f22be7a5bcd8d5072a0d0b1e646ee40b8327d94c20ec970684d9d40eb11fcc681879d572a16853978bfcdb2900a0da7e48ca8741cfdeaa3362a0fe2e03c33133aa321ed5016a89e470f0ff79f06382821a0bb518c3c3d1398d46a6dfb2b1de705951ecc5dd7806d2c15a37c65b84c341a028a37dade8d3cea57519bf9317e470ba158e1057a52c804d74a42a2a8a539263424ee57e294f015d7fc26414101343e718b4b8ba0fc894f509667cbc26cca4e2b59163b91c2136206536174a45dad04b3b18fd3fd5c5c88a3bd45472f69753aab3e1ee99c51d03221efa1a2ac08d1b953c5fc414bbd520b66d14f50fbaef62dbab55de6ab59edd26bd9644d50eb7bf5607da05079eecb45168a2d1b076241c02fd7bbc8621f000417929c78663e240ce38e882dd9289a06c6b6c49458c99b606bb5b36b5e89c76f56bdd7f0ff88eea6a547c64ae3d4f721d5aaa971e7cf35bc984c0fe09bc1facb5316d5b3dc24295edeeae4ade4d3649ee667a84f162d9bcbac31b41b62bf13ec20e49ccc07fa8e58a7dcabb3c94e68fa097e02822148c314c5fc7a29de0450941092222433d7735a8601462a2b95123e469e0ae17b670278d431666322898d261da7f76a2212b2f408f82394180ffdeb12677fca724f48b2a7424b21263e3a3c3053c9d3aa07a74edf4ba105d6d4c90d7736bd5025f52063d92c712fb09bf56060e5fd759c85531591d04e982347cd469008c0ad44c152f77f8b917e8c3fe59b38c78c85cdeeaa450c7307c1080f680a84620a07941e82355a1a0a19608bdd5afe54ae141f8f48320d610bc120f6fb33273dce4a2aa9aa9a8cd720c77c9385023c615336cb7099221bad395ce19c121754d31235249effa03e06abf3c8398a1cec01cc81ef745530012f2f0a85f84c95029da16fcccded903c96c0877e8111cdbf84223ed341372ccdc300d74c473c6537c1bb1511a87a66115b85a61aefc51928c7e8cfe22c5a6121ca06872b1ab445d89662c00f11e52a9a561f2a6e9048770d143cf9f7f78b068c03fdc8699946045dbe1608420db3a132e92e9901b0d7d7bf06c73a3a96e9e1c6ab48bad7a31994c53b3930337c2a683642a12ea8849d372d0dd82b5e0b357e3e28ec4bd265da3ae3b26bd5e7336ef9c7a0db07db704c884de02ffdb01bdeef9e22cee9dcac6208707f0cf42486bf91d007305e9c6376f0329034182a186908f35abbfbabe65edf036c658e64074fa0f3406fcba733cc9d45c649a742a5a6189dfc609880b218959a469b786a5743e048ea854316204c0d8dbe0c4f137ca088d47d1f3185204c989521ffb255b701f3bfeb5254560b9b5fd73be9947e6b3e15146407e358e460ef6056c2be830750a3127fdd58dbc0f37d1adaeaf405002ecb0bfc510083dbfb953bdf235a3b9ef83c754b4ff07a4b4416289e9f919b08030d7d93ee829c6c0f7a473ca8d68cfb1af5027979f0af9daed53531f3c9c202280abc6c36d9418758993921b45faef7127cbf86da4ff1bd60f37dc777fddebf95f6353177e3cf8fbd411b71df28a3bd1df21b68caa1617d114021ddcde0f0ce366f6986b1bc6f15f217eccf17631c5361214f4446750a0f43efcbe873eeba46d6ca64943ba03bbc299e0ed019d332a811a3a5ced1d8f181e58f879e22a198d7456f2c7b69a0513fbe9a84cc59f24ae9b1d2cf527d24b976ef54425fc405533cb505f58d880e587177d9e491d939c94291aa4c7060177dc97311d5d3bfb5f7c940d82ef2a6538dfde64de844f109e4fa9929cc9d868f05a3b97de091827c7cf38d425a8848564c8d3a44d0cf148abd8ce36c1cb2d00c51807714d342ebfbe4794260147f30bb0abaa1ae43cbacbe224d91ac552f1bdb01c326d12609200a0757c76d8dbf9427ba3abf053ed93a759552f9835d87c32b649104c3eb04d532246798924e15406e7884a96a33c25326efed3d416257b3d712af997c48493407d304c61fdc4b7893eb3cca04d572b99c8c991b5c38a56bb34aa903f0b195f7b19a96570e503d728d154accc328c9fa0ad6306bc8f9d1af871c8efd9f5b72f859cc90701a3ea237576117acb346785163549e02d13708ca83027aa66ad458f5d315525b93b905b077984720760be134d2a66eee272af5a1646ee3c83c8fbca09958b330608fc6d2692e0b80778b3c8b8fc367c0c3b459a495450580981841b6ad523f1763fc80e4a38dd37ca833113c3c3451a9af4db61dd982f767d007b3c93a17f06f98415b43cf50d8a0c9187e553fe9a011cb1dde8a3458de7976655f96da247e307a2d1f56e611443dde89bcb20068afa5fd4ec323efd1f5314b6eafb276bbe9713940ad1f45c51b49b653c4ec3e07c4c8e3c24788a377f27c2bd280251905177143c0f64c00abb5ffa5da707d217891eb388818e29b3bce6a8f0f6d2516375a1d333e3c9e07f5131c4608088f294bc86b560272fd9d50c328be6cef51d35f04b9ea238e60b27f6ce9b5b4b9c6b0dc1edcc457b017c62ef0bc1059d81050f9a08cdd87a4e9b8b06045cebc203029443a6364581921b035fcedad99b4ed8d82f80f624e73f8657cbe3d8cff6a975a6c81440798126b436533e97b4213c9669ada9f15ba63494db58cf8589e83cb014e64d303e710380de7bec972cc4e05ec586f91af39dce6dff0e5bb7087f9ca6044a7d8150480190ae1502eb653b17d383f0cf3204b16c7a03c88d3a4b0c085636ce8b5d77b2c740e8924a67a89ae3b66fbfad12d369e6a6f417f32ca8ac56c83004c14e141a01e4935ae7f89cdac48938b6d9c6db42039b25b07f34b7b8ebd355b5785a321dc20f2c921eb747c415011ab91a5d54b075fe198bdd703c09795547a1543094a7c4c67ca00a29e6e2e752e7337e77ff2e66b722ae222f292818a8c5a2d5ce858e7ed53f5f55d76a05ef3ebf3e24bc1435d3a01b16130801ffd11db03d61b5882d9eae4da752e49972cf8505cba26d01f515833f04173d5b1d4215ba78e58db0d9547ea73658c8c8bdacd4631f9e23dccafc4611e662a3e1c8400d2f4106325253ff54e244dcc004f6ac53e91f50a272a9141b9c92a016c463834f9fc6194c44468c7d5ef661e51070c26b827f351120f9b948934e6368ba78b88ef851968463cb402c72754cf197a138c308c6012503564cf11e292267996d64dbc0253985db2c591c14d27bd69940c89ea54d902c2523c9e05c6303b186371ba674a06051d8aae78ebe1ac6572d6cb57d488824e582557d85844ffcde60689723b204979cb2ea824bf5b7a9908584be24afb57f796123d0016ed949624f9a0cb17b005a85997a1947003cc42ad06950a012165a7d9b800e21cfd2e948f26b81e592d0dad1838fd36b6fadd69543b3375f6bc9e2759691f282eb49ebebf16221767b08a999437845f69a9e96f6575a9fa82c055b2b3422a88c818f1c5aaa1c54575bb060e8646c85173261c2016432fd59cdaeaafbbe801a362acb3bc3c3dc325f23195ca14f6a7e74f0d310be59bf6b427758322e9fff2fa211451182d2ae3bd41936510b15e7a4fcd6d9131e80aaac703a36904e8729e34a380de374c785856c88ed78077611dff1afb5bc67bffc89692df4f2fc0717702901635bc552e96d94b113100be30c55e8b5cb0096d651182263697558ef599e68b68e221f299d39b2acc44a9b86d4276f31d2c09c7394e03c0441ee318eada464c3a2db68d6feca225ba90f06c63d4e3046ed761a7acfd2e72850b185604d388a0e8b6d7168a1b5d03d344f5f51f64ad3272919246e6a69233d4dbb0bfee09d9e0a28a2add6cad3fbadcd4b3a8b0e2e917e85e9fe3524203cae91787ee11e5f980819bd5fc706e2a68b66476383a6213da7b2401c2cc2f446ba1501eb71154230a745dcb3c50d3214699214b411ad9bc54d15991ff2fb4c48cd56c03f75f116c008df517c4163adfbaab360899133379b9091c341a6668fac978b15bc20284dac8991bbf0a010bc1ac6b5a7e59888806874d22e3c714f1d0e6d897b04047a3053dd7cbaa9888b963a3dd42ff164c07c2603a6c14861fb2f1a0cc20c34746d2ca00cb9a717979a81988c1cb4270943522e7afa1d2a722f0e988ea96d8ac9cc8ac72876449db5dfe0491270ec7e4b381ae195304898ab73f03efd56a578200bd540a759efc865569fd18aa4dd386cf62ff341de7d524189692bbd91ce4c64c1217cf53d542e34cdb996c35166077725791afb635f3da4046a2ccaa8f1358dd1ccd8e1d44a78db8afe8e36da048ff9bccdab5c2cfcdadfcbba5c81e3fd570bc15d06ea6609020188b6b61904eb2685eba7b21f520c70e3ff505365785beca76512f7d526022db53f47567f74e3cbd707a760dfe5d705b046e122f3e2280412bb89d93fd0b4ae4b6530dd77f695b0ddaf3b89f31c14608fa0981ef6cc6eef8c21f4a027c9b25ca56f1127ae3e925e2940a70fab6d8c84758f465ab1d4f1ebaa9ac2582df983e272f5b9eb66b5000c2dcc4ab23dd8ac0ab91280c2a6d7279cb50312170a390c04dcef9bb9c31d70249400c81d9357f4681ce4af9d5b3d15a3d24dde2c978d9eaa460e130ed2a3699375e1237639f6115252def47702b9c2554f39229c92854569d64a892de5c20dc9f26999bdac63fd32da43627847d557e5773adf529f3ffef4ba62446bb8bf619bf44b49b4c8923b131c213d57cad471ab5c47e2c229b415d713f381fe79146a86ae2885b4d340cabedbe285f00ba40b81109a300129aa481322eea721633602516aa5846c4e738371590ec3103e0ad7373da66b250ec07dd172d4506628c608e985506acc04d77c227ab524a2aaa4ff91154512609987c6d1c9081c4f798ca4b0aa8fe230bd6fae6ff2c02dd99f98ce742cafa2b7a229370f16811a6beec818bdef05bb9417279f3946d513f00123d8689e514cd58451192e4ed4e516ac2dd0306fe530fab5590474f02b7b1eddd65dbd1584070a4615fbcbea3723c644a188e1c462787e24d75fb0061e42f5f70224cf9aade8bff23b32fc6c31a6fbbf0522aca76e6f08f5d6cdd8d252ef7cd7efb962bbb0c8272216560f72e604e6da891c44c7a38dbca7e7af0a41a990a4c843799a0a9b3b18867b8e1ef6e42d419f3b05dd618e1366489c35cb7983d87bcdf8b39ebef4d52f18d1f62dff1e038d58b61c16fbfae987d6f168b782c23fee170f3f04e4bea2256d2801058ac92a11410891f4d0d68196292313a943848398728885a2af11debc25854a08b4b9a2d054b5375ef4f3d9ad89724309714a25456f33404610ba0f866674f530c8e9ea8efa09196f63661f3d6ca921b7bcdb9c698c4760a330f82f5629d321b3fea7b71999b2c5e20b32e206cd4fe60ad30aa1af3d0dcbcb9911a9b24d9021fd48efd5e88e52dee0d84f5d3c5301281c41d9020a3372ad1ccb0b2c384808bb7005fb38ec8f30a59c175cb38231dd6eeb63947b085c10844e3362a5c36cfee88855e6034c0d9b9cbb65ce9d27535be0c63fddac60ff6a4059676e8c85fd0913bc7ba0c0dcafa059021865ca1118309988d3ab334f869315a527fb69c5d56bd7e65a242a81b9ecac15efac82f1ef1d362add7ec8571226a436f3b2eb37eeb22a496f0cf2102057e94617e469d89c6d4778b0d9286e088259f10c1e2a4517081d972750b05fbd77b3f48aef1113cd965ade505f60695909c307840bd9342f675cca47a50640187fbe0e728a143295d67b1df4bb7a19cb64c322a7b87e1754510c8d6cdee59072ff91cb27dbe9e0cc689c59113ff1a416c62b821638b0d991e8b9c4d85dd718472c1da582b5d3ff747066cec801a43d2b6685e5c15e500963580e56b858fd90d23609107af01bf666cc3927d669ca29115fc87cef33f8d7bf091da1f5f840212ff85486975cc96234e8c9fff64b1903a0af7c81e912a262dfef7be7ccf8082d2f4b198c3f667489e0cc4e642cbf58db12e605fbd253aec009ced4ceb08f512d97df0548eea40824bca10050a89727c5b00dbbd7dfddb97cdb031f5a051b363efd32dcacac1451d7b47ca430450dc2c1566386d31d19df1ca72f289fa4f49ce7c50efd08a6bd668107c83eded561d01d06a0821804972d879595db43bc2732e9175ab6cffbbfe88e7fdbf0e3f38650058cc3b1cd340c6f209177253ad8cae11ce5e0c9af3685af37ae9be6faa596bf9e3ca0bb393562b556a7df248c404a6a98a2e98046c684711b0e6a16bcede9964b9a46831e3ae9b6b81ed1dce2099015e9e0d59e64ce780140f604841722b733eaad2e25a46825195320fccc8b2595faa08137c509deed96e7d31ab3487f79db028051c365740b22a75d2bb79e67275284bb838d49de1d7496a5217e0768786b57eb6670ccd86b2b15c5177dc8a458fbe354133784dd5ab49d80ba9444ab7a16e3b4986ea725908b0774a9d56acc5131f5a6cc33ba61406746684b6e7cbf03182c740d2f908f2eff5a1f684a83d1b1f08b96f49f7d101fb0bc8f60015b52f71baa1513f153df099c464f32ba4097911b6ae6ccdea54c51b649d34b1d2470a09206461873142db2a5a7dac415c82a2c6e8f1dbbeed6401594b4241a1301417fa35117ed682f0f04bae146100a2630bd9a0487a8c8ab5dbe66a304d5e590344c2044c3c1f31fde60ede8ab274f7f801a798e9ca0e8b45f25cb248681041c96b59098b8e234eef612035607c19b88ddc8feeab2adf41721925f584de33cea97bf32928bc909b6077bad00a2bbb7fdbde1851caa39da1b8c6d831ae89765490811b8d2a2812a9a0453a72fc4bdf5428613800dfa279e179dca9009062df415725148b3ac2afb6fe80b7f922083ddb89ae4c6b87a38d4ef6612a9a2aeb230726e42aa9844cfdce51eeb270237b962c6654cc8b35bb3c11ab88b550a66a041a51a4262239f85a31189d5629a045a4555ab8acce96c544f57d93f92c05ec48901bc9801a90febbe15a9b218b8f085c3065ee57c3a6d16ff7ad0b380eb0219479d1e9fec66661330a2e6aa40e8142cae8b234af3ea37815395668e424b27cdd96eec0cd54e1eecdaa2778ab280a33255846dff96eacb6987354d2d6a6af1ef625a2a7542a26c8186f2fb73baea630c75734669dfe3c3e58c0a1c0215cb91c52674c0eba2839b906a949e7b1b166273a26de851069373916677bf54aeab7fef5426bb65cd0e9abdc7ba684c2e2489568e9460281919705495d8b4f122613fe161ad8f52f160e8a2afb42335e14117a37c2a540d5903bf087d15e84e825c116913d08af57104c2e9d49e8e15240e8eb1c99c041ec894ccda902d4f78666d9461b94d2afbb5df1b76900c024a53a038645408b09009b1a02d09a6048125cf5b6d2b5cc8174bc376a1f2021d550d18d7c31b941585f3dcc46b1f19403da1e21e58c1567003d6b2c5459904d40b39afd175a29a2466ae127e06bd89c65ed3239015384b2c22bd971cb77019f4340bd1eb2fe26167d468e866d081cd9c5e0315ad936e8d07bcfe00fbbc8e5b301e41ac1551b10d2ed2813b0483d2e560f957e8a84e3b7e9c1cdd4a0e01380576be6b424f711cb83d849d162b6770f91a8cf1aca4a38123ea495782434e8087e0151e5cabc6a381a27553133492e788ffe47a227c44c0712de764e3eaec56b1d05549095473bc5169bf495eb8e619fe51a6efa9ceab578a1e5813090d8d3daecc6d84375ca1383a24fa8fe284d706c81cf47610cda9bd0c5832f4e569d14ace0f34b1e7f35fe734a23eabfad7903d5112ec191f04640c242c8eb83680aa1228525ee124fc01a24548c50ea1212fbd74c32ee420ab2f3dc887105e3d309dd9872a2f8d4705b042da267192c966fd0b39ba4ddafb4b46962168afc60c3e6aea499d4218d0e36b3e2b6365f6b006b90c6dbd851c5f5a8b05394c746e48d6cec20620d42140a736f2b0beefd597d64125d0a0b72fed1c06385198781c4bf6653540fe7df0d61e7e63948259060a0a00bca2ff1bf4e445196e54c3f88c7e077e192de9d094d0d656552641d000ff0f0f8559a6a7ce80be11d86f625260cd76fd72f767919cbcc211e985d8936734d04e9fe007615832edc2ac0ee858e3bd734e31ba3fa978b8094c49afb2017f0a4001eb6d2a4037c95a988d5a443821d883f1a0a44af65a5a3e8228da0de5af19928d05f98185c4b05a3d1917521f6a38c89ba4b04e1064d12dc80a6829104bcc75981031b7cc2022629b8042351d7a0b8a623a4bc9c70fb6e70c0ae9e5aa07e85d8aad64171bedc79a57ee5a1aacc73e6042a72dec149f554633316f46a35cb76c1053ca89d978d00ef52db7f590c4ebf9c169e34adede27f66b885b0054a7b74ec05f7556925955f764bc64b5bd4fae26ecaec14393d23a5ad5a657965a528e79af653bdecd7c299b0172880278cf27cd605bc088fbe646cc519362798b3ce72d22510963a8f6292e0da3ae83604e5a4bf5f65750140ea21e4bab25cce8270d0fff53426a529389cad5cc1669f5159f30186534cd772f319ea7f78dcb7f62081de7fae7f5832d0bb116ca5490c17fe6973935abacedfcadfc7e089b21e0efe750229f1b2022b73f78f8f351eecffa2ffeed746c3e98d8e1d4087acf4433d77dba0879727d2006ccf1993eeb365fc5e283314126a4e5ae5b1a0d46abdaa8b88585740d911a216d28587f0469a03d0f11718483c71e8c11dcea13bedfe6b893212a8b2a016cac1aedce4f0d2b10f782de62f8404d2e639e0c68249c846d73b9ec09fa7525308c89f1f54fd6aacdec1f8d01ab669f882b61f2cc42352abb87076e4726af376b51ae736145aa169943f7d6072098f0335305f5241d24e300d2460471741280fd4f95e8e972435c93debc964265bc52d464d7d53c3e6a942e6b86070bc0ef531052920a6f8ab0745fe4c0822f9451e5ff901c342f2c8d4e62560d32f6cdaa78d8df352bb588a59c59e5a82407607b638b5a6ce50a25575ff33f239bcf296403e74c7da0e4275f4d840eba78d815afe319802098bf7b197cb2a6dbe2c2a7ac33fd1eb0f59ae68dd6e09e29bd78b62a2ce6f9342fc8e3aed5f643dffd0495c4d90ca9b6a0a839e83c0e8ec0e3ca43b481e0441c7f09e1a588909a1a2ac0221a973de38018f673c61d2d20603559d174956ea81c762fe8e952e6082ca7516c01d1639c10023cc95daed12f2c4bbd64863c1e3166d66426f401d74ac0f6618d5b5261fdd4bc92628e1536774026b649dc2925ac77b0cdb02e2a41e8a67075b0ff9b288bfe68efb3fc0741002daecc962dc791ca030994a47db7a292a699da1247e2e4136fc557d416082f5944c0050d53075c2fc426880a7faba53c8c2d70a56e40c6d160b64110e0210ef048574b050af521aa23efa48d97aaa71504916e0e7cf3a8dbd1a57e24494aff2ee65265cf233c8c231e39ebd5437b0627d406d9265dbc6b0050ca63ecc9a7952c676b4a57ca3c2581427b2126ed0fac39ee2e4ded3e6b09a981a2aa380fb08468f4a0aa3f4e67e2e49d87b9dd85312e744d81d311c528107313682ded22f9de5fb0f9e83bef9b06d0b3c16bd4ca1d0545e28422a39b4651b49d535c3ad0e4eac583d4f17dd261b942b1d145ada36f718271604d083d75089cd7fdcc50aaaf3a025a82c40f65c28d99bebcd3d4dae80b6ec09936444d6576eb52adfcb1463503de8a11ab35f7f6b173488a7dc7e30c5b9788181aa1361aec95f333f921b9bcf730e264884f261d52b14e44bb2d5052f36d279e228548b568c8c70cfb03fbf6957ecea2569d351bce5fcfb5f2acc4105cbf09bcfd8daeb95bb32d039754987c3b03c861f54498e43c0749b9bad4fc3a4551277a245ee9dbef97464a6857f5854afe8bc035ee97c7064c41b5b0c058284e0e7328b85082cbafe6d22778b032d2d318fa8726015bade5e31f09974fd244f34a9c4daaea9f9294df6aa5d8509932fbf323d6a37defa77836a6386bd0abbfd8266c1465ea387f0a6c3180c7fc070545ec4a340320766486229abcd521f4f573f53f55b4c626fd3a1b405cd7b5ee0a9ca2d1e75de6bc2f1e8bd0db58c8d3a3c1c842f1098b4a3127e78b18dfc83553dfe98afe5dac03a29c0ec783630a7641c285c0c86d31a19fc435bdc0a7ad779c9d2870281fcbe74df3f54eb02e266638a1d274af1e8fd186e655ed1062c3713873ec1785a442c33314a05c4d1f6e8e78b194652b097261ada85fc9752a2249ca3bb65f6c9dafc4823bc99ff6404ec0253d14d68d4607415bea18a2cb05ce941d5a435ac9f42db9c3ace1fb0dbd4a9e7d8bca44e80d4b956ff1bd216b402264992bd160bd019c7c1261b888a69edc060065e898e6f2142094d3308f100a37d69d40cdca86105aa52ffec6cab4357779f12e0ae890fcb2ff25104732c92e51847075736a29708c87b119a13431ca20b1b37906737d37fd63889362f89c0657d009a63a45c7596685a86f2d46fd1c0106b88e944b0a7d50fcd11f2e6ba0ef89ba9a429335bc482c405db79dc333e3b794c922b7177714c49128b1f103550ce613bbd46c8294fc539dc9c1a00cc9b042ea03074109cca948e31fedbc39436d46c7f252448786f1119abb62de3e07e2f34a047364034808d3470510328ccfc4e346ef725e7a0b12912da015abf21522384a81092dfab3373c7945ab4e06c4e20b34a39b762fd0b2fc06690d68e93a0a1595acee0ecd2b8f0e071c8e15a3ed3e46d5604645b9352ea7433d6f722b294a42779d947336ad590d0b872d902327d76fa1c88139c6752c5ab8541e3e80eebe2ed7c1f469c5e28f9624a72a393af3ce10c3b59b7d659115c6d9da13c1031350cdd08b2c5493b21023e35edc5d0952f31176924b8cdbd2269235edb2c80b9db9883d6429dd0423696512eb00683a29b21cd9cb7caac9a04704ded65d98e4e543da1afdeb6b1cd3e23fdecbdaad693a0c1188eae0e24408a0451c0424bb8f4a96f0106a416aa9d100d2b6b740bc45890cc78fb927b123c52766e2c64e4b468e458e79b247963e59054eabafc02d4769eef096c65a5b280af9566203d4c2d1aa54cc6b4bcee5e9ec0d608449dca4b10bca413240402545f1b3b67dc32ca00dc85ee38aa8a70e485ebe2e6d21b04cda20b57a1d609b9e0906bd97a96c653dd449c9a6ab25c7325d61683279629b6c316ed485216505f6896b9714bbc9880f48fdd9f09034a9b53931008ca2e6695c577016b143b161bfc4fe6fc61843cb8c77758ea4372e724152d59f30678f451150629cc278774e8510f520b7245dd4b41ace0666800b29178383016b620751b62f2d69d33875a4371338b7cc5748fc0dc73e440da682461b630cba641a3f47f504fefc1420b7aeef61e40f1e77f2083c0c589048880f5b35f8e70d7deb42c662f2b23caf07a1a34c53995b0e1c466604cf1aa00b075bbc40c474d04ac3dffd9a5d72854a4e2dcf9be09860dfd2d83220cb5ad8ef4e39504148ec8361bd88b1b133da84444273a1ea24739665bff1b9be5276c3729ea4b3c244c7b7568dffcdc8b09812dbeab17921763b442cd4e59e535bf4cbf79302959224d7ef38f962a8c8a99980a4b2d0367cee26cdc6effc41376eb1fd03f80538536457fd277b19c412b32eb615094db5d66858f8ff095f09412d3d4507396e4ba25aed6c601a09dd201cd2002a85136af817fedf7064d4f05bb659fceb9b0a119c80caf84596648cc4a2fbdbf91e8e1a3bce23743804e6b1546e0588acf684070b1813fe69a3b9ac896a22670e00206828d631519c80ff73eda31c3948899bf85694fc6166a945bf3b5fc804181ddde22e7cdcb1de68200c8231b264b30f69a01c9bfd8a9f1bf514dd2a69cf6a7551b1f6ce7703ced9e1b215ff1e6b39c59b67c9828f6a3e046cdfe6ed4dc355bb8dc00aa010ceb4e9fa5d3dd790464d67efa1e8f030f9e53afc81eb9b1dcc3cc57d71d27dcea00e94abb29e9d8b55310e819c151d0df806581f2452081a25722889ff30263cd03029d7a1d61aff1a705e555aa46b2687506faa6472943ab6b5be89a060c11f972ac0566c026eea513d904cbcbacaf4b6855189b760e0ba53345dcb7976a8410e0023080e8606e3e3ee3f00350b42a5268bab477cd3d78ffcd8c96d042684cc27144fb72cec10a2b99b02f23ad22ac9298e7f38d59668a81b4723ba38286b95e2b62a4d58ff9c9d3a5871fab5ea95793cd7851eb48bc22ad8cac42c5132b10825f815a9ab36e8eb402725132538685ac9d168ade992cf3f2fc91c529aad0ecd56bc324235ee02de2bec3bb6648ab2f3363a2ea377c1a281a079c7ebe214b8f2ca4d55c59d9aaeddff53cb8eb2f732e8a0cfefd9c5d7d39b108fd90ba1f998715baf10e2ec7f2f7aa3a99b9edae8667dd4c451d49215eca6dd039f8146af42994cfaede20229c6c456fccae1003b0881421ccbf56995d8dfbaa724961c3b03edf0b4189ff03a43bb6a302e96d02f4e1cddd3e274deca100d79b5dc160a4eb14a31f7b21a97491c9e185bbd0e3eafd8d8e4bab8e62835d1813ffcdae72405140a6e42f76f9a4efddf7ecaafb6a9eef62b7f2733fec16f1bfa809482a857f760539ac315cf0e54f387c46035066dbc13088e9ca871b51842785195726aacdae4ebba5cf6c8294db8e4f70bb50491a6cb35ad85d27780f9444136fe297fb6148f575cf48d4ceae78acf71a18ed2b50ceae4eb97743dd7ed276bd81f34d0dc8b9f65c84d3d9c93ec2b3ab6b79389c8ed915f0413c60a1b780a17749dc8d6095c094d0d955ae2385ec65493b125702c56fdb6657249bc96c5857b8eb6391e24182bb8a912b1228f969afde10ae965dfb8233beaf42afefc0f35af5a03d50ddff32e546682ff7cd3d4d41f3de58e94b098f09168d6f701656b0807bc1a26f5224491e2c7476836c361432d8c5244b6171700bf684559ef92d3c9473051dad5fd95a0ccb8721ae4e2f64ba8e42b2ad15e3b9c65f9cf246d39811856ea03d5c795abf21bcecc549c4134417fef33fd24476a3060c961c68d07577bac97d5418f22957308c35138cc17f1507697a7f05122d32738a1fb7a9ee9cb3df267b00426df8b4a1a7c826fb1a057ab3aa5d3488b96d1123519e5ccbee7893b5e2fa5c59c3d253b4d1d84a71dbf871db91bb32f2013c0821254256c9cf8c2bc91aa6f867313bba9550c54219d74e7d787c54b86716872defe72385fa249d6a0aea208ec031e4cd4657bd13e528aea42bd23d561ea83557d2184285c8ca309aee421fc5dc364fdf0c64e240eea54ff6d8f16c97f8ef25ccd8830746cf8f9d7c94d4977456d6286207eda4b315d02521ad29f7532f344143f54681ee292eb3506cce03c8af1fa5f56f324f9974a0eb723d9059ea65f6e1b620cca1092be07cc901f8a2a9993b8b85e7f67a002e054d30b48247036758af3fbd249e86ccae3a9966bdec9fd2c10527a527f1b4973f8431ceaa1673d34371138c9d839fda8f0e92dafe2f367c673428f8b8986619bbd861ffb4778718c0c117be74dd0fba64c6649a992e727b072bc0356a6ad2e10e480c5ab2f1d9597302397e6a66dbebf6afbbafa09904b587d8471bcead65c9701d947fc7e67eab4b44b35840693107295d58e9db63c18174cb37b58dff7c1051c65af2989c059e3f887726a5f707002ea0022b240e8fe4583bd7197cdaf1013112e60fe5f005cc07d488311fcf51a05ffb91573ada8fa826fe87aa67d3b0b0176f2ee16ace2590ce8a707108caec696660a4333233137a00dda4d33a2609431c8d3786d82b706f5b60ae1b31102aab1874855f7c9697b08766f1557677e4d4413378550f081383ecab009c1cbe0f0111bd01e82371d99e3408a08b51ca81fd36ca0970628de19210f352e67e798e716a56aea3002d1aa384213630119105f02ae7d39ed40072ab6fa324d88280864c07d8becffe698f9b0ab3436ead3703a3cddef801022fe2f086e09ebdf053c96cfb03048b60616f67ecc1b36680e313dec85cec491bd30b0beec76d2405d49c1b10553b3c029b072d72673687180fc755f19fd8a9b3dd2110d4da74d43f50c3582ba31dfa797a21e8a76ba90b2a5dad84b08a84f16f399051a411007ca5fde6b5e4c9a2cec32a3f3e910878a9d3fd3383505edd41524644b423e18729956a74a0d1f7e74ab81ed14fd9f135f7924a29cdecc2d48526e856c2bdd2eddaff05f6e99ac503b02ec63d96dd5e180488350c824772ee8ca0972235877e101b5936e61748ced33d54097840e0f95b65c9bc65425db46688bcda1b03c2199881faa31f142280e1e9a3b614e48f4a98151f6ccf06ddf3e6d431452a6f5813e85e43e3a05882ba9b1a6d0d0b6a4043c18f0cf6021a3cd96666b58f85b10a3141754dbf29e86fdbf1b098b43e9023053b5e9ee47e214f58a610a65bc221c1946207b4e86e2013ff37cc762ead237222e8611c51b37864e32456265be2808ecf26998cc48cbb302555de5000cdcca724e333437d3a1b69c2980a1052e35e7b93a6bc56e3ad10ce6dcc8d77510241113a0822b060dabb0877ac15c2c0bfed9706f6aed60c178d4f6c75f3c2f3a1d4ad987c963c86e5c34885567012e11494f11b8499e976376f6905fdd3d369a63527b45a610007164dcc1cbbf0a4ac294ad1b5b2b177511f21c6688a8c0f0c69baa2a1a7d40a03e7212e24b61140125cf3dd628342240d5fe24027896214205fc39cfa3ba48b320240fd356ec7cae69561668c8cb08c1252cd30cb5e0b687ff656f3e1ad14e6bec6054d56db3d04bb7f8c4a82b0c887b79c7973b2a7ffffae67d6da9c87f4f4677fd19c81fd85be89b9d671ebde85906fa1c95b143355c4115c1333defe29ee2f21a7192370694f9528fcdcf4e51d30827a60060a6a4a53009b0afa28935f90193608f765c3b2043b121de27939eb7ab6af82845569d9f80c2768e9737e6fff52ee933d1edc2a4d24b11cc6ffcde6929851decf6c89a87fd5b89e8fd7ed3a48d205bbd38fc3b4b3f93bec126d19cda0f3084566c37e1e667709183fa0ed0832655c585b690af5738657958cc384246d7ade7197151dc7d67df4aefbc90d223e166a79d82a7877d446efcb0704598e0f85af1d17a734400fe6531bbaee1e595d8605702b8041c4359975485e028967dce99d7a2ba6352e48203a4a3ca2d43eaeb0ed2687340b933b4b79d68cd4558329ee6384062b3aca68e6b0ba347b48c04e9ac4e736566194b5a9732d1e7c3592c71823a3057417d591386dec9c421b17fa453a100de038291a8d3be614043c87160b0205258ec28490c6761479b6ab7dbda7ff6ac004d94db2be4e57c558e07cee33d37eb2c91da9ccb1aa62ed9b9560629dbc15285e3d9b16cb531030a121da79769d0bbee08e03b79a129fe1fae9876fb1019594c45c74c7d0c7f6c381cb96f8190971f05cff91dd4b8d6895bb6181be1fb31a11e75f803d2f67e386d6c17774f90d59430fc09700e7db857a750e82ca6c3ae8b90990e27574670ea222659faef81b088d376044f3604f32df53fc0a46ee842ea3b95012c21ee62225a05f985ea34858d4192fb1503f5086c416aef3360511748eb0d96980cc71701d0d807d3d8126cf670c82628f62328bd97cfd2af1b58aa91811c4522b3d1cd1a5a940070be3e1f758dbb08ce86dc4dc88c08cf3e44dcae1b2d1e48e8225a4d35f545257f7ed3a6da1fe8103ad84904e796a795861af057a2275406d6fa827874bee0b12f328b5d6aa762102c2f78cf0618452744bf439098f02a333aa573a37f8879accc1eab0b3347240af0c07ae9a03a6dde4bb0e3c7e7761b83f2bd2bebd3d3b93aa261bb0a7a9ec58de6d788b0d534d71e1b36b9f77ab8415273a184921097542e613caf4b305e0c43ad63015e1fb1c1f5cf8efbf2d20e1b154ddb86fbc18c17153c236602ff5dee6971733f0418cffc2ebbb50115f199a161383fcd91014b4e461be0da1f6f88b411ac1cbea5748944a9e30db0db3a4c6fc5fa4026f61b72cde50cd2fe04ac66322b451e6daf9de17f33a2553a0a0186899af1467a605269ff7984ccffc8f6bccaa27575f8061be0fb3b3805a0b236b04ac4eeb05a30d896e869164744f3cd7b8926aa8b2cddb3c9a93ee4ff090e1ec85be564796e245eeea191e651ca49e79611ef3d8bb0f601330316ff4b5ad7d5e648ba3a0289b229e17295362e1bad0cc26a29527c7dcd66b6c5a917813d30c854f15e54376fe0ca73fd416ff1ce627bbf189782525bd049f1b74e6e4805fe0c3afdcfd0da82d7a54a85ed996c271bcab2508714704f2e2e1411dac6e4e1cc1ca2ed07b8be5bed41d371a38a2282d68cf1e3e3749c82a2172ac1de5e29d725828271df9d96f0113faab2f813e59a1ac0e0a98d02f03c607d50ab5b1da6ffa9251a0c46a56886f9faac4ecb86a9c62fe259cd6ca5c1be0d1c13e114634063913a56084bc883c41d0e3d3ccded8ba89c27d485607dacc99470bd39ff5e270094d2494493ae88bc5a4dfec9ca629324c47554a50423e1cba2ede1fc3b517a39c21d597f03693cedbaadd4eccf0f2bc301d430ba852061ebdbb4548084b5af225d0dd45d2b5be775bbce34b20160fa6ad2e1222bd82ac9b6dbe24953d91d41e8dee9e68d36cafe36ed0c283926f4f057e055ba3f7d56da4f68e15b8ce95be3687ce7bf416201144827fae4699618aa0b9794a1ade8b7eda6a90bc8a813a898335f622650ae2a60b7729396eb2d209fdac8a8aa6789bea251b79bf0de8953368d8dc250d2e40ffae0966479543048bb77bec94aaea3e2a3665a8a7821d795ae147904f651e13296b97d33796240f7bf0e8a3ed86fda790fa81a5f33f44ad5fb965a89a99ea630a28211189a473cf34c840f5fe3df83a8d807ab44e2f04a57340b02eda084e0ebd8814649df95afb91ada0551486a9f79d6caa93ad6604309c9ea61dbeecd95c3910de1651a10a1ad40cf7e75486256c29c5d5d73fb8540a56a872fa9db1c124d0ce86231f3634fc598bbbcd252aeba93cfc9dbe2de708bcf7ba0283ae345fa2ecdad141455c1133d1ac0236c53f717d2078d439d632e314113535a8f407858d4c092c136141f647e8ca9ec573b238580b90650ba64159e5c22664f02ba403694bb8f07cf921bb50b03670934a8aab2876c32347f477ba7f4102fa5e7cbff364c965e2891893ce3856ed75bff17ee90f406b6e3fdbe8aa2822005ab42c1a2b1bf87f2446c03d5554e8511dd680052065aa5c24103b0267be0ac4119bb2d1dd9240df93f817f241452cf5fcdbb06a3a922cc3cc14e9b9585e7170e05a0856b1b9e3bc83fcef7fbfbf836eab4fccbfab6784e9069a4be7894ece5d2a936ffa4d64aa0ba5ac3c2ac97a3210e545fb343e74d6963741c8806ce905f1884e7e615d8242d2112726491788084bad995ffd54d5d38ab7360a26e98647ae77db9722a46a4e33b21ab947b36cc495b13538868ee921d6fc82a491e252447a62939bb01407196c53575f2ae4b00bab9e98a891e54d1c00fb837c9676d6062da36c0794d880e3c42554f305bfedf2dcba7fcbd2edb4659cdbb3dc373559ee0deaea633f853286156ba522aa4996485eb124018c474d0be47344683dbc958dfdc00728504de69e100b8551f6b97510974c21bb8b9526439182d346e9406c1078e8bb7daaae88bb86d6ffdb5fb0ad280b849f7125099e2ff841d0a97873512c90e9e5a5ce64d00bc4a2fad3743c318674a0f6639af333f0e77d62c26cd0bd7545621e7a6bba88a1f1cccb2fccc32c48edec1fb7aa9e75d5d21a5b85420e2072d66f0338ca6549523490d2e24faba2c5d07c55c885cbe9a55343d41d575be006db1b2ae891fac710467089e70b1184489ea0d95fb66933a39efe73279d1946f4bcd046c82ef038db8e8cd91216e602aa300d1ddaf8f4815a93a0bdd03878bdf7015a1fa26d8124a504c6519b4a23072070cd923339bb9a56a9815b64bd42a9357e169b3e7099ea8ec97de8ccfe82b160a72472840da43681771f60dd2b098982cba3f4fa0e55d3e8652fa2580ad7a20ab27ef2399fc82dffd15524701e17c0a5f50cbaed0159e408bde79b73e4274d2844f50e0e37303bc1a703fddf08b1bdacbf69b82f264264ce141d038a26f2d785ace313dcdc0a6fa7581260dc8166bae0e967ee34b302eb63aca3f8ffe6457aee365059064ab60e0a377344a872269726b197e5fdb4362204c80bdf73f0a0edc7f64b785717a199a3e1d8c90827314369cd03e5f17b2d8acb52a55aa6a0b04a2196355932a63cb34aab1df8dc30f1deaa1830bc38540bd10f8127e6f2c6894bb886de93b959be7818860311229f0134586278f5acabbd84131697ae18d4e091408f3ba0060bfff4fbf0da178f357dd1609b994654a3cd020f6eaa5e8f7063bbc60cc58a80c5120d58d7ae28676b3955be5d617585d495c91c46118a12b9cc9f64feaf77682b0bc8064a982c7aae43d5da44af3d653f21a6f5d0f9497856553ae9bee48878be7b80f515d496f6f7ad63f68b6c1449b657c9200812591a9f24209b8018a870393a49989ba0ebc4b816c811e6d5b7df22fa4054277617407b93661b2308758d8472ada45c36138f199c187314718bceae934c5e6aa47e8c3dca13216c3b512ef31e7a4704e71cac103dd49f335703f226711e3d0bdab8cd421acaf54b3e53bbf3d754288c745f1132d2cbacb540de606a2205955ded5893effca1ec92da677ae4c9d80f3ea5a631b96422a9445d7560d33c83327d4374529f94fedaa68dc928022cb4838b684034ba8b1b84b1ec392e7e18f11e695fcde01390a6114e9af6dd1090b48a3db0a256d7016132e741e95f9df7b38366d8db803509b27cab20384769222e339c4cf35a40edd036a10ec81b5950c8bd12fda440b1aa47247ef29db62c2d486b95c5a75a5191251b6ed19f0e608fa3d2cf6da063d9809922338d7d38cfa260707b592707784aed2b488b2e64bd22a9c256b04c086f69e40c678d6f7f0048fcf2c4ba41895aaf402757fba6a0fdf673d306f86c6f724d981bfeacb08988951d94eff7363d60c24ccd75057e62b848b8ba7fe4ec05819057a9392de62c607dc1592026d716ffd3ee87b98adbd17c45189516775fee220958a0b460d5834eb5633b21298e53c0264da8d6dd4fd4e75ba5016c47d183209dd4eab153e69cb2f9bb7e62ac1da3a1659cceb53f5e02e28f845371bee77aecfe0d83c053e4f04d47dc9b0ab5bbe6ee160482f62da0ca6ac51e68e718c77f0bb647e95d160102e7b82144d175498f63f0cab5989087563887789065ca2e013f6a218b2c860431c52949156b40e223443c895f1de6e65e41d3aacbc27641c3c788b9490c11fb4732ec59c737f530914892deb1e901532d6fd78b4bd87609c7675fee598294087b2ca2458476f6ad4cf0d25d35b50318e2885dbf8ba271044ded909267a8e319fb192e1da7cf40ba67cc0822a4d5fd7b02217b77233265a4546358019fe51f12f84584cbc6bb061270a7f462271982d209c84bb8e498d462c37a5e59a2f20160fe6c50fe236724dde1d27f33be581f5109e473bc8eb5c3c78231394dc958ec05099ea2b6f29bef9d193044470b21289b8f162126f0291ea571a3501e76ff22b6696365f11ca61b2da6ee63e4a5569f0f6d2ad7008314d609934800072165172a7e2e551a9dc20deb64fff874ad1c488ca2c031b1b944f2e70d3b912db0e5b8646de79232058583ec79c43c2f2f20cd0925051d2367f86b39e4e0b2586639f38ec350c103db2a08f9356a33848378798579216947f47b9af69402e55709361b644c30cff56e4777cb0ffa00a20325206c386b63c0c850323699c8e04f3ef467308a42457a05a74bf642b4c153adf646797b1416c66d7377a4bad2bba08088c3ab6def68616c000a6c70895a5e7f62228a471a0b008eb463dd9bfd39c94941947cf2cde697c982edcf4575a450a2842b54523d3607f2529ac5eb1474f8646d3afc8cfaed09ea3774b2512086ee7fa591970e6d7bd9c6d3bab1a4a358bee82d0bc81c98d7aed6248b649b2f4b54a635a6ae4a8367d242eb60ae43dc1a0406608ec7311e8c9652aff5954bb712421e957781959124a89623654e64448d0ecf93f23ece458e9823b22872fa2b96d60c82391125f4756fd1be89d2462188d2f6ddb21b4eb8087edba0159b23026978bc0dad801c7414c70f7c88506c0539cba13e9fc7b19b513f50c14f5064ddcdc440a7a3e018481781d9bdea6d2a29ea22336232c8ac4ed1123417b85a6d680a955b4edfab9bc72158ff50728f145b88b86b377bea9d60bd70a7a46446a3148f9982f8d95e786123cee29463d2a2898297198d15b14f767dc18e66bb800ecabf39a19fb8784683cb44d82666155839de0da4be3e894d840a06ee0528b76145320c658a4a0a6da2116f9d43031642930237b519fd48539f12c8adc71874167a7ea7dd82ead011ed3b1e4223013767d4f046afc9fa8bac2945b2a559f7c83d0f298db6da6880c58d56e77d309d3201a8b9d15f3138bbb4e440546c9e9b8c55b5b9db26b9585f8c21b5bfe7b608045f032205aa0c8ef970e98599d9db2bdeb7932603157f95eea94e88e588919f460dc106407d0251d61b42c287dd2fd03075254a29c88d7cec284500550879b4c157619ebff3518ab738ac3e8f16ad39346f5bb7bd537c555cf8815772e41625982f156be3e12d6d1e0cb95a77e748f9102807b3cc18c47b587fb1949329528958ed00a6c8ba284760396594a6f3c71f75dfe639e8ecbdf3501c6fa37cb9100301767f606130daa7f35e7d6514f5a67d73a656df992773bad31d10a7577d371d48a1ac9ad0f1cb58f0b931914982529af82f4a96278a1c3ad9092302c027b43fa1a6e29fc021f9e9527c23e7e1887c878c1edda80302645b3d375d31b575481227ad6ca668efa5db65d4cc28a424f5b68631830f19362fb90294c211d4ff82fe0a6126fb50dc29a55b569ec7e80361ec2d29e9d6d6cf2cda195e2de254f314636f00ee347ceecc3c2948b8346bcc3eb0e70ccc31b1bfa322efb23177c2d10d1373491d4bd308d038625d13501030d5bb49b943306b65a9d9a3298ecc92c34090f902308d630a142210d8cda6b61198b0a360e3676512a09b7e21cc63890c139aec4839d38e36c840fd0caac955d89144aa82f1c667da3ce9a8ec03cb56c97b55bae50a92b877cf53014a9d1b488633d1627249ed11ac4a1bd5e583ff1089375a1ed8d52038d6907d8df3bde6438040c2c3af802e23f9730db87d54651dbe4a3306391c02c767f9866e942960705761a60b1043be17d56c5a0d4b5cf560dc40821019979ef1ec430a513bf42bfad255835e149abc5b066d5bf2c05c5f5f1a2d86859523597555f348c6725863f0ad0c1593c7506ca59beaff03e8045263e3108114b9a25bf0fe85c0ebc1fe78e00a72fc22fa7899c4a8e4f9e92217654e44214cd4069627d734e2bf288e50fc140fbe4d59fc018e5c287f23e784c0fc2466a1f254af95fc10e620a4ad57adea7dca47f0247414ccc20c0842d47f4cf276766095c3f296c5f9ab9ce810473e62f3901e06f82b3457a0893291480b8d2ba1d82f8c0d66a9dd0566ef13891375e108c61d62f0eacda7e4be4d3687b5032508ba6d106ac3d036db4bdd235b11c4d1e976807a52bc1174b2329ad5b61645dc7438c448616ff84707d98db3f71de9a738b4c11dee1b4230104c7dcabb851f92cec559e41db99adf87bef2f460db83fe6d7b86e076d15b37fb1539dbd9a1a24010a0cf00639badbd8fac095f58061d2bb9d3903d3fab89b9a372cdf344c3aa49d83444878a9f2ddde99d4dbe518b807bd07bc6e10a217c0cb120b35472844c50dec1f9818a420df14eca2667d88523b17c30b433f05b7c028055f4a6fac1c7151d97b89da0e5938815e1ce9152b3e7e5b25103c25f20cf9adde40b073be240d2053660f765ad452be457d17730a437618582bd65babfc3aa506ecd99101db3e1ad1f42af4e4dca531f64002e35ffe9cace68249c6e05d7b1356f33d6ccb74541de30b48e36286cea9d8ca3eb6ea862fdf8a422078a340a57044515071b52459008d8193a47b55942538cfaf8db1156d8b54f2fd2d3b71963cdc6c069502b4e7ee804256326c672d2c9399ebb5d8b66c6e5b265da2a2512a7303d96358acc761de83d1ca454352c22377d93525ddc10a2c824bc82756bf28453e1160924a7ceb386ca4e310de2225e954465a95f1321750e73ab60c18a4c15334974b304e722b48bd4b6e594b306db120fc4ab57a01ea3c0515b68160af095f21e7f47a13d226684a4976682291fe2078ebfe0003102cea234f69361bdc4c7be57da53687cc042aeb409da02838b025ebd9148bb2bd9c0ef7d6280b167f53152d42886e6b00a0b9f6c37c8d1cc1885cc15349d88047b140579f5e99e5d4d7b25a6e040d75a490d8b6141d41be945bd0f299559d17709cdacada18875c4c8113d125df776d344e03011d847664d7c9285d8e6fc81de89a4bb1447b3e81b2a73934c22e99d96dd2c188970750ec80a0561b7726891d5c3377fe5200c791d0da26955513a9421c17a08e48489147c7b0d60104040737305d906517290dae5b410188093490f6fd1ffe2e1c6fb584a9970a45c2c462892a142903c91d29fccf5ad29982a409916d110e1cbe3e5dcf6053468e5733f6f92339c28860fcf3bf454d129b32b273fa20c1585504989d2f70547f65ab6dd50bfd3528448d8e14e2f016f5f3f98614e8a686a6b4f228624188657d376a444602a8b15a318cee707c6ae9b54066a2e0a7a3d0b28f332c9684b737ec8c56f8f60a4c0d0356fb84c9957593c189c647762f8a72fbe413271eb467df759976e3248e6b1c28c930b1875c2bab7c42390f1e26a4aae682a9718d12e347b1a484cab31f1143bfd66d4d4bd9679514bbc580b972153f4dd6ff8b80d561fad83028ccfb90b74b7faa8d38aec282ba5d1c6a193813e2fac611013e58b13d839dfb7655391cdc524e0ab3563c01a2cf4fe72389b9742d66eabcd4e42584c706e6a841a78cd72bd256338a5826cb315c9a7a97767842e745039529942a008c84758aa18ad9c15a622e7dda9448c1c961bece7df51be5f85b64c145b4a1b5c39e48d133f152571c4f4d4164dc14b40432cc14e822c08845d8b609b96c9f944a9e105fcf3f4f60f027337acec38e29050414d368f7af62990d6855c9f8c1b873882781fe1308dafac1dd1637c48f0647ce9c6b13e97d1d89b7016bcb7ed9e4a4e8c9530612f9d08b1f45e5b522b7965a0ba966e400503f742142ec4f29257957c9345234bf075ed33a352a4e5b7e06ba4615fc76722dcfdb047cbc91be51b0b713f9654015dbb0fd09eed4cae2fe5aa922f5c7229263259b2526c619c730848b967147438f5400f50ea0a6f89862097db116f854592119dd9da58f92a9c7ec2d1c71eeddda2fa048c0e21f9de0e08dc6fa67b568682477500004b01c0ede47b3f09d0828f59983531fa79b897b084b5b887a0910314ca7c37a159029b16aaaef0380767e1e94da56cc0ce067752aaed07bcb03880825cff9081ca9fd04fca68b57e304a86d464c7c016058db60fb316e67a2e6f524ef0a09d61f32ded420528ef54c89226a808bbc154cbe82719491b5f69ffd7632e7aa75844fab47fb04587b742f958eec33ddf2b0cde4345d0ae6fda9174ef98804e49e5cb23083a2fc5061e2133ab55d75719830e8b211fd46cfdaaf7da28834bda5f70d1a2f21f31eb837c8bce1325be5ba10b5b218b0b19f10eb4ab4df1533bceeff80ab85d80f2792f88cb59406f19b019b505582b87a94699a74a888d254eb748b75f1958423ff1428e19bb24d64645af5c4295e498e375b15ec0bc4d36865c0a2bfd78f78b1751968d8166303edf66e1b3562e9a833e1c60d1229b376d702ba06b8cea1b59841161af7e6fe99e1739d806ea0ff82dd408f27a52281fbe2384413cc81a930e124f7a4c96079a1a376ba3a331039c0ff6f53792ffdf40db36a96aefa31fffb46073973c3ef1ef7ec3a7dfd9aa0f22a1f6641051e7d4372a720007d26336c079e2b79be3e2d22161128b04887da36fc38b5940948d00e02ceb9ba22be7a324b16111f5ee04d64b9db8f8cde77232fdc457883a3a989a5348055a94a360976cc9297a9d28268a8a32e7482a9c3feae59a3227f9849cc1c34561b0c722cd08bcb5304ec95e9989906009e1ecab691bb8dcfb4616a864a33f606251bd7c2c5806bd7d25b82dffb5054b7f82542f5ae0f8727f07fb3a39bf4a091699ea448c00ffe1bc72bd8bd4cbe61af1cc48327ed32de5fb1e952e595ba7b36541062fa10b40d91f32dac9ac9f448b131b7446d3e57a20a31edc06ed6b045804640b99ed9a49967a48efde7db2996280c57e22c567aa0394b6f91874a6113e568089fc234a644f09612c543262fab3c305376710b98fc3a63e895c52198fcc42602dad190d124562558ed8a0bc6487f1dc21c357fbcbaa4a82c9790d31ca7b86ece0b9470492302dd8472139d791ddd6263e8ad8ae509a7821f2ccc5c81ae3ab15d5e1c4d18e1d878845e0ac001b5621f97e72215b6ac206a6690778673f5239835ba4c170e3022251a98059128c9ce05473120e058763161742d417148c994a427cf96f98737f4e140abbbb5de12f0e808ee1e326dad7109b87a0cc1d5fb85b9882c2bdba5cef6a9c74df718e72a3354408621b37e4ac64a51bfcce7b097671886f7c774220af99d450c461dcd3e1304c0768b41f44d322c70942cc34605d9a70e2f18a7b2a28a0a56b37007141d6b81d498c15287718860dde1f37b8a270dfe9ad18d0a2d34c7c129b86e35d53b008e182d61dd3cd7b4b8d57c5b8a1f9ab7f895fb590eee3927aaed4a8237889c59055d22b4d8ae6f60d79ee27433488ef08b3fc3344314c5b6f011e888a6c6205c15c354e45fc541a1660f2a717d2e423ff867e9f4f2156f8121952bbfa488d0e5d22c1c5c505a335d6778f79ea09a7d9f2f78a0acb6b5c882b7b2dfc3419ac2f78852e7407924b58f17e14593629e24bb1fab376292ea849af1d2e7a6be63783747dd50b442503ba73fe775a409819251d6dfdf24b14a1fbec5b2464610ab1f8f321ecb821912d0d15a9755f5feb5e2c4d63006694dbeb2ae6f111b6cfb489bd40d3f7c4e925e3b115d0ec2020dca937da7ab2c0d78cddb0adb5b61b218434b2f7de7bcb2d036807c7074407cebdbb5889a7e212410421c32449ce1288e3e2d42bcac58b7f2fee827a510446fd454745ec5dbe7779797ef2ee50b98fd14727cd6e91878f58c82143a4c4e25d3e8c445654798d8e218d6e72529d6df44805ab21dbb08a61f5c2aa85d50aab20ac52589d5895588d4f20565f1be22c0fac458675a9da6861350a3a0d9e798787e199786a359f62fa91bf05103d1185fcddc1c2577f95d9456697074b6b4fe5cae1c26a1484fd001aa168b08c83651996fa9dc195c962cbaa57faf05878b0586aab1ab2ed865d400fd9aa6253305bd5cbc965ab6a25b16c552b27a4b25505f9806c55a91cca5675769169ab2ab190b6aaf14955a192fada1076719607bb807ea37f6017d06575b6aa6d59d8056435da7a6810d2a75662ad5c389c0b52038dc0233c430f0f99e0992cc02a38c66a348d240b0b5d8b61c815f2d669b880b02ead2ba5ec96d44ad3daa3adf4655d5132e1e1ab586f2b7135ae051eb1b08893223a7dca82764d5f7405d18ff4d2d18fef653938af083c831d4e9d1e218b75cfdac7da369e95aeb049933e3decc231619127e380661b4a037edb8910bfdd840141400764b0c83d35e017c2646200a54164dc2db0611168a409baf21a7b5811ef3d88b0d1ca82ca837e61914a5a6f651e16a92bf3f7b432ab0c9e6c931eedc7cec70bc7fb5543e11f4ea3c9e918903ceca1071196d9857409317a598fbe04a22ffb52d61e21fb229ebdada74ff06600088cd90a9ccd8f5d267c2369530cea600e2c3c754b5f66775a1c138f853091aa958cdc1c767fd899c93f2bfb1202f9a1390045c52c5575cc594b825f6becbab3fd32aefa7163d8a96bd1a1b78a299de90dd7027986141a4265747e55d566e7631708312450f72a9628c459024ba51289f411e923d247f22aa5bfd25fe9efa56341a0b164559ea4bb5e522a65a58f3ac9e31906a2542a65a4763aed76da3d69c7d3cee71a5956c561fdddcd6982a7f92a89f48a5aa12bc753d227930e4e77b70efd19552eacf6c3a463440ec79dee1cdd71a627ee3ceee4e38287427eb1bac539e76a3e843b15233a92b1ada6f3d390c0323c137ae92aa473c7582a3fa4a6436a3aa45f11492744226597070be93d4296949d2fba849027951e4bbfd13be27390b21d21d24b2152b6427a8924aa6d489f46a3d168d48858956d8dae71167e88b3199df4eb58602f21481f596e48c71c3210a4ec7d9a1aa69374924e42445a7887d331a5dfd092290613151cee2695572ff806b42cab8251493b73386b017669446cd5d335767f58973922ec02ffbaa68f60991687eef0f22d6ae31695cf984afec50b955f91ca2f157baea2a2f21e21aba2720e71140b4fe145432cfc11425e2533a25d3a3ae635da411a49e5c21a5523a62545995262602be169284b649ac9108da67700dfa47bc054d86955b24e0205659e896e49c34f1caa63da71434c48da087c8e881b8283a653fa28d3a1b56b3a482711ed0d28c414e32ca6182a179d2f1fdc1067e38874cc285b297de48674cc4aa99158f822de09aa88ba4608ec9a9a9a1a9546f912a2c53a267dea4e02beabfcb6125688d25f4dc7a81cbe8374123c730151fa7bdd83d10e98868a7826b4d3491afea9d4527d2d2c950aed0d0a6fa2b455547e4d2abf57797543fa14df4240e16fd3a1bea3741fcd4afe29c207b56a5b91b7be448b43ab942de1e2f0a46a01768177750b5ab0f0a219f414729135222db29b69842231b970ddd805c4b00cfbb3d89555805de0ad665b0ecf80321fa82c367bf7236a03bca06a6fc69b6f3e799ae103889da7ea8d80853fd996e1e3d976aa42ca1af1b2fb2ccfe818d70e73839d36dd6fbbd91cb7ee0dff20b41a74ee0d8410e0585a719f9c655958117e61ac3b4c678efbd41dc27935d8d7cf62797f17c2c234955fde6f43e28610d896dd1dbecdd91eb7d98e4ff1ec6424b7c4bff8175fec57103e08f9c125200c59f7de0fbefe81e9923140cb5034d18425381775323eb3f415fd2950347105144d64018a26a6e08b59b83979e74e1d135f396bfecdbe9c7f67f82e0500b190016c2f1fb8b750b1dc478156dc52a071475fbec35fd7a1838e8e5e4d67a36bcbca6e03d5986577fe0292c4f2e543cba2a2aaf7785466c40b4bbdc77b0676ccbbea55eff1d5fc7c35b31e94e886bbd1a35a9d079024a11a0b33f7ca550f5510befa6d167c751884cf90450fa47f2009d90312407a2065eed5e7196c8c3ddacdc1b6877c97ab3ebc832cd0e7790049625d9c2e33e285c57edd7491f449bd3a478a590f2c5b4209d24ba552a9542a954a2412894422910e821a3d90fe839451d7d24aa552a9542a1d04357a2865264c08b41d74b6576bad31cfb8a05ba00b2489b53ea75577f4577450d639d1104abd6561ef8c3d061df331bb5436b325486f5236edc380b4f1988d99eb6c4506b1a263da771ed2c6cc08d7462dfa40459d8c73ce4561f9554a299975b8dcc4f2e5ab2abb44c818638c31468a92524a29a5e4c7dc526597087ba91f104228a594524af9cedc7235e09c737de6168a2ae1a207249c73ce39e7babbe37fc00c893e7cefbd1d76b81cb0973a880940e9708158be807019b30ed44140340bb2202a560ec423f1c385085860c2892ba490c1931ee00f204b4ce10132dcc0053638a2093d38e7dc03ed8e88cd6b388d499f969c805bde6d786112d1364426d13c3fef2fc890f757cdea84f4e9edd8fbb7c33352f00ce8cfbd2b50838c68b0abf76cc67b92883e4ddaa07310ba076b541a004d42a6184bcdc140a063a84f397300b131e68887547c4e07661e988bc051a0a73ea9fafaf42e84f5d2b09086eb2659de1f96ca669fe48fbda7df794b563ece492945c15839df1795319dd43cf31c21db9b8b8f51b68cf2d2ed80f75143e7df21cf50b740a7a88c6d5f42c847f918a511adfd3927159cbf2ebe5decfec952772bfd172bac3bd88924962d74a28865cbb66a6697d7a7f7fb605d79ee729f80ccd65570adf5bbfb3bdb53a331a0d77219906ecd0811481e704355a196bd6e2d49c52c57624bd00bc4ba1a7681af5a64cb3498393f06995108110b1f8f601a7873133f60e1630d3403c32c2c3cc4028e8161192c3c9c02c1c0500c161e4a815e60f8050b0f7f2017185e61e16114a805865bb0f0d007628161162c3cec81576078c803a9c0d00a161e4281516078f8043e81e114161e3a8152303cdc8151304d74c22f1032c1c2c32610094c139ff00b3c54027c826922147e818750587898038bc03491875fe0a1112c3c35c134b1a78708161e32e11919878741609ae8c32ff07008161e2ee1991c0e0f7dc034310abfc043205878a8846770383cdc01d3c41f7e81873db0f03009cfb01c1ee28069a214863ab034710abf20e1991b0ee10d2c3ca401d3442cf80566874b587838031f7ee1993efc84812f98af900bd5d34a6db8c806510da7a1061a564eb3f2db96e6cc316e23c66f5b1b672e4001ce6c00039cf9000738f38d1b67b6f6cc3df4706604202001674e008e33e3f0e1cc3e9c39478e1f74280088059cf98733eb38b302ce0cc49917f08a87cf6a3dd679acc68f2a76953a7aa974aaa6cba8a7e750651c879ac3592a0ebfa1b23cab37bc6bf6d7fe02ea753e584c91f213c5a78707ca13273b4d747270982c519204c99168e4a69970dc8d85d445c1a0a0cdba5f58243e1c98037d2cc494407d2295f9ccece1e03c1c1b1b1b1b1f1f379f099cf3e116e8b6c032efe784020bdf084cef03f4e70b5c03c43bb2c80af5a258789c392928bbd46465d7f4cb8c07f4c2223314422e587888d333b0c2c600c2f0394ffbec30a14a2644f27ee48f349928953ffd70fae1e074765d120b8fb3800a445540d5517fa839aa0f15474d40bd118a854740eda1da7aa31ea01aa0de9873230e4dbd71c98d4a62921b91c423371ab9f066da17cfaa0be29260177896ea8454974395519d0dbbc09faabba9453400d4eb90b0f001a8d72961e167d4eb4870dd092cbc00ea7529b0f02f15a65ef7020baf43bd2e06167e00f53a1a587802d4eb98b0f034ea7538b0f03bd4eb7660e163ea753eb82e081636715d11ae7be23a245c17c575525cf70417050ba960e16780d8fa67eb2b028b985c91d7695d4fa37938ed05de518169a211235680c233a428304d3c72640a16de3de19916871109125849c13431491227ecf00c1505d344254a98d084674048609ab86489127478e63dc134910913287278868722304dc4c131020ecf584d304dccc92102139e9941609aa8a333040bef96f08c0f982636692ff04d8060e19d92b8d35ee00e1ce18069a2132698263ea101d3442831609ac8d35e20cfa81ce1999291223c63ba131d405902debd8069620f0b9826fab4179802a68951dacb099826feb41778c3332b316ab80def713088b2821f14b80fc0d3c429ed0522c134118bf60279a61ede1dc134ce074e71237021b0f0550d9586db506b38a9c2788b4a7a555bfcd58653b53aa8523c3ccb6eb8818505071c72c841868cd3a9a505000008400066cc70711180005e5e60607418000168ecb0030d5fa9316eaa2ba5eaa2eb8b8faacab13a7aacd86bedcf791eaa7559eb611179289fc4c22559f6708cdc708391232c2c4790e08003922439e49044890c194a969c4e4b98b4b430c101000070720210801c9d1933749ab8b834d9118000769cbcbc3c3e8139cc6f47283af00ce0f0b187003e34a2ec701da00c80c712a08786cf0e512c7cfc89912233a5060f313f32526afcb6e5e12f78a8175af91a55a6decbcac7d41dea55b1f2342a01eaa5c1ca0fa0de6ae575a817072b0f535fea75b1f202a857072bef52ef0e567e46bd3c58f900d45b002b0f00f9967af9092b7faa979160e565d4cb5158f91cea6529ac3c0ef5b2d4cb51b0f237d4cb54b0f259bd7c052bcfecc22ef2b54e76917fb5d845de864ad945be865a6217791aaa895de463d418ec22bf52cf2ef2a6cac22ef22eea895de44b7506bbc8ab541876911f551aec228fd51aec221fab0d76919ff546027e601779505d00bbc853b501ec225f5508b08b7c8b1a017691f230ea10ecc252764b6c09ea6c055232134127d38b3973da08a6d817cb4f8c2088ad1eace493edb5295c921722d9604e9f3a04a757d30ba61a0fcf6855b04ceb01b7c0df70c3ca0a89646fe3a9ec6d3c32aea65be0f9e1f4a9e7e19ca21c53028d53ec94c6033327e40e49c78cae021d110b6b9c8ca3d464c27942880d37735bd1f1e45d8dc3a9a12e89a9068eab71f1eb9ab828289c5893440d6ce20363c02df0534e3f2f52e4c2224cec8006a1088745a0117681ce27090d2c3c94f22826089b4cf1c49b30f980e2c0c217611798042a7f69d88a1f804448124f8cc0c7b2587e620439b69188408ae53e8fde284862178e87f3725ccd9087d331415c123ca304cfc4c3b7153414b4218d2662d174d0966830b0100bb6525aa711840b1445b97aa7751a68be98ab0f6763f69c682feff5897daa8a6388d818e9aad42cddb8be87844f167eb8d0852e74810b51baaafa466c7c2462d97290ca3958575a6b948f67adbb0b4775c9fb78f639073a7ccefa8b575c01e2c4a066445b719782a7dae3e174f7d45e96cdb01a94a2063f575cf1738508825851052baa608515561cb1c28a23561ca1820a9e6ee75c73ddddd2ba774f799b939e9e9e9e9e9e9e9e9e9e9e1e2aa8a0a28a2aaaa8a28a2aaaa8a28a2aaaa8a20a2aa8a0820a2a3a5ab355d7459dc66ed535ad00b2a645e9c4e69c735ea77e2f4a5ffd5d3a2e9a816e511465d5e6fab262b7ea9a569873ce392dea947bbbbe2c8813dfba63530e6431885aa4d7c2a22a7cacef4dda8a9a73ce69351a6b529635e79c95b32ceb137bd3cf4651a7d19a93a26676ad4fcac5565dd805026196656193beba627561b34d8a5d55a494524a29a594524a29a5d79c97853deca1ea9a13f439419f156856216cce5fd36a3416139665619665591666599768341251b34adbaaaba335e78538944551144551d49c4c4c6bce39ad392dcbb2e6b4a837a5c5ca0aa0392b100804b228752b76abae698589519f18e8028140208b8240d4af39e79c73ce39e79c73cec30bc7acd4faa4a85fd15a154747ca9d3aea563301aaa85fafaab6de9e740ccd56e62dd1e8f2216c24b20e9af31735ad69c1c9763a394d1d56e0b1a465be14d00f04d69bf566bdc5574ba0dca77859f01c05bdb771a5adb46cb6f65fd99d9352533dcd536cb1ef98ce568268b7dee7b39c78866db4b2aa558daad9eb3ed6c49d5922142aee98959ef1dedf7befbde79c73cfbdf7f79e7befbdf7de7b4f05556b4b07b4fb8d06afce705c855a1696ebfd71848eaeb1fd1bdd56deeb0e1dfccc881ed2f65b16968f50558d32bf22ef068b294f9c2849e2863821517c74728c7491aec102ca93254a1a9136e487c70f2c39a08ddf102a66b9588deddfd88a73a030f675eb81f6c11b22f64e59637bfa39a1d722d2a0d8fb88b4465fe3683f4e867be8371e77e7e911b16c5ae6fab188748c2362fbd78f73b05b6b8f9d9b7ce277f7e47b32ada7f1bcec350c49d528bf43570e28431edb26279373a6558a717a3a8e468d773a028bd0968136d382b1d0c6c93c1dd7d29fd3e6e9e8e84c9962f51fce8c29853e2c2ceb04f111f27e8858fe8bd2324fa75bfa4d7153a6409b973575cd395924016d24b48149e011274f26e5e449c87a3c3af0caf1eb8a9815756c7b6c0e9b82de69ab6a64353aba74b458983ebd26240b736be84416538ca7a30476e95ff976baa51f12f8a51d06057aa9255998f572ecf4a95dd2b6ae3d9cebf78e1d0d84d25efab73dfb78e5806259e3e6b06703a1341ae8a4bdf4955d935b624365506c1f2e71326f0a74d268e013538b4f875dea6b32053e990765d7e4b29e4f2c06051adbde70afb29d3a331ae0c38649e30972a449ff1059d276c648a5c227f7a7e3641eb7b8778ce6f7c4b6655d9fba721cdab4b8a20b2bbe9a514c06958318e4a161fe401b7bdf5382c7b213969f50e2c656d81368cb9c1327f4b69ef6ec9dd7b239a06d590381c3712d6d39277d87e31ccc706c43f7a45bfaed9cd87e3b277deab7f913868a599c40af659d4855b33029e8e51dec0d70a0df936586579181712d8ef4ecf2a861a71528b3ca21730ebee4cb4b78c97dcab8545738f4ea358c732cca2ea5596d58b3b0f78543dab0d86575170e1a7d925caf05b91d6cb0625aa07c87bd28163b59ecd57bed713ffe0f2bfbd4a7e633bbc8cbec02714e5e662758a9f3732b7c3ee814ff6425db67c494d90c7829dd3177dd68f815f9b822337e116d39ab45b4edf1a3c65a7cab16d17c7076592ccb2c1e4e6ae3e9fb8da62460e59d61f9c2586eaf1bbfc78ed4aa1740c124a789657e10558ded8663bbabb37f96624fa87dcc75f6a99d19f2c0b976d1a3f6558d56d6cbe9d373e7c610434271e6ccaee93921f3d225617a670f07c7470b765e41b8631db3f2ee61772c839d5993659a875b9e0f4fe3194277b4dfdee679387d6a991342af56a41d4e9f9ebb29c28768f4d680e88015bdd5dba00635a81501ba3b55a9ff42575d140aefdcb3a12e21aa85ff7161bab72353c83ae938e6dd65cf865ddecdcf2342fa35b9168f7495ece1c031f04cff8584f8340f6db4d146db4bf7876dea7aa95e1b2ccd8a689664f3dc47a0b7d16874d733aa2e8afb6894b99eb7c30e1be570511e95b99e3ebd28cee70b54e47cfaf42efa8d6e5594b9287dea06b2780a554344b73c18d077c180b66d7faf18b4c48bbb176f9582428f61a7eaa558e674faf4a64e939de7a45b769cce4dd53c415c122f329ee6691e1eabd51d7d1f4ee0938ed941ddf1b82bf00c46d54b8876d7ee5cbb7bbb50d6a4635ab602e18d7b01cb30bb1c1baebbe19bac887693fd3de998eb9cd8d731fc4409de8362df3128f49dedbbeec7bee77eb029d028d4632e1f27c405a19376cfa5a3c516f19a933eb148e9d37b3becf276b8f7e0dd11c704cf808e1dcb6e0351edeea74fef52aa9b22057a1d11f7b36363dfddefb3b7799e94ebed026e799fc1bc01ed817d43b0ddf384f03c2955c87a382f87ba700432ec5adaef0b2723ef64a804f4fe2c2d63721953187b27c3ccaff49e0eb63341557db20f3e9a6d8e9aa0f3adb71e57103333e29d1971b9cc87f6b872505da1a68ed84f1c418974d587f81602ea635ebf32204ed6fbe4c35cb97ed51e2d88f62e5d06443cafcccb537565ca3823636e275098a5e2aa59d5e4ea3c34a083654caea57a75669314a728d8ea57b0d57956bf2cc5564d1e6163398ae5276a90d8aa5d33bbde3c0de85a4386f3cfceecfea8aab314959ea8b1b1d7868e8d8eb9d4563109e8987ef51f9ca9bdb2662946a5032a3fdf33bbb3814efd87ea0ba8aa5662962a46894c849371e1645abc72515bd4cb8968d790fe24e9b2b6bdee247659dbb19a43bec93728df47c497629fc0c666818ddc30ae254e8a6591bae42b276337169b699518cef73679862dd10b7195b22bbf435eca17a50d999d137946a4ae0965778eb24b4bd9a559cde59238d5581405632f0f162ba910d75b6644b3f298ab431e6f81965194101a0fe3641a4eb7c4df64a2b12de9537c48090af3f8db96c8a83cbe931072132966caa14c6c6cfca561659a8d6b89315ea536c0b5c463f5c91a7c727792c426a7481379d51a342a102834027a5f7f80c96d4b96d4d8178538096d7cc70b87cc60fae432097083cf35774d1be918173a7383e953cb24d0a7382dd1f9890f34b1b76bda12284c7e70723a264622661c3d7e545a42e5a15a44b35856813ec5b721443899e9aaf8219c8c4a26e325b0b3e38084ba869c2996fa6d113b29aab9f92bb2ed4706e2b080ab5ca3a8374ab6780bf08c9066730196a9e15ae6e76d43ecbc8d886d37385e98f3b71d117b4e09f469d6a831a7a9468e5b4a52af9845977d2cc033cecef398977209eba59eff0966ce1976be15895334d7429702d8ca26db6b8dad39e773b09d076265bdb7f20e61db67956fe81e7d4077e1684e069099df5f9fdc09de8db6dc7bb06d5b0f46ac64b51e05ec7bbcd53eb782aab2ac3eb5e6606ab40c113525538c770cd5ee60b51c94a0f7418f5cabca7de28b81589ef0adde7091ad3e39f79c0fa49ba120f43eeba6059f6b52314bc734989229c6594e332a1cddaf7a8cf157776bddad35b345fbcd899007a8e38e2c4f8a9007e865b1b0b9d768844ddfcbf15a7357a03e4fc11b1daaa10f4208ca404c9d9ab223dc09e560cb77ae39da978e78f90ac67ccbf72b2a6e991702017db0faa159ebb986969bd7e79cbf1e0fc4c2eaeaf5c1a08a876541590ba1bd482516c20b87ccac1012a63703126061e7e527a53033d0fba61533a8437ece9ef2b525f09954b57307626385f5b6215e1f42fb8660831e955b6f62fb366eecca100babd2abe6b16133b2babb5d39e8a5751b362db071d3d885a3c9aba22eaaa3cb7e8847da51884786785a88c742cbfa04c201eb20eb201f3d2d10e8b54f590444ca76cc3bd1e56fb48d16341ad09b659d2f2144d9b5eab57163db2d2b6b0759cdb22ccbb22cd72eadf996ad38d315c22ccb7a6b10c8c68d8d1bdbd89543e5ed52e916d90e25af92896ce8f501df2d694915183fd2ea3f19ca185e19a8c974ad41ab0f84033f786cd8b44b1b47eca5eea37780fec336eb6f5e1b368dc67adb28622f25af0d4afe4e1b37963acf4beb9292eda0cb4b6a4ed01bd55abb035199556dd8b497d14995744a9b47c5c6c9c0d8992a3616c2c3d87132304c94b60cbe54ea9e9ad20f44f52e95b215eca44bd3120b0fe3c7c9d01ad7024f6b60fcc0f881f163e16db4e03044364dea78e5e8ef0865b05d446b60d3cc460b4ca64be56b2c84d162365ad0685a6b190f7863439707bca9de6f972c335d0b8ca11e332fab67b1eedb3db68aafacf6b1d569f6eeb1d18246d36cc5b6aafe669531b571638ad1a716a34f108a28a8ce6af1895652f4027a20b66a97a0fb8096ca6cb4a0bdc8df7093e3ca9052ab4090c252da73ecacaeabbb7bf432d78dbdcfca56e70a74187574ac82da45305644d99d9c5d9375d99561dfab4a44fb94fee1f4e9dbf9619b5b50daa28b744477b445b64374cc894643ef6ed3f0c64e4376db8afe72ac8b91ad64f76680917566caba3b73a7b5bafd76ddfdeef31504963d27b2dbace8d90af676d0105494363cd4dd774d644341ed24123719356434f0c4c8563277d061886c567e198a4ae5a6435ca865ece70408244584899a3bbb33bf9d1d2dfec3ba479923d031a0b77e7b3a20a6ed027410ed9763413fd5172286693c83f24153ec98c1329f5f0dfbf8fcd8995e9cb9b60803650f07461dfd45e92e6a8b508575082902fc9863ae0c7b6186a0b22be33789b26ba2d9a5cd2216b5c69cad84dee2d88770326d888cdf64a2ccf3f8188f19b6fdf29891896ca80f679bc33e92578ef61da22c5e420c717fae5ae7b24bc29edd0c00b1fcd1751d5e382e1aba1b784e349a19967f194a12d90efad09d7bc887a3cf8642a735cc2f02cf8946d326c012e01979475f0ebf9b7d0062bb6b0d621dbbb0a31c83c13ae682758c05eb980ad66597c78caa511086b5d65aebb736450f3b0d61bfe1b05afdaa56f6fa3439da5b59f85cd6a36531712cdf002446bbe10c95fc03129c8ea8b4ac36b5490d99a20101000004007314000030140a850383b160249247f4300f14000e8aa85266509c89a32086614819630c000008000000000000018c4a8200e010440b8f063d76996cb7ae3a07e035d1d39d9f4a213b168675ec2b1c390676ce607a1fc8e8cb70294378f9a658cef1010e2c1fa5d41448908ca360dc573a72a6e68eb3d390bfd3e773d8ca46de51a9b194b12f525299b7d4819df475da1896bcdd963ed7f97671ecfa5f8754e662814634d975a97605b96c9895af94b92c13bb64818ca232021ca375a190543db255bad0471c50d60c54091d7813a5de6e17fc488825cead46c992e737576e89fc07411e3e528bd0b344a3fdcfcf0e52cbe1f667d7c5a1506fda5ef7cb73005843a9387f05a30cc71d1ebc6aadb21045fc1d9a2f39b70c6e3f80075dd29dc0b45b8d72bda52ae21f24273717e79c7e351c225a012c7c32ba1c211b6b1972827c58df08fc1b95801b1521ff5844ea061591cd2d97a10b0a306e81bd1429105424a89e482454db95a423f53c70c202a022c904c81cd2c15b356585a1ccd65a576bf32b2b80353e8def8dae2dec69a32c5c095b4cedaf2a56e70f062126138c9f265c46bafff9a70ed7f0202f73975d3b95a756d7b863a55f5077a84d0d6c1474e62c12f12e64d839e0553a58947473fd32d584c598017301607e09421ae511fb717420a64566b818f0f1af415f7fe17721daa0ce032fc5034933eda371eb49b9bb0a3d9d454f7503d6bbf5df91d7b97fcf0ef8fe1806a838243bab7ae73ec04551a0b5fea718c873ed3fafd35d4a8ded0526fc1688394558c96592e30d94bdc924d778dfc6afb46bfc54d8b7607dbf330368d0880371e2e6369ab767d004b1ca828c825ef4319d16bf4536485893be41992550836ff8f6470887e3501b3eb5e5993c7f8cae51673508f934a2db426355031a91757f044db5b3036dff48aa714d274bed1691446f9a5f64e810f5d38c0e567040223b87435e681b91c2c95a1e9de9acd99e16e04d3793c207f09005988636551be87e49b641242cfbad07b0a093279b33504725ad217dca0942c340e92cb8ebf4dee24571369957c0153aa5f15730eded48338cf42bf22dfee3da951ecdcac02cec13f5908e2e6c04130e8465e2ba0aa8d5199c5ac04c40cad53c57baa213df7d853cbf4e62e816ffbed812b35627879a4fd3f113ba7786b81e9eda6f0639416e2189c0cc805d078079b5e3286456c9df4f50772fdae21461512ad5fc5e2f9c427a52003ba81d4118fe350b488c7cdc5e373c6d11d3061e23f0316da3da1076d607a44b83c2c31c7a852a6db1f92c7e45318f8a2551ca2273402aee0e8cb43473d4538bb1bae603a13931f96f94ff94dcd5aa70aff9a6f05b26a97fbc3b08f695085aff69cc9c388545f3d3fb1b9c273104787630e0536dd71eb2e9b2b6d38077de3f1f18a096a0984e4ae22e4cbe30a7c6863a00f93913daeb6df8f2828b2d36013d073b0adeff16ca149eb788429a76e56b4eef7e5c4e25ee4033635ccf809aaac5271ac1f4299c9f4e4e765c8891eeadfe7c49b464c2c5df4155b0668fee688ba9cf26e0fcbaa61849c0566bdd410ab236da05c4452a4fb722ba1553a4ca801b34521ae914748705cdb880e936af5d3d11b99f199776c44a640827529c44b62aa24492b48be4185c9b25c85faf80578d1962d15024b065623e3346857edad48b7bed1f1ab9428bcb077e5148d74a4bd72403cbc3642b71b15851a92f2ea8b88163101103d1c29a9eae527268012e706c3347f07d83148db972a1621399e9b1469f883649d28bb25525ab6125def46ce747e2b7849f3794da0564f0100e4339d0c8ea09728d10513f0cad36542017a512eab5fcb2ddde14a06efb395d9475e57c3245ca1b3356239f5142b74e8e548d24264879404cefd08234fbc90e56fa54540b622f7eeb7e3f1540ad580e1dde6f56a2d785a4bb922b0a732347a7ceb5792480376f31b2ed69dc2ef1e54323cdc98849de918993ed1bae4bb4b994852ff8953edb15190474822d6b0e569322fac57ae22e6bc0477b17790272cfdb426d6632e0582e6c534da8975e63f6e447699b7f0466a7598544ff3ed8662899b25ff85fee4512b3d8581112bb8e0ed367869c14c46c2d3e704fe2f6b3527ab2889f72db8e3b45617a2af174b7f5febc2c071b2d313195deae2188f7500bea7635699bc68bcc1e2e27d7a40eb6b506a14caf2985f33314e52d5713b3e628be36908a850fee34da0ab2c55202d2367f40dfb005780662dfe4f18d5c1154524303257cccbb520f9573562a1f8c91d9da8db67e8ec72ee0e41b7d7ee4d11b399cf4f6d7671cafca10483c74297271a3af7476d4d222b351dea9656d20da6fce986eb81cf4881ed8f1dfd62c2c91c32ba5940dad3676d40e282419a04c9c0e78bb89aa3ba74c1b8f0e9d0f5621fc093f4d8e2697adeba9f602847b64056db1d69a8089de1935e163d20bc7bc9c225e680e4be6a59c239993d746626d9dd3963a78362a304ac4b4645e3436c3367d2448f13427b8d423672a452dd6bf26fb4a5340f4dceefe06197c067090fedf12efc252367273e1516e7c5f98a5132ef1af5bd2cf761faf4a429d6537b4636a0774475dd21a58effa9ca6e049330bfaa332eca34039d225f0a7fa1c9807b441ac239368b58fd538d23b8cd3dd3fe1a9124bc1345e21cab7e49ec8fdb594ba0dd036da2d052fcc681f4e27661f28045d093ae2d4da90541285b012a6bf00325323218573a68003e25661d36ecfb89c6789f0d79b58be99920555be8ab3bb7fe0faccf660458c62b1f6744496cd953cda2948a475ebe192df915ee40338a13a0b30fe256bc01c2ad4762fb3b686f96c3181df93656c82c91ee266093a303365cd0f801f746c2891a1f509ea4b831ad9f3239332e4c16747b66f3a0fc4fd29c87826fd90ddfd03510fd071656444ec850134408ec525214d729f55e798ec9d9c83972cd944928a056e8dc489b4097d605bc3593afc45c083101b60efc298e128e4981481d300049a9255a037008730289c03e99b7604ace629de06752f2e3ecb8e52a97a949ca6cc66b3c3d78f4b468e3d6c52794588ecee6e32673165969acebc3aefc2f298df04e6ee7ebfa682ee808244dedd2422f486e4cd9595caa85af9e24d2207f12686d7c2d5491e7307c638307ec9e579b1368dad3fa014dc231f90a6e147bf5e6c26ce6c8b633c9d3e0b2f77f824de7592d566825ebd0236248bb93569ac581ff1baf3adfc97e5400e6a91517518d15bf33c69565a0b45ad63c626e4c3db66040a1cd59bfce7cc6d9284b65fdf2267891b460b01a0ad28b8f6907043f24dd6a0060d29683e890b70ff0597315e0b165447c9f63c15c10c733b44dc6d5e5d48bb389c85fdc24094252dd3e208e062bd2a8405729d8699efb9d06797d2798485fe79dbd5c4dd342188470fb02c9bc13c0899155d4336ad9b8dd9686048b801904bea85852388f84e7b03e17b88106c755916aa0f3c14158d8e5d57523d1e082e3dcd7f5f726f9c54ac36b80a37142ef3760b59f03fa591e45afd4759959d3da0a1dfc784ccd2c17f3798176c72ad101e1974500495863698d192604ac794ab6c4658dcc1e6119bbb5144cd513047d10864c85ae9802f7a97b5f0f75d7c242a4c631aa17cc74c1388f2a4852bd8ee8177e500155625dee8ec1944a8c9a12821af634c53ad95579bd20ea84fb57fbaaf21882ed5289a3b56012ae093a4ca817a3c76c8939f1e2be7088579c0138125a0205d32da3c76b473b4e950ea502dddd1ecbe92799e91062ca4cf99b170dd7a30f70cd3d44e46eb6e21bfc66250e810d557fd2888debe04e6d16fa679eebf4f38e4386937ca7ac25cf2e853a24dd54b37dd741a82943986623c8d034f05500819bfde90d766adad185f6b8ad52d3cbc66865f88b1ccf8d01e97f592c50897352143a0acd4990d7f2c0cc6c5e7553136338860e49c3350e75f5ac7d35a23b70b04d1b3651676d3d544801a6bf76d94aecc6bf1ef6da657c5ddf40a8f730db8431f4eb0157f75b472583d353598a26fd98e118bf70e9ddf5bef293c20c7a395e44d019d8ae64f3915496f3adf15e43e860a282f618f4a944459d8f146724b42a6d161994e775c6da2ceeb7b54bf5b692bc12681497d543eb36619ab3bc3fcbb4b41d2df9193e12a85fc83c48a906f79bdcf35857b3904cd953d466dd0b335fc577b3c23e91947aabe6aff63c752dadc2be880fc312e56b03173ac50a016a8873a10bfac48bf485371813f16cb3f72543c269e6003ca0775d4dda97df082f106f86a05e47c18fb8983a20d5b6e12182eadcd3440df502db0b4792eea770600dbed890dcd6f4767fc95a0c0420e7dfd2f11aea0562f3c0074ac2b48b24611d73c85175bff9811b81a8bbb361ff35e0a4c157d4e874fe723ca02fbe1ce81dca56644002479361024992df002d100e995c4a1ba51a2784da336cc4c201a4898b769260fdbeddb4791ee06597f12e63a9585ef7d4a7fe0eec7bac313476c3c33055d1c4752111e2a45e6c22ce8e16b618aece2cf5e2a0c1a48ab726bfe1db183b99386bc4e418af4dea39c211e70107a45a423902939127d90b3bb6fc0f9f9a3fe187adbf447b2f1c06be7d4f411008f5880cebcaeb55d2d884fe5569957139fde0dacc922b9c52b6e1163f8740d344df3fa280816e74c15ccaa7e5b56b258cb4d0be74e55f854ae99de80d14d2d83570040f582d6b9c501076883a3588a151282116a267e1731a679e1b07fce8e57eac7a2672627c2d0b7df2c6bdc251e5e02af3eda1478f0b61d580219c20a6f7904dc21bc7c5bf7b82b5c06ef6d4509fa9eb45ca8abb2ccd5d5a4cd8a1227f027a5150e5a220082aee729a67c08af811e6a2b6915d348ee50001416b37835e3b16a4191545f03021fbe49172519f6fca828419459d8a8a140b34d3dd226d5b543765f998aaefe4e552d1168919c93e0d4b686f26cccf4d3c12254218b8dda9a64389e120966f1c01afa06cb12b56099e5491dd3ae59667225d82675c1dfba31d9fac454ea8f0c9c4df1218a523815c565712de9754b15428c393a0a723d27d745af576a315670b970202b76869794c6eab43f854e5961c54ea8016798eb1ce84789c2a4b0127e6f4a8e0c36c468d62fe42c6ef71c74f388bbcf1a4b5d9f5a626d33ea70690aa71c6565d58cb782ba761c0553e7a2bfdd8be2b3cae3b00786bf9c175393f9da83ccf06520e101e064081b7e623c64f4895db2e7999d42495a1a6c908a2ad93635e1d55df83349115262b95eb90815c38c4f7aa38523964a56297447ede8b3f1d834a1d5590d3f5c7ff49ac954b16a7970b9a33890950198cd4b253887b62a26803acf5ed2f819b8c34976789d0358ab6a4a8efc66244889767f6a83d95124f915c25b09abaa6b8a29ca219894ea4ad39adf7589a8c93ee4d8b8953d0d93600edaf2e350f3989b46d9511cb47f2c217be8370e001b64a0887e5c4145f951fe3246e7b4b648ad445c73f562979ff4560abbc6a806688ad89963964ca9d28ce39e2eef1827982f0deb78e3468da82694d314cb959abb5d0085bf11606b9518c75062db4b270e718ca380a79399121bfbf96f126bed0ed230c0647489d49885f0684df7cbf1272d35090164e0195edfadb3e484d1dccf895a8af5ccb5e7c2cb81c2e0e809394f212a3dfd2b97ee509f44f51355b12813b2056305343f7e821b6c3e17714bbe120b3f5210ecb0c5c8b570f1550edc01a5fc9ff294325d012da42207866a09319c34a580189f4e0e12454ce9616c147cb69c7810f0ffc73fcfa9769ef9ace841e006d4c6053c1740e6e8a66af25e26b392869cad5ba28904eb5e03cf1271875b4f905a41a25dc2847165abdf3b57c6e216116d20f44c7e72ad8aae8c3a03e331465fa1addb2327d3f63811b0e84f89e9ba843872e6802915b20b0c4c53a29889c54bf45114e600292df5137969fb5bc93eddad1083bca400a34ee13879252caf07034aadb899ba2859502bb8e96069b01523ea58281062a00801e2530d09897d411fffe0bf84c21c4d630198e7cab332e443d1c2c80668a898fa182807ecc91aa923e4aa65709f7f3a9c02b3d39a0b4220c68e2256bde8ed52d1bdbf9bc1aea3531ae8dda2f1464dcdc8f7426d554cea60681bc97c7f67ad5e578cb9a0aab42446e359c11d8a37061070068150b6f7990f5d729f4e02cabe8a90f1d91622f93eb45d6e9f13fd3eea48bad61d61e83a9115a827a63a44fba11e1bbdcd32f150f90216235f445b3e31e573edda1ca1d06715748fd33b55b8d1d182f5293078fc033d0c8fed04412e2d51a8237cafb691f1aa4b0f6771321fee828a6280660eccb781d3c818943a88b9390b1dd4bf7c94bda769f204417d929318ac8c7cf9674a3581313b01a90fa5323f8609db19ab9dca6032ecb874801e18526e61c61a9b2ec749a8cf92809630381963feff1abcfc1e6c2e9f5cb46b61f72b727af65595d1e3ccb6cfec7d18c012c81961d0ecabdde4b876af140e2d1b76fe3a1d321176f1b92c242f3e8d6ca66a445f11401b9d339a1959c7a968d999738f015dc84f0dbffe492215899db47f6ba830e76db8929b4a3e24a04ead2ceb6b28ca5ab657c246b7a9fb6702aac4d87aa63624259580f23b31a2dc8b5b4f50c71e2053d5cd53b3f779a1386694b70f1c89413cf9ff65ee85e5cb52420f8e5a5713d6a25f9cf8b06c14b2f824c68b8764237cd9fdf6508c6cd3dbdc1aa5ed9bf206402dc8980707280c649b3312cb241bd2fa4a22d67eb13159ac6a5a4e8308ed6d296fe8ba1a70583d9d903b2317c3da1f6b99942debbc65d7b8b44b74066e22826cf4c6d38efb6e4acf7d4be312daaecf0f2b77189674dbe2c1874bc6a43a21ce445f8ff803f9d054fadce55b24e32a72feafe2e2b550cdd4bf9ca58ea58c5f2fd2d101de70f9d563645164f465222058bfefbf4ea5586f7d28b55339b92646d76b6952bc8b0d7a08fff46d9cf396988cfd460b5c4783ba311606e3b8fe4cf431e628dcc2878cee3869c2d625b12096c44e7a7054b138876d3295c8359ffd2839c85e81ff7b6ec17f1d2ed35b303047bf0750756081d2042ddf674ed6b46bf1cb399fb888e32b41a034cfd6d3e701db1900a0d4dc6c384d5370676bd1e417261b97a5fdb068cb519502d15cdda944c5fb6ce6154414f83f6d83c38ac7122579b2501ea3ab379964a338730b63e883424eb12be3bc7617376652cd052fe54f257260761d7ce51342c750e3f54b45a7b72ceaccb9a41918382b167a6c7ee352c2f2c5d7352e8ae44d0c3ce3eecac507ea52057fc4d144e2729fd017135e6d5d33ccf56e2c0af94d8c8fbc7530cf28ae81c229ea1d16f7d593e9fda212ff141c44e0d1eef4d86f993b475c937bfad5e809381b30a8259a2d7fccf6a5a4e1d8ccc3476c87a7c33b1edad6484ebdf158690095d23f1cd2b0e8d8677b3bba9ed8cd515cdb4883c377281509ab6b0201f1ab21098c215e4bb9f80ab6c4f5859b28e128fd5ec9487a4c771a42e9986d1900e6b0b506c233fe779da7560837d57e02711711d4c9684128aab40ed25e0a3007f422c7f41785cc2cce9ed247587d5865c6ad10b64da503c8a7518ade9f3e25ac6365a613cc20485aed75f429bba5ce848367390b5ca1375ad7c0939483627b69459c512553028b42c522f633953ef8ee5ef86940aa67c6453a970569152e2628586798f241918d9ed0779a38add0ff0c392d465a8d481fb83393308ba46a80af963805c5f9dcb74497aecc2911460ea8813deae46ca408a497df20b33d01bb2fc392c4a6010713201c7af6174d4948c5352815edab6e47ea5e3c289d4b90b3b54b768bc3f56b96c78b863c080c8742151841afaf97f28029f4c597b454da825e38d649711a8d18028adbbf14eb7256c8c77aa0002767428ec06c39a267c3f28f22f95e357abe8bf5f402a37a07dc7aab27a51740b27cbd966efbade8b5dbbdfa51af2fa85799e7bb240e641475a11fab5fd951354249ca4e923bfa43a1860c7fe070e3ed2fd25e6e570135a0ba4f3a720a6ad2e69d4507a97647fc84b4b8a2dd11f9492ff03172b6d1a9c0630e7df8b1690f7f8bb7b0da0ced8e980f7803ce578acf3fbc87a4c1bcb7213df3377c6a14c3758462190216cb035f16436ff933e66fd5a1cb98c6b159ec904d9b21b216fcfce6cdc171c443a990792da56fdc3f9a38e45408d5a556648866c4be3ad08bf8b3532b24d2404287a0104df2c9e02d8fbb33412df51218dba7bb002782b2db17c95582b2da3b8393227ad0567b55d85e809ea47b65a75e5b37daf311db572fa4642f8660fd446dcf627a55efec5b5eaf19f6eadfbd9cac971de83572bd13ab97a0f46e21ac406d0cc4bcba0988c528f6dce865d3c260e904ef6722e74ef4b359e4d510b61a6290ce0b81ebca96e71b31d260aa10de8382a3ecc80fc801f0e20066c8fe40f9539e3d424cc418056322c4281c132946614ce418856222c4981c9b4e7a61acd7e57a914c6c1962148e8914a33026728c42311162148e8914a33026728c49b121a017c4f5224d2f8ef56ab05ecc881cb95de9185a6ab4ee81c67c8679d5824ab5f39febf0e7db374e8ef74771a68a2d17fe20c2d0debb5d4173ca75ecd4c934377eee54676647b02bbe13d5fe783dd9a92b1ff648ef53a323b62729eb752ca8d925c6bdfc9f39de62156f7f12bb89e25a77c4894d1c510aee812cd50114f977810df3da11ac5659c22c300f97ddaa7b7243528e14905e81c67f356699de2ef7a54d5c6fd5390177644f819af5722e41e5fc8a8808df6fd5e948d685442e5e24fce8af5925eba2c79ad81c929234f8326ce361b84f02248db0d4ff15df980c7f3f24e3d1aa73cab14e1e922ef69ae3bf9e75c7b598f47093e1a50e5f2ab99ea3715e85202382b84dbc11633e1ddfd0d51903b0fbc7dce8bd68a2afceb36eefd95dc98ae15907c5f886667979722fab4d3738174bb4ee7ef5eb40d1464c0912005c64315b77c4406f2658e7bd5f839194f49c96705ae0da7dadb3bca3a22e76e91699a82353cf30ba4e6ee3246a34b98e12a9b101689de8246dd5eb4c965b07b3559446872644a1e6556d86537dbeb575b1965f67beb0d38e58a7b705382b99ece24a0a7ba9b66e0e64c16e9cbe1ad7c79c4a75bd1b45b9f1ea9ff063382de6a739bb59ff2049e1f3257013abb8ae0a69d6b1d6036b9e57be46a0d2168a146beac7d1796294e97c3dcdb4fa32c74ccc78c0031aacebb8b28bd01a1868d5c57d04113cee08069306d28575dda50cd6bc6f598e2839063a8a5dbeb7b6cf72442c134f2422db0525af78194267c9ab0acc7fb87583f5335b67d72db9592f1f34281c17ba17e1118b0690a1b986264a77ab7066d79d7ad8da13f7c089e9dd33bbaee0267c3cf42bfa2eeba0e53ab6ac0179a2aeebcea580987e5fb7179df52b70c53d3ffe9c956100763a1bc7604b6c1520a49d7421bb4e2106e797849bccfb78981a97b505912037a1947614389889ec3a3eaa2e369dedd4ecba343d7e3aaacd5bec8667d7addc81a75a1255d875e00e4c4a8698c28c5ade384942d2fa38b4b24c446258a6317504fab86f1c675e57fb7af042ac15248c604c53c2b4f41cd39de742101d9a8a9b997e3c1ff223a83694540f4b347a0e3d0f9b0dd5d767ae8303064acacf2c611c139350dddb74932279e2e6b431c9d83a893a9c23a2b9b8f8693416d13982825e518cfe4d9247b6d2d3ee57bf3a6d9b686d71e8e5a1a06a61b0678a00e32f6cbdc2e9a16647a10683bad47260547d2fb4d6a8ebf8a1fe945a8fd661e55001e40bc19726d6cc40f04495f3a1331a260733cb1e6dd9e3f8db6e9cea7770054ff901507d557fad6f13e288d8080273181bbb09a31c3a31e12a4786d4df3fd404f9e7ae73f59ebddaecabe63e27b8fef07f0df997df9181030f928abed826039186b69cba9d27a26e7e6b855773ea7bb8d66b369557ef9e7e3dc43e56cee215462d4a857310538bc5411422c5fd69dcba08fc0760ea77a452d6a522352e63af6c35f049a33560007f4505675899c7e29e344aa6fc8a2f3ad9a474fa536969d259e6d72b89f15c188d3e9f61a217375260004a4934f41cee0e6718936e6d0d68a2ea3ff8cb895bcedce484fdb0e294332f39b0ec84cd459b4f4eb8454e0e69ca066bbe70328743647543be1c48c7d9f53d5ff138a3df5b654401f5e7c9dd8a55d5ff4061c1bd75f638944e81019f6715d2781cfb370fd4e3fea0c7d5344a3efa32404a5ae3533ee5babb63d6b334a14c269aa4ee286674b24accc5510e2bd65be0466e1669a7aac949984cfb3bdbbe76b5b62cd8a7e95a4bf52af2d8da548e38ea3321b6087e8db8361ffe5d2bd55b9606fbd6b58cc9a53990258cbf8a9e281ae0e1d68f09fe38a96da90f7059a4b927fe48c10a819c2b4afd561f20945a516f5d4184ac119403efc61204be353e544a56b93d43e111363b25b629b2477039af727ce489b9c5d5e6abec20c6d5864d30a33dac2947c1d77a4cf37e38608f301ab0cbdeee08f7523af5065f5b1d181f5d7b018c763c1bf33bbdfda4bb0c429f5b624f47c38683948588625e7bd29788d71fdf255dd127c2800be348c7f1279dbbc664a90b29be7d9e86a7a414d6fa422a6b94d592c658ae2d4c18b8b66b100d084bb89bd52460fb42e73561af2bab2842baac072bc92c1dd3b15654cfd890c9e2199649a82d3e016c6deb443153e6c8bd384b08516fae2c48b4363d5e4a39add5f7144939c7f87c0560328c09921089256004be775ccf8d992e034ff1f66aafff246d51634844434a282ce2a29efca86c2071ae41cee525786e13845e65b0a4ac476ce445d7e7c017af160695fcb8ed1219cd2a5de541e8af7e292905c7b69dd000bab3384b4cc096bc0d474729b04e797433bcc12ea3a87f54fa03ee1e89677c5490bf81cd14f11fd9763718db460a2ec6b32cfd74f9587a7ed42505b0c78573159139c0935272ef6232e4cf248cebce7277bb5e2d8b1311475597ea125d44f20747c34c47bef0ea6c328ab0fa3556ffefa635f8f9bf8100aa6f02e2246e230114ed462702952f8a597dff7136f28f145521504200ab71fbcc2a9a782c244d37a47e4ac74cc5bcd61df2fc517d508f8d73c22d09b072bbe8f1f198324a0a6cf39a7b8cc4690bec47cfc1fb79a6029834558a74032ec65d26157a52f62a40a5490e5fe9e6f21ec1bede91571b6ed14d8b68ff9d3d3c0e63fc67244e9d30b3abdf169a64d8e57927eae7430517686825aaef7bf46e7218c5c15ed7ef518a2e24f1624870ab132eb2cd09b0bbf7af31cdc3e1a09d4b8c961c635290574bcdb30a0bb3f4460bc5d1c1cc034e591d9e242b11dc648b943e908e945116dea80f79c5f108f83aee76d1bd6c6319b99d980fcfc352cf063ab62b5a186dc3873c8d5b2cebafc3374882558f6494605c0ecebe967fa3a8d0da9030a207d14d9ee9960ddf1a1623172d22b08330caefd039f3f1c28390d330d27030598533cc0ee5c03afda932dcb0e9d2262fbc470c8166b9e35afddd318f184215ce37d2e17ca8a199a6a02897d8173783f1a6217200962cb25c9e29f070e9c7db3c19abad35036e48fca67a745cbf6cb9e71ee90623c2c0d4dda96916437286889ffbb6fe4e1e5fa60a5d2ee5bf11c4d40775db0ff608fd1dbae38797daae5f31028b23ea587da2fdd77628a076c0af13fb9b08c26139aa2f32bfa09be6fafe21e6e80778a7bc5f0bd28e99796647d8e9124f5ffec4951e891fd1361d0975c4a900b3ea4779770cd7221d53fe5cad6580a494c57c7caccda9196368db5d37ab084dc24376db1f79a6d95edb143866a2db3962b1d15dab4ca64839bacbb605af4ea5940e2e3c0ae074a541de92a6ef6b316ca5e0deeef1889e3c42990ba891c0cbab1159a0b9bc07c7a116f0e91b43c340dade96d0d088ade85c0221c1dac80ec53de3b48989e45ba1ce90b86341728913c224a45a2709e1199376f2ed25e4543d3a10a451c2331648db4035684de2d8eed72e4e41675cbbb05a8340e8eddc77acaf9ced81bf7202f4e69db3ba3026497d175fbe1025ae85f5c0ac30f83591d3cfa7a1ed6036c2a0673fb38e4773d4f10e5b201253fd1a4a624548f994cb86185328dc7dca7693447e6075e346587993d0c4facec266a4db1e242415ce8dd8e4de1398ffd884563d98ec94bccaaa6e507b3c5a65d98984de09e1d4be5bdb42f31a2b078f57e0b60c0e4ecbcf7ad4d8cfaa2335ea8b62eb1ae257faa183e588da9da05ed14eec1a4f5d0c04e622f9a6a05efe75cc8a51bf11a0e72fc916cff4f561bd6a23967624e46c592889f79b546a94ac37a2f51219762de069df084411b51b0d6e151daa3ff040a7bd04e2818a82c9cf12168112e6c43a03334cd88e82fcce546ae4c685859ec7092cc866941777b30c7021912ce120e74a9f92204515e3d12156950f4a0c2b47719318de776d65599a3f1aebcf8b089a0427aa5e812da5c1b1b10da45589910c7732b9839f483384869a6310e6055c1e6c7421f0960f566d07a640c09441a0d302888898c436d4f412ba37c4c28eb6e299d17c8bbad56549df10f1636cd090acb8ee82cf1c92b77a364b27a136e418661517115d60fe0458109e17e189e83ca6c67749888e85e8e14f67e94615aef4d6bc69ec00c8f40dc4a3b63a23970c00c6aafd4e2ae57a25c00b7efcffc9d1a3fca5040b9b6d68ec99a29598e6c97d20fd015d11884810017fc32ddcdaf662c5c7e6f1209cdad672b2d5581b02a5ee53017d5dca311258a00b442b81f65650b3365c27003fdbdfb054365e954a16e9ca11502c7118cbd98bf344402c9216760e764ed96814988e32e582e059277ab4020579d01e5e82b594d2cba52af5f17a4ec0f0eb9cb5df7ba1bdbf41be52e85a8eb891d7ebc550700cccd210c0aa5104c54e93e19d672cf172b7c7fac750604b7911fa5f3b473016e1399d1dbe7beb10f8cd05092412c33fe3feb3d844d2704e5ebf5a2afc64a23686f001da7cb348d9ec013618bbd7e97c07bf27b289791ae351dc5641a30870eda193ef5ccb6dd52517b7a5ba3c7e25fdb096d48ab6db4c8a5b1d9d27bf62e6bd94a3529c54b9530fb26ac5492f5dbee046e88643b3cd0792de7f376a3a47cf9e53ffc5a78ad1f5f493b89fff44b79d434b7a3bd1155cefb2c1b8d392a937ce8b52d22bd77717994440f132d3773dae85d5a636009e1ba82b63114e913ff22f8126b6722d7c50fd2ddeb6a0005b084bfa5ca2f0336b9d891362842a461d5d1a9717ac731ad61bfc5514de773a81164d81d7fbc4dae92a43fc2f1ab3c2ba194e56f7f43a2a80e18d3d55b680b3a45761673a51b71277bf5b81f8b5fbe78e9c778eaa6e7f125c9210b98cdaef9c2712baf27dfdcb72f000761e88d810a988f3de7cff68853cdc7031fe9fe7a366e20c650c3c36cb0f29bf4ea3e6b9b688bc4fde7b7c1833b1bdc9acf90ec9a337dc1295deb5535492590d108f806747935c6b4d03659d3c519c36af4fd3783b4f482b4d562a0a4db1d6124cf64e72ec396008a2aa4a78d90d7e0fad4d43d3204da11eebd36b308cdd6882fd92cc792e236b00ad9fe23ea2e7845888a9fc2a17c32195cd68a4198b5f31f77721ef501ca97deebf1583ee8c42495d093c2aa00a003852dcfd49767c780bb3de7510fc98bc2625a924bbe7885891b592541dc95f679b185e24bbb035835c2c2175b2e663a2978e5828267995943d3416718a940d831c59e83ca863eccef60a1dd99fbe6f7831ec4433f618f54b681b693944b81b395bd14e7326d27ce3a419646e7e5f6413f1b21f7a8d1a5e91dc4d6eba2a6d375ee2a28f4574707ff9c3686d6892a70914eea2774c564d064e244c5cc92847eff7210b1038a5142e7bc7e0c0d42bd405920722850baf3243b039de4388721fa203709b389fb978584bb41bbb8991750f1eebfe5a7ccfac1d0352695075d5baf4d244a618ee8af9674dec6252cabe9a1dc5783f1a60d780e5536b0e7e5eb19bb0188557c4bc1e6caacbbcaa6ad815309dc59a10518355f2b450b50f49ca0e39a2322dc6aa8123efcd66cf5c575f502befe20a7a6f7125ef81708b822907192cc518e8d4be97fb4f65ef1a4016c9e8ead9ba9f6af22edbca5be62f12ea35a31c8f6444e0c590ee58a1b397eeb0d851245234e6d18c5ab621da33456c042d4342a62f245315df90826ec4e2a156b850c7e1c2113ad5f2ba292cf3a5f2884115a3932e23c181e8b0c4346d6504305543cfb8bcf58a1cb5c417f800e3880d6baad05a5eea20a8d719a929f1ac716f285e1d75fff2257f83289ee42c91168fb808a6cef23dc78ba4ff8aaaf7a249247bf88ba52d411ab189439205a981ec7e577f83834aa71dc148a3165404436999f29a4404b3e12eaf9cb993f9ecc8b2c5ae0bd0e023b9fb893da5aeba67b84ad6095814540cf15b65615ea29930480eeb516159e86267a58f3bd0495800d06122a5fd97d742a10b7a1830f8fea29f9c3ae5adbcac0ca26a3d32513c0d8709dd564363be5daab3fbe12a8e921287a0d1e7104298da042eb3269ae29548542b21488bd5254220eb6eda2c8fda1b7fff800ebe44a8dbe391164c9a905a71d3b1fd2ce0aded407e3ee3fdce58f5798a13fd27530c6d68989d6699d3a1b078499928eb0c9602923a350c7348a0d799f89f57e53946868f4ebd19bfdeeb97202a7dcea27984e4064dc6f23f055533bb29bb051d4de19b2cab87677ce376e01e1ca89f2ccaf24dcc53ef3ad708d8e78f9f7be5312283cc846b59634483c2f2326c821be7d1346002b4a2c5eac3b6b7a02834e81367edc1e3823a9a54d2fc99f8daf612feebc80f3463123d73873f4c2482425a9f5ce5be3e98472a7c342515e028a449f4afff0b773db11527c94c09b87d83bffe194de27d8012938db22956a8c1d0237d8134126de76593b0a7c64a70e35250fbca2b2cfa300e481b76a22686c2ddf2706d1f9a5d4d4c1858447c9345669cc8a22090363a0434900ebb22230ea22f7322dd938da8554be87a9d1aa1842140afb71fa3f0f04bc36ffb2186ec08a93bd0f91960800d3cc6a411cc9eeecc04e8ee4299a83433ce84c41a6d08aa1b1c69ba3f675a096441ed82f9c70bb88513400148de36110f6a7525c3818d38c3e62cc974a3a8baf916c7a6fd437ea547706ce829400bca79a44d5bd5902877f6c5077458d5b0d1270b1d1bb47dad4a8de1685fa5c16b1ce50d34850d7e59196c9bcecb3595e077e70dbf504c5ff83d3f1b0941e7efbb86c5a96f5a0fd8d4ae9fcba9c61ba45a9adb8b9b3bcb5a0fa8c4e98da62c74d336b41e00c023d76116223b718d800262226dfb1068c9bd853313805d19866be2082a4338195520715bacd06f3f53d65991126264ae05718f7463fa2d819d81ffd5996c6b9fa87ba7c2730de07cd541ddaf2ee89e29bb1d675b0208d7dae8bca4bef6096eedb9ca6ec2e9c544bb253284dd547470dc9038edeb3e130106d58c3956c2384ccdfa49016e5f9cbcbd419f73665bbbbb7d70af3b36aebe9d986a9adc5bc0330b727eae3343a3f3913492dcc9e9a61052372743af800082cd296ea5ea352177c3d737c8d8315e48651a7ddafe7ea0aeadb3cf0e2ac92ea532a161391e5cc1fce6e559a738fb4b171820b194801c54ed45efd59910af2ccea502df8e2ddc52254f379558b0924ccbfff08cd55793bb37d93db12bfacb43606b3404570d9efbbd862e9ffd4620d36c2bfa05993e63b902c3275560909d6d0551a60e46a41f235cadf9c7290797022c49c030570691af799a92487153f30f520ba20c0e8c1eb308dbcc304d2f53644b37bbc165bfcd650c07fb22d7c758b551fb0610dc30c7a6b5ab20b8caea5713bd7fac6450df39f74c403c5f800c0e14dd87e38f19266d5eb364170249668bf1ec42a8cdd6b6cf2e10859ddac6d985d385a76d3bbbf0dab6b5edb30b4461a7b67176e174e169dbce2ebcde362ca5818c8c875d1a0ea9312c3d23a57911765826fb16b9855d6eaa7ad8deb0cb7fb41916023d4560c7bedc31fd60261fdaf25c9f178d9b9838932b2f737f8b620253cc552f8b68bc229602349281dd09fef302eaf87fcbc8e0b72caf2e678c6ee1455a26a4557f31368e37aebd13fbd2132f50250f1083b45016605a553c9d6cabe64e0b162b6d443ce489a0674763df09bdacd320fb8fbe6565d8a5f1ec08b92245a891ac2062fe7c7e51cde8927a460dd92f2481fba583196ff9fad2e0b618ef563d2cde6cc089de7c1cfc1ef49dc6b8ec19c53ae100c2ab79b6e4461fc75d19e03e7b335168cf0d9a460366c64da54921f6a5e28aa518643056f9021c99aee93ac9466794083bda0710388e29c68c879816ba8c3a61cc9c215473519f4a91c8438251f800d4fbd3f2fc693d1630019fe557aacf250b5ea700d634789982d8d3c07d0e644f02b19c892b5a6cd0d413dc5f041d6784574adb226ee20af2485fd58bcf309596277f7d4688a846e39eb58a4b764355ef55441bb1d975c211e1a470923c4700c3d91c102c0c7b3a8137fbb3fbddb04a538c2a0e5956ac5985a732e41b6ad39e7038d49c01cd7e1779a19b67e5d4d1de220da2799a1ad938a09e9de00554a8923fd40a6fd49f4371077be959e23eb014087b91a0a700041a3f8a43464504c67cce61787c28f114f3cb57b2515ea6859ae443e4c8a1cb694121299c618cb416f77d0b9ee6441c964a62fc89229a9c000c99627aa1827dc077b408ae7a68e112f5e4ada90e1c38c0644469e0feb75902a5d77a934d28c4f890e6d8ea9d033a822fd787fc6654a2f0d5a6dad60d4a2da4e56116a6566bd29c93d0d4e45189550fec55f1825b00ff366b90fac414cd895454dddbde50098b72b920992c57dd76d0d19b21977f4d555e795454a89a00436b14c4661079b43d14b0367b4127bee184179076e077378be9020b15267d87eb255effb0eb72bd71c390a653cb5c65f3e1034cd2c4f3e0f1064f8e19899c9a70e9470c0d1d5383d71b5eb8fefa12678cc183c1c29ec463de9f94e6fb5e15a0a3d43619b29319f05e9567a125138d3787f646f49081d9c0dfeadefe89f26e3f024109fd036b16563b0fb5bb29694d3b17f54633d9903d97c34857bc756be94ae91b49d312c82612f427ce06f6f1f762deef4249a26a364df8ff63886f04d689b6888eb9a6fc5a641e52c304705f4c80d5a3a58433044b00c989904fc8d878bb2a2b20150f03cb2b6838181d69f07a95038c016c40dbf1117c5d4871c41a6400e5b7440087fdb5dac9f4ed0416e0718003cb48d8c459e8040d0c77a88262f3ffb3df098bd6c181ba292efc4780b511db806540ae3c4b4e5f73946d9a02a984016080a0f0e270d00517044135aee934632245da84a9be80a9d8b0c71c93ca4af34c99fde7a507d383f9afde024c3af372fac2cbffc1670b1304e0e8210a097eb7d0228fce12e608e1d1431412fc6ea1459ed0b0e025a64f6855c8b97ec0452bb7b5cb92827148af7090de954ebbafa647a6b8c0059ce6a0b7a8abd9b5b3e19a63914a2ea1e91b58bc639d224d29adb492ad3320ab54139e15592c2b043f54ad4ea8d8e57d07c4e2e990e8c0f431787c23e226ccde37832e9ea73c31f86be92740c223a5b4478cea0e24b0d2e06962949af8dd2991e3425895a44ac6e9b42162a881ae06820110c6c131009a2970c64131039e3170864131019a3150e6c131019e31be39f051ccb762c2d7bef9ecbb7bb4d7f51709de1ac27c2760cfe846286f5f1b6790c5aa23e69b6339f8cfcbbf7d04355d8e0132e614b748fdff5637634eaaca9cce6ca900fcd0238098ab283417b7e7387c3bcaaf5ae07cdc1ae3e0ad30376b8173716b8c83b7c2dcac05cec5ad310e2e2d04b156099ad8d4b23d02dd3bb00fde9948993d1e1888cb73b724be96625912e86cdb050c574e686268af834844cee803add9e3873780abc17d3cffff363ceec814e0fca50f7721c9d34caa153586f5f3c16fac12716e2602d3fb44839fa737d77e195a39b78f765e68754fd333d70009535a823a0701950ce70d64bb0a6a25b8649da44e478bbe61e8d4ab023f1b1258a6fbc0ebb82b3b5f1f6b75e4825d5634a29d9f2e52f79a67aa8c97d6838aef9c3b5251453ba10c84a19d764024bd6b778f74020cac974f8c640b2c2b46dea6cd412c8b0dbd02068d415a427638bfd3b40cf42eb70596d548b059ffd826f08bb0f269d82d068e82a68faf3ba613cf6a49aa2920b12331e0fae32e6726cf39661cd5a431b070a6093be13273508085a359ae0c70d31284640f8cb8527dfe7a548820f8d98b82676e4ef6a9fff3e0c3d6d5608b4d4f0982df1d37ba62b07adaf0168e18a6ae99769c3c2b320f47ecae2bb47354b0480aa1dbe611c55b40a972f55512c5a3fefcd10a0092b4523dbf5c76bd4a6d6101d1a2a4f55f2e9ba0f6d9425647a7300b5767a549f2199e3e83357411a442c2c7bab1deddcfb3464a56449cba7dcd51baf59d7e5d2859cfeeb334beffffe8856ff0ca14a265f111743839b5c33a408e815a65619638e0e33e63f1ec6b403da279c4cf8353ad7b4134857d35a25615aac85e41bbd9cf34f1d718d4b840132103f530bddf40c8efa897a20fa980773e12ae9e00c030e416c37242a3842fccfa8730131b9ced6e8ba8687141798607e6cfd9c544e97e34d0cb443a91099efa95bad840f4d115a311f328ea9c36e09899d60cae4a7ebde3ebbbf1e3345f6bed10ae418495aa0b2944d674a989320441af1d070fc5093430c23f32701ffada1092393da1269f29ab3f16fb2c74d4a29c58a12bcf5427f4fa4845a2176c38cc46da50a717f46a4f424a3d1503e3ee59519af7d61c4da863d7d0212d56eaee28899b6b6321a767c2a07f65e45a3c244850aafe005acfba812da09529960d6d94fe90b3fea0e6850c45ea7e46f625970d93c372317f700962eda4ba3efbc7aefa5079de634c198f145c47819d8d0bb5e7c320181a7ae4c8a7c8dcdaa9bdf7378d27a826f5cd9beb0890002f0c3774e74dff37673080fc7e48a5058a365cf521e96f44e491b994a4f8813e59a6142e4528f2b22a670515938837ccb391c592913587ae1faf2121e9b070d98edc3aed74c0978a8226602ff6ebe07de1572ab6f44855ce740c24cf92f8d83aad6b2cdd7cbac967e28a4df70503d35d484ed12cde84f06b202f1d900b5344bb0e946b3841ff68ac9f1bc46d23c3bd8932471c34325f6d23d44a796dff13ccf92f63835ee6858f2c77a18fc3852857b83d83606a3a2f67bd8145b0b81e568acaf0318830cbbe108bdea53a5ca1a08413915acab4cb7b8383b1e9e736ac8fb37b5c0734767240e8f5b989d5faf9c4ad66eb44a43e37014fbf9ff0d20c9d80d1f7262ef4ebb800716f8d823bf7f5f6beaa9c7d08f60f2a0e4a05fc080f7af996ca03857766582846013f90470f4a5b579873794440c119c82c440a7cf37e7ba7d7854155709164b8484c174be8826da9d99a72e7e2bb44cd2b28d175b659df943145d2123e535f5e6457fdf0d3f554e0c21688a3482a413a3905268843ebceb25f67edb7d3dce03d1ccdd6c9445f7d52b92b4aa1ae0e9b623e5178b99e27cbb3afd951dc5b93c06d7ae2b9cb8c03f1de0737041cbf405ff4e08cfb25bbb74632ef96ba99c68700e34883c2c74bf2515321503042696a80abdc1f663879b8f484c477e0480ef297781dee73d198810ae57676e0b17741cc34128da32bd5923b02a1dc3e0d2281493dafb48743ace40fb7205472642ea9ef2b93478eb8b81f2c716b917b529f18f2d4f4ade124eb27d5dafa7f56da9e87120b7877f0416a8013ad84b0fbfb877a347bd867a45904abbc8b4b8d704f4c79d185c9b5deb0e85e8fe57f8a881c4c8c25c65b2ff3b2d47ceebf1b80363c6023e0fdfc87af0cd2fb110d0ad0680091c61b4559480ce237e10017817ca9a003f522e9ca5ccaa4f5eeac7110617bb1e41c5701c4029fc39be46675c64fbf14221a67ec820f390723ebdcb3b291b6b3245fa210219ff238cdedd4bdb67cb286050370c34837e3376f3e923c1e3d72567893118a1448af0dcbde8c91b3d1eb0526d3367bdcbe4f70f1b88e0fab9e8202252680f017392ee3524e963ed3e5107372b6c86c839afa2705dca250d3032abf05623995782ee3ced2ed51f93f436617c297e6f36df53ee4c041614d5f0518608081c668b1cc429eab83600b285c081286f5d96d81a85ed2a671c7dafe11804f821eddb40edd5bdad3007c1bf81b58573d9a55d30f3167b2b33973a392892def55d798ff3ebaeadb2ed1e4aa1dabb574b79c0aa883d0a6e276bcfd868812209ac77ada9c02693a06644a77985c24e5739ff9473aeae6e90d66e1f30ad18f2cfb3e1a55cf2c608f7dd907ae908a698415a27eb27bf5112b06d3e29390183b4d0e10276a75c0988788f840db376b705781940ccc32003e86ce1759671ac999a8d33afc26aa35599833986042c9bd89039f6a46b73078b3c6b38d522be1121becbe81d666bc00ae23ec6e4e40873ad458cbebdfa9bb99bdb3d3a36940c860e022dc7b060ac0de7718f9cbb4308fc5d913e8171c6e052fc173d1b40340e5f74f730e655463c58678999d48b76acf01e2705d9c6e224b5cd7b7227d303ee42aca0364e50fc35502fe3e53176ffca7c72ebd0818def39ac75e55632523509f9ad545dd6749d96c0adf87a8e074337e70b281e4a7ab9b42927a9c394e1d17405ac2ddface1d9d7ced5e2870b1cf772a82fb58c893a55e8db1a022d6010cbee762713b1acf53814555d29313acc41dc3427e5b69f01ec41046b8108b5f260a7c333d02be36d4cdfe0cb852c2adabf3fc404ec6774a7c610f5b0d99aa517593b7546d05aa6f8d0238c58317daa9f7b11a74f2df80ff6a091fd0dd29c060ccab0197f07602d64e3876f4374222f649ccf5908602ab8738152824b1aedd1f79d6ca0e31585c2ae261454635180de13b1d78b83cb8c40ba15d6bdc51158c4929854cd6b8fed251087b9a70de7a1c757be64cb02783c1c5960e926d4839c509354320b24c4df86e4f266bc1d3016e3de72ab01e8d5f5a435a5930251208c6b9c7c50d27648408625a82d7eacc9833ebcc88ca1aa130434db2880b4773a185b0c0d3bda6b24a178fa2b8a19c2e293fb5fbe0acbb07a3037e989d42c5b9fae05f39c6a72bf7b1f2d5fe7550b2e7346cd4fa4a98296028ff3b853100662c6f8a6ec96702887203417f3bff2974360c5da352f897f5c4a811292ca032e984d9c6ec9f6ecd8fde9cf9ad5f3c61c794416dd9b8988e3259184d6e6bf1d0208589efa7e119f672d8bc44e9a7e3aa55afdedaa9fffe15dc0326e988409709c8b693438b335a36651f22fb913512febef8e63b854702531c71f8b70cbf57d88ce7ee33c8341a08851a59abb9ff663668b48b0d8486f98722d44cf728e460357a1844cf4f0facf355a655c995a634565a93947cbffe2c1df6f5730adbaf4fd37561b750f3c7a4889085a06506217adf4f1a5be9c22b730378a0c07c2729c4f65f6e64eaa773828395ee91320da0c792ba7e16598a5b79b58da06b1e7d8c42657ff9137af5cd5eee297578abe530c356a3e8195ae9e1853a93d6f6965de5dca7922b5567bbca0d713d3196c5d6a43bcaa36bc6d561e0ec4814237ed8d8ded38f72fedf569e04afc2251a619d9c559249fdad5463a2f45586a0cbc2a33090cf25d566ea52f5b8b9be4bae3de13cc1e40286648a5fb8c4ace6bb32e80daadc6da9e280d5518f27f06e8d34a1b7e9922d0700eecf87409563b24914ef13f2dbff90c333af30dd0f6122a9bb747f01f7390a6cd4051eb8260b8606db2d8ec00a960cc615e18fc952f21f773254d94637ca9ce3a371a46c1dbfaef7e3235810c8944877650b922f0bf2ffa66391abcc9901c95fb60dd2212de8523fa18b13e8064b7d5098846905af08b38e2aa0360883612538d3384032d05de32fe1886cbeb2841fe8d8bd1d230e6d514fb0e04fdc8619167e6053caae3c703372ce58820983d249428e28cc8b47687749e8bf44c3a3ef6b70632dc0ad842856e80310c3531950e400466e35f7c91cdb711a4563511109ca3a742e9beaaa777b6c16295ca7595e7ff5603446f4d8c30a51b9b6073c30b6ba8dbfd1912c94ecac39abb47b146273a61a938b24819acc08550d48647852ea206d3d96399b6c2b1a767b83ecd35b5fce52106185e03813a853f3748d89d6cfbb5fcc70af9f6e52c56f3dd9741740aed76965cb94692e18c3454aaa94bc5871a2e93c203d1e67ff7445f1594efc0ca86a7cd26985d44bdc093e29a953023fe17ed29cc26da50153507ed80eb54dd9ea756faf097970b2920100f71761a403fcb2fa5a9282479a69ccce015301402c8df89e8d2d4f6a55e684998f7dbac2b97df8837cbc84022178b93f7d014006c494ce7eb5b56771e47e0da8af608cf1123420c86b717b672cfeebe12fe57a8474bd55f67f20a253a53270d66be202e5d0b2291eae95443e035e30ba08e60b2e9ff390ebe67ec3e6dc70d907ac08e650b64cac197454d6ae34b1a0dad0a78459dc4421ab61694081ae748a68e38cee873a0d029eb364e8ada51072d9b6b1c208d08dea48bd1190f81ec7456f8ca69081631b67f28f97d5401d9975cca8e33d590b3bc0334540e6212ebb890f250f1bfe39e47b01cecf05f17e0ba2a417e47b7cea42fcbf3e7d1b45fee3798bf41bb20cd67bcef9bef4820a79a4e331ad5f5ec74939c6836b7b6bfca3f329a3d6adf6ecfaea5a39417d0524f95db13654bb50011de46f930b637f9b3672ad63983f7b679e38b227d39923d122f2338a7cf1f8d46eb14aafd8159b1775a7cace31299797421291a9cdf394decefe1e44415ddc8d6acdeb293bcc122eadb1f14254334f9c3669fc739416eb202aa2902a7af4e3111ec80017e1d2cf6e1cd8f920f6bfbcb3f9070b3bad13eb060d9fe0dced5f6ffa35d4c79760d7ab8a714b18d551608587dba349603e67047612eba2cc4be8ad817037350d94258afa38ce8aae081e661f51db51435633f80d573b41966482b46a7dd760500c115a889010e90e51100d967bec0cd3f4e445e6c6bf4b5f7d7437b0d4c8a9e376f8f068e1d2d71123fdda1d1dc222fa33141a36bc9e1bd87c8365e5396fb5b0551e4bdcd065fca7c7e522a538e8d1b4f172898f3623775658e2e53eec81a70f8eee4b627c7ad3fec22a5754385815ea2a00466b8eb40d009d85a730dd7e5b6f46ceee0f7233025d6d0fc4687ee2c23baf2b7916fd315a157d2dcae6b2e80d49ea625762e7a2685d2eb735491aa803a727e57b3c294319fb2f6ee8c67ee7659a8181bacf3e4d12bbda326d73644a6bbb64e16644b485fceedf792c57331853a9967b67608a7a17d6c5c860f1c8dc750818c0845a94fda3f1297a8d253eab459370c12657441b2b682a800cd4da4c64e4fe2a48122019a0841b81500b2245e363e6b95dfb019620df724ce62bdc9b2f4c531a66c673ba8c635079ade8feff6058ef57b0d7972728a663c57392168b68eab9ef7ba1d627a47d508da8322576eed774fc5c0564ac0f061a1bfee4bc8fe61408dd51418580fe84cdfa177f59080146495ce70be104a9d853babd07819064b37db58ecfbb438930dfd61cc6123d90018da13373a2828da38a0b42e733a3801904d9842f443919b8f37ef71851f24265ae5df1b2627e983b994d5ab797910b9d418416ca24124c18449cf777fa08871c83a6a565ce1d3de9b468f4c7a29e004c3fb024d0be6707a3d5b8d3fd45996745ab59226a2862411bc48673d5b1dc7c42e7a5f7dc1cf3f5547ca5dd92ce7aa082dfd987621bf8817825499e598f202a6cd840e6f3c9a49751ca4470f39bfae51f90db718f4b67ed50e8f914d631d4c3f4491ecfcfe6a6257a9bf46ccdc5c78160af59b1e61eb14fecbac0c66d829ab9cd6fb3d301750a63ebd3c7d8e049ccab6dfbc907b50854a8603a12ab4cbf643fc4a7a24d9e397ceacb1ecfb2a1428889822f76167bf62ec7e81b26388066dd760077b77ea503e2a96eeadb71faf6bef8416c124f46d6f1f0bbf23a13f890f4d7400725813f8909a74a73f5b6e7e1e280ee014e697ebbcd62a7d6d14616902807781aa65680dfd2868782b31e0fadd68c184d5d6c57f5d11436a8555dbc9627651869ea6d796f057855c862a74dd8dfe66a5dd3daa0f5d8794dfc970bbec34f2407c80d5a82735b8a44622b3b8c0671b467909fbf8a6385a15a01cfd4838f0d9a3dfa87a7030379a52d178fa8137b15a2d1ca315193529b83852e595c9cb99bb338e3f3c3132ebc03dc9323faaa9b92407578d5ee6aeadead3cf23b2f71dc68cafcad3787651cf4eebba5a234d90ef47819b74755a2e083a6f91573c2d59588968c3b5a84387ec5e498defea88be3020fb4077233ed54d0f87c467cf304d3b94c840b9de46c335963a6bf7cf775ee24d71f79359439679dccdd547f1ea773600e30b57bd12b874a846b2659f35987ab8f8e8e3e35dbd0d336aa809cc52b8f8e2919af30b79a6a1890e57dcb4054dac5bc9e37861c2647b379192f09182f3d37e5aa409796cc945a3fa028e016a09a37b514f2b53c37f0c96377605338219d67c122d269276b02f233291277e67d05c21f1895f5400a60b15d81fa75a03dfebf836868333d22787ea7f2131d8cd318a48641739982ec2dcff25e30d4669f18e98d3cf95af1e7b1677e6c0f6407aae0acdfce4cf0d57c809ad3c0fdb06f2fe9593101b7d1cc2481301fe2c1a88555e229c167e924d6284d983f39de3b05e6c5c789f14b252b8077c684f991595ceb633ae5cc53f80cc58877b97b17a0874b43877961093fe3d6a6b39110cc4bcae803e8bea134c163c8702f6073ac539478a09c784265fdc6257a9b2b84d169856422a4688909152d88ef04f2436a34c33f1a8d2da41864c1a05ed6c29c5d28f2f28072c6eb1930b589c63b9aa45b67d44c07d9c560fc8f0041952ed27932d4360210857430b1d8347ba59b2f5d579882dcce666407cae64ed9247ae3e2cc79bebcb5893665cd8a7448cf3ab7108e971fe31f87d1b0ba939847611e4619c53d3ba3fac5d6b71efca6b50ab58e474c90630b9db80829e6f845e343e3d81a9e459ee573a24c63371ac57ac79bbbd2273592bdf33d6c1e2c9fd172cdc98710605b045d3d5aa3390907f4f189432ea2f2609a27edcbb5110c0ae43803e1d5d2992cae6d4b3cfcc57a3986510139ce0ca9a1abacc18b9a1099d4ce6f4433a65d39db841889e09907db8d5ee77129e50ebe4bec32981638faa35264686a052226cfed09c31a7e9bc4a2818c007c0bcd79b3189c3db1b779926b0b63fcb52d752fc2df3f0f8ffc6fba2b71c1a37b908a1dc518aa517404ccd4273f926b41a8d3813804f35641a934423075dd1fdd401da83c96fb5f021e64ac03faedba9958205a55710e191591500ea913b0f75880c3b762389351c57641e518965f2889c369b76114e0e4864723dd4e2a5702317ec3581a64866168eaee2b746551e4553c0d82c012c72092fcb77f55af2d3ed7767777f796524a29033809b409b409645068e43deaa63963ece9421c139e6e5fd2c8c3e5f6757d4fbc83d376ee8b5dd79a73cee95661ef1e955b23615cd5497cb412219ecf1021bb265171b5a83eef2c93d7868376545b273171e68e30d6155b18b42f1eadb5b6565b6dc53b382b38662f972338ab46ba33cfaf7b4035a78a7b0326b9b1eb534c41051555549144c9ea647b289824745ab77941e0f77940406190368176fddaf5cbf1f5d0f8e6f3ea20097af53145b551746a8f1e99ff64837f82d8fbc090cc6fdaa348e63ff73892f9cd3d96a53d9664fe72937b34c9fce31e4f32bfb82b2d7fb8c13d9ec8fcdf1e51647e6f8f27647ebdc714dea38a64a1a44eaaeaac31d7ed795ba8e0cc7b059638b067ff5c1c3ff43461708277c6dad561bbfa984b25a8af070573083dce21d15e9cb5f781a1389265c93c4d2627d4490a4595b262bd607e3b0ababd5c2dd62ac5df857141dae84885923a419d1e6d599c971484712713d3e9a12a66a924555656b84f97448edf0a4b8a75f4a5dae0d10e7347a91de67810e65076aa25b56baee6bcb23da9014ee7c479b3078aacd2349d4e5eb56abd56bc0a8b4bea123343ca6a5a90b71b748742a25b94a4d3e9743a9cbb5da3dbed76bb5d24474849bb97abc55ae572b95c2ee5a65a314325817677de543f8e4b2f90aec808c9914ea7d3e974381c0e87c3e1a3dc0dcae572b9dc1dca5da2abbb452a149d4ea7d3a570381c0e7782cae572b91ccccd49678bac1192239c4e87c3e170381c3e4ac24747f7e24e26261c0e87c39df8081fe1239306c7c4e240a0203b94f341a7d3e9743a1c8e5d1c0e87c3d9226b64911c2199259d4ea7d395381c0e87235bb830f98077f696939292703a9d4e67816c901db2394b448e3a9d4ea71371724e198873ea54453909c7d2d45da53a4f10e94c52f90d3cc59cf4793949e7249c93720e899d385f9026a0f31aedeb3a48664bef1d71aa11c6d508446dbef54eb9b5d191d3ba4d1bedebe38b52dd29773d72c22877f53106798deeec64571fc5b0448edeadc619c69c6bb5155b9545c26822715e1f3d4f7b682d8105fa2c52ce21a8b1d6e5f08dadc2438d848be0a21b82b888cee9208c873618dacf668b6dae8a7ba39bd0b910d5397c243f2ebae93d731817b9a9c645886a8efd61936c5a073be7eeecf38c23f45c337953fbe19e184d169ce1676482a74ed237ac3a1d14513b53b9edb2b8cdfbdc26aab8adc4b23331e6b655cee8751c81c0372f9e638ee2e2ab97d15d468fe9dc15173fc5474dea2ed4990a5d4159d00f55115116eab3448a23e13415959b2359bfafac6151d449ba0b75b6e2d93d16b76930ec3c0615b76933b0dce65d20c56d5e06b6b7819d3da09d45bb7b4e5174d1343d34ad9b5ecd746fa9502709ae8c0e82199735d34d6ffc5454549c15963a54ae22ba698ede43f453e3a4a49b7a2b3efaa7429d649a8ee688b27c74b1d4a1721305b223fae9e4f83849446d26eae297cbb236963bb6471cc7511cb128beeca6620aeb6b1d5de56b4d531b8c3d3acbd73afaa87a9c2a45eca5d8a38fa6ab1ee7a6a3dbdc7404c1d1b3df233a296b25e4288e1e963571343d6f13b519b159de66378ba9e23ac91b7267e30acacaca8a9b6fa2b29b9a28ce4d73cda4d7272e507467d90623c5457267367db43378b27cdde4a36e1afaca076185627e3e8fdd2ad406204014d406dace8c1443455b56bdada9e92c9f6b3afaf72059d3d1597f56544d478fbdaac6461fc731db9acd9a79f737a444ae899f9b4fd0ede6f399a04b8f2059efad48ee355f6ecb1acc6dd8172a9ebd061c75c61243b9a04014ca5954409798699a1a54691157b86ff7f189dbcf16ddf7789ad2344d5b5a3c5dc1c2e23a77a672bbf9fc802c207a45d3479d3b9ab4ca8a8f1f913b63f1ecdfd0bd897976f0ce44c749541eef7237967dc55f2227749ee9d955743e0288ac81bc829d4b906f1903f9a6a2926f2af9a6e236d55e9157b88a631616f276f3f9014d14751d6e9afeb7682bf16e9ecf9d8978e5e66e9a7d85ce9d99a84dc54f2aa8d5c069c3597996c7494ea4cb4decc56de14c7fa1a6f905d562a8b1ec19fd00900baa8118ba64e79c6467b2dbeeae5ea831d96d3aa9866f31b300db72c7c431d11ea6bff7c03b9c0445568db38ab3a0b8ed16d95b90272249e52b7aaba04020916f482a9ec395a71ca9f4914a05d549fa88c572501ffdcbd1c7e1b1db51183fd64a26e9247aa795dcd335b9a67b6323fbfce072d449a08916e9a4179a6f3aa916ddf4187659eb249d44efbe13bbf2b6e9a494b7a1c27c43c99e7a1b79f2365576d407f1e19836f00935292a43928fe5be78c2994de74d413283537c99049b30d6b1d6abc1f2466cebdc14df59ce3abb5fbb25707364bf2ccf5537c57ed1d6a7511aa02b118aa1185ea0db69bb44bc4ba4e6b8a0e658c79e12397b36ecc0e10a21c9b1846de9e692ad67db40e2ac37a571673037cd36d2d45da53acf2272c9c9fad0943c830ece4561b49ea6ee2a8cddcb169cd62bcef5c630089ea74ae58e821883605963eecd472ce8775685a831d66f0d8d796a8eb515e8a63c35a71eed1e6e9a1dbf888350dc2d4d2938470f6b8c9ec4c5652d743305a7ad52613db3aa1412e0b9d6e77ac6e1662970b8327f307b0a93336a3b796a8c759bfb5830e2120c8f10307ce5de98634512d69aa4f33ea623e134135da254e2921035e76e6fc4ad7705e11b1b38861d3c4f95a71a0ddad8f33c8c51242277e82ae162f43cd206bea9b35a648bb0b548f67895286b1e6a267189dc19e8dee79e83fff928faf7361fb26d897ca0879f77e92ba13db45f226378fa906dcfcf12c7490c9410833ba4356aebd9ae1f93dedb78ecee91f6f07cccba04deb4246bf97d6459fbaabd4af0582237c5570a35065fd20c67765d4792ac65ced9af127f95b829d6a1f7c86e3d04d11bd9f65c2a6e4a9ae1b43b22978a9be29b8b84832393a5a93b11221bfb3d527282d6f3b3ae927bc37e7d8e2e90bd4336ce5e83a0c411ec3a8923b084e244aa1689a502bbc5d841105ff004b110294eabedc4d1f1c103534b7da55063d8b1b07117f639868deb3daa31464ecf3888bcae2b944d38b3e30f04ad97a8eddc65798573fc746823b756b5c4f148bca6697a8dba4dd33fd33f33f49e0d82e79ba028decf7e9fce1eb844dc5956a9aa4a55bd1611c5b0ded9751c8279db327fa17fa1275abf21f4e336f45a8a1f29d6847e9c36ba7ea1f1ba2e77ae872e5ed7fea1d968d421610bb746ddd771be59c7d64c24cebadf6224acad4ab6d540bd21415088d6d65ea2ebf9f5ac07da258c2318b0d7993de82c8f711e9654636864374143a62b1c99be70fa7553d2393393a6ee2ad5799a864cbb7d5df6acd56ea544861070b5dbad94dc64b8b016c28ba80005881002c8104086f8d2a1b4da5b7aed96d56eb51b028810cef2db1563f9ed8a41ba340fcf6ae7129b3163064aea6406ea3463866cabe8964541232956bb222ca89e20ae4d011113141a8a0e0c31819075c66901ea43e7b67614023a0783b1a6a7c959fc4dfc5f7bb01594d48bb54a5f5a62ae164c4c2a95926a158b974aa592ceb9e4953c0178b98483837370439abc9436419d56380ec22bbe569a1636387b9e795f6f77e94c5d88f2eb259b91d93a890c843d259bc9e5ce0b980dfb5a63b2afbcad3335cd8ef27ab3a6d9597faaac9a66573dacc6e4b1a619a5a667766dba86f1b23ffdf50365b80cc1e16664c0502726e4e747262614778a7df02d0686469a5ec53d221cbb4a762998176d7232a5503809efc872677ce29c417a1928e673502ac5e4010dd27b159d59d658e8be476e8adde48160ec284657afa6b88f8f6a2f2a8e8e6e156679912ed279d620bdfffd7a8c044f81a96841c2b12353779e65ede416b929f6b3bcba9b625d8df4de31153b7817393115b88a9bbe507c140493f4fe25e32999eb44eaa84b84d33f9d4589a3e4d96950e58ef6928f2739cfc89cca1d1ba4f72ed40d7d82031bc8d3a3be5a815e9cd0fdc131ec2e7f8380d23b94b275ea29137a6f28a590ddd99d4a6503e9bdca26b14929aa1ca4f7a91b48ef4fb64e9d94250800e93971535c648424eb702c2b41e43aba293e72b94c20943e0a80f4b4c909f503103c5548764be7227db4b00a7bbd06603a525464530383f1388be874352c5e30f1dd2b014873b358399b3880395ad1ff4c4569bf7c46ba31ecabcf4db0502999e8246327346a8988328d0cdc19cd399028d44dde5dffbbf7e53e797d6e82e8a679f5b68914d4e66c4e259bf9c19903e93d89e2241cc34868b9136e9ca4d361442100e9a550bc07b7d681f4522805204dbcadbf9a5aca5a0a8a916ce024b7e092b69438f086c14eaf2959b4943bd94b27a9d4494a9b9c1c55964067c7ae9fc60ad5d1e51a16698cb4e789c7ca1a8aa75236e9ccae834fc60290dee7edac87f142715258d0a47238863df6d9f559f7b9888bb3562dae1df540c09d820ab5f8e981805b850aa53ebabccf12d9a526715a1a9a1287e7da65e54ecfceaedda5dc79a9f696ccd07c1334c5d963ca5a4663e58e6e2941e083f400a4f7f7c507d27bbb354c02f01429141f9da018090e645e623ffc00fb012575f203eaf4c30f9eeb3fd1920d3dd1f26d791487f25036f23cd44745b2f378841d9460679d2b92002031d6151b4bd0be3e22092f929b5e51b7b1eb24e777a7b852dcf4be7cc6bb9cc6b758b068683368d476562f9b81bd80897969e1c25f32e80b1797bbb06939ab863683466d67d59ae12dd7d73dae56ab9567a25732af6785ba3c0f87f901f8cb0bc0631e076ff101709bff1c5cf60470165fb7cba02f570b00cf4a628686458587bfb91dfeea2ed12562a9a951a1a8a0a4cc0c0d4a6aa5dc5121615018bfe3618f6b8a1de64f35c51ef32835c5fef2ac9a626ff1b01a83cd9a6214c7017e7bce52def0dd63856c01bfa64e5a585cfe7f456ca328da926e151595949c7996d3fc0a01df00f7e119e0dfb7601e925658ab95a4063c0b286828b7027b1a7ce671729ce663f8015e01cee23daf79ec32e8cbd562b95aaf1a0d1df87121b5905e481a0944424ae158565e0f3cb0943be3132f240b3894a6ee2a15c6433ba9cd83ef55769079179f296b303edaf3c56b596be1e30ca9bfe6e0ef8cdfa3fbf5d7e776af90f2feb4b079b9432eaee682b26e4017e8b2286f504d0d0b1994054d8dcdcb666c5c60625e5a40c162f9b07e6aca1a0c65dd6a4abb6341b6fce572b18199456a4897c3c4bcb478a1ac24ca9dd87641593f4170f91c0ef336f8cbd7e0318fc35bfc0db7a1f91afeafc365fe72b56e666adce0ccfc6b7fffda58059dc590dfbb6e64c8ef5b1bfc8a6313e32f2f18978b0b8b7453a4940d7eb5ba52c81259a21722a9da2d2b5eb08051e3af18650d36be20710ef00c70161fc3e6b1b77896c7fc0b7f79170ee33902fe87d37619f4e5f2bc858150e039f0dc4f070cf00d7006bca525e06d90906dc0db17a51dbae98d51ed2db59e86bb7e86bf9ec680afb4961fde8370cc85e4bce3dccc7e84e086b080582d6614337fe3b2c7f17fec349fe32c3e86d73ccb6ddef316efc2633ef49795cba02fd7ca5b2c57eb85c33aa150e3783a9d4ea70f9d852f5cc08aa07041e294351734983e17e58ede2eca5a8e0c12f6db679e06194ef33aaed6cbd57ad1487bc238adacc538adac91b78bd3645a36352ed03d0c53e2d0fef94b59fb5087993760f15ef37e83ed74395ab9a3b70b0a03c62661afe3331fc365bff27f1a9c46e6b1d7bcf7c2637ee62f1f3accdfb88ba32f578be56abd5cadd710245be5b6140ee481013d3c2b57eee8cdba15d99385d3286b324ea3ac91778d8f33d017dac1dd8887cff10ccd8759c8d02877f4ae4159b7a219322fd483a32fc483b3781772d3eb34efb71ad303ea381cab415d87ff01693ca00e8463a994d78aa0a041ea7183ffb0a287bd7638a150a7d3e9743a9d24f1b3c3b36e3826043704686766dcafb73e56c8cf8fad515adcf720ec83dcf4ba8d928871c6eb7ff0e1c80710b01b365f7d78a8a1acc5a0ac5b0d3684746a2877d450e2c01b86c360ad76de76b7e735943bd8573ed6a87183843df6999fb9ec6ffc7fe5348fc3e273bce65db8cdb3bcc587eee2322f578be56abd60627c45090f392e1e968402a09b99e7c0731df8295be80bd528887e68c8aa2bafeaf033650ddb604359731a978bb76cfe61ba99870d7d48c012e0c020d3cc4c9abaab54e76962f32c9767dd84b47816aeca6a5e2f9b296b1fc69edb30e2205bfc8ac774f81d9ce65b643ce6a5c34b0fee7a20e076418578f0968aeb0702eed8ed08960fb0fc00a1a0a677264ddd552a241f125b0a177b58fab02437bd5e8087b53c0c4914fdfa8a8705b13c0c0869fcf60fbea99505052c40e5cc4c9abaab54e7e94819b74b6e4be1583796cf4dafbf943baffd288c7563dd6accf517d68d75ab39b5da5bc2ffaf6d7bf81387e79fc794b50f752977b04b0902975295c33492a304018d1b6a3a6af86b475983993700400c8c8e9758dab28265454507aa032575a20375d2a14356fafca5c3571af8759f77863d67a1f9a6ab1d0f5da1e09d220c7f5837d6ed48918831c69966c1ec347cbf1bde0de1b46efb6e62ee2631c2fa3399c81aa773ac552aa37cb30f4c61b5f706e9d36b3dbd267264f672d7321194d347ae9114f706df6bd1aaf1973da00a0494da2012117005539e1645d5aef7f3ba30d6151b996b0213e11cf66e160fd9b656697b64cd8552e8d088d4212ebc1e0eb9372491d0c8d385469e2e34f274a191a70b8d3c1d4603e477ed2d795ec6660e0bb9229d8b6ace0bdf7c6051cd01b2d144b1abbd81f54c71e9e191ce59e106398363288ae10892f806046bad395ead391a5f93f194fa193331c56e7c388608c193591af788226bcd194731043f6f2c95a76e22df7ca342657bdb19cdb57af85a5cf22319eb913cf18d4fe822388a5f6963fe96152c2b3efe297a2a1bddefb097abb54792cccf5aedb1649ea389cc9f3ad9e11f21a2e9499a9e50272914550ab962b55c2f12e68f9239e79c3dafb4f02b4dbbe7587f9ebff4628befbd71bdeb7161ac02c0d8cc30ee9de570d3eb3cd4f4da90c0e5a1ce26006387656d874f58c3031d099016ba0ff6e74ea0ce6c076a8abe15aab119549aeb44e01bfb736736c876a0ce6c0bea2e6c0207fb7ac54ba83330c2be7ea370dd08093e2b2d2883956683eecc8661187e59c4dadb21f8915dd0350c83864d9561acb3be20146acd0161b44a95d6197fee1f897fdcf95160798630c014c70646cdd1645a63ae87697a6dd539dc9efeca2d7a26778a6f44d426dbec6b63b3efacd457483af3a571ff04fdca70cc060d1b6a4e8671d3706314a74c0207870fc6194fa648671739c13b8bd9f5071f8130fd44dd99d08fd34ed7ae6af9ca9d9552207c10c399dd568f7e289ddac59b9e3e80a1589242a79fa2904903d5917d3ad8871f80f8d2add3dde32b7154ddc6288c704684f1ea0cae3a954e6cdb08c2697d86345d4c54e7c6aedf98f779e50da31871ce3632190c1c9cacf18a7b46b554def781a3c618fcb014e3f77d38cc99c4a99c31ea6457591af357a598c21a3876bd7261df7a857d6f5dc2e9b66a8413054df42ca17547a6e9b889a8314f9ca452a7a9ceb0572874ea8c7a433a6a573fa92fb20d6557122562085b6f226eda831d1145d4594661a450dcaa348a3a9d9c3e935dfd4f50f96de8e7f8bbf139fe524aaf298e5d27bfe29890e358175635e764923271506268723a4d53cb459a527ed718e96048beaa143a4f53a9f40a7a63ad453ad86f2a6d444322ec10c6e890adee5ab6cd0ee19b5d63d7a33882c555a415ec8c3ba33ae6488ee50b06d69a931a43f0f3c492142f8a0f8a300c25f56299ab34b6a2c5d5727939cf131ba59e899b39c8334dd3344dd3344d172e34110e8ca7565ecae2230c0ccc699aa7699a2ca9c93c65b69792cdece090dac4649eae639026dafbfa953b59c765080e372303863b26e4e74726261469e90cd2e4555c7f8b119223a42a6e5a84632998171a282dec798763b71fdc132c3fb8a0d690ce6524fd2ae83651e52a725246ca4936489d91aa4872d35bde61939d22b09c8414e3a91893799a7946e6e442d540ea6f999c68161813161816cf2407a95fb54d5254fa53293a48fd27db5b95281000a9ffb45b9a4857e4a6476e8a911c21e1983632d14ee8a217978ca489329226d2b8928f3890fa4d76cb6b24463856849da822c9eea63a1c23ca489aa87cbdf49bb447c260facf22a37bfdd76b22276e6af29fa4b463af77375684a57537c5bae8446b25d6090fb5444499468644a42be204910e9a483ba18be82213adcb483fd04f22252551a27f70ec866355dc74a76f483be80fb7c90e062051ef276f7baf2220d18d6107bda5ac69224db4c2649e264a2a95224200eb73154919493ba189b42e6600939c3d94cf55c4f0eb85583cf69a48eb74118e612dc54d318bc557de8a161fd3343d9de7a965c57ba942c231ec2012514e62d17f5f10e0c128205761929332d20216b00094d4c90250a7052c409f6e32f3799ada68632fc951d441fac806edecd9c0044776d6d90679b7b007bd00d0400690d040109e231cb0001b037af87800047a98800f104134e0870422308167f120be468647e06d1c02dfc21ff033f7f137dee371dcf631dc01ffc2ad069e026e917822dc66e0ed2dc857c079be08b73e47b88068000316a03d002ed7a87b28c193d42f035524cd27c06b1e012e7b1f9cc51fc065bc01dc3fbff91f7cf60a28000630e02f848448800f331be73dff410118f8043ceb868067f9f0ac033c4b88019e85630db9dec516c8df21a11b84634197a8ccb14ca73d9138ff790b199e8b4ff3963b28523f8ccaca0bf1d4d0c3db3a53f3271632501a949a62f4fc1c63c72c72ace1656b8cb2becff5d52ce9964b4a4a8a2bb657abd54b26a69bc562953bdf8ea2c5d328f016b0b7165952112d5aabf583bd2858fe8696dffc0dc7f91c4e8107023a0dffd12ce015f8215cff8a228a70188dcc2dd9e56ca0e4d66e30ed4cbba1a11c5a40baf130221b4ec2c817a942ba484da67e766aae16f6842877c6bdda3dd122f5b3b06e3735ed4c3bd3ceb433ed4c3b1ea8a80c09c19165cd6bd17c5cf181cee25b2ee3692e745b2537ddddf4eeaecf4d6fb7fbe3811fbada95b72c9556fc8ef130252f8a7877f1a0fe03dbdd4a251fd26d60856f170f4f0b8cf573629475a3f91cbce609e0b2e7e12c7e002ee371e0c1b1dbbc00dc75810be4c0e3f31d7458b2cbb90dec057e95030104f0ac212626a76a6fe9d3ffda292ad38a6bbb58c8d676f1f0bce85fb1e0416d118e5d54296475408c2cd24d41ed492e959249c552282ee4892af593fab9331b99237333a4cdb76a50e08df0179fe3868ca7398b9fe1321a4ef39f17f1439c3e0c8e447c8f1bf196666f6f65a5902d41d0f3f606d1b8de85bf3ec70360c4571acc831c08c740cf6706ad052b77be1d85cdd3665f03e76df88b96c700593c8d9aaf398d890b0810473d7798c97739c82169c1a591760a8bc5c2dd6280f88ffbf8cdc6c3761df8c90ded5c0ba2ef60bb9d0aba73a13b8dfa2ef5b3dafdd098418b816246468685494646ea97ed99991a92e5017003ceefc871c306fa2f1500ec7858920c7c48c70d9e732e38528e1b36d03ff74b65c6e52a6b9fbbca1a79868f3372e567388dec3f67f13597f134627c0e87f1347ff137e0fc0dbf791b3efb1adee277dce65dcef2a0d7f03a1c46f3ff66d2d45da5425fae75a02c180c5ded66ac7637d072dcb05163877c699f1f213434342d4896dfe1364fc35b7c0e9f3dcd6ffe06c7791d4e811fc28978206e6f2f84cf78ad9ab3f89d1a4ef333bc8837c22bf016705d441133be1b365e2a45680777e8b821c70d1b2f9519bfdafd4a89efd46868d0f583030a12e2594334305859fb1c56d6c8343cf618ef398cfffcc5836e6f0fc489f82170bee52d9ee6457c8f57e08d70fda51042c03e23976b5acba5bd0f14a2c7080b0c0164b52bbaf9182f705c415c856706150a42030c1a590bd17550ac5afc76f1f0f0fc6a87632c1f21b8218f5da8a01f8a51904565e53f97caf790c3b7e203887f1ceebf6bf8cff57b5bf61548ea4706e4758470700c6707b6c152e2c0fbc32d772971808e3d56eeb0943b9f833ee6e494b5cff5cb36e8385fe3c5df7018fff2186fc3697897cbf8194ef32d5ff9dd72bd1cc9b550d3eb9786db666ce9bbcddd3404330dfdec8bae762f97b6e7ca7feebf9d86f73cee397867e3cd8f3f118b5ef38b5e4711ad6177187a88f6d83a77c4f6851dc370620f5d7be89ea73daddd26baed735bf6d0f1b340f1cb1e0e7f04c13af2d6fe036b9bc16f899124d41c38f2c69e15461fa7eaa636ad466670db3695595d765395108aecbbb119f67519be29cda3d3071b7000a2071f4698c8ed23379676dd0610461515ada2d30d4a422bbb1a89e2089825d8b400b5ab91a20fd07084550e4e444800c50fa9640ba523229c76403291b2ab112323589581b5ab91278e8c3c51b48d18ddaa0a2575823a9998524a1e07c699d37a35c244d0101191cec8108a64bfd6de8a2daed67677053f10ad41dcea40605b570f77ada15261571f7b60b7bbd69c98fdf9f891f8abcd88cdaa01bb6cdbeefe700fec77d7faa24e91db1f6acb20769b368d4e5b456dd573588f98d836ac5db63fafe50da6d1f9a11ebe4683b8db26db42a1d72aeccff5a7356aebb161dad8a69fc523a4856ef7a5022df4cae3bb42ae45f880f63cb0026fd792470c1f1f7cbb963cf21494e031b3841f84bb963cf0145a1081b86bc983256806508c4982e0042390bb963c5c1e70c1901594b7053e5f10820f4abb963c5250a0c11148e6ae250f4b851964e1052658b2e4dcb5e4619202145e708623822c81fd4d5be3c82cedd8593bda593b8eb0b4f00700440f3d8809f4eccf035069e34e0f3074f24be29365580a91ae834b17124931f4d28b4e92aeff474dffd8e92154f2ba7d00d942226afae73a987451a4953c446f22fe20b003c0f4d047fc3832902d14fa584b1e68791369245ae650a2379166ba88de449a888366db8448f7d193c4160a499287597211bd552a68e510a46069c79b553d6fbc77885e8d30a1c46655b41a61626857234cb8608f1e895fe847062df45a737686625063eab6dd173b434375a6ee8adaf22d6f785ec330fc20a167a087765a608912872668a2b843973abc32871a131ca185a8113658c106263862051b988008b4b0460fa1d0ebf651c416ba695aa823e54395954e7a101d9b6c87b51a9d5e69a4dbced2892e81dd636c1b90d3f65185f002236ccf4d4f0a22011cab475e69e4d0166df58924046ddd0307ded581986c1f19e907bbfed8313af6f22de091baaced3822033d342496d0de430b5d973868d0b6f416677538267a69241ee942a3231b6483706eb3414132d0435b02bb290467b5c1d83d809cb60fd80d984083204be0407ac92b8e95d020f786963fdb766f24ea7369a1579a88561ceb51519ebc3dd4565da33d6af4ecea4050db87005890815dbd3e7186dbae28abfa1047b66d8821ec7a84a5891e3e129726a2aceaa2fb80b7db0d7f1037d000549af8c35cb2ab8f45352766003db470d717fab1a1855e4b001c5197ec5ce78a7fc4b78416a2208ed5074b52084b2944f38991d401996f50e21abc1231d828b2be12496cd44dab11254c647d233270c146999c94f8b1a73229df14a5e4a40c52803f73da6e112ae8ce6c57b76f2583111910ddabab39f6344b65bdd6a484bd5a5db2596063f41e7df7a5841187b39e8c19051b45cf5a1c5bea180238bb8775ac73a6c174daf4b5c189633638f8c604e2eca62f7d7ad3ec38fbbca35b94476fcf6d89c3024b962c29dadaf3bab14300676bb447bee6cd27c0335075679507ef1b559795e0dbcb20b97326f39833d069bae825cfa8cd732fe57c82244a7553f077bebfcea333cfc53d257bbd308ef64c61acf63e52e75e9b3ddf9c6dd567eba6f5a6b70a1c132251880087d4a669246164bb258aa09ffef987f1978e63e93f0f9bdeead1c74df2dc5de232832469376a86f2efcbfb3b214b7ff21537cbdae72612741358ca1bf55e63b49f1e85e43c4dd7c1e7978ec7b2ac8d5b7ffe4a37cbb1fc47bd0a49054b27f8e4c11bfb46d175dea26e69d1bd15b7e0f7797b787bee9538bcbcf1fbe9863fa85a9001097659736490811884c1075b7c8e19b555297a68cf1ad5a171532f3f8d9b7a37c6d69d8d6e4767e1b03eba456db6ef615fe7a6dee9ad3bd3a3ad679be011e527b78935d175b0f825b73611e5e4c997dc267a2e394a47ebcebc96b55ac96d28963a50dbb351a8adac69d7c13b8eb034f206782af58ce58d1a3392d957dc667af6fcb98882a50ed0c7920649d77ee2e2dbb27f27280b07ca4b8ef212eaeb064b193549953a469be89fa7507ffae96d26a8ad67f3d80df6281d745ceef4ec33657e8f12bacb27c710ccd7e28b4bd93cc2e9b92d6797b162ac4677aedda82b7a60bcd6cc997523df36deb5bc71deb04b3e881f35e976db3c263b74cc43ee50023b07f143c6be35463b8fb7bf20befa03f643c6b63546fb0fbbc4860aa3fd7b5ccf66cbf3e7632ef3e7b5b4c1dbb9afb36b1f537f7de5c8cecec271dd8d0c39b13f122c47ffc41a4aebfac92d8aeb37fdbec95b7766bac5a50e1d3d78e5ceeace9bd41a13ba2e7564b75ded1a65a1a03b3d1be52c1c2937f1949bb8898f21a93f1f6169ad3b4b7dbd25e92b77567fd82df4a3f2d2a75c2c6be81753bca483f1e92a6fdd59e9734b1bcb1a7a4c3dca7b987c7ebe4ddbb09750f28340757c8e3d7c9c9b620fc52d089cd5c8d0146059438f0f76ad3063e8a06c02f67a69df9ed4155b301ab16fcfbedbba456d46607cdfe29859c20f966cabfdea8cdaacfbe8a141d2c628043cc846853e23b6f52ab06dc641b6d5a804302a14a4ba11a6d1500f6eb40fbd55bfa88d88ed3b9cd568ac5e5772bef5d8b0b36e881ba33fcc5dbd2e61cb50ec77c9ae5f6b8c25817f9e0c50f80923006d7cda18e38d31c628d4f7aa15bb3e51042f14e18809635db1e1935b4fef1add6a4e764b853dcff32ad1f9cb18e3ba60358847f2cc26e4fe40d49d61cf8536683f8b3778bf8b3f1cf690cb1c9084a80daa31d7adfe10dc9fb7c73cead123f5638bdf2661818032cb060d61b546b1a4d15cba331459ef4cb44470d8617422863a220ece498acc39952a83a8792864eb43a18672281b99ecc42c9d28286510358bda2a1cbba2094c9a9e4ab2a452e14c5e1a7e9c267a4d6d900d7a21b1d2ec90cde13dda119396c88d65d4069da6921e453225afc851770261d4daf33e30fcc0d0db1de11bbc84bac408380ad9b11146b2c337b8489fb8c84bc21ee825dd19fe30f6bc259e18c0507f9fa7bfacf388a0dbf703635d519df500effa562d9a73b01b1a4791479dd689466291884474c211923b13939c5067e217c49c4f3cc237e2f873d32fd4d9288ae328eef0cd38fedcd93876a0cec6511cc771ac310319a3df217c832393e18c41f8468663191c83ee4c26938da30ec1ece995d665218cba6f0a3607ab76d6f8d35aebfcb9167e4f8260c641fa471c82edd04808e7b575cca58ce2ab77dee20cc4a12acaa0de800ea22ad106dbaa82543708a226a8244cd9aa82d631432202000000003316000020100a86c442b12c8b924490c50714001076a05c5a4a1d88635190c3288a621832081940080100081818a0a199014de5438c2510b0eeea60a775540f78b1cd1d211611de70ad4521ac5261533442b96b22407a85193880aa823155439935a9f854375e852ae8b0c9c2b3b6ca26b6948125a6c8531a4b13de2b913bcd2b8979cf128d2819561c58f2e13b4f8d061c025fd1771c1c4875184856630f6d07b0ef7d4017ddc8c34a5e417ccd27abe13d9a74aa2007e30bdebfa51e9f1f4605bfb3f0cfbdc8739ee2242490ef7065a54c57b63e839f0c0419412d431319c10e3447221a9633600b73a47b91fab5e99a4d0b579a0bea210b78f6e0342936a071254eefad34efd8284d5ea9c35a1c792e709aeb6f25682455b972baec2325b01bd94e47cac3e8894910ecf6721c4d8d9c33fbfb80e540e575081658b90f8bfbf778fda37c00e1aaebc7ff64b24ed6f2d2a3370926d05e5de5f9a792f9e45d3bd38824de113bf68ed8d1ae5a2ff623e9edf29c4d555956551df14cf455678e11a22426ecc6759834a2f4c46f1866ff1f03fe330de34088e968ccacab8ea364e11b548b748bed9d01ceb6335d14189c67a02220d7102767fbe4a58a51351bf51a40e5af6355ca007c94f362a7539c26b22f09e55a0ac142dda0f4b7c285281936235fdd1ea8580ee319cb7d4e667fd92a36bf19f08435af838d9920f2d51c968c74956354c6be4b6da91fdbd05c12241121c3873d701ab75e45820d4251fab08a5ea17c63bd46a7b28411d1c3727c29c0ded0094c1896945b9a273a76205b7c269fd154b6b6227f1440fe53c1ce058cb5886e0887b09bf5be6ebec059212cd039e8258507fab6d067aa92f4ed6213bdc69decf79ef2277427dd77a92b1392fc68fed6672d3407b03b61d0076c4a3394eea3eeb283f2444084ecc224d2c06225127895b9d3e68822c9b1a219a0a3628de48d0f027432e94631ffd78c6b7e5740a20f8ccd3fb31f4a54b38fb9301a20ede6e6d83e37affe15d564e434124c2ad84436ce30465420a09b222cdb78a08a38d4a450847712fbd9d3069d07290f67884c33a0b5b7d01939a3071ac4c61efb24682b52d07ba5bcd605d6eaa3413fb4bdd19346d6e879ec7d679df535d393631a7878dd862e656702e5b723b7a3779033afb61531b15af2dfb68375d4901abfa05e464b82ea9504f3e4f7a4ffafeefea1b9cfa1e7f04a967cc8e323d0cc9802a0f05baa2836817bd7ba3aef0ba29858dffdd9b4455afb8b9631a0a3babc1d36d4efc436be6b80f29e533fa73ba0934da0c6a637251e05982c7a330c3b43a770313207a239d1114d4bd79e6aacc5f6988bcfa8a15411b8f9ad97d48ffc64117b12794034f5cedd9b1e39301a223cec997df9ac257951c50e9d4f0b41867c6245f999954164fe365fe46ef0b207965c5d4e301cb9a6dbd98d289a42fdd23cfc2d6328c9a10c159f3d7e5a77c7d136895ad70ae6f4bd8dfb091a28f903064cabeb00140f73affe16723bd398ef1e69fca2fad4e9d7179911923379a0bdacac4027183678475053824caeff181f42b98860216701dc7c302d509de15e6c06f4d7a44668dc0d14a969fa09fb1d960d5627fef12782608be8b579e526c0dca0c3c5bf7c0daf12e91edf5324816b16a07d739c8702796367d34d2b1a2c3ccaa6458522aab754c6293a7007bc1147a8bc1dbc3e13809acf916955b5591384a530eb8e437725de32d65750641033f7d1620f0a9755b40d3bbe55c1f0130975094f17f1320a29f6bf5c3557fe0d6e1494656f9ce9ee46b4bb6219e4ab5d227d4ae69c50b46c815f22b8c483f7c5fa52a3d643bd96c41e38b5265e11d61182df1b7b09ab6e541c827b804b128a0bc3821d698133f2c13a1c38fdf27c9d203ebc15b7850356d6aafd03806a17288a693a7e669cd159f21b0615f9ed963c6a9b529b8480480f8e0a0b7422571512c73e3ab546a588309b28889f13b84bd81497c56ceb92ffde0a5315d564306ac4808b03ba8b308b386ae453994cb8e7118c916670283a9a70ef3c3dad9424db69d9a0526fb03c009aecc6f98563e315c8786a3ea804e0110179aaa6ec97c19af133e6ef718677008b08ba831e8829ba99b1bcb9c9e960791747720fa22ec9d99426f136dccc0ead1e84aa39499518da753b8bdfd4b140f5d1d16862ed58da2122ff92be6f6f0195005896b8b20c780ee718181e04960da593feed130d1b430828619d72c6e51fa14e8a8cf84aba6981ce567342722b3e677e7a0689554974a3081098866ad6dfeb1e92621845557a5da9093943db83fbd6569a3a0485994f3f6ba5fbb718949b82cb002dd73cacf29560e9f256dde3ae79179159697995cac8a4ec16da0a9e630237d639508befc789432028064c83261a1d1f5d788ea9a69402ad35ae130126c75ed4385b0f4ceb9437d0d5a01af71d0276de1d3bab52c64e6998d62a9d2e48f0439ad6d60710c581e669a01c008fe9906f5a5916379116b2ceb91d9c18ee8977f306270c0673c804d0ba24f051f8e89ac6037762625126e4623d5844423662f2db4215e8b96df897625b71b6d01a71a33947cf7ce31c64687c89ba42f2fe4c74cc0821e0bc827522e7604d52e17cf25156d617d9b8f8b94b58d843d2cd35e2af9ae1b8e56c562538791e97b5f97192d99017e3f49d698217ed8c5e2d1713b14c8d6eba5b720a416ed334a601d8621bf4f266be188daf80f25456c26336fc930f1a3befdcea73b006f3e494cd18599c15c79d25ecaad3d1190c644785bd9cf4c69431f49a2c224db2cc9590a320001582195523fe4f4d6a68e77c02e2f1a34dc7f4757fd82f383db3dbb44702f224b2d65e97a73a9d370d43c3b437f4c7b7841a3d0b9ace6e36f0f53ea89eb6af78252bcc26ce5ec09a12529cd30ebaac857f618e45121756a0697cf98e8053daed1c6445f062b640f47adbf6ebfc218f826a4b34186647f4f7ecda1699be1373af0ab2a95aeec8c6771a6cc68812ed65eeb3831b8ec326e023c28c064902f9db1497c47a4cad0024f183c39725e6e58d39056f3e49f62c4e5a05beec524f3ab4031671505274c19d3bdec1e7ac97fa926c776bc8500eece2fe92263081bca3e5c50996f26106e12b97021e9e387a315c80806a699f914fceaeb1ad202774c6be1831105d66595401d172703556de1d2000eb8bb2d09ad3ca13cc9d024393edd1e22dc66e1258a7bad9b466a49626513e46a1048319d6144f81711107e738d73e2a2f5f462a6ae4e26aa593303e8099393bfb9cff9617f015cde7d6d8fcc7947450673708c9cc44e28bb30c24f542a34b37ace4a796697fe1bd04e5924d981d6235c906bdeec670a47acd028ff615054224ecccdbcc916a464ee264c82bdef563408f3a881d3e11aa8394efb104cc8f109eca08b450a07d722b7c007e9df2c8361ba48f181ee2742a6b5a0b57ad53835369d736e4fa65c0a8a773d8990c210b2d86799c9be7268aa8008ccd9e06f9f1e71aab08db56930d9f908ee76a5d6a0cb1d84480e6d76efbfb1f5fdbba0e896559681e750667d7112a832a90671665b1a16c66eace931d6061374fa2239eb6227784dfc2d2cf57f22c605667cf9086148332e81f92b0aee539c1a13f5529498f4e77100c491e40ea6eb9c7a364a7b82e24feff82fed321c853039f3e493880f1b0fcabaf52a4d7681807fc043b724e5d56ad63b152d55efcf6f9ffec3b64c4bc790eb0d7d5cb54654ea65e8e96724700d2cea17f27ac5c660ea75341e6cd6bc7fc02e2e1a4bf1f6b5097468fcb7d129eef6a8498a5c35d545627ba13d37e6db3b42b1296aca97320dafb03dc1a2d9216ae6b73e4b60159d99e9562593d21157e9d4f7aa519ce9954383f665fd5ceaf4efe4aa761f56bf2aa7008d024d6ed8a1b986a166d821b7df3b564a156f9377a9cc98caf74cce1998bb9634403cb0fc8d8b8041acbea39a1a4e324d89200fe6ca917fccc44cbebdda0c781dde804a6d5e548be787341934d7a3fd40945953599293f3325c4185e01a547c77be8005c42ac91c17e2c35ad51ac60c186b37a975b63f8ba297c3879c499fbc7e20ecd9e1ec43b885c49c7415f9c85c5f625166462c4275454ff7cf8c11ab5bf67b49428273f74a88661a1690494a1c46a47d2395b4bcc8733afad93c634ae35ccce33ee6a49a4394b6c35631829775f847c19fe51cc51576280af21af1db338df28be55f57e8143cac849311247c7626928bccfe800a2bf1d79e4d131c6a9c8239621def01f6e85f5bc3860a414bbd1492d1b05b2d2aece48f711d634a796cbe498d9accceda7b3ffc376015d3318d007656708f8008af60c9f6c615f8b4fadca7f001ab8e5fb3966afe64a1c6c669f12b3c7563e050529440077c2bef6c7d77bce8d81f32c3bb3d7ff1403f215d626490dc71ad7cb07447090e8e8742be190229b81fd62d533459c7ac286af8d25d9e07b4a6f83683acff6d1146f7f9806a8aa273891a18a811bc77cba23b8bf3916c69d85155400f62969ca1007ad77b6733f0a42ab612546085b4f988532253ea57a8538c820188120199ea87dc0c50c11208a89b4b1c5f026ef9de0f085273980cc3eba6854baf39371becf2c8ecf402329ffceafa0997aaf6c46278e8993a508eb13343ee78382422b23ab279a3bdbe3e7251c13f9424ea241438d453cc201dbbeb81ae1605e7c963a929f3b54a635623b2e63c9c8792169f46d4e28b7178283fab866f18de35530dfbb586e8651f0ce0322e21e92a3f6d92bbeb8927dc9a88b340202e493ed0a6ea8da997069ddaec75ebbff7f2744582f25e1116ad57fd83b7df83032299b1f108ada892e9c101268d4a1431c21e1231d427fd5845113c03f5f81ab6923e7d0bec39a16bf9f3a74212324adb07c6125e19731d17aa070791f6447969ef99913c79765f201a6cc3c627516e81b536b633595c9790e59edba7b229e7446ce5eeea1cde80fed9d6653ca8188f6c2934d380f93d35ce82f40e69f40a66597a1b025b5002c1b83f588bf887dbd7a34486141b889f2821f6cd626c8f141e09b2843d7ce07712208718550689f0c1f4971eeab88d5e18c641b900589f74b226da97845bfc780b54747760fdd69bdc67bd025820bb84c971b88c4f73f3738dac6d2d82201f861a3b5904e0619822e20553cd11d511344d919f85c6091d11fd7c528164cdd7abc10b3dd3402ed48c528a09cacbc9274b9e9545951333ee154bcb9ada6ca6a1faa876a35234e95898c834c8cc9659518e70a0b09502bbb3cf231447878ef974ef250e1a95a024553cc9596d05bc45e9c558afd6cb8f959325d934b642fd33897963b6b17a35d95451ebea90964d0f051282d6d0727d66e8fd08585db9f95e269cf99a3c16679933586c7aca494bc79ed9cdb8210a9e5a063c73d0c9089f3f0ce5baa426c0bb1544732c98da62135349996f715087c8d72d577841428803dbaf3b86e0f4fbaf74ed49049d6b1f83cec5e08bb624f7817676c622628248d6016a92470e53b97489c78b60a487b10008fb972043b7771c0de736456ac314de01ab5ae22a5e863dc5449806e02f91d5e412f9099c72808a40552acdef7b575c135b99bf47a8be9580e6a99a192fa841a71c7b29dabdf00135634ee72fdd270c91e91ca9932ede2300ce3a864931208674fb7713082c2b16fe521f11fedb1b761bd0c316b12793d1c7f9328cf4e6a7b7d2bbd28bbddde95eec22c433efbc59fe4dfd9d06e552abb3a64edf252df9d043e55b3f5c5c97ea0f49a4a12a3b06e9271c12376c7ef4af395b87a1328ea3943f4bed9d823bc8706c799c351aabb56a5178238a526a822f06d8f21a17e90ada7b62277ec0f8054532b853290eeb8b0ff8b2b19a8bb01686dcce0fd2b60e7fb81ca63e44c4126d8411cfdd8fbef410b548496019f36609a9b5d4c1a8705b3b162f5740ab91ed44b120efc296959e71e20984b1f9e06ba88920086523f80d2859f2400dc3cb1bee5954a1c99d47eec5f0c0ea7f3971d4aceda3de571e3bef7fded3d4b33b57e745260cb4b6cbe36d6fe7b4ed271d0f9d04e72be6e18fa029a55ba6703f349f0efb482b14f1822257a444e43b41ca2a25c949c1ad7a3d5b5712325f697043c885312069660a400551212abd488c1156a3eba95647960bd46568851641a33395a89f1c91399b48560e1f80e2746057a11d756d0b0d07eaa57ca1c95d80fb42711df2e6703a03344b28082eb5aabb275c3b5e0e3be2e2f808ea74cacf906f8fdaa9b374272de200d50b8f22bbfe6c90ca9124a6755283e32022137277d5471669b33476f3974bcb43f7a09417ef55fa23c5d1dba7206ca3e739279bbeb233d2e5d899cdd96d1f66545d5ef85635ec51e1b92e17042f56b071445b15c304df68747365637dee43658d8dfa61087f013f8805a029d115bd5190da815f9b4bf188d2a123e15d4099431e0100c784449a69f022d1ffbc2d6666147a07bdf7dae1dc9dfb3c577a365a3d83c31db7e9bbfa3351057d5ea8446137aec9567b9d3d2b3cb9c2f265b3ee246ae8922c2782040afbbe4352136b1c6594ab31033e5acfd7386f02237ec2849ee997afed7bcc72d249276e6c0f616cd14f4060371696c82e5bf54b264585e2ca30c8284387202f5abb0539ec26a9cd4a0978cafbec34ce4f811718a13710a70cb27222becf0228e3e164571beffcd05d8d70b5e8970df674c817b12a530b8d078afa44f7f1dc79e9466d351d4c2608fa80805504eff869815cc2ec32ebc71b3d41db99f42664f8b05be17a115ff76da0c7c318eadf67c3e78a9828f37b693c7e3168bac25bddc9dbdf68337aa4560894578e21bdce07d3d88a7eb4c578db279c6c5d699941bd4c22134549078545755690ea6a94c8cf40e95c4da544c0c0c6da87973c1b178d116703741cd25e226348b221a2fbb19aa26a8002dc4139746a76a75d0cece439bb9f4969a8b2b57ed74cba5d4b9a008603263c14b78e37d2e99b770b8f93faab7bc3554d4bdc57c88a66bc1b2663add242568eddeb78e9ee7a7d7b78809cd26982b0fa113c435c9cbd20227123e09442461b148b5584b49d755bd8aa0664ac2dad71d5bd0be7f8c64781b1d4717183ffc0ada7fae1cdda80c1bd2e2e1be3d15cd7b54fd4197afae006d4fbf0a86d2639efc992f59272de26a80b3cd237642c3ea6bf2dbe74a2195416cb4632e573f7a1775abff79ea5e5a385e2fd6a06734498286b3e347b46919d0817bc7c2a1dca8273a56a75a815c849287d825de8b64357559fba98fd343447f48815a73c90093feefe3c99a2a75579739737a06072de06f2016aa9751f0973aadc3c655cfde729ada5003822ef87cd773d0e1375cb47ac2e29b3a57f65d3f214c5535a4a45726f3526d586247f9d7b7cae01388a41c7974d9c7a53ab7f1f8a9327d268f3f020580c3703948d3852e30ec138156cdf4ab3d3e1bdfcd0b586f210e6c1c58b79fcc10182a1de8b89c2e0ded3b81dce97ec2325d590bebf2bb5a827c76c1f5e11d21ecb30f8e01893e5a16e7207a42430fc444df4cb0f32955740b663f72bb771dd52479019e5228c5d0c644cb6f00726cbb9399d6bdcd40ef912f269bb0893ab6e8126490069f860c90f816ac8d44caec7419eeaa6fef884e87b87f538bfd906bd794c766446495594f94ffa437649aadaf34ad214eda1de682ba5187399db41b5299a2730509a37d11d8acd880e93b1f9e32e446f7b1f27c73e8a0cca58e8d5e280f460243c1dcd8e3867e3ed1d74ff56119e19c6b45c84889526bedd847060559ddfab50243dae6b89d9271183654830f9d466edc798585dd4625966048f5ef4b8cbc3af125949a515db2ef43438d55cda97452d702286b9779193f927ce836c6947630854f1149a1b71e1b394728df4f0507a49cc2111e43f2c1ba913bd0102142daee2e2e55a2438e1a54484a941959478bdced254d19a68346ef332590d9f4d4a0d5e7e82f21a2667b2e3a297c5bed77991b37982f441244ac992f09f3172d9e93915dd0cbfc25fce77980fbbebb3b2be52e6f160aa7497b4a249164f0484c29d3f537c521126d3029c66ac18bd9fb7098998940174f8732c70ff5514b142c1f4999e047dca03b72ca1a3b73bbf137911404042da9f214044cd34412966633199087f4efa024d99efc115c05d1bf3101bcbfdd68aa4747862ad2e761dff63f78040dc805ef191c302ab637d6d6c227650e49eecb7a65eb98f598204f821854bc1334a341a73f39243cae164a97af500d21eac61e1921139fb0571c685029a6ae88dcbb5502028d26ba140a23efc063c1f382e75bb43482e363fe3c257db061a0fd680636d887254c4fc8c346c9bb08e3839d0db501d9ac7d4ea57036a96b0fd2dd809b26d6f08fc06990ac9bce3b987b05bf5f35df89bdb087c92829c31cfa760d323150a27d88b6486b37cb2060af1cd336454acdc2549034ec13bb4512e4aa65f360be17d78d7f46d3a1ae692f0729a93815737ffb8a55062d8ae3f603fbe50aa640df9385abb9f4b5cde3e259d3df8992f3929820b399e02b9ec6888b656ea22f9e0b6a76a939a34659a65ca7030faa06395c30c742c5508d434591b621225d26d07e7b81ec64fd5fed05054b5e4c0a131ca1cdc6a00e89398d616451e5096eeaed362bebef70db8d3069a7cb9d2c33a7d093d0ab0b6ddff535bc94824012fd1065838ebcc5576f4d92854e7eacd1405a2c74ac68138ee68e9372dc73a4029de2d87b6b8f71732ada2d9b96c107fe51199a082993592ed7a5dc538b09c2740ff2193f4abda93f28df6c655aa8421018531b870d4aed5c4b7d9b5139d5f7ee9ff6299bc823828b583791baf4b24cd2a1a91831b504a076480b255b3879ddb1620f2592d3a07cd56680fd081826d3b931aad02155997756d91c528ef9e1c5e73e64655d741fb4d9dde96b559b0296e5c0df756c63e95f67c4b1ca4ed4abf3ffc7a43ad8a2100a87f608f8dde03befa2bccfb2975fcddd02a32452a5f8b81e8706c5d0d268251ccccad8683643e182e987be82acbb0ffebda847b55246cec5cf1455fae4105018e938c88dda3e3af91b94111e379d38d7782c12f02fce6cc3c8bbef277195dec25c435918fc89d22ea33bff036d8070f9372851e9011127353b5558087d3492cdc77334667ac258275c076aeab6deac7e1b9ae9c379e573bbc0ab10a369181edcd8c6c3b68aa4024c9f546a60c80149e6f08ff01a2f67f9d1de195fa8483acef39ea55cf5f3ba37139450eada6bc9fcd804a051af9627424b75a8596b92c3a36dbdcacd3554a4d3e4863da57775d599a940ede351aad8f020f50ae46765abdde407e8e8ab91d05b6a081e420f041e70f75551c66055f096ec31f0c6ec9ea0bdce2a00982d13d7657adcfd20ca715927dc0c88a20b780d55351b2a1dbe5be2d9368beec15817ac094ede3b88feb3fa86835bf4991df5e1069f08bae11a16b1b52b06d4b826d8745b2c5a734e5e4f0917058416a0472d6bcd5bce6b5be6155b983aa1b17ea21c9e0f4eaa3dd5a60e6d80d3f2311a50d7e5544e40e7fcd71cbfa2c3a545957cc781a2abf1a07d2be832c7f269a5a7e17d5e7eacecd67b1afc165aabb61ea21581e69a6126c07f31c43de761d0920fd4ae885e89a06b23c8d0ae2b4a5303aa005512574d9e5535c82a5a400656d4586b280a86076b1974b435b0d84bd0cc4c815f7ccada5701aa54d72040358ee55625b36fac665ca62299bcd4d6bb90a01b8e7f3668e65abdda9b52af545b644528b950601dd2865f90df2e71010c1e48c0bfa1566a793027292e2cb50d79b8d441a64b4e27b9f75e2ec5dde818ab8ad8d8f1b1cdf301f3403fc279d5da246e289cdedbad2403afd1d26070a150cc891b7c00a6beac891bd05281fc1ae862101cc84c23eab72c95652831de2ffc6233aa4055a46c97a170c5ba440bea86eefc73122e358da8c0b7a614d61f5891a1c757bebc0101c1cc8ffe837c03cf97d23c794b20a88b0607269374d9361897dd9e73f20df83ae6bcf286d20b2e53dee619358ee85548bf620d387075d9a6153ebbe4cc4fb50107ec86e75646e18d49bd13aa018702f2094e893a0fab9a3799accd47dce19f5bd91d241cb098ccdd580fa43eb9261ce6bdca556d01b7de77d7862d16e3e8f675e6d6c1c70cd3860ece4506546993e98a830b829fe75396eda20b641387de8c035b413d03604fd857a8e0e0e950e1239d5dfde57a5c2fc86dae75e5256433abcf387c2f34789e245b55ee33bb26714b0dee04673b5b5f52bb7fbbcb58868e41b2169d5aa552de5316a8ad430e8e7f79e920ccc7b144c0a2e03e1cba210be1afb26febe1a61c56ac2d9c423465145a5420480ede403c07122907778a5500a14c1d8142dc9e88715a97bb03c36234683970c75021a0d208c761409db8532a5103ae268f39f076048a0a186edae5e53f9b5bbc7bff63e9b3d721ed0f54f339558d46bfcb7628ab3507feecdbd07617d526433ecc27b82b1ab06064b127413930db658e1d75c554cd14a3e9c4fcba3f054544a0139d548a454572399126f72b8f39fce51e2343ae188752beacc90697609a6210ad4f28e936e58a6b1cdd9835bbc2b90e0e871939be8dd373184a751fe13dac10055efdbb5d906b6257b7539b384b3f6bd20e2c6fd7c81091985cb10a9f4ff5c1164abfab5cf1782521962bf6a2e2930e6e62b910de7d42d8e3169cd333f64ea11151e074a50ba17e0bab566cfdaf9cf7fbf3784b002c2d0c3ad1f92a6e2b41cb01eafb75b07d574f00eb8a8734c6d1b09e4be197bb450d87191f7927975e6863f50f5c00714b6a0ece7ea28edf6f9d5bdca6d71c988fd764bdea119d01200fff35a6d85ec40a58cefb6046993a1e7a358735f0d774fe9b2d870f5615a4f825abbf089b5c7ccfc1d5bdd79fe33474f148fc348c8dfc2fe720630140047de189e6f36fe4852d8cfa5e0c303ce1a18df71c96d0dc41ec993557895f158fa6996b82ab924336c48ae8f04940983066609a96de73f01a9d5f637ef671d0c11c1cc6ab1ac6ca55fbfbef6b99b542d5903f6e5db3b74d83a493610f7569a515fbb09b031b1faf39fa877d1e8a513226d4de437382e9e63edb4a9dd9f6185c5f752b630c5a04a7fe55768e40245bcfadfa55e6b6d4e75cf7ccc0c3867f876a84bfde69177681cdc2e58ab4468625ac3594f1563de6942786f8dfb56d095f17c325f1b0bec4b326c085d78064d35674e12de397af4c77045258650bd356a4606cc22093850c8c7d012ab273a3d90b59098a9258847b49152c0ee9ff25bfb3b9c966f1e355d686a1e7f2a5983b001798205a4affb7ca9fc57b5288d4f24be7873234ce239ad0767c05c10682aca9feb2a0c51489ea8421b823e62e1ceace18f393ea25b2abf33293b65ad258d3d3200c3c3a34db6571f286821a49631eb04710946fc02583fea2ad63cfa29cc46227ca4a6d06496e48771fa03414d1dcdc9c191fb8787f8c22449db5baaaaa94f3057ba4a7b8d1fd64f7fb0ddd91f28039d251dcc07db2fbfd760f55a22074c7945abae4aa8034045b0387e54872946f947d54f6d0d1dd2a273dacceb046a7b621b275cf912ac412dfcba96b6fdc7d039b938f7baa2bf79062d752434e069d15452c94ce0bc03d78e7513cbb85f1512ee7456dd756f9d9e88d93c38757bef05a081f3ac9de4540185c61e5d5384cbc3b52b35252f17dc74b1c0323cd43272ffd5869da361e1da652f1cd3d1226899af10765096b698728c57ee2d745d421d3a600c31b21fcf842e8877506ea8d38ee36ec42140fdcf03e4c4db3488d4c0c3bc4333f5035208ca2e7d38cd4d8046d2ad280e6b61b20b66a0d1034aa22e75eaf65cd2ff5600f8c688b1be07ad223f97949c23a49e84927bd9db64d400919f3d99a956c61ab0e0a9e8a551efe8f7f5164ea3a1dacd950c21a555e3e33f92788608b0ccf5b1186741537d1a93d98c1b53b52a242ef6ddc87b1bc960f437f782b7ad0be60382b7f1cfd87e1f3672b4156860c1938cf4372ef8369aaff374839e7978a4b1ea2a70578ec2cfbd9020f3b1041b3fc0fa24ddbc9f00b9123f94a54b006463c61a3bcaa8c868a61422c733af6f4cb131f57ec8fe16e840cc0dd835c917a879074ec6a96f6da1f21454064de38a19aeb3606ae52335957a22572c5c87fad2a0b3f62acd09ee21fb8d887c8152b1b4c2816ef7c97daf1dae27935a2054dd4b47c72638c974e3fffcdb5937be2f91961d74f7e60a6c2f52f7776cd8f47359ea810f6de4ceeb767bf6983297c194caeb8b4b7456f8d190855f3f6bccb509260fcd75ca48cf3f2eec9157596f46626e49d8c1b32523db240e9af981681e51d27af5b7a214f4738aea544e9268dd89455359786eff74b0d92963a69a44f625be22e0d263ec13519b432d5fbbe0564a961adce96c53c1e810a276868624562fa66f5d29a9b785bb17cc4addd795d8178fe7c5eedbc1373a30aa88e5efab71824529a205595ffaded9424076ec33963ea96cd7c562a44227cc98831a1a38b587dd0d15c38a92046952dbc5c4c42575cfa868afd67ef3cbcf25936a7b59a593506f9814d5cc03606a94ab5a59ad6d67ac14c3c5547e6415244483e52ef775938dbb549a2b4449a692d5162d512a48f86042e14982ea65c191ea68b319a599ad849b714e764adf82bf287058b65e4d532ece1fed9d015d7c1f3524af24585255934463e0afd2c98040c85fa95a56879c305bdb5390becf48759d074206501ba729d19065f60a14216086652f906853288264a204200bccd8eb81e0fb59485ef1efa93e300228101d17a55764becdcac666e81a589e592ae550aeead1b70b6ba228cd546b6ce895600f6acf30df075f526ca10de24d36b37dddca49bc82582d522cea1ddb13723067f3ed777ec6e87a11bc3888c5eb137f4de400ea716e6d6e2bdb1cec9d3980596981a75660119105ab35a5e3298a963c44d5118820129f82c88583ca8a30366e00bc87d2a64d859f7246c397e172b405e8ca935ba01c410fdbae2e9317e888804c5f52fdec0c165df3a9c7d6f15db34c4e535bdaa4a81956c056e82c7cbdebdbc7419cadbd71523830f4babfa50178a177b4ecf7472126395e97ecee2d1b069658f2a82010d5385cbbfad2b0033c8095c90069dc1cc20187d7103ab7934f480482cfc2b538c3ef5152bef18bba555eb01e070b10beb64f1488a31292d6087461b6ace459d0af669818e199e7b0e4c3a8db2462ae355a3216219e2410cc1d02abbc1b07330055694fafae6193ac6811601c8137e9c16573cda4442abaca7fb04375a6cc3f57662786d9ec3df4fc4bca85db37e65f6db641dae317bec7166a91d51b2e6ae58f73cc4991c6cac28d34fda7a0706b74c16d96f0a132b1bcc1326708acddc5a7ee3b97f29f08407c939f1c91537c5aacfd66cb45ce877b1b6d3322981b52ec1cfae2635323f5b23519d063f7ce0173d5c113cba42884b34b4cab668afddf094a03f8d804241a849e3a0676ce632d91993e6db7d67fcd14eb3b219d67b31dd42a1982b89254ddca91eb460fc116478c5b84c6d722c44653a85d2bdc035d1285468f102fe540e0fd43ed58f16b9ff8046642a37e703cfe94284b84115bbe1cd7132c1ef845a4724c631c3c658dacd79b0b696b16378c5b80f22f38fc961dabb649dc6ff5761414e1fb8e054275e3ea035d16831aac56e104427a2205f60079017c7022a1c8a11960aaf6875edf5f83c617a3c95b7866d89665c27a61f99e936f2d2de871c093880f3d6213cfea86694c02e16609a685fb443f82b9032c91cf2b9e7a1f41060492a886360b5827e45d700e1ff21f38af10358511f4c819f35598b1e48a652dcbd3dc4c0558a235246ae1070b0545ee3b47ac7ee84f7005cb10f900d129e5ff056d9316e46589cbdc992b4f1f82f9bfdda47da4380c405f138ecea3cd64e44d52bea1ed35ddbe017ae5296009c3929d862d0ec8b386970025896289c048a75db49b76f6dd389f9610b3311f8d0bac73e6500f1fee1fe1f1f6595c1f502c8173ab93f07a2ff9345bd623c55e90de62d821cad2f72e724485c05af132cb81c8c7e972d067e93cce2bfae2b74815877761041155e15deb6057131e240a0ebb83d2cfe9dee87585a0385a1587c8de8396bfcfb6c8dd7679fe20f4acd966abfa4bc7e15bb681afc2b9bbc22ad807d30dede5260c77657523384eb178bc699609aaabd9984b80092a5a59c862d4c1fa26613a9199ad68115afdd502204059dde20b72067d1bb6e265f97df33e02ca948ed9548cd7a608cbd197d99b62ebc9b2a31a8d2e9b85683b74e3bef66f47f29a347002adacf7c30df853c7068a98f4daf3b79a2e419933ed7659f9ebbbc3a473bfdd0df0a1854344f8a393c7209a08cec8b87da76390cc88668dce0340f032fff091f1a607006caf3fa084ab420ef8219b93d33320bedc53aa62b604f2564aa6c0f2a4806bb0ca90afd397dc06b178d2cd66f4353d043b372008b4d236d88163977228839f779e234273394e968bd1f423175b37e00d530611e3e18977af348bc5b7da76d13bd9c042d58ab24967a78850f4ed6b69de973172925422fb5fade14f42ec7df8684b9b667e554ea9643d8fd7feb46d9450490a61be9c84a41b1b8f97ffe9015c849aed646c33ef318186edfd793c468e1d459459683daed9691bdf5b24c02344e4a837d03aefd1289dd12f8f3270f30e8985dac41969f65e1cc99b53f7f715d2925bd332f5cfba98e489d59dc60386db10257d004b842be1d8e340951e6613187ac7cb0ec01d11d9d769894fbcaf42bfa2f8eb73aa24d2644709a6c4796cc17e4e994942d4a96a7376776d4a6c979f4c702f8467b8271ea970ac96c9578c2beff5aec2c86cca92c641fce3bbf01282144c2fe91807de694dfe2eb17681f68b698f7b2bf071c9930e1b8712a5c1c41781667ca4964464692df604dcf979e05f5e921f25afd699811a93857dd6d07863f17ade165642edec47eb9585906225494017d76ee2c9ddf03096f84ac5de840e3f2561a3391513732edda28ef75c039e078578295d58ad11e6d63f2827aa6c9ba6c2322c79a22e99ed7b4c391f0def400f7256fe84993be4eb09b2ef1fd1f01dd1c2a31e6283f9e71ac625d12b5372df30085ba1da0d738a0c7c7d9980bfb0646af81c9f73df930316f3de63c7c29b0b62723d6b53ed715925afd5d51123f664bc6132e37b3b1222d07476fe234e7b7f4b9ba27b9ecbe0f6aee024af7c79ee4c607ad1f153a16054ceb1289d3eaaf2b907523a234a21b79251d9540c31edb9a85b9d2f8ac22c94eeb6c56705504f58b724176eb43b71428664305e8da0340abb3bd26e6a42e81a276c10f9a910958212df70252ba6da34c57e828107bf1ff20ddf014286239b6431b38a7af20d35aa4d44d99bd959bffb99c062b54f060f7a67bb0cc3ea1127f9565660ed7cd7aa3a05480a038890532fb1387a8b66d669ae2f415836bae24e223188d2dbf9a94038b7a958d08edf48a1a191ee716e906c3a11db4c2c6d02ae46ffa77381f9d3cb80569aa3fd298684018065636990b2c966aaa3f8df7ce6ea89af0e213e603b49a734dbf3bd211454c213bb2059251fdb9f7b020f6ad89875f277e695938e2af28f1bd6cf08c2f70609da46b81351b9ead10f005a660f273d4fa4d6b66ce31c6df1bcbd186a54c6de515f92897054731a65ce501cd748f81751827d83bbd23050022f85025f7ec8b1d8d90a43ff3f34eafe73d70d80669dc608716bf419d0e18957abd5cd30ecdfa8b4e9ba1a7d08632665306a31943afec28fe9b8e7e540dbd9c70156095fe4feaedcfed444da05d7fc9c7006a2105c56b4e45f377676ba63aabd59a19c45cd41fbc60c4f1e0fc6151cc4049afda5f1218b113ddfce47f9d186b1f613e0a3caa0c1f8d65ae3fcac414dc2257215444ec0bf2a298784586373a5088524548bb83fce891448194941a90ae9954dec3a0b729fd56fc9890f7d1ce416535d2d25931f564a3a70a4c61b915d31220a74a5bb088e12067cad83937f0031c34cb0ff7085aeb0463a81b691e166b48114173ae93348184aeb84282beeb3c97fb69f791a8d65a213691e7203a341792186a2c8110e8ff3595f3df20328a361b98b262501e6442ad60d2db8d12b35267e244e398431199a93eb73d8cca81333942363cd90f765c0d9f912bb473e9ee4c1a65f40e08274e99d12526f3d8912effea0fe3c9162505dcabc5f66b49c108d6847189087282d4948145f42f34b6d7e7c73bf062a765f5530881596910af7879f093be3c81e761fd866b3c32933eca2c45cb8dba562a21adb128aa66690379472abe2ecadc8f078aae63812eee4706466bd2d35a96c85871f84e23f2029a08a80c3b1e8955d0edddc47e87d7d590f8bde51b476a882c6f5173ff158a40d9891518004bd110aadcacbf9e7df498d149ee1a7b0723b046427bd6ec312da55f9df55f5d4713ab8e056cd9abfdce0e4ab4ce468246c83abe914d1451677ebfe5a023c0dfae4673eb4dace0e84ffa68c23ca67c1a7a0e3f04563a73f36a2b4131122ebdf308187ae26a0e2a2bf5cd86c5359be63b9e346da58f83d134bb18f640078b5b33430b33e5cc27b55164126278c0208b74946fb49fea4abfa28a100044819ee20ded57dce87758c43d0a8cf430f5042e0a1116c8286fd03ed54e1632c00b727b77013c0ca3dc3da343d151f401be37ad16b360d6ca7b11c52e0186e21072d9a543ef8a8e6920bc6a027c61c2382a53da59c168141ff0b355dcce801a203415ca996e95107799e90a746816c6bdd38db6889d5515cdb877847d81812a65fd69c41ee076efbaa7abd36d9e24077c805c0851eb8e255a1daee806dcd99d1c119c84abfdaae79f0bd2d79649fcaf245ed05df2c4ec7c24e6295e355c94b8536b5b4edfb11836f7b735a0dad3de6d7883f97a617b2e1e9e18aceb08acefb13008974accca9e5d3bfd6ffc9755ec71ade09535d492213f2adbad7499065c2132a847834d074acad087625abbb4c0257eb5cd4a9cae1a2ef0ea816c53ef7c60cce1f2308dba65849e61a93148ee9b0615f36dddbb8e32a3fc030f3cbb178131d747bdf4a6ab2585f8270164722d83bc38e5953b93f900b842885f40b38b81a0987ad6eb3c099871f42f529b217baef3ee5d2c3cf29aa7a32bc51c0ec6b820e0e49220f45bb9eeb72903d6340015c8e84839a5628e7ad23b00cd74ed49c806f4321754e5bdf3434f7e76b099ef9222aaecd65e4e9bc91d9458ece2b0f9c5747ff94f027f1e37b6009c401d43cca299d0970206bc02b51ae9bcf4e900a2d00ea6c7bc777aefef40a013d7054bf2805b6a2671796b7527a919effcfc3f4bd64667b6bf2340558de2a0ca42b0a7cef774a168064138239473bc154c7472dac1243a0589a0e823ba16ff06e7bd8be8e5b804a680d9edbd73ccf340f5e07e1749f3a9b19fe48d5291a8ec582094661067f3bd3b2e7a66b63d308b4f67e8a3b3fcee2cb9df2d88ad569324d490c1086fc6afbd7a746963c867ed2e643b5bf229d3a9493d2ccc7155fea5f7d10969dc16c7a2b97fd2f76ee3f31de010fd6f7cf2c9d7e12e47cfa08a6687e25ec3096546575fe5162724048bfd55243182f0430b19e2dba1c38c0770fedd9ea7feb950d2c807e520c6775a8784ec49ba8ded2a2709f5ccd75e96ff01cd904cc5ec3429b02447f54f885c5d062a2456ed66adc3075c1a6876ba2589e7318e82e8d2ed54e216d16ab7f61658e0bb83a44014171e16e3895acde93abd40e04c605de0bba337a58f879059a1df825dfee742c93bc2bd039a9db865e85e38248867ff8131ebbeabec0d347712bdf8743ec101cdf6e84dfaa1b8fadfeb63ca04d2782892addb8b9545bf13df191ff7085d02baddd73ca610c7f91dac02e5d81e996468d8c43b6790c3c1d35a18b89113d797489d69c069427d1596bf1f046e024685317cb7c642fad89bd882ba216ae1ef0b7794398919dba0cbcf9d5aedd1a0ad213e5663811b8f262af370653f549c1729ec4c2c738c1227e3c9ef189f95f19f8ce889db10bd7ff2df1db33647908b859efac3fd96947d411aead35ebce625350ec1d27b19470060d6d0e08cd8c06482e4b04c95eb4c4dd001e949e4f184f6d0bf17e360a0ece1bd761d1652af79dfbce3e45a3c52c1221c667b095c5e5cd6f3e104832ec0491007359f29d5b8a497b9a7fc95620d973b7d38bbe4a37390c8d63a0fd97543423717e0657ac0ba737be750022c10d1cc2eab92702691a948d33eb5b57372b51314b54b0b8de4a17b68a6d5fff53ab5ac17371b2ec98fb6eebbed03402a6d0a7268f19da261c6d059866435f25931c38de766ff53dbdae52f5858cc9116a3711656a39e61361c8361b57ef133eb052f67fd31d64c2b450e0e53463617d6ee4af1b76054e352eddfef511b056d5890a0aa219aadacb14f772f36ddc9e654000d4f40b8781f23351f50cdc8e9e27b9ea2834754457131373f9605c82d98185f45063c2a4c6e1770da36b61809b59b3be62e5e17df454f8010c0d1cd42b289597abfbeea949284c4912541ce2b3e14d8257d91b09a58c67762f64a4f4be3bbe8cf5b5b8fa1349e6cb0fe83caad14c98d2cc9709ddbb69406050536ce95ca6c4a22a23fb2c2b87def3d9478808a1f002c13e90adec487a1f66f0f8642b5652d4b99b65b4d246b756a8fd7408ff52f2644ddcde693bba89dde31ea4eca60d248358dfc33d7415d0fde823a70608c0c5fe6b10dab14ecbe2024f68eae8c8c14c8a1b9cb60851bbb343fcf2081ade4acfee8c19077e5b7d35cf8e382ce59b644084a708580a69a1afd2fb5a7fab9ad2bb5dc6583aad2e04db606ff3834eb8f9e3ae93cd5ec118d46b8031fcdc52183f6482f2239172004e784370c9c90fe94ad3ae5515cdfaf0d4568b68273600340604ffc35a7b4aa731ee39734716d47ffdd2b38e2afaac706e6ab6007cc7322eb75a96f260c2fbe1b80f0b74eaf33e1f98671f7089aadf90661e38f99bddc0c6a11a79805291983618f5f58cf6c051dc4903da80324fc432492443b08abc7f1f26d2cef63097de50552da777206f967a6d9aa8356d46d0510dca1bf8b29f6cee936dccc8266065375d5827cf8ccd88df200f959a0969f77584cfcc54683495ac3feb306a0856b293fba941351ee48f8b329ee5c763d29ec11365dbe797e8dc4a240f0a3a56d839ef120a7ccbe782e47b1d1de72d7a62a3d335425de09c218766dfc2f40311c7f2fb4d739b09084c21672b6d64efb254cb64fad2e1485e3a2835b6aec19394c8c75e64cdc0278da6e4b3798cbb1df3b1034b64b23e9ed66b3f3b4c740e7af3138b90fd51272b232c5f91f434aa0d8093b33b39a20a279336a53c7d2820de79074768fd3eda1965109c9b13a70e9023dbeebed8522161a946f13f4d8caf2a3874ea51aaf5f67e69b680d5f34d735bd96ada7c4c46b24e67ed4ef7a0088c684aa8cc7699432cd7df04dc426cb98be9da8a03028fa7bf037a9677374f49a4e498803d20e7f744f94dca6b87cf529db8cf3b41882ad1fc6eeb6434d82d6880ba2e8422534803975d9830c372b538399131001c2ea1149eea7dbebb4fac6bea0011c625f93c443ae39a30c9615d1a0f6922a8702be8cb67de296d4026e320bfa51c8e6a3c7b84eea41a800a3df78c921afba79ac313a3629a2e0789214552c10c0851437ac8757ca314fdf7610555ae566ad1216de52b946c509af4aa445b8b879d414047d9b7e12bdaf28c75c3e8948ea234c94dcb803bd3907c945eabdf8cc0f7d5accf1ebfe8754a025e32a6d39d68a26330bad8e19319e05f25a58c8034348f4ca7a8018364c78a00a10572ed36b158d0ca4836c00df79d97f063551e7416909bdd24c9cd5fb574e3df0b446df4dcdf65b2f599a2abdfd6ea4c6683d046f27afacba0c72172b7bef847aed886be24bd97758db2252eebd3e14c82458a275cf5fd59fd3ff33f376d7eb7ac92d99331c5641b390c936b34e78f855db60365c47c0e546a4641dd783e6a7add6acd3dcef1fd03258549bbbd37200cde2e24766e6524c9b813e509c6f27f3a351a6d488ec11a5065957adc3f9e5a05480be87304643093d9c9d829b6969d12b6b03e89b1cb7fd3b809ff1e8f6318dbdf0357787f5cc5f5acf9ea6eca4d762b1dae186d4848ff02c3decea4bc1d54c5695a1928ce7ce866564f18bdea34ca045e06c6c446d9b1e3a68c6e9317152789053335447ed8159cbbccde35f1bd30f62e030e763ee607e6c74f3d5efc67df5c1c7898bb69231b64838a1a54b4a19f9ccf18b4332b2cf0695affdf9b117b7ebffaff9eef996654ad7524de40cdb725c37f2f6cf9a33ee8a35a293ccfba19a3dfc28f7e9407ca6871d5da21f1b6bc96f5801b86d9ab69cb4dab12c50872bff2fbadbb9e6d27f6d9e9780f1a2db7bd00f6d10c1fb8f47f84947b5dfacfda9758201884a67dc4fa78d193d60d78b0a3cb90e9cb1314b60c389c9fe2b933d1e83add54e000759ea95100ab2d43b31d404ed37e62b0d74a126078bd96734645af4a013368132adb66e941202f58f1e8811634bf6941ee8811f280b1c5be05209c5787f6919473745609157b560054d2d7fc0c44fec2136276230cb59cbdb14d49fa9746f61684d718c0c46e37d9414f81628180af462784588d07a5d84ed05956411435bdcfce0477c1289d97a0da926ea3d81ed41842e0829bfceb37ea0460c7d86ac084480dacf9ef16b0bf2d2647410f07bf044296b1ef01853cd6353dde4b462efdfbeb3ed6a0bf7d87f6122d296087a190bee579db9102b47619dbaf7a20bf7c824643966300fa4c6c331580d39b204b060f39fad24ebed65e8ec91afaa6575b0b32d923d2964b9512b7b2c98fbb8d0824e689b06b6f502e53b07981516cb2cf4e5f6e7c3cccd2aee045898515e09b0805379ecbb63fbd141ea6eae4b7e948bda33ed32b828bfa9794a4d130bc57c101391a6e7222867a41fa8f839356446a8925246f22dd74baede6755849956ad5521bdd13fd9e31b90515327a435f7db25a712bc1f010861031c40f2ee9644235929f07e21c3c61f05db394440ba0d32a46ceed3bdf4e2ad92e4ace1ec60f59aad82f49ecd7da0d6b1de4bf39888388923d75e2bce843d9765890f2e2ff3e0b0119b6270f8de6fcb1bf144e071d4e7e5bd928f5c3c4170481befc155f76635cd821473ad5b6cb969ce40b3669c6d226720209b598be48eea78b79e936446d9024894f8924b7ec84b4c46ea7681f83de44f82b71c2ba0b2d173318af7d38941e5e82a81f46ff7f141f4590c8329c9654a2775122f9940acb4dd3c69735c9a65f8abebf1a02f60333551b16041659de229228ae4a31f9424a98f143a0d5f8090730ed2426ebbca568223852fb088a13c39db183c650a99d62d6a9496182c82558fdf7ad1305799fd0e539599909637557f53fa2e89cb8e263d0cbd73560dc0027b3c4afc12fb96468786f122e0cac455b0a98a69ee0c202052f88835d0b55ed57415ed3c08bc5677bdb8dc62783de261185d67f205d1bc0f81cdfe23d6a6e40a4408310536c9a22c2c9573c93e0c313043468b56ad0510d672fcc126c753de79e3cd57cf8bbcc2a74e46f7606b2fda9298cd415675c0a5968992361e27321a84fa5dff761f1f94cb1f4c992c9dd12320bbf167580b4a6357dbfbfc4d6a2070e416b7e8d846e7073ebc01ad1232ca25068995722b9a2aee12745132fcb94644769ff8244fa6c2e7482f598ecdc5b1b2cacfba1557914e57393bbdcace8d53ccf18a79ea5c173570ebd4858f7cc010abbfdd8f0b2ae2c33326964f14a3b34ec71e9036a8de110d593c1ed745dd73080a2296ea6e1add758e473abf441b55f096ca4bbbb687134eef74f99406c1d00a5d278414640d0054074ebc9aebc2f2c53ead1c31546362b94254400d362391f10b9f843128e04eb50b5250a0027cee10e154d0668613439121ca852a511cf123bec52de3ccfa831dfc58237444da6efe997ddf3a27dd96aa11a1fcf90a045e0f674935a3ad2ec1bf982deec3d9b41f55be2f6f25852d758000f680b6c6a4a4d6ba199100301e8375daf57e261ab5851e5a1e25fef574f04f304745cf30f569ea7ee161a43d89661a11032c0410b27d83ca7a056712482be59a0a70a87d532f3ab5c0edd7a7d6234adbc7dc951fd0e432eec9391b708280de32ddc88bf2bd54c2e85b07f120ef42a2bb9fccac9d98d8b4e4c491cd2e4217439be0d726600cee9c80ef4b6d3b73b72b31b3d5916db9235d5d765dae07fb07120bbeef00b44e3b78700b152693fe79b96469e03169c30eff3dce0a2b41aa313ef58016d3428b36c365d29b140dc7446ed49d5802b48dfaa953435bffe9784fd83eac971d22ec1b9ff091caa0407c4ed5514a00412c573aea613123ce8e7ac68ef434bf7bb89b675061c4c4f3bde0762c9357c4058322b3b11a9e8b39023780e5bbbf65ea13776033da49cf0c74d61b3218224c9a31e2c3b978411d3a686fb69530585dc69b9b9496a678bf63477cccb0c3dc8ca3623e7667d0c229cdef7678cf0456a4719eaba87cf14c922353d6a3a340172b9d586a935ab2593ac90b766370091dcbe59836197176826e5ba308c71de83b87a121f2fb6a15a654342cd9798ea78160751416ed250b2f4769f29ff2b408cfdfa23106a53d34a621911a8a9357c0d83dd96f02ad2508602019154cf37508f75f10f39c992512faa761dcc0330108737ca3ec47cc9de21a13be64478794601900bec72fc08f3dc9ecd9c5685e5e730ebb55f30476c3bda086888d8b228189d3f3c1a5c957c7eb7776b4614dab41f42e81c6d3710321a67f5d1b3822653146ad27c4694048c157f213837bc21db57d4aceb058f2ac6baf12a5a9c4bb4357eeb5769843f18a14f2941cde7d11c18934829506171118b70adf9e0ca1410aeab53b980a8421bab07270af849323aaf6655bda0983a5b1ebe0df74a623893dbae25c050e12c88d53852fc6fff9dc47ccc3d975030faf47886e580dd96b16b6e2adafd2d04185b58ff14f9f6d99652dab4acb01cf326c59367063b9d0ea8824146a808b1c756fa6dd47cad499c5fad0dd3039b71cf7ace778ad2773ccc8374e2928abfca8cc0bfaa1c7fa946d34fbb3b903b2c646d8bb4628e4cff2e568480486e9a396035c121cc04a41f551fde0c623d1e328634e2ee374e26a091dbd5e3c6db97b60e769c887cc26c5f04d6229bb40c4db04d7642e5c0a89d5098402667ba9fa8b23385643fc81f658617ff8648774df9d5c795aef0bb84bf6c21498ed41dbd2ee84829a6ba915d37b10dd099c3b66aaf67b6f76476ddd7c68b1497ae8282433fdfdc4d036e61e19c5e16582c1e1c4e3323a7e667b348e9a34ed00689e62b936db391bdde1148b9ba948396cd365b56d06e96dec0cebeda77ffdcadc071a74acafa0f9b7e788d481c59ab9e4398ee73db18a6281af5414351809b716a30d37f37dbee38458c9583a9e44fd43c17b747c86e419958c775675adaecaa611af212635de2634d4006cb7ae5179799cd57c87e3ddcf5ecbf95ef772c3221316240a7d99455b45572fa4e8184ddf27d6754d5da6731b506702603c97a21b0033ed5ce0146a7c46602bd300307067fcc9076002c95ba4cfa767f8bd16490503dbaa46c80ef5093d470006004344f6f1f3f7fbd4f097e9953cabb2a050997f81e306ca96cf38cb808811f2a5224d4e23cd48d5d788bea46c660614f89d77ee22d0f1339ba85f5a84e49eb2035366eeef2dc35fdd449c2cfe754de7184dc59246ba0945db5a04e2c626af3e661fa79b55fd0b407f7f1f7a4685281fcf2ee9a40eceb8a755541a30647cdd2c23da8d73d9b9adc417864ad2b9b696b3157b5cc7254384b9e49a347e17911bb77048353b08627bdb2f8542578158e6585b511ea9ffdb5c0ee7546f0137a907d9de0fa61e10daaa680fcdcce35dd1190c6d750c7676cb7566b8b9823a04ee6bc3045a108a2bb342adbe70035272634cdc289ad81a0c37855edd942dde7dafd7a399e94d2f900c156859910f8e196e34fd698e62d96d77a6c1a9e4b4940f4646666acacede7bcfd1b389a3744b02baccbb299365b8e210bd258ddf16b1c9482d2664d6b50d8dff69d910bd3149ead45d5bb14ba427df1af880b0015eaecd8289c131b1354875836d82c300d87ca941cdb629957d13c0681ba2b3b6396d038844e54aa9b4ab37011f792d19027553eff0e46c0557eed9c0d83c7ee7597c2af1f4f2d9b610703cec11d0be5de37c54d5a7893e8bacc10871b882080cf4b66754ab7e1f2b8e827cd66f1e230ea7a841d181d91db5e752993eb56175e9cc68d1ac8059fb36ab829fdaf485f49fa266e2449a02180673bb38b39716f54da59d87fcf2d5ff573bc3b45cd7556a189e7ca1fb1a134a752543f43c17d31f3070c3a3022c39322bf844cd99ce6a1eae914daa431b7135d5f4695e5d11cd7e1ef0710583688d356a23652f539c1dfdb46389461ca6e9730182e836732dfcc691ed3b30d6f09bc04e6377f80d055513725acbfd65ec034f9321c0beb4ec0ddc821995f7e5742c911fcf9b713c445f91b3347f2e72f7e63b5436634daaabe92696d733b5222951d2a4c4f926f4ee53a83bc35a4fd6b3315893ec5ba658b46899b9cc26b59bd7c309c7bcab7197d3bc4232399d13f384ac965f51d588c92ef33c48f250fbef3b51535506537015520b8a7d9aa519b328f76cfa26bfdf265a9fc905652c133553c83bf9b55f3b783831e8947c7f4e6234dda30cbd6d8bc5dddcb3d186c2c4ab032eefd9a87b2d912cadb3983b38ee242be55f10c0e7ae2c3b728f1ec30adb6b82b2eef67efb2587686260a4f2d49018b31a057c3680131488a0f7462ae436fafc8a7d83809602b4b9ddbb4f6b61648036bddd0612fd452aade8b6763a7903125bd93752471b097aacfeb267c5bb067b6c5da6d5d90018d20eb90efe38235c84b4f8367169c37c93013393108369d30ee800edef9dd01a2b08e5c9ca80c2b0270f28ac5af471d0d1c015d55ac32dcb92c1c94158d457710c66a8baec5688fac774763ea36565d1eba0f4953c630f061a4e9de3e81012c55646ca0ff40db616654d76cfc631c8785f34fcd121f1a2530d3a20cb486ac632a54909b6fee54b6cedfa7b0c201e57f8bb4f33f618ec98065709fa49ca85775440fdc1ca23bd1b81a68e90470ce5418d433400c0d40b048de29bb5610587d4b775d1065d45167c5217b58617b74761936a0eb1a5e9ac243edf3a4c3717c200728f2161e07270ca82bc231d19526bed3695f7e0acd02fa271f7c1ff04e26c407c4c08538a9ff4652f4787e500869b269928da294fca781d40d3754b28866275ac1071c1f5a4e66504426074830c37938a0d9d4f1fd83cdd994cf274644a9b4571b27226d1328a8fd040126d7d9f3498381b375ef68195560d6b8bd4357f0e96c3867d81a811ea32ec32a68251f312f00328439f6cd3c2753cf5277cb19ae108f7139c3f5a17cac1cf23830bbca050e6214afec7a0fe5a32fa3af86fdbf4f7ddf11fe6dd15b0c3bafd0613056490cf6a9c54dba2e74aeb9579eef9d4bddef4d49f5c235993c74945794046c40fe5a130b04dfec89495dcc08efd8e3c888657ff89caac3755629afc34cc5325286e2d632e4b0ed1350c811a9b1d498bdf4cc03f3f119819d06aeae1d8cc0e84eabba495bc3472a64b4d0eb1ef79c85cdc8f0e727c401b11663ec58991606569081160da9a670e38a09b5bc1dd56416f77666db6b542288fdf7e36339f99061d36858e71c7b46f21c5960100806ab68816d2766e66cccccc4ed74dfe4654398167ae44434fb9759c501515fc1f5f427f9a6d27c4aab23a32a3f1f1abfb61430b86808c3267d42ae2e9c4e806724a4e1ce9309be8f6e58a0b82439fee4c4c577ef9f049789ed75eb3f4379b76126b63343ed46583cc144593b255bfd852ab8d9d70e0329a6eecb1a50cc5903df446cdaf210321c62e60520eb218c16d0bb1b3a5604abd0d2c828323bc0882e48d66d2291550917962e6fcb2708c4cabc528b87fbd2fe65831d1918c5e82ef8f473540a68694d5f104936485d5567538dbb83b64896f6a0eea0186750ac9b3dd385e52c334c09d297c6be47198b164906f351cdcf478467c214a5a40c8a424c62ea595beaf35b6ececcf9adc6c54a52612dc7bb2ba3a43391afc349971429788bd91403271376759306270363f9d47f369f0baec6f675c2088cd030bbbad9a6048a103682553031d741e515c93590985e266ddbec63ef1cdf405342f272ed65d491055c1e3d38ad65ea7226c94e91e92b9eace3c6d46a6f3371ef1b099aeb51a3c7a4eda4b5472fd4da514168acf5f1aa71fcba7defe1bfca7e0eb30762e9c679a530354ba83ce97ce396602d0d446da5a87829da2a4f60efa02ce05fdfec2739a21fa78f80426735851a2688e400134a16c3cd2636d355606134eac9e8da9689e364dbc9f89c115da50f95553a055b422ca4e82d15c8b61357bc0c58c3f8547e6a56aefc8662e9dc8d98df140c743363df4565ac812b874522b32ca2e14b9985a099a9f3eccbb5ff8fddfeab8ef125dcbe93227f828cf1d3bbd210b2a95540fb33ff5be4b8c0233cd2b0d4b278609595fceff05ed3254c64a27b6d02d005759aedfb3496f5dac1d30292c91dbc7d718920de9a08ad30958b1bca406d03a3eb8367096122849b528518d85a5b53e60e201ad0a442a2435eb3f3b8792258e590dff697931ca38c535023997acc2d6a23cdd0ad0f2d9d440ec87ab7c8829bc790fb6949c5daff684882feb25100dd890f930b68d60cb4e21e4362f63a40a2c8fc521a17f9c84b662434dc9bc0d96ca789f5ab08e0d5c78d4d4053e7b76db136e8f8a8383f0824520fc9122a6919bc3373b78c79ed65d7112075f2520998a7024d5f42204cb6fec96e5da75a80a26d3ca3d8f092fd1dc8113a8440aa8ebdb9526ea7793882e23132e4b3c95cc6bcf303247beaf55ed789955b64acbf0d1d9c5d0b3527b07fe37e293ceb48293df4801cebb58b5b568b42126825b5d61dd7b696e5009050ece0a12d5708150f6bb070bfee7620e5dd23d6793faca0530d607f767949f6536e39589fa9fffbf4990e92ea64d24a5ee42894786f445da57955c0f10af8cec67323a6d0358a2761e251eca905e2d096a19ea1133bd3da5a6a074a1dbf5f66aaa898d030a9ca35fa980cf4dc6f8d782e2c63edb34f5c6538c143308f5344616d79e29f16e2dc82ecad7ff5b1ea626f573b75ce56d10791e40c85d4219e9c7ec23f154ded42760c2f52002356b3aa770a60e844473b9ad96b8a32552b0ce1b12e6137e3de785d7f07dd13df43e36beab440f497a90b4d3c45f5d3901f616afa5bf3efe483e8886bc941cc0a628c2cefd1f733c5f428524c0d6fc8529d8a2262087d02cbf9edcb297782d273c7267fd8d8df4a1456401680ad2ef080cf12c6ef92f3b23212592e66a1da1b06382c3397a799cf88da32097b47a41481c074665d3e61d1d9c39c5ffc5d8ef092f0a006f91bb1eed17c5478a05d674292717324bda743545e71aba2c4ea2de0e9b1883a619d45da140a52e04f81cbf152fcd915e73539a2b09b8b5f7d60ef00563fe7b73449686f084dd81c098196939183d9804e4c469829cce6a8ba051d64aee973992e41c2ea7300e3d9b0794728dd3bc5f5a437eddf3837ef01b364e6cb6a416153426f520d33c06f74286e59b8414a8d165d68ba5f7a6811f75f721a091286ed18d5ca56091767df91c4fa5bf08930a7dcc3d6c36399cab8897a48c070913ba322365d321b1ef336c17928318c35e97d63736633cf0983b25db180f7f5fc6c396960f322a2be4e5df51b495b8776956190c04714b46b3c17f494b2e65ff8434ba8c7107b7da30fca1323f6d94ed597efebe65449d6c9fe593f2e8dc8494e11c516fcfdfa5e5ff3eba966f16d189ce71ef89595b7ed434f107d3cb8749fa84847680fd1fdf53c13755263d5db8e1968f77382fb853979e544382c6c33bfdc51f646a7e1fae70bc1e5077c51021e37fd6eae7960d232cbdff51bee476e2d3f71b6aba679edfed0a0b562ff87bc6523434c09bb2005b370f1c3a3c6f10abfff0d7148f2986e7f7c6a3fecd7a41e0afcf9c4f921c7ec2f6b1837f38b20c111164b6ff48c7f8aa366547bb41205427be702459a29a1cf842b9e3f313501df86ade658d48f5da26017914a11240295f79567c282645942f467c9483b25afacbb70dbf9b05da1e2e5a1f4dac110c03cd4641b3e98d9630bddf48c15ec8e9da23bc25e05dd0e094b1892f3c3a6f09a3483f0d850c02f8dbe3d59fe9a851fa04d4255bdb4d848aafec13e7063fe6e103c94fa45d24c90882a8a6535c3de657eaad543af4b3ffde66ef422ca0294b624b3b22c27857f40a57a92220ecb3853dfe4f1d94fd9415a15d495f8e293922106eee7410725f4f7b2f6906a0a919007f5972e123def176a17462041e6384e60e561038cc6a737c1e9b3beddd1f692896083bb47fc417d1ca7e1b4266fe066bfa5aa2da915e464ef1c376cb465b0b9bbf8a4d7bd38b1d8a21e778f01caf3d76a1901b5b93c239219d53442770f4b6d192f5d226524a9902980e230f110fd8f45be67bdd0c59b51b2207f29e8a47013575dfe47d4b3f3de977338f375e3ef1dc04734e4d7e0ccc4ce67bbbee6f57dadc045d13346b9de9ba2ef366a8d6995ef3c0f4da35fd1b87eed393697ee39047999fd769d07c013b69fc55117e1f86ee618454aa12c45f8da7bbb7133fff0141f10b5561287e2ea16fe87bd5386a71b5fac0573d6b1c520d8daaef637ddfab54e357dea8fe73adc64fe8fb583636ac7114ba2af06b29d5872ccc62b158acebe04a253482606a687cd57f2ea1b154852ad57f2a30fc3e7114fa48707cd523c1e4383482ef1a47218f143f2f6a91ab51a86b5dfda56854aa9a9a50bca2288aa20e9a51fc14198e3524b9527db8da6163b38324cd90bc244992a48a66144abd4a55338a3f8ee3a84a95526e19b10c0a4d55e9be23845b226b5c22ee188b66c40f674495ea79a86ae42d63f2188958bffa9035001628744df1439a4b43434343e3185cd58c42aa17778ce3b746959812ff5395526e99b10c0a4df147a16b8635e2e7125295230df8d18ca558a64aef71a7cb57e1192240ef536089f3cfcc7b0faac415487665edcb1a8ed97d65ce33ae2fa45316b3e66ffb31f1e3fb35a72816d62ec03da9fbd9a786c77b1765e28e8bce4ba705c6d9c1c3d589c185f7741b702dcee8ccf880c3c4ce030e4b91e1b0ae0363746274643a0e74617460741be834d065a00be3b016996e8d5a1702137f87063eb2e3b12a14c715ab033b324fe6b6664cfc2957cd0e1e2955288e2b96efe0962ba50a451e3c78745d572ec1a324776880010fd70eed8e81683440101441d87dd8b99e3435984dfdee3abffe3abdaa3999daf471e8ca7853a44a1581df2f6185843c33c803c1fb7dd8f372d769adbb9c3d8ccd1a2876ae4f06f29a3530a5e39fbd20cf9472cb78a6cbf34c4f08d0d4a6ce42e20f2ff6eee7688831af77c57435ac8579350e038779f5677de1f0c6a06b9aee6440d5182a317701dec73a6a1507f8d461f93c34c488e9b296ac4547612d3019f3923e6224f866c8bf7b217777f79cb3bbee70d7755d8731080ee9d725cee21d83f42804baebae74f98e945b46a8fbdcc1944aa50a532915380a6553ca2df3f3937352aa2eb4b1098b3a3195ea3ad510fe2eecb4d61dd65dca3d548d18bb88be2b92a438127def8963d13796597fa8b1832b3d0a49b965c6a03028648542538766574ac93f0a5d53680c4a99526e1907c7ae3575d9fa0e494318e6fe8eafe980e9a114b8d00bc6c19f18b88c7b68a114dea334c66762fcc442f609bde41c1c6aa1e43d21175e4c975785e7e0dfe1f2422ebcc78b80e368817b3c2e180757e1302a3c0a78537852785f1c36018779f124e0302fd9c773141e145e172f021e04bc271c463e7e8f8bc35aa1972b6a5e16476a1e93b9552e962c600be2c09f52892f2863e2cf6c4be3ca2d31b55c527c073fe95ad97614777cb8e355a91d0f7ede8e724acdbd22c3ef704dc95d89f34c551a4d98f83350a1e11941d6ae162e7708eca38373f2e72139e39c717632f9270ca303876e74970a2baae81cbf2649efbbd7fa5efc1affe3cc0a85667ea150287c013b658c8708b17f443795ca8f73ce395f0757f91df41ddf71fc589bb596897dc769f0902e5d2edff1c733b925340eddf2fa8eefe85188fc3159decf4fce71af060aad3016ddfcc6a01a8c797852a314d209f2e60baab00aeb72c8eba4dc32a62e6f8654a6945ba62d63b211662d5c0efbc25791197c7f7c8ba43efc184020a82debda92ddb736e6f7eb8b7fc94f03a576beef5cd877bebfae0f2f81e6d7cd98a0eb5d1df807eee33924983883efdff4ffcaec224dd0a5bd1450e889a10b040a3f31747d402128862e0f284c89a1ab030a5562e8d240612886ae0c148a5ea7fa44d5cae5a2314797e79c16cbc43438a7873866200c1486d771a8572b73748540a2cb81542e9b9ce3b906621c9cf54a3f69239a9e4b77e1a73dadc304f1374778c3c4e95e8c4531eb2e63f00669337fd8f95027d499d8c9ec6eee2bf9e7bf42de0d0adf7b5f947af0bf328f429def086933e7ac49120485f24dd1f7de137da557dae49c2ebfcef975f6a12c94bf2bc19cb33766577609b9d99537fa95f2107efdd925843fe8de083938e620d055545ed04e1aab7a08c34b628c2fc638b82cc5cb44e6829de8b2832d73b91ce00207eed961fa1cd8c78bf25cc3f8b5ccc3cafd6bd90170809ec118ba47ac690f8ba805e3bc17957d4072e54581516054cf132c84f740711cfc21987d3c1024491b9b7f1cd08bd2c20414ef111b10e54a15e139f86b5ca91f3c07bfd800ef49ede0384ce09e54168c53442a010e23c261e1e34f0de1b0d4e34f09e1b0201c0684c352a91f442dd907f4c161ad1e1c36e3301d8f3fb583c3461d727018ebf1a7b2388c14b5dc11b07c1246b0f000d17c2db500137fca087c84e6f1876388c0c40f82f7f33a700dd377c210b8ef8862b00e570bae02b862be835fbbd0305d02700d8000517c473497c0c20354f32ad712587e806a3e05d6fcb7442ed998ba5ca2a67421352f01ea22e00fbbfb9935342ef33e96ec13866e6479c3c458c2398c8062c2c435d43c2c220f5eb28468904790351cb3e6636431f1b3e0b0ce09b3761dcc2f8a5c66f0aa0221fe9085ffde4b3ac6d1d97118332f691141621cec229720f3d3e3b041356689c3b8be2b029c75eeb4f6a2a2baaeeb4ccff33c2f8c79fd416c841164c84445dd2ce6b8845400799b7c0ede0c99baeb12ea77bf576310c4193f4e22f43e64910b101a62dd307127f3c6f3324d1695eefb5f7732ef28a47220a82be07f7f45758302f8df17816591aa0453258847a194d038744b2f3d70cc3f32e9baacb5d6a3d04704fef7dd58049636a54dce09bdd1f3b27eb01b853c2733fcc6fcb58820456f14ea1e0bdda1f29631bf51489bdde39b02539fd7e9ec37b5d27f4d1f83bcd7654c1f9d78a55f33e30e7f63847ec15128685573328708f187413572c4a298853c146c6c348d0b813426cda847a1cc0a0a594fa0aee45cf946a152649149a44621d548e3352721b224539eba38ebcefb5242770a7d35b611c9fc696d76aeeb79218b755b5a9660ed1964698769dfb9acdb53f361d2e09c8f04b5b6b939834139dff7c719b4b42cc1a91bb234eed137432953ff357559a3e25d30011d99fc74afa831ff76a552fe37c7a025fa7377cd8bb3eebc0f4ca942715cb1c8d68c0e9a9a1d3c6c30c8e0a6c792aed4c077ee6fe03b9703dfb95d38c618ff15660dcf61e2afe99864f01b188e28acc9acef8f937d561f663cba1c4874c5f0405bee879eb7257f985d79cca6e7f1e49cbc727956b93cca259aa20b4a155ea82d1eb825ff96ef43f775c9c64cd56a4c1ee67d6d5ecf795573c1fc4ad277ae6a54dd0cbdbe2e9738e65015a652aa55ed05f3963f39ae3005a63e4fe53bb7fbc9395aca0b4f662ef53703de94ea9a5e199ad9754d107b7284516eb392a2c7125568a00d1c62b8e28a130d64cc81822b4fb840032e80f23a7d930494170974b1c502a000aa916072884243993e6060e00811448511a28a6c3a981bb6c8376c91c31cb1714605dab861082cc4f03c2f6320bc57c7c48f69fe1806336a061e4c5cb3f9018c0c53bcf6cf59a5ea9cccebaab5a68704832e27f353ea721ce187ac94e7e994f77daf552c3d769d089a597f2e27d3269aba03faf33a283664f01105d5011f1a0a8c59a3c9a2ddeb9008c20360b8487145095e00460136983983814ac2cc1d9839e71cc50e5d687a1665baf880131e06310e098a9fce39e752c7878d09cc9c73ced7cc36e0f7c03836d9c707ce599411c3ccf9c59cf3fbb83e7ca85c38553e60d67c0c0182616aadb556993a7b5e152b76f03ccff3aa405183e784a9bdefd39dd69ac646f3f0e01e9d3db04a027228abd89043952b58aa3c5d798a2386a714c8f0640228f0e90b73c674304f1478914b77b317c30e32a4740c31d800ae20cb47021a3c3662e83aa03def0a066af0b7a206ef0a143580b9a244161836f094845923554938fd8044192f2d08838d144861c52b80c60e4634600716d0200490bfd36c62180c08a3013631f565351860764000753e787e8644f10ce1c93e9f3b25badc3d4ff9f37384ee481a9b2e6b31bb37b3fe1ad8755fce588d1bccce04bb2731cefd3af8a9bd0f9e2cd4b0400be7963c363c43602055a667918608cc1acf0a869bf58bbceff789d0df75eb8a0b665c0993e50a1833d600ba626600023b7421a6052cb002c8bd754bc7389806264c0dbabe3cb80747d10095718ce8965746d13084a9a3ac841e904e3e3a285ddd971a635d3e9993801ef8fe9e4b9c83e480fc1e6a4bf73e401536003f406a406a10065db3c7cda7bb0f7c97b802f286bcf14a9bf273cef73839e7fb3e92c67d7c4184196040ba0e6d48a82dd826747c04ff0d59feb8e441de47825fb89748b8c31ceabeef33c2738f35075943766f42087e80a4d1915d34b38871488c137af6f191cb2f82ac89ddf7c02f46c5f086e951323c99f96dbcefc19f9fa4c13e0ee44b607920afd441668cd10883ae3943426df156d8225d9bfe65f0bbee311732fb406dd1afaff7687d4df7f2c6ecee9521ecdec32b2049f2467be5e79cee71724ef7505b2e4b05648d34796e969045ae42c7ae30bce4d52b126a0b8845c00fb5c53f867f75e0f7c1fb36d79160a77bef1406c8028413592c2146045f806aa459a5878c2652c0850732bac002c8df91b28f13102250838637561044101900aad9989e7e323dcf733114d0c50a941881153b7801f2ca1f337b0dc7cc3c663ee38a1542a025890f3cb101167c71bdabb5b41155cb001727c0e20a0d84808d33c0320298c38b233400810d28808c2fccd4125c6cc9a10b2b36942004403ca6fb7bead483186920410518095ca18367610617b37b11f7706076ffb827bfc009092f5010c504b0e8401465564098a9259a08bd771f350f733b1a97e7517932b3aba65d7f008e6b3e995e8a34307818bd05e9e5ced9283306015ec811040e6200755dd7755d59b3fd98ba14af1524489a9e85196d989ee95998b18359d3245ec2bb99053700e917f5f7f85c929ecbc645e3031b58b21063cc0cbad3394a9324cd687a1662a461b24c07f3f400b346ca91dfddb1eb267503de7cee18bbdccc187bb802d2cd8b1fdb701de6f79addd7b489f377d9cbb9ebaeeea450d1d9cb7fafa94bd09fb58f2cc290319164ed64ea6ce20c84313b11df22b5d4b7daac7ddf823715dfb4aab77d63d79777eed8e5ee529c741b7767d7976c2fc5984e996ab39d3f9ad6733d426d3f642bfbe308b51da1b61fb93469674a2e456d3b29939a2aa5b99d213db19e9f293b3c2f117c5e407eb0297ad26436556d7fe0722d9b5b7fac7b664373473ff64da5fd70c739ee18c71d7fe0eedadd45770c80cf036e841ef5f4647afecc084118b686c81fe6724909a14bc99d0d84b252e5e2c73a6b9da1085b40dc7b95ee2b79ef4baed65a7bffa5f4f7aef383e0df5ccbfaded739632ab5fb9ea6b284dbfce08319a4f231b99f762979a952c9d3df81ef64d6f07b4a5e2905bf3f97b0f5c3bd17d7c04f3d7685a1fb5036bbb5d54bf8bdefb44b8a8da9e4bd9baa520a1533f5d825c526f5a0fe0b9652a8749f3fd77429c5ddc4b80236e4fb835d8b07ec3e3a239de8c20f64055f20fcf7c3ac45118bd8bdf226e87b4fe92b9768c2ef954b34e527c10a94fea7fcf7314e3d1e9fa45ebba05c08ffa644a7a7a7d015030940f9552e282c17287f0c2400e9cfa295fcf74717d4f8581e287cd005f594ff965056f287e5537e550985e581c4a7fcf84597951185fcf99fe07751e5c272b15ca0d4872ea8184800523d960b14be16c5d285100a84e24062e9c296a2f0efbba07a0cd4a5bcbf40ad1c48295ec6f44aa5259af02fd1a45f3fc17fc71b14f4e32fca7f1f1c9f64ecc11082d9870a9517f0e77fe1be7e2a5b8abe573d15282c0fd41579dffd0ba907dfa9c4f0405d49e58554d9bd57bee03d586279a0fc5ff98277bf2bf3fbbfe0dd14e8ba5c58341496186e0c5ba490705d31b8a0b06c914282793f065d6e91428299dfa356085b4280a1e2e98d2b4cffdbc5f4efa04cff2f09b303b3050f6617bac3966eba25375df9255cf3fa3736b94dbab2e674e36527fffbb7d5e6d7e47b77e964d7a63736b94dbcf70f07dddc5bea98fe3a267eef7636dcaf54b96eeeafde8142178b25feaa7461f522f90ee442f8e3aba07ab27481f5aa1f4b17b614b15ef52eb43e0c5d37b75cad5e2c6fee8fef0444457c567973cb1b14c2677d51f8acbfb72c52fd585261bdeaa9b43eacf11df06fee7fcec9ef0424ba6e6eb916894f8236e39325152a4e3a01b14a2a5b6a4bb0be7c623dab7cc105244f7eab141f244b128b00feea595fe3d961c52a9fe49c560f1ec6e50424ba9c80420ff1752ddd12b2eb3e893f9654a8e0724e7ea3724acec9bf1239102de7e49742e440ab2772a0f13e892c34a460f35e236e1623b4183184572fba584b52af5db75c92824dfd2cd78d1ad722d6af4a2a5456bf2a2fab247220a8eb859559ef40abaf5d2e667e24997581c22b8e17c8c75bd2f80ef8dde8bf0fa42a411bdd306013335d9767b23733a3c5ccbc7663666646bb21cecc88332228aa728b5c8de08cf8216e6112b3f00a8f58543da8c7e8317a4ceb7e6370ceef647868379ca8b8e1f9e7ef260fffca9a13151eafc56837be771e8f24f370d5f41c3cb2c9e39a3c348f37dcbfb2a6c968323cbeefb3fdd87e3c1e3cfcd3f1b53ed6377e1f8f991f83a779cf3e19fccc93bf1279bcea3570f1f81e2e1e7fe3e2f119b8783c06362ecf393ccada8ed2f663d680a50e12db989f0d1ecbda975faad463f4183d468ff19c76e05412974cd58ce3387635aa71ec3ef0c74f93d164f498b1e67e4dcd6b37eed7e839ccdaf87d3535ff7d5a0cee199ff5da8d5be4d36f98b5915553c3fa6aee7f6559d364ccf1e747ff25bd9ab2c63add0769ca1aa8a39ca97d0de7b2caf1bfb2c6638ae1a7c7e831251885575db772105cadc0cf4ba95eb55a81aa5fadc01aee0204c70741f0c515b812555f66bd48beb8129f14c55275bb8023985721f8e3083ec65ff017fc057ff998f8becff90b432f0cbfd03ff40fb37f88bbf8be30fcefbb5cf015a197de7f1f2e09df47adbd9a4dfc0cbccfe287dff78de32a3fe9e3eb70791ec7af19593d1ff91f49b69ec675bb88a54d3453deeb985195adf61e7ff98cbfd064128354b4c2b00b7117ad30ec5af88a1047e12ff80bebc3562bfccba5f5d84bab86bbf056187ecf0a9f85af68858f04b7eeb3ca0c52dfb19ed50a75b8583fe3f29cc32abfdbc54c7dcd269ae087642892e16bfc057fc15ff0177285bf383c4ce891d987754bd72d2c57046f29ce40d678c06f065229f59d59e331c54f81aa510913d105be8fe2bd26785325fef2f9085d383a3da18e6321af59e3e93efc055f21830f9d6f06f29a351ef37e4af5e2e7fc4af097fb432c55aa9f2e788618c15fee8f8bbda4c2cbe5cb2df281e5cae58925fe7249b0cc5388a487386543e83e3468a332f2e32c506cd1f0b54692a606b2e6687c38904aacef5acf1ac9996fdd56ebc71fdf0d528b61957accfdca2216a214b11005f7784e43f7e9312d0490de5fb3e6688011e5c381bcf98d66341bee213f3fae9d827b567accfd41962c56cde73072c34756a9ddb83fba4782cd55f7e9314e3f66ad7bd6c9f4bef6632396351e1cb0fcc0fb947a41e8e3ba04cf85450379dfb98a4820cf97f0745973ef0999739e30053c45fea0bd5c40cc13590bd682b528e3ee0e47082e13180873ee12fadba005a6915a09b326820ed31f45431593e60a11de8bb3f64f043f30890adc7bc19402a272ce29151254745da70a8f98e2fbbe2f148df8924aa552e2588497300cc75502a218c725e338ae58ae89c05dc40bc60b9715088690c00ca0e912b012451cacd52886aa9478730942ff8b7337baebce4bd04427de7b6fe769213e2472cede97313044d775dd07aac08b0faefb8129d16feec295321d8c171b3a2f2501115f1c44683a1828ceb8f7e20c8518ee3b190440682da67944ea1f4cd3c17481c2dd47bfda073052247102d525433e29c2f842fd3fa9c568328e4ff01d7c5d4fb4649f22289e941b361ecd63efbf54a88335e2983c66c6efc6fd713f2d06e3d4505e2ca596eca3a3ac81368fc3638a7a0c95f2d363ee8f7b73eb0a7982c31cc915a66b61640c79bffb9a1113fbc033588545784577cf387311e23bf97a1f89c327d987e5b3fa9c7acfe3f839075495b53b85a90a7fe5729c1396b5dbc5547d8fef57622ff7072e8dcafc24e7e45459f331cc5c7a3ff8cb15821f5329c1ff727fe0ff5e30bd560c644d4854cf875f08f6e220f177f9c9a4b03746172c0be08271abb197cb250a47692ac85c9f999172cbb05c35fcf96612fc106b70a61b99b839d37a3de3daf13afeca7883c28ed7f1453bcad6ebf8a29ab2f5340fa6de041f831fde990f41f07e1ff6bcdc755aeb2e670f63b39be9bc6fb5defbfc97748dbf7a249874b11e49f695cbf6638ea51e737fdca0ce043f740565137c952be89ae0a75ca44bca2d6382be93dfd3e102f3bfa09d58b86b010f3a2801c50e0d28420c2f4d783d6ce0c51a69c0502507304eb840c00206b4c00a3010688307a724a4c0c0d31424c862c453143f63c2a53052c0012a36700618a82635aae8228b313350a0090554919d822893460d32a4c086123cb1f40e62fcc08232aa2861011ee270c3898a16f090850251c830869523ac2c20ef70440b8e0863650b207a606207333f6801f0f33a9d71d6c1747f57bbaeeb3a06c4f04318440461831a43a840079cc50d6b7881630927cad8613a1823d4c882e45cc0567081097429a3060f60e81c5eb0040868b802864b19739c61acb165072e88280201592ed4104058208604e020430e5698507cf779f68a80e187cb0b12d08231e10f171f26800005c8400128ca30230123d0451c61ea179f94f122470736e0822e6e00fae1c205fc8ad0a1082c668d04adc8df106144f0b5d63aa5b5d775351c336b500f91854a634da3bdaed35a6badb5eeb23b98a3b4aca1841133dcf04606340e37081d9c40820c18262003694343e60f93a00d28cc80400992f05286039f35c9e5838041fffb7829c430112502214ed08307fc3dc9f33ccff3bc110261065bd0020b06c428a38b2f6db831def064021e4490041c69546183077e5a835fd779433440242373c95c54e61dbb1c17e90559d39ed9e5cef49deb323bfd4dddb74cadb5d61dcdbdf722c125e83b3934af67deecd2e605c10c33c6f87a0e57f84bfc2098fa84b839e79c7d0075ce39e7c7c1e2236d481a1f26d03650d9c1021cd042460ae060c16a08080f4ce1012178380105b260c01adaa6878fab4a757180f6545d0f8ca36b509d20634b96359a78c1530d4260e4c0c51822c8640101cf74303970f172004d2ee6edaa480101821d3070adcb90c1e6023319fc78805fa7830d5eb6d15aef30b5aed13435d00001840e2066c83223c70d2d13d440b28100561933acb2f0617ca207514b113a845ab2e0a092a387d4181bc03370f8383083374510dd0f0dc841ffa00310d9e3d04276ee43096cb89ed9c0d201b1021d76b8c9925529d007224ced69ad754a24e5c0b20519480051051061e82e1230b5d62c53d3606aadbd0c0a7600c10c5c1cc1030580740f9bacb5d65a6badcb9a0f1b1f41c0e043fbf0a1862f68c0e2234af7e082212194106381196680401728ce087d90c011488869830636e0706344009007a088830a34ce500102a010c3f33ccff3bcd074303d789141ddc304c02ef595202922c1a9ec799ee7e5ae872740a72714c851011b9ae0220b2d3ccff33cafd3369fe960ba7c89000f62b4a7713a06e49c3baf89afb301dfa647ce3923f169d086044533a050428d2f8a480205542001768181110f8832c3041598401143649bb7e981d383109f5fe1c5070f83362428f6c0c3e775363d70a230f38b3a3a60bcd830c3e88659f31182ac4a7958cc985fd7753d6c7a3cf8815d5a19b42141911c928724017a3a639bae73a2cbaf938738200fc18142cb8763c3a3f30345115dd7759d91214670b2cf10287630bb6e48873364c84f6dc8ca0c1e0d7a1d1434e49cf3e3f87817dc00ae40866f0c969c73d7755d171098397764745dd7755d3260e69c73ce66eeba74d1759fe7a01ea34a1a1560228d38a0c8103173ce4d74f9e2032a8063860a58c91df9bacc34d987e7e59c73ce397b60ba5801f5f9ff7d7866ed79c6e81cd4e871cdda0fcfbb4779603a981cc4982bd3c16431c2acd174c9294f531183eb5c66094461769dce5a6b1dc41a1da83b4df37d5dd7755dd7755f07268834cc0e06a0aeebbaaea461990e26082e3c68f1aca85266a4b2e779a40d0d496303ba0ba0e0b0620d1560a9018c28dad06880337400c3146b8ce009322070c4f703055c40b085951e5ef003191e1615dee000153ff820860336104518a6e7bde8791ecf8fd656a832d8798f13e56388cb41451055b4a000022fe8e1cbcbf0c2122ee832022f7aa0a28a0c85a8bbdc457165d5e33dcff33c3163c444e1010f5cc1a2f374d6594f91040c6590110115c071030f5a523a062725def8620608aab4d144193bcce151364e84b56be6f0620c3ac6faba6ecee02db3eb7a405e3c3b2993ba1ed1d893d6c3490e9e707726d586b4ee25f5ff69ecc9242945d7160a0c16c3b1adecc4ddd42430986ccf54998a940eedd9b926e152206ad9d304b445d32103a0b63345839634d97038f3087bda64b175e3a69cb729e7edc894f32643d9145ddb293bb6d9f368dd4fd8158e04119233c2b2a72d8992753f6161b0d8edd2caf6baaab26fd5f4f70d6dd3dcfa48e8cf762bdbb829fb59f47fd38abe88516c5563b34d63d114457a20775fc99cd420cbefa357db9fed96ddedeff57cb6b5e54ea43dfb6d3b42d9744361d717dba2379e1791203b3b4adcfd3a4e32b36d54002d2d09dd4ceb5e3aa1c5e5d6554d12343b81f65e83642c7a83c1d8742ba92d0cc6c260edaae2703936b66fe78ac4e6dab385b265e9693b81f6468ab14d27ae6955db73969e4d6ce7ba7127d8cedbaa3a619bce2730db5edab6184c75c26e01d0d893498a9eb423476c679baa0640579576c4886cab80a4aaeb132830d846d7368663cff69cb5e95e372d4593d89b92f68cb5e966d3a1d9b9694e9464aa0d28655267b1d966d92d5357dc913d5393a80083194955b4c59db067aa2c36436de7528c69a7b8dbcac4886cab7024857d8bcdd69309975391d2219b4d4d321bdaab2a8bb17b096dd11bbaa66812ba9eb0777b26ed3529c98cb5ec696b5974ca8eb1b6334d4259d6869eed5602a5cd9db06f3976af38759dcd6c2a8ddd2bad8dcdd28d6373ecd99e4a9250a4544db2733b8782bba78e4b4a51db110a651fc999eda419ba1e993846645b0536c6b27b4d4ad1a616959db833b6733b27254693b5278e4567b373d3623229b79894db0cca6ecf164a528a269d2cbb9ba4688a9eb7bdb62a8dc59d291bdbedd9b2b1a6d3b65718ecb65bb6898de162edb6d94e5c8ccdd972b79cecc8ebcc86cef57c62047736d97b2d024a4a5135a9cda931dc6da5c570b75c9be654592c89bdc570b75ccc76b66abbdb73864b2109eeb632f105b8fbeae40050772772d2c6e6ee62cff57cf2e9de4ced3efacd9e7b95a5e837d96ca70c4dd5564dd5dbabedb3b3bd5325996a3bfa135eb3ddb6e8eda6ca6e009464e7d1cfb6cda6aebf8f3e3d65df9eb45676b2e9b9b69f6e9cfaaa13ef03277974695575fd9d74ae6acb6297933ca6acfbe8964b71df74da36d175770c9ce4a1c4dd3f48d9adce7e766edab7e95ecf27eebee3ee3cee5e83b732d0f26a378bb6a8ed4cd7dd4ed96f4bd5155d4a979440091d65844102122260630b263a608400359e130885aa05c51739bc1406c0690aa2e87105045e3c605d310108579631480f4474e9b283021b1f6cbc08a309252f68a008012398e1b9098c66e9c6e14ea3a7b528d3af1bb5ade7fed94ef73e7af683a6b54db73b10ee5ec55b1bcc665bca1769d3cdee15f7fbe85b36777bdb4ed393267bdc6da5fd6cafa74db6672d7a436dee18c81d9b54dc3112770f72ff827077276f95a1c41d9370048fa0e4ee1a13c9014dddc93c19f977fb5cbb1ee1fa67c49d75adfb39eb763beeea8241b48f671ef4061f06c14ee77b9d077e39f68b8226e1fa57a4739677fddedb75437088fdde9b31937bbf8befcd9e01f0c5f7c33b88eef5eee7f88eaf8c3d0f47f55763acb35c7d2f565d15e09bf2ee6a9cf7bd357c2f0653c037f8624fe34b027caf872f0a97c7bd198316e8f2b7ba3beebd1713c13560be445c7c3d7c2fceb18bb52a35048bf708783b1f7984fb61ac816415c63787d5730fa0818441f90976ed5889ab338eeef0cddef570d5b88e9d2449bf7ef5c577cc053108f7e20ee37caf90fbe38257c418632fc9fd00638d2f4f7e85188000b8e34c06f887db610caebef93a7e825f75b563d4f337ba36647759e03a922c70beded5df1d6fd6823108cbf7275f8cf563318573bb7b3f1e0d84039e8b551e88bf7b6117630f64efa6b0ce4bb7c4b97bf3ce4d85f882dfc548f0067803ac41f6ec97753d8cefa8c9ac310618e3eb5d8d74533e6ed8e1dbdd95cf0d1efac214be47a0f8e18bc205efcdf8eacbe46a8089e01e38c41fee6ebef8e20bbb1ae0107ffae62edfeb73f3c5b9a92bde7b8bdc0db02a7f17d417df0bbbd7db8169aec6b7d397080e6fc61bdc9c31d6585f2218df0cb0eaa62ea8f1bd177635c0aa2f5f0dea7bafcf5f1b1040233984eee69bbadae6a652b09000371bdc0ef4c5d8c3dfbe640d4fc8e45e7cf1bd77c73fc7f9009c2e19018cf117c01162c208c0b5861b2b9c6a3c208534d0f02217190ee5880c6c28e7174e74c4144410b9d4135038a246e6c939048909476c900226670f1e2247d8fc2072ae1ae093c6e8c3c7a5ba3d695c17f418954940cfbfc05f46726cb063c404d6416301aacef3801082113a26e0c0e8450e9ec78c1ba1a30537ea72f0d730b86777f70edcfda80587fb017251d8f5b571a78cddee51fc89bbbbe0648b85b33d67b191956f32154fda86276d8207c2df4f0555c8053c759df801808c2afa08209a879844033c043c6913523b543d6c60784a09400f206f10b69e0806813f9e2a17b151755c3c815e9e68a25449f9642250209ef1d49579eac40c38f024b625154f299b15fe8a743f3a1eb0d48418fc6045d7f0c472b15c79a7f503b46995b1d28500fe7c46322b1b019378ca4d80fcf0549e039e72e865a0754220f96a51eba882ba103e017819782aaf26d28834299bd48e4f00d90556bc0c32172b9d164f1ed4f4ed631e68a06122cb6be99b777212fd44e4e1e16f85efe673d2d5acae17e64e8b39679cbf0ce694aa87ce5f0adf0ceb89aaf579dfcd9f1ea27fe80b62906faaa438e81af0b472409596a76f402556f41956cad87b9917b4d181313210660b2d72495072c8b2048884117cd4d404637e7c40b2c08f000338c149192fc0d0000738f068f90149106788f105982a24e0c4123f5e00f021d7e2c0ae2a38019932c200030b289c5e28409401b0708213a1200e36e0b1630a299c9c78c00b2ec434e8a1a61cacce3043caeda9cc0b58b0822804e0b1a32506982caca84202513c81c30d33c40a2080154e7032f48517596080025a9878808c2fc0605105150b4882862b309c808c18615441c51410807adab3a125ad910c1b6b9cb10516527ce9d2440e36ec59ac005108b0c2d09222b09cd6f885175b1021440e507b5680000c052d29e26cacf1851717c8428a2f5d9e6842871ba05a08c0d00845603e4380e4ccb4b49761630d332eb045165848f1e5892674c8e1061ba0d488b51085841faf39e430a104d6ea033db2d440030b2bf02061030d4d53b6a4cae41760177472e038c0066806e026f0123708069279ee2bdcc921e4dfc101ee716fbe0c3206d746f3b83b523a666632a959e28a1c331031087ba85aa90ff43eec795d97af7b502a0fb878fa525f4aafc09e2f9535108baa3829411c4f05fe689175b5e8c534531e734b8f0143104fde0a7f29ad336af0f38027950ae24cebacaae021375d0afa7a462af03482094a5a3060add226e4b0e0290456400853e576b0160748aa609d41dec15dd7912e84309e3c8f832750352ca02b59a88a0c4f18a4561069441a0304d5e04056b58227236d4ac84807f24be5b153d233d45005d42b4f83cb1252a50d24522070000a84e387150e3b24ad8f882e6113808b151d1d8e2a4805002f8a06e12362650247085961000e3b481ea851660202ae780a734842c03006615d157ae4221f063d55541f114f05aeb2cf9050d64015b48227d53734420199dc2c0952a5988850664626f0c443ebf4a83c988ed153854bca022ce0490532d9e08886a72e93ddf550f0545d110f842340612ef501c8c4537d188c4a523eb493140f9a1e00c86007086008251001a08a0a7c7d4246213e434f3e517f1974b0dc9312f5078fe44b7d2afda32b41ff20b9dd4d76753b7852a02c135952c40654ed48f95449e2241c02e2681fda87c7802710565a491742b741ca87eec1029235b0f2f4fa713352ded1b93b4059801da85053271e10268a8b130c4802014e2e4c619590b6cca8005106c0820a29407962420098c07e84e000c0830e5e6781451913b8d10609473c2833c0e03302035d2cb10014969000d3a0460cbd2ba6f8b28589259250c01146109102ce073f5e42045104a5cc1c6f1c0dc00463aa88a92d1d7040918e14517d4ce490c527d581319a600246a487074da802bf1e37128822ca9e9de0240043414b604380e4ccb456a34ec00d33c8308386081470e2010c705a41059f1e1b1a9d81302950e1c8083da9cf7b22862f1040c2871d683840110948000e27383952e403f1ca91e3c07068323f068bd16de0343a342e19580ccc81541822183803f80b3c057e223b819574edfab81c801a743d460c300f5c73695a3aba19dcbaa45ee1b053e11408e2efebb0bef95ecfdd55dee306703244623b3adb145d713ff64c95a1694ec7fda654516bcbaab2b0e87b4eaa4e77079d5409c0dd01e0a44a08a9c271a347523fe771fef70cfd16fd224debb99e34d99fe8b74d47512916903e9c70f795932911b8d127a5e8a6317d0ece08463e4593f6510bafd78b00b424f788e07817e4eeadb7b490ae33f61b8293200aa091146dd93d7b9aac3d6fdfaae9b35b9d7d0ece96ad3995053700419fa5bb3d9ffdc4ccd24d7e517c493cad4d4ab7ed91d4df32d4c6feaa22ad67cbfe4e4acf35f5f29408da01eebe736bbb59db8974474004c81ff975cdc94078983beaee3827bd2d6eb9b405958e0a07c7857741a5a33ac0ff01feffdf1d1b71c745dc318c8887e561514cf087915e8e37e3eea4931e767f98ea612dd2b6fdab8c5a5a12bafeb748db66c49e238c5006d94de1fe2cdae68efe5974d3da87b1b334a71e3d92fa6d4e7d77fca3827d7bfe6c2bc9d0f4c4754f4e0098bb67e06417c56d47679bbb75a63f6cb68fbe6976eed576b6b926abbaae4b98d4755581ba1eeeaf17bbbe66eaed477b43daab2afb9cd435b43ee0c5df88910782f3ee9e7277d6dd597052bbfc08b501d96177dbd4aeead149ba4fd1da9d270a1cee1e8505155428223318ee5eba3b76326be15e1eb9631f77dce38e4570f72177ddd2d9c71578883b16e28e83b86320ee98c71dff70c72f77bce38e752ece43f70be5ee037012bbb167aa6ccf785e22bc78767e44608f7e2001e1e11101c879741424c8cc070852cf8e8abed8dd9eabecd5b4b62c9ab4d71f6ad27acaf014dea2361cfb46ed69b4c3493cc4dd679cc459dc6de7927adb6b4b0924eecec3495c0077a7711207c0dd4798b26729ba6e36459f45713eddb637f2fbe867b69c4a633fc7dd83b85fd5dd536f7d000c771c82fbbbe399bbdf9cbc3cb437a4eb85bb5f0c82afeabaee4fcf9fed74cdb57b6dd37ddb36dc0dfd163dd7f69352b46dcfdbaa22fde9170977579df421dc7d74f2bebbd7387943779f6d1b7a223dbbdba6a37f24f553156dcfb28d63a7b4b72d4b55273058d196a56afa855d5fb3742bc9cea3d846d7b647c88b6767a7284d76de767670ec6cab29bbbed875a3eb7a1e0159f7c5b8849b6930b04986f6aade7eafa7cbc11386a4911e44d218ecb6e13e022d27931ce0eeb673b3ee449201928c1ef6ce84cb5d01aeb79d9b4d51a42677af39398016b83b90934842b83b09462e55b6eed9aa7e52aaae4cff3aec464fa29c19c32924d1dd5fb374b3e7b67d7bfe3e6a4a692de691f3c206c3fde50ee2a155ad9deb5ed514bdc562297a9ba5a852ecc84dc682ed6cd39389e95c672d5a9ba1272e4d813d519b294371aa0cc5a945ed86b2676a1376efa07643d9b6a373a7b0aab6935df7129aa6b0b6ac7a8bb567cc663b65ab8ab253cedb5e4293daad2443db36dd280e95ed75e39ada983ae5bcb1294c41cd764359b76d969e4c36143667c3ad3928b33487b4899a724049293ab3a94c763b650951ba65ec56b29edb9624294559d596a4c56d99cc4c37ee04a6ed04775b99ac1b69cf768bb22a6e2b613ad719ad455738925b5b768890a523466e321660b0204b37190bb1d9926d3bcaa94a509cb9c2092f1477feba955695298684a4bed6adc49eedef2021a96f84c5d98dbe8c62a96af429faed66d520636eb8661b5d03337177ed9808bbd1d69c723681c18a3e65b7adddecffb9e6ced835223664d4aa362846dfaa361649fd5565d12574f6e76c9fb69ccc76ca5e6ddf7db85f36842eeedecace74c766e96663ea6cd66e7607178bc57037d9149c67256a29fa6cd3c9643bd9dbb99e381f214280a06c130cc6b653f6abddecab2d9b7b1da375279de9d9c4e89b8e6c43dc6f1a2eb6692bb1e8ed81a840012ce4eeda31111907ba00f982cc4983244092bb8b45d9147d9ecd9e6beee469a76c1529455bf6e7c5b3b3a3dad8586e363bdb74b7291adb4be7b6b1676c96aa47b126597bced0597aca62b6a373dda92db794c2d8a65dc20bc59dff6ada4a1fc2339d2b6a8bbd64a8ed28875b62829904cacf767ba6bb3d65a92a23fa17fb463f486dcee867a86d1f9de8d2cf36abae6adbb6ec665bb5692bfd6e857eb6374b634f5aac6577123a6b73381a7b326955758dd1d89309edc8ba67e7660283c950a029454ab22ddb38285bd6a6fbd6743ed949eb494bb2ee59baa1a8eb1e40aa3a615176a75ba8a9456d67bbaa4d78820411c274ce864e96ddeb6c66a2ad2dd7a48db24649a32045398a12254a19c5dd91b8832e21eee0cb0bdd3de6640a5338bbbed6cd06b9cee23a08772f809329e80001f2e27901d94955b616dbb375b3ebba44e984254429a836d2c9b27b23d9ce5c2b3b9352b4e9c4c568ecc9e426636186c64e80c1f64d95b539f526632146634f5acbaa329bed94417180bb43a102a504a237d4d428b695ced6e8935254e96c9b662751144446fe62da2993fae7cf4edacb49221cf7170a2140418bfbebf6e7afaa0c6dcf9bdae6cef47c5a524e5d69ed0c49ddb422145af774ff388982ebc9189e93aeea11ceb728abbe52f3c9538ed14dc6c22cdd50d8dc6e91549c74dd4ccfee1df404c9092338e18713841c8a934ede7062c4dee991bae29e4df752baee2535e96d672e3d9be070ea6ab3a14c4db623946555dc6f5acbe6d47527a5e72ca7cda96afbb373af4929fa27ceabc9c6e6547469af38d969c339b939b1f117ad4599ce2663f8b957227727e26413a8262f13cab0e5d8a6a39fed7627cd72e9496b7f4d7a16358102a409adbf5816a7b6267c2570f12d650a7b32a5e723a95fc291008861d9197bd202c0253d67fba606e0c90327030034e486bb173939a4c55f4639af331b32da6baefda593f6690e2937fb7d54c4c8663b9318fdf96a9ba23f4b734bea2d3d8764432b265edc5fa98acb9d3f4bcf23b57d1d9df5a64a59e2ee2738c9248ab3b95f81c907421a10a2e2af36a7fe6cdfd096d6aeeaebccfe445bf475d6bdb4d3a6731f7dd3797b16a515fdebcfbd84be5007eeae8293411898e56cb2146555d9b32d7a6351f3d5a23fdbab9aaab4cdc49eb41b7ada92a0e71376efa0348526a2b38582820d3d839214a55be92cda2c51d3469b66e76689d214da744331978ceeee6dba97da742f2d71770e9c548286bfdcdd88934ab4b88e1224eefbb6aaed89b6e80c3d7139297b6de2641231ab8aa4b63b7b4dc2c553f4b6ee76cfd80f3670320916f757929fdcdfd41589f62dfa5b96a2ec8d93494897eda46a0a14c681a6bc5295c6a24cdf9463b39d389f32a99b560464a324536d6fb3a1ed6c6f992cc7aa69ee37adc814e32fa45445cda857538bbbed36ddecef23138b6cafa69149be729a2461e19154f457dc94dda2afa4d7c641c149245cd8bd91d4d9ebb83b13279118bd66bbdd2beef791ed68e98d8c4c701209d8949ebfaa482c8af4e96f5a110951eefe9aa53915e9f791eccff6dcb4d62401ea5925996a6bbf880424e41132eeeb4642ca1d6dd989631f497d25d969fbf359dc495bf79357528aa6e8e7a8b357dbd77ea138bf732cad557fdf54f6d993a9c8dd03e0e4112daeee28c9362dc9911ff7474242674f6bd1a6f4bcbdaa16b9bb8f9323c0e1afd9468d8cbe688433dc7d052747c082beda26a5689b53d74752bfe9647a35fd73ddb4f6379b3b65fb68dde94e7a1df6649aed152d1a21ca2d97ee3732fa4d2b9aedd9912336db99e4c8b3e7171939126b8d4c51818e1cc9c1317293b1d0b27b76db2d1adb1be948d37aa2321469a7fbe82663e1c81415c8c80f69c45f2d1881e064112d803859048b1761a108cfab05231b278b90af168c7e38091bc35f2d18c19870772761535e2d18c19ebc5a30d2c049188ebbbf5a3082a9fcd582d12cdd2c0cf6c48800bf37941b7ada64b1d98edd645362ed2c4de2e44f05dcfdb56db675e3be4dcff3d9143ddb544db2ae3b65528fbc4ece4f1020b9d799ed599a538158599be6d4dbc94e399bac1b451a5af72dc7a66a92d9aaca3691094447f6bad1f57624e727f73a3f399ca6d83e6a3a6feb9e6d365571ec5edb9cba6f68bb97d05676c658b43d9b66e7264a4ad159ba9f34ad3b87c26b55696f3b8f549bd0ef56bdedf5cf4fd59f6d25996afbbd9e6c529a0bfa57537a3e12fa3a3be96cd9673fb8bdac4557155d717f3e7bfe6cb334194a637a9dd96e71b7ddb6e72cddec9fdf9eeb7ea3204272469f9eaf33dbed29436db89c927fa9ed6f25d4c6f49be95f48eadf36adfdd9bead2a528afe667a36ddb2bd7ecbaab767cfd76177527ad2646b4e7db57df6f77ab63775454a67fbf7d249b3d9cc7f3dfb6c4e45d773e999d454e937136bc20c655355c6aa34a667d34d6b5fc768a7aa13a3471afad7b3e83749c2c2abed2bf9578ecd76b6e823a10fe45b3657cbb1399c9f6d1cee5c5b16a5b5ff48eaced94e15feb5a227ee738c58a39feda5d75171d893f63d2204f9205be9b41d35ed12fec5e2ceb5fd76b3ecf94929ca6e34555f4debce49b1a1e7d2f92dbbdbd3a645b0c476ca541358364d81288576afb2544dd2aa4e369b423a344b736a50ab3a5192a926a449e85ef7920aa5559d98ac924c35814935a15d55dcb6eda2367782926cd392ccf611bacad8a31c14d58909b313e8044a87d876b3acd9949e4d54b5685569b2f4dc44499a5adc6dc9b61da1edba97d2a15675a2c47674a629d8d0a0bde66ce819344b379414b60150f696bba153ce9bdabeedcc49d90640d9bd3e8bfe2d81bbb7e064083bdc935020552d529dd86cb9a0981adb6d4eb6a7ec9507c8ceb66d766755655b969e399645632d9babcdce58bb59762fad9bdd6b9ab3d9cebd84dace186e6fa5586ccb561589d69e7b1663526db633b66ea416b5a16d2e164340cbfd16c0dd5127733a771fc1c91fa4bbb3eaba0df04929da644bd59f9ddbf66afb6c8b1e3d8a8494637fb65b2494c6b69b6d9aa2ae6dbad92353496c0389c558eeee82970649288bb6b6dc2d88909d9da414b525a5e7ac693d6fe88a8b2da92b0e77c6667b457153366ecb64e7aa22b59b6dd7cde662b3d989e6a41ce5d8a35cbad7d9ec6467b68dced098ecdc48b176b331db96a5a72c6996abc55a76e7a4ec753db74dc61ee5d858bbd958bbd9f58ccd66678bb6e99ea1e79a3b77c2b85f2fdc935a684c51946edc09aa93212f9ed7cfce4d360506bbc9a6c43ec019012f71f79be41e71f79993383feeb33d4397d4d99ea9b2747f93ed6ccfd97f110fee6cd91bdaeea43587639bb652acdd2c10f6281d32d9f575634f261182ec6cd989b4b38363d9f575f4136407773b5b76dfd0d674f20337dc7daf6a9a34346b65bbb6d736ddb72d4b736a9a9e7bcde1d61c2eb6db73af3276a33b369b9decfa3a6a9aa2aeb89d59acc986c39db9d86e73679beea51d9b8222ed1567b3a14a4ab24d93c5da9c4a6b51a658bb5976279db818eedcb458bb59a5f5bced955d5f471e4480cdfd3efadb6e876e6a9b9eb427b1d8c3f64ca5c9cebda6b99fed75b7e97e588acaf64c4de2ee39ee778bbb2739e9018fb3eb8bc8abe725646767db4e19bbd3d4a2eb89c31ef8b8c17f0423ff3023a36fd913f75b969e4bb3f43c72e4276744b65598d94e98a526dbeea4f52c6ad3bdaeb9244decba5124b4559decd986b277d2d94249429ba42acaae5b850eb4604fa6b7d94e9912273b9822e464073827edcf4fd1db6ed1dfb6a41465df244b32eefe62dbdc115972717757d3595983bba7e064e9e3feb2d936137bbe4eba97d0a44f4ad1965d51a44752ff5f4d365b0ee9653374f6ec7e24f55973b6836ebb1dbaed76885dd5755d426bd115b60d775393ccf66ed3219aac3d81da74a3b2d404a202bbd973db36d1943d4b87dcfd03275d077077274eba76dc5f2dbb939272ecb7b424f4f61bd7d49e9bd6ea6c5a9bee5b2e693d7fd3daddaa4efe35dbb4674fdab3cfb49da42acab21b0ad376d2234290bd575a91d22993ed127a440872d2a0f4881044652ada4aa70d288810a693088810a693884708d349442408d349f41384e924f209c27412f504613a894408c274120d09c274120909c274120509c27412f104613a898800613a897e80309d443e40984ea21e204c27910840984ea22140984e222140984ea22040984e222040984e22224c27d10fd349e4c37412f5309d4422309d4443984e22214c275110a6930808d349c4c374126d254332166db27790bbe3b89f4e723086bb339d6b909790a18da8146d7485454c32e594a111190000000003150020381c108a0683e180208649eeed0114800a7bbc4e624a15ca83518ec33088828c31c020400c30001800424353e3000fad6d555244426786c2764cc76ad55c31310c571d7f2ed1ae1c5020377296dd44e2cf3d659d01075025af7afff82bcbe25d941214800c75b7eebfb570868bcf74b79dc53ade15375117b07f1557ddbe21f9f21978e202767684e4891c9e490b335c9d4a845a79b7f60fd73f48cbf3f68754850f8ebe05793f6d6d8c93d56ec2877a77d46f5bf54edce942d49dbea98e6513b07a599067e649b3d5dc7712349a9494c78f015e3cc49d4f36bac732f8898166efb44fa1bd25470579a7a46b36b95b4d5e03c267594126c3bc2efa0737eff6db6a604e04f14828288e9253929b5e1dc13c7a4598bfe7e5d946b5a28aec41befcdd937e129e8469fd13e1c9b8416f8d2e5d9f2225b8da1c8cd6ee230e0d3371cb125ae4f2b2ffc4c04c742614acc30838b8755479ef7c07c1f1c6b362a0e36154c5ab79b98bf7e2338c8c27007ada70821753a10b7cd111e6299089e4ded88d4c166aeaab6dcceaaed53924f326df4c4831298145a053d65c8e3d74114fa7ae154a77d701d391eb1848d179c13564d99933e62469e49b27884bd997b26e6f54abf0c901b8dd8de11a1d30dc62280da2f0eacfceeea618f9511690c48e0e17f396a7507ec594f0586f5063bdcfd37011a01443f161e0bf99dd86f6337a183a43832a91c215d747cd18a0838b371683ce250d9883767c8a06f875587b85b50ad19510e28e5c57d3780ae7e4ac4da07b619a710cc6381caf1cef54382b09f3020feee7e16fcae7ec24f80e097ff271b9b5ab3f27248642cefd9e1a13c71fe57c01fb56b0b70d9f5cc023e74a06ce36538235676be2922c2af94b62cf432eef19b3609e0e6148a052a394f862e9a216585abbe51ca85445b993345d172700f3a6a509ddf1dd299567ea48f217cf833ca600c5944109861217e38fc4317ad2c657558ad9cda8535d37a084609b0c21d700fe012c6ee9fcfed03fd6646fb1fb8ea7314ca72f4cfd5e01fc8c882cdcaf8b387707f0c0a3f14aea9f860dccf40be7cf79e89347245a7803518dba82569c9413766abbccd312c1abd37a2b29a31917988f61f62c4b45e42db546d9dfc1f82827ea5d2114b8dba25f1d253c6f38a2bf4b56d7c8fe9004b0e6f55986b12c27049440a00d36375c60f15162b89f7d999315307209c9f7a492b58dcb500a12fd2d25e70cd4d35744ca72d779ec9ae13d4d63c1cce36c5721fb547c374b59ce9c96a0a2acd1ca6b155c9c281c807f67619547517d1a74e24c5bbd9be4dcd7aaf18fc10d3485d348159662fb6f77f161722611959d450eea9dc9245d1dba90da478b9781f1584126da0ffdbff337b67e05b4e790102c59f1e6abc90797c06b012db0bf1c4eb9a7ebef563cfedc05c554988f196203a5365f4eedb5d86916c4febcff3fdf49879074d4209bceafb98230780e78027694cbf39e5076b67dbc79a643415d49512f21371e1e73b97d8f9403b461151df3f3666930a5394ca56fffaf5fc0a44f893dd0ae4d7e4afbc3e332bfba3153ae2f15fd878bd8513a7d139c1fb973e32c840b82f19edede10c4fa905de2703a78ef5f81d0f56e2a8d2bde2ae12a51a8d959f9500ac73d1785179fb3058a1880a6b4a81c04f05ebeff7c7a65f410f2526ba5df7d8d4ecdc9f6fddbebe04a15cc603fde60c17b2c836baec4a6dce6f85a7a057a9a4b56c996d5ffb76491bc81e4ebb1a9b4403215cfd961efb0dd4c6dc97777455babab7d5eb48b4ce770f251f2824db8a11afb66893bfcaddb26c023a9a7b8a166a7ff1709f160c211da7afb337d4cbd823316ac7b73a6b5dd4c7c1f180043cd313d8b1db9a2d6acd0465e0b975837ebcd85032f055ebb0b68c89d2826b17749cfa7a3498892d4ddef51bfeb9d5e0944804a8087387367eebb8cb965c90ebd2645c765d47ae2ca6f32878d4399cd3158261c3ce7c7d398c784b99b7956d4867dc3c2c39977c708d8f9307560918e3c8682c729b3820c3651be98e3e093a2d93d113e540c0363da34b83887cb8bbf93fc9d307807526d7aeefdb0432ff80ebe06be91dd97c7417ea9ed3c6b0a71ca64591ebe056904883347c657ee6a715ff4c5a3982548b9f7867ad0bb49e22e9f8f6bd2f56904102434302dd14847e9f40fef12f77505b932d4a900fa3d008ec590e46bc4c6f2b48c685e4b6253d2a33eac15f2fe5e966d550c9b9bcdfa329e13533d3f2a3874e283fb6430c7acb81b6710836fb205578c35675cf54da9de6634568b849d3f36d4e2c773bc66e7925ba80984fed71f98a61f8fd8bf0bd908fbe61becc0ec049f6ecade38cfec100027b298d4de76c2e3339936d759011d36fa8471ab033d0f858dd1d7230986957fc3ad59bc6b3d4e1ab2ea569058ec8dfe3f87bc34841ac53f9ce7ac384c377a139f520f1b4a4f8c89c1d452b1895d4452820c98cc0b7736e35c1f52279b8a50c64bdd9136179ea0b1492d21d2e9f6d378d4ddfdf77c3e0b87b391e897241422a1e22f4851698397be29fedff277eebbb60ff86ce376ca6f3cda73b87d5aef4511c8004a95b482cb13ee83415d7bb7f43dab84a48e4afc6fc03e4c8b2eea4f936b7538617b86c1548356d62324679de6ae4948f3f7a2a0478e6fdfc668ea8e311f4fa7b8d0d466d7c05bcc25e825a93e8cdbacda6eb2273b72c6e7a53fab252007858c87609cdca1c343a6d0ca1a3a8f2a457fe3966756ae5c14b88dffcfa50dac0f6e1a33e12dfd0084c3eadfbc39004acf67bd69a68220f98854c781b95b139368cf3e70abb1ef8d8a0866a079662afc6ec108c2402b4ab254a2055281d54a89cb945453f95cdcc1c94a1d1705e9b94a0a61be1ea2b35e8b5fe4366d583224efbe9ee3e9e8d8137bc0dd822103883bf4fc9056122513b2c00c857c052434fba6f44f6df4f2606a69a31eeab3dab7a0ee0568827cd51c4d0431e182e6eca202d5c339f478c2b892d867d9b0a685a293699518df6dc2d06320a07e313288e92191f723c97858c6c308f67602c8a85d6324282e614612b9190005a7587c9a0af368a015117f7f534748581a0251621b90c53a9c7124bf80e1647b3592d05d9104a1da9f33dcb8563380e78d36b269c53e5830416bb45ae827f4798370717fe073b50ebc7c6eb9c97ad105c6dcd2f76468f71f0daca3826b5185259d01246fb21a16cd13e9a50788649b1e8878b1645713663675d273ac47af6e54d58512103132c6caca58cc9d546915298fecea4c2e276b6f5b09f968a39a535562184010f36e280903412a222dc395f7de757066efa335c69650cdf0cb223f0a9b6ecdc9be0ee0cfddbb7cac608938b282767ad11114d0396680967e51d263f33639e75359dabc0de8cf6a648587724bb9c626a32f319e7b8c5708b656a0d5dc7687e9ca1542d87f04a7d488d394cfc162d23320d800fef6cbc8e317b9a5bcb7e67bc678d7b6ea1e4a077f3861d65dbd0d40f0ccc7918272a3a024cb6f894f1e18254955d737102507b9cb2f6d694c0e8e7185228fd52b485a0b562f457481d5f549fb9039958487061cd730b8c80c1704cd3acff64cfc925a962511e74ffee8be80b0bcf149568e3c777884b8bcb736c3372b034e9f80df5dd3eba9464350c69eb3cd4274ba4aecd604fceb3f2a80121f53a70a497cb2387635acb4dba547fd6319782cd5966bbbf24bc6e2cd0667a416414342a48dc6fc4101872519f62e55b55be84ba04a30799a696db3390e18ef9fa39afc2e7c498475c66d0e40c186b7982e7911008d52b820f8c623866451226549435d1476259038f6c1e687fceb0a6036b00d497a144a4f9cc4dc3c64cedafdc38196f4d2d0b8cff81810ad664075865663d37eecf67727c56aafebb8a8a5ad79efc5ac41e95aa9a43e94b276e167ebf3ecbaf8a60db3a1e34cbb1ac6fc056fe9daa3659e666cdf16e93457846b8822dc9c4987adbb2676670bb94fb20e34e88b1ccddaaeb990cda1f8c7364108c62e84ed9e2d3138f3a231fe2874058d93277550aa11c939e4226b4beb352f9bfefe610c0fb8ab4df7b348bf54c708bee81254835484236cfc78a17a176188a89c46a094f1df4cb18eb93c0d07340667e0f397b028161641f5d75a7208aa8927c98367fcd1d10cc3ed6b7fce6073751cd50b9fd073150a7f141c435909eb2ece98f8ba88e40b103689a7a79241658cb552265499769a2262c2132dfacd430701eb31ef0f4a8dfc7be221af90e5d1c6208ac5437edb87edcae9e84ee6f2cc3f4138ad6bc87862afc9fbbfe16598aa394b5a638e7d7519ba5a65730d4cc76923a102a57fe47cee35d56f6f37906b5045454eb7b744520a302e383bb81bf51ad7171068732b1a670218ad19c7cd28d2929a8d448a92a72c8eeaed4f8175828e59c05196e2ea8d96f5e31ed08a156846ad9eb10c63f45ffa34b14901cf1f5d99d87503cab8145ce43530fd970bb7242074d2f48070c1ce98c8d1cc55eaa67161c00828e84c1f6384acf5e6ba18f54f8f41965c5d6223219589ca237c3234286468269b6141211483bebac9ccbed68697bb0aeb6b3d4736a862d817819b0b1398c842cb68cce95993c07e0417689ba710aacc051544c44294ad96a3b4bd07737f96170022fb190408461d130a9e0862d5e06ea6e5dada20cbf3967452e8d94694f09ec5e5b1324bd3c2fd3f00368423d635cc7d37b078588fd5671752d38840fd83a8f0c0c9f1a3ae64e68c368df81b27f46929205d5c1bebd0b4f3171f76b0e6571ac9ef948b8aeba1c79a285ed8d283d17ee1701559d4c107036915ed23ddf849a685d81d601ff0354b97b8f02872768473505024e336b257bc1e175e89ee072ae34cb060b3c1c33552d899438369ad4b71a3aa4dc0287d967069a41305ade70d13246395ee8f3942081f26a86a6ce7bc910d77d494f85766cb7bb85a3d8e2cfc1f30b05cde42a9a4e44e104d93db25af6e8c11920ff1ffe81c397f5dc3251a5c86228cde1c7d5151d24fb8cf4d1492dcc2cc3905067d9d0853621ceac66cc37205e0a7bc613923515cd675c44bbde2199b610b707daff2000300c1c36de10755d3694e1ee9d6fafeceb1d2b4eabaadde9714833448ea629f3ba17725bda7645eb11e51fda0d345eb7a61f97716bfb4c2097048bc2b4bb5e1e4a87be78866b5ec061ef23f56fb6cbbe97e8a9d43837b1c22b5f36394e53de49b9bc076a8699de4c1319af969340e9297504b12d05f4ebe75580e43deb7b3cac6befa5cd88bbad506c09f27c501f6192f335f052d0a89566689df0857e2417f59258d103238c49e372fa01f885cbd434fac3c6c3dcdef63180710e6109768d94640a63276526bfad7ae11ce4a36b423c4fac4f84eba2d004120c4bacdbf4c62b8c3d7f86b4d3f1ac507773983c9ff3d7c6d7cc2f4d4b3fd62c6148f75eaea4fa6f8dbe829a87117384c23cfbcd214a0f1bcf3966749feaad7ea462bacd6a5bb4bf548bab1496249b1e16170c7a1e8f3665b229b460e37d803848d00f9643b8e43f365d64c160e9721c1a5aed34d745386f77439902cddb28da004f82dedd8f9e0045ce49ecd0dc0ee177895c3dc12b6ea2bb419e02991d32ad51142893040a55d223ef64af4303bea2b6ff15ec2d63060def59e03279a1339908eac1933c67e9cde533330c17e3524d8ca6e83c0c953a6f530bb4eb0c4713f4781fa8d6ad041b7f65724f3be7c60fc64eb147ec540f7abb4cfd798a1fe724800c32c19a8c8f12aa51f7f7240c64ed7d916118da4295f707609789b065dbaa49478400d6b90373b9a7aabde32a077eabbe80e54054bbfa9ee95ca7728d632ccac510c56b9623353f90f29709013ff9dbc451e16d709584e11154ed88eab183ba15a00b673bd342ec88bc27b73aa3b31f65ae0d3d8006105a59cb17eedf7ed7fe835f27fb5c5df0d9979b9cf47ebdee4ca375b0098b9ae0c79425668127143b77c4244a051e0332ca557bfefda8620a74d054389a995b68ded1f91dfe5eae4813f2975825e52475ff36f1cb37a7170b3a5631416ea9362ad6963763d0d86a374d5146a1abdd1744d4b33492196245818b6caf03bf98f3c8ae6c6528d88eface9836330b84469db118a5974dca97f55bad01dea4662ba21d4ac44a8376ad8d45faa6bbd6643ed7f43efd2eb65cff2dbe299dc9f8279cec727c2dcd4bfcc708727fd25df625bc5f7a6ff6dd1d0d5ff70f20be585dd9ee11f17edee0c0093c68df2c1ff2ed5bfb612fb902ded5e6aef061960fc564495aa41e6f1236d15bb1deba6f517a72793e785f32bdedc5f8fa17f5819f76be5d84f80ff5b37b8edc350ec77e0fbf76c297f9c9454ef2564c731f2e4e8881ebb72834df62958bb261b7a5a02feb1a944fdbbf2e8742a6232f0e58684833b407ce9e25c7daa253fef8c0b03d4d03fc25ce521bd06c3058a6ae804ce3dd757adffc6b2b85f4d7401d5cec7eb888b428453365f3fc258f8415e7df2147560378331f747608176383f4f1fef6ae89ad3745266ce67c6753562e5d61bf87737bbd1d8a7f45f321bec75e13f452eb4c3856083a9112dc7e00002cd74c08239e45abfc6ffecb3c3e2e780cc7b17ae5dff8fbec52c7c883206b349e53a26e8870d2e5b0e0817fd74bd770db58099fa3afb0bdfeb205fc0ba5f0d13458d8da46f3eb73df26e37ed1363fabc16b68accfbfedadb9735a0f711aeb1c6de12bbcdab8f1af43b379bb57c9362077cfddc88d9206aecb4cc971cb1a3423daf20862270dba88b39f7a680c37df466cf66091e75825dfb5e16d0a7f29d19ec29f8baca33edb5f54a348333a591d4e33c8bf2303891cc652b43fe0c3be50ebc74cbed09e33ec0b406accba17a2b30075d761da8f34fe2b76765b8d93f8e83ba37977f30d37e1a38bc588aa48a0dcd619bbfda4c7fdb449b45ba1279e371451e2880eb022f728f8fd01629130c15f04868bfd2160b3a4d9276118d41d8782996e34177f1d5122264e29d970bb60b8ee1e6d6d23595812f7a0e7080b7c28a224fb2f938638acfd31e0182750a4d12c481015c50e380eb094590bc02653237d6721df8ed79403d406c1aa513d38717c567eeddb8c9f1a15b2a03c65300b7ea1008c02778da3c833bd0a28b8595c207250824180eb35e29291ce76640750fb70ed6a4161ed97337df68007adc127547449963bc8fe604d375df50b3e064e282fb1c30fdadc7e49a45fa6dbf7737e6541f60d41fd6a205d35aca27755bdbce49d5cc35942091edd42d1a8bcbf8b18e2494e0b33f58b05eb59062cd20f15797bcf80c09dd26ba59566e7361c70fd0f7b421d1dc5d2c05ce9fa0a30ac92bea2709e5ad935aa3a2bec26fac8f3206bba713aa022b2f82df10b13df73be4ae9ed2367ea8ca59b58385c2c7729e5e16880cf174f55b60b0875eef76293af61ede12679c168775f91af271f82f0f8a414347be801305cf99e40ae302f52c9041609d5e98b21823ca9fdcab64f0c66d3efcba7bf8dab11843b1c7e1c3a811a6ff3f2230b1a1da86202c85d9bd58117988ed2075d56fe3c1645915b60c697fe42bb39a89cacd165ceaa3b9f15ee58af76e8f2204e1057ef782b144d4f326e08299822fc738ae49fb69636f1e8f9d21e744cf48848ecd7e398f45ec589d5d09bd763c280cbc09293379be25774a808840257dc11afd332ddab6a7ebb85670f066d3cc0c70072249bdb9a64e6c4a5d030f12119b37941c736d75fe1b7d22447c99b7fc88e2e4eb4a03ee9fac078d7e6452565ce529e744fa7942fa6ee77da6cb90ad030fb698f8d2ee8b93044bed9cfdc48d5081e8db6dd099882a525381270c367dfb42d12d018104e8a8b4e47742875d5de562ce2f4073df7d85a6f61856c094e70562068c5ffba375216581452884562c9c8f4dcc37466e6acdf0c1bb83f38026819b16bc627c753efde8e7f460fa37a1f600e349c4b4a3e7243376acc48eac0b19a8d7b2a8903947f78435603c885df546c28f72381c14ef551e390db4ff3f743b6166686b7fba876c58947a7a48e726b1c445edf20f5f568f623f41e197a315fe687463730e474855e943b884d919e5c8cd8f79837d5c7878c9a06fd305e17252909f1103f026482ebc9139117b25c0925ceb7076be3ff5eae74385f73de0e70359d8d155d66ee479a065abcd9791103189d07ad58865de7c40bffbcc91fd6cc7172084c94e31d3135df359526edebb0640cd631db2310a690253bca9ac93cc68a802834f6d8f8d06c86bf287d545a467b812f29378cca69f13d29c44fb7e20baee730d3e84bdcaf2691d7c15f164c84c0dac680c6558c2854bc95731ba01b646bf9382d1804825df3872ec95a0e56beb05da4101a227572031d1f3d301bfbc734958e88e4e89d439c899462faea23ef0dc03fc012e1a3ae0476b01e72fae78ae0752328b50e1dd02ae1fc100f2804e067bb6c6f46631f17172dc8443153c5a2e81acbbba4cd54042b0d3b0451de2441862a596f505bec95833b198f518ea06855bc2270338ba00c331346b8b722b98288dfebd7988d000b9c0b2fba8437562205239c4f47b9e6d9d9865f33ca8e569258b61141e0a766ed666b8418ada18b28e92d2befdf59bcc776dd3c67cfca24de0257c918671406460f3f920d0b0a4efcb945b9a6506e9d1e6ba28c846076bf6a548e537730aa860e83cf5e3b15d2fd897e49be3a1eb30d8011543ed10a922d0d9a05feb65a1cd1aac495f163818b08e8ec977942ee8f88ad6ef6ed5835818bc564ac74b03612fb240a235f0ec6f30be048a97c742f34a532b3c9dd6818895747fe27dcc7af498dd02169061376cdce155d40a874c59703ac7303c19239005c7c21ec061388a0537b28bb037bb733a0c94fc044c6f9b540d257b7103b5439e9875473e4b1b25bdf44197e0a1acf26245038d405991be3f652585c247b1720abb658ea8405f11d856ffb455b4e119f31035c0590bfd660e49afdb642527d452949290f614edef943cfa0a07a64d73a0e926047b98deae2170768da9c32f2da67006322ff0a0b16a4012952c2c47f8884a9327618e73b5bb7c4887cd4bcd65af9a9cd51efa4a5e3fe25b4853516905e49c48638e56d8182d69956100895a73fd041b46676f64b3439a6e19b8fe7574d64dc7f935f13f6103e84ad89579fa8453ddd1ab5edab172b494c3fefbdb01f909fcb520bcc20a06c1cb6ff9f110c4d1605150f33db713d0475894589a3b78858b4d32031443bbf61a489643a925eb450348d7944cb12bb080a42cb80b957b67b073a30fb39cc7d55f8940e43c16d5cfe9d375f5ceb08ae42ffb65ef12e76f8f37a50f595c284e4dd5bf4e9101c8d3382d3ce39930162c1ada7e2cc0803a620bd3a6400ca2f58e7680d8167b07e3c40fbd17efe2a900ce8174a51d353ab4fc1022d398f14985c60f2e5aee7ce23202365eeb289a0b94812ac6595ad09afdba4654b09f5706c48b24a5024a0024653dcbf23bf6510120192bfaaad784dfa01bb39a8aee2a388bbf4ffa2f718beebafdd787504e86838ae8ebf3f52c0d7f3a343f6d9e8205cdd4a1bb9b374eef54259abd93b229d4666bf1b7b61f86e2c83148112453ad3f1af19170d6e0e850f33cbfdf23e567051a80aa325c053c417723abc41fd6d5448b510c7457afe515985da3167f3b0a78ba96216ac754869e0accb8b02688f7950907542a81ea12cea20268b3a9eb607063fdfe3ded2cd15d3201ef6b574f18228b15a8492c74f7d01aaf830243fe4ea6a683f7c8c14084ee622c8b670df6d11b524f0f3b000c07d3e9a6f6033f9292aabb3825edfae5cf5a064e55ac12d470b84593ab1ef2d77f3c3206db6c1a79130b9231f37fb04de13b6789e87b666b197c5be7dcccf8148552ff1bf27717d14ce53acf424b7f7289e45026177c7c0786ab4f17bbbd5af07aed6a10c181d9a31e1a14b683d8f50bbe41f6cfd0f5c95f60bf9edfafe71890b664dae76ec4c7c8dfdaeb7a4f05c804377785dab69abef1fbd85919fef6660183851e34425561a31bcfa496f0866cf9b709fb4ebf84f5caaf9fa177138ea2e69fc7fb51a41563e383ba5e9cfc8c761ac1a5d9680c9888b5dcf5379e60778f05f54d4a46c404d98b8bb231158c8789a0cff370b18a4888fd8510d79d8fa4038f50b21da0c186fd9c5d36b43b0ff29abb80be046a6d0f0d07701ae3547a896b243d1cb7b2fcf75bece4112894d49c7102e3d20d4d4c04c3e5d8f86397627f4bea6c055e7d5d46021ec4ba2ec1a7490de614da627f4fd0a97990512454e516b2426a9a1a7f40fae4714ea32aaec52bdbc4ef236ebfe27575c99f0cef5a47f461ffe2592fb268c5c017765717865c9e7245b3b2f6937bd56836fe47068dd1feaedd38e23859def1e133fbd1e6fb9dacbdee4e28262e92709d27af31be0ea0244c1ee5431d828864f1db6ac46232817c26b09d90306bf40eae51aa0d87828b021310636e981f44b52998ce1616180f7722a62d3230a792f1d77c925eaa48b4bf630ecc7b0e5e40dc050f739440e4ab46af73d5f2dde01bd0839b1f002e451a515171a909f5cca0d0e7a91b87ff54f5011eccf6870f66f6332766d14077e88ce471dc7c70e9c7d8eb113e735af4a91a95c8259ac3c92ee11541ddfadfb27e4dc5bde33678c66e5d3accabe16ba39bee82d5b08bb5fefaef0d6bf0f81a4a66bdf2f78f19f035843b1aca11b3396a930a4111ab2c894796594b219d56de51aae50627a48850a1a729479342614949412a2c027ae3ca3882781cb3e50b2a5241db35b69d9d217e55eb917958bcaf5653f2424cf9afcd8b8006eacfc43547f46009363e4b31e75a8bd74acad314f7c4d1f614e57e335e181572437d76108bafeed9e92702dd1929c18f70ee37907d3015abc68925d129d41480479b693bfa2534e29835f44cbedb84a54a20d1755d32f1795fe4359f0868905b6d12fb4ca795e8c5ee97dc2a662e85ee84fb9dac187f288dced8e2fc0eda58a91e152602c1a47b11479e8f342abb228dddc4040306fb37b2f7bbdeed9af519ea3268e538b0e94259dedd97a20e96713cbbd09f735de42aae27b8e273f9d9ef57035911fac399e779e7a918c8e4796dd9b706ab240ce47738a6ad9c4d5d81698ae1a4eddc28e519893ef6d66079a840b83cdcc138628621938c16cda08b5eaa93f2b71495a15a904df96a91931ba5d29e5b4961e68552a4605f14bb2b355b2c87b02f4223684b343ab0a1284dc31e34a65f6d8153235f3b5af614880a37bde57d73667acdfcd28f2deccb08296264918b5890b991e12e464c3f090e078cd51fa72a7c235b7e571122392c1de4ee3f1e6c99fea365c7d4ee8d3dd23b7377b6befbef7a9ae45de09b7f89b1a46fb2755902d4f6d69b0e6f6a90ea4db30b8a8452e07941ff1d85de3d619fbf47696dd804bcfe94bae32819f5885408d8cc55affcd67acf26ac036a510f642d75d8ddd7d2937b9d4942394c5e8e75424539bab8d507a5edf3f42d5b9d866f1f0bca38b942c9592d524f7cef5d7e8d95238b7bc840742b312ed90cb28ce404e09834e069e2913440d2fe5def83f704e095c94f1d46413cc00b32c98e6c5a91d6e2a3045ca1c48516e3e1e76e17ec0ff0460db880451fc4a1b72f760ae1a106b89125bd5c49dc92a83ba817f5e20aad81ce5d295ba46fd82b35e182568f9a9396b5d43394977ae28aacb99e9bb723760ee7a5d6b82059860127f8b7ac9f7bcd2b0fad9f27962571be7d609473b77106698ba3a24900bd5b13444ec33240c283736f01ebb7e3c559f8ffa553b3c56d7fa364838f2fc1d2ba07d94ca75f77c23876329a2ffbf296b9fccb938592fa757c284c0378cd9556c071d67515ec38d198bc3f0c1191d2aaef05669286ea380a722bc26a12daf551dabdb02de2c56fb26cdf47d90f561387d54ec845788d7d77e0c1020f0558150fa42578c97ec88a64d61c81abce403eac09d084a7719d8cce5dc2fbd1ab156e51974c91f00d559f05468d5e394c4929c689e6ef7567234aaa507309ed0db260a85fe0635d0558b51015b08a065b0bb6ef9223138b00b0ea84c72135b1ef78c706d38898f3c1699288a8b7b678ce7a125f5f51cc217df58d5cd2ffc812a3b34490fecfaf439109c92dcdd12602c7592e7ad07bd90d21c69cab34a3efd7bcc3fb35af987a728dc46321910a8d04fce622b431225452bb516733624e5fecfd53d7c77f795eccdd3b9278b8571609f60381eacc79315b7d9c56ede41139aa50bd1a4168805a09939a7c2a321e29a924d954bd3ed9a6a9ea16f29c93f90e15234d7e49072accf691dca7dec99d662a87bc1f57e0ea02c7e82a84fdc564ed9b61d6b86c4b427f151626f839dee8ce7586f0e27f5280dc8b0cb0249a85b44dd3eecdcbcc277e30f8e5d1a75b7628754686122a78184605a9b61f30b1864701edb8a067d1f12549cc057cac3c0c00c7474d952b413fb8a3cf5ac1bef8a9438bae71a9974c977ea4096664fee8ebe7e86233772550e3d998e6130b5d261d8b81e7139cc3679944d83c264bb8355508a8a4e94ab32266d7098cc5391d6820a7b80a49a659537ef9d48cb8e845b0bcd944dc657f7170a16d8701e6c3d808fc26d65907ac1a66a4fec8661a3226a9ff2422af952b5127ce656b1227502619ecd416f6f9edfd12e7afdda6c148fc515135b5ea405befb7b5fd528915bda8f7cbeca4a512f2cfbd88f72142208154e70c910a8be7f04ca670377e8cdb3d3dfac6b390a1733cd4da8762856a8fbd6203c30f555eafdf52ac57f5639545f2802ac069c0b6d782ac4c656766b5b68d8658ac62957df7ac1b73ac97fbb8df633efb16a134de474a0cd973adc23df7c71426bfdaf5fb353919896015ab0ca51c23311dc7186dd1d06b1fc687fa86ec2424c01dde8611e40e165bf01bfc6ea1a007873a63237b511a3c9da183aa49c78acb21b7b147fb390f67c2fe4a8d465f1df8a18da76e84e3de96adb0c6a42d2f3a05596637e2b056474f35fdd30ffe987a1b7bef9d363b6c461525139afd172a8d7053ce057fb8dd41d73bba500a56e73dfd5132455cb654949f92e75b086b9f8dcfaeeba9d2ab43bdeac71f5e67c45931fcb63a2fdf57726bcf6112197d6d9ac470e9acb88188b1b027089c71241180eb59d6593db262cf423195383ee83cb61d09fad7fd772eeb781183c44bb39fd9497124e9fcc608e42a630d235d50ee53d8fe43d57c97e6d93a17ab60854f2c7c653a64a21dd193e9922246399bcf017a3df313ceeb3d383a207c2d41a6a4d224ae83a032fbe29f05003b95762af8881855a9110448fdfa0a8055ba153e4da131c10d64289119aea8d46536f4ef54a8064fa1f78bdc240b038063187f651648ff679f95eda621dbd492a9f1b7dc5c2113f2bbd963fda193081f21ae5bb0b97197c83cfa68a1e473ca62c209dd8194e83e4afcaf68c7c8d96a3de31bb12ec633980ff8742507aaa6ae87c08a6bac31af47d51ba9533d79c9d9e44cc19ae72600140fe2ab36dc170fefc3a40cb8ee230a151a82402d9ddaf8f6176008859df59afe9511aad6b87faea2a32a3ce4ccbc6b9214024d962d2938daf51d373f6e253c3d2261c94a22e96cd28154701fa68518431d1879e587ae2027adac3f20ee5245b71ba46e6d382d3f01902f02ea090e0d552f8d1ef4661c0ce1a9427d361d23b96dc2fcdf6e120fe15dfe4b3b081f726376502516e42a7e0601bb0197f81bdf26bdbc55e93543f45af8a4e8962b187d0243a5360f5b6da327f2940180039e795cf4e80ead99a4c567fc12bf1db3c24fe91986370017bf603e8817944b125f05890bf8053593281c10228760f00512ffedc97d7a7f783821fefe2d90873ef52968a0f85135004906cfd00847e2eff35a36dac7234f1182c3205e5cad92e74066ca685e65b54ab761b4d610ec08ad753407e92725d9588c1b2cba4c6cc64dd6e899c73e85e8e8bf2fc2fd126388816747a90e552fe62f420fbe7928d2eda93357ab0da830051edc5d792729b236e89c1d8a4c5bb8bb951c0a9e56492e318b21fee6b5f1e102d769d43cbdd09ec77d864b0dc1ef4bfc27892cf02f42490e96b4b27ec40d6ef457b97a8a580509e9971a1df84b59bc300cf7b446dff6f3a81f9bc104dd961790fe2fc47f9d1481bd9404cc0fd8623002fea80d81f03ca62b02a62e46409a87ad71f87a42b8931110f113fb7e23fb6b19313feff625dd20c32c54ad66660c78ed5f3f7d66ae9949d32a9a64dec9b8f053a3661decc68b9f610c119946c7f108507571fd9f3df23f74c7c90d29d0e0036c61cf765c3baa5b8056e7227dde0af734d3f4ab7c1e00e3c46aa5f850730ef923b90700312ac1e0b54aa0e8833ec612c3eae5abbf542f836ec0af37e0445353d3185dcefa50416022a388f6d399354a7f8b5fbd16fc4574eacbd8b98a9e2988d0c84090e7ea14cf735510deb9a330de1ae78b77b3ddec539ea79a36e5052631784d6028b36beca1b1925198cd433f83a692db69ff58f6a80d0cc5ea3486c3915d48d23e28682be879a9dd067e4c280f3bb6c5b2390f6ea996ab2479ee63647655034f1306d3d2e487b32bf5ab48a2d03fc01d7973769dd5c2a6cfd62ab35b7602964a1f3006f3a69478ca68bebc309634917ae03682493dad02115c1a90487cdafd93701716220caf731baaf4312113fff720efd62b57a621be8ec0fd6a3da97b88d76d0072409222f56a47af1400bb45eb772f898f6be0da444d3310fbaefc65dcd26e3ec99ad1858f03f7f8c3b4964a90b1acc47bdd45d610fcbf64fed1d2fb5037a61958ddb0b05c91c40031d8b911ba1516e97b4bb893e1eda4bd3a8c4d709d76cbe2e07e95d1742b57d164fa5a997fea9ba5e6653e3d2043030760651f2fba1396f6e58941c91b5602c42c3fd71a2fd36a7da21bac72409b58143117942b4be4ab55f60a94251e81d056b2fa6117b3402d25bdd57ab30e3b7785c1eb4a80a37fbe5575c8e5ba8dbce3d4d14de538f17ae09dba4e6c54c7219ccc32d3c84c526eebb429ea2b886101477f60cdd7eeb452e8bbeec4471723b0bbe955ee8649df6ab7bbd214204fc0bf2775ec3deabea20ec4fcf111039fcec224159f3240735746fb0608dc0bc93fb9e49363ddb82fb8456242c9b012a04d76b348bae85b4f18139873a4e45b72e231a1a37101943f077926ff3fe8155260e3b50e8715473e3cc99b6f07319c18278f13ef0948a41a8b84d207c358584514f4b80f14161a5c39d37a59f1bc10f383fad77c075faae37df2ac6403efb0a52e5f927291db171de7d124079b5cc106d98bc19bcf484b5b8e33d57f5d7015a7639efdeaf53c73e6283bc7d07c3ab986bd93ce5cf943f853e144f0b27f5ea2617b91e8de54f3c736d4a99d60498ebcb50ebb04ffb0d619e38872737f10997657183cfa9c822f6a11053308cf86354e55e88ed66b8861e184f0f85d07d2e1dbc1dd5c8880a6edeb523ecfa070c379bb9a2bd6b540b93372a42c030d4956e31c21959eedbba64860ac7a35996e113d64e705afa0080eefa3ad2a3610a20c56be5cd14121131be5498471b52a94fd8d465e17611599e04f4632c5af8c678a5f196502ff32ca247e649409fcc82813de4fc699ea3e19cd147e329249fc653493f8c97826f197914ce32fa399767f190f26b8c6cd308926e608430f6f838996b25cbf2164d8de246caa260cd9275b659668ce1c12a7715385a2accb62c24e03eb2a20386ae96da4905c89b8d8d067ec0d20d9a79066ee9660646cff58ae51b54875cc7bd08dfe0487123cfa9ec7278a9df77cad36d69d52d3e746569669eb49a193a687a810d1ba19c737ca900541732f1ddf28fd175bbff946c80b84b921631a93183a6b6ab0fe854c383a15bd4622b151eb5871c63969936ee460e92ec4360f5179a0ca90b302a4537953c6b2401bb1f3736a6bfc4952c3e14b156c10e5091695cbf3fb71c1ef1be6a54a450cbe97c8df4a467a09b529c6dab49790981236891017007add3690ec2199f4ff19cd2bfdb7baedde1e61245faccd5ae9d14a5c4ac088b6e4a947284c7919b8554e2eb7401992611cdd58384a434ce157478e8eae4c933fd25276c3e24a3bd3e04d9f41584ae64e32d4eaa4645410bd174fefad4e28e8d4b5d24304987e276d5adbefbb9f503c994b00f5495684c6c037e8a303615153f224a382360574698c839da777f1c0293cf0e694f2d8abcf85043960eb7c2d76a84e7c34163cc32fcdc9b23fbb9e7a2ec4e7ab87ede0673f388813e55a6e46ee1fd4336cee402da66d4be95255288e011ba5eca115aef09573ca516385a711fa8fb223b402b57b254a1a75c7ccc18fa0d6ed2f13cf239ca1425c24914ed918e8cc64ce053aee6d8bc6800ca0ec18c89fa41806c3c2c7c777369ffed3e5163f3258636c4dfb69b6e90a676c62a3b068a9e08c9162171d4ae8c834d4b2116441b1c3341e8dea658975f6c1d3633853a496a39b9cda9e32df3c844013be4b76c440940fa6cd3cad1b535b788acf2eb9bb3198e0836e7e87c7ce5275eae024b34e37e6cb05fedd01cd271c6be0e437e8c3dac85e4170e778bfd6ea076bd386fe410e621c64b5228b4bccf76122629a3415fbacc35bb28fd18affe7b0aa258ec66105a1f1300211022419e0bbe81e8d84235207baceef4c4803aa56fcd9afc4a825297eca79d494bd62461b711528748f64360969f5d4051303ea32c8fe4c9246768b5592d781e71a1de03686a2a1c376e60a1ab660ae7fba6b1c3a18de2c52f85f95e9edcb489a785c9e7742681d466e4052d14c185c454269d970055dd73c79860bcaabea79750f07faed190d938ae2bc67296730a2fd101e1c3be2c968fe15ca04cee1b4b32877f5c78c7088a673b6d7df928d6e02856b90a7750d5a8a2e7c9388336dfe045a41a1355425a566fac6c0083b58238c85f8a6a4ff6f3b1e347793488340125a63d89080ada42a71310a9a9523c0d859df12f1d7fc133e436700b65f7f860530415145b1c61759518b8a2784cc7bf12650a1f2f18423fb900563b6a6f74fa41db385ff6740836410b84c6cf0fa991295aaf50a4da34988bd439a31a3d87f8d12baebb45d30ae4cfbf7210aab6e5ea133e9b6676dc6d8190878f042cb9838d350397b1450231ec279be4d980e2c97393b8c998ba6c9481bf3bdf5803ba681f0e5ff23cb68691ea22f72ef98f900fba1594f68d035b71328f8910a12936566c34960a30efeb0eb61c2fdd9ffd70cba3072fd0afb7aaddb3a9de15da5428241ce3d597aa93dce4f6a6bd77c3537000593362a7c1a2a7e37f2f0fa39c95bbdc6949fc18969020061274b10b33b8232cbe0311665496e1d24a1b44c22e6ff947a347a3221e2f17f94006f4ce276c22cf4aa02cbf04e0bcb010b841231130e4340f7de01b7e667dfd67a6d201e17d741edd204611d9ce0ef132700d895f4e698693abebddaa7732adc60fc39206b02f791b30de8956680a84522a855bb597173ac096f2d733a519d5ccf6180b05fe3a6c20037f2f74b5a99a611eef72dbdea15cbde0a4873df888b0ae78e2b9e55a228a248a150b6a9cf19d1e3b14d0104d2ddea10c1fe6aaee32ab86ff74fa8e5587c4b2f29d10817cf54c7c4f87a824321b337179a299d2db843263068845749753b1c4f27c94bbe552c4c5b580f6cfdeae2c474c164d06e6aec631bdd02a9923bd97356899317743ca00590202e285334f943f9398a92d7770fedfaa17cda648e23b879be3c9893fe05790938b340f43557cb449303b9c4bd283139b5061d922004b06557899dc776d7a0c3e0db90c88a7be575fc814d63051c125a2d4ad14782a39a8b58bca582b070a7292bcfdb804b327cc1e5bc86642b9d2f5234bd8cd3040845a40837494cbea15a4ada3c507e885cb2a726ec5b5815052705f5bd29d5d82891b1423d4cdf0509058bc2eb064a6a639594597fb6f74d49a6832d3c74526aeeea5f4008eb28bb333e15c305e672448c1410028bf2f9b2e0dfa2cde2bdbe055a74cd55a468dfa70d7a192b6ce493b29172fbd0e2725695921576addb0c0bb0a108e39ef82e40c2b5e1f754ce68d0b131adbc3f729becdc51b46f596e25e31f7960639596b19b6f2a9088fe3cb150c8259ae8dd350d22ed79af31f9c50bc979bbe96dea8814521b61d496c612bd5a5d6b05388654c6e6c61524f193465a6d5efa06e05f4e26dd3e213fa7415555743d102aa6d0532e4be7256926422a2e10f7e2445d24ca87dcef79f761d8d5a49c75dacca8b8ddcdba9c57d7fa15770668b48da95d69c50d376607983630841947a71ddd086f42365bfd853a60d2a42e6c55638156cce1dc701382165154602b5e8c39ae754ce328f85b61f32aac1d2f6258733c00ba6b3edb733183499f22af5454441903cecc4494ee788231804ae25dfd1cc3f281ae64562cf7bdd44808e3563b237212a0ef8a5ea221a6ed19139f0d7eb311a09c523f5d34039e5f90de0c7c3219280bae79c4086f25a802ded46d69059108ff62d1a78c11d5f93df8c76c7414606ebf8c95da4eab7bb2b720b5a9ee3767a7dc56faef518c809ac6621412116d490c550a4bf721d225c3595bab72e248069412722c08a838fa6fb090ecef12386e04f313b91ac6a38475525936d9debbd337552d2be74b2ba87c37cbb4e6d28578bb1559ded291d5c66b0a076b2508a875232e20ea75e873dae737668c040a39c8d215a260c997cad058e1bd42fc631fe453eb8905b0dea737c4a13512e616385fc5d219ed09f06f165008dce1f6ed9bfa75004990350b24dacb0cbe451a14bae9ff07005231f8258dcbaa6f768b0e62008d2e13b8839079de1ed6b9000a8e0c7800dbd2871e3ac6b590fef0d5b17af461676704b41f878f7e850b89fd1f1f6c0f85ed40652d896321547ea8dbecdd264e76ea3abdacd4fd7e01923ccbf669f18205941d03360c0acae92330470c0164491a26c2153b35d5fd74179928995889fcd5d08373ebd4efebe2889047d6f7e1741243c5123dda63e5fdb6e885b874991d1c8929a273f09cd21f5164d25b1f0fe20c784e7ce29797e90b437b34289a8e85cc78e423f4048fa94b000e2b63d678983bf68a0cac7ab257f54a80cc3edaa959ea85873f93c2e11c98bf944ee66983387764a7cfc40e345f42d3109b5deca45f7b1dcdbf48d3b02b7a649a053b430729a3c8426fc8d3ab193367c4265913f9557ab0f9e049cb3b930774cf331ab7b17a6d3eb44d43629b44d02d8682727f441132bd199062194941fde2f1b37b663889b580e01eb28bb1ac03ea809127f1e4a3589a8ff03b47db7cfe9134203a7f565cd7579bb87441e57f208c17eef58e7a2bad11f4d9a106ee0a6066dc61f8c990d414f9a7c2ef1a91ab90c835ee2bdf77a4eb3728b52455cb998457f04f9c40af459a391611a88a77b091f6bc27fae83787cf2a25d33b1d98f69a9b08167d930632076eca61287172076d484003cc8f14a43812da5e63b0700af3757a64378402fd14ae6c5a1e6da20baca4b046418593b5c694a5b764a3639e17204f666da53a2c0e770b80677432f4e81d92801806192bbd224516028c6667d97b14df5d6e5a3e07989222fda28951f06bde933f52e61629d443b3bf80f751aa6e105627b219833a927366515fa78ca074f3b99f4b2dc20e1c94793e580e6f5524d456d253eb510b15c232533783b4f5a881c122457d43a7b7a65768e66e760501a43631a9d5b5d8110448f1c0a3a97a11382789eef8616a451d1433101f9753197d591ac71c528975ab0d3e5d27f72856c122309dae3cfc09cfc114248da35ebc212fc809db0760b513d1aa2d98ca8769414ee4834e9a66ffe90d8929200a3993d77fb5105fb3de7aed70373017906223d44c6bcf0c7072dddd0c34357dbf46b253e72699eb12eaecda7fa0fdb63d59baebaec3d3ae1a4d9ccc43646d8c4a24e2b5d08bcf67611760faaae613d336240ab9175521cf05a3ea2c5db77e71c93fe6e3952c80d300d1efefb9054e610098b9bcd31bff49af046f92deee5102fc63d20f37384e6703f5e5755efc242a295f4a0607c53be896fd80dc0196ea383cd13f792227ae855e3b52dcc2289c75eb7cf46918aba3d2ac433da2dae5b95c99f7b75028b686cc4e41a0226f53d359d885e7d3d719a756f31c25f750f3621595ddfc731d12a31d2571d0430e5e803c96d5d6a12577a4cbc668aca8df9c9ec840fab0f87193f11251ee01faa58605a5cb1cf3a3fe34c091ab1e7bfd04e4466bfd8ee4b00dd500aa786df408e492cfd3d6da50e66a05e7d795a1ae522c8e62531c9c83bf4178bb7e93389cc912d3d36a28ec71cc6b8af8d6d5eac01b1c03210a58ece2328c7086f5b8ebac5970440b46844757a702b34627fcafb12c8a91d42deec9323e8a012f987df27e60422ef15a4dd41e51fa5c7131863c62eb97daf54123c539b209ad41bf09440d571921a747ae75d2056ae288a71246abe0415f8468344beea8789a95d2a4fcffb8ddba078bf589a7985a923d0ceab885a674cf3200f2a6a10e285876aa85c759ea5bb0966d0e55c1c10ad84d4918a304e62d75582d83b34d80bcef2132552b2d5021cb9d10228dd58c7a5ebf2373b47282cfa8a97dee0eac95eda3891725cf66d547c689436ae761719b40c8348ff65aad71ee7155cd5dc477b6d13d4257bd668bbe46195dd44fbbfdcc0f64cb587b54420be90fbc71be8350fb4a8cced069abe85c054247d47a9af80893aa27137e00d3b85585f9982b9f6ed2397ba69d6d2b8295300c599fc0adec3114f6890f7dac00c03d99043e5051cdf3eaba88fbb0473271d4d0524c582ef4816f441b0c52057dd83a6823ef3aa058bed78cd31c0ccf63e3fb24327240388e6f586ee25f194af6f15d3f5a9085a052a0536d630c968b3c251d31324c7a76d7dbb40182a6de4ad787bbb7731f2f06e0ee2d1bc6ebee51c6ed9e6a25932b75360ce14cc4b8bdbaef4d816eb7dbb369c09c0431111322423b74af7ec3c86d4a158edc7bf85b9abbb03e24940b3c46fdbf0fe58bf7e24453098b08be6fd9d18055ed00209127ff9f25f9e3ab987ac0b7d52f1ec07bf3512a424228895bbe346e383de4885a0d4830b056b36310195216e66da8b43bd9a7e5e473c4e880bc9709f4de394fb47b4134d2c388e79d9f6fc6d18e27434783c7005d000e32c910fb4b2616a4374a566871be8fae8508660b161565566b6994ca43ce5ae41df19dda3bbeb9a80e42dd7fa9cace3040afb05178fc284c86c9cef7e691091e0a712bfb0347378bec5fc269d3e193fd1386a60a2ec47770267baab8b1f1f6659fb34c5cae9218b5dd0ad126e63170088b60c7b466fd3525eb4dc2b76a2f0ce09c667a3dc78459ecb4008ee575df98de954f33ae09e2d82f5b3fe6e02d1beddd9535bc781ce66949d1e56f6a490350369e741cb74cb033657b7a24538ff5c75001c9df58735106c55d1ece9e38b6a45b9a33b0a34828a8b96a7a2070bde8fb77aab814527546dfda818dcded48894ec4d9c625ab834e8d66f94d02f70032717ef2428e1df652273413cfd80ae296debb542aeb44509261716203191e56ccb1d0edb12998b2bcceab6df853fa921c1d3ebcc5b33d8a1d96a21f3ff4a5055a1478ebd14c1b60279f219a7a556e52b0b464b997d60b5e5de72cbb34108131dc416c7e0a845a3478287df84b08a62675756221009713a730ae64802da89268c32841650872649840e1259f81103154bd89ca9815361dd793c213620bd276dd300366c63845b8c5f4a642b394a24582d40de5862f7d857a523cab413248b2ca74b3ee0b217a3b6918fc2ed2250a9538031995910453547453fd09cf9e7aa5df2b3a7fd5bdc0a6804196091b2e8db1e4759e14823609ed9c74735167beac451f5a09d167082b2d1622abb62ba3a4c92f7f3b27095e1998c22a31a3e7f0d04913276e8d8ef7b5b5f1046fa37cc69ddc4656d7964c0ea30bb56ee4bc21a34b0caf3b10db40f0f5ed1812e00793777dcdbc53a0dd4e14e9f54f2d90e7d00787a42920e11d51f3993198edb8f2dcf5a6b047b3489d4e2829937e325ad4cf4bb829bcf3127bcbe57723eebdbe25752009745d4bb29655364ebb3f74ae950a690579a97a0c815e2c30ede53ce68a8604505c0e828f7ba775be975febfc09f3eafe750e8091b8039bb1ce347cdb1359aa5f8ab00d10669387fda0628c8e32d1b49bd8606005bc491ada5880fccef3891d6cd12e1f38833c7141623c11aa2dcf43714c48ab14952ed6c77098605d0ce1746ccaa3f959cb2c696e67c1c28155450d940f8f053f3dbf0d68e8c7a6dccdd7cc40c8d3b43f15f561455647f704099f1aacf2d755f01a57184e148ac2a494de6a8e88a5549995b146e7b12a62d211b6a9b82581d70630d0d951ea6c8547d5dc3ee5aaf365553141ced6a64f80bdf029a34924c42e4be189367622eeae4accbc05e5976f549edf0a07e1f8a8590faf8bf70401d1e7a2429f9f32d7a4426fd6a074bf79ae86342a12e43ffa7691b237c0125056d5b2e06a14f890430fe1745f7b807576204888087a6f55606732c4d9d0a608959c1bda07c09e6f2bcbc0b4acc06269e5bb6346b9244689a292362ac7fcc48ded19bfe61a19257b04116e1f3adbd9e862aae615b66c5c60a8c19f12bd4452ed329c40d87a13ebb47472b517e457e8540d4e0a3f2b1b28a79e6cdd8480f3685d3e6561529ca70652892e3e90f94c8187dbe51082d3338f675094e9f0911d8f3083a2abf3dca339afacce713a35fa21025b8ff4b0f474daa2f324e6266de9d0667a4fe880f47c1c906257ef89ad765a625238852504d7b31f831b4778ed5b313b0379406f6e67363664ea80e349801a79e7956e8bac0bf0f081848616813d1a74d12cecb42244d95da0da6c1ff6ebdb088d04fcd6e4d587d2806b5112f703319bee20abfcbe5466d999475f8038dc868ee23541114f93021a28cb3ae095095f1e51f0e641b43efbbfff8eac64c9c98bb8bd727a198ed1c2b192d2bed587e8ede6055363989a03079b477569e602dea2df34d6936c20419769cb3402eba1c296943ed0931d0c4db8d5f784f02f79931762d3e5dc7bf9ef06d52b5aa6588bc1d12c03f9d2b8cf5d4e98602e56fc5267016899e26024b143a8d2a05e9405083bc791a12a80fe4c3b4aa8293b89eda6f3dce04cf38c80acff9f708a163587b27521c64b02082d5d081b00160ad629a7b57bcc42a046be42a7876eb5cb10f54d4f75f45527419938ef5337cab7510e7fc2f2b0b1394dcc697ac7a0efcac30ddf7624bd89e5098b18e27d7d8df42f33a36fa4d0bfeb0bd48164ce5050504d2ba3064e7ad733397790430ff1acef53662e9888f377f9339f0bbaa39eeae51e4871d139f33aaebd37a00b0abd37b1f3769a73bbade0b8ffb5f36f5d09f614154f439842a031d8e45f41c067bcf82f56a71f5e2c77cd0d424388f90dfd0be185801cc12a11506c2df01038529753f5e08d7e43f540faca34d6418e912864b7b09651d6313e18120c5f2a69c2cfc1fa96890602cc2cb7f0b692d66cae6a1029fe4c0ab84becb707d9b85bc49f1c45cdddbf9c0b70fd0768e540067c0cfd15b03f6db72c7bc5191a3fedff65204b6de1b542699fb840f049050c260b6646a7c05fb4ca377a3ffa0bc7743e89e9e480a9c5036bcea8be9d1ae8538de6a6252fed40f9041db00258d6f657b048f1e5171aafc26777c5e30f77476663c3d51f9df072a2c9251e626dae722ee1255804f8b63be2d89623ab6b4d147e3c304835f6e3c2c5f6479c0282605ca62812285b69189e89c39ed23f924d771c501f8a5046d11bc4da3dde6a7fc3831a767c0fb2c7eff375b7f7551a9cbef5ed82b3213d31bdde44868198e6c2076e82ba21dcf7c99e5da1e5e400ad3951c09d07e6b3de4966afb0295dc9b825dd411c3a69b233ffe6454dd00377a4413815b5ca86a5dae74d97d42d4e3ab14479a39b7e87fdf26601cc00b9e08bd72800283eb2467fb6f1f2da847ef288375f0500a571e5a972a71b75159563115dea4b7fbde7c8c0360f7d1a0308934f09979661102592113e51b78d2d233c7b9dac16b030c6b403e6a51ce23f130d3764d734c426f3a5dedf41d4f33f0c354828b49d99fde94437998259d22c11a4137180c373b8e8ec99b5b49165d282babd074238492a35ad54120b65a50f9a79cb0a943e38b996bb9f5cb0cfa839189d78cf694caf31075d27fc5bfb06b5bfe73bc55765ec898affd2c7d52d069d0e3ad359e44aaba9eaf602ce33d4bbebe2b775d5057017ed588f50b16ba547edd48364040fb0f74edfe3b8e3d95544721691978c81142a60cf32034551d2c73ddf5c52f4c25e55ff9968fb75ab43c0501f087e1ed01a6b5c4e803aef2110135f3a61ed6191b6ce5e8b482281b076066c4484882d5611b58d99d0a829ca486f405224e2119100be27a2906767776c312161c60c0f84d01c2363ad09c1726896fcdcbc29694c91b5494dce68b0b00341959fba57dca6051ad691e44df6a4cb27e079a7a68cfc2ca86b28750755704118aa6a20561b20389d983e57582513cdb765312315974cec211de61a6220905374205156978391d88b206b91388ea38120c040835bcdc2f1679d072e5f1d3d727da9ec84fb16ea77da06368d1c47eedd8baa41f2282881443ce8e6ba178e225e4a97c66341f5090276a1316da5985754a9a791b58e84518248d68681737bfb843d56bd9508cb2d5bdc1683f64b6e98ba13038d3aaeb179c267404ef9c5ed4016c00023e133d452e0e167868612a8cc84f802e65ee76d6611595fe1f2229e9f87220d1d915face1882ef69bcb5c2a24e0f9e6c156b2330223e0dcfc465bf74a993ff307d930c8b9a42843a08602a1a80672391f941b13aaaabb9b729d61742067fdaf9d812f4731fd87950ac77dc347f4139c546f80ee4553e73d69e9bc9736bd77d2a4fb5eda74df499fee7b69d27f2f6dfaefa50d42100240f779aa8c9322b7083f2321cfa3a38497ff336c1d019d9379e9717992f97b7c7ecccee7289cf1c7adf98ecc2e747edf8d0a5838daefdacbb09ed51930b4748e73aa5584edfbc8c36a90736a65d2ad2beb2cfef5ae38d221e6fb028e1fc497f2200ca30ea0ec1f28d9b708f434412860c2d0476ab71c06d6d29b0b640119546d0d6c2a9c6e09177f416dda348bf5f391518abed3ee08f5106f093a88ca6ffc814f08499f67154b04fcf400d62060b3fba7dc73487f4346f94da4c9b18a1c224af0c82c84fa9007430495ce2a1975515f0f4e32086238185f8883de29eae0cbec12a8300012e5d03fe7e11c38247c3b8a4323ca87dab67f942fd7474de4061be76fd4c8f47b383e3b165686a108d53dd823022e0567e6b405f4c0e7f97298869992c5a5afb0aaf441f78f95a898078181d0007f1d04fcfe252d96b06d594e73d28cd9554d52758f4a9627c3f64594e4afee406791fa2f6d94f608ba5b3aa53caff1332a04705a83b448e143e443f55774303f348a0ab069c0561ca3989f913bfc463431ca89f3f68561fb880a83e80fe30844774c195c039d8123de6631923d5b3d1de1ba07817cbe6cc20bebc827fad3a26e7f26aaaa9b15f9442fbc2fb5d07a59219a7cf99a1a86ceaa2a1b305e5d7a7ce4eb1739bf30ded11f28083de711991a6ec3277ddf672c4e9054346c0f8516702bdcc18da2d3b888c87f89871b27203bd2e216de3d7475e821dc42a1906861059884dcd11b5ad03c5270b53f277de4bd0b2f68702e01fdf94fef6cf746a8501c89a22a78371a5482490056a8d0d895300df8d965ee6e299a5d86b0262ad05b80467c41fbcfb9f68caf2656d49951509bfaccc8a520162ee69c009c95f951e2259d39089764a0c3c284ce63560dd4dc66b08cf36fbc5e664953bf783710f92f8761df768d79c89fc8a8b39ede631b39848cb4d0609a263fa4db47862a45947d2a8bd6f1eba7794ff4fc1d8c9589e17906ab036f3da5e74601f797041a4883f40cbd0878b492b9fedb1d7b26bb0e3d5b3563352868e1037d611a5d919a82c5f8f4cb096909ae62770b8fc710c8b84e1982b582fd4ddf15e4fd3cc8acf5a16c3b2d0afe5b101e6981481fe399de6037168ea7c45f5a2cf20876b16ab3723fc89cef8de58e90882361a1f433368fe9b6b42e9ee5be35b8a411804ca7b04a45d58973a1ac9cad03bc692a030a16b2f2bb392f9dc658c8100c1485c5f2b6079a8d6694ab4c41ea25f9fd1b45763f192a261ee53170c1be07dbb9ec820f42be143608676640101b9e7d81739248fb0efcbe2ff65fe69f176c6f752a41285924371854e67e627c94a90d86be0174bfadc507e83bb24ee008a028f0c3d8c728fe6f776cd81c0b261daca665920a7086b7e690774f9290fe8477c30d30fd3ffceb6a94fb39d15208c0443d81488b801b53595c5469a530fd5048f0127ccbf2ba52e31df4d10c62a9825825f5645ffb8ce483228c5078c6ab81a327e4165e27d5f24b704d5111364f5d8b9929b0207f031f49d113384ba23cb612817eba7052c257873705e28b9087f07173c9557bd230ca83c7c3618daec31fde0dd3791c66c36a4afc609cc2769bb4c5898ca8244780342d9f754777020945dbe707d28289fe35ec9ab25c88cefeb77ab9caada6a1da715c34a931b86c526371c1a4c6e052f0f9d61e5b2501273feaf673cdf5741775c66af34d787f7a3724726997e574d0c6bbfd348f3d4018e611f2ac73ecf97d03621a695565a2715ecf01ec22abacac76368cb433ec151ddfd660c4967df0e7449af5e99c17c7e1e492c508ba86cda0e4c58820d1c0d803194ab720a2cfe73a35aed26ac2eec00812c84da9a7a4b847f27d69d939e2b36475b0efd5fbaea095869e217893d54e8c7be52c9796cb462290be432fc1addb138166304d825fa1e8a2d6b2933a8152835ef5d7af580449fe99103c884f71ca97b0d556a8e9fecfd9fdf85ad3d9e566f082f947d337095f087c301404c0fb514dee398f9a543cb9274ec49292f0f13cda1f0aef7119edd7750ba109e3a00075bd44160a6931fffae69682c0c9dc3c5cc27c47e7f6b1d58153bd032933f3f569c6764f5addda9958e6be3ea2458b4240ac5323124c5c2d6af3a5cb3b75f793a225c386747a6dc697e9998b8250ed585b1b92c80fa0f77a995fcfd74ebfcd7ce343ed29ce687879824b6ca01362505fa8b9b7fa72c514b641fbf1a9bd55880d52f8cdd11ad5405241b09230f1a4a9ee506cb75fcb148f781b8a03bad4dab5437a4a401def03a60715053218ab92702e5b75983f9420d13b420ec4acf0c43f3dc8d11642c1bc8b45a3387d93a52a882bc3025a5cd21cb85cbbc841e634c80a652ff35d3c3a6f88ab937c97a979750127171914350f28a368023c96b39cf6c63909965c12f787d5d835c0560531c87df4a76a6b2d15cde0a052a2a9b006c2e8c8887b5eff825afe66af1520d803d7a63b0ab66bbdb2f0ab0c3859a56d129c71a9ff6a4bf26e739009f68119a6e21916d8c888875bf96c5f02b6c75e175a3155dc8b9691908b39914a8dcb9aff1e960afc551b4fb5c78e872c0335e5543836ce101554958f9166c757275c2a948778ccd3cef5e60cd9f1482410d3ded02a00b662c202af9a1be29f8e3fe2689b7fc529abadd3837b5e1fa57df8f99f47786fe33e8d0492587164623591e05b27451bd8c39d37b3b0c6dfada364caa18832c3c83bc83047e9fe460e8d1becdc8f40ffd4a7d8117df3bcf449abaa039f2b2a78765404bc5324adc15845ce28b27a0e0551c0c59c282c1a98640ecc3c442dcbedfdef973af4abd3f3ad7f26abcb606de8c33fe956e80a3111b02c4996f04088bb7e784b8849a64393d5c43a5bcfe63a5598b332a9bce0bcf436349942b0209dd405968f482ce5cd07a126c7ce1ef4da3a838ea3b8382e0a4bd72059d3fd60504aa8b0aeee68c7ace4ae8ad58fed60c76139ae35b7d0514a57c26af925e932d1b0a89f34a4b2a17c33c8642254951d3e53f81c6b2888cda24cd7d937715d0bb8fccc31eeee3d32d93d7d22d9965b635679e6219e8bda8a92c8da0fce46a9bff2e648c2c44b17d5a79c63d774efc526f91883a78a9511b9ebbf4bbae78f65b60e9db73b1f4127a7a611e804051b20cc1f961775cba1b0fa4eb5aef33878c864e20b35320a3440ae43214e31f6e1b653c8c9ac99a40c1b5d9a9e6219cba5c85d83e2677da0c13cc1b30d8f232eea3950ae34b07a11d198298ef645e7fcc0baa1a3d06342eb046d5332995607c05f20f283a620abd8d42b001d25b0117f4edc26c0aee7880d61c0c90609c99a51eadcec8ea20fa27226e6dc13f5da3057d6b5380a3150a84714e4a01142d1a5ba87fb81b495983c2fb8325e11217e45deb0a97bdd8da8d846759ce8f57c557c1d3a220f51847685f46ada96a899c4f8797316cb697dedd56d610658b5ccdb2faf9ab7ab0092e5044242c759b527001714a5a1e85dac3d2aeea0054579492766a8f5c58ac62eb3b9e9a2cbec91769752cc6a82f8ddc7e9ee97049f719193bee48bf11de2cc78758c01f27d035188a01979a3155768a26510ac9a1b3e6dd17791cf50212b2c0c078dc2de2ba23541049ab8f9c17d9806984003eebd355a1cd8d4b79c93227a250304b9799c87da37afeb077e8bdc123a2dcda733ae0fd7c01b3a7bbf3641d0cb23f1cb78ecfa639d52355f53accb284a9ef98ccf50bdefe0746b2d8d0736e2e7a77336e859cf2ed72b0342ad02069ae6254a7693e0d7c5655e8c79026c6d70d6068866b695843e70891fe7c87183f2f42fedac3ae24a2ff1b63a72ac4f77c7d53889d56627249b49570b1a67a6d4e89e503b2ce1f8eef53221421e5692462dcae7c40e576ca1d949f57ed6bb021ee5487de2ea042bfe4d56fe15a0c405fec90559d9c69039d2f4e4123aa3cff062f2e3811c0854be4d2ea1da41159dac58ceaf00ae929259c8dc4a5c35cabeea287795b5d318be361e70aa4c05bf1618e189aba5696825d3096f8e22a6c51c5455d2ea26953fef614c4ef655b02548b8788eb628ebaedb40c4562053eb89d8d7270a94a4191b123a1b2bfecd605e23a2355471067ebe876f1c3e1020b5e60189c52434428e866902f952c2269024545d210c9b9a50a3b41175148b36dc926a610ae9f827822a9562baa40829287580041f69a22898697f0ac3193b20951ef40d47cab50f0b8389c6bb8ccc90f67330371283bfeec4b7f391d9b9bf7f4ecb39c453e41b63d23ba0ee73a1a71f6b7fbc6de2271a656f0f61b2f671efbc36bdf3d86438e6b997ed3a2ceccbf65a1cd73b6f4def3c3557635e04906589af52af5ffd2b1b24fe5d3cc2576278177c626f3a304def3c343c333c32bdf3c6f4ce13d33b2f4cef307c81be7aef9d07a601cf4bbf6ad1260ba952bd52ef11f85a58913f7de7686982c132d8a7efbcc76a6ac16090b4730f24493b27e582783007f9152c7dfe89ffb6cb4ad8f816fcb75d56a29165efbc2e5cba7cdb7638eedbc6727b4d987b6399bbe26fb22773d78f7b32d993f9c2ce7af795b9c3ba3ae90bab407e057defa546bd77dcae6fe32ba70723141d4c10e1caf7e5f4ded65724ddb7284deff21ffadcbfc003d852406dc1e87365b46041ca3491a7e56a812cbdf3b0f4ce23e04aef9d2e8e0d87beaccc8dc59a263fd10efeff2258cc8dffcf65f0cf5f244917c7fe9f81760e04fe3f1fef617e67b4c21b008d57179d0dc4e9d20b27817801c92fbccb0410f20bef3a7e3ae0110602cb069b5ab4206f63dc004a087ffba2031471fd85decec10a9f2af7deedda814fddea3db76ba2b1068a09717fd68328a7424ffa52b2f4a19c7c281a3b87f3a1c2d287969d7c331b7be13b83bd97f27148db6ba7bde63353f9cc2cbde833cf7ca6974f05a4b236dea49dd376384dfa5430e95d056abc8db8cfbd19a4124d99f324f8caae6ec6f31ae37d3a9ecd6bfbe2d4c9afd95e4323edb93208ccc9ffdf82e46c93704c8e997d618edb353df7edbcd068d7a646a348e32ec9f2be7d4ce2f2aff33829d75ef6f690c4bd9d2dccfdf0df441bf6a48d07ff179c1f7ab2cc674fe61f17d2fefec42f2cfeb99aa689a4cfe582c11ca45c7b9cc6e97a2c80da8e23cb4fdff9895c2ef8e1daf6710d3bb6fbb5dccf8cad2c2c0c381c7ebbb0b0b0b0229e432e07f9855f24983d47e2bf8e9eab6d1b27f131b2946b9bc6653caf691fffd926f1e2ff74a55c90ceb6cfc060bb4ebe6d3bb24623f3dacbb9bd3696db6b3ef7666d4732f9e7344c0bedbb0d670017b3bb3f5dec6f3832f9e33484b94cdbc9b58781f2c78d62b2ffc2311bc650f65fe881f61c50163bf3b72f02e37a0c5530c8abd23b8f4aefbc29bdf3a4f4ce8bd23b4f80de79507ae73de99de7a4775e93de794c7ae72de99da7a4775e92de79487ae71de99d67a4775e91de79447ae70de99d27a4775e90de79407ae7fde89de7a377deb177de5def3cbbde7975bdf38cbdf3f2de7978efbcbb775e8fde79c5de7976efbcfa80de051187bd1be2d1f1e83d6d0c6e8d0d079a1bdb191954a3b106fcc1187b7bfba901cddcc6e2da68006d8ca905c960dc7b9d07b597b383debb10bf4bdf968fdebb10f73ef732d9af6a78f9217f099fac69922e8efdb82ebf10ae9c6d92cdc741142edfdeae6fe2c0a653e94f7c1c6efa8d830bdf864e47f8ebff9914c6f45790fc7f1e2b71bc48d3c322d1078372916884c9a3fd4696c1229ddbf81037922bbc52902b4814640ab28b6c4116e91c98ffe10aaf229d77c5431f035b90c7fc0f55a820ff6dd773f4578e1bef60304896453a87c92faf229d779160c7e1ed8734b136de60796ddf7330487abcb6e99ab68b744efaa1cfe1603048deb46d9328d2f94dd791207f6e2c12ed38181c23ff9f8143ff87ffcfc0ffe7229d8b89fdff02edff19f8ff8bce6bb5e3accbb50ddf79a2ddafb338f4eec31285d5c78735a563054d1f96cfa7a89772413240b9b6619fefacfb48b85e2a9bacd7c7d70bd27ba7d17dbd2e36123f7eba2fcc31543ac23e0c76fa188629b8dd5ff36128da3cc89a43f76150eb63f22f1669bab7da26b3fb6b66767f4d96bf2c8fd9fdb50bbe0be64ff35980e4b3c0c4820d9f85e21fd2423bd257c18e0d93c7d86eadc29418dd57c1ed1d3f41e7695f859e8f42250a6f7a698646d6f92830e925597b1b9d42d70451bd9fe8be097d680614e86ed2f2271269f21824713b96ff5d2c170ce69069b23ce23e8d2cfd11a63d59d3385d77f78dc4201ec4836489935ef2ff3ae6746d2412edb88b94ff171de368b54d6667a7d9361cd1be5fe0749a0d8796db6bb9bd66d3c31f8ee28def0111df8333df030e3e0711f40e0412e33b21ee853e072a7a89b7a9b99d91f5585effb7d886af81a28ee7746dfb1a80e9be06c6de4bf9ceab9564ee8b5e2e18cc01d3778c7f799e6db02faf387a3adb34cdb3cb169691e58fe9dcaef33f37a4fd7c1be7e3d0e7432391c6c9234cfe3f93b29dcfb85a990d72aea6dbf29826fafa28e37039eded86b60d93ff98d3607ec5afed7b5ed37565ed9ab4b3ef3912271ae3c832182483746cc17fd77ee88d3d6cbbdcb6e30f93b3fd87434fc4c9ffc1ee5f67df9e288ceb0fc305bd3d3cfaa2ff45bb3988b7a995d9206b5a76933d19064c2b7cdc19dce8bd0f7b4f4e4b5858fcebc2c2e41c0716f17fdbf12ab90f5755b8404f2f8376bf0e92175cb0660381e56dcf643048fa32922e8ef9db38e66f63eef1397be8c9affcb685786ed7244890376d9cfbb787c170b4b6b1e37098db459278db335adb586d178dc0dac7e53cfc784e7f1af7df8ebc83b9275bb420833869c465daaef3313d670f617b88e743da08df60b8271a71dc935ff2dc1f9634c8d2d7740dbb4d1eda76366d8793df2ecfe9fbdfbefe75f77f6bc371fc540f4f7ba62ee89d686a9102a6ec7459ae6db21e5d5c7aef6bef9912f6de47c8a6ce4c7595f264249276f699fc7123b0949e522e294fa4b490b2ebb51dfb7fe733d46aff89248ae3f00f6d1cc571e849b520d57bef41764581c151957a2fff9c1f5566d4dba815bdc43df9f17b0eecd7f44cfedb5623cb6fece18b3679ccf37f17bf106e54842e8a53efbd1465a78bbad17be915bceda0f1f6314ecba4db9ff36dbfb99a163521949dde7b290f6d12f7c23b14925e8602001427b0ef893ece69bb2e82cad27b897f634dd79fcced1a545b297f589ec0be8be4d8047d7a9f60ca9c6f9be04f80e153a6decbb99a3edef9bf73fcd70d3f4eac1bda5ff2ff79ed6f6f9c23f3db0b63e35bfee77cf1fba0dfc2c2e0fe9c2f7e22d23fe1882b8fc3201e1686078df6f138fcf4dc1fe272fd49af2ef91bc9e3ff1afa981692352dcce39a8d2c6b1f1b63d80b27671b1ffa1c970bce6cf5bff36ac11c353d93386d670fc9e370e889b73ddff4f741e3df68db73e418490f8b44facf793bf7c598aebbe7ec3c497a1df322f183d576dd25d7386df6eb68fc36e246df368487f4ed6fbb48fc70b2bdf6e77c9bbdf687b02ffaef96db6b68f6fd7d1cb922d2af7080cde9bde777bfaefb77b1a6e73e2cd7ffeecb35da9ff36d62622cd66ea30d0be7e85f038fb2ffb798d8f741bf915f2cd094869dd768e4976b2cfa2fcc713ffc3ee8b7a2ff67df07fdf6e77c9ba64dbdcb68b55d567ee337f6b87f3ecb7f6ecec395c7dad343dbbe71213098e335ede73c89e3bfbe7f1d69c465b2befd1fda7691946d61fec9bbfcfba071609d5d04de79626edb3710b87696e3347eff36313816f9c781ffdf391c1696ffb7fbd7766cc72f63669bd9ee5f34bec97f66c361e31b7efc327ceecd8a33db6dbfa0b36d32fcfe3fb76bf2ab26dbc8d22893f2c76ffbbebf3dac3f9168c7fffec287b49fc9db26f3182d3716bf7cac3d59db388fb9f20b83c11c0dff745efb2049290925b8dee5747c51cad04b2304164020a9cbe920659acca1a3542bb341f28410f4187ef224f1de17e8bdd3f59ed054a78b63fe368e95fe367a5298d376b78de33ffe3589d6364696f8a781b93dc4736f935fc7a1bf8d633299db43b277de5c4a8c6ddc9f1e16ff8bfceeafe16d3464da4cae6db232dc98e3f6196ecc7dfe6b34f9cff9ba3ffc6ef97f93693321eecf7033f9fef54f1b0ec764ffcf7e4cd7ddffedff17c7fbd7d1c36f26dfdeceeeafa9f9b43f2cd237dcf1fe75768cd3663ef766b2ff67443bc78d65325a9118dba0bb3df1feb98fc3e934fccb76193e9cf39f38f7df6a1af8a7cde4daa6fd3f8b7ba8f5209ae5b84fab6dda0c4d69d870f2d10f3f7efc3264fabe7f1d5b9118dbc071b522f13ecb6be3cf9e6bb4dc1ebed9d96bbde5cd3020b1e9bde7f610a771f9ff201111c6b927e23431ec512ae027edb9a6c9d907a19bef7aefc2de73642abffbbf779e1cf7ce837be7f9de794160efbc1dbdf3e47a3a7ae7e500d33b0f47efdd43ef57617aefc6de6be04d8feb8fe31fd8affe6dcf5f1224489030a1f664c7fca665f2df6c649dd3b71d3996d5084989df6670f2d019e34be08c17060c2a6008d224de8d4e3dafffbfe5212d8c43f5deeb7a6f9115fccfddbfceb651fc394e4793451beeea45299374d19341bad81e920149bcb473f278fb3abccced9abc6d12ffa47118178b63e427da6a6161707676ade8432917cc3f0e215123fbc3571212113b2ec6e208b795786de7b4bf8d635f2fc8f213e97c08d3f86ddbe146bcfef5c76d614cde46fb0659e2c6dcdfbe58f4a46cdf4512050a3b4f7e32b2c4659bbe7fd1b68564f0cfc0da16c6fe93b34d92f597ed3af88d771e24edbc2e8e2c7f5c7f638f8f93be775e1c4aceb6ef7dae771dbd77afde99f4de2115bfcb2f8c7d4c17db43b0346de66a7aaea60dbde9b5fd89366e88482f0db5956386b87a591be78665767fad109a5e162a76bb3f177251168a4013b20393f9899ab42344a413727bb7ebb141957aef7d1018bb416dbd3c7abbfbcbb5f1487e91f69aa054bdf78ed3c761cd2648512f6f9b44c90f0b02d34bd2ebdf36b18b3cfe5a90db8757c8623930d09b404c7a0f142ce582814a3ca76b63e925a37d7d75cd760a520d92e56dcf1eaf7fd1b6b3d3e2eebc1a8db9dabee3ecb5bb46bbbf7cb37dfab6edfe0bdb86b3d7e40fa7b6a7f72e26c622af69bbf889345cfd8576b73d76e7d5f09af6c43f43fe7479e1394d7ed53489fb2e9224c7fc54a27d91f403c64fb1773f6d7dac4faade4bb9f6b92f8ef5c1fb4ce913ecfd08e3deae8ff96f3e957a2f833f98d3645efc71ec716fc7c74e2ff908ff3df3318140a59cf6c49b1c43204befbd8bcc6f7b0c01612f6f3adc8f21b0d57bd016dad1d9f650aebdd9b14dfeff6e93ff9bfce9ecbaef061bdfcaf2ffa627951e3b7ab2f412c76123ae8748a9a72b0fa4daaef1b73c76f24c3143cb53ecbdccd3557b12bf8d716ce78950d3707814e5f5277e3c68cab91acf5defa5fcf198bd93a5fc85b1ff379e08bd97f5a7f3b9b07747d47fd1bb03e9ce9b3b446a3bfbce596ed777bae83b117aefc77ccdcea0f21b719cbe7fd10e13fcdb19f65e8a898979f9dc9b915f5db011c72784858991b80f0b8363011b7138163ef76673ffaed355a7d351d4e9a0a173d74bb9209d333abd39a24ab9e0a05eca05e780e9386cc4e7144bb9e01c177d0e875eca0545c9190446ce5d97d326878cc3a9f738834ab9e0ff731c3071ee781b701a878d78efbc1ae4fdbf0c76ac3d9ed3c6615cd3e4d71d3dcfa5fc3d4eced5f45739577ef26bb6c9634edfad11efbc1a89df79b55f04838d7859fbdb0c0d3f117bd888fffc78ff624ce39eac647056fe9a1ecafecbc55f34e672c1b0b01c479278c7f927bfc8afe39d7d178f76247e1cd2f2c769e4b5a7e7bcb6e3635effda1ed6454f5423cb9bfec21c37e6765df4443238b3793a181c921fbf7f5d5efbdb16da9144728c0c06493bae6d3ab789e4908e6bf238fc74f4b06be865dc9373344c1eedb5af991e23cb1a36e2247e22bffbc273fa480236e224c85f47e743b0fb178d387985882552061b980db63838b2248fb7279ea0bf5e90e55c93388d46fe727bcd5ec3ddec351ab9bd6676db2f7e6dc796db6bf69afc7f1d0de34817d3f9dbff2f727b0d878d6f575f5f59bd77dc68ffdabeef9f71869d9df6736f36b3e54636d9b661d476762de30f614ffbb6ff5f88e1e4d76dcf356dcf35da31c763dc79b5daa6f3ff6779f8e917329a3dd7686e637777f43c1bdff04fb71dc5f09f1fc958106d1cf8ff3ddbb93cb4ed7e7da6ad3493aa77f8cb327acf8cfceff82b183423346366e7edca5850064defbdfcc5632ed7a51d7f9c2c635706c7ed21991b6db29eabe92fd2ce1e7e98cc8d70991ed67b64ecf4deed9c0c935e12c9b8bd31a97a2fbd209563c004c71029c71c61321f1be37e31a94a2fb98b94c5bc29bd6e9c2692b73d8bb9ebbdfcf72ca68bee22c35000cb3fbeed17f2b7f34238f9cb9f4eaee918ff6e68f2777b23937f5ed36af217e27ef876e7bef8dde41cb7d372dc68267f3b5bae7f6052f5de7b17eb3d306f7a2f8362f2d03e836331b3d59087b6104c1127ebc8313067bdfb7c088643ef65f00b27b22f7dba9d3d24eb7db92b3f3dd3b24dfc32f4f79708bd9ca385a46de75e14f55e068377df4b98de7b49d3a9f0f9f0cb622ce25f232c0ceeff7b06dafdda2caf3f31c78d3ce4b19b96bd90bd940b7649d56550972cbd2e5ddc522ed82542ef5c26a17131d4f13baf561eeba137ca741d2dd7f49d57abefbc5a49e7f827e72f991cf16b3ba76fa35de767d23623c37e4d0f49a29de7361959daf7f741d3e46db4e93a2ffc70fee78e9e881bed231a59bed96624e9c9a291ac7fd10ea3c3e9fb36da4732f7a48d93b67cffba6f679f9141f903ff6d8c3f5ed3c14fd63efeb2efef8326511c8743ff6f14a4d13e92331a3982cded87835c1b3b8323dd7e70633f3718e48f8c847ba3a14696f52fda354d64906904090408297fb28518090408e9d585d3e5fff72c7fa25f234bba7fcfa4fc05bf0dc9633d4696c66090f424fe71236ee7e4f1f6775e7f99c6e76a7be8c96090c43ffe85cfb3fd657fe7443232f81634da37c86030480621493131163ef766e4d7dd467e89cdc3ffc682480bdf8a5eedcff9162449923f4892fc43ba48b463bb0e06833f1200d2ce8745a2bffb32e9733c2f713ca76b2369df1f87cf87df4cfeb9afa3f3d87f3334fcfbf8ff7e81cb43fbcc7fb33f34ca5f18bfcdd5748ec35eae7ff1eef7abd170facef1ef76cc699936f6a0e76a1cf1b937731b93d1e8623b0dc76fbad84e93ffbf677cce0f5fccf9e15c7f1ff63de3bf78ccc3c27864240680d47bf7e46d6f0d404688fb2f03c8666706e82a6b9b2e538513962a79ff75345815b7f752c6d7aa70e8e5d0c762773619eed1f44e8509152a2e955e9f924998d3761e381c7ae0afa3735f47df5f06e21e58e2f217c6b91f0e7d59e7a2428e878db8dd9c29bd4fe726a552374323d77a52a6f45e1269123f91d3a48d935fbf8e1e92b95d7f19528a2559a485b81417a7ed35291566dbbe8bf8f1cb080b838b02a94739a03c7eba14645046fb3282c74fe783b51d24f1fccf91391a590ae3db7f9c3cdebea6619af4a4d08e947d6cdf364ee6c54ff7eb86b0c76939a6f1e3a7c34f7c1c27e3645af861728ebced9826dab51d7f72aea68fc3fbcb3959e2f61a7efc32ecb5e39721cb68f2cf3d1ddb383e66aff1467479480bcb8cf2af69c8bf9ea3df72db76b3f36e764d0c0302d7d8d0dedc7e35803f18636e6c706f4060581fd1738204bfcbfb17875f0804a26034e07a29ff1e644977db76a49d933c483b27efacde73d2d5c930d81ec2e41adb5b8c1100740e73ef359972fc74c0a18fed6e34d3d7f4285598543acb13ecbbf5ce9bd13bafad771e5befbcb5de796abdf3d26e1b181656db44a21d036dd9d30dede2a7b38bc7dc16dafddb5804de3613b22fa954fedb981b673fb684ccd771b8c45ee2f652aebd37ced130d1e3b47c846f63911c5bb261cc4d96c764b9ecdfc636f92b99829ff8c563ee7fbda7c445efbdc4ffdc1fd275f45d24f19cf631feed7a38f4654a86b69d7f258174bcf3e43cfc38299725c9d28f498ab95d9349c8db26e5ff6f241774fcee0b717f361cfab2fbd776be88b3a7312c0c4e0c8ec5cc5634d2d9761a1217487abd1fe154ca058f0c3a02863e7277a4ed48979154dd48a3522ed8afae7ca2fd46e2c0399ac7bfc915262946ae90bf103716c91c37c670d9a010f76741f22b18246b5f7ab167f198779141d293425f931f06fb443a6fbbf36aa5cf7d57fd87a5575749a620d13448d2f99c0cde761efb175fb85108479660ff2e923e1824673bc76be3b048a2a92c7bf2fec58f7bb2f2f8e9825e5db3fd7dd0f8d0cbb2276b9cbeedf918cff6f1d37591b22712875f487efddb93388e7ffacebe8bf3f0bfd96b724de30f615fd3c8ed351ed789ac7e05f7deebde0332082d4d305cfe402050c5b138946de2d10fbf3cfcf22f1ee16a7bfe66c73bfb6e13e25e38f4ff168e7d630fba368685ddf67d7f392c0cce9e6b3451fdc7a0de7baf6db266fb812618fcc1a4e8edeab11f367aef9d347beff5d88f099dc4bddd98fce5eff687435a86dd5f937fee651cff716c7cf3c1a4f4d1f57b474efdf86445ef1ddb7aef65d02683ffb6cb86431fd3bf23d97b878dc7007aefce4e2f712ffc321dd3c6b7bb609fbb8d77d1bebf0fb0fa8e855daad2eed7f12fe2445fdb25eafded77fc32c48e9f0e3f7e3ad8887fd98ec58e5f06f1e7b45dd1eeac9772413b0ebdba4a75763a93ba609d8b5eca05eb7addc8c9a8a6cd5ddfdeee9fd3792269e7350d7bdc7f37b28c7f11278ff9fd8bf65d2449b82b8e9388fdb0f86fd25ddfe668fccbf8890f8384cdca4f67d7d53459fbd8e75e16e2fe4cfeb5f12e9239fee5a1dd4516ffa723926a697125fe8db887c930dc04499664f013edb7205906ffbf853989e7764dce34e9d5457e7ce85f90254e93c1a08d93b2f186cb713fdb64f0137d1d0cfedbcedfc832c7ed216e14e67373f49ddb77bfb6633a6847ce74d0eb4b0c8ec56dbfe80a0af13fdbc238fff36ce374ed85f127c6fece3f7de724feebfe901ec660b9708e1e92784ce7383d1c8eb1c07f1eff3ad2ffbb8b24fd5c4d178b5e8d2c739c1e9241313816419228fb7fd7f6c77d4cd6f46c83e5469bb4e7c8dcaeef6c32b2fc3e681caca6c93f77fb21e96bd86d386d87f66f7b26fe9c0efbc1b1ad91254edaf8d0935f66644996c1fcbf91253957d31ff6c24fd4c42e12274bbce8d5beee2fccff9c9d93b9b138f45e358ddb7064698676fba131a6f3db17c9e1d03817fd1786d534e43f57d3c2dc5e1b0e7dd927da6575eceffcee67c3d970b8fcffda27fab5f817df1880782041ef3dd87b261a08891e276fa36caf7dd98ec38e45fbceeb0ff4775ed36142dc9f8585c109712f94edb28f7b61dbc7bdb088c774d1cef13baf8d76d9fcdd707bbefffd7d006bbb3e064bbe94661094091376e9859bdd06e193396f5a09069966a80d9ac380a42a587824c8092a82e05227170b4b71018d0c04054618521cd88a8d3babbc200842c660432a394e6d74ac4dca12b42a0f07594d9405b66182b8201430616074c24709003910c20d1437a43c1b301d6670ea22e581a1140e4fc6f0e95a03200e8c1ccf063368a2ee2c3112fc3b903e4819ca79364920948a22820e8304af1b826454ba42678850c10ea60e246e221e37af0422764bcade31824064f01005817294a030445fc355101d17534f03054336fc0c554c68222ac58314413a1df4505ae3673d629a94868899a335884465c0d2a1868a4250a718a07a8b05008513bdbb087c80680cf3d85c875249626321622bc7151d07347c2820240c0c53553804512dad0252353083db2c451ec88db5e9e0a70781d6006c170fc036aa830d737bdca85b17849a21ca821dad7e28a99f38a02208a985a584a4132a86a0845c1b7625528588f87e752c25e193e51431501b136a5222cc1ec4f051d440ab1c24d05a44e0c89210fc91060f87cef8b468cd8120cb59c3e97b1d7d0638fa7421834feecb11407aee745a62e543da932cb43b73e02c8b16099232a90c1e0d63c4181b59a1e2a18dd138c437d41984f5a108aa496567d0e2a8a0d8d34529d0fba1021aca9597021a281eecae5c401dfdd950e2713449100b258e8000d5f4f8f313623d19b406d397f88b6f55071a2716e832010836f98bb02c5f6409ac9ca2512108a11f1bf6783130c84707104bd4c84d1a83a5118cb52acf85d702183116818223e4c3b16e4e0838814b5252ddbe1941381112d4b527140736061204a0ca54a4335826a8dd09643e5937bd64f653dc7c3a3a4160805120be0810c632452e5b707ce8f0999fe458e08803a61d204abdd1c23108ed0c8e1aa85440902501264c7f4a999d8109fb74f6ab02e500110f84a91bd8218ef51d2f2245e8e4834e87206aa3ba04e3e652215f32300235a84a06590c0726352c3ba758655253568238d66b3b2db5b5403300aa562146249ac1a56e75908047870b5c7ce2c38a002e4238bd1364886009930c84103949512c0d863e59c0d593331c4eaac522749992f4b3450deab4850746862b414c0b17e0aa4488b325a9a7e517d54d5ad567428f496360a49c19e0c2e7e1820242642d614cc1b9520b8078a37bd8212442a13029f492225bdc18b2d4d5b5329d60c20cbaf12c5a4043099b13d97d484ec4910326c7203464204072430991fee141994f7069200b91c2c80f4e91e95d035d1d51653abcf4f821a7cd0195b6de7da102dd4814448600174c71d12077d1fb87031c51c061d0dd25b0385ac0e0397597402530c1390878c1883348ae8276ab83265486e05e1d6062af51807490e1b3e6ce296f6489292e3140cc242c40216701462834848113c208cc644a880d76cae2680f320345918870c05295e8485aa243e396c8fc2d48cd488a25523829dad209121006779034b9e81ccc5c22f1821097609b24bd67d99933c741ad210e020d7a172140282611de70b91102d37b07b11b2f182812486a44a467382b55a0e9d108206a7aef9dd8a4420456119349ef1d1ce881891592ab4d2e7a8636a6eaa00cd43bbdf79ea0f8eae24db1d2fbd65dd9d1812e72c8deb5c078822288410191de1395e8815a03557af7b085c991a5506dbd6b1900e26e0e1417dd670353904a8bde3df821cead0dea5d831a97041298de7d808e6d2522fd03dd29136aef1af42410624aef5826974c2e3a882d2b627adf7056c7a9772c3040b28340f47bdff00849ef59588a7a0f818448e7c0a3f72c26bd8b70d13b64e8bdf7de7befbdf78eb54603144043367c24d8502543459225cc061a0fa83005e311284306b45eaeca205008448ab715a36e20ea24648b832446309440b05664705007893c400a7909ef8116e48206420e3c6814a58b122ac18736b52d0fccf80084edac099c381a5a8d8965cf63f47d88e0085003030650c0402142e8099380080d632044ada9c248025475ca98a12bb49ef0c0c01f3ab26382c958464aef819e3f3d7c3025f9c1843951082d39f268b0aa5aa295074b0b0802c0a47e4810974092323b4e1e5004a98056cc63c0d6a53673cc58a161a9574194136d3419d58a0ba45161f2618e1badf784a325880506d115a5399d00b8d4616b891010adec6c40eb64716364369228f5acb859c487d10501c078d5050af149025d863b9196d882169d11d2467666ce5008d481d30c2f197702ed89e182d095296d0bd8e99de89d44701fd8356190553ed0226986164384655e009459e275010289cf08221dd22891bd951a668874c4ec810ba024a02402cc062c4ea2606cf9b8346461a921139795c0053a0608f82ac6a02380214f6accd4e13007eb810216d48122279f629aaeb4c9212cd56062e7a38c9def6911054c189920596a755a31d89cf968287871e4e232b300079251015de21808202b85b48108a6c84808af0845ccda281005525f00c4d9d14c0c960365da0a7dda7284d1892c52935148d3862917c8ac3af3272e4b9f300f2a79d9f305448eb5d6c277c0044244113acb1288f8004bf8a4a829058646768d208880401a706de0b95113318711a1275f205cd4c9e100ec03a01b95e6c69ce5990015d7944c67a03b5f051cbe5c04b260ccf1d4459212c0070a1aeebcb46da8a62c6240820c54d20b972e7cd0a080022556230425f18d3943166d61c01765c596768ce68ac38a83cfbe1426d61a55c888031f2062a5555eb40c3dd0448f87ba0509253554b41b2d1c6c1163c426858f4bd33ac0a94a6d1e0502a0080433195bb46a117f5295b2e1805a1d361e4d6b47912d4267e2d4315560085302cb710b0e3a247a084450e42604049d401d216cae38c06920c3044f1acc812093c09a6947dcd50e08626c754da000914c164e95ed98f3c90f9d2b937a37ac6c294ae9ba13c3c3194715160835196c557fd20e20b5894b185624aa1a65b43a3c498552a2644098238582a459bfd6708800454100581e6d6982690f882c23765e54d6a91b9b10d0e4872d2940bf4e275d580ea4de7837607a1cc11307813a2d26303b2242850e1f5b6702604a1374f32d08af90c90aa2e5501bd1861b091e18b6eaf2724b38c8f50064266e229179632246ea28875388dc055b0b3591a8a80979ac19c0810489ac08684e254e0615a0c893f500b3b56a6c28b4a80527301f7e901c07b0705728d21a107b9420825d077a64c2824a91a355546a601190bb908b976c5221a4024b4a76f870b48185af2dd74357b260c79d2d2728e8f00404052d32543c21b911c60aaf4695fa020acbc4044a24a5689d04e0ababd62d3ba5e10d1a4e545ab5fa737c14194bf2008ed4071d8c48d019d22a00120e8ca0a20946a7d28787c1a90330b45a621424c702159f48c969e842522ac400ade8b757cc6b01a7d2948703cca8d0e4b62a431361c2201f96c2e0f8d8ce4c0a75e98b1334070ff6a421920dd01a43a501ba07960c25bd381b82e97b2279a850172310a33467581b222d19d42798d1db4408941e33344414d6385999d4adbc698dd0c3838e860e176b24c4e0c9e0e2cedc168f14491ea088d3e6d7c8106a69dbe4a76724470a40a437582d286018015c34c5810c6246b5fac4800e0d87d416495047d08aa183213743383988f361888741a6c41d9e5b4f841a86510ca48c4ac4e550202c0384c9339c20df2630c341951d6995aac55d13063a989c849cae4c91a091dc8a8234476c7e228290384202cf292e34210194aa5421ae46969b95ca29390eb06d406d4a35844087000e5afe508093c080e4068f30142c91406645883ea91c0c9d06f8b60231f2ae43166264b9645b13525c447c496b4cb40c61b2c6e14197ccc62e3b11801b09147c28f18043403820c8a32759a330985033c77e645601560289a298a1f3a92ecd1d0a385fd3930f1bea18dc6df2192b6f8e56393e41b04b20de90ac610ac2c05168e8cf1c15eeab030b0e85b3b680184f110cb901a7c51100226990200039314664987180920902caa54f8a3e8c91b2522001c19429352ee012f58153039fa6b788895386b670b072583460f91868000a8aa018a7452551804c5d2089802b651e50dd71e050250b37be4c9162810524cc8acf47a32eb24284383d1d36fc270290e9a2e54013b40bc304e21a117262a07a5848c0039b272107602192a0b5498da2c6c20cd5e72ba542858c3e25dabc21e2008a33373f5a35ec0a2c08f14645870f6130e491e67a6cb1a1a0ea8e261d619462426f6ebe2bb5de9a254032a85045c69017b9465931c028cae088ced161452a0bac929c42e30002adc1560506702839a1c027e4c4bd6507d7965f0f8611b614741c28040ad299305b8e22a890e1066c890232535aa889c240130f45cb5a073bcf16396a72d4b4d0249eee84e2234684213546c2f811411c434ecc68e80c709245290615320fc879c0957207c6ab4c8d0e874720d80b5996b25ec4a93128b532824b44054c47a86489948543f0cb878ba317314b786151582b265f30b0f0704828e30e260e64584a08f1e111881105127c8cec402317c20d4b171015bfbb25883cd930056e3956292f47b52e4fe8e02ac529d1c581524d36bc51b2214c03502f5070a014ca415b910e0497335d9abcf07a24e7cb864e81c84051825584d31fa3a14826145daa49e931f1a8d1061270a92c31456f927c8861009d29c0a00f9d2c3000d205240f9889e572fc2e8013868535496d93842c099b586ddda0b00794021ab0580913341477c8af02136aad0d8fba0f2d8e84ecb002e3e323888414246c2890e533330c91e5e5012c6ca294c073caeec797861e841259940cb0070b1c03bc0e68e0062a0f5622806285c665b3cacb9629114ede187d2c925c017a01300c614411a401e8b841d37a62a6023aa586304c0090e4821d3237246d819a72477e03c3462836b3db8ca8e8d66b600b8700d417962b86f89422e2624eb526f89ea33475f6fc10334054b06d489fad3455342ac0956013e9428e4f77f29737bda287064ec8c10225c2992adc90d8a50532402151a847983df6841cad22042e70f9d3c18014412e4cf82a748894830426a85246aa67e147d9152807ab3e1bcab664f8c1c32e43cf015507a022c5aa08224311070af86975d0eadd8998130a810a5c37c4b475473844e08023e0c418ba3652c08a13305d51189595259f04291000694720f38305889cb1e320a48ad61a2a3622b0481ac2c408c9005c082f6c0162e66039116411908798340ed26491b044968123e4cecd981f62caa419e36483a702d024020181864869389eb065a83004a1a9c81b2f130d2e5328f5284938806109d69b1ea30812d12812e989193d0d084a3367830ead0891ca50589a514e195278ad9000916ec9e8313a5540261fea920b1054a1c00a4054dd09c99148a261b09130010bf06848f4c949991258226000e328c1080561693e1cd9d466ad5ee5805987381997e2107af32d2a1e9ae160c79942521c49a9dbe41a698051a1d57f4167c69ef4508a86c988e60192a200c4b2c49abe88f071f141aeca16df9c91134b4488d99214d931f1e1f91146cb0f0c47b8e9028545095ce1a1c16bab8987338f1c20928128828c7812d812c7a7e8b5d2dad262ca882a1669ace089a0ed431e2db148de458f31759e3052258116320074da8a3245d5942815cad48352c9ddc217a69e96ad2d15d810b4e9b7d8224624020b0c19f878b254a05445202600ef02394146568750ef007550d8b911c524a382a6c2a447bdf5c8056e3ee2b4a920f0da2221c2843319c8305930d721e80095969c2b43312cb47578f312e682921d08b9a4113cb10f53c88840936410031bcc4870f3494086688c1c445984deba187123480146324e427d94cce81cf2a0417209c7b1ce1908562ccc33995c84e854c5cc87934389ad12410cb160008229596e5bce30e0c5800d665cfde50183145b1c4e905109f400c703171063bc1074e4540421ce2cb65d32caca0a265c201de55237b020607365490e051794596108322871e0b08180385e0e58cdb380113c4d4238820004881f9ffe900af3d3e90f00748a19ca953258445cd523f90e7aa7c6883ce486494b364450944aadc5a621736bd4787102d148820f861cb041013c708c002b72e0123100f0b1ba3476810d1d9298b0fa206a4fdc5a0d0d42b860fda8732cba1664be3eb519e1e94388b20d5b317c1b1e58b0e09e80c463f655910054b18ee1261ed455c6611319112d546478546832e9c60578d0374a23b2480f460190486103f7e6072704383992208e93cfebee76c0901c506a3dec662899e1689416ee48ca1431315e951035506293a6b4365b8a0ea5f95a0c3937ae62d89e122548bd3f43c074bd01f5a60e9805927449e1695386522298a09350e8c8d48477a2419da608b6546ce2118095dc54084f646f14b002464b4f4e9498393d84380cf026c1cd0f209882198c4343576b2cd861e7c4a1ad2d1d20ee3a5411b4ea8f860ad8f9e4438229c5e54804aae32a948b1d40ad1028391152018a4256056cc4020853cac71047936604d9634a100755716a899c146f883864a5cc24b01eaa44b46d4694112bd8737cee2482bb5bc02ecbc821b510d70905c03c6a34c28aa1221338c443c62e6873d691608190972a565e2d041020d60f4842b80ccd5891df05510526cb421e3a01e6d61cb5c252a0cbd09a9e061b1840f1a2e8870414041ed5ddac48d03900a1400ea9c2283a15a00480c3b0678d8340585b68081134585a758a035c13474e2e71d940567656e8c3963df70e9a4d1a18972320b01a6d5d30e60f9b052868b001f8321883952281299334dd607375e34f942d47c4bcd04067ce1c2da0a80d576f52944c7602e9831c93c051e7d3873f1f0260b568559b283e04f69cba3ba014155533ceb42a8300ca514349bc1d517a536767c6d72a832315583ce08990080a162e56b4a410202412853c407c70bf227520f0f380004704309cc1a0516aa5a961a984a3fbed0d24b001b66ea0387ac86253800169173875b9e0a2aa14cab8a1f74946a536529acc80bb2e15f0e94a1a155a27764082548aae0c9e381f8a9cc993e563ab072b0583f9428a17f092185f1a48377a4afe74a0857c75384a02f59331e1849b01cdfd05d0a43a2220b949e0a8cb21380f3a2c9202434e035c9b16982393f60b60128c1e005aa030e0a0ed45d00319b00646a7b40c5f4344397881a4810e2e52e520a003264a1dda2f9f1e643131014885bd7f80d9b1414492259b2288a98082ca8804c316136397ac38b9a86f62929dad347793e21534231cc0b87d09295e3131e22d518a4378b65c0a3168aee3a5021e3b0d9a3f14f091804c52560b17e81f41a6921492708cd48e22448843852901e0c75167583c81d4a60028162b426090c3d666a3f65170b3808c8a3614038b902238555ab34267d45cb4da1223e2c2062066932850406bd50c928a580431cc2c0291a386565e97034819e19c285abab429c1baa18548484815d826dfe348f2dce03484cae1e2cf057647ff227a24e46992e0c31ab4572acf95b83b4cc6d4c8188019e3ebd42a46161a2d6a303ad5a5088dcc6cd6f0f98010e301850d135278831c551a20e2a15589298a03158fd6a8c0a0c06de784926f48903548805a682ab48a9634e784ce212d4a3ac44431652118444f026e6344798887b8d4100aa767a74b8a53330383f678f16920b2a3951b3538bce2182c035177444b0759c7a7001abdb0427176de3035e2da8ad365c526d2090e0dc80466841048f8ea19a04a87026faae46d40656072e544013d1924a18a83ea431d9f03b416355713d8a5d8c23a05c6d4254c8ed812e8198c081b9deac9700089960bb6835191885460a04892ad0c3b1265e2e33641503d83ec39884053b043dd114a2a4c087044cb24cc000107309588465c8e2a10653ee2b2e34f0709262a0ab2306179a0c35108257ef2bc6c651028a0020e93f4083245c14cd78d02c21829e5981d115a29548dba20e58028729a40b9552d3291455c01844dd3219116b30154821e00c00687332739ccde826543825030de61f45586c0c1869496d08503ea587beb8281eac54ac566839a0740cda3e54d29555f1520d940e71108f2cef0aa13111026aabbb70408325030093709e27d922bc85a03468da504d2053f531ef043540d0b8cd1f85466435714ac1ea7b28e94ae3e146160cddc021f48c1c172e1b661a3869f58cc0b0d637eb036b8614543b06b5917821f1d22093a68e85200020cd06838602048cb51203f31f0c3ef8a88c4839a17667624a5ddf5d0d3fad690986e2a31e83a956a82c1100c2d311ab424002165edf220d31bba37043848a2e0614b2c9762d0e0eccb07255d6dbef810f9c64288d81081a536710f460e0c8fd0915a54be99499172d8d0b376964810991fa7ad537c7a57da48959ebc2406770488837b0e60e121e78645ee0d4497a5b75435bc6861586566ea4c0bf50c267c8b1305c3dfd6db05049c0c5428c2c02429118c5121d4e8e54126512271860100501c2778d0911090814a171a353ccd5080ee1407210c2265f274a0d3400d1b3326d840a47618b9114c84a2e7fbd369cda6479658c4fdf0d93d50e447060d69991a11208a648878a38106188571a083873e51d814303643c8d91b1932ce9cb08980df1c10d787813293223db023c4169b4b595ddcd875908e40508386109e458ad85ce090648b025c943184aeb85de0b504c9235f0833c1285e07a4e5a9e04c9e5482b982a3ac1317d88884c13e05044d03bd07a5410f368cb2c0ee0d2083942446135c4489c3030104281f311ad90911aa8aa0438ae04c80a609d69c0a7502a5b268e4d1538967ab4d6a6c80d99cd4a9809402051b0e0c285cad590322ec12312bcf02eba9b8100c10fdd17005cb6c01ae2f1ac108eed4b8ff04b5ac85d0e0e8aa4dcbe3ced6093618ee547cc294f9f0c4088724bfb9201c2c596c744239b9e07b74b2bdc90872a9590d7d8b68d041d390b66a4c570817901304206878e10900491e2ab5a040aa4420534422134990ca7c5ae41b9a386117c7c54602b2b1c9dc9c1c065a8254c0a10176a43e15a48a273f63611a78702de8a2e60e538c031e4065064e15093f1f832e644e9e44716340a1ad41a5053f435a664806002b6f1c39f484f111866783d8d695327552f9b8208ad41a42900809bb58e8755952c58234b41a58d6ec38112402b82b430212d8e11191834d0b0256387237f01cd08102001a407306c5926601201072de78017bafa3df4438c4cb141037484d01d54152863319ac3cfdf9a244e57a63af5e60dc3ae0d8c1ca4c1c18737ec01e78c2cb23cc89784301026dc10e63708e6f6d00f92610c95aa00096140b0c842e786a94a6a59399291cfeb848c08da1ac3c6e660801fbfc3635042945a7220581a4e644db8f3a6f849019cb8afba3054d94333c6c5451735b80cd441a0e60715c601d30c30c149d4a678a5812f516e2257b1b76642200859c850138071b21d62539132e6c610b1249082523938e32fc6ce012a642153200e46684c0125b79e4050e882384d8e82c62a396995bb0f06141891cd62dc7c0a2b23560360135fd0e9de1156cb870eac58b46043419d1527a14008e29aa3e2c3a000ba4267a52d0491e21c270ae2d160303bc6caaa1b56544293395bc84f829d380648b923029b65c752a4ec99242d063800f25fe08d1ea8afcf915e420e0c29185543e2c5a8a8075f27518724214059c920ccaa3b56a480447f90a10825113a862ce8475f2008492038ff6e0a9e3c88db088a11912c8f84a0a9c4c38b2728026b0ab1922b0cc40d03a46b1644279297db13356667ec4c664eb11a902f4187016b7c48cdb853e0200c0a317081598391308c0ca11540acdb5c192c8906a0e934b425148bc2a511e94d4656bb6584b9e3e947d95f17137242194d088801eacb668541a0b360d9f945d29f2800b820c3e2280e146ab83162d0590ec8a9ef5de79dd470f01de99f96dc3636d6242dce3c4dace9687b61ddf79e2fd8b40a2b1bef3c42fdbf51f028f37509817bf0c04de79e25c4dc7f511f761616c1d4ef4b76f238beb233ec6a381069d50518572a4908bbc17797e9062a4d52268c8d1241f5b5a6c3ae5a28f152f99584461734fe0c4a78b026a2224106a885a8548a1102825e6864f79a0c59d050aaa98ecf3552474e4b79671421311f314a3ce6e98415000efe3a0c7179c37a73ab4205a5c2d50800266b8c405503b31d22a2d4807084c6a8a83188dab274b4b191d602cf0081313012ce008abca4f23118f3ca638062a18a0c4d78562869ea924d30389180c214f01aa338320530bb6565120791952518285072b617c8c993834c98dc19a728f49a107220a6ffd48f77db2e3775903ef9fd340a27dcfc0f8177115f1afa304a4f72ea37dd92e0b0bab7f5d5effbaba9f4cdb35c2c27e11089c8026f6c5e2b687be2c2c6c4258181007d65f966921902e7a6011c76fd81d37dd6ca41ad5cb11fb6c74b2e1800d4136f0d858d37b7fd07d36ca74626c23bfb3e71aed8dc1231b5dbe383b403a1916e7a293617115c8b04664580d2e64580db97732ac86dac9b01a3406916134a0f44e86e1c74f07a461830cf3d1f8c0890c837b4386c199f5dee17a6498dc7d6f64de8664588eee7b8be07353d47b27c3dcb8f44e86f9dc5cb7069d0c9bc1a577196d9d667095f8fdf34ff4751869e7b2278bc354a8c055dc7da0bf8d9e18dfd9f3d89bbf8d63f9ddcfdfc6b12231b6418c6d10631b346e5b50efbc400af4ce4ba0771ea03fbdf3fcf4e1d33b0f813dbdf3f4e4e9f5d55aef1862f47aef573e35528e42c17874c74e010b7aef3c986e618fba3440a7de3b831b45b7350d646855aaf7de008d98346d597906b5bdf7ab00aae4609bd2a48b9edefbd5134f22bc6e072cd6f4de7969bf00323d39f10455ef9d81961445a0b064d1b3a8f7fea0802ba9ae1a85b172d17be7613a4505c805582eb5bdf7065b8210b4080df1a0d47bbffa160add6220ed79d47bbf6a04a30ae810a0c7a40e161626d6562c8ed97061615c24ee59a815e9fdf865c8b71de3b40c1b85393d77ff3ca7edf23fe789b4989c89922b5c630e16f79fabe919589c2b0e694ffc77f49d7b22fced8e7e58c469d9133d6ea403fe61d1fec5e38ddfb98a63b187e961e060bf3aaef0eabdcb755f9ad7599a60b96ddffe9ff9dbb7fd8ac4fbac0cad48bccfcadc865ef6dfed78e7f54ff6df4d2db76db7de7978ecdcb1538747a7bfe1c974e7d1283f6e0f63f22effc639922cda769c8409a5fcc917122694f87c43ce0e6ef8618bacf75eeaeaabac5f5970f56052ef851c4de99d37e7d78042035dba8fdee30105d4c088d778725ab58a7b41805a77f783644d97755ecdf30fa8ecb0f1c0a4e7e3b07ed055ced5f66d4796386cc48571ed6fb20767b018846860caab0b88d32378717ae71d1001429b6cf7ce83d33bef0dcf80de796ebe98b9353dace91a5778ca2a953ac67ac742fb3b5f31f4765edb244c34deb110371681765ed3402378f0617d7bf2d7d930da97ed3532b31f74b7fde27824c3f3db176fe3b0ed38acd97ceee5e39771fc74267afc3254f6eecb758da66bb517c2fddb56b38bf6dd96e3fea7e56344bbfe32d1aeef17f8fd61e257fb316dd738de46dcff1baea689f2d8c7eb3f7fb3a1a7635a36c618e2f4dc4f13c61feed7d1f7a7a36b5b2da76b1a329a7196e94fb4df7e6daf8939791b6e5cfd35075b824cf8fa6a21d682f4ba93e9ae7cfe69616e375b3eff349224c9093fc83b9906fe39f9031fbc121e4470a0aa500bb1f90f09b5609182acff100894873683490f7081f021c765b2450b32be71d824c51c707094f7debf6cd724182e2709d68214967f4efe9d48f73560e5061c5ad958db5819c982bc93e97e55f4357aa0ab287ae289debba02d264c9026d96204997f7c9e6dafde1d8839003361826c2146caf5ef0dfe3490d3204a83180dd01a9c3558e163a4e3b671153fa6878c5c74dc4deee7e83a5fab5011f4ea2afadbae36868505633cc5c3c2d4b44e4dc3c2d03ab4861a1696d6c9686a8db486fc716358982ae7b6ecaaa6a898dc49aec8c122bec7c2c254d99e6b3431345cacfe695fb6e1a357938d37dc9b58fdd33ed1afdd79357baed16e9b87277ea2afe9629fbffd21eccd6a1a6df61a5d6ca7e55f2db7d7f0ff5f0cfd37b3d7ee7ef2d068c77da25ffb0d87c617f21f0ec770b1f4ce1365b4a3fce55fd3080bbb7fd1888b797da1293e1c1ad78ef51831b6717fdcf8b656d332f022f1269385358da2bfe17e1d8dd7bf78f7b36d38fcff177335bdf68df65dd3c86fbb68f67dd06ff84f1eda677f087b1b4ef664c3216ebcf39a464d834d1ed271dfecc5cc361c8e0d8763f2908e13cbe33139f674e5d41fa3c1f6902cbf7ddb51b6c964b4a36c938989a1290b34a591e3b55de6a2a7d135aaac510e4d6534badbb6cbff1a9a1a798485a1756161317aef0cba8f1025428d7a27c6774508e9785b6343832b5ba3110368634c2dfe75403affedc4dee25f0777c0a0003a7e97b82773df46e77fdccfe9db4ef6ff9e6dfb06ceff46ebc2c28af1af81d3c5319c2efab97a5824d245dcce66817fd9ae81f855aa4060d4fcbf731c86986cd76958581891223f8024d0a8779fe3dd0b7e971226d4b65cfbda1eeb9d27a7bbdd98a4f76e771fa02de0ff4379689fd1a8bf0ffb7ef173ffef323b7bf8c98ec39a8d466dd3bfa13ffa347bcd2da789749a195bd9da0fe8c6e6e6f603fed26898b1a9016d8ca98585795c8e7f6f3fdb867feee77cd1be8b69757faeb68762731eae0dedc7b7d17ebb69d86bb7ecc9644f86e33fbad81e9209f39b9e6dfb6e933dd9bf8db931a7c7ea4f67c3e1b8bda626c622fe35f0397b98dbb65bd1f83ffeddee7ff44372e8ebb1db18c7b69d3d9ceb31fcb6d7fed028db4452f66445239d8dd39e58db4618ff332d7b615e1bc97ffb17786d9ca371f9e71e5f41972489fb0ffb21897ba317defdfca6e1b8f6640d7b7591be4613e2feccdfdfdfbf755dd7755d55555555555555354dd3344dd3344d51144551144551f43ccff33ccff33c4dd4444dd4444dd4444dd4444dd444dff77ddff77ddfd7755dd7755dd775dbb66ddbb66ddb9665599665599665d7755dd7755dd75555555555555555d3344dd3344dd31445511445511445cff33ccff33c4dd3344dd3344df37cdff77ddff77d5fd7755dd7755dd76ddbb66ddbb66d5b966559966559965dd7755dd7755d57555555555555554dd3344dd3344d53144551144551143dcff33ccff33ccdf3755b765553f45423a2f51b3e3870f75711d368bfa6e7eadfd0ffb77fb7117f8ed67d6f7aef570b10716f47da6785f0bb3cc2401cf745e0d0e77e3e7a3a1b27bf5814f11a3264daaec1a6b2b2dc0f07da1bd0ec87032d6d0ccdedf706fcb9d1801b5b8381f6e67139fe6559769e0d9f1b436e08799565d945fedcdadcf5edcdc7f1ceaece98e3778fa25d13e978d0c2391c376cc4d5a001f7e636a36d4d2d4d468c33182f7e666564632a4ab0af5629509018418ad8a0a155ababd9ce8bc73bbeed18ac880fd03bd1be5fd47f08b47360d10874e79cc670e8896fb60d47d682a7e5cf9dab430c28f2b1199ae5f6f00dcfed219edbc33760b1e8c3c2de735dd11b0f0bf3b7d18bdd391e46c4bd1d0bfbfe388e64b54de3741d6d26d7345cf4a421ff3bfa4504303e35a27aef6161c0224e92b73dafb981df2550fe77f4aca260319d7fa230a76f0f5694c000cd950b5ed7d5a37ec500a2ab4163d0f4f0bb94fdbfb1ce70b9ed58854d771dc67b36d6396c9cbf1cc3fe755b765553f4347918781478bc2b0bae509581d4874363ed2bf3a6f71e0c92794ddb65a6745f19b9f75e3ce6be326c59a6abf7ee45867d7d75f9ca38207341276ba27168c724f96bbab66fdc1389f6dd17ced9f76dc46b7be835d734988a14e46d936b7e8dccedb92ef2e7744dcf64eeede18cffdc36f6206bfac39feef8e9bc5e9ca669d401669aa669d4d14592411241e4be82614132fe3c609bacfded8b2fd87e43d8fc10c1824d9e0ea91b94a9100053bc869085cda88d3880678805141e3035903245c823b84b1f14dd91848851c316c3450e4b42889364a8e9033010d26262c1a41bb90861f061d5ab05d59b200b5819a4c30b4a5a902c760fde8c683121485c85aecf1696154154b4b199a78c4a054495851a76705382802430614d2040285c20532234a14b045701901b67c85e7058420110ae240b78f1f100f843141d053816b8693ff098513a924280173f9230d0c46bd262d18fb6449ed6302c927e6c69fa8d407563878f4c491a78f88231c4079c960502c0f0fbf8f1c449d06d63fb7821610511b038283e7c602e989db0291e1f50054db0f3a1763433e5cb8a2a835a1c6f0b692ad080398f2c2c650dc9532347081ec80ee9a0e0ea6e1190b51863c7dc5d97bb393b77e8048346f4fea8b26385e642dde44587dda0302d803e09796337009c81cb1ed4841d90011c9805478a765d89ea9ea8e082a3ae940329c44009a255c7c70f251e3e7c9eba267399400d5a535107f716c206183128752499903669ac1c193b3158652943a15146398958add945e8632462e653a8429c33c618d388529b01148c5a6c9386e07c58e411548083fe6915e76b6014e9c440162fb971d10234721f1cf231638f49140cca905308f5818038334a7047362ead39ba35c0c354a2434250ae081f16b0a7c10d5704672d998a72d421c2796b02e04080146e446b6e2c35a126564c35b9613e10c29451d0e80663756ff932eaad072a567f347410e0811e805015021f8f2ef5884207cf2a2a37e87ad8a8a2e21ccb50a30700684af8e9937cc550b8bd45b52241f18e97092d406ae08a48484f665c989415db8a1d00e9213248c7101b1317021011351cb2dfb4b07dc011e63c3862c5fe79084341c7a5cefeaa25351811a4024fa92ec36513160b8a0ca97bd42bd48448c16e29f5831170fe38f95381c84091c8054e439e2a973411e7346b0891b17922a2236a846dc10118aee2013025959d762828d0b0ca143c05b8821818ca0d4f0012c25268b1d295e219da61cb28e810e001c1aa210fd4d031a131e444e9f2d0bdd96531d555c3a41351c28f1233a2d27870f274e5261160028f38a154b0964c041e43701e68483a30f2412785075d09ee89108c99235a0d49c902a2b05174be89c3a347300eda859d4a6cd8ac19404ff033e7a34d0c38c206e69258b0a7011cc23022bcc0acccce8474bf50bb2acc8270f514e1ab909547c22b268ce222d865cd1dba1062d4192e4f7304f43800c727104de6bca928060010a3d1dc179e20991c98299929b0004b271e5ddcf90f4c09549e37aa660178b4c2042c22658e9b493072944a0a85161f9408047008b9f3df4e87af75aae2f48fc040d23325e8d35f83c4680d0ecff039b431422a9352265fda83aa125b81950d20e0c6aca7520df978279bb56579a93f81e4ded78aca4bf82576a0520d1b642e58c564e2dcbdd83287c6c5386c88db2f939844b1035811bc85448856997a23f8c3a7b76010235471d40a3e90a7e275e04d4a431698f226fe342a615f0028482ab827b824e81604d140dccf509d09809b2651a293001c058cb32153a8b038278042a08ce120e7e9069ee5006609b0966d0418b083d2190d0d9be286ec48f340cddd1dac433b720734c082921ced70d1c08c4b0dc89a1d12c0101f58f258728d8c7260663660726e1290e3d1a2d2d9154c44399595da0308dae2e4baa1e22219f85147214a5b9db0dc72e8b802448747c15c5900cdd49102894ae2121ab51c14e4f0c325c65b029ab0e48002567667c50428396ae420112148998d0b8ce0f81409769003cc0b8e3a388cd89da93241a038d49e9c39d561101b8e1b9638eda1d5743874c3cd980a0c7552dadcb8bb51e6e7c6050b7c776763ab0d4883220502a3a2b0318691259788571e1bf61dda542753c0c64b67a3819a1c3c950b15a748ccebd41f3850e2b4acc210aa0ba74a717221dcc4860988c499352ae0a2e7869db01635148861c2086485550d2a114c7c59d4335423878b16878eac61d528416354d1909c222b001a796828710bf5409083181a332495d210e705271a709ae00e406b53c20aa0207041e060c061e1912027a818e26d12054618529cf8ed4c2a394e6d74b0bde1601b26880b52e14dcc0d1437a47c9bb7084fc6f0e95ae372632446827f071208b72f6eb49bea210a02e528416e7d06211f33ac60e9504345316846f02e021f201ac419287eb49dd22a20550333b8ad4f9b13601b0d2c25249d5031a46dc4af8ea5247cb4b07962a3e3e1d0199f160d6c45d8d2d8d62cadb1a9808672e5adb06657e2713449508b35b22783d660fa22af59507ba42646ad5673d918481080aa536a0c6e7ac9eca9a42502612c53e4e2212d4b5a9ca642862a190964c9989246068e31195c0bc41015034f8c2431661410032d138e0647071a10b4176869670f1ccfccf8b37bd3598b326710602c82e10586f0128cf405ab17835e0cb0e105f08557a79fa95f9f5f13de0f6efd9154cc3a99cd31236226c3ac2c82b235657565636515c81c9189212392b5643c30401211a28fe51192184bd1588984482a1e8098487171c305570f4054efbd4b71907bd57f08b4fb75d7f1f6c0db0b63204e97f3f0e33cde830b0f2ee07759df3fcf7d51c59de3c5eec33205bfcbe3d08cd09a5f9b6b1a6cae69f2cb47c005c108990808d2bfdcbe67699627d897ef9fd3313d2cdefd3ad258ffa227dafd9a80dec92b98f2d8df5e180feabd07c9fbcffdbca67d570c0892b5ff43db868ffebebd5703e0ee53aea8370e2b6f84b92faa38e6678982d9734d830dca71a31b29cc7d911c0ec7c2c21aac58d31dd47150c72ccdf775dff665dff555dff445dff335dfd775ddd665ddd555ddd445ddd335ddb775dbb665dbb555dbb445dbb335db9775d99665d99555d99445d99335d97775d77665d77555d77445d77335d75775d55665d55555d55445d55335d53775d33665d33555d33445d33335d31775d11665d11555d11445d11335d1f774cff664cff554cff444cff334cfd774cdd664cdd554cdd444cdd3344d0e7226ac7d2a03e27617c15907c91ce965015a71d7e0121bc18898b2a1d6268c24c28b0247f60872c0e46c81b73e3fe244a2a0830c06d873d8800881425d4a80d78f5419589cd9218028064e861252e8b81ba1a2829e992493d80d2eb59e4624de04b7a00ceab0894598553ac08254304103b5794a042e32d859b526a3ed6105c7b164dc2c14e9bd0156416a0b63f53ddca53a923f2a60de5202978a43054b8414a6fa2c828382a28596cbe6a523bf6354436eee821a0979e49e2a48135c9a124ce3c3e4768f0803d3f1e0954383bbe9eac291079ddad6440de2b4f018605681db9c5822370fbe2300968d0f2ea168d0d8273480e09553985aed10e541118b222ee8a304ad7aa8508d0c19dad2e0c29c9bf10802f50bb801450d0b313f7c874a25f134e8cba84e1144d0026ed51aa10f3f44b06093a71fd630b8b2204f8929d73028532100a6745dd2c39bbbe00a1f1028b0c266d4461cc0c346688b92584dab184c40a0f080a981942943d0a47ae400826f666103dca50f8a6e075ae109b26900a7139747586ad862b8c8118116af4914033f4c821c414c92a1a60fc093c28042872f5c2c5c89b201130b26ddb8a50c970811a40179a40652d68755af165406d47903616b0c16ac505921ac0cd2e10525ed460732a8865c9e3888e060f7e0cd8816122a45d0a68028104c2a75c8aa42d7670bcb8a2db5486da9188c34f910d1c6669e322a150a0d5ea5424020e2118a0e166ad8c14d0562e2cbd39549c8104a701926ac090408853b8c74015927cb9c56d68bd0842e119c2a5106985b5f474f45b6c319b2171c9650a096a903201f3ad668da9321c9025e7c3cd841a60e8c44573484f254a84747018e05ae0c3aaa1e04a0e68e4fa806b6cc281d4921c06f5494e29f24402b4d24b41868e23569c140140a028488f1a895a7b55e224f6b1896489024b480d3c0514b130a5b9a7e2350ddd861c2a8c248a8ae5368b0b49234f0f0054348121450847cde50dd41e36b5920000c7f4ba305a905832affe6e18993a0dba64600d420b5ab83149e080d125610018b7b6288d40be80d46992d693e3017cc4ed8d88e72781ac3100990161f544113ec7ca4394991e8c2900c10c04a0d53beaca832a8c58a1a01881dea39d883009685341568c0981798b5fac50a0cc8593e58ca1a92a745060893454c5a046c10706cf0407648070557649bdaac8dd9740fcfb080acc5183be68477e2ee0f77ba6a8001310093386acc32790e3e1f2af013892bdd9026cc0bae549d2968ffcda02d1924008435c1a011bd3faa5c84d5e90306482f0f2f049a0b7593971c5a5041999bfbda44a50b87302d803e0931c00d704c924f007cca8564c119b8ec414d94e8c0e6a5c61100a6c82218c0815970a4b822c701048862601191301c12d53d51c1e506210d5d777dce482a602bcb811462a004c90006022582ba12b4332d117e28f1f0e1f114b08a4c8f028a4617243acc65023568adb4241f89a2652281742dc35b081b60c49e706aa3c5ecdc58293d7a6442daa4b172f4862ff95f630a0410658bc12a4b190a894a92a44cdd868df0df6448c46acd2e421f1e0ccc2811b78318c244cfcca7508538e789746606161c51983c6d8d6944a9cd80098150945943c2b6a9111b2db64943703e2b18c853e766808b9854c357010efaa7557c418502a61249498383e50146914e0c64f112a4030b3c990ec8b076446bd10234721f1ce40ce6152451eacab03e638f49140cca3a5286c3c742dad1898a87501f08883393c4cb22af395c02c86a8c68b07169cdd1adc1900b4b1200d1a213099eaf121d12827245bfcc4bbf6105c7e9ea43017b1adc7044c4843965dcb40ace0cadc192a928471da2b54da8a82891cbecc061ad098003014e28a30478c60b1d2e03d48188f1c35305a71a31452d154e2e303b7b36d4849a5831c5a448a93663701c890bc40a8b0f8430651430dae21537c7128fcd971304ab7bcb97516e5424f1694277a9c48ace06567f34741040d2194badc28c90b1f57764a12a043e1e59fa34478b9a1c165a203285a0836715951b741968fcd19ae00b14012b385451718e65a09106021582b8b812661764a129e1a74ff2c1c10194098b0d08458444e0f616d50aa725461845005149859cba0e5e26b400a979fbb2e5810742d24851904006d293191726649a34a0793154fc0364d0dba2a128c89b28c45d58265b00611a830e80f41019a443081613098849d3c2d93090810b0188881a0cb111c1608e04357f449de905f9f5e0c262d1e4005a2e0c0d611f255b7084390f8e58c1704412211e8931758296873014745ceaee449720a89c54af303d4b5640e90992424a85395fe4944c19b1e6a1c1882015784a3260306175c104222b9a16974d582c2832c41e12b31012d35184f1c570a374c19c9612a2e2dad41e521a6a1ed48448c1ee2863b64a5842532004a84b1a46c0f9e3e40f85396e90cc81a028d3134e3e3951d6150bd8093ce922f725d20c16783ec069c853e5922608bf41570e4d295201200d69d6102263f3f4360063e728d2d5151a6b448db02d38092b0ce20c8075766506078207c0945476dab757c40c3a0e6c01a364832a818b40aa147800ec80330af8b0a46911d6143c05b8821800322ac71d1e83e6243182902307284a0523dec8570e082c845a016a0320212c8516ebd6024d2e71a05082d0932c9ea11db68ce207a49aed853da39610820704ab863c5003ecf346c8230e46d0d070a031e444e9f20c4174a315968fab464ab2ecb298eaaaa1424b8f0c872e0cbaaa5b24a2841f256644a575c9019515c3812da3da3878ba72930820010f0a1b18ec0c40fc58c80aa582b564200c1a51a9828d496601451199c8b31b0f6e07121daa14a5948362ad03920e8c7cd049c960a605911e0850c0442c03ed866c508d0a3d24ac3a8e5629c0a03db8274230668ef02e59fad921129aa26c91942c200a1365e7021373a44aeda31819367178f408c601464012115a44bed8ace8d9a9c486cd9a1b271028caa4e690a82684b6fcccf96813e30d04e71a0bb31f5b7517b4e69258b0a7011c32709059c5e08a9b0420f944788159999db1383bb28a8b1d1f06953cfc42edaa300b602e18a908f2c9f220d5f214e1ab9095477173186e6ca1951a50e063c2282e821d161bb7bb8d1b291dba50f97021c4a8335c9ddab4d50112438814d888861e07e0f80482891333aacc1559ee39abcf5414030088c1488c08b03e2ada744d41f5014f904c0ecc92283a2d21eaa065410e1f0d1660e9c4a34beb801f232ddaa8e921f7b1604aa0f2bc51f5e34a65c5c504079c102078b4c2042c2225c53a8200309150c859b581c9213a072c5081c4944d6be2449007d02a2c468e5249a1c08213fea9890e3904b072081108e01072e7f14f6dd0588103c04918870e5feb54b5498a28271394d519696441160c243d53823ee1261a70c26547a21ea1109018adc1e1599e7ad0503340214c9bd0706863845426a58c841f1f8db2087544e0c9da83aa125b619d3337e6e31181695644107063d6538946280a5bd6789c65f1b1a4c32f839b19c78e946d400f50608e167cc9d096e5a5fe04ca01054a8e126a25aca9f7b5a2f2127a3160cc1820201ed9600bd1a1520d1b642e56655af4e5eb82277d8460c910e7eec596b913099a2171a68d08c5ea491980ce80247ed809503626f83cca41b635c4ed9749cc02089ccdc8ea81924ad1450b45d376e254e63f3843d6e7549426317aa7de80a148246d8b44080bd841214c040f2442b4cad419c939f2731426d616175a72326941d2d3c8ad9d00c19522d342e49343e243515f1224813c89ecbcaed64cf0308811aa382a850b88aa648c92b44260a721acec4b8a0e47f113304739b41280a3ca3768dd1340903b36314f7c96ec1445097ec09b94862c28754097356c8af8c8d970a5e14fa312f6057f4ec508855b98bdd85c61ad75486e60e1c9350045c7043b236acc81201117d635aa0b1cea852a357dd6380a1bd6d8944b4ec0f140ea4b492295a3c402ab4c8d275fdc4c69c871c093352942d24c100dc4fd0cd5f924aa4a9d5f8c21e671d3864994e8240045f5310279846975c30211591b32850a8b73a2cb6502b5a9d50f156921a08ce120e7a947012a1cc9a86028958c361c8a468e98f4e088800f04628a63c024c46509b0966d0418b0d52ad35a1f234e8894449cd1d0b0294e08152d35a6b9b6cc52ab0e0fd4dcddc13274a60da936b72a5ce664c9e08006585092231108e4c08d641a50b5e93530e35203b2262d0b9a178a2dbf2aa33a80213eb0e4b132989064eca5b26714c94024ce9db3953fe0c9520216068032a6f6663660726e005d0ac589cba3342d3aaaad1695ceae601a7ed1e4a2025268fc16ae0cacd41e40d05643d30c4457a24cb065e948cf5071910cfccece580fb33bee6c0ebb4569ab13961b8e3ec239616d4fce30a9a135e42ccf98a41f88c82916e0623e11b17c28982b0ba0a978a4e68290171b004e8c1e90a8242ea1497be266810b68847c2903a581810e4e74c8162c9e40a2708755a644a37c5c62bc25a0094b3c268b8515439e2af8f900567667c584278bbc2401c34309021f893438e16245c58a311732b57183e2708003c08a10a4ccc60546ee3655590f4eb5f1f03f44821de400eb72448e1f3b1448b8a9c262839687160897101eaaab60044e4fd098587667aa4c10e796548834119538224d807872e65487416c405340c658ea5143cba30d623e2590014c00432828f461ce89bb1f59589cf6d06a3a1c9a811134a0720b34e88110632a30d4496953cc5261d4933a64f20138a825caa4ba4799a8340187a3af23538c593a3a7902ebeae349536d806f0f6b2145080b7c7767632a9b319864b05d01e0cc8cc3a04881c0a82800a0d3c622003546c0b4598c2cb944bcf2b02950e1825679b6c4018ab8439bea640aa4d53fca9f4a5508561dfc88297de531e6c91504ea5410cc9425839a1c3c950325010b3b4381fca610593d31af537fe03c9980902a9b814d9f3860e8b00a43a82e9c28597ae04fda910a6c4aa56528849bd830c1104e6fb614858e44fd19d30b73ca4e16d7fcd607c88d09eefa6ca1b3c545cf0d3b612ddc100d00482b4a570580560c1346202bab243d4a238480425a81115f04135f16f50c697831828423468a055b3cb86871e8c89a6f4f8b2b441234e850a58ad621562d564817cc555b28908a3218c97c4543728a2c3101b018c062cb454f6e010f9bd630ba0b510848894c5f141cd27441100d6ea11e087208738127107baab4484240219fa4521ae2bcd8b48a09262c68ce764d031f0608e1c44e0f5cc518910f5e84141b261a1ee050ab32a5a304a2519f82ab28a28858686d4a580104c41385134812588042292720c8dc8809ad6987f7e6e7e5578d4f7875cf16f5de3d0df8cdaa775dd8a3b3fff0ccfe93e7e687c2e67a7af99ff05f513555d503786d7ef157d1f574dbd464cdb5f52b9b5f7ba2f03bbbe9fca2adabceed9a5f1ab3abaacef1fc4dd7f46fcc0597c65596e7093c5594a7e6a7b66b9ab6aaea533875d719e5a5f9fd1876e19475597736d3774dd1fc4cf94d637875577345d3d345cbd2059ee9d9aee1005e0dc03bf393e3d7cf6bfaa2ea3fbfe9cfb5f33cddf0ccfc5af7a3718ccab3ccceafebd9b26cf5f0cafc50173d5fd7fdefcc9e2c9bc6647e72fcd778fd311cbf1e4ed759d89ee9c9c2e08df9c13e66e5f3f4ea89baa83ccb769979eee189f9996ddac26eda9aed8fdfd4b77578617eac0cb32b6bbade6cd5d73451d34dc203f38351cfb26aecbeaf5fdf18f6bc2f3fd5b7ad2b9facfbbade95d718e779f9a1ac67637745ddf46dd3ffbaaf8b85d7e5b79af12b7bf96559d95ce3962dcb14e571f9a16c0ab7aec9b2ac7baa5f5d7deecdcab20b6fcbcf6d5b5696db9fce2e7bf20af8c9ae29b3ea9f4f9ffaf955df75c8d3f28bd3f545d1d66d7fdcaea6ccf2b2fc4c547dd7394d5f0f9fa7899ebf2c5fe0b98587e5679edffd2febe3f994d734655fe0894ae111f03bdb3376631fab3e45cf345d51f4ca0f76dfd74465f7cb672c7b7335adfcd6af7ef84d59dfb6e7d9aaebfb8537c0cf8ce7554e51f34de1b475bdc9abf2835f5896e759fef11afb76f5547edfc3f18baef2bcbea80bb7316fcaeffdef475934864f0fc3f1da0ac093f27b57d7c3299ccef2fa59f94c5173092fca2f565378554f7866d737455f14e509f093d5f68ddd6ffe178ed58fca280ae537ab687cb2663cb32ceacefe449ffc4c39f6a87ab626fbaaaddb9a4e7ee8d9c66bec4fd3cb300abb1e459bfc52197dd3949d59f894d1f6fc328a9f3b784c7ea8db9e6a9cbeb0fc4d399ecd253fd355dd574659945d5d9785794a7eadfc53f8fcb27755ffa62f9a9ae125f9bdfec368ebca2fdbba710cab6c78487eab0aaf6c2ca33e56dfd96d659777e4779aed6fe59fbaa7eaffb99e6278467effb3ab3cab673cc76eabb66eca2bf28be1d5bfa96caee8ccc228eb8547e4f7ce6bfa61d7fcabfb5793455bfd52b63d59b94de5777ed9f6ab60ae58fdcc379d3f9a9ae99aae6ebba6ab7eeeea61363ecfd49c7dabaa6a7ac14f5ed9ffbfe9538faa707b9e5bae2cf87d779dd1573e53d975d99f9eee0b3cd50a7eaa8ca272abaeaa2aa7f13bcbaa7ee9a9c6a81bcb66dafa3476592a57a97ef08caeb3c9b6e9abc2efec4d54bf346ddd13756596fd6f8bca28053fd3ff369de79fc6e96c9a667beae755d64d63d87ddf1876cdd474d77000f32b53bf1f7fd6bf697bc66bbafa9315b627ba96fac9ee6aceb3eae3793e7d9caa29a9df7cbe712c7fd97c4f566dbb1af58b53f44dd355765bf6fdafbbeab812f5fbade953156d4ff5fcf19ab269a89fcb7ef4fcb3ff73bc7aafbe2aa8df8c7e37fda6299febacb2333bc1cff5ac4fdb76fde9fa9a6d6b7efac1aacaba2c2cb7712bcb2bfb534f3f3695dfd5b3eb8bfe754e6157d8ae6da75f1cbfec9ac22e8aaaf3eaaea7043f59555d579ee3ef51d934dd97d32ff629daba722b7bf5b7f0dff433cd759e51b39d53337d5717d6f49b65f8855d977de339d36f75fddab62ccac63e5ed973667385e9b7b232fc5b15fd731cb75f362ffd5ad6bfff35e5f78c637486554bbf788557b37dd313fe2d9a72c9ad91ebdf46dc1ec65c706be402ba689fab087eace9cd793de5b4d2cf3c7faab6ac8acea9ba9e5e5e7345e9f75b733dcdb75dd7f63ce73315b667eade7911821f2aab2e3ab7b06fe1ef53d74ffab93f6de3f7447dfcceb13ccfeafbc0ef45d114655d595e5798357dfa4afabdac09a7a70bab6f8abe2f2aab6aa49f8f5dd99551736e4d34f6f05c9679a9bec033ff38ee5735cb95033f3f9f1e8e61544e7fabb62f5a96e6093cdd3157907eaa4767f6fd291bb72afb9ef10b3cdd30578f7e6c1aa7bf85d9dffad64c65394d1dfd5af49fea9cb627fae3165d55e0f9a60dfc4e143de1ef7ef4cfa789a66d59a656ae1afde018f59f55dff7943d2a7fb82c53463f5636657446d1378dcf59657f9a2efaa1b2abbe9e9dd9d73c6716fdaf01570cfcdcd83ce3f7655dd485cfd394f1b2344fe099bab952f463e13566bfcbc6eee9bff94db6b75dc301acaf12fd5a3736dd34fd1e465f7475d5057ee93cbb32aaa6aacb7a7545dfb24ccd13789a279ae60ad14f8561797ebf2bb76dfbb6672c6cb9dad2b8ca1265efbc9806af0efd54d66ccd794ecdbfc270eb57626ca32c55770d07b0eecad00f9dcff49de7f8c3b20cbbc29cb653dbf34dcf423ff9fca89ca2acfc617386db3f8c7f1df03d57f75cc3017c7145e837c32dcb7a15fd2decc6e89c0efab1e66afef6756339564f15f5aa2ae887b66edb9ee92aab710a3cd340bf559dd15935633485d3d75dff70e8b9e0d2b8ca12ad2bcbf3049e681d7a96b952e007c366fbdbb98d51544d638f0adbd3cedf047efe3465d64461934d51359eab81c4f8ce448b2bba8603787605e887cef3fbc6a89765146d61d544affefc3eea619455bf67d7f4754f3fbff3bf5ef6eeecdff8654db9cfef3d3ffb9e6afbc2f2f9591fb3956559bac09325c677ee952b3ebf3535e7ffa2a9f9baf2cc9a6a59b27565f9024fb60ee57285c00f75cf0fb3e8ffeebbe7f7ddd66c5fd4345f179d5bd3855b5b22577a7e683aff553e5f934d67f36c81a790ab3c3ffffeb47dd1f59c5bd4a37e7e9b7485e7c7aae7ebd1944567b56de1532e4bf5049e9daeeefce2b7fd3efd327ac6b2abc6719b1b17195719d718575b9a6abcb2f38353d874df186ed17885d3d6acf383618fbaab4751d5d3f9c129fad31fbfecf7f25fd359462bcbb27c81a779bee81a0ee0d59bab393ff4645fd5cb1e7ecd199571da3df1219d1b5b5cc9f9c52f8ab22eead9b57d4f739ecdf3cacb559cdf9a9e1e3de3347e4f1655bfdb9e8aae0ef8a168ecb2efc9b631dbaea6fcaa2b3e2c12e915ceaf6de55596e31365e1d87f6fbef9a97f4563bffe977dbd876558d89e40bb5fb3a730f76daa30f745f598a3e6b98603487665c02ff5f20a7f577dd3b47dfd1b0bdbd39eeb970b0e0657f1085796c0133d81a7dbe8cacdeff4eeaac233ec9ef3dbcaea5b96c0b23ccf351cc02b28576d7e2c0c7b5385d7f8cbfe9de7380d72c5e637b7ebeaa62cdaa6b1875ff9aff9fdf975bf2cff79764ff69f5ecd2f45df3546e7ff579765d7994df3fb272aa36cbab2683b9f2ecc0adbf3bd2a7285e637bfecbba6a78ba62d2ba7aa477d5c9df9adab6cbea8ba9affc768aaa6b899df97dd545ee31fcb1f765bf72df343e5797e4fbfc22beca2eac992f9c5de9cfdeb3feb5dd6c7b12c6ccff37835e6e75f9835d35985d3f3c3b09785ed99feb812f333555546e3d47dd557f5b03b0bdbd34cefaec2fc7ebaaae6ccbaefdac2adb9b6c2f63c51fb0accef6c65b565cf147561f7546356d89e5f7ede84bd89ca2c7aca70eb5d57d89e2b8a5f79f9a171fbdbf5f5ec4f55339e6dbbcbcfafb02ccfa6eb3d3baba93bbce2f24be5365553f85de5187ee31516b6e74bbcdaf2f31e664ff5cbb22cc7726cc67305fc7efb7ab485cd0fabf28a7a1367795c69f9995f56e71696d1384d61f76dff8ddbc2f6544ff5a4bbcaf27b5b73f6af2bff7546d9577eb1fc7efbfef79d51747567364d4d027eecec59384edbd66dd1f4cbf095dfdbceef7f7daac2f1dbbaee09e3caca2f964fb8455ff47ff34dbf390ff0f3aec9ca293cb3308bb6f17a56f99966aac6ec9ab2669b9e711b0bdb33bda2f27bd1b54d65754ed7f9fd2b1a0bdbd345e06aca6f355d14765d177dd1d7bb6fbbae77aea4fc5035f51f5e67b98de1734653617bff2f8c7d59599699ad7ae74506aaaea2fce0cfc6f2ec5d385e5defe554809fdcb6a98fdd533e55785edff30acaaf55637786dfd59565566ee7f5c9ef9be9fa9aa78c7e75fd71eacd13c795931fcbb2adebba323cc3a937d9153d2b4b2eb8b4b23cdb3b2f5e35f9a1f3f9caaa4fdbd77bd3afa6b03d87431fabf50bf4bc62f293d9f7bbf1bbbe72ecd70fcfe919d3c3b7b5b22c4b563d4ff6be5af2fb7f865dd774cdd7f4b13ba7c2f65c6b3f6cfbb2bde6c272bb8603985e29f9cd73eacd5796553fb7b2cca6c2f664b9e060709565fc65b834aeb22c81c0d3547295e4779ab19aa2f2fbd3765ed5af0adb33ff73e99910f7c21f9d2b243f739de319f65f9e5918465555d89eed5959c26e655c675c655c6f5c70695c649fbee14a22f0e71e3dd77000afc45c1df9b56c8c9e6bbaa69f6d5734f5c2f62ccbf8d71dbf0c21eecfcab8c8ccd4ca1296815c70695cc09a6ed9f3ce8b5785ae8cc4f685ab223f38f56d2bbfec77e5f5954fd4444df44cd770008557447ef27baa2b3cafebfca2703c9fc2f604dab22b37e4e76739f6ed39a7be75e10fa7c2f664cf59c8ef7fd98c5b7736ffea9eee9f93fffd892b6a07f9b96f2acfe77fcd583dfdd9c2c2f61cfa9fe340baa1115e4f2e381876d95c4dbfe897ed5afd407e671cfff65457364e4f177d5d617bd6d10167ff8740f5e482835143c6ec7f5a19576e542bcbfbd3dd9e387fb72fdb6b67e58aaee7c943f4e307aff3cac6ea8fd5565d5f5815b6a71107c6e9b9d6f6b0ac2c6b709571c9e0824be32acba227966559b2ef1a0ee055141fbff7c3abfb9efe4c636fbaad491f7f6c6a9ae92b9f266a7af4544ff78d68df2fcab22cff6db344639dd277bfd5b7ad9759987de1bb7f767f3b3b6d87dd0ff6727c9aec4fcfb56d7fbcaa2c5cf79b3d2cbfed9bb2f3673d6bf7ebf4fe6f77fe769eed9de3e96bfc996b0bff987ddd33f62cb0fec3f63c16ed78e5925723171c17bc1ab95ef4e73f785e7d0a9feafbc6ef97dff40cffb5fff4b1d9a2702cc72b7cce5ef8e2feb9f0ea573fa3aaabbaafabba5c7030b8ee64342eb834ae3f577bb7b2fc73b5bfcb122fda67bb860328f7f8cd6ccabeecd9caa78baeb3bc02dff3cef1b5f843531435e5196565b675df175ddfd6fe99eac9cea91bc7ee0a7b3486cf3bc7d3fa37aff399be296aaaadebc26b2a6ccffcee03e78cf09781ecc9050783ebf642146f6f2f8cd537e22f65e1179e573456d5394ed533c7d5351cc0dff0f7cab06c7e597efd6fe1373587b60d9fd1fdda73fdfe54e554456156555923f0e3b72faaa7cae337a3ad9f5b18855b36f5b319bbe84934d62990fecdf0bc7af8a3f1f9a2b0fc9ec2f65c739c4e7b85bf17feb2ea59d53d63afaee7ffc3a211ce9cfba96fbba2f35f5b7475513676d373fec9ea7ab2f367ddf88455b5fdbf9fb63f6de7396ee17fb2694ccb3ff77c55588dbf397f7676bdf9f3a297c764df56962ebb86033817ffda1645e12fcbef9fe5f7fbe1a7e7f5ed3cf1fbbb39716601ffd6184665d9fc2efbc2ab9ba6c2f674e7dcf8e279ecde399ea6fee7a63e65bd6f67757661f98585ed0934d3b1e00f56e55666cff54d617955d155d89e40141d0e7facbec05fba9eff4cbf1bc32babceeecaaee100ead8f163e7754e5539354ff784d9f42dcbe1f0c726bb86037843eef75df69ff24fe7b9fdff6c4dd4858e9f29cfef97db3fa32ffb4f753575e448d1f2a7be2afa519365ff8fdf34763d8edff7feb76ceca6ea39bf72ac7e1f344ea32cedfbfba8edba2c89c6fac6cf45ffd9a2f129bb287cceab8b8fbd366cfc52d75c55754de33345d7d3345535eef755f55dbd7bae69fcbaa629bf70e38251e387ba71fc4ff8744ff8b3aaecdf15347e2a0b9ffe4555d4cfb1f95f54d89eb22fa625dcef3d531736d9366dd1f89b3f96ebaf92bdfdceffe5398ddf1895db765d51617ba22fdc7e26dbae2e8bb66dfbaea7cac6c2f61cfa7beefb227ade3f7ff1e6c4397567fcfcaac6b2daa2e9bca2edfba6c2f65459233027ce6ddbef8c65b535d7b6f5673cfb7715b627db4f6de3176d59d87dd378765157d89ef51f0259745dcdd67ea6cab2e9fc7dea4f786d6756d89e320dfcc5637eacc7caf2587b38365dc301fca90181396ebc7d69bf16f6a81caf668abe736ab2b3b03d7f5cdbef8f6bb6fa05ebe2453b95f1f3709aa6a80cb3f069aea80b9f668c9f19bf27dc9ea7ffdf455b154e51b45f1ba767eb9ef16caaeb5f3d1ad3b9cf71f43ccf7e1e5565b55dffecc2edccc6eaebc2f8cdab29bba7775b8f7e383665617bca76d88b5fdba6efe99aefcb9eeb1cb3ae6cff7eeae965173ee13935dff9c3e8699afd7cabceb1bbb2ab6aa2f1ea4f617ba668d9ef7b39fd661bbf2f6a7aefbee87992fddcd75c4fd754e53446d3d45c85edb97e8dfdcef7f5a97fbf2bb328ebd553d89e45fb96cdd7c5ef34d3af7a3945e7b89dbffa0adb735824d240f9df5e88bb671bc08f9d613fc366bcae6f0bab306ce728ba42ecf7c2a8ca7ad6ab5e955d157685ed99df36ec0168f1f3a7ebbe3f46bd0bc3e89f5921de9e2c8bdf6f5173565bd33ce734fee8296ccf5fdbc31858ffba0fb489f65d3cd1750d07306cc58f8565f4fb373567545ebf5785ede9fedb2ebb7d0d18554f760d07b00dfbc9ad8f5f73665f1975ff4ffd3cdbc09c1e16f137edfd995e9ed75685e5b73553185dd1dc5fcab6b3fff189be2eaacae69c9e2c7bc6bf2e456b7fb0ebb629cbb2ac0bbfa60b97e5cbaee100c2eccf8cd119f6a8eca6e809af2ebce6c4395d7f2e0baf5e45d559f672dac6a6b03d85b8b108bced19c89e69eaef3461d9bb6aacc6af89ae5e16b6e7ed85b17902d31faac62aec9aeba9bee779fa54d89e778e03df9fd3775c5996a5bbaee100caa1bfb7f5f19b9aef9ac6b00caf7ece087fdca7eb1a0ea0dbf99b4ff3ff194d3d6ca2f089c2c2f604a6673e34e2ff6651f3e7e79565e5f68dd9375de7d80bdb7335a1e237bb26eafed535d9198ed15315b627103dd99c38a76cf9fbb2fcaee82ac3e62bcbae7b0adbd3cebee780270af683d5787d4fd68d4fb73dd7cf0adb53aebd2d9f68cb0507836b8cab8c0b8e0b2e8d2bfe35ecbcdb7be3ebb7a6272bc326fcfed484e3b8956bdaae36da35d03dc352fc7caab272dbb2ed6a7a189ecf940b0e06179a1a6f7b2ecb9c38975c266ae41a168934175c1a17105d8b443a251aeb3427ce298ce227cfde653deabeaa69a6ac6c0adb3327cec0b99aa67bff6dc7ea1a0ea0e9f54bd53fc7aaf95b177d3faacac2f604b667bbaee100ba5d44db060ee51b089470e206e2c61b08dc327102ede19c3dec5082e42201400a34499c18d1457689f80a7102048a0fa607afad131df00e1cb636d0c51e1e0e6d141a64ffef2dadbb5f6738817fae43d6897fc0eaf2a145123d0f18ce0f174a5840e59fdf7d14154ee0177ea030e746208809314e13494840239c400020a0443b06fe1b083ce9d8152dc61f07b60f423870d1936ca0b2c03bdb2e07c1003857d342dc0b49de87ab134804de76eee3fcee87e83e2f3d5656ae3ed1d70d7aac0ae1a0d0054d1235d67911f4ceabd43b8f52ef3c087ae74dea9df740ef3c49bdf322f5ce73a0771ea4de798f7ae739ea9dd740efbc46bdf318f5ce5bd43b8f015ea2de790bf4ce43d43bef50ef3c43bc371e120a5d90a44f63570fc67c7a24759f9e02ba4fcf8d17224cf40daf4f0f59f7e5b9a0fbf2f8e9be3c62ba2fcf5df7e571ebbe3c69f7e5f9d07d784e751f1e3ddd87874b84b6ce22abfb003de8be3f1474df1f4fddf72753f7fd71a0fbfe20eabe3f7ebaefcf9ceefb53c64205df1a54dd67e877df1a50117aa5a3de2b15f55e69c841061168dd274245ef9d46ba4f8487ee1311c11701abfb22f0ba0f02a8ee830041f74150a0fb20d8e93e085bba0f0291ee83c0a3f7a034e83e0839ba0fc259f74150bb0f4257f741e0d07d10aebaef81a85ecf82870d157c50cade83d2d57b503cf4de2ff45819e93d5677efb1927b8f139cdee364a6f73845e93d4e407a8f535def719a7b8f935cef718aeb3d4e69147a0f12a0d07b8052f51ea04ebd078852ef017a042881de036440ef01ead27b80a0f41ea01fbd0768d87b8074f4de316061a05081422f4894de0b72a4fb1285e8bd203e7a2f88dd7b41e682d8b8f2213041f721e0a8fb1040a06f4080acfb10d8d07d7b22e8be3d78ba6f0f98eedb43a4fbf6cc75df1eb3fbf660e83e3d15a43841b65a367ae98bb443efa1ad7a0fe5d47be8a5de431f755f220abd8726d07ba89dde43ddf41e9aa5f7d025bd871e7b0fad7b0f957b0f8deb3d3446efa12c7a0f6d7b0f15d17ba885de431df4de5941ef9da1306c39a8e0a360c10116852b79ef5df1bd77e5adf7aec0e8bdb4edbd2b2c7aef4a89debbc2a1f7ae3ce83d2ba57acf0a04bd770917306cc0d23a7275a9f7ab017abf2aebbd977a63d02002031e0308bc07101e507830c237e2ecfd9cd1cf9e1a14bda786ec3d3559bda7a641efa529d57b692ef55e9a47bd970650efa5a1d37b69c0f45e9a23bd97e647efa531f65e9ab9de4b53a3f7d2a0f55e9a16bd9706acf7d288e8bd34bdde4bf3a0f7d05cd07b6848f51e9a4ebd1704d87b682061e865d010a1f70b167a0fc38408602a54c8da1a0ad07b4320bd372cf6ded0f7de70adf78667ef0d37f4de300218f7ea8d03072e7a6760f6decd96c01032a433418bc0c5172fbd735972d6939ce5fda6d5c87c4d932b50b20459ff61fd87aba5432d2830d5db7403cedeb54ce9526af4b600221083dfe51086e9086611cc8c4450571344da73a507bfb58891451f03ed7ebdc00350775faec77aef6e947ae9599e60f1af1b0e3d51cef0be7fb13d1c8ed573f4d07f1f349e1beda34f630361c77dff82643d61128afa88fb26d989efb129be495df6a5de7b044b7daea681431f42157e97454f746db436581bab0dd5466a03b571daf8f73f4353f674d5a3bfef31f9d7f4fce59a464de77f383492fddb2eab693bce69329906128dbf383bb663db4dae7f8eff384ff4b8518610f7c2fbc301a443a8345129d6919a041942c81802836a0600200163110030382c1c8ec7c331d16c4e8f0114800264a672a6521b0ad424c9614a31640c013000006040004064460d4020604c91dbf556b4b72c5800ede52ccb3cd7fe5f4fecb7b817f064571880e895de38ebd1c3aaf8fda00b8259e2fdcf546cdbd14b7269be90639433ad79fa32ec7ed15b5e4aac1f16d6893d0665c2e8922e21e329219760ec4cc72c86b14f899418c0cfd0e069a89ecc1bb087bc3a9a66a7037b1eef3ae29b4f0b21880154a6b34a234d9968590eaf5dd2a0a83cf93f5d500f605f95fb4584ebe45ab25a5c6db3a16802fc6cd2b14b2ed2a92885906f68063c137172fa448b154e5a9db2babe411cc01d5e809f2b013c354d7d38364f4c9abb29bdef73ccbff449b4b15969a13c75bfb31f1932f53e6ee74ad9abc03762ef80c59aa77ff2633a7599de53d23f7508c099880f36f37891ea9584fef6659c8d05c18ec9e7a3fc03a5a845b08ab49afeb37f52637c4b4854294339fe6ff15b4a58d13684bdab74dafa5d11b9e01ee23d5647215b881fc4a86307b5c0a2d0fbce0e924ed7458ab790a267ff7fe1a68d392084a51ddab31396ae6224287b8bec46e13e2365feac664b752bd5e70e854bbf70ba43431f00f573ea85bb9c43f21fc99bccf19e4eff3eb3830c4e9f5e18bd2fec502adf4a3ce8c5b9757f4a05c03d5b54c41c41aa45f2da8d65c2aab437c1cc5c0bcf48cf0a82016b8e4c31c3e6860a8abe5952c510def5b9ec3a81628189ec61e01c6802afc365ed7ad8ccacf684b79c0bbfff5509a5eb261ff14acf7d906e895971a3dc583d35524aefb4a648b51c456f295055bd9436dfada4a23745001c8aa3180b9c6e16582c5f966890ca1fd5cce849458f046831a1fe3d9a79507f6d9eaa6e20e9cf920673332a7e992a8862761db8d1c11cfdc5cb0c0b1030a94752ac681ae5f6a41b5c73d3b82d921e5f2a248d7586a37f3e38119424ee7d102237205cdbf1a08dbca83be26705c2a2f330ecc3d065c232a8186123b6ebbece41cf45f47866a6f5185cf235450304faa8136d0322c27f5adc47ad0cbdf7a32556dc37c00508808fbb64965e29712fc466592c882ecc4e3ff0d81c33d7685e68e96816aba6fd951a4948e155cb6f8188e5df0dd33db06a73f77bc4fea5844d8a931a6a831ea3a167747821614560f5a3cc2036be5e944f8a8968512f9661416a315131611b77d0d191287aedd829f31538693149dae3fc1a4ffd47dfb88612b68aa474449ff9b5f4a16046ffe3750c79094c24f4da31546ca2e1f9df3299ad8c131b499d9817d3fff03a1e0ba3029bd2c703c38a89f837a8ccfcfe72652b0cf3f50e2ff3a1689e5ee409cbf803d36d49c727f490369c1c1a310a4217df341bf9cbedc6107220265a1779fe94684308c3aa34316e05bdf79204864c7e42cbe5f41543e43f3f1242ae3159a1e4033738d2ecc5752d8137f6617e9b1d9dbd8fa320cf575fa2451bc6bacb2df35d959e7d5a25a7018e8541def3290a9b084494eb6297f336326f4d403d85c80cfc4198db84f6ed08bb37146852345ef49f27ee1cf47303bbc85af0fe1746f53111a87fafe2051601baada53c75251c5ffce6aec153a632dc940dad16c346faa4a8cdeb17f946b118f76d55ca9cc381d28f598bd0525e87632ba957e9133d34689f1bc83fb2489c03268bc57dea0d3528e22f97acf01359163423aaba0c45c1968d587b07f849a3e4128aac52f2df70dd7e65e67ee8d23ec3d4a585157d8a969a468c68ddc263c190442232062877926f66514071007cc85e72b5762b8138c31256fac0a1ba04b373716ee8898d73e0475d2a1aa416983db3d60d9167d58bf4c0f3649733b45753eaaaa14baf44bd98dd2bdda4add0982fc95f1108a37d6b4200925a43268bd92df0eebb7f9cd376d6b34487ebdce1e8aa5341aef689075f38f5a6144d06e9b1cb18da76eef9fbb83124d2a73b0e2986083dd929ec35963e46176d0a2dce113a4713b1f312bbc29c0edc276da5b1734c344eaaf13b0468029f8c9a32e19d4c5a5282342c8d8a0dc2089695a880391da5a47b77e097cc2f3b15c6df59f0f52d51c6d3ea0e6f35e692b5050069f30d3df6710b097d155b1af2608bddbcb016ae85252d234122a27920a3713ed04d414f07cae73eb6034d16a7d5145dc680bd98c95a19e181c16d68c1879ad2e28efe02d75b7f800ccfc72d00a805eb91a74d69e8df0ab58eb955db761a179c4d9bf92573f559fe88918c31c7fe753897f418b25dd801f2a2a7d667b200dca52a4c488ecb3bf48328651888d7ea349a8ef8f36e447bd9b2284668bc43ea7d4af7ad0b4c0364c5f04092ffe2cf5ad3d8d6ea8b9ebd61043b2faefd56a6e0fd7fe3b753202c8cc089de02a4f2d246fdb9e185fba5f2a4ead6684a4629f4beb6d9485cceb57dc1e513eabd1d909ea2fa1d69c8d7db482e906711ac61773021fc437d7488750b06a33f1dbef9cdb7ac714d35b5c943f6c30b7fd552f5fed022c2c63a74401fe29e54e74f204bf56a4c3478d7b24054c5a37b5a5b8717399680629918ca1de7b2f8a0735b5760f1d551574c2807ecf2d53153edcb83038bf16e9e851287921e3178975fc767a3827edee74b21d74db10b385483cec1e26582988ce908cc2d19aa9c6b82c420222afb731e4ee782e2269c762f64a3dd51c1c81a67ae0a3151a558469b89dd16f5e3160068d9fdcf5bb7652da1b6ce0e30e2d9731f1a6029c68954e2d2bccc1751867cedf1bf3ef9497e6064b0c91e1c5894d4b38fd54edaf370b3cfaa852647e2539ec397c6feaa1232835c67f4e930f28303d099800bff0d3eb8302763ff77fbf7221dcc52ad31a5da23ba3fc00c17047a99dad5645a4ba92c6eb569ae9779b3ef2e48d99847126a862fdc7498a62cdac3cc7d71e28d4cdba8bc5d8e483227bf523921d0fcbb639a6d5637ddce8b3157e55505eed5bb7a548a1dc35f50a2f6d86e25f4f8e21fa0bf4f0ff71b804687f7ead82ff754e3994be4a771cd5d4e848be4c517d33d54c7f5f28d69c23245efc0d784dc1263a633a867a2d9c0421b7dd74aa6ebf59856af626a7ee291487441d53c11fa0bb3df4b682738cca2ca1be4726dd6dcb56127450cae144c807d823367ffe603447fb81f97400743a3d55640c6b8a8ef8181f89d09706c2d7962562f3651abf24ebcaa2adebb0aaeba6288e90d6cbb7075e9007c53e4577167c8c45073447385aadc0ddce9917c40b7f398a4598c2c2d538af58de664150cc8557022cff54c8b90193186ecc3d3774662baeadb12395734ea6bae8920013784230ceddb3a0e1aaa8d4e5a7e1d5b32f4df31f2db659002932dc5d2cc2dfa115c2582a3559539abbb534fc83c57cbfa6d1be4408313a8e978e47a5c9db660f49de679696e7035627bc0b8aa8f9ac00f05cfa54f64cc0b079d68cdc9f69b86a93974bacd72587b34d2334e198521ef4ae4e3e881196ff12eda6f6da4c4a701f719e54593b11a9a4fcfa4020215d0dcab7007d451fe4c2714d17328adb36a30402248dfcf033dde53a61420ca9129128388c4fb2c1c7fce71ba1b23b0968f69f58a5aa38bb3a687a41c0839c679c5c3cdc118f99b310ada0bfb0e76179282f18c0a8d004706185c79571f80302f6918bcf4ede1800a670d47d4cb11c4bda14f5ea3cdf79cbe0838d4fa8d9b62ee0da331d08e627da53bbd1b4bb7a5243eee57a6892a3e1bcbad896bd302b4edd68b0b5b7b2f8458a88d479735e738ec19018698f88b2f00587806c7fb67d4f44bb195cc92cbb71406bfedf7c8c3a31774e0b7b06da3b37e772dc44631bf451367f7f33c746c887c578ca2e19a9b1612f58e0248f4eff8dff468c008e0fa021641fb0006aae0a65e839e295ba750820876b8cc2620326b91461838903f3981493c29453f62107fc344d06faa8ac0d67016552ed005a6382b07353bb3b278eb3e19623e896fe8553ce798b4287a3056cac6c0e5baaea7ee44ff31d5f1b4b78553e2a34dd16c02db0eb5a45d1113de7cf9d7bd1cbab02288431ef609a72b216e47a5caee47bf457a484bbb0451ff86d37c52e0bf34bd5abf124e457a088ed057f8314952ddf6af714286577dad1a5adbfc46dac52a3cd0a327b5f2ea90d449940a8a950ae333468d9cd8e79c36725495bec88825081cbee07a625aa25a1dee757edabb490060feeb1265e78045fcac4746f5763e653557717889f60be78f7ec9f23dfe2c3843d0f38e9721d90ec620d22f3d928377d5f740ddaaaf63fdb0a74626bb4b8242378bd845870d742c0f9c32222792aacff37c9248e2f1e092da1e11d905d02d21d5daf41dcca76399511827576f1d7592548a30993da2140057e7fc6b0e140c8011b386abaab6b53620fb45eb28bccd1a4878ada1b70fb18221719958e766177c34b59f2623cd133902e59ae9dbd130849678f12e2786295bf2b2d37968b5ba1f544aa362924867d462d43ac3bf13a85b6779a77d401bd4dfdabbee1fe8efd6b7e7f8ac364cd28b1027f00e5af94486182b562735673883c80fc9aed667e465c0a26e9bfa111fb608db433cc23f5bb90bd6d911134d62bf48c03d896eae6d3a4c02328d697c9f1260b11c32f6bd80be24fac5370a78bbd9f57d9b80c59ac5715f95dc977c5af3742321990380318be4c3df1c52547fe0a2d20067ed8c9f90cecfa77ca2e72b3f25d498a853891c9c5af4e8671017e5a75c511f113ea33b3c82d931922f7109e1e60e003ab87fa54f5c1e5672ce88d57cb394144314d95261dd04d46aa0e88dfc32e8bb15fa39db1dfde9cf7d867415429a989aec3e47dbd3f6d8508627ba61eebe811d725d3a85f489da85f42584ee066f8d1afa909fe0b5506b2afe3fc615600238870323a2685d3d5166bd09c4b87cd6390e910e6d1f314d1b4c4a90fa85c724f818ba48314be2a822c2d4bb5bfbfed6fe19c22f931e272b92f6b7947bed9500d09a40b7a264ead6572e7926b577c56798ae656b838656efae11dc68db0e59d072b8af6018385abf4187a26de5d9ad8e77b83e8f01f8a41df362b1431f74947a674b0f8ccdc6a0bac863330f3f311a95b38637ccc6091bde5db765eed7429127b36f67d2b4bdacf4e7bd721e77e37ae6a51c90ac89a5523e1e0b636b1ffde26abc21d133efe73a5f16c6277d38bee6f98916ef21f87fad2597aee4c432b9f89eccbf9c6b7347a8e6fb41fbdc01c829eb864e86bceaeaef04c95da6ff9a726eadb076fdd24467fd656fcdeba2cb706ba09943538dce13c7887513e6d3107f539ad547015e8e462ec4eecd6bcb7bad83cc17c261ed5b5371c11225ef82dcab9d8928d67511c930fe07e8c467b9248dfe28d0c248f4af9631c8a419f0ae9651df1dcc98e75e2eacbc3e379ced255bc47948bafcc32692d902bccfc4325adf3383f810f2ed03f30919867f6b606bd1858e0de3f8bcafe095aa3bfecb1b9d5b790fa34480c3cef18b73a0690d0dd9ffbe8e17cd24f26ea7432b3e41ccd96cefc92ff87fe8436833ae8fe3f6b7e439e64bb9f57670117ab3ca295bf02172e17c6eb41a4272d38f78040f559f1bea11fcd982e4574a33929f217d3aa8eda1e3a8cee920e9603deabaad6ec9f4a5a90fbe6ec05c2c1c0698d127d1a347aa5fed7ebef96901933ec4dfb1cfc379baaa5a7e97d51f6a33e0616f7a4eefd8568f3c9cf92edb9d4c8b24e5eec158642ceb91cb92e3b2526ecfcc1f8ce8f5639ddceb9a52a2da5b193d941777b5870565534f4f3c96873aee1ffff0dc86cefd859a7350431dba1a0b51237319a2e73a1f5466e69d2eaaf6d2701aa0f2f8f795c8737707a39978d1771f05e2b2ca4f439be6cf3f18ada7246c9a033da6d0b7dc172a2d94c1ff90807c49c24ffc97c58be072c87dbd71f4828332badc891f5e43d6ffffdcd8613923dc82e98adb1bda3e74dbd543ae24a8b33a5d2fb468df787ad7c0372566af76ce77b8a18cda361cba5a58c1fa792ca4660f29c9b5270e2136956f0ec1f9b672f589a06bc580ac09a5ecace20788c45763b3af1492f5d3f8a2d5d9599f0e94bd2e8eb48af211ac9401b59bcf12e914473e3eadeed7757a1a6bc5eb7413cb91bb4f1406023b6aab1fd5cfa8843e4dfa74028f506bd7133d962f0a313ab768877f414e7d585d9743f4198642d787fe40114b92a2e25957a8d14b8d8f0a5f005a945b997ff163962aa7e66071e6e3787e184a9eace9b4c775dd1e87117e033a8e8ba9e7dd47f9b7bf4e40da22ecff3f514a1bff8b930a94b80f8aaa47adb74574a7fd396b8572a97721bd3ab82edd37c2cda4225d6b3d84cc92f6fdafc6b1b1df1807089f3ffada80392f9bcc858af3cf22b1c9aada7bb6f2add61131c3a71c1df7aa47e3127207484dd99cbcbc98a08e08f30cd109fb26a41f8c8efc52acdba3224f68bf8ab7960b064d7bee73bef5c57dc7b9fe5b8e5d28d63694ba7a80d98c460a21f9d5438b8cf13f154310d9fa81a753bbc07f87413479c775464bc7da04d71df6dc18bf1ea9e63a52a23b15665fb7db86f7e34172d98f735b9b819bb96186ea68338b785f79ac19d0a55cbcaff41fad7f1307b70afd42ac736d7cd7e419be55347fad6806da380859fe56caa3fd42ed33244f6f1ba69ee37f3b8decd32e55b681dec7b8379a0e9eef8f74e0715dfecf194eab99e6f06e519484c5d8029039b5c4a192171159230b045594415a22daa230a8a174c6a2ef5b29278040212c6420ea78c81b2f37cb8d783e2c8e10bcf72e977f137d2ba47ac00f263b2c0fcea7bcbf7ce432221e655cdc3e16b074a54321f9d105c5722e9effacfcacae6d5a4697c531aeee59cf43604510c34b2cf8d0ce43fc54c14081963c73a35add148b4d91fb02a1ca077fca2b2fb453405d67ec3a039cdfb976e66e3df22c5c99cb9955ae5dc909610056f6865e2c50dbe4bfe7efa080292dfd2f2a3e2714efdc7782c2253759f3b91bdd4809421f72c1e5bc66209b92141ce7c7bf1724ed7f881db00ca6822d74e6e99fdc7a7b44f9a81503b238ec5f2f6321b33c0ab60b60d34c13b9a2da13c68ed218758fb3f21d67661d773faacea51cef787988c4cef6aef7cd89ac626b063639aba1a466a53b890f63345b0d197cd7ca36343d12ef314dacf3e02e1a236d1121add527a070b69c49fb5775e4205ebc274428bbd515faf1331de54a05245ff5f402be9c6aef3a050ea79d2b87d93e1a8850124d2606800b23049981afdeb2deb9b8d292038b49f05d1c6e33a053a289a8f0aea24a3730896658e8ad894ba76d42b9412d1def126b6944330b6a44396d5e76d2462b7469a3cbe8d656981e698720fbc8586b6ca054c3912f389b8f6c44625c2a5e60ae3a9ed5589ce312e595d7bad275bd80f4cc938e98581619e341d37ba95b6f5db5bb7a5acf358468ccbf12a0aba706def5e399c3985bba83738af3f314001c028cea1a9e9b30abf945041f466bfcae3311be08d2f707ce6441a16b600a0b202f66716c80fc005eb57f84a448a0f6ef6679e98db057f0d7dcbd1e5277fba562a62c990768d29de489588046658d37fd71d8df2bd81d2467aa030b209c5ba5a4cce0991e5cdc9bd2e3a9ae3e9eec7de8e0af674a0c2ab3da856bd133738d27c30534a6f4ffa42da9a61633e5b99e425095c6994fbbaf54adc29c1bfecc265275e7a5671a308ae7123d10c55585d5acdae1bf9eadcdb9074f374dfe1c6a1958ca3b98e50bc21459bf9a70b91a4329e03708ce20cc06cf3ef27bbedf7054cb94fb30bfab9285dac24f4fc5099a9c75847571c92f1d818a7f75edf25c15c40ee5fb7c064761954e9de443ffe5e7aefdf10d0cc2b3bde4fed1dbf8b9aab6ef314faf2470043b4a08a53bba91143eff046c7ece2cf27dbb5e434c847330b334abefee0f7e776377fdbddc9f9627837d1cd8efacb33ee83776c1d4606896df901c69fbe4a66fa1bb6f0ce7580f663c2e837e0bd57f7dbed2dbccf11e9878010aa18de483b903c1d78d52ed418c822f55867718e80924c8308568f685812c330d4dbde85c15efeaa5fcf84db10e5c041105ed611453a152c5f6718fca9fb058d0b77062d6d8b3a07baa67800c55b4a9761870b98831be0d3562a7789c59c839c0854171cb1ce1495d534024185005a4e556a388bcb51be5d0775489b7ecc889f15ae361e57aeaee502ddc6cb1ca024cd57bc23bd66af0698d1bedde42a4c4766535a2d8c8e86437ef53e394cb82d0c8418b5eb5b5ccdb4eff6ee751d0543ce4a9c725bdddacf7ecf971ef8715d1db106fee9d683ec6f22ef71172d4ed7f65eae0ce2b91152f4c9681452707553a64d1f38586398452cbb155902f99a1a1c5c527caafbb57c05c45c6172b1702fc732d645c279780e11d82d62e4ae47b55f4cd62d78492fab335abe0342e269d83e26a59d3b027f96a5c1d36048d22856234d2433f89829eae88257c48f9c1030e6bbcec2f893967dcdcbda74d25a738c8035dc3b55d7f32e1f09e551e2151eba527b01709a300e0579f7ba034f8a37a8e90404df5fc1b2da8a449d5a51b6f85b787c936cbb3751a1c4ce0049875cc836c274201daac2846575ad5207112e05524c44d773a81aee03d675b6879fc621c1f4bef32d5df902ae1f8e8624ffd80803ddc86d469bf02762fb3d6d457afb855026b8b0ca8cac91246cfec1deda7a939168f8ff14119b504317ea2865f04e081bd897d6a4d10297abe36aebcb855809d2cfae2101d7e7775f5cf274613f66865db5b9a132eb7de366c0fef85db48e4a2499e761bdaf43951da6ad1b577d38b8d133b5a621caab45760ea7007aa9af9a32c1a1f9c05e18f313c05b9c002622b1c696019fc01e49e4209a0b84e4218c94817a084370899c6240223a0af980c52a8442ad00d18964169c408e2112d8701e447460287a1e23ebb1420248717143ea3120410c623501613a4600aea23849d8c44214af102916f401a3062fa0ac8220d45a8321d606119974680285ea2b2982104a35837319844a41651841f80bc4692c122d055941c51680295d1050e8fa124a248711197c10c3230657508c14da60be192b69619e486b3cd126d3566a38a2d9bd750583353ad44d488fee7cec4cc2b00a112ad2c3d20e1332d91502471102e9b61680128af9728bc4948294e29ce40c96940327084e92b403e69a8c456420f78b80c4b4a0441dc84cbcc0c42704aeb25164e12d28b52886b10321a930c38323a8a934b1a5a2295d0cf741a89c848b510844f03ce384d9a4ce52e3b87a023394f208250568f802041898ce28ec41a1ada8f4ffc1ffd3343e0ce8b3958e42ee2d416b8944d0e4523425802a574e5c8f0096a22c88c8c9f9cc91e710aca95d02276f8398b24c670d49161e27ebbc45d5953936d9ce76871145d75006db9d39c0f570ac337574f07ad9df7b3c3f39b876c4b90a63dd942d642448e9e1ab4528b673a9a5ca22e3617ef3a729b6d4c83c902f329907949f8a0e244e9759632802c476ed6e6a12c1bb71709366930e381ac6ba811cef870c87338ef7f5a8d5f2a1a336038d77e2c90e77fe7a10bc0ff040c61a53be4ce9cc14a7ffd4deacf1759bdec73a07f5031f65d2d8f5fb49a6186fab17134fed2f99da23c3ef947b97566c55346fa1dcb39683baa04cbe5edf753480e2ac79df58823dd8ca3a9c79015ba398cd1177193cea8553b90fb815eca60ea49ffafd36e22688af5b7e5d1e8a295d0f69ddaeb27ee209339e509969acfc3aa59b6393e24264f373e236c6dde129d51b4a6db43f361f161c0ae8bf5410267c2331cf3cd74f0b9d0a34cb8baf418fa32c7808903eeecba8fe69d92f62ec5765f17171cfc5e23f2eabcde7b8b85b9cabe661171dda638810d1cf143de05b6bb0752ac5b206ef749c3c9a05bfe06d8bbc56c5c49f1a07d6f45fc4c2fd41d1578ec386fe4037a93749d4792332a900fa7d984a37b534c1b36c03f268cf1b3d8a82e234025828e1da55fa1eed05ee7f22cd76addd7cd628b961b57e15e5b21e0aa1f6369f5c03360db22fcb3203a5c8b8a76053a7f4f71c7115b27474e50c7846ae7d50b635f64774dcf5d15b460c1d86051d1864715c0a35b718c553f1af01ed8742e4711429082f0c56d0536ea62f6b5b1e53f8a7e600bd95c0c9d4b8cf46df742772129325255500060c83ff3f6e0f8657e0a716906b7396e1b7fe46222e9fd263a2e69368aa340ad897c3d963635da2b0c601fde5aaa6dcac4969d7f79e72c3b12a491e61a0ea0972c9b0d6e91d4090e0f32eba3b0842c4819940cced45433b0fc9b9cf07ad2323eea02b70acc28690cc46d3253f46b0d5d47501b5c5f7668560ae199f30b5204e89f268dfdc204284d75466de2a84e28a33c3114a88941a1e08bd472950245a60a40d229b2ff8815b27f9ac5f9956bfc8817cca25fbbb484610d152b52c8b8f22919aeffe48cf597a64dfdc206642d6d73d50d71c95b8102473256854356e91893d46d2f76d057ed3657f06094bc02a8792457f6b02f7cfccab758fa40066adfa4fa872080755740564209c42b830ce9e07821044c09479542205a58871892a786b8cb21013ddc5c106129e26e49c44413ab2b8a5caa88b62c52ac8b0b84113c65dcaa3482d5c6bac491983ae2238f1cf471ba40024721b725125f8d2c5824a957491c3249ad4e6e144a2028e538a9444b2b6b88255f6a89442e59d4cb05c1049362ae904ce09a59976892564d8c6493bb6eceb67082a18ce6514d808556e842bde1e496e345eb83fbff2af2071dcf72a37c7f8124305c5e276489789cf768608b37dd1dea9a66ec0fcf4ba55b26669bf2bdd958a84fbea0ff4a7b5f20db3e415a83b59f18eb41c7a26830cad58e52f6cca5d7a8c7b5881409f9f8c8a8b326c0ea40d3beef58ee441747ca88f9e313e11656ad185b5e668655840fbc4b330a10073f26779fc418d7f2ea1d676e343792dc3417250e170048f834d3a86b5e4be26ea1a77c350f7a7678e36b3bc2171cdc9685441d3d079122aa5ded316337d6ddf01239a436d20ce817f4fabf8d26dc006fe873f060fef6b61d1e3f9c87cfc6b23e2a2c2ae42e2e13024519b04a4d36e6b0e01a0f73e198063876e3edd4e66cb854594e0063fcf571ef9aa3b2d3e3c99a6259f7390cac612056a7f790e18a21d0adc365864da8a3a10f863e32f4f9f61897ade73234167e97b1bc69b8893b0e3bca156a04948f8020789d784bde623409d2d7401b0c7032a20481437a1da0dae4afaa378b9e724559ea0e5567f4fb30bc40db81aece2211be34e322d596556b6a4b8df098f51681ce277d2c7d9d6a8581babed73f2191ee1294b690b6fa7078034acc2bf00000cfc49e40c7bf64f3b81419e2f252e15b8777d983140a8eb4da079c1759d596e009602ff7ba0055d31d7fccbce52ab61dbc4440518b131351f0de147d6fe8157fc816e85ecfc9561218eef7f2c85fc844b618b403eac64878235847bbef67e8183d67ff8035535b2187ccb5d64819ba9c3cb44e83b4425b198f95b50b659ac4d8ecb4469fd8dfa77733d937974939692c50689e4f189d18e661486f4a73746cd1476c65169f48950b265baac243a62e121b1737b8bd121b10d579d94161130a5c7df24063ba8fae403777d22905523f0a210b991247a6283e096d999e40b3f2a936225a28aff1c7b8cea02e716ab4a895207b5806419fbbc0041637b773346265849dc913a430603a140ca492e98ed82e4808c221d84513af6124d914afaf4f469357ea9c68ad26fc93dd7930bafca012adde566b077605d77a70ce0b82fc644d9bab45be28d2d9a63a0a87d50706a860a9111e2dd1b213207d057c514e9bb678bd6aee15045d5aafadb6905b0bb9a910333be412a1225e7bea0429dea9676e4591abbe146359c058b80392a07e1df2ba95bf6f11b30f8b8010f77a469a9b407716452d4eb962fb75a833218841aa3b8c74da97abe7648a96c510be9f2125ecf6f4e765be3460372d9f9d813ed91e1ea813df194dda484d4dfbb05180bac4ab37250ea06b171568cb23fbcd74923a400242d07d119447f1d446e288df76bb967a6f04c7d837dc128c63acd1246e2a5e25eb6d7a516186b306b9afa5fb7c7fd46fc43e6eceaa7d6566dd20d0782836d23410803917e805b89da30024dbdcb0ab0104daaf9c1681c571cbfe6fecc30324011f60ce8851f8bfa43c5b03ff5a9aff5adeb0552b5fba6634bd50e0f07fe6818def32b644a3d20322037d907c61f3a61c316dea35ea62bd154e6800def208e7bb0143905481f702b3c5f8055d043728774745f90ed3970d525a38ddfd4551629ab6e2f38953bfb6ce40cb7ada7ba652884b8dde0af9c6fbf5bbdee2a2e6222e16785cbbbb2b99fef10dca89b5f47ba0ad1c3d47d609d7c6fb80d5df3cc503174276585cd0d47ef7cc777c69c4546d88bf9050fdce05aa36c2d4c57d0a5d8ca69bcf9e130be799ad336b971f7974a3a714d983ecf02e2017349488b1b2d35de684ae0088d8d359935327f19c48b94cb405330bb5f655eed47253cec1207f58a27aa047f6b5246114e0b855b3f0baebf11e1045741a32413bd53147e9780eb72a04c5dceb3711f2276f3674d52ee3fcfe238e32e6420fa87408fe1f956f2e7cbacfef979f7b5b98fadf8bd4dc1fdb24daf747d96ae4fc5d9aa4b4fbc83a1e708bae164edb2b1ed09ad387eb0b9839a7682390412c5a2439091fd43b317d78dfacb0e698b504ad32eac3f12b8867faa588f7b2841ee7c98bb0d075f557c530e8de2c9641aefb577b2a2c5f31188f595546c7cfe6f52e290aa701d78500a02326ef7901d78340fa054d73f86a970e7cc5d853fae54980217f66889ffb18888feb9abf6d8a8a19f302896fb83c4eec0386134ab47c0f716176b2f0e864ac8d3ee97d93af84d9130dbf4b281ddec1fbc0aaaaa345079f97198660437c8ba4d7ba80cea5aab178c1dcf00d725542961150e7a9612c16248e44429681ae1f41487f84c7afe7ab63211d3506ab9bd606da496125e93d7dc460d0a7b6e9a14e7489cfb31a14152dcd39fd520c6b62c8427fad3b1604af6ea8631a8185f3fdede488a3fbaed77badd27dc5d7334e43f104707eda89a79a53cd3467cf4e4c37db9bb4109ae6f38c17f9ea7ea11613e4ca531e3b4fbcf93b8f14720e014e84f29036dd9cf86e392312e67d1b489803263904ba76c31a1fac959c10cf2e98f3ff0ddd651bcec4898da3d43bf64d46f83623ff1dea8660ee6c2cba139cb7ed31a5ceae49a5dddaf94c7eb188687402db583bd2e685c92f9f763a713b8cbbc633190028bb3d1b2af9cd4ae42361dc7bd4290fcc6bd023065e6c2587e29e0a4bf7c46e7f1c356d9dbaf1241b76bad0017fd691ae88de05cff31d1335e3ed146476e8385d3b83f5d16e2bafd2799ee76eb9b1667af6f54b98fafd0a9d5cb144045b870f1298fc62c46e414da512aab13d7287100cc10bfd1104c1ad75f59b3f98950cce8c5935efaef8cbe3fac8e56d000c0321e7ee938402ea9174ec3cbdc42b3910edce9a3e8356fd6034feaa7c98bb70064b0807198e8ceedabcf764e08184ec75adc78ecf671de43369c7bf335823d7cec596c79ad0cbecd8c56ad53206bd8c45b5d78eecef3507b98b37d6dfff8f81ade54156ee8062eafca429bb4d23828e260001092e0ab496bbb1fc78a33861486c0243d6f077c7c6617ce9e9fbcfc81d7c7b27a279236388bdc13e8b030c6397d48e31f05e859cff8248f08ef8c17a1e69e8a0fe12cc4a3d3ccb980d545a4ad7354d0c8ccb9c853bfa73477745782411e54a478e080ae549a0959b681231945fc860cacaa7da0ed0b1770046c2bfa5cecd555ec894435458cd02738f2d32639f649ff5026464f67ffacb7584417106f762314bcaa472e07f2a5cbc2bb7b03dcf39d13ea7b5749ce1a632147805435d50ebbd2965391eef59f064b7ce8db5c32fe38a7ff4306504056af9fcb3f212e656f7b80e873f4c35bfa47fac40b8558577cad5ddb17623f9c963cd4857d3e93f28f7d5e1ef1aba25f872c284f62f917ed0d7d97d40cb3701b88fb63710f173551b31b66c9121c5558302b6567cacd354d691bce5854128f0a62c96d6cdcdf911f069adad74c154d5df663f19a9bcca16c1877cbec11e4a22986659ca60adf9055141873487a115c30eb5f30b931436cd9abced3376e4cb74a07324757299057b2298da6ddb313dfdec0ac64ac8ae3366ce2212250fb64139c5256f029bd6eba925b251fe577b3883d33378906bb4651965ae4ebbc145d86a378b73d5963ac901290da40b73e265fd7ad594ea48e74300052900345a6836040b45e55d40d603459b3d25f08d74c05de576075ade6271361dff757ea61b46259eed97bb1ae6a5c1e37693ce68ea999f67ce3b60e4dfa3ae1ec0820b9882d33014b341cfc5cbd10ec3e217055477f10b98d0dde2a2713e8c7eb04dfc7f851c3ec5d816f0ca53e18920eb1fc9281a18767b42d420ba438d77af5494374954d2be885572a9d7453abdff71ed218696114c47b544677e57cf50b6960461b27bb628ef8c6b37d08f61fc78748d0d8fa3a66012ee24fd403cc1eff0daacec41cf64fddbe95acf19738a75245f41f815a9415a813e6451a7486f9b3df0a150d52f9544db4537db82105d47c55f51226655004f1d4c7ecd01d0086cec9d85f1e00667c1e54b69537d91877b36a6b563a8bc33f13432f7bf780eda46fa6d854f4bb0fa543cf40d9dfb091e9663bfd78522a9c7ca58caa36fe298013a48cf033eed60d1188ec797957a6903e459737b52db46c0e594f6757ab5a01927769b2edf24cf8eb45b97545726a33b9814b9d01993ddfaffa6b01d10a02293f3d53a61cc05498c7ad087d5743e8cbc3b566cb3b4deca277eed7660b46b7b3481ec9eb6362d532c5f88a0ed05336441727f8e9e9917b7ec525df587930b43e9d4a08667be9754db97360c3d4d148e8fcf39c07ba7453285de4ae7e4731014b9db47c66ef46dcf91c3dfbd011bc67568d2661e415e2b96830a8be9f91f59b8cf0dd3fbae925af531e86eacba66793f2399a68016fea8f586ece0b5121792b5439ba42d09c489f1c06576f784dc487ab02d5d2b0c6221bb8557633641d9e27923f6f682a6b506e78a08f5bc8becc6381f8c52f7ec17dd0b36a9be768fb811fb600a9ce246d829b527eab774f3a857e5b87f28c9f67a0fe190100af22dc230f97b26c3923390f758ae5ef1ad05c987210cdc65b47e096847581fb2a9979977ca7666d407627157bf06cead4dd6fbc856d8ec54862ec9d2950751a5a1e479602c4d557496fe979ba52878e5842a02aed9ad1dbbf745d97fe1bd5ee1f72efa6d65f77a56c3ac6d42bbc01c4fd5504773124bd7b9e595f808d028b3c7c60ecd4b5a208d158474b6bcc8fbdc61b6bcdc0fc6230ad81f75b93c4bb5d30d73402abd212d9392c2a1b3ef733d9bbc2c1324fb3c98f72ace60a7f8f4622c1771de46e80d87342da6927060f593d4f7101b1895593a796efdf00ab1e41f02e76c0161e2cde8a60357149f179e6327ad5b0cfbf16ab5b78a44745909e8f7c7aff3c449e4183c844e75d345b8a16193ab847c645a61e415247ee41114aa88082124650a8987c8899884838b2a885c9e4d34a3bbb2bdc994704946b2db383a3f77afd48d6310a6b920315f719773ae310bbaf86d2ad87443d9f356a9b06ce3524f41760afc718f3294fcb163d8a0fa66291ff3565eada10776202e08060a1efa25b2e49e7faf3c676cd3490bc901f42939779fee0c6b369dfd1841e9236589f44c78a44a45fda4bf6864dcb2b0de8dbdd2ae00b765041d59bbe94682d6aea7687b94b98a968843c10f854b92fa9048656e88d1fee766c771a7f98d083908f3764baf9cc564fa834331d0fddf5c106e28d4c27651ee7699cd6741f55481e1d0b56ed27299c8e833819a615974171703abc57b392ad7ba36c0b0f42e90e6d3122c607f7d2e5e21f56189545b0c3c0ffeac3611e3a05fed982c87dd9533b2e5a0bd50b028e8148d23bddb950e3130b6a3a0eb93b7a68644d344244fba0d7acc7c83cbba7b7db963f835e00172c7be9f920a755cca73149ad2b3f04ef2a62964f4c32a84e40e8e262024274c7a3f305e0d5c8150682aeddf77b1b4189c9310410c4e1c9343ad19cc42f771a5c3baab59d2c500e1a7a22a87ccc270fd37dd00a2b2ab4347fe29f67701226d60eb009f7f012e93f6d656d612a60f4f6d767582a5784c8aa40ecc16a76458825e9816f1e967c42fc854282752d9976ad7fcc1e455c13b3381c9e03c650b4555836a373767dda2db4141d757bc9fdb66124272af38e2f8729998a6cd2fe095734f37c4b5aa2d09abd966cf6a70138cf7c664423f25efc5b479c986360e42561e87912940fd662700eb8e422c08d7f04ed8e6b89b31858142017d553ff66a0875a9b8476605fd9bf87f5e64d3d84c5a92abced709a6826a3820a97a6c9b1042bf4c36fbff3877b3e1331c70853b0943c15b07c13b58b54f65508aabf775cc3134c23238eac2820ee6488068d63d5bb2ce21dba4ff04f0458eebcd24176afa04a2977a3d9416141cfef94b05052666205972bd893e24852838f34421bbfc320e5501bd389fde4ca6611fc0de13bad0670093d4d171cd6dd89ca9a247f8ae15d41f3cc6489328d21c83cbc5b59ac916ca649d9754a7189d278f925802ef8099401018a2451160e09ba95f8c15273c7cd80ec5a99e3d3f1707a6f0ae6ec4c91ae7b49ad77c4c9c0035bf2d93be638196d883b941cfa910f5b255d26b21a306926ef19aed64169178ee285d053d84ebe5a64f23c9082174d05152e61e48ddb4b60f63a5adf41452dabbe252532b88a3e01318322c70e7e335dcc8f08b23b58461a09dbca87dd2e2afadfdc6eae4515f4348ef1967a0a20e4acfd113132fecfae006ef37a5a0913fc89e07c7b370c7cb1458537cabfec0ed217fbab1b03b210402f68adf9790a84202e3d789517687c7ff1c8839f3877b79d1f848962e1914abaf03a717e1bf12d0a3b20388070c41973f7a648b4fca8f7b7ebe70df51e57e06857f0c2da7ea8746c830b63ff92f5030e3db9c550c36d64e97318ff0b7aefc10d22435e9c0cc3a5f7bdb804e0d0195ce67864ef876b6b5678ee0bd96052a53f49b8d39e3cc69cb58968f0ab6e80a927758e4328002fd111c09ed261e3a766769aee66d483cf2e02e7795bd12a3b3a300099e1df09a1c78171980fe4c0e7734c6d3313e51ee6baf29390a1d730fe74d1553ad63c335f314bba190568346aa968151fefb5ba675940c170db83293926ecd182009ce01fb1013baff1c1ea4e5b723d7aefce71a117e4f2cbb9b9748b6df46d6ec100626f7591f75876bb0a3b158f0f14472eebabb6e638877a8098056a94f9f0cb9d227b51228be9bd01356130c89c6a5679820597e33abb472f522ab45e19d5e4f911a21a2b9301bbdf302d8788a7be347527ed2ba58705b8cb973031476c8261fd8219c981265fe2169020f45b2f5e06fd033cb0fbd27b0d93f978aef9982da6754add3c6e907d91e9569100e327daa7f5a92d9236856747dae1c35ba028239d0c782b72c07cf7799a57dd70d8551e4254346f81c4ed0210e058623489e304a9e13f3b880b2401664b2d4055c4cc3c74424dc6812fc6b81cc06408116ae59cdab9606c39c348ff970f0d671205d112584114078557cc03d3bd1acadd01cd7e74bd51823db71f5afc9d12753a85c0f8fd8dd9711a5cbf5309712b598cabbd5f789345127b280e973600c896cb17e94eb8dbb7a3a11242685bc5d321bbc2f65b052838eef9f69e238eee3035b054ca72c22a254938fb76195cb1d8756bcc4703019e6801cd47332e0c650dae2101962e0462ca57d71e3ea4a77ae05914da77101d7e383d591aae1a6314e33ff10e568171ee3b60bc6ee6d9a6a6b9306015c03fc37a20b5c65e91d8eac1ac3b3593f0a633f0f434a76f9344509402f0815dbc93e89836aa5c1a7c854e4503007533f5e7660b07a12803d718ba4da8974714f4fadaf0ffc89e60f1ea0174be4e4fd9521a09318a0fecd0b43e2ee8468aa04484e2092ca194acb18681b6dd84acc87f0c5e1fb2b0310713b290b0d373f393df2f024a1c7e0c185809f0f21723388ae15526c5daa7d8a6c471c83459c0f41ceec84677e09ea49a789c832bc2542c933a214215a121ac491e43e80d669f9fa8aca0d42f2cc2043f9fd1349e76678ce6f79eb3eaf961fb83ea307f7ddb032ca874baa40f4be73f6ec87b1712566df8b1cbfe5591628a7012c5096d383735412c42311a93482f956f1d74ee4458deb6e1d3dc3547dd472cbf3a075c1c82831ee84aaafe1dc246343d264b34dd236b71786ca2de103ad505aa5253c679fc9407c0b93c64b1cf2ce50d7c7f2c0d5e14f73e1bc03b14800fd18ece040bc2e03b6436b6377d8a528707882042aae2562c04ac7256bb8171b23b8fd15bedca50862c9d9574388cc99f0e4003ffe65d3852e1fc6a836528fde6b98743c34e58210f8667a88212d93ea66ce128b1eba292ddb22fb90e97c92049fe25574d2812f8392e60b37b6624d8e47da2dd0343a66a9e2a6bc2e4710f6fd457b0e15b8c0aa2f11d966bf95a61b8e58bd1d4501094f1a63253fd5ac588b4d51e0cbdb580cbd1381f1dc702ed677324f95a561f6031bc46e14c79767408012f93e1f17813816cb1bde16f1113a6d6b6de6acbc8b868aeccd98c8d86b60b357841fbf28cabcaf94b565ed5804fd5954d33c6ec6ca0885819f5ed47a31e8ae582c147492e7550306ea8836d0681ab6b3c32d624e9db32c4cfe6d01d246cf0217271bada4a7fb655c853528ff28ac56b414b8fa0508a43d97618ddd92a342f2ea69794cde3cf75973467804f5cb76d9e2ec2888a19e95b2ef0a09f64f2ca961fb88e0b3989c80dee10b443587e336ed6ec55bf175cf254db5eef3eaee5e5771bbf06e39fe4f6bded6ee365a621540d978c3b21ed6f71b5ef6df29ca3d33ca21ef108dd4ab835825367fdcee65edb17345c67950ee205ae44a1ba4b79c5b02a4654f437fb44c98626ba9b8ccad75bdf53cfbd0ced33060eae8fb79c2770b927564673c3a93643b38163d6b72d2d98167041b261f9bbbcf1bfca69ffc5c5ed26591b9d08e6e954e21299ddc7d11df47fafdea3c5a78a7677c4b9b046acb8d1bfc430d3560bba314d9a73aba9af562eed567c2ce75c5463f52a1add4bff28dbbd42857623f7bb7326997517004c13243bc0ee255084d2546914423f6d68fccd6201339983c3a56a0acf386bcf557ab594ad22e28eb56b08fd98a90a407a443d067775ef833aaf4cb7743dd91934bc8bd9a5d17cfd24587f51a0844304bbc98ee6cd5b5e858b0344bfd16ade640d9ebc1570f7f9602da052dfe997bbb9d99bc1ed51c2b636a2424ef415530562042483a06771d180a1110f7b8267589722ec4f5c0a2739f0364fc926239285a2da0f6bdc3b504114175e0c34e29673a84c05808addc3a4e48f8391d2969d50acf0a17c829a353e8276dc70148a24063f35fd0483ae3e13649007ec8c29535c675021c6f8ce9e091e0f12f7ed311d82accd0b7279e49cc6878d1184920f781a499806572d443eb9475397e4362932811b20a1b1b819b80d4ef98603bba038e2a2677616f8087d1832125e0ec38304c04277efcdac7a837c40f3284a83a2ddd956327e9f4e46a8284ab6d3b75f47c66f6a5a82acf40d15f6f9d046c28f4a8c1c408f6c6c7664426491facdc371bd4a66f008967efbd8262c43541d50088dc2943e0a99ceaa94b86be84f6ac4f61605c5e6ef8d4203f316035376ce9aed32b921fab07b3cd97ba1e0054f4cfee742d14463f1c7b000577891c42e3d0d159a71ca82ebb0b6579d769d72e0ec4a9017881b60c4e1c25f2c873cdf9df4f2c689db1687eb05b8dca1779c69bf0786f2abd441a78716209c7c9b8438b2d23ff3b4aecc7acef3eb3f6d6348e257098574f174e54c47f48677a4b53f7cbb65b58fcd4f2de739807da7e0d2049ccf7203f13a7869d490a4f70c32a9b13cba0b1fed31227b0ba49afcff23f1f468d26b5f6a8dfc61d679cc7a12e831382cf23519911d13a5b90f27c08d9d9b2741dad88417fae4ca694dfce0e7cfe0980e8cb980249c71d880c830704b9bea742c45344aaf6764124508b113db8115d6166c527425ad214e3ef4836638966b58742ad85750bc17ade634b6057054d88099c0106405bbc0dbabfa36039de592621e1167b9b895ddd32e7a1420d55c88aa7c656003023ea3d485396464d4caa7eab6358a833a44645d3e1a01b4eb6c2b1083dccb7a46e52f05ad9df8eb944e09ad636755cc3301b1d4226889dad1a4db85a47d39ee9c73471238238090c3afa8e2b47b54c6de0dcc76a9903ffa12c060b3b1f818b6c3c4f12bb6411a65685a9b0e889e1104dc1364a860450ae8612d73b712f4796f6f08c20cbb3071b7c38064753c66a07360f1c7f2ecab67387dc9f9a40fa9aeb904c2d464717860cd0b19b5cdc0c234104144f43709f022c19aafbb3e1c53abc083492412131c59869a92f68cb842948d9688e492b823a5ec453deabf93a8cf63cbbdec4c3d08f1e1770785271a8dfd0bd3a5aa6d04eded1956c8123913d147f8812105939ab4dd2b80141f80cc0422c759a994c3db115398ff803a270662588f6a23c5718bde38e9f0bc1767d5a279e101fb35c70ab30d8e84b504355ce1bc89af23fd369c23d6066d9b2234edf2c759ad69a31cd8204104cbd1b3e848bf5129af3e6f0116adfac93b188a8c97f41057c03035d555deebcb3ec29c4631d3e6be89f316a1f6f323f530c55784762fedf40ac3be4ff6dac9a7182dbbb66c73e74f893c25528db3d520227f21c147c10df9a2824ea3808f76ba25e36ca06a789b912db33cdcb59cff3bbbfaf9192b7d7748ce7ce6fe61cf2cdea914e1e38ee6a7070ae151d3aa94d86345012b173d172d51c41a82e7eb49ea7fb501f72f277dff1956be74d0b090d323d38240575d8ce9723c4cc9dcf11b0ce983221b86f4c7982d9e08b866cffbeeca58b16e472fdfff4daa0cb82973622daf1a5ed71fc3f3b90b66fa1c7caf2eb31c5cbbb7bb35ae2b8ba179ed05c9425505a8d6ea169bed39e91d75ff04174a2611f62a372a345d84f94d5d052c64ac19adefb9c0928355e8909b432e8fd84fd0e239a90454ebcf5b6cc8912abfa9543592d516f3b76f1ce67e335e63cae5b5e29ba731beb618de38c5d3fd6717c9646515e9d5031d05d98c1b5f55e899accc56e4080de313327a3c6e8035f0780ef37b98bf7a4cd5257d86eafcca00638e43983b679adc653f8c7e746ed9ff59afa37f64b2fd2f9af8004f209cb400a94aa92e6e9df9fd18d03c05e8086f48fd306f94d76ec3ae8e08f5befbae28fce42b6faf48ee786d6a404475fa53b362a3350b893788d44c4e3351a36cf6f40f88954793240b03bdfd2078cca5cf341c1a8359771448fadf4fcef5e04157dc528f281f5fca30e58e1701f2b280f7d9c1d1607e3a62a3ed462960fe47802ad8a8fce04e719fe0567c298163280c059472efa33c04acb53ec506628f144dc3a8fbe72adf0d4b214aab14b5b3274167472a95b494242af20070d09c9c0b8b08efca65c65f37dc6d276322d3c2ebb5c8fb7b5ced251a4513b4ab889bd72c36309e46e4e3a60e2754ee8c525db0cb0c7fdc1038a677934675d164ae66511a4834904f595ec39ecab04ca5fa02c36f59216b715da10cbcc3aaaca09ad25022faad87abfea3d885ea68909252a5fe8fe39aae1fc394905fb91302af950c2a228544d664e8a173417d5c484bc402f69b9e3a3abf3fa74bb1b7b0eb6c8ab0b90d8065236d971429ef382e68d6194d71d4dd8345ce3a22e5dc14ebbf7d402c59c6bdff5d7d94861a814b2ee7d9f6b19b54fae2bb792a3c52abf736ce4cdd266da0f1807d4aa0b50da34001373c03a8d9673bf3e10bd8c630e97730a38de32b4cf15766757044d7642168419dc12dd4285d62b1ea4f00bd133b16d48fb5d81e10ab8b1109e0b2574430b4be463ca66b4ac08471b877122ecbf661de113a95c6982af38edf8bb5ff7635da62712a718c700b7a382c3c63ef2cc0ea10ae2fb8a4761323186f24669296332ec1597d97387293ecaf0fa573813766d57f5f2675d9e32527771dac4ba1a891412266386ae32cd697aee4659076d00821234e193e688a6a973627f1a4e3fa90a5181c434152aa9fa60156d5e053bcf6316c2a688cc9f42c2a155dc12a5668504bbf863dbd3d9002c2a94a5aadf139489531203c46302bcd68a72f2b66aa56326a39c863402df8d46c0201220595950d1f96e101a153d71d89f72b5ce35a404e8444dcc3d0b4eee189670f44626c72e535f5c5229cb5f3223d4ad01a8df72c847a32c5e624615d6e24c4896e0baa0e5149cae14b8b0197bd9c0d53993062959d664a6d6c24126ea1b9d2c9c97da4d04e09119a6037dfc48279550321ab7c7d777f31c2e9326ed5aa2d2de2f144ad1b26521d89c56329202f623ffda1ee87ce8fc373a7e41a2bd9f02c9e232648abb229c99416c330e0f6ca10fa189f0e10a7eca663845608317b34421f4bbfb44524a68a9c9ad007d0b7c3bed115efa4d268834bdd6446721d60e5c9ebef44264ad4c57d7ef20b8751e90c8421b5a0bc3c2262e1324b71ada9903dcbf10f90590689262e4c0fa282f24673ba4333467a8bd176408f67b00a3c16696ddf69de72ce428b272fd60f086290d670812506d4353264d0e0a5340ad411862d2bac1a3980220cbcdf3390bafd861617b8f70c66eda6928148d843681df576c1116821a5cab3ed6767adf29b723415ba361f7cd4318a9bfea7161253c25fb3254bb88b372659f4d0b9179f48668ca495b99bad48fa4fbc176e1db55c03631d0dc6b17033f3db4b5ea758ab8eb4651e004911f22505679d2c8a1676f97e3b993d665548c01ab42dcf78ed0b93bc4fe74c387bd31fc0409ccc3739d3bc5cb15a34dabbb566c9d570e3d0d1c24ee3f56d743cc0439ac071dbffc491f4c5255834938750c41e28fd54c124ddc8f31bbcf0f0d9aeb13ef58babe918d597960041ac80ac03ab8e4649a01dcc3593093898c646183e4ba2f3af37387759dcbbdef94bd329fec4072e700359d57f4d4c6d7270a589cf9d5c26428d5ebc02550c1d9d82670b8024d8841057f3d85e4cd758c3552534d2f0b3d246121e014a7ef5aca39d760dae5a252564863e3017e6b285547371bfde928e7588a6d907552e31a047fe2753cbbf3215b50418602f595c2165f0573a0f45c8fa44947c2c3de031b58163cb9621e9513489d49fb880aa6b20b0bbafc4da88122e193c3d93b5f998c6504d63b5c347adcfe879b7adecfd20b5476834616bd1123a4c2c9023fd339844ead4844a147b0fd4678b02bb324548debfda963670f4d4b2ad4ecbad109d19d02dbe0439ca68521a8533361f5f4943496829b983b745d3975a39b55a107b8dba2ca2b96827c81daf0154b6f5bd97e65c45038e3b3ce77ecdd920e56614dcb683a5f90097959f73c861362562a4673cd8f852caf057006dfc6f9c3618d3c33d497acac2414d2242ad007743c7efa4b00dc3632f9a44fd1bdd96722ab61bf1bd5bb81b32c77053851e8cb5bc810622b6dc39d62e52904c2f6cf9dddaf45be556ec6eb4fe481993b382f6de470b521e408286079b353da4dc92a17b1b2ffbf30fc8740e257e7b2409a02265bb4524d8b1c56590e8da18b551533eb33d96e3cf535cd50bafefef0916741122da620b5161a5b4ccf03499fc22309449e4d0ee11b44a373f27d2874866aed6300b3f98d2a0f21cbc313f2288a95892df83691d24b6f304d25ab3ef8ea8f95cd67bdb02977446ba7a8ac06fb6337f9fd7dcf9d48432a47a2c26dee9471252e3aea1129b5dbdb1c89dec95e51f870d10a9724f6d0179f548ff04e6b15efb4c9a86524951c433852a852526d308eb7799002f94809409a80510c81746927651a46d4c5a664d56b642575c50bc9722d5648b2d63916eb60c0129372faf9c52153cdea6f899826ccd8195b99315aa71e3dce35ac87a7ee8ea2830f28c1e4f42f6ed9808b229eec441dbb91c770cc17f8dd9e672b49d573820a0dca7123bd112da282337590b82e149dd0968a4e15c5d13f4d09bd5125f2c86ac50bd59865183b0008fc497b4c4a0ebd4fbb517409f138ad85d8d818a9e849cb1a1998c6c735d692eebcd76ff060e05286fd3a1c1317bfa860cb296e9c34797706dad0b3d4b989846de1c322a53fc12baeb3ac2f41ef780247854779c0b3f187d02a767a718d8d64c3653a3fd063eab280a4d9c8dff263eb3704f3db30cad2a05f72b657f1d81c895031c0b894977cacc618942e25330c6d56736affc61815798a7eb98c18cb3f00db5da5df122cac899b973cc21d8a4f526d1b76698d40195c8ea2c2fb1f561ff5dbba09715b4e7cfd13adfaa82d0a7d5334c11d291b26811a4f21a823fd84191df959e7b1538eff36c2ecdfd81761a95be1873f6c6fcfcf01fcc9182f3ba07a9297ebe9d51d86fc970dfbed49eaeddcff81070ccf766a3fdf5c34b464b086523ac786410526273ef14f7d3827f23cd938676847a4eda93d8e1a52a8e5638b8c39eafb04592fcfecdd68183f1036e70d27525ab010a2dcfb7fad9df5e60fd962e2b5039a873eb33d85387e8202ef670232243dcb08895ae11bdabb7eb92ade29c2dac1ee5e132ba1546ad23981e0bafc34a9d74aac1fece1d018dc7f04a48bee769eb45660cad4fef33a21146bde4ff9b95965447f0b0a92e79a16370891c09cc99979607ebcb085995bab1301afb7a6729e16e3e1666bd861951ca238f882a0e14f5787ddb5cb978edb755df38bb133c451c354e0787d810c8c20fcd2130806bc3280cb3aadfae4456a6c105ad629670733173a26ec6dfa477a8cb74c8f5da56bcef21a3dbcc22765758f197868d45fde1c6d0e71f81b3068a14e0a3f6771fcda2d84c55951e96e90b160792c8068d2a161f406122991f067853dbe79cc2c5400b7ade3e36df029a92adec86fd49ddc23aba2846608c840f0d7ff96b307c88b5da0b7433d34f7adc06cee2c5e295277a0e3bb3fbbf6829bac3fdc73c9af9719df85f43424954ad3cd8ba7d93b24ed8c7dba58206701c80986ad8c1a91e8c07e755fe4860d90a10a2bbdd4a446f08283612c843f6963e87b4297068c7d758953772ee5dee5bcc32959de876a2dc1c855039dca3fc1705abf3c5914075b2a53be607bcebc27a5e0238d6c71a8cd32b288ff2893452846035d112792e4975211788917afa358526901cad92617be9dd6231aeda8a800287408fc664a5db7746c89674a798a7151c2a880eb4545c075764d1c8d307947ac2e50abe8ce633b2a6209a85163e3e676790fc9ca73a8cb8634f38619eae0a4a170b071870a526477efd67b02193f77408a0f63e62302d36ce6ea9dbe797bb2040eee719e0913ed9b2d2081bd787731b106e5a82e4ed37fba6b43abc978354a86869669a71f4152e0f09a1db1196afa4467d2fe59d185babf053ff7e6e031034246c2847afca4d6911e9248d5d29b23ae6d700a2bf74a3978b3961b9a7be71feecda769f85973afb84b502017531cc9cbc16b4a04ccaea061f0f3678faac2f6b32230cd5c8d312af733c1619c16a01f2af2034c76dff3edb9c4609c716918cd0e590460fe490c3e326ec521515ac91846769a691291c576da6c2e0f4aeadc06a48805488427c4c486008d3687aa48dc46be88a94e82b74633e3e1e63ca45f7baf89e62f4be4cbfe616e82bad0b93dd038f32454654d63b7be09e0d4cf0e4e634d31af37b8f718ce098a6eed60d1fdd106890ca2646328ec4096acbc99ac07421d72ba47621917b45e3b6585b06cd62d8405c976e845d36c1f0c2f59c2c1126cf7c5b4a55b613dbd467ddae939d67c76ad2b9fd9bef0d1f7a831e5b656829ccb5e8cac7e5632695079b0279b7c9d2637845d2cee961e80f0d40c4e41c362cd2c0e32451ccbeb8429b30c09d054309a885965456b5913bd2a204211f3f36fe7e27e82e29d982335e6abc268dc93399d92485a4387ebe9c4fbfdb4afd2006c4f855b37ffaecfd254e517cffff9363b811599ef833d6a204073d7c2aad424e7da781bc1c803964a0683d1ac71590cebf88438179b1943a0d4c2eb8531adf12537bf934a8ac624cde30fb8579c04a9ef522e90a206c4a7e87c00196cde6e2252d4fe826d3913176f8c0fc6a6f1344b7603489da5c3b01d99b5c49990e5066538c48013227d89a1cc7d681900ccce199eaf6bcb0d5720afcb15019999d85a07582692be54263cb49b4fd31a3126e4dcc2758ed385841d51dce90a04e4a298c14e0c981c2b9bbaaade121ea36247f9082aebb51562108f10ddee2fdbd65b8238ac9b97643cc92e69a7e19315a6cb9875cee36f973b34de0fc7b303c9beccc6e5fc3d00c0ac219bf1673e421c5b8de1affb060d28a72cae8e864aae7a9a808018e72ea09bc43faac09aacfe7738bf738241458976acf0c5ad4f3421fb9952f78363a27298cb653dbb54289f0bf391e565890c6816476d7dd088beb3a4b724f84151422b560089e72d33e284127ac09454c15a1fca5bfe4a1e10430423a4666956442dede97e931762cca45927ef079dbb61824895a30f22f904cfc4e83d68bd4133a720182010ecda087e07d60f726dcbaca43f703aa8c00b3d5c36052e8386b0b590bb3899807972a52e086c43943c24cc9d163e70816f51517fc93594df98511552611db4742273dace6fabbae40c51801d7ef45907f329ca6ed55eb43da08b3e4503ede23e20599527b0ccb79ebde181ad5a59aa3d0f77d6e4c9b2852322862418cb3d9a7ea549037e8b54ad46f93918f8784af604fbe57572159979eaf1be6c4168f3789099ee0937314bc0ec7a48a4b495ece16e75348447d2403ad3dc4f8583cc39e1f46966da8999d0f41cd0c731911beb14810f4224f9c1b949ca75f79981c01684b031a79e1af0cce080a3f93575e8b245d1f639d5476f167242844263485df04c4db1fa7ae6414a44085cf6aa9ad91a069804adbb04fe22daa973629dfe6dd0203f53a546ca8530a811cd0c3d77b50468f3ef38027452d52035c4187d9d96900fe09e2a115ba46de4d29ca927f5e67a332a728896aafcf0f3a9aa60316c0828978c919e64656b617f76f488abdf250beec58d90f9480c7f85d589577892666a456d16718b9433f9a713c98c11eca0f2746db383c1117871b67fa7b13942d38d05f7e0f0179b5124267435a8fa62689d2a67ffef886bd9004fd439a5861ab0f3a5b4bdc29ea3d6aa0e50c3f93f101cd06c0e2495b30c8d3d6e7708d8f5615b04e7a06cf98a58611a1c37e5ed4e86096ef6b7b2cd75514140d681d9ffebce9d61fca4e4c9f721e23211b6d271b0ee64db53942835da43d472e3ad066f400f7f5cdd7702f7089e3172cce192bbfd5fdda918d941f26dcb8f39b1e0e9da326e4b8afb4b6196ca1690a0592cedb6770a8d9239ab94d0d00b77ac074ac428ec7f1a5bed0f320333fc8340ac6b46952f694405d2c183a53f3d75c932e15a1506ab83718395a32d0ed088f3fe012dabfed987e48b77569416730b9195113dde652810bbc6c0046e7aa63448a681c949c338dc4c0dd616bf30d276cb7702c99d48482789282303238fec9fd5fd60ef2e25f69a2aa01291ffc0478541968e252b6034a16cd10a7d4bf1fc99cb20f2ffcf14ba2236f033a6f432908e562fc0c0c14548a438382196f5be2f864ab9a006d9d617696be47c0f87f9ef364a2748443aed37aa44e891643de5f755302078e0406c1d2127e037fc63dc35da4d4ad1ec5f40386ed93de5edd9b6e2369bb6935cf2c4e96ddcb7dc4df952a568f53d6e4245ac7e8ae37c7a8e03dc9fb0b0c0297a9757b7ef55a6649302e7bca8ebb280d1b6c991b59c2fac48bff5a01f27c350327a0d472d076839f1e7eecc5d9a9f5d7ec203bcea9cf229927dd2cbe8881eeced15c941fc0a7e8828f905f34ae04e354cc9950739f3a797ade1dc069f6e4917661dc54da9f2fcb4a9860359e74a995ac906fa1c34b04a9a4321048581857456c6002032bf7ae0e99c9ef07e32acc6852f5986dd5201d1ae680c22428a69003ec2615b3fc9d88bf296402540dc264d1ebaf1800a1a17fead6ed8b9c290396f189cfaeb4c3a24cfa3f9aefa63c9912d76f3219cf1d386b6c50324ef856934763a40c3532ccb1ba2a757d016de2fc9b87f067203f178f4ee26cab848a21ccb4dbf42d82bb6b10fa5e40ad1875261a674fa12ef2cbd6c7d678b17f57e1a224d30f184b4e28f6ec188abdb8d98a2eea8cef4e67666555db9f595a451ff913187518f49211e78804e527fcd741eebafd00b5dbfa2ad0a5d8f753dd18fa9229d0097fe3ba07b549a2652438fb0f107ab0a57647101030ad9f6863b162fbc2250958250f7bd46adff6422f0d563d97fed8c40b7062b5cf3389337a573d6e959b1ab648f8cf5763916820ca5ffd94b328eded46fabb48ba29b390a4434886149da8b9086b1b980cb1703c2d050b9e2fa0dd31532baad12516a26b714d7f7ad93146cfb4aa13f9da8b046d76f3b0929d3ce0c2d774949f66406553863893b1a07dd72b7d0fb8fcd38e854d22060e58e66d28e537461f0f374c7ca1d1305f81c079e28f13b327595314f4bf9b7dccb56a5b749ebde0cc8095918a209e880f140e5efce3e48bb447c7cf3445c730a29e443b87d46b371db183b701398696572ec1ab76be84c1e665ac65a2ccede7be4819e986c2f4e1009b025519ca04dd5596af053b93edc008fb2d17d0c1a45c2590ad3e3ae33a2b9670120b208177a7a7f49d878c4ac69692b6042d44656ed3a4c8885f0cbcda15fd12e709757853a0f41466ee4bb7f515ae927ba299b875d56d9b8621aa58a508bb9db57cbd43f0d8721c22178267861a4e14ce269cc8eebbfde87ae5a1f07580ba88a59cc735046cd396f310e494448a92f858061f77f3faa58d65f5eb392cc9261c854431fc2cf7c2aa4a1e2d3960a068e8e5c1bef190c202e454dbaebac61cf41c342d01e66159f11ca0dc9ec2629bec07a41eb0b1a2f45b5554e3283059844720059808c3eaa0b8b8dd569a2badb57a23d097686ba061b4934e044e96477df980ff80e48f21031f887b6ba3df3518640241f8db507381239d48ea55af318e6954a35f8002d55d20bb06150399ce1273236963902769a72b85bf16394368d29aeb04b3a90c705a1898636795faa30c3e204ba5c4d9185c5c577495380ee39637f851750682267e7ca121cd1d6fc7e135645e58b80c2e2dd25a255195dc35a6c690235a8978633d094c9634d46383c042207dac32ad1c930149503e0694744999c2c41799d8a67318d4a4ba09e33dd1e8d10600402725caef66a579e2e93e1c84c4b2fcf20e094e337cf236a34156ed14655cb191038cccfad71736291167e287bb7941728ebef774aec847b5532e6cf68b980fc2bc0ef66a54c1644ff903f3b872c25795d8e38932425846c022776b8ebac8f276d04d9ac0a85fdb992be8c62bf5c118b63dd194aef7fe6a8706fe6fe7689f5c812f5ccadc3985ef6312b1c6f6929608ee1bf92b84fc436dcfe34a4179fb362acd61c50eea323144d21adf51ae6e779ad11e1de0c3bfa31fef866231aec7e18212471fe9242f23e20b3cbced45198f4c104e2d4f5be1b78995e99a430039da2ca3ea7da163f5003ee58942809bd3face4e240f1e770ed17617f343f528188be64c2a13866955ff142d8de445159abbef4c0bb9df1ac1aa40c3cbaceda790558536d1db26f5bb692d9f5523b5c2205b8fbebd6c0a67c7164d6dcbc65a2c3129b3da9549b21e3442ed666054a91e682f057fe6ca9f7cc5b7eae982c4aa11839753a9dd5e1fb8e086ac8a0f1df293304991f800b033fdf736802571607f86f4dca083bc27540e128e65f6d42e2b88b2ad053353ce3f7bf9abb33ee0c59b618ff71ff5b47a518c4e0f22fe782f3d0bedfe0f152d75b78638b0ae90bc7118396d39ce5b116a381da034c6d70570802dde18bfba829982989b5d46c371e7682c623f1accd52a82b09c68ff50fca07f63a9ec569555add0950c64ca93a73dba6206c2eab182790af5937be7d2807616e1a62aa8b942e24d3d7c3094a428d2e8254a0c0aa810e2b43ec26c62f9c9e6d0ca2e279cb351543a9d5dc9dea37b1fed70a2933e910ce4aa2245fde80a86d20a8027a583aa181bdd4efb25a011535aba8543b0c34d7055799115190a4eee26d6fb2bff05f5b808f8c6509402a1df785184dc7fc405332663340fbd2eb8ae630b6f60c78383c4ab57a241febdccc645203f5c32f73d31962fe2bbf7be55171115a34d234ff700de7cddfd5f43d1fa2f279593babad715023f8021290ffac9b19dac0cb5c9a25f793e0895bb86dceda58ceaba38c3e0b0c440dc25480619561521314e33f4750723a4ae8d14c39ab3a382922e5eade7d13f9ff0414df827edc77e13ec7c6bbe9277da311c959ff7f9944770cb6b5176f5cd6f2e8f9bcd6414e80610dc83f4f2674b77d85cccdebc9c9acfb8e18828894f5b5b6864de96ff87eedb0ed82c8cc950dc3d3dd9d760b48a2d9292805703123f60f7abeda8f78516bb739ca61448f82a1a7b6fb548f8f18c3f20a3313346233a947184f2584a1b3d59f2573a3baebd45248648d9adfabb144fb6f9c3984f001178d6a9c1b1a929c3fee15b398a66ed2567c4a57fba57fcc6b77c0347387e56c573dcd65a89327327814e135e87f3fc947eaf3339452b1eb97f3def404051b1ce0e0fbc5c7c98bb241778deaa8a00314469c3638b2f27ca6780cd31cb0398bf626e12a6d0a17bf9e6a24a44d286bb79a40350f20c4218845a6d92937e0434d16625715f78f59ba2886099f3b463c86bd6773c5ec66f98469ac2c227aa22c567a95e7786c5095c2ae7dd407d71b005506757346a72c803bd8be23dff2e1dbfabe31c0f35424bc97262597f9556e0461e322d3cc1577a77611be3938f32e660fc1f0b4f5e9a7e4dba22d7b8b4ea3cd619b7d23b81bed26051ba346a9e4da832704771379776d327a507225486dd5a2cd315769c336de51f52f307e15b6a0405054202932c618a63314f4413ad09a0e567863d131d1db864384fd571a1f59518e3e4ba468a98bd610bf08a5751049b11883db0129c74d01b99d9412f0a2ce2f55232adb4a95d8fd0fab4c902fca92aa98ee1aec78d98101c5981ee560f073914c9a7cf542cbe014263996b716508f7525ec476dbc5656ef228351de47f78be49b5dfc0d8e4884a708b9ebb554786205ddfb753be0874898b2ec41547fc5e7bd300abeaa0443291368908e1117d636f890c3415f92f543078ea53043104d8b4cd0767dc181b9cc97e9330da183ffc60b5333e6f07083547998f487acc75b7176f64594060804f4c639c5607c305d90e866b7d1d7e8c2ee4660009ead109f3004228ee483d607b5b801ecb8890ecd491f376b0447c87d1cf31b7fd522e8c8cbe315066d7d8f55e2b9df3547c50fe4cc5bd63a7279ac3abab91dbae5827d94dfa809df56f2d5399aaab9b79a1c2a6b12a5f5a9203016b33e6da36079dde14c43fa4533ffd243e467e9c504b294b0a63c9b6e638de2e1d752bfdd87e68f10cd305cfa1afe3248aa9fa10a36bdaf41251c42084feb74b5c5b4c5d8424387e11b3d3294dd2e58410d71c9927388d944d9c24de03efb435c34a2be01303d07aff53db79b5ec080e4ec19840bea0210014ff55dd68c2b3e47afa53ac20969c80ccb3294e87d2129709b11d987fe39be97f1997bc7cb43e3aec053c18057d1fc728eb45de16b434dcd0f8ddd0debd18bd61f5a25824f06ad682c307bda8712ec3b417d3a8d1f6b918299d774bf13a3d5e66e5b0383191b4cf8eb3ccff3ea674820b246d45db712dc8817a48ee9f3ac5f6e5e5d02467e391024d5e98441a4969c763f5e0e61c57cd58dbc064b610078a7eaee1a7eab9fd29ec11f3f12c9a7dc7862a1be6822ed09602388629b78f0aec2c8958066145f97aa7e400d21e64b82d4d306979c68bf6e19501d0952eee3f52e4dd3da26b4c98311dacd2826480315855fb75e0a2f40c4a9c3f46edbe5b4ee8d3e9108a0b71462f5d264ad417cfca403b89340e1528f7a68fc862a64238ee361c63b145d467999a0adc682193217e5dac5d4fe01e50087bdaf38a5264108721a69e00f08720f6efc16675fe288a9312c9381f9643c7675ab967da4a5be6d16d641ecc1df47b49a3d27257a825c67384b8caccbe7a1771872ce5239745617797d2a16d012007b5d9de990356b5f1880414f69c3354db9571025853017cf958621260cf8b23ed8042601f93de4ee6c25ce36b73081420637497c830deda1cdccee42e60a9ef8be144a0f14cff27a503dda7da653c9eb6032691ca1d7112099df77a85250594af01610354c84c0cb4c7e4bea6e6001cdd4a80f143a365efd5c2defd5fee964bc62ac0ed68f3c6cdb8b06ba23add24430821f80ba3d5d9cb46676f1c7f61e0ee4a44aec82ea40369a029d64b78ddb9fd96cb3981a5fd919234ea2710a21e2475ec254ce49775e00d125a2f607b90d482790ad86ce1db4615ecbc2796b9706501f8042bd829449710e035028fa646ff79dc8d5498f7f1e323d4791c64cd81137e57c55aab45b69d06c12d4252eba3a4dadb622f71959185b5144f789bc50bce76181e441deb70ca86b26ab6b25bf564d4ddb1dee1a8b5ca6ab110bd5146405c497ea963610c1e8849c87163da3e01f729750238496eb22a65124c86dd488410cb7e2defd7b4ffd3970a40035274c3ca10bc96c255e4012a78b705515cfadbf7e62f7afb2d788f2feae918a57e7be67286a4c8a84619dfdf380dfb43a07f23e0f63fa71a7fdc8854920fe7c88039efea5fefe3df2390176eb598cef05fefe4bb170a6c04965b2ca57a8117e399300bef731ad415c02e3739004d233423c5a270ceec9a199af05cdd561e54f57537112709e865e430f1dc7288af3ad094675f094c81f32594ab6620038a574dcf4cee5ca17dd8f1202080d53c5641b7b61537c798d82a8ecfe9e58139258e766d9cc3638e5268455b993cdd4b2dc6b9a0b54ded6acb2ef61eda07e2ed1469bcde72557cfa78859c29b2c16228974993ca7ba18c0115964d712b2e4f4de52209d45acf10899bf8cc22509d0cc27d3a42e7b71ff5154bd2f4e9de9a127492e37080bcdd3f89655380e141a64e0cd23fde69a75150db227b2fc83475a301c9d36f2413015f096727c21a91e09adbb2c9d182228fabaa4f1003c2b860cf131ba22a685ac460adec1614e6923fc3c1203bedd44b30c3d60b224c301ff000000000000000000208ab546706b2da11291929452b90c1a6cc069714652a624534a91ec0ede05ce4c7c3a33f1e9cc1c34d208219897cf0cc50c780c7789902a87e80002ef965bc6a8eaff019bd14784698a596b14d1d6d0e1034677e75c0bbae4cb949467878e1e70e9733fa5fc4c16dd5372e0d0c10336a459d467e983f6b45bc70ed852d57ff23476d4de221f3a74c0884e324f65ceccd86229e68097a5944e2f57b805a9eac0012775892c5959339f991d3760437f07917ff7a9d51f59cbd461032e7fe61853d73b8bceda29e9a801ab3da5d4a94eabcad28eac6d8d0e1a30f23363cadba6a28cffc89a990f3a66c0be564ae8f68d3219320e74c880d3faaaef97f693976b6774c4804dab41dbf4e5369d11d030c064b27c043452ae161d30e0fc569467775db7a45a0b2844c70b38b5a44d9ed6f282fc56870bf8b72c3d63eba092ca515b2491bb1914984c94d0d1023eb450aa4f98aad2d96430d0c10236850a224dd525912ab22a74ac80dda0d3bb149da2c2f4237b4516225b74a8803fdd57a7c57e47b33852c1e514ecbe7674d2cb71a082d1762e4f68886ced1f740a6ef3a7fc39dba7bb8a99a6e0a33cf51a935a4b2da514fca607a57eff21113848c1e9aca8d3ad4e9674161147c1a68ee9e38d523a5e228a82d549a3da183ae98e23146cbc1875969ed50ae9de85e040c1e6649b5450b5320bf73ec1b6b0b4d2372633791f4ff0aadbc63528d995d5da094e67fc1013f5a773908313bcba081bafbb1c53d2e1d80423aad9993948b5594a444d302ed5cc936e5139fac69109567d5cddfee9f5e2a9706082d75a486d39634a2735cf7109b6e3e9944679ae14a6b604ffa35fa8c61e25d58e58093e43c99517d5f28b881c946083a5746f5fae59af67129c78f7eb7e9a6c114f126cccacf3ba8ca751a594094482db8c9762aedad7ae960157e08004db21b5ab6e309929968f6085bee8d2fed2a2ec9401381cc1da0ba5fc74fe6b9dab46e06804236336fda042c67d37318237f5a9e2af1499414639816311aca8d4cf3ae7290dd9e25004ff32e551774206a5524b042fbe3af5640ead4c8710c109bd0fd24cea96d62f8e43b042651552b73ee81c64380cc17e7235dab468a1ad5185e0378e1c9deb4bc5741b071c846084ce9e925097cc73e53806c1e775911ebb9554eb1b41b0a533ca8f69b554a174130836ef68dbd1db6a1e5d23f03503069a881d1c3800c159ca595daaabfc81cfbd6ade1dfb89db8871fcc0ca786934ea68b9f9b2367c0236bca40f9cfc38f641b3cc69d359060e3e705178109d772b94a6d11e382dae5275053532dda685160d23091c7ae02de7d2b7b9ad6e1ae271e48115efcb79ef47b4bd161eb8dc2946adb5b9d5db4402c71d184dfa515c9a6e9176d2b003df52f86617935275528fac211438eac08f8a2932a708d336a3c0410776c585e91cfa317b23724fe098039fe5caac525fbea6df236b4b050e3930cac592365f1baf8d4e81230ebc52995b79c54b1a143122382970c081bb4f4249ad36bd94c9e378039f83f9c96fcd0dcb311c6e605d834e0d5d1fb37c1a59436ae06803aff752d037b25508a99d81830decc976f5975bfbe52e47d6ecd8c0b106ee5e6d65536a55538e856091801211984c03871af8d4d6fad72853257911b1e11d58b3e1094035e04803bbe54aa8d21d1535ae37e04003ab964ba653d3ac339e0c2838cec027212fbde7bc99df4f3330a6975e06d3dd3b1f4796a30cecc552964e3488adaf1c64705cc8df5615ba1b1c63e0a4560da5c972c78a510e317051ca8a5acab52f6867c4a8e20803173baa9872b24b16756b64f390d8a811020e30f09eda3d4268f6a5bc620e38bec06793a3d9843c9951c94c2693c96462b64d72a3370b1c5e609576aa8a522ca98b9d2eb0524c2b7f2dd73da7242e30b6e36117a59a5e2e6db16818800c1c5be0f3a98a9993d03a425b1a0bd3060e2df09ab276a765a1846e3bb266568214c09105ce82cbd68e69437fc3b5102c1270001112378be0c00217a3d242ef6b2d25f466644dc4865a0816568478089448e2198c90c22110b02244111c57e0ebf2476f0f5253259504f80d2dda90d04056e0d35d8c6f1f9a5daf5222f3024715b8a8f7d2e5a9d7af5646056ed4bfdb267dfd2c7a8e29b0b6f27dd46a3ea5d71b59b37143c6b171c30133106038a4c0cb149d756a7bde46978c182325931094e488021f3234ead44cf7d1f4c81a89dbd0c249ce62340916060546e6cba35eb8886ae83c814ba6a57fe6a07394269c4c2613b573022f75e7acea83ba53deda1049374af642b048c0029ac099e6f32f0d5287686c64edaca430815fd1d2727add3996c06e6bc5f05da13b46ed8d1a4ae0553f3f092d85ca2ff49115d9e34802ffa1df738c4108ad2e9533165042720306ba220b912d3890c0a8d1d23ce772ff57e66442f2001b33bc03317e060d2522438d60329941a344e5c0710436c75ec9a0de57980c0f871178514adf8bf06d8bc08adaf0ed5ddd770b7a010711588b25374c67ade466a3c231042ed69fce369a6356917208813bd1aded25aa693ae3080297dc6eb7f2b7bc572107102c5db9366e28211a33387ec007fd5aaafbac52fc770e1f706a3aa78af0cd5f527d038e1eb0abd95d0955ea4bb9c6c1033e7d6e15b4766a95328563079ca51d1f8d49a666af68514252003535638b921c00870eb89844691625b567c6e4643299e4c91cf07949fdbd958e32b71071c0dd870eaeaf94d6adb32570dc808f4a684d4ae6f3ac5ba7030e1bf03dfa5d79b9cb2093364adc465bb1028e1a70c92b6ed020c437d7cb93c90c3868c08bdad1d0e9bc2ce9f88ad8093866c0895629cbe0f144ad90cb80d7c1830695b4fd67f91f470cd8ac5d3ce56d1e99ebe48001a75b9eecf7d8f9a3a9a40d385ec0895abd251633b51ced0de3010e17f0a93559fe1ce36a1d3f395ac099262ffdca7f39b70a0bb88b4ac79c319f1c2b604db392e3dafcf4aa1c0e15b05a53260f52a8ec97f954707993d6f36db56df947055fc9a5e765bd42e8c59c42dbd5aa2a8505d5149c880a325f8a276e1e530a56aaf292ba62d6ac9423059b5b3fc9cdb3ac447da36065f667cf90f97e7a1105ef9592798bf62cdbdf50f0efa9a3ce954665cd1b28d818b5cbd62edb63c5cc2718e142bd50de299d129327b84f9d9b53fed7eb979d603c8a7a887e54f92be504ef5bf1c63f3cb350cf267857523c09d9a939c58a2638a9c39568d2410aa58399e0cfd44d864615cca406136cdb97b9add2f79e4997608594a95b68f9a946972cc19fa991fd1595aecb9b4af072fc44c5f3cb14328612acd9bd67bddbdda38493e04764904a74f586d64f129c5aae515d518904df79179366ef1f998404b74a794b8fadbcc6b747f0afb205a12a970c5f8d23b8cf14a5ae0faaca5caa116cde77bdfe9ba52ba97245425c46b0ee212b05b7acf4557e117ccc8d4a57de88681c15c18f5cdd153da6c5b7d3c89a86609100922a12c169d5203daf7dd0752322421588605fc95b15b42a19539d87e0567df3b7770b75a9637650852158a14cb96859eac964323922664c211811964e3445ad9ad21a594302a882107ce977367bf3afbc392db468049889a049105d9185085731083e09fd29b7921ed4ae96c811042fb3768f6b2f57cf0f04e339346aed48d11bd1a00a4070be41dfe80fa662f668498f4060456c8b2afec07994eaea5a796f8e493fb029968dab9715a5298be9032f65ba7f7fc6f8c0a68ca34f86b6b70dd3f1a08a3d7041cd835ea1e48dcca21e78ad43e90e3ae3dfc7d511a9220f8c309d954ca9f5a675a119a9020fbc0edea1d3bbac1bbf91e9dd81b3ac9d4b9976329994d8882123861693c956610746e5a42f3288efa999eac0bf6a8ecb1c3a7bbe7c323113b133862ae8c0ca18d48a27d5f9399d93892a8921633251253164a4ea15aa9803bf27d5752711debe3993c964828ad5a00a39f0abf247fefba995a79e1f541107366a5253ef0f7ed23423c68888932046091cf8df55cdfffe516e2a95b416301010aa7803173f6b4a3a424affa0966cd110984c2613113b6e6055329d858c9b5bb4a7897645162203a8a20d6cca6fea76a5cebeabc9102c1210528306c90126931a3448d66452b248fa4602487c8bb6428b6603df49e6555369ea85cc1b005d91850809aa58039b4d06ddb27dd5feb42ad4c09e7f54579116b5a467640d2d20044608163268902040798d094c26280d8cbcd8f15f65512a9af6488e94b4026cb49a410346ea086888008bc964a4a447269383065694320fb522a3ea32cfc09f7f5cf1f06590d040800c121a8fce09559881534a068d1edbb246b54776324186c4460dd440156560935465a675320dd54217b8220b912caa2003179434f7e8f1edff75558c81555a5d8bde34aa4c53f48a2c4456156260b3a225614253a41cf5c89a0c1a249fcb2dab08039f548e5949a9788fbf22364868948898b34142a324ab00032f6bb37b90372aa66a236b1d9811638b558cc46d2c80868d190b3057a3656006aaf8029b717b75550a65ba59911a2d63155085175893a2b55bc1a3543a35b6b081b605c93907a8a20b9c0e51dbe0226599b247d66a20090d08d0b031630193c9cea00a2ef0dff9b29f34574d2793b4104c2688c4460d3c41155be0959eb9ce57a36cf3a6049c36157b4d088f9a3d9ae1410a4645f939bed0b993de7d148c65b5af4cc7986a4c2a0ace63d2f22de65bf09c0e05afbdce467bc5bc99f5a0e04db69d46a192ce4d39f4f804a742870cae532821ba829ee057aaf8fdff771e9de06b83cc5a06d5c1846547d6b4b82143242730994c262ef0e004abc99376552ad4e52f6d82d751075dfb7ea34baf34c188885067515acce0518f4c70afdc2e89d4c1928e6282cdda41bb5c3b7956f625381d84969ba7d0c9d267c33ba034de8627a00e1e9660c5d225ade32e63d2fb8b14f3a804abf34b136d25843af56452a2cb83125c90297970cb52c84edaa403336284c0207140088c90102cac984c5ac44ee13109defc635cad349aa57147d644205212438688fbbb2320044648490862348977a067b403dc11d0811931dc7ff5e021093e45fd52458f955c7f6acdb8418344648b24926823463a6722256959784482119e5995d4f05ca95c48f02f555fbdd2293fbbe7f1083e7dccb25588b692b91f596b12115c8d26b1c06472030f47705ab4b2a8ee35a133d4467063b175fd9b45ad764b46f0ab37e9dbbe949e3448c3101e8b6054c7cde9d73eadc86dc443119c2efd9de32aa8c8f047d60ecf0d1810b02204460804ac30791e8960fbbc4b6c4367ee30868c185a88e021221a1e8860c7ed54fa6fe811a63a049f4269a5fa73925a7f66643b302346893b0226130f437059c7a829d69db42d8b4721f2f098c92f17a3e418c08310ecebae151ddda3fe98e42435cece20f8dbb60f11f26f5d2236483c04336220033c04c1c7fcd35c2d7a5a8eeb1108d695d652e6ac3ca6b4257800827d9d52e5d6b45e41a9a4b5287fe0d4a7dcea9298ae4b0f4608498c864049890d2f292185871ff8ce5153a34e59e674d17811b4127581b57c8f3eb0de414ce5d05a2a95f38750f0e003db7b52083db615a3bc6f0f6c8ed1844969593c3df027833a7125aea91d9e39c1230fbc52955493fadc1cb987400b1ae75cc0030fbcf012167589109e95740736d767e9c14cea7e8d7ad8818f9dbea592eb119d94eac0658daeffcc53529f3e746075ce1b1736a294dfc7630e7c78961e432bad2178c881d532dfaa99d069de6b123ce2c06ae95e1555df1f2a070e6c0b75a2725eec130be2c0e30dbc2a99a95f6f8e2d94d2038ce0e106bebd73a9becd3244a6d0c0a30dac25712ddfe2a9a8a18511e2c1063e4f2ffdc8dcb2bc656b60e508fd514c75728f416ae063b7b2a02f0997cafe3430ae57a7ce59b6213c4403b75957bdb4fc91325f0f08c1c28a101b3468484089e07106366e7ac71359ae8328150984c00829110881801521ea61063eea92a12affca1cf45506465384c8cf5f1bae3132f023d453da865e94ca1d03bfda53a7cab9973495626033b3561644c534ae8521522e040b2b42426098bac1230cac6cfd521f324bb9ce8daca12dc04310c34677c0af984c42b0480005663c6032e386c80c1a93898c18304248dc060d2c2693122d6ac88871f08a2c4438a6e001062eea513a4999bb1a4a1d29692d4a52091e5f602cd8e9d64795b3d2a9177899829866e524ed84d8056e5b8850af3a69cbf9c30576e3459dccbc354b6f5b60f3d3bf9d7be87dea688117255f2afbacf3aaabb2c04879ea6c94688cab42f6040f2cf0fa294ad7f93e93a9ff0a7c6fd0f320845852b65a819177da85b786b9bea44715788d2aa38fbbe9eaff5081ff96aa265b0b8f1957236bfa3148bc0257642112c3630abcd2ec5f3178c6d5312b055eabf690aecb734bdb51e062868c2d94bca063050a9cbfe7ff53a1f7b20c3e81fb93f6b51d3a236b2276c3c3098cd4d3d641f587597c8dacf907da46f2c0a309bcc7fff45283942dfd1c590f26b0c1a45052c9d7d729374be05f485d52791c9d950c1a595be7a1043ecb8e7f427eca4ab45412b81885c5b2552b4c4b2181f74ccdd5517d37787e047ea48b542f4ba29e2123f03a792cd12e1581d3d9727efd15854c7d791081754ffef599b3ee1cb51e43e02f68b9d9d7f2ebe7ef2104b6cd53ccd599dc4dba47107891dddd9e56880a2a6764ed69888c94b402723d80c0f8e64e1f2c69a9d5ca0fb8d17e39dae327a39b3ee08366cdaa5e547ac0e97bb3d89ee5885295070f78db556a757be3c9fc8fac39c98d1a67b70336ddd3976a954c2999e4a1032ea74daba4d672f333e891034693a74a224cefffba34d6b90e78e0808db9b9f1b3664fa64d55f0b8019b4bf458d6aba754c5cc990df853726cdc848bc7a05e03426084d8133c6ac0cbfc19930b1da53ebe5a78d0803ddd1794fbe98c1bbc91351212f79801a7f2eb9ea994551afd461679c880bf8bb995b0fdecdb5c2d041e31e074e9d6296a3c27f777642dcfa0c00306bcefc7d317a57e5bf0780127c4726c3f0b6a3fbfa4000d1b33167045162210f07001a7765a457d97a34afa198f16f0aa53ba4ada5f67bd92070b384f4acb525928adb552f73c56c068d128a6b5879aecdf0a0f15b029943acd5759f3643702b77143c6b14b059f2cee486dafc64f9f7051c1a9fa16d1fad4bda27c640d4fc1c8f3f22494c5ec235aa6e09514157cdf831066674929385f3f99eb59d345759082f397a1db398bfacbddc89a93740d27a9814c86ba80171b05af4da8f3e0dd22c3e51da2605c55d0cd9c5a066d6d644d613820048605d68c1b340c40e3672ce042c1ff464bab2395abe8d19135efc08c1e5123706306147c2c137e5f3a6b1d9f60dd84e57c5affcd53623cc1b7ccdb425db8dcbed5b0041d9de074f011a1d525ade31d43a4c4fd39c18be54bea46c5cde9a4f68a2c443ed0b109ced57705ffd5573a003a34c1aa14f4a7368b1f74a56a6c81c5647245162229e8c804fba5e99ff365feb0c4fd1351d08109467de998d876476dd7c8aa8e4b304ad89652d74a9f465362095edb5dfbffff4eb668646dc4460c11a8a13da0a312acd4d30c2e7c95942da504e352bd6dcaea82fac85023c8ed98049fdb3fe3c8f128b4bc2b92e04baf8ea582169abb957335da010750abd1328a4582eda0734d55e4906055e94b4fea6db3561f7c04e76d59ad097d4949993a47f06f1a33a9979ab34ef18e46b0abe9e32ba13a2623f87e15baee93afe5a872b808bee37fabdc913225d35204a753e524c563498f3a1b828e44b0ab1f7c54cedf424a84c63a886095fcbdd1a24d4acd2f0a1d87e076f47cb5501f4f5a33041ba4f48c3a4a1ff52c8eac7907487a4459073a0ac18bccc16ffc549e68c60cbf018218332830622386052693c984071d846094f45c4fe9ce65783b083eeffaaec8b451b3e78cecaa200efadbed694985190836c5a8a24b8358569ebc1018207400821519dc4bffe93aed76c71f18257df7a579c6506a1c59db82c4c6162458e075f8815bf16f4f71548aeee0c81a081c04ac45c7b05143c6d92bb210f140471ff88d97556f058b254ce7032b9346f9a2554c931bdd03a359844a2285ab1172d4039f5cba07d779737bd0f2c0e9f374297f9f32b70f1ed82cfad46553f1e2edeb0e9c96ab53f54799cc691d59134943d26107c69408b9adb59d572c0b1d75e0727a15a45b3a6166b10e3a70b659773cdb27f5143407360bed4a42ef97e6556fd490032744a58fa7d85f6ab33870a39598d42355998c593870de19ba54efabd74135b226848e37f0a2af5b32756c751eba81b79c929e5032b6695376b4811f213c46ad41e68a890dfca7ace9d47a56bd730d8cad304faa392af7bba88153417abe2ff314742e0d9c68e5991d262ba74afc6ca0030d6cf84b535a6e87f2fccfc02ba17a35a5b56d514966e07296089583d20f5269cac0679585f9b8eaefd1970cacd2bb64f79d4efffd876fe81803ab65142d4a0a75a25f1a59a3c16713e8100367715ff8e9a9e8abefc89a12a0230cacc6d89ddaf48abd3cd7c0c0aaa816d523aa62facc17f81c957e99524b559e6444b620b151cc0bac5ef3a0ad9edaa57df7858e2e7039275bd34232746bb40cece0025f519aa9a464054bde405b28d722750848bcc46e0b5505113ab6c06750a5da25e5a874c20e2df042b6dc7f1d5d5a70a191b5650c6581959bd2885629e816d95a336e9c007460814baa426b995ccf9cf5c85acbb0abd1c56ab40c14e9b802affdb2ffb7f28cac699162a81bcb496c28af31991c5a153fe8b0027751fb55477e46d68edb681b371ca03be3c61f0a745481cfcf2df5319d9296a6830abc5e2fef182e2be553cd98025faad1bbf776958a76081d52e0a5de34ca4f85a2c08a4e3f0b9a3eb7788dccb4a0030a8cbab7a8d2ad8adfb22d363a9ec0c8f528de318950a985236b22349692a0c3096cfa18daaee34bcb16b3ec6e7434818f6fbade7da392b29891b5624b2386488d12eb6002a7d2666c21329688961d4be057bb84727996cf94e9846091001b3e810e253052d7b9da7c31a8dccec89ac88c5649602dc9358b7af9c55da948e0ed95dcf6533245e921921b2533dcec3a8ec0064f1b956b289533741881dda8ad64ebd4f4bf551c3a8ac0aa1a19d25df4ade62c2270d284b41c84794b993243e0b62ef6add4964d06770434486a0881bfb8af7e478686df6a6ce80802974d490fa105aa89a636a93aea8f28186179a4ce1a2a34db2b14eca83bed97f4f75bd640c1a5e459fc63ec3ec1e7984ee4a57c7b82affc3b5aebbd34bfb1139c50765f516aa5bb5777c109f6bd548eec51a53506e126f8704f7af5a3a65a2c35c1e796316a29eb4bd5ca33c1cad50dfdd2e1bd310a13acbacb8eab75eb53fb127c52fb9dcbb36a8c956209566b519169ae32473555826f57d5fd69930b8f1e25b8686f4ab554d4097d9904bb4a294ddec1925019240946c7dba02f474d52662712dce5cc68a7bf36ff4b9060377b47932b5f464d9f47b02fed345da9d42131b870046332555049fcb369f51bc1c7142a269df5a6f0f518c1eb86c5d057725f7f8be0d2ea5656662345f0779babaee2cabd984f0497d483d0af6e5d4f062182cdf73ac928cab2e51c3d04a32ac80d1e2a7dcb0c0dc19f56693ccbd2f9f29a85e0fb94cac1eb345fd08e10dc47aff7ce3154b76406c12631b7d3398da8c78d20d8944676d0b4f94030324f840ee222eba448c416e1e002108cfa1bbf242a7fc5b1ffc0c81ff9eabd51e9d3ce0f6ca7dbd1ec7732638ef6816f7d59e996361fd82cd74b7984b84bdded8191af55fecf59bf3226f5c067d4a79ea3f450224224b8c803b74297f21c957aa5c34428b8c003af29bd0e952ba58a19545cdc81b1d3d9a993c778ab2a7660932c4ff1bf55d7f48d580756e4e9985a50311d440736def64635ae35cafc55022ee6c0794bd1598ad092032f637e2f19b42b330e9caaf49e7fecd6a39282039fad5445750ddedaee1b38af1c752ba1627453d5851b380deab375671dbe77bb6803ab5a5d63e5a82dba842ed8c0b84c77c16f2f66485dac81d39e3f0b57d37722a52ed4c00ab758510893214d49b94803afde25335568e9d1655ca08157c1530afa3cbdc960bb3803174ca724a48be66727d5e0c20c6c26ffd651bae90569d6c04519d8fb6d6f19b45a29bd3e1764e0556f8da97b29b5ead018b813733d95969214e28981979ac7524ed7ba1fba30f02e540cd5499570d558155c8081dbed93d264e7dc2cff0becea3d5fa933aa18548e1778b71b1579a36d63f92ebac0eabc6c9bd467555315175ce055e7962ff30895e1ea16188ba5774af62ba5366a81335761ffbe72b38594115c64817fa53d2d6529f73eb7b0c08f881095594acd75f515b8a8be7408ad5e5b05df0aac6a9d7579c56ce3eef9818b2af02abf65d55a8348db2015d874a75629d52d43a6e9620a9cab5025ee5d96851247d69608d22ce0420afcc7e4f2636fca45145817711dd39330a13177800c5c4081152253bee8f71fad655c3c818fa5a5b53eaf4d32756d70e1044e848a773a76c156d804f665105a654f2a4af7980b26b01b4be87cef42089772174be056ab51193be8d7593725705e6fab6fb4ce319b4a0c910f687123ed69e122097c6e7f8e16167473d4b84002273595e8601fb3bcd323b01eeea35576eac208fcc954a1b6354dedb25c148157426e8c323b4cf596d6ea3205174460b596baabcb52defb281743604d7e9e58526b0c174260a58c1d2a25a999fe5582c0078bc144efe2674f1d174060454fa7561d856bdb9a868b1fb09d4dd7630a5eea55e80324344460c3af385c0b98d101449570e103ce3f34a5eaac52b41c84111282851521250510299c70d1034ede98aaaf6815c1050fb835d14c5159c77d8dd9017bcafe82995bf43d950e78a184cc5fa6ec1c3072a4c5129e515b0c4ab3121738e093a80b39aede0d781944e6ea8f595cc7930b1bf0eed9a4f02def132db9a80123e358d4b5a3b5c50ed180972a9deb4e5d4fd59b8b19703255ba261983aa10a11b20706380102cac28c0880b19b0f93c64bca032e8d249d6550c2d26a062685152808cc1eea9aee73fbe0b1830ee669ff5e8d56fd690a190e4017a451622222e5ec0252d743419946aede66452a365884c263c70e102ce9577d051a6cbbb6af581b67122e0a2059cae10b28290392c6074c6b715ae3255efee62059cbb3ccfda5737e78ebb5001a35aba255ab808098d35f6910a7e5373df28552293328dac8990d010593387c46dc448181fa8e0d47edd9dd96fbb529f62d78cc6872918bdace3f93cd5c956b231a35557e05c8d9681a56073db828a12f9a23d11eb190f185124ed25fa870f52b0b2d534ae76dbeedd46c17d68d9a63efb6dce976ce10d10056bf153ca29e5b84a974a28189951f6af6b6e86b6236b67256732d40840c1c5f233552d5a260d163e3ec187d69016b39bde8a9a8d92ac005ee1c3139cccebfd5f71d40946bf5e61716db34969d828587c7082f1732deb4f08fddaa53e36c145f150ad184c83ec8c26f8d8a1d274ac24f4f36701336e8c4c40c5d04c30ea3253a728858d5842e367c43021582420a400c8ccccccccd059355ac0f08109bee3db685ef0a8b46596053e2ec1a9ad2cde39ca98a274d112ec6896b54134aed4311f591163ae9560fc3b6a6d9949c5144d1f94609526a15a45a52b4ce5120d2d3a20f23109f62de54fea2ea768fa4512b09260652aa1d5de4b7d49ab98e02312dcbd904afdc8b859e8038a8616f70145c30a912bb21011c10724f81e1d63eba7a847709f75ea2085c5d4bc1a912d486c9c2318f9af2ee7eb4ceaf434b236994c26c56cf0d108f654aad9c6d01fa32719c1291d9a9ad4a9fe0ecd2c82752547ab349149336e5a68d13042b0b062c4460c0ba87d2882135abb8dc7749a9644f0296b66a5d5bdf0a84d477c20823d15552aae12baf2854af07108f6735b901f95db059d1982dbd741e95ded18fcb43e0ac14693ff2563b0514286108c125a676d51b7ceaa93239b828f41b0ebba1a3ceb66b7ba56109c8ca72f07a9bbf3eb0e04176dcbb5b0bdcf1c521f80e085b69c9b2fbacefd3253818f3f70224f0a253cf669c8a41ff8cd6afc758e1574daf8d107c6356f6e1dfc3f67ed8dac2d043ef8c06ba996b5a39eb562c8bf27707b60c365f6a43c7ea7249eddad343df06e52b4e69c35c34bf2230fecfb77774a494aadbf8cac911c127ce0814f66ae3c68b8262d5a67858f3b30bed236ba1cf93f424bb303af6c3d74b4556a63f647d6cc42b048c08c074c26336850e1a30ebc69bf1473329d8407251d78293533ea6c71b5905a227ccc817da5830b7deaca569a7d3ee4c06ab55aaf1574b298e2329a04019389b18f38b075398616f37829aac495063ee0c0a551fb290a295ed92b49818f37b0af6fd3ff46d5524c374a44969b49e0c30d9c5e9daabce3defe8613f868035b9a554d592ce0fe93c9072693121b33da46c92236b05abfad0efd9b79c394b906c6dfa44ba19f5f835f10d5c0ba1a1d854c4a95071bd5e0230d8c4a175b29592a8567990f347067f1d2cbcca8bc335d821f67e054980cae6263a33f65640f79e0c30c6adda8e49ada33b25622429276818f32703ac5bca03468e7a0cb354706360b53116d2ef48786808f31f0deab5b8a8a92d8a8f12106569eaa3495d5bec9cef908039f745ee51e73d9986a7b451622fe01062ec7504947e5d7af7f45257c7c8151e94aa30c2eb4d2cb0bbcc8acb5aa069d2ac9d04717d878dea74be5577a2fffc105ce4cca374f6947dc02ef42542c99b49032068d16f8285410f2e35b32b3c0b8bb54b255dad0eafd0716580fa6f583afaaf0ac0a1f5760a3ee523e5aeb5f86d20aeb9c3d262d7d145e1518d56f265cf3f969b42015d895514f77c6565227f7a6c025cb19328e794e0adcc92cdb93f7ebdfbe18055ec62cb43adbd3ea756a64ed030a6cd768798c999b46059fc09dced0a15d6b6fe3894e60b3342d3dc81e69fac52670fbad7cf5856e12aeb226031f4ce05fe51dd51d75cef755a2123e96c077cad23fbf5529299e12d8fb31712dd7965b6712f8d6ff607ba7456b7e4e0b1f4860b5588c7e52dfafb23c8c838015211f47609436cdf154cd4323704265562929152fc5f49e113e8ac06b19f75baad4d27011111873153f67fb13eeab95c1c710384b237fa5060d0a81dba846fdaf879e78d288f0110456457d59679992e9fd0504c694d026b6da6a5da6fc8057fd173725e1f2016bf194ea4fa384c2470f58d5949b94bbfa57d07ff080cfa654aa96dd9d2ea51010022364012533f8d801b71a84f0cf72a4578cdfe04307dc2a5d3125cfd1aa62aa091f3960cc2f68145da73f69cc59c2070ef853d17f6b73936a537fdc809317b49d5ef7d1ccf1c306bc5cd37293b71f848f1af0de59682f95b2dcecae0f1a70f92fab7a534d9fa17fcc8055135e4a7d6b8e8c103e64c029cf24ae3e4df3ea2d3f62c097251f35422badf5a40f18705aef7372cb3ab51e9d8f17702eb45217734f5984d2870bd4a0c9470b58a14f9d7fd90561b2fd6001a3da55aaf4fa93e9a0a29d0f3e56c0c6549d2d37b8d6cba10f15f0613eb27564caad4d425378a4828f2a2febac69b350938c1b25e946c91a7380072a38e1dabe5d860b8f76512b760a46e6daf40efbd6da3ba6604cb4b68eda2c9aa94b119c60b3121e3fff2619a4d22ab709ee46a82c85fad20b4d70b1336ece9f1f5fcace48492b200446c815239a095647f3d55a9b98603d87ac71f7ee17ad92c18b4bf0eaf3eb9e8eaba5847232394bf0723c980ea2828ebba90e81110223040b2b28309964175e5482cd54c2c7559bc60f8f8889e00525b86c6e2af89acea85d4e82cbfe9ae1b943f4a9921a192f24c1b88e412835d3651b8556bb889948305248b39cfba1f1b2e84082fd959f9eecd5f578fd08deeefe7252156aef5d189309175e388291a236b34afab5b7fa9de1452318579953b9ae28573368cc3032bc600427bf532ecbc27b742b0d1c5e2c82959ea2d0d25f4a9a8c998818aae18522f8a8d4de63f6682927dd86cae14522589dbe6550d9f5925669113b86083626fd41ad5ef96432995c493140bc38045b71b4585242f7d7d6355e18821f971b2a07d7160f2f0ac18be73d4fc95b6b75ee1adee105213865a2ef2b7f3a086ed4b7d5a53d69abb582e073aea83f6798eb8f36107cd82677a9ba4ab67880e04cc88c31a9fa2475b97fe04f2a7dfb9c738aee427ee064da2b9d298fcb24634078d10756b4a8f4d1c14669caf8c0e87a95bd54e6edc68b09c28b3db03a9966061f111d75ad07be7db46b9ff4e4523779e054b36fdccd71a5592cf1c09ad4294bede82cca477760632ed1b3dfde68b137b784177660d4e2b62b0dcd51e6fc19e1451df8d28ff9c9e44a5fef1ce1051db8d57e19a49f8ee975690ebcf6e74d8d5aba8e3fdee0851c78f3689e2674ec0da92c36781107ce530c4b51552ef966c281cdd598837ed99ff3a6dfc08eca3244bde9a4855fdcc0be88c71fd91b940aa20f5eb48131f58ad992e6072fd8c0bd4e223c7e36a146a7a9f0620d7ceafc6dda2df927b5ab81d794622e6dd7a45e96155ea48151af63de7bfbc17bc3c20b34b0529530a9e6a5339b0589f0e20c8cd6fbd758ee5b9682ccc0768c52b474f5e1762a59841765e0ee752b5b4c8d396d90d2f8bb176460c45c65a5d93d268417636037879b4525a6e469a11878a53fb6bcf452950557c5f0220cfcbed69ae346bd573786e10518187f197cf3be94498aaf3a78f105ee47bad427a53ca5e45ee07c544d65e15a9770d7eee0451758d31d37c68b596ec7950bfce80adb17423554785be0df33673a598cff1b1308c1c28a9063a6f0420b8c99d639e54f9f73a8290bfceb522d4f691d7d1b8305bed3764de36767e6f415b814a487c8eca4eee5c80aecc6e4776ad9cf64295581735541ff594c6ad55ba8c09e692c213c6f53e02f6715661b5f83689d8895e185147899f44af9526ab66c5951e0c7d6ffde7269cd495894f0020abc6baae6de2cfb71a9102cac08994c9ec0bb4eadb3ab969f7bc8098c6c51ff6a738c2e1a6f022f5b6f36999eab4dae2130420eb6e1051318d94a8ef929ad65c2b2044e5caa51c192f0d617182130ce162f94c0e8f89637ea9dea14a349e06252636652a490c087d615b54bcd1138977b5a545c4468d93202a321d2cbc373dd842762fb861745603faa4d9f53fbc6b82522305aece4d62af923bb6583861613984c44ecb8e0c510385d8faf94a8326d2d0a81f1d40f519179d495d48b20f05ad39810a62e3a26028191f155fc0c5b7fc0bb6e29da47573ee0bc4b5bb5666a19b4df0356ad6a88c957ae535578c0b88f9061afa34a2ea376c0b6ab2e9545371d70aaf37b3ad15b4965a51c707a32afe73c5113d3f1c20b1cf0ca825499a965392c3f994c26ca861737e04e6fe6524acbb6552763c20b1bb02aa8b7a97f935eb77ee0450dd8dcf255b69361265585067cfe4d3ea672542a938a0de1c50c585359438a68ef0693bf90012f4d84fef4bb5a28616ac28b18f09bce82d4661a430ad1bc80012b947c8faab77643682f78f102465475d0c2dc548c9fb2f7c2059cd629d7cf526c91b60a5eb4801d1db9317579f6161d1114bc6001236e31c83d5d69a49f2b622978b1025e64743753ffa94b765ea8804bb6edaeea9f7aaea204905430de7e595ed4b9ae82a8e0b26765318abdf6eaeb145c5299517c6445995d05c414aca814de2977fac71fa98ab1050820a5e085ed0abb18f2e58f66866b216243d929008414dc596cb9e7ea2c897646c177923abe5252d7ff28818882152a7c456306a1d59842c1661ae55a5c6b7735060a368fb7e6ce51e5243f2762ea24209fe0f38a1e2ffda642695ccda0714511403cc19810a1472b4b2d354d27d8cda8d59679ce4965d4c81a490c11b38501c2097ed43d5b471945b9ab37c18bcb742555525559a62800d1043b9e326ec81edb8daa162099e04c459d2a660b52f6aa98e0b4e74c1b2dd495109e4bf031a86059a8f0d8ef424bb0513cc92873e8a8a2973500a904abb2ccaa72abeb8c490a84128c6899ee21a45e3f4b5e918508034026c16e1442ead08a9a31a5926065f4dacf298350520e1209eeb49a8ce5eafba33f209060531695215d07edfaaa312cac08b9220446c803426084b00c121a0ff2082e2bad1f640b0fa1f4e8083e7b89ccaa5552b12482348213fa7365fd6c797359de2530994c262ac604a90084116c65ed214df96a8f4286208be07c734ab5de426a2dcc45802882bb7b11d2e47f5e194d04afe1e29753e86add0e12020411bcebcca979bb560a6519591389f15f43c602b6304049494360d18031994c14e4106ca79896948a6dd679236b7e250031042773361d1a74d50a91a342b0a294b691aee37aec0e84109c26ad51fbf5ebd2ec47d662b81e4006c1af14223449d5af54bc0882531b5d319d652ffd2d108cddea092f91ed264340b075f2d3fcd4be8cc9f3074e68bdb718c5b2e9ea2233627c9001c40f8c8be67e4d7a79b44f0ad8682d103099cc701b365a8bec03a3ec65fbed9bf8c00715a2dd62b63a6b86b300640fdc96906d1e83207a60d553f28ba5727bff089207ee3554d0a51a324846d0cc0340f0c0be6e9ec552e239069d3bb0f13bf575caee6f516a07c693baf1cfe9939100a903f7c2e3becccb2a425703420776e3fbe9dfceafc784e6c0ffc8551dfde38e452139b0ab3cf5a8649fe94cba0711207160b5c5f2676151aa2f191cf8537aef3b4707f20646db0b2155ce4be739ee06c64743fd736e13aa62206de05e7a3e6f55ef5aa66603afe2a26d27f6715fbe062ee78ff134756b1d61f10ea881175349884ac94be83ac108c101481a183db9d93ef6978ea386117258e3ac072068e093a891de1553bf8b6905c819b80fdafd3ef556eea0998195bbad527d6ba96a9032b02de38a4e6f2532705b31af56fc2c5455670c8c909b621096bb63c9241031b01bb51453b55165942b4818580dea596816aa9a49050206568b8ae2ee32e5bc9805f902abd54ebaeb7a2929a55e60f7bb941c11bd3a9fb20bfce66ef7e966565031102e709f4c2b7910a962ae1c640bfce5905b2b4de8a76946d6cc0e881658bb519b9466a9eb5347d6f2072059606408115599842058604b694ff5f0ac1f950be40aac16d39f4b370b62052e5bd0bacff5df8bf6aac0a74a164d998ea3523449dcc60d2b0ef00f20f1111b3158530c2054e0b36ad093d1734af6e929f063fa9d2cadca39e282488111d54ac895494bddada3c0baccf146372529533b50e0923e152a35ebf71ccf1a22365a44c46dd098612130429c043126d08186c05e833c819359698d96377f537831007102ff9e7b5f677e7972d4921b5d43a42406428f00690297538c5a42b5e67b6b060d5dde8119331e3099d0c0820609495f3199280284096c964ae6a81d9ad26b13c8125857adc792adfe18fca3042eaa1c5c46a95b69340a24096c48993e2ea350baf30f82045ea4666e4b21744cb5408ec0b85c13aa31f55ca8c5086ccb1495102a2b39ca3345e0c4536875372e835d7e32594080108135332157df95f6514120436053ae509d4ce5faa77b640dcd001102b7e934beca32b3e63b08bc7a51414fa68a318e3e013ce521304320406053ecd8b5a1a57c19ba14407ec00ab9b7a6c6467da73701101f307af485095df1b45452901ef0ca4f542fc8246adc03e101abf579de0d15bb3e45236b93c96432994c265af00f203be0b6a28ea6ddbb6dbda20356a4c6574f9a2e8bc972c0a6129d42f5855697351cf031a6a0e2c99cde3ab30ae40605994d18d3a36f4294d6cc290a2507406cc005252f678fa26f39066bc0e907a9b4cc4ddac22b34e0b4dee90ef51164066c7ae6a7ce2343ad584064c06b955f57495dc185f40f24067cbb9dcc2c4477cb98bd8301e3aea2aaec8d1dd5f5772fe092e5949a7f2f86c698d204101730aea26b0769e3aa238402480b1879aa43294f9f84cc196405101630eadaa2d6ea6f94ac0ba20f4056c06b06df529af4a9da7007202a602bedcb4d51a6ecf459a960454b3d2dd4ea2e2fb50b54f06b975feb57969d95e3e214bcbcac356ad742e866dc852938d7af2dd3fb25a3ba4bc1c6bc51e9ac31349d3c49c1a6e74cc2d2e6172952a360740190c4a8f45146a3501c0c05822084410000a3e7dd0073120000000c148fc6431291603a2e3b1480044a3a305c3438242e1e120d06649138240a07c3a150300c454118035110c4b134c773a4034cc89c9d7724a9d6126750f1d5e05161227e40d761aa3afe55bde0076c7dd00c2ef6b6474b208ac30868bd8e316e3d48039449ba572a0ae9587ab02a20d2d49e9dac008ce700c868b5dbdfa9331938501fe5e7febfd56e6a1d3d5e0e0bc2e7ad84b83467558106181e2fffeb167a331ffb5e167bc302bccd7a846b83dac079f4c1a54b1ad0794728ec6a68edcdc4416a464e1bcc46814c4f5bd4ef85888a05c494e864c5bea83d14a43b0ef6133c9921ebee92fcff2cd910f1bf255228048e0c11743611c306e1c8872097892e6e40da854484d920441ec894956bcd46886e49de6a4a968f86889a60982111fc7800ce9572332228d474e74aa1d94a1e45da8b4be4fdf21c1bb29269808206a0ca022ca2240d8b08a129f427cbfe38f9b117b5ff78e4176cc2604d22e68ea88fc8b9c42801bb7432b55391ccb96681669f00ff258360c34af28f0a1dbd757d7f4c87b73dfe8e024980e70767e363aad0431c6fcd7b27f94dce853393f759a0ff1fc03fca40d834a6fce3763ffb46dbfca0b461dbeaef1874006f5708f5d0d61dbd3b5ce31ac14fbaba7eca92e856b6cfab86448cf976b7b02b0b0ec66a00b722ccc499ade612097b990df94d6dd9fa5e9b157d1d834be0ea99f277361985729fda5399b3cb55b00d0b3ce0d3a48e36033aff1adfb9d98cea413b59e610fbb94113aafeacb9e91378477466640d071ac740c7e655318069f3d3730079c20239669f2752600cb282b4ca28cfe323a4e16c01fb825289c070808604cc918e96809e48e587b2a0e6a61088147524b4e59cddd5c2f2f445369fcceba29cc0904dd2e1b76ae421993192784a712796e9c1a45406048b60f68a726d06985db813788637a6f7de3bc5975c7cb04a4593530812d9a3057a40a286255d603d22184113187fae13e5460e0406c0cc0a90f2914a643035e5455846ca2973332221e267295b05a7e0589cd58ed872ddfd6814cad389946472a8b60b74ff76b6f6abc5feba8522b3ecbef67d822da7ec2fdc114f3f2096cbefafbd21d40fde1190ed303f49828ac6c1246b93159d5598a8a42a4945b856e098890a39469ace4d912f0f07ba054c01295981a1988063130d31ab46d0b098e22adecab9faac07854475c6110035e06a3279d3280fe6070f379347e200917482a4de30ec89ca3143b1a4dec1d25978c71942fa2eb153093fc6e3da334c43a2a642459bae5ed227689d95d3a338e9a0177615ccf02f559bb00b91545277476d756d5a9a5de8002688f82d4d5055186bb9ecd85f944fed04cf56bd3316c24a279080c53183fc247e48ef20b655fbea5c7dd9d0bf1dd3a536249803b7b80bdc717a99b8c07d17af322b6a95d5074aca9b27303e3d5efffb3fd68ef390efbec93cf2460113d0de8d35f018d06c8466c7c2cd87daa22da1fba51f92d91b0f625dffcc4136a3a3cc3a53e4a3d4a71821c00b46f60d9819ad34bcdf31f64d2b73d60c9da7f0ae312eafea696c51f32c9f151dfd9e6ecbe93968044f21eb5fe236e8fdbdb95c1514f16bd463d2a48fd71536280f1faa3d7ba756c9ff037eb0686a072c4bc9c9b202a2c0b0d478cd287139fed5b04366990800feca20007c76d472782204754e6bbb81a4285fd03b28c85e3ab22863dda9ca3b7f6c2df76b77621ae260ed2b79dfa1db586ef6704827ac1e76ed8de52170b8a892a3c25c8634d55e6c8c94f200d74e841ae481f2a793e3cd4c97be6a87d1e716f59ca8e23e5a5d82d6a88766aff41ea8e8bfa71ca8b19b769966ed48c0d3891e0c38f473e442618199d15d66148bc84f7d7d870e07c5be3defa0d267b09837251e195999511b15e31d51c1c0ff5f46a134827c376cfa8743de6541ec2322b33c90685f5a78e5ef52727ac0bf318ef9a8dd1c3134754eb956425aa08d5a1883d367cf0abc51a46f060b59205a227c7b4b7d5606466312c606ab75d028ba880b7591c964928df70c053ae3c9c3624aa29da58b73eeaa9086d4c6c42b1e24f653b16d7be8595a86b5f0dd9fa14914ac79e2bebb17d7b95e756330726bb39dbfa307cb2df4e5cc5067386781447842635ac4e9cb52f4a470e898e4fe331aa097294f3d73845e1b4d087821843ea973477101c02e708e25394c4fe70c0beb8cb10f090b2bd00a44302404ec723cdef70f9bd9fe0f1749a226a165b23732b60738f6e6a30ce952e3b6aada87938e2c5fb0cd528d610eb5f689d57f8a7071df4b663edcd9659ce021839c852941a87770c26e3b985a6e45ffeae8291f8887e0e71327f2812953e2dc5996ea04799a50d27c15fcf320514438b1a3bca769572e12f0f67ec578e4730cab25152ca12423743ba03635f0088b4415cd99c727eeff5839dba65e64608bb30ad9253a313e2f05b051226b6683c76cf5381120aac6669dc8c71875038046041645471f723b7437d600713a54057b18df61e65fc94c7ac57b904fa0fbc23a0f0f1b020400fbe5c4b5f1d52a5acdc75b134811601508387a717f1a93d2520451d9b1a198a63fbb03bd71e7ec41fe331771cb0af682d5617b4248ef6821cd3cf2ad94bc534b138369606aadcd0017e05085026e72b52397ce0ba458d002bb007160740f2ea95e9695cac390aeb5492577e3664e585e336bbdefdb355e2e5a26c19d4151a1ee4f8fd89df5e3afc74b3bd16cc8772579ac936a36e7195fe1436b6b8f2c83868d63a807dd79c47af12747b7bf1de335e32c3603f9f4923da0d5151bc33a72b1c6f233a7f674decdc43f8f41bc677da92a8bbb45bf09b591c7bb9cbd3a1d8e70cfd7b6ccfeb5b839b084d70a8821a421300b22018d5ddfcace73f419cc75a86413192789e15d35ec56633c77921949dfd6fa70e50a4c6666a8fcf873d9ed730db203a0995dc6e19f39d29c609aaee548582c0f23e1d57df187a04855bd21d32d9f3218021874b0872f6154ef97a1c56aacd461e7a17904ffaf26bc4ab000a336a677a9450a99a93684c8976a619a324823e6e6a73b17940cb145e12d8123447f4af5bb7e7466c05a88a19e4a820458540f58cbb253444d845d28b56ab898967687593daed2dedf88fb6782a7b97ebf77d7eedd697a132b5db7a471aa035881d390285c8859a1343aba29f9263c737ed4e12853e1c8a837f72de7b7cab484aef863f91fb006552897961873407d019f3d72b42395b3ba75d78988751530e0704a52bf46f2840e821794ee76b0ce7713ec168399f4328da9012bd81d5a0f3c4c9c91256e082cae9019c31eb37407bff237784a6fecb06739cb11859ac402423c1a098fd0d3e6e9e20550e9ed9c6cff4300b194a985ea2994a51f8cd20a2df3bb37baa5f74d8137ecd6d7ed31053a9dcaee064a3e6f8473f3e031ea56a10e5e871cc3011f0f8a868d22ee5cda78a22c27ed3e907b8fd367a13039cf497342b609034314f2d6685ea1eec2f7f7a30b2fca732ebc81d644645759315fae7ebd789734ce83817b59b663fe4edf83b3b1c3e8c9e79c969415fa7f1765a8be4de0abe4d991ccd57bc8d921b20cc1a425966c9d24f077614dcc15f5d3b561553b53aa2e6beb2930523b199412cdb6f2390a10631dd59f8e16901cdd52bf60bffe939989d644e1d2969c35b07cb26cf0d7bba3e90a98e2e9428129a6544e440ac7abdc5d72217e093e3c00af30b17b0936ab75d8b7e44ea9aef1c884975d666fa58578919f1fcefa90482c379e02e2c50d955836c529c37e1474bf5f3c1c0ec335de2b89ff179c913b494a9f6bf2c8e5ff2b1f701bf1248ce8a54c613a52129c430203c6615a2ca2e5d25c176837c3a61af5f83474a30d660eaf1442e919afb6632e999f94a4c4b00bcfc943e51d88139efea41c8acff24a19c59c2da706d34cb01c7a65c6071206a48b75f3552b236a494481ae12d24b57f34aa1b0f81494250906b9d326758542bd288a03427cdb2491c525db0ba255b45d4a87e8366c33d833df7f98597a998c0cd0722692ca38705696cb68eb199c712959c0c1a8ab06f3b25f73ce40b888547ad31207a9eac8312212be1dc51b4863b8d2e0219559eed306328cd7d122197fe523c858d43fe68feae14cfe07b3f4a2fe1ae30a2677063268fa024e8eb175464d4ffdb5354bbcb34655a3e62e81a5e961c0360b408d3862be24c523dcdb147b480a19dbfb794eca1e163dae99034b9340a300baa1b0e9d63da24ee0a9ba697d0d96eea8fa8deebc36d65b96f4978a0f5660de2c0688ef9820815aabed9fd1900afcd129476bc57a4bd1fa5f4596741c684a4c2dd883531dfc738258d20ba3c914c3bfa9dd82b62fcb63d61f4881b8ccb841f17e99d7517aa59bd791a8f66afb09a0bcc0b1095fe90ecc11e9c936f7db30a0a01c1e20712c782c71b70fa6c280f2f8aa78307f7855ee35e26d14d27cf75ab4d88bc47a25ac9e5866fe5b83fd4841fc35adc21ddf207126dafd4ab88a565e44476c04648c9c6083536c2b9cfbde66086ed1714e3c3fab1b14219e87d35c6c9b4997568823132d0cd2a24cef7b1af27238c9a286b029504123744c96c440462aff5f76450c57294b99f7deaab9c47c1c1ba32dca49c334a0d09324427f5b33bcb9994ba41819baf2ca8e7f1d23b37688d5f43ad6dd8be6d057d987b5d3387bff4fbbaaef143b430d8ffd2f92705cfeaeb227769f558dba6c37b506c407368f789ed7615527147cf71881f5b0db02beece717063ec97d737716c17ffea2ce03a2d2f68702ef63fdf80bc7811386fa93c80adb21f2b9c68f1dd59c9f9a143cef0d896143051479ad75090d179dbe4edf65f69ade77b9bf2b624ee74d2ea4eef6026268c4024561d168101c8640387c366404be186471ce8dc16470e7fd0603c883455c653a9c8f1e62dc55c17986841493b9d2967f48946b5fc75ff837f218e65229e682034c2aa61cbf3e1288200aebc71e7cd621086014e44400344c6fb6787a3482f4deecedff42a06e646aac5d4be3574efba47b88f76693f830661f5c961125587148bed34c86c9b9b2a76caa9ff5fc3381576e38fbc2a104217868a7deaea962c21df76cd1f622981ea52909e61ad4a4fd9584f58ec1072d2ba9c2351540fef08fc4b3a4ed8a1413dc28d418c64fe6061656a9b7e7b2330a41811b9cf57001aa263563ed69802a3e9b985810b4e40e0884c071d9fe760b6127b221aa2563aad4bc91c76705824a18a984867d70ab6c5ac255860a4a44e6e7f051616b7aea00b988501f351a5a3a373f86a3a034846630a054a08c174b750e0b2fe68b575679f7b7126c1b86a1f41591da69a8bcd4d919d71fced94dbb188881ee124aa02c083faf098670d154178d9be684fae1be431c9cac1c0aea4974ead8b83dcd7d3113d78b4a7ea1338c99d2e0d5c21e8574722e37d9ecdc008da63e88ba7a419f0196147066a443e074631bb00fc956e0cf9ac099eb55742bb7fcbb2111b032ae359d0b0350c734f3cf43af19f73526472d089e5ade31a4ee11f31b52cd53621c35529317e57a6f8e60a8f0389a727d674eaf7c17479ed121afaf88b2f0d5fbb7686b089e784ab778fb29b0f2486c02e620a62893973c82f2ff3a575793a5cfe9c2e8f86c8aa2cb85277b2796139cd220e4947fd9b1078a67c64456bc1940a5e6e7621af23217d819dc6937ddc9bf82b605e98de6d5d8083434807478a89c0b02a0cfcc7fc98bd05410bc1ba5aa502f2d38da737a2a8f91f081d3b56f067cad6ec6856a9023dee1021d4d128c90ea7ffd59f27555c51282b876df6f8c610c369d95ab7b1020a5dab65251016d514a7d03dd48cfb0d0192c0a0f57f5ae3735eacdfbc1db2da1593b9d7f254e8c728d809af8e0aba9486874f968029b072182adaff3d88b54487941832779bc412010e9aba3449da013cc6c12f34bcd51391d58daf5701e1b3379ba5c1d7ab669a8a5acf3fe827388bf9c6f4db806f47825f83944f0155e6c062fe114f21e3b2b09877a78dde7e9b8f7bfb1246fc5c25acdf1a3196259d5603519555224155051c677d70e8a76edf375ed4226f9d6f7fd9d248ad7b386513ecd466c645f54dc3a67c0f72dcaee39d1ecc01bc62284fac471b2d6f7a66956648028c38e39a5d4f7aa88d1978a95e0b3fcdb98e558914950899346294b910a35569f6032aec75be3b2bdd24d136de5aa6e1c18c6f57874292c452226b50006d6779d21de5fa9ad1b105bceb2a26e2aba3936a3164d0687bba58faa659cd4ce7b1305b71a462390d3d6ffd134ed32a555fcff1a1177ede4259bea96aa16999937bd4a3fa56a585096e67c59f3c6ab1f01470f4a92c32131eba60871885cca2ba328f7d57cd5984a4b8d7f4f1f540151f30bf3778141c35cf863bc701511ecad7d548838a0f51399ccb94bfcb2f48f35fe49b94b0f572a56a5955b39a990ce956f8b8ef1f4f2472efc63e5826d58087d3e30f5694a8b2319213b202f2e4e842da0b61468f16ef10f105133f6beab918f7fe1de8c92f78723cc87d023666fbbc615ca3e29d4cd06fbdc3f67814ed4942e85701c038a326459ac7061307cbd6aa9575162a01267adf48a56af486ef879dfdb7133860ddf409204de853a83fc4c079145e22b680f7e753bd4ad5ebb5191b0b346e189fda126eccf4206bb17701e8db66b678a7ec29a6ce931b0a86426223fe2aa8a01310363a0a81bfe1384a4a89c6540e4540dd055af072e8cd51eb609ad92a0b4a979d84c7cc5aa86181016389d7c53849c8842130d80e6071bd542dcc4052a97e70875d177040a85ab82812c88e5468aaddf14f2a1fe9f020ac21ac2fc00cdc293d1e911095b981748ec87f40e479aa9b30836d4c0d81d2ce00c1d15a96fb4b8f96ca1ddcd4be4ab7b61f6c648ec8cd848efb88359f0316943fb5b844bfe9f6258fab4381739c4e1c2f33f88c860967384f8acfbbfc125a98bae8d8a92ea25089e9aa49872e9eb9f750cfc5e3ad6f5cb797d8560164a163493409b9c7f36f1c673798ddd83272a2a2c7a74dc9c63b1dc77408bde869d8e8bc2c19275cd468a3ae542e86cafc241602af8c46ece63fad06f210e4d20879924340886d67b3c4a491d4dd54c47c769dbb7bbc91745baae16d823a36c2db88e9044254e1ca8e29444c658c52116e0e52af3198fe77973cb481206ac00d8da29b54b62dcebdd9ac4676c15a009810354f5346a81811380f86fc8fb8207196f0831f20683210416cac3d74bbfa69165ab694420843e902c1842748e7ae8aa08e8f6972ad8f9f0f97a2b6e7bd63b1a9552d260dcd4a5039c50d6c35e326900ab75874854aabd87ac4f370d32f0700ff512912cab1c5d4c4461aa48675908321b144ab361fb044a74879fb079c8ba7f415d9bfde4926e3e83fb0226040154ae6e31d6c290a503e445174a98d699fdf3a055c0bd94aa8b12fe2c10afa4c7b5984831ef24329922c32589235fc7f694a4de00a494846243a28d7eef0215a3112b9c30f4301d66911a9246bb6e7819982ca1e06d9e80fe3d6e012df31577b3b29ae523f7eb275df8dfa983871858b2288e11cbda9eba6e9bd5dc9d4a0222295bfd508259fbd53b813a9eb35cc467a14fb3f56fb048e1f8be0c74b7517529e666fb98a4677b1bc39a8e4ff63e2e1d280d26caeebb7c600829facc51a02e56a4b3936da43df5b72fbce9b50f6ff8303b482c8cf09b651824b0faa0dd87c78063bfc28fb747c9dabd29905cdbcc0af38a312522729fac46310564b26ba11caa5579427b38571aed8df3e8f820429f1d9d8ccad1cf01eb05e15c4fe69e6cc00c485aa5fc213b257e22288fea1ac1762db2d6083a381a084be3c0976747eb47d61c5af366fe4527281daddc35bf415d25441ed2c4e3018ad6e2c816edb0ab0cf5fe6642e1c935328120b869f51a94241f456485a11c9ec210da7cb0bcf02d112ae72e617b72383dd0281de4230232e6716a8cae9447cd43045f81cd3ae0bbbd7b74dda9594fa3919c942e84db0b0343e6eea1815611ab22d24a8a2279001bf6f856b09d86a661430a9c700864052d657404cc2f54547d452ca152132c7e0059bc6052b889ad29180036d3e201c441b9c1b9df0987e6527aac45b5ca025a069c8d9427872d1993d5b644420ea9000d0066fd4792c04f5ab743242c0de9b1ed56b3ba7bf8aa2420c1084a033d7b1a8bafa620754e79697ce4aa56dc4fb29bb74aa317102b0716f59a6cc9a6d4e44c4f52d16a28070bcfad4c5f88479663df1a8fb2242590a1b04473e90aea8afc6d35f86ccac5527ae22d463a001cbdf19354c921e7d3509e4b4590de6e64389a3777765e87a0b04b52e975b133d46008dfe1448ccc9a6c0de0334b276616067c27d4c393968f1cf660e40c910d4450bf9687d6ddb81bac64d52074a90477e67eb4ff802c5a60008c150500e35f9f3e4c7cb8c690212009901a74d3edd526112e015d9062bee8dcecc1207f335953123cee0720a5c0cbe759edafd42378e19d1da9a3ef927a8791fbadcd38a0af7a227487c34bb8a25c15ffb44b58104046cb4c9212278246801292c34fc97c8db3fd82722ae766632925f53240db60a677dc9f77266b1f1b8a420e558624e5ce95ddd50ff0b9742d42740046302d7df5e85fc228438c68b7eb3dfebe2c7470cbd42e2b56e4b1143ef291b2c8b9555e3a1f45a7dc24ba800b55825b1d67a039ed782447cf3215f65e74e05adbee922826eafc4d75a93b98b37fa7df5a9db55351b5bcacd7b6b8c7c6a86bb8a02aa1e7ce99890b7fd8504925c4a228e1d3e6b0a1c3b14a3c22cb61a78761ac99c6d19ec5ba9c26ba273d35e698714a4a97b0a7ed301c6a452920358d66b48018e5baf595304cc0cff2468a24979521e1abee4d99b503bbb224c0589694eba7c3f05bee5dc53491fa0087af8c6ab272ec36ec0761fa7de69f8cba4cb5661f42e79a174d8559817ddf0c68628e15d1d166ed6be49c7943950478cdedc5c07894ee443f629307f7a40a8a49a042e7db875b5141086f0bb35032889ae9555112372620dcf8761bb7b6e65e3a887a832d5cd661e596f6b5b5645bb6c82ef65664e00238ab1cf4552d770da89c406b4932ce407802ce7486b12f34c98ce9025316b91d1ae3c13077e87cd91d3432ece0c3b4ce4957ea2a3d63e5e93f6c6a92d28e42c4a52810294819224cac9e2b0c21001a3ceb1497436745d2745a75ad3f58915a0fb3c0c2a01dd197786579dfcab7a2288d6cbf2a979018a50231443e77372c3d2e8a4c4344d1d38d80548376becccc4a91fcdea24181a334ae85ad84927adcdf446d8925a9e34b908cbaa93465d7f11bbcca2dcec6d6a9bcd4533f22c99e8022f8ef93a18fe9a89519ecf8459fc6f0733853d67c5a4013196094eb8c26ff93ce4c42ade8dedbd1193cdd8d287385c37e20a47fb07630dd1cc0dea43a4829e734ab60b7aa9d3509560282eae75b67665de72c2ad305641f8904b74ec400e23b351578c1931f299d5e86e6c0cca276d4c191427398746b0f7bd58786442d4987904ed8e0daa05e72a07e4723ed2371562dee352448524b23cc20bc1b61909227b90afb3ac490ae70b7fb2f82b48df6171f9fc2a2b96496e9192b96928b35ea9ce00043f5a29b48cb2197cec099b5494f6c9e0176cb52fa738f0c768d2760f7e86a6693e9e2544dd43a960ce7e63ddc05abf828ad91a4bf3fcb06e9d73fc2ec31f9f4a638613efb13a56250cc0bb66a1dd024a73fb2637138a3870c131710f663f610768007612f61483cbdff7fe2234ec8b4112d34dc5f61f503c305ca6b42aa7cee3641f991eb85c107935732ced84c01dba38885f6fd2bbe1e0d26ea04b16829100c02301796a8559c2eef8fa68739e93b82971ed35d1beb9fbf2824a78083632e36e6acf1242428e5bfa96969fda73db8180f68f6228fd3c128030ed7467a5955e8c0ebf2670fff89100c3d4146a480c4f37a087a2f7afd4c7947073780a3169cefe00642ecd5831782ccd4a6d13518d2495e46212e5881efd1195ec889b4d0ffc49800a5e2792226f18ab1eb69e140ecbfc008b4f59f3e164301b3d92780a20ca0c58f48468beb119629e9cd4685eda8dd39d4401067efd0c73cd7438a9e98d6b228b282d22d5f59487bb6d60a3d433eee597a0f3c3a0953b838ce6197967c1ae44c35a657fe9d7588a1cef2682fc0f7469b68ffb34635399f9292a8688727cd6016c48a94caa6280e58a3971713875cae6afa9a1ec637fbede9308e9c25731f63a9fbc4287c9a9ff324fa877428de1f828d0d14fe53657241b63cde3699c6c8c6df586ad1004fe607fc318732b3eaa7ad0a8851c2a41dcd96e6f1d82daa27d307d7c59a6a9d19bbaa7fd720cd6b280eb409bad0d0610e7cf3270ef0fde16117e3df396980d69c5f8e047ed5be617b52e368a0c6338f1a3982a936b348d9c47750b968a36a9c1f06c8d0e0337615677b27ac6ad56bdc57e555d58a4c2160278a95fc004c62f168fb9cf70a3f4edb2f7f9fb17901904f7994c398ccb922ba90527ade8c43af41845a7b77e34abeb909d95a32c2d14a6d7743ad91ced91bc1ccae073ad79a45c29c4f1a8fd544da6b75ea185269d4c05eaa0251a6e0cedba1ea0b46fc112b43a32118c30c2b6dba70c6a1024cf6badaad7483243ace3a5e9ef362cd8d678635a6d8ba65532dd6e44ecf650895801fe6d6a2997f81946330b2d5a5be6ceed0d38e9cd8a8dda7949bd08fc30a3e3ea88591a0715235743bc1ce157bf2181107905bc20cc8455597d5b301642cc187d92addd199c35daa78abaa9d7fa7ab2ca1fac1c1fc7dac502d2b3f4599cd7527b560dc69c41b11222ef2b3162ea993b5a3cde67092aaff0e2191dab55224b6afd20d6d5143c874b742d48ecb8c122ae2a746acd6f8d2e12c082d80b96eca4aee401f820a38e2e7f5cc7bbc81714ab4711f5b7fd702b26c25917f3c9c9dc0fa9e78f008d1356b5545a315d716601d8fb18a9043dae117c7f2370dd323c72140ae0e318bddac9bd1bf74ed17124401bbe259f3507c851769e32875aeb577e24afc45289289676c8875e6829fc04ea1f6d4ae9ce79b91362c9117b4e9a3a12b0021b0ee61b6d2dc41913d4204e2a6cee3b0479124a0eff42196e5ced3859118308c03f23ada615066246480f1ffe4252b6de82b6b6ff27aa01c0d0d0690a4b5959768b5aad340e19aa8b466ce2b4d9c7ca9094ae10608efeb2245e88929586ce2708ad9adcb49b8936e1ddb3ae1ccedf5c1c2a2613eb319e600ee024fd130519f4981b2061b301843cd034caef5407c3912938d1342e0108fa4150f5872344b61ed74a81a1a0bdbc79bf6176e015ca5b2daedadd68ae28ef31843bbdf13983398d404d9d6deeced15492f92d84ae389344d266ddf2baecc684aa8ad2ac6b4885d82e264209ad904c570c8745c9f6fcc91baaf499da9a99b0dc6da8da682de10f71fe82c957539cbe16800a04bd8786617b2d3344903399f59284a8a08b398a500710dc8523644dfe70820a4927fe2f52173fd7c32661e7bfec5c92202e90ce6494e6759c979c99cf2c266270c9557c1f0aba6674c74035281698007555372d9eade152cae282816b678729f2d6dcaf9a3f8292bf6c98bd734259aa660bce4db2b606ad3e31b1b8937499cd04915e5331fd0106e7cdb2615ce5c0384752fe52fe0e26ebf6d3e6f189293bba1827404462b8c4d212e8ab337409e797548e06c70d184578f03b98977bdefe8b29e9787fd44d811cd708ff10aa3567b235e745b0fa2a5ed8bc8ec8a9867e9efee4a1f8e7eafcffd05d8f1eddc6a4cb7cc9284d934404a0d3857faaaf01ee9eb44e5b41e79d807a9f65d2181bb8f024f0023590be08bf35585d0957d8bf007047a16729b5133fc405d21dcbe6930e19e5fdf6e1dc6839dd3893a298500e4ad18a83d6f43e74cea68ff1ead6998faf6a0722233ea02f2177d93b515f3bb127cdf389873130638c0ac073766e969a632a5ceddb710c18ed89066d8511609ba7bbb86324e429e28976b1a1f4f6026a69a3f1ac4f30db2929f54dda36752eb715dc643b5e32a278ffb1cd7642ba77c6ae217c4a2be8c6213263cf5068106fee7943824ba8fe311e89a8a3e273259b1cbf35502c07863b6f74b245cee7a84bf15b6e7bf65efa8b4f1f4d565578854cfd202319440e832152f717cf4c9fa99990aa369a2fc0c09005fbbfc6840e98744e1d4dfcbab6c36a413c11237213577c49bca466780b5c487d09c5eacb400d38cd2d93065b762fe89c9d9c538acae5adf048663dbea78cf7f810d0dc386314fe79c415b58d8c21f05b4553bfc49f911c27a9e9ade20608580b4f2ba69520531d4016d204cfe59a99c34d82d9393ebc61ef0e18ad56e3743a5f862b2970982a5f90875dba298d48ee959c2571d5dc0621fd00b5df403e6cb528219be7b8909e183941a24789547f82daeb48e33334c049ca23a9ceb2e249cd3dd1cc8e13e90d460218500db501727664014759c694ad7d98ffe2a7c92bf7aa9c0ce189bd2e42a4cf7190683f14ba46985ddccb042d67d045924a213670433d9e9840090e70be033b8ad3e566d3b9afa91335ee154254849c3677d93079089f5670b1c407e39d02e53a058191693bf1f27e77b940837474eaa785417d9285442ba01e728938d3a23b0943f84e4b2029c0275c320639632e410db24465c5dc5586e74ddc0684ad2326941257d01151472dbb6e0ce854e4f1b0c7728310a3565b87737e85a4b4e99cac96e0cafd0222581310ed3740a721a427456f49a921f7138fb4be07d75f2adc813a6a93181a3e5d5cabb29697158cad6d6a32645797d4fc9cd8dc2856ec53d27aea5c1210749b12fd5d7076cd7edb44b8cba459e1e17d6a29451544037cf62a990cb35bd6e70ebea1fb5c454751f66a82ceca78771a860ce281c22e5f1917f2910f1e00b02d1f110af41d14363031c38eb5f129381bd61e7cc52046ae2b0c96004cd6bdab8575d6bff447ee2e61262cba8a686348e54e16d62105786234167a25e9123c815320bf8aac363343db4620e1d399068349eb31b149af1439ac1a9cc3f0e6e8db102247372df351667e86fe735118c3cb20ff39dbc4fffc09505792be7d67459b37b9a064698b300f6595c8e8aaf9d8e7debf5956166923d2aaec8d1ab20ac207ce47b4924269278c7d174db8fa9a0217435782af78778994e8b411780da6ebd0c6836d699ae2d374801b3a40b0c515b71c3fbc6ad76f473be166761ce252478e46c566fde3ed15bb51bbec0db628f508b81bc54cf97878e3d661d29f4f7126b164ef1dc14ba546f2112f76e140f34c73cd0a6ee9ca3d1cd5712a7a7a4cfb4ee553611ff42b4b2b185523dff11b7a77773d83d5d89d0d461a518d6552312d406807d9d72821d7b6263d130c7058bbdeedcf8f7520416a13f03011417086b56368d6f7083758079c4bdc01ba82af6ac7e627501c3fbcbdc66d432986f5b4715cadddb50831672d87c7612d9486e9135dc8ed3ea8ad89b3ea7cf42769bbb5234bcedddc4241647827bd5041aa100ae7a0bbb0594cc058d7ea03cdce625832e3e06f5a41e65e5f585b7cc4e542cd9617ac0abf33e49af4a27407f0fca20964fe4a442285a8d5d72fef9638b6eca9d1cc6322c2300d38599010dcd1192648b759ff6fe77045056111c26c22de9ab88500716241d83ed0729c671230d461c7f2f0246ecded0bc7078daf91c9f5818f5dceabc30abb2a245c50071e058d7e521eaf0224a6b98054a0030cee412105291c1749e1a83a21cd690e07fdaa5a882aeb629a5d0eb7d7a7e9d03507b56c86d30972001003cf289f598441f8b05c3b1c6795ce0b02d7b260343265c18f9efcabf1abd8a8a3dd39c5760809e02eca3f2fec96434e3646261c4b87d9923f93198cf6e448943b86ce27c909a34d931d663cae3149064278da609d7f53da77eeb438d99616c7058fcc0e75c427aa8a47dc67374e32c06e623509f7bb859a82b3932784094b6401ee15e5b947de631e48413a3f7b31ff6ee29a50f7a60702e9e356eeb4e6e8314e344dcaf5b1cf887dba9f1b92831975e27a551df6daa69602269a33173502c12751e206e0710615820f90ab56699a38bcebd85938e0005d52f03c74de0622554e0d9e5464759c022270a061d541add244db3f08c75a9c8d32246fada43972aac80eb9b54a773c7aed40dfd15415ce98474f5dc3238e2f942ef66e0a614692773799ec154fe2be142fe3503a73fde4c284ad9ec2d58ccf2139f7648a2cced95e4aea15a62480681221523f32683937c116a2c8c4bbceaae8c48213a59bbe0b8109e935c2c5df7d5e5b7190193704c5e3452279657db772adde8e8e943409aa8ffb9d0468cc72005115890145f969a459f4392d3c657a0e5006e3fb4f5fef24e64b1ab785f21160b870c0e3df3ea4a25e97c6dd8958f09c79c8b6f26f13aa713ce3cc1b20c67e1371df8d90980fc427c094515f8366fe24b98fa669230c7e6218f42f875acaba0b8a3807475313fdf39b0c079fa5d4a1e0dc7f3692b703f468fdfedb9345f69d3a5fefb6e00f7711621b5a6186d24ff9240a286adc4a07e0026073bdf70e8fa051c988ddbe008685cad3c013d0ef00eac10389efbfa069a79970d563410840d20f013b1db10bc04e73f7b2e0024ca1451f1f4d6ddf524e99a73a6cb3aa81714da646b3d5d71c6e2509dd3be3037e13bc86f3c0b86e6c6a187d51753b478776598929b7bc6f503f482e97d20b94717deb30d6242f1acd669f400d814f8d46efc0e2217138e7651d96397e48941573bafdcd46bd49ebf3f22d37402e649df9046eec9e66d182cd58885faa155ab1fd10f813ee39ce76575482ccb2d84e75420d5e5b629935332e0d13fcaa0a3be4fac4636472549e709f88ca382af5e5c029f8537374501d17b1bc0fe3c3d698ccb4ba333fad7f012919528f594a8dbdd49239670dca94f938fa25298c78aa35a10cd67edc3ffece81a7c66b1d2c29cc7700e6d76c6b263fec352a9abf8d2ce960e675bbb36f21021f12ebb23c42c015be37c1a1b90d40757e304a01878464908ae7a3b20c9cfa1769ecf010611f525708a79a42de600296a85c46ba568a4e4affd09c30b5f9b8cbe0a8e17be98a92522943d38f54bdacc18563ecd71d77453fe7c08a273cde33a6c74432135538b9cf6c1913fcb1c67253508780e73421aeb5bd3a2acb55428a40016cbc20217032d8a87bde13192e09f9e113d5f3a3bb2f28706641e9c8434ed44c6d054dd52234b68d86c46df9c25deb313e4271607c40b35dfc82e2847e2fef50221a7fc51cc902d381f0976dbda114e5f9038115b3748daf6a69244653cf58c2920e97f748bb029a569ccca468c44f07ba674273b0d23588394a8b4bd7df059188b558f4effaf9490156d619a2b638054dc04f110d33aa945e820e505651336ce6da7579855b41c965da71af3ccaa85ec010618ca0851f0e9faeb5ed850590bc7357d60522c06d1b63bb45e605bd7acd2278ea4642d4b04703854342538f61a95902a6f7b39635b53504dec1f75efcb343b42f5edda7dfd254f70da0e64837509e5091d4a9bb00ca57a11b7d9fe0685feaaec9afd8fb39abc946a892c34cb2bba6619842173ce422e7d473164c57472929d20010d5fb39fad31424a27b009dedd5e7c106190aa9a4101396f03f6117d7828a61eb2073d176271cca5f1330602bf62dda29fe83c99ab9783a807fed170dc0b302ef2faa9c97b34c414d82fd8c9b70e86b9dfb4bfe5f10c0f38016a62840e34887e1acedb886f7706ab902fde752928df19819853cc9c2b66d7afd82131c35815a91ec09ac14682b101bb3da639d633cc905861d894304e6227c26cc36a83d904eb800d1e63387665989358916588b2c560c6f43fe3a60d166320766a1821a745faa4d605e67e5147e24eaebdd32923cb092b35a0b5950237d481706951c4a0ef88f6e8cb7566a06c5bb479b8dd311d87cd1e21f279382e5238f6fcc8be0e0ca4f068e794dbf8f6b13188ec9d131300aff00e814f7ae7b9b6ef3764606a898e58b37aee2c12b698833dbe1103e78abc29cbdada14200c559a6f5e9ebeb84774ad5d84a50f4b5ad39bc2ca1d561c3d2a7d9dec72cbbb5f15c1ff4cf6f00c3c92851b1173ce91552c170280e2bc2e241607d23801ae87151a3de5fae9ca94d5c60faaad2f67b2e5c7c0c544094b0004198d86a8405b44cc6404c800e56544573425201ce7e0c24c3a045d1a63f9dee880349bcd9353dc85df95ef71a8b54664263651a305a5a8670cb080e93b51c669c37ee5c4dd74f7ed95d728e3df615e6055d1fa631ef92e19e30dcaafe89422c7123386e99edb173708aba2dc1fc1491f3b9175bbeaf7c4a6a972951c3bb38002ddede0afe1eb35ec812518cc4aaf1b13ee8377607ce2ecadd14d2991a93a1634c47c44cf87f6122e860589c6529ee65397725405d010852acf52209bfb3b9fb0d16bcf51d95414cfb4bdbdbbb228af72e61ab4b0c96496a8446221afb809365035e19a577beb267bc60f6635678356e25cab4aec4cc03175925b691ecfc7b8bd198a31a5cdd9d699f591905b601f149935c538cf4659479eac8924d9f056a1025b90364202cda6977de216a77614f05f94755044d3107bb99cd89d5206f5c6a6237a73203832bd22e52dd33198807c69eacd39ab72cf96f7aa0493ecb9843d9b1038c0d0aba8441bee85992d06e1d261ce59e0fe47c98b0f127ee9dfb14a09560ce5be6ccb6700870ff2ef8886268d34982117aa4902764fa5af4686481e09896917bc8fdcd468bd13cf622bceb972096f2d51612d59db86033a957d5808e540b7217bb3dc448a5497427955eced417da5f7e435e4f71edd46707d3fd17466c8613e4952fd34eddd84c67ffe94351a2978a4b99e03bb97326f4a409a93968f3a49c49a9042d62db60a7b7cd86d42b2f08fea9c7073a0c4ffefcacd7a05cf3e0e7d6841ab9b7c32559b8262d39f3cb6de38a328d202b2468e6358a4594dc83d36ac3a2e819bb182af0db45c9f4f98cb6ddc34d1c10d723386c1193d2da6c5416963626ce324972f45d018d92697417b360b4664f5bf023e7004b10b3730eeb4d0013cc3333cc3333c1a7cc15910355a23dbacf94b824c69cbf27c62114ed22f28294999644aa2811f00f63d0221fea989087a0f7d0beb0b840b9ae036ad4c27b392ad6bed4cf0b2ddcf837671a5b39c9364430561d8480118609861a6b2430726e00b1f98e0a474b15567599ac86df9b8041fa2bda4963596e0c5b47b42db675914b72bc1d9b8aefc961bda750ba204ab4cbeb8999ab9ac3a0b728c61038c8f49b02f9d6a3057b5a5f43b50ccfe865a3a7c4882cd2865ce185d9bfae84f52ca8e1c2650f98804a7f32ba5494dcba132cb0724d857af3bbfe46a0f4abc3b7c3c8293f742ebd6a89a546a47f02b3db7d0f2efa589d7083ee711b57fe9c5284c6304ef39a7d4927e0d523ba3554cfe9789123e1671cba9f429f93945b03aa37ef1e57698e2f091085e945fbe193a88e0d6a3bf27fd82978bccc721d82cca9cb39ef057172243f027d4e5297d6f388a498e9464821c639c1832301100203e0ac1cb59aba82ad1f8a17442b05ad6d76db2468b12fec72038cdc9759645eb38f021084ecb71a36b39cbf84184816045a631d5e39de12f0b083ebbd34d6749caaf171da0b80e5044505272b20345a54b4a566e7cfc818deea6aa9def596bd449322363a58c9494120840111f7ee065fdfac25fa9d2f2acd4075e3d4be7f2ca8c19d2d6c1680b1f7c60b50acfddac4d4b953a43f48f3d706eeffe62f4ed6f5d4f927d9ab9f5a1075eac8f326a7174304dea3cf062b9205ac8133277a8375427e2030f9ca6cba4296378ba51f7f071074ee5bddeacb54c1b13d981ede89e1f8367fa8b4227c930c718c910f151075eceb577665aeead311c7cd0818debe29bda94318e6a7dcc81d1f2662c2d6b5c29422907c6543d47f52aa3c7288f039bfae9a956f3695da99364267e2365b9410e943252529409c2547cc081f70d42b5924aafe61c1c010b6ce8e1e30dbc1a6daa3b081d3dd9981f6ee005cd59dfab762dae37f86803abab3377f8cb546719292927371ce52e0d1f6c60cd4db4544f26b50f1a1f6b6085dd8a521d744e99bf9364a906c6646b73ffd6e2e8320d9c0c3a66d5f5e248efac9364e8030d8cc6d213ae329feae018609cec4081c1ca8d1b20b001860d1b60d800c3c631f671065e7639b8fee052af2ef32419173eccc0eba4b41c6588ced27d94815152f9b9485dbb39a597850f32f0bdc95b7aa9ccc57d19032f426a90671acc4fe629860c4c5cf021063ee6578ff52f66312d7a92aca464e59ce0230c8c8f287f4f52b9686d3ec0c06d67dda05fbdef5df3054ee820ba6c8554a2f6f9f002a33a77f505f7b6914935f8e802ab32731e59639b232217581df77d852e13eede6f817dad5798fefcf3575b0b6c2aa9ffa5cfcdf225a118288d5651e97c959405c747167859576d949ffda2fa8e055eabd2ae25b5597c194b57e093dd8bf5715db42d2d2bf0a3c245edcac58e2dd72a303278cc59fd07a9b5eb830afc86da2c4b7daab3384a480c1998cce0630a7cce626acf9a2fc88dad31c6982de2630df6b40cfa5679ea430a8c8d2c7d4164a67a29458117b46af9429f0651a6f401054674b81275ebd25d684fe0a4ab96528896a7edb23e9cc0aeebcf2964d7caac5627c9ee6c90418256d9f1d10476b3e5a4aa852ced9fe524d9199fc33e98c0ea696e9dd1346b77f36309bcd42cb56ba9e58da7f9a1045606194d061db54c3e92c0491b0f1763a70d3a5f1b6490a0a464a58c949493277c20812d6dabc9cdd5ba8cf711780d369e748e52c816e6871138d3527a9aab4bbae45f045efa90aed406ad5e54bd0a1f44e065289df4ade97d509d958f21b04167f9a6b4dc84c0bf8b6efed3621f41e03cf7fc7316f63d3aeb0308fc08ffacea55b8a6674a4ac4f0a10623c293667f4ff78213e55afabe73bed1dbb5c18317acd0f1e5bda855ba56d72e182d4ba559b554aed4a7c030b13278e882d78f2ab3d3576b569d5cf02da66bf174a4f0b60d176c6ada4c17f37af8676ec19f7aa9eb5f4c15172537810d3054f0e0610b5e4a57225c55ef3dd7b5603c879dfccdd7cc59a5057bb6b234e697446b179d052fb6b6a9091dcb05f14e16ac52aa34d8c997bb58b04a54c6dacc315f6be91d2cd8d4d9c5f8f26dcb77fe79c1e3158c944afeead49cc4a4e6ce15bc745f2175fc846affef5ac1bfa06cdc34a3b8cbe277ace0a5b0974fcacfad82ad9722b52c07a141c6a88235cd4179a82c2d5d2e53c1482d4b7b0e9a65765422a282d1e65a5e97a56941bf86780ade74c894e31fb59c3e341ea6606434a543c445f4058f527052cb3c75599674da8c23928235d7ab94f49843a9f3208ee27cf59216d456bfa2e0955e150fa2692858d37af73444d5a77241a060b47d6ccfc275b4cb297a7c827f97a383527a237a82133ff70ef275d34eef0427221accb348115d174e307aebe2f7418bdf426713fcc6740f2d6b46136c27ef249a21a3668fcec904efe2282dfc75e7d899c204e37ff2ce4c78cadee025d82c279db5f4ca5fec96846809debc63f6e9777df44c2578ad35e86a51778beb983c28c1bb2cbb98efc5b357f55ac36312ac94374a0bad5cf6b83234828724585fcda576f3c612614682d39973678bfe3b72b4182578408297efaa3eb775d62b3b28783c8253a55e5ea95eaf8c4194040f47b01f3c9a6bb59d3af8c9a311fc07132d473775ddcecee0c108be36aa6ca5a965d07270117cd0721475ba5e8fd0ef3cc143118cd2622e47f3cf72e89744b0a9a5cd9d6446993e4328292f402686c303116c0bd5e95afc0f0fc1caf6d3a6763d43f05a3a9d594309cfd6973b781482f10f9ab46c1b73bd6921049f2ee8e43a87102a473808368b71e346ed04c147a9be2e4fbacba27ab135780482f1349e955e51faa268e7e0010856941e9d055b595af5a6c22525adf2281e7fe0ebc595c2755a136efb81917bdb4a43ef6939675df0e803afe6e297ea9099d328f9c0f86f7ed69e5f556b760ffc79eec910aa5c9f6cd103af377d856d5a7b596bf2c07976a9a5be363c306a5d54959f05951fbc8341fdbdbd989b1d781bfd7daf4ae7a85099e05107ce056fd1558d6755fa5b82071dd88f9a2b33ca8cb1c56d0e7c76b832d71b3b8e149203dbe993bb283d8c03e7f28bdda965ad6b74d4113ce0c0ab3e7d9f65feb42ba4c7e30dbcd0f55a9e7a0d757043f070031b45896a4177ba868adac0e9129a7348d5d9c0bda471859f69f184f0ac8175d72b639650d1a76b35b05ad68c79b59cde5e0e7aa481cd3d29947e5739ae231a38754ad428fda029789c813fa9ae2f0bd9e28f7031039f1d44ba9c84bbe99c2f032b6fb45c705d9181915a1e5ab51cd3f49f63e06bcb7547674162e0d536cffd56b701868d1540788481137a74b297f91b559ec0c027cdb270ddd99566907f81d1c2be64909a469a8a54f0f002df510b9edee2698e51ef02db4abbf851ee4935aae2022f7ebb79f5b627cddb16f8ed16c7838c7dea9d24070f2db05ad6628eb6bad4be8b9a207864819784d249a5e624f23f080b8c962fc8ac2e352be19e2b70aaa7b3d279d5b3cbb402db1be548535fabc06956e9ff674afd7347054e67b1fbc5ac25ff251921784c8151e6499310ae4147cfc282c71aac165d559ac876598a3601c1430a7cd2fed95c7a0c5d5f14d817940c336f515d561e283022c27db5a8bb1c470686c911c2e309fcbbded3ecd9a9256f27f072d82b97baaed7c426b0ad7632b496b5a09a2526f051d9e9fb30a9e95c24068f25702b3fd99fd04f5b6a25b0f17c47c79665fc3dedd1c12309ac50a3b15473c77f59460d0f24702f086d695a4b9da9e5c1e071045e16d35d1c9de56971311b648461d0e0610436c735796fda59f87687563c8ac0e95c4a4bd5ba5bf6fbabe041044e348b2f6e6ebdba052d59f018021f55dca3523a768c997a0881cfcdb25321db94cc790481d5ffd15bc6184d355c7ee0010456a56b8f8e969e5de83cd4e085d4b9b77a1a840e2f0809e805ab5dd2195d4c1d8d62f3821111bfed9242280a09d805aff3764bbbaaf5e9a54d75c16739cbe052689683c717096c8061630460d81081e682737da73e499daac36f5cf02dcb18f79478cadc2e778704dc824f225b5099b1b705abbc656ab9fca705b525a016acf6bc9dd36b7d3135b401c61d2201b460b3fc9d931ca53ec7471db3e0364b0bca847469a23c59f0d2457dde5f7e2c58d9d9d3a6ba2435e8cf1286d0a4c50d519f4670f662cb185cb6ace4a63705218ce04dff2bd1ada432972e5c04bfe99fb42c8f4b19b4a88483104570fe2fc66c4a7ab69f9a501092083ecb12ef14720f41049feee55f8db1360bc2c50c8d430ec187d8ba8e56bac3e4b7e36fa036c820818d475121034788213811425d9f0b5942cbb9722b042fbecb6e15f33dd11f633b4208c1893e2984c756a55cd61142c820d893eff52a3f75f7ae6c081104675aa7e597fc3b46fd4e92a1ad9040705a52da4f576779aee56a47080104274bb71c757fda8716ff03af3bb6b9cc7c1ebb34674108f10377abed3579fc339989e7e8e5554c6ed15c481f1811524493d098b32c274d42f8c068e9a7cee49dba293c493d08d903fff9252f1d74c3bc4df6217a604dcbbbe3482dbf62ee5176a02421240f9cd0d24d37fb8a6731f38e073e9a7c61bba25968fa310c2177e0368792ab7e53069942315126a792b2a3056fa26325043bd0e092921d68bc1542ecc0b6a0e4770b1763bd56aa032f47a5ee2b42798c1242e8c0bdd2fcd0427bb4e4ef1c1891c9c5131d5246fd9224089103efd175e997e9751c5fc58155526eaf961e5cdafca21b84c081d32a342619577396d5f8065eb335cbf1059de3b86f087103bf26eeae253b95103da40dacf697397496b4eef64f8e33c6b811c2064e93ca1852e934640daccc392afd5a94eeb7cc122342d4c0099d5a3aa1ab39c2f427c95410868d3684a4813f2dec4ec54474baa404cd10820636691773d2abdb74502e2167e0734eedfcd2c95129fa1033b09ba54bae1dd26d5f1b5206c6a3d04aae6b0e5a8a4b0819380fcdded267fc6dc19463e06599ec4c6a6b634421440c6c7814712dc91b6d6f1858d932546f8e2564262a292667b44ada0942c0c07ee96e793af5d35b3229215fe04508a177637dd607215ee084693bd79dcf358b2d3d6382902eb0a9c5965f84942a4f996e788e2ec1182c2809e1026f5a7c59ba8c2efda87892ec7780b2621bb205e36acc92e897836008d1022f9bee119a258fab859f05f6b34ffc3f699921a4586077a5dc973eb82c6de715186f2d9fd49feab5163756e05b2aff903a8bf7d26609a902fbf173e9ff298ddefa102ab0e9648c2ba3d24f81535f2f376dd3d19ab306ffa55d8e7491141817f44ad5975b4d741605464743a8b5db57a32e2150e0a496cbe94c4cd4e51df2043e77b5a465943ae6eb98102730a63999d27cd15d6526a4097c4ee3319752f3cffb843081f5f4fc1d3a0769a35a4b60ecf34677faceefd10a51021f64dccd13dbd1db584812f80f91f9597452da5d4c08121861a32f3b9e8b9d7492072147604c488d5a5c2793172146e05c6a796cbd434beb31252525480f01901052045e837097a347b9db0a4f564a4a56fe06296b841081d749adcc4a68ab37e1870c8171df72d7bf39949b9eb712220476b54b2373d66aed525e0e4282c0af877695d935d528971020b0ee2d35fcb4f849b29323440dce3ba308bdd95fa88ee37798a0a464042cb051520206905ef0392ee63493ab438ae377a0989cd12a682d00e105a7596906f5ac2775f6bf7276c18b6c59cc5950591836c808e38c66013a2d01882ef872d7f1655976b946f52b7de30567ff86522839100e4072c126d150ee5a4cff18a327c94c3e478a1d0892a91832303901082ef828b524e37db6db1b794a0ebb05af1aa5bbee7c79752791310214d800c34609406cc1a8dd14575799dcf6ad059b844e42293b4c6000420bd6dc5bfe6f90ed2e894e92ada9a033360bb66588d4da62723987ea24598ebea1a30420b2e05d7649cdb3649ed5b920b160cbf48eab2d97a9e59d051058b019c24e4fe816c82bd8f2a4f3cbeddb966a82b8827df37c2e6f9449089d0904482b1829b4988489085fad5b8a00c20aeedc5f16d392091995d22a38cdb2bfc67454f3e9270944152220a97800082a6c809c020320a63020a5b871a3c120c5282e00220a5e4b51a1f44a17fff40f45054040c14b755b2384ccb2e5b13fc1eb95224c4afdf184490e4c2600d2890880704202209be0d5c52434b6a0fdb5189ae458263856fa0c93dfd12a3b561035b192c6a380022099a0000826d87dcd5aa49b99a697f91c280a47ca72862e618201104b54820fd342fa66b85c953a20946035987c695db56779e593e0c75c9641a792a6f17d494c0024120f008104a3aaa1640a9df4be500204c8234c2000e208078034829732eb4cad5c50a1c2250d29803082b373293fe650832c821f5b293fc8f4ed822a4f928128827d9983b8ac3537089044f02b7ffd5e5afdb7a93f496610221a022087e03c47a499d413a159e6d80b4ca08262724c07a88262a263e58018c2e40b9042b0c105b7cfd8b5265bf224d98d1b6d924ec73b1a20846000c820d855f6ba3b67700f2082605de8acedcdc9b47d4d079040f07216b7a595e75a72b9650710402800e40f20207e30a900481f1600c207141d2068153340c000903d305a9870f1544bc485aa0756a8973b6b175ff0953a397a59c903e3bd5a67df77579a2a1ef8deddfc32b38be37abb03a783b6a04a8b769b74d00eacaa972f7f740bb2745307d65f4e6adbafe5286a9e244b3140e8c0a6d4ec83cc81f7f596a3d9c99367cb81d339836dca975433e84d19207160b4e49e1edd0307de4fcbeae975c61e11be8151da827aff13ea37b56ee03b6ad5fd93b7a6a50669031b958caae4af78144a0ac206feb3482195eaada4c46465e555501a9a2b2b08b2064ef9689df3b96dd49ce99d0840d4c06ddaee96b43769e0b4bbada87f4b264fbda0dc5066a800040dec8b3afd48a9f5af960f809c815526fb4db75c372d3c666083d2d6a33ef6e748175f005206564f66ade5a0490751aa3b1780908111f98246f72cede4ed50691d07ad31b049282935a5eb2062e083ec6fa1b3ba3cca460f12065e76f1d4cbab9b2ec3e50639526e808081ad532eea8c3ab34cd14f92a1f12705205f60954c3d295b7cb14be7e04059debdc06a8daec1948b2fd3b8aca0e8203700d2057644e56b7acdebea430c03840b6c4be9f7239392e6eae52459198dc3d81658fddbd75a96544b6759c6f81c639001a205beb3e0c2b75dc65753b3c06fd6a2718374b1c028b5a994dad8720b99bf0227b57ecedc2c35a84f4f92fd590ebe05ab2056e0e39f1472835e55ad671578a953fdeee7a7ddaca1022b5dd699459b7fef8b9a022f7d543ddd1da164b83409206bf02eaf9d8c6d7b9a562d054eb8ea95e9e29e9673688649ee3003878d11b0c0064814585d2fdf7e4cd575211a804081114277697fa55c0e1f419ec089cba875694bbd2f99d0728038817db3df16f47bc9d4e22abfa2d22a387bbf10803481ddffb831af4cd2c8d1680c1026307aaa93b8e654ead474e6204be0ee2519844bf6dad2a527204ae04b9eaa119ec54092c06d8ac8ac5b274f9299a081b2ce3a0082046e54bd93962507bf72045668b8b8f175e97e8f1d046204f65468693a991a2d45e724798e4f0c52043eabd4514729358472bd1944605ff36b214c6b59d0ca73831c982043e044b6dcee59cb0a81d77266218450aa554c27087c66dd2e772a2d20f0a1a5fb3121b3ef6635881abc4ca745e5e90f3a85965eb02f5a26759e232ff82cdebbd0ea64bb60bd566b4396decffea20b5ef76a2d6452a5ddbdca05e32f2617cd3437b966df82929277fbc0055f1b2e46735f7f97ba91b298e80a3e6ec1ea9751a8539975d2ab99a4bd5f8a210393f4610b6ebc764d3486e693ca5f51691d6b830c12f4b3a0a4a416ac76dd310b7a574bc7d14932347a478e34565026faa085b2ecbfb5904ae724198a4919ff3a120b4460f77e2af898059b0571a15e4aad85cba5b1ec053796f78f237cc8824d2363d2d532dbe69c89052f44dfb32c5acb7cc042d34af88d5a6e6c2dfbb4ec5a07a18f57a4b492e5c31528ada43f5ac1c764a3a544bf74ea69c11d567066bae5983677a534b60afeb5987569bdbbd668aa82d12d73f6e8ee53a2b754f052ed6dbf286f4bc74605a7f3b7e93cd527b2c5167c9c82d1747f793d9b67edb19212cd15650a3eb3d4b9b418b3a0f5a9313e4ac1a76a8fab223794eb9a2b2b26293bf234575ab028f82005fb9af3b7b3ccee90e68afa1805a3a3d61c3db3adb9b2a21af810059f34cb55a1ee756edb829212955f29297957f98f50f0594aa1b47442cb5a108fbf8e5e56de64a9a9fc0a1a50f0b7e6fa4979dbd7979fe074a3dca4a97a4f70b6b9a6f9772ed7da094e9e797be72c7bd29288136c5add51e596be09467b0679f77dbc6e59293d4f777151080edcc7ee902eab96b494396fe05f6e4947a5ed94d6ae7103ff2d3c93cb5aebfe0edbc097788e9f474847d8c0caacaa43d4e84f32ca8cac8171a5dea30eada994fc8ca8814da1ab6fdb4aefeadc481a38b5a3a6b35c772c5d8ea0813317caa38b59ad4ee58f9c81177b73410ba9471c3103ab52bdac5ed0d64819185d2943a86d5973dae4f260840c9ceaf2b5d5a055be6db23a063e9e5497e5f84aa11b1303ab5edb8a1ca1944e42280c6cbfda4eaefa2b2eaad28181376d975d76965b9bcebec027a566c2858e5199fe47bcc0bd243747d92a44a5cc47bac0698d2a838a6614cd4a2e70a6ea848929d362d051b7c04ad15195ccb252b61f8446b4c067cb99eb64ceb959ca029fcd4597b5de78be5773308205bed5b9ced3265ba9d247aec0694e9be4deab46acc09799da1cd3659d370847aac098d4ba596cf96529b713c20815d82cb949780b3228fff60c235360f5dd6bfc2c8bd97b700d4eb5329944bf7d7f909e388c48817597773fa3b62866a384361205fe858c77324d6d26991128f0e79af35b78697bd08c3c819746cabb7bd9ddc25cca187102bf2fd5dd88f2e077bb19234de05e5ed7eba693e917cd0813b8d57a5f6a3c741693ba32b204be6559e7a08536d759fa72c068185102e7a6dab2a85cfe17549bcae88741f29124309ecb33b7679d4c99c63be5064ac10812f8729d3bbdcba59ae3a6c30c933252526ea8adc006186b23476093270f5acbe7ff19422346605433dbaa9623376bfd4811d8ce2eba983355b4410609d27814e81821022f5a34a993a83a043e6b1b73f5927ad762a9831121f0f1e3d8b8e0ea5acb2f41e0bf655a5332c776ccc7f1e98c1120b0ee5188a88a964495d60c236af01f75eecfcfdc9fb516915eb0fad495a98c72d44e080d115eb05a996795ad6ed50795d176c1bd963b95bee4ad88e882d3606ebb2e3b4b9fe59c0000412417ec676d41a933d79a85d44932e5262b6d6c0504211081ffd23a5a90c6a3c00722b860a4678c5b5ad6ee4ad722b760a3de1cfd75707d1de6493251498984882df8da6dc1b73eb83aa1b42609915a30263f74b9ec2e84c7d288d0825b2fd7b552b72c3dc64e92cd82d7ee597273bb0ea1b37ce53d25c759424416acd0598ea26b5f291b993146091e45850c4088c482f1e8b2958b3afd74765a1081052fc3e5cf9d2685105ebe82174adee95c2332aa96ba829372b51c63adecdd16b682512665fdbfc6ecea7e56b099ff9d35fc55bcb555b0bb2973525a965c4f7eaa60f466e936678a0e0d2ea9e04e7ad041a84a4ad2f820820afe3ebaa8750b5f4ffa5370a675c6d014d114bc34a569d5be5bd2fc2a05a356b8bde44a470a56fdcb63a23a9fb770146cee68ca3ceecb56261205afb5a6636a35fb1ccd50b02ed3293bf9c14ec81528b8f756ca0513e159ff27f2093eae6b144fa7338ae878827ba9d56e92418b4a7527f818659674efaab99d8813ac72e91e6f65b809b646bbe89a522b71595644139c96ee1d95d4b255869b648451525252b20202914cb019b4e39a965c30c1ed885ca56551b8fdc8d68e17229760958b6efa64eee8dba513818825389783dc7349cb5909991983482538f55a96b5d272bbd64619084428c148ff0ee5ae99776c04e35154c83078024082c824f898e528fda58f6a65266507da7b8a18474524c14b23f7e556f7a9228322c1291531edd6abe5ee28020956e64da349a6896c45cd2358d91a6346db7cf7a24e8e33525820e208466e4c2fe779f76d944943a411ac470d95a9a56c9941cba1408411dcc9e8e931baa435e58bd98a2c8277d329d47bd9a80ffd249989e7e81b7da8868822d8ceccf2c89825995e4433249208366feb4ba1e7df651a292a3b56de1322582d8469599fc8ce41a827c9cca02072085e68fe671da3de2ca3d639113104fbab74a6d7a75eb215d1405985e06f7532ed9e5284606fb32c28293be67d29640e182360810d48880c82552665bf14b105c14bf245a163521409041f5ffb67bd19771140b05a2c2ffdb965565ad4aaa4989c1288fc8197838e5ade9223836eaf66fc8e34427043c40fac8d16858c99b3c47d24d20756456aa9ddbda1398bc010e1036faea7eab5e8e9525b640f6c7ef9353766d9dfeee780881e785f1dd3bfeade60b27b9563649cd12cb03ba355c210c9039bdc6b5fd4f82d5a68272b5d028403113cf019736ba5a5b44dadd228ae41e40eac0829437f4c4ae8b4c21b2926c90ebc2c7db7ef55646af6769881e3062275e0464bb6db2ed49dc8f324d9e210a1032fb7efa930ad2aec95a3554c6c0e8c10cad54dca17d3537923109103e3a173fad00ea165d7e5382325310e7c77478d71f74fcbd38271b2d225d0d3d1384e2002074e3fa4f294da5779cb02069137b0ee1fa3268f1a34c44531b13144dcc0be6e5954e749ab887a120c9136f09da55f6be9f3780a9b0d6c94b72fbbdec870cdaf81f30cd36542a4349d5303aff531bbef979605ffa48197dffe45cba774489784065e7834cfeda3be94e8cfc0af867892723d3fabdb64cdc0794af5ddc97d936b4d186b9e2052065e16fdb9651fed7b51c9980819b82dd5265f54ca45d182e9296298639131705a481995f0cefa950c5225220656efe3e9966a1d94dcc238b624100903efa2dea5532f26b5241130f0a290aa65d331ca2c63e6e4e045b0fc0becde8c1cbc9b2caf835581c81738d952fdb9dc207aa5d40bbcbbdc4c6ff20557f5d20576b4eacb41b56ca225e3027fbe22858dfc34eaa2c816f82cb3a8abf43c5b8592d1021b45a7461da931559e59e0c5e4df8beb1c529f100b8cba1a3f2d2e2d720576bb5d16d4c6139a65cb0aaca7667539ba73d3738fa24246182255e0a4f9b7cc0f1e15d8d6a8c5248316d35b0a9da4a4bf03e5884c814fdafe258da55a3a3d8aca0e9301913578a5a369d469f48d5929703a68a98578d778ae1d05de4c6b317e8e21b424f42250e08374517b7d546b883c815b5b21f65aceac31a7292b39521633742b860c4c4e20e2047e5dde154247cb72e9a709bc5cd283feac56b5bc322630f649d53668b804be5c68d1e57e54abaa5102ebaf4ac9e0b2ecb29655912470a31eb4b4cfa5f7462582043e065ff58d2245b534123902afe59b256f71f42246e065ad37d536c7a839f422f082aaf08fbaaf3963274204ce83283fad9d615ad04486c08bf1d3bb74dadf7fb588107871fd35b78d5edf7d6d201204467ac62c2b0fcf104480c07b34cff4e8deba6447041135389932edcdb6d387bc437ac1c70fc2f5c8d287f082d741672d9aa7dc927a2442c82e7893aa5c14fe1e436774c1773673f19c21b45befcf0523947996859e0897366a84e082113ab6ec7bb7d5a2105ab9059f75ddc8af935a767b05e5c6ef4039b1059fb38ad232d7590bceeb57af87d2795d1665468a89f7abd082b16ff972bcd3a2b4201e84cc8231a574ce2854713b59703f2ea59716a6fd2eca19272416ac965dda6f6e397366677c8e378405b71a8390dd22ec4cf6afe03bbed6cd5a0ca693d67105af32a71731912942bd92b582776d6a84cb372e6a51a12784b082cfe972b99cc5356fe1626e158c48e57aea5969d1f347159cacdb2c5ccb7d2ab891d9b1655b7b312f054d0841052fea63942f7e927a3216720a46482dfef62684bee43921c414ac9626b4ac6932e94625c5d89582f7e449bbda92d2852691828dae3a77db8bd672892769474a8a0a164246c14b9ee926a47e8bf56dae183230b91051f05a145accb275ebedee6f2e65e530c18211120a5e36a1ed058fea73091b149c9e4cd7a853e7e859ec137c7796f00ebab476f4049b3beb106f9d99caed04ef25c75edae82783aa39c19e6a998bfe1ba366dd2638a9c24e666126846a4b13ac967332d192a995a6d7410a8e5731c943b6038d471984648211c2b3fa1cd5ee5b68414cf0636ba6d6a3468dc113720976a4b892daffb4d096156209fe657e47195b7d922cc719ad63c5ac12ace6a445f3a8934691a79364376ea09441093e68063d1c4226c1a95a8d6a5f377596ddbb25844882fd20e52bada7e3328a569ba099b13d844482510d3ee251bda81d5b35844082ff987529e5a6f165e4408fe06469174d57f906d33a8ee095703f17b0cbc05906f0cc4d60b91a647f6a81094460d9b162864a01029086ca00480056547e31c353547424a0032b283a1a2400670040003270463c0080951555420001f48ef6920204a077b4a7a8941c00000368400254be8ca577ac98988c0020000a38800e1c5b6083f060fb5a1c757ab34e92e9c0b168815be1e9f9375b1e9362160ef00516f88cb6f1f35f8e9ea4128ec791d017574843c762056e94cbbaf7d4b8669f27c9d2d0b1e0781c08c7e3c82faa80283b3c0507151065870e50dc0c1393047c31053ef8fec7ef189e243d33e30cc7ab98e800c54d7c791d2b6b3b72a0e04a0e941d3750be58034d10f08514106587cac9ca0d1393047c110544d971e364a54d4c12f0051476fc0a8ec761802f9ec0669ede5e6d5aa8fefb0b27f02f5b16bfd7558baeea5dd19162628c035f348117e48b791f954be1a6d5c19f1b8d822325471a375254f03f02bd95117cc104ee733a99f4e60ba55cbf04ee339b4c3a474c6707298153bb6974fc2c8bdde14a0227b4996dd64d6a842abf40022f7314fa9386fc929dffe2089c52a995dd98d01746e07452952ee67621b5ee22f01df7848b3a7ad2b1435f1021a94abe204b8e76bacec9fe6208acb7e898dab5caa0a215022b7cd5aa3719b390990a029f2ee966b97c73f63c0202f7a2fcf3cbede6bfae2fd4605bfb57b6bc318a5052bde08532a1b2b4ec4ae76be1052f5a4b6ad7ab233b47bbe03e74daeb8eaa3ba95d17bc0e7eba330ab5a656940b76b4e8a6652f8b3a2a71c1be98ca252935c9979fbe05db2e7e7ce9fc6cf34d5b70eaa35797c6fb975d550bced568cd204bf6ad56d202a95909affafab957b4ceda3c8b6416ec7f7e905906dd2cfa2291052bd7c55cc7a094f6af28166c49ed5c8f755a7aa13c49564693010bd65ec811dd42a98fa393bc826ff9b316cdb2eb8cc4157cf41757ffebf0d25989a415eceb1232e596e8bcaf3409125630da32e9a4346bedf1b555b0295b9b8f1ef92fb78e2a78b3cdd23f75cca95af09c5470dfb9d34bd9edb7793f24a860f4efe7ef2cb34ec10995652f0719cb955c99821765e999bd9d667459a5e07b547bbf8eda5222450a4626fd1b5cc385eee8a3e0056d49c8dfd244c1485b9deb4dc64c9fdf50f0492bcddd7a9e6571a5a0e075ea9750a7356a49d127782dd5ee51bbc6e8ad95238d154fa4ee75b3d00e529d60d347914a6f6798e96c0a249ce0bcdb34c64dbdad8d2228906c82f10e1542eb4adb8ca2144834c1994ce97a9fd3cb942e138c7e761937a3fee02e6282cfa384ee952b3b5bbbc881e4128cf616b5aad34d9d5c95c412ec8b7f7fb2b464ea5e84580946b9acb3fc3e1725f8a4dea6646649c449b031890e77417b889260a5cbb156be89aa760d31128c162e4b1f5f9992f51d2224f8ec3268377d2af5eadc23f8d55a4797453bd362143a826fedbf25bf3bc446f05e3287bddbcba459102223f87ab973163c467ba5eb28902c8297429d543accf45fa314c14a2dd929d78fa6fd454912c127eda1db3a6bd2fabd6302092238e9b229dd4278f61fad2e901c82ff1aa1e5acdb62ab54278921d8205447371dcf2ed42f042fb8f298daca734742085ef75bbdd4eda8e19d154806c1b6fc183c4bfa4f09db90088215ba93dea4dd2509042f9a36cad190f93184f7031240b0771e42e69c5d66162a2048fec0c6a0c27567cef6fb6b22f103afdaf5db673a53ef5bd720e903235b536d9a67befc9a840f8cafbd5077d16d9ea7044193ec815d91295f14e12dfa2e891e18994ca44e9d41454ba63cb05268f9c54f13f235fe78e075d9bad8e2f96e643c478aca32496290dc81fde4b2e538a645edc0b8d07773f30d5ad6fa5407c6440ba62eebd5aecf111d38fdff514d789773e0337b5489b071d9a4eac881d5b2f075176a435598481207b6348bd1d3d607e1c0bb641f42bfa7eb175a6fe0e576cf5a48b575ef326e604b698ba1a5ccf592c81c1a90b4818f99c6d427992b546a900d8cf6aacc50f92ed76b0ed7c027d5318b50ded156fe246a6035737671947e19ff83276989409206f6bd379dc67639e8f8224103634294beecf27850a2223903a3c26b84c6cc3a86694f92ada0a451018919d81bf3d74d327d2865e6202903e7be1b3c9e4ca3a32e123230ee5198a7b9cb423206b6ce5c68d6b9eb65374f0c6cccbb41b998a1a133e748c2c0676f9b6db6d1e5e289040cdcbbf0d61aa3f4cfe199e0b840f2054637e7eebb7669e93d3c122ff01b33ea156a5a27c94c50182008c118619000254917389945e92fbdb36b2c9d840bbc989ab5bfe620922df041988efca095da6cfb8c14304a4ace48515121d102ab51b53017a3970965936481117ab3a8c5f4312458603c543b97d42eb63a13c91518d7ddd9b43617345c5e870e33acc0badeeca4856d8eba9dca9f9172e3d44052057eb3d7cfbcfb75e8f246935081974747f52e0b19a23bc6039229b03742eddcb4697974bf063f2ed9feade78ff682d806122930a65bf014aa2d48f1a889ed80240afc66d09e95549964ea8a040a9c96a3f5b620c75df0903c814d420a59673bdea9c556489cc0c85aa134cc43e714cf49b2004913588f2d32aed4b2283db99030818f194c89aabd0c5ea7dcc0c4244b60fded6d55a615427698021225f0f7b974abbfa71432ea184912d86477af65e5aa69ff41290309bca83fad3a15a27e63b772043e46a5f5e8332132b433029bdabcdd93672c256a17901481132d0a29da2e75c99813031222f0a984729da3b75afe9621b0b12597a3e868aeff1f1221f0fa84b02d35adb49dac062441e0755d939ed424bb17900081d5275d99cbff252383440db6fb75ffc6d36ab47c5ae905a3ad95ddaad2eca27479c18b51ae69d3a268179c8eebfaca452d6d165a5d70db6d9fb4ea970b763d876652516a5298b8e065fe8e8a7790fe2b8fdc82935a33d58b35da82131199fd835acd0523b5e05de71c65ecef17b26e5a30deeb234c53ed7dd642c62cb8cd27f74ce3b8a0c5f41823b2e064cc49df471d548bf993241889856596c08233ad2e5467fde9362bad2c137425187905abb524854a5d7fc415dc86d4752eebacd19516b58213a5df65d9e5a35f23ace0b4a5cb276ea79fc57215ba185dd0bec2a5aae07b579454dacc5ef79b4652c1fbef772add4dd39e194105ab577688faacb55eb9f78a2f9f3f183905dfef39964bd35a363ba1f125282941e34f464cc1462db7dc39a6d6482d5263a414dc69f318d328ed5e72c31152f03aa6af10fe7214baa54f52c9c828180ffabebaf9b39c5c296fa2926223a26043bd750ee6ff493234fe44652414ece7285b699d5b32295a188c808215edf5afa596394bd12758f9a2502e86929983fd239ee0b58f76414bdf419a52473ac1dde773dd99e5e818db114eb0ebe1f945a5fd7f32cf91b27282914d30a2b4a60ddd11917d8f6882f5a842947816752651a69309c625d3ba5dd00462902185114cb0264bd7adb96af6a419b9049fa5ce5f72e59a48d91ab104a74be8d041ff4b2ef33e49962ac1f7ad50a2df958e9e2d4ab01ff7b5362f175bea5b979149706a946b0da15cd4bfae931dad829292931d3d22093e7892657f72b5fe1b8d4482f36e41a5acbf53a64d941c287db28c4082bdefb4e75ffb516552498e9147f0b2a0cbfec5b55e5941d991a371681a3b76bc8a0e64461a2a28860c4c3e30e20846aa70a13a4a6fa4119c549fdf3fb75c55a52c29413c8c30828d326b31e4bf2cd7d4ef16c109b9397fa7085e752cd5b6223aa9d677896063eedbfff451cb98308c20820f7d2b5d16c43c57662119460ec1e91799e5ceea5fe38d8886e05d4ea5f96d755e2de48885e05c7394a105d5e6b27b8884e0fd74e84e2f6bfdb2387a616410bc365f0dd32cc70c79436144107c26fff72cb310caf4371208b6b3a59694abd5a2df86531801041b42b7963f668df10577e40fbca7d3db29aadf45ab47fcc0aa8fbaf45ed44288129ed3073e4611f9a33dc33ba4f8c0665e2d4d5c9432c76d218eec8111a64cca3dfd42374bf5c0492dc9efdc74afd5c7f3c0ca60df39fd359acc4a786063084f9db5e4e9c56cde812d6d2b75b79cdb813f112137ead4a02dd73a70da3fcb945916d3e62374e0366be7eeeed7502ace8135d9d165e72c4af95267440e6c7cb9fdde5a6b8cc4218e10a8045186f250200e0643a1400c03001c56bb06017312080020281a8d8663129154d5a61f1400045140264444302a2e20160b47448140300c85028140201088612886a2180a03819247dd06822fbe2a97396a9c6bf8c1d11b10e16002ce853ecca01d6381a6e8876cad9a2eeffbef0ca2e99f1fc7251b01f460d17388c012a41a72aa4146f87e7aca97fedbdefaeb9bb718b467e1a77f7ca6583fffc1405ed1072c7704341bfaa92dbb53bcb51a882d4f7e9fd7dc37bf4851e3a10b15d75115e50ac94700215aec70c2b7b5a2724dfb1459e96999ca1599975743953d67b448f150f53fb533665307cd019cf50d728603eaab9e973e4c1ec7f436faf22a4f965ebdac69e8a29500beb7634b6a79d5d369b38bb9b6d463aee4660eac5a022ef04951cc643257e90b6ca3ce891ee396c0c52508d5bc366d1ac2ebe791aa5e8e5c1490a550e634a54275eec6005224a6e7be6ee02d35701990aca5c2279f44d57829f3c9f577313c98824aafa26b8e38d8cbe24823ba454f7d497129f0ea243b644280a9467263c17c1b23a80388e13dc7ed89ba335b603fb06c1e5ef025cfd1fb835b402681af00229ac36725137aafaba52725ed0f6a24f8fce129f20243d54884fa05eae592de32041ceae1870a204ec2eed8c6ee008383245a2690e2ea0bed4c43c8c811c3ac33ce437fab5bf19dc830b9ee8553ab4106a70fb5e6d4795ca52f8c8177d721a27559010995b1e864e0533c2df8f503df98232199bc7184d9f83c903c5d9d39180c0b38bcbad091a753a58f0964d2eb8736baf0552f3dfbfc209c285fbeb86736a0bd404b84dc04ffb3c90ff46ef51a1dc973d0be99e2842c536931f7936cab22dfec35acf19df7a1b2a1860680951bba87eb59b8d4f11d2e3dbc85c8e9a6121afb41daddd6997210ced801fe95b177f6e123531227b5b6f7de414f7a57ee089aa5f59af64053c1a85031d04b46c6e1f3a8f1713550b2e686cbabc563af23835820d68aaa2cee1e70574336d902d83446382a7e9abe213e0ae6f784764745cb7236eadac167520d7f14cdb99e79918a50f6454e82fd1c29e125c23589b6d298297327c180db9016bc4569843a9237f94526801c27ee280ab1387d724c48811e36dd56dac5d24f6385fb114687c065cc36168c89ce6008e2ea38318aa04774c411c0d72d6346c0e39151b67e02ffc3dc8c56a254eb6849fe8aadb62b3fb322090623f1bd141f56f001855f94ad424b5dc917c66049b174c993af70ba2e506176917d01a1e94ec0e7d086b8addf426650b8f504e7885d538183d40a5de29153b843b512711ecdc34e4b8aa080e9b89a1b5a8faac4e3b82d2566955e800a7547a1f74b6f63d6fa715c21c4a914710c3a56eed6468061b0884777785938396cf6427cdbcc9221a2ae652edb07faa54678b95959fa54ce55b065e420a656b171dd8bb4bf65ab4ce1fef7fca80fc75d749d9357e117eeac03ff58a741e98e0460f895b82edf1aa089fd57854f5dc4b055d9c155a07bee0f3962e654a55f023a834a6ca54ee47c2f828cb21d7727bd2a3cfba0f5f0d29509b8369b0ce3162cb02a1c6ba168d39346d5b6419b6dd11ebfa20a51b13121de56202ace6aa2a1696681222a1339494ee37f532982796ef26e91d23e0fd0c73c1a1a2040a2c3ecfa2dc2069fc9a778d999b2d4be69a8f640508197cd662de5c84e9811c6774c7c04157dcedde866cdea760dcf499a38eaf282c0ee918e51050c37c5761f58aaf8173eb090940c3571e840131613172e64da669ead18915cd0817763aa6a3e35d4c8733e44d8b6702252282ba056e0a2de6859dcf78b183c92d3e68dd3e2b01d87f9824fc869a780649f60bda5b5fa7bababa49a4f456763edf5d261bdaefd24b0c680d1abae3437ad3c0552f8afadd3e55b108904bbeb5f20a8503cce435c341b963173d10d9801d1c6f7658ef783030d8e5045af6474f1cd0de3ecbf402f79ffdf65d6257f8543f2c0f770d50169d7cfba011ca6c210ada2556e4cfdbc06611a25207a52264841184e5b1169813c1d990508406f0dacd69c978609d3f9c661f9506e16da1877a82078162321735b2666c9cbad5aa4c3df95ca36ca3ab5e6f2f54e8eecede2c8279f721cb6c9e734e0a528e85f28a6c73b67372fa5e165f0278e5cd0719d01c3eee0d72d324e21220529043068d82df0944c9ca71a86dfa33c05fcfc7c98a4606883fb94aaa0d7489430df56a35d04a9c5779beee50d73648f288a5a92190b5403a30a950c274f87634d7e44f23bf26db352d8dbaef085450b95482ca0623096b9c048990e8e27084a1310e9b6dcbfebe8bea95d1b4c7978db772cc2d5e3989e08f9bee61bbad126c48e8de11f068f1b4ddd3a0f8224e4294f073f387d24f65eaa305ad820a2021153979f2fcfbc5c2f60b0115e380e12443c9443549516dbea27f812edde32ce5336cada26e2f07e6014c25366179d33f4fa26f666c58539d3a1c39f8174aa84359ab00deb85031b0730591d96a28a35f73d775bbc85c5402f7952817bb6f33541f58d438777c6448bdb889a1e6e5c28c1459c4256d47f7ef9e5ffaa87a1bf2323375a5af6d3219d498f9fb13a1da1ea0ce5ea5d4b78cc9a34c89f98c1bcaf73d76ef6c4e672d06e60877ce7d0b888909e0ed258e3a24bc8a87e3e0f5fcd8cd685b371ddfaa59d63aff17a8b043ab35b380921ed2e05bc25b2bb45667d72e658a4138ab5e70c5018c4080ebe9cbe6e19a71bacb6ed7194f72fc5b04f28a39ed969b8335840f5085c0dc72895f461720c73e99e1a56b3f199ba58e1704d87602997853ad0b4d1722ea3f0f0be45790dd69eefd150a7ad8982e789566f9ce09144d5f0daff2bbe306eb5630a9ee9666c50bbdb0255bd820a2ed7b820099a5ce938510db629786dc0ed7a1428a5b01fbaf3ad2f4834fcd9d963c3de46e7ae10d57baee2a341a94c5ad926cee9a65a52daae14998136d8db8c2151c088035e27031091d96d7ff38143dba946041096f07b4f21a22c978f92c9eb4e4b84a7247d32eb5f5da0d10e94d1d28157e58d007a3b1a10992251a8020f82c9e6e0b480b805613d0c675bb8a621efa602e8952dfcf4315e8c53e917d1e8d73854c69e2725ce2ef660636ddec04f76c22da5b110423b6f3e00b7f8220dd8d135afa693d7a27bdd0a12c62b75d90b0576e78c048bd9d8829679a18faa227671bfd00d084a7b45a304000dd4260d96cbfe5702e825963eaa74deca740478d4ca7be7f6bb512fdc79811eafa3f4d2d71d9e3c4a4ab86634baeed275545d2eccf590053460b2e88580f423998acb2cfd1c45855b33a7038e18d3ea789a6bf1ed3af83dbbd4a757b89744c1f0419b1419e40a3a147a2e662c16658b44fe0cb4849c38342d3b14103cecf3b24b70b046ae8fa19c2af802a67fa2f34c5e81f3739ece14847018d2501b56b7ab9d4ade7ba251b7a0e9c4c267e346b8c8df93e99b0d7cde6ea61b4e630e9afeaf6ba396327251150dfaf98d7b3a1d7578c87bc4587f8d2bfca698f0a35cec03fd79abf9151e30bd8a7846294696c3839df449262690c1c7d0bf6a117b47b8320efa3b2aaa2483a37770aeb09d1e35f0e1ef70d26f428700528fabfd2ea0546307ea9adf5b28fb2489796f4486dcb4ae86ee7438f3f9c3fff683e6c660a56f90db97c799453677f9df9753ccd9ab1de69b9e76149b71b44eb8bc822dd634e6185b53f96b4a12c78253bd0247a45de39d74439e0c441329a6610eabc514dd9f4743e962c9b4781363e9bc7f13504cf600b1437c7edc31dceec2891cd286af49e31e65ed7e25e8bc5316a742fe16383aa71243c6111b144aa5ef0a963c2ecaa122623c3d921f513c570db2b47f9fb5679ca7cbc1e1abc3eb59d9eed6dd00a5bb3f05b0afa2c9409f08c5b8bc35629c5e2eec0693367034ad178f6001aa0b92d0002ac30c955ad45ca54da94f3d94a75024fa8b3fd0b8e0eaa458aacc06cdcacde70c90cc7bc2c779b17b61437237aa20f0620d0057846a9eb41a76f737f082515fc2aa5ba80c510ecefa4f3ebcaac32bf73a47b33d7352df0fc39cc477b8f2c9964d7267114aae1a68b2273d892f9c7f3d2487ea8b6d481e0c6894b8d1c70c858d6281f18330f2cc7b5d855986b9f75a5e6012c1f9f32b7ddce5b019a0420450606d71fcdfa6c6283d365919e3b46d1880cd9d4ccd5484e251933726c95e8c105aea2d2703a1ac4b0f42e8243c0b7e7eaedada5d95a6e6401efb895c5e6aa3238e4806ad3a4b95064795e670433c4c1a31feee4a8f8cdcfe8c59a1da97e07f353895fb8a723edced184f0d52a815839bda91476314f452cf8b3196fd5ced5012c7aa972d1a542b72b8a940a0c52db5871a7b87184fe0c9d143515041648a1355cd10d5a68becd2d0ae2594cad646fe6a8a248a98b71237e7678c2849c459f9e5236313a820f791e0b68fe7bbf2a5b2a16c9e54201fd416c9128d7c142337dcd69025597d306a436eead88e241cd405eb2ea8205b7b6db53b9d39e562db6cecbccf21fbaf30cc56f9c4e0fd1331d2a15df53766c16c9d44574e68abc16157b81a1460f4fac8fb0b2d51e294565feb05eec9e2e80f467976a6eea7c1296c9d4d00ee3daa7f1fca7470112fed2ab5ff4e53a6e906d9b5e006695f48d12b7f39be071f681f2d2cdfb84606982eeb9c4d95851865fc8451bc2178a21896c632b1c6bf634f9e837981a210ae68d0618456789a90827140683ed1ec812c44cc3fd1b7d5f22f706f7bf1f29c9a43f857f37aab694524954b6fe2802490083c4b7a5fe4375d9b11236fa7b6240a858f3e0a9e39441282bcd8d20ff050f13b1f5616c29da5eec87474c873a0c2d0dcc7690a829cc333c08cb8f58ad46a2d1add1800996cc0dc8a9baab023fbd7e61fe72c47865c8621ff011ab40429fac01cb7697c7a10fbc43401d9605c27c7e5ffa7ac0506b12368573708a069788e5861856ddf9f0ec2003309c1e978ffb0951bd3266372c02ee26a23dd7258331f6e2058eac96945391a30ea1f05914d0177b66be1ef54873b4320b42703fd8c1d568d68e6a985a5151e524dc40961e3ca851a308a170d3700cfc144497b998f00a1a0a8c76715c8ab2678b7dd43bb8dc03f02977bf1626b8628d309b3196232ad2560d12be5ce9fc38dbe7a39ff4ea7415ef441f88ac0a93f15b143cb7ad168dbe45d5d02d38f2e8e3297294a0094041c0c39cd7b1396d27522c12868949f7505ee5d983a62b7e49da6a8506a037b9f748b2bd8d816f68d8d397001a5977dcfbd5dd643f09635619430d7ee23346c82d8292a91518a6fda9e8e6b0793272e47481606834df3459dc36c7782688b9b07594c93f1ca8edd1549ec2b4fb2e05282550b25d1c31f72e6fb9188a04831a1f6d163ba94e4a623457185539792a08a1852e103139308b0ab1bc1ea98abb232e9add912dba517853393f14580764559a3df53b4846392f5ee0c045d65c8563b7ff52729865e810346a01d29008b85befab2d37e9b687407b2a8e9ffe217851227109bfb9a295d1e80970633cab115f8a56839c9eab5915b42d5bafa60c26d1b26a23be0b568d6b61e0b74a7f2db8c009dfd1c8c89f3073bf54bdd3548de220eb987b349d79a48e4f25d2bc339430cd4337a6347ffcfc14db3b36658db33554c53acb1a5ce504d28f4e744881d3b09221f9ce95d429a2c41e6ade05ed148d220b4b7a6f9c90149983d03a8d4e5f6367ec885645611216c2b056858afccccb32d1cc548b334a07586a4d2d4bb19f618b85359906ee37223e266ba3719ac9db73cb6b43157d83fa1cc232583ddd099a4f58284368683bccbad16290d9739b409f8b1c4e6673d81d7ac982890be66bef502c33c2a518b69b5962fc9346cc5c310a91d89318556f589032dc4577627a99b657119ce861e6a3577ee0ef138f8afd8ea2a596b6d75b9d35177fe311500b1865b1381dc6719ddaaa880cd22d143319164f5462623511712adb678e1b7aca19add91b4c53502ff3a51d2e48f92c2d3e8a07c0361c11215015fe597e54358515d0412b44e771ec6f933805a9e68ccd7e30eca53edecfa1a3c258cdabddc5c71a415c6e322285ba110051cd151bd49fac422f31ea120922696b5c4d29470069336ea81e4a0e47a19f1232169b73aa6ec25dec51f01985f1dbaf05af8bbacbb36a969e18f3e893fd849b119aa32e9017293ff7138d63f69ff8a8016024aeab1fbb41d8798ecb7762825ee08a1f3294de953d938206f17538cc0cc5f795b1ae7e2bdd1f85edd3e2115eb1c1fa784412f8c05147878333a5e664ae4badc9cc368406fccee9dab103b29d15139a50553fd1cb5a258fd197cafc86b7ee9caf79010b7842beab995b3938970927710412876569dbfb8edca0713ac18f492c6637acbbe3b1df72cdd9b70dc28e1bd8d6a3fc3db249212c4a9966be5cff90d6f3fb3eed9ec25267c5e32a0dcc3b722a50d272f7ba0ad31e41991dab02e0704de819b9fe96ce2172fe706dbeb781229ae3693d45e51774575166b0ff1463cbbb69c982656d84954178bfe9212041d5cd869c927e42ba336eaab331df1ec75d0e3703ab6d351d69542d8f7c101ea7a088c171fbd680444337b6a807bffd82629fab0001a6df3ba5f7443df6a30374d68f7e2a248298522f89ad6f627474a041a13f858119fd526eeaf358031f9925d1a095e83c1775b7e961108baaccf09463213132e64aa4b7495ce6b75278e72971dbb8790e06ace907ed15782409bd852874bb33901d9e6e9f2db801abe431244375e55f0dbdfd8c5abf9e878c2b8f9304a435302f7857c51420164f420010ad6c6608b52358869d5d41dcb167fd343805e1379f5734128c943bca2ac4a8992900d809ff42c663b4ae95f68dc0fd4f7d9600d082be668597253968dd2943fa163612881e0dcea30c7610273f3c14f0431ac2eaf185bcc7815db25f03c64a894099e2495e7e6cb1e9acf0ba44f5c7c6ca3f2c4632a58911c760a6403afadd5c8ec40982f54010940e1ee70be8a6fb68af7d8d37c61b2e18bcca5b99de944077780fdbe330d82b9bbfbe0e72bfbb267ecbc9ad03f9de34639dc4ad60eee09c17182a1ba31b2a3c3a5f1c390cafdab471c01deca30838a457495366f924e05c01ddc9fa26882879e37e6a46e87e18ca506632ec18e6c12ce6b44f8b7a94b51ed2cace0c11854589cca0159e8c64b1da2cfa03b06585828f8eeccaf5cb7693553ac0738d6cfde3ac3e300571d17373fb8f1bd35033f040f3cb59e99f00d4afcfeec4fac63c92145a21aa8daf44ae7cc9f17269524acc94e396bef2573f3823f8c1a6f0aaa7372e136d0c36235b50b279b5b23a538648542ceaca3203e34426f343766a1068cb93add97657e51348fcd78802ecf94afbf4ea5c951d82a8d735e35ed73e7aaa94a084041582833e5e3b6360d9db031b0ac4d7616e449699bb52d6be46d0bac3073c3f789fb91cd327a2834bcb9c153952a6774afcbbb7ea964a0e03f5e9a5ee4672570f432c2463f1ef220fca58ce7a66208e24cee2939398e2421cfdf0e5648a5d6a8994e628ba8b3fce26423824828dcfcd28f1ce1c5b8f2512d955d9a5ec815ef46776836159b33d652cb30fbcd3092c904d0654227a5c997273454a770dea69832233b2313f39946026acdae8cb9e25ed685219c6683cfa2c1c765ae54984ab832bc5185e861fbdcb3e97aa0566fc44fde60ca1c61622ee361644796706a61c88492a7cdac8a71804963f5724d41e5f30f444aad092eaf95566cb471d5d9504ff88961684573ae863137ac5e12bceb2ccfb7d1bf0552c2188fcd1ef02ad749ce5617e48d270660921e4f15a54209b3958d11260129c25d31d5420a3df3e4227d5261fd553ab8f36c82e16aec4e4148ce47c6bb3531533f9e5d9d06b31a408ced402efcf95cd08ab8553130bd59085ad192f381c9d0a14cb90e2a16bcce95ab5437d488fdd84d8533997cbbc38d7ac7c86271685c2e0aaca4945c7055800223bc6b047d61ea0aa3d02d367d552de22028a01f058d2458fc64c843c5a747111c89725cee6a97d18d72a15924d92e90ea381056df82d4341359ceed5b10701a23e293aa460a528f11dd2a37b671994a9fbe1552466d18ccdeeccacb129fed2dd85a26a3ec0117744a68cce91b251c453f5a87115795d74878dfcbc0b3a858f170c72215bb25b82122b03491616f225171ec283e22b95820bc10b0a180a14c2c4da008072f598fea80c3ff174e7f3ee51410119c91ca464184458c499e1382a9e95ba826092147d95ce7e9d27a0d3267368e43bfdbe300db2ec50c27d4171ad393370065ed3d372740e6f383f0b1c94719f538e337746b30d179f1da65583c4b1d133552ae4985731f0ef05fd2e280a70f9714d8055805b61a43d56b29feba04f3997ee2338b0fde98340945c4e5d0c43d7dba301a43dd93226a8fd55e577216efbbdb174c2ebd968ae70453506920fa558c3cd492c0ff8860cf8e7a7b8e67bb078368b11142561a47186d7dea84fe249b21d67d27c61d5c5024c4e2b515f6585b3d33642be52ff2c509bb02c4dd713000d98d2062938813b8309b4e2f135ef6dcad8705eecccd14ba19a983e0e122d971bbf536e86b3d79756e0b82c7dbc7e72f84130d773983a7ebbc91e12022bc1a1c24e248dead54d40ee05662a5821a28975aa8fc80b518eae74b0bae62bdc9c4955279116adb769d680be30a85dd45c6f128c452397827240af1fe6922eb8106db8b9e62df083d75cdeddb3c1ec88a51b60b270959448b39353af3972ba094bb7ae3c91a22a4698ca86cc27e4141f955a0f5647e4c02a12440222af34803bb11dd7028b4af78ec03fc6488090c21877a8f39b395863983c47c0edb0423f7aba508f981e95ecda6715f3995a6fd09751ada4eccc73914201bd15468a25f8700183a2fc23a5e60891af7f578c61dcb03442cafe416b880c77bb4ae2f934705a78923aa08f388d8293d3e3d56066457cd166cd82ef4713808e28d63c0499e515954d6e359344a53898db882e7c76252a906e2231c27d5136d8c7e409171b5fc963a44c90434f2a90a8a928fcb8c8f2ccc99906dc7e1f81bedba321201c53b340adb81732e559b39686734b8f99f94a82bc2c9a4aadf7cd5121204359b4b58de2aa87068cc7724e53b7a2680ebe16b99aa00d09e4903c1c45af0f8bb149a85914709d07defb2f2ceafab015d9a2b61282d70447da4930ef3a88d92cc9b546a296f35fc04d6f416ae46812ced1e5ba8baabb3e347a791cfa5211bf4134133eae70a3583b200e31bca875ab978c4bf724671432120ac8b233b07b2440b7b2fc74cd922e81982a5584713978827064cce2e26626396a6207218480e6eefc68d30f721b8f900685bab9f04405808a1df22e1c03b04d11e40ec4707718516076029f1d774b2e84c435bd219538de68ef8882821123f7aa5277c18c0783cb2be1c1c1351b23cd707123ad0d23e24f38b0b2d76bc9d1da912d30b1f1f324a33cbd38e06e35d0a16310f83aa7293525e0814806b77b1872a311bafb14b818fff7e9de735e3465268912f832932d011cfdf3b8d9739cf27332326294b589ec3d549147bc876fd7f6b94bd9bc42eb43cbbd194e97b9b39ac0ff884ecbd18c1d0d378e8684db27f661906043df4a40daf8ab3fddcdaa56aa53cddc2649a76e44df967d2699d93fe1a124e9727600b3c1c6d00f51d2ebb39f96e14f5beb36204bfd7e406a099990f1e6b518a589d8c77d325a290fd415ee2c216d4de92d16f0f2e7eeda3baa24f85acf5bb4396ca190c701e3ec719009bd911ac14774c6ccc1a1e0ce84e7ce0b4da5c1244316cd1f4f0005fb6566bec6f91fbd460b707e4f6d40f108950b86d1bdbf5ab8ada17b85c16aaf4181324606395fee45b70ec5c1a633115ba620e4f975c205d784a1f16650dcf5bfbba40b642121710184315f048218b5c4a6402357be2af093e38464002205f812d21d8ebcde7b13df465d573d1d4d272d23dff5294b9fb9adef107fb2fc768d80454c8b69bc60b264b7959356eee038570e69c1ec9c72e171014dfd90c0733cfd5842cbe7cc46c3e00ae0c9226b03465dc63e69aa57af0f4634cd8839dcfcd81950515273e0ba206d6e1cd80717a0d39bacfbc7abc25aa1b70d4fe6d3bb508cc0fa133e93a2c6bf0d072f3f37b16ab158b7aa8f5968d20a6dad5ac7947e0aac0f327852f453abbdc2903fd403085b8c9e353e9854c99ed3fc61267559b885db1a0941c52faf4ebd0a679e083fb649254b7c555a4c78f98d7b05254baf1d0a6656c9eba38028bebbd4d50adac2c37731d2cc40751d30988f386dba7a088aa62fec7d911e14ccf7c3e95aa5642ab24c0de2c80d0b9fc846935396a752d78f406ead32bf23db88c1697fe3f5ef84c770beb7aea7d2fa51079500ea23c967195f0d4925fba82e04a01eda1e38618ec289e41e69b2a447ad9d12af6bc4c5ee7c5069a933f3b09132a45669f712df525d8ca08839e5940cb534ee26897d9da71304a6b6701266f5bb8ce2e6e5cfdbfc403d8c65a56e37755b54c9f916f0beefee389606aa3b6ff44e0ef90e77d15f1dfcf9affcd0c9917df92e71e56e47fad50b704a12a91db0f3cc21fbb4a2ae6429714c0aa16812e27f9e8a0446239ea442c12a5ea3ea60804e94ee2fd74172310340b2e87921f76ebcd978e6aa29ef3bd51dc235944b9ea519518981e62e3814d221058460f78551300671c9a2be2d163840604077eed122b832a8b8886d98454f40cd6e8f93374eb9a935d686e11163403021514f6962cf379bd082568b272551bdd1174c91b3090c513d8f14d2deba2d38750f4003b5d294abdb9405b0061ebf497c9b603bc17287a02c07027df8406c0cc2ed457ec1f65a1d02b0bf4d3ae1f34482680b76839f7dca853ed5be73d4388d21dc9d5b09b94b307dc5098842000c5f12f3119c2d1c1c35275f4fee7ee1d57e8bbb04955080648b16009b5700b84c58fc02f3a2851788050bdd0bafe01fc560cc5f5b84c7d365f803908c424e731192e96b7b9cb52702a64c1356ec48d5787a087fabfd2124614103e125c62e1d48641d2e6ea6ffc255875a4a986f4a176fdff044a429fb19b3889e80a5c8898c413725f54adeaf23c5606b2c4e47612905a3a588a76b62def0a8e38d7e604d81f8c635190a035a20a7c6ca729fab69bd15b77dd21afbade460d1dbbfbf8d6d476e9dbdd7bffbd3b475c1dda9a38746713aaf403a4960464365c3e9f698872be5a15f75b0ae94736518680fda1e701a8b2bf83d57568b722da2395e0d662da495ad989446fd2bc833ebbbd3624ed746388579a372d0a1c5ea411c1d180abcde3ad5faba90e4d4397b6275f46101945db198cc9664bd1e30d15844225fd2c26bec1f9a4b8443c9fdf666d976952993408cdbd86902d435a72ee4d5e1ab733fde92c8b939e1f4dba523325fced083669398365f1c5c4847f8902855222d06e0132645dc64ff7c30825f6feb36eebeac50fc2bafe0018ac193ab5aeb9cc21665349b99e6fff18826fb766be9367a8aac7913df63d12bf684ad82a422f8198409d8be6342ad9d8a045dc8913a3b5d5ace19e1fc01cfb4e4b7980c0d76adff3729259e7d2718a26ba999e0bacc4d71d523dc9ebea6694f87c276087a9a037dec28cf85c826b5ab379dbaf09ced4de525bad8fbc15d4733ce9485e49d1fa98ffeeffd9c93fa5d709e392dfd14c247cd2a27863b31e0f50ccf9ea43dce490b6e68fd9362f65c35d8e71e6cd065da13996bd0ade38761943834496e7a63f64212d0ef4d7eb87f5efcda71a2047ad77771a6e66200ad41872215184fdbf91a9e1817dc23dfb9ad38c70f685c94cdae8f2840604cf42f4743746feaeab6d671155385259baa2f08a28d621b6cc9bcecddfe3d659d0fc6bcd85ae32872d6e7923e33e48318cfc6de888fed6825f3eb05121d16f26c94d25992733aa7f38d6d6eab8ef739860a6b6e654eaf89f40066b8a2e6ac27583e924f8a36eace9733ee8b7592d433cae457cd51755997d4fad335cb03119f1be1e0ceaf1f86a60619633345b0a4ed63bb1c8f59e61285f6afa5c953288f2d229aab62c79874bac59503e0be754b737f93d8d26862ffa564f9f6ca3df554aef16183652b651dbd0e0e5774c2ed89aa1f91155b0d746c069a1f7b8ed0ef4ddfa1a63da72078cc827a093c06ff6d330de30bd9c89fac1d50cb8de80321da17ebf251cde69e6719b94af3a78ab7a77463f4357ef72571cc5a9aed8fc4a831b837d8bb7c4da5617d057254c97a099e7baf3a26f36c45b3d14fb597468dfafda966f5f4793ebda8f000073b0c6b8550c5c561ba6407936ff5aed96eb7798ac42b23a7f0b065c31a551772cb39400ae3b3f9a52990318f2064385aea687aa54de4dadf741533d80a1d01d2ea98f2419e81ece4de00b4f9cb2e97f542b2d25649bf0ade81652ea7a6e12f6c281841c182da45881c48f134847fe6310a1a14773552c9c299302d8489dcd880b15c6320db6cc02379065c485679fc92ef21afde0cc1d01ac4b6fe0a5b00740883493cd296f9f349fb982e172d60df1d8a00af73a1c626a76e54ea0a6f094b2ade96c0f527933f384426634535e7fa55896e2bb6aadbd6895ba1f4e79d3796134f84b133d4bfd6e39d79afbc58a038f070189ebfe68ce3f226e39aaf08dccfa4885cee1bd5dfec8ac140647cca7b85ec4973bad899d06e348c0806a291e3ce4c09103e364208a06f09ca6b9c75ba9c98c2e986402bec9e31fbb929c24e94e21a9d04eb86e6e60a1ac2ba9036fa18aadda28e8bd5d4b1c842840d55b8fbc365ec7e23f5e9a9af407f5a1081eef1dd204747504f5f1643870a403700391c46b01c7dcd66bfc0e45ab5eb5effd183d8856f6b0ac1e627b33e2858b516144e70be0d0f2ff75fc550704dc8b65bdc403dc4c869a086619113ef69f811ad861c82b5763f8ca11f1cd476e4045af96b7a62d910931f89c521f96b8e80cf5599caeb217d73110ddfcdeab20038e39a84b6e2183a3197413000e93aa255caa039768e0595ac9c234b7f64b3281e1a1d16e642ee218c0c370f44e90acd7e9da0cac47c7ab1675733636d73143a344dc3f9b57fd3ac67ee5b1f2b369c18a8d8248a73e36be818ea2efa51185b72a85730745ee612e05793388ab3b3af3759c084b9e81faa099a024834a7fbf38f757b532caa16028ed4f0e26efb508793e6046c594eeb2f5a217cdf2f94bd165d88572feacc6f406d4ef409ad42978ecad4632b8c2f6675c71730d841739ab2e9c8f555529b16d248f16dbc12617006cfcdc5b7652b53824b45455f1c3918541bfe829b699a78655e80cab829d4384b68e6aeec3c5c32b8b5dcaf44b4709d4a4c0a30824f6e11a3cd1056cabdf1ec9d9635b4ceb668fbff1ff697d73af694212096af601022649b61bd97e6f8c3d61e60535aabbe594c0d3acd3035b4b4b66d5a2183ee0db0698e173e80e491be68154ea7fd62eb4acbf0afed3687eab641ab0547b2847182a272fa02d6237735ab0817f26f22e08d5490c7941b8e44e06a3d7b36fb370e91814b995ea9e92a0eeb4bb3dec0fb9c63677ed9f9a621df51985469a85e0267b7d316044c6fe195112d6131a2c76e306bf4e31839d874f071c81f734b971a20e0020407d0a2335e7b2e6f84a82898da32119ef72628571438ec736019cc193deb59f9db09c7133aad71ff00f3b5cd1c10213af02d15dd74a816ca6c7ab20d51c7f27a36a949c24a11ba6ff0a71868e5e74782bbb2c6ea65c94c1cda6c2896a0680197f4cd09744abdb4c84a67c6f27b5c794ee5a7c29ac754d7f354f403db011f0bd40943e34a1f9f692824867b98cb38fd58e2533adc5468978a85344bf953edd49c71c3458bfc9ffe42fde433267488650c6e3f92bdde25229059d80ef804a523dd7521095eaf8e2630692f3e3953481fe27bacf84c29a45d72a81a469671c2b6d0cd7aa6ad1865840c404f3c3b7642844e068e42f9c4d78200d356554e4e854475d2dbbb04329e5e577e834828522f358a6a9a48c06faef731952aee790c5511054e2e567718c64de715f6786acf0564415a157679874aae128e1e95fd1d8af690dd26258463b27c2489b3586183dad5ee8283666a24b0721473c8cad6d2c9a046ade361a3d9ce2c458a839d869cf883b3492de7c14891e7a34c3c9f0cd31707c2f867172b282ad00be2823b3508d7df324c972ed091235cdcb301af0f4a9a9ce34ea24e8a12c827831c5631c74e8a3f33fb00ceed39eed40c37c9187b388b2dcf710541f954f4081a4ee43681489998b162f9fab1903e352f90001c1425f0c30eec310a5687b2f5d4f57b3de754e98c85cdeaa7f0bef9805dd1918643fa8ce15b55d2b92c720c3907c66abb8966f63c39d467e0850fd69f05015a03cc1a30284df637c8a145cee4e6e8ffea498b781e0e30c234685843ccee199098a1aa861fa48dc09201ce43926897b679f420ac21da7d85e8fba33c32d2132f5aaef532211de0f905f51988ae18d18d2bd32cb5f948ab0103cadc850e8cee64403efbcf7ae4d83ec9eb884ec06c16bf4f042519922ba661398ec8ad7e9bf39db83ce68d724cc3603b6070fcba48aaea7011eec0f6688a616381716569d9e7f4b130971cfed9815c00ecac819e5d15e235a9304660d07aea61830a6a5466807cf17e9fc179dff67fd232ed6d457d04790073c2714fb9c30106b2d015ddcfeac614f499d5d59f8d65a09c51f44c83ed8f0ef7cf80a4acf5d0ec7fbc322f8302acfcf7eece15863b24536f5a113bf92041d0a1f1d4500e4010183acb3b3974a6f93c593258be1880511e7c516cb51050ab22752c6d6ee88d0a3cd798c10359c07", + "0x3a65787472696e7369635f696e646578": "0x00000000", + "0x3c311d57d4daf52904616cf69648081e4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x3c311d57d4daf52904616cf69648081e5e0621c4869aa60c02be9adcc98a0d1d": "0x244408941da4daa50e86160889864e6446252ed4723f577aa0f81ed69de5e3bf77083ead3d8118dbbeca37e674f5d9a896280aed62b8bafaf07da69db69f8a6c66ce5e4aeac2a01ef207296337980617eb138104d003f0d6af1343422741c4d108e052d1e8bfff7ae85c5431dfdced574445ecd510e6af5f407d340464ac9b37575efcb324554ab7707a37d994bdcbb038592c0e08e91b93b24508c1a601069d3e7603788559c072033026f1c18995c984c29dfa089dff61cbc77fe44173992557e83c370b0200bfd0c723516b2541396a404a9669ec5310b839a4c87ddba9e217aa89c637915970e9a83c19c2c76dee75aecc916a9b79cf319b27aecfaddf7318c6b64d13a6c5a08d66db11eae72e65034b7d05b980b0b1b5f91168bb68dae76f", + "0x3f1467a096bcd71a5b6a0c8155e20810308ce9615de0775a82f8a94dc3d285a1": "0x01", + "0x3f1467a096bcd71a5b6a0c8155e208103f2edf3bdf381debe331ab7446addfdc": "0x000064a7b3b6e00d0000000000000000", + "0x3f1467a096bcd71a5b6a0c8155e208104e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x45323df7cc47150b3930e2666b0aa3134e7b9012096b41c4eb3aaf947f6ea429": "0x0200", + "0x57f8dc2f5ab09467896f47300f0424384e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x57f8dc2f5ab09467896f47300f0424385e0621c4869aa60c02be9adcc98a0d1d": "0x244408941da4daa50e86160889864e6446252ed4723f577aa0f81ed69de5e3bf77083ead3d8118dbbeca37e674f5d9a896280aed62b8bafaf07da69db69f8a6c66ce5e4aeac2a01ef207296337980617eb138104d003f0d6af1343422741c4d108e052d1e8bfff7ae85c5431dfdced574445ecd510e6af5f407d340464ac9b37575efcb324554ab7707a37d994bdcbb038592c0e08e91b93b24508c1a601069d3e7603788559c072033026f1c18995c984c29dfa089dff61cbc77fe44173992557e83c370b0200bfd0c723516b2541396a404a9669ec5310b839a4c87ddba9e217aa89c637915970e9a83c19c2c76dee75aecc916a9b79cf319b27aecfaddf7318c6b64d13a6c5a08d66db11eae72e65034b7d05b980b0b1b5f91168bb68dae76f", + "0x6dd12b3ae7975bb95f841f4505bc193c4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x7474449cca95dc5d0c00e71735a6d17d4e7b9012096b41c4eb3aaf947f6ea429": "0x0100", + "0x79e2fe5d327165001f8232643023ed8b4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x7b3237373ffdfeb1cab4222e3b520d6b4e7b9012096b41c4eb3aaf947f6ea429": "0x0400", + "0xb8753e9383841da95f7b8871e5de32694e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0xc2261276cc9d1f8598ea4b6a74b15c2f4e7b9012096b41c4eb3aaf947f6ea429": "0x0100", + "0xc2261276cc9d1f8598ea4b6a74b15c2f57c875e4cff74148e4628f264b974c80": "0x00000000000000000000000000000000", + "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb334bd1b4448aed1acf00168a3d082a8ccf93945b1f173fdaecc1ce76fc09bbde18423640194be7212": "0xc6b64d13a6c5a08d66db11eae72e65034b7d05b980b0b1b5f91168bb68dae76f", + "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3558b17e2d0b3f3f1026d79399d627961c528d648413b2aa54595245d97158a8b90900287dee28216": "0x083ead3d8118dbbeca37e674f5d9a896280aed62b8bafaf07da69db69f8a6c66", + "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb36823ed8df7d5f458c46ff658221e07564fde2764017590264f9dfced3538e283856c43e0ee456e51": "0x5efcb324554ab7707a37d994bdcbb038592c0e08e91b93b24508c1a601069d3e", + "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb36a0c0593a5aea5de3a6a0745688c52b4709f65fa2e4508dfa0940ccc0d282cd16be9bc043b2f4a04": "0xe052d1e8bfff7ae85c5431dfdced574445ecd510e6af5f407d340464ac9b3757", + "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3753bb535f9a5c087d4e6d6256f56677bcdbc0543f1a2c40aa82497b33af1748fc10113b1e2a1b460": "0xe83c370b0200bfd0c723516b2541396a404a9669ec5310b839a4c87ddba9e217", + "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3dc6f27160949ee4e00c6f7906ecf1460717a95098a86e69df61cf7d72c2a29232b602acbfc131b25": "0x4408941da4daa50e86160889864e6446252ed4723f577aa0f81ed69de5e3bf77", + "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3e71f9b191f1e16b3e5c49f7bc76b9e1b91566945e2eb539d960da57ca8e9ccd0e6030e4b11b60099": "0xaa89c637915970e9a83c19c2c76dee75aecc916a9b79cf319b27aecfaddf7318", + "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3e98536500b848d680e8199042942b28db8753a29cf4ade28435e4594cd014657d3aa94bf821c0a42": "0xce5e4aeac2a01ef207296337980617eb138104d003f0d6af1343422741c4d108", + "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3ecae93125fe97dbcd46f22cb677963c38e1adf0e1f79c9039164a3eaeaa810a9a18588be6483ca35": "0x7603788559c072033026f1c18995c984c29dfa089dff61cbc77fe44173992557", + "0xcec5070d609dd3497f72bde07fc96ba04e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950077818960c32607d6175726180e052d1e8bfff7ae85c5431dfdced574445ecd510e6af5f407d340464ac9b3757": "0x3a6a0745688c52b4709f65fa2e4508dfa0940ccc0d282cd16be9bc043b2f4a04", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950242b5016f3cc9b826175726180e83c370b0200bfd0c723516b2541396a404a9669ec5310b839a4c87ddba9e217": "0xd4e6d6256f56677bcdbc0543f1a2c40aa82497b33af1748fc10113b1e2a1b460", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195032a9439f746cff1661757261804408941da4daa50e86160889864e6446252ed4723f577aa0f81ed69de5e3bf77": "0x00c6f7906ecf1460717a95098a86e69df61cf7d72c2a29232b602acbfc131b25", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195056e33a029c7758c06175726180ce5e4aeac2a01ef207296337980617eb138104d003f0d6af1343422741c4d108": "0x0e8199042942b28db8753a29cf4ade28435e4594cd014657d3aa94bf821c0a42", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950596f1bd92c5ea6d861757261807603788559c072033026f1c18995c984c29dfa089dff61cbc77fe44173992557": "0xd46f22cb677963c38e1adf0e1f79c9039164a3eaeaa810a9a18588be6483ca35", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19505ca046c5184a77e06175726180aa89c637915970e9a83c19c2c76dee75aecc916a9b79cf319b27aecfaddf7318": "0xe5c49f7bc76b9e1b91566945e2eb539d960da57ca8e9ccd0e6030e4b11b60099", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19506ca8e019c27ba3866175726180c6b64d13a6c5a08d66db11eae72e65034b7d05b980b0b1b5f91168bb68dae76f": "0xf00168a3d082a8ccf93945b1f173fdaecc1ce76fc09bbde18423640194be7212", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19508b8079c9c5350ca761757261805efcb324554ab7707a37d994bdcbb038592c0e08e91b93b24508c1a601069d3e": "0xc46ff658221e07564fde2764017590264f9dfced3538e283856c43e0ee456e51", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950b02302af392a80566175726180083ead3d8118dbbeca37e674f5d9a896280aed62b8bafaf07da69db69f8a6c66": "0x026d79399d627961c528d648413b2aa54595245d97158a8b90900287dee28216", + "0xcec5070d609dd3497f72bde07fc96ba088dcde934c658227ee1dfafcd6e16903": "0x2400c6f7906ecf1460717a95098a86e69df61cf7d72c2a29232b602acbfc131b25026d79399d627961c528d648413b2aa54595245d97158a8b90900287dee282160e8199042942b28db8753a29cf4ade28435e4594cd014657d3aa94bf821c0a423a6a0745688c52b4709f65fa2e4508dfa0940ccc0d282cd16be9bc043b2f4a04c46ff658221e07564fde2764017590264f9dfced3538e283856c43e0ee456e51d46f22cb677963c38e1adf0e1f79c9039164a3eaeaa810a9a18588be6483ca35d4e6d6256f56677bcdbc0543f1a2c40aa82497b33af1748fc10113b1e2a1b460e5c49f7bc76b9e1b91566945e2eb539d960da57ca8e9ccd0e6030e4b11b60099f00168a3d082a8ccf93945b1f173fdaecc1ce76fc09bbde18423640194be7212", + "0xcec5070d609dd3497f72bde07fc96ba0e0cdd062e6eaf24295ad4ccfc41d4609": "0x2400c6f7906ecf1460717a95098a86e69df61cf7d72c2a29232b602acbfc131b254408941da4daa50e86160889864e6446252ed4723f577aa0f81ed69de5e3bf77026d79399d627961c528d648413b2aa54595245d97158a8b90900287dee28216083ead3d8118dbbeca37e674f5d9a896280aed62b8bafaf07da69db69f8a6c660e8199042942b28db8753a29cf4ade28435e4594cd014657d3aa94bf821c0a42ce5e4aeac2a01ef207296337980617eb138104d003f0d6af1343422741c4d1083a6a0745688c52b4709f65fa2e4508dfa0940ccc0d282cd16be9bc043b2f4a04e052d1e8bfff7ae85c5431dfdced574445ecd510e6af5f407d340464ac9b3757c46ff658221e07564fde2764017590264f9dfced3538e283856c43e0ee456e515efcb324554ab7707a37d994bdcbb038592c0e08e91b93b24508c1a601069d3ed46f22cb677963c38e1adf0e1f79c9039164a3eaeaa810a9a18588be6483ca357603788559c072033026f1c18995c984c29dfa089dff61cbc77fe44173992557d4e6d6256f56677bcdbc0543f1a2c40aa82497b33af1748fc10113b1e2a1b460e83c370b0200bfd0c723516b2541396a404a9669ec5310b839a4c87ddba9e217e5c49f7bc76b9e1b91566945e2eb539d960da57ca8e9ccd0e6030e4b11b60099aa89c637915970e9a83c19c2c76dee75aecc916a9b79cf319b27aecfaddf7318f00168a3d082a8ccf93945b1f173fdaecc1ce76fc09bbde18423640194be7212c6b64d13a6c5a08d66db11eae72e65034b7d05b980b0b1b5f91168bb68dae76f", + "0xd57bce545fb382c34570e5dfbf338f5e4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0xd5e1a2fa16732ce6906189438c0a82c64e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0xe38f185207498abb5c213d0fb059b3d84e7b9012096b41c4eb3aaf947f6ea429": "0x0100", + "0xe38f185207498abb5c213d0fb059b3d86323ae84c43568be0d1394d5d0d522c4": "0x03000000", + "0xf0c365c3cf59d671eb72da0e7a4113c44e7b9012096b41c4eb3aaf947f6ea429": "0x0000" + }, + "childrenDefault": {} + } + } +} \ No newline at end of file diff --git a/cumulus/parachains/chain-specs/people-westend.json b/cumulus/parachains/chain-specs/people-westend.json index fa29853c70b05e47df50445935be42a4637f240d..d6f0e15e0248e967151767c64771c062d5a89741 100644 --- a/cumulus/parachains/chain-specs/people-westend.json +++ b/cumulus/parachains/chain-specs/people-westend.json @@ -7,10 +7,24 @@ "/dns/westend-people-collator-node-0.parity-testnet.parity.io/tcp/443/wss/p2p/12D3KooWDcLjDLTu9fNhmas9DTWtqdv8eUbFMWQzVwvXRK7QcjHD", "/dns/westend-people-collator-node-1.parity-testnet.parity.io/tcp/30333/p2p/12D3KooWM56JbKWAXsDyWh313z73aKYVMp1Hj2nSnAKY3q6MnoC9", "/dns/westend-people-collator-node-1.parity-testnet.parity.io/tcp/443/wss/p2p/12D3KooWM56JbKWAXsDyWh313z73aKYVMp1Hj2nSnAKY3q6MnoC9", - "/dns/westend-people-collator-node-2.parity-testnet.parity.io/tcp/30333/p2p/12D3KooWGVYTVKW7tYe51JvetvGvVLDPXzqQX1mueJgz14FgkmHG", - "/dns/westend-people-collator-node-2.parity-testnet.parity.io/tcp/443/wss/p2p/12D3KooWGVYTVKW7tYe51JvetvGvVLDPXzqQX1mueJgz14FgkmHG", - "/dns/westend-people-collator-node-3.parity-testnet.parity.io/tcp/30333/p2p/12D3KooWCF1eA2Gap69zgXD7Df3e9DqDUsGoByocggTGejoHjK23", - "/dns/westend-people-collator-node-3.parity-testnet.parity.io/tcp/443/wss/p2p/12D3KooWCF1eA2Gap69zgXD7Df3e9DqDUsGoByocggTGejoHjK23" + "/dns/identity-westend.bootnodes.polkadotters.com/tcp/30532/p2p/12D3KooWKr9San6KTM7REJ95cBaDoiciGcWnW8TTftEJgxGF5Ehb", + "/dns/identity-westend.bootnodes.polkadotters.com/tcp/30534/wss/p2p/12D3KooWKr9San6KTM7REJ95cBaDoiciGcWnW8TTftEJgxGF5Ehb", + "/dns/people-westend-bootnode.radiumblock.com/tcp/30333/p2p/12D3KooWHb7bp7fvxCwR1i6m8xn4j1ZSVZ6a49TVYbrWSC2sJhn4", + "/dns/people-westend-bootnode.radiumblock.com/tcp/30336/wss/p2p/12D3KooWHb7bp7fvxCwR1i6m8xn4j1ZSVZ6a49TVYbrWSC2sJhn4", + "/dns/boot-node.helikon.io/tcp/9520/p2p/12D3KooWHhZk21Wzvsd3Un1Cp63diXqr6idbG1MEiUWaitUZuX4c", + "/dns/boot-node.helikon.io/tcp/9522/wss/p2p/12D3KooWHhZk21Wzvsd3Un1Cp63diXqr6idbG1MEiUWaitUZuX4c", + "/dns/boot.metaspan.io/tcp/35068/p2p/12D3KooWAtw8ybFXNmNdTUsvt2gfKwtuea9wDQT2b8FpbVNKYGwc", + "/dns/boot.metaspan.io/tcp/35069/wss/p2p/12D3KooWAtw8ybFXNmNdTUsvt2gfKwtuea9wDQT2b8FpbVNKYGwc", + "/dns/boot.stake.plus/tcp/46333/p2p/12D3KooWLNWUF4H5WE3dy2rPB56gVcR48XY2rHwEaZ6pGTK6HYFi", + "/dns/boot.stake.plus/tcp/46334/wss/p2p/12D3KooWLNWUF4H5WE3dy2rPB56gVcR48XY2rHwEaZ6pGTK6HYFi", + "/dns/boot.gatotech.network/tcp/33340/p2p/12D3KooWHwURYtEHpexfrZa8k8hVgVi5FTFr4N8HBnn9kPDsWfgA", + "/dns/boot.gatotech.network/tcp/35340/wss/p2p/12D3KooWHwURYtEHpexfrZa8k8hVgVi5FTFr4N8HBnn9kPDsWfgA", + "/dns/people-westend.bootnode.amforc.com/tcp/30333/wss/p2p/12D3KooWQrMQFAXxJJJCtVr8nViBR6EDsuT1RyqU3eoCMebRQxTf", + "/dns/people-westend.bootnode.amforc.com/tcp/30346/p2p/12D3KooWQrMQFAXxJJJCtVr8nViBR6EDsuT1RyqU3eoCMebRQxTf", + "/dns/people-westend-bootnode.turboflakes.io/tcp/30650/p2p/12D3KooWQEhmZg3uMkuxVUx3jbsD84zEX4dUKtvHfmCoBWMhybKW", + "/dns/people-westend-bootnode.turboflakes.io/tcp/30750/wss/p2p/12D3KooWQEhmZg3uMkuxVUx3jbsD84zEX4dUKtvHfmCoBWMhybKW", + "/dns/people-westend-boot-ng.dwellir.com/tcp/443/wss/p2p/12D3KooWBdCpCabhgBpLn67LWcXE2JJCCTMhuJHrfDNiTiCCr3KX", + "/dns/people-westend-boot-ng.dwellir.com/tcp/30355/p2p/12D3KooWBdCpCabhgBpLn67LWcXE2JJCCTMhuJHrfDNiTiCCr3KX" ], "telemetryEndpoints": null, "protocolId": null, @@ -29,7 +43,7 @@ "0x0d715f2646c8f85767b5d2764bb278264e7b9012096b41c4eb3aaf947f6ea429": "0x0000", "0x15464cac3378d46f113cd5b7a4d71c84476f594316a7dfe49c1f352d95abdaf1": "0x00000000", "0x15464cac3378d46f113cd5b7a4d71c844e7b9012096b41c4eb3aaf947f6ea429": "0x0100", - "0x15464cac3378d46f113cd5b7a4d71c845579297f4dfb9609e7e4c2ebab9ce40a": "0x100845a5993b29977c58c9ef36aad0e09946f8a10b2ad30956dec1207beda8014a6ea1de453086c8ecafdcb8c05c2ffc5b31dca333e27af61595e11a6dc88f744876aad3978bef6ce80e5b7bb80e9ae9e1fb23fa1133088fa9e0555d6d96f1151bf8465e78528188a1511df15027568a300d1319d346dc7ddde5bc33dc8c27fa5f", + "0x15464cac3378d46f113cd5b7a4d71c845579297f4dfb9609e7e4c2ebab9ce40a": "0x080845a5993b29977c58c9ef36aad0e09946f8a10b2ad30956dec1207beda8014af8465e78528188a1511df15027568a300d1319d346dc7ddde5bc33dc8c27fa5f", "0x15464cac3378d46f113cd5b7a4d71c84579f5a43435b04a98d64da0cefe18505": "0x00a0acb9030000000000000000000000", "0x26aa394eea5630e07c48ae0c9558cef734abf5cb34d6244378cddbf18e849d96": "0x0000000042e478677a0a0600", "0x26aa394eea5630e07c48ae0c9558cef74e7b9012096b41c4eb3aaf947f6ea429": "0x0000", @@ -37,46 +51,207 @@ "0x26aa394eea5630e07c48ae0c9558cef78a42f33323cb5ced3b44dd825fda9fcc": "0x4545454545454545454545454545454545454545454545454545454545454545", "0x26aa394eea5630e07c48ae0c9558cef7a44704b568d21667356a5a050c118746b4def25cfda6ef3a00000000": "0x4545454545454545454545454545454545454545454545454545454545454545", "0x26aa394eea5630e07c48ae0c9558cef7a7fd6c28836b9a28522dc924110cf439": "0x01", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9446a2e9dc56d0fc437619542d91055bc76aad3978bef6ce80e5b7bb80e9ae9e1fb23fa1133088fa9e0555d6d96f1151b": "0x0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da94bb69671d3f9f0999498b683e73934d36ea1de453086c8ecafdcb8c05c2ffc5b31dca333e27af61595e11a6dc88f7448": "0x0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080", "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9d541fcf54011c18b8f8c5b4eca08a1290845a5993b29977c58c9ef36aad0e09946f8a10b2ad30956dec1207beda8014a": "0x0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080", "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9f4caf657e712ee5527fb899d47951485f8465e78528188a1511df15027568a300d1319d346dc7ddde5bc33dc8c27fa5f": "0x0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080", - "0x26aa394eea5630e07c48ae0c9558cef7f9cce9c888469bb1a0dceaa129672ef8": "0x59933870656f706c652d77657374656e64", - "0x2aeddc77fe58c98d50bd37f1b90840f94e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x26aa394eea5630e07c48ae0c9558cef7f9cce9c888469bb1a0dceaa129672ef8": "0xc2663d003870656f706c652d77657374656e64", + "0x2aeddc77fe58c98d50bd37f1b90840f94e7b9012096b41c4eb3aaf947f6ea429": "0x0100", "0x3a63": "0x", - "0x3a636f6465": "0x52bc537646db8e0528b52ffd00582c95057e1687d115511068699374c0c0584cc28185ea3236b649401bcb6091468b5335a83460b397a2b8c2fa04c359796ed1f8e156844e030238c2d7b44a07717524217769c6f69236bedf078f0d7dd21a219b1042c8de5b6e191d18d9147e14bb892a10ecea3ed537da5549e2ab318696e8997dffb6236f4c6b755748372bd01bd3f3f2bbf1b03debee0dd86146b731fa3eb442e42ddaf1f93d8cc25eb5c43ce46962f47fad37c1e3d585f09bb0b9e802806fe289f79ae3f0853c4dd8d4938ec39b37f1e3f3fb0bf23431a4891eb7f9be06f234c1a39e787c34ba8dcc47f43c7ee2514f32416ef3138f6b1fbd09584fd775ae9eb85bf027584f577de2fd743de732dfbee7204f13593d6567feb4a9a77a0bc86b385bb7f9896f534f529eaba7ecdc4f369f6f22fea69e6868aea39ee0b17ac24ee74ff4b39e20fc699ef4198ebb564f523eab27584f3e9e9d83e77ed2ced5939cf9495ee734fcc49d867aa2a1f98e7ada71cb7a4e3dd1e47c87b5e334fc649d867acac160ce4f5890fa4469a69e66be63c749333b76d403c9b2e7f8c8b2996174870d0f19c8598c653ce03577c811951a5f363223bea8c5412eb3764ca9f1b0e171d1918ccc300c4eceda21a3713c30cd46c6e28bb311953ba0dc6103af1a02c04d1ed1791b6468c86aa861c666424c47e727be8e0ec683477d89bb5ed20210809fb2072000d4b246afd7d1b2ebc852e927fa520da56bb4837b7d006c641e80dbf0138fdba0a3f3d3bc0e0d3ab7e1274cd650c3a4af2fc91d2f710d35d410809fac07a09e6aa84106de061a68f0f193761fd8eb7572ee03080f1baef393cd754a25009c867a2a1d080dd7f9293b909fb81ae433336cf3fa1a7cf838909c9c93ee03c87dfc24731fd76bf80d3f8d7ec31b82731b7e1add8617e4406cf80d3ff138909faeeb947070ea71748ef3133dcefb691ee73490480792534f3eeac9c7819c9473d24fda49ef27791a5efa897be901a0869facd7504f00a8e1b59e00f09c9c977e82af3f61bfa19e02108007a927523d913e33739c7abab939a99e703e3373d24f3b4eaaa71bd26f7ed26acfeabc07b90d40341df7514f37f574731fd7b4d79fb2d77ad201e4f5a7598f589d771db7e1a7ac22b13aef36d45300ea134f679e867acab2d3d413cd270d9f3f613588594fd93c4e3d65d7b06b3fd1fac3eabce3fcb4a3f2b03aefa57aaa61c701504fb59eea69a00f524f40fe5a4f9b052a6428634c0cc0a0822a26aa04124891843274e1054d28c1d4047d8f4dbd56e79dd6d3eb79d45d9df71f75a1ce3ec787cd71ea8954f39b7a42fd20075af80246063430e307261b140c9678420ac448830c60aa30d9fc24536b56e7dda69e6aea421d1c6a57eafd6954b9d579ef512fa8b3e7f113ac45acce3b8f7ada519f78a626644e534fa3cfd42786989a80d7514f32a28fea09a5859639b46811071c5bf082092e14c4e4008b14c0200e31c8606a027ef4135789accefba89e4475a18e006a47a4f727ab0e599df7add6409dfd892b93d579d7ea69d6274aa626aa67f5b4030fba70e1067030414c0d4c587de2a6267e8421061d80f10427caa00553137ceba7ab9656e7ddaaa7aa2ed41152bb21bd3fc9fad5798f95833afb3d0a0ae9b09031f3bda069b8f46ab8f4b68041d300c5c65921af2e971e7d47b681de986d85f0b515c287344b77b1d9052dc46dca8954ef656fca0929bae31d78fe06b7de94135b960b333eee165f340d97b6462ef177037a635ad26b85f051aff76f096e534358625f5b449e8f6d916dbea46bc9685c5a2e7535fdfe7a535a84d1345c7a8ff4f5d2f85eca092a6f3033c32e101ec243086110888126b0747771c3de5413437ddee1c720dd0de72554aef4a69868a3bb51c3dbd09b62824bcfd10689bc83ea8e9fe4e7555292d8efb1df91181a1a1a6a8e1d121d1f2bd0cffb7667f5fba3f24617533e84ef7d3e0dbe7a318a1fd0f24ea735f368acb33970d55f9fb84d31b1456f8a89a1ee7e34bf00bda925ca68de7c6a9a5fa3f1ce753ec73bd5f934bcf95c55f5f9b4d7f36dd56745831e904fe4523c12aeabbf8d87edeabbf92c973aad9fac1daae575bd075eb48bddc507c1b6be9b8f7c0fcfb91bacdda9e12fdabdaf57b45b2e21d1d7bbe55277445fefaa2f97ba22fa7a0f84d4aa40a786afe8f6453b9c8e9f4fb3e87645b77753121b4a0a041b3ed2e5d2ab914befd68330982c21ad9ae9eb47bb10f4fbdcc72cea46d00fd2f7dd90c87eb1996ea3f82d991bd40504dca696e02200dcebaed44b4cd125dee1dfc03b0f0b192b64bb8735de19e2c4dc1ab8fdfb625f76bdf4ee7e83ac02e6ee70effbc5e6f2cedbd7fb395aded9e67757cf7783048b9715b23ddf6e301efe1d6e3eafee9341c2022f5cdae643ba5c82af79e3ef16eb72a987e1db7a4035f7f0ebc2dc66fe63ae8b7a0fc9dc6f90a51df7ae0d81f0efbdc7f03dfc203c4308e13b7cccbf9a2b29093f9e5f8d5cda73edf8b0fefc1d616e90ee06e0e6e6c02d97e0db8c20313434a44443de81efe212bf8721d5b8c42f00d7d134ff3dbebb9a3f6be6d36878875fc33baff938bc037de07bb887239df2a3a5a0ae7ebffa555292f7f8f758835ec31a5fed1ec3f7c898db1ba4e39a3f2fdee96e8060c1bd775af310ee5dc9fb0facf1514e6daced1679efe0974bdd6bf8fd8414070efe08acd764edd1d8da1689f2c43490d553748c26d41e85bd4da9b4303d45136d91286fa88114d0effcdd94c4a1b721e186fa5de39d6dfe6e48de50bff7f0d2205c7fb85e20287eccc69cbb32485890e2d2f67269bf9b4fe4d2be871787e70671ddd5f25c9596bf7867534a0cb5bcc63b8f674d1d4dcbcfd106e9def2cb3bf19dd6fb8b77e0f7cb3beffbc83bfc3dc73bdbfbdd90f0bbd7f1bb2189e7f7f00691f5e7bd4050ef3d25f6d980dbd41667f41b6af839da6f90ee0d357ff2f490ee764c777b7e0f5cba0de9ae90fd7cdad25702ee67bfddbda1eef67cee4d6da1837efdce5b9237d4b0766fa8f77337255cc7433a2576ac406f4cc32fed50bddf2dd2c59390641d2bd0a8e1178d1ed2dd8ee96ecfef814bb721dd15b29fac2d7d42e0de5fef0e60ff36a037fc6e405cc38ac3a5f71eeee11eeee11e5eba5cda6f10ae3f6fa817080a3e46633e33b8f7e5d27eb5b93cdcfb7e31204abc141636c880600112051014542ed437aa176a983a859a852aa66ea14a8192a1b651bb50a950d9a841a86554207ccbab50366a0b6819ea09ea50a542bfa84ad4256a139589ea442501bd41ad42dda039a054a056a06b5024d01a502fb409b40d3a05ca05aa020a037a054a0635027501c502adc2dba066d02f740974889e419340994095a04ab818a81c740c6a031a07f582724167407140b5a045a05ba814740c5d01edc2ad40e7f8156898977125dc8c27814ae15fcec5bbb81797e338b8109e83dbe0477819ae8387e143b813a7f22b6e023a84337133bc8967f1125022fc097a042a062d83864185702b07c3ada057d02d688afe805241a7a0601c8b6b71326816540b1d03e542bbd01750199c06d407f7f231aa14b4073505150587e359ea0a2a0b2e06ddc20f2e7e74f1e38a1f5bfc90c10f2d3facf8f1821f55fca0e2470c7e58f971821f28c839430e1c3959c8c1428e1b396de40c21c70a3955c8b9420e15728a9003849c24e44021c78c9c2f3963e43021878c1c25e42c21a74b0e1172bce41c21a7092422e4a491e3849c354856908090c306298c9c20e4080167091c2570864863485b20bd41d2028e13384de050c16102e7091c28705880b3029c2870548093029c2b3828c039018e0970ace09480e4060e169c1690ba40e2028e14a43390e620c9413203a90c243290e2208d8124065218487090c0405a83c406690924344851203981a406a909a433484c202981d4857404120f483d2071218941f201c90b120e48291215a42a4828209d8074856402d210c90a890912159212a414909620397163861b396ecaf0b83c22bc2d6ee2b819c30d186ec87043c68d116ec4b811c28d1736616e6070f3029b28dc547193e5868a1b2b6e627093c50d16a22a44508852204281880ad10a4432106921ca4294457485080b9115a228442d109940f402d11511165109442e10c5402485080622156c4ad892b07dd9cc109d40c40291159116d1145b0b362c1b0b6cd6b091820d1b9c623038080c04eec23f601f700f980bf38077c03ae02f38078c03f682b7f00dd806dc0573c135601a4c2f48276c5ad0830c92049996992f382d1c16333f98e141b6458d1830093a7e60c3021e4298b181c8063dae305a43870f7a983162a30716b6316436e871060909a4347a3441460d7e0276061e62729e40cab2430b3ca2d811051e28d8c1068f2b3bd69019820c117654610715765c61870f76fc60470f7674d9c16547183b523bb2209a0183d9d184466507133d98d0438e1d57dce4804920230599336cbef448428f2ee420618606354ad450c1e6a86183c60a4d097898c1030934506c2fa07982a6ca8c0f6a7e50e3032e06335d381acceca06607353ca8e9810d14b8197059c8d860c712d90d66b8643398e9c18c18150964a270b385bb018f20644b88bcb0d181b6042607060451171a1a5819b03832266ca8b0a962f405110e74a0a1a3093a989075a186891e5e90f142668b0c10647020c345e60b7a06991dc83441ae41ba42c609b405dc19354fa856b80c66caa070cc0461134346839a20d4e4a046079c153340e0aec8b4a80102a785c6852d8e193066749071c15191d5a0e68b9a2e355c38197059b22cb81a7036c0cc2083841e6ff40803e94b6c8188063966c89123678e9a35444cd4a8b19d81ab6867684ad096a031619be3668a1b176c637608618718a2219112dfa262a15e81dba2068c9c3244285437ea11a818382e7aa441bb9839028502f7053745b665b3e2e68a6c8aec053234e881049a2d6856a88982e605ad0b9a981e62b0b10157450f33e4a011e1f8a1452443dc42e442cd12365a645ebc316cd4d0aa10d5604a611a6116617a99644c24cc34e611269859c634434465be31b530b34043829c33781c212e31b1309383191cc84041e6093cbce4488107193c80d0230e1214484fe0be20a3841e637e64e1d185c717d20e3837b82d3f6a5073844c06d9173550c87e3089b04389cc0a992ee610b42d645864593220645db0276069f4643e58c0cd19322ab22b4855b21e645d645cb22a321e90ccb8197333c7468657841f33804a10e580c485cc17ac8b0c188c0c3dca2083460f2e686df41063b3a587164437e8f1051b2f7a80c1e6062412f43803690b4907181b189818060b427c824c1a373ac85c400386268d1e3ea05fd0a2c08308346190c9d2030e1e63c82c81060d6d06d5043953d0aaa021414a4103a3d140b445a2115910dbe801868d0b681699303c8ac0a971b30311173446c856602303192a64b6e011468d82460c3db2d00308978214430a829606090c8a058f21d40cf518c39ba099d1630b34269059838a1981790db435281874f440f3010d19326c9c0a3de6c8584083021e46b0d9c164424e987b815a71226849202581e6043db86454b62d28161e608cbc205385b6c58b20c3841b311c14b827d030f048f11043fb014f4107979f7123d0c0f1198cd29060280faea5871b3457445fc4347af4202a6183a51aa26a482dc82cc837241b39606ebe20c59060c82f640ee418d20c790499923d90489040905c6412a41749048903b9457a2187207d20bbc822c81fc832240fa41064102419320c6904a903f945eee0c60b928a64422e21958861885e886f442c442de4682166218e2146a1aa12a510d7886a4436221a114c2c4134c10f17c42bf1045105518a18454c41b472b3853874c345742232119b88546eba80568055806dc02bc0347ed0e0860b376f40336ebe60359805bc044e02138165f0e4602530137808ac0567c15a6e8ac050e0346e6ec056b8048c0286824d00e4047cc68d0dde1cef0c8f0cecc48d979b2e70149e78e089e195f18ef08cf0ae3c14bc133c243c133c2b493c322af06381a703278f8b224620822841bc2e5e0f240044048c40e0013f28f121490390f0c000050829bd2fcfcb0d3a031000016c9862cd315fef1b410163d8448a101b587284104d8a58b2643e480494264b96644284cc888188274e3eb001d24c18b6034e3800c588264142348932841427529a40697224c80c1c432c31820350903c7962c402828668f2e489110bb061060c4366bef0e48910433c7922c402bc50445007a0347922669b34e1c0122382960415d101274d40a033d38595f2c48910414d8858d2a409076a98e1c21ac101284e9684204a930f002d717244074169e2811008f1c367b6b04d868062049425422c7172443719028a110e0882f201238618a27dccbc418411433421e2c78c16564a089afc2c912225044d924031c28914294d224067b2b0207072444769f213c5080a28a13358d8254d3ed0e4030f008288261de8801040d830e3c64af919a24911435c61a504416912a54911509c7cc60a509c70803453851dc28914284ea20421d16449089e1c7184104ba23421e289930f987e8630e2890967a68d9572334385156209cecc14d6034b840812820821829af8203323051138792284932027509cec9809f381219a20d144c70c1b1bc5880568336bac94264e829c4431a288a00f0831331385856284932021a27c80882541463c91b2c4c9112d44940ff40e9924eccf10463cd9c09226414210e1e489105344fb9a3cd9801041503ec0812541433489e28408284e962cb1f965032b0c1958cee845cd4d0d0df543419bca3a83758677c4b3e28d65d560dddcdcd4c01b23dc8d92574e8ecc2ba5fcc11c1f8c9059c628a584b2c7ee5bb92c25438e52eebe27e54af97823ef9352c68d4f4ab9bbd2922c99e5be9572e54a182fde38ee0577595abb2c9777396617e4786190bbaeb9c1954c438c31ce186705b9c26294d5f536325b2c65dc1819ae8cbbcb9007091f4b8ed64aeb3d29656649b9bb5d2cba584609638c0c2f1b8e0ce5ae8c22de33b3b42c087368686868386e39ee8ee0f5e49bd742ec5d162f73bc38f24ab9bd1899a38c31eeae8819c6c8bb922186edc60bc26d83db06216318f3755df08231c22bb265c528e505a58c1bb661cccc33eec597059923af05e305dfbef71e335f2266666cad853cc21e3c1279f7b1e44a07ef6e662432030000cb1bdfeeaec5ccac6952c6b8cc524ab9555ce86313777775ec32336023330d7c3173906bb55d8656bce0052f8c732e1997779725b388777701f18794a68e3042f9a484114a1937eeca8dd9076fb1274e1ca90018593e8ca5dc6529659897392ec35df8de5ebcd735e1e6035e0ca3c591af0839666608f7e28849292f9a4b4aaed6358210328c31c2181380005e66ec452847d24624826b590b972db8cbd664660c423877987177a5e4dd95a944bbbc16bce2e315897a889e0e36bb221911ecb195e4dd2ac65de6b82be7f21599e32e47b91c2533afc58f254bc945a494707b528e300cc3468c3133c4a2bc38bec88c496bca7749c658c4a2c7fc83232f5b9121478e18efc695cb1b23b35cbede3b40aca9a9a9b1761f64e60b5e17c438462839486486917921b62c17eedb279779e5ca8d91f971e45d22b107c7c87057ee2edc27e332dcb7bb1c19c66586bc92619452ca85d77531bce0362f8871575555315ecc32420cf24a0b46e6dd85bb1b23efe3182f8c73969939b9cbcc115ed74ac9bc316e84f14129a365c117a184f149192333c708618c0c992f4cf2c818258feb8a314629adcb923cda0162001e23c82307203ce07b4f5a963592514a4bca5a0049002ae9b3e2b3dec8baa48c1b4bc9978cef4529d992721bc015e11525b46294bbb292114288c10861dc4b4a4c2425478ecccc5c31b46464b9bb97940c4409204cc099e5104431c2034d3c50653b8026539a3c598284101ef8316407d001239e2ce90014271de880114f6c64ae038926444071b2048a13218a1882031c30a2e2404493284d888862c4921d0310a0899328410128c093274e7e8608a00621a51b4a3b6ed851830d0108c01019229e3829628825414f3e2004079a10a193c38e0f248c004150ce8e0108f019020c6009019afc08f164034b3a00c54911528428e20400a21324449426509a74200a0dda12a08914294da21ce10123865812a5c91423866812658910528818a2c99201fcec188000470cd1440a0f0e079c1c6000063000018868b2c488a02342106508205184089252838c149b2f018c3022cacdcf10426ce0c91323a204a024449328372168f2b324088926507248414d3a60332325488a13249a5441430821058a105182960439f180078c28ed580238e140932847541d518468f26408920c11509a1c7184104b9a74408828460449793b000fe46c93265138b0248a1141420c61c49327429076004d3ce02408ca07a254221c08fa808f29509a401d3b8025508c7022254a93294b906852c49220284ea21cb16408294e3cb0240889263853a0348125ad0abc4242426f85f842090909092d2a5b212121a18d09ea612321a108511864262b1499a09e90100b4126a827846226420f2524042b262b8462262b8442c1893aa1221321a1c96451288c09eaa184509089d01312420909a15015934509a18484504f4888992c2a63827a8fc90a095d4c506f858450a888b298083dd45b268baa509209ea2d13d443a1183259140a858a4c16856226a8877a4c16f59820896bbcdd7d1e9022c406679deb4198e7629dab2369cc43c33ad7654a0b1cdde5d0f2a42df25a1ea3385cba0e57d0c3bf0e1fa6aff3dfdf769d64912ceb9bdae24a6f6a8b289a864bd72bfa1aab385cba2c2a57c87eb7b842f6f53e9464d8c57c3de7db7c328b6e979f931a4175a73db3bed6f71aedacc32dac745c219b11cadfa8758cbee65fd7377a1da3efaadd75519e7f135e136a1765adce4fa82dd5bedb914c7b36a37651fe6e47e6a6617f1b101254965062a8813a1098618e312d65bf6c210514bd97826aac76dad43a247afab0d50e899ed7b66a979b91ac9fbd07ae8f567f3223d9b7029dba839df5ac3fd7f9dd7561ef813d8c9a2f0a616e10172f85e3ee86b4d4d24677352d89f08e7c0ebc93d3728796e72ea5fca6a0cc8edb9d992b696a10a63905478ca9f3f0c3cf68eb97b72ef9b6aa4be1607744dad262a5bb05d3564d0fef74170fd6adefc03b3963b4f5e59d1fdd6d19cb25f91ec6994cad33de12dae2aee19d4dc9e00bbf85cbf10ebc751ade89b7ac6bbcc3b7be41acfab362f80cbba254e4d20f549a48628d26be5c69a2086bb4615aa8d3442b01075194e10619c6108669a10e7f5946e352aca5d2fb429e659d8eeb736f4a0b373a6a1d271ff943de180db5ee4a3bf04053a7f5a3d75a3255d5b824abd69bd2428d8e95864b6f53bd4050f2711c73495ee06870b6c86bbea6c51bcdafa181982cde90828b5c9291c23d2ef0ca69f824f37dc1f10d7a535dac68aea237e58325bad49bea010e90043121a63b5497aabb0fa48008bd1fbd2f3828466f4a0762fa8dd19bfa828bbea137958333de76244342980662d2fb2399182a1a4848d45dd014d6a8a9a2bba02daa9853e82ea8045390dd4949430736f8e04b7752b87ce9fd35341487867ac7f4fef51cbd97570046959668f4fb1c01bd8e9f91ca58bbf7b624f05c3b31ba743412ff5ad20e454a22d1e87889467752501d2f0fb463c68ca11daa597609421c4d9bb644a399fee8b71d79f3239db2e3d5204ef2e6c3c9406f8c849584e41dfec83bac41b3c3e0d241dcb276fc29afe1514d1b52da1c347b8f928fc7308bbca1ceb64891acf7bb3aecc3217eb445760e9eeabdaa078c315648fc167b75e801438cc5613bd68e6b27d453b83b10e5f53b46937153d336050696061af594ab7a3a6cc38ebbab8ee0dee7db8ce0f8ad193cc6db7c80e2d0d086895ca41a551bfb74786ea8d17b7ed9d3210ef57e5a1adc8cac1ad6755d57c5d705df755db2247aafce106999bd292da6681a9cb990e7005576e004136728c21c719888a032042666308517e6a881691fb9f422bf87abdabdab5f2b6522976a1704fb1d3b0def4c6b5a59563bcb3a3cc73bd9e1a7455fcfb71df1d1914bd8ad20d8d9e7e37d50f4b627dd2ef1ce0d1d4ebfc3e3f0ceab5d7579f809dfabe836462f0504c97e34cd48d0eeeabd56cac42d0897e0ad9f4b56e547dabd067afb8a06c1b7f96c9595e3126b346f1cde79c3dfb04560c3209d3d89c52e0f845bbb37d4307ee994d8fb489170bd8770bf68b001de901977c2bd77b1e338fea58514cdd7689cf4306423e6f28e3c8d5d6af9205c74ed4d610105165874c1420cd422edaaf3e3e6033cd708eb0ff758a5e5462dd21f7ebcdc7c60d81c0dd71f787e77c8120b127487d3b2665adaa3dcbbc5f7f0c2775ccbcb6b4f876d7958dfd38191442403e85d21efd00613c6ef18cd3e7c71c519cd87df22d9b1c7ad07f9f8b829e1c3473aa433f8ec6530d36076a85d837f9b91ec70d2f7ac837faf34b825e19ac4f5aa72e299ae27e1c43355d593a86e3d88eb495c415cb71e1f6cc11cca4c72fb4bc3bf6cfe54dd09eb5d6c56a4461ce0e4b3578f1f5de6afcabca24c5caf2ea9506692df2d62bdaa4299a9fa687fa8825d4afa4c18ed024801dda1da8a2d144ad6f31a4592f5141d6e46de7568efe8cf9379eddb59a350e6b7f7401db443b5ccfb68748e6adfad875747f5035c777168e85df41e9ea3b75911a6696f2acb15ae90a283f4a6ac1073451624d1b659dba54d4a9a224a9a9bdcb62dc9762ba874b525c97ea82a13573da14c5975c2fa33492d552cadcef7b4aca74adec2aa2a242b13a3ea27a1eb55ad7253f52a376155e8aa556e92d5892a0a30358132c9cb5b15cffa2301943c694621ee3a7148c84a9a97f2ef55d2941595a5a1fc6e3fc8ba50e712aaf85a632e12dca6ac84694ec920d5db97a603ef30ef301c5d2808133781ed423435db6b6a6cbe55db6b36aa7db2161ff6fd8c52dbc95b10a7244c2420d8c45920899b6b4f82fbcddf06c4cdb57a129d9374ceb75940f41d1fd124441f5d869e449739474fa273dfcd0233b7790fefa0a7d17f5ca327d13554cf679fac49fa9aa332df7e1ad9d413f7ed074de274dacebd9e4d3a6812a793b6a6113d9dfe9ccbd024e893f893c8f94928099cebf88e9f6a7ee2f113cdb97a120121bacc770b82fb4c3da14ca3f7f00d3d3dd3a84a6a0191bc4c4d82bb0c155edaa6374545989ebbf95897144ad6f2164592b5acc24ac33f2ae4b0b4dd2c6073996b74bb88266173d1adcd023332f524fa8eef16b1c049fb8f9f44d7f1dd8098f9564f36d744744d3a6812da67fe832631739befa0499cb4dbdca21daae51684f6999ac4f699cb0d089b8b5e434fdb67aa50123dfee3db2b6a019b8b6a12da479fbb05a1552666ae7d54853293cc372a9499b8dd22b276435a4b15d1b52a9499b4f365e8e81cdd9ee9d1eec8fbf5b84d80ab27ed5b7542f42eaafaf344de7a7599ef1699b51bd2d6b3dabdf3e17b188a7cf59898b94c3d3d13a92651ebe9e62799ff3846af6b948999ff780f7aaa798f5751461553f47c9509b2f49a71a5324196ae2e3b36155c7a95d08f08aeab8926b862454c156a54f146157264b192658a2c5c689aa4a4ab26c1bafaebac2d377adbb0dce8eab0b97743b26d20804a2a4ea18ba1ae6e75d553a4494a92bf284956245d1debab774382031a620cf586040154525d997145f41ff5f44c275a7f703ffd470e578570bedd4715c2e9c23af71d4bf4bb0cad7293cc49b4ca4dda475468f41dbfa942da77c854a1d147df3e434f28934d754254bb005240ff74fb70e83625c550bfcb6f3f530dad72d3e93a31313a55b94948fbf699f7a0271e5548d3bee327211ddf51abdc243a4dad72d34c15d251abdca45527642a130a30c95cfb569918759b8a228e7e3528f63bb6295925f4ab1ee0cce84e6ad9d24ff64b1f95a52f4dbbe8f10b791e6f6d13107d740ef23031baa85691a95d544799e2ab2aeb8f55258032716c123d0a71d7e90d0d71486c6a68a892e44577e226d1ab774774554952f4f78e49439e514d62bbf6f8ebe9f0eae736811f634ca2eddae1068476513d89ae89364da807ea628e072a88a3e1b32ad53253811b0d9fa900cc5c0cbca855d71e3725f0d9e3c6c307b87e8f06716d7d66bc1979437a00bd5b76d9a1fa5d979b92ecddeb9ff7eccaf8afcbce8772f301ea3625f0afcacd677e566f5904f4c6bcedd8b7f317f930c9524a79883d039536e9ebb9db91ec36df48516069f88cb44551a5e12f4dbb76613746b64da4bde7633422e51c0947caf1b1bd2ddbe663dba80f91dc7c1cf3211acd90483ef80c124947249dc749234e7b8fe6078ce3078944371948dadee3dbe746495cf00ee9f2939bf9b979f6213db319b97976b92581cf3e7568cc9a0f9c6d8b8244cbb9c61dc9e8d7b51ced1a573ba0d1467d5420a126fdd14ed3e86b1c12e93dec836e6b3ea4431cbaadb59ca44bd2f69a6f8f56d4c8fbf51e6843bbd737db6fa88d0dddaee94125162ec9f3a0100e2ec96374a3b43bb50ced4ead83762711ed4e300e1847cb4b2cbcc367b43c848377b0cbcf4acbe8f69c59252181ff79bcf5dd78a8b8e09dedf273dbb6f3f64745516c11059728bc4401260a377666556ebaf667afa7675acbed736adbf61e9e9a855d74eca2575d784774f9291289445936e2342d0a922c9bbf9e65d9afda4d8d8e3a394546b7b91e8944dbdfb7fab8e092fc4f33249210faeb6b1dfa29a5744defca48bda914183d59a3af8bea536aefbd87b34dc96e3e9b324196d6e957ab2e5c92e7cd07acb3da81801370fa361fed4248f4fbe9bb13379d7ea1131652bc3164a21f826a68418a21d32b15276efaafdac5f90ae8f5afeff6e0a3d8330a3f69874463dfcd875263efe12ca3b09353b47cd585bf70495e765acbb7a5a53c7f795be4fba225f76fcb3f2e9e805fc60d08fa1f6e40fca7fa57fa2ad50b4408a2485c8316ba9a867b2b5d1a3e6a47506d05c5c3da21e94e51a65caf6a507cf52e7627d4b24302e8475fdf4d89e4cd006b12d62957b5a8fcee5f16a01f320b97367545c333dc8c94a6a8010b00a4a0e14a102b40aad4867f5468c3bfa137fce947c32391d3f0413e1afe089c867f426af8226e1a9e089b866752d3f018e8d1f041f06878207634fc0f340ddfc34cc3f3a0a3e11920d3f03d5cc3ef306a7822a286cf616bf8215ac3df301bbe94357c10ace17f353c8ed5f03555c3d3c886e762c36bb0e12f23dcb09292bce6bfe6c74df5fbc20dc9fb7dca5774e5ab0e561d1f5eee29dc9294a6c87edf2d0936a651d6bbb20871d39b4a55691c1f3e3a74837770707070204e0ece27d47070dec31c979393f3f9348ee6e49c379f9c11158da8484c96a5e36fbebf9e0ed6fbf244f7f18982300d7f433b6ed2778b0ce9d16f805cc1913ea4bb477a0fef161940f367a6dd00b982ab3ea43beeebd99684f48e7b7bcd9fbb193940ef0ab950fc8a7646505d51543f4afa887637e7cf6c53c25dfdfa91aa5e15d58f5eb47b7fdf3e826f5c95b4f21c806d0e90af346df3117d44b739ba3d2f39a48ffbf0e1c387f4f1e33f7cdc878f1f3e7ce05c741c9168be2c6e68f79a749873d17344431ae71de9fc6a33024f7a8d73518d8d0f117cc387482412511f2caaa4243deee33deea3631f36373353347dc82b221f3ea60f1f746a3eeea39292d47cbee6f3138746898df31b124df5c5e8bbf9f0bacaa6cd47b7f9e87344e771e8d533db21ba0f29a81659605efb10d1edcd6726795dbd8771e8f63b46a237ef813774db865a677029be86565bb814df834a2bb43b7546bb5377d517a7e5f1d179d42b0e2ec58feacbc2a5b88332e1607716180b4cc75f71d050261c77577d517dd1f1d619bc23adcc5026dceb4e5ee9f86a0bef8c1e3fa11bbc23239365df92d4d0991bbc933d4e66f6929d379fec3c06efbc731cc77db71ee63e370318845af7b268ee70f3e1fee8b60cdd7e9b129de62a8fc1a5f889610f7bc4bef413d5d5a33d3c3f17035b5ac8d095389aa737752595ea9d2a2978a371be4cd13e7a532990a355e0a5717a532ae0a2a70ecdfadc39b5ddaeda9dfafaa31dd7ef9456b9896a8fd613bd50665a36c0757d4e8dd2353d1a5f5d0ffbd4340ce341ce8a92deb7514d4a72bdfa910bbed1f1efd5abdda9df51fd369f4783b8dfad4d89cefce8f3a32aad70693e7e5a5b921a7a6e9facbd0dc9fbf5b721a9feb6bfaa2e975e0de2d6de5d726c3ea2cfdd46b513ead12bda5d5dfdd18d4641b2fd3a121ddfbebc73d52e0a92eb3247c2fdfa56bbea3aea7269fbf28e4ced805e6fbf6ab75caace8da85681842abad16d11057a3de737baadcdf92d49a9672525c98e3dabd00d2ec563bfe92e393a3e9b8277b0fab2dc5c80ab7e810b5c807bfd637d3bdeba61c2fd5cdfeee01bece58609f71eaffa2cfa01ae83b8aeaa962a379df88b2c48b062c82414dd08e30562989208c109650a72120c313931c4d4c5bbb4c23bf00dde793d456f77504cb3978ee73280403780b0174e0090ee65d1f16f8bca63d4970527a03efe06c815dcc3d2dbddd5f1917748d5b554b9897e49550582a3e7e604d0c73f5af3707897f4666f78971b1299868f1b10f5f47003e2f4bcfd00a47250e7fd6d3fd47a419df7dd7ea075a1ce7b16513e580071bc2cbc831d562058702f4bc7eff58efd55ec8f5ed9eb81703b9b4fcba8d42015658faf7d379fac6ae1b8aa7e5dcfb28b3725a5cede33aabda256553da3b256d9a7f66b7b7648af6b74be075ef311db4fbabdc9ef45b47b41dc2c3f77aef6e8768c9292c063875806a8f5e2b776f2f3af6ae10ea9fcdc4dabdda9b58ca3556ee2be9c00ae9e84465f3640f6d3b201e03925a5eee18cee1f9dd7289fa36b1ad12eb4cf47b7dac57ed7e89551b919a9fe0e69f649aff7c0ec7a7c0fc4e8f645b7990671bf96e7cd47bea25d10cbf7b0047205f7b2f4f6cbd20b4488511a5750c8604b89773020850b3170b427f5a64ef0059b408ede21ab37658230bd9b8a5f7ea3018e7b5326f0d27b6eb275a65db468959b2ccdb2eac9ba100e68883164b2ac6da02b03a59e4f7b59ba206e98a48686d772bd8799eee623c188a34b0d4f1dcff4a2556ebab4abca4dd5abdac5045cf5745dc8fab20138cad1f19335a6fb8bae693725b0f9b102c13163c68ce90ed5f0165d3640b7292baa74107716a844a7617d5976f3e10a6409314a72c585b91a0adecc1582db94152e5af6a64af0a55766c26f906ebf347f420a451cb176a88e87b47bd00b0fe188f0ce1ee775819b0f57c33b5da9f9dd9021bcc3cd27c23c1f1a1a1a32f17b98e7263e0fbcd3c316813dc2e1be683e0defbc262d1b1d93decdc8aad1fb09b5b845d4e41452ab369f2b9656edc03c6b2a0195ea49b90c44b41f6d91adbb42e0b9055c37a48789b8d1fc216f343f07de79af77e8fd22db28e3c57a550882e9008e4ba3f928c0edd60054c758df63400f162e6009ec327951ab9db71e50fdb31548a8f71dff6d7d4180a28cde14145c4428861ac6f9b61e50bd5cea62a3baaa136e3e92b54a9ec623afab8b7748465e57afeaf6bba4af3748ac3f1c67311df0f328102dde5b237329a075ec39e20a1f65c5872719e1c3c3ea4ffe0756bf7887bbd2ba877b18f5def3329702dc1c41a146ec01f5eac5a5f8f839ea0148a8e3be8e750373194208cf8f11c2089b4c8dce0dd20d69f859bbabdf7b7fdf3f01c687e3ee701a3ee1052708ef7437dcc03bf1f0e79dade19777b6ee4a0d799675628c17effcf02f2ebdbf2ff344d681dfc7da5dbd5066b9b4ef622fef6cea892cbd8f3c6bdaefc646f8312eeff00faa7021c11b2468e301e105817b53b8f702ee3d177037ccc7024ed49b2281977e5fd1161d5ff1ec184343a6fd50cfefe728f24ef53d13bd9fbb45449f13a55d44778568b59b40dc4766edb8e7df35da09b5f65ad44911eaf9f8ecbb45b08b5688a876f3f0db31ba2b64ab9d76b8fd28903566cc983374bc463b9491d7f13d3ce976467f629df2ba3a12eeea704b12cfb543357f7bfe51b819a92efaa42424fdb623da7785bcf7c01ed628d01bd3d74594b41db18ed5ee35f68c76afb3cf8a76afab6f8f9b9278ed3d3c1703dca648c0a5e3abcf9daced7664fbac5dec0979cad5a28beadb90c4ae3ee76ea2daa15a748d4eb95afba4ddebf9dd225aedb43f29d2bb42e6e77be0a4f0f36993c2078f9b4fd5a507c6cde741115f1010fac04a2a9941700956956a91b9886aa97293cca7667d8e2a265459c21b3da126b3c429201696e2b5ac571a3e8857a53e2b5c82d9dfa57ca75dc2cbeb706fc9cbc8d1b73fd1e52105820577d520d89b458160c16dcdaa051f7bab3f57ddac775ab564571b92abfec0cbde2a5f879b12d9b03e282eb31e3632afda695d551c9579d50327d42a8de36a34ba2d437554e7a88eef6644a3af7554960ce5bed1a9f5758e46d6b93ee9db8c58bf3edf3e86224da31be9c53aef19a5343514874bef540f51515620d831422a04511b6f64c02e39638c3f5d7578a15859b543b515e327434b24f9c28e7d4eed96855998855918768dfe64d66659d835eb1ad6c35b96dde2b66bef46df30f98e65a6cc86d52e48b43137b377236b7ebb68ab9d3631acae55bb4af61b7195c612d4e800f4a696b0650959faa5a037a5042b3d471789bf6d7d7f5555843a65d95f95ea59bc88fe74d8e585baa28b55115ee19698d5c596f9155b7b503c1caad13391281389b2f7c08c760f0bfdd9befd68073b3b9765d547d94795a802418e7642fdf3be711fbdd371ee7afc320f8d7cec8220771abaacc3d54aa6067163d73919aece886a2705d5e9a841dc59159dbb4ced46a22a3b14da72e96d496667b5c3ae2a4fc32559851e8a63ab065f86aaca7232fdc2e5cb952f7234017a535fbc30a34e9bfcf65765e34d3210ec4d6e46506d7d76b715beaab6fd566d5bb56dd5b6dfaaee61f989b0abf75955b03abcb2d51b205a70ddf6fd6e72db3639eba65dbe63d1b7eaa7aadd9b0c47afce55a21a847da4d520d8b376a88cd68b46dbd8dac20c38cc28a3e728f283b893c045d7d09b4a4212c474017a5349e8d27367b4827855ac850de90fd0a9ad6f2fc73fab766ff7ddabcbaf361fcbc7fa6efb1a9977d5b99bbfbeccc3ddba0c5dd6b1b66b5cca2ed2e9e44775ab5a55836057efe4f917058205376b1077558f54f5a762ac5ebff86cd59ff7eaef95ac1a976647ae22963918bde82562919f8b69d9352d6279555a0e7198c7b57bdb76e4e6d923efc0ed2bdbfc8845db7c78f389670267de5de65d696ef4e6353c767ce6329f733ba41dd7a85306b347293238ba50bfc5798f1967e34ec9563beed1736ac78f76114bf3fbab5d501c75afbed11f73ed2ad449e84118b3e8ae7ad0cfbb5033b4aa6ff05b5d2ec529baabb2779ced95f52cab5dc4d2d583b8399bc93228a18492ffe04c36f38ec354d7957d9727cbb69a77178f77dc0ea823477c6859e74af2f1ead987401e263f6ef3f7a017914e53d271247ff14a94e2e9c0871b3396ce7e4347db91d1b9fef06f2e1a6567027572de5d4dfa320fe9b4fef53f6a7731fc8f0c6e70742dbbfc10c819ff47ed388ca807e457b7895e6e28fbb068115c9227c2f1e328c5911b3e0ed5fe68357f43b749b4fb4d8d57b8549d6708d491b7a9dd5553bbab47ed381eb5e344b5abd951bb1a9ada7da6766f1db52bb54ced4a1c675d1bf7de7b56fdb99e9d8b2cb02ac81dbbd15cab115f3bcb1ed59fedd633ed6559e68375add6ebe2b8ae86675787ffb86fb57b41b2af739584bdbaf52190a75e9e89843add82a1e1ddebbb1a20efb820a7a1be2b5047be7b90eb0252176e985a17ea7435dd6d98ce5efd26c6de2e7ac761daaa52f6f6eada56bb77c5fa76f9c882eca36b56ed82626761bafa959a1aaeb7d5e9aede6a17243b7bf57825b22062c9281322b8247f5169d5c8828743f570b870842ffdde9411c628e34a0fe94d1d214c1be18bb6a137e5050c385a6bf8ab8b195dda00bd2933a83412cee8526f0a095c3412dae8d9ef563a56d6cc2daae353d3bebca39d93f955bbd7cdfa2eda92647d6ddb11d1db9ed77b7f567867f37991462e5d9f9bcf9c7352d1e7bc2a773dcef7783dfe6417ea6bf9ba5e8f3ff8a0783ac4bf79bdbb6ac79d7d543b6eb6d2efd75523ffbd2bd61f7ef6eb9deceed5ee17edb8be2cd449687649f4fb0cea87a53bebf4e7ba50bfb82181ad0531df95ee82180876f77a386e4a785850f42e7bacddb3d2d6f99fa2fa2eab41dc93e63b1eebf5493bae41dc231fb2d7a3c657493d6e21b9fe945c7f0f8277e2e75f95a7c3fbac5dcdad8b465514dfadc72b7635158a440f6edb91eb3fb176efbadee1ec92d1d7832911ee0f87ee55e9ebd67644f4798bbef3a0da775099d350ee23eb3d5014049774cc5052f6f9edd175e87823289e0edd8bbc13fffeea84ad61b7de59bf01a20517c4add51fecd7e73bedf3cd374363d5f8ef6ff341c745f5514c472565b74e8160c105c17eef82608b6e5d0be21e69e7e87289bb0c8d5ce2ae5bdfe8726954bb55a3ad57db91f71f51dd2e37255abf573b29a8bebe5d7b10bcb3adfd41f174d8d61e371fcd4ad318b9543da31797aa6374b94484eb2292d9577d503c1cac6ae6e9f081972fbc64e1a58bbd5e5c50f5a6bc4411c6163148b5d1fbd99b0a4305586f2a8c27e22e84102e136f8ca98b8570853ce6dfd0fc9aa537f04e11fb20cd5f2fcdcd406ad83464050c2184f0828fbe216e535b64b146d3a49ed0345c82358be9849b10ee021d88ebad385ce2238441e509410228133f09f826602581024c7cae42fcfe0ab05fd10e20c61aba7be76e084a5e42bd54f8d2eb9246da9d3a5e422fc498ae3ab4665c89efb08635f477b3400dfd98c0c37382517c8c94547da954b94c5795cb647d692704040f99ae63d40922268b84e4656959abfa83f56d2038d355551568d4b26ab9be68f490f7c0bea84517ea74574be62b3c54445a259ae22105823345781292ac61051ab596f84563a10ef3ab020610fa30450ce0988703153c534c1df4eb37d4b0766f087e177ed17831988f04dc36c13d2ebd8536ec9902bdc6e1d2fbe9a11e2be0f5e4853cd63baeb2ea421df8853ad17a7578be7c4816c05e1d88ebd6755981c05ed55317f2583dd4815180a87ed5130775e0e321b0a61aa8232b9899d664bde31aaea9a26b8ab42b35ed2190e115f375ec9e640d1fcfbd9fb076f1b26aa91eb723db5aaadcd4053cdc92601d6bf743438835bfae1daa9340ef16d922db0c99a5b0610249798dd59f77ec39f8a23b8ef256887cd0d5403b467b967dcac75d75798ceee762205ecbc118ad4d4c6accf0dadf96443bf619b5b71db13e31aa3d6e49aebfbfba2be4755cb14fda3136e56a207886a1de5bb40b7aa8ea7116e60ac1c52c5d5a7a31c68394981451e91bddc9f7deabdebeeafb1e54f5be0ec23b32ca3ea84ab2a4f9157f1fd7dd1b5eede0fb817f315eb9b42098bc365ae2408eae0e3fa4e57a6989032fdd0d6959fa2108dee96a7ac891ddad1a2d5f82f16d0d4081018fc0bff7cd077e8ea0ab9f924842e812c28cf0e162b5e3ff5cb583df775555d5249abf7dde61867f554df2ce97c7e168525be4e88acae67867abcb39ce7086de6dccdeb0afe81bd3bb0ded0dfb1eae280f29d1ef0cc55c6eccd1b7ef696a78673e488977aacf8aa23aa3db2f8aea396776788d92ae63dfdee8f84c8d8ec73e1703f1dd80dbd4962e5d7d6ee1a2e3b7cf4bab68fc9ca857d14e1e1ec3a89c4f93f3adcdd1fc0f29897579cb1259492ecb1259f3fac4b26f635935721d3bf6238f55ed17a66159b52989cfea8f7c172f05d5d5e5a6241ed3fe532989b76a575dabd877625a454714b213bb0378262aa33bb13b80eacfd403359a55a013fc6844d794d1ed0e05049360f5677bf40122036e7b370f794b123f5fd56efbaca479eb5b25cd7a65b72e2bc9655d58edaacfcf9fecb376afbbeadab794d1f19376da49d897845523f2f3b36af3d867dd155281de18ec9fb5cbaed1f9ae5e5faf630edd0ebddf5f4af45e348488d04365ac3d319777761e81cc43253b952ee0274637c53c59831a4637ccd643dc94c035f194cb0d1b8042415f4a86ac1807f4f475b825e1515b9f4f8a3aa12bcc434f5fe7ed0894061242a2f58fb6786b00aa8abe8ca0b2341093be3e45a24e284b57bb3774d75f035060547fb72e2dbb6af7d634312da36bc2e89a7843c2af6ad609b50dac7475e6e8196e4ae261edae8670b954d50e6e4a2210ec1f78b96dd50fd474504d57755708fc797f8f9494a40b41f3b9e26aa80b38bac8e28b94d93f29b8a5b1374d344547efeeeeeeeeee7e7da25c5bd4d091778554d6ab7db645ac7a597fb7ea7bd64f7e21cf9af85c29c97a9f2999355b216c59f40d357f5708b3122d2b5703c761cc2705f73ee7be1c7091ab811cfdbe4166a4b5e59b8fb71eb4337dd7e80f1fe1bfbfb98f06dca6b8b0d2d9f90f0c2f9db5f639a1f6b623d7b1ffcc67d949db6e67cabd595adc1532ba3c53d147b4e3779c11bec8089f7b0fe42829095f74bea8525292acf95973bd592190ad33e459133cd3d145d6a6246bed375b045e6e4a482b045eab376fa8773bf286b4c8bc8739c82353e1a8765757ffe167eff8db030a8c2cebe119f9bc21e1673fa215023f5a2170a8e30a8150b838a4446fd8dceae8bb42b06d7411463bd8f3a2f9a0aa451b8d221a69efe19176d1a61da3ddeb79c3acd8b333ddde953256e5b854d5dab2d288d882c17c52d4200c2d05277b533510b32b84066608e1befae4d60e895ea66fe855146cdbb6699fdfb66ddbbe4136a632e79c73ce39bf41e61c188661d7ad63188661df2098182ccbb22ccbb2ba407963fa9abfdb0a911797e49ffcd237c4c596f2db16f1e12de2c6c4b6880fdc2239cc0d0167599f2378082184102e84d5b55488db540dbeb47cac2a7aa4b2ce5a8c4623d1b76b9f1f8d46a3911a73ceecd8af5b9f73ceb984b9bbbbbb6fd9d25688f54785b8eab2bbdab2ae6d11bef56d8b6c5b676ac1e50f995364033d36103785bbe3de67d6664a58d54e5bce848c745753397f44d6b342c93aa18ee78effe489a1658592f163edb25f59673548b5ecec336a5c7556974b5dec4ac22d835a2665e58743c5d899f2c3a1fa84af62fea66ac04936d55cbb1e6d2d19f94df5a66a30d41b46738d5caa2aecb21adea2dd13ada5943e117b12051389f51823b5e22decd879f3a9ae29afad48ad4fe6af90fdf1e17a75acc62b46dac53fecf37aefc55fefbdf72bf2aff7de2fc6f8e28bffb8a27144499129293e521e7aacbfc9da8b0cf4c64409d28e40c2a4af6b6fd1eefa8c87588d02b46286863a48475f873048eb4bc911198d02a480e615121f547586d128d983aa244b1afb0f2005f45b21316275f786f8cd887c5523bd2efa34fe8b12eb753d0b0e283fe1e7db247d639826fc9ca8be5ec7bf20856c1d72053aed21dd863402c1671d08c7fabcb8747d37239665d5e5d25521ede0a770fd240e29d1dd75204b0e25c6f4940bfb89e7cf5bf5a25a775dd57a771de8a2b284121d654ad5ef53ac96826aeb3dd0a2d52fbabdb4abb20af4e4e818c41d4f42f2523efc8a3eebd5994ee1ebdcf21750079f456fed1ffd79d5a290afdabdefad2381dd4941b591ed587f60fdd9f3fe1d0c7369fa0d7bbf3b5c1a32c74c82e38d0660fa42e6fb06e9b824b82dc262982324d7af5fd87eb12ff6ecbb34a31c764d797d5daf7e3eadba96bd9ed98734f6f7aecf4cabaa24d7671d617fdb8b8283af589d17edae63cf6a87eaec1d7b0fe43933ecbafa1da356b537f065dc1bd848ec8751c87b03bf6b000a8c7e7b03bf0128307af7063e962d469f0a38888463ba6d51215d511c2eed453bf9778b925e057a5d559c318686da86aec098f24a09b81ff91aba93dbdb4db6489421ad658f5a2bfc7db756958a13424cd5abcc98acf00e4d774f5a7e487734dd6d151eb0262ad55f15ae7b56aad0f1a73d0775c230050faae0c196304343a6ea6f5643b10627c062892b8060a2e28410d37b9519d39e8a136cb25e2501a6f78a564980e9d40510efa71fa04efcfb72ea0208eb553df5409d78ab9eba00a2faaba7439df8aa0e59a8934abd77fb65c5400232b46ce1093490c2128068e1d6845a411940a0828a30c0e0000ca635edbb21407c68c8f4acf04e0d1daf30472be68382833a3c66910e49161fa350c33f2a74ecaa78ab42a96a57fd09f4424ccb5abd83b53aa466a0a02bf94ea8bb7728ff0435455b50d68c2b2ddf89a02bab42d9365a5650104025d5b27ed9220838a02146ed90a081171a70d15a4e7ba1d1983163a630615a867c98400b29b244a121cb0dbc0c051db16db496211cd01063680a02a8a490185a33ae98f69d085a2eb16d98b03ab46d98f6dda965eddee1e2d06d6a8b363ae8b596211e6b78c1041686864c5b4f7b21285458918612720c0d99ae3a44a58b7fdd11fb48e1799b000e68843166023252584306676062cc18134d7731e57ef901882078c75a353a7ebe20a51b86747cc9a2dd1fc4a21b1fc4c3211e082ec5fff003e4f97e59b25f3e0427d36d988eefde90a1a8435d960898147104126f4882614ac9f1cef5fdb78885245e7e4a3ae5773b221f2fdf0aaacfc73ba3b69bcf4a198e4befd8abdaa15ad25049bb47a7bceea6bc8ef193f72d4791cc7edee1e10cea382b4a42b26df49ca4b91b12cb8d9e751f0e1db7acaeeaf142d13e1ce461a44fb48eefe11570ef355cdad37069ab57f5a73afcf636c73b437a8fd121fd8ca67a767d37a0ab715608c7a5bd45bf42b66e8d5c3b8d8b6798f21ba4bbc438c175572ac53bd6e3af317e79e19debf1dd5546c7cf2cb6340dbda92c9ee809b3909276808bf0d7af3152570ff257bdbc3c015c29c8735d619df878a536c0c95fa9eb0a97e29b70b29290f0d050c30b0d0df54fed76f494f8e54a929d038c96f5893c89876d795d76504ff174d88ed7e603cf3da1d644d42cda5d573a5e579e0edcf197144b74fc85857760c7cf07f9411153125f4b150598b0bf96f4b545497c92fca6ac7421c91a813561df54164af4a6b2186a24b0e561cb2a94852d221f7f7d813cf3f11718c8f34cf15718c8237afce5c6d3e17afcac4e920741190d8223b48892e49f894d9392647dc075279e69fecf24e90fda2fda8100095d3df684fc164651876ad20fd949d663c3263d603bc9aa3f6c95891d1307f6d8dcaf7b18b6469978a6594955051a8d692d55723061676274069313cf849dca353434945526ac3163c670ef26c4fbc32810de2f31bd40842a94648b8df93e1fea3d03ccfd5b02c648e5dfb3a4ac0e6f49296745719e1591a3908f3e406f4cc757152746fa3a323361be5f5be4d52c8ad0345c82bfb608fc66797385705d2e5df03d2fe07e4af8e0e175581d5687277255f0b03a84f012874b155311255d2953fd5527c5bfe626c518549756c5e15255e3b542f675a4bc84c98f5b8447ef718bbc0af4c6b05c218be2f798982b1fb748f5bddc222f072e492c3d04765a129a86c33cd9e577d8225f21d7e56fe01d8e4b171675b9d4ad1c71f48239a373582125fec275391c893abdfc859330c208454356c87ebe6a215b52e48339390bb7354e21471c60cef8620bbc02adbce1869731b2e02c72a80186cb17ef8a98273c049959b857e3dbb7f207737289a9e0f693196e8cfd6a77aa1142285a2d7383301510461212d9406f4c77aa1d231b81838f3be440c3b3a6f81b3ab611a63b229b7a411031c6f7e47bf2317310ccf2452eecf5447b565e309f941d8a779bdb9063bc88a5aa9846163c1cf6f28f6e8d57220b1e0e6f32968dfb6b2515738350e14bcad2a0a8a23ab033762d3e5689555b92aca3dc8e445ac325669ccb50ae87b63ea2a26fd47a56e035de81bf827855f873f3e17ab980cbeabcb4f968cd1c9ba1cb3ab3b93eeba9c1d5e623cf711545ec39e2ebfda1c169dd130d42291f1fab808b1d0e5ab7433f2b49fd612aeba1ecd03feffc2130057383f00e1f6e1a5c8743f383f04e6571acb3578d11c8ea4ba82bcb27ca75abeec3c1b2a2956989db69fd6012527df51c5552e368d862ae1acd0dbcf0c5045990f1851496307535cd5de0c296152c01c51263aa60e26f119a9977b69211bedad5e4c03bdcef4436d5dc11a13b225040811449b80109b878c3d471cd35f082186cc00326c8200a634c1a10638b3554f0250a5b82605a2970697e1c42b3147ad0fc0bf2c02fc8600c15c4784298284cbca9eee11ee6fa460cdcd59b92c2962e5decee89d6f02ca525a555c147f992c61f46ba0d97f9efc93fc951ca077df87ddfd673696fc5195368430a3e68498360c7c3aaaa64c532c6bab04a9c4f8394cf8f47e2eaeaccd5adae22641ab974ae8f6248214b0ba03715464ccfd191c773d18d8f9512096fbda8b35caa240775b77fa235bf43354b7e62a8408e827bfd7c78fdd880234c1661a460c38b4cf29ae60688165cd08e9ad790dee33c6e7e44e72ebaf6291abd735c9abbcd166c60e97369f89a35b6343c4e90861b92eda3da3dd1aa4d0977915649b322d151abe8a36b32df68a7e3fb06903ef31e9e9526a232dfcd01af49a2cb54205870a26af3619ebb8876412d7ab5f9a07d24f3ee6a914c25cd9cab1d49898ecb7c3ba823cd542432dcb7837a7451a7e395cce5c6c36bd239da719f1508161c579f682df39112d265ea0fe933f5c7e6dc13adb98f6827aa4fb426d5e552cd359bef6f68179bc7e196e49d3b6f486c6ae4524d7d8fba5ce2f1c8251eb593ddeb1d3b9e7d07ed843afb7c1b92d1b54f8dc2ce7ce8b86b4c5a04e3db7ce846e7aec1de51bb243ae3cc87d1b92aaa9d7c10ecac8b5cd23eaacb259a4a73799af77046696af73ad3b44cbb965d5efb45835e67d9390a8e94e435f7d7dc47f56756129237aa5dd6f361c2f40dbda9305ff4646d447fe6b14fde9064cd7d1ec3e8e4a8e81d63a34a639f23da05f5e8cb3b3a3ef3651e9c8f66aa8ccc8eae1d872eeb68db47d8ab8be894d7dce386849b3b76ac76f3dc456f53b2dc73e76abc19e1aae8232a738d765a6b871b92d1656a0fe428b7253a876454352e6d6f51fd997f9d569f683d2bf6e5daa25d4d6f0f3dd17aca43b2a3df6d5813c38c5f7a06a142413ef90b772408ed621e9bcfe6e1d603aae77c2f0b067847012d47cc224c17b144f9288f84fc49528912894c7bda332b345e89315a1b0fdbeff5c0688577ae846079b8a7445c0ef2c42cac231fb97027e0580d3041300f932db23c6f75b82f4645c60a8704ef60f3b23e043c2e8fc41699620bdee15f4a704fb4e4f1eea5a065f7b2cc772f8b8ec1d437766bf3014af29eb5c425eed6e7a3d9977748b366b57bfd361f1e580dc225ee136ada630d8a768570983684c4e90aa7bd7ac760ba8d83ab5a65c970d04acbfa5ab504f91015de01735d0c86c1301806c360be60208ccdcb7e2051559b0ffd7c599c110bd4c112b78025eedd452c60aad9042e1eeb4a6ef472cb13c4cbfeae7e3d8c5d9a1adcfe71f3a10fe2e9302f6f812d925dfe02bb635d067977f1d0f08e2b32f35d1e6b75b0cfdca2704bd827ddc5017bfcd1d869e8d1d8838c1a7bc647de31d33e33eed867655d406800725931cbb22cd60ec3fe33eb31e682b7eca81408652f5c92a7817219ac233fadeb0a2685152b114bc462a5e52316deb1ce13e4f2714be41253318bf845ec12b7885cb4b4b0c737e9eb8825628953c42cd913ed7d4a6cec40a3c66acda6843b56a7bcbecc7b98e68f0aef64977f55ac200179e210d491358e1f78e7d56efe71979fd84f7d5005a204d7c395c62a168d54b029b824b5982562611d797e82bbeee339d915dec1c23b399717943e6c0e4409ae5b2f4347825e73ff8955b8241ff43a52d9275bfef48618c02539578ae6b90b97e483504eb18edca279bc6330efcab3c225f98cbe2a43b50eb57c0ffc41bbd73f6645824b12fb4f3ace91380df1ce2fffa88cde5d3d7a7cb7c777f3c1790f531aa78859b8241f3724204f105047fee2b0fa1a7d3ce75dc4a204762478e7466e4a6c8ebdbab9fce90d6d916df96b4b62736ccaebac76da756cffa0db3994c3a1242a7f436d68d412e43d68c7f1a0dd93a2e577d04ea3a171b4fc0c8d62e9a03234e835577be0927c10508a6ac7f506a6e579803c41aa64ac76ef4add717d71252ebdf8e50703000cd5e7d27804e4e9f1eada17f2f0f8b4e941dfeac0f390d9d5e9b086645cf9d2dde392c282058eaefea6e01d0534192890a3cb185d69cb3b7b715c92e73ef368516e2052705d3d824bd52d1a342dfab66ac4fafb838f111e11f42785e5e1a04ef51a2cdc0b5d91a1abbfebb2209ca14b39c83304ea54afa9a9aa9935acf4f61763f52e8d06c74b07f9d2d5b3cd6efd3d296fa099999999a9535ed3d4dd8c482c0dff635d14e31b525a228ebbd3e5c2552e5cb8cc52432eda965e6a6aef4a0fe96e48774f8234694aec77a051bf77ee50c9f657a7bcb6441aa4dd152e554510c13bdbabcfaa6a82eb4a9a88be2e5caa3e04f2bc14eb547f4d0d57c1ea7c026efb7b61a874f52707efbcba7f6f3c387827be3a73c13bef87e59dadc6eeddbd303559703c4557d5bb1c302c6ca5ab6a4bf0bc676cc132469632b6d8331a56d7b68d480ed3b27603e2041785297a536a84e90474b5a9284861eade1b5d7d5e1ab46457d72b37baba361f5831b04f46c85b3ba17e337f61b6c87675a6b2bb3bfacba15fc5800edabdd6f1b75d54bb6464be292854a9debd305cd4e82226c53bdd7e19e38a17dee99e145dbd3a02ea54af9e14bca343070d97e439aa65c74734caab2ea241afb74ac4952320cfb53af0d51b5667027976d4bdaa63e0a23fc057df2055fde12d23ce31c37cdab9aea6b7e6cb3dff040924cb530375e695504aa3e7909eef560a3d2f31ddc2d1538eb5ac479f1047ef1bbda92758e9f9b62b46edd5c825eb536a16ed72f0b96a0e123e962b2b110949d5d7635fb5136a4bf399df4b862695461cddedd0f37287b933cf001e5e0379e2eabc6bb5d32eab7634dc5e757ee1ba9a9e6754efac797d8bd5cfe56ebdf0b04560cff7c03bf0f39a568d9f75391adeb9ded019e6f2dc0c8809430609be4031cd9f184c5def6a4afd525f600af2bc3658872b987acd7ba3f9184c355fa146cb7e61b8099cf6ee85c1ded958ef6448f0b1e50b0375361f180662b5abe1c234bf30d59f1b5be435d013136fbd7b5868ec310cef586737b64812ecf1baa571c982627a30d9caad9361822bbd6458f9a2bb379361a5caec7d8d4d3f997ec7e982f45e5b9e5dab7d2e1db8f8c7f16d6fc80f79386e64c8c6c3de166e5369b8d1d87f7dbe219b38fa7a27d361fdfe96a708a873fdfd7d3eec61b7ac211d9bb737a48b80dc3eec617fb72c2cc2ed15b145acf0cef6f587c5c9f210813ad7af77ef4a5f6f8a9417bcf4f56ec9d0d77e51c2624289d87cb08a0128a371e9ba240279ae9711e98b89bc31ecd37ab76ef4757e115b04f6f527bc03bf62fa2a69d17e9de6fa7907feba3e8477ac5fbf208f56af2f0e56af2e485f37f4f50d72d59f97a59a63ee2f300f8b14182f3d7dc03cb2803d7a53604c10e5a6c030515573583ab47089a280c53432192f535bfaace036850617346cd06f6adad2c7024eeb4da171853633ecb22a1921bfdd4451cb971f35abf3787a2e2c05a426480dce6b701ea4870706700909a35ac4092ee8c2124800042e0c1521872014a10c4aa8c218bc88821660c069a106b548cd6b706a204f0facc8b8124697242831460e52b05f9c30c51b54b420c11560a0841ab210079003f4f0b02906f0d4bc307051e2892f3c3187125db814fc404c1717f8c00827f842cb424a86484d4d4d0e438e5373419e203cd4bcc4a3378586959a2f570c667a79b4d579df8f9667c8dbff70bddba1c78ed11b243b6a0f88db1416b26899de941b5ff46e66e03aad9fc6f1ce8ef5f79aceaa43b8f4fe844813e1d2cb814b3210591f625122d67b873c1aebbcbfcf74b10115525faa5071c3c4419e0440a105490803054720030d9395ca420b7ad4560a0b4068abad9f7778da7a09f24493f521b57b42448b02a79558e75dd2201cd516f2d4b0ce7b2f03d70de93784085731bd6bcc7399de69986753cf7413066e0dd09b72021a0da437e5842fbaabe94eeb577f3665b12443c6eaf159471607567020050ea6c802325124c67f8b8f64e4f53bf78b405475594772f4e20d2fe0f0420e1c5081558469e6a85cb7e2eb4e6abdfdb6a8a5fa9aa2096707c0b7683390e6fb5803704d1c5cb703f30e3d15e370896bb8c4a78155fb4d18dc82f9610706f04e47a4076622cdef164cc3f36b20cf912d545667658d14abb353acce76e4212ebd0d1319ca31d4f0176f3e5c06379f9921398cb86ac8e693c30e5c82b3b7e6e9e0e35dd57b3d89f5765921f09dacb1591db2ef495b04fb1e678b5cdf13d9e17fcf0af3ecc03af035e4c009e968781dc23e9687db418a864f6686c719c0801d18b0430f03601c3b7abc382a4b66347a59e268781e3a74bc8777609e65808ec34f1f4e54694ee4c73b22dd00743adaf1361b6b1e2fb748cee3aba7838fc75fbc8343fa1f5fb3456e1e6bf764878e1fc225226ce440a4cbda58e71fb5fbd13914c90a81f7411bf07080c7a13d70099e447fe012fc2910acd33715032b04be86f2b042e0df18aee6d18b1435f4a576e0b123c61d766a1ebf5b5dfd86204f90439b3abf90879effd16be872a9c73b083db2e58dd5d906428f6c816375b62b3db2458ed5d99e94d2235e50599d6da65d4df7a01d0ff546a1e179d01db4bb9a860e619e8b0814b86d6b46874c5571f14597315e172ea5b834aa8f0b97e087b8f7ee71e189a61726d207864b3b0cd961072babb352acceb617537891c50dcdda7cacdc66ddaa3fa2c74ad34f0d2ec14945346ec9aa40d593c0f9c23c30eba5e17b00827730c0c30f4130d961871db664b1858b2d5f6ce9122feb9decfdf6949a7c27e316b1daa7ba455f6f34029d9a774b5ad552e5708863c0ddd0718cd5d932ae33b85d9e235b4abb63f9c41bba874bf071813af01cc765bd70592fd7e30279d6d4dd4b42432f0d5faa2117c8f3c05cd5b958ef7af016041cf33f3090e70d411df8abaa1dd7a3addaf5e8ee8169ebefe1693da36fe10ab17ed1b8422cb93ad6214e0b76b4f5adad77af4ac3f8baac533d2a435c826740dde1376170dd03d3f04f8da13678e70ddee98680e19d30bcd3bd2c6ef0ce13c33b1dfcd2dde3d2f043786708f21cf1a28cd5d9335667bb1a526375b617f21cf1a28dd5d9ee1e96c843fd78a817889044f9e0ca5b3a5e7b01179178736c116e781eaa1b079216a47a535410d31d5fe9f82726fe71895ca5230f757c7174acded5fca5d290eeae7ebd5cc22c2c8df2b93eb7cfad9278d8de7e647b3baa35dabdb543da31e1fa69e7ecbb41eb93a21ad220d999758c76ac465befaa7635cd30e02db8ee71897f5ca0e4c25bb03037c824c15ba7f25e7db7089bac4849f01c592742b62aeac465a242c5899b760bd0c9b4bc13434cbb03e8660c20ffc6c0452ec977352c044e26a0ca4d565dd62aba26a85d7f0c9f981ba45b31342b6b84f4d2e0630a8cdfd36c91f7fd8ee5deeac05f21f1158df4d2984609e21687d8afd2409e1dab139fc30f211ddfd5d0d0f11de76369204f09eac86befaef98eebecbb3bbba5ee47773f5a6ad97e757c09f2fc0075e4af593baebb52f603bcae2fb5dbd1f00b12da2c7a956685406e4bf017d5b6046fd16be396b604bf4f8c70cdcdcc15e8b4d56520b8247fe0928c0107cfbfb8d2622ecfc7020e0c1cbd4f63a8b70671ef0a29cd3d15eee631c16d8a0b6f3c2ddcfb07a0107942240c1422d0fac23845f60fbc06b518ad5fe7eaf15a9402677d317a75649ecbc4d79429b2abfa132febc5710916cc1bea36d5ad17540ec47cf144962ec4000106a68ee3dee9fd0f44204f34a1b428430a7e20032e84e1d2c5b4df0ef048881b1a1a52c2d4057ff9b2f2d727567ef03d2c11ae754d8b6b70f25b7a3ff1a5595256b177ab2a0909cb3a85198db95c5561a25c21fce2834788d1aaa4b42e2b462e55bb9521a394d6ad68494b6a518bb1bac2c719151770b451d15d21f0c917912023d75455256546238410c65891c19263ed628c70a74c4308e5254b2821e48dbb7079638c153db25d59307209725f1abef7c6d0e27bef3df9a2d630565a600577ad1d3ac65855b08a558c11aedc8d0b81c010468ea564b6688c114a1821841156affa62c7b02c2965aca28c31ca48c61c2d7ca4525ec77d62d627726bbcc371795f18ebe58c28adadde45f96e7445a3bcb6ac5f94e1e8f93448af14146a74c595e3527c8456d5b8142d4bca48a3bdea4549d351639dd8697d6b0718c0e6352dfbb65d1b7d9272b1aa16aef62c19c428235bd6b7c36929e5b32c29658c52ca28259dcb3b57ede275415945196394d10b8c5183bced25137fc5d81be37bef41186384ef6dac1d4da49d55bb68590be3930f46f8e07befbd171f64c2e3088f6299379acfcc3132f31b83991f4ff8f8bdc7f5d51f4ef22056ac71105cba1eaf488160313fadcd674aeefc47b16b9fd5e6a345f97759da26dfc355359f150379c697393ab23d27a49b8f76c616a8f126e5b551a6082e61e74b797e458160c1cd6bf3a9a4b5f5806a09792ed67918d5b4b8f9c80abba86d3ca337c504ae37c5842d3dc6db7c887072b076343356354d68a3377546aaa637c5042c4dd3bc5d5c42c595592e2dac91af57bd11243f34341424218410be43f898f911a6f16407992a6360f164073482387223e1a1a1a1a12006f39ef08448c30b06c146a2230b32a27842a48fc6fbe3f7becdef6f4a7cbc01720517bf0da34f8cf5c90e3255c6b8a21f8adf2bc15cded146ef45b8f9402e3d7eec84cc5e618f5a7d59e981965073876a291ff60c7b4a824012844bf1d60d1d6bb8147f511c2ec573a9e31f18ee7aa7753cc73ca7239cb8e941f10af01eaf9daaec819d50f3ab5f60b88d8f16bdb8344462818429ca88838c31465c6f47736dd7bed77827f2ab91bf9bf5f9ea463ee34dec4fd2e7040e6edb8f6e3f26703fd66577ef79dec1b2d1948f8eb0ef365f0d824b2fb6557ba0ac220a3f696a70788737ca33a27c7f4de86826d470fe98c03d4b1efe86213910e11dd161f7ba7b503c1cb28a2ac38deebec3cb08d3f0416ed82dab71f389572263bcfc46351ab92463d63dab64d52e8865ed568d0d02b787fd603e6d7947bea8558fbc237a553b28379f27695555957c15a82da8844a1405c2548f928e29443333c2008004631440304820140b87242249d3851f14000eadb64e549fc9c3200862c818638c2106c000000008008c0840027287c87f9613048de68563e7e7b7437c79fba550fa2ed3d3608e505284e2460d180c4d199d905e55a6e3bbe013a98ec4f2e352d1a66164e66db5b714b761efafc342903e27940bc1378c648d7dfb52907cd9a4fbcc5ee6bed43da76cdf14db3d85e3865fec30a53ba6f48efce615ff828132fb4fc9ecde9c422b8f50fae28446dc66f9ede696fcc3458ecda791958182dfb3febd17cc343ecaa6610a5b3f6bd62d2c801461d6b176428a8edf26a03abfaa148298a74a99b7356cb8f51dce8882b545e461646eab96676fea1e8e5c833e82a12f55d108f8088916fb38c8d6e5bcc1b4ef3f5b4a9a1c83a4a9e77806118e2f5251fe7de0007d8c06204b06f6165e2568cfc3901366a86cb36939eb75ae3f717afaf8a259bf8592b07216d2b9159bf6248c6826a12f99a13a65c1cd474722b2bf39d5ef0a06021d2122e826a03e6ef98abb94050a3604f136edbcef14ddb6377d92fb26921f6337d15450756a2fae4a5ba85630f4e80639fbd5ff8b9dfc765b016f83c606371790a81b1b6a9e0cbecabff333a17bd10e8dea7cfc752c685550b30082534cc92e11a4f5734cd77c0d85c9b2c4f25b049794d0cb772dce3c3ec596481f6d7bdb31302aff8795e88c972956ad75cb536c793cc5a7fa90d9c930ed42e21281afbc2ae5861b7fd7ff7e327cec4ae795182edba93c750b75169d8b888f69733dbf05aa7c9b65e1f88d26500a592bcbd612d9dbebffe1e2db42cbad6c5196d3156c2731f13bb2553b802bd19bdd8f8a3f3d0a056f553d5e295c905de0c6e379fba209375a458abedf72e806857f6ac1dc4d625f3e60cf99db90fbba6bd40a119f61d9dc84594e6068eaafb9f8d54b0d8a85372b5a8aaeede30a8d4f1225b052a740cbf22a378f7c737450d17c648519e385566cdc973255847119306c907a73d45ab209b4a6248115824181fdf37b9ca43d2fc06a7148ea6aaa21868c9fa7abeef8c65c94b3c3ac848fa762fa8a1275d78556c81d75aac781905076552cd597cf509b5c93a1b2c71d212418b5e3834dbc2edebd2124dad2758d0ac73c8bdf4af35a8b403aa75066f3ad6fa0b97b784a638cbf49309db666bf7f4fc12da24b9ea26bc844f31ece1a774ab63e0a050ef026257d519f933608d6fa2a7e446e54d8728711909f80497f4e9900bdd85180cbdfd0dca943f75616769c5e328e44a15070bacae0f937e54be526b11036a6c1e5171f6cce4a6f2f1133afb5d22305303d35295b51323290a5512ffd4e452efd56983ee8b1f9f26b1c2d668d9a562a2a50a635950e82835fc0d545579d2206a654e3c05742a6f4d2a9ee1e79857b3ba4c3f7614300dc3cafe42fc51c0c84fe65f780264e13b54d919a9be5af98ff3e9a10cebacd4fffb4c167e422fa923a97fa4033cb693ecf1b646c6877c291778fc9c5fb82bad661b0f2997652b68763aaafbaa0f7e9404411c51b2663ed1667c832b43d061f6d1c971f4e0cb2f0928f6f04423d62a7c21bf0eaa4b47aa8c0624216d81d53cbac59802d6ec196c000420495382c452092dfe80973edca78aca854e8199d615972ef8f9b45b5928642a1ac6ab8f5b6b7a6a118f13d6335d9ea979fa3ba88203c83ea618275c23dbf768bdb3aaa243cd80b95197c5606b8d5fbdb93301714a09326a31a194c623ca006400fb05e137a4dbdb7964bd8675c03786325e7ebb385866061cfc3a63de5008d2f26d660713637234fc9a98dc7cfbb0224b90b678f1f9884b6e01dc9324836caf01856df01275189e1100c0eafba2eb86a59838460158b1791f93081c8422721371e30452f92dc6a218a9040cf5d4834074b6b12facb7b861f4170f097dad305179ece7dc79d8557c21d1152d8dc2cfbc0154a0856a5c3a691ca1ca3736d49a9b67b258f20ecb138593d7f849490b53a462242eec0b1284a1cc0a7dc11ed6785e4cb72cf047e99c42924c78d85371a500868403d954291ecff3ec835e2fa8d5f5c8f3c541904b429cf2a193db54795aa96adfc4a864e178c60deed5890953444a89e29464e70501cb34e9bb478a6820cabef5194b51da62af04bbf7be7d435db924f0b599051a76a29c5d4ca363dc69daa2a658a4b3f8132468d82d63395758fec8ce9d23601ea556fc1b103b9a4edb86d69aa4077ca9f3c6661f971e3b298bf4f55895aa3f1fe34dd3ed8b1e93fbad4c633b0b76b5287303ee592aab454508d415c61abd949386315629c372f7e2e399b060ad3f97704121fdba4ac8d92a88eb4622ac72aec827cfe4f26520a6e41813b7217acfb39724ac5fafe127f16ae9d49c2557ca9666a7ef8774555a17efcf48b6d9fc949d902ac27dcc210939bec103445e3dfebedebcb2c4e948aab90446e8a700e80a64e28d221f9ce15c275af23983270d99c120220c30861ed105a31b65408889001a6f4362c5568a1cdd791c416d9aa0419c05832b1304b97e12ee1d7aa23ece7feca920f6aa04a62554eafbc25b10c4d228c07b27f4376ec4afb27b3a7b175121a912755723712323b557e6fb6f733aed200e38ef49ae1f6516a30bfde2f14f71676453550de682941552dd35aa577d2943f542ae60dec8170839910ba18aadf29672c21b3044a21f8e4c98e3a72b4ed48dafad46b7a6a5d69dfb4b68533d11585285fab843da11bab8d75800b9e85b2b67ad701432b443aa33f9eb4c273048dd0435e586aa8c037a5f691613edc404d0993d59132d46531f62d6c1ab5d6a59d38a14320fb33595d766d7b74c8ac5a1288e8a13a0293f0272674b0e9d9acd1c98e82b0c95f1cdf54941f0f370817a50806bab05e118f430a7773bbdf41bdd04edf5164c196c7864fb4823e7f4f964606ab37628eae39f7c2c27c7b0cb9da230bde1b8599e49ee35064c9716d17f1b89f80d42998ca1b9de653db92255c293a533adcfc5b69aad932e551b7aa8a8c5e456ad1aefd1bd8ea4b13cf273ac3c56a3507cef5cad85f4f5291aa79550f625f57036f5644799a9f4ee8fcf4a2925d957fc74c957f526d320c3c80a87630058dda416ff55e04f290ead1beda72ffe3f77b45d14bd535a12d0ed916fe026e91d9c4126eb28e552dcc0e97fb175e4c53643bf8865b4b620706db81b1a46c72de1ebdc87fc072e0d28c4ad5815d2619e63065d3f33281d5a3512cec577f4b6101e44da4700c8d745a5aef16b10013839a717af6b743057ada2fe6ec130dfee837ad6e62d2c8f7336f49a6fcd46351e0b2fb1408239267c8d205d0f89df47f33dbd0d99e969fc22ba0c7ef5b7c540c81f5931b5fcf08181e8459757251482d32264632109d15164d60d174396d558be5aafe24b4d65f21e1fa730ae31f9564184ab4e5b1419f37381b735015cad34db7f951d0567e41c0861052889bfe5c226157d8ef9ad8d920d6e3be56297a1a05d5710d7503df326a1baacaa557e0839720c10db6d269c91c8974deeb54db57b755752594b93acd1577693cbbdb88df0cf1b593d74f14c42f7d930e86b876e3b1359b4e4dcff27a4a354e2b617a2a8e0018e9500de18b3c98a88e8c2bb4e754ffeb05819394c63214c2d7f480bb4b82f50537af394a0bf63bbc035886f11d73b37f07d8031033031e070bf15d67f35905269e0336e7688f3a5ed516faf30c6c3679596718fb6d217e489ed78ad1034f160c22305668573d4e0947555d3937abb52167400247010b873630e13e425a1de400c6f04270c230e67416c1264f09613e6a50491244e6319934f11fbac884bac85f55aa7d356398e709159d5ab5127d7c66d9031fb73cfd7236c4059b780bc966e540bcc502cd1c9546003cefc009f2821e854e666e388b8480ab5dc1da90faf860b65c06d3199213c995106a40226a011f472974dfc43d3ee5b44561029929a0fa2c6b36d5df995e90224fb8b1aafe1d1986d306b351595742f955b5a6db6330fbda2940b96d34a037ce38a0ce9b66ce97de7f69b5e972307ba982d91e596af53cea70d8fd5859fe5033bc8f6701d2d0699dc8cc8428f6b4387d8a46c9884a7627d745915508a282e75b3cda5ae5ac4af1b892d30417f1800fc6f375955049108a915e0e40c6ea7b7611f8c295adfc2b717d41f66f1a38d1d624f776debcd9d839b66c358fc5142ca92415d3d367eaf20ac4569d601240c0789824c025615ba8e93a7076d86940b8a6974417ec52e92b30d14ea88ce5f9eccf674592f292b64d9e3fd102d28a5002c4681a114c2f895654aedc7902cffc3fc111e587fc1906a9ac72ed83bfd7c5043251b379a76981cd5dea657a5c6965d8ff63644d67bc1a1c10074fb12183cfe38e3b62c775721d917a97e158e10d5acf5db24226d2bb72078f1531056f165d86b87540d223c1e49ce25980bf2ad011c2848f456bc50bf731968d6c23f3bd04e23d6ab3ebe45d52413a8e9b6378f755f1cccce303b0dd070a57e947b060cd9312ebcec6bb20b624e671bb8290c83c2daee1938ecda6d9be61f33324e99501de6ab99634c60885fe5c68ea0284e8058a95fada4ff5d72bc4d6c304d4d00a1515009b8ba1cc2417e101a55522199e7990acf0b27b6b5b76f99cf1221ed15f061cd0022fc8925c90332dcd732708ba3d10447443bf07980471916e146c963f187aa51ce857a61fc12d912b7bdde9cb9278f163a1f41cae50a310136689373934019fbed6c9b7e150873c6c6dfa4a4adae037e1826426f9e942d566978367788e7d8356eb4bb05b707991e4f2d39ff113fe15bf4430e6d42f4ae8aa4b371ac5e263e760754d4f0e0ccd8089ec13586ed7f42dc2db1d1e0788087b673cff266e0c4a1dff4d168aae009bcde51ee222594fb4aa374d1c373bcf402c7ee658de07ded5d256d0430f406a8d6f1b2cabc75551388c181cc49acf44e3e239e8c9573a61ee68fa9659c12bfc20dd76fbd4e18079991abcce3cf658d69ffdc45e3fe8cff431439c65cdcb30f214a63bd008bff3e6c6becbdbfb84c6f745a5c8eca69b21dd57cad3e6e03dc27317998a6e5512f7230278d8b11fe382d2c2f252d9c2678453c9a7d718a0f0e054518f5502622aa5ab52ade7dc35ebd2f820fd62aa2ebb8a640ce953502b09209c9cbfc4b05170013f2b04c7d077d71a2dfc9f9dd7c17575059db23f734aca880181726cec887b9a60d4197d5da604bdb8abf728eedb9a4c77cee938ff90a19229ba8b69d22120dae67b1771df4917d02154e3fe2588f3856c123af717fdec2fa4e1f25190422433a7d64810677f65f8768505657d0a814997fe84eae013d391851b928828a8995608314b30fe46dc2ca96adbbd96b8bb282b4f12b9ae00b2357631f318cc33d23054dd78680ab0a5dceb75691664edd5f722c70e9acb4f215412425256b9fb0c9fee56d655bf440a36a85e51c1de73fd2f490ddb40bda95d7dfbcfc835ce25fbec321923280b72075e12e495e11d51fa19f7a6e6c7d23f2ba157462ebae863634be49430010ccc27a56da89e736cd88efbc0c3e1fdcf81217a96274f18b5146048bbbdd570c174ef142646d2aa593ea5190c1c6884623bb5a6346323e393a7ea6d84ffec6c4bb6816bd25429158b3c0b2aebb19c266d27425515c5e56d89f16c503ceac3054dbdf33f412f30364b67131d855d413eca9966d617c936940161f6022a9be7c46d43a00327b2b8f55ca04e7782b2ac8c84a52b63a7b4cd51dbc03424161c695ddcd9c9c9d22bb79f6860728ede10afa4be592115bb132ba688a2017e82b55c11a57a5eb44e2fe69fc33b93b3ceaad1674b302b5dcfa11292d763a4468fa0673d980ef4f597d8ce148556628378c3604e2f9dc6932004cfb09c51d9d0edb677534b871ff59a86d3cb3393d32b22689207da1383c5d6f3e6acbf73689d6afef135685dd88a391f1b621704c4d29ad7ffc5c15bc6a46a5f0b89f05d6029245a27f4e0c61b33f33b5e90cf25276e04b8e8d71c4a523edf77d7465022566dc98a6c409bdd4e40802acbc3dda25542c8c8b1a288943ccea8130b1db8dfb36b8d46689239f2cb6a41d2ee4b36e3f5e38924fd872efeb5fc5ad70eba86f0ec2fbb957fbb14990e0f97be33e52a1be620166522e808cdc165682e2132fc7c289d89b5d6885a8ce1411428259e879cf72ba6b77674f37b987ef040adbdca531dc2d6e4856b3427a45beeb31c3fda22849762e47571d6f31da97539b0cf7d7da4bfaeb849f073db248cd3bbd489378a0da781c29a07fa0be4ef96e305f1c56870fa9509209abb1e072b2e762d77fb937088e35e53a622bf94b95c43b9918e9b0c52ae2b12e92ff785b63b0d3994cdc193c1f126cd5936a46dd27c740b562ada718efb40f914bd191c63c93a8bcb8b517e019988f73d71880738051697cbf622561d1e66ebaf642f93784f3dbe46b98c73c46d9c63db767fdf95cac6b5533461d4d57115c739f10157a921d082058592a5f45b1cdd7bb471330c5b43bfc162bc7ab6a34376530db52d92b3c310618d18f108da31cfc13e8e258318d0afb351eed4eac3026539a7f7969dc7837ff23384fad76fde19bef9b95f19515e9d7d64d7bc2db28b6c157d502d99175397926f2716627d2f1dec888f62991c6b83f4c64b0cec417a015e1207e6495ddf0cd55270708d4f4d2bba047cca236a7790d78e103e5d2c655617915b49dce7361df221f2a66220aa47ea5b6222ad084a1aff1b069a6d39b7fd4bc16387ba01b7e90eb119232e491627757bbaf805137b67f384820e2ceb1284ed0f3a8c2915e719b6a9b9f5d037b501b1bc7b141f83e21c83ec645bfd46bb60ff49ed0f50443aab45013289e373205d1338292fcd19295a720f48e79162af57ddceacf2f3e09b500b17cfdff8bae9fa4944ab2b4001685e3e2efbf8f0a240040f82d9ed2d9c2b9d3b7b0074bf02e53022ed42b1f80796bb35a0fb863315ae7aa38cc362fd7f1c5ccdd91349603678601620afb4af25040a3a98fd3ee1a1952814a8abe90ac30dc0275df9617b48a1786414fe2e5b049d0eb3e334f8004c48cb47b6e4bc6d9f403a3608deb059700d5b04d1836d40d6d2f57a3d45c8023a01c61ad21f3ce7e5be9e6ffad109dbca6259d622b58850ce5ce41241445a8cf101f661163e6e6f604f83e13cd8772503b7ddf70f0fbd03adb1a21316b655388814f4ae36a30e4474e2c1b72738e99bdcd5b041aa0f8f51818070f42deb497d81f0cabb57a93d0d99a1feda57cacb58dfacbd8f9d26169578c73d6f64be37be534514f971e7574aa3c28059e98047734dda794875819e9f67b535ba9c6dd7f8c9710169fdb8dbd99db88053d1fd5627219219fe2cc816adf7238e522ba8983d1103487effb21e01248a8fe8202aecdece00707aefba439211086ffe1e9202d408d744ba4455ee596314b14148178f79f228310a81c527a7a31fdc4166cf3fc2bea975e51e5f5052ca02e981e75975dd3ec7cf0a9c62bce129ca6b463b4eed8f6a084bd14013eb70e2988df09b791be88dad78dae3e2bc6f2fb1cfacbd5136d9bd7d92e77f25efe9ac61c3b49a051e1902d99b6204e81b21daa397092e494d416cb3abf110cd13a962d21fa9d9239d1b899e454ea350a23ad4e26acdae67056889466a6d343c707b0ac5ad1379049ebd887bcc4755ed04e35c4ae777572332c1a7956d295262c376f07ab002fdeed0e6bf7f16d991165f7baa0b80bb7bfa71a28bf68db872db630bde03fa2db0de90cd4a3b7dbba3e8c3e000cebfd48726bb202cdfd83212409cdc11f3d0d9c08c0d1ef0e063e98ab74420d9c5c923988f137eb0acf2423f96084babbed05ff9258faab04af40901372317c8b2000b73054ea5db478c32becae2ad33f9339c9173386bc0215932cb50f3afe04c77c8c91371dbbc1664bb4f2288f7f89ab1921f5f0e360bc1601fd3931d5470cafca774abc80536092c865c5ede3c083058a847ba813f1e3b433d14d0cb7e7a59e15f09b2bcdbd11aed4e4b26881b8ad450f23b566152fe393d001b359605f6c27144e1154bf803073cd6618c0ed4a1b3d096213a6173e7bba09b71a38740ed907a2a8cddef183994998612c7f7fb97523ebcbab5486df33166f057c6e9022357256d7143f92edd529fe5fe1002359cf14c0b470a1f1821805d4d4c5d2043f64af550fe1146e48b3a11bddfd49c9d4a0ed364dbe8f354dc37b58d506b70bd4bcfb6e4e19cd98456492418e97355d50639864695fc2c8b9fe41a3920b812d40192e1239f312a6d3626625664ff481c46140ba71b66f85b8398477463e653d8a62ba2ee5224e05434bb5f9e45e1000dc1cbbac35d3c3c656a25888ad0fa59cdfcc2594d148d70e5a92cbf70a4dd9383271316ced44a31219f3da11c149a3442050aed96b91c0a655f6c127c6f463748f61faaa02ef06438db8215109aab481ab5f8ebc35b0035ffab6142587921190ac5e76a5c68c8b30f21be547aa112110a9a960de7b5de4bcf16dd92d87f893b202c7710e528f1a099d647d71e4445e6241e53a473865f863f1ad3b8a047c3d25d1936c710347a9270b432e984b6c9e50727f74413a76dab40d59196c916830c2badc0d8b016c1f72093122239bd2c5b23df6c38c296f312b9da7c3ed3caa0b769b97e044463c9442162ee6707631e83f010cdc30dcc7ae0990796261e38db02171ea2b52c65367dc82c88f1118dd8b1f509203ccbf18b4caab303b37e10a8774c2751c83aea69111b7450038f8d35c67bbd5b78a2bbdbffcbb3c77b9da27c74d213b80e66be677b5b931e252a0c8aa010e8c6499b0fe9c97d68d9a6a42c26a5c5575f3ab632a8dac9c236bb422fa97a8c6298ec1d4e94bdc223ab33410160e101064fd6a248065d166ecb3e182eaf289e3bae18cd73f38b3962e55bc638f34df6cbbdb3c01db93cea82a8a2774094add36cef8168bbdd89c2c18219ec5fc814d9937a486181780e5a7a076bae97b55e4a9df91cde2859ee7332d49cd90b7442ff6e6a9d2a976cee36209ead1b23d57cca183ea910070fc0b970bd93fff3b7e94d8afc6dd570cc6d912b25af7822678ece51ef54e4f21db503770bb96ed2adb89b1467131decf2c09b4f7467901c524d49fb88dd1cbc170198bb3211732528e2c7a386c5f6b496001592da563f33ce4438444f691e7b7647df53a478942bc6bd4aa799118f3131c37063cf50d13611ecb0df422c0fe8cc0ab01560ed9af86b082247933168620ed57ba296af90176b78bce15ce913161ab43a1bc0ec65a2c70c0f4220722acd8b8c82a9f970e84ec156525cc62eabf4a41552c80bde034fde5591a5f7a70b4448e5e8bf5ef2389a131d9e627a6e30b914c97f10ac819c78a2c0cceb4a1d7f5c8091315f2756cb9a9e3f9f83e4e0d33a63f39b0754a767bbf8af1531b503529277257c4b3eb7f3f2d2a057aeed008e6020c0d6d248fdccb2cae086eb6dca11e6d88bd6a5d16931e4fdc456152ed48e3a29ae47e3826652655fdc5ffd34d202e8d185827d9038fb2dca3f382670d3f1139707905bc788122c6596c523be876f6d2414d241c68025615271a05cc0b8f8e3c98d495b42dcef94502de8c07efaa785bda05a99592e945616bc0580ee6b4176a1c86b3050260c6d8f0f97325eca7aa3239e14b842421d481b113b73ea81f132b1b9e79348d38288d63e5a9aaa21c57ec0a535613b1c068225566970966c7866512f8ef1a63e90cd1f751e2b581597b5947852ca825e6dfcd417b682b08db2bd17114b9cf969db8d331aa3c45cfff8ab593c432662f87c6068847ba70022f913e62890b8dc121e9f9bbe568f7d00fce5362f4a421f18588378fee46a5fc70c6d8471fb55081223a1600b4c02a2ca7591e061c4ac45d1ab96ad53e6f9ac473ba66e6dfe51c728c794b6459500e9aa9b2ef922f0dc758a2fe4fac636f326a2345641c419d6af6c98b467edc4b12513d7af1de5dc382ec1746690cd1aa848b96130b640692969f273f185c9dda4303cd260329303296587042cc30e64964ead4bb01d4eceb04a0a71f44f5e61acb0fa8c88d0c9307efb1f5d5ccc306f578e7beab89861898bc63b0453561105a1c49a2382cba8fe179f786b53ecba47171257fda994c3921e43aa644da2591152a09b8bc31a494cb53c09f59b7ebd5f22eabb09bbc1b68ea7087c9720020130dad5da1dab70376c682b5cd3e8791ce490f5a01a0eb37fa23f36e1be3723d19010c022c757786a2489ce2d2097a0f17741b9db712da931e8aad48499c4da9a01b699ee23b7a1b7074d4658e062ea90fbe39a78af7fda11e49f465c202a1cec298000941d044e88d850c6a5a7933b8d1f887670b5f50c11561ec05af95a08426d0714425d666df9a4e3fca0b182b530168c224d0676abfeb86840f9b1a319236252cb244f01f7c7040c17f11a2e018ce38fb3f217bc5cc8657c980908e96b6303fa6015605ce598cb3784f47aa35d0bb12288d8b29f25bb024291a0aa2981774138a36382842b6c9971dcb3adf826e46895503b826411bc171c94c7f0b328076f1bc43e74c09d9b01cc405451221264f48a1310628b5763bc0ce0833f8cfb2eb6b6daff38fb57092d2e75f8e68cf9dfe672ed403168689f2e4b0f7f0f38c4eaac673dbb7d67d8d7de4f9bfe4fc2ee53478d89e440f8b86fcfbb0dae8926d8ba3c0763bb3ffee04e2ef88bb0128c47fb09ad9d8f581cc191cb0dc1acd7943ff6ab38755a1eeaab050ba67304210c42b1bc6c0f503b42b5bdceeed408946392e455985bc33eb4dd8c347d6fe9d7c49487f75ea201e7e2b1eedd65b5e77a6a71cd864e79190e9ad628340f293d603a2493774f8edd6a83638400fbd2b8fc9feb719326513485b50053b063382b084009aeedc576ff8f4272fcfbbd1f2351b2531db36c85ed457839bcde79d212b2e582d38b494a38659f6c9f11021f0d553163441d1a48972798ff3d1ae69f6da9368c9754f413b1c742b181949113f593ea3ff1fa5e8e718f1957aaf9194e5d8ea37889aac7a026a7e1818ada03d76cdaedfab84f63907329f9fab8ad093cfd4756e1f375dc775678d685b9ad9dbbb60ed768040cb5be05860a03b0d105037bed76b6e42460c9e5b9e0d890ca82c75f58b5eb56da9c0dff5c412dc5f744b36674902f562d4b2cd003b795f8e5fa800e843628ad90abbbdf8bee6122f512e824d9f9d2f1e90db2a918e59beccf01ffe0df8b1507c28dedd2a300a7d0c7f832f091a0c2eb21d00d9c65361e22fe792a2da70001ba7bc5a449029a622bbebc16500d69453e275b4519a5ffb1425dbb4259225760ff37c0a320922a0b9583c5be8b5cf84cc9effb86bb22e5187235181638a2a581bad728048ac38a846bf569188f0844d9bc5ab7885859cf32e3f689a81acb7214d4e7e6bd3de59b0cc6b55e33d45ecaab3ccdce32a4f0a0bf1eca9ea01533211a16e849ce976d34f0d46a643bd0bd7808a1a6c72d15a3ae1ac6a5c323f1320374b4be8e0e8219f4d8c283f10e15ac409ac4ccb175dc4a5e8606c09efb7b1eb83431f9a8705b87d14df1fad5b976b25bbd2e07a11a206b948b5d1380740134c61eaf411d0497a0465692caa7427f386f765b6a91a986624c23da8928a906d9aa6338f8c1711d32a3b5d9c42546e36258187ae7160343d0cc31d884da55bd1c5864197e7bce2fad8c1d1b56f4cbed2de4b931271e037f1f6b34e205154213884a908a4d90832518305b0f79caa5bb04fc32838267731e9be2bed6fb17f9c33899f091ae40ea3bb021a76253111493aff90ee720108b3007169acf680df55983ad82cb6a88a29b22cf778a176b65571285f0b6d5396368ca75059149cf08cc194c0398740d40f5005d54de53891f26c7c588932485a2e6ba51a0dfea7fec627476e63a5e2bc914190795ff283a70fc697eac719ed9fbfd8d6f5c6df14382672d687eb17c438b8ca1e902632a199abc660d06befb063755331668f46697e1b305f8babe9d489d1e962a5eb869eaeed4243633c3b5df314daa4567d64fc15a4d7ee2771d1ca3a1877e1d4f2f4c839aec10a20648658ecb53efd53cf97219219cb470a6356ebdee9c2ccbb720014f2bcbc19f73872605c3c44bb4119a812aad6bc3007da7541ebd04b74ed8fd014288f5a45be3386d5012d08247c77bd615363c1f9a54120e558857e6605bfea9ec0cd877900d17ed464173a9e97ecea6b4773f86b0ecfe102b45b09577544c1d509c9567872d04cbd64eeb08f61dad432770305c40a202bc069a439b9eab7348cdda91719f0e12fd8188bdf4afd6cce69325aadc9a4f7e9cc4b2c5df6a1ed58d7b6c20621756e3dbef11fb43efae94d65d0974a5e17f398ef99933f219a4625e2eb9fc44b472a19e9ac3fb017a40073ca9de64b23141b6454cdbe9056cb16323d4db6154dcd5b293829d9149b46f2c386569ac78b8d037dc2094f6be6c167b51dc9c7a27e3bdd1c05dbc022edc03778b686ba459ca5c854112453001527062072425a9c11b9124cdfa927fd2c66fe568db28c95f0be8ed381c420dc42990cdadd46a84c8dbc3ba285c363f56ab8d177f4745162e1baf8f387f9ecf690393b4e375bb48496030af86e902fb4c893c254570d9f4d21202949f4bf0d662cdbce12969390e26acff43c888888f6ac855d0f44160bb2f627ff614eb4ae5a8de991378d2cbe82339174dc20e1c768e13d80f892221041ab18a5fb9307d6dfb0b832d3ebd828b22bc493f23ea3193ee1b2810ae4c5f11afe20930064dad77150b652fe3d556413788b6940a2f0c639d483c440ba256f14186d7a091fa9575eaace358d440297860cf1435a7bdfb2041ab60256f13bbba5efc34ae8e80d86eb1d44f63d51f3612bb9d3f509bd2665dc5a9878d0138a5b5779d8f7d394ba2af1a84209336340f1aa9203042b3a210630095a86e28c124af20362a1fbd93e6b21e9899f0ecb9c9f4d610f0a924eae1d4f9f5b326228ee8e2611927596f28233445b4285adb2dab24ce1681204bc603a352a059d4fb6cf2f149ffc9655a48abc0c230ee6ac328803d51f963411ad9d7975ddb50810a957467a439f2913238327c2161b9af0000312600e8c1b4e47b4e642ea71c317d190de4bc7e33bec82f96bb8fb8d2cc89bce4fc92a1236efb8857ca02fec4ba5888864e11b719cc29355954f3b7cc428072916daa9980d2b2344924582a15145812e60b03efb3910be83e00b56c8c0479e7e52dac56a3eca68cb7afc2091fb36f05db992c17c267c1df30abfe52824d545f570fe29f80de5fc80c7ab45123fb3ceecca6999bd76789e877516904f69b2ee237c1dd86c786e70b0c062794a0128784a33a1413c5f19e10aa1458c8764d7b58f0d00a1b1e2cd600a1453ff0247e6879f200bb055cf06f144b55fb0107207924e18b193440a46980af6e298de572fb6a35449e24548abddd8f98f1584b3aff0ee1a284a24021a6f51328710fa4f7100bd39cdeb8068aa8b32a11debae07fd0f89407400f726ae03527c57064d0701ae815ac9db6990e2d5088805ea5f04ccbf426cc1d82816b19ed95e6d9421c06050dc061c7577624eb36b76b12bb496956aaf2a8242ce55214870f02c0648af77ced3339a896dfa814bd8ff207e3ac02b29bd0ac56aba56a44586fe2ae8791eaca54330c0804fefb792c4cd2e5423d0d9a8bab05fa3f706415895b02f17b3d55c8b753b362393be673c4ba19b278b9ea5bc7b10a7f497407837026fc6167009d0705087f861559787aa48896dcfe6cc649de17128a21cc9f8681ec49c31b7b3330455e36c32e9a8ae1e44522073f196fac1b31c5073c9bdaca3988a8cb399deb4d1ce703a3092d18dad9a7371401b7b106bce2be8939bb62d90aff001932dd4724f46a02c41a28ebbc773e6184720e3ba31c1b8ebf3a64f0b5f54534156740ffb07cf2ee51a872b487b42eef3468c132c5eebdedf1ad6ca196bf6e3e3fd8be775640bf619f8d30c4eb61bed95f40a975f979b0ad4be3c1417419485ac8949ee8c5f033c5223b4a3ed4f0656aff690462bbabfe09c8e58f2123692416e3efe611dbe40ed5f2bcd04f1f4723a9b25bfc04af75248b861f0226eadd2656c5ab66b105150635b7c9ee88002b12bc28eeb933a21850235546bb414ae266138fe8a70005f408cd10b5997fc3dc635d28a8df742fb482ec95b0a79ac661c21c70671f5c64c8947b855cca212b29690dd3e36a9e2e33915f4b5c317922a314a7fad0cea19225eee30383029241ef4a3164559cb4a95369fab4d7fadb5683ac827ec7a68439bc8f4ed0bc64ad4197f4ce3203829050e101c9783c7c3484c67c5fd2686587e1aa587f5b2fd9076043f8050b7b835249d997202ed51a666642cab1e555c3cbf06e1a76773100fa6addc54871076ec399cfdea52c0316c77081053fb65ef7d1bca85d17d1a461f14774588f0d79e6e2db341be6a1ada7ed0a270d2742d63151c3bda5dac2cdb0345babc8320cac7af1ceac61ac970b338f863100a5a190c61c72f2949d4ea3fc143ce9dd781e77568bdfd5d01bc3fd0bacde9e27e91754917ae017bc361f34189be55b394964b07a8bca2ef2dee76927ff5aed07c8210b191d296c27a776ea48f087ca425dc4e6e61ee75a8cb5329a955c052cdf2a06c965d1e10439c391d92dc17c06af9191f1e6fef96998fbe9e4b0e1d5d20e28c051d430cb89616e5a8497dc45e3cca9a58e82d570e2175edcc4bb8c1145244145c7dba1201bd085f6a8a068dd8c10415bf490fadd1dcf48765dcb82a303b8b45bb5ea49800ba24da13e43dadaa6c2944cb460e0856a4cba6700544c047a039026204e18326733c25bce40212033700b544e68542ada507de374b2ad545adfc5b92f6171f889d51a86798418205fa6968aa272d43231656f4dc51f26b547dcc09b1e2ad53a5a47af120a0b145b4f6d09cd0b2dfe4f8956abd7b4d7bb81df40a2a068061228ec84912dbbf9ef4795120d34039f7699247b5bee32ec19c8b0da680fe04f4a94f0fcb2aa2eb45e66243ac5d530bb7133ace3804a5ed0ded65b0a839f6e603fe6b67f85b5ccdcb13c96d9c0dce111b38508a026117cef64bf73449425858bc7f3a273c7c84abf4b43cbcbbe8179b33069a774b864e5b444f4424b5b54bc2a9153c5a080c9b6aa607c6123c1f5a99c3636f222bb611cb40dc0bfc7fc6de5074c27ebcc37a425e0b78c142f7656602caffcb4e04143a5c1784cf0fd7afa0822e58a2f44e55697061be3771d4fda8f7c26d66dc759aebdeacae5906ba7bfef2d86f993f25066dbe39ad7ffeaa39f9a07e6ac3a61790910b02ff1ede028cf5537cd7df3a9d8300c4a016d616e5c590d281905dc83e486cd494c08a209fb3673269b9e587f438ee3502c4e8a2f0610e80f2ef0b8fd0b7b8394e81ae5add6d9fb46fca13e4325d887f598203bb182ee574e482099f315e5532a776095d5c613608a98286c66c1bd9183badc8adbe18aa2149066e4f731f4b64e1d5eec5a40dd468e36612523ab9bbff47e13934185d88f45f3d8215da91e5f586c2c89acc22d7020544284ffd4beeea456353e4178dbe46a4d7bc4dc468d0e8ad1968d7013f0febccd57806bce547f2cc1a1134b6dd69923f5e65dbd75d6db25b7126b8b3eb607c037b1f12520951befe87b43d81f35d7f5e46ae81300b793c9a54523f7e8ad10c744175814861897d9144bfe07ad784474059adfb02a20e82e2e65b80570fd76f29d15aaab0daa170b8dd0ec77af340f60524b5eb98b7c06e461ceb798bd270383ce5aa523130e5c2a0b63c16e9b741623457d684551c3dd42b01baeeb8b676e3b70e7f0393ffa94a274b767b2e8048c49be4165381fb59f3215f8404b8a46a2121586fb4793aeeecc0250510771812d9c2c25d538373921d5e8b4eea4e087992a603a3d93a8aa01ae1b5fc72b0c3b300b31f9493292ea574dada2bfec7b507660d9fe564db4d7cb9b648e0f48eb9ce8fb6695b9236da1e014ca1937c834a035a07aa1b74c0b844c74c46ba0ea355b84d0e626aa251d045314457abb38805e823bee76d49e4de5f47ec3e4b4976abef2b137b577d9877a48ac0b582b37b7dc8b2cfa8dcebd85e37129e4f38b3b6ab9b7d362d2e6e4f959c6abf92e32642959c14377411d6490083a059b08654c3821c2cd42e40eb9d9b3038419c53ea3bceeaa5f18d36e7f54c7756652b11954f01b3577c62e2e62302ea8b1ca0085ad024bf716eaa29aef6b45136d2ad5abf7f0ab62a09c6e6bb8c62670fabc4529219b8ca66307014e51e5c772cc1e85f71ae48bfff8dc951bc5b458884032727c402d07147a9ad2c91dcf45bf8af9214cf939aebc1bf7545a4610738c6eaabe2ebda812a6a2bc87a84c12dce005fedbf3a19899d38cc3db22037cc23e10001f13cd868031494667e7277aaf5402c960a9f8a179cd69b3530733e4a8ccbc6e864c178cf83bd35624d291eed2f8b7f127709b7bb5ef5384a9680066ac609796db5548848a197fa2a832e7517d8c019daa0c73a2dff5c38e1272d31e142f98065c0ec5cc9c10bc5038a59036962e6feb6526e587fcfbd5de21a5d762456af3219c7bc37d9cdde4ece04646fcfee3e7282ccf63e78d66d07140d7a7bfe6e0d3ebbd09689c59e20b5f3d9fa139c8421ed601a97e1a66f1fbce5c7e6335c48a87daa58514897f0550c704b4101c39d22aa1a8fe79c082bf27c21541cab0aedcdffb1edf56ea70c48d28372d4e3f494ba48fac58e8300406f244e937bcd9a721a2f3b980c409ec3c909f364fbf79804834eeac5faee884fb6809444701727b5a5decdcb2c10b0826a5024b2b80bd08b7279f355425dc5b621136fd7c533b8a1fde260fa1fd1319bc29fff6db1274e53a70238161c086d15ccdb691f360d8ba12ab4957f05cda37be84e190785d8eac0e49823c7b93b4b73204418c6f8c4f842307f4a010552abd9ec41cebdc7cd3e60de2310f33478e77e1a8adcf6e75828fcd7cdb815467e3dcd96ba76b0356393077264fa1df73db1528c7593c9b792ad51d6d074f3347cbcd099574a9e48a36d90f1f4d5a57e73d8ba3be92b0dc51db3ffd6c6c907b81d5281deeb773a80a97129d617df30970b3260a50634b2370d1e7309eb6c4c99840f9305a449088ddeeb02390314897b890e45e8df99fa270fc9ca04e0e098165130a2cb71da4b9c04e08f4db0e44d596431898cc0f86a5855fa28cea6cee074b2c3fb5d814632e6529bb82b4c49a7882bd42416cb2e48f4d305dea13196d93e8f32a7d68b10ad4c943ab9a0babb31672c7bab90399b44c7abe4a4b26e72ed69a9b45f8722670fd21e65c9614fbf67d4b4425349c499f5c5839db4c7e18809d16eb549a0347a1540ba1e04cc2fc3a0620d044852e09601d383d55f7c6d82f8eb7c5c9453fbef4d5583fe4cbb15e19e2686542e60daaa9335326775879f18c187819761c1e99080947c7089fe6491c75dc55b3aae95ce832fc7787c380ab69665174dae7c888dfabd03aa275bf45cb84fda74c1f7ee8763385985122f04f6b3da99c349b2c2114d3d268f6ee961e23cf18cb364d521b62aa6e37a2346281c292aa109289c324bad87cac5a135425ac0ec27f6d87ec76aef91471455bcee3b885a0cb08e04e6ef48f14d09913d7754033c26b213a055385cccd2524d8e0897f4c3fa64401ade64849dcaa10d92f0a965de11ee7baaf12cd8463e0de510a8dd757f3d1ded1e67159743d1fbf08d8305390ffb05d36fc63e45812d0ee09b977e5b957e59f47ec72466a857299daf47aae072046427ffa3ff450ceee073c0e700ebe33d13ea8d07f4c06a207844083244f4c402f4261f449c5cc8ff862cce3b0f84b586499e981ee8d6d8e6c5201bc47746ada15fa8b4a765fd85f9be4822b0d9717a9174c4527cfc83f001784136b779b7ab3bb3b2bc6d77da13cd9782118e54ace1f9407e65c391a7a41b2fa8db77c42e0615ab1bc42c5e3ba41668156be025b402b380b64f3d9cc0dfad0d01bfb337efbd18965f094f321da6e4aa5dce83fed86ae8b13213fed6734548ca30a9af20592df895713c990d10b22d88b33f3db3ea5cee541033d535e05eef850444adc53ae5ccd2ce7d0666d42d9b4dcbcd208856dd7528ea015d339a5b563a53dfedece26c6b7282f1f6a5cf8655828111be73413774221ef9532ee26939a62dbe435d937eb03d283bd4599c5931d9d2c0997090c6e8bcd42cd6ff1847f935a4f74535f5277cb842c23dcc862702262070bf661509284b3806987d218d4452e7eaa17d31c8f93ecf41603d6819b72ca8ec7769d4963f2789c3b02f595600f64b747b14eb824319bddaa8c55062b5c06843832baba4420a5fb776246ece3105bdbd4a0ceacc87d6a0852755fbebcaed09e5f567b4c02117ed4df0cedece60604f029fe3d80929087e39b381c9a297a832798061ddfc555f737f6bf76393997603cd06ba07daf82c34b41202427d5a3703b43af54a69bf94bd3b46827160d289057538d120bc79c7d75106c158c2385e46c9676a64522b9eba4a3946ceeb9a2d124b8f4420cc8f5e24babc8de331d8d2c960a468261c6331ff4fe13254da0713231e2baaf68d1192e2ea243525c011e2e856142d9e8420d1c8ca65b9e8b142768b436bbf45b5a91b2114dbfeda5698b56c8e660cfcb16c16b6304e2e2c55df4a6dfaac48a704b73916ebf91e1053f7b5584c8116819dd09d95251ecf5143a63529f0028aecd5d3056466720a70dcecdfeec699ae89a10a51691cc86cb56476b1eb481009aa43fc4ced737e113d0ade3e688e0c829106f88d66f9f9280f057dd9c2586cb4025d3091fe5073746b2dfa1a8edf2184ff41de380abd961e9f09c7f4af1dedd9a812ca8f1d62164f8bd3701382f56f448c897a15584860f600c8f11905e092b098cdb91e76b06a771526f4e33fc4d51b39c498a8d72edd9bc732650b23fe3ebf9efaa3a3d7e44bfe083def805a2bf381c4474a610dd4a9eb58316281a1774f6ef12d9aa7788a431e5118c608c4caa05724e2186fd6da199193833453ba4624d0851406a9d817f7107b54109188682bcf8201d2d804733607f07c1dddb2ba7c332e1bc8cf4315577e08cc12255b1d1ace46aeb82eb3e6838932b92fc168206c193d29e4e0f7801b7d9b8c285109291743cc189981062a9959b4d58e325d97597f68c007908bb13cc56d47fd9fbab099c44f4282ebd2e82dbf1117db8b87313bfc42b5082599619f00c85a3b7dc43c6ff00b84d57bc57d06d40ef162b902be483e140efcce462901495233704f15c8f44b9b455b82adcf8db0578a1454a7f458cbf7fd4fdde084f1c9c66f10c194d25826f909a90add0a803ed035ceaa01f685a5d9a95d8828b27a178f7b2b607a0c3c0829ff93ccfe76b394903689e5497b905ae05ae1ed2a2159be8a424fb71808bce19352041f677e52b2f04fa6473757ac10435868b41976358b3986beccbc7f346b586f294e436e2e6f72a045c915141300191715d559154547e1c504d36a1d3011d6c83ac03c5458f0a0b12ad391136cf3b5c35c02759eb437370f0a1b94688e16c6994f10ad9203e2f83239bc315b1feb65c5dd0ac44014f3c81f8a18eb6565075d837e197c71beef1f803a6efb2b80d93dc45f76571533f06fb007a43a80fae45defe2ba859fb0c206c54d1efb39225db05bf6415912a88b697bc574204682f1140706e0795c33279bd0856aac3cd53e34c84a4728fc5bb8c1c720fe6737bad7d080343be24f49263a0ea8e0309753876287f8442c5e6265a753124e78c81a7bc068bb10d79f6e3cccc15989542fc81b1d06e2a24e124ac0650b549a1cad0120695b643c2105e58fe090a0b8586849bd2c471e6def9c36874b9aabae7e29fdce653d3b7bc50a486a22de15ecf1063d9669c594d2f3987cc3e3d64eea80165d0933ab866238d7f099844ebd640f77e842b055347b615b87645aa6d7c17c8683b94b51dc7fd40f0834c466144721c24e48bdae8f8ee27a8c4a211f7385fc27eec2ed911810fe14c882552bacdadf7a5c904a65b341036c64972d3514e05240adf2246d6a982268c1cdcd0ab1707afb04dae643df5b83c840d4f7bd8e27a83c7b1417dc3f707e69ae0d8e71e62609b76b2d8b9c0dc09de0f3e219880e13d6242b07f51f0ed9b733ea1c31673985338157ba8cd2794be714e9815862d0207b765bdad19281301a4dc55c2dc6d4678c825037217cdb16672f936fbdd3a426dc98e636139167054a751fdc8d8fda99e4d3f7b09e0f5d29582f5586f603c81b09d7348fb95c542a19af1f522f94943902002e3810f79562f1c1313672dba19eeb6f955d16d2887c39e4182328150a362f0ce37ff485806e476403afde87bbdcd4466ce071e3ca680f271e8d9d8cf8b80fba0dbfdb9980ac8c56163742e33bdbef54112ff03b55f48a2686f2aa5790be7db7786532edf43a97f184349cf52ceeae3ff091f29e37d8be79e70bfea3b847e3ba16e2ffc528ed1c60ba8222a79ab2d655b25cdb29ff078e30a42b9ec3838638b7a6840a14512a0db590b7f8f98c6b2fa3cec7beccefb032caf928ba04aab83c05630cea824709a19179170ccd2e33ffe04f06a6d1ffedf1dc58921754c0f51d72be197b656a11afdd5bb41d2b195eb65aae5c6844d6217f8f940b529ebf7f643b599c56076b55888395228420214306c6e2a07243278c5b05d5d93dd1aea711932380e529bf501778246cac668c0e21a67cdd114e5dbecae54dd84b42b75f90c4d5aa44e21a87da062cc8303b34984d3d38d7953cfcd8c8e60e54d708b8a5dcd21e4e3c8645287dd79d5c5712f9ecc28d6370476e05fbca067862d27b33662ca705fa06ddce2663548a39fb40b5c50c46ee9ef96514428a2bccbb84494b304f84529cf4a49c801d332ebbd8df34d35c6770903a9972e4884fb617fbb08364c54b3b99aa757253bb8e034c75ad2a89e28ab5e49069bd647315bf2cbc8258d5f81493f3e10c368f2a54be80a9338c6aa8830eb0d494d89effe5adfca95579508bbffaf65d6ff956abe9760061386e83e14fc8db5a166b52c614da71450347b87c74e155f213aedc299ca64bfefe35cdb0c348989101d6e5732af8412b43766973acac8372794d728850ecf0c190bb9e196bc19b1eb2f77de7e32209ecc2e413dc329d24a855208f5b4935d33ef3fd1ce69abeef7a44f70a4ba5aec9d0ee41fd443808149b202c0202d20cb4e6dbb88916ec5f6aad2df7b05c0f81e518a4ae9413011cb05f255c25b7c6d2b1f32b3a50a29ed17f20d4994487918053195da80027efc7c3b9cc6f153c648892f5bbdde666a9120bccc96b3da89cd440ce0feaa2016a8f6a5c5e188b848d20223829bc897c5de73de0ad83e224f49d69120d8e5df2cc09f404f86476e72c9d1dd19bf74c253f308064076696d9810df88c5bc5b823e07ee3028fa8756855423c4b3804482129da8707509a21d68590583bb11f1b1dfe438d02b9f414f2327fa2cba3d1e1c67d4ce11f8a3dc3396085dc704e9e1cf1c9b2ae7b7daf6b48dc44631dc322c400fce6d602e01406ebe78f9ed09f00f1434434f842c1164e0eaeb52f9553acb51e39fa00c7fd2ab7fbc3d120f34808424deac23348d0d7f070d09abf6a0c8d8d6d12a429848aabc4b4504723dca2df2378286562d69c054386c93b20b5987d99b16548895f117ba7b3673c5e4acdf8583c67988c062cc24f00033a585a95ce13d236a03c152aa1e126c550bd30c8a6fc68df6c94e3ea2c40db0da7bcc3bfa7c13eede22458f30cb76e03e139b740fcc857c42f9cde919c49bf8eefd170ac14414da5c0a61ec0322639947e6d6eb208c9b738daecb738f3c9f9c264ca409c7ff62735fd4831353022198559cbd16d35d830d87c7ccfb24bca3eecab793e45b38826d7424b5c6cab8fbdd1dac8350150a64445dcf4f0d56102f3a488888d1bb86719e56705cc160852d92635cbe2eef6f183d9165c7bf3e5c03a33da99b359d1e5093615446e816b58a3e751828384f7d1328668db843bcb37e4678bbf49fa3ae27f0d398d4b009b4b07ec1eb5b8be107ed077647ed75c98d6712af8196dbc0c85d4cd8284635ae24526c4d2c350f4cf3045d4d8a211b999fe0fc41c57fa6294437da9212c098aa35dbcbc09f08017000f981844abb2524f345a6b14e51845d605f19e7b31950c4e2bcc114f4eaaeff17211b6def48a5e9ea389c42ed8e6babf616627d33333f12e7c99f17936d52fc3e3ea1cb534c0f41024f032086d4ebd7d184d7247616fafecf9c24e5df7f2bc48208f65f97382c6b8289d357d5dcedfcea7db84126f9419451923903307dd18296ae24a7ceb64e134d95da6ce8043dab34f2ded8812431426e243395ffa0be421618c99457583201d91c98354f7d74d7c31092ee2f280320ed98c792896c51b2d26a889d6d27c34e1c98d88db36bbb2b9a003a5b635b1ecbe141c2926196f356f52e1eec8530ce630f9d34cbb035c42b3731fce88572f7c25a24079e034b2a198346b20dafadb8adacdb12cda4ae86db162512d166c754b8b7e388730de55bb40ac2ad14a5b848ce715797fa3488d5ef63f58fc2c3c12e61a08953835ce85dcacf21b8d275ea75a9256d3ebe04004a07b21aefdf92a4548cc16c0cb351ccde31bf1bfdb691f9e9a9628d8d5809560cbf8559f91f9613aad68675214fd481f34851a69492a320e8232f3267267c47368e7981f8240c5445942d1546a356203f2629ccbc6baa380ed782ce11eaf2712260c5fb7e2393988d44bde87316c2190f8ae6fcd60f1cc2721c1ebd61f9b6a2e58b1fd84bee94a1785d9e36fa70c3e96353bc058343e2ba61fa4d68a22e95618a70561c5cb56a4cc0b700a1827e4988753b526f842704b6465bc3f4ac39529fa62de016ff0ed1a33fe87b8b6d0ab3e828bb0418b318b90722e8cab4db61c3da6e3639b3de1b29fa2d550cca16484371078aa567c5e8361db0a8ad78a81050c1373e62e48458e23b423be52723272342d1e7787a5aa5a15584a0dc2e9358203bdfd6555f8104bc4b27fc47ecb3f913f5617d4ae18f0a06fe65d85b9356690edc3316b1c35546fe6a89b1550cfaf009c0cdf304d279c77fd1531fb2069e9332cea586ffedde9d4305f53edf89b5d7fc3f4464c4fc39e455ddf4cb4af0fdc2613d05039e49cabad216d71331eb3dfab3559b3f9c1480cfd3c3b5d2fe52123d2a0a03d7ff6c6648307ccdff833123f9c55e8d82fd7009f1db8d8b1d06f2a3a298218a890f53681544f5e9a6e7405c807631ede1c785fb2e2079ff10fcc7539542280c4ef1c46ea006b18e060e6ef97082e2ad2eebc71d6db443a0b263d380656fd9d0abf8c6252298f9ba62119bb04f5e0bdab77745825fc420fb7fce44abad4d223acaecdba12f7c4691d3f0972d4eadf306f2fe1e6d5ca586cfb172e35b8b37683605901b5100da410104a3ef28ae4ca0a5a05000f13be11f1624070ad0d274106706b47701e45e53d39f685f423baea88e7f6bf7b5038f6d461140d5cda53566f6a934fcf3a6e36876e0c253b8b64376c4f3dbb3f0909b7a970e18126ffc6db3047ec0b4b0e5f98221f23bc3b9335e75bf35d0fae20c7118c26e2cdfc405052ec7cb0661732c78ea417e2d759483f61ad7d416355a9c8284fe04834ea0381848fd115b77f6880a0b6f6731dade1f395c2a6d130a3d88ff17462234b187301d8ff184ec5eb1a3b589ea5c85390cd253ce8031453ca2e5d0d0cb1be12fd390bf30cdfabd31831492b433d7651577f5999e74f124d7c0e8d21c3d26da69f95957e9c42d40dd95b140f8c8ba0f4075d63d10bba4e5f3be6225f767cac257f250e9da14bd6998004e513f0789444eee279a18432bc6866fbf378d04117c534a49c33f256ed303c5bd315e0a4457d8a169d40c4edbbc9733b3506b7c6581fd28152a1f6be5292e48e46fb8255b777da30e1d1d3687c4c5e9c7b62341dccefa51138b913e6046fe0570f35599d02395b87c540e5a13e5778624b8c0a4843ce6caa7947f2eda09b997ea558477a3d6c95c397490a152d264a9c4960358e02b737fc4092d68312b35c746fd06faaa200f7f5d942851217d86913aa2a20450f2b0efc688fe5586360c67baf6650d1d37f362a90969adf8501e1c37d4ee0dffc066fe1b15e0ec2db04683a18b3d59f522fb2880771d765eb77aad3845b7e98b3870839fa374fcba973355442c5655768e6f5c1cbea03798a0f31944de5e66b01d40d4b1b051eb3c2db1fbb7cba801e7f2da52532cbf61df1bbe229a9e15d4a5c3c214dda68448f429a1e34354667aebdbbbeaa3813c152bfde4b3cf0015ef52138a1f2d61167cac475b6a2dc5621c145fcebd685faf7b512e5d162cc63a5d3cec12a55c1addacb8a3a8f3898725b476b6deb74a8504022b1bfa1ffdf465ac8a556ce1bcbf43fdf5b5ba1bf3e58ba4a7618acceba5bfb2cd9d5ef8181218c8095ce7425dd65b472f33e32563bdbd4498c9ed9064dc07d32471d886a25c25a3e186c0a6c82f67d6d4f74a2cceaa8eda80abec2d05d41d225b1e7d2d3336db9e682ed8037633c6fbb6d301e8995289f67007022a35991fbe4a0413ba9ba71062e13369b327fa6de6676bddee62f1d06c0c088b4176fa8f396fcefa2705592035cf0bb39a5652e0d456b7112dbcdf0dda5f739596c0e0e6a774e9c96e900346ddfde0e150c36c55c629e10859f57c5db6fec4581970e411fc0dd44d7a41b8888150c54584e92b5c0116b40d9064477dc55db72177d36826ed970092e20180326823dc2028f09bdda510ef635f9ebbff4788449428587b5d9c3f40417ab2cdca83b5a442d3ae937de26ddafcf2b1f02e6f2e8409cda736878a06f1c70a182867fbc97f4d2a5b93eeea7c39db5c5710fce1656364eb68c58003fd3de652c15fbcce30dcb899ed4b3992cffe03528488ef8911695ae45089213598be99e9ccbc1f7926e5c3807c989a6d7dcd923e80dadd606a46a55b16c9c0162c5c74fc54c4205ad4af6ec2e94b38d4fff157126b2a39916f1b50dad846fc6ca2b9b68bd547bcde0db1700154281e1e768c717a86d659808dc6577bbac915180bdf1a9907596114486b61130eba080c00ae323ff19e35a95ee2163aad6bed1002cd840f9264a0303f05783392f3563f4779642f0502f417da703495fcfffc57136711a2355de2ae611fb3a9c40fb9d036887373c5ad2f9dea0e6f4f38ffb9fc880863136e04c7a31bf9d1ac2e83a257cce6ecdf60be7f224b3717739885c35a0de4c70f065c64942862157ecdb5c1ab27be6cf4694b8a2c60edf1d7d716c71017a0452a808d4693432dfdba51c0c0af59591001775cd68e326946cad8d752404983f32418b12a1035f630a22188e45aead00e6e39761a7ae87f7323d19efc58b7beb6584d4f4566ff98ca7b06790bf77a76b3d54fb651e0779b3776434e93a4f936d2f6f6ed01884b2a2c33dea3e2882087d9614351fa39bca80714f89ce1bc711bcc528325d92053ad0f215365b8c875789a46cb8a056b3d80c1107a0d405478195287c1768e749a825036faf64e24707350a07de5d05b551cf37ce12687cc082063a1ddbbd523a755c0f0336710c49afd11632ca93da68c8378f10b7a3c4b44abdf91abe97ea1ad4d75e976a34fbf2e20a1ff5137675ae92980e8e844e42b9a5810f897ff16ddd0741937acfe9eebfccae7b7548fd378699bf284d151c584ee1bd576ed49d0c135bfb4c5b80de479f7283861e665bd2619a6d5bdd581940a7e81e9b58dbb74795560e7c0557f557bbcd6d4bb09e55d7d34379b5a688b7dc4bfc463817ca47f93a0a492aaa7a9dbcbb6a20399009ad8434a1487017b3b92a977f5e35cf12d8e53a92e460c938ee72f491b2e550b2cfea7209d668ff4239fa54b6a7172166aaba37527c9170868a05357f1c365136e7f0cc0e20c8c0899884c919245611568fc23017657fa893db3e0bbf6a730957f9fbd8f4de76d267c9cc4e9a73e40de989bbe1f11de5392c73710370a09581f20c50b4ac763ccb0f016561f8108707edf1b77d66f89aea04ffcfa6b89605fe9811c3878f00e722ff7fcd66fbe5409e6565e616e08c2a246645fe4055a089b382337255f5e54c1766edbe95c7f819e81ea21c030c4bc6b5a551a9d620811070218ac54714fa862ec6f0d9a89d7c3be92c1c9799bb0b44470cd4688ac9e40558f324872cc1f679102f76346713fd27c724566feff416038a310fec496bf258b0af6e6c68e31a180d6a167e8bb1be7ea93753fd76b05b2842dec747ea9e9d563501e8ef0f31caea62b9edaaad4f18631b0ac398b0a751a60ca3c42c6eaa55b0000e16ecc388f10e8c2dc22a692b128c9447e6de00c72648b3092ab4a7a011408dd3f5e87d0d94b7f5c228c7b05aaf0bf2902290e13f6b6c119b4e63edff25494b0dacd488fbdaaa2d057ddbdf3f71130a3c5d620c6d668e27a4b4aab89062d4b42a037a3cea330f7d08a9dd56141218b154eaaf11758231ce82a644a224065fbf24f9507c5981b5f32e16a24889ff172ed451131eba21a86c45ff50bbe10313b008565560e2cbe7e54cdb6b66f7cedc7cbc23b835c61ee312ccea89d5b9442ca85956b65903db6fc71e87aba4a767f0a97bf97ae96acda629d578ce7cfed01fb62d91103165ac67c5cda90e715b4dd6828c5c5506dea7203d6c42ee92246193c4162c796f09f82e1edf16690755b8d2fe68340c6469b651fe7a9c76ba2064a06fc28a4fedeecee068ce0bc4394f6ef0864af8fe021d22a232f9bd1ef4bda7b65af030068d84c06f6dbbf80b42944616c741d516a0378c62e259e0bc7cc44ea06ef2f3080d555b93372c8e0073676c9459bc987df0aecd563a5f748db9328b5c03260e886e4bfe6ce218da2b82aea36a9645057411c03023fa00080547916e52ce2b5517d376e2cf551883e8f87095997c2a041be3691b5cda569ffa9679b6b05666b312e578a11f5b4e4fb1f181632b99c9825d8991bed4fb5bf6678b95424e8b2e68c137806cb0635caa210fda402be5b62081318eedca379b79205aab56b8d959817f1adef2ed4804d404b3accdc53c8082d8eb91afcb164c1c09e4520fd3abbb130d56943ad69517d7512f3a6b5f66b2846d2616ec37f3adbf1bc1406d9e6ef8590f4fe86ec1304288526c35d045468818cceedd5f37c17a753f7c8e8f08d18b2d32bc964fec19408ad7b714afde7db6feebf046fc077a644c550512e94da0dab30d826605ebd19c9f56c6b8b46db17252a783586aa6cbfcd109972fa41100405a6dc92af79fa4180ae2d21a8727a430b9bf2a39a857ed508304de6acb97b7a8b4d2421aef21b15713f91b824ac5fd2292fea4f545ef6a904c4f3914483ed49c5c9e50105c7fc7902e3ed540262f840e260f6aca264f28082e37fe88908c661033809a4891f9bb0182e77328cd5f6356ab6fe06caacd3e01bcb031a2adf58bd1b169f84ea5aaa0743e847f5538f3af83e77d7abc10ad74267fc909258d63547a2127d67dba7561049421f375a37234ecf907a2d167bd6217b19043de2d85a69db28c5f8bd87d6325636d58bcccfb500dbc41704c03a6129c6552c732cc253df355ad0123f57a84d8f051bd3a0d83409c87b2defd6504d21cbeb5cf2824b3d2714bbd46672001495e9015dcefa44674033e1e03b7ee3d338bd9195fcfb37accacb7205a083a8edf1965fb6616960e5c770720842b517d9bde0994f860a55f5699178d92a0cf61dcf38acd805c28d269f71505631b4b017794cee7219ac40f236abdaa129d92653af6729843c809c2f0bcfa0638a862e40dc3f2f4e78270b2606c2af2acd0872929d9acf7388afe988fb73d4da85d009104ee59925d3c99a1e991ce94e2be21536acf5d766cca87b69c5519f0f10e107112e387627e5b7bf35f68492f8c44d74e31194347c0676d838d258dde69f0d02a0db4fdf50aa1ae8754bd7eec5a6ae14cf2e9190ac2caa8d7aa02ee944bd1c0e34d55816068b159aad968326d19843a8ccd55db694ac9553b497725fe6389b581d5addb6b34aaf553c6775b0b432cfeb4a7f6d29c8f06138b3a1f06fa858ec4c66aca958176937280f2c687bd718c0908af035452a797dc0f15d103b8d9a403e1d9d5c44f57ead63c48b258b53e042d047830a3519993160d305afd64c2e150eae7b2aaa21701ae6fbb44a7b38dbfef61900730d4eb0cb933d9b1debc62cd756b1f0093439f7d2149c91a19f1b157008600aa4c732bc3aa133a849ad706e1ee8066f2bedad8760c20e0e1eeca512eda6f2af7e237c36910ecd8a019056371cafeb5aa6d47f5d1a17b31d04108c59e92294bb7d9556b1319f4674ca018cfa01807d3719d40c5ffbe004889ee0e82e6b0da5996ea3701fa4eeff888dd12f8377566edab3d6ee7c4408cb3cb800157e942d6f8b322ca291801e60791020fea1cc653872ece6792ad886f2d718a026bf1d579d5b74ce2cdd75578427c85a0b097c7c8449f6610ce5a683723422704a8b88f0c6ccd278dfaacb248a08b0a37c98ea1f9965d8b2bd5d9e8c9605fbd0f9eb5ce52cb310f9f86bb01db8828e2583351fa41a3285548fc379d8ab1caa2341ee639e81c0de445400f8c85fb0f4b30f896d40f50811254bfe54a71e2118750b3a11eac808284223e51d943b4a10f7b8bc53d1e8402681a163c111cd435773844f07054b30f6b2b0d84506ad7c54981250c5dfd30b04294f31486e92a98eadf2d83dd112768f1037480bb0cb592ecb1787a2ab8b01f7c476c68283ad6ecac67461daeb0696f0c35411575896d866d1c00a2de187a240c575e6ca8648e17ec847f561e6b841087a8371b656de139e69f8a6385a3be14df5dcb5e7e9a6ff071c68986b782ba80a876a089dd836659fa80140fd0b049e3bf8eea39c6f6d7bcbd01671bc023f7648b05ce7389655992219b9695d1632ebb17f42cfeac34d9f371c6274be311568e0a8f7b3ca273200b5eb0f4c6c985dcabe6dfe1a3e03923082b58fb1ca2b6b706d3538283b712ccb105806b248e81bd2929cad22a4a5d1ca5fd2d110b16fcdafa738eb42b82d7e389adb17f4f20bf3b4a4e3e21f390b93b9f33a4e49ea8f00d608e65044889d122a10f939533835aa600f04fa11b3b4a3f3df83073c0bd93da15e37a47679a765c0e6db5871ff413b7f4b325b595a2d8c176ac3221d94a1522b40a88f429744922b68fd30ceb3402265d9f951c491c07c496095a3b06b9f019f94178b954419a5718849afceae5e23a1948aa2001f624f301a20551d456bcfdfb5ff063f1c480a31c58a50f1828457a4aa0ae512957340becd84b542a732a215f70dc6468803458ae41cc786f6ef87d7acfe22abf7107703ca3b41120958bea806591bba5782dd8eef637d2aee2170801e43dd918f211dd0173b3cd3dd4fc96abf8b80cd3effb83379396036bfea0990820b0fbb5b022e406927fa044a99f5bb700d6a3ce122477e0894ebc979b3054a1d76bf039700d9768159882744d4e81c92a1b25c22f55d31c152085c152452b10abaf45f69a493c2892606dd381af28e98cc1072b6c0c0d8b78b8299047d7cffa5c8bf9d896e72471c89f728c3d9850790aa1789a713ab265bbd99f69e75c09568e3b62ff692af57af49b6a6752f7fec6869fafabfc0d20fadbf1e34afd10bf88003a1f03eb6df849ed922cc994fc925dc9ec9ce997e824edff35c76c26a10fc38f15edc8aaca006fea6d39fd3e001ac17adce402106717233327e0a2e956ec0b0ca7ccbd349916c435ab5e8edb1e095e4c5ff435d39b6f3dd793259e3d42c9d449a4869a1cc6ad23c3c1805ce3e3e9452d0e8f30d9ca037ce8b280ba7740743ae50bff809338049ff4879e6e4cdb6b4b6ef5c0702fd39c2badc4ae848c88789da626507ac103ce66787c1cc6e5e9b89e6a79a9325dc996a682fd30f72cb27cb4212276fc200bb8bbd8ea2e1b6c057b7fc0c7470b3063e30cd4d86edad60033c920632ab81c66f8d0fd0c5cefd00e959c31d57bb071ad3d105c8d6f781fd4fc0f423f8dfdd9b5f84040cb1200648688eda9c3405c0bc91f759464b54e20a2e156efced8cd0125571454acd377a394b6844d5aee052d38d3cce12da5189eb58a970232f674c4b54dd15526ab8c1fb2ca11d557305941a6efc38cb698b4a5c414ae58dbc9f315aa22a0e31009c6fe87386d011b55dc14ba51b163464d5c8fd229bceb922d364a8af3ece1d1a165850feb4f05c62ac6e9ae93a0cb2cad9f59361990868a76409037719a65fef1cedb83c053763c20476e1d89d142deb831e116ee3d9058014184c67a2381a9643263ea020f1e719590f34c241592d4a70236000ef97a0c04962030e7ba7b5e3bca4ed26ca084fc85f198a84ae0a7c8c7b0db5f3e5b42b7538b49850c7b1b5d96b542b4d6a971eb91455daa7efe5eec97e0344b54e098bc9d6fba62d36577444855035fef96dae41694a078811d2b3383b3a20a3ea2f1cdcecb00355e7f69e2859a47b3c50ee0c97e7ba4c06af98c95ce0c5beb904d3c533a2212f10b91cba3c487b73930f09b382c5c4cab74a0f53af255b7193ddb47eb0b092f3b96e9e4efe123bebe03b921ad63b033990198f2d5eb8d8ab1b22c3903ec97f53551c8dfecffe7f4e0783f69ec8289b2632071ace2d58905ef7699a35a474a22dae62508afa1639173d00a09a0840e91d0b668040bc148f8cd12790f226f49487bc8395b5454d3e5be41e701f1118212e5893350283b548c63d882974a975358e5a51ff7bf3d048e89abf55495884aea9e42100e722ad1714c36b76ae3a83e03020ce0eb1610d92f1748f99212e7f48e72c4e5988a3dd19649e1eb0551525f7645042f23bca306778cae8eafcbafbe9d5cf34057d2d1859bd73551a158bcf81addcc3a071cafe67b5cf63568306ec657588cfb502bc0135cbc53281b4bc201f3d6eac8ed6243ee172931d8a87344ca9537333542b99b7f424cea489b55515a01a25e26a02385ce4332bb4d96e89c6c28cf44243ddbec01a3f4c5e9fe50baf83297fa1b001185b5783bbcf6f7abaf392f01eaae0d2bf42f8393b077b98d28a80b4344d77f709862e6205fe17ba68c91a1e5f891df244048ef95006652a8a1b72629d1753708f05649dcfb62208e4bc2160f9f7a72f539ac02d17f2412b3ad20504640054c10ddd6480514362a9069d9b9bd0e17e0e2410127e06eab3117854705e35cb6cc29ffe8cc4d97445185fbb27188d68bfe1191b5fda9f6f4d822ff78d00eb54a5b131db51fd8598d04b0ecb5d6c57cdd234b1eb2fd89116e6c881172384775d4f138dc1bc7e769bba0ce22401b7048568d0072a42f68f4f6a89018c8b8416be4ea1c08feebe187ac7845e275bc760ff99bfdc910dba3c5b37183bc1608fb8bdcf92856e3e8c13555f5e7eb07d0f664476b15e15f0b44a1daa766411f89c6b580d5b1066a3e7b5accab1fff24232cd99182172358fdeb0b21fdcb6ecae7335fae75d82e8681990471de4452cf3abeab5813ec63db8f269b9da89f707144e214b3b482b284fb08ae76baa02c8dca944152af0919bbfc1abdf2301af7db76543790db601f1c928810ab4f43756718ffe4f699d3b7afd9e994a6f49197f60cfe3beb77c2f045870923a3b921d5d2c9ae38fb903b0f342e1b90cbc8334cf1fb7917cfd85cbc39cc9fe5a108c2124c2d04204cea02f10850925f5741c2a00e38cc5f26592c3931c2b269460c3f182c62c265d1794fac2a4a2bc6af423536e79475f01192aa5688950130ea3b1b3169e56d4a8f7b9e638539b350e8d1f6ce9ffd3d3b028c781674337a94f4b025ad6f41889f1388a9bec7ed7ad67f42ba830a599ec0465af395c6608f3b03cefc0552793c53ed3cccb06c60ca7ad3624f5dd6275560a786f710475403c223807dc2afbf71c5572d2ab34deeb836cc85a488f4300b261e4bb042a89790c2e188043484a0d200180d0e0b5cf60757ec26b5d932243a5e6c559a1ef748bede96535e2920d83ad7c5f6ccfbca8859e2dd8db7cdf6e36709e017f1f25e3c8d7147f1e22dd3242409fd6fc624b4dc3031e6fa91750e16090c15e6b34b41ac42b281a05b543bda6008d9ba36f5bd43de6f9007a1352a703f9f4474e10457336878ce478159c2f7f1dcc6441700b095e30c78ab72d2205599585f349d9e8a9016f75226c3f23efe715536e15c54c7a73c72b077eefb4f42441067b19190d11bbdf9f8143d6e5083216fecd2db2a615558451e073bfe75ca34a65d0e85407c6449cb6449cacb42493176eac7e832d7ed4ab0a7dfe57927bbd206f510c7e9b14606d18ab1f2334ca91f66e88432e04dea38029d8b1590d8edeeed08bff5f5a1b2ed9663c84f8eb5ec3842a940a90d0d35f5e4ba89d5e5ee4a62a5c1abe0722afbc301e3c8eacb06e24bd6cc75f413504ff09008bcf24fd90b219f775a9105c50aab91721d6e4e13c10f58735623c7f8585a5ea25a225eff4dfec3d9ea40434a0954a812129ec60c10ec3302e41323ca6fb8a91e79411d39496948d1ff2fb2f24e1353e935464617cdfd078ab9ffe4d020b9101e458ded2d9694b8903f788364d3004075f4a6fa72ded0d5635cd9eb6ba38584d7e4f724a3806f2485a9e999710ea4ff39e7c2698761494152d103f3e963a793185275d314b162477bd76c047d495f82ca8ab4947433d3743412b5b9da53e5441da717eb436df983cc662af38ae7b33f0a80e6eb429ab161b73c96a8ce637a99786317a400776f17bbec15f1130324c455c60fe9bb6f7fe5f229d56601936692c0921f39f6f73d52982e96d7f66f7d22623a77c40ad71813f97d63e6c50a65c7d386c657fb1e6afe0b95ee49f0e692086b6b6c3638f88b5279f60bd6b0f8ba631c2953f3f01e546f40154a304ae143990ae713d247336df9767708b8d47d0424655c2d52a91c122376801290e038eb21931b19ff0c250ea2dc7274ec8bc7b7eb8cde84157387c2081dad56c2615213f96603e0b66c9fe01dc5903aabb8e8857209e15a703efc1d16718477d7fdd34ce9f5e6f1743b3fd9bc6fcfd8e636a1734ba887be2c75707887b15f526b028e49487a6729e3c0421e00133eef701ea8038642e6d682f7a19c13e836f21bfedbdf7967b4b99924c01420899088f089bf6b5975d1c83eb98748e4c2281dd1f8cdb98e9fe28833c4e3c767241fa16520ebb6674ea74caed4f49eec3685eadbe5d2f372367e72f5cf191f7f81ff849ea7bf8650141f90de3b004b4b0788bf7c8b6482986a9f87611cb9cbdf6c2253ee35cf336a72d2350f3154fdb44def4144fe45be440e9253e55cc6bfdead5a3d73704135e1253d470933ce6d233d0b9f4ce432abd88eeee726cd7f7b203f3cb7b3c7bd50be9571779224f45e4f578952f5ce21b6450d621f8342750c405f824ea2e09f5460cca8a53677e60009f3c29bd071a2084f04bfa0eec8bdfcb0de6eb3d5ebaf3e9aa41a5253e6d08f3d2b7f4b2c74ad4b430e377404936c9c5c88022217de3bc6d302af3f68d7af23b4f488a6729cefab05950be9f7e610cb9227cba5c877fe7f2935da4db56e28894a72ebd662151c204a8877ee0ec0ce939d25ad2844f50b614cf07149d37e1365048ef22dbd5edb85c7ee1c7c52e01dd137258476f18091df125bfec7288bedd1be1e6ec9d73b78304bf75dede7d21efb88e5cf48812a4ba1d72ebbccd39daede81e06471fe7edd3ae1e9945ae6e87fcbae70b95888f013179e662978094df95a10bd0be23621761b03df3dac8cab46f326e5c3945d2a563de110649f07265fa09356c22df1e3691eee153113eed4c714c856c510835faaa04608b5228a1463fd203046af490a224efb06de1f6ec2bd993416ccb4daee01c2323a98c2446e62f2cc1c74f8a6d4b7c858a611886f11732f1bbed9ab3a739163a26449ba2c491817823fae69833925ad5a0e42b47c65c8846d10c441ca57823926af78595fb9a78294e1b0596220e20e28d1892220df9c3526c168525f894cf0891d70106231011c7ee8dace3227506438ebe79fcbc83cabe0c7afccb27ed0b91881fae132746947e3af7b2a3fef4faf30ba23ff9f5a8f17a024f1a727e594e8638d1f92d458e46fc440df7c84be7801002012396de830f7ca2cef916da90342f59dd7407336f2f2f7d247d8f11833186f465496ab18fe004c8909325aaf45e161a967c641aa64cbf5d30940b6062e737536cf746e48f5fc89827412f8cbb1b12ec98de9f4f143eb8d3d1e32fae999bb16b01b34b400f2cb609b61b29bfb8e01cc1cf674f0946e2c6f42448ff9289e71b3ea2c3187a4e7dfc90b83c09fa7165e6cf287d9b9c12fc976fcb32ae141dd17fade4936423bc5c72eed6481ad9488d4e7dcb5aa3a183c6d3ef081a4fb7660651ff8808f4fe47c49fa79e711b71b009364ef3adbba668ca146ea76bde5ee69a27b52f8c5db780d905f8ed764c0ff97514e0e97744019efa56b9dd9a8d1ab71479805f89ebb18f5edf8ef9495aabf08902e72f7fd971f1a93bbcc218c6d3303ec32e9f4ebd94bfbef8f3a329fb3db018a5c08229377a297da4450d31cad5eeeeadc12eec628e5bd4d01fc3463630c7bc048e4830d7755dd80c9be08b6af0028f182449fe164a0db9c8cc5e99440954c3fab292e49c5352215e0c5e578e68861a92fe22f129e460f8c47eb997c0cbeb884f5e4c0f302c462c5e546c14a3dc4234c72eece381397b887d2ffcd129bf11a594524a29cd328ed98c913967b864a8a1ff9425f0628e696812e475087a6286266628f21b2fc7169d01c7c6a4deb06d492e1a1e20864aa280cca286f5e77452752698ca2835ece7de9ae816d89c7cf14b438dbe956b1272446cdbc53154e9d2a902c830c4244e2fbedcc8f9f198ce1eceefe5863f21bdb10c549041911a390a8132b8974fa12eab0c411fd23200f9d4659961489b210815ead3321479ee72ec179d8bf9419dbe94c1c6c1c6aa67499233331bd7f916bdd9491c603f7e51a585cad7364af36d548ac756eb5191f5cc3f1ca38b8795e421e9f2e824ef7217efa25d8e287354fc078e2c3e714736678f485a9c3df644227c5271c66114c9d9a30ea364c4f090a25c3c73195e6cd2267692177f528d72f9f86bf154547c65c5b9cbb1e2dbfc48b0facefd63e78d443d44231567f1426ebd8ab78affd02bde88415651f96afc6954116b62a7b56a299c6b5d0e4ee4313fa85b10dd27db63fc8d5d87801e5b386226f2ec17b30c6ae8830f9f8e9d009f5edaf7db677f44f0697e92410650f63a62b2e4e517929a5523e680c036a821f7ebfc720a4738b23e30259d4d47a90735fa7aa983d878f944f7e3e42e3927a5949b11d383fa34661e46b32c731dfb99f778ea855ec4479f5e587f661e75bebcc7c7ab7d7697a33f52b84a3ef618b6acd52676ae356ac1b44a3624949d3e2690df89f3ebd209a3e44f9bb8d5a82c280b6ab55aad6c48c3d18024d17c3c7b67437cca9c9d7aa8a5604851c947a74948947e55fe90b01ff9c34c90fc746741d036a5156a6c5d5990962265419e05adcf64418d923f6c629fee4e22d59a053d4b26724842f1914e9efd6212ca26a31818540cc947973e1f59ac833a2516ead4e153e83b7c0ae5cfb37328718e7c8efce19303910120ab24314887c54c7e0c6935949cad29b235fcbc2a3733e86e4c3f311cfa2b7f193044b8487cb00166dec461904b35062bc31e62bfce316ae62c8ef9c4de605f8f53b532ecbc838ac38d2a0ca9f4e1544d95377b1864c7bc59844176aa79121292ba477a60159fd846c9d7d927ce74d290d17e3c3f128e63733e31e4970a4fe87c38552aa0f7c6bcea8d9a2a36b1535a2b89e41e821ff3a34e0cc3fc62c7ba05b4639f12f1e7cb8e971f8fe93d8c5a1bf68da78ccb53a4edc86862db52d8013dbb8e944b9ea74e4c0feac4f990d2257d645eb267dbf0e8797e21d85fe8b28f743ae8cbaf590cb2330f6a1899b09e99500a46d09ff451d6dd1a7721356d5fb0776fb46f9441f84befed802e9d6d4bd988c4e77982f848f54f2f29d29383c35018a8856408cf0f1f9149fc6115d1c9d9a08592a4f533369c4c9ce8b18564088ffc217d30f96115699dce098292a4b51ac240f84713264758bf137562180c93687c6090bf52b4013208b213cdc332cdd7bd514ab6e6da9a69a40a95b6d9ce8060a6c54e56cca6377d18e46b4a6f1e61f9c020b39ed068ac8b3b079b4be71823894d5c066ede3a2eb7487ecd7108c849599649e76f06d51ed2f830a3f1bb28e9a8e92169522abffeb6679e4d4f53851a3d9c01e2176c5b0a57809e7de66f788c6a2acf52642b3be8805676e875b50d3fbf15201ed80033431bd572c6af4f4ff616a0478e3220c568f951b726543b3bd8a8fe60988a1afa00f38c03c7d6ecb36aec99ac465d3e8dc266141f9a58566f8379953a8934bdb5e9f9337fc05059aa15d58773c5f33b572bc3bed28c6c2acdc8a6ea2654ea5593422790670f597e7d4452591c1348dd1a6fe630c8118b5a102d88c6c3a889c35375f9a543737080441cf38918b840b5da2285a563d7c42e42a5f0b4e9c4970604c9d2826a109d9d39831bfcfaacc1e29838f106a7f0346ae6c4149ee799935224a5089fc294253c3b7bca12b666a900841c2d08fb329f9c1964ee4c9d891371cc1acc1bcc19cc9c99f3292c09049654ec74c86f973d5bf34346f161ec44ad8933bd0931f8f5f9c4e2c88ac41baceab490a203bab0cbc78719929eccc7cb8e30c89e15893832237b839da19035a1bf9f1a3dcc582ca97ec1ead9b7c85dd8f475c9430a13b2bb190ff2cb7e565a330b61db5298a29af9ed9df830fbd566eac3a9d232d654a5c41882cc39ecd725c7a0acec4e70a97d5ebe3ea07a60137b0f65087bf82b822dc4bf9b7905db964291e424910f392353644a9ebd322a6bb189bda9c8517d9841e1a1b035fb2c320167ad15a532255992ac951d79f6ec48e6c3a82cc966adac256a59b1e3acad895bd3720a23eff193adcbafe6586290dd478c2ab9cf1d36f2f3bcce60d470913cd71d3b7a04be5d08e75bdc3a91af4f9e46fdd026769fd52a61fdfadcd91accd7f78a670fe514bf2e5b7115d383ba59f8507be28ad587f36715840d7f7d9a6a495c192a33d77665a8dbf0fbad8b3c9ac9dea292dac49cb3ff00841008e08bb7b9397f7ea6c071658be6b7834c6c52db637f3640b6f199b70b4a26326ffe4c264e386f02b529680e3168fafe66932a544f87e7bcf91357cf1ece1f3eb5a3261336f5377fe6cfb3cb6ec7e8fb2b75ce203b7699dea3699390999967d77e32a65e70ec99df62173fa7410d29a3486c62e79119eae84733d89a99e6a9d1b785d4e85b2363e3773ddbfeb68897fe13001fb72676c76e8ffd831add07357a07a9d1bb07357af3a046ef1dd4e8bb35a5dea9d15b07357ae7a0728d831abd756af4be418dde36a8d1bb062d2f31b8ce7191f1b451a43609a96dda826b1ac8e0766b5c7e7d9bc1f50c5eb896010cb75b6303d73837701d031a5cc3c0b97ec2e35af571fd8218ae5d50e2ba0535b8068203b75b0e5cb300e4766bfac431c833df4faa89eb15e8c0b50a00c0f50f1b5c3b21c375133b709d821b5cfb98e11a053c70eb1b0f33377690b101001d4c600e38d428c57c9ed3b8c10698971932482e315a462c2b2a3545d4cd887665e4d78c056dcca4720cfe1067bca2cb38a59763ca3863fcb827116877e30db65d9a816d836170a994735e181d9243e359196deb46a4dad1d6f9f5ddf9f5cdc1c991237faa5686543715ae76ecfc4565275506573ae6ca5eccd1532407118e1123c6e0e72f8cc0ea5946a396182e2d2e2e2e239615171795eae2e292e222ea5c5c5c72d0bab0bea574b7942d5bb68760e4f1d1c9b6a5d428997239ba3bf53bf33b34e54525b783f1500d2ba51ce5e9a11a52cad56ec4ce6ba8d1392f2a2da580299d8eaa92b2c2ccdddcdc0c6e2c2b2c2a952545d4b1b0b0b05c53864a94cd8b4ad65b092761f223e78551496973a47b6134a3d9baa6ed7092e39a23a76d5c2792225173142dd76d0ab79e288868c8afa7f004f9f5ea854ce4d755562b7265a539ae30942028434150d80790cf11243e4792b458385127e6449ca862264e7ebd9b30810254440f343ed07c0f7b642632774b392f795dcdf18adc2de59c172631ac3962725e1786519a6952d39aa386d12cd3b46de33ad975cdb1d3368eeb3a9128a5ca5a9b638d222ea6a470b1aaa870718545b2b0344796156ed70be9b6b4701b2306b72e244922354792cab6c24516c9c2456fd4e9884f475cf45a3a1d918b5e8c4e47fcea225d5c9aa30b15bddcb450d1cb4de881e71683eb3bcc60e3135402f016a5124791b2c45098cfd04c042231e855154aae55dc6901e15a5501ca40520622a0c6da2ba0e084c6ca02cd19f80c73159b60c4097355c58c187a023680ac3f700966c43da368dad4a01a68b48cd26034df5e833002652029c31124b83f724803faee701a992b344c224c23181876cc261869c2d476b8bdf8ad122ea05ebd74f9978c17b5e5a587e0cf1ef2b283bc6c9d978dd3405eb68f97ce438c6a569b82bef6d0885e3d6956733d97625f38f3411fd6a0187f7dfd83c1f6d642d8407ac5442002835e5d40170f0774add6105e46ae15d04584cb08cc906b15775a3cd78a03ba9cb6a8f88b2a25731c6a53bcd4582f256751656b4ef8cb436d8a6fe72e88999f5f5d99f63e418d48c41c09a0537e725ed76784c6da2ba0d0c44bfadbc96f031aab45d55a40f2b151d48666a60706a343d9d9a20850b8f0f2c21aa64423abf4a564f8eba5bb94b23ffef9a0b45eba4c818d74eea593d88852f315b2d92bc990cef8654149c25fbf2c282bd985124c8f164c4a6c050db8e0bc309a9d38f06dfcda18e2bbb4e0f4058910795e9a40e7c178119c4782b9c0e68d4819f8f6911199c755cab5a4b3bd4717650bba1093028309518e6ca1032d7240061feca8418b26399881fc13d8d0ba949dc4f4b7e3c8242e1768160c68a04294214c1185f5049b1d2ae273052dfcc0056420834df4a2461a7f901ca60341522082ce1430480de1050ca9282c81820950448185193a2ca0245192d2282cacd035aafb656d11e4d262fb90c382b56141240bc02feb89164f7e90a4fcb29eb4b6f38106f58726f129dc2c6c307c8a71e3388f71db7c3b6edb32ef65db7844cf3cb27ee697f544f597731ce73a30e7bcc777532e310c1bea4d509bccc34a735d562cc81ecacba74d7cba9630c85e77b12676ea7518cb03fbe5d3d7123e35d065c59e7a8b057dba0bcc090c058bba80f6c25890e3629262f21c03104a1fcfb28967972916006334c074f0ec1d4604c252517e8bc578e31f650305c90ebcf40ad4a88c2e61baba1b0ae43162dd8dccbcc35854e6ecddc50a2165181663e6fda036f4db6628353a03e91f3d5bd3ee83d3d2e1fe19d24d88d0b47c03350a4b61a9540f91d5a8253e4c5a4e9e3d83f233d4845b584a6a9b10cc30e3f282165a2e2f70a00a3e60b002137c20a40a013861c70856ac200d38e00118452a18482e2f0ca9391031182b5001e30629bfac2847d0aed8c2cb43e9e1f4903dbc2e29e764ae6dda4cb6c7b44decf150a25f4808306ff9ed8690a954fded8688a9940de6d113fd76432ccba6fb4e0173101829ed8bae82e66802065328014a22831fac16291f27b4f8628814543cd9bee82abe2b891db060e5851dbcc047ce1186bc488209a038a20430beb8e28b2ca492f0880c544d64b1f2f1a48712849a44c103297664f0238599a4a3e20b2b7cc17a0ce33444c141e6048e5fac8658dc45a9f43457162a80f1ad89a51e2ec7300cc34aec44321734304ea2f880d2c587a52f58a8e6f051a8e2f051a8d6f82854fa285463be67a1ea7d14aace4295c647df328e85ea0d1f7dd33816aa36702c54619e85eacb47df3a8e85ea8c8fbe893816aa323816aa2416aa2e3156e887946ecb47df583816aaa38fbe8d3816aa2c1f7d6be158a8ae7cf42d06c74255e5a36f2e1c0bd5fad13712c74235e5a36f323816aaa28fbecde058a8761f7d7be158a8721f7d83e158a86eda47df6ee058a8661f7da3c1b150758e852ac6b150bdb818aec4d5e070e072c80114b59fa6d3971e794829a504bf3f7afdd8da8a995a995dad4c15b61e438dceccbbbb3a667c6401571be583fafa36ea72f2597b39e050a3f499b76daa9d03d68606d198df26d7def7de6f18d79eff46b9f668fc966d1ad79e0d0ff31bc7b5f7f25bc7b537e33711d79e8cdf52b8f648bf55ae3d97df54b8f6627ccb631e0a3a904a6d7b4b77433f7aa3df465c7b2cbfb570edadfc16836b4fe53717aebdfa1b896b2fe537195c7ba2df6670ed75bfbd70ed71bfc170ed6dbfd9c0b5a7fd7603d75ef61b0dae3dfa9b73ed61bf79dbc7b5377f8be1da93bf95b8f6fab71a5c7bfc1bc8b517753081a2fe6c306f6d042027c8944fa65f1649be6840042804f0f702329452ca15412fa05d7aec1937a879657777cb3e818c1d657797769453a6b6c8b28799191f6868b8bbc4a78e717e3f9953d441b24819eb4bcedddddddded2892e9ca98ad26ba70eacb2e17bb957ba899e8242daf895dd8ee2e17b1599d84856b2ee675ad6c9a0ab77172a77639d6b70ba2aed2a18be797477475a14be18676779b1b52596119b5ace4624ee91282d6b57ac27a8ca166a293b49c43cd442769b959c10b357a4bd1cb8dc40069ce90c12f33220c13addf242f0b13634594bd85064849f8e3c7af5b2b13c460d0f3e5f33d5747f1a18c6ef9e5554a571f62a9568ccf8218d40296f24216b7ee55130963d6ac3c8d2c168bd5a4ac258ba8641b9965dda944f85a4da06b67426154e6e35af5ceb5ea9d6bd53bd7aa77ae55ef5cabdec952d76a275bcd27b028e5a4945276a54a22f5ae216ce2c9e179f6ce691d465d3d171149248736c9617515b85e19a94da47b7ac5205fa9ee893312cdb8ab2c4967adce54192bc3611417246b5dacac75b1b2d6c5ca5a17eb62713b7595a9b85613230679b7bbbbb732c8f287c13a9b5c394e1835e710141f7308888fdf0b07c8efa573e174ce04da59d587bd43fa09c4851d59856d4be1b56a2335049fc18b8378788851978f5e81bd02c15e816094df95ead5f49c74adfa894c05b3b51397aa531fb6ea52cd1f06bde80c2683c166606060604a254a49b5ca9e69b26d69db488569201fc2744451df1f1f36cf75844dcca4723c832e9ead99438cca962c61c2c4891328170bfb32d5d57315b988307bf3f06908a3ae23176b74b1fe49cd2e9e58e81d989f56311346311436b1f39093f601c5c9873ef4cb507c0c7de80d845bf163202fb84a7bd43b3b1b0c0c6f31c6ddb871c187f9e95ae625d0069fbad26d7a37dcc8cf3c219b536fdbbccb1bc223620241ccf8f931400c1b79868479cceb8186c1eb9b591fd40f6ce21cfdf900e393e34a297ad13c70b7f09fd9c371a6c2704ca861e91905432243952d988161358c13e685c5c05a4c50a387a52630a1482fa1465782143d512401092398ef274da4463f428d6e841a7d8bd0ab1a9d084368286af4dd1a18919c91411b85a5cfe9cb635206370a1f815b2e26e487db6c4d37a34236ef27d7cc5f1f0c4988e6fd8444c326b963e6e557629072d760cb89aa36addf58ba433787bbbb4b22d51ad2f5f8b97fd3781e36e40260ea7099b030a8401a861cb41ceb6b45163834508dadb4cb55d20ef598ee2ac1603d49ce53c17629a5f390eda5f8a878e5fa0a341a09bd8165c586114b97637d61462fbb2ddc0c2e64bc24915c7667c888f132a3a5fb25dcdd5d18ae85aa0d0e589bd9d3a630b0d8c0d1b841c569e4548f2b236bcae7715255bf1fbfde57d42e86e3e2f28b72a50fbbbbbbc62e0e59d3ee28e1eeee86926e268ef22974e9ebedd179481a5766bf0b001f60692c2068ac5fd761e77d02806b2b6af4dedddd5d999652dae01a498dd5a78785eafc48851a5d7e4441951f9d856aff15aa50e5ef33d4e82c54e3b350ddab9b0b2eec90ee20c3377688339c085abfde5e3857dfde61a8d133e2469763bda3d4e821ddaf23dd19910f3850658dd2761ab5e970e387872b563f46ae10a9562c912ada6c518b6bc3a2c2b8a5e876f86e071448b2ba1d0a14afa083096cc5ce72c880966a2153769e2990646540120cb28513996a3e3538fc8e7ca6aa51a45dd2ce0c0f0d4bf36994103e9acf0bc120bbb6445bc2a750fb82f685f5f1914142b4899dd25a4924779f1762653a0dd50435968abaad0fb70835ec0fa79688b9b8bbcb91f9d4be5f977bc178894f547b92d1a164a9582a954aa58a3eada8e4a7098bc562b1582a954a25552d553468b8e77d5f4c4ca986ac51a339d65029629b6c504c492020205654812029e6c49dc8137b582c164bb23ec98af9624aa51a3570c021075082607304eb0ca5a92c928f03751120e84e22d54a9b5420d20679ea0725b904c224d02581a6049212a8255029b2e310048721cf9e034f0e5cf4909060a703e4a2174e22cf6eea74c49fabd541eaa04373d4a1bfb9c3207bcac7f4a0f24e9b429094d13c2fcb57c9e4be906a5f582bfd4212f685a4eb0b7dce9d972df067ab460b0ea2deee1e0d38705d0e2dbf9e5d290c08692e0660431b256bb4b9c00c163e1f92bce8f9909260bcf4c200eafb4370ca26f3da28cd59f37e509b26686ca8ffa0365996695e075e1cb0369933b12c9b10500f41e60178994af9fe10f1653f06647cb174127130c7786a89047f12fc42a86fdb4d6a4885943c7bb1f3cc5ef03cb37777f96e8d10ea613b7679e1122f2fc7bebdae8b4712fcf2a3ce42fd07a62b6db0ed9ea46cc6c11eeeeef340227e12cc1e6ef492e0752977d79b775dc654ead7b79d8062fa6edcd61c14984f0f891bf918e6c505e708a6e4a687c41031357dbbdae34df6bd3693dbbcb8a6cb27f75d2a7f7160bbb8e9bd34a073ce89e83ece89d83cc606f5880dca7c9b7c0f9b1e362cfd08ea9be76373cef3c1f9b6498b09528fd8a05f9b5d1e38ba0ca2c7f7da6c25f876e9cd6e47009efab6713b51f6fdc05ba4d77575739b0705f524e8474a63cc784eb16da3a090505c2e3d242ebf99cf3f444c7d714d190888f801c51134cf23897eeae0f7b0c97ccb3c1f993701c511349f44f37071103d9ee34f1b9628a29f12fc584ca5302931df2627a1c064e744b1ed17715b637db14d450dfd4b1f69d0d89afd6b77e6e03cd0b3c1602c31a992c1b0b44f6a585f1496e03f1b0cc612f80196c60282263d04adb09fb0465cab2abd243f24e64bf7a4112ffdedea35d673bca4c8424a29a5642eca949185ea35478c458d2e3fab2bb34ea5e496524ae9de25e5dc95723462a1e96e2eb6cea2465f29a5949469a49cf9ed2ce4ce3933b9bbabfd0752b050b5b4b4b4b4b46c38039adc23c9a82a4b6c8f4569ceda17579a90cdc3a803cec34883cec3f8821779189d107db4fb2af791b64ffbc0f813572b9386b89a1ebafc52ac6571c8a7de058af83122761968d24fbd2118408412ea01f1c322804121a40f3434cddf124ad06f1fc19efa4b8241eec0027d77534d847d135ba12d990c95ccdb1ab98dd2c087a2c55ea79466c6e4c9c8a48c19c5aec999c2198d669a47aa14bba6cc483e32a4f9f59910f47e65a86432aedac44e2b098bab1ce617e6b06a5408d6c46e821e15b0fa099f5883b843c5b36bdf1269a831665bb371b4e5535a28c718dadda5d8eeeed2ee6edaa6eeee4cc3a8d028f6b451b44debcd5a8cd124e512725bc64d5ba913851a1d0ab4bbbba75c19391ab18c9a0b29d4eeee26390d29d4e8dddd9b7d7b7c1a86c8ddc939b99748806013fb916dc3bcece9637ffd7cc92fbd2ec32ed15637ecc3e4a6b587dc671f10479e1d88ecb7519987154a8d745de35ad34aa349b93a3262b46d7fd551c6711d1239da27095c6c527a79fd971008e872c80f08306a777d17eda4dceef9d4b5382322986198413f412d36f204154427b0a640f92483e412234a295b462c2b2a3545d4719b9651ec9ab239ca20cd10b187cdb1477397b3513ecd9841addfb614caa719ed724d6cae49762f3d7aa0bba134d3364e244aa92a2c1ce6ad0dcba8c5c585240346c6cb0c517f7265a44b8f2398b2996387a1574a29e5ce39e737e79cb347caf639594a97334a295bb06d294c59918290b32f6629e3bc3c6e6b2fbe8c3de48fbfe1b3d61776e26272ce39e5ce9de7b93383304a1ba2f1683c292b236c0dc4ccccab5f5fc7d6aff5b92e3b5c206ea04cf472c3035b42e4963bfd92524a29a39452ca29a592dfcc08299e6c4a518592eb87c6d27a34cd0a3d8dd25a6df2e193f6c3a015f6a48d61c19ec7b02e07037c6c3a3ccd9ba0369b6bad46694db41f3e6941da18f6a4ada1e54527d6c4ae79f105cb03bbd6a451336d0ae2534c31b8863d45142cc8ce335a93881367f0ec51c502609f69d4b6e9e0d9e30b626adbb68d531d538dda4cdd0d8d293ed15d506ede0f6ab3797cc1a29cd82e6c5e5a3633a578fee1d9f02452635e055e7aa71461664b71ca6a4b3dfb558259535a14915bce0ba399b6719d28a5aaacb08c5a62b89064cc7881f9d949c915cccb0c1924971837d080d999ad9f182d239695d97a76151afec2ac9d56a9d414d1ceb377eecd88aa0b88591db769de2723aa3016909661ac67a75f0c297e7187aa624a2e4f7f3e5bfd3c3bd605d1f2d94a0da5181fd383ba2ba3861a2d9fb5a860c695abadb1e197db676a6ba477118af0fdb1af5cc9d5d6dc20a59ca9316c4cb43a49658f1da53227816d79f9b471d43c862a3d7a7b37393adf0590b0c7bc5932fc35bf979b18c65f5f787d37393a37393a5de86cecae8b4fd77793a3c3e0fe4d0eceabf82607e76f72825cd74dce0e83fb37393c0cee4bee2627880ea3eadfe4e4f029fec79b1c1c3ef5f87dee76556e72540cee87f52627e7260787c1c56ab06d0fb5bee4624872b184b989612496e4383eedfc480cf6e05a4965df48229d26835a54527d6ee79715c549142fbc2a68f5cbe2c24994275c5098527afd83caeeee9d73ced943b2532bb3b3a79c73b29472a5d4e1f23d6bc0c51f5b938451a425ce047432d334fd51cacd4e9ebdb750f9af18e374c2a86ba74d4df8349d67d5c3ba7cb8a5f37c2969f94b49a3321e36b1673c4a3ee349ed346a1b6213bb0f1e202b9c1e9de720970f37e46af1b7057dc1f3d38bf1cba1305fe7169f5cae256c52922979f62c1bc2a8d6e91cca2d3e919a23b7fa8da149aee84e63d69a229b52ac299f165c6feea246a79768ba94b28bdde75377f710cfafd68aae832dd4902606e6030501a05ba874ccf735452e15cd0000004040009315002028100c8904a3d158220cc30f14000c7fa04a5e4a9e4b234912c3288861180621428c310410800c02244684510ab0cd449cb75694f6a3953a2f124248d26c8237e140c5de51d2da45942e72876ba1c4ff1797c08983e19f58233c216934e42122a86c5b0281f67179c86404d848a4a362c05091c92ee172a320ed6330bc5d12095d5cd73480119eadb0ebf9af6b70409f188c9af4f9651ffcaed07b315df5c5f881bc8da12142532b3807239bcc3e485fabda2d5a1efe4d45487d5b79ff2745594fca67b971757ac87dfa60f9c90bf7772feedfd8a8f9a708161075af3dad05357ebbea6ba51136946d891c382d0884d022cfa15a181d3de8290217508c054642bf86b9ab32f91c1dbc6e0913a3a792d2a17fca72f9ceb76b5f3c94e9f11882a974acf22c1c3a07f0bfd96e6e946946f188438ddf269ecb0c212037bf4675e207d192a7ed30640f2738130a5a6a53a1bb0cc40bd735ed65f8e1c66c43423e31d2e187fc45de3b22b07718c726920032d3e2342a598eba4f0b637dfaaa229d758cb24ebd040b19519f0bad2d001feea2b42697c60458e71f85c6cde143f0d6134c7f327ad5686a431c4efc260e071200e9b5866c32ea382dcb06face99cee8063cd836ef2657378814bae2dba9f747407f6f543cefc5b6e159304ecc1884990f828c385f8457a0b245e5c47b351c06424ea8aa1d794e0d1baccf22745826b18cd4ff1e03e6b1925613169ecbbcfca268ce5b28506ba4e794cae7b68ee0535ecdc8d7474fb163cc3b4ac03a4e15af0abc44ccd7da883adba166f70c964f888e1810da1c724c4231aac04a7fabe300cf0416de9c6cb79928ce5ae4aec45e6ec4000ae20b23c84858e03ca99cef461976fcf40b8ab30b7c4850d248b7b9e2ba27b62181a8c7fa8a5e5d7c30c19282bdc8dfa9ceb51991f7335154a5e6618b6811f9162ddfa46b8f8a4e159d0f7e29eb6f5249f25256fdc0eb139f756b1b059de5adb5239dae4a97d3efbbfb6420c1f367e35498d701cd1558b9c359a5f482e7933462705d043caa7284ce87a43c7b72f1391d24ae0dc17925bf1695a5cdde6f8b88a73604b122c728104ac3f29e0ff60b063541707342af45fec882900cae7b27d970d6a540a6f37536409203bf79370c77420bccf841ac4456ff8d69e2d65f4b5849e25a7c12db56efd90cf8525ec4ff3d5ba23ff2b651e647e472146d7c83e6745c85f6709b5a25b8ec3377f5b6ab55c301a5332b8f2c62c82e419e2843bd1695405ee77aa84b58ada4ffd709f4c51d7780d05c3e3053d847be3b8fa90bdafa54b0b4186c97cf60dae04e97b0ae89a60bc2c92f43f17806203931721ed4137547fd3a3726424fe26ac642092f6924561426a09b117096ba594c5be3d8981d05acfbf336cca1156874ee53879ec966fdf42bd874bad56be690f9afdced68ec88d91f110d209822d7e2545dc1158c962e2d9bb575beef846e1b4e12a9c3a03b20433287fbb7e522836a729c08e7fdd82da2451855b1aeae6bdd01059156d78d468b9cb4f949a0d8284ee4305a3080ccc25a5b488def7a6e9b5278ee7694664e710c48c7e5cb8479edc2e1f85d14f64fa4519c9c5cd6338d033d6ea82f13139741e447ef622101a4091fedfd08289318d482dd98436c2caf11c9fcd06f7221d974d47c574dd5849caa6722b90eb68a42b41f9f4a836de099b52bc408bc68d3764fab0eaaf40b18b615ca52d04a65be23af18920f71c8382d1740f4c19b16c4e53b6917e9ad7f1839ffacd8198b63bbd69370940100f9244f1d9603d3195118efd761d05a49b525e124220abe5ec106d10d9d47fac700ad3e6d3cf793f73ff81aa67a2ad31de42224489ae5e1bffb84aeb19133028035261943cd0a07049a9453aa91369d6534d3615771de6975086c42fad1028ab8bec74c01469108f7fcb1433f49302ec7aaa94f20b2d93df4035aaf5f7d1f58a70bba97b438025a659e99e288a8b1b1754bcfe51b8472ed025d255c11fa36ae464da687e0576549fb324ec2b6b888077ed7d0dc3e2ff1976deb8862a25321087031b6b13ec8099daae50a6138803e5ff6daf62636c65e54b96ab4e52f758dea57ad0920d4a076f1e07079f881f0ba118ca97408cc9710335f6401b420bb41a6e1ed86925144f260b239b01acb18a683d58c8ee497963e6838e8800cd9f5f856b98d5b7b58272868bfdeea1c82b4a0c492988067af1e598825f2ce43fa6e70a6ffc8aee102668e4ba18a0e182e08d7c24c38283c3063598a194fdb1c60eac8c08d7046a85071ee380c03b7f7e391ab8486c2fe111963010bd7f5818b3c16801a09ed8339138a09ad5bdea6fa64ceb0523ab621b429b4c97016a4e875a773140b08784928b53282f51ca03d3e2dc9bb3e638494fa72cc3cf653ec043fca793939fb0ca52d90aa9a54e794b7a9bf1dc200e943a4d50f0a275333faf996175ab2b370097e41b9f9f6cb3c7d73eb91bd861ecd81e5a3ba1f205ee1597f40444025b26e176a51c23957abf656ab932205551630ba565c16d4797b0578e5a18e2704e06f016feb605d2111d4ce977bddbd038db2f388196e704b8a9ed6bda4d7db5ff70a0f412811624f23bb5688ea9110620c164cf15762e0802b8ea0d7598676cd27abbf9abe3c472bb4c798af4785c208b9c23e106334bd35dae56df41c78556864cacdbfcf807eb48dc590fc7a74dd3a51bdc1b19fe4ad619a0fdc1fa799a6c33ecf2fbc4a0fc2ff9c8d22ddf6474eadaf3110dce7b07c87514cd51c71089458c576b2dd841871f5705f54ec1e8c04e5435706a202b3d1f102979dc7fdfcb0c7973385598d0f0c187efaa214fa98c2269ee6934141cb8c0b38b13cd45cb3edcadc41dec95cc6d5e083363a976feb578aa1906a4b3bed5c6c5c9ee79f268252481a279b75d6c3997940a12f6a8083b0d3156e913ff8c273e39e69333ba37d0e17a848811503254b5b8b1bca3ca8b90852895b91758ce0f6887419419cf430544c6ecc1c80d686a8c439fd282f8e05a698c0b8d81421d5c462a54bc64f3e2091456ea019f627e7fc34e5ca2b2a16cde5e009fddd15f51d09b74dea706105294899f73730e0a84f194569c5bf5fb759c122ff6eaba5a18992fece9e9d15c3d714ef6863b5fc6a28608bcdbbbb1f4267c7e9f02e30e178a9fdfb245279389d565180050f590f89298472cc98265b453f4f8884d48ffd8cbb6913a47b0c13cf8f1593a1c1801fb0c6287487070d0633e0b8b2bd8dcd2870bb6f3c3ee1f25a987717240ebd8865c514b0d79242076355bedc436c33fd80b2e7b499c34b11471215351f83d7fbf89a5d302cae111b3a5885e95150f0b0af66083edfca4869c79f07ca7d2d524b82ce12eb6ee25b70192c476fe84e9d9b89888618e15f3afc35e1733637927d0b77c5b3f38b86fcc72b2ef93e332cd034047bb7d424232eb8629a8d875751bdf72aebd6ed19535ac0faa849d031afd1497518ac6fa8ba506071d4962bd6b1d9753a6228ef673856263f4b920a8a4ccd04be4fe6cd61679fcd6224d60ee728d9f7d9098d09f7ccec84dba00e466ba3be6743f99127edc01331eec4cea0bd740d65c316e4e9cc04c519ae2e9e8060ee58ae997e3dc138a822815e71ad259a9ff3f298c1f6607c685a12154d7c520605851cd904ca815e6817da47faab3c8deac607fbd83e9acf9f5435c6bed82b8f0cea8ab873b3517dd0b88b213fa97e1ec09002d8bef3ae761a4eaf80b7262041857c1d1e0ba7ea10e9e4e5fb271731ad72ccd977a89ff91aea413882c49c6d83a38b16058d8c532748b687edaf6ae76ca9e784e9b22ed33e4724b8a33904b51e52eae86cc93abb9bdb05372f50f304cfb10106b512b2334dfd9e10fb490d135d061f63aea8af2b06e4ac3100ade10944d80e6eed2057f86fcaaff910f8afe1c4065ef80e86d89bfcd1dd75d76bd5e97e09fab2e68a3da7978ba72f2d3a928d6fbaf2b378f986e19d1b4e3d216e0ee3c935a73b5f202062d55918e5214a1521af1bcf8bb7d4732d95992200dd0e46afa1c48f22aabf09eda2ca687205028cf7c9b3e69a32383bdf85b5b4f793a82bc3cad80e1011f92dbd93a9c5864dde692572a6ba0ebc895c4d4becb4572b225d28ebda37542eb44cba57d3af5742f39d617e76cc2042ad70fb36bb8a57d1d911237d6276e386d026c33d791ab81ca13010c1059936c372880c54f7572491b41f621c53207efacc7447f2ea72f25c24cb519429e9dcb1e034b83c6b60381341997ceacdb827ead72ec1c184a6237b501cb870b2f63c46ca1a5499721aeec4d695c26bba1142829b822d60149e66b414f4014534583513aaec2e545819e9bd17cddc1888aca8498064a8496dacad0a5d4f6a236d55683d491bb58542e989daa0ad0a4d4f6a035d4dbe092718746c2b47db1b997c8741aa37459bab73b7126adf83ac837e4651df748aaa926dcbfc4311f467d3090f186b626e28d64433826d37a6476d00fc867e5973ebce6be6955cb233358c7f0e0449d3b433ea1156565aab0fd16dfb60b7d75b903569a05e21166fb99a10d5d46104a6aa495a62f33f6ffb32f9ef47999948064f38a636ef70f550e0fa7bb41de18936ade994b43f866150c8679056650c461d1511c1f5698d7623d457a0e54a20b56d0333cda9b14b0134e60c901f5f8c4bb40d8d75d57f2a285d4d20cb0f99df3a93523cec1fb3617a7b9399ae3bbb1d7a66f7fbd862240c3b119e7ba101f39df1c528da17642aec818f176952d2cc4cedd3b5c0af925786fac77673bd7d06f81a27cf7ce09dd11643d3a4f02e3ada82d5b0aa49a5ec2c1fbbb29edeff9833086fed70ee102c667326987ea78fc39c18c093bb2b280dfa14131a3b4bdf4ded712e5836f474d123286007cc6a4260df6a7fdc3337a33467b5430ec1a305df5588013c28ca754992cca29e0e8077626d4effb3bc05011d1ce5ceafa9f998f9baa3f28cdb8ddf8d75a41569fec3981be5a1f7156de67e0c02178e66e6b3b568a66571d90ee0998ba98f309a937354331de7105976c94b4683a034fe3a13fd56f2ce396e8c01ff393416cc00bb7c5499a9ecf9f29ce6ee1aac07cd48f61d07afb41d1dd88a51cdebe3d96cf0c5a0713f786c4ddb681a9637c395240334e221c86a00176f76b5373881d0a45f3d2ad9cc7c3ce6a9ed4f49fc26b8918b1cfe2f1bef2ce55aa9b7036152d2fbe5604a6656ba734c3cbab3db66a15fedeb30c1971110d6d0b6eed00841149dd41be1c6dbad57ee074bbef0215f2483d8e8c498f499ba1311246c9c86a559628f74e93d8485ae0a43163275f99dfd6ce441ef77bc0a5e0a51fe690792e4e78cd968c2ff65ae368557c5a91c15b076580f60a6966cab4b9a8a5a5634cf9d5ecc4b8f7c92c1466489d5b6d3654b22d297ef4bdaf9227ce87bd831fb784a8ad3bb64eaf0fd4d6ae7b9bd1bfe9604f8e7e8cfc70c5e565c21d0a681dfcb6bd28c638f8e0c783d73debfcfebf3b1d12b083c7bfb7036b41f550081b5fb743f4017a49e35790aeeefb2c1e66593dc60ed931b29d5165f4bf33ab3521d95fad1d71e0dba046de8abf0e82942d496e828f79c8b79746df5d08b8db56b4dcadd21d608d6736ccf99c4da7f3a4262a3d8945b7b7ee53e32d30729b2034699fba48f14bc1ee51f4b8e7599cec484fafad637ce7b37f534ff004f08b0d5f861ade0dc9dba2813c9651d749a64c9708c4149cae7c01589cbc7eb78bc479b96a5d511c4499a6bb4caa43fa078327539bfb777a4940e58da845d3d358cb7fa996be534fcdd17afca53f8b75f5c2ba7e1efba1bf55b3afc99620f7f83f544566cd35f90a8754732f2aafb0ff4568e4871e5abfb39aed87ca04e78347c8814947196dae9457e4dafbf9860a26ffc40fbfcde826b4e3e8d691d14c51076f8397716bc1cc7d2426a02cb37de136c5c33eb88beaf6f4ed6b6bf6a6dbe76f9aa7ca21777927d1c7e04d3c439b162efc9715a99508ef57b30da7de07b0e85f5e72ed458075d481310dc8a02c70621ae4eafc2e4bf21966d593df0cea0ebe25f702eeb29c1e17477a0ef0db09f9c206f51b988f000d3fde3252b14c4bf434f1d7a3f95d02db93b472fd04408d8a006ae8c1f4c4aa874eeda7a90fd6a1b31fd41cc6d0b2c1c18e9670a6ec414ea469997d58901de37391ba2baffa0a8ab9a29342ddbc7543ca9cdb6df9c01015cf81c40a61c84bedf72cc21f91ad0a17f03350cbca8af934ca1c12ec68fbc7ccd806148ef6d4407c93289430e4321e04102b0f095e11b9b9e14b835628a1d2058000f2fcdc2f697203fb7269a267ccb2d501877e7ceb3f6b269b04341db31b165a726a51b4d10f81ddb492fef94ba146d01a89c4a45e8fc9d617228400a6892f2d1fc38c008f25712eb381b7b112b9ad30a9418cd64d346ba74394dcff9916303ba118ee95aab51d16d374be82874e66ae11ec56b8a8190bab825ab4edd3ebd5a448de3f68ef7451e70cefd37583f873c98258e7559e26044ee948927b307b9260390831c99ba06d4b1f056f7942e7a70d1672ee2a24784f232578c78984d2c9f1ac82273c0ef3a9cf750d2422ada7dff69ef39cbfb3dbf2c7ca0cde714e25a2a4d2c7b5095591829c2f68a9df4545a51988f1b951782a9256130d21e88cf5627ec67de7ff4304d8ff10a0ed9243439b96e8c56ba4521b335d55d10c7df7e0e4e1dc8304a4ab50869b31008b0b1a80b1e88cc4c0683b7b211045b2b34a94980a7083ea98fedf8465700e1aee06ab57384771f1dd68b32d5d04a59166eb0a5bca94147d8a905bd040901955f39d4bf204ed0b5bb7b13be7a1c04b82040592f310ab10c1bf725338c12283f7021afee58291986f0c95e0af7f5e5288c79e2429144db4ffdc30edd14159159992e9bc63591f146a1589941ca95a7f276601360f0dce435a50685d5ece0f3806746766988a4294407a931c5854594cf15baec264a015ffb86003aaa1b5ceeb845d5c96df3bb2d9123aed48d3bdf22dc75da97bb0e3fff65e06341359022ad0653048e93bd49765f70e24ac29a736d4fbd63699abdb81a0a359be35305cc9b0b1987ecdb13d00562626345144d0755158fafeb6fe51173ba764584fc7aab95a05570b3050c7006b69d97b2399a42b057329648d3c8a6f4fd7a832c26e471660bd8b0c7bed3831850ab130ac0a2cefdd66080158297e435c76fa1eca94c1c0ba4f5c602c0ebcf9d822467faed0d69b064311743caec87425f9948cac5eed0b5b7aa06a6b829e518c66cc3e3d1e1bbeb923142e5d9a50804d29b786ec9a88a5785ea31ae6a5c9bee5a22c417e015fdf38cb05c6c19565c8d745a345e3d61e263e125794cd89c37a0c267b2595ce9e479a7938d9b1d6dd853bea448821a3ed930806c68c9370a888cffda833d1eb2005fe9cab29488fa60f49b0934f08c85f51a9577cb200f52143987bcf2433aaa5ecbdbd68aaeb3786adc5a0e04bfecd8ee6c8104fcaa377b2a3b07a62e5133f73f54316bcbc9671912c1e0f41dd267dbfde50fe3adc4e1de0bdf611ade0c407dbcba1b7824662a88aca018d6e8b2cb42d008b5916c11785bf5932d739582dc707d4e9f825aced1e35c27e483fa32424f4a3e2c12e924e464c00e384342cdb82bf9dea4e0369496a8b54f900170406c6283d646461e1638324e6f9b6c53e8df5f4e8a2899aade3541af39797f07f787c992e69e465e378651b9a4e63212237205e1b12cddfaa10c09198d5334d5cbf6eee2ff333ecdf7700067703c1f79849671613acc584723a2be0454a92b451dc9488dede27387abc745960507626b665cf2f0b4aa5b1c73050db3ac52153f4777dac746b72d095492bbe49eb318ca0e78b997bf123415795466ac33eb90948a5fa3bf3333cc518056b6dccd8d7ce9c4873ff33b571fc60a2ff5459120b9f25b552b9b8677ec0d10897ece4205fb02a2b2a39eb1c4413192a3c07e97176319a14f1cc505a31e88fefd8683914381d987f214d4b08a976fd6c30186d55e3c136211c8a79ef582711277dbae45145e88e0ee28676c183640322ce834e47633f730b9b090afb53197bde057f84508d1913ba742908a0144b9bf1e8b7d721f3cbd9b8f4afea4c9e0c1fc3b8bdddd8ab38dab2c305d18afab2d29f68210382744dd553c67193b58fb3d096397f2d7f7a2223362f0dcebdba9ad876613e5d4374c8602d1b45ab8d27522de3b8a4c7f0fbc0419ec9a1b7b9c1221d222e8fa19a637e0b56b3773c0c50df422acabc2125af18792da2e757ce2220fb92a1416b9c5962f8edff4f3f6f9d8edd4934523071754f06d45ef20df23c90a698a3e557e0488b9c6c887901ba291e7e20ee1c985e592a3ab6c8bf3001f6e9160a5da89bda523d64ee08fd5e8142beff249495bebdfc978adca1988d03632b03967f3a9bef130a1fc1426d89a7ee46a42101c3a1a0da3f6ee8a337dae28587fa0c316667f0c1ef7bdad7df72624bff41918e14d66084115fbe77f1d88d9e82c719790d0e06648ebbc985bd924190f616731cc79216ccd456a5b879b8f78f949810998ff8466d6025cf88b7e47a0de55f7ae2886387774da510bdcbc2677c1cff5372da86ec748f0907de3c6c0e5468f4c0ba978404ef99ad60b52729a0a469331bd206ce59be3ad56578f6afef03cc53e41a13c29f1badd8d0a7b06544a40b2beba80c28a843e3edca635ece5368e4a77cbb0f2a6d3613d38a9697f79f429b9574bb0a9c9edb78e6aa910ab8c0270d9c2752aa8531273199401579e8007a07ae6ea68d3ecac19b01f744004998444932e867a727b9f6343a719eab47108457517f52e469578026cd1619c099bfa524587ce27ddcef8f2d580cc39ec1888f3adca8702cb2f1cc13bb7f0c5a140fea20738a4f6aec766cdf1697c87556ee374137cbbcd3423a43f0b5b64e3d9d770f7c16bc2b143cb61b9cd960e3b50cba46d138df1b2739edb894dfbf02b00ee6cf4f259e2a100cec68e60be5c5676e2e3656799a3e9fb9b7255a5790095264b74b0dba79bb78b58db2225c6ef7275ec20f37e751e57d88a16c8bf0066ef7476619917c3af7e70a65d9ef3e1b6f16b73a4e8105cd64b05cabdba601828dd37e095727e1ae1a267a923113d91b6d2e856129a0251d4fa4c965d59153351b123a867d5e74b03a42a28d7719c51b95b82ac427ea0c8f6d7411c834514d61d090f0d5ab38ddf056e2c5c21c46eee2cec0063fb1f9777c52802a5f370121d43893313a98057e7232a94c9f7902359807e2e3bb89eeb69e4afa3cfd46782ebb177156ada09721d8b80455540ea042ab1c817062fa86f106b146e33166351cc80668d547973c6d6c6c490afb434234f276015a4005da1fe2673dab7602f62d0b941acaf17500048215481144d17b0dc7c0958d3abb8796d03a26ef6ef9d9bc44b18533945005cd2804fb302bb34d53a2b232c65a9fbcb804f6b56a2c1cecdb8645161d76ec0553312cb9b6c54fb1858e4592d0f7b7e19398a26c743ffd554c1e95e805b04c4f705b3006d4d8f67104d022a2099852d4b7cd86d95848337f3a5c47795bd84972cfadda18c9b1b9b31462e6b4b647dd051a11175d4d7373e7954f11f9cfd1e969ef853c1a35fc60b760a66b2fc06c6f3187c88afe7f06558b27e082c501dc64b90c960fde91962f7f9f03e9678a2beaefed8c52ca31faef930b446062c93245581fa91cbc34a6213b7a2441b3f54d41ddefec2e4865a09f13a7eb33a0706244b283ffb9cc2e5fdfa9ac4838284b345d36685402d2a39b4e88758772756d64ea605977adc7789f50297cfcc28e184ccb03ce2dda0250ae32934b954d98cc6ef4409405c4951e44cebbf3e7fb8ad64232f85a465a265a5853587e33ed9a0cfea2d3178a3c8ef64aa3779765d8561d3419cc1fd8552dff46107ee0aeeb2ea3f45daf9cc6715019ab5654a5f69317745619ec8e11433a78aa47a9b52c6594c2d8c96bcd69af9509e9d5df5bcb2a968684b227fc037f25bcbd273c40943eefa46c3c70dc4027823e007a83b78673387bfc325a1d0530b4ad46794844aa02d219b6beb2a717803a124bab86711435496526f78de023b46e261ff835559cdaef38ad9a0f1d10c25104ae5e1ad4ed3997c56f1faa81a8d82c3f44c5b92f23413371fdaf969a5fda789e0bd8fb82e25513ccd81a5c1cf47e2937a9fc00bbde63102aea8b059024535f28344fe121233787abd40be8cda78c5f74a2dc4966f075c5471229fd1f32658d8442baea915f122a9a52f0e6dfbdc270d722027c54737760165b470f1cbf56508fa58995b3616a33db67988c0394b9f6f2b6a1ac9a6c2b027b352aad7b207118ddacf8d4d6de9704e263705be246e777510cfba7d65c868bc4acb322e79160c68b94b48a9f45a55c68536ef8ae52d54ee38c32d43c9bc1b547f4759b3d128924e57f17ea04cca15d93f541a872d2fba2710423a7b344c940ef7b92a6c1615218ab4e60f0d57505b93c271a65b8321e48996f130bbcaa57d579afcf18a0520afba48c54cc25c646671203133f18b42a6b4458e57e4e70204548199cbc755cdb17b293db6cda503612be8d14de2bcf41a9289c4118e41f1e8b535b0fdac95993bad7c980b50f3388105bbd7362ee6b31007dee0d52863b534ffb4f39d3e9c76a6a0c04bfa0de38d49f98d37579767302c8c6b96d4e70d275ea0162b02ed87e045f114994f1a53b14cceb8a31e8fe2d7f80797c2e3cdffb9c953f37d8597c5f1f614f38938214317c0d25c842ea7280868f3d72a5b0f39693d59552e589828dc0dce153b83b3f7d3544ef6bacfcd5bc52be639227612106383090b133f0b113ea0d346a8afc1727f9f7ec720b587086cfc34867daed2004201ad2ac79ba701997fa31accf8de82acc0b082d1008682160362829d4980715dff1e844790e5c786b2cd34c41004eb872d7aea8e9f297966e8899c312096c78db03a57500dd9220b31c228c4a272f1c927b4e6645cdc8c54ceff2805fdf2e2d7f86796945bb4138de76a222644a8951d85a760cbd84224ebf6324e0d52cd08219affb5609abc5f949f5161b4b7b1e2c5fa1d2da6a21f95565aab569b94207264d91be6c5a1c3f3efca27ba1de1ca1a1cf9cf0861f586118b405e1d8065042d253c9b225c45d6a91d564cd899bae531ccabe2006a28bbd6e7b3cd1fdc59bc8f0e44af690aa0d89d0a10fcce58e109e07a6e19415ce30160f230221de83c629ef169e629181659ae32ad36e23116ac08244ac4d67022e647538a85670c13a72f5291247306c1580a539e23094210fb82b0548c5cec2fb091e12fed0e52478a98af21ff7392202b7d90fe4c681fabecee80d8c54ecd3c6a4946515ddf8dc96426f7c3b5ff64f3463c0fd12d5de1c16d2a657c15a34de6a50cc9de01d35142b68625a4683e32c32919e588562c2f6fdb12cc50f28c3fddc7cc654cf00b8d0bd78c986acc40e9688785226717dabd8074b64234a36487e01526fc98d51c1d1b7be8e108f10645d94059c4e5f4b439ce977a3b603225ae5265055ea0c7b3930cb76f66443154ede3664f6a1446467f117f2181c411a57ffe0d76436f80f208581c8552def0cdd8eaa80f8f1766013012796170bd76278286a42bec6436038190b508c7421a744da1f96aa2f14cc0cf82b0e6d1220d5fdd598815d3fa0342a2054d18e9dc3c5c8f05f6c9b3bdf513c8fd16c93cba568b42706fae577ecd280b4d42bc4c3eafff8cebebe5a037db82101457b4cbd02e1604e102389d32319562465141e78da094b8f248d7e3e704cec13030a12f44260dc810f83ae91c5b5f6fd204d2cfb374425d818459f2a5a8f9c0f1b7e03d97292c982e86d0159635202a870aa77d067ba60727845eed6247848400cb0c3a24603627bb4fd113282800b69cec081af5f4e16488177d67a8176976c4010c7bca7a29a98abe39336e616f6689ee2d14b730c9c21b8cce36bc165e5b6b12719864c2716c096a01469eb2f915ec1b1b35893a8dd99a0178692028454be189d767c3dd44327f6a2bfb070b4a1ef793ab56e669982d9ba0345ec970d9fd8fc57bfd2b2d3365ae93188e4ad4cdeb0ef333160c5cc7cb92cfa70496220dad02b81ed06b073579370131e00490077900b3afc1b5f120a0eb63df9c10835e1976e9ac26a656bdd281b1a1feea659a5f74ba656a53223b660d21839f029a3b974e4abc9da0a92fb4c4cc2d0617e9c81dd7466379d81d4941cea9229c055e326edad45c49b4379ee39318012fab011561b80870f598685faf699030733f9f011b850dcba8576998e6ced476b07a45154f51e97efcf0def0d86608c1edf0f232216fde0c6b350a96ccc3bfc3441d764f26e81465abd4a13c01dc813f5a849d2011db25ec41a2d9fd57545205f71a71fa9965d5dcfc100d1d545460a05e9cb072d399fb0da447df7a527bf8d517c4a0e065517dd030c6fcf03f6266f51b2a1b92058675f8c7ef414a6cde5cf506b8823b5bf894f1c05d619737314e432a721d891db72dd4c9e5db89f8fc2b139bb35ea98e8b061dfb10f62c8c2a4ee3866c503024b10b5723b2b86986b75e2a211eb2c5630c9dbb021a94734e6fbcbf793b13cf795a64ef964860c0648d0692c9cf545738e23a0a95891bc19a55fde72e1ef8aee5bf15ea4fb3e0f6c55197187a68de893b61834c172886ffb6f28b5ef9d2a47bae48b11380941d832a83ae99e5c150d66e3df391813f8274a5a0836e3f34804cccb8d5458813fa4705a28cf4c773620854b4fbe38829f3592f44b21349deb55b420c3439dec04c415c71870588d91ff803398d591cd7f0fe993fb475be89eba71e839517577821fe3cf4b6c28f4d651c70c40ab1f0389097c7e1ebfce867ec11b81bafd0fafb252c9801289c64c555cd568707242d94b76be602477f3b0b8134bc36ca5f2db334f20a510ab77ec55986afdd30d15f8436ab3f6944004fe18742abc68af448eada4d377d56690af08b724d8c59d7ccf88e43572642b4177bef0863b5d8898376677bef9741e181966f69c19858e4e9155c4b0ea1f698978e88b50444b3f55587d58a6b887d3b6339388a095d9188006d3cc1dbea161dade011a68d685d2362071ecf5dbc0ea63e8b117e3547465ca70e13d378497ec586560d2a116e3c0fdd0f53236d05cb32265c789c333c28e9ec9fd88dac1929d191886153f97f4336ecb6e8bafccb759d7b74efc1c8fdeaf8ac8936c8bff29285118ae2a9c5d4968832d8c2f14e8adc6df13da3b7306fb6baf1788a3d7a17456cb7020e88a88a7d6ef4b7cbf79dbccb3838788e36affebc473737a5fb11ad622889082a3eb6eee3c5ae3bcbe32ed03c6d066bc219964bb563ccc279826b738e895d62351bec80352d80f1d1a7df3ded8fcf361030d240d7135e9e87d10bf2f7af6747668808e5fa3ba17074f628d7139344dd0a88ad38b89360ec77e9882fa224753e8672c05cbc21a1e1b814a1e3e37b77f38fa2109982cdf87b1a5594f78356171d2ef598dd602bdb2454be006d6a69b45a1d752d68f65d3e872196067f3cd1df45f938c99a2cfe6a8f202be53d8d04575fb9522bd03122f4ece3db258913319f2ebd522ff5dea8df689835d8b87892efee5927d110d6c0bbf70d5a8a8cd359a8a6e79b49414ff67c90f0b9e5a73e5f65fe467b3f7c397b5b0c87e70b9384592f94babcec533c290d29c060bdae6e5e33d660417102c135e0f24918a92baee43b7cbf370bf6768c17aa6047e54ca3b9729da55c1892c507bed76ceed6f9c42aa11789da0bcd3876a70d4886f1c6c477a7c3dba7beb51198d01d72fcd65eceba6bc3918b981f87720649e6564270ab82bd5d4d7e45b8b09fddf121af63ec6034db418cdea9ef1bc54b17debefa6e079b19df744f378efea53ee44ec3f9da53cea10c76d1cd9fd6a7b4cf20db0e810956246d90ea8035b3b4946893119de69b2577e8bca1472e63373e3ea0901f7bb58120994e31897dd68d32805fbaadc76c01f2b282e5ff69a1830ba7e851b0e92e458cab4580c75db6148ac8a1b75cf175013d893b032ae7d2984fc29a0e4d19d4896087a3e9ae9dfd6c22d302a1b8257c8ee4ce12d87fbde4264990be11f7a56e7807f4ff7de69563f10d79028cb8d2f9e320abf5dbfdae638461ccd9f1d3d5f8234d49a944a70f128dc4833167e712d155895e2f62fcd316800a99044d8dd1fea55a7e9dc89afdd748f8ed93e03b17fd4f94ee413b0052d711aad679641ca1f32c5385cc3ed380579a8f47e45d307c0dae663c23b4d62f27f91a81b73491c54b8051c9cb9ed28a0327717e351ff50089657ec86fd99f0e9e963006064e0dcbfda146e209bbd6257adeb50e705cd8880e59540d2e7a50b92c49e261f229d0681db39465af8d49bbb0f89cc214dcf62c16027057df7b67948eb42d4120f8b71df0441efec06312ebba43c7c011ce104d50ec6eb9816e30ffd1978657bd39d2e80fe3fea755f53e14adafa8ee7f926d53e607aef4bcf167e32ec607becf843deab16b2db43ef49eb44aa8eb2b1986fed12e406636d2842ed3939d73af748b34cb4b423e38a3e4ded61ded1f39bd3ac583bc2081e4ef22e2dd41f7af860538920650ae5e431b8f1bc22991b23eed3075586b0c587c8403ef0f6b2116d4bcff4d68583ab14e747554bae19ce8052d2dc0ae6d434414403b8c9fe3055037b6901de030379952df4aa1c061482a97f60e290423e3c965efe757917a42e3a743521546ea2c0921b24c8e525d6a210e5726232ce88d2cc335561ff598479151b1f20ef4fb7e156e6fb7cda1c1bb6058680e46bb0c6bd362d716b38172a7b2cf0ed75faaacf78ac12d9f2161d6f55ec05404dcb91671a57b4042c741c733d704978d7aab3aa5abac4338932f710b913d74f166d9bc8abf6417f4b2f8976c4d5bcdd908b27a05887f7541053f57810d3c1f1c31756ca8eb940d114841f120406b59f5241aa8c45f03addcd2315bd50497170ce28b3b3b809e71980ca1025fd8129ad583cc1acfab9b4c384a7f54d7590794da65792e0a8dba355aba21d6287859868d3ca15d4fc59058757c1782895c0cd51f97ab10cee214c453ba80ea0d1108a5d8360dd39a064513d1b6080055c896966a6590df11ecf0bc773e81fe171924f1d5248b09bdb32155860cde9ab225a429d40c5c9cb702d054381c1ac315f8632f257d0fbbb188b56cc2b8ca695c74cea54eeb7184ea7c6298e1c33c59285f35d729d5059d73d054ce958e6ca36ccdc9a5aefef58618453fb66cb723b80ddf0d0c53925bc6b89b52d58c34318d18aec4df0dab83c67983ee201390b4dde8406c04217cc9ce19d2c9b0f7dd70c08a83e1cc2dd557c4e98e3a73d9b90251c7bc9433b4b450ac524b03995d71845198f0ec100cd283ffa71400c1a46e725628d8e0f4b92029002fda5a4373cd08482aa8ffc01d8e26c7de4f4d2033957853364a115ff0aa8de3bd658ce6186ab86f2de18334267b6a6d6bd45c11d69e155c3b8e849db12a0ce9da90998b405849b025518141532a1daa80b488b9180eab99fa56a86893c89ef49c7e94ff9dd87aeec963fb3f7804013419df1600c187d03bf2e14c8391bd8265f2c1feab0c5900c05715a50b1f7c7200b3dccee7f598f2a89c957ff7924da97c77bb77d25b1ae0d36882abc093435f02fbbe3a3381364188bb712d46fe20a680f6b5a02f28ba73d741481b9294b07156315c3c066b6436624ea20fa38b25024015cee1f342b59be8b7199014cc5b14368509fb4725ea8273bc57214a6529b01d44655943e5d153bafb0a63d60c4074b97de0abb1d178e07f7172bfc0e36e29148903f24fb4cf14388a70fa3a54a30b4ee2dedc1f4f340249dfc73fff7a7da05fc1838d6a099299f5b8bd5cc749123af8b1792ea0505ea5631a3f2f4df52443d2259aacaa2e030fc0cbdaa07592ac1c1b0384ca96d5adc29dd248892fabb076f86802a41994187d94832f4d9beb58eb82c71caf099aca027e0175a8e830ad56b9a60e327da4c7d014865fcc7a7ca0983b8f80da15dcf20900cfc4fa16358d4efee349115f84483ff5c6e5a8e69d06f4ca4121052cc9066f6d6cc6a3df86147a929c649ff3375c767400efdd874a8800816fe3ff43145772f237e8e421f6e6575f48dd20d4d62ffd4117278d66c482d25057e102cc8b43e93d318e9ccba118bce1235579dc552fea9af31916599634cae92a202de9bf4aa08074edeb33011e1f247c0407c0004e00972db36922cb0fa0ecd15cd85875d1b2c859fc4aff1b3122c6078cd843d3f45b9342b5ff6a00e0d03b4da5732254910e03930da1b675b8769b7d18283265e0e2f505f83220e03897b246eab2860506831f229651e897deb8515e49f4dd9d2fb2dc9a5ff2ab5678077b9588983638ddd01704cdb8eb2ae136419a858912e90f1b086e4713be03369ecff9f2fcff3b907e2196d8488cd8104487d47c09b48912cb18b7eb2b7a0d72ee41be5b1ac11447d5d79a1780eae925b88361218a60e1f2853fe9bd3075e750d585687cbf029016f92ecba90270ea5af232fed579f996796b3a0d4d8e825702e9f54f1ce50813747dba881322b8905ecbff25b0db3607c5a051b735006fd9170a5ae43d287ac99f59c8474c585ab0265c702cc0f79a4550030c954595bb0c27984794e76aadb6818aba6875e61467fc1f5a530f3df63c7275c33ae4e9bda8bc92a50b15df96222e676b66ff3336776bef647807e1b209ce539184ce989c8eb79ee54b814ad1427ecf8b108541899ec9cfb9704fa90b06a817e027b982442b356ef263ec372ffa43c7329f280b7071025ebdf4ca65f6ac23f2b4b4a47cd7be02a3389e45541844f694d5ab287597419869149c1e9e569c68d90e8d675ec53ddca1310676de2246cac506c7555433dd89acdc619a8447d9cd57f1da42809cbba0edae0c8f109b04ed471a3403a7a5e5644fd657dfd2ad94c83cbcb176fa147620078b68b694c0049cf8a1cca86f4ce3d5fabfaf9e626269acee15e362a0cc5fd1a167e0b0ad7f60e3f69ebf8100df8e32744901287d85af8c96c867525b56c45a2135b284f800a2d2169962835b02709730cd1571a6380a21bf48f16c22bb1a2a1e6e096c2b9d435c6195aed435cf9b14cc4eb10d2ead88ada0dd3ae3e5febc532ba1e90a61f559d79cd6c23183a3a75021eb1aa915f6e6d9533e7fc8dd7d356e10ecafcd74e95bd1ad85246af518824a19aa6002981bbc2bba318842a5b3b030e319e848e221a274c1ef08c43e7098306ab1c4f0c92af859fba542eb411c2aec1ed69156c103d1d735d002168e8514ccd02283a8a03077d0971d70113f92a5867c04c967057cbeaf459e3a40cfd76717e9e893e706aea58ace024ed3fd9fa172a98c92b18c9c5598a8acb1ad8190caaf71aeb0fdd8da9ba7b9fdd7fb61aa1a20f65f4f9f58f0c73f64648c35495710a38e109bc5988c08c570dd1d0f60e38393c0c301a3f3ef188c2ebcd11f1e3427d34d004537d6d6ed71e8b2c7b9852f835642a94427990a4da3cc3ad27b6c719c9ead4c70fc08bb6f453633a1e9a5bcbd2e2ec3c90096ec479e0a01e3c2d892d425268f2722fe1fd0cb4d47457dfd67b64bfa0b3e8df2430e261c6cb5c2281dd54e438dbfa3c3101977c0a1a2ab060520d73f8e93413d4439f7e7fb96405ce1dc65ee2863dada7ac3c9efd62e960ef420e594ca932b0916471d6cfba9b35c40f4385d11cab1770aa0b0882a0a9c0608c443400b3b0f202652904348c873b25f98fad305d205ba728a628645b092fdde8b49b87bbda63cd0df96092f502ce717fd55a560c3c99fdf69f39fe3c2d14fd96e6f67884701a641b30546479a53c0ff0e54889b52a7aa2ae79a4a3ada0956eedd178ada9c10a3304061ed0c86e42914c0737a0820bf8f49ee1a3f2883c23d1148a0cf39335c26864990ecde6ee03d0021ad4aa912ae15c288e994095a186620d1c180ed9eb1370a5a3a21904beb0a5707ad98944b836a2c7b1904dd76580836ca412558b1ff86642a737100336ba803f6fe6ce50746a1716faadac5f54cf1b5a661a0e28bb3679c0a00a250c0f2027d8061f1838f51aa3f742f46096bdd38d3412c13c809ca3bb33b066f80d7dfab7cdfc424dac616b0e19ce40571b4e23d05c8633c5c9c2fa34315d780392e7f4a0b381af88b58a87e5229d2aeeafaa9da7d725b8ab0f9f7e4316d2f65f698fa516a0ce0973904b193a68724be3261b34f22cd1cc0da8e8ccf617c5a403b6e2924184d0b244897154c182215af02059023e3d69c40c3290021e858b91527a4711550003855dc6249a43ffa9d591eab47fa5b8ab6cd1fee9aa9ed7909266911a70a91edec5684c7bdaae2310d6472544bb196035763e753b7fef4a107b16d669edeb1624b3bbcff51e3a4dbdd8fca4950b7b44328d1f9f60b219704253b94889645bec06d98b1df5e73d5b2898bed9ca495e6f50e51d786e980654373a5d4a6a161ec8ef3e83f409f25f672a06da20ea83c48b6228d91f0be8935e99952a6e83237a60fb29bef246e1728e74a54ac4ab7a40ce8f2a3656ea6b5b7a7ce1f24374f9bf29737b259434df54ab596d4ae0cb109717fccb1229110df8e5af1a82ce24369b9549eb23465f4838283c0d4d0e4851c7454847292439461aa649c9388859871cae69c846665aa0de5c2bcd1bf198860409e7148209e09c19181c1c03d6c19174e9124cab8897c4ed1da5c11eec43255e8c520bc2314283294b55aa28afd7a5028aa7e04814eae0aa3847ca594ed04c39088c98b2b26076cd54a26e5cac5e29f0fca5b7d0d74484130ed6b035fb6553e081d52b0dcbe3bba881686d860e1194993368f7b22ad82ba6219bd250e28a59485fd0e44cb9a65a43e0b8bc04e9e0610031d49ffe658760d2673c85d532c9f67fecc282c87d7d3109039913f0641b01a653f4517ab76d566ba809a6a72399b476a6c89c8ed006c264ac47a00d84f47deb2820e2bc7dc9597c02227534a3a5ec56a30c8886dc4d99830671f7ee698e4075422b31c9d5f043de19b7f9ce5b3218e21d18a8782e2acdb96e7319b56b7c35a95d3199554827bb3f824a9984d2c4ffb80ce4bbcb44c31f4d204a1ea8142e7a67a4d399ae1404148354d53437847a01d5741fb5a11b77a1fdbf07bd0881d6c0fe37e615540e89e2e8972205c9e7d85387faf5b218270f8e91b827fb782553107e02ec40e32a8f9db75f2be0566ffc60219f526b9c8d83e4adccd95e9438169dd85339459cca85e71270928e6ba033ebae6ace3c785b9d6f035bbe635c7fcb8dfd97df5a9c46d1a013607985fe6222132202456862c2c987adbf4bcde89d187ceedd9bf05187398425fd2a638d79e9cbaa603d60935987be9ac13be05e0d87d41dcb957f6840cb874c5f4d369a2200de9f5f5d22d61401a9d2ede69e37ee0dbdec63f8ee6f25bf4f3986773525f972c77fe4773dbd71006108bec2a2a4117985bb6b7a50c285376076f27b921f1089d14f73b4db4ba3dbbfafe47e89418b6a5f3b16c5a5a47a40e73548a35ee306539e16d3e953b77dc3042e6e92cc0ff3513f7dda56b3a96322e056875238d413ba4ae586274d06f8f754ebd74e30e7b1c9a4c21ee4ff19572516c167faca13c84443782db832c8f563ab68fd442fb0e8e63f34fb895303a5d1ceab61b2d84111a46458f0307c92012a0600314dca6a1d4a986da20c0865f0a95812c1bfeed9b7aaaac6a5c6fbbffd186c52cd24c76bc3d0aa7b599f08a95b36e79d11497cb550eebeeed545e373214a86242c306cf5ca6e4f5262197724e8ea54be98bca4d57f12c16dce5d69a83150baca1f50d2c81f201792c7092bb936e2e50f3afffdc4c13dd2609c40562c40d8e4b29234b587d2afb4e26d11423eca998eba93c4ea9c8712a6d9f12a4bfcd3775f4e70b901e8cbec2c465c2ceb8da67e8a969fecb0d5aa1e6e76b961eb6c54f971230b99c8a5660fd6b4b7453174fc4a94e5d6c2b7fa84306c2d85aec5ba537a3dd507f19936d8dbd564f09944e4aa5af2def3296c3aec609faacf2cfac06bca5187eb207d61cb0355c3abb0107e87e6c92aa9b0f028e01c9e092819ab8170990b69ce80d219c1b49bbea19ad9256298c7217c39c27d1c79cdc96b003965eb5e2e5e6163f8401d329c2ca1a16a4010f3f84205c3f61e5f36a49ef19aeb0cfd604ed2fd0b1d2905a29ff2b886b040196964b8781a8508063218844375a43bb7512c8a94929fd5963eb564fda08bd6def50e757b7796666bc1bd1bf0915b43047ab190dd83e3251d294299d0989db3e5bfc29fab0d85b4911525d378e9041d3c0aee493c45402568e8ab05eb39e230e30c7b112d0cb09d6deb63fcc3a953d786f68fc65bbd5eb7a20aa0daf97256f81d83c8c623a86784bc16999cdda368641eff08bb78ca04daab840643ae0e9a59875ce35cb17719a89d37fba9fb571799c7432b6c5211936c7d4db51b0a9423f69c2a071c7cf782ee85a9866b1355f294617e04a1604c1abe5999c92b4b5c1e67cca99bbbfd987a0e0f78ca62d4c81f0c92c5eb8efb14e1524af305c0c52f58384bd8781223dc133821480630466b45bccacc46ad96501ba436a6c8e53fc0c1087139e50e10dde945038f728007892bd44e51129c197ad14f36b228e3620d1be9fcdf40cdb7795e9a9431210bac87b21ef8bd815eced56904a6ba635a5910b934800f0b0ed79ace448d37004d69448c660772759491e85e2664f11b3a6a003275342880794956c6f21782bd18a2d05e33b50e768f2e21062a8be286f4e9480d1fa979cd8564e2a8d75eab7ef2e3d42165721a15af83c2108e80e0cade4ecf073d187148c1052c4ea324dc3953eb98d1597d5ed076862f0246831b5472689be012309100d2fd6f4ee6633bc98753b2ac9cdaf41e1ab7ff950ec26d1c3c2715ccde750c338a68a1fe4eebc30a98e80e19e38d2d26d282a02b699aa3b186c15f632f7a13bc120c0f4578cff74b124830073f9b92dd63a53c1942f663e971d532d0f50e16f12c3d93c880d72c2cb4e01298be0f88cc51f0625ef2ffd35d7c46f9a71333f54c994a835a11042954279b7b7fee4185a9c82877e180df28ffe17370cd9d51a73a1b8f59732af252e36da1658d15a725e82a484e160cf33df072cd99fbf4a592fdd11b8cfbd4b9790384fb55a380e2e7cab92c1dcf8ad09ebbd6556e60fa6baf4ac748c1337eb6b5dec9cebc463886964fab6ed9c3cf7a2fe022cb635b8b6641267b0951344ac0ad0eeefabf004cb6a0d730755873a1f85c258b29164177a0671d10e9dbf2cc0d105e89cacae308173cde57cc1eeb8b3f8b065b12fb3d8e2fcdfcaa610efb4b797bfeb3934de1f8c889aae2d31a304a979e80fde5a3839e86e2680406bdf6e3ab86f3ad1f0cc69f867df00b82bf76fd1471b5356b803323b0a88921128891d594add2189753712fbb58fc55c3188063d33432d0a06e8f3bdfeafcc5e5417d04838bd9e991aa4de152cd78c46dd746831b7d97eaafdb7fabfaaffbbfabfd5ff53eddfd5fea9f6df6affadfeefeaff166a65bf0f88605cae7fc5cbd71e5f6b39cef8ad9a1fd5fb51cd4fd5fd54ddafeafdaaeea7ea7e54eb47757e54f7c3a726ffe272986ea1f97bdecd229b7af2ac7b6ec593e5c3375cc63d93f26ea34d0b7bc6941ef8201d74811de4238fe389ecda7d24517df52d75b5396f20680cac587cca0944db0ea81938f6223dbfcff4815862790456ef02796b15d6d15997d280967ce325115d41f6ac6b7cccdd011f623e8c21ce0e2347677ed2520c08fce6585db88df3dc64b224daff1600af74f169efea16c948a611f9a20c9a36c202b74c7039bd12eb63a8fb84c0c4ab90cc40663f22066cc890d761802ac3ad8799b4867d71b1f7d9db7adfd4c39d4ccc86bb86a07e0ff76f18cef3e2625d2a4b264e1d5e28615c282104f470af3054a19a127d98c8ee865fe2332505dcd60883795c078194f59645bb9513ac7083d5c1b83ad6d9b254f6ba635708d8aec7188ea50077c41394841ffa59ff3daa97b1480545bfb123af53828473b0240283b3ee6e692c201420465646c40d347d2b1c9f6511cf9ea4c35a2f950d39d081695499739480885506fa60cc69f52bc08eb0adcd11e1f1e2e53091dd0cbf112b5491aa970353442f186f5464434e31493bd958fd9cd12e95f15ebfb94658b8885b230ff8ddac59050e1ac24b9891000e3550b9c85f80865107b48ce364af4d2e1bb981dba8f03e296a3eb6548c45c0ee2862e01c206dadb9865baa2e8b9a1265df55aa3187a7cbe90bc93a06c58ee7d0785be665405ef4f94192fe227adce98537e4d1ba9b6d7988d2ac6973f0684e0c1b2e0a3f37602bcc418ea0ae4f94e44ef4a2a30604a506045bca462142b3bff110a20e0d256252929a08262a3f6b0cdf282d8216065fc0630ae7ba435095ba29d6741da094f8735ad28f8f8999f2c8fb1f9b16f2bcdfb8d00110b1fa9c44b5a330ca1d29a193566779d9ad1cd06f601febe41813ed475fc4fdff182f60c2f0b329ca3ecce9953ff12a86f0110f80f8553f24d826b79205d2fc54fa75173c3ad191d118f8f2bd42c64fc06d44bdd7fb38708aab54b7629df427780b4a129dfecb84f144c4891c7ad0d4e379ab64c40bff83b169d6c25934cbc5b2aeb570678d7c340d7122cb70c6132219fb86e6828b57f99072e10f514ac9f95ed7d9477f6bbc953c025344769d83fcef2f634861845b4be3d923cafb4e00aaae383f18c377a2a5ef8c1b0ac17504f437641709301c52b215be3063aee9db2082bd781cafea693f7e0518e00eba6b51bbec447d609054754e641d33a68d86590ad0ce2b4cdeefde31d2724050fff19720dc4db5b26f2c0750afc32b326b25b5a00d70af9325df18ff878b646082c9512c7c04953ab2c20cf6b2a25c8ce3282bb2617468728c2ac3e28a0dfe1f813710feecb4afaa0060765ceca69ddf157cd2949f2a26e8fc825dae7f192f16b7b22ef203b24b53428db85844d8dc1c9ef768ed7cd9aaad01edf4c526edd11bb14f068116313575e14df0634d979cf44427a3a34273e3e0218cbc0a8f1eabe0f5d24a7528b108e4eb36f3dbc530b84b93d9c1674d1d53245d1da07c2a9a859cfe364c80be476aa3091c4c2def68ddac91f8b1ec7772d58b4d7cffea0efb418e820831b4047e1c64953b1f7adfa7f262eee08db3573e2e61d156288c100e5c3ff2b835bd3088024fd4881813d3d015aac2aa397953b4d863ab1ce8749491c23759845c4af4e654ae439e73c35a10f95a6f91bb2978e8d09f90a0d48186c75a7ed1f68863f9f51f8369e4fe44e112cce88183278418ec6f4053877a8202e8452a35e85a3903c0790c0709a146e6b4d94b0ca8788d488a698dc9473967a750ea89d8b7fd79596113a5aa02fb989c63fc0718c62239936e04cefd3e7810f97d53bdd6ca9cebe5bf826079b40716b5f4826818fd085b68f11f55bbbcbb6fce422bcf7dfbb3377e6fb8501f10945a767a7c53569da646b00caeef36815b2f4d242ff5254018361e0e285ff74fe13297286d279e83c4971c84f24b5bb7f55b1804b08fd2de57ee7f4c5b0fcdf1cce9957a60f3db3a3e9b688ab58e57e4f07f4b6e4f35d5b34c4987868243286e026580404cb19e58dec832823e93b7c02f26b17efe3853c9b7c0116dba694b471044120d80f400eec476bc4ba726ae4c7a08d260713e838778acd0c1bf46738d85b174632d5e3c7de65f0fc68a0db69e59da220d51060593f38c5162ead8b46fa00d1dcf5240b3034954c91e6d705f434fa5a4897d439e0075c0f660502e8ba29597dfa041f247bf053a14ed9cbaea27ec1c10b48e62db26900536ed5c4bb6126bfb1096a999dd91de7cbb4062c53bb4bb371834a5f1038a9d052e820f7d040981510adcc7a4795da328cd5e5efde154e24a1b0612f83cb58e781d76df2b6bd1912e17b0b988e9a6939c17d8ba5a0213694f9a488fd83a16df3b891061788df663b83cd050943560c03ca42f847ec478e8217acda9f707af69dbddc41b741c81e24fda221b999780566a75f23540be98023d81a29a3bc1cbc7a3e2544347140a5398bd3dceef698497d34bb7da89404713e0cd51d3de7f0e4021dd4617a99ec4572b74f107365ffde642fe8aa3c371ccb764ad293eeff1e85a423bfeedb96006b29a7879608204df417883c167538aa4546ad00bc534835702ed7a2e13d1ad070c2db04e218d658edf872fb63f01f893ace95c2a351ff60ed08c21680b0bc82ed016a6a919382a6719df3e94c6e225e9d9d702ea4555e4e94ab534de7cfc01e2fb9f09b95f22df52413a69d07548ff09b40285eec630a7254ccfcf9fc9fa5ff4e83cebe12771a880b133cb94e8d0313cac6b1dde2cddde8466c512557ec4f5bdb9b47b9139290e74caed24281c09dca069feedf8975474df38d4b53950c1baa022d1670390aea331904342410b5b2d8ebc76f73cf31643359b908c4434a4e1fc1aa1f2a2491299e2d54a40da0b943d4c084b2fc3062f2ea66f89e0559ec74a62dc10a13c301d5f602c889f06323d16a886726e31e2cd942fc624e83c4ac604199646e4177237b80a1aa5257f4fef03344cb86b011395000adcb8d8dfaa869202571daac77e5f058ec876ada51632f4da6c3a20cd03e104ebc963d9f92f163b74d240654b9b2f4d41dcaa2707bdb4e72459d7b164187340f77b7b769a19e5fdcb865104630a5e8eb4bff7b59198c970e14470196e11daa7686fd2cc4665f6548e9d658353865ba8784aa9d6056bd78f2341bcbe506bcba9210cb646fd64648ca856542af1b63cb2b9f27a1440b26a85d0df0c10d015a3f632877c45f12d97e97b45d38d8c985bf75ae1b0c5920b86c759b5ce6a4e7ff47fac105c56187bb170243174b44eda4e34299485eee29fac74a028cdb74e3eac92611e588a11a2b7ccf2cab7b36402944d765e8e2455a83daa1c39ce7209b778bbf1949ff3649c8b0850c8966ac31fc25a6ff22f97ef7253b1fec33934819b620ff3ddad6591bf132554e3aa4856bfaf95d718296b1d6901d27c103825ee9a209507a53889587a196eb476c218e6db9b437a1ff98471a60bb13e4a282e84c6790f228244e82474c398a354866061da34763fd695c0ecc9a2bf01b8966d0b950cc80fb1a2471b6235f342d48e0bdbbcf2a3793e67a8b50cc01136f965bfa4b9df07602f1c692846820436451abeee11698f8f74c99138c6d4c34c33506b22c5ba54eb580d237d67888bdbc1450a0d08b730a02801eedbc5c05b14342309f2f6184f0d4e29761eb4c0e4a5ef3c313b081ce61b204fd490fd4b3bac34f6c8e4f604079ed178bc4fff13741638b0ccbc828f219be515916130b28cef0292307e3c5b837420c0786865a3cbfbd383317b191b9af117e03ee1de3cd08201eecb5e6e388c92db9eed6e7c96ab90aa666508e550df5e74201f52272689d8eedbe9eb96066bf2efe0a680bb71b88c42148f7fbf28f2bf54280b784d7afadfd60e3d81e528d908cfe9a4cfd10a11be4f5091ea5d0df86984024db481af4655277d52f2a066b5ac22df221956363fe4f56d17c307c8547e5134d02561313880d702d31628b2da1d58569b2a6c371d9111a41a50b638d064aa8eaa2bd91e8664ea323bbe4756e8938c82418609d1cbb5ed1d0b1561c95f6f7cb00b42144082ba40c04b28c80ff0a86afcb5b513c9082e8a9918e6af5f7bcb011a4ce11ce5192b3f7a0cf7e7b165590d5f674d4baa9934ca25f46f2c3e6b4f003ff787b36b4033b09289a6a3956b280a3d1d092f9ea8d79aa5cc86d4a5c0b8f3fd24ccdf88f8befbac3086c48a4a7919a5b2428625946a48eb46bd0f4573823431c0950f239b7ca79b9cee1d4e10f1ac0ed8b7594848c87aa13bde02f17b3a0cfd98f0e83bf1e222a4edcff445459a8e740cfd40dc0cd38f4ee0e92d9f26098f8875ea32d9af4af813e384ba54275beb249882bd783aadc37285d84a464346c40454e13daa137284eb3291bbb6045d8c02662380be8cee0b9be2ecb355a7c7ea242cd0c1cb51ef26a74952bde5fa6abb6ee6fd533c1ced18ec7b91d1c834bb67ec8731171212ae4b092144c21525558295ad42562a86c49463f3f40d4b82ce42e558a35bbdc66e7c09e9ab6bedbfba762969f98f37718c2b15fe445416cc6c64b7b0b05b3f34a1ed9e118c04e5f20628053ddd86239f12c9415ba393183f1ca1ddfd5293168eea9eca5ac57fd7a9779ed2dac577f714774f71e714af2dfe3b4fb9f314d63ebedb2dc553a25064f56dd0234ba955912bd62ddd1722f17898293b9583ce56b5e578e7a9ad6d7c779f62f7a9d76afcbb9ebaf329bb4f5d4de3b7fb144557d9a7ee5bab782d0c72077c22033a9c728e58304c69351d8a715b45b95b8200629094c9c04c09930eceb66efd88c03cee9b9224109041aa6029178997c4fb0eb72a308c8a270d8463d145d9d994c4f737a026fdca73935014f6825ad99c08092d35b2bbedbda594524a199808480847093683336a5c5e9e71002edd1a4b7786cde0f2f2f581fb2e9190c9b087c0d9aa0cc3b02c6f18868f533ce8f94479b7863d4076b404fc5a83d16e497597b4d6977767dca55be3f2788ca1cc675e7d144fdf7e5d7440882bde239a8fb41374a20b22a3f64cc3c7a2cf4edc28b38048e977d641bdb90b22670c6e0f5d363beb8c03995ff10c4ff04c4922f3b1db6b1d9f28dca4f1663cbccf3fd6f2d0cd995949990efdb520b43d61dea50ba286e5fd49762953ffeb180da54a773f63164511bc9929cd9411a7c6173bc619d77b669ef67b7166bab98b1d7bc8c17691b557b7de016baf266a1e723d4236525acf26e8d73ae3dfde7b579d6bcd5c705cac9d316b8176df9c75c618672d10d973c6f88222101dd939244770239a83ec592be3901682cf454cc89f333e87460c822008e631c9a875b56e786370f9c1f8fa2df56cef531370bebc3be32edd1abccb5b814899e2724f03a41038d74c24748c765073350b3dd62aada7b84f91d88c51f6e2ac772d2729adefb3d63a44b1b5d67141ca8a66216545415a6a8267a1b4ae55c05d5988138f431066a7f2ba0c4dc39dbb7ba3d87af87ca6666a9a375bd39a96cc68e8b87b147a0dc37cc9f0cc6f67d9f48000638e8c798c3d3f4685b027fdedc0a634013eaa39cdd370e619c5a8580dc54eeb7aec182cbbde288aed6ec6414622865113dcdc4562a3c42b72e56e2ee72cbad63b1cc9b1041bdedcae1b95797d99a84134bd0f3a51d60ed612ec57d737675bf5d0cd7926ad6662547d485bb8691cc73a43534f110213ccf79bcb5ad75aab09c814973fbc879af5d82f0e6f1f9db194d7c7b08add2af6b966657d6a971e4a197a5a9661228afc23a8cffae1899ae5010a365e60898d7efd165531bb25de5b26cb3ce79cb3d1dbf3034829d267cf688af4d9c573f47a3d0c4b13c97abe2a49bf970c71a5f6f0d9695e2f88ec33afd96b32a79d69cee8358a22a7226462899e20f220c5551e3754f9c5b33efe00d26bd4444643946633d74802fd26b6833352f43a8e68883b9e29d28f9ee2c71a82d1cfd4e8c39b13453435413fe99a2481fea3acb33eff314453f7a1eba5a7e68319aa4c3d78b820425ae8f704d2d73c94f9f5da59dedce821ad3ccd5b348ea3db1907231a7a089c869f7ab85194f465abfcc324c09823644c326bedbdf7ce5a1a0b93be61cd205e2af25bfced1b4d357a02e9711925f14597785c169a6439c9bab1420b55b65e9c097a61a7284f52102472e0846173a4079a267ba68f989b3b3c86f48991022d66eac06067891e372f92d85e5811026b3afdd840f3b55bc3c542bf903c508af078823547a75f2cbdb6bd7ed1f43ac36b3c4dd782404272d4f98a81050b2ab8ac11d3dbd3a68a8b362ef26cb8d32480af3f17543ec3d79f0baaedcb36ae7bb84710a84517bb59b34a0dfea61fd2705bd71dc29b2bb5a7e16bb4cc31ca34fc5bbf4e5c10d66fb9757e4be29e0b1ed84553cdc5ae059b1670ec34c1009219f1510b32638b2a7ffbfa6b51a55d7869bd5a0fad9bd662d1400f2a36555675a46a7c914c72a25864c9e1034b07b6ca708310226ecea62195bcf05108114a7538282199ae9982903c763284088c37daa2c563dc82f718638c75d307a390e828cdfd3d838486c843d50a2caa7ad8b73fd652af5e433474d1331a861fdefad644f7bae8a2a7d984e8227ac55244c9bb358a71d6dd0f7173182d3e5e4f61c04c3105aa135ee55141260cef499a2b499c3819411344053a34a87cf97a13c6c585ca4f89cb8f451a0b7a5ab576de6749e27f9252c74b871ba89d2e350b60234e8c1953baac21a3c3737213e825823e34a6c461216c4f972ecd25dda0739563852d2a44b1a34b8d8e20098518d91565f28b32d86af0244bc781cafcf5c702eaf111c9c287128cbc75ee62d164f7d71f8b1c3e2c476fb1bac165050d3b71e4d42e49a06e608db951064ded32c306d60b31757a2a7469f9358e52172a2f5e52a47438e9aa571272098675e3a42429ecb1f1db01838e3ebad4fc1534441632423804e05589520306296a60d06d748325ec0b447be148bf11027badb1901e392ac6785079d2050259bb39757c7405b2f3a58b056f4cc7d58f189e2727402bc6d4f1408b589d18746030e15125e889e9662909c718ae1c2c6c6479c18b2e355f6331d286c9481e384e2a74da95bcd62ba45edf5eb779ad7536cd0f46e1eceb6f050f330c346e117d4af427888480fa62ad8d84c0d8c9454e44f6b4fa36f8a9605282116ef8fa53a1e235d4d93a13082c900afff003489f227d2dd3aa55c19d415c7c94012f75ac986640b971a54bcdb7ca4b706cf051bdd2c2c9ce0b37a27a72748e74731f6e0e63af571e630f1d639c9770b5184dcdb7f54afded90fc75f3baf9f5b7cbf1415f7fbbdd52b661cd7bef0da3dc2128c78c551b355966baa2e852f3b797f8a8084b181c177edc4861896e7b0dbb7eefad5172a9ac9f1d6aac4469ed3ada5ecb9b13ca7a2ca45107fca2d27cf6a17ba481e71a88d0f1376f21f934f74a34abeafbb3f5e9873f535fc58c60e2326247ef1cb1c3c9cdd5c771fd5ef317dfc7dec14dfad3ef509ca1bf32b0dd550cb0df2dbc531af1d7d7bdf756bf515f1ddcba7aae8e53a3afaf5ead55dbbf16c85889d2bdfbeba4c5596fac37188a5914f1b5e20e45d9282367b41aadb4dd82701987c3d7e2c0c4c2c6c4c0b492de8105ed96fe7a06a5eb1a9636e8f8eb268f43e6c0015fcb6177e564ca552fcbd7c35ef80dfec25eb80b876130dcc563d2e1c4c49b8ab259ebafdf9c753397bf8eb3164eb398bfaeb76eee66df9f32cd37a405601cc751b6bb5197eaf6eed5f55d2d309fd6165717eeedeed66eb7dbed2e5797179898d8ebf57abdde6eb7dbed7615d86c369b00706062e5ce5cca5d269fd6165797cfe7f3f97c3c1e8fc7e3e1aede8deaf57abddea5babd7be5bb5a21f6f97c3e1f8fc7e3f17abd5eafd7f33fa500827c56cb6e59ae2e2f9fcfe7f3f1783c1e8f87bbc0bac4eeee2e5dde65027d3e9fcfe7e3f1783c1e0f77e12edc85bb7017ee3a85860000800004a0820afc3cf1b5e7ed79215394a51ac1e7f3f97c1f589f3832932945af1210f56c84d66edd04f6101cc11907200492ec6c8409ec26b063d7a789ecf91e59dd753b33da758888b2989c89909072983044ca637a542df5a05242227143167cfdf568c1c336820715691bb1a3ebe6ea07fd78c97c5d28e72bee76bb9d0a47127bbb9345f118f229118fdda74602f8f4c3dbb4fa32be23bef77a07f7ef45739b32e8eb6fc7d2dbae115713e908fb76bb9d0a1d044a6ce082a8bf1c607fbff28e0949fce9b8fab46ee958fa4fab57050371d31aa8c2f0572c676d885b517b0edd5c78371a66db081e3baf57cd58cd1f8eac1f0e276f9d5c809429577e38a63c30da1454c8faf1e4e0786a91b39752f6f58723c7e32313c7920c1c2a5e88c110617aae82afbf1b666e60f9d408ec51e320217d20234ac8991c345ec0aa65d03431b1b0860f972632a10bf905a42f1390d187c94ad89e1a5546255332a248e9d8d1224b8b1ea42fe0d5839ef317f2ebef860a61968868098c4b4406d18d2817445984e9b91b393e35d2807e3caa9f8dab2c07ce8a362c887286c31bfbfcf5c713e342b485b455266f2161309b57e5f7992f456c50bd01befe6a8899370449787daf759d9d14b5880ac9dc84e8a1cb440f5d0c51125efb46ab49c2c4b28ba366786e81c6588daa0fdde947632bcce0e24c83737093bc396ebc9d416e3b4beb37dfdf9cecfd68447de99b71f5d8495c909724a8e0695efa9e4900e7b79bcd36a20f487adaede6370f3ad39a57d7e0e3edbc69f010f786735b90e3fc76a624fccdf72c02362fc3302dff860a3d20e96b5e8e5e3a4e04493fa223a8e06ba810cd4d8c5e73dae8b55acd2b09b91a8af35b5abb6970dc99e23c08b540aac4a112d0e037d484061f5113a4dfca33c5a127ccd780dad0f484f9a47923671b5cfb0d4d399866596e7071838b1bc4d26d3eda3688e2cd6d38f1e6b60da228967ec389362fd10c193cc415cf0c369b68b3d95c26dac4164a210ffee66518966ebdfcd5f0fad5985286b771bc590f7f34781fd64edc9992f038dc975e2f880d6edabc7421134dcb2f5d836f38ebcd6940d3f26d1e74dabcde2321d7a0014dc3b7a16906c779900b9df51695684a7aad3aeedc9ee14c4f987f73f276bb7988a6a3dffca4d9d903926eb75b909727ce6d676abecd71cd4d948ef35ae9382f1d87d69bb379cd83d0fbb69b88fa42373761f3d26fa805444aa111362fdd86cebc44676efe888665fd408289cd5b0b62abe77c7367b57dc6d47ea552a6d9a2c05e51a111b59ea8599fddeacfd548f622984bc9372fce7ae3c9556a2a9429f9b43bc3641eb56c8bb80b02570ee1b0935fe6bfb582d840c6a8d008ecd9339a6e29ad27bd4ccd08a44c49b18babfa02695e778981917073e067bf2400dfc4750096b16ebdb5d65aa32771739a6b6f6badc5da43dcad4f5c6ce2a221095a4c640b04412424229b063777cf0fb7e87ad0793b6544b69ba5c64a94da2ce5ddbbd7752b8512e4d9b10f51e43f51b7c08d926811d143dcea225a6f97cd2326c4d50241d0011fa85e6f02f4d0c1ea459b91a96708b28db5f22c92c16d41670736a56c836b709c2dc8fd76e6a19b0373a06f3873b708740d67bd45a3256f677d59ce081fe1dc96c1afdbcef20c7173a0d7ce0d6e0e74da0942899b039d3c4518a15e007a8633bc4560c5472240b732a4dbd56990cafca1edecc0a61c5df4f2246fae66d392065a0ba6669a337a8ba2c8ef6f42be783088a6fee09992df810dedcce0cc4127c732357f4451e4340c4394f4cb436bad97a8a8b5e2adf5070f1040420a6b0c29ad6f5d2d1fd2cd55af5939a20f5f7b5b56b6b28c42234cc89f866e518b8e42236c7e8b26fd880a8d207d1c9d4451e43f81f4a427fd18cec2192a92e31e47df635a7de199e2c2d0c11015613f6f7073756fd71bbd587fbe59487fc57ffd88f89a9d94d64f207dadb586a817e0b4d6a508444c4e10bdce91619e525ad7a9070fe6191fd84d8c735f93a66429350b478ac854a5f50f8f7378bf20503148512f483f549f877b24c22db248625f60612454e1ee91070ba2039b32ffca9448565ff4a10b423b7697c93c7f9d8932f404f9a118a27e7343c6faa19c797e5b1d847b647db848145d441d539ce8d5fa78d1d3a30c2c533d80e8e90288721ecaf483286a5114bdc3993a9b5d51b45614452d8668959d22525d8de1cd85a258657bf6aca06d9f1dd894607e2aa7aed34545d7670e451158a3ed8e2ece6677849bbb6ebb5e56ad9a91f932f23c512f105d143d6789a28b2ec208a28b62546a02f833d72ebacdba20662ebae81515496bd11375eb67f9c733bf4c14c52aba9993442b732144c52004f502ebb8da87377adb11cdc3683beddf104976a544fa115fa297f99d79307495c70d095bcb392eb24f7323c74737c718fbed0c71919d9d151f21ad50a6358b743c7ae8e182484f54af9779e8d88d46c72349a227905ee678e6c16d4a0b8e9765ebe11b3bdba808376771ed823248df6fbbbb45db457377a053923e96b839116eae4e99d637bfbdc399b282e03dafef8beefa55b657247b097c44748bb68761999628997660538ac04776c62ddae4f68c55a695ebf7f6121704e9db451861bb95f99eba96676790a809f92f51bde0ba3e65670736e5cd5acaaddbeee11e55dd76a47b5443a2dfe6b63e2c15638cb1de556b3d5e8d6fce39678dfa871df9f544975a87702512adb5d6b5d6daa4b47ec5d4f0e6ceaae53a6b0b68ac445e3f009f8cdee7befe642cfd0c1dcfe1eb4f86d88f98d453390a3b5da607c1dfa88e472fefe6c0bb4db86f51f06538df684abb791abacdf7de1b4d4dc8f828c8f1cc4b0f3a6f67bd45a50dad89f9c1196ac27a7e103541a2a935c17bfa45d4c475f0a226acebd728aa2d8a6a34bdbcdf2ec318e3f0499d4f123e9ff85ccd4f49f8accf0f989f5113d6338a3dc7107bfffa8331f622baad6faf763693808f777d472470117610b4bdb7d6c9074d9a96f2aca8e263a582a5b29262802d533bdcd8f88252f29c95131cf822ad5c3612312430aa9aac08b3a7e193213ec2dd22eb554760e4b056535a9c798b3a7cfd55f13efcfaab5afa14e7989786c88c19234b543e3efc9c4531a13e3d10dd5cee1ae97aad1d675eedee81084d59bb6e51fdf088d72daa9f86e0998f80cd8ec4f0ba9e29eb5b1dd11be1c245b7c81a7932c2f4a99989707dfdf096c445f5c5535952638cc24a0d5f7f544a54bb4f8d8894e39e1ba5f885a3481ca972fcfa2b82e653935442c674faf229f943b87c6a92bc2c9f92660fac4f4d9207954f49f3c8d5a72669d5e453d22c92e45393f461e453d27c9afad4247f00f99434997c7c6a92543b3e25cd19bc4f4d124ac6a7a439e5e25393045244c5a7a41935f6a949d2e8f32969eed0f3a949eab0f329692629b5d7a72669e3cda7a459d5f5a94936a5f994346b707d6a9242c47c4a9a39b63e35c9205c3e254d195a9f9a2492ac4f496d8488ef53d32432e531c61893a11511518e056b9a436e33a85a2a5e8f2953f2c9126733a858548cb119d42c1578dbc76ebddc330e2c0ca2884559ce194dad635b8215b7b543b688544d814d795d7c31a66931d97220d60bb6ce7904c37a81f52aa5bf10e92f48375a2dc9a00d80da906d43872c134d0eae71426000f07867a1d590e103b8820f9c344614f4e0e922240d99235c98e441c3c44505062a3e453a0c00cd113656738404aae3c3859a325e4f43d6f4888870aa68e9a1e50c8c2c2b50200ed3949a2561fa7819724b7005ca9293363d78576c74b980a1d4034a193b53422f568cc913d5c44e1121a89e20be355fb248cd9182b265b2aad4f4618183c59407baf8b696f6f8fef01002852b11830557548fb13980221066cf8e9d0b2cb8c811e489c375d2a38852cfcc8f2a11a218e11107891637bda82701d0a8c01c42352666e765061d215d58f098f2b2c7ce0d205036179e0c69e305c8949e2a1ca292f85cc0839502102894c6b6f28ab324c7d28c3981ae54b960f323c98b29589e8064305aa0fe8881c1498b180e4b6aeca1a106c6180c27a81aa926cc9216ae7663756670a87ee08801cf1b177e3c9581a4cc6851a2b1e2676501374c4f3482f4e081f9b805495962038ace8fc6103c32a8b430d9681a33a669c31b2449e8d0c9d243050f833239dec4f9d2e2430b13948bc0c28c5311ac3770c27cd081a34f932538a8aaf478d2507362230e56133a46a0aaef4f1b3e70baf05c58e2016526510984f58488992b65aa54e027e6bbb205a505167684bf14baa2e891716607a7ae911a6344290c6b0c8e0e201930e0110392263c235365223075a74c0c1c597cfcc90180147459b1b37284ce1b335259b8141953e7cb0a3f1c504322007304cb102a7ed0fcc820c81a3dbf314d6b56b831b3355ab4784169ca1eaf01c430862986264f6250e13d915c5986a46923a74b8c2513b022e2e34b891d1836b4101f68b2f4a464d901f4d4052a0a193852744cd5006201518513e84e8c16fef8b051c683265871e0307931fda011802a4f98b0d09387c7c7cbcc4e0c1c2c32d43ccd90d530225fd42ca1da92e1438313254d537645946091015ed0bb8126099c303d23492cbe9894963c61c17127062d09468f2d562bbebc6051b3809d0a489a70ac314304065490962c4bc0fce8a8003352c18401cb71a3ab298e9c25205887e9a0232a0b2b6cc9574f01649c80fcd0f325cc8e7da1c1e8a59a415cfffcd9921a5385ebc51c5d6abed497df4eba706a01c791166cc469a3d331645f7f5259b4b4cd24f0919b43523c2151592cae944f89e827458505918691a58a3cf8f52715f5a951763256a29b5de8a20eb81f3ae84815e71e6add758b9e9ab2ebe219825908efeb98af5b56ced73cd63b3636863446f454f78e01aaebf7066464c8f4da932b612af6f0d0c126892a0796933250b6e88103c5ca1908ca4adc67a0a46424117da47ab53da11137f3292f9af994d5933ee92dfa23c6382ae7cc64add65aa37749cbb8b1be1ae71f6108113943e110730654f37c5961089d2d1c5a529cbc48750152c1494f9fcf194ae933ed33a0cf393fd19ef2ec338076edebcfa987b9b9c6b47a8aafdedbb7b5d6f54918a5388731c6262eaa679ab52eb54ce390447d2ce67baf085c54f3d60f2f8b31e00354e60bd60e3775e4d8b0f2d2d1448897364f5b3e7b7e6ae1738ee173ce8040dcd79f138b1fbffe7e88dddbd373858fb6f559adbdb9ee5297bd1a011f817e7d677bba1170d1c547a02e9f2470d1093ba74fa110b26bd7e809a1675dd58d962411e2a2ec208ac2f61c9e29ac42b0779eb0b0d3859e3d050adb410f5114b69f8002983d0a1f69bf7ea9f051f6bb00ccd565cf4b7573b6eaadef2a2e0a610b85907de3a27ba370d1f54c45757bf7ee3b635831b057577dac51bdbda4dfbce675562245e9b30eec6fdb09b73dce7cf4aab3dd66b667b3576f7d5b9f6d67d8e01c14d1709bf9388e34bb35137bebb7bb13432eb02e2f14d86723e837bfa127d81cf4aa9b7909a1106e1ee441e809db6f5e75a377503fe33cc8e6b8202f319e1517e14ea1ec384fd28df844713d8414a48f5ef31052943e7399a328a144cd432f21739a7350a484adc4f69b9350ba39483ae8375448fb065c64a37a8d92d0603d03bac39d4c6f3de814ca28898a8b78f832e122ebb5b3e222142588c07e09257c5075a07f5075372fa184500832af790d3d617499571de8258442a8f9f68d9e30f39a57ddcd3ba8af1dbbcdb78fb6ede059e222ebb653e83ae849ba7ca637eaedec83aa53aad95908a3cbfcce4accbce6b804e932f42e6121ec34272fefadcb4e218c9210511317590fd11c780a5d9484112eb25e7151920e855b52bee1d5586f20bdab461bf0649cf3879bab59883491f3c48e162d78c26899e9c253c5053e554056884064701843ca39e3a4a93550aaa8668cb943a38a910a7b610f58153c7074d9ab9b27a1f07cd0e73f9f730644e6887ccc7832a3ef83bdbacec04a8c9626a01ab7346328711fee87263d8f67e830c61863ffa00192067e4adad75fd39b4f4b0fb990fcfa6be27afdf5d714e6d35c3682254619ab1f3f28ca38214992429f3e704e98b9e3434793939e17a09ac18c076b8c3596780428ca08e8a9b79fa00022f2d034e5cbafbfa62a3ffbe8ab570e3c453931f90d6fcb1a548f42541b0abdcd6027885e03f403d29fa6221fca0b3649953194f54b0fb9a1334d4286889a9c7eabb7f188f3683d872e82248b9ac01e7aaa1dccd675ad18889ee2dffbb788a6d6b36f34b5e3996a07997a64d38c4fcd1e5b7fddd4fa8baf7511247d76d959421fd808a38292dd9592315d6abe9516a0959f17a83e7282a8d0c745135d17adb516c2a26149c070f304430c1c157d4810e32443eb4a94d31297a70b4201c01ea5a00278d3634f1625602cb650347ba4cea4b0e5cfd41e25a22d229ee404baf1a6ca9d29b73a633d3d2f808dc5f952e759d05a6badf558450462630b12266365ca2c2d5942c74b972034aab438e6328d76bb1d8bb04c55192765a694669293355398b610f965e9e06253f32068446b0a6a45162255b4a0beb0c400c3c68c250f697ce08042e266ce10b0500cccb2ad70f8d1c40b56af490b5b4df8fc7153864692a61761743a60a9c0041e0c30a47962868536293091c21506a78d11195f68c0ae80200882a0941e2eaa219d242b6ecca1b15505a68a8c07c12a3d1e8c5115a6480c3f64aa9674368b8a1fda1276fa0a73814c1515533990ac20670a0c3d5cc2fe54f97a7085ad51082b081027362a64647909028217daf0399302183b4f990a1a212c2e0d5858c80366088f2c5a5b354b9b2f2b4b634e6056c2a402f063910474e159625c09a102c4451727575be2c89111664d8f3c587a8874789f7907cf4ea2b5d6a3141c36338220088220a843b089aa822265e74d910e3d7640b9f101884515dd9d3db8ce9495db102e5d58b4a6b89c3e0852d5e5c7e609932bb32a4c90dc91f2e76a0c0b9da01a5b765a7bbe30615589b3f1589554321d9b64040897d8571baf3f51929ec4b8f34219365672f0e44cf91d36e5487903c788d163d2943be80079100564a8d4d9d314a8294a9295216b5ed8e324c78e1b735a00334a990365964409de0227cd941a30479620c166e2e40802256c8892ee0e12153480e04e8f4b130e3e2bc8191a237627c88aa93d31f4f96548a1bae9fac08405e60989933171747556f8edf9578785df23b091c38592b02aaca92b38a32ed264a8f3a4d1737e49802c193b3225c89c2c74f24099d1874f1419177ec0c234984f16059f29f7de7befbdc3aef68f4f92df76947efff612ca8d73e47495b6b2172b6368685912f38543979a5f46a779f0c1a5152c94c01802258dce3ef951e193ef141e512dd40002660e17307da88c8171c325c7459c8de562059c93520bd13a24b5e85a6badb5fe3f5ea248e624197cc644395285a40b9f1878c42005f5420b77b65ce13559e99ae448adc7bc5eeb313eafb5d61a87c3e51a09e880162b479660c9128312012237aca26cf1924405ac3d702ab04c1cb439741004391429410f7556aeb416b17e3f402b6b1ec4583eb0b14a5569e68ab59725634396ec79fa22444fd69a2c2ac8445193c28f0e938d95428ddb92bc3de70a62b17873ed3885b6c721aaac5f6a2996470abdeb350314769f775fc7e405b151bc4f32c4b31176b71b9131c64ed52aa9e1fcd5ada71ab515839a2f8cabaa4f87fc7acefa4b5a259f92b98352bbf56ca2f4d1ce345a6baef420057a447e13da31769d42d46b4ffa3193a08f399f24b811b0813ea343f600d7f76cb728ef0fd90cea5ff1af763c734046cb9bb58c7b4503b60a3c5142d6b767edd843d868750da82c4f0da874cb0406067677d6c91e3140c9a7bb6e79b5059eaeea2ad80b7d50754a61d17521211221602f8251cb848baefff50f36839deeba9055597506a8c282e3d3555d520c375a5d5a5ea2763b5dd555dd8db2173b8d184453d929649de655379eb51ae934f4049a93a557dd09a3cf3c049997e8093597f90c3dc10a849acbfc049b8fb2733c6b4e73106a4e73eb349a93a890f59927e952905e43852c2a3481d16b0ec2e835b7160541e6333445cd659ec2e6a327e992747596a15e10ba90f5241d790a59140508a4976109259a22454926e96c670a2b106c5e435358a5456a5eab790d45e1841046b8083b261dadb828442b4ecb122def02c2d4a888054f65d5cd9cf4717626e9c83349e70179da1de93334458a10e022ec23e022ec245ab109701176141f541d09b8087b091f541dcd3fa8ba19e9a9dd91156c666d94e54531455d9a9367cdc7319fd9c5b384fbd96ba7f5e122ec778602849ad3d01429684e436d0f1761afa11f549d12ad866b5e7534ec2170eddaaad391a7d5d5994571f58270635028bbad3a99468532ea013a429804ded0881f3f447e90420dc7e64cea38a5f66d33a9eb5fa1ec499fd1f474b0d29e1ea604c06334f7ea05568bee13e6d06a3919eb3eba8fce6326cce0d6197fce196734c5f86a9b4330c4453ae730c4f5ea7cd17cc12fd9e23c3acfcd79b2cdda4b7b692feda5bdb497f6d279f41ced15e66c71c55bbf505acf39e79c73ce39e78cc305e17219e68cb59ed23aaeb5ea5ac39b33730673ce39637b31c6586badf3e49c3dc563348355923f48ecd80360b832d58ba26507d6029ca8af212c0c0934441785f7dbc90b6296e40f15c618638c31c618638cabbe53d61f94ddef0918c618d78a317e397befbd6bf574efbd77ad9eeebdf7aeda4e597f4fba7e4ea8c07e4ec4b4aebbd6bdb5de5a6b9df10e70671c650785f73acc0990df53e2af3f274e20be7dfd3951fafdf5e784470d9b63b0a8097c9a4371cad4347515b29ef40e56661cee0bec2b0cec6b4cccde8b71ce1ae7acf5de6026f5de201886221886a228938d188b32d93892e46c24c9d98c46ab89206953b2fe7acd37e5af972597bff7eae6ae5fde9d7175f0ee8cebc47497d274a579d395e6cb8bcbf66c9575627bb6ca4eb9b2546376376695ec6eccceb04b26b85cae98bf5c6a1a1137777db4f7629cb3b617e39cb5de59ef0d82612882a128ca64e348ca46929ccd68b4da8c56ab95a5cd76bb05e170193268d0b0e14c3d25eae09aa987bfb99bbb19356fee6217c15fad7a010c656a66ad8a4186bfae992a061501506161bf266f7c59741e066831b1abc5c0ad331613d35f46cd274cef96e6036e9df1d57cca8b77209636486dc250a673a8ef18521b21197d408ada31d0f811a3c6980a24bad47c26549b49122c1d7fd26889aac1e58891d11659de4004939d064f320cd1f2e66c5985065ed2cb21b08f08d375b381882e8c43a61aa61bb2fc1e152e0af191d12fc952ce391bb93152a2a5646b8310e677e59c087d14e6ac84eb73f650899acf4ee69cc3d00829c9ce89acb4bcce0a6b492eedeb3debaf49d58f960c7b8c31be9b2634427ffe8ce2c7644a52b627b09aaa7a526e118740d2c0aa4a88140249838abb39231a091f6d7091aca63c3e926de0a6ac324bb5d1a137431b68d4c8835b2350fc28813326c707654b0466802985b92282842a89539c96a8542c7875390911b24800000040006316002020100a084442a128c91351fa0114000c739e48564c2894c642b12047411807410cc3300c60883100196490510e1aec00cb2ebf0b4c37be5abba1c40c81c717bec66256961067ffa54ed45a85c447962f41ebf5ec3a41662219e26989d57250e70e428dd66f6036109e90924888fb69e8cf267b4aed0451385ca133bf38aba0dd53149fe44b0dd1a5bf402b72ea037af37278bdbd0d519e072b8a7b00b8c21807a3792e7d57205fdfc0e0473e8654011d73661c010e73b2651f62f4e1bc53eb1f601e96d9a47eedb16506bf0e9fb982dbf601ffcbf8304b1366843a6fc0146c7c7182080fb18e2826492d947288c0fab2e90b754d41023a2642b0ffcbadd0ecaf3721d4add586e69c2faaed83efd41670b04890cac40e53ef9b6720156e6513af0f10c508550c23fcbe41f9a81403369dd199c32a4924430065b20d02221079313f7e5d53843b54c865f6a03c6b9c05721a2acc0c599c297ecd55d41e243731e5b724df175508f42b46bf1dbf3a94b03ca521bd507a42a6e1e5324bba4bdc0e50e21345e2d0a952990cadeb5f6d8c4a7507b22f63f59c5c0990341fbe31808d635ce693122a847536eff49b67660b929f1ec71c4dc778330ae6440e79ebf274a291cf1151fb3b697c3790438fd207ac10dbcce79bc3855e00960bdf0db31c4f25c9c39c75fd71e67f3a09ae637d96876cdac505517ac9510f7cd2af2bd0e0d51b7226c2eb1d8fefe46cb402ed313f8862c0a565c9f3789b604dc60e0a2a4dfcfb0e30f8446b21e8a09f8e04a834412b1dd844b6f287d3c3a12542b4c272444fc9e750a5280b02582d1ff640f81dd644429cd0de199e87721c5a3d35133d2dc011522a96eb6a4e3f3573725550595cac7ecf52ea10c4c472d490d1315f98a3e90b4da9ddd5a7c0102376bc8ab3529aa3bd71488c95df095becb9c20a4e6bb95dd6fee9dc3d1c7cc4e71f7d31cdaac428ad06a6967b26bb266224d65c0383a258b6c38a6a4464d05a35b504d22b3d3e5a923b0b3bedb8ec0e66287ac135720ecd19f36dfacd48d38b124a8383e4efe650ab3043001b811562e9930f84c8866af9ad0937e40e93d11c5bd9a40178fec3c7d6887cff5b5001832bcf37f2c7a905534bb0ecb0623c39b0e5dee94808536754c48b4d1343e3ddf8e8873baecfee8432989900d67d0d55570b4d91e7e37f1ecc82526e7fdea7a47755e69020201402043a0f9ef1743724ae92c7881876e7ef8f20e62593d4170545fcf5f2828bff6959ee240e741c7acc0104cd9e387bad69a28021a48886fb7fa6c73d555d379c35deb9e9217335acdee1d0190a913e39e56c4face8ab75d311e61998d07507f64c3feb0d739563844d777c98ab6a4749d51ef00057578155b4c6a65e855d1f267867a48f05d0d5af17ddb49c5d6e4ac1a8e6b26c003d8b9e1f7ce64b20a41e8610ba74e71a1c01396e7a6c20f5f8095bbf46b0854f01538a2e7f3d67674d85b4c4aba9a681bda1c6a1c5938f582d1da3788f03a68fcc4c3e685a3a11d34f7a49564a7a4e69c3625b647a4187af9131c5f6775c1d2b423b12c1919e2ff634535c9f5065ed68a3b2a30cbe0b85bb464ae25963c8c51109f60e0edea61ca41508f840328ecc8e38359eae15b3f980df54176e1c2ceb8e289661a0696c742d8808843827541cb36f4c57db4b91e4d290f7a3b59d9690912443bdcbf390aafa33b3e2591077af60a31f60c9e504c14072b8f98f4fcf4780f51e80d7d9ed3e4dbcd9036b511d94a0245bf73bb605f02cb07f3721bf35eddf918feb33fdb77ec37eb901b01fe0753d80770440e1e6b08d01da93986956d40d8debb9fc09c4dc57bd6cad8c34fd917eb16a2f44fadfd71b0aa3d5d69c395049a3eb73664fec681207e4484ace84120b97257117e89ec8fdb2c2d0d053c88e1101d8b95361749e75460fcd5f771def99aebe416b4339aceee4c53987037f3dd4de1986b6bf17131a1e4babc7afbb04cd291ffeabe40658612b56d6cc3bcab4ddf2f62d5f7dfc3ebf86c11ea4398520c085376bcfb14c228d5f3b583cd6d65be27df1282500bb249c56778b340aaa52055608c13f5f9e916e58146e2caaf6cdfafd4c37e21eaf8a1a5f0b1b27b4f5ebc29035c9b0a4db8cb8c588a2623bc421b2e961d78ccc67ae4d9b6a3e9983892e372e088fe178ccc8f840d456b3a9143db3d108c4a9cfe60a68faeb9344eb0615d06e2ba45113be468fbbba4a34f1ecc42224001dc3032b78a868bc0dbdc8ce0a27155f0d01e0d982d2f648f6329c5f72c7071a4300b5df4add83f9462f1bc9d70989e8ee3f99fdf5b1e9686213de7c18cc6c704991c6e0b810b0bf40b40a102bf320ee1208c2133f53f2e8dd374196bda04a2051e20919264f1ce7a1d0bd00f1000130645bef9e436614ee3e4499d59f10f65a519eeae672972f2c09ac13f21a3f46f6e57dc309f8d2a9a0b2f1bc391f60cfe68eef9fcfd29c2eecf3b7acb03775cecde44c5a34d06e86fa97f35611b4c4c6902cc19e6f1bb0dfef1b1c1dfcc6040ba5aa1fa8f2bfe48ce60a48a721b090494ec3854c96fa7b4d451ee180c989117ce21b16146b9c1b821049ca7b1192e1f3bd29c98de00bd9ba28e84757b19fd728879be5c0fdcc6ae8da2418ef6242b31550a94125fc99875798be3c5e205295057030b0fee3864ece79ddb695816201c94ff92f13104c2bcd33048156d41035091f3cb4facf9579a924108944fa797d50b17df49d515e1c39f109bd106cf0f9d38ecabb8eaa057a2304efd52fd7b0c3ab642b13dfaffd82036d145a3dc339edd02f97cb2908b55ed16b0257d2b1260afe5484d80ba5f999a65e685b2044d184c4281650759e17d4aeeaeee00addf188f655c0b74dfa99a6d4fd66a4334afd214a13979575e432ea28f8d7298c5522b260aa47ebfa6410617d4b8dc78c2040aeeb34b465ea299f7ac21de79c70db099df55b0c94001f20dc1d50a72f9768fda5dde121546af0b87110fe346bc56520e70b3fe88fb2e0a9b41bdb654b2fbc6e43e36b385d07b825afdd686543ef75e7c36297bd5a60ace0d885ba641e39956e77636514c5580ef566bbcbf24b375eb9656abbfd76d2e35f991287da7498df16486c6bf8c79d327e1fc6ca006bdf16278f1245511cbd01cf0e829394be97299d9d52bc8a8405ebfa524a29f8337e8dc71e97fc5f6e064f0902176f44883907052fe84e7f96a6842f32b62958c62c773e6e598d191f15c13a1c0c2714bc7481372cdfd1e6f08fa223d5dd5eddde9fc80897a29e605987c3325f631ddfe992cefff47c0bfeafd4bdf3be7fe30175fedf23295edd520472c1e59ddccf986df6082d14cb33d1fa49b3d7180bd49ef046e559c70daa6e5f0619c3bab522c62e441f15d93e89be6b2f42e25239e2414a346c55278dd554088bd33e1a11ce4687d3a4134303765b9537e5377a7110255df03c1e5f6f54a0049208f1398c35828ee3e85d454b3fbec37f60bf4df3d49d8f2f28cdbc597fcf578a0c1f7c767753059008eee75d65da9c70a1452fb628c05d2398531a15025333724bfefe8c263237e873db326bfa2f819bf45d5fdc0f0177637837e1f185ba9aed81202cb859cbf14077fde0174c4cea78fd583279da7250f5c78f2f6d7ed9c11a7c932ab707db462c58e34ac0a08fa5350ac6e41d88091a8c77e70f7057a1bc58758b0189817fe89fa446d89e04f09b9c2565f55aca59d57fcc899540fb957a2c4ae469383ad8e15806e91fa6e02e76d138a5a2787d545acc998db67370229f9e958a93819f34b6ad7ada984fd06d3fe784093742fa6aebb7d55e90870a27009c5e1adc2d3d6ddd07fa543baf3e349e68ffecfaa80b62e7e11b925e61ec50cc6c17ffc2aed1ee82b547bcae45cdad940d951a5b2e35d9d2608fef7b5f1ecb9f82b54239acd5af0cb3c528c822dc2a5598257f031ff4b19c4308a1cea4508a0791f1ce0babe05cfbe95357bf736fe5b165c0abad623377f93f3cf8caaf24563e728e93ee13368e7e767c042fb3a28475d7f21be229c6b86f750a9fff417982eefc625e43c530cc6ea59a5e9a6d0e7a8979772bbf4b21efe7db2eb0034668dfbef7da5e05216f91536169200c120d29c64b18fc658af13156fcefa2fb2f262f566c90958dd45c650f38795e29110742f4f8a887e8d810cf58aea583bc1d6e3b801ec636a881b464ac8732a1a131f156e83a598cbc27a4e81d15819f413ec273c7efe24316c67b266dd1376d8d39005bd931b384a289b6ae645a08ea06a521bdf416d8abc39e1cc446a081ec671803cd96ba14a1f6d65ff48626e1a78ff97b70bd7dc9931350344ad480fece772500c0c50d80760cc4092a3cae60537fc1ecf2b2c0fb93c24077528d5a9d78646de21972a2c4ea57768012fcd31862e0a0276a774faf5f973624354e49025eaede002030c901147044dfb96860b7b23855018a20d7dea1915e011491c817894ee0dd97d1b9279d34e99a1a9a8d236b6c67d81be74cf497fc7c4a3a5e6e4f2954b76a9044fefd773e5507a9513910a8c3b300f84e649c6652350b4ab8b520874d812b31213e373aaf29e0cdf2005efc2ab7442a0c0546e9cf215a3d762ae5ca9022d86986c7081b3d553a911246bccc4cabf276873d4bdf65b4487eccb0b1c2275e755fa48e73587c54e433982171e17d95e24c86ab7d677925bbc8c18f6cdf118a5081e27c17509dbf6d854e50747d722478902ed930933ff7bb0c47dc93a465722b3abc175adbf0d73122f0738ea09fb637dbdc532271307e9764ee65a5e16532f03735997961ae6990eaa84abe9d639a7959d83c5aa3f2882dc622ebbaa5808dff1f670e28a61a865e80716a5e9d313d0daa31ed8eed8e2596dc34f4b0111e3b1e9646e135c2b0570909c8bf48e534d681d4d645204e595a07d9784fd365f89cd52f08815b645ff85562796efb2a9c896fe45b445648c1ab31c1e19a568b16ae73a616e53efaabfa4564c75666c04abeb8b1ac9a1c581196730828cb6bd5eb1c592a5935ab5e38c8284a47ac92b8d301899ab56a07a7589a9b53a4b868de2053546b95ee53ac66649f9b097e724e822773b509272492cc544e862269b376417c0112ff6549038d4c79eb5b302cc16fea623716e5bf3003714fad7523c6bd9cd17422fb667419cd001da56430d2c020153d39d0bac05af3924f4099b98f0704b6a84ddd874f1764396a99f00f273ab3a46aafe91250bfabbe29749c3fbae65f95eeb19bb86513a72611cd696fea899da2d6a0847caa7cde652f024ada32d2fbd48e2b8f39e0a7187300069db6569ea2b0a0eceaff4ac09884a6a8200d5c6c4db143344c4dc792517e698f66c2adbb2270c4a9d0836019c41d8160e288494759a45a314186fe32fefc54243df655e0db8ec26c23a826ad38a9d68bd130a100f24f45c5548de04147a674546c132c2d4ea47e30c75704c56d3bc5725e40c10a652e53677012cc45d9251762b841773c04e868a996a4c4b582290f680e4ac9d1f13af033eb8a15e11d61d66b7dc980901bfb8d8697f0d228a54f0d4a6a1b30c5c0ac2fe6fc500d888aa205e63bbbdc2e30438d28e98c2a620c9cef626fe5b43cbf20c4ea40687ccc6ecd3bde28ca44ee627e1f895a34b66078729d47ba3274929f6b7b6497d24ccf544054333089d3b12c5da42bbbb26725f0f8e8771625db5e7f723529842c182d57b395ef1a6fec201ab80c5f4df608086907cd92f2943ae7ddb0d91f4b353cea9be72e8d080cacefef50ccc30170a0f065cfc7a5e0aae2473e5f9e924daeb92b085af2986a0ae5ca79f2ab3cbe40352e353f6c5567d179eb241aa4e1ee664a0a8b4c108512f82520d62e8f63fc43b613962fe32b67c2a202296dccf3ae3456e1af043afd1c3c84a2a4ede7b6a3da244e4d1297277928ab98defd8182d80705887c2bcbd941e45d9a365a9dfcb158487fc9f6ce6dbcd0b49a41809f54c9390e4393a02efd71705075cb16afd2f8869a111fcd9aff7c30641544880fcce09892a259e38f072042bdf432d1ea701b2960d594baeac7d1f6fb2ab2218e29aa6b100421b5faa5107df8fbbfa3d3c9f746d6fb3de5034a14758c154d143e4ce5b3d23591d70eddf12889e89400432ec3ed118803897310500b0d7f532b08f7b3fdf14ebc0ec39892716a63353118af72dc656578b0b03112cc08ef32ab755a46754232a0659a35611245b7d601f4b6f25ac74e30b25a580167f5eb2fca390df0257401da05246643a64de5375d6d038137ffa415135626602e7e7412237ca307a28d226e9c2c886b3e7cf7ed7b60c9abf13dfee4884a3db46f0fcf0aa449c9b83959e865ecd617d1d805f47dfe17b99bf1c665a7f145c8569ab535913364722271c3a3261ece8501dae471bd2c7f303c0b380eb131ac1c167c120c451880560e833e0986220c402b87419f04431106a095c3a04f82a10803b0ccd85380435107ac83878320e699a95d6cbe42785a3a003d1c787811be7904397b0624bc08df3c821cb3bf324e009c4e22d9afcaa07a3e16bb370f8ae342cf8fc59752681ef01c8b4ff8926f6037a824a356b7e5b7da8261ff50ffdbb01de51127b70ce5e66724f06bbb02ad64df314cabc122b74c8fd33f973e1360a163a3f07acafa5248849eb3b6a021cb48905bc316b3c8525eb327a95b6c8ee32c58d21ca4564f42bb362a9c8fd96a3b947c254929b9326d34b873a25fae489de1edf27c814f8adde1f2e2455a7e94a57725be64e7a4419d762d7e47f2c6514aed9ba08dee658c451560a5cf27204739d5c12c66f4ee470a34d5f9c1447879520ed9a0e7bed26a553f2d377c9557b951a96fafa262d72e7d41615f9aee544ca4fb919c9bcee0d6976bc70d234109fbb676aacbadd9f70faa64bd6fae4de4f935b879df962e29f20a7ca557335c34cafd63a1117b6a61854454b642fa6a0ba16afd98b0105dd0d7cf5569592d1917dfa564592d3297cfa5b4585b3297efa274592f9916dfa5b4ac2f3296efa5b4582d9996efa264592d3073c9f7b1adc5105c603959545e5d64ee238b7e647d8421c21275855648df3ad6929c57efc03bcb06c50a1d94ffb2e2127ea2ac08f00a6828e0bcaa3b34207f33d0a8fc98d0a47f4f05624bd53f033ad9dfa4888baaf619a008f85e0ab1dcca1f138a988f389675d4954b7b1cf99c2573a72f51a6c6389d1c56fb2606110b5057456b15c87f561096e54e3fd2cb5321314327c7f0135e3e14a1b11ca98b33fb9351ce0e61888ad42d87f8c9f2e2c49c58147258fd2d2b482baafa18a0c9ff1c8a5c6785ef844ae69738c4c65afd9950489f845657e5cb0ae95881f8b1b271061fb294187f3a71aec06d5348da561076a34720f23bbc59955f569b0e28e27f5971071f519a8d2b75b26ef56f5eb2bcb3d1b4411981c48f39f43202a447d4c161856ed9b17a8b8dc60ed56a9a474fcb82c30adf9243d88a91acfab54273f3fc1d391beef423bd14890ff23bf98e9f825738dc23829f281dd708fdbf12221d8ec31433e542642a701ba98eee312716eaca73eec75f2c60869cac7da2a20fe96c34677d42bf4635330f6fe93cc045efa4cf2e5d6307c7dbcc3ca8e9f016321dd0ed15e8014d70bd79f3b6d35d73499886d7e32983768c7d1fcb24e4647cf3c6bd8275afdd50b7ff388fb7992e75dc315fc4810cb77b049e9bb0ac0b39f37347901f4cc1396203c37d9f57becb5e65a6720425b186a3441b20b8fb0a1fc354f47e22dd1dd292167dffdad7b221201cc2f42421a800c0c16e93ad67fe7b975ea5b7fa630781a6027e16b8a4f9b8ea14cb9d42903406ac633f3ac57c5f5632f645bc71df8837486f6d218792f8e11bbe25bcab315c7081133885de0aef1badf595976a8e04021b58b29957780fe38207eca8cdf228171f0716e063d41e1c38dd6f8ad7441c1b133033478d2090607b5148b2b1e8f900cb4500fd73229c2f6ff5af122a361c986be1fbb812f3bc37be290f4df9aba9d8e00800bc0de2e924844a0062a8e5a661efa4a97c39bdfb2e79df201b0207a91d119b64b7e25cc00c603b253511494416bf27c5e616cc2d43c046e4af9132b616c1c3a3049f096d0fcb5cd56d792f20a5d4db0ed3c0b40af52f5752816b5994233b9a4c6868055a6bf013e5c5e5f1a076b1effb43add14b841b8dd2f7c7b50c2c2faad6a911b62c30e5fa3a6ba2e8e67e0be45d91088167f918505d07f2c7dc7bde5cfb129631fc8b1474e91bacc431362c6742c643917237568b6337a9337831bc96ebd39a717365945163434562c5d49ad894aa1dca65f2135e772714d42009aa58655d03adb7e686854e065f7d9da4914f511076e8f4b08568a86fe083822d6014aff15fa48a9620e2ae8e2c3ca68dde29e182ab339b021fed62fdcdee0ab396ed620b4d015605563ffbc274114eea168e659a5adf4eceb6b541de112522eb5dd301a82ca1f4476984d727e917756a7d33d31c8b6656f4f227bb3ca5090866de243ae5ffea04c4c2611391feb03a59f36e800eb903b841a7d14c5c690651241e4915e8633fcb3e1d80eda4d27bbc866538103e395e3aa030224ef49bad2fe24946f17958b370282e3578204677c48aa07870f9a5ed5f86a14341813b105283c9d2d51dda9f323cd7aabf05f2f36703f1dfe641ac8b9a7b99092283770f900688ded54c1c4e7c52ce47d8cda76e4337aef41a3ef6293ff918aa89dc5b983411b01b749329a61f243f73d0ba63867505d1618773f1706345df61641d77dadf14f4dad223f2680b4546502204876e6cf13ebf40b855e402bab73bf5861a7f8d38543fe4938b8232ea2790cefde77b62c2947d7bc5dae460aad80169dda7b272a61859c5d3cbbeda45605f75b76a3bdfca0b721ba6d195f104186d3d49c51c32c4caf1ca9ca03653a6638eb58cae3a08887d46d03e37462cdb6afc092c217aa0544adafcd5da8c120ffe097434fe148eb0988684a6f2e3c026a7bca09d4db41d78162c507a886c4d1fc675c83fd20ae26d2c0ea8faca968de869967bb5cc16576949d99862b06ba852b99be3a10592a16fdb055f931765552da5e3269be74347bbd8aed139639d79dffc71334997cab2f3457f4b4c281f9eb960d1c68ec915ec64e6ffff6b8de237ba1942f63c74ee785c09c7ea4c8528b385364c5b46e1df4141476b78763cebf544bf79e82bc70e4c567f37a74b21395a9336b41bad41bd129f1636a1b1ec49b0cb0954875392416eef43b537dd89c285c7ec3f7328063f676681c864b67a17c2152e350f9b209b066137358d2da78581a68339a7ba3c57f26c2136d8e4b85c19c55e2de0cc21466c3fb40c041fbf791a5f881a02923608d93d0fbf7fcc16c0f76e4c993f9805fdfb64e2de1c9f985a07863c2903a6b2ed8932444eee12dab8e7a1e127e411551639fdc804f51afc723d559d9cef2f8fed3ff0bb774b62fad6cb81490f46371ae53c33f1820bac90d9511a4b302d8659b4f2f41dd8140e60c34ba4b72eeb65e27f87bdfcf0ac494d9573c7a6a9578fbd2f7c4c7262289223f8d3b19b2853272540e44b14f79a9c50a0d29a197314b346427da0b71ea6ea9cda666c1f256b6ed25d36a40a4ad528633843ed458d4352ea280e972e9dc0fd73af7c4fb85aa05a65c16f45afa0b046a74bb398af7bb568b7e92dc325d62b58c297286c079c5f4d5ea094cab410599ab228ae5bd42cb9b0550c823849fa150d6123e39a9109c1bfe1d5294ccd4d27f0f71e05bb20bb7944303b9e4865173b0276cb7db5d2cd2a4440de531e10b08b91c22875854ca192096c45b73da0a22e0102bbfc971a1d4a16b9567a680d54115cdf68e2e245d928e96f9b292af0fd69a1b63640248b1415a8667cc63d9563d133a04bf842cfbc75205ad569daaa3229c4eea79096bec8489fff611ade6ce7bfec4aafcb06897aaf2f52d9c6a188f628a595c4711c04af6f576ee770e9a7668dd48c5388e78e9d156ed4aa60216ce7273f6c019ad7c7ed192340adcc966b9ac11a4e28d9eb66030372512b97207c5fd1d8c97f59367064f1c7d61c46594efa2ba8559256e4d9b219fcc404cf2e251debde7c0530e16f530fe59123b857f7871b730b53da85541e0e0466558c6dbad40d1b5a59c686ce60785f3ec073488c07930041dab9de0190064d7a3687d75fcf8a40cea7dd98bc1f58120aeb75f8f4fe5b481286974ec6bc219d80844d4ea0e78f3736c9a16eb010e07c889da56e5e3e06864c46431d1742afac1b8cdf5a0c2ad465e04cc33e3530d223ccb66ad5ce97075f5130e8944ad9a6b662e58e44e93752c1923c444eebd6e1eb90c49e916eacd22e17b2249cbd2a0de2a18ba3fd722a5e84ab80f7d7f485650b321d6b7c1da02ca66324c03f77bdde9a5949d7bf3f294a6830601becfc086e8d2a1fe38e401580c86bba602bef865d7652fe713645b7cf385a9e0b8211e60e432e12b9160304c251f2f095db086fd5ed461e1a9e14780d80921c14bc734ae5291a30d04193cfa9ba8d4b9c39871478ef4ab18394e7012bc9abcb44a5f730ccdd74fc1d2729e8ca8ae8803367e2548561a81e4142d7004e5a8bf373ae31efdb3d1e7a4ed81804bb950c5db321815565a8757ba5512700a1cfd976bf1e72c1c6a47a80eb5fbfd2075283ea7d27e6760c060350a6683ac942be25de3f60370e5a416265193c2e4f17f7246be5f7295790ef2c0a5367f1c9a007053c56e2b8923c8fdbdadedf101fc29e4feb1c715bc1a0efdf53e775d02233ff0f3e1d54e97ecfff7b8f14756c78992f6a60368af7ea860eebd699abcccba994dec6759d6b58b6d9371cb4569bd0f5353f88896b1834e99626172645ba8924f6403d947701fff6c60fa92982ae60386572dfbb23cdaa0f928522048833745289fed72a7c7dd3e787dd8672d8240ea26173ae38ae663499bb5ab44709cade8e148bf76f1948cf0cb4c219b2f90fd0d54dbefdc87ed33f5628f541e3d090d8fb5fb29b6870088d81e82d9554a90ff23a8d0ae2dc6325a5bb2482e1a26870e7e4c4127495d5175abcd26b9f2ac936a93bfd6f054832b0b793add4ca31269a2644e0921cd38d490c98acbbe079d723ad5434dc4b737b6014a71b09f2ad5cd6d6c6cf5f79298d3686dd577ab212301efd3ac92637027a5912993a1e4508c3807fd69a6132a7ef21c29b9f8541f6c1390ad1be0301bb6a05f510888a99d9f586d0554dbe8779a92be1f6d695d991177ef3aecfe9ba20ba2a961ecaba3a221dff228186a5cbcf0bc822f50c26a8f17fd6f8aeed5e9e71edbcb59e526f307146ff29045a998b42d3d191d6ec468b6a9d15f79f1258236856f115e4d23a0aab128224d2106c0d6508f7a2b4b48ec5d84e65507994d996d6410385844a58c85ea5786b8cb12ee9c64b17c706a3af3896c008e497d6812253380440f20a8eff448ce06818ca72abb1a628bc653b12862d71d818f209c53ab44bcb3a75a558b79776fc14420a1130eb6f273ad4d7f5a70f5d8150f17909db344f40b19b566eb1abe4d5949cff00daeac422d05a330a5b4be99a95a31e6be176f41a2b8d3a0d0091e78fd56a040ac90958e1e0721412206aab6399c69ee9aabb4e8e7e3cf60e62daea721e76134a758b0177031fb4d56d91efad5da8ed3e0210543bcca4c10fdaeaa0bc2a78797a28c56234d773881b1c86b686e30d80b63ac380f4255517dd3b9640f3664204b8937b31dc015c0a6d7503b2811e96dc860b7cc3b302708ff2e7c2458399e17d81f81fc774a3ba65f480eaea3e3e7f90acbca53aed48df6731d684712487196381a6a6951759cf3875d83fb85144db9affc96be55726750f0e990f0eeeba4016b9a246d4617a2ccd346f364a6b66a382a84b2790ca010900766ad6fdffbe98021b76e9678f2caf75143e7e4fd5a51d2183ed95eb44b816a428d3821b6a4be7052d5167c91d8ce11215b242008aee266a2822e0d41ae5b483f51269c214b25490d3cb7ead19faa5b9d66d7e4cec1682e7c4e6c71fb60a4f79044ab4e9ffdcd9db492c6f83d0d44b688668cd036de4cdb03715ca7e0024cf249348035bb3da9ff08e5dbbf66e075857575e4d993303c6c41be5c89d51b1530bc462330854edad90a12f2ca241ff547da5a36a2b47ad59396a0d5686d98673df7cec32c1e9251e5d06e6f91537a2e2fec8b06e9bdaad9deed790b8f82aa9d320877b476d06041604158b7f6849d96c0845dc611a7c656f2a02fd6ff18a311f751c2f88a29f1c10da268cb724252a4253471812cdf59937ba992e0c525383a4efbe7ec5ccaef1d08b48fc26f4ac19953b335415abed8d9c37e160c64a1ee4183ba89e455cd9287d63a8e735068d920d1b04a35ecb17abdc28bd6427caa0f268ea1b6cb2eb92888b21b5d66d5ee5fc6738d64e8ff8377981470f9db8ec48b7728d789ee1a36ac56d2bff7ceb9bf837d2593d43a37a62f3bfb49ec2d08ba600f3fd4420b2de57b32b188bc7dc3e382335b4d29ca6f710e361d4d10a6f8c862c2b3fb795288ae70b7bb09eb1edb83ba7b681a8fda90052c26c342c45081726141baa2433636a98e75b239e256ac88b1ab6510d2aadbf6ae888b85ced402b3cb2d170429ca1002f4ab3107c050cb462bab70eeb52c2f26ed7fc839692728254a81b3f30b1a6e543574f1993cbf1e10e9e88b9fda7faafc456968e0650bff5a5ced4f9b6adc81ad0bde6c6dbf6225e4e23fe49e1e2d66ae22a81110ed5eb7e91d6cfca6b8ba976c7945859e82a343e9e74c825de9f73ba318fd2329c963e0aa2795324265052d95c448c73112007b3344324fcfef60ad5e47ca30c254c02c7753aeaff2c05df376dd046992694f0f5acf5b57a9b9ba215828c65d4df5a043450389e6ba1aa531b67330410ecd60a4627084b1d3af1cfcea34edab29aab22cb2ba31595b9756b7cec9595b8b36d9c5fc4e6cb90d70dc12e32786831b74c1f98c44fafe8f21a749c5cdcad45cf34d0d73c4626f4059116f1ef43e0d6a873f4c65d562afddba6f8a520f175c2c7534a507d2ca77d3c7491983f76f1b760d61421fb1b8473119b5f2fa79fc7660772696b73a10c8c06bc8ef96009b6a9fb74bd88ff1efe7366423bb1412185855342d54853588024b9e9c6165e1f552a121c97be5e8b6b29e756fb3862bce4c948ec26a5c17a46c41ed326b8c69499311579b5d9639990f8bda677dc90c77eb3f8cdc9b3cb5423477b9b2d97b591b4575b1c6d45468b7db93672683b089a558818c3906eefc2eb892149e617136cc2603e961d098e1d224b757e77997c98bd11ecf47ab9d7efddc1cbf0c372bccb6326fca59d0d9f66a121496353cc23b854438c49e2d9dd1ad7be0b2477f9acef30bb21413f817bcbbe646773657bafe6e7c167b2d29750475c3a4702565d29602b3f13ebaa6253ac02a1d1d5c09b1987f8bc2b5121151a73f9e9719e92bf386c011c5be75278b6d849128075214082490503ef34623157492a1c1cc42cdd61d040ff09bb6f00b540111d1bd3bfb2b94fc3e39bcb1e9f5c56a51aa6da32a19ace83a3c92eee66e6931ffe3b129d89e2c9972aa39eeacabe8f19c2992533f1066c40a29c1022afa5d7b2ada8eb6415a5432a9bdb15aac56e9c8973358473c866bfc2bf0416f640d081200e6c29b3d89eb46314124c855a8f339040aa8a9fc0367f13596fff80e4850853188e07282e7e55361e28d1e0fa683cb8b12e31974183be89eb065dabc4d42cf99dd0b0c3098fa590895659c8886aa224285f3b58be94830c63c2a31244ee57982278446f4bd8c06578c9da7d7c585cbfbb01f6d55c15e7abd5ff5c244c960e569ba691bd047fb8fa55f3afa11c5f28818550da93716f1d4cbe722240cd42855029072a0ba63b8709f13c808aa61acad1414b52c39ff1fac40cea328bc76336dda3c62eb056c5b1f51f12e9c23fd8c0314f16f900d22b4f8521b7872ca022f5b34ef86a87fd7842c1d84d563cfccc5c0c30aa1bdbcbe4e4bbc85a38ea7f537f592eca5e90e66553d399ac7b7404e61f38cf8cd941a1684b2d427f0d42f9cbe8ec643211d2db4e644f845da8853d75427f1208c665c8c3f6e8a400206ddbc622b587517724f469ec4bf2402e5edaf1374f9835a445e25487955d3543ab911ed1b8b08b29e3de011430ba8b16e33aa1370ca48108dcd8be3446ce2c76fa8251918d5840b6f54a0818640ca6c0cb4f8f053ca3e830a977f2bec9f46324c0a29419b8b2556b96a8c024a01b3675441d54bc40f205d3b5f110a5a67c77f2a8ea29823e9d991ead542fa1f940fc5c0471d21bd3a41e69c101c598b8f66dd23795304db904bfe9f9bafa1355a23a80904e104ee77021d1964f5e24add201003e7b61c93b01aed22f83986023142c4bfbcda90486e0a210725f62898e9ecb8699faae311275420a3b9c16c5717e61ae6a9bff4fa59406ed90976cb64b31ffbccb134b731cb02b28e586bb6aad29add374a5294490e309ab9eb2865e053f5334a384aefdeddcf68391103cc8113a436d24d0725e0a52225b1cadc8d9a273801556b3c955a9d16df182e2b03e179c773b52fe8af28e9952cbb707dde0e305569515aee5c58d33ce096798ddb7bb0071e509316377287761c2d5db2b8b9e1ee16398eef932b8673268fc5f6ec460aa278402f79b4bb96c87f3701bca8f4a13b79fe0563aff691de413caacdb71eeb24dac3f8465c012d6092a86f0ee577effb2ccb76a48f83696dc253144e23b0effc7a02d4ab0c7b76fac9312f3364db375b733867d47249b7f70528679c660f3925e4057b9145964af96a56f50c972f1e73a4bcc3d181466ece1e8947671f1dd856e4a71e72834f1dc47234ba058512587d970f09284b3d932433b51b08afdd3285418bfebf04fc84ddf70f1159626f5d31757f58141cd34f4df6fb1917a861fba3cf943f96c10c587b31f2ee7e8c4b3e18094aaae1d2f104623eeda9f2b3231a8816293c5af0bbdb5222c2eda29aa5cde982665ddb7d4ceb7f8c3c649948ff25a271d4a1dc52df0b3ef753a444006d25eb21a7ccb1393d9834b286154a01b18ea2ab869dd7ae0ce4537799913b3418990a1e28037e422d844088b8b9a3b4021394baa2214da8bf30e0914996071ad25d0c3b8d8c1cfca5a012fbbdc2341f20d909d4e77ea407a9b997fff96a2256cb99c464cd3c90b9d25887acc3c579c63fb80a6eb40a0dd68019999247176b662fa54bf05cdf626fb438639b9ada96bfed873c3bfac55fee82a36e73aae27719279ba176090cc021de6bfc0e19acd1f9adeda4c33051b828fd3e41da347a4ed47ab2a4ef5b87b4fe1ba8e88ce6213e2eb72b367a98f30971ade4172dab8a1b98f2e17b0ba9e41f0e4aed198a91a956769fa0b6ead79a80a7805458d73d56b755daf7bc48cc38909ec98b0651a328be37c40a98f431393632a110ca70bff78d972f919339fb48e5a4869209adf5eda891901c56cd8f6d98b0ae745fed23a4d93a0fab3563eb5bb9da0a863434949a66382a56b6b9089938b62df738f0858015b070c55570ff57bc30c76f3843b4d118a1ec380e24b1136780059d8225337e3503f396eed1d66802c7a80dddbea735c40595d9e364805bf97f3478e1ea74b9743d0174ecf1f094eb2d36527fb3ce50e330475907659f2d1b5af087512289b7d44e7c60b09b2156ba6a7416d460a44970a9d989ae097c1ccf482e39dd484ceb66c5ba37d232d5bc88fb2b1ce159970af183fa938ac93931ae98dc04502f6625d86099bc9117854cfcf67014615e6103fc451fe5eea899095556408ac7417db7c34aef0ecfb6d438298efbd9c5c0a8d433ca061ac1e4cf57cf6d568b7381cc8d02cc3c4836aa5548e18b8c6bcfb8cc678926b13f5880dda056f47132bb71afde2ba817436fcaacd31b17e6cf2babefa5dcbf5f210d9a0403a516bbf333fa9437d1f52b769aea7dea53fedb0cfc4de8e67d27b6559c2e73b4b550d78ce2f5a580d9520779b9255fba16946d2be04be897c5333ee0a5e1641ca9e99c10f8b6d1ffaee431814e4d1aca383b4113414aa955aaea8cdfe47389d8e0eed2ced934cc37ebc49f70226ece570d060123cceba76d22100f0189d25876826fd464f4b65f99850749483f1333c710705b76aa7208de070c1a1e4540325bc288d27efa3a0a5e09f87b671f727b88d24bc459935ea295c6453729c5854093f15b93f537a04571ad67888d7815c49b59784bf2029a8e998f5a9aad96ebc66db4104687c4f0f3f859396883ecca4fa14607b1393b13d65ed1d89c6fa97a94f7dc3cdaf160971219e655949993e090ba63b97287000874dac3aa74f33bda1eb583a7c20848c71b1fbca63217deb4209a1d52dedeb7233690cb1424ad10dc0e5879fada96a000cfee90082cdd5f901c7e7175aaa1aa8cf03826ade0415c734cbcfb3aa520cfa92dfa6a1c1c378335095e7d7e4262c33506a03810c279dbb9eb391e1c819e649ae96de1213d3f46c762ed53386ea74696ea6a412dd257122899d0e9b04dd15edc29fa943bd54d0714f68a2e789b564c904bd9f892b0e2b1384c887688c10266effbb8bc8e80c22e444e48fa9e0c3fd914776b6b7dca4acdbbe91142862a8bbfbe123ae536e8c30d4fa42484c4e0ac560a89bbc89aced1796af1b57bb01a2376320ebe48a61b84d7dd7902a4c96ab6d5e047888524ca25ce5b7a7cb6ac4fb8a2d227630de9b6d65c50a1dd9faa69fd00ba08c5ebc9140667e6ac3cc971128597e78041ac2f0420791c6698c2bb4543686c89884e580a9736352a53fe531d03ac98a57341ad66b4c078ecaf8de658a3a4c82409a75512273436cb31c518b962c298ea5026048aa4c77204ff779461ba57705590cf63c11d395196f7cbb9708987cb1ea5c11a046fdb8ca0605eb09646ef7641e5d8032cec9e66020f46f19c76e9e6a91962fdbd018a922c083dd629078e8967ce7a06333f98a49a6ba2c218b666b1886dd04ca4085acff989c3ce968126e4b562131a6b47a4e2cc91b6bddb6bdc218c801c8b3e7ac66a29b526fd49b8802b98170f8b1ec58d4a266a1f86fe2ac975970a83cd6308aca1a513131022594aa68d9633e10ecca19b59aa33d5f23b1b79f5352f8c9910a12995cb0a2fb2e2af817f20b9493a7c4de262000404368f979df1a62a8b42363eb16bd86827032ebaec748cbe73c690eae78cb5521aa46f8a99e992a433a4f72bda591d564c3294feaedb0e7f5915dfbb326a8495c67a254529ba16484a183d8615e25442cf3915d73a9c06d66d684c4cd6338231373afb8118844faa81c8ec8f01903dc162635773d6d61b5c8f9ce0500b989e699d75b160e5dc89bc716ca3895d867f39adc543bdf82263970f40a32634eb3327d8bd63aba21f6984effa4e46093759f63aa82db04b2f4cb1a216a970227620f1b954715f60f7f1b9eb7bacae0fe17144b858c3772ef4dbf48c419db9a49084870d5cd71ad758e9539979c232632c5e9c64da76af66c17fa7f4596494a0899c49b379ddfec460ead01ca4174f4e0392c1518f56b8d0af8b9d22752c36718ce6b063fc351971938514b7de0258819b4d31777e1744fee5aa70cbf0a31723bd88fda28963b2040e41d14d744c772832fe7dee1523296cd323bcd84071f385715207c38451eda2397ce11211788c342b9129a93434d088670d26252ce15544cc543f94be2c884c8532d12581d09d46ceba3513d98d84b1d6f3bcc47bbc1b92b34f9f83726f2d0c4cfab41cfe97feced33912713e9f00014fb22cca4453f4b81a779444f43428b3e8c2b8a071df96398c9076a1ee828733c7627390e0ce558eb352efc9c4009dd9b97f8dbbce285f859a37e5176f0bc9530569d6c3b5c02e6404644192dd2c6c0b13b521bfdb1b67dc171bc6004e278a2b578b3edeb9085d0223d13febffd90f03a3462efae350a919f9328bb8caaf7a5218e789440a409ae74ca6deddfbad54e8fc984406d3a50cbf1854f3663006097951fb3aa42ba933719277461d8b2d6cabff389d2895f5064909120a48923be2c683a1c4f68a03f0c09bc2d8414a658810a2a04ebd77ab288de4c30a95490d0ac14fe5b895289896490558f63bb67c5216c5173e4a6e40ebb46ee30c74b6d4843156bccf26c8eefdbc947a2768e5d36583ff0d74e950766e922fd38e43f5a2933ad69f6fe762e75f6c9d5a727b4002d811f9ba63cfc8beb356e86e95c71d03799ed981684b47f8b7d310b7580dfb4f8e204e797ed967f2b978c7e2dd43eff3d0786a065d928d60668cacf90eef34eee9f09d4fb801c775d6860744eb51d094905d8c7911adfe1faf2c867fe4627d77fcb9914372493a8dd003261f46b2696473134c95c371dfb5bc39909bf9fc390d0926240f97d4b1a69508e58763d6627c50b7f135389519b744bf9f04decbe7e7ece99a4f4c74509164d31c7a52a7c0d1b88f1c43da4554b8039c441e9c675cf034023555f0be2529cbd5c248b5c8c9f2bfe3f016d50b9355f41b0c942d7174328f242ffe7f933385353989d402cdaf0632ea7ea703b44ac05576fc03130ba251ec55af084f5c078dee0c60ff0564b820138a75564d26b96cee84358295560a0877d3802fd06521ea252904433f201767caea11d05677c2d4192ab5bdb6daa6c0df6f4e7c6cae67155284002a3c83844ca6a26b52acb7e4be1a464e42fdf15c9e81dff6681c3e5b824bf34b3e4cfce2ae58b22a4b07d85ee104d9e9eca5b9ff326d844937e396d94bb25080801d92ce8c64da8657e4881c630b95fff5fc786cc3caa9ed6529598e0fb9045049f3db5ad0eba7a157a67a9399158ebc0176ac1b93da76c61628f7954ed92d5a371b9a0104752ba50d4fcf2ff575da5e51bd8b01c808a37c13cc38682e7c37193dae9162df1a3440cec77fb02374c4ef83893db3d79009609fa70859a0f2f8c60a1d5432af00a0533185542bedc65a93a173988ed74f4558eb35d165c4baf3d98b3cc1b73c9582cb8168574c3352a3e6e4d6594f8ab17fe43e9eb55ce1d5ab9e208ac574bfdf2801e45b7a888efb056fa4683d11bae189ce3f90c703b7b4f170b0a2c3b6acfda06997c2fb3c52c0567fc45eadab090f713e7c96ce88180fbb424a2656cc97b1e324dd855576bd54733c65fbff84848c8c170c000061b16b805f5999238343fe04ce5c28a8db2af0a120578b992c53bcbf994cc6530a0f045a316640495df2310752eba23a4aef186368c4e6874984e648fc68e81a87b54158a1b87477d7f2cfd8802a44942252f0b7e54a6e3ad34b8235ba8c3f01313cb375e0e7eb63c0e31e91b8913335d777d912a5201ba496cbb2313a73a1f96f6248a35771cc67622c1fc59b84c1ba040cac4b26baae4b26edfb65b50446f4574b2ee5651d30117fa83f32db653d04eda0fe4f470443ffb0262eedb92fb906b3e97ea8b365924cf75c0a28d97d3460ed23300c29a3a08a7fdf97739c1fb210a43652127e66beece852db543a2886e79d17524766c719b4b0e11096c8819fb6c10f14bd9bc019182734ec0cd1a16152e3e5c31f78fae7c85d4693fa7ea1d166520297de6a0fdd8cf8a3c139ffd61ab4b43279e381504e13e44252aaa415605cb6af99e65c50c984b618ea26dc6f3705d1e7af48902d40d764e8a58fb917ae5cab83b27b20864d60e05036801b6bc8fca352ed0bb99ada1667f482ca0bc13626edfe16aa61c214ae32fa41d14330cc5c6ba502711b32a1b2cfb96cfab76050541bbc2df58e661de408eb3e2795f012bed2d0ef3cdb975c98dd0ca3cc4540ed395201f327fa1d19e969ef418263404d687bdd35d2e413ff70d77785033ac450a1e314ad84de76e3c124eb547629026149c2d1b34a54a5e0710ad1cb261116c2a94e891b5bffafee94ab3b621ea7914986fbe653422829705f2ff99e13aa443c2c359001005e48573e11419ff9e4c5a6462608a5952c3e268508d1804745ec4ba9a536ec7b9eb80b095b41fc12fdf851ef25b07fbc8dfc4cee522ebeabc9f2ce22326b02526fc04d49d410b5c50c9d75f851d599ec506096fe00ccaa78b0e9942342cdaeb56295c2e96850906482c029eae0089069015b76e88056f4da7eed0e9c12a01e0aa626f6bd4bda0b6f5c0bd35101507889052172739739cbaba778eb8cae9a8bf9285178fb0f08bfe28668bbac2e71fa5f9ae9c07f430fdd8bd8233911c4620a9ae8e1d15d032aabe3d6f51cb44f9c0671b8d1f4b6d13d629b73a735156ea11503ad5093bf217f1236c236dc2d1acedc3ba4ef85a9c00e319c618f45c205f5a14d6355653aed2931227a44ac88ac8a0495a9975f33c94896424ea9c145ec261f08488141f957c0485acd0007adee764a0bc3503c90bc5b0e9aa9a4675ba10552ce51ecd68b2c7f73c62db2f985ca03b5b0a0ada0843a88e177cdb058306d2a94d5d090ca9768c269cb662e5a6fab24eea2a4ef6c3adac45404b845cbb83bbf9a938edc73b12ea383beaefcb8de89887bf343338665787749147da4425996e118141ff49c1020aee76c737216109201bf1092508fe2e9dae6aea1888e32b47fabf2c72c15935827cca01bfe216fca72a398d4082fff44d586a12fc3c1da55579a29d0a035b5b717a9d68f893ef5e1ef069f78db6dc358b164b08c1a913236d052918e126a14abd0a45fdeabd70307be58bea683f077985909ac83ba4651ba6418cc258bf4d474062985218b9ae2fe170f4ec737106d88abf10499c4bc31c8a0d087b127a1fbbf516659c39110ef6d9399ca225abdcc1b2960a2dcc019253bdda40b6fe669429603c2aba908744042baf76a32d1de5e47da17c8d717856856f8ce89d14b60ee827baf4f93defa8886dde897617294835bc158975e0656ddcafca210debb0cd45d2ba9a8126b07c5a5485c3380e248d820141fb444b09f3375624f60a8b1a9ddaf1707dea38f14a931ff9d6968d6b1a2110b608a9fc876c0a4c6e0b42222ffce37c2cef6780263f3d738f4c874f4d5aa539227dc7b9378ca242bc4d17aefecb03eacdccda94e428f1421469ddf8b6ae100cfd392eaa47ca70a0a2ff990c92dc19c1629a0315b36b25c34547f0ab199e4279bf724560b4ee55471d576c1d603619561921f74e0119b3d023a8729110165c572a9dc72b1f1e4775eceb46929241f703d5719b8fd108200923acb7891d04d6dfce6463554dab766dfc35e618c3143e80e1aa8c132cf6b74b8c60ebfbac43defd8af5bb7c93631fcd4467cd2f403ce0abc8da461ab48155e9b05ec4f2ec2c617fbb348b1d58deb34c29cdd2722b6fd911d6cf4fcf3f21e43213023eb2636e77803e7d4ff3356cc9ebabd33ed801c344dbc5d77ab8349448f1b806d375d800e9d082e9d8516a81aecd10e8e1a91da89b4047a696a0ad5b78ec0ad8a6cd381fcce260c261b894fe3b43c3cc4b12b9dcbbe2f725d3f262c15c85bb0eb260636f671349f80b22fdab6ea0dc87492a608774d77f7845f0310fb61fc8412c5f2941e2f634e9b1df1e4b1803270a9d0b1f21b64237859f8118859603a3bc5403a598f09a439aaed856f98239638f7504d6310c3d6533b55e96502b34bc16bef85b68b355f4f90e388cb4bdd9dafa9b00e706a4dbd0f670b75514061a3bd41928bd4d3d3b0505fd057a846f4fd63ad2c8af85eb69df9d0baaecf33666cfa24850a935448d071159dd843a17d4b352880e92bd99aacda9dabece1ed0bfd7cbe2c943f1216b210b0187b3b380693643147ed03c3d769977806f938ebd829c973beb19a511b9b5f7ba364f2fd59dc9763ea4e72a3e12db0541373f5e6765c74cf3195176d789ca53d2e253c4b40bfe8807b52a92edcc64216de1aa5018476821bb36299bc48e659d143d4b9bb5ec20090cb1607b868c7eef5d79ff1351b31e8ffbf56381cb89ed3fa4b45394a7535be204c6bb9e62146b64a955891acb8ace3f39e87f9a92a716b29ed52371dda5a401604059ae69cdab47a9e5bf47052f7b0a5e28cc535cb20d414fe9b574aab600042036aa1651c5b44b1f7c5403aab3880edbadc12da65f4bd64698e50b97bbfb47f14b4281382ec4a04356cc4d281c137aae01c151ebef9b7ee472bcf8cd9167ebb339dc6f08faf3c16eb6c9ac2c61e2e3b18174871800d184ca4029ac0abeba8e53422af8767eae4281394aa1c6e6826bbe474c5a507a2f5e17737973ed2c89604f333a5e5bb38666cdbf5025d18c951bf3604451bbb0a1d16c596b348a2396e32919a37e1bf6ac4ac8b790cbc1bd61b01a0ba6e061ef0bca2b356ff9c517e784430d1e83d79660f75ecac4e837d97d7ec1ad957ee8494a0a14e104d24e0e94dc46f1483547ce9a1aae8e310f8479aacd1beb19a63cfd4b557caaca2fd0ccc9b27d83dee963aa551f80f3925361aa67f9d2cd7df6b6dbe1569b4925f0c63e73f273e485c2e1201bb27c69f9b66dba765b366314f417c69b28074db218cbabd0379c5d2a9057881c1b6e5692ba146f91f5d25efc9911212f148787ad90ce33eb1b0e9ade9a707f7ac03e040e0c9bf61e0304f5f70f5da720d23b0d17d6ab141396d3e44de2675514d7b1dde736ed0f8f6e4881c4d608b95a587a12a5a3622bc905d4c1bc438b24b342d24825497b22230d20aed14b2df3a657a3828132caaee2e1f74988b517240d330435132c3724407847f7b18e6552b7a908d790ef632670dc0ea881829fe807c848f17dbf001a6ae6f2cd77f202741cf70dac279452b0a3ff0b4e38822cafd691968dd3f3a079ec8f521e995fe2679fae6a116454f89f258fd12b61610762510e10fa976eecfb59a26f12ff566e8196d980413ba403f834f17ea881b517d21082d3e047222c00168c0048f4c2901e865731f55076bcf5c432fda8ab9d69b9797527cc5863dd387f0371f7f5e569d399d7ed36c0da9eaac4157e2f28cfceeef42806733a6fdaabd41224a08496e9182927370559a9f414a69b8344011d1e0699c0e82c663b75022b56bc0e159b175e0e418ee4845b0e36077a54496f44f2b1a3824f0bf99106f39bf892f5295befaa9cd044bbd289569b515f42c6631c090b592e6a7c6f05ae46009769a7d15076353a586ea27a0935beb16e3cb97aac7ef0a6b441fe306eb91cf27693acfd6011bb67e2ba9911e59be3e6b03b273924bdd95aaf1196430c7d3f19a26f1556839bca318a2635e3210640f10f10578775b9c4efaf43815955da6b2a166c89fb0f9d63c1fc32c5cd6d8ec5879ba84f42c635de1858a78deea28356510190c9a03318830d06c325b589f742bde514be73df6d63cf2d10a3b76a7245f2c6f88e53b2a0e0803a4620bc44b869a7fa24c8cc2d136be2a07eac07beee0e289cfe3353959dfe54c79bea0805265e620c09b48001aa25194357508c54ab038044093430c588c183c2262a84b09134070019c27054190083021b900c0200c25702001ca1d12f35fdcc5c8e46dfce0c26e0cbe820b4624945fcd2bf80ef9f84afa3d61c8e63ca6565a3646b654a29492965370426041f04dca8097fb8f54e680425ff66d97974d2e4fcbbf2d2a4f7de85cce46ec75c328bea6e568035a71172efdf95c6d4a239c3ba69b6362fb311afa1ee30a8afcff2850579d206c2e9022b28caa9f3061b841662af204b389fa56e3dd77b51c61b05d543620151818c92703232a29866477476a01c67bc1042263742c9a90858018e4361433c23364c279bd785ac0b72c5e029fd5a11725dd6f510a4ba873041a019d7b2ecd2b205093bd6dd21c6744fc939e7bfb108c229d355560854519495f484744909458c4e6ce636a1493c3c24b75d125143c49b55e5c11d6d66e3a9f7decf8ab664428ab0c45862c858b03445d06eca70be05ccb88ebe6060ae604e3ce15620e299853552b3c2b862604de5b81d9570d1e9e280c910dc4edb5a0a17d98e50459102f512527241a1326299a1a28825c77eb8c274ae65209ec63ed0d5ecd094515f88c78f1600187383ea4af399b27680d353c3d40a0151f2c0d5dd9af4e81cd910a229a09d1536ae17cca2aaeacf12538836a5ee2c803a6456c07c612695e8d65024b989c8c25a496041c480b8563226a972ce39e7467c8399c10159942b23373a11ad1cb12429950d76e50d2dbba2432d65a794ec5bd7fe77efd22eb46a93b6805e9008428a6939494467670b1d5f6f7136c5fec8c98155c730ac1dc9efd1867943db7bef6273f0873b22177f301e369f27038ba10b36cc32e74fefbdf79cd3caabf7de7b15c6f8c3356bd63eacc3be4cb9cb466c40f293dedf9a75ef60de7b1fc6c4c3a6c24efc3ccabe1e60b1747763ff6cf3c4b77e23be41d53d4de5496129694106eb04992354442d5183131784ecd28adbd9faf88a993a45c06229e79cf314d5595e4b9172cef95c128b21bba2ea4e47e48ed8c61fae2ccb3bdf7374cab0f99a68c90fd99ea536c67896d29e76f25a9a98fa6bfa3b0b0b8b9265c9da7b2753a4f6de8b58a4262fe3aa2c8d8011f5c52d09c5d3045ba999caf2b15ad10cdada058551e872165d67a9f73a40a7959c735e779ce53a24e7412815c847eb2d084703901338376655132acc5dd7e355146994586a54e2c072525860c1a456a20d4dc56bda83c962b362e2b0cf3437a0134726106818360da6ee5cbdf7de85d1a4bcbb532a56f72e257b70015cd6887853e2a9f55b72935e09715587849cf3de56900ed9f32aa90edb8c5eb98091125dd1046185768a2e6d93cef178ac2b479e3834b3140e8809312693147362e6ed4a2bb96322c6c29eadf367ea73d6b4c010b23a9a59aae3a9e1127312336311010783848ae9526669917bdfa37a3f80bea6d28ec81622acc4ce4850c4684565b77316023c3877b8ae90a276ac24412e5b99ed958d4c1b7386d5d9aa6f27f15bcf9b507cb4b1555e5aaaa8536596162466e344add2492a81a48a86787b4b5d044b2f2e5c4ca74621b81864198c4b36292c8daa86acfd7b95d6d40167a084d9da8724948e2a829aab17536e85eab886ec698978561b6b04abe8c35b9b97b04be69f449c739e34dded021ae4a5f7defbeb31fe70e51e0fc6384b2570b46d6cc6e5ad3783dd9639bbda4284dc222983f35ecc33c320470ba604f5c4c49a0a8f8a30b7269f14218c6c23c325f2d69b79ef3d6f272f9f7ece904fcc1625968314f2f98325338543f11d030093789f91c61402f73d1701881da306192f457538e720286831272e6e28241f881a2a49629a45cb84dc3f150d008f14ddb6a9b25f70ad5e1451356121918840f8619210b33e5f265cbc90008bc0c42d960762ca2c425b4a6b3ee752e05c20aecc4ba9ad678b2c84cac6a4f802ca424c18e4b6a33322eb25028384000a11433d1f01eb1b4cce2da839e79ccfb25ad19457c6d8d4d88931aded628936a03176e4a7f4de3fbdf7b4b24f651f689c0105344b2d47286fc8fde5b4126492a2e4e296b400137d6025a885e6d24c8aa8b3664c08aa9ac28ae47eb27aa23e5ebc7d0ee71d01bdee3a7664f14bd2689f1cc1c2e711ee51c545d3ed52e8f24570b374e90154af38ada8899c9a07aca5a465afc8b511351715ea82de2a461c412ada9be0f4139ccd20b52bc4ea434e4f36eeeda982e2e224e67866a2ee6a741b47b2262a31c5eb43f52c6c6c4c6dcb845b1c1a01e680f8867b6f098682b2d0cadac7defb3fcbcbdf8ff8b189c1b123ab95b6237c124f7e62a121b793ee7a4cf55531354d001d68923a9f80b4573def0921aab2fa42c27495e3de5ac6049755682e8454025ee656a02244081a1aa40570bb769b6a40e4468bcaa8eaf5d202431b808a02896d0a316adbf6debb10c489bc99f01714fce142bfa23f8fe7085a29b4a19b67e9c38867e98e73ce79eda59de5bd6456472b6b3a2d8cc1fb66200b39e7bc44736f269fd1fb359bacde521ad07e8d4b63f327e26f7aeffd44de691a2b50ce79b15c035db1a1a979d59363505b5c6772973889e10b5967464512c46493158b092f37262314d765ddd15c00c11fbce7c99cc032239b73ce8db3bc218d6596ae94f9aedaeaab39cff9532e7bd1f16663018a01b38d53a4f15535aa116f9031c998fc512f8a565e382156a334ca6147b6ac584b48372748b24d6b301a6e404bbdf7de5b9af2ee7f2ee9d1e8cc6bee9010d55d49bf8a3c9c7d704e579c89bcb58588a1ae33bc770ca82b97b71b1b298b01b850526ee9549168a1ee6aedafb43c3cabed907609694591f4cc24396496d5626fc67c9c7023eace16f7defb3219bb6c436e6a504bdaec11762cadc5696c0e690d2abad6f1632117ab6f8f4a96424b6e76626936fe79efbd160fafb5867e1dc4a8c6a66ac05e2cb1609c050df52c4b24290a49cdfb27adfc7165efbd0bbdaef2cef147632e09e8b29fa9ecded2cf0a65855aa3d6a9b56abd5ab5af908a74529bea7ec439e79c7320e42c9320643a4733f35cb10a39d69cb7a07e80b2d5ac55695dccae72464a3d291860b68cc4ec34a32f8248646433d2567add047d4aaafbdfbd3be917e22cedbdf72e64b195b775cbb1d27fb0f5e7e5bee39c072c272482d4a6382f5675702f1742f466ae316c14da73c9d82b05958a6e79962e39e7bcec5897217fb3ccb17ceb9f1a9cffc632ac6ed435ee7289dc68c76a2b3cd4025a59a28ab104882f9017eb96f64daaa9047c037befcd4878c6adde7b9cd4ca2fd7918b283e567b3287c30d73b25c8b722f825c4820299e692991159f711f36cdedaacc1cb9bdf71a227e378a89d10b406b6a469e56d07222045b34222da72d135542af9d9503ae29be244e534d68459b2fa90e2e395565cead890f6c4316d0603cbd6d5e4cfd35f58ac660074c4e4b203aa917323ab0942da599841c6a6e97ea0e8348c21b3088650727535f3d5a605d67cb1ab6ed2242471626ab95fe78c1c1c75fecc9bcf7fe37c68521c69039ceb9cc39bfa02dee92131312de06d36f35b99073efbd13e30f573eee7461a1a4288a7c6458dc9c4cf0c0515cb1ac0c6709c5cc5807676a02d544b5495191705d394965386969d021c7a2b222546851c032f3143a8d4ea71eb1556f2983df53f4de7bdfee8447c49fbc97d85eef23204146ad40b281396a72c969c2791a414191963c8bf1defb2c2bfce166b3da7e1eb0d30eab2ac4bafe786fbdf71e9577ef1d8357edbdf7fe7c41b49cc7cf68acec81615b8a207193db293adda0984d5fe8d88c30ccd00038b860b74ea704a982e92b0dc963aa8ec03a7f92716a5aafe66207bffc7df67399963c98e221bd5befbdbfa07d979d6419a779ef7d0b63fce1cadbf54befc9fc512f8a56765ab961eafeb3117354ee60a6ee1788271108a51d1054d09fa4220b0c8e93d3071d0e3aa916244136402f4c9bb215142b94c4a4cc54de5c781f004b73a1c4829d389233c2c1424936cd78ca429cc1c60c2e233b51d22424a62a0eb22d6ed814404e70611c708b90c8ca558869d214e3c044938f928ac40c915a881bccd2e1759c1fa8c466b413ecbdf7de6c4350edc927d48ba9bd127fe4bdf7f1cfff24e5b6585e6eacba6e9c2e48226b6063642314e015efbd47c61fae8fdff094fc31a912892b463dcd60d5b5a55c5b6cac3b9b3308355cdc6062507f5dc92b1d9d1b29755514852a60b846c4254e1536b0f77e967ebea467a071efca904225e10197b7de6cafd83645786ce52e44de2c9d8fc620222a231338909f957d33b21bb03245f2a12273e860950d26cc43e4d829c55ad377076a9ea53c2bacebb5dcc09450139651738e8aedb89375d74892101db131644d704a0b8e9f5cd2a49337982c594d691a9d96a102354b779c73ee45dcedaa38e7bb0dde7bcf42e54216eb6fbb2f92474c2793b1afb998ac8633a6ae87891581c5f25614c2287d969af8a1517d6f32a3bb8e7517f2472b6938e79c733ecb5cedc55a76e4d158cc71bfeea19c33ff09b84c24af492a5e5c14f0026d82e2a9330a726e4104e113d8a47be974a44c4a6cc431a83bcb3857f73e97f4defb75b78b1fa8547ba018dd7befbdf7de7b33bf6927efbdf7be8f04ef7fff4b6b00ff97eede0f61634d7f1f90a6396cf8fe4c6b001cbe354cff0e0e1afe3407f877f0c18dcf83e18d07418d1d940f98016c009c61ff19080138c3fe1b28d0abe120cc02f7cf81efff017b1f06f2be8f734fd374f07d3f775d588e33a08732c61bec79d41de4dfffd08307c677e90a600427fc39b8218e371dec1e3c78d45f9ebfdf00c31e3cfc8759fa9f7fafd7fb9d96408fb7a1017e7737fa202b3757ffda75c669e798ea0b6ad73957ace3aa75016ad7092745d673edff6eabf7b55e40ed3aeb96b5b38e5867a85d27ddb476d619eb5eed9baa39683ae3efbd7770e8bd87e0f7df603bf7142d010fdcb404dea0bb270033be07c27f0642907f0409152858f8303d015f70f87b83430f1f1c62d8fbfbf6f7f9f6f799008e811de6af827abb1b3edf06b1f76d4cf0c37d418309c1215ccfffc254ed2d042904879fae4270e8e12621b8f70efaefeb490040cfdebe6087f8cf7ffbe0706fe0f05777800215ec779882daff37b8a3f510fe26803becaf82da038771fdc67ffbdeef1b6ea8bc31843f1c07877baa867f0660848c5d2dff57fef1f7a021d8c1fffd65ae77244a3774dd6a19eaacc5d0fdaae5a1070db2fcfd1fbe11feb6c0ec8313287cf8cbff3556f8bdefc63b8c1ff07becef83430afc97d6607fff37803190fffb37d4cb00ff5f9f0fb8a7867baa963f84d9ff37d8e1fd105ed9e30383430cbfff83c38ff12f042d042b04df0fef0ac10d7ffa3fd0f09fa639ecdfc1b7fddfc161093ad84eff3dfcfff98fe1ffce072b047bbd3608c09702f085798ffe6f18aaf6dfd31c20fcf9c3c0fd21104f00667c09c0073f0250e36f00373e8421861f70f83180430f2004a0bb019cc1bbf2cfe363a88717d41d03ff3b38fe4b738833be1b67c041fcd17fff1c707088e1c7717f83c35fdde3cef13b8013eaf70f5f8ef7ddbd7fc8e194a9b2f57df71bf4a0a1a679ffa5831d785ffebeeffbbe0e5f50e6f8be2070c8b1f139883b060cff7b78fc7e5dfede8386daf7871e34d4bbffdb080260c7a701dcb24c73f0fd0e3b0de6daf7ba1fefef199080f59b7c83430f1a6af9ff763e8ce076be16f84fd37f3b5f06b8353df51a5f1838437f8faf713b29bc16e8dc63fce1ca1f2eb254da9048ae575072b507c11b0e110bc44de645e879607989f4defb1f2817fe447f7e9672112ed3cacc622f78204ad60615b39592c840734139568950c8ac556dc03bee4b35a63af3fc97cc3647e6280742a2faf4a60406b7553c01eb702971e62d252d68ad98d86a88a28c239848c84884ad3d477461cfd072768ae5fc21d94b38e7b3f4830472356927282121a64cb055670b0f59ce985b0964073322591f30aa9a21b52989921473e5c625a4ed028c03e4e3da244fc5f9fe35216003394d51ecd30e888f61a8640d9ac50c1182e089222993180000030014c491304d24b9840f1400042cb4b89cac4424128d46038138100483016030000c0000000000001406828100623c2364560340d5f52e94e94f9137261ed65cb83b49a8fca5785f054b83872958f0532f7833bcd9c98b02dcdef87c6b06ee61e219658b59d0a7ac3acc2ff84a8c5ce1adc54241d35dc2b6cabe556588d9f07d35597f3e84b1914eafc023285d9f1277665c3bc1c5985379ceb6588806b05f5be87c68ffebf415079dc0d5477484971a680b32059479217a76deb2800e6935bc2dd24cab56597a32cf3f327918015193ab25f38a1df77076adb3a57f59550496372917b2604b8f3fd03e2c7edccedc880d12ce6271adb003094abf92f21173367581c09b62a4c7a055a3cba7bdb102ea9485367fa12472e19de9bc8c1efae578450d6cdbb0baedceb1bbca6cb36b66d1bcaf60e8a2c45da38d5ddc055e620b4f9845d7a5f24056c1a2bb0dc11750fb10ba850151f7928df7e3c4cbf5379fac51b212f3b7d3c09d3663111f9ce83a807bdc1593f69cd2cd52cd3d78eeeff6824313d7f1faf4e2c12fb8ec4af41628d9cdb9af6bf01b39b1ccd32bc7486a8175886e70b3d026a3b1cc319296394bdc22d13c9d8e1fd7701430a42dc49fa2b17077f7cd564e9d70ea6c88ce65f64022a605843bdeda19b9458335e8de7fad538f3bb351ee4b2fce945db92da17bab6292e4b67e5d01d215d3d4307f890b1112702a1a017df96423cc3c44aea13ba1f65a025d6348c324eae701c72f30528407eb949a517ba2d6ffa85b926e7ec4b316525ca9e6c09596b7e05dc4b2c8c3513e5616892fceb2e26e066f4b7e8646a0116ec5e4b0f1d22d12ed87ad831a28a6026d2231d64e0214bf94a7ba60cad87ca0e025eb683ac21a98f228ec624bf381c2e8eaf5b4aa43b821781777b6c858008d452a856367299c6c70227b71a5dbd257987a52d6d198ca15939a9ddc97842f8ff2c284b6aed9344c26c9dfb7b3632baf250863ec686b865d49de383d25028693d9bfab69af8920b1364b6b6d6f597474471bb8db0d0d233377379602cc93a5416cbc67d26c0fbf37d9067771586e973deb3a33cedc21145c973cd8b10ef54c163903cadd675fab45150427d237dbeb47f13680251342d8078d34d4d7aed33b6de32f07123cc0f7d43c48360f71f37e38ef287d13116b7169b743b4f3cfbe104d63ee1b53a6a5b715c8cf2959b561174597b6d33994199636f62c61636b1b5d23affe326c0d66f8b00e98b67b9d537184d88e1968f1a4264834d1b30d6f92ecf3769f9902da3479c2cb7ce03adc6ece11d532e43f1ce205831ab0b660d4405f61d8ed5005740a090a4be756db8d8e7d9cb42d2719ccb6f8a3122e92615c0f9930d54dd81b5bb1c4114ccb4dd18d82676812de5080f499ade6d3b8d03ab4390939d2f9629459e632dbd955366ae69e491dc5ac2552503713296630b904287bedff64cb81d1b275c258509bd0f27b46a8e2359f1e12c93d9bc5edefb46b6649da9b7a861ce710398e50e438c5c8f1e7c8113c45f22cbc506a6c99d640f66962ba9ce51a75b52997ee464eac7cd5eb547e4a9cbe4a96f6ddb61cd476c4c93c926b98b988f605df7472857f82ec1e52421432d9b5424836bca7b6f16f223ebf8044509be4da5b7936fe9ac7198955226eb9fd207ca0d7862e5be98f729269da67c639b00703f600a2e76e784c8f6383ab8b8f95db22dbe081e24dd9bc5a75e5c0f0ceb13ecbb0ef75dba130e003f8791889de81b989d14b4856b6caf201fcaccd83512df4117c07daa65355a7542b0f10e7dc571ded2c07e32186dda8a363b610dca2c2c515262f0eb85de6f961d3e00bb9d170f6a7f47e73ce1ab68445dda59cf6ec7937c5e81937da019e6b91b0be5b0daa3dfbbaa32646da39f1608767dc85d500db95723652fe0697555180fbc052ebf2d4e029ec4badc1b77613afd8de7830232a19f536eab507fbff2dd4aa0900c445cd716bdddf46eb684947afadec8ab11e469902ea4d0f0fbdbaa809e6efd3206210c3a8a40dc05ebce81b1175842ab4c968851ace848b15a9c952d00ab5790558041c6ed7043a624c5c3da4101a6d3cc796863f8789397e518e49facd334ba50a27fab1f49097b89341d025ee455afdd06e073ba7b57ecd2f12500a28156ddea4dec30d439ec6a28bc265674c223ac81e5a6c40f85608ac964995611747ed70cd5e9011924e04b8d4374e60b27cd6eccda7ab738e17b4fd99c24717f1dc3d7e74e38c3a1771020763725fcda9b1c0b1ec95083c9215922f188a6bc6ca54a1f9944abf5280d811adbc8a0e0dda262b86cfc2ce503307a39e7ab1aa2827e91b9a59c6e1a25ea042481d70d8bcc984a46a0c812e58e01f56b349802c0201b66d93043b1eba8157025866e6a3fc512e02efcbf5b972665821860f3780988c419900332fab7ce3639a8180590150cf3db85d7172769709f881c8e373b200eab7e583b3a893fded658bad4040f04e403438ca3e4a53d3db6a864862aca2d69da1361185f2a32be9d655a0990e1888289fa8f60b7afd8cedfee2ac4f68e598287ee82e2e09a30c1c390ed00a5fb50cdb5452b4ac554d10f1b1baae6ade32196edec0fc45f8cd8f379b9822aded3e06789b8b244246d33649071957b2c1a0e4401a6075fcb1089e09ed952ac3623118d9d37877857dc71f2783fabe1c03927abe2859884dba1711600db13d1431fe42cf34548ea5e5999eb9e612453d1fd6a1ed66256e00275de3d0eaa2780e99ef897b4a8dd5b6409116ef652369bb6ba27d80dc1af70c64239b1c45aa311c0bef0525eaefeeccb68c23c947b3d4060113580aa4722945b15f4defffb218c0629182c4942b01b38d63089af83174d6c2b88ec9cfbfb2ba4345d002a9d13682dc4150df2d43f5d3bb65f8d81ff07ef4817354ee12a61b8de6dc01be0c96209b03790f51ced10df0c6f175751dea8b156c49d60d86140c5fe414423cd18d94c31a52542718fcd867e972baf52457767a7525f576fcb9f22833893551fea4342d0cb141d9af4e1443929cd2a42be9b01fdef64f5ec452ab38585fd749200d9569b016a60902bce7285f07210efe5658012b9cb7dd0c556d2ce22c8e95bba95dfa5d1cbb32359e94857b361703f32d7d6a956aa8cc752e3ec767c09e96240d2a158d29600a0db90885eef383bda0c78e2d59d4b6d6e87351aebdb76325470ff94d942c070f464262e8f708f4416665f3f3e38f399f8064cf73433406d251f3db1086863367d94c4bec326166a3269386341610d2a028f407f549df02b18fd8a5fb23625924b62fca9a6a5f76e626513e6f7d9751365706a7b5f00df23c8194bdfbec5239d159a50d4237335e6a8bee3268792977ce3c5b38269d126ee01960a75f233e34dd40fe0ebb94537726e9fc1637a3348805008c03a8f0bec4823007ea442455832d398fd68a87865f529d622280945e0e312db014c17f974d1cc5621c1e11728f3475d437f2183f46029b66eaaa2d1740359e181b9d2e9d94f26127d64bf6279605335a6ff4ded4af96ea1b5da1a62d3bda343a41b1dad80dfdcec8a67627b2f8cfac12f91f278d83de3e2b7eb3405be4b77a9cc59e32e2a3dcfd26f55c11a8805c6f9324ef5ce2253dfb8e07dd24eaf2b3bbfdd2c62c32c79c9e8961dcb952a1b1ee2f69dda8ef3d8f6807a08c776b250ae9063d7975e4d0ee5db01d86393a5c1a3e7ef20f2394d158bd2ccec67b714a782bf7a5f35eee29bf0ecd5830fd10ef528c038da849534043241972931dd3943edc7c3c15109277f7cb2153c11123bedf05aaf9263e0e2ab7962125e585e3fe02e022210f6bf19aa52cee19e34236edf9381e65ec9f838017f8cbf98f3806aa806417dbd753a67452b75eb83a53dfd3fd0d697a7c075611a9ee5d3cccbf9c0c4f30ea8a2be5e4cf7784e0166893b32fac12a6b351a7464e7afda198809155b71c1dbd50d97814ed63e0643d6b8f8a67a320549257af10a94d9b0bf7dd4e4c98545c94ab6daac1795f9162192444c5e8dc1e5db0bdc939d8dcd64118c44a3940f18a76418c6692e87d17cb28dcef47d33f82b86e201b0c1a617d4bf5134296695184431e97064f1f1fdf3f3dd14bcdf27e02aa4dfe0639c306bf0009cb5a75f5eb7041a19f47cf40452c657330fea246d4d6ff91e16c2e615651160cdf96655629b1eb77ee5c055a3a787b5e4db7e34d1d1ddfab92cd74ff74d5731201e884845e3c88aa5e80647884f6a4fa2d66a175d7267df207139937a4468c5535829bf8c4492e81f48bb448e7eafd215e0b44beff1abb43945b7b001a22f228519d25ae79b48a0813154433ca1e0f05409c88d0f1fcf40f863a774855320e7f9c6943d3a5d6501f7dd74abe345706adac655a02b610333b822d6b1eb1dcad670fb2d680809f11ecc1e23acf663b49168280faf4d929b2c7c757da3c1ae98c8205585d60bddd48cfd0c50dd4c088cf65c9fbf9a2f89985132caf2105cb633cdfd889186b46194f34599bf780fceaed3c5c57e9c47657d8cc0e1bdb51c29aa8cc7dba8e1cb98c81054032ef7661f1be28e19891bf4db51e7bed951e48289a9184513a16c20b7d560e0fb2552c308e84cbbbe9add9e6c0684204b88936cfe74dd22bf817bd0886728ae6c322aa6fc550cad3c0f80097985451324d2c202a29af043e166e49c3c1181329771a5abdb5f9e8f24540747915d3062b04353e20aae3c7a380b0f6b23aebeadba2f33ef2208b2ab9905837049a491d77aa84397063b48a8bae90ab2cd3bfb6436206a0328a4c749957e790af914106d59094188018ab5c18857830ddc4d131e44926927253a2115da40c84c0c139a90b0b9def0d4e74de065022c340b2435e65d060eaa4e40dc93cd58ac49e8057edfdf520ba99146396c780e5533b7c76e2ba7da9ad713d411a036e717a313aed1a672d6e3d7d4c6c389dc726aaa3d206b4c6354fa8e2b3537550cdb0b0481e2abd9b529053b9dfb4a61ea301fdc713b058fa559d6c7f4a7e17b308429224a26606b9b838d0bd85390570229b293464d7304010854ab46c2e21aa5ae731c47a0a2c1dd292a4fad858605b2523a2c1a7fdd0198cc01d3ff993923eb022dcf4c4e80d46822631135c5f48f49662d0cf6a6e7f9182a772cf346eafcd2d4c62e7c69d44466e100522ac8a935fe0e826e9e8dca9357e3aa0c7f341270fa857096d997fab5dc0adc792515bbb305ef164ba53ff60c6ac6e005e7c6a6793794e38557d349f5a251240b5f70d9713fdbf01b3107ad60f474641c88865033077ea1ba625c361550a11deebaf90d0eb00d9e76d5267404204c584d7e4b2ea0f185200f1a60a871b88e57588f5aa96763160c2cb8b624c47d9323bacc630aa174af4a68e0cb0e5b31d0f5892eb3bf1aac2375415202065aeaf2c2a9ab9a648e2e1237bdcf2e26697b516f6714de19458021412cc22b91f7a350ec318db77f7f7c342bfcd320bd51c3a26f126eb06c9665599b5825f9b11b765b5f8e3d5e8b2aa6167d53de451b8a90f658a110bd9b89116fff18dc720078167529abfdccf0818b6f2b45c2c386c297d20146617f454f90ca93d847ae06fad1f99084fe32ea5d3c2222798740bdf6495c376a0d2a884e52346dd38a2ce4829d8c949ba35adc2172418557238405c6907f3b07860f9495801a3f43b8615f1c3a2fa4eac4184ee4f4093a15e4b44a300f6b4c2c308720d9bb7a8370ffd04ba3f95b1741e966c5ebf893d7dec4960c94268aff88ac9adfe7ebedf31e528cb24a95248e65815b3346e7a26b62fdf85aec665f2359a25b91c65e289699564ef24ae0b29e95c9e81e4208d12298832152b12d062ea403fae57f745d4a948834c8496bf0619cb7346eb92a53b6e655e908503e5de614c476adb6acd1297af67ea515280e532ef24327bc2a8a43c246e9080497c38f731470081459017dab6cf218ec1fc2718e877849fbdb9799406fe3c4eaca091e40b81cdedcc3330fcbf3d9beb4eef9e7df97c8da1a65809f58dcc51df1051d5a024388934003cf72c62214e5c30a04aa0ca5e7a8c3800a4b2f342e17a2809d18e8cb9e7aa7fbf3180e739ba1285fea5f3a7164c853bc05354a9e14da28052f2976b27249cf4b052f22db63471f2feec2df40812f887ac765742bdf80ed9159a3bd6676c28532adb91c445730c44e2d5fb63b3b12d07644c5b2ae039d09e6dfe79cd604418d29e0a6c915590743d3faef0a3e58250e0eb3ceee8f32e94f7f035e0abcf435d0dba41c3d077053a5082b3ed78ff8644ecd61326b24132683909e78623b8914c6564f211095747b3f7019ed44e2f596ace8413bee42ecea4c796b5739b98910b12d691044b1241e273db64cdfb7c381901dba1169f01f1eb24c3aa527c1d0bc6e008f4b9c6455108a05b174c6c685a17d351e3e866c854c5a75557f74119aa06b4d202c5ab28f6cbf67546d4620de4cc892b184701998a5350327148dd2a938b0f3e19bc18af4749950a84f8ac6bdd2a6c5ce2304e6f7324f1b51068c2c24a73b71d08143337e13488861ca635c4abeb7eaf138c079d8217bcb28a16b363a42099767e6ae323f376225593d896a8e34fc654b28cb563a506394f4cfc3fc711ee3044e9bf851c42e1dbb9d8377eae76d36273a202b3fb0896637cc74663b0c734f1fe191ca2e35094b309a7c48bd9de9cc6aa462dcb0bf284c22f26323bc0d73c5b05589f25e40403e2141859692ec231c65d318e185bf4a3b49f1c49ac4a3c2362ded0b876036eb7f380e2fe33473ca8469a07b269ba5834ec317ae2a6a1363908679a99e1df084b560347eb806c39f3ad04883f46eef8eea0167781105bc90876a4bb4ff073820ee9383d5919e363092aa42be0c08a968ec86e659b923a2f0a98fe09501e2e618e3e64ba32b644d71894232c6679825815cbff1f4c16c1c59c7ece3a591cb215c908136ea3323171fcfdb3404b71947b0ab02ad09ea13d4c783a599b82c3161b6c8e416d1b88c393af892920cb26ed81b58ac7f7c079d210f0b582d08e54ca1e756cd078ac0c404dd33d83d814b8d32bf33f827f7d33fec5b97811d7efec37085f44ca3711ca1e3ff3be7e839228d41cd0e4e15d2c5a097784a5438fc1460bfe9740a66dd1da4db72a8f6efb031a728c9ecc1d4796c88440f37f8fee3558187ccbea35c0e877788620147132424d757f5fb685cddef3ca449025135b89171816724aee2a377b31793a2bee229644a634822c99988bb416491ef9c54b34394d9ed4babcfb3f4e640dcd2659a355162a114005a9c9f18137d9353aaad173d8e5f7f7f7a5b882e9926f6dfd595f17869dfee82562e3f02f9217d19756ba64e9b9ed8eaa597cf23cc2885aed04751843d55fbc592c0b87ed18444be49983d2985d7ca4fc598d9e99579f9cdd2fca289f9d075588557a1005f097286eab6c4ed3855ec2d068034d982b22bf3f3dc601ea693c3a1eb1cdd6339af76bc9e83164d5eeb39d828508742579ec83b40b82a9fb16b28f29c0e25313cd3f2250e209495c721d0774de2a62931d01c8834151dae789a809603651d6c5377245e25285a4387e76289fa3972a2763692d787463c45c6f5120ac845366d4bae48031f1bab79517cfb1ba78acff94b19c44acb2e396385d5b57852067f1f18dded3685c1b2984c41b5e3cc02ddbeba7a1f30055cf286f1d778552bc2e96f4aa8e0f962edcda7c1c2c1313a1259e741a67141b0df394640c7090dd9ce618e4b762ea18b9b676260559640e48c1b805b7378b0b17c8e363f9a04f892e2e9d728e84648ac328553a926bd919b3dee41b5dee1bf34993532716a2ce723c7522599f65ca47ea95907c88affef98cb82ae40db7c3eb281f12531a05141ee3cf2cdbfa5f0df5ea9bf2d2a5cb8656c43dae11ec3f96640c6426b678e714f242fb23f76362370f9aa587a86ba73e2bdaed60fdb826e760810fb69ed813d6c2d9c1dc27e2feacaa44282a4ed0dc6ac86da2c06345013b8a1ddf10ee4b901049bdbe7514faa8fb8ac68c7ba6c21113be7d29b55c09b0309ba6ccb3a1e2244fac0a32dcb426a566f0d454d2b1f926350ae646f801c0a4a6d2a0ec5f7993bfae8995d63d0203cf640c2b9073d509158c70ae876e50046be5076e0341d918f9b892d0a822cee7d9540c64ec83619f0858288a16f797ce4851ded4b385d33ff0e6c407de92778aca3335bf3e5f2056d1df2081b15f03125f79823083fb91e39d33eab17401267bf2805d4ae13710cb02d9c87a109c60fc8e250fc2c957b29110eb634d84a60558925573e31d0908d8d72218a90d002a09298b4aec845306f69e5af6eb3c9f313a73c9b39e5e6ea6f5be0aea82ec5835e15786013186244682b8c215800cb674a2fdad26eba1800f71c9de2f86e0b946975f029c45578080a5b0a216388ee3a2022285a14131239c1059607a3a5187745dd5bceeb3d74813c318c9ca812613d9ad735268682bbc6e62c83e690ae336273b6b348108cd979715a361c15c77a3c56c4a5128c82cf3825c607b6b53a36f99b3001fd223656a0ca8906545e9e4b9833084ed9d3e1e3503e365db2abbfcc7c9273464a1df0fb08ac53e0896b62dd94805cbd291e24cec199102202cc62e0ff5534c02ac3ec853cc0d68b524d65d19cf4583925a9e0a8d4a59308902979ba1ff1f07cc43583ac256c1d07db9819f7cc382e83f80c05778496ff76d0cdea147f1b3488cb3bb205d91f500caabffe00329250a1cb834577726c0471a7ab754b1863357ef7ec8094aabe5317cefe258724d1d759d39ca984ae05c6b6222f97dc0072f0ff7bd1f93d41da39f6192416bed5187fb94f4ede50e351b38d5a8a8cbfad92eea57e8861269b2c8885f49ff62b1a3620c2de2d698407d146135f3b3f2018be9ec80fba813a2e67d780a9f81a05662563b25d629745c349c2fde38002b8427971999cc8c2ef54c968ac009fd95be550252e2ed2aa13e7216e12725a548003893392c53ac209364e54cad3316813c3d433e31a587781d4f28e3dcb4b3f213fd7dfb89a571c0e6b5450a3f8b5c4d112b3f0919313c12e31744f9a63e350d34726d590409bee5e4d170e469d272123d47d7c431fc87bdf6451d407c3a3f6ad392992496a28468870c39bdc641c9332bb2cf6b67d4aa4b823a6642dcbda466a8fd70cf25e7d044c202199c89cff308eeecf230b8f181b7167ff85882cf5e35e17f93768958320c701726d27af2f44e0a84aa672628fb8b4ad030cb4b45fccdb4aa821a0ee3dbebc631db5b84dd14951e83ba9d03929cd6f4326a3247f4418e1712a851ccb340d6a10f5efbd344b6d537389643d460bb1a1f24403b81a16c574697b92e94310c44c8c3ddfae3a722db2447ee4e74f0bb6933caeb1f651c65d8af426e629e8775a47b01c8dc8460fd38aae358c6558cf3034adb7465b27095451eee618b03d48809f895e23d99c35ba135fe4e4624954fd5498db8774690346c822bf3c67a88d47ff6923188b06ce35d81012a507677df2ecd01d2149b5e0273b06b5a2ba6dc7fbf9f241c3d1cefe8f2a40afad444309694151323836eb89b34437cd27311dadcb28afb0c478e5ce25b679c2c0288ec23094aabc8eba5793ab7b71e139a8e2d58d1447d92305c33412158d980d1adc11c3d392592268ca96fb0bde876c4e70ac8387d8a87edf81a20fb70322e3cad6d226c6aef9495f2763c171a0436ac52eef3636c9c22818eb868a2babc963fba01b4684a925354353da3509d3b867e4bf65f46088481af8d3815187752af895b13438f55c25c0abda18ff28be7757845b392434010a020cdacc890ba5b8ce034c4654a06252424cea9a5781c16ac1ab1d058c82451b3a17bfa0c055d97c37bc10d7d05721ccfe2419464b76c50b539b216163df2e40c68166b93d19d3b5da8d0c3f8d688e68a2c58f18507f12d273ed7f2cc5f025c1a5d5a371077d13668d25a4eab7330da72d37b14ec32f8fe54add4f043882cc4d9528c17783466c714653113b0f92d08dc51e232acb86bd91284747e3676848b5f70df05589f0370799addd87649dd5949e381a007b43650dd972aaa407f0211f3fa30d79090e716f601da643b01012c89a5cc5489836c193fad52cd8605023d19fc824c4168a7a7fdaccf4994de0570e1c4460a0b9adf5b0a0c1d0b489358537c7f41c828ce70f06991d21d78052e8690dc0451dee6dd89c02d47aa1db2474481ccf58c578d0deb9487078022c08f6905dd055883fd436fc23fbf49759990a843f506af33c9835241edc7f71ce0ab936e4897400db5a18f31b5cf2e60e327273cf960960ee2b18a94b1598cfd32c0234d66769a277cda989fd02fc7e12c592bf245ea4dc872ce22ce2617fb1f7b3f999ff59a6176d80057140ba7021a20057b2bd9522c8d3922aa090340b11f07e82e54bbec865a8d7db50b973eab8d15513b04553976f4287dee8731bd6e41434f8cfcc3f678ec48166aa9d55c790cfccba92d3e7f85942c27548c88a38acac1229077820013cbb9463fec3b9d9caa85179d84581e4f40985440157e7b89a7a2dc9d09198e149950491c1f988f47fac410b8fd804ad2fd46f601e1579aa505dd24e346707b7bab680efb8504d1505620ac7936ff4fb60026a5668c7ece157f9eb5062e0014e3b26dacab0e6c5a5972714702c8eab47b209fba575f3e4172c60db4fea3ccc67309efd14c0678db7ff2171d125866cb10ed2d558af9062ceab082f0d4d70e12bae06891e886bd04dbdb43c4ec777d7962142c1cb7e6e2803af4236e4d422316125147478ea68acb0734ff258b3b497237fe97da0ee664e73c8215d8ccc6cbf184cccd4e84f39c089bbadd8f6e81bb9163c77a27d220ee1a0ae3a1e307447c204a8c943ed5e3451fc5c4eb8d6d718cff8ce8f0540cde7ca57a6483dbd97704ebde2fc0fe278d24ceaa5ca28b46acb53d92680aa392d2c679366681f1b8f6a0befc969e31588ded6aaf365a4de830a3c6e87b38c2b4436ca844bf7a973c40ffe0fcb7261d7bdec892a76cd85e8c1e46a85672955684254a3bd56469f483647c7532aa7ee8d6c87a9764dd11c5376ba8f258a1ae522f3120868c4a9dbdbe5a79e212ce40dd83978451c8e84954fd3893f082c9828a1d6dcba9333d7443934fb59f41ce972c8bdf96eaac7c594e4636e62211216fc101ef526c7147cf51b903dfe424ff011c6c3060963758e78fe327dbb1a26d2dafdf11cf34355fa269deca2f64847407740fc578cf17092969f6c1b89c55727c7b4c24a67c5da403c89cf503eaf1928f55309a19a50dc96a92167b15af93cb12c06d0886547c9701f2568862d0088b00c864fcb5006b48c25db22a044683071082ef28f0f6c1ad1829793668796dfe0a8a414a752ff0b46cb58ffe6fbb1149a195dddd3b930ca908ad080a0935d58515d7505cd335de535fd339180e65633a576345468c74732351288602116323b59726fae6302da3b7dff015a4c168209a4a0b356ff0ad0be359e929953a39313616d94cadb51cea689232a4a94b0d5fddbab5d65a6b2db6a893031b4bacdc83640fc54ac65f2d24bd8532fc183dc6185f55c518e31573fb0be6f68ee1c02187bf188efff6cd70dc6fdfbadd2b4833cd78f8f1c50340ca16922d94a3d51100ffa20520b6da5a0c0000dcc88c3b43e69b4a07c1784bc6ad8f6fcbdf3bfabff673b8308fc315fd0df7e5635cd29baecbb70be9c38001c4b331dd38a6635a4c537126240550e5b7ac1c4b1b0178ccc718eb3294b012e63246e3e5f693188dfed16d46a3df5e6734fa45d7311a8d61fc93f4f87ee08b49692a9d233a95ae01a9d4da423f43bea62280cb663cec259e2aa23a39171143e447a1051fb57a884529be9a88a36f516a3591da43ecc70863b3cfac187762f79cea2846cbb2e2089facaf2da34a6a21598da3f5d5f2ea16c4a6966f36d6e5ab9d2692e9db6abf56ebd2eef297cbd43b6f175cd9db43bee5ceb0aeccf7103bb23de4454a7153eb72f9591b45b2561fa2b744d8346db3f916e13ff9ee2d977b480fe921447ec667f7dca85b78bca79499248a8ff51d65921cf1051d8aa0f4994dcc24d13d8af550f4f5c6ff40b361d18acca6751049270752ac35e933914c25b052b309582918ea61607753d543d8d46bf7e99349bea64377e933914c25d5fb6ca273b49f1fc467923c9f311b21d8cc7b08309b0fb41f180ed247ecd27eccd81f3bc28754f41f77c266de3f085ffaf88df8fe1389b77605f16b26c9f145b7eae1a28e2d4d094c9c31fe55d5a33627efdb8f4f251e31851f331f06d3296536e1515eae57e151e64f24197eac7a889efa79fb773452f5a2abe6168f22923e1f6836fe2304b371527ecfadf79f66d37edc09b3694ea4d86a6d779d4dfc60411356d5c4a79f55d57254c925ec8ba4947c79949fe684d9740b188ca0ea519acd07daccfbd944257af8b4fe2597c8f4adfb03a351bd1461ab5bc06c18abfe4100060bcaf1e1fb0fcc26e25b783641e31259facc2666128fe25578148f329be81af0c595e6573c0a86a55e1ec56b006e1d45a6f0d5de1a8c33250e8547e137bcc271ecae12857956394551ef4ca893e889c88dbd68ad7ffa45bf68d68b9ae84df8ead670f74ba3f0c97ad1378a7287ee4f4ecd558a6a254c7e9a7ae150748ef8b0ba4791e157ea5194975e7afc51732f79f94bb67ec7ed2ec98d4d30be6a69fdadc499b847e11e45a61e26c234ea77bc18d3c78082ba3294b05710575b8caaead1fed4febd7515a356bf02731d8ab62e0f0d3b14ce2437988f2f6efd76217d98987b5598cb5a49e550f415c4590e054541eb6b155551ad75893b14bd6406616d039c5511fb3a074386125d45e60e8543e116be82b825197e2b71283c8a1d0b70284a5d9ae288a88fb42b1ed4866a6d57ae0849696da9d4ac58f166a55d39d286bc616956fa2f21d8b468430d4bbbd2acb42b3faad095daacb4a176a55d71a123cd4ab3d286a214b2523d6b8eeb8ffaa30a352bcd8a50b3d2acfca842cd4abbd2acd06e4d9a9120aaba9a9127a2b8e3bbc63cc888dfa8705aa4ed37e6d98bcb0dae93e3418d279e2c261b8c6ff124e9eff056a473c46f2fa8a4252fe1ab5d7684e35fad95223ec986636bb03d6d3eb49f88dc28a5efad5ffcd58cf8c3a77f59cd48862f638c1535e1537b8bd9c4185b4b5c6a4560e0209ee5c7864d30769862dcf094e2ab87fee64350e3e91ced29f62643890b8787917ec3a7f6d65b950fb125c69360be158914074cf1d595fe6b1fe9df8063608aaf20cf846913eb361877013cb4bfd84f6b3cb9dbbfb8d597aee8fbc2dae0dbbcb472be6d894ff3e9b722ace957f12bab8a545694e256445a6ca21e7eff379b1d6de67d2bd237885f2ef432d21dec87fd7c2b42dfc2ad48d7086a453a47855335233b5ce63dd58ac0e81830b4e880a2e3c84b7d1d3d22582a35d6914455f5688149e838e2372a1c4851154ed3f9a42b7a78e753ea217c3d1442874f9bedaa877c3d14f744779d1c7f4a5f478f3fd58104564f4476170fd2d1e303a94b4582fea2e34886ef8e61e50edddddb57efd4d4c981dfb3752039b9d3fe78e9f0c9d7a42efab3b58e2379bea3288aa21a3ec1f7cb8732455114f5d4a52d657440e3979f4f5924d6b306f3ac7d0c840fe1bb8e9ece019f42194a581d978e2399fa165bf56879884ff0ab17b5dcaba918e34718f82abd88a5087fb6503ebfbed598faca1bc36f99cca9187c95bae1cfb7f02563ad70aa0e28f0da272e13ffe55a282e13bf5d1bc565e2eb6061f40975543d5a9efebcfe3b1ae98adee556df725b1c7b108c18ed4e9b89df54948b8a92e38b3edef776a7d958246de67dc95ac73bf9bd8e2446d78a4256d491c491dce82544f14976cb91d49144ac2e0a4b7e6f91349bc7a4cdbc2f95ac4592a97724f747a15cc1af2fab1e1d5f4fbe5c8ea2cb7ebc234219fe63d26c18d39144f5153f26f9bd07e94842c711fbc442b14fec131d49740df81204d33760b12a0f0d6a4af2b394c58b06bdcb515ebf59a6e8141ae437284739d9f3b46aadb520d53d59a2d6a4544f358b4489aab75e48d6bf543428532db4fdd55477c3a7ea6a3a3914a4e895784ffe44388aa2523a07f58d0ac15839aa3daca88f7f491a94e1c788638c55ac9e766df9ab77a474aa6216f58efb360a9b5ca8a752a8d62e1a24aa7a58f5adca87e83dcda6f990da61fc5faaea30cd87f2a6f0f5a392b00fad7062e56997eb47dcc769ed17ddf87e61cbbd6abe64b5d692dfb6dbb2e8946eb05aef35577ca23e7ed5d2ea1fb5623a65a779aaf7bc7f74ca8fea45f161d49a5d8ed60fc645ef64f8e8140bd3295d037eac99fa8a2f47a7740e9683b2f7f811efc9efe994a604e609c9fda79fe50a42f8fe9e1c52081f7ccc9d27feabde07f1dc3064f0c09e605555ff143e75c78daf16553ea8ecfd56d543f455f5deefdd380de115bd74b15927c7779c48fb917c223d11eef7821f3fba1158597caa4f8a7e44c3447c79263dcce53c18b719f78d49f5491062d3e8df57efdfe2d2837f11dbdc188ea611330725d2f711b7a482bd1a89a4c29ee4bf372bed486f7dff9e5534f68b12572aad1df69feb4dfc89ff789327ce5c84c2b28bb10e45398546f2f3445261bbff31e928a84aa56b447ce948d18591ab4591db372645174472fb4ed24b2a155983b2fb9d3692af46425df7139d8c3f67c44d226936484a0e496eff1c6e3f530d94cd700f895ba2f9f891d6939b115afdabb41981d296e25ffe7364b5c012663314bea410fb2f97d987a327b98cac7fdf125f96b812bd9f7184e58fde557c8d842c7c1abd1ce153fc97e5c378346a45ea68341a8d9a9127b9b43469469aec80b163c497b3ad48e369459a9126a35664d48a34234d5a91d1a888cdcb0b7ef911be4a30dff8b23198842fd96620be94b5e6d2f2f359b3a1fee16b460e223e9bb287d5994deaadcb78d00fc2055f5248509b919fcbefbdbd8c47257a7b2d2645224b86002e239b6c465a111f12143436a2b36a686a6cc40721a4a9b1e1227c2a9d607b78d9fa8d8f36728ccec577b4b27e5ef9d4f5a8ace2213fce5bb11569b3a6fc5955e6649533497b4f5c939621761dcd86cbb4caaefa105f3672a31fe13b74ecdcbb4cf18951575f6e5f539f7e9fdcbf4c7110cf97c3355da3d9a8e91a103e1a1b35acc6c6a3a9b1015f0d8357d64be585b45e2ecbf8927ebd14e230592da9c6b97619d5b40aac638c113b9723e6c90efbc7f8d72312d9cbf833cea7bec2978bb3befc5133a312becb0c9f28bb24bedce93debe1e113fc979953107b8c4d72b5e45c3fbc403a486dbfc3890c794486bcf7de0e119b193ed37a88abfe7275c6909d2144a2784388bc9d2144a218f2de1b32a3d403dbfe9ad14da487fc583160f2c488c913a3d168f46c099396167cfda84f3cc1a487dc65e309b6843dc164f4ec092623b6843dc1a4879e188dd8e889c896c4674be2b3254b7e727cb6248a1c9f2d61e232f16a26f96af9be2c268ef4a8af9e0eef493419c236920f4758861296c23415be5ade7b9745f844d9175d237cd1e47859f1fb89ce61f1897a11854fef5f16e17e827ab89fe8275cf50e3b9188c2573b974ffd73461c265c3e5e96237ceb9746673f4697f7a2a78e09d2bfcb4858fa8cadaeb5d7b95c79fdb95cd2f7a544ef492e92548af1153e64f2049327ac8fc2909f33723129113f104da58580682aae859a0a10eeba7ce5547421759f160e8b86c5afc407a2835ac865e2d5425e552d04f125473f5d30fc16a4d1198a21c594b62c253ef97c865b53692a55256a2a5428528e4fb5cc8f0fc4c8d4f5a349d9e113f5f3197d75be75996869798a2f528ef0564cd8dfe1af8ac0e85dbec5187f47a3b08a2e7c265a7e87d358ab0b9f82c0e85dec6da1d48dd665c252d567a88ff3a9afee45cad4bbdceacaea33f3a9a75d5deee85b6e114e58323e13f6e3c5612ed333fdd5ad2e13e36730b1f333dd424de54750503643054b8054d0f3b8705a342c1c8b90734243724a3bc4a373cb5ff2b2199632c45795a497ff625f5e42f82f97745d2e63332d97b11958f1fce85cb4ff243ed9773fad9b33baa12ab4eb5095a12a435586aa0c5509121aaad25586b2cb3dd9e558aa122414546528a8ca5090505095a1d65325a84ad7703f449b695f354b2dc3c1722b95ac6d3d6dc6321ccd839af6f557df33fe106d24faea59353f8ef0552a89f0c397b5f0108db506a1e4413d8c7396f264f325b6d495a3dcac5d34435586aa0c5519aa3254a57f44de32449d8331d2489d1cfa34b13e8da5ce515b5353937544fdbaa8e47b544ac349b9533a3954b5a4acfed592b5564dd6b7bebab5c2f79555adca32ec954ea153e89426aa7cef9daef8ee8978f1bdf732c236a9a7288aa2a80fe227fa8cb9536f7d0da22406d22a4adf2de9928af0bd7bb3e4575f2bf9be55b2caab94a54bea6b6d4f6fa5d235a829f1d59fd90caf3a3641a493b353832a965787aa5015aa542a95914e8eefd4a08a6564ddcee86bd0a80e8de855859c88c8898cfe6a3ba26be9b3a25129535baa542a954aa552a954648fad522727be78e574510f19e5dc6b2a34ff4d89fd945129f1839cac676ee41c951247f722229f2a1f2cd18b22359d853b971761ef4884ddc85247f1f5a3c617613ac5ba55a5f8a2a68431925ee40248053b402990029402284028604259b5d60a67ad96d515cabf6cd4d4748dfa229d1ceb692a8450045f545da0652357e72c1758df7d756bba46a514c4d7c43535355dc3e16a1b46a135f8b4b539e19c71eae4b0f954caa457628c5468cafa43f43552cdbd65892ccbb22f8a38fea8e651cbbbb48c2c96985d0a06a5f014521db9e4c2ddbd39276cf3596633c6e6cc99338710b6a7f136e7c4978d39e7a43fabfc4a75604d0da9422324a1adb58f5028cb640624240a1420c935990109c1a2359d9c965d84ef78e864e97472588c15cb3dbd6799b9dceefc5d1dca5773f18a11fe55638cf2a3c83a39be7a3e0c11fdca554a9f5a5ad1af94d65ae9e8a9cb3bbeac8b3be9455424727f97db7245f8b2f08fd2c8ab4aa9899d54453e7f7cb23b1aa493c3a81447afd0204a83e2533c979cef3ccda6777cb2ff552b16f9b4bccbb797b98cbd5cb6f8b230bb125f958a7467d6497ba74ea153e8143ac527ee445785f2d5be7bbe4e0e11be5383e494154b6eef09315785729392c1a8bca7cdc497b27d0ba9ded3ee9747d1c8ce97514a7cc92c7ffee8328733134bcceafb5b578612b6c23f1817393a911fa51ca9873d2e9d1385af763f2f2792db97deb7af543a878c0f237cf8a2d2355a5352796c42169f366891a988d9c892852c80cca4c80224e4483e4066526419ca9451077572d83b46e3d86d1942f6c3a00d1b3810bea4587a76b8a6a6a686b673c8846c3c51b4a839e77c133239a75312421bf9fda36ce4f754e2209e4f7d55fc6c521cc45f47d1a4e91cf32977d998b6f241f58baa1ef59be5f9acc68655e1f4ad2a9c0929b53a3944d038fb91f7442d84f3e5d3481df2e5f2d32db50ffd276cb1f8f24c6de4e912525c23270521fc7e46d339fa67f7e5f2ef2f1b99fa7a2d7ca2be06860bf65af580950f35c3af090155e150acc6cdaa47fdf9ef52f0bedfd1ea65352296614dd7b09e460b9be4bfa70249d4afcfdcc3161f9aa26bbfa489621e9489324df726e93a369006a1ab34a08305898a77503956fbcaea32ef4d35a8f52a517dfdae2e6b03b898932920c9415a863e7cc9122574be00e58a158ce189cf02ea7bc5802a036c01d58b904300b1087280a2bdcd4c468eeb4477576aad6ffd86f575875ff09f754db05a39ef5ed54f5355df44eb9ba8faa659ad0724c7820fa465f8f542d104b2a7faee24ff721f5975d51c1574961b27de1341ddf8781140e2a63dab807801a50a1190805285083d37a22985addf26136cfdf661c820f87a4ff5dd5351b6be5aef2a1cebebbba69ecfcac9d6cf7a2ffa17f517fcabbffebb266aa24c70bea9e7039293ab57555fc97cd5872feb53d9c23fe40a3346e3297ac19f52876ab8064ad1a79ea2a4ec9c8441498eb3524a210e45caf45ed55353956b4eaed85fee2feba989611e543639cc83cacd68b43759b8359677b4ea768697b5675dd17f958ff8145fa2778cd1a89e311ad6d32bc2575ff4df43e937aa7bd1bfe8cf9f150ffafe953a496cf211df7dc4eebbea277465680c5acc270c4a745f62c2a5bb3f3342f636c30b9f19e173a5121266a96040469e90fd25900b9ee4cf0cc8481399ca0cc888cfb381f3205f325901535851032b8a40e2481616e47ed62f73a8f284274e8840042b5c6102e76eb02c84942390d203d6ca22debaf1f5dae793b437fd2d32f1e8ecb9b3f51bfd8c75c3d63debb41e019b1142de3c1fa411ac83206a577b77f7618253f31634f7dcba4c638c316781abcefd559d734f4ab7e69a6b2d867f6badb52f3ce7accbb8ab66079d5b036516707f9ddc7c341c1e59c7b508666439d9c39f4f2164f00a56e2eb337bf9fdfdeffac19c07104a9709b285f9f025b391d1a7bc143e7cf8fdd09f36b1cf3bcbe5ef9154f0ec99cbc8fe7edd563c89d1a2836e10e209dfe7e860940e9a7a788847f072aef6e505af5612c9060d00dcf042aaa436544b2a954a31514ad59274d0010d4132222ec8cab8a0020a89e4dece39e7303a27ff491c9fbedaa2735cc80ac7bf914a319a50e8dc7bffde83ef41085f1a1e8c158eff73514812d1932cdaf053f292120738594b4c8c38ca0aec1c0cc7fcf793e1a0feb11a14d21a9108085de7e960842fbe076184d6c1a09d8b31ca02561d744388a57552fe000cb55aff27432a3d20b7e687216638de972ac9416906eb5c6686cbb42d6c7fcbcfbd6732d145bca3554bea7e3f804cb2d2cbe448a3438e51ca2bac94b1f892a1b9682c7ce9306aa1f0f53f341b127629955a308b3fe3f5b2df162d4a68418525852e3801820a5c40865a62821d51a968408213402811810e1d4a275c84f1bde7b670630892792fb2bc480a135cb70b8293b59bb9293fa49a5d1d72b2bac7921396e4642db52e28258f27bba7a521d63dab7a2871ef9408793c2fc6c0bca083dc2e280487fcb0fb11697139213c9e762206153c1e4a0915315a7cf0ec61b1af08ea55f00121428408b9b19e527ae10ded4aefbb7137ed86ba4aafdfdc54f752e643242f2b6307d6e443747a6f33cb2c5f0f9b6c964fbd67b9a50f86835947407b9aaffecbbe77d8d4832bd5f7d11f0daecfd7cf2032a4b59ab354c2d77beaa97cf78fba6eca29e56756c9872d962d0b73c29ddc375835c05f0f0ee3e6bf2489e8066c08a8a23f6a700e3b778452125113c7d3d500d9cd6477fd872f0da1a38b1f866895457951a244d122424c0046a3bd080b120d6fa7233b1e20afa4ecdc2fe9ddcc5d3f48b93d2c9b94d6ceecde7d331b9936d3debdb45ac86a65a48c288bf225f332c4249824a44792d5920e8004942a8e947f90503f54bca84263a9e1b91ad0294597cd978cbda2cbda0f9a2ca519ac94d5ad918a6f73fc7965106fe6909dfc41f32269b2c38e72a7832827a318b5b16e0b19c4e79743962c595e93e2bd5892c1a31c4b645160946936d5bfd7a1d958ff68da4c8339c635d848d1cc52be7d635d03b09952c9da1d7a6477d9ccfb3a939f34800f364b0c64d7c365efa66510985f962c59e408208b22fd49014348a9c8c7162745ab8f2d5bd1c77786c3fa786bfc672f6334de8b6e331aefadeb8cc6fbea3a46e37dbdf43df57ebe77af4a075f8431e27ef075a0ee0495802eb6051b7a81051303dba2a24a6043f30a134260431de478726b4d487e5f02b2ef0a1b8280dfbc4aaa95f49eec2cb4f6ef3b4ab3a1fee12052a6a9c1bed6bea7356bddb78f92af1204da0d857b480da5c6e29c0b22f393d9b98ccc8ee711a1b9c85ecec77befe4b06d4269c87b9145c988ab116957b87ee9803820ae9db3c23a07ddcfeb847b59f9a87a70ffa4744e3a777a6bb0fddcfb517d302b346185265ccdc17bf85f94c12b1f1ea30e6cac6587db0a4a4f5e9021460b917683f8b02fd66488ec647cc094dba1ce78c9fd65d3b92bd639db6c802841ab2ae590c3c439a22c6c3f104d6601fb883e30b0a33d2e723b396c73ff604d442d00fa026b02bba071f23d8ffe487487c377170811f9d5fca0cdb799e6eafbe6a2c4b693d5bb4f34ce072eb716c4bdee7ef0fd022122b7bb409ae432edb5f66c3ee9dd1762b0a5182ed39c78efa57ccf2a76914ce6e53876380e421cc4f94840962c59f273d9b98c0450114b8896c8d78ffa8305493993b88c733993bc8859d780efee7b78af89244b9fd944d7703f397a72f4e4e8c96124074f0e1aecc0b303cf0e3c3b10d961678723809814ec79739e18e1f3d65afb4ebf4e6c07928e7a7f2a2f8f4bddda2eb56e0f96adafcfaa0738f716b6debd5559d8c403cbd6f760d9c2d643ebe15b587e7c9d7ca9dfd1faa94e9ef747294bf67468bb14ea71081b362074d04167c345dc3535d20bd6bf54436aed052baba5594214233d478c54a12a14254afd36b16452bb5249b24409c557290a13264cba50a9542a55a80b500bb4779cbb216890cb441ae49e63d9a7fb7699cfb80bffddaee1ff2ec4575329d97df77553ba86c3ed83912c915bcdcda6e4334d4eb1de1a9dd207e81cdce814e7a0bb74fa4db10f6227a10f28371d14ba46598574823dcd196955abf8954e5c43318a925280827b3a4829508a924ea0544dd7a0f8d157d3359a86aab91eae7199b6a481cf4ef78e8b42d3d8af0af6ea9e7e429c95be173f3eab68ef68cf6709243e4b20614aa2e0dea3422f8a85dfeeb30492244a903cc1761f794b2049a2844ea141eff5f81ce939b2049d22a9148af55c354ad9de764fb369b57de8149f2f5036e36a3ff1480e1fb17499feaac254192827580624032d320392024aee4c65f4586df5d56fe054f2f68e25259dd29a74be9473ca39e794d6b4acf6dcaa306545f61d86838255ec9eb32f90d62daa2caa47dd3fe9abd59db056d5f30e9f735638f369acf19afaa7b51f25f327149b4b0cc7d5d5ad9f438be97ab6f85905021cfb21e86a55d2ef70da289592d297314a495172c6eb60155415df126d8156b5c585663aa282bad496a7a49a430ebfc3278ec57179fad6c521c54b39a156c5b7b56833f03b4a7b08f35fe565023fbdfdd36c3a8acfc028f9d17844663b9c4e27d34957a467158e0ba59c58dbd2f23bbcb2e2c5ef70d1164a94130b330392a28acc3ad31b6abcd593aa1e9e4d55155e5411079a1910d00c783825d5782928b61fc6ed7c43ad807486f114a6dedb43150e09d72858abaa3fe40929a6fe8d8f83ad705cacd81b3303026a81cbdb2b7aaab2b8b110dd0ebac2f028332029d4f0a2e670e3df705d2a9c16dc416470a1326abc141556660664044ab66ee7d912ef084685f3e2761edd161a838d9f434cc5a3f38ba730ca50ba9d65bca880742e5156d8f8f1675411cf27d8fe0a48e7185f01a301ff869787240935d5787dc76560118c067c7a85ed215390cb08b90c7c1312f6e5e508fa2ce1d3150f9ce953ea5a4f71ac70220e37fcfc1b280e1748cbf46fb8d844f1a4d6cf6f31be738b41adb7dec2b846192b9c48e5ed232e03bf7b8044fa5446a5ee7cea186b8de268ba9e615c965986b92070a4cbb20bcb2d4f65aac47058a25abdad2eeaa589a239991abd7c7a4d23516551938f3a7f5296c2a61ea89f3b9cb2f66baddfef52e10029311c254623a632bff1689374c69e53f457f597f517f554545954ecf9a256773ac132a02564215f0e830c793036648a0b99fa7abb65933f7fca3b9f528a2f2132253ffa30b1f318be0029b88c8989c12d05e6598513c4cb85f99818dfc00ef6ea9d3c84dfb85a4a764f92fd7be7c76fdccecc6dfae66a23d9bfa5f80df7445cc6e5bdc221fd88c63429e6c2c0bcc0b80a13f3f2313030306f7a817131d5fdcbc7dcce1bf01bee656ce810e365084006eba8f7ff1996c8b6bcff8e05f80dd2fbf3d0ac73e087cbf81017dbc0cb7bcc77f6ca474c8ec1971030bfa3c15c0bb8cc0b0e026fa0749b741b8acbf8bbdc6eb9dda47f5cc6df5f749bc9edeab61297f1afb7933492db4bb88cffbcfe43349bde9955acbf5b20880d0461385a48f62bd91b8c5356b4ec3e85d49f18f4381e2384a492212b70219301c50089bbbb8e10b22c81892b8e2045880d373d061654e1640867186205153f8846409e86c58822248f114a181191207978ba797672f7a4b206356c610a265850890287228a143103118420451137fddedddded3ca057cfc0766ef712a7321a5e33038281927c49c9d8902f3783368594383022055b7c010b1e08a10d5c2c9942891159fc4891c47f204306518c78c10c5238020ade041028385852640564d84293241cf652c95ae7b05b9769fe1c5029bbccdef5656d6a04ac0c3122240648602209346530c394315861832dd070e303185cf13c34c04900e48bf4d95fc2c005478c21dff083295150220b32f0e0053797cd2d0b4c40d14211292d30a2c58d0480681f04c3d1b93d0f486eb026f0c020b74ac2c2b626cd29f69ad14744c9eeeeb2888c31dcde7b1fb1230579d9c1075d0ef2b2732e8636044ade2133a02141997a754ca4c0897ed84837b03332531738c1ca1732633257e7eeaa07c9428132bf3102984f4c06d52106a93e9bf18bb60ffadd1c5018827f8ccee1df1f44b389c15a8cd62f993979411072c3977d72c5c82d5da33f860d2564068d0e1efc0603dab9929b0565576225468ce204032aa28b7cd9c80d5444155072dfb8e641f88d8b94fdc6d592fb1b080d3cb973ff06fc863391bb07f9aadd5a4be7c8340d587e6ede6537d42b4ecbe881b5f9718c9d7ed62f5b88f31705653996011d514466402fc06287cc805ec024031df1932f9b1dc8054f808e6092fd492ec5c117f864272b35623f5fae56a10751aee8a00822536e6e6001152ddc40c80a1729b871315091c4053b68c31558b070a3431114a0e08a14dcc00b46dcf8fb165cb870ef39dc5544db2a1fee9b74594311a4224845b04a0227f68c31c618936d863d736962d9146c7832c51ab4f899820d4fb2cf7c6a15702137eff3bb26f7ef6f1eded1c1699a8cfb9bf731b79dd2cdfbb8636fde373c82969920c17b7877e4cd7baf24d0defc59a10d6de8a20b972c2e591ce6bdc7d863ec65777625eb428edf6a93410e02bf73ab7cc464882f21726cf44908d3dc79733242d7e6a4e6ec427e4fa5ad70dc3d7bfe1a63ffae699aa429fa9ba0bff71a8e6bd73d6dedb9668df0e230ad8bec5c8333ac4b88ec70dc02763b97ee578bb0b994534a11cbd26f88babfb667cd796bddaeb36b8db5ffd698738cd558971099311a6df6a38209ba0761bb17f5d494b1616bad7db7d6dcdb11e6dcbbe047e810c66ba2a66c17df43f9e8b7dc669c0909cb4832b00e8176339b589619743fb173781264cced65e5f05c826d9901ad008acc5ed24973bb930acbdee402ebdf546e4fe38bb05ad7055c4a295f5febd2e1017c590861dfdabfdd357973f3a78cb039e7ae391f1e76957b56b1fadebdfa757bf79a22e641bd09f69b5c3f06a4db47f3c7fc9d031c63ad23bb0dc167335ad6e9c44677b7e2e1be79766ae091dd5bd5a300dededf991a7336dfaf699a247b53343de64072b2bbff0e6fd9fa0df6f0d9f7d3d8dec7ac7c68cd3dead7f9ac7c684f931dff93d8356c42e78f943d5818329ca2c167f05df05fd679dd4b28a3f496da4cb3a1d55d4112a0a8ef37aca200bba9f009eab39bfa37d52db599f6b3ed506a0368760a4b63edaa07fcf7f5e6b82782baa92ffb45805512a80fa588f5e9ac3dbf0b90e7ef708981749659eff58383b07b87c3181d90e943966f63fc1ae195adc7d22945253d55e1d81fcb32bbf1bfa15565cda6ddb06a5f85134d2ec2e75c5ff94dc5374d93c737c9e85c7ffba86abd4ef8d36bf2d711c26e68ab78b030b029727caf781420c777550f54c41f5dd583264becc3734d3a95059d5258f72d1f7e96f8a3eb12501e2e6a0a010feee1338085600811e490213ed1772f9a4fecfb1f7a503fff0795e9d3ae7cc4ccaa100109280d60558880c41332a5a83ca9af7c90df20453da4e0bd260aa9ce71f22fd33349538414909c1ca9d8f1616c950f49b51c9ffa56f54065fa03c4d4941fff9a00eb1c3b2e41d90cc6b26c3b98fc03a6eda8444db7853de9108d000000004315000030100a064463e17040d0622cfa01148010849c4c704c96c8e328886194320611630c3000440004404668860d0254a190779a38320a0b241e3f7f71e5218d5062fb260c49d7d85a3ee73d37ccda8669e3ffbdb8cd4560db8091882ae9112309089a22bf2e7252f8395a0a9069c2062e011444c21b8bf0f24a7d2b197f8ab61346c00dc47d7ebaa95cc3ce0f146c06dafcdd450eadc0cab22e73c1f07c6fba19d3fad27e07727913543261e2df5b1e0fe5368fe2e3c1536d6840f57be182ab4b4d39aa35c2e2b797f3e752485a20539a9cdf6ad7ae61bbe6669611c2d883a0471842f1663248db9def9523cb7da235ae72fa594b220d3042753decb4e0101fccc7728fc460b03d81da2ab40424ece586c95bc889305a3c78e4efbcde9231b5f0c05b9cd13bea0f7af0766edff1b6045bfa9859cd9806f21831e88ca1ecea34c8f333e1a00942d6af04c49744049c9bfe9ec30f40bdc3040fcfa425fa5d6d702b8cb1436b287931117616925563525cec0cbb498a68dbe820075c4595d6c0d90d0ec4988fbb3eac178410ff2bf306821eab91af1024d99f22439242ca90883313585c102d85ab65f124be0ebef93662399a974d25c4fd27e1bc8ec68c84fc081c37c63b26ae72f7528d3d4b9e9011d075d0319e10faf3eebce241a2d46985bce5128d9c78d1e8dc209caffb73926e702d13f5eae73e52ed5de611e3c2f13ff38625b285a908e37474352e798f2c267f1829a0dd2587b4f8efb94fc6c7ec087f6eeb8adb5c82e2c3d4da90831082891ca516ef8592abffbe86ca35fd43923775a4c4b774bf5fba921f094c7d1bd06732175681575737413d7351c2b5092f45dfe71a2cdb6d90f882f64d68ac0b6313859fde3e0dbe5ddcbcdd79cc6e1e72b75cd6ddb06bc36e1dc5c8c7d3c65f017410782a2b44def5d445281bb537e74c51bae542c545270c77bd1fc227cf2fca655f6d3e9b37314d804719f7f3410350af6b456a3cd3a1c1254fd326a194e94877b741779ea67149c8a510d43c340c5df61412ea45a895ffb008c67d2f71ab60ffba429da1c20dba2213f2b9c7cd302d4b3cd48307aceb3157b29280b69100826fbc69cf070eef4cdd8a0802e0cae022cfff01093ad850ff0308b0305453fced3640cf27734eb8a5d1705d37ff29f9cc63b5b92012ba798d3afc144073db2c26d1b531ac24c76a47661dece8f26d01bd3040e435917b8245a5f87276be9678430a5870842817033d7849509de1e6d8e1fd2dd133fb1eb436679329a7015dd86ff38e1d0ea0f181688c2dcea978a7f1e873aabd54f486737dc5143e3c3ed2e3e5eab133774a908c0cfa49513addf3c008ff3b8a5925c2a71ab8c32b2eb47bcd917ed33ed62725035f96d419e64dca2af869f2b2d30f98c60c9c3bef35411cb4e3cd5a0746623ea724e8bcaeba3788c30b3aaa2cc0c62b83cfcf92ded68cb991398eeed9339ec080813e99be0679ed323f58e5eb2d98f17b6f4f01ab0dd9f405786078d62b68c94ca1dfaa0955053870d8ec137586bb1f8eb14c485a2b017bf7aaf4d8550716bd7b2412dbaa1191c37d403944a95f6a5ee441b9ed60cb809206cdf68b31005ffbbf9e2908bc2f03bc8ab4bcfc5a618493a325725a771bf93eaa22e6a82a934416d60b80f3ea1adb0387db3552d3bea595097ddf1eb3f725b0c43c24593788b9014af65820dad4c40c5c0bcf03453f84b07420e22c9839dc1323b3d4270a78ba2b0adae28dbee3bd45bf2fe1bb100cafd4b9121a89b2320dd3727ca1481cefa090d50dce9e98e098eb489d4338ecf4632de2cb88ed062e022aa7c626128b994e2a8c522e71ac85695d5edd32b37af904cb13ae4e2d4b2f6ff1fe98c838891c50b2f5480069ad80943093fbc2b5052b44b84d1ae0433bcf90778df979ef63e501e77d09f97cb5bf992900c81f5b0eb065e25dcca3bc09030dc862c39d4062ea9bebf390d4dc358701beb612f5ca9c1ba8ef2a5f7e7dddb161153e00e8fea2fa6ba2ebe661e5e55ca3482b7be307834eebd89caa4d58a6a00f49a280b821ade005ebd5b3eb75eb3303205393ac4396aa4fc1f30093abcab27e0568c8cb65def05a7b7d6d818ddecc355b39333aee1e2f5f6155d3d39b7272d6c24f9e45abfe382f1d568c86f4d64b0e9257c689866be2d67dbc62ce0ff9a941df0020abfdf60f9cd06204416d790037981d68fb07d48d364890cebf72bb1298945c7a3c5262ee97d6404376e0bad3a9f43d503c0c3cf2d253f2c4efa30da73adccbad54f0125517f5aa9fa32174285dad52e4013e71405b8b5eeae0bda69e4d853f84e89926d12822afe47f4096c1e0049262755daa57af1bc9c0e8c24737d93012100e057d9397c780078351fa0181651a16484013ace77161c48bd5d3d3abd9fe427b9cac6f5f04e06a608530a2abca1574653f909312eb1a4a514295c24fa899ddbb5e0c5b17c9e315c6470fa0bdab747a06f21743b7ffece24f0b56d8b05ec71fc4f816d2657c486990872d8fddc14e44fe25f497d1fbbbae0c36a4d6f7113b60fac320c87146dc9995fdede0d38408cacc2e08ac04c98c7ce1f61d60e2b17efc522d5e90cf9c517a1181ce158759c6e0360d1cc1115b795bef68945f469357fba3c521cfec1d5012343b984af47f38e3c92df210dbe51d37b6f755cde9013c30f437bfa8dcf0b0d5902a2b29d2c16f9e509e5a2924ce07f09241a56200b3542c74a7076615499807d2cb612d8377e36d30f222f0b7e1a7c279191e7b1bc0b6765ed5e340f8838806aa260f44e65e2b1bde4c00e56e9c537f1b0db9aa53158f60dd20fa29dc890b2f99b19b2bf65b0b522feaed49b1f37b18541fde161959f250b170988c1e5debd18efa6385e319125ac4280c994f87c03a3b088e7eaf02d04c485edb4900c0eb73d8c23485b2e417fcb3a2d0a1975d498466a07ade753b06931fa237b9820d3108508ab0d81830892a725d90e5235c5029026f66b34b38a72e270b6c10010745636e31fa030801b3117d75b7bb21004b77c563404bdcf58d32b817cdb86383c049e7ab41b3c394a8b21c45a017cd8e0d170a991238dfffbe88120ab12cc3ad37d6fb4563f74e224768549d683ada51f4c9ae918f13420548fad531a5d5351d42ca43fb1377ef68e653f3837a93c6d4600d9a801d2c99ecafebd8a9eb9d49bfd6c3a5f3ec002c5ff3094c4770e5a10c31496e77520eac6c2851f91e6efa8615f2e2b9a58f17c252c3ceb8f5e6888f67e622ac11d48f839170c91577e19345497e3cb04e4d0edc397135fee6f75867df4f3fa47511748d7c9d2ffba82264d122fef13a819852fcffd841babd3a99ae39116b6b0ba7d402ff3d5c432d3402b223b79ac99e8151ca30b3c42dc81abff94adff721b10fded9c1edc053f6c3e81a928d9d96ad5615f7457a19449f019ebe34c0288e0d1e3c9e795869bf6da771e10e40f49dede8fec639cc1c522fb01ac2b003d2587a0a2a6abfaa7257dc64f5e62c970ddae89b656a6f67c6245a691cb4efd65a4bce6eed20ac31033840585451eaf29facab18b9af71ab8d43476e51832dfee00f8306800c240bc5222bb5feb90d88e056d8dc0b65a3ec7f3995e9d5a88ef7b87111c3663b227fd72b9a50f4a7467522ca296ff0957a5d0f5388ae3e0fea08fac6110c9902ad6f7ef6a90ad3fdfea074fea0ceee4181610f3a8b3d903c7b8b53ec7440ed7849c1c6e722db6f2d830ef38768d9b4c626560bdaa8a4dd1691c1a9d0160480fd0f6beea4565fd09839d94af922826ed8597cd91b0eaafe3688024ddabea024e7050f240c73003f7e9cf02f014ad86211d7b7d3954538317e2ffc6b9e6d5c43158f80ff0420e304e4a253854d70275479f9945a35115facef03eb7d8ea9e46cdbbdaad178e252f029c73b6566f47d846ba13a72d5d4033a53124b34840df0cbe934aae8dcf0b0961a3cd4e2c356beaa7818cb6b86fc405044d6ce1b7cdd0ec1e3dd0b81111566a37ffa8f0fe09f2b282e0927728bf526ec94cecaa564cca50ccbc5e33d2fa7df79a71eca8dffcad8e1ffa0df27b9233e2a61d77e9f1dd3239acd5376479aa91e790d26d431e9393590e1ac6039b0beffc5b3a405fc23a6351854dbf26b97fe0a1d73ae4211ef5a2f0d83aa94b292424bcc5b9aa564503fbf5ef7c249242d9b45fca1372849337300f0930ede8e68a14df2928393339b01d927522593b162b33bcfa0ff4fc2227892ec7e3eefede64076ac380064c132e177fb886efbf181b6acb31f40f6ed16f1d88f8e2b992828668cae6958f968cd841bcc35c52bdbeaefee751b5374cca4d3f868962c888dc69d931973742b2dbc13f082f903eb340c57563cb080bab3bd83b19628d99557c3fe71a2f7c8a9c1be17373afb9f99a88fd6d26af05141343ee38db9513742f06d42bbe548b6c3be9e6b67353f6d9c88a1f8d5a278869513e7afd7c039523e220505718fd2fe1def05cc254cd84b8c90646c100ef8ec913da3a4f696e59a7f860d228776179e6d06e0a258b89c6c046a1a1dbea838d9b8c037d417012240c8c0e32b4facec1de8e3402bfd1fd59d94459311c51077b6596f4969183661bfdf1e1c5143634f93b9fd4f3a2ec7b8b412552ddfa2c83c348b74d69cfca14d6213f2599ebf499f4303530273426bd8ba63757bb6ed8ec809b761a27a452d68a973aead0067e3390eb6cdb4d80a09f3545a258ebce703387402d285d58a4713fe01004a9e631889196e9d469fec808749d008fb8f37a597b29ed3ae11f55bf98478fdaf55ebdc0c98cee824e378d1796183c8945921c80053a637ad2c56af490ca1e37f02be2297260efdac2a0ded4c8b25ff945c3a3ad206a02bb52765a3b7a478595f04e1db7c8ddac60dfe4002b0521171d74722d34dddd4ceb2da8191232d9918ae49f0cde9b6a16c4f0d5154f1bc883bdd39d0600675b126fc6470bda1727ed3a601e950f3105fd2eb6a589237b31d6ff27d82d658c44d1783da8fd39a584b1378efc8dd1bfb2bd5285cf295537d37244bd3c19fa5f94d945e51a43da0cfa8a11576af7dcfad3ca7fa331705f7b5b6910c1c4328152584fe4035d5e049a71ca0d585f39329dc444f21cda5f63d86c60c7006e4f7a19b12b8b4f18c2070d19f2023e632beb6a46d5da707ef2a033ec6f21ac4f95563238253099e3ac703752445a332c91d9ffc9bb5e3f5f81183735ac6776e6573a4c32487d3db02377ce1f60220e9b720a8a5d0efcf7373dc0ae469d89818a00c191ed860b049455dc63e97cec840f93d48e3bb3b6ba281dda0c079b4c58bbb0e37958275a48981f0f6b728e259260a65a06f08c9d96f8604f1a1cb1e321ea75621a560a12ce527dc0d7657c3b3a41be2446a7f28b31f69fce28e468e9c34db7adfe888abb4e569158bcf63dbe9c97b7785b83f564425815c768d13aa5f90e78ecc3c9518b1b4f90388fd30a59945b11c88c39e124c5dd6129eaa78e4872c106b342c7470408c14536e22974d7e7a2f92a20fb2f8541819d04c72ebd840130d887f4466a2ca557be00a5283eb7dfa7785813aca0cf35db011a669aecaa3738097033528805adbc50dd096a26d67aef6485efb26246efccdedeedc6f6bc2f0405a2baf2a0ccfc1d94ccc59f7e457d55575b18bc453cd5a11b63a190afd916aa9130ac480cd598ed2430babf9149a2bcec4e7ca40870e9adb9577d223e6c80c1a858fd4910a3eefe0f74e4e7163ee41448bfbbba3cd1a5036e21c7ce103319b0cd0a80c13c53585caf684292da2b85e840454b97ac40acf5708255fc6a5d7f107cff151998ca047db21443392cdfd3648b7b1675ee18aeb200d8fb1525e87964b2a17a8852cc43a93d69090751dca6eca640fa667bc4189e307e130808bfa58bac699cbbb4ec8cfe871dc4f2641f1a92d99540aa54471bb1588acbcdc46f8e4f11e3b117ae12df63ab0ebf2a0035b21cc5b6320349b45a912e3caa1d2a57003b3bc02f78b0782cd7f0a99428504cd4c042b1fc71ac4c3a38c91e7603d598e0da6385c55b1114ecfe99599da2d74a51a01161807a80957178cb7259d78908af4896948a61e33a0a15be8ee8a9c5193aab81a0007367ad93b612ae80145a210e2b525a1dd73580786b797f1cca8d31b66b75cea4fb90305c7d6de5f77d661c7742e01230f57b285d6593fcbe3d30e8b7e3d538288b64660ebc7911f71e83aca040c092e11a2d2c62da6c116bc139aa0b42e84ac1b043b1cb01be8e5c5978d0cb89a44e2f028ea33f9be9e1ed7614efda642fbc20477f2e9a9cca72baa013f82700b372e8a17ab30cf0905ed0cbb6f517b6434895802745bbadffeea6dc178cba6f936dc50d226fd75f381706204b3846e894232fdcad28b55cd54a452621f31d54a7d8a69e554b19ba5217b337f6f7b6ed94cf3a64569ea20b9eed8dbc50d22a774530f50c2de40faa8ebd840791ed21e2ab6a7268ea0819f0dcdf8bcd2a329d3f98b687788804c85121d09ebf069ad7e2a2cbc823279355e7a0ab325d61c78d62f30edd99640e0e9deff8edefda405f1a08668458221f1ea0fc35296231a30a966e11ad51ddcb3bf29557a0b86ee635c47518212c4668b28906259705ab7504809cfbba87c7f20e53206879e0451ca05606f3510bd89ceb5f61138df4a980da6e05db7bb093ee904c2293b7b72d6aa8447ea89ed567e31c3d8727b414c3e080db592126feadd4d11ecc7e3b7651af9a2199afffda9ddb4114595e51dd6e3e12832e6c3d92f491919b170f31f0d1cc4426fb94b595a0ff4024131228364382063b3a01f6495ec8390bf2bbd6880c41b7e5e4641bb2fd773d6d026e99efeb5cebc6b2ba11d856c796fc25910aacb8a90c54e1fc007ece723aff49607d9ae364547a71b056d0b168503d58108fd836debbba0732f46f2f7de9dce0d5c29a9136a40ff420753271f46ae64c7d8bcb97a398ceb6a92e31272b6b155440bd91edf72151c04285d6bf588505ecfe93e013460bdd1bbb17cc44023bf4ac3ce990838361d0e8862b59415e4cbf25dbdc009c4a68f9b58c2f6f4b8174b16589f4e8ea4f19cac1ba7e21a3518f91c10bcf942b21a91b9d0b165c2263ad195923e5716d092a22fae88f6748e52522c2bf48b9dd825dbc1904cd53b9170ce5007fc8673ca8206430d9262462b78398a3e9510182733b1fe227d5f57a105e684b4acb8b3e4187e98ed030f11ce5aa58074599a21010e71f7870f308d51d26dee5e50238bcfb205172475e77b43b160a8b0d874d3b10917339fb1fe158db1c906addaa11232bb09422ef2fedd5990d4c7b375729b5b7d54b831292c27909bd27b40480c5323a878513913ebc9844fc958a7a03877af8895c5d119d832330e9efa594aaa1762815da70eab0ca8e78a5f1022c3969f533b02a201ebe51a05d1c30d0d426771125ef09a9d08aa566b0d2de107b0cccf907c07a5ac3de030788e4b65ae7671f04daaa60351b3d7d6b8d19a4a17fe680434b259e109e5b29035ab85e2229805162b50f6ebfb00eb6592e456f7591d851904a3d5e84267a86e252645ed7b79d11e800d37bd3fd027a890fdd95f649bcea0e54e52cacce67a5f897012ff8a4bc41a2a9a7e835a1b20c9844aff981bad1b57a2841ae2d65774b3062e8802f3e4f56e508bfd4f3b480aa5ff2044dfdfed4d82b43525114d325a93c99ddc1c7708e298066ea1bcd2e012450460a538f2014ea0cb5e591150756f7c8ecb82b9ec9a5ab4a0bf68a1be514d8792e115b0ac2033d61e159473dc32244cbf53981d1cfcf9e409c234f95f355703c12ac9c044919b33060f8a1de59deea74fc9adcf1bda0854c11fec9456b78f53d5e661ae3748e0da7b820fa8d2e49e770466ed6ba4c12296724299e9644601610a46b22d7dcf970d3b063edc22772b38f432cd9078cc9b592d060823a872511e933bc89fff7733cc405394521449a1f2eb106b8a6d89c721b74a503393b52a00d22b4c018aa7a2ae0dc1b64b98c2776a8cce4289c4a6e0d7304080833486e27d70eb6fc0498606b024381cf34f47d667e48a845f9f0e9a4ff888e21d59d141ee03c8e981ec48e7bea81b6ac8f0017a1438e6dd0929893ce8fa94b817bcf137c1226d645dd44dacbf9ee90db916b7412fce40095ed9a3298b1ed49ae9565d691933b59ff28ed2ab1d465089295db5b09f16e1445af6f11803959d238eff0208b17cddc202f0e125150f0c9e389eaaa9f87ee5b04db810e870715744058884aba71f5eadb22d708b193af02b227b1fdcd1e5834611ce54ac7686c2f9d50914bd1b043b933b6f7cd9bdae8c348f99606a3c026413eaffbf7395c0c0e98ae833abe99e9d848f888aabc4ad19e50e6f2aaca49088548231e7935387ec181b29cb1216749f34b86ed5ddac03c3bdf9210755c49727549384a93aafb16c02fccda8cf081223026e8e2f962a228eaff5412dc4eeca7ca1f3f3fa06e57ee3ca57c87083922597555c7bca26459850396cf4f5ac9b79908240878b1374595e16264c8a21e84e9786d6fcd9125bf57fbebca849194f451bf316d27b92f3b034ce3a1fc9fbcb1a9bcf669ba8a6470255d9f2fb5af6ffbd0ca1a5bd7dc1dc153eec0ee46fbe1d72dada7b78e1b8aa42b1cde63b295e0ef8051d94686dfa26070202be8b0dc79d719270007c3da95976a0e40c2318ecdaa7d23074e8bfbdc71c1d4c08dc68bd5e7f6c8d7d1825cd5ded13ca87affeded8008588d398862a29f2b5a090c5cbb17e61ced0d93de6679db5f0073a347ba7881fe40ad4586877f5789cf6fa3caaec1bd93b2c815ce1214d6dc002075b3252720a556e22279b95c763ef4b01a5bb2c1c419d37ec271bec3745219299c298994290c5e910df741d7c51f141251edd91e4dc13ac3deafb043b4e3944fb5029264a6bc65227c47fc7634fa59e3157ec00abfa6a4165ad7703eb2e9604af041e0657a2483b31b8e133ae8616a147d0a3067619dcdb3947787d1d9d4a9e0aee082fc57b98007253a58bec265a57483c9cc9d0b228c5b845f2ab5fb813b71d45a2f490ccfda7823e0820583a50045d2185435c3c6a2758a7a7f47f7c00c3c1011ccd52d5a74224ca0ddc0ee834581dc95b48d248c8be9a8397cfb036641ad29d79ac2492fae44ca4e9c88c5a078bcecb6398fc13baed11e16491c7d2fa8029e7d0cd13c4c59db2e2461aa2359dd71906eed495f225e13cd1785cda23442e834d4804faf488f9ef3a27a77a7ccbb0890b3729a76fba2916fbfc56e056af563fd6d4c9df78c2cc14e5020147e60c59e0ee42437e00f9823291936cd4e5d623ef60226764b072f5d8a4137fe48e545ad5b108be723d858cec6155fa33a7f57e6fb51cbf4572adc74b84c3d0ed044820a74d421e896e824d346a6de3d6484aa2e7bdaf8d83b64db19b23d72f60b2ea4f3b4f16b2fe76a76a99184cda4c1cee8aede8807585d2e6300becd67741d6dcda197d5382487780a11ac4fe9e0e2f0cb8484300843f482ff3aa7057743e55a5395ec65d771715aac715cb0552161d50db1cb0e33207352e6bb7a66a25ed9fe10d1e2759b547c85bbc0d8fbb15b83dbdbc8901fa02bd89c2d6804821d7baa3569f3a450cb1d35f47dfa7e442077d9eb172f3ffbd5c40d1a19ae8721e4c877853116c0234a6429268372c98f4541d5894bb27c4ed3447c249b2e9606de5ccf7132d3a52c0337c1813e337acd2cb703d449c349ca9675738d177f6a9909b9d613bc08c13675539c8e7c552c98a4ae75ff1ef34a3309ce4be605ea270cef6200fb05a8ac3386859ab3d7331fc40f43bf03a034cb5f1dcff31f8f326c24f7c303f151f0d6f12daeddb0151ce2e117dfad83bd8ed2438fa369e921e4eab5462150b4c705d84c558257b8e1410ace13cee58870f8b4fdcea69766a82e54b1f91c0fa649da7164ff6db9ccacb708d5ea8d759f64ba334d1038dff12982c1a1d77bed4790b37d614d12534038cbd834f20a7b1543a363e892342a7cb5112d4b72085f8e46182e853158a50ca941339951f1dceeb9c3e280ada5b077f20de76803c0cd04f06efd6311815e2f54199edfe4575846354fe815a6f2f88da4bc1b27f5ece53b46cc630f479926c1231549be40d05472436d2abe74d3168853140a8dcd6ad150643715af9bf0457a72d4328216850229b3ae302947aae5bf0dbd70b4a6bd3c5bbf52c2aeaddc9f44398d19792a2c1019e3486865462ab4fe70177d3ccd81cbb2d799f559f6fc3257ec8c78d81cda8a8f2671e48bf5d6d8083fac8b2051d06dc540c6c9a950ea6c7a775ca2513d213d11e3f4348bd498e8010ed4ceee0b0348ebc34eabf7ccc70833c3f93f79699e8a5661c707679de233a46fb8ecd08412f5ae648fd7d6fb7db1110238612e138e2692257301f9881fc389633a447157935a56feda347515d15682a9fe8b4ab6af6aad9299fbcad64cef571b06aefdea183b1f50e63597aabe23d95a28408e6d53a94c098cdfdea76965eaac0ac9769e294b0db25ae821ca07d4995afc70e261cd8a5627bfa359bfe671ee25ef727f5e4d005bdf3fe39e47461b0f6f7a387f65218d5b054f217c7aee3dcb3474429d2ac5a41e489451eb35ec56ff200667a4964ef207cbb7b0921c28bf0885c8db9e9ba8c5d63826eae95a43f22682b7ce7cb9f21a5aee3030933b8515325ca80233378934536056cd8b8b9d1a59cfa73ee336fc48ce382ef0f5b9ecfff578c4d68f1de7fb5e33236eeb802ed624ccd5cbc6c009ceba0e2047307d0421c61e0aec01e06403ea655a8ade8daa7d679f00cdcaff95745d32fc2a71c21444400afc707a16426b02ec477b7012c945ce0095db3e44644f35db20e554da1e2f5e034849306b098b06798703ec34f8cd3c63b8a83bcda834f5e529063691a9a5e360cac0a1301055d39b5a83517832466296bfd9aa848b3d200a25e467d539da836f55873fbffa4559e055f3f5b3cb9d7cf4e4b1ad9f79e9b5f208292b05908b0782d30f6b444f5398fb53455de76048a80d86c1a576362d3398a7007259c426adbb80e53486474773c72334fb1aa22ea25649ec852ec78171f84a7668fc5dc393b81abf0878b8bbec17d674895dc3a1a17441f975f3fe666535d18a21bb7aa31dc7615f8c51652e69d3ad29ed85fe120fef3bb442824bd306d5b16a98fedfa7f7d63aaf38cd73b239bc70673c2173a8ab90ffae8ce5dd2a53f2b412f2ebdf39bc9b84a2a3390eb0955d0cae0bcf5a337c620483d81a6ab57156988e2e4b912fd41a5ca666a1781a8a65d068abbc2f0b253bde1bf8e6b7adb9e3b59cdeb3691fcf8156c5c41385fe16389236b1188d78fea20185b2d23732bb86615d2cb979b8929d7498105d3a9d3a0a4ed634c1e68d9563183ae3e500fd2301cab3fc677391c11bb0548b2041df5280560179bad5e255be374a921caf75d9c081e9451a69d6f618e409670d89a342d981a6a97a629dbbfa3ea11b4ae510c3bd9fa03827ed2febe4094b0eda1ffd67a6aaacba3ee740beaed62c9f6ebd29861213a14dc49cf6a456d516caab78d6def3ab54da34e6c4c278055efe21ea36312e531386f5cc7d5331b6444e95b649f86ad6459c9ad648b3dd238f6d38f43c76b5573285c6b30b1342d9af1eabe5eda421fbd2372c255d2adfa689ec224bbd0c9e11e022958f5ea73bf806acd358fe53ae5e32558abd4df66c333125aaffd1c4c055845cc759085a9f68621b439c0229bb45fca16f02039ca1bdaad3c8a5eb9c80df1408166830cab0ba448cdc9f757a21a5370659a2871750c302642b0b5d30d4b1112445d202258629e09dd7a1ba7187aca385c0ddde6e8e276f308bf812ee20f9fe5af4b2db2d5d3a701d0e6f178bfb511b59c2dc02f105980ecab8f622e42cfa4e5077ef2ec6ee454bda48627bfc2843c118cfcc13d0a8fbad1179d0aeb6b1faa4e668e2716314ca19a16d9a64660dcc180e9fbc67248de562a02beb36adeaa23c525261a730aeb6cd7ed1083868e28767e9d55371e70a6d75dab3e3ddcc18012ddd9bbaf3b1bf6a72303ce7027a50b46ce6731de1d359c5a1589a67ac496e1e0458c0537d080d6c20307992f5a4e02225a1c8f6588fffb298026498c1a16e5bdda4b41d4f3aa920c3b64c20f53a12dc489aef74e16a097321368567d2bf17423fb70ed3d1d095098b7c4463de0cf422db2fc0327f96b82d5a25c3fc3e1bf15894f6ecee4a9c16f1149c0f71c080d8cb44d463c241ace4c86931019f89198c485e6c426c79aaf78620e9c3af91abc0c020e9ac6d590ce233154fc050d60f4c6b17fe74c90d6bd2244af2cfb3a6156adb6c5aa97df9cf70c9ebdf9f1b6f2bcaf38db1df4591ff08c433da71e9c6c8048be0d6503f7b322a1554e9c9c5f970375ff57e4334f880db53f7a0c7c00dbaf70fbbeb5afda25129cd38d4038fddf2d6e568c302617ce3d723033601acc94fc3358ceba12d18cf8b3ae21873075fa6db0b5f95f1c8e1cc83b121be2f6b04b57df10dc80c195703a094910bcb3b4aa38c8685ef223205644839ca41a0806cfc1df39c169e5800cf957f100da1d63638ff0448513cf4244c2a1a19765f35f9e53c08e4d0858738659c15763279f8c4c10174ef2c29ec00874a36dc032725549a3b36f04f0d2f9c06199d6017f9df8da8f738d1bb1fadda8e496bd8bc5de0676153e913a618faef9447d82ee3bec657ee49f1cc842fa62a7473464d3f52f5185c316035ba6e9ca7cbc1602c7bfbf06ca4e1dd220f4359d782db687953566715e2ad48a473852884e6818dc80a1a60518e46cefc0efabe8842cf21c35978b76905f2d11e242f68d60809a84e861be4c0a8663e6eb2d8448fdc2c36a2b72ec940b0bc193d39f6b96f67a7c6aee784f4e7ff35a7cb3fefbf936bec178ebcaa01801bfc8122e8d031a8e1b883715496b53a30fbeb19f05274d2f98134f0299b6b76bccdbc96b9589130f94ba527745d2971c1091a45cf62f738909b968c7d032a24e898b598514434320b7a9d4e7ade32c2e648aed75d29fb6080bedea1120a695808eb9bb9c6f635453d89a8fcb1cb0db7665f6367982a645e6d6f32e9b20fed1b6455943a6f778c92a70368341e0f477a5e5cfeb50d76ab857ede16236b256d956c079987c12f2942cb5548ecc505a5a6085963e3158341e6ac88e64a841df6d8404e5176f8fe533df1694ded27cb68dc7ae75b24ec4f55666d2aed30a8a375ca39515958a055ca012f0712f325af5977185236ee6d41b38472bdde0486b80aa7d01f7839356b9e7567f0f32699da9d61d8e57fd051ede4e860ac8c64dd4514390e6b58451be304f583352f0b98b3a22aee804facf15b8e17f1054714ab81d03a0c3c374ec88b84940fece34fbd44c83232f741b045f69c8ff72655dba8db99050ffe3250f95e91b7fd8f75800e04002c8cc09e3e05994238e0dfbe9ecdc3d0793cc63aa82c1fa9b5aed893556298d8855d93381621a6d1e8836ffbd9443d950751aa113f77b2059a49c0b7b55936ed58033aa63aae01faf579ee3160822398a78a3c724ec6aedc7f5e5a55cebab9bc7cc2efa3ef29fb3d1316d2c2032d4ab9dd08b3f3672f52b34605dcc4dd92da25e056ff72f149b2a57eb2a02a7c06ac774be99936f7a95f9fc5cbdc16f2e7bae161d30eb2d6ecb0b6da71ad73b9bee149582e0f115517f123d0b3dbb5149869d48c61ac376f7275ae80a05ca1c96f5be100434696a856cdbfaa097b81c8380f1d3447f7a1b6c906b82cbe0a986c22e4f9d2444efee664258a37a950443a79930008e4f6e5a44a7b9338807f7fb6a3918ebca7fcf92b1784a246689aad8fb6a6b3b757e63e193ee1b21482084275774706f1071dd5496ae90cb4d40f8a95b4a860b7c9e8bda8b7ea047c15672bccb71f6580742f1076bb6d45e9a960f3b183d9430a8f7340f6653ae3d99638821933e87a33926a58cc93827bdbe353afc8665a692fc2857f61e5415498d384851b0744128706ae7506c778cdd53f9423a6f372cc97c6556a520255db3ea4d41940cee03157554bb312212d61f3028145f001d0a5a7b59750630baadcbc21f6c496ba8049dc9b36407ee19869ad48a1cdb3cb0c873c71041007c403fc89cc17aa9399517f404993b5a71f9db978a4c2252f504514ef3afbf0b6f42178750ed217324be3c8295475c608a4c690a758070e324d28a3772a7ebb6234f90cd26aeed577ee28ab2bb58695a93bb18559a6949a3d361c0a37dc8ad4204f79e383aa1d9e8c3c84f55661cbfff834b8b28a1d0b6bf0c809301c9bbb9b48b9bf0630e51122d77605e35554816e31df18f7dd7deed2d1322bcfc0a864603cf7f2d7b52c9f1e2bde5d19549b2e4fc387c414a6461fefb147801d5a3a0a9bfd3cbdd9693da5b03ad6913e9f719a06b7833fa25354623ab55c668fac3bbfb40e6b8d4fa86f8cbbfa03d3c31b0c62d984253f7a20d0eb0d164d96b559fedb561f8bf32f3a4bf2d48f0aa0107c140e5f8c862295517ef4e71cc239eb7e1adc3553fcd612380860fc5f70341b7c1ed31b486265a8cf1841763009c7cd28ebe00113446db2d555d3ede98cf10e33f9e0b3e2aff832fbac89f058b868f2a89d11d93de61f9875cc02261a882431bad701ab1b94ecd4af8e690f3694ea5a25231e2958a8a95e20f6a5fb2142835bb1fa199082e5330f87c62dfa72c154acdee43401309225c4625fa43f8e79861ee42e23d367ecadfb97ca29ba309f043c342282459754c065c7415eab8e8fcc48f0454dac240a468675cd4e1c62080fd0781905057953ab4c50b7541a8b968e234df868ff6163887f691d6d223c530bde158cf01bbae4172db385003130c8c1c51bc94d09140908cd931e4d5a44d87395e8f4b2bb48f7949c1e986c9cf94a0e6ef637b9816146fa3d72ce679a6d7fa8c5426a3abbb78ec46784e2f74a755933d27ae2619bba44611bb8fbee23317bc4617bf3d3f280926501c1f602da2507ed9b79d32817163c6fd8290b26a04bf5c20a46eb97eac203903e988a45e82b5e7509ffc284bd9726693c06f97276f3c4d64d9381e350b4b190d872eed228edd5395fe31b633ff1d4feae5e04055cebd9288d9e8df0f742b3699c0cea4b4bfeba98584ceda9b6d835ee742cd10e230ccb02e0fbec0247929e0b18d544c72b0e54bc8dc41439e7cd018ce3e414f9d7a4635e5d5e7c47ffed8fa3f38210a7090579b288c7b67b0ed7270ebacc9e616ffabd4496fc1f8ffc0f6f95a866961bdace9b25ac07a9d75e67583df5c6051584e2ffd40d7d88712e2ceb7f9cb11240d36d520e3b14f24d08194aacb83173e76a07a63d94d4ee5a8a42a2e3d7c97b397cf394e4acbae4b3908ecc191850c20501818d6443e9b03c300208c05b1e020977c516418cca6f0037c7586ca906ee374d18953582760f138c0e3dffebb61a21e2c7d040c0bd0bc7939896543578445ba43ffbf08d3e2e6ff0246150a6f788e8dda967dbfcad5baaa47e2a7ca908513fcd3d60094c896ade2a9fea3c594743f0c415f4241386f1c17992dad9d9602dd9b439fab38911c82d83c6e56990eaaf58c064a05cd0a33b6b15c2a29ce6ef8f2a240f75c87d8cc5f067e4842fcacf179676dedcde152e665eac1e5db5d099adab6f67b78fb5efbc4990a0153c92f708b7adf85c0b73b07360a1896d486390ac1f25a2198579671bae6c1ab196bb349a3dcf7ff7868fc2a6fe0ca26d8442fe22d6b516a402f1f98047bd0856425e823d6cdc63839cc10e9480f6a5d94bcbe7bc9129688bdcf5c5b21b0effe619f856bf0ca2278b8997a1097fff7c41c16c283d5e9cb7aa0e177e7e51e445b8a193d0756a0db5b14ab7b94df9f34490af0ac482a2dbfbbf7ab87b0f881391eb3a36d6ab1d2862f5700d6f8dc3153247eb647d7a9f19c1477afbe735678c2bb944e6544f70b5870b79ade76976b3655cc711d73283882e4dda615d31ed13349f9f87f1315ca8d8299a3aa61656db49b638d752332f26829cc3a81d40b7b654e2f3103e1c0c7de62759958192459ee9c6e330a36a305994e2ecce9049d5220707d122530e2a2838a7b035ae3f1b046c46de8502c53005da64aa9e2c50266a243d78e259037c163aba5026f9812330fb5eca11fe8b72830d0e1a87538d853fd6eff864af90a4b67e193cbfa2fd6d77588e38844d6552269938e7aaff35322fd6f3ab41cc8eb935ce7baa3ef51723c353e64556fb9f60925acded903d299a323a3c295de2215ae4f6075ae4764b6743486adb790fec70e886867d72b24234fe039c0cb8c2253b4808593be71e5b6ec890286647970e6f0aae50f011c57034a6520093b66edc9c608c3d50077a15a1d09488bbfad5b184332cb6ef20b862e1003da5d6eb6bba5520e7a4dfc630cc05c055671539724d36b9b4ec089435f59b8fe92e676b50a8ef743eee8838d5676b05d966be614eb98509ed7937712bb478244852e8216a0da78297922c7961bf4eb5e1b5d6c710a8a45f894fd18f40083330792faf569ff6e89e57e3646f1cf05a1c357d156c10d7ca74cd91940160ba29402c76dd1c4fc5925c7949d3e82b3c57e65899fd0b721d645a3b91e1c03d78af8f631d971f482e8ede11976f9887d9e7ec76e6e604067897148a1f1a1d35b94a51c574e9142a42e61349f804b1a4b76ec4a47aa30086223c9de43b6074dd09eb67e86d3c631e0b578bed1a1f0c39a382dd719d505c12b002f08161b151dc71ab22d58983095351f2a8b0244fa9f8e1a22ea28c90860ffbfef85c080f569f9bfed4496ef9e66b62d1035df955e194381f23c48a0511a451b21add25cf59d3148a265e8cae3b8285b41dbdcd3e4a9a58823162a2ac3194d28b11b646d13031d3d5cc77046077cc5485effc778a10845d03a4381efb3886b93084b724dd67078f4b0c1355ebb419d373ca16283a9ff18ed12a8a6cf23574bf592359eb0b578f67dec1075c337254f0c6e7545ff172c589271b2337ab06f2309eceda0933b2c151bf617ceb9a77bc2d183e3c0e12261e14e076542e14b857cf83dbf62642f4f67e83c71dce831540565e9eb656588ad54c6bedd50f3b866da212ca492cf143a1e36aaa430d3e9b0ba6cb114cb6986a457f47982ee8238806d61946322227c2372a69889e7f5757da3da4536744fc771b977b1c37a95902adc16f5c5e85d972be85fb16e3e8d30e4a04cc43af082a1c77097db801f012a084d50e23aabf9e68ebf4491428ff8a88ece9d02db1167ca1934f171c41c66f1026bd848d072cbadf7982f6e6c883f0133257945cd087e779b1b6f1c085d38231ed4266f63436296b0a25e65ce1eaebcfb83467dfe85b7af59112e486d1a1c73b860c356da1c90268dde2e0a088b5b60a133cb6811674a3143303d2de7f098a12f0368b3eb32ba53986ac1d631e3cfd69557fac28336e1ec964e77aadfa1427e3ac51fe3746fd782295a1ccc015413f00ba019aa3a0ce15ae65715f29e86ce2c2d530854c46c35d2563fc57ad23ddb3faec90ab1a95836a94b084dfb4c451e15a425ba378c8d6f05c51083da715000ff138176fa56e69eb4535b3910c4833c79a16c18aa2643bc43357a05d2fa9c7428e7f027d39d8bdfd0d3e0b3e2a87c066847b16423f783871d7b0a295a6048859c915bf910762f3acaadd930ffca65825c6ed0b944829c85249ba17ee9ba720290c0a11e15a0a81cc331eadbff9000e22245b13652e944bebe3355921f864b56a332855bf5459dc1ad1d0f1018f6cba305d6a5439c1e174bf5c238f1085931573fa1263f509f6535f93075ce6dd2870254ca19209c4ef97fda9683947e612db31b27c3b1591ea4e14bec4f43e526ffd8e8c0ded27b3de059963237d40f62d0373e83a4db32994f1bb58d22f19f189cdca89c9e123af575eda3da0af86c1f60872a629a3aa0432a3000f0f13e0f2f04582963b4a99c1ab73c030973f41016b002c6cf815f41258ec9ef777c38c00930eba9602f704ffad8403e6224076ef19171e302d9d933567e5ef67bbc8d0aa02fb21c3b360ea918d1d37b9a83ae69711b10ce516a9ea7540554ea6244581f62e17a9bf2890dc2f35c344f57cd17d766896afe074577baa0848439803256f3244bfd236b2f5b97302b2cb0fbdfd1b2829a2954e51e167a9b8f4e76a55eab794c5bcd45b998125dcd661bf55bdc6a6e37433efa931702849570158c97b0915418fa45b9c7625daa7910c274aefaf7b9f20db8d6795106a9df27df340775be546e4a6856f3ce93e6685490b9104db7afe695530b10e7de7b8dcce4829dd7592519b1f33953a32876ced78c4cff3fac91d2e731769e9fb01bb8dcc32d1109ea7a8b7090830f532e66b981e259d8b6e2abe5d58929f315cc921eb6f324e14360d92a81158713d75bedf7293a4183cfb416efb0e1b167e0e0175709959703ffdc0ba232eb6b05ccd2c5096a302cafc2da81914b0b98c48d006be8e5113bb6dbd303d3f4cba1bdebfb0b85421157810daf05650be3404dc86f82896f23987c0dc1f2d77991a721ded00ca154f07f6714c1810da4c4ab046ef3229f8552f4884661c1c95d8213ac57745c635b5643e6eec9b421fcd24eb5cb1acc772193fb4af6efb78ca097e44805631b22013390437509ca1ae6976d08762c329f2591f3659c16a63437e2590f4d51753da271e053e8700ed9d4506c61b4609a3ccc8d43a052f90a755209f492882e09b8f7cc08fa2baf6945ad4cc5392440189ac03a407bc6d97a17f5903ec5ac90f242a09a4c14d7a68db625e57632d852c91851a5686f0f88e07b26fba3d6a1cdffc50c1214f90f2890647802a00e3f6f2a3ea9fac4706a5162d17400e7ae55883e81cf89bec83be51381a96fd01231120534de58ff1022a412a683c62224b607340f1dd22cf92d7d2222da5229a504f8b4ac4561a2b1aca24983d8d1ec666b14d638a32c21000dbf142e392c3dfb50dc7d86df64758a5bd6d1e3cfb712ca6f82ab4d0efad56bfc017b11a1c2535a3d4ee53c5e53c291cfaf9fb80889374e5905d1e5c168a7fa017a32974939b89eafc5ad8a3605aab160335a73da34bcaeedc667724ccd66abf627b6d3d828879963b3fc16333f15d2f89fdf79fc35b593e62f09021e7bf5b4abd5f6ee9540e0ac64a404b402561825892762c49b54b4b90cdd55ca07790b5ae0c120759df06f125d0653bb57b60ca2494d0f2d26879bc5d451cd482f98cfd86602af6ad6400f9330ce1e269da37caddb809705c2e821609e43900011b4a2c749be85288fd2b51d78af19cbe3a955ee90a2159907dc4836f2bd90029f8ef0d38193e2bfad53a002b372684920761bac029902823fa891fc5f8135033144397d088b409a4101fcaf5eb5848351a1eec4d17727ed9dc398abc72b4043f3a3ccc66d0e4191fa4530532d434b4cc3a38876805f1ba6ca4158c268995f8084b9bfa6d1812fd0d969f26d7beb7f0920696449cdcb5e2d00f336588c8ea226a7d96aa4e13a19390a75f5106a695e12e28c333193dba0027582167e9e4c86357736918890e23c673fb7c1a11a5c7440b7817b5cb6e4dc16f7eb290553427cd516eab5b9beed64ee29853a1d9380f802f9313c2f22c14c3a3ea3cc51a31c72fc2f08b829eea7593e51715c2753babc29a77dcd2a5f4a5a0086a9b337947937af460ac0907be153ec4f1ba1a70700ff8528bb04ef24eb6d2581aca9b105604bc71d48c7986200b02a02f78f068bb4b88abec4ca3d9331e5d799dca6b031cd31060c01fe974d58c6e51cfd77347f217fa113040ee6d1cd83f628f1e9533d7c86e057039ec1241aadfdc1a87cf3d7581f89c4c0f85158011838f315d51d290b213b34680bc8149f5cf0248803de2a7e0786460c71f49f323b30d0963b1e25a78b1903260cb1ddb185f7e48060804cb21d6cb3290edf817d7faef5bfe7da20ef5d0726bbdc9f863f9647f9ae9da41ea9362dcb29328853862007ae710baddd457914c988c0ab77f73a62a43d1d4648738195f805b2ba6cc6d10a5cc4d2f96532fad85b3d7db6a0a58449fdee7bc4400ac86b0377b7baebb057f1180e468b3dc896d8303123ceddc1d3ca00713083fca8aa39f1b8f641ff52e96d0997ce2e928e0a8696526c0333e8983a2a807331e52a4a34d165ca878e0a857c2c372357455d46e485f9ed5e6957e0be7b4805422af92591e514b2c8b43298755f52b1f80df9074f850047f3cafe14d3650cf702e61a4a9aee40a0a77da4ee920aea4ae1d02afe73218c0c684e3def652e853b990a09001304dafcc95400da31046a31040b1e8b3417b245a60277895064bfb03dd565a490405a8a55ac9d7312060e44793293cc14752a4eafb702cf327483bf831b55e3faad008ffa3304644d94f02ec3736a99d4ecae244c1965af8823d2570a584c8ddf83d7a1a57f541ecb1626fa3e9590f1c071be678ee00a1fccb31457fbc451ae8e55d3ab4beb8ac5ce227b0d70094fbb06f1356445c6c6f69c32a677975036743e5ba956b0b33ab14d0f28aadbce2fbe7e75ce331c2bd77fa844cbbab51d5b8369e09d92da7bf9b03515a8b1c9bd37043e0c654ec4d0f73348b0394ed88d3bad81006e291e1a8e6621c4337cb8e5de023d22f57ddf75ea7dee2a871792ad487a5e0a804289bb2b156ab42c3c2119cfd3f5ecd4db1db1c6e2316ebf3700dc117f60e8879defa2683d2af9b4745b28e5826132d3c8962d2618bedaf61fae0632692e8fd9338c46b2561a23a8468b7f64cb7f6d61a6925d0104382086dd9adc578adc853c85c68e351f0574f3a3d0e23f0a9d1048c179db6931d3062ae458c1874da931e868f171015794d447c122498fc63bae2e8d7c2c1c74c0baefb159089892efa8d20417ef956b48599cfeb9a6b156b9bd2d8d27d8a8e7c1ef7c3fb7b7c02efa32dddec9fd36d66e6f713c5b6118f1f6a6bee7535770656a66aea17dacbc1c8e56005b9eccb7f729d831b8a76f6fd0622b09c25dd06f6f0ee8fa24786fdc09ef2d633a278bf2a4e1bd19cb7d29de9b3a18ef4d38de1bc64a511192b6d1de75bfde2f9f70697263af59895a0e6006c1cb13579fd9b36323100be6f47d60922d0300a0d076a2cc5df0ec4ed2c046ed1f50412ebdc12b569dcd6fa338a6bb4ab34fe356c10710e9c4a584dcb92bbb132310e93571f807221b47e6ce6988e4ce94a271bedcc6dcd67263a796f89e4405baedf58b12e0c70b16b5bd3adf59a6d69ba7d3284b98bbba673dea1c1d270207ea96db6e7c15b1ff1ca334a8d31b559ff0097986c4de0d3946188abcc1f18d824548592a9600da1e709f80d699f27e15b3dd09fb7c488694ddf93f7fbf9009b903344a818e687c27cc27f1d2caa01b4127ac905e08fae2bcbf2adbd8a809f343c1678bfe085159c3fc4982fdd621d8cb3615816a98d626218d6533367274315f15253ae1b9edfba2a87c0a37cc74aa0e3edcb499ffa9803661072a06e9430438886ddfdbdf8da8520bb8036a275aff315fbc4707d1d9acc17be9e83b7e88abfbd5f41c532b7ed5e0fc32471f1c2aeb13e285ef98bcbd89ece0829eb87320327353ce57039dd66d8d8d6f4d9c8162d35030ba9c4718b602ec61a02f3de9e389ff055ae2aeedfc8b0aac004af68f2b50500ae70b7bc11f355adc49f79fc1b91578babae2a60991988076401619e659e604aa9f1dad3bea2fbbf2d7026041998ba87e16e2e180828b326b2207407f73f55ea03055c39e3a9d156112401b9fd0d343b45043cf7d0231ca04011846c6e58cf140c428bf89e96a8ebca4801d67ad55ebb8272c85cda5b4ce564a2d3c9913501b437109db0c201c25904a1fcef954db5cd2c3fb8c5cd8c37b37b9aaea4d9cb72e4e22e6c4cc070ee77f04a10200c835f7afdcdbbcff9f6a4fbafd6104d92b408ee8ebca40c62779041607a1ee240872043215d3eecaf626214783dbb5e873a8d4fe670132f81c19822c8380b86b1136e5ca76f65fa26158247b5c8c9d567708580076275670b9a27161b7a224ae440950122151959044e4a3f0c21d54fd0d7fe441d7a26aa061ebeeb29e052c0b088ec11593fbb4d20960fc9d516b9e2bba80e4b3bd5b3a6d3cb6c1a4cbea587b6aba4110491137fcd49de21e608982af8facaf61dddb8d03b1b78185e48e5279ebebeca7a3d96b03ede80f0c6ac66287783276b407007a29416998830fdb2ffb3350f33464216fa73b7c4956a180e87ed64bc4394488ed82a0a69d3c0ccdfec3103b5f9d83ed13f56e88d87eacf0696ac436a09bb6ec28a04790b56bf3960caf4d4e7300ae2eb1dd336f17a6f558fee7360c13dbba95b5ff8f2fa79a235f04679b59344a2cce45d19cd8fe16c9365090643bea98eca349b67f43a48d5eb771d1bd7099d83e2dd94ebc976cb7bf62b21dd9e1ecee0201be738fb11df3eed7733e2ef391d9a98a417728e1635fb25f910da2aff243a87e8812740dcb43c347ae84d5a231fbe0a3e6afdaea779bcf02ae1bd7365e33ac94fd4ffc5866d9c9c6918069e650a50dbfe2eb3702af6c7cb5fef777970eb4b4445367e2918c1afa945c80f2f083bde7262473e7407868c4ad46260f2d02aac0edddc40ab647518ccabbf8b2b86cace2bb80e0912c179d020d6f9605c340707a2a360f0f2e517e8cded356ce3109f237056d0cde8fedd07ed17d5af0340a090eb7759163befafbe954cc5b5d95b93562618bde118095c42c4f994907dda1f75ff7de3a359e4c68c4b1e0c9e1c11beac6b15a4fdd712e750f35bfa3f38df24af03729d1d1a4016ebceb2638c3b92701ea8cdadc5e68e208daf774b1834f2525e0f6bd19e783531035c1e2046da988ab112eb5c4a814e48506900c0adacca193d53b5ced55abf5bc755d054793f654809c4aed94461a7d35fb242cd74cbb76f268cd7e425b444c69e1578ec74396daa08c97ecc82c9cc8ee474e8661398f480e27a27d29a2fd6a3639fe611e077aba4f88938f4c4d01006979fb04e153b3d7139893dbe87f3f0b0fa1e7ed58408cab3c91cc1da3becdf3b77137fd137ef231d970a766123e3bc39e70cca647ee97f7dfd7769835f1115d05a4b0860536bb06f9b4254a06ea4369bd964ae1b4c46a283c066acd4eb691cfab8bd71a6745a26bbbea2962a4de40d2647b850f20602ee03f938d6403765025260dba3054eb8aa2c0cc09227f4ad941f1835017a99d27ee82a28e44bee530dfde04edcd047be9bb3ca203f698ae9d186bbc5d00aea1eb192c8269fe6b0a5f0d855877b52e40f477f7b65cf9d5745874ee9fd24fc29da1e82e94cbb5595cd9bde10adbdd433200b27d4ffff0f33ed59da5de3d15f22676f854c95a0b9e5d4572ecdb373056aea4b153d7b50ed2d036b869dfaa53b236695c71203f299616e7d82ed5bbf36aa64f89e8e071efc455348f441ee51a5f30e2d0ee7e7fb41cc37bc94ead20e44990ca906d02116dc58d402628c7f560f3b1c9c21619f3d402b2ff2ea88caaf9268d61fa32c1eec9c54d8862790d0c45949e0c8217bc40efecf754eb92ce79a8b9c8ec510517355b0bd5e5dd23459d1c1260ceb3fd29a3ec9d08b27fab474f6b72f5d6719bab7b985851b10c1f4c7a43e7d650aed44cddca9aa89f546d13b9adc93709d187040081be3c77974a0b6579ae1cfac95ce1d9fa89e223d5cf012de896d743975948e33ad507bc7d6583fdd49987c792b6539b80ab4ec0a484c91cbdfcba5103f60e373385ba9e92d2402e05a83edf00e8d02b0b8d2cf1a62fead7c2d21e623efb627f8e6d3d61e454f6906100de272bac1ea0c2f08c258b10734f9d7977388908ff745b874c471830595c75e687412b0181f5631d82ec59f2dc34e0408f8e483b815ac95e98a3155d7ac0c69e87c571f1d2514716c920cbdda8923d97a0a68e9ab9c833f3879cecfc636806d90d6076a147452dec3c424ca01077aac0780468df586524bfcfa650d8f156159a57f6c97405dc99afb7a2f0596c29a5859cb6a627a49a9d03bfe4e05c40d1eb68830ca030fc70c59e716bb7cc50fa90f3f5ba25174a7e9635cbd8c26548d793056ddafcff42b5a4d7816ab1348a21aaf23f39d2898ab2026aa4146eed1a097d2198f56aae189c56ba9c69190d5fa8ff15b9104b620cb32e9e4f3a1440ae43b5b05aa83a09c8f55012c83523ee150344996df0f9ad93bcab3abcd8b4e6238750946bada6bf58ccfa9d3fafe542cbf56cbd893e7c88cb5ca3e2cdb5449204f0aac971b4e65538d72d2fceb5e738d778c17e35376dc9aae8c91440597ac665dea50e2ac61aed7f85a8242b01135898e56649509b3bf8819bcbd6042d8a1e5ad986b10a75bd2c4776ecb0eabbedf302d5452670767cdd38891ca995bc7d67aa5d197bd29002bd3b7ae34e20c7c33a6ee1b76242994bbc0d4afa541bcf4e5cb1f1ca0ea017f94408d4e1098d1627eb14e4981842191b3f324ad6f804bf7b5ec48443d4256f2487808e8044098a6afd277432c50e3821eeed78db1f7e0f76aace447223585665940f5cfcdf23828c9d363ec2f141086c52695ce8a11ac2104d04f9cd0a6447e91fe5eaa90206aad9ef25a604bc88be6b26a692e73d80a41256c8af7bfb0232ffbba00422c8f31040504dcfe3054c1d19de14590c41b050aaa963102cea20764e5b60df3f466565b598cf3b15cac7ec7c72f09fd1aaa505cad3802f4163923529778434bdd0d29f1718bbc10de71ef3f237fc76cf0180022507c707f034b6280af406506906204c0d885a15bc8d3aa475fc29db78eedf3017253a8c0ec6851636fe7ff49b7e0d431eacba6f235631ac0871389114ad393ef8440caae1394d4eafe80451ec061f54c936882b6b3c55eb8a1e9f45e2569de06bebf1205a70106e8746598fb9b39ff1ab724d893880639f7c8e0d2c328319a186ec828becc08f939ad9f1e15394f850bfcb2c4cd6b8a50a42ce74a5725a3f8be5f321c10278cd2e92c0000004d081c3b9a7319474b6a5100d4ad14bd1693d6d19a74efc2d0b694a0839a224f1a2bc2c871054fbcc212a31457cfcc361e465f6c8e73d14b03a5be6715b8b509715e54c4a1d5d3044a8ec958d5b60772ba318452202e9ab7089d0decdd3842e84e2170185e7f2c96d134083d4e732378d886f6051eebe56db57854ae5483b2b0b3151f925a2c8f1717949423885048ffe61b6df6892b1139846d6268fe36213770f3d23ce5c0e938b8f1ede0357ec54748de283e1f49208ca482b1f80e536582488e6bd341365d7056edcf9a0a0607539b86d673930a7e300e620391d69b38ac3cf258c047521cb58c5b2bc7af1eea181faa6179299be204ca0e111fa1c159d06070365837b6913816ea6e2b8168cfe984a1b5fcaf098beded6861583e6579e3dd29eb5b5b9f600877599dd637dadc62a3df4f498d2946596d9832829dff1e4b8a9a68f62c15406bdac7b536d49e3fc9621d762f540e5ddbaea72f84e27d8a0863a4deed95b354342ebfe311353563b39ea7f0a0caa486bb2053c264e2671c5e42ff64cbd446ca3a25dc05282f93dda3b9e3d1e8a5240a7b46d0c9e330c4980f58e414fed74878313135d2affa5ec1df8eeed82e4d7af3a6bbd7a8527a2088c9425d84b435516bb8e4efa8a9f647cbc459cc13dd6592007e5595d2d2b1d7fe51e6d255e7b06eb16e3be8d41aa26d3603d862a3210565eb2ef66222b2f57947eaa3917b623851242fc8fcaa23cd999e8738d8cdcb3caf1c0ee2aecd1b56fb4199f5acc5b3dac6b55cf5f4152e90e786ae232df6ae16e9d84bcf63b459ee0cd79b5d4b53f0c9d4670310588410b9c15c47b14a859728fc89f1828e4089bfb61f027175f5a03b5f522f45e2adb1050ec3dd877f020bab4947838b70805f29fed026a4c6be4a57ef6b8084a03ce9cae8120e24f4b3e5af9a4d4b91b4cc472ad5793321530a3254aa970c8474d2bd5118ff853ca268e05fbf58aef75813f030f8b1b64945096d251976ba8ddf3df47f0e6e9784893f680619351a03b1882539f219857b363a3a5b42804574ca1807601d8e44369dd5ccc3f25203516740763a507fe596ffdcd76ce0099bd598da8a92a03b2229fb069d377f3644b9f7a1d5086871c5ac90a9abe2cf161c29afdaf5ad0429c81fb6a655e36f693177690b5d239635110a8e831c434a879d19cd6938321662701b5cd0251edf17e1017562a3e476ffb9c796bce80ec47405e3b9d5f676958ba73ab579e06964c150510e1a793e38e7ed17e70b131b6a254464efb2797c294b080c56cb550ccd4048159d3286026557390aec9d2e3bd5a19d4b22cd3fae654ad057a657a7dd2219e8b4b3e06b3462f4c4ba5f5b970ca7e35cafa65eb2727f662e00b682858e809b3c52e71f63911c60e53897423297c7bb53d5f79ad725b72df160f03ece49ba2b2de5a802b657881ec57b9903a2ec72f31e5120197540c1db14e90cc6006ecc19976b972dc4f23c471d0455eea4c3123c0e81582e1110894f5f2e5b6a09a332635b2e851dfcee5326b21eb89b324d7716a87e54c60be34bdc28e99679fdd84e02a1c321680005383d6a844696e3d40cdd10a02669e744ae8aecd2a024bcb5f9959ab3e9105dfc05c9eaecb42e359a1b7befc3e9621ee70bae6948c91e5bab342a4f55dfb000f4e6072c1c514d67e126037f397eae24e63d199bdf7296c65469d38f98e81b4ad392ff9fb36797ef84df054e667f78e7f7b6d1e1cee005da09cf281049af331c4a8af4df5b84246ed0f5e6b107601b59101cd42fd6070b5d41da105a1a62b35ced5f368200949bbec15243695baab46a815e4d0a90ce4dee68d6ca81d0d242a91344bfbe75a1f3ad31662e22158fdd901ae8278a409546ec757e6990a37a00d84d37e20534893c656846289bb015c602576c9f5e79da9acbe4642e84f36071d2863f0e2e0b442afd06db6ac92cdaf4233f2a93f897c71066b2100c9946082a908e095d6ce6b1047e3537128692ee02aee8726333038871a7a95d22ad0ca1d8b45f2f24446632016677c8f188dba2415c5af5da1edb27fb682e6f450c311bd17e783039def9453fcc18de16aee928e8fd7a742d679ef0ec849300ad20141aefdf646617138711443230871d984dc356533654b81942d70d702d73f4cbfa129909a0a19f1e4b18b7a08619028c83f3c9f38e73b07959459f7aa3e4c4029c18caa6b57327be8f94d645d4d66c08e98eae1bda7d5b4049075506f2b974e415b44198bd46af3f554c420d2c360b9b14a0de2a8748c04e7872cf7330d540aac6fd69ee209b2ac74973f27c5198ab4ca4d6945a38a163ae8471410c837565dc64ada0aead26eca9a3db7abfe9e591492fb551ddbc9e853c1335339793265b34b4d8a93b2565282df13a4e280bafcfb2435b6491ee901a541d87386c394df393d99d68a91a8972a053f186ce60aaa5044ae86ce6ce121a9a55d6a155c2daf30fad53c6e6c08e04b26ec16f858977bf7ce3733d3f3b9de166669dfb0a5c31706d24f8ac30c3a396aa35346ef8c642daea8a9c8502aa1ddf82c836cb5693b8bdef8dfa0c5e83b4f57ba3555206408416f27a9277ba5a661c2dae45366e18476b2ac5531231f6fb38bcd18112d18590b923ea59cecdcbef4d0178d565a5cd8813a4891478961e9bdf52a9785a52d45660e20dc7b5b7c2b95a080dc55c4f670271d355b0d5ae835a467ac71603389844d9c8abf76d36bdb7e786196f42b369f1e890e0d4c4eea031e42a708d3ef2089eb88b8700f212d13523ac5c7f48cf0cfb91d8a5e47f6b34886b2843b33e1598520b99301b6ee3a729128b16f4b32f5703728f1122d497b787b84ed45f09b3454dd0426c33ef144141cdcac81e46d499de1676c959f9a917733f4d339efb2e77491df66cd50db55c4eaedc1c8af5ebc19f5315fdd3b33dc5650fd943ebbcb3da12697a1ec905ddc008ad2543ccd0c221e37d9ed8ef34be0c79caba8ff0d8a0ced04685d74611a9ea06b83a1321495ca5c659a9b8e1fcce06d3b211026dcfb586d8c9c7ffc68444d8a230bb2f1e69234901c2d118f42cafd8d3e1df6160b2be5dee31d34aa4a149abb845b23441c0953e54fcad963dae1e0a21dff97b5df4aba27ab63430291b27373a03bb2a1d9b12873b2658c4150ab7ccb589ac277e91837c7aa34328681023d870f3954dd9c7321acded09b8f0c1c42154b8fb220947bf6487dbe11829e1b001140a04e94579c7d76651a462e4108e6031af8c56fb86e029c44c9cd67c2dc93371990fca0c9dd248de6b4594ea82da646559232025f54fe38110f09c8e525a957008ac32b4455ad55f8067c8d2b275fd820df5cace190ac49124b730264990f414b2c42f59dec2efed728430cacfd4a33c648a381286dd8f579c7b71f7d06306cb321947dfbd26c980152692b989c761bb46926e2ad19c4965292070a77f54a1cca3b835a0b2166d0bdabbcc057c0b0c911a3f65e6768c0e9a7901a8fa7fc3418a61b814ef8f14fd56f036701d1e76c3a0e90368779361ae04e36424f26552425caa1b138f97b56b3a08c65978622b546b3ac2945a3a23c634cdebbef93f6ef1ccfd070f16775cdaa10cb983b01b1e6012c382cc5d596b7b0399c2ae9b7cc13289567c80145aa08196a9c6ceaf63b51bfc90f620b726f65110e45966b9cbc64872812c4549c80e483a72dabfc2d29e48d6eb90be3414d20f7b655c7f24f449dfee652ae004246b18d9be79416c0407bbb9f46caa02fb81697fa40e3e4467612eae5b95b1313d522766eb2b51a272fd271cc5e491836f40a8a468cae1723f616ba3154c74e1b8e67c5528d550fb111e02aa39a206a9c5c86492e3498fe560888fbd4dd2a365c9de2987aeb13396eda21a4732168e89f031848f76d8bfa4687f91783bf72c57d6400f741964d1ed9e5996cca8810cc44c864b2e20aed9a0f45453c3691b6c227b8f8afcf8a42e36408d69a8608a803c80537d566abc071f2dc906a686a0947db658a5520e985e4ef7ac9cdf2b15f2c6b84a369a4941b2a371f0ef1d82e367a6badf908c7d95911a504faf4b6d0302b8858f7a0cf1cc22f4c54c558b29b58d5cf7d7a5147ee397cfef1ab3e2cd30ee552240796cfe3fe0a194158f1fd808a9cc6a7e46cb852670afe1bf82626d810284e4a540ad8727d1cf4eddbf7a2386a9cfe94a475148dfae9c97e951614f1b02228369a8531360c2920e3b44fff647ed642477c0c942c036cb26b4f974ee73f51a9ce99a378e35e930b9638a645c9fec76b32e0b18c826940f00a2cbf2a365b0057b29af378ef1de85c4ca5926f9939036545a4bbc74b0a8036118574a05a35e34e46430fd6e9434a98801ac2fc95b103cec590a00fda38a02c44b132cf316b2d5692b985b30dfa77f5ca9c961968e6a3cca93c3780aec36b03cabddc751272b0ffef2445919e874fb89cd08f70e8de7f98a21ceff3badee4cada24193543c9bf2e6f8da5ff3b4e4ac09264edd2ffa12a068d2d86e78b377f46956f3d726f54894de26f64f279a9781ba90a8d4e5105232b93ffe3cfef30162fbf15661833beae982ceee706ecaf2f1f08c77a036dc648addabf1b9a6e4675196cb599e53dfe96fc6d9ee2a9e11f77f6d26ebdf6f2c7f5f89d4da89fc8aa81f6358db4dcea454b2bd15c7c260c055025f81f0551419a5e1589f850d0ae9db72f48b434646c5371b6d3f7ce71a0a752bbf93abdd6304d63c0333e7e6bf09bf342f60fd4d8c126719f4dcb4cab5a5830c087d494a2fd84edfaf436dbfc57748eb9ea61bf31d2e286e5c1e9339e76b900b6c703107b882a49297dc103267805425aec72c740b3beeba218699dcec314e62af306d1769da2316ecfa2918c5b608f017c080dbc5889fde93df1500d1de48f0b256c7839d49907fefb83523ef7edfdc7f594909dc9a1890dcb674d7a62782eb2e64a87f41ecd20d2bf7430599f94a32bd9c01b482ec7572fb940d87bf4492607ee9664eabf59efd3b49549312d583017f81cd9aab6edb465c7a43eec95cab1ee8928e7bb38d1988c85a71ff0a8a03e1e2c3262662c8aa16eadb2b528003cfc5c9b8ece5a8dd4d7c42b4308eb08c1e84039e2227a06239c2f254a165666fe94d72b5d618ff957f49faaf76af6a03e15f4b2d0302b41f795b2f6c792c5b67258f3680b70866fb809b40807759961cd2cda72e34f177c54b350271670901a9f118f3e86c1f51cb521719e4d272f2e819402d344a28119365421e87638c456d224d29d6c7cc2f9c61df5ca86503dffcb572029559bcab9c63bf0fdc1577a1ffa028655a99bc64343bb22707f017d8e3c76f4e03908e889bd7e9010ca74fe640f1a04cf8d8771728c9f582c5dbe5b2a4b697098a545924cd11e6a3a29cdd0dcaee6526fe6afa48cbe9a73b2cb7b2d2ddf967d3e4be43bd792101f93be4819cb84607d5ff095419e4ccded490d9f416e5264be485991a0968a48982185e54168edd451f2f8d43562515247e7d03d1305a50a776ff125a8c65fde8a2adf8011179b11784f8b43b589cd2263fca5d5443cbbde77992a5ca0e522a1f1f7f277496572740ed30f8a610acc978b614b3674a1f42acb6fcf6bc7d95796475abfd8f19c63f8c58190160d3cb2ca5618a2a1b749f112f81cb1226503e1b972ab9b2dab419fb7745780a3589e667dff17005808fe7a65690a941ed618f2ac0237756200d297a9d53b7e0b7902344a8608757d6ce0a286549bbd09dae8206c68b3c4cfe745ccf95c9e6637aead3589bd81cb2c097aed0dbef5c7d1c354bc3028e886bbb8c81b9c58f7610a63bab68461a6793335029609483567adbcaab8d9c7068e29752f0b30aac4afb406dfb462718b662c0a2699d52fd7fed449c69d82c14e66f9d4b51e0105ddf38241c24cb8201a45853b82f87f5cf18f2d62ef2b32091b386d39f712c82bc97cd80a51761a2e1c66985dbd2c207aabb74bdec8b90959422c218a1986129987a464173fdf5a3a371b26629fadd8b3eadafc49a562a613881470815bd8cb613697615877ebcda7671e0182ff84c37ef385eb72cfaed32413371cd69fb9ecb5c1dce49cf7a6281e53a87feea21b9c098e58cbec799352a73a8549098cff589c1f392106c01c5f98c746e128fbe6fe87e95c6aa5d3031ffc2173f3f9c660c9226e3813e0e900d380617e666664c135f9742f38f6a138e8241e6c14bcffb3b369ab4f208e2786b9c9447d9fe642bc7beacc2747d7b2b597366bee66aa5b63d8dc5fa8b798e747cabc327a1e18fa4558402043d98592d926bd9accc42887818db9a001012ff0dc83f3759e456f9285f0d62787cd139bfbcfead88ac99dee97fa94b2d07856ccbea5cbd606b4696137f6916501d267b67b5e0afafff455a1828e31192dfb1bbff51122f6636c9f7893362d1d769661990864db2f00d372cc815e3c4ba3329dab0c8bfdb6fda60d7791586e75e58322c721e597bffdba3827b238231a8a291db6c62247e1e7c51a1cf3016f47244323b2e30846b09c1663e42bd703e91676c4699c7e41735b2358016a9c06f8f6d9d6b4180c55103ef92b3ea41251f5710e5ee74f168e99a75fe7472faac0981cb08232351641b8248267eed36b5b7b595710b2d4e960d3b0a5b81d985c1cb1e12295316ecaf25b16bea1c29516db416d97340fb34fd41cc20ea6b3acc27093816c1bfbc80ecc7455dc647e55a99ba850b4b907afdef5213f07321e1c9d3853e7a1fef675b9c39f2befa71f5f30ac2dc848f167273699d3efeb300c072ab554d62f0f2b887ec7341c54171373e1c386508ab95c97c7d520bff7df65be6b83633a38115e23b92be577ceeebadd18fe31f3085e0ada978b49495240efa57eb6762f323b1d0d3300600424b84a6070a9ab0fd7faec85bb521e721840ae7e6eb5c06a13c4568874418247727cff0da0af9adae2217a598012234945f851ddab10eff96ccd8be60a98df7cc4be39c4e55d92e1b8e9d5d3709282c26b944fe0698f23f340cf81c3665acfba995da1f448914689a9793c124980d25f5e1aaf5340a4e365731412cd78bd124d0dc46123161e97195ba3377ea56173e4de7a70be02a1e80e83870fe706512a89e05c3472798d113ddef3e4580eaa68069139e69875322aae81aac77340ded1efb4efd8cd887fbc92e4be09c7a942022c8829c356960a0e090b500967a9369b91deb432793bd3a74a0a52410b24062ed0166d401ecb7fc93b803f3bdd75cbdefc686a531fac81c43bc9dbaf6f91dbd578bcd93f5c9bd4cf8b524a706b9a5b0d3b2f5a7b6bf03e526c71cf43790bc3b7eb1e593517bca8d86d2ec25e5b42bc8cbe791bc5a15935ac955eadebf86c220878bdfa73e1944e31ba43df183be7af300ceb6b28e65b83610c17c41d38c1970a9764ace0b55147bc8820014faa8c7e74084f39d1c837bfc034baf74f6362fd59e9787b034bb7ffd64e08177bd595beb5bcc4e9d7ceb9faec4088812427d21f5fadd457729b7502ee77ce44b1d97f05a960f114ceea30305900e269b40f0757fb6b9ef2b9265d1da56dcd3d22ea47883d33fa51ce5105cbb857b2221a523f4bf3367a19dafa27bafcc269a68edb0b7fd8a6b6a0c43d1bb760d17e75f8b4c50a8300a8c4ad6a77711d6ca63bb9c88fbd921a697f2ea685046c1b9699610b2ce55e47ccb64337299705314ce4b3a3baeeb55f16b32de2011c297a92b1f253c18b2c0879597de1a5a717bd79480c7fc92c2737bb412396f1651e92f629fcbf08ac037f8a91388c1d580dcb1720ab50011b37cfb002e77bfb1d132e891f9de504974c8d9fda58ee2821b135b3964f0c918fa18f2a17f732729856215476fae3f3096e0621b8e83da4c1aaca7f2d027cb903caf91e975a30561aa50316514323ba3d465de4aa18ad6b18d6089a2d5ca94282e90e4ed46bfb628655adabbe4c69e3996c5c8b3cdfca53f775be455cb9411f0915663d117aeead5695fafdf37dc5be926f4b3e2192902de5de524a29659232c9097509d008bd03a41a2c18faf6178aa44cf7f65fe7d17ff3cfcfcf4e739cf48eab3161adc6845319a752980ca454c665608cf18d31f38157c2bbede8bf2f34abbfc770d2adf62ba1946f2f0142086f6e64b3621cbb6d16cab1e3add36ec6c8188593a7dca4ed30a5901da3fcbe46c5d4c8a8bc48b33aee3b375723b3ede89789f19ee679620cf5783c33dece42bb0bcd4a7dfb90179a157962ab5d4615a3bde772767e50faf6129ed10a927c0bc198989818ac3dcd64da7a9acb7c525b6a47cbe15257e6837298f9c826876f72945663f2f738a7c6744f907b34d78eda7ab8bf321488c030393b10da204bc73e4cde63eb29ba0e331ed56f9e84d1c435d72a2f59669a7d3a9763ed7a3a97434d421b975f8dc64bb33ea3619a50eedecb1e1cbc06fa2b227f38204c8d0fee77a20644859e1e41aa9eb9329934699e9db63c1529629f29e693e6e29b48687388e9a4b9f88aee9c4e2693c6e1994e1ae7452f4e8668d694329f34cf249a43cd45cf63e46e02d13cc99ddc846af409d42c1b644787f789c030d2ed4b9e3a7f7a080ef11d76d93800f8a1a7038b9a2c3d7c17ea1ffe21e7260f078e6f171e4e7bdc3a6b7356c28aa6e8e8d0435f1d6508d41c51b3583f5cfcabf293f4d7d3ef700a4c2e3ad2ba4092bc8873a4f5627b1294cca104c13140a989c0759307b91ec30d723ddb62789be30de9fadd813880011945f480e4859f9fd68e7f674b50b668c289202846b0376ac10f42284d9af96045533484312251f1cc7e0c993e89c43061ae10ea985f192cb2134d09b744c990cb962ac2a806b350afded5cad10e993a8443cdc127cd1d093d1d68829006d21cb491aae2c84f17daf20472695607a57ca320a10de873a30d89321f0821d560d1aca1834cbd834410a959d084b7a5c8856e35235313ba0e8922cfdd6043225844a195cb82ec6fe58d0031861659a4a1821d84d16a874a9127051468d181065244491284563b446a875cda37099196727488d440b5422650e8e178775301622488d43c2f08415d969a05c1107d032589413f40257806fcd23f0d048160d019df0e9bfc200502c11f2084d04b2ee20291a006b74cc91d44825c2052b3b6bcf972488dd05521f2dc4d360ef486794915067234541d5861c40baca8a28a2545b4bafced83215871650a1a4038028b56f7946f177cbb8e1e270451a19d85ee6e180910591fa30f397cecc18b8ff121fdfcfc28c15c7c67f3dd4d93a20134c9810aaaf4d0849b598c7898f2edb09d66b959c87488a38c2e3d045346196d9ba059353e66fb3c32fdc8cfed6136b65a0b2dacb5d63a67bdd556af715ed5ed56e757f942eac3f19e63dacbe8e6a3c647cd0ff9f3f3d3e726e46f206d66ac31c618638c31c618eb8c31ce39a77c32e2508fd465fbec44f0513e56e653a9367f2addbb6a168df3c8d7b41ff96eaf463c20f179cb353fdaa7cf0d3ff9d0e78f10cc870f5f6e9d7cd3e3b6a2b08fe08c734a2ea88b9870b1493b3449c908351e82608c904a4ae78d2598d4d189a4cbc809348c7868926a3ae5334a81d2b713df4e70f916c22de516b5cc87fc99e1e3772278e9717b8f934f070a89d1370b51b049f27231eccf579107c5a1347be1d8bf1cc26bd2fa4f1a7c1cf6f958047f7dbe8ed164da2e7cfb33cdf438e9290ed08fd8963d9dce74b70e86495f6c13c6aeadcbece3a4e322dff25910b85cc2be1d9aaedd476451766e401548a21564512a9d3296b07323c70e27c0529c08c88676cce4892094ccb003307a309a001230574ac0021e342145956f974b5cf1dd4dcccb07f15a228dab5b7def30c3f7b75bbfbe485144c2437894c5fa4aa86bb70e15bca022498ca1222ecc20410d41441081831145372c9102b9440f056826d2902b57628cd9d363891aeecabbab124ba6f69d66bd1b5c8f6e12fc375ed59d6e1d3d4eb0657cbb5cf94ac5e5e59615d24dba4aecb5aaf1baf8e0ce396beb09e91c597aff689723cc90e14b87d2daf71e191c48c1520f37f0c28226607c510329493c313aaac116444fa906244d7819030647332c81460f4dc288011238dc40071f7a6481c40ca12a4becb0c3cd962c922863073448318612489c100189d1185da008a165b03484922025bc38c1831a6a48eac1194e089106184a524da808a30c18145d01434a1528d0728592123f70319484498b2384904284196491a5072fa2018b09942ce941141c80428410689084172d2d88c175021758b1c40726c8e841940c6c81030a6aa0458c24a034b1d6044eb4347114a506253276a464e185d10f1a32983284840aa224be40d1c549c3c0c80ba020e5408325237e5a8937462be9044742d48046922445785284109ea8420ca517bc2e48d22823076368d12407284788a0d8c20730ac1c3185890f31c6dea294d271ecd8b1634f29bb9790aa5c79a2e3e63a47a79aec23a49c734e09db4e55833127a594cefcf6f150d5179979ceedbd189f2a498ecfa59cd7d4fae99494bad44c4fb3d6413fcb43dde6880369a8c810431ed172cdc528a386a58d37d8a7d6d5fc806f7f7ecd0ff8d203f0dbbf6c477ca901e0df4dcb9654a2548560e90466c80c7ae94366901718617428046eaae6da6695555b4b2989c40059386ef66311969224e69d949b25317fde5f7c97b73c1d5416ac65aded8c23d01612e35693bf6e9daf12e4982f4b3d03a44d75d41c7c5c62bc2c7dfb08451298ad1391171968e6308166d0049a40136802651298ad094404c404d115525451214d558c33c619e31de1460ca3c36d6806f17de784724e891911c4fcf2d34790de6146c4283d9da6dedd9f3c844cbd3309bc567d5c3011a3f470c8d350e4a92e013899f8cecaa2d904f578aefc7044ed3b5be33bfb289419dfe13cf40ee76f379eadbad93072771afaf65394771a3a49f17daaf2edef5d0fbd3b31f1446018d91cca3e1d28675073d02f7f1905ba65bda7b52d06195a75531555331a80812e64f8a0c30dca3862c906b0b082861623d2b8a283fc9eafdef3f79edbf7fc3900055ffc33cae1cbdbf86794c3d1fffc4d8f0e0821842a000902a4b920d707b97b5f3c5ca159d08104691ef8d3fad929a179e009cdb2b9e972ac624e527c72df4dd74155bba6c870f520cc4cd855ad85277b429dec69ab44d9de1409fe7ca75900f0e725342bc6fdb154fe5c478f6669fefc8466a17c28e2507fcfdb6fa65d106298967bfbc9bc202641dcc985b6ccb300bca7856e5403f06b1dd3aa93a0096d6e35210138d68406e0ae09dd3800aea60dc003701371689b3a19be6e30c97e868556ff6536783a347b3a540c002ad17f992ad3545a72d7499ede64311b4cc2c898408220cdf997c6cc27bb91e306ccb21e271cf5ecd1512400d8858b4f19f5743a9d586821e924e9e9743a7139dcb4a7d3e9a4c20a5caeeb3a9dfc74da296167d36097c6a15e339fd4c6834c06be506429de95cd6a662e0c51ba2e93df38aa6630e96219f893c4e4b61fd3faef55dbd2098218de975aaf6beb3ef0267b7126b32ad77aaf1631c65a93619795925239b1df89b1f6ae8661c1d8b314e69593f9e0ed86eb2243afd9dd2e2a72d4b029b04c5dd9608f1a7694e13f231ca67c75011491e3d72da7b9ded17fd39c0a326642d95c6b8c27934f379d4c73dee9315ed55a9bc2a80c7bbe329f5835d97d55bfa9fb288d98d6e1c73ea63c519bc2d7f1ada1b1529ab9f4aad564d86563a53e7d564c7dfa4b1a13232775e82b7a6fbe1d52ea35c638a3c4680d76d908e19c50c22965add40447b8e1da6055e4e89daafd96a057f1bd1ad9f1bdd7c91a5ba78cf1c5bf31c62b4b7e8e92b18bf0d357cd45ea236b665329b1e3cbd6a61373e9984b9774de39a57c1fa7d4b0239be65af530d6e86999fda881f9c31a9b2eb74b4b7eeecf65e633b7d5d3794fbe53c16cc743e3a7173f9b36a5ef513a29ed9ed06484c401ff615972948975769d9148fc5a678c4462f89a1fd7e2da516a44e2533aa9df8941878f653f681e6ef7de5b33f974a084b8638cb5c65a6bcc17625b889ab4f7ea63dc296175c6c78f33d8f9f86074e9f746dcd258149993442fe58d8460e47662899f6f8b81e7f0693526c831f389efbd05e4d74f7b1f610db028dae88d9448ea192c51fa1ec102824c68c2f35a0f46b865f128ad9556fa9e9727df0683fc216f8b68bc93cd5bb79a3f9ce855eb763ee2c06edc3e4237c4e2bed75a8fe7c9b670cbc3afd2e5270a73b3d2bb8a9587fdda74642403295d7cf40c3218e29f910c987ce780a6f2ae9a6b1b22a27f46444ffe00ff8ca4283d97d3ed25348f8d80232161c96e398dc345c97573baad6c9ab35ef27423f03bb85a45df9acb7dcdc2b0264f1ec75fbf327399499b6512e39612e3adcb3221d6e5fbad833fdf5d9f29e0c8b60ef318896e5b8f98c5fcda8ca41c1949e1f2d2719639a65dcf341f381e737bddca6c87755923dd62bf5bd7598779118bb5cefad5840cc1f1d8c6011c8f39b6c180b94e746b9fce651dbad5ded7ae7d0e61277b57397a42a90a08ae910cfd5e5865063430c9fdcf2889292c7809c01459417e47548a8ea814f1ef88cad03fb7ff8ea8f8f0f4df11959f97c0855014613129c1e2e50b2c4bc03cc910db7f58a0f84141194c80b07f463a04c57f588c86d0a187e86e1f4b7a8c4ffd4a8dfb187cb91183a52011a05e81ac648d5f1ede194a74a1410aa0263908e1d45014060a6c30224b1a39d8f69d1b36ab1d49457aada9957a8ee621c1890e202b2481c44b7f32c74b59c6cb4aa74be93b9147fe40d4926e238b64b7a6f3903f63a2e49705913f10c91f885a2f0bd25c926450d46aefe9c8135d1e71b1ebd3a99ece39e7a4dd1055f418c460ca771e8366411ffcb018b5e0a7a55a415645c997bfcc0297ab5c90dd62da6ba9564bb9cb9507f5ba837aa4437e882a6a42d673e4b19b8ec691afd27181b058c820c2419831ac50814e115848c0c3171e8870468b85263b8031841731b614f18131528002a41c301104a6d5328dfb72d59269aab8b121cb306197e4d53fa31204518fc8aa7f4625b8e1bb9dd721cbfc335af26527064d9ecd51ac289246774ad6f34efa94513617636c289f4c8bbbb569eb85e1d664a5d8c5adc5af1a9dd90f11fcf4d6bae943be908b6f364ddd914c6194525fbc28ec951119badd6e381fe4d33fa32837320a11a59766d33856be6773142645318cbd58b32a8c79e8d388dcd957f56673942527689b2dce41d6eed82004c11ba1ed8695a09dc8638794bedbb16a75b3bd6f59498a386f7b10d56edf669e070c25459cf715d36e5c3eb1f0b59fff8c8698b055079cfd673454c44398e33bd0adea8aef6c9e0525081fb1f8185f70f41106407c84c112c7aa37226c2a60ef14c117330484722501df7e339f7e5c740832412c02e1a35f8dd4041137603243174bc8f420480a3039c0520510ad86e23b8722be65b6c81dc7451e7a839316f49d1b91a75bd07b449e37455118413f2de82a441efaf3f3f3e3a4059d8566d995fcf9692131f4f14ab45da461aa142201c47db44866f042065b205185195376be853002438996a223b8b4dab96e2adf7ee30a0dcef8efee6e6eaa90e48e7b38a459dd537ab205e5330123c14b8f5dd8f868c1784970cb165b5899c177394260b878928511424614e1882c5cc0c3b72a8ccce57437af8bef4af8ee720cb1e58d88e081881f14a1e5db39211408ede097720eb7fddd7427a487efbdf85e7c7908f9517f9ac524008d984f6695c9c48cf2708cef70beb3d8d0741271a0df303256c5b1a287233ad6c543ec0a4c8a87b17bce96c0abdea1fee9406f6d36a9946e361721f7bb7f5b901dfa1c8a3c4380c092b4f4031d7e40460b1e800b26a6a411c50e9a30d1823e9dcc272724dac57d37903ab459c345c85d6d48fd69d962bf19817c944a3804bf50dd54f26de491ad4cb573c3b9fa7040efc883fb6e665e906f121402e915c5b66180432863467e3d27ac4abfc2cd69187569e12408a577c6cbf2b8bc2e35be7b4a4bf88ace809ae9d2fd73732a29398e20f383dc612c870cff798698367c8e9dc773ec47febafa315bf342d97693f380648e7df1232f20819110405878a0c3130d680248072dae8082072f99d6a37df19df61bedceddc6bab8efa6064bd32151b3626c4db7d8f542b3ba8754f3633a1043b0fa899f7e31cc5ab9b2198874a11490d4c6459ce937e2bcf14062eab2d865ed55032716bb80e802afebba50292da382b2f58ef1eb5762d86218635424618b0dc1646218c5b0c530c6b4d468c1116c4dc716fba2856631e0a7df8a61188602e6353be49bbc06fb91c7df427313080ed5004939e63b8f0121bbb0b1d05caa4bee1e129020290d0269d08a93fc42e4c9f922892674c842881e58d19a0e82c8d3630a183182b081141e6c684d6761ba0ba72029cf5b0c354fb452fe3278c50b15452d940bc5f80acdb27efd5a913444168ab1a2295c686e3a86f9ea2863186ba1b989b1c768390c988736340e5012f6797d8361fe7558835ddb90e6a6b3d02ccca7056a22030992512052409e1cb5c520d3c41445ad93a7b4ec2f8c25274c1ae5272de537d2c049104848f805181fd4e535166beee2796004c120264e9a673a7cd22c24a6c32128a568bac52e16a6b730dd8521d7755dd876427333a55d5591ea890c816e84afafadc70914909e1d66148841509eb718f09416ca611624e5a72d060654b152d44aa5b493a3b4ecf24579794ff7e8d1ac0bdb2ead95b5d7aa1028e95feb39440ac00feebb407e514481c40be05f1457a6bc8d4d9cd80759c8e570bb696e1372dd2145fe7248e5dfadb3439c52086d742378e80fdae84400c37b3add9187ddf5d6a1d7adbbe0e972094dc07e39852664bfdc3e1c995f7edd9410b2f4761674f903fc336201d1a390f2ebd755cd35143d319571ea9a9c8566056f68e90d2da17c5c9871aeaa15b59fbab05aadb5f5c2d66b4ed66b4cd66b327bebfdebba0caa5ecd69bdb606cef1da5be593c96afce530ab51b9c06c472f397aee9f91122b7f65b0b5f5ba9756834dd9755df5fac96af161c6e3a1f1b5a2b4fe7bba7ef2180dbeaa59325b77e4651cba29f391397971279e317e253e69d76fbdfc450badb510de9c2e97d154cda97cdc53ede9180da230cc7c2af45456b72b8a0cfd62d7c668ef61f5d71cb6aa1db2f5ea9808fc930ba91b3783e90a320daeb2c8663e15fa9d7242db5233754788a854524821a5100ec0f416cbae3d4d51510e331e0fe801d2e3dec38c87fc930d41d80699c28e4fa60ce597a352a8d3e9ba289cc2e598635986717672abf178dae540e8f5bf57837fd2605073441e474f1afc179a95f9522cf2705c97529869dfe46f783a4b3b3c750ae5a9dfad5b11f114ae00daf074e896dcc1a1a7521e0ef8343365287ca94051b423c4cdd143b32a4b1c74e898f1eed5e0e3dbe2e3abe2a3ef783c3d22ce3361e5d15b8f75e170c0479e8f363e1600d59dde8588d3265c8fde0fc7c9b71c3ac0e4e8d1d123f2c0271127f2c0a399ad5b6599adcbaa231bb37536a7b62eafdcb9ef9ed253baf1dd53b2d36a53ca677d6a3e276d04bf5a8d068a381d79fa49c4e956ab9c819e589b333c8247f0081ef5137814b1ca673f893c00f0953bb7d3f5931b4f9e7c0c8a38ed34de598c3d22451e006cbd64b3bd889323524e79d4e215cf46fba5c52c80da5fb75a3910d0f65e1c8a11e9e98c912352f41bbfb4b8a527c7edbfb8da95cd6a623b25ec642b879f653f687eb5e1accb783a30f3e9329e4efb8d19e79653e372a677dcb4560b3239cdd65993c96562105469110b68a33d468b5b9e8e168f6befa5542fa17a296f4b52c3e21511a995bebd95ba0cd50ca6487c2771a851c3625b639a7e329d6a6ab5895d7cbb292275f5bb88d4451de4d021836a7401580093b4ea32da1865cc62a54d69adb5d61aa7afa2e7342bc7e6f19f3cee449c213966703b536edd8acef97cb00369d792219cc2dd348735eb527b270d16c1c8039bacf22f612f64a240b74c1b24c2ac804d40ae1d36593de6736b22b1d630c8c4d3694804570f479cdaf5f31d0ce3db61a694ce79b1cb524a695b1999aa55caec5e3c7d6694562a299555de182ca594b68354be7d5689a194104a29218412425ac3822bae90d1677b3767f4e972b3de739374c6289f742963ab5e4a3ae7bb9169588fd1afe994b66dce7abc20078356047ebbb5d6e6a04e53d07e6ed9ba7f5dadacadb5569aafb5d67a67531062a79d73ce2dd3ce3ecd91834edb995220e4ebbaacb538e2bfd9335cd6dac8b3b2bf42634584dc395ed934cb621bbdacc5c6e8828a175468b082f4a60244a5c9fb537fd6dbe1c3818da0ebc7fcc2deba1b188ac0af9756639cd1a79058c277af8c9f4e5db376f55d47c2c79377341f4fde9d3e7a7c2cea317bd71fb347af2f6edd755d3eaf123c7a6f325f742514e19f3d0f47f4e92e68e0e1903e536ebad1ac9ad4f683fb94a7b69ce63247f9f41c994f4769b6b9cc336b5f47028eb69f85017ec6f2b32ddf4d3617bd93deb27b0a69975dbb947287dc734eef99bdbd085f34b5ad01848c496cab32fe9b3d03a4f8459e9ec6993e5768ac8890316c96f5ead3afad1a81df6dcab47c91f209a2c76490df7736cfe889a1efe4ef3011f4d4dbb356a324bfcc0723c92ae8104b22773bcf880927d4bbe751d3fa9fdbdc6428c0a75b4e969befcd9b731b7f456fa49f0804f3120623f6a717a1df4fa3c3a73f1cf07323f2c28479b9e130ef74aaa96adc3094d4bd2e0f529512b9dbf979e3cd35abeaa0c50c66f86783ef4af8e95952eefc7d6245cda25b8d8fe9596652c35ce24bb3cdcd48bd266e3bfa238f0190a6dfd0d1acb7820d4a3fe1d00d4abecbf1d3862fdf3d2e3f9322a4f306273f29a5cea39f6628d01b9c7c0acfb5a68e6db639e8ef39e8b0066e73ce39bd4692fc8ca65879eab37ab55d11fa94fe5c6064673e92ca93ef1cf0ed3367b95ad527e510b2943562635b7227e95b55792fb5b4d62abb2b959b7c5e2c7df4dbd7e9135cbefdfa9db4ca8cc7e4afb3b12fe39c6649acff476bddcec79d1c3d82b030040449827e7822a5284b9766751228b7663f30efaddb9e7a86a96e9673751e199118268c8d8e5eefecc7089e627e7f60f4e8db769433aba4c53f603b85dcd6d9d01821e4ee2667e3fa0925f9207c9a736d44604e029e4e84b1a553ad849da7b31ac20d97d3aca5cb05b771e407dc8626f4ed26be78ebfd0f006fc614bda3557a27715c97528726f4fbd88108da20e105f9069a40dd72eded2b12aa069f8d76a9c567a3b7aefa7b36acbf67a36b9f2fc46a37cdc52da7264bee0d06ffea93c86b1eddf60f031118e6613042df3ae0ed069fcef4aa35048ebc07565f64f5288721de71d35c2b3f23269cf4edaa4b2172ed2dc7e6812ddae549ea77663e34767bc3872f520a29d177a7ef6c077c0d04ed1fca00df3cf6faeadd34c100d046578c8bdcbd2dff92b63c2417ae7c1b4d5182100864ed40aebd1d729d02bedddaef10600068828d67a3fd55b15a7d870088d3e5ef1090806fef721e014fa7b12db20b1d02be5968418b1c1d663bb8efe63e0cafab85d66e4c88f5cbabd64114ac5ffea8096718bb4c2693a9566cb3cbab76f97dcd8ad6de6bc2267cf9a89ac9afd5fa61e6e3374af9d2ce7cea15a52cde571eaf078fb9d56a76f4df77eb756a1d3eb55796c2f5c94cff8c7498f256ebecca5c7baa575a20e5a3e9df951610f1a6b71bd71cf57e9463b9666aed954dd884f3e9fae5113bfc88edf5eb31d86afdd65a7aadf5abb2f5f6a3b4cea143ec18aeb59ab0099ffcf2133627deded3c1b6939f4ed06d8751f9f29d0df8bad66ac2260cdfb5538345c412cb224b97f1feec64997f00f8f62ef5cf0730c23f7f5df7cfe3a79395c07247e8d45c4393941242092194b27b85355f3d9d257275b8e115cca0cc289d14bb6c9d544ecf7ce293186baa5aab5f174c01c7ce772a20e4f71dfeae3cb0d52648a9bc525eb64e896117c3268494425a297c1ae5004cdd07b64e1a81a3b516c93e19a35d72dfcdeac51bf1bd51bbb4681cde6eae0e4bffde663383f0a233a317be329fe817ebec42bf5ac431c7170dafcb73e26427f2d44d47e344e7a2c27bd00ab481cb12180814a463a7c7b332f3820a3c9de83828778fcbc7f8b850e1498f5e8187e355a51c397a9ccc19eebb91abf73d27a8d0428c31d2cee1babb1f0785aaf7b4ed6c66adfc895d1e11b274d5034262ac7a3739397f420f4c49966244bfdee57cf4fb8e78621190155c28f2f3d15f7cf21dc672f4dd4bc2d224c6296f448f36f8f8bedc883dc8c8efa837a1eab96eaf713c0605215faa563a9aeb0182e6e49cd46da473ce399d880c366fa3f46b03d29cf4e79816a439e9980f727c5fb718b6223cb0256b04e50efeb0749c0091689e6ec9d79233c889061f26016a960d4c6093b9611d2750ef9e951ecd49a7db099d4db36c2410a411491f129066bdd0ac194485155a706148b3e6092734579dfad44ed041467edfe9681ed9923a9a4567ed9f6164b5a9736e45e0cb04913b7fe9cda29475c3e594d0acf7966e58e689dcd92fc2a2b82b409771262fe328bf8d3be371f2f6be4f461eafe8535b273fe517a5c97826ca3c2d74af4b8c7743548ff2e72da8b6ce569fd90fe8322e331f312eb375288f49794d2d91ab9b7a1aa334f83a9a85725c2fd6fcafe61fe39ded72cabbd5a3fc3d9477e683aa39b5bdc7d3f370aa675cab0cf1d0b39457797b923f792e3ae34f9e3d3f8cda71fa985491fe18af325b37e4651ca5752ad4269b43a53a943f97d184a0b621aacf7ebd9f311aca7b226ac7c9dbe695733b5f6f7c759326a43d7ba675ed59765326cad5a357af980f7276c8035b15f5e3e4d98bba7c8c937043ae2ea43dc6bb7695c75addc6f85b5b6b4a663e2994e62fe3172583d250fe501a093b64146ab3cd45993d66d2b356e3237bcc8d794f474646eb509e794aeb50ae7298ed40798cf7449516a3d5f848f9c953db6b4ef5a69e98b5d3c3340e5cdb10d5c33641af2798d970df8d10a1e9d885987c4e3799e2c973660af327bf363e8ddd1f21a679dc3aebf3c8d0bf6c070cf3f65ed789c86b3352e38948ef8010eb2617623d5e79a553bfd6ad5fbb11b9a4a762542819999ed8d3325aa7d23a201f3d26a57523f8e828adebf968f2774df1fa080220224fbfd7bbe9d7e7b5312479698469cd3812a0da5272a435b3bdad8b9148841d8ff744ea4f8fda8b3b30667dc891a18f442eef40f0466a7ce65db4712372794767dcc619ba11c936211a665c890c4a8e380d0d0dcde5ef25a01bc1539ff1970159794fcfd0ccccccccccccccccccccccccacb6f71230b3e588035d06c8d3191a1a1a1a1a1a1a9a150d0d0d0d0d0d0dcd6a53b2d1b80c339b92f770e2cccccccccccccc0ccd16e986f97b0cfd618edfbe21f58dc4230210225f0ec37c97f96034851a264c98213cf5ce7c5c5b678566bc3321191e520b4a8d8f975fc58994876eb70091c54806ba23cf81fad487e963fffcfcfcd4fca01e9d6e2818815fb721f5e96624fedc6407a14c6f4b573ace579747861e3e1cd29d48f40e040f9f1093db8dc80bf342d93b6d9323605ef2f34704bed436ecefe57470831888b4afda3622d463fbd4ba6c3379673e4096c016ca5140541b1295c770a4a5f24bb31d4460989797d79cdc9b933c6a4e273f49e9971022d13b931b892f140295bfb740541b92233f2d2431c810068a30cc10021a4508d352b992232dd5a624c651a68d4874e9981e19fa1aebd1b1cd6becf683fbea5548e5319a0cf0a7c84910501212ccd042f2c2b4f20654a3a5da6850b91219941c71140a85ba4860981694e92a2d0f5da5299141078a1c18310333ae10824b0be54784b82001115ce0c3113360d152a9542a28727b4f47b5c97cc9edd073e4a181a6a524061a685a4a6450a15028140a8542c5a05028140a85f225375aa84d8908a4a0c2831337e0c10a865a319e72253228f980521524bcac208a2282d042b90caa4d49f624499200dd68a91c886ba93c09d0aaa57220db527992244b6c0bc9e9cbcfcfaa85a482f9f969a93cc912ae8524a6f1d352f9921b2dd5a604e53136dce04a920f55c4b0d26a8f59e5c6b13c50c9e2043760a20b1a5a0d8f0c91a48a244264018303a496a963600067c85fbec3d8080aa57fde0e9d6498c215348ea0c881cd92039b050a2911d00185110f07c7424174d3bd06acbcc3ffdccef8f3cc43f3606bb1da7b26cf341d4af97af78a642cb618fea5fdb7d6f8e49c2b9b559661ac66399e0ecc7c723c1dea60e0a6d7c6a9ddbbdd688e7a7d309a846ad4d87a220e6d1aed84c6a1bedaf2d4312b72918e86a6ad4b8e87e3bd2644ffde6af5deeb423357bbb2c4c653502c973699e16fc65553b9d54e3ea3258192657afa562c2f139af19ece2c4ac7a3fc5e7846832d952634e32ba7d1922cf1d66a03f2d6ccd623e250938cd6a3b9d3d6d31cd5d1e5ca63fccb7c4e3276a70414ae1a7694e33f2b57befc45fdb37225075ffdc6f070c60bcd38ccb87cf598fdb372850ad8dd6f9aba0efcdd7a34477b74a41c3a7671399ccc55a94c26198cf98d63bfd70c5e69af45f3315af7905aa98aadf6bed65af3bdd90f9a1ba70c8a26dfbd305e52eeadcbabf64222f8baae2b730c6b98c52e2dd8a7fa553737994c12c74c5ecee37dc51863184c9e798633b71ace827a124ba6c137dd3447df636cc2a60cdf7b618c2db610638c5736580631c7b21d98872f7e667843e1906fb21d96478dbf7e5138d3e0636cebd535fb51e32f66addb77c1eb82d062590a7ea3844dda7b1c25e9efbf2b51b6dc9b8ba1e9dda4bd3f653c6a643f6abcdd220a4b61198cbdbfaeeb9a99a961a100aa01c47b27994ff8743ad59bbcf9093b69355f183e9dbc9eb4ea399f72356113ae399f340c4bce19d75cde5cbb11e3c4e4879cbd66b702e58cce76e880b2744dd92dc5624cd884537e792a2695651bc658963d4bddcc94313e9d7c4e19b3f65e0c3b51a11876d94ae95cadea7bd4d297dfab5a0dbe97adf56535cbb61a1fb4bad5ea9cf6523537ad636beb755d5e1dd36a72862fc52eeb26b76eb193ad177694df3f2b4b867e352b8655cde42637994c97a517be7e69d8c596cad17724fcbc2ea7588d7dd55aec7a7739e64fabc9f0a55e73d1f7ecb3d65a8b59fb306ca3b6d2e92f525853436cf8e02545ee6c6034f3791f3521ecaf663ef0a3865dc99d0d5f3d1c77c237a349e8c6d6dd2cf4cedaf976aeae5c8a1e0e884d19ee8723f32e5e1e2011879a607ab5d68a495386596bed551dd3e09ffcd27cac631a8ff7b65a6bb52bcbd5f864cae2b418be6496021c5a7579eb698c8bbc80dcb5141b866856d7529a887a3f691ed8a2de3f506f276d0364c113408eba4983373c88c3d3a19ed26010e4a8c3a5ecab9cb3dfad87f0fea19d6891614dbd1079e0d00ba12aa894ccf784452b99aa1909000000e314000018100c8844229150302ad8c5e60314800d8fa6466e3c1809f32487611c641031c610420820004440606666661d002f70d35175da46bdef9979f19df598ee49717fc8ccb99653c21d6ea3a49d1b3625ad260de216826de05a689a234fd595d222ddac64f431620257f0996e917b5893dccf2c566add5bc1a78508e16621143ebbae873b95faeeb0d5f524e1379a2eb32d5de606acc180c970ddb54c9e9710fc1450729a58c766291499b09f7768f86e9bdf26bd19a2820932da469c454ae02312912093a4c892dd325f798442e149924ed9e1d519af51fc793f558fd9ae00a0f1121e41d54ad5ecb628ee247445c1aaf11be596e7f30cce2ae825cf6abddc3e497e0f3cd95f432274883046249beb25fc33dafe32d7e2efe2828e4c69b34aac50f67dac490f2ccbba4e3d37fc8e2d684a1320b6426bbf001b4330e489a64f2c1a765ae4f014eabe7e120af8b023eb92039d1b41a83aadd004cc50b8356857c7be30aa1baa935fa2b669dee5d40ad88612d19494532ebadde48d44190146da3f9a39470a0e8348b6da64e80487df69a5ec2db4618d94a743c6884cba9d22f5fa75b0d171347dc94a794f3c59008921df550e26da4a9cb2b57913bc82b406d6a619c3b72ad90d6c10f83da8f71b071d5495fbc4b92d18f66f38e430149efe42ae9aa9e00f1c29926c1e24283f8e912f26e35874a42c9ee51ac3014b43de9c362c7e8fb60951a8ecd92396ae49211bfbd3b3560a13dadad95d4889e1fff9cb2997f8038d48a9cf4a490a56865680d445063f160138de5dd75945e65735fecc171c3c79e99e400c0f0e5d68292546632629d946a849313549af6179ca2803eb79346fb95d8fd91db9bdf961d0347a79be20b26f5e2237eb7d2bf5790959fba890d2ebab10643cdea4bfbea3cc74657c93dec373515c0b1db8cf3d563d6e285b9d80772dc631bbb8158f49ee131ebaf6bb0eccc6ae63d8440fcfd1731a4c15f48f410183ca3f96c4af646d137deb4820b70b917d9fe779921aba25d5d20447dd1f1f19dc6c91ce3d9f56907eff3482d939ac82dd615b735732c7fb595f97a5e34f8f5a741c180e33eb59645f4ec31a77a2e23b60f14520c4de39c5dd1b66a054a52a4cc9ae3802bdc7382ab9d6a328fbe3bc74ee1e0bee2ac0bdce212c77de2575a7ad1ba44798416a63cad5ec5d68ac67f3cdd89d061de988b2fd51cffd6b4913888729578412584d0bad655bbda08cb6581618f92dcc426cabd88a0820f94f42ed7e41b9c93d39d7b353003cb343147d31a9109026d3f188a28533a5dbf385a46dcaf338e24d966fb662acf51f084b501f3ae7724b9105c3eaa6d395b43fc6e19e6b96aa9423d1a183c0e1818fea56fe85e9ce5f789084153d6992c679dfd442c13ad9ea593eb99fb7f86c9f1e31d26957ba44de628a45a31daf3a404f74fc2c6fa7d81e50f9201d851ccfb5e97555aeab9c9f26544e95070c41f32908a37dfbacec99156c0731acd9160906032fc60c2a91d1a7f043ffe92ea43c478b9849912b468abcd6f97abd60c9db48bf815ba66103c43dd815f266a1a223c05db74965b09bedfe3968473a94708b7ae4b00dfb038751808715b435f4e3ebf0730b1ad3f6c754e35a301ea92bd004f1b888318ff6340c38f02ea221e7cee4bf5a0cd690bf45c73d7d12030a18608fc4472ab31254ddf9123436e2cc84a4666837d3bce1f55c1a2c102b030b7e5190a738b3ee884d9d86429e7e71f93295784688983380054f370f2d0d39bff53d068324db7164244e71c0bc43b97fa4dd3c62d50f35ce1c71697822c88c87d848b90d39260b51b3a4e6f00fab1a9f461a731edffb46a8c2fb0ddb3a33dee45b25a63890e9a13939f6b70c8e88f49b1dbd020dbc852626861545e581ac02e4542356fdb51baac10473eca8f3459ada679fba0f653b9a86902149a03a063007650cfe54c5e0e2d4a9f2c5b6bb2a196bf96b294a8ee67dcccc50f7b9075fd1c6e3d39884183f1f08681c34ee19c13c6944c986775c4938692a2364f02025e74f8ef7fe82c839950a07445542711fdfc82d42a7aab84da5f8504f55c02b0cfc4bdc8937504b62857470678abe29a934bfbd0ea9867cadd021528502c2cb3cd8dc08552fef7d63997db0d2cbd5db30c888cc9c5bb74007ab5b4d3832d8f72a5b9426c643ecb3bd0fad0811e79bd051fb79f8fd81900c3adbcc5c6dfa796d9b892cc0f37f2d0d40422b1caff4119757f44fe7955b7a41e3eda6f6091ebe7af80945a7451c1bc15ea19b545f7950cd3eb86f1d6dc36d65f4c622332ddde7cb26b5fa3ea3968a78b46fae9bd2bea9bc7bf3ddf4039e5b3cf247bcf0bbf14d378fc6143df0403ed1a57ce34ff569c7dc3de12be4d0ac7b77f7523cd610d820c7b439f130494d91fc917105df1e255addc2777a56345733cc6d7126c3df9c30984e0f60270de71efeb2c99d2479c973f54d6502ffae556608d9807230e42c1a4bf33bb9c5644b5009fe50cc6e84191d54c04743a84790b9d215021d10d396d48d7a0d64a2ae76a3b61ef03ae51b9cc8e2ff40a02a6097ddd50a822a1461809af7c3c3ac550e1ef095ac784b8b9f19e21b4e77860c11e38a50cc1658eaa75066aee4abfd3ccd9031cbe827f90f4ce88501f50b20d907226aff7f14d41f8096d077d869c4b42c93f7e63d8c64ee9c558b2d551e3b21fe11ca0f0762629756116439ffa39880a640aaab06288b0c80428e2bdcc6546802e2e772531808c1d1f25d9c02cd17bfced01546223cf4bb093e90988c405e92f4c6efbecb84ebe2375ebe35e0bd2443d6d962ca7964bbb6954d9a6c67b442e4a32e82e745488068a615e6d462bd4713b720eee49608f4685ed992e1f17a136ae17e98dc7081501709cc79463a83f347a4cb4b548d03263d5044d3a3c3f0da12fc888aff168b69f5965af3764c07a0b1e096c441525639582bf88d22cd2d87f25dec9269fcb719328ea2884ac80c873aae3c8e3eeba6ea35834992bfa2a277ca933f57606fb36db7bdcfcbc4341e54609d785b22205916c9a649f82b85f2de4e34b412867226342fe8fb54b4cce8ce8edfd4af70a9ab0994f1a7e51522f3868326312839ac98437fad88e11525b97be6635dac31a3084c9c73c8dd25b149d59a7ba78f8ec05b6313948f42dfb0bbb09ba09a45447e86ff8c842252a52907a36d27151f1dbdce773b4392aa9c45ec9d94b431c89c98d200ed680d96915efa7daddd221c60d801f420b4c25ee4fc8e79753f3858826097436df308160b3f58ae8b89d2a2af396603227b5761c1ee1f7acb7e8e2335b738913f134bb3b19102d74bfb6dd2d164036459dac3f98b49ede60a59eb6aee753aecff3c6ed2e194b2431718b63074b072f3be777c6fa5d1482952f2674e8bb80e5540ce32fe570386fe6e9d2b4e838905179137d6fdfe8b77d21a625009725efcc5ba3af5e9c5476f17d79c89ad62f02471d0409f82c334f3453c63cdad6b3558fa542bc35fbc1e72b2c3ccc1124e93e69fa65bb78f7b18fc0e9bf3a56c69f15577f26c22ea1611114d3a9913123c0a112c6680b9192bef5c2d48d9a5de3aa98ccad05db127d5c4700bc1c644523b25554e28cede053066bfdfcf6c960206e25f580d91f96208ec2cbce484826a0c9fcfc772ad38f3038ccf4a08bd4b421d50264feb7ee291baa0d529abcb44202adf5c8b77cd43b0cc94200e92bf468ccf3ef4e5a23185a4dcb57520e6f9b8be5f1657476bba77fa16ad280278f70a629352a1e149843108d9be7b1a4b0eac0ec18dc798ac4baf656b9095d684d07b366e4cfa1f595fffd514cac8e65c6e7ea05e3b453292cb5b12e45ce5296742da0e05410c39e6851dbfb45c4771830517e2244b01f02614e6f6502742c66f9434de8d0348929085b4ad2d86184acddf23211c856634504072c4681b1a3b10224b7cfb23e332ade42f2d2449d084cb46675f4fce503a7f998e5db10a647fd9767224258021a56246dfcfd8448981924c1323518034746ade6122121ab4ffc83d5b42af955d0041bd4c5912448db02686c6ac4e87b8c59d78c15f562d486612d71e25df0c98383eb8d0a3c91a53f5a5569dd61e1672bc66150708f7c1d9aa69d626e2fa006d67ac5cfa07c4ce11880af0683d399d41c5fcb9d3f89ad04894573e5cb637cd2fe118eb522e67c47e26755ff3c6e463e75df6f02a0ec4738a54d5ac692cab51f0bf3f221fb10c5163176b24e725dfa3d1b7186ea5248d4a53525faa394cddc250ee4ece36a14b7e9e481c951a8e72d77a0063e256716e8bf608b951280a120fe2ff782dbeda9a29245242ff09635e686d6afa64d2cbb2ce12cc41b0954b001db316bf958d6ef95a5c0aaeae298121a07314b75ae927e74fdba8c9882191d5c2219d7641b379744c81993b338e6464995112982e104198df894962ca4b44e4d860c8206554a8521d3ece6f7d0e95a88504a406a97cb8568b142e970ba370035397ac7bff4b7ac555fb74d91eeea0b491e0dab7ef03d2c6b8e46bf03192d97869285b17f27740779af875f3a191dfb03deae811e8b3aee745c1f2e76f9a0e0a83f654d6f0197b88b849132d4576c5caf1276bffa814961e5c5c164420b5073b1529b72c218a2945c6f4977a6daec24fbaf29aba33fd5427a2262b6ad1f8da6105b9234901e2e61861cc2dd33234fffc1cdbb700a32d72d23755acb33e0355c580c9d54df5496287ae5ea6da71b8148fb982f62b57b3e94118cefb9d9dd08cafa70160ebbf64687c688815a11311f696a311e2f8c43b6d4484f51d1b47fcac4e895bb64ef18afcf640949b6755f8b3a0c6feb10ef2d9d50d7ac83a74fab7b5c260007067e78d627abc2327bffbb79e6b6ac8cf6ee2265a3cc53d1c2009556bb69bb439aefda96b3c119678cc8f975467762ad4a05b169a7ab8417d7e05ff28ca04b6e56fba6c8bf8f05272bdd8653903793c3535796436904e515bcc9b2ce14887f8d595adb8145cee75519068b226cfc2b6c8b87a41c182461db679b7140234eac033b966e8d7854e6ef98fc3f9cdeb5c1f48de357987bd7445938724bba54cdee9c88d81a6af723411d47c6ff24b50107b623d6b17acc9d32b25bad1e4994eed2554858d8aca5cf4d67a535372159d584d9ecc4db9f672f48b0a6cd204046d3f479837390cb58c906db84b28a2a0f72bd59143138232b8668c2160ad90b88c429958acd0435193033a4ace2b00a6c9db32c4be7108fa5ca8cf5b6887cb977cf0a0e068f2a41705bacd41d52bd7e4fd47d2780ee6da9e537ecfa2a0bbba1c8bd09bc3294a15f6339407fd91fcb0e68b3a724ddea06ca60c5b0093dc50b55eb4c5a490549317ca5284f61cd93a741958ab9c51a1ca0e671d1f598c3e2a1b094148bbf6a9826f70c95c5881f668de8f76bba199030bb0b57a14e21ed20c0e64ef7b9fdf737f600ed51d11d658d529221db7e8c3e24a14a42292f7c42c57bd9f1e119e11182fd0470ad04b8abb779837faffe19355117a29f91903dd1121653d7790a3602e78ea396a60046d61979216fabe6d1be7d98772ad7c910b603632b9b9136a02eeea49874b754c7710fd41ded4da5a366df200b3caceddad940ac00343aed539db7244403b46424c9eaeace0ae279bc279a76ad10a926621d47844289c4241e0d242c8d2dbd5be4784567e846611c0f40f07dacb88d0559f6d034a89fa8870f252495ad0cb8bbfded7dd6a7beebe08b57b85b38a06b214fb5057599a95f10deee685bfbadb88b86b187b4375772c9bbea16e1d59e8c637426361599d6e333f3d1a6ef8d8e5644860b82006c5d5b6be397c7123a7ea887036f84eb3162129b72cb22e67748ebf7b4698602953d8d8035da4d0a56222bc46c2b1a520fe2eb4006c37400207805ff5cb0f57b8dedfb22341386fc92874f3253abbb796f5a57b9a8c08c836b2dc79038bd417417381ebb94827473845afcfc1ead0808682a4db0ab894d838e87df84ad9b686fe78d433ee44e8ccb72e1b4a962bdfe4eef22907dfb3fa8668e0c0b9fa6d5f345eb24715bafc9b34eda67da8d4d0f34658385e93e078a999738f0c4027c4163b95d942a3625745ce95b837ccc86840756f8dec75043fdae19ab210d02217d4a97a55422a15a46ca6617dc795d71fac371969505b12d5d8ab3b294aea82bc50a63146548efdd6ec3b5e490f5f8f25ee39fea29132b8017b29d4397041305a789fe393ab610871c0bc0004def9cf22c04aaeefca079019855b8e96e702c8934bb0419d49ec9502e57342289799581729ad70b4557010ec0dd936da090616ba71cf2a88a25be5e5358d7cf5cdc2976ebe7bbc9d8f15409375d8c721c2cf664d4ab2c33d7573b26048ced73a721b8ec5377d5caf2be3cc9a6e87362efb375cf570e704c87a84baefd17d1a2bb9bb142e2b4b611b73639cf1be3b4f737b3774f5819633284b659bee072d73c87346b50b7fe532fd0691dc051f8b53dd196de6aee71fab3441158b2a169c41df3e83c60ef0d82919697513a734359c295bba2528459af43a6802b898d02f2782755c0adcae3d6a412ba0096442d33572da1624661cc60018b5021a73e7940ca6aa7a070636ee1a4c259edffe73007c9d891ee60cdaeadeae15d2b80ade36db86a10a967e274976505554c8659700ccdedc92bdcc8c63b6ddd5370d405597d49acb4447ce1c2ebb5fed07c987fa6b982ced9c71a5ad16360dc30ddb891700dc7e0656a34f2e4a105fb6dc7530cf8e07a51af55d1e4a69e1dd81f481eaae9b111b19ba3acdda28702ec0f694e386d637d547612bd277cdce56f4bb434b9d43192f524b0e1ff17e631ec334e467ad86c61e08898093e841285fd2828547e539ed73df41f922791427b962d405c05f3376b875575c75884cfa74adbae758c1ccfecb0810fc648cb7c64e33a4bb6b6c50d7bc3ca2fee051567ba42319a39e57bfee16369147ee3b86789012297dad7cdc3a05f23c26eb4b877738b5221b8557bbafa0813d7264602ef3227fb303ddcabca8d7e9b77084c6640f2d72ee41553132f429c5c92520506eba876c9b7cee53d9385b7c7e6b4865e00e8baa676e443a491dcee64cda3a90890194a9d5c0d4cf90b694461a5c829fb438f3427e562a6c6b5f5c12424f62409be2867b449afe3f48d60b352fe552b3bfc5dfadfff0930eb81390df2f94e31d509cb9d1a142edd39cf21faedfd69c2b3d086e1f8d0fa6741b61697ad8489992335c36d2e0230b7a4626998cd5697db8b8235c6397222dcd3ea6db3ae02828036b9ab56bcf4afba4d99f8b04a1b3a401d5f1a64a8de8ea71bf521d0e65011e469b6e02076c13d19b26b121a78f02bf63c7cebf41890c875be8670ff01be305a90588bfa650d95e34bfa134c1d866e8b4d94797aabccf6afb331540e9b3063063e02425dcbcc563fc53ce19023ca16996543d880540f3b69c964900fb6172d8080e01bac649ed22841779ba70dd1e7a5fecdd66abdcd212a1ad372c6bd3c0570098b993181a96eccb2fd77f63f0a07eb7c5b754beaad73811869eb144375f12b1d3445bb25a564bb1afeb446ed447963f9b131eb0dd11a65b5e2865e8c5d0e64ee9cbccba60bfbf62e34d5edb05b40fdf4ba9f619adb7bcd59692857c92848fd0cb1ca2e784bae08b1b1df3b20a587655286a721a0661fa306f142a2c2ba57f76a19c0752a3716f4c3fc8c1d30468eefb678702008cd33f31d30166393ebf66075818a31787e914d75fe6dd5bdcc1888e221b8f4088d08b0658119c8d6c47783adc982f3b880da40c5729224dab0573e330ac1472fd35651307c35f13bc1780ad892770916135d18d5ba36e0edf416d7afd88514c24fb8cac5bdd09aa8ec347804e0e96364bd04d040bc4a4c702f01c65ef9d5ff7e76dd60d927a753ae261e5e1286f1d60608b89738f3656e2a0f32d005bacbe39690e386ee55a47f7b88848bd24331deecf11cc925c14d213acad469a6d07435bd39037f07e1cf709d8a26172a72c0ff104efe1186d0f3e28c62d94ed711f773dd146fdb1e1ca5f7cdcdde355b056eced71ca6676f3ef2649255f49c41c2a30a365aa15ef3f85824bdfc6f76594f1a76c896bd6da7d65411c5d6072fae36dfbe9b29013603b285c7b97670c4d4d8f0f75d44a629d09c50b852bc06a04815f52ced60264ee9834c94a4ac97673bbdff96858f5e79c4a276268659ddc387c7e1db1ed5cbd64f04b5a257467c2c1ac58797941cfbf32df6843c3e7fe5f3b0292140401af9594149e7ba52f15c54dc16fb346f4262ee8361464a170a30b139c3c6180490259b7cd66a31a13a1b36ca9dc397afa6738b807b82e4008fcf7a03a1adb6ac136b91f7bd0a5d2238c529fe5b4da1d521dd02daf6e0d94b968c865c57a982a56c4bad75a1c6e71ea205424f6e7a5499b51e038c0c101ddd48d084f58a85fccbde278a3c010ff742fb97d7be8e0120116a4f81efc6d542ab7a3bdff9afb0aec8d96ec482e5fa5b33d3c8e7f8ce66eb50bf3037dd974bb003903c747b8772f4a38de8cdf6417db5e9ac985e3570ff07bc150ef6db755e99fef33f4fa3a65726ff3ad86e4fbe043e24c6894d482c43ed8f25aa19a4f2c52612134fbada5ac33e386f8a401dfe4c9eb06a7a53c57abae763077a3935a3dfbb73d067eec5ed1579c4c519299509f503a098dc3adbc148b73874f9ef89dc11a0e08cf2f44ee5813029fdeb18c72b2033d9e0576f70cb76a9a934a1e46c6146cca2eb4d75a5bd1ba5f056e75d2363a6abfcdca2324e135f8a9fd676532a75c8696897c16e512124c21bdb1f6a545e1272a458adf2317ea784dcee45c85dcd67d71d9b31181f3d3cebfaf810e636b0ea947f5b7b82c6ffa41aa3f15e3680eab8a68020d3b96f1aa92ee18fde66218292ddd700a6099fe743661c218e9347bc434269d3cf36695d17eef5167cb0a5c34df6739cd90ba150056327e64e3998531da44ec079f263b816d6e46b5f0f6067a3452944762c2c0a46ac04bcdf55357abafb18bbe61876f25fd91afb26cba7ced00f42dd44b8c9ec2ecdcb30777f99383c3e247fc9c695a421dd2199b1132de527cd0e40e1a46c82c5a3055a441e7da03622a282da80a01b225fd5ecab35acee62b8eba4f4686af8240313a7fc20c7788b6e9d9f45fbf500e900373e6fbc6611b0eb34071dfa2ec18323cf991715eb78ae4e870ff449166b7a52a5af0e19eeff0fb92349a82083e8e5ee271258f3e280c2c5a963a383a23486de99a577e68418e1a4c838153686eca7ec1342d8caaa094f79bdd97dc1846b55bd13928691cdea8a4b58ddaadefb5252f45bfad5798d89dc9cf2137ae7cc3ce35e2443f62b86e15ce00de19ba9af2f00745f68d9e18774f5ca8f1795cece6b986270e3b7992fc089e6ab55f22f076aade115df21269a925d79560107a3687de8bd86e0a5ea4cbe8767de716f4367dda9da765a4e65e313ac44fbcc939232ca4c063c68e0c7f95b84c8a0d2bf9981c1602a9b8c1c5f0ac51b1f6f1dd9fdc2020031e45c5ba6a4d35fde20a96d049595ccac0099a13fc62200be84646dc5d645052dcf9a6916dc97a94996ef548696c02fd3b5783d5a673118c56c9285fe9cce98a3773f9c02cebf3552a421a0f21ec51920d66b972377923114221ff87b8d95f8dcfbcd8923017a1ce655614909aba3793e273a4db00b02ee64c8c5f69f965a3c4205b5338c69f2580444f3c58f837ae28acd126c97ece98af6218dfcce74cc00d1028979c82e83277d73bd44c24525341f843e676a1fd898c2f26aea61e6bfc3457197255108b4e836c80a940b0ae1f823f5b2d3fadf0977c3465b2a0ef1c9e99cbdbed4e6395c9ca735ebafc5544958a0c5e8f49f5c91520329214ec872c87282e1f5eadeb947ac60c793c87986575b17e3704edc9bdf00fa9bb013093bca6ec38d05120060d49b11a63675e5d04e1649932de84b9017efffca2797e242bf0b3d26a419354d1cc4e1b6112b22c462e792210e5901df5280132a3d44359a7a84d00a6d4e24e5421cf89e05f306457e99afa12eea94a6c4fb252c09339199239279ae88ec71e3976d6a73530c1ee807210a39c5e0f59d576b559cc9ad89a456823caf6d31e41ff61f96f8bf3eb31f44816495d960ab790ff1e55ff46a4e58685926850bc6d6bb75cc66d6c2668efcb8f8ea317efe91daac587d6c4b82f091478b8b73ecca00d5151a23fcbe12cc56d8206e6ee73c45573a48ba6641e22751e55b3591281aeb9de4ba253cd52eeae09d6b453d631682c2e55676b85f23582775af54badd31d9065aabbe7ad21328bde7a967d92b7d51fb326c8a5f074827bc0d7f5782c456c08ddf5786898fbf2cf497f798f123c76d2f3821432f1dd0d515769f0c256114ec019699939402296f65232954a20122055d20dd76ed1774e0356ad28ace0059d2bfe755443a81ff8446394dc90654e8633ed122909cfccf69bf88df64bfbb8237e278974e68e3073853b454739b07411cd57d6fe68d917b6956aa57e33910bb74e08ee0965a18880603409048c94a02a1aa2aafdd41b7c69934479311a369144bd8ca538bd6e63dccabb686a86697306de7848cf9a9356d0693f5ed73a5d47fbf2fa76ca20beb2506ae6a7abeb3d930f6a95ac3cb57721f1af8a2b81dc8b88f7721abf5df741ca0e64b2f3e743a246460ab7dd096194f3bcba089558a24704c3f491cb9d7616b2dd261db8c4a3193f0a0ae97806c51de42c4c70cab82be2b4ce12065a6fa8edd4aec11e4f0e26a85984b051d68d215153ee7336cf9c21e712b9ae362d978a69841115ae3cefac2c35767d7bc3c6ba19827f88c5c273649fd2c14f7e9b76304ee526d7af8d4901d48029e71be6fe2f622d7c43eca2fa943797e70f7478216ca58623b17a4ffc57c00aaabea44c8cb6998fcc3fad06d8b3b910410f12cdbe62160e3c282ff51e1d064ba118a39101b021547ec9952d67a6ad0d60165f13730d39e77cd22f5c30f9e654725f6aebe945f6a300c84f8cc957be5cc3deb49e22499a746e57c270f5a1b64d751b6dc49ac8e38cc6ecda80f4dcd24863323987dbf9723a179b6e1104efeb13ac37cd996df00c6e768a0a5f8bd5602c2cf1d0248278404488b86443365936034c9155fa99feae3aa825f2f120e36283666a833031e4ec5833693961005a195f9db933d5b3eaecedbb8b95643cf75d1ce583a1635e4504c708df5f6951d9bdf14ccba4a1ae64618751170fe9d3b6df1ad0042c7dba04ca5d06b1b67c41cd4ee6c64e61f4807dd69c888668d0d8626dbcec4a1e4ee7a8d384ba0b259d8a92bafee9d007d922af604a828121f37f18247b73a8e4876dbda83c46625f26b66ddd98c04fda34fedd9f763465fd0e7ca074ba32dd19d0ce8fdeedbd0a2d5b238bd4b5704f460987972641eabdf94e337dc8112d812cb24aa3615ebaa9fa029bd2ca2552a3a814dd3ce2d00799c3eed1e2a6573bc59356f1642e35ff9a148de62c5d758a2db335a84f48b0f70dea04ba8c1b757b600dee91beb3f85e3126c1a82dda12935d77ea26e64faa8557201450c85d7e40e627a20a0082b0f59def64123ccc253e45e559d8b20775cd77adb57481dd88bc17d6281346f72c3b894ea427639ad420bf376750de2639b19880dab2394715067484841f04425d45b89747d22417446aa1f127d752749772bd72512d871da04ebcdd6974d3c15d8518c9d8999690b7c566d9b3b819e6cc2d0aea9ff276ef46e35e002098e504795283a540070294c770d68b465a1d7331d82742debff8ac345deac800406eb78d43d04b595bfb5ef15444d4280112bbc58192b41f700aa8a7d5151454f054528affe675a3d65e5aa5195964ae68456eb1475db22c191d729840817953d5485350adfce4507c19a2edea201b12144aff49b7ea4b6e558dac31b094302af87037c55f063f00a93f45872f5116ad00fdb4bc43399b485505aff420cc5750d77e19396b42c41e49aa06bf91295fd5d7b7d8bc4a3e50c975db07de63beef593be38b24e532e1f7aaca306a415a39ae290540bde6a2276b70f0a1e6ddeac65f86048a4dc31a6b441e4b270d9c31fb6564f0f6204590f3d44aedefd35d3f5e12661949471779de67a88d9b445a5a48936920851b1be0fd26fba7bcc1c7c1f8a118628441105fe88f5a07f79db49c30603a7f7c38ae70d4d8fa0be69d438e64e945fa0f26197b9fea5c7606363930f7fed28df66958e4357387cbb892c72e3496e6f18af01abee52da3f28a366278c4620adb510e9ccda1d8f35b8657d1e28ae3c69a41482daf2abc5cfe978bca0fa8f9963103abc7f7f197d764fd5878214e9ebef8ccacf8bbde10f5a006bbcc7be44b026a1be95365192ad09fa42cc8c17e2a34bb768f2940e5cb90cab7b2a42bf93b90cf2ba700558c709afea59b93adfe78fdd9ce7fa95fe6589b340339d396d3fa3ee240f6048b726aa96ac960af6420073ca360a551105ca9bf12689fedfd7fc9bb0fc0204629faf6ac8be47037ebe0d7b964bd666f22ed8f88fa5ab7fd9d162831de56325f79d235049b4251e285b121c2d9ea0078a22ddcf14e20dee5e416a12c443a50181b30732d8c5c00f6c46300bbfa507ceb473f7b6360f7be212fc11f68cd045a03a41e74426c8237a7bf5a1fe653ee2e9d9cadb3574248fda8ce079545f214cea62f2dd7f445efd4420e3f42b4385efe37aec323171fcfd33076586ff17103f243ae485d71ae1a894ac1cb91b47c6d6678347cf635ee515c74aed8164a0821645a32d34f1efcb3e9441d2e5d8b6d06dad052d3ed164189b8fb554956f91a8c1b742920435dfd1b8ca6b4c84ccfc8898cf84172d47f55ae0fa08d092b839f3c2cc29416914fdc41be2a1cf8c6e60dc2afb219b2b4bb1bd7fa7abe8beeed9cc2fb6e59332a041684b75069db3628845178e84090276c636008ed148ecab0b323bf3dcb40ed30803c71d1655fb07ea982509c6dcb0f060f4f99a5d5e0c166e85e189c32518f9c4684edae6392ed47d0d1c764f8410b30453e5624470b1d5d89e3005adea2c668f958897bc18839941889b7eaccbb1d8960dd8523c1d3fe33510e92f977131a33b5a8a00848f52399f824610f6b00f5d65f9a6c40554ad6743a3cc34d5849561169974ccf6b7506c655fd4d28a8fda711e775d90281d1e1f187562fe11783e681ca31620b2fa7f449cccac54047f7a0ef45e014ab7a928274180d64fcf672edcd263224c70dc5e9f0566acf9eff8b782ce55a38cb765a49834b003ef04943ef472cb51dc96422243b60d2c6ca4051d260416055113a53b3206eee76c991a9c3618c81e1807c85a572ee38804ae0bf023c6589e6d82e4153dedf0310b499bd31cf3f6f7c1dc1e17624f203b25ffa2580c85582880e34b5072fa000985e5dae39ed2e01587e8df5d809b60bf61015e2729947077de1046a90733933c872b4b8ac3d0493ea31633290a0f4728f50714fbbb08b8f80d11c63a8eab159067cbaa8419fd43122d11cfe4dab2feee8f3900200de03a8de09c16069d0d74bcc5a94b4f17709a98f9bb6f1782251023a0915b983223ac11e605d6cc5f39b8fcbfb4b19a171979f941c9d84c05ad5fc213efa149df08a83f3bf90836bc0c5c89eb95a09110d4a99cc222cde3b483823bc09f8e82d5d309bb89040168bd995ecbc76356832c1a80f5f65c0e05f4670fe2772f287447329a27a067ca21154f63d43a0345985f0a76cb720a74700848e79556f4e4a0bc812366667957c2418c64175176e64586dab5c76dc791ae922014bf53b59d37173a84850e617f4ca952a57d574347657d89cb547059134316268ae90e1fc843c30443f01807699411ddf15be217822d34ebf2078efe68c00e70878e7e362105ed81e21cb44ebeed3231cdac0a73677e0438092d047d24841a7b204ac7761ea9c31f070d797899d40351b896a8d9d11f784af20d0450c3a51ddba7ab7b05fb2d505ec67eb56c8dcbb2741cf8a1741e1b7f1eea96ba2bf6ecd3a25abd58e56f4d3b49a0b175c04522aede79c30bb782a3b2829112ca000456010b6acb187eaa6832cc68dcab42d23887f07e6574119bd9c71c8085288e940f21b0904a8ade05e0ae879901ab7dc8b658488c7e45da2c7b21929c574d4d8000a813c8a9ef1d7e08dc2a58643a46ea02cafe9ae2b1ef726bafa9dceefaffb46fc1a936dc4b4d5bca9e538bf172771c980894fed7611e82ec79f6540f00fdef8428ff2e53aebec6331365ce9f32228528f59a7a8bc7b1b1a03857a1ba776666ae26a93b8caedfc49eb04c59cf54b6a951c7ac3403002d90c01141376e8cc6fcf485383a2bb6d9781de641c15522d7dca77a90211920514f4e59311ab63c9ce74d0c45de8b7736f77ceb454ac086f82dc63380585c1198bf0cf6e86cc4d43b3bb448bb13e5821d88871f73ea7a87de40d95bcc7dab35e00bf32ef8285cf2eca2856da5965b27486d51322a87d608422b1f41f33c9ac1c494a9413c6f234e099b298d12212e14e8e15d96e14ac645ae808a39eae4399ce8ceca8297c5e69a058fdee02d821f1f366703c122df8f4f4280661ca504580458a90674d30a88aff53e39367ee8d9b02a197739b0cbb29acb13d86ffe604f5b5af2e20a83dd71da5e0f92372db652a8271eb660881d3790b30edc9c00531d8586e3fe96353014f437aa14d03abcd501fc0a7d1a0c9a3cd061739b56ffa49d3ab5b7c95c196d23cb3dbd366a27c9a12f2170ffa47e8079f0ad4018f35bd3787bb8a24738fc04a17d915d797b5b1d1468d33151abbb7c7abc917f37bae5280a8928bf77fe433abf10c27876f7191019ad7693036e51a2cdc6bb1f583339779610d9296c4498c1e66c34d66b82af1ba275fa23c9b90bd8964c74158bfc53746f94ac2a5f95d4eafdfb640d50b2802d5c3c66bb84e297bf53f284caaf8615df3f9cff934db6c89f73245bccedb2274f71e136f2bf5ec0cff238513df545ab7d57d657585142fa606c3ec54a310cfd8afcc0a52dc4c80d197837197081d30c9d72b4313e529134ba8d962e2fa62af92d2041d710fe70c92c21a3ca76f0360d8210517fd01512dd63b8148faf8414de01c1f2cf2135c4dd09339a1c38f3c2b13bdacabe1b773d332b5cdbc6293d64ee34f1c2eb7680749bee7297b4c8a781eb0560fc9cf86ca430a2c9c18fcf631658438ba308e8a7e609f561d0d6394ab33d885c46f0c234e25a7851f4b1b5a9ef259c47196e0c710981d34fed13d6e37d4a50a158f65fd217cf9e59acbc0d1a68b49e31b1d5beffe502bbd036e0de662f21b58ab06047f314e5603ca6c62650803a30ca02a939a053fc54a589fb6fb756ed6e58721a9f2228b384229d8242c6c6eb2830f9ff07e83720b7b2bdcf7349209ebc0a0a26829e725c11fc5ed0edf0bd373384e266aa904838e2a0c70de32d78d30953a8403a6c258953345649298bfdf4f36fb7616b7539f88906e4ced5802d8f8017bfb0427dadcf95a162e516dd78fb53cc40f9342b8e03de1634b062964f685e3e7146d90704132ce9f103f2d19da32525d6412b84283b55829140a0b7a1bb81f578f0057dcb14e44a2efd89ff2ac1c9057954915e3b367d923a91cc3efd18fdce61019253ae46641d0ba28065009ddd500c14dbd45f6e430e8fa7acf72cabd56898744f1c4fd40469249226dc25b946024f6e07d59ddd9429e3d38d46312232b917b9ce7e19ac613a4dede9c9045670ab87af8e538d03162600e4f55ede1dcd3c7d6628f72434110fbc8a6ca38df1f6bbef228aa7b64143f724008fe0161d1f71c909f1617981f0df1bbe65b245887fefe0ccd4644f0d26a0cb54b8c6367e25369d96a85945379890d24f52f8a580622858a66c4014a30182a0998f1b0ff801ced4be83a2cd8f2618d6e22b2319b9afa9aaa1d5a111ba34870ac275286b4079958295630620c2d89e02ce5e214dd35524e32912e848054536d1ed2288af8d35d93266705726790f193a245ef2c0a986070a620e1667853418db68515014ff5da6208e0a2bbfeb77bbf03c7049986bd3db12295d5940f5c406f14eab88fd4688df8bf5240bd15cd7df3bee1efb90e5d3243df6865785468b120a43daf7f70e5b437dbe5b3f7090c958ef0ae1166f0b83aa954ad0663eef6b3c3bd51088b48a60710be15a138b1f25d7a193325c9b070767f1315d81c037f417b0854ab1f928808fd2031e4e4b7d87dd5fad3fc60290108fe4011f67bb10674df8dd481aa05f695e6f0379f6d01acb1f83c93d9a967f817ca2901e4366f42f16189d8ee5eff05718ac1eacd7c728571a887036f2ae3c370341418b494d4d19c70a7c0e05b37ca234332b1d0181178a50667b934afbe38a2f509007112523848960683ea1b24a1e46d54176b15ce29417a1d3adb8eeba514ccdd6f9f1698843d45dc6518c71abe938011dd6194123e1a445c0da8636b3a85f39f848d190e3b715abe851cecf221a54f8efb10cc40f65f3e1141ed5d31f104067d641f687056579e11d3ce25bcb2b6a5b7d399c94a3b5a4e7eb5e7dac17bd03b157123d5b00f045af4ccb1297e69a243b0983ffd56d0ce8ea733131ab46441160f04f21ecccfcacaa7ce88fe6a95005875a29336611acc92efb7e921289c171986298bc6e047f145ac541f5c2c5b1a74825189830505052b12777f7c2b186dd96006747b1f7a43e0fba875bddce4460ccd788830dbc6181f205cb243aa639ad500ebc686f768030be14d27a99cbb8768c8cfd96f28c0c4b6612380ac44ea7134081926e971079836d918bf6fc784bfc851855e9dbce4fa251c03ecc7819312d6fe7a172523b13638298ec01da41aa717bf3832280d247a6414f03d77c83e9761b3106eddfd690025dd9a3e4acc830843d4c910ccbfaea62ff0b0fa0ee2b320b16505d6796af43eee4f203fc3e2333bd4d2b4a44d5f8bc702b58a6223cec54e2c241b5f5d5904c1a66ae489384b3d74f613579e463faab43e6e030fa4686175ac2eee068fecb8fbb172ac17548b1a565d14c462e2d893a34d84d6385f0cb3a4a6d67063f7a3325ac955288681c718e823eb3d13ebf902aecbd4dfea5d16d40e74afa3fc3840e2029c1d3d437b0f0405737c6ed3c307f36ea61efd8dfc25c186fa7320ab0000f53983dbdf67eeb2b6200038b26ea404c4ffd5bda933d870687e35349906fab7d8ea1b3b49aa8ddf8fe6793f78c1d4bfe2c8f5b9d4dc93ae6d4a40ca0a65bcc81a6116b51ab3e26bb6377dd535d340af5b2d8a1c2172e1a8f98c3c7abc6bf97fcacce20fba731f7e7e9d2cea809f84573ab67fcd24d10a35d54e7f11f0e5ce0f740a3a2a157e226f654ebe5b900ce83ab1266aaed173259403bd6823938521917af8efa6b00c81d5e51296d1702300dad2138dc4603d545ff666209961a1cc8c784be229a26ff38450a76877f717da47369c8748c08c47ad636b22443efd00b43405b2d9f5213e6818ba67460ab38446912ba66fe5912aa228891d6756c16b1b34920749b7d9118c1f836de6fcbd36803bb619898146eb4920d0e2a21ac4290e717b6857ecc58479fbd8c0e6aaf984f40f22c3e596d123ab2c040652c2cdac1ccf5b73f26f8603fc1b4a4cbc97059372e065255a72758f99656b69e7257def75d850ef48fe64fd39505cc6b84c193ef185b7f5e539c5b36130b8b4d28a0f9612e75d8d1aefd4b387423c766c021259a46300a2960378d59d1ba251545341bee48e9adb99bb305d110e464534e5b589143be46195b3024e75747469f286e877d20c5c7a83ba45ce37ad03ce98f2cc4a5e7829739a4088d42c55fbcc6b5f5264bd0b75ed739de7f3157c1300da1e0370df24446366283049982ef116ddd3fdacba6b4ebd006ddcc39820200a8d1cc4308ad6837eeec4c9735bb90fea28bc32c49600d83ece6ee3a4b4640d44e0f8c4405521451c617acae365b1fe6270ce77bc9d410fca48c2843851b3af229ed9bb82e47596d45ccb9569bed0635d25eaf3d0280d077dc612e009979b62d98025406023de262e15b38716133c9d93794555c76ec87b198d3bd5efed6becde141c7d46f7d97a46e117a8b013631c080bbaacb1e7104ae501609c9ec2a724b93efaf9073aaad3192bc909f5a0b89b7dfcae80a4d66f76cff4b929aed5ed0e6162f742e2b049728ac9e0e88ce00f27a200ed2302e67b0dbfd141af01f1765639fa0a041788d4fa07c2c68440dc7803450908b2b9466a69c327ff7fa91a5edb0df195e818093d0043af4dd1b2dbf1133241561b75c5a0ae6a1cbe2715555569aaeead988a07132e629de3ebb25ad8275c1be25096bbfb9cbcf60b88340a099a4022110ff011e35a3e9771b8bacae65d6c13bd0a2b1510aee217f7e5c3a9fb871174cc6041f90be9626f295f47fd0347dc9fc0d3d72053d2161493dd938491e7229caffa12a8ca5522018f7304a13119eeee115ddba1230802a92e8a1d2d8242760b7b7821d26c5afef2385060c3b5102afcb9e71a57a30559cac6e34d1ae5c702754cc952d7f8d117aab3c17967af5c643ea3fd5f5aebdec8eebdc4eed43f3237c0d34368827257d0970b4e3c45674902a6076a030d483cc328e98cdcde411f566215a32b7fb7f4fdfe491dd6f668281e3e1e51b314ac459e8e34e5d583b1e2f077963b3c4a821bf511057d87874008e7dafd488f806beca4667bdb53a1247a685300c36bbd77ac9cae28f0a4d4f957a562af5fa44fa6709c7be8e62a6f072983331e7240a1cdf4be855d2279b46d5ad0ce03721537dd2783671324daac0c0c3c63ea64dc336ee48c33641188c4cc8a16629998ae3e298f2732ebfa0f4354278480e2029552ea5e6aac7283a59ed16d0ef524423f7b59da7161e39d315869143dd9c30ebdff0ba458f067bdee76251b72a490c72dea26ab3107c714b21635943ce51deb01b8718ee23e43d3dcf0f884ab8ca23a985a51cee920b89667a083d0b368b54a5a6f4dd769c1d4b59dbc4057d4737c64a32bb4ec0448fb1bd074c6971848853971bed98018c159c20dd133dd6c2ccf19a99b0bc52d2db088c5a25fedd7eec14444944f091d5252a9d0e09fe19e744593c7f718a04c60be114287c0c6b9835c51be870310eaaf69449381047ac664265d625040137243a33d1e016d3413b34682c41605cb75a66707509ecb6732c06e75e0104fe6871e9e0d319e788cb896873ba4f4deb37ed030cda661824cceef4813919eb4515e115557d54ce2fabb2b6a2cdaa3dc11d389abfe278c92f4a64763f907bdec1476045108c865d62ad6bf761541a771323cf2d6cc49191025a4725bc5e1c21d80fa556db7047ca461f2716c4833bd1c52a5d761490dd74b8dc60ed1e65851256805a20f930e309174266b35572abf74437aa408edcc5d41e2724efcae6c3344ea65279717eb844706dce60c430579ab0fabd80c08dd0c3d893eae2ec71ac43ea777da7403f97d8e48b2d6f6e457566048e98c1d1d3a3a884853cf1b126c883048d90072959560ccbaace0ec1e59313c090fdb23f00c82de41e2b0b025823e1d6fcef0f5047c014045bb317e99dcb002d549c9a2ccb04da838c9e591acc5f5e4a4f4c993b05fa0608113f02263bcc1b107ba447520b8f73ba74b64b8060b6a0f102d4b59708e56d41c3a28a86841d19d0f97d0a1b159afd6c5119606bf7fbea3a4a600b4873e3bf596b09c8024a046d7b4c2b5482f1d4e05e9f92c7574d96c604ecd3972e279f0592ccda8fb0369e72aa448ebc6c74b055470be6902b6cf184ab71abda3504205a09abae9dac67f4cac08e45630c3a6331f4df95ee3743f1f392387dfe3529a65958e3dbfc16fce01939ab0ff6dd0652c10b1a854c3d1dad4e4501f51f2f3d1844f522f84d057dfbda9e65c7600503e5a19fac0c9d527dc0dbfa29d88422b8560de5c258ba464871109c0f10ce1ca4e4492e17d4f6b57ec9b47cd77c35cd248fc167ca4a577b0c77e35953c27b294071b091e2799edf670dab12db4273d667461537e4569fd870a8142ff895903afd51050bc2243e90c9372df8594279d4d1e7dbd0fd10f6b80863731215c7b230b6693a98114a89608b64b40865edbeff32525394e730d3f236bff4cbdcf0aaeb5d8c2bd3fbd4623329f95b0687e0161b1ef1981c2f422071076954bbe34694a8017a735bcd28d7bb4fe2a09cfcdbec51b4dfc30f0803b1a42d8e7eb54d5461565f80afb3b71ad76dc5cacb8e04fcc18b4101e6c79aad808ba9cc9c9417910008adbe866a01313e61ca6918d6e498e7ea35678aa9be1225505b7e1e3d900c12af64343fc44f0374607ac2e76029b718c9bab1eecc709b82b041a10fc8e1e1ed32c8b4b142c6bd4da27c13dc66345bfb5bb9a81bedabe143a27b7913b9eb5f1c092acfe37d8f0d649e6b07f5c03771a13dcfb3bf4e31e9b04310fe60312bb3905ced9afdb0279e8bf38ca45433bd93f569a411fb1249946b78df18617b538300a69b3164fa6f526468ab8a16871af14885ca4e8bbe3f0a14ff42f2535dd9d956eb956bacf84f1e94f1cdcfcd3042fd6e017a47e0055b339913569252088cc0714dcd57f0b74afa3d374319362237b80ea5a4267cc6dabd9523825ce266decc54a622cfd7e32d0664e9d7aa30442da4134553d284ace0b1601e51070593c80f30842a633bf7559d56d3b5aa942b5636962bb8fb0b2ee0f34f6ab18b7663c06fbe9fa56f208bb04d7f1cf5acf354ac738e747fe43d3b0cc9f1718bc9d69e8f3ca7f236985e9c97b0bdcc9526d25e50103326bdac3f0d06cec4490fb7aa563ed9b771770c98890d6b51005d458f3abaec012e0a7e4a9b0a6eb7b9c0f249d188de38e5124e54fe411698b514b01c48c1576dae7594f2eac608bf1e0a9252eaa680e91a522479101c4e886210b3a39ced2a0260d7348aed774e9ea51078c150875292cbc5ebb8ce8140d66522820e384a052b56830f867f890205e2e95ade123b3960d2a1e28f80b7a699b8cb849f42437e222426a8151eaa2538acb2e7f8bd120417243a931d1ac0fcd734fd73d0665966ce1f0d0c49c06041344dbb88c3fe5e93183208ae9a8aaacd98f6e1a0abc76d9b423d102863b22bbc1bfaa128d75c44b1d6d427c33c1521e7a691246ecf61372b162a63e4be9e2c5280c5ec4bad258598b89aea7d06ee7da1b9bd4fa9c496f0ba1913d2ce48a3ecf8b1474481cd94911cbb70c34d92135c0d057602ef3718f01a6985841d7f9b9184cf87fbd594c24beba5db7b98c40964b9b4c2517999c7a1fc057058005ec4eaeca832bdd498540c19e400cd1d519d008e2dd9cbe20d0aa273cdbba5e70a556395daad2b957fef8435bc28c0a64bf94765d8d33d3ece160e14b4b21bce7e2017395c8bc998f809a77017d2090accaf45e142c45f2a03b73b0345caf2340787fd15be488cf93411194d8053bc7e908bd67211cd14529209e4328e95c3931e0e087404561b9c33f3d100533161cfdf54d8fc53697f955b0e5fc874b590de9cbddedf59a6801ad662abbd8bba8056b6906828f72bcf3cb83e99d5b18174092aa25f468cc27b014a819c1e8ed9b9b1984913f1f5cd1aec326e9727e13c0035f47769f102b151581bba3b4972b0511382a73f11be5a86a0eb85fa4a7c1604e048fa9417c1e3218f1c3cc35e8476faab97a55c3da0b88334ec17106166fe078e8879bc8973958660ddca98f0e76ab275fe2e96899180fb98f96536c35ca40c24a98db9cddbcf32729c47c0206063fcc713faf1b68d164f8e171370ffdda99e39d7468018e612e5e06c223b69a9ac0b1106d61455a3355b8ebf7f700f5968597ae2a7aac39544affe9d98f0e28d984aba5010a6f28d6a21d83f78434646254162b4ffeecc0af5ff8253d30b760cec37c0fdf6c0877f8648019c73b282777fcfc9d8b0de400461605859babf015c084d5aaa77530913bfd54263667b69ce7281eb23581d33d78c08127f40a240dc13eaf84efa25ce43b360a8ec10fb6526a50946fad9ea60649c109a23dd457943598ea1a68a42a3457cd9ffd0c15bfe7f414c968a1adc6f3b94c1e64d047c8b2628cf33130b26d10769153a424ec3db341d97e886564b93ffdf278b9d61a0dbd87f039b0bddb28f91f617d64eeee27ff6b56b491229f78bcf7c597477b51c2b6fe36d209a1cd3e986c22b51ed0139610112f6f4fd9c960257b1680dcd66a185beb86878724340c60f221d69e387211cefd49fa04ab4c309b7711e9450064e5b82146b2743ebb5262de301f84cc1c127356a9c2cef4689e66334c669a4688519b487b2753f41d01d100f913714bbcf562ca45dc1d0e413c95d18019e69d434325995364dd47823800140438c18eed06c8af448ce1fcecd0480fd4e5b9902c47a097612b99456389c8f19342e17ceff0914027734180bba0bf7bf35b8d2a981a42725737418f13e5d5f1c8b4fd844385c2ba7329ffed981f1e580853c5bb2ef21793de52e518e81d093eb7b980d98f34113dd60edd0a4df55e3e928eb007d3ec9e00ca0c64453bbdfac9acea7a47b825e7e850c32fe3e0412cdd8b21730e9848dc28b8d4cf4d6cc72548ce4a1b3ad5b1af9d315ff0e6c661cadc26794cac5f5c16fb7a6dbd2661ea09f4f7a452d0c6a7fb3040c25a13a65e7874ba3ac500005fd5e06c53b0be94d627a57deb29f9dac0d815d49619d00f6ddd932e1f79849b9c53c0d2daa8d70fa893ed56a278230c86efe6fff4fdabc64c54d2fe9b953d5e5974546764a544908d5dee04b9d77a9053b96938a1082ecf743b785aace1c61b8b883696de48f69c12c14d63e985fb95302a0b81e24b901bfa2eed820f4974a5a0c7c6fb98718e5960067695622cc08294c52d0c6046c8520f95edbcc692f277ff73b24ee63e45a7b7c21dfbe1886eb630bc79da07a51c4c523f0c44ddd85c94fdc55d5c285cf28ece762a6bf7fe712eac1af3ffd12950aed9d33992adf81723685105646c248204870115eccfa1130b7158fb9aa6050c0c612e54a9b9ce7cacf870c78b35fedafa7df4f2a9a5ee07c20939d5d1e7deea73efdbe732f59a9a06a68cd7d3e1f658dba270ea12714fc2c04d5b592b30291cd9ee74a552aceaa491cda583e076d3bddde0cb12bc2b531dbc235f40f42ac5a50d124e0c5522c6e3ca31e10a14f7066e97671828b8ddbc78b6654d82c2156ae13e390718d37aaef2235d072e7d17439edf8de331b4648d1ddfb6e56d6fa250725ca519081b22074a5c311077cfb0aaf9a23e82996dc55773b77b6b7f884cb06188b8694ce171c0f2afdba133c63c5caec941829839e92e6d3d5a25958bbe8085e3f4fcb129ba5c9d073f99c488ae5af5e71d1e10f83b07949e0c4a4da45cdd99741876c92cca824a485a76bde3b27f52999cf294b7aeb0b9b9b9e12f701c7dc0b5b530d392c5ef00228d2fb7dc768b1fd2a66a096e32b939aa203fbc29eb6bab9e2b0fd7343ebb2bd58920469f7e3af89220b3aa858f7eb1b547d6b329522c752c1cd4a1757ceccb4b06678d2e273f7b70c0e6b15364528b3de22632a95c3c9d6cf6f026b285b8bd7e9e4925c1eb987670e38e5c01bc5d93046a4c56c06d32cc25aad48da50c23ea8c094b25f9e549deed2a65d246cbd8e44d64b390a1828909f568ca84b5f68bb7496faeb52212b52bfd9555fb47bdc7503af4e6fdf1a8121823c046c8fecd5dcd369cd86ec195ef90e48327d499785c8c320db98c3bed413bd9d381837d8772c10b842197e6f48a38f1ccfbe680ad96f2530b38dd8b88605aebcc22837741598abd0ae8f6b8fb01a5408c0a0776397915fbf62c3658a6e38f760c6678aee9158c753adff0483717e8402ed5f1732b3f5fe1cd9b4d783f71204ea4cf79e0cfa417fcb86764260bc421ac1515e20366c1273802a520ed237f221439aa40abf4b726c74cd21f4f5356befa3b1ddfce3469ba17b73644a8278a58d139835e7cee130b3159ed0650b95fe6d8d15e5ab87a4c9dce59a33ead8755da8412b8a1afb10241dfa46ba5e29f99ef44f02267b9e8724f24028cc47d51e6a8fd65fef24d70c7c8430ad127315900a23d7c73e34c81e3b8b333a95d069b03c2df4cea0b6b7f255d4baeaf42d2d60580483cac77461d9b2c6351019412fabd1b249966dc782c64536642cd61c77c1a1b73ce530419f6c3a81c5acd33f335d9176a83263675225627fdc756301dbf1836d39f683610716971c0188da5d48fca374ad0a523eb0e920cf27ab696194097b286532ed0c958d4edd6c8f09b3917be17b31c2f6f5809a3b46416ccde64a6079991b30ee7cdbc3c73f71eeb9c134cfa20d069e005afa376e0f995aa23b96a53ee9afc12e544eaa2e8f4d70c02895f8ada89300b7fb07b8b859f1f7778e2451cd3c5a14e2117d5152e081e3e7ef9332a1fcd50112939949ebba9359b081aac97bef81fcef101b14c25291aaf50d3922416a100c2515d1a7a50953a2e7642e408c6532efa78fb5f4a811ed8fa643ae222720364c65e22998330f116a07a60961a16a099bd4eb47ff03a88604ba981c52d0169bab95b5203a1e158fe18546128dcc5577eb485fba8fbbe85445d06a75976a88a30fe0a30769d42a8ece38eeefa432ece02780b4d1e99e4bf41eb84f6dd5f3012a0c55f908881bae7b67ee734006c2dbc257496e3a6f3ea8b801b278e1a51b5a6c6f2e6f82b560c88f6ffb5961fd640ce6f36d3128e58dc1085f1634ba3197fb3131755d53dabb7a097feab6fbcc8227009a8ceb933d993c64ded3cdcf9c05d647200d42245ee1fdb0b659686790a85c713302254682fb598586f9652fc3effb782bbe84fd7506f66e30b3186dcce6107abc2bba76061fee3d3bec4c46e7541903aa2610cefc11ceff9a09202d39f4351a7cf727c1e0560fab4115562f22d646fc6f9ffdc957251ee389ffe09d94448c8770b1810bba5c6e29504bae8fa84d87f14cca62ef60b4f4f0ef28e795b1fd3bb4ddcb94d9d82119f2e57505d06e608d220ee8b84b24e5b438286ea034b6d23e0d181cda5d4c78eb202d3c0d4704b85c5995431b752b7f9b6b7a83812633ac88d63eb3cf2dd1dd8454af15241117c76a77747c402f8a0e9572460e0e9075ebdee4dfd0d278a7c81e8de39f5ed1bbb818c414ac7b41c0116d282fec400f5462caaf692aa74fec7051570c5dca7e16c9f7a7a4eabc4e50375a27fce38719d899ff626a1763b05cb83b4e5ce4078904d29eb3628cac04a71bb090d34513f521e342c3a4136014f4f2ddbce97c840d9c55962fd69f84697c0dbb990532484f83643fcd71e912c59acb78dab399b7d6f51afe1ed68f1fe1ac63b29b5f5b1432e2273ba797700f9781094d8070fb83e3263809cff16d606d36c3d5469fa4fc850a27200ddd522611e4adfbf1f69b51afc00e6d561d933be9a2a42b50f78133cc77b44e3d284e0ea3da2aa15596597674f87ed11715a994e518bde2d3bcd45cff875538f083f06478203109ecfa811ecd700bfab39f476e57319a7c0cc69c5e88332eab4e318a3518f16e034084286a95d4d7119f5fdec1344f3e847d67f7f78a4bf1a444aa6b35812c9a101d6345b06ca3e3fdd2e6ec20c79d8953e65b24d95cd2d5a367898d4ff43a58d451b2c8823faca8d8086e7fb325f28c895c9e6175794c9a5362d004cec5cc34bd2aa5427b892e29c3ccc864566998c5f315131e831b8f7f51621b2b4541a091c9ca5d90f4ee3fe3615e5e4042f5396d277e204eaad4dfe6a687c6ef0c3747ea2218ecda7a71c88b4eae299bca7a1857006d8e6afa5864af6815beeb5540375494926c8499426bfdad482a514748e4adc08112ccb7035147ec04f0825b829938f29291a63898fd20fa64e17c9f6c93a27fde70dc7cf131c452e075a58522e7ac2256352d608c3206815ab4b6e2968c543b55fff336140e935392be7540eaba424df5390972e558afdfed3b1566d235156147eee1ccb5a6eb2512179b69c497a0e4ae468668d0439ba8f45ad459900f41761ecb1b9bbfdc46821cf57c4e66c66f39ebc0a6c7400d43d41283a926586edf0015f0297e325686b6ae7054f005d0794d02ee539bd279bdee372ad1e2525d828bc0fbd6d15a0a82cc741342e20e21ab45c9fe986ea584124cc28cae518d162a853564f0dfa8aeae56f97db9d14acc382eae5c9145e44701dcea0b2a6aa523d9dec9a146f8d92ce375da2eaea2265411361f35b54177c69155a0da080b0cd925240acba5262598a2bbc8403be0c4475c5dfa702400e69cd68afd445e38e06273df0e5dfb043eaccff094130754b7205bed36f6e20bd668c3522987a1e17e6bc7e660c12c139f8c51db2ce8ce3ae6a7b158e43f85f9c8a09001aac88763ef41ba4a7dc8914b6a16a41a843bf5ce42f195db05a52d702c23091503b19330cd0b296a5d0d4381e42033ffe33e40e249e6848f653b95a0859a260d2e4cf3a974269834820fda1c8a91f4177666574cea1cf3a20534756bccb4bfdb89cf862da8fea4bf553f0dabd2654210a4bcb61c464fb7a01bbfb9866ecf4f63a31ed92fa24f8ee1945db7e26f3bdec71163b1a603877c28f73e0c34b036f56ad97c4d0b1864558bf38fa3a4110f50704b22a20a326601183e8785c3a5d86bc8d6efc3cb41d6b1660794eb654466d31caac4b206ff79e7c8d20112610e621cf1f69a581ec5518a530d0f93ce9f0594c63d406252efedcaaaa3825ded87e170dd16db4b2fd692c19608d23f5ac3f7665ed26fb5869dd88c439c1528c53f6e234f6df8da5717c356a774a2b59aa714a9e2763ff6e3c69dc27595dbd44d137eada0d99213811eb140e8333838934a6b17ab1b0218bed0957f03eb1924eb790e687b9e670e4501b1e2f40815447d8a0423c0effd8bd4967d18cf6fdb2310c7494cb54386d1efe526cf72eba5f48e75a716995b564bf6876712131273cd49a2e8ec0c1b793cca30760cc7e66bf50e9dd90df82e07dd5be1f032a8aeaf2f0c76154fd3a403e1106641c6b8618063b03a551c4d8d2de1e3772839196a9ba9046d1e22b5d59ff9292e114e6e7fedb65dd5dc071f1d3bc04b6b2a2a95c140e589e506472ef632c7cbb8d1cfbd24c141322a5d310803903c7476989ebf0c3db04a84114b3332687c11abd5a9a7973b7db88115fec445955749a61f49287da5c6471560fe4b24054d33937395fce502aae488aa6450b982852017d820b35c01ae8a75173ee46da3993c8351b55a75b5b3112aa92e22019c90c0976288198790a8236cae58612b6f3757ef632b37d3f1284505a156f8642135704fc35891ab9fb338ea8875ad113a0fe8723ae4d2941df9b7087ac0f4be64e527cf2a63e19eefcb0f38536a157d78194f39d69783a8cafa9118e7e812b3fc8fc525a71a1c312d6b4244711a0e06a9012f6873801b8e68f5bcd4a6ed332723de42c407570f332515efb6b287d33170c5bdb884caa37d7377d1e6db0c1d82b63bdc04e89d4cb2756bfd96d3c5657183b3aa2b56dfc77143600eb37f8d03709c583e33afebe9bda951f8426c42728e453abb4ca75c5bf9b6fb4a2337c4342f7a9e7aa0fae105d54c8d4d6f4c5e7caba88b94497d621429a656bac77ec1362f7e1003cab904321fd6829afbba87daec9a425ed578e59fea50e55e6518ad841ff9719e3f1d9a35f3d560c3a02a622d0dbd1fd2a0aebdc7a1aabfe3daa8a02115df38d46ef0040be8e70cffcb07ac299f5d0b6eb97a25b48d609cd2b25b71f5cb428a97ec29222e87a8cd074b2c60f27fc71c4ec2310c16b310ecfb93498966d687caf936073ff7b19bb8bec4baba2a64f5381a6fbbf3aed85ccf6f8d68a1494e4419313b3ceee637005685a23c574ac2b7422397201126020313b718a621a434dde8314b5b598fc8aa971728127e48bbafa247b662bb9342d032cb537a0a08be74d6b439393472958d8151be9c30a1d711c586211ab668a53ec0eb697a61ef0d646d9f9c37bf69be9dd3bebeee7e6eee160bb2fcadabd6cef3993a074007e905ea210ec032d20bb3c3efce317039cf0d511e91162ba94c1fab41d1428fe0b6007845e13ba0f69d275ea00d639a45d514dfc471b5d0498426bb1644e1ac91c295b5e3208d0cafed0a79ea001415996c66988bae626ec5a95076ef1650ea1f271775f858cd352bd1ca200f30c3f46bd566d5b92d16699ea1d009d49f94cb19561b84e07c0662535ceba50d7b3d339297d1ef80306374252c6907a04b6154d519cb901d5c4f92a56c934167cc9f09c68c8b98f0fb675b6ec51246f4a4aacb6bc969112c51e5dc91eee80c24f3a72428218786d148625ae1777cb7111514f8470e69cabf5b72ab7e67798bad7474e72ac8f2c5636b35b0c967683048dbab14c585d7a5becb531aaff7a791eac23a1198cc50811effcb0c6c876bad6bbef6fdc3e17ac05592c8afddb83ba654f101e2958f55c4b51f77eaee29905753b46a2271fa07e89705f833cc5e762ba34afa2ca6cc3372df57dcab681970842d050e7b6a7ed289a6ecbe77c161ad3904682e441e1e1a4ed4467f44d5bb107d2707cd8c8683984a5865c923ae707711e89c75040a9fdd6e3dfada5964e80549dcbdcc4918eddca5501c5add93f6d319a1e304481da45946537f2e9a0ce2413c87818e65975a5d40e168cbcbb1de325912411f05d1153ee2940fe12f0d515144af063622e44121d337896503d61f780c32f01b1900844f97e9b4fb7e6c419a2527768db92649ba23e00f20fb102e02f4f6978576307333b5e6fcbed0d5002e2ae4763e3e1d42b866d8a822ab0181cc67a245e9a7089d50ebc60c304d6103237eacfa448c2eb9fd97442a759b07276eec1a8d93545d986dc43874df34002952559cd69c9924544eebe1d34910d8878deddf8dd4e2a25513f4e19be76b59aed2299951a92a798d2e7af9624b02972294a378957e6d711818b129384162bbbf722ba82d624e1e38abd04c17d5a22e0e7bde8b747a07ffc079a73e9a1b8a182188a2ee6d9f26524a242ab33d7d6129f0c1ab9e9a6f9c0c01115de349dcd14da44fa8118247488aff64452e02e04f0eac80daca8428f80700841d7b0011192adbf90a18aa4969fcf5df373254132855c6ccff4567c8cd4d845c352aa790481af22f4f22c00bd006a814630ef6b0c988353ce59d1ddf407a0092df0600972a79d17c8dc06fce8e1129923cec677fa029e36c29cff217149cda3581883a79c16e9767bcea4cd1b5c014a4e38f69b2239e65011868f0062324d4e8bff426e274ee92bd981f4d3847206bdbb3510b5693ca2046e58005a24a93890dbea3ce20c5b681ac97bd68f0c6818858a36f6997c18cf26986d99efb66f483d21e29f05f7e406f897f4f8496317b95dc5dbfb392426ac5777abd51c989caac40243e462ece2989521d9cc227811541aa35f8ca33cda44bcbb256b0354ab03ea398fa95b300eb34a078e87ad8eaab270d9f75d557b5eaee7669fc8e15d89b7eae1e77051bac2e3d24da98971b840e4c982283c3b4e2f0001d86708ee0fd790e0481bcc6c87dc596239d926f656737eb0214208d972ef2d37d9726f29a59432300a010abc0a2b91e532e25eb9f4d64a64b15cbb65b1fc9371cd5af9d6cf6279b712c396af4470fcc0fc96cb073dfcd11a4df001fa062a6fcd1c8aabd5b87b3ef4164bdc2b9627e3396bfce1796bfcf139cb57620febc1b18745e35afa2b86f5d164bfce1af74c4c4c18e69cc3cc720dea1c3a0bd42e97cb15e64ef4993a9562a25ff3571e8e3fb273fef90d7d7a987fe415e7a0b8590f3e4be52a5d232313e32c57798d17b372cf5b6208e6af9c56cfc7cab9917a1f844e250f5ae9677005ba1659ae125b5df57ca8bce5d2e3403bcb79d096483d1f3ceaca73ec7325d2ef2a07218bc23ea79e0f3d7e2ec71fd9a76f6fec617d1e3997fa37ac876583775baaeb7c846edb6eca9547e8b119a1c7a646b104cf742ea7f1fcfa3a9518e3a0186a2de3618c87aa0f5abe729583e2b67950837afb83e32b66f4d11a2585a97c056a9711b74abb7ca55dce83ea111ce1b56b9e04400ff1d65aaf5cf579b80a5d35c2081fba4abb625caec71f2e5f8d3f58a1b8bfb1c7e65d36afccf23a9a9cbbaeebc20e9c99999959026abd1af7cfaf5c256e9b11fef396e80fd6d4c46c578c28292c6c8135a0d78060ab86e59fb75ae3c60f8e3bbbca3f517396b87b6c56aa300cc56df3a12a0c6d7a6ca4d208360eaa504424d415e96da7db40f4a744edc5f90fec9b73d835df8090409f1cc16ab9dce5b98cc7cc6495cfd898a03f04afffb2ab4057791886a0cac1d15298e779ce1908c63e160890cf9e3d5f8d1900a1559eabc61f9e77e38f1957f9d857b9f6c6702666c6d592898969b55aaddcca2c168bd51d813190d72fff40af01c397e73a679db3ebd1731b17fd94b09d26dd7eb08dd28ad5b50f4e98542851b9cb573431ac18073f08dd73cfc3d11b654cce312dffc6fdfa2074ef6b8d3ec2d11be5077930c7e4ccca2c974eb362a9562b954aa55229f9c087a764f118c46e63101f1a844e284e84cc8ccfa8dc45e3afce3fefc496ebef731a9c591a67567670dc26d80fc1051fe3a06bde079f772def5a63047e3ec6f3d043f740cfb3ca5b9de8a976e7dea85bfe75ae7912d00e46e0e77de8f7819f0f4710dc786f045d52d8e7dd0ebd4fdc9fb7c60c80b0ee8d3f54de1a7fd0f8e73c6828fad06ed4342efdf5d1cc7ce37681fe79f77dddd77d0e7e32323232200882204804e8f341fff2e7d3bf0fa49ef7f3b9f6a114f4c64ddf73967fe2c63163e8ad707fa07aaef2957fda439dddf3a12cd5abdcfbe1435f3586603e08faa00ffa049d1b77e720087afe89a16b71dbd75e3f0d82df687d743e7de4a4c641bebccf9c995e197aef689b7881bc752e456fae96de5c97de074080fc96ee6387c821c298633927e332341ee3ad19cfb3086aed2e578dcdcbc1b1ebc697f7a2f18ec603d201e980000142e3f9581a1aefc61f2e1feb639f66941426e372e9332d970c2ba6d562b1582cd66ab55ae59c7326c218638c31c61ac8ce05aeba4094f40663acb5a6301f0b04ea7dea0ccd6b2059815405d4052232765894deed79c5fbc10de268f0254261f77e705dbbe3eeb9412068fa2dbde706e15085901bd42581c205a90a24cfb91124284a9cca532b4f79cc9ef196b37e64073dfbe75d1669fc13f574d0e84197218222f4d5711324265fdd661ad71ee839fb973d1cb57fa1d388bb73e933ee65319cd9d9c3f1a371d07376cd93c0e7fae53938eed7079d87a0eb71bfbcd187f61074f923807aedb99b7150dca0d38c1900a1c170c6c3f1c78c7be30f19077bf4cc37cab874170b948959f97570dc2d164bebd56a057a07aeb283d9c155065d832a954aa5b5d65a774990aa40aa02090a12143074d033e8d943317bedb9413708e83d0753423708241a01d40dba41190b2a8836a8dfbc9b43f5665b5161924d128ac6baa2274ceed1132ca923286a7842658584a8e88888918e12dd580746ef4d68434285c2362a6a4e1ad5b48973c4449bd469e949893acd252a54873ed59dab64bba1a11036596ff61502e106d59bca418ed79e286cd342619b6dfa6d8cb714b67a10244ef77885c7177e5c6712a702e0680a20a5a725ac29e14987ea8eb55ad417bdb525a1df7c13aa3b5bd16634f46de8ad3dfda685ea40511d2e54a77640bb79ebbdf75e7cbffafdea1a140adb1c8b9a12856dce6d44f4b98d88eee0a6ad686bb2296d5494be6c55b6a30dcab6b4316d4dbf3987ab16953453020aa23a5b73fa4d8b2262a48aae2571a20fa125252854872e694c4e1a12aab3a790464475a6a684ead022cde888ea68db041267154fa0b0396a4341286c23aa37db4c6f6d686b43bfb916a57d990919f2392108856954d3666b890a206d52c94546cdd934e2734290399b40d38814fab5c105d6b5250adbb84d8813b723143680d91450a873e2bc31143ef71cbbac3b28749e1d8fdbacde6cee8db8de60975e089de751d61bac3d6951f526855329ee0e25094971585bda84b428ed49f34ebcae2d6d42db916d56779e42106104124aa83bd6370adc58b785d15b8bfacd3722aa43e7c684ea44519dcd556f36b7a2d79bcdbb7df39af8dacc6be16baee58e3925beb922c6f152e2e08983c2369f95256a0adbfca5695388eed42ccd2125495234f96d23facdf784529790f89db7242bb62424bf6793dfe6d16f6e637b2efd36e9464475762ea23a5b1b519ded3aa23a1bc72ba13a548cdfa8d34614c6efadc96f60fcde92de87d0120e57ddb1d7a9cd36fed8a0009064fe9c734e5a59207bcc48d139c87e1125bf04a13a428accbe54180c0683c16039b07ad362d25b72f13921e8ba80dbb8c10439c88716ea9c737aad3cdbb66d1af0687627b5f5cb2657d580de541e9e1e4f95b0bc992e7594e0d218f37061efb538602e0d731902d5c91246b5bca1b0ba93c3537778c81bdac30310248cc2a86f203fadb51af060217cb0f75a09a36f42909f14bbecac9e1184a584edc89beaa0bee63a46b0792c250ca75c07d54971205098071456bbee36dd29abb442dad269677d3a27c501a394527a6795f5b36f672b602c4a7983e91a93a73583de3c5f44e2546f05e910768e0720cc22b68b1a369be238e7b484b17a9ee6694fc8b1a9d41a52031e8c61b09c1c1e1e2d242f0b7a5684e3b028e650afba7631e438e40e2da8070d785c4a1efcc5cd185f7d1be0a5195f7d2be0254f15e50e06a4f6da2882c4a90ea6a1778eebb89a4e973bb4a1fb45aa0906cbd1a0470829285560475096989a5250a80e15aab3535efc520aca8e140eef0198de42ef54d2574f25a594aa4d359560871ce4830c4339d53ba51950500faab35d20f4e081d2d64384cb241341cb231e3a20905377dc73a4bb6a86b4703ae4a0231e3d4220a127477239924cd2493e4928195557f0d55a6bf11772a7fa206faa8f3106854afa5d53c3a3de54af75688bde395f61b01a1cb4c9d619bae954ce499d523ae79c1267fe1c85d09c3e169a338b5553232345059ad534cd5a6badd62e973b0cf632e741a83deacd0c9193b59ab556d3344dc3d5037a536bd096c26aedacacf49b12673a0faa6d1d964e2bed7775d41c1d36a8864edae06d13650c8b32c6893216e3442cea221edd530940820019613af2346793c80c9a42734867cf138cc084ebcee6d245ed09e1f5a682d11b04088490739403c3514495485902fcc5de6b71c028a5a34b1cff49773f3d23692075a746497c5dbaae944ea7fa750fae87300209b846c9e9f435cace649ae86d7fcb2a3f5dc609cd424303a1b7cd3f68ba9abd2d7a99c18f4f1458c84d8e8e8c8e2614aaf4f4842b1545d6092323a33b8592926644772cdd985052b2d4e62ae1254b4bb3ba9c955b014ee12484baa19a675df74454948d61a2bd2af4d6a4b0c1c84bef8aa8cece44be7ac59908d5d97996675407e80e4daf7506815374d2a6eba2686bad6be607adfdf60e8ba64fd36f90c4b9770c92424c42d122558c31d2d2e9595c98881114aba2c4828dd8943853e64a2b86d6902a5f21d820530722a29e62767c853006b14ba811aba3ac3fb1216a2841c5aa6897502386c328aa4b9fdf0027aa388a5531e710eba69472cefb5551c6ba2d4b69c6153800c5641831ac00c5a4e30b8662172cc139abd0ad918415a85887454cba9e0ba0a1dcb13de9ec09d11b6bdb8694f76af76af75a6b6dadb5baa02badf40671b2deabddabdd6badb553bbe6a43a4c9f5edcf5844be46aad9489973e4e5b299d734e8ee3348ed338ce1ac97df3d23112f286babbcba565d345e21ec99d1b34ba2e12b2ab3ab8864f7db33eb76c9252db7c87459a30a6310b5577300e0aea522e3d136442741e428d7563901462a9cdfd0d0cf50a5d22596f248e91c4995ec50b2471a6370531f4544aea96866a89b37a2971ae9885de29a1a7a090dc319ffaa72477b49ee20b442d404770880650522af5746c81aace346348d7a18e5210945910b60294b637a8d65a2b1413d55f9dca30d7ebadd5ab07b1aecd246708318ba19082dbf13255f12ed59b796fd34fe96407a6974e7440229b5e3ad1218daf4172473d9238d369ac1ad51b34aad1cf588a0b1835a0cc62136a368b4d3fe18362ca1441b3d8a447b3a0ba3363d3a750dda952a84c499ac5a6cfa1ba2397664575878269124487ea0e35a2443f9dce28906a0907a7596c3a1582aa3b746929eaa96936fdf4b944a1eacdf4e993a8681a955077aa51bd996ef4d341a83b0ba862c9516cba082450a3ba236335a8d6190f6a4447a39f5bcf4ba7dda2e3a4b66ddb91a1df0cf01b25e2b76d63d54481f2312f91cab8f2dd4b242953b29d214a4bb72f91ca5872f9d04939e7a41ae890b556590f7974af267365d174dc1a09111da2332ae44b952626a3264ca6d00c82e2d2b3d40386e3a58de42ac7711c9df2fbf6cfbf4200639ba77ecf17621b838820866927a36889ed7d4aaf26455bdb49d1db85a4a9f3a854d43a295ade99436a4ba9be52e60d2bc92e275abb9973b13c570b3475eaeaa6b8d4a574979296cea3ca7b97341d33deb49b53f6de2b71b66dc318739c8e4fc9aeeb347d0d6fad22ba3b72cdd2e0250e1b223d5d87e6e9a2747499a2b3ca384aaba594524aa909293c154d48b9cad074dcb9eb72ce9f27d3e0dcf0a67197b3957253e61c0c9e74948660fa3cf273836bbd0ff0638933bdbb73de3beba472ce69bd4fa6d15159e71c7d72501fcf1cd339e09e456144dd7c6939e83ef57a89e4858aea25521954a8d79a243d67119ae652d649abcba85842dd7979535d0a28295f7d8baffec443e24451181502925de80307280a93d7a56f8c359d74f677ec4161950785d5eaac31a4b3c87842f798d7c51f29ce4590f2105b97cfb9f6c2230829f99ceb8a9d136dc79df3922ba2d37cd671d334bfd5effef9297164948c12076051b96145010b77187518f8464a08835a33137ac6e09cc1c0ad2c458a25a4d65abbcc5ac3ce9cf3119c179dcc127a6316167ae397224b496f4c297d55e7defbcece0ee6fc0ee6dfe75e7a1cd49f23d64e7ae35bdf266f7952989ca201bec3e277a93cc5f07e97f3143d70dfe77ad7d6ea79744a4ee2489f629e426f3cada79ebbcf599f627dcea6f4d4d265159f39be7c8cf9e7d893ffe77fbeb3fbe7a7b8e7db978f6d5fe2973fdfd19edce3b2577b89bffdf3f83b99bb14e77de2a7307f2add6e18a7d592b8e2890e736a30b0f6f66a23d02cad73d64dd3b81abcb85cd2ba66aaf3a2cb51644d0333a7e67d6a7c4580daa843f771f802c91d5b94e9d648eed07ccaa5cea9845dd746f0d5a59c122726b35eae52ad28c8d8e783174bf49b8be2a0288c0b855df0daf80d491cea9988965b95f49b9213690c83507738288ee3ac7825ec5299e372507587933757fccb41cdfcf59dba1cd4f837035f7d8c5fbdbb53e2dc14acb552fcee07b509a151d179a77f204ed7e4b473ceea5db54bec9d723528b42d870dd7aabfc0dadfb75a9d9a487fffccc9a59e5c4dbaee4c21f4c6e59ab32cd3d35f5c2e57bdf2a6ba5a9bba0c45b6b68d7befb5dee7e5abb52a0163b648054959b1ad24f071e5a49fb5318d025d2278bcb32eb4741ab3a20736bf185be9011ffc53e6b0eee3ba3377cd9edeeb43fceb9db6c9201b465fbb691bb3621e658eb41c92e215f2264063db78b5151a93e20da2d708855da122d70695fa0c115afabe4174de7befbd578a9fa4a92128cfb95074491c1658eb3f7fafb7c18cfacdbb0d77138889cd59bd916182b994164bb3098549e152186b3d73b09052f8a5632e95e2f0cf198585425dde72a270c04e0e0160acb5cbe50e83e9a62c3bcf4be1e0dd17602e86b349de842177b0533cd6d01bead4378de1290b938d89c6ccd2d9e0148ea7580337f2c0cd936300d80dc673dc328a8ce2b7037672086086f5cc35674db059fe02d4154bd38da6ac2471dd71adbaf5cfabf75da8caae97afa712274a95bd973bd8e5ba217738e7c639f39de3b7001eff9c652366ded7a53eeefbf0f669f7b35fa51301dfa6bd0eaa5f078fb41f8db2ccf00e93f057d35c739c92fabad42e0f9f1b441318bb9c7bf94bc6b3cfac400f1d04694cf00f014de8a0ca41ffc4edff7ddf0782e066b9f408c88021183a286e121ec4586b96cfbd9b84d71e3ab859a08cb7401907c71f32ae1a7fd038e8737deebfee6a86e6e5ca33332e97cbe5eabaae6bc249f8b0d5d2e3be810106175c5053f37ad1d0ccccb85c32323131ad168bb55aa95461a835087e9fe7e5dc75a914c7c9c88c1bff27715adb0e1a7fed9071d76bdcda7f3ee334a2943833e3d65e7b8c768d312e234a89d3ba3a2dff603ed7dddd1d6be92434bd8f65ad206f3e6ff3b6590aebbc4b39f6944f093d3935a913238e4ba5427043a5f2e9c93d19631f9f9edc938d388ee3388ee3b8ecf37af5658e3b219f805952bb4fcef952e09ca67eaf769d85f1d544e86139d41218735ce72e5f79a1831efae7e910dcf856286ed67fdfa71a23f0f3ad3183241a6b0ffd63798cb85561e72de741599df3a060e81f1886e32b023fcf723dee1e16f8f3aa1104379e35ee9ed70efa56752ddd396bfcd1796bfce139c80ac71ed6cf38cd0af46656ab9c73fe42d0bf0c865ae6fbbeeffb96d0aa71ffbcea591f7edfb7f2d05b2d96f3a82c517a286abe12770f4b058220087e5fddacd7afc50fbfe79bc562f5b0bc27acb79c6b8eebbaddc37190f2d49872ec3d9ff22b6e113e35eecde5c6e5eb1e85711c7463cfdf7b59d5062646f2c6b93c953d45e334331ef3ad1cec56a28c6b31a4ad0f405fad5c8b9bf5daf5d62cd7deb1c4d05b2c71b581ca47bf67531bbfa7529404f3d2a574499e979e23af5421c206338460b15224d6a3ee9020a40727a0886164c9173159021d78d001892c53bed021b6e5d302909c3c319501664b1131e953c89cfdd0829c407534975f5eb2f1d2794c262f5dcba2d96c5683f4f94475b81ccd663322d22510291bfefa85e1f8eb5b070fa5bff84a2a24649182bfd2493e49df92cb0f7f632e1091bf7b1a114ac1dff01229f9eb7b32b97726fd559a50febaeef5d97465c85fa7f9a4e5ef8d9a5dd1d2fa4d8558df14888891237f9d0e0df19722f97ba992bf4cfe36f9ebf48806d66f9af4f24d95a0502a4c59fe7ed7377da25afe5e1ad58511023e741f9e2c640113af52a954aa1bae5275a1e45559b586aac655aa50e552a552fd18e1841428b63881450b2954439638d1a0850cb31b546196708c100796df3a5830e5432e3e74cc85111f5611fad08a0a1f869e63e5c987dec393853c353535352e5960c5d738079eace686cbcdfa1b357fe3c60da62d7f638b2dfe0613117fc337f06437649e4c75815395bfc021e0c92ec031fff2f2afd05f2f95bf5e503820891266090a8a1f62af2e9cbea420e8cb124a003941f12f06fc66bd6a00bf6b5e1586d1ab54aa30bc7895d39157f9033c99cac3300c438f79b2f03dd90b8b169f3de7ec3638a84e8d67cf79aae1734c1661847c41ce39e797e78c41ce39e71b9eb3e79c73ce393f8df1eeee3c3c99dfb871e3c60d778027bb81c1d3108f8137c09361805fafd7ebe50cf0642fc7f90baefc05ae8127bb200cc3300cc3300c7d019e2cacc1d2c2d7f80e4f56836d940a8b0aaf72057832158f27cb577a50e3adbb8dbc32c45b9ac68b4075546e7d0479e5e86d68e40892b757b678bbb22efc9e4a54e7e5d627142a5fe5ad23e1c4cad1111acc58810b1343949042c60f61a40146ccbaac3b1a1229a898e18c32c84822d6458b234351337c81244b6ccba399dcd3e8ed9e456ffd75c5bf5eaf97ef78b257e8aed07178a5890f5dc793852a954aa552a9542a9527c093a96c7872aa962b473e3bce5772f8ec3a3c59468027b34dfe346290f1347e004f463333333333e33933336ee5678cc8f9ec06f064195b6b1d5b97622479eb399ecc7a0e4f36c3e39262f42e2f8027732d29f9effbfc731b1c9f9420fefbba7c2ec297bfeff32e465c0c8952860f667c454004e91044912c513e672d290560a98ccf8ee3c9b22b0cdd153a0e979c7ce8383c59e84f8038a40e8bad58e3adeb266fdde5b09ca8b75628f1d609e0c92c0f982bb64862f4850ca43354f6555c5e35448696219e142102838b98ca0a245ee503f0642abff1649fcc14242fe3304f268359ee62b1582ccf613966491b9e25258ccf07f8ec02f06439009ecc3a003c198b2726cac7b88d278bc1ac5f51347ee52bb759f9ca73e8ce0c9acd6630c4565ac04022c5880a5167d0105bb9ac3b0ce0614a900f4d28f94214934efcca2dabe68a1bbf71bc8eb71adcfc96495ec4f0d6ad63ed45106fdde5451b6fdd9ba2bc75d80f6f3de70b276f9d071834bcf50c3c9955b2f9ec72f37c96493cbf25d367158604d140859623a4901bf6d9733ebbcc2e973ee7333ebb87f98ce4850a9f1dd71d129c387a620b164f70e02196bbf0f2d9474f969b444fb66a61f1c5b7dc3d59eb8a2bbe5633bebadb54cfa9577cf9fa55a85a9d84b0562a5f7c5d55da82aaf25a5715098b295f957c2d632a41a97b52f9cae4140592114f841c694214832de921090e47a08e4843b6d1820e2c28bdc0a449ecc789335e68e2c469cb0e47310d908469218b1a48b43043ac03326c11028621d08882059867b965f90d4fc6c2366f5de6bcb5d6ddcb5b6b1d034f66a3fc8a0a0dbff20b3cd90a8b600b24b6f841081320e125b6f5ab545b5ee5b8eefcf0a28b228ab0020824c488a9a80c7995d7783215cd872ec1f8d05f9e2cb4e237eb73cde79ca79cf1f98aa3295a7c761a4f961d00478cace0128509b20011dbfabf4fcb7f8eebce0f112654f882c4ca134980119b62c57f3ee32e4f569b8e5e9701f4da653c99ced2e43d8fcb7bee30cfdb12c37b2b8f66f15c04cf47f0bc2d6abc177a940c0fc7bcf73c979e634fbfc78411199e5872a2e58729b12d8f784c9143152988a288a1e48d60082d47801822a20408cf65dd2180952e46618c38634a17b19cdfac2d26786bb744f1d6635c4e7eb3acfcaeb9c9b245cb119f25e9abb772ced9b3b33c59cee0bf2c39fce72b4ff6a93c99a7f4a0cb2a1ef4d09381788c2bdf7d37c6779dc370509dec9de7f0b8f09d065de723785de740c848c177449dcf20235dd739ae3b15681af2821a504c314512b1ee09308e601a6209223666886d7dd4754864d4f0dfe7da937d4a9ca8a82049156d2041436cebb73ab8ee2c00ea88054a583162458a989562e5ad839ecccebcb7e53dff3c9967061950a08a3461e20415dbfaeb572c5f9fc800c3c21a67b47002a258a5c2e5ab7b9eac7a1ee389ce93754405f894cb2edc95e7dc613838cfe19c470b329ed3e0b9223817a1eee018c77949aee8214c125fc66821c67539828d205e5072f4436cebe75c6e79f49cd46289e7b4407aeb96ea08e0ad739ecc62297eb3be7e75bde56b1652b85ec64928cd93dd3aab5f28ac7a8fbf77ece191b31a85455b1e5496879fbe55619eaaec904acb531597a7ae9a19a94af05b35d1f8ad52a9542ad556013d556dd5d053155197b04b7880df615418154685a1d3530fa1d01d4bc4120943a5704af91dee702ef91dee10e869b8c3a1a7e10e8d9e8658682cf4cd6fcd546fa6eba8d755f4d64f5a9eba864277aa5375d2da8c25bd750fbff5d65b033dd55b0f3dd55b1b3dd54e640e27619e823509d4f2492097a70e9ac104ce2f7e831b9cfd06959e3ab8045201ab804e4f5d6e10e829086ed0e829586df8aa0ddff8fbab425f15faaad0f77d1f14ba538b6ad1f799e145fefd4d30bf3f9ac3ef6f7ffb037afaed6fe8e9b73fa3a7df5155c1ab2a78fedbab42bc2ac4e3f2d43d33b27842b657e4799eb7bda1a71ed11699634b98a7f90b14bd99beb39687ca5c9e7a36a34bf73bcf27bf3365e177de39e7dcf4f4e9a9cb9d819ee69d879ee69d8d9ee62732c793304f3baad451a58e2a755dd741a13bb40aadd25179eaddacdbddeec2fcee7607f4b4dbddd0d36e77464fbb2323640e23c23c4d15a58a5245a9140ca9542a954aa5a80d1cb58193f9cd0971429c50d453e76694e3388ee33830320798304f319d613ac37486b1113cc1f88d37de1863bc31d053bcf1d053bcb1d1532cc626c6b6b7a7ed697bdab61db6bdedade88ffcdeb66ddb1bd0d36d6f434fb7bd193ddd8eaad06615dad696b4a7a71a754dc9d3ad699aa6695ad3d320648e194498bf4497e812dd7b6f9326f72e71857cf97d8bee254241e60013e6a9fd3267d65a5bc53a3d750b85ee4c23f466ba9d293dfd6d857cd06f2bb4ad96df765ba0a776dba1a7765ba3a7f6880332c796304f7dd72f402a14549410a1a2aaf4d46bad4dbff4558b4ce600239f8479fae569bd81a2559c9e3a8552850a4e181c9963fa9e609ee6cc27a81c2b4f7f53214f5d6e2a54f4546e0af4747e797a7f3a0a720157e6984ef7047a3a899eba9c7b1a353d8e51977b7af926f4f714f2d4e7ecca530f2277c8a7518feb0874c7c628453aa3cbd339c553199e7a0fea983ae5a1324858223f5da648b3969c7e7a65aa3b7648c70e31fdf49512bdedd04faf5f608802003f44f4c4df7bdd6d70e4dc0b850b4203f8ea164b2c88782bbb210ee10d7a57a19f9e3242abfcf4540d7a53a59f9e8a416f5af4d3392b7a53a19f9e51a037ada2f77cfae9190bbde7d24f0f85d0db4e0f93e83d897e7a4ed24602ae1f5c3f4c5aedd536cca5baec7da00e552b562b46c63543f3c2e086637041cd8b66c6e5624d0d1a6a72c9c4b4582b711caa412b55a8c1318320f0f332b009da8ea0b20d00001000ce35140001b8860400cbb96b25b17de725bdba7cc9f13501ebd72d40bd8e2854148c08a13a1d5f1205e932665dc6b0286b5783f6df2e9586c0786903082d82b4f8992509628c254c52f0c429d642112c4c4451a454c513398e50720414534e8085506c7a15a9687f26a5484c9fac15e81cb9837e90ba4294589014565ac4b4a7c0222266c4f420124b1326806229c82982b85822a647235e1dcc1fd8e7f8d2dc41f83a27e873fb38286e107ab208010f5ad0d337df32697c752e9fe795fac457e7f8bb31877a0f0facedf227fadccff3dec8dbc8436154c7ce8c6d391446d3c8e1a850c1185a7809e20c2c52670861830aba88410a2c29117362ee88e00db4600c309c7410a38b284cd842c41953c6a0b282239bf782de7269f7e4fc6bbaace3cb41a03a5b1e852082fd0f48e7a5b515797274b0919346912846441051020923240b5060258c2c2bb0a2822962b2056498c08526c04082880d3f424aa004172a5440256a8618754d745118f5cb3aa241a03b328d26113640756410aa2393908e3c15f234cba7214368d49c3db575f2d097bf8d8e2ac3effc44348db264041a4594c085295688512fa1eefc287132858921a63c61ba22461d04ea22d49fce41fd8963e8a39e0a734689ae0f825fc12dbe04edb474ce69355517da750d6397cba926e6f05058a54d246ca004aae354e2d4e924603c6e037ccd9138d5375002092a31f496549aaa8b505d47ea8be6d9e0575775a1bf70d9b3e9a9c8696ac152076977299ff0d244952b3720edd0c401f18211943596706143a787681780931c8690c2046c3001149b3ea3ea4e6512d5440bb03c3951464c8a31b028993df5108315b1f933a4c4192768a3852e4e6162d389cb42cfa7eb3eda75390383de3e17cb6dbb9a94a9ea3ef72b9658caea784ea7f94461d37dcb26292575b969f68abbcefece98a296a0949ee85153d3d19312d4d2964c33078205e56c9e973099c323ab36fadcaffe92863e7068daf2320928683651d8cc405afe0c75342a2f3ae905282f935e68f27b2a25bd40e4a7d2f4399d0b1307dfab9ef4964fb349e2e4179aa64f208cb52e61fa13964cae25adb44989e594538abe89b8473651100d6b5dbf4c6261889752c7c2aad0016a0952126c08a18035585881862448583065fe5c81961a982cb16105a02c341755ba3012840abafc3067a4d03f485421450a912884c8c1cb0938e420860e458a6062288b9f6ee9ce03a086e88d7c00944faf3b1c38628953123d54d1c2100fa2a44145d40d5d809c884dd7d35dd3652caf586fd7db273f4821a242840d439ec4ac4bdda4e56fad21496241035a26ad90f4b097492aa4e03bcf37fd2b9d7af9adfd55c1091955b24bbf7247e772d4be83fb3904f6b377a2106f02f8d93bca820adfd530df5930df5d36bed37297c71e079272da46f3ed1f24df79d20a6a7c4adcd2534ebf7f3e69052a5f9d73bca55fb79cd3effb41a56fce35df9b7bfef5e0c1b98cfbc01bb78c020905e0bdf77652dc9cffe0bc3ac779dd80ebc62d3de5d4eb077eb09472c4a317d85ead6adb768316608e4061610a131a2617199e7081881f8ea254224f299d19a23427a9d06426a9c0e4c83a4d1a6cc0b214a3a2018ac478e0a1489818156da2c4a6175b968089515136adc046095848418c8a758528f3046db4808d18152b111a0850324429d669b98a4174c620028a580a9e912d5c7049c45258ad21350e0133845114a3a2a402e7cd357b6772c78fecf4ab6bf132b4e79d27fa169dbd9bb4da4ec4dce7397e8f47cda2fceb44755ed8e9f30d923b587ffd0ac91df4afdf26b9a3fbebdc91dc21f3d7536a687f6d86b6477247ccdffc1d499ceb9a0cbd6fd04e05fdbd1e07dd0600c0e93ec02f298c73cd3bc0ae69196c82c2afae4b398e1d9da1d96ca6422c09d457771bbae3f4f96b52922a3ad521d0a5388ee39c03fa9cf434dfdc1e3df61bf4d893718e9fdbe836e5b66d567ffbc7fa2604370921c38bbb2725be3ad0dcba36da7c675d77f4db54faebda26ee9ed4ab83ebf5a630e92402e58d599a37a1012f25ce8cfdd014269db38ecaee1e5da39a3433b2d7af5208f40883708dea8d1565bda11bac3e70d0474e81fe504a71c041da50521067704d49314c31d2de0d5b5451d25060840479b9b284b959d39723be24316d3b4b731e3d41c24313979899bda850435dacb11d7961244b8a3544877e28c2a4739a7130183621506041166709a90d1ff0ec4b1246b65c3464085714866887d0d6a0195351d2cc0c252901ccec501228b8a3244f4ba89668120b2cfc86b1718612a6504584d4a62c524f82e0f2a40891254f3583828ba83aab62041e82028b2628aaccac704541160a0a214cb8a0276d183df9227405b4d4da3a1304a628d3232b7ec3a0c08001c668563ae7743d2907f6a99d03e0d2c9ba5369144e4614c582704980298aa5209160a04186205b17b1145845c4ea28690276fef9240a1f84625dcd5594590cb5308b753657514a59c11345b1eee62a4e23563cf114a3620e9358a769dbb77f9ee9882d40312ad6c0104b81ce39449db34a13e88d5d30964dd6359e236d30d599b5d64a61726c0d39d5a94ead95763ac5114397b9d051322838002b8b1b2af474090b8f8c322a702dc60d4aa9a5e3b67efd06a594e6305ae1105da622c56283524a73123d9d524aa997bb1491cee97dc4974ebea3486b28791fbac1f7d4a728c97839c677374f517ef19d56e994f6e9cb719b709bb414431eb4f4ee8ee2125afacfef0abc145f5fd1d2af28e5bb9401becbde07ea4dbbd6563aa77492a168e9aff9e27773ceeadccb97b556a97dfbe7b3103aa738bc69def7fdf674dc1efca764dbe8bcace1820e1c742acb0abaeb2284f6b2c66fd892199d8c13d75ee8e937668ac0f215428d519f2f041d83a4104b61d2092577dc97aee485c8539f93ceea4da73ee50e9b41123dbddbf2943bea4bbf1e05241a4b98b65c89018927c088499ca7dc413348a2a7dc313348a22b9678e20d636a357cbf6f0779ea4d74d55d57e8f912c98aa2971496d9d0d2bb36d400d3c6061526f4020dad851ada9bc28b960ebe448a72e237fe2e5abaf612294a092c5673081bbe448a4292452640ef58296fa8d08cc2e47736301cd57ad249079b93524a29054261734a4dd3348dee1ed64bbfb4b694e8aaf368dd6229474993a4862eeac89c538d270965cb2529a59455d64a11d064d3e0f2d3e5a44d48655c99dd1052972a26921a426638e7f44aa5e8c306263a75e649e91cd897936a4e3216dd49153091c14829082328c280c00c4a34218392a52432c4e6131a86ba0481d14318226c91c512332f5c9ea8129b2e45cb7da1a5735968177416d21907bd714cc751e44814494c4396b0428803ac28912183113438618acd2f4b80c05802060c1902d04489142858620a32b0c4a653d1030a93fef425521a427c6e41cb9c3ad38668ac84c492a1235b91e6665a0e7a33824da0c31d342b1a2be11d700b73880b1a1b5a1be12334562a5adad2d01b1316d2d98b293a95654b81a68219b4294068d512da093456da76d8a0f24ba4356e90e2286f5226b3b6ed25d21a3fbccd2ca35bda5a0fa159ae1a0d74f074d1fa7510a1b11226a2f112157a63da82d0f92592195eec604617cc447333cd0abd1989d2e10e9b1a1a2b6d3168ce8a664483aff5a0b577e180b958bac686470fedd25e5af01b96048f3b8f1f61178f52d3e3a6c73e891ebba01eff0caf668f6dd14f9f2dc805d4289963baac6bbcf0f287072a9820e2e58727a633622bb0803403115924d1014a6ccfa0973e872e60e5882e4ab024871b6070c1cb2c8d2d5830850b3fc44c40c442973276b0018ac4e2044d1491c40b617889edc91426a025a8644b188b8b9c558acd400200001316002028180c874462b1280ad23899fb148010799844624a9b09c44994c4308a41c8186308310400408c3180a486481d051c42f72e9b97777aa675d07bb058039a27f07c80e61f40663eb5c01bcfa62b4932ad27affd79ed1e93977248a50151abd099d09dd7e9337929474b9aa2c4a832a13a6c5ede2190462916763638c7838af196c9eafdfac78b831904320d64eeae36e84bc9a14d5c15cc3c94bd7adaa02fe9d1969c9ca454cb1c9412c4c9586cc9eddf779deb7c9dbdaed8eb842e2703e219e10456387f739e57cc330a2f591295a7e7a3755e77aa33a7b5c21a9425badb591f62b1a57daa14cf099b9053c4806c6ce070e970078be9f9fbb204750e35d31fc2624b72dcd736b59e1356825e0e781ef1ad8fb26e125165c242ce29684b58b0d852a959d1e8aa8f860286dbe771895969517bd979fca2656452206fb1a56ba1b247315aca01ec3c7e3130320541e743aaa24716679adaa52cb6d4fb2a26133ffda13f365b70b19cea56a14fc742d6adfb39cd0400a9584fd103451772140650d8229d2e8ce229a15ce17600749fd4a15538cae1d593c3461bebd5299aed74752e96829f7e7a586b85d2d39aaee8d6bd0bdeee722dd687a21d5804a434d8cf8ed65885101273522a8c3f242f819bc1414a82fcb121dfd7d5bb537340467fa152377fc7c384a7a818a51b44d9bb31a5dc8951abf2aacc5bb5a45ff87062f0446b45f00cea6e1041287bd151d384ecf957013c13b9cf7d78d126c2e91994286103f5f285269df2ba5ae7488822ca53025959a4da10f53162b8adb10998eb746264ab8892e01e3cf1849cefdccc701aa507b0dce03c77deb3b90e8e6fca71212569cb7810f9ef03ae0f15fd2cdeb9a0fa48d264ce39194c15f871e8998fda064f76351fce11d2df8b792089f829ff8a8b3f9306782e7d2ae13de6e5c199f4c5887e32228733c2240a8eaab3168d01058e339167c08e70e8a3c8e7c210762ba472a3772feb151d5f70700e431ab4c0f1c3e3eb99b61c3b980db67fe38073bd02e8d2f3985576f34fdd1bd0904470dd87a45d682f4266c082907c0714706be9a8ccb7f4b5c3465a0424be3b81a63c3bfbfc5464aa2ee4d451392c8c146a6349c7d6533e1d167dca461ac723d5a647dd8a9fffe7d207aeca964a40712b120d13d7293096a34fae9d663ce3e02e9c88b6776a89e93c8cbca79d882e7427d8b4f93c287c83240267bb59c6f75cc551a2d27df50d3a8e2cf44d9b2cfa6aaa4e5a674500a133d01a81e5d557d150724bb790b6a52d6191e172c14a7743b6afd009f90e3954029ad0d3e4a92737344048ee86a824df7cbdb7eb5a189eeaeec26f705ef2162444dc798375f12915794753949b07742f8b74edafa7468dd70ec067770488a245022d47f7b1b4133c1a86100456185d90d8c4dc00ffe0320edadff2f427145a97a308d993054248e4bc747e6bde8f0a7ef4302220bdac7fa4020a280b904ebcf39489020d1fd5072005a08cc7322c48211f36f83a77eec0122896b3a603b44b4e7c1deeda1bdbbe91d7070d57a7df28e9118ef5ca4d3d75ed01565626d42e21e1e975f6f5991fc271f83d5c80a37ba1f33dc5ce2cd08611892e7ea731d551500092972f5af989697ad5844d5d59daf8389d20bed31a71ea6990191fd18ab06eca8341e18a56e8459ec70b5779ce5ee31d8989c876628c4b361cea7bf6674610706723736b236c5ffedb0dba87029954b7041103e5c4c250921c2f69dfd238150f88f9e2c11223eb00d58ab4d24ae212b6d0709d9d1dfa23af46bce4e3232f6530d85d6905f1eca6b721435e327fc54bd97c679f24194440480095890037298d60dca8710db47526136347485cb5638a97a88a553d371e9572af521e23f0598135385a84fc776b04566323330df4026c38b0cc8528dbe854cc58aa127fdb91e9014ab30236471b56a90ef820fa1dd8fdae734f0f451db22c8e389a2b4563b94a81f25e1004616f4bbe963b0b34878176313c7f739c1598edeac516b279e34eff4c4178871eed82050d302ae91b3fa5f32633b676bd79ef0ff5e57e6c8333b736eaa889a665f626ac09ebf57ef68764e4fb559d5a99a8bf4ad0d137a9d9fe3fd97e1669efffb9961492cb9150cebf0a61f5551e26dae28d35a2fe117536b8d6de69be6a2fab33d0419f118f6049735c8525a323e5dacc97458248a220eff82b75e4aaa869cc9727f9d31f90b92b1a795f7be6722246313a3a7b00ed1f323099d800286b3ac2b4f7a9211e37270e28ef79128fc8f30e9afa44b8ab8504bde22d9bcf2e465b903e18f50da1ac540eca06dcdcdcf71485e2c1188c2bf538414be3869145344c6df565a07ebcaf26fe10609f5584812f7f85155892228bd0978d7f8fac1c1e1ecdb72bcad8d660ff8000a79049c3817f5170124b24cc62e8615e086e52176886191a98534ba8d2b8b4d9fde7af716461c91610bef069b538439dfa4f5fc2eb43dedcd4ff3f3c4b082dd08d460caa1c671bcaa1ae9814580e978e00af36555362fddf2443d488f30989d570bcbcf5d8809720700a30f9c6b3ad0fea718e39589a1020b4e598fb18e4343a5ae0f2c75c7f9e83f76869212d621104fd58148c9fa14ab52aab6718682ef04a88674422be0c493a1ac738cfe2f834f65f3f9866b7431f427087bd2fbc3ca3a0d7bc0805e2b624ada25416d5cfb342650697131e508d38255ad17b44f454527d74d3a11eab00aa601066ea04219378a0940b5b2c62bc0408ffcbd44e2cffd01a433695948ce4d89a406cbd22378d642f49d9974445d8c4a7e07c2737c73c01ecb3298a20e23a10558caa2a048a03614a4f990ccf8486eecaa35a232cdfdd6f7023139f7c9fa14a8b2b01092509a819557f6ae4b654b210161eb03891c2f20e12606c3bff6dba518836d37a8bf392a2fe222dbb48e6e84b6776daa06862186beb7b9381ae4f75351604f9be18b758fb33a76b65426a0438cffddbcce501a7e9763f0aa900cfe913d319210907e8dd555a5814fe75488fc470ed26d97e378c0dec66d8b13702f6d801894b83c8cd4a82e7b8d53a5dbd345111387d1d84f9a33dc4b3e60f338880e2da490718dfa1223cfd6264530266ddd4d67734c5bccedd33405b06617c5da9a348d25516688bc43bdc552e7398e43de7b880576d1eee3dae1fbb43f6f55948f1647b218831a248cc43285d2487c7907cca3803939ab68a3f0c3a24c0004c4e14bb1f126010c2fdfc1b5d0783e0a5c032bf8e1115a05e103b4adb7dae7027eddd56dc6b778e7fd680e80c41ffbd1849a418feb35dede74e2bbeb87a9ea300bef74cd2bae2842e168748bb3ab7eb833c88851f96493653b93f18f1643b0664aefa74da0d7b00b2e93a2c625e2b83517d1aa1878a7dc32bec06e630e371f145447829270d14643ba166440fc556464b82412a8dbc3e604357c65dd3791fc3d159a7bd422eb834ede92f006231336aa5b3e1af548f73c1dd87b05967033036d46474931e35e2c6d91e05e51af395b709cd7887ca01cadc45181ea485d02878ff414b0f2575f9a58a53ab7aa24beed1788ceee1c9f9eb8410c7b4078ece03aa25e09e854ac1fcfe0eb69be835a4d6c2b5faa58026c6fb5231b3e174ab28b18354bce2caff191a3c6f31961c65168db9bd707c2bd35a8bcacda2c56c0548d09b4b1926e9932ac871a2d1db0e51819896f110958898ba4f1d69fa2fb7b13c10019de14551fcae9f68edcfdbb5a0ed8373bdb862e5e22f5f63f2bac4a6ca86298ea028929d59c622cd6e92652e62e5062a81fc0a8b3486b561bb34e4efc307cf8b6d257726616a550435464e0c7930f8910ff073c66c7fa3548b81d10162cd03d4be8c288807b677a13ef973efe7fe04822475ee5ffe029c11cf1a120481b5464acd7a94d790d24fad82a405c5bea5be01ce76ca2223eb32bd649726540aacd9f268ec07b7e15e6da078871b5d447eabd1e9a731f77e983608f60b2d602729f20bd437ee1343337077db6c89c5120944402dc0579a866223f6c434e71f5323e11efb9bfdc53356a2947ed21dbf4eda3f7c9984583992b0d5409903e2f52ef821121ff47af76b60efbdb70d507c60e4ece1afd58964d472f67e3d74f6fd811df0484c9a670aecd83cd0f422988545e0b058d867c54e67c2bdb900560444b4c2a5bb36900dd01ad412b494ee04706467419a050aa09462fc21d344be0e7f252a03ec061cfb8fc021a805984b4110fdf594cde7b499a4004bc060b1cebfeb0fb5f7590190f69ea1cb74b07eeda6bdafa01e04474b22f1bec5eaf7aae9eb2386e81abb5ef4dbc5cccf2f11a3a1e668f1051b919aca21daf788c7d12fe61098af18739138c79ec7bc2aec59391d5b74aaeaeb958545a480fe270b6bff9a5cb9b65ff87885b60f52aeca3cf930a2d4d2566fc5e5c223438e057ac6b9b1280bb2b05e84af701545b88cfe31f86090319e03e204adfa93a122a64314a18fc3e16a07da163803bed49328607250d56d429b9eb74b701484a323fd8f96a4650142eab9e3c9e7f91bc465129ee059eee2ffbd16b58947578a7cbd0a18d90ea376631a0b821d91884724cf7914a270860cd146dc9b08b43845e694487cbcccda227aa8485d8175f3aecbecbb7973ef5bfa709655f0926ab519a763524bd73f8304e3c6c23837534d20e42d0ce178ba3d656fd401342c114733bdfec66460fd9fdd7f0fa54043c499eb21984a3ff348bebc61ee9d8155841d6334b012eb7a9f9c720b4cd29d9a58e8f1c94b8589ef245d52caa9127848a7cf63e47c465efa8ca4f58ce81f6684163d471c560b1f445a1434faa8308a04fe5112ab6d8a999b8d57bbc76e85af9875db6d6e10567cb1257fa6209e64311be1c329dc6dd947157d02d0ce666a6892564966bd4695ff245c71d41d99ad896c1534b2af8d1ec3662ffefed0bf58812d8f2d77f2d873788c4b1f2c6abc58ee7a2a63f91a65607e2dfe2db890283065284bbdda0d4a4fc7e83fda1249a663bc393d51c89ff96b77e64983bb05a2c90ac4492ced2ceb47c289132a7146754e3bf77a66cb157d5919be3f7d6cb8454499225cd0c40aaf1e86896a74837421ef76d57347a4348fdb0fcec3232886ca43165dfb3cc64abb77c2b7fc641256597f9a5eb10b1e9eb6645ad7fd0b2dda094b70123c01e3aa47b4d0764aae607551b32f82d631b68e08ad4ecaa7a8ca140883ae91864c4c66e98f37b1658d337e803b81e61513f8734d9b0fe4911e042437c4cbfc24b08798efc4af10c60c0d351c7dd342933253f4c57392477efff1feb6f3170aeff6ebc73942f7339115b9070bb9928a3c495a409f341b4c0edd5937012fabe63c7d7f59f6e6f4c32e23d135de6ee24498c804004eb8f4be17c41fbf531b758255ac0e3e901b70a3359b675a0a5b5c0d975e796d1037e39e647d5b9cbe4717b874fd455f9d00a71f31cd3c34acaf78b085ebed120643847dc5eaf16ef45df29198fddf88d3c6099dfade6604ac469105d5954a3e6d1f9c1b159eb16e6d9bb07047123116c538ae5354158d3fc370aa5a7b265b847030122fadde9b6708b8d8c971b9eae9119f5a3d708ff76938e990d3bcfba4016ed1d12b17db269ae17790974d30586015414127fd03b4ed13600863e7c6c60a3a27ad145787c0846e7b9b5cb7d7a187f3c6b3d64c6168c5e7a6269812908bfb20272ae45199eebe89230d629039ce472107b05952166af21a26c6fdf73b6e221c198d92adb97aba31332d382419ffee1441b2e860d50ed8e2bce552a08b0bb52c4716cd56f58ffd788fc916c3e43331917bfbe42e7043329fa7ffd6521a9ee3e6168ba73315b0eef8ff5ba6f616c89ee4fd57b3ef3586ec2ab25cb5849c4a01190e8488d7cbecb266f63265125d1c818922e845f506a1c5740ea37eca085dc2f189ac027a69c8c774490c8bc294cbd32425c5be44f58a669eedf1680a185c72d3825e2751400c54b357ee49dd5f748f157dded472f3706b9378703688787122897c7cfcffba3928576f9a50c55a96a030ca272137ce18f1ad0157777472e23c3d525309b747ea04b65940e08d8d2cb7acc34bf1a8a94fc7aca3676c299114ca1975f09a6849aedbb2434afdd3bcd5c3b880b27c0e9903bce431fd6b9da4355f97394bf662f6615c62e61ea6b5d97efaf16a9e815b6cb8aa94ccd4b8f9d4da6be2b810defad562a30042399fd0544ba0b353e27fce3d04cea4be286773d4dbad4811b86b89db52f95c8ac3a73367e065c37c9fc5c69b50dc0149c70746731f5e1e0e18a2a78c8e274a84f2308be168f94eb085125044d8f8fd8e0f1b4529fa482ecbdeb64921faca214478fe7b585bdadc57f2b2db9e5cbd7599034cec2f887fe27ac32f974392f8e90f603052cdca3723f2f46e2a18c785e469ffa82781516bbed57046a7b40ec006cd01c63e35b25c4eed3590f6507a7673d0a97038a8034904de1120d8b0cf184fa4964207d498ec5aa380a31a31c3abc8638246709b00d77b806dca64e5e7d79cab306b095bbd2e907957b19888d2db8325095f57ab6fc0083f1d5a5ce28fe8ac47924c9fd8a3d2f798850f61bf75b914772be34e939b498f133af7d656cd99671f430be670e6a03ebde389162dfae2d572d89717c1e6b0f4bf0ade3f0c9c87e9b260289960dce6ba35b9fd8eb32457d4dcc05e45db79685ea0803560796cfac1b2d732017a911d75f3ec1e0b030be3f46935248769e921644888307b7d9b08f9745280df931229994c8f31ff5c71112dfa920f736ff4072cac8a6ba771550358121eb34e4c3932dbfa16d51d0881c61a0a484c748d0cd0b01c9f0d4b8544eb176c741bab233a7216f504ae650fdc2907e7dcd4105491d3b3c17a1ad631d18ec2ec506d287436110d62c7b7b6b03c7aa8b731e6a8d3a96d565fd709d4c2684bd558c29f0bd28d0d016836b4b5a806b9eba7bf8c5b2a3a73ed23ae53e78f7b336f507b7a6e93a8e68305ecf7766749dbf974024c17a24d7cba7b554219dda0a2a694e0b6a9ff861c846183ea0c9b036ae24a50231ba644a35047d9f97133b29feef476131ec18dac3026f03ce8759aedb1a49b6c0c5c9ed98c0594d39cd1244b6d26d41dd19981b7d33e4126c97e26228c3a3ff7302cd53cd314c573b6a89cdc9487a7b10b618b82408b1fe778c27021e03cfdd5e4be4ba3a99ace7b37d06928e749b5c05a614173ee546c3342c37a9d1c04cb5fe887db0400be270952bd739d214bf6b317789dfbfc5154cafff61d2cb03c86fe302e8263a95da64d582fb17b8a1dcba7c6603f34025558e035b94acfd4cfd7377074f18c2da9786ff66965c11dee35e67b964971474e7776f9305fa47eb6850ff709b0854407a599ebf01d611b5834e31507eb2c8ba171fa82bbf9a8962ce5608a009f5825d2613cc6b4277fba88b83c01fbce483b92f722707790d85e50e81b647c96eb87e3f37f811938c86f6968436c2f064c41491120605641460e443382473e40d00ae41f4b381101e2c35b5e83bcb3fe0b533b2bbe331c78a94e038eb1996b8f16e79ae5ed3eee34fe0d70eb250c3e8f3784480821f37cdbd8fba71d34d0381d191105ccaf5b949c38ad588324ea3c7887d588504c7e3de39e472c445d90301c65a600cda254ca0d7d81192bee43e3ae5c4cc765e9476cec01ab81a0639d7b0d60cb0e321b0f332e6c4300d92022ee43744e4e47febda274959a31c63413afc28e3b124e21b43c2d945ff941307c239bfd5f142b05f3f1be5633257636ad5d7803aacd0c8518e6218086dbe35e364a12f3340f36700bedb90ecaabc6b6652fa959e389d6ed41079e63c9d59c3a0e8ae7cf5df0443f8f6f6d679108392042d9437782df70342af49b7f5e3bdb1b4b7c57a18c4ba7a805f0238d3019191ccced35d20e6303ebf86b7814d4f7da306d4cac6ccd286995184c0eb9f8228ac195c42c006704d7407ccd9bf33eff9dad7bbbb5a3d413d6a7b08f28a1a353820ce5ae01dbfc913212db2c79542cc89e2a974f880c2b4108822daf9c70451653700da210fc64842b3ba522199509d2d16e0cb3ec0a51340c5a2c8f6fa840614ff4e6b0eec71c237cfa44465d60750df6edb99f65df7f1327b69065caf3de2f15ff3ca5bbc388b868bd083c9dc03d4125b67d7cfe21f0cdbc0539d1d83e6436562fcbd413b8af409bed9f95199538eb830ec7d53e9c7fd25756fc80499310a012fb252322ccd0f576946b41790539be7c94ef83dd646d6b7020e36ddcad8909e6e37e97c7324cc70455e27d35173f85044f3d96d75551922c8db962e8375423103dcb204689920b956a08f2d01e2ae9584a3513d2c032fca27090a90e8da6e982426c0199a613f735f51d08c5ed3fffd89d6bf40a35501b75b443e9bfc2cbbef22a9f05c7a61fde37b18bb852ee0292739ab619340caac0b496eac3c1b277e63089fd012a9702e6352223df4d3721185b7e84eeb048d6e35cc0279f59a252ac57cf4bbb1cc5f31a7c19fb8facd8fa86126b68fea587b7a10f27234c9fb036e61786e8e15fa6a791a64d90c79e10f541ed7310652b6b75bdb8b196a26a0889074e9b7165323590ba95b5e6fbd9b784eaa97ad085453b88cb0f0f19ced07811cdce9c5fe79446b4803b0a181e08db53d3eba798872de7dec5da5bba4d09a7f5945931e2d96f26cd8c2178beb0dffa5f51a4a2f8e254218dd0486c0f49fb9344b962037386e7413a7dcd520c230ecd4e3e96406cfb9a20476fd184bdf8aafa79d7ba1875c6c4ebcb33640d364033b6b2f12ab6afe5913513fa64e15ea554b0538b657cf64476ff27387d1db30c5fda18fdcd2bb594da4e79861cb1df8979fd016ed3240ed00b72a1a682c38330d22aa1bbcd76bc92aa281bfcbb76961293ee668bf882540a10711db23358810995b962882166aa1c79cece2a0a42ea50715fe1c33b484640af20e5d9202774257147a3c5facf98daf31363860598f4fe56d59d2559658eccf8ccdcff0e66678faa9236dd6534b5b642d9ac1f64fc8f732e0999803a457a04b823d9591c632ddf15872714224c5ebe57f7215c0b62d9a96297d17a19cbce31b83b834c6115bc476169b5f5be4683fd7952f80d3bd28e6c43826f0f55fa4ceb2138ef0cfb95424f34126d089294c646f49b5164a5893f07afbd545e10a8497fd3035f0003b269ae2cc8a490aae3d570d2fb0e7bfe2e64ac9490b9158b06d7352be8d8c06c095c5e835c4b9214244691e8a9a7d24dd882042119616c33a996e47c07ad16d9046fa9f772f17717299dc9eb019e42c719351330ede2675fc7cafb44921748c80d51c47b3a7cb37dfbd9a8d33d205c169b482f371be51bf3c54a66364e210ac727f7ecc8c31970b1184a2903fb85906efdea56167a24d7d2e57e6b4571ec6441a09df633957146bd90460e8df7b7cf2b46ab5b32aeec19174d5f33f1af9f86f76b064d12d45765829453d993539136a972fe21a99c4c309d83ec9f79228382a6d5b37cd849e3c3ae9f54a479f98375b27b34a6536662b057a3cb3bea0f04993a3e00b25774878d135d1b18a92c4464324a87ecc14be1aaf73146ba7c4c4a5a00bcd552b0b204229efaeb835596c94b9992367ae1285c89daa74ea513a4db70d9740923211a7bf8016605e9e7718db13cdef5144609fb827715abb0d787ffe4e0079bb3ce79e61cb07f1ae973b03a4c9093513e4fe4804c83437109cbae66618eed9dac3a093d453345a5e8f9051d0328dd18aea29bf405a9a0fcdad863f3da4323a4652fc9311fcff7c2e04af7fafdca36cbdd0338fadc459e3ec0bd872d45cd1bbdddba1b5b161868db61d08dc44861b36286f566543e702f29192bedf93ac4b895ac96394ab1fbe3190a3125f7316991bb414a8477d8a590c2ba7c9a2ae7b30d376b6be196ec2933ae4e158eace2766956b18ee00f1bd892f321f33f182178c2925a1c6998a3bf14e68a4313b7bf9718916195d261d8562e555e0fcc69b280f9ec566f0fc89c3c575f4e5925bc430221b79655444d93df68f2e36c99343f109a34fedc297fa687f34dfcab1c4c1b09419a7d3163f18779e30c603578f44a9ca91273a938e5304d6e39219c93562cfbd50a3ae884c26d93e2bf718080fbb2a2ce4d057359d1414f0325c6dd2d89ebeb6c46fa7f136ff5df6a3c9f8b83b9df02b8dc580b9e2ebb4519467427f7137fc4f11d224bd22a24bfeb317939e22886a5aaa0ed1ec5c6d9183d4e5f53eb8550cb7a750f193eca0bd375746145e8ef778d698fec8369cc13162d75cdf7ab0ad34de00860a8b35e7cc7f55c3cd686114ae80b9387e9d37a960ad2ae122eddbb2a3c18e90e47c0227203ea26082da525d13928fceece8d52ce80edc806846935db041045cd1fa013e0a09d184b292c5983aa185437fea068b6acc1d94ff16515927629d2b6ab620a3bdb8400c2bbe8073558a469dd1b8b62b9acfd87418d23be7076f446e056b3cc3c332e3d712ca5f7b88c1120e068266f1b2d5d549ef0075fac3203df0a251a4b02d17ac6afce13301fa816f5dea58346471f9118a640ccceb98382590306718d15b9110c408001349981b77622a08ae40832eb6bd3116b8c6f120d75ad1f25f3e499cc090e27605800c922ddc84216ba7a5b078a33b95c20143dcd1ca55ecb90a1105ccc7cd0a6863a1223c9a55591cea5bec4d76d909d64cfdb80798ade1db399bd5413c11a8609efbdcab335615295ab42aa0f3a1c4ff4b8688fad040aad35347ada09ba310d8702624a826e76dca6a302d374f4d32437c6a94d5389c39bb3a74ddbdaae6d09d64830b2373a1696abb4f4b83e36adef818256f50a5e4586a4dc737ed661358e0f3992aca7281e3b677544b1a929abe8b594d74b5f8929da76a94d9692456d4face45c8209da8bedf474bb0a5a38c5b2512347c098eb6ac3d79267f7fa5d6428d0299f87dd93af2dcf6fac7d390ca2bc5c95331f11361b6a1a2ab057db5e4c2229b1abd41d7cdb524c8431253918324aadc8401b8cdf034e05d823580e9a859b370f71b04705cb1a6e22fc8fcef89c8299f16cf1a482357e165f300ed8b73418ac7cf5746fecfe2e270d666661b47018dd204e845e998afb6057c5fafdebd4bd4b2e6c7081c74be3eb228c0c3237c4e8e410a8d0c39b072266533fb187755fc437077ae3329b8149b9f8571472105fb93902b8962a85eb3beb3071bfc889c158e9b177d90083386ce1370d97b19b71a5cceb299cf4e4821dfb7d5d8a56de2e3ef534f3bf4ab5d2e8c75f9d770101ba1fb05e0cb35339db0d3898e3214f1fb568f5980ecd20d9c6a3e4bcce132b678de1282411d5a15fee61c96e548c43dd4d214e8126f13c6af70a3c1512ef009878cbbc87da9de99cfb8be8ec542817edc4b123ed4449c13a5970645deba8c3da73abb4d31e460a7b779157abd4fd452eaab07337f8bba3758c8d06de85b028fda338b6878ce28cef7788bf5071cc73038a79854d41745aeeb92199045feb9b55907bb35e0278d2e114afd7d80e09037739e31b267b4f60fb5fb642c8b7aa3e6519e11350b7f88d6fe24228155a663583f1dbf003ac7d5ed49eadef4d1ea5e7e3e650a7c98002f72716e0e9250ab0daa95e897f5d68644203971080a52b5569951d9c65831005972435b024a92aea509bd04d7628df0e1a112d202b507119c574142d1f0b3d0ab8f133efa062052bc884f3cbebea5ba6be371aed8071b45469cf7d16eb47cf658baccdbb8d0b98cd3bd363adcff423cf658b2718e7b1a481d20cbad1219342de06c034e84d979900951217a12c74f3127950d1191bc691e203bd3671caf2a545c3f83b36c877e1225b78b0b9af9ca7db2bd7745db70222c3cc23e7841ce76e2e670895aeac444890eb664e748323439bfb394b19ff2f5474a84d18abe39d76bb0bfff02e50fd1de0ec8ed319b6fc220dca1d0afa476dd352e8a89bd91a28d00903482ffff956f9a0a9234ba2e94112964270bc19d65eac27aa1b878985a29dd3e188d6fa319faafe50d094abde4868c74d12a04e3e31a8ed28426c6164b8bbe23f8d6725addcb4537f4f8d2db8a782f48eb7d76d7cb10ee1112f39f748ab23e7ce842b1b4f3ebc8649dd200f0e25d9edff9c18f81adf540c0047ab4640f91230505dbb0c0f8c12106b94a42e746f4afe06f9dceb85d9ccd6713b42185179e1e5807e9535ae37ec5d778c0f194c56f7b512a5006e62c64a21cfbb6e02647033d3f20fc8ab085dc27b5278b282f55aba691ac17f150c7f4b7fac5c15930ead19e732982916af9b8fa6fb0cd8a425af455929ab55bf52e9dd8f4b92add4ade0110f14ad64cf96a5fc85eabae43cb847921a7cd22801832d07f6c79b7b2339942fab66c626e1a6acbcb7083c86f20a4b19062f5e938e94ffd57d21955cb996a26ee0e00881b3bd59b6d01ee509350b4d0b9cd6a99660e8362d8fe6522bf872e5cccad89d4818181178cd296232c0a4d3474daa4422cd0a450a4f0c00f659388ae906e2040d9082201a922ee3512ad175a10cfba9fb9e6f62dc3c9881bb782d835ea66033a5c425aa60c389e489a24b6b48fab3c56e7042fe3f1a216b9860fc85f16ea136cba4a2d1482afbfe4fde90e20c2f583ac52105f5a39d89058feb96d4c960bcbad657118deba6985c5488e0125daf07f65d40279fdd1b547ee42ec13440c6894dabb0849516ac745b6f26ea0684a768a3a36aea299cd7d4c731ca57c4fccb874813912fa72be50b529a316fd6ea5e3c4544c702a533ac89d0ae20120433595fa81e912f83aac3b2f9911f7f00d3908d20f7832f8395355ec6a1ea09ea0192e183188d6adc80b4f122250690e3aca2547b0c4b3abf22b0408569ec74adc6dafad177a72fcd743146e8d39c4b5a17dec15c2bbd8e8394f8baa3007431038ec7cdeea981ca9b8f52e21ea288d227ff322b2965a1dd913ae74f1e8d54c90f7dbadb93a94c6d66637b31b94403c84e881d7ac421b854f027850396a13df8d00f58271452aec362534b4e0803a14313376e568731113b0a4cb1ac385aa8e4a0477b34f76152c908f4bffd71682b57d34877d2acb3183850d1ceb626e4cfea91909785341720df031c32c9e9b2c98d65250a4338c9b2d41c8f0a9c15bb1350e2ef876a1bc5bc98203ca7885d7beb0e2f3bd16b246326c948063f572bd8d71995a1ecf568dcf59cee6aa1ecb23a24282c2cc3f4945940127554074f084523021e04cf52c5e4c356678a7adc8819ecaf1bf98870470dbd74dfc22e289fb878c73c16a6af0b7405a10d72175444aba64b6d0e30b77206a21b2eed94600b4ad819c1c5a56ca6150232aff0d154e809d8999ac2a50ff475144385d0b57d7437f006a8af30bb3593a3e3709eb941bc5fcbb58004c90e0ae99dfc0071c3a115e6fcecedd1314cc1068ae1d4d757fb7fc008512238974a1a751f982dc877ff790d03c2a8ac7effaa50f0546e81733d2b8c316c42d051c11940e12b6fe4b4b2a4cba594e4e89ec10971105b00d019fe2583e09164fb451ce895c7fe1f1c29592f9389dc180105763c43e7a0bf10bc927266dfad1631dfddac4616123d2b4bbb82cd2b5035e637882e4aaa2e24911d98caf078e1cdef6622f778b9c464d6e13e17f1391e6ea0f27299b029e99d275e4c8e1a818df0435eed999a6b663a8150f829f20dbd6012b5ac246b44db30c039da46d629a45934efc4c30ab950a1b76c4cfa3562303845950766d4e9e000d44811c1e3457bc489c9802f3e6230d519c5f9b19a8fca97a44a01c487db3a62681938c2c993e4fbb0a62ad6debbbe3b77b4725a3ff74bd874f90719a9cb89537176722d5be2c6b8115cc75c5c8319622a4316f2afb55f652a12e3c82a716406b43d5427bf15e20b7d0bff022e46804e695d2340168949ad54ed5f888591900eb1b308b1ec6ac86531a2b6f258d319113cb6bf3f2c4c22f9798b050cecbfd238a13b7bca0b5ea83a2c9701f6c9a7fff8b6d175cc86aac3f4b9585c4ebc0e8075253462ac0c3ce7ab07cf786186ed336246c6f5829ad69f8bb5a945bc01b90e41bb3cf874813f3ab16a4264ae655f239faa8ba7fa99406b9e41abe318f4cd4ad64e1351f6fbe43c51297be3b4ad6e6b1fbcb9ee601d497523bba5654d06f8649cafb84a08ae486d8459b22664efab42ff221aec2ab76bd5d17ccf7b5618e4dbe539e1ac7ac3810dfcace4ebf07d10439a71ed9d1cf99ab407260d53a10e0df4dc5fb2877ec18a1d73ea1ac6b4965465f63aa7c087133ee9eb04e74d0a0427eaa5610994f1b463a17015a4b6fe5aa88487a28f55d739c3b3a0ae4dc7ac05ba0e4f4aa0cc29747d94ae2968edd7c7bc676e7f937ad523ecce5167a19c42a536d13647a911af548d77a02624e7d898045db0a5a2e27100c427f460f11ddbf1c82732e7e0d1af26141c6563e7c575a3150293cbfc9886aa9920fa25083fe42ae92b173f2a5f5d4ff8ffb94e3485f6ea042f4294ca0b9e981c5e39a1734118a9bdf55fb7558e03836daecb762c52c88f3707cc35e1384e2c144fcef8602858950a17a537a81e0bd515b37bb87e411d8f6299fc3edf8f4366c67d17e07b3d823c6d0c7aefbe26ad4ac410b090473536ce75737529054fa2d537c6b06203e5e33a971811f4fe5ca49a902e69fe582ff6c96dc822302a823b9670eaf54595eb8deaef9866542446e818d06c6bf8ce5493516a02d72b6cf98e0193cfd1ddd7308f0fce41d2f33fd8b6d8ecbd9ca169d054c4b6fde71c8b7bcaacdb4a683b8c849fdd653851901d729fde10e11c28f50049c65d28a855f472056ec302b1de0f38cb16484b22abfb0a2a1990916520ab13a9c33a7f353e508f505f3ff93ef96ebad8514efb1caa349096f69634c5b2effd8c03fb0727bf568f83b7152836c0d95f2c8e885c5b8d37e17a12fc328f31c0532d75e94d9ba708412a4942686365bf5bd4e901a53006b0da8784c54038ebdeea433446c3b76c8d2b0900f6239f53d7f82395682550e3e23aa12d2e21723bce84496c17078a557cd8dc6950a8fc50fb04f91efe2eff7c821f0b3d18484b6e8c4e05e7ac420e88d812c4f2e534240248862436f26bf8c3da48e4a61c433ec8954f96799520f1130e5f622371626af72bf4a7c748e7e3f5e962f5a148293a0b36a8a260d0f7e366afe057dfa98f6ebaf41758122a9ef60643f491546935f0995df01664c07d03450751c66770c8918c0515ec4ceb60e918e07a500ddd42182da4d7a09c3667846dc9d1c9e979cd2ed77f6d1b87e37d512536a292a3eef76a43fdb1caca47460c04e129d8b7a6b2f3a189c23f15f0777685e5fd9a48549d8581b634c861d0458b3ca3159e2e6126d835a15f92db8db7d73a53885412a0f23be695ac6124b47e9f49eea942120137c2720c30e02bfa63c57d49d3f6fab1b0b05e6abeea8b9cb7f1a6d7119a88d45a8d84693dd4bd71d86bbbc63e16c8d22b2f7ab55de032c454fee2503549011da30ac194e9b47944a228e66ad735ea482ea54a4534d1a45003ad30a39bb2d4257d6a293b6d41cc594fcad31763feb56185be30f640499011f022cd8def44d48a4f567a8e88c6209a4f0f9d9cbcd355d45c74bd82e4f75e67ab68f51921bebc9c0eb207e8b1042285444c4ba73676b9bfd0dd0cc55efe5afc614f9de8d780173ce562c27f790bb41ca435f4505d64db25b77bbbf0b0272c5f005a87cf9743dde2b225bc3218952f2997a2684fdf01a8ffcb8edcd49e8960561607a9f3a7678dbb20880e3276b5983081ee3e0376daaf3008e04b69b0765dfd63f09bb8b94070e0ea1a06b30e6a76f8002cf322ed6fae13a747008a3a4be36288d41d4f5c42f09f84a2bde83418407af5196d0c7aab373f38033a6df588bb252875192b838799b65d9a45b364e2de70d9c9d7e6a9bbae4424515b4f439fd580871285a4e8577198fc388e6ee21492bc342597e10ac365741b17238a3b41bdd603034c38c93dc146a0b07d3609b041cc337064f2459361c60a878e4267091a6038fb8f888dfb9056c32b653d82d942cdb25c5f7a5c3ab3ca2b757393f329919ec952b754a2cf580bf59712e468a905f1c8c7d0563acb382390c367c47625bddcec6f168b21dda368cd4d20186585c4aebbe515d879903bb2d44787b7d47d2f5506b19dabd0a6453bbf3668c9d348b4460c0b01e48313babc46a34953864ad6b0e7bd219e50b76dcd4473116bbc7d2a0485421fc267a617b1818c6c9697422388c21b01dd29da626d10d8fdbb2dc3cd9c7664ded8ac223156ec514065bab9416c0f3645d236b58dda819f20870c501067fac8fdc719dafa8e4bb3f23f8e01389e0fe771cf8d2ada622368eeecce773a493f9857bd97cc81d7544c455a4fb2b93a8425d323150178bf6675224ccc694ee4bc73de85282bcc3a84911dd41912d7a4a8c6073afcd0bc124b4d143c808bc34a090a848b2fa03bc41273cd2237c8af8c5b84eb1c0e3dde24ef54d8aae40b2b7c2ad2a73cabed96c325dc8a59facd4d20ce65dd9dae51408e70a26c1f13bca2c74646033efb28376fa9a0e861ca1e0c25de90d75cd3a63803be27c8e61624efa37649fcf592c8e99adbfb071beddbbc89b7d17fc1fe17817eb5bb7bfbed51362e62e6770b0702bf5e9fe142926b6d7f46a4189943460a83731f7e3e9fbd2946a23118a74a11508ad6331f5a558c66ddcb89e80c6ab4dbf0701e2f991de814737c2ee4e9e70e1f9a3087273a68503d64fcd900f9b9fd44bd19bdc34e664f3b0d7983ca3db701602c1dc2eab06b7bf24943a0c48e96b13a898a77540832ab875649455c65ea9185ebccaacc45699eac5828e03963a6d3109bcfad5f1e504e10b2495f5778b82d8538ac671d75a56818adf76cb1e394088a0d72e00bcd1a10bb1ec7e73d983e282b8bc0b0e65ff63dae8f1f92e9b2b142aa12d5b0872a2c84051f50b516361e55607ffbe69a539e63bd6af84d604c0aa4e9082111de72af4c461e09c737944e1aa32431fe83432fcff74fd785cc19c6cf70ffedb4f3bedcdc4a75e2d85e851619ef09e3f53f99d986512f75aefb593b1dc92789311742204c264e6002b49a61ba874de0c30185f5b88f8b79981b3cc33e8e93f535127131bc8bb78979ea6dcce390a8b6f8abf997e7a98d19a0dd1d6752a870b66a9baa55145fcb90cb7d4730891f80d6d7b73bf1aaeb8f7438feea4bf2bdc362abca7b59c0ff420d2e7ca613b1619ff63ad5858cbab84b3f45f0a31f0e2d43625982b3640021e4495310ea891b8b20d2ccade27a1269685441e51f4ed7132062ea4033e21b69169730086eae387def170531a2cfdd5c8f331a61565e6ecc31ec86e929f639c948950d4152138772fdd9225bc86c98efc327e1ed7d9aab290667179a1ed343185da9fa45885c428f79a631069d8f8c9e44da59649e702abc17d7958da2f33cff93b584a782e7928878616fd575968766c5a1542a083134cb909f23baea326a7a1e15713ea7733beb3968958969b2752217e5eb3760a9152b2c2f37784444a5095996947e095886d9794b64fce15c4bb03311f10a8f142fba566ee6402a7984d770f57c16ba5a2e4acade711469735543fff5984c90708108f46e1069587ce5f5a4fc409804a9be140ab566343f44f7e2e20db9427df742f6cc09fd4a5fa66148e50fb1a34ad399973e06e9cd8c6a02007289cbacbb076583f40938df10ff707194b4f7f1ef00bc4337a4e1a19bfdc61936b28b941d99298b99bca120732249fcb5852328b711394b3300b21ea05910dde18f53853e105a127f79da2ba32e2f4c909bbe959f3d6e73c3a311889cc1771fdee0284bf2bbb3fd9155490582abdb7f9032a14c66ffa99952c91996be92931ca8dd8cdc40cfaa3064aa52e8a896c1dcddce07d354640c74a829335d53377ff0b33cbb8509c1a8687cff9668d384ef64841b60a00cd1254b2ce6d0bacd1f4be18fabc3b0e470ab3c1f27a0e7c36d7a3e0aabe72392bc9704406eaa359b1df9ec5d24bcf71f421f82605cbac1e39dd170a4e06c8c992b422d600f5350c73e0299047cb6830f943ce9263250841db1371d257dd03690c148c8d81ccfc5ff7067e2545888bc397e3dd154269989911645bc78592014f1281ff04fd6721d33161bc7e66f0c19e79673b20e92e7ee3b8478e041230b5bd4e95909962c7d722db19facc0ca02d4aecf6443789848526139d92bb5aa290c969eac9f010a32b0a4a9a6edb230b186910bf91cf2a9e7c125fb8b6d855afa314453f6680cc556578f765739ea87f7baf82ba6c2cc93613392cf105803332c4894c06fc604e9ab6a111035fc63b34d394e0d8c016ee83d9e7eaf118c10fd2e89ad7a028cde0aad4302308a9319087639353f169a87aaf23ad2a89da2815bbc14bd27631de0525350996ec188c8032084e9588fe7d5de97bf30b1d0c337f8d0831dcec0028575c78154b4c45965d13e6165fe71baba2822655fa83b075ee76264dd86b2633764655c848cc030ff3faa251c1a25080c8a43d629ee32cc9e8347038536e6c7c1d4cc18c7dd4eb1c0b241aad6b5da0e150a8d59a200f133fa812ad6456c35745961ad6962906b777d91a65bd6deea73c564d88a806560328055cb0cc736450be61431486b3c5d39f544e8b902f02acdc22912091b8c7731c455a68a309d28adfc60d060e56a9fbfdd3d22a4d6bf6b911283bf7d29907d4fda13c0dabf289c8d27ed89c0df5c14ce96772d44e06f5d1e60cbbb56e460b62e0f62df432b72b0f6f9946d104a51a29ec69f7c827bfe44f394647b3ec123cf6ca1bfa1872da39be2a534c92eda2f8911ce4950061be58d2043e4601718787a7748d515a1e224cde0b2a7c04036a749d99a6cbe382371ac13ac0bb244d56f1a0627770f2fd844115976a92d61e35d286b2c559bf1650e6117a48c5195d4f4f4e64b2ce11a6da68e23e6aa2ae34c1330561541398b0901d98615d12f4efd503cc54ff57c289c54254bd3d8ebacc9e56a3be1726e98aa2d5411f040bbff7dd2604dd565fc3ab968418a1f00bce1ee45710e0f35ce3f6a5779e10aea3cd1ac601bc60f9e55e73fae9d1d33edcdb01c57a2e6e817de729e149a3f2e37a046b5a22bafa00af32a03a8bf4195d69104aafc5f784ba29a59e44d27739510fe90c551043047f5c7df28b408e727db699bbda1ddda921b342a07b2cca676360f0a01f4e3c1700b6e5f1b0a00de55ef7a6afa0359063880b5e881f820cfcfbb9cc0661c76d173e3ab0b4e44324c1a33b08e7fcb75e41e0051399cac6f96fa8d9122322385f34401379f5c9ad83b3cff1af0e475c0a9a7800a79695021e96fdb58b387754075583d32babc0fd6e72723f7d3fe9bfa8f8fcb3f49a1a08debf293ffaee4e90487d87652cd129c52aec8b42908e7488d6fdb4b46adc14738e6b78b87a7d7f30000e9c51df08150121846838dc36c6188f5c3471aab7fe9547d5156f0e4abd78d1dde215c02016d0b019e3d3c735184cfbe45256ead43aba379658cc1f5cc468f4ef38ac47654fd62931225165c33a934688d7695546da715ade6b0b957f45c46c428bdd7bce879c53aea11489b55e8a762a12404d2e366de6806dcd68c0e0f99dddcc72020abfeb4907e7f2090bcf25a7d52a6912d185d2fd54fe6a7f20f869a057a49afc607aa0cb9cd05eb8b1a76d77f37049991d74623d915f555dacba5f5497058b6a36720be3ce049da86c63a800a8662a76a11d030f66c4c3a2a5658a32a7017743997a0f15bd9056e9f11a13bff32492093bd7b05624ec2f56aeae4b304c4e7b7a1ce39bd2cde9cf9856ff165b496b844c97e77ec178db5eeb08205972569a6cb09a39c9bcd88d084adfeaa50a7c8f39533d50b688cc566482a0a8813c9b2ede3c0d7d6a3e164a478541c782f33a2f8283321fcb8000b397664ec3b881f4b06f54f01d39f21d71fba416c882571f1a64fe5d9776a4e976a5f2667c7bac24239875352c8766658e6289214b0d9508e11d549fcd6fcfad569da672ef7e20e7b3e6a505dbfa4d1806c105f524a7e0db5eb61927b9d4fa37d15138c6486198fbc7b0c7d4180dfcfb284041c46465fcc8702060fe3c863643b1710ece773cc6b41f0e65de56f7a9eec5ae522a9f1ffe0167916703239033f3ba83b9260e75669d7d6e4415b3bb1de22ff2e37bd88ee43c4238a6b9f2336093682528390b4c37f3f41ef4952d8ddcf6b88129fe15e66cd67124f7a77fa3b023fcbac08e1607d2a06f7bb630b961b4de4286b6da44090294720a402f86f093bfa79967785c9cb1338d745fc33cb1a747dcd3f6e884f52191df8daf28a6e5766cd7dab025d9f222bf4dd1b893596a60aaf4f4605825dca03fd70ea06dc33407a9830643e74a22155d70f977f1cce890c0cf1837b46134330565f423869717c1ff5a6e0ed56af7340acf96b69833f606d94f95802ef9f2321d1ddcb6080f2352227cdeff7dcdbf67eca40438b1139e5c23f5970f43dbac32781eaf6272f87d21c91420ca5d61a1dec183c015f2e84ea8b0b5805ad11471030c75113195bf9274496a377e587fb21e7539340c7d78f43c598f07928f2aec25053abb91f89ab3a105c361c714423a8dd835afb9887ca88df0e8e8dc5fea47b057dc86c6298db417027c3ac5fbf0e749846a20e5dd921e96705d43eeccb5f9377e9192b8b30e7f5798b312ef984028e6c80e4fbf870b7bf7e3dac782aa3e00de7ce3abc37c659e2bec52e71ca7dc632b1aff37e21368595682fce9347b4d7735aa047b447b3d3b03586b6ebfb04690e1188c7900e7909cdae35096b19ed257d2221110080d1f31d66621165a5493ddc547075a19a764bc3125c5ce7cc56311007172121456e5f1a23022e4267b0a7a70165a70ffe22473dad9799785a761d8cd56e6dd1ba5a96a5a9e20253941cc4ee9d2be9ec70615f2bea179677d36e2b3257adf1f7295269c88d6cba4ee12adbef7c4d0d1a724340e581cd44dba771fdee84e1d6e1c45401fdff70423bb7cf247c81d2ad56c1a2ead0e817387bf6cbd220dd53c520563697eed725dc553d561e88fc9e41be3ec9015501ba0b556f19cd8c66bb5742d06a816b8d9bff8b3137a9842abfc44a308cdb8845ed17299c4ef8a7b3246787359932fb5e702315883de4e32ba8cae4ad0da16f1e7b80c3d14744f49eef4003278685e2b4298c0f51b5a927d2bd0bf8357dc89340a4ef6e7288f79dba47da887c0838967cdd6e8ddbbdc4ef49e45b2a08f06fcc3b897c686d9bb5ee09fc7e1fab50a3c81727c6c9ab85abb4bafb7aaf00a5688d710aa10649ef8becb1ba245245a4351691ff9b44e67eb2389d1e2b2ecdb5fc28f21e91c6b47bb78c3c3b05382d11a6da3f8ccaf9c0e65e0682b4cd2473fcae890996e1d29323de8e4ef761e499a804824f748a9a55f708ce91c7184bf19d55dd6ac9ca4a0aff16d735879f70395785dceb0c6a37cfe52c3af63b851ece8db3100e056e2bdef913f304da19cc81a07c0b9b002f480e45a65236d5e6f4dadf81fa35e375759de38a6d2e47ebe42ecfbdb47980d6c8fd50cbdf93dffc50d5255ddba1fe823ca9d1759dec750076fe8008cda190a4280bc7cfd16d6b0fa1b922c8e54c6eafb2ae7a62f6cdbceeb5c89ec98a83972bafad3b0a1acb61dbb842bb20820b48a584815470c3d8732b70a6f012df80b3c5ca1555040b5a90ca68d23fe3cd3c94eb75f4dca787ee135295446b02924170ccac1ea045fe960f4316e185b41fc302aad2bf484a856d60b43fce97829aa8f937f780c0fee498a2dac746e4b33a9cf65d43c8af81d6cf34716e503df513266dbde823148cd89e6366ad2fd036045830241c94da7a4e3c71c4062cfe03121d728671e8be2f7484967b7708cb5d11089febda8fd673bf0fa47cbafb9b7d068115308a86bb6d9665f49d05557517d594e98754fc51fb432aa7a42c2f29887866dde932671e343e69fcd97d4b1ecafeedba8a3fa4f2a2fb6078e344c4d357c1da1a11070210638193e160c334d13fb7ec552d34efbc0b1acd6c1a6ad0ccfc250111ee611434637ac3ded499695da2c7bc32749b1c7f7b534749a54aa640d0c4be8a462d5ddc673f5c0256d452c4862bd29b7c7b8c6a9d88396a776cff248b431fb7c5c843b45685d9dcee7d109d21fd2817072cc699d05ef6f2eb109a15126af1967b2bb6aba8cbde4062af17b999402f8bdb98b6e2a7c73829b64662a84bb5033f2d3e8da0549733ab53b29a47b2e02824092499bcfe910f454c01162bd8fbf6ea1e720f8821c8f286ab36e939231b69556725fe5218612fa122bf0c6e47fc1895cd09aa0337cb3dc0eb650cfb1173b903332ea7bf993b7c6e278b3cd8aa087370e96fb8352f1585fdfd1e21999fd74582a9df815307e860e62a5a288c09c8bbb6fc28074ed58052da76f2cfbdb3797a2b6a5875e0d48c63a338303862ded71a946cf94afee22d66eb182c823091a6d97ee584d38153f6e20961f7c61d32987371e920ba329ce9b590583669b3cd5961761d2a2b074e59c95aaed954d24decc74953f3c37301cc68b6034fe787b03159cdacd0dae0071e5fa4f157c98a0e9c5a8428cb78b34dbceeb1237eeb7a7cec7da6e5aeb4ddc4bebbbdd00642748b6e3cca36a3e6957730c940296505c7d69fa24ef21f9857a69312d75e7d58b5b38295fe40dcbc1c39dd201f46685772d4db0a9d326e299a6b858efaa3f84206976808804def68515b68d4aed5dcbbca2ff632a93f8f30a933aba53b1c73ae53257162a920fd55492e6c663c4aa1457c6fa1eef45398d4f9f83f87c7bbbbf5bddc321758308f744072168239110f8c5567164437dfb774069bd4d94c0ae3a44e8a255a1dfe4f0d1840c97003190e046ff540ca53753e5b57e7dba54ebe55fd6f7ed284bb5dea3b84389d99e3c6f422f379cdb36b2ad8c9189321a34949a96e1b5613ded453ea5e22cdb0a895ad624addbe1ac6c5ead34529a0f3e91ddb916c2c380f427c3b676eea79b5b6725317fe121fc77a252b9527a59e7b67e584ce0be4b40d4929eb3ffda74c68e6fecfe0b860ab7030c7d0a6e219494de1392a1ca79472ca0d629a4d2915565a4a2944ed511dab80d1471440d5a5cb3829b54c9ff879919a94f27df85427163fa32f70592928ff1b44f43076510ad82669607389180fedc23da313b2f45b2fc1a3d975d3cf410a6747024204803093290a508f2c4429902e29ee06940d60b289ec383ee46950ef4a83a8a7fd927da3946dbdfed302ea35750aa5710282d265991edaaf5ac26526af2d3690990d8442602ca7232f4108ca96526112245825d02cc946316d7438e6aadb9d816d15b0f73e967e6270c0fa484836dcf53ec836a237eed2e7873ade491f9a3ad10272a5f4dbe9ee6362bb4f2cebd2b6c8db862f323a78cc81f00460c60ac720928270158f24dcae63cb695864ad247d4d428f39916128c0141b09930242e75975652c28b70f016929dee4b1891f19082afc0414d7d1cfcda8297303a4092b1a1094684ba4800fe8543f3e077a26f03307bfdde8c6cfa3e27e53a81e259799ec0d216ed93ab08a760df0ee50146b6a674ce05d0b015c5a0a15c0324c6aaea60b1019ac38f3ee8bbe73816027bfffbb6830cdaab1956aac39edce5004a8bc2628c9bac81fc52f52010261afc174095e2acd3c7edaf4f498e6318daa234ff33007fa93a02142a5d1e9102a3c634e4fb9ea955e4844806fbc6d3e440ea1b72ee3212885049fe01b16fc268dae0845de8f5cdd6d8640881e8d4ef4d0513505b7e1cb146bc6129f033a51a08fd780da05b1c299e4fcfc91dbfab50e70801c91711cd311fe521a8874304c29ebe4a7f7bebb3a9941b90f5203207ddf1a0cd7b45ac2bdd876a7302d86abbb30e62326bb26c6c45108c78cd308fcc74b4a006dc3c791653da777d74e3a96a532c825fdfebd35ef96c27e3776749d8b30abc82f2fdefb5a2bcdb9750dda02a95ae08e1668d059e0667a306ae466c50a35b2f6939d4ecd42c3e669eadba84c21e5800e536c7c9015749144a60743c2021ba298869d8ff102ddf21328bf4ff488e8a4ebba6437a4fb71412166255a490f1123d33d44acfd360ffb899923c91b52d89452f91a31cf9d6807538d926c4ab3d27f4c6938dfc2ebd9572839e117f08f954c4fcd07d9bbc2382895c27a5e8a908992655f28b935d8570f73ccb792ffe7d5831597ffdb90d64912b0b7820848614eaaa4914b576ca209c93894bef3ceac0453ef5a0718a2238f9d81f4011848a554fc64ab1d0cb59a8be051c2323fe1f4255821edde536b40d67876ec9af7aba844b112816c656081d96ecbfa28818187e8daaadd4388a54d12cb20788932169782ad4998aca484a773f04ad8fded56fe949c006e380ace61e0bab5f3d6eaafe841e0e8b62f3d79e0b686943820e5b2e9a6be1b65add760af588d03dd08caf34561bb33124a3d23b0021a3958d14863a5919177eb56d0f31b5b0820133cae19aa851b552473fb5eed03b03659b176a36512ccd43d65236d899b745a8c09dd937aaf272193b6a16446601c66f5d6fb3d2214758b67ed5f674e904ad2cac0b5baa20359b62a3f367e5391b9ea361f73e747ccc86606b4d9c13fcb5ae74682cd90ca77315cffa5ee70c893f45adf5cf480722b387a74573ffc3d00d6ced8929f145aae22c5681708032e8565dc2a24c0dffeb331d785602aec5146ad84c2c7e89237fe3d51c71974dacea5e4cd3a56553b57c3573ba75b9b947354e7871b7fbad7e8ce7306d1dfe95eb9373bc8519468ed43d184ec5409356e2ad150c0a117fdeef577412eabcdcf566016df5a51c6eeb47743b89e4c5e450e0025b2cf15c9ded014f23b8c552bd8193fcf416e4f22c76db345b0307ffbd9d822300f87a0a69c5f0d4c4b50cbd1420496cd118ede83d463113588ee68f99a7dd230c97a9a1f78088e570166102db4c8dcd73c5da26fa409ce757bae8228c42745f36d18f7316ffd68b2e032475679d8ba8c1e2b6bbae7e4f1f8a32c7c5e4db4b2c7613f01d68d9a0b07f5262c87974dd39ef1949fe72b4fd2a7f183e33464add44b2a1b42a79272b5c0dd649bfd1eb4ac031959a64329be849e279b71dd44499cf331b755d90c6814ca1b3308a241f959096888fc0c74b93505af2f54084770e65c20f83dad57ba49309fd879301449bfe827ca20ec18f91379fe5c150314d19b4dac0956bbef57d1975dd936929e9af00603f13f7100bfb19ffd765c888728027ab2a7917d3e27af62e526b36432720843207db0484d82aa8a28bb6c93261fd3a043859fe46ae338ceff7144e93899745f523e650d8557e2852f334e5ecad710697f5fbe916365bcd0c595997a86ff7b880c796ea065ba7c3019215d13ff800a0d234b5b260cd49b7879bb4db076cca80d8b90505d5dd123355db4b3afefc6843615965bd08a0d349c7025995ca458477aaab7081c869ba972a406f96b8aa5c0a752d38ab48d38730f98109e4ecc1a8d02efddd5ce97b8856c916daa971ff4da0f6521b46c394ff43230d75a98ca029c2d33e189986e56fdc6fac3a9c6af080ab09a86b1888711bb6997b008d9442ddf839840855ea7f9128ce3e445a9fc3ae93c5ef7ea25feb5112d6b34816185b78a15a990633f2687a5c412aa4834c5ed37c3c938bc13dd86f3d16365fba7e5456371bdfb9049c53a6f5e430ddcf7009d51b9566fe6a94d99f7d428c576947a400078de21ffe3843017ca8ccd80c7d4da0e26a821b43c8b07c6b8288df53c337e2e21f60401cc14e31dd55507e58ae0a5b780bc4cdcd161c122d5a7282ac2714f39329011d4b29510132d4aa0ba4192c8f0c4ae909068261064547c709d265adde300cee556376f12b2705558d0842dd41c7538fc35f53835a60c818864c0507bb5237a855a29188100016c730c53574bb74e0fd7253c162d4dd8851eb7ecc0e8ba402c1fb69bd3a1c6aea97307cb683f73a97499be1341fba4e64bebb6466226a7674094966ce573a0736f1b2c6c9b00dbaccd7fdbd409b6c9ebd91ec2adfd303142bdd923a22435184b924e9169ed78055d7169beeb46f3337c947f97843261439a2a16e03743abab520001b6b175b5c1aff7aa6d2a6be5641e8c0f2263d70dc30003031346ea54b299ddc82cbd4198d605ced654104ace515b111f935c9c777a11e4060f8372c7c247765cbebbfa329e80e1c53f6ab370c16dc9124c6cffe55680740b89f31c33a7ffadfcf281dd22f38ea4a460e9d028d69e85b012dee46753925ebfb5138dc1d02611ea13242e6bce216ef902e74b9000da0c3c7f5dd9e39ab1adb37d57563633de52e3449814335816ce0087a859d051628b106b8ae1379c6d70e003e746bd0ea883dafe0655a0f9bdd2a21f0cb7fdebb496745a9c8ca0094269ea6880ea83e6eb134431cb8b4fc5b192129f2dca5c75c043b50b0b2e7ef4726d5cbaf365dc86e4262aebbf23ca32c96b689d5ac0ec689a2c77d39365759608e9172f13354a78c705ce1ae3ba498d464e209a776754c5f4ff891b74ad044fbfc404bd76eee906d0294de7026952322c189b533298b4dc7fe6b7a484fefd2275f57e05577b3a13cbc96811bb446bc5e64ea66378dc1cd06bc1687ac5c36813a299b5693006b6bf45be0f29d8df30916232502b28921a473fc833409aa8ed50bc5563ba03187b42aa12541a8938a09eadaf0208493b42cce2e3290b2402ee61ef6f3bf32ebf7e89d18945ad530e9f8fe45e7e68cba24520667a2461fed613a163014da833d641241cf1a50e509257831848a3c2540043d41158d36524d19cab894ea659e4b42ff65c651afcab3127048a36c19a0b87cce1518b177fd0a5121ab6f1488ed8b0ed2b9272d98a74963870b2ad6552023ad966ef5e7c6cb2d153710c2b0bd25b04c74a394e5874d82315016ec889744707e339194e67ce9da21b8b7ab9e2023a06900d9b4e3b6ea2a8062d7b5022beee9e2368dade72ebf68e0978e26e592f0b89a565ab315b64f7d30e7dba5de83c15fa58e8279ee6b4bd569fb1ff9473f365d094f1b824e260d02f35cdf8d912d9996c26b88282903a5265f236a0a356f4d880e874c6ee862fd114c6034a3167a55b2090aada747a621a5de7973813f6e5991b93ee50595ecc180dc8c2e39d3f639db04518203ea7c009f0491f0da16a9f9f7b0025781c202018c566cc21e0ddedc8511a40dee14576807e63ce0371b69fb7fffbdf4d84961ad95bee1d9c0aee09d50934248059bb8f59abdd4a5e6ed448d15a2c138359d0de836deda6dd4dbbb51ed074bc40eb7bce5ef23a5e80bf21c1b361e4d4ec5bb2254f0073257d32f706ac31d84bbd94e9e76996b67975ac85642ef45b8923afdf4d6490696e9ee4ae2ac844bac6f6113772d39f8d0609114d91fb360e992a750d95b6012abb6b35688ccaec60056442431b36c4b08412212ccad80c038921c628a30b1e345154cea7dcdf81850f4c40e0c0c2136794320c6165ca155f987104758a830c2fb238656152122a7b0555243106194c422da8514e2a391613e346060f823c40c9200f493d30916100e898a692451eb3f71be678170a9e4f3809e558270dfde4eeddb930a7b3b99813f22187bb2c6f5673d2664d23c96430994cb682934c567652ecee60e4830b1c7b2565fa6f0b1c7b65ba9497be29f092a513d4a10a2135a860d1c4059f186080410d17c650a2461a75099327a829923bcc90eb61ee0d62bce84b9863c19b65053ee4fa179e4c40492dd4450b1db2c8f52e14b4c0c51b3898010c3720624e61b474831c8cde68828cf2061bd058cd1f2d948ba01ee4fa569853ebd2d21146e800a5892876286334b06a53438314273e68f142931065a54232992c49596badb5dee45a6dc855566bad4c44ea0a842db03840175a4ca4264ab9a570528393239e24790246eed3dc2c49ca0107414be4f412931a78b406db264f727daa15068dc207150bc8311f4ccec8ddbf9849ee241caae43e0c28b70ac0c8e99b561313294072ba0506132631b90fd62065a3359f85c1122d72bd17e488187c814618a4dabc34b2d50206e86917e6b4fda1e5589ab46496ebeb39a13072f7cd38dc80a776c30c79022e28038926300ce9104796010749b3a7a332a694fd20b5061b6cf04205bf281632d7579b1a6c306d652257d60a700c8cb161f623f79dd420cbf3891efce4d8d744a6e7916712d016f943cad463ba36f75f3238a6759970130f70da68485567da5ca339433f99eaad1e5333a94ac041a84ac3baa992ab261ccb401cd99e856c8fc351c3667e79018bdc73ac27d23676535769a61df099ae21559b2b65ced023a1e444a6548a4c1fd39890aacd2c95f21253369a3dbc2cd77a4f6d438f00fa644abe265d03a56b66120d5832fd803295a19f50a61f51a66019fb8c326d2ad435b481323ded25999ec6da49a6a7fd24d3d3ce21d3d30ecaf4b4bdc8f434a6cd327d4c6b22d3536e0dfad435b12b4416a2ca20448b5042868a8f1ca34255ac6001ca31ba46a634e0e3774f9eec1a31657a6e8daee19eae8c7be29eb827eee9caeecf05e29eae1015a2445a133448df3da3bc1d7d4a599b754d4c6ba2fd683fdacf613fd56696404d84328d693f9a91172d0067de695909923a7586822f5267ac94b3f41e9b4d43c07ba4a8e3fdfb2c67a80392623b955be05833dda33a13d43542d5e636d10bff758dde2494a950b5992591d111522b5da34f869f631a52a6d796e835267a0d4953cae1480a4e4fe68f06412335924c962b29aac0e364fea807c109d34ab64e3259b6a44865332bb9c76925cb96fc28f97969810c90b8a00a2660104d1d24f5e0e4882c4ad46002b4a495748d489bd0a06b94e92fd255ba46f7e8437a11df9cf453eccf4c7d5670810d5ea8810b6cacb044390fab362ba23860683a6386a524ca79fcfa66101a96e53ea5a7a7b3669e669c3ed257a18b74cd24c5996334f7c1201c9b44f3878fdc7d0d4c1b1e73fea8c7424db4582177521b188ddc9f65306084792d724f2a72dbe4fee66cb2a1591819a14a66a0c2832ea14833989163609e4f3354c93f404d268f16ab0c33f0683aa24211231828000272cf27726b9f3f48981985d7ec61af9a3da8b8b3f1f894748727489d29e9d75b5071e79e3bb5df46716723674da19242bad4c85965b5bb275f195da529cfdbaed2b461c9733653c3e6eb6639ed6e9d76b78ef3eec779f7eb402fec402ffc50606afe4381a910a354208ea24a751412a812799e7524cb92a595f4cfd312952d96a8546152a24241148a100da25128116d32df58d6709a58b23ccd2b3389049a63407abcc99f0ac42b252b16abd5228ab271dcbd5de77df6fb6ad3ef769ef77d20187e6018a250a914565995aa3655a15218ab54ab154bb562b15aad961657abc5e5727179bd5e602c0c4c6d0af3029343d411b323c7c11e452cc68424d0dc638e9004aac3ead0519bead0716323701df518d3a2e4799730c7c8257ccdbf843918e64514a9d863cc2b82520f690acfc83bcaa2285a51ac2d5271ba50319feca2ca4dc63690e96376366cf6a8755a548c2753b2006b7c5326b60348073ca7e0d451dea124d3ef50d2358dd430fa0e7352493ae0f919f6cc4ae8534da2036a67fa9814124d09e56bc34d2da59ae85357e8534b29a61d4056684e4a7fafaa04265768fe9c9934f3cb33065fc83225639826338dd1861654b0c103a32473290888271eb420258829930c229ce0810ca7377e909516b05205063f402081418972ceb90483171e70a5f48507dccff9a8268517197c220759b248af9d36cddab791e61ba24294043a87e43743137c72305a410d1ca028e2428c1235623206da8c7a38c652c8df44ef1fe991322780f98701bf3c70b413e6a9e07d8fe99a8ff46eb7d109d35070babdbbaedb4814bcaedb5e49d0d9f3c8d7ab61f5923132a78fbd3e4a3b0599824d27acffea145e96525a63580557c0dc85f13a9fb0c10828a888d1451745f8e060050d6ad0c10c3a78f2d4dd3346736bc99625fcfa20f538f541587926cd10945b66e0184d9d6196eb7dd05857164c5ab880c51940c451d607a93630441cf1e40541495e7043594f537fb37dd104c81504a63aa0e963f0df7d7e6001872b453cc101135e6830785ac2c906654821c38869e86fe84f0fa3ff90c0b1798546e2864d19d6805d062c995e86870c477926c940946df24c5222942f238156ee7fdabd2447c6bab1afa5a0853956b39ad61de6f4351bdc335fe018b89d1ec42d6a7fc0b17945a6b7d7c6d86d77db5dd2bb1d63d722ddd904cab0500b296b8fc9f79b1541adef461170f98a600171c411479e797add3d25614ab2e4220283576240ca3749311c654ae93fed33ef78768ce9646b9f709fc60878fa2aef29a56918cd2cd43e431dce1b69ea0c6d183d17e304ffd5b015136e98551b18a77634d329d32dcca9e742126a8b0b1ce3918246efe30667fee84ccf63be9bda067d05091ca33464fafaeeb727d064ee4d89b2b5765ec9d65a6be7b45dd7ddb70f4273e34333274dd636a4c9f1f014ed7cff489eaf23632970f211d2c9f36ea336cbaec31d7437b4614696a4a4276e9094044652d216405c356c4802b69870ac05d22476ca9cf6ce8063afd7050377a6b4f56a1f40e0d802e80b0b38f63794b758a7a742f3c7eaf4d469fe509dbe91e60f7cfa0a347fa44e5f9be68f96a3deb2b120d7733bc8f5b793bc0ffcd71afbacb1f56f35b2fea9c6d53f3caafea546fcaf654cfddbb48dbb9df75929f62d238ae698e9056a1459801a61bac7e80e2e881a5f925edf63f506d4e8023e56c7c8f528b035f651a32b878f5929b9b6fce696cf1efdd6c81a75462ae4347bd0e3b1912ad0ec418f1a6b084e2c321da268b413b5864c6960a5e41659a7f4bd7a78f5f0eae1d5c3fcfc0b0aa6290b4457ab6ddcedbc0f0c5129ac5ab15a2d2e97d70b8c189343c750cc90380433f432f41a7219720de9d831e41a6a196a0db1865643aaa11d1f520de1a1d4106a281cfa38140e8143df9037349243de50377487c80f86ee1037f481cc10372403c2100821d4d7faa62db3ffb87f648e77ab891aa903030661eee533d75fa74d524af467a3b2f9e3e60d05bb337f68df5e8169f38139b37ddb41deb6eddb5f86c0a21098c79c88f81ca7a18e8e63221d638e181c0543c150f226eac0dc8459c27cc80c3554789c16c79e7e7898b1a7887b4f3daa1ef59d7ad43972c47f8da9bb8cabbb46d55bac7babe377a3a8834279a52bb75cd667b3d50efda933db51a9ed785b51a35952599dd988e8501936caf38314b07cb65e35c11121c100c713511248e2302a9201c4713cd59979715001519d99972889923896eaccbc45573c2e966479c3882c6ac03174c337e7bcad735a4dd37e4938e39b321bd72d13d31cc9819ee9df168e79c958e910a7b66ded1b854006c6129e3da069763a255d98c5760967ad0f452ce45affb100c76c143072bddddd8d031a80babbfb8a2b5e9e6b05024aae40a8916b1418240131cbf51706820fa8228d1fa26071858ca607c8c2904110301c418588ea6489936ac11f7a705d4025f737b0d63a25d75a2998db8adcbf5bfc8024f7edad376891eb1b1024023b5507d1957b2da63aa8410bcf8294c6d0984c6131b74452ecb0a82c2f51b0a5475238a161fd1519b1e3f4e7c7698353c9d8546a2f7273c08e1f983d4030679abae0051c3cb027cc1e7d4b1a218b34acbf0a03f74f6757222852aea8098069d39127f44c8d1120f623d72858cbf3065804347760f6a8a7a191d9a31e7c0107515252c279db22b019a933f59f13acd3b07a7be7ec72ec22d5243e3ce7ef9c32310c04f359beef53dac3aa8d48eb77c0fa26795e5eeb79600e96e07dcaf282f688bd0af645ec8dd80a86e3cb2cc3cf50272445ed3bb6264f31669b4d45aa8d8edb1b51a1dab46e5db72f97c7a810c70123451ad664df71ddd519db7d14ac3117af23e6e0288a0f1f235e47cb5b5a8c586998c335d97cd064ad122ccbd6721afee99ad8b10ccfb0acbeda44c001a81c012add45e51bad88d7dd2373ee5f86c036a36073ecd9a2206aa44e8c78ee9dcb5b3e73bdf52f66d47171cc7198b1fe6554a1c8fcc165fb1491112aa340e1757c27bc0e92a7483b4f7d788ddc019f83e4e983e1c5113c0d459dca1abfbfc6d55d46d55d237ecb987a6b44a99efa0c1f756e1475c210fc0cb7d56733d567a9879fe1cf500747cdde88c5e3cfaa0c471f5911d81b660f94e7072968f970ad42e29b32e0fda4e73e64fe923ddde739b2a768a767dee0dcdc341512fb94887e7e879ee429aae4ce3c47f2749f24779e794afa94875dac4f816651fb0ef72cd6f714d9f7d073ef29dac89dfbf91eee95143552083df71d7a8edc99bfefb9a44e0589c0f44594b4cd2ce7dc6a50431867d84c328c600a2206396011c65229d6be9159d257da7ddaa44f657dfaf3796a547db4ee5cb09fd366b61dc92dc3d9cf4d191ec92dfb5536acecc75879defe084b9e33c833e988863cfbb965cc639a027e6e98801f58e902f27353ba1e63b5fa2e9f640b62a88e4b10c6a93094d3fc5193fb96a97bc247dd1ea7da80b7d7a93630b72f526d5efed84db693e9751e0db387c1b2a8aea946589dd15cc622136639abefe71867598f1a45213e6578137cca90e4f129798a767a87a78725585628439287a787255864653fc748cb8fa644ce659c25c5ed65fb8f25c3304d83b5cd074d344082ec74cd84a20ba26c534d55aad11439067a41469e47396b1b4d5de91afb5453d74c28bc30caf6292b4d524dd9feeb949252aba5cd33707f93613a337bd87004009db1ef1195a901620470002a7f246cf6b05fdd4004da51d0fe91f422103952a7d63e4ec78c2e4d7cea339883ffea187ae3cd10b8c2e60f54b6aec77c88eb31a4a83de6b31ce2123ee643c2c7903d453b7dd487a01ef318b2a757075baf11ff656cf91d4d98e56cd6faea3396a813a2c4719630e32c5fb2ce6ce6027ecb67b3d667ab879fb13e531de5328adbc1cfd2358adb53bfe276d418aec65959ad166b55a821a883640f382414123e45f614ed8047bd27f5f0c2804c60fa0fdcae035e042694546075c672b33045a561f6db69ea8c153752075667ec3f2738b5945282a594563eb757d329db7aefb392a210eedf876cf7c81eb2a768c7fbf69eef3adf4571080a259c36d9b469a8734febc894eda9ce8cfbf6aff6a415f53b8aa290efdd8778bf64cfbdf78eec29dab9f7ded395f6b8ced873a3b5df386b77eb8c3d81e440c3ecb4329dba6d114e368633b54a601056a16e27526d26ce533ff3474dde1ea4dad4bf80f00f9555500a769d75960be057f7295d707db522798a38aee2340dc7715a7f9809761d749141eacc86034ac13d45da7b5c07dfc3faea9c10d7c1efb84891bb4b237758a48b9c75c7f5fafa95119e9946e438cf0271f9c8db63281b1e7466cb71b13ecb8fdc01cfb33a488adec3cfd2de17f257c13b76ee464ec7b57a0dbff3d883ffc81dd757244fbdebdd78f3a5a92b0ddbbc0729c151f4481d9c5986accf094e6149594959c9dbbf0eb911bfd035de0bfd73b57e217fdec8fda3a1284475f017501d24c57b017cf192a210f0aeef8077913c45f73c29170feaaefb94dca84180e67b1366b9d259dd1bb7ecadb8ebe98037619620d95374df630f7e48ad62c60d71942eb2a73ee4b2eb3bf62e52f4eefa2c774421acbb3e847517d953b4e3faea3d2e677dc8ea2d6f217b5c388dd3ae5114010a2574e6aed372119030b3771366d972d7451d978b26ccd2e5e210d7bb96d1dbce753a33d65722f7d667e9328a1c290a7179cb87b8de227b5a77bd85ec29da69ddf59e9615abd5e272295de32c5bc659b6c659b2c659aeb65f72a73e3c3772b961db71fadb0eceba3db51d6f578ddb2c71891a67098eb30c73747c346cfb8a09d3c7788842ecc1efd883a4c87d96b3ceecd48bdc2c5f7566bbce7622db71b607d966f6f529a73c3f4801e8b3b5aac9c7d55aabb5d6de0dccf5db096f6d92312379bea4bc72e667b5b66a1dabdc9c73ce596badf56b81dd3820376edcdc896f04ba4d021b045090ed390f5812571f34b7bb68741e13ef73e30367d768df2c042a044a90b56c3da09d0bd57003b595a0bddebb3564b19acdd46a5a16284259b2d43ae7a4b5d62cdc928fe609e4e6c656ae46a061fd200d6b1f3456db64c03c60306dd3926099c7bcb80bceb7348dda12ba5c8fd31a38bba601dd00f0d7da37b8596957c39cad6fcbc060f0010bee0c1ce699e443d214ece599e44312f4fa20440cdddd31f820b4d1c007209a06f8f0c371de36bee6c54d39f64ae385f1a5b9f1d1b02725da1b32eed294418375dabab8a1e6369a689706091dfae20be227259e929ea8e0d70e4fd888c2461138a906201aae1b4ab891d43333c72e66baf8a5e59904e5288351ccf0060d728c266f3f74b13d81c1299ee0af090e08ec421483378436a4376c60e20d250d8062d4ca36cfa41eace4d80bc9b6f1eef74b0ba6d9e3fd7d796e795a4bc79abfdaddf58a39e79cb903c8f300e39c99b764ad5d35dbddddddb57bce395f9e747743e9eee6bcf86837edd6801a464b5b031c4be5cac4e99baa041c8c1a3673798a802ed338b285d2337d4b0347824beff52fdc75a4a8795eadb5d65abb975a6bf55e6b6dd5d7abea15f55a5d5ebf9aaab576ad416d717dd7dbf0aa117ce9eea946efaf9162ec1dbfc3deb78b1a39d290b5729aa8695d6bad55eb5a6badb5d6ca69b7a2603f029abbc7124622f55ead41668ffad50d68a871dce87acb51e3cc2d1aeacc5247b1c6ef2ee3aa35d2b2ed28ea741e6b54a5bad65a6badb5d65aa74c55f96c9d5ae262dc640631c42ad39b1e32102218a074891c64fa514a29a54c349129a5a74a940a6d62874c5bd6337a8a3495e693cc885ec9d4898928f277fbdd0b73be2eccf16cb7441bb9fb0d73ba7bcf8539975b0288cc7d0b73b8bb599b6c2f162584c85a0d016a1795a976513fa84090a092eb5f49f090eb9f841bb91eb694eb696e5ea0c651966cd38d6993fcd1ee0d248caf74effde18c6c6f7f87b2c8d69ee32169ca0fdbed8182470c91eded114d58071cbbd9be522fe4e1a35a3bb7a892ed1a3647b596420123c7689429ec5cb23bc8f6f617bf0ea37123dbdfe004d121e2856c4fa4c8946c6fe48813d95e052956c8a8fc1021036a21dbd3264244944154c412464db24d32628c6c6f9196f4802b2622f79be26c29926c81bec8d69615876024c3c5a00dda91d094e17f70d90820c12b53b205b358cdf33db67ac61ed7f0f6d676ede8eb385d2408d0fc5193619482e81439d27af8f4a3454027885290769ce682684d38a5d4c5d70bccc1f1250c5f1e1e267c113b98977196230d290000647bf106d1c1809114b2283561717aba9c0f1f577c5cf1e1c3fbbb12883c602acd2cb20de25df34e51103bf2e59ceb62aa8cd9c39e1b534f291cd019fb309546b69fa92bb38706f3d789bc3ce69a4e8ebf8c3d7df030630fcc5f7e9323c609880f2598b1a8fbcbd8531fdefcbacb775e77795d23775c2e923c7d97e3f4eb62f8971114521f7e87dce983ff502d233e6bfcde1a57608ba563653f4194b85e2dd1fddaefc9f1aae5a0c19814351aea00c34d5cbdbc300bc685e3b274b02ec7fb47411de1c18b183cc5183c7e88c18b232d57634fccc5b3c69ea29d988befc9f1940e8ee3b496524ba9d5eac0aed3c811f874230a2ff74851fb90fad487f4c57fe02876df719f321cc58e1485e083dfc107df1d24798a3a7207f51d244fcc51d7719ff2fbbaeff3608c625086124a5de4988f185c41230633987d5ea7d43533065592a88842f0c3efe087244f91771d244f0e52ec5e9f3abe47eea00e923c31a4d8d5a7bed317df178f5a1d666cf98beaafd1356b7d85b1eaaecf662d471daf58ad16970ac394263e15182a04b55976ca69f5c5929589e999edafed5d83d34f3edac6be05f527b44d25674870593f2be28ee496748684a6b4ffc165fda129eb91e032cbdd404a274d7d887daa3e55df938ae1a02c281d829e4a993fb43f551bd47130860c9280019d226fdd6a35c3f038ddaaee86e1481d113a47cbf55ab9b434cb3b81e575b358acc3b0548f195917477c1160ae5a8d306f8daac3c0a844e87e501d08406de80a68100d0da2691a74468c06e5b468e68ffbed039836548a118d11cd25a951dfd3d111e11f8cea33143b5267b56a11618a2167ae8ba408e30ce62a1a86a4cecccce5acabc699ebf8464a464f212c3135896004537d3b55a24cd566fcf6c137ba443e469bfe18759ae5e8728cd4687bf7d58f8233223c84c3604611ae1a4350a942b808211c36d25284f92c6340b8ea43640e43f6a02e7315ea32ef491d0422a9837022a8cbccc0d02409c5c18630c828fc09e1dd48a5cc1edb7ba44874083ab3dd526a80184d8223a9915148e6780f2fd251a4f73db3ce388153b14bc713441021848fc027770fc98f17415248ea207c08ea32bfd566e63051088bc5fa47eee0c3b8f1ebc0d567beb3fa4ceaab7fe44eeb309207f5d6b9f11361847908a3ea208c319719c57f7cf907e38e93a38e8f630e1d8ff92cc74518189508e32c43186709c2384b9971961f8cb324c797eff86ca6e3b398c37c96e333f1aa8f3e322aa482116372e8d8f1b2639ca50e1f198542836810ebdbb717a936abd6b796bf5cee621db75a2bcc72b9bc46dc32fac8ba3feb5323eaf63b2b52e4ce4291a9af3e047516d9c33aea2bb2a76887458adcf167897a8fc891a210d6551fb23a267b7a8a76f057ef51a55ae32cbf8d1ed599ed2a9452de9e5a35a98c8e1869d886b2af313eb775fc10e2719661a7aea8524ee187e0abc81ed5f14312631d223841e645d2218213c4825a578ffa907e8aece9f784af9fa5b5f6a3a18e0e51bb8b0606612238f3c7fc09626dcadedb71fb20d586757b22d5a6e531b75721369b721ca76116e92eb961f7217d9773e3902aa41e7cd88db3613daa7e0f7efd47411d639109a8ef1867993a6b449d8639644f910eea29384a1e9f12f51d232d5b46513b0b7ceb43c2b3c81ed5c3b7c89ea21dd5c3f7e08f86227822fdf04ba1743427725c909d2227d8d4957aa5daf0e07185c7956cdf3c7878afd747eaa45038481e9973ef5dd40ebe5e358a9aa8934a7126cc7296e33117bb0fa9073fa41f5e1bc58e14921a5b478dace7185f8f195d0e33ae2e8e2f0747d7c3b1e575d7672e6f69b55839c659c670dbea2f9fcd5e3397cf5ace7aabc535ce3af36271aee8cc66299d120b1e5363903a638f0a41a72b0dbb52dfb7595f7c15f029b5a620fc326de67ccd1fa84c8f6a9a3f6ac619720e2053ef7ebb3dbdc954a3275f0d7b61a9fdd1a555332dd1a7b6a04b73ce79546d6ccf64bbba82e71c5faf9b0660c9f4888a8c1059720c8852ed79d4354a744d7d1282c7e95ab96fdd2f0566a91da7534a8c1f377aab513bce579da129a4d451c3524799bef3a90dfea49a85ecfd0387c03ee54ef7bbbdebdeb391e2fcf6913b3d1cb9fd5e9c3bdabb6bf772a81ecea7fcb8d1c571a408566a755c5ef76ea4dae07b57a1daa8ee79a74daa4dcbbdc7a6d38a46c9c1f719eabc3c7c193fefe1575fdc688fc7ca71f5dc2d57ffb2b61e35ce12751f6b5f3f278ae4714d944f597ab7debf1bf0046334b909fc0c3f7a069e9fde290d4510ff2b327b785fdd00cf7f34de6fb86f1fd275df3a529c3ddd39529cb39ce3ab61deb7f19e77c4bb0ade8b7837e2bd431d98551b7882dfcb1098a3b19f79c7862248ea701cf6e63dcf73dd9bdef4e637eab890dced77b85b92a7083c0f8a144bee20b9835f491e17297ea428a4bbfd90eef6bec7befb907bd451640ffe47439dd45b5a67adaee28e3f6f34e25de57de5b5bcb7784f799c77d330ef9ee7cd77280ab1ef4ea4fe1e35ce923b4e7ba407b0cc76ca08a3ac00d4e736b3fdd50645de5458a5e91ad481b40dd34ec3b6a3c8a4200ddbfeac830a3fa4bec99e7e7d1892227d49c73be23ab37d37600a449b5019fdf9509fa10e8a14b5efc41ca73f11e657c7b7f05bb5717d3b3daa362d47fd334cb7d8492d11d18999658726a0469887a3781a8a1a0d75662ed4a3ee423f7cf92ba6fbf181ffa03620a0ab1c9b58565e8e4d2c9e0b09cc79dd14b59bf9e3fbf6034c1bbac2cd466537e002efaee0d8339d485f94a1e40d1ab82083212c2046152ab878420c17f450d21fd64a02cf3067ceaf07dc2e2f5a39c00dc677abcd8c08207c30eec821beb8b4b054a9f0ebae91e28ec6c35dbb4fe953020016820c791d31302f576b8551a0f78d1477b6fbed3ee5fc07801900cc5ca018b2c03e48149191450d2c84e0e10c204a7420db82088e1f314a7ad8384518af16983e84118330be986099f18311760326479a71bcc9018ed1ec18837081758c39462265e098b188381ab18261c6237586fe6554a106f845ef32d21f2f708cba5a5c2d935bd263690997e487a9c56ab15439804639a856aa95ca8b6297a2780c70228a193b6001126c7051d219461454d8e8411c4c9a6250d2e39102a546da043be118054285a890e6ee6f0986a7b6a274fb68a9bb1b1ca910d6018e5121dad1bbb640aab4f504c7e873acb15004f4299689a58d289631e808f4140bc5d2362f748d262e54c9b48d5a08ec59030535944c6bb791953eea9a181d835ae922da888e11e6d0351a464f9d28164a3b041fdb2204a576d0239cc61bb9bfda849494e4be0a482693d1b07473c87dac5926ce05b99f1212033cca7d9435c3a392fba1934c264b52f61746ee834d3299cc89ac53e34aee7f15066e85dcf79c6432590c40b649ee774d32996c06bb84eb21f7ef924c267352735049c97dae916432590d51bc29727f3392c9644f8e588191fb1a0d4a778d1de4be9d61299ce57e059a416743eef70e65cb643648f190fb143ce1850453106c1bb0ec1dd81c2052ee1bfde45bb7ce7d0ea86d5a4e32996c05289c1250727f265559d0bd22295f1125c7b82272e7187714e39038a5dcb75bfde194744d6dc209559bed683b1272002a6f47b347df45060c16d13531ee2713815140a3aeb1a742dc4fd7ccabdd32cd1f2db95e237a35daae79db51ee734d4c1b7aa3c057e4e6bcc8ad5dfbc961e0180774ef37bb831fe2fd037b26cee77da7bbf77acffb47f27cf7c0f378efbafb9460d73bdd334e7b5bf79e228ddcf1bad37fb6eb36cf7b8f47655a1b4804e5a00543b4e3480ea8e38238202e4aee4f0eca1a539c4481428a25d270a2441c1027c41171405c1310896bd5d137656213091f4d257a973826508ce999416b27e360b040935b4255397851e6ea087a95c2a5d9cda0afbdf3fc5f79fe13096fa1841336e02fcfa4d91152cc7aa862760311b317381ae0963c935a48e34669a1e90e61579e492d4c01d4021248da0b37371c0e6a702d04c121e9eac41931745a6c9aad60ce3199dc3456a0d1512dac7023779867921556d8a01dad37daeb36e5eacb5a3b1bf6d2ec562ba7f5d5bcce53d5f0a2f5d2cab5a6514ddbe8bd98ebee9c1f124b297084499369465002d377291537de7c2b2a0c211002155e7121c8da7206c6b75a5c35cf1a82210442a0c22ee06727f7aa19810064eb47a66fb5dc78e9c0b0842228a554dbb671a4b51ec1f5666be7116cb92dbf5e6e478bbc663c8f606b796cad55d36acdc235350decc50d6002b9ce39f3a90a41ae25a8ae4ab39ca6699a366660cc356b73fea879d64e1502d5fc61bb864e9886026db6ccd7b4e1de3234326ec874db53120c9367921553e4188dcc0eac40c2092b7e88c30a264758f182156ccc702bcfa42a6ab00d8159792655b1e445154d70605421c46529590184a9c8564a4c00a5949e544a2e5882aa02082b3d010a9588524a2b3801ab4042ad21c34705511885173a7853fc8051289143d7f445c1021cee92a702ce0aa12e0a15d0b049b174a398dda055e1c441e1b44406851525e514506c014404c512548ea08852432905911df34c4a92449c017ed1e4a06a8115c99229c25a6bbd73c34b02a02206152939dd6a013d51812d10b7ec0c74e4a6620b2a8ee8178b880a26b9d677151c036560338049c143ae32c8558a2cb94e0134c519b956980a50d270c1104f84a821c8a7e8051b3041459014a320da071aaae45a6bad95ee40298cdc49dd13dfb57392d6be8ea70d778b5397ebfa6d9c1aac6adf312d11df9c3f5e2f5502f5d68610a8b795abdd48f702b1821ca39101a3f24c826213038336b8445f1020cf241fd2e8ee2da4f0c2072b4f465164a17a5ae10a10477038c1420d9a018b125064c12409919332866b0e494aa61632b8820723294f94c1460b4c7ae206199567d2135fe4a04d907bad1c090289dddc5c2d86b336da98ae996fbd646add2a905a8f288ee281568b25446c16b48fd96b4990be3c11c582543efbcff656efbd27617263ec45f20cca7f7f1b7df224813ca123f428e5392913df047db2f626bbefcd317655e0e18dddf4c9dc9842cd9b7d1d71aa36dae97329b5d23c28ac61247425edec81068ed17cd003eed75a69eabd6dbbd2d04cc0e6d85749dbb011e6009fdc39b49476960f286ba72378fafd23f1a7e49b354cfb75c27b9a658d524abd27f01a48c67c68760bb2924170da60103c1e53238ae680415a95ae69ea9aef9ab6246b55b2f68f8eb156d61a703348e2344c53d9a0ae7107d235e0b5e3aed96c508ff1c81aca03df392041e0b9300cc3f027b092bf8320f78edea33ef91bfba823813cb9a36dd807b4e570304f9f4ca91234cc99debf77efc8d6487fa8ec091c6b25d5afc65e37b1b6628363af4c29160fe7d4bda7c63967da4a53571c5004d0ec69b1d7ccd3b341bddaa45e5ff178e74c3f35ce398322310ca8e499e40495ec04121ee8aebd62f1ae0599193c093383e4072cc0f7c9df187b0ab96bd01b7f3f9fdc8d3d44f98e15077404daca3ed8eb0d8b2c782342864a110d3e7032c0db0e2d3881032773028873c1891f339c90dd2170c7c675823734b828f06606e786958d0d7cab6c4b608e0b8e09af9e2003896d0c2951905a9064871a90547084b93c939080907ed000859861862e06a14f0816945c18983c3568e07e9eba20aec4b039dd20b05081d6840b2249061bca1fa42076b8a14c82144412262f28156599a18481a889a6abe0b8485c95385410471c2f1c01c7d3bd010e2c1b15cccaf30938be500207159705b895e713704cd9b6ae5be6a609255cf24c6aa105a416bea42d80be16ab5755d5b853dddd4d1b15825f7b5d5f0eff9241c8de345b6f6a574abbbb5b1b67bdd7dad82bd7ee6e410180a6a03516e77df224ada65367ba7d346cf698ef535b6f027b551527a9935bf2a8d9dad44e0d6529cd97865bc7172663539ba3f6194a406bb5507b7b85d599f9edd6dada72a1e5421f753439dbdcd29c5fbdf7c91b581f5a94d5aad75d6ef33a59d52eb77dd60854aaeb3a246e6c9ad5eca6751da99200f7fb54088110e05cb30780a635026bc7566537cd89fbad950355614ebdcaaeaad5aad75d6ec3b9b9a9dae536cf1aa1528539db559765b5ea75dc76bd4eb671dce65d23aac66d9d358275966d59ad7adde536af9355ed725b678d68d5ea755cb7bee02e77b9bb699685cb6d9a9d72dd68e3fb3e50bbdca6d929dcadb47277a691a9b597ab53b8cbdd4db32c5c6ed3ec14cd6edcd5ecc682d534bb4db99c66a77097bb9b6659b8dca6d9294a5012baabddb8aeeb3cae081391fa512272d32873468869e3dd238fd029473a22bce3a4f37d1fa8cd99ae2b01e7ae820743123adb8756a809fd6aa59736b9360c4354c5b9b9b9b96118e6680fb954ebf868204a0280cf83666622802aa123cc1fdc8fd01fd8af6d4a4e81fa973b427f3652236314c989fe44792a24a173c5f517365f1a05aa47e8085e6b853b1ef5118a005a3447e8230931430768b99234caecd1471d11e572f7d20e4597586a00e5da7d823dd391b3a2fb3e125c76afc7b50ba207a824ec17eb8a5832542402000000020316003020100e0844029140980992e27b14800c709c3e6c543419489324895118c3400c320620630c00c01862cc1815580013595583ba6c62d36a3072c29d1ec0353c9eb0925514d671fdb51a140d5da71ec7bd18b9a20721450af5fee3f66168a1604baf9f559e60a67a16e4cbba9967462d1bfee7d9084cd0507a5df74888c7c6a6f02cca6ca88fad26ff2c552ef86fdb6b45305adcd3ac8a4513120742e87b40045b6fb83b80c508b1ce15231918481b3e908c2c73037e020475cdddd8c6d921522c6ec69f86207d5bbb2cf9853a9725595ab2a34246d9772f6b0c3354639bdfed01aa659a1894c340db9ac11798da3b29ffb2cf83e9a42bd994e273fa15e69dcb9ed8ee50bfc943620adc4fd0c8814d008b1c55067bab68601dab349ceda2403ed29d4a221c2d703901f2469e81196f5c19ae6c6505c3e280604793393e0676ad98e3ad814da83cdae00e4b25fe35b20cac5fe38a76676bc41c0a4c7680515640ccd67b283df3e31f52eb3215ee9f3de8db1e90792ccc7486a2752f8b14dc6a50a312b9ff112e0dfe0ebda20a4f610bcdd8cadf64498f7f510e60615c9b0338140616b9002800f6eb3526a42c67365456e32bffda56d832793300b249f24c5353943a698468de103d3b4f2cc9199acc1b342fdcdf100ba31256d7285aef1a0d7754e46ab608cda160afb6880583873528e3457e309ce1492185ea350caa74b06a9cc7c1c74389210fa553eb134b61581e480ed723de3225c7c16e0ae0ddc6c04262e01f6319b272458ce366382efdf0c522b2105a91e7f513340e7bb66907cc1d429650f22d2478a0b68d6189abb119ca85c7c8670d36c3d0f09659c8d6522afccd3916f2cd907097185376a50f27b99ae64e9132c7f536c364bc064e2708f64af0f5b2ba7eb406fa31067d04fad1e1a5667af0739a830b882d42787617cf0385f09ef2c271b8cacd8de7af972b42af37828826f427ef6e35846ea8b41d9145f8c43fa1bb620c1ed96cb92d62b8258267f9811db5e8dceead7e9798db61333087852c829675c224d60b6ee78310bc64b001e28276a9746926712ff91db549a041bc1dfd3161a56c3bc00b41a76bd62e9a700fb19b680cbaeb5cd5be8ccfac6da8962d43511cc8043da7a1d50627ba1c67c59b6e1a76403e5f380cecf8c4be755283216bb8c79e691eee6079c8132208bad7259d830d9ba2f20d1178bbfe90028224ac4ac35493639c0f12cde7f61d71ea2a4f28c3cd9a4cf07269aa3c1066d37c6ebe81ba8a1824455846101060022b0e3dbc81db3846320a19f86a379552925fed6606627617c2d69d81596a6b161bdf1f4e46d4b6ad66be64c94ba7300c90e963a4f009cf278223c17315ff885128c7ef4528b18317b387da22e1769571abea2b3a78412ccc7d0e4782bdc262d38406b4c270b6382c64db63782a3ffb192238653e70212b33716a9bb855efc82d562b014d54d13db3289c1581ac8a88502576b4408a950256b2d40d383ed69eed32a286e7992ee2b98b9ee3307832ceb681e36b8bd24ef402442e1897538ce441bf17dedbbd62a0e81b8f456e90e598e29ea2f92884116d02194bce9fc8aecacfada0b2cd3736ce9176e80e475db78d03ecefe53e0b5796356aa02b00e071b57c98c5cf75fc19392e1969d8e6ca63b343e24a05cbaa9f713a47c624e2c10a22e3174323f6f493fb9a3ced5466c191f170c90bdd0f24941ea0d4c8215d288f1b486e571a195bd2c93b406a601822be90ac7d50236c23c38fe6ba6367726a24902aadb753913617f230d4e9001338e5f52b54527c05ea71166a638e7d6341001ca50ee3f9299aa5e83ef8a06b2bb616ae8e3a37781cc6feee89330c48181bee1b2cf2c60c03968e189b38c42431b1094782328c48840bc0f039e545b08a81eefae3ddcb674b8a3d272f61d0a57a6ddfa5fc2227f2b566112123ad30121618ecaa3e5be82a7f5b52e42cbacadf76ddcac796883c5b97f2b06dba0cf6bbdfc802d5fe48599d52f71e074b32db10f89d1b7fd62e2584460c91a314a8b929558cfcf6d5a4d3d8c5d7abc24176f312ecb3f66f765e4d6f6981dfaabd8fa30c829a5c24042e612a9ad27455cb6c4715e6a09add0cbc176cb35e81de1686baeb94b50d9cd0a4f3c23c0066f1df12cbe8e5bd52e3b302e829941e36adb451bff0b9c3bdee8af43639f17a85d15f0d96c5162b202af1aa3d26c066a9fd118fc1ad4a25f52b7b9559d7b45374c29906bf3291ddc495f50ef0ae5a14c45a250749f5100a33a0189c68c53654f9dfa214cfa352c7ad49b854da51c70f34da1ce657952cd1caafc58f6021616d1fc75cff6be1e103ed20c076e1fe284b1346f70f0b3a3062bb83378c87f73707f66ab3da77510a6b12c071b25493c1ad748d717bf35774a3f5b0ea49d64ff9789a691adb6f08d6a82e2256f97dddbd0299187f56e5e368562a23d1bda75826f24a9574c811ce32f18821df840f9a3660c71f31008ae232578b6412fcb0cc501f85376603dcce58f7e5687394c871ea2cd178c07775796de20635a338a1584b7c10658e0391dc957141498e874baf203e3a98bf1f7f04c9624ab40eccc38ddce1f9e8c8635cfa89754b7aebbcc0cfff63e6871d843c721172f2a228c8a22509c9245fe1b7ca5490deca4416d3d3461484852a8b57af4e3c8d53ac97eef6ce61aa4912e26c42e102f547aa4ea5421786237a6a46bf981b095711204ff4f9ba44d0e8937ee470b13a733e238b214beb14d445a06df784a25bc80738b74adb2accc81ab99d139083c8364227dccd7305fccc276683bdc2364e5b9481589e5003a47d7fd987f60834dc241caa5cae256a8d3b8a6f0c24ac07e3220e308206b8404340af2c71b199674717285e4e05c173f0958bdf2e4af528f8dfffc41764df6496483138ce76ed0ae44a79afbc18c4a07f2ef1a2d67341859ffe7fc6249513f1be05ef142463c892b088070b18682d4f4596c9bd8e896df15a6f8fc95ed5aa842bf75df4e9d9633a22829d552f69e71ad65244f61093016781d64fa7f05ead812aa49de30f5556f7ba668c03df913f100f261c3d77223994d546caf7ac498126c25e7a5f1eb3c9e396d914c674b9b1f71279d9146819163d86318b430c5906810800181c64a0232e956065f50f8aa2060cd92150670116586efb61281363b4cc39096f7ff50b8f74355516b1c8d0058841f4ee840118f81072c57bbcae4682c64acec195d7f62473ce2deaa6c4356f72abfdca6beb3beab99039fcfe944b698c87ec2ade9d3461818a6e66113b65c928155e2cdb61f11d15e8ee9ba0c25963605488e661a290c1223222bd29a4b34cbb02dc79dd5af47e0ea31b697d6bb6dfd758e0e00b9c5234254785b4651bad7f5cabf0b74ad1682c175fb636b528118db9a903f39215162d12852957426388452675f52e6e91c8ab7b9c6ea28ef7a800ed671c034544bc1971ac2570a32eb085d9ef9ff0934fd12098c172705c387e686ff9702ef3ddf27d0abef8722e1b0f1328e855f0353bba50f46021a9281ad48eab4f4bcdde60d0cb7850cb42798c325ad2cc06075996c75a2ed4c723a3b5331b1c44191e6af9501f979cd636b3c106b9055a8f2b79288c27f62f2eda3e5094331c48e47e64e541751cfdb454760d82428f07bb4d76c7f6df161321c2492aec55517f2256a7f988618afefcfdb9a97153e2f7810a0ce813a35af2e868ab9080dafd651f7845d7f629d91a073ab0542069f86478cb86e5e0c00b82741a112b01ed6b5f4cb0fcd73db7402f990c99ecca100cb69de7250c862ded2111a545e4c87b12140b6a0af03b9cb69a3c166370a2ed992c0cf43cf7b57a1e8208d3091537fd518a8b45f09cf21fcd507b85f24195d698b519c95420355e9e1b37d6ca8c09e56aba19216c035e1853c95324f1676a046aa163c0827d090616599733eb16f835f56071a46a39c92e663c74a88f4eeb04f78de444011cabb8474e39b69ce0355d105a5d88243c3a9c4ff4f519d836f054d5569f6490138b840d3d6cbd7fd59fb7382c3ff6dead026484a683ba765d8e1ff7c3adc3a3131006eb6fbf8a93c479f072344038254af840ac232f1bc3e9d525916e25f7f7caa2ecbd5149eb92cd37517cd14f7a99a78879fa5ebf8523c3d1010fa1595171a3a61613906b4060c0238875c033d82288380d6db9c36c3d66594ab68a92b663512564c40ab3121c936bad8184353fd2d1ad7e65ef079365a617349e720ac7f1df90e0263c847bf24ce676ba8462d0973aac7c33124ca75fba7c14048ff25d4c8fac48eda1979ee28c8b9468e732bc409f6d522ffe7f2015f36c32e74bb9bc7e4eee94a4f80c9d98f83b0c668cab0c977bcace5f1b65a22f69b3ee29cbafbae10a41e42f979e017cca0ddea3e9dc1bbeeaa46fd62de3ea4afea012b0366fd19e2cc92dc7cf930f1e38c043381adaa704b9d27cb9dee662a9c1249646d3be6af3d49b9617d4fe82fa1d83db79e126b49a3f58ded48ae9b325d3bb6df459e7f62d06eb7f892905dc2423f5a6ff19af2b808d521d83f06badfaa1afc7eb18462c51a7ff4a8d63b7a43e64304db5b8bb2b5b83a2b4cb03c404c6ee2b9609a9cdcb5cdb7540b5c1122961e92bf7672f02f9c7f368960069da47638b34cc905b59bbe370026340d2d5edc6a09b10cd1d2076f3b7a0331d177436973bd28736d91c2fce8952d994e414c9f941ea5f2a54e858f8372ed6a566c8157e89d19c462656b4c9e6817d9b0f4a2ed91db56a9d662ba966baa410f2a74f69ed7ab502965fd89eb44df5dbf8647ff7b2be5fb70009605a2c2949930dce19d45db2758d589f427229a5ba3131307c87c2642c0b552a93845fef333075439ae4c5f6bbc486d62580aa9501ca6b943aaed6e32c5c2db6b65dfe337d6198bbb9419bb72c0cf6aa8d663c0062200297e89969b46bfd1472ec64928f6bff6d8def1ce7cc4556833876f9d5bf9671c1bd0425f8137860513f7244c1c4665bf1030f574bae7d83093078a1f25a7a21a194c1a492f7b5cab0d6baf06f657fae1470ec600ec41af130e3bfe6466b7838474665bcaecb71f0f250ca6f47977785ab7c1990614a12fd878a810d432588e45cdd0897055b95a0bcd385fcdbc15031c046c185ae52d321032fd7c090c15a3955c728abd3805b8d8fc00a4d5d147bbed00a7fb884f2e73296e8b3f6a11918f3c2b86771210c9da98498a75e984ddb60eaa56e963989f841a8df2d7d068b5b2bb8a725d53c76e73213a1ce1cddda91eddfaecf12a8141623b15cdb535469df0dc996bb91692f53bf9a10feecfeedf653bcdcd0f4f78029cf62905048510e1c8e882f9b091bb9d12c0dc5c08d684f4e2467995d65341200b8f9413b24b96f1c404f75d7e74256b8fc0c545f17fa8b9e945370fec99a02e097cd85a7ff2c62f0c733a293d49f55b260dce491a23f2b01f66526ab0e25f53ff2ad8d194a503f2fb5a8aa159a4e7647ef1b15c92f8b45fe27c8ae405580950be995392ae8984fe4976cde7f51e7d74460093d9892feef40687a8637b8cc976487c39f1438ed1b4c4b6d0570b8735ac74b742b379df3b3ecf0b38f24e4c1cb7083167bd3a113ae58ac5e248bc1fd75bde3a0e915370f1f98f527bd201f9a800b4893916a1e65cdbf3509b60976d9c50f3ac3127582d0655d8657e4bc8a684b71235d0fcfdf1c9c56807d6bdf0a1b4e4dbb5e28a937ccb530309588f3c8684b8a180a8485bd7e1e0b837cbac6088818cb8eb596fb5a6f276d7b5a1816e3d27568532be94bf053d45e2b3f113f21cdadf093f74931dba8e9bd8a4feac54033499d4e9ec316ced98bb0a4ca06594ad74087fce94e8f69c60fdc87eeb78ce5f0efe0d526134c461cd95146b50b8fd13f159294ac7a3a79345f92eeedc9091a9af5ab9b2be9959c354f965a441d14d91b5985f6215591d9b0b6630d7681cc28509309a4fab60385269d34485881d0b82906d2f9463582a050e7d7d98cdec7a292c4f1ec70b3a94cf36ce7e11d9d53d6ba50c4ae43017d53c4cdc5184e6df438b4e95affbb508b595060a45e907e5e76303cc8c47a6c6741612cf1b4b8ad41208a6d1ebde502c1fde3e8ee6bdb8ece0c032a711d4028ad9b34bac72771210ff87148d6138b3511ec4bd17c9ab04f8af4c9c4be8ca991538caa46adc7e8d287131dd7303f4c09a263a8f286221a338cf5a064ce6112aa98f549958d34b8742ac97e422c2f8850b9aa27a2720785324ed56bb3b26ecfd6eb6040b96dd196d2a603c8e10c208384e759daf775ee0a102c0bf5c7901d25000659103733a96c9676adf5e58eb3c2b1c54cd7479afe3f7be1048785fdbb6f7b409bf8e83872a32a23ac04877cb7445e7c81bc74707d43bd9027799b61a3c337fca7f3d7fbdf3d3881c982aebb7fb9c543b991f463fe540f7b961bf5b0a6c5e22f05987054cf5d3d24dabb2e8e3b14d54543462c2c5903cc4ad5823d1a19afb837f0aff74fef2f76ff6ed87b4feadedcb40dbe54a3b192eafeeaa9098f57320bb582c76631217cef1d9ca6c82b3e3817458854894b93fa0162bcb0d48b9c8548d931e25f9f110945af147f51759f4ed1297da98137b57f2f0b52adf653b485b3d17d2689f586628e1d8067c2e48ea0038663a028b21408c2ece035b2d61e9da2dec8c12a060c7877033e3c0519632a324ae034d754ef78bd0c69e56527351aa5e790feda91d353926074a9dac8f47293702856847163365cad620a6d2f76b51e335f3bcc6cdcaa8c14a374f0c9cf335b7591742baa014e9aee1bb9935c6641a08f90bea8cf0ccb7a518ac82b4d09d57d949546db4b8ff7603d628ae01333d1111bb473cf00956d4e0d695cfb78dfc9349c6723de7d694d80dbd17d80cbc821a87104e8fc298690cc8354da5fc871dccf4582118690a1333a46c6c1a457ca457a6bd1cbf147522215641566669ff9d892ae0884bc1a9ea3dd421cb47990b059709eb5aa820eb2a772f3ac847439741733dc0b0c6c90d0444a51c56899698fea5c5857f7b00ade4ee1ac1e82f1eff38683ec72f35039469b0a5b24f45362a753205d170b4b93a42308b9d0431fe0d30deaa1af681f79b8f1f33f4bdbba4ccf7e26aebeca99c025afd392ac4bd53039890af265e2cba88d4ad9f34b49aa0041448c68443543a139b50009f82f78f50ca79c4095201bc7cb11bbb51604735b1fa53b4c294415909af83f29c730b5ccaac4571725eefb9a2446aa96913fcdc7c21a8412345059d5759b1fbee5ce1e48c6e23f2fe909b939489dc718dc19cf5e18fdb74c1e85583dbda9d9eb2d9e02f54a8ada37fc834d258ac50aad53b641617fde669213f6f755b5ce6f5704efbdae5a9ee85109f5d88d9a199a5536d307837a510ddc7504c266b80edecac9f5530de83349eae4c9543f9f308a6a80fc77d99714575d2dedac81260a4f25e91d4c80da4a569f8a9cf092e89ee431edd154278fbf0ca3377bef12116fbf457091684c9d02de59cc4f1c865bed9ce73ce6ae7370b866cf2b101c0e4060ba6df063c339592c31aca325132a9ee0586aa3c7a51d16f857879144357624e3802b73bcafdf013249cec96405d45371642e8ed483893b173e57699626aa0f10ef398aab641de6c45954d110dba84ea7d2503d54b2b657a3c0363a657aa9c4d1cbca1c36a2d26b00136382ba127774064e51741baaa350355c1d15b28cfdf9f4c6d3e1a96ae1416d14ea54fcecf2892463730360f7842a8557c6234661ed6f48d40f09af62f08e41f6cebeb282c3c01e2fa23407cbd873bd45604944a2eb2cba7f2b013454c1ceb0367b24b5edd315978be48aa98926358f34c964f3fc899dfc1f3d77f9b4195e8662c3b74c18a90d62eeb0e20c3f4a57077ef5553bb518100636b25ed4075c523fb130f1939f19f9d614cb7fb99908ae31764bbc24eeb0169dfc441287e992552d45c8a464f0063c706917e745889ecb794104bf0288abe960dadeede415c7c9933309f3e6331df10e1babd422a83d8446c4dcc38595e4f128d669b13aefa0d0482a1c6c8cf10a4c3892fbfefa73c6eb88ad427995b143ef90188694ab886062021b4aa8b8a7c849a5f3dec45879cf73a2837f6d0ddf62f1d2340b4c08d1d30e0271c13cc649e5b78f2db1c90c6f252b425b850f1093797c81ad8c350dcaec2d6217c40b2d769dd9652955047310ceaacb118683e674789b5dd4e5e95c88a464f2eca9314933b89981cb486205d0963ceb982745a6fd94b98187d7c555e18c8d046e911c4d5aab9918838770a75a3caca627090ac7dd8a7687517a57abd94473789d0e2e23af5bfb3984441635a70ccba721f846c0e4c14b4faf86efcf63b97b70ac51fb395748aae27590dce8869212ada3f27f4db6f6745002c7218f4960d8fa163720d44ad8488f6f535577116cbea76b73a4610e1af62b728a7e43398994a1799c179a8cc556157c200ba3375cb22305655d1cf3c66e87632f21e179c98d9d7c7756be7dff075eb07c9e44fb9f11508e8b9f29df5a7c32029f29c98b8fb2a9183132571c7e6cd32f1e6f4bc5484b5e40cf20e2cd0293327dc100fc404f029e4b07422640eb999629c8cbf7dbbf5fb1d580a5ddb96569bc1f4817b43f0353821e53e24a986c52e94c06bcf800de6c75ce68aab1a318d52c6f70fb75f1e7aa235025654f14ebf7147966794f7048a3a57251ed7582ed686becfbcf8d99f526b14843ae82b85815966f341c755d84b1a186736d12dc843fb84502a0869f3a2a59eaca4dd596207d51c4e887004265acb3358b0d045b2640ba24c53c7ea8594d39bc170e9fcd601e06a48cda80cebc22436f8b28f94c674fa699694155804f74e516d7ecbe5bfa30fcb992259afd67f8116a2c04655c9615ecce14d0c35391d07ac966c85783808a2074132bcdfee4815222b40baccae46153a4b6ca1e12c9c02f76e152b35cb1834920bd961c1d9ec9fd8679c329558486250fd9b4b06b492f59961379fcbddfc10f9f9449afde5dbf906a1c672dc47e16ad2b407565d4067ecde67196e8495600c859398f41b23713110e72d6798c3ec2f1536aaca31176d1d3f0cbb72883032037b0bc12f2620c68d52aa5a480a4122c0160d65d3407bc8424694ea2df24bf3f96fe1509af8e26b7aa13af7b59e793ec3c9b3e9a9012d69626e631df1c4bd8100ade983e368cb541120e8d819aa6be52a4472b4429e83cb6e0709a0c27e17bf19aa8d65831c63ece808d11b87e0395dbbcf97a6fb98c8db3ec1caee28adbe168c7fdb959bdb35a37efbd95279c80e95c5145905ba595359fc1a76b92090e3c7138ad80cefa04a59993f744361809aefae42e75c27a531615e2a76a2130a44bb9c67b0512a6229165a72e0419a738b872a07d6971cafae53018d7043231379c4d3d51d7358fb138a46f9df7adc0d4f65570d6842ba331fe91fb1aa72af27df5d4e58a2a6b68e7e744f271d4e547f8035e5df86d6142bb96a331264cde001ccdcc52409db954a0f96674131fe659b7c6e21c14ea531d394b31d46ff9b02984d793ebbd79a01b130f5c90679ee3f6c049e4fef7a5445359f4136fef0dff8003d4fbb8d88da5d4517394553afb980b89a188b8c7656cf564c5143e33345bef33fbaf4a06d2e04ac561f6663b7f5368ff2ad6c1b2a50b2bbf760d3fc954144177f8a141be9d70001de6f5c6a13ccec4fd97f8fbe34e9f1924e8a7c31cab20d45e6960e6f2591371c6a42aaa0c88d4a74af5eb3f999f6172db3e156f2072969b1613c1f7801cb6cbb79e29671bab6bae175de23049bfe766b04f3cc85e0460c6e5034f2fc5692f16df34667bd654aa55f1fb5e828b3c650dd8436d06c418c365bf831afbd5482664f868ae75aaadfdd42dc6f095d4de55efb90bcd27e539764ff3d01589f008581eba2609d3c61786e9c5d56fb17c8946c33d10d5d0163e4e591dd310968b4e6c91ad5cdcf94d2449d91750c990aff9085d832526febe61e31ac8a13ffac2b177ffb19c87817d82b1a5cfc8590d26a8b85dad50379ac431fcad2b936db01dc310555dd860a5e6fc253675547b0553007ac808114b09e0fa31a7fa1c65ee2740658d05d6f4e6df1a507bb842c2114948f0115c18e582ce62e18ea60b665e540e3907a35f2e2008a64fdfc825e8a8909519bda2bc223afd191cf4eca8ef47e9024484b53016fb02739685e3c2bdef8d4d5af8f1dd5f4ddd72dc279474459f99b69324af64b7f2ce60b698978f994cb0be8fc080d21bd8c1d6d1fa7807b398c1da931a4691235db209700a2127fdf444e5644236fa40ab6dcb3f38c4c65c23269f0420d6a602a08fcd66336a226678db1c96c16025e620f1a8cc0c1e8e8f617e5056c5c530255b75981341b1835a2e0a195fe1c6124d01b7fecc85c3891e8619f1362e12954aa328ae4cc73887ed845936d16e287c88927f87afb59e9b71b4b7e3bd387cb3e432ec644269e8ed9a5096a053124715d0f5be173c432d3b811abbb3836ed2874fd6b49f4f439cac6e10e9f3263993ee5c6a2dd8c8e0f9d46a6834f4697ca9c484a572437891a9f70f4773c3172e82cff1c5469ac97436f37f765446529a5a70413d4a294d0d135d8c88c3c9bda05179a5c743a16f44989a88eae06baf6300c393314a537048a783b69a192083ac8ea40a3b66e362f709288d403ae926c4138cd700b1d0a590e4c79118bfc62ee5a8b731a07f0d2a0ee06b9a0e5780bed551df4df52fcf782d6cca8f2693d4d73d274f97c652fb68a7479a00db9e007830ccac769825f6009685f7281c15374e0d396e07cec392f3fce41f056e482f3427c38cfbcec6a01de4960cbf22d35e5b1ce3772c91a381d291229ffe0b34015256a21d4cf4a68094ea08a1d6792d48b96b89743be8b52b272f2ca796b7a5a8c9416a620209a9b800e4fb54d9e8b315121d7d4d64bc96e8eb9a45ffc9d13d1b5733d60c830ec5864cef1344915d2cd9f56e432c062a42ec228bae9328a244ff924c025b5e2138ceaa95d94efb41b70657afd7a70dff5c3007b962eece29bcda05f46608abc6acb6b70d9b5553fc675ad7509d5713f6916c29b6fcfd2f32904d50a433b2368f4f1f504f144c03edc335c3f0461928e7056cb802c5cbc24231d17e66ef081adc9a832ad8050b99a7ebe62aed05030c03e9500770473b1009c4bc29f80ac302b808b21f42a8d442a248f75c9964471fa64497a124a9b4d45299492f2d8d17ec1c546fd861829791f85436a92afbcdc26415053e5de0378e7fc901001cae2cfc2679ec37948a83d2d9432cd866b0b8b9e13a251125a5049142dd8dc94c9476e385928010dde807fd3c380b169d58ec10adae750e0c15e3dc147aecc19dd454c96edc1461e4b5f3bf55db32540445284c84ce946ce5accab635eb7e67a89c3873e61e47a1318fb38e862097a682e6b3873bbf96107c9ae7ab10631444f3e8801d45a7b82460ea06bdd508975368393ced81b23833b2d5ca7da63223d97b2c9cf02df822a27b66999b5cdf9418c3050896a0db841cf57eb0a984d25cc305dbd5c218731508c7b4c0f2db904eb79cd04846dfde4e73585bbfa0e8fcad3450181f71d0b6b39cb63966c681c274c9e235d21bdb4b7dec73240fdaa64bb7973b8a963e0ae014dc299306392f7c30d093334b3741613f29eb5aa0896d7c8cbf3e8d9654c5dc6e1e43a8b0cefb3dc250ec38a660d9d64783b070432f6575586a62d5a2ca31f1296f6d8eaa28c5b922300c1f04117655b5d30981fb41fbf1d1e8c4d8c66487c66e95eafe67e8e775d0ba6b3f26576c412e1cee4b238873e9884bd07a97ca7839df9695fa727f62f2312fb596670cc93bb2f47a7689723ae98dc9263366d59b0af4bd6bc01446946ad6aef8adb9d92374017bcae501218bd911f3a07bf29f57b0ca8c45470c47f6ed40225c7ac4c429dadeac119a8efdf04a63aa4bb37fc26d80951bc7cc7e2b7ddaa37773afd105f276be139abeda097c8c1ab3b71354409094828054582e33532bb0d58066fb7f13e20d5a4a9a839127766fe2a80813d96025f4f8fce080e451adc5ca5ceb1a3fd2aca760bda40c629243f9b9cf9aa14b3c6aa40d21c4d14cd87dfd6528c2f35dd31deeeabe9c1bee4a01ef4d6ec43f66fe84c4700d81c4c09090206be5a3a404e2dee4a6f59cb8061112ede9533861b55a9e990e4354d080a8d2b89f75d5d2e6cb2d893bca11c0913e17697fc57f90e6d967cd3c7936ee4ae434c90ecc5a6006faa0d4d6916d1835c1c2607cc5f62a8a26416c2719606d9ac3a729af38bf7476c28b831da1e8c4e0dde59e667e256702b0667de5fce2936b53b8a670e28336b10ccb86ad66806869e79b98af7a79113a3bc2d3732147cb49f676d7de76fc8a702b98556811b0dda82ddcd1a4528281f975302b9d874d8d56056b524b2c6ca8b01c48bd573887cd6321c0b75c8e61642d38cadd25025619238d3a76c4b6e1723020bd0d208e355eff8f70f9d6de8324ec822151d35d30e8ef1b8edecf9013041a17c1f037a2bd92b287afaee2f8d0301972545614569b60c262cd2dded436023630c009a69db1ac9638610f6bb680b08cc7146680fba87a84f4ecd9292b32e40457c74d0f61f5a39fd8358056bf38db870bfdee1591ede19ed61b32a1bd1b65eaf511b872439ea10c6d26595d6d3ce78b7e0c5368787794d19d3cb8d6217be3fd0eb3a192b3d611cab34c97164c16199e8c2d05be41915ac641ae907825c50e971fc918e2d6ee9c24a4a970e01a1fc00f3a7f63ac0fd416165c02ea07018d00b7a707f10d0a42ff5a55a10e8fd4d4c45cc28e5f4d2347c04adfbb4b85efea9026d8f94d7e44846d0f79cb8e5a67fabbd44417807ad808c9c2d13e4720c7350e72991b46476b96f4e569c1675680dbb4693068709c3302c959ee1b44506ae017efb79b31f6919600bba8dd1ab542dc32f7765ab6f3fad896ed9533ec19e3c08102d237fc9fedca9e8b81bafdbcbc5a2827a774283ad9675a9d7d24604948b922d120d46a6971ed2877def4a04dbbc48df2366de17442443c6e9843eb6ab2cf5cbed9bd7affa59fd59741f8c1cabab2007b06e6ec05c8e0f997e9ea90d2384fc5b490319d5c08a91c4777d3c428bc16224008a06b16e3272dbd99af0015c3e629d5152c62eb518af03cae085dacae5dbbfcff86ea6cbeff7c82c876a209f5daa94727426a7087a4d527061b028251f8d049e3dce87c2a6a433297a9814a3eed8ae03f0f7b9174c225fb48097fbf33fda30257a8891e03a436e24a68bef42ef7dc4273a51709e03b6e9a8a69d76f5fe4bb81c3652b0ad453c86b2f3dc4ff9b617dd2936ed003a258ab70113f82f7af82e21a1839ceea8e3858fd07953edab7b3ade5dbaf3910e81c943abaaf584a7d09e777727fc7c6accdaba3dbc8e6a99a0e0ee3c9cb751ab6985414130137480406c5ffe125f244273823136fb1895e2d801cc915aad3be365785580eb4bca2d4c6c1f4a5a659ba0c9923755aa97b46f2089a58581f43014c614d0d007946c1d419945a579171ad6084a0fef7b8d885dd5a059f609c56c2f99080de3231286a3f70fd875352971ca1ac243c346c295ba27bbba240514b827b040227695402c88bd1556eaf11201949b3d5dfbe48e0e21faec877222683c3d437832f4856d1bfb1d04813ee0c2447e2fa359e02068279e917b2d10e8ce67a442dfeeecd42ede71633363e0382985719be0e62db5c2590622648c051802971fafa5afd6f7d1a2a13c01dc85c4985c5a6ca375d1368f1afe8fcef47200f6ebb6efbf6b6a06ea9666a9347e92f662dc855870d0e22e02f729459fc657bd1de392d87af0224fdbebd54bab9cab4a44630029f727602e123b808f0f271a817aba648e0f6742bc750e225b02a9950c045e250fa54950315ff8c8e22e0585d1ca24e0cc089b3387fae53e1308808181016b0dccedff420f77132339544eca348811aa4683039cc083cc4fd14d3344100c26837772beff0c23b71eee980862dd019a1467708bb1e7d471e5f1aedf4f162addee1e1a5e373d3f74a6b50198be36df3549965333d25ae01d0a31029962f426a6eb7a00487aa7e98803e41f4f32f143e7f417bbe2fbc7de82e6716c018de382e3ec9d8755107c8d7a33cd6a890146ae10a943cb3118fbe7bd5bad0adc89d46cdf814d98326ddbad3d6e66bc7d0c373e4839e3c64cd6f71fc7f408d94383691d2a1d7600c891566bd33bcbd50e9847269ebf9daccac0c1a99749e993b6eb58db73b75edf7ba2ab5b4b7d669b5d761759175765edb0042fffd5f7007365910e5f7337b450cffcfcbdb8970346b84ed23bf40f7c8292abfd4c80e0bdbe6c3b11c6d59b760606aafc3370beaa3630b83c8060547334cdc4d3a6da46df9f30005c523b0695644ff36af4ac3743bf9d7af05673691bad0fc2b6f1ce324696607681986c2699c66040005108085e27f47709919b12f89b0638d731834e1ff36057e81ef740ee62fa2dfd2667399ca8f02a0c1c031988a536f86b1a8172afd5f73e38065be25eb5c160f2a92ee11b54c65effaa0b0dd62855fcb24277e4f688aec82db8f7d8cf05006642ba52200e466201e3b67f7659756d3f6b1abc36c320dbc456206d9390d00e0798f59b26523c668e7b6f4bf7b69298a96881a09f051eaf6e48ce72d36bfb0b5f3b294d224a9c2e324c666ef46e092b6cdf1c6f39c9798746b8fe75e808997384733a1f5fed42cbc771b217d6a946831bdc0caff8964e757a180ba5d324d0b9c1b21ba1a5fdb7891caf142700f98c18f172e785a0dc4458b546bb68ec7678e7e17077db72be39aad28d65f06e8415411eb6f874fec8f467d42b19f99e846fb1a011c319f481de08e3f1b648729805229d0650c84e774326807e90f82b221c6fcfee91836a8dfd3e92073e27a6414fb11b801a442c63ace63b8b19afc0611c7bbfc58c87c9ccc0026536d849a27d719bf92c1dc59fe323444286a607ea51e83fc6af1108a54c3fdc648637fc8c7421523db11ad8f3cad87fe3db53e30e6c2c94ee7c3b5795bec89ba1a9754d82ca9ab4723cf86f8e1f8495af0c3d71dd1894eddc3d21da92d4e1aa44c7a12db33ed7f473d9e4929a5de284f08e51ff881509d583bf5879ac8eadab9109400f75133d34ec96311924c3b622229e2301eb0e809696870c6e80646524a217270d8cf56636f6f3a46a2ea0393525464c32f9f8e7339dafac5ef5ee9d4a503abef06ebd50b6de403669b930c3d14bf9c8635b048edef4d3a50401a37f4d326987fa2e5cbaab9927c8b88dd252311a1f49511a0568ff57284d9b562ffd20eebbe0cb2ac22c073753733f3cfb23bfda2c7267fb12fd82d0caba1f7439d6abc0da80a0350beb5d77bfd6485a4dffe4b132449c2f1cb2441f96fbecc28abf4edd005b3199351b4120ce295ee4ad21a387a68dcb548b4ea7d0370aa1553518939ba384152424e4e51ec7810aa8cd10bd444ea30a32e785e43d287bcea1911f9be035ab3c54b0d6700c263c00541e4abea2a2be1eff48f52cb9f17381b49b56e9f8b4c73710d03a2fbbecee76a3a50f006d530a57a9a8535ac58cc5a9a5d7b94ba85a7ca9357be3dd4a0d5427e52e4ebf60ca10ed5943b4f2b0a46fedf642c3353ec0ac753dd620e7efcf30a6e9f609ad873d2da28012ccb2d2712cd58420168a6ee3e88346930f9b5c23e01d349c3ad87e17301e1b05130777ca60da1f12d5a739d3f3e06ba4f02b12a39e10e0a135acf78157ecc6199ace18cbb0ab6ba7f46fc0b61a359c7fef28b3128e1450a8859c6147059ac76a3c3b3bf174df6b09f5765430e771e7c4b66247e25b88a711cc963613ae3a6ce90089acbec7cae9211436710469d6003b104e34f20ff8c1d5a2d14fb16391db1fc98aabb3123c156914bb35186deb0b61b72ca6a888662adf8efcf3f08fb204b94fbf0eebd282a44c90f5d0aa2dbe1ed6372285cb4119eddad38eae2bd1d23f49de18056bf70ef9da175657e4ad55a0d18e0c31e1c994de14016aa70eff2dda9eb58def9540242d1ade6d0be67e5ea2a25dc72829491a2b10ba58cabe002c84c82fcb7b1f61905f8be3b66a5f3544acc722926855a14f5fd5364df619c9ecb079681d05ffb5893536ad2f8a9bca929ba388b68040a7a5d641d7042a72349a4729653a2fdf6893f58e6af2c0ee2d242b286f5e597e44a5a4f3e1c946c5f1ee5eaac373d5743aa259092b258b2a57d0ba745ec00329041b11fb686eaac26ee124c2220dc72870909d70c76917699b444a93ccd7c26e506efbff71d14e7586a45a98fab033f02267e8472f2235a720846d8238995683a036920f7d2d63512283caeec78e16c799fa99465ba45762908f5f8d6072a554493090b2313927b2648e66cbe1593c78d19f0adef59f24e1f06083685ed33be563e2d445accf9d7994cdad3675f38125b716c2c879e0b5c2992878f29620c9197dfbf6849c1c97149a21fed12541f761c8e19f6dbfcd7dd3e2703d8f22f7274fca79d0cda95a9c4b6d6a5cbeda482df2208d08325a2dca867f4d6420e97b640a983fecef30455e779a5ecf32bd208895b2b2914f354844ce5e9ad76e32b2d49ceb3153d7b652fd32a35cb51156f7aaa0bc8b6879941d3bc52a93364c214b6362dee09e116b87d853b6fa0d093e827c92229f11f8b1aae7f8c5647aad693aa5ed5a55a6f163c4a755b8366a1e042ddbfb6b29f1b51fa9a345b677d09a603dc5141386b86ee3686d2d3a0f61d286c17115448f1a79dbbd9f07ce15bfe5abe4251e9237b35292c61b796b423e739752a8dcc29415af676c2e875ce9a8879baf0f706a75424ab335403221c2f664fa6f2ac3666ecf4c6a92690c0b1a11b7ecd511ac25aa0594b0008f27cec007f465ec6b98817275ca2aa5260be46ff96e2cd2445d9840b4292dd805f1e0db436c2be2f53dd7c469a9032fc6eef2ee3a18b3b504d71f3b574a0cb40bdbf6e5ec4716a11203fda4eacc5044fd86752fccabb1c8ec23693ca298d6906c61fe076f39c5e70ac15c607b0068dc05de61d045060c2a853d8295b276456b87e627de34eb87aa0977dc135a9d3e29cfe4fc386f9c2da62548a2d3dd47018d3d7dc7791342d6dd19146ab23fd39d3586d52e06862b3ce7ac5b188be8f9ffaddb9a4b46414c447099e2e71a0b419f6f047f2c6e1e43690bc2e3d125becd08f9ce1d4286038630f8798a9e8db1cee814a99673b1913d185bebd10eb2e2a0fd7258f8bb6db0e242eed0b1e419f99676c1fd215535477d2a5aabd35a8f40a21cd4aa2626b5020a1205a59e1da107bd34f649dc4a360525c4ae05ed909666373c9faf13b31fb9cc2f79d501072a904892220aef17b9b7f59299e2ed38b76eb049b47311adeabc5dcc12737e0b1a4d3094b49c13e27930572da1b4c5829c9cfbecaa80137406de9625600f072be21fa2f9aeb8935b3f0cab28690a14c79d5dd3c58a47723a6a26cb5390940912906ef7e63416271b2466a36f5e3ee8abfb53d753fd8cb001082ed14f21f453d4313542f5de6de079468987be1177d645f03c69d6b8b3c9e323a468066f79a8fd4f9b518fa4af606f71263c94806ded6d9409b47a9348e7d843bdac9c168d533e4601e2c9af3a6ff4e4d920486c7c9230239e17849fa796937e4bf7f241e8c25ed8bdf4c11e9ea58fc2fd5933e7bb6c272a956f0d5f874dc6007a22d3902020036efbb5395ee6ce44719b6d9b71f5a46c24279a088fc266f9d42b5a71d4e1b9054dd165b0b5aae66eeb3ed86393f8f603aa43ca072e57354fe73029eb970684edadae5efd44630d13e62742949450ca5cac49f3ee0a001fbcdf0e0a309023d3b0a8625c0ecb78de9a191c3ce951bc327b7ed584ba178c0caec1b48d34f1317681c81fe07a06f21a50fc99999eca4805109da8804e023c62c46a6cd863f4f03022a2cd9f7ed3b84781c6eb7c6a84fc47a8ca16a9168cd4aa56053469a92a41686df06cc5cb151ac996e66dd29c23a84b1012a821d1120613560e31e8e9e1c09231681d857484ab645cd14c4e5138c29fc850437e497565dcfb11150cd0944d6c209615d7044db3a2888a762cf70699728481d8f791d09318dcc6ea645de326eb6939d73c2ca4253451ad60895a68eb76c7da635a00ee457ade9b20bd241be4800cda424a8e418926886afaa66db80d933ba45c25be2ae97b15e2b1513b3b6646fd90c950fe58cd71c0cf5c986cd6a70778d0d5fb75d3e8693fcdb84f9b06c01006ff4fa6c4b594a1f2d52f6fa02331879310bde07b87c97565836171e5a0b17d8c206b70df2a1a55cb76ecb0735f8cf7b140c34d01fcffccfb50f6154a51f2dc3f026d99b90a7129d628d0194caa67113ee85d69088a3e91448fd35f9d7f44ff4a5f7f83594ed4ae4a9b48aecb08f0c2bd832abe143c2c7b88f09dbdc4aa18410cc96db04a3a64732a07bfda1f12a23e65535ee4f4fbb24bda3f5cc97a66b0fb0289adbe46600b1a2173be7ae29bdd6793f428b1d75399e7d8e1df1ef3186c9d47f84aa0738a44a2fc4c137cd460d08a709d9cbca28c3ce1a6d11f81a9f1054af79e28e7c7d71d4c2e50b7562aa1f6d43fefe45808c775981745c3c5b734b2688d4c77cfb762a5e3c559e010fcb877a01d905b90147f9617088f2281cc54e3949ac482645f8f65e2041540082d77d0de28f6f86929acc6abb9d45cddef463e2839eb8297e1c94af0e8282ce90af76ce76bd335da4f004db596102895707e1c58d8893ad41b608f36fe1d670cec7e5e250cda9e1230a85bc2be6d6d63e8d41d0a639fcdb7b73e2d3a769f031bcfd169518e5989c04f3e45eff2b028b772c7512780a036a7c6becfe80dbfab2d2a5e1fee6d4b9d0b1f66700120ab888f16406e94ef27b912ed89ec4c12e9212e846672cfa0f203313965eee5e431f9cda1d20b8c2399e4ee1722d39b94a157130674cd3150326c693a3c34b45686c883425a949133e40fa569a843f87580bb35fea19da80406023fa02b5a91e63258532660f3e1d8c5bd4aebc7e55907b3ca7f68eaf0f9e32bdc4076c514f0fce38da518cd216ae35fd08d04e92310a6abc54a74ad601e2ad8d3c03248ff66883a60281f9a8dadd4dc48eb01e06e6cf3cb0cf48b8e1629ac125770e0cf5ee7ca4747b3874ab07edef4cc8a4325c9bd7e8bae09e7a5a880a62f72b850865add24abdc4da8e50a062844721572614542165b5526982580a8960f12e94be44ed23aa4c370312ff16c65fef5a4eea2b7c5b3569e5ec3160aac6504b1adee5282b0c6931ecc32307e63b55eaacd04fa1320af5e477fe91657c15e41facffa5d43447787b1abd9c1119e9cd99b46b6fe5aeb26aaa1e897e1cb7a6c686e10ceda1e71ea937fce75d892b16c3dddf1ebfa1b87c2a38c53a2fc6c5adf268a451d9b1bd2c259b97ec8490d8cfac5de0d0a2d85798647b6e674ec8f78f19d29eb4cee8acbd7995534cbb1d9990ff7a3d39a9f73cef484158ee8cf1650cee9a73c6b832b9f54e88bd63d8f974ebd63a355bbac68544bb5effdf5065e6b2f40731ea42ec01c07c944b7c5d1d8b3c097bdd68e661b86c898a8f0926c93c2070e4dff33f98c56155556db97de69911da509432b89d60fe07089e6a6bbc9acd15538d127857c67cf17228acda64509bb25e951a445ac3106d8ab455f168391f2de1a74968687781638d3d5301b1c29d76a8af4dfb001b9e21f6dc979e8214ed852cd0c3cce5320b441a2ae5a7aff87f1ec671d6218da5a99df226fa3a4b11918d89a2a1b26cd12912cab64aa52b3d29e18500ade2076e589729cd254d96b0e1afe5dedb40b833a8cc7e6f33c8b010e58037f521acd3f0cd5b53121b2180a16ee94210c3c5ec4c0e39131d50299fd500e145a3c1e0631c412e1f9b2cd06995c397557253cbb0186c2792a93368c04b46e97e2fe205db39d8e761bd46de1d32e6200751395417d1f83ace24298efe6e3c0f5a83e2d53dfc0c07be40aaf9a7ffdaf9cfcadc017215d63f6c78d64a0024d758b4b0a4d9276156c0129e91181f6a2f2a5956d1fd6253609057a568cbd704112e554e0bf47140f777ec183a24144d05f1405688d9bdf6000cc2be0507c874feeef4b3dac6f7f0fad397ae1a6886eb8f7f127f585727c904931bbc1a6f88e82b40d731c1607943448e5e89d2476e7ebe8d7563104b5a6eed805bf3ca5b2528e87e25d21437175c3f1dc3b4d7ba217fe7b886b54236345f2b943d7ad25ca4fdcd8f93ca0e218168eb2bc7e5af5fde1779e46253eaaa806f9cc6a08ba79f152e88f771b015160e9cc4d8119085144b92775f9f7b7dbde84691753f974e103778cea7dc5bdcceafbb0834f38301d74f48cc80c5437d183f97e2e3c457091c83b0943721dcf8ca22cb413ce613f65c2bd6332ceb097c88bf117f3df24b70585f2cebb9ae2f90d9115419a4638719cbba0f27f91512b03d968cca16e0611f49c74a550581b1a910e1fdecc0206527b05003da3174c6eb75e14fce9a379fe0f2ecff31c1fae0d4386ddaa97a06604a530dfa2dd175cc537f009399b006b5c4dc6cc9e67a8331481f0b298457f466536d42f4ed4f2a20e1085cf12889a268849d676bf209798608ce5759daf8e9879f4a0c420af1a4ac7d66bb758fdd4388f6a84dc6d812543dd239db6ae8797b45342a5a200f764af8ae301df7276253603ba055ee733bbbb153422bd63141660efa300ee22489512b49f573ea5a0005b4ccee8773d2f92e877697ceef8c283af4fa2c4b6aeff989d27ded84343c8e68826f527073d7dc2b21e10f456015c8708623bb29da718d1e040b39cf75cf19904a677ca44ecfc4e508f652d0352613638e54b59c6dd1f342014f19f96c343641ebc3636af7f996613cffe0cafb2d61331a3f0cdde79de8f54c5b6458c822628a27f4b4ba27d70c9d3b118b92878362d9e380c53ae3ec0aa9d002097a6c4acd77f50554f3ee441ff595299c875adcb809462f3221556ea4552a7685b5d8bf6855c6b46974e12d4e20b3f6ca9a724685ee9436e193d43745ea24450760322eba938c82214c3e4ce56412c962da3c60433d58b65f1146d4f4d2f22b1fe79164643cc974eb8d01efbeb8dc5bdc9dc604fea4c24145a29ea89f732891aa15d0be848e2d32246bb0ee5a0ba07da1c6863d345835cf53b83f5c569f33e60d311dfa1961ded1cf33f5d91088fc3fb2d6b9bd532c9a63a0c9e106e64fea9ed5b379e6f524e41604ca2a60f3f71b1e56609be347e562cea0c045deaf9214b809b805a01ef2c28f272dc7eaca636bd742039e2c0e3963001f9f1b9d23138f810bc344bf83261307b0f031b7e285d2e072c9a440171177daf52a523f98f01f430f0d58b2ad63949a63e0ec5bb229cff839b20de9714fd2503c6565b17072db130aaa6e8c2fc197dd983a32ead8a4e5223e46c507abc85cda4eacca0578c2200ef4eabb8506ccfe8ee7869742fddd141dde99f94e0a953212e8238a5a45d7eb55be90bacaa31a54025abd2539de39089b421f1c59bce82952a76ee0253764da069710817ee3fa7da6a5600121daa4a2bd304a36f4885d85c8a4a82e523c7f69c0c68b1aa06a495ea3e2e76e52a2244f0a6fb80e6c90987437fc9473edabf751359638364448600fbfdeeed64990a5891c8d293f6326981af11324448b11fba821f7c3bf6278e8474fadfe0f0559beffb306949d2d182156691261937e84ba090e25831973a87a3af654b4fccabef1e0066f2407d823852fb112b4b794e8d46c9f3e8630e4f4955a1f1f20d05f1ef802c5d758eedf2ed77402772081282538dc56f4da97c03fb91b281d96559f96822c6f0714c3f1fd94d74abd7f0ac08f36ad8acf45f940495b2e9f8299005f1e128bbc1681e0487e6fe5678a4af30d1b2f21dbfd36e106ea5880427e78502ccfb0abd418c619f2f59d6e20db2209317b2cfa0fa0d5ec12d9481b1b83891b79b8a613f1f7b2e22a1f0bee6e0f8856b087119b76248170b7a04f68568db9ce55a17ce1b63f305feef680bc995001c883c5014ea5eed06fdbf7e7f8268952339a6099d3334fe0e399c951e6e57809ed57a6efd20cbf16f8f7895c789fb0542f2718c52c2559001e870e483034031401117bcc18c6dfa4091dfaeaf531d3dc1b9de4bb587a6e1b423d9ac88f6530fbf5af08d6d7f23f5a378f7e3125e48429413ad69bd25425e9153c338c30f68aa6a22b40690b004b31b24edf30f2c07921ba55694e58120bfc80fd276725ab8ea1b161ed3d83fa7222ebdd87bca65420f2b24f9efca0aadc8cb2100f2ae1f92c50219787bd0fab4f07b0a590100bcfccd2fa974f3ca63f97324a314bc882a932f76ec44112b80ba80ddcb804be80fd91a497dcbef2df09a49212fc97ace786ebdd21938dfc31342e1d330017d13caa092d5fcc95ace143524c2834ac99626cadfe4212b511b83d4aa2b775d163c3d8416e328231b410b9ade6fcbac75f5cb50f3e48395e0a090b529808361a6e0a1197b8b30244222ae56b57f7413faa1d5d873876a20c3812be9bd7ecab06e551155eacf60d2caa5d433d0390a8a26f02e5f2c26f64184cd67b82d0b1f26a295e74cf02bbd311980e0d8ad8353fdf56996d5816095d52380c741e98c9b962e0112121f639d9c2eb4ae8b1cafa37afa02df737231316378b50698490da2d9f4fe4145b7f31d9e19a3089e5c8f789979bc406051e908eaef2a0de0a047fddfcd1dab7f90796e6d7ca8d70f6003c5368d114f6a1d62ceea707398dc512e5061315f7ee0d483a52258fe8680b4e315d910289c811355bd914312251a0bb79c32a0d0456e26046c4ff9b24212093f64dc0e8673fa66db1284311b23a68c11619ae2fa4cea6827b570b92d04484fa88272e5d2567bd8f8a3a97fb50622373786ec1b98967a200bfe698c02af7097ac5f8d59ea0ca1f7b1c6498f4f3e601e62bf508486ab50ab01ba0d03983ee0c7aeea2280ec78802db774de081c6bd206115354fe95234b1c2c4fa5641121a6ec8fc964f6763d28c011ad7a8a295176dae7f0de9731b376c6033b7fd56e192700cb374344cbedb9b28434a3b4bf9f885bb3d7ae25e7413938521be2ed24f55935006ea4c20c94284beb0250be97cc1fa4c05d2f732371615485a8563846ab2d17298ac83b1998e05eaa9dd3a6993db7605e90280bb4447c2857aa0e33a4cc8c6d0b896e9e3b2c4d0f734dc96b17c0b5de9b4c7e65eaaa38f403aabdca42b804aa534782de03cd82dc00a744fb9055e02f4e3e0ccc2d4f5d741768bcf2a5b39c211732e04de5bec19bf0807042b0baf4f3c2b6d13e9388485bfb72870283468bcceae459521dbe02e25a9710d6ff669ebb30112094e1123dace5e2d9cb8f8d5fb247209ce634a5fa2558b1fbc28dff5116a5dd05e9e58d5b9dc05595ace19335a1c96f8df9b8434b4096422c9956f148b5dd586ff1add602b8da76444b446a4bf317b44658717809de460264a9a705bde5be55432863fc1b4aa650daf0f7446f78af3e93c06afd8f812d7d9b12f2f682301881e1a5be0562ed2c10fda7a2f7bb77b37aef71197d321906555269eb19ad955a905c96c9e11bbc8430986bcb896c4c4a03c138eacb5c4075522f33f94ebe28a64ba0b0e014b701e53b892bd13e513b333886fe04c76b4f4339069a9864449a636f275bddd20d3be32cc00b52d8c504822a3880c19e1170dfebe460897607acd0a8b89cee1a24b0126e3c1f3052072c350766fd1777473f4014f8525d2e26f7d2892ac4b9ed46e5306e1d3786144541ffbdb2de4435d318121993e610fa1e4a41ffa7e3f20b55175d7e3da1c05f70813607ec44affae722e1bc4477830d8612c6cf820a1836dfe0e24013677fba1a33668b53f5c80068f02edc0ecd38d76544a6e81cb4d3ac126351ed7446952e0d76fa95111888fd42047fcb1b40560a99ff50bc98b43046495dee39a4f36b1dac8625a7b4d1d5d7dd46c0cef16e875f1dfd8f1f4267b052e2c3d85ae40c9fa08272d8563a12878fd3cd9d8b2b98468d829fe85fdd8d712b8d9d5350298620af703554a63065d1a5b2c970f47a214bc09938b4fcfbe5ebf9c283b2ef01313961e03ec9ffc8a9ffd0188b7494cbf425f061a0e4147d5641ef72e84309a2d0879bdf91f749be247b7eb8f1c4aaa43be282076fb111be794e0708a974e22df55e83e7bef4984985c1e3fc10414f88ce527a2d6327f9d69c5b55e1070ba5f10912ba64ea9fbbc3b68d0cd78b527d8b1f73fd30ce9af6d9109dd64ebce152e499f0bbacfa47ce7cdcd6613654933020f3bfc3942a962649114635c5b1475aa43ee04085065c90893f71470d4623225d06141011af2f5e6bc683d74c62b5aacb2e821ee59154063d9e08708274070593ecb893f05c23cc05f8a6ea9b28126505c36ef30c1589f7440ac749363478adf5e95b2a26dca759725545697ce51dcdc3cbe1756ebde1c3e86a201c4d112874011614c4ef0312335bc0c7b9cc3f0fa7ca89f20ac8c5611b32e56e3e477ba740afe78f9169d1aa66f6c5b488a6cca73cece3bd39355ff05dec955a390ff565b1f7e2bbbe35c06f17b73a33f7aab8a0edf6f5d6c6ecd9c3139b8f70ab3d2b2b9758b98e488a738d9a0bfec875cb63efa08ec4d4f03ac92483d2245caeba5b282651e91e1792970f36b83a746151737e1c49dfc1193e82c703866ae57b1cd43958b8b586f56b0713ace1032d8d3940bad3caf6a4f74b1a55c1dec7cc460020449c75cc56a9c5ce886820bd42e23563b0f6c8a922a999a30cff9c81666e8f1edc2d3325306f05010926463f53d375f78c70710f23f4d16c5c245857eb8f78fc0449dc0a116a5f236c0fadcb7c345d3d663fe670a03bec86c2974bfa564bb2d674c85b485cc608aff578e3d6bc961bf4b52e0554006da7cd6c74351b868d887ad2943c84c67f5488778a92c88a438494f2e52f4be7e923f01e4a74f32302ebb951fcfba6c6c175b35c9b746d8224054d57c18dea39347aa08894b3ac43779cf6a3f2f82f5fc0f99a56ddb2fb64a6438fbe25515a3b1d9da0a5b65724850e15bbbb753f6cae490eab53f44d1ac3d6c161b35729c7c8738bc79db5aedb5ad223d4a10f0a9bddb13db4a7290f5427b47178d46f6269096876b35d36f6f54a20856dce3da0e7e08d5fb22a6aa62943d52602418ba17383334191255f993a209d5ea6e714a72c07956129aeea2f03039cad1e7d23519a82c1a212cd36a4e214250c22c9d78f27f0750bc55a92bfea16756e7fd5c948819a3b47873136fc2384cdfee40bda676a4bc49174c77193291437b8d144cf83cc21108a21b9a88ea89a8fac9101f697b2797e523c60d447b42f708e03312536da7f86b8595edc6fbaaac76170356ae53cd1f5d05c11ef36548280c1430cae411b137a7f26df714fdf35a6fa19107d35c3c46350a7b67789481fe07da67be0f4c1e0befb840c9dd8bb7a284e71a988fd2863e590af78ceb183822199c81ae89245a6f350568a681f8460c97ca9d0a78f65d496d4df4106b555a9a282838138916261f9179d5b779fd9c7b4f742df2868728e605a1f83274c71296bb81d27f54bc7844aac1c54e67bc68262c18a4c7c2a06ad7b839c087a0128e5fbfb40a92a7c0143ca0c0be67aae01cb24b6c3e192331c542979398a64c1b9b4f79accc89910f31b36e1ca3430a248b42746e29e410e5639a116b8b3d823a29a4c6e2fcf404d341d5b41be7c94a4d37ac7f8fb0aa42f731f7e4ae8ad751cde9eb429fd3c229fa98f2c1e44b0b538be0deb12d29aaf2d539f3d03953db177d8f0672dec02feecb49dca9100713f349e41332e8cf2f339d5e13be254a54724af1977e7004a0c09264464e4292632ef0102fe36a65e77e6a5280635bcb8e1b3664669124a62ab6beb174d386f144ea75a65d21ae382ec94f0d2c0661f3843a9729007bc75b800fd3c2845179881db563c9a37213c1135f29c48be8cf22ece1faf7f82d1d2b7466dd4b83e4652f61543fe2f7b662225d3faf93fd659fd2918638faa722baab9b6d6d7825b1e96662c80f7f25f55bffcd4ddbf4dfe51c23e5b5709ab900b900ce93363f185b764360cfbd9a5a271a3b01422ae2fd2b1a6714969fecb306e52495aa3e31f3e534717b07ed4dc1a5d625dd8c1bc0854c4926b44ddb379c10613a6c46c5ddb284ce2040ced49af4bc6294a42b9cd32069672541af2e80f8f1d2b9f89f0780e2d437ca7725b14ba94ec7ca94b34fe7e591f5f931249c18029b8a88db375088a901d0650d04880cee38fe438dc018b3fc08ca20b628fc6f45050e6c6ff70c55f5f5dd063df17ba4133d4591071291116818d51502d07aab9202c3870daef563ac444da29ce5736cb242023178a1281b536b4af75199f41e362ce1588f260cea215401e11eddb6ef32691d76a37a1e9e4a2019e9df910840833283e0e3741e019e064462403f499916284412179dbee4a1f9588b483a1f726a187547912a38081c02e4c0514a00d93e54ebabc92f59f958feb64cbc1b53744284f08738428d39282b14f9bfcd06020c49666bc8275b8b0172b118d31739519787c3ce0bdbdb424f077fa0f32f635f01a07b97c8ae0811a2120278cd8356fe4822dc67219c2b5c1182e68b659c2a7e07764432061440d2a78788ea92e06b970ee9031b4f6a0dce039741d2ee67c680048923e30ec9640999d929d17e06ef7b865de226d86532cf634a623af5331dea74fae1967c60bbb4dabeb25ad44d73e8cd02a7429275382025ee15cbfc16fead161d68bf24cfe0cedc1c6727d9b15277a1b047f7ea2c8f08fd903523b4432292020223d99b32c26ec74af8603c2304e65db9976f6191a22f1fae2baffdc68f55a5e531ec8253ccd37121db7a871103d528a627cace6a6da4570e005a8929d5cba1388e70a134211b2c9e43b318346b864fa9a8f22482f0473dfcd133341de501f31d0924ccf1243eeca0ad2772012d62cf15f0c3097927ecc525238c6f288b087f85845597e4b4049fd2969e63918054b708ae7015e0b3642bb6c5639916e7ebc52405ae64a6a80dadc8a32a9a063636980041989a4f26a5aedcf6ca638baca202ed57d895c824d4e7c167598c710bd2e79e9f771a54e51d636154ef5f9c56c498895f5e98e419068ebd06f638591848f3724c2e7af1bc2cfad4d7033bf6bfe4818ebf02467126a94b70350a0b0327c2671c256e11e555b7c9d75067cd74d84643968a45f26926ac79586ed42cbdd3154462d7872e25bc90423bb4f52d736c9a60420c915956d032e06a7beede405d692d103f9d3e9c98ef0be340d36b41ccc0cddf57aad9ee50df14c3a1795bed732f2b9c96c14c24d1dca0052cd01ef934bd68ac205d894aef9e9518172232d499802c81d663ff9d1e6579bbbf2c463d48f8a5c54350243c38de1f10397e8a21ba78f8dddad362dcc99dc0c0248880ebe711d502ee16e74bafcb957bc670adaf8182d7c26e6a839b3f13198866b3c504205687fd8dceb006be2e7cab03faddcade80d6bfd29019a9662a6a2821c12452ab25886c0c49c5d3a21e88811b821e0d2dd8cb288a21c7eb35308a59008348e80a16eb5fee2e67b7990e1571a489f40889ab1d30d2eeabe24bb62e4204dee487feffa441512f78c5193c6291d1ff707dcc1ef035d00b9d1c1b6e171b1015c25fbdc0aa8fdfbdd54f7f43d6c2c01d7d169acdb7e2a520b2bdb06ce8cc26a153c70505b510a64f2ddd6f1099fa4929cb35b68f891b06659c7ac7d5f699f96b79af9189edbec23908a5353b0e1184353444c209dee8a76ae0c608eeacfac626e2835e6183392905602d55d527b58bfea4088f0b706a4f90dd3155d25be555eb51b2e67a0c2a2df9e9ee9aa648c376ab76d04a08d300d436dea27b3a188c111e60bcfeac6a8462dd7bddc0ee7dddb7c4046198431d3415c4bd36b52ecf4474ae1dd1975acfe472b855820360c39b5a1e63f6bb5ce85183f93a734a9b848071db293452ecd1bfbf2a739847718202aaab8861e75fc92773b66031400899f241a52c86bb0a6bb70216c88c14ecb0b03e2b5867454c0f4ee9681b2f570f4138839253c73639662ed4787a422738b3e911215a7ebf50678b2c768390984f34c025db7e783436a50dfa17bbbbea1ef79a985f83d3d6f1daa465769d01ae2b8b82ad21c9884ccf642c8ddb99b1862bba0189a51903899f013d0262a376482932ae82ab92104b0d7605965a75b7b5ceae2e6bfda21216d35e43854e57da6aba8a585f183f2bfed2d3fdda7c5ffecd6cb278286e11b7baa722cdd7eefdaabc8ec10c30bf2d36bf22c1e69b3727ebdddb0c853ba0466b324134f599842c95897b901bb1394059ce507d9b4538695154d15426b7d59abd5e4514227b72947d4a8309e34bb2b795344ad38afbddfa173f899aec0ab6ae325374da877a785eb74e5151d05b4b00e18e010c6bf889257063475d2c819b5170619a90506e9981556f5e56dbb9292ac6f56a8e9be2635f565ebe397b8f89b55ba5ff86486ceb55fb8e712089376f5671bb1939c6b64aeefd08c45a29f7f6b15876ab3b5f0320a395dd6fc4c5b45f7e7c05f6e5be3922f08db156ef562fdf66b5ff976221d62424b8610d575a5895759d4d8d43e57eec413f36e35c5199eedcb473a39e9fee9c4e679e4b027154a18c9e7342afaaa0e98c739b9a2a513b14029cb2034ad37e905b301616a903e938f3de942298474d14d934c4e616eb722e8fba832557500021aa572e9773c504e2d29ff250b0d8af6bf782403ef5aa307f8d8faaf698046ce0092436e5cde6dfcd2ff60624a622e2c91842c8de25646f29654a5206d0080f09fe08ac15279dbf4c901da5a6574b4d4857b8531ceb6683f5cd7b9335944274ddacdcb671cd81425de74d908ab846e90ec184d0ddddddcd02104d8f095dc1350221e613778660dce9de47c3f752c2cc52ad939c9aaacebba5d1348312e93c085f79eef369d8813895e24a9d3b0f189e73c96d9c775de779fcd910f314e4f32be72db87084f5d0a7c382288b84817a07ae4818a887c0d2b4417d9a38e7424fc7f644d77d624ce63963a8ddaa6576954ab4bb954ab4cb711ea73363864f273d312e7bdc270633fbe813e37e3ac419f29c73ce399944229144d36998f1335469c1cd6b04943a37054a29e5a8afa0eb46d706ac24a69343c486b624c94ecb88939a4cc9119d1b224c68b02438ad1f273db29817248c749992233af486090d96a45b3f4e7a64af237ce3c3840736719efccc7afe23e2ce7086311f117c6dd06d835b47467c43ccee16cd244436139c4cbccde63985b3d94c262c723869a210dcd133425bf2237da64dda8a36691db6c905145ccf488b555fad5146bc49f38c3cfb57ebae6d9f8e49374a5935e90edaecce29b2d9a6e838ef3aa7a3cb737e7d74ae9f6b14c50164da68977206c53f22eefc6e88cb793727735dbf9f86e390971286934e5c7f7fdb9c337da18bcf75ae55a2cbc431c3b4d1de9c0f7fc32012a67560b15decf61942a2f0a3e17f4d24bff47274a8499320e0e9be0d7b342d103af68973472d3973e3a9f70079a37688be8784a15e72c11d7d0639331970e2d1e389f3c2d357f3f3e3d17eb2e1ca2fb5e08e5ca98473db3f920b488c3a9cfe91c011784a7121f54f29e12fe0f4b9fc0e55e1faffa00e847a0fea3ee8464d338adc05a468717bd0d1e4a350f485e3bd1d72e95d389a1e24c340cce7207dfab6c51324d81d392220e831c65889a4f30378058239c64a142ae139fd5c829c4fcfab5b70eec09f011f6cde73907be00ef333d059901f180a39081c5d1ee4fdd15043e0e883cd0b014797afdece59704a181627c03edd450187b41352d05af910c20203b1c466e5030288e882072bea0d0e913f58f920a558d15089362205af950f36a8d063841691859f950f31363f9060950022b05583723564a60004ac950ffcc56a7292134161074cf05935d81161c5e07cae2e19282cbb63be7d8eb15118ea23559e4459b7d65d6ce6124eb54b9fb4c924661bc5cbaaae51deaa88552ade56af6b5d93331e8b20a736ac92b29d704a9a288bb67cec276f993afd403d3ff24dd31a6539f6232562a49dd02c87b4f6aedf566beb1b87e109e461f34de776477d2fec1a8bf6ad876697f3f64faabae6c919eaf4060034de86a3ca5bdfbad62abe9928eb2653adb9aebd75cf6371f38ee9def866e268b7ce44c854c8ad3309a46ac423966f79cec7961ff9669328ce43604b91f3064520e71fc85f6f9f8ede360edc9c829b2fa0e6b7adb72adbf8cbe93a46f16e0e46a12e43398afa1b23025e32f3f42a7624154f4b2c4e908bf99890f26d5752854ecb0746f8a9e20685078e052b25fb285d4ace729cb5d6dad15a66f6696dcfad79b4962d187ab6166509565ab6b6729c9a99bd10b2d65acb6cadb596ab4f2fb138e3adb5d65ae9d55a1b7a425249a5ec4f6e216992d61941c2e6e892bee451a2f6b24a294138e84034dabee5503db4c91a293b1c7df8aa84b72ec1760bdaf0d26b659f1ce610444ec1fa0e3120a7600d791b86e414ac97a1efa6b731e18428fc28bd93a00c146c9b53eeee2aeb4d275fba74b5d62a6ba54f6ebb67adb5d55a6b6dad9bcbcd6ed6d64a7909dd73211904d9bb829c90ea320c6d71a9b76c1f84b64079c14dc1a5de3e6bd0c9e738850549a90bba9a43059244c8637e945e788d0f4338e742a10d28241204cc0ae437a41557f39bcf9366c698eae356bd561fa512be86494897627cfb04e5cc21886432a28c9247d6f342e66f3df820a760ad646823a760ad465fc391967e8643a49b1a557aae038172c5711c88e37c34aa7dfa10256840a0708812349ccf70881876cfbec5ef1b34ce2de92a1624a55cc8708c79d9b576added2bbd6eeee06191c83c43c7b73e139b9d2397fc13bbc38b8d4b770ea0319882167a4dc515bf04070d9a7db177eb4d6724c743e3b0e7390ce3e379188038d4061080c221a496797610eec9286bc8263f5196e14ccc17e3bbc70f4dee33cea954e0acae7c220429e73f85018a49f3bdb855e415b839c863948a7d47370ad35e446765068fd82dc9cdc26bd0a8eb5ed47fdd2b0c31c1d24048e4184bc0ce23de7394897413cebd22d38d63088f7dee7205d7ef7271af260976efa513a7f1c72d275337c092980220a14178bb38443585c651261a7b6523179cdaa05af59cdf09a550daf59718d625ff19297c2212be169251cb2e225af59c9f09ad5c96b5634bc06288fdc3903850627506c017416c8006fc4ace04e6701dba76bcfdef578a19423212d2ec95346b2eb0778062267507c23917ce3b81b37624451aeb08c5c6802e995d43bc52b4872aeeb4fc746374a4321f649638c31c693c2f96291a70e1558e850217d506c38354ed9137a7f80049954c8991df2ad1316290bb45e477eeafe9cba28382c52efdc6787c30127ae08020da66004245af8122b08e20810ad0f10310aef1022ffec8bda5a6b3fa760c7b1cdb499fdc86a311f18cd06761363c9463913a5b596d2ce29f83907caaffe8542ea8bfc14f27c7e28bc35221bd81d716b92708116581811032cbcc048058a58c209ed8b2a4a7044d7b4db4e517bc2e4d96b4ce4c94f9f249af00fdbb4a5354e8d2838ef2407ac07255af4bc7e404213302cd0840a7c5cf07a228c279f0ea29b9fde957c70c75bfb5b9333fc6c052faae05a710c92153b45c17946c191df2e9b69712d58431119e3b8bbc4e5bf99ab152712840cab15bf992b93afacb8c979655a6171f93439f83a99358a69d863ca565d11f7fea4ccee3875acce94e95c702eb1b2264c28a537cd71f7deccdacd71de711cc7711c3806297d7b954fc10aa42ff7e1c885b74669f3488de338af853b30a05dc7d370eab0a60e0d8b3d58e413f52dee18a4f4363c51977f7f58e413bd3516af1317dcdab34f1afbf401d2aa59048962cfa286042f641286fdd6d8516ed86f8dfdfef8004b5fa0743529ec4293e2492c478a27300f94049013eee8aa39bf52638dd8db9756a3ea18f7a545bd86630dd85ba734c21a3b293e29f385355f58aca2f17a69bde4bcbc5e92704a4631abb5c878de7a2f3a6f5f90bc7dd9791bf32fb16f91b5cc3835cac85a7afad5224bf14991918da4560d9f166f0987d4f074434b0f34bcc5e58a468dda101a9e6ea05ec36b843dd47a038db0464b58634663ddcc73fd68634e585cc03aeacdafe4d627c029925bffd1a5b06a98c2ea9a130d0d1a61ca4da36ccaab51b682293a8db2294aba53622cda145997c0949e9459ca124ec95fc26228e4ed2550c629302596a2044c91b168ddcebace446a5d8e747d1a651d25c50725c507c51924b16e6c6e5258ad3ad154d24d9852b302536a336a2d78516b5e8264d3aa16b74eba21b138d5825b4ff1e1d4e4969d4659ffbc23b1b80c6750c68a091ce79bbc6b0134b5c8b4ecb4bd2d3b6f79b60fcfc90378d57ce65c599fcd3e324d38d53590a9b54a46d628eb1c2753135f46068a355d8b0b177b0c3233833e1ead9d2eee489ac9d478b444f93ced329c70db65105a495e7e3b78b446199fb7ce3255f33c5a3cbdf31de18e2f2de089a6c56b0df04453c3690daf59d17008751a618e8f8686d77048751ae10d9d3bbeb054fc5e7155301082fd8ad78f0619ce427291741ad583d4a2c11d39f8d2ea1757a3ac773d278a68f4c0b74c8d53356fddc94b9e25af25ae3f0293caa3f57a244960dcdbc6a3958445f93c5a3c5d1079c9c3c5cbf49267c9cd779bc7a305db6115a9c5288b8491bc5e128547eb088bb2c5218fd60bf6323e2dfec29233ed36e4831f5b643132c03154f2098a23fb0660cf611095927792515a09a76c07a096f34a228371ca83c2ebad93629ca26f9d2463155db54c8d53e30beb85c5a9130d34bed391306f5dc609a75a89b72ef323f3c48653202231dcc4508453ac841c4d0227c0a2f59417d60ef48223914c6d07fa638acf9872f3293a63cacedb1f3b3dcc44cee8a4c45ac5adaca7dcb44aae604bac6cf6a38d81c231a5f55dcc73bd8dd9580acd3a8a4fabe4aaf6f3d6c6e46a9544919974debe76dea2ccde5a2ff6d6b77034519fe17869d0002b87a70cccb73612c6fef0f685d5289b73c75a7beb33fce43f58b4ee83c5f185f5d66bad553fd646cec80a6ea76d23b55825c386e4b24eda21f1704af234e1c95b4b52c2b01afce8f98ca4d65b1e1f233f9292bc6de14712ec2d29f696247bebdbb4311f19a7aced236f69f0a367ed92b73edad23850368a56b732bc54f8c64e284c4214000f043a72192472f98f067773ebeda3f823e738bfc129cfbf14e806ea2317115122d4f907d250829c089494e3184834b8a3f89cc83907aac570cf398dcf731c7785183fca3c87450ab82b6a5cc7715d08c4cde0b9199c72e1c21c64adda74d2a5a3e28ef777984fc3f71df2e0c41d2793e9c3aa3981b0f8cd1aff00f3380aac672810d998b72c6efef492278b1864d15242275d46cb9af988f1d1aacbc919d7282f7e789e589b1a9cb6b4dc36b7cd8716dbca187794b35a75c2a9d116792e42c3dab2ac1a050f09b3d56ad5566bd6fad16a558e1badd6ccb66e107147dbea5eadcb60f4ca1672a6e90a13ea077e68b5ea8455929966645644668970ecc9bbd8160004608d98512afd7047db126fb4aaed9a333b427b4ef2d3371b5216acb594526aab531fb91db8b63451468b27b09f2fc4dc6819e314f3708a613018a5fc6a5575faf9a02ebf1b6ac85dfe1d9e92e3bea198efcdd39caace35c3b74f20c977376d529ed1e30bdfde2e83766666b0ba9de19530d3ebf0c483fad77c7b572487c725a65b741de300491b383820b6a966255da42bc9e1977399b6bbd0b9047fe89ad5dcab7ceac2a9d6f9faa33a90ea3d7cd893b53d5805c270d0618892af2e6b954bbed65a6d2ccf9ac4154dd74d5ddd5b2557e2d75a6b8f46d598ea37aa7b75b1f268c94a4edcf93d200401ceb71e420ef21e38dffc44130ab9466d0e82420edca44b65de9a743bb8e5ef705ce16cb12843c91da5cf6c714ac6de33f686756c1b230b362f65f8e55c794daeaa35d50bcf351c5d66dc12e78142d9a8f0851f65545c2f66d962f6f990df0ddc03e4aaf3f965c0876c140d47b186a3e9c747659d6842eeb9170eb13661ad358abbf9dd70030702b946710ee242e93957b3aa5eadab5a17ab48301b1b9b1f905898e459624369a33d127af1cc84f8d1ee60d1f3a3e5b1b1672b7b1e6dcf739d4d69f542ae693c07854340151cadcd588974614c6de74403a2bd0fec6938d92810780a8543e88dd7ac68385bb55675ac51ecf79a46b1d6d8da3cdb9b67db7a6e58a3d8ba5eec7687ddbaac4e8b7d82fd836903f61dd1b067afd51acb295574d6d66a59d604d6e78e96e59324666bced700e4c84f4792844749ce442296042645cc878c8689a37252724c639fc9d2c187e5c3ba01c242826e07d6e91c6195e4ad4bc2a9da2179f61a268e76566d21f9e916641e168bc562b12ccbb2585ca3c2b8a36521e1547bcdf951faf8d8d1de60a1f3a365b53835764a5846709e6bedf9e9b5d5c94646583b8598444c1b1e78903046cc27c0d8096d6d0f3b7b80ac420b19cb61734898952cd02c1256551e463159b2a4a7478992244f596000dba9b3d9ccce6cbc16ce8f94b2c636d98ce65373624df0536b95d5d9720471473bf38c702a090fb7a205a8052115744eea4bc7c5830b2ecb0b74e4cfac35734d9b9f9f160fad3bda598d53eda2d96c6667123603326b550db3beb4990d7334e18e7606fb51fecc2cab553aae97ce0b7645cf8f76f6ecd64b62679c923c57dc3cbb5dc2a969998c449fd75d91b5e1900eac6a589b638ae8a4cb5887689f55903f780e41ab84f0556d961c8a823b4ad88c5363a5d1268e76f6ba04a71a516139b8986be256a070c74aabb4ca842b4dda6963d69a51c4b021c272c4d44188146a3d9c32e9e0d2f9e11f2cb23579b7a9db9e3f6611b41f3eddd1cc39670f169925053de48cae58a19a72f80d13eb8e76c7a4f3e3644d1dfb6229c1ed649cda7cb33be19c3b76a755b365b23b5b38595e0ceec8d99de79af39576a2816fccce1e4f1630d702e703f092070b257cf792c70a24ddb1dcc89922a61336c938715c126e67d3ddf80c7ffdf49d5e990205a272e1c376a50b76715c95352aa68696b54a94b12cf446ad7cd1a45a1f4eb5e5569a805844e08443354e519d9f5e41b99a3ec2f0d20df0d22918239b383a8441da603780119e55cebc9ae0e8be42855b41c9a8b1e274a2b1667a172107a45b087fedbc7f747bc87330d7d0635475543d81b5f94f36541e586ca73cb0a812855b7fb4aa0646b173b5443f8ec9adc1f39072174e202cb2cf1abc677ddb40ef4b2f9d010b6051fac9864a258c748f45897204093349af677f74ad9bd4c0624fcb4804b44974991df2706a3f7568437d1e589cd31907373e7f14f26310d38b3ce5db61e428fde91085a70b825f15d73a28052492e241f82a2554e25eaff7de906331f458bc63cda3f88913415480bde4a182cdbfe47122fbd3f5f9d753c0d30d5f5889dfeb722c8aa3114a78e2786011e4a290b2081a8dc4b757ec91bcd72fc78526702a01278f0faeb8a3c3c3c138c5cd786baf4b094a5da7d66f7784fe745c5ac934c35d3835ea46a0f40ee47c7e21aef3c0b1e63def79eff51df26f7842f11c38bfce398a87bce641e0e83d68e428f773f9897c04d6bc080ce2fd47bf03715306eac28ea80dbf2a40be39751008e49c7bde83c68777028536d4073928f45c38e2da2d64edb679f520a607397f3a40e1e65bc843d392e9ca2ebebd6fd4b05f8869970e4d2a04127eaa983dca4b29aae0f96e54b9960f5cebe3c9da9087928ae358ac6ebd6dc8adcce0ce97a78dc1d3e6349c36afe369933f4f5fbab556fa66dd3a0f95da74d62b4f125a2f9fbce4e9228cef6ea97e555cbab9e55803f355c0b8ec20f7fc07a738af8e03100f942c8238b4a13ebbf452e7ec9ccfae3bae731a4e81e369fae6414ccff9698636d49f3e431eaa6fa0977347b1ce502843334c2a397701e28d1a38356566e01487d55f8841408e4dba8bac3969194e5c4adb85236ed76ecaea643871db2f8fdc9cc1cedcf3a91381ba8c9dcbde2e7bf4311c1cf1f2e3317a9c15ace0c50216fce0e0bc8a282236fb54e577c8ccdd3c27f3ecaeb5ca96d38916b4c0070c9c973c6014f996973c52b879ae556c04470a2ba4f881109eba9ebd4eb6a9a65bca188bdcdd9486b12a832561e61b209e5d8509772c3d77e318619147661961b95e9c92449ef9872b99a83471b91c2c5e669614eec8ac9655caaedd534adaa32c3db55652c9cdade791591d525797050cc290420a4b2ba5b45228402a78c2c3c304131c16c278e2092490f8f9e189134efcbc7e268c4629e5ea4fa3da69f74fab2e779b0b5798dcb1fe7cc37e66cdd164d71a7b2de2d97f7e7e7e7eaccdcfcf8b14451249ec70519b024d66451821a6de362f79a650934478c903c691b725864969a4c5627b1c239f3b79ee2e9c629d238c6a97371485a70f490e0f121d2a9098220858d428c12384124018a2964384c7cd2e8e20928406c5932d6690028a25a2480210293801d310879cac1c91840e64d0040b9b2994c0c54d148cd0e4a6470920f082a52297072c340173a20b22787105058680440f7e70aea07d61c3b4b1f98d9330121677824002048b9c2370921821a7e7013f3e412809430a4558dd08ae7fd734314416c460a266031d0cb16aa7e5c0092b9e00c4133ae8c1aabb218a1006153a70c2248a55fbd46915a9083f20420e9ab8a1e960d59e92e48ed3b542c51d4d23b5b45a50baa66bea4c17c34427e85c1f9d1c9b370e802346145992b863a5559a8b8469af3400d0247c77b3b86e8b532357615d5bcfdccddda29556699d6bf48223475cb56977d306420c9a68024444c605edaf5004a538a0b5d65a69c541ddb66dabb7a6564ab96a69a594560a85d79f3703cab7fca35b76cdaca8a52509d3ee13870d55a48df6fef631fc6eba7284bb63ea16bbe8f2a7a76a6020303e252ebbb4d4443f257c14c2d3097747c944af8cc59ad9933aedf9d4da90c5da755a20d8979d31ccbe7ace704e5f797273b0ee0b8564034e4a9c3bda57ac53c2a9510619e44cbf74f0d37348d97da1906cc049296188e8bc5eafd7cb5fe2ab559c7dbdfc258bdcd1be6a3f4ad8cbe6b04ab2ac76e4673db3ae1cda111f24b5243c4a24f55c1e10649c2c95f807df214597176272d4008416243949a7eeb499d04997b1694fa92c75a05945a31c4c0313f9d1b320bf40c2b858cc6171fa37625105350a75cf47eb1e8b25076c7ebb542a954a25ebfd361c876460877c296168a86f4329614a3e8b783e8bc899b9d348587cb1c8e2fcf56071fe74949aa704f606b612161bd6aa96318ab6ac61b2a79b97dc3a7f3bb630891b5fb1b492a7cdc3a2051ba66244c39efadce1d4d8369325278e4aae3cd79948c053bf38ecd764593b59fdb23e7d6cd75b973c4c7cbe5d9c9ade473a8776dbb4ca6f44d68fddb22c201da70870947c9c2378ea964e224f3ddad3dd1b5c2b431629e520a60dea54f8916ff8bd90819030d455a6b863db340ba76dfa666c9ba75df8541fb948ce7c4e7d8a40ce8c60e200959c3a0258c5e2a41e9c4a7114bf4e434edd9f989c583a4a2663ccd3511cfd75b880c46de71ded2aa1929fce225b0197fcf41450b288024ebf60eb278c075a709cb59f9c87a68360d0c3c724328b4c1cf3a9df1b9452d74f29616c38f20b7e4e1c1667d35258a5a7932e9dbcdf107e63789a80a7336c66bc5dc093a7dee30710263ddf6de06973f9d693dd51c268a59556ead99c1b833b5a5617e394f5d7ce0c368b559611b0832edc7a250c8b10a67b6fcc0dd3bd59dcd1bea0fec8e027133774458cba02d60a16ee567fcc6c7ecc66f2c70708c6db5cad405817788209683e7caccc2e4b6e03c9c8a22e9951e0fa7347dfe9da08add5c3cb7127b8218cc3e9a4cb288304c09cb35ba0790123bd2a9d3dab21396297dce047cbe485f5c27a61893e7e907048aeb72d167374be25a7a5a5c5a26dc1f996b1c5f54b20791d7961b1685de57547995a8e96a9718a9dbdc11a3a2c5a99279ce23087fdc6768de67eca64b00c192a30ecc4e092a1f2c27a69e9d4a045d62263928e8e96a4d75bd7d1b282279aea349c463884bb4f5ca681864c6db2fcbcf54ee5a4a2225363950d999f1888c4c08a01a7894d0c3932b5186e623012438bcad462d079eb2adb7c69bdb83835ca68bd7d31c2a9b60113e34b4e0dd7ef70c3a9c6ac51d64f3ea306ad51d6b3c1a5e12776ea40d4ac5a9c067862a7e140d4ac2abb7bcd8ac3d303aad770e690a6c53d1c42bd253cb1cb558b0fa1e1353c710b6802656a1e923bcad4688072556984b25161147794a9e17a21f35b469db73590bc75999a9cb10788bdf571a6f5357c8cc1e6adcb1a5ebdc64eab7a7861b965972d2d3dd40865a35a646ffd06da430dc54659a7a15c7118b251a389f32bbebebd134511f5827a717d3beadb41ffa525a58d25a48a1476368d6a4fb9369a40096de87ce847c27821036d86244c061f199ab08a262603eddb464cc6cd1d654f8c293369c2a94fec7112b3433eb58288153734b4d1f33696482b8ad898d990d988d950c262c7c8b0d81e130ae18e2f2d9dd6bb60a8174f728a654f481363725b3dde9e71a9482e511c8722ac228534b246b5f70d4ad84313c19db1f976144ff1b173cdd8b08a46c9cc0d7b1d8ea5191b49130b6357be1b714719d90d0aefbc64642f03c8c01cc3c78f84691fc00b9ef4eef3b974074d8c06f1390914a789c91e99e99afe05184f7a47001aff35e146008753a71b08a089c99952045a3e7e6ebc8475301e0c015e5a4a2b897547c9e406872238dc509a8401b22361da1904df9f7051a650409206f8c819cfdb15b0a3644a21ec3c12a6f0a22585208bf142fbf57604b0c1d9f064abec4ababf7419e3c90e06ef63428c046212a6ddc74f0b0c8307c3a7636bc100defc76809c3d8ca263e1b0385fbf04f5a19e279fda888d366234b119a7aa7f3433a65122ebe154751a0d134ed59046f681343d2cb6fc4aa384459a253434161b2585869602d2cc50401a194d2cb684e3705380c9bcc3fc9b31487dc57c3af885f6d3993fd1e8364a0aada492ca0a8bdd4c325a38cda051a3c5410e14bae0028000840420a25eba01bc0043001b31324624250cbb953d319a18ab70c06864344b687c689c2c6172d3f3e45bf6f47cc79a30f951f634f9963db5ef9e9f6f2b6cbedd568ac30d0e4538d54d780113f144c2042dfc12d5e3eaf2baeda38b7b9c9a53fc90e7760b99efb56a1872ac9f8ef3d34bb06fdf9ee3d48c97524ab744bcd24fefa794346c4f43707679078d27f9845e34f4fa7eb58fa15748f2f1e28e765e72a6d4d5104493332cef792558efa0932e6368236b78a156abb650c41372a1d6c7c44ba7af5132013df1ede3f7edf3c828e2f9760a826012a6bd82e0ec7207ea489876108b3bb2d466b8e4ccf4a64cfcc852fb0675dc8bcb3ea6d4befd24536a293f24188b6bc6cf378d0f6d2810af6f77145ce9326e26f50e77c8671904ec903f5bc9789aa157923d97452e94e23a0e9c3a31f9d2b79b7eb07c7bc80aacca7ab116a59e36dc395fd65a724979f2e4c9d34b2030cd909b9553d427575f7eedde83500b5f10ae0c42ebc87f4bb82e1c7143b0108cc5f63fc26540e8a983e257709c36847e0b05f01ca76a7eaca93e9f476be7c53c5a2fcadddd300b8311955c4b678e56bb1de18e804021cf743f91e8db41471f0d9fcdcbd1746fa93b8e34e79cdc5cf298c4a5928aca542195462a2b2a2b2b2b2552caca0aca5d595919ad88be9595150f89ee00ace764ec0b79eb8c51ed2d845854267286bdbbd637ac6355219f5459288cefcee6dbc7eec6c7d00bbe3de49233d4bb396faf4eeacf13cf6b56d365e79e0f51827d88e75d3872349f775f58b39a5e9d716a89e4641090f09336613ffd00370718c1c4f1e9980760d150c367b426b5d62819a7ea8c6b153255b79062c37e8623cd2208df4e41d783c2f18638be2053b730356a367dac3fece305bdf4ee4ae13b06828befda93917af05df566ec07232f633f40f10c9e6668e353df591f279bc7ad2bc09ea92061da3b8e06efb9e0bb90c7600a10222885f1a16f860c86bef8eef3e6cf936f174991a83a9130eddf4f50c68824e177d8e7b03d17f90ddfd7f9d7c3e721b9e06d54fbacb50fac352fc99dcfa847c9992a0509d3defec22fc413f603f50a350973a7705d586c0fe42e143354639d9f1e72fd74d0596ca7aa1664f58708cbd68a7cbb2be79b7a71851fbda639c1053fda9bef2f583f5a23dfb6655d56e79ba777e7e0dbe5e8b9cb48d6491749ebeb37c7c1fa8188e37c3c1c2dcff33cce455c085445e0e713fc1c3cc04dd7191477acac5765759d144946d6a78fc0ca84c5be619df117ceb826dc1aeb1a33d2fa3eee45a3518efe40912803db8b2a0e8b5d5b2c1a71b557566de170ea4b1de1d407561c17a7a4ac4658eceaaa3955a79bd37114b0ba1ad57ec1da6a54b33e2eeed64682d0dac72020b8be7a37c3b6598f3aabb83ade70188712bb3e8caa2e8b898912e6374c31b7c5caa81a5389e252679f2ec2294f36c882fef3d3d1d550038b5e4e0d9c8ac51a25caf0b9db0c610daa36c2a8ea9f4b4e957cb4e2a389452412856329e4da088bb58d7ce57e6309c73bda74a09f8ead8d344eac559cc3a8ea957362a2d81d67cb10777311386312a6fa64e9d03131a2e86e32dd5b4be10dc7fbaf12bbb4fa164e5f400f1a4ea578751f1320a178f5209c1a79f58e045e4f998f025216b71bcad18c7d205539e2b24ff768f251d155f51a38af049351bc767e7b978888da87dceba4d39013188ba1d09c9e177ab019db4112621d95bc82c52f4ec231eec1e1258c8461ac84653c631a08c7f5e96890e79d3c8f08ab648f2ce4b308a75af4433e5f49e60ecb62a12570f1e3c4f9d012784234144af221f7267ff1a1c6c187ba3d9f20279a07cd5110c841e0e6dc711e084c42e40c32780a65ece8b4879c5dac1279888db0187229237693b8f19528e49b19724b84c590ddbcf979362c865ca5883bb120673c0ff9cc02f7a14984537c856923c4330c0913729529eec83a1ff290b34ea87a88f390334fc8bb241f0a790776fe7d9ef779e10ed744561839c77195f3cf455bad278e736ec49946e054024e1e1fdcb9c329501218e795ab951b85e3bca1ccf9a872214e954c33443e1281d243e0060a85e86834f21df247e1e97a0e23df7ce49b5ff79e1332ce17f91d71a2ef0b39078eb46b2f140281f6d3c16d73e3363b848e3ae5625cc45a6f18e9a6bd8009f890b931438e2354b8a34bcca45f53a794a70c8122fd46b3d6ae9b10fe199eea1409f9917e3a4035c5852390326a4e3f4d6f1785b2e6e69bc5aee15653e455c0b863ccf420de538f610f1bf439c8bbceb74f474729a55e6bbec1d113f2e437ff44a0f46a7e8241bcf7bc3790e7e80ea4498cbc8ebc7e3a4022ab46ceee32023f1d3762742efb1823af53ce2b9966bc50b2e828139e9f56bce4494213dad1f8f02c0e2cf2b0387ba68c1e7925d961915b392e1e62338b501c58641d58641527f7d41ea5d64ff2443beca6b3d63aab4f7b342cfa60916717724e6e2d20b8d5b7ea396c01a079a8540d1576494d992292000082200043140020301010080563b1582c94a9c2ac0f14000c91a24a72489848a3208851104386186208308000036004446664463600806dd29e44fa2773a85c0e22dba41633158dfd1caf17c6152909806e6d2d0b5b5cb74e3cb306ae3b05ae8ab11ce70be447d92275883ea948dcce501813caf544a155e9bcb52eb1a53cfe8195c3fd41185926a5a7789e3aced3112416c00a367bf84ff79208702a72a5c07a4da403c056330a149a6172111ed112bcea2461c744bcf7a6e00e89f0ae71d806b6132a32ad3af96e121552b30259e1fa3e42d2a7c1480622683f6586eb642b35c21edb57ebfeadb8676afcc09b4d5b541fb973eea9d7528fdb7b063c73e2dfeb3716fe1a542c20619ec1ebf9a925bfe93714181e394a2d433a82ae4578eb357d8c38debcd05aee2263ca71f1f22332e5783ca9f452b97cec15cec2bedab52bbaa612e9b2c251c90b51fc31d3fe01aa1f52cd3b901b7c68e73cba6e19ab578bf180ac45e23f77130c6755fad7f2391231aaebddad6165767038528d3beabf5707e5512b5f8eefab5183405c83681cb75f456e7f1bd2e5c12c35f8284670acfb7179c1e0e0a65b3f017975eb08e343484d9cb442054f9c0b7a89eff2d913d36a00c5d6d3c0068b4178b488ba634ad34279497e83336001fc25c64aaf84be90376b6f13f45a4778bfdbbb56e6c2931183c5b56f605af24bf8341766197bb6b0e25a69d8dd545dd9b7a469a696f9af5bf701b42fe70522f6759722d8b089399b34535e64791233704151cbbc59663ea50935a88e5a367ac0f3061bb6fe760c05eb05c65fdc1c5e1dbfa5b640a93ad7eac058427bd856df5d9c8973091d5d24911d578a51778261faca0a309ef00242d66c145f493c7d4ef7b0f6f624ccc9d0aae53a297908c57c6356a0a35187fa19e9c0ac0cc3c825bce854067e13c1084f30b465c6a8d9d990123fdfa90b3753ed53b3e302d72baf8eff54112cbf881d1e43bc8fed987d85bf09f79bacf6c72f49622c17398708af0589eef249333a152227fbdab8bd9d318cf8965fd58ab090788eae1d59fb914772ce82c4630b4f50b6d18df5537329a8605248ee5c41447c30b2f9f6cd59357d65e142fcd8ccfcc50e9d679f21a607642b727a01ef40f7bac77817ab1d0d38370b34727c6e1adcfb14050f92a7959f7c037900b5782de14a2e1a6d33405bc4ad82dda9a04a789915aad39efe143d30c3b8fd422301917ccc6a1d50df21909b8c2a17d54ee7abff81acd093233afd078060b56d312b5af4955211218d352bf213da89800f141f65ba9a571bb6b2c0395bf847698340280a6e6381b52f22a9ccf41674196a5009d5cf22182fed218d72a4a9191edfd9914ced190ad96b1298cae887d393a9b1de51263cd9636d12e488713a4daf8a121646141a2e4d8c23edf482a29f351a4faa997030218da670c0859c6ee99d0da2a13919789f500175e62957dd8bddbc9eb3d3694581d268877ac19ab9977a4f6133195e0d717aaad67097e934034bee1882a12ec2f978d81909e0388ea3e245208869311f8314fdb6227792bf4a06ac005f0e455d099fbec983ab5677a949c9f73c5031d301c2a58aa84f8357f194d1c8217f9377ff68112422ae9e735d9b4f48f9e3a9d29537c4638f5a7e2e898cf0c11c37a8f1060cf3eecc19539226d1fbe612037e18ff4d9db1fc174a4d872ed94e300923a50b7bfeb84fcd2e9295b6b1ef594585a970e91ee3502768525622ce2c06fc4ad90a8f0d677cd6ecd49f75a7fd30c07a7fc3d1452ac6d4e06c49763ea138ce3a445e70d6681d5f0eb027de39fe5b0b7d3008e1d76994cc119fc3a6b1b95852f2ae6e9f3be829309c713b6c77df0abaf1eaab364ca32f47853ccef7d2625836f699f520853142924525423318949282208838490abbb991db960a0a71f76d88ebc5b60a060f018232af571d9a623c3eccc812ad043edd645e82b25659eeed38d08e408c1ad3c44f433e3a8304f75f530baf151bc3ce9ecdfdd1a04307596162a5632982a0793dba6ad19906ba5618101a6beab790e6e3146090f3342d7f617da94ba44471df5ee20057218fdd63aaed089751de520673a6f7050d4419c88be0060c1451a84e1e46e9f492be509177082f9ee632b31c7e438a7108ec998a763a759fcc8a2a2823d37fe92a3dbfbeb934aac1c115649d52ddff9ab3f3ad63cd88c0c8aa8949b1f1a598644cbab2fb2ff81229dc9b6cde1fab4114f1ecaaa64f9d88bc46fc3e4bb59dee95cbedb8edacc00a49dbb71caf37313b5dc5b324108619bf1bf93dd71e6e00b63d5cdfcd25b576044c3e540e2a3b7243b73a4ff9130f9199b89907b94c9f258443692ddaac6a430f69635b71775f8825231ea0b391d4b79c3a43091506453f73b113e331fb0c4634fdbf9bd1bf595b070fc308abd52d0e3f960eff20eb1774b012cf0895fdd354c1325d3a0ba71185b04104bd55f32754b4b8b07ea23d675494cf9680855534ac3b3f56b9b6569f3fd58747ed9ba82029e3149713fd20f52dfe61d159f256277e6f10e9b7b2ed58ba3973b90bbd2aa12e4f2caa7852fbbabc67a126d1773932f0ef9fab629da27cbf0ce48660dafd9bf53affcd7902d7d7b46cae077a52aaad4cb3ca6b8b8d83b9282528e68da68bf3c829475c7f9e9bae587729e71867ab5369ecba26f97b6523e045ee19c712db3d8a62424915f5b83386c183eb7c1353c8b3985db1d1eb3b32ce9d99581d8c345e563ab144c067f585f087e5e8b4c6a0c916dd1a8c100c14c6d93a7375f70d634cdbdd79b942d88b51b3381fe3b7e406060716dbfc612e90183ce6087f45719616900dfaa09d3bd5895ddc8ebd1beaff6c63179e08b87f33515afca036bdba968b71edc85853dc75025af8a879d55e2e9f748a71fc4a9367d0625d77402b393d8e586b7d81f8a8a3dd5473683145a30afdea6d9e8269f6b5d0b18bbf23bf41a6620f49a1f1cfaa344fa51351d68d5c7c53e9844886567dc789d36c406cb283f4461b10b95036088c2cfda478221f38a998af5de2e40fd4f9135f5639c4afa0c405e8d42e7a8e078b0e4ea5c3e5fe47a599e0d13ec36e2b3cece2697aaf5b28290e47d2d6e2d001b79e64d98e690a06918d435202ab28341166e9622766b1cb8d67506ede01d5553c14253d8f92888d191663d024c37c7d7f90b4fae9314eacbc2230371cce886b89cc2fb45ea977374e2a8b9b6436bab15eca712768d71e0e22c6a48084ea2049c24bed9f115935d9ce615c0db01e7f24e8f13eb54498a4e400342bf569f9bd948f9552e8fc9853fcd5f922a27a6bcc0efbcd40d9153ae451a23ee13c102c49bb5d9b5d9f408c08e09fa6c51048ae172fa5830aae948f68f22d2075906f9c204e4398a2302d38110df827705b49b0f315b83b1a6ff527a543431dd30ea10a106cb59914f372ed69045f3ea59ae3908841befbf356dc2bfe173f8d678b1d993971bc6fdc972bf13877296453769d7e8a21032dfc1bc35e4f03dba7db96dfc78fb360020edfe756396a57b704c21ed69d9aa98c23c59e8001feb97d707b9efcf7b607ffd994cbad633b432621814fe3ec762af0a65535ceb68b9cbc1b3ea643d14debeb1d353296f13d3902eed4391f5bd44414ed8cc59925011f20eaf0e33bd71f66db5b4fc90d0f4873e9a2a345d12dd5cf7b38aa46d0b89315724e5917ca7f222ca9ff4b34cf486d36f6036858f9519c756055e85dfff991e67f0aa4f2d497aab7ed30630dee796d21d866523231242d6d3b653c21abd1401fb52f1fd8c4f7850115ad69b6f6a54d54e882dc7e87c2b4a39beb7a742eaf3f5f009d3d514bbeb32173eed39ac762c2a00542d1756cf63c4db4e04ba6d2fbbc2deb6ccc71db471618c320fa28dc0a7c6c472aa683d6cd32e0eec9f18b371ee26696e6fe6eeab8e9f0f1b40b2250226af5c809b186c83f310f941130ef5128a0de1907756582a84692cd929bb23283fa5f0902c1c55560311b610453e43154ec06d9060dd2b15c739a438ab6852990305b30837f9c6866c769d6741272b641dce28014aa6af38ec342a141c27cf9d654d6e83c9cc44d6c6701812c7a9a80cc141b18a4ea7f9f76b8132218a16353f48c0c5c30b2b7b7a1c3bceda682d4d4a4ca9a67204267e7e1f84a039f1ed47be05c6c0b8da30e59a1b1e146c22c65b8ff3a7379f82b213516b161b20891738128c32a95aaa2cb867aae4a5124203cb00d59bf50ec08253f571aea995deda13773ed72021aa4a4f9f89cfd350635be3af82e5b2cdcee8167cee486133cec6e5330fd1adeaf3616b0277bbbd050c593d599438e2a14be520f61f3a51bd13e80481a6d72466527b0b549cad304e45b365fb6b910ea097bbecfc220e9eb0ddb930b3a78236649229b2e6735cc074f1e64811e1ae31e392beed12507ac452a1f796028ef5871a25a0fc3bc9b05e60b5da18fbb4e85385d97cc902fc6aa801c37f2df29436fb2af3c67c9fd4ce958c69650fed33906189d1e3a74bc61c77e91a676bf92382cc2d9312e73fdeb950f800dca034944f72c0e4a3bd753b240c0d87d55b32088c5efbf028a404d29c94ac9fce2daa53a4a8f4711f3de89eafa3a439a1bf557c2bdda67d24c82554a1169fc417494866412b97e7af5c43cfd6c1bc6cd55b6735e5f2f44ca086333308f5db8b096c7c8c319a6a9481748222cd494f399bc66641163e6fba8a6264b4560722ad49b3919717886678e1f1e652ca69989edf13fa38c0fd1211c87abc4c96f9ca52b9c92e9e5f335a36390205f0fddac9bc44a0e8a97dfea2afe71dfc441110b3a83d11da0a6d5a8b891bb4020d1db470238c23f280b44178c287b73401d7c1af2b684da488b575a7c6adc164fbaf93395066ee58ad07d1fc4136c106bd6e2e345aee3a26f978352995b97e2500de752879a997da298d9e476a456167350b26e9b24239853b825ddfe08aee2c78fe60384b81fba91e918281400b2636df61428c3dc3d3bf00596d2ab3a1816a06ae06176cd1520bc8c8b875bc3bf7136a2dae63d94bf8ad2b886b6e315357040606acfa03496a67949ef8870d2919d022831b8a57d0a0caf6b1459d4671e13ab37463a0444653e16b5dcf0242166527643839d6aa2ae70d21c0fbd04501c25b938345ec7abd70c06a4f82f6fa0d780cce16051f21b2f96d289d3416c26129962e55ad565090b4cf094f9c3e95898d8f00e9d278fc1ac81fab2aa4a0b40080886b49a8a414f4cfc30d04a3faed1655cd222a771e1cad3f6a3651fcba3bde94462e3e4e5f973996c659117fb119751fb788a123f53a0a19d4ca8092e5913782300d5fba1c732152b2d562f3ba5a4410727c3cc1744409a94f08b4c0abb2e6e07eae62133475ea2cec0283a1f14f60fa1a50f599ed1a130d27a426cb2562e0e43fc75d6d21f1d366200291d3824ef195dc26b53a92df60ff54580d27f5339c561802c5a412fdbbcb91cfcd04e3f50aec86449ff6ca4b37afeac3772bce58a279522cb5c1908a676d8c703d1d91607af044b1140a852dbc8e1c64597dbe261637a6c762b924e5c3726a097777f1f4b571d40bffaee266fdb944f96b1f817ed9851a144e78c5f0f9d22a74e224c69cf8617c21f0184a731c9a535ae503fb02eae8453a2f0ce1243ac9fd79edbd77984b2a49e2fe00b173060588b16064ab7ca2b6cc5453912494cbb34096df06d56ad30189194083065991f81ef166713032e9dd7e6ddc0d0903d0d38985e9ce3020774467b49d6b094ad96402a798a642046089c3d3c7d828ca4129a448402f92e6b22ce2229170129863d1efe4afd1c0c5ac353c5954e2592f26ddea7cced15f985ec85261279722a076b8e4371762e5a25a31bcc8728851dfd4245e6e29162d4a2f50ef67d7f0e440dc543fabe22bcc7a0e1ff7b9d4c08f480d823eb5e3ac9d7c23a57816c3bea792466ef6f328d7191b9c4a81efdaba3b9fa8005781ff6a4191af2064dc4b91ab69c07a671ceefc4ab7563cac7443b034203e4f50326e653ef967123b124ae6e79163dee8de85fd572529bf82236f73d4db4806439e97b25f95e2f2cb1ea25b6369345a1c3ca48a8784d7f0d9ec491a4c3d705c1240eb8b692c031b9b6011a274ea9c0f3c766955473725a19fccd77b21720a9031838b9f00c9e76e0c11600c56e2d522674775f0c087f7c310d30d9f40e54a950d431127dff506d460d8666a45bfdb46a3342911861474298903e74331cd105b9021e1ea40df1f47224ab6ca011420e04981af16ba73a9b66ad5553778f658139c016038f8620ee6f46f92cf8bfb4661ec66b1152adab2604a213943d13ce92c00263b34176e36bcad8855b184acfe8c9e3b50e043613e8a6d38e98e51f9aaaf3326ed0e1ed081d5d0ba8707d9b90a13861d37d40c3d6624f3183119c5ad69e790c90f843eb5299ae9c9c88736d59b7ffb03b6dfee1bc7f4b19959b22180adffbc7b776815ead8d6a447177fa69c1ddeffa3fff455c24c85b372778091746d71ee3a1f386d28a0e69801c44e5f67f4468c0222519450b37017e172c811162e768cf6df3afe63f20ff57a358eccd068a007474b98fd4c78c6c58ebc1cbf61f0705df118606b48ec0b5d6394bd57804b7341237cc145622c2aed266d729ac6949b3f9604dcfc7eba7ae9ac8afa5e4346bf9ab874a4e0e9a7cc34573819c1d8046761a30833b09756f395480ff365dd0c3e9bb982e18bdbb33401398d1793347eeb9ff892610025bb79dea8e1cbb3166ee38502409a946423f7bd2ff058319e3d0835dab393420709dad177efdec95e52f0367f944b10c3b8cd4169fa96ff9b07d523853f0bf32d0131e5870ae09212638966c039dcbcf134e79e480a353707c132f06bfaba023f3326d5130e2be966754ed04495ca80aa6c8405e93945ff9d15c2319af4283c09bf0765c6852ee6e36283aac54aa382835b3b14071bbb2f1cd7da3a1f15106646eefb73a90299a3c68a124733fe50fa56c79ca137b5edda7d85de74edb21b21f2ada13f2c5c2db87548b140f9970175a0a813112e4f5241fde11f4d28993c68ff9257ea4b73ec686cec0c6d8894924e099c69d663358aa6abc9ba7f864e72cbc37c5ebb04d6439b4ae621bba7fa7d338b75bf90cb770cc48d40d16dedb2e6947edfe25605c39a96f24c15d1849a88957af5b1f88510f624080335c0e537db6c30e68ff42c56ed39dc2a7f328f37b8dffca116a021633304789e305cfbf0b5b291c00b6ac9fe3fbdb6d823cb7d8171c2899f46a45066fa4867db2a6d74eda8c9de0590e06080441ee8be9a12bece99e713a66290766f026d3bea34f80d126af467fcd7d7b0a2e9017010d1d715e7eff4251f0ac7479eb9f78da152227e1458ddffaa4dfe0b5e52e474b32c4a1784d7c3b92de8dde8ee2a160dd52a1de6eba74a88892b66ae72b7a928eadef3d4a6b693434114bf0a2950d5d9bd9a14272902afff1acff0bd4b153f72368f32cfe05f3c6f397e51e6041b5c7671f944a496ac6473657d6662b823bfcf4e4ce10c1d0f84c739a06f47aa87032503e61ef8096736809a533330a413647c5e1d15843a706b7a49704b3c65262473946e8c4d2a22c19203b5e37925b6e422a06089bd7c1caa9355fb53ea4e1fe9da80d5af83a2d9611579e77cae9dd73c9188bb704141f5122162b860e513e63b5213720d513e66d8dfead3f498bdfb03691e0e0c4df566b8d020f881ad148c89d19460a22e43f16263657b17c0ebd91c69e46985d133704a622a6f4ad37bb9571754cd3e3c2369092fa503821014444930b84581bf91302bc974fcb32fbc9f7ca58b16a2932f60f4c2aedf916514bf428cc0a27f11cd233140a5c081c50e714355e280aa8faa2594973d1f7aa3faa2353cfcf2a858b021ce1be8d597581108c000398afafc917bb34d701009495547c381e31cbd7f219b8d208cfea943ecef66e3296f7c8ad81432a56de42468c0705a239088912dce3ab87d9ec6ef9b0fdccb9407c81816cc418c3c09211259dee2daa9907f0ccadabbcc5c5263ae060ac0ebbd70562cfb7e6b60399660275dab57356f5132b1ad23c6fd7046cf18d13ce49b84861fafaa8f77c5d1f8585a789577c96e76508c9da11e9e769de9c5b53eb7444f2152e20a0481248396b27cd88304500dfc0a7d102d055b1c9069e7c16e6885423104c7657f6880b866852c417ec62343b09f2f76997b5f561dcbe6386aeda19218db865a9cb5c5cb4535c61fa2d8521e21bd9b7b60b137bfaa611d1e2f44c6aba47977acaff0c6658b8aa7a6fbc1550178632f68fe10dd867a596fe7eef73a00a0a22c7dabcb915f5c7a38f8a46a9c1a3fd5e6c484bf41d94c49a100b26a66a377458d6c2e22931401390c2bf428f6e2be2aa437349d1c06eba1904817dc58f2671cac6903a352377e7d0adc12cb0cd0806303af1a561905577ba5eecc275910825f7350cbf4ab13620a133350e1d8d40186eec111a310e38546c89bd0c0eda5e0e75b04e1c29e16048b3e059a07fc2761ac71cc5415ab75233b401ee5c820506df9864216eb5e090a9c6cf57cb8175fda1bb82f888f6cca0a302c7b17b2d16c545d05fcf7bbe34854193d423e226fcadaf8dc580eabdc13e4f704ee8562937a07038a1e63f92f32db83e605260e3c9cae1932eea19d76f87e1202ef5e71f892c03b4a3fcf008305a24e698cbdda00aaab67f7bd1c26ac9a7c5e4802e426094d1dcba8393c99bc6d1c6671aba95d462df7b16c68ce4f8ccdc6be6b6b7eaba04c71af23e87b91425184852e5d28ad4f883ec1b33f74f1aff1355dec7697ba0e3f7941b8a9da1a9c7d1743a9be209db57646c3bcca7b9e6495b89f68d3344be6bb5b5417b09860e85deb22984ca2411714359b903628aa3d012ceda4aa4e3bf7592cc2052111795e6c24389bbf1ac687b638399189085ddf376f81122f88341334e1c2b5028bda1704910aaf38314aa946509fb22762704860a7a4e3d964cda04a182c6b9d639e0ecdb0df1ea0143c9f42830997d30780e6337fbb6c9364225ba8779eacf2a514ad374a811cec5073901adc4d2fb79e185289515fd86147aa8c1011a426d6406c04f59f9db976000a1d39e20f3a5dcff7565efaf440c009134c431c34059321ec8707e46bf7307903ed819677fcf1594c44cdd98ef6e5c43e3732052996fa5391b356140b7609595629a103a40940f311384da46c3e49fe335d97cd7b7ce2b27a3da0ccd1be732608b986db9661da00e25466835606c317fc83446f579a0272f73c97e1a3deffb4a68262a5c7abf5e75a07f83c232bcd5fcf03e80ca760282974c2ea393ba5d15c7ca47bf4e17c5b1f3d7a3c3add0d88599a6974cd2e1ae40b1851376eb4f85ee653c11142368e4aaa1f478b640d9833954210480782807fa826204a97f5b1ab68f35108e61b58f3ec9538a81cd4c1226209a5af3c78105b93d884017ed5754f8931c74a33ac4968886ab3ca706783a1a81c8a156d3f1f6753ba24a70045705128030fced8d10998c95a354d1b3021aaf854db005ff9b3c99ac9c06c0c1f4447d78f720eaa62bc001a1cf2774b82934b632403d7a50227edc3a7d2aa50fd026881f33e60bb1d7edf8fced2255150522d62b77d2bea1ed72ce0a416bfaf2a6bb07ba5957da7f60b9cb9f72af2f2bac3b01bde1a0474c18111b3a5aafea84c9302e01a82dbfd5374ccf6f6a805f61ab002bbb856e828c0f4050e42431d63b662ab963106a53ba9cc1dee33be6e7e416f1862acc751d7d986bb4614bf60fc702ec7fa83b12fcb9c6c23dd108e1495f3db8ce3bb248737fe4db1e9df45c703c557a6549f7b5438d593f482e2c08b6d33f3eeeb7488a53d98610eafda2f684fda6aad871e2fce81b3231e044a5059c9fa721fd60fb7010f9593d3946445fee4ce4c54b17e01bd9425bd8984b644742f79cd28331750f5c301bd106f87cbd678a5a15e4ac586138964c2f004e5687ec30de9f5faebbc55c8ebc9271ac4d36a39a771038c7ef3d668b43390381be9df28848f26add47ebe21e631410f5693d337a7239313313444d68b69e918864a5a9a8699bfbccde67a9f43e424dfa84d9448c53b6fb5144d46db4476e8827f206b47939b7a802214c5a45050a9cbca39e17d60efda7f353b974f2a65103c4aeda48306f23be1f7649eaaa35f49f92bfcaa5fb8683cea783de00999fa7f3a9dc74f206262c223f3aa1cb55616cf3f57e6abe2ab76edf98097d39ffc749224caca0d0d0159f5e97cc43534eaef0e22d46941d536f461230240a9fd7047d58d6f50300a59b554a7ac0da9f51c83bcb46390090e438eb4e5404406a15b2f6d8810f93aec575be5c45de5981537dbaca3eb633448a63e147e52198cf2dfa4b1e5f3b49c265752d8566e5d17a4561e5b759f76d12e223db7f60568f9b925b8d82de1acb8ed0415560f944dd2e058b2d4c206aa75d809b3b5c1f42be7d39686ee0a3f67719898c968034389119f3de2f6e76bc4448abc4cd63fda16884a02efc97228da15297aad151ea8df50b9850636cdc33a84746480c19005b7ebe834749c945ca805e6d45b69b25f55ee734cf00c4069ad4a13401987884af208f5757c011a8fb1031bcc0b70224a1c9c5edf802a160497b342828b69a3d5d2fe648bf82b852c4b8c15ff837d1c775df3bc2f646d7a4dc798c44afd1a65d78879c7c616f60d20ad10999b32b603dfd284d9732b8bc655b976a039ac4b75b76adb20f6f79246afa4aa5601c0b2ef351ae0734745f22fdc7263eeb5540a5f233fc996ab0fa26a87d704fb2051614fa5438808f1f104ba43fe6038fcc45da9aa7fa8a4d02b150cb8644e6e6748fc9015bd27f4817603ab31a66de0c7e7aecca2ac053b1bb8d989ee0662f72efbb6eaebcf4684f94261d9f3827a3c13abc79780c19979fd1ed2a0e881f46b9356025931ad56974e186112facf996e96be9ca7a92456a469f4de7eeeb26ac2ecc01407a44b5fc613f167be3c7d076952d41cfa80d9b76c6a3695ab9450a56994d9d6972dd04f75b3ceb9c4c3343aaf563fd429c68f2a30337fd8f3d01ab0f99d63324c54cc6b202d15cf113d9a589a206ee8015d609ca07724497527dbba4137821602729cda605f1c0d8a6ec6360555e1234f31f896d40b09a4d2d209d51a27679f3efc14af35625bca97477a5cc2a447422b0403f60d2143c9b11b027040196fcf39b4b3e9ae2169db1159b7e0680d5b756294db7e2ab072f9ba6aa42aff3f9ba430f26e3ca4742a7a531188f16192ff62459ead5f55a6bb922dfc94938eaf8fa8607006bbd2cf41cbcb1bbe6722c938abeb8d65a844e2071969be94f27b50de78d8b3608ad0f0dbdf9f2a0ee1714b091f7cf4f06a0fd2579aa0e37e10314db7a35203ca0c9273d6fb8fd00f4f068e02150c414f2099d1c73989b635cb0d0696aeb40b3da9ccf1246f4bb33be678b84e28e033710b4f92046f67ff0e58c0241fbb5798a78b03176a39b39b61e5e1be182fa76d93c4b08d09b44f79bcd88105b8fce5980464f78f0c5ec6cfc39e524041176276b72db7d5eb43e38a1077512a2d540e242a6f88724efa8b78b21d282e336f481f532c5a4025de9781185ea6cbe8b05a9eb215b845614fae74140d7d047075e09776931a1d0d59a266d4f34417875da931bc4fd75ec2bbeec4ad25b1fc4d6df1b58bd196f041416b854356c8a21148f1d06d170c2ddae9e5723256458c8c15ae402beb77e28e07b152aa0cfb844939f22ff0677e9dd76e8b3332bdc5a779f635e97891bbf35e40778b3dbf36ddcd9261043e6dca6344c714054bf10d74ff866d318391c7f96359067e58ba624a4ef6b4c153c380aac338032695c32a5f5776211ae3e03b0892fe8755dff76775a0b6d2b392faa6f1bea6571e59f99fc10429dd0648d00d0ec286564c1d47eb3ece6e40829b4d7461d19aa45e547621557cc2c4e5c7097de76f17696d808d0a50b16efa024949c5e73a3271da506268d1f0b3f3fc8cb0c08683d1aa7bc93b7b1b2f99c85c88f1726a1e84eba1dbe5d667c52edb23b0ca9b22f749069a80cd62e3d4b983c159a878e1d73a3f376e4aeaf1bfe197a74ac1576f060b0a3f51507322eabf18a31953fbd0ac66b1f77caf18356ba9e8bbbe7e011a150a25011ff8bfd7cb0a99a9fcd1ec929d641ed607f42dbf0c239fa446a10da78754564a65206ba2b9c78ff093276c3aced98277df4bc3844b284c0648e20b4411200c230e3c38587ac076bfc1791b33ba7f0e9865791e361b99468119b81b809cdc504f8aedda6e306fa1e041148416c1b1817b148eec4c5430670cb3af0f437bd283a6f498a34630677639911cc5eedfb237b0aee8278c56fd30c44b3dd86be3ea21b6577f1c664db44ca4e45a2bb5bb114d78435aeb9d66d1efe397be0a8312ade3dd98e47c8b4bb1be20455d1dd1196ac81ffced8607a868d40a46ccb91bdd2c8ba199901f2d25028ab382490b5d17b19152315caa831a894474a00f69c1a8caece795276b5047607373a83bcefcb1387592674229cb4f86579cfae2f985eeff2c19df4a464f2d96f7cea3dc807b5f2395c2bec577e0d0756e21c00f7f827ed2a7fa32751b9ee5b75efd18db8783fda50057cdf8f2077c1f011cf64756cc16fbdcdcbffd719c9d8d145dab732adf4c0db45b4bd70ae82c6fd346f795b66eecad39aad12d76d4903a43ca886a8e4544e38aa0699d3b9a5057c2f520a1bd95e6f4baf4920f6b9b52785d678ae346b0c7853ca9ecb18727b8edc28ffcfa667d089b1ed2373860ea0b7bbf37e86efa4a70736cdeb3ff56e183dcdd5d1305ecd75b56ea5aa348c30cd1106d5979041670f5fda2f59046a99a1465dad17a907300ef6e379d7103b4d4d5fffd0cca64081c02c30194ffdeb179e09408d98b19a876c0763a1dcfb16b15f76109c12898d27d4f5e24e1371007f66bd4c9cdb4c2ccc2733a0757e4904a5ddbd3bde25f2df13ee210e439bc1b7e57dcd092c2fdbe7bf25e00200e9679f6ff57fc29170bf5f56eaff37ebafb1617f4ffc25194c53ebd28ed3eb1e5cc5d9e0c2a50e3f3afee7452b7103ac6bea092e56befc45c132a3788397a58abffcffab7bf794848ac4935093d5dd74126df82eed54c4442f1c74e7120168206a8987b8824d5e83c43b7bde594a240a69d364f1727490344ffa2e9332b8137b36d2316c528b9be8aef286df4f6be9ead5f10d88b5e0b896b0911a8f712add406d1f05f43565c96f08b6e6394a3a4c29ca350bf0751feee806a14a6c330ad8ef933c5931c52706d942c3264964c475670db2eca91067276a7a044043a38134f8cfc0ed53d05ee3a4eaed84a3318d1c9d66826395073845b9a9257572e66165782d916bc47e68cf52684feeaae270e0cb026b6f60cfd1c5781bf48972a9eeef8577aace5156ea1c32d51c829a62aa9bf2230b3001891d0b7c7806051f3aa74d408d1854eb8355d50af9421d490cd5f7ada2480d65287c7824a7d94d8aa539f826c8551fcd4c43197d33f41dda79d1de456b85c49138d9b2385283857330695ec3f31859ccbe94c05a06bb3e7349db1c0d63189565ae2fa54ecbe25f4436a53c63722058a8d504a20071c0626471cacd428802d845b47b64a0aa2c85e32a1df6de7875a6ae817938e57eb0f4b47accfe52ca677d7e36400f3e5124a0dd8f87256197ca354b0510f07aa927131cc6a61f60419834918210aba18d8f72638b2ee963339abcad8d1a2d2ab2e50c91634f4d452f6326746ab177714c9799298ff9a65be980372468d213987994306d796e8910343c1b95824c07cdb6a41ca8b4a339ea1b3ad0175dc422c5eed16e68c14c9535104eb2fafae056cd746281f32e86797564d0c4f568df4df7387c9a36028d08d9a839cf925dbfc8e5bbe02b93dc6c9d5b02cd944262cdc1c68975134c34098c4363fdbd774c624908b0fa27cc9bd4d692004d623996f1f14f656ac6927c5c210b81caac2a632e108c24bc74542d83d98eb440efaab6ff7661f60385b06208a7feddd839c84f41e95aab773651cad595e552708b38e33db3a449fe3f4ea88237c5654aad438a249b8f536d46426a4a6a5071503db01733b5f3705177d5f7c2c9febe8a9fea23aa62607d12d9a1ea9ee64d8ae2440c1ba2e5f77aeafcbb48237ae4cf3c7547987d016b81fa8286d114d9b4f8c34e6d79ef9d8daae6e618b43cb4b6bce6acc73c6237043445387a93750cdad88ea40e0b6e412d941fd3f27063d698f20b5bb9169c779dd813a1bac0e031fe7767a8a6b45933110bc289bd4ce4c181588c4a448f8b77442f48d94b5135ed9222b4180971ce3c848eda72cd84db16377c61be195933363650d704644cec80dbca0c6133f31cc688b013f2060fb26e35ea9d997963d7fc95f3c39e3f218d6f93ed66ffcd469f03c7118cd17ef0e9954c8eb219cdb46830c3094e07fc557d6c14f179698a5f379161a71e95d6d3110e88254aeb017894d2749ccc6834a37546a55d2d1331a4ea12b722e99ec9d19afa4249148a0001fdd17407bee0fda45e915959cf44006db0124d552ce0408a17654caa9cba42c1b9c4a8fd147e4b6856eff2194959a67bc379971a621a162dfe24601882300a374c56cafef72583bbbf67a8ee24c62aa8376e4c71e88992f816ab62fbaf39c7596899d4143bb76263471fbf9551c1f8b77f7becdf30689ecda0cf6f228b126594285aef0a710a3740e41b5e1e4ecdb8f74ec4f4f93f424c087ecbd95678e2a3f85a8e5340013e48a5414e6db3af19372b666cb86f6a22ef847d4f41f30674db180dc71ab4085011febb46af064d6fe04e39f8b16b38140be6f6feb1a01353d7d36c3917e43dfdd546edf3078c0a7d18fc1fc6e439945177e6c59b65f1c07464ab04f6cf943576f93c94e19fce3d7bc2d0bbe119e3c0a02855d7065545179d6a62d0f9b2dbefcc3085cfea079b3c334b91d7c0a80890ef2c7e1f68ea91ae96a1fae96392d8ca43564a10e69fbf050438183f1307f4b2320d370470341da01fbfbefaf6969466060416fff01cc990df7dd6a5ff2fec2d375dcb62a0be08b318125cfc00e01cb719aa375c3efd9b34fe8787d16206c2b94297614243fab3e274d775890d08a1671ca1c22c8f475f2ace28d507e99c9356d1781b79d22dc45a80a5e17005c8d25b3399c5663dd7e1fc989367f4be849042f4c0c91faa31dd696eaa1698e189d8c3765370a432b4318598ff885aa631e9b8e08a127c353198142b795049f78328732313b09109155a6f536b9d25cf32d421b32809aadffdf82732fd4bd7d8ad2c479a317eea7c4a2aef7a97459cde531925f4b7033ee6bf04b73a1d0cfe56e6885548f577f4da1def897e170a262ce84010850e7c0de4676d755b364e2260fcb4907e16ed07aa84c02098b748321c64716615feb70759e83c54893fb407f2f7fe3aef87ec2580bfc09f8a13b7afc640bc067796f9a99b61f95d7bbfa4cf633ddd9d1c0b795db606561d13e69cb7bb5933c4696240a0d2aeefab197e2198a9d823e15adf33d9b74817b3b79cab0783919577c5af03a3758818a20f8a2a1e4b37f11cf7167caaf524355cfecf616d8e46d35d85d338950e40b46237622087bab04e534fcea8ff8d3f43847f8ff5b9ba18c3014a03d39bd1bf0bd0e2a3d8ba314dc1891d082697d487a92b27cb3afb6706b3b3cdf20ac1ffee9942a172f0c5feca58c12d17ade3168f2db488fa3e8f9d278e1b3a58ac89af24137d35f61f50333cfb27921a1487d4587eb7882612a54f693372cb9ad762d6d03256c11f9c647b3da790b80f2bb7b6849121321de3822acd6fc12118bcbce99fccab3d1470171e72d4e9dbd0ef974cd1f72c1ffaaa2724f1a8dd9fa3d5016a548648c8b959433f1a04901a729b97c0637d252b7cddd19f3ae35908dce757829b8e6ea3bf69ec7d22019e60549193c56475bcb25d5bc3fdc4f01b3838a64d5082bd6b5a4d666a25f1c9fb62b2e2fcfca41050e712cfd3b61ac799ce905213bb54b0d243e2697ad693242d0f6875ec267d0589bd410d5a5fd56891301a531f9327ef3b609c86a9dc678bef5dc4dc7e4db4ebb7d3ba830245671e39e38c0f29fc687fdd60ea6985172dc231045dca119a62abacd7b75e0d85b4f0ceaa608ad3665ddda381e27c8c1feb65aebd584c1a4d23552342f5760932037addd822a25888617a0e1b93aaca1a29b2bc87d83bf7efd2c0667a6f957511bdaf59fcabb01c1a081db4a495db3adaad01f359fe61a8f655fc0c2baa4a33cc5cad1feba8a221fc08e77be3c03546dee1163ca8879ddaedbe1af8b461fad6837ca55aad09b1c0d33bbdafb3cec0791f98e3da9b226f215eb8ef7298373a7f7ac9e1e070d0b690a4a010d5d37c465090a74795234415b2062a58ac388149729d9fcbe4a7b11b67c589bdf98eaa5a48baa17e0c7f04ccaef91080af462a362e5b4355ee68221f8e48a68ea7858327bedac09bb81d9ceb97bef2ca96a57fcca0291a4822512e3db2f0c1639ce76da44dcc671f703a4981c8147e70e96c6063b66ccdf38ffa98f1df59622a943d59288421a4e2391594b43085f7ec3cdf84e9f88e4091b1cfb1b846b1ebf233dede0b1a633252597413929190c0b29b0a6975859c8cc353807e4e39dad976b7c39ca19351a632c7e2bdd5dc265361596dddc7c7c1a3ca51a2d34b1c38158d4d115a97fce1e31cc394319596ef6b53a74af9b174e21e14ba12943c4926757ae6460a2500f7aca1e3c6cf826a6e7c8469f1e5f416d4308812f6c79900f6e48ebd79981f5f435f4d9e391a31e5786f75cdd20939c99e229401ce45309370788f88d51d7d1e864b3e3eb169e6bb347db5353c0e10bbd1f87b2d0bda822c9cab5de99a882090ecb91dcaf8c57b7a45cb126624c3c3aa2e33c3f6241abd9acd80615dcdfbd3f99343f5fa6366cf883c1ba976a540d22d134869a06ae1ed2e13a0cf91260a35eb239d984c16014e1cac39111c229c583b06026fe5363a07227c45a6b3f3bc6d7e0ba5a95d3bfb9c1fca2286a55cacc84a9d6d79ff01fdee3bbd7a7bea6cddea02258ee89f558e3b974f88782ed5f8c505737f59df2debf85ec6098c22328ed017a06ab4036c5264ca1f33d05d8c548dd534a24e6c248bcf4f7b5536cde5162dde8d6dc7559a77a60cb6342136bcd7bc540afb568edfc769be5eb82daa15dba6439bad664bc441f538ff304b562a1a10ac6990a708b4376babbb88f61ade59c2c2a7620c5516aa0e453ae32bb8978105c2f26eb5cee519b898e22babbe2ffee2467b935b02965d228b2ad85f225713b0bad68c57a2b22eb63f25cbb622d568046d38641f6512e388bc76a345afb4ff7634d72b92283c55910be45f0bc68409b4d48e2ea4c84401e418ea64fb3b3b55c1627fd83ca683b35455134cdfe0ec72862d2beab9c41e1118742dd17234e78ecde5f60700376ad6dfc75903092c7d1d0104dca6790eb9ff9b8e31f757d2360b09475c63e7a427cb6b16f6372ca7ecbf3349742ba525a897ebe8aea9f49471899e428e3bacc20bfee91436de43c3af79d07f1b7142942909431a7a82a91e731ac696c044967af50e69cf10c5ed6b825f40288996655050dfee8cc0c70872ff272037645ed3f76fbb07eb873fc1c4d926c5ae4b478cc8cdd12f35ba9206518e48fc45354435567bc3b9af999b07d097cb8c07fddeb89e2d1024b5525f100cefa040e50922d4b8794b29d3908913527ac00259013a3e3ce22c71849b39815421fe4a54a6dc85e375f2c37ecc33e941ac0cf40bf8e52ae2b0647724e269094ecff895b557a8495c5ccb11c9abf0519332851d9134f68d0fc970a5be29b53db4f439ae92f57948a14b4a3a2c13f9ad13664d432a2037a7352599613986963615af7729c01e091ddc6913dad697156049154257c02feb3167a5eee87483d43abb99da974e48b6b1f9b1dd9ba3f5183752413a9eead3c4152a9e1dd1edd3d2bbf5700bd8ea7ba4afbfae95bec46a243fc79bf6a99dc68ab3e356e3d3bc2faf34a22794ef6c0c8a72204ddac8ba4c05b9eaa093da4cd0d9654f4f3b993328f3fc5cbfe4af6ede83b23117dbae6f9e3bb368581bdd4bbeae3b9551375ba4487d91854ece5c4e61489dfd03f7f9d2d51a78272057fe84a99ff3d6a8c827b239e830d5d631779787ed8381f174fb3564c4905b44ce64299cb8ded874680185dbba1155276d482e91d784f1f7560a6a000ae2b4a1cf2ea7b06645c438ab57f06d2f0219b30840e9f1c170f55ef90a4303d680cbc5caade23816ba929e88b06037430818dbc358bb504a60b9a26328b5ac59cbdb347f49ad9607faa23ce5c5ad67ea0b7a4fd1d71553decbccad85d471d4bc325986a383ba1274b6db8bc1b021fd20032b9fb14a5713d57fdbb59a630874eb5bf7869242e533a1bc62fbf01911a63dc0e5030553c378ab1887e2fb9ac2aa653896ed81b6bdec42bd9c0c5f935db02f273438c0337b307af11b6f40d57e87b4177d4dce3ca6675f1650512c6c0a0e5977f4b40e8583589e2ac8116f656f005ae25c5fbc316ac14db27c5e87ad38788b441a4500ca66b9153c3df47be249ae9b2d6e63ad1a5bf631cbbd75312da3c232ccbd9c9efec72da6073083ad32bb0c32947d96d0db7f3e79b88c5a9f4137374b3dd02f9de1ab19b76e34b4c944be2b27c3a77c13aa37464841ca29afdfa445d6c14607d4214a513e58cb25f0ec86f9e0fecf6b2b8f185940cfa8fb5abc7ba4ce3a3b7ffb0930e8c9d144cda83439d20f3dcec90f5732bb224e2673ce9af80398d2a754c5c89d7e0ddaa2eb52c7e2d84294b349fc15c3d26b530f25db780ee815bc5c68d4cc555736494f4dd29f6fda2f83df322c7eccfbee92bae3f2b600aa1e8fc9d9be296c21b5314146ac12142698d5ba32f96539f7abb02ef0b76be639b0d235c55d9a1792c85b66c2d6c5db71a59a7d1e93bde1fc8b44482aa6beeba52bd41e690cf780133fec1b0ff251294d24baabcc9e4ea1f7916431eeea56c2a6d0b2c106c39819ab0f036c4fe457efb1eea511d9b22312757d1ddb55ba6e0abfc64c8471fbbe139ca4ee589175a57c517d581de08e3316a494b961b6e32ac6a21c7c6684aedbcde4d281c90c481bdeacd6c03414472e055ec236cd5d7eea18f300a45287db38eb05b205894ca71102a007d9423dbc916c919dc1c18ab08487e4ddf628f423317637099c9e3ff33587ffff844cdbfc9359e89d506966c014c9067ba8094755ed9a370cf2f214d4057d64b3a5aeadaaf8bc8b992cb9eaae3b15fd86e9dc1b9b909204cbbbd65dc85fd1755b95d2d983151f179b293e7ac09003a5e4ba21c68f431d7e209a66d456567d2e3d43c08a47c46ed794e3f4676a1959d6386740a5a496024e256f27f5dd28f0e0b15657405f72b399dd1fb8416efa99b2667fa5f6bc1a4632156e53d66079a38382868bdb5ed400bb003cb18d75839e0305124959e25a05db13ad69030206b0ba25c3bd9e621621d3447d8aba239d830a11d21472c01991fe2fe1c3b929a778100ec67b46c9c3e914566fd50d4890cb524e67291ed8623077783e29b987ddbb18080d68cd48093c4b682c8ec107bef5cdeb5b2012e7b3af81e9f11698b9f36dba5ab292813e7c8b1292b5963bd67cc2db02d12dae423956fd67e5feb66ed9a190db5eabfef0269bd74f795001808304f95745ace3f0de321d9a6c9e934f76a2a12be60c1592431e33bf9155b737bb35c04d9db9991e32269ed9956e61a546cb9ff63b6782d38919ce16226762e67183906bb515c76fe11f251010b211ffb59bb941e0e36ad9c5fff8c51066e780cd32a32aada192aadce4ed3a238a6241b4b61a79e2e18f82c212471860f1f38c7e3bf801ee8b0227e5b0d5ba6c570571ea98c27ac0147eb0dc8039def13d99910cba4eb1623120950738a92037ada7dc5e3282bcc8838a0dd071c5cc42350f62253ae846e77cf52d06bdb6ecf056dd791b2acd685cb0aed8d44dd61dc8c9c5f8a3a8fbd61d6952934b8020080b6d6f5b83911299293d0beee54e84119e6cabefa88500bcb4b247cc09c6cd1f3d17b17e625548ba56084935aa874adeb313419274f241d9851cd1e5d060e6b47d5dec6165fe3dde70b40155acce73d737d44d2589d26b5eef959db40c03439fe2106a33a7b7ad4e94b79fbe33683b4f5aeb2d6d9196c2847e3761ad3f5dfadc2564e4d29d25bf1f2bca7fb4c009ac0343eb52369517faf2f5a244d47acadf99305c3fd70d3fc77bf0f08371ba7b98f563dc0ec08f47e612af101457e1577a76bb520985e95d3bb532db307de486743198a9723b58f1472a32df7930a44b8ed36d4ad32cf7c83e7a62d6e6bb50e6f8b71a4de3ec8b0a9d3a244d24be2d2563c2dab56dbb434ebd9a8285d18ccb281e2d51466586483338e7b0a3b60601da0301514ff18f3b79758f76430a3de4674fcdd0bca350fab6ac0d316f4762dcf347edd273b1b514606cca46bed88d840865c6417b5a39a74ba82ae215f7069a3e66efbfb829c9d2804685b4eacbeedc1e543d06d212909111861a3d89350ffec3ae3ea74619b40b5a8e7c5f6f5193edbf5665dac29225b67aad5b7d167bde6cff818b074aa6f714da89a4d804bb2f4a48aa2ec6fb987cfe478a84df209fb8d0ea32352a0cf0627527496fe9157fd4c8836658d93b5fa07abc404b6916e3eb53f9cd1d793e2b8054455c1e5ba4fc691ca86819ae4533dab01762a16620998e06e74543a9df34446c06b1203940f972ecc764afcc6a006b97d3d2849c0bf13caf1a9a7ef16324a2f5c0be7b150a4b075adb6676affaef8d6df6f51ff7be2b04b0612be635be083493ef88bd3d52e3f261d6f6681189878642968f3b7a9a88c27bd94c3b7b7d457f06afe90c2474d2424f7879237cc4f48004985487b993cdff5a2916c6482691917ea1dd2dff174dc361acfd5f09c088760a148e9d26a52d7836b348572652451cafacc18c9b757dd2b24500e4263dd2cc843cbb27f63a381f175b2a52f15617bf6505ece9b63e7ce0feaec47a5f5a951b3f927750deeecaf06ac6e40fc825199266edc9084526c9681856d5f25cb4e901bbf118e4441ded5aaf02fac5964aead18a5bfb0dfffb82db79ea2e754cd26c3c58da2805f3db74cea32ac676572f64ef72ee8ea077c92651b4534080d750b76a1817c622e859e5e202e3d6116c9b73afbbd57b8bd48903b4b5eb21ff6a54c46fdea8c7b33dbb666efb4c077c2f751c3b50b0d050854449719c81896d9c4ba26b53d08e1f88ed22699b3ad2ad2609cf4f4bd1e496b04388349542ff263752f810bb17822c4941f28d1aacb88ded4f81213a69817483fd1381228136cd67d5bc2c56910acc7c57b63197d4a96ff5ef27452872072eb3181a5d038cdb827d124c0ef2bce413d918fecfaf7c52f0e85b77333e1f18e4706061f98ee0105859f6bac9e1e4175edb16cd08376248c69165dc0af602a9675c1f26a31902e4015b01c28089709268891e16b4db24e73cd00a4b0596e0579a2a1aaa66392140a3015a125f96cbb20dbda83028decb496a9ba3490093a1084c4d77eb99cd1beb7c580e5943dc90b6d3f7867829c1aa851faf084a569d2deddf25c23e857be71a40803a5d76d8e1016b081ec23c08b95715de624c9a1bce79c8ea305d3ac93fc8288e95e52d4ec2516b0df88abb590a9be8c4677806545e36bb98e71d2de1f5382a60479e98c46b36ec2d4440c44f60f8766223307fc7c400e0f7c494dcc9386a05208014fc013b241b877b402ac6ecdada1703b886958c1835cd2d60c216cfe14513ba1f8e0ce88f3e85dff2447ed731a8c6930b67a0f78585e300298bd1fb02706252817f140d4ccf7fd239c651c9c1057d03010a57cef19faf519060d4ea60175aaf46cd8755360b789a2a51a0884fb44f91b21d95a590bb2d48975371cee39e72b99d1d49bd2fd06ddf2928729af774727fc9d51b1114e7fbe7551a0e564d18b4060cd7946b356760dc96c2ce2be015932d652793eadaea9e2f78fd980240d8223c64be9b4357f07b96833283a5cd7d02db65138c1b18b7f408cc822c9dc84b4b702ceb82c9cdfbf4e2d253bd3b5bc9c48a772c8a581b1fc607af6c00d689219f6e2b03ec56bbd701bcde5495df9295a78a371a29bc86139918af5a762038edad6842c5cb58b168e0806ae54bbab988039daa53bc51931d0ac07694f901c35188855c0c23ebbf6dc112997a3e0103d3c33de64d296ba27a74b5593153bc46a432b2fc7d5ff7fc20b21c49bde9504fc0743703eb7982384ff4245cce0d338f954f9de41a16868d5d9b95c50a89143021a82b6ab211192d009e8b8e5713029cb8efe066ef774d28d67e8739078ac4b66b4e33d51319e899cfbef4d99bbc73b4f63689ddbf175ba80e2d4219090d54b72f008888fbc843e095ac70c6cac6b612cba4a28887e45f8e9eb2f46a42d6218ffab6ba1ca4e669eb0713a28e6f31ca0deb6b1788e9454bf843d5792ae8e97cda0b1cd83a8717324e679bf0a9b57dffaa56b44ea72f5cbc07ecdafee2b2d4054075c48974e86837c0404b56f64707f56dfc34f610efb07c2270adcc936789432cba1455de9226aceb24ee805b2d56b1d894973e0cc588eee2e9848e7f3dd00e1d3efca68a0335f3d52bf811980c38d075fd6cf419d6ca5adf05898e32332355ec6cc54d0849827bbbc9e884d3fb77ca3bf31e30ed304506e658a9cf1dca4e56c92979d35da6eda65deaf374c4a84b20ab986d61367e43d50c4856f5f9776ac2fe73632b454a679ea45f23dea64285bf9090d445ca6d27a168867fc2782d4f6936222873f730bafdd56e4ae0dc29c2b345fc25bb4f31984b8b273a25bde838c4e36a200a1654dd8f27712a4910b476a785598ba973121bc3539f657a7e7f460e3253221185e46bd5674e4e4ee796efc2f4c9cdeffe371d7be95c4ef653805ec2ab9ccbba5f3fa370e15f2043db17356ffc027ce988bec0ff31b75492badc65e346d87754a92aa073642ccf3484990cfd4c64cd615dceb1fadb92d2a9ac6d1bd888d1aa15febd9d2da14547db91bfc2f526060d7e14c38620f9e63dd19358ad38ed98c6b2aba5f81f0e94a9c3cad4a165ee0032eb701976884c3a5c860e2a6307961987cab803cbc4216576401974b865988b2204fb3305a40df58f515dd971604bca5ad031872ecb2c930efadfc8320c3bc5bb3a54e61d1cd5836d84a108657448193abc0c3bf006927207bac832e3409976f8ba77501008ec7bdba18629ece46b46776169f80f77ec8cfbef45f330927562b08bbaa3601d8d11f34df3b8de86944dffdcfc4e402cb4a31a4473cf31e4978d2327529e39893414fb0a0a69f860742aa308728cb010b158e64c490549e57c94230bd619b9a6ae62b094edf042251a0545e5d8dd7a75242e94155a0fca05620bc1b96e42b3f0697fb72e91b38ed3b2036920dfce30982f0221140c18044d396801104fdfdc6123d3fc017f1bb9c0d203a2e59ad8bd7be5e7d1af636cc68425fd6d641188ea4dc9f03de8098ed3d5fa518815d2b1ae312171f71023aca88c5f2e4dfe8fda0c8c63a659bef9d88187d3f0c497d2b92d1be4f0a2972b9e6fb191d52fe5b0e49d70ec23de7713b8e75dce2187776079fb2bd15f96574fe7823a53630283002c5c391544617e04cfc749553a43233b02d55dfafbcd02e0ba4020e418d68aceae925b60945958725128f999faa9849455a8f50ff4c69fac845fed3204a03524c0cbb94aca7bf11790bd81c87a51a50af234791b1cd5455516afe8ea0c33d171e0a77983ee20f0b2408c5478414ba2bc5e2f6c70d67b313c9add49d9a4ab01aeaa7452082b8db9335e7f2264ad4b8f237ce42258bff16f78c2e2802cade323d1ed2dd3547b56f82b0e8028c416b4f5a04f84fc30a411e3b209f52b312e2a71973d5f8ecdcb785ce9e57579be7918e5e3f95832ae3f9f21d553e4ca2363f3c90307f492f60c683f989fc5cf196b9f3606a9b1928fe9cf5714711e37daf599e1dba60d02c2b0a459070b6f06e10752b859927f080d6604a9ad3a4c26ab8f3fb114784c8cb8db8d29ff3be2fed80e83d762b69b1d360cc5f37e63489a047a3664149b4f70c382edbe7f46a3a6d6799a3a2d075b05da69075fbcfc213de5ede3a022763dc316e8c2c886bc5e7d5ab006b05c7c7fdbb435e9b6a1616639a41ad04d10c4a3112c7c6a2592938289439b3e84e54f994384a66514dfdf8c1197119d8fbc68874c22300021f908dfd27eb61532ea2510fdae912556b6ce1c3ed449716669bbbcd7b4d18657c06cae57e24bd79406b726120ceebae5cf10fddb967063a2e418f48be08f6d53e9d8295e73aff0c1220a6a487f179d4a5a73922b392ca6aedb03f9b840d364a2698cdedd56272398ebbe2a456e10786571af05c339ead4ca15c1b84fcb0ca6b41cdea5bbb8580b54d724b9116f1512a956567b98fc560a129184672af2cb5f256a2036d19e4118b53325abedf62ddf4b7e722297ab2a2e7a0be02725393eee225f428298a3ee3c149a89ef0202eade6e531b30132bb2e249121032537bcb5172d9cae7825dc425d8ba7b3feb26dd131432c5700a632f7a495697e7f61e886159b7aefae7736448127b368f1ef9baabcd6a83eb243e0b67d367cf4427bb8e7cc482a01ffc83f90cad1415d731b8e3d38c7f47ceef690d54f6e6baa8bf27a5de096c0b21f2f063834abbaa7654fa9261db7ab62ed99f33233bc59a672414ed7bf562f9e0a848fa66214542185b80c9f682d827424d28f21a1741fcb9166d4d7532b4743e669570d25855f448b9835b8455e47395ef21e0af871d5b3366b76e1df5067f18f7ca3f316fd1bede536da19ac2fce37ff31e087ddff2901bdffc6a938b177aa4f48fb26cddd3d9e8b747f8a80fd6b204bf6894e29468ad3ffd36c8cfb0408b6fa39c3f796865739f5fb0180877e5f572a5f22e35c4e5399c746f5865a85028fb743f6b4ef9dd86081bfda28025353a1d11ecd7a0dd0965d25f2b0d411decd8c9acdc20e6c49e4fe2f041fd1fdebd2a6ec8bee923860a4fe1f726682cfd706f6590cd7d89bc5a3b8e70a8fecfa79eadadf8b1e56ef493d086606a0b69f1b34a5282c3107a6781764ade1a9dfa5100c10d667289c0038bcec023ffa4d704727bdf293b61387fb6832f79565d9b866a2a9259c229d91609a2970065dec012883c612a460f294a422980736907477150632a8c2f1ce6af64199e22d644f4d2db185c25b0e61793ec842e4f4ce076a556922ada97a4ea3a6b5a2818c30cc92db3d791d657df47d6fb768300722d38158660b0b983224dec83b2419a2f3a48d6158d4777238223a4884c255ef3f18c8302323aab7945ddac640e41822d28d6a237ab2404e6fefb61f712480d7a5be7cd19ebd2620bb1ffb71ccf71a9a47b486727d11aab9d80441a462adc0826c2b5505ec5790a60885730b5c634452a12cb6285de3a9aff451626945cd55999c559d157fa3183a325b31d771ec86b6a7f85b9192e449613874f42bbd62d33ffc825e1d8402299eb690056db284065799a2ffe9a0b0b261af6e71b1178f182068c6e674b9da86907d36457128bef81b7d39e4f739ecd7a49052d0d5c1c8f3990f2fae3ae3023da219f6cf72574ede7ad3528a360b73bb20069aa45c6862be5741b5d073dde9b9fc6ed22ad5e14ea37b4cb577663461e245199613f3d39c5f6000e233342a878ba632bf706bce0359e06296e48b8d7cbdd6c2c35531ec8cd5c84dcaa2eed44a533012fd92ab59f96a36be36d2d884c0f300b47a2faa0435b77623128890a35cb73c45b4d83587257c5f3f0f48fb6b50d0033bd2d782afffb6367d4d4f13c5f580f6da32d736a48e0d80a4cb59a36efd4ec623700d2b220be318b253908e5d59893f5d8168078705720ce3529246f6ee1b6d148c33790908d75ba75da8a95a9aefe65e51dfa7ad321ead9e2c042c06cb952a6ce7d05ecb54be156dd6db23d854a87bc64cf803ef546b7d46d2b507e7b43fcb480bb2f6d056e222ba7d66f8328e5d69f4c60f7da1de5538ccd2f0f3278abac44eaca979e8edc8fc73eee6c44643fa35b0afbb7223a7155ebfd666b80c296a30c208e63b0f6fbc9f26f334fb820590db695d010e5d14c43c3ba82ce78d410c84cd7f235797ea3d03f69dd32ba1a479a711855d18deea545823a414a9e1b8a7c9a054ba4db60954688a60f7f0798ebe1b823c5369a378b70b22d43b408c0ac476ec0ad54cb1c7a1e045e71a513a77467f83a20b4b375cc82020f2ac422f6e1900a214d64694718396f2e55a42c9310f7255e68e71f652bd31a7e3b843db786dd30f9a8888556b86d59bd67be048701ec8ea7f739d0ec9322989edcce0cf5c2a1d421023d04271a523f5f7f1dcdf94a548728ea24109e6cc8160d81f8945473d933164463747417f349246ca3bbffe8ac68a7c1114879043475e2d00e8a86bec5be1c41f00702e0af8c60563b41f64980f9c324f61086889245b32407e45f5b2849f4a5bb3cb044e70096217d72d4440557f0a4df4c1e78aeeed0b475a753d636ec0b57cfc0f1184172c47adff593f9f696ab635b12202e2925521e8ddc75b774aebeab50890c4f4a071c1fb7e79179e79032d94b80a6a89962957075c7cf4c25aa170963083b549c651c8d806927faa0bcc5b5b28f47d61fc0a4741f34e965c56fde6af6abc9882407550bedda4d82b4e96396e40855294f23fb344962d2c8529a1fbeff543b716ccf6e4fcf08b42381393c0f99b9ba09a8adf6dc14dbb39a7fc7a30807d00b3c51a74e370248a5ebdbf588563fe73b21d13e9427b1044183d489a835fc6b93eeb84ea80bf479ef35bd95376aca0647451d9231b1c93a9a9b0a8d725ed615c016a00178d6d30d82798b7bf0830b7e663e68f40db0c8189f8901b69a8c2c7f8d88da444059d8f14ed5e2e3b599f25b3eff461ac5f1a6a1e3665bf1026b2fa7192fb08bf8476f7be3f82facc38951332201cbae989e1814c751e935585786bffaac83ab20e302f4b3f30b07e918d6e37a5098dfc64ad4812023f7960351a3c65a29faaf8df44b8977c01c7f56404bd2780ceb65fe3a4d8341defc7558b51f2cd44f27d82ec23f1d5cc91cd95e0ed5c53d4bae9dc39393d7c48b344bcdb1385c8dd682c8eda78028511b622b87b5218a5f1aea5c6a226a54c520b085b6c09b2d28e9ed382ee7a58f9e762306068afdd03047d44c6811b73acd1c045a5868356ff7f6121e0ea6f5fd20eda93aebc44690d0704bb3a1308a61ea8a13f91c38871c39e40b99f385a504f19ee45c1c441356eb1714cb8f5c529b15290d5fc4109218c398a980ca0ae2369016326ab41c519d52d225027fcfd9e01ae18ead62d752f2db5d4f35019c1e2c663a99d3943859eac9ef03def0607ed5fb8aa71194cedbf4b4ba8a7fcb338aa0b20e53e6158db435788e1a8865f55dae81b03bccd30b987cf9dd8056884ce8fad1ab2b0bc17ee3325cfc137bea7445cd5eedbdd8f6dc2ee7aae502958fc8e6cccf6d19392aff75005ee019166993fda1e3b9b5d0893bbfe5a4577ec4c3c815df65099706020f0e261f3794cd2574f99d468812240bd3fe425ac78f1220e87b0f9e17c2063d4549c0105bf419caa28de751068fd8e2cf6602c5e63645dc106d5c8c9176878480cd878d72b546aefb7cf6d3b37ea3e4a18f1b6178bdd4724b78a9a35232e558cf30198fa7c82742ffdea4bb259ad8b6b16ce6bb57227a4f07633d25895e8a280b58d85854d8fe0c7c868cf15e916360199364ddf14e720680693df659e2ab7d0147424ddf68cc67b7ebdfd86cdf0615a40d9ac9fa42622ace8a913f0d440faff78b39a29abbbb88ff39fee75e0d2c96994582b9fb31d5b569661a8dbc77c57fea5872e02177807fdf93cbf1268e4cbe52364b069edc147724f6c204fa3d48f0d1537767776a1da753fae77a343eb8dc8ca1ec702570de8d835c77380fcc5cf022624725ee229d9a9ab08cd29b563aace8ac46070fa99bffad8bb670d2c7d7495d1f8622d49d64322d043cc74dda9b1ce5e4c64bb4cb562946466465967122889652703fd597a36cb4cb2f35ada509fb4e837c6b0b810aaba6b140ae042af05a70b88436dad239912ea23771f1962e9e21769998cfb6e4bb66ad1f57db915ace1b76725a39ef238d2056026d81085326ae3aa53f1232b914866c19e857cee8c48d5d3d455a87187bd5d83eda555f4afa40f49bb542d02d756ea3a34c93f6cde205911d47505008a763a1f4679ad47d20d58569f618e1d4dd2cf74e1cdc5fe379fcf9add1a89a994097befcc284475faa6a330fe10f502359bfe1a22292b940a1013c4fb461a7c79fec657822198ec2893ae7116efc1ace3331e70aa8773f278ac1d2f1cfc79e6882f335b0d1eab42380f1bb13c7f98d870273da15554a6574c734daa7484b42227ee47415bdba3330a0edbfeb229b3878197871aa7dae771622445588bc56fe654a653f9171fa4b93b4ff53a03652c2a684f2ca9990d6caf379578b4eba9da58c508dd8c276948b5bbbe015d08e3711fccd1a410d8853a3f2463ba13ada4412f9194a86928abce2c0e0635fa57bcb66b4c1657b457d9a1809b1d0482a2b35ff29ef411900059803c19d5bda9b4871fba40b4e3b7831e70e97741c5ca5a1b292dfc5767db1aa52dfd68839018fca156524313bc8bf15fbbafb881be1d98209926b2d845bcccea36416b16467e45daac688a5b241758342d0f778692a63c9c0c57bac21cd2a1424c07c8217a06763c3488c56e859f1b0cb893255361ddf6c34b7166fc1f9d424becc2a372b1d4e6b4edba96423a358625e46024ec90e45f28ec0c6c3fe5041601642e32e4ad50403e0ac7a088de4f04a5a074eaf13e52966c623524e6196b541e5e5f7209bd116b07bbd66e813a9bbca27f42deb237e471ac24d5e5ebac0150f9fe6fed9166c86a9d5547a28be944090da36ed68a5acb52d084370fe66570cf3778cd009dad9ed975074124de0c2c6df076e4d4866f4a3d16b9292df09e0a5bffd747b6635398fbef6d22e59e248ce9ee8244791aa9de1f907afb848d161e9e8ceda90de1ed41395ab62ce56be3e1e9c70e7ef4883b72af83051f03e8509827007282edc49e441be8b5831642285889fdf9ff0ecc2dcfb7f82c1a16d14824a24d920e57a9460c2ceef0919c1d3ad7625332e3226847608e0f70545011eb93130d8630e323323ada24af28fb120dba156618a36d9efc0c09abb3bfe35a05f4a873328a63e6cd49a24ccb0722bbf08a33db1a538c3c28a041e1361bc2840a065c644695b5269e11cb9114318a11a15b12b6010d22e7c9ed019706767d5474f90a49feb4699489854f5398d8b30cbad6458ca4cfc8a293819b0042bf28d5264dea3ba8d606419b723c3590f66152ed808afdf237835ef5e7a89fc901f810d122dbbe4c308baa1092543f004513334e0dee3f6e2d69fd29f2e096c36b081d119c7923ef2d1b84d155ce6740c55d1bf7c34c80f322d0b5e248c33fb0b6f59e6ee702ab9009e7d1638f6c35f3dc66566573e89499648da83863840d4084b9ebe2f55f66c4a04df0c054aa167784ab8b3fa2773a4e7a1cd78daae974116340b1609831b5e919456c46bc2c6c97c6b2c36171f6563c57e01f16b390cb460f5a650cf5d4908642fad4da47d02cadbe95f5c30da514d0709e87f5548c33b818dba636e9f2193e39f880032fdc025b3293968657e8b0ff5d64c8254cc37b9779a03801c606c876297131be02f61a0e055da0a4d6c0b4846e47940636f263c7d2e27a80905b5bd65f7265bca94640a0506c205a305323d1f053cdcf703a1463a4a29d534aa518d6ab5d21ca101a289716147a6dfe18a47d5ab0ead68fedd42f362f000f06ad10160737d0bcdd3c28e2d3a2a1b4e6f7a53080255ffe94ffef4dc2a997650d9500281aac31f31bef428d309481303a4893501bc9351cd205fb743196edf1410ecb659fb7ddcd08b2844d891b3d0e1aff34b221a03acaf2680ffc9cdf547e53ca05b271cabc341d7f425cf86d25726d853b37ae8c26a8c6818991f1fd729ce8f57036d9d429ad8cb9664765cc53866f513bb23ea616a6e90e820b945563266d1c8587466d1cc58f4f76e8734312578e88e5fa98ab61895cbd58e9ba59a57bc5c7b5eb5c713b2dc126ea8456702923e7b2513e809d91e1348739885e90eb3502158c48271b896343fa38f4d910ceb8b1b5aad92d84e9353cab98aadba580d75ab252faf179b979bed05473bf9d94e7e482626ab556c359b594dc1e2c0020710cad4a2d349ca301c588c5aa068d1b12d3a362d50b440d1a2d3ace611823a727d6c89dd1623b745a7c5a76b99dd969f6ad352a4a547b3787ecb122d3d2d417e94b8218729852840d75f64425180c221da579a18c768d77f023b1c332a9960b77febfadc9bc00d90f89d06469f0ac12cfd44dcee16b047c3b02667cab43733e38e42a05bc311077a7369d8a2d363478679e048e3ca8fad6881786190414e95ac8135eda656dad4e0f430e22606cd64cb49c2d06dd9d169e929752d3adc90c7b0d7be7e734321b0f31b076e885bc22dd67b84a51ef5b84d881619da28ed68d8e2a365099d961edd873fb0fda57c3538dd611d4d1a42d7df7a2e134a45319ab0a48f01c4e210c201d42c0c6b0a9b1c7332136a008a924adb400e273b34f85ba0a65927d71f0721d75f8786e996bf26a4a759236701c575ff559066f9139a068468008a668d5c24a6792d2518752d39b5b3d1a29fbcee762bca888c14ec8fc398dea560d1bffe4a9b2b9f4c12d2f5c701e4302b9ec601f4bdc0f298bc88ae789ab50407e318ee76912968624c2305c3d4dc3011fae4a5043bb6e86c1bb7926215db463532cfb01ffd7aa10eb969b64646fb20a12e86bab0deb458715aac2f16b3fa2540816675c82de1865a9cb99920bd61179a73fb4b35373b25609cdbef42dc7ee73941c272ab2457ec61c5fe1138faada10e397677e4865649acf5c0918b00f5eca7889166f5112024aba01fa7e7fbc3f4feab242ba15517aba1d5926675e10cdfd78bcdcb4db366f8a3f4fe2f38cd5275586db8252d9ec21a9c66f1377543432cbc4c58b0cd4209879c78fc9442950da82f7d2904c1e964c4615434a51d4ca1aa54fa1d2d597ad3b367c329ac3f618595e4d752c90414e436afd70d5090c9e4b96068d1a59409656036bdfc3ae430a597dd39573ece957376382dca378226e63032b02ae42cf24f6185398ba4393dea51631de20ec71aabc97116afb971161974a54de91c09798b4ea5b357b1dbc39f57b15387aa279ecbcacf73d5d7be3fa6677a4f637aae7fa7793539353835379688edb7b74fbacd61363f916167b64f27d0045a6791f175a9ce4a61bfc3f1e5e532d6d795b12b1cb91cbb82cd002ec7acf0737b5240babbbbbbe646caa63ff9ca0ee42b4746a2c3487a30929d2bba3537f28e0c83a1653866de2ed579ae1a9c16635cf1f28751dc30929ceb5f51503c177d14cf355fe5a235a5dbd19483ddedd69414cfb55a220a5686990b83614ee1ca644deec80d55125cff4aa35bf178aed5122dfaaf6249704c5a745c38ae9c86b13c0e8303c859fcb79e3f1c33bf8d984ea587dd55cc88163d5c7f14586cc69de11462972558984b91225ddc3695c2eee73a14ecc830d60c0cbb0d837aff961db7dcd2a3bbbb65a74587a169001d00b6e8b4e8b3083d9f05d2d0c45a9c9d40eb2c4f573cfde32a25859b95fa2e77fc1504657a861c328cdb017b6d7b33393c8c3024f7fd73f4f4dbcab873821a0dcd2c266d8a09b875ad52c50c71a7c547b3fafb96d04366744ce3c10741ae823b76f798c39c429a98af627755a3594f9802d61e1676c7613866e1c0824521988503a826c7614c3cd72d23c1818573430ee38f03a8c39112e1730ad8751e9d9dae07c7c891124a595c99d2e24ac956ac742cb0e0b944df8274610a86398532c0aab842666cd169d1910f134cb8de65998d912bc30b64a0c5b0031c9343defeef19db75af0996c6b6298416b15d1df28e5b11d77f82a418bb3890ab435ed008b6b9df64078a9f3be79f5a3e907f11892885d9ed290dbf8dceda7d07fee72c73f4f2e9f3fd23ec4861211876b4777e29a28d9749e7f49928d1b5ec32dfded9835de48b8ec0f0173b2f071072274c9482913bbe30baf3c69cc69a35763d2eac593ecd721cdcf9d448b3fc9980dde08eb4c89d42ee488f8c2fdc080816d530dde86aa0f76c41edc659e6a72e10dea11bed41654f8fecd15e7c7bf43a9a04f96ef2726b36dd68d35c847a692f24d8fe4e8255739006d1242d0a81b40b900e35cbd46817777ebde118f993e7ce1d2c18e74ea02ac49d93fec83571e7733d1cd33fe76baf1b0d87764fe37dd7bd176e34a4f7de0b77f09e1472386ea05949a6f794d2a63d302964a3947650b384e6923bb597b3cc9f34e82916cca2506071fe9c94fec856dcf94d7b448f522868af20fa93fed6d111d7d14a41950cbba02e280d73ec703910e36ec052938eda8e963a19b30143a5bda9a3a74e8a504c22f553ede66a38773e9561d7e2ec30d46c5a9c2f20966ff7de8f2907d874ef7d01620a508002dcf98c4a718cd603bbcc9f8fa2f97067eaa65297391cb522eefcb174c7146b22b83375e78b5de65b2eeca8bd3a5a5ff335ae67522ad25e2291f66a98941fedc6889df9da12b33b472dc89d53e74e1f77f2683d777a6bd484dcf9228d0a41059953fadc4941f99d45d59e1314bc2d483e907c20f930bbdb5266f694d87e1a57d4ea6d61332080ca2b40562e9ff458fe715e59816d3a8c4afad320ed69a8f6a270076d7bd1ef404395d47e476b632322ada381a5affd78e306c74c805d0aa0c5cf13aef312d8c5ff851635ca46e80d1b9153ced99f104572838578897cc99bd9d29f6826dc78a14aeaa7c333363ffeaf616200f1bd01c3c6b3efc54fdc27cbad59ce047fc27fc781a8524a29a5333333f3125e977edd886cee5a4f6cf4be438bd45ecad58e5de87f7245753071821d536e8a8d97176e34cb1f9c71bb5bbb736e96b6e2b3e5e42922f59bdcead4db49a2d73614cc0ecd425f872eec7c990187a1c0a533300ba5479861917e0515c03858a48f92804f1ae000724557fae505f0460c7e45a18d94a71f11eb2fe39bcb5661e953aabd4450cce9d5644a58e5951e8e51d9ba2d9c418204b9c9a146e811211c23e3b216069132743c20538e2948860ebbb829e8fa6f405bd0a86714c4cb310599826408f9112aaf8c00805d8d596c54db9e534e3a3f02973b5648737236cd4b62a9f622924fb3e66b4f8a694f79b61e2b449bdb732b77cefab3ab1cb839cbdc74c6110fae46736298f13ddce06a390ef3d9348b663f9babd16d14ea9877fc6c4e2fd24f8bda8346aca841d20f0b401cd3afb520a4e76a1db604b18bf6293d577b159b66a990dcd9a2f6294254b47fad05ab851d5b1072b591f47355ee04006ce3a935b0f7801adaa7cf9e73720a69f4c0f5f72231cc971797df9a56c30d67917f633a45ddf1c695a420ecb8c5c07933dccd21c3e02ebb4807d80001c4e62c2c2fc82ef24176d946ddcc66124337c3cd9b11c7d2e51929f2662cbbd43023baf339ef01ec2c7334bf76dd755dd749de489b37136e2c398e445fa32107ae87546a48a8fdd5449af44c7bbb37e3d367269d73ce508d524a6734514e8ea6699a26f266449e13ec387beee640f77ace6d58c38484e4cec83f2ecf09563effe6314054472cdb27d5441b6966bce1ce9e5003a2f2cac859c026ff7c66174a676bf5371789b4708845a11388357d090c350db9a1aeeb4e3f42431d8d356be4866645ba8e613537746aef813a641d3b1f38fd09c4a80486dc6b83322a6f89e7d10c95848ac0943e8950b34ea6f0bafe1078798db38ad124ac560239da7347aed1686e5e14ecb43db0fda63fa96e291c29cf94e93aa7e7e25ed33c17f7353b353a0f444a4d4a1958cd4db3a60e4fb3bad7a991cfea51b353e3a35933acc9a931a2c5296b7ad4ecd4dcf45770c481f67873522a7a999e73db46f56ea2cd1f0792fe158fe452be7ea0b6ce7297624d48f6bb16a77d13eb59e652699a802410f57560ca832ba0d8e20b1a78e300a91f5879a7aac392dc7e982ee79c33e5d383d40e2ce77209b984943ef85343b67f943e64287b20848725a59e6be49c3fc7fd0ef72018aa7ea30176e0f4362296d3683c0acaa79e5b4c3d0edffd1f79ae0f5528e10cf4a23c4aa8c3779e0c7c69842a9447e144affad1c9049e5850c67fa0d4ba4ff53df77d8a23914833f571f353d473a51ca542792ec5a954a977147f4e5e9a2ad12ee5c590e2f8081752a045ea25ff529e03555e05ce78f672c88b42e3657c03534f031c7d0adc1e05e44b8166cd86b1093f886f852113ced3e5254929bd499aef79de244d1df33b69f2becdd4974ccf2d9a1ee592a69f2d9a4e27ee74e2508efa1390efe9e44b2853ea4be1e94fc051de5478f2b59ec83f81fef2f428707a2e97713efd89ebf49ae7d271fa185f4532fe24c69f4e31c2a9423b0bcaf812184382a87719c447101f313a26549e5d60557ec6739ecb559e861d57e549def468d831fd7bd1578e4b713f5be44623d18bbe1785fea6d0950ab98e5c3afc4b5f4d9d946fe2b9be5779f65ca94f796e312515ce406fea53a10e2da6fc6c31e56bc91b7ddf9ca43949a4994abd07ce678ff481230ea99f9ec7fd0453cfcd2791e69cefc9f05c3aba9f5f4f5d7baed10c5025051ce5cd55a552ef8ef215081c77dcd4cbb8e8a6461e6e2a1c775c979d09447907539c0a1c714899bea6de14b25c99dec1d49bc0b11e49a5407fd3cbb42b05cacb793a4a4fbd99fade536fa6fb2ec573997cf5b69bfa9a0253d39bb16ffae9cd94de5f4ac94d4a3d28af173d29d7270394408bf463800e006968913e0a94e104c2d059d407feca04451be04b8b2ff4015aa4a14c4a071d112d9c9b4a83363535c4ce374d2f72e64914d67fbebf8d6824128944db084cf9c0f66f221eea48a6b438fa5a1c8d46db735fc1140f2c37f2c18b174f3135516f4d5b9b545229daa48d6db461471b978614ccba0d0f8110a5d4bde79cd329a594524a29a594524a9f524a29a5f44fa2b0f3e94a8bffe3021ddb3036a80fe25ba89009fbfcd3fde59532eda0776b9ad61c0373d6bbd24b2932791c3e958726bf8936d07b11687a1f409cc372ac892497975c8ef5e0dc3a1a792ed38f3c97f752f42ed9fde0e84c5eabf45ca493eb14aa48d5dd73996cbc782b40acffcadddaeb91e722e9d0e2e8a92703df2d54f5dfe0891c0c22bbee47ddcb277c709d9d3b7843bfbf4804de90437445cf3787e892c21bfa5deedba803e56a7b09d6233b44a0f416d07d3df15c3ae4735f6374d2e41db42f024bcf5e8e6dfb9209a84305225520771f79b82d2b901c7d953f0ab91e910d707fae1cf881a8195bd87165f42ba28d962f7b5a94737a406c38576c979aa8bc32c30bdb3f76a928ac7c1b2a3faff4acae33895d663049d77fe65f5ed51b74776f776f6977685c2aa9f4ef07d33dd7942ea794f3b96b9c2abfadc31c5a746d0b477b67286339e8e039780e5a8b8cbc1cc6013f32a759fcc5cdf27cb098c842de2cfedb666538dae91dc1f68fe268ca50d3d1b411ecceed5df6e4e0ce393722b9a120679ac0d8a06e439c36b470b4d246bf505fba30cb7c026c08b873c89d3fcef766605d5c6971b638271275f3667583a387dff3b67946981c98c281f5ef1f85a3aeb2f32dbce185e0849b6b72d9a7093c974bd51dfc9ac50bdb6d2f5b87128c8007cb1ecb3e5dc02efdbf952b605936c4d0f589e2dd784b2c508b5e11769c409e10a3219dda5f4d6a90edf5d7c973ce395b6ea41c1a3354525428a94f468c13d4c954b22624afabdc6813fd6063451a9dde5d104abece7e2759d893203b6eb755b96bad95be454df974e6a05212a9cc3ba46479430c417320d271eed73c029424c87d6245aeb73314fcd587dc69d199c3c641b511dd390eb335cb649e9df322503571862eeaa67734222ad352d7e26c91513aac64816519103b3220742ecb80b8b9fca3cb329b25976536492ebd2cb309dd11a725eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeb3d96c369bcd66b3d96c369bcd66b3d96c36739fcd66b399fb6c369bb9cf6633f7d96cd682e7c268138d7ecca9693f775c52e7f3d3649a5e99166960e5c3100377a7a9095b325519ca48d88b4c6704cc2465ada857b33870bb9363f84d25ef56146a656e9d8d71f266b8018532954eba134f876bfee65d5687b14dce4ff27a1dc98b21460c4f878b7b910cf13bf618e0afbdc97c67b73084324658f953f224d1d0eb78366bb6d87daa82fdbc247a23d178cff3bcae85e9329f55e69393f994f994f994f994f99481a7d3e9747241e69393f994f994f994f994f99485dff77d2e4c97f91cc97cca7cca7cca7cca6aa8a8a8a8cca041e31f04c31ab3460d6f594394f994f994f994f994ad802018d6a8b1b2c2020b2db8305d70c15bba204e97f994f994f994b120ca7cca7cca5a68c105516461696901808d69c386b7b4214e97f994b920ca4416f7ae0aa19282400a022908a420743cbabbbb495158f9ec2f766912303333333333333333333333333333333333333393889088908890889080c0cccccc4c0242123bf8370297221f5a11b42246f0c209960c01830c342c7955fb3d925ba9e8c2fea8a0a5dcbeae457e09981841bcfcb2dd4f5558f9dc74a23ae9dfd759200370e5e7302fcdd22f2fa322eea164977617c661d8f510d5a2a5d4c6a5d767f78bb3b4cf6d0f6f10a159d2172f378b6ecefdc20b12d65fb258b666ad2ebf46a2f34773c10e767063831df49ca8180de173a2e3d1f1f84cf0b1e07301ea07d40f289b51189f13a72a4e54a06c50361d8fd1103e273e273e137c29f852d0f1f852d0f1e878a07e40fdf003ea878e47c7634e1bdd890a948de581958fb2f94ce0acbdc43851493ae0bc3fe06f9a81d6d3dd4f5049e510298b0063760f30dacf705acf0776a441e38a2325b625a49187cb73f665dbb5d876ceca2e4d851dbf3a471cb49efbf505853ab94b77f7d9233333bbbbbb738ea69ddc70d22e12490906d3e9847447e1806af749a93b14964ccada5c42ed1b4e509c6fa2ba6d5c6c5de7f1c89bc17ffec6f4d24d240519f64435164d9512d6a2be9403bc70c30a33ad0a4a7ca02561fdb28f12980c2cbdeca324075b12b62ffb28b9c1d75d86c9c020030d1d8f121f4a98b09ffd2efb28c1b9dd8f0f5bf1831e42f6c43ed506ab71e5cbef5bc161e5be4c82564404d4a5982b3f443d1062e5470bb9ddfd7d6b3a567479880f4df4f6b787f81083dbbdf263ca2086f42085ef3f25af1be3f2901e8cdcd1e5213eb4e08edf1dbfd150e30cb1423ecbdfe47f51c8275c0814c811c110926421822144721c49a2050c809460074a482d58fee7c3437e1880041358b0c510487011821d2f20225394c0a608394462ac78810e8c208512b640426bb4778a6b032b5e4c2c91822b5ca1c5cf18a89bc3f4333bb18590d68e96833b5a2fc88191567525766e5a75f210c96955fa4550ab6a3438e20851e760bf4009b156dd821c698247063101ac55b920825ab5760e4a19dc80a7553b1dc43c11b020c741011401c6ab25b170c10f20ad6a3b07e50f1dc05ab5d439c83d50824f4eab411516ad6aea1c943e6e5e2db90415b19654420a3aad7ad23928655c00b56a8c1eb0569551832bac70f3f115406cf80a20363dac10032470e083900f9d944a35454b35c5ab55535a728aec084e921f2fd8695594203e5610a49a02a5874a7e8a10ad14215e2d0755327cb5aa4a4b5699a4f9275fd8b41c943e49cc88006a559554d2830a433e7454349509d50218c995a18a882bffd59aa4f9377e38d104ac55654c881cf4b4b80930d21e57ce90e680d2892b92106a35a89aa255553a076515433fad3aa37350c2c08757abd2e81ca44161f4b4ea370f90404407943ca8e0c44b909687d60b18acd5a04a8956add139c8834c22c4d35ae91ce4817fa00515465afe0df2902244cb435ea911825fa3468d1a3558e017d20ec94337c745156ea6945d8f9ddd53ba7cbf890d8111243dbb8547f0182174a33002e8721446fcdcb81c451141aef45c5e15962ff5f0a545f9595891bc2da9c31d39f70e8e966871c7e52ac785292dfaa048952fcd92a33045f668b11b46b6fca54e8b9e11cb1a6853e5ac42fe173c6018b9ec0346ac795cf6f942c8adecb9523eb6bfd0b9ecf3c5cde521977dbc805df75c29286cff680b724b250ee54d8b0196cda844ed16463dea981a81000010004315000020180c070462d1703c0f24c5c90714000b7b92406c523495c6c23810032106632086a1004200000618408c718628a34e031f2e31e3bb984030e3c072d23774d7e8dccc340dee1e9f349a369d8c69635a80cf4a699aa0bb3bf928ab6a9df1bc3952f3e43426e8dd997c9655b5ca68de1ce979529a1394ee4ebecbea03e65529cf2d44ac6b6e91a84a9c68b79ce99d2d22d72b8e68b48ab8a85b6bf6a8c4eaca45b8eb6f91b4afb9d3dc41bf9e10e95a7d44d3511a4d3baf7716ba7a53444caa9c266e74d7a18a28ed0f923d159b354b83c3f853d93ad219216cf888dabe28aee90d5d089e47d33b32a75787a209efb24259cd67162ba3c4db040677cda352610f36388f483ae099cded10a586efc832fea0632d7c3d17c28fb9806a82a300dcd5f2a4eb6ff849b32f8d4d601a3c70c5596c0073e6a340d1ceb20df44d27607091d033c6107af0b11b7b2307a0b5fb13b730d599463f5849b30d10545c899710dc42aa6b71848761666b6ef65dc7179f73f0f0dc01995fe6a4bcf60566bce50af85c40bfcd611f1a60d42f9e71f3b76cb50d336b6912214051c75ec1852e02090cf18beaf70aa846be9c57d06a2ce8974a19a3f224bfba79018bb2fb52af8d0e02c6b3c0c5d3f7774f00736e3a012969aa7cf7e809d9119ef257c33430c3c116135c48154088f6f8bfa5b7cc106abbfac360804e67e0643023f2040b2adeca058c29fc2b2384752cf70519adfab7b2a3e5763da8f50a9ca4c832c21219bdc379d28bc96bcc9d0d5185963cb464a9f5e2f31ea8be8872ba0d6e976fb70d9c4aa6fb452eb8ca99064a9cf0bfb0e4f388b75c5bd966eb825770f7f7d3dba0204b810dc36ce625a8cf26b93682f6dee68c14f0ff5fee15954f33fa698e8306d28309e172c841d2f2b96f8b1aa051cfa2dddf0ec88c8fb678d1f2670732e3c75b2a68f4c26b0aefe9326aef7de708c0659cb0fa8a173f3b25317fd432c5cbd79d93181f6959b15b0752282f0dfca00c7a61222c0cbb492efe76486efea0658a96af3b26333ed0b26ab70ea052f66e926ca0da1b2d0fe945e1a2fe3d0041908d8f6d79d1e5676724e347b7546968c2d76912bf6e6e8108d38be9949f0360b8f588b078acd30b2e02259b3fd0925a8947869a33317a8a96d2726e175f3b25377fd42255afe68f672398ecb3f4211b1ad52f2931a410100f9be88936da7ecaf9dd90195e6aa98465e7e4bf9431a2498e56bb6e7a82435f175b50bd6963ef7c1be4840318fedda85d4470e977c3cd79682da1aa3568f92959dd1b6ab98ad1ceadcc661e304d1811ee3b4380f945f50430edee383e058a70e87757f4a0560f078f306a9cdee0fc6c0abb5be49118ead4693fd025c68de8b23b7d34bb41ec76a79f61cf2d62dc883e3bd357b327961d4d9b93aa4f0a7386ce8ee9d3ec136bc7a78da4d727c23c4365e7f469b689a5e3d366d26a409309708b9eb3f2cf55e8908928f84b53242ff1d188c54df98aec2ebe58c21ba95122c03d7a5ce07d46431f0454d4b8376f47a2321f1ae19cd4df11e0ce1b23a2991a25c2dcbb1d9f92b1e8e9ab5c66ca1229d6a9e31180cebb22e23bb528c26265bef67d9bb519d8cb87229893fa2bc2b8f263c46aa6a0886c379be394e6a6bd8ade664537500cdf8af06f6af1088895719dfe2e56f8ca9d579c086bea5884a1b7b5863b04bb30c4cc5e95d852e084e094aad05ecbd1522160ccbdaaa8c1e26db083161df127a4760a5a6867f5174220f02a72d01784edcfc180b70651ef3b9fe084b604eb6e0c1077a7c7f6b1d3e9495918a8e3dcdc2228b8ea75763484323e4fa497ddee518b780cc8868f7641a91d3f347541c49958c24a2a6f84ec0e1624b4d06611a75c0607e2861aa1e2765e9477bd3685a47c7e64bbc4691dc3429bac6a22bf429fc2fac841e3d740041be0a5e01e2527093c4e29cf16603c28457a71ada2068a44030e006c0f6e396d5fd3e25916aca90b3abce5aa1931bd8b8230d3f8fe35a1ef1df4a1bb282067288568ac6efd618953889ca2f4c34dc6d377e94ae2a9af65e2d192573b31ff72570515a31043f7dfe3cd7f0768ea3c3117a01ff11e8815cb38dba52ff55c50ef148df42b515bc2d3a154178e29a46aacce392a8cfc8a1ec112036ef4a95984d3be981981a378f654f409cb015a8777266d00471b21df31802d7c34ab75553730e9f30d4763a098843bbe0412a011f3f7072f1bec3eb73451324cc0774f94adc432975423e34864c396e74e3ca1fbd7ff56b38d2ee5568d78780c1c64f39888f4a1a7fb712fa7548282b214b89c6bd49ca2cf545b038b3a5ea78af8dbe88b9860558bdad84da68a87f2e8118a2004742944db8f83eaa74a7c6b05e57b5594757039752a728ea2aaeb7e42671b2f2395da0d3a6ffc1863a92ba00c028f09aa63d3773d45937f3f125056bcb9315799994e5e2ebedd67fd1be220f0591c86eb43380e26fbd87c077f1e96d08a63bc4d0e76501a06438dc61555c711d1585de79565603ee92039f07914f674bfd80e0eb86bd05f80c77d05673eb45e9782448ff785bd8c8e4c0218fcd95629eb575376babaf8bc58f1e3b3d767cb1f63b27ac698bc3ed959c08dc1549900ea5cd1026c1704b8d68542d61d5728b9870f7fd21028c17c9ff98900e1ca4fe31487d2cf23a858043cc1a9a79c5b297069700bc45d116c08c1fb1ca7112a2f62d9aeaf468467e12e781dc372780f7ce6aee39aed2b9519a590150e01cc1d96539d83523ecf580f5b41754d2abde375e0b40c5b5befdbfe1811bb6227c2b1cef6251650a49c16c16353838e3c0e94a228992c01e76559f5da987b076eb06b6b6d949aafbe9251d494ea063de118a3d6c79a9499d38f987ee066afb03c86a2625e0357c2edfd0762327677ae02993fe00aa2810d4353f29531ba6b596043d2a3dd781d7b3f8aae085043ec223ad647596ebe7b7426df748d7af661bf48dcd10b70b75f7a6d4a8b1e18c8d1d80591e83afebe8072ef682315f1654053cf42fcb5a14c27557f012a17437265153815589827f7d1731347542bf7cf578b24e3d8924559c3544d60f8c3d5cd2b6896016e6be90fb3f237eb682e974abb5f2e22e91b261c0a51a3c521914cc6c7dbb238797d8d85f390b1e8729d18ac534553f9c6bd8d7a501f254c49cf2e6da8460a4d150e61e956c84ebd27e59f86830dac1f968e96e3d93fd21a6270293532e31c60a3bf8a6b2c9656104bd281c7b5172f242987d4811d0c577d1da55f62b1253383a5a232bb530c0d6a553215c01c3869e78eae1248039fe5444a1a7658914338f098b143a702c74aaeb9a71ac6c1b4f9d0b00eaf45063f0aebdb2e677039a0dbf3bbcde1a4a72600dcb9c70fafbc4d61335b0eb6b270e38de54b68ba79e0128dc0c1aca266e3c2b5bf81e67653054a448ed3ad70afb668324aeb2c57316aae3aaaf923f53b677450dea0ab49ee1c182143fed092cbc47cdf83d0704f4ef48bfbfe6bea022832551bec0c9b36970f9dd0f453d7d33cf0d3bb1de46719a6829dc619f26ad0a47bea403132d2536a31e51dab5929ec2f7b53b162ce29164dbe4d2a01acef2c0afa70603d400c67971f55cfd4c995aa68ddec1465e1c1a76b884570e70c48c6dd4e17e5c9c1e0d21ce08401356e564fcdf61afc4a2098fa119bb38a6648f2a0131100105d588fe835a592e229d6e8666479d8c5adc16b6183aa8ad9befc406cd6150dc24ccb4f7ab1821ebdb885e3d853903383319d372a359d3ef6d4828d4a74a7ac90f90d2672bb63cf120c131f6a60d889b8c29b26d3d9b24c000cf9ace997be685077fbbe6eb3d1439669fe631784b7ec08fc03d841d9c99d205d07af5162cc7568cc4d9472e338249b445d461c3a2f658b3d35fad1e2d7206932bca078a260cb57175d4d995fc784967a93567848427c0c55e7a53a1a2b30b3e8f03144546eda55f012c0acc45d411c70fed59eef0193f09fba7b7f0da00db194330842b6a02a314845105ef887620309cf018c7731a8514e95d94278213a332f16ef910e453ba436455c7562f4cadfca604e54dabfdb855d532006f715965184ecd941c467cd4c735f38577eca3732473079fd030c8539b7b945e697657a561f08127daf4655cffe00a58a98ef215cd9771be1acd60103b5b33500e7536567952259637bf994e348bce59d41ad94eb3c28a5dc9f239b34f22949d68159bfaf8ac951266ddb773336f39e2d47258d9e76b6202dfccf1b34e22d0d2eecf85266788f5d36220f4ed34a7e1b30ac8e7082c20392508f82e5e818c946924249d42fee873f1a363f2397a9387d0530d5af0a26b18cc12d4b50abdd60ba427435418e9197e6c90aa7840e2b753782d9ca6f985e1a0292429e102c968895b87678fd277de94452ce1135d9951f40506b3e65f42c6d8c3b64177e71d2ad975ed2d37eb86eb9c5c796697feb57c52204ff902c1c40f486467787d8666b2d070eb7d6e22ef2181884f1618a61aa58a438662cb66855c9b94a0e44b33df4b4a62ab3d2529a3b82052929ef12a3a9b4c54f8ea025ae8ee18b47fa5c4575df080a91598b3a72e9c3c74383ff2f69b8d289c79853284049b4f4f00d236445957bcbbd1610cc13161c2805447b364df445fc7c031150852d6b8fb2e682278e11b7e99164a7c8a3418ae5ca87f08e90280b10180e7dcdeaf32d6052b37a89ec0a306b73147cbe321c0dfd174cf2bed047977fa8cd5fb48a13ff09904b70344b50ace1e957da194254dfafdd32e148c6578092a3cf506494733af283b52f597acbe233bc313c63e2090f19780c39a2d88555440659645b348a232f62166c52d684ff64ea17f971c2e9fdd77e14fabfa6e14da1b112484d489334652f1b85765b1477d91c1c71597639e09d6f2b2e89f83a9881a5033686ade38f237add885f826405305c3dc25e07cf5199181abb3f0fb1e9186c236789f5841af5d07f4b03ffdeb05d1402e52982da4201fbd2eec6272a0802834132def7138eda42fe26f3a4025d1e155fcfc155c5a19d3f50e95c73bdef2ffff519417b75b1ab4535f028554516ef05afacf0fa66d68d9d01d33c3b800a5f0bc06cd942435d9677d6f2a1520b18dc1c73b810e9096c38b0efff803310604655b47235a1f2f24059ce4c0df5015ab69f118d5e2131fbc7333aca0da622b7e374242d16dc28c47740e78c512e1e888ac64324c999493cbff0927c27b324b7483a57cd05b84454d3295f213784af491243d6312a6633a95820f8fe6ef5acdcf84055dfbe6f9812600e6c0e7dc3fbe0bc75f03f5f309e0a1854b4a2bde0c9dea61864a813b3035ed2102d548a1c25f46d2a52839e284de746a5f1b1841121f644d971d691d9150ed62f08007f8c4e6f5b9ebd07b932a348951ade9b065a0eded31adf1e682541d0a7ebb5c52b231f8558fe7cfac6d2e55834d0ed47ba52c2e63a433cfb69dda8a2a6e1831ab1cc2d11295b5a516a7b6b58b01a423f89e1362f4f54b0105940468dc3ce6c4ac76e7f4463bbb4acfd2cab8b482a61c5e55a57727b0f1f46b317dbb76ebc27ca681a1fdf786ae9ab109323a5b8a46b5541efd919414c5fe96b8643f1d038b425430aceb31590857d693b764d644d52db68baafb32eed472eae29734b45a1b6848761a2574c5cc8a243e7963b9ed9e8d99041c427969453484b95b41184a18d4ddb7391aaae249ec63879915310e032e920c781bdfb2614c57ede439e751ee94a97be4e430f2b52acbba386ee6b6528df855b6c15099ab3e6bd023e806ff9f76a2a13045b020298f5c3f1779e6f8fa96048ca59e1dbd9456c5f026fb73896f0804b1891fdd8deef6a62f3162624f52381bf20b202842cfde19f63c460e1ef8912c8567a0672a9969ea7cffae08ecad186a9832ee9e64960372b5e4cb3e25abe19a6c51bd24c6fca3448c29b9d7a52075343604fa8d7e71bcfe877b3de34a6ea299ccc4138266eb46897c48b337b4451ae796dc6afe8e1ec1eae07227c29980236dfd2caa838e126d804a5461caef39dbf92e1007c4455fbd0d6b0158ebd17e438074ad71c6c9028bd892892c87a27aaa2360b67b22f89145f7de11c516161a56abb1cd93f04544413d3198a8a0f14962aa4858ed112b22e1e763148e84c50429b37e93036dbfb157f70189be47ecece2629c20e7bd023c1e30fa75598d57b8b27837f985f2abfc451f4125ffd3194d37633ccff5885050161a3c444ea791f04eba41f9959d23c11e87bb2992970cd2bdeb025daa7b50cd4680433f468f71fc66051132063d4e0793a62190ca7479162e42e47f63d5773d3249f1ed41af15ed771732f920355a8cfe755765d57f0c6af2d07a8eb03e2c3b2a992431394d1493a92267166681b31131958f4af93ab16f8700153c5046470580b43dfc7d9df737564f9a2ca9b1204687b7675cac03898c9327913c28fddbc8d75ee193cf57cd77161b22423090263fb58a223b373ff7251096a0d4edf2491418d985c1324516653c3ca76b9433cbecb2b8560cdf6cb1e913aa342069a033f19b0ad79b986409059c4e790849662834dd5c30c23a65679e03525a26b2758a02300cf2b5c22b5247df973f667a7f3023bf29ecfb879462c7801c4fb6d425a06cb1d6efb49262ba7a0d61b773e109b7137cecc0abf20a7b806942ae647c408e161546cf9f24f209b33fddeb3271ab65e017d9a2143ed61e4ae0483b8952128cc8e0c1647c45049bd68c4f58d0d63b66f4f324c1add144f20a39094c90e16e285bfd4f46a23a6727681157e41f2e30a8e0b87c1211e82ba3486c887e034a2f6f109a049baec014e8bdd85c11a00def503a0e098279d49289124e73436e85a0c670001b089e228885d8823eedb82184dffd299893ea921c3f9cfeecc35328b553751e6751e63f552d55c0793891e56b4311b51914c3b3c7cb0c83655c08e216da33af90aa083fc9da4b10f0364ddc17a73e3e41a3ecc4aa30aeab415eb5f6bd3670d42e4ab0570295b388da791f5783cb75822e13c14d716a2f70928d03e807c5f7091490b1b855d67b944d9f54546477ce233b5da8fbd3c66a6a2006ad9049a4f740e0ab4a3dc21ec748eaf3d32a67a5f8e1df655ee0c482b2bffb7a9a64bf793316bcfba681dbd1669bfb4174bfc0433540c6c02fdf902a7820be9846460db2ebb068732d62ff92b798d05c5c3154488431f700e36f25de8aa89e57134394aa1bfea12e3e80c2e7a858831131bf12ccdeca99433e54ccd79f30b29c203c43d79b4245debea7082b90e3d08b9438bfc5d3e7d48bbdde22dc44c500f8885dbebd5bc3201bf5a3b0c0104be7e594188b9f7f0917d13ce5dc27fcef11aaa188a62e064f556e52322ffa8de38909480fc23251021475883f258290498e26820a2471c7eeeefda6489664a653124c092f5a6b1133333fc0ef2e71b8223974608e46cca842b84f8adff3a90eb734019a25a48d0146fed2db5a3023465fdb0d68822b2f7fdc19d8a6a210d48ffbb4d0948c6c340b8c4ac2e04dde0dfa53596eb661dd660db917453dc2a40a94506c665d145c54de91561308cd4d5f0f0ca291db6709a00036f166158397a243d3087740d11f2c5df876ec4e98804c631a040985c122d8711cbaa7ccdc9028164448716d6c6ea26777aaf710ae9935b2f78ca060e75a0b09a772cd10862f0e87228d3ccedcd10a9aaeabe46f643122fe1cb5ff058de6e8017c0f347f2c860550acb9d301fb508c7bfb0bebcacc88e1c9a75635ed8a2b768af694fe8e975ea3f2436f8d8459bf9ae027af4f916b5bcfd0d155127be8c5583f0b425d8cd40688d44a6b840c4963fabedaaf66058f8c1e29f5d9c008031ae5d0cdde501789ca5ace86b57f7db00ab8916cf2f03e73ca46cb3a221ce0c9481533dcbdb0eadcdde140daa354e41185ea9e232a1a71118a6d9cc1ddb1b15ca5917b58c5039f7d55ae8c1d5089b1726d5a0bd8b58282b2af88db6d2660c4f195bfd3151c55733b3681d8b0a6da3a5562a8ef08c64a0e692da883d036e2ad824ba88ef01533a3ce8f2970653ee130ccda28f12a3d01e95c4e3d7686d68a7bf9f7bf730a9d4ca85f4a009850b0ffc8800cdac2b1df933c3c71e847ed53e64269ff8c64afa5ec275b4c7baf9646ee90799dee5f3f5c826460201091e502cf1dc10d2b98c43f92dceaaebc85d08847837b6d18fc16f47f86a8992c69ec2b52cc00b8e26da346ddf10efa6abb21d4f167024e14cbbcbc91f417166884dab227f4f9d1763c4546906df10154126967bc480f06468eb629f3c44219a8156ef41c2c20dc426ab4432503cf6486a82da21b3cf9664be5c13314464f645f1822a2c3c5ec57fa320dc16b877b656fd29e20405e1dfba57155dae3f10094771432151fc10d51181f20deb47b28812e4101bec9701cd8c5f1f459f557a47a03b0cfdaa4a9cf3ba5a54fabee3d4dc4639a0ef9744d9dcbcaca5dc47d13b917180adfd41e0b3726ede9646197b151ae997d9d9c5051787bae57b736e6ae3cecf59d0dced18c39d4bfcbb1906dd601e5fd4d310e488b3d18cfa793c5eecb2601330e7b9979e7206d6f52c39fdfeb0772f2a1ee469e46225a94c16bae89a57760c3f901bf77ba4719e771740c1d0e2358a1526fb294f9fa8b6684b929fae33511fe5d95cceb89c813a3169d2159dc0a4bd2e320a04cb9b2a5933a0d7f163949be04c24b9ba63e8c284f6bc454649d49f0e3c74b764017d5038e68f0efc33edbdce8ac92aade83cccc4f84ede21f64bd87832f05076c5b00347356f5b91ab5587537d458f42d04b8be9bf01e731da143431a7e1019f304d42719afdd0a873b85631c9ed47d4c45077f2e54e34f9a2f54361b1cdc2851081c7010fd8f68a904d82e09b04ffa3102a9957b24e0154da119d7285fd5de9f92ca14a950f5acc419a0e41777668333cd3e3cb739b044df4d78113cab6f2f59d9b5bab287a0d1a011b2594e2d9064d912a0f37fe3f49c4a2b469df8e61426feee783be36bbf208053b9b2a82fe51026029164aaa90f0857a08c3d41c275f5e85430a0133b2e2547199efcfc11714a456181daaae21d164a22924f6411cb78fcd6a881807ecd789cd9e03b2b1c734bd64256ad40f920861cfb5a901f275928cd1bc103d8d4329d9fe25f1b222ad0b5a655bcf414a9c2858ac6fc791e8f3a8e2a994b7131ad8ec883b19e2bbb3391860860046d7785bc922a8299c206f487a414f5752b8e4cd71d122132151f33e00698c0e05cdc131f41eb3b631828320d8c650b6dcf4cb8cefbd581f8a880fb2165813e5f44cae09a1dee551ef8516bda6c78d4674b27c30b2960639b333e1d25bb0f3394d09e7c8f25c99ec82388921e84cd08a3ceb8086f45931070f103b6e8be10203ec2928dfdcf012d32b9b7a9c097a87bf308a1ff3ca77bc0a3440839e842ff7d66acd0fed1a35286335f1b2ed63a6bc64ac1746fca5699a3d4778e087074e38e1831f3e70e10b07fe70c02da0746368982d67f8c015288a1b9f06f072a1a00574ce3d1c78c01bd07383f489d58744f3381295050366e5b71e7003a8259f9300b65e1826fa7372356a40fcdf5cc38ed9849be9dce34f477278a356a6d17fb41daea5cb9e339e83b02b4272c3145d47db061a4af443ae2001dc30bf8fee644e0aaceb33088fa32c8c2004cc17ba2219ddc34a46b4457b3a08a7360001160070bb812242e9a994bb38ea07c2323b8c4ada72f0990925a5f713d8804948a5f696009b980d593a2f12da94f9215afaed2d0137dd038e7710d0e626c03501a2cccd099d32b004ade13e375024fdda8a8b407bde25fd86b44c61823e3ea4a4a3ff94ab1589806ef3c3345310ec3b387ea579a5d05f467c81955f3906d7c1963ea5a3709a310fccb25541abc54898f0c499c7eed956a7258d99f15cafa0704dc6e874887fa3b90a19a5163fd2c59dece7b6bbf6a0ae915edd1205f18b21ab4d7e92727420b8249e645ca8c891b928f60c3f9a066a445ee1d45dc72f85034ccb0c0c776ca176aa6e904b8c46057733f2e796710af348be2d7190f6441ab2fe71ccb4506b0f76294a4326175d966e9a5985371d56e5c97994535949a35ddc05c15a50e3ddf8d0cb4e7ad163eb1323defc69c8ec67d8e31f424a83867f483544fde18b326690367340c5c69e5e6a44b430cbeed48cb8b8a0e6cdbaa4ef715b0740458538223cd77fe94ab4faec5bbf5db8561b3084ab9a72d4684be20a81f6f92467bd40d18d4bbea5447c67e8747be5787575aa0c917ca9f3382f5feda3521a3d0adeff49b1f7793dfb1fe53aabb0228e90b1518370ca8abb0458d43d3718d0d9643fafa8b614094ee848035d368152b1ad8b783c3f0c2b210d2b705eca2cc55157ce304bbcf90751eeb6937eaa009aa79c15a724c5a2a834070b4e5810ca0f7d1d71fd701f26144abeab6de176c6817a2080cf43924febbc47135180a80284f90cb0e643f2de651f1506b76b2fd8b1a90abdd76dbb42148fcbe8de62df1ef2cda8b01058d852a0c84b510f3d284efa5af5c1ed2fe68487f80ca8de381f1d659ff6976ac9e9caea3a79aa910800a26e3be0c9456aa3aacd44b6f21cec45c21327829b68f3c95c8572197858ac6a95b6aa4bf5df2089d587dfbb5599c70a33f00b2701946bcd5513cff10ad525fcdfc98c9f0394252a86dffe5b43702f42ab6d0fc94cbd5ba9f642654579b53dd7abb836e6e97207cf7e4f25f487a40923ebd70c81a3b08fba4535e3452e7307c17e793a86207659943e97991889c154bb119bf70afd4fe06be5b7acaeb7d563372d6c94ae1e3382c08274aa2b910c14ea5d5f447cd1b0e2c97868fa49949079ea4492176be767ccf7705e5c1115674a8eadbd43abecb4a53e973d4d96e058ec5558cf6147fb8660ea4b5ebb04e3fa08792739fdc0950ae310bbe5b5122e851480528a03bd514d99edbda82bbae342c407c87d6e2de1686edf152b064d5237c130908b705ace2baf0c24c95644a89cf8b226a5f07bb5de8696a19bb7f85b5039679e296d7f9b5f48c536a566584a7acebe8556f010d4e5f3bce0ded012aad11baa8c9c4aa68d97598124a9fca80ffbd5f0c6e94f473fb8dec9e529046a87d634832ae28b7d8f1c1d4b8a35505aa576d63c0da6e924474c7d635e2e3516653101a64cb2c6abe9142508337e4f14bd0d16d45ecc5d3b0bbef111dcc0edb6e25f8c4afd5934370adc3de9c517132fa28a89bd15141432ac5529bd82e2d7b14ef0bf51946f05e55704d18a84679fd8b2f464648f5141110e731653b7a4148730e0269a1cc789851f354e6f2a282220655947c97717440e810492a93f70d41d486f707a7382b6caa4c1a483448c1561e1ea35ed844805e516815035012c672de7bf7437bfb40a0a3d38ae3fb9b4e4a1aba0dc906b1be28b9e40701594bb3db50c04c55d3e851d9cf797f28e44d355bdfa0f5341697ff134fcd9b4d212534109118f7e09658090247676b021cbbfa9c8294c2050abacd9da534159552ded8a84ed13b21f8197b3e2a728514436992e3989f22967670b79256483392a471451df02e48d55e31551ce04e714dcfb0129b4c36daa1f248a9fa298c0642b4aec64f1a25c3df67ce7598b6f41a2f4398da52af8e032ae91949f3584d42ec1cd667a8140a411bedd7dc2e2ac94da3fecd3f30a0e354131dd25fd994500804528002a7eb367fa909a94f2cd18a3c079db275f714ead7b450cfdcc3e91498acdbe17cba7d27e59348b2be9f8fa021555b9723aaadacb287c0918b5bd33ab7dc79c4e3b252b9bb4cbf44ac352db7b36400372a2a0b6ff277cc790cd5974a4d8dc8275387a6741869604b403647c2a8a24317c9436592718f610c0f781f48cf9c2b4324f25023d3f4a857612457634961fde1b2ed2be11dc12053fa1f4485942523751f8a0ab70d4e1b6ff579b7bffef7289156e0e44adaaf547b5b487680979b99dcd9abfdbe139944b297b1b0ebde0b66351958c11a9a6843e5590b60a85b3e1fa820c073e274abc944a8688dacfcf1ff3166faae4bd56217b20da305174a3d97162f997a07cd054599619cd4261d58ca43cd78fb46b87b5d18a0a4bffa47f5c58234ddb8c3bc85a37a403427ecd5c5e63d92c85d395d55da0b91ecc20addef0b3c003c6d2837299a696abe027f73b0efce3d150c029d15f5c6fc1fa5e8a499d5d403d498a6cd18fdc0f273b7be27e6ad846c5ee66ae6008e918150520cb07e7971d9bb06416848f763661a7e4f17a1f56020c3d951fd7871e9f04ec7658944fb88090ad38fa9ce08716ba909db8806e0c1719249d515158d5c142a556da3592ada9d9e84d2d29ffcc65518ae64989028683c3ff2f2021f32972854ffb2b33c5a61b7b3f280b95bd6392cd9eca62f49ca47a6bcb94b1103f1488121c5da270b2bc043f0cee0d1b40c9ef3be537f6ae30d783943716aafcd5959fdee36feca70c2fb5c36a770b011c20989f4831ff98647e9eb246e0d1ec6db69f6ffb6be711cdc11a96b1c477b3533770d3c6a4b0ca6fdeb0741abc73cc678b610838fe6241c5c1f6aeaa08d770c34a8d378ed91b715377847bf04c4b8f745d5406ab821ed35544e30d6012f4fa037e1a3cf741c0e7219b34cac84cd3463250958960350e8135a99c53fdee4c88749d9f1341496a0e6907435b2e6a9e625bd0d1d72a53cf79c75ea9cd01dc7f19d7e1fc6b839ec377bcf8916cb016b2cb08eb63179cfd2889422c1e91a996ddb2f7b354317347ee12c69f4889f008b5228a8d7b1ea2b96c91be4362489a503dfd26d4f0dcd0c16bfe03e7f9869873a3bbfb7f59a4ead32ecd3847f47ae93968f77029d3f01798f142fc10b69ea7392f94ce80d1a15cec11f5e3c04ad57cb2822842e4faf10a0231e4bf6237a14a30d81fe85d966217df74d8e3ff6f7c484d6cc561d140560f4d858fe194d45b546c00bf740f45f03a2bd0df042f286f6d5840a5605243c962f0ced10b156596a0aad801029c4b650835d047032f9aca6c8a96925795a1695c6bc10dcf2a793ac04068c190b08779c4bde7f59ab42991935dd33f8dd20cd8fd28d2e5d5d682d6fc1957350365d5a86bb3a465735b37d444c4fbb6e3cc55c765a71cf25508ece51ba0afe5f71ad9a840deee283259d728a98f6c1d4d79c5b4a98084e1dbb5e7db77af73f61fe61a9f3b9ec1ee62d4709bf75bb6a879b96de88807a07dae21f489757d0a3c74693f23726a9c7880a4622c3b230879369cfd03d0f3c0a36dc989671e5d896aff869ed75006f00d69dc1bce0dea8174c6d964e00c0656797a08cd6bc8ee0509cf3d1640439383d2677e2becc18306df0a98ec5d577213eca5715a252c59ecee0e3cb78d7bdfac601e5356fe6bf9638ce3a2b25d207a5e7ce60cf85d1894f4b702c7c62beb643cdfaaf436a386abed7c105bbb8ab95d42257331ba104161bfe9440cadd303f57b38d2e3c01662618177b0001dbc3708667041a66ce7203b69d7fa1ae0790e336e66bf36a7654155150aba25a2984bd6e172a8eb7400d47776fc04d06db450adf606bf1351dc30fdb3088d5a7d96527752f70605466412186fb87ca7804f36970f52180626622b77d506dffd14b3ef8404f8bc43f46cea1d055f7056d4ef788becdac15d6a72fce816ae4d055072af8ae57f84f0550a2c458574aae783c7cbae92627273220e35d7fe4d40c5a71d92bd977697e3de7adc21c55de5c7fa23e83835727d250a793779ca55444823fc73944c53bdea3779c2f772e981ccfb4f59b7cb02a7b6f938146291bdd7921a7c1c5bc845b2fbd4000a85f8bf70318fdce5224b518814d4896ac762015e50d2a24a348bea2472cfaaac3e0daac2d31811399c45314983c80f0f3e8f660be7e21d4dc75498d039183f377e968ac23da49b94f767d0b4ac4e0bd3b3a7f2c1358a4bfc561175d22d6af4535e88287af6f16a6f925cd5571bbfc1fa6b21a5dc9c66455de8ab46414ea02e4ee5b60d74ae0490e0d1c52d4034a9cbbaed861e79770d8742cfe70d84fa2644bb19b7b89846afd3a892da5ec1a94955408ad7bbc9bc8524713c07da22db7b71a564ad6353e5fab431eeb11eb137e29f94906c446f50abba6f98e8670f3498bc905c6c8e1f18122dc21053681c3c5e89b5aad5cd3cf3ef9375a2678b82a20b50e1b49b7f810a44b03f0c941c38f19c22531c53b680b380d0114d0e2b8d87bdada1715792143251c8154ae9e21f12c3871c4436f8be5a77e279cd909518114b644765462e1103a5ca98037ab00f532cca9a182b60faeaa247d6a0e8f3cf8b34613f2c18fc2325b18134cc1f1f5e28be12549654af7a18527735fb8bbd3e0939855680c1e994f68fdd4c0225e85e4d9e7eeff6e5b5a1d770982c48c9927147b0141010fad0aaac0dc04064659487d135e41802d53b4be90bf67b0dbaee904d4e843129f7889a1d0b4aa6e2e8e9a0e9e3b821c8d5502a0a7dd5fa0d2819afbf99584b2b9a8519b7fa93da6289a2ba836a0528f9b32493e9d10ea1604f0a1de457e1790ddf73bb1c4cb2909219c802c01deb42942585192890f9c8baadc0500ac377075aff682e3240590d1cb17766b0f12788e6a37f37514e64eab74843cc434b4b25a0ac71915d19e54bad30d1455b718e00c81ae4cd856b95f6db98b627d0a440e3d5280f4281fb5460e8c1cebb1c414607d2dbc2a6a0b729a5fda6713c4014ac430c162480a3a882b3e80215383ea7e0f8cbe99c1b670026183b5664c5df61a3a702128366aa2c808e7ec1e4257ff534f502a31740127e6a8c0894febca2fe8c120a80373b8621393b089225c8eb7d591cf3c4c31370a887820943a3166c573ddb28ccd55cb4e12f54f95419b0c239934fedb27d855628b2913b1df18141b3302696692c5651ca7f19b1d027c66d3c151bdc2d8a1fab24a38f8a56b527d30a5952ca19b01847a67c13e14f1c2fadab6ee2fcd76032c9fd760f85f284216027269f1809577e9c0904801797660282eaf5ddf7924c211b691d618f37530e167f35f7cfb49ec6b099f6e2b013cee58387289e000b1082ddb0e55fe73fb6ba67e998231c72ace8dc69787de768669bd63c4b8afd1f78cb9cd7b62e55e99fb55eff12f9a9b9e7fee74562e701b1f484b8c3cb9a71f5f1185017cd8c5f20085c219be41382d15c0daf95707a0ed1dcad35d1d39d2016ddda6845cf65dd1f12d67d94e50fc55820192237e965fddbe99536a116564c049b624de954738d6eb263116b7f1ace5e42dbb3ca7d59aee9bcb593fc82f124d71d40c67c6e2114a36aa5f30a0a7770f2a76b6dc57d33cb07f925c8b315598cc1a44c2c73d14ebeab397ec4cc7a8d5c07bcde6825ff04c16b68a18f382068946f4bbdfe7fa01d0f1d2aaf0fc6d87a9c3530a42e56084a7c9c6f9fc06fa9eec03820699611d02eb6c86ad3ff7ba49f9b332a1169b4ca228833a9ab5bc483d5559030d9911e881496be5d8ec46e9ce6dd15ecb21f0bf03c8834da74150168640c04d0b04d1a97605aa448fb1f6a8c22a865384bcd448abf5d28476e9b128f0b231a7aad1ab8c11bebb42ccae248471c5a508b3b7a144d2ba0899119adeca308a4447ebdfbd34eccf05e58ed21dbdf4a1cd28fdf89e5aef915d202c322cb934b301b2867065d7f4278b638b054caa6b86ef95245450f25bad8b7f799c0914d41666a604ebc4095ef750f6495306004301d1bbaa45b9fae81d8953db5375c5bdd7d624f662235e6bad32146de7e1f7a5fff54da2c993267b34bd421dc09bcbc5891f701673a3931da824767e01d5ed6eca4b48f601438e11d945440111c9376deacc9e8bf329cee39da99c848ff7bc396dba75e2e637bfd1e6b01ea26854f6395dafc6b95c0f7f0eb0135fb1bddd2b50da247632bf576e069353cb3f7b24930d2daa569943eac8ab835d5c592cd6334a20edb6006e859d0eeb9bae3d0a0b274e93aa83f70d8019d45b61a1976244f2552bc3a184a27cc0d76c4e012677278b952a56d02e44b1007b28a3b9340fd5da16556d8b44e926c128558fde052cf96189e1e1388f918c8a25030f8736a1d8f2c0d1883c2400a4ef3ee49e644c3b9193161338d870752ae882d1729554af3fadc32d94505a8c0662f7f096e185d8ccb52639da83cac4d9ba533f6d08e9fcb02ec43367a4d02cf85e5711ad014039ad51675166746f8a98ce185eda814b671c5d86cecb5e74ca26e5187ca61c07fb5498b0c688396a658996eda0e236f71b4bc5205d8a92ac3acea5333281c55dc1609614645369a9ce9d324fa3d59d4b4ae00ed238e8bec94b59f68cc145dcf04c88571d823325339f4ef73219ce0dfdb94b4f12bc6051ea6f462b0b36a1a3f402314a7b8d6d2fe2102bb4910fc7e91f83a46c8e5c5c7ba4e680c5d57638f258ebfd8691585ff65f38f5381aaa720b67f932b7713c65ac3f983dcbc157f0b75820029d08bae36f2a08971d901fd95f3833f17d6856eaacfff5383f02d0841bad17964e4f51cb6105e4abf51c88ac5db172effd57cb5dcee3f3ff4a3553c082a3f3772854e320043eb0f422047a6305236b7a65bbbd9b4f440070a7ed0475f5bf87c7ba4cc0ddf74af590026286e65ee88ea7525b77fa400012c955ff063414d7c60ecdcda376a9d9ff51fbef9e680f5db2092aa0a8813be75ff54f4bc06957f9de4d69b41f37c1aaedcd02ccae289029c915b51f407f1b9dba1bfc2a633644fbfb1a688477d7e27bbb0616b3953cbbedd3acb44a437ba1b59bbfd8332950db4aed939edcf2897a60631ed3131693aa2975a3ccfa49c471230b50688843ec9576d8918730f94f6876eeb8cfffb1f6acda46d93d4e24351a9e417bd0baaf495d6058d9fc53b57ec3b4ce8ad8714b943762bb3be6c4fe374906378792baab7fd56c93b1c8cf1968c815a49e97cda2cb91ab262313fee141ab33603f748a0b8e7d8f12a5451eced9205e5fb7862b383984ac85bc31fa8ee5db1dccb77fe7ee0a2358c8d8e8f792f6464864ddd67cf73bbdb12aa847dad65c34e7303259cd92786cde1ee64202ac68adb536ec373238761b016a37931eda3210c3e165e45ff4cb77eee87c35425e1beebf754005ca91ac3cfc538e90fb2afbf18a90513e6949af44c562d309ecfbfd7d93215e2c43321cdc23a925ce333110c745954204b87e8470821fc7067c2bec0d6ad7fff6889d3d347c78890dda2b2348a94d23d18ba83b8aaf15d1503550a240532ba32e5c0a100dbaf10563a9a038749dec531d39bbe524fa33e1455a8a8cc1dc4cc89fd103a91fc80a00ddd479778a68aed203e3b0629fe690aea304454e884c6b1335699114fb0e9282f65704ce7b79d9a50d54d18b8cb182b9443c1a0d5cd0eb329b69e534f4dca524bb6e0b47a20ccf1ad5a8d00f87f9c259918c4dbcd2d3c5b8a407fe0aff2918e2a4b8282eed4ba906e7b724d65f38cd401dba3b28627973f4f52ab68e1a013295ee7256a3d25f57f331f06562d43ab34c374020baeb80f3b84f0d4710bd63fde7c0ed90b34e9690e89bf0adab6f38e48f8a7d3d4f039e003188b188536649c39df8479af495ad5e0559632454f6109df1299c4c2d88a4cea9eb008be4f5bf211229af2a232fd09fef8a955c3576d33c361ab632af975c7aa6d6f42a6f6a0b218c75cdb1449f7daba5c26e6bff316789c47de60b3e372326501ca63b5c6f4012ad88963e4ec05464439ee94806f1a844ae0fd7e5bb80d119a89d155dcbaf38f9ebc0b2ba7ecca6362f9d3acf2f0c8234615a85cf13430b18794da24bd13c6ae4f18ba59a44012100adc48798a5ed29a1d7c979149f8534e654a286a88ecb5191c9cf261cd93804f89c996cc188a6db2b8f47ed45ecaf13dd345ace61190d0654764b67b8bd1a2a0126c3659d49be8d81de9b58a102d40bedb01c60c3d40600b90898e03113b27df3bfcc45006129964499fa9c372dcfbe21bdc2887f65ae69283fc4ec29b9909ab9021d724258e1df54ff323b2d619d195f582a7a6ff43aabe97c41447c976d17c5447fc61174bca71eb56bebc97a122d1be581787acc4efe53a6db6cd2a8080e388e91fb1d70ec37e25014b8909811e64cc3cd5000544e8074bb9ce5566531b1027a43bba2d113d65580bbbd6db1695a999017fff0e087ce0fecb3bb3087ee59931b16062f71cff7c7412c357705c262d10a5b37cbb041401ba95a0eaf2ffeb9e47686dbabb9f0490967deeb51f6f192b9269d98e31c0ef93af5acdd0d308363b300c59cd8c6ac5ab80848bef98e688ad30f50b7e05aa83068c1f935a966d3478f71a2cfd6dc4d44bf56c51dbed89262627001f54f758bfa22cea46a1733370beb547f0166003b05c6f82c327209303207770a222eb6b5f706287ed6fb59b4c1ed01c60165f39863f886e6f73cd4d924bc4f38fa589eacd63b6fc2cf92da3888d3cfb7c512c218d0ea77e3e009a2c51256efdfac9df4a777ae302d313148649f4044e681bd285ce400f9263c5b6b1498b1d5bd25fa5c3193097e010eef06f01a9cd49990f5ab50da1d5fd8f2746af5d139db88313ff2ec4711626e04139ad79d77cd5115d1d1ba36ae6f88d695fe77be482777a1c47549c3c75bc14367e190033e85a6630df9e292cc7958d71ef056e14a58fcadf4959132a59c39690123a13aeb42099bc15c55a8b91f6ca27f83c4bd82fad63f74fc2e01bf4f6799d92f8eb3b5489f03ec5a0279973d2182832a9d3c8bb1414c533a1c0493fcd250ceb8ba35a3a31f0f0b4f9608d2017d7931c328f1d267df66d439081781c1ca6e7335a077f768eafa2f23333369f77691e5fbc57be5543b5f1611237bd9ac88568edb93fd2059a28e98099cf6029067ace9433c37e23f6c03b31d326abbb4a6888430e9c2ca3af84d61c6c4b6cdbbf9fd3e9fa13e003a357724713cc16d308a1fe1abc223f2243a42f06461accb89572e3da538b7b96f9ac257b0f7082c5724c67e0331fccde90014b4830ecc340d77fa7618a2488205af011a95fb2eb05fa2c00bacff897fb0ab80eb98e279c9096e2d5079ac793c3211bc87c785a1a6b75231f95e33c0259541e4b1f291f5b0160d6aeeb8e41c78bf002cd574ef8d560ed9c77de8e01cb24bbade2e3002c59255f86640d01c1c5a7e82729ba68d9b336f3b220ec641d2334ccd4612e3477e4be42297dac1eb63fc4cefe1a1ad01cf4d564c05ef4b72011174a1e8cbec01dca56517d3f43648d21a48059d6cf87c44e59e1fd02d636b0e4c6002138008539bf297e31a9be69dcd59b0d22c7886ccb46fc37e70caf646cadd63132f7b5db00ee9bf210ebad1d111c4e9127884fae601dc22f1f01f72b211f6d59bba304e9afb74803f1d52f8d260245294bb414e8343b003e31531e6508b8b193097bf9bb1bd65f5c5b5a87d1fec2cebb38f35b455291b45999aa37338d2618fe3f6a72349873119f38d930ad51011dae129bf69eb3906fcfca1200a3ef462929129856f7a986695d5d9a5042262a7bfe1c53392bbebebe478cfee89c3c072380dbaa8f80c01339867e9bfeb469f305312bdb7375217648736ed8809d7714320a2c14ef79941f5e081d2f72e5a89d4b43b2df9168366d9c0bb89c33b6b0332aeb6f3e23a43c43a14cb09c980158e36365008af1e9e7dd6906971de676c9bdae26db678dc28890738c42d73a696a42573aa5f93a84a3ecc98a0e63037b31aa8f4e115d9e742593199151465c36382025f663b94f88da3dfa5b2c604a0568dcf770ac29aaa58c666e0ca81719a86b064ad169d4dc1e28ae9345d6a2c1fd173dfe97d974f94e2eca20e4a6ea200e4bdaf900ee842474f16c600d61dbe6ce1f316414a0f4ef035c6dd7eff361b4838b48281010f4aaf5da57e9f00142779cc0ee39f53132d40b206c9d46aad17e41b238fed2f09189139412c1e2c0fd90c1f4bfd452235e06fcf2e871973dd1e9673ecaf7de49382c39b230b5360eac8f29c8dc40f9bb1789eb32ebea17b9becbc9b9492bd0b0fcf7e6fa31a738505a7e07b77ede6e0d539403bac85b3d8352eda947028a0ed668366a908331b36dfae564a652ae3690d03c5db0b61239669e0d419b4d5fc90c6824b4145615175ba504cdb90876196042b9aea6fd1cd7364a0c97ad49080294b702faf32d695c2052b2da1c034a82f14b0eb5f1fbacefcabc572e535bf0b4d36e442301facaa39a59beb8ee091023c0867b9a8b2c6156081160022000b0aaa3a3a3a38148d8be73f7f83e4fbcc7cc6efb3db95ffeb35a2cfdb2bb5776776f29a594297006a806b406f7de7befcdf7cb0784b8445d08bb8f9f00ebcc1e1debba27e65df979654f0ad6711d81d0fb3aee42c7bd00882de058aca6e31d9ec0047af4d014485140dc79950a95ebb9df7e797d0a90f044165970f9de2392be761dd771e17baf2b89e35c155cee9fbd38a736e7e1c0e33aef0375288ee466697131e5dc818eeb97132a3503461523b39ae1a549c3a251c346cbc6b5f5cf73c426fe9acc39c7c4d979dcfd60fa5a1b5ddf1a5d631a47d3756776ed955d7fbc6b5087325d8b315d8faaae4998aef78cae59525db7a0ba763179e67febd6f0a25f4c5d9f5cba46b5749d62e97ac6ee1a4635761d23b3d25dcff0afebd2ebdaecbaa6e1ba66d1c05dd7b85ddb08bdf2612d1be739de135fdacde1f1fe6f3ecfae46d71e8daebf1097ac0e6291010f4bdd00a4e95a9b5d8765d722ef7a9ce99a5c75bd65ba6689e9ba45d5b50b4cd7a6195dbfa4ba3ea1ba469dba4e85b87ce95e89c306b608e41d8171e95ad5d2750c4bd732bbeb15d9f5ccd83517bb2ec3ae4ddd350dd835ebeb9a86d7758dae6b1b5cd767eeba85bb16e1760d00dbf58df02b1f86cbdaf559736e8bd37527648e47083a76753f3e10e327f8c9fe3c500bb131364d5b7f5e2876b8c34ebc4e1c31461ab9cfa3755b1c399231d73981831bd8a049139c895c4103d20a29a4b837735492b82bf98a2d829c015905d984f4b9395cf7530a8142dd7e36ef374682afad4622b44e171ac619e31b4406477620b26dd8c70f0d125215a42a48177ba0fe32a797c0a56fa97ee92c0f715cae82748732c76113c648405ce6b2793ae167bf36081f3a5a653eb2557771b22b089096969652a21335898db9ce83795d0a9631be41f69e91b36ef9c5b8f3b83bc4b34b9d5de2ecd20d62d92078efe5b4023eeee12cf2f0385afb676ed33b7a229e4c0890aa23ff10c4043e570898eb38fc5901229165df90acf3b8d775dc139798e7dd7b71d7718eb3e24e67ee21378acee32ef696ba256ee9ee70add5620724242424a498540eb84a4771749baab2cfa9465423babbc4dda5dbb159ffda2b3097b98b3d2c1ec9e618fb6a48230debd075dc86aeefc51eb703ca65de71b4766e9bde111215dd81fae3af73fb1a27e5f6c092a796523a26a4b0020b3b68bb7254c7752e9db36cef0f90bc232472c9ae9ca422bb6e7c3a33f87f421be36a7e487655329b4206a414bbf22451c4000a212447c8274827504dcca8b52ec1806462571eb4c40b8c2891840b90208becca49a0933c42845a2b12d902d2089205e40ac822c81f92080184a40a4670dd3b8200ba245ce77da08d0d8794209b1229a34fd06cf4b917cbf46c56182ef107bb4dd45abd544ceb9008ad33c562fa1c90163313da457e6ece795bb29be3f1f8d3f2fcc3e3a4604f1f90767358a0d158983d0dec02ece2699996639673cee37168feb4fcecdeb37053a9bd6f0b02ff75fc81af5fee7d0b739acc2db64079afbdf7de5b1f1c3913b47146a48aa881e688a3a3a3a323ae5352529a559f749687ee1017cfc9b5562f97a9a3326aadf8e4e7fda2d6ca75625a39b3e5474c714ec1d191d275d52052e20c67eeb9f681714a5929756142acb53c9c404949899c5d1f2cdb888fe57564209ee765993db390a313dc2633d9098c00c271f8047787cfff18c81121109c6f6eb0d2b5d696e0e22e5fcccd3a205f0ddfa31c5c7c319781e413e37b649384e41e450d8240f4f7f1daf1ea7de0e76d132b914aa338ce4225d0e620bc9a933299ae1024915df90f517383e3382ebb00d0ebe7a8d5d53517922820879032f204a4106410a41032080904f903e943fa409a80ec8104526b55227920772075207bc81cc81f6409481e1207f206d207195baab51e5d514a1a02d2915119ae2071492a05a915889fa467bab773f86ddd48ddec138b5d71f581b82405444a264bc9421e78b64a32c638e79c6bc696e4cf735076220be5247976f30f0eadcdcff63596873cd4809dc73b50a6bfd979dd76b99283ca9c24cfecc9240fdd964dbf661682229627bf2d972b3c28dba06d468157c61884d1ca586524631c634c47208c628c3f188b462aa30fc630c6db38650463fcc2e5ca48347a31f6609432dac62e461e8c3b18a38c3a1873307231d65c92c62d462dc62c4628e393118bd1c948db957f0e97ab336a39d2020353094c3c2d485a909870e041b5f776383ba1752ebfde715de33097b9ebacbbb0bc09476deb833573a110dc0d5de5d813773a90e585db2483e934869f38c3cee51df8e1fb29a5b00228049310254107bb10638cefffbea6094230b9f66af1d3a1e5893008930f972b3d55ac60adb565d66b3d41a93695d7af9a351ae508a5f480d7f3d80d51a9c1cde2bcacf8d3be7c8c58d29bf3faa16589574f4b919bf3f2d11245528b90c5b93932519b8eb2a429133d3bca92beb0a448a43aca92822ce9109634d532eb351bd1094ad5e1fa624ab7fc3b41e996571357eb288e9e9aeb49e972127319a545375b94d205c59e28d345e344bcae342ab23aa96cdda2386ac551220ab8731c2c81585c97403458345627a25a8d62345833d0b03be61d192cb4af51d9681dc5e123e56d2ca72971f4e088dd9691157b9aa5ebe62272d9bec6557341f1a25b7e22aa3a5c4e9e9c8838d34523b2d191c662b338985f99caa651a1f91aba2d8b8bb05110d04f96a1d8e8071dbeda4ecd9465b9c355c977f99295af9eaf295f43dea7bf74f8978fe7e943404a7ea03062a287b69ab9157d8deb076fe302420e5c3c177107a884117780ca5be60e964025ff4a209699b287c364382eaa3abe28d526b5389fcd9e551ee7f3e2cf176c7473be1b92cf0181be157473c01f30c89e79c9e3804d881cb5393936fa6a55c758836ac3c251db65ccd50d8a8dbaaab72a5fa8f2c5e4353b952fa12855c74bc9db7c5ebc92d82cce0b8a3fed6b49b7fce58b72e352de7cb79bf3f2f12da01ba3fe73736ec6f8561337454116e7268c20d40609f42ca2db213f74ab43b7bce5bbf9749a8be6825283aac395c5db6c61a2b6a3630db6f98a713236baba95b7af19cb7255645b966b530d63a7647629d3af59ba68b715a574d96ecb725eba6eb765b9493cc1a67ba6aba4b257a5371353ceacca87f55b726259bfa6f299b0a4113b73755bd508712c0696402bae5732e5b611aec01268867f33e66a25c3e556b85aad64646456e9ea1693ca82bb11ae6abe0078abaec45e787ac95cce1bf3dc712f2f2671476553d970c69ccad63372d9c5a5a5a5856587ab9bb8b32a127746da958dbad0d5ad5beeb2591c74a4754b83527345b138a80c37a8f39186cb57c7e5167c51b67eccaa7c980c4e4cdba0b21518f2e08c063963d3777406674120b6e30b46bf65eedad6fb168f2c5f63392e5f49ec06fd965fafe2ce26635b8b7de867a19cad5f9effb3179fd3993d2c11955a3b337c7b72d6ecb62e1ff2685c8d9cb251ee27dbec59eb2ddbecf913c4fdb450b2b08213b19b1392707373e3068b15b3b7f8dadb381b17241111bff75efb2a15ae0bfd8772d8a8352c8d7ff4de7b2fa6c9265776dc9bf956a08c8e095522cc38834cfdffffffffffb7e0977b5d4c26979796130b6aa7c819238ca80a63b40cb8fa663cde959c9969f0ffffffdbffffb7f1ff6f4d5ddc7befadffff0ca8b39cb92bdc959c2b115c5961d63e4ce3fa76e4ea15decdc979d7b7b08a028e063de87ab6cb7bd6da277c2439c2840fa01d6aacd85eff263e88e0a6f810d229f191830fb1a330c498c1fefa37897de1f16cb17f9358ad23b2c9fe4d625634891d09c2e29c6c53ff26b1158cb1c3fe4d62426411e301ca52195014fdd8a1ad88adb398627f35880110aa294b2ee062e908219688f49bb3c332590262079409291859caa1236293fd995c31da57a8f460f26ed861171e125bc4c2b6777f2657a8f082d8a8fe4cae24d1017145054faef0c0e560874b5f6cdd9f8992958eeede84d294bd992845e101dca92e05bb8506606c172450f60c151ca12444b7826deacf44e9062edd6210bc16dc9ed8a7fe4c92b0e81c5092143e9282b88caf0929acb0535cb760d3f60d0909090909e9e8e8e8e8e828c925c92529a5836f5cfdbc43b0d7440b41604114194001830c274f4bc2c6c318586871c4154fc29916622401c41325a42f9cd84af0c3e409181841e20745309b3e395d2cba1b1d128ac0a1292609887efb3349f2219c6da1f59f580439aac31a56148f231f6bedfa0b43fe85a6d61cd466e5386fc7bd32ec5434ac170c9d45d2f273ac155bd1dcd64ad395a35de7709ed9ba45b55ae41417bb72276ace15631c7a3a4c0de18d4fc6703966d99d77ba18779e0ef32a9c71c1a6530a4626b41897b8d435eca95b212ed19af29deccaff7900ac4d7585258ed00a60042f089f174e69f21e88c8095346785527a441a3468d1a356ad030cb1c97a398678ededcb1e55a2d1144104104115a66c95114d77b4920c05f0e97406a4100f184b3db1270017ec78ede0530c208238c3082006cd4b8b9f75ffffad7bffef5374f8345b377421450482124b3484185f073a2421004204009259450420904b0050879ece83d5c0166802d33406882b8f326eca486d8f584300128a4d0dab2aa80d410bb3eaf07c03c300fcc03f3c03cf001b008ad2eec810161cd39b7f0fff76d0fd1cb71fc7228ce7ffbdb7e17103220c4373e27b6012104c49d164207847f6b3077210c7b7831982b395886e92ee44a0cd35ec89517a6bf902b2d4c8361b6fcf24ee4a1818ef92d51967e3928aab07b0cb883e96ecc5c05cc2d5acdedb9802cda46b6916d840c830cc3078bc16556e2cc569126979fb185857f1e3202f290ffe030982f46a552a95435956a6545857b8a90fd0044079a154aa06022d652a65fd3b3b2524bd394872510e7b97c197d0d0e109c1e9cd86d25d9d316dd6ca92e81785433433882e11c2cf90f170c86cf844124858acfd758286436981995e9b205ad64826ae14cc933c3a2e16692d99270a895432be613e46e72a86bc94ad7173fc294c721e55f33a6cbe693e45c72cec2242ce7502b87569096cf1d1a2287cea1ee1c1a6ac9ca18f28634433457d0d0583eb07a5832d61029d4e9e5d3ac1f9a2b688668682c1f583dac2158b2140d0d45433bd1d05e68681f0d4dd3d0583f6068b3996e64188227a3d3105031d4142821d410ea0a9b13e5a98da2d53ad369082723540c35054a0875056a68062a9642c550a8d809157b41c5503114addf4c2632d4a08c4f68ba6c36d32de683298d60ae4ba05548728fe846a506845b5a25bce2deab94c8f6badd1691ed6b5e52a844b9599c17175e10759fb1a6024238d6ee5813c7daae8db5b1e6c5d74821b2a7cd469a48d32d2c814aae4b2093832590aae431628229d32a464882664b4e2f9f366a194acd728c52b3d56c44b75a9528a9c57971f1a77dfdbc7a8c6eceab0824b2a09bf3fa61c90bc8cce2bc74a075cb4f462f2c464a588c8c983042c268b70cf59816f3e553b3d56e3559f6428a4f4fcc95644f237bda7413994c972db599b15b7a33a9804a1e9640260863a6e98e99a54bc952bbd57ed231de4686c307470f0e1e1c317b5a3eb3d3af71dd5c4455d2aac325c58bd456b3dd6eb5d0c44562f4184bcc4ab5e263f92af235b2af5921f133e4873f85f49a132b9440c184cc7673d96258cc978f6db5d225d08a83644cd9c361301fd177fba87c5f0a2e01160185c0283498423738832957566ccbf2555a3d95c9e523faa87cb7cf24ea96b7b07c29b804180528a4bff44bbf54fcd29d92a90c9c8de6cb27b5a5b5d44a5a4b5532fd8aa94ce93202551c26e6a68a8929674cb13357a93d5534627409a4e2a10aa6dcb7a53265565654375b9ade6c44b7a25b4d25231393a6351bd1ada8161323eeacac286194aac49db196c4465db634add9886e45350084aa1ba14a8335a14ae585aaf261614c299640311c8c493bba4ac9a28dba6c2e1c43f75197adf6462e5bb7fc8b29bddb4aaddc6c697ab311dd8a6eb5d4cacd96a6371bd1ade8564badd46c695ab311dd8a6aa9959a2d4d6b36a25b518d255d59196bb634add9886e4535afe3b2aa7c188c4fcabaf0044986b19f6bf2de7b31bef8e2b7b4229c58101db8a8dae02a7f5a9e75781c9cdad3d270a19b537a267f9e8db0382d3c2cfc791662715027fe3c17f13a30f7000b32d0916c0c9f303ec7b8e8cfb193cfc14648be65398a87fa73ace47372d06dd9bc0427e9cf31148fb3f99bf8bbf0cf431f476d741e2332fc398dd7f1d5be7e0e913fe7accff1b55a8bf12a8fb49decbd70270f68c5abbc7c241dcda090a57a86f42fa698b8d507da308f1e4d8963b1128886e7f275fb9a57d2cbe895be8aec69a3d4686009c4b3e23f3c9849a55bfe0ae36d2c4d8ac57fb86032dce4028a131d74fb8a7d8d65c998b50eb60ab2d19a9fcbefac07f59a9f6e7db05b5a582cb3e431f90f0fc6c3f383c36cf01f2e580d4ee354e20c3a9bf84ea1b38c336dc55a38e8db52595a3d3544f0add36c94ae2c7e04cb6b94ae2d1e87e5344a97937fd5ec4953bad2dbb2a6e9a23d0ecb57b7f154e26ce20cfa4e254ea1b38c33bd393763b470286ac52cce4d1841a7101242fc14623985ba53a8d5534304d710d9b7c8bead912bd2d2726fc9d2efc735cd8c6609cd102b07568ce5c30aa28299917a1159b2b30848b384664633c4ca8115630561f9a8688660688666d00ca56886449a2196ec2c029e455c4ca6fbe9ebe2a241fe9dd2539593110a092a0835432df9b3f2188edaa8387aa23cb55143aa28e277a85395537a3242214105a196a066312723d5c908e66434e364943a19f5212723d450b79ca58a22aaa2a0f80edbbd883ba84e571105f0d3a68bd6a1f08f49dcc12f220bf92514c92e531ac11c2c814a5dce30030dbbb7709653ed14e5d40538d25453bea5b2dd13913d4d416d4e9e5add4e451e14eba2d953c8ae3528b4af39d5aa8e9793b7e9e214e5f5a45b0ed6baf5898d34d594d39413d137d2f448bb238d1c69236da43df91a276f63392ef28ab2e9a27d0d1f62a3fbe5e524ee743ca32ac625108b8325100dfef11841754b4b4b302333d0b0bbe697c57263a1c292b62cf1adca6b4b6d116a89e2cfcaeb8c9aaa2f01fafb635d8ec16de0635b0e5363fb9b94c0a75715baec65afcb994b7da00929b8529c4b7de017721cf7852608c3240d7edf0f5ef792030f8f33d933e9c99702cb63e301527936e05d0006196ab0381fefbc0f9f980b45fd759e8ece0f711d1e9e3314330fb99c73a835df6139adb305826cfb23b7dc029fe3bb57c2107a4bdbb4f7056cd10b3d1bad3c369e9e189e54cae33ad77a99d78ebf600b4d9bd7a3675e5f041d067bda0bbc60e3522a117b5a71a79a55080c35f478e102326cc0721a6ccdcf57b039a97ba343c20e134e6bed598598a857abe6def36dd21eff920324e820ffdac1171f7690afb1fc05888d7e0dad417abc50837c8e3fff851e2e78e90e6b5e0f1774d8681552855499c9eb61cf9ef3e4b6f6e70c2c76f5667f7132b7bc7afc997c6c871eebcf7cbad02fafb907ce9f5fe0fd9a18fb58a2e327ebc65bcff24bc20d7aa33f7f34c55997870558fd6205641e21b8e676b9f8cd3139cfaebdf2e7b77acf5f01d58c0173b0c7f0a687abc5d5e26a31ce5c6e72c3948ec366062a06fb2dff0261e15db839aa5bf99b23785e9f5753752bc7a6ea3e8ce3942b746257a1f9e3e4e0592c1633e266b33aabefb0b6569e8c6d0a7d8e39be797f13cafb87977b39e78c4bde2f117c73b95f47e6b686d5a6e6fcf7e6d09e26bced6969c8fd9af0e753a721f76b61e091d02f9f8183db799ee7e112958184ee558f7b9ec73dcff34cb4ebb814118e7b13fd59fe37d190db9e893ec7f58a2f17d9660ee5fdde9b4d6b9acc7d4729ee35e16cda1974f095e11ca297e3ec6d0f8754e61ce7893c6ec73ba7c2b07979f4cc562ff470e7ddfa7d4de578e69acb9e4756f10036f48beab0bf787634f7f2898d39164f387b9f0177197250d7dcb5b93ec771dc76ce4421a0bb0a6ebb0a99d5dcf634cde0d6d0041bdda99d32e5d4de3bb54d40e067d95bee718a2d033893019c756bbdc86f31aeb8e28a2bae18e35ab9d501cee11539ef9e3326d36de24c933d2fcff75e0e55fdd7d4fe72a770e21b9233c647f91372a4e4debfff373923ddfff7c840fa81c6b2a29bf9cd1808877393afc91cc7407f8f7befbd7fffc87d4f0c24bc71c903f36bee1ee4ffffffffff33be3b705e77f150c759cbcd34be52dc1424d5227deffd4a92d9d4b3f1dbfbf5724bb338cf2fbeddde77726d4f141f2299fd2962da2026bae7c389f76557a448d6538378e0aa4cb7b19bd341b12dcba3f410f91475567e7a97d473cc06bdd9d1ae88591d94df3d9bc3e9d8d6d9ed79c3e6e8d49be7d5b49fdb568c14fb46c7e6dcf84cb043fb195711d47d1e151dfd2a58377e867a3770736acf6d7d5eacfec83ab3ca8c763de16bec1055b04efec4b5c25611f32ba260fbe53068cc31c89fc3b0811a38fe241fd11f8ae9e8355157b79d3943ed288b2cc7d2e463d718510222d72609540fa830cd2b4c9b3d214ce43d18c6a3f90f0f561fc7c7c3b2c2acd8028689e60f1c4898e61646821d6dfee3f8b8fa4afac7a99041ef54782aaa4de1eae8b85ce7c9539f92ee71ce86297aa7c22be91dd71834bf1bf61c8fb0aacf673b1ee87f9cffdc63cfe7d66e81af12fa9fe7e7977b8cb1c6188cdff94dd472ccb5b5b6e3d0147adf9e5cb54be867a1a4d7edad3cc76aadb5d6ca2d149bd3f9dcd8e7a099ff671886a1c581b59767293e7a149bd3f97c8e5a2794049a681764e533d1ae4851f763893aead94e16c56a251988253a2afe20fa9442494564e38c93e99dcfcd09896ccbf22299959f6e93bab5224f172402e984c06ef6d2b119da9a803eddf2fc77446de89e80201843e61dd79e89dad0bb328b982459c0f27ef7facf4a7eabd6ccb92e73382300a342115f5b45548db133c9f18b41c72591ea76057e311d7fcfe331781cf3ea710c7a36f4cee68b6fcf2158e23fcbf0cfccbdccdf8643adce5c8db133bfda25d129cefb40cd796b4618ee70002894a2990a4d740606fa35fd19d2d0efe71ac27a53ed757f2f974a79cfb32df1558117784a78a154e92ad002284698e440c40eac140049d6c4901d5c19e2080a40230a70b3103fbc507a6e08224ca2c2464b3d908e4e0f9c104166a0f3c3bb1dee0f9d1f254a38741eaba756b07d4f1efddad35296f31d41b822e551d1fadffbb735c7e3226ed0e50e06e3b0e5bb5f9ecbcec22e0cc3324c73612e3998e6ba6e847d7da2ffe6741dec069b46a8340c9a0d82c866060040010923170000181008854362b12489b23452d40314800e618a4e66523e964763c12487511044418c418610430821c610620843aaec06016041993d38a45abba2e1b8e19360cb62331aa998d841ccb3799860bff838f543aca47115e69b4530a6aaf28b22132156e48ab54ce8fe69a1764a7b7281ef1c450f424d061f1b572ae538d56c227646a8a378e1a1c42454d77830422c3c469d31853cf84f7053efa54bfb96eff75a565d8cc2d3281a0d891d31382f152a7e6ef2e39eabbacdc786e2634739e1d2a72cc9c3045322f908e5e778e2b305da34dd311a7a3283b3e77b45d12e491db06343a228893f6155c3da0d56266becee846706541a7fc09406a62730a9d58b777e0041bbfa013b085e04b49ec17c65efcc211432863bab9b07ce1a64581b8673b003ac4d7344c7106b9105999b2cf565c0eee8c884134548364925e4333169c9f31b5604e2a55c2433ce1be8700f959e8dee72d2963bd039ee41b86116cf416c947172b1e22bb73857996ed6becfe6abff1c09dc0ed75b6c81e245c701fcb18dc6e2caa451fdd447b2e08f0db4128b30c3eda03544753f8d4dccfc488514f575a1d4dbe29bfa04eea9741eeb407cd0f6a39ef76ee8ae8774b5a3354cdd16d278b807e989441c4e3ce74566b2b9fcd06c632d376b50d1d9260792d730e648b626a0f49a6b60eaddcbcb7cd81e8e6449d4d732e626408da0aaea1fade30298f4bd8acebacbcf13660f50d553600116a150b3fa92299bb78d854be3983434b3d78191446c68b1cfc4165663f1f517428b706681c4ce42803c160a02c82677530424623cd576ed70ab24de84bb50e86441713723f4779742a8696c395a0933492f3b709fcdc0ac28c20491d7a5ad3b097dd09394f70316c6ee2015f37f7c7b694f610b1e88f13b1e461a1090b7859a83a363f9b3c35721c315f51856d1e68619fff10ff4fbcc6965648bb588f6f9d74c351436ddaa4081079fb745da8ed0b17118853857ed9c0a983d9600aeab22814a3b26246f3ef3079b12e81c744b156f75772cf313d2a23730af3abb8e7b2c938669ff1861d192f8e5b0e38854a7b142f9fe0d89514a6fbf0b07424a399e2b52a8eae1f2c78e5cfa2cf350f112e8af9b0f174a27ae46b795c316022831b4abc4580d8de05827fb682a0f083b39602e2066d07583d529000db418e74a838ed868d6cce5c3de830e70414201e9f4d934dc33a6d01b8287105ec0565ab1b426149e42c294041e6bb9e3c20f552c5a5885c6fcc6695d3d1201e8688fee6483865b619182747f970357ff7304e6f78b2f0e65a40ed47d83d38dae4e02e10720f0b5b5449d22a6fcab32f95018e900981415fa424039a01a3167d3cbd5167ebad0a1d531180bd6b6e8a0856615e45c0e5cc60612dc980bd9da25bdc9c443e1e48e64bc8b1cc88df1239ab518e1f609d9ce7009657bec0d76c17d1ce0b799cde7253b0bb512ee33fa724a1c3a95742856a233fea98d8213e821551425a63cb618409a7bf92dead217e225f75dd3054de9a2b9d3d551fad818715062c03584898131cb7a4654c38010afe5863f8256d7cce9992023e15b1dff72e5be6c6534ea50b4783f11d4a00f2f2229ef4c90a2c10856cc1b224089e79041f4678e8bcf4682890c6aedb89dee64c1d1386065c7627cb7ef46f11173e9004643be490f1499756f6ab536b41902b980da1651f279c2441693849399b8cbdbe092840355c675837ab9ad01c5c46f2307a97374684923f1db7ea22f23484a12aecf4db89e16a993ff7c8b0f5349c211679e069c8fc138c4f2460d60a5f1159c9b4e3db0990c9231270fbcbc3a52e3df5fb13dff4ac3d4553437ff64ceeb5fb514a2ebf0957d3a95902322e99fd88453c873396663f942319d2464adecda76dcc3f569b7c8e68da7fde8aacff45816bf955b88bcbda0cc62657ce84303e009bcad467c2c777400aa5ac8e374caca61249a93510ac8831b70ac97e9c5943ef348934bab9789dd3f3ac894f6f45bd10f47572c81ed841c8118a104c4180407e627b0cfd1dd959371d0fe3056a92a1a1bffdd991318301ed02c54aed58c1b78fa771e86dd619975834acf1f94b4332f479070c21ee063a29e88d8940cca5d3410310834f7b0cb9078d1c0b93fd8873d82812d40d9c4a22d5e252be0557aff0adb3f5829390799072ce08397da85100ecb4d93f301ed557d6dce1b87b4f919aadef751f882a1f061aae4b3a4cba90e29a50d10d61bb0f03e9fcf19dfe4b9c7dc23d86f930abbf2f58e26a05b26ba4294c6024d1a6969c7b8986fdce96119a7e6a1aafc7a5cf09c3573b3bcf71c10ee2981aed7654d80352c4983ae6140840c1d01a1004fbcd7fa4c9663ec3deb6eb0c7fbdbc72d20553856bb7a2a3279918e2e8450994f086a88e63d08283705976d1bfbfdd642b189c00f20cc85227a55f9c6705cab45d4ab2ef7acc48494262860345cf1cca2d14691479cf1fac4c85795381eaf9971cd9314beaa8de0f88cbeba0649cbe1da40c3d6cdb24b4782b1fbc9dcefef85e12ff459889bf6c9b116b7477083f23d77d447070fedfb41412ef6dc56204b98fff07b1f158e9a5b6371174c0a44eaddabf852672e5b2c47db500d510413a93064943495015cf95d5f2ac09da88955b51511deacbef0dd1b64ec5ccef9d7cc93777685358688fd427899df16e82203dd7521ed028147cf14c0afa78db788a4c9387e1a959d10f13ab17611516a50d547199b5bb59f927ab76d006dbba49cd86293ade87a482c278b6eed7c2f4e9e30301991a972577b3ae098c5fe77c5899bbb470f0c1c6cb122255b6c7d97f7a1f421e20696cbf9d4c10d6f790dbb61c96030c36db082c77a24d85b2d0fc5e608efb05a6ecb04f95bb0480272ce4c257086d1097c0a5d1ddd65722c784b5ce36b30d4b7bc29d7902048f01878d3094bd5182ce43c45c4f91580b4786858cb45f9809b3b73f9579987263e916db21205223d7ce027ae118032cf09c3e6f021dd42463f01a8ac6aa8d6d51bec0e8ad9e959b5adbc608e6f9bee1bfe7c5d862e42b91d9dba95dbd20b5daf8d63d2661db1d245e3507d183cbaf6a2642aae36695ebb5af13532dad2c2396299371ee8a5e8bd268e14827ba61817bf1cbef4b87e882663f90ce1771caa94385c0c774d63462cd84906d0567969c212ebc8efd7b03ecb77e4ddf35dc3d821afe8494c6652b694bc018b9f40ce2295032e6b148fce7c1cc31e59de5ed66b981efbcfe6955017bbe3fc427ef66d377489ad8cbf2c6f3c9ca0d306f0d9908ee342cc12b62bd8576ab710804df67ca5d3dc45edf01f3b94ee0afbc03121013a6f1300e693ef65e6ea16807f478a9ad8d4ec60111d605a4ed88f2eece20802237219032bf5f73da60e70d97639d2f386563daac52812e05249daa276aa7405141233eb6b330687ffcd3b06d9af62df1ea0d8252496c811d0a048f431d4274ea8a5057aa881a9f66e39cc5b8953dd696b17b6317fc53672163a9b6d47888eaa42b412531f73e8791890c279c1c4c94e27c9c774f85708ac991e8025b80d91815ca2884c65eb3eb1a87b36449c39c0ecb9ba29d4c8ae6b6d076fa2ba9d6d76fb912dbe81e5d7869bf6caf31e8106c0df1bba580aba5c09bb938c55ec6cb378606286a02e89944093761813c75df8c7277bb49a7e477f6914103e8a87bce75476b24c0227a83a7ad3f0e9eb57c76b339ea7b59a1bea296d024d234e19006dc8e314e1fb964c7d89796051e9af24f70a27d7ba2c2731b8d299a044136a6e7731128a397ab1bee07786214e9a17601be52841dfb0e23a92fb9df539a0663844f826c74dac97341676b04b9a295a1cd7c007abbc1518d239f5af10ab51082fa8de7d6e784082c151f01bcd89330578737506e582522e972cce0c1bd263d91539465065d82d83d77aebc77eb36c26e5a309281f09232780ac0c122a201fd60ffde0bd7a02aadabf87cc589640232b16f27f05a60b4f2ea64813052fc88c2d94a9791cfc830d9340a5312c887d83b925952c7069a35fdf4a8e699113eb38255e5ecec321522e534485d91b1151beb61f2d7e48807262773862eb004aa81e19150359570c2135e342127c4c1e31af5c4537ccbb3085b73cf843923e2c1226dbb3ad1b8acebb90955c0e3eb8fe5701af006d7c9f172f5a7bf08611d78c3d2928bc077c8560cfe8cddccd7da356e1d564e2a2ee651b7e235ad39e5d5946f6dabbbc815284be42d9fac7595e510d662a6b7409c929c7b425e11212a7a3a5f4b684a46f10ef0c884ca5e851ca0af904bb428634c51a08f74f80b0a74442b9e812a0fabb216ba16b5a16c109c795cb10689e6633e60e4e01a5f34e8c30e88227212aabc0b37111668d7c2821f5f9f6b912b3857411d7f7df98ee102a055dd55abc242600e4bbbde019cbb9bc06bcf44220d924a0e3a39103591af0d03bd00a3f25b5bb804bf20fdee6d285c7d3ef1516678c431888c24835f0081af01c208843786c6f4c8f02beb0e7935a1c97cdca599a4711e0751c33c091ee55cb7f4a397caa04f0e34c697dcc53a1a662eb8524dd4bc611f6952566bcc013577c98b0fee02962c19b5cd221e0b689dc3433df162de781d5b1820de7eb50c717c2cfeb7e4039541e12f8f81aceace3625768da4496522094a0383e6b18e04624f95540e97e45e7973ea0b2624b6f1d585bb5676bd8a3a7eddbe2bab3f36f8f5431eeb20a15c8f15e39aafa872f206fe47ddc19f16d6dfe11a294ae0334cbf7b5708e5cc6809b4e10795876b765f43278127e3e56a5d1264ed56efb19c904f08f7edebe219ee0886a34676214ceabf5aeb4c63acd9ff99dca80bfc6b97225c9881006fc7d91ae16889582ef68bb0c4b011033a58fb9a0fc48530f96fb6d1f4778cc9f3cc587de5b03322dfb8cbc3db4e47abb3510464fb3811b4c253d69c74ff6cdf4fb1bf4c3dc731396b8f99bf6874ba834ebe8dff9638fb448309f6caa798c7523de2560507860f67c1230b068209e0c781dbc1c7d9afc4a87d6cfa30d91764d140919f60dba3c780d5e44ffc9546864e28f2cba699858ac7607ce0427de21147f915fc20caa4556d4e07bb4ad3a6277481ffc57d80723796c06bdb4683d4b6b0c62339c0dfcbff894677847120bf543604aaa0d247be1f0f207d6b0032960e4558124d57314b0215fa23adb58730c54047f22cca70eb09cc1ad9a7d5237a903addef7a48ed1c42c3a4c0794e3cc0c74312ca830a6339cc8834334e388bbcbfdfd3282939805f867c6adbecf8009aa6aef3a4b8fd1ff15eae07698ea6cd6820d6bf54258b6e9d8652c801b734c03b2338c4e675abe60eba53ea712e2cc26fa43e8f9e2fb2b1cd8dbd656caf08075b45bcdea0c18c4053c1973f9e61a7df2c459d17fce72153d173b0079d97c78e676086c43a349e2ebb2b3a8030e9eb50be517fed72c001c619c852b228652dc1e79d7b93b3a424714f7e7bf6a4a34fecc605f9875e4a068964822b7096903d33283c94cc3999f3320c453c8b9ed6661a9fccc875abb929397b2a1592ee06853a31d879da9c018ab93727b5bc13c660554de64363692c8e17c2f4e3cb929943a7d9e1195a368ae85f938f797b986dbfc3083006ce79a81e320fa5ed444bbb89c991fa6bb2522fe759e76762bf28fd6bf8dfe1590208db265e19a50c34cb6523860535a30dcf3bef52a892aaaccf362c98e6daa00b14a7e98552d2f2be55d7e6b932a85c6908a82c2f0ffc62de241db6ce1850d3f039f37adc91038301c58d8fecb0f781f159b33d67f7be630949b17f3f8fc00cffe1786ac4ac0e93fc92b5840f45f4f325300b48409420f95fd86cf73847ca079f4f071a012c44009970982efcacb0f57039d4e08abbc4c987acf2c279c0d6275b8b01f685e882bc1acaf6d40ef7883a35362b0e028150a115f42349940f93861f6ee72aa9699771c2155f10d51e6ba0dc9102e172f3bf8d79b531be28ba4bf12b29771fb897587bd75b53763c178efdf61a5c314bce2776547ef08ffbcfe1869a987ff4bfef09cfd8833146052f5e0399d6aa147eb8f7ca276d7b60071d04f6bd4972d3524e185124f29be396d57279725deb27f961c8c1736128d241076e4cbadca6955e88e012a2e1ea097dd0ea0e2b0499f9c90f1164579b4b357bad349b08ccc002f96a1db701f8b3c2e7629713ad54c9c80ffa51178259c2d28e46dfc220c8510fe02f18bea4015a50aa8e8681275cdb014116f8dec15c1005575fc52abb5e15cbc8261050dc9825cfca235e11f5219d53df654335d9a0bc4f6f83ceb9d58972e7db89cff151df46bf2d8b7ed591e5dfc92ae5b65db8db8f837cbf68277d3ae962d77b6491d420262d7775b3ef7a19f210bca93ecdafa34f204fba1401c95e8c38bc4bfcafb4b0137b1f04a4f27f5ce38cae2a64c373807920bcea20687b4fbe466e8a4b53d7fd28a9e5d2c959ebe5b0d8f1a93d649cbd3beee7c9436f99bfb61ae7f6e90ef71a13532fb2d4a2e7d0b35d1a0608ebb7200c43ed02a9e3070dc651db34bfa2f5c7fb0cacf6a69cabafe68033f5452c0ac0e98bda7e51d4ce16287ea3da27cf2068ca691c27ebf8f2833fd2a748c3b36c9ff609bc248d28e2b5c8c0a54a2155c84bd5eb3c299107b49346522247d5344a92b09fc7f4354821cb81103033fb25d6061fa6185c774d32f0647433e8a62ae45af0b0caa11c6495ab1f5d4cd731d363bc9f30a6d1fcfe7f0d9d47ba8d0261f65cba1bd5ae676dec80fa5cbe5fb6964a8567b9f222a3caa2fcfea7b546e47c86c71d9daf2c4255406898e6c5c0b2d0da19d77cb921091db75ca1483da67e3d4e5869efdd690051555ebe054d9147c1787d5a66a4250ca3c805b43bf7f8d7b1170adfc6ea15a320b2abab1410d624bfbfb83ca3ee7a56093e7830afe754929947e1f0557f6a57e44c7c411c943b7ee3f1d3078ce71881712f7f8c8877901327ecf7a2b5c4d2fd37d13d461b6768e1784d382e8bea11173d1c5711ceb305bd4bf2af1647363ccb2ea9b12ffea05bb04304d333fcbe9e5fd8294be478ace79db78c4d7d05c78eda1552948eeac103e69f287af0259b1d9a250da07af8e00ebb750baad16faf3082c34374e7ed1e4cb37ce013303f5e60459deea676e02d9f9545744e5d54c3ad52105641028adb1236807512e3ed10f6f6661eb0c2f63475df1ba3251b91c5bd9afa5b224ceeb6c60609133f0785464fd14a0ef9dec1533040464af3a17b3280b4ddffcdf7cfe897ef32e77a097d761caff4ff1d7fc59252df96e90955f053fdd073adc964b5da80fa9a76ef1e51a18187a558b6f1becec70ae62c1608c863c19375088f0929dab400410ecc29dd0eaa3019206b2a8a93e44808645643422a68b210a443555141e603744701f915cc415fc1533a2657145006ca61821353f0bed3d426e614b7b2fab8dc3110d44092143400a193c5ce8fa3332641d08e2b7010a0ba7ca93f88f003e62ae29aa305441179d8af56998e3aa6d568d9f26131fa879039fa88cbe1c259593983037038c4b2f1c9da039339642b9534dc17bfc07fa580b0d31d3c99289ea463df04c899b323305656f4760693dccf660ae0445c984df7e587cf4bede78902676528cb40e69221a6974ff686ed2a6905230131f7f14e353bbe85f6284346ba1f85a06d9d64899759efd448bee94d32fe97eed277eefc670c23192e9c62fe01a866c7453f0108049626cd81d60ac9f6858cfcc1a3c938f8346515874a38edf18ab3194cfb5fc34b1cfca484e9366b346613f5a11c30c43996f4964194525214f6ea3678d423c34628bee97fed414974074187c554b1a85ed068dc23693e7a3518867cc330adae54b891fa76e7aeb249f0820551521e11d2c08253e4dc5cf90c12632274984dbc543416759409cfdbd9d1d3bfeea4d4f42ba9488fffd595a09d3883ba8582d27c3f7f79e0c28a4cd305c911d4a00b7001ba8c4a7f8b90483b0b3c8c420d08fb49c932ffab15b5e11e01c087ac4040a7ea140ae2ac7143cc3f7b50fa989e309f45cb768e72a2cf61c963bc9d4a39ad0cf4f8514ac96d879c45698a3046edbc23c54f108ee699a4d3a65465fb1abe7da7c200689ed4556c97887578c9b186a117642d00f835c55c0a9c27d16d8caa68454d8fd4eaca5c0c589d75e005c1c9e126d4864bb946b5301483f5cf0f03e5e7bf164ed8be3a6467d3394eda3a6d3006dc36c158cec02e65a68467ba46058805b82dc4ee1a1250e4d0ac6542bbf43a3293a21e2eb1d1e992734500248d6f2bdbeac7125056362d82663dad1a88fbdb09c18e7c091819d543066ff37dda8b4a14c3349b67f695d8f51c4ff6e9ace5085c19152bea811c11365c7c2aeeb6517d3dc6330320b84592733a05f67f23c47625a46f91cf19c925142753df89b9130050e422de3bb456dea3ad90ac15a4a08b4258f315a46a32d1161959e60c3e87851d33b1ab546237fb087a2facd26a80d8d86169697999297ff9d89fe9b2d685f1221749f0dca47377bfa8bb2683484ef1e691dfae2b7cc6308b03f341ae547bedd644e1e712d5f9a2a079726613bf4a5d11f50316986b23f84ec6b881a1b1332f11c9f94dfe6b556e71f36655363beb20eab19fa66d836d8aa8b4a5930ea7aabd9d71096af72e5439874d830e0a2690f58b35384234cdf4fd16c40333b671999baf516d41b2414b26008feaa71bdd1eaa908c1dd589e355109e33266addeb0196b578c41c20a8ea26325b1603133b8af02af6263facf079a167f6b62b71f8f7f213972fcd5609e3e3c7b521f8f7f26ea67a5a4dc0f5ff063581fd7efe5d39c796969638ff0b98f32dead0d8ea79a64559b513f4d1659f3648a83c6c49ac0b32de41aa64015548f33b20b6125dddf675255b0907986a5a74e64ec40c754eb626a810eee4d408be260079d20cd1de1099cccb4534f141673074404670ae6016378367cff53efee5f44aa0112575720fa043c7740c7fc5a38455431de8b69a84f55662b7b705086cb923daa9385e529f0d9f78013de347c5079661fe4e5ee21f6b2c0369904f59310b5490366150700b247175570f63c1d98a030f7662edcc292e62171ef0a457d19953c79cbe36c6eba1b1cd5801e22c81e530dbed7d3e84121c9236fe50a3eaf55ea410c362b3ce22c6212d8d30e17bdbee4d079f98229b6ee7910798c3b06ad58012619962604ad4e1aa642dd03f59755184c7461680b68f61d2606ffbb53e07506258501cc9f53188c6c9009fefc65033a3fb3901cdf6ad3f4878da30c4606be004d7164c89096289bc9e23f00417200bd4a6ccc8cb1cc33eae6454877124c58708e21e79ec0c368fb4b5bf5dc1f4de36cff9bd3aa39ed790eb33b23f4416efa005cc51443eac139b1e2f48ce9dddcefaa994feed8bd74819d6198b905d1f2d2aadc99964a1adcb59c3f14336eebb898842724c5903a2706c79312c33817c939cd66b5f1e805ef3a932c66453d681d9a6bd67af14addd8c9c438453cf961562464547f79b4a2326f685605b5ebf8e5ac56b55ffff54e9c3bda26f653223be87ad76208ca215df3efb4c65e6207e0b4c835d08db4ba4ab6d6920500f93bc493611e40fb5e456a3691b8b302b15de5a13b3ad5e1fbc107177cbc5d41008c51b326a766a9100faa44ced31a90c6303e766f0bd9213c0d8d72cf2583f8b55ae8530fa6b3c2e9eb54a4365e73c5be2848426d86f38ee622c0f7062b3650e67dc307ee81257d5c415bb361ea60c063168cd95482e0d00c10ee319ff0eeb98d90cf66b245449a09e674af01f6de9b4450a64ab490c08ba731b0052ecce0a2f7ce3f45e640d9d4535a1df8ef19e8b8ab32e0c9db62a0cc2cc480dc8e38a8f3126d318628dacca242946fca740e6b8b60cc7f1b29981dea4268807bb3237a68878eb2e3d6ef6d343ecd1e53d6097e337c254836098b46087c46fa3af7dc0e11aa56b721a3a8ceec7d5f7fbce4d35eef9aa8f4f6dc9b25ce6aa4d87e329429e2c0d21b39f48ce1ca343d55bd98f7b65933f2c66f1a6c17dd437d4aa17066102a3acb4789c608d1d360dde9b6c682c27ee39395440e289de436b532c1db6a51893014bdd85ef759594c68bb43c2e0aac45568ab8bbe3d05ab6c19785245e95b4e0e5891ea93cf3aa28b93abbe3e68e706a3dd6963ebba3a36efd0c0b8770c6459c0ad4f4f156d38baeba5c8ebad1114ef227886f0a7e0d1740930e6a12a698ab5323971bbf7ececdde90bd547c19f307186f1109755bf007d2496f907b68284ba67ca7c2b092ecea3a18e88d4021e90a4f653ab91ec5018c2c72c10e3637353d74d9630148c99ee89f97167cdf92d080cf7e7cce031c502870fb5f2a51886b78d50f89c48c7c0f51888c15f3c11d0a34c229a942df3f559968ad5d073ae58b12a461da14c97513e484135f18bfbdb8374aa7f340fec99934bbb6e7dc0383e62fb94c9b6e96df2632a272fc31f38c318a8e49cc6060a7400c11b0ce2836021081403e00bf02b0c3ed1aa7a43c6a2f5ebdac8f55e76dbf6019c3dfcdb018bca9db4c9db76864dcde02c960f9049635a9f8411796b9f947056d25dc18f6e2fc1d94b1daaad40f70274e5aa98e58bb9c0467107460ab6fc7b3f7974b6f6db8ed7efb5a473e247fc85268340360e17cbf468527c96ca88ae23d577227d071ddb2cf371ac4703011e081482f83bcbf68fd13b0cbbe807ae156c9e1eb08467677d3e7e79964dbbeb0d885c7faf9e99c6c94b5a1459e11ec17deef370dc26f6dc8d471e91268f22355c153549cbce214b4e42e1d35567a1b80495d698a888ba422c9ea7e36f799081418fde15dd6eaccf8bc58cc81a17660f45c0babcffdbc8260ebe3d4c0402c624fac92411f23fb11add7dd70ca946786b9f9eb9460201ce942f3441d4024586086a1427b4dbd717696649831d7c5c041319205d20fa5957ebc7fb9a03a1f4f0907e43683312b04b72b7e98daea38eff5b58b207e548d3c71ac63eac44418e6ab12137935b27393da06ec04f23c8a911a27637294d23a48cdb3dec65c5843f32a41297091ab6b4484c46884eaa26595176f7b2fc333a448662c9f3956275def8b55980d85b31637e86b48fb104a98733715666c3c99a905fa419a5670cd2b0e1bfff1217b0eb2b01929e0f7b9141f3ff41acf2ba62634d267fc48a75ce356f4583da538620aa56bf11df742ad2043504cfbc768ee45ccb86d4cbce2091ccba94f2629b4335b4570316ff3289013af20d18b31ed4b320f5925b5a65c42e113a42de851d8b5c5839114640b9024bb9dcb465d27684cd7912a77044c39d9b1af5e016dfdbd3104778e2e7839137198ca4b58379c55080e16e76ba759c0ffca9735c9c98b42a1c00fd03b4916fc5f99634efbd88291eb962e54fbd314154b0db850f4fea5232360083de3a4f1d9a1062547673cfe5569143f584cf004499b7d9d13c7b17fc3d0f374026604608463cf00a60c41b0db111e2b07cceece01e2cf393bf493238f13f478b9469c4652acbbd29a06728b1e372448fb7acdec3b3d15fcdbca0487485dc0b487cf0014fa0ece210106dc0e1fa72c32d3409030803f587938d6443060cf3cde47e03c6e296f245ffb665e54b9aed307ea5fefdb10b4608b55ba540ffe6aa4aed623b6b9281b7bb2a9509520a8deae2ae641beb7c84fb3af86809858c21a1a189afbbb3ba9da93ac8debe9e4fc6745fa282cb894ef1a7708f02b98558198d3af5a6e768e9228945bf971b29b7361e111f165bd08f544edce948bad197684b1b8ef9f9a4eb9c7a87894ce6c258abb3ebfb9fcc243303132ce2023ae3565b14f0d28a2d45589d2d8c8a7ed63a53fdaeb8a66ab53687b9d841ed4d503a8f6a6c564289529425ab14bf9bf9eac08cdf20da16c1eb0bb7d6e27a6a98eb68fc6763a7c12d2c8275809f456bd20581e122946da4a4063bf9e52b2974d859eb028ff7d884480baec87f5c4b5b15f87cdcffd2ad49a6edf2c4ca8cff62ec1b2e60d2c6c086772314c64b1636f08e7bd664a091893de959496def0ae1674b6a05b4ee1fdc969f4e42cfd5be52302a411125fbe2c9cce64701f852823ef64264038e821a6ed15cc01c87c5dee396a76769127cfb8bb78f0c1b8784cb4ad50387fe7035b60fd7f1d9097bdad73106789d73a8ad7b627b4ded785c44b9cb2a9169b4cea35a7b9a10c5232b4c5fd222dd7a35dc86060a024c5537ce4602f9e9972005a1996455277c668d09dbc096d991d50f7a9e90a3515abfd8579ca6ab38d267b01aeea5c81c59258aec6443bc0f1ef0fb94f639e63dff059055af5e5a0f880dff0b042790926e796c45ab2ea5826741b69ffcec0459662a261847ffd7638d10683019e089b79b3dc96362dfed3a65160360026f3f31c9c06d0210f6fb62fb2b81e2aed2355ea22e09f9f4924bf28e9efb6c22d01b5bb8de81e9644ac43eb4c8e84f84b19a286d4f828d4b44c38aa44966e87a6080add850484bd09b86c67694fe57acd8a69868040d62dd51bed284d75b390fa9e46e40b09bd21105382446888e56228c7090773e4d02324296b8300ffb81319a5b43ab66b4d3a7f5361d3e60659130216317e233666c7d421bbf7c23f228983bce323d8a672eca3ea4ad6263b58dd71cf6c0c3a4895e0c4a4e2ff1783ee4945e929dc376df5ba07983e15000d818c59c1aa85d0290393cc4352cc59b9c7048b0cd9ef68082ea704f828c4454a269da7807898adbbf70208ad2b57ca71be8951f984bf46ff9e9560572f95234d6a7507de04e7090872e58332e8a42fee4dba591ce910bf577aebf37d8821a68d518fc26357e845eeee9ed4c4da188419e8e31cf8445f33e3a2708875ef2fe96b963e79b9bb1504ceb25a3d48445d3d420d4eeb5604a26b46d733c092a4fa4fbadadf7821429dd53f522659136396fc0f56c276d2f96e93a0ac2b390880c6076f0ac0bcbc73b05e464f63086cdcf32bdbfbc5309febe0c2ae2334e09282369fec5fd1304a65f74700fcf45c24c018d862d1c0616bcd9ac2aa203ec6b830d895f724427f1a48ac0744c8061b8c2cb152c7be1b005862b18b6d0e00a9651305ca1cd140cc30bf867c5d1a9e951d3accb6a42044767d3f137beae2764d401191d126b8ee649140a9a4ef001d400bd8db09155b64475051523a8ae84ca882a235019b1ea115447a832a2aa2da8aca46a049515511d59abf2cf82a372e0a3c6f866eb426cc45c74081ed12164cae09f3cef6318ff3a80b13d5fe1213d4de26e7f513907651bc9f550b3948b100db5947424b02d64cbec15062b61b1babc6ae4ab9e095ce98877dc5ff9be548ef1759549dfd7306bf6340e4cb355e0b2ebd77297bc7e2d85c6f09f08118045b2e4a0cefb677ef31c66902d0fd36f6411c960a846b13ef5c34dc321c7d366c18f13f749d5df4940880090f2cb5600a7f367791c332a0b662d849365a40f0d73fac4958ea305d6a27872927b12567081ddb24ff847a330f8ff916d587a2f030fdce89383be2c63ac528fb3f56f60f56c35116595ac5a8534bc6757f30818345343aeb445cdc8f0bbc9b4cbd0d892c97fc86f8c9905a6a87feae60a217d095c8aad21fee3d620c7ff5c0e3dda7bf5d13db6eacaa6d6fa2c603bbd8cde251eebcb30dfca8c3eba31dfd3115078d9699781b33059e6a975b2e586e8f17f2ad6759f119f816e559640b37a541533cdacbe29af7b81eb8eedd3e6fa0f0fe897a6dfe0e01af66f06fde565bfed359a740628923669936949cd4f74595365969188714ecee187baf1fbf957238055750fa286c73db8e08b5ce0b09c82f2077d68648062527a2f2a2240a743c3beb907f43ff734b5ce55df2412953dcfc106ed05626e1aa6b4ab29f0daff42a1844df4e14b3b5ffc6b25f42d2f8d83a7302e099864ec8cd0d7f970396980c2dd4bc59ca722aeb8a1370c922fe8d194afb4828f8d362e83b3653e232277231e7e7c0a3e1afd3da4c6adf93811f51ca23a3e74712a23b1b972835e105bbc7d3f2c4246dac9b0f66edd878503830c048109bc051a252c1132036f4335b5aefe9462b5121127aa623752cd0bd56328267a1cf23bf24377a42c9f937ef09cdf7aa783a790d0091238c31e9fe2216dc95c9cddde311d8bc0de927bfd7e1500c1a50a4f57f05999833b16bbab167a8d5565b02d04da65557fc103d8e3e4ccb37838d2429ac786a6322ea1e47f5fd91a4d6ec0ee76867f880f9619db507b65d5b9cae69b5319924b1a7520237deacce607634f9ef0158b29b5ca756e8ba01934ffbd195807a4cd1fbaf169fec1c76227fb9d5dcbb5a60ee4e444a065345a33a74400813e100182e674e706bdbb849a1ac5ab64f401ac1b92466146548da5eeebe031c804d9201400f25289eb09d95ce8f59c837b46fb49bd09339eeb1c4b5dbe5ee666922498ec607379af0e2a4d48718d93e6f7969dc1934fc64549cc73001b4ddeb7d7cd07c225ad141634862173cac0f26a2116344a46e4c1e05f4ea9ecd675897f812098c8b9602cb7c413fc1e955142fad509a88dc68564f70b6517cc476ad405b12e52881ca30263721efe03593033db641a1fbf0e2812db78084d51fcbe8134539face46c613e1c7e3c6bf2c2daa54559a4393c4d168265f0bdc5c7c06be0e831670a9e16d14dfbb7ba8f447a1dbdc2a5035938ab42f56123e0327f89bbf182808487dd98a23aaeeba0cedde7173531f1bf1a5b19807aa80cdf37592a913557836d791d8e22e2ee638fe3a402bec10e298a6ffaa005941a07d2ecee97d9efa92b6f17c830f73dfd304380225a598980b5e307b74aa222223127e648e20fe4fc4cd476b83e9e5906fa49811d07c14a65c79d8e2b20b8b266148b6e795a61e126d6ac5758147c40b4ef70425ba42b248115109b5b2b86d23ff18aa03bf72d9f1a79489add72a9cce6d1b7401d69d4c869d6ef2d985093e010410ffd405179e90f2b3db1622603be7adf7f968d310a152a5510b48362c173fa25b6b0acde7faa53943496abb56341fed548a01593641bbbdeb92cedf362734993eec4f1da8d3a8d6b1fe56ab1fb73bb826438046a1c66b62b3ba75e2573383afbf3b764e46ec711dfd0defbe2193b20ff7e13ad5c77dc95fd97cae277a7efb3b843d8978e63c293744cdff4a184bc5ad0c1ab71620d11c6f89fb5ea8115342c940c2b9cbf9a046cc10459f16fdca05361bebf83c25f30d39a88067d7382e76f85ae6cb6023864722861a35e90883816100cf0458024401b3164ab84efe45c98a2ec55c23714c022864ce2faddc5bf219919ec588fdca6f2c0599c0d8437655d49e6ab33e5f4ef2d32a126010e59762b7fd77e1727a7b04bf466e873a6e7694af9d194fde451435bc2fef95f8ae0054a42c1002060eccd0ef214b0ad65801d3cbaedebb9c040dad82104a7a7b9dd4432699bc926ad29d93df34c606be9de1c3214fdc0e9898425a5800d9017e0065a03a6f9fcf1a68049bcfdfc9e9135e44484473e9486733935b0cc111daa78ae7a9f9dbb4905f35132cd316fd62a02dcd9065090403fc71822e312174eb2827a5c6b846ad853a4adfa63cc3805c792b6ac973978170fdc1c598dd1fa4e608b6170866d2f80aeea3d244326c5688dc1f0075e8ff4d9883ef1ccb8b0058f2bb735ae3ca54c28231ce295762f34dd99c5747f7208e44397216111b02acb17bdb78084d4f7f1298b8b4110b0c668040e30be5499c5af3d729000b81e172590ce5a059251b739b2fa1bd24a537192bd81ea987755ee52276871f6affcdc2599c1f3309ffd2b5ff43f792e942e5b799c2e7201d2f08cf17a85067195888d7b99884d2b37453c3e5c1886b4bd9ebd6eeaa1d8ba9b046732ca6264363ed6ee2b57ea43bca700b8f23d1016142d06a8f3398038cb30966b9f92c2162bddab7f43e8d8887c575a7459ab0488028caa103811c1dd4e4c1bde281aacb7fac2e1f97337c5cd97df76dbfd02645b29e7b14b97ccd4bacf6a9b85b62346a632d1a0a50d5bc4a0edf61e804138a2a320a4ce9f8f34c7787a29629bca679a7ed27ca03ed8b4193934055b1840db023a1a1c6b5150d48b90827f36b5b2089f614adcbe60111ad16d27319fc09f17cb31163535b142b07a02f2eebed51af13f53fd32ceb267f07a408b5c68b4b2cf8a9c47a418b38a04c7183c93b31ed58454b860a9be5bf87c8a8b3b895896c92ec74b9fd7bce27e532fb7603dcf69e82d884c13175aab22de6b236cd9d90290b870ed3835935b394c8e51defbf2c63333982df3c385fbd76b61b6482c84703f1b3f47a027aa83016ca44a1fc86b61dd690269418e699c315f9aa46c3f8f3d84859d318c5f0e7a5bb95b13d7ae98e5ddeb69d793704b0ef577056dcd5773b56dc85f87b5c5c3c42701ecb891a1e8e765af51b1a23f870efb36c688bfbbe944401dec7e960dfb82be781924e449e17a4497ab4f11e95d9974a317ac41cd11c1fbe827172f4d57c5a6eeb6c5d625da8c766733bf4d480306ae74f3c8c8f54ff5346e7a3f576199ed99176fbcf2df136ffcf2de9337c747df7da2a8e1b2c96d02887c4f5811da72c39c544fe1e178ebb18cf7e28d5fdefbf28ff77e7af2da439a0ffb2809f54909c1ee4d8254ddfaf822a2548a824ada910e6f24b974b1ab84c81c694ffaa4aad2eebea8c4215955a3c8e3455a244fc2db93e658b13ff215f190db9f5a20799f7d3bb47cd2d53abe193a08b49296fb6943355872b6053ecc4fd1af247131c2f51cddf448d32d893918a980783f337c7c567612cae2f1ddef250d422fe484207ba6b5a162cc1c2488342e45cc7f4f6a699401d691db366b09bccaa2436dfd1d484b4b3100363283a7a95ac3d0100b05ee57f58a9b7309ff5679ea6f4ad3658fa28b0e801397de2e6ef939d9173fffe28b8a88385438388bf78a989836c579745ad6bd7a753925964a5cc7705fd2c0169980e823636b3a518b92b7b56f981e8ef6544ffd49393a39d5de2dcbbbe024e404d9b917b2304015d2e265f60457d72971855180705cb94d4cebcb9dcabd5801ebd9aaab555773cc26f003af526e3ed68e344abdf3428ac5246176b0525d8a922079fcc8100b01580e1576d169c4f0df7543f45b642d8e0dbeeaafc69c430883ecd93fb132f1f97386a2f3074ea89caa294da9aa72ad7b0ac386704b4990574de0a18707d6fb1d72077fbe7c05b98a69ffdca332b748c105b12ff268bf9fd010f846af6428d2be9b83f4912a4b2919c5cbb0f151a829c73ff261dd2f93865337a42ff74f62117244076911eb8b06e53192dac2678ed06c569794e7994639e0188020c31b692e8145bdd4c8ca2e073baf8fa9980725e7f5e5d4f870f25bc67a6b685142d978caf81a6871d2cf2207b92159e6b869c682120b8272a7031c9f46285381246d893cd8988f233c106945ce3073e04ffa4132eea3546ca7d183229e72fc007d415552d20b37569f0e9f2c6259a02a389ccc4796f822e44d5cc15201878e0259fd8a74daf6cec9e1a6d0f0e75e5129072dd0a6125006415dcf9bf06db592d9f535ab27b3fc4a9777a0a2a7092b2cf68c4bbd3504e640b57ac2700b3b212adcb8a339683c13426cda46e6474352383fbb3313757099d2919d6671cf0d87158212f579a5b51cb59b3372a5ec359ad8edcb4f885ae699c3d99884e714b0d29282ebfeb44efcf4eb495c2c3682b0d70909e5e0e6ae081bf8f8ad504d6299023a971f28426a6eca5ac94af2403a0b336163a9d72a8ddd1abb9bc7e96682a7000587c306605dd422b21dfd60c2a4d45ae8e65e96c43368baad53924d9f8721f5065a0e10cd58bb3ff39723b6f1297166b5638e40eab276dade6c3a0492243e871658caa7d4d16d3a498e39bae3b2fd3bb498e25c5c5b01131b467ec51c16c95877e16b8039140fe097c813f7a5e1f233c4f92380b15865e670c134dc28ee47050ee0ae0d8939dcf1bf1363cab8cd870569ea5c399899900841b4eb101b9d2f5571e6c02062c23376542e3910d96e72eb465a1c0eaa02c72720cc417a8ea74468df337f16ebfa637b2096cc9c8f940aaa8fa6f95cead4bf29b914cf2342bc7d6f6a9334bd01f3eb90e1f34f1413a87046f8869b78f0e44b691cd361659e5ab11a50957fe78d595bf71d30d921b20d9702a17f9b0dbe9133a88e2a83b350c770b398eb5a2758aa7eb24a570c0a8d4a684b91934271ab152360896702c36db2afc433ca2d90bffc198fc390b112e00cfdd540a356a64aa7de1b28b014e0b4d45801db1f0f094bc234ee03f28c8c6ee6c1e4a0db4f4ae572dc3fad0320e1bb9a7173f5dec8a9deeda630dc16b90120e87f5e5ff8d806b32e6cea3a3b0211f9dda1e72ea393317d649cfa338231d729ace4c25e5b9e5cae6a691290d3753ff664b51d2d0172403e64f059d68a64e54b94754eaa9826b2e52454fb2300084b0045dc5eaa16a2941382067c90c1df0eea2f414a1b63638b905fdd60666c1d3457cf621847c3000f0b090ffb3c64a48104b57ff2f0d3f0302098db2c21d7024c5f785a7479b9e951e826f11d75c436513b9138866c226f24731edbbda3d276c644909de5e6e894001e331c631d58044c3cb99cb8e5bdc740ff9810c910299b5992d148afd1bd95b879bc1c1dc13f4401954c5f30e3e9632e8ec954d1a2a2b166f702e7b6f72265881a40e4669fc39a0f53d6e6906e268f06534565f051053eebe40018abe25f7c91e400d94662b10eaa40466448de57fc42795644ebefdb6f1498e99524cc9226e57f2d9ba1cbe405f264ac10133d1ae844c3af8230e0cea7593f1a0cc5f66464dbec623181859fe1a3760a889b366f8c948474d16d5ac42faae8508713ce247bc05d511357083044f803c70ed2e65c9e9ce186e3f968a05703ee5f5288b9f0d91f6d86a37936228179c103bde1915d710a8bb45f64da0c7d20e57c9dbe8163005579cbfa93063f0beb1d055c4310890937f0d82fc29952b105a1a10c2dcde2a1250b5f604e5af1a378d21bb48e318396ac052df30a5a92ca52e34c3e3613e4064168a49fdbe1e2ef505f7b81cd0831befb27469bb59c92ed5c56d345007c201fb3a80d74889ef2344e41d186ce546fe0e560fde4ace45cf1ad146e02cf5cda9722a9725b78731928ab5fa5a66f8274357d952034dd84c48550647d9941f8a6b3c82040ecfb4f1a4033f9c89c6560fa58d87d27041fe254174f97b97324ddc924d389b223db0335f730dd65b0473bdd5174f4763364796aca3a45334e6240393709e8f94920da0ac50002f13e758bdc4ff6de07c178eedb07016141d7fee2036f8681671317cdb0b33b21f7412a1bbc5c248444fcc2a8060680436c0030c09a7b74810738e5d5fd8d9c455c02997b5c3a48509059e0a2bc834d88dc4a84ed0289571a91d8fa94ac2e963636b106aad9b3845416eea63481ae428df819560716806020824d625d9e63be544f6464482ef603779b7a5708492ffc038b6986ee4228850d3c8d8929d9df4764cdae123a8d785a0a817181d046bff37c1f0ba59ab70cd28386a29b4a1fad4cf3cd5d39a6b3228279ed0b834321eb0dd2708a736f6202e190f43acd2c4c03d4b113d430884d334886202898c6ce0eaa16a4b63254489ac364306c123cc08676727ac05579f0e402a3ab331856ae2fbafa269ca0e36fd0e1d5701374e214e9dd3c81153e3dab5c131b5033145a30c319b806564b93f7fbe2012994a1852de2a1c80ed5b5ede38884fb3b2a84fc492c2913a1b9bf8ed11a449f519c9288deb4084f83b89523b99bb192523524c451b39ac16aa7040d932e0260362cc0d65a4c95107f33e8af8c1ca95b8cccea10b617aea0c0167c68210cb4291565ef3df440be96f140f11879ced6e0d39a419647c8374b33ebd50cad6af8b3df31b50925cc8f2768a333023ce757ecdcab19a1ff7055d68814a6d1926ca41fe72f320e2d36fb003cfb84387c0185a3764c17595a4dc50af9a106aac1b5df08046d427391c2624622dad40003e01087c6f50ea26d9fa639782d5547bfc7cbb3ded87d0ab30fba19dae3c87b94e3ebfd9a980a4d2adc31d838d449c326159eac26817b55db5750e0284818aeb94203503fa5fa94dec6fd9458ceb8cfae6fbe3e8bac7ae6323937bb4ea8d014cab2f94b404a65a8d317ea0bd39b5cb6d6bc68f6cc24dc628b83eb0ea36fe6ec500af2a2c65120e246c365b82d59899abd4198922f531bc608a8a551cb796f92c1037e41483752604c708044c617127ba53651c6d4482ef988dcba5c8cde012093a52a7c57e57a781023e5b29b5acb0f4963113b6a7940becb4bd2b9c408fa2eb3f97f3892dd61f201411f6b26538d6000bbe0c25d8126716f206cc565587d81c3dc4598c5f376f5a8e7093100d8a4ab3ac3b55ce668dca2ae8eb268436bf63390cf74e69688a3bdd9ef7dbd811e22afefa64e88c1c4f796e385c453d163aa9139f1ec3ee43876c84e42ab680f701e568fd06acddc04a80585615549152d227073786f00c2ce31a66cb99b94d11167f1a64b1e8689126ba1832fe123952185c2ee56728a4f9a91dce5d254790b4b5b9e25f4f178e4a4392503e874fd32e4a8ecbf18924023162b56235e02e54dfe2176a26399a91123d45304d7f4a978041c445824a86561135d6f26e1b596ecc084dc5718751e0cc0dd5a1ecdf080c5783442a5e939b99948f67064d8d4c25a425d0d792ea0217c2c9951895be158e30c2e34889bcda410fa1127eb2dfc17d48a891d81de3924754308f4466a84f9fc76c2cdf7c73312a8974c01dd8203bae85369283f06b740237fc0e413dc10cd26ecddbc48ab3791f72c03624d8acfc0d8a514e7a2d4ca202a475c6442a110fc161bf6a8049b6ac3aba042216a97d4727e1e49fca0f788961978c483214dd4c2398d1d7c9449f220a081173bdeed9cf605106780286d6449b538a395580a5f50c76f356c8c9314cb985a7f05a4558ff96826b7ca317accef3407196f1b5bc374aad9bbaa7851a3ccd23352e7faaf354c1a24e0db213047c4ec9993338d64a05d071588b68a7981ed778dd4866428360c7592d8a0f78890f50eb86c4f8bdb9c5ab10166073413b649941cc5e2428240d1584bc13ef80331b3a3840ad21eb543613eb9948a0e8b12f08fa0d0eaec9b92e39fc18682db980f0cfc0c3d8895ac554e43018670f0a0e6fec06024814716eec68b5376b134238e5490665b5e506f9ea8470ed6c33e254537e3c20c1c162e9bf15250ffc99216d4779eebcbed97f26df8e08a59217425c3ffbcde0254fe23654c4567ad9da82b3a21a83a076304e8cf48f9a0ad3159e037493158d4311822b036466863b10dd8a261b131089c31ec5ab0fe98ce031171106e1bacc6a74f9cfe02fa4e7608599e7ddd2da6f3d2a0d416db8fa684a08d06141b57df3b6a0474b2f0d3d864369724f551c72ee82edcfc03fbac448eee8fa9888deb3a4efc07016c930893b488c4bef76aaa86e9820c107dc4075712e293e4c3f25b2338ea26995fe43125cd63d8efdb2c17a6d4f018d0ee634580562049bc1acf9be907eac9d8087a08eb62e40081d96e9e69d578eddd13bbe0dafcc09787772f16d02ebdfb72d6ef0f83cdc77e958841a6fd59008f8402d9f4f357cebaf3d082240972fbd5d1f9565afb57cd18c167cd0373796c5a3e0bde4c82e20570602cf2169d08feae7b0c038d9ed985064c7a703707330df44d0488a3efc50ce0bf3ee57faad303599d8cc3e950e5a70655bcf87087c8b857e14c203c02af75394fe54c5b11d0feacebe25675c35a35eb28417150bfb9e5ee5c7b0300ab356d18a2e18a50be6d7748e011b4d992ed0064abc1b1acd69ac99705262e76857d5e6e74fc8c3c3e142d4c2aa64f7aaf29664c4c1f259a617449039aabd50f3109b2b909330bbcb2036aefb2985b30d655510779309ee67dd2810aa7ca4573b8883d520129db18a1831ea33fab0e47eabd482a606b9983c5023bf30b6bb68c3ee7ab6187d77c4c3e68f52eb59bb6dcb084c2ec23b0f67b79ae7f12b0a5bf2c217bef2df796524a990280093c0994094ca030917b728f3565dc653be3c15a6775cb5d52c504ecc290d2848fadcf509c407102c5091427509cd0e2f6d4714030f7642f688a7274b80153cbdef73938e7046d5012ae98445118f40ad4e8aad2d8981b5d55c76ec71be69802daef03bf307316e389ade72872bec15659d7b1dff053599c63bfe116940517661f641c716c9c90e70629bae5f90cad2d7861f641b61ef288a3cb24723d3b9d3eddeb96e7f3f319b271c6aca66670c1f8195c3364b406f6399633c6a733668f9d9b719b11ab29ec579433628fadc865cc2de656591307029c8b5e4510b89ec91b6835855d1c6fa8d5143efda8a020d319da0cad5538ab2097aaa1193aaaa119ae6e891cfb0c1dddf25c3534e3350386bb451ffb0d3d74351dfb0db5ca9ad85497043df639928ae49047847dd954c02410d42d7fec0bc83e54c03292acc3fce23f576dd1ab19318ac2338e50395111f1d855a79f0acc388249cf8c185d55008aaec108e23185b133011a485240acf5e4a1566107bf2b7ebe11e66f98c205f51b68f386eac01418ea160c13be8cb979219383c70e5a1568cb989b95c968df893292ec3147e8d50c8dc6fc740b74ecddab19248dc25ec62cf9981e8f3d46a75b9fc7dcc693ad55d86790f449098dae4e42e8938ec70e7a1973ebdb168f3de6f6d8e947b281238bed234fae568124db8d18eca188e6b17b321eeb602fc5da6307714845393acc2f5e74fa79ec201883892d23c95325d42a7c03e655b056a960dd1a397695105e82127aec950242adc2ee5c6411ad55d84742a2d4634b96368f71c89371d0e996cce325b5c77e03adb2a863720754abb0e378e1419288e8d564ca99ec8a6fe80175f20d35f2061a4561f7c8942b32f5b297d05e8bdb09091a237b0b2a41c3926c8a3c7435276929aa7932cc4fb7506f6b6f6d4851f606bdf8e3adf883ae2c4752d2460a132acb3b65dd624c8aa62f1d145fe28e8b4028ca7a5e2297e24e08442ec51df13547f125ee50949d2fbe30755cde2f73e82cfb2bfbe90610776acaba155f6fddbabb2097e2ce8b3b34baa2405e3c30baa2248efe21624c2c42579d5b176574e582bd7f7684f696137bde5a31c98bb41495e41d38521823bb02ec29e6e49af4b035bdf80c6581633f7e1933697e2ac8f4faf7a563e3100989840e5e1c36c84dc1719d2887a280f0982e243cf2be28aadefbd14460fbeb764c49229717fb1d73e0644eda91eb2df295f3797780dcf102a1a89a031792f74553d55d3ae764ffd1becb58e4f2c22c0b74da22fc16f47a1ff48250eff4bc7f922576ef3ac65e57f260afad2fa35d68188da2359da2de35b4f4ca7ada026306f97a736e835699b77e491cacbb255d68f0e7dc9ff316462ed6fb7ac5e1fa252dd95e11401500b1a49a60fa98231303f3e2d27232b1ac94482a2928591c8942f0f370c75d5be96c15fde28954b741495f02a54d27f0b6ce594434128d4423d14834128d4423d14834128d26c624d1280c45a311281a8d442314d188741a8d5a44a3d30b4c8c8c8f248c99182e2da796164e2e2ea05234325e50cda859b9d984382c4dcf4fe472ba5747ce670e1f0c510ec65e8c181c07c2008091281447a391188a02808242591a39462a35aaf61b555b63341a8d5636bc412e8f6dc1ca90117ea36f54ed37aa96351a8d463108a07523c30066c8d57904406744001a346cbc481ce5308ba28b4407c5d168341285380588010bdaacb2eeac86bb85bda2dc0ba90b16c5a568b0c3f0957505317e30d7dcd7e7b803bf91080c6b1034df9d3b9bb93a4f65c211d714d589e9d9746aef7579b557dd25d10dee31891d343550cfd92fcc6ecd56c980a12db82aebeed4d4f4d72b36bb22a66d320e636cf76a7516514e87b1e739c62b95854b2c5e62c7333040315e5ac82da76a02a291b1f242e98a6e915266b1228ac84c451499c98a143193714538f2c64423ae41b1c930b43b8a0988444271132903808e62af203c57e4d206e189c17882c4603caf00b86a798300f2d2a15d1040f0184ef7bc8178e4dda111e2ca9a2158a3572c3086d0d295154018b6b08375cebc832f8872ba9ad92af0e63a91cbea9c7bd71b419528a7c336a4cdcbd0370fc008b66f170f243a07af91bfb3be3ddf9e4121fc749fb95aef46222207c71d1d0045e38dd570ec09c7ebaaa96b6a422eef6cc6a86292cb6ba41b6f8ca2aa0807eaadd33c375ed77879d014bd46baebf42f5946e0ad2cf5df8867a004082d655d97092897d7859a1662ccc098a17a41064d0a6533c234004bc05ea983798a994555649aaa36b4d6f453ebf519aed7ea36351dbc778a90b3d6369d747489007ba6b4b1dd2653a7667777fb539f497c52a0e4cbec9302d7731c28f64c5752eb9401d671a0a41d2bceda9b1ddc03f8bbedf5c00ed35dba9f527f92cb7cea960b0dd43ddfe1f3d041e7443e9df3976e8970f8b2a95bf33987e9d6c87538c14887f974cc0f8e32a3a73e1af9832301629e7a4ccc8394f6450dc371ba1e1c270ffe1b5d6898e1a9cf30c383ed82c9f92e1d69dfbe8fa5abcf08b9ec2402c836d8f8f8f4007bea2f4c1ad8a923008822ff397db0865dc2744d85222fb9071d7b492d890a498ee54b14cb97b87e8ef0864c125901f3e63a9d28ce45cf715ec6f0f4e5392f09d09c771c59723e3fec9d021630ff2331b9833fe7b3fb16e198f13af41759e0c6f9dd8fe46c88e977a40b0d640e8f2a0027b7cf0fa19ba41b4bce6fc99136f351943571a8dbd8a05ea8a27382cf8f9bcf0fa1158073e28093b4644780a43746705f70bb04b6b2cabedda4823cbdab8cb4a39f68f161099d20b009d90c804dc1a09e5ad091ef5a50912fafce7710ecbb16b4d3b5a01effc54f8a011715b51a15b4ef1a15b2a7a288177dd7a8e079c0cd8665b21f3a2f3b608e454144e8a7f7a88645edbb86c5ecf1770d0bd9770d0bd897a6af61e18247e1e165f82fb2171307c0f691874c1dac854f6893eaa383886d32ad0f2580402e67041d3e707708232f3a2e4914b08f1e1f3cf0ec131f46b28f213e78401f3f42956f1f170e44a1f824dc02bffc0085ecf343901d853ffcfc9024ff70c492aa80f243912629f88b9b4a15242f4929c589924ce5052c4f587ed8c9a78f052dd6c5be64418b971f5c3d9ccc7adca6733f3f4444c04388c93d9049e23d8ef43032653d8ae4d13ec92f326c022e01f7e0e17e76667afcc031749e88b00097b4e03d81ab4d61baf784e9e112c2fceda30304ccc3a6539bae33d3b98149b6f2eda3c383757ee8b8267e010d0fdacd3e711961137009403e3efc7c172f84b58ee6321f1f86f800c4871f4f632d27c8ed9382273e2970f258481605cd5819428d4d9802203a5f5c808592eebb860514f0f4be6b5800fd74eab79f1e4e2272d79c60fb12d79c50fb49bbef9a13a0f81189df3f3d64cffb41287cfbb400e8677db97a7efe7017e76a151529d74bee39c88932929c4559b74aefb9770bc53db749196fee78531a6f685056cbc9d8ac16934e79eec940e38519476909a578f7a6a0725248cf3e83a22bceafa75847e150525246dcf804249fbe9db31c478fec4c203c3438eab56e2d98ca92b9210333cab81d89c0380743736476ad238e2797a00be44157290e23e331ee3908ab2c77cf4fb56ec1d0c4d8deb31e33d2d86acaf394914666a4a9d594e74ef3f330230dada63cbf23ea6540313c01c9d69b235d68a8cff97c8e2c6d784b8a8cc8302ee3302ee35ed2cc2aab462dfbc82899b11554531e48e668dd6aca739523b28bae1a886646519e5f7b2fe7097946de037fbc070e79ef72966636e3713433baf26a74cb825ed608c20de89e832fa3f3a029cfbffb4351b78aaef1ae4d49ab384e542349ab3c07bbaf4145d7dc9dcf6d287ab0c4d19fddc5494fe973f9b98f73dfe1e36bd43c3bd60f6bcbebb9169ee74a3bcff9479b37f488e7bce4ea16ca73d7cb128fe74a3acfcd6681ae4e79ce713b9a4533037dbcfb14711fad5ba3ffbcfc7afef3eef2abfdf7d9fe2b45d77ffef39f8b4bfef3aedff77d8ebb95e29f7bdd42f1af1475fcf709e13f9ad90786a00b041d77abe4a07bdd5a7110c64119075f1c04dd87f79278d0654698f165046108c232d304cbccec3defe13aadcae1ae9af27c3c420675b4caf31209ba5ae53937763f23ab5103632e80a11ab51919ccc59f1c584e2c4728c7095dd160739a99e846f729debab5ea270b60a87d6034d4a8d5a859010cb5ca73cf225f4fa2c5a4551ee73bd08f41eb168dd1420b3fe8ea235d386fa0940be832dead5bb738eebbb25e3cc62100e332a409641cc66348132051838cc3b80962fcc5415765c9903c5240009c17d7993830ee913a13e7a575f3cad6cdcb9c5d2f26914b8e1718b7221cdc7fce8d29efeeeee10733e29ae2fc65045fc21390dc7dbb8a88445221b5b4b4c498c538923384a2bc1a4928caf37b39f003c12f043f0b7ea0b5addb8792032b813617217f9e8b906df989fca5e4276ad8b8b146ed7a59a3769d66f6f29e831e5976a5da7bde65098af73cc60c85e6896681ae8ac11a496ad86ad4eed862479283a3c8c551c55346222f29f8edc8c1151616300525b4a1d9d06008024390124acacac8736214e58d39b0967074c9a41c63a62222b9743f72100489bcb80d9a9292c19aa09a2614e579d843519e128af2bcc8b5dd1fe7415194ba0e5db98eb53689efad75dc2dcead7bddcac15d76741dcb834ce277a05ffad82a8f23bd559e25edb443eff9c0def3724616efd5a8bde7327af4cdd7a46b3cf79abce7a50c1fefc110e43d2f69a078efc8c7c537d1ab4f0a6d7315d97aae2297a0ebbdec44b65eb66ea08b9e9dc8e0e83a14e5b938ba8ba23c6ff121d3071d04759468ddfade73d0731b9a0dcd79d0d5c83d771dba02dd7377d195e8596f61d1ba75ca2353dc3a9832de9ff1da28caf3d31539c5394f713b66af11ba4ae88a2389bcb897e29edffe9615cdaa09a229cfbd9616f8af8db2308ee7f727654c412e7b0a25de73150f499f5702ec74abc5bd939b6acb4796d6f3d2cf97ee7acf5750fca3c2cd4785aef19c8be2cb185d7e5ebce765fdeb45a33cbfa7710996b1a48142468ff77c652c65ecbce725126953a328cf6d501b1a45793541b4f73cc551469706fad05d906b82de73d065ddcbe3cb6869aa73710c29aaf3d198471245752e1a9ba2c097901bbb07696419dae3b7224ea65bf48a4a56507e50fc15fdf53babf7e27bbb0fc7ee31371a21736479a3e3f97b5394b5caa399bd4780d97b34b36e91de731a5ab7e87b2e43a75be07b2ee3075dcd08ea16cb7b7e3dcf7370c773f0e539e8f29cf3ffae830eba286b3261037580d0158cae6e11ba6a1f1608bdd7a231614120f16508bede6b81eccb992f41178d2fc1d87ba00ce394e0ec3db0e5790b88ae6a91f7bc15d4126a797ee3f98dcecd0e5d75eef9cd8baeb0872d275d7cd97ae2e4cb99297c79f3e33d2e5ab7f7ea165fdef0bcd7331e89434f2153a139acac7bfad5d12b6c495a7a5babadf58351544e46924b8ca9add55251bdb3d67945383e1915dde89c13e120e239112caa3ee71567d4f3e627bbaf9e1487477e9374a9a1e2609f4f0493253801a884fcc59e5a51666489a73e4219dd9ec6c0255fecab813d53a284be039245ee02a3f42b0fbad050b1051e8b6ef8635117b9bc3bee655be6bcfc64dfb908fb8450af0f3684ae42effc8bd115e8dda9565930826aca48af62ac68d469895ec5dce849d6adeb9d9f6695352a4fb6ef4eb4ef3a1f8d38c68a5e755756e73137da097d77c9c6a4e754b480eba08b46cebf99c395997eba85bd3bc277a458ce0e23f7007e22a29f80e405d007491b541c7530cea827c3d4ead5767b9ee7d91b9e80e44fe439d885a3310688a6ba981b45c5dc628028aa136a5516600cd155f909c170d284ce300a822144579e77fe0975abed28c2546c24224830d210152188b0cbe34b1841f6f3ce3d5ab7a677fe05d1abef45513bddf2bcf3eed527a4519d9797c7dd51e27798a84f08aac9f7a22b54168deabcf36004c1086a5507fbaefc84bef36f8cb9b5aa730a63a7559d3b17b9736f6c21a855ddf4c81215e43b2fbdef30897ab5aaf320047d87121a01813d53c2087df513909c02f3ea1600beeed4916d49ae18468809317cd18f1ebbf8288f8b5c9df3182acb46c893ef105d3da12cd039175fddaa0147144d719ea3061b6ee09c23952f5fb66d86e35cbc22cf1c74d539e73574de79aeacea5d07f39ddfd80b4febc6eebbbe2834b860a80660cf943924ad4f9e5e6b0063686f7d5291b52293b5763e2ca85b01b09dc356964d571b16ba436f438ec9f356e4c96103454db2063ada4051d6a653d631b681d94c5191b77eefbd57146314d5cd39eac965db42206ca0ab7296d4861cd373d430e7a42e7bebed437af6d055d94f568e9ab2230af2f51c5d7f0e6f42c6224c845112862397e21031f6b624914c4059b405caf655871bb5d65afd76633f686b153776d789309106b61b6366220d628ec43401934577c385a1d3ac1b5f66968409eac812cfbee2405d1a4323855a352a2197241915dd8879d3ad5530540d2545af48318aaaa4231a55bd4425791786bad5790c4d241d21f29062742506e99114313417bcf8ea2549f615468df6d5ab0b435cd851f46a55ed4811f695bb512d8c24145561d860d452aec8d34b183594adf342043bf7e449fbaea26cfb85a2daed3843512f14d53ef382e3e5dbf690a3406102253e68d1420a2c78c20e9e180f328fd9143f3a4b2849c21354e8568322d4c0263af2f229b3667a114384b839098b0082c94e1341bcd0628633b30892832546f841041598a0036b7fc8d3ed4cc287e5210b7fe4e9d5c543c927d90eea30bf789b8540984fecc8b70f91a087e1db87889107b3d00a72f9d9747c36fae9c8b05655b7a3686b1508f3a05cc2362ace425ffd8e20accc447cf56edc61561d5fbda526007fe9ba646997a82521eb337b286c06a04f0d944cc7d3758d60328409cf778dc98f2f2f931e6e43f77294ba0d6834181ae28231e526b24bfddb3e63533d86ea5e1d559d04452ebdb2680f140d1b0aa8aef365f7c4e0eebc31ba2a5f5eb819eea228aaba4d41e25c1376aaf5cb7573ce7164227ba66f923ce0074573bc31ef8ee825f5d27a96d291e67bef1d71b8aef22daac1ba5ca3efeb730cbfc1077339dffbe93cdc691face12c31f54952afc49f12ce91b43fc91107b91d6c12c9924e3079b034ec61d493eb8a972ac9aa5c19cc5338f1f57a940ee34e07e7eeee1ef94004cad371776135f5328d3e9db656045e23b7885dd91a5a4c96b823b9fb5a59b0d6fe465eada14a1519773b3b8f33ee0e854b31853685ba5eab5a85ed088a3abda62acbc3dd5d533a98d6bae2d5da4f46515f2cf6b356d109797ab3b0a07c254b0bfc0c2478fdaea5b6d65a6b75a1dc4e84dc4e5a3bff7e932e94f19794f60eb5d639ce49daf6e9939ca40b0dd3a997d35da8f3f094e4e1797817cad49d0821a62897a6a826f19c27983c541abe6aadb57eb3acb556d18abcb25ed65a6bb518d7ae56cbd5aaf2f39ced463bc8d36dc5b4d6b63d797a0e4747f274ec83dca0907befbdf7de6badb5f6de6badb5d68a3c50a4d2626a89911961b4900ac1173e978979817189a1baf6c6712e2716936ac68c1a514ead993630dc6b597edce92ba21caed60a0508808a856a29ab8615d18d27ea8c00d41229f760adb596c6b528b73c3d8b720ff9e6dc1e68d45a6b541df9ba28e78a720fb9e6d41a2178bad4762048bb149629e3e0ac93fc564a2d2b64c9054690cd96a306aeda181c6889477a13f2ecbc69b09f12a3022305068ed17d0b5d67a3ee25c1dbdb42e8c2ac765ad9f5da36d2058ebc2e1fb7aa88726cd75abb5159c02814cca42a4a0b2929947befa5b1334f51947349162bf24c596b2d8d4813e2a07fc91c4e885cb9d6046019d716f3030852db8160a59613c1502cb99c5c649c0c675c7841d5752308839ca9f914308a0ee03230312fa8262fe49956f2b4066a03263b50761049bd032293fc22b2c1844b8b4994734f36180600e41dd9b200206c196250094200688496da1a2e1c656142b6dd6d82225fef1a169b4459874594636158555266592195546884b5565668e96a8e1e1399a509797a8a28efc8d7278ac80aad8d21b43c321d8972ae28ca3bb2cec71076b7c09108668201180291a74f4aaf4e530ad474d25a7dd44bbde03a3c3baeb2288e9d756b5aee36e54409b84ce89cd0e0e5021aec743bb269a896579ad0824c02829119d03829cce088ce8719b08073924959e88a9059b000229786d093453e588788990f114408414410d8474ef94296559a703d802da941c6df3e302546c0a2e85e39e5db07c64497856cbf7d604b703bd9fbf681c57260b021ae8b9cb30b0f165e2629662d3c5158010b12d789c72683952968261e1cc4a0b4c3c233040c48b5da0a4f0c7a50a1d54ad806881f2938e330fbe890300f0f142a6e2a5bb42043219422c4093fc41e1d142149f861e4835716e2f30211153aa210234184486c2321360002f4110911e2e3abf1d486845948103f7850bc40213c54807ff0f35541051d10605e164070496418a8872bc5ad4bf2b24008e29c6041eda15d6c73031d8a330e730f6035d598888f28864451c427063c3e7e10fb818ca6fa4b9c738610c28fb3e97efb0c110576c1093c24e76f9f217290c410b01864996f9f21747451c8ce846b926390e015e4931132c828df3e3208c20319b0a05b22b37cfb0871051b64f1db4788264372508e10371f217852be7d563083b7df3e42bcbe34d18a803dbdb5dedaa1c27c6f0ecc13e5d0ef9b9fa34cbe737544344c1c53cd7f305ae6314921979707c7cbabea50d37fb0a72ef31fcc883cf16cd5a5d8bdf002f1e5d569af95fa48dc22c8530f9b50160aac8a5edd0aa22b8b520342fb3113f14089854e506c20ec69d5516b328b5d8b02ab2cba24068422a34d5066d4094a8da336ae9b9dc561eec9b8d6aa5bbfa6f3c6bbb7d6ae73d05371ee7126f8d961b25bc5719db5af1b32efcd5a755dc5b6c5df7b516c7faf53259425c26abd9c5fb1f6f78ab4bf579cfdbda2ecef15637f2fd9c4163d6c5867ac3999c5ac371b693581156195d52d0112634d44991371f644a4611e624de7e3c8ee47a79ae072939bb74e128ce4038253d44abd697f17ce3965366cd09a5f58d35553d5e74ef566b5d76a6d083a4051d5e712ecd5e70e266ba0a9ea1d690388ced0b98b04fa3a6d93cc9169b9039545f2eaa16c62a8acce3fea514a76ad2f74a40db2248d2f24d3b475aa7a9d369cafcd965740ea285420e4ab1f80b2a62c5b92e6a1d0f0821d8aea9fb22854a0f3256e9cdcd5f42f94d6a7a5de147214b5d65a6bad956ee181dfbdf7de7bbff9b5a8b5a21cf1094575272073148728aaf33b8a4f1240ff8ed945511d26c5286bda40a87392ec085dd53a27290922e8bb936cc97724da77de32be24d9bebb5f927ebebb3825e9f69de3b92af18caecabb43a32b5b77eaf9cebb3c25f98e0a5fcedc1b58e81974300ea8e33bef964127061cd0cbbce33b179fb40ca03d19a1a9ee24eb4e328a3a1911874833ba2ac52192915b84ce00c64832ba1aea5637f8bd46353148af4498f8a281c8339242a401290623511826b193ec24ab30b7498a79578c4df10871e8249be329d6aacec5238abc18a3ab5311931423c55a35f4ddf7ba5decc512bbb325be2bb1e9a7559dc7c846a47befad76ba0d7ae9fda128db1599f3f2daaecda6e4fe0cd1d5134a7a750b86a77eef926bbbb63b6dbd3db7e7bafcb441b1142421cb03ec9952c6f5d4b3a5b58a8ede56db8daca770913bbfb579339f5af1260695a8977e501676ea31b16ed9b8fe084dad82e8aa0965dd2124f17667f745513cb02bf2a440b671ac75971cd831598289d3e174ce030e16e2265459a725ba20028b25478840010e7571a8b278a841126c48b0fd80040b36c0a12edea88b41b47b11c88a41a478f341a659c6c54d3185ec3d07fb042473de39a51da5dd8df9393be4583274b046921ab51a3690526abf8fe33e4a4990470dabe8c6fc1d72ae5b2fc94a4628eb25e673ec3d1086e237a51dbd5af1a157d02c06c0e03d260cd1bae1e894e72b6301fabbc67394d146ab3c77c70f56f004245b20d9c5fa7c971bdc5bb275a328cfe9a70454a00215b85811334a0a48526129b9bccca19aa20ee4e7e7c78993d96ca644090c0673b95c3c3c14b8dd4af0c4068d76c312771964e89797d74b367b89282999a402b2945c5e5e5c86289097393487845020a712cb8f1396f9539a3fd38949853453c24296d4c8ac3413a204242985c15e25cfb9e4257e92832a0e965e6585ec56914a64399f44826ee90ab41405a6f0cc219367ded02045a60cf22752a004f38606b9dd84f49357172f180f8b0eb961ded020466845684296bcba78c178288a0e9161ded0202e448657172f180fa5418c1479ea425e5e5dbc5c664a15c076dad3ad9439a7cf740bfb74d40b0750408e1cba3572d0a77b60ee744bf4e913085d655fa1f8f4696446572b3e7d1ea12b169f3e7fba65f25972924f9f4fba757298558c4fa73a2e2f3eb1d037f4d5e2e5fce259f3766b72737284be994f9ecc24d0286bd268359a8d89be994b96f8346bc6a8a8e2a74f1e3a83e89b3964480b7e7a0828766da06f260f1e52f8e93550d6016aaab68486beb9c0ac01ea1fc4c04275cff4187d638059832789357df6cdccaca13e2b8e6523b39f4760944579688a3ad7d56b7128f2c06f9451c415169512c9d4a29c989363110eee6360a88bbe288f8bf2b490f47522956e4f6eb72726b10a2c2bb425749649644965b4b944850a416bf0942211fb14152ae8100ad3193293cd21e2076660f2f0327f93c748141ee0027456fbba06e4d98b32000ad53d78c8486114456334356fa8105d439dce9e52191d62a69294a7556215727b497960660a1047b8b7c5822ddf27d3b33c1e4d4472876baa71684795141b86a3108f423b8a3e7c308776041f4409edf8596bed4a68adb51eb61d87834beb127e2c219737085f7bb637e90766adba3aadaa8e2f0c773018659d5c3123b424b2253b4a60b39e9acd4eba53cb0ec84ed72d2a14851f3dbe1d8aaf26b029b9c36ca07c7d7e7b73deb955a439de9d5689adaa7e8bdc2294a5b263849684aeeecee5b9b75be4f65cdb5572975ca07c875cd8e581312b4ec308812ed68a31ca0a8544997844ac894a9258621a12975c57125f88b1cfa504912f455a124dbe14937cf552b489b7af6e27350dd155299a9e549103acc8258c90501dfa601fec8b7c5f548c5dda09213104462867812c45990380728d9142240c4689159a2c06a3048c122dc69690abc3d82acb6432e56c82b17dd551b97dad24115fbd5461f2d5e784111a2261ad320d55168cac53d5672e9ace57989d8751a2848151e2ab93a268551dfa6a1aa2ac0b3bb97e9c5ea72174d53e4bf47c25d58ad8db14a6211f2484be3ced7cf541c2c897279eaf27d82976927df56b4935ba2a61846c745592a248526b1548b5395227854858b756be7a0b298a6e51af2e768bc270a1d4b8de7653d46edb75ddf55e8f4bc10fe2b0dba5e2295e5214d68b97580acdca2e9a1e2a6e5d8649dfa4b875192b7a85e2d665b06877cdc862b82a8b478bbbb8f5183aa9198d0ecd0e0d10badac103f845b74ef39a11eb56cc5b992f4a992a3ccd8f5413658c1e6fbd65091d6f3dbb2a4b74a18093fbd21424e764dfb9a996bb529d5d471906659401a24d53a54c5078ab2c995a4d59b7a54ced8659302b6eddfa0b5d95dcbacf6016b727b75e0ad2ab96261a655f2d4778de92a478eb24979dd398430107a0281601deda287e429ab2be3296c697d1674654abaca78ca9aeb18e32ca6894f597b1a653f53369a228eb9c3812817199241465394e94b15194cd1149991a455999daadb24427a213985107e3bc4cef17b7f8f689018fb72f53a32b2bd353cad4de96b8276c9f2040bfa2d5085f861387fdf98d1df8635292fb4bd1c95b97b9750b7495324119496e1f2036982f593fddba15baf596257af5fd5094ac5b22ff92d028eb658b91b74d38310197785b72220ed1d5138efb689f6727b2e8362a375ef19bdf9cf77ed72bade865cc3c3465330f45d9aecb2f8a2ac95a656584e8aa2cc9649a78407486979b4c90f592ccd611ffd0550b8da2be24f4aa05c9d704708971a605c90cd0d3e86a8649a3ac5b999bcc4de6d62a29ca922cbf5a65bd926aadb2ee5ce417796b950dc9999d565997b97d3add1a1b096f7f7272b4903be617382d48709945bc6da1d9928bcbd838dd58fa96b171badb75b7eb646e301cb4bbb7bb9c7bf77ef77ee115e19009ca308ab2416f5dbc1b89b4c0381197db75ee711e49ce08c964413b110e99a05659ef70f7f20243cadc6aca7af7e2f389bc902538018e8bcf91c88bccedad9760a5986d8264eb56975f6ffd25bf32ac5bd8ed8e13b8705a5a686f392f4bb2b75dcb78756acafbd9448d6b858e9e252759b10bc7608371075c33551de39c29aca6ba6c21a129ca0191e492ba76109b37d6452d0a5a55bdfcaadd71c457b7ae79737f660d0aba7591d0aaea7856f16557dbf1d5f1c875b5cae288d0a9b7754ed0c2c4599155bee46a5dedebbd41e13b5cc5bdcd1b0e0b5d83846e715fb4aa7a7dd22a2b72c93df9ea5cadb230ced96472d4531fcdf240a75cf346035db3a37de8d5f5a9c3f4e4a7972a5f52d7572d7e7a495190a3c8f42bce7c6efed8410672a0a82944713c988705d83ae4f63962c9abbe7d8cb0e28b0cf9d286e7a9d3904105496e9f22b62f6ddaa748eda9d3880187825d08d1a803ac5f17572be186d34a4032840f4db62802873a0c22b9716608e1348e754aa24c3e4584be7d8adcbeb4f131a2e76d60e8563b7d2a6a40e37044ee8e898344778aac81c4a1346c288a0a91fd9b5604203f9d52fb03bc3b3996a254c622649cc5cf959ff3ee68c045a989aeca6caa3e1950491c2669ea1c4e07a7d7da834c9f70e2c97434cb74fae4f1d3f693455d38d4f547e8dcda1187afd78db812874ce260bd62fcc468143f3014614c474472164521f875dec559f0465eaf15428a8fb093732ac2216a00c511396873143903397440e493a4b69f79a33643df3138f99e2fd0e2db35d03713c8aca12e09b038588ab275ab73ea2d75d6917586717e65dabca13cb3863a4f39818c230ac3b99c2f6aa33cf38626e9bca4744444f4164160e28864094e8033222d8cc22acb8664e934d3ccca6a8fed69f50845cd92cc9bda44d750a74fb48a7a479694ba88854c6d9555715a0114a7bff84a76abb83b86d8da40da7901365d85d69ba5070e30dff3e6e7f3bdf9bd40d2e500fd9fe3e81f4b0afce43ca79db7687a73f4c0b5ced949bd22817fda9c284d71b38c59798a538e9e7acf1b32c788231ad53fc91c2394e89afed276d76cb2934cbfaf1f98a71467458f214ce1a7dbc601da91fbf953347f5ed2f660ba7ae2c05a3af4650cde15beec9fefb2879e0a19f1022342bc8c10e2dbc7081b3c754c4352e824a3be7d8a8842114b9080b9db4ddd8ebbbd6d58980d02a08ea8c4ecf526452d192a9201000000f31400202814108ac542a14892059a9cec1d14800c73a64a70549a8b434990e3308a32c618420c20c018000021800c11cd080010fd36bd57fa28c5978b790163696b2eb4b1190dc517af206c1166d3d05088c32306f34e2568982f3299f44c0ffd6d89b9c9d2f19b5a2a7e934bcc55b9ca6e2108e1786ecca6dcc03f0457b2b7444b89dcd1f398830b712e587a3f39d67c8d0a3f3741ae04aeb24d71303d7dfc0f9a7e6584ec4ed576f1ee83f0d5c4c7facf0ab9401f082f6f68a5fb2abda4c833aa795c0962f03cebd00292ddd169887d509aaea92e55c75d980087f38f44c578c1e163cb83fd60202462a801ea0d93552c251a9644edc45270f703f73b80b3a167e853a987e6c6ff1a7a32b43d7976d70e4f35ab3b94f591777c95881da86aaa2de59fc4a13e32f1bb64ea4356c2030c328fae6fbe4b061ce0b111934169ef8a72e5ede0d335ce3b80739d5ff7b00d046508167906fca821837ff8e8ed5f5170b065c8260c04df7e6907431e5348ba9aae4c90cb9fd486786595038f25127df4480e3784a496235410813b90f3b670cd4488069d26cb82841e765ccdc1a8f2e59c68962da223e34d18acb3278063ed3b1eea0ce0b04bd0396ff77ebfc6754e54b11d9eaab33f4f7f91015e2e3432d0dc4911fce87ea8f0a90d6cff7236c0830fba51fcdde4cbecfaa9f69ab821d7f6c9d53b403688061acec7ddc5e4ac268da811adb49c1bbf54aa736693c266a152b46c9c01bf529803c573490f3c6acdcb854c884b9cf6413a47ab2e36ce75930adf8ca1f4f3d185b2dd5ab5e98c7d5e1cdd0fdb4a52771a10522227d09cd0c05c558e96b397b015f469570e428c08b95291abbc0a83ba5595faedf747006c41b5c569c0bfd813c5175cd1dc671561e1b96888e00587aa4aa11717544953365687fcd5e64fe41a62270e0c2258992095b901a678d6d94e56ce0e8cf48d953c688b5da82a811848456b750b136fab5cf2d5d001b18fefffdb4cbb382418d5259bab4ef8dc595b31b18e5277ae8bb17ff1b939eb29eff6f3a7e7521858f3bf8cd3cdb93a5d931c35cd5db9b69d3c108e71b865b581120e01992f61f9b3b194d845f89d219939578d00ed6a62abe12d7a11edc455d85a27693f6f32e0351d6ca121fdaa522ad53ec52b0c851df97eee5bcdafd44d915ee73f1d1f835b61c5ac1cb0ce86cda90d61586b510942d7638bfd0a5518d01a3be05e6d8f80f13e80f984176a5703ef364eefae203ce3e73446ffaf16a899df392ac9868f693271cc0fa0b1b1db3ab14299e44c2b2f6f23fa0789925efaf742f47ec316c4fc0df4777fc953d3464b5f957644ee9cf4ccf5cb7eebd2f6ee224ae3c07d92bbe62dd6c3e18c0d16f3b6d0c786aadc163845a7aef92ad1a437c67d445ed22441b4ea8a906972e0b1640f9203baea4f352994305a4dfab8e70eaa2a52646db84363f9aa218ad74257e44dc6785cc834048ff472516c1827b39ab81e6c7a089ac2781461dcd6106a45d95648e76d32a6b3baaec8c9f90269567b5dd1bfa5576db138f19ec7433dd6fb0b96d2efe4a69967e2cf74270914b991ab3d6fa17e6ca08d238583119bc2ae45490a27f6d6147067f3978cc5c561516e87cce2472b91a08d101f3b4cc5d67893bd7a30941a85219bf1a24dc5a9b8c7271e5360c5b8f23575bedf577c407710d8b2e3b974b8ad04bdccc2f0c1e073540838f5c83abbdff5e98e48da3c177a079e64cc2056826510135c9cf70622057abf873e69269fe38f4dfd4df36c420c613496631c8800d01bc573f48bf2cbda8a6d615f64737ad13d41224ebe6004ce72b8c7559029218afa96369b959ac3bfebe296964510cc9e314b9ca1690f57f54dac946967d7fd447128302216dd3bb7c6af9655d4f1da970581b17a150ab2b29c6033dc5ad3041f4e2edd452308d935e3f40c017db47481cc49c8c2b0b35e896e4f560fa4bb10775521693b3a958565d1a6ab8971198c3a84b1b204c4ea2675e90851d2287a9589d8b56a170d38f986dfe2b020ee1141a3c0e617b81bfb5d7552067157de6f84dda31d800e3b0cb86c6af688fdf94ced3dcbf6de4951321080000b5660f7a4e54db717804dcf95ee876f5ba3ac5bd0e8c38dff5f0c035f489cf1b65855a29edcf01d3c64970a161db6d1737429245818ae72330f1f80f6bd197a449538199f8bc2f0317725783e7ca7aaabf896dd1eb9cbb3ac7271f6a56e0d39652661aaa7a13d30615aca8e1aa5439164e8a0ec372102d064ad2dc7c4db0c6920aac185f78705971637bad805c60cddd26a0105a2779213533db3802b22f24511e7b33b7151fa8ef8784fc73e2e06dbef292ea8164a8ef856f06968952fca86732992678c288b2bddd1da5718bee41d6cf714af5530b87eccd5b7b903ac6bfd5a54d02c21a462c7a8f7fbe54c4609979bb8f5b3430c1386abce3f7c34a9b7e5af8fe9fa78c6b2cfec48f187e3f90df347100c0669826704ebb5816993ff82c326c002310abe85725bcc5d91827ebf6d0a004c5f2b1cd21e751f9905b18bf8df86a5932e94ce2a9d4b4b41b2ea4a382fb50203a86f0f2498645c81449ac4eebbc6fde9d53881e915ec03392320fa91df6b38793be396252c2e78f33576887ffca0d4fa9e35817ecee536272e008083d2fc51694b13cae478bfff8d92a9cc21c53bd855f111579f2e018e1cd50f4daf4c71e9453a4c6b251806e8d90eb695d9ee46e12a9e1df91ecc2baa0776b0e1c387def0ce55f7f3441112eef96eabb63a5250412ccc28b6fcf29709560f9cee64e560db6bc42358b2459a9dfaa245d78c290758e0c7bfd62f8d7b896c36e3d3d9a2c39ed0caa6c6c8c63052c049af92d47c9b15dc4a0b0c8fa5ae70c5407e8d614e29dc4a43336d614304d060e084ec4d0a02278b7a70a9468fc9442311b2522a5c75bb428a7e20cf481dc8bb80d8a9dd852f9d4e0fe83b0897b10eb9267228596c2753ea72356af8641006cc4aca6419112044b1f83b7469704909b3e02321f2bda1ae7be73409a2543b3fdd9e5d2c653275e25bf56070634adb27c000ed2ae1e73b3e209ccf30c1987ad9aa4b4c037cf18826d7363c0dc40a82a1e49736248535935167d7fb0a52b20c5d067557215066eebe1bb278647a41bd7e9934a9dd2d37aef69d1c589c1c2deea2fa89a20be42ec1a8f80d92c2fe58511ae33b9201f23fb68b1a84f719484bf4273bd0564712a2f1c6905314445c69299d9eb5b4dc36a487d2809fc6dccd5494aa9912d97ed175d8b23a1733f0df84a005b22baae334607db518c9275aa77a492ff8062f5f44e46b12a5dadca9338932307d25b10f725e0d5adaef571565c361ce0be82ba4afdc8145b8bff71bdf18948249a7fb700711743d11bdce91f77e1c030d975e2c5f43032c6f7f44b5a6a139c07175098b9921057d0af9a0c274e71832ddd872b0f9513805075e7533f77a8a6393c0d53df05b148dcb7cbaf3aaacf65091376582d5d7bca11d50ca532ef0067c3032ff7b6a195009a7b088e1e0364102b549b4ea37423968dc1daba14678ca156572cff635213b2ed23b1711f43f4aabfe2f127bafc009dfc7722d0ed78c91260e04446f53e28047cd2dfc11e88189c03d22aa6732702522273848014980a6a2c8149f1266aa12756ee7e5d6adc4cd0116d52b1a139f962a7400151061737eab43344778d72dc97d5adcf849c59d24a331f461373cdbe8d136185a48cae0eb2d3845bcce720c6dbce80250c57da4b29f9dbfd3e1080192e6c109c424e1c84ec1d01faf028952dc77d4a278e3cc8476e8379f94f79a57ca5218d8cca1f45641e56fa5a36de9597ae0610fc783a60ff59601526e53a634006bddad3abb8f5ee9297ee743c5bff5ff63883414d99d8a313988da821a1cd5c354aa803058e551921748ade9457c22088d0ebc7bc7f44ab646c8158b49e4bf1caae86d057ccafa5b8144f6b7eb3f28b965592d8ca0555b40dcd73c118f05ebf2a830e2270b21f5813da84e7361c3e8fbe7dd82f522680a5d09d2f3a03c231fcf14fb34f670507a2d066f53a6028458321167275a99a8cfeea5646941e1b50dafa8a5636287e6943f711fc7a02ca5e513ffa842e8da4dd41b502b9422ef80d0f40c41eeab6e1f072f717aec0e2abe457843907b1d83d793e304393adcf54d4f2c4766e52f8d8b0031c1d813dd816c3dfe031d838ba289f9449d2b8914518c9542aa4c1ebb7a9e1e1af8b1d3b0d144107c766ba3440798d1d700c662fccff0c8b3746d4c431b45f06e92e34de3db39c3f4c6973e6af2f11b401b4db3a980792f4042d45c2f7a2ab422bfb22263859c8e4a78126b3a02832e6197aa0c31b36c69cb5ec34445e3f6ff246ded13b13fb161679f88491e63daa054065989522052b3d084575b2f5aeff802bede46586c8c44f9dd41c0006ba5fd49e363fea1787f695b982182786ff7d328635005be94d5918a6eb051dc0b1089a6c54043c298b0d7b63040327667c7edd5880b4421e6f3ab73799100664a1b0e4cc5925ddabd738ed842e0373403902d638d89e8dca38bfe450f8477bec5dcf2e8cf3920d9436d48c1d1a8dfd9136b446913540411a79fb34e6943b78f143d7c222e7417b26f5e89ec68759a40cd77d3ce1fbb753b7098ff53fe2ada9f53b51994714e8bd5ef2e6f5ac480910d95b76ac9c249e40315cc3bdaf71f964dbc733b679340451a19e742b90d2ade744da7752176062f83a7bafe93ea63e64e2a99e4a9ead4689611f918c01c64234a6147983a7ce70c2e9b4667925bcb5a3a6913cbd1f43ac6af58d206816e59af9cf39403622cc7246a6399555a6ca19bb3a48936613019cbd399a80e7c36ae6e29aa8bf8cb12899666b74ffce661548435d1c6d0a6c6192afbc69432a058f855b719da10918013cf365fe776deb2f2b7ad898508e4c6fd6f820fe9d04c71c5945c5b5c1e16046000bf4ecfa8a8bb3f79deba0bc6093a828b8b47c110d32ac3b1b21e5c5223a20309c493449eed468df3507505347b37aeb4085425bba98a54ef19ef1d7e272abfa791700d9e54bfa3146551cd11ade8dfddca927886c83530c39b5ef07bc769b857d4689edc31952c657a3b66d53b0289caa300f980d2eff91f8dd1a3ee871568c5b22a760bb493c3916e10dc2490c2e8f90c5dde93bcb0eec05e2a9d70caf3768006df3d96c155f27a79c844237c1f1872d14854a251dc11112432f9ce50f25c3f7ca051b1bbe54f41adff86b3917ae7dd0b72e2012a988b293a87d44fb5affffcbabf5a81bcba227b7eed0dc012bc3ab147eea09150f51fcfcc540023788b0e20a573cb53032a9db1c573cd34ce955b40f322920e221eec26eff3a153176d408e07f7296e0eb8f4e3302c1236589ad32e294cd1f50e9764b9cd9ec30e488e74564a56b99253b87bbad2fa01471c2ac6c8b9f66aa620def3451b5fe9e3a18e17c59822eb62ede73d803c5beab04b1d7b68f74a87cfe1c278cc9ef2f3a05bab3e459ebb396b74d24da5f02811ddfe2b6b7203b9b15e4ae0b14d5b5512220b343a52aeeb75fa002e507588ed2d24090cf73b0fe0043866195c5026aa65f81033f1df83c3fa6351cf1a8bd8fb18fe7f06e0c8dbf26b40eb08b29ebacc979855e11b81e383b9765e7b5422842988fe9a84a05ef10c7ad8235547b77768ef3c3d50cf61b5cb31ed9c222124668bfef863d36fd673edd9d0057be02c4daa8bf541ec01057dbca451d346252d560a798d00f72df9976be42b234599b80314d2e76eee40013e9e06fa604d87e2e174d08a88c3af8a59e9753d3a769a3581df057c492aac553db409f2407209cd54152da5af0a52ec8052a42936f2b1891a3789288863256a7aa99479b9a86cd433c72cf930961049493bf61433b23031ec3845768caf37159ba3460c7245fadda37166b43ceac758b67813e423699209c6ac5c3a3eb123296f8502d66cad7a821f020a95921f2a089f0dd5e2c1adef061488fa5d64305772775a0c8b1df0c19b0975d823657d66bf0247dcabe26976378fd7986990cd77beed55ca55f1dc42cc05658567e5a7a8de11d76fc2e7e532f190536cab5d66609dec00eb33e6008754333333d8d8b902d54f424a5e1a3918cfc74388ffee9facc011e24badcd8e3c42fc8bdec9d61b212ecc17ab83470829082d65ce8d902d96cfb9f48b94ec6f1a9fa07a3f2342829715d949c08e8c7e8268506e1fb0e6cdb2f93cb9721647506290a04c81d608f593a0d910359fbc10f78e426f462922533cf56bdd5169568a67b6cc7e85fba278568bbb122599f32b89d57426343d60e7c921657d5360344ab3d24b42b01457bcc19641c8addbcbfdd1e6ade41e84658ed0607177a3a9e3fb0e70a71921984efadd7bc0c074489ef04625aeb1fb83c55d31c074e0aef5967e4de2d280e060713781130e0b98d06abc0115ecb459bd3039586e3fdf986c97ba8783c3f49111f6410abf3cb064cf1aba216d5a6bf225f251c7421dc9c73e8167173a79633f198c091059ec463c6ca9ce23f1379baba5908dc2eb61f9abe0773c6899f21bb349ccca4e326b43e65ef8281b1b5e272e58d1d8822b2b29ff834c059296cbc053bb5e84e04d84e32c2319d3273e1371c6d191a229e00addf609a964e690e1a22f7d55a60c161ab82df52b82a951af32aea94d13d6cc421ddbe2cbe205ee3821110808daaa8b439399e581c740884fa9f8a28bd764a30662f2ba2bfc5d30838ac655abb4f7b1171c495952c76fc1c720695783b8c0a62d8697ce9266bd34ef691a97c9553299360d3f65436c955b753a3d6d80b4b6fc2c134f844b93db09b6b75921dbe434f0bed31e904c41b1e38207c9d590ce59ff4e9cba8f2abb48324b7d807846e73c07a6595b4c8766a8b2b36f016512d1877502320501c9d7ae5bc297ccee0aacc7f2e557cf9c26f9707e20075fae0702c45dd1efe73c0ea9064351803e4c4db95b9bf16046d43e64ffe12a17ad0fb5fa7385d948f3c28599adef84f143ba35696279b70173ad34c92dba18426dc6935adfd48328bd7d06181fb4281c06fc8a02e3b349cfc1400eff946080ff25dd9f0b6ead40797fbc58e246073e4f0767ea8f2045f32076df2d05b0f577e59f11733220101b0788b736eba8bd219f3e6ada686b6610688b180e78e03ea305f933ce32e5feb86516043fb5aa0e9cc7bb6c75cb785807730d88fce4470347974bb1e9b34c348437c95e6c464502326a47fab5599f37b3fa184514f908d6d16438a91fcf4034b73ede40ee7135a4924bb39040a9a860adc64f942bcfad20c0c50f7775e2633bc69b5977b78ff0d3cdcf714e420de5f4cf4ff3646f7d3e5858b1659a8c8d7c8d34dbeb3a6431f1a8c93b1394e50e5b6b560124629eb654a8ea9f21739185e8f89144ca22ba018ecacc7d3d919ee2120b0e7a679a694258dcdf50a8bbeaf2695557846279d74c20f9d85e04a66ecd619849191d52d6f42a74172a348b70bd93633ac9c1592d72ef84a6957f27197a03dcb1bbdf51e56f69f87d5d8084e9e60a3a42fb16cee57590b771b7600fe22eb77056c5b3e00258c37e654e62a618c19f67a69caa43ce5d6cb84c3a9c8a84e551509d5d90029c6a519b70d653fb1eecf91ca9b4a67a370ff72e433982698ae436d36efbc23170668ac922c12f62614afb179a3b44f31eadb32b93093eef7a9d112fda05ab2d8a3cea5472df7bb3dd7d296539dd14d1f67b083697836969fb2827689d2ff4fa67029d7ff9fac233b496db479077b6c2adefab87741bec4d193f83f6c13c957681d434503958f38023f3470e54b882d29f518a5a6a04ca8d932bce3699093594a7a2c305bf7128bb8a16ab2686e330689701c66096212db314cc7205230bf2f236758c62196d70857c8cb21953ede69b94a8805e6dd183a1923d88f048eee3bb544d4c60847aae501e5506fcc4db207c9848a801548707e01fb9ce99583cce83dfe8193763fe803ea48af87f9aa8db7b2cc4ac60b41b1270554ae0f9296252fd2a3f9dc0129c17f910977c4adea4f4894cb747b88470855ce7f1143175251aea6fe61c29e4242b1762ab690ea83ebfcb4fb11be9e662d0fb0f85de6c1afd99f71a8fd09472d0f4491998f20ecc0a9f25c6e6aeb57ba2af9a0895e151a879a7b36e6b8876822ee569b6bf8b61b3ee2623097fbafa721772697d04eb42d697dedeef2da66d65633250656e25b94946e15687683cee8f458f6eadfb1717728549ef69a1cecff0e81d986cb3ffd00f7966023ef6d9ac6a6670831e25cfb653e06f242880c101e8064c179db6ccad16cc53f25522df00e303649166fd832d937d5f40ff8f369be45dbac92e77934f18e16d3c3fe2673fd2ca189e22719d09ebc7b47a02effa949f040d3a1caa8327e74180aa197d58a082d84c8196d9f21e32caaebf10f5ca7ffd26c7f344bdb60f047e5c93ecbcb8b13556f41f3adf6d06dda1f39f0a094922594732b6fc3a3d2de0febb9e4b4e00cfde042cb63119304082ca3eae983fdef369e14efb88b6494e2d9d9144bca849514bf787d9b74558acd5e94c011e3dd39726f58eee0f906081b5a5198195bee36573f87e1c8720585e97306172244cbab22a1dd877bdee4d7ed20103954597064f48b2c988b3c1355b31b4e49dc3a863f8f76ff51298a87838a53c21362b42b1ba5ecd1053b878633d3482b4574733218668101fbbe8b93b8482128a9a77b144c563f6c928d9527092bdd929d92e9bcb0f3a26969df31cba9dee0dc68ab46f65493445a901ef105cb0c7495738b924c0b67327012406fdb0f27bee92a2dce7724a698b44f486d53fd6f4af426a9009e2e876d5e7b31c34e61f10168a4b353ac76354cb3c93ed9b8d80f69fa6126d453fca1a30ab2fa2fb30800776284b0a1e40aa242aaae055d766526995909b91b90a286b7a3d3555b7b3d1dc9b82da37958af8ea93da1552175c281049ed809109176244d1b317a80fd64ebc130e52dedf7568686439f310ae59be203c1354c2a87eada2528c89ee5c1d68c7225c719e6032e43e8ca538b4ce795f6faee8931e09d4a0beab648231cc956c1a28605251c16e3737248d6887b4f38d82f4c04f874404fac4d70d83a5eaa6d8015754851a113c258fd199c24a8f3b42bcae72903204084dd804acfb572263be8d544bb24258c6d7c128e42b75041710d1ad1d5893da0d413e85a9ec0d2d876de29a3f6ded1fbd5f8e21f0b2946513148397c54ffc54dd12e84731e0b2444ec0ad1693eb015cd6e25f0ef9b6b4e3eec5effa7ca170ee0c4da0b2f2a22b1794d39d91d5bbe04215b1232e72f3bd3e42b5e0a504894e16e7a103619e04fb278c0208a7cf5c7e39fbc66333e3429abe78a8c7da0a32d642eb1029e0ef240cbd9f5de5bb3353e4ea91d00dde4caa18adbaaece64cfd254b8c812c75406e47d33f6319ce5a31eb40f90ab8a1e13d912777a4a6f143855aeec510610ec130b18679c6fa04823d426a990ed8032409c44461f9ad1213c8fc4ec3e1ba1ad45074a70f0ebc3702a2a0955684a13d7a4186a38e889ccf351906f9f57322c1e266e800fbaeadde7317ac05259d85cd40fe76a191b05c11ada486bfdd363ae81ec3bfb6739701da266c2c9edaa7b8c43dddc2e2fb3887cead3c8e221c5ce5ed7de8e13b7e9953ac5c3072d01664ff9c049c6b0343b5b281fee0ffa4599873f562a9b3680914db7289f6c7ddc0d0ad0bb8e8cfbdd1ef76d16d649480f0fa9f82f6ee0026821389254633efc349efa0d229cf174eb21f0464f7a14bb0f6a5604a06c5a35371e8ee219946e44d4420dcea1247a7454dc27f88c2f90595c25c6955e1c3eae8d349b81f478fe3ebda988dd239d49866a661a9cce6d0ec5d268118bf44d425dff7d1c2832170dfd4f261832c297bd48b1b9542273a8b521d822f2cd837a27567f11b63936e4fc79e81f4b628ed253ed3cfa6566b70ed3d71f9211c4c6f8eed98f66126303b1716428cf32e8aa834d6692e76b4208e6788121eeee17b808e9dc03d848f5828a28024835284dfbfefe59fb2b5c31a7514b2360ca3102c973d61815e421779937ef051c63b4b53df4b1a58740c4a16b1bdccc15779eda70397e40a0e08628104568488ae85f56175af598dee1a047d0cc6b50a48704808c22ca1435d8195d7987c798474843eda7b15796978da88c5bb389d15baee03b06f747e785a8e4305decd6e814d0a4b56c8be3368f5b39f456fe01e3177839a4510aa78cb7a18c34668a5551461fd4cdf065e2501a64b2f6812b031c756b4f3d1bf09f636c908cbd8878f8f9db200f0bba0183a0dc6b897494ac3c53685cbc54af765744f8c29a86a907b39e38a683e3b41d57378eedee9a0685ffde84b6952ec296c956a5bde099b7cdb518388cac1fb2340665ce803335840291907dca1d2514f43441181d4ac4fa6d99b0ef7095a1a681bf1f89fab31d8c932d07639869050ada023fd8aab91a14a6b76502a68c617d54b3f30614d40d57ce6d2b35e94a3371410cdbf6d30a4854ac2e25e4f9a232374a895f8496d9c83236fb43bd6cb9612abc10a1c600aefefe16f2e930dc03d5b812b2c080042de3676feacfbef0d95a60ac3cfc8c6d66c065a25817c20d56c7a3ec5ee830ba7b11d7846da6ab302944d54808855b5629221053e1bb483087ebcd1bd5e4a937862e6cd2315901a8592f247bf2ce52e908271f35172727b19c9c5f6076ef95b29ac002f05bf0a58ac5ae69ff911cb0335da31197aa82fe953238a212cb00cb45d7d1507d0c90875b992f8c426316a9b1aa4aa8ec99cbe103cfc43c57ec7d6c24c710bf1a2382029ab4eab28f21bc4a1c3232d12ffcf28834033f2494aee84a7e96c938b23202f1fa341a4cecdaa7271b67f6265babde73b453a13bbc536b32e595aa408743805fa9badbddb9e2a1c75869a4ecb3c7adf9646b17d4ee5541efed96cb1485de5f1ec89df0b352c39d9c4bc3fff6077644be46c3f187fcac97baf752dd7cb9c816024cb13222d3a2215c0bbb842e5f89687e56c244226b3da6e2a8b399cc31ffe09483e674010c2cd27a80c66a195cea428c21960b7b25cf0041772d438241913ce1e68fa9f53a32f68ddda7904ee4abb47a39bf56c3e0df071b38e3eddbf3be57388cd435a1990431e10af2b90579a3c9a56181b34b30e43a8130522a11aac902fb0c9bf9a5bd4ab91cb7fa344247e9071c9477f12211d3cb025d736d01e751e76f41eff48195f6098fdc05b4db41ba8b44885c50cfb46296f366382d81cbb99f2846729d5321c2cdc6f15fcef5eb67a58508f79e307c5fb3dfc46ad355417119525b1da28a534d5b3adafa3c6906ed60f066c81cba5b68bdd154c307617a578d7022156fcf15cdc98dd7cfaed34e611015427032780ba53c2d6dc62fac8102d188f2e969ba18628610cce13c58057174d2edf14f990727601b1bbce53169e3786e9a173ebaac5adae6a6f6416f283d611268d57e13f31b6ef9c2e84ecaedc38ed6f31467751a5d8b40bd869cba400a573abb39b89a352db4944d2262368eb316f157d873221bc9548ca50012a071f4351050af945e7168848f7ede197446c45b7cb48ab8f8dc125a5a16c7e95ec0591cae95799299f29b592f837e8f589bed8f81bd478bcdb4b7c1de5f7af3f565f0f712b7f9fe30d0bb68eb66a5d53f90ef47e17f237ce63aadff928083a4018114e666ff34c0f7abddacfa1be47ba46e5efd1af85dd2dd7c7f0df2fd2a6ea6be06fb7ea937571f0d7c471a276bbe12ae13832a3a90aba746c3439e60b109b5742984a1ccd46e7e7d0df03dd26eb6af06be478a9bf8d700dfab7273fb37e0fba5dd6c3f0d7c1769b7a9b7f80cfabd5269b3d648f83be8f92cec7a937f90d19bb25b97f332f669aa8a4b5d48b24b0382cab74354da9149e0587c560bc764749fa9483739a8e0895a27e68f4b55c11e72ca75cab3ee06adda61f2b1bc519c85bbca920ed7b3050e2424dcc6e1c1e87e4650461f823c27927a679578ec88ad5c6c92002e44b13caac1afa17a21fe8c3b28b61beb9a25a154be18789eede046e4453c2bc6a63708922b62a190abc814af5cf8e3a09f46e7d340de977a59184faee199297367ec989c9c7bccfbf9ef849555bacfc30c3da5900069b68ac1f0ae0ed56644137b79700184d909136557a81c2b359a1901bfc5395fc9ddae4ddfd61206eaad07b71a0b1ae831ec68a62032dde7ec2c1aa074e1c2872824544026e03eb96e97e79dbc5f65e7c24f36cc5ea0fe47b27edb1faad67d769736c496abddfb4d6b7d9dfacaa9b8b481727db5b6c73ea59ebc4d48479c253f4d2917944d7fe8f0948aa2945171fd8db27adb2b2894a353634efd687d1e62ebf4ffc029377e415e11ae2681c3152886760f31ad3410b9bf521b2f54725282a7f12a612185c83b8a382f694b502624d96a138fc6ce802056ce4b2648f19dc11167b07bc05fafd565974bbfbf849e97158b1621bd8883aef529d78e1a88c2cd42418c61fe89d13a4a6f96d35ec8e2d7e72cd68f0e5de9193a03e0689e408ce4a422e447dc50473a9e042ba795017f0ae27db3cac46e46c1163907f264c0a517d0f2ccc65212a0db08bd7a831eae2960f0fd1510c6fbe7f4ba087fc292588837eb054671f5d3024786207bca46d4612a4b0a9a6d954a0f9b4b4064918854a0d422b0f1c26f6214a91e4b0c5a990b6a7720a7479bb218e76aa6a4a7dc4b3be13cb7b10c931d175c63699fb1077394e72972012b7ce298221ba6ecbc14e5848cb54550015172c82c5475e4567e9317b699156225540d89cb6b71090bd7125acb4b5b4b98b7062ed34835488eec4184deb1690030f1af3382d697049be70db3dbdf15240beae7a6124caea59a9f007b608d437e0d0fe403b5a516607bd50a234e48df1e9148ac95bff456d102c8b54a70bc406411ad5657901ea2509e3d123693ad87584728584c012f30479e85c8aaa52152893c1a6e0bf71867b3110d7545ba838f3128721f6af287e01be192f8cafcac25238262aa003a0edfa284af9365e02cb6284a8b7a592110b1230f5b7666b5daa507429488808da2c7ac9348a61829f402fff928fc3a19db52ecfcebd999d0818ae36fd388b2cd41a4b3d0ae0f2528f2baa20646be88cc933513606f7c45e1829464a0baf7317b20173628cc2cfb4e785892d43520fe9bf4dae5592a33994e0e58adfe2419cbbdb3f323b7fadcf7a1436bbe09c45e297e2129da0e6c71a45d126b8ac1f5908becd7a8ea9b9839c970f9beef5be67f1eb545247fe5575a6c561694036e68a9498f251812fe006ff0a797e9e706d84444ec35e830a45f462a88d947f8f9bdf929d73d54b22164bcbb3c04ce867d79482f58ee0fa5817d22d461567b921a751748e77b19e4ae17aaa75caa46f06fa46efbe1f190049c1083b2d58051bca13b9e7eeffa6802d344f773cbdf90e58ce1c5f634579b4bf79e7e077f0d34eb4db7792622fff81153f3a290f108418175d00a7703d53d3914ae100a41ebf04e0b5f8789c42f3cf4eaa481f38330cb616464368408a35ba3af25b06b8737fee21bec98c16d60b817b97f258053170a05082a47b8eb5f3ed5c2ab0245feb97c9994d6941b502134622bbc3756304b73209d1ec10285ef558696c58c39f0a3826f12e217af14a1c4d22149a3cb31365112bf3e256b47e45fbe21a652666f94be3d4a83eac3037ae7e0422a0bcdd0cd486fdfc8226372f12d577419dbea72795db88d02e0628f5a51486b465e6c49b9e8e3eaa0d6ea954356da30722f32c233806e97635793a98c9cea603e93df44a0df0023f8d0662b6c74f2ce40fa4ba39317ca9b4c86524f90ceb7d6091b38921af608d41d554eed3a76904cd12618ca21376315bf354883bb96c5b179565c6588db3bf82d5d18a903b44f98fbf046828f17f0d898ac4de7f9a70bd86bb874effb090c97dc14fc8af195d8052a6281e121828ea2427e53bdcf69e1cb7e2f4618d2065be3a30db06e081c3f45db60d4f48ffd4a2bca2461995e46c0bd51e1ad00352b56a1851b5543cd170dcb762480e0a86df34905ad3b4d36950045417fc491fe2851495d640e3c9590d7d94052a3d7e718d067082986c773b70b0dbd1192dadbe9035b1b523e4f1e6dc215b8bac1c824d75dbc8c25cc82d8c17f634fe45410227b81059e9d37977e0dce39cc5a768c9a847b82c4ef89569ddf3fc7efa15d1158164133645089a97c29ffa0c6499d0eab9d65d4bedfc0703d137c93d2552d1dc243464daf2c2b93304e21d99de369a59fa18e9c0b40973f4250d0c6b3ecc49c46a5751a0d8122a01cef787653712889513627d78628ef2cd6ea69aedefa9862e7b6a7eff71bb559506c412017ccb171fb3f1f909ebf39ba5b44b3f6b85b27d5010d957948d003bc079d0549bf6fcabb5e69914d66ec76b30adbb75537be241fc9d1865b8c97ffff753893d3f5008bfa8547978f8ddf5620b99e9d55a7ad955ca873fa4b39009e7e30fdcadf6a9129ff5e3f488347886cfd4a0187d6bea6e708a301fa339eda27098c8693152268b099e92c9351ca08858bbc4e702c913557e642101d13e64f323ba02ce1317834a8122f8fb4f3b60e89d0357ef33e91c30d951c11a289a6b09e91c63334d27b2f384d6e7965a920ce3576f2b5c2a5ce1abb126ed47b8285dcc7fd52407d64c42d42321c5546a625bc3b40f06235f8e69e125d65df6854764f5cb9b9e82ca31afde2923f8e4b4800beab0e8df9c86278e810333862aed733a67234eb07e90984b2512f219b5b04592f7072f25329c54e64053d6bb1d27cdc0ea8c3c05df4c9f067f3240e0d58c60240b1bad51e37bf14d0dd072a34cb8e6d2becd68e8813930b56d15474424014762d759520e656c5dc2ab174d49971117e99b6a9f60035eb71a5140d88d278fd0bd44244245417c44ba57552d9a148368c4ac1d0301cee8ca990ca56f707b3bdbb27ec717934bb38656b741fa4e16ee856c4d0aa4ae0594d3042bdd866cd9760cf77a3120e766e3b40fcfbe11d4631dbc9648f63886ece6a2cd1c5c74e16b185917097dfd1e462f5d304d1a820a0f044fb6dcd2ccb4963263d39897767d586a422a5f34a91eacc74069b24d259678cb796bb324b4e0e0100551f98bb45e9450c2afb8ddef09f769b6a089c318e87bc64368b05123403dc1e5ea9351ca1a3cf97bb35f2d31002497579ea19a83126db1390e604fa7816b34fe93269f509fbb47b033b0e0a93344bf2959f990601fd7eccb36c7876189f1d2c1165d912f5a051c9986308afe71ca6c89d19ffd2001f48322ed31bad044b04599bec43606aa56d4ba7b65eb15c2fe1367fc26ebc106324119f05d1419981eb04671e41010f453b4d1de02765a5b5497146916f5aa82eab06024c86a8e52a082b12c319c8c5fe4f506503c460dbefb2e9d9764c48e58673eac025bf072cf927907d17fee2b728f39144848fd6c6ef200b50c4171af84cf6b04992d12a01f490428e99840753bcd2e7e2ed94f94a75a6ff470c91fa7600258de989e3f9ed4dd3a2a7ced4afb5a6ab47a228f92dd634f1d56ca7e49ec3fe2e07e435bbc53ce494a17bc7f6e83784b4abd3de55b6bb36fdbcd3ae6635cf6fb1e682d048fae8e2b49a1d748a5046213641105e0d4b9802805c6b75040a9295e165ece21f92f32d2a7b39cddb7bac4702361513ca369471fbe130fcd84ff1e56aa9b537e425342bd1d5560d3bda9d095cb1878d8af5b8f24cea95d7cffd73efb4c7bc02ec41efd63357c496ef58904d5f42e7720c6599b97f78919c0036325192dcafdf58942a92403ba78c070c16730a4366d7c6324acd6ade2d97d422a93bfecb18e0e07aca9e8afa2bdc9ed54ec792db18c2ebc6c7687b1c14be995c6f3175afbf161f2ac2571b4efb6af1929a14a10ecbc89f4e5b8389b079efdc0d9a36a064060b7d00b0d35b0a88c0ca2a7114ba3c85cb3fdeeefe4dbf2957c66b0ecc7cc78df49ff6e955089db276d2d45ee28ed313fa5decd894e511dcd26239ac358a25fbcf421deb9b1e5f642f94c00171698d024f74eabd4d1d1022b8a8b886540661a94dd4e7243b1cd957432556f576ec5cab204a757408e266a87fa9a2633035c5c5fc13cfd398c49855a44cccc1bdf80ad16aaf5779e176e190288bc6f99a444416cfad66c99ee845732e0648413f4105ff2ce5682f30091f4558edd75569f9699abf344d11bd98d88b89ed2e3cc53df01c41295929eba4417b7c94f5ff4f31e0165de85947c9d7a3924d998750deab9153be64d716c71d3f7410c37afaa269d64a6e0439c3376a1eb8e36dfe00f0d97b24fe2b25c6c8eecf844f82891830c5964639588ca4c45fc046001ce0dc2b83223bcb8f8584f1aa59ae774091f2daed8c326fa202683aa5b283a25d434d8040078f5207fcc4469b5b6796d8630372079cd733868048f282eefce2d3ac2b7603a67b223d385e1f670fec94fd921f6a5afbb314283ec42a770341e0e550089b6031717af0892d64c9e6f1252d049e9a843514074af231f601634f36453a815011fe149305945bb07a3d0510b13c487861a6a0b872aabf49a406343d2b0260aa33ab1a06ab2a58f4fa794dad717c9441badcbf8e14b8e2dafac6afb0ea1d8d4eab1261274e0cbc8e22d73fe8a6e0e41607aa2b4bdbdb1b3284413d7bfcd34fc352decd864f1d5dd7739dc5baafb9cb5221cf4d9fbdec2ec98bc59bbbb9a0f98ce8692f5dfaed4e47612ca7150b2b719371ed23fc8d67ca7d7d09cff62de3dfa31324fdc9a02156d810212184b91ddca708bae0019c0bff084dec70114b0c06a1e5e289d17f09b71d90629f6ed0542b97bed87179f6fcfd23adbf8e6c6a0d736b0314bca2b8a1663a41f09c7a0e799f8538fd3269b078b83d1871775a7b6438fe57c29984271f6938a623cc1431c679d2790d7a017a831a9144faf0e52bdb3aeb04fe7da10a190ac9784b77a5dc45e1e61f730f4879ad1e92f6b756bacfa52bcc42edcd93f97ac1899bae73400cbddd0b0a9a3d2051e9ab3eae798e476fa4a581e959606eb5e1cac620719f3dfcb248035df04969ceda27a19eb7440527e8c68e0cae7c17e7dff16a62817128d84b6c70a350c829ad15b9a13a1335544893efcdcf3273c85a4c7786ed337880e0abc7b27b8d7883ede6a6d674c8011db42f02e4e2159c7fa657a3a06a68d3119b669204e6b38d9556cb589c331a66763b9b16afca724ccb5e62222c7e792655fd7c4bc48ca501819b6a89da3f23df86ce2f35b554d214853acf70e512b8332a2e4a732e98f0b0209c317ab90362a53245987832152afa7135f3f44495b625c2a00fea666fe5a52869fd56add4669cd4cba10c05afd83d50d0b37dc538293b6a3c8bda0030e2b7ad1cfedecac0b5989fcecb821a9e1f2c4fd39cf3d9149bd835b7328420b5623fd17ad38e1cfb5e3895a5ad09980a59b63132fcd70f3479e550722e80e5855d808e919f5192367e9f2ddf448df0a11608c55f96b39512b4a1cdc6fc6e05c2475c24e9691d34a041b229e86e0634f53215af9b73743cdd9d52d22208a047152a02458ff86c8b30dc5cfcf81651de6a76a55507cda0b24aeaa45a2517f6397fc4211d368cce21443dfed5b4e96cb8a28424c226b4e9e7923f032e8d6086fd87d56847e4c4d95ea0e263219362e7887da3e474c30497b418c80f6914ae0d14144ac443b4f450ba7b452157b42954cdea20da74ae95b639a5cff576febd45633a50e58aa23c14e567e2da17f651b9e3835b2da98c456bf77a36f63fa1dc74d4b04466c1f452987a46ccb0f74cf0e3c4e83f906a5e67d7cd2aac5093f58333fe206ab10a968a7b02e70fb7ba8b2d44b0f21464cff168eca8e987b0d609e4d69c8cc9a7a2800b08d16e5e34252d435cb9c7dfd1e4cd6da0bdb02653f6048ec49260c8a723099788e353e098fbb1a42c9bf944996469be0ed36e342f1321485e2627122f93b65ab2859789e795457e179a8a81737a549c7491ad2792a09dabed1b0e0d1598c3a429148bbc0528f50295ac56715be24e8f405e3cd5fc0058e6101a67bd3f77138b5d5c5821b950dfb4513cb27439f4fadf1357ce580346d1ef234616e99764e49cfc2b1d08d07200136e21e41cdb506bc556f55a3371e880c30d27d35c7c9a348c450bb9056040a605174275bfa3497f386318292ca679a48e7488c6984c2b558c63321a6f850e8d29e4c707649639541dfdd21f7efd64457e1c43e0b5b97b5cc76ec4cc2cd23f0800ffd7a9b145b620e506f8c058353cc9ff3679ab0ac9514fbe9a4e3ab6ab5e51b1d825998bc4c1216d031f9367c7a5f71f6278efee74e9becde825b8a0e0d740524183bd1d94854904ec59dff1c7c4d5c0acb1df309761655b4f6c63fcc5dcc15b065d95b6042eaf8e556b4d8583516e981e949fd9f7f0578bfd236841b714d2d45ce81cb634c2851a724ebf6ec05de9aa7e0aca1a5d4c8900fb707b4e09903723891eaef6170bca2e17a8b01983314fd36198303fa25350fffa69f6d8d16b382c5297a090618a299e53311b958a032338f84d81d4396bce8123a9e0dc31c66adea66b91adc52f1abf669c678c41e50bc9293351969cfe40119489ebcd64a17e4969a934a4b0bd1d6f9ab42460700c4f0503fe9b5d47f0accfbc3beb915a65ec0b413cd3201aa1042e17ca5c3b613432bf7a792554739ac71d2784832522a51929508b2b7a8d6e9456cdc69cfb950958232ee1b08f7ee4ecbcf0559c07f8289c42271f522b70c364ee9211aa406cd014ccfbb6d3445268857e5e23842fe99aa8c17428a7d786a96384d10824c08c65068aa75eef316ec8a88dc1c369751669e861da1e2e99fd96dbb5f809d6d44e832eee20c838b5e1053e3857025bafada67342057fa63d669c12444bc0dacac8ab8e7e62d2920ce19ac759c6766b15944c6693e065112f4da299f9e2cb489db7f2557d7cac7bb7db13387c6dcc44b301f097b74eba1250b53ac264668f412fb6307040c5a2311349343f75b1d37645f5799250cc4ba7f92167a71b55ad9792e22042d853d8fa44e3efc759295a94784e11270012aae0f341c4a87b60cef09adb0588eca8ee43fdc79575526a41d1a1cf8969f069a8ee475e1c7000148a17ea0ea34c001e4b0bc3284c866aeeab768a049ec0178ad0cabcf1fb3f404898d9bbac31febe5298520918d39f2304223826e38fcd9d148f41b6c0f9b5d489413d4b666062fe80d9e3e3c34fcea6212172be3eeacf8174a1f6bceadcd6c460b8a80c998be3d721e876afe27795f18bcdafbab084ca31431e62639be7269f85cb3e812680fec3dd038728231f90fb4cc10b5bc540d4450be1ce736019410fb5939006b9c0b236f3268b776ca1af0fa450850f1efd04753040518b9981772ecbfd1d38839c1d01f42a3af7fc527e80c5d94432ac89bad29853bfcd24761a394371b5799e14df37f7fd8de2814b5a0109d743892bb09f2cca7223d7dbdcb9bbf115fd62c63151be50839ba001df9de3adbdb31c1dfa4e14994bc96ea1b7097c5b063d205564cfe659d253eef01e49b7c38afd22070b707e98009b7218eecfbf7af13905b887c8a3b99b2b5442723997428f4dd410afc71b82703735ef7b58c52786b10cc361e0c2037c50d84540de7b0fc0830206ff900555d70239298919fa2ca4457ef22d9e55491ba99672cf7c09c3729d691df32d6729d12acd5aa375c79b5c360eff330bde15c22784f3a3085131a6587d0056b99a2ce0d1b1362a15990bda11d47a7dea1dc3b046e87319d3c48791ebb1fc165bf63d16ff884d5e18149cc7feb76173ba4dda38cee83d061e7616aa452973a13867313e4c5f563546a7af13c5a261d0823fba4106818b8616f6150e01ebfa2ba11744239076ba2ddd1ecee6d153dff8642502020e4c70931f06bcc18820df3e8784675063a9cf219a24f7a08fd7b24e63f19e3f3caa35efeb302925c2a98878aea2b7354454a62692abb37108f8ba74551fcdee4824193155e9e4c5caf102ab7db976a6ec4978c3a7e30400ba14ba583ad12f71287c1d02f356b2e4f81559e6cf3afccf7fecd916ec68ab8877c21acebd055e631ea730e5c1c323809166fc30ecf3a4810713a19846e13f76cc581380ec6912dcd7cd8b52074c02f65b5ae3839051e1bb5cfacadf22d53ea60c72414c4e007c7ac4410812877cd726a62a187d9e0b4e492e976a271e1d981b22c240771dfae4ed2d5e42996bc4c3e66f07c760041e266e3b082a0d4d377b08fbebb72c99206ba66861097ce733dcd729e81fa4c5c585d0319bc66abf65ae68bdd9863f081ce206517fedc24f5eeedb8fef15c2d4ba14ea2cc373fee1c8b4a9afb42ca8ec046f4e0f76bbf94dc39ed4858b942299038b434ddee02f3c59ad9ad360515f842b7c7570198f1267616fab6db83e0810add95851c3df512c6c6eb4ced6bfce1d1be445379398bb4de32b216c4f54b9020053da45ca053b9e10cdd16b24183dfba497c269010c3988616f83934e456833a5dfabbfd62d8ead83d2c6fe50a000f386f906b341702705d29edb22db90544557c4618aae2ced221a0152c306322956bc8eb182874744fefd24eb8a0645103da1cff559e75d8743f6e9b4b22e1e18862f3c529c87fd2be09e5ed3ed4feedee64bf02bdcb4bb5812bf8c461e718b028900b1c2488970f91a18a2901b0b8c09dec00d4621aa49e6e861f6e633c2875882193e6caf1938f5aa5d9170352d1ad43c8ee35c9d67e02c9b984834e08ab23e32461ae905a7e38cebc688697c0c373c3863a63c702f01d5de286adb0e63f83f1adf44ffdc3041afd34daee954145333c055e7c52a68748321cea8697cf7318396afd2981d0344398fae403146455790bc5e52084451f7c35a48d04106ad59192d299cdf86094fd931b60f6ab7ea0f9bdfa40b71b0b1b12b3217d86953570c3fc469a1353e936f56058d83416f899401b0acea740f4ac0ec14b1e55820a1a5682ba419454237c6ad05bbdd6adf46cb28cb694d75809417c8bdcec116a9aec649004dbd495fc8c23cd7086a742c1dec0ac19f1182749623c1b88cc2a7a5616751f98f81f27db320c1cd71e761804c3f789dba8d06b06e439a8bdeb2fab5231577e44315e4ac71d889af648c1b2df6a8c740b076d3b3579df4d9f321e3fcf760ef40114db2869f43eefad8742e93428584cd1f878c10c1ad81c9ae9585a770493c05c3cd02f28b83c23b9448d79eab5e0a994f0895b807120aa793b00ab9a5c9dbcf876f4580be1cc1426d8452c0ce67dd73456b00ee70041e6f7c53a3c5c95565063b3972e419dc01878421d38ec14311cd60cf7ca7aacec0578a5b86a699ed0cf1c2298cc75ba950ad760ce56e8bf4537a72c1eeafb0d7eea901bc597ea94c5ce2b2c5b9a18f3f3b1daaf6a7799c80995ffa4bc18570030241616c420d856717ccfb55d58e23d6246b4347ed67aae11a117559ddc992a7a1da424b0a456b31e0c23cf20ad2c04fe8454a3a84057bc9f286a9eab937fa3003041b39734a55de1de4fc9106828b414f2484663efb16ef648ff902c5713c9a1a428922251592c949b9c40eb4883394e24c3e63f6ccd090d6886ff857ecb73a67d09983e34ca10ac2e4a6b87b2a7191d37fdc1030fc5d54fa8e8068a06338a982868d4a42333f697c4142f79491b3fd8888f901510354fe5cb136771299ea9e5f6d9cba1c6c5c76cce622e6263e6134172d1b54c151cc7148744438fb2ba4c3297cb0f2b561b282c71b6c6fef520994928c98b9e38a564fa77f8ed60a953def5e33ec2a1bbee76160ac3b1bb350cbda96c20bd738d8672948c01e61cfca6609354f0ab41296cc2d9b254c9834464411de7fe532e1405c8e3180f045c68cfa0623c1a940589f62a50e4f92244649649b0f82c95b006fc364719128c6eb3920b8a78e340a3cf93f1902b67964ae91b58a8d3f2ef7708956c3ba4dc64870584a8001124fc46922c181cb672c2a001fc18b7862db0b96d5de6935fcdb4f2d336f1a3573e340f88f259ac1e648eba9d7bd41ebd1661350d0b34856c73f395bbcfb04c6231c89b754cd1b4b3c224cf419e2483a19504522974d5b5f290e54e96febb6c5589c7273762cd0f7ed0c1a343c5248a9da67b0c65f2bb95bf7c3f8d13bc0811fe100b60368060d9e8ad919e60d6ed4a4e9426176228f811ab8683117b22617ddec846549b8868b6ce0c1f7c944e03eeedbf8c22887556a2161d92a2c9aaefd65d6ae5aff70bc1e08622f413084cca6f237c404d49850ce23e2c7aa8891eef3978bba4f3261457940c80266b15ffb10d01af0aa28d8f123bd5d23ef469e27e10bce72ceadaf9cfe500b2c4696c5fff6592c8b6ca706c16c09c5e70935a0008f0f8484b254fb7032ae0420e5dd1f4a2b1dc64584fbe4b7f50dbdd9878a7bebf5391bf8591d11f35cd7123e387072ab26a73a5001b868dbd194a627ca9a8a0864123fd1f16341310f3109e802d8fe7ea463e442073856f5a50e02601010c9ec331980405e37bce4fb1e4d6c89f9870d37389011557f6d848bba88b5d80379d9209a6f563a621a66e59a5f0fd1b2c44b7d1991792dbc62a34a482d220cf5f4d5adca89ccd2d722190100299a96f7fd398b41f515aa962ae93be67d79b03d54edf1fae8877021b9f6fe265e3fd4d44e36b5f46b2fc444f0e2d5a387de1c4d7f31faddb0cc5257bc0e8fe2f02bd68a4e7f386ad0bd844857804f5d01e22e936728c004dd37146da75c7da206e1ca8f3f64a9e3fa5252438bf5b5fdd047630024a6b878f7be017962581b5c20a4093acd49c68a25bc258a83ce56df8a1aeff6387fc79f4f8c682f2808c36200761bafa147fca96e70c67fc16eb24e7c06db4bf1fb4b1fd775116048c84fa9b63296eacee0ffd61237e3f9116e0905150f88da1217d62295ef638b0d9cc462b70c2ea5076c22b324fb2ddda029885f8da5133c68dc204e471c30d5ad4e93d566f003ce196b377da2f85bd80c6ac43547dd7f647ff0d79699ca22f8334a4a39ef2019b72584741c68c53ca68911bcf76d36358fbca95ff62b2041f8852d73caf221f1fbc4b3a48edcef1010337127675d1d58d8c9b26fe46b849a7e897d03e5d64f39d72c2ce41fb0f70d3890df7b40b9e7a61144490c0442f57517d2f2d87e15598c8c0c8beaaf6e53fe60a7400354172dd9660ec0551f054c997d38296da2e3b20059ae824aadde175d45778910d525dd3efda0bda21c648b611701531e47c79d9b209a330d7216b507b9545ccf8563b62ac5435fe26bf60d962a669c98ecdf1fe6beec3d209af6b2ba0704c6113e6f44b19868dc85bf95ef4b4a0c7bf85a884bc5febf820554d817193e2ecbf98561cb82dfb3418f8a31d03c1058a034fe53baaee4c53a1e9e039fa3538140747108ec4420c249ed1d83bf9d6848e688788b682627cc3dccaeee41cb6fc842e950a65cec9752b4603a3e66ed5dad9c9808e32307c5455a35b085f9d42f4a7497b6517db6bb3cc922af8b0e122105cf20c80b2dbccdc3b883b2bb6f868291c64b4a43397085fc2273abc9ee7c0ee6fa7ba0625f4cba653739a8199f4997146b6a65fb49c8a3f46d585bf66d7d5be5ad4d88051b815195dbbb7096e66fb128242d69a9301326dbf4e91f2f699986008bc036efee33ed83d459d28083311610824564b342c413e5d4565ab5b58acdc013788e112b34b02274302aa857bd9ef4cbb9646265269b14e3df1eb1d9620f5d70556930176844390c0598fa8e3d2de8ad92fc4663c9d94caa87ea5f339f58b42875e99a27814e2a858ae119a0b2164576c83fc03c308f0eefe3985873a571972d9107bec267dd63ebc3a37d0b856f5d981a7b40a7c35a8db69f5a684149d6387eaa84989c2f0cb1313810f3743c07a68fd61f773153fb0454a40ef321e09274389f801689c37d04bc48eab06c4c24e04ffd433e30dd296e7353c53198d88c2fbd6d525b48333c5d7a9852bdc22529171695d4274aadb45b96842859eaa502b521423f543c93eaebf0320b07ade8d01814678e933738341e8ac52bab717ddc9dc41de9d925f7a8e8d13a9cbe35b1b3c221266e40b0e4f4e935a06a703ae9ef33ba1a4d0092e5a897c550feb64a219c24ebcf9257db40fef11e78dbfa359ece808a8b1c7af4159df83060b56a2b256733f90724c69873a0da75650bd8dba494df53ae3db6c4be35a298c165123b56d2793dd34c8f00adee5c0cf961a79f43cd6ca2cc3d08732584b409b2a40373380a51e11abe372838723f61cb3ea041cd1f1066b76245cff405a299bc217db4326080621dc9ca13ccefb3e16165810b4a33b5f409d0138c2bec671267e061a9478d94d55938367cda09be11682023a26811634f9aca8a3c1c8f001b607b1f7cc20f5e51be272c531ca07cb5fd53e20df76b0a7f7c9d6af98c62e35af47ba2e518b4a98f5b791a7d40b1f343295fe284838ed63333f65d18c6d396b103223a0c031d30e056ff63a15eaab9df7aa57a2976ec6fbf6d87c435015e2470f5c73c5fd223d01e8e2f0015e18302629284618244203514c6725792e5a3b5ff224373a64e5edf928e0a7222b76f655fd010982b6f7d233d16555aef0d1f1a40c554901ba9724278694a37ae8e0e4221d9c6546b962cfeaf2010154b5a93f8aec80e51d12e861634d28ee7901cfa58a48346138d832bde037adc65bfbac08dcb46372e17cee5ae696da83a66fc69c04a5c0944034c5fd2627237423d17ff5d6d50b0d5680d59f1445cfaeba7d2e7b277c29dbc79537e1ccae4d927a55e45aec39a9020442972d6fb0a184766319d348f026c4b1b893aeb38a762d6286218064765f455a7774cae350c7a5fa55f843f9f93e9e84355199ee7a156814b8dc9cea6a783d244d4a4132207198f945c347acb755dac70d3179f55681324bc58bd7e3a4612c4c1c1cd0d4116c2d169587447d0d14979a81bcdd8f7cadc158b0a5e81544e0d5810c4ff2ccd51811a8bd963ff5c89e5a063d44622da3d9e33d4e105a21dc3a10bd7653194881e1355836b5db700e42c616b62acff95cbdfbb77ca996066060e0e5edb96d10b21e31c71a08e3018b8108f81eb55771b6af7edc4653278037557e2b838a85615f8324c36fd2af3ecbc7b51ccaa479341e1563e8f9785c9f5e122a6c691a38e135daf962352f2a81e1f8696a4f72d89a41650ff8d36c29367ceedbc674324b53ece9bcb0d3da8420a5b8fc33ecfcfc3b03fb5df5148951b5076f7753b7c69f5e44a2081aab06063f6c22a5d71d0c71f245b10b0477b1751e097600c609d022ec5252d5a1e54ff870af74e6664104766407fd04c3905a88200db27f9d256292450412c8487c5608dd68886936fcd7d6f50808727929a1c5e43c05598147e9abbaf6a628f6e2af831e5c141b0ec0613c80697e3b2892bddbc709274eeb4b2d05ba3c3352abcb3fc60c4d2683f6cc772aa3a8d60c97304c37d64d3e619d5a3a490182a350358d449e2a141f935194ef29388ac96e41e2f1753d38542a763631e8116679ed44cc1fd95dabaa9739188dc04113dabd3bc8a7b2c90282ea8393031641cc86e05cac52758e48ab6f0b95d4a58f59d8b06f546c2b814fb531e64259574feced95dbff2fa8f17746100c359eea8e32f8ba7463bb8c40904fdd646375c81682178b8cb53145d845f0f394563aed38aca03330669104ed642679f09bd2515d15c2091808d47c82c741e70560eaab1c25179d9c2b690cb1ad6f35a50f80ab4202571443270d74f653549c9f8aa55267130548081cdf575d24c860fd046fdcd8e224170d2ad0bcc5f6f227301757361a98d1ce38855781a36a3075220288918bdd004dc25912996529875da24ee3d3bec190c4c2f8dec4cbdc7012bf9895f3350dcf9ce741b0e4c7885c8202d248ce9fc328c69e0d110aedbb5c8421a729d78278dad99c7c9c55cecec5ecff3ded1400e76bd31b0ee3c28c65088b915ada4698ae402b9eefd66a36b0a6edd3c7ae80349ec752d72c6e42949d0c6341de647f80da5191131436d63596274567b9f67abbf8703af4eaa74b7713e5b44f709aba6713d66e05d2c7e6607be4cea68b70dad796f449c6375b321c4b40aa74d90c66dcf5cedddf09b4b4a99c46f96463d06a88cd22aa9f39567e7a43490e11ebf4df2ea1ede19818772135ba116a68328a354fdda9511f2992406fc6a45b0bf524ee311a985621abfef69a22f5288b11e403b361c4d96c76434ed3c37ebda47e7965138b59aaaea3393948174a94f9dcbe929c5365b69825c265d2aa8a1fb9d27eba4731b976e50846e4dc63c504092202bf5197b1887deca8e245e545c25a580d3ed3e8a685cb8baed90a98cec1c9a0a5a5afa2c82613dae1de966c3413ea3ab365ba56e24bc9ede4f10da4c3e36c551a4e44afdc8330d7c49442512d5f92a3dde31b5b50b1a7906c6863d638284e15cfc65b6dd0f90e60b070b365f8f243bb4488fdc1cddc8fc0dd3b7be77721169af978daf025d08833a015537af9fa064c818fc71c31a4fbc3f3e812baf6b762810ef27312fae3f4603f67eb4b57875427881a777869f3936d5b02e9e183a1576fa94a6b20f62bb792607fbd583dc651c1b3d13a5ff2df03833a7df160119754536f670332e685f16923a80a331960b24d3051fb9a0a266a328ae3ac0e08d11dac003d208fb4184724a9baae257234bd220d2621ac521321b98e2248a47e18939c807f186684162aa7efc5eab698afaf91cf334c3cc0f051e7c5904e0dcb143b11eedcb4d9f7ab86203678c2dc72002c121d4221c64977a89e0a446a9648a7f90a06183e28a2c0c144a9cf6cc914d196050c7ed8cb9f5042ee139f0655ee0421a2ca26ed2d500217d28ca6a90bd944b4f7e0a31563e966e80f4aa53cbc7019f8bf7dcf29be998ad1ca09761eb9c79f58d9dd625171985518cf3db50d65b8996c4fe8d2eb8529f3371a79d9f8895948facebd9a3b5cdd88ad06e85f526aab047f87708ef1e7e2ce067593f0c82291a66f4b84aa9302fae58b34e2976cac774a44faf544ea3926219e3f7c6881ee7959803d20d29111f88b43e44ed83bdab1ead5d0c500fa43b6f2d3349489a0a3294e1585f68ee401b1fe90bb139f12ac81a1bfa62d3a2f2c33894bd982ce6960179ca70895fb9d2439360274b86869860208531fd934963e6296e52003051bde51755eff71ac318e18ab146a418e3af4304a3d145c46865591e4e0923095ca8ea0b4853d5ef42339483b942f2a488922af87193839e56ca4aa7505aace10f00a7d8e1d200d065b5dbc7d72b960e6345fc3492b6a1d3be61d21d9c122d2bd00deb33b92a969cdda1c358ebf525aed47bcb33c051f7ffd4313696cbec30068bcc8a08068b1e0086c3d89637af00419c58e62641cf2894a60f62e80b63f20ba12617ec0b6319978df99da3141863d8f0b52244743ae5d452d02e62f6310f2bb114152c38e8328ce5824c919a392f45c1554aeb8d202bc998536e0f782a2c42aa4e69cad043d8ac712ce451732842b9331d7d7ef4454c9f5a1316913d564f83ce1069645032439e61c16d0c0586d2182697a569d79faf11f10b3d57f20313b97e0493f95d6943b6712767d03434da304a60e1fe0b75f7130d0ebbfe337cc23b326bca150e010bab1ebe15b10d94f7d8669dea3973245881fe1380f7d06191ea5574284d4e8e925e32458763a6698d995542f0982dc4b16af72788370a7e854ae100202464b2579685349d75c727d4cedbfbc0347268c3afc39a398a74cc559fef661b347d2ac084748c32bebf40f0b3a13297fcce3201e9beed780c1e34523627d8e34ebb84111f7a23a6a41afe61eed4a2c111e66f55c21cc80dfdd50a6ed94b8fb7397464fc9317a63eab84fb9da15bd73261ba95a6dcd7853e6f9bb7cfad218c38d8d0dac2f5e72686d39c8eea280dea3e53da44c6fd500abef8f00149c24ab6fbc85afe6267851b6ce039f2b677bf08b6345c6a8962ef14c31515c6e66bcf9171acf37c45b76aa61450f19a8e157e01bd6c848213f65eddc062608545ef78273b4421c14815fea338f1af204a7546b5a796040f5a9988226ac67a24d44d1ace7a1dc6ab07b1fb2821fee0d8bc41ddfe6269470c1928dcaf8dfd5118aaca94ccafc248e574451e04da91ecaecc63a402e626463153795dea2f0202ad662619ca869f8d033a4fc3587412aea64522eaf4b0ac5f10d1996fa99b548a9bd77813bfa30879eb92ed0fe41da28c377ad4c91a05ed137431002aea782c2f7f5c2eb7a155881241a66ed0e1861522a3c94ca7f506d1d3d6b7794182f151e5769646d590b76b71979444c50c728d614015782039236fc837d69e70473f948105bd32d0b0a19b80607ae1e320fe7a72fb07da692a6a3880628433510d6f1e4454dd8715f3df5d66c4a7067caff43fec174302a1125a077f08a078ca8324a9019cde67ab044fae08a384d36c0242a601f2326fcb800bae754c29612556f4606d13ab2993b92f1757459b31afc6723c606082aa1f84d7d44536da99677c192a160804ec50249d63fb1beced58c7e742ab7a630ee0c939168ee08acd7578d36e701b130798ebe45b3c090e201b26b120992859715ac8b653a5e5e7e5da26e76c4be23cfc5b4cdc4ed113fc0d5abd6fda26099f0e17f08645d137c622b9b53a42fccc11b39ae571226c683c0bbf1a41911b6c25e38aceb2347adaad81682ac0f303035e7806dcb849f9e822cfcc50086ae726cad351ac0c2d7bc2e6842bdba3cacf3aba48d8c607a3af5629c73afdc921c23c832c29333255ff55e435afa5bf96b51c09b6f2ce5eb83c2dd50ee07fed1bbb7dae1ab5f02e841fcf4b896ac84956983071f7bb1201b39e7584616b37c8f7c68386f07dab79f46eb9680f1ea76cdedf08714b2c6c25d569aebe9b82da7331ad22b24a1bb74d8f645b6ff5b6202bb4165a806c82041463030ae22296551058c9481d92c94baafdde08f1f6197c7842891a605fa621f684b0c8bcfa7372e0a52357293091689cecc1fd51bffe60dda2fe3994dba4eac3e87e89ee33edeb9923bd25782361cac1b5ae11b24bc8de5bca94920c2b098c090a094d5976ca4a6d847fcb9a9a9b93b019f80059494214a40043d65f43e4a492990ca07022cb14429882acbf46a866688b22287456fd80da379d9c61c759cfe333b670d103f14ea027b8a017874e1b5cd6e5332effcfb410f3e733a58fd2a685eb0ec6146396a145003edd590a4f3901dd2007d79ffa7b3f495cff90f543e5faff8fd1f51f714083eb4f43bbfe384386aebf9133ee04da620ad7bf061c5a70fd7390e27a0ea270fd79a072fd7946ebb90e94e5e83a10d00fae3f10175138eb38572a21df097a5d74f982063c4708c21062f084095484e00407542001842e5a9cbe415067891798518511da184211bc9059000c2550390a1222083990b9af71dd882ba9eb6fc41f499354e6202529187a255a72d648e336b7b9fb38d94272fad29fc4925b2365fb5c8f6fd70b69618b7b1d990b35711dd91045c295996ccaaef0118779ff395790f8839f730549e9fd73ae20f9bef4a298330409f82de6d038cc7b507431a724e6fc27facfff949534a59fb2f6fca7acc51627e2d0a3f7a6a22b645871456d3693e5e030ef4b6c847f4bffb99e9724ca0e948842118eca1872f2863498d07386135692900499f7fee3bd0779ef960787794cbb9ef74c1b7218927abbdefb7bfec3c96a1127e50bbb08f93f1d7a64ce61fe60d506b48c39efc8e77c9ee56c2ba7d5ef794f1273a6c33cf11de69fa323d361a59c08a9989a3fbc13bdeff73cafa76cf2cd7dbe39537a439abd396e82f3a320ed00d85a6b58ad507aacf558ad481182154558d69d5beb57212e15efbb296d006f87a763ddd7af424c2113d6d55affa44558bfdfebda44a41377a83db6b86aab4a7c21e09f2cbeb55d9c160694d0a53df2f56e37097577bf0b3fb7db8588d035202dba349016426d6ae7b6f30a418d707e15c2d29d405a04714b9a176461f4248b343c2cb23002a501ebbd520d6a204447d3238e4d8b38596469d8044396851824560d5c703d4fe679cff23ccff33c2a0d9b563c2c0d9b178b86cd5bb2faa11851b5e89c38a156d438356a8e854f6dc293bea2889ee1846d30e4b0e9d1a00c2852286a0c6f895a0e6e493354b3c2752710952556f095def4d1e37cd8fd71cb560c7785fb3173f7e83070dad2bd54bd012ea371582b06bef6f2b84c5d08ea739ce971fae0a6c1714acbbeac444829a594d249bb21973b8b9952cff1059dce82cef3ca03cab937d7b5d7d9be9eed39721d47ebfb7cdc4ebb12c92bd9d00a7974ce91be376d5a2b07821cb57d3b77e7c45929a5940b57a2a477da799de9086b07244aa2d4eb97bc39312475d8813170a297c30bdaee95d236463ad239368cbfa7153ff8c099c26df206ae95f8c0d4465efb68d2d5307e7675aedb953357b471bba7dd7b3cb8dd871d166864d133ee84a58b65fc738cb0f42e83975b5deee710977bca0159a1e55ee173399657291940b8a5eb9633318f7e28e5529f255c6a031c540134d2d9ac7b3a1b805780aa68e2767b3320628acf0b3d300c729d0b1361e9ad585c031cdc7edab19a36be52c97a3743a985de9768e89ec661a4671cb809cd85b6c0a4124e9172496fa4490f0d6f3e618d70882491e69cf554c5f4f4d2beff7eca482d1abaff3a1c2c309ff43c05d5338514e092fe024c7a1346fa70092c285cd24f9e5d2ee9394b337fd8e930ce248e0e234111fef8dd3943129384b35a45c72ef0e93911078775cf893938ac7b1d59199278e6e4d36a1dc3e9b69e4f8fddd7893cebf0b6652cdd7f27cb529e14a186d338b77b9550e85f7a27cb2d80c2884856556184dd908675ef7961d8c930a6e04a3f278eef648b06eeeb57314747c689efb0ae1444487adbdda6fcae825b125347843a321d597f592f3f7d7f8fbb4a9cacdf3d0ee534ba1d11bde0b7a9b4c30c35f4d83de98bf87f4f6fbdd3148377250a6e97c43999859009b34099dcf9ff7ddb24fde0936c0b0652d982a12be9752e35c1d0e29c233f28962888812f35bd406f3f35c140fd7ec9d2f748469acc1fdd774f6492fcc38475dfb95e5e4ca6ee87e822f437958c088b74debde785218bf5df3d8d9353d6751dcf7aec721071e8b1eb3afef9aaa0748c1176b78e3142dea1fb25dee5de6f7f01aeff57aab1ffd8a3531c920b4686786ed3428f2d1328862d1a4c0f9a4496ccc8901e15d0a42789495a317ca0e4e1927efeb00906d22589ad1892b46228fdf79f98847e499c2189e395a14777c11ee91b7fce9fc80ce238b59fe23839c461ee857efd43bf435ab0e9d106c5b171eb919b166c4dceb6e6d3b86d4dd690b0458f45534584fdf305f6f9ad2a435f5e41ed36f12236a85cfa3e705a505dfa2e1ca93dc12e7ce8b95dc5db38ba2d7ae19d5cb4c1e44ed30b3c2945e29b33336485dcb953caea719668613fdb4f9cb624aea808e77fcc3dbbbb338ac4e86e22a9e10631a61873ce793a9d4ccfb326e7126ab3d98c89952d4e0517b7042fef5081c57bd8763251a029b8f4151388063cd7697cdae0d0f4382d921ebd825fe9733c8ef73aaefde79734a527617fc3fcbd6e6f3244c8349e75119a40aba4471d72e8b1f2f0d570c32722297d5d92b3850b2a7563f534a44139596ec243c5720f5b71d2e74d85f4869388640bad01c512c3a74f7a4258f28c5a2437f4c83c1d3ba1ac742cf54ee36c4d5649c7544fdfb4529d2cca3215cb3d4ce324d32e0a87b24c62584e2d3974cc4441ef88f0758828a38725ce48a20a279e20739d2b435c0411842600413185cc9f67fe4cf3ef1e098ebfd28fe37564396cebc8cbbf88392c7b791d1937611a941eb9c63b96797ad88ae54c3c2b4921546909e79734acea97a1522d2cc3fe90e546fc478751ff77986db9f802bd38b724059596b0f4524580538877f0f57fbde389198871e777cca90a66977bb6ddfd9da48d42069778b40c43ea811e16be957a1dab262295ef0907ae9222acb5d64a1269d775f48d1092c4d29b73726db06353f4f9149c272ec2923d4a297b9198eb711176efdd338908e9698be78ff97cbdfb5af66d75af733bb1e42f0ab9ff1f84dc7fecb34f2506ae27d6fa3aa5f74521fd1f84f454320a396e82420841a7b336c7712619b8bb03ee3aeecbf99ed889b45c32271512ce1f94521aa64179ea901262757975993e81fa64ca62c9ccf468a80be93bf50ecb0d3242ae6ea9957e92a662f930a1e82223e4075b3ea4adf8ca597a5fb6f8bed40f67f3948e48431e969b65fe981cd7ea163a837ce67a602523d4f2f2a1c2940ac717a6502a1c6aa88103871a38546aac56ab1b3f553f552f375662c9f7c67c9a0a516a7c6a74df8a0621aca763dff7c3acc06c302c1df39f2e7ea15debfacf41efb37e4db68a8e775bc5b5a5a847dacb74ecb8f5d85af8fb18a4263bdada0a189cc1d34596c354e25c28d44bf9cf64329d2eea82360017480fecaa80f888406c3dba5ea686c854e2fa5746b5d660a9c1d231d3f7d7f8985c6f927953cc9b4c2613653ddde28c1e6830c1c749d7fbb833b3db2012547a4093b1e6185c6ac4a819aa11eab15f05147a9517f89d038fd5904eff63680a317d9099c5119a3ffa6b723063353f1deb5fc1d88c1afc611267663d66a38de6a48c381de6ef0a4387d17c6636a477dc76dcbc30dc71f341e87d5923f4b2aa11aa4cec8d9511aca732b9b57c8172fb53218a033fdb17c8cfed1fd2406c3d120182a547715a6a4638af03c9721b0816730671812c0738250d2aa03193b15e475623d43117a363a8a18e9d64f806ac0567c158f0156c05db807db80aae01d380b130153c039682af70141c03aec24e7013fc026682976025380966011fc12be02298081e8285e0270c04ffc03e30139d14a0c0042518810842f03b2c21010f27c85101cfb8076ec24e98c64130148ec2353682a53012bcc32de029ec02e6611830157e827b180ab6f2fd38434eb20cbe1fe7e624dbbe1f87c8499ee2fb718a708c643b33a4daadd971fbaf7a6daeb376a72033be8105c1cb7cc0033a24293b90030736a0810c3c536131f03c858d799e81bdc0b3cd8acf52580b3ccbc0ee78be627178b662679ea3b0157886c2f2788e81a5c0738f5de1b98a9dc0f313b6c7b313f686672a767c6ec24ae0190616f6fc026bc3338f05c033133602cf2eb0aee7256c0dcf536c009e95b010786e81f5f19c84a5e179c7fe7866817dc0331216c8f31116c9b3141be47905d601cf46589ae7226c039e6b5600cf4458063c47b103781ec21e7986626b9e85b0333c07616d9e9fd8053cd3eccd33105601cf4e6cecf9072bc373134b3efb606378eec1e23c33b109789e5902bc8e85e15560857c0aac91cfb12c3c0a6c913f816de14d605f781e6c01be0496c893c01ae047605df825f6002f028b80dfc10ef91058d9bfbdef16754d36007ec40d5683d17a84f5f00dac92672d2c089eb3b01f78c6c27ae0f90aabc3b31536c9b30d6cf9ec633bf05c85cde1b9069603cf34b01b78c66235f02f1bf34c85cdc0f314567c9e81c5c0b3cdee7896c25ee0590676e6f98ab5c0b315cbe3390a8bc333147685e718d80a3cf7d81ecf552c059e9fb0e3b3137602cf542cecb9097bc3330c2c009e5f6025f0cc635dcf4c581b9e5d6003f0bc848dc0f314ebe359095bc3730bec8fe7242c049e772c906716581a9e91b0419e8fb00f789662699e5760913c1b6105f05c8475c073cd0ee09908db80e728b6e67908cb806728d6e659087be439087bf3fcc4cef04cb3b16720ec029e9d58f2f907ab80e72616e7d9072bc3730f9600cf4c6c0ccf332be4756c025e0596854f8185e1736c0b8f026be44f600bf026b0459e076b802f817de149600ff023b0447e891df222b02efc0ef67e082c02feadec4d167661507a6c584d84d176fcdc7ed516a107d9e920b3204d82d4fcf4efb839f93b86760839f9aaf9b9dde64129212c61a894416657c983e03ff01ef8fe9a222775f8fe1a2327937cbfcdccc9f2fb6d684e76e0fb6d6a4ee6f0fd363b4e72e0fb6d789cdcc0f7dbf438a981efb7b1399981efb7f1711203df6ff3e3e405bedf26c8490b7cbf8d9093387cbfcd909315f87e9b9b9314f87e1b222727f0fd36454edef0fd36464e4ae0fb6f664edaf0fd37342723f0fd3735276bf8fe9b1d2721f0fd373c4ed2f0fd373d4e3ee0fb6f6c4e22f9fe1b1f271df0fd373f4e36e0fb6f829c64c0f7df083979e4fb6f869c9ce1fb6f6e4e2ee0fb6f889c54c0f7df143929c3f7df183919c3f7c7664e26e0fb63342761f8fe58cd4923df1fdb71b2c8f7c7789c7ce1fb633d4e12f9fe98cd4917be3fe6e32402be3ff6e3a4ecfb63414edeef8f093939e4fb63434e1ee0fb6337270df0fd3122270bf0fdb122275bf8fe9891932c7c3f397352c8f793342709f0fd64cd499cef27779c24bf9fe47132f6fd648f9337df4fda9cb4f97ed2c7c99aef277f9c1cc0f793414e0ae0fb49212769be9f1c7232c8f7933727817c3f49e4e48fef278b9cf4f1fda491930170d22536f181db905db1df8f43731200df8f537312f6fd383b4e8edf8fc3e3648fefc7e9717285efc7b139c9e3fb717c9c9cf97e9c1f27777c3f4e9093e2f7e3083919f3fd3054607afcf5ffeeee5e24e6ea6899fee51f6661fd4bcc99398052048f8cf56e91e478979833d1604296c3a4c4d608d50cd5dc6a886a8a6a8c6c6636349b9acd8e0d8f4d8f8dcdc6c7e6c726c846c866c8e66643645364637433bba1ddd46e766e786e7a6e6c373e373f37413742374337b71ba29ba21ba3d82c468bd5623b319e584fcc16f389fdc4826242b1a1d82d46142b8a1991339246d6c81d9287ec216da40ff943069142e410792389c822d208878653c3d9c1e1c1e9c1b1e1f8e0fce004e1085571bd1571660eebd7fd1a5462616c20b0303e1fb0303f1eb030413a5818a1241666a8b430b70e5818a21c2c4c11072c8cd1066c6ba601dba265c0b66a18b0ad9d0bd8168f056cab0707dbb255c0b67c28605b3f13b0ada01b6c4b4802b63564836ddd22605b4435d85611046ccb8806eb9a3dc0ba6848acabe600ebda698075f130c0ba7a8e58976d06ebf2598075fd28c0ba8264b02ea118ac6b2801d67583c1ba888c58575111eb327ac1be6644ec8be6827dd510605f3b32fbe2b9f6d533c4be6c07b02f1f03d8d74f01ec2ba805fb1262c1be8684d8d78d00f685635fa47dc56ccc8d8db1b131353666003646003686c6c604b1313e0eeb0762637e1cd6ffc3c604f9b03101b031430eeb07808d81d998d1c618f5b0322b58191e56a63663657664781cd62f5a999e26aef741053359cc5b3b67cdf74e6864730a00fc9823cc1b931873ab118a094d01744c680a317d3fce6c0a79ddfe174258c27a7cf4cc1ffde365616a6f6166306e61767a5c19c17a62ce2863cc98dd7e528d508973541280767b8b246e109edbafa32789b00462330262e358cfb9dec5b22d24ac77bd8be572b1accbba7e9a8a904146ad4d90b245901721eb4b5411aaa844c4b238430e2b11c9c4bc58a5a052d0ab14540a22239c406c4ed60835ac6b80d86acae8187d1d406c3565a87c107a73d37a947967c9c4bc587c5f9af4d8a2518fab231b5aef7a92c90698cf21b690e49863a021cbf13a32976d21713deb59620e23f1022a6632d7ebc83e1518a17f59636ef3c72df45bc2d8ee508f5d2334c473e0cc563be1cac8c9d7b356462ba3fb126b841ad6eff23c569843ac11ba355b546284f39635957bca72cc4ab21b2287f5c3d85949765323a4c3860d0b3c4371939c1c1e4f7ba88dfad029d40ac542850789ed918e8162a5355aa352e88e4849e08e2fb9599b660841f053431c14921427e96ce648f7e0d797a163a138c3e3bb194b69b4498f1da3b51ea508bd77fd8b23d176381eaea735e5568e0acc975c8d9372eb8b2028260127732e76cfc3f64f6769d8104be11a43a1b3193187d68e6a1da3b5e8ebbed5dff85a54ea6a11c9feefb0466262fe49e273b32984395ac7feeb7350266a9ea66992359086f458a5ecccbc9024be486bae2fb9d950496bdc131a0c4c8ba3c190c452e655f3c6d8795f365cc1e8b0bcc3cdb8d91ca2dc8cda925e954dd9257c43b106af28b1f44e62190eddfa469c04b9c47537b1c722a4b0e04a661fee198b23a0a01b50175c80bab88553743fb7be4e3130dd2622ffdfeb14b312cb317c8fe52fb1f47c4aaa3b3de8d62f61a610b739d9e3eb37cdc91e62bd951eeccbb064c1c49bc39ae6b03927dfd7ab3fee9be0e8248cf5377ebaea6196272c357fb00e6a422397d8017440c4d1fc3a902d5fb771339dd1c97a6b6ed6b193887a3da75e747d8d7989e2d7a7fadf0e29afd7eb5f5b3eb6af18f105fed7bf446a32322f9f7e8833f311664c7cd497d58c5b2b1aae2f6b135a5fd627c4525f5629dcbac6ad3d6c932baf77f2b21ead8ff9d37f2570c7a41e18ae58ae9fa91c18ae58ae9fdde95f7f3a75fb70b55aad96f84af2fa15335790ba5aa9d7c875e18af51d48c4b5f0f5164b9a5bea30f33a9d4e9f7a8ef9934802beaf5ffd90d6d263f55bc75e627912c5a8ef657cee3f84e528dad57f319463786571e6c88fa2ae56ea755365fc1e96f6b2f1bf708ab074a2eb443d56e6cf69883a765a892d5c7ed4cf1d5b168ccb9fb2738ea315e3f27b261974eeebe74b9c3d9efef42b1bbac3c9927002795174cb4a44b465027941746fad5bf8c52f3e3dbd27b154c19d3df29f5a5f6f4d3ac6e2cf29fe9ce115c53fd99648d3e34974317aac618fb5fef452e14fa02f66b774a21b91185b3a564bd76254d4313ab2563deef894add2e3457b5bc23746f432b4d01c563fbc219621cfadaf124b560ff1e56274ac3e8b15d2d8f4daf1fef1ec52618f586efd2a3d66fe9e17862cd6ff38eeb04237dc740044d17d3d8faf9f1dbee8eb5f3fa710efbe9e762ce65f3f4d445e7647135e8fb55672247bbc1339398adf50f86e22f2ef3666c1f5f57d8a2984bfbe5331633bbe7af7251412f325ebbe4cd8eb5f7e87f539bede65e70cf2fa18fbfa31c77d7d0fd47d3d5b53cc0fe9962d5befe2f19a01fa82cb453dbfd0e5fffba1c215565861058e078f5f616686134bbe9c8a79bd5e33a0fe2592806f8c58f29f3e894b7ceea4746cc7d7ef769aecf1f5737cbd692112adcbfaadc7fa3d60463dd65fc1f2110fdbb3b0a6a80f23058232317f280b28117446672e179db9e8cc652af27786cebceb7dc78e97a53dbe5eff97cee88c36a1b41871f6f8124b1dc093fd1950cf2209f885138eaf5b8a3af6e232e4b02aba2c17cd58e6d281effad3d777a9c01def127730094b96dfbc0c1538f680d52fab9330b19e3161f56b6d63679c42edf610d3a0dd7ae320f5cbbe1309f347fd7a7bbde7bdfef545fe32055f1ef3c2e97730094bd6d03d89494ebf842fea93f812be5e468ff599857967adaedfd2637dd6974d7bd916622cce90585de2d8637dd159c762de891c563f15746fbcea9dc845f4b2326f6162c47aebb186fc325f56d397f5566f554b25ea98cc161d3a7eb68eb7b489a5b41e6bc97473d26d0eabefc588a577125f371991cebcff2a1afc3cc3ebf9e9ad63315fbf6ae918517dce14c3ebd91563e7cb5212f0758965ebbd0b73a39765cb9905872d592f76876e654b7a4365cb558ace6efdd02ee18b125d3dd66755b1bec9dad0d89cf442b7b98dc78e8ddd8fd83226422e2197395372b43bbb7025f587f49037adde6e444445456c744b8ff2d0b08b104a8f5eebd19d367ff80c2da547efd92d290f035c56c55aa44658b6142aa5779ce3711f30a5ed8145f8667f5fc82cbad7eab53a0dad1cd7d5ca51cea320cff5ef56ab9075f33c0fec71b9584fc422f9cef5063d2fbd304bf881619630ec22acd54da169559f1514863dd23f816196f0f35033a8d1072a0c5329774a398ee338a72e963a70b6cbf1cb261ae19b33dd9f8008671d99e6fef0968675397a5c6e3f89893ca8c9cae3593a46f23c4bb5551eaf3d93acbca5c98a8524569b83f165b5f99ca4da89d5566dee59aa8fadda2a96ead379dc2de14bcd20240175f1e38379aac048483185b6c1d0388c0dff828eaf28dbd74d45faa2beb37d3f063fd47b8fb2dd45d1af826d2ae217c77bb67e67e9a3acdfdbc481871e43c792d2429412f9e653886d3e3d7e29ce964a31e14971362c3e3e58343798e26ca9d424024f8ab361f131c2c257b690a1988af8a752aa2e21e9556c842f70cf508cf4d8cfe1f8fed9b1d22be138d231771cd60651494bf1ae75ac6ffff0b3858d9ad03aa6ea9d265bd65fa90bb1188ca5c9edaea264499b88d47ae4a163ad18441efa6b15f966f20f6d0b86f069f83ab7e2f011494e085968a8c71bebf3293d86e09dd94fb5d62f0111e690822b391e46cc8106986f7d4bccd191c18838b0deaddfcf27b7e378bf385862ea88d0f5af2f4710c733955ffd4bb53844cf4958726d480d386ec3175b8c643043bcbe5823b5ee1bb556d53a25d6ae37d1ad47551721f73766a64a5851c30d2ff83dd263f70194a0f170a29225f3824618cb1127f9e6b07ecf33b158e37844c9c9c43e6c8369d130a44d34e07c9b90c49011852c46a47158fb35896508cea01de845d27a183187d500428b91ac258e0ef344ae31ee27fb7bbd43fad623518f5ba4d02a2d61c9362cb68ef9df8afad9a89f6fad181a86fc34d1801323e6f420420623d23892e9451722cc64303fa43f989c9c2420115424837997cd39c1195064adffb8f2ad4996a2635c7ad6507a0a49b9dd4d6e37ed76d76e57ea47fa91f4d7408595db30eeee34d49d28c85a3f4d487c0a1a55d464300ff353d67a99eb590e6b16abfff6cd99726e5174f96556b4325a1dbdcc3a76fa7e22a8ffa6a9c8e7b6acb52042ff2c5fb79e19f724bae6145a60c6cce463d883b0ac11c299e1084d21df376d1d3d302f5bcc6dce1f253d41d12dbdd7a1d6aee95405c7bb5808638a9fcf8910c77b5f23d4b17266767158182c0debf7ee3479228cadb4860e5b184f58c1c44a162f2cb0d30411c6f062065164105290424f95279ca0e25e99c0445cb8a860d0461bac92bb3be5bace6bef6ee642382ee949c85f76b392139250edb88e15c56975afac369490724a29a5eeed0aef0c39cb61b151a7a499ad39ca962e51dc7ddcc6cd6ac7755dad5d9c823cbeea708236f728c24a29a5d49da31c75ef2e51d4b055aeebda70ea1ec4711b570475e9d2a54b972e349572335d386fd1698ca01c89cbd2b07602edc2755cd0aa4bf863e43c9ed32ea8ebb82ed48b36acb4d16588cf796a1b2a26427e8fa406a9a446c9054b4c51a20549eca85810f223b1521d81a38b4a8a6a052a235445a86a2a225451427ed510323231930a1b6cb02ac7061421b041041b58a488d8c246c416518e88a094d6181c516ef2ac8e88705279e611115eb0f1051b457c717474747474548f2a1bf42913520c7e7a7e7a7e7a7e7a7e7a7eba2fa21cede00b31ca110f1b57d8887214e5288a4a881b6ca882604141f544455301a172a2fa41d544e583aa071513d5ecc651aa8d141ba92aa48e5254487549ad9132f2f03bc0fa71b27a15b7d471c3d6b2ca12620c5514ac345835ee87fbe17eb81f77a12a525970361297852a8a5a2ba555ee8724c4fd90846e5711e459d598509e66d528902a8a1b552847b7bd3c14af71b5971390935c6bacb1866b8d35d60082c7e572d9db216d922c65caed97e2b1c22a84cc47aa2868dc8f0ea4ac9c4789cf45e99c734ed7f567f9cfd10647e6ba4853851e526ab88eeb39c9aa02989242c85c87c37b19595108f9cb192fc52515851414524f4815a5d208f9534e483521b525c504cf756facf102a69610f2a7d0c801a68842fe993a23a584903f65464a4b2a0921bfeb44a36045f7b0802e680cc10a2e4e907146b7042178b32767dc7002842e5d8b403082d739f1921085f52c1f185d7b2710129a90842358b731d008a283020e2d094ed079c2b682283c342e4968c171d1d9a0993ce17a58e809d7048391831853840802e29942f3aa4c21743d004201549c0084208ce8a20554a07955340c82e8a820832743840c448914c6173621298c2e9a8454c61d5769c8b7c3e0a27f0285f173859ef04f7e2f4b18b63b81a0c0724b66e2f6af7027101832b81f8afb3973c36d09fd7075c3fc9c35e9bb3dd223cfa1cb39c04411ea180af945a6f5388e210b42da64294497da1df8ce9f3f406cb96e4ddcb508df9c29698e4c21df9d8f44cbedf0c790e59cc427c4723a6bb3aa28e1888e084e09b44e093ecc31969083217e80842bd2c0a2e3844788054984e1c3942cb4a0cc8842e85430420d0237c4c8fc71814586775dd7755dc7f5a0765dd7755dc7b16ef761b785195edceea9b74493db3da883c708ebc7983b81c0a881d1e4962c21541a1fd779a51e6822a1be534a1596fe6baf1de9f34c4470bc672ac2dc59a690ee20f40fe1ce39e79c73ce39e7f773cef98ce5e5e7eae79c73cef99d65ce39e79c73ce39e79c73ce39e79c73ce39e79c73ce39e79c73ce39e79c2f30b143e576eb58ab179f1fdb0f579acd7a6633277b8a97e3e765fd4b92d5e358fd0bebc65d7d0e31c9ea572bb105c3eae2f8d5c5d14dee93d85afdbc2f7fe37188495e7ef5a517b1c8bc2bb1a7a852342a3eb429341a7e28223f3589c31b841cde20e417206aa5473ddfdb12f4607b417c73a60cfd8f4aff16a59e83657b25f8843945ef858a9a1a9894fad35ac5d207f5b284a42f678886b8d4e07d834e67dc6b98adad9819fb69ba59ae671311d3ab5ef59fab7e822554b8fa1cc461573f4d2977ff22f3bad87a7979a13464af7f237c1abeca964a6ef8433c65c31ead3d51af2456d1478f4df26c6ebf8d0b483a569fc3696148c7e81fe91815c1172e41f1cd190f043d93093ca150a610f452299416d41150b78b2a82b1dc322eff2cfd4c21f596b25c2e0595c0f09250698896758755df0df006a5259e524f8fdd42d27d3d9075e274988e8c65236226f3c4ca53771cd69dd591dd88222c513d3d4da5c7fe26494595c7a766e91e306e572ceacf6dcaa89e8e95282a561a45a5636589875a1876844a544a3da8292506c21471f9c119a3cfcc2f4d2ebf40b9fcfc0c53bb3c63f5f9050797f961885866b5d383d00bc90b513840cfeb3ad42907e8d946a289346eb2cebacc907d2cd0b32db4861191ecd3017a56004998b103037ad6660a24845a6067bd4ecc41c18ecc133d87b9400fecbe1b2a1dd9f799aa8eec2b998abcaa78cfd9d294521273ec677a7ae199272128eccc1f4d0a12774841cc2a1311ca967f28f194a834ac79a86460fee89d291dab9f812984d69d697bd8b12913111a863124af8bf9aa74215424eb6c4b0a990d0817be04353b467a8f54622679d7e04bc0bc934b9d7b492492572bc93e3751ce779a18089fbbbb3b0ebb3365672ccccc234d934a9ce4aaa5ee4bd4f449a8f7a627bdce650ebbc1d2b3e56c99532a7994248e34b456a794ea904258bf1c29edb82fbbf7feeb2ccde8d4e97befd5cab9bd54e477cfc9cea5dfaceffd84b5bebb12b19c62148137a2f04b4fa5b2a1ed5b933834ac3e8704b3c097a33b200e19c841871b3ac63d1217489eb5f04e8622d71c563fac222d736e578af170bb5f9280794193e93ff63ccf9b7967395bf2f53fa148ae734928f04fb66ca10b7e07fe103781b3562e597eeaf5c899763c11526ec7131f4f8e525b49082c2ebd22ab47fa5e9610e752fa38b48a34bc58dc4a27652c4d8256300b7c6b636103861deb9efb12bcf3fb8e4bd0f3feabd6f312306f15c1eb9598e3d327f953b5dda75abb2bd8e30cc71e69c6ee7dd0d07c596bf7e5d875d3903c92a519bba7345dfde9f538e7eda7fec72c927e9d75d6d416613973ebcce8c329a544763c11d2ef7634c171ccd148e9e63e22b5bbd99480e6feda2d7e96f4b1d82a322f8badee93b07fd7a4ce4e36fd34559d5bdb0a0ef27ddb92b1dcef3d5b2a29ff7e2c96e78965fdd2dfcad15a39b7d7033be67df7a5579f56e0d627427a8f89a5ed3a0663b859b78988fd8f92405ae266ac074962a9470fab82b0470f7b45e4663dd6079b2d8396f461b8ca611a372be7510ecf3a76000ecaadff9dc05938fbbee466a4efa9e1861a6ee0984cb287b8275c1132b464793654bf4eb9f565c4927534d4477dbb35078b904aa9fd118be40993f9498222f3252745e6f340d2734c787c6d2ab68ef57b4fc2226ee5f12597c4ad5c0f67e5dadc929b812519b660097c90878c8ccc7389a399b819d724a545f83d578b6e7d93ccd7f5643f65b9350cc52a3dbea863fdb55aad56abc1c0c00c918842123fe9c18e318992c05a549ab977cc8392fee57990be233d25914824195bca7c470a4da715c615fc4422914814043ff543fa337533cf1d96ce27c70cadc1e8b1fe685ba861f53fd3299cf2a8f4ab367751ec18a2110000008022005315002020100a87c422e14094e5a1a2990f14800e7fae545c4e160964410cc32088420c32c6104000010010630c119a213202075cc1ad66ac77a0f508d54bc4eb36671b67a84af82206a4e67da7c365b725c37a3e8337cf8d6e4dcb2cad1022dbe9c540ef1cd4596c58a078a5724029d48d11b262251bba72dc9fcd663575f96497f92488694b7035946ab0fdbebe8b0a8b53aaad45c12302fefa10c798d6af62cf9665d88b0af0b55e08f2a7384bec4c17faeb4df790305149ee179b899f777c767b9b6a7046c84bd5828e6c5b42225946b24ab22bfb2b5980e6bb640f1c60b2e26c953acc638bd228fec9010262a2d3548c74515fb2f039e2fd4ebe0dde8c1bd878f458605cc139df102030511011a1bd0c73b446031a31977829c54183c711ce962e64527729813c90ec1a34f7309a564723cab372951bf6e99e3c29c4a036e7e28eae2a9a4361d60e92eb80e6ecfd65058a87685df79da51c44c648a920981c02ab70c937e26502b1715b10fe4f1067e4df62ba1a4c8cffca17ffe2bf402057631df4d4984591a1f87133429686a2088418f1b377c002ef05028872a881f0f79dceac8c7904af5ddae20651407d8ee646643464a4b53ddc21a7679e4a4f1efef2b9ec1c0239201f0d5e72e2ff7a93e367736eaf929e7d022df157f9060728ab39c932022bc7cfb5105947d9693d58cdde99d33ab8986ff85a06ae78833bf1d2be6258cab5c7eb276d74b4049a43fa87c1df91d640fe4c14b9b6467a02a28ce4edbcdc52668bb46be406f1a0abe1601a1d0e4066718ca7de8533fabbdbceee4c2ee7b9054770e0b54f553dc4ff1465a202005501e724f4e78a28cccb045ee30a42644cc817f7d03d49d23aa9e0406db74575d9cd6c6d870f76354ff2d72925aa0facfb23ab57b7c54c25296818204b06090297792d662a51f915a3902dd37245b6c816b70ae2173102fe1d46acc471d82d078ee9525633c9a01c004b3a96a41023068d9de9138bf52e1ff57fef9b623369a924f477535fbe01683c6f783b07af2e7974e0ec47f5ded542340ecc4c3b7899098b6f08066cd249ed15e552120a2874a79c88e0d910a3e91ca38c9037f5c23fc381de91f756d99fbb8ee2aa9930dc55c1cb68a0d40b960c9d536e8b9660b8d4ea08b853904b465582bb93654dc3fa8046091942e83b2bbbb2d21b8528baff25d02010591683a4002687b068906c8c477a2a92b8261d11953e1fef16193ac9e79df0b5db30a045ac010ab1c0c03247d353eb981b631f9461cab6198bfce30beb4ed78421e2b21fa605b3ef146dea7139659a960668e13c4ab926fe0536d05d68b10cc85fe0437a1776c1d361612ddbee13c587a337920b5290895b38d14d76cd16e5f53219e0e795c5f8d0824c094303dbc26a4949bafa8e3e6e31d345da25728178bab209d68ae64c7072d7551ad1829028ac0c0e124233fab9a8c6c268085cd1cf597fbe6478d7caa321cbb9fda93b99846c229bfc4660d6e92fe2995052dce320c071dcdf4e1c7f96d735798545ae155cf7901a4d864401a7c30aa4de601842d08988be659898cc22bdcd87fd553fb0eb512ad0f5b282923859828d3df151b529b2597fbd7d9b0339bf30d84b8a063c7e1cb789dc11f070eee70e0b01e92ee5f35a8fe549d314f3d05f84b29589018994af9de7a36bce4c9a62f79d955827e95673562034a0d234f7daf11f6aaba13684e9c5f2095f4624fa7cb1b6b3c00891724a9a9a5a081bf79da22aad03feec85db1b7f327ec30904c3940b0504112b9ba87293727cd5b09aa5698db37204b878882d3a67471799b36612e894b976b414d7f8e35a48bdc41b4750d4e043021f0807f61614961e516110121a3efcc50c166f654a545014017216011ad3b44e7f4be4f774b8c3f92a6fd2c57a1785368c6099b9ab8d4f8d3d8f2a7cd244e4b14f72ac354853fc7e11539599794fe59e6afcaac06158a9f4c1014b4552f39c782a6b5bedf5be7af120e5a1695a4bd2a38f95c820b0fe1db04b044f7c5b4e4a1e218c294abcead1f431f43d629672943a10fdc0278cb130643d6ad3b448e1dd969a90db3dc7c7a2fd6261eb936bd4402262ecfb8328148a9ca6d1171e7f118d86fc942f9c4af2098ee04533bd4a1f1c6450c038809730dd90e6d5c7df7ee228f351daee88779a766ad9c0ec659a46574012a7f49a484ed23f222d105f02a9cbfb31df02f1fe1724941a1f475c1547aeb577607d3848086ff269e7f7c241429bfdc11f8dc126f484547d1abc6bfcdfd4d26225f908006ed7d68325ce259628259fe7ea7644e0c1f6c75f6fe7120b50326875cde637a669b744a3a13583ba104685c751c8818b1d0cf04915825b194dd34870848e7947fc13d147495c6fd3b4ecc1e0e92c7804e1153cdde6f9b4ee16fc51cd0133a75fe563f0e034bab359cbc8971040bc4c8315deb9a0331f99c41e23731badd3000806b613cce81b40d3e7a94799ab7be648045951a85286ff2328e101ae07361e2bbf841ff33df27257f0e5d8e7b56e8eb127083aae60415d2a518a9e7ca74c1f671646a25855e3f0fbc868fb9e6b70d6e8a655990e1be2909ed7df2c39d4382e1079549833e593d7d90930cee0d13882883e1523139ad774a019b33f850919828996ab6806cdb2544c6624ce64eb611ad04a1920fd3a524a935f252e4f1e2a253e23d4920f27c3ec70f5bb98b3798d09e66eeaeca8b616cdb3a7de44632033e6901ba21f64784391d529d98f2ff1ee1dd43812876f8d42bfc68d5c93e85b08a98ed4b1d7daf41d8f94dbb4367d2470a4e430ee03ba0c9c452dd028a2c8056af4b6275694097375d14f59a1c8a35fbe8c462cadf2631f85cfdc8d5c028ee9eb147e5af291dff476abfc76f604093c943379c5c9f4e1a8bfd3e61d47708a5902b5cdccbe6ee65bc4de2d4246051c7159a67fe548ada72cd305df5298a13f68742c88a1c0b3211f9ec0b77916b1411781743f4e848693dd48ac5812036c89ea1d702b8ea68164a853ecd1b984861e99c81e1f54391204e0780247d93de349db7ccb61d073f041b01b6e9c5f8cf482196eb8f82d8545ef83a742e4bbe1f7d9b589de7260b5d44e7e8e70bea0fb368f885b84158dd4f1d487fa0ea0231a1e4b61e87420f7e80437192366e7e8b88a8cd1889fcbf07047b868438738e2b91d1bb50ee3701cf97189cb45ca68f4e3734736ae02b3fa2434fa6a514dddbe31dcee1dc90aa835caf1a4e48465ce4905841f66b14cc6a95650647c3fd7eef48284183d2a68133f80015871d810306e863050ccd993ea3e7f016b1280a41fb03e4192e220d8cab405c5fe210ebb066daa1747c88bd9f3c36e3853647d339d9fa3c6c2e8b561cb9425b95d2aa06f24ef4521ad267f269ca48a0be1034417dc71ee36e9efc0f80e0bbf78723e2f7eafa9860bd9a0686682e55db2f0a18e70b2c982f74fdd432e5aa382d370d96c628121602b18c2d26ebad9026706d3d80299449aad4c675a683b7d073524dc486bd158dd3c8d748a6f18948b23c9e05999d45ab56e60417b772d384ac7e0c1190329924a1f774ca44526692db71463a40e005605f5280b4a371ce311ad6af039774f8a6fbc3033ad6bab3c5cd14bb5f46d43fdb342a1c4256a4cdeb8153abdab409493ca2504a28d28db24013bbfcdd2342d8de6ae447a6b5e2a95fa425857d994f488850b428251094977a92359011061a4887eb2d7bf5b08085c25901bdaf5aa78e5fa78ac9711e1f6bccb7d49756c52b817f1546d1f66e742f93e66050621987def24fc2f95f0b5b2e5fd672c8204f01e744d5350d30f47dfaf46519cd8ee9f1315c4eac6a70bb3aa657d0ae02bef26cd03d616e6a0a1fe14d0bfd69a7fb19f7fa632ba0f0610001904ac2c6545cf1422bf7c8c940ff16acb595abdfd2106154d6a275d9454ebba69896c76d9efde2d3360e0325414a1bbcfd480cb687f0aa1873a0c1a30187fadb3e7737face438f6360ef7ae94a313b4365b043e294cf7bde33c3ab49d4f1a0cdf9734d9cccfd8312fe65504a71dedea86dbdb6634acfab7a043f052e60bdcffa65cc379a4ca5d4b323bbd000d06c1d0b1d4af1885c634c063b28afda71f5b82e2597b1c15926ea5730c4d36abdd6e3c428bed2f794de867dadb094544fb51718c7f06f279f606fc887b5469a549c526155b6ca8b2a1ca1634a8d052a34aa58676b4ba71fc410b8546f6242b68e261831b74075af0c22e3ba5a2088ed5fd70244a14d98f9834ad9fc83273a0606bc5aa0fe652b4625177a637915dc45a8bfb41afe9e2daff6246f0800de02d4f64503a0349166536e394fe529ff46dc827b2d92df888ad452289ec41636b4209b2a7eb9a8c853dfed592270a631553eca283e9d2648a6486de4ce01da229eb1dd1de8f890fa857301d6ffd0bbd79ce4a452c932d815aacdaa45a50349a451028c14db9caf45c4e1f82ed0ead0184a1c0a92916d3a7659d51990a96ef8c55afb30fdaae206e2d6d0c06ee61f4623a61a0b7adb5b176ca615ee20e3917e2e2b16dcc2ed0b731a08fdbd5c35f8d7d3ca0ef968be72909bb0b583dccb5953a7b8cd10f7415ccbeef088473fcd03c71a8892e5ca38e3e86658a44c70c82108190165d135d0415ee7e5ff4f6ade192f101605adec871ea3d8eb841c019ede1a5fc19a828c03be719d0a471ca23ef68f459e823ee6d0c24e1bd406e3ece2085edd124483a91df51907bfd8d4b1083b8c194c1eb7839b6474773bba03ca0114da4ead764b9a0a59f155c1c9fc55d36647a3e1ddaaa0ceb70ea453d21f941b2208e5414e3091f65663f7c6507b74b0e34ca1aa8a2be72f39d6df56c05e5105d954e2d761d8cf508696b1ac46d5ec2d32f17e9713eff1ac4bcb703dfbd0e4e2e4b92e2ba8fbbc9f781d26ec431a5f20b1d8f9664b93a7f0be650c33b17729bfd5197bb666311e5898819fbe4c09ece0a1fe708a3fc467a280682c9a07b715a6758aa6a030c40e46bc9f8e4f3375a15c149c56ab7c91a6bad073cfd1896364a85ba97c8bfbe8988601293bb63abda2549392836ced5cbb1c5db0400dfa891f64cb08be00b496eabd7670711e584a4df08f53d35431e0f4241873b06983136df1846a75df688cae04e13df149f4ef1273a060598e840b625c1df0b313eb727a6ffdba9e965ae1bbe7de57be0d4f8d044251dd411f6f89f063a74fbd974f4cd36d777b6adf84b64a33d1bc0fa9c2d4cb87811f39b022bd8b468123b48e4e939e2a106afa224561dbfa1444212c98326752a8017912a295eb1143c11da20472cffedbd530d47e4682835c61ac8a283758e4c8426365fa9481b9ba08d5b39fc4837d1e5d224e084b835f5441ed2e11f74b571db5f857ebaf82e712ef96c1e80bbabaa9153f62cc9f7f45589f83cb407cfc2e38935bd2cbec907db8d1c68b3c34855fd11e4f377a72861799a47eae97105adac3283feb938262cb02b17cb3c1aea019cf9cb35ffd0c9b3a9e5860f399e0ad003c97051335b3e2e204c3ce4f484307d12213161277dfbaac48be9bd949799396f55ceb0675f4f00f65b08a659c61d93489973ea244a2b32dbb0c80c4329f70d4a6c962bab0536292793955647f373b1a795a90162b51b97fb77a65301583915023bfbe05a576527cb8541340fd0a75dc6159571c56c01b5eef1c00de38e52a6fe29c0056672818b13ed0b74d652eb8588099de03197b18ac287937e0b265c05ced653c96121489ddc7859ac5f9c828920a8f2204227064c47caea9eec1a7fc4f69fe4a0931693096af84cb698f55ca110dc82ab6cb1c1b55f0a96690a430a1c59d942cc814eac6ca791e29d6b5a6b1987a96915107ff013e3f0f44d381c0237a396f35eb90194289698518db14c60d3c30d8581ed0dc788f8dc1a4a649a3d1129c34f26a5916ac0f544938a944c7671a94d24c78163c4fdbe128ac8b11ac7a5bd7fb19855b308f8714dd41bf5c6b70f5111d6c46d54ebf577cc5d5a1fff825d5988b1a70bf3a65b6ec79ecf4e9bf0b3c95e51542f5d37861de7734d5c66c088a2c11e0b509fed5701535a63db238b8b02b68de3152bb8a5435622f41dbb379cd6ccc2d6bd7ccd3023b706a7e2a5cbd9d3c1181ca22a0aa0077b25b498edd511fb851cb90cd91d313441100f8e12a220160530805093e734cc102a98d93f9926c2622392a4be3b4d0a4139ebb0bce70ebf9ad02d3c69ab9f9d1ed8f3aa8a6e69e000f2012de0a6f578db36ea69769d617e125865583b46b07327a0e63b9f80d5e5d18b8c2159e51e42e8b105512ca46fafe883cfc20c3538bca65b96bc2b336ec2b20cb8e1d569918ae4e26280703549b4389248752f63c675be5b28fff4819f7a59a6e36e64520c27c49e95ea0804e67e4752d6e6a7e80233267cc50a225a0b27b70d50dd86c890fe8d80073f537a67f05eb44048685e83372e4bd82492e20a5340b1ccb084027784e1d789e20ed63256613ad26efc37ca2ac26073b6855c6d68c02547073839945cdfd1df36344e65ec11c59d484fd92c861851e85bf37feaf560cb18a968ff792fb56db107d5253b696164b6e64220f3e9b9fd66241ce20c6487dc2a08464cbd322f6190a9882dea0d2f9076ef65b80412f101b706dbcd83912018263b5e1f17ffde3fd7cc817a2024894ae20314607a084295e41a4273f4937161de20c1fafc730ade803129a4c2f47ef924a1adcaf63a524e6f6b650012905fb759587336e8b590951444e5d2e16209aa7c7c6469dbc685acbc67dcb06b962dd9865c8cda666413d6b7e94fd5c13ad10480428cd5cdc58d3ace348c27156368df9edb74f60427291681b00e6ea39201d8e190bcd4b7110ee79e4c4a6ff36f4fc32ac03b4419b0133649b7e12a441e8bb3f0a99160178851a7d56c14fafc87a950740e48277da50b4517a35ff024185edc0ae400d29622fb7ecf36b1db057849c87809cf51ea34b6c630ef4fe92a4d75c6ef419caf60d3ccbaa377214d9c29703e126e67f9eae6778f400b4c1f51795cdcb700dcbfa0a031b76e76904bc0cb9514d92df84711932bcfa0d5b55a87a216d3f37f69f3efb536e85152aab877680a3e5824da8b1f265991c7ee9de29e8dae4c2cd81c80c2b8f6336abb0ed9367acf057b381b47b3b561bec8fbe14bc748d47341d90e2a0282a4a6ccb3aed9b520fa053ba718e857206d6f4d2475b452f269b0b39dd6d9e6c2956b3cdb61ebdf06d73fd3fa859705348699d0c10750c0f8273ae474d74e7970da0b86a5b8a113fadb860760df4fdc7e2fca2d977a84047bae149896129b675bf15ddd890f37792001931bf6c7b5168d5e5b30b7f6806e8dd0a5fcbd84c38250c7037aa30259ffcc8ddc1131e09dd3e00501205e642fa9129651b562e516d8c6081d36bb5a999f8dbacaa80e81e7775819b36586241af03a2d83b405fe850300d6b538f40dafe5dd6c7f932401c685c3489ff0308b76e072a4b300c37ff0d2d79b1b5ced9689bc7ed8f2565d6662c8c139a99a4a0158ff27b248f13399d91200eb6a4440aa2edb6eb552fc60fbae46c11941a1ba9c65704eb90042689db538921fadc1c3c1e919a42490b69ba1ddb7e702dc98fb340580f02c1b808658442bf1ca1bd222b39eff8eacda9066ba1370567fadcd65549d821deacd3355f1aabdb060d11bd4a1de31b57571c6fcf6f84fb8d063db9761ba25860671e459b309068abc37b8c3a126c49b822caba75648661bdc695f6248acdb22da30113441a64a91264c89217c12891aaa0185be68f7d70f7609a03440b40cb19572b0e403eaa042333ee96e656049d4a07bb9f00f922cc56b53252c937cf65032b9fd5a2587954d111e51191c6ad97a364dba14f6fd8b4d54736bd098b1347040e0f401ee210cc4a6d55d2f9aad3f8bc560947ca966133f736a411e23ae4dc40157786aa14ee48aefaca331117842be5c6649856ac3d6a68d790c9e3c33100fe7fd354223b0a83886830b96e4a9236479780a4b6da377cb24329d23054c24bff374cdf605d2f7c14dfa2054fc3169b76b11ab602c34ea0507347377b773869ee29a17380afea2991a208a5f84c095219376a5aaa23909a501dacbc7d430c5762e5a324250a90b3360bf7ee59ce70a2ff04704910d26b070507569c58bc9d37b242b7c309eec65382f1bdfb8eb7f7705d0e259dc94bdfeb2d7dee2fad3a3b0b79fba9b7df9689d95ec09b1ca8827ebdcc622f79a8ac3854f1e8a62e11c65c56c1e6732232d4133444306fb22d425a8de0ecf2827dcf074894c50661cdfdd7e2d6758c614651c412f100f87a54921b7eb71efd7b07d779bfe2e08ed2d82ce0376e059e8196b32940eb43ace3ecd45dbd87072251ad4dd8e56dc6dbdc7f02affb3d5a990dd4c6e9811e6d530436b79079a60b02bf1eb20d42ba1ed234881e10041b78dac4c04a0a1f2a7d4c01d9e47e988d749eba5bcb19a706f1423bb81df8b264ab42167accb4088969b0b3c4d284f110165f236e2832c437e25956e2f60fb77dc56eb30943482e8a0dc73ef7c79b6b3558bf07658c093d116d263ff5216923c7ef476fffbc7e73aee709dd7beb642e812dfe102ce099350053569fc52182126f1b897e8cf7584521b2286b47efa9bacbbcecefc980bd642299e971ea5900c4250d53b257c3560695ca1cf1c4aa8e8312d26ee25584cf25c0b0307f68f17b05c0428625b1fc01b4a70ff94d124422777e9119623959a4192be4ea100e348814368c57ccfec67634b2ba8f6c92bc34ca96f1da78979b9b0c4b9f9f4d576bc8fec0f9c3bafa62e96338242bbe1c003e599a5a42aa9b5709c34dcd822304202de9e7d7b7296c9dedad63a21eda4c9d3f1b5c0f4b2e3ae358e00b2c7bc1231b3cb0e37fae2814919585a9563fb0e9c8b39b5d150ed727758919541582164da5318a542a350580182d59edd52c01adc0c0a97311cd013fbb08b710892a248da8180b8b84a5e5a4f19c9b24189918576e6a5339f740deaa6f1bf95ab42bc607e62800044b714482ddf46cf32777e5234c0a7e3420d72851f47fa1a46de3e059277442f17c0bb22b8d78a8c868efe0d0ac095f3aac80b1420996fdc625784a5eb6296ec20a1ae0a8105a2dd47756da1810aacc0390ff5632112b20ee5f6f418294e78a8f24b85f7ba12747492169fef70d0bc91c668ce891f384119f65f92f8fa6c34cb99ab7ba7e074c9aaf7546def7acd86125f5400fd6179333e04d64aef170d812ea404259e13ec07a537cf3c9ad7482f1b0db8ce6413b94ba53512012ec5d8af0349d50698b879ee048cc63b094c4b50c0724106182d1eda3b6e60a0986b93733349d78e514274eb4248c7686272150e0fe1c581f9d96c61da004af640d353689447a1c96cbff154eed9c909eb89a945c02124b44ece515f0ddc35557cc4f97c9c4c4acadabf6482b82ae03bbc3c3c2519bf8241e8a9517de9909baa76fadfb06cd5cbdc25593399f534f9e155642a00f4d540e2fc9c2c93e9c7f82a16a46d190bbb10748b0946ab7d7c74c041f5c659cf8f81e1ac8732cff52369ec5a9e8c41f31f2d0dcc1abd9628af652858d69286a47b20ce2eaf32dde5fb67e683b59f6b2f2221602106edeb58dc54f9cce6ce3f56fe45246cd7661998f7e58200d6f1b42bc6febaefcaa96e53b3408ae5d6de0fb1fcd0c8d1626273e13e473eb1b804ea76fe83855cf5d877914a8f190d59854924d52c6ad4439518c694cdd06deeb25b9f15f1186112678c9ad36772ee66e79eb9ccfdfd5f0a266afaa0513deb61de15b81294291aade0f4b760fa7272c82b8bd6478141cc3336b01262c4e8ed20dabfb53111a7e784856805e41781e9dc943b3b7b0b8512137256019b33bb617e0bc0cee7d07e38a365562e0c38ea0799bdaed239c97c3e0ead1fd122937d11fcab5aee3a2bced546289f4574baca33cbe4bbf518442d452e907574c2f7c5e2fd6b5b085c62fed75aa6f6d92fcd975756e626cb81a93c4cc20c3960095b8568a77d764585fc8b0f8b362fd56f6f651fb106e41e7178f1903eca72ee355a26677f288f8039e8f21f673312819141520b736e66997d25b3526dc6b2f9725827b7584847433a85d6edd96499a458b9d4063e45325461c7c31ec82d0413e7fa70603b3a532196a572cf8a07353671aa312fef057dc22e10dfa83f054a9ca3ba8783f8bb281527bf6545355098bff90ff7aa07cbc279148f5e82a74a43b28a95b656e69338a71cbac6fc65bbf6827d0b493eee0cc078d409d2fd66a3b62fd43af10123dc76b2992f12003618b92050f34decc973bf523df4866e04d80d22df543382e1221fe72644c980369abf514be0524105bfb874bd424387e365193f61417eff36cb3602071594691f96848b67ee22c4afba757d40203d00764443c5070e551e36890110536ea09b83fdcfabaa85ffeaf01296dd08ace14e46fdc27a04aaaf852e2f970d1f98d4c3fdb081584c87a1cf526266550459a94f5e1d0420048b34c543acd0b28753e38c54c949f06246ac8df6f252acbdef26746912470f2b792532a49738f1a50b2c4f8fa6d883e399035fe5b92a99416c89f31d0785cd51574d9540e25b846aac4db0716c8ddc12ebc04fba30cc8535eba7064d512b80b172765ae71390d7fdb5e80c6df0b05be7db90b3e53cc2f9768d5c17225b492fd85fd6372e11d262003128d4a1655eae6ff45488c81ddbb05d8dc053393d0e3c647def0a5dc202f74b5877c2e25db419db06881e800e353a6651c6d8c88a3003048f0727f4d9f2e6cb6c05defc4bbcce26b0dc04ef6c372703e671319816014908425e383612c5a843403228f39526badeac114a5422685d6992ddd7ed90ab94894a9406e8380bd3bfa634961d638c0cb1e94e35398393bf871b9c82f9486d62ddd5579ef00b8118096e05392a3045cdf621368164438254a6463c190c373f21658c4a2c9bacf0f785f20e38bd6cd0356c81009a1e41fe907fca7d6102a2ac5ec6da8507ba3636a0db676e10edc010629c5ba2c17d9382ca00ed201b997054bfb06f6581198c56697707a681094b0891a41e65a1f00f17ce84388947fe061b544d0948578e0991a176e31caa9bd7dee68551baeed9334fe8504e450254525379d41f48c11727ff87569d15356d551b26adf1bf65be67e20cd80f8dd5d10ca14af3ca7353f8bb866a7a4255bf988a0b4d6fd52f95ec9fd8637b2e3e439d4022e62dc0e65faa5c7c103e1056f2218c62b63a918c2fb3b561fe9ff0bd430f8571e483f9d004253e43258c82df419293f3f977e040e35c49370cb96ea2c556f9455cb4de7f66fa419d1c0ce3fafe239ca3c6d56586e079613aa836ef0d0eb9854de1b6f5cff6a74b11b5682008b861ea2ccacb1f88d3955580169e939d2012b3f737bd18dc38483ecd3ec0b053f329b4d53479698a4fa026395dc46dff994b98f1e467f9c0a65c8797d26510c0633ccddf6ca6729bf8ae2497fbe0a34a39a0e04c4dccc571c9033757538e159158530e5039225c368bbe8262472d27b06536879756e54a0def6e466c94c181a3dd4bd6597d3d23223ad89fb1c9068d79db2a4014abb8088932bb0cb6b4503bc315a3917c4ece0f838440366096bd1beef6beed4b5012c17d22b003e83ab22afc5f45cf7737ebc97549df045cf44764d1f9f2aa023b37bb655ba9121edda2c163f192a48e2f979f5793b90f716d4d164b58453a5b4d96b7033b1e209ac3aa6dd47f309cde22273eb3ac1c54f582b63a3a89d96b9a58c833917ea1355a5799750eca8bd59bef8c7fe088349b42e957becf45b9f7f81dcb56cd0ad4cc65a4855a04530aab3e100d279c223a058a15007963a91f386ccd7f62092820407d636151b782a6d23a9f7109d1d83d4b0e118802e464cf26967ff6d131a730582d544d90da33ddc57ecd6089d2f0ef144f5c81f0638440813d93f2ef402940d27a051582b09201a3ec4d010fe40f1244d26c55c174a64d25a7991fc604ffd0a86b4141895576fd96c71820b83b04a9ceea34555a4671f3a0b2f2aec6ef43461925f6236192b4b7921d3171f79a6a456d20aebe367bf52b1ea410a9caefcf529c8809bb9451a9f15190c9d39196c9f73eb0e2809d9a452458db662d0cad2bd3c09d97d56e9a06eee6ba00d787e8fe2668bc168f0381175785a74540a88595c30f61415eda7cba32f8d98f70344cc8f9be75620dbd84f0565c8c0fc6eb5d8c0e7057bce9a0d1a966b9efd3ee15c2d97f340fde2d63d3394f1091449c7c4a7af82f9c570f16864f84acd50b41681dbddf03c3c87441c681a231ff46cfdc9c2dd95782cf57a39ebb1089f9db96cc750fa52e7e85dd9b6225d9bee41880734a6199fb5bfd542228de73c84d9072eef11cb27812de22a17f31424e9380412b57915c39d56f5b787a63b974d819f07310386650e69414151c1b8d3aebfc684df85937e686ab755a2637eef4bce78c12704c592332469adcb8b4f3d5f9e0749381faa901ea9b9a3f0e13b62fa1118b5d639d4085d7d5d884bae00114a6f894eeeffe0dbcdc61b9bf1e761f09a6a21ce19ed95b07bf4884c926c96bfaf7c1779b3236458e388dad75f304112d48add9843d673380fd7b36152c0e13db7b58c168aea795806d9bd4f50ba0d1ce819d4c031584ed08846f4bca04d9ac890f6d316919a798f30872e6f1eeda00a4350a350e1cddb36da94cfcb292da9f109ac0e9107c02777ee1fe5dd7ef25d5474ab70c80580bbeb3642f657637e2ec245314f48b284c48384e4c24899fc0966342d456f41123a0589710f1b66df86711ca3f82589f58125afcd97352a9bd61b7735862c830183f2a3bcca9390f023131e58e84d4174d1f7ce3f77fe2b85ae4220402c8a63fb9a7edfb3a3e5955f5e502b4c83a0b8f2e83d704488d57cf19872e61c4812305f94791d37c71a7370bc1e5d7628da716693df274819a63bc11025c269725edc25d295e83a04c2765152600fcea342f0fbf7d436554e0b90be32c84fc3ae26ab635a71475a68e8266b97e0d6c3d6630f1c6130dbb400ef388da9c47b8605cc90d4d5c1f7de05a809b4eaba22eb58959e3eaa8e9bcc2e1e66f810e3b071f1d6dc10d642be58bd4ea26cceaec7f390f78b3a350e801a4e19e6db9d6b61296104f680caa40d1bbf2e0ee7414d6213cd5ecb6ce0a6c5ff3454bf9b8d8927b02dfd4607c10337501342cd0d1c5158ceafee8fe75361b8c19cc0c980c1652e1fc365a041bcd49052170ab07b0b38ac96ed31b0030dd100c03a15c5db72725409df1dd660532b5dc00db06706ad85c39e461a90752d6175c0db393c3381ae08b9c690cc38162cb4b9c450160d1f4518c3e718c754c91066da4847e3ad7615ebfd1ba117028be2d076c09c770c8fd65d78e5aeb14e1b6c63dba1e8f9ab85c99330f5db34cf91a328427d568c474bbca246cff3eaadc37076043a092eaff57a79e309f6108ba6f93bb9dbe37aa39158758b9bfb34890877c27100c2ca3415fd907d37d0e61a1252a54077427a29fbcf9667c0d3a6da710818886f24616049ea760d0bbb560f11091b1bba7e1471bacf21dbc4df0dd82cdb0c8eb8b836f5338798b9818e9d7611142c2f52b6cf6a09eb4a96cdf9857fd0a5065348852d6c9ec1fbf2910a815927d02d8b4e4edb939ba663b67646153b1bbf545168232365b7bbf11ed03e15bfa68150b8d731420345d0d6a77c2ed31ec2411c89baece8e362fbc9d1ae258d3124c8d0228360e0ee3516879823f17055bc490dd04274ec11a588503e036486334f2f18fb7f3c6f015860c733c3686a002e0f68fb758d9f73d0d843fde7cf8e4445acf74eb396bafa79c77d9b79e90863cb4a1f015f3eb10ed9eb7167823f9144d913e5a2aee69e0836742b0c65f5022f6a25776c69cd298f471df409966305c72efa550208d00e300982cb71255f424ce675d4c94b36330c1ee36b26f40376fa1f00870cad68827f67d63eac400687a7626ba379fd9322abf3f02ac904388e24ce3aa204c6fa3c36260595e25c873bdeaab262455e390a338cf7b92aa8d961463469dd9cf319cc9c0439e01b89189403955efc0f64210674c933183b1416c5215a3e2edea8c2ac34600145bc16296ec286933178c3058384a171f48fc949b51661cc1501548da30ab09a910e300dc231ff268c08fbef9d5e87db50658b371e09ff51c3a38a09b0938afd2a9b70b6d8ca535155d987310c0ea4dfe0e6a9858d33465cad816ca473bede6273ca879b8de18b297d695e8522b9a21b198ec2c73bc45109433954dd1f61f9930b9d54f92ee266ef42b0135b3f8fb225329713087012588467d0cc022eea9855f5aa40661dc56a6149eb7b5b7bc842aa8fab29f45a915e3fce965e89369226413b35ba1b8478d392ba9735e87daff6da2bc84a84d4bf0514af529f287796c75e671e91a4ec3b66b5c8b5a2609e7a0efc0de30972f82440f691d6b6e9a54f3aba63d67dfaff88aa99d1b6bb77b9d331441681083a68e79a8f497e371e0e824e41f51549fae97a3a9e9ce2ab846bb0dcd18cf1107305031cb8fc17cc9e02fd967a20a55d0505a640382697ef4eb2364476f609ae1653142776da86c647639167694d20edcf6ea6cc6e362f8e9c7f5a4fc298c00c6674b5631e2958118bdb0613a06a48483931b425e5934afe89cdd6b27b389b8d8f6bbf2c543fd3e060c293db90977aa5bcc91329db3c6a9053bd95aa93e438917427fd5cf77aa6cbb77dc6bf560721ae13572df2df3dbe80b25b3ea07d30671957218a9faa6cfb299ba27b78fdcabf94821f38d725df9eb8a0d2e8b18a1ba96fd79b3a0e09a948ebd95ed1c2058d3d9759a9a36b540996c0922888c17d49e119a4e3d4b5f92825365afa66095d30c04f0c71f302bce9e0166e8e95227aab13cc60a975cb5a8b4ab46372fd39f6c04794d628e7325ad73be9d2315515b718e0c17d326a80ac22304555a65917f8720e7f7660dc63f0fb8072d236008d807cb4d762a1ab8b122774ab4cc9298bbcde36357a71b9cd1c2760ede4a6014e0fa6a567a710e22b35d624477e216ba1532a3260871ff8bf7e583c5cd25ebffda6dc1e6d8bfe976b07e0d38c15cbc91cf981c8ac4a75710626cf8f5e51eca1d87e967c36b8ebb184f45c1b188525f57a192a6f659310c050334cf8dd17237b5759ccb0d202609ab6a86c27a34323a1bff2aac5fdc8f635948fd2783f7388e5a6ad46f1213c3e7b071e8a38b874cdba92e354483c0743b89239dd1056ec04ddd34e27067c7b973af4278b74462a2daa23a2e7aef16fdfe66a9c594151e70ef949578f7e87868330b8be2b7d625583973250b3fab00b0598e399f1621e5b3bdc441f1464239e465da2f503be29cfe919ed1a873d480df0b8bf0fb4337d75ed11eaa5a6f29a18b0bee6154970956641108aa7854fce02961cd06d7cc8b4e15b22af65c173c57446f805325100479c8c36798dea59b011d0b6a6a30c17bb9f959ef2b62335cc4e56db27d55b8f71a967e4ea2c87bac7823676b16625e80994b96a970d027901b1c95d5da8c5afc358ddff1582da3bd968efc3ed6374cd0429c8d4d8867aac081ac3283251ca7365de509c6be9601a374a9ab1dec53dd7f3faec321e47d062257d6cc7c04dbf03b02f5914ab965b5be933f976579890aa613d6d963439f9fa04eaedda45d506a7ce42698f9648cec08b725ba6e91ba0d3ac235e37e8548798fe2453d35d90718a38132c55164aa7772388dab6a491908254a0c3b9e9ea01292a7237abb6ab8208c8a7b8414a4036d23895c9daa659f40cdf6b23eaf2b16e022620d76e114a537a9ecc6d2f63b1761b6d7c8eca74a7d2433e1bcbaeb41b46af3526c7b6df6d23cc4641ef38b0d14a3b76d9952ebdef805822aaf4488214fef8e248b2114e93a9aae3a089cb3af01fb406e494e0905292c3a6874b7558eb3a1c80e922b8d236220218738b76b0daf89284689c9d05a4172ef54784f33851a90accca1aee0faeecddf7d823dc837411889769447b38d916091350e7d745a1b912237cb0fb2f353356245f1ee8ce4572ce3e7957b2d94c406d60b08f4ddec60b9cf6b3f4127f2af2593eed47f1e6dadcc725a02f5f08033c4dba90f45ad15b0a9f798a0cc02c3a60c594dafacd567147a2cca248653c64ab166e866c5a12561383c5cc4fc73dd7a538beb6fe4604e3d78875bf8bddd2929aea2beb8fdf22d25a72071827fa93dd2e614aac2bb1a8391c44c3a1bb9f0b724322b7763cd4950a47efb044a2a155e2218536a21bb97fb89022b40365b1f130f3d0f09521f9275b0121bc99fa5e9378b3892bd0169abe949b2cf65cee2d295511f9476030e215bd7504b8e17580d625b31122274c4cac4a03af1e0a31f784bec48816c77c398b45135c765d0999b4934096eab854a02f8a21fad2c0940691fa5e6193aa23934ae7f3e4a1baa33998dceaced9eb487d1cbd3bf4cce2f30f5c51ff832fabd00492f1e949791f00285bb78805d66ac0bd4d2c587e6328b5cc01e172f87cb8cdf0247b7784d5b86600b00d6e275b54c4d5a0086163f9d650a66817859fc982c631c0b48c4e287b0cc012ca0ff8ae77865605d01892bbeb095816b85a110992c84d5a94521c52a702d343a2b3362052c57f102abcc5015b853c5eb4c6538a900282a5e80cad49f02c04ef16353a692150860c50f5719bb5540a62a7ea3ca9ca6020aa9783e2a038c0515b0e23abaa21eaf83af7021ed58dd2a50db48092180129a644612fd809aeab4a02312dd3c2b370e1b4c5c27b2e531dc344066d1738fa22b02a034d309b5f914d95d1febc51e28071f060593149036855e52fc415a131a288564430a124e818b4744b9a1793e4553b4beddef440b12d63732d0a3f332e8593dcab0691be5610f8f24d9c1f6c1887f75aac7781b57ce0c4bab812698edcb3298e8c1d1b9a369817de54791c07ea9554834621cf889d14275e123e7c1d40720d5e9f0f3d47c5d22928e204c53f96723bd56056ff8c9aafdc9bd6fa1b3d9310e479127e6b81dd58f6b3881b573705f5c02a490d40124433abe95bedc5afe84bb7351dbe0e944f7540f82f458f3a0700d64af6a801541e0603c1422bf944a59289abe270cba1ef9d95938d43b722b04beb9b14918e4fd7c56073a32b2a6c8f8dde84a863c67a6a651c8e7d8a91afe63248a10f1efd9b9147ac94b0c068d4feee1401728e6b463d48322a70155dcf502828ae7cc2b9855920717a1a61697bd84800239f30a6695e4c145a8a9c5652f21a040cebc8259257970116a6a71d94b08289033af6056491e5c849a5a5cf612020ae4cc2b9e1285f4dadc99caaef3ff484097a59534ffd2029bda9a867cf184d9c45bea15976ae743a2a9ba91d234ead57d1db885c3aa6e1ade3a4e796b39a09766adcdd5f6a0d26080ee2c684fbffe2ebb83f80b6d30c3b4488fa930f4db2fd500590b05bef64aa042fc96e6da750d5288fb2a359a874162761d32a41f91f01a921a810a23c2a9ff23fad40cf83a12a0ea96a8f3f20038f921f0d81da15c02d780021c29a41bc0e281d2b984e0e08bf2114be54ad28b2a2dac7e8f12ebd852c5bd009090d5aedc8158d7dd1a544bd88794510a687bc26e35f4cc6024dfc609b6d5b9257fa147343f29e3c6fefaae24003683c4534ff1ddac49aa22198384abf8cc66e55a6ccf159668093fbef64e2e9993b8f49e3b92f1c82b625c4684f10289e3a7449f4a7c5ee51b1f684ed73ff95df5291ba44ce5c8e17250b64f7d94571e804b68e56e48b47f6f2eb5f79278a6fe7234beb3a1eb6157324a63f8d7fee0ca492cb6e9c520b5439f24c4352fe009d758bf7623845545c1f7c5bc93d3fd0bb7d49373bf7cacc97b25387907d63d32333e24ba19baa9b99b36ad6507259a25005731f5c0a2d635146003cc5af7ef88591e084af6d0c901809a6bb25fa31a4a4c7f16932baa04e50e770a9b6c6f17e498b06bb1aace9f0be4cc12bf7ecafa76d3510af54f6ffed1ec9e2bab522cbc0f32f40aac22e544e1a2c680130bf00654dcce15dc7a584b74ae7f2a7a1e032cb5a3f6e60f3b1785c0cdb52b16632b04bdd1632ea27299c657cfc85f66f2e81bb8cc35034cc70fd6cc453c6ad115ce55613564c01f315a187deab80131220911541e6068d4aa177a642b52e06b87c885545decfe9b31785e992bef28f33a1660d6c61bdfcdc6df3c4587122427d591784534b638aaf1a5c7d9e10df5ed3abc3ce1c2ea2e2c10bc9279ec26b96b634e3db07ee481080b17e84a5847659ca1c74115d314743b2a446d3c5712eaa9c4ecdc268b660e7ebd3371d94c35371956820226e351c2049695c75d9ea2bcf2c34a80d7ca19ea3fbc4716b3f145bda7396355276a6399db61cca63350778977a23e12e227aa2f341bd126e9234258d668da61d95333c4215610bb1d2953fbb0265c321e049e0d0c43d548a80864db03cfdc11c7b059ffd3e5fe462ba6b4d459848d40e3921c430616900d58466f4e035a2d074ee9952cd72d08dfdfdace80b036f628c1fbdbde0173c5c4594670faf11feac470891a15bc0c834880b1621f8c7b87fa66c8262a4dc27d28d14b0a08f6f534a25898125a13ed515525c3428bca9828f8d552d5b49b49f2ad5eb99e03778654a081caa5608620c3d06ce17dc6ac11ee5672de017c78e204466b1afd0143fb4925bf219be2ab7cece19e4b84a9946ac7ee6dbaf50406a81217cefd9cd9bb6a72755871140b0d175cfcefd005911af53fb88a8c9fb1ee3f2c4711595d0e6f9d0ab1c66fc21254d892a923077a9e385b7678d110f4fc839bcf5b538af632bcf965c1d46ab130f8e1635614897f756b99ca55ba9151d93fe32b8ceed4b68f747ba8bdabe627f8245e796cdf573daca3ac7a47feaa110d227070d6c01bcd04943f5d1aef3624632305d9039173d7f564b721f0fc7c6e881b5637947546697a43865b5869abdba8ea1ca151c2095a7ae55a280b88d7a5921edfc426579fe97f17992a150a68ccecb3a9e7284c83fe34d45c31b8a38f1af2dc6fa8e3bbbf2fc196573ca345f404f6d2a3ddea5409e72ef8e2fcafa474cee6cfa8a406c48f292df731bece53c5d5e3692ced3c698664f5b46dc1b0665386ac8c1b8d60698e0f2109ca34306796669e79348868885ab3a8018e51e33e48eab693c585ec25dbddb447305db8959a55579f27c3200210dc1f1dabd657432261e4bc0000cc890368014614195e7b838f7e41c6fba3a4e5c91057bc62a874f67de9e23e5cb022e81a99278d59719203981d27cbef54c18ea53a9f5d637892ed8151af01f3dd5bde66ecc9a278c4e300b8f4c882de42b1e4a5cb87cc695d3eced8cd6a699090cfa17d68be76677ffda27f9a301628c71911083bdec2212a6fe2c758ec9e0e3273307be7e8880d0d6dcb78a29ef3af76282c3a2da08a65ddf94eff097d8dc8a41a80f74c925228ac21456acc22663e072cd06e8e5b29b0d72276603339d08f31c977a6a71a246031829210cc27555b353cd1a5e34751cd587d72a20f7d287659fbb26c22b79f06293c93d44f66ef11a23b60fd6000e4f61b5886da15c8059458711a5d453c59d6bbcd1de262e60da24c5ea336c3d5e8041120c476f2b54ff7cefdd3d96447bf5cc03db2fb060bc970dcb005957c868d07fb1368c8030816e67863b7d8b0f2fa640c7f9e384e7da9fc90e37d9fbd2882f85380772ef2eb6261981a81023ab34ef28117cd0d22e9e8d46290484f5e8c0f9d26134bdad0ea9bcf84a889ebd455e070ece16430603bb151d3c1a05c1dd193150538bc27a244f04e6a3db68cfd306ffeb3abd7e8f61d9371219b98a092c9d33875cc542abc5445c6f82a925112bcac23b3f135cad41552d420c3634269a820709bcafdd774cf6ef5d849979140017da63873c65f9b834efcb78f04ca748dc0371819d0a0dc38e98008780248288a4169342631d52e275646a1678972b5876f76a8c7d14beb98f240a9330a3aa546e88d4b4a8b87e89c13b9244d83996e80d1d3b961ceb875d48a12205ee0b3b4d0b647b8259565f559b90e0ad2db014f2d9a63b79bddbeab9a8d94c4aae14ff7ccd1cc9b40a94f10ac89c8db2d57a42e62fb035af7036ce7328bcaaf303a84b8b1515d345bd8f90a2937492279e49ac446e44c379eb584ac7a67d206cfb0cdbc1c73d7262376d82b0909ac5dfa065271fb0691722921717f803c844048a98b3c95d46dcda0a3611d00b14bf9b523009fecd05f913fbcd21305b7dedf05b12bc5c3f79debb0c23b5c244e9290c13ce4641b645dc55b46452bfd405d116d07b5709d28961438beaaeffb25975b26cab3c3288d07d1d6fc84413369e0cc90a0b0aa37d9f6aea0c1c3fa62b432a7b99c39c4a1779dc4d2a821632384db74e71ed7497502ad1b8f9eb213fc0bf7d90e84d17d0cf205f1762129c71ba456b7e5dd2d2997f676b86f545b7595d7927398e508f173301f67e0a965e05cb5be8fefab1bc49e874cdf014354dc9dd2fe8c4c50e94757b87dfc3582abc2daf71570daa0e56a47f9f42334fc519ee6fe4e85a3daf072b1b86d7e9c3a9d697047127f4ddc20396ec818caca1f5483aa86459f894211ac1fb6cd1f1809c6a70ba8ea0254dc63887bf5ebb0dd6c9b72d45f761870fd83a179dd4398ae5d001b36d0b7266279b70e5aa99807d94af855914c5c79c13a99b982bcc258909203b1ba4646e788051cc1b204fab41db3e5ec483abd4eb36a19f88216586ac0e766df4db32827c305f66e4ff22aee9b21646f239660b343dfbc2350ec5a4c793a685133aa4082d24da3fd2e157521cf479b6bbcf2895a7b06e924ea867621eefdeff1031da326338172e1c7b04de27d26458cd81d4befc60d2db91cdb3458c97f6fd5447194b242d37f4d3064a89665ee1e7afa1026ece0988639fd0bd90643189dcb3c468e9839bdc0df586401c9090d5476bd7e04804fdf11d04418281d90eef7f45258b6a3b643d0d032233e4d0efee6ed77dbf2cb4ce872e9e0dd30a85d270cda3a55cffa1b105b58deb261d7aa24927e22f7f28053cc14d2d7fe06f0c090be3003aa623cc15f8e161fa29d536e865cba77143b39597671f2a92f4de00c89c225b82152c7818a8621dccf22ae82b2e554f1f5261e17e26117ccc263b34db400a21143bb092a96a3b3f1a46048be465d9f307e2c7922f9c978c02b56b9f7641455e8065241e0a733179ab1c043c94770d77301560a815c811a499a7a89b7610e9a1350e2fbe222ac106cfdf6262a23bad1f2b216fbcdc739f6d960a810fd95711ed266c4969aba9fd915b16384c836861c0ea72941dbc88494984fabc0d0e283167f0ed97d4e2cf17d7787e037995ca144c4de90d5e084b7fd9d6094c4f62d3ba07f525683b49c383d8443e2698010b1100f32cb901327bcaa72cfb83dcbfc57da769d8f420c45398fe2d8d08626bf02ac7028a509674ce398218d3f4082465b8f732e31b007ee006efb43e4ac391931f51a266f908c19ac4df02d2f192f0ef815548f431ecbb0e228e61aa2206fe9f8ca197a81321b1035039478237f5eba319ac6d15cb71203e661100024708705905c6d1b7a814c9124d5e79469b7ce68a62c59abe726e6f50c31840254db3ba09476bbcd82865aa9665d27829d7704b9a9825ee35ee303942e8a70b9a878b492dc86431be5840615e10271a56cb06b372be5fec9972312ada4a6125b854aa83b13576c3594b83941384bfcfc52f656cf226611312a462bd9b7f4773976b06f54a537cda9e8710b380926475bfc03ddb1987080da585408dac40d6c83d9437ed81c954eb8cda7f3e0d71ceb4df83a49a0995f2baa2853e429b5b493008fa1aa4e33c70d7a949d7dff833b59ccc898cfc46dbd71cb98afb86ab8a4afe9ae81a82088190023ee2e81ac26587e813180e0c1c7f9e467fbf3ced02f238f3f9fce835566b2163f6a08e1ad1e3203049642b676aa63f763ba0354ef81228cc16f5949d71e333f953aad9cab040eb7754eebf3ba1fc576f2b25e0832c879f5485f429f1f57eb8b63ef750f386e7d42e39b654bc3db3a9610e12e5ee188b4e18047af9f16422c7ef9c58d68695136c17890c163bfbdb27080355a866cfce87bf9ff7d71e4d9892681a6c63ffde60b480784e368ee56c96f72bc482b0396360e44691255d37d80111f1aecf41130841821bc4ae6fc49d972627155248a97cacc0fff040374512c2684509aeaa8b926a0cc0b1c2caef1f110a4093e360f9002e0cf9404e105a90b918ffd6401a3d6ffeb15cadf66bcc0331ac8683c4d8bec3a8c1a8e2181851cd8815ab83a8224b6e0b5921456403358c540da44d0322a1dbccaf0a43946ad7ecedc26a6595a30f37d391c950d684c714349adabfe6a1eb2cc7de5a3bfd6241303f89c382a95d1ccfcf9ceb3da8b4e0feb9a2db29b68b13ab1d2efb4c972964a2fbafc0969b405aba6bdfe35528e6e08d3452e01119379259b1450b634604a974614caaa7e519e4c52d49aee431900d62397ef0222f0fcc390ace12507f0e3b4fa13d92946a5813c3e3dd7ba4ac9e590fc827ebed7d2bc5d3dd5c53f3f3cebe0316e330a89c42d094f397ca4a7a8433ba1f8642ebf6016f764bf5ccc6387b44e91e15f7f0eb4e45df93947376c5ec79593133e3344b2ec0b3c1ac99b34b10b3b977b0e94ffd1a75dbe872032ef2c5ac483d3dc943d50e2238c7b087744e8795dd78832427db39a814e7ca14fbe073b09ae48a8157c590399fb738183bd08f190e2a551ad36f18f31d201663dbd788231a44b3ca99708733d7b3b61e76fdb11e1eb0974454719adc10f26c79edf6f346ec82a0edfd3c587781b61db906f2ec1fe5143e87a9a16749d4b6afca5dfb57452307a80492870f25099d3b50977f02f5950079928724bb1c69e05e8aa58401763b012616bbcaf82b99eb4c95164728d6b0d093f273d5e1d18d4236bab124e72df96dde119aecd84e8cc21bfe69615d94476cba20f6e4bf88af7e98173a683a083b630875ec545253fdac1b6c90a6a42fede3a36bd698ea10705612fbfa7a9e986566035696e65e1724e0b97f6035a63e180b0df01a11f38d8531d1d91e37542a6b307d802e804949841c53fd1590a20f243506808807289e070942719f8aba94906d97067f8f419906e4a34be6833a305332893b66236d1de4e0d5b13e3d391ad0d1eb1cc5e665f1e4edf60d5478e76f337d27dd09146b29c16812b0b6419facb3b47660a77a795ea4309161001dab74f72a44bdd55dc348e60546803a071f332b60cffa3d4c4564041cab5e2ae2861e184d08cfaee2a9d683df0add2e4e9489a9ef5f96e96ff9cab71c0d09677881c2ba6e8b20fa4ea4624a96ba1ea457ddeec8e26d68405a773a73c73dbfabffc4f48e2529c490b057b286142a76bc8757984b1bf8ee3014d343f11d595969cd8276502b46e5fa6f15ae7b9d72c3fbc6ddd2a34fd04f9868585ca1ca2d476f427b4087148583f337d68af6234074f5047a1a93eaa104d3830a49349e1553f5383f39d5428f3502307ba1eb72d41e0ce53ee5664011ec086daee58267b0212697684d540fd3cb9ea9c32054ba6b15ff0e2c0fd63b232f789e0179387feeb84f20df5bb28e2063eb6f282a340d93cd5703236328a1cd9094872f8480a70ec9c3048d5780965969e1b1c380f5c6081b91ceefe3ab772be461df36843e6573564fcd835a50f41bb0ad3c26dca97dd8b84aff8671c0ec9c0cff0a106367c40f1936df0ac531ad7a3a371419aeadfa487ef759c5553bb095642e46fbd149fbd1e9be508841dc6ff56b896bcd7e414714e971bd96c3d83a3c1897e47034fb1427ccbb7157c17a2a667aef9f3f90c9808967060605be913af6734093738c6d3ccc51bf67fc038b5fc6d00416e831ae10d9b845e80748b7fa0e60bcccfa8435bbc6a02d5368385896864b6c42bbd9d7f3321c8ace8f5861419fcd196a9f95e72d54d62eb08739371c750d7293620320f4e2322fb0326b6180de712b1547b5f11a0dcd785bc9744232799df38a9d7b82f1d91714e43a2b2eca09d8bc3317f8b6b92fcbcc06299b5f403387a7c6d56baf20d35c0f49a67b17fb527bad293816deaf10e3f5ce89f3d93d6a9c0772d3dc3b2c40bdc2fe3ac71d1bb029fe83e3ae731ea600f05eb254c588efaf162bfa0d62c5c0c87be4e77afdbc41da681fd87f3ba6e4fc0e6593c177f043feb9e3caaeb9e3ee705c9dfb811d98cd90ad135b66b579b0038bed299c9a30e2060675c142d408e61480a22ac2c8cab88d9c887d3c71520ff18f708efe17dba8de139d5ed82147dd541529b89a44cf4c34fae71a3eccc41e5383dcd5edc0bfa2bc48f74cc60fe11dfd876d0bce208ec087a34515032ec6480ea6f9c45b1eabef8baf5f299d8113758e7100a5149464e1914475accda6f6fe6e25916439064ab5cd1968be3cb8918f21c22c1586411924522741a3f5ec711450d7637fd2c391cf131dd4146079806b4d17401a71d5cc6433d7ee61e6ed43a1eb4a85e30855b96429b7dc98e1a53e1fd5f88507b5837067d216288201d9ee8dd1e278307ada437895d7b0ca0e8993786ac3cf5f5ee5cc98a8cc7f8b1e96b513b12900a3a22d20bdc4d53374bfce341f9422861594793c326362f4f8441707e2ef8abb66be3784c359d7208caac09b4a3ac945c21acd0f1fb921c5f9d285c1718c0768d50252e0add516e6072b75f8197750b6237a5ca755f5af6f2041a2343f0de6d256b9485f3a126e2c76f040cfe167dd10b8aced8d5c0daceb48da98b7ef9f5fb4e9d62a9ebbd534c0e7b0dae0888ad47d9ce88fdb94c353b0f9551031368c926377b6f0dc3c89128d9d2614002bae91c73554d17e02ce53954f37ab47104d4525f6d6968d729227998f4de5e737eebbb81be50d1476075fedd84a500b14372f5eda5068d3917ddd197acb4637d1ed65d256586196526a3c78ca232e55ada4aafcb5914a5db46616fe9c8c14ba17e94b361dfd7332b75e85f0f1c1f42a92bdb9b479722eca3364069ede597c403bbb44400dddb2dc743f5c37bb786d70f5297c79bd809a908ddc8a80f726fd8b2e16c5ecf24b8948f7410284416d834d2e8ac70aa254408e255fdb95f9b6190edf9e69c338c1c1986c800aca249d0c232683d23568f70dbb2e1093787d11b2763fa33fe783db76afeb877445ba22a0420d00dbbfa90ccc447f1f1b8436cb62667a6133a96d90542fd07b04f1c5fe2c1bd607b4b672e12a7374cc82c761e74261c1a62d54d1fac482413a023aeedebfc1022be3651b05e6bceb7548704c48399fe101baa4ee59a1e89a5a5a76b30150f91104f53183ed0995c1635570788333dea3b8d8f365face8037e19f08146350e506406a0690178020e505bfc14966560dad4ea842e1b19d34506614513009a960fd71be067dee68dcdcb2474c37b3572dcdcdf0d3e8b5ad2750befe0bedc1df646b7453c60a056e3035401094667d3772f598d318e05bf73f0b0c199a0a6310b7abcb772faaed128758855ef097407188d8c7d6b42bdcc6a532725554b43d9d3f4dd65583260269f8afb27c5ab0896690ee5cd88d5b10a01b3104c4b03da511e7b5d308e329b0ea678fe376bc800c3410de0657e0e641731160d920bc980d935c8f87d6391e255c575403c5a394e000832447c7efc4838ebf9749f867da4f2ad17e5722e7cead8a9914b4c667fb38ffe336e2e7fcb62dbddf6de5bca94a40cae0731079407670f0db4469f7a9496a7f794923afe339d1eabd37376a5acbb842049eeeedd3dfedeeddded6d73f0070cfef7e37b24abcdefe9ca9fc4d5636acdd1e161e549b6322e54c38714850ff9a44a4fd94265dbae94edffccd354b632a357cbd184fa2c1a42477378df5de2362d76180dced6617587a64dfb3060b0143bd2da8b54ad0cabcd07b9c0fdf5a90d32d346473693513ad371f5b86432991299ac653654804518254bbfb71f73587f7dfaddbd51c674e89f31fab2178de9c474629494c5e8fbc774288de9501bf3696862343a329a190d8dc562984a2c46c5ff33528538e04ea7c9d37b1e6dba8f36dd963e3f9a7cfcf0f9d1f4631cc7f1878f8f261f3e3f7c7ef498c97a86545a050a2222a48995dd270b902c5984f4abfa348d63d348a58925d4c14016d39191e952154cee96ee3f97279bdd198fab747b787c331e4a3cbaaeda9e190feb331eb7d4a121636dc64888c578f4206faed5de3226847c6fa64b5680a85216cff3bc96cd64dddf8771777f9ec5546ef703ac23623a3a3db31e9d9e9e9eda4ca7e75a9d1ed9ad842049b5eeb6387376736b756ab5a52a5ad468cd13a25db259cf7828f5f7f0e8663ca852b63cfa65adb5cf63d6d3a653a59ef1e89ef1689d5adad0dc12722728091942a4938290d0a6bb009f36bbd2eba4503da0489851a5a52a9464ab54693cc02cc1a68dacca66b2ef4da8af33eb6433d9ac5fb6f4cf4707c9998eec5567b6825536ab5f19f34a9a1957902cbb6bf6a4e3f2a7fa32daf2975571842c93a0df7ed7bd4df7a70d03ea9bd07d577ad77dde40727d9b98cc6d649f6be9b2713adbd6e4d3dddeab4c97a07841f6f2c4364638cdf501b369efa9f5debe09f6636dbaedfeac6fd3a68c862aeb572dfd6536319a4f9b1036c8f6ab6d1b99f5ca1f9d4f9b3636a72d9f144bf6a740c5c1e19336d9fcc09d6efd4bf81c66636397aa64c9b63cf1d582dbf45cdf16c05fc8986342f02d5bb66cc9b6b441eb8ea6ddd206cde1ef2b10aef53ea4ed5e39d21cfe313bee2d6fb6234c0df7cf784fe990989c96ae3c59a292a4a22065ca519e329439c874c9892072bbd054046304ee7c7aa64b4d493252bfce0e4aead749a57c857cfa935ccf464a92a24b5372b97e3be957cdfd245722357ac04ee45d0e69536801f42bad4d279dd4486d561a4de00eea172d8d526842df7eb56dd6fa3c67901c8495fb2966f2fa486c3438e17023f3597f704d7242e45aab11b9fe8c5370fdfa130ea952432aadfed4ef5a33b5c0f8a2ca5252962a9ee4dce3a193ea9ae8a682cce49e36ebaccd25277448c1921331e4735c720289cd89233a362d353e211b1751e097293cdb1424ac1f6c295081ad081a6c2478c236c3e7836d85cf062fba242c5ee1c552134ff91ca5586aa289711c979a501a7f947920969ac8a1a98915bc29f01746c704b3b2e8428057517849e095ad074ca388ee0b2678c81e0eaf325d6262289fe3f8cdcc7a788c6f86992e318164b4852c205202141c69498ac2458d8708b088eaa2960213a4400527197e3bead953a45da41064436d891c6ad072be2089207e70f8820a1b1747e0b03f3631d9121329882c99a5256ef925d3a525bcc89ee9d212392852b0478eb8fd8e1c611db99656dba77caadda77ccaad4ff99475f7a9db15d5762daea5ddb5b816b7aec5b5582db7bbee39587b6f676d576b960186f77d9edbc0fab5e79dbdd752da39a547da524a29a5494255cea115afd8894e76f9669b435074b257b4cd1c8a258bf5b158a1e8a0e8f6fb557e6f43428a012383358386b3d65a4bddda183ff8c6bd44acf5a6d6666bad9d8025e2a49452cafaf961fdb07e46204624ac1f9728630c630c2e515847c618583f2e51583f2e5158476ad0a7b1e2a14f479728eeeed7258a1371248e64bf7e8d3ee0eab8bc722f0aee301bd794bd963a15de069f065ef7819ef56c8963a4f0dde82ea8ea020c55e8754c7583d6a0bb98cbe5b11bd94b1ce3c877236f20e2ef135d31996e90e987d66be1b5b712b5d9456011780412d930d7edd65e777b6f47d4f5077621b87259b9c48091c19a41e346db98986eedd44e5deba44efa27c776d2488d54724083c9d1d1cc8ca8db454dd444331d80451d8047b9bf830e40229009940232894300f8c08b038940b2875a48e8136d34f20bd30bb83ec92336951c70b0e2119b660200031249e5bc35839c06399188def8d313148e06c221b3326a5ad338306344e1703232311db430d42d26ccc5dc68b504308001d0c8d0fae4e474c34c92cf8b1341a28e6a5c95c2c474fd3e3d41414545352ef74daa4d3656d536be100d60003462539b5d6b75af5e5d74b211e085a84d1ad1f6357d4f50b9e9104ea97671e3978483598273d0bf3890ac4795e84bea17ee7bd2b097a72728a88bbbe50b5192b7fac71a2ba38a5491721080857c5e1ccd05b94122d116e60ae0026b10105012211faaaefad366a5b5590d70801ba4049c9013688e489b43c203d488325feee22e6e06ecd383da80c8ac8c7cc4549ae376cc01449825d8e6e2ae156d516051b71a249ae9bc10bdd86061169048b48144a20d24126d209168038962c21c51cc8a87eca8ce354eb4894d0d038b40221e20514f6863b3e2b1d7836b3f252917f793e9c57950a6b82fa9ab5d1178d4e6f51b2b1e97c53c103d58f1741edc970ab49deae26e962bd5e614081be45bde9c0df3d5b0180bc3621f881f582403125d1cee46354c6c126da22dfc408696c3430c5cafedbca04b72e5e72d7739c2de83a7aae6a332bf57df2be07efbe71844d52f13eedb1dd7eb5abb63b89c1bd8f1eea427274aabd46e2c21d40a73a5d65ed1171a8386d47b4aa9f894e2a7945210fc8a724d51b9cee42acb954a013f4a29a5f934926dfddb912b97171c4315d64b77b0adb5827da5609f1e3d7c7c805fc4e55d5efcd577d3efd7a137a0cb37ad55a1726c939e3427d630cd74c7a58ce9b1129ffe18866118866148c3cec78aa43b22066caeff7d638f27f1e6b5408390706d0f9f7e9bee878f1e9e4787c5daf59edf755d36e74cac08fe80738da15f33ed9bacd3230b067c4b0c43457d3ad3354ae89531f68dec78ef3fc4615d1963cb1e3f2d7f233b314d624d7cbe07fff39e48131ff0c3920838aacadcf93ddd0199ba32e6beea4fd32b636e19f300efc1f7e94abaf39531b6ec69d37b78cb5f1506764a12797b17def67687f4cb84ef3df08bac3e2cd2c467f5a10f71d8eafba9d39b2fb7cbaddfbc895030dd5995313dc48ff1095fa52a4d1072f3b7facea7affa8ff4beded348f6840c21229274e7d2ff3e8cc7f1df343f766d29c3a24f186c0f8c90be00ebcc7a78b85af57fcd362f0fb2879ce990336d66ec6fcb77daf7fe81d7a39fa804c7c02d329f363040dffbfb44a1c4952ac42025418c2d922582e2fafd49993afce0d75a49911ccdf0238dd054dfdd28a71ed407c998b7bcd5b52f45d94249094051a2a4a2aa0f200ebb654c8fef8b71c09740a5729fe02d20de6a82e98e8b12353499c10f4534dacef7de37691223c2fdef7dee7f259126f696f7bd92c8a53bf7cfef726014634b5518d8cb1f3eb12a9a1c8b9fe1ca0954cc14ff80c902578a5ba09586403d4aff1bfdba53ea9452ea14f441a9d625b5abb5a1dfbbe299a95d573b996aedbdf75e99995a3d06122cb6098345094b2b75588f0e85b9bc55ffbd55b1b7288c5ad23ae156813e0c14b882e01f9078daf75a7ef8c33720f813bf4fc41feefaf372fb0171d8f77ddf574d50737f78fc4c755cfe0521e1a350d5895acb5e61b47a575845aa2dff6eb2d6622e937e316fb9e92df7d1a64b6e25b8fee036f4c62a018588ec5ef5bcaec1a6e475f55a6bb5abef7dc58381eebf0f55482a15f815a9617506a424a57ed9e8520b7e6aed48f6722cf0403e2b5353967cd626f7a75e71d95f057ad5f33ccf7b9d3e47dc0f201dc520b0f8ab5f955cf6b76193e06fa4eae1305ce2d04573b8bf01284c04ea0a02d77cba5cd45602bdf1b2bf0f870dd11b5acbdefd49a5b21bd9f1371d2c631ea0faf07dc45f3df8ab924813505562f08dec80df87bdb2bbb9fb6f530bee689b9dd40933601e5f39bb82bb3ca1c7f985ef22199294b66a8f5aceb4d99546aac70eeb318ee7e7ba433b206dfa8b4ff625a76a62aefec4f4c6258b4f67a50ee8856bf5eefe3d2e8789ffb2560dcde17f7a99fea53806a0057015097ff545542f7effe9aae2abbec8eac32f22beea3b067c9ff057efa37ab12c1da0eaa0096d0b1139ebe141863baa5cea842ee05bd2cc4461f3da6710d6949eb49226ea21a9a92c4d4e3624274c6a5015aa40b828284a6b5486e67025423a7376b5ec5fc3efc3380b7c3a1308b8056cbffee94cdd11cde12df5fe8e14f324afd90802778e0493056e772427f446080a7325dc0923b23f652a9d09095ca44911f0bb2ff2bdf70e051769e2e3fdf745ba07bf88777e31f77d4a11c092ba4ff7de3be02b63443a281aa204443b5da9d31a2041b443779ac4001aa90fd11c7e0457182b35ef6bd475b75c894077c61d42976c5f2f66aeb15c458a290c7ffda73097afefa2300a537dadd4966ba6ab6acbe47bebd64c0cc0b9ebf2cd2308b02d59f54ff133e2b52fc959cff33cefafd7799ee795a777bdebddeede1809f5fbab40656f21dc66ba5c31578cc65c362e974dcc15a3b118062b2e97cd9fb8df596badb5d65a6baded6eeeee6efd5a7107718a2397cb7bc1e5d2124305206d8686c686a6b3e95777bb8edad0b868685c363436e6d39c544a2749791a1a1a974c97a008237bd9343b803ec4b05f3f1a8d46abd1eee9e7eeeeff5fa54af6cffd35fbf35de9b4e8b4f05a6b75afeeeeb5ceaa57af5e6bb561a94a5075c5dc633a1e731d59cc3f26d3e96e4ca76dda6c9afe9893cc4967e6546badb1584c95e912143264efd80cf59a30d7f9bdcb3dd62feff6d16d5cf65dee8ab5b5f5e897bfb52edaeaff5c9e1297cb6af93ea12c5aa072bb9f9a6e93806e0bf902b55392ff2079471e913774efbd57e8de4f9a3a1aaa79d4763d246621caf7e807292849a826de84a8fdb08c69c37a1a574c56cbf76d7d11f2ac00c24a62f9761395d46cf35e9a36bf7b5fc60c3ed2a4c996def4dfbf4917098b45170311f9be0735ccab79eb2601e19cdc983815e5ebd99478354f12be00897c5750f2fdb38be17e47ae704c9c98aa4b8ee6b82f06791d8eecd51cb652c2546463e294af937c7ff50497efdfa8e5f2fd5e09b92ca96aae5b81dc7f3b4c73d43f2d803dc61de7eeebf0f041c2937c1bca0c4af7b3cda0746568ba6ebbbbbbdfffbed4be3058c0f7dece4b1b99525d40539aeefd63a73f2dbdfb599b4d03191b41a9edfe2c682dd9d45baaeba4773da8b7f015c7d6da2f94c2a715ad9f375b51634a0c089d65680e7bded3de20a29756d81745118325702136d723369a9ad0b6f876b77d9aa356fb597b638693329c84c9f64551c4d65a7b59224bc4d75e1878878d63c0a7adf7daeb366687bfb5ef651059fe72105936927b05a1d82f6a6db562b562f5b26bb6228fd7fe1cbe9fc396565a8a78898512d219eb94ef51bf77ff3dddb19dfff745fa41eb80af88ff57d29d22b1223adebaff516f792ce6b0181ff0fb411d87c5f8b493a3b7eedf58c37020e9f0f041422ec7f2bd37bc7dbdceced0dc19ecb0fefba3c3bcd2be7eb1327d1fac0dadf5acf7dded69b3fb19483a0ee40490bc250ce957fdee898064accd0e74b5d9618fbcdddb6bcb1811fcfb7dfcbbdf471f15117f5589e94889bcb7ba57d5cfd5e5299e62a6a512b8a7eb1e48090ef39b94bb2e7d0c63be0f48c364682508c9dd921352ee6892e44ecc5dd7ed7cde1d65fdeade65d32ffb407448ddf89d90f705163c14b600b70721a5b5d26aa4d6136096502a325ec0b576f78a077fe8dead785c3eb4a2bdf7ae78561f76ddf7a1e7d5d15bf1a83efcecf759917e20287ea81a573c78c5135251f43e5c89325cc0e73dcaf5572e2ee1cb0bc62fd8658563c4c018635c2f594331fcc89ac3d0457c595d203ce2b6250ba15fb3cb2a043f7258e36ac43c7d1f72d88da7ef440eb3d132a066d3f718e8aba58868424deba88639cd85e88d533ff5ad5fe1cbe5e937ce8f5cf7a4c9e0aff03b34aecd5b8dbf1bc55054895fcd2a7145d6fc8522b8ea3a70068d7025be9034bc9632511ba1e6404cd4727f7741eca956325aa8b1e201df65a500fb223a09130a1d11943db0537d4f4f50ab122757aa4a1d351acde1e41ed11cf541f232e961090e190cb392b94100a71aa71613019c5a4c33be4b1ac9dc7286bc45e4adcea1e5004151f1e429e38845c5706da2009f38399c5c161ca97e752b4f87d29343d156dd0875d4666a1ed9aad11cfdf42496674341454565c9f2951b20dd6ea696fb0ed11069d01ae20bcd3280f059737bc937c817ce5b7d3b6af3c5e485f472f24afaa878e242ab9a5bcdcd5b35b89a5c4d969a299cdc13f085f4725273abb9959d433b7368fe93433b6b6ed97683e80add2012c7158ff8e34a01e17f46355ea73b24a68fe6106609767205924638647038e5f383a10f808462b8584e6a94a239947430e990a2c336a5a5294b6e9c9c3b4e4e36941b47ca7172de92d16440b22059925247cdfb6e15b750e5a4a8225f4e2fa257d1ebe8c5e4f594fb054513ade65673abc1d544d5647921cd68d400fd91617eba4109e51cd510faca6cfb29f8a44ad4684ad466563caa779282a0aaa68217b276304b70df7c83cc52346fe55cd2939a12539b343cbf40cae9434d388796f393135473abb9f5cb83ea97cab6d39f9bfac996673f41b99435b71c5a4d5973cba1bd9042a08fc4b1a886d5b89f476215eb43a0ef0200002b9e8b9373a31826294d4e6d3e512853598684a072683940426d76122546353a5a8893a56135fad5d570d241d228e647328756232628c907c206592c73806ac0e7bd616fd5af718fba919cec8e92343b592925af93358bd585ac199335bfb851cc83a4518dc764a5396accf879cc213a496b6a6e2800bfbba5fd5b00d1c91bf99246e383634983c42ed1491bf9924635de92e5e7adff0d36103758f1d440b5d9753f32e1ae0657a3c18a076774c2670e2d47a85fdd831d4e2eb4113d109d94912f6984e341d248e66f903b423b433476889038da01cab6dc949df253be793b2d64a8efcf9f1ab34089ba39b49ca19c9c229b08bd53e37368f406fcfe2cd5afce6132df9fa71a16cba151247e304522684cf24a3a862bfa6088094ececc1972d8084cde7a8de0d466d3d70856a8d93934b2c605b4d52f43d65c415bfd2358a1af9a2bd46ca77ed5dcda7401bd99f1fd355cd01b19df5fb305bd617d7f4d14bd81f9fe1a2d6ab2a0372fdf5f8305bdc1df5f83a337f6fb6bae6072d80837afc1426f5cbebfc68a1aa89a2b3555d09b900a7aa3a2371f534500d0679101b976c63f6bbec8fd35b9d631fefd3c38a9920eb97f849bc3948e723f92b520c8fdd886dcff7243ee8fa124f7c3e090fb5921c8fd3272c8fd3388b2d3b022673590b30fd01cfd97541a02c9ce1f398b81e6e857913319663390b32434477fcd33b011906be7c6cb208d80623b371e26c68db7f731a901ac8131dfd2e846499578c87d5225a3dc3fd3817ad0de7b59869c0d65af9c09c5700e7b3dc9fd4a3829b426a0d7d3eb83a19a5b57be9086c04a42b79b549194849c74c9973492794b9623dcbcc5c10eb871f9fc98d407341d39528714ce61319c7b0c87d3f1913a907438d19144ea7822031d51b95f0716d4690ed3a1a403ea9fc626ac43ca8793c3c9e148d91c863325fbc9fd3456208cd92b75d4fe889a9b2a2728e708bda1a2828c02c51981a91680360254c36a7cff08b71a244e96e6f94a1c14609c5ceecfa1e5fce400e124e1e03c69586ecaa1c57268b11c5a2c8716cba1c570b97368b819793563685ced685508e2194347a24a0913086e60cafdfd8c19392cb36d0a3eb150ee3f73683342d66a4767f0fe0da19adbd008b7be33e44aa9dc9c043f109dfcc21bd1492fd701cc705092d7d6a021f3ae2f3358326062b8c8b8d0a054585d0214ee033e58e2eec1e798ebd37ec72d94fbc9670bd924380a1e427374d7f9ed964f5c71385a9e3577e2f2ac52dd956e93d8247648b4441606322eb0adf03bd703207067cfd1683418da850a95cf4ab338601932e053ac341c4d015e1e6574c0f5a939451bb96092cf4aab9806d41ef4c79c00b3da6c5b844580cf4a735adb5073b97b889394524aabdf52081112e09366c9fef56916cc9431148bde6bad932e52281a398488101a4e64f9fe4facb95b435877e84c8d1eb058816a3efb670ba17c56a0b33d90fb2d0e628d27f069ebd387e18b7acae7e7bfc2efd877d1d49ef1680ffac5227c7e390139a26ed1238c34267dcd64ea16cd09c8c58a66b4906a527f85df7179d00fc600c7f8d34c1373cee4b6b95d7dc39216403046e0fe9ae9521645f9a7d23e8adb4e7d5bbf543176d4e014ee18921256b1917299e61d3438e91765e2c129d31d4352fa15e32fe5abf8621052a73efe069d825d227c81eaeeee4a7e944e093ffb15b364504a6917a108c3d7af76bff1aead97dddd416d6957d2eeee7e0abd6f37a5433397569f9696bc1687061a74b78b08c55a6badb5d65a6ba5558346a2371b7877c74237b6fddeddb5dba5cb9502ba5a6fe169e250b31f57fa8ab5097a534f000e68daea3e55ee34a0ca16a4adee714687c5a02d32db287317816ccb6c6f79b7587fe976dcf786c1930630a10d085d87d6bcc05dbb76db6e21dd8daef0cb9f232669b7914c7edf77f79ff85d589e637615489e9dc5f2aca7912792554455a802494de5709d8d367dd79dae7ad294e768bfff2e40247f9ebf8e3ccd8e6748f66a39a64a24456da799bb0b0cc9de9f1db880973ddbb96f5757dd539bedd7a4042a686a2a2aeae969e98a945ec1a9df47ff0fa86f476ba582a581ded05c832a254f9adc9d2e6bbb526b6dbee5d9815c817c7c9f933bf957bb00b97690abe33867d8e4a0383ee88a8262790689995e1838e420093e6b50ee1a44de12045b83fa659f8cb1df2198d9be2d5d357b6d7a2c46639596e747c9ee158fccc6a6cdeead48db6fbdcfc10bf8ac51b97bd3564bdb76a54e7300848d80be1dd59fdf91ba6547f53adda9dea65f34ddeafff037be3923087cc6784fffc6786508a6fdd2c96c551dc25a032ecaf497a49c645a0ae9a7a615413ba47c6d3e008aee58c2293d81f4c4d11339506f41208a174ca278118b7ac0141625328725a8a76af32f39a143c5ed382556a5e5763827d6b34df97041385a522e0a1c997c62112a4c82d00a222c4a714515bcb25247a3172e58aeb0d92b6a4d5cf12223d3a52b9848e12bbe184a302296ae29061820645c01242307d6948825eac3f284a56906ae080b0a3096232c435882ea17068da9dc5fc54a3d2b8b1a4f4aac6841be210ad2083e6d5649c1563c7192af3c2d59c1249fd6668346113766f010235a2b94e4a64432ac252ff67eb32fcce728f333e3cb38a1107a2b8cdfed853e14bd60821d92d0a08253d0758a6145bb402285a90e054c3a5a4567d6c3a3cbe74cec345d579c8c3f5ed161b47d3a00e1de0a33a8a7a1a9294634b1258514504082021350901409b17a02091c56892b2613596215577e08e94ced5a7d06cd5691a4ba4873fb5e9f61a9c0d1ebdd62d75d974d9bf44fb146ada9704271d0fa3ac34c6fc8b4db8eb71b1285719927a5dc27c8f459b94c8da85bf1ae78ec779d8d5abd1dc5a670ca27b5e1a0d76d6d52fb5dedbedebef73be780071c84956f791ac9e0bb9bacd163b8505d054c9fe64a25d3a529a4b2156d1edb90e9d214b64cdf4563997a0c219cbf107c8b0cf2e7226d9ca64d18f057c230e1d38afe21bdf1d2d21cfe5488677f2314468346df4687870f26998ab6262e4981a35228e573269f34b9bb3e3383804cc57c8aac3659c04f6514e6b980a3414a8988229cecd09f51d84799c2e94811558e9e76682e46caaded3a2f582170205bfbb58b90f68bd2efb258fe4940f162c826e1c41a224664239e1f14175001b3e48ec9ced14a52ee31d3252b445690d0ce87da514f7ac0c205a426a503401161b4050d47829040306405e88a504390521316846480010490b042b4c4110ba65852a9d0fd48c860cb5251cd88233625507201e926050a513e606ba8a205d8720a01d312535b90584202326891830b504a6004092a8e55a193f0ee7b90f41ae4e9f1d58e7eb5d5c0501282920411131ab0d0800a5a5091e48b21b434d919c203a1a5a12b4dc152152872ff27b2440064ba542588fc92e9529522251fc20d286089024912453b78922a38e006a8a034450811a460348211fc6287f66b611b562528c6cb62c1030d47564ec0c316456e67b0d9278b13d4b04511372d4abab3743718158a2b9f52a580144a48e1c11695040b76ced1ca50a958f95cb07444e5091f80942059c235db8f596b3abe54c0f8c1c202146d07308ec4b06484c90792b082e5052d555c819fc865b40229211bb658199af20919f1e5d2072827a884b1040ca49879ddb1097ccecc98ae1ceccd00932266c08592239618c23d9074b31230c860850c5fb0f0022962b7fa45b049feb2d8b997d40f1603b37dcc52959f4aa552952758b2a8579edf0eab6175c722a90f648721904889a28724244e764e97ff0083cdf63103be80c2c51038d4b434d1ddee8d858d4a9105125b10610224465590a86c366c70d282899fa0232b8c6fba624c3ab61e62401c790009d31095a21aa4240816524021c114a71008f1e1f15db47d0613d09880a1071c0ba020f1820c2a234514c1e4862d515cb1f2c57d7999c086255d2c81418820764e57b60f84de7cd68525285ef030b66f3a8c42cd00ea89125899e202931ddb9d82afb68bf676b5a558dad37ab7b4df019f2aa8d48c1846357568080000400083150020201008868382c160208c026df31d14000f6ba0466c5e361648831cc86118a50c22c610000800801063648686660402a83951c1c9ae87a05e62f374a8638cbc2c7ee89d06db23c06b2175756614da146debbdd907f479c0364f8726beb990490cc8913ac109cd9fb7ed0e3195f38dbb87cabcb9cdd6c52ae3d166d0ea0bf622379b881bc726b9c9a3278dbeb43964e058ccd434fd42606f7382ed919ce27f51ee3bb87690711b2b04c4ad59ada286b8f1cdfa613022127c91ee6e13f7741e2e1f4a033dcb250fe07e023a9f88379db8f4bc00452d1c16cd0c4583a6c9058d8314b172eb9507bc5298857277f876b0d5338ecfcf60d7612a2d76dd88dfccb9fda346ddcf19b348f2ce298c89ec575d0010ee05a2d1ee62d7e37886f2a79ceb7acc7bfac2ba994ee64e7a54d17253a878625e28b642ede3050ec0a10116646b714ad8ca82c0b5575e7450dd5a1e3891e95242a15afed539845fdc7b58e863eb179b5656d4ab2cbec6f63843b6bc3baf12d0c3f7586f12f74b897a4556aa8c89ce2eeadff8ab0256e4d45a993307ccb07b0877cd09837d268444246a17394050f6585f46aa0a4f2a59b1f81482b36a1887bacd0381784f08475f40a7ed34d6e4aa7c7ce365681c007b8f3b4b628f6d6cf789efba2ab7eb8a5fb2454641bbcc1ea87bd2ac4419027170db9670710adfe5530f9f6e9ac43b095eaccb85704602e354d875f7a8325809541fc9e69d231851840400744cf667e0810942b8fc8079254a304bbad3358bf7e3ca00aad02ebdeac77e7175940a064719283a2d4390e80a1caab6fcab09cf044a0cfbe82d2524f317ef98eb092faa46c7f8a0b72651864b0f39c74ca20afc90a312aae03243fa8de737b11958e9b0ab44d319cd09b31de62a1512ddec98c885e6bef4d4d0ed7d7a80f98ac7f5720344e00faeb3e29369a09c37099956de146d23150c9e7624e501881757361a7b54f40014c6589a18b98b00bbafe8fd31a6eb0deaa7b59da2e4dad24d395df6afc1a5a596a12828d46a691ac35aef470c00b90954a9bd1c339a54eed25d6a958a25131d164fcbb89f3cfb015b96214390648887510a14e5220c1e7797649dc5952d35814e162138df625a4669b990024a33bc36a63757e39578ace634b776d42a556351b0e32a34ef5418292454fc0cd0b6e735a4f0823e426e62543316c810b9dbc9cd3e82cf0bd726408b41ddf6b44ae238c9a0f33c28521f725083f0b61748a477c963226a709f8de6525c92a43cee62d204597d54679616b5275bc91d6ccb22ff28a2f85967737b2e9f8b3aae01db75fd12f5d3691819e1f13734a32370f4c25f189c1a1356e76e00ac2ab6834915a0ea01452f6410189b0b84b2ad31da847c0db4227af9323ad02756456e57cc8ccf5aa8b18e095538669e7040935057476d44d6978e497ef1dc1d2d1729656fdd29f48a3c10a50566cc6525c9fdbee85494c2975d46cde707e9bfdec270aeb19b261b57b51e048fbff28c34c28e8c76e73a94611512fd99366f2e8ec5bdda81a22645f2b714a24a60b82deb95611bd72b6cc5051868eb2488569ec7d945760a46520f8d65499912fe3b41fd904d935ed9d7122b5e9bf1e850d5a432ca7c22a85c0cb2d5b47a1dc7a8d5b625ac178a4e2b7af66dd0c4029acc471cde85b71e3d193283419370cdc0155ce2f8e32f37541cbbb9a3134098e39953d1996a01f62ddb786ebc560e14cb982defe056a701842853f60fb3c40033993ee9a55f7601fb7445b789a88e64e269d6f8dfde2e3d70109fda60eb5edf399da807ed50b2199cf000ce3271c5ae74c2c86079cd85f918412f90748d58be2062914e9cc4471e30b0f3e6ff9bd1092a65995912bd39885d083e02ce77af195d878063115a265b892c98123bb662e404d6834725ffe80711522a4cbbef4713bdf710951933272f5617f2984fc5dd1532a50d8572165db7a9415680ca24410c184b1354ef4618a5f9ac6643583719c60434bfdf3cadfcdf363807f12d226263bb4623110b1550dc35dba7a6cefb60ca9bebbc6b8464185ac08b28b2e1de0a6a29e16e7d8836af2014f2925b55e86da5a00bf373c0990f8653adbfc29abc9938a8af7cf9c8f1e4b3d2283f3cb4a3f4ecde552f432dcb77fa600446dc06c35f8ae5e17388c2e2df5aa98d9a7ebdb6845adf1a73b94005867543f7ea52798b65cb9f91b5e802b64518f34761a00015883e8e3242ce9dea0f605c8e8c8aae97edb5c606b5a29e02e1e74f3732f1ecf063a53fd6e9a1ba998d06cd6500fc15f26ac421dceca784e412883e2e7314584fb507621229401952a090f7bee1728842118f18894e8b4abcb95ebe06e9a453beae24c7677411bd55b48f2ef8019af82553d7ac8baf7b47014e6311c88553252cd6807ad0af5d0e09ca85395ad4c0dc6001107202bfa0215dd608a2bb7f027c20ece97eb8fc45e991fdad6084e5e8e32e36bb842f0c3926f2375f9ed14a3914809837de84b7b0bc55ac34eaccd45e72bdb1c6e4b0226d135a960db9872d91c834bfc1b9a606307275c8875b941825b9ccba65f4166f1a5d79d3752754ad8188b4e9ef9b2a05fa55f5ace91207f149f03a8d3e3c1c464fc8ea0b6a69c196d2360d367f951f3b3fde11834b6dfb9549f095b560584e0d15014878d5a48514c1e968a70ace65663ff3ebc763f618b413f131629ada2436f60b2367145a673eb18164daf19fbe865ff194c47186705eeee8986d665bbca84e5fb97278d7ba8aa05948f269612e3efce798bd7a015a17898155c36f28ae6326cf84590581ca718da2a38bf70adcf4e46f715493c9341a2468bf10d30a6c53f0c609bacf9e9d0c8455226f68e6304c2dab7e053a23f50ec141af4862742ef036845d778e4fb42932a4531f6e850e10388f6a6de91c01e32f88759a45209a13ff2fddb9a1ea2135bd9885d8a061118979855a453082432117f8e01144c9617d90568bd4b1b153a1dc59aacd526d2667a896f5eed5fedb6cf8d8021642d7fd7adca0a706c39b28b43bec36435219566457e810e684958464b056645ea113fb9600c5cd02abd41309b3454b2cb357b3329db2a843ca987fd09fd41fe8efb879d25d9ed9750d1b0cb2a76acb6b37b1cef83c13fe5f2bfa9104698b06a28a582065ede5e8f00c7954db9d9ed6ca075551912bbd3398e4665e6941a11179108653805e4f54d425dddb62865508b0c47d8278f320968f554a4ae8c5d9df8d0770462120350b2f996bc9709601b68a98b8a8f6b4a7d23879f0efdb49a60c39302e21fe79d6d67d1e71e6e431b98bb15bed3ec77d2ed0e22e5799013edbba0aee6078d1375b337ecc7f9137ff5f6a4daad13551d095c41134cfa20162a2e17ad48c02eeb229957145b5e6104cdbb2fced840c1552271317ae2d108e3e37685f1246f8b735865af9f5cceee4bbf20c6d87559d0a09cce3be1eed2dee386af11edcd648f5531de60db2c481385d970bc0706ebd06682da3641bd21ab2d7b9a08fee9220050fa98b29db0cd485de3835b2fe8d3abeef2a9101e51ebfb2650ab388b1091a82c0ede071b7d52c9cbfb115b02304d74267c16bd1a1547e26bde8b52ebb601711e7ae092425ba2d8040fc6ffa243c449eeaaa78b7eb26d39b329eb80ededf382b8117ac8689e1aad0c1d3ab616436259d931d1d154fe57a062fb0189e84eb239026859e659018d045851a6ad0a71d548a275167588429d8064be8165c69fbfd56261cce579a13b8c7552d2b705f15195c78597367559221685c556f7fa18cfa5e07f7bf01fc74a1c3cf90a187069a3a09bdea4ca7a9e99396a0f116086d0ba0b6deef40e7650acf3d3926b81a0d34c111f2874096fb3873230d9b034f0259c22745f1597db2da57e5d0a4544c166572142439f3066c3b387ef2008dafe2ba923a4e9e70bc19083430eaab4d13075d0780f3ac101ccfa038f1dacc1d0defd21514a77ca97fefa081b647aeb7aeed91d5a309443d354e74e93602a4fff8a064f7a66bc0f4f93e90c1be47c4940b48f0043b92af6abffc211479c664cbfe06ed6999f01a315c1a3c25abfb4f6a2355ee04d6e458b0c7ab256823b0ff49d978a437c4969897f987e377b266ccad4d9448a11f6cc8bbef736d8906eb87c679572c2ec2586a4eb0722466ef4115649622751111fd67253e7310fc1640e78a57c4c01fe073f5ca28c2688a64ae0d464d4dc9e099a8c16979303502e08478e8330779b5613daef3e1eea588f02b0697cc54e1617868c6d0c09b88bf05831345db934afddaf2a4088fec64814ce12fcf23a33bcc25b8ece0dd4b82de0a74219abc80c83605086af18a3a4e8c103c8a8ac5d915476405cbcdc2fb8f4deb68185a8254c14346bb115701fb8479f183942e3c9935debb8d161b287d82ba01ee2081812e77426e1fe2cc84f787225c00cb9be9ce05f65844605324d2d12c8df14372abc6154f539a47bce1a9eddb14f9d0545194c57332c0b890ad9905091063f8664e01743ebc6ce4d357d471275866c79692577c6e64c27aa8cb067dfa3d9a8564063c4a1d16a9671e3200e8224a787a33a205beb627d2f04710853ec4d12ce6f987c0067a2b00a0eaaa4cf45eeb69c997e3de847fb899fbc4997be9db168f73c4fded8b9ce5dd86b5a19ce6fe717ec85ad40fca11a35d28fbb3ca3e714f78b5ed76f6a14b0cea3049afe9697503137a6043f3c94e6fe52f2b60d930922d8b6288b7f924a4a4063c2742f1946f71a7d1bfa94f3e1951126d891b9b3650ba90ed414ae50495baf69c52484bce7d9a78a86632db0c1ab61d5d82c1052bc56aec14b73442580a3ebc3cab5053906601efdd82bd942f395fdadd5a774888bcd1893bb81f90157c4a8c21a44ff994131edf9b588bcdb404570c791d6857604f3e2025e84b2241594ab57b9711854c069036cae42eedac73e47e7b78a1979a92c0a3fc8771ceb79da9213c2baaaee669043a4578e213593d2a845b746e52064112719a47aa2977afa5b0b9902c887c2980bdb79cdfc013fe2e189f286859b59b4393cde058402d911abd650a9ae18c0b9a47f1fd2a1e94745816202cdaef7432b62f471aaf5e5d9dcf6e733a66925398a8c77706f6d014b4646b18432ff23193a4bc938a66329d78ea426094fdb635a30487f3cd165af792c8120e589b1269bf7a684744e2a818b8ab90246c6495ef07c6d722b2aa86e1601c7ed68723fe45060ba90f4558e9ab6bdc5166f58a8ecf70fe3e912e5a98efc3b77fd587435de24e1729cdf2c7df5ef70bf78090500cdfa5e9a0a2c8c53e2d3b3bdf4ab55c6db2e4d8556f092c4b1b06b83934870739a73b466f31b33cb517a94e70cc5870f76b40b885b8db27c76a69fd91863b114ff7ac673732b5a27618020bdf68dd0465927e8b77d4d3dd6f84815b83f1ec0cbee0da6385b61e35b2b5a159bfeec0810ed732301245215e38b7c6b43a45f6a88a88f91ea2c9a110173d2499f2ab41890c9dfb5a4f930ba6a1fec219292b74e81f3adde5cefe154388cbf2e237c39d69ea726cb3fe9bc5f40e53da56123a9ade5dfe23593299e39db04500f5a65169b38716a2813f92ea3b2d17717a76ffe5f9cd569668e1868c7713516685494391b37d68ebe3d26570b9e261a572183a047ed57d89c4d4539c73fe16d6a1cd65c0fa1e56418588378a8a29387faaccb0172b6cd10a338dace4c2debc630fd2ed3d1127b7fa1b111c2e97c66e73a0105195f4dce3bbfb864b753ad86fe3315a256d286092bfd0989309dbd558fb68845f62d3a0487d24da669937017da0f0bc6142b6789c563fda6ad04fb3ecbeb94969667e67eac48fbe0a002f4a6bbf986d2e272488d54553fb5f538e3a1dd8c5b62e35b22aa33604c5e00bba2aa4422c6e89999c630d85588c29561252d09c49ee700a7dd4b95836162e100fa340a7318bbe4745f43043e6808b3f799a4d4fe75998e8b18be5a5e2e314981bb613445c9cda1749423cd55be5c5f53a283b0480bf86f98634a152850d82d7ec2524dbe6cc2dc2dffc9468e2e7349d78ac149112a1a35a0290a1384e3c889b81fca11394180125e3f415066ca51b2b34b140cd1e53a9b12cd9a0fdb1ce98cc259276e0b6c1d0315f03a02ff96218137b900a90146d4cd5337e1e7bbcebcca88ab54a81b44cc207defe6fd1594a540aa261b919ac113509342c01528f745c45731ab4e48c46aad19e31c1bda90282b55aecf70a6147b3e2d84972f65d3dee829a779bd20705a4d509eb0d08cb482deccec079a3b919949119d5359617a679a3ca1a96180a254d2f423a74bd52b7b7519cba3329f834b20ffe8a772d828300d1f00ac9542481eab6d5ac55d94e9a3213e716346fe4481c342208841c4a6ca02640dd075042c81e410f788fdc539a1299ff30fed53350e62b81442da220f7aad3db28a73419423d23a26290f74f1af0b61f8d891663c6fe0a6ff720ef8bc2064f6f002587246a8a8efe8a0c22cc896dbfe1545b65c35ba7acaf4c28de85bb2cbb81a1ee7b97b1d208bd13faa6f8843e55bcd3a8bc32fc441aae53e5e41ea26fbb4dc8252cd46bb6edb354f8501589c8787a55c53430bb78a65b1137b05ac8fc65124250db2e28374a1e10a23b0aadecfae3f4c1771839e308adab1c8c57b7cd94130a12c7be598762d65af03488515ffaaf7bb902e06050764eaff4378d1a1c77265506cb2b43c14b2d0da2e27e0cc3ed2ff2b4918dd03654c56efb3757eba40f8ea97368b1c1c42d031bf89f522df9c6663a8f1ccc2a1b898a70a31fbe24219ff65d0f9022ae0bd10224491ab2742b8301edd839a0935b92b0ed3910de95b01fe02a2dc9e045a78bad10f89df66ece6f64f1be2422792377042631022c5153e748207551c98fdb1dea979df97d9748508e90ca9047729e5862ff0ae8c650261cc653b70881733c32212b272e3a855abc19120c69696f67d2344bcec52253fffec7850a7a52b1dfac8b707061410d2e1dc7e062e1cf5809a27f9c90645c15f7b5e0f8f1a81c95a64460e676556a4fb4dce0fa5688232909f9d93894f644c2f3097a5aae60a24093efd0eac91034ad2f8334a9f54069f06a4e14b52d9453eb25b2c1b11cc1b2ae40478f525f1e312db6a0293e1a9efc08c3e2edd4ca60134715e2426b39f60f46638e39bbf0266e2d54a515efd6a2658975b0adfe2740a0da2016c58f2675805e5b7185ca3a7bd585572e5924c23714e549291e6a5a971a05425120717c2b6468c04551fa2ef8fa8bf7d930536c3d2221b5171545b0f4ccecff640e6d94ae40a01a02d98ee1f1b976814f48f92dcfd1b101e5bc4c2734064a7fc2f424cf7be481a550566ffcb7228e9938b4d307b52d4dcb20fecbb204c0cd841c73f09263661786e21dd139f54af538b0208a166c656c29f6e741e34ad488f9cc48b470a1a22d198f6932d30493ef4cbc06db7c153012ce6fa38be984ef44799b2661723875af49d67747aab74f9a49308317bbe240bc7d5371e592720c0bd8cc4853155cd1413b24b60d8a2fc61c3965dd14441b9f393dd90bf6477d13d0274b56b06cf642b89ad11ea20d34af6b7c2ba56d99c25ab2844821d0b30307182d68dee73bb4b89e5866a2b5e606681165259063fd640f8dd58e324f35a12289e385f6ffb4b4d573ac63b50f8436a0a4d2ec19b97c8cdcada227c8e92c2a9a074be095e80560e89dbd2deeaabe7c329aa644a84fb0b3f82b1ef963a0a28d557d2d7f94e60855d5e2b5d25e4b3ac2692b63bca182f4292656c8b6e2142b168d226b017c37c458431f209af82dcb9ca78c107eb428ee64c2fbf4b53dba13e1dff43cc90491f788e9bed528f5f4181608f8203d953d1018ce8eef28f11db31c7b3cfe586c110d81ab40277bca2b0b68698f5267a70c7944600db7fa26ef51828800915e8b3d7c0f0723ba51763893183156665a113d5b93d2c3e3adf557295f59deea341cb5b84c8fad689fe4d8c2ac9b32bd9d5a5ebffd3789dac001868ec32610bfc10691752364c1b3c3a23e81568a792d43aa0f3bacb5ac1b6ecd0b9d92496331539b74076409fbc75e70a747a2804851d2ca34643b04105ba6574b98891b7613421ebc8f8065921d5d00c982574a3eb20aaa74392432073957070360e8cc23f6c3cb32eee4b875f602b4b61bd249b6219fa639ab67c526063b0c9bc824d52aaac574274d90eaedc165ff886853477a9e2aac5f610c2e3a695b6f2adaf2694d823efc4c79f5d4e2b6f419cfd6b97bf267c1d0649d94226de2646f72d20c8201fb41c324259f9cb5d5dc1098cfc150f0a1f64cc291330f5823d380890c4a404af9c44c9daef7bb346f09565aa59e11b23f75562fda1b26d7864581fb7a825b66aeb8007a9d44f5d8893f40b752f1dab17b917b714af2449f5bca22f8e9daa880a2531164082991b14c54867e6e7d95960fa726a1b06c2c3ce92d0df67bde806a73b4106d46a423ad8c655d64c14f0eab1592849f735c5ab16658d01a877181c837351db9b4861471579f33bd56eabbf0b0e269702371a8ba04caba2313a5e90fea55195d721713c6b09a50f33f445224437efa8dcc0cc07a95ada0e6089b9d3b2c0f6147117246586beccd5aa7afc4fe21b56e68258e541038620bcbd2316644807f6ab9e5e86fcabe0140784875f8a9107d131fa4de1f608c335a06ce4d9699a44296303661ea7dad0ec0cd42510bc2566a2d284dfe6f4d8a0c340959909204cb69428411a61085ea5cee3875d1d02adc27abd015111cfad9d6b99012226bfc1013b152d01270a716794420c8786f0ed7951886bf7883187cd53660d4af8725272547c5d8230d0b9b39e447bda7a1019b617bd6ac9a3a038640b7eceed4d4dbcc0189c4bcf247a779547736422b6020e31d9daee20074c86928639ea0e98ba806ff2a6df1a5dfca24d4a1c12ea8916721cde04cae639971a6f0b40725f185a8807404989c3f1ef4f43fdbfbd0d1a1f25e5c7c944d85982af986610a3788aa27beaf14a6c058144112b0bc872f25a901cf3903b187b6aa980cd7a64672c946cb555d91c1865408a088d5079c2ebdb77329c927e27ac2abecc3ad1bd7fb594834e969aafee9c9d23b76fde5543f2d73c544729b1e58c994fa0805521adba10b44e4ae57942d881623c19e8313fd4ec8e5464131230aa02eae461d5a284756f71efe4c70776061769f3716726a0c977161b7e89dd1cd228d0743ad8c189fd185a37839d2c9f1440f839d239e93f59a6fca05a5ca8c2f354c4a1d36bd31a5ee11849388a9c323881c0ecc6db534b4d71e12a3964d8a0f199710fa9e57e7d14860b8af5c3a2c11389dee61decf5898e4cc8a6c0c7c5d0058a69fbea3532ddd75663875743c1f37c7719e3832dbf49bf37efc2701e79ea401b2db23fa5d7f1c77264647384cd50547c63ef61e465d3d8a3803c4064c86909c1d95c02e324b1ad20f8a98aaf552619fbfedf938c3ec0a16bc8db3834c37df0b655c408557153cf5c9ecea0b4336f194c1370d91d0150de774e9ea434ac81c731fc85e4ce46acb99842ef24f0819eccca43cfc6598106fb35c8f24be374f6e1df2389d67da5c34148de073bd6cd770ec21cc070a6751f33408d7ae46ac315e985e823cabea754cb321419428692892e5aed353ff4f635a1f052eb15462965c94789ad332a59394a4b1b3d85d84c803bb49b55523d2be84d24557de12aad69e6976be7e526baff95822ac556b32918d69032bef0cdcae704ffc1f3d8fcdf5a4042f335acc9e7184d8ab384fc238e3b7662074ec3d2ff50dade69bb2845c7d72cc49ea06f38ac288f8485b5f4a0bc6fde6c8418c92fb01890da94ba8fce2ebdd0d7d186cff06d50d93c30f6478764cc567979bf6b453f218d548ffe9c23b773c0070d0a8dde0d74cea0279ab47fe65c37a0eb6e9903ffae3cc9a59f8e857a2a298ba9ec61f0c70886126297fc5040166a2eefee03c39db89c26a0d3fc7ff06062ffbc82d49229295ecb9d4653d9335294b122528405e2dec8815ae4539e2bb67309c6f6b1927f8c743d1d2db89ca501cdcfec1329b0d56f67314f632e973b07ae6f163725c186bf591699a23c245a34c15d05d6082eb4a2e8d02d1a9fa1a1702b2b1bbf608ce8c8029213e1026834cafea42b1887d6bb98f55a9426ee9bc0b1ee72d1a9c6682235c0f770d2715ba601d13e0f99482bd922d3478dd7db5d6d0d0aaa05eaf9784b6636a88346930ed0a61a9c17787b85be05ec54edc402a86e9e7a9e0bb754efd1714e18cd4b192a4d59a1e33424c63d0646acf4019f1c8b964421ab1a441233019b085465387db768c789174fa773c6fbd9a436bbfe569890d32327cc99295c5789e128cd12a893457fa4dbe60263a995423b5b5c778a13eeb755d19d1b31f2ee90f5157606aa7b3b6bed434820f99324feca398609e4e3ab1128e8a32faa93bad33183897c0ed7709c61e4b16d094c12b62b9d9438097d8583282ace52811e47985b807e716bbcfda4d69cc8e628cddeabf9683f238d09ee80a16f2a5c030baffc01228f02053c83bf600f8da5368595c46ecda9a6ca08da021c76bced0a21ea74d52e43c1483fdf4b269ce513681f959786bae38026518b0e5fbaf8444929a618448397f206168c28baffebef94956dd939188425489c49dae769088bcbb63282880c8c9411133c558c43f1d03eb9dd15189ca2ad9100b933ec2b50cef0aa5e934c8a674e5951d2a863132725295730e8a137b907c43d9362a384da7890f0f08225c06cbd144670971a4af2269d9b3f414c09b0ecae77094a8fb1ca832d8b0c8869ab74613411bcf3b118182590b4654ac294f85b9de73186f59ecc52d8db1aa02da405f9a6c37ade1776a0a3b9cd8f182f5ee1b1f120b0b4605ce885f80e03e742ef9da60750bfa51ef7daccf244ec21fbd1e1f5c044af62733c65aede7a03f99ca32067d6ca1a9b1d84520a179a8994a1aee3b430b7c6339c3ea59f0b9c8593089bf3dab8a15b72fccb38af5767d2593b0764612f6ddf86f1458666f1f70625d82d67b410ab26c6e85e01b3e47d58aaf95e1988edd041f4fa4c75c34c20de5981f14443a86305e23c1b07fb1313be28e3b03f3e1756338ba9150088ab454c0313fe8161f5982ebd5d99780b9c2e53aa8634d4fa95c6c176bb8f8147c24f6653f0c6923df2348a1387550889e11c7db6d3a167545f8841a627cba092dda16acc423e676982e80f4f5e8dda2908621fe645e2efa9a13217a738ae4cab0edf83d0d22dcfe8808ca56254998b5f7f1c7c36844564e5c9f9512f7a87883f19830665936b8ee87eb2b1dcab3ed895fbac7e711289a8eed4eb11c1226875e51f0979625c07c5c3dfc013dca563f306dbaaf0ea2fcef0f2b9b1ad9a0b0df6879abafb6d04fe6039ebf2e865154dd761bc522f274e80a3bf9420c8d60bb5c9eaf6e2682603e7ef1129557a8ba7e7668618259bd17167fe98a8201432411e63881ef850c99766637b5588229a5126e0d3329aba5ee8b115c47ef46bbca7c442be60047e3c3b4c3de2319951f7925d384f95b3a4c55ac4bcfd9d9fc208769bc185d42d4e6c337d06ee24ba4818b8ed0962b52b1860329d42cc58f0ef6167ab0b4f1100ba92019a60782b097d47b3916bfd18a552ad74e97f6890f0678ce7e33497de0009fb641c67e37f2fcc8ff2365b8860657be5f4c4a70092b662514a12b403fcd6990e92d9da2a66dd38a98a822acec8dec8bdde4ead097d86402ec0e6a56ee2a3dcdad24101696859c6a9e8ea1f60253fba9612c38454acad3709a699ca47d1274905fed65cb035aef0f2b57462b00e4735fd2a34fe245b15eaa674fb948b64e73e22ad0367d426ca637a103555eee3a3ad91cd4f19daec16b9f036b64fde67ae1667c967dd4a4ef2fa53cce37e868455cee16d83279a8d4f0282d9f0150796b651ba053ca0c6b454960aad16a864c641b26db99ac210ee1a2798916c7200f8b26db91d085a11c6c035312dfe7882c122201f1d72a425a3c1d6754ada6ba70aa6a50225f3a880a1275fccb2d623ee2ba8a1241b57f1bc488ab55d85b235196f339b3dcc509a938c5c98db55b5f635062fc23ce6523528b6fe308821c39e351789a252950fb0e3a221fc12f389bd69c080bf4a4c288b06c8eaa22961ee12b443dd264fc69541d26929384cb19f496fc0174a08838b725edfe722a9acc6c8ea0270f22c224e0ffc4e924a8ad18ada0b0cd8521c47d54a13563929b0e5aeee131d3dd00fb1c6ab81979df0ed73bab5fc7c3a952c17fe1f601ed095203cafbdba53c8cdc2b2f52e00bf3f549bd6eaea6f4683581f5da4a34b230256ac147b08589327e343889781a75e1d4db7527f7220dff9707007f093cdae61ef059934a1ed739c3a512ffc43c7aeb598da8ae6adce0ee12c40015ec55d2b70bb9ea19d5446b8f3f73e06e90a22844d9655ae432bfe76ce96403b7a9daa8d212242765b0c2fb3ed0204769313cb3582a0a1e05dd28c62cf703462a09460ffd565bd1cc8e92052bdb0777c6c0f08ef381d6c63d85a6b789fbdd904258d88e44d577062412dc444814ab6495dd7b0de24603961410a14dc6d1157d5b3e4fc97fc240be39e2efb0ebe618320fef83d61e9e513a080ae924d37a1dbc2c4dd1f4a4a184100044f42566e7146de84b4fa63e4f91960d94f6f88c9e9587e7dd4601e2ed81b2de2a81a831f8837694862e02a64f60f2cb8848b2fc12ba7961042b2a99343f6ac2884add5ce523070230a46fa12528cd792a4a254ee200d46f579d401a1350e9f99c3d3d16812687f10498992e1ba98ad47f4487ad2404108081c8030e9b9d9fe99ad0c519d57669b663034eb119126816e38ce35e7e5fedad15e893101d44bcf46f8d71cd65763a8a2eea930f9703dbdd48103370a4b8061ae60e48307b1460c31e5a58321e0efe7834d5b63d49e46139b547964193075abf9b2d97951d6cba698b0b4931ba93c6018a060ec163f83cafa60dabfd09707168189b519f3689461a0d45214c6995643798dfddc0a12bac90bcba2c94b09e439cc888aeba8110db89fe48d20e954a3bb3b4519b8f8b886001724c5eac78f81b714b9c7617cf754a41f2dfb6379764632a54785ad6e4dfc8be9f3213188bebbbe08e38dea075f9dd264e5f17de4f738dc2468364d56b968313265009132be56e1223c14ebf00e36271288c5efff2486801cf7eb2513c2d016960652e008c0e3074f7cade9665008034e06c26d532a7044838690ca85935ca987089c9323954d03467da58b00195756bb48ff857a398a38d3dc5f22351ce59f3085e293e24ead728fec23b89811b516af0b7aebcf44ee3cf674b414627e4e5b274fef83fa0a1673abda096e86c0006f847a63b9b13203c0385e0081ce9025078034712a89452848cc07d704129ac8f5cc90ce0ed0e17f5505e31bf6e1967f87a316e54951396b71aaf4a27604b7b823d935673243fd81dde9ff7c2e0150cf2e00382ca0ef4111fa1c94c12dde710d707400923676852f940f632bb667ca21c2b4c312b9d3daef6f86a21bd530747f4adcb2911ea9588513428aaac412405612b4a1e1cadea8946c0c494cc6b6bc20a183112604cfaa6660e0883d3d5483cc1d389da0842e9681605c0c316f027ea4efb4cb274a1a693d396e36ec02d17fd3ce8a89c2020002990ebcff9b1b64cb2eab707919a5c4adfcb581b0b8ee51dcd87c32295b5ced16ac8ca0a68c7577420ed4e3494e31eed509377aa34741a3cc0ee1defbb24c8a9e9202805aa03fe639031d32a127aa489719f932a68feab2d53a21a1582f864da552e858e3686cb2dbcfadb1a3a3e28e06b81914a10ee2b5c22f8bde5b8858dffd48949a5c41d88b68a67e1099c715f7eb04a5829bf0c26256e90a8c9f86e4a08a4bcbb178f27419515255af021debe4cec335cba344a37a3f6b18ead12cba3ea38355646306ed58ee8a0ebc6d1eeb494725dc6f2781859ba8766eb5c47e8b0e859845d5c2ed2c97c25edbc9d3926194224613fb939d93dfe3cc24ce3a8b1a07ec44187433a8691673a141b3eb06d83340dda759085965c1552a1ad23608c20628ee96195d3fed49246d6b0188fe63c9da399942325b3327135f2e0da1154e2bbdca6e30a1b93dc9274f4cac007d83407f8c3b9eaa71582e9599c90ba3b7d6fcc3da1806306710d7cad28e6dff8bb4dda4e11ccd2d1820e05c9a0719e8a1cba432554883ea6985074176624324a5ba1939022982ee9cd735b0521c31be08a64d75fa3dff69074b0d5cdede54890d959a02f5edf8fc4495004fe5494eaaa5e9036d5cc8fae38e1e383e31161140177e7e47bceb8194a282844ff323b13d27bd8da19786a58d754c62b13b193a2a79c4889c083c6280175757508ca8e57519a621d227b4cd3f6099893a23688e9dcd110780a37c8b8ba86cc927e248cc17b4aa24e8f79103718ae675006757dd6a34e6b90c57982bcc69c03d55aa5adda6a30c9b1b328df238cdf9db46937bbbda6cb39b6b7c314e0580cf2db01acd47c758d53ae5e3d0d5a2023169007d0b01f442675bb29e4b2c7868a1e4f14957dc960696907f2bde1e71beb4f675e5714c2354f9b3a36c23614b4e806a5c0f35ce9d62790925dbe23c7267094c1e9803673ff8e80f0fb274d07ce9ead74c1dfbf4162aaece27e909cbda6925d6c8671537363a6bff0a8d9a050888d62bc61130ec8562d9386fe3b95c352696f1954fc125a0d83dd2b7467d4142197ebda8146476e4370ac7cf6b918f0be66963216b0b88133e82faada517519197106d7111c70008741d9e41090a3f6559b2184bd01f48aaefae208ebd845d571cea94ff420506964da3dc459147b3df62fca22a305d24ef5f77577d90fd3786e361899eafe96f8a2edb23a5d3382bb6928957f47c2cf66ae53a957fa789dada0d717f0a0699a14a084f67cfc0aa53dcb9d48810164433b855678b407aeff64e493d7b018e7b96a19c82cf49c48ad06d7091a88248c8e34e0a71507aae4a36831dc26d3dd27b407421a93a6cbd2943090d0e60b3b872e56e6b04dc79d11e1eaaca6d75868f3410b645fe721350464930c03371fb52d34075e05151792e7bb9ccec444f6d9a42c709b34c4c166e64b4b9ce7d0dd07b63167ac737ddfa9206c503d5c5404e2e8baa2c7814d8ca3fb9092cbd49e0cf4be611ce8427f2f9c4dcfd6a8f2032bba12b8632ba77c3ad443bd6d2f94bf28b0ae759bea33c60138aca0114040dcea4c72b2e76f72e81c5b1e7bf16fe49768beccf16b6f81d28828d0181a69d60ab609b514d03883ad2b1d37e850a96afc3074ecc5935d1c4188037c627ba56a883c16a580d1039c29e42837df70c0f6d7f13c698abfae41f6d80bcf690d2bdcb830e0a9c0d239472cebe75b5008c3330df0ebe556a2e0280510e9b8814b43b3058888fe52165661ef31b31e8592a21da4f59be8955c49c015d69914eb457347499e20ff9a94c3042e465a46145b87242382bcc1bf1ef04531c36e1928c2013c35412944886090390131268a980125241aeb0e7557eada9316ce55794ae7ce829d67631bd07979fdf9a6b20d35b1e0acd3b68653c1cbe22032ff0a2904398802cb03436149bf195d75798dcee5a39e167a60a116466757f2e5758603a371b1efd7ffc69ba8b6ccc6f0e418c5bd50a4c95d7372d7052ea5bf4a014de0bdb6430643308e2ed3cc436eba80916ab5515fc48a3c617aa6ef6dcab32a357553ddf226463a7e704defb62f7db377f1e566b7c7da48db4b9422dfd72408b402f66950430be5589a929a535d4c851cc3a577284b0f2431830c791317cb976bf4b654ab031c2a85e2089c0eeacd36c0ae0e15e95b3083b5383f7254d384afd64182313ac9f3f5143ba40d45f5b10a1303370d0ac74ef9aca003ce1e935990b979551355f10b12c57826ace2dee0ac28bee28db6222470351e7042158307d1e34b81f4bc659373086bd84f2942846105f3fadb90f4774adbe62604733d9e39bb8a375cd63811429b26fd423286aaf8ec1c1f084dc8ce27a5d4771ea17629cc00f8feb5a2e79eaee3e42698acf4fcb275211bd23e9b37824a1dadc16ec43472335879be969672e41112268b7d6db29ceab7c54cedd541410361f8446d0b148797f3cfe005e5ee14e52003737a5a3d28ee0a85b9b902b5122b403fc26fd880ca6a1dcc046c2fa1f10a23a4f404bf7d9602ecdcda3c9f8490ac3375b70043ca3baeb6ed5f6a4813ff95239b7a55614a064dcbd89eca21e79c961a79ecd99eb466d15b700e4c508086c3a911c53b746191192a4118f8245d7556ea3821ef923b72667dd39db981b0c1a15b9cc58afc89487c9aefec317faefa144b8431030e5650fa3a40d86b38993e27ba46d970644c1a24ca61b18427d042aa4aa4e7a13c21c6fd9bced1a19ce9b47719c7a498be94726429c916f5ddd3c96d424ce044d151c1f1ae4cd34b80f4cb9a76f30aa8e418a26d5f57a8e29c1c48c8940d8439d93baaac18a36e758b3c455a94bb84a4b6d0eb53111c9117c8c2eae121d91aaacd796b8d11c20db94019ec3c5ca76ae61be4ea2829534f619fac164062e9bb61fda47a1e1086329ea704ca3a21d68a3c13f21704c01296086d4cfffe222831b10cb86a09a18cc455b586928bdb4bd0a0ab0ce683a41abf01cba07bd5eea3653c99b4fb622e510e9a837924021199009ae0a41ebd10d1dda4db5e8d7328926b70f41328bfe7d43ebd705b3360da622c1ca44d0edd10c067dd6e19b4697ec96f307587b261d564ab2f345521441dd2521a62efb60af56300a1de9d803e79b4873568260149ab608a1e17dd604b5e4e5851cc6b5df20f73cc32de96224b22236975d805c5a6c6630f7e417d425ddc70dd9ad3c0bb7425afd01fb297125a99ab5db530b433d42244b85f648878519f7dfb2fd311893011ba06fe1f702645e2fa39887b84e06b206d53312ec96c61567b59f14392fff1eaa51cea458dcc6fc9920e4b0cff5a24016ee7fa337504ef575562983d3690b06bc08acb2385d1b27d38497d7b6f4ee3718fb2ed3bdc48db36d2796aba9430f80bd1e057c5415ff84dccdaade9faceb8da83c55bc422c8a39e563240d3a56adb0f935bd5b478fe782d1d28204a65801ebe7ce1cbc836b89743f0af6b954f3d276a9e2d364ac52ad994e8614bac2fb338f6c0eb8061891bab86625c4998f2e4b4a0cabee530a7d07bc95a2df566ff703627b904bb2992849f0a6b2439dc17fb75b73d04c679aa42def0b1180ddd3b7ff8202ef6741ea6cb4ae4d1d0dc58d352b80451bedcddf6bc51c34f45f643b7d9b2e5ba05b36ab67cdb6f2d8c34350fa3a44d3531f40d7479174e1a64c5733114263940ccc01340db22279feaa51c98796ed2094700348e92b354ebb637c62b1434cc95ca53d534a691bc7607de71932b295413b0b4648836cab239ff8d91c2958c2b6d04ca0b2c2a341cb9c360c74d47addad0cafd436ed9c2456617a14c3ccd4affeae0b833b1c9d30219cefffe3745a15702eb6791543b29ccf4bb024dad8a35e4bc50053cda0506d3a0402b3ead8543e6db6c53adecaa518c8db8783c8fbaf652640fbf49575181f81ca5c9ba3c73cc557a67454782a14b1a04548ff6cf9c8983478436ef4e4eca16449822675fe3094baa10056563eae79d564a92827dcf9f0b73cbbaa9a525bc604a8fbbc1e3245b67332393dc7dda54d1238d758adb5a0eaf4841b64bcd2f153e388022be80173a1e942919fa9cab9b49644e11c7628996157bfcd5ba9cfb0da3d8e075ef99069c573b31ad12bdc6f6cbc13d5c8c73737b9e1511c46996e4b519bddb374ba866dfd61e7eb6108db073231f013dd7faf140289ff204fc5dd604049f5d15ec00f12ba80eeca7a4a9f0aed700146643467942eb71e4249d8757d46dd3ea3c51dc86a5384a58e384d20cc21be398768d30bac03f6b089b8b476349771afbf7ad9b5fb458c8dafca7b6b15e5662a0b8f7624bde342b7eac557fd18bed85b5a414dc727bf1b0fdfe7f56d34f83fdf067f54f3920d00a0dccc3b8a4ff67a0622a9a37879f3f14d9e68854426542cdabba1260031efce480d6bc6e7aa98dbba238fc40ae6e0e170255de8e98cec20996c2167ba4debf9ad2772907aa2dc01dec4c18421839cf343be836127d0c6ac5fcad05d483c68f2d4294c6802cc19076d425387e05b8d2f6cdc49609350499ed8313fb78f6f5486bea9d17242f9a16232e7aea00cd496efb9b6bd3788f1ad20046f99444fb988df990bd8f4cdad1a1fa3e20a12a8f4b12188e2ae4ae9e692dfb7b2fbda520e4560700e4dbd12a48608b6fdc4360423cde1e9a2207d02345e37206e92149ba7c1c8f4c18d090afded9569fb26adcfd1792cf47e518db1de3820eed1740ed4f9a36b5f030b1f70488c48dd31031d486a7d6f6e38b6d467fb85f8ed59f04695b4a474e9e6079e58832ad85ab3dc204f1641bbd2686bd40d5d048e905bf2b1f9836af5aeb368f8825f0f52913367e54044bc9bbda4dc3e962a303250a5615b600f0b74edccae34617e71012dcb60a2fbcc24f065769b0bf0bced295be68e2a09001f3d682431233f48e6daa45e4749b7b2e67f325bf775215038f84011e88da3e126ef78627344ee00d8f16f9eee5a14b71248e23f86e488277bdab0de85461a8a4592c439add9c6ba2e0e3303e7e0280ac3f7b348b1b6afd5797e7e254f0c3a31a1e667c31b7f264a08ae0a7153e1519f18bb661cc8c1623974f11ad9b1e9ced7077dab3562389a50eb38a716bef78a83806bb43aea5e50ee5cd9d2275c1269c6a6084b6699e4f56fdc3ed1e0ac84d539c437593a2e162ca54c6fc0ba3c2549538987d3bc404d695e9d70a1a32b70640ae49d3ae53e0bec1f63cd87c4866c6a09e0f39b4320be4a7f5aadc3cbe00e590695f5933ee54e5af3d72e7eced431b0fac8defb7f69cd485059fb1df93ee91f5d8bde3a5f023d3906e1f5288470fa9b5b272cd08ff0ecd785c511d77594d98dc31ca9229292bf3d6de9b23967696070c5234f092f2b2aafc972bef67f9bf983ea2ebb2475c57632ff74fc6a9ae069e76b2cc60c81b337eeec3bb46b58b83e2483f0f423c197fb87a7ff4d6ba8cc3e01d5262ea22c492539b70c1f0b68a1efa8c71bea080c76ea22388056a6a8d58d656942524903b65b003138d980a21b88ea1a956cc9ed5b686ab27bdb5e1a455803a50eadbf89f9981f311c8269166153208d251a34bd1d231cb3f69f96ff39e939b1c5f21e5251066bbd3add450c08772093d2e6fa17ccf31b89b61f1f69f530d6b6a73b9d7f7429ed5615629dcc79d5da38fa7604549c7c3936ccbc82fe470a83825426278abfd7aa3b183067d622d4bffa29adfe131e39c5c3975fedc46b4d8486240127964798d8448840a19b63586bbcd52f5950f3644ed156ff409b73db62f3651a5e1bdaa6ded6312d7495b7700e0321fd6c7429b1aa87778e8e16392faeee9babd3adfc36a0f1b928bef08a2180c7ca6bbf9990fffc887e6f864863f00a170212e44e8e389290f47d61cf4c2964139947d6e374582161a603a28482825fdb8785fe5906c82a261fb7685b2c288ac0f1f50fa06513029da95ff04252731170a90fafe3c8251292dad53a464459240f6105b4cb1a58faeade338454a9c51a21763a7b955ad46346bb2725bf217f1aecf3bd6236844be68428ea2977666cd50d595cae6463551f0584cb7675f89f13f1ac5e57d5273d3a6a5209cc5609ad9420ad0fbab4ec9d206cd5b6601e973adbc2801d068360c1bb2105f68d7542b550f3cb6d8e180ea599809bdd44e6450ede7983d7a19aa7e66fc3e178aca7d7d2d15bd6c48e7654b26e9d7f43326f0ee255e20cbf929e4c8e17e7095d964bd725e56f93c1cca2ce9e0359ffeaa09b4a4cd9cce1933353766e332bbea2d3789e25a21ebfbb3ccf5766f5d17e2418cf9ab90e2fd9f9cd4cacf130863fe48391c672b56d46eacd00e752e37692c3bca4ecbc58c6bbfaa16766ccc67e26fc6b8b69fdfec30488c5995e3ecc50ae8f40518f74f008ee523325b3f1486f797d3b4fd16973c1cdbf6cbf31e08e93e815fccfcc848e53032e3ee10052af06d1aacd043b24b8a186f19258313a693c07992010b0415f6a50780b991e6127844b80b95561291ea8e9f500c9d19936b883899876d4bcad4fd8eed3b36da809ad002865583692116914c0bbd13d2f0e3f9a41945b456b09bc02e471a6d166e9fcad7803b8450414b5bfa5026c3b6e7d8bb842ec989d27a191f523c0e92886d6596315bcf77b4fc2b5b3435c09e1662f6594bca4c5f0577420c87ca3cbcd8efedbc3dcf5a8971a216718878a75da34dc2d6318b0283eeba784c206eb38e9482c4461048f69b2c0599724160d76fa50c3cb69d57895861727c68f29612feb7266c21f6389f44df87f4a7aa1dd7bfb3971d3f59badc0f5d7a28fac4f9dd34ff5f4b02d7e3d44678c152a4b03ee89c5e178412d66682db29a4924fd25061c6045d6501616150d8943d9384a3c9ce94d109319cf894853c29f9bbea7bf031fa701928c84d0ed0c59d04c97252ec39eda492bdfc4e20ff0ee0cac680a83ba90e161f781a1b2c88a9b8ceac600b1f2c45deeb18568c7c6a27878089fea4b858f715a4279c45f1ec3fb2fc74023b19b57f4352aed19068896224a7f0a3273e8488a763437121b131b435825a79975370bd0d4a3e0901cad184af811c810b1f6b61af616914b090e9e090b617e6e5968bbaa01b1349beba97dda4ea559f19cd95369af163ba9908d135332da994d38f349ed4cbfc852c4e8f3b5f639a3f6688502c0c47626e305ce99bd8cc8e4510ff31bda9b66ca30f7c0de0642f973794452c384ecf20d0180a6c55dfae9907b00ee21eec2fb400074106004259f4e187906eeabff9e68d03684e2c81ad4a7d019d532d8491d537daac7c106ce66f5150c0596469c227ca575105b62fe8649cd02ed9049d6478c7b2e09ecec12a52951ac4f6e226002557f272699e83d5cbfb345b66dd1a936ed493db80a2048cc49ee49c8ff9191b5b26099713e97721315176d5ea6eb94a090d0a163fc64dd07544d37c8f3af7a0d14a3f92550a9818f54ea4c9c0c2cc90b543fab3b4a1cca1fc10d2d11eb4c41981f7db51db89c1d4c50a8d3eb50422da685925630843d488feb372049e031d3bdf29be2208262fd8506ca422ece31f5d7d665afaf0bd58ee0c3039dc32314fca57472aa3435d0bc6bb95775235b777d20af1ef0e1ccc4dce97a3bbdde09637bae154eb412ed52cef969b46eed276eff8d004a45def51f4c442ad1d9d1f6410bf2831fa3fa4d022f1ffa1d455e775fd6085df3c1ad5b05a02522e819f0dc0a13dff0bb27acbf7e75eecae5161b47a4b0555ec6eac2ba89842c97173e5b551e157ac2602b3dc8cd4642f7c1a29c4219969df06b1d5eeb83c25fdd3a22f9973223d284e053cf27ac1b4f6cee584d635719767ba0a6e6d105dfd72a0f567ea0df181293482be9009f82165bc519ee51fac338c29b3f51c56483cbf0449e09ba5873f478c11e9fcab25201033c62404eaf678f2b10c8eaf2c08e51a8aba3520e090f48ca6d10cb8ad80e13191634f73b9191a8f1a5f0cf2fa1790164668e781db1d855d78802a2d4fad2eb8c53a31a862e27fce24a3dfb961de606836e5e6475dbc00979fae5a7bb1fa9a2cadceade8458e7bf9bfb97fa4c5a994459b5bdacc9dd9b78270ff802781c54d936d9b173740eb7016dc16eaee914e6aab46473ef235a2f1d946518fc28be25babaf0f665ee373a26909494f2513e7191101212232a133e0bb55324f115f0b079c6c374611c88970aa8af5356c989688eb6cd68c49db4d72d667d7e19d4820b41944aa03f3200c887671d3138d99ad3aa78123bd3de753500e2ae7c0b33273a6731f2fbce96d64c6163fa8cf221c3ea9271dd24df4103424f6c125351657b1c11e092a07cf4212c54140a0f2116ccea23d7c8854c8cc11bec1f74c2a448dcf4572b910ddc70fd3932b7d88190aa991906d3a314c6a49c349a6f7a98e575da5c21f9b0ea616eab72e7cf33905456ba2f54f859f5a34a65b31380c07f75d936d48d231eee96fde7355a838743dd5c8ae88ba4f1bd1a27d87a8123c7d871bf748f74f97ba491889d28426b2d6eeb5fe2099608363800dc037478a736a3abad8e3001c44815fd811950bf3cd763a497f430878de4fffb2753bd28d2b237d4e020444836af284fa733cd1d8fe75baa43500521e89020b4e39da2efc6b0e60f403ed0571a932973672096a6662cf7135c8ee8712006e008e03551fdaa014826703fcd50a290290610456e32f3025c5d659ad1a3eaecea58b9203865bfa1d51ee0626bcf71651e2e571a9052968fb1ad359e539e540ef6aea406155646c342622f9e8bc65b58d8c03cb6f218ee3121b449a3b7832e710bed4e5d18f05289b9e1e55d4685642542a6224202d2b6d2bbb1a08b8ddec68c9bd60691671e103937f33630f76fb218bcc89f541c87c24ff15ba964dc422e43516ef8015179b0c57d2bd7a036b6a1c36517b20ac63977d07e6c0213ad8c70db16f770e938c5eca7d7107e0c718aaf7421a91a79b8f433a8613a2534ea6913f2e9f17528e26347684580b0586073139f5f32145f8259be9a4d226cf772745ce3e395dec4c3bc099e102cbdada925a358bc8cc8bd8fe8171866bc52bd1430cd03a500fe1fbe2f9018dede592a76ab673b704a028b03e54fc30f65d0a621da50f8391ea38703e624f0f7fe3e43e799f64a53c8c3d3aeb6abd3198b3a7ebc1eab7b067f6b4ba88789b8f7fc60fa0ea17b0d1ceeaaf8e64fe22662e5fd00d243c6acc6789a8280ff1283399bbdc5f1a007eb5348a9ab6fa084fe10bc4739c482e8be3efb6e2011a5faf3def2892dfbb914126b14e1d7595f5d13e35b0ad5551507cb43e1b2a992d29d148ad81b5d695ca6fe33b99de27c947e283b9f14678c56fb115ea16ee4c6d381386a070163eecc058c7fd39a0d9ad5be039cc741c0848eacaa592878697caf8a58633f3800f9850bb68b9a8afbc03f3d16761df15e00768089455ae8faeadfae16dfccbc9f75bd9639000dc9b70d7ffb40f5eac1bb418d00a7431ded4954b5e01d20766d967726b974bfa5d95556038bca8d9a16f4b93df9323180231f6d09bbaca0a74dec20ad74b172e2809b23a29105bc3229e24971390b1f35d2d222d4a503eaa3b0c913fa576af7f2b78f88e2994d21dcd12ea5886ddbdab0c2bb6bfec72e5c738c0e2753f847301fbc6037bfae55a9fcc7b182b91aab55fa60404428de1c261f5d3457e67e90d7d181f564740bcb02d032cc282f1d5c118c6f30e0d846916d4f2c29446509b01c1c77a55ae303d53558130909e6eda5d28f7b06235ed94b4520feebf24ce2090fabcb0c36b0670a37148e93ef3c941a5fe45a8cb38de05714404c327697e5f060a5030115e5591e79c2690dfacd3bd475de04690c390955b5eb2fea578497d098eafb459bc977645b3b260ccc912ed3effff0ad812bb7984dffd921427a89e6ffecba611ffc0055e833064291d88c229e16d066f1631596b5e5b59dea8d8627ff4debee28f5304ccd580b80206179ee117bd0f6f082c0793f7017edf4fc4a3d78db1ee1e017354cc8c0098a1608ce4ac129aa58625b811c46c2e8078ce66df12e14c67e66e0ac141a47b41aacf67419ac8f49b5852646d2c17b520374e832739b75528d3d9999b4290e98cccadaa810b96188247eb532bcf0155043a7af11c064e88a9505dcdf2694795e65f50ef673f88bd1690320f7416b25fb5088934d4bd8e2ffbdceb6c6cae456803dcb94597470e8394c88b1526772bcb258d5fa6800b9ecf6ac1b61d02fdb789f06b6ab8d970d76878931efe437f5febc616c705297f4de1261e0cd025dc1c2a9cba4fbc82dc2201391108a37eecc5d2580850c4e215a0ffb9c0e453ae63e5f0ed64bd7d002ec9f68f8249ab6417caa0ec64194b50a166547756fad760e7335ef1fc7af7d9ff7afb684d3550215189d1fa95f3c76480f99a89c6d788d83989263fa1427c7d4470433c4a85a620180893c90e1d46a0c9b0476f1c65a3717c1af5c8a106264bb95827a8040ec495a2d4a0cda746adbe713e06dc5031ea84cf73879f017bc3ee00e87d91572e5b7b17736990ca3b8dce443e76b96acbce867c61f9da4e78e8319de7114efea54f6eb420ea1b95da290697a8b904882bcdfdb9418cc60d2a27c23df63eaff831a3205f955693aeabb38d0b1d16b1535acd8a571a9b1b1c3ed84ad2f16d96c8d0c3ffde56e982ed41bfd055b9ae4aa027095f82587c3ecb9b9cb40bf5200bf0a2ef2090a0c222d025baa8b39e13648676550c3a1a18b7dec5f8778eedf1d6e225136d14e8591ea009e91df50456fd460155ff3c7ef91b609d5c0fb70a92eee01bb0681852cc42afb14f2a1a1f5792253a37a3793a8d571f494ce1cf18759f1a7ff952681dc3c5e44bf74bb874bfd84bd174c3d3e7fe743757acb8b32b9e9b5a4a9bb7f8cce9c58d3d70f2f02cd851df25b8f51e83f74b8ff172e28ec87003ec44c539aa4fdecb1ab0797691b8cede5689a08237e5e5747b86f819da6d955910b51ce782646900c0a65cde140e3afc5825938ad019663cfcd1e4267925f8fea8e318c0b93822257a3a938b7ec194594558ac0bbc11802c4a96150f4630eee2a6fdc95135d196232df42fc960e68821500680db0af16987cb9c0dca0f6cdb9c8535230ecc547055b66fe03f205a60633a6ada30f2f752532d6e233de7924762f8b70265d944712697915b57e4fc25b1781cbe699823913c80e184979b1f1cb37b073e81fb0e11642c0061aa8dbded77666f35c6b1f989ba63f7b82b1e34908c6bf407dcdcd7ea466b22b1b896d3711eca603d1ebb4f1ecb0d6fbdfd3ccfdb5abc9fd196c70b67b431dcbacc98bfd7846c12c4a8ac66ccdbee22fb738fb7ccc122bcc6ee229450359a13572ceb0e02363484019df2395bc83d09f7d4f5b8e7932d619e789a07e723c9f8b4762bb7e4097d1f193212ed80fd7ab3c20a470553b8f4f1f9752c26f8b3d436a542976a55185a1bb938b03e9f1800b8393e4c67d23cf56449784ba19efdfca771585e4977d963b18f889c8bc386150b56c10acf8a8da15db4927e0a16348ba0eba4d001b52dcc517de996a7145a1b8b28116f495bf1e3b2472e790cebe7051e705605c23eacce41376440021002126c0448ccf671d7c6748433cba1a5d6fb2c859daa8649fb41f81f9217435e07a3b44e61e333a896529c5e8221121c0e19db8710f2c9a525e287c75d9096638aec2ec8a84c2a7ea6312fe59758ca03c90b79a52f01335b0a87b718c2b8c5439694b5ccef2dfa6071b3f8103498cb06af1b54be59caaa5d61c1cc3f51ae76cea70c8936832ddaf5799568165719c3e414b8a4bb1d4078aa12ea040ab9a09a086e8daf6369aa66f240559b30b354499fa2c71807216179a03680756417d1df503e60620b3a27009f9ed32f2ab4162fc7be255bd45fb45f54c8eff52380924d733774227cb83e1960805d3255357d017186fabfd425a496a82bee68f3a53325e3b0799829097c513d76b5fc22e7b97f63e164c3cf945fba3e324359cc1fa0772df09db03daf1d4def1656ecee0068687f7434672e02375f8007347f187a37dba35a4087fceeb1fb06afe0b03457876ac605b7788a3186f9403cbe38a5c7d9bb24929723dae527f2e2f055bc3f211437b28765a7c19705bdb226fa178779ed62eecc83634c452237e77dd1749652cad3cf2f2779f0b11fa003a20e3f12c9968320eadcd474e59999ea6ab7aa32bfb25f2625809f43c3952e5d0a02b7ec4f6428ae3d06459c14af8fc1983deb8e2634abf4e87d9ce82f24e0094545abd02cac2407291e42a16ebc2f4866e01985ff1f60926786b85e32103d4c19d8e37257b4a3849c82d981e643b0f526f365da1d4033d728003e9e9640d10bb779d1b2ff77dacbc9458a4ce2bf855c38be9690b16b565f06b65313104b63d8c29def3ba1e096e3f423939a2887f6a52f8d883fdffff597e34f54f96d76a13de4afe8be2fe5435b9348202812f096407b1a6877928fb007db3e11ec6c35f2228a249e68b9d452e8420e5876a4064ba19139c792689fb5451f450712d020ed16e12d43c92f778d38b2cb61f145bdbea53b222b5cba7f1becbebc5dd7805fdf4070cdaa5e4b03a37df5d7cbe49d540abdfd0d922b3a5f19bb1a9119c95f8daf1d994ec6c1a159d3a951d61054bb4daeaeb447510255d496ccba9d57f9995e4c01b43e0234bb60f5a21e723061584f2411ee56d7ee8cc88232537d19b50a3f15590196ee23ce041240641f7174e9b4084f679b1320ff18a87f30ed1151c6546348d9d353d1a4aa2ca0a27d1874c23c32f34542e991b1301f4d4a797825011c28d6f55baa2f19abb447f762821a90ee7e2252a3e3c11103ed13e19d1e5a8bab347e86f47de098d4d9de6ee6f304c7b9c44509c537adae5f44248ea7e3629315aca807035728d5437a08d3d5cd279f8782b8444d7c22e5766758e6127ed99cf8ce7f585e85ec70b18f17e09a09b22976492496c6fda980bb3c63ec317379b938add2019e943399a47806577a41a35be67e882b65df8fb76702680dd4262b28495c2c1d8f54086f9208d9e47c12e61b2116ed6f0df792d877a1d52e52df55fdc7a1d9775acda4141443b73b44d76748f236db27e3e46d5792e6b808994fed30aa21b304fb88cf6e022b5caa84f66804b51499e485ed082517035301ee9e218a4efc76d3949e4064faa24146206bb87481e7fc963d7734d315026d1b1a5f6ef5e68241f79a546cff41e838c133b114426eb6fe61e3a9ff8deb0fab6f593f2f699739b9ae91c2c34bed8fd6858037684437690cac2b9003a94d72b45a13a97a289036206662d72f333b2c0604ea131ba058200e33930ea57f18833e84c46702da5456b6282a6cf9be462df67b051aba6e131daaf817e5d24a32bd97c455e6eef544010882b33379ac8fec30474f1b31d575b08de3b06d542e7fcbf81a0b3e24227befbde5965bca2453140a9309ca091688c5e69c57ee18948bf81b89e5eebbffb8dceebb973f3b706c2496eb0e0ffd65b326f6ed62703f8fb19ff941e6c7e6fbccaf4bf25f54e4bfe45ff9e1146d04b50447a281fc2461f6d13be4f4978e91d04f6233037a877c8f6a9801fd92f4ab102dfb57090229c133f571710432bb8464c7dfcb7fc9bff2c32ab4bbbbe7cc6772339106183329a420dfead04e642c557509e3f4f4456a8a4a8c555399a52c5a969a9a87d3b7d3b615fe4b47ccc7698be6e4efe4442ded3a7372af4139b71f352d8cf368539a962f3db20952d316e7692dca79a4b42a9ca7a1983c717653729e2a2d7bb80dc5442adbdfded3341068be043bd8e1df9626f4972cb2bdfd716be9f40e69dffe709e968e2d59aea0d453c4cd4e9822e3647f1e5ab2d7a92d65711e6ac49c73d65945a92d2d2d65bfb0ed27fea6368dfcd59f0a66d892737243cd20955fae204fc7775e5774d1774a1d0fb9e8bfba1ff2974f81967d7dc74f247b9f097b3d1221f9df53a06577c2ea7f7848e231047ff4d1642d63fd683bd1a53d081356358ca40699b04a2473ec12f2efdeb12b68e65d42dc7fcffdf752d661a61060b18fa5fb96b9341c54e4ef05797848cae4d8514176ce2967de1300a55a6b7d9985673681a9b5ce4d9b4eb3a9fed4526770d1cc5c729e86aa1245ae3fb3388f005c9ac78933efb927fafbde27ce66de629790fd99b77826d997322bd461282e4e39c9ccf42f66d2def39ec353898894712f65dc7b555ccfb5bdf72dabdddf273233835d9b09339b38c29109abdf89559e28674439633df893855d1bf8434f1b16eaa4d38455d113975cdb7f4f246b726ddd0b79dffdb661a1eebf0e4b230f73d8e2f9e4fe2511ebeeeeb6dfdfef23e3c42b7e5b6ee7faf6b99f40414516bb2887396eb414ff4c58155df4bb988b7ef744321f177d8a85ec77b672956b9a2bf7f60efa34bd83bec3e86b3b55facc4266772b75975c59b9512465a14e306a2dccb852840e5dbc50b546bb512506d40a94a8323be2a109a32aa899556ea8dc50b3259f017f64b17e0467debb8986fde8e56eddf0b8be3fc879c2ef17721e1c8f63b9ee51f32de5953b26a1233756497372e43c2776ce51c43eadf448cec1f967dee470c7960a12e1888823048205c2f737e23c383e4706576e129a5d3f26a1d97eeb5b3f9ffb16f7dadf16d7b23fced9778945ac105193a31cb2fd28bf653b93d06592d03c5dae3ebacf830c2a6d1481420a636e9011210183a2ab25379c84f145e66e67d074e5fc66dfced774e5c03978b4748699c3021040965524ce514b9445a250eff0af112b0026fbdf19cb6241f607b1c802a9c93451467f91fd3b1c44e54acd93e2a824cb0f6aa694a5945d480de65426ca21596f6c53503323a722d3c38c4c97a9ad0351aa747186154d98b0a2032e27aca04b952b4c20a9c0b990a794d243d439585c8bc5ddf2489b053d6710952b25c10c72b03f9fa67bba9a3ccee49993c71949d43be6cb2539dd444d1ebb4c3f9569e37e97c9f345983d764b0c5db2280335850fb2f923cc9e0fa4008289941464866043363f08842a27197f25f90de45ffe7a87fcd693db5fbb4bca1a8972ec8d143cd0c381a52a9be86f0fe8e0215f2a9630c092cc9261725add2891152e86c8b2746485194eaac0610d355e6095c4195f7049630b1b661b406ea8a22c72e7c5152e83941422bbfbd65f8edc5055b4b8a1c3ed30844261f6b57434c80d85c2156e70f994909ff38420cc45a66c766a5a5292486ee42f39cb524978640615a140048394232d8c4e60034a13998651e82f2e80819443174f634c91512cc284c91f9b2aff7811797c39e5b19f88c8634f0d91c7b612228fd2484b0e42ba808c185e34b5800c3064e37b10a50b325637c010c502d9e8b30697265eb6a81045081b6413ab6085263d8c81428d20648ec7aeea379e6003ca4a171ab4a0201be54ccb0bc29c20658523232b64a34c229a314951f9c205594c794236caa62c81d8409832cab872c60e3f4c911135354983072788f842831632f96153142a5e82a0a20919910e6a3c29030836be70814a26c9d090a508274ddef832840c491a4bca68a1aac8892b64f295cc9e9eb2a252224b93182f52c824912a292ab080810923ca90c90fa2306981062f9c686943269f663d12b72c6e2a81e94f6c9ab8ed2506555e6230e5250651f64bec033fedf33c24df6fef9580dbbe4f043116018d90eb9a00ebc10781057ed6fb4f2cfafe1681df13d6695f3dad03a20ec6302fe013996619fa894c5687d5a163e705ab9bbb5bd0fb3e91a9f3cd07af779828d3b6bd109abb7e0d4181d6e1229a90f470376c4809b2f623976d67a2ecd58ff3de6b5008f724c83279d3c48e89049fdc9d80eee5283f98dfe1517aded72010ed65de3871a4436c3af08359a6cca474f344268fe3dcbdd35816db7669655f91d4ed1acbe2123c6f9ba6f94b295ddb36189e87121183d73b3ed4aad5df86a020d7d7b4cfdb3e4d144267b3129c6e127fa04d0caee7f1fba40ffb23e7a0109aed6ba2cc1e67c5123c5bbbd59f4088905f11edb51fbf2d071dbf2c4408c5d65fd4cead4e979099b79f79fb8a84be58827f20cb640d57a981bfd719d4e8565f7b5bb3d7eee1a3b397e0990449663ac52eed3b6bbdc3bf3e2d525f7b593190ce1aa6da8d4111938cf9405dee8b3bc6720f7dfff0aa4a1ec307d08ec56c18eadcd6130fe1c746551ec398bc93ca30eef8b1e1bd74f864ef6f4bc7bbfe1a72e28eb7e5c61d7b0d185c4d714d1ca47d73c934f9c7ef84d15cb95249da209324d217f7ea5e6dc9e3e519251299fb5d25575722c9a22b8974258be455915113f635aaec1bf4d56dc25f26fd0c11c9468994ad287dec6b2f64b5e7f0101eb2d8ad4fec53ce820dbbd4f496795fdc515245758f19060c669e14dd637e6324322391ddfd528a3b764749aa89259597c41d3dcaa39ce74b53aafa820e8f2f0ff0b1f3fa0f2dd54f2f809239f0197d69bd9f7ebc6aba507ded2bb6cafe55fc78238cbd5e3e423e3f26135429294c1ea912cf4895a8c234de3c83cc99802c760f2ccba7e91e393920d934d9933fc5e692a918a4bde63e8d26fda177385d529ab0db44902feee84a54c95f34457cf4898a57a429c170479b69ac5c37f2974d72a435acf8486b8042812993531356c4a54a4f2fbb461e5f6397a133f4937c2947a839e38ed65a8bff9daaa5b424f46febd218ee68670f0774e23109cd1c84d11c78a03d9132b2ef2e4f79fc6c8360d109d21c843ba1ce17a11a46790c1f205b06717d62feb2d21e4b4b27b463aca5c728153da4f1c59d9cd248cad4c97946cac516aa97f3c8aed5d6be499059fab893bf9ea2ee7871f87047eae4347bfc8586f94f79b221eb90fd9db25f47ea1d926ac2c0dcd17e944a092b344c76a519bc49669156a46c9def775e311e3eb6e906fe3951dc917a67dcd195463a7b6492d2928e0e8ea93bb65aa137512c3f62682ce5d80c5421135776d504fa0707be813f4d0b774af9fa1f1e4c997fe407c99f98c7bc72c758def91c48770c431d2acd88ae6165453f8597c999dcb66ddbe6dca4ac5f9221dfc0290e26399b33af288597d5df1ec93748f20dfc713471c78b83873babb45283fe1c24a55fdd6cddb637ea1b56526b39ad75ed060251e9c3436243ea3c325e12b35b03fafdd56a5fe0815bed709873d2dfec9c9c56ab1b9a1bb3033053aed3342663bae9d14929dd404f893b5f7a9fa63119f36d4f15049ab235a034839ac6640c8bd2e95c51abcb4dd14dd14d51cba9e5d43ba3744da359fbaa6cb3f77dad2e977e4b1f6d67cff6f66bbfa8464196d69af9baa50f4a91c80e34d0db72e953a4eccd481f33f77f2010304b0c0210adcaad8109d37311eda50fd95b802043903ddb867f481ef9637791dd22fda8e1ac7ce2a8a8362d95544a4aa5a453bea6e1ef1dd48bcda969bf695ab5562bf394e57b728bbfe47b210bb7bfc1ee9e70e79444d839cd1e4e6a46ce23b311771774ee9c5a4e0e0201c0a81961e07694145df22b77541460648f7e2da7cb49f50ef9ddd207ed459e21f526f85b68da2c4b10e8b3b8131c81f6166f78ec8fea1df2db8886e42216ee3ba7d939d96c67e7e42ff963e46b4df23527f99a92b634f3c483d73b3753c47cfee5edbe3dd13425caddb7eeeeb64972917e235fb66febd7da4e20bd78fc7860ab789f2e5152d537fbdd24a92c3f9c02c5ea6cdbb635ee60e636f265ed4a4a43cce75f9b184243444243446d25a11c512265f6be885013e6536c8968f4fbb3dfecd367babbcf84f9f50fdbcedb3ba45336bcdee99b29ae945a3721359bcd96c83808721e99e55bc0791a4a4a962cbf27d2941e9aa2805125cba6b5a192b6e423a684c9f25fced35054923e1d595a31ee94781cca633ffd723fedd73a74987c29a54783fc20f2633e2e667bfade0cfd2afb7e73dce4defb2e4956c16d75c4daef594f831b3f7dfe7e7c657cad9db9170c4316fef0cf9463876711fa9b3843f89e857bc24200dfe2b15fcb6d24b63d0581f01344dcf1ceb727a6dcb43aedb4db9cd64afcbd636e16bbaaabbecd15ffd0279bd39351ffb6c579e4d62577bffdee7b5c8e5d13d89e7b22db731e9190f7dc7b8787868894803002ab83544555f5d4cc73ef342ee744977fdf61fcbd092ec73d6133efc3e2be85c09f6921d68378e8155afbddb797011627c27d874d6012a2f9ee4d9879ee899840f3ddb70c0c81f5a0cb674497e34eb4794eacf9d613c9ae74d28c2a1e924b494e4b4632a9256ee256d3198d3209bbe413c96e96b04be2a0229c0f9f4886e35b56f3a3749233dfd1e02126219a6fe121593561fd4c42334f8387e4548787383c24a3b8286eaa933435e21625b64bbefdef3dd1253fec92ef6117551659d6808152cd33095da6f9433d7b6221ef6bf0907bd897924637f23c69691a555d4da32abf0ac50d87b8e1dc883d6194f3ab6e9c46adf7fb434c4236ef193d4056d3c243ad6712baffe1a116f63b35e436380529abc1ee34835df38936a9dc3f7a14cdb78c06bb26763cda4c24db9ee6ef3309cdfcf7dff7342ff43dcde724f4fdc543f3c3d369c2fa67963a912e4d583f27ce240e734b2674d825c47a90c32e161e627205714f819611a957515c30c30c51b3996c464d58ff9091cbba4f01f72076f56750e5b66c4e4d586f692244145188e9b00929e0f04c0835a24613d6ef7205ddd92c63f1f0ac9ab0feeeb9fe1c50b701454fb9a1c8235da249d408c4bf39659a94fb3398e1b6cc4544caba97b2eee7d584f58fb32af7875d42dd6397e3a0ed4936ceabdcefcdee77ffa6d4bf2df56f485b52f763bdcafda3cb31bdf25737a5a24e39bcdc9675321a2552a909ebee8dfb6d75d54fa9fa69d5d622d23c078bcd91adfc1139a81c6765287de884b3e7675aa981bfb3726cf6744f7fe2ef1dfe2fb7d28718cba077d8dc3d7d0a7e405f06f197ffdbace11f1bba68292514f7392905815a4e577baa5573dab6eb1d725de79e273d277f6dc9fd4f5d47bb6e7a273bfa9f045bba539654eee79133c31d79644929edf7607027c6ae2c335126ca33c430e5af003cb1e33cf4f3913e3f1e8ec36ec30bfbe5bfe4df503eed6f82d3c3edf7c6cc91e6242ebfed95fc767717a51ca341a09e3e5fb879629710f726ca1da0628c0acae0d2c20eaf1e8a60228313269c80e14fb3477e83e0bb79e477b77fd8964a87cc81e28e3b3b2fefd121933af28f7f5e8cac967039f2e28509265546514e6414815942768feed1efee7f678fd64484d5194d9ebca08ae88a0a5ade98c10ca5324bb4f0babbfbdaffc0dca22a6a8872250a2382605206972f505190a2b02246e632647bf4fdaffe5b82e792df329762bf70fb353b9664dbf0bfc6118ceff93bcffcceb9e26e43b6b75fc522b3765d57f1b855ed37edfa0bcca4324cac889e404952e65102dd4366f9d2a5cfcb7f49f1b4591d042c24054290100ee2af234aacb070dfc3e1f774c4a836354eb3afcdd7fcb7d7b4ed7df3df7e03b2e3af3975e898dff3bd9c2b6e97471d1f1c993d563774b1e2316894ae10b8f77008f67bc23429bebf68f2a823ebe81edacfdfd13d2458e9901a3e62df04efb937a17bfbfe2670efbd09f6bba7ef12525da1bfe61f85f38f28a19708f7de13f1befb29066953cbb9e20665c76350adef750cca466299da7f59491d51a23978c394f2e79cfa7c8477534693a1e4f5f26c870173e5ff6bc2fcbd2d6a52cde629c672c789fdc4131748b34d745915ab13a557bafffed2e888bf1224ea1409afbe123a6258b8f762b158ac3efd6deba03e7d3a33a5fff58efae357a9bb83436a91fa9b0422cb584dfb0c72b849b45c0251a65f394c65300812f391daccb8579bda13776c31469ca7f308f4bf20ee97c7af7bb064cce715fb57f837ac9ed3c69def436cf2fcef5bf652d606a22954348181010d37dea801080b125e24911186962b222762c0d41046126a60b183cc044a2748a961852dda9092f9f78e6bd25af17a474747c7b71f0eb2dc7cfc35b170cfe13b75fc471d9d30ccdd733fbebcd6b458d6c4cbc2953addc37f3e00ba0703543ab7e5aff6a2cb31ff18cb288f2ca3bc89304253d94dfc8e8e28992fc2083f4f4f227c4b5cee3bafc1ed5d1c6312ecc08dc432e5f0cf93cd77f658d90495883042f5ee89d73b339fb577bc5f128825d2174a5df0fb3eacc45ff24946c926e984a5e68fccfffeb662390cefb5f35e895ff9e68f14013ff6e37e0f0e01ff3312cbe07b3958b8327f0db80d25c3519e4ff31e65652434df9c2beebc19aa8a95dc5032441d2037940c55b26c9a3d38fee6717eb4ad1f6fcd8f61b6718c636d0b4b24b083ef41d1c5faef5d43665ebe6c3147664fbb55e813a8799b2752f336f689b4fe065be7f9b0c7f23802a24cf35f23b6c49f3039f168249669dea301da3e28d3bfe2cc7722eb3f91467481ff3dcd6fa20b7c9963d7e66b3e041b5c83439811bf6775008a19e4505f7a184b8dc556345283659395f93778dfffe57ffd43aaeb2c20bc97d92d20e4af5828b59385b29158eba05ace1597e6db3d582351ae1e984af9ab4e100809a553feaa5f63c6752ba5c0ffbea3a6a8aaacb621d69b70c2f72cec22023e6be87b16be60d087995cf9e83ecda8d9546badb5d65a6badb5d65a6bad9522e55a6badb54a1fad59eef7eed13469f610c9ea7f22918c3a2151a54a9728d5f7467398e3388ee338cff33c1dc22036af8b155a3c2df57ad10991dd5f73c21a82426df111e133656039b9e7afec79273c15fe31ebff728c65cf0bbd0e7f1ca614886cb15cca5bc5a3d5309d787c7971834b8dcd9507d67039effdf585dfbd932265fa1e55a654b36a5acd2b3aa34673467fcea60ecd3359d0afa9d9a3e1d93461f4e98f56878e3cce99b576bbb786216e7d71a7a40fc7b3496a409fbe63d13d269e40f40e3aa77a07bde1ca97ae7ce6468ee449ae1415253545556525936492925c6a727aeaaa118e2879329248b3c9e72748902c005adcd166faf6863f5f3122197d97f2a5d9d332faee347ba88c3e7d8ab4cd0c748f8947c9244b1f12cba2d6c0bf9d0023fb919bc7b6935bc7e257c5636c7e98623c5e491b6671c05c893511668f2c6a98ff5115942a225849261d992bb358914cb27f0dd5ed3c4a2bb949abe22149b233ce74fdee89d8e7b009dc5beead09db6b6faba805690f82f63fda07d15e8241f5b59eacfd8ff7da1f993ddd5b7bafd6571f12777beeebdbeffa1b0b7d4a264c73cd13ab5cfd207635fefeef7b30c884693f13a621097b87bffd6e6a2e21f0bf97febdf71fb6fe2ff38f77e25b71eb069572c5b1096b2ae9d6499330392777549327f9f8476a50bf7e4df7702cb3f9a6f9576ebd9209b3c135d6d2dc1bd6af8d8fb4a25c8de33058c3d56ad0b8b2481a394f3d327bc0b7f6de30fcab6c5f740dd9fe7bcf334bb083ed9170dfe5257f55b1bed781f5ce9e1bde0fdfead51cd12cfc9ef57f26ac4eb9320b9656fa69024741f541a8ff533f888f0e892b9bb826476e40d2c2a8090531aa9488f203902c55c45022e349192e015882885896323b20b104d4143730d9246248a19582369028a3e80c1a6e2003a7873b86d977bc3177dcd979c59e68ec03353cb18a8189aa155480441b954808a41fc28821458932348c717574469dec2f9df71e2a13e3025a5c45f1c4094908e1c5161a6a8894c0585ad2050e4d45514e944a1531468d235440c653d323606002d6e0c21623c2a85a019949bd08ee45983e798a91e77c3be79c736e94d3b8ca8d76b3148fe16c798f7c1db6a54b931baa05171091c5d6c3bdb9a15a80c288ebe5866ae1a905a7165ab84638017d98e1c1850f0823d60a4930783f24812bb0d042d794f49569c265a1f2d830b23d347567186d4c535c18186a1624db440c1a0f4f9b104fa88c29a95a99b21eaa341b83e1851fa2a08c8a5c689252610d241f9efe7ed6da1b5a1c47e0d0869825eecdeda58d2a965c9bdb4b1b5fcab8addc5eda70c291db8b1b45deacb5d64a6987c9f4c7acffe3d347a3b5f2a0b5564a296d51efb2e362f539f106fc355dced95ca6686d18bad37c41c2ca08c88d25a5d4dd8520a904c812237179122dd3b72e4dd3342c44fed4a91949122dbb9ecb2eca0f09cd49b46cdd6320a594adda5d5fe2da3ce69cafa239e7b499e2cadf7c72ff8fdc41a406b355a43305d521a715402e529368b65b08cd13fff0573fd886e6b36eb6f33ed6370302d5db755d576fe326ed97e52c8747259bed3a4ffb74c2d063d178b652ed03b94d8aae7bcfd6cefbecbdc765cb79de07da0e7f1dd7bad7de5a6b2ad536aef3a4b84015e310c389327bd6beececdbcebec4230aacc7b5741687ed4fad6334afe6abb1a173fa501b0ae6e0f9f45937db79208b050269333aaaf679dba4985a2579eba6991bcadbd3ff36aa793a1e18861d7827c8519fbad9cefb5eff98a3f873d7799c6dddbbcd504a4367dd6ce77d3f513e3e38beb8f2bdae5f1c3796206bb25fdc6fdc533ca2206b42b496ceea3047df8a3f9f4666e65935ea53f3d9d88040d537ecb33dad3f3e4b3e64a8d20d2da553ad6e1d38736bec4da893439b970755ab7b82b4071bce0977fe716e70e87cff0a227dd0df623c7c7efc70f00569983f787163cee9dee0d4d0b46c74c270867503d0e56e3aa48fa9715fbba0205c141bc6d1822bdf8a1eb454102d2d9d55eb6f411d086431087650f1f5e06b7d76e3aae83c5f8e0a7244940741fed2709028f1fbe13c35f77b74ab4d9fb3bcd81bbbd205cf09942940b5306349253973e225fbc89bad5473226b6fb5bf476764ed888a16521ef1e9cba863893ce7b3e0459e4d70c8b3c91979ae40469eefb1ee1980104c2ddc4dd6267af6cd0da582982cbd23f9af1bc66cf02838a4887bad0fa473c519e47093685f82ccfe1a7d2a5eef8c2da46cdfd3ba99ff71af7f7c0a02cdbcd7eaf20508314b5150265866f20fdd13e4447379a1e9185f21d4e1dad0768ad1478db4d6b4b74faf664f7d6bb3b4a4b85666fb1a53fbe86c1fd061ace1310cbdedbb07587b281487d93f72986dd23bec8f19f8a02bb406f635497388b8328f2fb3d77df7700acbadcdb27db17b281a0db3dfbf7d4bdc0d0f3109c1d4c24cb6613b61d66a938a9ac95ac66496292363f2f7befebc56970be6f1a740a030dbcd0bd5bff91b3cb4810cb28a5fb34f24db4457754dfb1a1e27d5905c2189226040838e3941c6c43d91cc03bfb643ed650c2e5c644329e0aa9031dd4fc104f3868c89db4006d957e56a55d034cc3e96b7da926ce9986c5fd3e2375bedcbec3428b6cab5a26569d2ad1f290cd95219b2a53864fb3550c4eca4a12b512dd31fef965c9b1f7d6ab6f0686d0da646d88d2a50504f98cbe6ab72b5b76fe3d43d1e902dcd5bd6dba768740f35b29c945ce45fbc27c85aad0ab7da164d8b3dd2a06855c4498d66cf4483cea4cc31d9be0d9e80cb2a9e529ac8ca1e1877a4565cdc714a51abee21b3fdb982ee89e129755b906d2846b6d79726ccbe2bad004f90c8f6f46ac2a8d517d7abb42f8788eb797caf2581ef47fa5ef336a20e1280747ef9cbbe900fb7a2b8f229b6ef53fea2c1d60a088485a992e8e52e371895ad231df98bcab55fd3e58ed42ac8d68848643ed23dbcb71f64dfd2e0d1defef0187a55b347364c7bce2adbefa9d959b6ea1d961a39ccbeb5f786f6f3ec7f981af9cbfe48e9d11248d403813e2b3d2e170301b3278239367ba855c3ec773f865eecfbfbe452a323e701df3e85227df85b28d93eeb41911ef9cbbe58201056063135ea1df65b5feeb44fada4b492408bc95c0b490045e3275b4a392911577ee39113c7e7de8b80f4dabd1dbfca245a0629160fb7c3e49d523cd940589abbbbfbec963954aefc9e2d77778924d3316cbe994dd619eab0b303a5c2d41113a5096b9b3fefa152dbf66ab9961b4a85a51840c942caf5a4aa8cf1b265cc1615c6f810e66ab9bd8cd9a103159470727b21d303540a565ce171b9d65fedb2f289b2747520b3cd62a62f33162a7a6eec71b9b4ab7215ef7a4b682ea9db35aefc49dbe7f496b8f2a9fb78a941cb398992bc25baaa039b6dc372e3f6541c71a63fafd70a0e1133e53a6bdbe8a67852d2e9c7e59e3de44f988bbd83d27b6f531c36ddb3fd868f38cc5ddd59649ba93cb6d5a572a92b69515bcfae4e0fa8ba75b75148a0d0850c30b65471c4a56162cb920c6da9f52269c21ac88e717372436d71813b828d24dc629cdaea8496f6e682bdf6c9764a57475c382985f142182ba52c8eb8b8524a62062a29252a5a3cd9180d29b8bdf6bb5b5c71317358e7d15e2516a0b4a0a9063660d802e9ef67adbde10a5bcf2added66775e6a1455614151936ac60d7343315163dbe2dae48662425580dc50455a427b3fe6635f99d2f6219ec4104e691921469ef3ed3d22883c7f07049a61ad6189173ff8e0c60b4d608ca468526336461a6450279082a0a1d23ddc8823f27c9a818552464e115f80c1b71b8b275f72b84d1202f2f839511541449e2f8240f3a220babb3bcfd31f79fc58e064058a3c5f0020d074f70f5f780387bbbbf704e032808827793e006288e2a68780d2b10da54317493aa0f1459525526e0183174a7118450f950d21c3015ca1bbd3a816c8b8bb733cdc4c738b89cc0102392c8d3c3f870b18be847822cfc70102cd3086251c1f0a10c2853cbfb56891e7df841d121635c4c025862ba44030a20a1748650135c4123297b4891bb23f07eeee372fdc9b2bb434c9b30502cdb73ea590d8707777ad6ed6adc5a3bda10d08e431f769e93420082a41a8018416797e14b314be14ad4104982612a05cc0060c9a5c212305940b6fd034cdd73a00f5b737fc57030143f6bffd8229a438092207274d55cc20528430630d2b3ab0404536a7172857e0fcf0d70b3cb2ffb0941d8825d9ff86feefff8af9cff8886db8900519332ea698e41bd018024b1421961023bc7dc60b5d667c28c95210fde13888f3682ff10ed04bb9e35331eaf081860440f92045d30e79fe37b991e7b340a02982a919c468f2030e3ca04182159890a18a37a6d008a34b141458200844bf56486ff83d8491fdbfcf795a8c349e80510187ab35a2480088184ed812069817a82163228632c23ce79c73824054bab2c8a30e1e5a64b992c50da624a635b243f520050f51d9bffb3e28b39cec1fc4033a671379f290031779befdbe9e42a225e947edb7f9ec80254feb7489ec5170c8eeee0ea5411d64c83c749062072a79860da5081e533a002cc8a3ce0e9625ae589ab244840e48feb232268780a1e92688dbb9a50893c79d9c471d566090ddaf7cc90e75c58a1cac6099658f112d79b20405173298b022060150c2052b5ec081cc931b64fe22b873c91e8588ecaeeceeeef873128bf250b47060caf3e9b4a2429e56a6c8339ca28c134bac700163836cbc535a20a5882b3f54b9fa42369f90c0a089c5b294f7c6784ce9cc4c91fd6d0fd93ff41bb864c781061b8ab243e008aaec3fe593f4e12964ff6bd43d36c8fe7209d923951ae66f9fd0f078658845f6f7e8d669b5d65a7fe3b8ff718d04d6fbcba5a0a2fb334f24037f46944f2c514a693e13e6ff337f7fa8060fbd5878e8e2211bdeff96b18c5cdedb3c91ece5e1a0a299a7792299abc3ae10c067bdd07d1b3cc4d4fdfd0e0b81cf7a1691ac6535d835b1449a307723509434a27c12a7aadf9f7926f0ef0b81f5877a827804fcd4514a266cfe48b58f8243bed788be5cc712a487bfafa2a6d5fa9384211d797b8fe340a0f995ceac498066ee3bb964452985fbf3eb4ba9a728adca2ca764981bae7c924e1b91e777c98a677b2bb7e91ee8f01e994293832095ddaa86a9ee52c354f60f66ece7870e1dd6cac89b467ed059644e6a85c8af0f447ec5ed2fbb8975878718f39af887fe6dddcaeb9da114f85001104f3226fadbe7fa37f887fe6dfd7dbc561c4b4cba630099d26fd19f62c3fc61096040f8f53b32f7af7f58b1a59526dd98bf8f8d0a63c64ce65350c83293c5fc7dfcffe5deecc6c99d7956f7fddf16eb3daf63d9b870ff59ef48332331f9c9cb1d7d26357b5a8ba913725803082da42c9149021c51e503951704c182104f513d5249c9de1b86ffaf572c96479f75ef55fe92208e2e77f4273192aa049a3f1aac7243d14095716e281ab6649f394f271e3952962f8bfc25a9a418efa5acf21e9dcf79ef6f9c5c0feb3894ecb0d18f1ccc1502be87a598ce25a4bee702bf738df659ab455ad13d5ce27cf852762210d1d581670f9320cbe49af7ec5fab06b7bf6a7a5ae61daec14ffee4dd287147128ee40f1761fd7cd6b3e47b5d87c7ee7bd6cd35ee799ee7799fd81904df03710934d7e0f1482ed2bdf7e391ecdd7ccd8fdff7f3413c76cfaac149686e7d0bbb11aba885eb12329ffb895dde37beded16d3598d0a062ca4a8a551748a69081cc0d4f7898c105a924973e2c95bef8d32895f2d732e291347bed80cb7a9c87aa6196598ff3d37e372f956a5eb2fece1e57504e8e8b48ceeb888e24f68469205050114cbecebb9e4928c7e77c4eceebbc50ceebe44c2c94f32e3c14629f09939f23e7c73007bbe6b74c4a194580289e6cb1c30967fc008511952e61d810e3c88a0b2db1e6bf0fc01fbf3c7fb479bc79235ffec00f8f347f0ffe14c7d8388e63678111f2078a240c65d64df72cb1e6a7f87d38e7f79e48420a320e28922033cee7188d7c19e7bfbf796f8ade6f20d08de7d5d48035b808ceb3fec7f34df7dffb14e9c446bedcfa090e692b76b06287dc12bfaf69e1bc109c677da8022bce83f39f387f8243588f03621c31fc297adf89e327c4c32e21f3bdf7ba9b97a09010bbbc27ca386fff67e288321bf932eb3b716c659c9bc7113b5bec12f2f371fec733d8dd88bec55f4e4847db87f3d13cbfe59a2f76f69a74a25c924ad24a0a7747cc0d5b58a580c4140b4d6196d4e8f242952cc2b8717247795434c9c0ee552ec6c9e8aabaefb018bd2c07e789b2540271fccc7970f4e47c8d0dcecb77dfe23c37e3a579ef46740db9b9f9ce2dd135a4554456bd08f269c892fb2937d40c62e48947f097fc503412b284fcc463fbab9559efb5e75ff79f5864821f9021df7b0fe433f22383789c5f82ccdfd7bcf74438ff89383f672826f117ce4ff1480c77ec99f34c25e7e9ae8eaac835b22c8232a51508840347bc69d9d4887e247a91c3921c265fd260efe2d197b2fc4e8af11e7f9a30f9bd4eeba3fe347bbcc86172e65359cea4b2f4994765f9de92ee0255c49419ae88c20b26434b8230c3290a932b2e663724e57bd21d8dfcc80ec55f7e54e45bdcc991bcc85f33a0867dd6c44ad20d52a9fe9117f9cc5ff2a3dcdf80194a7c81e58c222f55c8641866a800ca55125daee820932f95a627c375a40300516566458832d848638c31b8cc80831426a064e148b347033c64814262d6460d5664f29fc84246175f50b1328a4126df676ee456a1f368e293d29e94ba196196f95269a7a5e15643eaaf69ed1ca385425bcf5d2249423396998b8894692f651a36fa60fd2e213379fe4cc672026dce6bbd6a5f2bae94b6368659d3344de3a0792acd94fed027aa5cdf9bc262fbd6bed617d797a40f892992d46087eee1983ee91df533ea1e4e455758a2a2a2a2a2b276a95d4aadb57e5f6911fdaa5fdfa790be0a56569da91e1e75581687c77beb86eb53a7de511fbc72e5952f5df9cc8d9cc73b427287e249d3953c8bf789345f2877f4a55cbf7bcfe2758243ec7301a325a864cd5595450b952a1a010080009314000020140c8785629148289cc982ac7c14000b7e94467456994aa45914c3380821638821c60040080122002344341108a21798b41a81c021032337bf5a6b195e2436b39f8d2d811e7011e5139b085b4dcc8c2610d7846b8261eb7d639554c7f0691a5e3a872783356e6d608e08e068f16ade07147614c14b5c872bb9cc54636102ce39567baf3913f130d56cec6785e9cf8a7bb53fb21991e1c565e100175806edd117f2a4bf83cbfdbdf07e01ed22294d46101101fe0de6a127bc6038f85ddd2fb370d22543e2e44cc9add2e0d919f0d6e804a0606f2d1e97bd3daca27c8c03d908079dcc76bbe4f4f46d42bf282b71230fd35ed500ffdf8ef047cd68e2d9acbb5586e981d309043083d12dd43dc79a790bfa9905db04f29c6362a58468e13d8b4f05bb8b9f7011be7026828f82652e47a9459d3c759ba0e5bce84cefabd6aae8825433f8625139d9069fccae475a9c7ddf05dc41793f6daafbcda6b69629379b7774eb502494f12b42e7703be9df8a45db121763e8bd42a4ac7cf32a3607ab735478c8779f8261f2691535711247155f594c476b27db8687b35e72fc8d5b63301bd894534df8c988bd44eb7c950a071cc130ae626112334b7c6a68a6d8371a9a358336951862a2187483c3772eebdfa3b5dbf2b3b8b0a7c4ded8c6f18df323209ed3a73de2e7bdfcf0a557e8802f212e96f311dc22170386708f5a0278d1cdf41a2025b7c4eac5c8c586b03191dfaf7dcc55a266cf8053d5d18d0512c827d172693f0cda0044ecb94fd59395785d2334e503b99d7230d12e362c238cfd28e0f3def7402e12b5d8fbd2dc441cd8f83a1a6ba3d5898a0b7dbfe1e3084241d449ac77558be757bf5bd8e77defe46e7bfa0c14536063a9bcdf45fe4a54b18c4760e35634fe37e61e50a91fef10cdc4e7e7ace1df837522e348bb4614b611a459650318f50a2336c450f15110638bfff38bf1b1354bfc598c4ac54058b1cfc1428d4001ccd8d0d46b0982861f5620dd64b28f59a1d45479abd28b7e78106a6d4968653a4c175e52c04eacba11caa39853ff48d3fba7dee04b1032a10f8443d54e984cef924847b32cff34543463627ce4e76b149c1de0b444afa911025b73c0e68b258cf74d3320d60d248da194e2adf597931ba7e0a3b24050b0b8c460b6be721e4a0eb3c5ddfece65ebbc9b0bbe4b9de1de06d1171f3e581516a0697859fe0869f0e0459f3083309279837b8b56bcc7606d5c0431cb3660bbddd1a7cacade363a8d44fbdb9a7f0366d1cd78d0abac94d5e551b020120fa6afe5657b89ca998091842c0a495e420bf7f3daa1fc70a2508bcbd8ace21fea46ac7b943abe1edcf232f203e13402cc3a0e26c58844746090d21170fe491846c70247bfe6fdd28bb1e77602705f99491cfd0e76cd1ad750af6962f13b034c68b224a5e68cbd54ebfab9d9e1f68f121275f00bdb4a67ff5d09cd04f4d0a075fc5d0698b8d04bd24b3c154af1e8435e6bcf6f31a0a4e5f202f2a10074481154dbfba92529b5998d1cad1281686aae02632bfd58c647fc1688388ad90ccd0de6eb0ab1c57cf944176c9ac060767405ae2f9dc3c71ac7f3980c3b329a2fd1343b456e20b608a3d038219e7f0666ad2ceca2fcb4bb256691a3d8d8759c7c60832fc1a30e2215a636b1a590bfc99adbac14cc9354a186958c020d2584b2a848f5acf4c5fd6ab0937e213e42b5989c21e3809db14abac36c64f139d773c47e6298d89563d2eed72984a0495a60ad6b3735043c5cb7fe937a1c5a4c832ff262e1a9367113db60dcb30e4f31075eb0440a260260e38b06e9459d5d379ade8d4b7df5a190cb05cfb95b183769c4909f109beb246db4071a87781021b7b63081fb39ba2268a9417e45e660ad0fae2ea19759b8aeebc051e078704126adca049235df051f594408dcf294199ca4e409dce4f846147fcc37b0471e739fe013ef330e3941423fab3914a02fa8ca0fef0848a4ade3cfd98456b1b243990781f7439fc65185accb042e8e918224d28500dae325b71d042dce74320886f006430a8cfda527065499dff13c7d0fb45ea84272e0322d2ed6157c768322e96e4bc987a94ff467bc364b4d72f1bb216f2506f19579d114e9aeeba94a15a89943e93981e2b98b18337e9458dbbb8e9d1f56c307bb9b0c119ecd3a496e4bec792da5587c262e49de2d2f53180f8ab9162e14cfb7e104865f68bf81113187301bb9d0e6213df4e4e4cf933229fb8e676fab419448e3ae94d9298cd3c6e321f0618c178febef62ebe0739237d9cdeaf4af7c8e46f4f0bfec821cae252152ee5a7f0bf93498bd7f4dd580ed4865cff67389caeaa78e1993ba646b5fee68114cef81010b3ff2a9277d45fc33d7b7c05c46fdc89d5651c597306c8cd4d9a09137e9bc9f276bf9826572d057e5831f95479ea58debc1fc1866d79c7d9c554a6c2b8f27cc86b1121d30f7588dfc833e83ff58628504402aada4743c03a18e2a842e1a7493119e835153cce857fa36e344b0836f420249959b73d150ca1e68fd01bdc97870a07167bb0525fe0ce1cc2298ad743146b1601188345c554a6c30f09c897437501d650711d9b848611a9ae97306c2cae41d910a1d49be121a88827f2c26f1fc177657f6c5d7d73bf73d1bb8a361fa326183a3b0f2a82280ef5e2e763184977584031b881dd32a490e75786b4c02b4f4eee67d15a442dba170c6d3d529f5c63249c0c5d74efbb33f34ffca23bf6d0d8fbddd99782ec9e5167c76ac3bca9f386bf936bd2261532d13808d15b2dd1dfd5da84f2c7b0591dc6a0d84b06de0ab7e19afe9a151d415d77ccb3fd4b7909b417b1e2850342ad957e4c970dce4e8effd6286fcba0f1df47fccf36ac27010bbce2d29e82813cf90cf4d81c6aaf06cfab58b9de49a981a25b1e32e69a2cb48fa6f00e21e595639a779d84210422233c25ed949dda9921dac3cd6400b7c08f75cad6bfcce50d9962c3b14421a61293853327a18e442dd16e67cc47d08d0bf9b4b0964bf33333774b597425b0bd932cc633a74ecb31923602db5c729f13c1db44d5b6e603a16200e44a4b659e02d98f9c3698a2adea07d468f934cbeca3f7ba0a6d90ba4c9aaca7ab67ef4a586def6beb2b729f4cb4e8298892d9b325be48e71f68cf7a444726d195d81f68c2a82df0bd68844874001a8bf8bce979ba823ab14d37aa81a339a22bff36b4943a8a176724889f5a890599e894000708f9a4883116669ad0220a8991e1f173e39abe3a34b3ee1d8b72f296cd59a1af89ac5055c13ae009a62fe02352f152d439bbe0ffd4293bdd886d9dd3fb0315658750eea56cdd2912a64e3cb5ffefb5febe7da0f716d19908d7e3fe1e67901d9f438a8425d6406e2ba09648d6a00a56fd135ceae45bf366b984d7a29c19517e7f839480fbba5cfc6aa6b24b40c03833a1129e69609bfa37d472c2ab39f7625fbbc39a1f4dbda0952ac37793db6ecad231402bc622da1859cdff26559672174412bcb7c2e4599ea192cc2e1121b5b6d3720ef2dfbff04a2ea1c397ccb0f158889842386db9e081bc4ca18ee7637cea3d6e78f25c995e1f393f3ba95f39dd9411f41c7a10814fb0a0af6dda443ac67bb634f9c685afb1cfdcbd89b2a4fe3e281687b82263b704223a0f492e1f240c476ba186a976cc4d5bb2ba18958114ee667f884baa4f8ee99094c84833962355a9d4243155c7e84df8eb93116ff618b1bb8775bc13dc04e9416101f052006a62c14dbc331ce75b54c2ba6c5d3d60f7c785c540a70dafc59dc2028c6c044db1a1079a1937290c5e74eb04a58a2d7a3eaff22168a318a6aa2968e5809a0bbac650e652b87f21cd599caa801142f79c088525750caaa1790961982e47711cdb5bc05a3462d485d5d51e764d6bb5507aeb0d358c71341a956fba10f072facedf962c84b3bc1e8995983a919892b919794c56173699bd0b7a88db9a45cabccef9ad46c84cc661f433e5aaed911926dca6f4660fd1b2eb6cb39090eae42f33c864e334560540a4df84d157c8cd2210534ae8bf3bd82356ed55c01c780a07a6b7aac968f1a7ca54a4281a9aa4dde1162908b9dfb4adae78793e5d74e96bd432ca5777646c6e0d0ce185e40d46cbb49059c1402986ea5842ab8f2394036842f8a885054053416ee8c0da68e3be34cd22a02e6b099eeae2fbfbbe982b2b95cf34b5e6175465e0def8da1f0a26e4b0797067f4853cf679b9726d2c9cb5af849213723b47780e302975065a75f709105e1ee74d4dddb8b31f43cbfa80c8ebea9e39804ab62e7677ee66a94f7d43e9d41c80aa50249374a4867d9997a803c539730bd5122cc19f500d9570d9e0de8416f7ed8cf0eafe954fe46526bb64edd1e3611e0ac10c5155682ad3f0d3c3de2134ab485656c18deb08cf6e22cbd20177d39d7f05abc4119080725dbb01687f9dc53101db365923065946b0f62b54db594fdea5d0546c2a352a08c088c72a96d851e1c3ca0716d524ba512d0618acdc10fc1879aa139a92e1663e24d99c0f03934ca26c083e9fcc5ccbe9970c9fb79d1055e0da7944c0ce112e297740b333880b7d8498f2f36683fb88617e8a4089838585a3dfe8ea53860649d9740cd218267f23033d119cd370626e4ed8fa029d93f3fed899458ab74105e5f2ec214d30665ec996a537460745b81ffa6058f13dc47ff0f1ed22f1aaad654d05b146bb1df55401bd94f8a417aa6acc650b8dd6640317e01e32356225be24970cebaf60e4352cb47ce01459a270a9d1e9033a04763e292a30028d2962eb330beed9d477d75016ebef2c6a045856fb6ecc2d6390adcf66370bf06595e18376674d5e1194a8b92de060f8c8c63a717459255e4949f68301176594dd41a68a1f5186834a32b9e4eccff5618c5821a8473e6d0496bfee0234582c092bb909b4a6a936a0cd20d1a15878a1a5fbf815458d95fdc9e864796cc05b65002da11c32f5deac11a5c0978cc89301c41e73cc5b7160c7b23026695a2a5409627b804e5a798f9c67c8d973ade50d6f03b0057fb5d9b17594a4090d538ee9c3552430660c9f64b58480456fb5dba80c6f33ee9f0da6ddc5d6ac8c7575643475f794b16aaf8289f94cd50e6153f65e56d6931baa001e950e1fb3499a66c15a38bf97a2fa6d1696f9ad705f1145a20114fd26d5e3521970c880870996b4cd213e07a8e18d414aed08a036d2333f3803ab33b817a0c1cabab90e9402c26459c3abcba2f0f9c126221ac4943e19cfb7dc18a6727d42674a5ca296aaa6be8512c84322034efcadc07dc3a4cbaff4ff6971ade68505445601d8423c7db849f6e740d9c485603b59eb1aa129830578dadbc2b8c5561e2e0c0b379d190e55c6ea328e856fdc716f2cd358e09ce9746bf04bb7a665665a008298091c5fdb3cdb026d59f962c7177d5cc29b25791dd32de4db2007675b52d2846dbae219f92ada5cbb08248dc094c2a0aa319a62d36f56ccf535bd4008be756663495ed8987ad66b59f9ce62a6257fd66a6dea5debc28fb7507800264678ddeccb61d896dd198759f8c206e817c99b896308b6c3e4247fd2b42f9992dc02d976169592c3d7a8ccb883c2f42119de4d66b4accc69711b9595bddeb63652d8d80c7425939b313cc42c2574a1636f8b168f2cb7f850ed8df1f2587a894594da67553b0d8ac05bb001dec34d7b5fc40d26e8e2be13898e87f81229cbc54b5aa1395fdd2d9a460d9f4ba8a26e13fa814d73321822b2d953156a600b220dd7cb447a23f272d5e5c2414d24b8dbbae542db542f74e1229d4e359fd03f7a863d3fa1fe615eff81c1b5fc7f887aa41541024c02b93979cd4969820108fb969f0e13b226a06a21f71a8a71e7de2d148b87cc44b406d21a6443f65b1cda1a35b2e3d382e9fc2e1421359e2bc5852347b3a43db5b3b1fef8118b88966c43fbe4df9bb41b34073133cb04b82a464f7ef5774cc3458c5cf614518dbcacf487e04ed967f32a85d4925df9b20c1108465e60a4006efa12db013c90d5d171a3cad91df4622ece25c95d516fed17dbb2c92bffb6983d1c7c21ca2ec6b346d86a170d11e51ebf3e03bbc6720d6becc5e82b87f8432aadc64c7b98725abd78fa00264733d8f70abdf9235763ecdb50df174bbea31a60b6ddcf05fd789bd8589e38b7974ab1a1950118655110c473c2cfc925b2a184677a242e077c6fa83aa28b454039e91c7240041112f8fa43b8c11176a51e2fc1b190589fbc25801931d75c7efc5968404baaa4b03e79782a54848729fa56951097578771cf0640d8b64223d460e42ba7021c535c74ba667d6847dde1666e07630d17f7f68aef5437eb099c5618422759ecf904c0a8439f6fd014b2e03eee3c35e746e50569c2ab68c8c4c0871c9a5bbf6e3b505f0e6ef40d3d87620cf7c415d9bbfc7bc16e4f9fed9d1055e2f311b29d2dce482a6c6b4e3221d48d08fd81e6b324aa52e62f7b68829451f4ca121f3ce1cae96c2b6c679b0e2027eac8523f7bb2a25f2c3b6bde88a870fd55055631ca5df99c46cb38b2f5e3a0af159d3f301f37ea4e707561df2ecb7a4a1884835fb5bcc64ad0a7d2d77e00e57c7d67fab9f85394f31cd0fad4252828c4c8c78babf9c02820989fabf8440a157c943cacc703e0e05080d4645220fbd9f2568d02f88756db36f688f96f4de12e51a2dcb3aca3573893b2d5621092a380198b57eb185fb17b975fa58a24e37623589460a5846b19d1b0fb3fa54d96db2fce34e13e7b928997fd5551a5b2d02b0147046276d1ed308c6e7ccd24f9c0ad764a5c664e3d123ddf265ec6c2fa4b68f02d263d4c8021cdb2a651a440b362dae61b1f404b13ebd0183500793cfbf90f632a5eb6271b4071b001f58a2c070eb6b93501949e6e89ec8a7b138f81ac0b90b20e8e2ecc1daa12a54835557462f93bc35c8ca691b68cc38e3c309d7510e7f4a19ab073d03e0d4c3302630f95a0ed61d8ce5f344457cb1ef6aabedfbf6507a2baf8c6d65fbb14ec344ce5b71a291151450fedae35cbf45dc486ce433255938bbc5b25f5dc8a2f110c24cd3b6475e5bff603fce9b530a9c231cc0ecc6773a2d5b3cef556c24780a745aad9a2edb1255258dc747203b56752c6003cc8e5890da3b0cf5e028b61e45164431c80add49678c10f31c19ceb5cd26d9541ac7d19b7d3a07e84ada5f244c65fd447ccdb6ef046ddda8ab48dcdf8891caecc1d832812cd0b43ad823f88d293c17a6d2275f390070a293672c3853e3003dea08069a1557e62376083039ace430d9fb11c88e9c7ceb0c8ddca3bfb746e2217b9f04ee75ba44e42f1b39c67395f0538f592732ec292bf159b278fe62838a77fc17f0a479628aacd9bf4c2c10213d7e4193c53b324ba6d195ed100a49d49c106ead402ffd42b29e3ab9a150a649c44ccd305a2e4af3023481024be78c5ffac4bc82df58d0b19d1713505e81234b3eeb2f6b0bb9dfd50ae9f6af002a41d22faff95b012c9405baa13ed811fad5f217106735fa92f48fc929181d3d60704c3b644a61aa5c9f2baa72b2b591704ed977346a35a804009ccfa7b82594928352ab6b1ffced3d5d6239922c68693b353142b45b8ceddcc6ce4d8f1fcb85a9fb05cf0ca13c6648bc2e145951fcc0b3f8984def03f3c426b04bee8223bd8e9915017e030aa4073e63d7da141f80786d02d331361cb6719962e87d341c8bab92a097d82fb3ab3194a6424f29d7647e89d36cad3a9332d8f0deaeaf7bcdc0bd66272ad7db5e53ccfd63719544454cbac67dc0d07df07bc086731d813cba488938be3b0d39d86ebcf304a0b7178e10abd18f920b52185611a76d217f0dcadee065f4f5a5c90417e43bd42a0fac228cdbd27c530b00de40e5b4842b06275a7f85d007f83a5be3d26541ec9e014e2a869e7b226bc5760f7e4e6a87afd5602e27c51f51fa847dc1cfb38b11697c9c475c5f662e72a4733e8771462f4947cd484165d003ea02eea70e5d145b71d2a3f59b58b6346b84898bc0a811bfcda6637a3a33c293b41865a86741f4eb25146c7698428ad299177c48599be6092c628c0638b45970c47e83ec4346145c60e2e6cf28cd8e619e5769f63531e912dabc382797a7f2f6f2e25979f49e264bf7bf7e9c792426b4ac9d300fe61b24142084ee1c7062c4a91a290c1c223708b042e3b5ef5568d9f62068c82789718885d599117f3264f10efdfa71f07412e066e3fccf90be4410c05350fbe8dbb089b1d580ff5d9c0836b8c11289abf31929400b67700a25389fae27f145246c50bb485d0d8a8c315d3844538e1c1533ec0d90a168ec9af71202754e0991eda94f5c09c5d0b1c1f8f394d7148b9ed582ac98144b6c77c9d407d846d92719e2fffdd6e9f782c9ba78d9280431b22837b22e409ccd5bec2586c898eed5099dff05baa51ea463c04c5101b31f804a562fb2b5b4b267682ba515b48b41d6d98c14ca8ca0aee921c2e513dbb19b7f16edd6266ac0bd86de02a3ed771233d98dcb3306b501f135daf048628d68882fe888290521465b0c99349098daec05e9d9a6d34a86aeab696092fc87a99a4d4ffa80ddcc20c8ea8ceb100d20f84db673f2a5e8a0d4d053a228d95c637dc15960086ec350abb5274ad22c3286b91b4380809ad01b6c74beb77c27c4dda35b1394287742826681a34706de8f8c7ba244dc99a7200a009ff6817fbf1726ad0c71f8f9d226ae55982a67c85deb407f1d16db3022c7ecf56e4ab8d0333da96e4a11951f9d1cd69f372b655f03dff2363753aac16f282ce486f3b2179f61eda482858ad5ac003ccda799e9e7d31be334c8b1e4d3270b3fb2c419b671460c6feb8dc49e2fabf13d8ed39af1605379c8d9175862d749e7b353e5ab19260696109e19e3eecfc997d3174f300a5d5c1b6490f7b95ad660e7f174798ab88c0c9a11233dc673ed02c623580dd6024fdd2eb2638cbc0fa196b573ed8b714a98d1838f648665d80b908e53c96c6e8bbfee30237a22664664d661e931d99aeef747ef0e50e1462b4ba007b8cf34d28f73e28059f4161e3637d679d4a2c31c4bcf6f255a55c89c3579b3276455aa16f291f1b047c6b2ea05b6d8d6d480c990d1030150b51554489e567d44ea821c515a9ab1bf02e00cee3ce25c6d53efa1c45d39c67573653955f9d526aea248dd74a5608c440fb3d96eeefb0fa238ca7cbdabcb0801dbbda12554909ea369db0f487d71f1a625d11c7e45eaabb67622a2778ea5d4eb51604ad2de3559d04c06d3457490463efc90463a1ecaacf00000983b308dbcc258b4e74e65a7932ffac32319e57deed285ec12689cce1fe2546ab4503091352e4a35feca7ea899c0d00409b16f1e1d240d909dafa332424a52bc4743dbe8f232688c8ce402fb57201ea4e1209f51f9c85012f293809c90b60647f7b4cc82451556eec2e222c333143391a2fdb74a6fff3a1b09feade437e744e3084afc83b3ca42f11bda142390fb327030bd07f518d045c1347a27512fea7da461698ff6f7f50936a556f7254a7f9937628b11ebf88857fe88104796e7acd13f34901cbe098f97a5844f3b5e57c4e4be3720016e88e12e9b452ec425c69713c217287c7e2e8ef9f9bb8c6903db95c2f66d5b59c4a494e3559649d82f00f689f7ea7090f56804fc3e1672ee7222a0d798ac54940105d3af4cc0dc52e4770f35ba910578ac98ce8d890016a10dc0606f5ac6b53202cc85af7226f78347360ccb8b11c4a8ffb832480958169470eaecab6e13126e0e1cf8e13a88a507b66c43ead1f0f99813f73dd5da9d7a572c283c9fd7ed0728632a8f8cffb90dd1623f5d1100b0eab67afd40fbe6c8895f5b7faf444d017a784da215f0f940011cbabfa187f5c334480696f9e36c6e761a7645a8d2f93fb6b8a4c14356d0f5bc134fcbc3c70c3a4cf8470f30024ddb40208aa807e347ba23c47e960937bda86e54106330ff479236525936d45daaee04b219b7122f6a4516321b0b64c509483d4e50627d18b981e4a0c6bbf6d2510c28466739ba19c675d1fed3a36f4888b634bebcdb7730fcda50dbc12de3bd31853b23bc9feba2b80bf1db8671442f20e439dbf1d7b98f1a6ae0ff7ef7e430841a5f1dede73d0e98728811c3a43c6d8f1f7781ec90b78f9a0c0d0c55f8f0bf946996f9d001efa15c4ff71f9ae4f1f374b20a98359022f6b622b686bc08c969a309cee7b5ae021a15298acafb815e076379d27aea2b1abf01494a2b32021d0af3d9d180eef907dbaec5b2443d6ae9091ec1eea026205a69cce4f4a0d68cf8136335cc4001f628b484aba5cab43065d0ddfaa0d7f5e530e3beeef86a3de302a61cdd9e2ef851dbbcc229be3357b509d783a4f5de66923c62dc5b3c4b96f549a2d73317df37c0e40c2cd09ed7f39b1079384a4bb1eed203198e44fada6e9f4876ed3f55b73f1172547faad21e45c851fdab4afb142107feab5a7b8b2c07feab5a7b8a2407ffaa5afb8a2c47ffa8ba3d8a2c47ffaababd896439788b5755ee5708393427a570ed21867038ad315ce555be0c3a17d11dd312e009ee6e2314330e0c297ab0d2fca7b22ce9f9a476a08eec3b500e2892346fdc127fefad071c4a8aae963e4b4d3ac4ef3b6941453aa00ffaa1f29557190fe4d39a43c6a5af74d8bca24874480360c0d287cd73e037b99ed04c428ff9d2bc0ec39ce1ce6f25d52f801a180a3820a806c201e5a13d76de870dca3e96dc38b3918103a4b9600dedb4ff4886a279010df4e88085b32a546bea257aee0263239950ef407ed187199d5a1ec93e8cadfd64850b36b276c6260ab39f58131c28b8a06e089afbef99ae0774d7e5e0192277e721b6a7ab10609ea696aac4172a9fe07da75f5fc233b001d08a42b268d8ebc2843f45e48a688bf5de238b1b8d1c768648fd22e8672a2ba80ba6792c160e6f854a6ee745f480fbff2acc3c5e5afe982f5e2d9e835af47aeb27d126fd7839ee2651a17846514e63331314a8e47227d233d70bb798f9e5dcb1d6982b39b88a5ab18f79ea8a9de5b947e2d5d044e01c3ea6d9665038e83194986334344bd03b93faec96047e03af2d6010214a7999ba7754e3d01fafe7052223062eb54ce9681a518954f7a99599b8eb120262d71ae72b3520865e4f9b9ffe428b32b0d2ee82294e676c4753322f52003df3d702fbd5587c3786cf70a0615e2842abb2b75fb6cae8d2544756afb5deccfc87c1ccbcddc1a78f001953032fe14828d9d08b597aceb01f1f51288d6beef198baf4c932cec27265287e4fc45af9b9674989215035db28dce983fcae7f68ea9e256237a78956944c778dcba498573d5367579ccbd83a0025865e95c8236f3c4644763cd58cd7eabace1a340b553fc4244b02ab1770ad11c3f3a65ee07c287bb5238a57db8c528634b7566d5e92bfed689f583e6c8534793bdabaaae253d3b44debe51d71e419565c471c486fcf852a8a57fee72de35b35e8b40d35e7350e246b1bebb03d42c6dc75aa6b803e6b9cb3f15ac2ea87f00e20780d194d559739ab9f423b2d163f0bc78015c7ebdd6f62de3a0d6144ed142cf614c179131024c2e65293b0878600164676948c9405ee1bb9036ab36b5aaec3692caaf99464ee652325971e2039f47f40885c923c88edc4296a06d5c7a37710236dcb06266d298cddb633f0036f3d384f10e5f1a4c169bfade071445f0f8a330b0cc5d763f53e30a19a4d1178c869e89565ad69dc8169cddceff0bde8c1cd4e4667d03e06f691a3c5623edbd56a1d685b91b3d2544b83554085b778cd309c23c7f7f15e908d0d51ab7fe17014d9ecd1d8fb3a541787e8c474bf2c67a4f32a3d4f9edeb93187aa16b84e3892b5e39568f3658eb05e81eb9f317553570344a1aa7257dfc30960f3d9937c507f0295f8af468374b0c99f7074e839fe649ac7d07a048f6a4f48518ed8cc606e506b9c3c313f5476bb01eb8a247ff19c3c753f1c5712229e6076e8b38f35d3a2c5289db141229f9848024da3fad6f0faf5561e70619cb3d68e9090861d61dbc88d7bd21ba542d04cc7347109744d911056db13c28559f84219b08f187523f43916b46f23ab21429431d2defa091d8a95ee5666f6873499ddb65a71a4b4de8860c3a5e283b190a7fcc15aef83d696934f804a27cae1eb45f8850f4bfbe82669c48533dd7c8023808b2b23aea455a3554d53d7a0cc1bc18c56d0bb5cbaf6faaf465b9669dbc497880e156150d848dc998b848152fbb3080512bbb724c6ea0afb4fa77b69d0c1d9b0ea92d96c9e81e1c63e55cdaf755891e736eb911b157ad03a60c71333c2288ec60ea5b4e01cfecca90a5179bef85e328f07ce52bf4292e334a84e1fc40c6de8fa704dde74e379bd27e44459c9b008415b2211c2674b100f04713db3d3c33a9c99f8fe20baaf224499f69c75c95cd0edb064a26f0253a649a924e33ab69d82c971541e8da499632fd54e86cb2a30360cf73ac00a31231d15d6c83c224e3147cf3b39275c71e029de1d0594009a0406f364b53a79819ed6885368b9daf995604dbb66eeead090196bbd837ee376e82da560e805a7172ec55354f6b5d91fa462ec2a8784dd4231200f590e824fd3025082a6eb50908198d7899b0de94c9a46b0e3c64e23a1790196096e1bb7d5d3757df94bec3320c365e39d72c5b6af248ec149769767d8205a136908a690656fa8e1ff45217277c64e54bc2bfbaf57503d9421737bc803800bc688a091f87acd18f5052158fdb1561266e5ad2bcd06633bc77dab8030baed68951a194e16af7ffc00e88ff65bee15a2d9305014c95eb0260af56ad4bccedd20f938fbe4400d45ac24a47b9e0933d788bebf9f740b2bacaf58dabf314ea287288649317fb85d8891fb00f6ac6cfeec64d72623d9f89fe03d40474cff6132a1eaebfa8f75eeef5c0efa15dd1a16eb10a773ca823dc704a1ee9f0741277742c58ab2e0ca5a8e7fb2e6a3465ef09e833de23ffd40a98415c5e30547cab530c5fc3ddfbc670a27058eafd023424284df2f9d01c218406afdbc0b218230651a3dd7f8abcabc69e0fba58c8c15a2e4e30badc07cdb1adc1ffaac3986ada7e68f9b9abb743e43d709c4adbfe03ead262e0e03bae51205eb80db115ca79014b251c702cd1aade0de019b9e3e71b18625fa6a108bfeaf49da72e8023616b280a15eb512064bf54d2a24f9eb0968e21fed285ddf4149dd66d86c0c0e622201718e2394f85170763e17797b04f5ec8a8d58b273a53a26f2f325486dd32b59618344a2a60750117c93e6bca057f5b9ac972b8d8b41a1005ad7bf48810e6cfdb91c259502561b2555016f4be119182ec6c49a223d29b3bb5775e990a889390149d080ae297e70d5db22b2ce431737f552b27a681f0e04508118ca2fe4b306fb789a2772383c0b11b4dd0881df56bd63884917fc861325f9cbecc0f50b8ae72e0afdcc79143cd97df59c87f457286ed7c3936b9a7bb6b280627d31aca38ac2296c7d7fb7279c662260c7d3bcbd7c76dc9fc3bc1d99d71bf136bdf3104d2fa35251f9ea47afa4ebbf28d2b9a559601e948f4b1a0fb385e44e9c35eefa1bb1068accebf0d5333b610a03463652817f9fe685be81699a785fb59c8b27ae8f34652e366d337213e41e0109f35f692c78f61912a0c43dbc284c8c51b3007e3f6ea44157ba6e0ead7a68c057f3d2c1f28169fa094f2fa8e034fa261e2777ed584aff9d685ab2ba64512bb2c45c96f2148b0ac3b3e33a448dc9c5fe18c674ed5b410ef5ea4ac6bd6594227d04333efbee5d92365a340610478c75f223bd4e4db031d0a783950730bacfb8e93b5fd670ce44f102489b80c29d9e61b1190f610bbb2acb117660c625c118130ce36477682a7db1527633a180c537a8cea108aca6c4846fe6ff484c2e012c28f8368c3e7f0309b52e160fe61bbc68b91b3d54090285ae1cea9345cac175e10a078a38231f4321b16491475a7e4accecc62e172bd8ee49613f5bbe78a74de08b84c36c3f468577ebcc744bd33a1c04c7cc7fd2dd3277d55d7566caa679098ba559a8eb162fef39eafe7f3c4de7d37f414682f6d087ab87efdcf66486a59adb3b337bcbaec2193fc396d831569a1e3505bcc66ee4532e05d0dd175e6f7c3b0492020442cf149ad85aec90d1113698cf6db048f2c36257d0c93ffe1077eb1872452dd8666c69964821c65f725b75b9010fca4aee2c8c9df69e49f0020862e21b5e9249eea83c5d23702fbde1c5ce5e519df9899c4b03da1adcb252a9413ce2fbad54b29bd567dc8e0ab854f270460be99cda127e4b1933eb66581deb24a9b4e0e379d3372d96aa3e09de8cd0f8ce44e7b4364de60a7f8eb1338a47cd1cdc7c391bdac24c569bcaf6edb786804deecfa551f60d77332ce1f116744ca6d664b95f78e8b73396426c074bc181d0ac6675909f38647042bd00bdc6703b29b64ada3c1d7ce112f6ab0688755cb3e93a1ee68dc1d4e0eaa70a4faf61669c918dc5570035fd3e912f86f7a9df3810825f261c1d117be11eae17f7911cca593999ac8823c6d438c25af43e24dfee469e5b97d992e848b6103fb256c8334503b942137127db62d4456a86fa8bb040f861c2a9e7dc74711be8c5c57eeddf240460c6b387be2eff4c4209e4d3c3132bba2650e6f9e4aa36136e62e5501c7b1e706f034ca64e9c0418b8f222bf7f431fa075c38cfeb0f34546165f1e83700bd7aeaefcc03ebbbc0142e2cee7a1cc6d68336b36c72dd32cf9e33f9583e44d8de202b70ee709b9a716d516838c66fa511da9d56ad6ce0d1b09ac1ae918d1c12438c8b8e6f4d7164aa4aca86cef5cac513fa23d13be41d576b449e4d141f67cb6b11b3cfca02e547f30ef570e4216c2d892ee6d5f0f271b4f6b4b2d1dee01cbc1673df015bcd831dd258ea26dcd2b242d212a1e231544fa919346cce189c24f65d0b32edb18a870620500c380216930ca6b4945e3688da5e50966132535a88c4f9a80b3034f3720fa8f9755452c71e18566142e39614ca3587ee491183e3b0d753dcf3d163205a20e6c9ea572bb419daf78ca548f88eaf395d1ecd5f7c8968749a5b193924cd45f018a43d392794f2c3b9d8c8e0933633956345535f6999b5453aa152c8fb2c98c19489875581aa4bfd68b40ea1f8c0227153c68d1ce205ab7a43480de0edb5585a1f45deeb4e8e09e505a02424f79d83bf486d920107db6c84ae37437bac8e0ed61fb253faa0e8bb4ad606475d4d12e892acb7bf2aa3fa3d854a68649d9531dbeb9dc02930c899337821c14dd450d198ad89ea122ee46b5f994dd643d366c53cb00d01af2f4e9f07ca165989e6baac6a646e8883e2b2b535257096f9deb54b83c22729501e368dec047579e93bc3cde1893c7957788021db8d04b4f6bc8b6344a6acabbf45d9327a1c4e980d7ea48674087b93a0c5ac4593aeb53aa8f3901e9492eda23fb9248053154b8c7c10f32161042aa1056f62cdd2c37ee5b499dbfb6156cec666fb3334f78b886b76eb6d6c042082b7b91b19737978be4db1ce3b683d45055b14a95fd405abb9bb47943b27e44f9343244508c8e8cd75dee753e2978cc532319942473cedc01c1313b2449e053a2f741c1c0f2006adf4c3683eba43565f55b71e79c9d23400a73a9f3e209ef1c0a8e509c20a004a6f38b0800b49d32a447681385a61932c78b73cd58606a1a3b45c4637680a0f6fefc518915b172d255e71778996e42c15fe8085f1c8901bf836aebd830647c6c194df14c90143fe07eba2703d7e2ae48c39cd0213001e7d813bd33de29bc626dd07360c80461bc28e09a10d2d567994c646f44574ec1c539154ca6102be88b450b1c3da7a279b945624b0e5d42a6e464b8feb2155f59d1883b87b1f07909f33e99e6ab87605818938658bd496a78e3b87bac4e8e156ffa751a790530e5fcfc35795226fdfd8f6a24d9d2e205715f40d91867da9e3b4201e9befbc2e78ddfcecc649130092ee8a05af33d83a5d5177d87c4a26b3cf883db34a0543c39f991cf98cfc8031e559afd18acaca2d4a7b39b15ceec10506a74b1388b923529e23605b1d0ae473095562444d795045da2ca514e32a78d33b8f1c2ac31dde86120ffdfd9b5e657af4ad3dfe5462668aa2ed2e8a0aeeea5a97415490c6296b642973f8648a7bc8b1d0fd4d53534a56e5623eaa693ad9754c8c62543befb51509cd753fa24212738731d8612acdd33523915509e239bcf89b56c77e8510123bcf77f1a9598bb7d3a4dd6196a24837e7aab1cbe0bc1b160edea868a48e3b82d2f08fb2eedc8144ed28d450d5ba4d179e2380c0da9006c6b7f401e120a8ed4f151e913733ea5f2dc5678caf4c6ed074117b40ae6163f68cf2d18a54b4b3804e0505f9246adfef50846c35a13fa170afc5e5a89e5e9d9e84d37571e3d38da21c517ba47a8af735b2ee665a98799b0e67e77ee6d9d8cbb3be1c783a9a05fd8f32e1ccf70130cc532956b1d8527afa0b07fe6a75ddf7ba02486771face552ae2dc1731776223dc99f415ab527c0423d666f64e631608d1b7ea2595a04c89055236558106bb04744c4c75e50f9747d077d4c71679f8d78c3431c9025fad8016fa33115a51c5a2fb3f5642ac31209d8147b854268b000e66dbeb2b366c70f1d85df8c065a62ec838c54e4268496ebeee53c0bdaabed150830130e450557c6579b28207921abfabde336bf46141dbfd29c999895ac1e0e98c24cfd1adf2b1e260b7b403756098b7332f4c9a116c5025e3f96a7ff406220fc6687c24a16f6cd145ef400cf0a2e0701d8b92ed4b2fef8dc7ab748fc584a447b29c325ad5f66ddce2cd49710dd7a5b206b8ef010d41964b6a065ccb96dbe36e91326148560fc16358de3416f23641dd8bedcba109ab7a5240802351a386f8467f99b9af0165145f376b1fc8fbc3bf8048381f1b248f6664b195b10934eea108f90082058a7316075516762585af681e72a0d321dcc62781db93fc6aeb716a838a7be03abf38b0f6dd46b77738d3f53da51407442cbc4cc230a72ecf26772ef2cf404329f189451208d00d2150164307e4cadf7b13d8862bcc4691f31ee184d2f80f253d607e08de293039326385e8126b1f842b770725d263e8ae2517d7818deaef8d719678243e01cbb7aa48eadd7cab3a21aee1609cedf275d4ccbb4317ac29c055ae1bfe569702fa568c118f28fbef0281dece25274454c630fbb002cff84d78b75ee1709a7f1d4fcd24903f2e27c8850146e0620dc8866168e03df9809621c30dabe42a3333074e6cfa635dd373fcbbabc9c9fea9e84dc0ee84efb2678812beac7cf42d8062b0d6b0424244cc96f2931a48fcfdafd733765f5b84df625569b414b5d0663b227dea9dd94c1e2c3bac9add2234ebcfef1be30e668384b15a616ff92e6cd50b01993b3eede1f61a502aac70b9f9d0cad5434e981d73cedb2fba8d8385513b5bdf3619383f2ac142da8c2295d206d9420b54ce9afd135574c73634f3b3bc3cdea8a426726b6512d66b38d8180a5c2ce5c3f4e1c67180ffed20e4634ef31c9acd799994ff80e9c2bbef0cd9b05d74334a7a53636be0a20a4840506f7ce31598d0b2e4d7077ee93b0356886e59892f2b34f810ae33ee1e83d21a11adb862259d1e7f441e5606e476ba68a5e3d87750f406472b7660ef00e2c18c893b9af22083cf09c45961f174c2fcb61434abb75d534debc3266f309c88971f466e7f47eeb839517ac81f67412d309bb1d5bc6e09bc62570a21686e526a8428f2bd21f9973e602cbfb0bac3b8514a00dfa3280638f6097a849c458196e7c342963ca5eeed6e84453c632651f3465e1589ec30d5baa4bf98f0b1bed2d861a6801b4b28ee3c07dda54de0a1446ea6306ebe0b34be8d26bfcccfbe434d480d8c5480dba31e4ce5d3fbba4e208a4a92a1af8628c2a43e0fb7046f4ae2fe90b82c40589db6c4062a3782079707041e2e91a34f00f8edfb5c80472106c9a8f711a6126d9cc8d6b517c3e030511a084c34b058473589540dd511a1ff6542244e46ad0dfe5078f9b91a809aaad43820096a3057768db910c1beb276ed3028cf0c9210cc00e435f0e515ba5e5c21e3285e4455c08d385212e84357e8ee46e66c7a961728ad0f3fa6dfd60f00cc70fefe80379990d83e5db1480ebe7e9922d1179295cf366ac7cc01d510f7af523ca9940d87e55f0952eeb2d2712e29e21b5d75a3c226ca6daf169061b7d532cff8da94bf36b8f8a03d306b35226890e42a9080d36b1db9a3be357b1389bd7ef20bbd7161c4c635f36fe56155fa380a79c97b63e52886eb76098380d2baa20ad68216d8d3b9778e903ee27774e03cd5e90b5c845902f858acdc039c1b8c4406b0af5f7233fc2178818851a863e9b9d023ed21a230458b360728c7f9f66e18f546d95d1033e857e438fef5af6095e5f3765af6b102fee4ad9eb7e698f97d273f5e171746c7d7678a5e2ed0827ff921a42c458d0f1c1c43db09f736cf032fb28067737c73f280b33fa46d8c065efd4c058fa88d30283deb6fc555a36b0505c00282d019cc1abe75d8aa9814477e918036b57e4446a5fdb18a83a8ec09e2d6c6f53e60f0fe93782d522ab8199a5c518161ed1ecd1e0382c90d3fdc9824150ebc26e7399b35fda3cc3d303f5206c8faa3ab9cdabb88ee7ce0ff387a511e0eab875913c105e4ec7d1002753eef49604868d75ca297e3b521a7b3ccae59e793b23e70afd46f71b53e694797381aec31578c659029c8aa060355f9471e496b23dca73d15c0670b50235f735320d526186120fecb6cf53833f4d501686c99e8f508080838785bc3e393f22296b80e21ec0af199a65a3f4b213017f30f62a93da4423d828c35f87587b790632367982457b2c4442ea5367bb8de6dd767ae7e93781572a8203fcd82ed116f2d571ce89aedfd21572452f6e232a22bc97bf5d08738f05848178df6dc991b147ed7298da05303199126da28118b55febf31d09a4930e53a453a65d7ef0a7e879cce7d6c81af1854f4655e46b32dcc51c15160caea20920ffd689db66ddd81b4ed5893e965159f68cee9fcd1b1d449b2d1b66d490cfb2f60f2476b111034f94db04102c1289fc102696c8d4daf3dbb8c5760fc6a6da447d8e98a5a3be56f45c66e0a5dff0b61e09aae3d05fe0b979eb010a5a478994ff2310176b67218fbac73d542cba3e1ee23a8910d2fd654975d67b5d6efdc691260beeec8dfb573846cd1b53c4678fe9d70abc5e5c05fa8e8c360fe9321516a8720c649ec34d24d2e88b271547cf6fb65daa90cbb7fbeb71728ef6f4bed3675e3d6956f6dadd05034b8aae61b862d979a467814a2ca24f49d9f3cfa369370961e591912d5fe80e2c2e208babe0943146ce5413dd45f69f50c3d7716e2c82e38bfbcf2cc04f7256bae9a4ff94b4d34656a476697378e6e2da06dff10f1890a55b594a1c7e090f5330494f94f9cbbd0ad0c83104147020001e213f003c0153d299a1248c77ea0b9dafccb188d26ef656fb495083c2a6346936264f79052bc981ec90214b681b012d3eecea94821ec146d8bc7dd53668f145a8864539ca67d81dbc69a133b01cbd7bf5b07ba9b2ab8efd4758794fa223b216dfdb7b51c25e4938c7c45aeace9e12ca797bacf02e497d87db8b61fa02216ad47f01456501a3f634b9bf4ae417c240aeb4d77f193ced8a8a27cb8bbe7c23c6dcfcb74806d126ef475c60b82852356d12d02e9e07bc79596d0cef7c87ab1f50beca61917087b5e1a9a3df057978ec68545f22d05da002f8d8f38c21e1d71a477fa6f6b299b714748e65fe6ce3628909ad795501f5e4546abf2f0f380f2e8c36e337934c31fd322b61a2951f8847afb140cc56e1644180475d356c6c2ec01ec4f3fc9141e8a005ced9a1e24014c13b1248f6741c1fb838fbf83d78c4d96e7f22984045533d62a918d7c0cea5922059381413f6a6209ce7c5bbb76a1af9eaf435f8ad6b5acbd8098d4c4b97d4be529f751757a305a8e3aacf08288afa3abfd5010c15ea6c486bc238d5381afc4a6156c869e190dcc8613aec4d6aa94c496322a209806c0ed4b96667d569d8d89a677c16118b697b29986a1f6bd5170844c2f5f034a8604b5b24f9c81e2aaa48417813aaa0376f8c9d794697f73ba6555db55a32142c46a0903e279265f406fb97cdf3dafb10cc980c92bf326c68dd2861521c1f6a92fc618e01814ba537c73d4418e2aadf4446afad4cb8a97c3f31a5c93ca1c33a90fbf00f386607c40470b8c967ccf8cf71c610d1d6431dbdaabbedf12e67e03a3a128b82b26a1cc7f3da678606b8393e4be541241b827acfccfd7275d3aa0d1c902a3c5b8c29799559fc6bd45c42f64dbc9b96d7814af1d80f82b03e2899ca104a5e880825f3381831efe1b956c6f4c0f05c92463ca3837ee0810e519c6fcf20813d0d6bfdd9b6cf5493ddfa35f802165ab7ed30f1faf230210119484c01a208385fa560dab0617238ae785f6c243dc0f1d2fb073b8b624e378a35ac6ea8409067440d599803f2a828974418aba295bed4bc5a24674c03f6fe8b9c5acbae3ffdbbd96e17d995a62b02001c3640064eec6711b066262b98f09d269540437a91891711c853047f4484127f7f4b8f84c735c8ac85ba6b6fc6f116b0df9a84c62b2269a585404fd93342825af1c0a95c3f980a08da79f35c5eb0a18168c96adaf2516d76370eda624791e9d8e217276a12d7420206aa452cd8f362c23e1256eac1d24aeb9ca2669b1e0036f8c8e787de55557b47e417812da6314de2b82d929394c22c8b063b05398fde33eb61150620a58ae3dab1704009b472139246b25a810d1830b001260b1de0e89639cb10e510d6d973a7448a4ce6e288de646183a51e74fdcafb77629b2036031436565dc5382726f11cefbf05d2ab907d3c18297007b9f11485ad88bfac0b878c2399f00051a87f4db71ff2a10aa3dee38cbe3e16b4f8ede32af0445ac2de709fdf03150b02722e3d5d1d947a5283e18a4e8e3eef750176867c46b29a703e75352187d52707c5210a98e85df21cac7cc43dbc7a9da81cb1fce988225ac3480ea114517e4c78639b15e5f511911dece30d4bb1e20a14d75ceff6c993773b19f4d8cfea2d1c4ead7ae014d766908f71bd90ed8ea4da42274250c8814453bb9eb8b21574a6013581d070dc76624afc1188ca74b8c779b870d07479e8d36390d10d26e93c26ce8f0d20c0e13feb398b044c4f0a288614ed26d31bd33b663874593b3c0f29d919da2fdf181eb3d67efdc8ffd9d38a56836d03ae9098e48a60b70448e65a365d9a450f7ffdc6e6798288c0a11185d155b2082cfc4bc2d0b1e674d340818ca78904fe6644dd0328da74e0ed1ea96e03799959aba1f6849c4ee1128995e2bb1917b3d7d98dcfea8e6cc11ce4dd82ba5513cd522049c46146497d079b36d8dcb6abaae15a681f5853640a9048124354605c5643b6e1449418a273951812dd8bf40b05acb70258b4c989f5e3adc63c0332071c4735066edcfa5a02abd4f2ca38003f8981931ad6a5ed4b621cca66335f50d8df4f61457e5ac0c0445dcbdd7d00e537c9e78b8416dfe31fb3a9020f528b319d9f3a9e54413003d07df10022398fb7f7e77a4e9305d7c1ebae2b18a2b7b4a43518031f109ecb43a72963a604da22f823c24a48943fab92aa0d2731015793e44c4aca90b232af6c27b8df88e6cc5b76f34ab7b3348dab459b02c22b2d5924a4d3d49c1ee067c1623f04bd0986ff89470650e728ac3b93f1d3c6b19c4a54b9d852e2690510727b0898f5b1aca828525ccdd4ae942f4119a734e853a116637c9558d335229fa020c1e261243e6521d00688daf5ecf3233a1a1a349ada9563c01ec33b427238e9c7b9f1180c55ac33d994ef656d9a1d3754e0dc45c7253e95228cbbe51e56616bfbb1e8f4b48cf242046b56d003370ce304b30f2858980f301c01508a17181a59d1ad6c4dad5c62e7684319058c35dc7cfe4ac084f9c8e6b6ffcbbbd4582300de2adf61194f513720c4b371f0e9ae1e6535d216e595802b79d19b8d0474e455787a1ef4bb0d29de08a0bb86afb0f799d58874dbeda0f046817d1e1ebd9f587f6853c3666dbdb8253c8b01206f112fae0a1f08d9c435c2126ed70a2d047d2538e4d12104cea939b42944402788902e53a092b62ee8b3087c61076268825d8a5da40e55dedde385b91b9b0997031c30384c702aff3023cdecb9f95d5cc62923119aa7d55e0dc8edb06d0407aa6fd1f01492cde0622bf2f23352192a55f1e2cffcfaecae7ea8042c4e0ee4fb2cab3cc048753326335693dcb358bf2b1e5161e365c12081fb1267a3704374332f855c41f11aa457790d62a319c328b121c86b0e8c2060f2aba6bc1a48bc5e501c90e7f6a0570a8b1f74e5cc3ab8077d55c7963649440d15775c7c0e70f0759daae40eb5c9dcec2c90a3f9a7c1cf24e3d6921f80c5af6c3af7f4b680c9211c65ca7289ea66b3863972d32f371239fead3e34a3d6a9ad8f7d22bab9c268e72325f99f6fde3f45100e4146cf9cbff53af26972dc39ca8086f70d2967c0fb3bdf31259564abf7bbd2e7146e312bc686b53d83d5c60faac32d38ed7fedd9409a86615af8b8045ced6616ff95ddf4151903180ac767f8e624d6a2d7d863ed437528659ebbd3cd7cf775aca4474498a99c2d7473a1801f87542d699820e33e2e42b49d8cb2892fe1d95541124a2132d6211a6fa1579dce56cbb4221ddcab1899533ec6e0b9afb9face6a8b7f0a39b836efa92b9c53eef2c30dd9b3501ceac449fada7e6ae72975650ea4e771e5c789fd3eb7edc08184f70aaf6c21bbfe4923db21a961ae847073ae2acdd701e5898b6c19da52b15986cd1aa5e30374d164a5338115ca4d63510bb71cd42c602ad21aede1473ccf7ea0586a79cfe3a388867126bf63911cbc3d25d06aece51f62b198aa0ec40fa6aed1760a23953e06ba6b4a0bd9837a83112efb516dcffa22f94e9685f23b32729b1d3595251dc2f0e5c4ce46c0c14a922180db1088615348968c1f4c945f03d485803a541320dac2cd5f93eaa6498ed6ec06ec550116145b630b378bcc6580049dadf9adc744b3f1c7d38cc61a6ca62a506d9b2ab1b8f446e46aae776f23dfdcc35fc6e3aaf5e915fa72db77c3461b3cc6b31f031ccd170af2b71090204247f48fc314c4bcc892228210fc457ef63bfb18e381c2ea5c93324374c5e971fa3d58b85f333ebc2e21d38a0bf30bfb8ce8b00b3e77ff868cfaf5f1208dec01e99146a8df1a7fb79dd753e302f639945b908d864789e79697d6f120c18d599276c552501197fee117a845baadb68a801a87eef5aa57430152ab195d2e29fb2e9c024ade53e1c9146e4bf798c7f4acd466a55bfd74b5f0300df1bd12c422ad2da181ff0dd6c5635d4f583511454fbf9e969905f94768e02902e2dc103dc6f0cc0ba2c1bf1b934bea28f681ff84279036403bc00d4c4313f4283aa5a2f18024c3c98371c9bfe770272e06e5b945e984adcbe3b68dd647342b029d5db50b1b9e233a1e8c4fc06e02df46447b308bc2af01af55e08380b78a38a1b80f2a0ef38507577fec4a4e476fc76d9a1a3428d9ff648d64e7f807a63e466b82835bc0190fca1a18b44ea3caa1958a18870abf9d728b446ce4d225059061064e46987feec205a712f5739d6261a2aef218bc3ff1eb46b1020fb44f658ba1f70cb79d676369a23f4236149da379abcb50b326df0559ec371fefcdf95ba18d4a5544a4f804ace96ba4e23acc772ffba0d24c47539ab9fee0bf7a15f7a4beb160b55491be602f4dbeccaf802fd346aea76abe0466e08141ecf1bbbeca28677d66d79ef8cbbd70bbb7f71832c08d361c4989820687caa8a97ad538df9d960a2ebed08b62e0aed5c840deb53223fd66d5ad20946be41cd45c48a9347d6f131b175a1c696a3802b360a320acba7fcf034ee2dbf15478862be58a3232133d0b6686145d7091f19ece7441ba06bdccb9fe3de83d88264b237f7c9c6021f9153db41266afd033eaa83f76ef5dddb54ba52441082a492562b6e328ba2ecd1172d975741048e95dc3e1f9f7a681117be12b82bd6a9790117efac2c6444054392bdd339a37404923d28bce2ab15bfd41c2744235c60cc83d306bde5cbcb589540231b73bee04f2e5bb93498fcd8de9e2b4f42830dc849b6df526cb5f94c5e26bdf3d8d03d1a12a280f10e9651e2109e8062fd8743398340461015684e94c75d932a7d94eeabe1f9f3d77ec668b232fa3499a1e604df1a850589681cf87c8f90c8ff8c032374481c526f30432be67b96017994a60b44e4ad558632f78d1e89097787580c1637c0cecc5b89bd1f922c98609845bc157f04a6dacc53fdc4419b36deaa8cd126a966553280a33b0ffb0ed66b32e10fac268eef47d3b8520b3a75431e45a8801e5cbbfcac35d16867be1a1a6ec727884b05717236abe09a916049bdfac3f5fa2229b3ed537d4d1a48bc179e2b3d39b3cd104baf288880cb1e873a1199259db9f0a73855993f01feb0e354f2cb88fbb45c69b982908969de5207354d0559feb291e530abbe4d4390097eea3d931428fe9e52bf1c0800794d40596a4042b2b123d9be4ba1888e9301e7be8ff1f4729e19a9136cf2268e1d4792a5e3fc263c494486f01928273a8189cdcdfbf44a38efe60deaa67b87cef04b9df77a04c0b818d181ba2dde831446190037f5a80e03bb478ac10469429dbc8b495b206b774119b17e7292282c2fd0690c07b57da07b1e61f2e27c7a30781dd3ea952416097edfeddb9e40fd8874d72e9510d374b691c811c6eec989300642aac8665e243ba16dcc3c7e5f34b783360505e003f88ae4f6f7cca3c335ca783ca7eb70182a3db873830cf23c21f1a51f8f29e99a5f9b9279a1264bd43a10ef5f62420e6a6421e154d9c04603b07d895d2476fe4a074989008129f909dd2fcca0f344052e80baac0571c5a6f4b803e0266e230154062e8dabaf931c0d618c96229d58ee00b686a1760762b1ddd7c5e0d26b8eb9a096bb37d0b6e8af9a14e8c370d0fe5cd9e71ccb32bf77a0114d9f9eeb5247a3570d7679d5504a6496c31b1b07abd68b5290edd6ead888dc0dab0e9a28b393a7e723dc0c87f8715b7062040d16d56bebcd0c35c601d2258a8e248ba13629d114e6341204f433cc0222dae2f7a813026c69d42e3ab94bde41bc74a03bacfd0d8c69d5ac47bbbc05a016ebbf30aa8ad2ad49fc9e8b5e1c3e76da577bf5b4a85b693f8cc3975182f092c21ce51d92586f9112e77a9721642141cebc305444c28265b0343d0367fef03895211ac0bc5777133a03e5189516d274aa9b60939b47afc75aa0127859ca7a75cdcdccf04d4421121ec41fc0048800f22e2c26950cf37777d69fe639adf45195b7bfa13d78048e9f951f96a2f37881cf6f497318f26bc3549386d5362daca6421f35fa46ec6f7139843bbbe07c8d334c779464e76f70ed75818e57ebb8e8ca2710b434a367f2481e4b3476bf5bb5cad016e2b5089f897c6b24d093b45b7bb8439988e1d1e4008dfe2d6de40b0b059794d87322e25b0827f7cb1e420bf0e8f7c5773cc2deced0ca4d12c02e3b54c73f6308994b400cae2e06c0b29f3ccc1ac00550437793dcfdd3751302d767e1c9ada61a9b2abfc1998f0779790234dbf39d0fc5d9b2f00d94ca0058412dafd65d1a3c6fdd9fe0f9468eb8312f78221ab3894c5e2f2cb8a2b4b0f4ae44aaf6da1f2573702cbd93d04264b9f2c80ebef1eec6f0f9add079fc68bb74e0c897280efdd1f941dc0670c62e53fd1856982889ed6d4774fe17f161ca25b1516215c1fe564a2bf8d994496bae4e7d07f3817ef2cc702ef51cfcfe94a6da5bd9df345b1010659ed14085a1894e56889a378f9fd2b0fb918b8039ff9cadca37df66abf010922e003db28657ce42530b0f6a9acad08a58967a91b91d3c13d34d90160beeaf5808a4541d74fb68af8899795fac006c0bf6caf99809cef60b2e2b96bdf52c063bc2da2328be2c816366e36fdd0e69d5113ac32eb61b74c0f107f98b66901b1e98f1ec8bb95a719a7177ea4128a73e099a572574fa7a06da9a1788265d9a0b1c4cb9eb25cbd3bc07eab9095081bf60e0c8b2af02da6eb143622d4a35d51661795ad711baa0d584b833421b691ad4b5c8bf1d52987f00c2307e69aafec3c50855e28e0d98356ba65ef29c2b9f0388a4f4731b1851ce7aa6970b6a31473001fd83577e640f9afefc34ccb56208e1a6c941c26a73b9e6926a5cf3c8cc8397c6a52a4db8a8ebf0eb59ff5ecd8326eb49f878e6b45b98c6e21ffe92f486091b438adb81b7d3490d296f18392261bcf38e6440e568ca9755f2ffb02a445c25277deaa8ebabb0ce94ce277410d52a4a77e90ce9b3d84a52868adc618eb9bb7d86e9b937c4e604bdb27d1c6fd18df7307661d4a24eda7c13191fef8613350caac7c601b36ce94280edfc172e11aa13726452b93af0e61e144ce76e981a54ff7ea1d7cd9b74f0e00342133b4ca51e8dddc2c0f5b0f4544d3b531fb497b6a9db5bcbef72133404e378d8134ebade8bdb97d5656afdd96905458585c35ee6034d8a7aaeb3d56511a05d6369941037f38d3efff73d9c699e4827f3b2af344e0d99b69f449a0174cfa1067d73c84232aa3c6c9caca7f5a0303ea2782128e59e551b2aac082465d2c884b3e466b1c8e7f512415e6c9fae2b415a8b71d04dbabe0ef6ea26bd4103f8c70f62e005b61e5ab08c5c00458a7539cc5b2e151e85a6d6a1705976766e1081930a183fcc5b5e023ce008ea2fbf5e3a415e8b3c6da66d7122fe2348e882587c4bcd91c5472789a17b7cf7deccb34f181e101aff491dc40fa482b54e573dcf1ccfe0b49942a46f025d5b6d6f63abe3a76f03ebbc52bb79f9f4c9ae2277c2a6088460034719181f9da5cec9a6e39d3c6f34e972d810f5817dd06efa06b9ac59d54525197c25956a3925f3c682b18988def47ccecd9ab42c9bdbe66c24c98452a6208bc79df15f609fb4f3538898f009121d8ea691afbdad310f1f0c64a40e765ec361c2a4cca3efb6c0c18ed5a35154d9e1ab35811f456f5924d1ea9674ff73f88155293557192ab57bef326af23c75fa0a95c2850821df076210593c84745a9d26213e3561c5bdfef1d3f81fc88102d45fffd45da83bbd58bd83f4fd15a3c6f636ec44d1e38e969635e761135978b75b3c73f3804cd6781bc7300616a61b194122e2e431785a449bfbff5d1b4010b880713498b223d0b6653b386d2157e65df65160a109f140403da4c64d822fb67a4d22c652b8c9ddaf0ddb6e4383191e637715602ac0ededabd8cc54b52a7899d4809d7b64bcde9350b185560b660c580ac95875d1777e40b686611be9e722bf3c72ed233678f840f50784d2d58d6f2a11ee5666f5f3c508411ec8e7ed43fb0ec4426d3738efe28c9a9be4edd33b356c7199ea89dd071f30cc0a6c6e6ca5e8e4354cca6e39a6f535ffe1658955d03b60ac986a617608ab2f72b606aff3ed7afcc9f6d52154df0dbd2ca290aaa3978e8aa6785537c316602cee268c140ed569db203edfa153197bc92e662cbff2b30f3261f05171759ab9e09484187b9132eb743dc135223314a8e1bac358908790c4ffba8029e2095ea544c81c42577cff6a984e2e6a1d5a9e0b8362ce2539ce0af423e4e43ed15516c4ad6016e140f42dfcc8bfa040c4224109bd625cd6c118cf104560b4edb0d11ddc702a060e435d7f93bc8bb9b165d3d6ce955f0914cb734802b7f20345ce2faa1bd545a46d738527f7fb9f4ef73f690c6dcc5090173b828141f93d44c82b14b48153a8f3c7941c3d44d5b6d89e19b40c7b59cbb34b1376e24c460b75e5f5c4a34b34a1574174a690c063a0ac76000c42a4fdc02247cad9ec1968dbad6e37cad100af57a271039796164c0547bc0ba7e966289dbf7fe2d962a5b2b694ab9c493cb04ee6e423ede9e964dbfde002ac42c3aae38553a9d7f60d9d0fd5331f1854de4780c1fc8a2c5cdc1ace9c6a2d3719450422cdbe2a454e72e01b46d996c5005cc23bc1e48eee825561d4d6526c046a1576658d2cc7f4dedecc7470ec68533263a2a27b4ce23d99e677547fefa911b9f1e5f472ef73b0008bb3392d25842bf69bd76e845e1ede58279678943a18383fff4f93f2ffffd1e8848df4a162f76e1d5e6a74897330b44c0eb7dc73bf68c30177e81055cef070b90b02010451613e06739f1256bd694eef5b38cabf564c1874939205603ef57088501127ba5966dcd7b6ea9f3a321045ac1bae72a1fc8c6f7403e9c67175cd52abe673755b95d6cdd0df6e070f2fbb5937b5ba720a89e0a1d364ba37f9538334a75ba33b4805289f4c2c9a27a6b5517d04ea4706e75daa4ad8ab468a0fa31f3b56f16cd1527f10c07303b5f4f03ccb8021ad826524858bdb9d069f5572efbe8b87fa9595493e0944950f359b0554c8af84c810cfa2a4dabea1bb9cbba627423de5706d7489739c32b733e9df0bce58732aeac44014d9df0247f22400e948e268092740f2329e0a17569ad04b72cf7b64f900b2af55120f905fd12e5706df170d01b1594973646dde31c6372dfa30ac663bf615c91b4b6cf312a3d06b42409215e717fa5f02f489701ba622b2b5336542d0b5ddc6815b78304ecfe960a0d8413efef75182255d2d3355c2b2e89ae9cb021419970836a29ac8259152650f338f88fac10d19587925387aa3c5465d011e6d938b14d2439b603897e39c65c1853a27bf23f09494ae645d6e9ac92bd1d100902e71f47312ef0ec263cff0b4fa3f8465e3859e9cdf98f4674f37fb53d09cc4009506b4dbdc165322ff92eda8b8e060f09eaf10a5d39d4420aa23baf870009e966050fcca80b10732262bdcf19549fa318bb376af8d84cd2a723b7e5e91bfaeda957556690bae0b6c03365dfa8ef50b26459850887a73233860a620b834978f2c8bf4c6bdf81601af1279cb3fb9bc84251662f96d49b7de0558254e4f61c1de853cc85832c020728136a95a2f24e8f84478e3baf0e4bc57fcc0c2c48b51fc548cb16d0d9cb6551ba19cd3f7fa9e321cb0fb1616ac424fc61352b1ed9dd6196d59be402697bb45d10b50e388bcc7f2f8bf6d1654c648bfb8fb09b4b88d34f6fd8a4792fb3534af3237a7b120bc188a7e4bf9baf406d40b82e4078083ef1a69fda8816de053d1d8bf2a6612f0c52912a48eea7e702f5349c2648e5bb53dc8f2c4d09363b418f2e682ccb14a40cc91a27a03729e2e4a9a1fa4d0cf51615a02dff1f36dc43e3d2381303f414d81ceba37dc6427e60c0db7ffd8675661e90c258c96b941fb8b8a1f9707c42e64b3f4ff1a52401b04800751044bb2fa7ef9b0f996479e78c24867f810419b6441a65bb26bb0dae7bef52e68d1a875ed4de9683dde9414af7228005af6572f780081a7e6be51c9e96163063b71d52297d4eb5c68dcef68308cc0bcf3ad7c15f78d531ab47d252683975fd7ee28bfcea3870a1ee4263d463975f5940886a560701b47612980a0a4c20ec33a4de85a17f2392f97e8a17ea6106938429156802ed8a8ac7a38899017be862e06a7d9e34c2eab09232cda000da798a4eb40b1479056c4dfccdc60aeb10093e97c602cbf349a98811282242e0d6625ad86ac6818cd98b90890a9e18527152e924ee394accdc323b35d2430218cc526d6e106bc2a345d5be1798877a56727a65cf6545f11398102eadd021ecc32a4542e16afa45b4e4209181bab0495df0f299fcc4e80aa92927622b7c39f1ddf70ef6305b9f82ab41f6be1f4e6117300bf90c6ab68c92135603ae3241425eeaf0fed4cad748be5881c14506520a25060a45720d5e525190155fcc6960225e00bd8fb6ad609d7dfcbb5399ee06083dee75a50bec02834b3c0aa1f04d7169177198c97f78465c1b230ca16b569d82a3e879f6ef66ba1e22ca78b7fd083d951f2c3f082ca2af591548f2b4bccc7717612d93b20285b98868141f2cdb293833a81f2bfa6dff4491b8fa1097b0e35b877a87a9c4f7a556d304075b30926469374db8e1c7a947fd60f8b32c535946d4ccc70ca8a84d51d9fd442ede63238c679316930683335c34d45a9b09677855b2fac7eeb40c10f656dedb37ee1287b6f4569241c488c5627a3719d55b532ccdbf649e370c2b6d3d8fa634ad3f3488659ecb825710058dc39aac59c6a32f437f7f2eecaa2e00c496ba8b3c8e42c6e5a4cc1a537d91cff5041d8ef565fbabd69b15c2c5cc7e1cf81e68f7e77d07171cc82b96a180106c7a4c9ec0fc6270f404189453ededfa3a8e3117797f04f0322ac7ea618e1ef726a92a7d2ab62a5fa69a6b951e82926e8f2d4474544a9a44468ce74c538f45fcc4465d8807ffc568106b5abe99934b9e7cce594e27bb31a013c484cc22746428829975354e2f168389c67325329ac09626b379a781c5281007a4c77372fddd47c51f6ef25a1a1a6db53c0a393a78b8a8d2abc275a71015d8b1acc750c37d576593659b277ffd24f7c4c3b0435e79bef8c15ec6634e445541393c6c0e286e68016015ea2e5751a417e35187dbc78062e904435bbe0aa092e756e0fe0a9b7912335fdb8d4f8321acd14f4cb85786821b1744c56dc1b44daed8a908b2dc1453063385e9633924638dbf1e7ca3f579376e60bbc3b787e84752b8927a29f02ffe3c7641e398bb97c661a6662ae31a74516c5b2c92f8587cbb16320787f3f6e00100a9f826c3387238573a070770f2471ac39229bc6134b2205072bbb0ccc7c297adea35ea1b4d141387695899b7c8dfdc315348021829240b03c60ae8715b8831f3a6da6da430de968dd910aeee198431b97f24cf90334274bea49318ffe7e74d7d724a520f7d9af1144b87a71291ce5578bb368b7e20c1e064ec336fd2b2a590b1151e992c9004050151fb17106ad7ca8d6c9396b78eb8678043abe863a2f7c727201829525d2955045ed4db50ed707aae60d348446bac3910fe51bdc866d103d6bdba0d72d52249fc9e567fcea9187393f75e8dffed4409a9647c41a9142f0fa474c0dfdd6376f88b1f0183bce279d7c67fa01f8e4b7ea406baeb1615b221e86670910d10fcad46f3504b1bfab84a0bcc09dc93d1c9c9ef4756191ed2117ba9a91b1d92ae1e1ba70be3f0713aebf51dbe4218fd3b322bb5eaf93095041ec1fd26c0ece47efb64e5e986c276ac6d1cbd51d92bf6f3a39b4fe916dab9acad8c324c58224c50981351ef46204e80f6def5325942fe8298037132aaa345b87c7e6f25bee5399718c7069ed63e3e1dbf9c6602b22027234ba797bdc93f235dbe207b6dd1e0a184ccc3851bd07b35fc916085b6e500996460e0024eaa3c776f8be362b15859dc96d8ca9c2e822ef58922a3b5a669f49d33863ece12b713ed44da56bd9ec0934c679646faffb3311c8a47a87ee89a3af56861d76af16c9b22ea59712262e5f4681a43081cb40b35ab1ef06cd4d185433fdf509587b50110410e1d42301e0edaae9457cdae57c66560efd1340629f9af035bf7a7df5396e55ed6208b123739e990e95078876111bdd2ebc501adce59d2b12bbc39040121d8f2eafe62994c936541185872a68497ccf389ecdd63d82a39e90469f6eb96204462b75c372b290ee5632598f51ef80bdd2d3693155ce7367b04b758999d7a122baa16a83ee3b54d1f377ba0d6954d03301ac74e1126459b46d11b24994344e5e4937d4468285f29efdecc10c2c73b4f35844ff3055c791a2103b55e8d3a3835b592094f09036ec0f02e0006bafb6e35f35dc134fabd5428cc3600310202fc28834cbbf61f049cf0aa16c59557862713e12ea5621b7cb568756778cace1403abb204573ff855d82eb9aeb1b82fb3aea3e51ce43d7d75a9034d30aaadf2600cc90aa4d80cf3250b239fb6fa5683d25ca18a218eae67bd31cd193470e7c8f097f4e149a51322108694b64d717e6729b0e6d5ee67cbd2edea847b86a31cb09ff202a90b67f6dffaa7d1d5c11d80045df5aa0a73a89cb0b7b153a8ef4a6074752e1997b942c9c8c8d5e41a63eb22b537954b442f342746fa2e59812be774e29656e5fedac8d5198fde7bc228196fe48a8419b6395c91b311bcb003daa6e68459309a59a5034983c0ff835e5bc0e5e1cc4dae5374b7d82dc05fc33c3bb0027d667643d82e597c880b7f356f945d5adffa5803b000c48e3f248939b1d4bd15628032842a373dd27b812fd854f18843eebde5de5b4a29a54c490694081808d207b8bbeb9ed591581b8127c31f23e80c20c39f221ce52864933fc31f2314652cbabcfdf972da2beb77c68023794a07c09cf1f0afcef2c3f3a72f7bc0c07704e61ceedde74f81f80ba11d0bfd491bb6c4e8e3f7abdc744f4e16f9f459e47b9945c2171e98e46a953cfc9bc53eac2f59ec7b5966d879dde765d8241e2ca4df7758c068e1e7efee2b79f3f81c61145813302835370c71c3cd0d3637d8c81c21839241c9a4925ca26bc51d729b6b85db5c2222222b8676b082688726b296b0766c8ecd49a25235c1d3844a8542f9104338aa9534acc1a09b6ab5ac6ad9ead3b909c579e0aa66e23c68264dbcc97593b76d9a0446a56a82a709950bacce103864edd81c6b498d4e1e40864ebe60844c79a899ba94ef3f70c8dab139d612d6126b899593465a6b1255e0010ba44044122c1805dd200548f8013ae205339043b8911d7e5e76182740d97f9c48f1e3a4e74e1938ca6f7c0847f58d0b864c2673caa4647072bf9441c91c21939249e5cc59e7ac937ef48f1dec1af39bf38fed980fd9bf391beef5b44182211783820d61433fcd247f43a68dbc0175c3cd0d36370c7103ea06144905243160c720ccb7929d5c95a4725562936b4fb62f331f2e59da97f6621863bd7d9bedb055faf0cc039106c8afb3d4b1ccee8797c3bd683b1df69758977559336ef0e73af17bd78131f5e37b0c608cf5427c498e8f591c0f5b9e15887df952888049b63f2b0f9d43901e3acf4e07f7fcc63df8d88d7d5d6adf91194660f9b28340344ad15a072a65120ef0c772bd7d96abfbe165fb30cbf82431584c6018490578ce3967942fbf90db0718e3d70718d3b9df06172416f1e1874b249e9ac65dbceb194960f9b387b47e0a9114e0fa1f348250e464ff207e8233b483098a39e27fcf421ffe407193df4d4fe3c7e7a8bec3c8e8d951e6a0bbd0165b84639f6c57a99ae0814db44ae593c221254ce1c0f103f895b35e5a6e7ecf29276c226b244b3881b4155d037eed60d7b03fb91ecab3dba1ade81af3ebcbc935516d221e6aae1da5332a7bc02ca19d3d7812a56d642be99bbe714232620303c98820be1bd9fb09252001e7439f0fb9238e7f038945740dd8357c28161171228e51c41972f7a0e04f060e4174f09721df87dc0423ceb501fefec780bfff219f253084fed8e7907be8f02507619610810a0934606c1491dd44cb40934a09244ddcae28c16756d23230cbef9b5c031c5f01d9210c22b0ffa06bb4410533f10738451850453346e40b963063dd867e0bc58d106e668cc42842ccd4298486683263440eb18599da41b7e1c80ce6d7daa002d8b144a0be65abad6f75f68dc82094702ce577d813787632dc6bb7e12b590e7325ee07f884123c4a668cc423cc89cb6eec091ca3806377c1b0933f4b030a3130c9fe77257bffa402c682fbe6ec9c9408423f48520522e4942d780290adb53e410114706830655a1c8b0e360121781234633b1b5da280a5c5eda08f6110be54fc6520d3e6e44f6e4829f74f2350418a991fac37e2499c20c10c13f18fcc60cd0d29e5f9328753161daced58acc55939a2956f7170661ac931fe57c2a280e7d36c871c52caf167db6c6336640222767ae71631041bd8060e1b18f7af7c0bcc91e404f60863609017050e7cb2ff0a908c96466225c39f238af0c44e864219fef408656c9bf02d0eb0fb86ac64fb99ed3ecf5eae2f87e44a2457cb83917c795c1c0f9defabdc247f3e0c89084c12ea25ee327f09a400863f3d3ed925c39f9e548fedbbfb70e4fee892bb2dee3a6b47f202eea694d2162d68f7376985b3d165fe5502cc52bf8182686866586a17a455d1657e6b9ffdfceb8a1d3421a443832b860086233610c109a4284145124cb0a28756bb6f25d38f218dc0242f603a9f6361f1db77961c0b8b978f1fa33f5bdc84b5f8f934b0169c673b5a3cd63e88f2f5d5c76c8ffaf18b7856e962115d03fb1cb1997cbd244f0fe3800fdced8059bb9fe59c78ea26ee327ffaece4f9ad2a01fe5c0514427084105a20018e0f666820f181179078a204152c9899fff3bdf9180ef0f7593b21e374e4e0de7c1840e0f9412640a4880486e8b0830532e0265a6b87f1bc97f7f871bdf53d2eacfbeaf760fd11ff8bf3af9deda8a414fe3e4f37d5cf81551ab593dfe2d918da9c85921e9b9ced062db4d65a6bad7debf431c638b14f80106666b4d6b21d2e65cbda203be4c0814511387e5f9d34027fd67eb42b22b38c5bc4b81f1a0b2bc802d08c118cc7044f9861423ef6524422e47823e6f825d4000a2756900229392062c60333a0c2d0124a8a5257ccc47f4f2a81c51f0c7fae98923f4f9de0881c1f66ffc1920c9fc8f0c789a2fc83a31c93e1cf0f9a6427729c48b1fcc8fe4256b80e025545cf4c8e23e15e8e7bf1bbf3173ef86b544a89955fe988b84b7ca30ddcc81f0e59c8fcec9b9bffe190b39f5df62421b07dac663dfab7af7e021873e347c098adeb1bf8d248c0da37118c51f9d8aae812adff68c89285c530be4a07e10b8ad42a8bd690bbfb2cf65bf7e19c23d290bf467da4fc7550d0901bf9120122e8573818051060403303b31b1bd538eec5c76ee4fe2ce58a04118191047f4384c8b72f1fb35e4a529e1fbf953cbb1e7223db95ae51321389273913618e0f135de2fff820287f1de4032015200c7f9c58e5af5126f8e384909b560dc54f70a6543232b2339240a1508d6a14910b134f18420c1de6095400ca3ae86b544efc46c5ef94f7e00de0409b00bec42a2511f0257eff88b56b22a017df336d147c892c3e62500f15c5efa05e29b102dd85033b64d742eec5200f023b13165e4a61da7f0f65b60f5f5acff219cb7d983116893b8c613769efbf42056ead83f16c0ce1c9bfb81b36dcf370e992f21e2ed9f770a987dac050028eaf1561960d707b160f6e0b134f4080f063530220440103d48c0192482289257850822e24090186992c7c187124f35c421270d37e1a604af1576a704d8c314697104228637413b44d6c524a0ebec0b7d6da1823e904b8df5a021fe17e184248689f33462b4cf1185978748e3cf4183a368ea5528c72ce18ad3045c6185530292a5d7dcbc9eeaff2e76c29bf62521ec1e9d953cad9d1dda74f29a78c81f7edfd7ec33d699aee36a4856f238c7b6d6310eecfe1306480fd3b27e56e93a77c7984fba5306167eff60527ca5f112f32f38541f819c9b4fb8e4cabf3d5d9b7b8f9988da86f5acbc14c230eb5d6d2afb5da4aa19521c37a4b96ddf40106a10ca491760d991965d780dd7c3a390bbe480b5ffc0945ae11ee95303efc1602670882c456dc246fa91d7e32220f890859c0a4b51697de638c30b48063b4534697682dc658e27c24bb436ff8229ff404f64426396a9f8d132cd2011c373608c464fb243fb3754c68ee9af65cadb5d65a3fe3646012df62dd67f1d57db8f4cda426d3f49423ce795cd57ddec4a5f4dd01c6f37ce52b5f39cfaa7bdc6547ed4854e0f9d49b583caa5211fe9ca70ae91f029329b64fdf79fc646110619867e72af722a57376d0a23faeaf8f75bc95fb8a741602dd132267679da748e7e94ddc731ef7627b16b07abb29eda8f5266e82de24f67c5a2fcbea58ac1732bfdfba3a1ff3fbeb1f71293b9ef0388f9bec4797e25e133ff991bbc4bf0103e379ff3cd18da6c09fdbe4f896497ff7801915a1a77c07c6edfb289eb6ce8d8e722cf551ecefa2c9f5b79428f1db0873588a25eb461d900074e9278a925b4afc58fa12b6273933a4c88d78f22cf817728c40e418479023eddc08bec427f9606994e3872393eb3256104208e10730d8f2d1a13c1fab75289e684f74a14f2dc69fd16e88c5bd2a7f91de05e9bab83f404479e5498f95e453f9148312b07f77f2fdebfeb5f2978acaafd86f298a50e5feed9fe86448840c7fa608ca18777b860ddeb2f6dd6d1803b1968ee3be95a7618619585a48a4d75ee545c9058c2f95de05f7c128bde03ab3644054544a1ccc2a2e545c904824920b181910d2bba801e6f0183060746ef1c2850bcffa8d4ac6c3332ca93cfd193658e5b58e8587ce2adf83cc2bcfc39657feba7ec56bdcabcf2203b2f2a4ae87ce2adf22e3a1d2ad7402b80d63ea8c10e0cf5101b8b4a754c2b862f555fc9342b9d6674203914f85dc1457120a8cc97ec8a7dfa287ce2dbaafc5abbc7ce2a6ef7aeb7e7d09e4269cfde82252d936c0fefdccc7f5f729267762dda93bb9fe9d7183b5771d3709b97e05c6b8f8fabe0218f382f4f5b18b2bfd0b8e872dff8b27715fe945e782eb9c654056fe5af9eb31bf2f38985d7cd73beac7ca5f9fc3492bdcc5f5d09954fffa54b0178c00d7bf643c3097db30a67ba87c91cea4ce6ddc53e9be955fd1b219404894104fa938aa2685b2be0a59c954fe663e56540a701bc6f010e237eed52fd2d96ddc9b01449c2102fc794daef55d0709377ddb5b5f856cdf5fff663fecd641f7ba73db304ead892edb35642ac347eaa1e82618739f769fd502a62f698c6aadf5b60507330b0e739f4592eb6bb6c64df1ebd7f72a914097fa42e4fa9f352257b982fa979335f0a5765887c435adce9118824372480e612cf4eb7fd846eeb79171add5dab75dfda12f32ca32471a1a949d73540c108d9e9d489964bff044e309c3b701add14e3c7591bbf85bb798a66493fd7786f2673310f9b3b93bbf090277864fb440c76fb2bf6cd2d324fbcb5494a9e8393c871f410e4960071d4842c0fd9853eb1807b821ec702e741b1a887b12b3745337907bed93029c919ee09a4a7da7b880fb71dc9bdd2763d8ef54a38cc04732ecdc2937e1ccbfd90e8b511c99dac8940695712dd740eecd7e3225cfbfba0f06c66b9f6f1f54fbf8fc29f007897ca08f053230844891d6c1bdf93708eba023889bece3e0a6f9ff0d8510aa6826b48f8f6603238e30e208a7d9115f68fafb9470e0d932ad85597c306624811f9b5dd3a854aa5229c618638c73555ad9d50a8662506484130387e687956c9ab66923a0cbfcc9442e658d035fe66331704e805737f37b157f5abccaad8ad666b25174d21d6612f29c4f63dac8b33429bdb680b9dcb99da685134c8272c06107f72613f29c5cc81302d0656634587e9c1f3ccaf3bb867ea3e0cc8451b02028fbf083eb781f1df4e7c7532399f36df7e1d935f0657a26f9607f1d60f3bb22eecd0ce3dea401432346aa3e0d162293889b60101bc486a0a00a694783e44323d7c009940c7d9e7892bfee69a32c612c90f4acc5f8a1cb4e877b41702c954a18bbbbbb774de39efc9e9e9e784202244450af7ec062982008e6201d82f4581d38f440d95d9078c23a104017f917126b0911d44918f4037c918fc530418c2230fc8122274bf9dd13adc5b854b216631fdc04a1e83822a59473b640f2e353943d3af42a8411f6f8ec45dad9702f76777737a7c32507103d3d60d64102f127e0447c7093c3dc201c2442870e1d26b6783f0d4ab016b0ee013394d90e786184df910657be4b9d1f201065f85045ba8dd6a36fb2d67770c76a40df765fcffad64bfcc38a1c42244bfb567bb6c372dd909b69d783fcf1812a96a82227cf4e48bfc30cd1444147b88123878e951dda0aa21c507171490c413d18f46f6904c6c2090b1fa9612c9e688149f9f22117640f965f0221299002183a094394fc193a0183915f316f7fb9aff3779fc54bab3ecddebeb4f6b5da7d6f653fae6c1f8394fe0e5a722fca78b892e3e36c078d399c5a306ba8fbf54d9ed8bdf8b667938c653bbcd301bebaef880f2aadf5d5028265ab6b255d63bee566c0003b36b31d963bed6c7d905449d798f3ad6cc7f4dfba0201dd641df31bad975db31ff56ba553fa7dd4318c610c572861f35d1fd2b7de5f6658ed6c87734a5c9d913bc384fd99f1b04fb37d961f93be7d98596ffecc533281c1efc8908b615c7dfa574a5213d8637f31920e70fc1ddf4a8610c2c4b73cdbd13c483ac0b29bfb8edc6caddb6fc8cdd8c4d703b9d9fec3bf388b63a1dd8f996df7dd442ee4a66ce550608cf6313b13e2b7c81a703fcb3a164dcb7e3ecc7cdcd7baecb3ce469675379eb829be07b949480572d3cd7e74f6347bfa978359cb7cd4a7b7dea7f7312c3f92e4d3b0699fd15aef6faf691990ec6ff6976a57cbb68bddbfeff987e663cb34874bcf1f085c9b6183619e1863eff045fe8c1b3c3f07fef83adc2464c30163587c7c04c098161c0f1bfe8d457d5aefc6d16fc1b1e060deb64e48fdfada63d98fece95f998f7a9f76770a26195a21c39f20f864960b5ffa61feb21cf367c4bdee9e7ecc9de56317bbac7ba766ade5dad67d20c8b5a39c8c74caa87d46a4a6ddcf6e57ca178e589465e7b86568a1470aa14cffe995614bdc93d25253f525ee31712f0b01fe9cc7e3e3606dbc598fcff47a49b36c87bd9d418875ad15bbea55affa554707dd4589fbf76fc6c3b3fd2884fee4c901b5e45f16ad9e722fba50e7515d3c30a6730063b026d8f595cb80cc97f3a50c42ab66bb163836f61b0492141c4219f99bb925fb5c01019f0ddf4b8610a821c3c9a39281a6ebe12b009eb687a713741c4f1135bd211232fc0740d30df732fc1ef0942302b54c0e310839887b32473cf9105de2e7d0326d933ff8245f1f0cea0ee371cfd371cfa1402f3e8cb96d2c97e245d025be1f197dde3fb9fbb407ccf3e9b7b5ee4980a6fe58ed092760eb1e7bdf7744d40b2560aee33b57ecd1b733dfd181972aba4a95677f3d27908bccdcb77938267eea1b7789590e30a7aedad35d7a6cfa9642c9f4baae2be238373376afebbaea3b37b37b1b19b5b79134f2369a3ee432fb103f5ade4d222aba44afc917f07c55d74d224aebbca8b33823ab28dbe15186dc8bff22f7c3ccc78bec440e05e37c750586ee5d5ffff35544bdc8f0278a28f9baec552f7a5df3ba7ef2d5759beb13402ffec6b50aa04b7ce7608600ac01f4219e1a068d136114727c26e488839e418ef108f812ff6b2539fe15534030309faf3ca23ecee831a28adc04e4a6a09f2856cdd34d704e2d3e5e9c04b0f81696c5977029be6802fefae68ba83c5d765f29065da7c10a0c66872d2ded790d5fda31d90e63104c14dc0fa56df1684c2818e6a3e69b65dc7784879ab1cf48aed6464a6ba5f0dd87e81af0bb21cc11e7b45fdf4d6e331d6529840f2947833929849d9476a52bedacad0a4a57c09fccd039082d8b3e8457377b727d735df6b2f43f0e482b79c8590edf821042cbe2e69cd93b8a0486e3a9fb88e4eb21673db5d5a594524a29adce7644aa4b29a59452c618638c31cacf87fc21b98cc88f31464ae927b931431fc90ff34bd1a5911c99a11d12fa51be77d006f8f407080f000b705d4f3b080b00bf250767e88febb187cf1981ab9d2b90081155210626667e882fdddddddddddda5949fe4c68cec90c48e89ab63c13a3fe246ac5f20449c2253e6a0c309e680fc6edce86e2ca23989456b634962deb1fca0efdf83fe90a1c53984b188aee144df0468630c8358d0fdf0bbdb3b5ce7b8172f74e7227cab03bb889bfa8ffe83535ac208613784088c09025ffae3432e07f73ac75de23fc691e3d3f30448a857a41c60961f33c3871d94dd877bc87b7a2127bbb1316cb00e1b724f568b83ba19c2f12d8cb11a65cdf9d94f77f7cb9239b7a50922f56f0eb3b9444768f2e73a48708ee3a827e0f88d8a1f6f88b0ffec7a045700652e432757e8646ceb23d60afc6d1b8c81d9b351e3ed1ff2b1ef211feb8ef47711cfb63340d7989dbb12b00effe00f677777f9f5ddeb4358737d58b3f7d7de354e47bbdfc4a794621886752cf785603fff1ec995fb6eae9c75af5a7f245bdc909b6d8c14ca20f86499efdfceba37df7ea5fb73de7baf04ee7db98374227de0c4fea16797b5369632efd25a6b8c9f7d7ced7217f7f990afb7dc4723dbc7eebde863dc917c59f46d8e5861a61562c4b0bafb4a6c0fad255966cc6f100c05fe304c3c4997ff72c5faeeb7b8f8d6926cbdd5b1de5a6d594bb6978f5724a7c35de47d293f878ec9a2bd90eceb675f5f7bfa15c99876b1cb1dc91837e4e6f9d67cb97132c37c0e81411bd8467d0b843f592ad9958e6eb20668191b3972f647bff53dfaadce8a935203740de89e0554964ee01bee7527abdd668896e9dced287f3bffad6f1c2e37a080ffbb11ef508f94de97f067576a70bc1129fd1a238c8c4118e2d8050cdbf00d48514851f00df00d341eb894124229a1dca1adb5d65ad68765cf3d39bb16f7fc1b4223cfefee2b12e105af6a7dac7442a9ecd9413a993eeef56c082ddb5d296b7b14496315288d45b10a344671af7d42784d61ce498a82e7370e247020812305385238528003091c48d490a480bfdb1bc03008b1f60b60edb15df36eebcc874b868f456fb66b12df00cb99f5e8dc42dbb5e611733f8450a4d4587cfc903b2ac109931cff7b7c8edd9b1428a38ccae0f88d03ccd2931041cb678d64a6024a864e32fca12295319210704771cfe6eebac806f7aff2f7e1ee6eada9367eb243b1d6dca2afd6647f3b14bbc84d3377d7d6a80b98bbd70c61c680235976d08fc46e244610815304f611fb883d8683fb63bd9845bfdf4511f87bf92c194bd6fdf0aef75b2b56adee2b45ce93eef6bfd66fa9d7e7d280f818cbf5998ff8d8f557e7f5d0f9ea68c419670881e9c314dceffb7da11118ba57ad0b23cf5082e74322f0f799b2682c5af7c3b38ffd67dd6733a55d735e8596850cf7acebe97f8b07bd63716940ff758e05f3fa6fc782753fbc8c3dd67918d6c1209ccb1942602a7dd01ee5bcf5ed655d78310f6606f1a28bbf45858d3542ef4a9f1e6f20a10d83bbd5b3a7ad563da47bfe37cbb2cfb28b3320d9bdf8b3c759f775beddbdd7e7fa003d31b40a024206e18b676dd24c2426cda499341389cbb22ccbb2ac7befdf6b3d04722d2bfbfbd9edbeb6acce56e7e8f40a727f93e6e9252db84353868686a660d65a6badb52ceb2dcb6a1910cbda6b755f5b3bc54e699a2fa41ad53661b0accef3d503a5a7a7070a95524a29a5b5f6ad950f8158295b4ab98250601552a21021c1da4e28e7c4532d8a2e4d5ac606e5e4787cacce39e79c534a29e74320724e2bbbafe7b4316ddc884140d5e8001006beb467ca79c606708b649c6a912d02cc8d9ea020cfb6bb8542677fcf80cccebafcf9324ff76a851cdf8508b07f51d037737f4b3caa45988102fc7999c62d793828e8aaf606ee29d522dba75ae42e51062a007afd36289e1660839890a758e558e3b6773666a000d7a21c8f54a0fb0842352e82489224499224499224499224494d4d4d0d12244890204182040912244890d4d4d4d4d4d4f03cf1c9387bb416c70b5f2274cf964ab65bbe9671864cdfa1fce9d78be09df59805dc34dd84dc3fa14c43e91af2494fc02c3c6ceeee2b52737b2c3eec7b532e462fb74069190ed6903f03bec8b763c0f1274dd3b46cd9dee3dbd9a10c49257d18a9cf8081fb9473ce9f3d54b7a0dc514e5aad756137d3b69e2c33c6a285ca0ac9c58b128c182c3264988106eedae8f4b3d77ec30f75d8c14f0378984aa94a36e2843231aebac654ad5a66ebb118afb28d77e7c6e642218135b69e9cbf22c8f3b79ebaaaf32b143fd1a8e1fe00b8ab7373dca37197f9b8ef8e5db2923c1b007edb6af80d5bad56abade537ece8689bf11ba652a9545bf71b2624b471bf61a96ddbb6ff0de3e1d968f8ed3a3a3a3ada66f80dc3d964f8ed5aad56abed7dbba448d9587ebb542a956a8bf1db2524b4c1f8ed4a6ddb56faede2e1d95efc661d1d1d1d6defdb85b36da4dfacd56ab5da567eb3a448d9547eb3549b4ab5b5f8cd12ea1a536863f19b95da7252dbf6db66f16c76b55aada46c56ca867f7b226eb27efb21300653a954db07f129b4bd0f286385b6546a7be8a9cda6b6ecb7f81bcf76b41d6d47dbf697e5d9b67ab46d1667db6ac8766c00b834ab1a4280b796d5d16ab53acaf3b9195a87a9843015a6c2544279fe73d963298c074b61292c85f1e4f934d0706738c2708e8e8e309c3c7f061930192b29abd54a4a9e2f03cb15e3525d429b4aa512caf365c0b04a57eae2d9aed475a5b42bc593e7b3bcb02eaca30b67b38e2eebe8e8c2c9f36390ea8ab5b2a458abcb5aada4e4f93054680b4b6509592a4b65a92ca13cbfc4220478e6af3eb152168f95b25256cae2e1b6efd2b66ddda7a1502b29abd54a8a670ce3b0b75e6018a61252a95442793ec679c622173f73116d8ac7a66ccaa6e25b52c4b1aebac67c8c23e6eeced5b936b7e6d2c0977b535748e489539590e79386f0678fec919de22701bc8e9f6a0d00f84ff204e03fd9246b2f73dce4bdf6720550a64a69f94fb6206b2f918031335e7b49e3a7ba236d503b3235c54dff0528538180c27004633a287eaa3636443651a4acdcc4550165aa8e0e1284600c0daf7d54f9891615c59e22a0a2a0ac7de471938cd73eda00cad49a8883ac7d6402636678ed238e9f2810900ed092ac7d44b94986d73e0a01652811512c41d63edec01816233fd19d239a9d6813c54d252a4019eae36385221813e3899fa88d900d140d06145086eae844e103635eecf8691615312952692bafbdbb00cad01a8741d6de73608c8bd7de6bfc348180fc06c87134d26b9388680c53608cca909fe6ce4ed18e91f60da5930065a64fd7983e4bc8daf70ac6b078edbb899fa68dcf932c94b56f959bb6d7be730065a6f6cd0363f06bb2a8a8738a768ab46fadc60459fb2602cacc9a227e9240d165be56938134ed35006524516bda0f813171a76867686a1fc4e7fb4c91b5f70165a44fd7986f83e3b391351bed718031f5b5f7dc645ffb0290b52f2a693559ab01ca489d1618235f7babbdf60d65644dd798af69ff22dba1f564afaeaa940074750580aeae6ae8eaaaa59392e7cf700104debe56a09d5a2b509eafd2695cadf56bad2d68c864d05a44696531c39581522a83528a59b012a53bef93e76f312e18d486ea509b12b5a1365427cfd75e582b45b4a668a5282ba235797ee6c292808834a015a00c8828cfbf2ab5c5dcf1d9d9d9f1c9f33116749b363ab3fb4addb4d1c9f32f3c2f59346b3a59248b64d1acc9f32d20b0cc5f7d22818880808088723f6675f76935796a353b3e3b3b3bb172f1af8dd991b4d1d1c9f32b27df5a3455ce2c4a00ee0720f3e192b1976eea8ba3d9b9ace8e2289e3d01d6982f3da6a664523228c097accb86e00b0dbe110acdc66543198ea7acc85de66b3419e308250e4522cff5c8e2d4a37a548f2c0e0cbbe16c293f09208b425474b9a6c13551fc58144ff628ca9a96c1a6f451d151113645d6e48939e76fb92ccaad398aa76be32e535ae602016bcc9f39791ed9237b94e743187383802ff33f4c0c79fe7569e0cb7c173458feb7f5e089b79ead273f71d3970d552137d5203771d9909beacfcf88fce4f2f3b32899512605ab51154fd9508c422d83bbc6fc7969a2cb7c8ce38c42d6629ccaf33597c7b2083dface55e8510cd3d215f2a4ff6545795ef766f7b1cbc58f32d307c06935ee321fe3341a9a78ca86dc65beb5d7b37b04fe9470f9faf5351b3741ef08edd4e2b700b85eb9cb7c1a2e5cc95de65bee5b32a3980dc5d3ca976cecf0a5a9f1534c5d9a7b5331e6e479cabedb6543eecdcf86f2fcdbe21ca8c1d0bd6fa7e8c9500819fe48419483c09371a6d9dfecaff6377b4abfa6b2bff569f63446c99252877bf6c2a48c87ccb2c351ebb2db3d099ba1047f9d4780956021453a0bc1666081517af182b4b292f9b0326c6d33630478deecc79669c6fef6e53c77966533bbf34ecf11f3e4ac0cf7725fb79c646499a5edbe21305a28baf755b21d17877b41080105a1d9a8642e95653deb14cd0c00009314000028140c07c42291503026543549f614800b849644764e9b8983518ee3208610851032c6000200024300040866a60600d4af085e142c10bdbcdbbbc8b84d8af6b23b2d2b1b8bd8b7ee3f4cc28aa88bb7e3534b133fcd442533837bea87f39e242735b1255efc59448c18749606eccfafb111f6d557057488a22944bd6640743af79af01382ee0f07a8805a6e422c24d0d0357a1315901972e6498a4221f859c5dfd41b6529ba6c3914857d6c728f28388e54083a619b8c41b673eac023926046a2e37c9ea647e52269c504640919d6edbfdda60885ffdf77305310a4c3e8ae495cf8d9558de2dbcf51e7d9ceb37b8bca0124a1d052cb28126ebb4bbf8e1e672271c5d6660ccacba336a29ccba97aa4da2f12fa8dbf562e6d6ff812568078d79d9b3160b7e405b6844364682444e0c59e2de54324cbf9088ed30f5c8c7da1daa6860fd2406d302982ff0b9083da2d1d0886864364ff53aec299b6ce651026a13d19c99c8ec1b6e56d07128dd5352d19ed6f957268304e2c23742de1eb0cb5fb82ca2a3cc570acc9c51252e95965a98f4195909c38e114a5ed958c0246e09624d5b52c1f93efa004957382918fcb9ad29c4b64458f44f8486fe1f93b13cf39292a444f9119311c3dad29103cfdcf18b49338d168dfb0e80320f43727cb2ca390d402815829342ecc7fde7a1a2a42366b62796000210567665236aa15fe46047768d5354ea480380c2b58a5da9986b8af114226e446636cf90c66402f89b680ac5c6b4dabd7dd89bb2237866680b250577423a32c5aef76aea4016ac72b7044aebbb6faea0547e05de31d32f63437ca1a32e8c7017c9777a12188ae3943b3e22942a8d09f98780c06afbb3a5436c903a843df214052a3523083c480f0824f20b9f94588f0ccad7a8f10dc7f4519736a154d1751d3891b9a059d992804658e716d8c1f62638ee0d1bb959361c52087a7aad9f755c1180b47a8e3cbb141a21808523f70516a59978564741ad9030bcaf4a29f5303f321d9399722af37de16584b64d2cd6c4f78098705391490946073422f41d4fa6061876c12a77a294c93767d13089e5fd08d8f5ece8dfb4c42741163168a8988552066a498823122c514c48c106b526c04f5744c8f23bd22d1fb71aa2f1833526c41ac08310ac5448c51282622768198916226c68e901e477a22a2575a7a27f07e0ae27e9a2effa6237e53a4829599dbc5934983ea70e23716d83188882d5033b6802db0e3f976ed343991cab168f299cf13cf338c67e6d6d89aa3a80e516c4e80a1ae6217cc9565bec671455b242db26edf5375d62872c6e9ccafa2a35c9eb9ce0f134ae167c980b5435b4ee89c79aacc0289846189e668b05239b8be5dff7a0a42a687691b7a220093177b0e720def3e217f919083ded9bb82d3340b611606193246e3d7d03da76b471704f90aaddf9d341368e4fdfccee6829ec6560abee53f688b433f4ee8ae06e1cdc9a4a252cc7359176085b391098ab601dc21dee19fc1079eb4c768d33e9730e323ff4d2357c0f074383dfc1f96941ccae3ac7587b5af695638d66b1e78e2c497e75a5ade651a98c82ec53776352bed9f4aff02c1fc8565f15ad0c73fb0dd8ab351b443c0936eeeea841812585b7b9fbacbad692824f5fbf1097ee5165a80fa471e4ad659e073f3501ce5d3386d47637cb89ab87572398d653071cd835aa5f63b64eef8fcd4e8b75a25cafa40b18faee6d5b2cb1f528a8f939ff6f619c0ac160e7c515de5bcf2f7ccf10cd2d6d3baad5e7784256ca3a1a6cc64181ca92d1234fd45744bf7d3902244dca81b1c2f5c775334b41b8d744ba35dd240171ad45d8db1ab5aafa1b493e0cd401ae88a4676afa1ae34a2bb1aef4a63db8db1463ade6eca6f048d4a9a2c7ff1fab1ef1b146719335e4d6cb216ec466a021855bc94658b111dc1ed5318ae5e56d1060018783648dd804711c4a813b712d504d9c441395ad7b27c45722ed253d7fbbd9487d6aced891ff82f009c57a0f7979b11080a2f62cdfb1192e6d38550b23ba55a6e2dfb027b5d08ca36242e2da390e714d371321ea3aa29b738cb100ff2793ba4e730075922dd6cb952cc305cd65b4adadbb4c533f8b6ed3bee8ef5af0df98ddbbe0c0ed50f072e844baf5e2b4e06942b9b6dab73ad183c5bb8ce992fde5c1ad5b53cb1e0cfcbf3d65ceaa308cfca4c5d87036427b95898b0c534be4971ac90a1611455f538339ad33773fe14f20d21d91cda62beb53753299d00c32c63323abcd3533cafe5ff9b1a7ffc66043db8ca14a6d8f02f47b79f4d2ebfbe1b3098ba9afc108d3bc214ddfb8f9ffb77caedcfdf18044ce9e61fb29bf7066f60052e648d1380310bf137504812a6d2ce5fe2023698bafa7e3271ffee72fdf9fb83614af77cbfaea9369964602a45f8e502fbf3d1f4e7e930a550892b4330c52eff8ea501c0946efe2129f4e389e96f0a05244c5dd79f236511a6e83e0ffec167fb6e68734835dd11814fa33698d2383f48a30d614a07fcd014feb1c4ecb739608a0c2c38b28bf0de0db12cd760caa0fab76fe2174afddffe38264ce9be9fa859e21db43e0e88bcfc8804f0cbc7c107a62ef2199371194c51d9870500dec8aa06e3875696c3914eb82098828983d6d490a10b8990ae8da1a2627ee3b094e180126430b57643e30753b44ffb7fe5ad5a00d8cc0aa62e037f421f03d06930958118c0653f4c31794e860b66c354128ecbd1dff03503a801df341da65277e7a8614af3242ec87767a49b21957b8d68348b110c052e5e4991c31440e93a8408c450aa9fa2c87523a101eba24fbc6eec53969aaa8e45a5a6a85c9a0c48b96f0aab2a533e28097ad316e8f128734d5bc33103081c53a665200a9afe0454b7d1a49633ab293872fd7f0c253a0af9d7642cf9a47040851018805e6219561b56c7b37533718d61907979483876093ac7c8c70c60fa6a820a619a20f623d07c86c7b96a0f550298d3f0157512008c79df8697b1be89908db719b1a76d8d55932af03ceb78718a7b290205b8008bc58600c4fe036200e223015a2568b64df4d59c969c7d5e1b60e1de5168c7954760f50b0a6f979f3aac3c7b173aeb9927f68d3a3ac26046596bbd4f2da7d0ad3a1377095d5aa6b413c6fe05a21a22ce4b4bcbaa5725b4dc0deaabd78300fb9a295f42c0221f9a1eb5477286a48a8d6610a812e342759df8839434a8aaa4ca0062c887bb3c7d6ea3982edb3350b60a582d0c10be06175614d40f3e6722141a680b9712ee767d33a9ac345ae54e617fc675029262ef69492c9c14ba9182254aabed007e70a4b09cf7031409fbf3bbcecb2fecbfbeeb3cf0f322c95528bb4a3869f331c09de3f7ffa57f1a8fe1f31c88d0bc1cbd40a0bcb3b7eedd6893797e8634558c1d5a83048dddfda1db8bbccf3e1b42c703ae8ebb77200789042273e0c4c73f5c19707b18cc25ec18d8004cc80f48bc81aae085df6e14f4ec6db6ec5095d0850b53745af5b6bd0532fe4c58a8a87ad14569fe9f75e37cf6bbe0a0c29b24d6849fc33ba011b01ab92cd0203df55e7f2d403041b84db91084589e82f8419c6c76eea43a2ff29b58f21e3581f3e55eee7b0b589bb72732ea8bf62fe805b68a11ef83e041dfda841e2932c273c0284e3822060fdc5d5867af7c3b1c97bde5c94ce9e83282f9bc0d1c2c68e376f90c338f819656d8959cf5df3f6cd04f8ee518527af6c73e32471346d51647ff670ed564a8262ca29dcd662418d3f32629b3c2d08b802ed64b2cde0ca61119368edb5e9ca3d54c6db8468094d65b189f4e088cd6bef3ee08aee694de2cf6376f34b4a435ffb79c77e4c5b3909a978a0bc6a385323caca61d94acfd055f722a966fc0c46efc189f04e20d8f23fde41e5d0b62e14f7fb08828ed0a53615e87e55050f2955f1d281586ff0649a0c2e74156268b20af44592a1dab74f107e21e8334251876d939cccd9a383f0f1300f425e8a0b5d1a4943157533870bdefe86224cf648140054f2452d13268b20e70078ed2366e7187749117ea57b7b4b50ed519faab3ce6c1c8a670c8611f0ac7e00d6c066da85421d604915eacc1fa880f6239bd633ac7553363ad03ba898cf80cb18fbf5c9db84102303bd7bab3d5da4464dd44c4a4fb44691d1039f0308b0b6b2ef2a9572b5b717d98cdd96f941dd0e7c826bafab4bdaa4fc5e32cd490e20761fd33e3836c08006d6a0129b0b495c084209feb25cb90002c6587e10c08c4484f69c284fab7181470740b216609245ec1d8d63b4c0aa598581106b764ce336c1b0d1fdd4baeb49949b98cb495190aa8299bfc8d519968ca23a84879cd248c380f46d8f4be374c7146506931d5432aa6a05f563915431807215749043183944771baaf44c89d98b0e4f838516309a9496cf337635b414ddd5a62bed1a9940d6c98ed75de825bd7d81b442489ce2676d8929633faf55209ec1b26a5fc253d4db7fb670487004213e44182d621b17704193928f3ad6500130209860751788ff36013cf8c2966afc8828290c64564c5bf34c91c482bc421f4b5594cd053e6794da374bf65f8ff82b905cbedad4df55c121b9b61ea8b1ee154ac2d8806655939c96f00ee120a87b516ad2aff93835327b073b6c4c9c996cff6b722e4950a297ff16a17d4f658469ed8cc2a6bd0ba3421b98521e093b2ac6e462521d732a879e033d62029469c35f0a8188f8cc1b258308656c72004cf71d18b5582910635b83ee9d2fa2366d1ab9910b5f6f05aa86fa0909585d24315d9d5b9c253f580f51d9e0f360dbf198e3e2d85547edfc3eb7110b5f06b1b3def7f55b9124e775f3d83c75b2501001e9dca9809f781f8e83c632dba6ceaedffc0c7ac2cabec4d45028f19f80a99ecbf077597fb3149dd080dd70ec1ad37e7e47b4497f4934c09e9de5e07290389c0d61396e192c4330a3856cd1c67b54257c347a22f88762ac5cb8e6f40b1cae82cd652c0064091dc0618329576f720cf3304b8136fb120d42d52eaf46813501d4cca23f733e08c138fc6059f6f24da96cd5046c78efa3caa75a1ad0620b45b208e6734de48583af4241c8ae946e5abdf20ea3b2ddd818745dca0f2c0a9ac6bc576ee3739f6de87c875fb3dee864481d9a8472e96e0e629792e9ca0d1298a7f4652e48a5c83c573ae30ba15d721955a69b71b176b8c4e7feb2bc138458567bcd14cbd1ac56a6fb3379c75ad1b41a80a4fa53301b94c48ec5f5e317690a18b4947ae84dd5e827d9fa79f5e43eaa0c8e38cd340d9c8f89125fbd4f2c5035ce877556ae57cdbae23a4149b404168b65343b75de640b790099f28e0e7dd8f8a808262b7812d3f93d855d974a3713268e3a799478de75cc2afa19eff05e004a1456ad79e511991216c0d4cce9de452063125a7f13c3e20ef956ea737e316b528b43d53ba1d35cf59807d8a7783440e199ec5f5fbf8427060058be7339fd13ab314647149cd8aa867c0fa42ee283f52da5d007ea7a46789468c0afae0661ba44f4b0d961bf7e6311be06bbc63f8cf8fc06c4b587182ee24efdf0e045997998a93f363692cc905914435b1e5f5a357b0270b0e0fbc71e9b87003a64de3e3554dcfd08c793408dac295848e49532eca253a2d259037b084a04e6e1ca34c40acea091e52a668d79035b97209e01c93859fced10b86433b588db6c5ee8ad1bc2315eb6b61996f12c1053bba2b7487bc515b1b8de9372fa109120a100bc52afa37e06af14edf429406ec1206453bc56a868d7b27712ba9ca07026fbd45ad978f0f18f16002415dcd0074dd3923e1dac52b5679b77eb4b072b5246570bd0762903ed46ebe12084a678978f163a5eb43bb8bdea7977832c68aa5f092d377f7eacce4cb429a2c288ae8c24b4eb80fc4edeedbe8f13483051edbe86d74824ce9224ac06a3a971c1eba901fcefa50e265d110dbc3a66a83e40698d5f16511a8d1842339a4b1a0053e851cba390c1c7a513e9a740602529b98875af36a79f47027e63c9147000d4c1717748f2cbdef4229716fa16a9db35512bf980dca59fa3589154c469c5da88f4f9b757a361ade3993214f903ad6bf6889efcc8dcac568cf201f5b0e39a42a542808b64e7179a05131136be6eb6a0aada49fed268b3c0af24fe974c800d178df49bd4bce5dc11dd0f690ca8560f316097b7a9bb55b26d9f10dedb2cfdc057e341e0d8ee5fe3d096dabdb65868592d33d016578c6238f5c030ec702fe06884abfa47e3fec2b28e0b8250255375f89a0efce478e0b8c50f1b7ef29d02266219ca1ca633453cc9f99cd360a57ccaabfe606e1c0d350937ac7daa33c4c2ae768879c45c6ba20d3b2981959fb375d53304f39a88a0b1dcefa93198235ebe067f8a27d2d9da87a3809403fb95579f7a4d0194732acb01425c4379f14ac965232301185c4e751a85c601c5d70e4e4dc03dee2a1ba3da0f0696c64d8554db25ee21545b584ec304561f83f7df69828223ca2815c643c5571fb78d2ce04000e210ac5acb9f4ae2684ae16c340d337210ad94624f1b89cf95502058a3a4d4f10c582e3abb08256e06037b0908b13acfb2b8e0f58f57393750e197c8996c21a8cbc7c08143a9564aa4320a0305e7d3ed54f30f9fc6f25384bc113ccbae0df0e0de74d9d9f2e227fe58dae42ff0a28e61ff11ba9352a591fb3c35aa813fd50825b2dc4bf8682c09240104b9157196fe20ad2ce305c6c2679e8c265fb0af0702180fa2fc297b14d5d423a22da9fe39f0ddc2821cd5404691e07a006aa62b4f5f0e99c78b9aa79b5710babc3d9fe3569ecad169bb21c955201e9f1efee72e0f6742207c8ad386fe01d1bcc2cc6631d0207fd0f1fa6158c8e93ebf5fc7e72b55e1d37d055ab984aec81e722ddbf87201f1d2267ecd245fdfef8da6be91816ab561ecd71e0996fa47d0b84acb6c43466a9f24a0a3216fd1e03f69d8ee639622cd18e3f1a7ed52c15c273354146968a261a35202c91890c4cbcfa3291af9cd0187c3d571cf14f09ca0d47a8547950c2e22c852f2e8fe7cb6da494b74cc0ac82233450865003830aee4d846da4d349238b9e6ab79bccf9d1fcc8f3ae2535747f0343cb25956b0863945caeb76371ca759854971de90544f1a4f228e821b13ca124fbfc83a5433dfc0486c3d63116eec9f319b1f259d85c6c3c23296f2d50bc7abc548c475cc5081c7a5cf21e57c9b3e26c7ad77c168e27784a55b9fb04144f8d9070f82d11f9e5c428a6152a15b5e4b34ae0ca2a627df419a6069f20e212b8b17520216450e90432313a2b99b5f0cd7e6df11c9a8e4f28136f619eacea49fb68c931111b48f62f4ac8b63a33a08507639f525a37962186d6d2fa630ae4525d8b95c982d8ab1cf1e4c87e7488f25ac7a188808afcbd7cd1931397345653aac0410100e05bc30b3a1ded718df391a6a9d19029c11f748dfb11142a61605a539dc27fbece8b063b34091168370f4f6dfcf10827a62ce8d09ab823a06246339ab9dd61263042d3fee45b3f844fc3ef956b55bc6b62de9ac58cdc225550282a0d6da3180147b3a30c0b562ec2c530ada5826d9add9a9ee024d938e4913c2499eb23bb247139d6934aaaad4f15181864d2f4d0e1e771b7a088ac1630212dbf3692b437fc8f7cd2927d30832c164d3af360a9a90c9d156cb278b1e4df590d6c2fde11ad3b24b416119455abb84c4ba3562b0d08d5162c7413fe3f779de98adf2e00106fb4ccae77464b824d6b5dc0fd2f23326ccbc31ee1aaf05baf1af6b77cfabc840cb717e89d0f6e56b802db0561b8ffdf4cf2bd2abc14a940c1abf3520f5153c6dfc501b9c15800dab0cc027ac417ed5450792f0294d8b979886b0d525b2ce51fdb8ebc568779902473b64df29419a84db2bba56b7dfa169fe6ce1bc1f5d2048089a86bee09548dc49ace0e3151f75c6b31abf5415a2c20da42ae4d7ea2df73228ac39b2b724fbfe7ad04891a15ea6b0f8ef6f984949ba218ea45e2c02e6070882726bfed09978fb5cfc531d78b92362da8de1169c443868200a946305fb2cacc015d154601649d424451c84d133c287657fa80eb1acebdfeba07328a98172f6c7a36f655b5168e402b218c907dd3cba88b95f2cfc578a7a8a7e02d6ad6594e5c78375aec77e1717a084cd96ab130d3bc3c06419a2c70cb6e2e211348e81b1c66f03e147ca9ef9077c8cb876791769160291e0eb16c160910ea087c9db077e8b82d4d8b15309be901c01559323acfc715b1e17f9b1500744cd250fa17d1ae67d0a096626d8d4e8ab0a3b5cdeade6ef56c5d198e6efdf8ff0e79f899320c0d4df7bf49d9855825f4ea5af1315a297e44ec55ac1aa6d7da2c8e9506ddb3683d650d8ff4c5c89082963a4256d179c48066af70d1bda50b29d9e26cfd8fdafab16408f3732c815ae8115400db6d36b912f2eb82d4802a8a393a4272ee005a15ed029792485cb55a6dd237c41123234dd27bde838010d0f28e47202ad5ccb259970b0c434ebf35b92c2d303dfb1b4e3606e9562d1c1e451907ae22fba88e00aa89e76d31528abce6e5992dea65d43500b63eea6893893bb65e05037990a16e7e7d6c2f215c740b7d3fbce44321f4be173e5293b198eefbd92b1e051c2b72254d1ab43092eabc58b0b271476b05b0dde078822ff159c1a4d609ca58a46bf422e5be8ea93db07c5409be18214cfbe8f83f672d598bfca62997087bd62a55cb022d4b10d4df48376766f989e1930ce527f12e3515110058b711149e9b4c16a4aa944f180f04bff66e04d3028941057c206849f77da9d35368a3888d1d185b37239afcef0bc6d8940883ad970b5967a38ba969b03f3d90ad93036aca923ed5a549bd44dcf056f02cdef22db2385d150c818002b43100a76b527e924e8414667fa9dc9ea9bceb55cac2f3f69b6fc003fde94e0e69fb9f150a9731e81fbec7a912a8f2725ac61e1ad1a1e2eebda2252266471140a0f9ef0d1047db4ce444ac3c291486b142115fe149d132098943d0b7d93d5b0f0c95b33ecc675184a797b4f633e771e50e70100d3e8da3a63dd9799ead12831983dcf55ca9a2a279033909d66e6a9e7b15a7ba7a51d7d65729d5748fe80ce35e8ee1a681d2adcdf8c4c0385365a67997242a2c8d4924da4460bd77daaf2c51c7ccc81ed0deace9ce4b5fbac7461b9dae8ab5f7d6e44a2119697fab2efc536342f4bba083466ad372526b270faefa3c9df0e7a649d6d3cbb56e10aa60063d514efd1f4e8dd44b40023f2b12f5ba25201f8070c22a4778d412f511245e960df0dc1df480f778fc2537f9be37ba4de3e0131ec812fc42859638cc00c18042351979c87fe321932e936ac0369460fafe1369d14ff6dcbc3023bc4a88f3128b10efeff82a16d623549012d5688711e2aa343c6dff93404d04ad924d3038d6ac00a5b5125572a377dbbbc54a11585655752615510f0157438fc40058a676282aa7c458ccc87a80200199428529b290100d98e9e9466f2484d8c94dd57e2315b03f29a8f9aef01c5a6afdc2cf231ed6c26b518ed8ca1700f0a4101ddcafb9ab3493a96a211d7e2849692b56adb5dab476a180dcc19585c8dbd292a9f8ce5f207f130d9a00f7abeb7a6ba6f72d78e51b1585d887708d260692acebae9eaf1c0dcecf1a823c666c9080c2b49a87c40e550316ef229b80cf461618eb8017aff3d2eaa6b9620861f04988114d14c66766ab0f6bba92054a8c4de79a845af2884b7c93ea51146fdc2fae550fd474d6fdc9460b26879e9019107644f235ea43291814a16b4c8228ca9aa7a8b8ef3d6880c4b27204c6b55cab87d013d1c610f74d61021bea2e1a96f64265337322d1be2e5a89bf2128a24f9795322cde7ee67c2006cc9f868a10ceb142343821a312f12ceedf9c5b528c7bfa69f627e9ae8c8792faf3a140780abb64c0f933235cab05b9e5a86b4de1f1449ec413a34013426cfa49c5343372e2764c24a3986c71d8fd962abe1efbf18a02e66de5bf1de93db653d0bdea28d39b93885648d9f9b9b6f239b96aa100d38a61f055b6598dad24b3f8a72b5a03293fd256b4f098787d22623d005d005889880e5cf62bf5b524c445a3aa976031106f83dc0f590d99bca870b3404defca9ea22fd344e42132c8b1791a1abbf2b5289c29874f223ff1165b435a28a81e25b2e5eb8154cba9994fa2bbccb6746a1e5c81afb0f23152483b5efe54b5163523d275c85c30c0802af3972da1b7aca64e728fb8c2a5b11c582f4588d24c5a734e34fbf1037f7d8083cc5e332eb3a9e2f0e67a2c42268f8c92e231a0e3eb79d995bd375f8d32d2162aa0a732efc3489af2316051136b4a736d0ee53a1833ab01bb3a3c03b8545c6fc42f5551fd1f8c45ee20ed2bbcabb9e6b485e2e560b6111346eb0381f0fee19163a5581b1985b702778890902b67eef4d21c47f0c7f2ecdbc0702a730a1d01ae8da1db3eebfa985794b04def695506da106dd500af328ebde50f2c2489168a11b7f618cf850dd682ff8d62458f9198268538ea85108b5823c0b81188e92f9cd7d88e1490bac8384989351579cab299bc5b5e2d5622087cd5e339a12613f3ec430331ac7691ef38458aa451a417055f0f904a74fc6f7c6155d57c09bc127ace3c1d9e9a67c378ed6c319147542b35c1f864611fa4b42d307a44e50b99829de5309a0fd6539008ade756524c591088f8e4b56f80927749cdc1db0eb735994eb1f2b1c5535bd94534f862d91751bd12786e01b5655f7d1330b9d8c298a7c5ed134e1b898f277de4e334c04051be1b35d74ef9cc7c21399410c7519a80d0098e0bb076ac894b220bd3504881e606c0f279ead097df14d44086c7974c7056fcc4d9f8f52e99707aa9190a6731459f997269691e977fec3d54385a583eaea2d6e4731a5735e8a013dc6541db45150c33ceacbfc0e078ff652c9ceb918c8be605fed5f7f72db28b65c838141a8a142d0bed1561127407b7aa4e733963838e5c3b79974a3c07b5270297ba8986781d081ee28b2538061d4d4a887fe51b385debee2016d1f3730c0f9bf11c2b5c548fba8c6c0042e47b490eae2718510b8912e806d16f0b7f53013ede5fbfde2eca18d69424004e21584f83b226bc34f152d521da1700f54a06507ba5238ae580a6dfd03ee800a6e1c69b55555ce1cef5602b4511e085d2f25f369e82128c59cf8aeab183fd8bcba95ef80559dcf4f0c00233b8cc85bc8b536e345825924768deb8b9de40c604acada8e827b575950cab4fd9c3adecaab9f49b2d465e98701b6f41a4bada62cc71b3f0b35eb93d5abed10e80e51f6d0c14faa9b22f15a01f35c2a9fa98de63aa018cb8ebf933815a115cb0412ca5f7df825c80ec8bea39c996437634d8b306e384a9af54c9340ec94fe225820fa549fe3f547109601f8f36e26e7cb6900bdac2fd2db4814dbfd08e37c0a14f1e8f0a12822922b4efb1506fa07ca79939df8ae5009c0d512e035600d0b4c625ccf6d1d293f29d6e9e88ab88c358015f921bba4b1b7206f52f4bec566086292ab1558b8fbed9a92d19806aacc55415ee307984d19702e70c38fa8cb4a6c866907715e012ad0088a9432de983e05e402af541d932ba6b0bf7d93c1f686a056a47cfc2c1c1038a876f90e452d30bd91cabb500f70d4bcffa064af3b3463b40bf5e8a7fb223e4d2b3352c7475d22110fbbd78279fc2e3265b56b720affde3eeb2d2f1423a53d9488cc8499ad9c34464b946afa4e3a1f20dcb1b393f8071145aec112fffa56de290987f90f6b42fd65e3a4deb08851c4cdf5ae44f09a2c73f0f2ff7a3886db891ba098991dccf8210bd254d4310c4b8e49db9c116b5b1c12082265b43105de8e6dcc9d8e9525688aca0884d57c1a6cc9cbc888017a2c6b9912e319a25ae6b83a4b28819ed09f950dc0750348d189be474255d60d14a4dc566657633c30bd6448068981462a322ede38f642c4f83f1104f81baeea47ad916d41a2685e07088ef5e6865c02bda2f2b6294152d135b23b1b1bbe6441d39c97006581d6ef05063e59e647b598c0c527558bc0706b848d70dd6bca40f83a0ae072b1c28943ce7a3c9a78a91ea2f2d148382848829c58d7339108831a9c8b1960105712616356639a021d2a422e32c074a44b1a95ca4d42738c89757959fca3f10088835bd88b1960011d1a68a34c6b22023625a31e35c1e04e24c2872ec6540438c9a488a90438fc9c5c4aa71954e486bf60bd5c37290721d8a0aa0175d5b3fee736715c21467691935168755ff21b005eff56e4df1a945ff39d711aacbe1ca20abd0caae77caea0645b0765d2cb54ef1a68b8143eed04711c477e673b6b800aa6fd5f0094e28a69d58cacc8e877b52d5ff2ec7da5bc8ee2613dd425d06ca14c50cb98d710b4e7109b23cfce0941edfd73164c03a368221345124b175fc99292bfeef3346d085533a7d6c2e07341b2a161449bb1041c93783fd27330545b8b195b113c96400aadfcdf37b13d452f4712cf0c379cc03f222dffdd0bc01a4750941d5e42c9b5053a24a26ff7d6cb8feb5c91b8621e38936a07c4386ffd300af8f44edea3c16547f2b2f95f4102fdb3bbfdeb4d429390996948ea1edab1fda453f4ffee9e01a3407507eae86a1da3170cb2fd4baa81381d22ad3ede3f96ddaa575b48269d47ff2de8af77a25f7fdebd65945e67e258cec71eeadb9b7462c7e2ca4486f6fb26106e04599346baa3f5b863e730229a86c9d752b9207020a2a7231a3a28f602ccf1beabd40fb5e1d306ea4da671d6401d5d51cb87b47879f972066d3ca92baa352f7fc32b3dcadde4473475cf122df8e558c0e39f33403ed23fdc07bdd2cd7bace5918e2144db4b5d3d6d450a92e7759711f0c6b1a946803148231361920fdc0ef2fe766ed9158bec2972ad02f0f7473aa873ec3ba65848914f6803d9102012d66cd6f84b8ed57aafae778276f555dcff15a179713cbe3e9f72d3e0367ae0d64ecdbbc0f4ab0ea28183c4406ac33b25ddd24ac7c8b493568e719172df7553b1f3a2fbfae8e9a77c35ee7ee437f67d9cc0d41267e087842f5f141fafa9fb2fa29bddf7f97899dd7716f943d6dead47d1d35429b7faab5f756bc8bd1faa78366260fee39118518ac6c3aa4b21811975532f921dbd7063a346fd9027649182c560e3634ffc1e4805fa80a4f9d3d947da4c0acd5cfede85de459cdadb580033ec10c084dac542217118ed221e7ccf8990da3798505f35675ea64b8f96c599f973ebed26f29d8234b932d68ab956649279a45aef6084c0c1d762e054dce93c6c8f601f626cfe5caac3d3610596dfeadf01f2deb55ad94522feee9b1bd7d483b41a3cf69fb409c268a42e6f5e5fc233c8a1847f61267ede54e92c6540439a674ecf103b8c26cd35c5d09326021099619d690f1a955ff80c1f86c0d30382ab210b558d72d6a3caa44d6a20a0317d92fc6446bd6a74224b11b1d0ce5421637111bd3f225026f5693e8512fee3461018aefdccfac1d2de5a286a15bfaa8be96c53aeb08b1bc54c10d810a77bcff18a17fc74f45f317dd9117e4c594e22b6d45be198edbd6d8c5e603e2300d2b1fa8f1d497b590696fb69b426d4eeb4cc4847fbddc01b82b3959cfa4df90d10c31ba28fb839ab42f7c2b8e6213ba9373ce8a0be87b2ba157cef1d5b0963c2d6670765e9efe3a7054835570dab5af7a1911d8df9e06df2bddb829b2c10815f4efccd0a7222291335ca6cd33a5174114c47ac9120a5d0025af344ba08d4a79144c808e1861ce2c655182e114bd89799ebf5bb232ab6effc39d607e08cd99b3806228664edb54f42e4aeaa04cbbc63ac7e138d16e9d2880183d58a88698413c9b724d98d30e76213b8b850c059647057c9a84ba40260ad8e4fe2610483dd8ac5394674d7a5ce76194001293fb3cdbfd396f5495be0b14dcef4cb32511c2fdab1c274b6b6bfb0e12ebbbd308253486d8c540b6542ad76c5369b6f7302cf8b779fa9efe338230114683b5f3800be4cced7e5b0978e68d4c20525e9b6200776ceea63e09b509c5afa579f67982b0a65caaa203441f36a44a98bad0f7750d2243b8def7f6024c45f2965003445842a36ed5e4a69b9fe12cb652da3fc9db0e404652858774bf1f3bad3545984ed2895f4a1b094721086364fc8425ca2396152961ca20ba873e38308ecf39e75029aee0ba491c5d0dfbb07ac3cd3807f2fcb68d88b319760df8f1662204487709248b0ff02f95311e110bb9a931ac640c9628b10887632de51f3b05e0cb8278ab449d9b1d31747d8c40816b375ca9478a9b4a4e615f920e6d858157392a20f163d809c94926fd49c43474bd3becb7cf22507dfda771c78031eb893402783f2366850d0512a7cfbfe6c4ef460b041b8b8b87af47015b53d8204cc2d828724bc871b97451d7e7935e42b9b96b10c1d5a66140c052ab0ca036c276db4b7f6da0018e1fdac8816f5e451122099cfa98b0162d615f2ab44adccae35d4b67fe2d2464d54c47fbcca3e347a6abc580c22264a3ab30ae7de5d8efcaccae884bd8ce5f272e83fc4f06996d2364de7f9b35a4a8b232638c9b2e1fc9829c1e4d053eae5c5d839e6ba4ba8ebcf8af0d3e74b2bf53e656f8c2aa165f15f68949ab7097adc958620e88ef1ec6ae9151c5d227f498cca0d9f19b3e789eb33fd6819c502b6aa9c1f9d627582ec03020598d3ad4ee7b7c17195177484f62667f25e39c2ef530c22e97c4e636a588fa06f60ea29d68dadfe27cd7528a8e05cb94573676acb76fc5eb7153d79fab3c13532e7396e2797d59b26519b13c7d54c0af67b64a4fdd53b5c6d5b3fbc39c9a833c796e3140bf1f21fe0390215c0375f8411dd374abd0426a9312b365cf3514f21392bf49dc9a723b14dd77bf396c6db4e94c857e694abe9db6e9a34d82ac73a4517370b0c2ad22bae7d7a9287223bec466e4fa4b91e4ead1eb06a0d7e54d2b73bb557b9cdb7f8bb6e7d42489dabf3e025b512ff39a1fd756524dd6ef85b0a8c1802abb97f70bc7f91834007a0df996a91c1d8c4e3132f7f5a92166b74f5aa9fcb1d1534995bfd09579fca1290f14b3704ebec63edbeca60fd0ba266e864b294e1244f90ea236edfa1e13a0448f21dda9ba428cd52844cb7119fa86fa19602fe7e7ad5b9c585cf11e454392e46d6818e46507d780928f10e7c0bd8dcb1d46d97d40169613fbd1b0b1d37afe01d016fec8c1c1132d6eb88213f967560df5010e3263d70e116427240c950fa12daeaf32c5c46a6a86cc8e3ad85de17d51ea50203c8b45ed563cc6d9496be14b4c75331f0b45e6c263a19e978db63e3b08f72206821297b36e206f42c53e48a61d6c799183738e478d3deb9a44a36a051f52b560eea6ca3357b2fd6cbd164e49189f0f5e2a426eda149b7d71535ee5d138e81d05c5879ca2f8ca289758ac3f001d9cc1502a582ce586a32d10e6f9c47f7b3f760414b3a917402d9471120b404402e7007cb0dfbb25066cc0730f389374ddc2305d9b745c684e12c7cdbecd475147d540e85ee4c208c3913e1eb9747231c01a94840bb0a4a56e027452767c6390d0bcb2178533f4fb32156c8f78817dae6555326cb1b111325a7d4a65d030adcd407e15f18e6d6de1a28b8124f3a4a6a6f1ba50254f66d8f09e760ef7e44ac738b7a1d701f5ba477ae82b69d1a7082f78021e4b05f362b345d6ad2700a23b7c6d77750bb66820562156e8446bd5826884118b7455ae4c24afd0773fed31473604a0ac2214ac2843d22badcf259b95ebe29e66ca806d6b353369d6b3129a531c4507140e762bd3af69516dd24334ebd2270d0341dd9a57b1b0ebe65c82d106004b74b653ab8ec82faee9c7a2230bd787db0ba45c3458cfe1c9bbd810d93169bc455375900e40ec9f0ea94510337fb2d6b0258988878c0d89d8faf4614de7f1172d0f5df175ef1af01dd56d6943a1d044a13591a7adc1d098d1ea03872b9b6efc957c2808b6cfe0d06747f72e46e5b01872bbdf083b899ecdf0eb660633bf547e87a3f242d48c0dd0c91aa0864f62a5e4a597982b8093a74037fbca3c7cd9dadd60f40bfed2d4b83b021475595d4ad6e1c1bd507907217cc823c3326930f912499556e10dbaaaab0e1eb710711c6cf112a596adc499b1943d8a12c9a8c9951fae6ba6c7c7f08cf0bd8c6612850df7d2cc9733009aa36a8ff7b1e0a121b378551198c158deba86a18d012018fc56d889549323e81d8afbfe89552eb06002cd927ace3f178801fb160e30309a5b46bad68e2e4a103c9c258154136a03a2ee6821f045d2d70536f4c89064010010cb3497160436d6a0428891f13f0faa96271f50d3e504c87d3a1d523fbf4d632a7fb5dc17d764b63a63f598f46151fc64cd692538c9a104b190a04af23d3ba49106689f41b1671c42e58584e0a8ef03263e4709db4102d2ab7aa19d4893565dd8a6133a37e5df6469b72e64f699effb2197a6d9d35c101c7dae332ebee174bfe715123e3f82f9c22659014d391e0b7844708ed941dd209597e12c836fac581726c9bbcd155f6b20e658d6b24b011a9bf8041e87998087ff5dd0ecab3e40925617717245eaf3109990c25d152ea1c6bc84884bc465f2bd85bd2ebdad900e81bf7a121420bddec148d55e089b056cae9630a181302772e35ce2431032663400323e85967b35a44812a2816aa47745c1f78ebb1e34c1f264dc99a8186b1cd91680148b65df14ab8ada262cc60c404d0fd354444dca1e296111b471886de4c71fe552c6b85722c757e1e5157051b1fc2b2ced10e27541e782612089d846420c98cea642887da150c08461450a1c9d38408388790c210d3db23ce2cf88e5dc8d1cd5d09aa0244843b06ea5dfe6fc4515b801a7d5315117adcab51c0d889710fde9008aadfe56cc00a27f04a5161e9c8af33bf470011c4661335bd5216863f36b289fb6011a96a773c2020ca105adf33d55c771c256329bbd32dc132c1834c8db11fb094dad69c09406adc4377076f45a63f6b5475664d2eec0a9b2e10d9102fc6b5eaab287b86e14188a11429367f6928f7026fe0f5a2111fe9350f0c58f2c7353ac38d59e196704fa2f145b4793e6e3c149280c103cfd46af58a71b5586f3de3547b3cb41df66350f27a72b0c243a4f2002508d61ed3c648c111f3b86063f3927820cea92f6fc57f2341247f860487db48630051c0c8919021e1937b01959efdb5830423ebadeaa5c5a24723813a6faeef16a3f5c21474dae685bfd58fba2966e763dc5707decf754b23646b19f927f177b86d0925c957c7ff0eb19445ea6d1fff0a22b981677a7261245be156f063f6edd982c547c2bb2fbb333ee32e607cd573331e69468b314db3c68fd6cda27146e60c0f8288510c937a19c07df06701666f0bfb5dd94880d4ff1e3226fe0969909abaeaa76a2fc2125f94ffc646848f83d340f55ab9c2d0b7babdccd14d848fd40f49c14249cbabf87115139d9953c7ca4e96ae8aa2974197113e6fe49e832b0c48c6e4e327408771885e7e36b41ba97081dd5b0197044cfdb4e04a1056d8829ceda8870263457ea9a7ca5dfc19ecf6b4409e4f00f91ed6b2254767f79797b448d72201707406a1b47e15b34f7ea23ba592ddbcf3a8b0abed1e8f86bfa60934fa1a092462589d3683281f6b5b0fcc22f4ce055fb6a1bc80c551c494abed479a6c3c4ee7d10dc3b6baa8b6d6c116f9f02a15e406d1c66c1bd4036768a414dc158e11cf06bfc0229620e23264ec6c83f0362e43f05e72d01bacbb630cd3108641129e723fb1da711def38418ff47a319d1a81350f59840fb33a34e40580783aaf27637df15c9239af9ffb50c9ec1c665e13c37591e30da7705985028d324c20a34a8c009c10ba28ea274a0d92da188bf4ba8b082b1b64982c1e10c41b7072e88ea622590ccd5497598621792ea34dfcb254d06670ac30700e5d6c001553f00d7eed676bc1de95b148b1129439bb0fb8d01cdffb4a78bd4356c8ca784d11a81cef08435542b94716656c7f55cc319cce42243cdc13dbd5a13f2c87835d03c8eec00cac9a4b5f9960dbf0519e3bca757f6c82c964e30852a9091512a31d7a094b9c7de5c408154d5ec4f972eac106bccb2ff84f34b6ba3f250ca81dfaae3eb26fcc69657e7480676cbd5d16fdb0917252ca3d4b44c087c2b47dc1c1d9e962c1104614c58a0cfb8163a2b474f9665452897eabcf612559b81ffba345baa13484ecb8882c9b054ee2c25bedd3bad80a5a48a1833e4c052e39180ddc64b99e6099f317a56403ae6d14b4328ace954a19f0deb90334563423a6ff4b7b43b41e9a68b4ee3285b1c3ad189813672c93ca427ccf4a9c45c03b7e7fbb2ee02a1d5e4efd4cbc78503c12d8c6f018806a4638859974b328d9454c5755575fb49b8892b68337e197448dabee301975ad1cb03dc4cd93d4488e04e7318f2ea470172a89cce3ea550ff0ad391f85dcd58f4e76faf6f40ddcec4fbb413b03f25372254992771eec08ab9bb441ca2236d826908a785d271aba72affbebf1adb34fab6969e1443e146d9427e8116f307e1ee9b3721a5cf395f9680feb11a7c7936a6004641818e09650b446d412fd5779ec1ea53ab8535e5a96d1cc2e102983dbb8dd28b3cffbdb319f0cc167399b80671d48d264897b9d5bc7f281c85b3f8279da6aa15c76c4eda15a101b096d63c5a9eaee75c574c138f9c70d71af9cbf5c123649c9664f208e1944426576d3c5904b77b02545318162da356657e510115f66899281e05b9417021d308edc5f75eae1a8df5372169b51f9fe9f462f963cfa78a099d72ddb191aff267c072fcdd653a570aebe210f4b369eab1b07f1c9498f930d5a9e123400555a845c3b909c737d20ce4dc9fa6897033d1e858749d87890a80d1513a4d31c80e2529772eab6c62cf34b5474d05fea2ad36211b22d494f7742bbf495cd4560fef73ae9ac6448b752980a0398ae50285b5da473c291b5cef8938099fadef9c34e79ad0aeab17d83b2f69d9e91cf2816a2613b696a0cabcef02fbcbf8440c469c67894762f42e4a561a5f8ca349ed5389ec0d3f88de34437dbc793b89ab1dc282c6584329d7f756009f09b5ff1cee6f1cf24a00c35527e5664288579da026f1ed176c016c4c9cb8ee6580cca073bb3e5b3e81d2a135c796d124827e4b818f4f99cd36ec261e2eb1d9ff854021dbf869e0e7f3538478ce83d328563f0d94a8dcc84c302950883e5f072a6bfe9488f641594bf0764e67e5e85c0fa033bc2a451151facc99840991728ccfa64a0f70fc6834f025b21c456500189f2a962c3e4a7581c33b319131ccb4e051bf880b41cc29984b3422a77089778c0ac4034031bdec126b8abbe59f812f8d241c27acbfbda2932a7c4ac957722ebd234f759d9a1a387cc3a16ee9d0d55d882ea1f88efab85ca2eb77b1ac22165593cd69c407a5c98300eadb3a257186297bd8a1014ab3f99a9aa7b18057546bf33cb1457135fd583d1a44c97d10bc451993ab891a6061cae305f2d0fda61be0cfbb6496a6f6542f4aa6a9a1ba32abe9393e913da26602d4f298e313ec86bea092e34374860ff6e1bfdc0af7d4703128d45124bf0a2c9abf6279ac41c478279df079d07445989e843cd70d849c697c992e37ea07386b3880f328ab679f28aeef318a824a8396c3359143bff9d92b1fd2e4996cdc828033fbef4d8ec75565e7e9d8aa82907b8de1e19ace1405364f1ea172eadac386699b14873f1c9e1e237222d2e9b4918188e018d9fa98440aa2e99f225a1eeacea10c41409d896e94874250cf3fa24db314578cdc107669182acaa272cb22b8a446a17c7f578b015a8fb27e96a1300a31dbfdcc52cef7ab39122c88fb91f35b8b1044a03c3e31a475cfe61a438415b96291e4d68feeb8b11ae22e05795c95b259cda20e8122c195a4da72c40a8bd189500ea4bc4bbd94e19472e1512a09bdd42d002c66d5e22b5a476fbce55e44f9cffb30bcd9547145654fabaf544f9c5ac22ed95895206a03d19d023b31041c84c89ca7729b55a3ce9ad1b78d340038b0f6c540c00c2142ecba420d12e4b306550d92bc2a7e9dc9639c7f36fd944eab295a2cf21aa43f1e0d18021a223ba93ecc435385e16cec226777e16bbefa1a7c353294ae99cac9eeddd7c61948eb098812034df6d069073fcc8a24b2b6db599afffa7d02086aa939f9644f07d94d14e8a6e1972483ccc8715546c6999487c79af3f1c170a3e3d1bd6102560100ea401092fc4f411e59179eebd2a743f1adc6b5da45eaa6ff83868c7a528b291a406aaa52575e62c9141f265ce82a126f1e03ca6c4012b0a4856a1f86536441b0e1b06668031422c72ef883988f41a927b45a2fc869ace55c9680b6eebe10d633e1bb9a2ee1042ef4ee7bdbecea527663af5edce8ab25af5ed928baa693648159002ade05fece178cdf8203f12c9053737a6e277ec39f690bcfbfd651210ee06949a8fdf8fac2b8b8bcecf90423b33cc1cd05600d86646c1de327473626fe6d6ad554e85c84ce193ca84cea49dd6d0ec7110330a3d5865ed5863e3986c7fd2d7a4152e5c6d4210d7f37977118a9bbb0f25757df440313438efae100df12ee17ec9829acf62096b26222870c24f55739d12187207d347b820d658548f8c0c9805cf2eea2ce224ef633ce3257c02a7771cd2ff733456bd0399024a35dc5596d08a495926ee00da4685f5b659c4400a0b100acea86c0d82ba9080f6802befbf51a8e2f837834ae99497c1064931d8939cee5d38d2dd86b2d192314208647a527da786fcbcb12e8787ef0465b708bcdf502981c98168b8bf5dbe921827a6c5fbbfc29c2f96df0f6f5ebdde18d2e0d41a387ce771d613530df208bb999988e7ba20ff2666a8a40becbd6d633f72232971476cdd54b7af0cd4af3a183fea0672953fa8342b09d2ddf7b1a150e06d4bf20b22304633897e9fdac9961ab7130b4c43e9303acab711aec3b4262c6bc30f3c701a6354e5a9e3e6e790f3c9ac165450ffb88547882140f8ce54b29042077ecee9f037a498efd88e0d12c3f0677de1c49ba5e912f393a47dbb4bddfc3bd7b918bafefb4bff5d82beda04385ca56f01ee3eb1279b292baaa5a062ceae0bc807bd87e09770a5b74518740346e9a6ddd6dddc9516d5c972a1a2c711a7af38fe0152be60879c6d63caac8e039ef0fc83299278c86b323383062ddc9cdde91535038b2b536bc4c57898ac785099bd1c1ee5414c67ea3b3b5486f50cb056e4c9fc7c9aa16bbe4c626a16bd823fb065317a373ab6f687ebb815419ee3280d3e47d24319e639aee0b0e5dffd68b7cc378fa82db7c7c8703516c684e4fbd8f91b13f916ba05ece75a4200639b849177f7dac3c646860c860d398ce9ba1fde8aafdb9a6411e8e4e2f593fd014d1ce7e5b02ed9b647e920e38b1b31c714f80c48f0e58415a47970412348db6fd35f0313f9e05809472403c92037cea3bb9b5e4eff76c984df4b4506c92e2434f950f548277654f4cc45b73cfbeb193f31267f2919d44c68ed0c632fa5f58c8b2643770a346b4ab9a5d2867812300d2fb20294cb561b8dd1e5e77984321492cade96c383503f7593a108c3c80310ad4496dd340fd80dd602b068e9abb276a8d11a7c2de648098f5cd79535574e5a7558b8e500d436b5586d46a3662f65ec9ac7c7935118cb3c024f76b9177891dfc3a5ba56c7fa2e9310117e7bd3bab759f3dfb5b5e7bfceb568a28da01b524585efdcc66ce3eab12b7a497fcfdc777f94b51458cefb45c6ceb2309b903fd83b263e8a307b02b0ea2de3fe587bf1421ed06db4b299261b843731b95002099ec0094c03d4eeb82519413678b3a0326347cba7a0fc99a52e895a09096570301d71d8a084b8104ab0d0d27046ef0a27aaac65556ce4ba12f59709a5d19396df49add57fcf01546211f11be8af9d2a6abd6eaaebcd3a4ba3d41cf90c28589d68e9dcce192505b75178f19f3b4c35cfb7bf25fbae3266419bd0eff3099ff0243278eddda86473d1c6d076f7abace895529c546118d5993025a188849de72a62ec1ec52ae20fc9669b88da2a01a56de2bd74caf055c416afb177d14ec0ab2120c7f10fd6524cb36a0d8b474274f39c728f58eb950798d93f2073ec64e140a3e9ef8686031a9c54fba2a143a6290ab71e469801449537a30bd9cbb860dc93b8fec53315b02179c4bc411c3dc0fb2e01505116e64fa71daa24cdfca7a0944c494bc3d837130bd2346653405783c5239e8f028eebae12959554b388c66e6f28b2370594a6b6e40ee6c43773dfceb63ab5de23ca7202fea074013185a2ddf21f97a2f620bc9afa537c9146f960da52c5854b947773aee3a7b6c9a216439cab30a5bd0c29c619b70166dfebbfb0a083009181b75817de4232f3acea5ce8e3fae3b2df8f9d8fa62549d20c76305b286a14f0da1fc008b085a1b4fc30fc38ef7d7004ac80000998233a240ec049534989c47ba9ad874d41fb43684a727c84c4b0e6ae579a50ca5d9310ca49c3148a8bc49a6ff340ba619142a08e3e6ed41ea1915adbce00672c23dfca0df1296f6955a3a98d8321bf8892ae2ac05c27e7ab34ae34c9e646b64424abcdfb5bc0698917ad6762586d7bef5ed3bd80474ed3ac9edc777cb3e84ddd2490d675b357405c81baba879aaa76eb669d3f5c2f805c76cce5489ebbb5b99d54004d04a84dc05b0755e5c541ba90ca2391cadfb767cf9dce380aa9ac0843f969584efc4922152639f8202f6d95ee72cd72a6cc661ebdc7f0f8a63ca0b38750e4220881a07fa6edc30de7b1afe4618becc94cf50280ddeabb63120862a0dbe6df181bd31dddd076968bf916a202662c200e24a690591a96608d6a5b53128866a4191fed139d53426bc1f8cdc5c69896f7ae2618eb56f85cf85d012c782b8a0588f070bab71e04f55558af7c609efb3d137511d76847f4e333cba8f93abdf0c9a1c3ed2c6842f9fa5851d2ca318e75eb0425a4d1cdba71a272b84a5d48fda54e7d388f0eba35184ed96f01177c3857858b07e568c76df33b132092b51697dd5344ba051eea1fdcd08c58ab065c6ae48893b2bc98ad12d62a1661a9c2f6a2320f68a7691502a83624e824684171f8e2cd29d52068a66ba030a2be4ad7a222e99d2aab854075747b411eea0ffcd166333d0fef586d9d831f0e9cad4835b015c9ad492bb1287da10ca29d588ee3f6def867ea2ff4dc3485fa0443d0f48e5e489f8818895f0b9c6f9270d81c6181d37159d4674c70f2385dd91363009a985815e2cc48cde695838e2112d458ad153b47ee788142b3b39f3a1425c019fac49940a75ff899d6aa970a93000b924d3683ccb0b790cfd923a90a3859b4684471f8db2f2d3b73be0627a30ffbf3d0d197ec637a48e5921fd026aeecbcc425656bdc865f2ecc1472aa6947ba99c6382ce024afb09f0414669251a71460c14d28a150de1f9a903c88cf2c73fa643631749aa063728e15f3ad4da8164342fb0029c264e8e1c05b1766a313bd85a809570f33fa46f36a8935c24720c798043cc401a4f2f275ffe49313a3eb6854c2b2001cb3912cff2937da58d5d54cc0d820586e17256addc123031482cb34c03b33be0d0e141acbcdff47da6c47a03f38276ac327e5f6c27c8077e08e9cd145001648911a350ac84a8add69f47f2b2c2af6367b158c4dd3e9ea1a2f4254157e37d156d9a0cf8d78509341e0f70745bbd903b67bef9922031588997454a5a908f4f8be8188e296ead04215bb240b0089e2e222c2e43629c032af00800f8f9cd3f060bc8cbca7c83ad24b0a7e60862226798cfb90d202d010919ac64e4b216aeea4f5f56fbba06c5135f0867029b995dec40329a115801a713e75010892a60c0c301afaa697e873cef23b6aaa519e9954abf958883138bcfc9c4ff20a714c0a3e3615b7730a19b6cc9214153a39224c9230dc6b8328458ddbf6e113ceb0a84e0a6023037a0cd50c0871f75ba4c06ebc46eacaa2925d3f37f3411bf6c4e0456076aab2d943580041fc333e329e3ff5e055694bf8e5834b1e3f508012b8d5af79c2c2ec96d550dcc250376af6dd52762fd6f86ec655f68d7078c1debb0e4b584fd0d077b09a90de01e532579274dc0e380ac827288adcece6655f68b81e24d385e1499498fbb9e5693e4d103a95d497e3d84b0660557264df0a49b15abc30fee7ea5f426feb8dcd336b5933ede035ffec0366d1b5bcdf5c82c4c4549db12255d9717caf62ecf77d281dd1cfc4b1d106c5b17f6c6235f0b74812ffe59df2bd3fcf8339463686d7f02709e4061b3e544068faf08aa3d97483cb9579f33fdd604406824402cf2101a8491e059619e1054a8c8153fc8028a4c5b0ea59f1a4303b50dd0411bb46b8ab06d429ecbf905d27d93d5e728254659f3aa4b671e3f8d5090ed6b7e9957d23f6edc72ccfbb05324a69c5e6c6c163e801cd8453f0b2d501fc4d3f13d0199ec5fe9aef37168308107ff8635d272d5ce3147700f7699d6224fa7ab6a9e44b02348a6a155c62a91685a1ad1517228dfd691cda54943adf32bc304f1d7886f1df7b51a1f2cd057348ea79e2be31af1c8d6127d80eaba7413a58d7398074cbeef396b88beccc314f9654eeb89c0b25233dd0baa32b3bd9e97f5b9702a8fc1ed5a621dd4525063d3c470c9895e02466c88033b827ff97d4deb333c703a453be7ef1f407c9ce5d1e8cdb936ad05fb11d7c478d1c521c211c5d1040c2099c1e227e2a5db61aad21c3f5be695348a716517c829ccee3b41e8832c8c286efab4c86e76b8a9ce5aa09280b42658c1f155d153ff363b9ba0dce45d743778647ca61147d8a283d40a5af793a8a65e0c436426bb0da51e1f81f990f3047481bf8bfe082e544bbe0903b450e6288884596a0718e0c0a28aa139e6137592253c396ae5c42c62cd9f08be32fee56fd81e640c6506678e0f48401cdb551b35a96ff7a5b6c5520f6aee18997e30df13a7f139efc32fce5fb33c684a2d3e71c0182afb7cd2b942178bb79ebec9a539932a97c380bb357bf1684f6e14188c461a20df5a278082c137aeb615a694c4e517b5a6ade3c0a9b286b35b2c47cc1450afca9cde3cda1eb6058f909ae55014338c29f25e346f3540e9c91479bd94ca2ec7b40e07ca14116efe5a0d62a45919efa8a273d38a2e96a0b1e4f3fd26b8aa62751272ee4eb8594d485a42773af223b3162e494abc78aa38dded4d71b9209a6102b62a9568e06fe741095b4dc4b67a918657ae865214f61b0bd0bfb65205c760bbce00622599d20a6ec42c2090cb6ea21f77ef34c4f64891502249c78e985addb2a428630f2782cbd5fa93a7cc22b0353c17ff21cf05188163023f1463e22f2eea25087a9eb6408180020c094950df7964e4687a44ab7b01855ffc7fd49f4407f53e0f8b237858215042cc8049b1256060d78f0b9f983eeb8ec9b9ac94bbdf8bf8ee6d5328a58278e36b57e128b25dace74dc4128b1ad7368e7439e893c8894db38b099e6473b2e55f375e66e9e019dc831cc4448c8ade224970572caebdaaedbc77da3bf1d4367fc74d5e51a858c73f39932a43c55d6bf8af87388c3eef661bc71948d4d2ed133704e458e0c199b9206cb22f1d658acdd85c6b931ab5732d888c5f679b83e29a3c77d482706a8252c5a920a254fba04a4ad9f2c3cfa46b198ad1c874556cf9308ebdc893d6dd48594d75efab104e2ad43ec18fbbd26aa03fc5f022041a5e6aa78bb28865b3d7b7540bdcc18058cef378d9d9b4a906b43741656a90f44450685539312dbc1a1908da7a4656430966a0cac960a36222b1dde623287913066f59bdb18a94c4fa9a52ec6d845c38bee9444549f52b7c57e4b7ad35951b9d881026b3ea26e557ec70466d7f7913b9b4495365f6efeb16eb84754fc40668b6c9e32ca0b11ad67ca9e4d8dbafefba01d834d1221370c0d763271fb66570992a253d33fe7cea31a38b4d1bb1b5eaf3fe3fa27f769a703d687d04f468117f27c3102f2079846fd9836569aa394871a36ba52c01664a665b4fbd5a435c9a937a5be7c65b6abaf2bb9088bc8e5b87b8c381dab193af3d0ded7b575584233ea5edddacc7b7f429a84b3a681fb9d9a86d687b16122f6e0dcc626a5c502e06a0248372c18fe5d068f0198c0fcef516d325b9c9bc88bbabedd90d63ef241ec937deece7f36243f83fd6d8afc11d188e91a8db6d5c1a7db7feb1bba0ad352cef9b653c75af2a0bf1eda81ee05b2d28238cbae90c66ff1f2e2f646011639cf3374b0f08d89d7a60568591c6f20c1cb6b9f9afe0fce30f02d5fec99fed38150d077557a79ff5ba1867d40b17a8fda214450663ebc1041ae2a978863d8251dce3f901f8dab8c12a4a62f6d910a6a3102037221b6b9902841fdda856a279fbee0e8b7c73962b0dbd5fcd5f0e5bfc6b760a83d872a045711666861305318a42fd720c2dc6ac38aa51284e1b8577055081feded106b844bf556b66e2d077a5dd13d270f82b7285d69ca509c48cadb07f25f33e3473a41e47fc258c16b54855fd3dc6d2814729a5c37fa1031cb4ab64f10fa348dd0080af6c9909f9088a75a22226f3c6094c56881d5448ecd7e84a16cb90162a26f5900558e0ab0b293aad473b5fd1c31b5ffd282e076124a490569e7d91edcc3550badc9a184d092530790e6378803fe364134bab78a61b5b0e00cf01a1e0c2fde15ec29da32259c238c038c708a77f2ae175a288d0abe46253236b082eba581491ea252318a3c6542aad1522487b88539fbf62aa8e92a7c377b594713418d459e8801efce69b1279293d6f46d91260f4f22df4d1d14399cde72c3f19c516193432b53c75ce64402bf0ff03d6f2ce334cde1c943f90b1a2851da4793996aa00ab786756d30647b94664271028889168c75963ee172854dd8c8ed03bc25c6d885874508e1a4f7b4f517ff2b0a685fd8f81f7bf99ff2d973c13acde272601b5a76905e5fa1d182a2708feec4a3783b279a14636199de28d438f65b3e0ece7d43160e8523b8ffb17a6e596bb02d81b93deaa5da65086baa30e2d7eb8d458583578783deb84b20ed3c3833d1fbf4f447316c3495a1b1f964a5c9b7401b7e9d5ab0acab49398ff099b708ad62f5bf16fa6885b485a4af88c608c23f6ae04ed8834ab5bfc5adbbe8e48edb6fd165e1aab644ab50b5e2e99e146c259a67c506f1cfc51a6094183641937ae1aac6223d837f3e1845b89fdc2f9d5b674aba114469d4e40516b00117b89d1b18fe1aadc8eb9d89a7e0e05fc349d587d29a9651f41b20da3a23e2182bb656675faa0a82981be1c3e0a65f42d80cc1e2f6b833d3161261c8ec94dc000ac98c62c4971750e0254ac40898ffe90948876b3dad2f4db0a8a403fcc53402ad9b22ccdb36bd1d19f5e12ee135019259e4152f7e65f0cf6477f1de85900308869b65592145450224f87790a93ac60af1c545266c7f278102cc16ff9084ddf3d56ad5992b8dd0c387466600b949af46e65bc9a1622b09e06727e190fbec75dc22c87663bb330b379ae03687cc07f41cdc616f29b5b1db5bb6160b07bcf3362ca69f983f0bfa320ece4dc603ca8b4322b3551a32c41b79d1ce5af8f36e86ab59c6c1897d0999aba6c38df6f3469647fb72d385d571db1aba34c7ef71a6b39e2102c5da08273baa84890bd7b22951119f2ea73296cf15848b3f91ab72546d45084c305ebb3eeec63bdd1d0eb7748380d45494b819eeee69ee1961245cbe18a0041f392cd2b1458ef3ada310f2ed21bcbc800e95017b38bd4d14fff2915648508049501c611c1ce33bf8fb8faddc5326e3fc1ab913b2aedc1e2de4287ccdbd06e94c8e1446cb35b2d0fbc41312be5934da864259a2a512db0366859823a7ba2194d12f8ee0e99f43f19c6dc14dababed63a9cf5c218562c38a5cfc011be5d7efa3c98f9517b13d17a6cfc607f961e1e17f4ba61b02791b911ede67d91d55673bc1c58dfbdb811dab4707f994eeff594cee7a802f92565ce193fe6ac6f11e4d5cca4f72864861f2d23e0ae7c46106dac9fb787e767e4e9f4fb573f2dfaab604707003130a861a73337800cd221bcce518f9b1ffbb2dbd37fd076212370b32d5976de259e99a1074691229d82edd9cd64d4b5db3ff654b572cec626fa9e6307364a1f547cc1f5c7231988824d21dfa085a2f0ab76bccefa8677058b35cf90300c27cc52ba353dba1ddcab31af6b073da80864eb1ec2ac7dbe81e8ba20a01b67c2bce4e99bb0fac32f4c845fea1bedec23f9205ca9d869afbcfcec0b04a61572df78a41581a33901ccc1556f7b5dd8b1adb4202f046847d1b4155eb8c0141083d70007ee00ad3815edaf2e22fc11463a4170eeba5be340f274bd834789de6b3d87cac439771e680e4d968fd69592dbcf882810b63a8ad6ab098c97a361a2ee89333f8195f3e4be0d45f2b54c62ed20d61031f5243a8904d4dffadff8e9889accfbee69f3b65ff5b63ec9bb53cd82b230f055160e78b97c46a57210ff61f72da25c721ddaca5e3bdb5cc16d8db515d7565cb12d68c6e4250ece3b73d0ffa872bea206a26c284a7d16948c79c54b1892f954f96ce2571ef9842fb9fe9d98843961a16de8661804eee86b3ef78a33a740285cc46cfbe533788a932ac9a6ba77f9111a9a99cf22742a8baaf23bbd4e51f98441a529bf74a3345df3a91aaffc5b408df3a11cf35d78313b6310d676de0716199937cdd37961f415d0ff0edf7be208d32e95b6453447f0f41c0f101997a77e185c43dbf32f2843d79ca0f50597a4675ede7b3392279bfc15c809151c2d35652deb0ac017128f928acbbb300f1ff6a5855407921a2f16036fdcb2308d4b419ed0d99fa61b362ed883737f418a283ef289fd1eab272f02dee1a7627c4ec0b2487a99937541f915cb90ce55ceef2a331eb8ceaf52632590dd410bfdf3b554432287edb0c04d5ecd1bd21572fde326844c522223d26607c7163c1618a39d51105d7e37e8eb7fb8bc7fad5f70ea09c12df88ea2164bc5621f511055f829f6df428865846d3c02514ee9c5adf59dc8e2266e915a7d9a8583475c07f836b0f5cd22dd46856f4c2f987b48afd06c1fb832022e944901476f62550ef020fae6850a4005d4dbf78620e12fa19f11745c5f7a35b008f86a3ba64e0b353ee5512b526f461fb47ed776f1f471781f753bbefa9da53c5cb2f9c3405749155fafb718dd981324af9f4219a4ab8697a7ef74bb6abd745fdc6a5257f69070d02f8bb21b4250c7bce9495ac50e2f590466ff833d36ef6c2a20153021ded403f2750609bcbb94754a263ffa03e736e5eece00d7975a993bd38d486a64f9170037790da0e9e6a5fa0ed12995fc761b1edbc3872f397f87dd7d4aba941f040106a302ca08a7e3137aa60a5f8b73f4377284661c681e161e496c70cfd0223f04c0b59b84147142c3605720eecb76652fead1fab24bb5e13c61f545d2349fe89ebe0c603d78171e85984966a2e8a0060d86abd874e316b0748d113af9f5898fd67abf0396fd4aac5f336a9cd8a202eb603c6d9f60c6400fa6695fb0b0b8e4826df89f038fe46f2442275617cab203eb0d43c20afb08d86f95e6005444c9b5d070590c15569e0c57505dd045ab82ae94f586ec043710bb5ba9fa512a5cb0a2f1fc5da2cb491ee5bb86541208af86bf2d331b01984d4d50e3581aed9272cb7956bd6f8e77fe2e71223c2cf0c4d81e83dea3d1042be8495940077820cebcba06469b541be5ca184fcef1c0ed56ddd34b87c2e0a146bf5728cda431211be839d06ab08470f3ef52e687b068e862ee913829ec68a4a6d0f950030efcb6fa91ff4e66deab99236456f6d8d19664cdd040018f4e4cf8894beaff3b42a41b3747b04c301c291d39b29a9c58b49bfad4d124633ccde33984b203fc77ee7951d342d0b8e4fbda940c7afcafa30d99575866e2aceaa1f9e4fab266504739eca0610856094a0c9696dcf88c97036e941e722e501d78e03200d0f283659509bcef47900d4cf65b24677d91eaa33f13bda5554e6f6ef229c1fe5fd1237d5404120c42fa3253c0591f680b7571a88fedb125587eb4dd007d2c4d8879f27cd325bcbfe9f16d6bca063ada4b989d6171dc23ae80851257582ec77328816235b1da9a0633fe85ff10c43a923f1d56800aad6cfbc484e6cf1926d4e2b666c903927c617e4938cf4e5e63b27a705e5abec621e625bf2d4c686ab335463fd4e77df0a6b6e2c69894f01af66a6f759600f075f10520a7a92d58e590773abb9090ecbd215111dc4f877e9906e5f101300ea4e264ce4a90c1b3aaf2135b289c43ecd95ec9729909603e7b192ec66dcbcfe5805bd3accffe783bc304b221aae7522427c53205eb905566699d56ba7766a63c43c2810516350a3f905bd2bb65895ad619cc6fba436d11d65c144b1d5f85761b0fae0644ce97800a964695d5f23ea3e5445143f931ddda48ac2183a3d5139685efe806745d538339498ee700ded0c78b862ca045367cc0da4fbf57b250cc112b9f8b3f6f5a99af17df27328cdacbb915c9dbd8a3a7450dedfee8209682c5471b9a5f3d1f7f749140ab1744d23721872ad53cd9661d2746f0c6d25a7293819e393995900810185316304aa9e0e9015250b20af5a57a132581276bab3576cd7657ecd4d12285467f55196d18a55039aacf2a61e45e165d0d37b8e9c5706a475e973bb5f8d76772bdaaa4437005a4b002aa5c56775c4096954d63958b27e9610d3a6ad03db522f7496b208b0bf3f062d847ba1ddc8b2a50fb884c2d5862c31eb54f983fdeb652d85e9ea4e423f6675a9e37d6f5c86a05c4847a90de9165766ca50cc2b2b216112d697befbda5dc524a2965e207200712077287caa7ca6ea9a373a4ede5ce6cb121466643d92f52764a4f2f725b3c2aa360e18bdf280d86289c8b994fe25819e688a7d2469cd99233c318e9b9ec4205dff693f9fdb8a954a6ca5e4b2094a5e256455882712a8ca850e2d9d58ab78bc679dbd0f891060e1a5385bd6af12777ad8c77def8aa63b827a03b8cfab60a85556ff8a1d214638c31a63a865b0211e71a1f990082913d901bc621a62afe9b2df43192130415e1abb5d65a6b95c2566b6fadb5d6d65a65586badb5d5da5b6bedabb5d6089fb5b7d65a6bad12b8a8b2a38c0f31bafe87793d7396330341a8020148d757557d0c19a3dc232b5474252f3d1957240db78bae31963ac2571f1f4345860f20b115a7a4548ad7ebf57abd5eafd7ebf57abd5eafd7ebf57abd5eafd7ebf57abd5eaf9786a3a9caef6ff89cff3f25e52828373139083e953a0af5d3e9df77cf7bd75dd38ef1eb2de7a28b31c6685340419efbc034755d1bc9421fe7b591ae1b8bd948ce441257f2273e30f0257ed1c518e30e34f5a12b6a6f2c629f9874615324892aa9a2aa5c29b458c1e89cf0d1fb1acd162766343dfeb944b32532e1048fa6bf45b3456abaef91578b1cd00006dc05a800a180046404843f1cc0002f800b1f0830801401b0e821000040e1a10590971d4c7eacf0d1430790c7c90e1d3952384a72c0e106945671c3861a4e348cd870b5be19485c582d5e8d1864a031a3d49964b0c0b0e2c20b31b40daf54305a78c139a0010c5800100a4800027e3880010ae003010620801e0200001e80bcecf0c3470f1d78ecd09103470e38dca06fd850030d365cad195c582d3568c810c30c192c30acc478c185950a460b2f54eebdf7de7b1f5f54ee7d7195bf5009e3bd3d2a59eadbe3d3049110d00f5ebce0c13e42f7deeb82f772c3df87f7e666c80a88ece4b0e05e25c23cb5caea3effc6c4bc2a604303b340ce303b3636363b2a21a1a12868d2515112fe2016796a17307676623600f2e1b9414a8a4e0b34343521c819a2c40850506656e4a95b04c562b1a01747474853c05e305130313152f1f1f971a26828e80910ec29c9539fb8183204a7053c319d2552a99bf0f592b9801235331940a16246f2d42a8262b158501e1a222a02836424c5e924b4636363b3f3588c080e64d04f4f0ea6266951536383840ece4d129e47c3022922c5a428851999983885a94d293f3f40501811090941d37c50bc178c65643268acf4108991a7a74464b934e0bb0e61c077cd59c0cc9f3d0031c3cf5798c8f24101dff59580ef0a43c09c417e98f33428b28c38c0371d32c0372d2ac04cf994333e4c163a91256908f04d6303f8a63c029853e6f430e7e94c64499d007cd31a007c53257898269ff207c85c61145912e8e57b22edf04d617e7cd32279e463f6449644eaf13d7f74f89e413c66ea73ceec982537913569747c4f9c1cdf5307c7447dce9c1ce6fc8c89aca983c3f794b9e17bcee879fa9c3f37be651692626b4428b226900ddf92a8866f6944c3fc3ee7918db9135913c9f52d89b4be65cf0cf35287ce4816ea322f7362abc4a234ac6f69d3f22d6f6ad09834274864d119df3129061964cc4320bae88fe9735e88d8da58be23110cdf5168e540228d31cf23bae8d1ea3b1271e1dbc60b31228b22d115dd115bdc55df30dec2a55189adec9788aea68763ba5016f66940c88005f4205d7708881fac8070e3040021200c225d57e887704f2328fd01420344a402841bbc413e847bea6b43009a01d008802647baee4e0fe19efac2044007003a3ce8fc48d7ad01f2a36926f402b403d00f79245d59928f9066b11e12490789c44322cd485716b423dc33b3d141938306074d8e74653b39e4e85056068343b8f10d3a3a94aeac46b2d0df08f7b442746503500d403484f348baacb531271265593a235dd6d21ce9b2aeb035916698482e33acb025dc5f8d90468ea687b135920588b2aa103d92ae9a2459e865d0894167868e8c9025dce00743b8bf9518e191a6a74894556334d25583aa4d8d74d51dc942ff42e84288b40a9154e19ef430c20d7e2d84fb7b11aa84359a9ec33e43d245917c7c7c28d250ce39e79cf3e34b98b3cac3ab84393fe7ec1366a973f5a93f14a93a518bea500d7a42cb6f5a054d1f4a218c855cfcffff9cf373fe0aef25ff2e9eef22ffff3fc44596fa43705ac013d35922e7d0459e3a8c05c562b1201629292929292929ffffa798782f4f49c9fff3c32d53525864a953eaabcad40b6879256a4d9da919f8c36bb3636363b3d302050505050505252525e5292928a0f7928282f2a7fc292828474141196a91a54619222a5261908ca44849116a91a76601736b2ecc85b9352b4c4c4c4c4c4c4c5050508e8262a2c27b4131314939ca5350c22db549686262125b91a5368911c141d04f4f0e505042a124a1a41310044110044d4c4c6e620296782f2620887293a39880e041103cc95283b486da502474706e68122626e1d42b6241b1582ca824954aa552a914088207c1d4e30b984a991cbc09984a3d954a219564a953484952a0325300c130b3d9b1b1b1d9518142a15028142a954a3d9542a1bc97140a053e753085421d8542fda8c852a37e80a030221212422ae5a3224f5d92a7e63298ac26ab19399d4ea7d3e98442a18e429d1e5f50a753eaa8a750a7d34fa713ce4896fa8493e3821e223b3040a142a1242121a12492effbbeeffb4ea7d3e97b7c397d1feaa7a34ee1f77d527f530337d366d2cc234ea790244f3d120b8ac5624125cff33ccff3beeffbf7798f2f9fe79dfefdf4855b6a2ff43c8f486a8fa82826e96809df174a9b1d1b1b9b1d53d7755dd7790177cb3b286bead0d5fd5c22cf1644967b9ba7ccd394e70b24cbbd96a70be2ca3d97e790b872dfe5791357aeadb6245b783d6a285fdbb6d1c05e3046d468cbdbb651236a448d36165e8f2cac78aab85cbfc9c89881f9b67b3ab2706ff7421c76d8bb90aab31361d2d927c7cd97840e04fa7c3c2c0993d8f479ef65aab877e7e62c6547c47b1e10f82401a40249a4b24308580e904cb2213289647066ad31e5140f0795313494afbd7ddea8fe2b61122661125692b09995648cd7633e0bb7166ec9ddcecbf6f52534df9e3f5911413e9db52c849b417b46a14fbc97edf367b698666cc51edbe77710230f2235c9e9b31765cd1b7cd2bca7328d425cb947653a4564b927c9f23592a5cc29dc187f9f1682f3dbb7e99b276354783de64dd468decc1b6a145b1d9d821e51a43a53696c57e73d4ea7838ac52b23cc02ad33665e60c6c4d6366366cc8c9931fa7e6e5b096f8ce2bd7461b7b77f1e8fd2b7203a2e943233942f1913335b4ee68ba8b5a71ee97b29335b2a4fc41f78550c1eccc3c9c0c52ce9d18cbe9f31865586aecb5773991ad1292814e891cd14a9c2eacc54d14cd50ecaa2493237e69ec394d27b5488080848dfbb50cab5be185146a4414f49bc178a69e9f8251c464a4b5d76dac5ec6535ba5b42f3653e110a4dc313cf6c89f8f37a74617d14225356f8a851f68a2d2ed4402603cb86b0baabb76730d0f73b468cf136b2b2575cddc76747441635a2ab3b832f01aae04b42df9d81a0465a691e41145a4064c908446ce19b98ec18a790aae78930e9f9edc753755ff25e4a9fe1478d60686484194ce6353357f7392e43f4fd96a1aad1f7b5d65a77adb6567b2c6b7501f3e1073db6327d6f874c56ec01897c3b36e7d2d0dbde7c43a02dd237f65c9bd495329ceea55088d45cb8f14be75c745bce76329d2c2767389996330fc4957b53ce3e205966a66a66215877616c076565357375cf837d3e20a18c285342df1c538be0eafb8a547b628bea99bde8ea7a3c9225dc42a87427c2a4bbe373261b36ce9d06976d4cf1713a8c802a91cf95713f632a60ca97d2f3315614e8fbedb12a0ae2ea6eb195bd70de4df76ee2c270471e2ecfbc69e87b22fafedefbca83f1f79d87f3b479e3f5e0ee8542a436bdb683e0166eab83d0c289c3a9ec1002960324936c884c22199c1f8a3435ce3f0e85485d7ae6e5289d3bf7a2eb72a64b19c73cced92b9381cdd5fd41f03bcd70f43d376fa64a8673887591c9c495fb9ab392117cd9bf5d1ee3a9a23a82289d7be9be0be7109c6fb69b135ca3ef5980336b50f17b53ae7165decbd488b254842a19af0af369a17be1e59861105d38834ae1040a5d54e0dbf367fe98c2222a3d029a2d27d84815345ba8d1bca11d467d28e0bcf7d4c805c73e1ed0e746fa9eabd195bc5cdf65abb91c44ea1ed7f61b4859d90b7f57a55d88e0dbd94bdf2d7b457d431a0a911a87df54dde3578de9efcd8c8214d94091238e28c211a5d3d229bd86809824d2f4f31546d773734e395fe4e38c6a7d0087b30993f1a44b38f0edf959348d66cbf62a89e8aafe7a0787280c4c288410f2339c3253b5294cac9eb3d4ce267ed097acfde4415fb2d4561c59331657f593e7fb7e1df596af329c335cdc7408edd984be4d8f82c8218a446566cbae316d271285116943b3a52b328aadd214b165fa6e32bdcbfb33851468aaeae6bd685ad41d9036a7100da23031730504137413cf3abd9e8b99de4c55fd29d321733563d3d34135050a9a2d5aa84ddabdc54193937e6953fbd4d2d3415970fa1c9a44b3c59ec2582cb645f10511446a8a4487aa0b0b7c9b1e451b6bd7d2338b3eccdd8e88c763a58ba872c854a9c84a6fe24abd145f10b4d6d398d912843ccc6c7969afa71b88adeea597c22efcbc977919f5d154554991684893a6aabe4403df9e4847babe9e1ec554483d545ad224da437d9288ab7a15e02574fd0c743d91225df78c8141dfcf9e3dbacacc1698f6aa35fa899454df6589233510dfc2043c7df25527d18c4d22535527cf06ebb92dcfa2a9da5e4f5ba01d1361e2ae6529e5753cd1aee170abaa8eaeb7afb8525f345bb630c6bcb9f96cb83f109caaaa7dde6af2b4dea8ecad5807d6b8fe98a73e7c4c95dc41a60ee284078d377c80507c3bc674dc56989b808b71460ca866cb8e4846649740f66757c96264a0cec0484fcf21471610baca9e65df33e86c86cee84a67d148674304e16cae31cc615fbf6d76fb0d3a4490d9129f3ddb1e73dde6dc686c210d2aa78d767bd55badb5d6da4d55f6884ff59189278af48e483893c03330db36ed9b16a2a62acbeefaeab37a6f155e3a782286ab2b2f9ed346a68e3147045c7410a793b8ecd0f391de6f40624bdec6738f31def418e34b9df79d662c3bfa994f37e552de9ff7e50dc38724448142b868fa1d536557da080983a2b71315ba80bbc4a11f17f3768ee3b82fc7771cc7e5792e172173e4ad12e30a7d9c337efb0d2ae34da779cf5008151d5ffa964f7a7c3afef37e634a9dd92277f2fe4197bc122e612f4b1d71b827a0a39643acc4d8c2d8f8b905b73616a3adb434d2d2c8a12c44f12180403d903a2526f8eab90b050106859156d19109287a34f649d25177e746ba118fc74a9b3e6485a6cac2b292243e99335bf0ad76fb6a839983c8923437882ddceda78e74e11ac9626f7188309fd03a5dad754b9d1fdc2b4729fd4e2e153ac976084dbe69113da249251ff9ae32a86f92e373980485af7938300ebfef04e38f6427c19909a8a224528cd2d9fdad7507517a10a94f7aa8b4e9a6a72e69eeed718d74491a1a7d5fa33f95ced3c165d7b4efe8a369d7de65a62e9bb4ec72a9cb5e97bb2e735ddebaac751977f97639ebb2ed72edbe50882ecf6e9391838cf881693b8f5252822fa2c456a6ed6f586be38fbddf2bdadeef1adae2d055b4b7f5bedeecdbd76998d3d7d3213b4deaececc0d0f83b468c9f9783a48b5cde37471dd2570815fde92c9bb4ac892bdb4d3acb25a492ceb2f793e50e27cb1c95e1749637a24d675923a2e92ce3698375966f52066473acce72d5111657b6aab34cb5107165fb8db983aac495ed374faea4ab546868b200506578f8ae3140be69d2cb373ddac10220ac38b4862a1ec20309c19730d215c90e61a42b5406d3b688ee440ca14bdfa96be7b45c7172cde9be7938342dc4a99c4f9e6867c10eaff944bbe955bb4a7f4f7d57e98a43593b845267aeec312adcf82309f7078e841b3c85fba129c4d1f6a9197cf5db4be1063b1ca4eaee54081fff5ebbef8aa874481622b5466fb40791eff2a680bee149f4eab58c6be48ca0411644f990a0ad6a5a6be516cac0997bd16139336cc363ca0f202195850cd47373da991d3655de8b9c33a33617cd793493c07a7cb3844597dc4064a92dd981b852b1a6f52516f8360d2d1f502311ae9930993964e6687c4b5edfa6519f6d4026b670b00c81aeb204baca154cd56ca14051f4705cc9844f908e4cf8f4e83d3ba0eb3f1d99f0d9d11236335552ca447a424d1555c97a7b02a76a88a9929f308d07092492901d47338fa39dccbcad74aea46ddbc671199648785ca7954a5ac7755cc7791c121ce7691ad7711cc7755c892b9538ae3395de691df792c9e3342ff34e6578e275971987a5b76d1bb7715ee4a8263d4ff38ebd63ef98fbacde39cd2b3dcbf55cccd929a695eb382d6aca51fa8e6a268d96348dbe640ab7895ec3b293b2e4555a65e5e4b67dddd76de7368e662f65eb614a354a9f7925aee3ba92c7759ef7cee354760801cb019249364426910cce0f45aa35252fa31ac799ba73b72b657b9aa3469da4f3344d3b8d7ca6128a64e4a47da692a67146d21591a42401e7711c1706d179b2e3f0d7b9be8ef3bc8ef33ccff338e9e260529280e3b24e22d1691ea779e73aae93994791d04a9ce795b4aeeb3aadd33aed25adeb4aa64e33692593a9f3bce3cccbf182ebacccac2401f78eebbc54c9ef4b5a49cae33a2e479d595d9a45e45449cf515927a52b3623c9825fef0365e150c6cc55e5d9b873186fdfa785314031f146a0185d6f31fe3e3db5ac51ced2b461c4a94fa034b6b8474a6194524a29a594524a29a594524aa9a5d88603264bcaa34b949f7c85c9e5411597f22ab32575d4493ed272fa4c2da5cbe7b0c307901e664b6585efbc1719dad8c12287a9923eb45c44caa9bcb979ddbc6e2ea5f5f3f293c1778f3d1d9202cf2dde65ed35b3c8eee5eda5ecdd944bffb2e9a7fc7d249f4e92478eca244f65d44b72ea2a72c9c1ace226194cc9444c00860899058df127796e50728b9f6494afc82737c92bce65a9c31ce302165fb1197d92e86a9f301fd2f7c4f9f78cc1ec99ab7bae878b73f66c95e6c23d63be674f0eb74aa7e4a83bce848821b86bde4b774a4dba94941679fe0005b1c854899bb9ba970ea8f33c772825e32e056b943c7ff28a3c83f2149aaa7b30cfa149749fcad368aae6d1544da49994290c8d99aa1795a1b0992c539a9aa9b209335562aeeebb4c87e8983ddb8762932786bedf7248df5ce39c7b15e34aadd59b3d53e553f36d3954b4a513f4d06c199244b2289c98464a4f26ea082e930582f3debba8b4847c7aaa62b07650ac6dd2658a9be9a5d24d9eb556b31ae76a547770a5523744047487c6660b2d2add4b7f688fbe8f9b12d117ff5ef5f398c2ca85e1169636eec7eb51fa160af1ba0f48d2a4c9ca646cccb432f71ee3ae843f8c5d4aa5d2718907638c317de15904cf227816c1b308be8dac5924aeee31778c4b8f2fa65249bbe95aa9743c8754323426e968167da573dfa6739f772e9c3f5e8fd24da1f7e26d9f4153753fe79c73ce39e79c734e1c737e0331fe3e9cfdf616d750a4236a54faccd90be601edbdd8cf195bb187fdac4264e5f1b291beaf4dc4562cdad547dfd71e1d9cc9c48dd0a3919aa9aa185f3bbea99e6edb7c779a6d9fdbe7468fb3e3eeb83b2e7dcadabd74ee1e77cf6788764147267c6074778c81989ed1d57c2ed277996a15974b99791eb636a66a1add8391258d62b538b6ba5b57d493c3d97b99a10d8c7d4c95e93361cde4993e431642a4fec2addd7b8af7826f0a85d4a8e1f158e97a941afa664f3527903282e0ecc0afa3210526b6d1f39c4c15f92a953a91c55ee54381dd1890102b83cdd5854555b5b9ab188b2c8eb65f4074dd1dc81d48a1ef814040745d26984882beff21b65afcbe00d1759b68e208fade87d8da7e2f80fb1e624bfb3d0f5108fa1e486c65bfff71ef23b6badff388ae0b74bf23b64cbfc7117da0ef7388add4ef75e481bebf115ba5dfd36083beb7115b23bf9fc1a5ef5d628be4f73558fa9e466ca17e3f43067d2f23b6541cb1e8fb95e8ba47482fe8fb55745da4fb17d17593ee7374619818b105fe5e155b26bf5789ad13949816fa3e25ba70ccbd4974e1978c0a7d9f8a2e2c737f8a2e0c4389ad94df83b1b5e2f7a82fb64e33267def45179ea1b9d7a20bd3dcdbe8c235d2febe8badef97c5f3a7f772eba515e3efbbafb7d27bde636ca185c70803c66374c185c7e8723d461b361e230d343cc61a6a788c36d8f0186fdc788c5a3fc61b6e788c38e0f01873c801c763c491e331e6d0f118753cc61d3b78e8d0c387ea7bea1f8f91c763d4e131f6788c3e1e55fff155e6b6dce25adeba9ca5b2e9a59cfa482ea9c828947cf294949c59fc47de92a686660626f38ac130494847464544434241403f3e3d4d30b18309646ba6ca9694e0933a190f5d09c9206d410dbb8065304b3355b6885ad3853d54ba7b175a2258c319ccf4755a667196c14c5fa76519cc66d85a9b591ecb636972802d4d5c599b44646531150f6e00cee05b42c75420755caea5b135b3e524cbc21e1afe3e10943a303e2f3059571a5956664457f655f6c81bc496bdb441745d19c9125babdb5f18fe40edb670d555cf8c286b025119e9b23392c548cf5c992c96c16e2c96c530fe3eae0ad1ee47f6917b641df2c6306dcf23efc83af2c631da3e47c69173c838e41bb2ce37b20db9864c43de3748dbdbc8aeec4286915bc8fb367199d87707da7eaa72112fe45d69a0ed63d8afe45d71a0ed61c8bbea40dbb3e45d7ba0ed65e45d9bd0f633f2ae4e68fb18f2ae50687b19f2ae43d0f634f2ae45d0f635f2ae5168fb96bc6b116dcfcabb2a41dbbbe45d99a0ed67c8bb3a41dbb7f2ae5368fb17795729ec4a855dafb06d05b6bdc0b61ad07603da6e0afc559fc577953aa00ed5c9196b3b235d196c46dbdb0d44d7ede9e9804c6c711a88aeebe373c42bb65a5c20baeecf4f06b4bdb5b71588ae6b2da05d21ba6e50501692622ba342745d21212b20c5562785e8ba434353388a2dd314d1758988a2a06dca09d1758b8a9ea0ed6b516c956e5f99105dd748b258a32668fb4a145b23b7af4ab04bd0f67528b6486e5f8b44d745922c16498ad842ddbe46115d37a908d1856186105d38068ae8c22f15b7af40b105debefec496c9edc99392a0618e1043849710b47d7522bab04c13d185613dd04174611a94db94db5722b1b5e2f635165b25977902f683191fe8ca03cde2f6750638883bb17572491ac9627568105d1726596c4e6c6197a5912cf639d0f506dad640db732bb20b2fc92b7eca25387f6791f1b9bc7a8bccbdf0428c182b2b30c0c0c22243c68c1931c420830c3468d4a8d1d2c262b9b8cc3043eb858a8b304cc92e1c25a798e49383d9e42a3278545671928cfa482649e5d24d39f52e9b9ee5ee5acebe65ed2c727d8bbc3920aeeeedfdb53e2fbc90c17a62c4e8f15959f1f98101861f201616a0201932828466cc101a8a218621221964202aa241a3c8a8460da3a396962324d659dff326b9dc2549db6398193e434cebf5424605e6227c2be6c54b4546bb8085c734f92d6832cd5b9c8605ac6eabef5be4e7ede9fb9cc3bc53fade4556c93b45dfbfc83bebfb56de2ff4fd0cd925ef157dcfca7b86be6fc9bb86beaf91f70cfa9e46de34e87b19ee63c83bf640dfcfc83b36a1ef65e41d9dd0f72c794728f43d0c79afe41d8ba0ef63e41da3d0f72fe41d8bbcc6568d2bf75fc671e5fe94bbb8725f92bfb872bf22a3e2cabd0b198c2bf7291925aedca3e4c795fb93ac1257ee4db22aaedc8339465cb9579165d070892bf723d9465cb92fe51b71e53e9573d8e123aedc6719480f71e57ecb3efc1057ee571988b87263d7759bc783ea3d013a84c399aa1c9c16d55bb8bd8cc5168cdb4b1dc49637820882d8c249170d82c140db170b223e010d82697bcf5daefed67a6f55d5c3c82d9c74f9a48b53a5a2433586267d3a522883516c0a37fe605a0debb56bf732114368de8ffa4e65df85dab550ca1d99d3c5d677fb1a83d832dd561d6dcf993aa9b37ad357e9cdc9490d5dbc3e215513218db4f62d75a42beaed57c87a2f9508a935215db741b1a3ca3a82261ac80303858ce6beeed62b659d59503d8326a71b2fe913aa67d084dec495e54e9788ac7984b8b277e1e2e48484446f7ac3e93d399cb9b297df2e5f0ce4f1c96027f44554bdb3199aeddc05ecbb301d5bdd6c913568b6986e5f7726cb08bab22f9d0efe7c3df6fb40f0dfaa20f068958e4c04c1467371c6286b695380e6c2e8cafee4b4c523cd8fd4c5237d51f20de3e048c509d2ecae57d0f6d587b2a8cac3ef2aa47f1c1aa396666e30e5fbab382fc28db18b707f61b8bf1c6ef0618b30c4bf342afaa2ac4973638f124aa20ba32c6983b8b23f09b76a45b80f73817128c026b4fd084c07b09db862cfd95b1a201c681b991ea8e46a9a0a93245433030000004000a316000038100a050322c1388bc24498f20114000d72a24c585438178bb31806338c414621060800040000303000000354220049dd88f78c7f0a0d0ac0b5b2e2b5c336b0d53a88e8631cad87b96e8963c8e4d3ed3f405bc762276bdbb6be4a11d1d9db079d20814681090b894501e0f18b08653c1fb217e43dd5df5eb83b125d729a78b54f4e9fff435104e811e6a0c9880515d48b1dd1174bfce5092730323484cbdaa3da1d2afece43cf9cb31d39d30a2a59a86cf96268cd7179733d109826f166dd3873f15ea97886126c5f404ac3a37730bacdac45cdd843d6474cccea2f53fe0db8630297fca0033e9dc09f2fe0fb12fc8fc05051c0020f9c0181d38780791658e580c76980ebc074c06e8bc00e41c141dbfdb3ec16242cb02d2876c760ff22365cc2ce3a44837c3be7290133924604e5e8739440824d0130b88804ff860eb0b445206e17a734253e0c2646e9bb563db321526fd2a8b5efa8f6fa46fea45811f73a0ac6ed38a2b98582e81c29271f15ad4375c39d0a35e5854b291e05eebd3b42b941019a228f706e4840a4d823ab7b128c29fcc8ea9e04638a40b2bac3f13185906eb27cbfe3ba5db48b3a19e31f23083b0382d375d4236dbe928723d3bb2eebe683f781a5f4981be1c7331af049642776cc16f914dbe53b0e21ef17a786458b8b0eb52ea64251769871076805482894b2edde5fb360d4970e33573a8defa8a12867b3edc533410477a7fc77cc6e1acf4ee8654fd35f623a97894c45cc83dbef100bd2e5c2d9fd61eee1571a07bd0bdd6986048857d1bc68d748edf7dea6016b4b250a242769c63f15d5e4b55461da2eac154c75455c47b78c94ec314616465e450c45b780a5ba2a08340ca705bfe05101d85f909662445705d240415a04f51c2adc9c045c6cf32235fd969961cc986821fae213e0d2aae256922ea2fc4096f4a08af000b98a93a31adeeb228d1708e37347249c0d6fa508109a6991551c038c28f8cb734dc55647bed0c35da547d4ac8b4b4fec43bb0fb9047a66beb07a688d32937b03d4d5bfa4b9ddc109d80c3b99d39e51a4e807c5a5d41ed16818294987d3e0294a185b355410b033517243f876a7372be0d8290fa5144ef4c67631d88c0ed8afd477b281e11bdd4166e15014b0fa3d2123ca34390f8340ebeacf1d22477478571a4c849bf64e976ea70f59f2305613e63244fe48ec908fccfde9ea90648be372990c3610d507bf882006a2f2cc37ee0077d00fa48e98a3d49750cd988934240a488b3d0de252568496ead9c9a39af133071213883694529cfdd928066fdf80fbd52b44913fa54a309db78bc8ee59904fe2919b2c037e36996f6dd784a65f814fabbc6c14c434495b22c72459a86371f7e46e4835aaacf64641812675e08a97cca53a08ceae127e897e5bdfef4ab5e63dab6f1eb93392fbc5dcd3abb352fdc71680e73b14253f6e8bebaaaf26b1398768702ac1271792e03a7b4322ee81cbc8323b34a8a4b5e29ebbcdd8e32a42d1c9fe5c1bab6293b570aec7d50e755bc175c517095724c91756cd278e9985674214d7d8c7f6e3d5441101b28731158719519ba11ee05da160a9bb2ef7d5ed6304449d779bab6fdec650d4e3c16bc96ec8da9d4f84bdd01e242e3a3e587b7887945e6a80aa43ab5da82bc48eab6a10f4c42b25ed3d18ebee008ed3fbc7494f2860a44fa7ddbe8bf715508086a0b14ecccdef51a32620a3edb152ea26b456ceca9ce85c325c955ed90179c8b1a5997736caf6c54ed65387dd8b4b835670f876221cf12dd2a3bc2afb8acb3d742516916c0f6979265ac5eca408c430eb87bf37c64704791843623fb4776f61d6ca5ce9f10b33b3968325f3bc7766fb57236b0108858c7ac1d51e59d5b27181d2820f3364e3ddeed0b9f257fcc9dfc79b1bc144da3cb32c889ac79c599b270615d4e7ec3e84acad48109940a54d24bd09af8716b60a0aa233b26bc731dcd0f681baee9068ddb8bd3224c8e21a6c65b70769946c1059b6917376407a0ad99378d21b8b9aca4ba7fcf30eeff2e4fe3f73a2c9f4c09d5305d6f520d6ef9d343713e8bcb75f563bbdfb846ef725d14a9893ef9f96ef5ce2df7611414800286660fd41a5ee9d22b69b1ea1c08241fc5c797ad8c59d2247a0d36b30c3f37b821f66d65c2a4a737c8dbaad720ee1d268908d4d9f150494c3ef3ade7cc22b094e963efa5059dacc03e5a9bf50e0f07204279e160580f64a52e3b4fbbf8b11133b02155e91cf5a54179d2653c38ab7d9449fe9ff8901835e99350b679fca2625690ae43ae748812d17a88ea531dae0189de501381af45dd907c736f1f6734c67d033413f6a46c9c77559a4b0f819e4ce2ea17b633db35609674821e227881d5b42e7b1c50b39a8823c8ba0e8a2ca037b7e886989e3e9636b7f36fcd47b29fc7ae6ee6480fe62bfede2fbbb7890d55b576dfd6b5fd03f81f3dacfd9320aecb5474bb583c1038053ceedc8e5f7eda93ce6dde985d3e9e4f2fff4e91c32fdf543d376e6d27fb77418f3ee19c4ec11b7806e550c52bcdf7444b41f80b8b6235d38f87c847064433be035892df9a4bd88292d1605504f447e69a8d052fb31a289ec678c2fceec33bacae9c2fbf63c28ae6129bdfef94262c2fa020aa9aa8f3955f1f630541855c108dd0c58d7d2f8408be1af45afbfcb1bf9377a9f637a997e4ddde0a6df38695431799f3d5f7b19559324ca1bcea12d43c62aaf1acaa1054728dd1057909bcec810a30d58e024095c3d57d3f2b3a547b3a725155a0c626d1d15daf8a6e6824b233dd8e02e671b149477fe4acfafd60645fcb4bada94321a623065fc35e03b6875a8a6c2b29c052d4291fc6733d175f12ba4c695205129b110b20965ce70fdb51db8e213f2fe997530cb4b17f501c015e718a37abc96055747b493fc5911bc624b0195e4c84bbbb8a471f8ac5a43c7aaea274273c46a74a492865df1ad44613f60fb5be76e5c046c0c817d6d7f0590c1cce675dc3e9d6b26d3df7e83cc059d2ffbee681845f901e6afc22f6710b187b30d14b7315c5542397067b631de6b86ab9badb4098cd82d39d633707b55234ae8a0332056030e1a2165bb300a0fca4feb484cb835eb0e8414d512c745c20b6894c1674c95942d8afa83cf29cec04c35d318261b4f65adcee0d3629db59586f04e47f15bdb48130d5228ed18a5c52baab5a5148be9383b63e3ffa7e162ca31b6b75d5faa4bb45142b55cdb0755d29455aca3c52562e34e489fce790653a9c1956474f194d1c66024133d53074b57b28da4f2b98884f415a2092e59273b798bdf8cc85994ba0c5c65203b59782a120ec1b134830fc50f22f01f00343a42168652d34a0400bd55139973651154306e9de645bf88907015f2e029938066fc3e0c03bbebbbfb31360d6d3053c912b9ec76d2c2c962fedcd72b10ddbfab8dc743e02f313b06d8a0827e576b12ab069c26d2d14fc528658a9018647f5a538cee29d9b83610bd95f0ee231f3ad5d69106bb14ba3ccefd4e8539c5b9416af8507d6620171090b148870aad370b10cf1abe96068d9ffd52e5a9a4db3545552ea7d9d6a39c898ca88c45291d7950937a6b14cb1c439e83a204dd8891d53642283a858c04e543b427ad7d78293b795795525ef563c428a02a16484927304851e1f20e2bd4c81b1026aa9365d43b427f1dda5b1651f6e0dc5091ca397bf6e38b55dbb062083bfeb7947e21d0936fc636e49db24c9a4da14b730ab70eca23a79193f70349bdf486207cf1e21777edf29100895631331e403185813d618f5bbfb8f3af1795e93fd82214ceec29faeaea8808f45c2e1c30451116ae269402948ff4969fcba990b72755149094d8bc7417c36112d1d05e9ebc46683950e9a40ea7cc0856371fa25ed401237f29d5dfb7551eb4ce2f405ae7d88126dd93b230950aedded361ce88d03134f40e6c9cc3d1b9af9465a1133a8728a2cabece51943646080e056d45ff831b55889668469d97a6b351ddc259153356b58dac2a807237eb1b749ffebb518ade2dfa34886a8fa15f33f496ff6d11fc196aaa76f16d6116b11f087a5fc861a12a925cb060d555e19404f8ae51f299aef343a9f47af156b36f22de22487cdb01aff059d3049430cd15db152ab28885855d2b5463ba1588e37607863f98d4eeac1906ff7ba0e3470d323cbda00bd2565efea0a0cf28acaf9eb7d7c9f46ea865a3871b3976002843171a2018cfea5910c23d604c2f6d96ec488394afc77416d77e3c69b2703884b7fd961ec98317a12128c774570a887c728984f61a30af952288b19c623513704b0815c4ffa18ad68802a8c899e3db134168e549f38293757efa98da21574cc5db5b071bea6008a6516641e6a147a5daf523ecffa1b3f8309ee28cb9b44c6c46658fe5c258cb7203298d011f8b3ae19ba2326624bb5b3dc2d3ae4d3c655058a55a41ad4377810f9ebd6b8057e2042e4bce705d963a47f1f9a605a53441c446dd98062c36a51a0a28f2eed0712ceaa6d92fae4546d6dede148752348071fe27bade361a30fd8143f680baafdf86cdedfafccb22c265514dd10509507f0e15680781502be739ac389462eeb2d5f9ab0254eec7f9c7a12c6a68df63ace5c5ce63f80665f77b39531ce2dc5a257b88c297bb30d7c1f2eab9f7bcd9ca07ff991ff43bc78f4a740dc3698c6fbb1dd5ead82621d5f324236d40f42a5c158965dbbb8a95cbac9adc0db65a229b2820d85c7167cfcaccedfd0db7540bb0f68350a70a142e260780860ba182f8d4a83f54478eba812b238b2c4445eef95a44cc39bf868001bb84b4e7740571f3d7022207fcfa119eecf2a1cda7ab870d5e8b4790373e0660c746e7ebf293e328171c1cbbc8ff6546cc37ae35951cb5186ea2964a7dd197a614afd399b09268cb29569eed260245c75a8990038610e10991808b7a6d78a38ecb2bb07db0dc149e42d224dc2295757d203644424a4ddb18b64320c744e4c3f9b868f15d1e85e75b0e6138838e01271016a05600551a57c67e6f888c63d0aaf2579635cb6d3646748a983a8a278636845c008893e63052819ef086962dad9111098563c6f70b9cab14fb0972b00a15d41e30dce2872182f949c8677111116884e01a34b8777c5902c6048e223fd5db8461d90af25808b2023829baf3af9aaa2874f556671928c0deab228b2768a09c6a811d147957f184f50a430e32d1bdb4bc47b484b804c5839654d674a04ba93953a79d9727052b63607f0200b2e8e27be29944177a8d83926b1f682421507abfe9d3f84476082b04dc10d9e7c8a9a7d7fec75164c1da8c17db461b491838467a2d351bf2bdd4338b27f3eda5fd3b94d06a6adebe3f53629cc47fde0e095dc2fa6b72d5781b18fdfdb27132ba86c6634146447e71b8de46a39def5ac5b9534a67a21281c830d73668f9037b706055df2edcd87aaaf38953299e12dc45cce2714a7fd785430caa9bd1b688848acf96e90bd0ab2a82913fcb04f32f1dc3e83e60bf125d60bb510926880e8aaa511f84e83f6106a382c790e3a15105fcd841e833a88e95f851fb07b96c63d6da48ae447973fca83b1443f351f1d5a1c98cd264a9f3b020975e82cff6605fbd7dee689be8d03f2678f105aa14892937dce01ea4aea19247cfd76f25d1b1fa319182204395e026eab550127f37e9b8a185fb30b2460162f161c0347b71e660f50ab40b5b99d4901a6824c47edd358a22a928f79cf854a7ef8bd83db9cfd72402f8d48f1992f48eb7a0fadffff5e300334f3da7882c5031085d6825995a7ab25e8a457ff56a4cb45bebdb20c73e920ac98b990f8a2efa339bb7f7670e64dd7a3a6250683aba7e5e0976339eeac2eb5a6b2f8c24d39adb608050cd8e7b3409a1700d933c01bf8c62bc19629099f3d2af9f89880f653a0be6d2c35b9c7531fc00bdb6e96e28eae7e2953a98455c26639f0fb6dfba52fa200eee9cc385785b658530aadc23a9a13f974c466f564b0f7c6e124758eb9dc05a176fc1c6bfdc33b320038874f8519e15a7e2ef28404fc119d103c165f468070e94102180d85559cd43a502e63fece4cce11a372810a8ff1cea07701ac044e7afc9433c005f100156139f7b87c8dccb439908ab01a6f3c893e224856b2e7399e0dbb2261522d303d1cc5b87e69d1124a0178bd8c5d168b7f5c2e6d754b99714aa34e28f95d429a1df2925812376e2ea3555adda974bbcc7088518a41cb1dd2b716c8c56ff8aa31af038c5135557bbab9a09d44506250ac5cd413e454a726ff7e6f794921558427bf978e7c1ddd2c7da4cf5dd96b0849aa9d924883d97dd542aaaf2fa970a9b6eb4f87a81a9e22f871e0de9214eb140ead78a2849fe3c9625a01f18f3e6dee1bd0a05d4b12f8494fa3930901ed7302e8c8967c528cb01c3f64c749d1cda990b2814c84e8bd2ccb51543017c17f4db0c747d02dea31a0bc433908a6e74114b29e4af25c2547be5760777ce3537df73612496e971bf70d73cfa767b327f9522eae7ae2ce7d072d2970c57c180f174bc30324c8f55dfc067072c09d106d7d4e425edfabe3084773226f9b1863bc67edff58293f133f7ec344b5cd3a81a1656aefd0bfa3919de34e2d1a78c592461c4876be2846d5f5765b143823b9c46028f334602d8f83c27a3e66649e5efe22d904c3d113acea92f4461cc4a4ce49b1c29c38a283420401f4eb8bd9b81a575a63c0224e4596086888715b31659a628f0ba199c5ece988824dbfee0727e0f2e8c0683bd637866feb545c610930af1b8e44894ec7ee966fc5de2947c72b693f647014b7ae28a343efac47a992a3c80472d4cbe5fd68dc0c46adb83255436a5f40fa6d11f5d04106261255f3f93a2460686f70b779ac61c00dc7dbd3ea3da69589b7be19886bf42776a08d244acbbd15f83a0b9f263a3f513c2dbf7dfc9231b575f9d1a7eada314453bee684fa082ec02ffe61b8f400333accb7d7dd0379fadcd0ab8c0a911b927c6a0fa8b789ddff607e54c3c26e6fe047248e975b08ee3e6aa21baf3da32ae1ab6d7b18128c84d33815b0eb150c666cbd308fe3ff18f43778cc528d0c4d4a5cb868912c60d353ba9ac513440c00d31e7c6df3856b67be1d2143e1ffac1e5d41bcef6f937327b4eda559e5fc722672cba0c1c7868130725fd1e379db1f4c6fe9473e4287cea551d2b119ae8cbec5111be3b27375c7f18f55b8ce7c5a4b37af360baf4ab4557446fdede79699c71e736bbce7fcee4905044a244778b5c1e6a669745cf072223a828e00fd09403f5ded0ebfbd603ee9b1ce22057eee0b7cabc0e0366892486b9db6fb2fc3dec471e72a57f5c71aac44a49079d8c981c02299a829af1688e53784ee830d6003481f6c5608baf498d5d1cc9a51a2aacc2986cc0011e10824d34115544ec61bf8cb42a595fce1bd906304e74b86da2acb9430f06237a37363e15133813a04e830e42876e6dac6c60b82a919cba7a35b3f4ecb1244154535a79501e3d3f65bcc4a6ac9b61d1d894f35753230dfd88b832c837452f4e9a01ff45fec4b2c5e478a9001f61da7b9b1a92ce29bd4d5f825bd1028066d2f4575aa5f80613fdeb839c02745ff501740f8b6f531d87bb0802f0aa57e7ed504b0887eab629a95d3955b917e0eaf07e22ffb583da1dfacbb040b4e6aacba4a8900d2368c9ce267e0344ea950a0f2d95780f01a96976d2bd7d4f7a74b39643b92a8b3807db6ad8eccf207d3cb1f3ffe02f956774ba98e9176c0f43b96ebfe16bd0ba14819d50e7274477920520a5538d4ceac0833f0a7cbb20e883967994b0caa1cdad349b73e104dadd322b217f86cbe5dcbed63882463345e4ce36c2d05467c4df350fef86382750db14cc4d62f2ff54ab8d16e3a177a3ccbdd3fe3b53c2dcc6dfbb4d8ac78b518abd9ee56afdee8504abca230357e6c9a56ee3caf566415f846719faebb0cf6b6517f0a53c7bce62bc89cea8cee332e6225740a2bfcd89610724c2d87c0f84f1db76ab2154cc3b892e38d0c40396d2cd0bcc5b62d69941d1beafd53a389bae49b1d5603cdcc0b8a2570c3e7f29c4ea459f1fa6db4c6d37cff65225138f47c4198a5a9211e0b92f2893d81f9b356d0b4297a5e0f25038c31e9c6deaca6865e51eddcd3be7065f14dd37ac4e3f65051b610a5259df2c62096980bdfddb721e5b02d19fc4c8b3249d57163982c8553c805cf712c36a5126e609f7a2e2d62d4d9dcc1eb5bbce2b51b6ca143c98711a26874a45d697e4335f9ef5d43b0a8c75aa9c738b176f8f421bca515ac3497a1023eed645ad6465bcfc9af050a69f8deb7a6c026fbe864ead93484eeb5c58ad930b0d36dd0c324c96ac07f5b40e7d1ca7728c197e50e375fb4fc0a3b1d4b8144978f3076dc43d151cb2eece46cd8366a6679e0798c9b80f4ae0ded9c1911d06db6dfe7aa84cf526549d27cb6983d174e394b83c3a728a30ed074c8b2199c559a4741936980b977c7f55f25052bf971b4081cb61baca129ed721777158c51b7e2eb7e04dc11263557cfc42e4cd936d0e71cbe2066ccd834f8134d5389524b1021d97cc1b39a8ac1404464570ad72cadc6e4bdd76f8e35497558be2ce9d842dab364bd3c713ed5905e68173af36d33456664cd53a26d9c76e7559e1864dac7791ceada78a0fa6e0068ff74787d199117d90290a7bcc18ab49797b2038c080b66b2f049c2cbddd2f9ac5ee5b6f88ec9db61e6367755746d508fe1767491b243294bf2e2a09b9631a9962df5731e8005f64cffad10795b253fd885243aa06fee610d269c3730297fc9fcbab4e0b5757ad208df28620b5c7961448c137c545469d547427232b678eaad519c18459a8c8a852b3eef82e15e8bba904ddcf196465cd17a4a2b3cc5a17473485c1c57b5fadfc4dfd4b347f85ad8a6bdc8765898f8ea594344e8820bd11aa204786b1286ba5e48ce0a6ce1a84ec6f1f3886edec8691f468ab3d13424778ba76684b7ed2670a7003c15e9f8e6e09c70f28c4400f344cfd65890848ec5ed75ead552ba86efbd233618be6d06f556dbd16adb2ee2030024c730ac33feb11c6de03c945cacf8e83851621b8b3639c57f7e6b23411304869ff55d9d27c42c2661f85992139d6f03049b25ecdd289cbe622bdef1797ad0a0fa95592c7389c11745d5e5af68dc489aa8d85d2ca70010b4604a7d010f1450a583b1cdad048011b6468224ae54581e9b7c15cce09645693d2040ccc6dce489172688c79860534eee5a80568b411a1b9a624d722c1a482b2dda04e51a1a45d0c3b12b86247c62d8e363eadbdd8a8e2e53e62dba628dff92502d60f111699ab1d5c948f0d109cbc0b085952f7be9df0b04e0534d78cb682c9428c0c88ad6686dba5ba41db33a77bea14f0201f5a015729d4a79c747097a2fadf97f741d2e345d65e83645919f8c995f9b85f0615b572a61a80f9e88d0d3da104d097f692ce66e79eec531202b84fb11f8bf467737a04db637d2dc6c9874436af5bc0a0e776cff48306692a77ba6ba15f45006a4b35e90d703f1d83d2c0e5da80d6120c04b60d4168d7a8eb97daef83a1ce51ace4fb2635445111e38e189cc844b6c0499b6bd5195a9c485f4f8f674038d06086d058a5875b93ab80c852c40c97d2668d6b5c7884aca211e57a9c1d6781499e2a02915c959da4357046031cf1d4d667667b29de9461a506d2e38937211442c5a789d4317ebda97f569e4d3c38ab9d5c444464e7c5403751f15470e0507c78163b3cdeaf4a125b2cde117258c0bf7351a25fb106ac7cd3adb8d6fa5cef6d5e83bbabab54aec1ea42c7df4f6756c7559b389528a24bfc92be09397f1f2c3b3b2222a8406f58262979d92566010f1a0c4e53c5872688512a80d43b46e3ca1089cbcf9fb61b609886784e3b10c834e4cacb636e61896e763a7e2f256289c588100422715fe844ac07b354c01d9b3ef89eb2e67a3473b28bc7940c06f37cf37e0c56832a80714fe8a3fecf6d19fafbc31818ddabab4b2ff940dd7f117a6b54fadfe78c0bb4da1fb799a497401620467c189142f9d4121c44d7e647a47c032d2fc9a03d4ed6a6c0f3555dba5b7897460cbbfb3c08c119738b069530ac4c1d8488eb567402cf2b0c290306a0f8433b7603dd1a8a4a4ff3edd86313ce02e80885595f699bb5469f668dd73dbcd4797c522f6b46cf901622e5bec33a2345a4c72dca52c34a1a784725cc89afd13080cc7bcbf33ed4b543234c8acb4835971c2d3df9da4bdf4aabb1b2bb6c5f09d1c8368d01a13de2a5e079a7bde6fa20b8d0e38fd5d7d9c60e3200c3f6942725bc3b05278057be44fcc6dbd6b0b8fb4ba0e37fa116fa6de2ac795f4164c8df4e2de005187fd1f41e89441e8f5116e437f809d02e9933527b4a5c7eb825b18952723405421b978abda003f6a18fcc95b5b85789ff1a7a3fe672fe3838b6017d0d53d2f43862a84aba4498a9e6767aa6b0330acd843fe0b7aff2f80e794e0c4e4c6dcbe3cb966eadb4386d59ec41a9f3673b0215c45c68b92c8fb045b589bdab79692698a1b846dfc4865f9e05ab7a1281866fab77fb69bfd918d05baa707648eab1b0c84a257b7c92853910f33b8b182c32800791808be6a8a7883140b95e93afcef40138df1b75b724812589c0096709026ddb4ffdc2fba8a9b223e690617ff777933abf7c59dae3f9065ed053b22aef3fd07384d78dc6d55075f8d3b42fd5589a82104a85a6250816ab87dfaad46ec003c2ac90f50713cfbd7e9e8cba09084a058d25be857195a21e9da093b562b3224a87d66aaac441574461d7d54ab03e549b922f554b03276cc9e9e436c2abc816db10417e0701903cddf4c1201126446bba6eefccba1e16ea65621da04d883fd8eba84907977901d51c17097fc40d1f3449bbde16733578261fb5b30d37ea72812c55c7c2464d1abc70cacc73e930e374d3238d57bd948a5d40f514864bbc2bc3c040a13cf6413a37600a1488e3be7ab77239d251799f115b499ff4a508ab87213e42db1cc19f1a814b0bf05ff82bf07f60571951a7461aa1fa96799d81e191082e145117320f884f9502a22162aec3905234218b2a6439611d89528d3837f38c6c6e6d90a0bdd12a1359c997f0d62a278240a12e626e0631884464a88d18612750b762ab19f98f327d9cb2e3dc7adabb1f70483ec8e8f5ff1667464020f2aa78cc8edd9808aeb1cc730dd5e263aa097de3463d5330261a2a5ccb59f10eb5b11468c4af56668c2723fd3dfff07b104154059d23487c53607608e055c1a9f74c12a2b31992f50c1b458ecaff84ff923f5aaead9732f296d8be34584cb5aeac6febdcb507cf3d6e6383994e04f09368ad5ff4b1b4ac75c7101dd9613a593058f2c82714ae5b042a9015fcd0889dd0e0381a5c2a1abacdf62576a4f6ecd7c25b998b15d272356c1ae8493377a61f8c6210ffeadedc98ce1618eade2c5392ab19e60b2932e68ea7d350e4fe2a59191c8a3a8d9c40d8286e5f350208f6c157e156ecb5fda193a15625521e048494f6bd41262d85a998ae9811894b23c272eef26f03c72cd0458938c098f02e45631de45514777273e6d27fc71685975ee1d76b7c68bbc9c817ab4ee02309907403901c9ab16df03f2c44f530549614271352959ecf5c78e24bde242ae479fa548820e6f6f44488dcaa21c3827ffff88f8e1a16ab042d4c56ba74cc373127f2259e458706db70548f81c13e0078aec3eeb45b02ec123fb0996c1092d748f2f37c61268a5a510fe19b5557865c1586e04f823d922e4521914226b3dc0717b3c18f623c2e9f6d8f6a023936cf0d54472ee4a0543e098f08591b8d969db4f52e2383af4254a6ec5264ca07132e71ce9746cab8933625cbd8b792a81292c25765bf043086208c1d4464d12ebce431589411d7f6a79c49acf7eda43c231ebcfcc965f5ad5e2caec257aaeb87b1266b109084a326500dd549d196ac406e841df09c4bc56f2e430d562942de57d8614c58662cdd19091b201d282c0688d386e559a8cdefa7684af0138a685c96b26e595b24d53008959978d1632691b46e85a561164ff36be840a8d95feda2efdbf0ea16b0c26072ce9c00154b0ecef3beaf4e5707463accd5ac36cefaae6c97fc2e99ff4e299c260c528a83c056106752cda62f1122680a261ab7add1ce3de36dbb50f6c6ead69d01180c36a787fe390c17cb911d34ff10f0999449e2f52abf917584d382622e4fe5c4ceed53a3159d9ce830f0770c7304978cb65f68814b846484f18ad6498368404794975246446b0e4d1568711157db420f04690159b77ed2a63926c40d2ab00f69437eec557d29a10605e19a130b837a6b22e8418aa3be536d3fc74c24b1078df18bf322ded64c415e0e8a2d1080466e6752630f41b0d815d49fe181d6908c2c80228ba0737e3432ace0e169148b3508973b2bb0b3708cbd9e4d022762a34c9b5c4abea7b3f3110a7b069b14f656b9b717afbe7b183941233901cb706a46f2c44aeff418c9c3b3f2063f5e66ec2e3ddc12d5538c73118fed0de3875b2247a3cbe620f802806f2e8c8f972332d80f736a8facf8b647a0e9a444726c4e98d6453fdde0118fc55f81ba5400710e47aeb24b185d4d8c5da13c3b3b82f8cbd2090e1730ae88e1cc78dd65e45bd2e561be61007ba21dec17b8e73bd9b6e535439b91d7d1ac661ee31d3bb1de318d70bcda630fd485c90d3dc42a30b28d235ac5d60bbecb68fca75affe6a7e166eef0aea5b23a029de2765271318f36db3b01633a081fa494691ce5a9b7719d37e0f507630eadfe95ec49014a5ae856f81258beb04d57ae60506f0b8af4a1ee4641af27360d7abfead70d695e44b2c62057d73d4055b0f43eb081ff24581ee684097d230df4247543183cddc01122408a0db5cd0013d3028d80d39a049b8cc5eb0ba9adcfc2a415cf1034d14deb02fef1be007738fab72cca8b114aa8cd5a666b5db306dc2293e441719a99f2d6e6d2fff168c2e110a2ec06cbb58243ec0cf0c059159629fcc2615cf61db6b532fd369bbae1bf5d71a18fc1cd949d46cced7c309d1742e2843c506b9d62a479e29dc6f38a63e5821c08613e473153b8829356f61351d48db9565279562cd4e0741ef09c6abbda08a6436fbd40d27bdc904f8708e86dda088c9fa6d7d9331e500123e32607f1c3e917b73cf24ca571244679662c44efa45f63a369e88a607636ea5cfa45242d7f8e0f8eabfb9aa5dd2d65cd1b793230e426acc44e390f63a21568b3cca4e8bf29a913419ed438b1fec95af71295187fdeaab7bd028c6b28cb618a1fd2ecf555f4ad8215bdacc7e8a767ef6ca577f0c6430985c345579931e3776644742d0866f3224af7c088e0d21cd391d48c8d61c64aa4c1062ba6e271602a6c6c0c80975a6277db84e62cd06f190cbbc8193541dd1029656b948cdc8a96cd7caa1cef068cd80b8d2a2f6e655f88522ce74213a77be10155bea4c25e89672543f3a015bfbe9bc25e9d7b08c4b393fa514c5514f6cf04d2af29ecc549945129845844d517ec11d15c606769d8e66897648cc1058f68038aa3dc334a901ffca029bc8eeec574288e8a3fb8f534dd0907089f70a341a1926de55e4d99b09e893b302a1bc44d847f7adccbc9368e30ec3516f98b15b962869a079864497973c48b14f7b1ae435406ebd0d49f956449f8db3aba1d35101db1763126f5ed5a97b580b9870d00a4e0283a0d23afc07687fb2914d29ca6fe56ed4ce266674fdbf7883442bb632a93eb08dfb44075d6b774d803af6aac448f25f0176a49067e52288eb194964daec87128780ff0793f3bf9c7a943871000ead6c7bfeac7a809ba9dcb87a7fb1c0fa9c015bae4098ecd10b727bda39dfdaf8b94914c56068aae0787c3bb48ccfba851c3319801aa631c32b6f5526a878866143689dd82cf5178a608824690bda1210db6b1ee762e83ab59edbc542e56a82bb2cce272e6a5e8edd4a7c867eae7e9b31abfc3150acd77f3d94d453d1e8f3e44835a0fa90e033303ae4520805cb72754122fe068c704cc6859f17803881f2810b3141dbd7d7993228f91a41a767fb67de2efe557e3e0f4e96ee23a866cf8a0d432381aed8e72096822ebc5242a1be28a40c82e42e52e46b7c3f617f0cc78b96182c5f0fb0d29ae24e7c5aba05c51973c527104ae01c1190bb1a5194e9b31be62962338ca800566f1e3abf841fd57e6e26658c400b28604a2419f7b65d19429a6a194349611de245ea78f435028f87c2aa05697033076e49263f34d12013da24ca4cf8b6c145e4368141fd1198e92ee542c8fb8dc8dd315fb9b866b88eebe7fff9dc463b43ac5456b2ff8da2110e91aaa03cde689b5bd7d9572d6095b2ba2525d572d79387586697dd8b67242a7984fa906a3ba7d3568e34267bd9949b36ec18d3c77d03eb68040eb6b03dac70749c16903402bb27897b445a62e1795c5b733a495ba81eb45ac5a5304c0c4dff93b913956812b86a84e6e3d1580afe74e595581ba9b44e9ce822171e22a2a1bc40a2e4314fbfa3174da49844ae6f7570f534e09305dcb386287e91c80001cd16951c2fedb65a291d5fb107f34410f3f19ef9d196e20990769282308f32318fe2bdf92e26ad7516c27ca3c608d19aea353709c9ed2da9b2971cad5dafb7981213522abbb58cff9a769d10bd28d237c5499e381597e9cd332a119fb59fb6fd2245fecdf287d3d1500891bc88801aeb9ab207b7f48229763d9da7ebe10d4e287fbec812fd3313c07cf2c6c1c75ed7254b637fdb44f6e9ccf7bb9bbf5d2cd16e79fdde1e89473047d7c5ad9cea780f73f837869a677d1c2da1830be36e8180659846e022b1684f6dd44854fd0367a132f49d063924a2b4e190b1c9db476ba6d49938fb7494cde990bfc4598ffffbba572791a0ebb96124e558461bab2889c7b54d165fdd178d647209a2400e51b3f258e9fd038b91bb691dbe3285aa6d0381221416543dc187aeafe8da220b2a03bdf6e68ce417486e623d7d7ca7fa2f1241166bbae28e6a3dd5ff6a6ad5e78ebc822c4b37c5bc58d1d1aa07c0b60a7fa8f45ccaceb6b5876a9ca99e1fb31bbdebf17e112562f707c2ee2742deb769e53500fc3594803c091e51d9606d165f5925514fe53080ea306d4a1e062d18cd1545d1b6c2665a78eb8eaf93cab61a493bab12a7cd1f14c4f6ca4f580edafe2770e101cb87ce952a76d05b1ea3574b7969a1821355d5e7caeb8cc9cac6c7a882fa7fbb164f58b2e4809be8a065d1e4bf0231cd095b716b59d3dfac5dace736dfb667d45ce0b57930550e2642ae05338256e42c69d8fcc4e893b84a7d9e3ea5956079b81a88e53a7f2a2cc8e9852c36d979a1e23541b7363b277f4aaab9b464703bd6ef0c7e7a481a95857392e18b9160a647608ebc4eb12ad57d6a662c462f77d2490b1aeb309b0804bb7228618a48466ab25eb71720154b244c6ba10b0ec60d66552107ee9ae531c9fafe9c2dd017d26e1649e24623c85869e9a43bd0097153ec0127e523cc1b3dd19fc9aca405a38da37ddd47d530c7c7f7b9044f4ff657b8137f6f06aaf38e37342e51384bc418ce1bd39c01453c2468811f2ef320dcb7a928ce8f29ae8fc326122dbef6bd317605783b72be557c6b2dc5017c56db898c9eb958456ff4c79a700a02b09770f03cc195de186b2da4c778113bbfb0c103a110b13fd2ff95eeaf8761d7755a7f31f92f559b5ae6a25a18902c1e5ccc3aae584eebae91eb9cbd7df220cd2fc3bc2c35b2b091a3969cf82fac28af9adc6c4227c952001a00b4496a0b25f90c854e7a65cd0705c000b0c04c42a963a508469d10ed4ccea39f9601b14bdb21c3ee3a880f16f875ec5e412501fb700c26fac82ccb6dafdf300ec654b2d490154840bd49aae2bbf8042f8a92e77290d3a1f9c796e4fc6ccff1860e0d4f9656c7971f2ce656ec7b847fd7dde3b7fb56f56617310aa7704d424c1bb52a4bfcf5cf7513d85c0adea14026fec10421957e56a591c89ea2eeb5bf2ca78579dd220b9fcf4f1a1f4a0be6ca857118926328cf1e00bc0a7a20482e4a7f561dc35f36578bac4c5429c00f39f1939b33ae3404ea0fb5748234ef26cfe886e79dc64b2ce720291971557df67f04324213185e20285bf84562920a1cd7f12dd33711a91c3c3b2af47b1e4931b51dcdb82235c24040f8cc559aa2db8dfd7488bb7577a29b065c264c4434645aa5e2b1e92556b55d37848e1612d4c02c7f364af288da4cecdbafa1d9cb510bf7e2e8f767ab339d225fe60ba122a36851154ac2d85f5bc443659d2bef6111d378ff34b26733b240fc8f3bc730b6ef485fd40ee7e4fe64c80f042ecb23f2a02396f21df0ef76b780919967051dd509bba28c314f90412c4167679f2a0b0becad46bd3ce03369912513b661695fc3447bdbec44984e177a185c04022ebfe8307803f72017e0c6c9dba9daf153aa4b2a067f2f7f9d729e3ad5cd9902c210ceb435d4c778ea563048ab11b26da13b475c40cb8f5dc11be7c6fd1a3f1e70089beaa3a7ad8d1fc3e8378da577aa2a28f3ba37b4652d7f9688f9c004ed0a06654a1366e951f6416c70e5f6430ec7ba47a18e0dd712eca7f1dba3b1e1082d4bb0619e1938c882215161be77a7b96613f78108482ac8995713183d7fcd3602f9da2b43c8e49b48f0c328a527c2a7b21c3cd6f2c2c7e330890de29e821e4112032921f08ade80655c16a259a16be5cbfdfd0dc10873db28e7806226b6a5311171e0c698a334a8e9d38eaa81320aa6ccf24c751852a8b9e6bd4471182bb4714f786ae5e5284ca2858b7f166a2949c4e2316e511737f82f4876daeb3240b6e835c27f64e01b9b4d444e378a1c48f33040f1142a1899eeabb0d6f4fe8f1013d27de7cd07ba2de1fb839b1f7033d4ebcfd40ef897a3eb87162ef07f4ea80ef37b87562cf07f49e78f383de13f57ce0f6c4de1fe839f1f6033d4ed4fbc1ed893d1fd0e3d1dd36d35a456a87e58a5c718b31c35d68cf75eb607a65a7f77c72fadb36e38903d429879282f08f70aaa162851eb1da23cbe39d06914893c82ad0e50c195deae03ece76d1e4eae94e05fa7d29bb97f014773aef78245ca7758a48225e1be81ae13d01e21e59f4b7b308fb2c661ca35eaf18e85680655aabbbcab43f68740b952cf03040d5c1d1378b1689705235f54db84df570a1c7f054ba46fa20c5bd44d5fa38c934fe5688e8abc94e36db2945be12ac44b9f14988f0bebbd37de0265ed745e2ba8319eee39acb9c8ee665940112ff2d91dc5ca77ae690b7aaf397ec9adcbfe699a1d1ee5f68dd2e819b708c7d2e16693ebaf7a932a272aa92cfbc479b12deef491ac8fa04c6c348249205b718abd29f90b3dbe9cd26e407ff5843a42338578a8cdac27611baabd641b3ed5367d3ac32197fee01e89d9a44337bd5b535013dc7989fefb89dcc929d1ce37fbb10091de73ba86162f49cdba584893d123e02b2c62801e914780d98b79baf4c739247848f40d6304a209d025e03f3e6e6ab698ee491f0119035460948a7c06bc0bcdd7c659ad3670afe44de2f72e41cd6bbb09469064f97ff0316302fc3a0f05f2380b7b147a077fdac82dffcd4c96af88fcfde3e696403fc03034d68ecf541a336e01f08e88566bf0f1ab101ff40812614fb7da6b10df80f0c749bc19e7e01f7f11b60bfe58a7f80fdfe04dce783e5c63fc09e7e02eef315e8b02e3142c7ed16a30ce2857d8bd17ba94d5fa95f649c32bf9808976b6bb8340ddd26ab3705a6163594c16ac290bbbf442e8014b960bb9062ee04f038252c9b16aef7d9356e2337972370d5a7770e30a519dd129f8c8de16f4e5ec7b971360bf86da194c69a2e83d0aba664fa74d32763ef9ff92c6d53210707825370e480cb5113eb21d6e7a4fb0b4a1dc75bd1bbec8525c3812a165e7272e54dbf90ab8d0a225aed4fb709a0bdb60c9aaaa8b2e9d2a74d88bd2f736b2ba7745c1e064d0bd00e47b64495d8e7a4bb0b4a21c75ad3bbed0a25c3c13a2da92d7652ecfb9f8e538f8b23586ece7788a405fe31c1ed5e41c869175a2ef62188107007bf5c06e9ee50699ab46926c4eacbe42c95131d178783d2026887910d7aaa0c4aaf9ab234a44d9b887d7fc6b45bdc617b669b420e4b3c72efdb0549d8621362dff8eb38755424c27aeb7c4166d382cb209f936eb5e11e52b2c20d564b523db3a9ab107292f1c86ee7349c6129995879edafe3d0519151ebedf30b896bc17c308c1b4b277f5713722a551a8e651d825f6b19f4612fb1373a292f66b025d21fd14b22b91633e8113588eb765b2e5cf2c809ea6021b2e5f30d4c8f460fe62d032582861019987071e00e448f583075c803b5b0eab01178c1d40fd0bfd1d85d2eb6b0b7103b8c89cfa14b600b41671a859d6a87403ada1b752cf0706504973d1649b3cbb3051bea673f6689b3e0c1209e3627418ac70cbf4a903d383cd16c04691c55138cebc8f89e97b31e419417c6e099434341b786b69cb251e0444a4318619c03cf9797fa9d68ef6afc556383c2e72bb8acb1252d16d4ddd95cbf31a6f800b3e0bdadf26b0b52f2ca020e98a59a2c803b2c6d4c4bb617ec42cf3c002965ae82b9aea3b7fd01aa2e4ee7fe2e0ca20aa4490c167df2a64698ebcf8b0c9031b80ea30f21b6d5815521740b134e2b46dac93583d437db52d068bc01c5943ce0c661585716788f157bf5cd2de57c468c0115779066d32235e13423c14af6339a98cef681b56a5dd1ca8f0c33bb72f563819f321fa0461373b72d69d42d7154e1a0855b54779dfc77037a2774a4dca76a6558014267777a6e0130952daab60610439521aa31cde796ffa3cd35224008e617335af196492fd884a5913bdbeee83d5b71df246c72a38da171d4b021253458582f13fbdf99da9b3ad07a20eca306071b096cb63f8b04dab404ad12b46c874913d12f408372939e5309a62e03647ba1c38d36cf5f8d04ee504003ff33aec9a711d4a0f4e0302018842011cba440f61dc501ad43003370e841c9138277502028b7948633fe17f1477dfd81133ab11c0f6a34e66095dba31388bc7af59a552be9099bfba043bfebdd66e2e3fc02e404ca057f875702b0dbd30f0448f160d4208aa1c25759371b816ba774ddc9f2518249a40372d116cedde6e14ef2e1b515f88419a3499f544980b49a7f3ed74d19309af6e229663e11ddb6d561e273d41052c38571d8cb9a6d7b504c13f99ab9b3c130188d5c3417c069b47f5e1d307fe7b3684f0d50364032d74630d513fa16f71b5fd7e1146f60881fdef2ec0b5eb2e3d73c7f978d5af9ef9f69995b1abcc37ae6e56b96170e167d3628abd7315a73b14b5d55caab1fb925e0b9c33cf4eb02b88a0e56fb88f84baf8e7bee2cfe764343875eabe56ef8a303461b8d1609adc0e2d9f4be9a30be3220b192017a5f1a19d448bda046e11625de3f890e7404b06d37f11461520b04e9e639894914d7a22e726495b9f74cc6dd656a84bd09d327a3996b4c9ae7c7be847a4e0b2f205d809f8d2bcb9b643438d85d2b583f16e332423b0a68116cb8f29cd520e23dcf674998adc94bd0e2c643af80d0e32b66c60647861ad00c819c762ea6da7014d6e15994a7933e05fc4c135488deca6e262f82961b0fd01185af482a2ba11568b010c04dbb8335f11a335f54273699d7884294b75bb79ff050156569a593843e1718a1636e39dacef464f588a7568980cf557c461c869c8c630e2c87be56e0229d1cd22528d3ab1d5fa95cec77dd6639e9ca6293a842dbf834252f7fe449bbc252ad52a95d3ce766abe6e1db0415ed104834c1eeae36320a45b0b819a66770dcb10a041be6699e04df9e3cc42d7ee4e835ac3db4021616491a290c322db319aa3c6d70c1f485b9ba2065ed903045a9f4e993619f3546c9c85bbf86a7d7472173e9ed5afca82aeab0bb69c54d542191b1cff1714b5c80afe18bf0f9e0a3c09cbf39015686478c2b4927ed04f8894ea8267eab6d903cc2167e5cf41aac3d5a41266a5004f441ed10c446af6e5d7c5e060db37819b35413de6612618a9759ea9527af2c6c892a685bcf636cc222a3caf63b964a25262e53f1f95018628ac086700a3434c175181b350aa8ed2849679a24f8630578257e8bd900500b97504617efbb4266605885c0c5603d8dd2aade9eb436a6f4dd51d6a4565f7eb76b932cfa7b11537c0882bd8c781e848be91a613af2116394a74b9b00fea0095445dfcab626dd3e8a90632256f5a29a0a329122bc173b2887bd6fa330dbe82c5148c207152d110b4c5822dc424ca4d2e31b1204ff96907269a64b843f170017e23307d50304e3024a0ad6675930da15a7036900a44ee43238410b58889043b6be4bc3fb78c0823be20f6bcf0ad62eeafb8831d84e5d9468806836b7f76c3006203b0092276e39ca02dd39f0871895485d6eccfb6850f6552cdfb65023bbdb967b4b99524a0139067b066c0644fce6918014f242ee0b39d2cc104d83acd50c7156924ed1f8ab44cee33d9d8aac1869e6a76dccf6fc2e8500be63297d355a7cd27c84e8e3937e993ca22fb27a30d2e0a987fa6f0d634e9d9141081ac69c4c9b3afda22999cf3149831c7b1af411b9878779d6857bc85849faa5077fed792af1243809483fbd10fb421eb9c79c06d93323f1c8101a729d9353f9c348a4f2c79c30263172643e8fabfa8a4df16f31bf40c5a8fc3c42544ed2acbdf74456e7849d9ff40b8f4894c343cfa472d8397e84b9d5a092061be4ef97ab78069be2d766893a0b0b80bf9d74bff017c62a030d45fd106bf62420d5ec8bd8f70373d5be1e9ccbbe2cf2b46a57fc9ab6b558a772c82dd3d639e79cbf33facf1ebb4bab8b72f0393df4982f17e10cd5c350798ccacf1f7622f878342847a197a21c2368908bdbc735ebc22a5a1ca3865c5d9ba141777fd7e6af8b026ec334d175e940bfa07cc8ea0f5e43aebf430f1ee2d36890e30f1915fa906b50a1251297d8184ec2baf0f3f6dcf6710d865db11caec18f3dd728d998d0cfc9ac7d40cc397c836bb8063f735fd8d5098f5e47d5be91271364258a2f84e86582ac441fbd1abe0185aa3d6f5fd821cf49d5be3008ab863eec4e3d81e8b7ba0ed1277acdcbb4772f44c14cf54c24449099164e0d8d10150431b35a419055e685b376122a73f255a3b743bfac134a5e3b34b8f1e541b81ec09122458a1451a44811458a30c2881bc9439a8706e53bcd46ee517c1ced39e6d7c0356ec7ed9147d40d31c2f46cf50efd2c6cd5f4bb383c254bb407d7907fba41fa9d25af59eb92e4094f5637e7a6b71b87995aac23492452a9f4a4d2934a4fca9e64327d347dfc4d853bf95093696b168b557aef1fd387ad4595df3e264e9483e949fd226d221c4c26d3579a1e44673a9a8e35cd89fec47939b827c5393b28180a5bc3c90e033558fad26f2b5cec9712973848d5dddd2f1984d0b0715ea649a9ab74f2bc6e2c2cdb290b346417bbd6e5c4d16e1c28fd9202e4e0bfcbe52d57cba753effc6b1cb439b16b5f5040e149a7e443e97c7a4e2c7e8252da949fe0cd05350e18ab5a39bde9b9d2896b9c525029a814540aa2a5a7255a2a957ebf68fad960e94db3f4994c4ffa4c2697cbe529d2f4fd8360c844386f615cecda18aff2bdc572970cfd895afaf635510ea527b53666712891bef403575637e9495fb83f2ba6d7ebd5da98acca772067329d5053d7e22d158ef372949e55494ffacdd44548626be8b09cf3b86e599d3678e5615d4a98f72804524b5f54ad6c4ce9b9a7bfe2f1a6a88bf4210be9c3520dd945fa50ab5c227dc9db7521919e04a44afaf643a21cb266b9766a4df33091d0af886e48d5ee91c1b94ff76c323892f7c3aca5a7ae72a7b2e4353ec4697e1a84d2836fb415425a5ef4159b852a4f5fbf7840b7bdb531984f20ea41ddccd380b1867aab2b795b7bda497426eb223d6fe184ece2a0d29b7efba5f405a978cd4aa2c32e8f9d6095f48427b6867c4fc96f254d4b4fa36be9c15d0d4a269f0c4150c9d55bfd8222bd8fd82f28d297f285dde3ea9766f1d029f93ca453f25bd687ba88b058ac1c52d5576c28ef701495cbc1f4d1c54e78c7f4f14f610fa7ffc1f50ad2cb6f2bf606e9e5bb10a7e99f5635cb53af8d29bdfcf6e917ca6a56f7aa5166a6c98b2bdcc99395cac7e1aa6675de924d4f7ffad39f3e04eb66f2bcd5a0bf0c41d01eb01e4c3e7e50cee3ca51fa657ea8f9dc4bd4fc4e9f8fe84c3e6ff984ebc3c3bac8cfbc2db468967bcb554c84a69b695610eb26871ee9644b861ca1621d89be0eac8b7caecc6463425f0ddaf783eb8c2c4a40675b1aeeddc72efbcebe37cd6bbb62774d777777777777777777777777777f00e8a6f19494d233d40c964ec6cac9a49252a2a49188db421ae64d4e940377b77c005adcf3e1dff24de3aa6e6a0400317377c7dcb1ccbbd8cd19809f00d8bcd0735cf62d6d444a1980ce63f13c37e2475a35995025493a3054c9a453f227a55dd74cfe0bddd502d6adf3b80aa0e545a21cba8fcf751fbbee450140cd60f11b9c4ec98f1b93b991f5a273bb8f6a6c5783f2515e3b99e1f58ed74f1a94df79cde3758fd7aff6e99f86d240411dc5675c88d3b8d73811cf3dcf6f3ce76b2644508f42e2101a206440a8b20351bc902d3fd3441560513369af5d6e84699a094b661f7a1235cbbeddc8e29065d9472319a71bc3be10c3b058d3d25dabc84d18fefb366c54caf580726d9849c4c6ddd01cb0bc369b8dc96a736f40a8fdbb9b8da9080db721751bb231fbee52c4fc5f555b0e36b51151fbc306d451f56fb33182f2174a9b6ab32efdbcd56c44b6219b4db80da9fd581056d4fe96af75e90fb2e9a2766b3144b5b1315d57fd6088b52e50e866535b675d9bcd663323d4844f3557d0c5e60d6c9eb001509540fd6d6af00059908cd22fdafb17f2f34fed33c658d3ac4033edb3d18fd148201914824b50ff61d6b83135aa7784bce1b4315d3dbac790c8fd93357c43eb1e55674609e43f2428751aec670183fadb2093481d20adfb864aa08dd16abf496763606a47069250a48f040aa5cfe87bd2aeb65c35fae6fcb825d00fc9b15881ca23b68fde11dc47f3abed932c4f7d53eab8a97a734e1e28349440d2a6416923817e4538f018aa9f6a6210ad45302801117e90c40d8e114630b1daef56b558b06c809098a289305ab0bf3842337561e6f6f79736d5ccfda1289486191a34c9d20d36086a706b475fd4bf23503be487d493c13e052a908f7d281d52807df6215961f29339683fe85b086d414518551031f10f14d0f3031f702106133056415ef0852b0b1610e104214598982205090e155e5e984253e212bd789af4dca049cf4c17ae29dd23976998268330fcb32871d040f58f5eb82d7f39e7fcc2f85974ff661894be068cd81d1dfd9d8b9ab625a4516d709807c48f1bca3a76c786771da5fd3dd6b907ac101246cd454e101a686232fa0c3034680d256c820139a93da36e132a8e5071c4173ca70fd54f5150cf075395d99c737eb4412dc36c541682865c8b697ecfd0ac9b3b57bdf000951fc3a2fbfb60aaf2b3279a00759bbc802a57b709153bd82c7647c0c094c0a70b6208c1063d50d23304301811832eb4605344161e7d32ced492aadbc40a1cd4516d51616be65ee6506b3e3bdc8fbe1bdbbfbf8861328bd3b50e31e7fe31a4cd6d14bfed9e442041394a0d61bc90e9cc2246bad811430c30d8810b6210250821301658866b12e32c26a15eb709152ec8c0a05db70915ad4ea3cc3c01b84249174dbce8c20bb040050b9a062da05df31774a68660f4c2365a0218362d4a506021e2adf07afe8a91134954fee59f4df6c915b0d8040cce8bf4655c1023c4051716058c7bbab0826d0917b880d98eab6127810950a08634602815402a2abea8fdb34915722aaa6e132aa850b1ba4da868d2ed845adb4a12e8fe66a1df57e2646a73da6c281d64780bac55e83380e24700d04a060140ab6d69845b0e59f050b1c40891268aac9a8931e000070a4a34618990556f175bdc6089283bc0410b80563dc40e12385f6881c516abfe9094624805eb36e1c94295e248dd2652dc5497ba4d788c50e9c6b00d1d9b2134610746908217abfef941eaee6cc2836477ea7a2a6bbf69d5f4c8fda8185d86eeee26553052bb9de5046dc60a585841a7b7273ad3e897706e132bb06aff77cb04f225b675958ce7c0498dcf4a06888d24404856f1818c5c5358b94a66a920c64a0688b78a1f927e16f8ca3f24fcfb409a6f2091314629638c31c618638c31c618638c31c6d821b94942bac7285dba7b8c1ea3c7e831babbc715349228de8d44088d94929993b02a7fe10fef1aee1a2464ff304bee9fee2cbadba7b3e89ffe01da5d6e777b7b7bd7d7b7777d7d7bd7d7b7777d7dbbdbfb421ff64b820b480881ee87119460d077afbffbddb7170eef8efe9bd69ea679ddb163c7eed9b363f7e46d329723c66fa646a6c1d1ad69214d0b69ee3fe7d653bbfbdd318ffed1c37e7add3d736a9c466ae4fa248410879ea07162517e1cde5cb3ed6e5c9633cca0001bab80ee197a0628b4d0c689b6a5ebb86dd4264ab71029621e06e6f20bc5d762dc6818a52d94d5605bba0e6b13a52e398b5836e57b64d66a00468c5ad8b85d6e4bd7616da2346643315ad860a79a93a99a373d5e97f899d7eb121ff3a2d3e0176972a3f7eeb286b54002d12fb3ebb28e3b20621145c0c06ca4923bde9d218b0f9b62e6ba4ee8b86ab85068a8f19d8606291168dc6165e4615de2afe0d010a672f41188a00020d81b20d7881fdf878dc13e76fe41a9f161564e3076b100354a21704083698318b6d8c77ea91c8631f6bbc3baf0d0010db9fadcfe1ce0a155301dd8c0ded8c135b0c7b08781f91d36302c863fdc2a54cc4467444ddbd78c0d62f237c6b9466611832a5ce0822bb8c0e7671ba9739cf07c98aa3efad0abcec2d5fd49decafc8ce521edbf8fa5cdaf7bbe7ed2a0d722399daa458e34b8d5370bbdc7a35041c3d88316462251257a7e57d22f9e24d3893644fa25f4fcf1a65f7036265de5f72a1442e948f9202b20ab5d8554545e7be754bcb852f1905c605729bf35a7e2f52a7a735dfc559eeb112a9f0c9055cab7f367fe745910da329e78e1d8c82a320c0b25c83936373820f84a829b0802020857c518e3bab014818e6a18310cc3a218b483e1547f375582a0214cbde1818155996053fd1bc4b3413c1bc40344f30e3d1a6c9808c0dc80c0bec4dd79024c94117b199f01c2dd7d6ada0c85329bb84140b4b6e89a9641b3cb551c5783c631269954ee188b4049295f50fed998f88de37b4679c01673bade53f33f64a01b34708d6d7fd645861f502635642139bc0d41395c1f76d260f38e4b0a1a6e4b041df0400f3e61e0386fb97b483269b0b52efcef2ae9721af8864cc2d6e0e761d944e50f1f509b5decda5a34e3ee73ce097a8bbf1e1bd32b9fdb9acfd4bff0a9d755162a506d5d88d09dbd218feed1b7f7e6bad8dce0e41869e19834d8964658a2638c44a675e9d167e2cf347f6351829a9e7b4e7b83a590b1318c8575e9675142c6190a294119635182661f9a72a45815b33685b33110a82dfa86a276d705d58275d329b59fa3b46a029beaef92f491ce9942e890dacb45d86562d98927d4fe1428a81c81f6f9d0200f5b651c1e368679d6e503ab6229982c131b365229cf63d91f1e29ca11fa74405b1aec0f7da606bb99c5aca634a021f3304ffbf08dcc3deef18f799c507e9e9939f67d43d7e51adae36890196490b12d14e24221ce9b59160a65a2904814ca3172a441661ee629cd908a9048da8732d4dd255218c216564024eb0bdf327a6dccb6e6ac5b8cd15b6483e6518fe3ace3178ba061573bc6a401ba882dc6db35690caf2a9cb9b523011c5d0df0321040b480ff7f3dd99c4ce00034d685ebfa10540d4a065b0cfbef9fdef4fb1d0b7c75fa90640fc45b993e24a1afce9b16bbfdcc606dcc2e995dec06466d2e88da34fa654472f92b7ff886fc4cec9f698b51be644f833c0df68f3cf9a44119c514e4931efee44e11a8d750eed4152ce8fc28dc128ae23f7d9095e94fbfc3f4a74f0609bf4ce94d9f0c921da6577999943f3d7f3b549e3efd64e8ab7c322a6ffa202be9d3a0fbdcb893277f656490ec389d3e14e97725737a148947e52fec61015eada756a2cd572b831a3c79bb32f987cd34d8f2c7e506457edbcf15947fc81ad2661aec2d4a83bdfd8476a5795ba9fcb620ff342151a6a0a1f49951a2a1f3933fd3b5314fec2b8ac905cf0f6faf065fae1a3db1a98ee2a78e78261755541f5cc3ed27ca3672ad8b10547e9bcfd6f383051a4a9f9eb8fdfcd4ee7e7e5035a22936ae5c41f793ac06a5912aa140d530aafead9a4f5bd6657e2d2d740a1493cc4aa263634726411a43f4dcef6fccdd501e1be31bf352fb47e0aa8e53fd3cc3a98d4e20c8aa5f8705287dee995340fad173a597490112faa138c8aa44b71ad0af5c121a2ecf10345c9e9a02243b464ffa7e1ea447f1af08c59f0544cfbd0ea26f9dd381f4f580f154ff9852ca186d18f9eed0200f26d0108651fca17470a26f3d85f57732a0f665be640610e5c8be9d97dd475a68dbb62dc4bd0ebde23e19202b69e3c91b1cc9c323b4c40464e2229c2b9df0b84c351bb34beacb55dab70caaae7972474a39bd2da84bee78aafd93ae142d98482612a736b72862316222ce5e875e653a2e179018dbd2084d2d5313a51b6e60d3e0d66e89d32fabf2da9802d496372f89f44bfc7682b288c5082a6f6c6c6c4c2d7f62c7a8ed4283cba6fa7788907077aa8e56eddfe1c40b5c752d305ffb09b84afb50b3c1fe19504d0b57cd8f7fbe68870c028056da4f309ef0a842cecb3601c349cf145d6057daf79eda78407bf4f07e1ebc5f070f1f36748c36bba3036badb5c922d579977954fdbffa4b9ba6dd4eff6d16e5603182fadbf45a51a3eb8040e3879defba8b7637a66bd7f9b061b116e5c8321f366c3d62be0ebd9abf735d6cbace07405cf8e6ec357b3e46f5c7acfe9b63367495369bb9673fcccadf8e067534d8cf2141e7dbb8b1bb0bd817ecfb55fb22f9eb1c54feb0396f63d1adf3fbc135a4eed4a9bb366768ced08c71ceb96d5362384a6cd8c8c6d82a76576a83eeed0d13d7e8a6ae928140cb07332b20d10848acb45f4268b5af79389a01fd5b8c1147831230f10d07c440605dfac315fe685842d7b936b36c7ae6a2ec375e910ebdd23e88ac99ebc22f3d69236f1ae4aec3625b1ae18cd68c26e6a4b4fbcd06b4d96cfc3fa41d8b15a856431bbed9b8aa570990c14a06080356d80319c04a7ed8c9b0144ac861622503248352b3c23e2440380a4758c90f092a262fd0d046863d40fbf6169457159f1262d9176fc1fef51a7a2d2c994425e841d962e948c9927247b25a055333333313c46a650f4eac51a2b1c478a28a61a486f2895743194a1f19e387c2a16b7c1bba461e16c862b15e55d8ba352d92288611605fb277859f8497316eb6ad6fb62fa177156e0b897a34ead148447a1d7a45f2e44dc893384a5a4c443dbfb0261510fcefbaed11c2826e4e4a71abe1bee6d4b42d8236ad9f4e9995020b7a84ac80605278b11251418c556b47c5866d38d53fe94e8a17348c3bac23f27887d99503f6a19db8d3e00578353dc55f466b88c355bbca5691c753fda1191a4616f7c0ef221b780c140e59f6853c431ec63aac7ec1ba3404ddbe909fd4f68dc9c1aab22436d5af45c83a7107a886acc33a3b590a100da394221deb29ed0b7f60529403b77c569db8135ff127ee441e5e2d1bb13bd822fb923db310aa28c7a6070e1e33d38008bac151d2621277e28e6946c58a520d680d5896313386f9fc15cd1b243014dc0cc7cdc4186314a540a121cfb010435ee60761a4553df886c806b598f59a114233d3430f0e78e0f58517cff0cccea604a0051c7181cbf35a269a8d81a9589c6152424318897df619c03efb509e81ec518ea361fa457ed9b74fafb5d32f795a2eecfb69c9966c6133d8fa61ba5fc6648f46ff0cd4e3f39b68e0bfd107b40adfff7f57d9b001821efa03b12b1e5f0c31c4132b20d8124c582141e1e0cfcf957fdf5500c5eae9ccc62cb12aaec9a27862ddfbca63042658152fb12488eaa2619d223464256a5889585137486a4205a12d5d836dbae11a66ae61aee1ea514a4c4a4c4a1d99d4d1a1af50181916328eb63d46d99dad5cc1a82f643859117ebd5efce2d76b4e4abb9530a80c83ca67973504c3a0fbc99c95126486728056b18f157b8501aa26ca817d6af4226e3e4c026a2faf386f579b87dac16dcf8d466b85d7635dfa33ef4783af8c5fddcbb7ec8b1f6f1eaf441e6ac7b67d32f20a41380149fc20476ca30f87a7dae33c1e9e6a7e5541436c0cd8183686a50f7fdb122a1f47bf6a888de1e503856ff48b4fc83ffc5a172734d42acbf4cb4c0cc588239dd9e3cdeb95e1907890d33b0dc5f66a3484fe011bfa100034d0c0ac429f00dea6413645a1a1297bec01daf7f39c73722884d33b5813e60f6ac7e9577ee59359f9d3176415cea0aacd006d2352a5dbc69e45d41edbb6edf95bf150292fe383ac4e1e2ab4712dd50edde5ae4df593e6fce9ed58f990b7e3f4dd27d3fde937199d0c0fb583e5653ccbd73528ed653ccb771e6ac78cef7e46f7a1b467d1baef646822952ec564ea52544a1cc7712aded62ea593f12a5c4ad7c91869cfcc5ef62592e78357567ee4aafd84dacfadaca0749c5656564e2b2b2b2b2ba7959595934a7742a4d4a0c0e1a926d550cb092cdaf5dd51c54122f574128d42e58d4d83363864135e339b5914300c04c15716a61d1314ffffdcc6f4ca1594bf7ef738162214554356fdb5ca11a15bf34b8186a156a83502222dd917a9d3608b8905bb3f1c75513b4a1c2624111ba378286aa802865c424482e4c2664072a904fdbab47ff1ff77bcd08200b784b6b410400032cc50a3bb6368dbb62dc4712d2dd80bb86bb7337b8bf8653082b29ca51b6cf053f99b0d62ef5f3f673ea7cfa9bd0ebdd2e6646d54091b6b438206a3698cc655dbd9b00182ffbd1da055ebad6a8ce683ac42cc06a309311cac26ba47ff5d2742596a088e31c353046d391811e62dc787e0ee2e7f5cb501f1f4429f79d86f5be669abd011f3d9db1c7583d7f85ce317f2a8fe385a0679caa7c11f09e461339e3240f54fbe8ca0b28707a37931c7c7685ab56368ddf4cb62497aaa904a33a7b841ed815243ec4857438c85e960f1058bdab2e70af9aabdb14437f04157d3c9c07f7e7e7e7e7e7e5c4a958fd22ffcb37b07a8364feda72a0fa459a08417ac90c80fbb94df11336d02f51abc10eccfe617e8d5e9574c2ba6959597b1b2f232dee4a176746fface2463258be8389af39f3929edbaff2cfb8d0509053b27a8aff67137f3676368ed97c1da9807702a1e6a878ae9553ec82ac543ed48f9d39f3e99d366f2bac633fdcad735a8f9a65ff99387da21e34f2fe36b9b0f357fe56b9d96eb40cdcf02bd3afde96b235fb3b440c3f9538342774da07ef141021ea3d2ef9f3fae3a7dfff44213e528cd93d72b77b96a4e978bdb7519bdb635fca7cbbb8ed29daeda735d9cc6d5c9f4d4fb61d6d0f6a1bb6683eea793697f4236527b97b0918d9921576dba8ab7ab94ec471efbb0616be8555e875ea9bc888da464afe2853e641f9a2ba8b48db6453dea14d108024000058314000028140a0643a2b15834268e13b5ed14800b7a9e4272529c0984598ec3280a4286286318010000420080cc90cc1007008dbd79295c44d20807a70f079b3639a8f7498a0108bdf681dc2da5a404f3eae43d04dcdee48b93bbc20a63a206ffb6c09587d2328d53ae0c40eb39a1cbe36a2594e5daf5e0e07c9c5b6d45f5b1a74463125703a08c267c1b3b633c47c1be0df41873baa9c92f2cdd9b6a6eae5f6a514569a3d12bbd64678979903b6f37af57386d6095875d6be545288a17287e23b9870b96f35a5937b541968baf57293d91df3e434db18c2afc1294224979277f03c1a3d2dfc06e6817913d66e171a8603377690414c1861bd49f87e16219b6b1e487618bd8ed5a0e6adf1e351ca6ac94b02c0eb8fb44582a61ab044c1fba2ccd758227b227419b72f8045b10a5977e11abac66e3ebd481d1cb103e433974d35c47fdae56e0736314c91ed19b59ba7b500df7b271ff5177094f297efda76a1492aa98d1ea4451a5917d455b9afa8a5ac564f9dccf825dc7a47579ace9ad75702e78d26f0c46cce6292772f9f49d476b022e5b568dd7a7a9769b95d236cd3b77daaac29d1d394e8fd29a1e8e3adbf74a9c7f22c7467cba77a0b7344fc74026104728e118cc1e2829ba051ffa9d14efec8108254a0ab1163586fcde861f0f33f0f061aac9e94d0eaa5b7bb7f2acf1b2dcae9c0031531655b623fcf702cdf05790bae690137ab57b4c08a0944759581e156b685623b7f6de971a4ba01e163960773420e786acd1bde6c6d90db9ce55458beed0b310f291fa03dc5a6846582249852cede00ad7584f74fef8b2e53086765610a186ca488c0304a1c67905f9aae292917d831f637e624c04654a9b3efb00db042eb042c0d6db9cb871a2f50ffdc8bd2519b0656ab43ac044ea104b30b638c6b9e9f158727a4af1c0f416294b3b2d8fa8d091a08091b969b3e52e3ec4ef8d904ecdb8dc7e6c7ead0658765c10024faaf4e562e4fc703d2f59468991160f7090bd083b3c6b789028bb6af74edb71e7905b8f206893e5362bf42c593d0304e5436228bad69c2b44672366101c5670d699f13392eee5178ee6f73b4de6baf5cec168abdcd93e020b4625f97ebc800fa871acbddec4c63d0aa286597222ff1a3bf525c2e85062e8451bee5220a2c67edaf54e44ec62270736aa01e11dce09ed57228b7ba9ae3ddcfb2932feda16ffd6a7511e6ae65a9c82b732625f1903d9d0408db6f81ab47ab62fc4a21e9c05a83ce045dec689d0925698b1630addd54a66a2bdd65bbf4be6a9a4da36d03bd73e50b215934eed2fec08d827c6e8b616fa735b5f91dcd6713aea7d26d189f649df61671f6a83980194401577a11bd70f401b6f343f90d70800413fa99b303c415d65e7c3e24d94cfcc13c62c83159361d6990898242d04d4618d7c8e77d6cbb3363f1099a35caeabacf2e3eb8bdd86d9f788dc6d3d7d4532c2dd57664a71d5339f52555a168d77dcb97e798b74299f48087c61304f47652e425019f4e2f7952c95ce92bab5caee1cd4f3c934d222d13dc0e31d83e9682478e069dedcc2b498f87c3678d2c49ed9b3c4cff22ce549a145b9b0f6d6f34cef27c87ec7f0b7f8f41daf8430f6bffd2265a6ec745b898cf25b438900c5134ab8ecca423481ce8169c93e0e59fc7995cec10d62c5e9017dfd2856d46f06c68181510cbe6f0db2865f453f31fddd3c30a6fa0b6cbaed9070fb7502f4b5462f73f9ecb2ee55da0bd61250e3a8fbec3cb22236e9d35f31066fe0a43d84f9f290cfb7ca41d16b84295c27c06ac4d9518852e79c25e152480d0e316f57c45e686cd51bcf738f8208bb47032705408328155036ec3ba4d8c47911d538b9637eb2ba6e975a062b70320a6b32dcd71e6295293442cbd157ae900eac7b385afb25b65f7e2b14d03a1301ba1907085ff4840ea3d05eebb267af15ab51dd4175a5ab672a06769d148ff7c347fe8c452216ae9f3fca37746ac3888a05bdc96c7f9e7648248202b1551f5cee5e8e98597b55391e76c6a9d784b3c271773695cc3b07143cd401e03bcea1a0b167ad39743e40d64b91a34a71e02203ae4d656d7e2ca63a630b17ceae4a18037280980396f880476c70f301dfc6d9902814586dbffbab0668b6b2c463a30ff044df15808346b7c212c7bb716848922b2e118af3b2589a5b9709e9373e7a9051f411ba524869c60f9a7f6a23e58c8ea4f1d81c98077dd0eae34dd773507d0ac42283a137e9197b33ebbc92e95ac7ddd5b398b5cf2295cd2e7c5dfbfc4e05582f248c9fe5604e0a73a62f1425050b8f1d29f1751e8df56ab733e7abc08eb8feb917dd7344b9ca2efa2a5255597a0ab0d873cc4c711f3a7f7ae3950d01342f4b599022c8ba716525eaceae80170896be6500a1471bb2f72a45bf66f043f46174ae7f7a15301c8f160003a9121cf70c4d43086b4c7cdc35088dd7e4f5dce7d7e5d0cf78e7b163c2ea0e56b81b517c0e3cdf4ae4f50234c2bf50bd81df4ac750eac554b900cfde5d20a04eeb85846babe35cf04ebcd1d844163822a1a86ebc3d61d418c81cad2750d3abd3b3f2ffa92b631387dec8209aa55730ec7537fcb20d5aef9c660762842859a69d54c130a7e273da6a24fa98a518061236b2aa8fbb5dedf29c2e695eb32d0c425f3d0daad8df5adfa1aa39debaf2353af7c5a5ffa214649f9070399b653d32bc83cf0c411c3525c61b5658647cbcc8806d4799eb8a0a44d2b8b7aa348a9cbc7654c8765dd39b467ad3d6933b73a91d055fd543e7840153cbc48d12b6c0e6d20f3cfdb92d6b6938cd37e8b93236b58fba21ceb2401e7a14bbe746ef487cedd70eda53fdfc8c4942293fbc6d7c909fc7547a94641871e39457c08633becfe6c68989a8825e1974ed3dbf89d1ff28f12b66c35f1557bf022e53e60443a7f7dc4d19904bee9cb333af51c1baf526d576869c225e8ad99a1d3b2f3a4192e6c921cff42b4349c00fad742c9e034a2dc073df97d00d3b1cae3099e8eaf2b687b9f3bfdf6c25a91b50eabcaad9cf7e035985919e663d738817aa80fef17a5c20440096812628c61891332051d9255957ae7f1897efc24d41ad9ad9a0b1c041e0b83df7f15a0e1081fd540cc47c1e3ab4ae2c5083ddb9a94411936459ab0a8c6d17dc65f0547b0543ee5d0dc1a5cb5e22200edddc58c805922d4a294c4c2358a5f67538e5523bea40df03798ade3f45adf9a4c9b5bd726d4449c02deb14f43b2b76b89e4f8f0bdd60f10bfa56910441c97d6b3fae598e35d378854b973e9a3682ffd6ba20c459f153a205578b94e55d2c71b3e86544d1c4d0fc1fcf5c7224166cfee13b15951c1583194e5adf0b5d36081c5851702e910691ed8ff12575036fe8bd2092dc266a70674f9d4dc1330e845ece2090a893838b5223084c3aa2289c62e5ea060df545680e20a1c6c0c1b5bb2b78400b9b97178161d55f2ee608215c5c736ee2f4a0c0af94613e9c2ee6597a2e8c6447faf6e3074306945c5fffbdbc1d8ee24afb3b6d1aa60fc2c2e2e8ad40b118fff6c0499cdad178f4e4bfca6253f2430f72958c928f271ef6002a2465f1e487af3bdf8e328f3ba27d06a9d0cb358ab70adc45522e7f851bc9a9985ba5d225dc269ea9c1aa159c0a44bc0564389ddedcd8b8b6db61ce721575076851adff494a7ca997e0aa0a9bf2e627110a7b1f2459c957100d853ab9e0365e2f4dc2beef4fa8c114f1e7b4f735527b21ddb227d53468a1d975100b537d3f7fcb681404244ab093438e80e2e93fb08f1651ccb49c1974d3f98e789669cdfa1cbe755b8e880d88fb024b8b57816432903e8b8b89a22b75cbc17196679a580a4cfb44f6caf1c9eb4cd09f635d24b8d44f3a61acc4fb2267b0c097bcd86d42aa04ff64a3b423a820409d95f3f8494205662cf7b145e0503c49c85867ea6342a9ee2b107efa5a239a3d5ce4b6c0048a108365b198c7418bb6dd8fb0b55c313a74420e4afb5bc76127318ccf2f1b5468f89c5633d6c21fe83fe1e5e73e87d33e7d8ffa5c8a8e3d06f2397b7bda5ae3e77c747efa895d2c4b06cae63bec11676a9a147229b3432a56191693152466fa42c8d1c4423b01d29dfa8d79486305df7021d62407d1e4707f49692a8b2cd4a92bcbe118488b10a2843b234466e68b2be6143faca4c77d8df96e816898e77bb19ea4cc8188e4d78ce7bcfce34de80459f51f7e94b102146be3ff42fea363c144f745f620444335a966832965fc55f7ace21c87d2781512766868efbabeb35807a553274a16403be6c158d4d88863d8d56ad34efb7739c4db9c1d1c91d44f0af8577c465c389b0be07d5527bd5b862032a1c4f48b71bbc3110e50cf7a016b4f90e7dc3c41c66176cb9eba4b8ab86fd98dd1861c6c9baa27a44635e8253bd858304581dddd73a971a9ea5b0a1f064bd121d02bf75b193d5eae33f8bb74c60f049308302827aef75220b76f4719e893093e9ee27bbe432258844aa229119d4f0d066ee9ad6fb57a8f3813bfe6da4d2843c98e01e1910281347883a5144530ba00251d35ead4729e2db262a9e2d9e3555c17562877d7fce54f96c1987cfacc62c4a2572b8cd65ddd5d3bfbd4a90bf2e0e63a46477e254c2821713851d3bc04b513f4607678607be5fa71c667ed831464a6856a06b008c71da338878171b04d5d8d14e10628c0b858b72681cf6278684174ce51c9dc7211d5064e6044c6f0a55d33ba35a1ed2b740223d6e9758b2147f048668e5f01c16b7c9804c164d76cd929a52a4d218cb0bd146ba698950626219accc3b387c3907482c527e34f0b904d45ecb1d40e6ae889dbfcae956faec98243b4b833fc54bb8f822172f5ebcd48278f3d77b6b99ea4c6f1833d9739f2c13b91210bb6f6a0342db6e1ba7122165c17c0904c293eb8a2a1d22bf1a637237fb3c4ee9515b67e27d567f5ddb262c0be63f65242328e5c08eb9082a6dd883ed533825751667f9c8b0d9e1201613970dd55da13d54f13a1208e14b23343b2df3120bf134a14ad04478b767415e4922dc300a3091124c8f388c7fb1e832e8382a0086061c59f3c2d133832abe2b0f0f5c0fa38965387d1b6dfc2e0261c8568aeefd8ca8382f47a9d9abfe54f5843bcc4d9e53e1855d988f822985eec8b00623a2697f2bf4355909091987508055751e8e196c6767a9aac65db2081667aac1bd4065943110144081ba38824a413c877f77f524a62b040908cd87a37145793ce0770af996d401a403145a8fa92085230d02fc10ae7b3ceb2321aa8f1439229ae68e59be34aa91d8d59bd18ed98b3f2bd555e8822308f1d1357298641a13153be6d91773b72427c8d0a6e490d1cfccf135f9e9ab8f08f0c6bcd5b15008c2e5ef1288a979d27c674055322c3680d978653aaf6c6ababd9c15ef53974e1ff7fdab3073c48e40dc0302ff95477307b3ef6585c5bd7fdd33650b00bd07ab7da8bb4f0778da7b65b15fbc4eaecb7c157e11b36fbd82c044ea07528a1fbb9010e04234851b9d5d14eae1a26972ceca39a56e285853b07e68a782f2921342156e6f67f995bdac232200468eca0946a6c9a918b3108ce5b8cb3f0fd90cbc32938adf8d96fefa3a0cb74317b668971eb4696d14a4dccceefcd6230057b696f4ce98c21d090cf6a387acbfc27efef1b2c9a770516dd588610c8558e570551a9bf2b27bb6a4927982dc76ac176d51376a5775d41e932a556d7b7188c8515228f4f8fc6974b0ab7f1eaabb641e3f8fe7c1d123b2fb430cc6c61865f28905086923a7c68d2c387594f5288008a23135f487492d58e437681617df65299efc22abe22f05ab4953e3c3bb86eede16d41eab8e6dc6e3f74a53ea6f50310c24010fad30a9411aad412356d2ffc10748980c9f0dcc0c20a516d3e16e67cf62e51e9c9502c09c61a079cb81928532d4bacc48e461828566ceff1f31cd1af2292affc5c08f6f465a09e416b816f15edfd5cbdaab93c7779e61474091e6e61e5b9d7c6193df28e41210e0107cf1c78eabfde6484c90d296f0b3b4189e6e09a329e5721f5a01b04afa8547fb8339e37ac0fd2d3c2bd1f6807257918621f746a143bad7dab0623abe8f460ca11f081f67bb137457703bda0580327da536e050e14eabea9ad5afdfce6b8fdad4b23979f914ed84b3bc56cba6891859e0a130cffd9d5f0526a636f80e3ddd75d32421d9aef53a296c9170840dc0c358d64664af0f67685d17096e5f4d82611b088e0b712c19d24419f9c16232b97582302f33cac3d8878f26ec59b314b11506a8530555cfec65271e5212a5dc78f704147b320076b652af4e7b2d158ddad1ed8eb9353bea4db24252a2c5cecab0ac147a579add83658407f59c5e4afffe4dc318e4078eb3077b040859f23933c4e0ed5c1c3da9160b01b4e694c892abb0e72155d018808b634af7bad596c650404b16afc11328161003c452a2727f1bbd5b12fe0a197c077daa8523cadbbbf3dd7ec9d3825ab27202b86d36a5916787002b9cae6378a07f15e8d8d8cfd1dcff5ad53488692c0fad9deb4b65c12ba7eb260ed018b827ac5dfab213fe9924399c3ee0005777015605277499e121c9ae767213b5d3c6828b85c43046fa16b40790ac84523920c7258300ab226302e931434f4c1b24881bde5866e9db1388b3bcbc01d054ba7608a1e9463151f06f17a000a4803b5e4ee37715efd5c1e1aeb945a065ff3c417eeacb0a9c9d776ced7c698257d72be762e8f6d48fc5ea54a792497c5bacefe0895c7c529e55999c757ed3e0662f429b482569cf3d9312a4af91667a303c9c02ba694c1c2eef05532192c1177641035b996963c6a3ac5c18fb9a829ced83ea96ea6cca9242b8a918c197423904a77e247cabe28ee73090d84698b44c9910b0a4c9001f19570a0e879126c828fc6272a8e579c15c107b1ad21197ec27b9fc78743a5cc00782600c51ea0d55c496d7f26e29d656686fc99c399dc4667bc4a20edbdd6bb3620a1cbfb866381583a017dac296727702a3c19c9cc416940dda6359a65a4b42c831d00a0434e6204d697563a5387181a240cd57a0ee53f62d9681d1ee57e171ac5128a0b15db9da93f948d3ca6261003b893b0f48698a6d1ec6b58f6f0ac8eb0f66784339e679de9b439c4e901db56bf9cba8141bbc5614ce6cd28b8f87310b32a2cf6c5c21ba680dd54c31da8522b1bce11c18f70437840965a59584dd27c8a09c4f72daab15df0fcdaeac1549eb8f85713c50769d3f5fe388923452568034f884e2fb4aa1b103596bf9f5b550088255ea0bc93bc4c0dac2a7107d929f142b867b6af271ac9283983f42bc589869327cc4b8c421a4ec24ed4589c8a373a118dc0111e15f287702955c63e51b8a22c45ec90a56b94cce85d3e86b142e230ae5e127ff90883ca5c9975782be9a382d0027fc4d16829ad048b51d7a6d78b9e8ce2c96b6f462046053203ae442ce8b07c9d99518621cee33ff8fa15e4df3f795daeb86f5dbaea04466756e77e6b73bb3f5ce39937c8524ae39213796679fb7edb091fcb3fa0a116af752a441e10b4264ea446839b4c06fb07bb6fadc1f12756085db8be440f82d5bd9dd7642f38cde49102ba04f7f469501f3bae4fb080ae7a01a124a83c6da67b98f22ac0e4bc64d58b223e0b9aa182d37e0f6e710b96971853e8603694a2196eb54d5eaa1d15a8aa007f10c62154c510723e9745b82a15d01f61de16239c8b31b3832a911ee402c9eed23209cd519c8d424c2e3ed809ac8c25fbce0f4834e2eea85079e6e5473c91d36b49f810da29a39b1d122f97c31e1c528d790a5719547771ae9b463a5058a50853c025eab00b6161bda8b4381a0f7cf370099c7fd52cbe5a10a986af00e0572a911451dec92479c08b86f922c47bb599524184718dd4eeba6444afa8e217b197a7f685cf269b802520d52c8727423e0783f5a0a81c9411593188367ddf785d29f2f57b67b8523c9ad387a097566105a10ec41b4749b32af7fd9dc1d45ea22af472e057fb342493c652ced039c6c031dc65f68872597407c2384b8dcb2588bebf9af625114d4480a0fed2f7e452d0eb7227fa21d3235d4498c68d035512bb9fe8e931056d404a4646bdbaeb15f5e1b96660e810f8a9a91e255310978b5ab15e1527fc90487db3c848bc092ad5a54b64546f257024f080ce4612668318eb462c9356423398bb28d9a3b446424bcc3e77760146153ceb5cb9048118ec948d5b6284848188a7571e748feddeb66db0a01cabe25b6b8dc19769138a5f19c48ea79d9184c636101d473e1b2df2fef15eb86d31c188e784ab56c0b619ab8c85c0254971080d3f06d3bde250074dd4edce54a8433ef787622eb9d22300db82d5a4bb2f72497e3aab4008f900a194983c8f27c52682065ac2c5d7c09bab646e602b2ed9b7fceb19dbb7ba6403f1faca23c410f0597849869006cac1a6b1406c9b1ef603359c39ad98c11e3254a4bd0d5008f456c369687fa997f5273f1ab01e913f3f56957ba8154b176ad7c6ada6e5c2713bb9492a1dd0bade4e6f808fdf80875a4a36b96358f3014a478a41c52053eeba847a233d46c92b582a212d5410e8db42d6696a10005c411033ca511a20614d9095ce176f59772c8f80273cc0a670234dc24e0e67638ff2e8c731b01e154a9d3c2b6140f141a123bd075f3338484da9f513c267a795966ee6d54f8065d246d45329e89045c64a074a0aa08a4912b5f621885546a5280e04434fa3b3462367efb548fa59529cc2446e122e46cca4ec78241644a813bdda734f0e4ea9303277e1d4cadb0181036f78b6103f9fc3fda09d8d18067ae7ab04f32a7dd29e8be69c508595bfaba747cc002f7da4c97e3e4e0413ace40515262fe261e2eef30d02eab4a177d046b364b7ca4313d3071151463d82c880a45fe19fb642b289b24a33306590da71ad88c32242db01723d3a105b443e4edb9d2b916b36b40225d76ab408d6d51b13aae2fd76f160dd890fd651c57fa03940922a6e306db24c9f90a53190fbef55a2d52b3e92d82f666890928e01f7ea6a25bd83ca28eb84de20ee1e42a015696c6b007bbbef731232f497ef2eb656b3081e4a47e7a0f188c161a7921f18b5582ccb03bc065c1b6139b018a7e874537b6f38ef6d568da98ebe078ad4b6cc327704038ae4c7a8f75d6fa5b625b34a90ba88870e80e3d9904181e185be3160e85dbdf70f4efb3367bfc8ac75bfe01286b77888211e60e55cd17a558394089ea519aefa37c112d793184d3ff1b5280c82f7e7927b80a1091d22d5f32e4e08474125f5c03d812bc3b13199c236f99b5d712afb8e67101cab9bdb4f1e79ce0e5fc7a5df1924c8f238224109eb952c2f52d02530c2caed251bbed8e3070fa541ad06f665f79ba36751411b3b1b05aa165dea7e42dcd23678a2b47b7ca8467b689646e1b57e89a10f795a703eba14113f2931b8d4ee0010075b32af2c54d2de927e8312772b5062ad4140a05d80eba645c71e05af70285bb286c29cdd7227de7319c1069899d4ff36a411dbe18730cb7d0c634f15f82852fd22caa730d87c7ecdca88e205bbbb02d96859604855c5666102ff863c2a103fb827fce12dc9d067360875b92f33e6eee9038da8e2bab4575d8a13f8f0d281313c75b4ef9c9d40d7c71637e8918380b15e44338a0c0bc63793352cee4a0024aba4e4f47542bc2fb8c41cb697f4973b8f90106b124b81e4cdb0469d92502c29846c448ade40217f0cbc22443386c4d9a1d4dc9f7ec5a159cf91cbc2ef1a549fa180befe1ca24977556a989fda59e7362134c8dd6ae038eb5f5500e203c10625d739a938812a36327a9d22507d93b398d0b2b42737e4f3857d0c4f9ebabb0e1187267b2a494050486b0f1d2e81e34ed2ced6a0075c9d003ded39077531b1e9b0d64cb6b8090fea708e1f06e6088c11d5a612051301729103eaf1925782977180bb091c7e7a4c408c3b32e5eec1cb2baf8d535253b82325b7ab5a01bb32c98ac49da11c1bff20189cf33b25563ce106324a755208e3a644057b011585543ccbb2574753f33521d6405218e92e1e7bc07af553617fd260c349eefb60e7b5aeb0073e55a28b89d9987a420ab3ea2d8169d029383e4b9b84c4a31138e98f8b9106bed444e91fb1ad25c592e443b49910856a73a1352b2579ca241d104792822c0331242449d422190746d206c6692436963f05d4a9898b8a6cceae30032ae85b19203fd130409e5dd421fb5be7513e6b80be4c617c729221a295c2bd0d69e1081e15f6024fb6f14ca6c7351a8b90e001d6e353619ac733518fe8a582c80009a64c629e1ddc6c59303168dd68a46c2be6590d382b4f5d3370259ad89935ad24a0840e54d9bd1bdb4e79c622043e8b649f7786f8dc7836223a3b23643e9fa06729a52b7fd9fc2754e9b337dc9b378a5d5d2affbbcabb826f3c628d754163109ba42e594796df5e2a82e53e982310640e8b657e51bf7786e222f07bb29492e083171f64c870944c37794dfda330e757ae57b028228edde2b6487478a3f7ef013fb20035f183706554d37014d38294f05c5e8dc1e1ed3ae0db179a7a20018ecc6e8ae75ddb60ad136f962fe1e298bc47aa4b6b54d6a8c23eb83b68df86d5cf39590ea8c5339844ac4952110417feb01cc2b5d9129da611438dbd44634d09f253955f406380107754dce97bf25b89a44a275ee9760dcd26c20cfeb1e92d9d229662270fda6dac324f3208e22c306f4ad67dea0a900b27eb31381b8c560f037e0a81647a83bff06270c639adce20694ea82ac7d45509814e984fb839ee81fe7ddb56c46802b236d67e385f943b645c8c59b8f60bff2f0550722822bd23eb64eddcfc9c4b2e5c2a00a09865bb6f1d52e92c2f0308c2d85a7916ae116a4d391267b60aed475c8c9b08dd8ce2acc795089d16f9230892708d5bdd57ca82fc0988b4e96835a5a4cf9c139d52f3c14fbbd27e95a61b8cc6096346c4c70f47659ed0048c8d6ecb176907e58da0296b1a2f46852709d1bc60c95f961ca35840d40b444f616d6c73b8ead334022b7b840477fae5a34b89dcca91a85f157cde11a92e7019dd5efda4f6d313fbcbebcbac122041ea4b905c7ccd79b7983b3ecd4b3681d822af1f61c197274e15bb7905aad26b5d116d71a7c84534d597eeeb4a80e48c5f36da3e6e60eee41e0f3121437946eb3740c829228c73bef5402fabe752b78b0297bc6f2172554f2ebb1a24065e1e9cbae1c87baf4d13bc7f6983d084ec0a2e6bfaf1ae727fdfb4786b99e8e0190b265232471f20f255eb36ae585947278c51b3c71ab41f05975ca5783145be5812523eed1badff8a5c7256fe78c7681ed513a664b9d95755d919270e19f446aa48a385b4891a02a5158b63dcbae363e777437fc601c4134b3850e4028155130100589bd713f3a0cc066616d9b3da6dd0be59fcd84606c8784af7e60589ee72d333dccd33632317f8ed5ea4fc5bfcd0ff5d90055f0f95bfca1364795b25daaaa61cc73f98bebbb964003989c07b7afcd34122ddc68bc774ed4d1ea754168e74d513a1c47861a1b161e58d510fc69d9a1573112cd32a892f36a1c9d326543b1e79fff716121b0f808afe5f67569a887e08e66db4eb6aae83f3460d33e923639ea851927acb5efd0d82003e2de16a0b0af39c8114fb56541d7f1bdae1281e4ba75e264c3d7a6f45fd20ff2b533872e07716bdbb8752f9e702802724482adc9cbcdaa7664712bf0b8215a91b746b96f49d05023962062be70c3311fe2e46bd3398d53e3fbefeeaac982428fd14b38a050701adde4c84993fdac587608439610980f155dca8fcd3a801eb0f82e1acb100966da9167ec838192bcfd8b4eed255031688d46a3a7e6abdd6335bd6e81c05b95f725dd4202762c2392feb6ce4fdb233ef830526de8d619240c8aab303d233526c1e600362d4bb38308049c9dae442dfa07ad0880d3871b49261db02cafa307306f2b0341d3f49ed415b852087b0bde7dabc932d918b8d066d18077223fdac611aa1773e5d93e9fd2ea6a74879920412636c799c2e29b08003401453969e775245159a86c61dcb53ad908fcd31192259e315d4d8c3befc7f966eea693882425cb34304c6a78ca6a558465746c2feb21450675b526366de01dc9f51813c5b9dddd8f23f68cac8ba48b5271b00a97480efc69f5ecf1f2e59e538ebe88adec37a14627baf4ca83fcbde14f47c55b8dfa7074700df122e85bc80f59a2cfeb822831c4824a0089f3e0aa0102553b0d991a3adcf6c3e3689dd1a2698c9f13646b8de7b872fe19d3d730d6de7556d2f14afcedebde5d565af71d6fd7f7fce844bcc8c616c51e0c54092bd3b36091734aa3d9e87a5dfeca7d48533c22af84a0512ed030328cf73b781d5af37b726f6aa1c9cdf23e785aba7012f08c650c7e164536553829c25ab274cfbdf382b03efe602315ff7e0b5ae3bca2d1f59ff7e683cc5f5572d747ad17b2671dcb889c83b10206409b4a8735fab69a19c0958632a7fcea834add733c404008652ef0df185aaf4ea2c6c13d32be1a02538a21256e9c033858d37b7d70ed125d9ef108b82f902c803c6840aedbc243423b1717f20aa9eb266d1181ff7bafe7d650bd499eba0efcdf45a7140987b126ce86d8969b1e08454edcce7ff4a0d880b3a9074a862808ac49e7c4d3264c8a202ead6b02f49b330f3ff39f5b720ccb194eedeaf44d6adbfaf200fe69e837c56c1f4f6d43e80f4146858140ecd348ec7c2f1cbf317553b1568af5551790f570a2d23b5425d1e65cb287cdc3ae1a3920e5995c2f97416ab18a686baaa641840c981919c25c14c895f128c4859d00616f38af19623229b27fb189f716c2b30b80d97da1ab39c2ed7bc948f7a0631f2a9f398a5dcab097b93e424d6f2a158a2c3b761fb6004ecf8b19f378cd6162c1ce8a084aef3edcc41b76d8985c890844f67cc3516102568432974a0dc8e5bebf83d5515ff3189b1beff30eafcee2fe2f6dd77c7ea2899531b3558de4bf7a9919027f97a667fa4232fc0b042e785dd90ed7d1c66cea06662b3e542a8b91a82111149092f4b54a4cb4a63e3e93719478cd95572e87798a26f03c4cf9a25662f7363571293a674a069b3a9166119ea648628a251050f8fb92f4c8db20e3b46d98f35ed009890b5b43c48d5661567519800069fb1c5676141bb9e27048434763c3ea85f8ea3b23bae259a6079c29c53358c325c536266406823e759e954451767f192c35ee83764348a2f9a4abf0f8d4e267dd0608fcec3aa300788917752151de86cdca5ed07ec58055568d4b4982af15b19251b61802a34644906051a23bd2e5654859cc8f01f30db5b7ef73c42fe508767c6ed11fb90684f0f488092ba488ec89de70bd803e68638a0be51ea258556e15793aca714536bbc228a995f10b4d015cc277b383bc9cf63550f8d3c2686f0b6603eaaacccfa7dc391fa5f2223647d3129ea680c777e58cab467ff0eeefedf87653a8fe6e6c50d1bea2e0ce9b263db84360d6e13c23873e8300b6d8183abd8de8643d75535702db1755559d18998ae2a4b0afa05727c0edfe0c1b8d6b0cdccdd7846c2d6c02d6176c4b9ebf47edac0e5770e47f36a002caa700b39d14c7046bf7d52bb04daaa9c01ba337fdd5b91dc30d3923318511ad85aea305a37a68b0a6bda1565fe806f28ac51237848f652d54140cd35aa73ba7fd0558d3a6c2f6f8ce6df39583285113030e49478fbe314e626e4eb846fe4d1c828f7632988a75ab24e61a1d0b0dcd5897013161fdfee5fcc9857f1a765d523b4ff9d81790741554b823e51850143e2ed4fb820cc369f608c2b5a85797c6f262f8b9a93f28fbc7f1b0003f24fd7c4c6e59f9cc73c25fa237fc8fcfae5286d6f88b5e971a4d9b9a8c2e5bb4187c2c3648dfaed80c41ca10e4e7cfb6045b9902feef265a50658a3209c2897aab83bc7660d324d118d84b59d7c1831c1a70d55ac786a960387b00405a0c5eaff740d8dc4ba4452ada8afc4e8dd4d046d4310d90cbf3c8c89958d74c318ead209fbd7d6522feb7937a2fa3fb285fd8cb7edfee9e0f3ef40f8521e97b264a5a153b30baa4f735b15054115b632f44217b9e20f38d330b330e304fb362d5957b626f159cbd2135341182dabb7da64a6f30d204c08b75d869946293592610f5415ba220c39fac409fb1e04f14d9dc489cd806ef219c406e2f15ad4a3e07aff1160fd37276396dcf46675437a4d0fef55450933d442f7aac62d935eaf17bb3537ab9b6961f2f1fed60aa092bda76e1467ceb53e6c533e6179d4b0b460e8021e103737ea139380c5473209204e03535f783a70df106f0d80c863bb562d8174645a96fdd1882b4d401637abf35c856aef127da5744b85ce361a0c2fff1f3de07a445e38feeadf624ecbd6b04873206c9a83728f7b236ffdd98b2b30d0d4a84430b14468dfc352fb7f9076304425a5fb150092b71e731d9c8ba7e0867fc92197d2ba92b894c5a7a04bc45abc594892b529d0a2ff4873e50a70df8d0493ae4097baa98aa9907bd2d7584ba73f111f35c74cea38b16d4a6adcd3d54b8907b414ad1cc6129013086999f4b4a0852e99b26b761ef749543a916946ddb8d2090a122db989266b995cd443a80f673749367d1b003d59fa9655fbcbf4d46c8328939715c9565a9dc6adc9a59faed0faac801ce14a680aed2ce0e50cecc2f0106193964f8e8508063cb1fc11c108eaca7f1f08f8d5774686b37af84a0c96a94cc6c4024059f895ee2d8f6cc65c6c115d0274d8ca11cad8c496e4d5f8ae3d5cb3ddd6f0ece8cd76d728621a1fea6ea93b65108424f6b066a534a06008377aea4ccd8f39fcc652509f9f245b2231c0786b0faef6e1dc1e9cb9dde957b4491436931cf8f771c60715a5008cd89354d5079f676ee267d8ff4848e159bc5b14e93fea3a777c0677f11fdeb98a0de8e4e158d591ce1df8d55e2b360db2fec82d74ba2d07bdc67ee80646c93ed3df8a90148b34b7bfc551e8199d62f72553762020ad4598ade47f6c43ea1ba6d9297bf26b0ddeefb05287b96c1aade29daa9c2abe85950fbbff9621b8ea8882f266d431f9ee46c84b778e31e0d1b9de67c7ecb798c8c63931864c63cd6d46ab1b24e69d7240d9ff5b0953b72385b7234f8879cddaa6ad6e4768177942cdd9bfa59100d1267605bee2507d3162618f1cb0d949eb35534af752551af1fab1cdbc9f46d7f3a8f025e0e498a0a5545282c413fe4fabccbf42cdc776a75626c7d02a9245587a881e67fde3c35e79eeff5baf871d0dd0d8cb47faa11b72905e94ea61db4c5057ff4efd323774d857306944589e9dcc2ffac7a170592f79a928283ddacefb901c54d7517a537c22a9a7d9ce2bc1fa25ee38f4fd8cb38788440d010c55d030a3a8ad3d12f56bf7d14ca3a81ac1103e085090d74d80b3a94172ef063045a31c9e58ba6781a0a18b8e18dbf9386b82b79fccd321325ae7234efb8912754c9655ae12e05696c5293611f98a3a566adf28c9d873047946ce5902b58d88fc21f89e36d39eb51008a8690739a1b9159bbee6509fcaeced52c4d39c598a5ee1c4afeef9e8a64b4d57f0cfed1f488d2746c00b82fd3abd5389cdc70614932e9386eafdfa290a2fe1585d02bd8b5e0bf432fe8777aa8b5b596487f531cec4ed300a127bf5e4f4c246bf754d506a6b07ecef3491f34775acca3b51786ab6728fa27b7ff75a1eb680092196e443ebe63c828fc028d23e0f59e8322f599d1d1124797ce805f8eac3e99a484c01cc0e368a8b2869a8941f04b2f31c03fa12bc66a9613505f2a7dcecf704e6b41bffe3c77ed400db196370197274214aa2cbbe2f3d4f3482f711a00566fa866c5aaf3288f56614e919936985b8fc031cc7fb70f828bf1f438000a234089b679a34d1a8ae4390ab6d51f20c7173bf68b6086ebd9806d60c7f3978ddcf35f74a4c1ce3ffd09e1c3cf5afc4062037e0a004faa2ce980174e5d5f07d613d23a281545fd109a4f124aa610e0300184dbbb23ccd65e50759e102a3a302085c9fbb1de86aa05fdf6566821a70472b82bca51ec407b659993dc2fdd6846b22507426ffae754b0816b8041d80b66eb30c33086610fbef52012452092d82e066e045402877c84cc273438b050083d3c6f2013d0fb027cfc5e2cbf94a93263d91aa54dafe332e1a81be00683f9d87944f6e0bfeef9872fd53e348cab8d1a035495a7a790e03e5153c35ae4393273017d046786f6d0c3c001b77eed0a48083ebb70624cdc43dfc56f16e1ddd9dab7ff8e36e76763c915dd02d3821e7cb91d7a964e3eb9991da248a7028647b62224e9a37102c7130cfb6eb036f49395a36e433e0bfd13db74e313e66e00bc9eef1efa275c05394d116f94c3a478f22e00bf8f70de68cc0b4ae36545a0352071a2896a844beb18bc92049144ee45872561409e4bed21d3c8c0ed903f2d98c93b994262588559aae9562d6babe1bc38c0aebf90b310930becccb441b73603c3776d040437d3aed8a13b926abda34618e8d05be0aacecf47d17f6637fd2677e3c23766c041f420611dc84e4ee70423ab5fffa6474469282adf1b052cf2bd506526b899084f96b947f8de1ac462530602b9a449796af8f45a00ebaa24ccf0f7e612057fd7bcd02035b211e73b22abc8c19a282139a39b7ca88e3867e99362cdf5184ce8d1933078e6b6c135fa2cd6216a28f02104d5139420b8bfc51b0b81785ceeb9961479d211b7ed342ff61fb70f8bca97f70633e319c97c9c160b8d5c0a2197fdeaf235d747557d034a7c043c154c4a5f3494f006b6f15257b869f6088e53f10d13e4162b4411c438d902ec4e8bf1c799d674e70e3c0c08ca4c83efcac73b6a14a2ac1938d8b405a64dee736aee784d4aafc4ace6b316dc90b3978436c0ad0ebf45f0707fc64e3547360617ee57047731f43cd158a793c8e95f39c6ef8e87862c3c5f2aabec646b35da7b71d110bcbb035baf4dea48d3c9b76a76c9dae32bace33b3216bc6c4234245cffe0f291e99fe543c028b7ab6e9b61c253bd156cf0e32e68597bb67f348e259c9f381e269e6b8721c5ac80aeede15c69366b3f1272ce135c3de44c0ffcc473dcab46712d00e30df117da60431509090babec5cb9dc427d80d91204146596d5ab335dd5aa9926f0621769ac5703e31b56c3f533edec6f5ef3b3bac4639a1097a0ab8d678d89b4a008f99dc60d8bbfd76491ff1e5fe12f883c5d44dd25320bb14cc31bac5ceb7b9e2a5b2b0b7063ac2dccf09ee943e6b0a7e1d34d0a938d19a0e8f94059387bec610dcd86798c13973e077ad3e7e74845446064d8b68bcac8d03ea9fa698d005de53e904cf314d09fe6bf21913afde2025e40e07fd115d55a60e70b808e87d8175999f638e48617435008e405f75b1038fe74ead308a7f118e49df1dc300ba17bc259e54012988b4ed57a6641a7b34c780dad005484ca64eec01977870679791fe8669b0566111817d5c8b7bd41602f663e1102424a1a7e23a695ffd511d4e1e28957bc043a15c1b5c459bb200eb30fff750b00ffe7ca10051e87f9973c14cd31944810498fcfd053cf40e214cbd8dfc80d666d80780282abcebd95e42b3ba4eb172d89704b50d3734dec1f33a180ee55fd39fc59198b34b7f9950701d817990e5bc9f4b123a4ba6aca38a80e6ee751ad7eb2c557019a0c9046836e2c530836fe67d7285059d8ced981f2b9738fd18c54ac7b2aab320cdea0bc1ac8fa5f8c7a6cf6eadc6006c8dd3c20b9419691180e3fbb603762eb2c092dcdbacd89b08400dc0c9e6674141e2010dcf1025015deaf069ed980a60c5ad2ce2d275eb5bce8010978d0a17725b44b88b4690e74071e351a6036d9f07a9cfb00df63ffd69e7fad94f142459a3b543c5ce3a3bc93947ca1e25b886a00147ea8649092135f56997fe50f552afb36a838a8149f04a60752445e8349a5556d279363d3336a3fe2f33d59bed21b8ee6f3ce051f77ff60541f330ec95310ca0512d005d8533aa0e3546a9708147ccbe239896d3f018da74e5869d0a23ba004f44da01491ca35146750f3a22da433dfd693b638eab5a3cb89f5e3be33738c40d4913812a8446198876dcb2d354696f82d55af6bd440d7555906f28af7560f3fa060dffa63f95b0aecbb3cd2098d95856c1aa74c62dad124df7e02fb34cad6b5e13734c9aae60dba897b9570ceb1b1109a79d4fc9ecf24ee2e1d61af686e5f1cfd2717396360f27ccad49c86a7d849863c61e16c2c517c7c1ad32a8dd9da5b3424ec50c067a08e57a320d931229452df5f75840d703925e84187a7a5704f01351aca4557d4aa1a6a760674f8db177fe215ac116cd19c7202d1f49ca10f39a78bafd656682b1d5491f626ee80960a4357e21bdb5826e9b0c25d47fa6b5de30021744921323c1173bd4b1c6fcdc33f614922ce28bb3b95c9f49c85b606888866ffe5f1ab4183519e9315375fccc12e5a318724c6422538928da33e518ef6298654594ba1797cf1ceab7846206180f87b3cf4143f5fe009d68e0e05084830f3e8bb8514c6842a51855dd3da2c21d1de57a4a4919a113fa0b28eb108fa4232abb16301e84aa976127ad02c29d1f2430879807530b3d521444885a328b2215802b700a14e9698fb12fd20d4a61cbb35e01c3f1164605be8e2ae3c68af08fb5166fec9f73c16a0961f4b80f1e8a309f3a29aebd8f244ab3de993cc9b62e114eebbaf78a41bf549a37e6e4d0df01b9efd79507d826f06d20913617f090cdb3e621cd10f252bfb9b25c0cf6906d79af52308fa386be9c6712795255ff9d43e0b793706d3323dd3c0e972041abe19f1452822acd69a3eb08e8c4435d16935049d49c439f2f5d2f9ca5d8740b44a3f7980d0342ca8f2f751580c1a686045cb2dcea61a08e7e4c49064a075ef3cb185b62d457fc155c350cb11b86e16186252062be194817cb65a8f2c493484619b9e508fbcfba67b1bc5ebd54713e4a62187ab7c342498f9c4fcdf9247964cda652aa9d38ae973a7fbdd54ba4b4e24a011d019950749cf51ed0c2a68d82b7adf99227be0ecc07312c7b6806f5283509a15ef6244939381a9ada211818faeaa52d49ea5b849d8e9bb70a9b4218a4981b73e4630f24d7fd2d1b1cfa1b2b21f140b0cc8680ddd93aa20ec82f307cd66f6a2df5a894c4cf9c0d29e11f431a6b176c2cf56fdd4cdcab1ec0f0ad4a003743070ebdd10d18f7e12ff80b3de288a82ad20168531596fcf0edac29e8464d435c83dcdd9a86d42b6442536ea198aa180001973d1e88973aebd7f70dc112cf5d489e6a1f7f920b507d6ad620add2b28f5308d6abab362b815ac4c44ae36f215efbd81dfd5c90e3f95939e856e5e4fc29393a52dc19a9b92bd606fb9ab98a3af016ce1c7d2bb15d582a070382ca014d344520d7768e6033bcb52725f55c9c214eb4bf4ce7b8f6047702f5d25e2d8386cf811dcd82a3ad099f1f6bf90fc674f4acdc3dae6a1c5ec41824d9872bb3560019a4368588471e24fccde8de7cf92643758aee3be0b0191f95107f50f435c605e858768220a3651b226a830bef62e96cb571d2233d68abeb921e883472b472bb0e2d9a096142b0b6705bf4e08edef2f86f382ddccaeeb7dff6cf05f88e1a4c9d9868eb44b328bd89e1f2979ce5534334cf26686f27b75cb43b4718f83962d28f74ff352e5a54ce2ea1b136445c865afc010bff7763a69c30204c4bd942b377c90a36aaeb196466866443b26ec18a17aeb28b0e5ec185fe434774d87054e03f1e761054256dcb1c25ecdba1991172c00c856393d8197ea85c914872c4c92aac7c70216b9725b4cbefb2e860621b7b1ee05073c01cf368249c70596519263fd7eaec94d7186f2f6293b4c2cc700e275048f1eba75c9c1180277f4fef5b28be1ca5f494e9863d95c745331ff29f45ab1e5aefeb5b855c69327b8e51bb9ee338f0c43b10d46dc70eb43fe475615abb6a9bf71716569d885953e1764057da83b8ee5a2c2aeb88ebfdd5894231bda0449405685f75bf1189ee4614705ebacccca0e730700b9e902f1aca5dd640950efe46b26807712f2f6d9f80b09af439226cc45a42556fd31fb93266aa75b4d4ac14a78aea37b5c1897f6bdf9c27b4426ccc40a24a5181066520de767345815ac4d303fce455fb2147456a205e75cc1d36cb6840b802046c941fbb0b1adf6808059be7d1e74bfdd2755973b30b583b5d8e50d58374512fbda54bfd36a01016254ba0f53cb409d5097aa43b00a2fa7eb6c74fbcf0ef087e5f8f9fa4f82bafd7b8f10b522f73677f0a7ac6400fe59f93ce225328096846a6ec3690e26853bf9633946d45671af5671078770214c97a48cbc36fa2d3b71514ea8d51cb94bd191e729b86843e85cf697bd5dc5202b3f71f47e51f1b11cc3a6efda04f25515559502b30b774e8e556fb224110d56e2617373f4a5d59419ca01deef382b14d93e430148bed7d5b279dfee741f2003c13bb3017bc5a42ff11dafe373846e1773cbc1a90907268b406b59b110038088351df85dd4c95f3ad811e13b859d6f7f67f72ce92d528c55e0d185f5377381b3ca377662aa3cdeb9266678a408c2a389ee599358916e64db51919d029c511a49acc8178edc77a235e70f75b7e4b9a3f14276459905927f8f4a2d1870339fa05a77c809368a021c98a32307682d534a193b4795baebeb70eefb4080e8f3a0da3f0ce6b4e35936fb0d28a42bbbecdb0e91e69ad2bcf016678154d4e0de6dd148fdceeb65c08aea91b8a2f48effd42583d0f28b6640bb718bd966c9acb48f18a5c606e2fc996c8c724778970041c944439dc41819031f8e7cb370b7e092a2688546acd931b960f7c4ec1c5bc7a9ac3f57fc8dd206b7c327675581c22fcf1a401dc5e5aefcee0a73fea0a26c948b43bab8c6f34b64e2ad19ed21542ec7cd623f8e0a15347cecf8765cccae8fc3d24b6bb08d1e4303fff088757e8c0014cdac2551711f782ef3ac212687fbcca04fc1e54be333b35cd7cf8a44553cdf89b7d8ec20f6b9223e677f856686a0fb1f9ece254d84646d7b8e41cd72e19ee1febd4dc0a00bc94481f7b71e6beb7812c8e4d7a03f6608c0e8f80257be1ccb6e39fd29a244e58f0772de6c4560b11bbf461b11bab052d94d7928baeb72d6547a5a06a066f10a56569604a92d05d960e55ad516caa6be3fa4e0d9a79b10ebd93033d07e7dd9e47820a3d37b2ed18c65e184f1e7fe1e1f3df128b3089831eb0ffd6712351373058e1b5d58314954360fea421787eca9964af410978d766a8d80126c5601327df2392e54cb6f4b9bcbf0f58d97f3eee887aa827bf06e6d7032cf510fcd4ee15d49f6c76a1cd053bd0a5dcf367d7a820cbd60b149bdd9b9b344b1163000720255b4629091a315db89a3c185b7418c4b38f961678c42237f85143b4432041d4ce9543b4e25dd0ba29f3682d6af1146b67350b9dea91546cf5e13f5d8774a2896979800d63f87751825448cbd02aacace2f5b80d159a662310dfb40f44a8452f5792894d96f5932855138d4b859beb39d0030d6f2904bc3c78061ecc23074e1f435061f9b2c2461a9c43cd1daddc44ae9ec229d2e786bf617ed94f5a85c6ab334a483d77e53246baa6992ea191d14de01008058f5fda48bcc0590cb23bfeff7756074d9acfa4462960d45fc2221886d07f6e64ae6d241d7ec952d845dd730a750074c1d1895228c1a50d8e4c64e9cdb20c17cb9e66c84589b3a6bb31871c2a48b6b7d0e7030479cf8693a1e0dd437c4f03a576dd24b6b252e797cab6499c42fc30562b9de717c2ded316af4da83591e1a9336080f8a9fd004ff3e2a4cdfd629515220610ff85efa1311871a24b38385fd80e58cf6244b225fb75634d1bbf47e08019d56d5fbe8e6447ca87b887be8a83dae6ab9da89fb09d81254f11441711dbc9e6749f370fa5d22d8538fc0b74751a2409189e9fd9464a7860ab02e618ebb15522f144f188559fb714f92f2cc130c79d52b42e6fb590f725e8fb8f74835d7b25529e56d2016cfd4a7735628a5a3a8ed75d9ea29e3dcbc927e0edae320f4c8cd0ead703839fec9bf3c0f6ce44ffabff094811a3c9c09734b57a2dee9a0b558f05b53817003b53df8ed626a5cab9ec6312345acb348420a343d7219226e6c6cedbc3e22af3ffb91a3788f5ce1f723c29bbeea910a17680d34db3e0af7183d19052ecbb39808e517182ae48ca8d819539dadfa8163440054047461129819a6f28239c914913f8de5c1e5d887846e4ebe1c7a54008e4ef029729169e07e1f8938ce59d77530a61661eb06d9c2b4410cf530dfd5b8c6e635d06d0b90cf537f0e3322720cf0e7212d62f797031ab9ce9621a57618fc964bdfe1a4212d8267a12852fbebe977be81e5253f1fca63095c7ec9f0b54e98f6f89f68b1751ef69cb2939500b5a553c9b3b64f25ad0f4bad68811e84d9ed4bef6257e2eb611af635e62a1aad81e6e3a7bda5a28c1c60c8575f20e5cac0514444c5b6376bae59c5cc05d2c64a034b432a7e999ddfb39b87935bb8ad76bc2293ec04f111277b7c150abb1bd3bcd4fd1fd6079d16feeef889596cd4280f756959f9ed725a031ffb47e501833789080a6f0028e2e183e1319b6923b25a3ea785f8effddc19d3d0e41478f17e9f514da363caa92c00a5dd60f77dcf2583059717389c375bd457549194f6956c9146f6c06aa82bbc51bb8303c8ad9582eab2f315ec9c48de763820393f6ec534de2543ef99922aefb00055851b1f90414588a61ad23ab01cb3a6163bf126fac232e122a2906f3ee97cf24f8af0a11d9e7016c02c74d4e0dbdccc1c4f8162a103b116f62bfeecf376ad519bef05fd95ead94ee07ae826735c04a4ed00db45d364919fa21f28a3e869fd8ab3700b4373045f865840705154d33b7258b9c404f5dacd1efd4c7fbc5047b9355f612d01407bc4dca3bd5505300a8911a9019501dc848f8583f12166af0bd989652c267917ff314dbc7b51f78e69098781ce007196c80d0751c43d14ff3055fa0dffab875a7334c383a1bfc4674f7c1f2269b51525f03e293fc3eb75e1c4bda93fe15cd22edcd76c34b8c8903dbeeb5a145ab9740d591ffa7ee5c3d81c46d0d4099b1d3b9d74b46c7337a2eb3c18f79c29ed9f39ece11bab43182f6484a3b217537c2051f5836b207790afdc4d167ba4f7a9edad40edd723d175bc827bf84dd811d3491e3a359748df7e98ea09b5d77dfbbb83b816f2e57fb6f20ef6bd62defd6cf3e57dfe0d845319301b88e16f180b338dd58b4bed0e048a0825d961c891b5247f30531045417dbd980727bb00ed3948f27ef05fcab2551a5b3d34ae7b134737e401e952c755b1f796fc12976fba1c17248be801a2fab232d4a4b8e22f8a4177eac5224b2d3e17604cbdc6359f61578bb27748e7c415538a5d1440a6f99851ab0571ea29c2cd5c3d882910d0f084316bd098e42f40292494efa016f3b451fa60221fc02b6958de4ae349019efc13590aeca088cab6f66ff11d9b39a2b1fe26761320ae08e705d01eaa7ccb7d43838d2a97a6da9d40bde3efbf8788550fe2e799058a29a1dc86ef54a0919a4036016c54a2dcd2294d2e09e8b80b709b37659dec025528900852d326242b3f24b964a8b36ec09da792d1f52755431334c233503569837a3267c818ffd4c280967b38f5dde0bad8ec1fd954fcabbd5a52f851e536d3b2cc77e6e375081f27489db78a7cd9af4471712ba623c0d319b9619796fd508efc82bbb51ce064bd6444ace8298a19db8eb07b668cffebdaa2ac441aed04dce3166762846b08ab4865aab61694d79ff085e9e1acb27d2e0cb4609439cd8240384730ecaabdb4a9052cd299c502e170c358236fddc6e22eb64ceb2db9564cacf7df3514c53ab983b379570b2dbbad63ebb4696f72761716ccdc97c34bbfdd50c118408bb4d0fbc08cc75dbe3a036745ab7b7fe3b6f5c0d6a7f2a04ea314eec7ce3bf56b5efa8b54dba7aac9d5017cffe32597dedb53f633bc4f603bacf16925a2010334e072e8c68c874be0062cc6a1ae26667c7f07d944fd18b88d525f61003ea1887e7917d23b7da263e41701853279e53b474015834425009e65a90a285058c9be168f5d58af7ca6d62f76ddb5e50db7bef2db79432252903f108e508240935f6656a08e96b2ced369227535e901a661589727777ef81f52247699a6b6ebd0756b35a6c962f6c96dc0f438b6dc1642a1b633599cac099b3d0c610c4be463984821c9added799e675ff645c3b50c16a556490a6f891d752fc626d37f10145c40c105f972eca84e391ec243558850e24b8a4865f245cac9c4d8877c286aaadc553eaef271958f8f6ad54d81bd1f7dad534aeef9040517eecf54f717bc790635ce0cb9efc0eb36dc73ef815ced6aff84acdaed2bb8d195ca8844d9387c563e2b9f958f8d75fe7ca66aaa542a4a69d775d2c7c7a7e52df195ceec4f7d0b3b4a2ff67e50efe160ae68621647b04cd341047e6c12dfc67e168e09c834d4c291012639bd1f976e946ef4b539b539b5cb714c88da90e99151d27f3afdf6ef1a3297c8a10d2a2922b60917a96d88df7025452401a92d7452847f66cf2cea21b2d64e4b860e78be23664fd1759b062256f49a45f2a687f8b368b29e2575668fbc6942f69b645896e3dc841e2dde9ff9d6dcf065167980276cc666d17ca920b5e42cac31b5b86ddb26d3733ba6073aaa350c1e65ac8646994c49721820e514b24a6ec0aa45262d78171d721ba9a18f1c93c964aa412322841e5da629703278a65606a7145b21884c57a0c8adb1b41fb769975628d9092245a462d122c5fd94231b20255332f5e3df31d17e74c0a48e5442a272a04c91fb4969602c5807ec2ea216894c36783f7a1bb8efbc1f3d0bdc77af29216dfab526726b41b9b51f79d33674cffd9853b7f8503a59e89efb163ab08551a8fd58a1d98267386a42d64aeed75a370447d97217b37b75f750c80c35673fc72927784121d3840c1ce776b72b64ce29ed682c120a996f835af41cd4626badec44d205cefbfe202c79d3401e0e5863693f2d6a3f4d42bf8c1578d47eb49fc691d929a51cc771da8ff663229241a2c42a31712fc626d3bfaba8ea7412c57f9309e397269ac7af79fc4a558e3a9da8ca3e7de9dd05962e4da488d41ed84879371c4de1f8aa1d1569e8e219aa72a44b154396cdc90569d1829fa50994286aa4a90e7da22a2ab0e836dcbd18137144a69cc9eeeedbe2b8992ce551099994de3fa1a36166fa1bfd19c4e5448d73dd25ba8d46a41105391489b264a8a44b255d54256fda16c99bf69883712f2de6b817202320d27daae0427fd682aac747c593939353adb59ee77954455525964c16ce5d4a97f28453083d260c2649df69286598ee188c02b8989614b93fc59d52dc8f02f07efbcbbd7c6e9b29b0c9f61c78af94a97baf37531cb8b383e453dd2339a5b8f738239284fe09723cf2462e60e48e64998091cb21f73b8aeb714e0729f637e7d3819d1a813540ba2f92e23a7023023797dbf44654333770db62b939559edc73e1f6eac20df6e2b660ff7103038fdc8a5b499d39b995087916200b20cf932ca1fe7c1d12b5b1be54027d1e6923b309487aa48dcce3fd311590a708f53796a32acb6e2cd6c6324d6ef5d3628a5b396abb17d31184dc2fa508db6b7be56cb0dcdf291ac09a153671f56db99fb9c9169ab815f67af8d9a4587d4df048bdae9aae681d52038f75655aad569b197724bba01bb24811a94798e4509ad3001246408d4680824739c29c736a9aa655b759615cc6cd02b833cb2964b4f20c6d9665d9bdf5def7951b91fb391c33f23a6efbe7b6cfaf8d1b755e8eb885cec361c195d216a44ea772a60c320e4986aa63b81e83bce9ef84c0f6afa6695af561b292b0187c755bdb62ce15c03a920c1e7d6129947edde6fe28545d2cc6a9fa18ecb7f673b6666bb698ac6aa5f9826bc7711ec7791cc78d469c0f93d50fd08475bd99712fc626d3bf287235489d4e809214cf14315a29225d132da9fb2366c5c4a44eced07d2c9a9e34095ee0ae06a9339fcca013c812661352846e3921e5c8fdcd4a02d36779e10d59c06e3359b33587e6acd6dab7d666d65a5b298bc5459105e9e53f7da98a29204b2a2a27b2c3709ee0cc3e539036fda3cd0c07a4f433ef2010d27f5cacc50693db676cba0ad65cb4e47e923b8806191c42f3a5ffc0213a9e1424e50c3c4ea19ae9605a1c390864e649eea5c5be433e3c6426d4f1332a0c438b2de2f7d0614f039ac2e071fa7c4c60a12b83634c9e90d0378357a368becba3c34c5bf0e8301a70a85172faf69f133c5216a5413bca281195881ac761fd326158c3700c47313c9d726ec0a30bf90d7cca4495b2e8c273e067646723f39090e594307364cad2be7389c8517eb1c9f4622e11e5ae207d4269206f9a3e316dfa73e0d3454f163c53a88ada2077d839c0a30bb9d0503f80e7534f28175ef227033cdfc13a9d66da32e2136639254c16180bd647f03883382360a818f1d28466d6278114933a2350991458f043f3fe354ba11ee0c81c0de85edaa69fc6613f5a61ace491b21ce6555096cff65112ca2a235396a31c46e50626595251bdf23883a6cc51459e418ea2540a951b5e546e286ab191258f9415d4935bb6d8e0c93da99412385313ecec200994296bb36abf66b6eb6694cce7e4e38fd697d64a8b73b66610abd538548a874f82841a67a86975f9f54ef09fe1018f549504c619697915526786de86bce913bcecb09def093c3aac71aa10532061040779742fb9ffe38259de38d5fb24ce8169ab451248834a20657dc1e30ca2ac9d3c5216cb6135db4b2dacece98f0ea3b058e3c81c43df0d0e8cdbc02365d524c11584a1c5aaa56de6572b6d339fcb0f9dd9ea07b3f22caaadc993eb101da22c1a448213da7a967996591289c532c0159c53772a0177028416619a642fbd0b64a1ca893f1127f3a70b99d67436c0fef36bec17c956ce69ede4ba29ad5670b2c768bfe059ab95424e89ba9eb3f255ce5cc5649a2fd87fe593893c7f72a764cb3187d65a6badd7c1d55cd996e5090a0ae251831cc58347108f201e1255a1d4201e154a0dfa545227a74e216b152d62e0357e3f5c1414f4b9518b2842eacc7f39e0d82287178cd17345ca71e08232aafcf045d04e0e724e39279d38ccac668ca0f982ed73fdc5da8e498d491d529e5fc17c2da9f3803cbff640a2a4db23798e36499e3cf266be9c3f63f2f42188dbcc51767094393470111ee56bd60f7d98c462332b26605dfcde91eca608ee518ac02245a4320125c571e008b5d67b4768b1dba63f015284fe05c89bee4e51300a3d8129b5c82c72cb2bedc5bd125fecee2b294211b855785a74227da7da5329de72a1fbb4feb8575f4d98a38aa4e8cf98b7aa771aa7e3f146a0d492928d5351ab54a7c46d2253287ec48fce573f60ead27d523a7241deb85090b75cca1367fd38ca576ef302892325fdba6a1caf2245fa943ef5217943ffd3f2c22e4f6e43a74bded0cfc2511665faa3a7f886237e0d55c0dd867e95225307fd2786fb475f21d122bdf7de9b65bef29f2e083cbaaf1a456b6ef655a6cfa2ef41f47d45df7fe8d7d111b793b5d65aa5ac347c03737286237cf2c711f2edd06406963fde2642be0e205c23b36985658f190a39756a60f9dc27056e653f81d88bdd66fe4846b6d8618d09fefe35590d0bdb6baf8536d8df5ea6647b3d8578589342a9bf3b145269e82cc45f0a1161c94dc15276500a11f1e4184a59fe06d6b0d0a52e58c382b5217baf05eeb3b00648a67d66c316b62e6c1616bfa76dae60ca38156e57516d1a07277b8c5d8f4ecc2c01abec95697b7525cf09739b51ee8ac0a36dc1a66bc21cc57d1cb284aa8414a1ff470e89aa4b489bfed3e9000700a166c2b22c038fd5955bae7ec0eada964bea8c1c555b5c5857ae32f0e86870540552075902fd7e7f49545db90d1a52a77e0f7a89c643541710d92a0c69bee0b17dc063d74e71b64bf09fd5354bf0b07fa608fd3dc38e81bce96ffa9de18136e6366dab9036fdab2bee16b93f8c58ab07a185b94d4bde4c2145e8ffc8c0de3f309828c26608734af4443de43633288f3fbe508b6d87a6c042382891c79ba9cb6d9afbff9edc3ffd835d19cb81c74e896dc5f0fcae476bfc052749c0aad3eca69452ea4ebbc3539d1267850f9c784288284c768802c427051e9b4beec2215c582415f345e6c7803de436b2252f171cc27741d4f483350e6b1108f7dd3b08a4eb7e471559a58b3cbf611dcbf33bd084e5c02350749bf95e97061e3fcf9729fa038424f028d7f8d3f79755b0012683697176911be6a563cde508fe155af0814237043e390c99beebe4be1dfe02f084b6bd56af3b0c5fee77144da9361eeec3a6b9a369f7de7b6f966de154f18029c34b1964c02651f69db95a268516140dc12096a5f7233c4d31434a1efdc78c279293a51b603945cb8f2acf2953ab3cfa4f1edd27cf9523d1381dc5c79fe4f9eed3a8eb01c882493003ce9ec31129c2fcf16ee1c993678b4a6ee0f8e5fb5aa83d67bbe9fdb036cbb2eb819004d6fe4a296aaf79274879733ffb0058c1f733efa96a71fed6e1e4c1abc6d942d37747e800c2f2bb15ceb20ca4e16621dd6f9f53e51b937d47deccd7b1041ea7efb436892ae0a92e9c4415ccc2b15d33dc4c5f820d98a14509d38225e389a768b192e7e46eab32094a30b31692607b133a6fa009336b52de68b7025a38f67b7f2d32c375076a713a6a1a31052153734e553b2bf49f16e77c52111e8bfc84d0a2fc18780bbbb85b24759f76b8c28e7ded8ba4324a9fbaa4ce4ca65f7f2a2bdf2c3dcaca3e7a0517dcc6df82354eb04cdd7702247b7bc321377b99ba0f42136c3f0b9b6caf016911cc711b7f0df40182439c00b19f85436417327a70a9523614ddc67f9b03b7b04219787efd1ac3056e10866d85ba42e3d4a4306b32cd9dfd5b4565f0049e734e77cfb22cc3c288973b084ab55ab3e8e8d1a1e4743a9d4ea7d3e9f57f52f1047154a6a5bdf8645ce8699e5ea7d7e914733abd9cd4d097af174d4c16bb3e8eb245de4b47ddf1b2eecf2af7937680c7114ffe806c684b38e02247655bcdbe9b02672db7e9b7560b3279a66af2481d1d242a2323d3c1f4a1fe78b26156145a57518fc2513465453814b1dcac284b56b4c2638625db22970dca591a673efe7c849c5396a95452c716c91b231265c9b04599ca160519e18f791670c8c2bb4d036172b5d837b345955e70848c66e129272bcab22cb345b6c816594a694c0ccd8ab2221d3da525a695c90897cbe572b95c2e4749d77fbb6868fa95dbd5b05136a7168e546659f5ecd7d7bc1ff66bad63119f2c041c8bf864fa36e8f82134e1912229d3cfbce9fb456f9a97a886e2adb8db4def047a63436c50438b9d948ebfb196d47940ee99dff13bc221a61d3540686a9ee68ba43813d8ddc36332fd075f03d600e1f135cf23ec9e9a0fc26605edf81d61affa874363c4d32e4d7563da8ed62e475dd7c8e5baaeebbaae769d81c71bebd52af3028ffdfa2edaf1fdad65db0176eac61c95c162192c8365b00cb683b4c37463a41d3b4cdc1606cc95d4d16e0da5bcb93e7c0694291d200d464071446af610d79d9319af3e056190d9a434343334343433f79a6e91527f52605d627aa4ce0879a8a5b45966efa572080598d0ca88582c168bc56273526a8add8bf17f7f8e6cc51cf51ffbd8c73e669724c9a215632821456a0811199b23e5647b22a720c68822e5e4fe7f2c2675bad5e325e98ae115ee5e58ba8d1498f4a59fd482c95436162b918090bef4f34ba5d20f8979525822954a5a09a4a5278543485f0a6bbc97a921a5aff12addb41269dbb69e1ac0c91373d12f24ca613032c2bc280f3118cc51da1764c45e61623cd81875d1d07ae1c225f7cf0ccc92643db1d8b5328f6c98f1b83cd00206380053c3e5e3732af5f7d136966dacfac89b586cd5b5cc931ec3bbbbdbc7e75e93e95f144f2714dac751a79328fe8ba2c8edb4f8433cc100871d48911a42a40173342122859fc88909155c524eba1f7396e0418ac847440a874efc65ff50ed0d4ab47214ee521fc1a32c9a49bca7a008a45016e2ef7d1b52b29cd206501621cb29303099c5ba933559dc095e129ac5108549288f04a41999863309cb6dfaf1bd9315643281d2c6df9d01d95bac2c64bdbce911380a004a46cd54bb90cd507327fa107d741ee590fb68514a49abf7837b510e898e923a12d5411cf193bb7d6c203d7e1b64bef4f36d28bdcc8fb2a8c69f05fc24e9d5785801fca407829f2423450a65525a6cb5d841198c49afda87c827784d200c5228538aa5c5061b086c96cf2af5335d442d1635d83e452e1415d1ab695996619cb54ffb148dfa831748297d945d3a8a01728a1b934303ecee5eab3b25ba42d343a364be5eafd7ebf53a51fb72d4e9248af8855f4db305a776f06283149153103c66a49c683f62fb9a61491d9585398af4f6857bb229f3b12fd25b6bb3f79af9a32f92f240d203f19ef4f349a41f8543464ffa21314f0a87c8bcf7433069e33a124822850158a60a4cf3f8b9cca3c0f7336fbd1466fefbe9a9f0fdcccccf843d5a741ab0c2fc3138b397fc7d72e04f47162c2b9716f163d01e91373b3ac2c08d832f563dc775edfdc0a71238762e7de5d2385fe3f87fa0942550c74b0fbf8fae63035115dd699c99f72f55c15cf20c9dbf1fed8edd913a8d2573333ac071e6123ea9baf7a73d8e92a98e0b47f1bb5ef317aef0fdcc8f76c7eed04e4748552d7a56e434fe9b0b7fa1103ce29ff991aa3ccf927151c6e108c3f492ef73f395f15322493226d293b10c44f2f7181c9d2873dffbe8cb853c1e851d3219639cc23fbd1ff84465a79525feef390cce8cfe03bd9f0147cfcd2ee6036f8b31e1d8e5988f792947930c08fe901de52451cd32ce0c1ca97fdda179b43b32e59ec13e22ae95a9e0c0caf3c50e410d43ba974e611dce17101e9b68be888ab8f7dc585c591ac7ebdebd6ddbb64d85e56af75e6edbb66ddb885af4223348f0385f93cb9016bd06e92f578bb3895c7ae92cd91b8bab9ba85b5b51c73083dc5ed332e99b36bb679117ecfed5a96b8147c925bbcfd044150a277b504a29d73f9952d5246a23d2d541f89069eb9029751adad590a3ec8fdbf8fb4889602fa221a2fe7117727d5aa5b4bc20bbcaaec2e71a5221bf2bb7f1c73cc02315cafea325ca930ad1212b97a8c80a4f8a31a8744da1f58089acfb78cc91c4eec043dec8f978ce2b8b784c6dfbec431ed35a5adbce1ace9a6b0a6ab595863d1a15011e3f862085204094812a5600d20204a82cda4282d4b919000066e4d73d12c9b6fecc71ff16dc1de4d1a89c1e59ea340f78cc29226ffa679260194616913a715c7aa9b440689d3d18408071c4370b426d94e5941e2c311165aefb85cbf4050c042ab401218a1862062b90c2c30e1d40a3063c643c713285cb1457e82b0433d258638935d068328309b09a10a28b2bc410c3872f921851f1c5138fa271e7e7e4d1847b0044960bc8720a98a27cb39c02c64506ee2ccb5cdecfb21866a86188e632967b6a699b79dbc0546a99af59a41d5134b9c48a5aa4c1c124b2c24dea3da594b27df0ceb89e3273ef5255f0a79496b2dcaebeedb42ccbb24d9b598f3cb37a7bb4383ff4f06dc0dd3b1ba7524a69a5b1f2d1f07bd8aff4eff77f405f05fad2521a82b8c5aedf55f0e65a6b28294d756bb986943e0d4d3db8c9b59742bbe7296f4251decc8f4263a5ab4274eeb93bf74cb30931997ea5999b5e0a3d3d1332d0b3f4a6bc91548e3cc933f4ec1e8d24c83494f2667ee79ed1df1fdff106200ab648f0f8cd8ec6600b7bc72f4f123cdc577c52eaef733e0d3dcfb06bb1ab6b66091e6947b30c43f2a51987e25c7ac31aca16a7bb97c1ddfe51fe955486340c49286d81e72f71779774f61728e8a82207861cd938ddb4ebaec1d95dbf6b8f3aacd53b618b0ebe5cb93c7c89e2d6e00beb0b3d828bd982a5bb87a38bde3de577cb147287a30572d02b8c1c7cf9313939ddd88f4765f2ccf9238f1e3cf218c20eb880909d074a78504676389e647f3196e4840058ea9231af18591bf10c47a88005c6114a767ca4cb073134da8d34dfaeb9689cdc7fb19729b9dfb48321bcf4e4fe7e1a4216217e28620933740083149d543205028e4c337d14263065caaff8c60bff10a58b3c9e9c10b25030ce72ca1b4f747823892bb68479e307eb0493b29cf286ca0c37dc28c231594e71c38c30dc70b941e4c6cf109c9401cb29b8bcb24c9653a811bbf796d050b1001f1123994144cc2a48260c9e111144f80c2e907845b862cea0d2437784cfe88c277ce08c88796728c1c35604ab3b8388241a1130ee0c1e7aae0bb6d396303d1cc1da02535244cf192b5896d5161cec6004eb9eace88b6f878df0711b79b750c1e382a02dac1f8a88b9b1ea36623562b4c2e8420dbc59d182372aae139c4589823d1974c13244f480b72ca78401c416611cc9aee06c8e0c66b56099315678a4c56501be594e01a38a0fb8cb720a1851e4f19483c05e9653c060e5996a0366add62d2fd691e5942c2cc834cb296d58c9a3a955d7e038cd6f4e7653d6b65e4aa95fefee9612656bcff69ff7ba3f1d4d3ebb7b9b690137ce3c5369cf6a6b4f9bd99e594d05668afecc32598645724e06bcdc652b7f825bb632c45a06333727ed3aebcfecfeeda1a9c598110629846b5a48dedc16c79ab9987166307338a627967574e58dfc99b9d1a8d670c8095234ec22def767e4757734842cb951d0ddeadb18180ec25343dd1fa594f7662158edd6ef0835b9c6049e2fdfbfdfc196b902cfbf2d8eba51109e3206484ceafe96c713a4a4dbc8c72329ac37adb6f346314f8080806a4c4c0c2ed5c754a6c7abfda1404042566c0c1c0ed4d3eab1f387064032a452edf118fcd0a7c14721db89b4e90f0cb086510c6ed31fb386db59c2742245e88f41eef73c136aa661126ff25c47692eb88df6040c41bebcbe19fa0408080808887a5f6668a88a7ea18919e9305115fd62daf1c11320a0bb06d0970f6ae8114cb1f783d63c0102020202a201100f4bbd14ea137d33b0d9d5a0d0346de3c18562db368e07170aae83a2eb3aaf8b06c58dc31bf99c718c62a0d0e288c137c481a714e94b2943ba210e52e9bb61a693c901fb68060a9a98d296d94e436f2a7399a366528efa52f2ebb66d5c49731429d555bb4c46782225049b27133b99845a2793f2bc1ff6bd5104fa5a919949882cbf013e18204b983e3952c7e5ac4096d2421762d8c013896984bc690f8778358c62ba1b3ef6947c0a66e07a0b318e1aa5e48700c45b81c3325ecee9749a408b28c874a93b49a5ed4d4db0112c963ae9df4c4a228199bc00cf60ef870c12ecef9dc5dd5134a914124c983c13266dd32f998c9ec0f3c7c924b7a36852f2b998cf0936e17bdb874b145d4e4f9e0d98f333108310792219e7eaa70b1ba33c4ea06b058b2bcf9f455db237e7cfbfb825876253c50a9a2f589e5de6c064ee290723c21fad226b5d96c8dafdccfb71e9d8e50c8b3c7e39fb22676b78c9191b58e46c8d214cd64a2a5caad40050b1724c02179eec3e00249e90c10ae8b1e93474f3f4809335b6680316c50a921c68500508a1151c43eca4babbe919b9bde4eeee6e3a3f8429bb710c90c72e8f3cb650e3063580b2a7c144f66f32a9f0e8a1831a204007afdc6ffa168778f5e07a9dd19809e6f1f294c70f0d160ca191834cbb2e9cec31d656a6d973f7354bb8a1afd2701774d91c9a2564e17c4d11ac903a1ece3438da9154db66af0c335bade5bd5f4d1dbe2ee52ca1becc529caf551589535738f5053236bb0c9037edc930730e2b87f6f82faf6921236f9aeb3456152d0090edca51dc0ff7b372ee67957f26f7f345959f558e71ad8177c81b53d753727444c3aa711dd0cfea678544a338a01ffaf3bb16bfb034296e33eaee1918fba3daf69a81716bad75eb96b3d65aea940ba5d26b7577bf708069a911e13a290d0229942c654cd25c79b4d845da2957351073149c5b132a74bea19437fe5e647a5e95d89ab09ca5d4524b2d081a905ee431068a123c16ab81677bae36d84bb3ebd2aa381ed54ea3b8241c0f8f4eedd17698edb4fe754929a594524abdd24ca936034e925032b582f6320369556a7beca85216925d7007494e4a0bb3bfd64773962727757f037790dcd47d9e9c94f61ca5d57ad637d448dba67996cbec94a94c866d7a2a64b904313264d9432135ccec9f207b6c6776dd260479c0f3e5d3ce94e032ba75dd6fd9775cb7719da65d1e11e0de68b85dd7753768e10db9ad2bb5d656a734c96dad4a8ccd268f54223925590b9a1c8fdbb406a5069caac52858753f66b469b7e3de0190db64ea4dbbd90edaed4aadd41fa953a94bea580dca17595a9eadb5056d432df66f5748710b72d446e436438db315b57885c4d9cc90627f502757d8f14eb03b486e8afb8dc851dbcb6d8a1a678bb56886c4d9660ed2a67f03a712998093dbc4e490381387ed35974c166412fa4f8ee25a206d3823944c15a7e2549c8a53f554b9ca515c76a7aa716e26c58c03a7129903678d64dca6b5bcd23c2000f254994c18bbf039a6898e61a9404525566d5abcf3c81bd9e2f84195b5d65a29a5943ea5943ea5c9feb5d6a6943ea594eac81e3611169f73ce39e7a41ebe787c9c265b0b4660f62cf11e936b3651e3f05c93b7ba86b5e83aaa6af9eac5c405f778cf12da53647d5e48f07c9a3ca947a06d7cf8e4f6691c7f942ff11e6ad2565d3493f3481d2c8dfa2ca29613979cd0334147f6b0c25aac5e901862b2242749ee9d0ae683ac7324aeaf2a2c94c95863e1d9f6279b40936fcc94c30f4da66e42a6234b9b5ec1fe0035ca91f0951ba6f06a2c27f65f00d5dddd7d4a517e4fcecafaf429fd8e64b986d2bdc516e788cafb4f16b3346146fe46e4d9d5b20b469b16e62deaadd99a13e657d21832add286be14354dd38cf8ccb276332348a0ccd97db5ed6a716c19c6557eb6cf75b7914490bd1470b62d6d361ab2df6c5b5a1464ff69b76ddb6ed8b47b43a53c99958c95fb630d68d1b403e689350e8d0ebd8fe4a6341e4b64c390620fe158578b1968e190368c4c40bf1db2b016c39038f60d29160d5938a864af42a2b225bf92d9922b722f79038f902d397dd9c976723f92534aca048c1992dc9fa99a04298b1ce55e4819e64aeeef222da8638ef2a1ea69502ccc51de721bad0616d638de6ad1d3a2e04e7b1b46a2b4efb77048cda4d1b0d6fa3c3775c3ccbb657b4c39e0f9a3b772672c2bdc29a5340e5afd069556df8146c7fafef62dbd19cd28ad5f36ae6ba239e79c73d6215b390a86933d4627e2c45fce64ff0a82f002ecd59dfacb0914f1b09b59b268d1c2c5db0beea22b9aa871687a9a489c9cc6919e79fdc69138b44793eeb58ddbb850c8f6343ccd4073e338adee79cdfa7b88f682d43ea5210d345f13ec7b591842e3d8f0d4e3cea0c4458f1340542982e7065f747491a38a9623716081410884bc914518306f84c1c318340eaf420b319af0224a14372892831a4432086ab28233d28861c08d295138f184183efc20064c7544a502a02e5850381c3044152c7c60a38d1afcbc30b708827a40182db83285922baa7801828e4108e6132f6091440915396051836584f260078b9f2baf282f58c224c807b8e022092f45acd1c31c740738d8d203c7134954b1b28217a008921382e6f24296014c95c317246684f122c3fc1085164ee8400b94243e4490242a08a30c31d650410ea6bc6182377ac062e88a18726cf102dd218893204fe0704590133129b4ac9a091a64e084c80730604aa85e88428a315cd0f3841a4978dc1801134968f982ca182f262f3811aaf123469631e0c882441ba0175a7880920510515411021c565f70a8020d2d4ee0a04110196e708111a2055478c822f6421124a2f8b08226529a68a105f6820a868c4461c171c60b5a0f4b5c4132049434d8e8264210070e2e1e28110a420b8b76a14011592c99838da02ea6cc27a8b44443b65c8b27f27c39ff66a067071c70d1c10e37b0a2c70f71986144cac111aa487133684805f28a14266293053c3d6e14c008d54b8dba45923296582669cc91e2b224b69822c5dd8e82b2e5430494e2342b8ea0c186f4228a4f15aea32001c2e0828c34ba8e82430820c78f0f5d52f41da4384f505ea15aad9172507221470a8c55e642e2111536509d9172f0a322e549f8947ee58d0d688f399b68710dd29830537e919e342079f5cf9f32bc5c142c5fc272c03926073c5ffec03f787e5e9161b703962ea58f9ed38bf43caf34bf2f1c61985ee9bfeffbbeaf54fa6f96de476fb3f47d5f2afd57fa8ff425d2974834df47f22fe6f3beef2b7da5d257fabeeffbbe8ff47de9332f8552a9f4a5d257fa4abf7d69bb23de66fe2b3de9ad9702e94ba527919e449a012b8c869949e1045aa4de09f5e97fdff76ddff76d5fe9f3beefb9edfbbeeffb1ee35209ec5aa4fd3218a4f9af2b914a9c47a2c1df68e495b652e9493476c6decf46239a906a33a550c8f7a52785e3f72415be2fbd8fe63e5249b648c37e1f3ef23a6ed36e66bff92da1726427f7c892ca4e5126ca32cb6cbf9681c79bedcdeea8293485b467426769713303dfc699b9c55cc3ee1c5b50887d53f6fe3cecfb7dff01481dedfd39ad7ef61b78ed57fb15a461661acad9b64e5947e08e2ae5a4650b0c575bf2dd6632b3f4336bdd3a08496e953af7af37fd9b39083c78be5a945376d73a6a72e29664996709ad7ab9a791fbc7d714a13dfc315bdea6295f4e25b7bbbbb7bc0a89a2f26606adc611f27eb8fdbc13b0055fd8737d5d9a6b922942fd7a04899c3d7d8ac3982994644bd2a56bc553a2e6eba5d4b9f5a48636dfc8ce85736606d8feacb2471b4882a9cd9605b3b4189369385f2dce56f66f9ce994eea39148eed188e0640f4e66f1a7b2c3caf8bfff1e7f8f7fe63f1fce76164707062dcf0c98167d47c632194f2ce6ef6b164f051c562d617db5e8426892169da7451076c042be9f6166fc1f4893509e1675c0e3b7d71155b53852950935631e45327e97a9025b5558632dfaf52880fffbcc4be1fbef3f3c013130fe0fbcff81334b895a41daf85f991f03a410a864edb64541eb14d508000000c314000020100a0644229158382015f464f914000d7b8c407260321688b32088611832861863940140008008c8080d698402020b2ba1ed1ec9d590690b964f3591e8eb276b3525451ae6f376b814be5ee644bb0a8989d3b75811637262373ff2254e2e75444af19c3adb172ceb58cc67d41815a5be2abe2e30ce4be0a04084a1af55663c2c327de7180d298e1afe2db169d7ac1a9730a460275f908684f4053d7f593cd4174b5ebf9825c5ed52b37c73bf59dcd905543ce86407ce6ed0be9ffb22b9c16d8a7217c4df0205225dae499f97041ad7c2b53b5a5a0b8bc966f3c0eb5db0fee2b00cb91e3adca9d075c6b6684ddad537b41ab71dcd516d60d59860e3522c00bf204bbf55f2b6312e2a48717149b49989d66eef123a1b023acf0869e7bb1aaaba34cb4bb2675870eeaeb4b2d566fea89cff74cf7f09827d92ab0caaf8b734a60f969ac44c3ef1ad77a2441870e71b01dd7b2f5d230c5d122e3f38105bc32e55e0903a80611395b58f5ce410b2696037b2978668ce61801bb30fc66c7ea7bb6f31ced86b39d6e35a65343571b2d1fde9f56fd920a6f1195d9a91244997082919173fd36082604ee896ba08b22dea35320bd06c3c99d309a160b0ecd825d020376f99fe164b1f9a3f08bda67b2c32371d6c864be99d73c29132c3f61a6cf10352953c9d744e671f80de89a9fc77b4206b6aaaca74cddfdc81df386d52fffcd3724dc6c9444f8230dc4ba89de3e06f83ed402515b205942b1ff4b968e26937f22250ecf170db168e69f1b924f5a2b9282a8fcd25bc02eeac4f1f1c1fdbfde352397a67165835dca144348001cf328b76d06e782cfda1548fbe7d78753e409fea45a0e713fba5d8d287b0a71846806b064f99834944d6a5424d00f13088445060438be9940f9e152ee3a5c1973b33aa2a8d2c9debcba9afab989f83dc01495b0e8281970af051a6da0c72e7d08fe5871658f4c010685211641dd08c8f25346b33bbe066d21a3c385205777f21059956363b3d79bb6ecc68f210e618020dde621d03b7ec4b42899aeec9df81dc84aee9cf38857b887589df8c26cde5fa541054c08ac13f95f135d504b7f4f0758138e52a1e71d44346e910f1a8f49e2326725b9014e94ed3cf52f42c3e9bcd798ca9026388568dc94b555bbd9755125e64ef2f06e42f546b0c537780bb20a2826d9ee7200ec310369a8fd042440bf1b674db90dd5c902f3aa36b66d09b688331dd146bde947babad8b22813029387b4b9bb93bcd3621f0c198fd40bd8484d4e532235dd940a0b9881cf89191acd00288b7eca915145065753e8965150cd1e2a20923b139a258da7445c6555c89a7823040ce44aa898984251811fa244deb74937867e20b093e6010681e42fb6b898853ab4829b553f30aed5167d29038213f852e446cab1fc2efa94d27eaf58f3e0bf8955b13937f7107f3b6aa0c85b58cbcb3126dcefecb94c122422f8d98c124a6384a38d90fc184ed808322edeafa4839da8e503b9ab805a926095ca180a0f16f8498293356478db8d906776531e039b7ec9854767c57a399e715ff3d11c8f766566efc77360326d31275e48e76dd4244ab3aa4302d527b7d3839caf28bd72c25d091e6c953c5ce9f1194b4872e57a599fbe4e2b0ee1da69fa7cbce644260ade0d895c3ba178379b453cb531feb2ddd54100e25508ca205a32990c1465120e6917f3938d7f1f9f435ae92b49fc5f4e9d546b554fd03e0016bdb74617a2e1d9623ba4da8d865a14741c8b979e6e450d1522649db2f62d5362d042c682c3183b1c16d2f86b0e8fc542c3ebc0fc2b595f26898bf12aa2ef54050b0cb34af6a8e47b4e696ee67fdd2f0b5e8f657d0a43f50471c24816413f28c02412bf47d0f7222048dffbe7291ed2728c8f6065db3cc31b20b3739cb2ef01f5ebacd1d93a9897254f88248b991d04a49a65755da9f145d091c52c9d0fa5f8f8306bc39e5e9bd6bd4da8687d33b7b5ae4bdc5476875fb9c79ef66bf1305b2cfe8d91a1997f36e0b27abb5cb093e963c5ccf744fc2ea063f47c1908f9dcfdddbe16f0a2e9812ef465545bc9e8b3d03716bed85c4d8bd02bd4b1e36f97e1e959f572e13915287180f91a3a3a67f2d3be5a96269608de3101de10bd4dc2e3aa120e4ef62b0235241cbd3828a497aedeb81798216defa0a8e5a116c2c557321c2732f8acdf08fef33b620814d3db15dc2bf3fa9720eda97d7758abdd6fd9eceec79e8d4d996f1fd96faa499ee3bbde2478e2741c0b7576a88237493de66b1ea4ac5b67b3e3427be6f0532bb4da224ada4c93fd23663833d540be4a3d78ec3da0c469c7b7664a9846847ed73e7b67b10da0f8103bd39219ab2209a447f2de522b40296c249582a7f42a125672ce6f2dac6b4e25a8140eb6bce2966946355946a4994cc31edcf375e22285b2535077329d2fc16e2eecceb9568fe1dd720ec0de71df430378cf3f1c921f735bd976fb24ce4fc6ebae8b369d749f90cba6179c6b10b9e66eedb2112137bac0a13ebd061b7e9aec596519f17aa06485d1cda89fd3589518428717b2d689836248d3b6d470668b566b37875a5a0af592014b757b8cc82d272aec9bfebeec736e949251144547b3e2409be3f26624e8ae4d0dc2abf15b62178ae5345a6c6b27315683b27b2baf37d84ecaf647567dd95a385ba8b2cc3725c1cd40d4a09d8f6e1746949b404274a0bae9a06277b872e53e7f83b45c22dcdbe284c7a58df265e794c713ee1b6d1768f35cda10a7e5e628fa9c88c306443a2614d176ce8f8b9ca31a950a97164b5bda0d26d9b3ac25efbe2f6d817c781e3cff2156d7de2c425865549af41ce85219e0c3a875fce9bc82be43cb90f8290af14e68eb8d50061adbe934baeeacd447ee5deb82ebc963e5f2df74a1c087229d9f0ff440675666aa395e4300e7a8a97dd5b46d2e504c860f4b273fdd89473143881fa5c3c0245382735baecc0a412a07fc2df46b1acae1923eb7db4211241ac9433078a33553eee00ef9371c63db5938825b506c9ea4cdb7317f191307beda69f04d0faf1d81d22dc5bbd826ef9432574cd01ae026b4b7ceb1e93824ddb6eaf8dfd6b93af216e7dd601904ea16e0059cb1a7baff93dde1f1d402486170ce9227a2bf036cb2a5980483be08bd0d7d882031fdc9542a2b33c9116ee300cd9ab68fd2ccc668cfeec38fb381eda7d8d75e1b50631685d9865b3556017660c6fc0d28285135c985d211b4de884dd1fa47be4591cf707d91f9a353b046e2ebed276c8207040fa0cd86f425748b5853ccf1568228c985feb07cae0ae25049d1fcfac05ea65eb3376b23d82699eea4e37173f81f56d6465e9904c6be6228203de0815a821bd204b1c2400c8dc3888875c47fb210dd4a4ea32a6b28ebad43a20e4884995d0f3dd25fdb4d365f402e21d7a7b09c2de2c0fb2ca092dbb5725aec6e07e68686e58ac97327f421d0822a7084552d9ed188e4e47cfa2d66c32ed1fc4d6076a60b0f1455e6d286c5fca38f020364e73b52a9c89cbfebf687cef737c6861b78fb7cb80d639057dcbc6a808ec91994b60ad352b1d13642c20d0a432adb55c591c4d37273a2b5e12a27d110481a6c0b6e487cd14a9a5f5009c08e70327fa6122f79327a2f6cd8e88d589a6bc90e09f88bf9a7c961b071befb74cb20ee517ec9c1cd22723527e97a191f2a4eebba486d7c1753dcf001dd0979131238a02483d599421833a5310fbeb8dcef64f6a5d4f57851c683715ea26e4a9229d9c605de3ab9074cf2f646398d9ad9ff5468827286ecff5aebe9f42178539209dacc91925ea18b7cca3fe219f0485ab6f6d5590212a8b854985b7f01c8c04064bd943329eb8067c5cd668d7ef561fab35fad9eb9a204075db6d20fe568b7c283e1b598de63460d197589da814d9f8f5aad61d4c139840d5dc800f1cadb30d3abfa45313399866f572f0ade766a284cd3ad711e525474e7ac6e1f66ddd5b7b9a5a58116fe9bdc84799c368197dffe4cc6303ee185de521c8725023c3198bd28e35ab653a0efcb91fa13367893dc3d387c835d567195b4aa2b8a3ca46663f211b5d90114d7b87e63afff83efc1050f47c2bda17a706f60a40dc18f231191bf9f1a8b5e2140db2a88e2febb0c0398fc7dcd709500a9f382a7d1ee3ed9b3a626517b82976feb445bbc8d6a263538b26dfe71d3a7e9808d24ccbd46881573988b15a3f24bcacccb2fad49bbd08a3198fcbedcfe3745a42428f0f0b92cf06e2868857096dd2b729f77071e7d439007a751ff5310e5517ce865f815d5e8f9bb34f0682014b4d81323e24effea7a21071c43f303513d97126771ccb6b68435f3e96d0929bbbe40df4126bd9c1f9392dce73c07d23d5722fe84fc562fc94782ec94c0255cc2e23399750b113e05542c5579cf91f824624122d9c80a875402128448b8924c9938a117166fbeb4b0152af4c5fc199fa4a279ce955fe7eaa902fd0c02b7e875b6bbf4c10c126bb7455fae0ce57adbf9c39a9f97ada5f4c0ddf0558e3a8d6387263f71d89bdceb056c485939e09c0f5c2218890f27fbcf4c913a6c209313ac66ad916e1f551c44694b3dae7f10324b114a28a5b26828a3ffe9b8db5516164bd1b6c250519d1c289839e922609b0225da752874f3f0616a2a4b8ab90f80fa543654ef1a4ef1a1a1d55a47bc3f8221442886a8651167bdb344ffb0fa10a49bc4d9a72dfd8da51fec0277d8dc8ae39c45da21cedb152fdd20f199e3d0d2c8df087a614a48d0a230096e5c2fa1dd7dc4a265bbf8fbff549e92cdc6f19e0ce627483b225646934c7e937a9830c2b799d941af16e7d021c25dc90cbc1f6d8c07344103d0cdb99d403b734e7ad412b190e1f7702be4dccdaa24d99d0ee4808097d24787c252ec51d0e398817a5a49eeea971aea95da161f6afd5d2459d4660b5aacd9a7548f2b184d3ad076edf742ddcdad853e3efed083e294bce0fc3013b2b0ecab163bd3eacfde715725dff81a709283799e7b0df3ebaf2d1fd16c226a12cdb9da4d90f1f7163ef9a3422276826934b3f8ff897b097dbea1c6c5d275bfc9b52aadf3427457f7f652afeb5c536a660a6272433007a36cea7b91d91c73c3989eb221c57de15b39eff06dfbd6f4639e9bc8524afc140ebba24aa1e865c128452c1a505ca551fc503846f6ac1fa2f4a2e5b06e2a97bf568e6359f61f4284ccbce338e2fc5acf5614a462e7a4a2bf082d8855bf2dfd16f022ed1653f29203d8730f174cedfd89a10a6051c6d530afeaee56cba7685a956ce78d9c831058d1a3f7b98a810a32fba2951dd582021394f59c6c22218f32a639bcd6a11af4ac0b4c3a370b508edcedaa99ea03e1863d1558109e4ff843be513cb5455ce416a1005c9e93991862a0048559b62f82e95f9441e77c40025a1548f6bc48004db7158bd21a5473a65e87c346533168a520c67a7d31a6cef9774dd5c270937d89e5541ab795421f7375a1a555959c6e7bc9da778f831a26469d3f2304246ed0ca995a59bcc6a887910090503bdf940152a0c05f303c3080d21f9bcb2b758393329e4d3ca884d259d423c08371da36deb17bbe5a1a4a96d7bae0a92ac416dc5df8e1771e80c25e45c5d3bfdc91fb67ded1be92a0b88edd5ce3d5c7ce429289b9b0c8f888c64817a4348bef2a1a5d7c6f0a49e72bc99ae52e7073c561067cac966430a4e5085fdba12de78f3d695628b3279c2e97485d1e874f9c3cc91c1419242301583e2800a0d7557e83c757512a51feca4cfc32f45e4b885b0137c12be14f16027c83f7fde66b9e0e136706d52e040f35e54b8b4b44cf15b5c164e38b1ad04595793fe75fb582d9c6a0d2baeaf994ac728853694fe50bf488482f4a76a2920ce3f3ad5c3163a5db0325ae378a3b6ee23f04ac171f6a663b1bbbedff1cb36e403ccb13a0af7462f0f933cb8cd0a1778a3461674175ca8c8be7b4f4febea6eee5a0a12c75d03906e7484827afa694629b713180346c1c93e3fe1a2ad5edc6ab8a6e118fa8b0011dedb9ad3abbfa1b1e6880d22908ebbb2c53b5c87ceff3e818c49faab229ce4877f20151a52dc9f741141410f1184922459a7f61769baf13b463cacbe32e001103fe56e65fd66c78f3696e0065eda99cdb5285bcc8d8b8418462c10228d29664f427008e9440439f5041d37e292039299f6a8daa0ba4e4bc016fe89042557d5ed1f708963c1412b378707a5f379bc9718a217b2383e38315f95f74543c50558e6508a1ccbbfee7b09050ab08b1d0f27baaf38650195f1e9faf3a393702e079d850014e3197476c58798631b5285f2c2d013fc967051e6220b6916339af3813eabf57cb2d6bc54b5caa0cb432f6157e80a77d1caa41abce762c2185dc78b22ba06ed5167b91d459b77c73020ae42db380634a6e47a74ae14da40a811b3475d670842cb34440b4a06a7c8365a3f9444d1c4289d402d9fa380d29b667f7665fc851aac9154425442ba7eac4e2a4e08f1cf8a465dd3a1184daa47f6a651dc0b0793420587323cb3e9f25060c3eae70d3512558163feecd1c11ed16edb0b2823971cc6ea28a457376eccc46e3ad6f916d46bb1720194271291cb30f8e37b2c8b3e01dbb51bc619d6a11fd1318a6781552fcf645b8502b4cf951f606870472b8e5d284eeda971fd297e0869fe02cd6206cde512929d05a9f4220d9369933c9e9856a7025f97474e4fccf43dc328d2038933caf210057aa7b37e6698ef8587d811a12c72b8a299a73376986ebd509e0ec0d42434ff0d9844a9cf737ea499997c8e9d1c60b5365a3b15f43d2fd2f7a7fa2c5bc89082e2ce30b5e2e0c5cf8c7d59d16083a20ec026413db82c0b94c5a547db0663d1d9c937143a6c4f8543bdb8c835e890122b8ab9d194968b8f61d22c0cec6664157dadc9452acd0fcb486ae6299daa3096087d4bca22816cce4c8f20ab1246c605730df81ce073fbe65e3f5b6315508deea199685134953fa3b6c2a47091e63a5d2cdd09e5b288f37fad737698c1396b42117c155003dd0ffd8f9c3f297574f48841f3e7da635f1d92b42051771012353ac867ced851a0fb8f341d22c03a42b8a77a6d388d67b3ab85c2031dec5d2bb6f531a80dbed4d7e80605158002b4da802de5fa20d5ee24936c451fd5c8e479cc240ea37fea259ec655774e3f6131185b9a92b816c251f259ef46f615e06295ca2b5186d6b20ed813d8f90f5f877d8f550ee067a7c89c00769b0cb6d533f707fda7e1c2c2cc6a6fcee4e248414ec3b75d1587c5b835a69176e4d32e27957648e4624f18b49234a03364978fe607a083cdddad06499444eb252426d4da7f271f6d5c10e0575e1e9bf9840828409ecf2d03482b578997af1b46430365f9372ce76eae5a2840f6e17111aec98a45355366989dfd12d9c096252d0d23bad82ed4e63ffe27b1c65dfe2c5b1e1b31381054a6a8e6afb182c406078434b530fba6d487a1f3172af91f482112ca0ea0ab4704a2e503df8f7e97fd131528dd80618ed0ba9b89a2efa8b8d68809462e39eaed327909ee2e92105c095a211d14afceea340c455511fb24811101307734e93124fea012eaa968dbb22aac9a049f158e141b55eea6c48b7100feb1b8002aed693987aa95563fcabe8a2b011d6cdd3f3bd3bcf37f0042b67ae11fb347567e7b290ef3375887830686144113f8d308215140b977466f67a10cd142505cca490a05d8f8e20e7f68c54e3121cf1df7e4df6b3027e3e0c715842ee1b9e05cfe60819b4e6bfa7b921b7068b7496d26f4b4f4c036267db08b358441e4a28a9b985ab0b9467b82c99ff08570205f7e1147baa278a0c7b677fba0abd9410d58f630e5c7c255d890be081086b22eb8f28944d16a0c0260bc81a0db87691880515be9ab6bf44d37a276619bc5fdd48e7dd757f673a5cf90cf4e9907af1b17c0ce5723b568030776dc41671dd778f46cbb2f9524adfec0c02d951bf0373a9adea73f766d8dd4c57cbad804af4299c80acb2aef225b1aa75f84f9461c0b31b5221e7e0bccb06734106c176c0ad97970ed93920aa57ef4518e5d95c9d9ae192487b21e1e090562e47e1a1b5f80b67dd15e448547159229787468e783324fe010ea84f714044d86027a042a65df841c229365af231d46d21b14f2443e80205914f2e12029aca9b16112b5d078fe3bbaa75a453161c2e1230b7f9b20e7b2103df04abd3b558d1f00032f125d84bc525f31c2ab18ed03e699c204716820c04c1bc43e03327c5ce72beb4cf3df2bdb72b509dc771231a3b478891d0cc0222dc40c190f12b3a0cfcec8a59910861c3f946b3c1f9df74e2743bf35e64de82f430f48c97b7bdf9928c20f07e9853be5ae634b36a96d14675679748b07792fef742fc161f709abdc42c9cae71339186c9ff815fa59b97793b64d4fb27a0a745f7f2d399a4c2d0661c39a5ad7de4336e77ff28e700cb310bf8d05c41d80eead6afc4e5de501f99408ed1cba251fba45538975919b198075652f225ad7cfb64926229c53251988d30453f0635052b4c26d93b2c6d9c78cc1c81cc450870de73b4cb3805d0ca459dc8c8c4dbacc1eb0808460cfaf17d138f84c55a6620793fff76196ac8cd676e52b797fafd19fd102e95ca1006468ef7b346232dc14f14526f2d3f404dd209bee35c180a6115879de91d54618f223a793d720dd920b06df1f408acbf2d5cf1ebea080da71701ae4a718eb57bc943739576e2a5218e7a9235defc9e4225173795382596fe08f7fc8278cab647ae35822bef35bc5457915de441c48dba1ad9a3bca46c44fb8141e7ace65730f59ed4ff443644e00a273f6da8d08047ea90f65f61ac3d38498eee39087f55b9946288a6cfa2375fbc0bef0bf8cf05722285fabb40b9bc0a77da318a55d278002d1b880ffb4dce55397d7ad9bcc34098a26d941eba1a11053cc6770dfd2791211ea7598f76cdd81e5daedff56d85d47391373228c29651bcc94c47ea725c737546d9419115b11148bd8e786261be0bacb8ab80abfa99dfbb67d224af03d15987ba7664ecda4aa6a9861c9d5901d71faff704ffacc5ee41ea935d88d1b5cf0905eb75196948cfa891bce36e194eb427d7f842caa37f1c3f7566f831e2f42de987c5cd058d00fe5e3a85c2bac2f356958bbd27ff8d8e062a84dabfb0b2333aa7cc07d10a9d558e60686ad2f860dbb713269eae705581b617d2869fcfb34c7ef6de1003764febb7196abdf930980919c262b18f0c343219e2c12e2fbfce144ae31919a55e80ba5af9036198687d3279a796ddd8552d5559d83087424fa27ac0f0c369fbbb6089840deff620563b4c82ba42356820b94c2bc3b555e1636f959ae0f81032306999657fdbcafa9c87472a5daf4e9a959b4408e21b7791043517cbdc7881bbed31a2004411c27579caea7f4a6fed906ae543bfcb4ad3366ab6c85f12748ed4b2ab99885073e839e491e3543830fbdc4c282cc2db54b86b28e30e124c3a280fa5e45d6d1a151948fa35ae7857af6a8d6dd2e50ae6131414724281d1ad72c6fc63d09e09c17d41f721164b1e8e0dbf4a821c9d412800406b717deddf7540641963dcd3e06ee1d1617b630d103a7edf3ba33ec19376e213e708e5cb7e38ae0cc3a71290bb4b592528c3321c9b7b7a5590817e620dea95b06b309fd31ebd3642bc5e88448e549cff02195f414b029aa755a75872cfea0c51907ec18082105ba47c8a7619e099491156e428c3bdb689ad20786404c8a11483c3acb662b75451adebe1ecb42e8d22b542cf3ff178985db0bd1340946f421eaf19953ae8ca42d79c0be7028f629e6673d453c01446712ddb0ceb959b641e36cb3ac4a02206387b454dbd7e4f9e040f5376ccef7df186078a00944915610e73523abcce1ba50e7e478b3832c96461031792a0aff91462272c680787cc32e533ae073341f25afcd090751996e8269ca53c84dc851d59101cc56903b20e3f4b6e2c0d374cd84f68260fac567501c48a305706714abb394b7cbc59dd80947b0646648d172cd9ea510b1889a53bd45c4baf24c9859372c6d22d6404bb10f9abc778b8432a7fa19bcde5b845b68c0d7f339388e42fbd8d2cd33b0cb4299d21267eadfbb2b0e1843ed7ff2ffed75c98f1824ad50a5c18f547f4ea554c32f7512557757a13202beb71fcefea2f48ab80a572627e4882cf043f1f600817676c10697d55cea35150cd888a56bd26f23722d00be303144dbdcf8e3a56eef0ff959d398474101af2615eb4a9a0db9d96261cb1c2831f4def782c6dcaf29c51b6b6204cb283dc38883df52ba92bb7f1119ce4513e7355a3e8ae48290f4c114934ab2e4cb548f5d8875c4cce848f0df870e4894c2f6b62be3f408226c49b8422bdc688dc11a76d19e38ca3d9e2f3cc77153c0394617270be46a1aa634b31d9fd1d0876699c823cbf06f8aad2c18986eb1b8f1b914a42e36bce06b0f5a108a9d10af5c52135d70d417125b8374649e46bfb6c85cc34e93beb88117c1653a0f92d3f17cfece3765091f749a92569a9a06199bc2d5e4431c5073edc4e068bfa16c1424a0908265e9bef893eba42d1c711c771b8f71cd2b16f41636f7f293cc377d2112e5d298eec775f4dc4693c584598883ec51285145f62626e99b510b1070c56932338817cc6177cad6c445fd9e7220dbc12f9741cd11f5bbe9d1fd3cbf88c87f1c75db842524b57feeb6bf393f2ec0c18a3ec5b48a21a0f16e68debcc1f0e3352c0992c3821593b82fba8cf64e426ada7b52be782545f00b6bfd98811df975ad2312a4cfd51d43dd9bbd6dc247fcadb79d49f625be6544fcf8c9cd066ef3efe50bfb50ba33c1992ea7a405bc27c33fb8f9437b43d51d8d868f1c6ebf1ecdc5f90c26e571e592a8b30aa5945d503fc24dc0d0c910c54e6184fd6868eb75a90240c2e8aa941b99ef8bfab7926db10c2e0100204629b396d6531142bca13243268f3528244247ae09506fcc88cb9ce40e077712f46649b217bdc99cbf61cf208d0af18c9d556f4c47315fa5be92424f3c07e4c105be69b4c5558e11ed7d4a5a4d81ea86535975e289171aa895d396b3c5e22dc580b7ce43be1ca8f884a8be7a5bf57a4da1ac9567f7443de9113b5ff18f8cf47838f0ced600a4752651dcdc523f8a05c25573bae0817c33e2218b363ee70e18f39d2c44291dd62e3ee7905102678e210b196619923d4725760e39caabf00623d41595009008914cf41041052ec3b2ee23fb8680601a9c8a1440ac4156b242a7f6d0ea0bf63a23f6c72808ed5512b4ebb17976ae064157d336bb4a4ac09a742d9347a05e4efb09ac042a56ded82a236dcce3d51d79735a8031d6b6922578fb413fb2413135ed1bd42938331b4a4d633edc57238e367d19f2e8984f8661e471fa4747c458792aae47569cf6a862db09010599f27067aa1d61c6184343a9ed608ed856299dd5be349f5d969854dd35a25f83f2a2017ce832c7f4498f00c10a08700057e8adaee2eec99553edc8ee894e4fd1fcc07dee3376fbea537b372e96525dc71e8610c098d5dddc5d2ff0b93e12b8c4cb66ecf70e73079aa1c2d197c87f6c6f4939ba68337593c17a03ba11d3bff42654e78158dd04679f8f7f440bd621745c90dd19c629a788190c77fb2ae893075ca5f3585adbf0d2c0e0d15b99654a8b085cc0f9911be21800a6a329abc32da14b3dbcb97b9d96bd4f8b282a9dff613c22f4245bfab5c95cc74de6a93477f79b7e0ee2bdc4a2b52489b44ea5a23fc8ee82241c41798e2682e049f11426a5ed2f6c1d98bcfaa6870d0819a123f0b6570936571c9a276da1d0f69f065052160306adfd02e6bcc294c4a1c26441d6bd89f56d4532ad764a8fafc2caf33a52a07c8bac5385f063f460044f1fcc333fa4d07637b567e46c9c097050e61fe74038a5fda20c67359b5164a76e26b1dd6362ac556a23d7bb428e3dd75cc641bf53c9eb3979a168b6cc67162ea1b160634cb4dc499390ab176b896053dca299df33ac815ee43c1492eacc54d687de98d0a34d6960db0c9a1c480e29c4158acb606a7d1753d25c9ffeca7b953a7182637462e1a1a0630c1807b37785cb138d91186ebb94d8b326b1f5a160f59b9ecb65131138f5c83af339e78b9488c2e30a71222e079f83e1fdad87aacbac7b4e25e5bcab54e640cc90c46f3cbc18c4df4b4158f1b54828bc29ca83f0a3ddc61f47b4d7eb7bffddf7f64105192bbe4ae37407cc195006ae2d499e8d136bae7b52b51fa8aae187431c5c36c4c16a26622e5bb30fa38aea33c4a9de27ed0498fcb3b208bd0284fe1e6a486330ebc018c2daab25a7713f94f855ebacdc8f68af76f3b1b36b3124f8742c53046c0bc8169a0eeda00b0a2936ba8791c0e6cea39b5c1146ac6df618788eb0d1e575fc6e833c29d74f3b92ec1ece50514f1914e3e910e7efd8a56f965aea70ae8046a568c36e17ad3716a319c414d58949df8b1ae784a5e4852ecea072acbd13cc30766a019712fb4a0d693039c8671eb5e71cb1f2ca3dd4d0b8c71c5b121c62f10b34d1ecf668d8b4ca2ea809969e4d9f34caff8c425859ad9ebd1ec07a0f4e8bdd496bca60a07b1d3e2faa3727981a4a20f6c85a49ed63a06124f9aedbefbaf4ac9995d10288f0a276d3202cf287708a90712b3979128ebb5b1d23e52b6201be1ef737012d34020290907ada0017d1482e2fb9d0275580c065335f998f9f454695e484aaec065d3f9ac866d98fa609548cb65662001d1dd52fb46f6603579e98651dae9b48d74f6e1d482952954a35a53ea5d95926cf64391e21ad440058a5851f6689e09ad821db4d8c3b70f4201d477f3fea9bfc1eba52c8a53e31f8cb9c73eaef701295d6d36a70d0e8773fbcc5ee05d0f297fa9f770206e5412de5d96be7cc4f941dd7d3ba376ce114b68e2c348538d8640bbfac65a4253ff873f3d81aa7223c653cb777deca91e856fc2a7b1110704ef6b8e63c3f387098481ce006a144d0af5dd68dbe1d148eaae590250514279c8f00d0a0b6675a0df4a8e89438631ca5f69272ef13650bc4f889f0e8ed2767fad48aadaa5b9c9faa1c293e1805e618022ac2e5d14d34b86c9b49999960cd116a04da79c220dfa24cff2ee69996176ee6bbd2354234445967a24ab81cd31376f14b1d7c120a3ce9a1e83e9b1b78e54361af361548caa17cfdd9bcc0881105edcf2681222d946c8fcd0c84f2a1b07e6d2a509441c9fab25981102f0adb9f4d0295a6a516f0d1004aba0d099895f62bf74152f40ed9099f83ec6eba00c84537ec22fc47c90df608ff29b95d2d00123137d8c02c51e63431860d705ba7247d151cae6b224c4b6eb22f1b9125954c24ffee33552d825996c645df7ba01112e1cc4b7e21773da09ac92ee51998abff23df9e72135232282794901171d7eb05f582c97e15ee512f0edacc4a31108b32b62600a43f090442b49254532e9c3674175f8335b3d0a4b6e4021d0633141daee2efabb136f0c4d6d5cb21793623d88f6c03c4bf1eb9f9db7bce84baa4979d9cda2725665267dc422cc2b27d2f339f3e8c9e6fc1fe7a68726a949d027dfda1fa1fc5358b3c841e6e791b50cb90d0a633624f1a88829bed5253983b57dade49a1e15f44df587ae10cafdd10b6d1b9ed0321e06eef7e53357a7ec3baf5fd099af7a346b1d79c28b0f0cbfd3bc3b85564918c1eccc669dd1e411404aad31464ee364b9440f2d59b41904845857e198bff39112e242a73caac55bf04495d0b4ac115a1ffe086243291159cc86c82481f3d0e3e482b3d2c19abeedd62dc31e9b962311f3eda936e708b5b952421749ac789a3a49591ea73a125cbbcdbd24d5f84b0348edde1c16ecd5815e71bbb6379ab7bac19750f428ab439a23442a8f508bd4270c63c5705318324adbbbcb602be264b367237cd47d3b4e0793ad0d1f21f331d8334f3fb92d602b4e65bd3e06d6e64fe002139d906c9f1d95f3ffe25329bb624a3cb9d1576f5452120f76857817f4e9544beb5d19ab28a7bb1fbce5adbf605c3354e8f57fbcf007559bb570421472734552b3d4f30efd64aa1664d482cd6aab8a353c1a91217648025030fd09dc0b20102ea8f9c016ef1fa58f064cc1d7e04a05594019e6d97cb0c44f2ba43e50aa7bae2fcc41505b8038b448fde57105faad3afaa5f07b098c6640db7d5d78f4ed58f6cffa3468e6c6d7ec1a6a34d295b51f4a9d594bb38a995e84cacb7adfd9b79d32cb0e2d33dc4080cb53b6c3d432647aac7e68c43f7b1620178759c6f8c03479723a1bc11a75b3d381730553ffcb5949d57dab8cd89f22e68e84f967515fd5063375caa35281eb30e6e2be1672a7aede954bfa3294dc0b67d85e2b5c0ce03e85bb16bdc0f62ba1ee336eb8e55c0ed4180f61b1c0ebf26ad366bf9d28854496806f6d648f27d32c3e71a7b24605d42020996227c7c0e1133aeeb7dc5890a3a541723e2333587747a837d6f151009a32602df018d848fc56067b80d12cb68a4e178d4c5c0e1437908b24a6893da05d06bcd3d858f29a0db83cb7c4841e5e4fd74e54f804252226f9041e6377b2d283f06d203190c5a018f78b4bf2854bc800df5785785fe000a1b089ab6a00e58ff2967f13bf0a220ea58b6a8f0cf70a8f3404a6aa0f1ff7ff9a4524eb96841504727e0811010d14f0d06f4672807cb489d72ddbdc923b4bd5f20dd49f88df218b29e898671257e2053585810480063210d314cdfaed7f802462e1f8a9e421041fce69274ec07181f3bb33915187967840fdffa3473507d5cd62964915123a16dbf14bf558e130dc5c1ea6405ef7a495771ed385165295cad6c7d9111270ddc979f9dd9dc0a556ebc0632e806d633b79ecee03d1813ac9f2e14116bf501e83e4cda7aeb58f3da1e3b4af59cc7f2a2bc2e742225c944f3d43b8b6b73e805cd32cf8d532a4f80c2651c224cc0a2982388dbbf9e62f664891597d204b24f47ba444bb0417956af01c0339ddc64b18a9656ec22a6a329790959c10a2785ed259510f33c6f843a4021faf99d7b9b9dd96775eb2cd080e3373a9085779459260d42461bd0eb988d29ba15b5790abe4aff0abeaf5f94110b63db0b8a094639659a90cc39cac51bd6a3fe7bb0b9e7148b77a112293b81ce11c4f33c04de08dfeeeea711dd55b82e5ecc4d544370568c4449ddb9a05d27ccbf7463b9119e8ad9119c807cbd0cc8cef60ffa5cd98ece2eb1083addc56c63b4bfd856b9d8048385d1c3085fb0679da2fb0824e1daea397544aae67c59ef6af34910264361925d24e6f55c2b587cb915c9fb509832ef48639d1a524f53da3644dbf32173c1f70b018f57de551219bb83f652c2d88b8ac2e26e6feaf798230fc3be6f082da6436db1f2bf87022d8735335cb7187a2d37b70450a004b4a12bdaa8eaf6fba7c8384403c7bac80a23da90e7462aa50c0c2cd384c30aec48cdfe35a865f6e87996af43ca67fe77e7723132f3ec40449d80f87a0fa21504dd841407c4e0dc490190eed617050e5f79a6893c202650733d5c39690b6a2923cfdca9e8f694c96bfa1d70154a9fa5f921c608b0676a7e44af58dd06c6251bb73da42d830c5ec330abf281acfa7c7fc95c36a964277aa62b6c4b60cea9de9a1486ebf8f75537748319f1172ec19c8c0140980ac2856b1ee3274989bb947f80f3d5b265ba45e68a9a32aeaad5e7d681fefac047d75517864a29ed723335205de72a2037e8b3d6c5d5691e2f2d09a70b20a9479f6f673033be41a6b3840870f98f1995d4f40849ced46268feac59c926be0cca67fe2531e494de2b02609de86205d8097f05152bd1f01fb6ea367f2a267e190e29a2a8ab89d0e9e4c469f8fa17bbea5c4b92f68be7dc703092c8035d30cae60bdfa351da269eb6ac651ac5037a9a0ae7907c22d64f72e2ab6b5b8173153f97ef29b22316b4277e2d2043971faa2e2602381d7967123668b6e27ab9ecf50361a22384dc6405fc64afdfe1b0644fc58407c10b0a51dee1d0d7a65dd43dd9543b33ba18011477e5839ac5ecd4a73a86b5dbf887282060ed64af238e2599250ab993c694ef3d47e0fb93f79561251a4611c5eb89ab68d16d5083660e7a7ca6d2146549c09c0bd6bf13bf66102ccc2b96951c770d7f73d727e44972786a853ab5d0e97a38eaac548b60fd9deb1a9538320f03981109819942530d2ae6740b3149f21416f2a4a796a6e417ae57b901662f12ba9fbe11563816c2fa97f83359d4332bcb8c5a17b3e358dfe12ba1c02e94ff13b5a5ad35a0417f215482f5de2d21522ae548dd785f94b075abfef2deb3e0eddef64b7553e3ca0a0df05edd4ede25a1b65d0bbf8a4c6ba9234917e545ef14cd225aa3d5e8c88133438eab68f0aa4f046ba1b028ccf3c42a6907009f06df32ebade9ad6d53d0b7b8a5fc85d906d9583e41cec26ac310b06d830bb64fb14fa6d4eb5e5bc7aaf6859fce0b279d82539ac88cead959541dac7b967615ae587d92a738b846e3e599b0f77f8a7cd03585d468e6804fd144eeee8f2d55267debb6ab492acafe3694a7b2eca307553d8ee46c9063c7b0ea9fa0c11c484fc6bc99f3ac3b89515c8b4ad19eae175cdcc4d22b57ff779c7e85d5eb5f3b1b0de0e27ab3107aca0475da3cd8a4272bac8c2f673deaff85069cfe1c7b93315731eb0494545263fddbc6750b99e6d8b674026187f5fc073bc69ccf7ab41e9ea7096f8327cb194c2caf5c00931f1a2d41c6458321da33487138bb7a56f1797f7ac1293d8b705d209cc8f5a5f6b47a91ceb58983741f7379ba9df9c1e6f3437c848cd3065e0e81e023406c59cc612777eb5ffe1cfaccd987aa7f7ac8609ac92afff6fa740709ea4992fcf8f2929c03b35ad4ae3ffe91944f8f6f89ba183ab9492ed1d408ee199e16537c005899ee45a152e9661a1dfe11daa040ea97effcb399b2293c32f11d8adc5870fe26262ea8f9863a67317717e78180abfd682c5d3117df2e17eaa5593f218d188b3fc0b2c5114fa2cfb0721e77f6ed74b4a5e832289c03554a86a6e559cd93927b6359575a6f38927c118335da2cb45800cbe41301ccef8ca47d270ab952b53cb3af6676308687cbcbfa082468795e6290e5d1c85b5118a54c59b1dcaa6763779727e6bcb59ea564f7898549d9dd8690eb253ae8a5ae7497180a39e0fe7af09e470f5c515552b5eb3d5e492d2d528b7c0af973edf1d9b02e326deefe12050ced45c967c0c6c4e981fcd24df86c84c50148947b809141f7b57ecc8bb1fbff29d2c063c0ecc9dab6cdb0a3bcc91bbb68f27ee2214011973bc9e8673a396f001e690c8636ec92797c10e661b35a72f2db50f6b4fbcd940e8907d5f87c37f9a9ce2f9d5e2425c25c4a2b8b8f163ab848b98c3d6cc7fdf2056789001f25b5805e55a13cf912e234b51b5b39bd9a8dae66a322328330453753213043ffdb8d08224e883b243ab8f54cb06e9d9759d1e01a41b88014149165ca4d5e7f8f6d7ea50775ce73f03466e5d5468132be8d7a5566111df2308b7831bac2da30be93172bdc0fc53f0bdf1e3f6f4b1a61d3a842bd5a2ff6f985e953126a04696e0771fcf67849634e3b3d104fc287148ceb6e4aeea78aef8349cee864725548878ef0bff90821f7513ade168f02365182b77e9de2ccc4ef73fd5d5ba3519c1a62f5958c8e962ad9452725e11d4b6549b070c4e4d98061d90d789392b2ad8b773cb8dac21b37da4a39bb053f00058e425c2c39c729d6cbcca49a699524cef4caf6b8a445254835a3b9c088e68a084cdb8a3f491f441594a700adaed0477fdf279e564d539dc7a6ccc8e08d18773a12400a2d54a06b9841d205840adc27c2132a5fa16b607dc2ab15b73f8b3b505bc3101f181ccbfb51f1ab9c293b643515f6a4b42017adbb67dc1c88131272e82a48310b06632cc90dec845142dbaa446d00f445c3647a2247b9e524c0097e734c75bd5bad1424a5a0b4640449615c009750e2d0beb964457c3d8e6270d2da2e3e604057319847214c637dc0b6ca75dd8fd4fb1fe1baa7e5b40a4f192f785f1de03e2b49510fac442d710fce59c884a63afbe25a2b83d76be368b1d95622d4b6a93f5026744d72ae8a8a0a816f59417674f579dd9421a432a8535c1c66f0054eca219d36ad26a9430d16e468260dd84abc85c32a3d63b9c1d0bec08629d385f70aeed2981676d459ab9614c4662d04ba1a15ac0a0537162372729b9bbfbd618d193db75b9ac6a24b3730251d0874ff534631f901a1d6e41f62f8dc82681200548309927814c52e1a7db3e1957b51976a742a97f99f7daef6a0bcb137d385a1ff453b43d5c1c090860f63340b75a3ef79d115a35b6218d6035b98ae1c43634f40b02b64c82abdf7018f387b80c586d5286f3b2b3941aab49b3be25c14a0030be34abfcb3f672c05eafcc91fddb4c4856a693c319dff8ce271458b66f1721b966366bdb71395d19bb45beb94c24d6ca98e42a000d8055222d67e1f16e3edd03908c23c3464598db36f9777762e2e6011ee300627019b55881139147778e56bb1dcb0ae55108bfe3067d3180d1028dbc3e1502aabe17b9cc353a331f374973205a5dbdddaf24d3dfab4ee34bd6ffa0fd7c1dddf68c2bd4ba0c33f87590a61f3d2d27a352f522ac272c683bdc8ad40717eb85b1323e4175b922d63c87ad14474fc76ae93a105434af3b87c934ef3aa31e043daa55fd017f078834c18336d85e8953fbcf06f4280d198466750ff42176a7a55c02c06cb75c78efbc63830af48d9567526262fb46ca3e945b3807203d9030c2bbcc799ba5901312c86e1cce0303232311f0b3d4422b5577f231de85982c55fb72db2188226c19b8014d1989d103c266fa6663b163f1a45f7847838698fbbcb9286a349a8f5cccf0464ff4724b9f18b9cc1fa487066527ea87d93c4827cf0c2be509d460dc212f224da2026f06e65e5a5ffaf5a334428dcd1db44d805bec5f1e88270028eb20f5e08a129fcaf9ee08302372b69fae3e8c6cbb89599f114857d995b96282321da8810477e73d3de6e9dd5a6009f1cff9769e31a3ddeedd191f9bb9f35590e3eb8ed7a65da4bc3ab0f542c604883e89eba37f786bd1b5fd9016792e7bfa1ccca4973f3cad23b9e8f112d71083119cb26553f7de9dfc3dc2fe0301246ba567c74fcadc284e86f01ed5100e01152f6ab7612875474a0accc0ceca5c5607e1a196d321de78d3d19bc23ae03ef336f3a8eb8cb848062d5b6519f4aad507d2093a52703097fbb1c9275c23e608e94968a114d1ff888969a3e9447ee348c955208e894a2d2a8df87dc57b28534816f0a78259229ad2c01bd7b07618d232bcd77583a972501ee5dae4e195915f1f27b9cc642db64dbf76fe784269e32b43ae0f44535af80760ae9cb37ab8ec12a82db2afb29cd8b8893adef5b3277278926836d6746126322026c411c4c845a2a6dd588c09584d8885074e387c7dfb3251e7afbd170530f939b5e463332ab1876ec7a285a04801d5a3772a8c5c2b8e2acd78a3165ab724f0491285e08dd4ad16e618a8061bda2cf28e08e7d596523de51515d596048112030c6483d3fbe51f7113c7da2a00848c6759a3299ac70cb3d9f7eed158193b16359a35f7fda5cb96332b5dfd9fb3575ed88503179c02753bb83caaa55dd442e3bdc24ba78d300a8a4638914b829c2613a061ebaa1144d9da4778fa371baa4067ad75c0e03551d392739e354f5b9172ee105d491f052019a25c8dd642af9fec26b1c326e621ce1393bacd6368e27e4aacb7673d828dc07d9e90a0941c2479f48c345046902766e0477dae13116b5d732477682536001d625c187ecea9be6d4a0af83700bf6411853779678047123ecbf0549b877ed50eae3c796df2b190b6d56032224dbadf3575ef5595abffeb80e3397798ef13710a2fc221012cf888019a183a4e5203ce4dca00bf218ac7498a47edb1b1f1a0b3a29f374e6994278d1c7d9259c926891ed6a8e610357316c73e169b98230dbd91167c7fe03d1a1bfeebf79673277a8f9c1ec73761f32c50967f0f873a02f0535c18f3ef0b616ed1bae5a53fba536dab682c64f984d59f03926540ce2949dcb54fd5da8f0eaf1ad4e16c918a75f54169c12a5c3e5160f07b2907c2b6796a3f427c4d67cd94e94f05f34793b9c32dc5a694efe359c0136360a9a332e5eb290ba3d995068ccc2d62407fe1651890b505c5573decd5ce0c846c6db78ea660edc7d734ec48673c66e743847b1f9af60aefe18ceda847beb303d66f71a4d7d661e60110fc61fe335f265ccbb865ae2ad4058220481091f70d500af257f0d6c6924d294926f660b49517093d028a5e45339165ecf56a9f1c9f4fc967211b0bfc8d87591409e5274537f31e0fc6e06303933441011938cda8fbbd5bb4816eea0412e948512c6436892705502b2c01d73b9e3419fd8cf4f71c312b8b4d38cdee15e950c74aefd06519bd5169cb3edd88b81a5e8892ba978e1efac28018c7c20496ad6b807ef760cc026ae1a96434ebb634ea3b221009ac16e43434ffabee711aec80c06124eb7628eaf997d189e7abfbe683a60b63b458a7647c300fbbdfffa49021d9c480b7b80f2ef4f06d167891191ae5b8272ce0a5b0c741a2d402a2d3a723a619d7ec3c6d8c53321ff0db9b65efe55bc0a8f68bf75c4a1296f1d524474db97f08b2b4b7587111f16aacbe484d9788aa7a08dafe9fb2b49386a708c5bffb247cc070050391825f199b14b9fc535f23c30e37d2ea78ba816cc66230495ab57bb6c423d30be1a6645fa9efd5adc03e21d062d793469d82a9ef3167a09c9047ba8b2c04d957f08657e12378fba487f65fbd82df5787998d3243979f86fd1b75f27f2e044218a6a51a8f2af576cfc6766d3d3b41a384771b98736d691c94710cd66ca8c231f4c8ef139d5525d4fe757543682c8b4b0b501387d1227dc5ef736d8c2a64b0ed5512dd759ccb40615c62f85ae35a08567ec5a0b9a018b48304fe1ff88ad59b5bad600c6c8709a8f80935e9a238040ffd6ade414c719ef1c236db50284ef198497f1fcb6a6ae746b33685215d32233da666af1467e721609704a9be00880f08e66bde3085cdaac1262044f2b4edde21623c0752bfafc32496777da4e7086ac7238973876cad51401b918159ee8e44c874cbec2ab52153b7d22c01ff9cf662fb51ff8e11c8a79b79b03c1847e91de32770f48b608041d2e28964630b7fc19665d0e4f1dbfab8abc3a0504e227d01b5800ecb40ed8b9a4027100878e3a616298420c30b464cd9cc34630e9e09fb0dd123fab2b0e40868d195cca3ab7b7ca1c08a8d528154e54052eab52b1693dba1cebdf1d91fd63349c953b3c9f3af6beaccb809be2fea9fa4fc168d49aa134d855b86b5f0573f3ebe60b071201217a55e5cb9746accbc825df62d9c357fb54c704574b8e6f7d5078024cd574757cf6e591a8d6ac2afd08904791b9ffb83b28a326866650100f4de6c903faf901d2c00f44bf45571016f2d4ef1d6bf32776517423f53ef5d38d0ce126c4dae7a2482855db5ab5fcdf2a4ef947acedeba1898e4d59d5a346ee3078a2e63c655c3966255406060f4e0d9adab6347da5b66f3bb0bb8823c9b9e75ecc89dc69bc1755d1ce111932c1fa0ae2d6207f2a3aee4ba42d541af1544af3690ddc05d526df2a5611f3e752ec2d46c769fe43d960efb01a494006006df5af45d4bc0edaddc5ab65dadc21e1c68edbef2e3e6535284a89394862863486e1194cc618ccb6e0c5404ebefc02ba67b6fcbb1f4cd4dadc6b197418aff0daedb5fdefc3452a0255403163c123d58073449a9f39b5e81498eabe6939d7c58da7cb7179587fc22e503c3eb8598c9d6c1ebedbdee78d7c623b9401b190bbab8b23621bdba34f611757ecb57812fe56e47a63e7f805b2487323ec4c544df37963d384e6a61646bd91f771d7766d6d2159552b804e76e6d6ed5ff4273212bcb1c2044336229c16e99a7212bd3cffe0ad8e1e3b47c2d3cd55e8bc74c9c78df84a990c37699ac245d4f77f93734b9b4b17e183669c6c751ac48d67ecaadc0415944012bee20e4458f03f3fd151abcb09e2be021b341c9e1faf67d5fad7cd787d6e463f85b4141b3a3581fbfb2a56a31b0b392c9fc3d71e125aa8dad8eed0f0a51757bce272a514accfd0c80f6c004e691de05c1ad29fab598273f6cc41e41eb58608945346c88bd900412594ef3b402a79e11d47e8645368353d58ecb6b06d0d78fb9d5d7fae9248df9ed55702aa325b153a58c8347bbe9e1bf3fda6921f199ea4eec4dff01097b0d1fb8da2d95099e15b22bd1a0c29a041f02de1221a2524c1d4ccf5f2ee29f04bb8ec95781e4b38f53bbb62a9c5a2198c1b399bbea76035677054409770007d25987fe3660f350fcdb3b2acb4da6b7ecbc909f429aa848bad737575e743e8d59aad845a36e223e5b079f9c63060250a54c5371c2626fc2073da4d09e743e3c236977ca8983e53224b5e1cc2c3a7eac235fc44c0527147c78402ec3ac00c3139ef5b3ea039319f6dc39af37423dc14def9ab78448ac7ed8eb71aa562989024462b221819e7e8229167c8c4882f3b0c8ab5ffaa249ec3080cd84f888c3bcd334e61785349b9cb2592e6d55516ca686575098480984cb4193f4c7707657b91debb04b0e8fd5c083e467eb42489d2c4125572328b34d8dcc0c52c3004d56060194237f082750114f5ed09073056b80e7e4f60ba6f13da7e143ecf07b1a738486592f7b8bd01b60c7b7cfc163bafae1c19dcd009b7e2f91339d03727ff0d301220b5e62e6d5c385bee0f5024a372428e77b83a18071a307d4afbb54ff2c71ba5289565e57b66850751f40638c02689b284b176717a1606d6ddc55786a3e019e2db50fb52a91f7cf8ff72a6637eea7537ef5d063ebd610ec4b7f12c448e4351693f2854d2aee080308c9d3018a3f931a9d89210e89c1d8233dc628f2542b96f25597f5ea8f05cbd907978c21cb17d3135bd5a47eb8c66602ad80d5df20f48a2d308ecacce01635ee5077e0163f160651bb7cf322ea3f699a9c910647305e965082780787a9bce3d0820053f721190bcb436e034169c228cfdf65762bb4403d8ddadc91e65fff61443ebde3113f54bf8f998586d403727c76cc12138bd32a76ddaee4afbceee5cdea89d15659d3413466231f17431f334f5ede59f18a2e9110a51dde29b270075d8d38ed261c177b8032c9a7595e098dd30f84ea8963c2aed9592583b7e7c445b6a539e1a66bdac1d776ef0acd219d0e36e2d21619113df0872b9fcbda8f7fa4c465fc2536b903e9138ae9cd782c668430b48f781168cf5ca97633f30c57b51e6e73e6b2ef33b3b893dcd6ab0ee0e3492896b04fffb6c7ff9b831ff6100289611e5980016ed1d94ac769dfb62099714ab232db001ae6f871f4214cb9d190ae080fc2f8d2261f2cc451027a2808d105189d7d0d4dd0d37dca7f262c1a9c30d37f58bf104cb37c87a900f42842962b8419f1bb001f4a85d2ac06b14cad7f8b3ea2cd2766c5aeec50cfe012ab5c486758139ec733a5d519764ed56dc2d3a4db667042b72ed9e8a252c3749a907843b131e283d490d80823c1ff8e47efc14e804584d2cc107b809d05f15e54865ffb799a9bc43ab676050af0e55dabc7f0e1b9efa1e8cad474f601ccb9ba6e73ee9333258fafb07ecbd98b06d5821f194cdaafc2ac72deefe7f9d3f27eb8e96f4301856c831e37f4b2c24dbe7dbecebaf165fd44d1a91cb585689a2ef9c22dd62196c2d7ccbd1c3dd2b8022aa628862c4269b47c40074f9ffb7064c618beb2c506ad9d61a50bcd9f252b86512b0193559652f02096764fd722903e0550aaf6521f28801096a670e820a6ca1dcdcf7cbd2b551d4e0cee7057081e28fd85413575a8124a1f5b64dcdc590f263aa45d1e0e97bae6ddecd347c1304d7cb019d706866e11667b2aedc4401df239ddbc0fcb0ed444ced2adb96a9f3fcbffcb3e96526a5e46c4a2325c8575a88be84c1a9110eab0af7699d78a0f5a87fb1a6c188c6bd5157803bba2e622f929eb7c004bd4bd4cd7902e6e6488820244f3f9096c4e16f532b7805fac98ce036c12836ab41887a77795afe9ba2366acc117012acb92094c7d11d3f50e91cddc1a088f81caeb3798222831a48ad7501aed11d4f3a419f96440fc399cfc37115903033ec3b8cead43dcd43bd3aae596a2eaebf1a687d7841ffcff64802f780c8cf827f22cd897cf53ad99330b7bdab927bd050fd224783c51f7d9b03c0e9ab0443a522d40352e3f7e7dca443639928c9d4d8606d51a4a303a910cd2b3556acdd0844a3f2abe982e18638c203448a9f555912f0b765570589d666ac5825eb274b9eb60d5ee6029e3331bfa8e952fecaee1fb64bb9c06887a12b9eb04beca9785d28c2c7f5c50f9a6a5cef6aae13e3285d96a46c32fe0014deac1adb53a2b611616cffe3cad07f39cdf0ae47ffb84d8976d8eb9de338712ff70f381b7ba3360559a964ab60b43754b8c4db2033d23183e9fa90344a86d827a019595bc825daba0a46f7b1c1ca46aaf6b08c97a3ab4b245bc36727bfc19fcc603d15818e80522304014c828e298bb0d06f66d691ecfe695de346466d180e82814a7a132481f2ccfdc20888b40661d5a5eb1752b487e3b1dee218ac0f2c0de46bbf07b6548e784065ca0bd61ba823873dd576b8187ddea0e6fdb1b2f9474a1925cf39249048258ad102cd7e6710733327c7b45b5694a0248fc83a2479e49eb65c0c4eb08bdb9f7292f420f543a5c7c13e306059bbe7cb39005198bf3b5cb40a86d6cc18e94682a57c3398671d83681809e5c72b3a24620762a751056b57c68c2a19f3b86ce77bf6aa5e34b5fa1a3a7ed2e7de89aecb661366fd949f804153e90bbdbc42d4fec58010da89300f015e3d40b942a7568a02b2c2f71d1fdbfa5eaca21d394ffb0a6d30c0a3351b22ddc3930e5264b97da2327907f9e3b40173b3f6ff181976c423f51e5093f1d708b0fa38c00c9a7586b8060db19060cb44719d1d04439f3f916b6d989a1640312f04483dd3f0b11a57c63182c3eb19b202a879567736aefa011d6477de3e6d6c26771cfe8639307607a35ac16dc760851b9997063af920d7c8ebd0d6299c3db6393fc0873df62160f7c5a174a0d3e209a2998c33fd212309d5a8f0268d9ec5e39d5d00784a0f3e30e0883bbefcecbf99e7c4c345001ac0e3e5486bba6e1e4a0694507647c69d49f689328e47a52c03922ea7d096b2403e467fe6df269897d97308c1178c5bc447063489656e6f5138e3be8afa6688905200e586d77685b20682d20c9062a2982ed3aee4f12ad8e2174070e04cf8fa9cda67a6ce10783b578ed3b215f92fde8a65272c03e54dd61c1d386828e65faa906a521cd851d08044a65e5a0ac10e39861aa3979204803326f1e7d553c990b49ca5dd2828325c72f56e14ae6af62b25d2c787ce3c8e8736c6ac2eb027c2379dd4054c3cecd8faa75ba5bbdc843d49076483e5d1c5b6c5bcad0ab47c7bc56af2a3ee5733e266ea86ca916621a660b1cac85450b78c9354ac54b4428c4c96b54792934013e870b29c67ee612e5c4c40769dc2ab2122bfc4a9440780644a7109f4a98e1e29212fbdcc078f543236d45ae8e4d6c45d929906b4eb181b27b029e01837c881447ecce5bb65ab9ae8b6e508850fc712e98bdd1f0bd10ccb32e8894bba609eabebe579133686c11326d03cb31ca24e7e2c374fe123607ddfa974483928fb483d28018e03117c8b00111d02196a88fef885a5b6040e37f8765790ce63dcba31f5e73f94f5c4165b0c335480683bc8e32d73300df80d12b21b13aec5712be78c82c431d8810e0c75ed13de953c7478e56f82f4761c9962884d32ae73e48a772571dc3d4adec529f71b31f7c9c0814ca2c7ff06f4475a8eaba24a3a660e1a7c8af694bf03ca3445cad7036e3e57e317929a8b0153073c2129a4912f8a5e0bd9eccccc4521c924f1197b280dd035874850894edc2dc43f94ea764517543a75431a137b97f9b5aeb49f3bd213758ebae6bd81820174cfa2e472e0a1a4a444d4b307fbf3f9795dc0898f6f35241fcfe486bb681a3e895a88e45302822badfe1b337b603968506bd66a5dcaee1e65d368462ec41a39a6941f4516e20c3efa31c6fc5e14102597e6da980f083f7ea6e1da1f781e65f52d64102ed706190006cdff9d23568c88e122821a669af61fc436adf92acf4bcfe25d0f6bfeaf8057c355cd4165ed311588adf3895bca1425d16273e9bc4d1ca8ca8815b2b9fe4de990caea67a07478870fdc4c5712ea4e504a6834afaa1e06287c623db558eaa142c528196f11a2e27f088485fadc5d9fb2796948084865afbab4816814895e16a617e08aec99ff934658fab810b898adf219727911feea9d1c16ccf0c01d662a7ed17bca6139555833f43c892f705137bd8398130ba5856cefca49f953ffd82bce369123d85531a53d2ed7cf68d8e007ae7c6f2bbda105b93043d9c061ffe39c60c6ecd713cd1bea46fe67efa52b45008d23f436272077a425f8bb5f710021d5c04696dcd3b3d298c75b71df98477c47b6c23e9b327d81421037d3d603951e6924ccd5a79d13dc09efb2009c9e0b4ba3258123444de3952ace15beb6ec467fd1ab5cda3f6fdd86e554e7732d8660677511ef8820fd31132189805ac0cae68305dd50939455096690af06d213ae9e1cb7ab5827c04896b42dac2295ae36890de60307c840343de7512c1565fbf9ee438c7864e9c6698cf8a8855f636ae3223f0bf0f4b3c964bae1c861a3417c21aec5a4295340d2f5082da1fd07b6ccb338234b20c5f863f32365d802b9246d4c26924a0b0a71bfb33bd1dc7b9d4c62f99c74082f87af496c59f2c0d0461ce36008ef7e065645c1b256ab9f9def840da435bad03152a16094ac6d51565535a22d2a1e297e27da2d82718e6c94168c134d7cf4c0621fcb2a438bbadf0038eaa21655443e6107fe42c87864498733a7f7022e8e298fe41a3e46d9807566130d25fa7e0050e6cac18f4c6b46e512ddbf2cbc8e744f66243069795ede915021ed33d06b4902265ffc6617f00891bec7b455beb0f27a50ae9f279a6b026939c3a5cab8db15251ebed50cb05235c4e09277e182808f68e59e03cd0262a67b2eaa5e30801e6babd33dab5c3507b9869795f4df4240ceca05fedc5576d133c464535ec461e88762ca95e60b0e4a8b6daaf78cb44db546378bc07212bd27858207822ac7a9ee1f3897a3cc8319d59dc192f9ddd16f6ca79f8872f989588b6dd02159a7b99194f27582fcbc4f4c3a14051d8919e35e2923545a03f2382b3f0324e6dd3a7acb067f4048f1281d080ed755cff33601e6ce5551d22d826791a1ae7fe359a375ddb5f53c1437d1fe3048ec125a4f45d3f1c402b9d9aba4d85dc52a094492a45133799f3653431f047cd82c7c98d0bb17dee14bfe8545f516a5976e0f5a724570c164657b6b1002d519eb8867cbba6d5f0a98605db90537527cfc673d31ab4162c0f01c8f6dc28e1ffe876177954b9d26107bbd2b13b131ae8d3b1a9be02737cc8a647bf384ca6ae8b39014fc7b6fec3dc9055ef6465e180ad7beef0faa580b73d44a348b32f4890a5c6cb58258d25124e5b0c096d5f5d5ba034e99716d40cc7336ae48802df85d90c5d8717b4db64512ae8818ce6f89d42018e5a20f5126e222a77b83bc970973ab20a1ee4486731e3a8b4366f4462d332838de5a8d37a7cff3e5ccf85318de5b3473c102a840baa044ebdfe911e820d035d2f82d356f4fee2dc7b80e975c3dd8f1515d4581699491fe836cfcc6b9148fea733e48e20d38b18a0149f3c3370ffcf123f12a229e15bdd60ec34486d9ee853022cd661d429effc41e2aee43c6ee8cea7043820f7ffe8376bcac18644e879260259039e81a125cfef4960fed0f934e91c97b837d45a21c5a6548891f6a1cdb6c11ed67396fbf326260dbe1a85fa25c25f0d58fd80bfdad313f2748c522c87deff74f84350730f1a38e544acb39598287c1b3a98f2d649af7bae6d35a878d431c6286d119a302b69d56127e3ab55952df8f2c12d2b4197193ceedd1b52de461d3670030343fdff06ef0f07a674b7f34b3e0ab3da2b17db2ef26988c3902c0993bb931f6f46e6ef80234d9a121e30e807d2ec6968c7abeee64b7174d984b0609ec73aa34b4f59fd6482f9512ff368e5d7ae397ba56f833ce5feac84e0711fabee5d5f8a6308335b2edb9000cd5cf2af0d013cacc1486e86e2e9fd95670ca066acebb9c7631bafb44c9bbb03a3effc61ff48edead378176f0587f041a8f36b087af2509b85e7544cb73ccc08eef84c2feba8f77ca63809ff000642c5788a3b2a7e5280416f78caa6d115b4f475cc9afcc8c3e3e42fc3f551af73dde766699f54f76e708e1f87388ac90f7da073816397970e7dcee581a2713594f9f74a31587dc2db679569f295cd02cedddab0095aa77f78b0d89005415b80e510d3d70f81fc4cacc8032428ea12661881333a417f17b389f72307029f9416c94499b921f45ac406bfbea074a1ae89289fe517cfcb5928607d26804382066e82a434f7ad6678df121b9ee5829dc4aadfa03a08c61474e96da94e6c18631c9727b22301fb79dedae8b2136d75e6a0f19de4956d629c543185d074960a102d0f9d2cc671d5151975f3c1b3ea04406966a6ff2cb8939afe5948fa865dfa50f63172a5c2534c22e4bed368259f315e8296a00ad0202aae0de42e1b864a918a3df16ff8d60dfd52ed2dc9de376a916b34973e3a7486391d942b0486eebf7865214528f99146784621a4b6e19586f8c510c0eb252ea0689086f602033947ff11bc743c66e67714b64a186c8d31185b3c9b6f9f7e4c545dae52c52683a59e11ac6430ec9c42ea2dcacb84d984e46b16cc474c5d57e11644d5e307b0f9f06f2e0560fbe91ef008d27a671a79a0fec3eae9bb943e6c35fb65245800c197891a19cc2078e09027299d6215aadfff342d05a5524d058ba7188b41daf8c58b51b049399597495fb66081785d2b9c574c507a8082eae4f7daa303c07963c93cb022221652d765078dca376103a3814c370827fd1b9103a71c3b0806375347af2c6d04a67cb77e3a2bf4396b483f02e04a821f9d5f4e180e9f8f5f881e8236ca77586e66d3607643887ae2b7a9a44aa117c742f8a80eff15f42eec3ac081e792582f57cfb0ed6b58732a0fb72d3adf030cad87881ca2bdd175673265e5c4dd73267947d40567b8c5fff7fedf60991a21330014ddd78b8909104d25e091bedfdcda8f218e4362e1d14609079af167f465c278f28a5238e53d7cce60d47a5dbbcefc35502d879718e1b3e5e8b2df25d9bfe61d7a69ef99ba65e11a914fbd9cfa66dd2741ccf68989e3a80957440d27c4dcff5ba39c898c2e9b130cef1ebab17b7de78f3c417e154951b13bd2960dc1b67ef2243c4e5c232e6ca3321eeb50d0480244315724b3ca3744ea42d50dfd74430de42b8fb0c1cbe724a21bef8bab9638b62cc74d8a0fcdab60bebaa38ea42de741fee961807e76dabf587980b49d366c58b56e7d116faa968c58acd35a539be10c5f6d9695b541a5fd8e72d3b3a0b12195345d10c0b9545d68eb65795a813b885ca08649518f061e947aebadb8f5a30badd8ef583a0182b4162d8af49eefdad20f844e7a3b84df47b6089389c0ff416d8ea841d71d940470726054ce54c1f9f1212683cdfcb0e0567b5b1d910cad2229ea6f98264652832af2b51a415c655ecfc192ff707c209ecdca8809065cf95ee6b47cd8425970809e0f766dcb4716653a965dcf6bf6a863cd24b45888b6ae2b5e2cdc468a0300803fe0d00ba92465ccb46e5e48404762741cf7938f3ed54323e0a044a4e77d1c8d332cfb2d0d2a67d6404461e80579a8e2f8d61dda0842f95422a013c2fb16f95f308799caa5d8d25259a52133b2233178fb11f5159923f488ad18ea01ab6814316a9c83fee5277f6503c8adfde9521ddc6308ca541ba52e7a63294ce11059e2b5982f59a41e2773c811bcaba42a8a004fdecd49037b98005a1a42943c1701391394e4c3e2dfb946ca990b6a96f379cd6887ef267bc0b356e2d288b2093f29f46867f1ab55a0836fbdaaacc8539cc69e00424953c0a7d0829889f231f3cdb0aff35a71b1fed748b8d80e0b4a91780262345ee9eee36a907bfd87053484c710704a084c22eb7534c419b3521797f4c8196c974b3f1d4af18eff705dc7e7ae503ae230cc322a70de89ec88022da50f497b77d253f460bd4844c4aea7039e8c5b03840d3cba2ff0a15c19effaafa3027fd93cd7b3b08ffadb13e4dea1e4e9bf43625f44ebe0ce2c9df6d78bb0ef894b6599e9edca69806e55fac2cac6185e3395d3e067be26a97b6a758851d722c0867823f5b115db31b8850e74f4218e3f53b620b705c38aad973905d0730ff8ddabde60b8c646a54a353dfb8499dda0659a2df7d1623e5592a8129082e1c48f523f2212389ff8cb38ae081332f15e0ffb83096eb71e10797a0ecc1a0fb0bc182a1c81b4b3418cefe6b9d466b39c069eee8705d761370051a1682074a668eee7fe370f230856a0f330e04747c858f929686e3410e9a3700e5cbb9246e5c6eedb7334b319cc76d5d30c8ded6b626d27aec214b364eaa8fbd32846601acdc51e3ff84f3283a0abb315b66173d737314c200f8805ec202eb5a66073e0336d58eaac8dcd308ace2eafc5f50a6dd899358073f2bc4f91fb2310d0e1b58ee435177fce238f16f6e69f15cf23a7c30892aa8547624b14f9a120c00fe7bc1f7505255d92a65cfb1e9b00d522214cc32b7f0b14355125f92d21ee0d6f0f65da33c320cf23a082ca2e3dc39264eaf7f3b6dc45004c686fda8be58c0e1209e6247ff32979f5e738e4214cfec5a478a6e5a92c8c436c60174842eb08dca07b14001287d344b1c96c51e34309610a003036c88c8b97605884cba58ed33e4bf70d1131803d1137437da762ca3ad9d9b14efec02c2b2d38000b36e23faa6104d512de939588fbad7e5ad84748736852ad024a6a9ea6c187ed77bb80a6c6aa095e27f5fcf2e5314198901428fcda430f4c57c1965e89a53ee37370288fbb97b15f4fe4087a4a715d274dc720bbea41691942b8f1c9841a8dca7b4d55e9bf3899f5e44826d30a10e58997498ecb2e45ad32b794740505618a0fa703e5962c6684bd4c6513cd485cb6868c7cd8fc651ee6c8a22adb0b3ec99677b8ded06353e7e9917a00d4b16d5c2e2daf1584ef449cfbd15839860583a501494bd779e935f370cbb40b676e5b097565d344349efa4773ef2f75d1c6de71fe142d294ad21130e88c90ce195a2a0e096608056e3f72e253067d6edace99352a3953bb3640a10ae66cee7c6230016b59468840627a9d7dbf8e03cacd28c0054e3a2a008c417363e4ee0300079265d3bfc41539e9c17d1df4c3bb9ea50eb20a6a5a116a6e5de29d5c9c9ba67a620a38745ebd2fdbfad4479b878591a35bdc65f7cba1497a7b12a7409789f3a4ce32b9ae4c8b34243f49569b03dcbceabb5ea482f4f1cdaa65d4c1ceb349873a1e2165e0633e1a335f4128b12c8ede6c95303daecee286c0856935a7414ab4465ac337c404479c3b3f0b02511e0468033256a9e51021b2f9c6bf3b05a443e608be58fb9456c42e20e4c4be5b46d7187f6d2120ec1ba28d8d5dac56356bba95b431c5565ef325af6c558d18cd8d68292ccbca72914695071bf6929c458d866272da1df54fc0b5420735404ddc50193577b3759456b6e81a81cbf64948e498de5db5b27799365b226392d754d10652a86c44aa807ace821334cbbb117f4e8973e4496f66f672dc630e9ac74c34bc237bee07128bf4c72148f36d22f86db456fac2bdd8cafbb533c280fc80e586f30f99d147562078c47ce2f03b4f20e4be597fe4084eaa8e320291c17a9be6c564df1c1e19ff161b334abb592358cd42f8873f52bf0f2c62aaf41d919c6bedc527a8123628faabaa008598da32d798157ead0b5103c7fae5f11d076fae426e512a66053fa3c82487ec3fd087788fbd231386e8a4b1115e0bfea24660be26cc64038c9263bb34fe45877dfc1e71da8a07fceacf8f688e5b377f508f1ef853be18d2be5bf4abfccdbc0ed5e54cf8e7f3e89eb2182d5b272b23f1931a2b73532c8e1825aa5606a072457a48f848460bd3ce9268524d793545fe08ce0cbe47ebecc1cefff61993707cc8b7937bb88667cbd7db43971adcc2aba56636599f8876ba5c07434f939d844138f5ae9002a0f01f029969508f19b0c795f33afa027acb53d0a56ca3728bdb96b689655c798b22a655fc866c1f3532275310cec5ab7469526f1500989314122ac00e7a297ef80f266d59835d093e34ac27cf618b1ef1cb4a9f729758a96560dd995d9849dbd428c97af653756775169340777bc5fb496058219e87860884dc342dbb2a3c8d8a2644e23bbbd4cf66de020a761c717bac7f67a0dc4747dd97363d62ce5972cba676752378eb05ff8e64e189b96a3d97136e946efc7613bfe2d1f3198d30be6b5f9418e22670dbbd40dd334f2d8e31f8ec0fabd8e1178c5980c64d4d15e5d59b60566f88cab9d2dd51025dbf9a1602c3be5154bafa6e820ec06d0082ce035f7f556a67ab599f2523ceeb2fc55a9bbfc181e03640704da928a8059305656a503016676f00f7686e37c00c5ca32438a933bffe3d4aeed85014d7bd040951a2d42b451a5fbe239ba5b9f2b613a2c0a086640bca012b48452ff8868f3c17f0e0af937fb5a3a14354e8d2f09d97bef2da59452a69402c207b707280831cf97bf6b4eafb172326919d7d59b9b8f2e593a07bd72bb0181fe8898f20fd0f9f6197ab54344007d3b0dfb0425b72e086686265680011ec264392cc8df1a9d79cb4f5c3763e23a55462f6eb995a1032f7d83fca47085e91186a9000014549c5e6ea90a0088a2e2f4c7c7715cc3e32207a49dbd06208fcb7220a1f20862feed746ce5ee7b4c69addd7a0b30c07678c8d497eba44b293d569f1cf4c8c19bd4f60e638f43f5aa61061f7bb764e61bc085bb9043edee2e8470771709ab1083bb6fbe587daea7de83915b4fea622749173b3fbf5decf0fcbaf6db859033fefaed4248d2b3672e5a0d8c51ca49b3497963522303fcb864755c186f5ad5e8db5dde4ea78cb754d570f096b71a35babb9b99512c2c376ef08d686ab191137846f1c6c2db0d1c2c3870e040d9a88103c74ac58103c7098749c38103c700ae305e1bf1148c9b79b79beb1dbf1d13a1a43003aabbbc946674c9529a69359a5683aaad624f1951e92e6f5d396d77bfd7af5fbfe55d790206bb290d58aabbdfebd7ef08c358abb98470b0cc1903f50ac528b51a54abd6bb6b6a535b748a8b0a535cd42efb1daa292eb800eb340d9f50edb2d40d529b7252b9f7d62baac77befbdf7fabdf71eb42cad06fa7bdbbbde6b21b06d0cc33818e1c2850b1742b80b17a68ca81ba38492c20ca8ce99eaa2524a33ba24f5f3d0535dd48e6629232a866529232a9665a92dea7aa6c5a0fd42586b8c35e529232a46218cb0d695951a357677771746086b0cc1b8f9bd97d2a2b6c3a1a221a25fa2a12643301852c156854889880a9114a2329e9dae0e1ea2783185c80ba45f222fa0fc2f911760fcf54be4851753888a90a0d05fa2221db451ab96bb21b20121269750078c64d090293732e89fe714f178b1c4442cb192fd816808e9bb8c6828caf33685de655e008d1c210f41c6c8d49f43486de0c7be3f27e4c9cc3d39a58412be252b56caa7d0bb678acbbd3c305f138d906a5bb661dbb5c1d511dd929bc60f0a6c73b0e68c31ce6dfe906e39d56ca65b5cf72005d241872eb51fcfa7cfe85a8d8c6750082195ce3ee99c51b3d1d6a5ac8930c22aa92d5cb8308cbb1caa30a4f25f7e394d439e7b6dfcf4dbea5684587941e54106ed12d56879b87cd46430c05f590811f3ccb50899513b01e808bd00745cfe329297116d915c165d088a69c4a49f9df9154dd1637adbd7b6e823661eb51a8b99ee93793e989d9fb90e874ff9e88d5f53415d1feb43ba4728314a3c6abf8131cb472109a43409687ee282c0dcc451edf28ce3adb6ea867a394d2bc19ca6236b94a3fe60e6a40f663ab6d54ec09c4d331deb2dc6217607bf371023cac78f4453668845f3066120fd7407cc2dfa19a7d8fc186d2ba0de5a4dbb6835d3a555d39999d4f6e9343d8956c77c40afba4844e3d367e855fb741a7a45e3f4d5ac6d868d86564d9a56996850a7cf98f49a3ac1c3cbcd4b1110f2f00244c48942001157d3a3a8d2a1bf9739f59b9957410475fa66acd900043f731c0f332f3920d02397b5ea8893641fecec98cf19bd7dc600e99c5489d52c83121ef7d132102ab13c6e1c6c1898ead5e4b85321e09cd9cf08eba2df5c422a0ca91c0f97d0430ec8e32890e63ee084e80ca5ef68cac55fe43a7466396b3c39e5a473ce07e18565fbe08b3166d93e2d5b0cc6c8bd971fe77720f8c8d5d57131c6615716e4a1e5432a83927a0724a5d4a7a42694dc5a26cf4cc73c1574b9d198f2211d3bc96d52e926e9d22daaddc0539b493db1fb44e5187a453b01841042d82f430969182da63d9f8431c2d74c2a3b7c961985f0410821f44d4218a9430851281b33ef3dd40e360321dd94092a3bbfeb6344095971a227ca775d0fcb349349cbb0cb0939237c74cae8f0e90d6b3b2071f7d20c4b446feb31b33403b7201fc0e9e1bd37b9986305c2b5dea57afe84707e2c26086360b61c16ea0665d12963a64578bd29d02923d44c0fc21815846cd129afe704b66c9958dec6d289e5c65273b33cc812513586a785acaabdcb56ad134453d2031af1c529e37ccf12b2d23ad2e37b906339e58b904e592556790fabc42ab04aacc21fabf0dc58070821bb7adc4dab76e855454a610d96540e6a495fcd86fbe796082a0f6649e5a82bd45aa1488592279440dda0e89430b2a8607c4be5d0599de521cb2d53a1e49b8fa031258c8fc5284867895472bace936123a3d6316a1da3d63172231decd96875b4dbd0011b9d588258a0c0723e8328961b5d8c0ac6b7548e952039419692cbf9c8372bf1ed3cc483aee71b38321c6fe36964d91720fcb9e580c30574a041f6193d666876c468a21c0676d8827c605790c3e91b5a0f38f828d5bc7d9922ca06cbf2a8b1c223fa6e2c28ed4705a6bf6933fd4d2c47b6d6afa624f560503a2a9c9e591e6b71a142314a5b8e196b0594f603080a65a306cbcaf6622cb7b64a8fb80a57ae3769a715867c7ba7fad649e5d89518ad860ae4e828e503f88e8306c0414b008911c3f5930b82a4723c9930163096b771460b2cb373f400db28b9df7b90a39452f2a47cc88da7fa881eb518e62f07c47b251d882e371eea233ad4965a17c6190ca482296a674a1823dca5ef3d19fade7befbdf7dedbee2906f77bef4d0146f8faba7c7969901c2bcc0f5b2472cea74f862e6fd7db48a35e323bd5ba32d56ae2920316cd7679e4605e93b6d7632b9796c598213fbef6deefb803c022f1deeb6ee7e617457c4220841036afc718638c11c61863e4f9b80b3d107d22845b044dba5af08ff55c9006d07ce08f89a9014a7437c4b4641c64da70e015328390f9253981d9b11d4305fa98f9aabdd27c5be692d2e4c998b80b4ac3b4373542ed2ea28be82242f5aa350835cd57d35c989db7a7009ebeb6888969d5838fbb8e5a7541e92a946e47fd20a2f9a64328d764fa644ebf707b9ef3eb24867d6915bfd0775169c708e239e174548a4af4b4c59e85816efa79189d83a0406fbfca8063c0a0d50161e4224f0c7aa91395a8a82f35888597dc518a252829eb1394373bc875fc1bb6a51ae6591e2faed6d0a27614487bcd04638a97deecedde32c02436b1a865190f330f84677e66dedd442d06cb69a6f9cc771ad7cdbce63a3ef33579b7e333d4672c9fadf059009e25e33acd3167d9509b8d154ea6ca759ac3cb07f0ed9866c34c238d3498f0513ab6c1bf280f331f39205ced5844eaf22ec843ae7b29fed9cd9994124a38537fa55ca85321cb3aa2a296fa6caba10fb609a8d319cb629e35446d999ef3f3c53c8deb525589e6f9cbed07f8b45b4ae7e47ec90559895c0df2646e6898e7cf9fa752f4c9aedcd0aae72b90cb9e30d08f8b8b132f8fcee8e2adea9dd4697a723f621097e74dd5dd2a177f7954ce8e91ca88aa1c7380ed8e5a2bcc762a3f9c10bee4ba2a3a85f7801b6668558c3d7670e4c817c8a17694192587ee5a76f468557bcb0c37a07eb59aaeb2435a6520bc41bde43a26c2fbe7ef1fd7b5bcb4cc00011f08f778117a457140c05f0e0874c8bd97f7e24eafa83865cc57e84343a58638e100fedb5c703ec807f16cc10c85446d61cf79ee96a65596cfd0aa6607c8909a0ee0195ad50ef05e35e5a433472e48e7dfeed2dd6c59d32dcbb29ef51ecc79c843ea813c6f6f157cbe2f74a331728bf35d4b74e837a9974eb7a535d09f13465405dcf3f297673088875c77f13f884928556c4169b9ea3348334aebaae76b56ad3a392b879fceaad67eb4f094e3207e3ac39f1c6b001f3bc10dd5e104f1cf97ebe011959f9d8a3ad9bfbd5e4edd29a5db4bc334734e455dad869ede1b31a85d0a0796164041354c6744d44ae338e460c9987aba71974a45d81c4cb54c6ac21401c098028c7f5ccb8f56b1df8841e5d419b55b2899744e0796161c9981612d9ae7acafc6272c66dad662d3995cf39cc74c268f6e7a8cb30bcbb6e7d86bce074ec32ddfc76036b79e971c3282e873fc0e1571f4589665dbf32b8699695b27c33e909b76cda36b1c0fedd133ad267aa6d548bff6724d93017254becfb61f7060d1df20892b7eebe5d2815c1e6ba26b9767cb83f6538bd3781802219e3a53877479585d08fef24cc7d334964fc0b01969de6e0e23957f4e0cb60d3e9c3e7ac64ed3743257c13a47e7a3e764f1d07fa0f9e839ab638144aec586010f9d010f1deeee7639fc587016be9d0518a0e9db7fa8bf5c0bd177b7fe4ee37beb4220844d4def73f82090961f0cf8f61f3898c6ef4c428bf42861af380a959d7a47dfd5820c2db470c550df074e8ac1df073e7aeafc025b4260d42fc734194d119e6a887ef9db2cbfe0e59435cd8608c3aff6237a07c353ce07189ef2d50f9a34d00f849c92fb412d966360390f699d2eb910b448807d48671f92e3c97c4ce7813e76a41341a1431f932342c8c987f4f671ea1a62800fe85e3b74d80d4464459197def2437a74f93aea96633548b73a4ee3691a6f71d2e976fab9ed0fc9d1d343ce8713cb802aa18933a4581a4115cb89a529c2e8a74b48b919331754e840e4463a39bafddd4da7dcce8d1aa93d6d902e6b1aefed2e845b734260ccdddd5d82541198c83ac99664605cc1fc72392597c7c8600cb87cb91d1a869de90e44a8dd42c1e1399467c73299f5c13ea74569ce5b960ff3ad285b33177a357db7e95bf3eca045edb2df9956b1c7c4f09c1b6d155d8ebda2989fd33cc8ac1391b0bb4b01e6eeedf7208c35b2cab0c20bcd1a638c316ed2654bc90dc3b28cb3785d291c440c8318f61a630cc7ca47aeb3005d1d1b2d1ac01db63bfa10c098b9615e86d662e886dfefbdee6eae2506fabe8f61cf0c60dcba1e1f57bc33400def606ca0bccb515dcbae2eb55e833b6da68ddfdd531ac5b66bdb563d8f395efadc6e7ac01e2b3c4ea080f009cbf218d94d1108337171c983e99e8f28884b68f0ec71494b8f418f72d47e30165a6041a31014929dfc54b1557133d7c52d736b7b8fed0a0028a8999f9cbdd9351a723ee3b62eabb1e5716126ad5ed5a461d7e95a1e976b3cb0939bb49aec74f2d56a4edcf67c31379f47d4063fa27e20a089a222fc737862490466661f28e6fcf0b153ab5ac66439ede4cb766d0040c175519a614e1d428cf2a7de8dea41f8bc2d7cf057ebac9f16f4b1d3e34a83dab14beff99c61642dc677097119394c440670b2214537990ece4324f65091405fc2893857506623b5b1d74ca880722461e5e82a18353acddb78b8848ad44e0a49a1e5117309ad20a9b8845c9e391c41ab6348ed56c011f42b1cc5bc145a1d2d857004a9806416183f06b3776a6af94accf2c93197010aa9fc27efe0d399981adcb3d2165737dbcd6a340ae5366cb80dae06d7f37685d3bc725ab7522f3595a48b738b4b323232e22d88ee2e8661338f614d69ad95b999ef6ab6429f39c6b516dd450775ca7178476bcf778ac341e90d2e76d2d3b1d1d91940422e2e352ed0eda599e665de51772152f9a18c754df91cbaf06febd1a9a24c8d288f40bf03d7396b3bbcd7d3d3aad67a2a2a8b8e7b9ca712ac5002c90a2590e875093d10ef2ea11ef5393fdfe61fda799faf03790d380171ace3cc079713eaf68c541b4b3d191b1e69cac656635bd976ab4fd98631698c1454a94f8f9ae652ab69cda4b5d65a866d526b8b097649e9daa4d4b36c1ba3d896f3f464795b9e65da6a1ae637a9d7fcd26a340cfb8b52934f9c5d9210b39ce65d8d6a9511b57dcaeec1fa4694872b23ec9e9eef225b26297773b5b6bc7ed9a3be6b87ea3297940b2eccecd897563d74e9cf177a479f7cc5aff315cf4ed65b3681696354ab9d050a159572a1ce539660cca25643358799065dcb79d39c73d215c73ce7a5ac2b529e7cb558b79c8f27cda5e6340f896bcb3fbf8e49fa2895353cdb6827e0f9f42825a53d24845edd8575540a4a87324253cf1360b24866978526d4ccd925bfbff4aa5f7a46e99c73cee9cf4dccd499d217a94491a0df2126a63011e577680453be83013bc9f0d23dfdf3eb5d3f591efde497258a4ac37bc0ea6089a276a9d47b61242e0e39fe6176b2f4ebadb33a164951945814a344d9d54db16eb4db4d26cd6f5226aea5db5bd34e94d2a7693eb72bcbe4c9fbe4dae93a71342dad0d7b26c74e0ec434fdd45b97e1fc1e9db6556959ce6798f496402f69b3f4028baef5000845518aa29cbe73fe6935d776ab2cfe271344e62b27ed04581e2b7d6c3dcfe179e937a9962925c48e2e871e637cef01795e1f7b8ef90e1511fa9c9f5b97e1bcb5f4127bd80fe4d6f1ce430eea4a650a51154bbf442f98f2f597e80551b431aa0cea06d122b59856ad8fc87902daa5c738678f1dad7a3bde63b0e8c2bdf46a695ab57e84112441c1110a96c01c895a60c1f366208564524b9091094920d6b19450b194a001808e824e6b5ad3064accb08eb0be484da774d26073ce25407049921b4cc6ecbe9e75164ab7446bb4c41632343a2ca1039dd3efd012552cc1e48985d2067a84f045e62f964002851428800ef0baa88748c9e882c2ca1356e21018127809b3f305a37cd2b2fa07326666c7e426951ed2d78e991e93ca15496cf1051464407144ab62908678e08a2a8ca63083093b6364a88cfe0e297194094924507a5ab20316ec5021e50b22184d312611507091861311b4c0c788153f9044c0a28b235d9051c4d01652ba08a638c4048af093c4072df8220a3b50028c1c2881845d52cb63fa941c9f1ffd8eaa2e8b49c7095d72fbeb1ebfc0dd2c451245579c60c98d1676f77517dd15d81c93594fde676aae7f8e36e8b7956c9491b4eb1d63a38ccabebd44bf046c5f7cec9389eb5dccd32d5555ee33313133d008e1f000f661038d236e567a81fd362e4d9820e5c56229e8501243763254269950e5ef5012423c3b1a3b2faa1c4a605b3df88b2124a864a8ccfa1d42c28cc88418585c606808a191052f19d58a6f1cbf43483cf9fa3b848493c905b62fbe426380adefcb83b0176a10883ef6c1300684dac5279e9d3d023db13c6093a0e7e012be83f97df13db8c59e08ac0f29b92042105d4044e9043d404a4be90c4390483105511a53f86981b442c69d224d141162f403329674ac1ad8e0dbb39e42e6440e809c50c4839f21943089af48ce114514e184218440c4094de099184cc10a15f4f47bef71c7ee9b997fde38ef6d6a24e982899f810e9d1fb3189605042b844860032d80c08416918b2b0a591f24a18a2e888842118c14617134749ba1554ba40c68ea85c000da40080b88b888504207377e879468f2d877a9ef524768e1a200a02fbdfa81483022944bb5caa50967604d3802b536b738f56468de1056139a4069304a69ea9d904474021332d007d7ddf0f745a40471880850f63b444489c77e8788ec5c37f0ca95fa53cbda3d059d9644017befbdf7de0a3a846f210ed6bbf7b4f8b7420fe43d0821e4a7fa17f30f3a148261399a005b2dbee31f3958d8c066b590d1ea6d5f0106f8e59c2c3e3a847e0169de67e28d0c9f80edf2d0326cf7dab56877777777b7dc8d90f66abdbbf6ebeedddd355950a0fcad280f32eca92db06d15f3cb86503bd47b47579b7269e13590d3cee1f0171df1f33b7404152f7e878e58f22897d494dfa1bee343a022ff9e08fac7e1f46f20f55d101d1d9dc749bde95b78ecf24e7b1f5e1a69fc0f3f44bf365e1d4fc77308b31796a346ea7bfef78a1ed4b1a276a9eee5aba3bc472d02422bab8f7bbce2d1351dde8957385e3239cd832f7fda4c4728a6b2022ab17bf4e831e77cf9e1d2840943f8c8b5fcf8c8b544cff9684565ef1146edde0e1599edb15c073ff668223a44ef08395e0115a843b110ca32175a25f31cee68988e6955cd0b0c2e50081f17d32a1788c0f0ed422a845876490bf2400a210e5c96503e8712f598d318ba2a0bc782efa915e4824d82f07b2d36d3e3e41c90c3c6ccfb7ab45753f3f61ebd6aad67941947c339a0557406413db675fba4072928ad35959a99b192ac24ab07cb4215a1c506b6d8c4071255ad62ca3dc4a076a9981dabf9e48b356bb0785c8a9a3146044e08a16559944a8108b609a8312814ec32c9d98542bd54b6ad802d9f96a41256a98fa152f0ba681a887571eb588d65319d935bf781a75c5e82625c794e8410e5e920f975228427dfde4b4c7332519694592ecd0a873957b9dc0407d92fb0132e40fbccd809b3536637b1b364d628951cbfd4c32ddbe6d6f51384b84b1175b7a5a4545bc98a568c41ad9442a3765cd4ab7d12e531522bb154a9493a49ab98f492961ff1fb09fb020edc549647cc7e9170e01720b00578fbc50d8bc33e6075ecd147a44fc2848d5ac571e58c8b2c43d12bcb90c8ae9a6d2e0dd318979a5261abfcba1c7235f5b2c6cd2565a4760588813cd8eea8314e297bed55639a3f15782ac79069db0a38738845c722c41e1677d6a7dbdc9621cdde7b2894bf25273c3afff2eb644894a75d57a59ab93cb3c0ea78ce3c9c71bc53e3079586d2d75076e31c7103111f3ec1f68566bdca387608c509ab6adf554ce20c068fc378efbdf7b8c978efbdf7b8c3e8f7de7b8ffbbd202cb4c822680c558ea22254a1822d468f151e2728e821c6d1cd1e5d604c1146184c053671e408a63286ac528c181d8580268a8c708312e335155530f182c6a0145297479f9de26091ac294a5cb0483892a54dd5d1d17932e9c4891ec588618911e3b1ce832283808ca4904163ac93d3902d84b04ec6883d3c64849dd833064eb74e67604c01860a6eb21401c098228c54af70200e8472096d10b618f2ec3be87eec40401b1f22f860ccb34c01c614cf39cd7c04061b3b3d8ebe5ac326622384934a3939d9abc83ddff5daaa2765dcb8cbb5d8c42698400a132338112505462908e2ed862fad5a52f3bc5b1ec745e934ddd2c3b7f783de1e9799b09c516fc0a0b26fbf97758a5f500c17402ebf434df094a0e777a8043adf594b186a22c93ba1f33a7e8790187dd21009903a2a0d91c0c9f70e35e1a48bcc60f25d94d18c24cf9ddcb1fa3d66cad556f584f2ed30095cf2fd923c26487e2091d71e84d5c17284ca8254bb26fa1692d2aa6ea4ef242655ec149992c3f753be6f7364ff86efb37812294796a820a902e5fb367cbf86efaff87e557ad3cf674e24ca942452769814790cca5b406f63e4e8a7cedbf82c79f6fd192c11cf3146d586ea7661e48aa752bebda9532adf4ea5f4aaa350be7bb5432508fa760aa5575d548ad2abae858ef805251d9efd017a4b829eccfa68974d90b40cf4d14e8d9647cf5c9a3fce7574a705aea3442c701d2d5a81eb66926f17ae9b412d5c37a9a8c07553e9db6d8e2ce95534c1efe7d86c8e2c61c224a857d189df4f6d364782aaa842a75711c9efe3d86c8ee8ecec1ce9e9552cc1efdfd86c8ef41c2972a40852af22097e9f65b3f1419a32c527a957b189df476d363e493e547ca81c01ea55fcf97d1b9bcd11a023498e24f139ea553cf2fb35361b9f231f293e527e7a157d7e7f65b339f28304c9119e5e4523bf5f379b233c47881c21e2a3d4ab58e4f74f9b8d8f92cf92cf9291a45e45267edfb4d918493242c508959f5ec511fcbeb6d9f8fc204112d4abb8c4ef679b8d4f501555f8f0f42af6fc3eb6d9f8f0f810f12102a5575189dfbf361b2350a2443182d4ab98c4ef5b9b8d112423538c4cf101ea5544e2f7e566e303e493c427c951af2291df879b8d912329528c28f52a1ef1fb73b331a26464c9c8924eafa211363e3a3b3b4b7a158b789f254c98d8f8f4f42af2fc3e6f363e457e351b9f22ab639fa65f94203c92efa2920cebfc380182d27792cab7cb27dd4d8a829c7c2fb922554565f2cd9384469152bea77c4b6845661e1ddee1793251a961bad654ca9ba7a312cf529d5c17f352d42e2abd538f4aaf67087466101f7db508e0d0df79fafc42a49d10b550ab6eeca076b585965a2642e9980844d2793211e9e954bfd103bab2adda2e9bf2924a232d217551292a217d2b396955e328aa5d0bc12a642539c3d4e04769ca1296a4287aa240c2c21124499292187170f7bdf738caad43c89199b31e40382d792d5d96b5afc8b90e4f3d2e075b15535ba9bcaecc310969cce596ead5fae3037f5d1ee79c5c37ddba72b89c351bae1f156868c3f40fbc6cc955aec21360aa554539a9679a0b37fc7b51f94b0edae6e22e17f8878aafa26efe65b5877f9ee17c0cb2be1c04d4182261bd94913d193ae9a424c8f18299211b6430a52c90c11394d0c248952251884115592c1108d08385154954a1810faad019e32e29fa42e38019689889f1e981cf173e34f0496225c16c7c81aa196d1e3cc8e203b56c7574f23b9cf7cfa9103048024893fc3cc76bd65e8d7a67791721a5d4b2fcc130166394b23e187eef750073eb175b0cabb00cb91b5cd58bbbc008217ca956ad207c7005613bed158c542a01774e29a5e46236d3aa4769ad73d22d73595fd295b9dce23ae994cbe6263959e1cbf703fcd8f5f8c8e1c48f51409aedd2aad900812c5759a0017c1deac57d7949801042286526a53479669232cba8dfa43e6b9194c6986559e6cf35efeb724ab5ecda6eb2b738ec071b9db162d369af34306ad6aa884acdee76b9a355d1e7a43e2d8beb7aecd8f1313a2afa8baa5773caf8ca6025e89c049da9c0ec1fd04322e638a991a81deba4d0a8dd4679e83998a818864d97b2059dcafc23bea42995cf7d2f50b6d1d236eae91de940bcf38820e995e460aff67f2495ed39dc04d1abf93a5c60871e7082f44a725d44d42a38a107f192644f51a953a4c0a424a19e1c96931e0cf4759f229f80df212340788c7b340cf48ed6754229ad359552753149bdd430d08ba488d4b703f73de949176b35ee118ae54df464baa761749e0c27350c74a3182295a762aa8a52aea342b06b22ad8c9ae4a143a409f4440a9222a32847939354c14eac8d23b7840937e12be893975cb74e1e9012b63b9e598842853e7f878c40f9ad52a3ef772fd137761eb51aa8d1c05056b52f83913256b5dfbd7fdb4bec249a10f5d149fabe748fbfeb9dac8fba0c439ad22aa6459ea8555c54a55a7ec305b5637696a4daf5d1e42290352895596661f67a328f9378b6c1debaf91767512972e442855c6420fe91dc2f66dc47494fa757f0c952af1e3315a5d742530a18f47dd19ed4e91495babce543656deac6302ceb18638c2ea39fdcea70f84d7edad6f44c5bce3f0d738865d84f8c926594347b3b94ec903d60d7a882af8b60afc85101b41aa86962ec3ca754282e460d4add4703935a0fe87bafd9c4f267592b8a5214e5caaeb836b81aa9d44aad943669d284d25a1fb71d394aabe29539142da8a2b82cc62853a9de151b1f21e66ecd5b4a2d321292124fafb4662abddae955f3144ee2a5d6e91c4d2a9426d465ca3439ba9d7552931f38eb187d535d54e8dd5279f299bfe84182d076da63a41eb52c4372a40713919e4ceac1c4a6fba8348eb744b564680600000000b3140000201008870402a15844a0a99a5e3e14800c86904872589bcab32888619831c8188288310000000400448846230008d9e1576b798a722338b150b323ef2f255feb28a2c76520351a52ea0f078b75a4c8e6c5165b11260573478417548d4e75c83456e12ad5624f8385dbbe18f4ca4749c2b20c93385c2c75ca67b067468862a656f83cf39007fbc638c1424fe04d0e3dc70719bd1299bbe25a6a4b330c8b1ed13c3192b658d644ed23667c38997b377df5fcc311bb76f97c023f568a68fa7d188cba174bc9e905e106105229127a89bc6444af6ce88c96e18344bfa72d8736cb1f9114a55a1e2117b2b5901ffa46f6cb35eb6a47d29ef19f287464382f9d948ff5d78ad632fa707add957c97f6d8cc6d2114fc0c9c67c9c2b740163b8955d48ed8722f2eba99881404b8cade5c44da42085b8a8c94e8b77d9448232496926e25225164fbf50aa5250b7dc85d27af4df91f2f27c9f44152227abb9f4a2f057d594420e37e9fa51979d245d253f6f282c41aebd5770f59657b6932bd81e49d2a35550a70a68ed13bd128e34cdc8b505e783313ca64b83437539074536b82a430ca632bc128d8bb3968adae8cbac92c0da6a46eaa7c88faa35ec11dfeb81ad27138ee5189de0165eb7bd348bf6b1ca4164da004db5980498e5c96e8f3c527e64c31879d074a44b3d487071ee19f72359a0334e1c8aebd156d24d59dfdda798d38186372bda8e8e69e4f144a30a04df6f6cee7798c41884dc9bcdf65abf5476c06ddd78655654ca8d25ae7733c647d8875e5a336a9b61b72fdc1ba634c3071573fe4e64cf759d5900bfb51de3ab661ddd0ac8f943b9e51b96a3ecefac4ac2cf9290d53cbed9917a8ec46f755aa94c74518c5f419e5b219ff751760d754c382c08ec31a5b68d34d146c51c2604b00431d192a3ee5cb105ea0a8450aac91a688a531e357c2d5272c1c1680d15095c9c611f3e3813b250eb981ac5c2d86e27a61d4795d8c47b55b160a7871ded410ef97228009a493913c997dc8c7564468f1ac3d3b6b1e2d1b821cff2088fc33dff1071e6444b4527c05fd39fa64b6291334e6b8058d63135d98ec4ca5c162342639459394ba9e8f865962651c9400f1a03000635268df04329a6a12af8541cb523ff957a31002843937cd70e8985e5dffb908290ecbd8c58d1850f5476829643c3b859e640b11a44452ecaf8e40e7795cb6464df970028cd57fdbad779ae43dac0a1d55e71072d333a66fa423a5b06f1fa036121904786374e6b786fa7c2ca53e58c135ccb1ec829a0f74b12b33a214a7c8159dc37c7f86919698454fbfc679340c3994b513414105161b9a53a6a082466b3ad5135150519c6ca93e1b7c9b0f5a5809eda6f641ed7c5aba46b5b9096c3d3616d2a0cd76c257d822a2a35534ce0d34ec5dedcfec48d0f6d0de6cec1f200b30476d19c1b8fee9b1c9c514062bcdf01426961ecbc8b605db93cace8f67e6a5758ba5d4e6944049aec007d7ada1b3e610d7b83c991d0095c6a01e9add39aee71847a26f77711bb8c467be4c9da93fb63dfd4254f85542a9918dd748b0a5a7e195b068f70949f80e6a2ac9455697a14ad703cd1157e0c13b5b0d233e2bd01f9d9d486bb123e286bd78fe7a2c5a6b0f088b07a53636bb717cc9cad9dee75420d68a2c9583047cec041f5884af8ee12b10bf158da567c15eb606ee7333bc9e8f1ea0930705ac02f9c0b9670c451fbfc1a531a19d58bc069b40e73df0e43544a0351257dba4bf353e67d59af1b20d7b83128d96e78b9efa90f83eaabaa1008f74e9860b266ecab8f1e36a99bb38b74f9f6b962d76b1128d2a130a007488c53f3372ae2731fb3d0e9158fe9e3c20a0e37500894346ebd4852ac827375e31b6ab77e17a379ff4938c4250d6ab2a9616ebf6590382e66aee68a6b6b339b15ecbe47ed28717aec650cbea58d02d44864aadee55dc21d2628e43e40667203aa4723537710ba2963b0111577a87c810e2d500b45ded4b9d4364f0ddea5ae426445ce1186242cb57d322671252da1484da529005520dca83900e607f53dd7bd84ecf396107a763b3331c57d9b4238ec809945001166cc894650028b40ca6e7d1ccd0d6420c2af2a939e08befe7e3c9b25750ffa7482db3f71c6468a41ca5935e33a30742e48c3843b9dba7c780a56ca83df5e95368cede34e20071309841440be10535866611e80878e916fba27881942321b6380d648c847e164788e7c542eb5e93868a2d581133e0323de955162b9b407a0b67aaf20623a27dcce93cd7fe6b740977d68a25bfd06581f1ebfdb04bf86f5d3ec933f565ad43cb7ae2c1ada00d03af23f4edde8346e24f206e3de0414399811b54e58f1d72b4a4c5caca3b081c6f20c4fce986a77113660e9b619917addabbc14da2db4c2d32633b8f0083ed06c78f1918d6ba0d55bf838402467ac8c34afdb2a8a79cf5b2d731f5e7bb65c999fadfc90d3024c448e0a2a01046f0e1340baf1046ade959ba722de4df7c0fbe35f2e960320501d42f5da2a6b942d22bff9d9c264be23866e48aac8fb997bb73f6902cb88180d41d72a3d4f7ee504c638cbd38ccc220281d84f83614499f9d9899ec8c3b24c4f083573067365f899b4be8eb62d399d804fbeab9290de1892fa2d9caddf75c9486602217bb11d9d8384dff22b182b851fe5908c8519f28b395390a629571c46e227bb194b06684ba34de9a37403a79f7b3203d47c8dd9777a6929a87d0c5ca5a838a88e5f389a31f2af630387b37b91bd0ae10e2e066ec0ea59297d800480513ca8e5983c54d96ed7a5fdc312a13f075514cecb9d87eb6e4d45a0e726fe061c3153bf32231acd7b3ef77641b9f9431b4513502b7df5d7934e63bb599b8c33079a6bd24f81e79e6b140a40c2bc8ca33e705c60a03cfaa37de08f6744fb5922a5db9b66c8de8a3b4adb7c55aeb4669915e7ac5605b5b123d50d813d1d9a668dfcdfa261e4623901b52d1e4806dc6ea23398d5884c4beea4e14b22bb19e02a0c6229a7117a303288a0778cacae0dda979df080334e7b440d08afb383e64bcd36f60b6192d55be8dda70664e82e40f49e1b06151759f2f6aba824c731d746cab8c4050d040771c301999d04f3984552decd3919df52005f4da71132a39752e09645f2097fba9fa2a7f059287102a706f17c84c18ebdab06887619d70f613a7649842f9bae75c3e02921cf011a2aaef29f27917d9c7d086d09a83a4a28d679de26c83a0b741aec54f205c5ae1efc657bce014b755642119b9f96b23ce04220ccf4253c23d4a4e3ea9fcdc44c048080c46ae2f780d622588d36006192f881747a3e0697b778d3ae1e4c436d4130a6703884f82edd1d671c39b773f7d6dfec81a95a71d102a3270d410f5f760c76ac1978ef60d25e609fa37095f4b1aa48d5446e98f8955c1f6bb81ce72ab7f36d50850f0d07f6c10c2eb91543ff32a4481012acd4addc21856eb6198192ee4afd454e7a99ec0c43a66e3b4a245b7049e8d7fd565c0d198e8e1dccb88c8ee2466c983412db6d9760d481949a3b38063366e1a480ab10ee271a38ae92834661fe1546325fded9db2942e221bfabb6b2fd2a1f57c236ef07077f2f27d2a7548f62c2ef1a6bcb338d1380adfd8fd5ea0a8e85d4c90a6f889e22bcaf4c6acc50e07969b5eee04f9eb6977ed78f6bb1de5768175bf090930bded085a69b5587c8f4647f92ada6522d1bdf917fe8a0914ca461fce5a393c47675fec9b8516d9120cdca5eb29418bbdd66c108a8fd1a229cff260eed2c1bb41716480a28870b6b0c8b7bfb129d99c62ae09c9e540fcd83d989b814e433616674d42b2fe396f9a0cfce43de37b51370b7c9bb1f27addadc3cd22c7a26352c4956ba835ab02c0f9374b527f7635c5b01de0611aeb6d16dea130601530d32d012c685703c687b2836de80be934efbea446662be7ddb08ac935d1cd1ba5abc0bda9615526703c60a68df17cd7b26157980f3147051ee8e919a1b59893dc3835c57da2571f89150ec43c05a5102ca202649e57bbdc624a6785670e224cb1dd332163ddf598053109ac42d402cc76a6692ff36344e43d0db22ce2043be2b513a152c0e71b038b68cd2ac62c2ee86fd26c977c835754883cad5de4718fc4d4001af6ad0cdd61128efb6e3ded8973a1f6f8eef3f5cfdd86c4438fc7cd660bfd08d45a8ac723c21bf275617a2c6d42ef68205f540d314cb8961cbb9340bf6df362b4ccd2edf2f2b8d38c82837a3425929c3c56769a0fbac1445cb4ceef710c23088c0b435ee05c52b229341a2a538ccc31c7478625a2e3c291a13d17af6587757b6b59be684e2b363de0d4bc32c21c5e3934b2d3e16be0d94a3f3dd720ffe18f68c4518f7f964adbf7413439df4687c66a271efa649a31b731338065b74928ca44ce6e006ed7198d3cee7f762c2950435eb4e6ed5e24dd4898bfcecdcff020ddc0acdf7ac7cf6b682750af3a05a5a8de0017425a4c86337a461df36c7558e3430f8866f5026d857661614c8e018a37b825048cff5bd72cc0903793ad33b4bc7f03dc3363444c3143bcf8b2712bb1882139ac6b0fdce061ad182728792097e08a760f911e5ac998c7da08c8c192179f507437c86061182682a657b941511d03e498f0011688b21ec0ff752420ffa762938efa7993345459a62adef36d906f0ae454e84022736d9611b6432f3f3a401cd8823108919566a499d197f974edb06d8c121d650683a059aaac2648754f1e88cc0a25d7d8b6ea85b644d7c7d2a93e9de7911ca70cbaa09d9c59f7c22c5f151638362dc6541c8c2457efbf5483427494603fff3b00bca1146430e90cfdc599ea5bf8959f6edb863ab5b523a8f8cd4c0fb3c1686e0b1e8026150185eec2a33c4ef81ab6d6e3717237970d8680c35fc5764a9919de498a957c1a6e24a5b34252dccaf74849b2f662f677c7dc2817675f3190d6a6b1f5eef0d79cf4fd6c7de2833c0518badce2c27b20413bd882df63db4f8ff01b55c1b153dc0c0dac161c7a067f7b2274a17448632d04538a8269c808a583b0d4e13c058e398bfb896431d8c3d6016fca0063ce68cd2b5fca531880958f701d1a0de45fe64ac431621aacd955044a606f41e75b341636f7a6c6265817ff1862af729b59aa6e53849ccdd2b07c6e1ee3b7a206fb697cb6c74775a1ab046f7ddc157c6158a27c9a51436bf9a3104c20831f19987bf0d3d00d4ef23f17660d3a53569ad028a72b3f6b22ae2f89e8545f4c5943d7d667640c5710bcff6ac04d85191e8b922f7ee3acfc2becb964d41f8bf289414388616288cd30240f2d3197a0c2e52cf13194b82826ef17b507fe3119174a7ebabfb86af9ffef2683f8cbc16d9722387f0d83359c1a958da717c7e949b56c1de96b2091e03766de7fa081a45a0750d310496ddb0389a304b323d3ba980ba21568c70e51d9be3237badc9bad620462dd3332712756bead4e5eae1b7e1f26bbb796056a71de62e954cc56bad0d7cec3274690238900082697e5f0f3d3ed0240b89fb9f0215bf19d21f915444c964ca19777d1437e97d54c891710d4d0e961265208d20518a585a19bed5da17d42bc44302b6c2eda0d510c0be8fde8a322e44116d2b2888eca986b7e60ffc5a57eea13d24671c05be87956917757cfa31f7603f960811d01de8076261232d083d0d3497c3a09751d8cdc4dad0693218d920e040d243e16a27a91f67eb63a72da24d38ec0907c7f8e6c7f25004a016d56ff6b4906c89e20ce81627e25ad4d56da3cbf2b3a801d97cb80e1906896aac1d30a30a66e11993aef9fa76f2714ae8b1272c3d9066354eda853043ed0ef75a21ff335528c91b43a7104bb04917328cd535ce52630d5261582134b43e2801a416f0a3d766b5104efecc05ad7d518fefd07ceba492889d529737fe21b05436f26e6028782d0eb0b9d3d408a556ce69d64d4aba4a2bfee8991cb01f47ab47c912aa3f1ca1b1dbe2c87802403bed0bbc30277f1ba35efc77e203cf6a040252fb2438a451df5d6c8c38230833dd220b2783a0dc3d62d3ccde43e98feb79d6f7cdc2854e31059ad1ff8ebb7d94894c6e780397be8dc7c2f7940d25d742f75fdc8cee9fdb08b9c1158221d998d9c8559ce30e261493c40afb70eaae76cda610cfd101e6cd938a13ddd0c4c6e847c2b7e991fb90db4c2d57904446c6d04258443c2f04fb6181f360f924842d9fdf06ac681796a793985ed7a194a498a804a9da426e455dc858baea67cc524f4b0f6d34f6c8fd21b84c8da476cb0eb779fe1ceb5ed4c2028c8275fd57b8515d66e9531fade373161b10b1979eb4a579a797fdd3098202a51c4a2baef59f28cf8d0f545ca0762b869f6b66327daf910024c561f732e938841c7a73d3aa745b28e0cd89d5fe53387a5aa1055acc41413e7b9df8a0e4525c879a85c7209b11025ff0c44b5c97942a1c1f186b4fd64ca90cd6702e4a5c010734d5ab05ae414515dde0284201f1e5cfbd535079427c4875455338b0f103ee7e419006e5e6b291719d43f7b7cd2a9d284be8b02c395db3ff169bf77ee55dd214872ee87c7cd6879c909ca9e473621085f0ab616db247c94b51a738edda09e17060e02952b656cfac5c809ab97dd45912630b8ff6c659945337ed70e0ad7aacd23b664107310b0b12e47cb00249d30bebe20690558f6e112f627ab293bd75ebd4627fe3c55f4c9e6e2fad9c63af74aad22cae1debf8fd68fa0c678fe69632430f501194da25330f23ac63adcb795fe4f4d51d0ffd689f1613c0721bc3c23bb7a3bd53eb7224ce9022ca6d44f489892ce10fcf4fd526c3d53532ec7e90d2ae88f7ed7b43eadcacc6ec84a87bd345cfd30adb7974e666915e7569320704e3a0450dd7595a9ff495879867a1b4b290317a9ccaf7b49c6e22df96e91a87c62f31b8e3f96350e74ae342e400a7e407af4e03b4a4c878061abd8d0502648ff73db626a6fc40919d645e257a35bbdcb87dc7b8575fe77cccd29376fced78511811b630e08651fafd33ff680b9e9ac6a57bb3bd01db85d7de6d1bc9023454080a6da7b15fb51150077e6d1d34aae8597f27aecae8adde0f3b97ee40b9fa4dbda9442027f7ab326303a2ac541a4eee06f69878358a1044eef014d5582ca34a0802d504e6f221ee4559045b4bd2a19c4525b608428f132980d10d46dc84ba0b774ad1048c9dafd3f932a9a0f1a65f421c00a121f64fc59b670f6fb9829d375f8308869a8d824ee9f169a3f082fb6076d456cdbe60171e425251d412dcff22383a523026f0a613ab9e12dd074d5d9b2e8c84c0c8f170f0fd28a25be05bfacfdee135d24234ed8ff68972a27aa0046a90b2f266a49c97e5488cf1080acfb6852c773b00e2ed5b305dd620a5e27ec3a1acdaab66422420836f8686e8d4d59df802ede1afc9403a43a402a9ea0222831701b234c026cc0030a02d1d07ce5c06211986cbcac0190425ad300d990ad8ef9b43d4581eba26275d69d4608b0ce2588109de0f18c782451e5abe0bf130cc1b35364dfbb74d662d1baf8840c490f23591c3fdaf4f04f66e0a2d1da2fdc3926c0da3e6bb6dea547b5c298a1eea82394e946efadfa31ce788fb909853aa804b414577587c51c025023afdf3b41c574fe11f8b2946520b734adef2727e5b6361784f0cba5634f0f02a0dff362a53344b0c9ac284d781ba5a2d08e760ac3507333dda592dd0e7e64d2b59bfb9cf3e1a97040b9569f74c0b7edf258bc7b02f732cff9cd8c1c2079e8fe03b185409c6e0adff87f8335780697a636ba4b525b4dbcedbeb08d8e3707fe2c92a022c81ade33fb0c139eefafafc3504cca6a469e2170f669343f33f263515773f869d77495707ae2c4bbcd5c385816ff16a99e5584c7ca08757e26cd1f46923e4ac44ae13a5563996647237781c8393232b7b3a518d77926d80ce179ff68525a735105aea784ac56e66a23d2104497345fcc2edef23014b0ce84c55162e2959271522cbdd4360d76c9c722692b3f67c4ecd6a1d778fecf10afe3f4f35b99bb0c2a1c8c8faa3e95aec8d865fe01eecae863773995978fb0805320b319c351cf7f91031d1cee90e4e0ca36792693aa9a26d6fe4888fcf036b4b9ff1c106b3044b7b2fe2a6351d452800e85a94722684ebe9964d16d6100543bd538b2b9b480241d006e0fdec8c840086e46ec5607f58d5dc547116616ea2bc4504d439def87aa216fd58cd89fb271c1701176bdb62a679ebbe58f8ddb091d5371c4ae5ed34c9f99d4366f234ea65556a10697d9bc9f3595249009919b327f3e284aa4eb5f83e36dc7bdc0b3dd272a16856d49f4216a9e05d2aaec17365497b6a5a3d765e9465e3a1a4d8da449fdc524d42f1aa36973ac547c7003c8a2da44749c13fcda908e4722e7e88fcac982ceffff3b223416b958a2ca86807f716e5689aa31639e77946d9377044237a6d182517ee2fa4a1d04a2185b0b48164c4de6e52e3e1bbf3c05eb99203f8e862ac94d27ea7a232a7e6a86514a000f7bb4b01e7021e19b62be79ab9b1a4bae0e3627008b915657d4e2bddd87f07ed33de19a39a34ebfe6f09a07b4caa43a7380ae9d13e5de041ba136a0661234b483cce2be45e4ee0cf435a1d68949d4e67140fe90b3b08c63b319f1e69e4cc53819be18f6560a9030da414efd5419f545dc310092fe09c98edb553f551f3c046c0482416ccdd6d6de4b397aa4e0fc692d88cf5f80a76f3df39bfb203ed98922b840fefc77935f326bf692b341143db4ebf8d14a85917a73829f153203400a513798c447211f94859b2625e58d180fd4418c80ce64f58f42fd5598acbbccad2648834561c6904384b6215d8aceae3772c1851d46464bcb312c7a96ee332e2cd5aecc6921cbdaf7242834252ad106b43ba13d2143053831c3a4267e50b290a051db3e70f5e2228121ca4ae3019ab0c884c9e484876df7225df15d7c35a7e45bf1a8034d98503e9c235dd9dc7e53dc474d6cf070ce37e9821f0f9b28ed557852c520ad9c005802deabe07b9a438d70e8b5b6ca15728816a3cefc19245976c5a772028aa4cb912870342ba0b61f2e71c2221d4d5f56d8953ae88aea6fa5203e7578882551242675b567bbafcbbba14c342028e7517a3ce2bf523a5cf7236a78dcfc2530abbf19b5d6ab66b75be3f087172033da51f91201cba15c825fe90a24a558f06c0175596326debb37dc86243cc59107e117f7636787155a8baa883f2c8371409590a0c9269ac906cef1ca13c126c6d7cb1c568160f6ca4b2084c2702d425fb4d9ad25c53c0ae47964c7309ebb0827dfa3b8ec7bf1836ab889a500714cc8cba0fc903d17d65e04d6a3fa37105126c7547b50753e8a12360335c02805a3f218a1bf173f7fdb0792daef7923781eadf8d8fe501225500b7264045dafed40327ee34c3321d0b96f8a463536283fab12f0041584093083a184c5766050f10a1a7c4d5a8b3928a1da656310ae6310bca76baf69c44503de2c8477626c63819549c88dee87186a1cc219b1e1e92fc6b8975a877867c08a42b23730f30a39699d38c4905a5f1b4914dae7627c8612f716ac351a12f6e0b90a5d91b0d56649c84aab77c7d0bd0510c1620af85493cac08fbd10c648d027777d5f15291f19d47be3068519dc0ac44d97058377186fbb4bde273cbf2d71b892c24ac22060c5d0259c4a2423548f11d7759e0dd65cd9a806c71732180898e2380482f969a6bab10d6b9550aadcf0ccc0819cf63e355ad99114b3713972d33e3ac687ebf904246f2d2f1cf0d62b869da2f0f949ebe8ace2029d56f3e3588495c3d2871609071405fe6bc2eb95048a083ea34d7004b3e1507711b6420db4f3ac9d993c4c51fe7bbfd616df4b5c3a20077fb01750f1f27c3274b2c0b761bafb8f2cbe5a0c88a0c05e3d9215327cf40fc8162be892bc30f3697bdd64d1cb027e4764a2b142b66b1296d43996a50f983b69578049c221963d4c1ad40c738d32deb8eea65139f145baa6fd7d035d3fc8d15ea9f0ec709b133c931ba1cb547fc3b938f1b911612757b6ebde6fe340397ed8c4d382c87636327528e520e6fe206143a36b9a5bf5279ea942da146b43ee079214ec192638f9c3d54886f74a7a08859edbf8f51ca442175b603db7939e67009412f05760c3cf627072830829f1c65de89f3039d48542b8bc5224dd8b74047c37b438f3f9d714afdea739386aef912f1729ae6462759381f0c8c33ad8a460b36bbb40451932295c0d0ab6d86cd763878c10b8490af7029df2707fd8f87a0f982c3d02d4467134d86022a4ee5679b1550ccaa1a20795d7a567b2ecbc21ad680925ebf9664bc8af393fd163af23ac60b3e9870ba35a9b70168af4ce330ad709bf4b17f7a9237f6d141bd28f009a7d649195286d686c6fd059a01bdfe471fe24e3b2092fe172925e2db138c1d3ac02cc898107e8ee1cd47310a9a2284018d541f45d87c6d9c476b3f0b12d9cc4a3f175b7697822178f817d6ada97cd1f5d46f83a63a7a2dec8d9b8ba1e8109c50d857d288648d4b6117709a0ca3ab32af0de5058c24b40931857fa7b2be9ad5690c37b70e736a23ff484e7c883e0dd352907235bf78bf3b51540f0bfa9325443e8a0c3b1227e892e476389cd8975a9ad90310c3f10df4a9cd8af6935e2207eaa21700394196d01e6e254d99c2d392ef59f6689de016f625a64e948b6ed5425edda128ce83d98dadbe0e9f5976c4e9beda4416bcb7ea74bf5772e104471d4c0a0f9fe2234b8bfc0b49de76574443a4a976fa123b3e5fb7d71a35852ec3fe2a52bf40c01edd9c584881911dc1a832e2eda34aca054a8c62e8267671fecd6287bd223d2750d424c2a211d7dc3a103f2959088f848401fc33efb429e5494813b298d53e2483161e3e8c0b71bff40436c9ff8355bbeeca85f2a0e2f2d117ce25651e10f44fbae02f6375f1f7511f9d1fb640b9fc8c81c55cb56d00a45dc3ff2891e72158065805b7af73c96e8480ed4e70e340427c20801eda68bbcf50cbd5a42cdaa02356c0adaa482e05107c007eb195c6cedcff2cbf4238730f157ce9798bc620b560a61d0d974d2003169dfe1b7aa299df501a8ef5604e3acb443a13bef486dfb67f6f61bf30e117807dc9861a4e2f4c3b9cfed7a4e825cfb2b5892b6290806ba021ab9daec389567b83146fd7f579b8d84a68f01b6e7c4a2a4fc994653f07e6b536c0708a5ff320bbc8e23784e6c44d483b49a41f664d1cffdb49280f3708f9a59a1977fb2cea427bbf9555a6ab103af1aa1a94f8d7003de3b65404de68a479e9d4e0667e810fd4004802b312555cec8d1f8f3a73dc79356e6beb9e7c91b077baa07eadf17824eb7ff490acef0899c79568ba4d41a193083793221855591b206475e1b5d8ff0830e68a42dd3f53db1e0008a284a8d5e96e9a3ac03cb52182683f504e08457d2b0cc613f0c6efeb158d7cfa819547baf6b34882bc6aee7cb7365b44eaaed08208567e9261aa05ee27a370de7e6078010c876b7df2b1e07ad1f595ee2901b3a612dbece4a5ceb7532891be149b751b2c2ec11392be2c1c4416ac6cb1581c5648d12416f85d79609d0cacafb6ae0a97ce22d4469d169e4b182025648595544908fc3949dec06896d62ab49ad7e0336bd99f2d1f8790e83efe7d1a2da9c1e180a83276700d37d2b93e9d1a2797c18b9f5145ceec0d8d42a792031c182f33bf5ac562f881ec075c6dd3fe3e7723dcd7f121cfa6a5bf5bfa520921cc45cc2c6558c6d8693b0006fbefa9dfc05af042660dbfe0fe9650f1f878f4dcf4a815d74f3570785e70a342426bea8fab1576006d3acded4af1d2ec116dd1a5688aaa8a1e3b1f2094b4179e7ca38a29e03c4e9cd97c101cd49ef245ba851091dbf4aaa92cc09b064a6fe9577d7f3fc432a73a40458b8350915a336110f29680f4bc5ed519384426297db25aad63c64eea887b93e6ac0cca1527eff1e522054f2eba12945dcb1fae7143b4fb573a431a9060370980cdcf763b5bca9779d2e50c38dae89c4b4db009b0d98ed2e15cbbe695bd7aafec7bd41f214258e729a3750732d56eaaeff4727d7d9d430b654b21a29c9c1a86523580a81b2d62b1a08592314f3bc97b6c485ce2f138aac53ac9f902f5947e58c1cfc3ddac5dffce8a9c0ceb578908d1cfd76ba9ed57d10ddf96d07c05f0c103829628dd3295e5e161548801a480ae78f62fc2f95c2f5e3f032b868928d2202b12a9ed408864bb580c3a2b2e0ada1da37c7cddada7001871a48979e966f24c26da617bc9b2749981cb756b98e766e7421a9c10b2e1a146e058d59fa7550fe1c7b228f8734c2f11f2a28070ccaf111946d630e3961058d524d03947800f37d23413f3a68089b4b80e295379933e8855a03e2536798dfbf5384a75a168e000553802d460f118e3430db7e4d201c4d56b3dabf0ccccb09e11106b12f258bfa210b11126398a48b05a397d715bb4589b63a5154afebf4ba3eee13b4c9ebba0a9d472998c0e30e8868ee3c66286e94af3df9113fb0bebff0fd6b2227d98c493b3055428f78a8905c298a020037991476d29c987316f6fc9692fe4d016dbcfaf96b8616f3cef05395a57b500081b42c9afa04b2b58184e339831699ae69907234042f880f3b5ac921fb70556228936631273e23e6010ec8755ed8be7d0a2dd1ad4d561baacb0c248f07915339d44d968d816b69d974aee51d5ab0c8142a258cacfeaeda7395a4b6780e8ac1f3bb7351923aa11427346301f8b51f26ca26c5f70a85ff8234098eac17014eaa75072a7c0cd4be4692e51ae4a4df45d7118fb659a43116ed4a8ace0727531f4d89f0931985ab5f92b4725347107c36d9931c0755b9a645590ae7c772ecf682bf5fe9bc8af1534f373fa0fbd43be107401d813ba6e3fd8683b4278360cd9c58eae05a30c73688c4d00a572f7c48822c3958e1f24f86340810ba0dacf6240be4edb0d9de712ef002892c09a5d53d5848f4d644d6406f7bc4eab342c727cad233073e1bb445fcf57207adbf921594bb40f5b650ebf6e28171079c8f67f53b6e1f1464691c983ad01268b8a122b523db82ced2db50e1427885eca64fd043b05939fc4dc42c850b8659e2f8820b09d30576f5deddabf8f04320e99cf3d0d7d76170fbd80d89c41956af3d01742d1b96ddc2408516c7da6379988c961415c3cb5b3a4f18257d6bd9f78983d587a22b571d1bf28d6135a40c7f450efdec8f723f1bd269f25334d2846c78b9d0d7a0fcd89a4491c11da949f8fa25c31ec854c6e58ccee99cebf392ad55a8db5298ee3fdb48d7ce2c3dd79d9e6cf6d3c5062feb5dc345ec445e964098e98eea2d6b73ea84d74d5ceb2d1c7528f3d781d23ac39bc0035832beea25a305728e0981309c8d2e80b9fe3e1cdb0e2c93838afbd74e2f622681c1f3547df891ce08940758aa087accb8d01291062ac099dd45e6a8d8c5c98ef158bed34df1e5d8749ee5cb1f0a1a6f33a13ddc20f849a6ec97f0a1abe680bdba22ddea919f8ad7e2938861f0b6603f488a01c2456063b8b88bed35d2d91385d73516d616178944c6085739db9b9882c70f69a47981b80df720d6e827d021aa0b37337207784676786832afc119e9ba78ba0ea0ab8158b6bb99a06d7e5cd5faaebfdb32bb8e1dc0227eb7480ba4b7de9466c36ac664d496dd00ead8326ce5cdd363121647cb3060d2ce3c5971e21e4fe044aa3521b3368869f0148dafcd5fc7ccdb3c7714cbb02cfa3d32dff30dc0944064b3eeca25acea3133afe71913f0ddc79fcc2242086db7e44ed180bfdfc4137b33d7588c741ff66d8d8b859278b13b4666fe0e42ada00cdb47cf2a60003af029fdbfe3ea90d6f5caa938c4cddc1f87ffec6c71a83f1a2eaacbdfe4137b9e91aeab506b647e3e34c628219aa60ffb7c4602b6d7b0e619be8cfc7d18cf7034ddab0c12c566eb9ca2444c8147498ccd8bc9c6170371910f0d2b9b047157a8d2ac835894f332687ea79c77442f6e4069770abd8faeb7484c4950403711699c96943b0f0c54049fcd526a4a20337a50c9d36ceab620e81c9c62ba9ed26f42e923b84805b161169266408eb53e421fbb4bcc965c8d950139a9cb848479b056a403bafc80b6bb1433860c80f46a5ede415eb4efda32af3d2af78994ecb52e4ca143b0fd7f90d88354a74082434721743a6cbbee476f47209ad495b686c1e9dc982f20466ae35719f56952d700fa5824e66f115847d96a84bb6fa1c7ce01267e8261881df283ec18234da04c564af44c4e5f0ffacafdd11cbb77d9107dd7ea3b71c0764f9b8422e9b961ee098eac7b9394a39c3fb0496a4432c0d41bcfa9d1f9db33f4803e0b4291751e0d54f643b39d3087e0b03612f33cf026b63844757a2dfe8e8b8416df163a3e235d78d97551804ed1b3402da79628e201fb8fcbf37f89e67b83720508c87cd1dca7e18a3dcdcca77c39e1335ac893aeca75ec32430ea66947d2b8f33a8a83f42f054d68c69ef0fb97175f5e9fa021cac2d26fc55041844b36569802066799c28f9eda66ad327caf3afca7f36b374c89107e804d73a526215e336407093cbddd049b20af61e87cf4de8db012e715afc64b789458f5ced4eeac13a4843901a5f307374cd4c65715d3966426e22ab9cba052d21bf7d9e3394899390800674676e57543055ecf39bbaa26f23b64698d1c6ce8b6f8b8f4e49ebd2356b0d73796be5e2b3f8f94c636efe05f8610c938fea898e00d8de89f684950e5d8e111660c9a34e64f294a8354c79300234b8851a66d3421bb30cc7fff679ee09a1fb193a14191f5469f4c4f2e8e44a24712ef49b1d62d5ddad019bcbc41debbdd2adb6d76ae3388edb7c5edc4ca735ff8e3ad420a81afc1735dca4137fb686bc46063246625ee858f100c1b061af0a9b42e5f514f1f4f5ac57716d035d09bd3fb36441cc45f2063b9823dfeb5c1104d1e8018455aec96ad637f3268f3215a3588c04784d4ef9c62f2c15aabf04c003096115bdc4e6b0f8f52359a2c80064cc2fcb2addda6da3cd74609fa6ff203bbd83f6de18370896db19f1856f45f5ad38222c1f26833432403110cd9e87b1bd40e15c104e7085be3611e9b22af1b4b44264f55f18b9b4fc99062c9acf7ef9fd8d32e81b04c1adb8e6c8856b974cc58ca8849c663c8dd77f8dbe3dba21019bf93ce798937c1fd8cbf4b83a907cc4aaff5eab5b8be97da735adcf8f336d58933bd64666aa10ce053e3b1351f8d9db19c8f579b43ce03afa1bfc8257ecabe779963189bd0b1af410e1bb3be64785d70c96c9c243f3f1a0a3202a7d1a9950f374ec356ae08950b92355ecc1790edc23a9376367fb75ddbff9dc5525da430b404927698c70b4b345e363a4727aac8ba398d15e6b011ae2e9b0021a7059654cb1731d067d68f811b6fa3247fe1e96205fb7949abe558e2338060f0073a3d3f6836934401d020843c88ef238b4d88d5a5c866debf9b87a9e8e79639ee38025871d1470c032b98e915fcbc67055a096faa52a7bc021116e6d5ab0592c3731e094cfa2873e955d609fd769d15d00360242e0ce60e18ee76559834a39abb0e45ed56607c853306b1c5956a6a48cb689c86cfe27e706b404a619936be8eb590db66082d45b157c138e2425c5cd7edabdf800fcf94c8591708b7900e680a0a4e9a14ed42bbcad7018ccb7bd0229a258234e3dd9e846346dcac58e8781ccf5fe02b45ed1faafce4d1d442946748dc8d1f4236ffd1966ec16f588753f383fc57cfbd575b1a98f184f43d66c35a98fae12b3324ddad9909eafaf4952b4042037a0609376a0164100ccec77f44360135090617547e331059530c939f59df054c4f7e69486939a41b26a744f6a114241a44576b2621b043b97ed71181493d58920b6d22f35750f0dbb28b709aad6603b19e51d5e90a8b1cb51fd5c14958ac9ee4e1ac1ae7ea51d9545da7f4ecac3e7dbcd4534538636c8877a252e10693d10a7d4f4e870ce49abdd70267b55b44c5a94882ccd83ff7f619c87670a35824ccb8170a21b8f522c9bd10600070c8e60b369edf48983aa7a20c94d1c84cdf849abb07d2ac774340889652a7fa93f10fa3915b8b5d87a09e7f21fdb6a44254116db6845fe72263bb3e5b32a3f7124584295656a64309272b4f96026be9021bbfb85383f2ea6ba9ea62bc29d90bbed57b6e0263787a380fc83cfe95549e275da2e49afcba1e22a425094e4f2829e639ffb0334589089c539f14c0d844a34672b41ca24b2a47b903e5d9dd55e7800a981f0f56084e80586e022e9a4e67962ce1095c9c7888efae508e597a35daf101883829709393bf90bf46c30a1009de2e4d8fb7337271a280f71833dcd90ba56786233e2c3b2406e848fdbd34bac20592160e2af215318b28dfd4f331c6dfac51d24f8a8bd9b1bcd8298179b8f0707386839d314b458b0210f7192f0396932d236d44395b089619fae55ba8ee17199eeea8c00e429eb83221081e933bc974d59544a4a6964c225b75ac7a00c3b5614dfffb84adbb8465a1631c2f015b8bb8f1a2c506580a4d5235ed15fc6351182686afc22d1635c45fa06c113e60e3d21a42aee15c4cb5fa8e0a7d54a9ad9bd903cbd8b21744d7b1ccd22800209216468a8ab3deabe36c5614d5358401268ae084414528a5761fbb02f0eb780202f4fff22ca9962e8a5fc2e98626a7c3dd24fcc6af35e07830f0cefd6c83f215512a43a0600a095e24d7f49639a38ab97124ca14e18734f1c8cc9627c91e4066dc1ad0a5c982841adaa022eec294296703401a3ef2844e3f1da98a47179eb2a1cd1a0abe8e55e72310b87b842249081d1ddfe285dcd535756546e80e4eea289291a89f7287dff283b85c03b1af593387d70b5226b4f5cf67b32d96f547165a85214266554a8e29f813e69b92a62fb50677a13ebc90e306ec37ce0cad6dc840ab6039adaf0d102b0fd3e996c1db4859a381a803fd3b559d784ccd1a874f3c26001570d67b20c6b0f29dd9d73decc867c9605a3e0522f5bca98674f08ac6d8c51e9684ba962d17158aff6258f492e2fc9c8b4e63335c8bfee73cb6061769e7ff58de2d9f4230e9280a4e413334adccd90e232f30e050c5fb14983831e56d1a986d91b40a818118ecd6859ad055194d32edecbab20949e71f3429ed8f19040170ea9606d729155bc3ef1ef0c930a4f22ac1914d5aab6db19cfc33413f5f3fb7a4355455440ae800f07b1996c0fd2e733a3c1cd311288c17e041cb7b7d4c7e0a688091960ed722e2bf5360269b3da2bd3c1e5002c961cbd0c857c4b073b4e5d81f9e0776957e18343df868369465a18db26e8dbb88b34489e9943db5643d1641bfbf736c5414db186eeee88523d01c97f062c1c001128083b67a268c71825f9005a2726cd44a28d664e972508b3f82c422b81340e89c80083e28e1d1b8062cee477178780e7957700cd2b5ed7d414d4a942588850a4b2fafec5e1305f89c375ea485e27f0e4cbeb68ecc244257999f84a06c77971e1a5c0eb10ed63777123365b7583f15a5b1fda6c12418e3d588f143804e98c12b157ecd431afc5ebf16bc3453a551983de9306fea8d033dccae7af2cb622efa7635df0ed1b1b9c8073073f11f2e68ca6032dd30a0b2e1f28b46c8e06d0cf7de943a96d24cc2d7a3fd732a28d6e394e20145b19c5459e2a38ab33f81114fbb0cae78269ef0345c4f8ab713fd8f1138e659e59ae061c48d6ef8ae0c8d3a33d468706303006e7c89c9f2361a3b1ff6bbe8b6ab57cac7ef633c2a779726280c9ef1572a7a3fc0660176a85c3d32bb5408ac7f22adf743cfad62b365260f35d2d78d358f9dfbeb069e44f05f5bb52c8360466bcc989f810b071e23ac7ea248cc8f6af1cd31925c3dc02028ca912cc0a4f4d380a6a1e42129ea9ec32acff5a1a81091414204492d519e9c775f7832f200563353838c342e58e0340f3de74a3006421bffa8b65f41900b5f73df19b9c79df9f8a5c725734e3168d5805eea963b6e5373aa09405e995d7734a3c06cd79676d92e8191b1a162b66a9cc5e165e70887d7ae60501f5700452490a27016a6d453632981eb43dea08c2b8fa2a0ab86672c7739bd89753bb147c6ee05918221ed5bf0335191103abe0d0c89603aa15cdb5b6c406fd865dc7c4d2d11b98542a0cfd1b0ebab400d24e83e858cb0489f192579e306c7cc9ca05dfd64e2b8b1048b3d9d1b48489fa6113e687fc12d4b2ce0c5185febc55444c080ef27253a0068d59d8026a69e42e658b69aaf739208af5ceb9dc40d7fa9ab86a6cdb2b90a5bf1c7507fba4ce7d0c6ef8f39304cac2ea1242f98d820b8c32fa55bca27172b10612da1c32c716e4164b8e974bf41709b44db43d48f58caa1b08ea5df9194a1c7d4b98249414c5d17477964976cf97e80ee07f2451ba16e9d95e919a973aaa7d465c4af61823a255e743d13960e8329106e11338f1eda62bb4c4f58558332d2a0f82ce4fd162896817c4209116993473ba69bb5c875a383f82f3f15c758736867484869f6ed82fdb27729d6b7493b81a4ebcdc4fee3f452b5b6700259767f51319656967f5881949c6b123659da583497c014acccdf4628356085fbba3552d6a70e95f78fb122d1c534c16e83c82eae7dfd74e89ae8a6ef216315840cc46c8bb8a4a8a6cc6c8ba083d780dc3ffdf83c40a0d478e8e070b9184e2d061eb600273e5dd3c6f0bbabaad397104e4dc24461724430580416a252b8ecc912449c9aaca34a0c144d800de442caf24ff6e6bb5e330274bb420dcee0d23aa9581323fea7c6949d120dbacb902752d7924134c9be40fc602be986e54acebf6483d1c9372d4d729d02c9b643ef5ed1da27132cf2778b8485b09571da7642c64fc176c20afa2e3f6d0ab54cc161ba81b4e48837f0f2cccf17210fbce27d5dfbb7547aab56e0ebcdc46f60f6358ac44ce68b69416c46cdafe55f8b7cbdc6b9a7ae0f3bf413c57740075cd81dac8ab242d3638595bf31703e7c12df9d18dedaa50ef2832583bcd6a8ddd0dfb04f994577377a886d84e26fc217be950d7571060aac903ebb91a3d4a8a76c934340f7e953f5a336ab2c388e1c0d74bea71dd945927350f04d69682851c5b8d98ec1a0f2ce23b2567f878cf4959dd6e66461bae324ee67204ef0095a63ec4af32a5298a91698128f7fce043af6c1a9a13d9f0467e54d676c26c93490a86d1a350b8425459fb2264197fadb5fcbfe832d739969c211ec18a7fbe4ccb5e01ad2ce97bb26d0809a3ee6d0e2b07d24f6f7d311babfd05ff5fb54d17848c9a8e100b2b5f8fb119d0f98561bb68e53bd440ff0af1793b0bcc013e37219dd617df3160e0f5120ca8b47f806c165362b2dde6ec745be20d81838950af92ab1e0c551c964b2f24c41544edc72cb157b04cd6612dbece8a423122e8dc4087f1f506323743e24c48a8074ef61768f84a244c0477cc8357ed331ef14b93d094219a27a01606c92dee8b4858c2e94aa552da1fa0cdd7c60085eb183ba93e69ac0eaa1e5252dd720b8771b31bfc8f8e60182424f9001be0031406dfb77dc1e564e54dd9ebc03de41fc00d392df0b38098f70156b9bfe0468e5b550be6ce20be039b3ce089e86e6eb7de0ea0c0055d2616e54f4b4ef4b8f3324a726fd3241e3a0669b535c1c790502e684ca0b74d20b67bb97bce548ba17c59ce34e5c4703471a0e1134caf08ff435102ff511f1452fb88f6ec7970273a5fa4d00ae86264ce0cbb110dc4012b38829a64442bf041679c2662d466c84dfd11b075d7fa00f25e4c26d47af34e518849a4bafa24cfc9ccb4282c00b1c8b17246abc0250089367d87d4848f4a6dd02c55d0200ae687d249ec12b92c28c25f662800f2e98a174918f82c4099a73002c0670ca82cea87d6cfbd83f31ca2929976d24f8b76c9a30feba69e98649c71e92d9a9bc26a1fe00b92eb5b3678a34865407836371eac2acdb95c01797999b52f41a04aa4d03a4dce48218a5876725106feae704800af3ac5ac1a8c560b257bacfd6f48874ac1589139c72843e56f9a9a2e05a36518902420cc2e8b3fd8392166290604774f9262c86a97f334bbd19a69f004b9de235f8509b38da70df740b3309d18c9d61015c755431586de144aefcdf61c112332fbf57ed9f1440a313ab0d0d203dfa3d6e9aab6302b4b30bb193a3a81dc507a8f8d8d5afa6d93ec9bb9a9206a5264a1e6829d76795966da7c52207b557814ec44fb7ef9402556e00dd7e8b77e912a91e9b4f81d58c2d8f92fce7137d14c7e5378a87137fd6476305a5bfe706026464767d3c95e13c90f12a213bb6df4f24f4ae0b86d340400ec579df32649beda57eca8f51ea1cdebef146441385734ec261b248ccd34e9dcf31d7ecaa00d232b20c32109feddad2b9f8a44a4edeb4592cea91fad4354880b44f0f7ce331926ea901034dd14dc4aa4d0249e9cfad04c1b967fc69e98ee91ea3e0b9f579b659ecb17f0bad0e86a4b43674f53078c635bd95ba867eba559e8701e5197777fe700f763e9e6c872c69ed277ea3273f62a44d6eeaa34ec59deb760ec1d3f87274eae7e9dd5166b7ba5e0bb3ec55e60e7e1b1badb3a55b85e75c7968aaa9074e18f1974ccbebb7b9878606f58f6b768c297dbf43c81e1b9a79566cea520ccf1643aa7fdd3c36e8008f7a4cd3ffb2713590d86a01db54c4a64303225bb16a3f112a079c6923573a0cebb6cdacd9518e050d4e0e63501f6a5e7b1ff3f1fa5132e28d7a86952fdf0cd08f567b484be74daa7def0b3877cb178657f88a8ebe6f7983580ca78f16a566f3bf63b1ae1f2f91feb74cc281f63fd8a251762846f9650a8b6a6bae4367e657b05763f975de6cfffb9f2f446052e97d9750b77b1b51006a7398647f5032db8bee244831731ee37ef923b6b4780771bb43bfffe46ddd02497929281e51fa7d6f7a81aa5c436d571d8c55d77cd5145b140c54f9bb64f1c57bd3b07b4316afea79cca3e8c93b4b88365a4fc1f7ce8ad25de48ef40d37dcb0a7e90eae4b3744593090e3c6df0fa30d6d7bdf8eadc3fca6fd2b1819db3d18384c3c19f18c54b8c58bf3f09b631a32da10fd1bee1cc697f84752d53c2847a6d6d6372a90243de0507c823266b1b19170dbe3a5689f1119b0ccb7f2b5a4cb94a9c94bc44cee28ee8c821ff042b623d38b9bd59f8232a839657a2befb2696e0a0ef29806a4fff8002e04d3080d7da522603ce48a281c8cc37ce0d2e6099cbcec55023d16a2d11491735faf87d4c17faaa1f57a6a1d640d5363160b9ac2bd85e40707fe5668e5ba35dc7caa61a33ffbb2b07bb8061ab1c58fcac48ae4e9e31bdf1f54b364826a4fcebaa18c18c5dac9143c27477e393b833c6734cecce468dedc3b37e58d225041b69282a2686bd32a4fd29b629f59a52182f30adec4a552e81e26eef97c6cc140b9b93e6c1b6ad604de586cb66bf450050b4e66fac9ca101139f319a191d1e141049bfb2cebb450fff47630eef3321e3f4a9c4af56ba09f14bc0bd6a4c47e10f3c767f7d5d10e4287302ae1c1a2fd8ba022cd4ab2c927185498b02897e81f1c9737039b7db96cd411e481a4f32fb9a1ef35e157c20fec25d11785f004f189977e255a51e314946806da863d7d0b266b6353b5b4c601047f5e738a47f6572deecbcd964534ba1450e8e003b98453072d0901b9605f93d208ed6252841950c4f92f6e3c4b168542b12c13055341fafdcabd2618b64dfeb72dc78760b8751322384f9ab327f13ba7bcbc0153a9289482db50157814f853703e63ca342da2968f3001f74a5bf7486911d636ebc8fb73a976e1474157a0a1ae5edbc0096fc0168102c6fd942b5892f8e3eab07a1a91280cf3ca39fe4b0d5ac52b35accb0f3d33421f59e089fab9ddd5532a65387f3ff840234bde1b60c491f32d84ed4072e34fc1a0ac3821300317bdffa394d5061bf7b4db922d068d76686778c9c153601dbf0839c46166931e173ad2fd0adaad64d7b96f144ba989f75f976235abc6a8fea1b4fe68625bf4302eb20e25c0b5485334935a462c9f2cb614569b9ad17223d29b7b65e3beebffc9f7a0cdde86cf36c96a6038dbd9261a3a5c5bde54ee320ee35df3e9dace6576a64ed2df3ba2cd2c4075f2663c7e470e2020a4418f4523cc112867bda7c821539c4bd3128746a434dedd3661a1065d0c9e25fa89a7a602b4af9af96b53aaf282e570a08314bef3a27362027b9a38933468cc47e6ee7e53d0398767df534d1733028aaa60706b1f9a3b6f93afcdef7482870a9fda22bc47f6f790b15b3f25a62862657b39c70059aee7487c463f5d1124362c5eafcf4e772556befbeecd0071a7bd3b79e2f1ae9a4a5749c5dff6d6bb3af66e32752c8f2384102fe7e6dc20234442dbcd831b4ba86dec34d06e48d2319312d790b1247bce2f4f91bf06bf7cdf9b7376e21a21276a505e97c1f333d99cd07a4a783d2151b544c4e90f04cd9e047410a8a9b05a68b4853754603289f1859d68f36b47f040d458eb5baca63c9588000956483f8920fa09d479824a0fb1303c7442afda9ccc15b2d37dc7b21b31821c2c050b139ea5789af4565222f4b41ba8701da51242e39d5d88e233b830c3834d1a19b34b20cf107a021014ceb03c63b42230b5463101d64039cb5c8498a634ffc37959f208b0065ae4c69aa257ab8fc51f254054826a8b231087a47a5859b8b10e9db81a28264e118c1a0366e09715d3b306c315f50f9dbdcbb75cf8f20a69be39bf3de7f7dd09a04bc1a06a72c8487cfb1f2495765d9f300238c072b786620a251620c056df492b8d30d7c697f1bf11fcff2c60ceeaace1bd9d9b3b9220ce74ca788ceb1f1bbf8b49151b1ad098a2b9725b77c7d97b70175d157ce04cef56d300d2323a2f013b3cf3f286e2e30fa9861339401f4bea1fc3e2ce2a906da63e16ab3a771789335db2168493bb3a661ace86f4a325fbeb6f8a2985abd50cfc439ea1951051755224be8addc4b391087f9b2d2bdd90fefe63f8ea3a3748fb4d033ac741e80c00c4086cd9fb4fb162496cc39f1f9eab967a411e4df91f95b1344c9703f4a9a5a1b0fd8f4140b9796a7b1d30e6347a3ff84b32ba40b0ef3b06c3ea2ee1f436fc7607b1e32ab0f641dbdefded14fa3121be0c24f816c560e0c869fe03ea852243f0e41f1801085c9e7ca4fba21145663582bd1366d13c94aa60a4b3a91fe6bf8c35539fb6ce7bf2bae45a18d40a69710b581f80234e42200a6c48598ba5adef8b2b5019abe6f54f0371f42bdfe713bdc3f5fb0e5b04e3fd3cbfc27dd3abce00470ed7e85d3ee88ccbc2834762db9492ec653b0ce0200829f30fe17c530843c8baafb71d3277566960a42fe12a4af46b07ce567bb9676942727b58b3bf6d50b682da657d1e6b0c2d0e60a87dfa9c54c9609bde9c12f80bf0054675926e36334b325b43c3278e904a635c69c906ef7644f88b4e1fb8d71530b1fab4169bd3ddcb18a760d68ba4d53004034ff9d65b17dedbb0ae41d0e361af521e23d002c8a5461b4b055f627f9edf46691c644f406fe9fa384deec3c4e25b39f2c8cd1067c8995cb49f17111cc13c5f941e852044359242f141096a6cb457949bf4fe39a01c6033fecb899d6edb888dca93c745ea2b8e794a0404978e23b0f2007df433dd2e08045385a097987ee247ffac35ab803b84ce60c0f0451636ed9a117a1cb63e801e60055624e577cc3134fb20605eb2330d75c59c03229f298cff9063ec555b94f443f8e85d3aedaf701265059e7b79b0f5da3e887d700e7a6c526f6e6e13fb137d4bb3715a6d35199c166e8b54b0d35b35d4d31ab709802ef5c9fce1f8468678383188322d3fa0b653b9cc92b40a6615294b8e691503c1eb978f22f6078fc74971dc42096cd69ce91cb63a05d474132bf84a4fb8a25544468433dc4c40da737c7f6c7887e044f49030f3a1f331eee233adb0275e68eb4d04e9381b25ef4a306234464c152ab1f5f2943b3b3ff9907057c216dfdb90fe5217160bd416db5d07306e251227adcd2a55211d4e46899add495c144081d597adfbc6903bb2d37665fe4228d0ba046805a7b91a268fed4890b13e3617bada7bc5e7b1243d58ee3f8c30969469efe387a9a0c6f0518c08d5434fca2242d45dff0e8ae06e3bc86088f0906f5ba64bfa8a97d856c5e4d9c6673242d0090de394cbcd96383b228a38da131cfedcc260bce6fa0568176c79667e6bd06e05674a57b5df1f326421a44677c03abe9e6f699fb277476b82edc23598e72016bd45ff79395b03b90dc2c59883c2e9842d3bdf87d261503f2f6d6a02f34105206749fd2694e30b46832bdac18f99807b211551053d63217f17904ee1ee1ddfd3b2092fa1fc5d5eb00be060b1e1d5f5ef620158554ba4bdb08a66ad8903611a6052e16cc05b44ed716049148bb06620da51c5b993d2764a08c255409ba7fcc351baaa0f4312bff980be38048dee8bdaac6642a19512f59a6447aa79d40134027919ea650370a010690b8aa2d3d994f6ee5ac17770650c6c424ee55f87d03e07674b0f1c883571ab75fd537c626a0864e33a3db0dfc9a2b0508962a50ded875c61309ddd3fd25c2a4ad2f535794bbb497dc76a980a9f3a0abf1c10b464032f1d29b95ce48f59fb9613d43c638dc8a2c83de47ec64ceb549a49ad8d7afc5e1a4cf9edcdb08df892a53144d3d01b8bd446990f191c9a10fc27fb07363653b740ef5a9fe49d0ba098e0d6d0843288c186825dfeae34c986e02fa89a741766186b64873c8186c7a26b2262ab6b424e37138a73be71868bd4bc9665e93337e9739e260a60ecc77b5734ea53cc06edccffeb2c5362ca7afd97dae8152b91ed17450108f34cc0e8c507fc74ac50a24e81020ddadefed949a61b97feee16ce03c01d90cfd62659c0441c8509051ec265c8761e04846108025fad206a985cc213aedb81a1968e7a32ed7dfa3a519f2462a0055ab830c015b01a392966b74bedf6c82f87e53e6abda3761af1d57d9ec24dc0b9696ffeebcc0da33bdffa5df959e614b515b8d038aa1b75652e4b4ff70dcaf6432d2234b23743edf5915fb0f1b66d46b410d0c807bfe1e879af8ef8cf5968709cb36b8bf6040ca5592c56261c99695ef0ab3aabbe635465a9092980dbb0c561529e6afafad974c6bf8b8d7fbfdda434a940fe4c4b7cceaa5c1e59b9a9019c1eebdec9dd35107b87b9c879fe398012fdc8d75bee1daadcceeea70a9268ff9d8584206c8087565a8e9a100ffa38e5c6a36b216af856f7bd87b8f2d692f52cd496116a946d93469454c58c4aeb21e70a9c03de426141bb231090022d8a9fa45850bc566ee66c6079ebd8fbf0ad607a095e606bcf6985952d766c83f004684e21aaabb3e1e2860e2b5ef8aab5d3a82e3902301da98635f14c86e42e0ac6fcdbd9fa68d36302ef1dde09428f09700888410a1e87697760739a1c051f1b3d1287fad4cf0a896865ce1e45f0d938bb866723a60368080c500a4e4ef9745038ca35f84666b61745dd968f77b303b38943d123e718f273a86917adcea4ae46c9592cc12eb7c87af1e0403a8184c26a7551640369a9531b266d427f6e7e7bf6bb5360ddbf02ac4e269a9f4cd8291353b476b47a2c7a542d9d0a0ff5fc8241eae51fc041514bda13c942fc8dbddc2907553c4fad4979e40e087fc5308831bd6dd493098120d48ed233c51734c9bafe46bd43f73bd00e6087da07ce0c027cae06c1be6801ecd4ec1482dce0b4ee0d622603c1e7a68fe19927353162b6990d3965178592029ea7a230a32b4669c0ae4f523b7d946f9032a13ea9371f407294fb27c6c755a2fd13c763c7107d7a902a06c317b1787a3a250e185ab17772a9777cac248aa24b257c40215ac600447e91419b9df34b3b33d5617860eb47e9e8f43a2f8bbbe108f831e840678303810d0dfc65aca39d3eb7a15d0b2218cb4253b056ae576b02eb9871f0522596c3c4810da3d05a7480575ae6c0de56de1be8eee131b79b48df80007e5ff3c4d060c122cc9dd83614efb9329cb81349b7e3c7747999dc77b7a2d74136c6a01aae7bcc58e1249eb857dc330044bfdd9376d2ea0e1f0e9908ab617e1b991bb20880b390031ef98b5cd81cd4da398389a19d0bab1d2cd091183894c4cdd6d81ad3366266d132d71308050c28cc953994a0e3c72250e795f447f952f82d2d5548fa91aeee4709dc45b0a1cd83c14a6c40c31b592cd79ceba786f87534aadeab60fbf76e5671067a9eab4f4b7b514edb0b1abb220460e144c5f9f596181a22a83c38125465de84b9c1ac75a728f5c71069c4d86e13648df7081e2e61abd8fb9364f295a9a8ac8a9c780e70eeb99e6bb4972e2c9d45fa5be786870c261a1cd47ef83755ea8dfd5dd61ccc50a0f3d1a5a2756af3e4e3e16b4f0d7cbe852cbcd52b297cbce48ec4c71800904912cd3812d5358d010dfcd4b2a31ff06a6734c8ba0e6b2eb4b3bc84d1928d6629798c797f53b84b71cac80b753a725d7c3629564e2c96a7351efab080f5790e287af4332371622f8c65ae8444e6c9369f2621078e32c97232acbfb12c3019f47918456c6ba11acaf1f62736ebbc922197a439552806199a16d63d337c8f299b9c4b18fd7f98ea936807aa046c24b3b376ae11d010c74c9d05dcddda98760e2d1a25ea8d7fb9dd7c8beeacc3b1dbf572450ac2880d5da5050552895ff1e68b43b7083c55ae759bfd089f5b8776ff4de85c1b7a8eba80da1fbb76e5fa6eea2515bd705900f30008e2c06a3df32a51aa03caf920c692b80f2a11be700fde256851b0b2663ce407312136f68cf271fb5a44685ea0f1665c87c61c846505897e5b8bbcd365008f12868a0d3d72b39f57027e803046040b90e03e854cef90eae07401b2732ab6b1088c33958231d03170bab1376375ec0ea36432807864528c5193b315ce37cfd8ab6c094b565b28a38f1d108b13fd86ea6f631a5f0ddf9a0b8bfa9d7aeb1b437cf5e7b500bacaf122d1f75ecd0e10a254f310d12e76a09026492c713b913345e08f17750d3fea818e3e25ef7c8f98d2a346522b8c86421fc731ab8943888c1a8331fa3ecc93ac54e2721499431ad0fc7fc07782042b72029ff1f471d0133472a604be2b7793a0ff053d31f86fb165477431a823ce2c2085bfa73f76d8d0fdd132be8b029753790b5d76a8578a6608c205632a8404a813ac50682572199c57019dd8e51eae29b47e201a0114fd37a71ced0199f01e082a2f5da1a5774dca3f06735e65a451f451b6992ab55810c08119bc2f703a5aff66cb34f7487fbae4e850586060b75b4ba512bc58e8d7f0922366d358b99c8221848d4ceece19fa63b1a15083139f9b7585c7ec3591e490ad1b969ce807d26bab92447c4db0a336877906a5638b10684156dadf90eaa67b207ef0dc43b702cacdfc9716604e54db9da5e1303f98b4edd26e71edf70a59c440c35c16fa9f287409074b5e044878c8bcda86117e69efe98335a520b3868c4281c1552d69e90ba7303148d9e5961aa4be6f416da3ee7a4cb3b5fee69c589a19eb9c205e49df03bb3a39c2cc4d9da5beb2a382b9b1bcae92a186abfb87644bd317f76162d91714d8cc4de5439f16e97ae87253e2cb5b01860242f16b8451480cf631267c27e4d5ab73f7c10b03bdff95fa27933a934214554aca4dd8818c39ed52ee32e6f74f5bb663029f3ee70c6f4bb914c200e8c7f26f51432c9cf5b6e6b1b98d1756372f448bcc5a6580a9471a79a0fcef9f8ae422014c2106668fddc9673bf5f00bdc83cfac4801c68062a24347e7c15dd32d2f23e76ebc70a9033dc829abba897367599279c3e53007260c545edee6adaae4bf00ef5c2a862fc4d8f4296a4fdbc13848d696053b2e5c3b2ed72555c5b933a18645d02ccbf38cebaa2770ef1466e2764ac9adb82118d857a62a8b285a4811a8170ceebda4461a0afee8dc9678c1208aca04d76cad5d17017cdd982919c0d14af104340fc3a9c53fa4bc57e66f2307465b166d63f1668b3ab077a208dd6a71ca349a8b9385998d010e915f70998b6ef24c3122068972628c43b848b0dc3f8be20196565b25744ae714d1d108b2dc756a91aae99610ba5ff09d28d007800384a388778a431a3091ae48ca713756b51c0c76edc88e4828f48c8f59f578bc9e7dca472c1c307d75b7fbcf52eda0ee39bc528a61d1cc1a7080b63771de9817c76f63f6315b3fc81b46b5f9ff472ba2f3448c0880611e4fa4b59c6db981594abdc6235a01c71797a7edb1dba5d949a79111d94bb64474e8385f2b93037c51bd4b32481665352e0488f9dee1a20807cc74b68d97f9f3a0cbeab15bc291db844bfbcec4d3c2551b514b41d2f9fbd953e2e7d29a60b6e7a974e2892d2d9da894422f08ae8fb354e6c46b1d6c7916eb523b21682d18b3e1401119704c5048b98f84510b8998e15a15edb060d57af746e06688f7f0137ad8d1e0206dca105fbb59ef01325ca6f6b026d95a2b5041d95a3d6ca5d99d2c05024333e0b8abd9e5112e314da0c5f7d1f872e284815bf73fe0a12f163c0655560e7e06afd29cfe61c14ea8d0bd13483d0a825b5af774d694c1b207f52f9c07a2949db70cbd846c1d4a74b1ffc0310fbdcefef018c7d1fd07ba86d3812f583a6c07aadf5432b2f8b5794a81db4eaa12b94c5523251bd485574315360cb6e3a1a0b57772024ff68e06933578629d84a49b37c340b57b2f943918c64de73d6b10c52f806ab53f66c505fa4a0e5e3277b42fb7c6ad660dd9065576d103c0a8186b3d048ab2fcb1502a6f5872f054de2e83f1dba75dc47cd547da58a534365c4c0e9c316b5a5366ab01205fc16ea2a1df6e7f68893e3517339d8c1b6dbbaaa9e8f772c46e3ce0eec93ae3451639c92e45b938ff6e25a106293d722ebbd5c607ac91cc414923651e79896eeb80ec8634c1c8b1622bdef0be61fdf290f8a427e0724e929c10981a3ccadfdcbb324460d898d69b180739dcf3f8a604ae8884f2466e8c12fc7692b442e146149985247110ffaf6522b562ef36b8e951bc9d37f0a59a7caad89ca70aba61f843d91bf619a86356a1dcd3e54fdfb77c3458e92723cd19e1df9bf0af10097877365304fc8bd06b23adc7ba659134fb4a3e2764a652fd48a5f4706d404f200e127f6aee18089e8fb79acf967a539496f70858dabd6e3d222c7ded0d659f0b31f5de65c08e57403fbcc0e053796d471ac0dc67d097dd97d951941f3989f44bec62581192796ca8ee70e32ec11bf840b5c03d08a90d1613bd5dbe1420400e116c328133c685623c9b90a3e0ea6f3221bc83153d6b33b27a3fca31d6ef9db207a0fe8ce2a7f096a027e47bf61a001ec0824de78f16904338e69f40e80bca36739a33e0f9e4a38d25367a6b707c9852673978979f6edd0355c21a4c86333d76f1da0534c02f49d69c095ec8f0c3bbe69fc81ab4456be575177098e6541f95f6a45fa9b08e6cb35db217fc9b9fcbf8df2836c7761917728aefd2980c4ef3f5c4b7e162c119e7122d7a2b3b100b661b6c07d5d0de68178b36843940e844555523584d947baa9f1755aafcd479a9b31ba0150a2ea5df05f1ecf1150adfad1391d2da02d0701df7c46dec36f038b2374268fb816c859303a17117cae6c514c89b868fd14799f07a4e196cdf7f2916600653b4ab85c2194928fc22c7f787bb37248411e2c618b46b1ca891b3b529859960c3f18de3da2d69c319324406d743db6fce82377bac3f6a5aac9f76d36079e97e733eed6029fcbe9091b70229c0c0c9d8509ad098d2510e2b68eb0f8e0d8825e3ca221f192190e15c15e490ed850184bb1fa2fd34516fe4571844f4fd1cc07525c980f9b5a1485d7c8a26639989a221c43495788b68edfa9f39cdd2ac3707b233be416d94296941cb9810694b37d6236b5a76917d30f0dc01dad1a2215fae87de5492c00f2d512841033bb183bd40f4563aa57948ed7cd514b9f41095acf40c7ea5afd9e708bd4faeee1c4325bbb8467d0976aab8fe338df5a7f9585a6cf89a3411f9bfa8b804e4c84a093a36d432cb7797d40d1e42240a48688d9028e49500d16a6311fa73d023d8cf663f9725dab6013516181cf4c38ffe29501ec43b7a206dddde65195e31c3f808901f5c1ccec93619f4aef8f070a357aea741a7212f4c3184c403a1bd260734732b2b5631dc0bd5e944d58449df2afb7c1d3930f361638e60e768c68b4968f70138d7f1fcf881be73ac6bd8763df69899cf9aee67384013043a71ff9afc1ecb24c2019d0cd05a1fac33a7a1a7bbc1e4ec9f0db16cd0a7fbd55c810029405263baa72f523f92856327fbf0ca5aaafcbf05dbbd8549b583c0fcc839fe83c11104532768e12c0e730f4c636d13429b8472d271252479a6d9431906cc70b3f6d436208ed4e41be2a2f8ac9f24a22b42c9772f633694368ddc787bf52825c61eaf252caeaa4666b6ac678f0be2ddfe7b3a942d98c11b7a5329de6ebb15513c5ba8b8a78c9632278af1a69e4dd61a8e0fb6b87ec400afa5419c28e42bef576260d320d29abfddddc1cd5bfbaf0dc2dbdab6829032818842edb4cbb637a914666b16ab6d9fb3abb3676bafd62649263858e34c7f587922e14da4be2293223d01502904bb08bc9ed08dac5d75451fd15d5b5e6c9b52264af0b72df06c13bdf2e7ec4b3a85377ef2e78115262b4e3715d3646cdff41dd07603247ffb663c0e1c8c643867f017decf76cc8926d64a74c7b4749d1231ff2773243f8638f2a8d4a6a644169c5d620918e72f1242895ba80a6b77075ddce1ce14b7ea3f59c6bbbd69ec93b60a046cc671324d4938e399b44295e953e507687cc6638169495826fd200d9ba1a58bd7764c0b40076fca205d9e30b6b489767d9edb40d3154c180d2c9f8d1b9de6bfc45677f6049041857e6860bd87a02da63e52477f249d4008fd5a8eb8111d061e13cca731a60bd252c8230979ca035521aeabe88425d96652a7584535070871ae57e4298cd48f637accf345364497a7af25e854a7af40e753d5dcb0e6ba4cd44223ee9122305058ece4bcaa28ca5f3a689cf357800040acb5cb70929230a42359684ec3425980b2a3604d7718e2c3c7ab1df7896a5aea448b608019f5d05244fb3b94c32a56d2ac9e242c71e1f3ba2438682142156ae128e5445234cee77c72546087f25a12fd6d5734ae165ef03dd6ac739dbae8a86c87852db8cdb9f3d5e41a8cab007d157a88585b638f165ab369a3aa4ef5ba55756c557ac9613ed6ae025f1915441319beb6b834150929e3ef9b53d319386f32c066bbc21fdf64e5823f951363d5b8ac6487aba4c51ea69f05cacb1a7bd5902e41c4ca60a40190ede1eb8f40395f7befb96368d1c6385797202a1d950382a30090e45763cb80b171e752c21a95115f229eeaf53364712723d0c43882445ed5727949406ddb748eee54b58aa12ca1266d6d64335325ca8a41ca5ebf53636b0d8b3406623ab64dd3dcd03e170811c2d240e2b7450a41959e0c5d511fa021eed3f2b6595f26533bdea8fde954e429da466d57c083ce60e6a37c45aa73b09ce4a7a5db3631cfb035d062172d29999d152b8c18d95f14b0a06cf2973a2409aaddd33e7419a95aaddfb24b474a47b938085cd05d30e39488c58ec4cde115a22adb53c73eb8aa639a0e0899546924b60b0ed17ef900ee71d1714dcf0369a1d88673aa2ef91b3d6e51f176c538e0f9d6b704e9c28b41f74aed38847d24c41fb29e15e74ad07115820bbeac442fef730eeb2773b4491d89f107dfcb035a615e21ae35a44672f5c8a32f6b998d69cbeffec5aa44faf83bb3cb920b83c15999ec72aa74d97ac8aab60acb75b03b55a60a9a4700d676cfdcaccec6de6207ceb69683aae664fc3417ebc859f6267414721ba5a060a35309816873251be2e427ce84a56b885fc0532122e15e97fd8c0b50ba9fa841b22c32317153511fed57225f5e226c94ad7df0cd19a27057c73d8c3b30c28f188c023b559988bb622921d614fa39d44ce9a99fb50999b638b68f406b5191a09852ad12084c0a81abe73ee05641914f1c79c09e8e5ceecae053508f89ad8dc16e86d6467cd725734aab7af6a1418f878ef5dd07f62e4e56c7d90ae1b53c85f34c1240dc4d481836d760f7339d82d195242f8e02cb549c91306c473ceac77e2757d273d4113925008d37d26c7122dd2b84137af7fd0c2b413cfddd059a198990dd48c829200041c0b198454d4855e96c6b80124b8c2fc8bf3fe4012d2c8a66aff10a3ffc5ce749db3d375255006dfd3595c9bd047a1284b949a088567e90f71934f93f26d52ce4d885d3901b6892fb98dc545c0069235d673fdb8a234ab25630db8b0bd09208c058767301ef4d1daa3c5937894f1dfce6e64e04a44a102c6a7405040a7d1abb86de9e3a4671e3a9a41c3d15d6560bb0ec57bb935d94e2c1ac9665f64d5f16d870de40f1590faf5e00b6c9101a5aefdef8345c2460562196263a12f84414759b59b11f53638cb5ba6d16e7117b6c214b2dd8c00284f82db58479fb39e5f55916aee598ca5a919378ae223eb551a221719f8bba997362383a3d02cc8713a83af6891bd6a97a377598d7fa3bfa6c383f932f205e94ae870db4d77c5fd50e2aa98fa3255077a5b6570f5f89faae1b94f8b94348e527105a0500a130b01ab4cd41a118dc062949d504f39f69c75b11c60253d77eb8489d126fa3d56feca0910af86b8102934d204e1660e6b9abef805b706c2ee4d4f61916c79546ad879dd89fa6768062bc54df3808e2193d6068246ba347f628d491558901d7134b1cf1bcc14efdf173935a25e50f329ee9ee268c6dd77ccc4d30754ad52750857e48c00aa2359542a743335982bab029a86b114286093d35e4438d6a06092fe954c453ea513687f20b5c15777ea0aa6334f88dc5b6e2db7663d68a7d2ccd2df25492440b4afde985aad51ff4613096e31f2c56ac3947cc30316b6aa8a5067f190aae45b8d794fda0f68af00652c1b4571897505a12192c9c2432f1fcc38b7728fe91374325282e2a975166e8fae850dfcb57325d1d1ab0b59c51fa21b9324ff3502e9a28e99f5655ba6084d0b7178a36e9054e8380417780398ef287cfbf1f9b3fb7e794b11aef72d3674fd5643660cb26f56f670c9334c4858cb2e568197188dce2f173548f630c731e13e6b06cb024f73c24a83428a50f4dfeac2e8ec01a5ed6f810c84ee4074f4a197076931971826f52e017e85955b9b4d00865cab472eabcf95017c6a7eae3c95c48ef85a2cd25b60c19967faa17f8e6bf771b945f8b512b491b33445155fb1f1cb27650953e90f0b142e73be4f9499f19354ba17cb7130768e6a1b031ba2b139791d26d2e93fbc27c3eeb5094b26164914069187e972a329eeda93f1e021ca283fad918281c823a1c8a6b47668dc27c3507f77f65f2dba585edf950ed6cc744071e939b33235961fe6c2924a61d18cef8b81bc203ea17960e0604063e849f90c4b4b63b00bd7ff0c198f6f23c68745938b0553b860cb8b4540063491141d3de3c6251ba2e8b1b9932c32db5e6508ac45b2337a71e78c9d5a163d62892b7c8ff22290e0f791a988f79827cf89122fdf1f3022d8cac9a48896be0f04e789121fa3399fe357045798c83194087273a59264696345a8ec2c9b9007e3a2766768117ad673625e11718e3093f95fdae9d3e0ab9bfc3d7d718c8bbe80952c2118494b6ef6bc00c2b5c63c4b30886566252527a23182f18cf41071082308ec2c4b59c906e416ac2615f639a8c204baaad56d10b5b6d3cbddffa53e965d47372a8829f6e29063f557a4b70b11087ac0de85bd016f504d982c17e28e2ef64b53c32d5c2827bb146c17496c79c968be472d2d9205f35c93c97ffd58c5033c7ac56964ad74f04e44c87ff036242ae0e5815f3d96142048460146963e2beb4c268174e0c7536519ef62f3e3101f34345ac81d5ca68ffd780fbf7dc0682270e244b6364a59b82f1de05f2a1010fc328597b57a1881ba56062004dc3b8039951eee9d22c917f8a7a091799e3bca6e7cb3dcfc969f22c9c0b00dd3be8cf32705b32f707ffe4ca93b9d6c2e0b206437e85671ea2d23396f4de114279884ba9969b858c5649deb5e8fe857893d05e8036e789b04cd38175427b502074c60479d135ed8023074b79d3604497c35450f127c2e105c2a780a90865bcb7cffe0a92523ce88c42b0cd352224ad810349bc38900e9d76d23589428557bdf92251c358d1797e4b7c9fa3022ae54dc6fb211a4a0f8b524b4d9416f2856118896f1d90fca643833cbbe56c94c36e92b60580dda94448d013b097f6e0d5e9680ddb2c0f7ee0cea0560488c60d436e4c30bab270148bc7815a62887da6bdc825a48458ff0a315e63484621f6b6d8c637ff3e9ec8bd2ca773516a20bcb29d76e251028113606f8d22dc54bc4af502511c7ffb4d63d774f993fcf982f3d8dffed11158d647007dd80a339c6e7538c4a3b3a08e42f3a1bf2701df21eb14db10a71a025b9e9655debd9b1c07714a4b8e9c743548d318cc4f81cc5dae5085f17838e1aed5d702b3419c78eb0ab7cbb34075bc0a7b7be0b3ed2ebd11404083c87e6e217689cb3cbd95b25b96e26090a6d91af0c1793244a123a9fc7f6408dd4b4453322e1a7bcf8383bdaeb7cecf928af280688b4f5c259a12dd905390092a36deed350a154aa77e57be69c9464f9f0f560db8dc98479132bbb4b644033924e834a46121bc03ed448677179569cd98a68fd1347bd51d5401b40412070d5ead5f419fbbf86155d4b6282941b211d2a11489f35b08993c31ccdb5f88f11884b1c936ed08ad722856069491242b0ad1725ab4124bf548a2522d21451e2d653bb46c1bde318b7b1b414d9a1c91e598062b09dd5bdb01089cac2c8a6982c8193615a32e15c14b42b35d35ba49239930723b1be748368c176afa8b9290b121c870a52e25c22603988895ec2ea7a93993cc94419a0576720634b689368cdef64aad2a059ffc3d2d80b0dbf585f90510efbb792c1c347f033a9fb684593092324a1b554423385c021ae1b80a39c71aa2c5e5cc0b713e0349b395305ef7446283de4d253c0b185365743e2037540001288239e2ccd5937e051d5a8c51f8e333ab2790ce3669db58d16a03fddf766b442491c8eeee4d3b0608cb075e088e75b9f58e62a8c3f6f29da7bd3cf3f6cc66d6b5519a67edcc4c4e612c409e960273648f1eab953b0a75afb43e57f0f124df56f0b1e97ce78bab2684e4ac9a35a75a91ec492ea75d7291a3a53d6f2bf878eba5bce944315d02c9bae6348a397adc532acd514cf79819a7bd063320f3feaea544192baff3aeb504935722cc13e05dab8a97269f3de6d5ad70b102e59738fad5bbd612466f65e8edb783f93a4d6edbb3ac54511ef366491a11ecaba609b9b6db7a470d88cdceadadd563b4de54aa471f68599ac3f0d5d5da3524d730b7eef33a8c2e217ab348aed114c1f2f65e739abcbdf69aacb9adbe0175ad31d7de3a47a12018aadd94b8b7f281156f3de637ea98551d866fbcc1b74fb28e751824f0b72eb2bdb773a218c9b7cc6324e598372d03bdef1c698ca4cc6aaf1ead539a38a47aed1a01ad499eaa713bc4bb4b68b758f796c3a96f0da6a409c1bc33ab5d7352ec2d47beb1623657d38454676159aded510392f1f05d43c23dd7bb07d5845cb74e71fb09674e834bfeb08d438cbad87d5331997c06a730b7ee5e6b53b7660aa34ba074037a1bd0e5d5ad53c81381ea3157c803fd45c0e4a4bc61534e614efd7a87d12554a7dacd2404718180e2939c7ae6287cefd655be9d452a927d57d73cf3a692b9cf323011bb70cfad43ecd7dc61740f9a4d6f068d1b586145332121bdb9e26e5976caaa1825c1e5b6aa70f91873f0310b2dbd6b2581c4c777ad24b6786058e7b0f3d77a07f7fa2e9657e1e09f675aef70379da7f2cf5b4964691e6ebbcf7b4be0a4ee870afd5008218413a79ecb1f8a532f9fe0944ce9f339bcb885f607218cde427c483c773f507b8090d00fc4423f4940414df9d842c2e8a39f62aa7dba922022143a9fe0943c773f164e7faea1e07e96a4882ef4e72444713f442ce92dc81c8211bebd8d2c810f08eba494b4da6aabad165a7736b382e4137cd7a31785f1d9f8766a9d1b66ad6fef65bfcd12fe16bd05a18748e0cbcc82fe84b09e2a704ff4f47c71eab16244d363a5ca085f07e05dcb882f8cc892458b0d4c5d2cf1a6e8068996112d29aec35c918f034e80801151b48cb8f23ed81b2c77f3e1a3c784d89662d066f844839a6d2796e6991b31e50d6141bf3cf3d6aadb6cab2cea18acd49d96796bd433cc6ab7d4354c3dc3983bada186a16731be156a5ad92d196839023384baa45ee7cd9b748987b0a653c99a4e314bba365970ae5183183fa0eae969a2d69e2b3d374ba8b858a2657df0c9497dbc555f4129755ac50c71ca081fa9092014d1b89e36190a4ef7793745946e54455b44559e524aa9f39eec8433f3ae4504c46faa2208c7141ad42951645b4ca1824db9a6ec70a79880540410329a772da21b301ed836e155382d18586949b1c1cd1312185a62c5872d2730420c05c660a2cc14547e18030d2e9e3e2de28ca7334fb5780255440b524554b16e642d54576c501ea5c6e704540c70c881724a671c3394d249a93b1f684f61e0c5537a63e5c60994afa668791def5a53da289d61f39c5ea7dfb7737a38aa1b26ea9d32677e63e5ba8ffe5cd0fa39dfbb969429aa20bd6b4959e2033dbff5bc7c2e429efa13c5cb9bdeb58838427d4b0a959f338b9fbed2b9336f32afd0f3a71b29ab18e5e873deb5a4d410258e4ce7591197d0e03f441b02ae8fd3e9eac0e06e19f4299f4bf920bc81f0d433bb2778e35bcca72debdb3556af34c79c1a126756bd95933bb27f4e6db0ceedc4085f09cf25e9077aaf819ef3e8e073ceb9d31ad660617529a5cb9b18b477f75bf5e0264a8fc4d1b5c853ab98cb01f7033ef41374ab6add4dc5c568f572a08e514777a897c3b37a396174095f3eeaa0701c741d0ea8beacc0812977533df421730e1ac0f85e66e1ad9e3b7509fdd0abfca276de80ea6338733401f3fb8131fc0342b571dd6f28303a06d5977faa530e282f7a4e38b9aef504ca5f3b6cd7b59ed8f0aee5a48c6b3959430354887b1d8bc20ebed52c8aa7af57e775714d515c18a78c625013965b63837179bd301314577aa5d5b18c55bf2e778f61d755a91c43e774daa1723f5db7461d2d28356d117a06dd65f5b618ea937a459d28bc71d3eb745a2975dbf3452e5ce29cae2b53a3bf1b183111e6abd36a8a35eb126ae3e88efa958750af17ed3036be1d57b328d9e5ef510b08fd64d6ad2dc1a67aebdbe96d55bd1d216ec7dbb9dc5aeb3ede8e1087c0db896e7bde9af0d63aa3b76ead75a7b2fdde193208210411526cc0dc6ed7665a3de6627ca57a5dfe30c9afe6f256d873ccdbcadbb9727fb15086eba618afcf33e120a19f7bf3f5882f9e53def68b6d782bcc6193b7c29c85b7c2302cf31c435c1bbfb48b72339f72ca29a79cd01fe63960702fc7fcad204ed2b2ca63de38497379a09e8279b1dbbb21e2a6825bca5b61ae4386db5e20f62e4a62aef376846018561d13a2c9633c3cb6c566f27630f7691b30e7c0e3893f18141ae6b63ce61673611e1bf35899c75c1006c330bf10c3b0acc232eb35d17630c410308852eb45b9abb369c232987c06c26c72f73148e8c7643239c44d82a18f6e32cd5931f056d5c7013d655ccc730871abad9239ccdb45e2f65fa7987473c9edd3bc945bca5b55da4bdc0feab594bb8adb9672636fcf05894f7353713caae720e2665eba5ce2244d5ab2e4ab4f9ca461d05bd5ea96e852a95e1de21ec22fbc55751d43776b2a54eabd28940b711fab5737c6cb753ffa2b4ffca96ee4ed3caf3a708e095f6b759243357d75a7aa99d55e3236ac75ef6520eb5410782be800d7793b6f27aa563d26c4a8920e1d9613e05b41949f50384e0b24424208216c87b09f17104208a30e56271d082184ed10b6aa0b082184ed10f6d30184104208fbbdec05ca0360deb5ae90f9edbebc42c5df539533465c6fc4b8eead56116e40b07376d3c5dd6e0a5d42bf74153820e5152c7fe483752fb2481956e70cf29d1bb9c9e276cd4053e9ee0ea3bd34950ea3dd3b7aef81b939d07834e794524631f168c8c2ec3d4cba732e73383ff3a6723b7ace39a74e472d778b1f375476ba317321cfb3b8f9f89961d3c75f398ae91e52eaac30a5b0d6cb55f5f97b4d6743573d1c17ba5a2e11a275a54aab8913f88861a29878148f22e6587658978ba9b0b89b2a27fab65ac1e858de50abae541e5b005c0013ff790b781ea5cf0693a55213805ef20a3c27390aee67c90c50f3199e93b2d05bbcc5b78df9ac7e3595c78022f662199bcdd3258e935e9da6d61b2deeb6e3a55f52ba8f9ecc675cba0919ce7c26a3c1eee594705671cdf2e61e66aee8a591376ab7a3770e0903bcf4fc26d4e4e195616665cea25eb79e18b72c6f3d9f393579a39c4e8fc337605ceb9a0fe79757e7accb5b96d56dc76fb5e68c62ed45306840a6341d230132fd42b201cc48cd9be30185fac24ffccd0b3d79e85710c78387f95d2d08bd94603e7a8a4834fae99ad760d6f41a9fc1dbf4191a70f9e817bd683c62a1b72fb3ee1c8f0c6fb248842e85de69f00262e33eaf3aec0b5ed59d36a4627ee119af4670ded350703f3838588694d3d03f9726e442d50d3aaae417d6713995daa515996eb17b5bdd0a99f12272fae5574e11b1d507de78ead2b294fbbcaa09b95c4a4761568dbbcf701294e770a705117a7b39751d7823b974142e12fdcadb2c125d66cd7da00d46d23f643a8de748e1cad268f226f49be6d44d78137a2cf7e0126691f2d4324e057158322b33b7496c26ddca16eae512b716a462ee10cfccf1a835c77e3a48dcf7aed504936f7730c32d2815c4f9fbbcd690bcb02486120cbd731270efdc8ee810cf0dbaec08b4c7cc720e3392a0dfe0bb761d2fd3a2ae56b75e14ecd5c329bfddd5ec27457d94b523ee7701fef6c20341ec7dbd26861fdf02e0fbf8766ec078d1a1a700793287ae42862beebfd942d5d8fd8d1670859e8f296040050fbc9de7b2fb28068f3dd66af8d459662dc935c9316c65f3b682ea33d72ef7569aa5aec234a7ddf8f45631b693a4f6ceb707777363fef50f8f47057813c6753ea3bcee6324cc62187603c6ddba94d3a8e8d8cc47de8ae7042d36fc7dab4ac67530477bb50d18df47e9ba463aa1705cb5daa183b9c96184cfe38b6fc22b6b4b98ced7e45f1b6f30d72ebf3420daa5e1f858c634225d82245cc2ef359a9570e7a06625128e38807effc9195c5fcee5ad0579ae65fe80e2672fbecc632631e6ed178e8fd5f8e2df79066cd9058410c2863af0223e2f22e4d259191176f7a693c20e8ca856417a3ebb29e36e3a3a3a3a3a3ba4cc79739a65962948297b6684a862052978b9386ff5ca905e5475cb0ea8ea894f77d3b95ea46cb2e5567fae8a19e78b9beaa1542f79383edfcb6a0613697c2cbcbc1128bef489658e5bee569bc42775ca0d087e3b0bc3f0d02f6db74ef3d63e81e047d6d67f61249dcd96de324874c88ab9be2ee2c7f8957471dcfd4079e76d05d5bdaac6d5a90624abb3469fd14fa67c6fad3634396a6674f8c951d7351d383ad580a06aad5507768fc2f16d72d49c6866bce43ed084497eb59256f212c927295aec2e5c5fca15502dd3f819efe96dc59ce4251c5d6a404811fef5a81171b7145fc3d90948be576ab8820fa8309f9735ee13be21f06d9b5aec72e93ea07af73763dc0c0671f3e5aa6acf96d35b23a2248e38e2301212ddcbe937c403ea43b1cf5b45cfdc8f166e86a8f0d0690659d1b3119a3dbc41160f07f8bc95f421ee07c9fde8e7f2d45344daa977dea0bd3255c4316a3161e52f8fa4c6bce6199755034272ac9dc69de38161926fd549183e79115291ab625bb3975be831684486fed9843e5ecc22f9e527bc911c731abc917cfa0cde842240f2cb6d29a343a8435745dfa09bfc3ac49be67056ad08f59ab72297635a91e896e45608e6995684fac92bdea04f3fe51411eb24b74e72d705f38cab64e81f26345ee35a11ea5be6dbe5d0555198386780adfaf41a8b4b4e83b799bc093d509b308be4fd17b334bf4af9f66845a88f2c67ee47770cae6b310106b6d0af3d40e80953d69a9008df6943eed7fe1e42d2717c1224ee6868e88166de3a04cade3a0b5f9130e09fe37139d0fc249803cd222a7cf5119030e0dbf1b8dc690f10da71e52dfa04123d3a84b949291e1de43d84a185689e86654209e523c98f3ece644e7dc687104258047de43eedcc79946940a6064407be3e4f3d90c7a152ee20cf0d8e08feb420b5f3e6306fab9f79ebf1d2adb55996b19e4d963984d0ad7b67363aaccf115c471e216fefed168fbe5d84bcf5f01242de565de0e4cdb7dce40d55452a4381ca73ce6d051f5966597f3e3d9b9992848260e84d492cf31bc9811e0b3a0c3fdbceac3d8b637e03a2d09b9439c9ad6f98d3bcc5a327f9739d1cacc5d4d4a9d39ae786655786172f5d70d95205750978ea4efa6680b983ca40ef2709e533473179e2cd33d0db6e5a0a56b5923b58e39e6308f4e9d3db85e912a677f6819f6d384ef253364f4ef23c4216217b0839955f6e27f90d0941c0e729df7032d0fbe77392a66b9a10e8ac97af6710de1cd36ba697a66bd3ebcca9bce93cc9310d0885821bb7949e82bbe74e4872d73da826e4e4999330741fa8035f476193db60ea27ec3e07de7afcd652b6d56f2d45c318863da49e95dbd97afcd63369269ef1d684d477d2677aacb0bcadfc1db92339e33438f54d9af16a4c81250b32c6b840992b5e9005125a04a103368060e30aa3072c528ce952e518a39ac2d2c346166c64f12146bc7a39cd0615bfa9acb0118335e8bb161b4fb071c498357620c4022ec000c289d6125856c0860c23f84008882b7c300326a6e8620671a48cea983063e0c862e4c491911366bce99d91135d7c7bc600cf604c4df1a4ec0205085c11083c665be284f2adc1830fa2a05eca35ae78f9d25d4ad7b932e72c55e5be9c35aefc165fbe27c53ad57b5a12ddddfd2050bf144f14b57cd84c8d2c475da000820c6944b9a1045798f88087521a42558a9c10230a16217e48e22765841a5d5e00ef5a6aa8f1f35d4b8d3364d043a38318568279c92d564274042bb992871bf3e847308ff948e63007b567ae39c9498872f3bd3087ba977cbbcfc64d36ee4144477274bbf523edd61e41792907951c958dc01cda394807e65037b94d36e5209fd612f47290c31cea397211e610674ec24144473a3ae6472e0fba1efdca47a06739a8f3cd412c60587e39a8876013a223ed2f0705111d79de3948f397558039d42bcd8c0e8dbb1fe7a5c6dd0f7512a25cf77372f7d3353888c8c82907f5cf7593d36025d6319fc14a888ed8dc50600e75cc95587973538139d44970c1cd4a828850703fd2a7bb1f2c2b91ee7eb6a652c23f5a86dd4fa741258da2478a9232321d05f733dde7fd38152d09c14795b0d1c5fc2026cbeb78d71243e59f0684b582f3e90e339cab7ad97516b09ff903cea53fec03d8438875d0c0f2cf7d98c05a017a0f1a564cf8f7811806d1d0bb3c45a5222246552a4a4a8a4c05c1452a082e5c0a063d3db475c4a52725443d8561f237ef5a680ca131252b8a3c344a85c2f123a334ba481581e32a94cf2e2a78676cc1447586152650a586883a8ea34ac5e00494afb477ad337ef0a577ad33c2fca6a325086694f92dfb67c61833c2fc7dd732a3cb05ac7bb6b118fa96124209217c18897bf0c5ec3d24b0768f7607e1835774cfb9f7eeb9f90f429f58163d8b0e352011c2e8608c2ec6189d938e04bed48840cfff5ebed689dbbabb5b23021d86e9e79c73ce39e79c736f8b7d197c6434f9e8af4be812b676a0f8dbf40da83e75a0f858908ee31be2372bacee26f658cf9f949e49e80d65dc821e529f299abaa4a76a6aca089fec9a413ce3789ac1749153424a446b0c0c0382cd49e9a494d249dfcb7a524adb0ec9edbabc1eb0c64c6253db3067c5eb62c1bdfcb1acc72cbeed1463cc38fec946236514a34aa5876ee326746568e85b806ee8694e6234f4d181302d438f413243bfb9a2a18f3947f780dedaa97b40776cc49a93e391fa01f3d87f723f30876ecae8cc0908118c26a338e5c3b579e8d3391ef53431fc9a530e8b9d30875e738724e6a7534f9c6a6c06a52ae6299bba304f496cce8e33522c528f60b28081f2ad1511bad264e85b107a82ca50106865e82395a18f19092433f45826750fe83e2feb1eb087db5a3ea38127e878509797cfeea4b7de7baf8bdd7bedd56e764947489b067eab4f4729d618312c46c7b068b14935207dc4c5b0fc7ace3935221990d91ae3e851997b3b71c628b521d263de6e36ebcee2aac3c5dcfa7396cd9548968ad3b1d474ef032946022d96ba52b27aaa2b8624e863860416919e613988ebf2d6b1bc75c53cb6c880f2365fefa38438070b61edc7640c2a0ffd49978f31f56dfabb52354553b39104458c04c2fc5690ca2195430a05f7f99309885e21019c07b55043a12d3968b1e19d293e40e78b756fbbedae85c598df321e76e59e1455fe3d7426b8ee528c87573479e8198d3630c2427d966276796a4af8aa3cf49a2dbec6b52f4fe3360efd09f126bcf59bae9ff0852716581e3a8d437f6e54c568c9db2c83585aa91181f4a409b94068a8e92b086c40a011a1711bc7b49ec18dbe69fe846c9a3f4d2352e39a63936572e87d9de44f13725dd2d0e4ed72e9d0266fa6c79cf4271308fec29b09055fc20719e4408c1a5001e5876a436abfa59696a097f076fd26dd946bb0ed9f98451dfad32060b74b88083ef3ed7a4c048fe52d7af4eb3e106b79bb5e7a6441967411fc6b6d119dba748ae533bf5f3ef3d91af343a86b6e6b70f48873b88659395c738e87c927a641a25fbfb420316e9248c96dbce4366ea51681a03ce2cc35cc9ace2ab9561d8b3c2eef227093ace8d1339f3985ca41849ee4a921355ef21a2f79c9a7d7e0acdeb80daeb1c1d3b3e83a5ce29959994ba7f14b2b72721f685f66833377da04dccf8dd093b00c3a9c06e70cd03f3a72d4ac5899bba7c1acccad29f7e01491cc4b9e79296b45322bd3723f40e809ed0142421ff3262120f4842604a786c4a057f2eef28861f84be8a176f98b9875a09939d07c24b47a2953826484bf9e780bc3572c8700f540a8bf84be5a6aabebbc55c346e25eef5a3760f21af56e105a548ce92fa8f8f2ae450593e779d79a42cbebf878abb743d512469196a2e1e2705d6b0a2bbfb92277848375a8eda2c0f8e77e831ffefdcbb2ff6d478a86db59fb60b31ce1bc6b65d9220b14599250bd6b65b96187183edeb5ac30a265850f0bd8c18d1434544840d820071b30818314a60b1a2a321ae878c1cdbb561535a4deb58cc2b40e17f5ae65b4c54d6a05b77d8b0e2e613377dab1eedf7b875bf64f870b8bb49762c185ee3e3b7a24f45d98d14a9a0b33733f92b497772123b91f497ae89130e0db8786befd0e7d7b36e4eda0ca288ca0f0f2f6452f47ffb2975ea2745ee2cf0f7f82eef0768a3c88828b144dfe398e7c2498e30a6ceb704d3a3a5c2eaf084a8950349165e611fd52b7b8ae6052ec13434539645f14d9d01ace18d20eb824a04202946497fba0b0827b875baff4e2df133ffc73a699ab06db45e41cb68b80c135d9ae413b715db8ed3ddc6ec1017eb8aee5c49113609ce0c209230c3861650772f1d009290f550fa1cec3f7e506b26a20c8c545e138f4585f1332a8b71329a5a71b2e1785a302e58007ba847eea2c00bd4087a6d4204e5c198e0c774614474fa06041101a4a9827318627330c3de17182058d2e4f1c0e88c64c61f458f4900391143eb851022128374421c68b0e454618118421e61152a68e93183c79e2c27063a4e0c96552822ba89079030c1b5050410e76f822cb11519cf113c7113f279528ad46cfa0cc132fa81080931e3c5139f9e274d08227683ca971d286ebe287131fcd83eca48627ad270a7002e6c901a2133380789200273db801195e3cc1e289d322f3939edd87f376dc0ff9524a29b32aa8115edf2a4edfaa90ec248160e5a59c327829e5e9f4d14f278754a49c502080f929a56f70453c9cb40c8cdc0efa0cc78327570cc0490f4f7a9c1821460c119470658850e589edeeeeeea6dddddddd4d73ce2015364a29bb65cb39bb674f299f0bf4593c3df4f00f94c2c78e1daa6723a51052082184105219678f51e2361398a3820782dc8fe8cf53a00e59b8dc9ef095d21ea2f985b70a5ae27860cec8bd157468e4edc0a11d9cc725ee668296190fc101e02698540e711c92e0d0df10e4c90e57beb9a2946fdef3383fdc6dc743efd11c738c8439742390073bf414baca0990276725008701b8fc49793b97c3558e1a38c57df3117cebf9ad79a078859e5fa1e7ad5ff6ba2ed019c4ddae0edf7ac8ca2128b79e0001234df1cd1ceac89bcc40f4699e1946e115f649818517827aa8975069a3b76a2fe1f68291b41cbcc23a30a75d003800580500a870438139ed24e0b60273da336e2d30a71d6307731c3b98330276304704ec604e083852be8bb8fcd10e302a2f385c38f076260ab6d8008d772eced9dd4db312f7f21bc7f1adb5f498101c4e7fde603acc433f61e6157ae8741c1feeb6638746bf8f7287197ae106f5124ca6cbbc557b0818073793d764a49cf3bdf7de7bb7ccf70b6fd561705c705f27f907c315b279252bbe7c09c240bb0770602be4594244bb7479a7e5c8e339f24e8025ebce470597e18bc279abcc4b380ac9278ec2c47f489af451c1f1687f18062864dfcb0106deaa33d72c0bee4790e3e1b6b8f1edea68236f27c349b973abe13a29751297afbe9df0a4ade7a9c9dde399a1a909c16d50eede7411b07b39a81c02762fc726e7c0eead6af209bbb7a2d199c91bce57d5571a35bc91729665236fd58e836bca5e375807863c8ed3024ac778c0e64d2e62745a9c73ce1979abe99c73ae4a77f41ea01008eb82ccfcbaaab5d63e9daf0fc8253117e417b55be96f9d6297e2f470b11e13ee5b59b7feac7d39d6b3eaf555710a3a7184b85beda148e651384eeed64dba49042293c43f5147e6052c40e030f48ddd57c883f949488e0bf435795b58d2a7acd1dd03fa4da7a762e896f6ec783c269f9796f9747741fef40a79aebb0993f08e88c22a5c5f4e7515de6e3603c9b7be7aabead9afade76ba6d2698639835f58c9450691d552bc39306f5d4ac77972b1fb19c5db3d552f1007dbfe832cef5a7080f9adf4ce7dbc6bc191c43b6dc87c2401b88e01160057e89d3b6c552438376576a3cb27a3d0ebf2ad190553625cb9550703fb5d4214a5e7f85ecc235cd8005b63ad7e42b99a553fd51a6794225cea4b88e4f41b4290524a29a59438ae5aed90f3419cab83021ba43f95a2eff456d42b76291fdc53f59aa35c30e69bbb8448fa7549592f395dca2a2bcd2c8734581d3994b1f22f7afcd145e0779670fa9b1a110d7c7ee84f1b824b0d1f540103febdeb6f6523765f5fcf5c7277a8fe494fc98ca41f7a927ee8394ac37e59a05436efbd97e388cb79b9e616e0e42caa33cd5d42943d04408765dce7576abd77f3dfb08798cbc11c0fa883c3e46e3bb087be43c7478f0933454ad820fda60bbdc6deeba22ddd25440fbe053c9e7e9904437702ac765db473ba132ad583bb65d93da192f447f7171fccaef4254430bacf60716ab8d80dd27fd5eba2fc96737af656d27d7065c4b1d3bd67ee4733bd4b88a053bffd5adc0fb7137dba7c2f63e75d42d49906ffd9a13402336a44a053f9d1a994ef85a6aba6213a64704cf9fed4d1ddee370bde4f382d74026ebb834388ef6ec246789dbb696f1929ef5a657828c0bbd60fc03cc4499971371c57ad76e024fdcfc17c9109c6fccb51a647ec5a3fe8128589ffccfcaece2b81edbb84c8b53b92751880a55418b77eb9ed9148943104f6768a8cd418a931e614b284a89fbbec664f763e492965778a8c7b7afd1cbe1e58878177dfce7c5b24a20d892fe57bf23d6735155e98a001961417b739a31e074c7c33186be8c186285b8890d0025bd0022c3fd061861e7260c50f9c257808211811abbae168227f00070e0e0793196ca475c237822e8ee80288284e8e78a305470c2fdfe8217b68a060846ed8d50931c628651a2fdf58233a2e108c0ab3cee95deb0d2f7c2053c58d297468b24397188660638b237e36247ebe3103000041004ea2f8220b1340314616308878a3872cde60f20dc4752d322d3264de39e95d8b0c984786cbbb16192cdf36c091c30f5e076499df56ef7e7ef0edaebd26e08a142828e2cb12547820e1106ac10d586c10e204584079e28a50b6289302881ebc685169020b1a411072c10d9c2c9183319ac841882fb40d37aefce08cb0b4c1c40da2b7ef5a6e007167deb5dc68f2edc6d0b3ef5a6db0a18189dabb561b5eb491a58d2b8f7ad76ae305df9e391ebeddd6366eb848ae7b382fc3ba771136edabbbdf69ad05f244283d3a346f2b2d7b9994ddca332f0f7a8402795e8f0ecd9bce4a66d4bd11ca43a19f07b9b0da7be8dd6fed411e4f1051672dd2877aa8837ae8c707e6408740f467ea790ffda33f330bc8cb485ca0fff22654c3cbbc39a3873c3df403dff876facf6fdef8e742da60d2060adccafde6ac78d846240071dd1bef7e73583c3463c91b59e260811b2b30fa814d247186162e44c4e08a267e4c58e28a1823c6687154c40f7414e4111a220a10a20c41660c1a6afcb82d35e480051c69f430c3961fe8430c3ac0218a2edee0f2e407ba0ee419018a369478420734c071c60ff4e228892070f0814c146ffc40f7a94758f75aad960f07e796fa8637ca982f2ac618638c1175ef8e5598306c94b9d049153d3d36a8b5478a6d8b15019eb6a884cd5595450b95a219010000004314002020100a8744229150301e17ee7afa14000c96aa486a4e1688931c46519031880002080184000080010400cc949815ec08497c1cd2c5718f8ed1db7108bd68bb15333bd6df315d1cf4ecd01ed7907c988e848beb02844f578af84d2bb6442e1d7fb097e65cc94819345617ac7490db0e92ef69c646e4da714fc7bd3be8edb007cf35da4d3770722837c7c11e0e0811eb8a899a9e8cfc4d13bb2cae8e43ec45c33521531ce8eb68744eb4ff31e5b8b010f3b0c58a208fd3771c106d1bf4d96d5016c92a0e7bab2321df68c52c71d5742b238383487db45652cafa45eb31c8c85c34dd8a19737c7d1d24d2d1a46b214206da55b2ac3a4af386466c814b0d77a465e4209b1eadd2846fad1811cdcd51766f5a732de79b41a3ab0b912db4828e90859b865dcb1acfa4b59a446b1c23df696296c5d581ac3d68d44d46cc446bb564b5c31b1ddf769c9b2151cc4ae57225b642b28453b2dcb86b23247e6b3661b808b13ac5a3c079b80b308789c711182c8ccf6bd5d4a8596e6f0a6781e5878d461d5330e0158fa1695af8c0bb9f4a0ca8579a6fd82dbd831d5b12d430325f9331d695ba18b264e36ba9751036ff274437f48a38b4c20beab213cbbbcb28247edefb56fa321614aaef8f11649d79b7a069f4fb6c9845d5fe2bd27b272365a6a515f2f65a39f361130637f62f3029ee502271d77499fc4c0e22eba75d3af2a3c31b737813c7be3507c9f734638ae5c641c45e5a722f869c4993abc8c8561a74656e1db2b74622ae72e754660e68764e29c76b60d19d13ef19797674764e45ddf45d9d5391b97adc16411edcd2162933a439d77a4709bfe104b2463c86e9a4d31debbf486cfc3ac9f5b1623e2cbb9723c755aa5f7960015f31bdffe50fc5b889527a2e6fc2ac0a69940da9f9fc9de9f0c35c43c717b6bb10b94fc1b8b426305e89b17c31411bb18559af9fd12680e68d80b05c03ea0f8cf57b6b30cabd195a3a550882bd496df2015b0b0324bc9ff95774a73323c82e0cd14a2185cf10199697cbe8723b90301e3d0c5aead0b75b0d1d1e5231ee29e2c36bfece82462d92af7429e6865352dc4d8515f24411df952add10508229c623f8c7618d65bbd1855f7fbe383730650f3b66e502abe682f76717757d5678396787bab929bb1620160f30b56bb7edce8095c108d982b0d90d254a1c56162a0b1d41e8e2ceb6b56fcc409e2bed9e74a22c902786444e28bea850dcc4756b1a15bb465f732b0c6d04ad60cb1350e883e5be81fb788652d79bb8064041b61374423f697688c0c10f040dbf5a48fba3379c3a46305cc0962042946f45d061c3b24caca97d2f9eaf764455e57f24313e77df16f9748b5f139a44b24eef1c2530aa8f9578f15b6fab244fe31f8eaaed70ef6b07f9c7f5f990102552a9c58736e36f85b7edf0db6e25e438356dbee3828f61bbf3bd9e9e48ba66a4a89791fc59e4acbe0f0cda49e6342d02f71c5eb800ba2488b3eb49add1f58877d8064f9ae6c6912e314a555c0284a37efd47d93c147b8fc2d584ecac7f4b9cdf07875d1b7b63c9f8d67666c89ccfda2b10a419a3bffd14dd2475d950c44778775a418e9582438a9ecdfb7b2f4f425d81cfee8a565fbb288513f9266ad2d4de6399c87a15dfef33cec485f5206ff6bf7f254650efb488d47c36cd3b2b94c78156594f0a6c93c7256debf7678b73a39b705043b25fd1762751736e4ec1814c05ca64a3a4b7515ff4274f80c3241a51937aa66ffbeaeda3d51d396a4803e26c9f1430fd2a44f4b96c84fa408915fd0ad5817e143cc095041122ef9bd37afed4e0b6d67d0e6ef28392eef7f5ee69ee505e6cc3ae4364f02419818cb72c2ba87f79fcebdd0537236b2125364f91a519150de33e7476d854607409471aaed4027cc02920651badb076fd16aff58852156d415547c953466493cc06b250c0e4e4426a0891e78d8708f0ea7edf286e05188f3f2a6e49321b933103b68cc92a82ac8389d33fac4231274105fe02dffb0e35cc3a2c2c5c280bc321343cacaae10e3e5346fb129034d8f30573d9b9442c477cd95eee2e8d0195525390710506146b8593168f76f1bb154f65ca86164f2424df4c97aca3a925a63b096f95ae711028709359fb9c9eb133ffeee9232b25d22c730f0943f60c36d6a24448d1134f9f5009bf56b4019bb027a46dec16dee0081c0d14cd7e770923f13773338900757e2f01146dcb85e6b16556f06d33ed6d3aa7c94c9a3cc833c03c51de3323fbaf0140929171ccdaac86c3aa403a903d3d20c2501043a09ed2000bb768285567078a847b8467119f3bb5d6e6f84da0240c63e9e570bad2b8634acd8156d39954095ec69cdf11e12a655f5c01f72373bdfe14086d76fbf2eb9d313480d7a58c17be4327c1176381acbe45ae2366aeb200c320770fafc95eb2dd41947002a86b187e25318ac2fabc6eec88fe3e0ff4a1e8b42e3e91c29c59f7b1a0433e25023a72a5252b3296b0bfec776d830104a0a9ffc1aaa64ebad00df9aa24a6e83c798193b4af30ba169a834b6e8a4076fdb2378e0ddf5214400af7d31782f4cc71d3b9d212512447b2dfa2bddd9166b2f57878721fd05f418ed7ccbef36427b35bf3ad6700f8532d91c26676e9e5f10a5ab05b28fc4e7f34a17618d0288ad8eb71a0e5004ba0b8bedc30bdda7898613c112ef5cf41669faeb898e19517ec8afe5378b408e225f8f555ce8c781456ec48d394bd33f63f84b3bd4cf928c631bcb9583cba8e6faec3be10322ccb3b0cf1ec0b23f20bd6941a078103cb5932f0ebb678d33b874d11b6866a628b2a23a18d03b054c23c554c26ebc1fdfb61b263d4ff90282484b038b9812c7343391f1004290013aa7838c7220f55870efed056982ecd949cbbb3e142ccdab4293e7d2d43bbd641916ec0cb4e2aa821d05ce80533bbd2621adf683c59fa3968d3b8818160fe93bc42b1e7de1c90cdbea47402f0d4c63c50056af019aad96c46db6b70507fbcf46f7ace60614a2ff056542289f55eba64f8fe9f895b454913a433f88c0ee18b00186b9a399a9e1dcfad4fc919987d8273edf2b02b765994a1d4c3415afca08854d32e4e29d46d76e832288954f523e69cb94609a67d2ec26aa6514b745204d2d137ccd2041a34cd350b4158306617b73b3dd0bae3e721493f64cbdb9d0a4fcc7b82518177d0304f9d7df7f85a36103c5ccb01b2a3933f917a1e1e21dc645145dd3a0ce520aa9478727e9ee6204ca2fe6c1f20f4c930aa94039033d816819657c71a30262585c87a6613ed0db230ea9780ae64f139aad337bd6bf58c263ad687d59f425daca12c1a5be4e5044b3e313261414c3f024a88c5e4033d07e968f1d0d82569d71b5aad930117af9deeaffc28403ea7929907aaad71257e7ceac1cfa65f066abf5e18b0b7abe5a63973e81cd9602dcaf89cb48c76093660b0b3732abdec65cda5cd28dd18c4f69c1d5c2816bda303077d951935551360d9c41c3b0e42933f10d535de725085fbb601d6af19d38eeb1909ea5fbe78abbd0a37aee864c7c10c26aad1d2062ffbe65377c6ddea0bea0a4d493c492742ff9453b2a5fe82473bf5affa9ff80ef211c8a3fb1b021941916dc84f20e0bc9d76079827d1bd4f5a31b2af30946db3248cd4e5ed2dbd7aad2c46b44fb6e3ea857464675645bcebebec4cf3094929a4c398fd1620aeb96d989aa7ee936a7d96db61b1462d78285e204dbdb0e431272d1fe19faabe3a2a05a6f04c26c252bb436e8dbe02d0a83280e7bbd1c1a1d1de2df4a052f229395fe8bb1075788d94e5458faa3fcfa6513b4f62104999cdaeab806a5a0aaf21daaa996b9db0e1ebb596b5bd159aea59e65428495b2ae89bdfac01bba9b3ded0e55780d4db34c7e8b079a13bf9acd0e0fb144b2ca4385a56ef01c192e9aef65abb4c305c09c4477fbd478e7215e5fc732a778c45dd36239c221d7427b4b93583e2521d661391cfe75fd4f9f3575957d137913cd9d801e5bf2b91064a59447029142200a1ad92235e282cee8c1c49266c850608f2d23265150ce56a864a99d14360de1a44431d38f3784e7724425719e3de3a0f1eb82f1560f98a690745e8f3c5ca2bd8184dd361ee2d7a61a262e5357c3ee999c3a95329b8a1c105f1672e42e8034940fc8a51a4ebded62c3f68aa82f03e2209afc9f646c108284a647348b6966799f623e9e2c7d8138ece7cf566412f4c2c4176854c2472c28c58ef9b48daf0cba72a3c118d3af6942a5d7fa189b18e089d4c3c8fb5a1fe84365f179254c57a31ce6eeb1f50922a7219620f5dcd202cae6fa47ce55a1387e128ed14743e206874052aefda55c761938d8b508075f0df4c412bcdb2b0e41f44ab33ab5924e4c47cd910c8856ecb1386119e9ef5f233d01a12e840da3d2ad05a0101cb358335f5c02b6b5bb663f8447d2c188555f5610ab477669c8f1c3862dc301987260d45cfdcd029709a3860307bde9f3fae6abdabd0f23b7080460d966667dd6e5eb98f841e26cd21a4da17abdfb08b7cce390e46c98cd7814c0c52558b338faf7ee09158166b03420ed92540f731a1917113f158f94f8f3e49089bf3b0da5ea5bd94eef8371a5b5cf63a6948c813e0faef07da5acd9a24a260e219576548f4b7aeb63391b6fd48c5341bd0c8be0a439e24abe9f7ef02da67d96a7ab7ee304d681e9741c89635a3fb067459f47e40dd7cb14340af7a82f349783b6564d436a43b9cbe6be68f8031bab1e0664fae70ce2252896c8c9bcde3c90e3c65503bdf015125428413b7718eedf757eb7ec4013e76bd02ac61a829caa1232c1deeb91f4e923025843ba4619e4ed16e9a2e950d3ddd85019e1982d7ca5fd5db9878b4f352785375d6227418e1071d958977f6bebaa190729a20c0e440970fa0b7970826e3c0b18f31fa3e177b915231364421fc5cd191999b1edd045a3166e6718f143e2c400eb30c3633a0e6df56b6200a56b9b88ad69f24619624059271405a544e4bc16f48b2eca60a8f77a75633db16ed8d4e43c419f3372c91364138f5aa55a2bdc80d7c7a64dc4d664998a2e147a5c052387df30d28e11e9ce5d397b773670ce25f0e4ce4189d488e150eff7feca6d6b66f67890d6644b7c2d20b04d950ed0763dbbaecd604b47c72fb0fecfc1e00a2a50a9800ceaa9b3e5315240626599810ba5e433e9a94f473e9707b6692b2d90aa0be1a583e005761b1d974f903d1537b476067d982d19452994897fca6d37e675c515d09480d574663def48b45ec6a2c76fc9d30c5e35a9e3f3c35e3e917c17c2b2e3b563f1d4b97275bca542cff8427cf767e3935410341892c4099df698d1be4571d9513e5314b1e2f5ce176584662b74b81c3829b54e5d695e84cece141b1fc839142c8601e5f110818d7650a14be8f6b28e1d3dc5f8befb3494eef146d0a0712065cf6a3a11de548cf0984e60a6effd152e1693d712c2e9407c37d6f865c170fc732920926ce06e822472bbb8146334bf22aa8ae6585137654d5f9c6bf6000e88b329418b5d165fed8243aed29c76b9709e61cac911cb57a8464c07a5cced521136fa4899f42c924ddebad6f11fe916c934010f472a9613da887bcf590b951e4d494dbb32174fe29c7247c37e4fc2ab1a43922984210a5ac0d39b96dd2a988e4ab82d2697fc5617aae2dd9f0dde1c11b31b34fde95c6a054c3a9c3f88621dbae34f745ebb947ead29a2968747d6f2e6160de1ac8d9d5ea40132d53e3cf7c5ad6f68d372613552834fcdc77cf26d512c64dbfaaa4acea6edf8df0be5f74c1e6be16efb80d6cce3cc088b9791f9128ea1bd6e8436997852e44a1823cd787b2a47f06df6375e058ac0958f5de314c858b1cb118f8ccda9040b7dc2bfcf2592a8f055acce0fcc319221c00e25e55774fcf508a780c11fc0cb94157fe8027283507f48bf45dbd0a65e475f7c2f934be1504f598447443a0a792eacdeea73b04f74bf52f5a18d8f7a8e440ee80eb959ab4082e28e23f730f878235520014f6f7507ee19b2e553d861b893e2fa31c6c4f5b6a478fd93579af791ff2931ea911ef8f294b6a09878d8be8a2094ba9c749fb13eb22df5d97328d2c566c4db93697142941bed7d384009fb592baa65d2f1ecd64f6080d343eba2c191fe84712283e09fab3daf610a344f2bd9b6fb250f7a3b91022ff2e6349dd12413a298fdcbf186fb507086238e0750a82757da5254f653bb87689e2e3a045ce0ef9680856401988f82b729e45baccd86da6379d04f904edfd6e70d04227e61dbdd566c665b731631299f171ea02792f242651a9b6074d30f25ee304fe20eaebff4cd02a2e39799e90206c5d80ba56fbd5639a08c050353c7e87a2f720606b05e975e94ad7ffc19d956996a0f339dc77a9c2daad456fb2e8113ac7e3cea8573d9c6652d309548c595f9495f3060bd10bb2ea4a38fb37a3d3fcb57a811b7ec6bb94cef21c0a1cda0090dd0f5e77be15fd51f83e08bfbb535e997ac56103e60195ba7c4251613c79f5dd7a132aa1975171af9d08d4d3ed4cfe6435ff052088f31d5954f05b05ed245ec572d19e9ac64fa9d4ef7f746293e0ddf792d53c358775a2529d832a53321f369f1f434b8bb020c3f2b1996eeea216b5cbce4503410c98125f7395277ad284ca68a0b9544d326b39041138a421111465a47762850b6f07003dd62fdcbc27c4b40d57c9d6ea60f6e6d866dc63b684a0f8a106d42ad0650e679eb7ce0bb20f2d5271c663de0a26a9a12a74648834c2439bff5199e5c8994709a0f3949c825b8b590b9b0a8ccc8965a1081e092740adac9a6a8747fad864878f2bd504ea39d3f976fb253afd49cf6b1c2814e64308ebeb9658dc6d426f7cb47372c3878a68e74d12d4c8dd0ba746b140ae87fcef9572de3358398b3f5f69ffe6029553a2eaf8e4daaca2450cf22988cdd68ace8cc979113101724940a360468cc7f9bc31a71e62a3d326f645d5c8ad8e225ad9141a7eee17638975eb4c802ccf9ae7ce1a088dd406e8c5ea9509766916fc96a07562c6ee69e858c6c0f604798df30b90680b93321f36cddc8f73a65794443578a8aed6def6867b6553c1104b584837fff70453cf96b61edb119f56fc63499e7a79d825c62f1ef3af67f7affbee8113f311fbf4e87ab10be0d18af44a89cefba50539546f029754f6b3864cf9647e2fe1b54458e7854624c25ccce17e87a63cbf5539644e58addde652a0e677ee7899237e61f160fa8fd8a97f08243159655f58852b9d9b4ae908f0a5887bb96966c035c388be3d36e0e6e6ca7d06429f978f77588d77f30cdf0b336eaf54bf461fd687c2d054c91faa91b6895eda84a09258640d01427f17b745bbdf3f4d39a15e696fd07532c89583d66ee7e8ad8f366f6a12537123ce3f3f96d5e47882ee2f3f7b2720d58e4ea3f0bcf2ff8d64fc6eec620d82b663211fc0ac39ff6f067708f1a0737ca0a9da42810eac26a06b5611ea0f03fe4c90f86915e5af4e5d6f77db3ce47a2049911b042129ab77789b34f57674ec1034093e7136555a99e546bfa8d4531fb4eec0634d17223256fd17be48a56fed19d576bfc864215306dacb7b40478bf83abae8410f1b95884a55d5e3e6165dcc9c3a227581b557318817b29a5595c6dc530703fd5663907b04ee6960d9f97f730e1dce079d23005df3f0809eac0c5229e59c3217a420005adca3531536fc1436aa6a211406e3ec15077a4fdbe847a54e15a548092ad2d1daf20b2a1c1e6046d3c4f47080ea930ec054a871a0bd2e1a1c10c0965e366eca6757bd561c2111e013eed45890e002941386b0ef359eb53e5f84bd57fe610ad1897ef9a20f55dfd6b9978ffd712fca85b628111989debf4da118204f5d9e8f1b84bc159e2a4bb9b54407edb80f064983204cfe0b7c4294ac2d34b3bb455ff0eca2c6520d6a66a15b8578fd417d6a582b7fba139c2b6b9ba1dd16c61eb5f2a644612d28da342646b078ff141a89e0c565943619e8260a68061af452a34c7101e2b5218b76c8e4ec4b74927497c0f13728a431d872941d6b39f32793cb2a489c560e6052c30992ccd9dd97edad6f7c282fa0a074a0e2a7b69650aebe6a35942defbfdaaad29025d9a47cc3f6c82da49aff112a7276c64d28674b75f96bc1d8c47149638a4160c67a0fb3514c08fe92cbec7f38d5ffe2a27694472afb87804772ac29a20b3088cb2a6fa79ee719fdae35d2962cb988a5db8931615491c5a206a8f0a568501d6d98ae164ff32d0c1c24c94bdd28e6e6d3731964f7a7635448b459749a25126a1ac91fa59d0adecb06cc57df8eca68db905e33b6c5fe59a9c9eca5c76d1f916ce89a2afb1be882a6cb28566c8cabdb29e9ffd38dc8dea7dc859f0d5b8aac226cc2e3d612828df802f2962877b1027421cadf7b4e44cdd0d0bf2ac0bf1e329f571fb6d67dcba27d291d6f5b0cc189b015f8ac695ff310c8a0018e18cb87f802eb05405ea02f87c74b66332e6fa1db0413cddd4449515d2f79b6de6402355cc04be4a44c36ef945e5286a3df6b69c7dae5477822f37c2157d6cbbdcf69f4ba9d3ccbf7e9f05e35e5f68ea7fc7536f60979bb3f00057da80370dff447c9cd75c23b2bf2fbba02f290b7d03b91780d797bf78d49ee6e62e56a43e0cb975f6dc8435cd9f56084b860f8ad77d528c906447b24a8d8e185f0bd81bd3332b78548fcd8ade6d073c7d65d92c4877d2596913a4ba2c1f87444040ae2ef616004a0f2142da24aaf9720936cbee4ddf24aa9428c1b83c8abc697b26a2a15a2dafc43e22ea736bd9c264e4e2220355edf6a1c94345c7fe4df19536b8737a599b0528f3e2f62de1d9662fc7740e84af7710670947b01df7861e99086d9684f02f220c836530d339af8948f415ccc773eccbae644349a874f95bc1036770da5296e95b5a5c3b949c782d21238bb97e5daacb82ceaa552bcb5e7e9609cc933cda79edc4be9f7c55115fce67e6b01aeda8a55817fb7f9274d9892a586387aa4d34e12fa500e3612f0d29b2f896dd39100744db1200acd1a4ce4146ee84c1493301fc07b99f17044172d102010f91eeb4b2aeab342a3f442ab2e2002ae1c4700451f4fad2da26df3c173d3acd71893685f5441ce44d142bc5eb712a77a0828a741dc3ea83f36273f22166f9101a1a2a228caf7ce8d9ffab5835b2f5d0ae81d9822d3b4e1f33822b9c48b8c4e5ca2ac26da3471f96149756c8c52315a383d943d6064a577faf7b9fcd7de90c44e9efd4be11a28ea46ec657a9f111d49c5ed23844ad982bb22a2b34fa85ba148f86824cdf2ae356a0fe3f141ec7d6ecf0a3a503028d4509f7823721d8da75fc32936d9703e4e1c08d0cfd259be839cd38a15d7d3120c758e908b3a63a1984a932fde5d6eef05f7b1caf3480c1f9956b1bca2084b2b873b4afa23a732feb93222d131559c77ad7175f2e56d505079bb475029d2496e9821af6a3f84fb65b2812255c2a6a1303669b0037b9223e1c1c5fd5912cd15da42b0b0dd5720f5b840c1c979ceedf7305c521f7ea160e20ba6f6a56319cd4709702aa131569281ce681621be4d34e8267344504cbf70db0c3439d6b84dc2c6a64a5feda36c064c1ef6c548608a5024681963a67a79cf5e826975e29aba9a86582cd053c91be9ff26db00be364a1d3a18015bb9bf5253cd0230a8114c0c9a0bd97e1bad1ee13be6a1a5031656eb1c5d26c1c6e8343451181c63ea5763b73ebd80fce06922146ef3da3eb998108e810fb850642820fde90d134fbd0c661028b6cf07fe90b67d35bcf7763fb550c29aca277e9495f458a02c5fdee65d29cc27e141daab6d12bd5eb8eeeda14d8d2b9eb675074089cb5fcccca73af34483dc6f02fddc3c80549bd7e4c1084c2d5976cb5fce2fa9fd1869774c091d130c6e418d9b99df0cf7df1dd7bf07b7bf1dc7bf0597f65bf59b379da945daaf89d425137efe8b39a92d31bfb26e312246591ed2c4d3986e2e0b34c19e219bb12c2026250ce1b36dbd9fcf90283cb67c7a04e288b8aeba71b3b789c93bcf6aef5d4c40fe2a02e6fd1031147a03dd4d6237175ca3661c66bcba2b925924cbe73014b9707efe38104166d0631b5713d6006195747e5a101b7f9d542eb9609c59e4262f60a1983bade73a9ec649cb3454fd7425ad09d0cc4e7555118cb4a78b4c0b231e45bcb7681821727919bab3c594c7c30e2a5011cad00e6f2846adaf1f9d9a1a21460320dadd69fe170fe3f777197a0c6a0c6160326159cbc714b2dd53a51c02ace377f0fffa791dc8b354f544335d1d0f24e75614ee82b02e1296c584d2080bbf4189e6472f0e36672e7b71ba6d3db203ad74ec6343b6291ae391b33d09506893df0b781d285920c416d0f43ef1e3c1df80be7b04e65334c99078bad32fc388be83ef05ac834df49d0fd2ca0f95aaeb13b006bd5127a8a6e83428894e0a67d7d5ca69a5dc1494072deb1cdc9776aad8eed1850f4736843f6f1dec10c2abac24f1a5b64e7ca1e8c3544ddc2ab40061c0f2e663ac1a1f5c99eb93f5cfebc1360ced9cb9f0bc676befc86850e2d31612abc4c17c3b64df1f0de96ad9f247f4900aa158e70de9005251ee35f58e04a287e49cad010d9cff65088f5df4c2a4beadaff737b076687df0711cf42eed553c2b69a1cac921d420baba017a15bf3a2f48d043cda7b9b11e95797d6459721a5acdcf7a82e2a1465e1f44b2424330e972d84197c64b0b80e0c435106a5fd379f7d5e99bd4d9e12b461825a5d193d00cf2b891eda3de1b612bac00042684f409b06f051159879f58dee3b723221b90d8bfc0824c5d567d4b5f4ba6a3b7509e08cb78ed99047ce756972a370eff9b32bd8ed4c77a97a0a2f2b6e02e15b0b919c21f20d10a9def30f3fc9484bb817e7275ae18a5eed82854d6d4fcaaf1ecc4616d9ef75d05a62d519c16925f2f974f9142870f5ace4b671c4688394ba402777a2240f7d6db4d1c0d3dae482f53ec42de284b3777c93c0c05d5d543797c5015bb08d6e86000636fc775c885bfc09cc122e1f5613e7e685886453138803cfcfb0032b8ea3cc3c641128241b5319b080ce5d05b5a1207a9c46712dcbac1439fd38e9278c59d8f2ef09811b52c67e9a6b5cb24db1a3cda299baa37db3f174868fa01602559da5e3aa7a299c89bff3a28e3afea14a867f73ae217ae2a184ed5381853f7e1649dfe2e9ec589693a3826d6433271e285a5cfca71c325d44e090e983941bcb86288e40857729579b97a60de94c9c8e0b6c312e59ab773d87e0faa294d08e0c3de699d0a2db25c9d879d13be4f14036c1e6feb1e1eee57b0cbbb1826068bb1b9c0625abb4ce1e99cc0dae9318bc7396b4a135c6656e1f7dc708b70c1ec994f64ab5de7f168d32612bd34fb9b016d0c0939ae34088a42a04c451d736ba2225793f908f7ba2c91b24910c5d3f7b81840cdbf580842f74f8b21b45820e8b7843d50ea0f4e3d7f7ced821beb0685bac4a3fb6dac1d6a6b5777d8ce11506378b91ac4aab5888e005ac9e9b08eb13b5dd3323ac40e1bfd54f3947d5018b34c6102a97fd41ec5786d6e05d62a40e6811b839b1aa54175e4b08e1049312eda50922b9cac22111163ca78bd11125b9311a81aec06f62b0649d42b4bd84928c7eaa2168ecfddc1100b1b5260909f29964f42618d6fcd297665d82aada099f791ad73b058360fe8d1a08209d8f0ccf2ea467e9fdcc9f10bdc945bfec76124f681d60bfc5c318891fe2c78cb4a4cb6638b3d20577985bd6968204fc032c0c6ca604537c0f60fb7d82fb2746786493221705aaeed8f686273e9110c5778fcc0578ea74dad776fa16581ad7433d42335edefa0f6be59264d3511a13c4962921a15947e9cd360a98d73c810e0fafa1f27b8e27e6b12947755430b6f2d4aeab45e8f8c49a0269c3934f29cd8c14c9ec6701394d5632c515f0007eaf86e3f4ecd0c8bb05c6e17978803c6a352ea06f71c2304832274397959e2c848cfe10e81587505afbc2617a708428a9ab7d6bdc854c453068caa321d7da92dd5e7f3917b3744aac9df12eefce446ea60da9bffda4d61488e557fd43703f25213a5908451214fdaaa840bbc0781c293df6ab70d0c6e86e09d623a6e55d2ab71d21aab0fbe212106dc88cd059943e4d9c4c27c4e13f796e846e0c634ad2ef3d633b47894924b664825dd145d806e14947bc0e361943a82fe91d5eee3bcc605d2f618a651e92308b612ee21d050803719db4c14b74d399cb649db42e96ac5538b42a151d090317e83bde0bd4025779f722087cb6b444f633d585586899ff1a444cf8e9ea7f9a2a0f678a80e8b7aab3b19976cb45fe113366d6f16be17d463d817e59d8712f260d4ac3d886826881bb10b5ce55538e7dfc4f0e9aa8ff7c4c79db5a70ff07efc91694ce2199bde44e9fb16fdca4e81c6849f20a5fde75d5b6e559a1edc667b83e83afe117278e91562335d680174fb0116a83237f394216e8e00eb3a672e5062de26c67b7bbc2190c1bafbdf4d543b7c097a42232743d2a4ee5f1d5195f4f7235e3e2f8258b137436974f36a45de44d745f9339e8a0d1b5f20be57f6f1d4405c02baa1bd006d79664c9fa648d87fbcbb52e53214f84a0e51ca2899ebc77a86f54d2f5586fb03aea6d5c1b91065e44d48a29a8530fc79d1d28550f2521f206aa57501c5c5dfca47c46c1f65bb526912170f5e83a8608604e9546df2ddd2f8a0e2a44b8fa85585b812f9f5f56ce99b198f026552544e12ea418bccfb3c44e434cc97b01c689d42bd4f4980b94073da813ddc74cf93ea47354480f4293686e3119dbab11e3e8c2837988b7b3807c12c3634d001574c1f72b64e22c3f1002a03d3874816d85f055e943f6697618496e39255862f932039fbae754fe9403a72337441946976e40c6a03cebca93f4e2b8e0825ba3486d890b978693153e529cd87d88b6bb027cf8fa98626d23138c1934d6e47b7a7c28e174da161433854cd522da934e1eec3f275b37a1d597e3df74f17b2fafa59721d595f5756af3febd763b0de7a69fcc1b54e31d344237271b4b3af0f3cd7a12e299858d756b163029f681e5b5864e6fd5d1ea627a385e1c710d4e0cfdf8d5e8d092b2260a748d304afcfa937f71f5a52a3769cdf0445214f92c0517feec5144757857045b4516f088e79658051c4f453419a50efd4d166f52d49510433b5965f7cf3caf9f6450bcb5c392cd1ce48ca3e14b266887f44d4b4108647a11d2af6012b4c82f19b644eda671ed5e2e7760edea1996e109ac63a39d0a5329353eec5114d60304b45844f82f003f49433d4b2002dc1b220db0cd25030b347df360206d1a2f33062d74ec28bd607fffc5030fae1d1487016ca971a1f1f917b96530433f1025a7067845da050c23f7ca71804b6191ba0a98882b06bc92aa00e3f691b38e62800d008cf12b4fd8f89f0281b451488eee597c04e79c626316732b2b4464a89e048fe2890984d33e2a8137c2f7037845960362e4490602500f4bb59bc891cec6f12907bf332e30c14ed4f1e9c31e2570e735fcc185a3750e51aea2bad7e3a24d63875b2bd29387bb9c6791b4685c51269488dac7164de29cf281fd2958f06d3dd8290235beb1833fdb088ffdb079b2f6b635460f071ab984549870810620e21ce5bd22cfdb31dad13db13af3a71570c262a0c0579439a0c75121a3736258b61d215d04f9b96593dfe2f175aae297045c2eb76c4abb6118ae4891d6be3ee34fdca82de64f76ffefba7adf7cdb804a5af6129e17e43effffff51a1d3cfd10ee87158cb1ea0cd1330236766f96e026465e54893b4f6d561a5404ccad234254fb1c6212fe021fed4bfa97cbfb989281f625682a49ca57460a240223ed202ce949096496cd1406a3e72f81ebd325b3ba65fca54c2248fb0689fc5f77d83540f33d81767989277c7c68959ab19173303c0e3a06511e447d5a54728591f3fe724c7799cfa51837d444c833b6e95f1ac21b3d399d9021c20f59e8440dd5fdb4509b4e75308ed1f3dd38a63170ffcb8eb461c2a1b9cf8d84536c78f851a3e1071a0b073394ba0cff9894b3950ca2e7614b4b56cb7d784140ac536e43467e9521e20d8dde1b9c010b4955bc184d460aac13dace8ba30d7e4cd8981f1ce08306f3c357d4b62f5920e72b21a4786d7057de7d3a466fcd8c7285640b2d1a51454b9b1302995edce618e450af9028589e30274c1c57e2bca739bc0fbeb210b3fe9ac0a9d670d075ba323413e58f145c0416112264623b4062c74a45ddc3a924c5b2a7e56231e1315296e62acb3bb5758eb2a8609917c9b32dc07244f9f65a31cc06fa1261fcb63814724e020a7a5f24ab3d452cc384abb2b4dc8873322d37a78a0f1c2c872c12156750265ef8f823edbbaa7b87d0da134d2a8a8b6eb4c5144fa006770e69bf6660f00c3def96b2d58c0114f85ce6756c9a80161585c3fafd469c0bd32de60c659b597b192d75e7c3be7f9e69730626142408f632addb2ecdd8b3f2124e70c771ffe7d44d6f108c5d88cf2b4933f98067eab42b963b4e345432702ab6c789aed8c7612bdde717fa4ae4d0c39989474e00f061515bd75f3167ab217a0debed3f86cca78e4094cc8ab8f11b8d48d5d88060e29b91f583e071e76115682174d30ccc4112623c772977413a89d6d32dfeafe6592cc5b8e94090ec434db7f863c098f1c557441c4986ea62fbcf762dcfb31305825e3197b1b99920df4f935f0602a8069c2bee2e9997fa13cfe8546ad5a44ed7645661a8379d00cc8e2f08813b0e37c32a2e0552cdc26ab1e814ba1ae44bc5acfe910502f2dde2385c7cfba4f90cf50325da267c0ded1689f7ed783e03146c43e52d8988c3de016a3b2b0e3f71855da316233f2f0c3b143d7710eac718e41c5c1e2c0cd8bb4a1e098ca8c06496a8f252a528ea0796107f7005e40c07f4853c0e5e1c9aa16c8b83372a8672aa9d56518210398f3bba8c143519f79a11189cbd21b5c89f6a2414e9ad24d09c4e8f8db081a75e681419f3857bc5626930dabb44a3b8144fe9377646f3a2dc37b756dad756fe81a992af47c950cb9f08622758d26925841ff882df7414c8ca4b7ab1241a0f71ab912d515dc710fb0fc68f69635d98991a884194bb6c2867824a2cc2a5c25ab240e95c4e0c2278741bef8d4c02798d95ddcefe8698afc9eb20a2b4087e4ebf7699e063fd81f9a343b8ff9d203764288800964cbe35c70c4d683fa4efb6d10948eaa707f844ec79c5eedfceb2dba26143bb18abfc0732f1166f2af2d61ecea36ba52919e1d9d3f73934c458cf675e8ba4f61f4d937256490b20b9b4420f375268a444ea3be528a68598f8f9ba2257464aa5b6ff40b4500f6c6c5a817622af11ebee33ba38033b097e7d590c1c0fdcedd997a107f814b1346a5e03729364ecc36eb5ca00dc8803e59cb26efa42c6f28986374c78d63066b76553a9cad5cdbe17db709382727c8d3151ffb540c3c8d05bd661b4c4a82f54b8e9fbf736adc34d5f67dce537ee39dd5c4dc4c35e3060ae656abc7f3ac2ef9e8f1893e1e01900ddb2a1920dda38dadc6d0eb79d52a4ebd99cf070fe2ca18279ddf1e5fe7320229ebcb15ac613b9867e846e52d1d20d38bbd96401970ebef340ae7b4102257453b5ca08f1f8e712cecf18df84380b4bc1330f447b719cb9119c1a8b1106160e2ccadea40af93cdd7132ef718e7ed0bd428f18139a28382ea1d72bc24bd717ff8fb180450d64131fc72e96358945a793579015b11820a66a06a8109bd29ae226d9d8a7a04466933d773d13cca50d5fc3d1ef7780a801e102c8028dd7ec1cd31f2a0e0f8879a432fa4bb384b575e7988674a4101e9bbd389f489e91cdce09d5249ac0602a141537e9e7881546efb7be69c5cc808bc5a483328215407826fee19656322c660ad1cd395fc34a47ad58df2b3c29ba9f3051d0245e550259ac2570f4f9eff65e39ae2070f888ed6ad1dfdc7fb1a03945fe26ae348444547ef16c8ce2c80611a8e5790b3e80cf048b87eb8a8c76307aea93cc0a3a0e0f48edab2ed9c27ad05402f8ffc9a84dd825bca45db8b6dbd134b9670acc3c24bcf8a938477fda94bfcfa509f730e0c93d1a23e88e2825d66d7374b18343573534b912ded6c9c88e8049deebd74a540c4bd64634c9a537b414e0b34ac8580674680152a794ac01e62d40b5b568b4a5159be8274d9927157e67c1a36d8468a1f64b9f5774f28f6ade1236894f680ad00210031d21ed0a84fb501d859f25e4d9a076c7926809f0400b5c3662f699a45656639b3a0614f45e8433b8753cd1f84a99e45c3941a473bb3d080b56bfbd28dfe00843c10ed5e5d69a894af8f8303d4718498d07ed44fbb391eb88cda310181fbd58bf18c910d98b07262052b426f24f2ee325a6d641dde9c2f2d0ee93ce4ba53c7153cfcd35eb98ec7505cd7a6cb1e1918ada128602fd1849df93ad9cf321935cc3ed543d07c7ef4bb1fff848f1120c93dd96302b8d0973830ede87caa0a1e81b61c8865eb7808f339b9310cbb40ced42e0458491ac377859066594b06707275096c51b294f9d725890b90b3ce7279635fdcc94809a96e5e495af7a5e6de55698618c6be88f2cf7f306f12c5a7fe3a1dbc67e49583cb4ec6d1a533b29f806e18b083c83497a506777588ca9855c6cbd7faa22c06a81304055079ab49bee78982c7e735de210a0da9c7244b6fb8a7252afacb576bc304c65c63c717994032d8452acb92db97824cc4c0a22c69980c77989d2775233a4d1193e09498b53b40c7f27c1e9ac15a87180626e4b5e4241cab6f6e1ac6de87c4476b259a37d0b9fabf2a6ec8a9068ed1922ab660da2a07ff01401ef73144f60ff3492845029473eebadfb0492a74b56c2a570d04dce8a284bfb2aacfc5b5dff9383e4caa2ca34b8b98ba45290eee9cfa78a800a81ab7dca54b8274e8098bbb2d17777419e88b573da9eb641c09a6d167c0c283609be2d3803642a95887ca32f445e70bdade830c5effff23ac01d312f7bb53dc0f88710271305e2d6bd081744066a31a3b5e8b25509bcb544a1aeed6de3fe4d9527caacf5c39410359cb395acafcc34560b81a44ff4867635ebe99bea831db014fbc6c053e99a66cecc0bc8818fb96bbf0c0613e7c778d357d1b88fae6d15b4f6a0cca8b4fe024d96bafa28f2375f2607acbc423574a798e78a6d99e9474af68af02d43f707889e9ddc1a27ca1ddfed373bfcab7f8cdf5fd2b739cff97727fb0dcdaf5ef3b702bf6a0a01b64b8ed15c8e0cd0afd0f6a4a4f6813184f61036fe23f3191691b451af77a17c26c4e30c9d78ee9bc105e172d66dff34dac39c6980a8a0badd1d79261cafad5d397d95aee43f20aaea378f7ea943bd249f65b6582cc2b30f943e83a4bc93279db0e04f56b34e07d9f7600a4daeabeb72b59ee421daaa9d15a09d779b711063b18670e6ffd0afda8ac63f7ab45cc23f9e4baf07f546627856354f0aa85ffac5146a0a147206254cb07ee8224ae122b00fc321673fdf9f5889d1646da93b004ce3c7c19e5f089c7c8180ef80a7a8862f98e89d98fc0917fdf38a3c49586e7f30bdc52323169cfeb1832b26af2e8111bc8fa855b3bcbe272a189a8ecc3ae5288ee2fb88565fc222898bfa53d86311ce9223688d64e53ee12c2db3255c699c663db42a4e7ed7b9f8be9f1ec135773c043c6be012628810ecf23724a06abe33c8ae00ca94bb25f7c6fc36c5b08a1e093670c7ab9748804844d6ef13eec61ae3248a456ece9947387127991629b463116bd730580abbb68f8c98b876f33dffbb7663495cc57781db210a4c3bd6ed32b920dfd0c841ad9cbf9425567647fa13d8db50665ad7f0db9c1d481053917ab716978770a5f72e2d1e026556e1f73c6617a2ac8da780f78cb6c21dfe55d6efccbc80b331dd613301223dd1316de82e65eb3c10678561b72b8ffaa6c3bd802e20d13add675ebfb7dc8d8134538b34e47d13a05682cf28d8044df20070bbd45d8ec49de31954489b8f03553476f04bcc48e5642c2ecf16d23c31c37b676e3af9adefe3b1a859b318a8405737c8678ad11a6ce23e84a4dfb3dea30ece1650eba8e4a5ae5f67213727fc2d47f4d8abc8ab4f5529404833f44dc7022609be02da7d30cfb7d0bee592c2395abeb5ff9eb8d2c0f48275ae1ad71b4adf17bd69972c52baa07f0046142ffe6f3ca164133c6b6b3328adb14fcd6e649ce1017758f5fa680fccc52b5bd40a6f99f0ef3321ee9be8061d1052609b084d184788cc0ada9b9d88fc53a12b1fc931edfe98a433c4af65ba0cf9e1a379b720eec3e68ff9c3aa5d86f4f02efff08f50755def32aee9209b23b61fce2cd4dfda19bb59721259b23bc8cf8b5e7b4c94be92f548fc2a49042b3de06cdf237f5fe0b653a90add29b044b5e1a400a5981a4ed93d973c533a8ade7175dffe071ffa115b4c2ef9a1bb23c87591fdf29cb49a9edb032bba7224bf32305244139334caf04002f781ebf5c1f3e950dc0416a006ea6263727ae1472003761e5337911ecf35a28ec98af6b1214d441b175a3318bd210c975774c70707bb2d0f76bf3156823990d6bcaa68d575c0645d5594186d94b3ef615deacf34378566624298fa10438bef394c046236e491b426426087aa15d8efd94bdf6eaf2b595a56b8775841738eee7869b94206a5e7bbcd4668e58345d979b5c193b654b2bd5c825e22cbbca3bb9c9c2b623fd09f90dba189b4d196bc0b6b0ebceaeadd31dcbe9a7f3e99f09bb23136b4c969a9b926c8bf50ade45ead1b2d9af51ef82c47d49b296584c1540a15d5bc4c49dfd536baeb8502d38e96d18fe158907595dd4e3bb65bad87e50c8fb7aa814085cca5d0bb9b491895861baaa9162918fd503e567061f3ca52f2b2edf44f76949a0b8c8ca24595a3fb488f993bd4a9c5fc2c5960a4255cdf541cc7ed8269c48b3d04b0e11388bf1684bc9a16d26ee23140ca0af875442aae40e42cb20d09f1b1f1f49a1429469c4d71b32486fe8f2f1c6101834d93d2d4ea3436b96277c02b4ab3452975f2f82daf35dc77e25c2ec2a5d816d32d08e8b088e90fccca105bc89ba5cc52c9b902e5b8afec8f2032449b8e0a8256a9a191eb672f4033be5ba5454e2b6cc37748554a0d3b6449c23c4fc963da43e08612f66d12ae0b7065a1d190240d95e1d1832438b142a91d67f7926779de173d5e605e0265f5defa47fd7da1c024ee006326e9249df8ad7e42fd1d5c7789edd09762748120542294614f5741701c0761fd31e703dd8c441730d849859ab4c0b7f46311a0b71ba268ebb285e8f2e84ce02982d81914bf0201ed6f841624ffb54f5f277951210772d59cd417028c02aeabe63f6986d5a31d48fb8fd8298451f7af956c4d94d88cba1c2d08cbaefe0dc00745457b260eacf5b430077c2a23d9990050f48cc63088dd853d0b737c2e76e3618cd7792a3b5abd6691f3ef07c5bd4e08d5884b3a92c570bc81968a2d4d69a384a41573a190118926fd3bd558f06fb89ddd858040b7b287530a315900c56a3ab968af2e3daca79ab5ae2a56d72b0ab7594b996c7271b305ba0616a2337e6042c94772b191b6dafd076d754546f1b3a9bf5e590da61b7313887a7b3344f1c46a599676c4be8765b910b89cc1005f463aa08e33a0090330d2029caa66c928bcddd71bf7cf81a8505bba4f444f1e48d7e8757300948c1a4ed160b4840ffe912f3fcc4d84f977677614f817a4adf46b165cd74d5ff970b8edf1ecddeee05e1de154eb378e3fdc44df8304851c7163580ca95232f501042e170ad07ddfa69619bf2f1cae6a7f7e752513b5410d8aa170e139335f120437e2b17f7be67ebcd17b836fc64a39485b8e6b67485952a844e89bcbe41e7383644cc5101a8218839a878021c469efef01a833d4d65efd7e2ece54050380a07e4bdb3753e6a91ccf36d56fab37e44902465b106718e09496f84593e15024491689a0142b710bb47a5e5f9a41f6e66ce7a08ed4069b5749b63895db6ab628d63fe550b38f6e983520c25dd9026936754b0ba62330b44e22c0e4584aff060ad013ca325c162932a0d933baa3f4c5620cb0c2169d9da5c8096a6bdb25378ea76c47ff322b4c4ad9bc7d21285541d798bad6407c6749aafcd174eb09c4abfe33e9df7e516547a1503722879eaa802144367af92fb7644847873eba563312cc18220ea7bc9a55a0aec410b675c3ac95d8dae92ccb6bab41e3d4473bdac001332b5f11c6215b22ebfb8179d51c946b668b7a18b98a15d9e211ab3e24ee9b1b5b117ff48a7f223a94c7413913d19112d33f02d2f5ad55ff9d2aa7d33744d71f1d04087e32e3d23ba161d9389cd42f26ccdf2b697c5cc81a1e239a1f76acf0cfe8d82daef57b1fa47ed533fdc25d99eff926e0036d17cf6c0b5c74b6edbedeef3645b284158bd426b08b48e06947573e7078f0cc9742dd8241d24adcc94443abfb477837adede58e87872bc14506cb6d04b3c5fd8dd23dae98dee24e412800d9e54cf138fcfce8526063ffb90e637fec17cafaf52e3771f1f8fcf385d16f324a188f5301f97a287ca4a6f8c275d74881ddc3f154078e488fda3073ad4f9126b4c92de94b2e19629724a697c4d9af0e21db8249ae010be1737eaea44256594ba524380082822d7aaccb242daca5ee9a72bc4e02d3b3a7e4b8076ac8ec77b67af8f96e3d438cdebe401cecc261adc5069849fff746316f6fcc6233b3b5edaae92220b66514eaf65f02c8dd000cedaf60670696a17f15a0a1bd09c79176b43ccd33cbfa3996609927481b87d88e0c68b390eed69a33c090b560d6a077dfab7d71949287679aebd634aae832c954777459d44a879b6faf245516a879b30e2a1d2b852ed92e85006d0541e518a256503f5b0440f2b9d4ca9cfea8cc06f90055ca6802a898ac3c4b194babf89972793a810b4600c17d9720d705fd7176f403157b8b8d7be35254fa46a27f64cb8cedf195ba8228e98dafd91003b622cbcbc8feff8dfe499e76fd63a25217283215c61a2892b4102200fbb2605f6f80bb9ee61cb2539b2f493bf6d5aebf2277633b575227878355a092f144d4096e5d7949f54b1bed5894ebdde22cea661a4e3125634b97a4da589eb638410e346c146917bd6129c7e3b871417e184e72399b5be794aa66f9b86734406f6f085b0bee623596cc586ce7f1c853124ac28013eeb3c644db83161f5eb3107e3ed34cfa9d45167621d88b622d571775dff6dfb307a409df12fbe330b0f2d7b9d94dab151ca7b9493e74d334744ad33194aed93ba662421a261ab12bc82a26f4f7c6d9ea2fce1eb07e2d6be7a4e705dd483e9eae5f14193f50b01c5d9d60499d109a835ed36c6b3e1270ea94aa75905458ba6904d468315bc975b6db77319064cd943a194070c7061f2b9ae70c998d8f8cdc80d513b23b228e5e563760ed08dc688b58e55d702a06a08264b25a90283ba9a52b492b16575105e39c6b2ab8ca70461bc15a5a5d0110bb93b12e195cd5a1f8de55c1d4022861361ed5b4fe0d00e38b8473de1d13c4cb058628dcdf1a35ae1010de34ce91dfc90bf9d6f908e78cc6aa9f65561981ed09a0ec8a90014ad8d22dd2e76097dbb6d5fecd1103bc7197fd77eb6d4e4d4797550a8907a06f24172a04d677d6ba5e41f02bc69e07582e8b0c33c084c7c59edfa2dda1d51a2200131949739084733164a38febad34bfd778cb6cd5619bdbc07831b20f8bfa2f29d913aa24eaf26520ba1b7beabf9e622f03dfc641e24dbfeeeefa8830c465766ab1c01413eb7b3942e7070c8d594ab204d2bda3dfe45e756437337a95afb9d668051e09f46ea142c6800915fa0deb54c20be57e63d1ae7dbb39697c2b791634d71671285fc460b2dc14f6783f27ee295b7eb01b2eb44de22002712e0905ad2899015d2739feec6e408663d305ddeb7c1e726eebee2c0b204fb0bfa5fd35ce809e6a9a7cfe37d47718113f31b360d8bc157d8bfa2b004c713c288659c86166ed5f4a62ba40410eb7b13a6bc2a81171bbce1d052bd05d206b97e86ceac9a20738a5fa8f039aec6fa2dc468f00cded9f5ade5a9972d3ae44bfae3ecc487f9a09d5a3f3ce97ad801046e6d5dded461bd7f58461eef8cc84e68a85099d76ea007155506f1b07189f62dbbb84b7f11eb700c851aa75e7faf748716bfa5613915256c2e793cb61fa37d32a2cfe64378b68d97e0ae5f2e7bec78d365290a8df5d3527a5c3f76e6ce6f6d8368a8fe4533ed31cb0fbfd834cc688e66cac249cae3be78005cbb562214c1a3107b036e780ad9a9fd038b7a00697510bc89af47ef4549c6d61478f56b4e7c184f9b246a6f16bffbb5b30774e1ce03d23af944805c028313ce4015492cbfa99004ab4e2efe333001af9834143d9f3f68925ff9fc1a6ea188545b686e246f919a9d1b7ca3aa57526aca0094e9bbd86ed5f689a9f87dfbe6209a54823b02977e6db0976c463d60b537bc3ab2dfbad348a3e0cfea25416ccf8a6f53aa58731d44f4f5cfa5bf7503cd179582df248d9044034f92756dd8405398a9ba6b9b7f8c8177bb7fae81b87303f1e2e910988bcfc46e02e8bd19564f48e1bc73042aaed6406b2728ff80c080f3ee8408269f20048748866a6ce32868ed6285b04d252ff2a48a8eb3ccffb0774e6998da9d7e65e68929abc9897820c35b520f5abb2001406145b511805871a5b5ece5313534bdfda24500c8ee0cf09436c5e56f5820ef9038362f18658d7b748d01a046cb632b7ba3f009019eccb9f2f8d4f4d0450741697798b62bdf02ded8c021f026168b880a04720060994fe42fda22d0342e707815340d6f6d559bb111070db00134e4a5589f885b11667da3a91931fbfc05921c24060e7e665b06369c77c484bbb01dd5092a98fb406913939faa00fc7025872b526e17b0629d7a4250b84b698d8cddaab4604b6df6ca81959077a18dca65177268ba0afa52f158d2d9af8f9c211a877ababc904abb090bf4bf30e8b8e4de7cdf411b69be6ce55b190495ffb459079c702e2b04a8b96c26369a1bcb8bbaba45bfa415ae3127b5548bf37b116415f726bbd794764260c111a3342343cc9f9feb87e4384561e08a701a299d50e96e9c961520fd8d3eb28f84a863fc57c48697a90530d2bd4c1bfa769ea8d4e683918e3abdca3409554827a359323bbc1fd3d6f92adb01ef39d82991a706f29b1ced99f9aa64ee4c0c3615df3c8c81674d0ff60f46a937d6e84177be7e187d00b8c49be99709c2cd52a170822190f7ce98f8ce5bfb1d53a8e01d44b880ff749ec1b33f9869dcfa6c4b242935e621486ffcda79472ff4824ec1592845f2726dcc766ab71a615f418ac5d812db31ae546634ce06a9e5e96d5092e794327e09579f73eb2d290efcb60ce6711cac3312dfff8dfa757b579d34f6d45f0041ee06f5d27d78b217197208b18863483f410e50b69b275141296b7f1adea2a36822173a819097dd41dc993af0ef19c022f61166dd5c681df2a9a32bf7ae2ca91f65a345ec38c5612b886148de48c269530122e556408da3a671a1bc1589714e32b097c480acfed8aa36125971be91ece551d70fb5f0fceb2ebe1e0c50e67b0419218e7c291e27430226e9ec0804b70d3c01e4db5a5e3f7a357f05f6c72468ae5fedbd3bfc31e6ca0dd05e4c22a11791db7d92bb1aaf601603179b1e00b721e720d770f1183d6546c352d9aca1b433588d1ed964e0cd8acd2019f874fe7000d6af2e4db53572de40f58a91f723ec92191b1985e85a1135e5758824eb4477683c09b393412702cb4270cb25ccaad918a291bdf4e3324222612286a8fa3eadf91a95132e7abd75c84760cfa1351862cadf178547b1ad4d731e34f161ac29cf32f65bd50de4de4ada217621d000b7f0662edd11a1ac46cbedc22d33f88cb335e4be51c9d4f6505a695b32552552597b773d87fdae0c462ff8bef4b7cfb5536d06b550176107293bbcc3b65367736d647cf294316b77eb63b8c3f0946e378c8e51cf3b3e93a2baf294fb0694a582ba2338c851059f53fc887c259c59f298eb4ed5014a2d80b1617fa67cad7e37c1ec1986a81244fc375285b539fd712648c00c8443e60a74600e0d0ef36f6a2b5d0f1143629c8028bac271235fd1d39eb059d4eca815b02e630f5c7123dc1bf63b541e4d088ee818652f8a46e11688817c11f95d0e60be9219eeb7601cad2ee7d9e760f32a4b0c448c4023a15ad1552716878b075f89e9b9f8e0b23939f7df686dae6ca2e37daa1e859a93be5434ead5ff4d67d1aeca5c387dfe9ee103c10ea59ba27f11b1d045bfaf19c949c6466c542c342f59dbe29424cef38e42c6b00b4a868f7da278721554ce8cd65d19ec22ab341e5bbd11dbb7021687329b94e3fa54bf7f31b0dc5009a131ce7ebed716f34da379bf59be310f9fa90b04a21c3629ea98e2698be66e865176d31b64e611e2ae6af9d0923edddb8b3a33640b8683e314605fa62f0a69cdf48cc3f548a1415e2564d33b467472977324133070b8f7435ccfe0424830ad82f913507bba94ec93015fc3e5e0ce7c4f24bc01f7172bff47055d33d0042dc76899bbf3042091c8a249fc64eb8cfb11ccf3c8067ccaac7762bd4fa102565cc97b774e185c3cf6cf4afaaaa89d0571ce7abf26bafecba66315156e6d8d923676a8bd55be97a8382fc19a3f8dd9a08d21846272c2d9fffd1352c2e7814670937404303852f1e235856f5b0404a812ce943ba20f92dd1011318b7de792b7d84aa5ccaeaff87d7ae855f0d0b465ff19f9bd74fdb548ae5273bd7b88e5828707b3d36696c2c3ed0b483570134794ad09346ed83005d290ea3c63d58c3508b24bdf4ede5a6395ab9e158cb2ecd2ecc9b84306727f831b4248f84d2641e2b37aaf8190c4bd25b5160381b11e47263290d0cd48f76f91c0818d4f85eaff72cdf1b63ec26ac1ca29913d4223368e4fe17ec84a2bcd81b36b49d2b64fb035db96ddeb06e1e8830e9f9c5e21f4cba95fbc24d70ce1f69325a9e2b861fe7bdf15576eeaee1e6c8d0a35fc4a0e9cb77b4017bc4030ee28022d6b3b64876b3ea0135dfb027b3b4fdb328f58d16e75714365a0ff17dac645f0d99fac4919d8d8028d18349b8483cfe9bb9eeb688c776e71fa846fa4737faa769ce55d3c225ebcea0cccd8fb0a94ffd13bfd284a863fe7b4c0cf444474fa92d9132454cc9a123425de96e0bf3b92064e0e1074a06295e38ca5589069005cb33b48f130b570a2919e5922884bb4d7b105ef811dfaf8640fc6e5cb6df2093119f029bde950620380d6067331913c85beb8bb48e6822b10cbb0ffcec2c84256ac799b12269c6068de2d4426d8743ed5cd1e74fc9eb93d18c0dbe20bbe671123f2a38ee3347d9eca0c2d36ee0a045a9615913f0c92421a6bd081fa1f3704726d00ed658755e4e68373c0c2a56174a10190081d7b85c7be2a4412b0ecdb15a728fa35bf5aec02ad6f6c460a2b3cc33a8b83bc607e89eff7405ab09eaca0e16c3380307bd733988f3dfb1e58c1b082f3a17c0489b289574b288054e37dbc907c817623c113066f262cb0d845ffb01ca7712dd83d1460d1dd55f2567e8a5a90de39c8142154df7b10f0ba70832a08236c3effc16d6c4b1e0522e4f3b2f18c431b1abd4266d660e12ab0a9bf098f04c5f48e17eb91959ccd309d08a44ef596423b48b6c385a7e9e56b80637971aa537eb4ed4043c7416298a4956a4b11425ed3e7bfd8b2380bc517c233da779efc6cba7c447effc80651527323734b4b924d5fb328995c12269bf0747e2c6405dd1b8f952976a464de668e4a1d08c11a5cfc1873f60bfc1eb24012b89457a9c8c714534ad1cf0596d9424764be2b4f7d501b324bda23644a1868489fbacd8c5d8b88570da309593b9e771a97b0448e40541e0321ce19b4ece353222cc8c6f4379d3766ecb6a490cf676b339eec7868397bc3379fbe0f58711bc6ec843dcbe6f92faabeabe8ffe992fe8a4daa8fa34929d5e88c3ff4bbe4e24ab036c63d86e9989d802ff1abea8153e9c02225a526994c29a2681d90c1591c92f2f700ffb6927f9081f9ebf2fa104c1afc87b2d2b8759843a4b861e3d7f65730deadc5c05ff3467a706b3bf74654099037657123bf92120418989908900e0a540b141d3eb22ae054b405510daf65211229a7c70e29865b0c217612c1ba4334e28e7eaa7cf56e776566558ac7dc367d2843d106e45d30183204102efb5e89851d384484266783fb57f0d6941a350e47e19ab3ab9463214eb9729866e81469edd13469e49be20500f9fc8028978c3c4086b0f91d0b29c23f500acc3dde1d98e0feac0142051406f6e91e8d0662cf31e474ef72864d61208feeccdf58db68d510eeb441c9a9e11bbb9697cadc5ffc7ecf85226005673df90161ac486f98fd1e6b66e5035fa2d0a849b3d0edf97d6aaddaec626237fb6bf912f8484aa1a10585b0cc292e954f7a1dabfa79aaf14b168c2999ef795feb7329bfb1cb37a0c1f778af060744943e653ca419feb622fc227b7cc796ea36bd571789e0a52fa1446325a0de7891635ebca79a64b06403ed1fed8463ee257dd290f63e955b056a1467908701c28f3ccf9491488f336956c26e5f0a3249ad0e2b0ce341f6b20cb40c0bccc35afd8090f08923185e33deabf188c0be719bb294be797ada74d0a6d8d6eb58e54adade678bef4f186a66eec8fb84c0a105f110405fd8d59042628b2c4475d54c9f175c82bb0cee70ce4c6db68ed21268f8217888e4306f7a8aae9baee10f7f6b46d6c54754e48e7dee340f0e6d256894f084916b8b266e298fcdf4bb902d3876219f5c50aaa3eb3e5af6246cf07a6f4bcf5882c4de8a6c9f7fcafb8d40d88ae8f610d95a900cc941a61350b51f80bb2a5b9e52372b27d4bb3f8e76e14a20c63d204ac167ae5b15d56511d5b2f79ef44f58ce41762d9d143f5cd89247048df1a1c8b66765735a31ccd4195e8e8dbf5fa4f208dd5d49f48c4ebf287c9fd3398d288daefce185acd29fb58ab39bc5d37c8b69219fa5547a6919c0f1d034fe56915a632dfc76fd64c6cc9f1df4638d21299d1b766cf85374d4b3a7cd723fe354928d5d744679f8290b40c15e17b08e0fe15f913ea2eaceac3040f61fda36d0c8a6afb16c13a2c3c703951941a52a01e8ae08a6ab260b2109aaadc122c4f588bcb7c699b459e8e86b3cb50a72b43c9459c182ab5ed83af0301c3a38b63b3fc3dbafaee47d4acf54bf719831ca9767825abe7afd81a69feab0d2b2b8f11289a8c8e5f7f418eddba2654823e4705bae7b1443c9cf5a37aaff53112b4f74b4fc538a5c32e8f4ca3753229283a69dfa986776b07824e1ba27727770eb243bd1e7a878afdd470d835328d63d5ce768e86522ba914b2db0648b519ceb641baef43cf4114ad24b26180bbd2d346445e40164af4b7b17fc31ac4dcb0e8a839612cf775bb37351c38dbfa38d0f3a8e7db0f92d0d349f83cb7bdf67e08e6322696d56c50190d0ffa5e16924c3fc8fe6fe70bfb9c9ff09775074bca01236b90d5d3ebb892b29737288e43f7c2207b81f108c6b35b89af5f02abdf24927fa9b41a67c754d96b2f97fb7d36e680d113567ab408f7b37bf65da3a4c9e1e3a264cbc90a3a211e3bf5782ec12ceea352778cfc049b8234abf5d148d9691c6cf8c51b0970c40d2a0f52f1ace776117566d5f9561cab5781a582ca0f523f1b58551c84df19c27786891b36583b8bad4a9289d701081222d4dc5bf535f3ce84edf5db86a9bc1681201f0c9472d67abb0b5032435d2242cab2c9759f4ad0190e5bff6b44b6f1b29aa4d5efd6185ccf42fbdd5f72f14e055729dd2890bfa44101968a89d2d347496fdb86b60eef15ed18570e14025afa2738f6cc23a6272af56f637701c7de09af0d9818117d64a091bcfc999cd7f2831e51dcdb1debd5ba5c1977e35db4c1459bea64d5c1ac3662b29707ac51c6014e61a6c9956307c2efd28bd87101783ba631c1f3b06be5662aaac1a9d6805e753173213c05f282267ce425478d1e3c06e28c4f12f2495d6e9c12e2f2a4fcbfe3f0d4261c9d14622adb747279db72b63a498330b383d46abb92b0adb808e1ebe9e381b131b0a73a2c2b6caa06a5a488bd107bca103ea1cb7b8e7c6e7d670fdabb651cd187db2cc7c07957300cc2a80d70b41038a932de608a2494a5a36787467f5a54be0475d226ab5a42088f07458660001cad8749bb81eb8abfe2e409d197f78a3ab6b767a79fb3ab9e42242d5c808722e48a0cd633dcbe9b94e5c9ad4dab72b7f950ea02708bb07d97a372f561bb45072ef34d22814b3b9e44bf097939eb81657d0209dcee6d8bb8b1686a389019d558cff9e7d8451908de60b993e3d90bec3685cd809705984a8bafe07409c34d1bf4e66b02e52bb47325547c746248fa974a0576854826ed8de7c8bfe8e54e11ca33f840052c799d3c840bfe4d2db4d816aacbd966e147d216a4c1013a533d4c5740cca0d601cc582a305e8ea7e3f5e129256b69756b01abaab66a756caf9a1219dd8e7eabb45ecdffb2fc49899dd87f6b3fb5cb5c1c21353e5e44f24e001f8a8781ebe7147afb74a4327cbc2e5c3fa4dc72cb94a44c29a5d404a2045b0434a49430b57d477b40ec909f1d133f35567ded989e181d9b2507d7e632adb53ccc5a3a319788cbadb96a8f522c98c68e7000b1733e3b467c6a5cf429d1bba263ade4dab9b636c91a2b66e64a89b5615c655731a458282696eea8dd01e42295d861df12352c585f4ba607838e85936ba9da8aacb12dccda2fb1145cac8a2b5748aa65c2c4b21db922808e7a766ef4d4b8387dac0c3d2d3ad74aae9d696bb1d6dc2a33f7468c75c1d5da5cb535a45c154c2e89233b20b606891d1a246a74fa907a2d1b1d8e9c4bd536b5d6b6993589b940ebc9655ccf2b966faa85933b746cbb8874f8b0499e9c368747841bd5f7d9b39dbd5ff4d9e7bd53f7b72fb74fb570855804e1f231fe450fb7c1abd38303d4a121711ef1e94276780edc0d1b4ff9f2ec9c2e9e9caa9c241f1da15fb4a096de6517971c133deacec1d9499de8048d39682bb7b66e6b71a5c55b8d3e3e9c1b6d764cbdf753aef84ef449eb66cb79795ad87858f12f3734bf68414d9df1e698c8c1413f7e8d4e8c7b732a9b39866a71239431a9bf469ff335da0055f6d0391c1f65f0c561fb79f8e2bc1f474be3b4f8d9a7fb08a7e8c5e1e1a1e0e3170769e4f7bfb5dfbbdcefbd779854c822a1a9ad1cc8b2b2ab7005ec67c5fa6c8f15df3db1f68fdf9ba7bfa2c1cb8a70655d3cac2b9e26e806e9a6e7175fd4ee3678fbdedc2f9e6e1fbf3767ffe3f766ec073f7e6fb67ef6290682796865c13efdfdb3e01787e7e3170783a457e775931f149978b1f4c34651d44c8b3db5a1252772239ca8954ed85278978bc53f7e697a96826799ae64cd7a0e9a8877166a0c7b7fa1e6586fd3ec69a981e6a976d8256a02833c18d42a1f88e0f03bc3f7b19a808c5fb2cf18553be45fa2ec4dbcca705ac006c0195c74fa75b9e167ef7ead450b193881f283f1b1aa5d3097ad5df63b03c4489f7a08a3db11abe9f6622d77b0782bf0e37726edb34056b2ef72c1decaf2f13ba36226e91757b65e309ff8d4e62e73ce5968fa7267e216f6a9d7e95d759004d8820bef8c0fcf3b639c80fbd5e36ab95b6e160b0d187df6ec9292c8ec6cf856862c16228e40c0e670b8616e3ba73d605cdc2ba18b7be5fb906d764b59a283f460451f99200570446203a9a1305a0b240a6407372ff2b874a08a0449fe719991c93de998738217d482bac149e090073802e078814fc6159ada580b2627d4d48a6079219981e459524e482ea419f29841fe0b1e8f209ffabe9077c80ac7b2b0231286151203f6b8850349230047dc44468e73822433611d7279ec250feff8e08873f440bac86f481fe4cad492bc203688d0b092393a294935a148624309dfe7fc05940f6405c7a333a41e720047255752d809120147382f25aba7b31f474419d0bbca322ef95bc3fb53c25d40652d13c834646e42037981186e473a46a22c3ebc63051221133f6e748400712ca9b3021264633874eade4c6ccd2c9d50f11303881e084f46f02b28f5a887ac81c470348f7e4825a4cab10e087e0bb267b4c0ac4a78ec42ea40d2b01500dfc03636f420bd341872c68f33900438160d8f982f8f107331185e3b8f3790398883231e12e558938395e1c89078090f647a84ca40f82faf5170c465399224799079479ecb44f2cf930c2433c16cbac586050d1935ac6adcacd6d0944c85594db9f8135bb91594588a8cd444849c424ed8e87a8cba8073ce39e767c939e75c8a0fa9b6836c3966c54066bc3c640488217e020ffa75e5f3946011444ec939abc498d3a33e252e6fe03cf314c56b9d1255148fa2a2688aefc4624e21b2003df76a50d13775d5de268afdb05f51f37c959876d40ff528c4a2e6f9dc1773511cea55621a9739e03eed9a7b6d4ce73470a8b186ba2a8ddb7015f092523441c17d0b1fbf50553f45d017c0c7ef9351eba75fe875f297af8a9937ea7da38a5ea8bc370a2a88811ef52ae7dcf4c318cd839c9bdc54b3d7daa77b53558921f4cf41628c5755d563f5833aec3ac87d9067ad8929ea08e8d7d9a3a81d52bcea4b8d01ebac8a90937c98e24f151f0c66af66af6ab56882a246fac510ba0f63847fd546cd933768df7590ba12bbefc91b549f2bf0f90b7d0545edf389c5f3138bab267e61ea85be0862a528e444164d84a1c0e33d416bed33f79a87f75e0ca18bdaa7987f26c6649f52ccaaaf8042f6a657750faa1db48fe944a147b51652901cc278c041bf941e66cdbe08f321f8f5a97648f1dc9bc3ecd761d0eba199929a66575595687a156be3cee051f20962e5c79c9e7b94740414220bd09b3efb9d0166ef522516cfaf7bf206ee4d9f872b5ff5a60ffa534d7d87517da98babca758f0f7a6dd43d5c152188c278303c3951f7640e4c6239214fa82b6db45e7d712db25f5ff020f3195f7b56bf8c05f3c7e5eb54d58283718a9a7f8a35682b9c8481e97f26fe8e7eef49804f843058db0e06eb460f2e03068bd8bbc759bf3ff99a300306ebf4b07efc360dada801c99a7a8c4d39364d22705656fc0bd311368ec948eb83498eb8ae2b7ee5e397c9cc4710b3acec2a5ce9bc5f8069e2c0a405b4324df198e5d6ebbae2994efce28b39c5f493832e3d01022e21e13959aca5baa5b69f251a3f4b61c6a518364b59374b55384b532350207dfff1bbc4a3c467132c5924709ec473bf600d2468df017fecf231b00427f62e2e9d757161d9cfbd997e13c69a7789a053915353f2ebb7a9ee6b999c4b68826ac282c36a0f8800ce10c2d660e336acf6000a7800f3000950a002ac500f35d018ca7f61e5e3178588bf3f7e91dc2025bf15b26b9fccb13ada5c9f1b3565ed8f245096bb828a881312529b06d41a41d2719f906878304982e744c8930f34b63cb31561ecd716db55d512a5f03ab230845ab5239ea2a31ad689efef481b4404ea073b23477ba4467b37e6b2e062b7acf4a29c928c88daf7440f8a1336ee083f197a6d92912a20aed38e56449a960c562a06cb851543aa3d5b6adf8c5c1e231f56ce0887eb893b9324455ddb44aef5e9e1eed860f7dea32fb7c48be40af649535b765464c2cd29ca716d8a66dab825ecdf1dbb230812b7366aad1d42c33582b94b5aad198b144f6c150a36a8dd21da11422482fdd1e426af651ad29678737f70b846672d09313f185e2d5a1c50ec1124fb36e4ea0c9170958646b43d7d6d1d1236aa089b06d76ee96879d0583f3256af8bc5d5920a204aed50519e50892ba11b30276cdb5e7b828e26ce9de2d1aa506bd1669079b94817acdd54fb8249eac45dd0cf8c2063dd9f921216895d1b642e475b8b1b6d56994b9374a1b2da272a3327f788c406016a7b00e93801a2714d306997e0b52b84b83d3e8ab0b56b664bc2fab6d6aac2523439321172e3b161a286af8ff5a1d7dea07351c84db5b536d6a8cc8888e5e062d5aed82a4432ac7834d54f0bf87281a97e5c545c4941187c0719e613a26bf27bd1e466b88e1f46bb25a9226272458eb87c602c7d6eae6b59962d4865994326c50ba31c7a389482ca6028c910f5a4a5c94071a344dffef885710cdb2d3e6ed6dd990b2544f06c32c0c1d5f344861130241ff4d53aa182a3e5a7828f5f18c69f7efc6ef901b500f168018269217ab5fcde2d9f576b26af65a8a568cd25a8bbd63846a7660bd1ce8a4bdf62622d962ad6c0f2417bee4be81e28c41a50124e50a62a5843d09725dec0ff738880df87eec7c97f0ef1dfefc30ff636f1be487a5d589d9db3fdbdf72616794bd0b9f6bed07a5f54719969f6beacf04daf83ce239c01fec5140f2e787006a699b356f898033f9769859fb77e61fc3a6fbc9b96112d34ba85668769be5767af15d8955be7de258358a73c6b8bec93be7ead8abef6a9efe097a49afaf9b78858b32f86d0e7067e9125a3fa058853a0cf44ec2659f3077a137ba0c72cd8778f626fb260cce4971f0844b10838fbecd1a1fbb7a21efbd48348ff69c1ec40f4343fea51e2cb49f46e99cd6e2de6aeae9ccc631d4575099a66aaae163c5653afaaaaea851a03ea55357fd577550455ab6abaa27814ab1952bce9f30933f4804308d9f42ede5afae209f42843d4aba907450bdf447dd0771425a6176050a0e71a08240683689fdd266b7779d14063e02650b3df9f67590281406d01468a1a3757d235e39ce1c5bfec0c1c74266ecfc1019818b3b3e71ecabdf7c644e1cbce70e1c205576fbdf0f54a066549c4ebf947bc54792f95da4b85f4f14bc5f3ae002282aebbc97d8cf6e53bc5e46b9f5b6cd698eeb5ef2e93b558ae679aff026472d58a5f167e1fd881be7b16753d6f2821ff107ac51aca55632841ff6dfe550563387d5681de543bb00089e7f901271dd0872cbffcb8f74e0ce61c02fd7b099dfb102b1fe30d4af54369aa1fca99998c5fb837d51148d8bfbb4c56cc2288fe1d247ad4c2b6807fd102102743f0c061033956f1e7b03328817e527bdbe54583d26bf5034a4cf58b778fac9b985a3887ab70256f2dba14d35f16d70f937fc7a0c15780879c6a7501f8b3a0a7474f6ffad3739d354af74133971aa5bf5255bf7c55ac183cad67a976307530ab0918ba941d2da87709f431a67f5a81390375f98b668c490491feede582187b5da66c201018e2dca5c7aa29f3fbb01c06dff0364be7d238995f3c51bf5355fbe0191ca2e9b003fe280d20a2f8d2a3108b419fbde93968aca2dca3dc7b991ff440af0e51cf61e7957f1275cfee672913ccda6d5583d2393325a88d693a97f68ea6e99cc680f6a02a025a6e7f8126aada7734fbae7de7b0d1105a1dc650f027f81a4fd03a4f50d3b8bca1fb5c0ca1550a28e95c91820f769db5d69d1883e229788da2689af78b1cd5fe043fa3dba3295cde807a3525c2fb2ed1342e9dfbdc777f01064e6b27f6befbee28c4189482debb5735a6404c512df4dcf79dc2a1aa9aa673296a8795824759bbca7ed79d75854e44559458cca9aeb0fd7eb74fe37a05c4178436a66a1085611eea2a14ac7a3ecc013b49f7cb7a50a7479d32d88ee01e418e1874498cfe8cb2be9c7ee825c10212fab9e3ea2b70e824614fa8c96b43c59327e8934ddd96510951ddc9fb58c8d652142929f1aae04336bd8d28f2037467a4dd389fbec3e1d1e6b6c2890d2362383888c8b656f4a089b561c09b443199505b0e882c612665e5a743878cb1450b23693594484c8dfd48c96552bdf7253a3941cc9abcf08c6ea8110da12112a6e50542ef3d8533c1328a701ccb98980479d231180ddc91ae1443dc7840e8bdf725bec4eb80c58d3bb716444b4d6ae84071846fc8949b1c0a5702e415f856da7bae2d4ff5ada059c2234b2a93b911c183089491b4a12a9e84fb93869f404a23529bea3ca2b2a79aa669a6679269cb91981a71e306c82b87022232826ce0d13802ea622254f81ea77ada636a62d66473c66104945d8f1d3e5cc4e8f27ad9481fd9751f609edf3b38e7fc2c3947fafceaae2389d239279f696e0d434ea4ae7ca29aa436d5910f4588b4a5a9b8d3c2a17286fcf2c903e283444ef701e6e9d016501bb2971462b246a672f7935304c7a2c6505894102f850be7db97669a02e7bc0c6b326ff69c19a6649ac2ce7918dfe75bce2afb983393e1a4c3868f14047a1429facb2a2bb3039343b9d32a8d98a669a6a729667464678a01f1e48bee81254c9e3c3ab91d145a90a43a271a4e7f4e63682a990aea662eca344dd334cdf4f4795bf2ba5146e73543e6e96ead8610323b22b0a96f8295a5f03a1836224c985c19d568192de15bba4a61c3ce0bcca9d32ddd24f1e8f281978476c159d185a580e2d340c7b42f1c24ca8c6c75260c601451c322c7e9859b5669448a73cecff2cd85535c1ab2098997054954c937bcb02da4df5904ca344dd3344dd34c4fb0124640cc7c0ca17de1572d4d870f92b5b523086632ee9b49212727f2c1181c8f1a5f75482c3cd821d1ba76a8ae849246df4cbaf1217ef318d185e027af8f1bb22f15463d4a27720c91aa19d1440d7233379563e2ca848c1dbdfd555970c2cdee46cd16581691998f84fd70dc43b8c5cead2b10632dec2b2a2fcd299f49b951c101d974653e8fa2a0c0e90c4ec6dbb4034969aa0618101756643bd94bc5e63cc6e7fc2909b5e5a0b211a19f157463c63399292abd9b125e36425860459ff3b85547ed12cdf7de7befbdf73ed4597bdfab7e595985789bdc976bb97fdab25ea0b071f303b46314cb692a9274f186e570209c884b3fe459f1ca91043fecbf2732293a100702bf0ffa1743c0a5b5d639e7ac75d65a1700a52803051cfbd8e3b3b48f7d56138065e47d8c9114c142ba3ef63f906f7d42b8b0dbd4c73cde30da16ae918679f878e3cb6f564710c278ebe047073aa6d9518a1fc894700d340ed0fe0b12625ccbd3cb910b6cd054885a9c44200183cdd0fc10dae7afd511845f138b1e602b2da0143ff0a53284e12d58f7718ead51942208d4badcc77eab09e0421dcc131fab0ae041278edd5496bb2ccb5dee5d967befb22c7799d1508a7f677dec53921f6bf89888330743fc6574ee485c5d64af5712bf5e551ffbf38801c92714841d5d69374424afc030dadad91a178c1a424b201c9dbcc7df7bc7783f858f5faf9b3f332288bd068b41e46b9f16d38f5d34095fc919d88ca1d555c6665ab8a05f4a93586e2fb5bfb717d3df2bcccb6e69da5d9f5d6f178c272d4c5fc919209454aa6f9a21e0247ebb7a266cc8b9a1ea61d7f7378737236e87ce14535a57cd37df2e1c1e4b52ba749b3a0290a5a8b42b19514aa70c2501000853170020180c08084402498ea420a0b3ed0114000859cc789c8444201b4a02611805210883300c000100023000003100c3201487422ae7001c476589e2a666b441ca03c20922b520c4bf202792e30f05e9ddcf6146674c60352afe5d189b47a61c63436e1924298a9f0b4a7b36225291085866ee6190d429c48a498068c1eaea8a0f623e826f38c145147e905500bf360df90bc8ac014cc5f30845198007e682627530c22aa91dd9d20ed0634ae4d2913bf0cf4eae741f89a809f3dc4850cccb2991725a4650242779fd32c79793319dbe7f641c03b8e55815918f152f49f961de1aa40dc84d479d64329c09ded4f23440830b0c3c416e983638b83d448b73123773823250f5c284a8d2b7f5b0685c41bec7a496017994304c568015d0263049f14a860961e59314007bcb31d9fb8cadafe27e1fdc2e42deb8cacb43b2266917b11b9f6e9d419a58de2ce140c8d551efb9676a8491f5ec814461b828a098a1e14d9b0e40f5a70c7df91fb041e664e3bb885ad62ec9ebd32d3821e7207f0eb4d4c86529b4b1d0784ecc0fe623f99702de6f575216ff2ac046f22f3878fe3e6f258553f1d284738c3072722883928a12db22621dfc92e07de858713b885d85c57078fdd6445a6da4fb5f692c071f5b4919d09c36e1c2cd981d20b34f587c46f83411e8c105f6e7929d8b064db9e3ed691712e1bd0dec37974af363bda92c0b4e82f09183906feeef5c34dd6639e70dd76840ba3841d8c5460542d49b9e24ce06ba57426097f4a23af5e919a001411c0bf95a13bf25c009a8abf9915f94b2c12341f3f829fed322c1213311bc6bbc6acb03e10fe45eff92eb7eb9ed5709907ed9e1060a277c17d91a6e2e0fa2c8777167be15a93f5a9cc6237acfe9297f8bb3c00d4788255b4bd61164e1d7b856ea79a5307cf54104111ddc076004e12689388f9d0a6ad8b5f11314b2632a8802a5dc0ad03050c6be3b0b6fc5788540e665594870f32c079a8bbec0d337a1da8e4dd097819294afb66900455730059b2e68a75b8347c5eee911a8f12797e3bdbda262364fa64766eba97b88595125478b29becc10f0150380a5726fc6c0248a8ee1237b42729664956c26ab5185ff319455785f8f374b9d5425fe17d2cf88682eae1405e89c347d82edafc615daa49c0a74ad5aad0fe0750d00e7aa78bd32fda92c93650e1b91b17b4a943350d2ca895c974ea3fc94cf6b76e23783eb514b22f420334c56e5006b16b48801ffed3856a9e4073848e682764578f807d1f8b7c3bb5d4c5d2ecbb352c5672514fe36865ee316724a01a28ccde29863e516ee0c068b2245b111b341ab53cb0ff3d495c0770161980812a16f952f158dc26872ba4a15d069f789d8b7945f7681149f33a24ca6c889e236d44d2b4cf197075b2642280ed68b5d1fa992d953fcbba349a6d276f36b49609753822b18f49e768b5a6b2e53f111b44024fa3d6cd059953ce44c2cdc5e223f844d66d79a7c00a737b09b2276466022018d8a11804785041ef00a839327923761cf2c81fd96d37a99ee91fc5eb002ec3628716fb0920187a85a46a4aa38f604b6ce9838c1dff826efa116397a905a392bc664844a0017595ac83196f99d498b2925e06e8b61e67c6eca819088178bdfac0777525a9008558fa108d1fc14159b7a575650b3509d4c0e328da6588eb6b2c85b4237f6abcf2f864393c4e22659dda9f1ba55fc3e42fc0477ab746958c0ef7208eb2424d1b326a7f73cc62332edbdd1d5d274037b2485f25e4d9776699c87192c4d20d591916e7788b41ebf7c0b5bc04ada138c217d2ea359e0b789644a042c77ba70007088ed2039ae746f2ce6a600576b914ffa229ef5cf23c7ad0f0cd7a9bf5749be3337f41f55e83d328a725cc00c3a02ccb0ca3ec5f49071440edd3395b6f5801ae08d93a7e8801e12d46a13de0ce6fefdc641027d635bb2430dfb92bf43c60859ff8cdd71ec369212a4f9a89d0447c3419b9bf1b9c9c7175c719ee91bb0899d1f8088db3b1bd21f7e09ec05dc35a3240f1b09d864113b9be514892cb6caa0d09bc34297589bea8a319984bb1e318b484631b71d0b52f6f95f65b9ef83aa7113eb614e40aaba6d80708fa9d4c49b092dbc8442b626a444094297abde00f1c2f9a1f0165bceff8b6147bc5401bed5d39a633d3d6f1d6d986a320e275b30046f0fba5ae98b63ce5c2b44866e52c1f98e0b92606e54a940ac2ddf28c9f3327fd1c2a61c889439a95d3d78f0c9759781b24a2ff09c5a2bc36090b4ac9cc1fa330a1f9105aeb6eff67b1482f9f0e80b36fd7ea9c5117b7bcfa5ab6dff5b0e19d4f2acd87683787348a9635015ef427aa5b32520c68a5957fc38b738a64f94875103c1f566c0e24c88a86ad991bdb6a9bc352d08d35bc4c3ec5c4cd7c709c19751cfebf1d4478bebd629ffe459644dac18d13f469dfc9538032a928f5f3f448f6bfceb80cb7ad28dc60bbba522a957edbfb247488e6bdcbee83ea550a4dcfe26342e7d42946e304283093612259b46fd367aee7e00eff5cd2b8b7caae7f9d662ee6b26e3c9a6088df2787b7dafcee746102134bed21394e28e6c6a8050509c17c0138548132773a3b12322228276b6f682cb8d899f0dc81390694311a9c977c0e3fc6fbf9ce79b8a4fdaae15ca2b2ad6e9fa0f84f2902106458f48e99d5e632052b60b31d886229cc9ae411435e257e74723eadba02801f28b286f72582485181e7206f47e561c2e7de66bb2c8a1ce17cc312872834e65a35cc3a2b121cca238aae51874358b2acf363acc1e8d8cd8c88d9cf07f664a8e6dee7314592614c30409c56809bb800e5b2dc2caa04a4a3ace41f4c05e6ed62d311d152831dd72d73df18fc634cf46cfcd503537cc8079ca49409344602a08a89c2f49217e1becef389e70027ae17527447c92138b48e2baae581d687b9e19232bc7d459e3625cb8bb93fe3106f8263fb6cb26d719d65f7e0e499cce0db6754f92b9866a3656e5db64f5cc1ff6cc800a4fc6ec069b9d6833f4c91ddf1c84033ee53313cc0fda9d7a4554e02a6e54b00057a6f36daed14fb60149f0ab2e50afb201b78b5258688072101bde7616872fe0a076818d48747e7203f034f947474c560cf8034a070b5289462803a2d30fb0aa4228a3516773aed0533eebcb5992d725db67998ec681c9b17004dec9ae1ca92f4fe0f608ff4ae0b9706a2c2ced31a66f2e52c8c18d7b9714d7fde96f1a65fa029c62cc23ad4d2c2bec6ee6f7a37a4bf4fe30d647997b8052cb4f49fe94d262bddd60992460095be4f9b700aa0b94f40209cda02cb4b75f34e82026cc6d266d9fc67b80def505d23bbd29b5834083ff0298ed48f6810681f88c50cea205fba6975dc22f7820a81bf140447b40d36eafc503f1cc0ef5e9fb3f00851883698e608037a202a27503b38191e795e15fa99353709a021b65af92d48e9668f61fd38cf72f06deaeb289fa2cfb76a1c450d8ca52a27f2c718de1af454f36b651516d1442508f9d6ff57656984b40853327d307fe92d2ff22c0ba688e5f5918f6b1ba781509bf18cbbbf28c8f34278dc740386ddd02832de6307da018b510db1fadc5dae4adaaf9caf892cc2e5e53b18b13460212337e0e1301e2911c692d160d71167cb05a403c5af09815cce0d45b8ca45f620e1296be0349154cf729cc56819ac0ab51629efa0d2c30922962bb4a65a46ce5e76402b454d305b60dfe58107ec9a7a41e02d0d447b6a35d86b6f832aaf4ef3e1c9e524ec749d1966b8bb31b28cf0510951e02658411a9c97d0d15d13f5187d6c5e89573d6d053fb4e8e6413fc712bfe96226242bb102fd8d1c98d5dd049150e3e4efa382af49e90a63c7ce73571db1cce518f8535cd7bc1cda2de04f7807307c7d3141b9ba68a925ed61326eb04c13344117c1131e0625b47e9c4a5179d7503f45cd55a1824c3cb1f5327ec810eba6b986b9f1b06db0b66491e23a1fae69be4225fc3af15b29f2aa1fda0ae56eaa961a8645a3f6671a046738419bc9f698bf37583e732e8c3e4fd18659a70e109a7bcc2766124c60db3e7422ae0a6af5527c65686ba90bcd8488f349b89c8bcb814ddb4960e549a02f50503b3eb02bd99c9121088635b6e3eba7746664812bb64a55caf4877c731c025f6cf4cad0bc6480b3bb7262386f20199f8a627a10e5bf0bbfbeac2cdcc2d188960cc2629507799c1a26835305231daa10b8611ed0f1259641f635c6cba75d2b36ea87a9c0e0e34f9254ae5ad5f4db6af7b72cb01ca17c6b7f79444c5cc4b31d1a7616e66bb0cee39d99811917c9201e353b538adbf426c6c1bed68c66a6f797483feee617557a3afd24b29fc1514759703106b4b8327823e7c7e6b10ca8b0c6a2e0090781e16763efdddcec44c2a32846e5368c261eb72a866abb4d08d3318c7e8d8a272c89473879b226315396f944461d66f8291ee18c9464a309fd131d9561e1129b615eca6b963c7493211bea523b9fe6663c9f9b2ee3886e1b0b6a4541069edefe46a514a23c49a1f3a22e9eddcc0aeb82b6924a7d6b2f1af2009f3f01538f3a959ed435bb3cb8dba6f0338f076ca6027b4482705550c649191aa14eedba81a1346ddf070aff53fdf1da55b3b8cd4a6d19ea3ded11b16fb2353c5afb0639b3db84d2cfbffb940570097ac41a3651b99955190333b891fea91e499748ce9a48519645c6449113521b500164092a5f78e2f0bcacdc5d6bd6e7c60047ee8973c41dc7a6ce531f3f1cbdf6e09dae5e0918f9c50e123bb46ff454820679d90ed4ce4f46f147b1621c39792ff1f0d7c3b82b5017a1029f39b31e89ed694dfcc7967cedda7e36800b4a506157e712ea873da9dc425630ddafc764cd377f042256307e8447df91a331191f169701e1f0b961a7cf3dc0e782d91f4718b3dcd847a8d8e096bf3d9a5447a5decec71a3c01eac6a9cf74486c2dcd9152ea8449fddd5520eee46103cac03e721f4ef1cb580648baf574e6470355741f88e798584d7aaf8e4b5f8b5b0298b1c3345bff0bbe2e6d1f220e4c5d0c40c5120aef92ac9295c990a92a59b4a5a0603ad165891d5583f07067c79d06c2565032bf6a4a598ef98ab6ba01dc13be0236fb71e720f43007d54c2c7353e5a6c38242206f286e5122476ba9a39b6ee5858903836493dc63cefb174ada9d92a4dde5c66c39e5ef88742c5412a4841f7ecc1e8612761df721179ef0475391b51027bd0c7e6b996d90e1e758d40616d2dfa0ec51f63a8b1b0f44a97b1713b715e5ba661b8352f42f27668eec5358086b28bef919c560262cc311179f09b3648943f5e98cc3614a66f71449d68184f21c234c2a94c8cc582d3c19cde8d5feff0266ff64811d9729c046f06527b8f932250572498ad1596d21975f2537bb62cb94ae1a68b92d9d3a2eeb6bdecb80a39d05159a2a5fc82cb18a21f68c1fd836539aa6e27648c9223c11104c785281ba66ad695e0011fa2fc6369413ff9581cbbf56909a3435b26c49b7586967a076a863634cfebb1259c122585895a74a78bfcaf0109d4a24f28d3e2401f50b947be82fca32f6141e1ea411e68ffa1a0e0fbe84eb683f2a046b5525243a2e572503ee6accded1cb02b5ded2234bbd465d9088f5897c94ca9123958ec5321cb472bac6f51407bedc106dd510365fa0cca4d165bd2ca7201f356a80cab04e80d25efed0c3eac801582d43c76fddd4b7700818bec44bd10661e1ebb6611d66a38ddd09d421e047a50ab702e1172d6474c18dd874475357c877422924ae12ff1058208dc4cd026869452732e517a63563a875fd6557fe6640d0fa572b9bf92482dc07e0d02f0185b1bfa174decc0b42efdc4fee8d6fbaf8f5e087a918176c1d74118d195e5729c20bf6dae6dfa53a73f348acfed797b3b57e760c4efdb8b9cf345ff29fd5a9df0b37178c91b2aa0e8aba3c84e015c92ebe5949e170d65978110ce5328c9421183248160a7212a6667c04fbc5f4cee99c081f8e6176b9e211f328334d5620de2913adbea6b5278639b53ba6a065b95b464e8dbef9da5642ed9be61b313faebc22085099bf7c5fc3ce04f221f3e2912a0230a603a238403124a20c45f7a1e26218e37e3954d54871afe706489087006e437eeb1ffd7c93dcfafedb89517c3ea07c48746c76deacdf8d68ecfb81b0b470367b0dab193d2c8bdfae15c0409f46cb06919a892e47481c6481d371f7d502e8e1cdea0fa61add56f0a77c7163a26be92b14113345b3830760dff17d16096d38fb1d221aa3e6f88e169b2d8d977d38b0c183fa42c6291d33da2dcde1aa43b4b8bf0204a0c2b15989d7bd8ecc00ac0eec39d9d01eba4c967a34d862a5cb690ff968ab4854aad47cc1e9c0edbcdc7762922f5e361af50ef12be9ee637b55e0a5197e0b7b40405226ff11561cb21b29af7b81200e6ec72567a8de5024350e85afde85912ea225cc413ba8c20e1a8d96b457c88cc579a4d60b9a09acf35fde77297542fd7b478d481eec97c217dfe5a992e53261cd4973e6c8e8f35ada0f8412a85e6142cfc76114ce97c889c7c622180edbe73b0208c0e4b768b12f5cb975de4a1d5add8f4e3c4bd1af9ed995b50336f88857605d9aafec5c9410c76b6a03108c8018ba160a12256b86dd3d58b8a0d8c87e05edcaa54aeeceaf5502bee74dc8d5bea1508c188985ad00688b9b877f18d42b9564b5470ab21ac545ad474cfd25c66f6e4e1456e38cd6397990ae630794e61fae9e882372b92c460a84430984d30c8b6d7834c339a6ae0b6595e8fc38059ea5168d0ead0042a0088091b49166e3710e31b77f8b17278c4bd389f88fcb06c9687c5174d0fcd1422bbe7a21780910684c4e24f3e2232bde520ae45f8e025fa4e1ead817ad1d5986121c2988857ba6d63612b7d96f6e1af6aea63b96c58cfc97742945bfd1a4257e53f71bfc6bdfc071e6fe3544fbf05e4e577189ffa62eab1b27aae46d1823bb9888d12a64b3322d3e2561c9e599082bc09552f51ef6079560fa4a35d39e2cdc696bf22ebf0df170b8f96d7709ad2f2228b0625230029f391f1e14bea7835c0847c886a5dca3ed458581882dad2d556838f2aeec99c8fc68c389ada6c1ea4b4a2a4f424b8f36949441d5eece13d3f5fae899af88959c7216a002763d56b50ab35af39faa1181d9c9e227a12317eb00b8752274a99396aad66348f5a44263f04642f195ebd90edb0311659a424b70a619913793d8c32c895c3a243c474e1f5d7f25c4a72702531f588641e2287f4c7910e8e3cd235f012693509afa0044708c97559f683df5526bcbf625a484be08c64daac443fb330e3b41d98cb1de01b20aa5750862e897e7e1011cca75fa8856616d58452c60c050574115826c528b9a565f252e7d01de1683aa06ecd40c956a5f95da87cd1cd420dcf74736a880b96f34289457e02f90eb4be442b2dbef01239eae5272a5388c502e871b830a3c813da719e1a64ff3708b9a9b5544c1d76b83cbdebf67607ec588b873479910f11cb239c62f14c44f711be6c4417a4d6194905aa58ed5a0eda29ca3e1c1ce04d581b99d58962752f74f9d9f97f34c2a677ffee8aac0501c1387b3dc22e1c7089201563e41eed19c6ea052ba02d44c30449b1ef9925638997d2b386118c4faf19d1b8d14076efbff7ce4b56143fbb8fd815ae6c16152c632dabed8195eec26e3fb3f6745c120326f7358740d16ce1d142cc915a2ebf8880c8780a960cdb940a82b2e03559876e3c69c81910e035ff854f2c592aab2a5892a546e9de4cedc5e41828896cb2b4935ebe89cc4e9fbabfd18b1a89f83662e6f1d1f3f641884bbc8508cdf45cbf1b0cf0c2d8557f0858a4613e82431f25eb122bf275bfb6c5942b1f059f9dc7ae100f3347de7c0c8f14dc46575cf16285f5fd9f489e4f950d85c3dc98205e64ab7461057a6629ad864a6e73eda74304f2e038174b666f81c0a033ad7460cb732313abe67cd6c12610623873a8954736ccd8cdfe29befa0f97330c1ff14280ddf57942c764decba34c2c5ff5227e165a9f4e1b2afd7b0e01a8bfc5cb6462c981ac4103b40e143c10384e090d4543060a2fa44778a9cf3a5088f6f70e80513648b81b30c729ae8fdce65307495bfd554af9ed73c2d066cb73c8698e21fd7c79ca29e9a419939188f4963fd24ca61f2f3daa1564804991ea9ce0f0e8296e689c1af4b629d662b156cd4e966a8a95f47c14967aae2ebe4f816f2a029f53739a9403e7fe1fa52418b6d388615f1ccd87244d9db24b8721f114a4662b22fea582545c223f2385a4aa34d68dc1e8562fb11ab59c8d3776ca780e2eeb96b58cf901bf898a16e750515763d56dd81da23f6494e919ce945895a919056f75171d7b888a789247f87af559e526b8bfc974130a4706d5e02e7204b79017c9689d96064cd10a497c1a9aef915036335e0c6dac5e841dc0290e76600ffdc2ec9eaf91814c570aaec6ec8eda4ee074d77e10c8a7ce7e8e6de521d20e1f9a0b3f4c0f83d98a08fe26b0f027d91503b19ccd8fc2bb0fe71109170c44ff2bc562833082ece3b0532cb8d001999d62d90a4b8f7974644bde432f93be2712b4f2022273c452d2d9245db329a3fe064c3255309d1e90f3dd6e59893f2dcaec37eb22a24d2e8acc8543cee929d0d24408f353887a6527b2e2fdd28f1d3dfe21288cc115ab81ec8a5d7ea9547e599ede01d3b6354aa9884e857481c1d8183a9aca8a205a6b1b4fa38f195f7d2f083ba78dc9bf1af8c63a00961a9055518f73dda79e4bc6f1f3d83cb10877e679121cd1b45cd6f363206b34fe4b48a0c16cc228a93476ba91fede887bd007be9135f944008075c4b91e257c77c623e4f61793608dbcdc3a02ce26c1ebbeddc8cae23e396294720426cc11394639562848d201def80c7cb0d81ea391fe102bc38d481cdb3f059d4a31750aa3934cc87e041d00c3d76f03197e6901b77b27712c90774fa207f9f64648aa48761567d07fc1b7baca474df19fbf52026ce1c28406b2d925f90fb4f658f4bb8cedb593e8ed236d24e2436589490bdc160cd8f360466fa2930311ea37be2c7cf4f78bd3e119b828a839cbef9bcaf9bce43b44c22fb148e551643e085b10675a60d8036aaf16fae6c9e40e8b852d5032f6196cc3ee3b1ce39d3fc28ab50904af519a36e81e293cdcc9fa25b8299d080f6c7116cae3caee977947def65801405376a645c149e58a0e416d1ca65c2ccca660a2d080d5a92c162e73ac0e7039a68b97d4db1ffda1d6da92906b98163ba30dec52351b05a165246f40d106b453eacdbacc7e445905e511dda185b9a26a33545e7c9115a90700849cd2c146d0897f7a382e3ec167ab0429a6991b093ec193c025fe0491f7ce6ca6fe2d859519192475cf38d8c8c7a5f6670b263932c9af2ecb67276e7a5218c633068f20de1275bd371bf31e3da12fded34080f3cf4bde96058268dd44338e80ebda5406546bab25b60f998a3253feaa400f48b94462884f872417c02ee7b285f9cc443a01e2ec867b577f536c2bf477857357f5a4bf0eec721f91c2293be9244dfad69ebac1f01899c01b802757b24dcafe08dd8d8e0ec7276f09d3d618916dea9ab09341d17ecb9cfc9ffa784dd1c9691d5edf04a66776b314a30850ab29911f7ae9021eb249aef8028b543b6f779967e4c895465bfeb8a94825af2848821a307e451f9726734ec22ce2731cfffb0c9a131f2428903c099a4ee6f46b85f96ca4619c678b4039467bb15a709bad946aec0bf51a813708357d5302cf8805276ac9d6cc419bffb2d8e910da1bc6edb18bdc20efb08cef0008dbb263e494221c503d2406502e94c0ec1813e11469abea57b49b9741258e79ab0e6883bc98b4612d34a296715c096592379c4d157edd06adc808acd8301d9b484990f362d96ea72b71723b2a27d2205f2269580b9dac410be54319e50de222b99b341abba1040b539762fc946852e7161b05b6869394ca3d3db788504de430c100d798e8ea7312eb16866c2c542401ee0c2d69892de3669ba28eb89f1c2893bc56553e2b4d1b2700c1557563e40283f59c27d3f2e86808825f13505e56b4c878009ed9426662342c2dca556074d35d5c50bb25a029c72e1433845b0477355425a058da2efb9652b9c4217f108a180df9573632488d0c9c200032de280e292015e91e28ddfa69a06a71e33a962c40d12e12306ba3edf4368796da8f3c9891fd56411e3592c5776000e521428314d48dc90635a3328b8916a51b939607081aea84231aebab2ec01217b15cad6426a3810b69f904127a802a93eb2402f10d838e0e0298332bda64c2cc0241966614a9f441424112bcb258bb4666d91443355c97414f4f2550ac62a0697d218108cf2b298ad96a6886928a6fe0c65cc806f6d4993bd42c8bcaf013cb8c3dde437abd48567f452a86f51c94ee1976315e4d359a4e5b6e1cef75af9c83d18f3aa639d0b227700973f24d08e7831df9b2db0b80b741137d4e9eea498f6ff980a9cc40a026c8ca31faf4e9031f9d796f79acc478a5ea44fce144e8b407cbc4cd51003c35be86088307758e325baa8bd5010a5cd2640f5ff92f03c5f0741bf5d4ea6f058e322f57114d6c518a82d0af0bce6c08747677e211fe7c149e52c19218872553870fc563a1ff2a020f769cdd4e2624807668bc738192a80f0436cafc442da1a5068a8d83803ef1b594227713c3f990b1429e088f2220117c74a1fa1d0a70b35ae4ea234ee8915cb8cdce94377d36a63d3ab83324b4b225d5c5c376ac9bb8a9f1893703b3f62298dc9bfd16c68a1f610f7b4e562f8415fd416187f665de670bf9075981c62a11f3afd9d554b0b3a76dc4cf66b33d7a6d5a178f5ed88cfc1ba4d46045dddb36d979c248919935a60264d229334a1091ef264534b932d55770189a282888709d051f0854009472800e6f218905b4cd13e5e8ffa1dddaedb3124b862085356f1359e033ea4281e9dac14363a8a65901f85203ed810b472a7fcd721428df6b9416d046fa0058a3aeefa3a79586edf4813d3b4fe7a3b012789f250f8198dd207d481748a8b9f287815da07755e05fa2f0e1761c31a08640ec8f471f0e3d2b414b8eb9b11ec3a16c14ec2de9823da9e2891425a48f270676b3b76efae065ef8efceca66c91b94640c74f4c82605fa436f59b20abfbaae22aa6eab97c509900be46c0fb8019798de7b13ef95653f14224288401d727679849dc21610b7be132dc2766f3fd1d01645ef692c5a856cdad9059e7846c25b4cb2e7a4c4477ab939106cad99ae8954543487323cb174ded8c872663f49af1384a259134486dfdbbcb596ee75bc5817e63225c743211d90c3c14ff719623f48431a2e061c0370159d83eea6a4cfd3881d1ac737769b0e94eefd92d7ec7ca0018cf38a050e759e5687bb4a32629c69310d2ca91f23fb98a359d5ab6b2c32e3357b56d8e58b984f9b910e1b713698a1e723291d9b81cb568a2dc4dd7646c1cbb8a8e113e952cecc89a3380a9a34cc0cf7f3fd8c0d5e69c3428dc22db887e0bc44fff97c5c72e9a10d9f9f5c407525d9ac21450c2767d3182bbc7a69b66666eb4010f38075576922effba2be6beade0c0c9bac33c3c1779e37745b55c2cf6d073a10f4747dc6200f33160add97b22056aba6e896681421c6ac5d2b3e68f40b26faf5845d83446052653872419b8650578f6cd37e3a3d7512b481b85755e6fa4c5128fa1cfdc1bd919b6e0f192701a0f405bcec3f8805ff25a44b80747b00f4d5edc380e5e8bc7d0d66341e364394276f3f4ab5ac98eaf5266ea7d27d31b78104e7c262ab62843dee47de487b4d0d5f48621f9af6e1acf02a0b2715d13f396484410a2c42e5c20841cfd7481547ba638ee91c5537e24680e5d328744bc9efc21fb9eeba46b397d66674a3ee5ab126c4f0f0175f28d898d9c2656534a34533755a495c8c745a2b68c74a9c450d39b00418517727b0583bd1efb8c876375ff3a244389db1adbcc56c7b0793ee977b1b11dfd11eec919702c1b9b8507a0140550fa14fc6f1bbfa338048148d50abf8da876a78a1215d6318808111fa23e3b5e84063fc7912c08d6d1bb42b98296cad1bfd584aeb915b4af7cc7ab8d852e29fdcd33fdd325a141936a50568e1a339113505f5789f02010155036354d46c03932c4ef0d396876fff4b3f59d26fb1e9a2e2e10b43596573c0ea0945b4226f9ba94cee16264f974562827b3a1131b9da4cd24e12e50aa7f76484fe1cf072183b4c703e89c20acbaaa604fb56be1b0e33b3f68c72db79a62359246150613de70fb981c2341499688037b7c02cb3b1d1ab7ccfccfb3744807ee4f55e8e6a353ac7480a15447e22ace49183a4e348bc6936039dc1c3b1d94b8c3fc3f4d419cad36a44d5e39c61d832dd6cc8cc02ca10b6c5e3468c9c80b5a5bd6a503129db41be90e3d225e2c2c82ede842e7752de66cc5235db46b319eaaf676069da615288ea310e2a0711dd3ba69a621233969a9128ab0d1d8fc64935879c246f8403ca735fb2c2444348f9742146809574a23d0002f3401c5b438519803c43888bcd17e530ee1d254a5ad83391da74da38da0b0da4803213262a00dca51c7ce761471a3dd94e07414a240239143738c58d0c065d53a4e1b4be38a03731079a56d229d8ee51c893b7c3a947310e7f0ad2d854d0e6e0e54871938cecd51768f564a2aa5a38885062a74394cc4454b3050529c58d09293444b7350db54f9890f060d06edc5100e1a2c64a48dd628af1d94e790fd1e8c158964d2a04c46d2b4d392eb80ea9899233b1c2409342124494aa3415339b52d1e6862f3d0f5dc3f7ca01cea0154cbd18d2104d03b8a5c681f2addd2d060912374f8688ce67869900c0a76dc08abb9e422b39a0ad1e5ec815834c5f85e5c7bb2ab236b52769af6de422282f66f213b42fb271919a1bd43ca8ea4d55b4e13a1c1b330f6082d9d646484f616511dfe1c0b1d886bef32d2e1e358ec20eef01f4759459a930b498a66cd0afa399abde875e039e8e5f8c341c111443a8ef5d394d29683d39152232861e0203293f65d310d98061d32124cebcb02e128eba2dd48bab525c2b6a3cb818243060e727394d5a15d722141d14e92cae52082a2e1b0a46f4033211969a00d9643876c872b8ed2eb28424c73212cda51d687765532c2466b945738b871a46b4209193988c8a0ed27c11def0e9d8e25ea20f9d31649db1c3870a4e198e970c9b19b83680e1f8772a4878ac211e31a950da5e875e0e6a8ebe0eb082547facc799e22111a2d4616708871f09b636487562e280eb6accdf6d0fbee4a644854b2dbb2019f9b62d4b4bb11feda9b0aa007a4855c33ce818b6ad9e8e0702992a63d95c3ef289ba6fd808c1cd086c58c1d2432683c64901cae0ede731842489641b90834ef02ba2fae705c40522a6e0ef2645e0237b4aa2ec9a50ac7f6ba9aa23d415ce9ae162bb9ae4cb4e2ad2e3d91d394256b712ecb8f26989eb92f1177f627747784cd64a61c2d581d1e85b2711ef9a322141ec2b661ff0dadad6d0b2d2d2d6d22a59449cad8060007fa064e9cfca895d47b4e99db8215fb5557a532852944650df6796dd08cf068645c1b361757e337578df97e6a4b7bd77ca508886f1f35328cfcf8fd7ca5e82b6bcd74b99bcee66a94ab51add3a8af747d3ba86a9832caf7f349a1f73565ca4b837617e4d1d2f086905ceb6d8ddcf41ae69047f0078cb990275372ba540f99e4f1d6bc095e3f5dab9963dbead668e24752cfb6d557c76e8de37b7bc59d784cbf9e9a3caa5f4f55bfde83d2ee2aa6ac5f1eb667ecac4dad3d5dbfa65a35edf6bdf7deee2ce391ba23b0f1d76bb79db4bfb147f65299f552f68ae174b95e0a9f288039761c34eca56e8fc7bc949d33d3b66de3346dab2e60628e1cb545db2e6732712f60f8769a76ef5679b45fee5a6b6fdb3b5da8cfc96d5e7b0d398c7639779e0b98e3ce7b0113b3da525b6c6ac7fcebd53a677b669ff55232d02995c7756f66db66486d74caf657dc6a9812bb2ef366346f66def65d71fb2b8e2278dba2edac028e03a73883a74b7bf516640cdb313f73cd371f2d8fcfd47028a594b6cf777b7777d7eca6d66a31d7b78f6dedfdb9d893010bfd2667ae75980701ec3be7b28fc76398879d67dfa53ae7bcc6b8d57c8b23e6792b96e0f531dcd6374735273850c70d2299524a29a52c6060eda93ddddd7555575547adb5c9a7d36f595a6baf0effe15ecaa22c1d99ff90692ad5d5b3af29db9aa9f12d3a3ec246f9dda41a102c29a56099044ac12f26aa419f46b5ab842b1727071365a7b5a20d55e0d330d748835fb467f292e3b0e22ade39d839e802cb11b3a525c572c444b5937698a8b1c787423e4fb7149eae78a240c955fc8592abf87515b1861b5cf10515378935acb88ad760f292f768008b0e7f41de9ce434e49cb3e0b090356625e463ed1ce4a49054435ad518156ff1fb8698a89e13e682a49a3183a56825cc660b75537873106a183ab2b8bec7fc235886809a3c520dcb11cff262e979c5705b147fbd434c9839514d55c26cb6602f85f83a16da1cf2680309df9e75f65ab7518e9a2b82b3d6cfa897f60064559ef9f209ae4020600d78d3a8de58305bda55c20d043261b61b26aa6f1a6653358a055b0fdb0a361f9b0a361eb61db69a2943f2f64d879a1a73555b0e1b0e1bcd76c394c9bc7d4bc166c3a69a32b7823536e3f6826fdf56bd8092b77359c5411507854412f651280a47607a2c1651112f93d9c2d52b26aa994c5497ee93ef4b846fbf3d9d428ba4f0f24c97f651789b841708378bf03a09af16d32508d3650beb8577a70bef92f062115e26d3e5be6e15d78a7b05c63ecc5768fc2ae16532ef16b3a53171de2d66e6713aafea65c31a7f5f3566dbee76b7bb61988f9baa272622b9aa4df5791879537d530759a3e67cc0b5cfea6d3265586b5af59ed974711ae4d1be48bfc7534f4783c6992ae694a8dbdb8a61d85e0a9439e63878270a648ef90b19b689596da95e2aa7280f2a52b1c11c37f5b990bd908939c41cb5058f9997a23e1d9b9897e226e6cd8cbebb5f5e344ff41e32f552a1f655a4d9367bfbac5b115f51063a651b45f0934e7914d81eb7b12e384fdd4c7dce6c4e5badf552b7f2a8d941c7e17b21bf2066b52595c29e6d6fc74629a59452da02c9d64cefeeeec66ac5a9383fbdd65a2b7ecec7c75aae6ffae65eeca52cc618f35215c3c4cc4bb50ddd076d1b31ce9c13b1678f3107761e8fcec8cfd478eb23ea5133ccd4f8cc676abc155335700d4c1c2dcf74b9e268797e3ad71805b607d71d0da7a2dfd6a9e85d8d9f408db95996b3c954bdfa785557cc3424f4aa5e5a8bf6ab51d4cbe0b853662a8531b3a59d143260b6b4672f8dea03581be2e781bf3a0316a08029037abb0a53267b7b02a60cc8db65a64cc8db11306544de9e63ca8cbc3d06260514a64ce7ed07304001a64c8d99407d993219a9493e4e271640f207c322352f456a7234a09441251f692e0a47905ff3503802d36b62919298d516d04c813a47ef7d12e9a94a0a13c077240a714f5df2073e752f57fa1d758c654fb1fec7f762ecab5e0a49e1acd4459d79c1b980b9f002163331ab2d531e3ced98dfe20d224fb9ec6ba17a837386d4f6d553db3707d2293fbdd4563b4441f7a8dd411aca13ba83e93412499e7ad7c4902682d82672c872cc78ea4be09c071ab85c3f5d2e9c1fe94fd71157901f33d7caa5fad166f7a7eb89253c75fbc4cf53a75038d7c19de0f9267c389193e11cd9734ee4fc7439a15304d7766c0914635c848b7b6fc6451318639c598c31c64584b84d62d0408e008ad284de20c306d6af16b401428821248822a06471c3141a701bd0a10a1510171141a879e949c20b6a504345cd0f46f80c4b041353fc40085608114607821802902ec81f2e40c2c41901c06614a1f75ef0e7de8b8d716b3b3e42b901c98e709778d2e5f800944491cb82174c8cd0c2c6860a1b9d27c8b8019227acf8420739433eea6384626170f8032c6badb59696657e28232da38c9462caba432eebb22eeb7ab6b451385b6ab6cc6c89d912dbf216a02b404743030c31c0916f3f801114ba03a0d0d170bc49be3d8556a3528081a94d61aebf1a8694f50be56e327536a17e6cd626de57086ce8c57d75dd684483060e1c3f5ed60927cc15fafb7ed598bbd32ded4e784a293fde5ff1bebcc834d33eef71064a6e36d733ab1da5e258c30f47f02027c35961e6e8bc2866c4535fe185cc51e2380105155844324ef274d46e721a384e404185b2d6601641da212dbaba42c6979f38983d380897143e7e1e79ea199ba2a790c153cfd9142fc0703897a2025ae42fb28e941f51404822a3a05344876c4521240a203a3701e8c10a32ac580110543d4c307a7e28814209428070850b4465165cec409902c6cea8c80f3a7c411e2903079b2f7274231a5420c99c1024a200c2915072921c854d143ea0900245942372567203051250348142e74754879366a9192ec8a7a2a935fd42e1fba77ffaa77f502ff5488dd95139a979b28272f3ed49698e66f35c6e449dd5965ee5b17093d22deddb4f1279bce526a56c98280d63c54fa5c39d7654bf9eaab5a646a3ee66ad745a3aeb74c16ac56ece59a6994cb525c3f5f2b8b5e67cbda6e657af298f47fbccf4eaa959316f26d3be2b9e7868356c43608c611c87711837a2b05fce8f28fd0e32278e9877d238d738cf44cc396ef36ece397f28a5943686797777d77bf3b5561f1c6b2f86f9bd78b4359ce84970a127f179e26986f73ecffe13c71940ffbc7a3c40ccf3987f18e789fdf39863238f6195e7b11a5e1f436d7d756bc3caad3a26a3611299f8014cfef89442e3c326ab41e6919ff3060f816fb091fa4385c16c69c7434c98fa63a2daebaa513f541ad419d420154895418d41bda930c0373506b7ea0baa0baa4dfd517da82da8ab29136ae19b3aa412f9f6caea0594401924dd1f89b096611bf7795d09b75a1f0265f0492311d6326ce33eaf0b8132481a89701602757f0643fa9fd7719b966125fcaf52c2174aa641d9e4a82bb28ab7c78dc823aa31b91521e7ae620a984cb6ebea68948d46378864db299bb213a0c1c1625d073aa97936d5eda572d6a646bbda8b31edbb58142d121c4e92694da3ac8f4679923cd69ab797a751d8c77e959452ca0256fa90ddddd6db87acb5fa906fadc559fdbdd7d3512b1e274f751ee4acab271ed95f9fe131d7c471061d378864ead34bd16ec6c5faf4aa679838b63843faeb35a5bfa2784348ae354fbd318bc3ce81ae441eed578c6bed6a9dad610d6723af3ade71afadf69a4cb5653ac65ec5f8e2eb94729857bd56eca5ae7787311cd229d739b0052dfb9a6954fbaccfb712c05a0ddf3c27eb3088378864dad5fae528c6a173cea9d771188661d8e9facd1c7b86c2fc524a296dc173b9babbd65aaba5d6da8b4371eec5b4a60663e3e4e1c1c9d6b1c538736d86c7beb9b6913ef31912e9499f8938fcc130adbb21b72cfdec397be6e9bdd331f304d2b3dc1092fdc55187754bbbda8bb14cdbb8cefbc00c0a8946a4928a698565d471c5d374a14e63bad01a26d8982ed4dbaf4e7677b213d31354ce8f277c19a57f2e6945be356e890537db93e4f912454b08f50c045100f9e98a424814514011048a1b286aa050b59252894f55c2a3e46595904a70ae12234a80c04a6e1e6b219c13a1d3d211e26ba84e91a7de2f1a9ac862b8b2c83f5d4a6af0a60521ff2087919ff8b9614736b94b8a1f5140c05ac9074aac56d05282111d6e78f8026767065d1cc1a601180f301b52b8d94f8e1c11e0a1073ea4944f70d1a447ab872a8cc0c5164474e881080e53e5f091c34796a31bd1a8024fc93b19fbe97a624890279e48c1530f38a1435f723891836198cdd18d68389104a7dc8f19272391ade684cf8f2820bc7263d70f4ad70f543e860d2532f604851e644cc7081927b141451eb30d2c728dc95896655996614e46ce26a73f5d4ef8f8d34f9713367022c88fa8ab83cfc067e0331001d682b33e27a5606759db99a26ee7ec212b4cb197bd35b364b83a4b86e7aaf15908f25c350614f25ca0d2824aebee23a8d44a2d4aa36cf33c75dc3b184fef3cf58c76d75a33abdd0d73f66e98c3baccc3baccd3be0dcc36e7da346bdf0672b90359ea5cee405ee8138dec68549b8ebad090234f5d64242779eaa4d6db9f28527ea2344dab4a578e8e2b67e745d21b6a4383d01b6a438750165df593ea339f442935904385a7d75af12545bbabbdb736bd5dedc517e3da1477f662acc358a6659a569b6a58a6691bd775b569c7751bd775de0782b52938f381331914028542b56948c54b894c2b5e8ac4722a9d4eb5e9a9037933d443dd0c455e8afeec44de0cfd19924aa452a9362d65df898776c595ec3bcdf0d6338c69fd4618424fa75bda3d97e76a54ebb8406548d530e305955140a0db793aacadb5ba19b9d62ca5f265a33a8ac7237c2b6a3fa50ee4b940656dc1c4124b2bcbae9c2e6dc99c8ee91d9a4a23454a942850a07435abbe215b38a19e504fa827d413ea09f5b068666838c8b6a0657cbb46c94de7dbb366c6b7831a0ebe9d665b90ae174f8f0f49922449ae56abd5cad4d5e856b215a6040ea395647495adbefdc394f8f6150c87419faee80d65b57048922449f24f346ad430c1041b363cb461589b86a6c742be7728367bb0107c77a8fb64659e3f2695a344658d79c94651292a4751292abf47a3d168341a8da85371a4f238f8588b80c797b7e2c561c4aa312f9545b65c382f72f2b8be9db3d1955e658d5851893e32f57145f5bdf2ba00111de4255a6e030ec03852861050e429f219998a335e39cff2d3f5d2e2b5635bb4a7ebaa3669cb4b59a20f799c2fd107d18731908004243c37f6e8a9ab264bca9aaf90860781518d134b7f23094c605931d56f2c810d934a8964bfd1044e1a8942a0fb8d3584a00c7e5e87bff10422f68d2878ee86987dd4ad0f68d053b3d4156bbae20d21d98a5374524f9a37f509b094a48a53af3d53a6e494f499c857e73aef03332894f978b5b03d4403872722627c755aca62d0f07c04e57cf55601e59c3e1f433fbe7a35fd6001ddae8484b092fde42ce1751ae128426202f9c8b1b01a9e7d8d6b43e9698423c75279eaa2ed355d469b6aba3894cd49ce124e20a4ace9427d25a4e574a16e0a9b0c6b29ac3da3d7b855f1d543218802f1148cb195186b0bc6cac553e7bada96865d063a450b39d66bca681ac7faea1c8b623b3ad10d0a8e8a9e1249e3b2bc36542e7aa60ba5710a593a5cc15d87269567e93a2c3d9216af6ab3816aca785ec5e95e8d9fceb5603bb15e1bbed674a9b5822a2ff2381abda68ce735f3c290e6234bc9c29a2e95c47a9f3cb294acaf6e833565ae872c2315e9bb703e076e2ce5b300f1d547af4d355a24a4ab9a2e36386a6bb88963b4346cabe9a9a759baae34d9d654f655f9a6acd69429fd0d21d98e747a8bf4d3b696781581820a3347c7b628d67aea2b948de3041454a83d2f1c8cda4d250d1caf9b17cdaad6e04893768810e5156284b27010af9b97cdeb45f34a0115673c6582f32ebae8a191a9f0e247540cf6d9f4b39f5131a62dd5c3246e0b63e7aab574ce7befbdd3f68b55826402094f7664934fb133451354ec8c2a067d9d3d35ad8289aa5e6d98305dd3a8eab471a4b4a21881c27a526bfc05726faecff5b93ed7e7fa5c9f86b9ab4655980baade2a9830d88f89aa5eb155a3aa57eca6b654cfb29c4d26c76ebe8e4d86e00583dc55c38031f894782cefa6f3a9822564e4fa843a0495d88fd0106cd5302120b01b8cb4c170b016c6baa28781afe8d1ce078817e46f1ac68bc1eca0d8ac3c1f1e0d567552ba283e350614a55baa83a49434efe36b0dd97cada1205f7dc4abaf232682dc8a6c43f066ba549faeede62b1699faf55235deb6a60bad235697c38dfd7dbb6ba8835cbd7a33a8a7f6b648c599ed7fdf9e0e19aeb70c2c2a95eaa748037512fe10d869edd7e28987edc05317fa07d7026ba145596aa1850c740a0e4e9c3869e7bada7aadc5f75e8c31c63c79ece6294b92e4c994056d663709f77a8d9ac5128548105dadf29c3de0f7d39d49bf1ac61b6778bbd364e2a0b7a3f1d4de98515bdc19ebc62e8f4cd85e7b2faeb35e4e4775ec45a0c75faee3e8b598184edb2ded214d1e47188b79bb945e4f47d5aa9d3276ba509f3fadd665de0c27ea6cc3d846cdec8722e4313f3182270911458cd16a653332933cc50b68b49fae2978b0c4cd76d0830d4d58af2692d0c14a0a1e2834410871fd644ba8347a0425c0780ccbd18d6848e1f326fc48c1bd68b3baaca4a5ab3b7b4e3c7a7c082587507208254f2a9e785c289c8ab6adf6dadbd55e8c590cab4db19f288dead14af9c9c2f1d25c95bd1663d766561bad2b47c7a585a3dd79615866b5ed5a8ee39ce3c2d1de589b20f6860b473bc4b238aeb3de772de8f3048a4f947245969f6bcdb783687ca4688fd5e6db477545b224526d4aeac68a83c4b7374ea39afee65cedba70ac39df9bd79eb658e33c30342aad9cc211c8a23a73026548c7bcc4f491248dc44bce8bce4f6f168dd2311a90d2d334eda3a76dbaa4391d43339dbc6372f2507e663e9dda740c25491a84a443487a844cc2818ea119941cc52485e6a7d395061a06bb13df31e9e499334f701c28744cb36acbd65dd7755de763967dcc6fa2d5b63850063faf721a89cc2149921cad6c56abd54a547b425babd56aa954342a954a7542179aa081d943aebaaeebbaeee5e5f52f2f5cedd1c0cf1b6995139139642539920cad1a06bb57392d0375ad564dd26ab55a2d9700e008454f57abd56a45721cc7719c06401fb3cf9b3dddeca9b347ababccc1cfeb2a28d332994392a44682dcca66b55aad56f549eda93db5a7f60c40002da1a7244992a4a6699aa6ad56abd52a6b12f3ba0a6265a69139244992e4ca66b55aad560470013d2d4b5496655996596badb594f4c8ce49122bb17b5de54ef80f67762373489224c9978e009dbf32abb2582c3104f6c71b4b8eb0ddda61851d988d1fe4d1b40406347687c95161fcf89279413f278d2da99914965be21ef174090604902cd396c0e0290ba836060e1c3539d4971c2f4b5435dd8d301b3e59dce9e2061c3c582d4737a2b1a4871f7190988725354fb39fae25aa9d72c7e7a9dde9e26f18e286bac28e9d2076d8f161b5e3230793c9513b48ec60b1a3f3e30ba662a2c3c4c94f9186a63e0130bb2e634f87b5b6da1a765d96cdd634aaddef0a40076d14f574c840cf58c294a7c13a7d0f0224cdd381b9e6cd08c0c6b6d5cd7ed7376f46006f730d4d782c9ca8b79e8559b734c67076457bfa1b70b34f08f180826cd03318f2d38585cd8ff627162df8eca70b8b1d96b0b0a05962c6929fa74170e18f2c9ad45a6ba59d4558c3a44958c3e40a293f809fae2b74ac73190bbd8f6f08c9d745c0fa713a193de0c411ea90e9b3409fbeae5059515a31e4b916a86bf44355e4252fad38c947a6cf3bee0b3de742907a6785cd77ae62054d1551be7a6653858faf6e6b05c53106d0b1d742e7dfe7dce7a07f0e3a97dd0b47904f7fc08a7b5f987d7a12a0bfe29f7fceb965c1f3cebfcfb1c702e7e009e49d389e5274ca679f0f8ae30924ced0299fc5712cc1eb3b9f5f82d783fe8d20c7d9afb783fe8a7be20d21b91363b82dac78166158714f8441c53b5fa141610cb7357e2bce892a3edd14560f02d43b6f8f878a681b55124792381b3572dba8110b221644beb9281c51f01be8f5376761fcbcd3c073f5371646d03f91389ee037dfc2fe0df44fe4c4f13a0df5b7d136aa739086fa2131e437248ef437071d1447ee86a083f537bf34d0df5259a8433e41803ee8f441ef4418bcc5130fea9d6fcf5d81c49ff0d375c5ea61e05c730e9c9c6b8e01ea9aab8a27af3997c5b1c767d00d21f973d0f7859e77a13602faa05b8f473fe8d4830075d03571e41cf4f0736e7a29eaa56698bd769ec571850a768e7d0e869e8fb7f59eff27c2c0b9c7899acf2ccc8f4dc7e15882d755fd08e8536ffdbcd14385764d300cc330cc4443b3d75e7bad268a59b7439e9f3141cab21b8eb505f2b11ea1c106a71a64ac3663f561c3c74a6364c5555ec41b0e58a1e4a18fd9bbf852636e8815479cb5c5d5a886a951649909e298bf86389a6888a39fc4111586d5c35a71ea2b8a0953af98289c107fbd62c294bcbd32993059cc52c94f278ad1136dd4fd59db7e7d555a4b61fdfa2a85fdf5550ae95726738ba9c29c0518f3f7f40214a042c839fc9dbc540ab13f89932524f94a4822f98aaba890482a24d139daed704dd7744d97f60aeb4e58795642ccba21977cf370e4a2f69530f4e10d9eaf84209c95307f7843067d25043fbc218f936725fc3ebc21937cac2a9ebd8a38cef02aeebd29541167a34ae2d83f4fba3e0aabdfb18ef1b22ddb73579764bd86c4505b2422890f5f2b7e99d060123e30da6f0ba068505f1d85ec91e0abd2cf1eda44dbb66ddbb665079d037bc8f4b3afd0f9eb4421954ad698d9e226e6903ead478604b1f1684caefd23baa8a703243f67d9d489a329d7fae36aa9bce695ac64252b59c9b192df9d268237de833ce2b29c321a119fdd120443742bb9896364e9f9c61c3b46223f0b7d9041505b8f9dcb32bfe10cf6ccbfef8e3dfe9ac0c85f1f4d50e4afc86d610b8234aa37d6b753a7e276335db24bd62ccb7992a38d1f2f09eab297bd2ff5087ce674ace1f55916b36d87f742101921a045c03d9e0de62b7416e25093dfdcf24c19ea9b4f236ce45b263f5e721a81d4a4d42ac27b4a664b7b1564138f0b9f6f1f33d173b1208fdb0d88d4a4556a99f05404fdacf2187ad571bb09bdbeddbb4e93f9c87de4af387a363f7f7ddc6eb2d83f8daaadbf1d4b0f57440d3549ed61737b2061c88f5d17827005397284ab2ccb810347c8026b719ca00c1e96305132410636c48f246ed073b3844a0545f4102288223c41c511677c814397bca818c3e60a22a89081103d7e40224508248030c2135ed01d8061848f3194c0c2228732565edfded16a6fbd18b35e8a647d5a8c65dac5e5c5326dc3a21566ad889c9e86691bd7919ef5bcdad46b655a4729a5745a4a31d634158d8f6fef6a5436dffead1ad556d5a8f6164e1224705a39642b45fa8b613ea12750423e34d43343514265a887ae6e6c82dcac86b05622972847a4237289482bda11bd44a21f51149114d18fa8a451894a3b6977add6729ac53495cefbaed309173fbdf6d0215af073a365b4123fbdc929a3b51230ca2993dd00f1139b26242a4250f951ca218941223262e27d3b562d154d48be1dfba822846fbf55e5c777e66329e7dbed4612a392887c7be3976cc4e4dbb32c6793a95fad56abd56aa9542a954a9541a1906844c2308d892d8d47f29d85907f80399f181f91cb350b84240b21fff876dc9f181f91661969e1902e922449925cb55aad56ab452a4d152f451f9b56ecca4a6dba82e7db67e2d57447705e7040ec567a4cbebd7a35dfdedd11dfce79c101297f5ad5019cb7a8a42db606390c11d10c0010245316000028180e0984424112c3619a26d30314000b6d8044645e389709a3a12889811cc318c38c21c0100000010246866caa50009203f840a43a2e5418d123764ebb2ed6133b44e4069e1ecb4d2cbcba1a98c13213f2d0e1e0a4123c8e7cb7e613c036657988f5ee3b0d9168dc801884fca1092d6a72a36b5111cab34c8c28981c3045eadb07cde1631d62a5daaccca6b24ccd55816d8ecd38ca29e9dc089b303d23423224c1f244f561049e8874fbdddff2671c78b284b1b9ed0e6e568d40fa113d670a5720f76ebf4a6a741395806438a8576435e8324b4ae8c8669612035684eb75f86cb3d1b159a4240e2e219e5f5bccfe183c4cee0bdaa8354a817c93398b8aaf6d7da078a492d42150342a4e7203d425bc44d235ca20060220a00375d1aa854340bb8aa125345c7c75f5dd3af9a95edee625e085ac966e8c4d61f4ea826f1b11979b9e502a653999f704b1f0a76bf63b38e77f822c81ae263050674ac830240b4360281421ddfb736d0cb6c53a46936df812caff7b4f3da30bd5d4e628e062eecf20a5eac19555ac46d697b82d2d2890a2dcd0c85f5e3947016f587a0eb46b36583b3e5c86bb39efdf3f69c99d971e329b8c29f8d8feb77f31c2cdd3bccef42fb904333d69d94132af247da393586567246a869bce14bf4015dc72f367b32f6f29a5c54b4c847b9b8e14d38440ac6c87e0f70d3877930a260be9727e4397d7953912694d013a3e6f9f371426088b5f411200bdeb0287d130f6f0869952f5126bae5e2a9cd64b5eb0b041212ad6bf1a82e427e45acf2e019761d895363f4262980d7fbee1fb1e2d5554134d239244636187c04cbf583b858d67a1085e3df07b018f4308e8188c8672f88e8bab6f1c038cb3ad924efda414a328a2ae83ea17dae5441110953073375dd08f8235e1c0e8b59acab5957966c28b7a7c98316b8b4a0a66980db2f9f18f322c9f3d9beaa76c428fc38d5531da4fc6b051caca152b9bba39938c06f5eeeb74f09d20348cffe5e78b37201328f41f40330b7ce82f50cc223d32fb7f60dcc0b50595e034591822090afb4c660a7842c83ae618fa1234d32960ee50628c4bcdd0393672f43f013ec8461b248b579cb4cc3da8f055fea791d117f4421decb11d53227695da80cac8c10c67244e1046e87efdd48304a49020f3b2ae7ab51c45e5443dc177b0f1050490ef10404b182f77abd30b8c6d92302bbff33f76c703c073dd1350ed34c7e635ea9602fa2ea537c4b1f387aa087e38df2b1c9352f4971cf5b0e40504444cc7c1d112ffae17de1665b2a07ec1ed4452ca5f32067a11f5ee6689cf98ac43daec4fe1a4a0573e28dcd40bb8b6080a728e1ab5641d64bba34895ce6d9542c7e62f080df78d1c30f5bc30d9957785aa091d81b679569226e6464f5e5f6930625e35d8073a7381f72657c547d6d6957b8a86a02625ccad4184064c17e72d2a7d93a12839ac2507aae8948a12b674c6ae9af30a974d06a01a98e946e99eb349af08fd9a8092e0ab6edb11c695218f683ff547b9c542e21d8aae32116973aa83bbbd896ae671452a2380280e371a37fdd5359ed664d0535df89f16abd28ce5ed8ce594c54e706a942f10de3ae421a26828fa0a236a39dd0fdffaf0066bcc0d9cf787417c13be5e0afa90ddec76a33953f911b703af8b272ade478d53e9365d2eaa442fad3469c07cd159ac8273b77d66641fdd112c4edeb9402527ab8fb708925fb8746d6688ca5396a8a4615b711bdbb0617525a683a2dc26f4b28d2433b4d0206a9a1c991b16ba8461768f9946c58f8b64ddea956564347e2ee9146162049abe528e154587967fc5dd90d6563e810418b12cbcd7faf268897a2091f5311c30dd00bc5be818af3f1ad943940c47ed31ad5089a9b97f52b8bfd40359a89cfd91bb91b3a8e306341854762d412cc30bee39f1da03c39fc041a325149ebb20853af3ef839e8a04fb99edd3a44e91d1928ef3f80b5ec7aa1a273fa960349b52c1674a43c9ff43fc5e39ce2edc44347faa1b61845924a4c0d18890d2670294a10e1f8015a33bc7dd20acc446d6e8d989ce4c2c7794d2eeca2838001f8b1e87f8bba56e929be94db202df243f0faf076d54ec71c70ff7e2a8c7095a5e11d6d07fcbab06d562076828dc0fa236a4265f40c2ff5732438193cc2c649819ff43b2ad94d2a576c51d26f032618cecf2d0eb51b064294ead26c4da83af18436e7910c442d6da530ed698f6887c518bd929424989b4dad1c9c4c1fec45820224e1b7168dc810a0d23504000693c321d9eb8943e73f0e52d02f9509b88cdff7326e034b5814cbe89bbb77c96d834b209f81bc50298f14d2b249779b2dea154469364b36624556b8293e0f342dde97fac0fdfefad666d78b885a8d25a7ad0b5a90e794f2c41f4a732f005e120098f3587621b127ff0daa69a930fab2606c4adb08958ee32c8a029c51f0d6ec53c55ca3b7731966ee2da938e4ca1935602b8b9fe4e349fe4fad048a07341a1842361c6db9dbb1e93490a0c77d9285e01f40b9d1f20ad041697467c099325c102d5a25d5b100bf3f4738a400638c18cb90b1eaa62eb4b60e209f843daad01a21bf7f6501ae4e8213061644fb4beed44db704fa9dfb124c69650d89a1a5ec4bb06b993eaf99764cb58b045c484c3d84706d03e02998a56d448987f4045358d2c1085f764512d222e26cd4c97e7c758592532825aa8203bc48786b0c6f093d186d2700aeb06d2e3a524a42ab11d3f810f7998ea5b0e92cd3b2241135754025fc74309000acce0d7737d5cb7884c3e779689647ae97c781eccabeb8f0ca3da243e70b3cfaaae87d1604a2972524a6f269795844a3ada47bd9f60d511e2b8c56cc0d94ff322e352eb640d072b17db1d8c43145656a9cf0f83d6f9e5ef8530404c3535b5f72b5c0281e17e2625a3aaad1e51eb81874b58407221a8547c8701178f5779927416d4c60da5019cd6ed397d4253a2749c4b5d306d372526301cb03871a12d955354f81163753d4a352ee3fd1ad53876a9214335b9b0dda1c10b2ffe10b10a6be79af58dd5c8da9c535948970e2f48771025421ae691e2b0847ebf2548cd9fd9205e633613bee968f475665b76288d9a51cd817d72671660944bb2e21565fb3dfe23ea6912821445f9904a0b7a2697f844f0cfa160ce3d79aaec2eb03b2b9d026412da0290fcc6585c5f0fa280b13d0729befcc39fa97984f223cbab062ad812eb963d3b8b41c39f19b4bea3f92e20195abe7720c1298be58da6081df3da9aac6c05341dd3c8d359f0dc14dc1347e96d0cee4bf6b19c27b9b82294d0a2cac3230685063707860a93975ba1e9712d15495d1a8f3a6516dde3f8a87465529349cf97ec8c93be7728a0a54495684718ec99982d4d8fdf980cd0d462186290d2b9164eeb126390f73bb1bb6e98507871d39369183ccc92cd88b96de6a2d72e80a04bb830e058fcb2da0433309c8fe10c96e0ca14079a5e7eb2a12ce1365264c3b5a91fe2f58bf9dab035d18256f0291e3b4fe7c59897067f79cc14a18837fcd582d14a2ef22346824b22379f26dfeaa4086461e82bb72aa888c80369cda88fb79a5caa83a590d545052b9273558672a61973f178bcc9f7f7044d673a8935d373dc48bafe362193e56d1b7432fae1a0b90d2404d7638d224561911d59b1ce53cb8464ed61d1034307d51e0e650c2deab49fb6242535f3c7cc4af33e1e8aca2f7d5bd6a6558a4616e436f1c8a1e01a6a721d456a3157e597f824a3b864f591c4b8bdb7ad2f53497aef0d113a0f0a8d4eab27731ebc51571dc62c7bd2c4ad18e607b3da2d6601341e487e047605231075f22e76c28315aeb86ba18a636abcefe41ef028d2409c438c96e0bd055ed545ee709ad6da97967cc01052d199ec00639d85c8b4b7f1c06af27536a5992ae33553cfaf6a08e2e9f0e0397a93217397076f273a873befc11b9aacc304ed1c909822ad5e1fd9b85ef120cf01156c5fff2318237811ac507aaae086f1fa1dc102e20f11a58c143bee8cd52d5d777a920420bd105f0bce75196d66074fe95a5558801c58dd9245b7252209b280cae0fbb59b74d31f622d34e4fd0247a6e86e55681203489e49b25bc4c1860a7f7a7dbda1282ef3607d909bf52d5d18e35dc18c5ac762beca6fb55486de05298c23a1bf4514b01dd4617fda19c6dba4298c84b76e0ddd022abf2f39b2bac505637e78626f0dc6aff58533e5933684c3e50416d032818a5899158264fd4c0f8b8548195ed0621bd3b9adca51447f3fb688f6072bd5ac6f4116d418da63b0de90a21b5f8d8c0259e2687adf9d224e85466d8033f469c030a60fe05132e06650c14a0938342d71047a035369057571421dacd888c3899bf878ba672b12f8966ee4b281f6f711eff2330ce51a76020fce52438e07e96feddee56b81f596d05827d1397138df4b403cd26368c5050832a0d5f2ebde7ee567d66b982b95539de4792386072f60cd25f4a1c68e62ca89f37b3b8f2ea2bb08d7eb0697ff38c98895b14ed48c28b8a2bfa78b1632d0b2a678824d4f7c1aa13ee29d3d4059a9905b890986ea3077cabe26ae22bf4e4198b8b75b33684616d1bddf20a86a93bb89909792104d98880608a955fd7c114da7d16c49994664065281ae3f1d1fdd77add20e97b72a819e8688018f58ef03e2e100bd69a892f6c66a942e954bd20818b3c3a82ecfb74d80ed9aa3070544ec53228a272e95b960b2ce14b71bcc6215a78e8211f3b71609e86f6a0628e64acfef37fda23907c8699de4e4548a55ee18659a7a810598a8b279a21e883a731a636c24b82ed42d9b697d1c92d07e2f10923a7ef0e0775884c850af59c82f3923c69d063e47d43ca0a10ffe9ea348320521db4173227069c8a34db2d6229f08d2373d0de4ce1af1d4c50a8650e5ec2a8937ac26f42aa410d6a409a8ffd546ad09a3c62ed3c4d3596c8bba4047237f4ebc8ec52665038d981b176226759c5f14b8b91510db9ed87a629393fa5eb79eb4ce97495264f677158c401ef1040fd5f9993a6570ed00d285f022ab282a136352317a445cb46a18925a5129711746a85bc940b9a6a2acc6f3e646f67ea527ce2e3f717f23b9223ab7c1c1610778f2a8504139af8a6c609efa218b4c4f72b260ff34012dc959657b81aa83f70d4ede39307999e473a9b74657a28b41d36aded93ab09f9a97c4987a3ba1a2d23130b3ae03e20d83564ae849d54c2e0490da92838528547cb37987c244b40a4e3af171bcd844068cdb2785efc1e492f3446b3d05d3b7938480af95e0741f0d63cd19a2db471b523460549cc0649c6e0d890b74c9ea5b847d373ef0f1ff7802b9ac4013a00abde28350ce364c9679dc9b91a78d94ab1eea988420733ffc80b4ebf74e0cb700c6a9a7626f7f10a23f0a4da181c7c6a06e22f5308356677e7b226da73b99456ceb829824fa663ac0b928768d0e2aa55f164e3beec43bd09ccb9d82b8c67298d978f4707c0461580f2384ba8530e6be65a05b5f1f8e91ffc1be2dfbe9f0703752b5175b747aae90f429360a3d2056632e33c9a0dd3a75cb810da755bd87ad1cf947e0599726ea2ea4104c03cdb2fc7203cfe8ab909c87a4acfe1808b16990fd049a8addc1bc96fae0dacbe4fdf57a52ad4753baa7c3069ff85af02c0f4af7a3abc7eac5006814a4430c794a76e4a6afbd64ef258bf4c6e084319c3ff01a898106d93bb264ce6f24718792823011f6e7f6c678580b80c4b3a4cb81254f1396d71778e6101e85d40d045493367e6487efad55d3c3f8606567198209cd30c4ff16641f030cd9b1678bf1139d1136750fd9214e2afa815a0b900f8b292a84ced49da7194ae9fea5cde6ec9a131dd21910978936ffc60b0ace15f2f0242acc776f99d2042348ce66e9f9dc969275fa3966d5c30132ac1aebe3445ae2a90bd019038c2a0f04e538741a03b476795c50f6688b9631251fbf76add1f2e3074197d1a5b79f78e66f7e3843a6cbc59ff2be5e82e1e2b0fef131691a2d831070494d0325770b3319a4d434edbc709088fe6827e4416d82927d1a7f40691a08385dbb323d15f43ac99d249c11d41bfa63a6f6799fa57d9aef2d56793c26ba01ef8b678ed1f6ee6d09649d770eae1d60d97248996e37b99431dd1954866ed9d2594b8f7cb8f7faa809abc47ec4a12f780a8119cdf4843ec07435c71da99b03df07ae2fdbb7f9b01119445f69bdd4b126c65e0fcc7fc816152b3ec5cd04e7e66cd1c8441b1fd2b1e8f278a45c1fce5d1e8def1f6d4c735cfc6cab643b46d9e7711ab7d998b8299c320daec0a3c80282c926fd1c0225d1c8c5b7cd846236c3da5c98de9d60e36886b0f436adc73ea7e73e262ae4bc2884812e012fcef6588dd2cef5a745883372c36a955e50bb47be2b394912f9c553efc58208ebd2c1aefe3d4f99fbb4fca6aebfa3345c61baa7aca577ca3079c11daf4aa8c4bc6c9556d70c91cb522657d174c69919ff9e2fca264625de7e8e8a35c8f008e38b39355a3fc78ee4104425ba63f19229528ea0e9a993ad943e47a333a51c6a9a8661f20138ea7faf3e9957e597544aaa48b25060ac0cff5233d98e53d2b556240d98a8a0c3612136f97ab801f7e12d8761202349164ea670e5dc3c636d75f383a18c3d3c1cbecb45d2854528a7b38681b13cc8860c9e5fc9e0bb327acb1d06a9770b9cfac7064aee223e40b7be194cfafd889023cfc68d46ba38e54105af548e96a5fc9c8ae92fa22176af23e3eb96d9f4323aa3d0a238cc7cc6604650fd5d82c2a42728ea522e60fad4036f1280114cba0a3a95c11a61763f0de6a6b1aa48b0fd9126f59da027f9c59549d5a4900c1a82be9a88b0d708037f70f33b9465a2b6a716300aa2933ea45cc95d8a00e99ec2257b1072da5187ab53b00e3b5fc5b4397fb4344a73bf85c586ded7989b8481f76fed966453347cb1fd61def8e68dd0ba9da0218fe656d6013a6e44d479b98470e0fbbacbd76871cfb04bdb081c63befda622cd6f5e5ef302e88ad9b6ca32c3b68766945603bb52de5ed9f60106679f395752f7dc0d0cdb0d855b4cd902027548ba3bfcbd4e402d9969fab6852cea2e382ab6f370c8cca416743fe7cd9367cad0f6b54c79086f01c1b61554d0d052bfa956e132ee0aee524842a77182050d42cfb510d84410c156774f3e2888608f4aa9980b91e4e202b3f2535e96a9c5890be5b40935f79a03334ee6c8ad3f6e97d5cf4df45926d2486b2badbd1a321da44cb45534fa2c23057df5bf6018c3fa53c789f16a18d6dd1288865498e034086bd0a03e4d3d53b1a07a730f10d7d445b30150fa7e8337bd7549d2c0267f260d490d2aee7542a8ba508e301715074508fc39b03d7083bdc9ac5d998242296f4e1d2169c5a1087459ba358524a905172e4f95abbcd35a30f5af797b9110e7af27221862703e419e3218f770f5f22eb058c8921b4b00447c9d9d0809181c65a9e9097411f50a4e184a0b9207891e04d20123db8e68b1da0cb59c1c50ce909835e7a188372c4bd1298468af08264661095c014d83dadfef47e18747334ce98a9d593aa1953512ba9605b87f1d9ec309483e49a3d121daed70358496877228655fc5b96d1ef5c469fd0c610ef613fb72cbfcf85ee30405ceb1a097731bb66f0f65c051a44a19981bc9069d0f4b9cbf067d04301d442c0e4a35d60c239d8d9964149a3e541c754b669699734b843cebdccfacef3af0cbfe01ce850c1a3dd266829b4d2397d5a055b3b12104d7663cd08c30c3a3cc8beca5785de40856d8fc5c15e1195586621d844fe37431ce37860842af9989131492c8d31c640f7dce08934512051dfe13f3aa86c8c594d76725d71074f2bb3d7e4bb0944cb626b9a74773d69412a10bbde34027c80cce79ef39ae82d84b4ce47e3f867c10e74c8c426d9870670e5378b4e0e8d6044de6bd49f0672f36aab5cf1819524e255f1a4c0b9b3f7af370130457d93f6dd65c0eaf19bdc47e211b3c4e8c3267a5dc0968fb87969aa2d7ae45882b0ac60824f49cf12d57d628de8bc5ed011280350e5b64ac34fe39e1322d3ca7e7ea13f0027cc353a9c2f24916417935010309532cb7ebdd217a43d59405d9f00f0c11684a5e993d982b32b2c98d1c84ddc4959de286fa93f41bc04f8d16c3142bfbf0d0684ed7a6efeb0cd99981214861f761f269843c2f3c1d60d823da378c0b312cf5aabedef1ac125b0272cb6b8b1bf045daf52a68d894d5079c4e6e85621d5208f566810acf4b7be63eccba472111328932dcc2529a967b2956340affff93c8475741bf9785ee2cfc95383cbfb558d351bb7a70cec0ff8008d8ab5401788dc95f5a2b9cba486c32ff8ae013b7dac5de583a3e412a420a6ce39b50180db4ab970fbc72321790572f43f5c5aaff153548cd6ed9a41529670d6015629497fdf9bcc22c591aa9bcb1362e848eb4cb6b610f23828ee15aa368510fe9cc4cbbc3350ddcc6a939404e03ec5937b89e0b4040c8d1df7c408689176ac3ee42669481ddbbc637bfaa60c8a7af05e292aeaba0a7bf81e3b1fe03496d2e0639abdec92af16b8a592845d3e3bb178ca292909a59ff07b62868051fe9c022a88e08219357a8a1d449e92ba4e9af7997b883cc125af9203a47a624c7431d1a06da226eaddfc0740ecb79a0eb6cb342c06f56936d4654ee8466334271ddb525a0843768e881b367c8887eae56389cc557b166f5e5e3930062dac789c60c9865da3eeae38d0ca98bc6462472c8e02ce41db880089a13411ec88dbf6b9d135bcddca30fc881cc8216287d6c908657268706ff536976aba4f1b9ab6b41a39db0969960786063f509cb0f9f4e12a87327a6d4f8402de3995192327fc8bbe5d91894cb56f940626c91cd936ccb6fc59e8fff1f65f7cc7217e880d9bcdfdf95ae2a6f6a60efe99115d7ffabbc8e0096a747f5c8a06480f9ee87eb04115a49f38f030135de04246d0f461ffdb5ac0440b6fc648232b11d5d34053e417a9cae4e613e3241bcf054dd36b201e06dd4e11a449067ff55743becc50deb2190b0cd413cc0cc53359ac991039def6833fa72bb4b45448dd4db94e14c20eed35545831e8d00234f036f54bd9351b76419c09b502e204bbc5dcc3ec1e061a906df13d003098857f8db7c6d0c6fd0c98ce176fd57e8d265cc38c2f8308f73dd92e48a509f9cf69630ebdd2d660458a032c275e2bb30d4ae097cb2c79e03d9b6c566e8804ff6a123cb540f6271ad2f08fe0249f40340d5a96edab7720bb6b0c0d0215bc79256eeb11a2e55df4d967b2fd730af666fa054eac26fe6cd2c8835b362684e9589377a42ab86935e8251a6a9dfb7319554ebfe176a0dc6832fe5081475d631ec44449de385a7d8b4d7581bd389d64112ca6912e28308969dfe59ef37422eec345199cfa565016ad5960f071fad8c322be3d651f94d40ffb9b4834017cbb352400fa5e63d9033bf075526f7522fd1c827fa58c2916e33d26a2b08f70d06bf86d51be1f2c386001c383b07fbdec6da28dba57a8fa8debee6302a7b586029cf84278b602b94f426d6f9bb7d68cd2d211cba297d71101fdba9f2ddf06e063ece03353d9d86ee4a967bf613f12888039a01ad151ecacb02f98a93a138ce646a03c4d62c15bc47d9e6d7c788f6a61ac1366346d8ae423276979bcb6571caf4feda95a714a01893a0dddc095ff45fcff9ef21accf42ff12ffc49446d0d519a8386235a0ef83b07fe84fb47359177fab0efb95dd4c61d9ed8a634bc35ca753eaa0d1851af5f310528ad1a9278a94de7ae9069faddaa0d1e2c36bcb8334effc39d0b6084dec32cf59c1fa4e47a16d7e29a4b625f6891f17d5dae01d850cf655873f2e74e7e02cb88054423fab0385ab3dead6759c856962dbef6b33214f2a1113563d419624e07bedf5af1fb76c7ed67b4cce188000cf299073de4a07e52c0e85bbf3b80ea027891117a9fca202b85f9438c74b77ac4eea0fef130ca558e3cf07fbd09dc4518a9c7f816732c17b0c25a3bdcc791143685426409b23a106428d56d93e237165c00cc624fda8c9239dd4440b81f6ef2d6c88e089f6f15006924ca45355c58bce1d584733a9d38416259d1578598b2294097da3401088c7fd0290fab20edd36a62bcb3d61c8679982af51baebed844b885291960e12c760eb50d5929ee8be64a61ba5c7e01031bb4f022e03f7524c93f49a3e34c001759963744349335eff76b2fecc10dee58290040541c5ea20f7b180c9637e891563d3e0c861ee4895e06742e94d65c47c4395539d6cf9aca3f2215808db36d6e1d241e960c2c1868a53ea63ed868461745e9ba9ea0ee969ca7ad8507c20c51110c4fc56dce05f2a42f89f9a6ffc1e92b98535268d15104d22496f384a1c01dc2292eb918061069a847d6569dd33aa3aa24a27bd949b0d8700e225953e30eee338cadfad19efdecf6b57c00bc877f4b6d8fcb60dd0b4f0c22614580c6635c8415205acbf1488a2f1617f3a99804f7f5bda7cf93dbfced85ce114a2cda35d5b6f4312d6ae7d3555c26d77bb291a8d5d66383cdc2a5d482adfa04ead337fcde43e6c55b71d3539704a4b0e6c7b0697d18e94173ee1849506e989de8a0604124039ab1ee117a41951c7c7aeb019df7edbae6d9c00dba6ba858948e45f3fbcb19f4f76c66077b7bfe5ea11704d18d1ad308ef535e8ed076e6302d94eeacac1b2525fe8160dd6112fa6d15ab2819fbedfa3b6b80d0a81cf62d42bdb009d1f448f0173747416ada8c8500a60bf56ec71d8fbb2fb36442ad8d22e3e3462469a999dfe6ba92529376ef2eab2c1a980b58d6894852b69c6da3a01589ce9fdea3d54c9c6f3913fbfdf030ee116877f4287fa1d35c1143f6aa2d80198de6b559e094283941851a9ff520fe0c3bf93a3c991298f353da362e0c338ec70feb32bbc6c0a0caa04a6301710d846d0c946872423f31cf84b730ae468ea220d64b382e4a5ad92db104cb2fdd8c5060b30bff06a5eaada4749d2ce4ef01ddc9233f9cfe264bd929c9dd0d15368ca5756642a95d836583b96323af0f52042012d0505b19c2a4c35300a621811738d80624441601cf879c0650e3dc60f478578361fd6311ce7ba876d09f1cc2ac903e965ae6fe4e64cae7aee264c2dfbeec899896a9563db045b2c9b9ec4eb9a50008e6b746cfe20c965612d204cae8b75c21a6ab5eccb16b55cd5bacd8fa84c0cb9568844fdae312567a2783a17b21b1c76df14923d80aa8759993ecc35ca1e768a425bb1ba121389c0b6a61d618d6c34a02a900855db77b3ca86c624d2f99f51a349dee4505440b583f3549dea426cc1e3581f1833560e5180d1e068e69ddd3a421253fdd19c4a320d63643f1778152d42b60022b8489da49d781a20631009622298fa41ec04e0da42cb4e1bb016e5c48fb39290fd90e4e44076a0f73281933c80ca48627eb93d2602c6d46c29bdd8d3a6737390062ff315033e342a24947c597fb42e68319970a85da0d837b4ec8075c37c630bda0708ac5948a8904045268845365ebf1aa5ec1ca2e2977a587bc7edd955680c57234d1682a7099548e98372e2d99c8df4af171d7965e9ff68656071a5ce8c89d4cba55ca5328334a880411e91e4f935eba99e5bf15e04bb7cbbf0cd6fd6aaaa378e9fe3b2f6ff3122195bc85fa32928441eb52ca3c8479105d3ebd105dc6a7cca4a78dfad9ae1bb67770157844dfc52dd9812acd8156252fe34a4c049a3b8ad7efc24dd00d931e4515054da02f551c96940ad4cf606203a9fe81aa59ade50238f88d0a41e279604065218df4819fe1d407ff4940901802ae87df67c103e1d9a0a5af5bd84f576febe2c89dd1f6da5f43257d87c59da459a3605f4311dc84c13eab3c9f7cac311995e21fd08b195181acdc8601d9212c69482a5851bb11d9d9265e0d0211c43263b595114fd200577d638e97f8bde693b89d17aea3b28aed264a76ffe19842c0aaf8086633420128e0ae63e0784b1bede39fbf3170d26d802e73c58f5b4493395a7e9b1f896343dba2d61dca5476c008318e306f19c481a0af6c13ae3301bde049fd1458bf6e0be6c8fa7873af40ba707652f4bd3035080315e808fd18cba88efa916998aabc7a818e0578a0c11427275663c974c02bde01c2caf5810c9a4f2dffc0392255c52af0a7c317c2291ab6cd3d9dfe6a6c742754417005f9fdd6d0bda5ab2df2ae000c90924cd4da542ce878b75f9b8e8190e5a55bf37e90914dfbb0c8bc021a8a2c2d5fd4d33848a617f223a0ed4aef0b2c665866ec81ba5c85ba81cf4a5a59beeecc50a38ab61f8fbee1510a5280619379baaaf863b8f9eae3f03312cd232352b4dbca84475fe4f2ea36cfc2104da6df6418e6873a51ee316dc1f10115a7de23fd1d9cdf4fd1cbc30618b0dafc478ed273587d7b4e1a1d2ace91a3c98f08a903789ce9bf96d27b3fe989d93bfb5ba0925272152b030f7ede0066ba537dc8e9e512a601901fc5caed0623e23f201e8676ea1515b4f34d3994e8950ec70603c61301f34c1558a008a66f171f33a302ee0126fa72babb2521cdb9d77f95fb7584adff740795de5e225b0c325823abd74d52a23681b0abdd778cc2d96bc2708fb569450dc4fcc04e29c33265dee5b6032e908eab8eecae2e77cfa7db107a8f71d9476f883b758d5fb580a2159873da95840eda943036b614f0db273a0949ec9adeb68cc58721b9c707deb815aa49a009a441da97f80a00807276988c469028db81d04b58e4e28cbdd0c4e436469a57d0dc0f7281ce1906f1ab16225806cea4b6f548548856c3e9304429b26a5a85188c9c1ad147bf6c03641294bf85bee0dd690153b616964ba1ebc5188f523e8832bd8e00f04ea2010e80e18048441280402c046a64ac2ab5bcc2447466dda499236a3b5fc5f20ed9dcf16254ca6b83a246a90e9d1ee144d4abd054b84a200dca3a9f44f775f3c1340fd40e694f7212931a022bbd5d2b8ba080b35e10358b6bd268019a3022fb8d4645e6e4477f61db88858095beab5188f26d53fc2825f7ddd430b6f50f1516eee1d9821bc91e7a55b34ac354a7f4d40e34cb1a589aa33e5fe9e404cf6d23d046c116248cbe6a74b82131c2b6586150a024bf758272c28be4c87e528bf8980227061de2a7c8da0709dbc1f9fd0417a1c903f9adee81974f00861c28be0dea8addd12835bf357baecd9f225c7157a1ce799810c6413a12ffaa6bbd96001dcc5026dda7f40be8f209a354b0648ccb601ca0a6913a4f2b12cf097af6a222e37aea7ce65402757db521a219e5a43a7c7591763a05d1a68c5d47f88bbf356c9606c8969313f2a782af6a4365634c1e4ad5565083a3f2015c5096544c40dd1a2e26ef7c7b11aa4bcd880449df77d1114011ec3af984148bf1157315af80fb55ae92a418f6426dfc02dbff9be153e7e5b81e6821af73fd5a1d392d0fcc9c4c9d9be5ced4b4ec4aac8822c69897fa560046d770d2d5c8a460ad27f46d420cc04e4eaaa745b0c8b1bc71e0aa0c07236f2af1ace148b1c675076f64636d72339f49831273924afe4dd2fb95a234c7e0c272760202741f67f2c5aaf26b156fa760be6c981264d16bc7beb6b82b57c5fc505fcfcc910ccb82aaf9a4456f761fb4020b724c0861ed76429b0798a731284f6b8cd5bfb581897c300953dbcdaed2a2192384730acb7e49a246e0587b06e34aebb43ba57b7be2db7b316b125db699c361cd212565069516dde8c4e803e86fc6c8c179fda71ec92f11a87976477a16985822ef463365efb26a8389c9a3dc1bbef30ab7d65ba26b2666e069e16661c0e60cbca7810211c1c0179a7fc6e67d6a2c4e1441de882dd6b85fd60a277a1380e4f48e142fded85cb166c061256a3f67138f3c06f04db862e947f5a96c31f87474a90a31d4b599d0ea9c361a57c51035a5a62eb535dbbb11156807514be4108f102a84247119f1d1e655708900c61f20ee239d6ec3c8f63bd033e1ce156dd844fd2f4fc047050f73a3a65014d2e1ba222b5cdc2e653e15ecf7d7e51a2d68cc9031fdf1be51e5ad4135560cc773aa4eedd31598c644dbc4d96e4151d88b275e892dce908c48a633ae43b9311cf348938f01ed534801b03c40c6b0288c51c2de84eedef91867287e5216a4182c7a94649bd87809f40b8a7c9237f4da57333b09e97c01d7b01fdda0cb8ef58f2f0fb5e405c4095f8bb67fabb8d6f22f071371fdb803f165f9c420c8adf4f408c40f28d9cbad3a8bc87496855cd570cd49f645cbb4b7a7fbb04ad6e14b0efd839218da9012ea846586c1ae64c812d986440a182e525b8b9bdc79482a45d822fed4c890091ffc82db342a4abf6da8c3e6efeb9ba413630d6a16ff903b6931b64fde5c30ddc7642b1b670995260cf092871a472d50329787bce31d9ab6700eaf2d42ddadb4e97bbfb1935e64f727651803f832ad03d6bdd6273d2853326be50d6e2842bc04ce87c392321068273c818080716c6013cfa1beb1e0640e5e1ab081d327805892c1d01f59de276fd8f8c75349437b3de98d88129e0c0e6634fa79b552cbd0e482a203b8133792436c17c6e9a6be7b40b0e3cfba7db499f19d4a72771b8956331208e6aab0ecdf0ad3bb776810c3b02192ae368ce0223d520a04461dbcc565d359b085d52931881241fdb3bb4ba09196adfbf4bab0d49e473a58ed30d5c261256b8775ce05ded7fe6124d200c5dd8d0c635c10b4deb885eafdc01d6281f6631f0336852b4183751fa9e86464beb34a06d8d61c4e99a70d49c3caa0ead62b9bae240b9b51ca53a0afd88a8b1d8e9b1fc4b5a58538ec2704551c0a256f244ca256a62bbf4bdeb23a373512170df23c88750c45e66641ea3a5060c91ae6b4a16c95091afa1a2cb1504ce272bc73a0f07ca05935837b33e2d7f6f535603ace76a1d1c4f7534c3e38ebfa94962c24b2c36a5e92fbccb51b8d7ba9099588f29d6d31223620d53a62125e334e27c613fee78aaf14a4814c08715eb9ed38485666f46f61e026bfccbd1f55ce45251aaf0fdf14e8162ae615afae907219b9fe87185043650a14e0866b4fb44f420d96e845e5b2da0c09421fa8b86c6bc44666ab9c9226d8cae27372da0d014737fd86ef34a447bc2853b677cc16bc3c0daaee302de5f2e94dc1fb0d431a3bd83f4ab54c8f9cfcd6a0cf2dd37eb60214bd3523cfd29a8b49bde9364c41e127163afe19617e96f5c42bd474d488f47b36c7eef059b6164d000c692db9916b9d23cd12efcbce3cb7d96aeb0929bfa90b1d76b724f3b85bb25613ce5790093b8cf5db70d4eb36bf4c6838523c1bcfce73f648a6c55d4ddcac1e7aff3256b5647a8c34f97f3239b411037b34b280561a473cc83572b7f4d43e100287db588577b3d44a3d5a6fac77dc3e60fc984e4b60d143d318abb90b8e63772a0e0792fa1ef2d552e3ee8505b10ff11abe7f850512a061acc1b3b7d44341d852eb1e99ee3b3918c8e4ed0d7cec476630c256d503266f61bae2a47ee3ed6c7efb7e657377597978123d55f56a2bd1aa099b1632e690975d8751ba82b65b63da4eee89c356e5be8c125f216368380ed39ffecb269765d377a48d72789bb0e46ce17309230881ed30db184a7eb6aeaf941fab458b5ad345a80b9e2a57440f4c6d716c56f17fcfaecbcc43e68e194ae44ed1a98c5b21fdffaf2a5517e08d0a49554bf1b532f53736e33403b21d4f6a96ad61dc86a37b7f9282b5e815aa7e2eb19f0c3a22205b0ad67873fcfdf777285b85e4e93bf32c016e97a9bdd1b05affb79afef71cb3d21f76240925a3ad02b0f6e0d0f4cbfdb754e6521712ee5d15e87b8f649b78424c6b86b431011dadd6448c2ded2875d79453a6bf8eeb9b98ac1416f577d51c91c6113fb72c09e852df60d124d5a4b5ffe3c878b5bcfb4a5d29269a3fb2c6c6628f7941fbca5d7ca3f3fa19ac32141fd100398d4ae051fd8f68ed3dbbd1f02b2c9b64a0eb72ff83d00815b3410e6d42ad50a0a773eb089cd47b0821e2c0c40855caae27e8391e9f604fa64867d3928be95ff49513f287e6a7a34a3e28464cb90062b9f486c0961b0d2a9849610062b9e94ccec999e4552c3cba45a3f4877a062d9abaf711bbcfb0c3267704079e3d0deaaf6edab8b9763bc323843a75a868ffdff7ba4f4eb542ba73a137a9401616686f96c4a66321ee41d01e9207cbb59d3a4e3e15a68bbb8929b54440ea1cd7016a5c1d75a9cc5b9e69d8e63edb639ba5688972f6f5c678f3146d165000e8c32ef29b6a5ef713f6efe8396c86d35c5c7b414d075d1c4bf67f3a7ee343d9e94c73e0f4cec7401c95144f2a08be34d1b9797303aef299f2fe18f36114bbef4b72800bec489752f8a8cad67005a490678eeb358e1cfa23c009a61c5bd1601e1cfccc550c9ea821dd9bc65aca3730b4d7aa19fc03ec955f140d45d5afa8fa362dedb11dad978d36b44516e89fea108da34e9a903a50de82a0012dd47298cd878f7506a8cd016d8e542a39d816eca1680cd35f8329780635fe92046150146b50800846e737711779070f40a8be965d6f00f308483db4160cc199bc56fe639c6c4659e5e8335b0d33ec34760b8651cdcaeb1744e1754c15638f5f0a265315035413d5fdd6d0d632780b3f34c6435c965592547e6e03613d37b620383876b91d7268a7b3a01b8ee390e0c17a930eb7fd28bb60e71a6cb61bc9552e1b34b44a176888faeb66b9a7ed3781cf6416502325860c5700ea9be30784e130a6c4fc9dd3c478bc0624a2fdec9af089b7b3b5ee48b6f65922ddf4499a6065d9a3ec0781e0147452180fd3c469009d31fa7c467d3a6ec809b9bd6a51cc70bd7d291093c1a01e5854cb2ee8e055951869cfc4a91d8449c9264a2db8619075071eedbe5193e0e4132e64f2036c68c657c23df8a7bec0780399db09794a4d5807de771e5c0b1a7572e22922435eff53a4977829189b782043c82562769b532ff9a9fc76d6c6077d6eb83a770d83e0b066b5855343630fe3518cd1743a6306b8c3076ccc42183849478be7cd4b43192d93b728bf42af20f93c560b8c8b07ffca2957e2df8a20146ea13a50170c27c575f30e6851749507d72c39f767c8c83459f730294890d670d4629de9293ce069edf5b226738b5a8fe3edca0bb4816027481670561648044337329149d562aae6e56b7f029eb71add5911a81490654b5a01f1dea525ac780aa322ddcd33f764d2265fadb33724aaad3da2254914046b5a28f93fc326615136ebc1075b1c76d089c38bb7580a15c8e97c27866c77cd0adc6c6771f3b31c417745fba357663a33629e3fd6b4491f59d1226f8b5b84096146c4a9f05c6efc1efc43050de687d53c1906cecef161c384fe7c1c4e77fd20df5b798b8ceb21c8f5d28120c9598d95376c09c68823f1252f57751d7cd2fca2feacdab6dbc3f48a43b849f26b9fc17b8a89d023cfdf93dcdf94fffffd9b6b89562cb085e9b51dd4a2d17e2fa130c7a234753da83621833830b862c0da5c5b788eb8600fed921806f21592215a571a2d1c525617e814045a0b6562cb3ad74bdaa441883ff40ad5b450aba502b4fdbe10caffcb5ee8475e7ac21d0b9e1230f9e1a9f30de7b52322162802bad41419b6955cbbfa43a80e0cf251a601d614ebe225696453ade66fd0e8b184df4150df2c34a0634565c112fd9b104c229369a8866d55452bd23674aa84c5c424063f4a1eaef3c28837c202556420aff06f36598740b2bc01aafefc0fceda1b37e4c4d7e91952c949bfd1d1655ccca3aa75929b5aac22ec67d2f9686038e6ed1a2919c18c6ffcc9363446588b2fa84d34a9608ff8a05b7a34a40430df10274c01fb41128cc0881936a7b1e3f487b905a25e77966991b99cbf483148b122965d159ded288521afa1a4942ce39427a19fd2b3dae9390955c30cc83824640be4e6b46a67b308df52bba2b54dd1fb2973eb575f5dd7ef8cf28dced38d2c1eb608a0cd87a5ff7c1cae04bd8ef5e87a521d79f4156abf5e344fbfd0e4fc9188529f2a0981b29770d54fd8ff8f8a40e2085b36dd2f74433461ec69ed5425d32bc4f7c3543de6d46d7ac8dd3650cfd1c9844514bcfd81033e238b63a86511129183d4f53327dca6335fc64518855c6ca40626773d875be818a8d80886ec2c5648cc4eabba98899763c22363f21430e4ed3d06bf534dc195fcebda6796795396c4f7c64505f86b89a15c6a1259496bf11574278d47eb47114e69a00956a7ced77f2ada2e6258e1a36b00e050a6d53102b66900bfa68eaa1e16813101461da9d0298a83908642adc924d5dfe30b29e9f12b287157d80bc05328c0f5dccada710d51c0f790c4062114382d11ab19ac1347d0054d19669a8b5695fc17b39a60097eca8274e531a4c2573bb2e504e6893ed3f5f3261c58f71d61ff53e1da65432a71b77919977e9e55909bcd0dd9624cd49f6d2853eb3036c91927e7c26e6b83ed31dda6ee6d93ce1c2156a8a9377d8046c46616848dec8420981a027e6e9b235ce8e96193c7caaa23fc7711b1f11a23d58c6415c8281288890c8d27e3a59d922e0edd1278e6de95a4266c49c08d440a0b2b9b285266768340165a60e6844f2389a72fcb7868d9a86fbe6815d408dd3dddda7470ed380c6ac0dc8756581cd2422c09fe3357bc5131e22effa9e4069b42439b4c8670463c56b8250ec0b8d2d11e26abc8e21d5e59d79932bc523d5e629beb1061b463d6a0f56db1cca33cb490fce953a0b5778f4a9d7108a539081f47ea84d39bcd53f12f6670f5f4d53f567faab0defe420550e6bda0bda82f932029ced430fb04402885d40c2f2a89a92171649dc25ef0fd3f1d8c595229934a19bfae2101d7746c6d9dd13d806a8b1826dd154deb9489adeb87405190dd9b538453125071101fea57d28a7a27a3546db8ba2a68aeb71169fb6d28a7bcb03471db1c9edf5846f35a61f0bf6a79ccd36da9e8d6cd49ca63738459c857bc449ecce67e70c13673bdb38157cdf91b0df870c1dca28381e5a7e798790b158451897e8a0176280dc66ae11331de06c386f3fcb7a80bc820007de24bb15d76a93180a0bb5c9c2845020b4e2a4aab18e89354cd0af3a70cdc98be4abc35d0f3ac0bdbe6e785f839b5c9ab303709fdd36c8b953588dba7a1d1a88d8bd08fef868577c7d9c0092287f03885c8558295656ee983bafe9eebafc2c8411c6171cbea25fc0c31ce0eef3b772c904970ab28ba2ee81ef238660d6cc02fb512c9ad6cb513410ee62a9d140a5748d9d5b2242db00a2e4806b3f32e333e00ec6ca978194c0a123919d903b00cdbf306bc7d310031d8005d9fc4a1a26409a76f7e359e7064746179c715d7380f370adda84ef1d52a57669a6665fa801a899c65a9f883bc773718de5cb4d2cabbd68b84733e9b84cd0d2d3c556d0749b3b4316c73fb6d71cfc170ca45002ce42f26209c498fcfed037991121abfe51598e38b98b29938d2840ccc9c69cf481f862c8fcce0b64ff1867a9c9bbca3a483e3e658063585c06068e9c4d38c665f50a547e04c49fa37bb5dcc9b275f7d8d3f22289248e826690affd784f7424cace37bf5c65790291bd8ed575607647a92912e75aa9e79bbb9db16b0528dc1dbfe73233872b8347c2816532e609e177ff9ecb84967dc1a4b0453c076559f41ebff351b2771d1cdbd40136c8d926ea8e5ff1729df70843f13dd540a4ccac115ebaa2ed8ff1b914e78e4b733d55b6360840c8d825998c25b474b7d3f8a97c3d27ae780ca7eff70a6c45e6d0fdf249a97138b6535d0cca5b186e907abd8cb9938a1575556ee99bf6bb6a152fe9491793df6e42e8477b1e16f97a0e39c5798a7b468ea98107425db82481e3a3a0255c709af2a20b2027076bc4c178eff3b0130e0916219380f0faed4d8722c918b981e038e01a8e3ae2dcbc9cebc35e35d1e5e9c0cf25cbaac088c1439c92831672c77173a4e1988adf746e4582998c7cc695aaaa8bd2dafd7222ed4965fea514fdf0a32aa7f7599e44ec403c0071dd600be8b6287217a097f767e2fe8bd46af8b7f4a6aea55912f0d3464815acb9ea92f6a3e6a50691ddddc75e09905caf97178b76c43e163c027645337ed71a4861c3ac756591047172a4a3490ed52a12a82c65d3f989fe7eb2685dd8b7c443537dc08538c04234b7a9cf2f5749632eb62fd5f1b87c5a25f4e4ea9fad880bc9d7ee7dd9e76fdcaa448eab8a28eae2036eeedef757d61f85f68e2d6a4a883d8a688006486354223f537b79b54a84cf3c73e74e4a5182ecd77e97b9eafdd70e603d574e995ed60074d70968737a7588e28da5ccea333b54804779c01a4f9d620b4f2dd449225f7dd1efab65cc58060b99e8c274b2ae713e93badfc42a6905f3dad321bce4ad9578ab1ac91d6ad0d15031f7c051ca0fc1464bfba467ce3740df478c030b39ca55c3a51c25e27e492db22bb7ca5e23ba1e647beab622798bb2e1e5b94831a53d9c1ffb9d84416e77000c4fcd639a8b4785020673166ce802a94b6236efac3a5b2c7b8d57c095613ca2ccc92e1c9e65325315d85ff6b1bbdb29235d21a34b1b7079f831f6de4c9fcde8a48c79e08f050caf64acdf7d418c0a9a734a2a784e2fcf405a7baac50d9d7ebebca5f69a7a0d72ac0c454e8ad2cd9e314a00996038933aa7bcbba86781862a2093476dd4d8a64790d5a97eccdeb2d10e9213332f140f2a5a8f40a5e82fe5b72c490b525112f00ca363526cf0f1e7f71a225d9a7a3326d5a2cf33e341e29ec19f862aeca52299f3928a6b347c4cb6209c1ac507baaeacf299786273e3dd75eccac05b04a9b5faeb90bc12f73713f1eae10093bea4a8ecc25885f963d018fb50b4dea04cf4abb01d1e6a11ba48883eecd064b9cbf05f590657a6e8fa34b35cd7f23d84f95e2fabcc2feee602255b073d6b4898c1f840e879343aaa52f5eb84e652a7bf275cca32e0a147a61f8afb35ccca0ae9751eac18b2abd09955e8a52ab49c2a7436157aa252a1e9e56c914ec5051d0f05d5848206bf1de85e11549022c489bfb3df6fe3f54fd0df66055d26485459276e8792b98a1fe8b14c4cbfb52fa4f2bb73992130ccdf638a877834d49d29683c33083bae34bc4b276298b65fdd8525e96a1fe98393d9a384d9195649a3d806e15ff230a554e1e7aa8e63384910489957ceda5048a8c60f6ba0a6587a77f7584473f79409c87705a73aa26daa73c68409a9c6c3cac571d566bbec82fe9d1628dc7c41e773b594eee24598d9cd1f05c39ae50ed186ee97fcb0e44174c17cc9309eca53de902637ade604d71c19cdd36b7e125a5b64cc0d3aa9fb293a0e752714e6da8883554cc076957c2eb4fe19f6240e56f11eee8212c88b7dbc17d623fb71a18a9e4d2625e976b3d304df8a77ac6f97c48779802ece0e5233ec971b89099cb626d21c7c3bab6ca2e9d3cb05c3704393ec094436d27c170415de1561d23c334368bcb115b43ee3225b575fd4cfddfd3e10b61bb0d6b9822bf35ca09e5ccd570a543ea718e90a776fdf14a489382ff837fb22be6bcd172b5f5561f223c6f52cca10f0b2e5efac775f9815b5b8ef6d74515530b91f5a94b96719f51405a8c9944f257d27af23f8624b93fb2d3c4f0f76d026051ab48d81a02908dd730293441662968ec1a867ed04bf092ef4563c7040142253625c1fb5574be57e2cc9acc5a17457c70dd19199f0d893a5ada2611a85057cd06d481c60d66df81912b0c2997bfcc7e5629592faa0652eebf6fe45a2427fc3846359689da7e969b460830837f110fc99c5394ef8244c8e2ce6210847099b3514d4cf25e716279404a379f7c8219ac1c02083becf50cec628fdf45b2611750a424c1924a0d53dba07f7f73d753cca9f48a49825f419505becda0fd8b0e7e0f8297134a7dece31cf55870650e5ad5e816aecba3a656751d064449e466f7ddb5af25e460af5a237b7594f816f800922e06eed8b6b52e0a5b759b6e4989da77d908104a3d9ffa14e6bfe4db401d0c9d80aea141f9e76e53e48f80a2b23fdafe07142e1da399f21bc7cca8890508f5bb3d6c36f6e0aa26fcfc98fb022e0c6c5e01b4713ca479efbd8ab4ea92564fc621b0557e9af1629acca6189f0a4942eea376ccb5576fd73b31126fa3536061d53591e298b12f172a8bf0cbb64e8bfcdb1adbe1a8439f950e2748a27a36873eec26cb9f810f24589fdba59e7520cb2c4d6e66e810597b89637fed9fd96666b32a4e50bd3ecf5a14abb1de3eec350d6e5ebe59c4cc915242b9c359d455397f329052223b96407b7dbcc9afd3725acc6840d4855dea0a2a3be159aa098291c4d8539c0c21029a768e933b8beca91e2edef57e856664a79fcfdbcbb8a48520d733f95e6bd80f9340fa4f7513a4d52c2e0cf79e4fa28b031c112a0970f7e5f60e695b5055c83c044978209e8ab569e356cac11282a139c0127da59e49871f007498b2d72999ebb476ca05989a1c4e978cd6cd740bd0a2829f80a94ae2df4b2918b5d4e87cfdf30f5ffeb2177982e0c153e99d73d7266242ab3c25562a9bf4a9d34edb7749382a52be2e8d8dcafd3acb7800f8a3d50bf0667d8efe1ea86fbfb2cfd9b9c34840f11cf15cd6b2f55879d812c40237d0f37478b27be22beb122379c27090a11168070452f96f58ed959cd3601cf079a38df88d276bc8964f70458102cb5400e4c3ec40b3b39bca254076ab4126cdb17e82395494c3cf4022ce9250a7bff240031f9d2dffb78c77c2a7498d5956326d98a3275642f4559bd914d6e87b283f65307c0047c49277fcb5efc6245ee176c9dd998ff527cf105c5108030e2d03d9a5d6cb4f9b1d71d71ee859bb90aa418fb47679774f546621151a19d8aefc5e637bf981d088e6c036c85e7680bb32becb3bb189a73045de5ae902f45a1359c7a599e7510a8f9eb9348290f9c2e93efbd83588bccbf4aa622ad8229423db85a753160d3c3303dbd6dede4881f448f6fe0cf9ca44888bf1f4d92b805ef218fe0e09516d125218dec3c7fb545dff4d9759ddb3794250a297477286dd8e40dd7f0964d1f1fa6c23055cd80eb51138a36c7ab1868a26ab8445deb905f5c951bdb8e8a3400d3d560bbcb36ae4f1bbc0753311a4cb448b136e07972cb14c706674c8d7a6a3b249c12fed34475d961d1988eebf6004c10b4c3ece7fecfc90e39731768d5940a7692b43d0cb3505ca67d871c29dbccbd9f215b340c9e21605262350f5da2563c738ba8cf400bd490299106d7232def45e8bf92867b5c101ac568e8ca6d06494c6a195c065ffbea55b329864218ee04aef83c44d099950c31ad380f5a7d961d7be398814d48509ba5d01905cea0447bbcf0c7f170ece701f1b6dd096f6e493892db479a9c1ee6b1f61382368acb87bcbd4043c5074e9fb62ba5c8c84663ff81f27b124162d5c409a3a4273782567cff88d8cb417ce68b33a830a1ac4ae69ee5c71422b1400c28edbda5f0a635e11dbc363fd36e8e94a25e5553d2a18e304c6b2aa9bb4d0934003276af123d5cbe04b14713ac0be707d20d2a7e816a841118c98ff27ed2bf11f008b4c8913729ae4d662688ee6381114b56c87b5fb4fa1fdacad3a00c97d1bf3d6cdcc382e0b164002acf2a88cd93f051a891254d02544ca2325533e6ffa529335c0c9395a1c8ce8d4d894a233be96306029dc1bd02d82b796c9d20938b18ab6a558e55d944f01477c155cc46d95898b2d1fb92583aff8b3bab795910cf97681549ea250c317a32c924cb5433d320d341f64b12d24ec88084cc8c036a92be855d30d4594d1b5a48507ce93cfd308e29ec50d280fd76c4ad6edde6e7e779ea8ee6be80e586f99879f5edb1b23ba4878718e3e38a0e26dae00080491f225327e04390a850b70f9d90ef404665968ac2eac7171e6f9758229248647777f70ee708c9071208f8da4a7d0821f3819092242a9f84143fc714a5294653964c9975389b1224654a1072ca90293f1dcea6bcfab73b9c82439fb213a994252948550a13294aa29572a488941f665c293f1dcea448d9618614294a4d4a5252d09490e80f7967a1e3734a3f50ba81d2910e674a43947c50e2214a4cc947290725d71542442847a00c41011412d81c28941ba0ec3cb1e2c9117a7892d4e1ec49d1931f74dbe1ec89921e1f6b4f8ef48f3e81c1107957f10488272f28a1c3d9931f494c26f03da29042802890804441a506109831638824ee1d02087808225c27ae12235d8c412af5ab287ea488a898a23f289b422fd150e82a3fa0a88203144a501871118a255008c1c91b34813c18142e2876b827aaa858b00fe8b287ddb449a7c518174137e92792dca075ea9f98a20436cd9871c444aab1c29d978889b483251329499ec1339372e8a1870f3b24d9e0860a8c600a52131dc860891feca0871df8d0ef9dc1c367f0e054ea574f189922a7acd65a27b4b5d65a5b8456a2a124054137a189d036d0b8d229915c1da6c319d20f12cc898a85d983fe688733cec83f1ab98695be07eaa3baa492ca8aa74de41f4c9f7aea504ae98dd871bc11bbfcdd552c7c75f2af847eefc5d4052674f9f57fdcbb7d646067676727c77ea650ca97d3fc9cbb614edc28f48873c2aacf0e47cc8437f2238d2dda94d30532e8cce5d8ddae491b1b3e67862c40b479cfd841cc097330b76f6cb2cf57dd987d72d961c7fbc7f6367c9405989c06313f4388735f060ea43a84287c2e3dc68ece799a5c6fda962a16bed3ffd4863751eb31d0b0d3d54ca7c4d7466d03f9adb447c810da4421643e7022c909a40e674e30e99fee70c809596c1b42a7133efde3664eb88ad0744aa2b56832a1dcacc50655231f2ec2901e8be0d33fae08af0e6745606a42493761d44411d349de4da8405ba4a227807a94292dbf8583f5ef659e70f50f46ffb8268cfa37a3882788fa879f983d91a447978bb883838f5294224a6045141f18810a2096c090f0983111a5c90c1e8c678e2c20c36d085a0ab0948bc48aa0264181387547f0467ef7f23819bc919f9750f907deac6c3b495a6b82345cb4b4b8bc0604696c2f8f8b200dadc56317a481537f83208d2b9174f9306f93200d1bf3160669d49749d4590c105dbeccd3a61d48c3c5c39fdb69037dd3f0b5f5e9678cb5d3cce33eb3fd74b165b60cf18344c4ec2ffaf0452952fb93495aec6feaf0cd265cf6478bb47cb449860889883e48f1c92453878e935cf280439847538714cc17bc8949a44899144896a20f22e8f22b1149bc006f22105a152f9c03737691961fb5201ae35a10bca1d2d5e96fafc8820c617c1b7fc1025d775e499f5e76504e4a3d8fd61b1cf638952b1c10ae3e94d7dd8072b582ef6978439fb3b1e10dfd177ed45043be5ced6e64ccd94edb72d6b4ed7630cc9836f4f3d651ef73e6620783f7997bae6300e779a8f77eeb6e6c1dc57346791cc31b88e10d4ea1e78e6a18f4e78ee3beeb18f0794628f1497baf3f7737b6eef1cc71b1bbb1ade8d7ba1b79c37743fd0a87de6fa06b0ebdc7dd3bf197a27574fa4b7d5a87df8c9ec2e41bd14683a3a40e67473e01e870c6c451d74b90c6fde943bef9a1e8cb63238234eec6a3f2a8b85a6dc33526a15ffe51cabfcaa34b17a4aa05f9f72f875d76375cbafe8137336a1f53636afade166212fa675fd5c2c5b86baa16f06baf711d97d71dc9a9cb52115e8aa6738ab65f6367c35af875bf143d3fe2f862a71cc220728cabe803ca88380e2e0e24de40488996ed3011eb5bfc2884cc074dd470d4c48101241902081741902a840523e0499aa2831e4030a40a1e0ca1070ea2f0c11582810c5e2ec5e91629a59433d9ce6e81314580190660220672c6840cbec319133d4cfcc030744b12f497ca5d7e918ca44b59974159c62372fee8f4670c9ab24aa74f278fecde7befbdf7ea485aedc514e32923a6f6620d6b5bc61bcd5cb7e5cc51dad12ffea0f44f3f4e4ca26b09a59089fc814ce490222944128147309660505929d1df21dba1a40348966420aae0d3e9cf15220ffdfa428d2ea18e4f975bfa48241d981154d2f9f9745e5d7e9473525aa39c93d25a2dadd6de8bb176b1a66d5bcedc9639aeeb4e278fb3dbd39ab32814675758280bcb949185d2fda5405d5c38fad2224553a92963aaa238bb3f1a90badd2c48ddee96248ebe8b0b47ff8586a5de82b66831656c716da5341c7509f94c618816fcfaab6869690165a83095d0ccfaf1bfc60cba0d5045d3d4c068a9d35c6194d4bf961699144ec0d78afe9d2099f217f7a681feb08a0549030d3fc6971a853242084822e439e794f3b73a27c79ed6b38432fe404937c0c801194a218f012438623a96ab25112092fa29e2790c2c6124e7124b288b11ea123828b2c40f4b08596287257872169c93295a3a9c3961c2c9122732edc408cac90a56585a5c5e5aa4606254322e66687e732739bc70c2034609353162d49400e305df4f33e3424615b33add11e41dc4aca84a93292260848268e42363932a4c10315322095662069a122ed894e821cf94f0e15e3a9c259145e7d2e3e7d34a136fa6930872e97096c40a50b3244ab0324bc206160d8b96981ee30c891bb440c287d40c091f0e091e98981365cafb0548582a8ce4409260567ceb534ba945421326025cda648a4e29a5f484958c6c720419184d948a900046de90927925488084132740a2081d8c8880a9e216813f60a208233f5260c4e3053aafa61fc870104204074eb0b42f249d942e61a4430c231490a0c6c8e7064a29a5940241af743833ead16b28610412bcc0410f2f82c3fe81e78500a15962071c6696e0b1c145163d32538840c5844fcc1212c03891f1a49c18e969e16405af1719ca7fa64494c9044f0b112c495e2b33e841b980472bd1030e9e123e404e5904e99e94806bb2439e8d605b4109b4244a90034ec286115c24b000629de45082ea84070f4d3d1237e894524a29a534e5034ca69ed2e99303a514099e4e9f524aa93542d25b74385b428ad1921844518af8d10810019aa8004896d56006fa83322afad3bfa38f60f2a389099cbc9aec781dce8e5892471cf58f1e51d423378f60d2e35ba063233ed09f4e420f69226d44530d5aa77e0995227e9063b98a53f619390c6204149711463d4618718311417019318408023bd3a6fecd7f39a51ff9be37480b463b1bd1dab054e24c4ae9b76012c706bdb9f59a4bbd7ee628d03aecd78ea48a9f5ebb5692383a49e2bca622716e3cd24b12a749e220ddbfdba8d347449ad6ac925d1ba72a49bfdd9932726cdad4f7ec4eaf16a857cd55b018fefad1d42f6f972459dd7ef28f66dba04ad6ab2aa9d7e754747d9727bdbef6e9a3aee2a1cfe7bdb6824414e853ba7402a263f174b57e67b9addbbaaddb3a0ee3adeb3aeeb9cdd6e7b8e75fe43cbe7d17c0787619bb583dac1e560faba7de1e38596b955bc7779f3e0df5d62a25e631cc7eedd4b6df3a295baf968fecb68e0c4fddb77cba563ce5fc5876b8dbece464c6db4bfcf3f3a661fe75d116f132edbaaeab74eb3a4abbdb82b560dc77fa2fa51dedf4bdb77b7d5f77945eaa6ff731d5fbeac5baa7b71524a2d071f9b682b482b482d4d8f551c5ab9bd0e1ac09a93731e951870e674c325a55f261d639e7ace3dbde6e397f8c75d68f760d2b20f6ee6b4856cfd53a6bcd12f2b0c79cf3d53c86d9f54743d711fff4b073e1f4f96bc898173fe8cfefeda0bd7a8fa70c96f7627466f17e65c369e36954f34f033a9f0deab8fe6973d86d1abb1672cffcdb34de326fcb73167792d70873deaeb35d77bbdb75f759aeee593c9d907bef65b9583e5dd7b15eb7ebba6f07c5ddfcf2d52ea5f7f57d14ffee89771c97ef7d6fc3b9f11db46bac9e160ef740c291697f87ec4850428212a6581740873324549973fe9d7fedfc3b2dfe1b3a1d4b79e5bdf7def914c6d64b3e6d09a1f0a195ffe2076db3c4a143f22f6e79d36e2b480b072546611042c82ffc0abfceafdff2815ffbdd3a629801de164c6bc1eebd33b6bddc1b9753bbc06c0569056905915aa446a002888a9dfaa2938aa31ea3c319154818d207d0e18c8aa50e678433c219e18c8f79a75b470c3374fcb0c3592beb0569df21bfc8e7dbce06b6811f76f8f163fedd9fffda638c7f6577d5d53defeb384abf6081befcb33f39be7de69fced4b4fa5347fcfbf62567717205e9e4af93b42eb24e3fd7d68c6bc13aeef9c4b55edbafd41863508ca78f5d0b5b8743d57ab5605b67a346fc33fbf455f52e364c0b97fa2c284e5a6b71d51d0bb373d6dad730c77554ddb9b03db6bf436a120f0168d6a9ac321ea4945cac1f351e7b859ae59fee34f22fd569e51f4de59f565fd3bee5535f6b0de99f7d1a7a8d2e5adcb77c5a42341ddce7995690d8d2de0557eb4c7e9a168ce5bf0ae4f25ff5a1c54398af40a08c5abfba208d99af3c739f3f66de0a42f3f8e5476e3beade7b2d53f9d77ab57c62abbed534db82713aecabba8c49bdc87c0b7e19f3e3fa5be65fd4f4abbe4c7d5ddfabdf551c25c6b3aeda345b23d1b2fa9f0ec25f5b3ebdbef678669fdec5e65eb56197d97a77bbf5aab129633b82e11feebc05afb117eec26bac85b3f0582de2a0c4a9bf925b416c8d7165d78dda8ea60cfd9a36f4f5fcb6a3ede85bbd5cd92a1c3fd4c3ae8588e22afd9a326ad1b4a18f3dfe615df4d2af4ebfece276acc6b63fedea82379c0b5ce72a10681381987c58e221897f176805892d2eb75ead202d98a683e40a895cd1bf3aa853cb5b41220ad5452613618ef063a9e9084a8ee0d397928ce004a873fdf42c59c75496a80451714d71d4a9c07aeed17ee6b8e75abcd426baacfc765d0b5b8f1d8ed3cba72c170b5fd64be2e0df5b6703f3ed5bb6cffb1451d15b8245de65e9e8204bcef73defe696cb82bdef76c8eed2c23fd9bb77e19fecded790717fac57e739df1833d7e17d972777f947e3a633030d113feb6309e9dff63ba48ef834f4bbbfd971f71e6f9ff167964fff36e9c2277b7c9c7ff39ef5eadb3fbe1f5fd2f952762cc48f5ff4f817632dddce5ce5f2dbcbf7962eff58887f5d887f9fe59238f2f1b378626b87ccf73fd6c77a75f927dde138fde53aee77efc9ed2596f284f9173bfc9fc703c677db3a1b1ceb6e6fc9a3e235ddffbca5b83d8be7f4f9b71df5cf16cfb2bd3f9d3664b9361d80745b74e4f1b0e960512754f7a878eafec4ea89915fe9711dda77819aa3972587fa4ef33e8f876ebf2d097b7f9fabaeeafa62ac73df62bf6c38bd2ea689675f7b2e560fab87c5eab1ac97b7e45159eaf6672cb17a5a7eb46c9194a1bc01d690a30d18de20a7acd65a232da4a70cb1d6da1d682548509418a189a03f5d859e52658afcc51eb73aa50d8637fb25a3e4b2d72e75d8fa1eb08fea94566a5f3440d3ad6df172809e356dc3e915bbf48f523a63cb9e63eed1f618ebec26f43ca58c733bc5e71d7637b61e39e6f501d07127774dc71dcbfda2678d939bf71ff49ce794306fa7f943f4dbddd876cf9893b86321ca8ea5d52ac552874a6b85924bc9288a155194a23c11c5499422a20c45917d29293a0a0e4a3da258114529ca13519c442922ca50145914a028b0283d518b82438f23b0d6421142041a942322c03dd05072b0d6de60438d15ac85b27343eaadb5c2865963052badb5d65abba46998d0a9d4afa0144191024a52ff5220824f033ffcd48c32b6b4efb8fd23081964d8a177e0ae3d9777ccc11bc29bbbe5943973ffb0e1735ce00036aadffd1ba220dfee177025bfdb31a08d7c0e051908c05fff7b6c3b1b14d35bb59c6cb9bc71cecdc998cbdbe6648dcbbbe6e48dcb9be6e4cce53d733277b9ed94c3d18ec3dd9e3979e3ba2d73728e50667aa2a7293b1bdd94b0a3a76e6f395c6ada7478f6ec651da1d474eb79eb9778eedcadb75d6da54319967805dea9e3f2a6ed49042168665cc8a86260522d5e5c5a585650da3b755cdeb4b025bc3f9d12b67dd8e5af21e77cec49bb75baf4f2ce2157f405b9a22ff451fb7fe00dbd0f63abaa6c55d35651912bfa7bab96e48a4afe4df086fede3bd3865a2434cb7f13a4b13365d8acdebe26ff70f70157f47f69da50bbd3fd975f78da74dd5b1f10676947e244b8ea9e76afb7fffdcd4ec3554b98feccb8f8f6cfa77bccfe60f65743a4d34fed4ff7162f32fdb23f5ac4657fdf5bf6f7453a7d96fd711b5105887c94806a69ffa896f64f4c56e50963ade7949d0c37ab669006877a082594ef45202fb24e254def5eef2f15b76aa8d39fae937575eab2300b6479eccbfa5821f6c70ee1f8111a4e9baf26d6e9d7004d9b19fdc64c2f8188085a86ab5aea32566f9313df6673d266b5a1b421aa5f0364addd3f92e3b623b2b60576fc086df32b16f07f15f8ee4b208234b8a7361b4e1bfeede0e606922bdaed1f4e84fe544b9dbe6a69e72571b86d5554544daa2a323f645c323c124772ca45191480ffb31cdf0801b9a27b0810917d64076d2412c7f21cf0051962b77cffc01bfadc07dffee9f46d27a39c929eec670863a4a7c8f517208054430443c6f0e1a8d3b87de5a1fe81cb2bbb65cf97e199262aea73dee8f24665dea8b474a36207f5a63a36bc0e47f7f8b27c8e16be7d8e956923f7575d1c065a7ea0a947d4c32e46948e75fddbfe32d0f5d7987a6befed530cc2ce06de346f54c6bc5119e50788baac31b98acf5fa0e35763f127c775fd6dd6d88dda69ae234f724a88a2c0c9297d15381150c9f322f4a73bd5049027d06b2ba53bfaa8cbcf3198fc729176e5a26c74247190244ed3940125fff291189bdc231189c4991f63ec31c624ce911c24719034d98a208dfb1627668f34c9eebdd7c9891d7f8fcf1044f73378aff98773a050b9dbf4f1b61f2f116dfac9455df2263a8683b42c3523eadbfe74faf699763860a0bfba7aec1e3f17593d73c318895bf4d32d50972978fa884826a2dd8a885a639c9333d1947f5c8fdc081da1dc81a63f7f7b9d1c95e52a1834cdfe0c39b4df7ee333685c27a70ea1e9cf97912bc987a01fc610f4b74a8004202071e6bf90a3be9cb102015448c1004f975c598543fe940f5fc5352039bfe122499224499224393aaa4996966c92a5a59b2449129ce46a49b6243ae28852c6680517820bc185e0427021b88ccbb88c1fa1eb5b5c254bd1963a11411af4e7c652046fe6ff131dffab1e509f33783339acdbd5678c0732578ee14d74ecbdd794515dd346feeb0583fdfc74385cf4dd443f4b12a4513fa847575010bc89ff4ff4fc36578fb4bae28e7283a0a0205e248a0d3aee4fcfbdfeccedfc3a9f9ed340d4bc887ecd7dee3e739b3b71faf4284ebff71cf7278f7f9c17d11f87dd7bd4d79828eef4f9c475cf711ddde74e6b6d035e24c68bf0222f917b0116322c5e3fb07b93601526ed5798042382f11012121212121212121212121212121212121212121212121212121212121212121212121af2c369e053454995235724a1567e7b97d4b780f9bcbdf85c51e7fe65d67245902eead38a1698f73a18ccfebad4c3a46092545d52f77d202929a94bc1c052afb98ed4c3701d2fcf5da0c2522eb0fef2f05bb0bcb8acb4b0b0acacacacaca0502814a701163b55985c01c47db84fee4fa7ff7087c160fc080c064b82fd20793762125e533c3940d323fc1c70da3cadb7f2eaaa2e297fe2802bb83062c488112377ce39e7a494524a6badb55a6bedbd176323921b9193cfd9ddd87c7019f01870f05b30c6b2cafa34722877109fc7628c3146175c8e8ea44c26a5bc73ce6929a57569a9561a7f7eecbc3cc6633a3ed45890f32baf96d79d29e59497e984737aefb3c7b9dded2c7fc6a9a9a4d8db3860f7be762bc0ee5520bd7bfab6e5515f03cbafbced5430b43cea73b4f01c2c1c4e9b6fe52fb6afbfbeb73587f0e6abaede710e03ddf18ffbd3de1e765f63dea837e68d585df066fecaabcf47c1fa04d2e7d340753a39ad8051499fd6978bf5d22865f1b07a82641568da542435e69ab580d5d3828d884adb2343185f7ef5f9b9c6ea914e29a7b45a7bab94947e1f51905ff4e934f24a548b26778196ffb5a4a48c196cf89c56903880f83f67e033c68f6fc3d2d0eda7135da01fd38d73104bb17a2448835448cc4230f7a3bf4a8451a075685fef5664748494b4b55e1a6f055152674bf01215d02a84d696101568fbb12a59820222222645464712072325491cdc0ad2821115291131316a05c1ad176e0589e95690256c45863060f1ab6bca387d7df598929963ae87986fe49afba0bf1a83fc045a07fe9aafc6e51a2bc73f1dd8e5f8f5c61668c7bcc6acbc0ed91548ae880c913814a812913816d21a39de03ad3e9da740dbd81022fc043ac62a922aab4a24ce4ce26ccff52ff64f67368590fed5585dd2e7e3c0d9143eb163f544142267b96ad44e1dd5ea7d8cf9b51ccb55aa126d529bd1d3e974e3bdf8dacedacb72b178583c97d543133b81d7c4eaf9b1c3c37a794dae975785d5a3c46b22c26bfae9628050ed74fbbe144f7acd33590c6cdad42b058c6ce6b2b3fd1703440b10bca94daa23e8fa9fd7c4ed2fe6e77371b500e1f28249d26b124d56826e8e6ebb3f9dce3dec2ac73dcb45bfebba59ade5b402d14464f5d4c972b1787a5835468e435a592e564fad91d5c3712c17c742a6ef9d369c36b9fbaf02d1effd96a37e4fa075d4affd56ceea91381fefbd96da3d5f76fc0a5dffdb6237663a95411af3af3754778e62a8df9fb5c6faf7b99f7ba6c30e07f7f5740469ec173f6818459f8fabb6d158acdfc715d6dde068ba0cd2a0a13278733f6eecc96e927e2f10ebc5ea6939e292ccf92d18d4a9b97d8c31c61af3820555d65a638c3156d17356d9b66424e79cdf7ad177817240291f340fd70670b5e21e0698f3a306a01aeacf6bda709f25b641b9dac10081401beeb39511d259719cbee331c424f02bb4f75c0c9c73ce9f27cee3b8cef6bbbd93c7bf1a3b6dfbf7391acc61e6b8afb1b951eedefbf9fe16efe3f8b773150669dc1e7f7f787fa9fed1c09bed888aac81d8391658c41863c4424a7925c76269694e3bb1a095d64a3b1cb462312dc742c7c721391617dfb06103efd0721413a3d405e602fb8a44fcc9e553ba848e3dff579190cdf4c85b621b955a05cc2c365185cb8f5c65a2aa6517980b1589b3f1af2e0102020202024275799fc6b8b52d4751ec34b9c066fae42d3124fa738165a29d2e3fe667cae05e5a9819a4a13d8cd33077f9f96280bafcea02db718111e102238a89e11f1e047f82137122e09257e42253c938d8e596da9435ee44c7ce35d5a6da549b6a13244283732c362ffff4cc451c118993f95795ba9cd5cd6e77c35b6afe264b4d5a634a97241ce8efe5a582cdaff3351e209c7fe7f6f2e92f45d32b7f79e997975cc5ff5e5e5125cb3c9040051554c0902e1de863fa1fbfbee46b1be650799a1fa99615df6dbb1560c7f271f7dcd7907ffbdbc1389e236f1cb380798dc51c3e85ae40b620782329520c0929160b3252b248350849d3b6a53b84898989898989898989898989898989898989898989898989898989898989898989898909da48a3e8375af939f73485d666f046564e633f947ecc868452fe33b71f293f66a6c4652ddf90c89594db91fa7304cb6e90a1cc1148c7e768665cc8a86260522d5e5c5a866a88e13054c34cc9500db2dac2020d69dc2e6b8bd7407f9589ce71934ea552a9d491a432f46336f40349c71d0efd386280211f4ec4211f490cf9201af2213bd2e1908f21433e7ae8b6c3211f2618f2c153877a54e9f1b36dd1e1508f277afc7c877a1481877ae860a84750bf7df28f03fd87a11e40433d4e30d4c32587785499433ca84c0aec10e54f18e3a454a7cf875d17250789f04fc07860640a183722d266feb4e7e8693bf1daf1d6ab15a44bc9cc1c9fc6dfaa362bde1c5642df164caee4d38ff4023526638fb11584a866c1838914542e07fbe9f37e4ff7aa5f7217779a7fd1762d6cfdd60ec795b0e52187daa9538c71386f2c71582e89b17cbc6d9b84d6380b94df1d34c6ae6ce842eef8d22fca5ae5db26386c6dc120a48137f261058237f23990fe688e68200d2853499ced9c888e5fb9841d299fba2070cc6c9f73f6763dc9b8c9e9c21fdb8878d0dfd190ed6863b21dc5fdd30a0204d1c644e2cc29437bf91bd02c9564bbc15664752be6376c8fa1bafeee8d8aedb6a9cab6245744f492a4e9b2a97f1a52cc591d66e4e886399b0ba63fa0231b50afbfc1b68da7d70d1671ddd9b66ddb5c1bcf6bcae8be6a5aeca87edd9138dcd7af3ff2d7af3c1247fb1c3865d09f36f3b72d731fb7ca75db86cf09227fce315becd560e7078d8188c48e04219129992d21625264748494a4c4ead941015f81ce9148644a6c5c4254642471b423a4242589a3711cb05b2ab5a956817dbed4b468b18cf0a3cd0b360551df1dcea620c27271d6ebc29bf91c08fddd23d75e4803ce5c8edb6ebe407551997c42f221fa93e9f2bfff132a8ca6cf40cf3a842ebf732bf4f73f77280a9a5941c4084e8094d458cba7f56a0569c15ab09dd94e12eb95049e2cae9865a1a48a31b8405533dab52ff911bae663d81833da9531464da39d8d997befb594aa54da9781191b5a37c4032909427ad636a85dbb753624e742d031c6c8ebd192dda94a556a52a5529b26e55cc0ffe538c24ecb3f08fa4305cdcc11e550327102e46ad62322f4870aaa31a5c43f274a6289b90a1225ebf3b9125abe94810a9234094de50a42890a9a157594122612c72291a196a088248efd6925ad91370e7638b6d7788caff9af1e6d2f4883e6bb7f5195624d8c9734fb5ff0d7a479f91739491fd5a3971823c6d7d47c0d9fa1e669e88b0ca6bdef25a9e555b097a417a597a5172ada7572d598afc28c51f3d2c5a679fe2293381f94bd289138f66589c429e167d6c12509d270f13309152471687e3e0a89c4f99f8f92499cfdf3514a240effe9d2a1cf2f27e1afc15c05438caff91c31be86cf1004fe196a3e468ed5c7f8187c8618bfa279bcb78b23579fa8a097249d12ee9c99510115f4227b994d1931522f0fd302e65bd4d899fde9f499cf9783318363bcd6c5c30e874e77a182ad51b35532c65649ae82a1e6637c8e9a8ff1351fe3b5a7d1b4d7fe85f65b7bbe352dc6aed9d6f21a7235e7bbd8db0bdecc8eefaab46bd2a6d9f548aee696046fe6c7d8dbd2b4995fb3e1b49179ad4305bd407ff528e6b5ce46ccc32903a5527dbaab1e4e95ea635efc800ad2f0446953a282663694ab9977b13f9deee27367c305a5945edd2d4da4999979bbbf0cf4199677b157feee6fd5b5df3a1b2cdacbecafc254fbabae1898fd5520a9162f2e2f492f492b1f2de2a1825ef6a7b97ab46d8daea05a7a215f20a944907bef6be8fef42108427e08b8f7fe767f52c1c0bdf739b8f7788eee4fbc86d4806ce148682e1634bf628c5fdb583dd3e21aa24e3fd3ffb8961756bee35fbef913fe7b91bd5ef1849b9752ca189a07fdd23ce8a568b37a9bcfb17a9b9b5fad4ef895dd2f1eeffd8a316f6cf9cf2529e622c323e392f921b32357b466c3ee851f377fc2675ea43f6b1f02ab07c043c0e64d084110394e78133e04375c351f00bf7a00bc3c81ab2657590e03007ef53900b0fa1c6ff326709c6d781cc7bddd1fb7390cb4fd2f4bd4eb7499f797014ff21a20988ef9d5dbfcf7226bf1314ba97f91bd287999bd2c714982790ae392f4420eba7a29e50bb95ff297305eca1aa01a221207d71c913825bccbabd357a15ee6f78fc4d94f9fff0b184f5d925e2f32d7ea7572a4cdaf3e87cdaf566fc3b1096ff3367c069b3781ebe4c8fd76bf406997a44e5f6435b129c3e65db8f8669f7948f3335f0da22da8b4add56635756a660400080000d315002030100c88c322b14814258226b90714800c83945062489acac35194a3208831d018a3900100000000c8cccccc08004d764550068090cac4e5272e174690914cb74fbad6e4d3508e5c5cf3f8dcaa5edd4ce3b878f7ecbfbc0d77caba119284b4321f5fad0cced96919b9e3067219bcc27b3f67cf109c0d7832d8bd0772fede90c140009c299d9e1b8a89d394eeeb6b0baf176c15b0bfefd97c288811aa3ae3cc953e70d61d0b2389f1de83f0dd8db4ac579ad26d9a7ead9abb49e838002fa0909c5b225af2e0b4d02d6659cec0c12959e58bff517e132082415d1273d0cf15c277dbc5bcb1432783fbc4389d938192527d6e919cf27882a875916188702f070e8fe3096a2d8f98a2516b392d9f000bc64a7b2976a155108b294a8a1f22522fcf7adfdc0982591683a22de8afc080c85f12ca8725ab5677365f594461ec8ace32875a3350da748fbed8824bf9e141c5f5631341c9609e0dd26a863e6cb5e60f5f5664030312a9815a0ab187f6652aedd04f4377a675e1cacadb106e320bfd11e32a7afe7dd459f9a350fa88ff3449653debecb5393c894a39b77c9749b5ee03f24c72b74a9a530cb43a19c0ea8773a98e1773f940a5d37ba45563ea78f7b0930a3e6a5af128eb4081a36a0288929d8792ebd67053ab0f19881a15c80d3b0e9354dccfd2e724cad29550b9a72c90d66345882e0fe1a0162effd7b79e2c160dd58bb71d7b43c3cdfa736f1d14d48efd33808a9d0f094d605d479f50033bb6bb26574b819d80c0320fdcf262e3608af82eb7ee0752a3ffdb0170daa431c5e13c29fc85150b3e688c90311bc78acdc18eb17bf8ed84b87aeb852d418711605074049bd09a908f2a1a4307d091a10d58167607126e04684c7d5b093ecfa0093c12d1659edeaf7d3ce35ea901569b86f32d8eef9766be6b3ecddcf6cfe01e38c4663ec92adf8fc5070a298af1d51d032ca0b283c3e523bd34ce0c479875a6828cf0d1b033ddf23ebdce9372ac3b4d8be0fba16376d23faf1e78cc7a759b5ef1274c2d57298b584b0bd0538de0f32fe970d0723c374cc9f4ce583f898f8ef12ec33a6059421cc71f932125421fa95c17edbf96006816c46090d8ef10b95022d97fe4ddd8285683d7f266e1f0c582e6bcdaf3f7d6a4c25f9c4af7cb482ea7cadfb48a74bceb786445fa358fa1ce0429bdc2994af9b7b2703866f855e4f11b6a8d721d0fe4c43f9bb7556529e3c1f1253bcc2a00b029fa89a38bbb7b56b045b51079e281465469b7c927ff8777f0118b82718b3091d6f4399cc2bca8e9e8879ab9fea11c80a8355be86b820cabfa648d192c660e0fa06bfa7e6bf4d7aadd5f518bbf693b87ea11c2cd799c204401dc26a40a1206bfb55e7f30aca9bc6367f24724ae2e154a3387f11f8b1ac29cab336739a93a3797d3095068293c973a276752dd3902dcb1e8a29cca262da4f58f20a8a383f46713fa30486c8014d76909f0584a06829ae885452eee068f8fa56d30272c33ac9a8a37627b0cb6e605f98633d447d62a030332aac25ab8ca87b8470104f2a8ebe1ec035af03a9f0ea0d50d2b6951a0f143444fee6609a1bdbc12056b74bbd988da1480567882751ed1f73b9ac9e2c9a027be4e4a55c2f90b041cb738c68ab00e97a41ff8915122a595c9f206e67cd716c085d0a3230fbe3bc6e570f5d3c9a0c19ea0848947c2ef2859e0e3760143bc4b43da66ad13e1cf3cc5f20b84eb1816ab63f45e691fa01755ecb79c07f3f8d6b663e72066db7a41d9be2636c0376ab7ce885e0157c6bccc298679b0a545c5e564d8edb9d6b579a57e20a9609615f407d23701d603b048915d375bc1948f327948e4873b0b8eb5a0595f1c80e598fc4426dae47401ec38f4f5db55e0b8a91250fc541b17f590836cf550a17ea161e2ae0e3d5c94be5834ba399570249d3864f2d8bb35ae1ba43df43679fd94d65156f12e50d6f4a572d69ce013aaadbe1c460fe5fee9734112e042a6a343cb9eda0755e6246727209af1caea7cdfe801af90f680ac2488a23b7a6e44a190e5927f81da30ab7dacb9602acfc33b9a2403d73cdd7339a33783c84c8110e6c622307dd81c45762dd43e00b90b5598a1182acb0f0928dee8d01bb97e332a2e932bb4ac49706bfa16f2e3fcbe7d1da2d2064147ea35f5d342a81305da9181bfee18959688005ced48b9b65e9a107572c531e5cacb3b280e8bbc02901ceabd217927072ce17c3e352a74163691a0f49602a8a658a5f74e0957bc279532a84dd45ca84e8d7d4490726ca75010ec47a21642064c2a334854c7151bded885d5306320dd813bf425bb1b414d5c270afdd5ec6fe40caff9508d593cc4624db177ecbb8c66f66c9192f3c8fb65e32b76ac5a1b16b695f5181e94458f30489539e9bbd3adf0ee7872f16e3d0be956220566f052e9d33484d1ba82061da9a60242e60a1913bc63b3313fbaf22decdf6bc8247fa8fe7d2e164d45b2733807531296780213fcce6d27e45b804042fd47b0e96608a2b5d92586d78f2528dec2452a009a73c3f59e376f7de3dd37de78ffeddb9f64563bcbe47015a7078b1dc16cfa42b4dc5e2e8fa7e42c88f0107af3379295bb32b2dca8e8a6c24d6ca6782fb9943ea3e56cbdc07b3a33066d32a7374c864965a861364460315ff5e0a8f4c565aef3e8facd914b1e409a425b920bdf2c26d1ec493111caa831cb88636eca6c29a06b3408e3cbd663e0f6a98c463b206dd23c6abae92e0e7dca682cba2266c46d1753d53e6d4bba744bb7a2fad8935971aa945120232aa8fe44b5bb1904b5b2088ae5b428b07c64868b0a9753bb9c7b5fca8b8ad72824a57756e621f0647087b3b0af07477a085039b948298f8d5642575ebc60f6a0c837164d8e94ec2a413e72173c706a37493e825670c29a36ea46cdc7304efd5d2a3c424e048c714dff00508ace5825908b85222f72fbcf05e992c4af874416b41abcd4918a191a89117c833738fc001eeecd54a1e7967fcf9caf8887a42b3b7832187fdf8bfc94b3e33c93957a132909c797ed2a15e1fae20f974632ddd0d003eba16e6fe5e4ffc4b911c14a5db25e83c088aa78accaeb93d89c16a504f34138258dfeebd3abe0cdbba5adcd06f862f5b31527d3818831288cf6e48c7b8f8ecadb8749c6ce4549a640fb21285c23104192ce0f20bcba45b96151bb031933c64112d1041bc0d2222b0cb2e3d5b6acbf60f25dbaae9eec4e85c195fb2dc5a626d210ea281d2d31427894b3fde5d0893f5bc124ae72c0e410856fc24ea7a0cae8684676c292d9bc498ea61d72517c0deae6ebf4659fd16b9f5e1e5abd9fb1434d9a122c6754f5cd316709688a0c663acdf49a4ec455e0342c1fda82bed7a80119cca53645bee283f47becc0454a961b70426cddd17a49fb0dc5e21299855caed0ce6b1e97b2428c038c824f36ffd1186f36ab40039775a8c8a0c25cb921e70425fd72e6791bcc69559ee827d01ad3da9e1aaeb754fcb2515d76c929f6f529101b31b61f88ece5b0af34796eceaaafd979094dc4e65ed50c1fb5d85940575c3a53e635d04f34a3a1eed53b2f0be9aa8a44720609b2b9b03d1865050c176bc6249033769645a1a56aa92a45036579d96581d080d3361111b903ce7f8ed046981d23de24c0e7e776342788c60b630d100c1cf1dfaa05222fdc0a58e7872df20c67e99347877404a96ab091221941e5b7d023dbc919f71e97a0b326c4cb530cd8c0b88a6f6484fa8d49f3c5e84db67ddfa4e939f5803729749323bee9c6acf2460c858944c2853542a925d0419f8d07d2c9679ad9aa5ba00741788263d407f3770b822eea793ac0c90b0a0fbe5d98012ade6dd2cab2b7284413f82e919e210b25e5858bd6e093fb600aa80b1eff9d563c4ee61432eb90d3e2a4287e0b832a2741a0b07bcde6613c31d0a6894537de97866d5a26cf4969e297398e545c060e6c6f22dc34859ac709b38bcdd65cce6d484c7ec685b3eb0042113751a9d9e4619b88e0ae7691d0e3264220723cc6b5a1752b91a40600d6bcc298eed195d31bb44eb46da38e284907f658825e88cba1eb6de7216de26fcec7590b0cdc0b66e14de4f80a23360b063785186621756552bcedcb1448439bafa2cd3f9faed5b03f14e099372cc38a336a4a0ceadd364d1cd572360d93f9f040d04ff2d9ad2813cfbc439717052a9e5e1890df6615861d368de8c03e116f5e7948a5e41a50a0d4651d70a2ac24783a3014d109c3992d0d679ef5183a3a9c8b3e306c3d9c9b486a93a3c110730f974ecf93f32b7d457a867d5380f51a8c8cecc9024abc7077599b126078ae48a5489ace5d1525f1ec0ba75f79695c2232d4fafc0634967fc1200bb7892964648bbf19b307ae844a9f6ee18497821dd6165158f2ee8fab200c6c0ff4be08aa0b25139286fef5385d5d09b06d0348bce59c8a000796baf472f79ce104953ff03cec5dcf4c805dc5632cb4b784571afca8234a54996c25b25da6880cc3791640cf909205169a9b2e8f1d731e7ed8353eef09a9cc33732eaa4653f83934aee19e2d5f8e52b5d0ffa6fbb8a8b45b31ca766200b8cb24cecfa29f4731e6aa3e309c5f8d402cbb13016512307ee84331d38cf957226f1b0c99fd6ea6a95e6619e6f2d0b054905ac94ae7735fcd99a02640d9474affb92cc69ac50d82db2e1764aebf9907357585b1478cd76441bce3a25654945062386c7c78f8f58845dcb943aae9d35e0c38106825d46dc0121af8e8fba7584396d6b8f832ea5869ad802bc0fc551722600ca27f55fbce6c7b2f8ef417ae2ce23483b5d85555e97102542fe92fab13eb7b35ddda44f26d597ed55e8abf2d57f3aa781c8e36f96d60a4c76a3226bec55703369db2d93c916ef2ecaa651375c8acdc1496a63e3d961ca8c4d00fa2aa616f8aa11fca40be6619a2d158a7c0b733a9fd4e39ec88ede3b04fbdbce3f164d4647ac8f6f21bf777ae5a1ad76d1f2e7a70dd4ebae5f51f1970c0f086b59e10f60a6ec23f70b51f3b95b11cbd0ff495ea26267570cc09dcd447e6c2c3c36a522637b870360b8f8c18129cfda5ad18235e8bbc39210e42c125b1cc0422642e4e95f8ab1a2163d6c869035cc49dd0754cc18998f5a09a400e3fc49d95b22e490c322568488357842a7fed4934117ed2bba9f437b6b00fcd2dbc71551136c48780911826f67f8ec635b697e22dfb12ebc92b7ff67da460e94f951364755fd3cd9a322a538d71ff1ff4eb2ca43f61cdec4243bd67153034455b3f488c08492c332b82bee5bd0d24b61e96d94852587dbe1ca920b556b7ff97e7cc02917bd12e631b28c79d659ab28e834862d0151fe721c3893a2e006bf645ebd300560bbb7d8981bec3e2f6e3a4144c84e8804a266cf31fea71dd23727d586c2a6087c82cfc4731a9c43f4bbc48a6c99c29d0cce315bfcb3f5b5041abc79b0716485c27ca185f9a1a4c23f0904836961f84325e4e9251e7970d36995d5f5f95837a19bf8e2a6473924767022813229fa084a0af8443398108a3127ffc75997436b9750006db83cd1fa47c8cca8ef725b41bda04303d042fc95f3ee460dd62a00b2ec078380d70f815bcc3227804d859db99444520212fab832dafaf4751005c52ea2e03631b25c7ec6aae833efc0c2adbf25d15234468ca03232d09440686d6f0fae449588eb180da07621118a119db0d2cf60720658ede61ca4b65585404c3976561ea455b42a198879d75f126b44f513455902f03d242d283179746ce31f27e67645a37aa65d83566fc5195fb287a8876b7437e548477fa79ded5bd3b3f873b4968a86cc0ff075a4948e3bbb5c5c951291e89d32f678b94028c4cbfe0c5a930b84ebf0e73adb228a19355c3249f253b9ec4443d6262bbf313544f969d989f71d65a2f066146601eb9084acb9d885b262286952f025eadee19d91dd41923685994f097b5cca5aeda6cbb94c6cb1c6873b7ea2556138820e711ccbc86e0ef99f522c2ef39058eb838f1f66f5d800a02233b01f2f89d50ccfe008bc1e7fef1333a81fb3f0b3ff364c8d0a0241805d1dd12bf70686c6d8ccd1663dd6a722d6408b5cc476b45d5dbb881094a538ef40a7fabd836c7540b6a8887e499271da8b1a0c1d159bedc0a1ce45a7926c552e12cafdf1634a69b3bd0b72d1af8a17036e224e0d9135ff203e3e9574e4af3b2cf995f5756a1b72a534833df154450614719478f0b2a0c0f925d4c80d67d1ee3e9e9417496e58758f4857f2dc789a34d51421c379c8b8bc45f41062854a18bd5eaac2f5fcc2e20d5ad40fc2636ad462b52565384e812bf9ba6cd33a8bb4317b10e8edfd446ef6703dc93e5d08243962604329993505f7e5e42498b09dc8ff98c8da68374eef98fdeccfa8f2292bd3eba307f8b7db45eec4f0b237dbd741860627b7673bd58699b398df0c729b74271cc84afca457e8a8f421a33b3b4b18389e78847a5568cbdd4ea3312d4ec16840a898d5ab7b5f8cf4f5470f6f3ba34a8fccb6db69921388b7b8edd500dd1f1604208c46135996b041eee3a390e11984043dd89f5465368847e16e3d99d1c1b1f6b0dce8f7c8c0c18ef3e142a4e5be47c43f337e0552470f06a7b751750c6b9e6a6600f69b9f7d1a23a223f5f9f8a7605d07589380746fbfed11f0efba741a16586f15a11b1544b054197a0f513cdc9533111840cfe4f3dee09b87f0af2758b903608a41cf9ee438a935de36dd08994bb15c326e5d7696b7b2641621f7f1143eb3389797ab0400ec986a4e031fb372f7faa9f5b7b2227c61ca85d9eff6412b443d979acd663894da760f50d63a7a85d747dffa68cc4ec868e678e2a8e8e80b42208f782a73f30f6f37e4135ceb16124bd3ca9e1e35e5b60447b30545c490387f246d7dcc6d13c9ea0c1ff8cdebb487d3c2b7b16cb0179465e66543e4f00e3e54bea4e10550a10a3df707b90f7e6b265093b5c2bb33431e8010e3b6589dd256675fbf09695e0fce68a92caa1959e257a5d2089553bcc549b982b081bdd51d57741dbd7dab6cd1152c469ef6839f6a67eb19616c1104aa14e80e91034cb41b63294c6793e44100267155674b1d35de3ce2d68680a7ff4f0cea1d65049f6a0b528632e6ca659a2edf121852c865131e0cab63291bc0a50d93ad902f675a9239de3a9f23276de6e93d815c3929accdb7d31a8243a233fa007ac2aa832273f9ac7ae5e4c193d005fd911be9034dbcc23731c2f6a1755371ee4f7bedf4d300f95d8cabc1abdf6ec25576fcbf8bd289eddf40b8987e0b6a88a1584c83f093e6415eeffb38000b861c72ac268454914d9d81292cb3879d888832a1d24451fc2baee581d9330fd2ed82af294412506c90d1b45c2992d35c1baf1c2ebdfa0cc52d9571875dbb8468e99ca14a87a93e5c820d654556e831e941c5b839a81340a2ebf0b27903ee3a92cac174e1c3676e4d8436f0b322ece8800fca4d4d6806912d804a61489f0d726ddd515eef354598053e4c544d38449e4d3cb9ccc402bac3d13a825f72955c9ffd5335eecfe718f512018f75f04dc80155a5dca045321e8701c9db57f0ad6f2bd33e2f8f158255f93d71e43bdcbdae458ea2cf4ba037c453b02d51a12d41f178cd9f95ea5192fce56d664897fb1b05433483325ab61b3d7c0a4300c4e00d6708b73424485c9e6566e2b38c413564fe151c8bf5eb64eb818cf37c4b9d6c11d09b94fa50598bdd12e5d440c6ddd0f734e566202d7457420673feec9995c6e2f8ca30b6176294916457b0bfac9fa0a714f1dc4d622cc1b8a7d7e158ce2bad464a976234e8377c697325f7a801cd6e3ba004f434ed293b124788f0e9f3db2dc7e7ca2625b7851f30c36c96af405b31a63f65483a0e8335594ffcedbe19aa52281df3ae3772581fbaf0412a9a9e5635002dd70a7746f0adccffeafac27835465f58c47deed9b480496f5a4e9bc0abd57729542545d8681f0ba633cc909339732856537a5ffd618dcd12433c6243140364b04ec425e047fcf14959601d8aaa6b70223bfb1f703ee4e4618b7d3b7b160084868357e46da9ea5eec5fac8ae4416713bce9ac787eb349a780596121eb2f96aee61284b4fcd9063ec1ad49f292555ac5820c61e22210b04744b76827dc1123c33c8ee44a70c81b73c0c419c839dcd159b15e8da3b1a640a71349683ae6f85568442f0bf58b7ccdbcd3d3ceb4342159d310dc907c4a80da8656493370293b6b0fdf21a32d9b1d9258bb104a1a8f1b243cee0efe79c244eab3e50ae2b7cbd08bc2420ed66933c667f8c6b6102e0748bdaa9bfa474fc6843800522838d0bf5182a85caf3cb45f518b8dda852ccfb0c07e0aac078ada6efbd09fd5df0d6c163c4cf8d9848158fdbc17ab28321a280a3978fff6cd5a69ec7a252627b1ec6f2b5d3cb2be83d1406b43b76c634cccdc82b70959032eb6d847326e586057550987d871a3ff7937bfdc8fb693c960e59e728044877d7a06653d9c14163d61d422d3fa989522889190ac99ce267b2af3323833bb75065c241d448aaa549a2e8cfd9638e2771691b33cd219657f32be764abe9b7cdae366d63226f1e222b582cf928b25860d83efdaf2296cb02bb049d7af4342ad672abcc05c825e27cb5b6ddc48c6dab92ad362e67464259f3209f40b307356402140a451cf394e45908a4b867071d006e9fa9d38f78642094be8ae55e2c132692c5bc210ecd64d80570598cdd4b4957c24099a6b7c8d11b301f12aa70df428406e594afb77dda20f2e5bea61c7738ba61a8c5c68c127984b5cb7f97d5b0109fa37f1dab3745f4e8c24b35c32ba08ab6d6300c51e4f65fbdf4584015e0b3e35c3f68d5030404f4c8205194555d032fe6d61516e70cac3ab81701d2ae1511a849ce3094812c83948b19887d1ea6142aa831ba0ebbe3b1deb5637eeabb41ba48a1914517bdaa0fb5bb5f9d7e5e01388892792907a5a4e190746aa7d0793dc2af6ddfc139d797abbf52e7af62e960ab6d2f580147b12ebc80bcd0f9c4518773d76e7451bf8568f67a6e498e9ae5b8a81681ebd3bfffde40343f723d778bd5c07392284bde265e9280105d348c25a6e18f1e10f29e2737a5baf3fe602d5111d3cbfed867976b2bed28b81e75b05dd75cda60b63cef8c524eb329bf02108070343bb8ae1188468e6b299bc3680b1f33640f5f0346b35548ff9de4a1655ed8646a25ecb6ec0014d8eea1caa28e972c6631438d8d395aa831939e4d725f25ca17799a365b604fe46e5cb4c52096e1427176e26705e93c13c01f6d0441132685deb36e0630021c4eac3f7c181c9fc22f107b5f888e1fa88c61f3d06d7d4cbe304097b0bcdc6f901f7c892523d2fe75d5f3c67af2b0a5bde06c95d5102fa80f484c511043ab4bfc177783a4552a98b0e1dd9df5399aa2112df249f6e207195fe6e2cb6684d997283f07a867d484f4634d8c0e2276b7096b1ec33eeb3db2fef0cfc004ae7d2f3d519eec7d063d51d47bea170080ee0cfef9d540787d2d693817911145b1174ad027144987a0d6060ba34947c863a172bcfe99490859712854219bdb249eabfb0093f1e3006413d9b0a4c067a73982042455b02b6a89b9294b68f53a10baefa7c6e81707f73317cf9558fd5d1a65d327810add756c01b956ac292ef51618bca98ff4910db15e8cfcd4f0bc07a3b70d6aef62136ea9d09ee5176b80c23ae3d068a65a5fd3fe8cc63dedde72da4dd50bd79c2b6af510706bf4a7ee17aeaea88727f171c1caefa927cd048265d50c482d04a2f41bc91d1b37010e2a42a4c9af2d7e87661a3a36334fd1b1dbc885a193f5c3328b08de1fd270c413a8d7f00554afe2fd56bd5b3904e5d9fa43958ad873177b0a050e2a0cfbedcc13c59b79c359acd477abff6a10742b5d335bfdbddd3b12a91ec8946768916312b656d0e8a9d375b3be8edb79a3f02dcf1424c8ba0ac092087be73d214e33bc23f65256e6d2621317690a715daebae09673b76e060f6123091d3223e1454fd02033440aa1d91ffb39a3b901fcde55838e9062e86c036dc730ce580852a66d14ba643b43b0be84701385392686d875a99d0af9459dbc0afc2c7331f99701e69b3d67c61619b2f72650519972d23430c1f78edc97835a6e048c64f493b2c90643a5ac421616d938bd5d467a39e22fe2b02b5cc43d19f48598f34f27f04b8bb988097838ac51219f05d57eae41677f64b0caabcef34f14434c920c448f3a37716ae60769c486b2ae840e2ecb3c0190879475027206eb4aeec2acb991e3e22da458d4be2f906503be4f5f163f45ab39e3e2c0e5d801d729978aa0f87f8f68ac94b82005257c2da8e186dae5841bac65efde576274de8ab7da2f427c6b3482cc43f2740fe611fcda113b4ead11102f703836c298d1a5642026b7f10c3324799bd7cb06607c0ab6d8f8d64f7713fcf6777b5e81f49e8996d9170c8603f0ae73614f5d3fb62514546f6e038a5a62a1c51261bb2af86ed52145574d23ad459fa2863ab25cd50f60b069a3cbad82380b5e9e70c4ad5c2aec30d2a1b1a4169882f5e1091ee5eb2f233e24bc0c401d0ba6d6857616270bc22acba48e07e385e5f51b4e4bd3e42a7fa4fd83842bab3a3ceb0c5ebb016356f8170610f7c29129e4bc3230324805bf83053f6f4a0784e74bc631e39ce4ba397578849ea63e484b86de937b741e3313493c76b7603a3dc25e14107e68de23fafccd502367a948dc70644de12b008eb39278442e123b45a0a096f5bcd9c2983c00dfa32c3fd34c1bd138fef61cfac66950e82550040a0861f40f024d450129711ba4af2e6e1d2d00c42e8eb5fce406c81005f75760ceff5e5052102be0d0a043cea7dbfc22a9ba9105db6f1f83fba8d7d458103f23225541d268d4bc05503f570564ab1cee8e924460ec869753149ad2d2f3d44a7c45f2806e32bdc5e1dba731242f18e8f7b91a728f4b9e9c86c276f70ae75f4c32505dfa85c74006cf6de0305ca420906d1f44c8c6bfee34c4ff8987ee2d0284639675e305166a9ea4f9d7696ecd377d3681a237f4ff8677e224b1e3d05a3dd1d361b87d2325f6b5d840b8c1badd426b1ccb5d9f457bb05aaeb12e9a315b17c0b370c1684ad829c53f8801d9330fd77ccd9565e3a95373d12e3bf43fa898b91b8e0846ab2e8450c2a641218c2629c22f6b7f05e09e075f6296c37cbd67053dbe8d76840ec099d1f4f85f82685849dda20bcbd19e504a34435d706cce1f5cfbbc461e1646af45a9fe100dba44d248cfcf468bc8471a1ef9dd41f496a76ac44dd0d1021f8647c329191df135bbb9edff229adfc4476374bc8f2ba59a6157cd4cbb4be42b5f86c985654f2ff63a6598286b3fa81e2f830af6c83411788917af92a176e934ab926136e77d6fff66d7e7b20f676ab511e644a5261d9a113a4ead1522a05739a1ac8930f0eb1c50d4a0473b42e72e3aa3b0729907c4e060c58189a9faec210e1de87de02411f897d975d3fb4f4bb691b04fbb5508cfece2f1f7b87bcf011d4e4bb04f965d206a2f044ab1f0c54b389c80df30d935e6e99d3cd995e8b4cbbe96290db07d7bad3b3e2efbbaaf899325bc6cc3c8c121d85898ec627beeeb9634b651362970ea30eb9f4889fe60c93858aaeca3d5b07fd027bd25cb2c52a260b28bb92b21e87f20004ead209f494f5fbe868e02881349e1d0f152ac3721bbe79fc6b381cee18e5d79f3025ecd6dd5ff4a709dde9d1cc5e45397f323f9555083f46ff288e1c265f56eadcec40b43c975f5b7e177b5b5e9bac24590860b708b843cdef11ab8908f460f47eba457ab20f7388f4a0398844ffc44c53be9ebdf383cb392d1838d90b173605b0da0ac17f45503336e371fad1b288d23fa35cea9431bbc646a36e29a8c2237408254faa10ed68488439add508733138e3d48866b41d04602aa010479cf6cc15827e8b99e02ff6c1f9d210752cc74ba3347e8ca84518dbde9478d76e3b046d330f0cffad5734ca1f12a6954d529eca7c6b044dbf30817356e1e1f10288359841eb50357a8179dd3acd358ae3878a83594db1784615a37308e86a0b92943b004c0dc9cbaebb1d791885a65ff8d5280e7d5d3a374bb03ef3437f2e088e2393aa2c6d4f8521ebb5617143b0ba9ca603e9b27b161da2aa48a2b786c017a558031862bdeed1b5d03d9e454b7ba60ca0fed15c05b3033b454d95011f473a8cc21f366c6ddea6f4fdd673668af3025d5c72f4dee40b4f264a77c58d20904de412daf531a6c40e30e57b4286a47187890145577e4e1f6434d25301048b41f31b8e3e6dbd7b8ecac2ad01d4d93ccad11cc9d1900b9d2915437e27687f72d0530c62c771ad7a709f340e2767b589117e58e4ae3b894f01dbc3d083049ee60abcb6dd8c4a1d2c1e93717323a6310dbd0161b16b5a5ce4b3f0807c6292cc4f836305876bd94afec72ec43b7dd323ab858851506ae382011ac4739f4a76e9433950679ab2b79523fe489f8c58b2bb4ac9ae0ddba0148a75e7dbbd9a11cc9fb3e44a4bb23bdd09622a75b0a418c41a4dfe93dfdc637fa35e3170fec82a561ff6b898af20c71ebfee6a98ad5303fd6dc6f776015ff5d74d0dde46981c1269b82659c699d01a944f67e124bebb5b9131bfd63408f11f9dfddcfb52ab37e1f20b425b5cd123dcf237a686b289fcf06bee548051196e7166ea8c518e5b9439c93b2c43ba5fc9d2c8dcf6916a3a6a49c653efc39b1cdb1b6e3417b1f23316aeaaf8bda6c0da2ed657e079804fbf4fe254c1702bd8e2c744ca02a785f1745d10c719dd133d724bed31aa0db05b73dd00f2fe5ce85a04a487edc5dc7f21843f498a795c62ab83119c025d962d27d9a8588bbbc0b930e8365470874f2333823ebaaa3272da429da2b7926932a32f1daaabb7df1cfb6b98a76a52425de8287f105dca46f5560a60ae98d02cafac3457a83181986d4ea0ef3c83b4a31c043c6494c68da927c51d6dabcf0fd2b52907fa8a9be5f2ee2b16d4a7605d09e7d9e0c7858748e3101364e8f34a840e2c2bd146cd158bb6cb0bc8dbdc1733819355851d6308b89c546484e520d924911e4fa2f2fa3766762d212fb1e9bd0dd0d9db241b8445509b553d8659f09b95759c80704742675fdb5e5890410f2c0e8a8ef1a0f563eaa1664898f6eb5d3f77fd4fb22e308bfe541fe91c81fb812fdcfbd2149dfa5905a264f2dee89af99d4ddf0c185439554dfb82aaf82e0707a2e9380897955abc11ca3a4252971d691ece2d992712f44af444682e6f543b0f7a473ac5dfb2e993438d82ac18025268bb1a1c0e4cb4a4c5abcd56d2f557325880d64fb2c47f896d1b7e7072e6fa75dd768394e0cf8a9449037021cbad12479e08f0ae9b799eb628a6e224bbfcca0846e466673fdd466870748bfdad39c6229e77f6af5dcd5186094dc2337c5a3ed37442a92d7aae0a7726342cf4dd10dcf04f996005dd7d5419ff83b80a6ad68d187d8d72e322e86029596c658000c04e7aeaf798c8d5c6e34b4d13042804e86e1a88bf8431658ace3c9c7700371850a203560b8121ec30c05806252885462125875863fcdecb595db7f680babd532387124594c4b098ef6c970decbe1310e24f7f9c4c6db1996c77d30d5c337ab08aeb2303dc28a85902451f059edf5ebbf9e6ddd358f89a09f84e349f03a8a11fc72535f9080a393c9de66807f6efd879cdf0ed5624713ea9f843e9aecdd8e323d3f88a73ee7baa57fa04b68e8bbf1ff1ae448fe2b0eba8c9f372bc944cf45b2abc9159a5e07bf725e72396597b02f91b66f452ed64f7c02ee49ef2d654cc932dedb1f83891558bbd293cacaf3bec640cc999a14c69462a356c408cb998206560c26c3be11a4e537284d239b7680b90482e4e01687851b16e73514107806d19e38cd237edbb9a0f8272e0229b41d2bd47c7cc2a6ec3312fd7108de86c5a2a5d113459e235fa6228203f9925faf051e365164dabc07a9230b3b8268736886b4e7707d81dba46db84202e8050c4c3fbaf5cbc6d1d20513a8687c451181a370f0ff24d8ab626d193086b052544781024a83b7582dca493c1a7b721b841905b01e676b070392a70893223b48c6ead14f7062ee99486632de4af155efcf97e633c53da22365273d2399dab13a3acba4ea86e2067d0fb062309961498725bb788a868834ac0143f9ae2559f21bcaaf95546b6b16e2c02f1b59fb9529b8a1f35e895e1ce4a745b443b4764a6aa15f3ce0278f04c863e4c5f12e2212445ab9d9c2535cdac03935460077b26878d9f5fb8070d3ca341ca1321ede5f3ba8594a21de255cb361a292c651c69f013a132c0286853d62f797c7b966a61d673a3b86c2c014fd4516e5f160fbc7901b3de4c74872f3e3ecdc124a6308fea2c1ee616c82a639f5f2a0b733fe1ea551eb2e65d0fff0400a5a1afedd2dfbd7a159fec1454b8945e542088cf0b7272c8495f23aa292904a6ee7a67dfe5ec4e8d95e2a49363f8a006efd1911a4d510d494f6c599face891405e9f04246f50122a0bd66cafd7e8c9c4563bc6a1d8aae49938a7302703b51907859891ad5ff2219a5920f6b8cbc1a6089b4006998420f7e9a5aa99a0814ac626be4a5e5cc43888ebe46eea0c4bf3c7390bed64cbbc41621e29e251313e3a93003a474aed799a81318376e44b87312e7cf22c3eef6b111f42bb48038053b658361cf28462e8e21253db7320776805cfafb63c2f0af313d810879a0ba042a420eb972bc057fcd2579a4f5699895cfd9610d2cc98f18a4d478ebca67637224740dcce3ff181b1f99fd25372b3a6bd9235f39b7b56322be3276a01a51cef5bd05920efbfc68476578154ff5a57f394bea3e0d27f5b99c981d3f1fd42561b808eb004571c3c3d64da346e8ee5d27d3d51e2097532b0a72f30d62a458d5caf62567917a57ad1b6a30ffef9c73ab4a36928370f85847f4d79c5bb21a281dd117062ee858ea08bd801ea741b160bd68dc67b488d2f13344de86a0a7eced8749ed340eab6e13b7402f57c6a7352db2a8455eefa386dfaf36a7016fdd7473a5c6c79ccde111f0a8127f697e1fb1a843fb4deaf981ce0df485e44f4658292cadf480a3ed499f61ed5c180e90b2aff1d821859b22fa1d75ee2779c55b473e8e31a0c5e1b0867552e0e8c92590c8908848a1d0751ad47c09a159be22e275597ed35fc1e7b54582e7918437f49179f4a65a312317ccdbb4340ea226e8b669b2cdc08d08803b8d778015d1f364c8715fbbc772bb859ec7bf6f8d0df1bc44e92b1a0b0935cbf4f53d1fe628de8ad8a2ee4267f8cd846976046cab4ab3bc16370bc0676f4ec3bf08e3f501cea1cf9b04c86cf1e2f581373035ade611d7f5a794ca4583e53aa4062ff01440908511771e2740f74806ea4815d9325b15a899d10bba1f30d48f2968106e56d5f6989cf767f5b97f0ca4060cc0ac26827679a8f72f8a3bb89d8571bbbb7d75d47bfa0ea734879a60d2ef25cb5d28a20b2789f725ba716067e290ef49c6819459d3666629bc4df416c77e9832f6ac75c968ca7430d7a5a64543b606c6bcc45baac345d1a98b2f7a431eb59441e392c9e6ca94c891eb1861d7db4ffbcac352a44a8996d5b03df8415d533ecab2f7331441d54ae9351324dffd5d7146305aefb5bfbc456fae630aaff18165c3f745e9c99ec98b4e6feed1d30baa636c338f4f7d0bdd4e2c54bd4c7e146babb7ecb27079a3affc18d0b0b0c8a113f696a4db11e42e87a2bb24a87060e858e59d8896b020aea84d129c8ad24a6d127f7695eee8748f66c29f3664348e4e9d04177bbddfff465276d1ee778d343287e577e4936a09c24402ec890d2c8d55b882431229e3df9644c8385cf13dc20be159e820676ab630af20982ec617ce4d97bf46c01d2ea658c6e87317aa41b1bc9c6352a79fbfccb9deab1e493debc8ff8622a9d3c197919aee31b6e1c979a59b7c4f480a90113737ed3c9cf58a0d3fbd180b7ba54333fa1edbfa7200f6c7b430f0bb4b2460a615828c07c1b08d0e9f41fcdf6c050d82c3380019cec778b7be4f65ffd2c886b81e622519bda74c8b11bab74af915852dec09488d658a10a3be62bde8f27bc33b8ceb580112658e3c0782b83ba0f551e7ec21de8245b46380f62f8db16b83f67cfcefd93368422a34fa0054e662c40e056202e7cde6fb259760eabd16f0c3ed58dc655fd85ff540a653406a3805b4bf8f852d2ccf05c47986b3ff56e54f1cc5ab67a92d9ae54def0d79edc4d57186571651fd2d899fbe74f94d4e013684230eba04085f8cbc0bb4637edfa33c1a3aeda46b7768e17b793f352c401d011aa0841aa796ae56c002c9275af2684af9d45f8d6188e62549565bdccfc5bee793cb9151563cb6c028e4a1889f310388819baa47a8361e1d6210f74072e026abfe0a3ad5bd029a2bb2692a092f8b5a28a0a9e90f586162986478e3abea4cddf1ecdc1227c842bc5d69362797d9e6e9ecebab7ba9aa47bc7d4d5f4be8cdf9ce177417075e85aad0fdd144e2fe3aae9ade2b0d69588669bb08798f0fbc889ffe9a63921dda5331cea8aa3f4e0765d4539a5c3fb247f970ebbced7ed6256a85922bf988b7a0925ef6548fd81d7529b40030482297f04eec79d30a75f0be9c2e62922d2717f007e4ecdebbaa0d171d03e2441e37b43e5062ffa02930e9e5e3a6778b6665474671f2182557781e6ac080e41f5479abe6a967db4bd88668686ef83db165da98a37d61a9b3fbbb70460fc0ee7a14a800b43ae40724a45e081318a1399ec11a118b2afa2819d522b7d2a001ffa28425a9270ff6188b85d21ae2c0a411baaba4e6a1979d0d31e04d54dc808307a3ca6a2a1883d8831c586d874b42cada8351a422e2097adcb2e152bd246e6cbbd1ad4c385407f0166975afe36d492fa0d709da4b4000fc095e62db3ee17b714a1015a38a9c632f316b83b9730c02b3d907a27852eb1ac78d0ec88e4ae097f9db688327e991b4e96d9736ddc0f4d9583ea2e8e76829e15d572bc0854c125aab0f3442845dc09ce55d23899326fd8182322d67e9031fc3be203831f1ffad4a50098aee20d28779c1b68fc2931640a9994d9c346d643ab674e0cae5435af873ce38aa1a0c088851890fd05941cf1eaae996d7dc6918464c4a529c8f0589d204fa0784401d414140878e0ce9cb5267661a761cd60c7d10367026651944952c0104125784ce08533afd1f0350b5ec4e75d86bc11c9dcba5666bb110116004d6c7f7be55782723269f6656e75fdbbb0b6f06bbd706ad25105ca24d4e05768e8e6b4bcf26425e98d5997322787a5e1febacc6528a0afd6db7b63f5918e902eea55bdeb2b319fa07966384e5d527b5d0d50902b69a42090ce45404c1808248bccce933d07b0b8ba9078046aa1041abfd940fd89ee950fcaa31b4cd15f0c1c2ed77550543d8733502863c3057a0d47ee1c0e147479ec67119ddca55c8a790ff6f5e7f3fdbe11687116c1a72b37f34e7f78602e8ef802b1f87414f2d5cfd7b83c9273311000a60b6ed5875099a06e7733a3aad7a2548ac2efd3f3b6888c5b4b49047e9a793d674153812eb1dcf6ea0bf22fca9b389ac787782d9454ccd9fe60e6b2b738a792bfe28966736f0da6fd02ec5fdc6e2af0f1908cac239508651b2bb8842b7670374478187b6fa4f9df70a3ed355c158a1ee677190cd477d93d17b334d193b564f7e96254d193a97389caff103db0f774ef1bc8015878eff18355d45946ca9fba0bbfe33d8aab9af9d70b0a92c530cbc1050da47e5b864fb2092435828543110da5cc0d878d5da1e316e76f5f6ac49c6f59ce489e74ef5725eda2062496b70f65d98d314fa8eeb209858391eaaef87a9a5986a5279497c2034f0e69b46a11e1945c73254a52eae324a2412d0032335bd487b3bb2f01a4db4833d8cb65604ebce38f00821cf1c2587d93ce18dd6fe865db62859d31eebd173310c369e2a182b1ffeeb5d96abddf6b25677333a67e80e48bd0cb8d8394bdb6d6eebf0041b7f3d9e7b9cd76228954575122f502dad4011f9109e2100dbe367ebb097644619703da927c526adf5a11e022fe4e9b10083b915ad8c5d20d3f60ebb8318e323bc8e2eec933108a8058c66cecae02a2d23ade581c8e5ea583c9a531f1cc9b51bd831a70fa11d2037f1601c8b356632d3047fb7cc4923ad3e5a5d200bbfeafdb3155e89668f168e3466a8640e83252c4a234d04029dc5633742cab37fa2ca5cb4101014a47c18c6f2d73691c4e4d4a791be7447556a74ed72e9cd600c8c9f0c67e06ec6e756aaa10aa7e7f6c06044487de606260d5f906aaf54df82932688b4ece368318a84248548edcf548455c037d21a27985da09ab1274b5594f62b19b15e3917514b0742b2367f49abb2b23cc6c9c328a5aa97c9267f32c663148383af3067927b4c5692d2488f41f2606497a131c7b951614ea8b3fdd5a32b97cdb682b208a7adfaba2097d74de7de64df9cdd1da9f09e47e7322ec0b3d197ad38df54a629e79d9d1e7dc8a447034299cef28b5e6171924ce3098f263879a20181de12a3e15a63da2838029cf15f46785c01b9f53b3aea4186134fc886ddd7237e14721146f4d79ffd281dc74b1e386c9f4e8ce94eb99f4618f57a29b22809eca2d574425f81fd0acfedb8d3a5c7e8443f811aad4cb94c50cb8d407698113a8ea3aaa46c3e86c2685be8765fe03f224990e8c13b84e8aaf633dc0fcb9988d9e4bfb5a3628701fbffbba26bc74c4831697db3b60a61c17f33cb607037de8e7d63203ac9ebd79b2ca6a396f425a8f94d3d5d307ba8f733521b9da9ae1051e6a36eb477421fd3483b0dce759e55b4580516855c26c01943df6c0ee716157dc1c62499052c50090810cc103b15545d35b31e4f239be6558e653f712a9cb80397350443c5fe6f508165a29b73f3a0138460afe9b8243ecfb4840428137d50c78459a0705e8c1a4b5fd491bfedab3a7c49e64cbbc30cd00053c36e9d560b3799a5923a424b7b87991400ff2d034c9e9de4e47fecf95bd2334c5cf904478ca1952e95d50e09fbba11829b726c0e0c7ed2a9b4ba913137ecc8459b54e0533cc9c8ace9d9395eea3386ef6980342bfe170f269ce7bed65b54e024e4960e2a5fa5325b44f1b187015434e96f6b316c0476b7ac2312653464761030e8292b921e3f9034d0beb57e06836fa70586dc87d19abf8c966ea76e49b87c6149645760f7e2a7d70bf55a335a96c59d7972f99f0398fe13c667cac645f4a8c0926174cbce37e7ceecc73d8a444565b617517f1847f2286b9fd4ef4ad34ad28185b596dcaddcd0fa96c3a88bd92e2fd0c3be14ef04f76eb73b5925916948d7dea9235b4ef6c0b5e1102830932652268b36dee8b9c9aaf404dcd2b79fec018eb46bead6dc91e02e88b0e71fa22f82f1a598272cf58729ce69a6b851a7936282b85a8a5bed855f140e2a744e6228c49928d7700243ce97949caf42bf0bd87ce55b8f97cc238a79557e8fc402cf0f9fade5ecb69f9009fcce78705f77daa3e83260667d26c414ba0b25215d3e7aa232f6bd73a374ad97229a165d1055d3ae2f6011fdfb3eaac73d8f0298a776f5ea878abf692eef0da8db3d0b073bf8b93aedf2ee86f0a403efc506e9f70bba247e63d630eb1143d69241876032f269c99c51694eb973d33d4bc4cd4e54eb3f5cecc71b948fd379ec2494e4ceb12b8cc9b4019eac324b138421b94f970ad8d32f242ba895ac8af87f6a068f3497a5ac8b927481bc7f2a086b42f81eba9f455f9ffb815603d126538998b6010a9430b039ec8d0709b07628ce49338a0039158d07c13a2631dce700d1de6dcf8fbcbe9fd2cc63bebd1f499a96ce8eee47da3a8ed28231df26a846b48773d20781486eaa405233d8a08dfc910c410a918c810ad7ab5bd5b385f92341e508763dfabcf1ca8f4f2e059331c6f5b8eb7584847ea4e623ccaf98c0ab1c4d933f417ecb22c5d1d7479a03153276f1d1c69a73c2abcb283fdd1f59b7a165382fb02b43cb96fe8416b14a5f56c9fd85110fe6c388d10b7ee655eb8c29a8efed308f5450d62ceb24e35bc3a54cedf2c8e4964726feee2188fa10180a0394470e81d86beab13a7592135c83413940ceffd245dfd4031ee39039695c3d155ee6212711b817ba95d6e943609f4d6a64a8b8c258c2dfbc4809ab8cb792d3721c382dab3d422df2531976364c3dc490ef75fb896ad19cf1d60046d9d9388c61466960ed304758e41bc38de4eeb442fd3dc81eb54c1b29d9a09481b265c60e808f1c533c7b4435654ef31f1f6b1c88217f2e0df23115ccb83b3dc986ef297cc204bbbc8138973eb088fceb3f525fba3ed02cd4d874ba6f63fb3a1410eb7febc7edf0009010ec99a80f3d290e4461cba62bbfabb3b1bf6c5084fc6b0d28fb3b2d1ebb72c652a4a5ae93beab36e05f3f83855278b6caeb76aec0bce1d15ef42ae8f3b5568bbcce73a655749b3d34feed0285ba1737a6f855daf3139450c09e9a0114e4275a40ccc7ed808e823d9a28f4d836b78a22a58062ff405a13d1a728a54aa76bbc5deb39f2d119956c2ab6028fd2b017ad1d29af58f734294f96c50c131981d72cf3bccac479cdb69ab3a1fe30399014901ce08dfc5b951037d7f344427d4c1a10554e45f177c0707f7d440b4056fa169000584cb2dff459e86460ad77174bcfd805dee045ff003d3e8ba5a9b879a72eb2af89617dbd071f789738ccec592640f16ef11c623dd46a348a157c7da9f0c2843c1567d186c81313803e585cbcfa58fde22a0275f585ea28393bf0c522e008cc90f4caaa7299180eae65d2c72930c1d12c006870bd1f350eba26054db4405b5ad3d1f8b71d8455f2dc2640d3c31ba423588f01b48571798886b898340cdb95f31b86039f5758d14687554da8f7606c71e3a45c6444ea5d3b09985b23f1fd8b51ec35e8fe17a3bedb60e38da8df16294a17ba3007e6cbf546199f034f0ab8c76c42fad5c9fcd7efe7a59527e7308f259ce0b8d72d130c2f18ec6ca08336597c2e235fce01c1f8f1da88d519a627ac1239895422ea13780309c887895f81ff9175d402166ace37b853d7ca7859f484352d35f345edf4c931e373533034424cf8c7dc69206911ea6040cbfa50b00298ded2b29e9e8dacc1919559a37004f3f22f8340cbb1bcbe1a3237055848e0c4c96d602dbdda3099a284c9a1db2de75346aacec9598986affb2d03f94772de624007918c172325c5547ca815408451f7df2e023b91340e2de86f6c6c58586c6a585968c306fa44e7e842ceebe42379394e7483c37cae398d20e76aff812bb0774c6560d0c2e1da6d3a2bca3cfb26daf606b0aa4d7feaed1f3f11565470402ca7aa076a5916848d2b0c2c6db466e5384755b240d82504c524bd3789b7300ebf45ab1fe1b0e526f8eb16fbdb5307f48a4ae37a8bb61239d1f0eb2c3c472ee414da584b824d3c78e07ae39bb78c9fc34466f8469d688307c6d405dfd2410770dcee74b17e1c9408d02504e25843117bd9a19096b9717bf7fdf7de7be39bf7bc7dfffdb7df7be3bdefdef3feedf7df7ddb9b7c94309ea5acc4e4df1c1827bf89bbaabfa3198717f9ce9a38607cb7b759ab80e7b556a094cc5ae26f395b0971794fd47dc4ce118b94a286a9e108c4258a3abb93bf7e06261689672d099c40f0250ac4f4756108d368b1d363064ca4596b8bf53c1091370a3625aa8c9debcc0429beeac064fec5bfe066acacdf0d44c65fed3414fce5190da7ea44f4d94c8daf136504133a636e6935c4c17a7906eebc2b7fedc181061ac88d78f6cd8a2b58b9cf525aaaecf16903aa37f881313c793ffcc55ab74f3517164d33ac7bb105130a74e6af719d2c4eb41d95f224681131b881ba44039d385a95dc1e42107ae4965a85531ae8b488248c98d3861bc861c8d8a13ea89e0d6869e03dd344cd22ee9c066e64f0ac1e5244839e29f5c8f2a3c60a35fafe79e7f2a0acbeae784dcdd6b0534b2401acd4e74604820c86591e54de90580ffbe9326fca0ecb3efaca37311254687a9cf7479af2e758fc29d9085390d947dae29d62eb9da1002c65c864d3c9cbb82b034d4df28aa6b0f94d1a7407c93563b3244db4c52be15e92f2559a6fa57e0e48afa171a72836818ce90a4e409740574a9c89b67e17dce06dbb0f6fffbac6e2d955a04df5f1fc604a322e503f15f1b644a3e2d911ef41fa0a0be0f7544c4225840c97c58cf62c0e7296f34ac577068b09f3b0166648f247c41a7f67f42a390ed944f2ae7eb8bd9c8aa65063cf6c498e30da823a7b01fdda18e3bf7f4c4b294c3651b59852070a0b4b3f49a03758ac2537e01afc39ca3374f09a0d1d137b303e092abe448272f535b85864cd9760df65f1d80be7694a931210f93387d0497cae9bd341094514f14f87b2297fc0a082d6fb55a454885dae8f5bbb773a66b110b0a7a2e2f47bae235125d7f899401530467ad0e8ec7928a05562fac493ed5a4cacca3a22191fb425059c9c931b509f0f1c5ea1622b51332696af31c01bd21fa2ba83c6814a435e606456ee6a62acc1f7f32b0f90252f9a3c46d985a79da6c52f36269ec8f88b4573c2c9010efe6318c1db6e2c1ad05c6c75b298a5cc0ad9a938415e35f9612c247c51b4eba7647326c58dad3bc1d006726359a109b7b1d8a349ea0258145377cd00e0cbe98c260d2c143823d85e401f8f23be89476cedf60b68c5cc1445dd7e54cc5c7c4fd4eff67e2d18c85550368ae722fded4d4f824328772489884c225d7db0367097fc490498a23730ac6a18bdd165176123201a8e4a95e071fee5c85982dd5ba26620020937f32c4c20323e45d00a2d52c48ec7e4f0d23080735b29ab7f147529d7158b3db9c06bc2a80930573282a4e891190174e597c22ebcf40229a68d38380b7f4903b10852250d4081461bdf7d231ffb460e0240b7fc06451ac1deb211f5a05df0f4d4acadf6c274c95b1b1d44d582539ef8870244da014862cee3a998869cbdad0a3474718c4f05e5a6e0710dfb045d18018467b87d0952025b0e0aab78c0dcad587469d85587fcf49a8c2774fc17f8dcb0bf939d18b6343eb2434e098a415e4d29a6f917819cc293424d843c6b2aed9244a1f3a29e72d177140afa03d831b89b63cd9c2308c92eb44b003a1e6050f5576b0e834a5aa6b662d112dfcacdd33cc5f08a34385a7b3eae81024e66f0f6b6d8d9dd0a78ed64ca6481e01e0447ab93450f1fe8a1d2844e7e24b2fad5dd00c4ec741fe93ba5f5d3ee4dda5e31086713a8cc74fb6949290c495dc15f441c5d9eea41ab9048a309244d1bd4b766cb5d2e5b4e4b5141978099bcbaf2c011881560c5203bcce381ff2a4ca0389aa344c6f76afff96760b84f7010b8db1556110fa73367e047c3a9a6f2d81934a581d3c82659902279f4192c8bc48d459fa1da9c1037f4d5ec504f1a80e22e8f04a72e5848bb01b7cf7978795ec36b52170dab1ba6d55d19ea01e2aac8a7dd2da549dac30d6b6b892a2c5e7a9623e451a659dc5c670dd1952633b861420e9da4b0a50d25eafe0bf1cb5ada2969e271c76ea52dc22d7433db4de73905984f99ef1d6895068b0e3e464179a207568e0f6474d45e8922996003f9fe2c5237f38712d65a062fb69fabad9839f0cc9d79fdf04ca86b644f905e8c5d16a8fa00f5e7b8b3197f5629fc1755d54decb44ac14b64485956c88ebf2bf0e2914627a9505ea5947296bbfbfd4a4d32947819d20ba34a055a956a1c85c334ea4d9321d40feed6c7867e40b8b783b45b5bde9fa8d67d2daf7d40c300a3a5f0d36d65e0adf5b336dc4be9029a430fe1bf0174717df526445900cb094fff80f9dadbe3d429b59a3673e4440f6daff05c6520aafdf997a8dda423f948b87b43a4fa328e1578dc7c7611819fafdfb8071e36924210f2667a651b136899d00f2af4f4fe3d0b34bda6a61838251ff7ac7d19c333f2414c56eacfac5e52a5583d7fb5dc2a88edbb3647e6a4ed757909e9248db0c1909935eec8664248cf3ef7c77e79617126150dbcd53032f5a17659bc61e22b5e4dc7e4ec210225411843b220a1a186093eba22834727bccaa48e8dc64c95da74142ecee5927420201370f5833697360de49d2a48e32cc26040fe4659a75fda1e04a1935fecf4fc8f79706e2050b288686b88ff98942f87b8cafb23de0757d6feaa27fa09b724339e6add3609d221a5f32e46584d09446002b6af3f5af7a06dc155cf71d13c9349ad2ba9b748a9f771d873cccc1335b571af4b5684b38c2be1124336eefa163dcd8ac21b648baa82ce509026b37fcea1a95de8b2d730e981981490d1f354c13fde5849b4f20c1f3fd4089fc6f794f08bc5d5457e11ff1e1471da52422d0b1b788189f0fc9ea9014cf88290113b88687d49c520b9b4e7e77d875261cf8141db33f042e0e8d0083e1f25a189256a11fce1301f08217e6a1fdd218e822c309da8c233f04e139d9fb47c3022e5868298bc00989118dd48c062f0f7e78ad8ed1d125d8141452a5ec41db687666b13e7400c6185099d0922de30c414f9cc1f7521cf18184420ff9fe2bdfc98f36efa70fb100a343b839da50ffc6cb678f812c12f2fab12f82f70743bf87f22c29d69b58c268169a6c2205433665571eed611ff520f19a1f6e0b279910380c4082cb7a0248d0f092e0f6d30e6cb99668d4124af63e31699f5449106c0ce221dae7aaac1f6834136c5a76f126564eef4a4d8d4ee74d5a68768203c5bb01f518f6e069735066eaa606b2055996c49061c63f8d220d487033de384ac13ac65122b9592ee2bb17b237c049a5fe04e956685d5cba0769b1e2f3d0069e18304e5f2c295988e28c42c60026bfed07f5cf660d6c1c65ed160645451b76bf8d098a3b332f2f9579dc9937ffba8dda86c5823ec5f903cea840550dc2683e3d920a23074a89f37961c3c13cfbc586ade19c0d75290b44a1937ac7aa14e17d91f6297ab1d0b5e08a6aa11b1c7b1ff12debeae3dcc0fa6906a6720ddee4607d020d64df15cd4571d9564a32c3a32d0fefd555341440dc2a702ff2c313d12b2ccc8c932e5d2a691f0982f8183ea34fec4a7f1c009545b9aa051821135b4739e837c3d8abf9e48ef6a53a02915112a166534b58509bea7f2707b771920c7255cf984730073128a28a72041f7d80442489dea42eeb53ccbf6635869494dedef4b3fe4f5e5d90889100933b0de886720d93aedd5638f17d946f8d5d65cb5d8ef4a81b575b70d6741c0aefd558307b92701c4160a40dd3778fd02af82808eda0c2a5fb44d26f857c022aac777fc8a2b8b385979c38020c0d43e613cb43e16fa189cc8b30eb256a58675431da6d44626a3fe6e8064601c71b34e7b37a81ffe49faead33010fc1d986cc24aef2e5722c2d4769066d36b3b0be1d1a0425a6270d8f48816bb02c801e07320010363ff6acf02efeafcb9eeb18e32db13e3906145805a60d0fe181a33cd7d86faa63d5bba0bb26579e58527459331ee6128b8d5bc7e2758d230e18566f00132824757333e3403f60a38f9cd09f6498e4440b9273053019a1ac34dc684f7fe48c372aba03712adda85fe5077fa7aa03a4375be06689f684bbed0e56e3cd6da5b3b81de98c200616097e9485ced4843f105b433cb073e1fa39108f9492b4d8a59c0af981548478755452269037f5aa88d731e2081fcd9c14558a2912f8d51584e3fc9843b1bf0b6be99d8f1ae87771b59fea874539cadd48aa1e6c1908719caa9549da00f167d633b6ba5c29ecc56637705f29b00ffb8587e4ddad6fe4eb4850fd16873a238599af6fbec3f2d8929eb6435c3fbbee4caed452092df5b6acf247b2fe2f41e2965bd8a9f5643e9c643e09af8e3949a2e5440c5697592b1bd3540838418ef0f4088347191ea67a3439924a3d2f629ad1fd60657aaa0fffbe240b3c804b0f69c02b105a64aea0e84fa31adc4d8aa40f522d7a1ee2aa294d42356ee0791b600019a2ffa84a48c185a52fd835cf17f1592372bad62c0c3d27c378acd76b0eb415992aee98898ab2294ee45c8490205cbe459dc35fc5507b3110ae07f2fd44abb81f3d549f3a7056e619915071488752a98ec0384c34855d524446834445bd410a9d96d7481c9adeaa78f0366602600871bd69137f08b4da32c17844f4e77614390d02abef23585410cd82cae59cbd494033e9f828e096c7da198582986d5721156bcaea7ede247a4c6c69956b1cd043a364ea4c7f28937c42a6205a21bd9cd4a878b009c829ad8990398257be01e069e6c270cf2bfdf9f02d524cc0cc075cadcd72579c3b0b284a74da3f8d06a50cbf602667e2bf1465ae1b72061619265f4a0362ff0098d6889e4ecc43bb8acb91a6d00b79fa519b33e600a0a352b7bb05cd607ab0a17e614b9d7921405a4b5fea1fe4c9f3df9623c90ee2adef3e62254fedac3fe100ec500d950238d341ebbac2dd1c4110d6cd3707968a0e2059e4ccd1e782d6e5f70cd53461b56ca842fcb9147ebf57ddde475a81b7bc0e235bc7e569b09b1c03b26d8185b6cce0c29bed64d32c6e9ded281358b63adb7d0148c6dbdd470a8a83d9a89b212f895077092bed0d55b723f43a1a2f7a8d00cb1228677a9fd798d2a8c99d3162f308ceef4b42b628f39adb0bce3f6edcab2a3add94dde087518a8bd8cb0c2fe8cc42115e48ba4c620150800936832bf14816d0003af474667e568c8698586c940b4d96aa7ea3b7ff0f2152dd915c430b6d92afcb373ef7c4820b6669f4984c42352c8b61f2450ab7dc922455e7822a47b0f11c0a2a165102c13c678e1489724d633debe3f0354bbbb6903143cbb15ca2dc7c660881b97e5bdcbae0bd4cf4c251b7c2412b56d0994923e163c731f32e22d303558ba966636cef82e0b6564be0c793d0d4b4cf78118ff00c2a17fd2a28172bc88409fe959101b9075b49d34a7b3b4123c92dabe61cc86e4d273a02fdb41735c7982f21646d9ca5cfafaaf993fd1a9a4f7ecb1736dc6c114d76674b70ed6e7b4fe9ef1f10b6e4637197a19468f9c101b61629b369694581736a312015adbf2eec35c6df1858111b230e6fb9c7cec8244878e1f98d162082ec3479633461f3b0ca29d6b435a633b667f7b6bfb06943caab7d216f871615131d687df9229480d636a890a9a01ffab0ce4818967e1c5541ff6bdc2389b89d6fddcc38574c1538548d6b41fa6d414875d7addb9e3fcfd9734304b053ea76a2fd63456969e5dfccf9ca64bf8b9033b22be3c12d46d9a62cf88c0b8a8975179e0374a82232606a9709b5c37291a0df0e373b11aabc26479ed63e23170477e8b81d34209ad8e5b458faf35ebe6dde877e318953de5faa094dd0f44ced33208b7ae5e2671ce06ab830432338d9243c30fcc46010469b00ef82c185dc57be20219a42948a2f4a1a337c76d05aadea57dff215085aa8b4b6cc6f3278a9eb8ecebef123fe10c62c230849c83161a7dc3c409d1cf0884c00e027e790e02491d93530975578d6d03e9d32321f056e8b736983db1e5f3304c6cb5440f98d07ccc24ac2c8de7670889438c841aa4f7241ac2495b25cd1ea61c466f035c77b7a73531f3ffc9bde5cb1e81e269720b41bfc49ab81586a6e0930a6605ec3045ab7122eac1ca9b135a05df210c7a97a69279354bd4aff30d5f34201d47c368c5f4495333084710ecc7ce110ebb168af5a2cc41a309c8c8e1e787b0a1676fc5e1090903ee25fdaf92f04a0bfa11cd0e84b66a041d6be337b51c046e14e5c8aadbb3b489dd70d6ac82760b539d2e5ddbd174816c9e3378e61859fd70d73ff12d1231a5f9bda13f49de80ada4feb94458bdfdf645a9d7869433e546980a526a0dbbd9eabdc85ca2f033443f942e99b061a35c94a64a5079c5f8275e3cc2370a5f5887de8d9746881abe8792d705184f13acee6d7a15c2198dbd172bdee68305e16463714c7694b5395d863c0f51652cabae272ea2d2b003c2d064787953d76158f0f05a56e5a7ba74ee131285190eefcc1622b73a92356dd307cdaa71ad57338c8edb3dd7034f29674b846a12ca25de31f90a930318acf5a87ba08e778e69d4c710ab9d943a02cfafe2bf114e126e6e8b442979347272e2cbba9bdc41af44c836334c924c9b7c703d123758ef4e526984d4059494c101360436cf34c929565c86fddb3d192839a1bcef4b87a78f871e6bb43889d06bd1d50068880968d00aa4d8172f108ddb031fd342d5f649cee1f9484a55de97bb87e5a3a854a5fd23cee17dca8b2adb973c87f1392955b95fee0f13f8b0af56bd03e1afcdf31999a0f59d99f4bb31fc11eb22ea9c3498ccfb9fd2b1ea1dd937c9621fb5f8d767b0227915841a8bc077612f8eb8b2f190cf4829dca3ae001b18a1f1a00fed3faccfaf32d5ee2f3986ed132e5675bfe618ae8fa880eafdb57ff83eb13215ee237986ebc35b58f57e67deb0fafc14503dfba7df62d8763f5cfeada47d41713c2ab9a3f92faa9c2e76bb29cf4d58733c4999f440a62303d15541db60a7287ace8fce8bdefe09d0b63bc72ca4c26cdf22a64ad742b2800baf7c421db31c6300c6792215f7004dec035481549ed337b6efe61721c34bb1ee86b61b46c2ffa396d9e3309616421112fec8fc7822f75d9cf01b689b4df36b910b4f554dccb1072b7473c9430cd41b5e9984d9becef0ab12becfef7083c59dcadfb0a1ee35b635628082635701dfc03bfa506d3137cae116e3e5903754048694a24a26ef870e01faabb2ca6e2a53a6724b45593b9281f88815f28db47e7fbeed1854cf066a6baf0eb2a0751c3c3f2cd0f88214cb5f214156c3cbf2c15553e4ce05fdf82fb606889082af420d8d1034a542a93f0245f05cd52e86482cd0472b0be9335e30e317a97d154a3977ec7e717f3b1ddb82f5629aa798c475ca7784c9af613da41b040f2a7c0724f8ebad80d62dac3de96fa59f5bf747e5ad283cb0d16ed351808224d04458dcebbe59f3af40eac112cb33d1fe5581d8261d9bf7c436712ca7c2014d30135e87789f55c8f254b6052e9605bb12551048ab8a3ac07fa6f4ae2a9a09cc04263ea351d24d6016fe022ed04bf0023fed5e3214c07cfb5b4ad62d926b2e242deda6440f6e9aef3f1e0b7bf171ceeda6619acff57788167e44000f5576721b1041b6d6ee9d02db143c12a41157783b9fce29c703636e4e2f9c5c84143e13bc20ab124e24784050237822bc00e0c78f530be543a6478b47093224c49800e37a59b154ab4fa54aa54e5eabb2c0b0c081a6d5cbea05d5835564f5723a4146a987221a568d0a86d58392f1e1a164543294eec4e3e442b1f143134daa1edfea05f5e27142cf029a60a2c888a8578f1ebe21415250509e2a49069a943c0972fdf0a160504f6c7ad0f4021f5ce0d2839782b95258d2c3872ae174437a333ea91744d0a452a5709425041f3f409c62e821004d24bc4891014106042c4221902c0cc383a624f92586d911add5cb89470a8712c0103db0503d5427783e787a8081142f2e8c200b6b0e257a7c31a925aed5119493b7a10b1f0090aa81118269414505e5c2ea880f128822061fb2204284564e161ee193018cd11453d610f0038f1d1f5e14134e48562414e90166754405c3ea71323214c3e90418211e34c1ac867824b19a04612204f3d24426494c2281a61150af22302a180078a8606298d0dc6045130cab090a34219a52a756ca53cda082492151b9e0f31353be08613551c1ac48e011f4b202aae86504104c68a104115c60bde004a9851e6058e08a87078f91a1a3950c6a55420a762af2228312e24b562f2b18144eca09aa6789970a729a498990f3c20a4f47982001c28211e1c5480f404531435835a815502ba8b26872a1072a28f5420a8597155026f8d0399de0431388e39d6aa71bd4298503cd0d06b080ad0c58001731ba604016540c80071d9830aef6e1ec062a354c890225e9e8890c4d603d3c352db0a082a3ca20a34b1c3480010c3e2cd09440c26a8b073a708515333081017642083231aa31c2980017585c41c514516c79024a8d101c10014d282575a94307b41ae2b0c10564d6750411b4e683046685851145187929011b0ac00276a4c80820c4c0b0562604890004a8bc685424c3901013d8101d9b1fae1e3c500928800002f0c30d221560c002b2e0414a142345808080fa00971c44f15152e465a5f222880934408a240c20040e50242001441815f9201122e3d171fac137074a0eb7c107070a06df0a526e7826f848f08de04504326b7c1ff8d4f8c2f8bc3831e0c3a1ac782b7829b04e4899c083846f842f040f041700523f3e97d742f5f8625230df0b8bf5ad56a90fe59d3c4fd5305d428b8421ba47dacc955e12e7451bd25a7a2712664d420ea60ee40e203f6801a141f7cc6d95fe4de736ae2489d72849e295da9e06448cee56750bc8045a401ad00232440b480fdd3d9b79cdba8dd7b8bf4871a58ea967ea487677de790b7d52cf3b5a1510046d104315919ad44f0b88ccfd9c278973336ed4e96baf25021a227c5169c62fba675b1dbf15dda6e6c35b5a2c42122234b5583f4fc722ccc4fa2d1140114cf05bb6d51fbd66fd433a62bfb67667c6feb63aef0b082f41bebcf9f1386bab325260750add2936727ee4eec6e9be91c1111df7f17bcbd08523477a8e183952e4089123438ef01cd939a27324e7c8919e9e1e233d457a88f40ce9e1e9d9e9d1e9c9e93962a4c7881123458c103132c4088f911d233a46728c1c29d253c4489122458814195284a7c84e119d2239458e10e921628448112244880c21c2436487880e911c224786f40c3132a4c8102243860ce119b233446748ce90233c3d3c46788af010e119c2c3c3b3c3a3c393c37364a767c7c84e911d223b437678767676747672768ee8f4e818d129a2434467880e8fce8e8e8e4e8ece919c9e1c2339457288e40cc9e1c9d9c9d1c9c9c9e9a6dd1da45b2018c9959529a74a77bf605e3035353ab80e302f181cdc5f8e83bbbb77f70bdded4277db0801801b0efb828a6e87b500e00300702d00d8d00e837158aefde80e33cb371bbdeeb9f6e30cff2dcc33a764468992eeae110200135a3feae8764c734973c7f46fb9bb5b60a11b06e679baf8b890d6498a61032c9744d7decb4467efb53f3f88e86e10fc316bfd88a1f563892a89cdc743fd9169e6726a9516cda2176ec2a840770ba19223840acd7dbc4a8e0db5926681ee56a15b2e7108ce7792600ed80119babf38be16b481022f05dff815f9789034b1814eed6005dd4b24d1d43e7e96b417c4966e21adee131cdd2d7a3635bb4ce65e8629582b69335f6dd1ccaba599345240165a6cc1c5021860a353c49324719d1a4fe2fe822fe161ef63f11dcd5fa44b54749b3d93b9cf797a303a7437d82d1fac12d36b7b82f23183242e5027a0025d09824e3b4800092738e28b16045140929309d6e019e1092786002336e42446016c4ee0dc10d48588d7a98a0bccbcb1e4b4050a6e563809d114e4e4062c57a801840927728b1a2f010d890e6c40384181410b017444e184cc13322724086851e1821818a163e3a14ece2585385a5648c9f2aae3a412428b02c40181254e94a0836f0614587af2e40a2a825a34f8b8d081801c4a40c5154149def8208045093e9044a5050e48a28d0f012cd8f2803694482107b6c6d7c31222d490031c669254d081afd6014f030121a0c254c518df132d75e460041cd0c45810c6a71381362e90a414030ba4f1c527020fca68e24eb1041454b6f0eaa80201191872822343b04085b782140841510126b6c85ae08467c6015cf882ca0f94d8e20024bc2dce209244c6194954513284774410360471840d08202303593cdd174a6f44b14301105d0e1e151cbc30e1f0850e3820b2f723456e0a269a884327c3e80931816703b104920032103d1e4710d19715416030a51b07635439c1073f574e6842a9d9f8c10c56014ad0e24fd05d812e52f03d439cc10516412d450d422974d618830e21495a0b1446425a18a1091a26433a270210f450a1450c9a6eaf4e2262879d3470900115b2bb470c25d2c0018d55080ee846a107188e30cd81c44b96ee13174c3320630b9a4c1738e058a38a5697349c58524717077c2002234c610109ffd24117268608a3032ff6484b0768d06587305cc0128f7095308337ba847604e00138f8a137d0a38d2e4359acb00213141f118235ba806f50698de1c20b48541de802021330b0a00c2e38f0b0c51877f8c0035db000e575742010c61d2a18004b8e392ee02304dc17778c218120d2004460810035b6b84301732840a68696ac031254dc4184152aa8001460b8000c229cb823abc007ba15489b1d2a80c41d35245104c410464ca0052843dc01031a6174990dc1404e52963b5808004d961a739041881cee8079c003b8c0228b2e4d60643be2c8010be630400a34708316463b44308516b5293c6426e08168c7044eb0c5b8820eb42ab250b1638b017050a4410116d04842c90e20c8404190901242e081093cb10397e58c355400823260401264c751037a6c74b840a40105486207913886c02c31820b5bb860881d41b604a1860794b880123a78d9d124c8407080051f6066ac50c70b8a484206b6a7c9124626d4c1810cb49028424447142320d4e1850f497eecaa40200d29327524b1800e0c19b1842929d70555070e32708246a7820d84e0401d75cc27ae6c41041756a0f1001dd421148219a8d4e84069e2071ad4f122009714b82882873a92bc5187cb02518c8823861b814c1b74f0a08bce8b3a2c10461b466bd0d18616e41d2398d144191be8eebea3037460e00525a8715252021315c0c4c8f0f07a784ebcffa1bd15babd2be552a5ba1cf7715c8e24d34882628d28ce9d4dcde72c96610adae0b2d21c28d6d04a2c131f17fe2d04739d39506c2c494a43310c05c962184a924d8911b9121fb7a9a93f82b592e679fd030c74374eb7565b1a5fb05adbbc22cecef679de8c71c21777f2584b25f540d6461c69e8a0d6a08da636cce80194306a70f03e8863840e40c162845d947a24f909410d27845064052ecaa875d14203ae54111c800d1f6ac850495c0a8ecaf811024e00d8280114d7022108800d4b803978fd15c52085164e56f0f04042181ee8c20463a0da6085408d1dd04085fc068e8f107aec38a9808917f0003e5e03313ac500061fe8c00457285183da5303f1025652f01a65839b5ccc0620b688a3071582c081c540b78e08121d33830cb4a773d38d4296a63ef158d25de4dd2b2edd7dc6f724c795f8f8cce38bef303c8bba7ba65baa249da71d6bb21d15717265c5dd0da55b2911d0e898afa5cd31ba9b4a2b75eba29b898aee9c25baf310dd974a5377a592cadd4dd34addba6968dd24740f75a35ca8537708dd00e876794ea09ab4505ba0ba7018166b69695eb39e4beb36cb9424f1ee6e75b78feeeed1f88243409d1bfc7977a2419f46d0e3387349d62addafd5ca1f8ff4b274b7946e9d8e1a5ff0451bbe98031201736e7a88601a4e4d27278788cea4d1767644233ab522379682f8f3bc21b8bb1953db5f1c6bbb330471de5ac1f99cbde1a0ba63ba99f4d432949cbd42dd0dc3e2f9d6e84c4712fb2ccf9908ddfabcbb7f74ebc3a27b9c4b36f737b5e533d2fa8a74f708ddfa6cdd0d42b7bea46e254c2f567a1f87bf64e398d678fdd193f8d35c1c4b7bc36ed3dd3bdd5eed6e12bae5e9a0bbf105c3bac32f5f8e73c967f73299799d5eadcf6c6ac87975b584c1f258e2479ab9f8e338c3eef6ee8fd6dd40bae515812f98733556777bbdea6bef7dafd3c5afb7cc7f73fddc8f648e7aa6f366b7559af3cc5d5bf3394401babb846eb51b2dcf477787d0adfe81f8239d35c79f7734f79af56a699ebebb36f7397cc14f84ee36a15bbd4477bbbad55f74b7ce8eb5fb4bd6779986939c21be60f84b32ddbca11dc7d9dd3cba3d22ddeda45b5dd3dd32dd6adcd876a78b749c4b95e20b8a36879373359cf0629cbf36c4d9dd796974c4e1e1a9d5864c9d9c223a61cf14738c180973728aec1ca14d233a46881039d2536488388b1409439c30e3f2e274b7aabb532754777f2f074022a6c5686a8af5e9650939626258272339e4b0c3e727dfc17394e7c085d2ca613c872c5afc27b5c38bb3bc83f09f144d0e3bbcd068f11f9a1d54cea2d1e23f275fd1eca0a249d19cbc7d079557635488028a20bc205059b4781e048a468504a8b0a5f5794c0c2ee5a8140d0f27cf494ca352232b8b0f3d7cfea1bc07c4340f38cfcaeaca098542a154be7a41a14ece62b977b272f23c479d4e5f0e563c7f710f95c3d2e7ac7c7296b34eac1c562c9a4fb5c2a96870a92527d6e73815cd95538ae5a5ba8869cffbfcf4794c4ceac53b457333ca55344b9fabdc51335780c4702aef180ccd951c622ffecd5c011253d1e453132fc63ac55e68aca0dca3b992436c4583f3189a2bedcdc3898fd8e71960b50a08f8bc7f6264663e979139a15e5eb2a05ce6e52706664645134468e52adc8ae68adde72a9a2b76278721d63fdfa78271cf6150a82c2c1d62dc43c9b07888990902869f93c3cc64d1e2fd9c3c08187e50289771a5d3cff7a158344d595e5c8bffc0386b264b8c07e13f30eec5d0349db2e8b0c3c961689a4e593e1e35c8cce8b0c3c95f689a4efe390fa5937f30335abc1f187f99d1e2fdbc78cc4c962060f881712dde4f8ca37830093203ca65bc86937b343ac4646149e1e1478646072e9462dc731d60fcf39996cabd1f15a8685de92e31150dee8adde757ec50de3afadce311640694e7ac2394bb8a8918cf9bd1c2c51518b4a0b26841d17071058620b8b802430c77f28e7952bed5cc8b4c8ac57a59ad7c06b77214ca4a4c8ae5decc0a2f30ce52792befd1a3c74c1095d1cbc9656678784ccc8b9595af5ce52fa9192b32aef21eee390f8fb1b2a2f1a1f26c65e5a9988f191c0f97712b34ddc37bf80a5fcd57f3d5f0a051799015cd93afe65bc1ca0ade938f95722b2bc4be550d0ae68898fed040a229d668180009348e80038d036441038937545082c58a399dc6f88aaccee0e1c463398f212fc59249d1a0542af754eeadb888816acf73e29d911af2603ccf83a1697d359e8cb73a61b1049593afd888ad56ce4ab9caf5c3e5f2154c1023b6a2b1226305154ba568acc4cc64e1c24acab9c0b57838f19c35d3311f3c8652ae4ad15859b9f7c56480ac9093a489d26c64ca528413587c3194c7801013c2c7436609991796083229ffac38f1ce889d888658adafc6630da968501feae4f597eae189c1c307423c089d3e161a466c116b348c702266c5071a45c89142d2fadc6bd2b1af0a22b8c4da3d3162ed5d10e103d50d5b0a82f220289a196f66e53de3c48b7919156b6fd40b0f221a1ebe180ae67929efa4e241a4f2f6572aa388acf01064d51fca4375b38c3c3fc9a0e52847cd9cba3b9582a1619d5433ac99d50cee4474f202347d5f8dca83a46a787835caca0adf690a2d3c57414bebe48d4bb90a43a0520d7b7194b3702a5ff94cc7be978e792acfbd1f08a1658ed8ca5970c43ac6f2356228c41a0d24be88652f767219b7b25abd04f1bc95877a89f118d64cca5732303c98ac564156ac99202b57ad6456ac189815ca57a797d3122a46c4f2154d108fc65b79ce62e13c5f79105610168d939ad4e9e4ed2f8f2688951a15b4b4aef8887972bcaab0115bf9ea8c58c73a36003054306e058502e1abf93c9a56cb53cd04f13cc6559ed7c45e1ce5bd380f57f16022d3c3476c0915637946c55226b080008989a17878caeb01bb7dc34366e68a17b3b2a20992a279f197b602a372140c0a8572d40bab061504e51eaa0645f3f2d511029823d6312f945ba9899d3c8887f2134d108fc6494dcc778879be5a79cefa505652982688939a98e71ecd152f969af9685e5f4d9f0600478c26d66808608c588c8f18da5b42c5aef888f98bb7c764b5f2dc0a2b88cabd202a4fd5c458fe920a8272cf573c348d9520281a2735b118ea44f36241cceb858600be88c1628d8696396248501173c51a0d248a885dcfbb6f4e6e25c8a9e6945131cfada8522915946879b12029ef20294fd138a989a1686a62a857dfb47f0ce88fe531acbe189a4605e31ecd29c628e5fd751016cd8a06a7c29d3e8f8e171fa71921958a078fef8a176305e1f1e230eecdb4f398b9e211bd9c7818a17c45b3e49d689ca8bc69ac78312f86d7f781989316386231ce42790b652fe6b90a3db4aca062a7af4628c80bcb617cd5dd2e73c52362d12c35cd8946a883bcc0d0d478f662ad8f0c37d008c0154f8ecf6b583bf9baf081fa8ae0641af67ddd8098fe8ae04e5fa7bccf08e527d4cc12038a889d1c1580a6d8290895af1c0d21e688f1714a396ee543ad18fe3c266615e3c34acab3873ad1e066acc40ca162fcf398d4151f317c323a197d1ee3334b5ecc63f9c7238618cf7bf12057bc58fb122ae6f9151f31cf611cc5c348e52b9a25cf28e51ecd92176b1a2ba7537f35343894672f4693a241095df162301eca0a2a285fb94105e52c4723082edda9204e6a623156092a18d1bae2c53e3f9d50b15311949f7c06c5448552f130e231a4f2934caa51eed178334e50fed12c794c501e0dce0a6a48e52c3ff1b8e22d7d4b5e2c854bd1b05270f8408100820926ac10eb7e3959c2c01d77dce101b990e699b3b99c75facd56da7bcbf3a634ceba4172deec757a3847326793babba75b238f91076e0c9b1dcdbf5e4babf14cb1125863382270b037bac16ac972dafcf2d7fd3c47c795ce9cbdc2c4ca00ac0ce96e10dbd071a6394caba595c6c04c5dfc6babbdbd0ecf9b1514fd00cda1c1719ce1a43e70b46e483438b3f19738e42f5b33fb5be6a579ab65ed4bd19f8664368e1368e653ace5ad861b0ae30f433c6f14147f09d32b2e2ed10fffe26a77f7cb196c65b46c6483baaf7eaf8de66c76f149d2de5b385d9cb798ad66a952f145ba642fe9b399520d8e2ea2bbff73d766ea7fcb229d6479e5af52abd6d3dd36bbbd7937ba1bac5d7b0bebbcf90bf46074830fc537b1b9667d37758ee96e1ce7fdfa367fe1a9f319ba25c281ff6b5614c500737dec4f139768b05222a0293eced03e69894799bec457e7bf61b5e14db555447d01da10014db914bf48fd924cef4fcb14b4815f1392a177d33e9c24f69a755c38479f8ec979bb7f04e6c75ea9dbd82acda5bde083b4c6bfc4987ece62c753a7d4a29d01566b6f98ea7c67338eb3c6abcefe4d895644f8d7ffa6446bd2dda0584b5bab96c47fcbb86c737f69adae34773fbf183a1632d900abf57cbfeaacff4d696ae9d273f6d6dca7e379f34cfdc34ab1cf9a6ef1b1efeaccb9b54ab3391abc9f475aab96baff4d69b6e5da9a8dfefd258b69cd6b38bd49b76647a0f8f92ff934b7597c5cfaccffa6d492eda0415c68efe7ca71a419dfbf657f5ccef0692efe876189dd71a11d6be97f534ac2647f466b69d8c7c7a6c6c7671c27908fe3e94a4992e4c2293e311fda6ee672e1149aa34f643b3c65ee3395fdd7327ed147fc284998eccfee4e1ad2dad7a7ddb0c40db7be61c90dacb19cb517d9c8d7923f7e06d2ad2a608055669fcbf099be55a549267e95a35cc8d4aae2609519ce8ff194ddafb5a8b8d1ddbdabd16cabec69f4869856e25aca3ebcb646458cee06abccc4fa18063b9ad9e0ff49e18b16c8e3a24525090b36ac6183056c78a2db95247187cd669ef124fdc33a97c43ac327348f25910d335d03530d398fab25f123e5c229ddcdc5165a9c50acd3775a7d2bd5a58185a7cec771861e6b4d0123866e4db9cd9b4faf34f799fa8fb64ab1c75a5372ba1bc425ad250507ddddb68a3b3ca514084899e038be0e4f7fd55fa236b755ea35eb0eeec6b1ac792852d1f17bcd3a8e892f94fb3c94fb3c846f994af991cc59a0cf75e816e6f913450523cde5bd4c70464c94f258e228423b516a4c274aae9fdb4d52f678fef848509a68283d4a326830e3b7d94aecf966a3397f7297e7dff2eb6fb97eaeb4dde97fcb2ffecdf1bcb9ebbe2849f7454a0ee89af55c59df6733ff9b12c68f73fd25264a2fec32cdf5452a2b4264e7ffde9470330cdf4911223bf3965484c88ed5293d6e8e3f3b3cba89a4c3a39b48393cba8974644737917a767413c9c88e6e2215d9d14d24223bba89346447379178767413696747379172767413e9888e6e22f5e8e82692111ddd442aa2a39b484474741369888e6e22f1e8e826d28e8e6e22e9e8e826d211dd44ead14d2423ba895444379188e826d210dd44e2d14da41ddd44d2d14da41cdd44fa6a8b90dc402291945ed0b3a35362db1c85e6cd4c4cc63116624af42f849fdc65180cd364b85a3c1f69061dd791178d2f48c929fb3c97e82565b21d7008987363b3e3df32cfaff90cd752b6849b893fd2667d7a6f768feb6e20ba3b4b77ffe0430d466bb46ede1d904707ccb9a93a7b69373c6f465d34e9961115b64a6f4e9291f873b302c1604b3b3ca58fec3ec934739769e67c9230cddccb1e4f9acf0e4f998469e67256a91601dd3fc230d813ef8b16d190ee1cfebd36f46c2b76af51677ac7d4ffa6e44866b26b6533f16f98565af3fbe248cb1f7c41dc43777b4dddb6568790329e4f68a675080b1d67a54221c595deccc4643792640ccfdbd1fda38e29a1f564099296132e197f95ddcf5496b3b7260b9fc438e12f39117fe93e7ea4ff2b14629a83c1707d9ccd659e39e9c33ac7f9d3f882e36cc9808006415048fef195e75f9b675be420f671ceb10cc719da2a156b091b7fe947190ce786e7ad9630180c365483d6d00c8648d03d73d8ccf37417ff86e76de8009dafbd61b736c31edf5ffa3b842f78c3f386b3542dc5f7a3747799bbc5f1290df7978cc4af503259de6b8184c4f90383e16bef6572646b75e8da3cc53a89c6799f341a67eeda22182c5f4b9225967d6ede1adecda3b645f869c0bb79f45f93e1dd24319e2310c6730c6340436889d00a5b98986046900ddd373c9b543a6f403e3e3e49c28f9204833dbd5946e299a7486533cfa05b1db2e15c509eb25c1fd7a12271fead894cb6644919d3ccc56ad0454d8a2cc16033cf20f133a6f8fe5114274a33cf20717e93225c68c79f1d9ed2e7450b1425894f92f0a3f84049127e145bab43e36881c4f937dc9db9fb79ea6464ee569d1565e263fca1bd64b554a6fb3ace5c2d167aed0d7f4e26dea9234b71e8ef37f93c6d7f6db6d8fd5b36b2d11f6b95806cd13896423e3d6592f0a3c060e12fc16062c63212cf3c457148f6d786b22773b7090c478cb3ac54c6347332321732ed66f8a2ecca745274b2cf95f82f69afb8c3538aa3bde1bfb72cc3732ca253ca32beb4365a4bcb9832bd0c8fb3da28cef52949c3bf3e3334be600fa803e6dcdc84bf24c3cdd7c160b2cfd15ccbabc48796921b40f173f824fefba40db157ead7e6f0975cfc01dcd0ddb56e252193b8d1ddd8dec7f2a3387f749b1d674af35c9f86b4562bb18b9f6bf486c349e66c5804e4b9b9b9a10a95ee10c91605207204ac8e9e79e291cefc41642e8dc417eb93b84cc219b5add291469360b05cc854a98d5ea32319b86591eac43a7fc4c750da477c92a43763580e4f5d928e6326d627c939f35ba63abf4fc73bdfc5f7fa4f732ca499e8ee29ddeac1025f30d7cfd91ecbc417cb31acb496b93efe4be232e74ee6eecdc5bf730c5fcc3447c7271acb9539ba5bb4a1ec455bf12fd14c73f49238b4129b000e23397412d2102d23ad561130ba7b061f79fdd7e5a7f9e3f937acd477a37b0e1a074592d0c4a737cf706454d4dd444fdec7467c9b482f2d569324fc28389451d9975f5e9189373c9bc060e2fc9b2cbc92935dc9898f85e2ebf3798a24147f8943f3cea324b64aad2d975646e6ee4d46e66464ae948d33dbbcc353ca6c38d780214c5a1c6999a303eedcd85aa5373fce108b5f6d14e379cbf3c808143f679acbd9d09301c4859366eb0c3dcf5bf689ebbcd9eb93d66d91c7a3459c7f3bfa789e74dfa7e5caaaea16d22d1e991652f15bd1b3b5d7df36afcd78929eb3b344e30be2e0423bd2649fe70d0ec6c1c189f8265b71e2464be2ec32bd9304f3639a29d33b93ee76d2dd32307500ba9b866ee9dca03d141a86eef6814eee6e29be113e1a725c802ff879dae8d2ac519c9093e8ff2afd20a085163cc795cc787e5cabd9540b2db4e04a7c5cac9f3212a51b45011417a800a0804ee846fda0628d1ad2c2e9b916e3b4704ce8a1ee36a165dd02b7f89146a3f5e3d2026fdd0ed340b76e9ce85d9d5ee72de7faf76b352afaf45f9a37b7d9b1f85ffd16d29bce5f6e73a5e2b4a3f8392c6fc6d586be1bab754cc1e9357bc3a5ef682ebe3fcdb3ad5e67d80d04c24efc2b8e24e7e9334fd1f16eeac6e9e2637acb2ed6e9373c6f3e675f8e330a0c267ed519bd68abf416ced0ff4e7f29ddfdd3ddb125dd42af211a5f902c71d68e3d3b60ce0d4dbc797a73eb85ebd6ebbbf59aa9727d4c8b05d5acbd47e2fc26f3cea3ee56d2cd84ccdd264c2fd6a1f16b9d37208cffdaea1099bb4dc4f94dc22b44577241365aab1688de8c1f499c7f8bd9185e9cd74642c9764c1aa7381fa9bb9320e9ddcd9589381fe916e699c394285b8b94f479e6245ba5b689f113657bc3e4ac58f679662cdbcdf12f0c96fb8c775856e9bc85f34e52967f1c2729c3e558e6ca10c85669a533f7485f7e39c32dcc93c4346837c747aa4115006843043048110317a081450992d810828a07d603605c0f50c308a70096afe600022600d1023058f001c41326668ae0b1738027bef8e206074092009286081410b403089406a02405aa1915ba8184dd7261d6f882bbc7c9c6195a2b8874b74d956ed970e921a00ea87333567be952fd213ce2fb6ea4cd5ce67c27cebfa3f745baaf2904e850a9bc5e4a7c94b80d93486b72ed9fc090ae51aefd1377f74a05076712a9ec6de2cb70e1bc59c552bda88ea0a12489bfb0815c4b1bba121faf3fca72ed479938da940f4e2840b58172626542c6a22b51125e4cf301a2a45b2d7877bf68ab3bec451bfa8fb4790be7df5abaf8f7737d878db3decf953aa1e337b5f1b12b51e2f966a37f03df26fe1622badb866eb120561a948680624731204fe24c229d756b8535f0057737d7c711ea5e35d1dd35746b052bf882e4cce1fcdf4cc3c1d5d21cfe38dab07bc746c7f95828cea5ddcd272d47d3ac57b955a31aa5c4ebd5164f4cb9bc55fbf05222783d3cd60eca489f9040a1b0fa58ac14eae4793dc207f6d7de0c2818bc5e2149b50f95d79ee7a55243be98af3dcf3b7d4d3c6fe57d9e775261f9bccf5b7d2220799eca5bf5e7f1004f9f4a5503e31eeafb50457828cffb60bc1d7cde4ba73cd4777acfb3f279dec782f205f9bc4f85fabc197c9ea7fabc19bc113ceff4b134903aad7a78221cf942609dbc27bccf537d9ef79d64de87827919f2c9783e2c2fb5c24989b7fa3e94ce09e6fb3c1b1f453c1c503a3142a7a3af51fd55e1a14e35a8d4e79d3a75008f055e7fdd6ab5da6b0fe57d9e0d3cd6e782e77da9ef3b791e8f87e3b13c99effb3e159027e4fb509f977302634860b5e0f1f851c2a78497fa48f050dec9ebefe873180fd51f55b5cf3c029c7a46035e2f29e33b792a0fb5f27878a725be8f053b793d27effb50fec9bcd47829cf5be5a07452c8f13e1815eb5b791eccfbbe139c54decb873a2d79345fe979a71bef25e6f3582bef5bf2a1f0a1f09d70ea537b3e3cd5f7793c50ad13ea23e1fb3e4fe5a16adecb0a5e4ceaf3525e0f2341bea155cccbe7d15832abcf9bc16379dee9f3505e13ef84efc867c217f3adbe9477f23eeff360de095fccb74279a7d4c9f38c7827afc67bf1643ccf43e2a1f0c19c561e0be57d9e07f33c95081f081eeaf35228efc817e39d3e14bcd3e9fb501fca3bf27d5e091f8cf7e2b1509fe77930ef840f6675f2502c94e77946dc03e2022bc9e9859477f25e3c1410efe50516634310143c1550def7a9bed57bad1072629a78dee77d9ee7ddf4aac9ae81074f0e1a6cd04e43147070a161e60d1a48992c58009415b8d14a3326e8a4283ef049538d468a228c279066acd10c515891e3680e59f2240a1472d0649a9073240a203847660f2d8cac80c70a466660bc222bf0ec2832eb9280227e4783333a50b89961f1bddcb0c2be3cc78517b6bce24861e63229f8083f7a0b00aaf42c65443bea87ee5377b78ecc661959caba3ba755f89c4dfa6a8b72dcc7efdfb21de2491c676aa322cdd6f6b6e86e14ba95021b364ac3c995b59b960216dd8d4349055ff0c919e2afbd18d2e6911e2345880ce1d9d1c9a1d27dd44ae1085f70e629ca78f838053959a009458026d413950beead76d043cb8aa6544a66d582097a4045a1831a41860a2d540368423d791101c604203f34bdd080aae184424c56c9b084583d2a9813122030290e34b1c06802814a0f2f464e4fe04046054da92e4d29991246d02493692cd0f402a4c7b74292c24921a12584181294f0013544938f191f33a71b170e0b88ab8b0fa917583dab24271fa7242c2a9a4e443a382a18d5164da7185509a8578ccec943c9a05e3042a9175634a84a50c1a8acc8802003c20b90171156349cecf04155c2a90b1f526734b160059573190b27a060323e542e9477ba3901a18e6446507d2b29ab20aba254083d3c55cc298592399d4edf6975629d5e604c409d5650563f7c1cc1b856aa95775aa186a070501e8b8453901e5e524869d1d4638b1e5c2a541056900f2815f84023f3ee72070c4ac0c607b8a07146694b32a208263f302831626b1c36c011d2f2c15ad9508351519734d600410a44e42ca1c4922654400235ccb840041870050ed84212652602df1ddc408e3644b006190fe061871ba8d430c5a82806a114501841843028c0030316b0830eb2134cb035851e2a48c1955c53973b7ac0032a368c20828b04669481810b4400025e10510001c86ea0418a51d1901a6994e1810a2cd1e4042650c30c322e60012ba81002881f6e2007094470010b84d1802c4d2f0e3171f190c3056fa8000d322830812f146004015e94dd40c50629434c90c06c5c3cd448038d2710604496176f90614888099276c11b6aa4b181322830812fbc50c01105c8524586212548604686e8d8fc70a1ba8b0bde48c106d028830c0a4cc00b051c61440108908505b22a5460c001eba0e389131f3d50604211430831454a8e14041062c7c4c54b97d31d9f1d293abe1fb0b44065f129e00bdd33b891c47577aebf24521b05a88e1d743d38aa83ac435687943a64a803491d44ba5b1c6d133ae4e8592ec919143a0ed05fad0d5f427420d161d36da38e69aeaf1086838371702e642a6b7528366f198be5c2294042747b031040b7a7a5db0b401040747b59bc1f3c1f7af87a3044778fa0bbbd1ee4d0ed8d208e184820011d197474f747a34aec0d5a60001974f7890612490b1180d02507dd8dc2420a051c0180026718e96e0f86236c302a42004f84d1dd9e103348c1e6a69268d1dddf132630b840082142f4a0bb4f2110c1c5064a2c110608ba5bd5c401e6f0d680ddb1a4bbbf377660440e7528d10223dd8d42c06cc5c48d035654d0ddde1ab41d32a810e00a0aba6fc4fa19bf4ef623699f9cb79c2011389be19aa75869cd6df62a339c34b3c15fb33c67fedc5f0b0426cdfe5a20f0c10729191bc70904e692ac74f62f649566642eff6bb65629f8b59753327674cb369b65b2ffdaee8e99a9a464ecc36a8bc0bf2981b39af58fc1664792c9c06b6baecb232d6913c8efe79a92f836db54027f473f4773eedada7d12533c9b61fcf596d81f3773a5a54d17bddef9a3b5e4e3ec52a5f696ff9d29dfbf399c36e7b19caf7ae4b714df8e6eb3e77236fc3be42f3cd25973cf25e9629de358d65ef45d9d5e2db602fe9dcd7ce6a177b14e9aebccb8d2e918cf66404ec9d8bc650c9cb7b4187ff8d5878e622ecb76c4a0f8b8c47996f9b51be72d637e6d4d04331da7e8949c3e9b615cf837200cdaecbb3b9740210731c55f272563528c404a4ebf8fbb5627abd52c88c333d76a490e5272ee1ee72fb86e5e3ae2dde3643630a423ad245d74264f624049d586480e629ff5d4723973918e4f13ffc149975c7c6c49a6f7dde31e8fe3b4353bfd730c2efe631d5c0006171614b960143f97994a71410dae3a5b9dbcd1463759a1641ad2916462f286132d0ee1584849ab943fe92abda1d4229d47e32ffd13d22abd11024ed2d9718cb5408716e0d0021bbe20ceb5cf0224ba618ef124f1056f7221134e2e64c2b1556a9b19e3fbf4de49cbc10a5cb00211ac200cfc34df27ed25fde5307f390cbf1c0624e5715369055b3a174ec94c4ce62da7add5a1a41578e3236ee8c049b3d01d4547419b793b24de12cfc60d960e987393adbd374f6ff666284fe655a132c58629354ca1618a142f0aca8b11010ada40c19802b2bbc1b0c8611e946e4fa9db4beaf69030cde1604c73287880d02b05794ab0ec98744b65c6f70a696b0e6785de6cb51743daac81862952a240514a429ae1a888e88913199ac420c42408e8278603debcbabce0824d4d972e5dbad4da18b299dcddd0003378476da0bafb8d3ec119b31340514477635b5fe50978206733c7347782a4130475bf1c76d46d6482319a0c1a28f18cbc0c48a003de073c2e25b040b74d4dab045794404bb72771077f14a9ac5abfb66654022a58bc5367841025f0ee243642d00de279f35c27bd18681c2750ae9f144e618309112926ce1f367cbac16bef659a44609519990ba7cc6c78b156b3372fce9b7d377136272747a7c6adbd0139f821cdb6e6d2e6b7f96ee6e8ace1af338f658e629affd71e4f9acdb3868980a6b8ad52fa37290e863437eb4eb437571be21a73107ba65347fdcb9bada5f9ef32bd9978865e2975245fade7e995fab5350789f0102152c456d7d96b739c2ba538389bf90c67349b75d6bf657fbdd5e52107ad673c47172bb5559ab3e1d3bc662bf59b6aebfd719c39fcfa3c6fee2f59b14e9dadb83b73b7b03ecda3d823181325a32207adffb5b5bf33f1676ea71db3c5bbc7dd271d8b23a99b9193a89671a5b3718c39080213ba1bc907d8e86e1b36fac0169e0d1a975690ccf0032f2e73f42d6b8e0489f85c38c0e50bd05629124c9d4b96aab31557a17079828bb898d0158a1a34107f14ebbcd59266c71f35b668507c248fb397e6b9f93763a76ae46e87898fa1388881a678fd3e8564a43a0d1df40c0c752efdf848b3fcb634c2b8a9141643d15011524c4a1a4374f7db2659f334c8eea434a074f7db2639d3f2401d444053dc7734dfdd5fa2e38b8f0ba99207b874dbd4e06c2e646aa1c656692e646ad06fe17cafd6a13888c5afd979e9241d9c7dcd6951ecd1381fd7e8fd25b7591ceda5aff35cd2f0744b75d85f9733bd7fbd529f8e7fe97e9277e04737e6c14062b53f43d9bbe264034b747380ec2ec9f937876d400e7c0b3fe76c08e2e0c03099f3cdf375d291887fdf66a337dff29728ae5f7bd1e7065240c6190ebbc159fbf35868d2519252f84b30d8ee71dd5e111a1be8eef15d2706ffdac4dd1e11cf87f5cb2b8f7d767b4f76fcb1503c9265f6398306abf105ef93e3df64f76598e2af6ff39c80e25f711077adce6d766cc56df6fbf88c2cbadb61454649329c5a67b8c3de66df7577ac5b634c61c618dd30cc66665ea9dbaabd3af7177e3a91ca98195d343893553b7b0cb2c00c1066def086bc26dd1d639a44309812c63fe6c7651401beadda6a1b9ab79cb79c65d0508691ee0e6b79b3bf32a66366fa4a061bde16329898653b2601cdec7d2c16d3a55ba61ece800ef396f386cc854c99e96f32d3cbe62de718565a1ad881065cd020c5f46fb9f6a2db9a5f74dd17791545402147b7178327d428221ac5440668d093a303e6803a37d5622bb217efe3c7e3fcf28e63396f39e72de74d068674b75f0b84132cd0c1c0186d81271528228c3bbac36b65b9fe52aebf846522b5516030986b89a0e4c229642e9cf249d792b999f1e7a8928fbf92925c2b34d2e6384e20180c46865f94d517457a935172ca480c83d5c6c730984f48475a79449231ab0483ade078fabc652cc9bce514af0d311569e52d53dbfd9ca92ebf6de6a8cf7d5ba535196923473a73cf446f9e39daebc669fb7137471253f14a4ef4b9e1d924575659ab014bba416fc048925e6cb9d3c59617b7f71b2f6a402fba0b30bc8b29f4662fd9c52d33b6370688d10d8abb11535bc4002d0ca00c0002d6f2bacd23d561ea47b63b47a7d991e6988e0b3883b4551a5b005383b5bc4e47922cf10264e806dd16c92113eb6399154b2ec01065399cf5b9d032f314f3632ea474cb3e971317fe2df419a7ccda64a24f9379274993898fcb2df21628f48ef6faaff98ca47956b3fe9afdd766fe5f8bfdd764e3a4f94ef2c7ff9af8199756c4f95ff3f9171afaafc9aaa598a49969e6c46a69baaf5a900d569969b1440b2059c021cb028cb62396655144ae54f64bf3c72c66f971163978cab25881556632519c32b15a1a15472b538016afd3773405dcac1557c092560010dd1761214763c10516531acc8fb18378f7b81dc642ac58b0babb6357c011bba20b5cafd0d2e01553fa8a9acebf8b62c51c0ddeacb062092b96fcb582f54faae8229ce48ff4a6739d1dabb889d5d27c17565a54454f152d2ad8682abae8fb752c97ea90572a9aa8c8196779e5c529d8e83c452ad619663b62c74270934eb1a5a7207b8a256095d9142d592e6492a28d96ddf0bc49b104e8d8673d22426ae23526c5ada500d218675a6d9893a2a0418337a5289aa2c86970a6fb3af3f16f8eb7c801ceec4d37a39558ac5bced82245835566b2c759527c5ccab61cb56d925bdca1100397353ebb7626be786788a90885134450f8008538daea949c0968a397ee63ffb2d25c6d7dcfb6260087042cb9f9eb3bda6ee63e47739e3ec34cc53a27593e310758e9b43d31c6134b3cf1f30490ee066d95ee6efe5b3afea5f1716e69b42ff13fd7796769f36ceb2d2c936ae9bb91de792d99fbec983ae1c69735c7d49d78806d1e3d169a048329bd6d926f9ba4134756e6040856995da6af444b7fc9c742f1dbe69158dfc7274911bea5a5dd6cf4ab6c27cebf3e3e8f8526f9ebb1d024727e93243b3c506cae43feea29c9f9b78ce7f8586852fea426ce689008684a13553491bbab50f15713549a4852858a8bd46da00212014dc9f57396080653d2d9da84abfbb1add27164a20b50fc9189a6069938ea2e6d4cb4aafd9cc5b125b8e8eca8535a624b836ef3d7e66a7cf7758929b6c696f0719c404a9cd1ddadc49606aff51d25254870e6a9444febbe96841bee988ed5a8bb8d742b892d0dda4a94c46d544a024883bba9bb2fd6d246f1effce5b6e80c9a6721b5d299ab6d1d0087dddfb223b92f5eeb7f53c24faf95f9f8f82825b956288fe30c916003092cba658f04938e0c0927348f654e86a74f925ca9253f4795eadf743eb1712ed94b92f3da4a67ce004918e0e896f3a4374ff2af01fa6fed082e383c8fd832ef0e4fdd1153ba1bbca195f8889e16e711acbf3123ce18b1115afc25be114bbaf1384eaff17c6dcc0837c2a75b4580d10dfad7e9f89661688bd80216c1143454c494eeb645ad229634a6fe2f5444ff8d0830bafbda9c08e4202622620bd38b4c8868cacd4ac4ac418c692526a207fb7db11201a41bf4bf2915600edfe1429a0bc04677834a055800587596ded0ca24dd579f9967900f8681c17cee91e309832925f9afc998668e56621f9b996790bf6a6825b6fd2500160468eaceb4bc4280a36e02d450597e4c00165865f65f93e5c743b8d1600c5104adc4b2fc7888db9589e2bcf3c77008200d5699c9c60feb0ce5a87f85e00256998953082c682596fd9215028bccd6ead02edb5aa53e986912f9cbc627890cfebaf3fe609b585a11c7a742e21016c7a7b5ff9acd398b65ffb736802d3d8026507cddbce501cc40b1350020a0cdb57469de9e86694e0070e44a7302e8a21b1480961dcdf3c7047024809cee6e26ddd2e246c64f6ba6162db41761ddd2b2a4db662d3e022006b6a3e7d27ab555fa0a62e23a3b3ecd7349c3f6a60bc0d8a048a3e2dfd05fb399ef682ee2a91b67b64aad00a81004177297b158c56ac3c71e041641dc409bbfb51a0f0248833640c0413b0304020b507c3c754030758333212cffb70644939bbfe40f10de3fad2c6efc588a7f0bf192c7b274d1dd2d8eb68938da5b96a6066df4e6b628599a748333cc3489664cef62cd7a96177d9c34d7b7d97576fc81cb38529cce71947e20629c3853919657e8e8ffb726d37df581c1947c9492d48c9ed89bee8716f6010e1fc0e81ea78cfcc7f9a0a5bb65a50f533acf1765321f721aac32f361d560959938749fd68670a17d22d25c4b9b9b17dbe658fbbfb5fa58ecadf5e0437b119dd207c3604a788e3364b23f72dc32d53571c1a2a96989be28c3b369ca384ed92dcc93d694339b8286c4221ed8d83d0e8907304027e90db77868c254b4452d1e5ebd7b9c7f9e34b418cf1c752c2453b7d85fbf44c7c7be7b2778f74e6030a59ab597dc618eeece8f77f84077ef1e271ba792120ca624dba149397bd186b0d90e40babb7590a3bbfba65aaf463a7069af311db008633a6821a72ed6d2e10928fe38ce1ce6c8cdea7f53ca618bed96a4db2a7d9ae7ecad6fef63b9a9ad1c943e536c6faaad2fd290964938f4a0854318dd0dceaccfae059ab92da44cc27933d3bbcd8ec3017060d2dde0dff2c5d7d9719ce1933ebbc7edde0913adbdcfee9de43e53bc7b1cadc458dc68b0ca0cbf6d923272fe4d961f6301a3b114d1586660951996e5d2e6c7589634586586a525c3dd99fb7b42b77670ec34d060951913adfd2565e348714c72fda5f751226d7e3c6f334ff1c36a2bceb5b440b547c2775e261f565b048329f9d8f86b87a7acd1cd2bde32d5c932b572ff5a2b53ac1427ab5337cefcb63bf3e766bd8f0bed280e15e1aed5e5af32bc688168bb49746da53999acd29cccd62a95e5c229b656877e2c459b132b7542eeb20c33cd1cd3cc31f99156daa0719c61c63627cb5326f44bd4762dbd2fd6c7438a944c33970b99f2e3429a654c33e7532de5594a920ba7c0603b4b622ec91b9e4119bf8d8a3e4dee8bf36f557678aae4ec38929ed20631b6f4d2b970cab5f7be110c96f1e739c260b990e97336cca51d6799c389ff6b3e36354972e1145ba5bb49fac87aca5c3845a4327148a4b28c6d5884c84e931b9eb7accb6e2ba6fe77267bdccc33dccc3b71b6f01862fd16ae02536910e3d2316933ce53ca8de32ed197a9c15c1fc7aec0d1ddf7e9fdf2ca952fba413c75d36b9649eb4abe820207481c5a648d5da341f1c5ff4ab397744cbdde5fb2362207c791ea76238d626c49ff5bc6a5bd6fab53b4c9a5b5d9afa59714e75f5ba55e534bc714dc8db8b474e92f79a45bb6c9ba50d918cbfc36b1cc9539ca34ef63ea758a5a949ba3c15cda7cadbff20ce94896a24f9aa9bfee2f7db5553a9fe6bb39fd16e699cb6db199e5c22962fda4d9e79aada9f7758eff857237f173748e61ae66228d2f1897a0b9fed2fd5cd61940bb3a89ac556a27a87c3366c474b545d95a2451379160325991d15012129328322631c4908c94926432d897573e2357193dcd0469e619646b75e883418185621afe1b90914a630c1f7ca631d7184cbd42630c13bc267ce8e16b9a8107011e76d0e1cb0187263450d31a68fcddddf2bc9f42f397dcd1a460c1d703035cba7eb9d18501a6b6550782815707f51c7d3231b0687fd9a22f63f976f0cc9872811edcdab0cb0252e0c279959ac41a062e0b80d0ae0ac8ba1bd7f222c13ece34734261bcd1ab309cf05e5c611069ec9364473b0271b599be461ac5f5f1b53aaf8fed2df45b5a1a1cc4b8ccf34e929c2eb870a76efaff8896de27fdebd08e366925f66ac9d2675fde3c739b1f895626892f8a31a0fc4912b801c30e30b878547cb8eef63e8a6925c6b64a5f35a62207734c93c8f1df2741bf41432ea4466925febcfb01ef9321c5f3c77e698033b7a14db534db9c8f34ace56e7c1c1d6bdc463de397520c0bc9f38533ddd1d04a4c33de274bec076862813b31ba99622445c9c13ce441d70ad1caa46c8b985efc251a4391f82f442b8bf4688078c353840600e9eee92e84171d680378314433e1c513507c047431c72fd12e3640cebfc1725d4061801b0ce0d2f7c5f94df2b544b8f06f400b1841f7028816c0a4dbb958417e2cd2c7b4126fd1460ba951f259e96eefa33e59b8d1bd1b9572c899718e662d7ab458418b15ba1d960512edca0248027c9c9ca14cf79549942972e8fec2af7eb35546dc304595436bd4c7aaaa016dd55e9d7fce2639886925be8575de1fd5153f4e28f49046e9c056e9cc37bbbf196b7524da2a43f727ebfe6ef8aa747f548cb6b8c284595ff75058e146a563a551bc0958e144b7154ae097318f8a12239d372319a7cdd53a2d57ded0a7e3176d95d95ca9ccf3c19b001eeb9dfe4b9676edd08bb6e827e8e955aa1406a3e5ca0b44c548e72c97b999f8bf24e47554e46e4bc5a9613071a4b710d6fdd9d0fdd5d03d3a3aa0ce4df84b3c74a450814d4dfd5149121769ee9bf2197d52c29042065ff0c3fa18bf2ccaa7d4fd25757f48dddf0cdddfd167d40b704551b66d0b9732d78d32c3a606673d071b99bf704d0b39f80bd7ec1e27dbd1643250a54489df324469a184ce3bc9d4100eebdffc3575291a2872ba5335b812e04677db9aca494012dd494131a128e04c96fd3fc96bd669a1c71cd320ff5bb679eae6adbce98e88a0e4df79ae187410878e2776b1ce69c79b38afe7c6bf393bdde2196803df5f2fa53a1dac4dcf8f33bd653acefbb9bf9134e7332c457babcc66367cce26cd1cd31a83c1ef4b71f0e9cdf6c12ab3990d357b535e09b1d57dadc224c80808261bc7d7c16024b6a18a0dfeb7d7f9cb6faccdf12f515bccc1c7b9d2a9fb8ac97f5c9519ceda2698ded06cb6d9ff4ef15a9dcf5ca758ff898bd556e92ddb2231dba258b645bb1ff18f301145743f171fd1f7a4db81f44ca52ea4fbeb52805c77e39c6208c0463be96ed62743ae9febee16ae5d04f0a521de00714643b0d18db3ae21a674eb8608ea6e971063e87046778b33cfa0fa4f704871a5a31432779b04e9bee897680e671dc2bb7722ea6cd18f24bd4af82863fae4457aef2f1991b9704a66faa29ccdb80412efd49150f0a541e2dbee1f85b5b4b5c6329e4f922a94a17166abb4c303c52ac5ec980494b16d82875eb440f993441a8483c8dc6d0264a3d815000074e3a7738747f4fb249e3fe00ecfee71331b9b574dcdbee04366e314a7d7398eb33e6975f689659a44b66aaf149b6d511dba2f5ea3a4225b243e111ec71fb8f881061988c771d24abc2347d1e6faabb63265a50fabad321494ee6ed2ae1e907aa0400f4d789e6ef3e5ee71353dc0b4e7c9f4b5bda6a6130478e8b15229ce19e1e1d1a178879b543c18c1430f3bd4a0fb65328785496fbb4c4a3acce1ca21c8a543530e2fc053862ff8c38517fa870b34fdc3851ffdc3059917150e72dcda854353503b0c07563b0ccb1a0e73c2615844876179753b6c57473b6c7746b7c3764538ccb553da3d6ee70e93b998de60eac2619889c96178b68b49a6bb756c384c6c976e74e986386c89cbd212bd24763b6ca95de512ddde0aca972b8f01ee32997b7c3f7f6e5698387fc6b1f4e488e3d3f972f07fed97a80de703d978729765dfcdf7fa5ef85cb0a9f98478df020b2ba84033f3b997822f850f05ea44b7add5a17fa17f217c9f9272747fb536728c8689bfc3329f900720996c803cdb5ae341641398adc2c4275b364a8389efb2371bc44677df582fba1d360391db2c7e0e067359172c0a15070d3ab6e19cbfea93ee4ac5f993eb406e0294c9616f9b4718e3a749f9b14cfc8ce7133cce3c836a46985626e1dd3bc94c5f74bfea8c76ef44e85f28085f2b5433aa190969d7d8a4551881e074d0edaf92068361205ba5184a7707b50b97040e071c897bd2ed305bab432e9ccc7c310d979521ddb714436ab34f1860c5a3306887512dd876a7032895eec6a27ba6a7b88d60469c3b3513d4d438cde0aa2975cf663098eb91f84edddfd7c5f5495c22f979dd5f7b53b8c2b02d05b1cd24a523999bb39948e64a9ae7b7d924076724cd168f375c22b179c191dca723f942ee82bfe0ff35598d2b71926659fe11890d49734d38ce50a6c43dff78ad90e3e0f82be3f2ce663307499a69feb22169aef19bdd78e74873b5bc37b9da3b9b799d9ff33ce420ae96dafe7aad96a4d9e7cc34fb5f9b2dcd667ea9b53424cd972ed178389b3dfd9ac71c5f301732c9786420b4bd426f9b474c8ec0dd38c30f83e1d2ee76e353db8fa20dad71a524a649048abf7b8d33a437af7f3fac460ed6199636b866f1cc18ac32ab19d5679a44331b7c47c3733762c7749c742ecd4b4b6b6d1ef31c7ddbb45937dda6e6088ad2912d7adb3cb245ae1ab0a896d6d0442b0ea98625ddad9b89f39b24cd6a90196ff8af100d26e816612e1a72e806df66d7943a5c53e0285aa2db6153d6687168ca969e34ca94b17bca911d1e31a9a7c4743b6c89e659846317c4c15260c8f882d586b2284d4469ea769858290e97f7c93209c7da88674617265186e4627041a14177673be2eeeef1a45d508ac017c4597b93e112d7c7d586d6b31de7df5a7733ddd1dd49250c1652f12b14250c283da9aea439789670c28bede86e567b752415190d29011541914136254674d31ed210d211725e9d6b8630c879756ef30c55b4f8781ee17fa10a056986914e21a224a0c78f9b4a8fef8ba20d7f277ed14e9cf59362467674771b75a01b8bf571d1134a43408fa1d421b1965628db225c689fe427cab608ff0b25659d7d924ba36c2bcd1689f367fe3cd28f349aef078db459a10889f593a03cd1413f19c1132edd1d820c2bfcd76e2194a13adc15c3175cb886baa85376c310d29093212430ec2f2b3669a349089a9061812611e8762691defcd7fcf5727ff9cb659f6d753581920b996e5c318c9e1c4431b88480741c9e0d6ad0edd1e073b37a33e8f6641083dcedc1e14100ffd76050a7ee97a8addb7b810bdee8f65a308e33648158294eecf6be71f656d0f7a91bdd9e0ababd14747b28587201b15c3f58743fbdb9862e254ddd5e1b27304109d820417b59d87b999433e8ec93cf33a866944b23d1da187ea44d3a8ffe856cad0e554bb33834e9f8a225c2ff42f9937ea4cdcfb60817da277fed38f1fd255aa130a9b7fc819244e6e81c8198682c7fd26df2494948bbf2a7491e626282f44177fe08340265f2c33086549f3402d27d1199bb4d62e22b8de304e25982c172e1149e283b5172e114256e281141e742a69c9d1d1edd441287985eac13e3bfa2186bd70e28d0ae1d50d1ae1d0c31c28f2fd63f3e11fa87e746fff024d03f3c28fa87c743fff06afdc3c3e91f5e8ffed13ee8ee992225749330d35d88f4839206f8d88ea13365fca58d8ad5864e5a2be50506a4bd0bbdc08058576b3ece4943150f58daf4dd1cdb531a4df84ac881f7f2803c3a3c150a36b083826eaf034c5c2f0c98c1810d7473008d33ba9fc4948a8c6a1842326ae233222845322631c492929810c9829062528ea0c8a6c48866b636a0e78a6ecf8c0bf488ddddddaa76f500f520e931c1667f39ece5301d74b791365c46ce6887d99bce5f46aa68fca2e7d21a593232bb1d96e74de72f599d21feafd9b88c946084e52a5287c37ce66498bac36a7f650efbaf1569a31d86648484c4c467666680b4ab881245922892435fd90bc761b5bf38b81cc95b62d94b56648a2b51a264c81c45bcbb89d080c80a5c44c268d9381d9699fee5305ba5955ea52b2e174422b9ee19257cc1cfe414a76c173a6c081c0e1b7201d7102f8658e11a92c5a6c64187cd544bff4796a9f8b25cc8c433031e3778d870582873d86bea80ab31b9788c74db8a2f98995ef6793ebd79678976d867ea95d1ed91d1ed8dd1ed692003dd1e06ba3d31ba1b75816eaf024e747b6174774fb7f7e09dd7d65e2f2f2f2f3075feecf2a5a20dffce4cafce630070e9d480f80625c00b0a40608a9c125f303f0e7e9bf8f605a65a8be7787fc9c86bacbd1e170e12f882627d5c3869b91b174e7fe902977814b8710314c5e9e28fb11b305c37437437f8619d37f76fa2b86e9e74b7fbcd911b13dcc71dc6c4444926c260af1fba3ba65d2fa6ee5cc8f4a2d2f88238301886bd0046b71d2210d70badeec671b970816e50a4e53e0fe56caef3762493390c5f3087a72e9cb51b9d19a41974bc2f3a80033756e0b231410a2baa88228a6e8f8a6e6f8a6e4f8a6e2f0a7c411c3c92392ca407876171a8568770494862b53f62b53f40ba2f0ad27d9128be28c6745f04eec6cf938a9fcb51dfcd1c5f1b8acf44851cac32b341a4410eeef07ce2a0f8bb31d70fffe61d2dc4d32bc5f49798beccf9d36618cf1cc436e2bf7699d63297b3618df8d5de27fd15e2a1fcb63b95c46a75f689b54a397b859032a64facd250b645d916655b847fa4511b1d99e85ec85a25241a17b041c3816e178d4e77afd02e1a1e9d849b2f05ac5977d7cc015c3363b70a9ea77bee319eb624dd4d45e6f2361a5f50f6f466a5fa58ec15121f8af82f561ae2471a12917e8892a420552862fe8ced938ccb20f17556ac4c5c29c0d1ae142ad043ae1414d0dd18ac4f982611582df55afd99af36d35bdaa559f3e9b5f1b10d72d8573a7acee66c7f1ca47ecbfcb6ddcce1d2ee861c4cb241eed3c9d2eb931686c3f4ded2ee3c4fb7d8ad787fe975b68983e2cbfe96e1e34a675e67f8b2f7b1b80bbb719c7f5df0d2eebc36e43346484c6af0a25813254762a2146382148333f971a52428440ed627ad78dac08ce790838bef4a7c3c871cdca6c6dec7f2b766bdc841f1454bc298963372123d2e67bb3b5fa4d856ed387d3673fcc2b59acdfd38389b9596069fcd66ae83fbcc33c85fa2bf92e4e82d899c446f9b4adcdd71f06b6b3098bbadb3d98c89abe036e726d38b399c2f5aaf5910675a4b1f0106ddeda45d2338d1dda010210e13a9ec856b7f7d572791b54af383926c95d2a6589f64625287909eb8449003ef1ee712610c70f7b8177c260e3db953dabd93dde3a6d7ec9c553bcb6fbb85773ef6dd9d95d230bde974d833f9b85ff21f722ce4319622d21b0d69ce561bfe785facb808efde892ddabd1331481c8ad92217004290ed75016085eef620184c26131f49fc71a44e745ff4a2054a72fdf820edfaa18489cb0547771ff510494a02690de7e08e46a88708c634de432429c9c5cfa2105a1088679ea2cdb56c92f1a5e5253de317475be3e43f2ee70ee2423b8218d6823b782367fff7961ddb5aad51b7a9f1c7e3147270b6c353ce669ea7a8349bcdaecd490e666c475cdeb2db6ac3d958adce6b7466c3f4621d7af92825b956a86676c37f3f7fcd31a675de427ab3e3b7d55ffa918ee14dbed9e8e838a419d39092b1245fb3b3c67dda2a25c949e4331fa52438f7b75cb3374cf6c7c19b4a7d46b14763ad527f4c7543ee168fd35f0e5a0767b324076db0905c8d3b88c949f4b2d9ecb924c769832bad71ec60d0d09d63198a3f8e13c8deafa1da22a0a06a43ab346495b0f85f14257c32e973b3287c3229c5833b5870cb4deca22d82c3b50201191a70adba70ada670ad9c70ad0ce05aede05ae5e0e56ed2ba0d0b35386ec382fb8b058791d65f2cd4b8c3fc85bd8a6b35e45ae138cca66692f6e6fab27973a5303a5caa333e6f0b14a72e58b854526c0e5f3097b3218ea772a56e78fee8795610ecc04177a3d0ae944e8358e642e9d0607eec36e3d25fb3fbb65927d1cc77b46b6dd10a66f0ee7115f09648801aa7253923b883c7f5e9a0672a759dc74baeaf04ae4f747d4a0da372a9542a352a342a54a8d050b18135d32c5015e36a17743756aaa20dd025073738e3386517a4ddb104d313dd8dd39d6221a9c7a8b4302926c21e069942cecc80400000003311002040281a0fc70332c994b84e570f14800274b868964e9b8ab3248929859421c40010800100100010990903a026056c24c73aa8ebe0c067b5dc16621b892e1d6fb1e8b65ce1398559feda0c8ad9b043e018c43b63051c7ff4cbdb8ffdf665e4f8e23bac1b81fe2b27a497493ba5985fda3c590fda30f5dd7b15ab7f3ebae3b18be314d07c23270ebb33f36d2081740514cc931981d79b77653ad2d83ff839a9d842ec8ca03c11e618d4f380181da273149cf5846530f88fb6f235dad86ee6f6aafd3fadf26a8383d46bb51043b8c810077ab7bdd8f30449e139e48a97f1c2fc26a9cfa36d06db4fe6213aa79b2d32b9ea8e06a4144d1ab0867dbb3b4dbf692385feeb2da4e5721c6da25f5da9705c33d82e6a6fff650e455e908e58fa95ba963373a825ffc07b06fb0bfcfbdca125cb08eabf0be8266ecd52af3cfe34786a73488b5c2528883319ba7630296af345ea60e1596f315e9cc727f5c478c799a162621a6fa788a9e16020e7ae3032174a1cd328751b9b9639b671a3d196b2be023de52c4aa008bd456a771dbb89a455fa45dfac3ac5bc4e6fbca6e11c3493af248aaafc54ccb76303fb88086f2a53225b88c3b96928393d0356a4bef2935cee47bf74ae934ff1d7600fe2eedcb11756184990d9d7c0401ed72e25411d6b78ecd000f0d94abd02f68bc284b2f7e424ddf64fbb25f6b84e491826529cd8ab274f181f175d3684ad2decdd0c0759015cc7560d2af6de9ffe51da534fe1381d50331f84e2749e5596dea5e6b6ba811309ba748d59fddb4b5c9f0e40b40bddfd7aafb206b489dc2d22342f05a15eccbc1d94dcfa2f97a3075e6d5c5a0cf938767c2b51f5fa7c47a7afc79f4062cb6cc2e18ccb056fbbe0d65769182ef88dfa928af57784277183ffcaf308493addbfe843afa41e70cc3248c63b33025c297a53a3d84d73e48da5ce9e463e3df81ee75c079756accc4ee02b834f61b7c4fe9d86952677e6c4d53c1932638571193e55a052c9a0634dc997bc02d4086c2fa2ac6b8d39cf4f45c9a348116c12c18d01a4b3c8852841dcf17bfc32c6392c3b5c60c61c6bb7f2722f5ba12445831f6547747e055cfaa08532dd10f482937d7cb90bc873bc64168e23d4566c32dba880f91af0a2fca8c0834ac07a56b648aa1ba10c74a412eb40ff0de8e49ad008ff681fd1d8743c22d6bdcfa42e254d4a9c39710791e2359a5a9ed04e79ce8470d547506e8e655ddc51d47023c18770e37164736e2465ec69f7bccba40d1db82980b097b739de34e9765ad6fc9d2c7340020faecf861d9213a3849a93e8ab01f1b02e09e92a7235511dd2d887522a923ec61bb4cb64600e8f210eb43ee557917f1ae400eb9853a4e5371b4e2106724b18f703d61eb6fdd8811f38802e909527bf0dbf98170ef7a1b293fc06336c4ab7ec0fdc1dfb2dd53892e295f4d37fd3df6422847312efc306aef687f624fb7e3fc44b45caab703afec59a65cf6cc35f5530c1990679a39f3cf392851958f2bdef997c048fa27cc361a95c9c8795a0904e9c870045eae5b1d8c0d7ff48e302993b3f6cccc3ee6ecb4bd39508c68fa9c99ac84d942d4f5ccdf75b8e81396a50ae952838efcf62593c6a524073bc25f6e87bab511d1097ba781dc4b233f88a3aa51af4f9302304606187fea29299f32d2b73de4984a852a5e5e7cae0c85ca6c6b7e1cc9581a4596e8658ddf616096f8fd248908130c42cd55c0688cf87c355e792808d542693c5369a0e5dfaee001ca8523e693a3350d38d8b1e35d24ac2a67357355dd4b47f6c9854e732d99e07cdccdb592f6cc5054187294e2bec78f5fe88c2084fc849101d80d4c79585c9a59c954b0d982dfd5cdd7156885d9b1b3183297773ffc3ab52d1be82faf66bc066fffcf9260bcf83935d807ac2bf8b3798f0776e6810ac9fd01ef47bf80b7004ddc6201b3ee26eda192b6e20317927dfc276c7c22bdecb740f1dceee20101343697c64d6477fcdd3435fd455cc33489b8040c64a3afd83c8df43b2d241238df5debee5768964044a40ac51858a1552aee76f3d381b2879a6a0ee63cfa410dcd7997d9ff2fe0d729901be8fad3124acb02b4ab8d10575767dd20cfdecf01fa4f51cc551fd4b0f6e08dc06fb8475f22d2ac17593d6576e96aef4f045908d57412332f04cff7e5cb6ff05ad63617a272be76b4c1405287ad30458f81f52bdda2ca083dd998a35f667710924a31922731d8790000f699875101bc4103923f08f54eacc017f152e7fe45153c83c118010904f6ee5d6f81ae59cac83ef050913cf014ff8d75cd8d7fd078a8327ba06d5466b74d64a521e77af05fc57539853f68ed40fa912043b985e0abde8a6ad079250510583caf626f78ddc3152f9f7e3e33faf7af79f17e9ef29196a040f2668c73faf61647675552cd5c599bf5b3338bfdec3299ee1bb7a4e7f79fe7d2c62e6d8923c85a3754aa8ee00652295010c7f0e2419fff0d564576b9e785eb1b37983867450d93c0027e9331b907a680c2f43ff23e21de25eb8de014a31a07eaf29cc24f54ce13771faa5c1b465637c5b2234da84b9e8ce8f7c2f29df9979ee0c7831b76e0637112c6078f078748691b5c949f2a597668af5ddc04303cb5143b4fbed0bebfc95d9be991ca90d7445e15acaa480cb5038b2c9745fd663246b5fe2b69d9de37f3a898bc23288b17d406b9159b99c6c4b3dc5e2bba12a3f8e84d259bf6c0efd6a0717e58032d1ba49fec9e3c7d6bc7ef73e3d8470cd0ce7fbb18da35c9f1058f635e5c87d63c502b0084ce7c1824d873fe36db30751637e8f1d73f0acb2a7fc505da49706c136849b1535374e8dff13651fa91ae19b76277aee68915acc02a7cab61868791f417aac8209d15c61595408afe2f2a4cf828223d98bc55c16e4caa5beac871d09b3cde1e1289cb6782aad0c5e66717039de01d41fabf179db5989ecb17c9a3be6fcdb723e5a6c429950c1d0997a9c674c89d36feb92de921e0df476aaf2d349e2ab87c0d041af691b96c9dd8f3b5cabf524f9bb0e5e19442a3df4672e7ba81ec831cc89af39b08635a1f717de3981ff9f4226bb8b904df6e47088ed86ef050ed30d25c09d943d3e3a5cbfc89d082f494cc29db1eacac8cdb8ad9dc5faaaf288dbbbfe717616e2d9cf667665bfc6bbb3fa116b698379a08583143a770a2770565351bf89c7df49ba6ce30ebfa6163bc6eb76665fd42b105c7c4e640a428d3d893da32f4489f372f09292dbbed4e5f1f1125513392fd01b4e0dd419823dc7509f94f8f1a3554d88cdd8e907342033d47b7d263092ad12e6d65a775ad0187c0c8114d09714c89136c3459591edb09f1dfda60ecd0d997b96e91eb8d0b74fe66179a73a8fae061b4ae7108bb3a3733d5ed76a2ac053988eafef7a25325c9d3f5d32bfab7d9e2d2e6587ea329139496c4a1ad61d00d5d0cc75d11a781d2e50cd1e888a8a5d038e04feea82d9bdd08de6f7e3d397af362d6a763a57060ca68a75b53323e38648e780ef09a2e73f9162383de6f691fbea5dc4245dc385db486c30451f01b6908dec89af913b60ed8c052b7a6e2fa645789e7237a1c03eeb54171302d247278a481b91173df0010584555d90367217aaa88325dac7f382c05668e2a212df34326415c665475f9ce7b0156767c2b20bcc32a412284c167ec781fa14dc6c2a929b7c3ffa58ccf1e3172a305ba6641d050fab5fb44d1a5005917f8a0ec6a080cf61fea868287c01759448353edab886088c3064d0e38b81b06b25e26c7fb64a14f3058e073e630e20967064ffc769ce0d08c398707a391b13145777d50ba125aed78de42eb7c65bc0b763b3301440415a3047872dbb9bfab5edbe3042ab04459f9db838896636e9856290e341d2c5d0b1b4f16d080d4ab888a8060a9be92d18b28f7f41bd9e056b63e7060c30d5802c3eddc4be893abcfb0ab64e4467f4b0a379fafbfcc9f1648fa5a4d8c9a12a79e889f54b118d65316d968cb7a9525807ab51f8c80661b85a99b8bdd98f023bf42d3ed766595af629fdc90e7249a797a9548c39c6aad966a5b41e35144c6e905d113ed5f40be06a048b0ea88ad124cc931df464f4898bed026c64b63ff4373e81e5b7eb9e4beaa6b16f3ed32a062b005bacca640d135b4fc9659acc61fe432ad668163bb12412eb8b6271a75da9124527f7735f9d8b0c70c8f50eecf952c2df603c9f7dfc94a104a4f579ee2b760aa512e4eff4fcddac58140efcdb30a719662cf917d1f3d72e9c8435c9e7ad98c85176e016a99c0054321cd72f39821571a595062b917723bf61d1443174e5091c31ca4a0d3ec26d6ebb5d5705c02884241bd92e7c1cbaf89ebf3223aa31876d30eb8694b749960aee1b54d3752760bd69d7adb36948bd8dbd13581a92c2e2daa48fa50e29908a11bfc051a4cd19d01299d1ff2a441db8129f4259c38b10aaed35eaec18fb5e9e338505455df8589fb1b8389c020e36442f52bf95ff20e67d8d49784261c5644702a528a9f7e95fc9f4a021ffd40758d36a9c762220841c80ebc05f33f056bf9bd83f5d3147b62c3adb3ab53633150f29b655bcfecc4828c42e73c4e97c3d8ef98d6613511596786413e5013e5bf5c6f15694a4b1ac9a3b28e552fba1c242c2e82db7ab08981666e477b50630b1e5c20beff611579c1bdf3d18b00f68604b227754966a42e614505ed2cb4244b1ff79759291fc6d9db6f0216eb973e9f6dea48919100e6161502a8c65293f57aee31e761576d1ec9e3e224fbaff73bab8555d88b68923b91af9cbf94fce076003f28e03c03184349a672108ba0d7e322fc9659ce8571c4044ede011e4a9f5b49cdaf2e384e876a1c0a4b004fc3e817fa589e48757a589721791ecc3d3f7b9bcc530a88672826bad026d5eb3f2d7201afadd36431a2bd83673924c6a68c3505c9ffb3339cd25a77cc3d647d8c6b5ac44f062b4fb5d1bd76e46e04381fa6c28f3ac8308ff1adfb319c754f48ca9518b6322f5e708c1372ea51386b7fd51d0feadc382758893599f49789cb9d054c5c50146fbd4933fe81bd4f7c2cbcd200684a0dfe0ef5d617fb07464383e40b735f1fba4583c77ccb8dddabefeb9d0c1b2ed77a92d776d71e40aceeee4b3f7c0a98178cfae7c4eaad7c08a9ef97b009d6fa3505adb7609cb31dc52c814897a6bf359a97741c0eaa91a4e2a874b5cf9eafd6f5f055f4d7e051bf1262c43182771528f8a0e63169377adea435036b8c9fffaae848a47ec1ff5820dedd2981a573588ea80e702f49011618c9fe28fb230d07fe73d43673d21228cf4c62716b7e08a5b9f0ffd44f2a9f5e7af3197216e21e927b8c2e9a881c6c3772cccfdde0a0b8dcef025663d6db91cbe2cc134a219b6e44fe961cefe01d2f750c0df5f82c3817d1a60fa0de54bce0b05369c78e8de796c7d6075cf13e63508ea3861fbf6b8d4d4f744339ff6cbbe0330051d77ff9e64555cf9a2b55e8173ec6fc26a7f60c913fcda28241ce76e53b6e85a0f611bdd1c85d208a388e85af6d32d9e42cf994a513fe21e90fd5446f607cd82da0ec8106526c734e72728dfccdd4e9a3426139167dcb445290c4903fa9e8676d399889e6e6cbf8deea66f7b6ab1a40f7048691486da3f01329222d4029440c7c75540e36188a901f32e4d10c575a3b879c122673c50c389a32b06208731f4763e944821ad5edcf00de058b1476d3234c00d0f18dd2833bf90b73fdcf490aae2f694238d64c82bcfb26d3b313e80141bb91c516339d7ccd1dacec01dc63e968a5400faa13994746ba8eb8d50149dee259354f27a280ff6c8c284483b12ae6dcc20ab0d9b9642c15862c9bbedcf9360764603da910ca730602d5bb34a82731c6747eaa005f1949e003cc37f7b45248d17bb15bb53a4fa08a657d0a52da3f9d1a2733105837471c69e2f26ef10bb6f80f794e1d6c9a5c045d2c21fd7e30205ddf506d14ba0fe939e88be5336954888d5b2c9fa7b96063e50e5f0bed8c0391e3a2892452d0ba2b6f5a1e38a3fd58426aaf5b80343580cfd9934d5d3ac2620d538bd3c2616dc11350d04a44db8e3bca1517fa83b2207dc36ed4ea796364a0602a485acfaa8e67b4ac4dd14183d1eeaf999591d17fa6f58f37cbc71acc13f239b69ee74e6cb6df10e6baa7d65610bec2ea47ceeadcbec61d3a3d5c99e2d1d8ab4a4ef528bb6a57d5f5ea10bfd9311ba43955b2ff82c16ea12232e508185e7aa18e4b1c5941c51eb05af458964b4208ab095726ddba72177024e08a1c1647b5a8d0276986f959538ac4f84621fadcc91a14d3c0a746432a35323a3cd43321cd2e185a29d3b216ad164157a6107239f164614a825bbac777ff03d8c75f03d56122b59fc85247c511c7b13688ef51740bc5fb3a695e2094d7d4ba4feae3f7550030f16126780e5382673afdfbbcb1cccc7f3271647821b192fea027f317100793af8a376dbb4718044f78ebdb003d43957e4840e3ce16dd9e3f350c8e1c6fd78c06d5bf70ddc6075d6f9844326e48de44f88f03ae6f437165201f1b20c351a286a5220e6cc3115902cf322897367df84a9be8bdd57a21edefe0c366ac095d947c924c722a16f0f96517d28682e1707901961e4365c1871dcd9feee87a268d0002cbca9ef3643d431c0e1e394f61bf8c554f3df1f59b04fbd025568334d585cdd24af04b607d05b166c52f8f55ee8277bebf7a0f5855e19e181adc2b1138ffa6bf352866fb6ed2b3f8efa3bff44b00f1e1e46f0aa80b7ed1082292ac69c19652c0933506d35c7fea001a43ef2670d7916d4b32f131e594ee1a2d98737e91f8a873783b92eed04e308c3fd006d9c00afa4b8eef8e32acec09042def02950b5fc2c69bf3fb600e2c32bbdfa20bdf96cbc82ff4e640fa280e76ab4be5f799ec77bf206c5ceb3028bc008dc799c546484ac101a32902b2274a69e9f1e395ec24f5c7c1dd316ace9cd09072a2a51032161145a5a150f7debb5e1dadd4ba01de5f7d830304f66701c60f276316e7f7a4f103bc441a84ff6bc416944ba1efa0b46cfeb6c252c9589180c52b4077e8a3d43bc997cbf544124b76752376a67f6a7127786632cd344b906c77ae79f2c86224ba6735d2b24e5d70394b344d3a520b222cddd421809ad126f39224718b3ed0dab28180d4cf714a8715b9c31e61fc0a0db4b968d699cdb9a9ba1d74d3e5a53abccdd5172e4ab4d21723febec99a6386f5865e12c20a0b41d2676dd8e0d3a975dfd345178c896ac777b1e5320f42cf09742ba8a1968ad7672b536e36d739b48cd10959f961ff333587e4d3c36f5660b1d113006f945d0f080bb3b58249d5714b99d78966774a8ea381c858ba8d60de70197cbc08c6b396f91238b5b53b508bafaf6f5b8cfc88f8def496445f6f21ee6e67162678ceb1ee946f17768f2cf317a78045b4e25e1a790c8d78144d5af80a9559bcbb4bf8235e45cc297c4db51c03ef61ff4ba997fa8788ebea322966590c226f7d5b07577aaba4c13fdf1552e1cf0e263d4870dc3167f9ab7b1a79469293b0e845a3f2a1ff4508c87dcf99f7f817d4baecd8d970f1fb62dbf76d30261c4617276c4363e1f2ce5feff01eee66a6a3c03f6a128d15b4c183310bd5caf9a123d8053293c7f26fb3ed77b5c844c26cdd5aff42f5830bde80a7efc4d7b33e58933b94b56f5edb6a88e6019a4e955d611a50b925fc911f57f54cb8045df996eead97ca22174cb6f6dcf225fa9b846810cc0c2ef8c6b0b0432d43551ea9e444853db1ab61eb4bada806a972868addbc0168bc6373c8a17390ef10013dcc26ea8d00f5edbe4324efefa5beb36d30d16f8b2e419e4cc6d9b96b46d24ad4aed3dec455c442863a452ac0377a6241afb6f05add841783d744cb4a2b0384cea6bb1f0470ec5558a6904932c2a630c7214b6cb4bcbf2f8fb0aefd64016dfeabc5af4e2b4d90d7978ace0a4988e898a993ff0b5c7925a9c9a143115267da57ea5ab69344cc3a72ee820e12359f3aaca32db184c5b4176e3c1aaeff9e5fbb84abe50a07e28e1800459a0946d635f3b84c656a2ef23af501f49a28258d65c0a37aa82c1193f5d1d68139201e9b66b777a0b09b2f88280abb0ae1b498400470ed614fd1c8bc82ba9aaf522b256545d6adf2f545534e9694913673b4618aa10754f3ad7b927a7f7e6a27a65e3000409d5246b5ab30b261271596f4a11fc86f69a306a2d8068db908d39720d1a27f60dc466cb3c1feed281d1fc1dcc1521d3d3d6576b3727d27813b7e9b54039ce0a997482adf67b928d6cf9c4b22ab1490ebd378d04579cbe8e7f0534f036bb12cb37c6ae2e7ac8c6ad5007d8f6a3f596d26417ce57bc524c8c0ca340d6dcbcb269c116962990e99fa3fab61c1174ac1d037b0507b40c9923851df2c821345c377c4f8c0bbf938b40debbe83b05b142ef2df8f9ad011dbb96dc0d2ba6443037f946d0288382f1a30b4b1f3719799f3564fe323ea563c28669a405bf9f40a45d471daf13e7261aff9aa84fa344c3abe5dcbb8ca30c8e4ca8708416393b24ba6b1e756391b7da5e31cc2121a667a8bd1f818db5ab34bcf584b162b58603972b408edd04f5148ad573a0bb761be6c88225d4d7c8abb98c0c0b8ae3801682576cb4a2da5704e7106b100eef6dccb2e279a54919f83de6f27b2b3168b3deda4753402364b7a8df7c42e44d7755989bcc396ff7dfdb44842280138fe8de7a56fc31be667d21abfa197bb86135a0704dcc2b8cce57709f6a0961a717516601033383733400c8afadd84359e99ca2c379c0dbff3044928611290a4be2742bec869e1160dd998a3f1ce078bb81795c77e04ff015b817ea8ce2fecf2d59443f389a7a3285be5f12d51cae860583290be3179b3e27a34af85d39ae14697570b5a0e68b9181f3cfc1a98a4195daa3fe1185f0f3d3a2b5fe024b831df4c51e204f3b5b0e6dd80ad0310a66b8493f2850825919d50b42d76cbb7d07c5af57e90a86435f142af2c9b89426771f043a56b9d2c6ba86f31a7f95029fede43bf7fb0b7a45115d0094b182bd904130209de3b66edd086fff994bb653a5d6079fa9eba7056721ddbf7dbe40600a0b427c44fee53e7bc7c6097af14ca349e121534a56ce4fe4d40fce39dddfb11d867b1c99e79a186681500dbb31bb98c52cc71f9c0bd3900c1a132b7e3d6dba5b5375ef2a3f9a556bd965e23c2c973b5a14ebd1df00d2a55a10d0f7c2b0675450eb2865ebe0743a00ba89ee1d718d87f15af0c7b9cd180678daef640bbd8cd4b69bba1a17c8fc24a3718a77b774f0fdcfe91b1c19d32d46e9618db01ef35a4f6bd2cfac94a194840c4cef9b7c70e45e793da65c4108b5fedc9cbee84f35a20e463e80be73f1d929e0fbade6695fde2ce5851fb649b2f1c44b82d57ec115d80f2405a2c8eace68e27d7ca91e736678e8eb570fd532120d7cc5f8f2b6deb9c1cadc91d57b33cf74b38a12840400c10f081c0110a0b8a084125b7cf810387d874bc2f0a0b68918d890a0b7bc8d2767839fa2963a98c333bbf4d636cd487cf52f4567b9f2e292ebdb0bcf6e945ee72f45de74a278873bd7bf2c229cdac7c13ae40c76f2d70f0a9fcbc1f2efd87ce849bcf48dfb560aef8c1617eedb1fc8cee42cb7ca4373dddbaf55523cdd1b390b3d4ddadfde0ee6be2a988ba6ac98301b8515fd969f7eac2d9865cdf2734d9b5d5d0b929e618cf0794295d1601aa3dca771b368507df922d3920cf23a31b115d472ca0fe837f475609d0ecf79c79e4d9d287538d9f33a9b9ca16698b304308768bb8ca0d8bbe7721a69f041513f609bef19e7c0cec32211e66398a43c2fd9c6c10d31fadcfeb8ce263dcd4be16c7ff00aed58f4cbdb4d86c2ca1366d5790e319118d209d51623dd4dcc8e5e79d4ce2b764dc49a81b21ddce616a3374cd91508e97e6490492a3d2ed4492810b99e894584c7ade51f10314297e6ccc03590383121841d93a76a5c073a3025a4f3d2e148065440b7313bebee06341ff6229d747ae67f3acd0dde100e94610b8d03582124fcaee5f373beec1d2671d8a71403a7f8eaa61fbd229aa4688f1bfd83cc9c6b24fdcde9ff147e4a6372bd52e909c8629c4e77924ef55500fbd4a15ded09539285f17b27bfd9a80f5724ca849cdeb0f8494632cdd46b74bb58b53bc4adad57a6d9af9fc04c439ec42c70b23da87f39e6ccdf33b385a1f28736e3bbb83df189909ad821a964b2e651ca8d12a63709335695f9e9b2f0e9f713471e2116269626d31a7f665dae985bff5c92d987bdc598d527a4f5f1ade7877fc39bf93b8b2833cca5872fe44e8ecf22008737f8925fb9cbfdf0d0f9d6cd0fabed79c7652e898c7116dd46eeb3acab963207c9a49f5757e5ad48cb1a8fc698791ab3bab3bee78b1c808f32718ed967213644205044049959dd11f37d7f598b169965895a1ca563458fc1659aa1b04d855b8610b64170f1605b0ba4c799ca0cee72c9355b22c9f0912e2ba2f596eed16f43e07cd1fcf5df7e129a69cbaff0d61ef3d37d848e42f105f77ad1969db8e468a605742b9141f581a4cb9e6695529b43046af29e26db633eac9074ae984816fb132e712b86bc936b5055b989cc32f01c7c2325648707c8e2407a5182334613aad23369a9066fc539df63fd19cdaffced02a5e935b3ab431977e7948790e184573d68c5cb293437241c40ab20854f96038bdceac70aafa14a41b823590e17e48b2803b0fe2dd1798a58ab60055df7b6b7dc18e203cc9a22c8ff456eaec2cdfa378abd41ccd33201fbbeec88164d84a27d09725397c0bd4d6689b02de3f4c5f6e95d6e187d09aff4a8ef7f1ce2852e680fb2a6e27421e7ac4b58f72854bc53c790c3aefe315448bdc5b2e783d2baf4a0f1acb7c956470b7bf10301dca9d5ad2c868f10ab75a0a97094594ac617c8225eaf3cd61428772d71edb87035edf6f741dad3caed48290307cda31f1fc5c09017a9270d5a399570d362222f38afda2fecee5a6838ce126217bcf6b42b5debdff9777c3c26a13c77e9477450eab4fabe81fd699f09664a267c4d57d3d3ff9509bfacc4ade1c36184e14e056dd3c38feaa89b33054698ff3ea95df401e9fb83062ef148054b02d0e93e71643c3d9dd1a57339545e0738394d1e9bdf89a5aed4fd295518c15a272600288a7d12aff9a9ec6d52b23724dcce7c1c7ee56f78889d49c37c23f14b22e86e2ace876ee7e2bfe42ef9211863984fe37e86867943f21f02a55de4bc53c04b56f137d8e51c29afe505abf2eaf6870b40f71c3360fc496c851208e9b53f9a357bdc25be695ea0e14335f671de8db7aee24b0df9e8d2593295eb0661266d0eea9eec3e75693f561b4ef4047188aac62ab646b23b1e2bad429cbec141c63cde48df863fc727de5ec9b798fda598444dc99783a8fdb47b73dd7652c5fc653c8585b5afdbdbd4276ff9c705418dc4323ac23722a63d1a8f776efb8943b551b802a91f0700a9e95011b6f325756f5b31d97578de69be5b12569c2cf4257ba334301c97709c1a18e4b0befc268734b5f4103781851762c62c15e4e707efee6a47c23d3be5afa43e17760c3717731c2cc96f547e9676a05298f668357849f860f99feebb8fd2b86052079258fb9010661c59b49dda3295b3a0fa2022fdf71a4bd42546423a043870e35a541ead7c40f00aa6c1f9e005e9c630d6435f7eb15b6b8c5f05d2abcad031f69230b5b1eb61072bcf436071a7015ed18b7065597650cd8f8706bbb9cf773087ded67eb1fcadcd263ace89b4c8a9c08ad1b399d2ad69e520a8962c5c4c7d42f7fb89ef942a51029213648e87c6a99b93426d481e0ed33e54d880ddf9621ce1094d86e8b718030f9e2ac03cb9fcaf72ed414030ec2f4b8291aeb166d959c554841967681aa634d5a6d967f0ccce33bdeb39300ed7054b813cef29b452a0ef107590969bfd06c071a68e90313ff3dff54d84b80f803f402e7a48acc808fad213ba4e1b60003f0eff4093abcf5feab757807fc6092466a2fa62392f3133cfc1ab47096ccd145cbc33bf2c518843b755082b4099f42c088c5bb661101ccd2fca0ab54eaf73042d529572c46bab47ccb01ee7ac182ba62bbe2469f0a49d09e42c448853b0bf0906ea674a809d9f978c878c0d12536e5fd2f87bf35755e51645af8c2288edb1c21af7f2112652dd7d5aa8efda0d20301c366fe071bb3493f1a730a64c9a7c0abec91f762ae949237556a50938a37e87c55d82b3ae9a82ec91caf6d8991d49054259e26ac22db40b93dff968b97da17f6278e668f4832a836c30e50703cc570d6e4909a4f29a599ecdc2054a0c3eb72707400dfbb397a786a7f8ebe140d9a77f1af56469aa027c8cce4a603aa266e1387acb2439b2fc9c03b6a0fe328a9750f62c77ab1b104d580ff179c881392b434a9d97539b48d3f2ec5e8dcb973f1abf0ce9a0de5b60b8e2fc84ce9fa4af7f94fa02865fd9059ccc4e105567149b801b5feaccc0d65b6e09b55452ef8225420731ad380125d791577b586d96ccf4ecbc13dc4e2094f9f79d1d90cf51ccc22d4125495014224b01b0cc004f5980ae0511da2813a2e0c5169d1835fba96ab00e761023d2d61c01bb7cf34adafc843759edf2392eb468a31ce8000d5b02f87e0de8fd8ad338363afcc977158efe03f9f88df85610a1c37804f1f006ec520c078f6d502599ac116ccdcc2eaf26d43d4e2dc9053c575805f52fa10d41fd4190373a2c46fa0f654421f7e043cbee510bd8a3f856c33b4c9dfbe39a5e50b27d7aea3cf274ac2e693c9b4639ae88db8cdc8d316e7636ee68302b0941947f585823b00ffe4780db10a73ca6784754787f66a03485dfa159415a10bdc001f54a5022982aaa8674f7c8ffe1eb3de1d9ad3f4d87e90687d2704b56da68e5459a5153b06c2474a575c0c9ec6ccb105f521d9f3c049f6fe74a09cf2dfdfc7ba074241f3df3c262e75972d14896dcfa13a2843fe488f3d3ac5e3d6164d81fb655a0175762c7430851f417b2d937d6d7d467c849b731a9669486060f373d1f6ef827f4c33d1933f293bd37b4e191bba4615e7713d0b161e91b2fab7d245a50757ca3505b8925fb2bd065f37ac6eac07a38e372bbacf41f667c9a4a76967a768edd8e93bc8e62becc4859fc220fba2ec865a9936879cbfeab13392375ecfaa6d00c0b1e81386094db0de1b6e8b451aa5f82f4e1f8effb3712a0a7017215601c4ae71486264b53a23509236ae052c0265873601bbd29ee713968317556d8fc4ea9b2e095c0107417d23c876c49f3866b44b42ef643d308a900c2f3085721855cc24824042ee49c2e8b9b4191018c4057ee75a31321329cfc740bb1100636fe23c62e3dec6c384e7db8324e669ed5ebecbb55d402b5dc212935a163d4e7749a7bf1014244967f0fb5b3e82ee6d91b04e598eb4df603aab026e075fed377051007ca8f70513699c01539741f20d07cb5ddb8fffc1db528d5962a22dd5b373775a938bdbf69e5d40d898b61f98a86f968025aafe1dbd6e5bab9d19b8621dc0a47eaadc32b0e77b0c0ad102020efbc6a063832687c37464fb9a0d18b1ded437891e1ad9112316b82501af2bf016ec089fae25427d0fffe1371041366ba7a0a1d0d8478c8ee236633c2109cbfa128642744b4055f33f4065f6353ef135e4b0cd8a1fb82be7084e7d3df8d2f021f705a4733024a67d9d85e1c51679acb5677598395acd3cc8682011624766b40c356a42de3fd10b550186424b060f6387274fc8681c947ef02f6a55a8f72f90d043f03648cd85ec4d38063ce8234bcb331057a53294f08dd4d5f15b4ad5976214f8149d16b7ef98a47984ec03a7a7b8dce52a1f12cd12a83fa28e91a1dc09cb1b15edfcfd04cc06d397c675735b8cc133b86054fc966df7460c380982fd20b07241472235862b12c52c4a4cea520c993e818e8233e55e7d496f358b466a9dae1ae6eb2c36ef2ecdbac7f126d7ffa9f710e8f3150e1ae8e023b29b29d17e39be2e9e2736aaec7876af9fbce7a955994c69c956e5a472458acc9bbf92613cab7d25e5170126c9396a434ba8242055785201aab27e539441500161bcc073fa2440bdace0023529e0282119061706fd7da158a98149f9572405661192e4fb120994ac2f57a3df80e19210879572647737f0128a072e4531b50d5dc8884b6d9827ab05d3708ebe6127c1ad61c77d7fd15f639fc3365601587ae1576e99ec8dbcea42c764389d19fdb5a18c8cc005bfba34cb3e0124456f2b3470422148f963693e0088a76750dbad93765b8338d0b9ba47b1f86b13fb2bca63abe50347d28b26d067716837062d0f2e5d2e888a8e63b6b6387aa9ba3e32fa92cd09adcfa28a8dc1c19620c64275b0c7e0a2b95d7a424c57d3e780c7e807cdb112f7754fa49308a59d47092f673b72d4eec0ae6f1836785b52f1be1fdc930b25d1c19fda49fbf26ea6361c51ec3f5ec5c52c2b0d8898ec3c2e7e02ccaee01a644474fe50dc4d846f5d405fa0c08f42925248d552df57c3105100668cb7380087015cb56f182e99b298f48c5f5c913f809dbff1980c94a5aa0b83c42b64584607d6e7da3c9e511808b7376e3c2622e466a337e3542e0c80e72a7a86d028506ae43a557db3d90e03f0e80af12a1076e676ca2d2ddfdf81a828382334ca6edb43c5cef3887205cd83d506fe05d37eb4ddab2695b8cb394adb5d97acc3c6cf812553c0ea3588056958f093244297abec1cf5f034ead12ac28cf48f16572513a1707ea360862fbd20de47dc13327d0e387308918aafcfa96ff20faab27deab3aa6e15ce657f36f46da5afc1fa434acb60647cd6b47f5170530868351fecbe579796bf7421bbcc0c2699c50d9ea6648a1c626422fdcae213c57daba0858df41024a4dc84035d2133b60091c1535715c252979fd80f98b80d04207ed3cf1a57f2ade634d3ccd01ac10da2037fe92e425fadc08c315aa184d0588fba78773b178e0f77a49582c40131e11cfc7dfa6bfb8b115f7b4b59ea15522a7cf3ce4ca646e066fd32cb6e68dfca8878cbd30c352470825806b9101d4a7a4acdc4f5aa34a233d74c53820d45c67faafe3a67b0f6d1960b10ba5aad8288b822642b184c212f6b75c98afe51a8aec93dafa030fcaa9c727fd734ecdf655cd0e324e6f81097b821359d97ac3dbaeda5222010053d7d976a83754f23a5fcb24d0f46d4f220ecb3dd3ad90c5a4eb82f860555a07e86f320bc806f49c1f00eb020120b080a011b0f39fc1545e53724044cc402b170aa589432fe94d425bea28990626aefb5365519b49c13dd36c9f6d85953949bb693031113c14170dc626c04c993c785fcdaf951b2b19b23c7f937500ad746ca3d2210ab9771bb8bde5e367e574c7ea9122031df858fd622856ca14cf72eafcf4371c008da6181d9d651ee4bd8df8d3e0737f7d3128a50dd9751b289414192f15b947426df9f2beef4ff2f07d573b9daf199936b05a9aeb83c4f85352bffae00f7459a2a7ba4286614b0c78bdb5a54448e7110fb49386bc5034da6d8c498cbc95fcb6e766b451f0b21d149c6a2c94b02d4927a50450c10eb67230d4b98ffedf175cebfeb4696ba8e69eef14e5b86ad890e7eb7c3d3db6a809d466c19f434ad2744f0ebae8ec7b8bcb58d1e52ec1e1e71293511226453482a71cf1aca47d1edc5c0c4ed485d737b34ef3ba2f109a8df74b87d1e88a826f8c433e3e5da4499b9579221f5f3b176349bb8f466c26323e65b15a3e6dac65de39a3f7838c0718cf570334ee75d9f0f8448b40f577ad53c3506ddef4ed3b505e5028641061ba053d897437abe66f90a00b19224fb006090279cba9bcaf2de667ee97e70935caae9e1a978cd835d2dc653c19d9fda2b8a4504fe1fe44bf8d6e77249c3ca773d7cc7b57ecaa49229539ab37a1ab393bce39afe8c57b9e0872dee6f95d2a1397d9615b550bc07261bb32f5f6f261bbd5263c596a70bae221a18988b778ed4cca22de56f490ce9a38171da139e26fcff5abafa4275b1c8603cbdf094de0a0f7dde10f25e882ad01624494ac4ad22805663d1b1221e10fd4c7a34accea2082db8e504f0ad436fc1ce1839bb00b26e83dcdfc27bd711578fae4e3a743cfe71ab3de3d2b0dbeebf3ec7405c3eb53f30a12f10eacc6d80020456a6e6cecefe6a63478e61b043c25edef334e790634f8fca9e1fe1887c880758726a47c48871900d7dbaefc7950fec378c02210b68a9b07f15a55679298243d830a98a560e0d1a9a03ff92b60fcc1301282447c0251214548be0e7ebb537fecaedf8e2614ee271c525b78d6a70bace5ed263d0bbc1cbcf320bc0b0b139760f26948cb7c393e0ccef2b76502b2eb4185d441aa3cb91257adb9b4a5972ae7d1692d9bba54b9b3f76d3a76230903c0b62f2e1f075378131e6256140d7431ce9499851dbc465017932b7001e5fdb99db629de8cd2ef10299e91af284db7ee24806612c3960d04ba27a855929bd1295846f6eb2affcdb1014db915e75aac24e9bd3fe00f53cb3dc35990263fdb75e8558f964423e533a713093b8ae9da46074815a3926829b1e423f60a012ba932cff6f3ed67c1ddcf0fcf5971ec49030f1dc24651a5af919a28a6dc41982e337f90f80f4893f4f678aae529745244b8207937a49ac41d00a608cef91d7b57c05f21c1f0b2590d6f904f145882bf0a67f4fe634b404494ff49bd16bf9d72cdff482b66dd4d86b1f7f0b292e1377e1bba1c2cef7fc268be3eea3b6b83cbfc098038828e9991ee2fdfafd947470203e7e3da90ab9a0a8b3c4a0ef36a2dec75ec5d20a54de37f664d6653cdfb1070cc92313d0e1517d9668762f68964f5d252f91e8109623817a84eb37f2e9743a7f5efe0421560b6617032e07cee828c823d430147da5fa2538ca04b15f14f706cbce56a4533804a2d34a9f091d63742d86d2876ea94248a98373992cfc0e5cdbe11f3a8fe79a8e1482d41795da8743369ecb78ae5233994cd258c106ee5d8e0ff1fb867319230be9c2e10b0aa224d6ee71d043711580879e9289abd525e4a0920edae5185bc3afbad3cb2606d9013b8772d00e0563c2bae0add1ce1a7bf07191d2a3b8f6a5bddc481739cd95756a961035f75de5010284b7627835346aee32a6e63ca5f0bac075773a0e84a260c6d831745fb089fe07b9d7b9e01e78f50377b3156b337f9b3ab4c97648f040ac3d80e173eb65914f789660ec3d311d0a2ff83c3ea79f7faf353b182c6d38250a0ede02a93151c1774028e6b3ef0c96bcc2fe7eab1c2b15d8a27b509a9308b070f99e6c155fac6ea4e4ef724f8237b968d1fe753c117b7211247efca00a8ad12e4f24043046e8a5ca5ebb7e1989037d5964af311925e0a076f6abd143540fc25059551d8ae2c8b851962632f1147e0e98d04bc352c68c2a1ff952152630615084f01fec04163536c53439aa683a33707acb746c9157d7f58538b40b808d4d3214516c0803d90172e50c94d2a533ed5674881480884af1d0bf62562300319e43026e297a19999e67bb4d17eed82011891bce1f155f06b06bd54ca6f8849faf8819ad0ca353a7ccc1996b1234ed3b7a5fb5f331450a5d45664933430fa41a30f81a42773f6999cf7588310c962f31e843a02bb6a8615d940458400df13373d5a13245c628d8731212bcde882c8b3519a07347168d19be29c4aebab840cee6bd97308e5b7609e0b9da755c7c350635b1ce8c903c18e1553b79922d828e868b6e9ed4bf88f5c25cdb20a6bc26d1d59ecaee7aff6c7a81c6e7b013ac45dac4ed66cd499662733b4231257d1926a1148ef592ae6f77db9f5499988735aa659a5d8ce13ac237b40ddb21e92d9ddc76662103900950be151a61be4bf3c2042596e5b137d0fb7b4e1f9f50386890a7745b343fd3136aa5d95dd8c7d185f90459a6e1bbea7dbd81122f171b223eae993bbf5445e47670a1ba3edea97c52e424c13b1643d0acea72a0fb13e24208b12fd07e6d2aee72b73666819d92c81cd37e73e0e506a2504679b35818497a32b9bc58b2266efd03809e11a33a8971c354b04e7380104de0fea1e008ee9fa33ae64cba166fe7670bed1ed1c68d6858eb0ef3894d6822b8c7ff174ee3e1d232797ac7294285bea962b3c3b44544076b0932d299f4756a2b43f41b1e9a0043f4a5d3867783e8544499c2a536fe36f9a7b2c87716f10b8c9ce77c38669204bb296875e851d7fb0c53d254ed2eaccc0cad1bc91ad30ef261c98abb9387b55b64f4dd215a09120d6a24405000889d6369038ded1745f0c88d19c60f55e94227ea44804acfe9de8f5a2b4431a2dfa270b192f1b20551d55c277b0b961d488f5a778aa6ad066027efe050f624adff3d0fc1ef6f8a2a0f81623daca510348bb616c4c5a3e5ef6137ace1db93b0cd5085fd89941c6f3e0e65520224163002d99ff7a4714dd10adfc152ac9c1ae8b9a2c2c8b4cc71cc89fd9026e86a3c86d32537fa8b0aa3a5920e9229019fde28bed028122b4e750b99f45223fd5ac04272733303c5f62c9646683a63df97170681da772f0810e7bdc56c7280f3156cd59d97237381dda8706891fe5118a2c985caa41a45ca9adc0a1687e4d1152ff3602d42185aa168ba8fab38e26c509b69376e19605155890fa499b173b49f381ddc8f08078c6cd5b49566e0b8197222b62df6d4084a3a7def5ada793ac93b20d447dada4f0833277af65d6088fa0b8b9740d77b43fa4c05941a326d1f5d3432d0f72b8ca4db72b32299c7339904b738af6d5af21062215d9c8f992507b02096073dad41c1cf29e62550d373f3419f988ed1caf62f55937c6bb47002ab5452febebd2672181ed30c84fc4430e57af806b57a50cebdabdba80609697c4807be198bb00703ccfecac32165a7857d2463089bf6d71dd339e1cc55ede10ddf0f5b20a16b772a1e995e256d48ea38bdaf4ad90568cf2387fa3f88839e9da74073e317c70275135434634ff1d657a2724e6721d465de04d5b6c0579390c09c7865dfa88249ca3856f05eb17938737979c870d2ead8f70d73d0cf830a387ab5bc3096e3441b9d3eba07e7cf9a8b591ba5ad2b7da7e5d8c36b5ecd3fe812c0389a7668f9fdaadffb3fed4479c8ff29743bcb3d8d699d1eab9b1e47fd2dad33a471b091fabac0670bb03dd602958c4bfa88638eb04aada6e3be5989cff05017767ff49a3ff7d2da879e9a30f4b4b2d1ace2379f1976e381e28ddfe23866685b9469501ce08b9cd622102294deb64fb4823c955aaf4df0bb30a4eff853dea52e66e1e43217db05d7a3f649947462ea45915e0b3dbe9c26cc473be380ee6b23eb0ba5846db361807a0db0b4eafcc39f11b56263b3a6728e6f9398e4e9edbeefeae5504783fae9e5c6d39b295ca0cdbb6d92404e65999cd28828f6f180fd8891cff0b73a38894a10f0970a66dc6b31aa1b45676a4de928af73018edf6a4818f4ff2fc796d65c0ef76c3901cc827e7659ba8dac8801d486c6a31762cf5bb2824b0ee9b84654135753b11c484f94dd1f4af26b9ccff4a09092a89a6b15efd186a1a132b461aeb0e0327a8478fd1bffe9d07dbf0a87b514c2409d91b32cf506fcbe72999439dd24e3ae67a8dbc811b299659073e001f3b95b83566e27629d4c79b5a677e68293b210e9693921712ed0d94d2215f1fcd1c660d4e10a6bd03e7014065a961bd5e23506503a66710a9669f334bb9e5a34105435008aa1be67574b9b7423ecdad1c341269a3b32cbdc0bef87cb21c7af4b0b472f1c4facee8de91a10f3c113a6ef0ee98da8a2655cdb21707dc6480c9ac7418d7fd7bc15bd229d839002849517578c0a608c11178a79b02cb0c85d986c7a1203ef5aea58467c94b85757896906b1e6ddb0a4258724f2e316390e18cbd7ee58209b1cce42db905dd8bb5de57f07330db1e2bf0f7a801610d164cd11c3c42b2249e58a2727356cc331f89518867d934898ecb44335e88912df9c2907e87dd1212680cb3be79baa98e8e8cef3312d2b6ffb72f93bd6d3c46b76f66310c22472fed70c8ccd32adc0c62c672d82660337039640a5f91d9ae30f1a7dd2261bc09e1387cb5214f63d119d9a6ac84333412348fc13fd3dd3810dbeba1578cd149a3653d69a43f2fbd39940fbdf92d3848b254f97b3ca5e2210ff67d8ad0ce23f138fb2e111a294523c54d5b1144ce3777666e49a33f2aca05b3f25d997aa0491a6f90e96c390a8edf5eb74102846556f225bf79b3e710a5afdd365c26aa86f4aa960f23b9feb1c23f76887ee2e1259089053fb1b79e587cfa34f64a3e28763a3009de5302b782d7b024e38b88c1212968bcd2a9eeb50001d8d8c74f9d5384b81bb0c7d7741ce76e6d73311ac703595fbbeda027cd318daf12c15a7e289784efad75f531c40053b001fa787dccaefb1a0c1127ecde4f346318f97298fceaeb9a463758803211e0befe1257430237394c6bc70752483a73587ae24237d937c53e864bb228dd0f88ac3c61b943fbef098281e6b52c095536580587630b828881c160fbc15db6463b7c3ff74dd2a7c573c6b29fbc2613365265abaa9873da0f4a4aa416ff967930e82d140462cd4726b241ddeaebba4e611593024aa28e58fe3c99335a9d0760fba6a5cd8c9b9aca027db235d761b76f76185dec2bec5e82782d7ee1db86e2a1b84c18bc9e13688c559bd8a79a4083074b1cf73acd3e46f5081cb589253da27485d1d432e88104730cea6ee8b59af3f71ba71618becc1f78271e00cdda5caea311f5cc0237afc3b4508124574e9d9b8299f77ebef7696bcb9fd60be9214b991700293737f236c6b30c6794af4bb374dd7321f296226ff36c3f7b297741ff394d8161fa6673486ad7c8f6d6d2fb3fecf23edc7719f6bbd2b47f0d8699abb958653041dd79e5996ec877be7420eebd818b867bfe187f422fa3f6d4481fc9d93c4a1e115eebd4f9c7c24f621ca7d66c8587e7c9233a0182d9d1743824a275e6291cca4f83312c42d9c70965c3b635eb68c0999ec6f337d9ee24e895eab53a93de5a445357a0b5736f76c4eea7f09f841585565dc3c80b49a9dd719f671111c62828e1e9d2cfbe98412d3d3babab033360d33f0630b9c39de84404aae0444a5f4cf5a591fd6d617c35f45f9403c914767743be3f1dfad26ee0df59f123e5c0ee14f08ee01c62c628a3054f88a1204170f29f25e72ef9f6eb4d8d8624b68ab71519086cfb1b3908045d1a54a9fd7b5202c4ceff07187f60fe0f482f557e8cb47d166b97cabac50143c465e9f3574ece39cf7b1bd886c4d8cb59f2888f906960109f1ca4463c13aef793e5cd3f0f498c21cf8acef800cadf56af491cb2474532c701afd7c9e4c3fa809dc4820cecf16072620ba6548c52f2217d1292451ab02fab0c97cbda4a432c9352db26581537b22a6a531b2a95fa90c78a37d94f37e1e105d3d182197989d162f9f7e88361c55693357760921b5e7ceae5968538dd8c5e75b1ebb54f0267e38418ba7cdd94d006fb6e850c0dc4c7c0dcce8433f5193a0798821656a23a315f694abfdbb8d29dccda6f79040b033c584842b4f8f86e3dc1d346f91e43d551a68197c31401ffb7c4c042004d2c6980ecb04f083e88a7893ebc41a32b892c9683266787dca474540ec9c1ad101d0d7a188ae98050f1836a68960ea490204ace17deaba30b0f1089ee5bbdc993791530da2c9457f17a500603b9a0a39b98298789793b4cf02a627432322b205e6931f05788bc3ac410fe141d5f04fcea8ce29514e5df0bdddbe403284117693fbb9bcce44d3f395acd49363adac72bee0a2994045ebd97e6665c3a9ae79f4140cb69bc1d556f2653869af47c7d7ad4644659d39cbb6a9aab73de7fde7d85870e46c352b7a6d0faaf161f8ed9a5afb26774efafe2f80931d62c47db6546ab56db46f6c3faeb91c70873660b0d620f214c454c5c60066c72d04b78fcdf975657eabef3d69376c0c596f8af45ea823d2f988839843d66f7df0b9e6b803489f7d26bd440560a99f7efc31e34c97b4867245a65dac4b94acb4a42d5b5e7bcc728637da8509b290432314fc56ec103ce66055ffbeeafb0357c2ac72a18bb482086dcbfe8f0e2a4474a470b16af2f5a39503c84503b4ced6022f79a934342bd5ec09bf98bd95126c2965d71f9e572fec7e065359c151b719d8551df1aee683cc1412168fdacdc49d0eb35a008dc2457cc05730d5182f0b50fe4e6e91166b411fa350f722c0539eb22b6cec211a94eabb4585e1896a89950321e362732209e99d12ac1c01a745be7881184abfd0dfc71c46d2bbea2b25e97f88c25969059a4cdbe769ca207868dc8b4c24262c7ca23f7f388748e8f6e94ded705bb6d95c05a315d6356fa707b5dd06aa60b51d867c81e55e189d999067385eeaa17adb8ed78cca63817f82f358f682dd36280fff4fdcc581a8f6a92b5445fb898fdf2e872a1c8b950fe3f4733b1deee6153f4177578003df2c2f03d5c5e2b69bab0c3c9c22c997521ad2be6b370391253001a485dd1ac4bed59e416a4c506d05c4a6560ab9af5edcd278bf383067ca243b8db57c9894e233b217dc6fa10a54577abe4ce4d2d2ec3272487d62ab0cacd375221df08a2328424f3c8ac1af4f633f45f50308a8ec8abe315ba51c4227151217ff3ffb1a9256d60a604663cbe2c0cff3d6eebfcfd9fe29296818ec66bac9162729256e8e52d751ba972aa1235102adb9a7ba4a07b31013afeda09e587d4757bdbde77a73f7a56cd1bc7ae8e3281191bd752aa8e3fa5f390b0611384345a6224e03ac1f5db30a87941ff8d96215cb8b1dde7e10a082459993dc6e311b0fcc271121c25cb3c4042779cfc3c5cac0707eaf17a79c96cdbf8f561968e68bb11cb22839a02c7368ed1f8f75c3cd6944be6b91e5e7a69fb492569a3296fffb2a3ae9c4156523ef9904241b803daaae0120ca8e69c63ba3d81b7535f621fe8d2a4ee6646de537024caf3ca5de1b4adbcf789c2a37f38adc92e18a1cf91dda85284d653faff567727808134282c43a3f04822ec6c95ce70246487a3e2a48e17afced2e139ea673ed1ab0df22a576aef90199b4e084b8e58d3547856bc31ed1ad1d2157003af8044d1e28d224ee43c534b347db44f8e48f6e3b7405b4e2c05cd1ab8d578598f10897a539c528fca2642976aaa4775f7be655fc4cc622de308fb2c64f879243f2f6fb006f5172475ee2fd69a5e52d8b41ee13905c11e628bbccdd467c47dd0c8505fb14732925d4022e9ddd2ca1b618d0553e9d92dae9e0446cacdf64f385e6d104d3b7e89b22b1216c6ced8f862ebe2a0651d8cac9eec4894f8c5aae1a3ffa8ff30fe917753b0570ea7ae279cfdf1a9c88f46f98ef8b7895930830a60fc8867c13800986c0dc7b22c2a970379bcb0e200493587326f92abd886f899201d3b3cbb9574f2701c1e8cab9928bfa3fd268ae0e18cc09c11f73abcc362565016dfb6b871a7f8a75f572651a97c3e7edf98c77adb8da1d32835e6f580e73b222ed766cdd22be632cf95acdd0167a46590af0b01f8aa5663aeb7cdf4335e8ede416c0df81c8b5e771fa7ed2b12c9f816a1523820e6aa6bc3ba1f58c64652c39dc5fa470f86185fc9073b971b9205e09d7a07a058141c34c9deed39aa25f5a556e399dfad0bc725069c7d6b68d0132355c20cd4829e9e9f463e2ce45989657ce2db7b37baddb9cc4b87a1b028d08564635a34d0cbb1b42e3c67ddcd5e749e289d6099b5b0ccfe48850b17139cefbf0643badb7606b7b49fd48b3eabe4467270462d074594555c006b39a0cca1c32437f3500b6579dad5090592a7645a9b6b0174b723fa2fa82cffd5dd705543190810e742ff2b5b776f32d0a675afada6436e8c85e915d114aa1c1065ad820e2bf155df6436222a069c6218d22db7f509313692578d390f3438b9e25dccdd08ade0dfaf918b02192c4716f35288950dea5d72d168cacec54177308f16b9de94197cb19a5d35d9459dc28db9bb09b63d88f495aa5ea75bd566208b769fbf8b6d467d1d83c985ad79608c6f58937b98d8c08bcb654da05237d8cb1003d5102aacc9d184deacd59958f2663f16685bd2743a14681c59dd9af702dda9ec16100a52f9b30fc1694c850fe8898ba81a054b393e5c960c723a430e33e54bb024583607460794aa02e75041fb1242965d580d94255fa2a2e1be50cad251bd1ebd9d144f9d2209d7b505e3efe04d40da6c2e5bd6b2d046c647608a96271a7471f3f1afb95fac942fc1f68b65faa4309ef3634e89f73ed4bcc428bf7d5c4ab12645b5cf3b3c1bdb229569ba6a464f38acc89b55b37d5d30467d5e197efe37ae8437d562083191e655b2a99301a07ab9cff92130f67cd1d82fdf33478e3dfd2b0e37973265f58d9025bc12f3cca3bd41924ba3a1d433e8fd4fc014ea184da868bcfbb16efaa90f5e4d6588864aa90fc6dfd324e2809520fcfbe885d8edeafa11fcedacad47d572938fc83a54b8ad53a49323827d05ffaa28a7cf7c49e8c0555136d81b356c506c1dda003b5b51c08b1a8c019810d7851b98a6bf0b5c37d4d9028899222be9d09f4b214a887a4c0eddae8318c32aae6e239a6ee853fabf75d28db6e645f7d1d021955b21681dded600794f709cf39640df29127849eaf4a0ff06b2153c4d27a6189ba2223145aeca6140cac0b46689d81a042edbc38dbbd5ea14619775623bebf31f9ee2b8fa3befeaf0f13c0bdfaeaf3aac5de58c62e908020c1de4bd31a3605ea486b7487ea801b2a061e77c7e866a8041a611ad1ded711ff0567794a56676f4b65d1584fffd627329c488c150ab9bad8e6cc9c738b0a9d130d529d97961f2c676d2571b3f86461b00b55c6fbfe2de277d1473466f539892bd539f5b3838ee8a73d114b1c43c7c7f89f997a61110fb459ab137e39c306d785d1051ea1e62f1d4b046e96d806812d83feafbb6fcc94ac37642d554364791e9e7c5ed42e52215de614b2671a4b8234948e7544b4e7696ac5658d44b8ed864c38ca74636e409aa8594ee1ea8add1e7ba25515ee5a663810e7bbb603b2e38695bd506a6138cf6ae51188c5915ca34707cb02baa725ccf4257afd65dbdb0040f57c4d5908c28cd447754770b60514681fc73eb39b245687b88b2c1d2346513eb75d0259f8a65e78eee713f90a0c4c4eaa77c181ff125301d90f96440dbf1fa6c7c926d624b97b42060cf84ad9eaf072c98d1dd58cac2efbf8fa8361c1de100f7b4cd17a204b0732d0cb4a14a72a68848b012386b145f6dc95816352dbe7112d04b80ad5d8315f9184de28a6f6227f8ddf27d43399618f08dbbab70ea31486e9400e5f1c96a44bb10e49e45a312b9be340426800b2eb45107e846669078d3846be1f2738d964a8d4734f9084ca50930be3cd8f87fd6f1662a5cd0a1e944ad56c977d4a6af93eef3ed3734ddf245c580cd3e96df1556bb7a4d4f104fd5047a43633a127c2cb37e5298cb17544799186b69510b7db4910a331d5328ec6e0e39fec7b68cfb44de200a7d2161c58740ed7e569b36d73f72d84d8216dae259193417ac1d253538882217f75665a506d2203ea339c67e422717bb0944205d11735cd421b3431785fa69c0788af6356440a3298d0b1430563625b667a95effa6cc90591492d90ad353feb1f46a58710d88f7925607b6da3cbad12a93b2c3d8e928f287cbd47e0a72cf7d13b64d14197cc49402751a36b529a06ba01e8ef850cd2221251025c8624793063d3f7c7dbeb9c7638a823f84ea9cefa2185e8b45dad288c11981b3717b7753110c4b7be6ef5124a5e15732ca26cab73676dbc2ca7bf29ad7370d86979531dad75f2412ebb58a6d105793500b0c9b21540378b74c9edacacffa9d3b8f0229a2f795e72bebacaf9b1dc05a4fbc620f4105cc62dfbc13a025d52158d0916063d9e204418801cd6db9761ac16b36f315ed3b4933e547f63a4fcdf5dacb907213a5e3c08d5acbe29e360ceb6225ce6a985ca20c84d8615ffbe21f43c118c88c96dc4dfa1e85398a730a52632c1a8e101618811274cd6bfdc41cf02105a29992e1a1c54514059c3a5b031c5fcb43fa735129f8ac51bb016793bd45e24da7036367a0f609409242a575e458262fed4e7b316ce42277812735cea8dea54725c14953547842d3d024e5d2422918ba051248504a75116329510978de9fabc899ba354e60cd5f5691f0f322e5f3e8f47d561091b978d0bd908d715995e0cec7855f1210027a31543aa2a4561a8d1b0b66a991154a1cb638af1b9fd6ef5cd569957cf8d40eb43acedc885a1b9bd4aa7c79c5a3e4d3151b26657e5510d984bc88c6a292787ff2d730b851ccd4347eaed4f08ffc2c98836fdf459a80dcf7cf1b2d29cf5e3b06761ce3b80081d8c5a034274d0ac94ed959384a7e0498fa2b30c1dddae9a59b2f7bb9d3992181a299f73e85745ad355f6f6521bf0f6d7202297716c2641981d2499d3b8b20620bbbcb447014cc5521da00650eb6484b86a06ecd7b226417d5b025695e0182cf877097dbfccd7cc61d84eb459251fe05c04ca0141cf911a95477406395f1af81a5618dadb21513490d8c8989b215bbd8fda752630a7dd8472ef1c6e57b45f80a1c26838bd8018f4779b183b0732f6e1575ff0b2ccb82b91dac642c396c214dd2f8470c4fa71e4b70d05356cbc039172d2c6621e0f4155f20823898105930189b82d44e5062601ebe498570f983dce12690ef54d89d48566c535a8bef7429446a68dc6c3f14a7f38e15a8bdcd5cfbd2a7965f660ff58cb2fcf4b36ccb4583708ece76667b81d9efcadbf753c0e0a6c38b1587a978d15c0a8dc4c322d4d9ce28c56ecaeb2d8ace48109129962badd94f0eb01652f5c6560349185ee93088d48fdb2ccf9205779f45b7f27009196aac563a87482e9d00386c302c9958b2947263c96201cd9d17a168de3a29731802d3f93299fdcdebaeb311dc94aedc5a53504ce4d6d5125cc2ee2c80b73c88a443f51d32e6fc4e78e1954041c96a04e37ce65517ec4307d62ce4bc98368960e1d58d8ee80e9a12699991ae54b681dedb610b11bad766a10c567aafc9b503276eafca564f984b38f5d93d9b18e242bacf7f1e84a4bebea1052cf469d7fe092f4b89fa4cbfefa66734754996135567aee88b41113b7cc7e020c0623181d524eb20a736d6a03d97e7cf9d022545614fef3a4355bc151ddc755252b325be0b86a8709b9c5caf31a2b18dcd4879fe56ac1a9201d80692d6473cdea87bed19af2d652cf60c06ba93f2e3cb0db9cc4583229311bb1deb98385fdf6aeb88eeb3f1fd5bda586f14a4da443ff90490e4047d6e61e9996e3b358eeedadcf4ab9be6c1b77a9a762d09e11b77fef79cdc5381d2df0de63970ccb5eff0c178af02a09fa9d07798f02f8ec8a4a9dc1e8c6b17355ccb7e6a7f8131aa1da40192eba8f4f27f1d12d2502745a91fe60b198fc56100ebfa6553c57f4dbd580e0c5608877104041eb125ba6e20a7174f00e5658e044208a1cb9bc3304815891e9e01013dcd3a6fa51e01f5ba2b3602deefcc40506fba6e64979c0aa1f0b11876a3f2f6506e801052568bf3a884f48a88dfb6db60616fa23105424b63410f6681f8e4480ad13ab0eb0485daf8d88cddd8599c6fa07dfcf17efebfd4f9c515bc935da284a5b518d5fe2777738ec4e0135345e369466fcbbdd1274808b593e5a50d29b78c8f747df81c2872b6806303aae44c92d97729501e3685ddeb7293b7339548c472a7701e26d6a06651e69f239711e26e46e2e0f3dba31eddd0becdff0e252e1e7ffd3cd957e936ef05b8ba3006d299915ea44c8399c56dfb6b62b8b12c82eef02bc61f8fecad8ef6787ba833a18c741170ac317d779c6daa0d4d911a6c4bfb729490dfd7bc1dd380ff367db2cfaae5a5ef176cfc1becec65238a674db299f6dc4c6c1d066aab0c23681654dc610a1587410d210f497f0233bab3c8df28bb0de6c7c13316b215e1101255c75f76ca791d3aa754c60110b0f18c8a8a202239a627f4642cd141107d434f4efa3efaeec8c7f818055cebd6a9043ee3e2fa290e60204c50243a11945778c42024bc1e0e3671f54ada794c59d1ecf2ff9926a3c9eef1ad0dd3c4a6dade0e664553a178ef1b9a1ed70ab1d4ac4d6f6c9c510304464b4679e0b62aee4e8041df6a1b55daaed2c44880f20f857a749a4a2d12b0471389938a83e7b996564ff58539c57d4238df84125f637dd6fdf68a819faa686caf8f3254b36d105543285fbd0d74e6319bd927d111b497870e59f5fef03dbbe2ebc0c72c079b5e6af6ad74921d782f036a2b525a1fc33864d9e38db910a0d8d930a92388cbcce91d7d30861acea08d5571fa3b7a52c1c308faf11725d269cbd73b5d5cdcae30dbf43c981a16d2e6674d8f06eaa09f989e37b8ce3c5401d27f2b9460b86d265be660afdcb191ca0d5927ddcfb5796acff59915f3ee63e27922591ae105e415d03f0767efa66812bfef5db2418bc58b6a979d06ed24394c4ed9ab6d2ba26ee563c0deaaa861e9dc6b9afe807185832d594cdda38bc51a8ca9e0e3c2b312cc4a0a998bd9201ec8b769bdb696034e0f08901ed786b9f9c2076308f676a78b968f3e122f5581b55fbf8bb79e08137dfe87ffa46ab5a1d7b9db18bc305a202813b68687078feb52be7f490bdf9b6bccc68a4c00ca136f7fd96b6cfb69ed52db86151bf582b488004858ade456d3649814312548187f1d46691d4ef51b602b0e6623476438b2d08a8b61aeef92a47474ed634bb9a99464d954bc5170d4562a080ba81eef81c1e290010c60e2792e903a98ab9810425a1dd9219ee9b49bb4060ba6b222a382b89bb833d0f91ba041bb41bf5043c234edf47cbfc90d267840d36f4a5a5903d73bfb4f551fb3621faa3dfcea05c7d5141e9a18698468ebde4148d2306a62190df4849472e5c1b3340e140b24c91015700f9b5a27331f0733d1260c0de7027be1dad60daa8a27651f0579179713f053b053a0383b7e63b8bb7c2b84098f211bc4cf7292a640a55742bd5932ed5916a18905bfd9f933cfb4163aefb3e5f6c66d1f4639a28a70f130e59ce01a03de4ec6ebc3ddb9601609c671528a0351cf07936170d1c4fc877aee45911a6a2eca1f344865978030675ac7138e8934ddcac7d0c04755e1074aeca68a4ff70f98b90dc05231523efca31ef737d74b2aa18b79aa6c74bfef36bd1adc0ad2bc4c97c323626866257a9118616c396cc9bf4f4e108dfed7d68c1b31e9593711e79aa854c41e19ee940f237c1e59734c91c0650be098caa036f47960e531d2185df4e2c05aafac87f3a020bd6f79855f22e2ca66c7792a67ff64fe839e560bfad685bc79b3d65dc9188298836a4d57bccb1afe2bb0f1a94c21068ceff84f88b9354e6863023e62956b8dac9dc6110ebf58d42ff19157070bd9247f075374d10fb14972c038a631d5ef2ada8cacd3ba5ea9bef818242273e332cccf89e47d54e115d41fa02eb3182e31753a45f87bdc012a2e434abbd8e0da9da5c6d2eb9edd8a13b5076c65ed8e946201076cbd9e6efef7c77dae11a4bbb1b07b078e10977c64865e5cd124d85040d3e39c81160716d80474186fb70958c08a61c1ab69e935948aa4c305b52e04844e2514711e9be7c4afcc0d4a362fd113d8dd21b95f66e56c03c18aea439860fec321c606d6b896a28c167fea27eb2665c04086602717e135a40e34fd9198b64863319cdd7b5274ea2455b65eaae687d00132a61c8a3d36da203e9254ba6370d3a151eab977cad05e2a0264e8ab2cfc4a48555d4a456596dc53f8c23877a9b8703455ad214e69ba0d37b8674438a720bf768f7b664cdd76de924cd1340b42c31da85526836618f72459055016ad489633bd3a93adbc4c9b62ecddb9b55326a10967c0c20e5aec12e9602ad12d5b29d3b02106a2bf0555dd9a3fc876d243fd5aad440261e4f546fa4f912f0ffedd54ff0154aa11ba1aa0f2318a2d3bf978b0f64c830ae2ba2af532314337833739e798168f9ff1d598ff8bf54b33c0696d7922373789523cb313c8aa41570785212d4b26e9b4ff71678202f69518e2f37f8f0dff4ab96f49f3008a727988e64bf886cad23c9aaa9e6082e67f5ff4e46a7527497b87d0338e38b55d8f76b68cce60e0a3dd6e4d9767123b879980e45e210b694ba2441910db3b069f357a0e491d0f79cfb2e872357b6eabaa67b17e31d8bfe608f44f640953c8009e0655d065f7e2c1661078dc96dd554a2dd8c427ad178d64f74b0f5b8f8a0ae7de7853e04c242ffb310f1b1c002eba40abe814d8d2d4c416e963fa9f3297de128f7beb347268fb7edab3f4e923ec7fa1b7e77cadf3e0d8f256068d5b3fbeb5d26a7c56907ba232cffbb410af60642ce216f66573b0ae9af5698230b484118bfa39d74918f85fb1aa371989ce9e8ce163903ab8cc1e538f2c090e69d6137422fbf3ec08b0aea89c6335477955a3e1d0e33d445e86ebdc99ae6b91a591466eff9e36214b321b0d3fd968f11b197b46fe74d0bf95f2e84675e5e731de92ca0df4b1ccbc4a1e08224dafe62c11d31afc7b8bc603061458ce3c1cd2bffbbbe1e75654b1abcd1233452851cf4570187e595960215ca3d2eeaddb992c5c9a17756699fabb06787c3ec5be409005f5b910d92d317cb6f88d5312259623cbf02f4aada78a8fbb81b4ada9b7134ab454d427d92a0a0e0ae33b860a0963a844b93f3a22398844e8f49c2f4e0e5221bec59b711e8bad25d567a7ffb0d853c3c130a9e0ea3a5438f1bf90465de47f92a5023f5e66ee08c01e91a6abca5c8b091197cf703175d14d7b8af4f9af62f53a55854a11b72ba0681985d617f8fa3372f788efdfd713d094102c2536537d35350af7fc5c0e0ff4fd98cf00dc41c5b87111d5e42325c994ee1a65b02b41531cad782aafbe2671292c14e6323926f77902b14fcb82433d7fe369ba3bbe322c82df0af27bb62807d8f2a59ed30a417364a18bdf522700dd51c6c2abfd97ecf47c1f65e426513defd99b0615262e58a4960d7d3a689610c443626dfe1f1d05f620d19c83be91c5cccb27d41c8b9a61360621d742e8fa1762c7b0c715de92c87b71a0ef6ff5ede0d8479e9eef11e7239f32d4e067b70cbc805d325668a5d74cf8f7fdb1b0d416b4c75877c05e1942561369ccde1cec2de180787d4b5c939f2cf969ca8bd442fc83e146eebe898d61ae3283a12f497f2dac3d742745c54ff8e3fb2e5c0223fd6a1a2cecbba3320074798f62f557c4555f0aea418d896f6ef24e609ba0ca0e20a1fee3261df366b057fc076579b51d6065effd64b269b12654ad503399c7419059d5c6879adbffb4fd644fbf7eacedd7adf6ff261e96317434ecd6efb694f9b3cefc0a2e818e14cb207d069b4c78615388dd869fdfe63c30b53ce4e28a02199571d795a4f3babe748480cd032eb90bb8723c787961b5a3185c4c839d959dfefd1236e1a04493bb8160a42ffc2e6ca1ef5d6ed80cfaf0f0ef764733f3ad39ea3def07ee4489c827ab019f7b50e46e668da8ffbdb13e223d6c0b8a46d8ef40eb17ad00c8a41837492d8ca920c4b7418038aa6d78171a4f642236c9edfa4a393c530ff883f969b9e4ce4526b3bc6c758f5640248f74501e9294d596cad1be34da8e6bb387f83d822f9ac63bc6cf04e14004a05c35d06fa2bed6422c22a44d046407dbdb960d71ce5beb7f15f31a7f420bddfa7d56c16065d098d24ba2f82e9bfdeaf46819411273e119d62a620269e2bfdb24cfcbda89fc585f7710f97f727b2dde73c15e29316f77db03ca749915dda2cad26242c6bea86b13ee8dd273a3020459c2ccad6a23cec8b45e2ae6de0a0629f6e8f417e54df7dc4e7eae1ff43b831c3ab449c0c1ff3ce0db527001ef98ec43d9948779ec0cf4d3fa56d0e733a2d2be7a3281cb38e02488fd81b1412c545c690f5a85ef221d38e48b323f9964632d1b6b928d8d49ef3137c28f00c18a69759ff20f98da06279aeabff93f579a0f6d9d5691fcb314ace49626bd790d74881499fffefc503203f03686dadc2898b9bda665f0ce6daf6b2c4dc3c0f72790a1280546da4d63ca9b521580679f445ff51b7217f219adcbe1fa27825880a48843610ac9b181027f7a708f55eeaefa13fac34f76b95ed27d0fe6ff8eac55b0fc6b50f635dfb1d7c7f814dc99f264df538b967bb1c7669c6d4b09ad2eb2a122761860f9b10bd1c13f52d63b005f6ad72b829823b5d7e9ceb4f5c5efce8b4d16b0368536b75d4fe5d10dc6cf75c0304c27f1c7dfdbbf284b85cbc51fe38e4f8acdda4c1badff3c1562bcecdde2fc1afaacef95efd79a026543fea2a84a74399591596a8a5bb23454304099534eec75f70d0abedb0cec50ae801a1ddbd2773c3a0c380a32262a8fe8b80ee6983e4d3807805147e41e063e7be3d0d639d05e287eb62c5f9fa0a02fbde2c107038f0ed550774f0bd5da7fb3717ab9af14938545fdfac561a3e1de8d1d673b087d4bb1c91161b27363f4c889369e2bd23d6f3d7292c0efaf42341f08ca1f9bd4a9b081e429ed7290e97822f82f646b73508dabbd1afcd4523a91ffbcd7bfb6890ecc6ad74d19958b780fdd68318a9faf3b8bdea2cf8c6333f20efe4185ca310bc75e3232eb6919ff26eaac43f0285ff830c0d8619732d863151982e93f588fc3e5d17424766c5cd0ebbf9ccd2bdb756b0d11a27dc8718a489ee8b1eb3d134f638072b3c72474ed594a6628654182477bd6073ccc95729cfb5f6fe37f1df1e0361ed806e8efa7c19beeb7f46beadc2d868f86171817282984509304c8c54b0688fe45c594bebe1daa7df587bcbd98628c64b3f03e9cb4251e13d7c95cf14d77f358d9513bd0da7fdaf634f30624e55fe89aea3f4ed9b8819cdfca4f270a3e6accd4c4d57364b28d63e7a598bcd0f949a98021ff5cafcb05211d35f515a62f0e925455c7d7689c4ea479695d8fcc15211133f66e90e1b7d30b9bb4de8014a513cfe98951bd571d19b64e243624a6e6306321e9cede3cb4b0c3fb5a4c4e5cf2c8158fdc8b216db1f5a2a62f2ab4b4b8c3ea524898bcf2cb158fba8b2109b3e50aa629a7c942bf3c3a52e267d55a90d44781544f2ceca3da6184a67003d57f54c5e943c602fd7dc7b18dfbce2f645b6c3f6163f8c1c8d127ea3d62459071551b7cb1ba7ae9e8893632f03f4b0d426d7be9ec00a2f4577780372ce5c67acc997091fcafd23af9ffaf6fcc57ea2aed9bd1b5698fa67c104c2b5eb9d266ceff314272c210b1050506348be375ddd3dbfc32c15a3eadb862d3cebb2d4946b6e4891d9ff27fd9746e7afb3c0e45a6add0daae74cfe42fcef1d1961fe5106eb4861afda3d93cbe453daee85c6d9a32e1e17c7d99322cdfe9f606390cedce75e9e378a4bf28e1d9433ff3055ef602b17fe894e0ecce4b35e3f4e1b9a97fd36fa17fe16db5f552f2fc33fdce92281f296141e2a3039de8d48a1356900e56f70beee3dfbbd057ebd28138673d2d413a53417b1be14563bbf44b0c0328a138416f4a0daddaf6876cd267ec14a94480508755bde469eae2bc5bf5c9b32000b052008e1ccea06440493a8da6cfa1340cc72c031b431e4a81b99630109b178bff0a674a2634d918cedb2de358132791fcfbd516ab12dfe582cec3d8c0f56402f9a7655f276f9c4fb1ec1fcdade20d5f6741ab82f37f3070dd6db93e37e4f83f057e49f2d0418c0406b95f1042a0a1e94633946adc6255fed64319529882319a50a16f40c467363ab6fb54e6f6091231d9c8c30d44588cc27084eba0d9755dbaf2072287e435086a3eada0cf2dc4b620c18791937440a707e6215ead0004fa0e2ad9280aef310e64154fc2bcaf53928d1d677e626f9a43e39bbb019186dc44b334051e9d1cb3c9aa64b1f454759e13df0bc2d29ad72bb11b50b9a7057de6ee5685f181aade9506fd19096e7099cbcac9fc15096b71e83968a154df885e8c7fdac9adf767a7c8a9170972955206183a56b922e52222dd4477222a45451e59cce099bab0fc810f1ddf9504a91f289918324a865ab3d982b24bc72e7b6f4c1db4ed397bc59fbc70407e775f2e65871a833c7726955eeb0e2696719764f0a32d9604a731b7f930e5683b0bf006a55af18a63c0ee098b24c06d8b10add4b9701d809743b7b6a8e19f181104831646ca31640eeb0422cb2146cf8cc130b0803463e0a18ccc8a2bcd3949894859610bfea537d960760e5baf00fd8273b04878a0a539b29d7ba1f175f8a2097f6794d5d7f830bf7612c05a0a10088556194e8befa690f4e1ab499041a9bb0375020cb085d724f806fca6aed62f8f03de3603a5930b00e1caa8bd7a7de9f13818494586b2aaf4e7ef0d2d64b58db0b21020b8f6e827508a45c3106acd4c4abbb71231ff927a4d8a2db83a79aa9c348299f468a2b97540e16f8752ee97a81953323cc00e1acf9333f60c946b511ccbdc6d18cccf13c0b5bd4a6ebe7fe527cd819e0c1d4690004eff77f2d1ee9c8ed8e1496c7769c119edb73b3c3d7bd5af7f94fd36f6b6da4b3469fdf02e654d00506e0ddf3f7bbd3e1161a3996b37ac290d0e9dd832a416ead74a045db2004501ab550e88e51035ba3f156b8c9c187c377f6990597955d31507657d3ccb2e98e47397636458eda8be6d835d7ebbcd2a16cef33a225df0d041e8267d285bde3233362927ce26acb15b4eaaf70df7f773fdc79c157f416bd948590f69cc2940395e41cd8f269a323893e1c927af7a75f16c9b34f31236c378cc3b1ef117e80a6c58b4d911d713f7c490a3f15392a2efae7e944f8aa4997099c71a137884aa989bfdf4cbedb811dff85c234433432528a33a7209a28b14cbb93a5766efa7ed510ad887defb7ea9cf0a923f61157d8574d57c651ebc4bc391c0a20930072b124562b56b8d3519e6cee47ad3b565db6efaf91117abdcf8bdf440855ce9a1fe7d24e87bb36b5f987330302cbd45055beee21ca59d916c024be97e0fdd1d0e83c3f1a371a999f373973475a8af8aff03833274d7662754ab5877f592657edde0b9dd37ce3a333d051ccc754aee201caffb0c9dcb8fa1a2a02995a26446ec3424f75bfa4867e094646a7895a17f830555e669640bc520a5efe653ec1c8e8e9e4b0ba0c80c6a96cb9b549c96997eb7028d423436a1434feb1d0ab2fab8576eeeed6059916890cfda6294065d884d695674045bbdcf9c040afd2723596112b08c13a8cc69ff374879938b19b0bf867158d67cc06a056f123c262366a3798343c88ed4a91628fe12df01f64324e5eb12ccb8f6b178c886c81415c978a7c1e6fc8fb4cddc84833b3ae0b9bc94293936976451fd0909ba10bc720ea7ce8225c009239be3740cea28b2cf4f5280e0e39d77c56aec9e1e98590ad434b03400d2e126538e45ad217f25b415a9fb05637dc0ed51d78d11f8f61f2ee85c2a58f2fca21e2120eaa5443bfeb0faa5383093a61d46b1a1b43984110eacd9740ea4a57b311503a498becb00326554933fbc347f5b2f07a26c8d1b8b94e960923755921503c28220178908dc0c6a8780f7c094270c5f43afca7ae43e71372b3d4c98a0d4f01eb42c68b15555bc44c3479a21737a956f85abb7671b1c54c31e440a270558e18737d56769abd979a9b24223af31452b34a5c2bd29b68f62b33c5d76d04da156ffeeca0ff8217214b5340e9d2de52abfc1b6bd488e8e30e9ad64fee90224a377dc9331b4637c921058d1c4532bac8c4d2ea6127502479b7aca7e1c2239129ae0c3d6c4fdc8d800d4498dc17003484d3e664a5f38b516eb692e0a681bcab82d977f0cd9424e52fc69c93cb763216e0ea4c0abf91a5da615d8703ca7183b975686879a21b33d6addc2e23062918525c2667ab780839095821c5b3af93a2586e0387695d3402e4bab849bb7fb29fd117e6f7ba11c370fdaf89631e2b745c5eae0a9db0440aa83c89b12508ce71cbdbbca0b1c45684c55414644019eac9a126d2b1eabf5cc36ae9fb200aef292ec4eb7d5af3e0ffe688c20925ccc20e9ac122ba1d4d5d509c59da5de73a80fa061b13ed851eadf6ff3b28892544d45c0292fc042c646a5d37473c89591c894d5ecf23948c9ec3c40b95180c8559ce316acb87ea2e9003453609e22b945a4e5c61c7951944f7e7e31b3d809e3efa4396f2a74e0532621ca335b008d83cf694c86ae8b01ec9b09b22977d37e9a330baa5f4d185fb19900c45332804ceed2eab798050447a338a5d6f3de6938f0649550e8b4ccb23aa01e0b239a044fcc40d4156d4c54bdf4b174ac88a225e9bc283a6d484499ee19393008c4a4a58cebb0113f03cf4039bfa146ef91ee705a3587269a810970b0a33c9155b2e1df18ba226c21c050b59f7ead9a3b83ef177c6970fe382eb37c178e9d639984de94276338b3be3c5a6b8c1556a1deae2792bb350c8a1e63596183642dc7428fe3889babcc63d97f3062da7abdb31dd88141b8e2c5c37bad8177b3f3264fb25feae938734092c30286064e48ed1870c3b3e88a5c5ba40b6eae130fa4b4e800898f135a3d743899e945dfa6392ab6d414bd23a5bd946b2346a415754d5719d36d2be2e556136c0e49eea36c1780c178701468e6e0da0030cb0e645e0b4199492906d16357c81b82f7a2634c38dfe43b4f1bf7f1b71beb64f41ddad4c05381d8ffe11e38e216af32a4e6c7ff3194d9863f5a76a94e404a504ee03385848632da00b050d19c41af2b95902a32a56fad9b057d59cd6d6fb41286b1cfaf10b4d6797f2637ae2c1849b6de5a68b2fc9e56c86db337437c90f056023cd0cbd9bc12bfdfc1bc0d2dc3e45d1a31a4dc00531066393dd4210e1208acc1fd4c9882259d6e00621fa2e414f9495bc7bf21e025834f7132f6c9a97bc187f1512d8c10d6bb717d9331572864bb8851442d7d744962655d115f4fbeec2a965a199ca7416a041cb95705c9dcf6d891c7f16c3e4ddc88b0b9d9833f00de370bfad5bc9adf87a36619c8522e27abed3889735c1e832d107999ffd3401c0ec5e719562498ada78e9e5a7c2fc13598b8c113640b0912f7a0d52539a17dd5920defa8df58f5fbc55319037564840e7ce2c440c239514e10a69668bb8dca12ef7a8a9eb74584d35d0f7a49e7f4fa7d7e30507702e49c725d29067156734205c76c3dec5941c8a1f55e7f6689eb3d8318b9c9773a08338489b1719fb650614f77e0d5d69795c7914c8976732814377af1f211b83be1d7669cd198f67e09e8abc1b6603e978d0c649ddc019310e7b7657d3ece20a67c72eb2ff75994a4051f74219be26835a6afeea53331b6b8252bab6800d3c4c28a2874641c65813d9f6da3865c861c9fde9bbd32887bd18429598a9bf622e5dfbbd531560654ea46df3dd20ab8b7f56992ec987579ce139a24cb9ded431509719f0dc22a806d12b12c8ff366a96e1bb099a414d91f0f47d569b73d09fbdb197dfd2e443aea125cc320a35c3dd305d8b2941ee853034d2b41f27612211c9f7a044e78f6b26f6bfd6000822f03681f901cdee07792a2a5f178889e347eabd3484ba2f518ca66b0af19b36ccd8b6106d8dc18641e42203afe20022967dae91e2a03a5b6dcd33185bbb0db191c4d4750c0d053edd5516700357f9d734a43e6775dc09cbd2289a775b8990e893eaf5797a4e78a8d0524bae24634e35c11879026c4afc8c4ccfcd82eaa2b540b1c3f8a1f969cd71285b41d67dd602efbf55df3872dd238d3d834cf38bf8d46834923e29a5df7c96a3a07b59ea74dc3e064ca41b96f77a0e879deb5a9dd986aa832481e3fd08944a2d02c373a6e4c1753615147d123435f7f47421f3247d90e0e0aa52ba6fa584057a471dc769b86511c19c24e19b7066876fdffad9f9509d053a14605a453eda1b1b490baaa2f23a1771fa33d14f05197ec5ab028c00e01350a1b5c12688d74297efbe801f1e43c8d9835c02ff27172393e5324cc2368b12ed0af68d73abea029f11a89a2ef152b8f07228e2daa2324e0e87ea6ec288446ba32ef4b1c6a9a1d55a110b8818537b6c75f3c7c1369dd589d80cc0517bcddc220116e42440fe2a2ef4268d3cd859bcecda48a672fcdb497d8cc9ed731ca2ffa4164eaa541e30426322e74204ecdd6dd4ff72498bd6dd1e9fba51b58bf81ef7c678f7f330c14942e1911412728d40664a158dc8ae879f8a974673b3e03e011b10b9c820e32844fe507a9f0ec304147cd51b268c616d594bba70835a2f11879c21534d375142732e0b487d8c50322357b579def49024e65d036df8b82542dd97c7d7191eaa17bc3b932aea9533c21f7cab6446165ff31d9dcb1d0ac362c766278cf60d929b6e30d1a055d2382bd641b755d8ada09dbadc059cdb5c9c1d7349a7cf5d97b1833b1a465f729311399479487a2f78159b72092079882e90d6165f4c36fd38450d64af5b491355eaafcb7d07ab9d1eb6668971f6d33ce06722f8b1a5258bd44301cab1d943e82887619278b24f1e48b008d74aaf37aaeb6234a04342dd300746c2409819ba58c87a2ee8c759d49ec8b78312a14eab19c14386a20ba03b2d46dcd88b789c46ae09540d2a132b6a025451f2f1bdd18d5d38f7b2548876eca8fd57830d81a38af84d10111c8e8d145b304e483b1c0875f4bb52f6ddc32c07b7800e857877e08f11e064651417cc3b137dee640a10c401df418ce5941c75f03b2881925854a6e98eb894f1361776917960b2e2e043d1fec33cfc79bcc124a03ad017b631b63cec695be73103d5a65cad474bb74644a1dd03d78058c7bf60b647fcb37bfd98dbfb9710796191ccd15c425e6d0fcd9e7b43622e0d70f1785da723567185a6a9d01133443aa43a38853c849924450fcd2933f52c5f1a59a301a1f7e9a1f4c5b41026db128ea49657dca8142bb114f5b237ecb7d50597bcdb7d034d6ff8a88b22ecef22a4a82ca7c46231b833759729b47fbfe1ba1424a902558026bae869a228dfa7be4c99ac7d191f616bb92e4515ec0128cbfa83eed26325c831b438c51be85c76367f841b2ca5776393ba08f400043e3e460e13491040af266d0dd0349e04100f40161825b6300403658d4d0fc08246a20af62cc66f9bda6e0bffd6922befb6f82e67ec7c309c968d07213757f6cef29ba53af576def4c5481bf15bfb24d31957119310210800840f3c084014007400e50687132f572a11bce870e6468d0f2a3c38300595aa0347b680a07a42039b19b8e00d1b37b4b851e580030f5cd0c103b4e0645144278b22a74fd51395aaaaae20910503422491458a0851aee860e1020023c07225009d543ad28a2db4a8aa2c90d0521da12575eaa9ba5499a51e291268290d90527a9fd2fb5455d55fe95ca9ccbc90c925151995197c05144fd45079a1804e15422ad44974834d38d9a4aa6e3429a3aaaa28379554d54d269754d58d0d2adb735349e5e5b13c99d32459a9aa9b1a585249ea64a2840695e9c74727063414b8a3ba99810caaaa82a2aa2a59e9506084aa9aa4aaaa28379254644aa989fa323335f2992fdcf0c20426b0874e0cc3c513d00a18c54a0cf088a4aa6e2079c46752934f96aaba71c490460c99a969abea8691450c310406882862c88d9aeaf4657a4aa62ea99e921827c6c9f053d19050f34f262ba51e534df554a9aa9b337e82a40da66aaaa62fb6f429d4db50553789205255654e262c69aa54d50d1269aa800953553787185255376ebca0aa5c5055d54d2137845495ed190d5259f9a93754d50d0a6e0469c1182da8aa9b400061411d52d411b402d3fdc38faabae9e34b97d6d22fe874d4e1aefe6796fa8637d923759a405575a3471e55750af2f1627d7a48566ec848f3331851553778ac49f36556a7f919ce680fcddb121295eda9aa9b3b6eeca8aa3a2a2f74bc31871c3a6be7268eaaba8143055575938237aaeac68d9b3658993a53605050bd0f9d25315e4c3c3ef3af9878d048eb1364b2e17fa6f4f109c2d266a64c1189443f158d89470cd03c8579333d2893290cea1f0b99520fcffff44c1f2b41a653494cea6402faa1070ccafa98b4bc0f9d29134f55ddac610ae3e31384e5942a892989a9aa9b13984009244aa0461a4fa07173867dfb25313766944c5bf8f804f1942629cc9f4c271390e9e425859acf2545a5aa6ecaf831954e5852a5a73fdfe56b8fa98634a720d4fc539892a9a7a7d4f363a9bccfeca93d3648061f540f99e7e2336b4f89543fcc9be94905d57f22d55312337f262a68861b32c6a8aa2a4d894ab3105910fd54343a2a4ca1a3c2990ad5c39429cccc94292a50408556dd8451552310010a049d073851750d0ff0f20059fd5434ac0614bcc16f7837b81bda0dec86bea1aa6e42c037fce9b5b40318710021607c7132f5dc80e0035edc74c1c5165a78808a2ca8c0a2aaaa28371da86ccf15567403bc012d54414d3e55a8a0820a2aa8a836607d7a6ca8aa1b29fe4a55dd4401857d1a7c7c9eb0efe3e3c4a5c1c7878a8f0f95aaba69025555374c94826e55dd2c914455dd68a0b23d5b94a8aa9b244a269ef7493d0ac5cce8a400001d06e0e006896619787c045453b534f364441155490caa99992953da0c0ca65bda82da0243e9b99c4ca59e9f93a987f90343e9b9fccfe44133bbfccf2ccdd4b430d82db667747a6ab74c99f2632abdfd31954ea6d349a25028ebd363030c13a85f430f9952109652d0b55bea96c7b0a54ed34b1a6baa923a4d20bb258d35558101866613682626852a99acc0e6201894e6cbb417647b9a05c1a0a380286e78187daae774c6ce3f55d58d0576a8aa1b1d6e72682fa8cd8c74508044078542745058b38294293f3da9d1fd930a288ca95040281894aa5f03aa07880aaa07689229f900fdf4a012c0c29c315919a110d141c00874100081aa9a00eaada9a4730208b2c0a073424c3d181d13e61882880b0051020eaaaa9a29d4cd179d127caad203d160e2d12901842b6de81c20890a069130848e0192a8aa50bda900047c2a1d0380803a89ec088d4e01e0a84c3a05f0e2820b3a0510a1aad094a60e01e8d0210023a1a6161d9d4aaaeac64b55ddd05055373c5daaea86cbcd0c5575234355dd6cd14245478417543a2274a0d2110187aaaa48a81c5091107544a852e90c000795ce00e2a87406e045a533003495ce00be543a036095ce001050e9848049a513821b954e08595439981852e56012489583891e517cb6801163e239d959c5ce2a28142975eaa96267953f05a5827c7ca69534a99e5210991e144a023d22d47c3a7d52a71e5a4b534a89ae70464446f42aa4296d99a79f27e99c73ceb9d65a6badb5d618638c31c618ebeeeeeeee66666666665ebd7af5ead5ab57af5ebd3ac618638c3146082184104208dddddddddddf7befbdf7de73ce39e79c73aeb5d65a6bad35c618638c31c6babbbbbbbb99999999d75a6badb5d6e218638c31c61821841042082174777777777fefbdf7de7bcf39e79c73ceb9d65a6badb5d618638c31c618ebeeeeeeee66666666e6c511fa738d35ff6cc141070a505555f3f42ed49e1394102a1d2836950e8e25950ece23950e8e22950e4e20950ece9a4a07c78d4a07e78c4a07870b017c00827d1f138ff5316929fd0f674c3e5f258d4f890631b2aa6ee4cd951b2b15ea4b153bab54d58d04aa34938b89e74baae7a7874b55dd5089a1baa1004e55ddc070f34255551365ab04235326d3974fa1822609cdff17148f95590528a88c0955ea993f2629a9208a7afb676e8fc562bf746602a14e9f66fa48f1993e33c807eb331fcc9fbcfc7c6acb8d04a65ca1c10a8f1c8d2417315768e832ba814a9729533e35c94c20d309888b99275332f9c0406686f1f2654c617c82aca90b0c82e1e7535bc8987c6080415bbed443a6243f99610515aaaa42e37312812768e808859a40370cb85940354b3d3f3da78aeab13fa879e6e4c94e55dddcdc84aaaa861950239f999ab78c0905839416263053d3a28050f6abaa425355a11c7c5255a814aa078dec449066f6643a83424d2ff653261e526af6dcff09428536d1a4aa2ae85060ecac02dda366153babc82f5ea00303a6aaec9faacaf6986af8d307f9308168d8a1bd1de4982d604657e4982d5ca86cf922c18ce4173161a8f064d90266a26cfd6a8746832b29930f98f682aa2a64492529930f184e60558d8080e69429919deb136aca9411d0263f952692d090a3890e3d14368f5015005ec8648f1c4d4e6800ea24428d4e0f9449266b5455059bc544e12293285535654a26378c805054c6a4a922a664ea41f598e9b952a2720aaad514a2c10caacae77492d5e4e34385861b30600839c0a605958d1f7ad8d8d1450dbccc3f0901833d6c70c4246bb810628c0b28600263a4981066d63892470a50ac2044952915281551081b42088085131ac179020a0c0c12861104fc71720106bc0883061962c861110cfc1c324318d5066e30e08d4c20892a280b0cdc20c0937885266704d1c7146b745881092e415871a6833316f08207415429cac06142151208c2052f635c282cd904084e0450c31aa84bee00820e0fc4b0630e162010504451a28c1f616e00040e21a882e500486402c4ce117d68f14307a30b5452e603127402b95c808d2b8918018126b05ce0889b47424abcc0820b78f1631237a58a175cc08447e40234c1c1023f387204ce092d6411e20712f80322059fffe1024b6880074886e9072c0190c01011b081891f72b8c0c1d5c01840690c69777870e6872e69c080620b0948b1e685342701707141045c709a092c42002152ac88340038a1ca1e3a6462838605403820192c40068d073690441a61ac2fd09019c19415c2d8600d343d83350b10410e4ece7cb225860689163a9c5933e58a3964808133ce6c808e90c51bed8033a39b3011e8c408a0332af861660917b21863c6068540c00b268228801915c491480f3fcc36cc2841c6111aace171c14c183028dcc0050c4c98915205036470f9449020496e3c5964843c2c0952c38f4f78ce448123680830fe03297ec804c9f0814012f162c6074105a0e11021502a98400a062090a0e5c8414d899185084956608516a92016f42126f5c3015254827c3824933523a43ea0040154d80046065082dcc0881869bee0a0ba50c4040cb823f507caa7036fe09cc210817a8bac3f7230c3072ac4d3040a88d107273e64b8c0243760314e5594f050628a4b9438511500a00b2b9904728ac027272cb6b0048c0f9a7c2287014a68c2101fe6e886c80f8330e283132660c393287028e3c30d52b8c05446a8c1871444d08038aa437280284199b06853c40008052b38a00073841106488d9449ae64918415202f2688f92388e807500973b831c41a1d8430359205157cfc18600fd31941481f76745e30fd40a394a00323a630c913a6b050260b332611169982066e04d142e905380b08e2063391d2175940524527440851f241862f89e080cc1525098481028bc0e98952070b20811c1a9003849f15a8e18493401f403f598431401b5230f2c8cf1d81187854a161929f5e400d53b040a5e0e3492805283659c37dee683188c10e4eecf091020a363a00ef5881cf0e6aec3087132014e1f3803930f03e78c195b141480f0b982c0b6552d003229e08d141186592102304779936ca803963c5252ad4b0ca28a0017164008c4ab8f410c92436f088263ce8210d4a5a041c04517a10c211295a70e800d5c316352500f24399277a18a1a78c2a6b6a00a14791304b90b8b822484f18521211001f532ce9494172804106a1637a6258439131c6e031a3c78338c8fc40860c2420b580cc119dbcd18231a42e14a005fde48a165299cfc33d992200929b244a0b794c3108c92609406c8872860064f60801054b42b03309192a7c40638c0c12a0049979891366a4204320645a60230847a05cc9c0cda4932a24e9c103f0ca4113a1411b6770729be821078d8c8878e2da90c41e2640a30f102e0300116493273e78e169a080148cc1009af96b94f005604e227923b2a811e1923b64f03c8400c2130635c21f808c2042ac3c61c532f286268a3c109e35830a1cae1b8ad460d3c811beac34d0d82b6e25650339ecb022b4e0345981b4452d44911a6ea812c327150469a0c1820599ae404f6ca08c1947c451a708f1453ae2851f154a8bc02589e40bfa0726604694485143b160000a3970a40a84be1a8e5ca1a61a01e51dd4fcf04785c4ec640d209aa4d14098764cb1d2c2133a0832a358e3dea0401068a60e2825447a7472c974801c8134c084833978a88133a306872a423cbcc1001ba6a8608907784082670c11120f20010f5fbea861892dbe5cc243025a6083d4e304331841724822650230b2649406098e5032258d078c30c0c4070eb0c324a79116a022d234e2460e230234e1445ea830c3028968116300486c10c20223e8200c3428d0d9c30229286222c0c30b04b1400c385776ba0021860502c0c54f078b4c9d1d0219c2065802138276e0e28e11811dcaa063871e5e50440b071af9d9a17dd2a50344bcd8b043a507100b6640a5d1218f444c9044e74b0e3a7040082d6d507901103acce682037d6c593a40404d63002322e8924326373a446202292fe41047163280a1e3912a72602202565020010f98c8a1060d6431850b12f8400e0c881284951b7050c41819b88042c921025a8c3941014e7020763030a688335a385909e8315d9608012625aca1610c095ec8808e11b8a0000e8b44f2464f1825ec814319545c18809927c8c0014d6bc0179b9c2cc1c18a0e924c120115e2c021844e72d068a1e26e20648d0bece0a2b170c3070059040eb1421b379850d0734955a58e1be25c0014952b73034e1735506c074a6cf8038615309183044cd870852703a0c40391286283cd03e500126630840dab0b4cd620c0ceade10659b881c31a535ea8a10e1956163ba6f8a48628a238600b1688a0470d39c4f0c21e46f0e8d4d0803d3e79c1111282184b80f4b010200005c4b401891880a041210f3119f84289213c1cc00b311578810d0c90069648c42060032868600d1f50611e31e400254e2ed1210c1a5bc868c01473041126882a657881c416a23059484b9420726940181d3602b0c31d402880392493204a481a154c0836d921123274a0010c2a0224ccc0862040000343194c945183490698284b7c40052af0ec7c01c48b183c0a0849c0972dca0c20002be070c7971e069c7ed828237e69273891029125777ca90cf0811e37c4e153013cdc48448c38dc0f1598a28a126a682caca9000f6860903387989f0ab090838d09a088b980174c0ad0814d70ae502f702052800d3c0f9ce0450338a0a402957432f222a68a06bce0012e08e16501f2048b1ca1822b6898c40b15fcd1821ce44083094ed82304395718800622cc104406218c904303172e4b10600b0a4a4083013ee04550205344c1b3080288d0e4102b21e019e3063d4c702082c07346c4862087dcf1024f9525d688d1c81696470063a4b04cb1628b2e83bcb1c20ad6fc5042172f3c692384d849962e254a07234f6c72ea0269b889010538c1a4cbcda907893ba3e0e2470282be00cae2042e5634628104d8e08c0270a93168a411396c70858b0b867451c259e367064e82e862890778b061063a2c0c631ae9428019a0f0c28b78796104338c2921063d9480032a33ecc000892446c0a30f192a51c3c7e790120c32b0c14696113810c492e188c90233877802870c153821843a30603b20c30916c040943ca63cb1c51147988b2ed6a0b69040cd03d250830b1db600d1c1173208c3ecd882a5cc092ab1a283165b7228b103073f82e0a2c5103404c9e4006bd268010313347428c2c5d472dae1066e4209906879a1ae60c91c3a7ca1050045207149163224200b0bfa008405037441822c5a90b086151b7a4ec842d2e1c48f345218c9c2aaccd31d5d8ac0f2c91f58484208103758d680c10803b0e09105960dac5182124029918065d404254944396307cb0a30e010b960421279092b72834706598084e30190b8a0001d22a41285f8d0c8276a42320c19979ca06f9c94b2040b2da8108ae28a2468aca429c4036a5c2941044277c040864cae0c51891f1d74698114576630a1114116a1c4cb950298910034256022062b30b8a1111ea278a1b222461c3f6478d65456cc341b8e20848bca0a9539d2b82243545640288389035a555511c40d3a5080a2aaaa78b1b2702486aaaaf263c2145eb816339154555525c4c5480a1f7c7c1583a8a93a7f5011a91962931ee648e28918708861870295e844d2502791a9272483aa0a4d52552149626093490d62b0880d22905cc981c401901ce0914aaaaaf2f1092a4999f24069528fecf1881c6c3ca24655552b4899d2420b2a3c12c523524a3f413ea62a45ca977a82ea9f50f3e7c784e649644ca75310aa64f259e1967a22e00204a49c4c5278268f9494898c0a523ed553eab952509f32a5f9322b60e1b5827488c05a6b05e9a082141f130f0c086287167898c2831429f57ba02629a5799a405868904b20b242498534a7393a4d52f579d4271d78c0482a00593072800a75124589a44ae3730592aa0a3d525521471aa974083adda0528a06350b8281155525a505182451c180c443144614a1017c7b7ad4af51e48caa52c48a4a8d22687e824aaf884f05347f14d141912b5575e64b8a2c45105055a99e5250224928825349492492549da749aa89ace1414aaad4631aa3aa2a1ea49c9ecca74a3d89609188143cf020a534dfc764a269e6e934432e20a4ea0245225110b9529dc6209244853a8948a909e4429a542184a04e2954d01729a4d40492e2e34365ca94434a90c269934d36d904c743b00028691842c2c9828b9c1720c0054b141283e75a4b2167147246555528346b8942bca04ea2917d343db7f6a4fe8794ea394d17720a69a1aaaa1e5a8023495792470e10b040212c6d5ca0068014e0051ef410e4901fb07801124c6280630a2d1c998013639c3c8844051ea8238c287450224417105c40490a6c00c317141486bc70b282094daa14385a00c2c308e9ac44d27efca4206089161cae00a00e141c507c6881046760528227e0059b3e3a50071859d8408192068ac801171e4c0004ad011450aa08a01b04b8e20b1db810400f536050c0a803463c4ee208440183cc466c58c10d36d0801642001a41849501470cf1e346082998cc61e60a228ebc40430e9c2064053d5c68c0044e98a28b1fa838608f43bedc88217a637de0031f53a6543983f0902348253982b4207532512fcf4c554d00e5a54a2da5415141fd9029f5d4521ad44c337dde96ce98ac8fc95447a39fa0d2c89a4aef334a731a350b22a580de0692030bb25bde9aace400424455553950a0a972a02053e54091439503050c550e143b550e14285439507850e53ca1090823ecf054393b3054393b2c54393b2654393b36554e0a975439290c52e5a4e04695930218295451e5a4a0a6ca4901a8ca49c156392984a9725278a1ca49a105112a110470020923e4ec814295b3470855ce1e559593c3ab727240a1cac901842a27870eaa9c31995439636650e58c81a4ca19634855551f88f0418e1a36aa1c356254396aaca872d468a0ca51234495a3e64c95a3c654e5a8d1a1ca5193a5ca51e3aa1c353b558e1a0254396a70aa1c232ef9406700690c51e5a451ab9c3472a872d21053e5a491a5ca49e3553969ac50e5a491802a270d01543968e4a0ca41a3922a078d47aa1c340ca972d060419583461e550e1a725439689c51559501a28420001106e04114129ca8724828a2ca210155e59040aa7248a8409543c2952a8784ae7248504095438207558e017050555508032041a70023c450e58c30a5ca19210255ce0806a87246f0a00312a26c52e5448941951345902a270a0aaa9c285b543951a0a8aa0a04025426f00451e5f094aa1c1e2f550ecfab72781450e5f09850e5f08450e5f0e054395d2ca972ba3852e574794195d3a58e2aa78b1a554e1730aa9c2e5854395da2a872baa8a972ba9ca972baf454395d6c95d3854b95d3654a95d3a5ab9c2e0fa872ba2060002640f100040384e08100a0e87c50d928d24555d9d4aaaaa2aca0aaaa901f7d4409f111d2a3aa42795455088faa0aada9aad01d88f40185263cf010b2a3aa42755455888eaa0acd51552139aa2a14475585e0a8aa900aaa2a9482aa0abd51552137aa2ad4465585d8a8aa100aaa2ab44655854e505521135455a804551552a3aa42695455088daa0a91a0aa42675455c88caa0a9551552132aa2a34465585c4a8aa501855151a415585445055a1105455088caa0a7d515521105455e8035515f2a20b1eaa8a86c447988a849a6672f650648f135495e8b2b0470bd500f418a300555561a972f4085355537818d5a1072187d8f42149aaf47fa2040f20aaaae2830ba04f957a804c61de608490353720b1a683999a57a8f8cced01e92ed29ff145978574ef0e5e76f032e767c742c6381fe44af92ec7d63620d3e98a4804643ad91879c68c6c880875c0e36bb71c5b6b31d6ce2dd7f845669d2db7f1766b96e41c841ab12882d0159242b7eb42dbdfd7b6bf5ebe78e1b2b31386cb18212b247cb479aef97cba8ecd5876acdc2da9cacd5684aa9071bdeb4e7f42a6ae4eb7588b1015125edb6d577d0dcefaeca8343f0307e4fae9ded8c136e382ce4a22a0f903d712a12964dffbe084d7c666ab358f4aa61ed7a10dc8cbac7a7c8ff1aef7e5241f2d4e9d4ca8169242d2f55fa7bfcbeaaf652514857ccaf063af5a2d6c8b35fc094121576d36d245dd79837c6d99d01392ff3dc6e5683387d435c9f971979013f2237d2d3ec61abbfa6f929ced97ce9846769a7c44a2d493118976c264198976ac700d229148748345a809199ba3b17a6decfea28bfe290865f2a923d823a0a0511993c9c77b274c969d0aec58d9e1b21386cb4ea4d679c68ccc849890955b5dac5fb5fc2db2b784bccb42d63152e76cd36624e71deb413b3f3d2494c8cc0ef5a09dd5342099ed75fb353a2dc9d9c767d656c2d22125247f6cf0ef5bf49fbfbd9167cc0803a1246484afb219dfad3036e47b480809d9e87bb65ab7ee2b6c6d452291a8f1882509654046beadb1db2cf3ee764a721e313b227484ece6dabbbf5d6b738b1dc919161152235d8574b57b1bb4ec7d3ac99905113242728df5b67ae99c8bda3549cea3d83646848a908d297cac55c6567cedced5a41011f2275ff7d664f67af356434348672d8b9555c8baf29d6cf16a663c6346636c72202363b7a9adb4454bffda2d229148f44e29206bf389acef8e3a7d7823df5fd413d9b3ade99efddadfdc5d1cc8eaeb29b5d021a573c6ef44ce77ec0ceb756ccef749728e3b61b2ec9852a52d614e58ea038111899c91617303b92c63c7d6fa3b99c7fb2467d32dc53022917367baa59ec53c63463643d87022e943587fbac9dcddf87a13c9beb827b3cfaedf3a939c4bef33aa6f26b21b41d6e479bbc7edb16b2d46efd8dcfa36aef03ad88d17e4d64e29a04c24d74ae1a3d54d47a35b1713b9f8793abd975dea8fd64be4fc6abbbdeaac27df586d202953a6f471dff56b455a03c962b3b766bbd0dd63534be47caefedcb78b6d977b25f2616ce6e7556d83ee8f12091d5afad8795e7e6c1d0d647c0d273b7dabe1737433900c1d3257296595bdb34d06d29d2d5f303277dfcf6d12692bad97d2ebaeddca964922fb3dcfe8166cee41373b06b2bd3fda2f2e8e44beffc9d87cceb13d3e24f22be3cb2c4ffa17be7d442ea7b79b9df741d63f1d910c29846ced6b35d6161b91d32ee66c8bf1b5661132229939cf76d3d782eedc223993523d67da4e982c697e06e7c87811499b41f89e19ff5b8b4e18486729d76b637cdaff1ec4c14611d9a25f1b5bbc717aa37d13913d618bded88aed2fa411115963857f6757be91697d874867c6eadff7496de3a686c8f7b13fbee3799972a967f4a9c92f68cd9d35ec0623636cadb89c6f377d5f994d6e18a18d0be4abd7b5cade64d8f7d626399b2903df0b6c0a91f417df45dda18b8e9a2933baf37d468d6b98c1351f3684c8fbed7effb3d5ad372b8d3eb34483fdd2191aa0f3b3c9c46610c918fd592f33db7b5d3fc97964b25010f9b1d57f38d933bded1ac9f9c9d83ffd8f6b934d0b64bced2364decdd148dfb5094436db1e73f7f36bb4b5fb3e239ff929d4a88c4f100dc3652785e653a5d880c8c66cd9eb1c64b7fcfe6481746f19d6ae8c4c69c44fc6caf95cacecd4b0636567861d2b3ba9a02e22d1e9cb9ce6cffd2f6f4d3c229148245adca12c6c562023add07dadd0c1a6eeda3fa46beab732aed3d6d8aaf3435e3b39ce06df7be60ca148d41ecf98d10e367dc8169d79ab94bf55bba8e32376abbe66bcefd79b6c0febecaf369fd77e7b5b367ac8e68bfeaf5e4f695c9d87a4333e67b5fb51f67e2d3c248597d1b81aadf05dd3e878c68cbed8ac91afb2bfb996850cfb710dba43b2fafe62a38d5ad63e4e3be4ad95427790d978d77c3675c8d9f03e4337ad651b3a569bb6d7c777b7fa754f726ecf817e7ad8169b39245fe675be77d7bc2065724806e16aec686bb795d61687f49e37ceeadae96d953938e46d0b19be18a1b73a79a9407a3b658f6fb58d416e9e02799975f771748cd1e620bf21fbc24afdbd670a21e4e986accf17f469efb2abf6758fdb9071b9d7981bbff86e9b8180c4b021dde3b3689fe3e77eddef41f35a4e7fc6c4c502362890d3457eebed854c2974dadee5c1660dc9eee3b56e51a63cd9634cb23981b4f7bda714be35a37de720981fd3098b4824129d52a8f713542263630259ddc7bbe8bcf1d9ba58132312994eff43c95412897e824a8f67cc88da944032b5cc58b74b7b45d8d6a9211f5ccdffdd9efefed91b45763669c879d7b5fc9cbf66d98a15cc290586d94f2954b44143568776c63a1d3f830e6f2a28a252f0944231664302e9bebda53f1dad17b2d7a3d2fb388f7e4ca73b4a0364aacebaa09d303bd405edc47e9b33e463efce0563e5476763dc31d898216d735bf131d7abebf5fbaed89421195bd5b2834ce18d8d1f1972bebd7fadabae355f704dd218d2c16ad9bfddb7353ea3366248db16d7ea58ecf5ec793e3ea55061c8c6b8b2d5ce42677ae74ba14620a3adbfee74d877be17db64a222900c2ebfb7d667f45df4d6e3b33804b2d974b4dd05e183ecb1860243cec7a8b3e7d79bbd8eefbe908e67e5dae67bcd4deaaf81407ecff9587b73b6d7dc75ec03922384ab51db209dee8bb51732daebb736f7e8756abdb9ee425ecb1c832fc65e8c1f739233b3db7021fbde5b5b9b90edadcc366a0b69a9db5e8b5e067d5e0799169255d76873ab95bae97cdb0312c2e99c6de7a8ebb7dc1b8d5e67215d848f757bbbf745e826c9b9b1908cbabaec5aaedd37b81e0828a803b2b179fbb1ba384eb6ba919cd13c6934e22be4e3b6932d86edbe3bab24e7b74242167bc16a9f6d6c6db45548fb1cf96363874c69bf6643856cd35116dfb436b6d9969b8a0d07646bbaea73703d63f1b20934856476bac8da2d5b6fad3720a95df4a98dfcced2664db6b13ba550cf460ae9fcb677976b1fe3b36f24e7335f62229b28648b0ea963ee699bfe7250c8eb9a6bdb137adb60f3847cbf7c426691455eeb4231364e48e6f119b37032f6e71cb46942321ba9fb7b0ed95d18d9061b2664bb3959edbfb7b9bae23cf512f036aff49dc7e866842467d81c344afd5c68a3014999b3b1da3679797597c26636b25182dad7ac9baf7b6babadbda0d1a34e13a8f14f508975b14942424addf39eede884feaf99161b24e447b6cd6f6ce7be685792f3c87e6a642750e4d3a722056c32203f36f7eb0767d36b7bf9cc9f9ed84eda1c21e9f416638c73c1b61d670ad5c325daa891cf6fb9eba87becba7331f510da18f197be7e0b2b6377ff246777fa52694b189b22249dcdd9d720f3779d55b86c88906e677b2bde192f5bd6dafb000585593643488eded1317bd9b4765d4a727e2f08219b42b695e975d73e73487276609861eae7320c48ebacfbe70bd2ea5edf45c54e2f2211eaf4f0f18c199109425277949d99efa29651c8f835101246ebf17e5ccfb3d7eae878c68c6eb8007bf77d4b238bbe98f1f0037bfae6b5d75775ae7b929c194f1a591d53667f358e73c2fb91d1c835ebd3c6d431e338e1b5a59e33a52053e98c64cd6fb3dbb4cdd7ee3ad04f0fa366e4fbd7fb6cb3f4f6bcb6996e694bed294d2f2291e9967a46ce33667483e4c7e7206cb82cb3969fad14a3fe313ae1f36a1d7b137e6b3c6346f42461fcf6ec748c6fed9ecff8b50f921d9cb5d6ebec72b1da26f908d5d31c81246d8e45b675b5fdf5ce49cecf8ee6898ce36637c9e52c6cd7dbdfb2de662339a7d0fc68f426a9517e9aa4dac094e47c1e5dc76f08df4fd785e9f023993d9bf7c657794d6e2e12f9f87cc5c147dab898b16fabd61897632467db337aa03429df099365274d898a4894a63419cf98912c239dc348698dec7acecb4e7276a99feb801e2a9c74be3a3bc6bfdf5ab315d4236fb3e9188dace37dce158ddd42a634bf884422110ac83462e71933b224697fd978e1b46ea76babebdb91293572960019c9b61f840f2e77f6c64549ceb614643a8dd2341cae6c0e36fdbecb39dbf7efbd742f423aaf3b663e9d4267256ba6cbcd05adfbb71e906914d971a9d29dfd08ddebe209a7ad13cd63a1d2ad6571dad5d4adbaee2239bb16a6a49523a4b43ee6fbf032c9b961e441b2055f7bb3e56a43662bc939857ac75b46725ab7de5885375a7b473e413f8b5743d38c4c4f15f8266001e98b5dadaee16cd6b58e2467d4083299524f99b8836490b21a1dbbd1d17921243997dec7967ed4da391da47d355a58575cff2cf446725e7cc60434f209fa890ffa4f50a94a0eb23a6f3e99d7756d64beb28c61de2064fcde73b8165cfde0cfbbae8bb44d86cd5246f2d3a7b6581189ecf70099aa48841261f9b2d38b4f29201b2f7090eec6cbee82cb1d36ff5a32c5af251a4a581e440199a6dc201963cf9b3266ddac702e9273ea64a233051b245dd77ea5aeeb5acdce78ff8b3f3241f4ad4bfd5c0654439b2dbeaff6d8aa8df11631acddc8114e769fe93b92339b214cc3767ff9db83efb335cb004642e6b5b95ead5568e99ad69a22c32f92216b67ceed5dd0bd9d24676b9a5201b96875d87332acef31376b4d2b7a918c9fbbf13aeaaf2d78df8a34c8e5d1b9d76ab9cdda3e403f3d23fba7494241e791ac76bc8eda9fac55a7df2d812ed2df9b55a6ccfac1cbe019938fcf24a1fc71911352c6bcad9ff5ba67d1f4633a01714f9941466b6784de605b4fe773246720d3c9f29241cefaeab74b59c3c74c17c94d29c6bd45cea697c6485ffbb696e351ed49cd14aa99b548185dc70759847def5c8fe40cab649190fe7cad5546fbd6cacc452462ee9402b2018b0cf2b9e5d82337f4175d8b0e36d826ec5eb13a48ad65776775900fd04f8ffb092ab13357e4bdeb6b7c56bf4157d91289a043d1e778c68cc45891943ebc94d7a575b6481fc999f94187a28d67cc685591fcda73a4ff28fcf6f7929ce19f4c564eb306da8d1fcf989153918ed2d6f5adebfa26751c8374cdf836c7ce5f8d6e35f778c68c2c4001c978d5f5de63eb0e36cbee358d22171824639721b4b131b7d3757b41bef7cb6b8d8caef76ec4f83dae6f866d9980746cae8eec2dbfcc1e4e92f3a89e66b35a4a836a572420977337b276d0c50b298524675732f9581189be64f2a9229148f478c68c729822a3a3b327ad14fe6c2d5692f3a8f9a57e2e7b51b665b6ff3bc2e75eab90e4bcf8ada9d41c3315f863328d7cec69340a804b7be99b6cbb3567f7da48cea9138ce149e635d2b62e7d4fffb948721e3974b2b976d77467db4d27646f125e1bafb34c9b655ce122399f319dc88cb819b338fff19cf6cd56bf929c4f29545bf6b5f565cc1ec3f6d1c4b2b5b5af5e76f3fd6391919c6d69723b0e4bcef6d52cb6d77ecf9449ce245410d0e864ba8fca8e959d30ee78c68cb8b840ddc6e9b6d95b5764d4919c177faae764830da9a09fe578c68c7c10c9f7d5e07ddb0e4ec6b0ee84c9b203ebd72012d5372312bde625023dab77e4f52fc606dd49cece660bf7c6c91e75b6eb51071fc979274c969dffa10715b41386cbcea8d43302329deceb530aa80608ace88e3dc6f8d85b8b19748f453f667c7c44d29fdbc2db5ebb6f9db324677e282a31f573d99f4c75061664bbf7bde5ffeacf36695c41c215dbbdd63a84d0dde848cea99fcb76c264d9211344ff8a4894fab922d19f4c1535775607ed84d9c1f26567270c979d51379e31a32c2a8c5041a7d1c88407a0993f0a70008f4c3e644c3e253440ca0e0352b03f7aae5960001bad053c408a0a0a5001851612f00004b070c232618512b8bd041c008de94c0a05129e6b2906681ef597993e7444a6d443424d929402f4298511460d2040ff98eae8f4664cf54fa3119779ae81eaa35c27cd689442ce03444095308036994e268450a64eeae36362410076fec9041050f880474fa6040f50080800ab10a5190080133a80c23f28e08c4ea6d444c00d03423c82371594001b1e3d6934aaa89e9f510acd23a04a41045216d9c2e67f660947ca222df8a0c2c38a35546e30e123022d40808515547880031ab093821405a09000049c6042090720c10023104027478401046c04347f9cd340a805070f19e183f455fa626c8bf55a237dc659efb3575ff79af60ef99546ebbc5fbdffcc720ac70ec9fe70fd7d8efd9ccf661df2216cadc6660f1b9bcbd1215b6c1b195cb3ceb6dc6c0e1967b3b9da5c8ddb476e39e4b20ffa73abe98d5d6bdbd27148fb207d1e1763eee5cddac1219dce66f5ef628eeda3ce3915c8c6cf5de69e675df13e9802d93ebaf7e86c1b9f327ee7dc1bb25dedd6d863745d567b3a2603c70dd9da7c2dbee6befe2f5f6d48f645df6270be57597ddf050e1bd2adad33325bfbab7bab3a14c8be97bdbd8debce35b9ad21dd678b915a6e91ebbcd3b913c8e69e9935d86cebfa80d8c9e425cda9081c13c8bbee852f7ad39e5ebd1bd700b959c129817cccdad65ead15ae479d4d734a956453433a4ad95bd723e546a3a53869c8ebdeba8bae7eefc2f68d79c48dcd3034e47beb413aa1531ae785b44b0f1015c7661c9b6167e09040f2c31b29bb775a6f3e2dce19d2395ccfbcb277215f6799e09821577c8c99bbdc6e6b8b3111386548b8668d95dec9d5be792d18a020fb57ec0305d9b7386448f77ec5386d74b0ed7b8e3306fb481fb2575bf95e27399329f5a4b18b5d03cd1f86c211435af67cdefadeaab5e17c91080c9c30e49b953df7945d582feb2b12a19e17382390add67b9f838b615dab7614382290905d1bddf2ba22ebb99e9734299168c469528d054e08dcebe5dc7b8dbdf716b3d7715136d94e66ee033860c8f9911f7bd67aadcebe2e9c2fe4b35dddbc8dd13b2f74fb2211ffb411e08040d67f6e0f79f28a743a1a3f205f8571d9fec76e9daf5d2fa45fdab8eb75677bba8b5d48ff7f87ed9ca333dafb70b890b1deb6edec5cd1dd6e6e0bd911be776d3adb72af510bb9e67d66bfae73ed46d6b68c81e301b920fbd3d8e06cde62731c70b278cd1c9b411721f3089d3be8f7c1ee785bbc74da1971b090f55a5819ba79e772be1c4e07e46c9572ec76595bcbc28b734573ab796c2c2e5e90d9c586ebde5baddf0adf46b717c70ac9dc8bcdacd176d545ea168fd6c0a942beebea31c2d6a863d45e91c8c60d1c2ae4e555fd59d6dedf6669243903fd9c4823e652cf24393be31933b2000e07245f7759a57dddefb7baa00970a690cf6efd6a2bbea5ae2ddc09c365070d9c0dc815f9c66ae17cd6fee2c291222ee7f0318b6fc1e7b0577baeb2061f3ee4d7044e1492ad7dcfd365e040212f74d15b838e99ce081de709f9f6fe64b666f3c6cc3921a37deb51d8e8743fdb5a4dc85e3cdf35e6979faffa4c48379f8d17b21aff3e769f16384bc8f79847af971d65e6188e0624d7ae93daf51edf9b3d8e12b2c5095d5cb3b91527732d095eee3d66f65e7316e38bdcdc7c4eebe03fb8629d0f719090cc229dcf0d9963cdb55ff0089c0cc8daaebd375f7596d677f408497badd6ae6977fcd7a61a592ba36cd1ea6c2985d6e11821d7d7d778b9764e2d74d44a15384548cb16379bb43e17fff21389e28819173844c865ef5a91fa65fb8e7ded84e1b2d3c2c019425ab878f9b517d2169f7324672c35385fb9c981ec3b2f5dad5158dd5f245a7dc5cd27f26b65bbde9cd5464fa463f6427899dee5d1632ce30607926bbceb639bb1cdafd3919cdd290574d389f49e4ed9efe5b52664113562c67d03b91a3f165b74eb23b3586f389196de777e19a34f241289dacc2872e06613591d8d903667fb5ad8dcbaa589eca68c9d3e7cb6df61cb44becbf6b69d71c6fada2926f2ab9bef41cab0bec56223717389fc09abbf45e153b760db40b60519fa73f4afc37e785303b938f6ed472dab6d29642467c6cf12d9903dd65ae3c6ec851632568974bf1e64b6d4597bef3546899ccc3e75e8afa75b76349076f9abedcecdf5abd0312e6e66202d57bfaf3563adfb45efe2460692d9fb9ef96d4f2d6d94c511c39e44ae489783dcea7cfeceb52432ba63b6bb39dbf89feb18c8681f7bebb8ff7d3ecb3791c8b66cb5adeb64efd0dd4022216d14c6b7ecfb4521756dcbcd23f256c6f14dc81a6bbaae7544b6bbd3a34ffb16f5f8d64d23f22fbdcfb9b6f0f564d73122a9856bd687dcabb246e1fab26365675560c70b971df701fae979bc887cd6743977ee329b7159c6602021fb5bcd315febbbddca9822f21bdff9d4f9d60bdfb589c8bb626cb4b2badcb2479f314424d7878d46f771aef89c317688fc4adba20ea95fc76aad22111b716486c8ebd82ffa62a52dfabc972df6819b17c8d596fadb660befb2cd5dd030b666c8aed95b9179f1e2e55a8bcfcd5b750ed2663edc1422bd593b3b195cf1d96f5c6f108998cd143784c8fae09bd4f96a8696febc1944b2a3be98afe9d1c245ab193782483a97bf86cb5ae7a2d717c7b86981f41badc3659f6dcc5a6e23b8094436cabc2dc6a8737739dc0022abb591f257e72e3f8dbf78c40dc60d0b24c7456bfccbecfac5b6a2076e56202b73f51fbafbe766e5268dfe871ed44ccd2b22d113e3e60ff934be68bd52d8ecab76b11ff272637eadc11be35b6d8a44aefb90b34276af276d7e1d83970ff9f0bdf78296fa5f56e31eb2af63765abe2db6e994cddce821a183afdd465b7dae467721cf9811ea260ff991badadafac81e5d5ff190f5cd09ad4fdb66a5feaebe19e618c7cd1ab91e6cfa37f675ee2da46044a23b64bc973db3b0cdfa7355bae213377648cb5e6d8c8ee9e5eaec4edcd421d91d83cf1aad93f2ac4f24ea0847dc4bdcd0215775acb2b8b8bdfa62bd90899b39a4fd586143ff2f6ee490f1b2db228d5cedc7d93771c85a6774f70917377374c1215d84b6fe858e9fbdaf3215c8f7d07afbfb1865dfb0a640cee9d657f3840fdd63ed0df9d61dacd3d1cbb4e37a37e475decfd7848dbac82a6b43b60a5fe3c7efcd8f94211b92d537afb5b7fe5cebb54681bc16baaf963ac7a6b5f4ad21db636cb56df5c6d7d6f509e47afebfb8d6fbdeba852690d3e3fb072d3373f54e2e81f4c8bc5b8dbebc39eda7866c91b5fdd97339afb56c1ad2e9f2b60cd9d1b70d1f1a7251ee465b3b6bfde6a52490b0b63b5b75ffb1b57be719d25ec7ccf65be8d863becc90713175963b4e66a12b43de67ee9fb7699f6d1046386ec8900cfea5d1a15d2dbe6a21f388db8b9b31645b165f2fb7ecb3aebb41712386e4e6d6a5ceeb5a8fd62dd38d4ddc842121e37fd1f2f40a2733a54a528b9b1148bba2a595fdabd139489b08a49b8f529fd1293b5ad70a81ece9167a6dfeeed87d074332c77696f55ab63a777f216d9bef33ced9de8ccf3e10c8ba6c65cc8fb2736d8b7e40b6c8e66d2fde37a36b6ebd906fd6cbb799fb63f7c1d9858c6eb6376c8f6973f72017f2c6e7f7c5ce2eb576b92de4ad6bbdf9eedfa075d8b490f0b6bf4c9bb6ab143ae701f96d5dd6f8d139d7a56fb39017b278ffd9c6209cec2d2c64bb705a1b27bbef8d3b7640faebd7d89d8dcd1557df2b24df55efadf6ad68e9bcce0ad98cab5387b63d776b7d55c88f97bd47295b2a24dff8eddf6e9b9356c638201d6bbd9ad9b76cadbf3685bcb5aed69599b5cb45d71b905c9fd9bf6bc2f6b5c62a857c70f58aabcd086b7b6c45211985b1d516e964c7b83228a4ed1b61fb8f95d97c979f90f3aecab7ddebecdacc9d90be6065ea9a3dfae08add848cee5a5c14b2792753169990d7755ccea6b37aeb6a5f42b6bfad69b5ad39fad8631a90cc9b6dcad1b9b51ee9544232f8e6a2fcededbfc638090967749ecf18ebbe4f2f12f2c63917bbecebb9afdc32207df67b77ed7d16ceafef08d9e6e4877c696d6ecf5935f24d6e91fd39369985b5a1e0c608e9dcd1a75dff6c55e6d3675a193133d38cc54d11f2515ecf177dfef5ed7d22e4b72f9ff545f771ddd560e96608e9dcadedcd9f576ee634077252eb335e5e1eddb7e59fc486973db3bd5e27bfc53c916e1bb5de9e1dbbd7ad2612a51e859a211c5ca6904e78b92b84b5e38e172eee0111ea04325bcdb8c505575c1c19b2fa8d575b07ad9d5e5d241289da8c48d4ef06d29fe5c5ee8ccf95616b2467122a0828d2f03891fea643e6da7cb43efb7e13c90faea6f1d908e1f455439ac8eefbf0cd371d6393690b6522d9ae17fbb566f619396222ff1d2ff79cfe43bff0852e914f99b9d9ea6cf27c71e110b2815c8c7673ae5d1b6d84b306923e5ff452f76b8974e88bb9d8f1dd4a248c3c99b5fa2ae4679da5445e7b5b7bb61ce137ba280d647ccecccc2b7d97391a6720ef73ecd96ab9d2868db90ca483ce6c7b97321b9df19ba4b97bfeda756bcfbbb9617fa4949fe7fbe931d23a434812c9da5acd5ebed4be3b1f3595463190eeec75eda63cdbf37a2391dccb3518e36a5eacb68744ce75bb7174915617e77d4432f6d44ebb2cdb67cfd611c91ad3e7eb46bfcfb28fa146a4438f6e46dacdd9e962432c214624e317fbfebfdb0eaefb22914804470cf47e2a1ac881d022b2b2d69aae59e7756aebc340dee5ee11d66e8fefce185244fa77adce45dbd1b19b2f9488a4cefabc713da7b3a96522d1332312318ff899e9184244f25c6ef162feb76cbe3f445eca4ee3b25edb2fb5b1ca8e951d2a3b5eb8b4a09021d245183bfafb151fb4f6bd40bafadc5d8bad9b527aaff31f2117c8d9e2b717a9f5d816846d5488ac2daee76cad472d2f4ac5884422d16831132142a48b94fdd77b2b8536348874b5f5848c3aedffc98cc418d29020f232fbc96e3efdc7ae73f5adc9ca5b134f5c3c81500b249b8c6d7c6edfe5aeefdb96502032ba735e69bdac7af4fb80c849d9d7754fa365816cce103a3be36adefc7b0512da76e9a4bebcfaa0e289ca63f7878b6b75335efc5e3773ee58fb7b1f7e83dd2af4ae21e48784eeb5529f707e7bcfb70fee09f1c1a252680f69ddfe7c1bdd7315c2b548ced6c77447694e29f865c7cace965210094ced794d84f490d5d9bccd8b591aeb7d3290cbe4928774abde6f96568e75b975f190ee2fc7e60eda6e66b6ad9176ba7e6cd9da60637472e80ed7b0bd16bb9b83eecc166cbc9e83bcd673735663733b647defbd9db9d9fc552c5f7660c310aa4342d61c5df4b2faaffe7b3ae4a23dbbfdbcb72dea960dc36547b432109a43f2c3f75edd6aac313624f94e982c3b57442291e8413964abafbe66e1ecd75efb1f7a50a77f6b2a710cc521dd64b6c5c9ce1bdbd81a1cb25dbb775784b355ebdf2467d63e84542099657d276bd76debfcc55220ad6db7eba4df7cc5f6de1bf256f6da5d2b2ee8868ccc46eb9cba7faf0d39fb5ada1d5983bc5ad39e3291b121dfb357235ded5b63cddc3f845020ffcec9d179a4af57bb8e5a43d6bb18b239793ada6bda1348569d83f5bac7ebeffe3281bcbe165bb5ddf667ac17c999d3844a209fd64969b76a2d65ec569233bb40480d0923744bd9393ba7d33a92f36268426948cbfa6fac8b3df85a6b8ce4cc6d0aa121a165b339cec8aec6f84e22817cf82c742d46682b9daf929c5da34267485a9db3733ed75b269319f27e2f5e3fe9aaf7f94292332c43be5df13d5c3f5d74349221637c5e0d1ffb74ecd62333865cb5694368a1658cf637d4eb2124867ce776de3be95adc18eb3fa14c24e730a46b4ea98df1ff31da33356d974c3da9d9b8f1293402e92c33bf66dbfd606c4d72fe319dae162d221164c64e8390086aede61a56b615c2ea24e727d56945241a5921a1a6162b5dd29c4c3fffe36f8c5008e4776d585fdbdb5a6ceb2130e68d74b16db71677bd24671848e80bc6d6f3c8d873e71c3386919fdf5aad4f4be15bec47080412c2779fc3f8e6d7f7d73e192d24d4d442424d926c68843e209b23ac3def74beea5b4672c66f4d3c0d86bc9090f273ebbd6bbdde559d29e5984aa80bb99e31b668afe75b2f37c9d97d425cc8492debc720474ad74348f2c79405ed88448bf117a12d166ce65a83ad9b376e7ede1c8dcfddbae6bdad99919c9f6b2d22d14e182eec5a48dbcf3687f3b1572f7c8ce4ec5a445676acec68d9b1b203a6f465eaac221205ce9d5be639618dcf0bd95fdf5d6b5eecdd055f1792b9dae8c7e65ce37efeb89070ce6add8c90b98dadbd2d64dfc5f4676cfddfac3d2d64f47e46e3832dce8eec794072630f32eb5e570b69bf2c248b6f42672116b27e63f599adfc96aeee80740b7efddbcbd16ef40a495b7473dec9ec8deed80a39db31f7b42e76f87abd2a24d3c9daf209db3147a990ab5ffdb61febb23e39205f657e8dfaaa6e2e3885bcd7dd7a1d7cf3697d7703322e4bfb565a215b5e2f858490da5a3b32bcbc6c14d22d3b59b594afb317a190acbac7755eb70c277c423a5c94b1d8d49bc3659d9034ae66913606dbf99b9015aecb94b553f65a2b13d2bdf7d04deb77c26ae912b2b27fcbcec65cfb7f0dc8cb91f14fef66cfee2921dde5d656fbf9cfff5c12b251fb9a3fec4bdf1f09c97aaeb6d6ec65e9736740d2baacc3fee7fa6f3d423acaf83564f8da3155235fadf7c2fad74d5a1f3b23a4adf49fb51a79c53a8b90cc77c287ff666c2b1221ed47589dc77aed5d0f0043c8d8bf2e85fdfc6c743707b2adc9d8d51bdb198d9f48fab8bde5a6fb661f7a22db7c9475ec7b977b8703d94fff767df43b91cfba52be6df60d6463d7e8b22ef6fbd52a2792dd79f73b4a1b645c379116d21a9f35e7dc7da49a48782b37a57edfac8ed14c64b511b6635adbd9fb89899cf39b2ff77ded743e2f9176b28bac17ab8b39461bb06ff1d115abc71a48ba6e5dfeec2f5eaf424ba45b94d95c0d328b7ebd12f914fa3facb0726b764a247dc8ec62d3d917bd8e06b2db5d7ce75a6deba69b818cfd3e59eb674d0672b95bcdcfb0bd2fcada2492fb277b4e218d907e3749e4bb91b6fb775d8b8174733663f15d868fc56e91c8c51cdad6d046f6133e24f2ba85ed1d6fb48cad7f4442bf97be47b68bbeb78e48e7737acf8eacb99fb611791933fbb87e652e3acb88fcc5b72b5dcf23b4ab2e225d9c93de1be3a25f27858164668b5636ebe3579b2a226f631dd774adc6ca982622d9640fdbad451191ef685dedcd1999a79d87c8d8707274773b5a56a721d256cae8eacb7cba65f305f2a74346dbb4f12da7d00592ebeae8d17a845c272c44429fd4bd3986b7f27a8448d76e3debbe9e5b7c8e0d22f9719c75715cec9b734c10f95c5d3fdbe262ae56c65a201bf3efea5e6d7c59642c10c933cecb9af5f2b9663340a44746678cef6b84f499b140da399d9befc2beff20b31548365b8bedcdfbdc7477b13fe4edc80fdeb822fbfcc5fc90712ee7cc5cfb9096fa6a6feba5d3b13f1f324618dbd2e5d199a3dd432e379b85ff4dfdfbea211f2f7ef674717c6df39095ce77ade95a6e5a5af1900e2e766e296cdeda5d23b941af1f2bac7effef900dd7ebf55e5dde9ad921ff3a8d2b4ea675486bd92d67eb930ef998bb7523edd9fcdd3887bcfd6cfbb94539a4338bb6b2381b9b5f611cb21d9bfedde07cab358743fa6b97d972b4616cefa940d60519d7175b651da94b81f40869b58cf95f7b5d7b435e661f5367cc5a776b6ec8052f9b75ce47bb0d492153d6d6fd6b6e2d6b36a4d7c77d1ffbb7f14dd62890152e7bbfc1da6674b67b0d096becebdc3336a6b4fb04d2bd7ff3397b6d02d9d7c6c5e87a5ff4599740ae0bdfcd69e363cdb9d590feb359bdd1597b21e54e43dac5b45b6df0df7373351ad23dc2f5d6f2db34aed5249077b1dab76764f5bef867c84a57a3b05e169ff3b766c868696cd1b967d14eb7654838d975b5aefa6e5bcc9221239c75b9afb4d9ea6e1d43be4b698bb6a36d7dbd8a21bfe75df031abee4648c390b1dd360a1b56d8f1e70824fd5a3b52be2dfa8b510472de5be7cf49dd3daf180219177de61c73eefb168221ab6b6fd97deefeb706bf909519def91cce7e7a1d04b2bada10fa830bb67bfe0149dddfc547d96347e75ec405fb5d756c3dee427ab5ebbde6dfd865e8980b199bddebff2c755c6fe32d648393d97eb59716d2b1e9b37ddefb75b2c61e90b6dda6fce06b8bbec7380bd9959f656e3dff5eab190bc96ec1f5e2631f7fbec51d90cccf16747c5d8dcfff0a39b99b7b9317fbfbd85b2117737ca94367fda8ad55c8db8bbd5b917d85ee552a64afcabe57ec07ed37ca01491f9dac1f52e83ce19c422edbefeaba90ceb93a6e40deeb6ea533ae288584fdb0427769377c7f5148f7d57acfd95ca51ea190f16ff43927bcf11f734fc8bfd7ba6ee89c8dce3227243bbdcbdd5a57fd689b900cd7a390b1beac276442be3ba797c2f91fd97b09f9ded6376c66eacf58039252675bbfa36f7d9d6b75a084fc782b3768e79b1d2421fbf6fdc7bc359c6d61778084bc70f964f1c5afaebae548cecf3bc880bcec2ad31bdb5376ca604b0501757084643442ba68adebbfbe918f77690bea1464a50335f2d2ff7fddb52e58e90d8a1d18f1bcd56f8b32b8deff4f1d14c17a357317dd8bd01bb7765fbf16756ed9f95f5b07447430846c8dbafaaaaf4bf93de39d3059feaf48644b9f42fd1991084a0ea465b65ed92b3be75e4733df76c264d9f1993d3fa6521a1f93977f2cb03f91ab5117ddf43bd7bc75b127f2c677d339bb56ffaf7e3890ebd963b1e38b7efd2977c21c8b8d41c73136d6ae21734fafad95b6ed8f8dc17a03491df5daaf3257a9b3b7a070229f6b535abff2b3774edf44da785b9b3c576d76d9a7503491d142f7932d6857f409b91b4a26b2cdd99c6deb5c64d8dc30918fd646db64b345ebb6b14be4c3d96d4d7637dd3f08c50611b6e6c8227ceef1b9d7ba9923a3eeedde7f5b0d0c283590f0bdfb6e8d7d6f7daf39144b64832cb6e63a67abb1457787528984d04158d964dc5dd7ab5028918ba75b9063ed3757b5100a0de47cc7beedb374397fcea1cc403e07f9e76cfa9831760f6180220349d7b4cd9c85cf3566cb27918f2ddaa2ad4c191449daabce2b83cd20e3113f3fa0c4403218eb6b0f617bd15e5e55a04422db8b0d2de477e78a0e211448e4bfeec99cb1ab9076838c3d2257fbcb608b0d2ec7aebd08c5110967d357dd6c933265af36229ff562db6c1933227b7a7d95ad5adbbbee6f11f9bcb669ed9cf72b6c74c240bed868b58ee7f4f690ad2ba02822d7a3efd67bad39e36e522452024a22b2c5761dad77bac7ccaa7d0d051119fbd55ae7aa94c28ecc0e91f7794d4a699b74d9cbd11069b9b675ef7adae62c7b2f90d341b79ee56eae7045e7027963bbb69c99eb59ed6a85c85ff4e98391add7d9b4adc6041442e44f372ffbb6ee16f37d129441e475e72664b7d736cb8ced84c90279c68c4e500469911d3a6bad1d63e82bf263f0d1fb5ea32dd6b9d616505a201b9d75568f3e2383d106221febb9e2bff6262092eb7b46bd5d5821eb1959d08bb1f75e6b10b6e5202fd8b032669b8b364259816414be673b46c76f417bff907f61f77decfa852dceeb879c3e9f85ac3a7ba7a3f1f62179f165c8fc391fd2c5cabe324a6bb7bad8dd43cef5cee07594e363ccbd1ed2b15bacef57c8b0dbcd43c2fa91d68f94f97bfe78c8cad35d3f5d3fe1b3b646faaaed41f81ee3efdb77c8be91b17364e88df2b276c809dff46fe696daaeaf0eb95eabd451566ff7b2acd2219d8d8f56e8ced85c11d239e46d8eae5addc565fbfd9443bed8ec4f7d5587f7bdc721237dead8e207e7df7be1900bd65af9ce37efad6c5520a1ed9fecaa6d5f94a6405a7863b38ca7d34839be21e1bbd3312fdb6f3dbae7869c8cbad6ae1b56a7cfb6211bc3e7acd2faec74381d1bd299d77bb3b431579d6d2890cdba692bb70557b5ceae2139b6bbb1295bebdfe30924a36eb97767d7aeb4ba09e4622ddedadad5c6fabe12c8c60edd8c70354bef33a686fc16a7f7bbae1ff56e9d867c74c5d6ee37e6757fa22157ab2fd649ed7bab9f3109e4f3e71e72bb0fe983bc781806a09cb1208373aecaf15e33a47b1a699d1ce79deecd5b8684f6f92f7fdff7ecf32743c6ffdadecc6a6cb7d88f21ababf745f7ce5beb5f2f865c94dd647abb61b48bda30e4fb177bf5758bdf3166472069b7c75cc34ad9dfb2550412b667f7ad9eee165f5a43206bb58f9f2e38fbfb69054352fa96593b6b8cdf93eb17d2b9d99e6b7472b3ae3e0a02195fb30fe9fdf7ab35a31f9077c1da5cadce1cb3ddd40be9f72d8fef5948d9ae45bb90acb545b919feedae7572215db5ecffc147d7b3d7c12da4ad2d467795597db70b6a211d2fe8cdfeba07e4531a19be0bebad6f5dcf4256776ff5cb1c7bd616752c645d8e2d579f7dcc3a485d07a437ebfc2ec3d6de65d35d2127bbfb58858c759dcf392b248c6bc1a6b5527ad96c57856c6d19bae9eea990ffeefe31b4d1c5c58f03d2b9876d6d57e8fc57b72924736f4168db69ab916e40ced9fab947597dbea014f27683f7ce6f2cbaca8e4521df47bf0cefe445db2d1492a185cc2e74ace9e3f984b4ec97a37ee16c7759e884ec5ad76366eb1a73e7dd84b4cc42fbae5186d3dd3321637d96bec6faf563952e284b486f2ef2630be7ac91db85a201e96237e7fdefe6f5f7108a1292d568b952477db9b78ea12421ed64af75ce77d74501050949bfd76597d5e5aadb08452291088e18f5406952ce41c9807c35babfc7d4bbf9be1ea039623c634622284748bbdc7caef9f19a934de7739d0c50d4487bbf321b593beaaa5b91e44cc6e4c3a018217bb9f7f9f52d77ff6b24395b3771e102a5088731c2e7dd5aaf0517ec5ef3ef74eae633467db9932163e20264e21189c8987cd829050485080957bd3146179ddb6a7da10c21d9fe8bced0c557dffc98031997ab8fe7ba90a3ab2c7e222d37f3cb18bdd0b1f53c71ed3974af31c7188cecac396577f3b176b13a66170ee474af51e68eecc50b9b76225b3bb8a07db4a36defba1bc8d5b4c2c5de70b2f68e1359d7abb4f162b5d959176316389bc8d87cb6a5abd74b81a389bcb43d667aff358c777626b255c8ee5a7fb5732eae241c4ca4fb5e8dbb2d8494bbb511ce25f261f48eb1bb36635d2d29b60da4d3552965f82664b15626394354f3eb1a745b8c3db7fc39e8dd6eb5afaed4d2b79032660e75329d4e52149d25d23e77e7a2a530d6ea7a5622a9edb5dcf4677a9db74789b42d56562fa4713575978944ad011c1a487fcb962375d6ae9bf43d6a92bc88443ee2343833908bdd5bdbb9c52e64b63e19c8d61c75134e5e6cf55b168926918b299b6dfef3d96adb187124916e1b9cd6d10ad76d1f6320ebadee26df3b9b37f85824725e3abfe9fd7eec35562191ecb2e911fe7593369e0fe71169dfcddb16d37f6f0c9d23929d7fbae7cefd643eab4854513d3f225145f5fcb4c71a91d65e6bdd820d2b33c8d69e6650169fc988fcf777abb148197d9f93e47c328d524fa6315c44d65f9739643f179b917b4a3da3d1e342a50a0d5cb2bcd1631848ff7899b3df356d74edf18c19f980a3886cb5f9b3ef5de67c75bf8093885ceeb67d5d97b10997bd88c8c5ac9bf0bddecab7d67888b4ac5f9d96b585dc973243e4bfcada9b75b58d31421b5f202f6df3ad3961e47a97339108059f0ba4cfe7fcaea713be8e0b7200a710d9f69f7bef3dfa33a613357dac442a700891eebdd8dc3f7d5ded5d8f4a33bd884422d188211b44327ce7d7d639eff5eb82c8ff3a636c9669a58f326f81bc1d2d8434b67f0ad7728148baa09d0cbfbdd5fed580c8d90f3abd5d69e5e65e5920effac6eedde4fbec1b5d8163c79adf72e8edd83564ac7f3ac708197bd7d5b23f24a4dfecb3f6b3e97e4d1c3f24f47f8b323779c566f6e2f421d9f93e5bdd7dedf5eac7e143fe9df0fafb455b65f321ce1e92fdb9d6b646d698a371c6114f81a387a43fe95cceb8fd6a5b2bc9f95100270fc91a9babf262dcccd60c9461a8e48d6b3579288ea2188a610084415a9f150090001314003030201e8e4683f180a82adb071400043f6c6892382c2a1308838140200c05611003411003000c40310cc42018848710a503849ba820a8843e9142f02d1d1faecef7a293fd96a224c17842f889144598132a873a232ff207f1282968704c281f2a8c54c9afc34fa368c26c5041d4915cc40bc42ba4663036e8227a1012858a5ff75e2bceed089f4e4378f0ba681e4a8fe4e3cbe1dd617dad261bc82090e7cc33e9857cfd72c95dc3be794fcb1cb5414aeb0431797e2d09fd6bedf3287a10df5aae74d7dfc39fa3d03186d81c23900603cf25ebc2797d7a395f552e724b974a530f941f5547b152544a81523209caddea0255cc7ddd350da288729ec57a87f98b5c472a428bfa59e822bab4074cc72eaa1bbd40745b5c70fa7c9738581db46e9d17936666faac774a682f5d4f9150d3caba65c9442473fe733b9a55929e5459a6385f9d7e9d354fa627f1a9e54c77fe3dfd390b9d0c4f8aa7e693e9b0f86bfe060a2927a542d4d5a0a315132918758da824b817440fe523cbf1eef0f7a873c868824e5fa843384e61134bf6dde5d7aa8311ca145eca30e59fa50d74c0cf835cf8aa99b8bd4894ae07bdaf0ae6aa401e2c101e92e64bbf7950285884b5d3c573e6858495b4e4771055e521a43ff378964bc8237a807ac77e13f09c5f3e3d5fd7bef7f3ce56781aec55a4b8c38f0907aa9f1a6fc6bed883dbd97399c9614086c930ae4eab39a242d980a5b7fc3b841a331639fc7eee31fb37722984ca2865c4ce80d4c2d4870f908bc8086eb78d77f042aad20f093ddcb6716a6f77060c18a5448a60b7bafaf72ac767e6c9ea556978840d3a64534a457f5e56bf37bb412203fbce7a68b612f3089340465a66f810878aede8649dc6d3e4f96eee56fe38c066e24069e0e61b285dc272238d9d1c6096c8fc7ce0a3612efb7eade431a53b35ef29687ec958cc111d4825840f12cad63b399d1461e5fd42e96f68c2c5e11edab4c52602d0433832807108df25df10c56196efdf9c1914a37952940e6ddcb46d7c01cfb331b160c7789886bc65580dff94734c087341d83675b944f973e33d0eff2e35258ebc838d437c231d79c5e4e9aab65a82eedb4a94d34c3abd768e3477a70f5ce1714499b64ac6e9eed1104b5e7a841860935d88b37c9cf05611419f09b65b3808ec03590443a639f954215fdcf4e175df9989b2ac7da94f8f227498204a2bef731894003444dd42d8e7454af314ee0eb6d0ce885d2df7db68ad241fb5e0c67a13da0704690cfa6b316906dd5562bae2e52285f5c8fe4db7542707ba7f362ac146b563118d5774a3179bf1288a1a02ccf7949de7d98190fcb73aab8d10dd41e81b7d1bb350063da2cece285dd78b261c7d42c3293bad48423312e1be99f13c0c5666115e9586006b624c4d0e0335f73b2abbac3909f6d43227de9ccae6e436a7d39c58e624cdc93127c59c8a39c1cce96c4e4873829d53684e2c73a2e6849813cd9cd6e6343727ba3951734acc89674ed3e4f4180133e2329befe50a7c692539ee10b2e0df828c8072196d9b6c4425c523c8084d224b3c107e8932c140d0083d2295f8121e8862824d4841f42efa6a46d78457a24ab350444a8d308720fe0f6553d4b89d76658a20a681242b9e1e9e8f2a8345218529ad9c3f2dc7093463932a2332242d2094fbf591fa3ef738aabd0ac56237a9289dea955633732d7982633964f39ee1fba044a0b1770f801582574754b7b152277ae2bb8e012d2993c2c6abac59c96b711511b6cc584d1c646019c0ef911eb6dd6953ac87f12a93fe993665bb803962ca1f65976d4ee07775f74709d2404991fc844d17db065e96eec53d7625b8fe92d3c08f62f2d81f52436b92b6d036ae4926ef48da1cf23238ea73dddc4ecc3e40493c3b51370ec19f1655aaa543f6e7339267768824027e44b739d924ae502e4852e4d805bca39073e62c0666a8b2cc957090a285ab80deee03c829758984f979cd0dc8d5b045ea5efb28fc58d57c5ca290468b5dad84fe81e4179785b73da256b979f0049c1e82e1b4ed1687c656e3dcb22b38a5f9fe55d32b703f19228ad23c11f48862e2c50410c64823a6a62d5edac79bad3848d45d3569e259aea26e8c46e31304fd9d1c9251354ebd2a711c5cb39fb95edf6c1e76b45c1d19185202eec6f5f671250988deb88d8204d57139447148d1b9a13ee2d0b8ef4637e2507661c5bfd326d1663d1c16605225bf1e97c57dc10015b03e9a44b71e01d45ac3ae6cde62df8f532e6a7f9c21b9ea54e52a4c74371dd9db4de017a230faa3624511fb74ac100e95fd46e13689af008a6aadde097c07646f1ab2e95e1c3018da2977513e78641f18ed020e2f0f6439d00356bd09226db125dbbda11f94c05a0813a69286a6b541fd89471996d0e207051342558d36a7b01c38590b5aff626f9a2b1b4799d18771b066cc21fa10316cb0269058e84275b46013f94bf814ee18624e9458e94aa9fc9ce8dc290e3153a0238e6c873a94f73712abea1a14dc8f3f00f8a63386ed962fb9a02de4949f77ac39ea3487e3d6816ff7590d4ea9891849935e24d9fe33ba8295736422159b3e405070abad3d460acf98152e9e8a3458137002e8b4a461611128e44e896b6794c0014f8b0b2969e9d33a464246b12d2b1e4a422f3884b92a626d09ea52546c816b1e0d4a5488e842266510ecb56057c51611d50de278d79238c3f4e71e6ef8391d941df90f8d804c2db5be13b5ef4db50600c014b0c6335294e10f0a1580b543548680a2de6c6b8be176400730e0c069b2d8b710f844a3226cad140207a36c7434090320a38bb11278cfd653b7269b58a092d8226060a719dc7a61d48302cb1d68bbaea2141ff40ea4059e5cc3f49ef4ed06ea5a22cbad2a66b530ef1223aead0c96c63d748299e7114bc9343187e35156d5e96bfc4fa9945dab1201f1670b338d77d849a6fd1271a4b7a6ec521107a9714d1358396a78217ab33af1ed8d98946d455111ebb2372e579518236e63d56f9719c4d9faa13ffe33680b05411a84c1da67cc22d69b05371ece5d173db5c20bba40752929acf89034bb092237505c98c4a759b8516bb83fc8259904d58f635b858f360cae4b4c08285edddd4450e6b8240676114ae39ba7e1c22cad1f147da277fec1201e6861afc105cbcaa6f782c4f14e763043ad8a8d4db455031e1dc154b76467ca5e172425351bb6fe8226d6bb4f961712cb213031d20cdd800ad6e3e60c69194994e85b0295d0e650c443ac5496c5fb9047c16da59df7ceca65511bab3c9604d873820fbbadc55f48c617970c64d17a73aee2a10ad262dce32b0ac582d0b282a5191a2efa396c648d79b9784c82554d22e4593a0d9d1eccee1ecda989a092797d4b14eff4e890ff04e93117e71b650f8844fc4629423098f5f298302f6f1d040f242a377ef08b2862337a6d66d5947bfa008d47988b7021fc59e04b1915fd730fccb5867ae2e1592241ecb3275b18e814b724d5b122052293e6d9194d7a0b7cbc68b09bdf5b3ab63e1f0abb4cefa7fa35444feb1b345c62593920503c182d588b9ac84adccb301fcd1a2e25655786365162fe37259c3285a307c29f61da96341631bd5913d17bef8c71f4ffbc21d054672e7f778084c752322d9c68d50e030af414850cd6e63f00802f4a516dc9201109fdc274201dfe3908254ccbc3045a67f9ff9637285490b1f0dde61dd4c268fc115d0b3d27a9162d4bdd5c5d2420f5b3a4e0825c3de1c09b0dcede3e18ee807a619abb65959d1f876a67506aa99fc3caf67440808e0518d4b24e004629206ad20093700facf40eb0d8214bc08a15a279d4138e0b587c8b65e24fccec4f0938c8e5b5c49bf1d1e0a1c114b0bb39a09fcf7ab361af2ada15ca289439aaad565f3d490d96f8d8411decbadca7393de628581e4014e12202ae4d0ad2a49c68eea7fbc5717e96717b1e55dff06922c23313721e53b4252e0eaf2a26d3c10a039a2b71b80d932dc1fe72f7b57af6fbc3c9a4872c2f3002a5561622c569be5b10d0fcce82a286c85fa8d405ad4d14f520ba962419ca2ff681e8dbe7e08792fb614dfd7ad4f634aedbc88409792186599786da782b9a64ea406a09ec9f2e5146c4b14933475a4cd5252796aef2439fc0751fcf620332278826db00d913e6750f7c81f9b5a01fc7fb0ab43ec36d1536b31b3b36ec82a3daa17026debbde7878268e0d8a5f8a6203a72fe803caa69a120fef77a5cf39ad698d3601a153bddd75b7ae530291ff1f55421d421a2615fb7da1de17ea52a5cca578d5952ca0cb6c127aca39a5ed36b65ad97ba46412d4d0d92861ff1deac62cec66bbaf9e6ce4d5c4265570905db4ec21cd2860b571313d564d395511867bb9ad88620ae4541c74717a015c464a51815ae18fd7440007f7955c6dc1c6429866060272086c8e75080d1367983934a2beb2080703580d1010e7d12840380c72d9289cd13692893ca790130d7608efe7fcc254d75bdacb6d569dc31b570430a96d45c21ed81b83c7d111d64532450085ada6e8ee610c7f611e59e8654a12376bbb3c1360bd9094d588b4180c0f6ea27ab3752c6153ee1dd536f4ba5e49db4f061aee8df379d25fd551ee1f9f9299b4230ea61bcc181b113c349e72bed4e316528182850bce220ed4312b8477f74257ae9ae7edd2e7ba919d0ec3b459a34f727204abc56cbb4b837460f6f72b1c082f7b209fde8c2adf6c6aa0d666df5660c6c205503c15b13e904c355adc3df40851daa228816a7c213386d641da61403a7fc55840389bb2a8274034028bd1a8064af616d5578e6f1c22cc6fc8fdfe0a64b867c0228a53e643d65d217490cf4194806b8220ad2cc27ff9d64bff3c439bdf57631a5dddaf5f05d903f504867c1744f7893c45d2ec29ee67eef1878c66867a4026d98b32f912dcdfdf222ae4fcbb06024b0ecb73260d4e9cfec097cd900ed999dac287c7df72d887aa56dfcb5ea4d575828f97b82a68cb2bd86a9f0d09e77e63a1afd43fef037016575fe91417c157b8cf38802585d031b29310d889ac7a18c5dfdeb702928e9e3a30883b645c22df404c1aafe87a498357347b45db2b3abca2eb15fd5ed1e2155dafe8f08aa657f47b458b5774bda2c12b7abda28d57a229763cfa4227e59caa1478989f87d3cd07150eb95230055c831e1496fdcd9a9812538c69c4427e04b3cea88ed71dce7df5de149e5ecb8ff324baf30e5b287a87a25728fa42d103143d43d11b8a3ea0e80b45ff50f402455f28fa80a22714fd43d10b147da1b0079482592622bff352d185927ea868818a2e54744045132afaa1a2052aba50d10015bd50d1868a06a8e841451f54b44245172ad100053c3a430a8a54107df72e55a18fc9f968c09204a9dd36e245c8598a400fe88f51849dc6b4a9bc4802ff29b22097965189e4d8edd317351a8d33c6f3d08f691d4f2bdd8fca5f8fa09c1a69d08185f8562dac8635e9c7e8fa4557dfff6409ba103b90fb371cae86df7fb10d0c193d57cc6fd4b40fc1db0aca12f48103e78fc89ddee0c32c8cd3d7e7dc21dc90d70eb67b9838b46ebcb97b6ebab2df755fb5b427e60504b133d749dd25050accc8d1338cd01280364b7440b04c3c9a249106c2e90741a37dd83bea7e1ecada4349aba6b0f62210539980285f2363c531939ad4fdd823ddead3b01e4d0f3c2148fe5c92d29b212be5320e32f81c5292e8244d9713ab8d952de384fcdf2ef4707f611bce9834c7e53c31008f3fa7128c4cff91d08b22d6dbee59440523ad7d2d5108015be83657e11dec915423280291c77133361ff90b841b4c2c3b57497f2ac78099235b32191f437ba1ba855c4a2f5e6afaff810a87693cef5f65601bd6171b29fdde5a9bd1d4deb214af27220f5b172cbeec03904ff872198c0d0b8937bf19a83ea95b55135a8eac46d5182c9cd7f140acda2ca0b9016e901e4411f123817ad4a61ce320cec44a1bb6d514506bc38558265216767be86c353105b63abce86240ea50bcc850226cf60d20edce62c90714931330f7322f1e37ad2d73ce276198a1196db9305914caa0db56188c4120dcedfd64088f939b1f8f46019bc746f71e332d6f316d5a125378921e9b12d27b7c55f8279d139c4a8fbd451f91c247b7b8d63c29e2cc4dd9ce4f42840b4146d77a9ad18a7919572bc291479d4551aa22e250210cfa58afb3337aacae158da7400c7436deb1f4fbe90ad2a7fb06fba32b0cedcd61ddf89cba81c1dc2c1d18b0caedee225fe4c52a0238b666bee25f54d0ffe06523930d5050481517e45b34b5de2e01a6680a442eb2ac87bf08faad1cfa49fa7f1e364c19e1df0ac7a7dad1ad028341d05b819feeeca179a271a9534c1dd60e493c2b32eacec2eb1ba2b674d45e839c7b5440ffd93d7ff09127548f8e89c9d6924608154f04f7b39a23d895407ca2cd5467b78b0fc4f9d22ea032479db036ce3a0560ccabbbd5fbaf18f30d2e0f9bf02ae27536b5f7e5a3a29f9c3c96bfcfdb620d3fb6a4d918f678f97943044d1e198163a55e7e2812895561f5bbb52ca32e8a7b5f08d509b5cbe00dfa0ca5055b3a706534075a8e11b24f642ecf3a3a19c153bad983ce0a1d5115d7c83a003deb4b907eb299682ec54800532c24eaa64fb1213bcc132b72bfac656969be0f9a1143f6c154422851cd3bc65e9f8038658675906c4ad08103f6c32d13864091521643b9213142496bb01f9fd6948bfc8039b44dee4d9217b967d64fc499c520382b4d5a83c778bf09f92e092e72815d7f9d6d1bc46714e8b3b1524bdd5d973aaf3ccbd139d26057ccc95dc8a9bd0aedc3c5b100755bee46be1c1be1a215df9383b25d2004280b53033d7fe737bd67365f4d80c9e858a45061527704035605972e739770763cc0dfb0ad9e049457c23aa8b21ddd90b3ab33d1c0ac5b0538dfdfa22f016e38b493f48bc881f74faef7a080953439284960cbae838327763b15cfa56118356be80a37af10d6bba9ea4b0572ca7aebe665e19ca0f6a49b19cb4a117d03621c3df23b30e1030b4cc7a7f3bd06a92c58a0bb0fe1108ff520221686d4cd63ab3084d1f1eb1448f4ea39a1039322c3f9fb78409c8e9064aeab2c7be400ecfc549d4a1b3327f2ca50bb6acc128f976d6609c00284c43ef7f3445083be51f3a3bfaa6e334fbd3e75fd41fd03c15303f94b45151c5954d7d672d0cd27ce41a7841034290ffc04b340abc712f239719b406288eb9b20f0cf4eec5852402c9f221f38e8d5113e8fb98783ee5e08a1ba003393087147087f7224c7c7de0386e0105a899e4627d6d92419e62bd948810e40d1792965138368ec65c0f8cd3dc153d09fd16dc317b1aba610023e91a9698dcb9843e2f901138074b29dae95c21cb2ab84bea2d5688eaaebe293154c5bd265a01c200d43da295a900e5713020bfeb52629833cafcd783c75aed5459c0588ba169c4a615a9ff7997df8b16a90acbcdf9885661368043f566260ab4085128352efc0f49e27ee698a810acbda76508e89b57d01a656935f5732e1afd801ed0d927b3a98388d7cbc2eb0d9ef9a656b99fc6de16554c64497b1b36b3431935f120a476cdda18908c2ac081b35dd39328989be6349c1304364626b8e115c3dd11eccf67633517f80d25788c469c76ac2f63199bc277a62dfa6b7d24bf6923f8179bdd64f214ffdd74920f0f9b7830a5c433f70f3fb6a76ec506bbbc9e6e75e9cb1f1dd1e88583ecfe1ef1c763c3a1e72e9baf02610da548d1ad1503587a6db4fb843846a47615cd76a12f8289ceff2435c1456764b5e8df36c937453e0a9c32ead898176235f797b00767fe2970fdfea8211fe6a9b33d551fa2d6d04196855181d6d102a1fb0b7c8b86edeb215459dc03569b64cfae2b7c6c7394b62d0b4ddf61d01412d744e0d1c280699cc70d96bbe80e371748c2a93651e18cf4c99e160a88cfabbd823f9e912dd36fd89bf295fba47bcdb9d7ebf8fc245e2397df7da64f95ecb466aecd67d1a3815d7cc1877f22e491a16052c6cce8d997a68935efb6985b13ab0ddade94e39e7864d35ceaae6a5d259a1973fc64050375e110ca86fb9e3dea3ea25544e9347f5683342d4c9638f11b15b1f89b90259233cc51870f850e85b1f07fd4d2d6113a1f5acfba2c25ee124be205a8a98bf26cd0ca440bfd122a3836e4b50a05e35fc42201f791390b28d3f251aef5fa814d32b601f0328d9e08e01fc518f0653ac3e7bb8f57c451f32e9773c551646366be2b562e0075d3d40ad994994c9dd8aec2ab0b49f34db394a8b7dabe74b6bc7f4a8edb5c554cca86698685771b45fd07f89d298158f73c7a0250051fc837334baacbcb5c6cdec84510cf50c41aa610310ca7513ecc44b8b67d4bca5750a826088b909ec601eaf92253cc5aff7abcd1706667c6b9611d4f0879c890a9a77661584939aa38e4ce1b405c697136da83382319b1d2dc9240b0087dc14048a2eaf66dd966020477945cd4874552b2b2ae0c8fc57dac81b312a7b0e70a4808664f4b13f520aec46e421cb8aeadf6c1625eff42ff1607722d9f79dee30e0f012c6a09a15752c418649f0a42b70aceff6ca71b041b5ca26212264cdf45bc80b1c28df5df81bef682f9af358d5732245529e1b529235d2b808fb497e0abfa2ffcd0550623dbd77af4df2a4a7926a7e0a7bac377a65e3c1d0f1737578d7d116b53158f22006aa5f0deb35119bd0b24bfe81aab3f848460cb4783b5c1b150498b88ac5e8eaaeaba57e9758296635fb66491c8311d8bcb23e5260524eabbd94d404b55279b1807e3d923827162932396b23abaf4d6f591b07b7e00de7bd1fa6bcd95397c531ccc0af0b460ff967f4024c202b024ec1f87841d74687a8c086967a159615070bdda386c6d9225cec3dc10977622a11ff8a3d2f8978e6458cb836293cf4f5a6bf13bd03de82c4f6317113a43f301cae807b50e6d22fa616aada0899cee27b08db7480cc6c37babca89a2c8856edf700d76f26497ae47ba19dd8540e25c63ae088419d1af06c95738e91bab66e35a693e4c6db0734a1f46958b089885547ce55da335acb7f3f7e40a31ddc4a5ec2c56535fa86ee7c16bbc5967149ac5233e5fc4575086967505f1e62dfb718b4305972e11c9252b45b42a7a76ad7c54174751e7de3d8e30dac82aa8295e791700c4b9c0a06aac13258c04783b7286286649b38f60c0c2559122fec2a426e0d52ad3d198710757d4bc1eb8b926830ca96f5e51915f1928bcc959eae949a312d33833ea16ac0d0804efcfa433f01756f1c56199d1193acba24a8c4a9f3373795a034d1b1786cbf6409618153da70422b5caf013dcec5dcb8c669ec8e7ae9649577a32e46d168ce5dd7f01e51ec81feae5bd6d5711a46c1c99f97fff4d2d5333c270f8405ea18cca47f246606caefd9e0521282163683382e2cf605f170bfcba8338715309cf81d894ddfad30eaf202ff9bacd81e9567e5de053266a4398b928d9255e0660c510ac204b45f3a4903468eae9950e0475e6226a4ffed717175f7601ab426ad9f29ec5293fbac41e0c86320fcb459b28e70710bf0200976b4aefed02d50c07cb1f7d91bd9f8da39a5084cec790afaa02d35833753549d528684c3b2201c534ec0c2025b2446393273e37465a4bbfd0f68183de2c7f8325eacd36ed6683f1761d6c08a98f0e83ca58a02d62dcc15e302581b73915ce5031e6775da2857a5f0fba4728dd03d1061fabb49c591b45222105ffc66e63da523cc320f9b8574b8f5dcdc035f5c40605a03b0564f14123fb2c500611a86b378c5cf0aa26a690073b768109d510721f1751c8f46658343fbd9e4f1ae4fe84e6bb783439a0af04b091eec3787d7889c3e823f0b69a42c0d125e1b978ab3fadd69cbce5367ce630619edd1f72727cd93cdb1b142bb3b08435eb091e132f00007ebe28a71275b6fc667a0ba31fed0861c6ca6eac6bbc2b4f92b3233b00a84a332b241fa579d3d8386e02671444c67394dc8ccd220562204c959086525ff27ad84c3133e15ab4378acdf4bdb495e4e11398a9ea360fd680ff7dc351c8219b7dd7df833550fbde59d9752fa4c1c84396a25775a3359b6d528c63c6dec96ead62567a261a7d1ad1d872b07144806a3d5b29159ce03c841bf2b1ec665df797e39944b3000559f0dcf84eff2ff65fb8056e20325d25fd69bc08409fb2d07d4d36b72949c030bc59286eda18eb74b60100d010d42712719dfcfafa99c5fa0cd8f06e14eeb5b5b45593956f74d8c4b42dfb58f6c2c214b6832f88a624a3daa9996f0cd37e3b04a96cb61a687c2c3002a711e30b58030b9334b0a124790b741a3ac54a44171b4e3384cc1f4920c6e7a110d6f67f11fd0d7f4f8098fab2a5c5598423d6f57abe54ac3181febb849138a8ababfe09f170af462815c5d199fb18d46d055227aff96ece7f1bc5004c673427adc0f977af9e074bda5ca153a9aa60145f54a7a81ba8947cd08280f4d1e3f2eb1ce8310912fb4821cf9af23c6b40545484661261340003d3b9f42095aa3a922a135f024f3e99ef718bcd729f5c30fef5cfd8b0b4791bb95f2f437319bc997a7845f7db63ad8357ac1c6ef1fd951f63f20be1740426fe0b96c619b37954c137c3453801b94739c7c05a25f363b703978e2fccf9ea0fdb342f33414cf01c6e3f66f8c2a90426cf80cad681c20963a09ce52b58e8544b3073a1223692c39c6b2f4b5a56342bd810a14b71ce04963a23b262018705d4316227c5425045fbfc190d315affdc687b8847857cd00a8ea50f7156b14a04f486329805107a0a628e104977021d03fbd2b48ec8011d9163efa455afde6bdcc4b7a9cf678af4eda653cd291784f98f64166578dc343085e6a2c301853eb07e69fa7a8c0a7e76156fc7c932a13717fb248f168dc4c59be48c374567cd7860146603ead5dbb5454a0c1b50c615c7b68ef37e4a0a6ef1c605e5dfc27f60b0b975a3bb600fd1d684de0922d3774c1c708c2a7bb104e161acdf4468e83a629f017e94a664278454ff2d628336db7a4ec1f7228a3634ad25a4239a7513ad75e9ad12c916d28cd6896c8369466344b641b4a339a25b20da519cd12d986743a8cfc4acc21c4568ed6e20ad72d9fd4f4fd0f249a9e0a4d33686f336842fe8a314e7de5b904841553d4828f15bc5f5278ed6bbcb8606674a206f7f646498fb7be1c8797d770fe6a2cd17f6301b20f650f14e5b03590c11ddfb32ec8f30cc7e83b9bf943bdf916937590a4266e4902ecf5c8969f8f884b148d5811727d52fca5a1f42c92f372a43ef3d1bfa06716d3a597c30e56d5c2645a4fd3d1bf82b2412247f573b078d625f665a83cd86f6210de2dd00de181cac35cbe4fa59ffccef53b9430189ab1d75d401a8e1b039585ab24c91fb9f3307d4ba16f62c5e0a654eed9b467dc0c79b6eff8f3a6f428523fcc08ad12d156dcdd6ddf51e2c1e7f6139ad1509abb4e181ca22bdef7f79a26d213cf333af2a38d1c96c72b8278ba9708698987aaa3d887170b1b43b344cf5005f3c64c82c8f220ea3a9be51614b687b50b810cb5b57e767c0eef5d21f45ed5cf8ea9fe64eab42fdd27b0f0eeb98baf867681db26dc4c60a05f371c1a812a20d97ea0015ee0f303607b7f8fb21584c3fe75f187ff174a5f01a2cda8c3185544373a13716f93f6eac90a1fcac6260c308b1e01371301bc6acc1752a15f01c38c009fff96fe3eadd4d6463d0d1250e320ad917ba821c1e4a193ef318b85f65a9813e4419a5ba221fde708736c571e7dfe3277fa83edfe92fd1416a00537d16492de278dcdc929edb55e1d7414ac68b833b989e799f0194cbc8bb87f528af3559c137f2351cd59f8efbe99740ab508be6243be5f7e6e964f6421cda6de3f244d1012f0540d5d798e291b90e960610f118a63a32bff1da09282b27d6fcbc37c41924e2765ee07eab9de4bcfde63220e79e1aeb3bedb9c5297d29df37033abbebf5ec0ab57c92dbdc7809b097d717c5063063de8b1433f840ec55e5364340e1dae49c7809deaf8a7f750436de65fb36d1b767c9e0263e43629e2af0337d9ff9230b462a81c3d8bf60b50f8d7597238065c7ab592746ae5be627582182cabf59115e21a89ca1acc10eedf8cb0c8cefab1ca645179a165627666a5efa301525b4fe67d5132a8daddd2c7938caee6ad844d686478bc194ba4934fe895d54099da3ae58dbd91378dc40ca44df743ef200b5507951063bfa74e724481472587e7e43788ec25247f9615a093edb7c13d46af30ca73c7cc9831117f5ceb63f7464221abcf4ee0c7b24840fc818f79fd9b9bc5701c76d71bfdda322e7365a6f8994e39f4ab447a480c401005be50ae6e67331ccd6aa1f3ada4d2a37b7d29c3e48bb615104f8214d887b4cc65886f194bf100ff8a3a6683c38c8f895b95f9039f716a4b879db59dff38905d7d80918d0168fd4a28d11590605c3322bf1f0ae3a73e5780805529d5ebe4a7064db1e3bf1ef7a88da1213fbea544d8da1cbf5dd068485a3ca8f24b6019a6887c0829e6caf4e4aed6c294546c0081f98eaa30177188fe14c90b57ac7e509d8b1ac33e737b56b6395adc3c3eadc4cab2e00358962e669ff3fb3bbb69fb9d77edb567d1b60acc55b07d7d1622c2779e8792619c21009f0731cfa3c62ebf705e067943cb6e021432805efe0ecfcaad9c0f4ad3342a73c230d4dce0335a78d44d4647ff1653aea38c5120404316a7e9276c8009b7c3281472541272264de6affc29178a34df210bebd377cd46e1c829b9da918b8c54cf2aaef61428e06d500a74dbb4ad9ba2a854030e2520942bc0ffa9b6cbe98dba4ae12ee5c51b58f70169d4420b10355ede9b6f083cf02d96c407e797669f120c9f8dfc5bde3bd86b3361645c327aba53fe520ef1b76b25137ee26022001a220c4f3e3e6099a19c7bf54533787f983cd0acfe03a173888a8b6bf9dfef0026769e245c31bcfcbc41c752912e1280fa2fa8510fff01ed8c5b45ac356d0c796a909a294e2e5783588c3409349d36123fe630b3d64e5cd31182452b7a4babd5ebe079d7903f03882cb3f4bf8f629fa177e794b011e1a02e9a1819fdfe876257f907494842023a15c14f0abbd48a4463e93df3e54a7c0f6b1b596d3845e258f03bd2236bde3ef938fb30fe0c95699fedf5c06f2456dacbb1e830b7c191747dbd2218d9dfe4d14f0756166177d707cf2e5b82394386a0d1f8dc0512977245427a5f9989f635719dcb73ebb1730fb0dd56f24d1447801f6338c57bc3ce0cb5ada3edafe495583832809001ba5b4b4e179cf3ac8d1ee11a1eb54c919fc85be2bdb05b2dea4feec4bca6465b7dc2747f2c5e99b170b84c21f2c58bdcdc0f4bfeb0d6c391372bbb7e154abe1cfe805df36a6cab922f6fd777e059218d073eb8495a970c45440adfeafed9129416fdd6228f0acc3f56c33ca612682c7a81352a8e88b2563bbb279c3f2c4a0620f5082a2df3c4f9a1857261448776651dee0ab065d331ba69ce3cf9fb287b6557c359cc4acc63784d2bdf3e90fd9afbb2385b7597952a0c859a08884a16cb3687befb83eb566166f4c48cc75d74cdb05db2e4e6f88fa048902983ae9ab6b0662b54ea809870c6dd62d461c673e49e445d2cfd8f845ada56b0c54f59ddc1b352e8ca04d9405d1bd49cda0dc454fc1d924ef20cd8ea7d351ec096b09d31c8838406017801208f2a7c7769831ac0ba604d3e384c256c72ccfc49db4ddb9638f3255c80c01ca7de979c70832ade98f3149bbb5e0e0501a321a1ff4952d05cb399397ff4d40b67f7caa6debef8ba067fcc0174baa45c11628af150bcda1502beba1998968a4aaf01c23cb4c01f70f110edaa753499904f5bce4f66cea2f3fd803693c39e94cc4ae3d3e21caac7c318cf254fdb146883ccbae6a8ddf2b7f6e5b2a3d2953dd252038359a46585f33cccf1e8ec75c1ccd5dae7e60aa5e6a2abfe2352bd5d71eae954bbc6eccf1b43bba5ae74914f6ca16e47ac927cb5f6796a6a59befe56cd4a341e174da932144115509f669460ed319e5539386a5f67b09f0e5c35d198d294917093a6dd73641f6b665445368f041ea990f93169cdd1f8335944a75f77079ef28865cc1637fe82adc34d3accc9f3f3ab5657f1b9daa7b76be7e1fa3c505b8b747e2dd0f1199f1b05b613e05d2ced6ddc0b1cded3ae731dafeb6b6d07df3fac23b63696bb433ccc98ea1fd14eb7555831f681904b59c3d06439b34f2135f74f10357bbcf2cdf9d925faef1f37cff338d34667760d10daf697fdf3d73ba5561d854a643a5fbe2377f73b92ecb5352c07fbfc203856b2bbe178578ef3c40ec2bdbfee7cb9a109c13559929ba8a80ea45762ad61154f2f8063a5dd28ce56dc1336746b2e98ab47609bf2cffec67c4cfe12e2968d74ef680707fd83f21d13ff51b5eef62ec9d9cf1439b35b4d791f60e95dfde370a0299e09d02933f91505ef07a14bee39d220e5110e1091e1f3aa8490b72c150ca7fa29710c3d4626d542989e689beae4684b643a645742f5100dcb6816c3543be85bb3d4a5e3463ea01e8979a285f3f6e586b30ef006cfe3cf5f0bf8a81c7743fd948610b37c904db1215afadc6041f9737fb330084770a57e6b9ecde38598f4c84e76cc0a25030e4ebd96f30bd50b6aab55acb53de1eca128b01df93723ae4130bed8f5e5b5453746462679a4d2cf098e2c492ea5253dc69cf36291a570a50e5a6143d3e9c2bbb2c737a73db275219593d7abf5ebc9ace85e832391e7e4bb1783c7e1b69a129f3e0daff54a2016ed54d2fe1a66c6babb4f6b77a39d096f0b126b49b49739f840da564be79284cec3643049d8044c0697864f43657059d83c2403998548c093d079980c26099b80c9e0d2f0d5e1b28655653175bb7b2a5515185bee3a0f9d82e560b3f0094c1236019143a6e133b00c64162203cb41e7a153b01c6c163e8149c2262072c8347c069681cc42646039e83c740a9683cdc2273049d804440e9986cfc0329059880c643b5c5ca2d4b2076e1a6fbba46df96c68b1f5e39a466b3754db881a2cbcfb890683c4a6a104834102c34082c120816120c16090c03090603048601848301824300c24180c121806120c06090c0309068304868104834102c34082c120816120c16090c030906030486070983a91d888764030f1bc717a683861d658e0387ca9311379c0493898b266cb2dc9742a72164ac480455fa50c98a3f17042381e63eb3f5174ea43e0fd9220bbbeeac095a407f20ce0f149083c1cbaba4f2d86db6367f48ff5500a9792f1b2608a01792071d3909d00bb65a826786040d00b694cec1448830d945fe732d7c9c95e4479817932c298b1a514ca4cee1c0c31ace6691ae4d04f50e0bb3ba1223bc71502463a6999f39761bdc67aa28e0241ce8f2d5eff36e20f70a43a6d4aa863ad5aca8221633dd5847159d44a31a2f53acd54a34cc3ff89d5c36d1772d499cdf3478544c9cffbdf42afa5fc91a1e8da342c555b0ded67acc22fd1a26d9e83d34bc58ff1afc51d0ed672e124e4dcbb85fead180ce9fdd6b438fd9c14730123e64b8af6e50639d441890308a1d25f151c126d15c08e84a457ac1af430bbf7fce5eca85a3dc5eb26573b2cec24bb2710e6c454d9ff8d12986ee7b7858bd619320148ae8fc66dd30d3a832b5f62bbca5b32a6324cd04510bf92b993b4851013b8b422458ea9730f4641be90e366cda57fb6aa9551a91c91499421e3d6e23f5f36a8b30ffd4374f15bdebe58a24ca781a833bd0ae7f5909332806c0ee6006c28d3a54338ffc5c4f97ae68565172d5f250919245d4c25e931882ae017134ebdfc1541ad944b1800a78f4980c0170304088232c1ab9e578794b97a1ca901014f0e90a3863edb97016e849aeebc70f23c60b5ebfb7a94b97a6ae29653950943e742bc69cfc84433eac203d23d163f3e96cfc6e25fa6e2d7d597ce311337b77127fee47b5e1989c00f85b28569c72fa6899f5e9ddffa93288589e554a2cea25651dbad03a5dbc1de42c0b2f2e69c6d2181b21222201fb3ba0e591b606f6a11bc2f268fc57db69600c2c679db7da47217443634c7a3d31439db03307ba1f24c80e48a9dfd98afa2d17d0c67918b693466eb1131ca48341fbb42b42896166e5a3c036bd1dce8fd96f7035608b16b54e7f90ec39bf61bd93ba9f0df753dc344166765ee93065bdd96c0cf1a70b5c2a036b825f95e06e94b6ec0ff7d661df42ed048b092b403744a76130700116fd664395eadcf61df46e2ebe23c943398607bc29b4559cb4138e9a8801fef3f55baee3a5a445a3c11101f7e04154d2bdee4c86f46e06e7582c754bca1ae5cc2015c5cffe4b26fa649611646c8f4b9fe6ef550115ed16bce0efd6ba79b2ee3f787df333dc69357ec83823ead7cfecfcd02688a1095b374424a998f628dc72fdd557799bc4066060a1c0ae1c76d45571d1b8f1a9df94642382b0b2e1a5b9579445019dbec919ef129b8d14210cba2955fac6d72281a0db8e30042590e73a2ae8e8f8cf85e649858b4034657d85eff5720b822a3d0939e27d35e9d61de3df67a8d57fc7015dcdcaf26e965505eafd734d7b354dbf8115c70a613a0e8b0640c6652e91a0de087d9b2b9281c78a7c3c7c0f04c8c175320812660000ed81778f72debe725565b09d8c66ca9c42b91f4e3567ff78d3a44b27790319d9912358610f42b22d758fe59955f41a35504840a8e1633739171848bc5b80cee786099d997dd56c5b3b09448ed47077ed7d179d5c056465e9f2646aaffb6032ef9c485d7cea96cb9b67cef28a3966bb38af2879664746096755994bace39dacc11c6af8a2c16e0b950f03fef52ebd9bf097a058277040b3d4c38b820e80ba3e76850bbf4a77b50656eef5ffece58a916aafd9a85d19d2e3bc14480a9cf2b5d28a6c013b99517af20d15f78de6a691f270d6ea49a15cfe671872fe249582fc74f23822586ada8ce07a507ea6acbef5b0222f583787ab6ccba7f87587e18606f2c6d5f8f27a7bfe8b8a62fa15db792ac22bf41a711f2070d91d57e39ccda4b46e17ad8f7c3c138c8b8e2dd40c91a6b20df26c66791fdcf741ca7887566b10456f8a6d4a27201268e6aaac20bc501a0d059337d6125c9f0e91c010ec82450104c3ffc87a64d3fc84a9794db3bbcb1ca5abe892f0e9e77f563ab2877236c04808774e5719630b9a734899b007ff9c14cb0cd6f075f127a265f5c4ccb1bd05479dec5e97a50b1b2db11554358ccbd6c41da345b78ea6f67faa924135cb2bdf9c3a7f01d90d413a834cae56780af7d5c380ae6bfabbf33b91ec4fa8fe737ee865531db656f5ac15b7fb2b5f1699a553896a0bc373d5f11a3a6dff7feb51d44ed5947e6fa8235db03ab5744338636b6a420ceaae4d9f99584a84f59bc6eab49e1a49fbb8ef86ca48a7ebfcb9efcd9bbfd4a235d5f4b091e83b4f04496753d537324eab6b6817ec377f39614a0a477cae59b4c2280977387aba4002051c3f27946329232ee91584667cc5db4451d9de79861cc0d85b45bded65d0a872c779acab0439076520f69eb647156e0945460b7367fcbe5af901dc4e71939f43b161a29f7b6a6a4cd33e1f57232584d6fd0bbb2cbfd68dace15f9e7dd8183aac2fc8d099f77aaaa3ee18962871a38e3006bd04d7fae315cd23f702f7a4a1d1188913b1a790cfff0586547a64d8a4142294dd13a9bbf8698bb0478c091c75dd818bf30ca9f18329a0783324d7a8a2f443d991c021de1badb9f0b42d13687109fb21b42ddbcda4f60a56f1810a18831651eb3fc0d30c08f80e9194de74de9d9929c465bf69d56828e8970cf50bc915cf9e9c6d00ea91307d10e3dea825d8a8ac8e1f1b2a3c5378955cc5e6e660c43c660fb5c8220758c19864045f2294490b7757919861f1b87e1fbda45a750fbcd46861073cc3364ba95001e71b2fdf485d0162ba8f04c0237790dd368db394ac731f65d8246fddd57ebc86d7af7ddf2072991ad29711faa4c977d54f6b1395645e7a77b942d1a428986ba79c2ee5ba7dc5dc61fc172ed9db353b983f11436fa4a3277caf36db70bc57767f73f3b07a6a58133c7bd2d139c39afad21b3f1afe94bf732961d9c0bdd380eb437e6144bf12593ae49989795bc9440f62f5af728d7bf22bd43e23957ffc5a5214af8cf94a32eefa8fe36e6e60987c706b491ce7da9fbcdbee147281cd9d05b4f133a9dfc6396b0336dd89f1772cdf686fc27aca120def5d4736b3298bd3266f23ca51ca161f53e8559252b65dcfceee68a3cc87030bcc8a4e1cdcc3fa6390b3f421ab994dcec8a31648f77b0a499e4c1e74690d30564b26fa71e2d7433fd1d8785620a704f447d182799a2ff4c5b207ecc9c0c570b8b492fa4ebe1484d33cf9f4165b015ff36e7195717a065979004146f436de6d91499ed17809c40c7772f715001c42ae45c63a1adf0a7330fde895095641185971f12a7a20e8afb747311506439f873dfaa0c879d7b5962fc74112d70f8fc4cd52fe3da837dc7e562225130174f27e7ae9d61f85608154cf8eef7abe3d27c106fb00652854c3e3377fecbeb7c0e6b548d84f359f7c5f2a98a4a23f1b46760f0921140b19a8f48cd2f8ee4687508c0b522c51dc24c5f9adde1fa971c4f5ca2a0e2f74b6f3675a37b0e0af9661ac475e0456bf1aaea92321270df6b3ee8be48ded6503bbf28aa1a263564e94e6117474e16c0c36e011cab028ec384310c3660b46439330f0f0f0f0f0f0f0f8f3121b52563d8354929498dc4d913fa419e524a29a594343878177a3a33f1e9cc7490904d5a8206017e0b5f0c890cc7e58fa56637e6aed1020ea4ddf8ed8b2767352b6f20c8d978c568e94e9ddc40fe52a3de49d3d4a9dd06c227554b79a37c8774b9021fa071430b361083c97c41c65afa035aac81a0f5926b4cb3a1f4a3b96a20e80aff41c80b4a77e38729d0220de468172654df75bd6a1e50adc00768d0d0020d84cfe0d59764fabf2a9d81a483c9f4e875416ec9b5300341a67e7adb0c6a510662fa0a2a7ef8359552189574c335015a90816c4a69aca73825d5320652ea8831259f2a5477c4408c1d74f475d6383d2a6120c8d6fbf46716fc531c0c24d9faff4b667f81341bbb414dd7a8ca9617485a64c6244f65b44dfa2e10ae62b63fb94efbf6b9400a3d4ac4e6dcf5a4fa2d1073ce7dc6a0e4d39db440d4cc0c7aaee3fb7a521608164d5c5a524995cc090b24ed9a43f896bd9a9cae40d0abb14766902fd1252b9045655097eeb93664a90a041d4de6d4f7e4a20551819c569e7ee5543f85d11408a3baf2e65e6d778aa4801a8bf99c3d87a2402ed7184fe7ff3185a0406eadd2ff1854d0f1739e4052d9cf3deb6bef84c7092475a1762d7a27dda32690e6b4b4a62c324c20ddba7a32bf6f8dbb59025936745eb5d4288198b161747a8c89f24b1248a6f226dbafc7af549040b4b1dc9aab92feb8942390faec83d22d9f62a5c508c4ca95b91df4d5d72a4520665ecef6ad0a11c8f6f954dcd790dd7e0804d1d9124a08f117354220ad9cf014e4a8f49c83409241577d52a2f467e54020ddeb7afe547f39867f40d2d75c9bb24ace5c1f102bd384098f1afe19f7805c25ffb5aebc457b1e90abae4a5ace77b24f3b20c7ff2cabb13ecdbb0ec857c137c70d3b0b770ec89fcbefd226570b1c1064a79c27c2672b78abc50d08f23aeca9e03d1ab4d5c206c450ad11331b937db65ad480a062ce1de15135a8916a41038277ba7dff65ceedd15990b53c6cbc30137ea3ca82ac9664ce4d7955ef692c886a2955ae1dc182682335f58633d9babf827ce2d228f3d0173eea0a824ae5b521aa9488d80a92ffcfa9ac088d1f4b5610e4981cf1aeacb931ab2009edd1e3e8a8cca555418aefba799376d56c622a089bc4b267af924b2d2a482abb67ce937b1ff34e4192ae9b6216d5dfe79b821432e55eef4aa59f540a92ede7dc1f3eba8b0e29c83a26f3e51cc7b6534641f24c5f33dd4bbbbb2848669e935bce497edca120260f1bc62c73e878060a629e9353aab222c027481e2a54b0937aea2ad50002788218640a71395dd0071b8d2e0a07121104e80439a55ca5bc62e91ff1738220360671edd579ad4d9b206ba510e9b1e38a9a34410c4208219e7443663b2f9804366ab48001d7015004013241d24cfe3bcaa26cde0613441d3d7ade84d2dc1fa66196be68011769004804012e41ce6f62e4cebbc54bb104496e564e3fab50b97f2508b6d9a3aec345b9cd7b1f41004a10f584d0d2d93f194a6912c4370f4abc627eb40f4982acede15afec26a4e21402488791764e94df265fa040972fa7bc645cd234839d655ced4f7aad9e40892ec90b93557744d336a04c9453b8719d161ef7146102f676ff95c5a0439691ba552bdab08f25a7fe5d3557abd4f022482acd92aae5d67c6b11c4410bb3dc4e2448a30d10f41d2ab1aff34ba696749004310f6a3494b42a485205f8fbe6be72ce266128218e2f3979053f2544a7941804190749ccb6d759d20086a45f43655e9a462200857ba73e42adda775f6090008724a9edb63c6f3ed11fa0329c83629e63b522f5d3f90a2dd7d0691b9317d4a803e903277e5a98c273e903b9d8fb61c9772a3680f44b3a046687daccca4d103412b2f8a4aa755632a7920de9cbeab9c8e07928ac94a9d07a139e9fb0e2413fe9db474ccbf9bda81b42d1742bec65c5294752009953954576be698e840f05031580e33ce81943347b3bfd9532b1d01e4400a9ea56290fbf33713200e440b5de2b2f5fde8121cc8b39ae2e63e466ee9df40181167a7ce3c3e3cef06e2451d4f7993307dfddb40def351c945aa65ac9f0d64cdad1d629543a8f9d740f6cbbcdc76131ae3570331ce56fae72d65e77e1a089bfd99e2fa4163f4d1405ad12d4ae6dfdb9e7f06926a56b8d5a5bf2fdf0c84b7145db24d964ae39781b8f93bedad25b3cb9e0c04f5afe449dfd4c8d48f8118975a6d9da7c3fd622075c79c3da508617e4a612087a6cc71d4b7c39e1218c89e7447abe89fc442e90bc49474533e15edb24df202514685ea7650556ba72e10f369fece57791becc405829f9d4973f5d4cea62d90b6840ea6f30653329ab440f29aef11532bf369ca02d12cc93f7dd522d64c582055d6565c5bfb5066ba0229f3f6a50a62b2023989b7ad20df496496aa4076d5116d5d494386a840ded6d82a11d19d3f5320f6a84e2bfac34669a440fe0b91d1c3620a61890271837866cf34ebbe4381e8c1f3e8e9f47332fe0472b967899ddb14bb3b81147374b4b45a41297513c86da6a277d5092d6a2610b4458495dccdca69b40492be7c977683262b1b2981ac41b5f9a9889240f2117a42e920bdce434820c69cfd3ba85cf59d4247205cea136b7b0fe5163202c1335bbd6f3fedfe4520c92599e49626b9f01381a05216153cf64320b85fcc22b392a8242304927c128bf3a4f9671304e275cef82c7127bc060249ed6ae766964b22fe01b9bd5eb4fdcf62907d404cea42a3555ea64af680e06ff24d6deebc3379408e39ce1d902fe6e97071d995d10179dc6490aae9aa37cb014105af1871d721000ec89f292c7bca9a721811e00644eda4942975992b89086003824e594dc676fcff87003520bb09f52484ced7b163084003b2c80561a34e3f556366414c2fbbc993eaa493c5c882bcba961746b4e9e82616e4d45acd9bfaaf2a37b020c70815299e7e05b13283c66469e7fd7505f92f5777901fba2ed90a92f8b4b69652b8b3a46105a9f453524dae6d9634ab205d25f17999d9e94da30a92891f1ddb477e16a149052963274feaf2672695410569b39edae7553ab5cc29887f9b532ebd4147faa620f86aeeac6a73fba752906474e9946afc623c91827c1e7bf9f553f44ba320cda7f412f726a72251103ebfdeca7c4241d860711a9a29e7784041d4cd1be3cd49df8af90431ab85f8d2992752e309f207f3243a8c8e21339d206aa5a8793d293bcf0b27882784caeccecb2608aa3c6dfaba9626bb6882b849084f2ad6c54ce2920992be4aa2f4f5d827b76082a4b12b7fa5cf4989b35c821484ca4eff75dab52c9620084fa6515b543e152c9520e9dc4a7b7993c8e0154a90552c356c8ad137599904f1352699f9fcaf74154910e39877fc184f85592512e472f1a4ea7ffea6870459bf2ce49eea8f2005d1a13c7d54c409b923885d77c9de84fe4b236f44daa3fbe534c40852ce2c117555fba0b3085286b5b2a4d747c71845103399acb64f2995691241d4d3dd3b553a98b6382248d67aaae3821e15753f0439e898e810cf69ee764310cbe35f26738f57b61782144a0625f5acd44c764210dccf349cf8cab2591f04c1b3564a163b2a967541104d5752397452b1d1f44090455510223fb6594607042988675e1475b199f91f4876712df3694fd5e57e20593e99fbefa37d20de5cb0ad2c9f9e793e103b838cf16f6da6fe3d90a37b67d4b82767427a2059258da384675341280f047b1bf59b4c5b5d0c1e48b3417a8c21f4dd66ee402cb3d29d2eee7c753b10a3d6c91effd822d375206cf7ae05d59acd331d4841586c7ad60ab3770ea47ce19a2ac990764a3910840eed39691807726e1d2584c84eabb0e19069391b9d84d76f20478dadd41697295bbb81242b881342498d9f54dd0662ca67b15e152cdd6703e12e2e5ac9d01a88716d83de319dc23f6a207a5a8b31acaf85f5a481182d3d4ce9f6243c8306e26b1af7a839c794e467205f66887667340f72339052b4cc9e6a7b3dc6cb40fad92f65a72603e97cd73ac77a1c4b8f81ecf92bc796a56f8e8a81a449ece53d25878168b162f64f6aa2a2c960206fe5877c1ded17883129a53ee98fa24cc75e20468b33f215b71b33ee022996c60c16eae763121788a554a53f5561b44a5b20c5c8b7b433ea62425a20a8e63b8f1bb459207a4c9647dca26653592c90e5e398c75e59d3cb5e8118effb5e1699510903a9828e0e993e0915d7020692757b36dda2c209e17d81947f329e09bbad18b617c89e3146669c27d5b80b7f7cadeb346771819831c8a829fa05e5c92d105feb4f6d9021df542e861648bad51ff305b3b3d1626481bc3d975163f63fd852031e37147023d9b0e1e181c3c3a30e31b0408efd4c4255927dfeff1588db7945c65df11496b70241bdb2bd47c5fe93bf0ae4cf952e1ac4e33bfb5420d79f8e49795b6ef8690a44db2aa1d9eeebda495220bacf9b6cd8f930738a02298c87eb982fbb4d9aa040fad9fc29a9cf72ea4c4f20e7eca43fe9aad3922527904aa5558db2414d20fde5ca5b5d397ba58809840ff671dfa33d93be04821e9d0d9529c5ceb012089b64ccb1729da6742709a4ac0f325bd642a8dc4102713b848e49740462e56b92a365fba3698c409cef74cd92972210c6468788408cae1633d32190b46906e1633208190a81e0395a8be5de3c9d0b0259637385785b8da50181705a19e4b3b377b0fc07a4dc614ebf643bd4d23e20bc56540db6f116ef01b1838fca8d317a4c211e90d2a9ff4b9ee13547de017163dcb2dbdbc61dad0ec849cd4f5b35e6bc8fe68020746345989041748f0372e7ddeb48cd0dc8298712a69296316c40ce9a9adcce4c67cc32460d88a763dedb61d47889316840ca70396bcc4235e57016a4d0a996cc4486d4fcc982b0a692860bd9797dbe58904e2955f55432b6650f16049372daf7a77d05b1b3bb7e89470da3e40a5267c76f452faf246a05e9ed2c85aedc5fcf610569eda3789ccdf08ada2a4861d7938fb7faddaf0ad2e80a5bbf7fdd4e2ac87de66f4153f691511d00062a48a97a3fbc79386d3deac1380529a9bb3c23568427b97fb0a51a377294a51a377278053e40c300304c41f2985dbf12fabee674238d0b53b85841c980dd0aca8d09c0280539bc2c76da5dd11eef072fe003477940df17e504e815f8008d08c02005c12a57ded177e135c5d22bf0011a2f80310ac27fbe18d3e75814a4a4c9f37b65abfcb1120ac285bbf50bb74141cccc24bbfa9b4d59f413e4371565e6fccf447d9e20c7caf60a5ea937f6ea044108212b06d9fd539a7fb01da68013e41c77a3c56416aab76d82343adcc48617f929d69a205ebc6a502ba3d9b665827c4205e52274c6115b618224ff55c3fad26d87dc2f41ea4ca95977d2f7b3640952fa94e436578e1743a612049569f929884f1da34c0972b2d42905b1b0b7ea26419229dc2c878aad29641f6c8886f3008624483964c44698362917cff21bc08804417b3cadcda537552a0309725c8cee399e8c6e766000e3112473cbc933a589939ff3c1b6826483860d2fd21250648b0b4c608b19c07004d1332b790e32ae3b80d1085252fd9b446cd486d37fb0d9285d7c4103188c20473f25e6961d45e76d2180b108d246df1a953dad8b755a71e0a061ad3834e09b6e70053e400301301441ce5e6f9bba34fce79e08820a9e4f664c9ed2b38408521c59ad196584926fc238042969eb137332d8e8fa188298fa5db372f7b73da610e451317fb6a082e8c948086234212ac6ed2897416510a4746ff9ad4d8b4abb0541ce20cfc743a60341b29675fb9446575ccb079b59d200031a1004a5d2baaeb6e9cb961f6c673870a473128082a4016f187f20b5a6074f91cbebbc2ac3f003e1ff52dcca296c3d993ed87261f481606f6632e528c2774d7c208ae97f70b1b078a9f9e013ecc164a62c8a8e39ad853ed8762bf0011a2b80a107f298ec302a49539a6242a715f8000d859107625c913f3f6a3b9ab878209dc68d15673aac74ee4076d7d39a8d7e2756b503e98385a6eae62ff997348116b8a04c40d90830ea40124257b8560afbd94b7420f5c866b8d22b1aefce816cb92cc536353b0d170c3958e5fec95407999f0d8c037fa74ec7b88bcffd075b0b0c8db2be9172d4483890e35c8dfa87ecd8f1f0f0f0f0308f018c37a0b14a7de7bc91e38b13c07083d13a07d38d158d96d684d1866a837d26e1279e290d1b5e78787031810b64e00213d8c2638b056c718820e0e1e1b1c50526b0459202061bf6dc1dc4662db595af4430d6401cf3203a65d6a4c30d38362c60a3011e1e1e1e387e00430d30d26030d040f86cb9961f9ab2c6e4071b0d2f72d8a80181bb07c03803a92aee76650c9a35a96605c30c04d37731d7fe4c94ac0ca4ee4c29995fe938554a08c020032906d34ba1eda49dcc8f8160253e6cac6f99d2be187839d32b2d3d858178792bb98fd096972960209dc69cff6af74179fd05725cce6134d3c51ceef502294e687f8d41e73c25ed02498610cbbd5c4de37281a44c2fe50aa55483985b206dea11bf3aa22a8f500bc4afb1ac8cea29e7dc65816839853e2fcd234c5430b0c0b767aba998dee4690430ae40ae0d55252fed2ebfc70a04e9e1c1937ced956daa40d0acec522353812c1a55f3e7db0a9d845320fbe79316e3f669b60d8614c8bedf16be54eaa499741e0818512079c9cbdb6954bc54fab6030c289074d5c60b21f46b59f7c1865607184f20772cf51bfc2c69cd491f6c5c811b0995f4801a6fc38b2e10046c5880038006184e20eda7f79196f31a4cf5028c261037e53e5932758a2a331b60308198e1ed6fe1c52fdeb434c0580239e9fc9bf0f41c64a772d8482a500249666d8cd9b2dd3c0406184920ada7643d979f9f5405470e1be5120c2490bc744ab7940302184720fb8ea88976d84f49f8c1f6050d1c35dcc3a34d15308c403cfbf0a21e2aa59c8d84c33607308a404eb12bc5c84c7a8467c38b35082412d8b061010f8f52c02002a9d25bfed1ef15a5bad10818432087d81f199332cbe8e5071b0e1ac90425c7ddf101861088de39bb3a9ba4fac8c700230804ebdce1f35be6c5df3fd8780b2e1c80060308a4f694e2596dd099d6f401183f20488b7d2ded7e71742fbea091a3d0b02b307c40d0515b2d777a40ba4cfde99e0760f080d41eecda47b6cc92f9450d13e0d801413587ce12fd9846fa1f6c3970dca8f1657c1c80a1038257c56c3532a673751860e480e8196e4a9dde890518382069911bcbf3b36b33df828b096c8157807103720aa63f7da8cd160bd822b9a086061209ca053c3cea60d880d83677298b0edad2686b40d412cf4cb17c35a3d1821b39caf044008306c4df14367d480d1b2b7675d06216e44bddead9636facce6541ecb422b25f63aab33216c4f8eb49f3a560413e8b39996bb28e22bb57103b894dd76afba182e60af2ff5c0eaf39a5dc0af25aa97b9b0c9ab5295610b35d098da167d292b80ac27f6de83133935d15a4fc2e426598af24bc4b05b173d0bab2c946b454a820a7e865ddea4d67ca3e05c1dd934e265b74bfc4a6208992a175a5fa5290d30665ba62d57b525290334c5787df585b268ee24c77919e7e99c21605512bfee52f8856b8f10254d0221464cdc1edd6d30505b9c45b4cb99edcdabd0f361a092ddd48010e1be43e410e4a965fe8bbfefc244f90628bdfaca86421e3a613245de29da176369ebe30d380da6a400b4e90925ccca1c4ad1f6c769b209f4cf2bf63fd6bd6d4b605170ef0f048c8c3430b4d90bb65b3cc4666c5851f6c677799205652d22c4ff34d08fb4c0b4c10afc472f8d1d4b5d99c697109d27f6ad5558c2d41ca7e9f358adc18bb7d0b2e1c80baa891821c2c4834a0a04525082a9892ad6729c4c7e11af0f0b89170787850829ca6af4a9a7689bd7b1264fd5426e77a7b839a922059701f7db0ada945829863509e76b3a6b95e214152f1fdf45988e9feec830d211b351a50ceb47884e541466378322f51cba08523cebe789bedfc939b6868d108620ed2b3b2ed09ad0bd28211a42bd75dddcf182bda071b0e1b5ed4e8a28b42c3af8b2e12e0e181c3045e78f161a6c5228e224f25119e2a43fbc18623d5c851e36e0b2e1ca0e58610b45004f1ac3306dd981bd4b88920a577ca7b2ae7d0cc4944903b88efee12224d9547042d0e41962de566eaa3e2f46f089285cb9945594a9bb633418b4210b32eefb86fd60f32891004f529734da968de59074138afadae2d4f9f4ba7852048662a8e9c8b5b9be57fb0a120e10804d16537075d2df259733ed8be2827a0816c24265a0082a04cc6777be590e9c70f361b5e74e1c5a1f18774b3dfe69255290d16d4f833d50e68e187b366bcb3cce4445bbd466cd989dbf7838d060d13a4f40597408b3e90cfb387d69ab1ce102207b4e00329bcdf27f95bae29bc5a012df640ce16e3e757ff9cdfa21e8895eded42e8f049f525810d2fba680c689107a29e86388d9a4e55b23ed86e243c104de6890fe3a5738877b7012dee40ecffd10b1aa63c06d1071b0b921d8817a6a97167f65368723f29a0451d48192cadf34679ab243a418d93104e400b3a907f9476aaa7b93eb53fd8cc186097d045408b391093f8f3abd754955d4783167220adc56c9d742e7fcc6b110712784c1a3ba73095f3833c0e329a40560bb622d62f6df6984052fad49f694ad348c8f00a329640927183c8a06c4557d0b7c0d0a8bbe1450e0d9044e30b1c0ad862015b3c8028815823c752ae0b9f95f249d8d7c53ae4de3d8804b25667ae7ca72e28db1c81143afadc7b4e8b22c44678b652c5afcc3bd6a1414611881f5dfb74a8f5478d1241af354bd1c9d453d207a33341c61088a964791ed11cefd20b81245ae3967f8fc74f3308e4ac5db67eb23ca51908e46e8f412ec595f103eb3ddc643cd7f2acdaeeaeb25f738b105f65f880d89a2db77b2601327aa0a9755f919fba1ec8e00179b3d6ca6ffb9410ea1d90825f1a1d54c532744092bdd2cafd77f97a0e64e4809444cd8f3ed90f9f313270408cf59e82dfb585b293c60d2f68aca0dc88808c1b90a408299b44d6c2b465a6b60c906103c2d679de88d0f532fa1a90e2c758f70ded54b765d08038ea9fc9b7a3757a7f16a492ef975b61d7164eb220770cde396350baeb37b120c88759264daa39f90816249d1bc3a7a4afe292fc15049fb73d65625f9b7457103b86bd78bcbb15a44f62d59ec2c9b0a0b2825cbe6fdd55f9534a7115241393bb55d6269f570569bbc3883c9d358ba9307f12b2e2654eb597de4838b00315a4f59039a952298fec94da17850287808e53908288c60aca63c4c2fcc1346ee4f8a22ce52839bcb8b11da6209db85dcdafa1e393ea83edb81458dfa7efb414df997790829ce27d0a59e7dadf053a4641ce693c468b39a8431404b9f84e13ed9d4acc8e5090f4261d33959292d3d88605dad0010a92bb7e5e355db515ea079b990b6ad8b040a7a1e313840d9fa1bbeb9b39a778e8f004d1638cd92d162fde468dce424727089b3cc7b4ab1b95ccff600f8f2d1690c346ba512ee005171e1e8e850e4e105d84f650f7601577f9606b333333b3326f5e4dbc1600153a36619c4bf5f76d5e9a41746882b0f1edd2e9d3e515f74247260822554347cb9c1e3a30411ca5a9f6e356d07211b6a1e31298f2ccefebcb6143872508f229769a8c4d2548bddde9b9a4a5d9a8942078e806a53ac76ce5310d1d9320df49536229fa72de5612e4fe2c212d9708bf4c764482d8179466ebd1163b8d3a2041ce3ab3a7f3a86c49848fe8780459d4cac76cd7373a478be87004f12d9f26cf9fb91164cf2a7a6974ab63b83c3cd830101d8c20e68cc15396126a94c976e85804b1721a39ff14b662cc0e459054d887acbbb8b255e00334b8e8480439895a379d8309d322c3870e44905e2cec7c7ce7d48c7651d77108621c3f5df9b1d5632d482670447418829c195ac6a2eca8b7d20d2ff6101d85207697ceaf25f5a466100d1c25d5b8c18587c70aa28310c43993e9a1e3c52054350892a8468f0f959ec7cf27740882ac1e7f39961c05825c26eaae5a661e2f0610e41883b4338ba94f56c65de8f803d9739059329edcf85e7e20a78a9afe2b6d8f2e15173afa404c31dc5305694afda7f9401429eaf206695184ce7b207f0855dbcc3af14dea81e8ad172a56a59219d32940344860a3c609da74e48120173d88acb2983f6d1a1d78206a6e4e79c46fd3e91ce8b803b962cc83bc98d4944ce8b003494e7fed6b63e73005ee848e3a904e469af4a83965f0dab3d04107e29cd2316ff892ea5f7db0d1f8c051bac091a90b538e0a1d7320e8b10edf97c1d248cde540dc1c2afb6c8f598ea7c7db820b07d8b0c0062cb0c502b658c0165c4cc0c343ffd01107f2fc57061fcd24dfcf0fb60ec00d3ae0408a225ba63f880d7f1e4f42c71b0832cfdd947fdc48e87003c94a8a0c6571b2433d9f8e399e685bb5d940d48b3194988fcb0d13063ad6407a1f25b4ad3759c9d2071b0d2f10a2a0430da474d153b6a857bee17b81cc8b8e3410633eb5eecf921fe976a081b459630e9196fcaa6dc1f1f03020749c81a0bea64c938c3ed88605ce52e0680692bd9dd28da29f9b37396adc5801221b1b40247494813c4ae5317d9a99b9d5075b1726c7495f78781c5a0092d04106f29eb6c6c94a69d24e394a8e145060f9bb630ce49c5338156b4f2f2f1303317f522debe00903c1f2e69fffa81eeae46020dfe8b324735d5f20870e4206196eea94e7bd4030a5cb93d0ed4e61cc2e18c48c8ada186113a1830bc41c1934f6cf59c87cb7400a3542caae6d6a0a4253e8d002a9f4950a2aed075332c18d7282746319d09105f2e5dc59d994c7e6ef1d5820df08e9233dbe720eba073aae40ccfaf3bd5fdaf2ee63810e2ba4947ecea9b926414715083a7283b8985fd3a79c0f361cc9820e2a54c71488379b4a9fe8d0079b17364e051d522066a64ea372faa748f383ad230aa7ea98957438d1262764d7010592a65ef453cb6f3a2f1f6c3472241ce9c613486a376c879af78c9ffb601be55c171d4e20c9b65ab58d490b97f4c1a625e86802313b8e680b5afd928eef49a18309e414f745297d9a7e539a091d4b2078f0eeccbbb1e72b550229264fe24dfd9804b2dea8aba6bb9ad08104c28f2915eecc362bf4472026bdeb6d59467a58931108736ea9371ee53bee452027cd2b0f72b14a291b0a1d44206e8a1927359a18193d1f3852f04545c01dd03104f2a65469badd42de8a84401c916df75c2959e80802d17d636c73f38de1030472a70a65efa5f90149e97abf6e0a224305add0e10352906154cad72d6b490a0108902055e004353c3c3cb607e4fa1a21644c64df3f5b4274f0a070d9bceb4ed58bcdb2ed35fd23ba9929caf8c196a640e8d801c9c3b4c6dca3d334251da14307c49c0f6716af75eabe8e1c902cbaa894c92cc9a6a42db898c01642e8c001514ee64da571ea5c7694be280747db8d84030fd07103925f8b384bda6e83daca06e48a9a6f3a2b8c9650b9133a6a40fcd0ec194ccef6ead3410372894c733ebf17ac2eb320bfc5681af941d34dc34e1624933d7e31dc86eb9c8f05d164935036e379437a82e3010a78c43093692f2147d7e783cd86176d5b70e1802d6c58c05e41d0e16399e7f1ceda2357903f6999ccbc79e4bedf0a72b017add9478a1ee9c5600531c7b8fdb2ee2a88f562d9b4e6699e5eaa20d9b96dba0b313ba7549046db7fd97bccf95aad100315a4d37ce9ae4d7c2b9aa3068e1a2af02db870408e1a386a7080060d0f0f0f0f0f0f1a768918a720fb5dc8e81a79f62fae29c8ae4947a9a5521d84eb4d88510ab2283f0b66619933341f6c7635be284e88410a82080db7be202e33fe079b5a3a2ce08205393c3c3c702ca0051e1e5fe346e2000570e0483710da8087c78787c7a9b11ce8e22444e30b1c1c6308314641186d0db929753ed8727481878386094efa386b2c201e1e0070420c5110a39a3aa9f16df4c6145a28487539bda53539359e040569f5538c31da9b42e67c82349ec5b266e9b8a1d11b420c4f903ca3d58bde775bbc9d28556ca6ea330ba5f960bb5183861983200627885eb9efe1357f2f0e1ce58b16181a773636e0e15185189b208b0e55974578a9a0623ed805313441ca41a8a670ee9b5a7334722412b0e5480ec804597ee584107175594e3725c4c00429b508e5a752884f4a6c4288710952d220da4733a78bf179228625d498d4fe7a264b5abe2062548218264a955f705dcf3121c6f936875d52a9edb122c6240872ec533e88f320da1892205efad07ab639890d73e620462488497fbac84d591946048962bc4d5a175db4e0468e479066f6f38cd418257bfa60bb9172241c5a84188e484795a5ee85334da746581de77a4a638bcad9210623889b938a295ef21741d07bfa42293bb377f783ad0c08311441eaa4ff7d367cef27935e05622482f49f398b109f722da640804672c00c622082a0827aebbf5957687c8f10e310a4b0d5281ea48884188620d5a7efb021b3c00b057878a0c4022f8c358e188520864a31a577c768e579787c200621eae0fe71d344bb893fd806e1a62f7952fb32d3e883ad8b2e0a0d0f1a08150f8f1ae506175e180052c410c49b72f2d3544c27f0e2c67b78d88d1c5f20003e112310a60b9ee293b8e8a50c2058efd8325eabd6297f30ab5f4db98a56cde90774ef2ec9ccc9e2553762f4e1b837ab793766e5149ca073a48002361aa01788c187945b68eb20eb2984408c3d1065e74e43dc966bc77a20556d69d4fccfc1548b9187adccacb4f5dddd555d4c2f25ad660762e081dc794f5755fad7d1d9187720652ccb4a0fe75f971d881934c90ab631c5949d0a31ea40ec9ca7f1fed47cf63c1dc87ac2e2799ad31cc841541072c13305cf243910e3348cb4ba98ca63250ee4d826ac747d0a7d2d194062c0811cc4e9ec97b3c938295f8c371083e5ac59fa96e6d2c60da44ac966fd648793d1d406e286ce32fae3c774aa670339c7cdd8e11ebf3a366b205f7fe5c5a07c64dd470de4a465ba99274e03e92a3cc99c673ba85ad040cc0d2f2ae50aea418e6720f6f9a969be3aed509981202c25d3d9e632103e89a83da17b250341ef5bbcebf54e97c23190638e7d7c9791995a1703413635014f20e9fe30e549e804f265e7d3a0e33ee79e9b40d2355177ee1b261056ffe2ec72ea8e0a5a02496c10f1396b9229e9aa04826a0cd9e17e96f7c9241083f8dbd8a4546c7e0d0904bd77791dc22310a367f4ccf065aac2c708245da5f7f2dfdfefc12210848dca75a777a2512602292ca5b1cae02663ce87402e15ab998296dbbc8c104ea22b567a91a920902c27111f4fcbaa7310104825b32a5f1d96469a3f20e864495f8ab41d8bb10fc8c9aa636dd7a707849d11daa259c98a9ef2807051e67a4bbf1d10c532adc7ebd31ef7d201e16344545aeed89fcc1c1063e7abb3d30a07c4b4a2e9b7fadd805c5d513fd5cee8c506e41715938c124f49752d400d88964307211ebfdd172b000d48b2db5a474be7c9066741dc76dfdcfdd956499605d17c3d6d8eb4634190a7aedc6773d031b0205fac7b0b9dfb15243d313df3ebb362af2b88ae99cb35c785d3226c05e9b47bcb8c320fbb8d15a4bd74773945efb8a75a05c184d624448e5441daa4dab28b8ca582586947fe7be75041ce2f2372dc83ea5b780a62c8dd27fda34d6675a620a8a5e4e26d27f3c75c2948694fdf33a85299e1918278a674d38cca25e4894641fedc96a3f3c7478db228c8f956547835992bc984829cf9f12a6765a8a06150907b4c84de461fd39ffc0469f67bd63e43eee6d613240d9d4f9e39f7f5bc4e9046d3e7125dd90b257382d8663a17c5a2555e6b1364cfb3a7216f7984b69a2055ea98fda464837b9c09b27b0cda4f4434940c63826cf1a25f290b96298d2e4192f3b1fa8fffd5b1b604496b86509a6d3ce6182b41be4c3f71d3942d880a25084a6f52f154aa6a4e6d1224b1b9a2566de5b4eb4a82e079f66d1f3fc6fa2a1284d3e19ebe458e7d4e43826071f2bac55ebd83fa0872f6d2a995b3e90872d0289abef6d1edb34690d2928e5b671fc446c70882f854ff324d194dd522489f42fb62bdf55f5a11a4a4e19e44907793c80c73b55317238278157a693e646bce7d08827bcf95754cb18f9d2108e2bc32c5ac1d164f2f04a9463ec5735995d06e0621889d52bddc29ef09330661a95dd1e49d37cc100439c94b2998d8b7fe240a04316ab7b86d8c17d33f409094b835cf24f74ce7fd0762fc4d9b333387656e3fd866f881b4162b8ce8d2bafe4d1f08aac34e8cc991192fc707f255aad14c0d9ae22b6298b10782ba183a55ced3962caf0792ab766fc6eef50b33f240fa4b9129fc35eddb08071f61061e08f2ef3c97f83d2532e90e444ff993451bbb0833ec40be91a562315d0cb31ecea883ad57e6699dfba15e95d96d173c2f37830e841319baa7393407f2ebc688f2a4fb62d37220e73a7d717f1697712385197120c6a8e4fabea7368d100e249916b3e74a9defad7f03e18416a9596273a8164161861bc8561ab4c5a927a53c6dc18d1cd7821b5c2861461bc8313daae9b2cff639ac87196c20f7afb7ae5f8ca584d21ac8d9a407331d213590f2ce45edf4e8531d4bbcc38c34902cbdb43d87c9dcd65890908db336cc40033928d5102264ce1988b94ce5300b5d5e2a6306e2877eca8aa62e03f16435fa7e9ce724ef29cc2003416677a6f81a35b8d563207b1067767a945cf4c5403ccf41de52f30819e53090640cd9f4a36f31bc0a06a205215b2a9478f1b87c81ac56956df72aa678e30c2f9084e7d42626844e7a341c33ba40ca954dc9a5abffd039db811cc901c705b26ca869be5fb8090633b64036a16354ddef52ca7dc10c2d90f3c81c7567a376d65fd45841b66046164866a7a24853f7a515241bc9300933b040d2a5b46e78d07fd3b88d30e30a84cd516ebd5e3d2adb1261861588af69af3f7bbcae9ca902296455d26ff7769e440552fdbfc957c93fd8520e1b85047a43983105928bfe678b9dbf27b9144862a1a63cdfe6ab960784195120e6ab2454fca01a9f9e84030ae439954cf76d4adafcadf3c18c27106b4475d41c369e3cefc10c279084b6d9b8b9ad3e2b7db0358158ba45db4e87178b231388da213f4356b619d32f8168d97327d1b51ee6f2cd83194a209f255d239f57ea6cfb604b0271dfe7abcdea664eac83194820dddf6a540d2aee453e024129ed71292be5f2661f6c8983194620fce694d20525e32802296ca55516a16bf74b1f6ca774f1051188f71f742b94a9951bd5e822e5a8f1310472ed6c76566f4cbf19fa0d6608c10e9aaf5e83a70481247bb5e3958c4dc2738040140b225394523ffa93ce06337e400a69ea17b293bf89bc6830c307c43215bf64fe5ce1e5adc08b057878acc08b1b375030a307a49863f4d89917d353cc03e26cc7130f7616d3ad193b20c5a8a9951a6ebba1c315f8008d1a337440744f714ceb8572408eb6a174ae70620bca8d1b4567e080bca5538867cf419a657c6f601e336ca0c72a21dac2667567d48094accd2c9f9869e8940560a31566d0809b9376393fd316a02db898c0160a60004aa77ca1811624091c42c62c487d3a9ced05d33b9dfd602b830c599c9f7ba54b7b5aa83e580e326241b0ce973588ca1a6d5719b020d5c6d239c9682390f10a529b6812b9127e316f64b8822c17cc92c9cb1b2bf6090119ad207d8eddaa397dd2edb382b0234466b7d31d2ac6ab208eea0c4a8573d90e3219aa2096f86f8ad60d2f9e061a8ee301b697910a7212261ee3c71f99628292a35141f2e44169888ca719b43c850c5310e52e28b7b079625a2f0b828c5290624a1ffeb5ea74d3f7c1e9e0f0f0c0812387c7021660a346f9588087878d1ae5e3a40ea00e324841bc68a7d5c457b457c81805418c8a07db542a49f93ed85c862848a6e599eba735e496110ab2d5dd8e1edbb477c2842341414ecd41c97b1761b9b9911c01323e419259d466f492cffea30fa6b187647882d826d22f633548cdf00564748254f9b26f7251da838e1e199c20a7b1e8d5c9520a36322b6313c57aede52848282017f0f0f8e204876568825cd2b252740da73b0f818c4c104b68879136d6b5fe7eb0e1482748010e93021ce90119982076d2bb172b4ae98c460b6ee4380ec8b804e9f733a8fe0e9ae51b28a0e1450e4b90828ae13db52db4e8c6858c4a90927e8c92d3234c058f0c4a102dee3daf6eed9edfac6743c624886332b21faffc607319c890c41e54c6154f31a9d2638b056c9163015b2c8046d9c9880451e3456932d1d2d3386695900109d2a7742fb1ae24b2471f9c825700f304643c82686de177dd34737dfcc14623478d13d4e8426f2d070b12ae238879aae7c36650eef626198d202733b1a4e455cd7e8911047d633fb6de1574b62db87080e690b108927bbed14d1d5f54db3213c8500441e68c9963b8b212adf9606bc1d7405e9c60d32023112425744afba93588604c74c9dbdc2e2ae28d1c36081e0c641c82d47fb621d74ac3e76fa48f15d802506a8195391b00de20c3108415f191317fcec8ba1f6c4e0119852009cdf114842a3fd858023208418ca3da4d59990a1f4a1a374aeae2a003640ce2cd32ef9777435b224310a42c7a773507e129fb409047680a52cc72ca68794090ed94ec1669ca3f08a13f10e6cf4db3847a91173f103c9ec7cab3cf24c3a70fa42cb9900dfdf381686ae46cf986388fcd1e08de9f5b73b3a52493520f24eba4b97fdbd40555c9035183858ce587f090a8c5d77720c679fc66bc1b3927db8160392ce795af1da1761d081663c5e6202ab2a9d2817cfe9e9b84a5660cea1c081b42f588a7cd3e7fe540be11a35183d05bed691c0856faf1ebf72d360e07c26e5e0d9d3d1533cc37102bb5d976f43f31dd0dc4f8b8b9a4b9a5dfc6369037cca8587ec9b715d940f63bd7902df2a2487d0da4706954162193984b9e1a481964eb5bf447828c349034738852df4103d9f4650ca3a79d8194cdf46628135e4aa66498811ce64d53502ea654251942461948eb965fd5f794cc5c92820c3210cb5f47be52ecc7e8d9582ec81803e14c9d968e52b18479675890210662dcdab71773d9dc51184851db3fcb92a5d2a503840c3010455ed8ce0e234cf3f7c1c6e704c703c98b131c0f4042c6174896629525acd3dcb81f6c7627381e48a40c55701890e1059210723a27fd1d65b4bb0fc8e802f1840c4286d2bb4ceff1f048eb820c2e90ce4aa59c2c76fee4e21e646c81acad49c7aca64d43787a90a105525fce27cf52f34bce4b9091057e5330f95229a73ed8ee7420030ba852b962e67e16f30a249daabe82997be5cb55418615645481b4b5a12dc75cf69f465f208a820c2adceac9d34e37bea0e10552ab9b818c291057cb42c51699e4de23410d1c5220688ef7b15316a39c9876901105f2e58c71935fdcab07eb20030aa47497223c5f89ad31e720e309e4244b783e0ff7190e7302098ceda8746f6503591c100602a14030140404ccf79e01a3130000001018140663d1603852d5f501140004513628562e281c241c16181809c4024130140a854161302010088541a140302c10334231503b00e90b0718da21948d6c14edbb0527e450b7a1a402d5132a7944c55161776956ea10284c500e50bc42ed3ed43d94caae3b8232012a0714e340f52178e05503400548281d8a00024939285a50a26628e08f6d9af81ba563d7ac1eef19d42f15dc27d39f70416d56507dcf92b1bb8050181a54f7d41b4c4b42b9019512547e5040cc05eacb511c08cdc102961b43745f87a06a066123f9fc05750c542ea856a1baa12c40916ed4ae94f8504440e9826a09aa03ca3a1409507ba0c484220aa51faa75a82e50d6a04840ed8512038a62a268bb41c11004503750ab42e96114b19aa2ed0cee91c5ea310c4a1ed4225078a1b40005c44b9df83eb99380236c9a5ce57b3170478e66d611201bbb90bc11870715790f1643c35cc20727c442128b29ef4f5856aed4871a53e6d3904535b1fdd069ee2c8373df6d6f5b950276a9702fc6f37879d1f47be17b6e05b7be7a78d996eeaac5578325c5ed7ba352d976827b82c477c1f8d60c52b994abf2f0f964549d58011e4056884aa7ad3cc7085d96d8fd322e912466300043344b2f082182b863ba655bb844791c470d03434016bc5bafd361a0b01f1fcd1f298586bc31ab7b02099e8779e14b4d0d1a2e242fef1534400c0752dc5200f83db59a90af9e4fe3c5d5059068d6a329f82e8378b02c465e54ae3c1d42b1b430e2591698e75678fd5609537042ac037ed8631a997fd826c02431e1c9b40aaf9b33c715e7468701a5e3e21c00fc9dd3df55a933d995af5699d23868af7a24533acc6ebfc59a8119589175b24ea03a9bf62d02b460cd3d1d0c7284b955db9dfad42c28f667ee60166d76dbc9721a41d034ed769afc338310703d6d80d21dbb33ce7a656058b26338681c9af2802e49012d3cb8999eb3656c8dd85ea909e996caa4c0947fc8c374919d7a8db4fb0dee12e2eb2ac686baa32d4aaa59e529d1d7b89b9582890e0668cb7f6b78f96ad574844019887573ec7812aa565cbbf6bba41c82c7a48b411e57df223ae071f6910c1c5bd6fe59f1d61176b2371d233b7a95910da6cc731b9b67dc12108c6f0ac55f3af3fe8becac216f69bb0a18f7a92ccee5193a9849e095cb0661d98069f08f25065e523ba69891d89b0b8c1fe38312c322261e21541a3ac2bcf70efbf887e10546c35a4964e489c04504bbc81180de3948c92d4bddf93f72ce6acef74807c4a351b13ffe344bdc1a8f326c255af0915c473288862891fe1beb79195fc8000a9a27ad89866b2b2001d12f9c05a922307b73140b0e71ba9413b47ca05e011109c1fc3e0216178abce671964d08850c0588a54256474328e63a1e703592e19b59fbba6d910f08a8a347a52995c866212b3491c848cd5f79667f10ebd3aa8bb45cd3587b8df022d0dbf152112080d2fc8887e6d0b1fcb6e5f62a91ba6c707b06d8f73a928e4f4f47e6f5505a449ac49254440d92c47573a455eeee5d4f453eed2ca95d8c3e21e7179cbff05cbeea825797741ffd546fd4396ebb26fb4eefd3ad6711cefdde6bd9ec49d9653360c89b29cd6f952c68363da5ee94542a9e6bcbbbd8f28cd2d5eb81aa0635b4c2553c1ef2b6c4c2f489d9dbaf9f45336ec5bd9ec513325c5aab682c994122db71c313c715c006733e59bc45ea3549dfbebb956a3380dc3cdbb5e0f01601a0d52da4b743033201fddded1405e23449f5ba22ef63952077a3b196d4bf6876fc07b8636028ac41493b28f0718dc5279508e1837590c034316ba91acdd87c0f2ec97f4ac348948079ab70249b7198bcdb72b1b7e5b38189a3cf41cd9ce44ed0c73d5e0d250b98a5dab44348189c4d0fdc7816ff673af4a7c72cb3d675073a6c54826690f87a0f429333e0299e0c2eb0e4989a4ade18fa80b1a4fc4787c5dfc938d0759f318a473a6ed78c4c58333442a65bc765b7ff4706c3be28a4c98b546a152860413ba1a034ba9028385834475bdbf4410b8126875b7fc15ca3074c3456e936da2104d69a6f16f0314b30710049a1153ecd4df8883943e2830e2b98ac7b6d5791c36cfd4b5eba2d07f2720d8a0e1e936ecdb8fadf0e5f04ab72e9e28eb27f67c47e2a4828f460565172008004a91cae5bfbb64092207413557842a2f0a3f2f755be23b93d397839a636d97ef0da0c5e0ab37dc47d590d01e0e95a66935fc77ab010338e9d615c84556eacae788b7976dee841d9bd8bf667b723b57a83775c6e45108f720e35a2d8f3107b4e144310b075c7f2f4035cfdedd7715b33bec6d371856e7023ac5554f47e581e4f69a86f4130eedb40cfea0c76ee2985eef67a99a53b685c21ef692fd68988b3f371daafb536a41d70949d8f9fcb8faeda2d614aa33b3bb5595d1a129b1dcb907b244a6389a7e071581f08b9d35b5805d842ef58faccecff909f034ce3c3440846c143798efe23f0e9a55da0fc452c24ce6621135e875da2561fed15093a34d47d846fc78e26d0aea84995d5d97553553aca6bc334f6d38e913bde7b93380aa44446c5373a498a70374272d8adc1f79c09b0af8c068a63970371ae0ae64be7fd20738843ca775a139b427db5bf2874257f29765d290f8ed16e6a495c07db94f4405c47894f893904106b55827500690b9bd01b1bad88f40dc303f843d0d85f30e51f8238c9b0720865771eeb1fbfc477f77f8c700fd6f10ab92ac81c4dd554b5338d4f8dd2c14db053e8b63401e8b207d13d69923fcac532e25bf52e0236427e0eacbbfdb4aed7e513ea8aba8f0826f0501605bc0a8453880e14bd277dacbc71845024a23805fe9979d9b0a6866288865fac158a439607806f0e1a55b9f07123c125c420213097e426e751c72c6aeeb1b9bd0ed01dc0b2f9ac3a67e14cccd4182cf3a6707008d1303f88a10a7a55a59930666444ceb2418cf659c20f570a03a076faa7c7db19ddb97e8e91e0540613729b697d71605c917b917ff4c158661392f5790e24ef9c826ace7076142cb78b574b5a8513d7fe4560dd4d87e0eb7535d9801be02b85818451a74fd277d0d415ff6c2f6b800d09133c0e8993d2ec288e4228fc07f043e43b2796624d3b5ccdf85abf941f4a4e30789d41e533d025a2f7aaf88fd7024e941fb9bad84f58e5c1de5d48aae10c24910a908b025bb2ef12f3eb91722f64653e61d21782a00f83dcc01c7b45fda4b943c951110be8fc5efa147d0e0471533d6d04848019ada2ab20b6a5b9102550bccbabeb7129777830784d62a057e93d8940579ad2818efe51500d132890ef102ef3639c3298d6eaddab3a0444fa9637e244a8bd05c857e7169f50ecdfac8ff5daf1cf684bf5dff07793b3b879232be8e9a04dd9d9c853e913721991ee22e2406687f22bddc56bc30889b457e8d13b9d334b0e66e3c046f3376d509369c451f720eb99d41ee5247cd6cd87c32cb671b3c9a9670f99c6c5791fb3f97b5ded33e3a0cc5e6db4a7084472f354925b6ea3a4ccc27db4cdca8fee1b522c653bfb7a1722a051199464434fdd0f92bc4771ec62847ee65e190a24aeb0938e96b02fc3087148ec27b8393c8f6bc5eb76d31e7f9ec4d81c2f867231f0042e63c71e66f73ab8ef48d86c1740ef8b8285cae27bc4fc5cd99370ca2d89b34d1da4ccecd72e2ae5c46c7082c39398a2deadd84c4379815085eae6794d7d95bc14b85b41b08fa06bc7ca4c94d36c8f5dd1f82a1e55e942d585cd85c93f19d57a9af271608a82c00c01be45f3ab1a662c28c18dd7b3d3d5de4c40a1fc911ab85a135c4b48410a2bd2f5f7bf9df9dff6c921766d01854a938141d9c670d0b369a8126968f98015af2ea64e0394f74f6e41d0da6df604405bf13631a4804d4e9e074b891f4af2f3618a78ed2bed63f8d43d2918de733e44781b5198168a9a41182a744c196332e11b6fce68a8d9567129f3a85d412b08b2e664069c86839eb0dbaceb2ec0abbec4b69ca8c08c96b2c9b32f31481a8a8c4d8804ccc2f998e92e9a9d1955bae2dc8d410b1682c16127992745fb7c08b1f2be9be29e599b65a469a3023c3162839786a26bf3b367c3b37eacc29f3d3cca3d043b460b8892fd95ad95eb42e2f24fc5b9ceafe8918b47460112a7f4fba2dd4318b024b0df55554977c906181fc61ac03458b61dc22853dc12d6feddfc858390928032a2c1506ed5ea31c31619768498f6f649fb21f9da9acbd9e1baaba8b91adf7c076c76da65841b4502e32a8a529960fb32fd3ed2b3f6af24c9472d6bb21c4a5a5a27ab745779f9dc1ff353b21a40fb2c15ed83bbf9e49fbcb1cd8c4bf7be7438ef54e7d3669d42102ab2a47aa7aaad5df53dab1d39f25b4d8f5adf89d578c37fb887e548c17d0174fe7aba2f24128137865569706ffc80d0410466423d8346a894bc8d55470d42f73c9c080dc9b554e9874c172479c35f5521f7a9fbc2e0121d6ecf937aae7af4bd03c51bf2e91d275036c4c9603b5d0a9b2bac7295c854bc2a550ea2aeedb4fd4d14a974da0938ebfc7e6db63f9ce4b7dd19d33f350224a145e890c56f697f73fab10ed5db8e0d2cb0c955bb01f009d1bcaa557c32c9505d9394321f5340f2eb6c3c2ba0831a02458472b3c8d801438d39ff60f945341fe5ade48f0ad28600e0eb33abb7dcf6f337050ea1e4e600ee1ae0b7f0c820ea0c10dd2dc048938bc423d69adb0e5c0f1327a19f08042d14d5853b1b61c5077d1628cc7efcd45b3b63cbed6674ed4a46e5378d6ce1c0072752459f67b238252d5f550359275d2322de106be9359c1d2948add345e5d91cececa7d0bd8f1cb3a7e2baf67c7c6454bcba57b0f1e7ea52c0617f5044ea120b13227420ea8438f0e34721c462cb11c4ab19ea728030c14626d1d0de9e5a7f6dec2109d94684ead8cac61fa88096563513484201764cdba1ca1c56328995efae7c9b4140ec82ecadabf114d032b627e968e6af50a410524d71878f4bc66e693bd9bddcbe708992243746494e008a614793165794c9fffae63bcb513b24a192d9b9a8020ea216c09700662299ab6bf016bac777afd7e7adb87e34df70519122f9d36829af4706288ba0945320310722a58c9925ba9a9f47cc9dcf228f0cae849898ac8b163a5a402443b4a2f6cb7dab1955524988c2ee410bb9de423f4556bfad90acb92f5e3639a3bc8bbf183082e3caf1aabf8031ca08b92e6448779eb378b108765c51ee57173ace5394755058b560a99f59aedd8cb8fb825930a55bac56a4ae502364fae0e10466270be9ccf2dc594ca535787a58be1518c062d1582e2dc70e433a5a7f204e82c48322913083f6fa2bbd9280e2700479d769a6970b8bf334c218fde8fd49283aa63a173f6c4e6d4ec73d8e695a061c5428be834d0ccd7b0c4d53efe4fcceeccf8714ea628deb53a4167b2c4e8f82d9e2a7e8f1737b7211b3ebcdf47f32647579eb68687c4bd42e849a8627a273f7fd29a323435af2539ba9d3174401c321ddb25b6e604782cbe1c4ddd1d0718f6864625a4923f31df2ca62e329192236c5cdee3e58c47375ca4876e28bf8a024f95d4a00e212cb45e0663c4ca76e63e013e281948157f811a26e960cd8301d362036a61122660f9f165127cacbbf1830ef17e533fc3b0fdb2a2633484981444a35f9a9906e8f4a7ecf428e4415d4df370e55c756bb23f250f16463d6a9bbe62510fbb37d6a76200613eff418546398c003371d28caed9e1d55799537bafcff481d45d62e633ee730bf5f82512d23b0d2e91eb3a14c112f618cd78c177085c31d99dc56d5e77e311f70b337f623c32975f470bc8f2debbea6306e9159e508179c822a2a09bd59e48745f99558cce348c67a10c48ba900685280b3b7eeee8f0ac98a7256f92c618b9908f17eb23c2fa79c7bd5cc11980f078211db81cc421218fecd59f8dbe5d0657c52ba6315dc681e1bb2d818ae7e83e1c36515ee98944886f082b9c8aade48ef75db04a6b35d33a42003105fd856f19816336807f4a014a0fde471513e3c0379e3a6a8926154033e5655b5f5a72480d1bc0739f16f4c6bb3fb7f5461a1e38e7fa39804e07c22ed0711ab2439718ff5aa989abeae3e3dc2c92cce8e84053866332f238c81f24ffca788a438345a86ee7f39241d63e3dc6b57c391ecc719849b46dc1b8dd0ea76bc4b5e4b653489d6d512645ae027eb0f21be58cc617ad0c0ca444ee0141fee5a76842b337b9681a814646ab4c578be17333e93e6bec3ab92310af1538a38ddb61754cabeb21860d1c02889a535b3882f420001c228c62d0c0f0448e04f27e9799fa2c062b339c667fc91298733c33fc96171c142a52c463b52019be60d03023540d615b638d471d462bf67dad6cd98ff270656ba31716054d495c26a68d424017b9c25aadff14a4c2fbc24650c3510b948ca04e71cd638231908b075f79525c98f6a904b0645af4d1aab58f4e6dd409fb237df1a699ddbb608c1fffcc6a923f46cc07a45d15be4cc7de8bae70c5c3cba6147de727db1a58794c1eb13eb664cee0dd0666e10c7444a66787c8424845fa20279a2a1284758c30d092c1e7011213b39e01748c89ed1225ccd4a1916f002f1f13217516e020e5fac9a5f4a27d7f92834a1569f68fa7c3989e2cf871d2e436af24d750dd7023bb951183172f26f93642a7875dba5d015a8b0c0c163eec1eb8f85ae06e6c5326785ee7ab0fdd295bc203c1824529f5e5ad5baba8563b464730c61f03c2f562106601e0adb7ebee020b4e300cec0d7ab624647e5cdb9eed45559124c3a4aa17f4d036bdd07cd66c0ecb0085101f7127fbb70170b082da5684de81b53a334c58dd1b841b2cf42f4c118a7b6b856e7292312363b9e3f46c7423cf2a8c7d8d8afa0f468495046b73819ef6918fb9c9409026f1602b4af06c3bdf0e54b31cda94ba68acd0aa4dbcf3a4faf422adcc883532244339a06c5176043098cf23bca61a615d144f66cf4ba9653293b8350bcfb45e7b4becb8284add89e5e7679cb11fa199fa5c186342bab4979985d2bd00b7e15826aeb8256cfb5d835c770379a42aaf35c1233711c103cf44cac21028d0db7595e9e58c560e3f94f4e3932f9db3bcfd86b3643ff486aa68aa8a0aaf9e207a94dd359c920c3d7b106bbbc7f75e2b365283550b065f04d6b111bef6ff9d0688cd08aeda409853f2a1e63c334836c9927b1fe9c66127a33e7f549cf5eedf9f067b20643a43d69c2f0b08333c27097bf926e8776dc7acea9c15134096393053404d34f2f6873855b454eff7c6ecba979270d846d2beee2740baa7b3f3da1d9b9aaa9e98ac06f7b152feaead7e23cdd803c140736bb24eaeeba6041036fa4081ccdbe36037bf6d6556aafa2b37a21c2e48469f9158a89ae4a84c3ea264a5880a6fa09b5bff8dab575365cffeeb3d9415dfafd64731f7372dea6c197063a58030b6066ccc552b2abba47ded72ee5441ee9f521fae70631dea14709630a3dc8d07ee91cd20c3c5171a810accb5bf1885de015d48453ed1e1406ad51fe566831deac512a217669ce3ecf38b941da0a77a194a82ed1d7563baec3fb06bd096726446dd478f0a33724b2e1f79c643ec4a674b77e9b793ab7916b8a18d95ae876d5ec98434fd299d8ebbd9046d3a380b1f43c4d60b510238faee9624e4d970ae615c597c0e6922d617bf3757f0a91a969498ba41d3d8d5de1275ff645cc030cdf62115df7a5e6dc15bb938d1820792dd02a450d1eca93100346906c0d5ecdd6562c87b7b1026965abd86971f8b39d155676a17d1dcd7f1b7350072d1cef5b1fbb97200d3d90ebd85870bee6972703aae7a8ab154a076516e7c90a0ced30eccf6bff180861ff688a69d2d3bb040dedc22d7f24f969411a7dabd5600cb0d8bcabbf05f051960b1a90537c18a9086e1ad5f9288c209175d0b59166a583b158522b9808cbb2930954bfde185d50e7b07b5e7551f467ad3f06fdf043c7fb8da0300fc020f2b885ffda05139f716f76500498a3c3b02cf0a6a3fd4ac2b3e468f9ce2417c717c46aa9eb059f39ef44b09322d9db11f59ec0606d868a555d9684d8cb471ba61515c149532b31944775364b973da7e9abf0859aa41d814bbec8005d353a17d058a9d29c3e92cafd0d1531e06a9fd07069b4025427bb423b75b32d2d892239914a7cddadcf56a49be11f3805d87f16448f713532b2d4d09f72f432b604e078595dfd452a93365309ed55c157eab2f157343e56d5f15a2f657016fa3d1d72f96ed4ac6e2932abab78e0baef1c83fd49ae5c5b6d778f4da23f9e573764ef1cded9d612bbc90c31c9d0852a25591fa27ac7949123348a4357fec37f65709883fc640a6754f84f8d030b42ebf4fd11c1c5a0e3064ebc5fffe7fc7b611e305cd601b5c9336e531b52ec04940b338c1fbc212b8c736fe0c2089e96b9f3a543a74e41b66edb8c4a6ae05a95021c4682903ac42246038b621998d5a0894cc3d839268b75479e228539c7b6c5b2b8d98fd68306a747f37a8bc56e494f2e18c97ec2606308503952030d064dd76d31e7008b341389882c1de4ab988e5f7cd915c9663b2447408e5d8a4563ab12498e85177009a09b02813c7e7429fe1c4f001d1418a09c3e023a9f85fede18806d9f189a0a37f89579225dc33f8531046ec6f78f9f7827558b74d26421046a23e3a43815fcb701726d2e1ce1b55decf343ae93dd2db5501dd4dc597b2d8516fff02925832689b6e9d5b1bd5a6aa9b28537df82d933a01fa82431481b48c08584aca2302aa5a33badbf65095dcbba55d03032794595fa01036366317ed52d68946d93c7d602f51a124612a02d92ad3b9509d52afc24dd708a2105aca456955eec4452574bd81d49cc403d49405ab41a509df0830d03a620955528ec4a425105ab1d88ab8a6357ac6359c9920a4f4c18f20ea09611d77058135931f40811078741471426efd66f9e9bf73cf4bb8f7648ea308176f21b6027212f441f8158a00e041a846bebdf14f9d06d073d888850e0a1618a77b2bd3741e67e992d3b09e0c9612eb776df13df07e42fe47495236520c81ca30c9e7aa75c9f7bd8ea601dbc8fb54ebaf19a42fb85248b9e852e94e452e6dae5665fdc07a229788a4e7408ebf066c59c8fa3cdb02e3ddc9ec696ecae75cd5f8e6c5c224c689a6eed74c59ea7faf6282646f3882b7f63754b0e19adcde9ba074d417eb759145a673d33e1c32981b811f8fcb23a885abb3517706b67b3f4e66f09ae76d1230751f0f479d1e156d62b10e7c9f474b2c61f3b7f4ce2494a011ee14528468997155dbfa81891103456fee1666a04732e3109bdcb836a0ca2510611ed8e829bf12f0675e1729cde58f04d0342cda36b4a2bfd29c6db03d4f3c21fcb48ef2470b3a6870d8d710dcc99365deb993bd7402abddc68c86a9630aa3b592e264d45b6bbb802770fa96946d6101b201d9dd869c0fa3b440e03d6925b9efa866009447ff127e57d8282c7de6165cf19c0792129004b6ec03141be15c8b46023d05516d55d555e920e46f99fe3aaf2cca04087784f42954e6043b89370006d1e74799830d8905407c1696f267ff4dfdc7d9964e56db885c29ddd5fd456ac95813c809f9988daa45310488e8b3eeb4817c0ea4c589ec7442ff7ec1e5b09f10e7118cc7a50bcda40c960fd19283dd1b0dc618328e751961a86e9e310dee49ae0e4b12e2a2d1a93d5e92a8e999c5b3fe97e1619dc6342b3d412381f2e8dd4bfc4fbe78569d65eee350b759892ea185583a29f18f5594f653f6ba7cfad00fcd33fcaf992e399be9d3df4124ceddc9654bf4b8726b612542bb11a1d01c3ecf0fb8509438a64a7138a1196cab24b7b580acbcb1a71dea816be659ec597dbe848706183036d8181ed50008b0a67bae2135d5ef9880968c66490649874bdd83d84ef630ae1a153648b2e0d840370a15d0a2f76e018b02a0cb6e0d363634c1692abfb1273aa91306d8d4c77d96159e14dba5d526bfeb6fcec58050d85c9c253669d746c43a3256babe63fe0eaa603cd13bf4910b33ad75c1a6553b9822a2acbda745f8625929fa1907f2f73ee84c428cfcaa55c652cc7ef2143ad2f5d77bc7db51ec0ce87786288bca5a39ad06a8e460af61fe296829292ff14fd008e089d70834ac191425c43b3a34c10f19f00ccdb639541c1cd51e6b21db33b70f5bcb898e707ce2f9bbf5d0ee5acba5bea6249707dcf77075ddbc0f4b6353bbadb2600ffcea58f1f09f4cd402c4afd59ebffa0bed18dc3953772cdd689c2c4635bdb3d35f768b795960a0c98083847b9b135d1921c5d039c15458c7dd82be1e5adc2e61da6fefc311fa43c0638c83875b32898cbf41acc11f44d94b0cf6ef4b2d0e08373cab80e059e0fbcecf592780ee264be7ff33dce50e5756f104ef45e87540f8f5e1a78f9772c9660efd591feee60acaa103c39a7bba4476a3fc27363904915280082ec008cf020abfddb1effcb30501aa9b4d646899419a5819453f8952fc348a88eeb4a5a0382f72944e22ef166d09d5e8c06fc8fb9808b487cac3a84ac4555179c66d3186238ac0c20c2bb0a1537a95dc0437cae92e58df547754a3cbdd2abaf32ee9e12e41c8094b053eb2ea4a75c00b1f2de4ea24f356cb87deacbaf436a3e07d098d138965aac0dfe985aa8b3f7eca8c47b6bb36fa9e154af9e7cafb2ecbdb0a51eb653d2f2327b0d0a110a7f5d2e2ce2393852f6b28e9d77aaa2fe6f83a967aae95443b8299aedbf0264b14fac4af5e2276ed287a40788358950cfc95c8d1378bdb4239b91bb9af1f0bf200bc07af2ed4395051a44a5a20d7e8d205dc11fcd9800416f4e2a060d4b98c549e217c72bd47557a0723edd7ecb1a8b1d1c5e8c780f1ef9c49b085c6e5fd82bf4ce799639107f051a214da0d03a261fbd56f990077440db3c353a32c79778bcf64d2fd09a1e53e9d77bb7e2515a9bfa60fa0d30d84a180246cac0d1b8cac9740052b046d66214b24cbbbb1931a872e5596f0f2aa89db24769a332f651649454fc0d0e06e086796bdaeeb8f1465c2e18d42d5d202b2ceb9150331f0f9308ce51f497f3c02edf6a17fe43c5de4965ac5f0b3476e682c5365add9f714c72dc4ae92862602c322a1aaad2ac0f4dce08f67b315438a4873a39b78782956b53c831e0da4339b95e42f014930b0e78ad2114e2ad0ae45b4c1d8d6c3eb819e91bb56272a13e3d9fbdcc10a8a6a07666373dcfbf97eeafa94c0f2c667f17a5f677dba5dc7bac1297bd8234d2b178dfff60aa7c1dddcfb53180aebf1a2e2c20a7767b955a28e695a5646093f4aaa4df153cad65270ad3ec7aeebd5aa66692e06c6118b79a50180157b253cbba36d7db8cbe858473d7ac274321b9748daa7db990c88596bc87df3c2072e036d69519610de93a85b2e9f394d5c07a9bad16c99529daf3721e70464786323c141780484374096d326107622c54ddc89d3a6808aee543205b225109e28efd9675dd6e36ae99558672b9aac44afa300ffc194062c223fec844d7080feb4e7ca5e8203408f81fbebd86530c59a64c8dcdda4ff8bec827235e7f6adadd76c70c4d6c1ce55771ed874281ec6bfed27a866c380298170d73fb4a1b62c4b1ce47b5f31e998c4aa097c6dc54aa474f0f779c0be2f7dee957c27904d46160f0b9c0bfb4c34f38f63cdbe153b5db0980874777a26f740d0179081ca472506380df689cdbe8d75cbd6ae9f07f2ee94dadbc0d18fed21d4057a2479f8709438968a0e9d95faa3c1a75d47ce8337dfe7b5150ee43f5684a6850dea066181e57a9ff34798676d027aafa9eac41a7289b6b1c069a57eaaf274b0e4a8a6c870f97dbc094c1a6854b5e5bf5b6f79c00e89485f9fdd0184fe934a1f7e4385dcc104b470acfac92016b787c0cf2c6612f52c0ef9ac1b0e1259b9bca1c2e5ebef16a1954a87cd706b236381790bcac74481cb3067ab540074b027805ce718093e4b385d8e3a1a1a73d8bbee4700d914cbce5399d83400c3d0299c116741dbd5cc000860c8bcd37d4f48a3ac323e6b5d42149f13096c5ec2075895577bab85d453d2ae09aedaaf79de4f6c06b5501f3f262c5140eeb01ca84344546cfb4ecffcc3056702ff12ad995f94460942e11f40a252339dac224ec41796441c2c1dbd15911b941a3b06c663d5bc1b25ec131da7999eb6099a858f80799d014b1710ff12d1eab1bafb2c76dc82668d719ff2a95b2b97295b674acaa2aa34751a41b1e978bbce4553f7524c1dd13b9816988d5f7f7991de8c66ba2acc826a8e9a4af8b524f16c21ab6796e6caba2ac1c329565f4e41da67011dd6e79e130ea293ea51990dd55bd46d9ca8150fef2488b3fecee29526f16518f8cbaba0b6bef851455da6fbcc0a6af2551d231620e4df5b33fb60602c98792387b1b778b4bc199b09e94b3d6ccfc15910b938e6f19c001dcdd266364da6b8ebf8c282ad584dc6049baf9c7b4d185a5ec819298f6ae0ce73f5af6304acf88edaa9169d701172f38ac96119b3c2263e00ecfa44f1e2af798a77630f6a5bc5e31af8ff6319fa39c51996754eedbbd36753298fbb90662539cca7d5f92bb8b296991d48eaa8ffac1d71e909accd5d652d70767676f2651abe22f4bd59dac4db107a6e94d701764188db0dbacce61c9ccd312eb224bc1c2372c74ab85b8412c8c3687a89908b2b01e16a2d302bdbdb07b06c3c855630f07a385916fa1a01b2d64b9758d9ca8d3160247122aa51c2443687441528980ecac44eb415244443b249e10c80a255291ec13d3c973fe9d2052401f55fc4bfb2a3c458ec0ddeca43cbe9d8c1529fda1560d0b072e72a1239275317b7ae176146faefce26239e72fd08bff941c756e25c356b8a5b1387ae7203b99d93c533ce918f291774aa16c151953a2402fa470aaf2a78e7393fd9ebd49c34af2544495c84120ad89a790c3e124bb50bed6a9d3f2a7fbee790cce8f83603ba5abe8692330aa8be04889aa2981cc890ead911e82a534f905541e3537d0669a2015d5d38979226f6aa7c430c99dd2290bc91181ae92060243721421e82a71d058b0347f518ffcbbe4b473a09c3c57e4f273528e758bb8a8ba702cc3767dd03aab3d89da49541594d14f38ff64a6ddd1e3fe3939706e96d39d61079db7a4268efb0bb78ba014f9ac317d1e6a656f7b15a7db94b2fa79114e645832f5436fcb498b46a3b205fc08e462022af87fa43850b2a4d001c33f3f3f3f3f3f3f3f9f73d3906d1684b620939469a31446b2dc0b4a29a5b4654a6a0b8000087c70c012421ae91e000000c0053a0a0d0a4a0a5692bda881c2f8423d6c61b698f1dc1ea21b6a235e50a0101eb530ed5fd64a723eb1a2dd1b6a365a9023470566b003c7c9f1c58700bd0c704c80060d1a1eb43047135b53eab20ec68331526304e58840e2c01f1c3942308605b20f1eb3309ca724daa710656150516ff2480b8a854979479df5d8f20e1eb0302825cc48bbf495454d268081911a2315e057188d1678b8c2345b1d4eac57ea3a8d46a2078f56987594492ddd38f1ef345263a4460d5618942a7d4ff9a35f586e1526c1b39c9ef7fcaad8390f5518dea4b29c27b63778a4c22ccad389a7c412f478fcae0d1ea830899e97d3aa67b1924e61188fa19572125398fb54ca106d9d9defd82869f02885497850394eca16742d6a5648610e57c9e2292f1bd3ee183c46619245b5874a96ed5ea5284c3acc6762b40e1184c2d8b11e7f7b43a030f77eae3b51bf94f24b058f4f9893f4ab2d492f4f18b5440f591b3ac76dd1143c3a61cacaa5ef832c75da8438615ecb23b45ebad096ea4d18d73f89f0ee9cfc4c85828726cca94ab0cc8f2b61629509d39dae30a24b18136653bad44cd6bcbcfb92e07109a3e598854b3f3be5314b18c3c3453cf74a8a1fc24a18cd948fbe142b99291ac18312c6d91a95b3432cb5741b62f09884f1728cc927ddafbeb22f18717c41073cd0810e64e0a4e02109f38cec6ee8b06ca27507871839bcf817b800471820b8b103870868d060824724a2e00109d6a424ee7868c5e7571ee1e10853529e2774c8fb24996836c224f5a5d8d9f487f724fc82e4767830c2643a8c68bd7815bfc41d39c2b071b70873d0a25437c5bfa18625071e8a306f5d579e94939c52ab47228c7dde79f24605d596bea196032d228cb1a36b22f3c215781cc2a03a6891267d4ef3110d1e8630ba9ffc0c11954cb49c1d6324e50c1e853089d7f5270d935f2c7667060f4298644ea71339aa1b6a2b0803c7ef20cc1f97ea56dc1ee3053b7ac7078a87203c0261343ce001085387af5adbfebf9ca80d8f3f78f8a17052a5879c286bdad57af4c134ea65aa12060768d00823071f8c9fd331c4c8a14302601c1990c1630fc6f3242f6a563b87986de0a1079330259d5c9ee9b6b91e79306a997ccb0d255c9aece2c114e48b88f7512b39c32778dcc114fff36887b7556aec6107d3494f5151265907b328e1de25e496085379d0c1ac713f42897fc14b9273430d061e73306a56ece8a7116323bea12607637e7acdbe3861e4ef37d46c84816305ef67235e50008c7e1d3b3eb08112d87081471c4c699d82e9fc92ca7409181e7030877d339df469cb9d72e5f10683ff9d5467799212eb2d1e6e30cc57c9163c3caba9bd0d26e95de9b3b4e820666980071bcc593d2d5e92d4bedb084be0b10683360d79154faa9c530dc6f5b3aad9ba5ecf92172335464030d2810c70c0230d8ba7df4aa2eedfbe1bba4ef040c3bdc0e30c0625de26e938c94b0cbd194c628b580fd6965554be0c861127c7b1da50a67e440653e82489e75eac53623406f3a72b1d15b4459d50c2020f31982f334c99b5a8b40c85c114e792ec78c817131b0ce624d77ca58e6e11d22f184cca9b269ea45cb4097bc12084342bb13fcde2dd059334a6735469cb857d43eea8b17c6ec16cd248b1642a295582a805c349a32d5d2a65c15c29edafc9de61b2775830959e376d592a5f59f3b8029fc39909e332ea15f3b082c1dfb3ca272bd5584f158c96f4857e471396b753c170d71f46291fd9d0de01c2630a066dc9b4748aa717f40a8587144c9fef24534a679cd48e0638c0c0b1430c0e2466c3131e5130e7243c8eea38553fe9b2f38082f9bf4c8aa72c0908c4c8a143022f013f783cc1a817ca763b5f0f2718d34aa73dd94d4d288ee99cced275269862dc0815abea62b467a4f0588229d55e9493e4ab0483be20e656abcf464912cc3b52abfd94ce45916076cba1da7495144bcb2398c43b7d77dd69646bc508e6faf441848d5684cecb824942474430e83b25ecde760e7616053c86609c535aabb2f267955f08a64ad263b7e550108cb12bda9682a9e07e03c1a0e663d465b5f98cf407a624feae9c68dd1f46e803936bdde99482ad8939e981d9ff3df9d58b9435151e98cfa38a4e9d5d46d73b30ed7e1ae5c1729c309e870ecce5313b09ff988c5c98e52ca8a873bf94838a0b532831e13a254f7dd3b420e316a6d8a593eac83a313f6e0bc38ff7e54f9596a4b56b61cad1e2a74eefd1c23457d9ecf2094aeda566613a33a522c254ee5c235998c35f8793739e58986b5f940e965627561816266da29aaa645b62ac2ee315c678916b4f51e20a9358f31f36f2bab1a70d848c5618ed4e99ab0591dd49ca488d52f82083154653a5e4de6f11a593882c3052630479800e325661fcd25e4fa9ddd9aa3f830c5518f7f3c439498dea8c522a4c72477d5d25e9ff9f4485e9f6aaf2bda7b59f1332c83885d1c013c8308549f9ff9bd2292e853955b6f38e7c13534b37d464902279ba674a56d0f10d3519a330565b5b2ed13f89d325566488c220d5643debb96484c2306e37ae9e344f7e5506288c63a3345dbc3dd49d7020ad20e313a615e9beb5565d52be504186270c26db85964e6e172bbd04199d308a696ee8b55c495ae284d96564eda9ec24d9853761cee1d4588533718bf19020431366d1731d17de4dc99dcf84b172f8e4255c4fb2b862c2d8d152b5cff79730872841459a6026fed996308e96e9afb0fbf3701e4146254ce2730efa83288b126450c220769d4bfdd574947012e6187572cac944be691321c89084a9c4bf3655b28268bd6544c2d469a17c3d3ff5854c0624cc9526a85277ddfb94c6828c4718e72b33fcda449a9c3bc224e7646ff596f3e6d708831eb954517682b09362845144ecd2a81295b1087389962e28f9be935fb8c850c4f1f5e1bc543c11663fc1b20595538bdd21c2a424d1df73c7fdab3d1dc234eaee2c77a67912840c616a4bd3fffde3332a5c0893e86e574ac7d49fb811c258414db8d1a12b2be74198d7837e096df191274710a6ec9fd4f7f9ba5ba98130a73e6d79e6dfc4a40a08a3451595e2c2c4a80bff60560bbfac1e3ff4a8ee075390ab9d53ef66e6f27d30a8b8b0f5d92b7c3028a5269d6cdd72c1de3d183f874a9d640b1ee4757a30c876b7dac898fcf7c98349124ab4a0a3cb7830e91f5d37692c5e9e7c07735a92daf9fb53e68d7630bbdd97ca4942e47d570793fe4f92b5657c499da683e964fbf4d93b37428c73306dafc9222bcb09cd530e26b9d7935a119f79dfe260b8fcd1847bea7cd0110ea6501dfb1f84495782fa0683b6d59a9d0acb9f6c37188405d73db92a0811b30d26f5b3732b25c506a3e53873955d465d4d6b30f7892ea9b34735985bec92458f9d7fada6c178aa4dcabf1f4383d9ef44a9cddbff68266730ac28754fc287b5dd69065354535f327fff3bf232982a2dd4698b9f0ca6a4965f1ef74cb42e63308c109f67495cb89c5531184b0a577749468e4ae93018e647bd8efa0706737d50e3252d2ee30be6d2f4cf27a813d6b423c30bc6ba500f7aedde714b6474c1a85ea74acfb899b6900c2e186bb44cd679cb4a1f93b105d3a9534a4b3625794ab60c2d1894496e15e3b4475429230be6d8d21a26c2a449bacac08249eb4de6553449484bcbb882297fbd59c9a95630493ac9bb322144239eb2b31ff96ee325ae1c0d13429e54c269894e504205a9fa95934952893e8b12be4ff2f650a2b99c5afbb4d27793b8c48ae6c9d14eb824815c9243464fff697b22613c71e52cbda5bf8f224820f6044f1dd44798732ac92f3cfcf6c58f23caaa547f41a52a259bd1088350927a8bfc10aa74d5f13b7098edb000c36106234c9225d96a3d278b1f428b305dac919e93cc1176ad224ce9bf4fbafb13ff3f9a0893d0a7f49c143ee394bc000c4418944a3f6fb2440b61e943984cedf396ca314318cde3e26b6d8cac4e298449e9d85f96e8ce9e9a186610c27872794bbc68279db7a07750e030305263c43030e2450646c0306310063da2b38d89b39d59da3143106f5fe85f5c4ac21f884209d323ae69e71f0744924a4a4e3b7e49fafb0f880927a7cb59eb2dc47ed852c3f25c57b799b40fbf9850594aac382f1e1fea68e29f94d9af4c8c06a3cc60c61ef43319bbad756215a3c128d3916347b31ecc37c2bab39669f3fbbf2813a3359033f2605a0b2ac9f15a4bd45d66e0c166dcc1e862b29b7cae797dfa865af930ccb08329cfe5ec4348954b691d0c97c47e4b6cc7bf731b85197430957095458ff0e76014a53ba9fde8413f5d3998627ada0f3a85fe9f340933e26058afebf0ab16e4870b0e065382d8ecce396f3096124f5ab9b51bcc96b6e418323227294b1b4c52b9a6f5a82496c3891a61061bcc27c5e5c24b751c21a44398b10663fec553f2ca3e9dac1a0c5e276b74d0ae9e7288841969307550b2b2c6e899caa5196830e759c9cfee9dc1f049b89c4dc53643b2a9799aa8a56571a2cd2883f1b593a42441f5b4795784196430c69e97281ee43b29e131982b941efbe07ad25a540c2659d47f12a4e90b3acb30185354f65d91bf7ad903065312e47e90e2c94299a42f984a79ce980c6997b4c70ba64a3925bb601272a653b908cf15b960d2396a2d9ad4a93d680bc6d6ebd45542e7e036d282f94f7c92c4bc245df7cc82d1e4f0b2160fe2d36d58308d9dd2d94914cbe7f1154cad6226727c74929d640583aa09fb3995309ef556c11c3bbf429d4a579532154cf2fcecfeab5738154ec17449d259d5c2da6f65a560d21e174b3caf90b12e0a0625842c414bfee5111628187bcd757d4daabc579f6050e2a5e8514de84e49ca0926f1144a4d305e34e16fe2dfc4540b134c52a7a0cb949e97603a153bf32dc6a53da1124c26eebfa45082b0e4952418643c577ac5a970ca4382b1a4937b32445c7aab47307d5cad785dd90d352ecc3042dac450e579612b8249e4c931c353b54ec44430a7bd789ef2ec3fc9d5104cd797155fdaf4a71421984f68ebf3cf5e9d044f100cfef326cd53d2e9ad0582c1a39c20647be489af7e601c25c593f4455c77587d607e2dfb1af559269feb8139ade4d2b279f3c0a04d0e572697366307c6f89cf3c9d26a2a2f9ba103a3aa7fd6932f95db2c17c6d32faf1c6d8252fa820b935abe3bb1d3a90fafdca28b71a5c5ee4b6c613c25f797607e5a43c8b53027e9f9354f8a6f1a262d4c628429ad6072d4da6761d44ff1f47ea7997b2e0b5318a91a2aedb1309b9494ca509edf9470020b93ac54db2ea61ed7e52b4c71719e7de27fde4fbac2a0bf252ddfffe7e7582b8c2774e7c688aad34f6185c9cf529fa7cff952c45598e2d849f1b2a85449645598debe4b684fda5498dc46e7efabd4517ea3c2604a344fced693349dc21cd722a74baaf6e0a6290ca3ebd25950b6ebd92e85714bd22f59af839ffc93c25c2da72d9a9d4893ad5198d6c36de7131a9fbf1585c982ce49a1f208eb7828cc35722f36b5745d8c4161fcfdd01f3e96f8a4eb270ceae7edd2a7a825e8bc27ccb9fd5663d924f33ff9e884d9bf2fa84bdb79255a37d43e3861f834e7494cdeac313761160bd10ee2b3d4a892268cf9e917be25de5c9a09b39a1c5cd4e2e4d32b73f8c08439c8958ff2329ed5f29730bac979a11a224b98435c4eefc184fa73bd1206e9255650173725cc69afcec4caebdccf24cca692144f8e73af9d9384f13dbfd8e928ae65244c5bf29df88ad038298684e9fbad3cbd5ab5347d84d9b37c6af736419a071d61bcf9fd3111e25feaa41106b7245c979cf6b5748e1146b70a9b227416a53dfb5884c1c41725d856929374e95484003e12610abe22f6f249a62d3444983e457c8cad249a49265df83884d972d0ceb93e3584497e67adb494dee5ad10e6ef586a4e644774a5720d1f8430668e854913468f38e14ffd81e46310a654e741e88ae93752bea196638c30721cb33cde40096c5ce04310e6adf13d154a7e0739f90884417968ef1b2d3f0061124f28a957cbbdd376fb0793b4fc9bbaa3444bfd60b6def334f29f3e18f4973a0bdaba3e9afc0d35305e63f0c107e3b7d909f293e4c71e8c2798d875a2c50acf272fc6f8d08339abc4dc7d74b94afac88349fe93ad454ddefdd3f9c0835167f76d4c522622b78f3b98a4ec175bc3dfffc4ff610773e8da5267e2258faa9e59e0a30e4683051f7430796ae94a5d3d413ce8869ade88171418d981030c1c5fd8c80d94c0860c3ee6d09c5473c13c5e8cf021872d2761e429f14285350e66ffe8494a8227197b824379c1c71b92644b774db020c423c6871bd2a15ed37464c4246fa8e30b3eda60d06a2758864eb2c1343e4a756f553ed66050274c8e8a1d37542af9508349526337da44933f73b68f3498f2a7e09677b1e48ee2071a4ce2bfe491275fa520ca8f3398c35858aa14bed327e112e2c30c265d52fae91cf5e3c89cf5f05106936a5551d1367c90c12c3bf273d0e9d2c9cb661d3ec6601ccfda270959e29df0a5184c42eca39e78fd4952f14c1f6130fd8baf5dcd8eda5e28f800831d7ff345a834a3927b432d06ad033fbe600effebe9a480f0e105832a939e45291f2558359af0d1055336b1a495d8881c95d281a33bf0638c5190f0c105738a9854492f3b058bdf160c5b495a58972ae976d282393b7405d99f710b1f59309767bbcfdb41ce5c89b5f08105e3680fdd61ce3a35ce2b98a4184a27cb173bf3fba6e1c30a269327cf9be859c2e382868f2a9872c4c4b4764a39be4f05932027e458e568dab333059390117692f460424c56860f29183b95cea24b0eabe0230aa650a5a48a61af083ea060fc12b5237217b572cef1c50c5a8c12848f2798f4c97e920997dd50b3fbc187134c2509df52958d1ce86cf0d1047350c9ebd34e1a33372bf1c184fa4596a531a5622307da25984b38d1443dad27fe1f86a141638c3d0050e243090661daa27858139f3bcdaff8488241c34f0ef249d4011f4830e57a1172820e1376848e604ef52746f627b7a01d239844bcde8cabc71f4530c595d055f6997a212782e94227c1e47c4aad657f0cc1dca16a720a1f84ee10d1d9043e84608e26091b42e477495110cca3f35e52139408a1461f4030c84951f5ff232e7dfff88139468559b0915b2afb58f8f081f104b120be25dd5bf27b60f4fea4af2a9a101df2c0206444b68bb828d98255f8d88161cbe3354c2e0b4aec9ef8d0813997c926e8e90515b435e2450646ac141eb930f5259df5ecdac77b1ea931e245064668142b3c70610c9dfd6af93e2f0531310e8c789181bb854955d3ace6ef5c8b302933bb2ce39f5fcd6382104598a44eb6973f73ece7304212615262c99d276d5b28d3bcf84008220c6264e53779a2ba738e8e1723877e117208737afa609e63a227e9fd1d3a728c91dc881714401c8418c29c5458b2f0b53ac973420a6132493ce1a4d2f6d6bc4308617a93472c08edccfb4ec8204ce25759b6783d4186270853785c391153b910120873a5dc90f649ab78d00184f1746ad1e35919a7db3f1c8d103f98837ad8e5934b274f5e1642fa600e96e4202a56f69df97c309d24fd5c87d6865e680fc64ba9bf53e69fca62ebc194daf2fb7dccba2cd93c985b84127d592d4d2e291e4c49daf2ad933b98f3e5b4d809cb0ee6a09da4b5b3bed8a73a9854091723266a217430a9ee242e7bbe7cc2a5e69098b2156339642e8657d68e062172309bdcf1ab726ef5aa1d07533ad57d964e9c54bb32040e460dbb24560ad25e4be90da614b7f6254229498cc90da67c5253f6c4d2aa9d6f83e95a4f92f4e79c6a68d960fc5241849a7431ccd7351843c8924acafa76e1a36a30e513f44c4b6c9a70c134987cc499fe68133418b48bdda593c4ebcb9617881172067338cb3a2323ee1fd42166302751e7e5774ff546b7849032182be86855ad2f36ea93c138963fb61ab69f3b34069350eb14e5a4f068412d0693ea9f984b955ed2e7301884d696bc718fa5c4048329c7efe4b026cd4952f805831a91b73337f1824989a899934d922e98334b689b1454bafc142e98f52a69352d233a3db70563c8c84ffa4a9c128442b460aa93f4cd49d25287d530240bc63f71be2ebde6eb9bb060ea51f24349dba19d84ae60128bcd132ec86cb3fa5ff0459f5520c40ae6f4a673bf9cd6cdbfe610520573cefac9f2e38750c17872b674aa3d0573ba249c3a29c459ad468346181c302998828d72318fa75b17954248144c953dfc770c2fdd2cb94208140ca74e16cb1efd2d744643c8130cdf9f44b914444fbe2437d46c3cda881714187984030616e204d3a9eca732278bd8169d21a409a6122b9a7c4a9e383a486fa8d9086182c9e4ed53ef5cfd6b9603415e206409e6301d33f750799f829460548f32cadf4d50333949309c52975f117769a6448249c597eef7d2edd4b927841cc1ec29eac9c70ba6b39b0d5b448418c1a426bf6ad25629889022982db72729a7bad8d7cde810420453afe791a54cc786902198627779fe271dede4620789102198b7548ac56eea955a2a305263840266a4c6880482608a4bd331fba48529750e210408e60e2aea79b0f2af6df108213f30750942abc5c927965d7c604a29c6afe46c921821a407e6341654c9b9b2a8103a0f4c266a49b172aaee9c951d98a2e51897a399078fef8210a203937faddbcac9299494940b93d8b3b4255efb64890b837c09e2448589329525790b8385cd95fc7a3d9bbb2dccf29f154c3f86362907a416068f6976a25c9816e6b0781916947752cfcec230bff2ee41ca8b0e155998647b50524bb64062410010589c1190572c00c41505d28a1c290c1c3658b10a10552800241536bc4000082a708801813f611800e414070031858d04809442c7b740478e1824008414361600320a518c8100905010000414332800c827c6180088270a00d2890f104ee01001d9c40c104d04002413202098c02106045ac70b2020027209538b6fe9166d2a88f22d61f4aa3e417b754b3a2b610a9df114379e6dc243098330ebdcd9654e49e23e0953271b2da21d4bc2f0bfebc1c2b5913058eef473425b6b68151226f5207795fe93bc9f7c84a984effc9eacc411c61394b9bf054ff17b69847994f6c60725b3c130006184c92de9d43bbad935fe224cf973bac79ea07fe15584a9dae5527efea3cc9a08c3edbdc80a56e22f4922c2a89fe5c14b5299d749c6003984e947f6e4ec1babf59921ccf12ea5d1eaf9d179d9002984399b989356a468932d08210c2696e80ffb792604e3bff8ffc280f15ffc064a60a3410661ea3cdd2927f4e4fa2441185636ad645d9a5d1c05c2f066e7a2abdab6b20710e6b7dc3b33e69ef35b903f184d649da03227d57912c40fe6cbbf554956fcffa082207d309ec99dafa49f437435d3b1438c2580f0c12044bba7139fabd5d91ecceff5bf26d496a065ed8e1768400f26932577b6af0e9d3b79308978d0fb16dae39b070f06a1e6545a8b634a1ecf1d4c6228e93f73327492dbc1b0f5bfa7a6e7e5f3ae83a924f932cf613784dd743055103b25bd5f5a74770e06b558413fb69583c1c4cfde6a72ec78521a078310a526de5b0807b37a474b9d3ce50de690133a998ef7fdf0b9c1b0bd319fe3e28cea7810206d30e77c25c7ca57ca59942c0e206c307bf22dff2c9d8286c3c6d3a0bfc81180acc1a44a7da68cb88d93aa1a8c2e968352a624f97b2776004983f9e29ca0f3454fa2fa07418341896342ef46889294a43318de6fedc6bbbbb319fc8198219de48925680da14bb51e8094c11c3c75bc92cd3129ab36d4fe004206632751dbfd2a8589158dc1a44aca8ae5051dfd1d31182b49a9ca93beaf9b74183e258eccfecc0c0693f85bc9a1f3963ec55f3077182f61df7bc1a064df24f1e43b3f71bb60369dce6d4e5a5d102b170c5a9547afc9e5168edab6f59ff4450b2615ca36ecdd2c18c496f8076531bed7c3824912a774baee2dd1e4573067bb9ba04496cd57cc0aa6a44b070b564a7c4ea9648c30383052630485810303233546466a8ccce03170638cae00a302a40a6631a53adb3a890ae65ad1a293dd9f54629a8229ee7cca1fb62df24b5230f69b7512e6727de54f144cd16a334e1c3514cc157d4d2cd967c3d4fb04c39fdeaa52634a1a779d6058d3f712bd67134c953b5f97dac80b422618dc3f8a49e9625ac8106409c6341d4f3e3df2aba207a204534ecdab2a49ee20b603498249d07dae95fb5f95d70db5028204e35eb894f3b98752cb74d418f99f400e2f2c017204936aed569c08dbb2f48b2fbac6881719b8b1038708fc0062043c2045002182f144256992588ad5d9a58e1d62800cc168241021987d4cf4b6ab94ab7328710348102aa1eb33adc472718081e38b1d638481a368a0c6880846bcc8c04829c943000182a9c4fbe4a95392e474f70fcc9dce4bd64fa17c7b1f184ea88b62aa712ef7c024feee527e1162ae531e182e98bbb98d12901d98c3e79f754e4fc2281f440706e563f79e4ee78a32ca854137dcb4dd09c285b956d6bf5216152694b7305bd6969492dadef0a42dcc973de2938bca7215d6c2bcf5c94dff4f6861ca49785fdd2ab525bd5998bf33547f10113a3a938529c96dd2768e297629150b63c99f16bac4d2f92c09166657598f37d6f75ff15798564dd6541e6dc2b8eb0a9328c13fc74d28bf58d20a9318622eb8cfac29e16385d992b460616e3961c62a30953b49aa30954a41998ef76e9ff45418db44f760a52aea312e61062a4c67528c7df414fffe572dcc388549b84e722244982408dd1406e1bd39b2b7dfccd4a56094744a92f7f2e5741b75235e6460a4c6c89ebdc032318314e674fd29a7f4c934391e857994dc666287afff8da230496a26e7385bf9c4a588d1609429cc0805265e9bec3e2789df82e22c27ce9ad87fe20fb9e2d94c0aaa52ef894efd651dddefabf97422933d78bab05852cc3951dd9f94d7a44f5951de849f4a7c3df96a22fddf1956c2681365c23d3d9dae84e74831f11e09952ed060eacad559b5675a533d83417596ce722a89194c92f423c47c89f2de170d1a37e8a20ce6bebc9e7d7e82cc3f7940176430e8c8be87966479923c06c3d8cd863629bbc56262307d8cab8f669b5f95c260b6e4dbe5f216c485e571e8f022d9d105188cdd3946d69f58497fce174cf529479cd611ae79d940096c84d185174c964349a67c3c34c4d405b36ce787c9b9604ced64a64d8f8eb4f3bbd882294df78b4e9fa205c399608216656a829d290be660a2c794b1a4629e410e1d3bc678a41978946303755830274910ea2a67699f4719e0487c05839b9ec893b4071f936405539c962426759e9b94628d2eaa504eaadb849587fc5ea860d450929752aa640ae6f8a3c4939b56674aca17396cbc0eed401752c874d9855171666a1bac822ea260fae8b14d5fe84b3a7a386c70a00b28643a25d5a9b3827a9e6079091e679e138c35f2d3add7e4ac53dde8a209ffa8f9a04b92a4cedf32a1d49754db4b8d49ed74b104f375f8517932eacf829460aadf1adf18257a89ce0aba4882795b3b2c9bb250e2e74830688df83ec1b37504738815252398d547caff99dbe6092a82412cc7d36eb3fbf72482a9746c487bb1ae2e9384025d0cc158a28fc92a3371755d08a6133d651332bd6a4f368c18e4400b741104f39c0955aad5723ab980601cad7e4aba28f563e90f4ca3a6a2bc2c5b73543e30e8a45edf244da08b1e9883dc0f1db4e4bcd4100f4c2a6d9708cdd39fce455decc060a3247dd1548d0aa7ebc86123e94207a633492565b9275d4b557261d6b4ab347ae2ba2ee5861a18c53e20820b737a915d17dfe6e3b203076f40e4162695a4a7d03a0f51a7dd50b39163c759ca914347076adc05446c610c559fa6625d0513fe1588d4c2f0e6712b3a28d1c2d4154eef8e78be5c498ec82c0c424e322956c74f11fa8d31fa460a446461d62ed96b67a32ed48b857994b23f653a45e7cbeed0456061529b9d5d79dd57183dcf82d2772989f3a72bcc22e4a52959435543d80ac3ce472b4b6d66164aac3049ad1335fc24adc25c254cba47b54f4bc2aa309868e5a75e2b4f8e925418f5ded39ed4fa9dcd4220820aa3899af9d8ff113985fe40c41422a5c84b1274cc6ad0a0918890c2a44a5a3ff96ad409931b8529e9370ba1c4a7f3bf446134bc20120a83aa4b1f84b90814bd772addedbf1142e413c61a61a2bcbfc5e7ad2d6710f18448270c5b7a7f4c5b488413c64fc953b65ff05492706d22f7137f2a5a9a30404413c6cf9da396a2a98b6366c2587f4979875262c2e81e6bda4bfa91a6532297485491a7fa72a524552ce1299d4c3aa1632dce56895cb3d7939c2499b1aa062294a8f2c424afb14b93b3359e84b904f93671f424516549c2602509a27238ab9cf68984e1e285cfef93858441c73c3968f97c25e8e600914798839c1137a724ffb35fc4110695fa95cddcba547a6c10698441e9d2559653e952da8411860d1d7b3c08cfa9d2c71110598439e73b214e6b4ba82fa208c386de916dc2941810498441ff469f9c7efa92b71b6a31681d0b860822dc9dcf50aad6ebe4863e0e1d3b12af0234683c0e1d5e1822440e613a1db73cbb87ceae05ff632422863028933a679317cf43e50a8814c218cafe3fd53d1b8810c218a3b42741b8797ad80761509f249d61ca32434510a6f4135696b7f4775b198804c2e8f1ad338608208c7ae147a499d2d0aaeb10f9437af34e5d9434795f1996ba2188f8c1283a9b257953cf3d593a88f4c1f4d597dfa2d26d25a53788f0c1645264bbb53bf8e73c6983c81e4cda762b7d862939e4c8c6185d360604340d227a3009a9f9274a8cca259ef2603abdd82559bfa6a5133c98b6e2ccef53ca1dcc71cc44fb3e499b18391944ec603aeb8cddcaea60ea9483529f468a9a94d1c1a8eb26af495275893753640ee6924eac14d44ddc8965eb30f8051139b0ed49f2cfb92a993a0c227130db0895e3ef55ca256e0f108183c92441741e95f61b30cf13b48e6c936bb5dd40096c9040a47492ba6a91a12637d4d00e0bcca075e880c00e19982fbe68303e4083061844da608e57fbf9f5475cac09073c80bec0f10230aa20c206ceb35e83bff9d9845bf411175343a23e88790f97da94863e4d49f3b12d5e8e066c84583d9dcb84dcfa0c8f8e16b5a2dd49db31332037eca42ccbe077f5aa7d920c2525fb1ec3972f99d2d1d3c736931812ceb4bb8eb643240c26e5327b49f86c518208188cf17be28e47d90bcdbf60fc94640bb3fcde3851c7efb08088174c21469ae89d5e5b111f41a40be6f0275a52b9a4b863d25810e182c964536e15d472fa28da8261ab82ce1ed4e9d84eb560109b96a7d784790c6516cc6362887d91cb182509164c4aec97d47bd23ccc7405e3cd5dbc6b5b4e97735610a98269548d76d9bafad2fec6a03d90b72254309998ae75aa2d41cd5c813166f018a04183082253483239bc52b67997c68675fb598a10e91f5ead1744a460740f59a9fbcbd2c7350a06e5b95bff3614cc15f6b292ce79bb045111449e60fcab60c9da6f54c98a8813cc9f83b8dc279c9a60304963eb829f283915269854da2d392825b329b2259856c72abd24933546ae0473ce3da7739dc397b09360102243554e72d3549b48307d34b3dfea34fe6a1139c26f5a232784d4cd20620483f852ea7b8252cfaa2641a40886afd24fb92c7afead20418408e68b3fa3b5d25352c243307be930bdcdb7ba244230cd47ddd70b25be542808060f3a3d7550192a98c90db519e8d861b63a7e078e444580604cd379ea7dbe259c24d681c80f12111f18c48ef0bc1e2b1bb65e13447a607e57972b8bad080f8c76a56942a428b2038309ed7b3135c2bf4d37d4700c2295baa5d31dba8d52c210920b93b020b428f7306e3abca16603bdcfa0c1e02e84e0c21c3f69aaa8d0de503b2b84dcc2b0a659a57278c515955d15426c61d01a136e7b26ff21a41626ad12c4c7f7c985d00f21b430e920d2f3fc5cc5ab330b53ec53dda1323b8fecb2307e5a4b7a4f123b4993b53d84c4c2509eeb82102ac3c220f5bbfe459b72087985c1c4704f319e56d28d71087185c1efc4a5a47bbb9dcf9056987e3cc7facbc60a73ac0b319673106ee50b76f48e31f61021abe0dc93fb4939276dc40b0ae4483b9e0285085145413d44b4935a2c503650021b007844482a0c9b21bf429c6ce565595e44082a8cf399dba5e485b3b0140071083985492c2bb1a5acfbe2e60e08318539aea9385b2fa6fd0929854958f0ce6792c956824c0a83a996f0562d5e9f5b8d91e2c0488d91dac0488d91d2c0488d91cac0488d91ba43c8288cef776a2e696f2749e7869a284c9fa3a955fe9752ae26424261fa31d972ee9362878a1050986afeccc40b6d95a7410347c8274c26659c24d263443fe80983692ba9429db4667db2a1a408e98439b625ed24c27e4e1e4111c2098390a1c34e94deeca53f11b20993a0a4b1dc659289559326ccea23a39fdfcf84299d9b502baf948477306176ad301fab720983121fd7fd946e1f155bc21c3b28bdd2bfb99fb6488454c2187fa694bb6bbffa08c7404a982c9630c974651226dfac933f595478eb1885104918d6625c30f17fffb6040a2191308d3ca1ad7bb5632d5abe100209e3a5772a2d2a7e8d0e3dc2e01ee3a4e538d3e99e17421c6138258b8b5b12c3b3ed4698bbb6a497aaa44c2931c294d74d32f1c18c10a8b4508532591c148602a160280cc5c080b70173130000000c16124642b1683018cb7b3f1400044b322246363220202412141816094862602814080604014028100c838281503820240684543ea13ae222ac01009ae59fb935089128a895448466bad1d34d45ffade2588b16472b32e15e456b790a46719921baaf2ca65935ba7294f176f1c4c3b2c5107a48b737d530ee7ee3053c2cf8c530a651b9b8465837dcef354cdd38a1df74c50f7d6a835be779d5e88d766d48fadbb32a1b364ac55e6a43f06f76d89e4d7159da9c09f42f6fbdcb6a141aff0fc456684ec037fc3027cdcf929de97e38b0e99e9344af695f0f9d1b54f1f32ef0228feb08d385bd735f3411a626b5ea3cbc929672be961d2606963eb04d04c01b7f83f94383d31045601a7cc96109c22290065175aac3f0249cb9c78648cb0d182f1238525b0e7068228154d7b0e6875312ed4bbca119c4ca1953eda039c25caa2ef087fe0e6e307a658be3025c6c6b331077efae75988547de14acaea53fa6cd5d60e7a431f5a4b6505782e10f8ab4cca46d736257d0b822991ec14bba0c3efaa8112725f5a6367311b569fa9113f3853597a5dbe23e287298415d7a2d063141c1d2d529cbfdc2592ab200fa42d9fc1d07eb06aab5f0a8ea548d6470e238819a45fced0513bd683df53bca75051a54281d20ffcbb2a9ede1bb9042eee42f9ebba4480605245143a47325e40d9a4465bd344e102e64772d2c7961a10243917d41e0fbfa49a32632f6846846ec0cd0baec90f451c422fa34c91439bd7fe8337112d748149d9a8edb84968e667158cb6a5226f40458249f1c94c6b2189ca394d08b21ee06fc1d51960dec54faa0262f1f23b82d276a161e58bf88d41c6e413c20bcf982550e192d496c333d6d88b15143c34589bfec4217ff17cd6a3bb2be476e14b7064af36d9a464d247965ee43350411013784b159d8a0e948d0d1dc5a4ca1cc2bc981f925c8963fe7f3633979a94e48c6908f076882c66ec2668f9b7e502e3d2c4882ca71fcaee5f9eaf2ee5927a6ecabe290286d0d664118c2086ff44569b5ff4229e33562bb072274e5d2fb97a1c4832f6325806a0530ce9de5bdd3356e11398590a435e8b3e9048284357cd107c1fa78c63cf8cc470d4613b1301e500e753130c8af851221081b22605e12a14a401e1ed3a4549190517dfa2cca4eccb98b40936828e89a5f1406bf20f67b0215409d1ae25c520b03d34eca26ef9a134d39692abc525e5ec40a2d7e843ce554ecbcbf7d7af9c86ba145199703896f17e5655e3bcabac75fa821536e835181a3126f8b8599367112ac6c3a8a106d406d28d0cb52c73daf9691f668d53882ec83a7839a10b768c3f650419458ee50333c76b172580a89a16a64cfd8aeb7de040761febfae1369a3974e8951096fc9291d8c98085b5cc6ae6593b866a34a2a62b13efdecdef82bfd7975bf2fd4ea62e09fb09e8f296999fd34efbe3b199f12c7778a94407e91c6fc517937662555a9e444596030568ab4733b52ba37eb7e9930e340f4f85474282b4f50400a1e723858461dc90f900581a09e71778ed4a5490a3cfd1336320446f50290442aa21f24eec4b0dfaa6cb9fad951303623d1cd4ce3de392b858dc0ad290949d816b0c33b5ce9b4fc91bfc3968064edd321aa9c70bcd2a9cec05560f9e31651ff5c8430b1e504731528c8b348f7106b8ab8cef2ff3e3c84c9d26053a1dac623f12a583dbb79936482443bc146bc06a705469ce7bd05ba376a7c5a74d819b7fd5724eceb3623e25449380d55884a7651369b894f17a80294bcb1016e124a99e1a236c3a6fc43f57113223d648ab1c0b045fb8bf1403a2eb6b6aa3b29c535dab4abef8feb4ca939247d8d2a5ed4b9bf6597fd2e17e63d7f613644516e5552c4819643e13464b70eb2f5412f9d4d1cd7b3cd91e7d1b0b49a8c724e165e71da3cb699524812b4256444241c8c4bd97fb82dc2e95dbebd51423935e559d02839676261d24f17840281de9cb90804ce4da0dd21d60b9c4c30a377c6cd3f226df243d4a886f6e4dfc9fa4b3d6ebf5e4b2a67b6e0ccc594619ce867aeb21961ada2ef4df91f9799950a6ef4ca1fa46b4e6cdb763ebe280e66a1269ccc2ca770f47cdf5423a89891ed801bcab99f274c056d511ada5f2620e2a032a7dca2d88c6075fbc9577ed3e9d2dfb2e4f639841fce15e7acbe0d5a22d368e27d38034797e185aa0f94b91459ccb99c87626d2bcc37ab43153f4b51fd9b6dfa7737ab7e3368ec630af498f611f60801d2f90b209ec5a43b8112a1dbe8c89bd25b2e2887a3537ec96560c456af3aa26392002eb3e9a8ca860ab89b8d4de075363839e8d9f50002b73d7b56f6acd1486550cbfb0a74281807d4f48f948195b444ab7419e8cfbf33a4b97f33d37cec76320002a3dc0b4aaa8f6b2cfc2157ccfc0b91ba5a9ca4178af3e519ab8104c72514c3c2a26bb3818745c98ae5ff211a9df56033bba2709f3f5427433bfcc4ca1004fb0bdd506b7aea8cf42cc7813b139b755c443dd7030c5628e918d02c13a3b7b31561b3ca2c8497b45365d35ff2a4a3082b1c1f2d121b9ed0b194512ee61bccaf1e1515674d9321a04ea1b45042e5dff0289e1863cb93477853255282418f6f96cb0f4ca6116f93b4a49a4f8ea342b08b06cb2118b2ede239ef1046514765495a61b39a159f6773f6c06ce98d8dcc2156a7f24ffc4ce8c6bddad71cb5965fbe390b7c13202dd9b1cb5df5d804835f6b5fcdd8fa1c83c9140c9f02c77cab7806b9f61ab041f2aa55a9410eaa19fff118c6caafdde68a7fd3d153e945bea2c3a30559f8a5af32b4baa84d2427962e6b86ac55b89bc1166884049828d14357cc628398eaaa9fdb791e323113409de2de70818b8b3c088911f963381246021661444ad1330bbd03845de337602558339d39012b4762fb823ed19bbd03b8e0ef44872f4c9bb5583ed4e3b615a5fbd41238eb00a5aaca4af54d2aee73f3b1c6334b584457d8201ffb921923a78099b70ca8084aab25ddd492a3c2084de6c78578ae63f11fe06da241ef842849d83b4e0f605cc40b8769bf05bb78a1eeced314a8e845443541fcba84689a4c35975e170496a559e0725a2ea818f7e4dc2b5584dbae7109db574cb098f5d82603975bed85e38566213b3486ab24e518348cb95174bc7dc338c51a7339832837c8511d466f71761851d36ab46bf4c58b0a2c34c69a058ad8050c9f2743c0d3c92ae785ce21744b37b9f7d11eaac1225d2112056ea3b308245a73c0b4ea54c84bcac8249a2e794de7573ab3f3570f7930b9f485bfb30bc1e5007254f8d1e2d2800f3d1675070e1a749bba4281dd69a1a2123280b503946b515ccf4b40256f7258297164adf45291fdd6753f247a11d433f14dcede4fd1ee3c535598f4c8a5d3b041f1e30c8d23a9224259e9fde7e2de54f765038a16ee6803246952d7e9d4c8960cf091e3c50694a6dc1d016556bd35ac4068901361569a5c0e78a226708d7fb1a4c86e19193997fae4057080aac377d4c3e242e6e41df1dab51b9af8bafae824cac688096a74894b8dd4cb10b2bfcb1216b97e5c4865966a90d0cb24b6e4ae3a0fcd04e1303d674741f7e8ef7cc0e155f8cd0bb3b1dfd6ef7694355f085427918d1a6562d8503d6ebfc11eb6a021ddc0d660b401bd01276ab059c72e7b159507333f586b180eec22c24604414a4c2aca20d13de3dd02f3bc1ae333981e707ae4d94db1570507e4dd28788578b99b1236d8d839747deb0254a0b6bd85e3a74e633a1dc017001b00910035800716d032ee4946a70328972a198c74870668b99ab2afae8ba74857028228c43684f2101a10a75204a8e6801aa009e28ef209e1a342ac85c02362760192d474a5b60da0371509771673838eb49f989d8004213d881cdd8e79027304ef821dc04b46f0fe90bcab4c7b6d7e7e582af5c1b263ca2dc26c8c5459efc01e35adccff40143619fd3585e94a9e0dec3410922272d4948edc54655058cf5e22a9153e669b024def4b8e2a60a0c089810312dda90ceef7021ec07d68ec83027c2a164dc7ebbb8b9d54dbcb649e765164cf2a0b02995d08a8df48d8b92a4e8361428d5dba3fc1f171ab5a47ca2d9c0aaaa9ee390b840b5c10773af367933175087df26c4fbda125641edee95497b6d711a0a41519e946890eb3a4e23e17b851118b24480f6e2c0fa438a6d31163e47408dd98324b8b442a4706253ad99b0353011d39231b3d0c0ba6bccbcb29849a8a910efe38d9a07646b4a1faec7799954f8dd23ec64d69d2752fad9e10ae104083c06165abcff37c315b4ef0556305b4d16d3c1f47950279f9e942d920508873635bd71e01c4b3cfe535d984dd6fa325e0f4236d6b227309212e58493c4d064b8c12225ad2ed36812cb16f558bde95159a7e88dc1ed3d01c96687fc84ea92a774cbc6d1a617e4e41fcb42a5ca91930b3a79c1e71cbbc879880c6a071c2b54ebff6b7a24f834cdb2192d7c8ecf762a1c9bd71595983c4b5a0e5d2741d35cb0643acebff447ca3426eeae815c957689400d7acde27d34551211f03237bc6fa13e2d2c7dc4faabb84b8281958401c2201c1d96cb38e579ac1337cf0f45b184babc979fadf56883589379e8ce68e3321ee5155580a8185e13d14e83a99faa31f670961751c15e65c1b4b56fcefc4a2a6003049ad26f78b6afac8aacfe9b9313518693a3d2c97e5974a6a060d1c7c06c6e999e4a82b22a50bda114fa2488bd6914c8a5ca25f756c2a5a9478653209cf1182f51d1d52ec48b49c5d18491fdad9514eb1c37a35352c7491324723d661c973243a56d67fbfec391cf92886152495c3162dd2aafeccb719b723e034537b14354a59310fd016e7cd513f0371dac1d550282e016996be45db59720c437454e1d65f2acdba63e51552f791d615e3badb4df474947aecbe97d161679b69d8b9e9b5f623ed05dba78834d2019f162a5e6cefcb17317b260c29fc4fd85028210073c273cf712d4983b8a57df74ff090b711a84aea84686f5e26c8a396f033272927ec35713fbf6f8af6a6552cac2b042fbc86905f0bfe010cda14056e5e973071a4b3334fe48e489cd2ea194f295114971b9066d99db2190647a42c881485ba426e8fbbf9a2da8b544ae99699f5de9d8198eee88edb8318be291a80887969f7d03f67a32726b44ff6608885cf1a6ba6a27ada31276ce147910cbff2927e210572aaa7af90c38125764c5bb2e4e78c741bfd3ff462402c0f54d22b4e6df8a250dc966f538b7b4db6683304f09d204089a44f25e83a4e5fcc44e1ab3f95c934ede406268e01870c57d19d8cc17ee202546639fd87fec44563d3b4e2f4f2840f63cb820064f000ea8fba5c18ad86f3ff2d35266a0f0f8ab165ac4e6d969c76f36a2901f45baa90b1d7d2e018e6f023cc7e050516ac541c117ad8087a31fbf37c525bae1caf4996e132c4f7c78b2e94eed6d6e041c244a6fbd5acfe9a787ab7c7fb4601e687ad82ff20fb71a89380254f47d3b0890f0649c8e80c087860f896c6ae0982aa3cb92cf613ddd18c62dd3dbadaee9e53c851f7b66eacba9b0d534f4808ef07dde5b85b1fba13de5675eb9104632404a6bb9c955241788b6c779e57f3ba75fb309626399ac4f961aa4660093efb0084f958dd36a5672b444416dd70533a541d7c44151cf894d8314b73288791a60912be384301ac7f9f5de208cbafea144e23d9a623a921584b9222d4894351c989dc4d944dc2579ea80e6d4a9408fef65ab0d85c690d4131b95a941809bf9961d96fe3d96261ed8c9b39807661bd1332e28a3e72503618fd170d43144aa0bc73d02416f42dba1cb6aa35f2e679eaecac5415e67fda7b79940a993b9a0f0e535acae7f0135a44714da2de7357f4f0de2aded370d0b983e53ceafce44c1ac2abfead903571a7841745cd7a8220613cd4b9acbcd0478333f1417abe9474b6ede0d2390fca5764b4553e9f638b1f46fdaa8aaafff82ff6230162a7da2e7f297ed0a9af8329f81a83d639c286f5d6a5b0dbf7699526119057ecfc33008ddbd672f32f91a21f9f49304c2bde86057ea8fb350911fb7a8005026905b066b0a16af8fa7f107763662c38501c8c79312d73c8e0a9c16c03da3f58a6e44ba06d0d680c3ed99c333d39f1f204a18b35d0333831c03560fd079bd9455baaa80e5b579aa9342c5ae38014171e02f00c0066bced0c65f3841111c83541173538f735dd799ea44088bc418030e8d2f012d6637429c2f301521a7ee7c3eb5bd1bb28252fb130a8c8f955ed9f636717daa38ff9e0f72ec483980f02a4c84691e0170a85034a240e9cac1a693e1fd0a3fae1d41eb050975f6afe10c47f0d7bcc9176d3646e8d08a3abc9fe9d4e8b8878d537bdcb8ec388ee36ea36a6e5e45c78cea904652e54ed01e20729a098f68b58341e11f9aa9fc2dea2fe23e442b2fee450c7a17f487a020d8cf1eacf9a814a09482a51f0b129320b4151ccae1f861be32b5108d3e5097e3c8963da4ea7c36e26c3083384fd5a152abce115adb7ae316d172e5d5e53f5df0ab7636bf3a960c77224685db6c89a70955c24ebf252eea071495b7e9767d2b730f38839a9c27171962ff6fe094bd0e8ff9f5c788759f63257b76aa4dacfc80796d7eb41a725262422301ebaf51f30d136a173970d8dc480077008e246c504865a232252706bf85ad1ff9a089fc0ce6fd68e4e71fa8a0b3ad51de4bd9a1c441e105d14576999245f3ef167a6dbb365dacf8304a6a7f30eb181a9b992d0349cac92decae1bcc8e163dd0451ece0f3954d88b58b9c00896f0f134acf8a24e000537e16842ae28d7f0af15d47c50126e15bc22710500123c50d975f12815eae3bc07b90b25cadb43d32b6c64c24d5b4adbbd57b5cc0d281454b2c40193ccf21a68e1d28b755d9104bd32c5b47c45b6cd7209198c28cb4f82982e922d63f4fb742b8025a0ce6d980bdedffbb9a54e4f52caea9045da5a1bfb29e22ac036b82402ab9695a81d39207c8919b705ae25655ee294326e79ccc09d26a65def2a88320c3b843c6fdc1e82e86eb604307a5e2c3a7129735af086a6de68903182e1d718b7f40b0b6c80a3a31c9ae3a4df0a5b0200eb7a4d3c4d720917a224f14552f353b4b5e19355b6e44fa90edf5de6bc30bca8b5bfa3a2022aa9ccf433d78c891b66785b19f24ff4e5ec578d17901f582f31af112eb65de6bc20b85170daf045e5ff95a5c2a096371531b08787d05bdaedffa980dc80b8a178e578c17b7e5ab71a7fbe886ef18279573bdbd6af28ac1d737d8bc17582fd25ee4bd80f8eb681d0a96a9675ec70b58c6bdefba7491f5baf7528aafeb9a700707acbda8bc80e00b0e36f0fa2ad0a9f5852791e49f1a2f1caf775e585e24bd32793df76b26bc529cccdb5e377dbd04fbf562ec45df8b851796bee060dbbdc47ae9d9eb68beb888010fcbaa8eab5e16eb23aa8d9132baa82625962e0208491ebaac45f025c37766d515977011ec9fec126ed30893d10a0e1718b1040a90a1d4ac58be088021c58b95e4a88cb09750e1a14ed0bb28c2a38c6a9ced4fd3e22c7b596c7d4dbae488a17322ff182d9d14cf9c39fc08e6df79a13b5c4e91fc054e883cac7d40ad4a99486220333e3715a13bbcb1a71c700b576a9f27c8c033c509e143284e97a286676e05c2ad96556aedce4360b89d663be7b255bc1c91fd0be626feb52950ad6dcb306bef78cc3359da6be6a8d9c009bf32fa5ae2d22906194da3764668a3d29e5c6831a51209a455e154d9871cc1f6b0101bd6b82ca8958e02c74a980472e5d359eee4a65201f9cbd557dd0c8f57851a47baa3cf85521914b9cf602d8f90c85b3e7ee87d606f2676b20904f0e8477e338c3a835dc2611b9e377bb9b63a00eea4890e5192970ec72ed7e0c28f2bd28a3022ce4b2bab7171d7a473481c32e29ede2fe81a4ee381677a61cb282851bdff430c64f10fb34feb607d680f250ae825138ae8627ae4d20acdbb81e49f785f476f965f6925e73a086610a32afbec3ba998acf29870d64824a52e0418aeba14d6bb3fe0b9b36f06bf730bb2cda7e6b36cf15cea0554f41d1c1e877bedf1ffcac7012dde54f66046822b4ac635a07292274459d13b0b046e07ea24229efe517dc3dcca4f35119deaf184c20b8925cfcab4022da89e185b00661f5926e872642ebf1781626671652445d7475b71ac90624d0894db7ff94c712c0868789306d4acacbc53552397813db2326a92a62b260c8de841160e079be8134f47dc5113ff512d83041d4eaa182da97380cc494bf57de1f2b8c48d214a644f8c27b47fe9ace6b0cb7e4b928f7502b73b442d6bc9a805df848326e6d63e4b9dfb9c7e6d03460b81e397b42b2cdc2ccce9089f3e76d132e8a373958752a5606658efc09de3f842056a35348e67bc04b99e7d48cf0818b4bbd5e876b2724151151e37c90ff8514dbbe63402c837416f8a7fca73f1cae390048c9f7039f6e16b029038e665e957f3d52826d45208092a9e5529c868cd54a0a6a801f382d452c9539ccce897f611cc5e5f1871a939fbc1b7af252584e3ea133f7c2440ab3f7c450a40f6aa303d19f4dd461d21b0672c112d6d71f08856dcf405ba751da74ae7545317a3dd46aa0744577d2251d003f8715153abaa54f04f120512af1797aa010168ab44df3bc4e7d7e6067de125129b722b178bb766b8a0a498f09661da40524e6913dc4693291a597b97e1cb6041d2444283a1e88917908c6280c6f46349d6d0e46d10e406c3960c518ddcdbf3fb7e429d9860b0d300b0e547f09b30261e3af39886f569f01215f8f722077eadc920946ed51258ae1b14858688800adf138b83415add4874a8b11f00c8356cd435b76bf396a20190fe6c4a7072ffd0b6255e6378b38f74ed3dc04bd8f712b0fc4353006e7bef51df9b889019db12530546024548cf7eb3fe9ca739b6fd8521225bef807f7736722d192693d09cbdf5894d6a4c2e457eba47fddeb1a8926d724fed8f6f4b9937e0cf3a23cf27fe6b74ae93596b20400bd2130334382e2f0d88b4adb08a4c97e347a0a6c637fd6bd3dab51ef4d8caaa35e0c0202bea3f5a22ecf9a9bd32f06171f531e9f9c93bc2047bda013bb68b32fa9192e4680372722b98c0296535de642c02148509332effd740286881a3565ba8c4afcd050cd78abc2c449d5562cd0ccaff45a47f4c6808f501e4e102b6785f2c790efd31c625f98004e64dda306c4b4411b04bfaf6aa401902fcdb9b5beee789a55268a697c54b3c0aef92272f0c6422ae36c29f1db3bc1a37fbde38a5a6a0a3f6e10c5c1e73315301ba3564b50ea83afbb5b8ad4d4fe2c547246b79c0b88c813ae345734262d3d2b66aaca6e7e98d650615e34a03a69e51c43dcfd14f402752cb38ba3077e40b5966e8d004ed86f57e9c33b50f042b48d585c25874fd7b7584b3a88b5243a5ae7271f7bccdaef1bd1ac6c12e36f30575d62b12862c988eedf97fe20c4e0c54eec059d3222764d3c4f9c6c05e5bd386678de0858c24da29ce29b33868d11032767a0fc49e508c012302deccda0dd2a3ec094b48faa94d3d157fd6d01326140cd97ef7f04f0360a664c5570d2ba112c5104dd17937485844abeb6b6a3cb98fa13bc74a6354b058e2509f46517d79db46d0f1557c904b0616b540214e5aa2f1a96a4f4abaf846023cdb9af2bffc5edb16163bc840da6e4495b9688fe708e1642d30cceda38e0b1be0473537ba2a0dff66321dcbb89c9a9f1006454eb8a9285a31b1ca55b768691a2ea82e726d8a0b0eba3388e8a91c8c2ab48396947e65cbfb8aa7281f330c7defc0fe4f05d238601fa0dbbccb8100741698fc66c58e1c871027221e9dff629e0178c9b7781db1d11920228b5277dcdc8f415fc4780c7c67ea63b37cf51c01f9d888d32095e3c0cd64bca72b3cff8d58545250151b906c61f9357bc43bf63e7d6f94d25925287e4ba856f7e9c5466b844652c0481e9ba647541eb7c02b7229680e3b68e15c7fdf877d1b065541f45107f0f4071d81c3fb98a64bf61a1e7fa506c32b942a33f810f0436feea1918fa9ec6843d4801eacec92ee393c8c8376e0c623597006fd4409051db2d031b43117fc1a307e014818a08c7fb1d7a4b084c259a470b1cd58a3e38fce49c3a1fba582b79c074910bc5faac140da2df73d3845bd25db4d0000284519364e992b31cab6c3fc27af2c19d45e053fa77bd0f1924f561345dcf74dc45e57a9d825e180fa22ea01717335884c8ebd39aa5bf20d1d14733900d5f8276c30e2db3aa1aec8940661e386d533fb8d77f82541815b4812419a3748bf2ffaf96a109b5917dc8d0f4995f56cf1bc3c493fa0c23cefba03215166f1d5e9aa353c61a7dbcdb7fa5b7189ef96725cfebedf49ba281200668681c7f63177651fe3c24429642b6da8d0fd5ca51646d86faca40023a65865844eaeb48dd993531393eca3f1044485586fdb7583812cdc14c9f5c92f8c5b03dbdb44c6e8fe03c6c0e4aec5a2ceac4e334ee48ba30895535c7f18d1640047b808edc44d6cdaea9ea6d9501159afcb4733d6f60b5cf0fe8da9a1d140f563e586d94287843686bde54acab1ce078d534873ea58d934555e25d058613fc66c0877d58b1ede1cba54347ba7630c2afab0d7388e80cc713d7a89923070353fa65f51b92848f0013bf3d1e4595a76550da8e8ea342f0b93ba3ff2357064d9a5f3a14df75f5651731feb9a583aed00f97df819825e1f0ddaa9b086b015a611f54201c4211347374d60764dd75992a3d5f83f53ab707ce7baa5ead8848351e11a62506f68b7995048c596036ecf9dee6fad9bc3b10b06f25908db388e2d27908b87315d48a175d14c1cb8bdcfb81ea3edd4ae5399d86e643dc8dc884926ad1b57393a9d9ebdc4ed4ca5a1b26d7d197c8fe8fe5b3bca7737438909ad11039d1211e48f3c4fe479e1337bb7124c422042f13541566bb0d009f05966e1380c3a015b94d74689c6634c7d67362d317d9ad6e4ae49302628f30bc761294f0242d99044fd304fadd186fe8f1d86ed62541d82d3531aafde6cc8bc5ed208636736ca10c6356c13cd4aad7029d07ba12f118c6975065d52075f12ef7569d6c1af19e60354ff81da4286ed72d7222572e22a6cbf80a3f724bf8aabde964fb8932df2ce8afd9c49b87b1c2d3de06ba1038f994a20a9d281c8390890bee80a916d08b8664253f96b3dac9942836a0938c28928d45da01af7be58c29d1e844239826c6d51014b3b269dabcea3f58053bf5e35e3d910f005502ec22f72bae2d1c4ed517957c864500094084a112a4e95aef9aabcb45e6d327fd35cb3e19d454f73f87e67c0b51c213793f24d6a9a7bf9428ccf13eb38752fbef00ea1e8a5d18665f21b071c3015a086a73aaa36b5586aaa359d1c18b7e33baef6fb52d49674c3ccac36e236ce97000b4c0225ee59b02205c8a787561a1b3715540f7d4788d1b1708fddc2b9dffa4e2b6b639d1ea48d0159f12220ce71ff9c9349bdda08ec382c25948e124fbad046af5ae98f2394284ced153e1b3acfea8ef1dc36f1f2c19e6152c02b519311e78bac086bd319ae839f7678f43c1730ea137ee698621dd76af874971ab2e8c366413d5ee23c9befc4d3ae8cb5edac2460ea2706408c6f6dea2a51ef85ebef314ba8cdbe103ae3d73aa6b56d2247fb7810cfdc0c390f9a599743dee3bca1739fda6db7088b436a4f2b9e31e2b6cbc5ba41303c24deb7fff368275eb9eeb4d9965b32d8de86ba7d04dab939848a36880a961f88373724723eb041347b0d77e385056023e88e42a887967d4c397e5b3da481dde3e44ecbf212a3ec6b405da3348914c31da25122ab8605753a2802ec0573a209885900473d979dce5012c174cbf804f140b24729d067f86e7eef99f28953a38f94943c81126457747dff2e8211e101b55d88a35ec211b2c61c9b48b0a4a8712e702a5a9c3ce0824bed09240e052d995b8c79323865cde64b236c2e423c21622aa142dbfd1519c66a9ea87f6a21962e03689918abd7111322414c33edb4899cee9ef14a0df36c04fdc76928af649229a8e91ba49b5ea9d499670717d6bbeb4458e2d1c5b594b46b867fd4822dddccd496edd78d5db279565ad525718ebe9186873737ce36d83f319d99c45880790f0dd05e14a288819a0d0565ee53772c5caf3ccb83639bc3eb83dfba93e2feada8a14473c119d71001583946a61560427bdaba0f91818cf849e255183cd2d3cde21c1a19a7a4256246c91270893af4f40ae1aad472130fdf7cbdbd92dc35634813e05f944a2d2bf4f1796bb1e06c540235ac7e61c7a785535ebf925e49da4dcac78554f923680b78a7864f62a07be8a0dd1d3000653593486898d25995e1771f0fc86baff949ecfda156796c2729e7fa8d588f3158f06624c7920d2666bd1a7e0ae4d7a9dfa05bf44b15a2d495ab01644201db2340734e2b5c138a29dd35d05b7829450135006a820214141928725090a5c8860e2a0395148af714b0cc1481ba975e6f2cb650b650c0a03809f50d20249bb412d43ed414501a502fa030a0484165819a83fa0a05074591517d660e476112d4d35f54df8d2d08d1a0005fa87bc9f71e59034a138a0d8a9a8dba375a4d3fc2a1d042e141a57028605b17f29572a380662ef9017b4affb4f184e089d5539aa7bba7b74ff0bb4457e680958e0088021638bd04b5d7a6012a011cf1027e72c5b90d3460f0547230333333333333333333e3ad6a6e49f84bd2def7a9998e84029699999939f38bb4d94beb655b372f1c45daf017690702cc0dc40d940d4ef28f42d595050aaf4264fee41f7dc2190def8e43eff0841b7cae320767f313974eb83957b868b13f8a9d279c70faca6f3c8548a79437e15d9eb434d7a16af2a4269c89e01921e3c1cdcd84df9d3d68a4e8c4d82d5d60c23109d6677561aae2bf84ebd926de03f9143c4e5bc2abcadca9aeff3c74b4125ecaf6b6f38d8d8d2625bc9437fd93856ef3cd26e1479133a3fb87ce814c49822e24e1c747aef4d1c48e52965d44c2f72f5fad9cc2c76f030957dd43f4b01e6aa5451ee1a58d7512dcc27910d38ef03c7bc24ffd6a8467d1ed9207161aa00b46f83fbf2e3984a670392cc65603ba5884f3d6616cf14b69e1dd158c41cef83208015d28e28ecc23ddd7c6b42db6e019609e0365ef8216fc09c3fc0b7a8c2e12e14b5d881e3dfcc7901a4478a556b5393e574b98747108bf264a148fa3ef4ef676a00b4338c9caa317974b21fc784436a6433e39b5c3e88210feaf4ca86ca9a447a35d0ce2046147178128a5d565855f5b6b5d00c2cd8c0ca3992a44cbf71f120c1774e1076f324a900e729458bd19bd2de8a20f4e853cf5a1854849528e185bcb7ce8620f5b8ea5af53428cd51bbad0839b6d5716a326c777d9451e1ccd1c85cc610ea63552d5842ef0e0c4ce71acace64f3976eee079a0e51ecd6bbef4113b78b1d2fe24a69c33365d07cf345db8b8b9fb29990e8ed6a5b44c399e831b39f2782c73a889dacac14ff31eae39735e89641c5c0beb29658b0907377d8e51a33f67a70cdfe07fd82c7d1e846ef02a664ff340720c39ceb5c1b5ac315e366c70b263a3844f69e363cb015dacc1798fe6ed1617fd3c58015da8c1efaf89350fb13e6bd9451afc30295baa6b5e0de94183933a8346aab98ec38eeee20cbe4de58e3dd903e94d1766f0ebcb424d7af77d304da18b323ca10b327892993ce56421cfc63ec7e0c73e1f5279b7e4cf2a8b001a7080190b5081f18089011860b432a20b317841a673eaf33058b24918dc6493efd3dba74f6c607052a84d1f4f298daa54862ebee044ca3e9f428cbcc1a3c0d08517fc5837d144aed2c009c33c0bcce88217a4736b773c29d9a6b9e0e624a65ea2aa1e6a320b5d6cc1f530df88a0115739ad0527d867bac8b1c71624ce82e31195d171ec369f2d2b7481054762e81439cc41f6e8ff0ade6a49eafe30a262262bf85107f6f1b547a3feb92ab89d46bddf6a3c524f61a10b2a78c93baaeaf8627a201e53704a255b5270436d698a4926471a3651f0ee439a1c7cccd5e751eea0e0584cd1a8123e16f1c0bb27781f2c26c663db095ec44bb86af97d3c6e13fcb9f590af2ac7517ac904b72747fda9836e094e8c9c635d148f4ed4ba538257e9c72383e47ff1b38b2438dd653d6b1e8c0427d53433bf473942dd2378d21f4cca2a2136876864e8c208ce6955cc1c6a0ed2a518862e8ae056081d44cfa167124d21829b4782677664e9a05343b05c25ee5b324e5a32de2e84e0f8797f4835953c3e9d17ba08821ff487e7e95831c7ca4070e5fc2cc974ac1d3af9033f96eef01963d7c739455df8c08d0f36bc7f1cb48133480a1a0006182bf833ce202938b092d0450f1c4d1125d3ee61ee781ef8ada91d994ca45e7f076eccc1cf46ed1c3af0d63cb4289194a6e1d1450e3cf1685dd7a136a4fc2e70e09d9aa5930f1a363be716aee60ac164836bc4ead8c24d53e757579f24696ae1ab7f90d523adaecc185a2c91414e6a2e330bd7e358c2a7befa238f220b276b5af228078985779f37c4b01ae1810516ba7be8b22185fd0a377d882977fed815fee5a9dc1f5f7f66785be1a6cc6178c946787858e19ac428ddea51ab70c6729cb4238baaf0acdac7645294efe854781f6b4afec993736451e1876055e359abc325ef145e44184b1d6ddd9d318593e655227914be3ea570263ad5d4c49ab1a491c20b51a36ee4e3d99469149ebd7475850d89c28d93578f8376044b9b5078dde331f38590223e9838e002147e664c72e73996978871f109d73a5a7dfe62f8b9983e02179e705cebb38ac7e1514e7d275c0f39790739c7548f0e27bcd451660a396c92df66137e6de8f71c246af64f6bc24f1bc3db853467c2b56cc127ad0313fe5fb97d071506f52c908106ca7816b08094d1012e2ee17aba9aeef49e6a730e4b389d51a4c73dc7e3279706b8a884e31b2c9d471f917146186298e102166007b8a0841f475dfe793a9c7b749531092756cabbfc45626ca151391792f036540e5a425aa443978b48b819c5e3bbf0e61b3984845fd3614a1edb7698b57a84ff762947ee0ee2c211f8d77ab4a7b86884133376850837000304b85b00178cf03ce610362507ad983e30c0a003178bf0e350e3718ebfb28cda27b85084d7a6319b99bcdbe5342127b8488463967924a79c64099925b840841f2babad63d824c1c521bc0b6d1b1ee591cdc87261085fa3736c92257b6667e1c045217c5f9f681d965680a2810b427893831c73e79acdc0c520dccc1d79d8a9d7334178b3a5113da7856c9523107e2a4dad491e20dc52bf9833765ce6e03f78afe12b9ae31c8d6ac70f6e8b75b0da4c1fda07177d58ad32cc7bec52d907b8e083971dfb7bebbc3c0a6930c0e0ca04177b70cc524ea9d4cd6d43940b3d7897c2870d15157b4b9307378b771c8be40f1de588afc0051efce8debe233476b0b9ac021777f06e2d5bf4cd15f35a90c7c0851dbccd1937ed41f8ba8f2a14b8a883eb51cc1b19a7392c3a11704107e6a3f70e2ee6e0d75ffe38e778e2420ece79e841f8c03ab0f9302ee2e0fbcbcc048bb269b97602177070abc3ce21875025fd31f7064f3c984c31d26ef0b3c5fa3bee0f176df03c8814573168ea103d5cb0c1cf41a61c5a697298cd70b10627450a39667a9834393a0b5ca8c1f3682c4f66e9709106274fe8d8680d8fc66218e0020d7eea731b8f91b56db23070710647739c34757ce972f81431b6cce0475e9fed3604eb9443710b5c94618fe9b52224830c313e05670cb33e704106bf53481d8696e8ebf08bb195c9052ec6e075ac21bd3d84caa376810b31b896fde31cc52593467201629c314607cc48410a124080051080000b20c01931f8335640c60208b0800510200304d0c00408e048f52f1823b90883ffe7e9fb73b6e5b0138619a30c167019643440010458c018655c2005640c5fc19b11860a4c0c8a0b30f8315295437d44598e2f381726c7d51df55dacbde05ccc77a72fb975f1e8825f1eb947073765e13ab8e05b4b8e739a756cc18f7cd391e4554b62d1829b56e917ded2461f3f0b7e501922741e1f0bae7d0ecb7feb7e952b78ddc1e6cea7395670d4db83a8c70a59f361077051057f55724e619d1d9d395470c345b1f2b699ed28650aae76109682932e74ace46d1f476f89827392ed63b2fa4c9b2c50702da264bb8f1d8429cb13fccf93a1f69672187338c1db60d29f69a19ef24d70d35a6f757433c1f719f1c8435fc4b44b70346272a89c27b8a84a703b799ab0312649f053368b30f113bc3d8204a734794c9d3dd53f468ee0d4655f0cad1123f891879bbde7dbf01229829b27e5cf692385334d13c1dbd851cc933e7b90b91e82e7a1728a79d090b2d44270aeae2fe32d69c89f20f8f241cae3d00204efbfa388c935c4a4f40fbc580d2e73397fb9cc3e70d625f5a50f3afc9cdc036724f7678fda36b9c83cf0d73b70c9a9e21df8229552dc4435445407ced69fc5c758cdc1b73970523e9e90a3d92a8fc3050efc0b714dc912bd85ff81e59042b63a0aa7dac28b97187712d3ffe3b4167eda0c29c7a4ce19734a0b3f6bc887e5289d852cdc70ae96a3af1cd84c1a0b5faa3bff65a6b9ef13167e4e5e1fc4a444bb395fe18693d8e639b694344e573841bd358d5f67b1146c851f4b060ffee642d00ab2c2d94a7641ab3d478be22afcdf943326b190e632a70a3798c9c999784c725f2a7c8b61d2bc735e51e14c4a65a9ad7d53ea53381a8207b9a333bf7a4de1a6acb9490cbd9ad52b8537c136949a87612c4d0a27e2633b7ca4bc63148ec61cb3bde1d6412c0a3f65adecb5fb963843e1867590183771d59681c21ff1f1305bb693e0f1093f8ef1f71ced092fc5146b1224b77d02d0093ff048963ef05862ccc5893302b0097ff3782ed17ce943ac09274bc708b1322b4f32136ec9e58d09db794bc4849349b3a6aa14dab1750937d43f8e973a8958c27b171b3fcd66314255093f7eb625dc336dc750c20fd3c2674789da379984db9fe597d1b3e68b25e17ad429c94fbc338991f03f96c96cefffb11089b1a595027290705322acdd58d0907a92017884b79e03f310fbca1651001ce1e4ce93151bb33404a0114e85b3cae492257b8e9d21008cf0e38d39da7acd09c0229c8cd4f19b47693704401184d4a8d398245a262202900867eaa67dd3b804584018190044f8d1a76217f3188043381ed5849fb05ce1210086f0b4437e2244d9184b3f04a010cccb5ba5c684d74ca45ba9745f85ee8ab9c928110042f8b1c478c88e323ba2c720bc081ed5c6b84710cee4f40c9dbba335ad8170ae2f5a8aeea0efe30484573669da8374fcc10db78868ae397cbaef0747b34ab8e9504135c7e983173a08121ea60f3dc761f8e0c7bd21ccd7781c7396f7e07ba609b54c550f7e9f6a6d8dc6ca95ca839b29789aa40d21aa9478f065ed56be3f87c8aee920007770366f5cd87c07c00ebe791cf47647e126a55597c810803a3897fc835af4f3944d544100e8e055968d9837e68e3643023007cf82dfb4cd95f647b6185b888400c8c10feaf3558e2dbd32ff626c350134e080c38c3128007170c5df3b0839d0981cc2626c5d1140030ea84504000e6e6e93cd5c952c94bd6ff0f3062f2df3f84ff7b9c189413586c89bacb276b4c15fdf3c9a266f8c1cf96cf0e527a4d0fc231ad3b206bf2a741ce4f5df9cb2ac06d2cb379c06ff52565353e7c03d7fa0c10929c792c9357cf0e99dc11b6db9e920d20597ab87d67a646677da4f6af2ca1ab2c104bf5b73d02b6126bdb665bc1965900b58fd3105d858829fef8350a6e94b9259c818c38612bc1c7beacaa1526c24c1b989cf082a3fe75322c1fff86d24af68c56adbc611bc0e53248f94d21a5d2423f8d96b62a247a22a49421b457024e4f8c27f458bf4171b4470337db486346a7f1bdab131045f2d85b6ac3e0a880aa8d286104ecf88f16caf958ab3120fbe0391f4311b41f026cd3d5b2eedec9606810d20f861471a43b77d6cfcc02bf16c123cf81c7f4e59800d1f38593ee5515f5a8c2d32c630b3d10347fbfb42d6e492f3983c021b3cf0b24dc207e13e5c671c868d1df891781052941c43d810611b3af04296fc8b844659cb88b1b58231ca38230338011b39f0e394980927de79e6df73800d1cf8611aa3ee7357475416f815584003356ee18d5d26ad9a94557a5eb485ebb16a760d13d297b60dd4a885ff71986287e654c122430befa2872e2161663687d49885b7a515e52de4d490859f352695d5d2aa62522316ae6d57cc9148d6bd5f03168b59a87c16244c6abcc24b0debe13bf2f7ce71410abe0c162cd770859faa9ed6dc3abacdae185b61c0e057a0a5801aadf0cb6b72c7eb41aa8e6231ce20174031ce202c40199c61588315877a8badbb5b88a7d40761fe63f80c720130c010e38c5c85d31da7a4fc21988d9bcd821aaaf0fecdc247993a47972e158ed89b4f4b8a0a377fdedc1e655596b3a77025e7f130fc3e3e660f05354ce185db0ea23eb255b1bc13d428c521849a91ec20250564905152508314be04f1701a72a94c79d41885ef1f460d26a127cdfa3544e18547217914634e8d502051611e296eda9bc33c63a7cc4cc5d82a838c068001860aca20e300030c50b87e19a173a8c85e66d7f884ebd9ebce62637b903a659011c656195f811a9e70635467359f3be1494dca1c326798ef38e1779a2fb5d0c1d2d57c98e18232c230630c2e335230c6192e38408d4df85913249ae638827bf0f10cd08417af12c3bb43658f7a199c719970ad42e6b85286ecde6f0d4cf8729b56cd3d85d4d65cc291b99690c39e1471d7125edde4f08d3d55c2e9cd181e445fbf0829258c8ab68cfa50116b91ab0f43a87faff73441ac31092f3a7cf491d7520cc9918477e9c34a8da423e1e510ee626378486d6148386d39e44d9762ea0c3fc2e9186ca4b2c6432bd5115ece71a68be54952c4ae4623bc0d27f1f12d295af28c70d2866f740b32e699d658841d9175aa361e45f89f2f85ee502b11dec6b668672f21dfdb88704453e6de505be1aed53884e317dd112a326e29437857175b65a3596b570ae18f786873551a21f8d80cb19bd1f44889eb4e19d669c341f81f53e7cf51e5b5f6e808d4108493392d7ca0aef5a1e76a04c2cfa176d22cdf6f180588ac64cb426a32e22a33daee42c4bc3ebcc7b2c61ffc13f31cdc56b2cd39c60f5ea52c1b3b6977fc9b453b630563907101adaaabd10727c6fcef591d6e2a830908420d3e38ea5f92de3cf2941da900b3021998910030c03839d4d8832f7f36c93ca21a7a70226896584b39fd84dd831a7970cdae354505ed68e4c7835b21ad5531e53b38d9962e781063a96559c30eae7f14d5e3d59e1ce751073f4ad024f55f19a434745b3a8b22e6cec19b10ee83741da59bc7cac1b1f9a0ad2b1707c7ea2553ac1c0787a4e53daa4bb3adb2d42d844acb99e3bca3f46ff03ea276ea0935dce07d494471918e25e67a0a35dae0e794daa5a5720ec1552ad460831b729a54b9653b1ef5b750630dce57455f657faf670a036aa8c18f51d63c3efee0b27d8d34b812f35c8c07cb71f55c030d5e900f75139652962545438d33b821a4ea106f99834c1f64d43083f7e957ee3de33ed971c85800d7a146195c1bb5ed6c2149a407bda10619ca1e527bc8191c8305240c15984160c014a83106b752badc586b35c4e0c68e3a3b72d8ca6ff9aa11065f536ffa345536967e302c33615d3212f7713755697e5ed9b9a3865af50b7e1cacc40e3aea053fa5cdb0aa31637550a30bc99f8459a688cc39a8c10567c6ba6386479ed8ac0d6a6cc1cf3f6de176359eea3da38616fccebed661dc6b7759b2e0987dca72f5090635b0e0a86994689f109e79bb821bfd33ac9a6a6a58c1931c8794b975d4ea780d54c14f92a6b73c76d4a0421b2259aaf3b04f428d29185276874819e96422d490821762de1e4ba714c0801a51707cee82977509053f86edd5d2ee094ef020944568e7386dec043f8e15a1a3df8c0bcb36c1ffeed43f1629a9e5a84c6b30c18f3cc418c25d78095eb0cdebde7da1421ec5d80a839c91823f493594e0a624ee2e217860000c304c195c2309de845df977d89896836a20c1894c173b8e7304bfbc2787152c4731d9c7085e96dc13e1ee7637972278a1616b2de657d9112278b31ec548be1891243a047f42944b17ae0ac1e90a611a3bf7795b32084e9bc71e5ffed6ea0e81e0879c86cf1f450a23f98117cd73fc294ae7032f851cab56eb1eb8ee216bf4bc9525a78c07ae9fc9c44b6bca61d9819333e50d1d6d687f68e9c09b2977b3b3f4f48bca3e5023076e76209ed52e24cd81470d1cb8d129f269f8e87b2e7f0b2707f2a926958393f56de1c710e3530b3f753afb10738e1291166e9edc1d6d5acd2c5ce930d77d8745166e97e48e34ab120befb2751c2bd64fd42c81852326c927a5b70f197e855bb13b24658fbcaeb62bfc74b5699d3963f850b7c2738ff249dbc1acf0357b2ef896460f9757e158f2cc9c3e7055e1c774b0091f7f9ea8662a7cc9a89946421449a14485d39b2782dd079ed28ca7f0c27a8e825bfad89e4553f8fd99952f47e54a31570a6f4366b9604126852bf7692a75bc298875a370530ef3471f6dca1d96260abf23597fe9c80a859f25b468cce6dedd83c2b3f0fd71e43433b33fe184f41fa9ba4a343ce17d501ac246a64e97121a9df0b3e7fdbaddeaf347d3e00469f27a982112a0b10957ade3f0b8eb3acc9a86266864c2cdc1c496ec71473930a0d4000d4c3c6f31f3078d4be829a63bed3888f3ce023016342c31071a95f03b0c21ade63d0cb1694a7829071d73c797f25694694cc2f74052eaa808cb5b1f4e040d4978e2a163598e7b31160c308a093422e16687e1c2e598555247291a90f073b0f9228f64887fd023dcd614f6615b88cb36b93ed07084d3397bec20c2e4276c8df0253d69f0b0a753ce25231cb5ccb8cf39b566f88b7073149dcd6db3254b570183030d45f879a39798e43091361a89f02f58a6b4d13285bc160d44381dac47b12724b7981931d0388497e1c3dc99b6e3653b0ce149f0cfe1734af956430ae1a42f95ee1a9106219cb4f59fa3ddd58436082f3e4514845b5ddda1e6489b881c8d40f89f83570eb34d1b060d401ca2778879b3792e504118ef8216d0f8832f16afb6c957d25dc6a915d0f0836fe781f726bfea20b43ef896e3983adea26434f8e064bca4d4ca20712ba680c61edc18357b649d77b2b0e8c19f8f267c1c570e3378e4c1098f23c3a4c5f0eb260d3cf869a9d6912d2a56a7185b7770a346d80c2e727139e60434ece078347fdd61d8d668769030caf833740c1a75702e5c2a89aaed2c2927c656197fc60a9e0efe5dc851cebe9ce38aeda0310757b53b4c0ead392e4d1a72b836eb5de4d6d35b4ce3a2dfaeaa2a2ae6cc018d38f4f9536fce146d33d20e0d38f8b32e96332b5bee99dee0a876e5094f1d76574ac30d7e0e5bf31c2e34c11866d8cd81461b9c8be62aad3de973c4d06083e72b95e1520eaec1b1e81da4b19443ca31a50d34d4e089e5b092c93143dbef061a69702e57f4e82c7858df281abcadf0e1cc2684cf351d8d3338656a17b67bd682e44cc00cdec7f84b159ee1ff7194c18f2185909aae72061a64703444670e2a63684999061a63f0d306f1ac911e7d90927966a021062f761c4f57aa0e0d2d41038d303817cc7258193a6880c1d13c295372d65f707bb52fe36254d707312ed0f0821bfc4a3d5233ed281e5d7093680c5d1552bf64070d2eb839b887d5e0317498533240630b64cb2eb1a256df63a0a1052f07a9262e9f26028d2cb821a846897196b5659e000d2cf876f239d0caac1ed19116685cc18916a29f87f2c8a8c04d818615fc481fe4e83b96183c4327800626400029d0a882e7b3d531845a8b116343a04105bf2378cc81c60acf6102028d29f83db1b5cef36736bf8440430afe8b0719cba222997944c1cf1f59318764e4141d28f8618896cd12121a4f70734fde905e3d884e89ba808613bca81e3d1dc77b10420c8d26f8d95dac364b3ac6e22fd0608293ddd63f0ed36309fe250bcfc1d9848ecb43094e16719f354bd3213a92e078103d0c21765162f491e064f24d51c5430937cf11dc4a211d958731467052e542b3e4384b074b119c24e92fbb5f8c878810c1f7b794cc53d4437033c79aabacf6659115822b31237dac9cbeaa09821f5ff6112b39cdbe81e069746a8d4152494eeb0f9ceb605369eca0b93ef5819f2aa668d5f1d8859d3d702e759453e4aa2429973c7033c4233c4777ea0fdc811ff4998ba7909f8e431d942a67f672e07b6ce6d19626a6974603076e92fee80315edb49aba85a3e51f440f25fa58c7166ebc85ba2c3f3363710fbaa885f3231b62d2d2b07e1a5ab8a1628ee9510804fa075dccc20f7fc93654f2f7f25a168ec45691eeac21759074110b7ffed4273b76df54bf0c07030c52c677010b373dc6d439d4d09ea1d2c52bbc13d7ced6e8e10a37749c4dd383dc2ebf69855ba73671f1352bbcce5335ff4172155ef434122ca3df48c85815ae6dec283c974a089768c056d0452a9c9082fc9b7a45cbb44185f3a13f96495a2eff9ec251cb59613a4e2d996d0ab7e663beb273f8f0d15238d1963247467b099223851f5bf8c8a1a310267246e197e6b3efe4611d9e89c249f181a7c47b0c998422ca7b4a64a8458c115e48218957f8c71b528bf0378878a8b8b4084b11fe8438df98a88ef389705d3b484c163e0c394410e15998930f9b92248dc8219cf4d28ec3fa30841b215f070f973a4447219c2cb351dd7a42382292a31c49e8b9cb0cc249167294d63e27bf8920fcd8390a117290c3c41d083789871d992db1260a08afc2570ecbdee15afec1cb8c92e9364927393fb81d84af1c84f496d3d787c32ceb9c42f4f8e0d49d8bc7ce6016de8313ab6342f8ad0f9ae9c16fcd31a4ac2c0f8e6b6644fc6b8da71a0f5e957bb81a8f3bb829729833468e1d3c7915ed71ff20544c1d5c89390eabb359ab6ce8e0ffd685f00e42c7393307d725c494ee9e6388ac1cbc4bfd8166b5fca9de387839ec0e9be34bbfeac2c1a90ceb617491ed70dfe0c672add14af37daa1bbcb0792d66a40d6e58ef7b6dcbf923d9e0d455697c079b3c2ad7e0e438af77488e5139d4e09c87f19525f2771c4c835f1e3d6ac76bbd39d0e057280f420e3f315fcee0679648a3da99c18db0d9255365193c49fe75f51993c189f2d3c1e39c3d3dc6e07bd8982667983b8b183ced8cf0b151eeeb0f83ab61738c48b339730a189cb77ca972660d19a25f7072b67c95ba3b5528bde086af146f1d76aba60b7e247fd6e98266bf70c1bfcd1da5becf9d43710b7e70a3217f471e243d2d3829ca2ca9240be51c4434aa5c58f0b6cdb248ca15fc9842b3a369ade08516cd31345305b7da3ab2e81eb33f0a15bcb38a141f85e8305ba6e0ca2409b1c3889d7f22056fc37b8bc734a22912053762b6ca81ad50f073b09fe4edc195974ff046baf387b835cda113bcf114fbac72f6b45d13fcb6892fad0813fc9839d4b6492dc1cd88a16426e55357aa043f8ca1533eae8ffa264d829b7ee31db7d9078f14094e4eb1a3cade71043f764819fe2fa4cf792378533dad52a572f12982eb1a96952c44702be70d391e49922e64084ed218657216de6f2204ef6724a98731a53a49101ce9ca689eb2e5df08108c9855738edcfe811b93b53ff4853c37fbc0d31c84f330074ddab13d7065d39a5abe0d0fe1816b351b21d91df8d7aea1eef3474ca20edc4eadf9274b01e4c08994ff24f8898a6a29001c385be9f739c7d44e2b6fe15ba4b0cdeec186b4d2164e853ef1f14a39da2a6be15cbc5ce8c083165e948914f9e4ebb463166ef694520e92a93dea90851f76fd31529c98e763e15fced159924d2acfc3c21fbb0ffac7535a735ee15bbada9ce963c6deb8c2954e1d59e7b2ca7eb7c28fca397a489a156eecafff1ca7bb4ef22abcec090d49abbd93aa0a37489b57eee47292a6c20def20c71ff96fe71315ce895fec146e4796fbf3473fe54134853f3e1e580c0f3b3387a570225745370f22e7d84252b86d6ab964b35138e993e7f84ffbb05f145e14bfcdceec9867130a5f3efabda5f0a1a1018593d324e6f8a7d25be6137ea86429bd3bca31da9ef04b7367ebbe134e466e890f54db5de6841b52a99a8c5d6cbd0947ea4d634e9fdd2dd584bfd271ceecc0cb846ba9dad91b1f26fc28751c9792624509dd253cf38e723db329f38725bc8f7d5a3d22fd9fa3127ea7fc516fc943778e2f43224810fb9884376d775d963662f992f0839968d2e18984ff31886aec8fe4810512cee7601f8670ed223fc28f19a37cc6791859e208afcb6ee2c3758e8d34c28959c9dec63db69e117e241f72e5ca399ada8b70435eb7d7ec9339d58af03f9d97ade5add89108ff4a36a5d8d8136546841ba53b42b828cd8a0fe1068fb5e7225c8db58670b254f650e999294721fc38c698d19295684709e17f78f4e8cfdc37ad83f0e338cefcd5118413a6dcc2b8f97a9b81f04d7e6343c800b1e51c39f3e20face5f48e79cf0f7ec5e46f9f36a50f6eb9c7a7249152c4ccf8e0c44bb2f6e8b23d381ef3a50ea969e371e8c1514b1e6242a50ee19107df3c739c79f27870e4d723447adc15f93b3831774a8fb3b7839b56e93de7c8d1cba50e4e08974c8f363ef0990e5ef20d89721e84e4780e7e902f47ed37ef105939389335c47aa271f0536e8d315364b40ae1e0a74ed2ee1f79b2bf37382155100f65565d9d1b9cca8eeae01ab5c1adb41041da2c89858a0dde8f898a048f3578e1aed681c7281d7b35f87134b15250f118ba92062fcdcda4ceb0a9d1468377173c0ec931e6ca195c0f9289c49609d9b019dcf45179dc1e7d56cae0d9780897e092c18f3647da6138c7e077aa89da4a92464531f86a1ead434d4cff716170bc2a759072728b1b0c7eb6f14c4b8bc8cebee045929822dbbdbc2c2f78f371bc214c4d5e74c10b1bcadcfffd523adb0b2ef88147c719f3b5a4e89ba00c320ebbb2de821fe5ea0da1038bc90b2db89ee9d34b5bf0380c95f4220bae8460b379d5cec482f729c7e595535bb94610f7e0c515bc4e6963e43847c10004b05e70658c11060bccc0f2c20adebf870e226d2ddd442faae0648f2b2267e68d123e15fc4aed392245efec1c998257a9f5516d21e630a4a5e0648d395c5a999adf4b062fa2e0894a0729479adfe35a025e40c1cd51fc73f41a09fbce8b27b8124b2cd705d7095ea84e5f09a392efc5f2a209ce7b2459f3d9115ea3185b676394710632c14bda41be985e8b9cb304ff2248fa918a194a703a6448d91cabbba431094edc040969c4c637077981845bc264f1142a1ff0e2087e0c154cfe5390cdc9c30b2338e9354c642f4f07bc288273151dfda5d13c3124811744f0dbcb72a8f1ad8c035e0c012fc92969f3420847878a9aabb559060db38d75e97be34510bc8f24bec25d6ebd00829fd5bf235c8ab9ac9e2280061cc002154040060a30c30c7201191430c0b082173f703aa634d9b57931b65017025ef8c0cd646b124453b5e6350664c0e00c8e80173d703aecae5193e0e6bf8ab1a5693cf0dac2ab3665483689152d05bcd8819fe6a2c22dbd86ccc15ee8c0df889499c34fcaab85012f7290cfdf47b90dab185b78c70b1c3899993922e70561605dc0c62ddc0ab3317b248509a9d9d2800d5b78d56eb6216466d4c2bb1c15468375b88c9f164e872495d28376ab9466e1865493f3d68821d5cac2fb50fa5652f82ee92c16c5749782ba79b80d58783e9ef29647751ce67d85e739ea8e4da3ba8fe4708557b63139998769859bc26bb899c588b964856b2954a848491fa78957e188a7e9388e1252a82805291843026080a10a00d848051d6e19ef1ed56a716a559aac2269b458cb508c4d5434b1a3b6626ca9404fe1cffda64806ef98a09671609bc2f14eef402d4b7a2e2d60a3147eec71f0165db367ac20023648e1fd8bb7668a0791331746182b28c3c818230c163cc0c628bc181dc253cc8d07294714de5bce083ee2397cbe6d84c2c95831d9b0f8cdca01851f17394a540a0d17d7277c491355c248cc9b2ce7093f6ef51c894a6c0d1175c28b39426984ef1063856c70c293742b091b34b29f658ce3400834a00160801186d9d88457671e54c8c7d9d0849b3f34875566c9842252deb61eefe66d212a980761e2a042c5186b25535ea297ccd2d09637b535d70c1b96263ecbb77b58c22bd79462e80aa61a5d25fc641eb5fbaf74eaae6d50c20b0bf9b36afe806063129e54a749a8a412dd912609ef43f540d3078b8d48f8f2edb9e3e8524ab90609377c2789aa122d9464361ee1c9c59628b11929c56cc3116e7a8ec127b26a841f24acfa849b30420de2710a9b356363114d5776b7cbc77dd9b95549d7e738ca6c28c2736d8f6692c354f7f2fc55036c24c27bdff490aea11e86ba39b081084f4d3d4c125353bffa61d4217cd3a82d1e3954486e1ac2b5febb30e9d042386aeb5a9d24feef7c4e33cc602d800d42389d4a563388bac72c18609c415450061947186698f165c880d38c5b1b83f02be483f4d06a2d875e104696de50b9eb04c2ed4e8fd131c60e3e870171c4884c69447d349d21c7c61f9c6c96e5df638d1fdca4ea8107dfbf39e663a30f9e4799b726bae7831fd887b61c7eb2e435f7e07b1c67e728abdfa59c62430f7e77f0c19df6753429c73bb091073f65f62821fbe3cbc0810d3cb896e9132248f6a4349e31c8e080aac0c61d881811ca6af20718607c1961d4976107275c7f1039de2018606c1845cc38e6f30636eae047d5e77118eadf2ffb7470b2fc848a313104d89883e3514e2ae271e6aceecbc18f73a4192c498e33a79c38b8924388dce790b2276b030e779ca84adc9bcc9587974d47fddb51f2b5020b051b6f7023e5d198d62736dce05498945e3e2e8cf499820c8001c68651669c41460acc601ed86883df31acfa47ba8fe3726cf0375485c860af8d3598293b0eca27cc856c6ae852ac652c53d4ad42e49eecae9c7d1b69f083e59444345aaa766da0c1ad7022ffb15ba58bfe0c864b978cdb55847bab8494bd956206c7eea358390889417ec118e718d06cf529282e20e33456c04619fcace963588b1d07793a639432fe02608001c692c1cb0e4290df943f0af9b03106dfaa4f83fd7aa8cc121b62f02eddcc896c481f87d808831f87a6da933a0e45f20718fcd3a8f80b6e7f209211112f7819c3721c1f644739d205af7e2cf484dcc185d2554c5ca5e4d42da5d9c77e1dd5d982671a9ed5a31c0c061851b0a105dfc31c73a4bbcbdf1e08061861d838650c7d1716dc38d39451cc64335a0ed8b882e3ff35dbea3f72bdb161055f2a5c7d5d4a110a6c54c1cf15aa3deeb052cc41c68751061955547053df848d218d09868d2978d99384d4df1b392c062f461936a4e0a41c65ea0e19a2a568cd2883b0a0c7b01105dfa3d4126b2eacccba5a810d2838773147b79ef3d0de330134e000f2187833460a32000618877c1962d87882dbb12146af34da7082f3b19f04ebdfba0b898d26a055d6650420730101cc6082e351e84df31a6a1e6707b004a7377ed2afb3c3a465004a70636968caf5f17f48ae090690043f57796c9f599a150680042f4cce410cf748ed1db2011cc18d9a7f3a4372e87892626cb14005e6cab0c00806608424df7747e62531032802ed12437f94a5830c2bb506032042dda1f6764816cb9e318021f86a152386701af1174ec10084e06f8ed954a35d96af8f20789a4dd383a5dfa5f681e0bc59bacde49b0a06f0832bea83e4d8f9a22fc707d9ac5596a64a5d87498f372479cb9f29c1007ae065799062cd253db0200f1cdbce73e125b4fba606b0033f4e9ad35523f5a68b0ebccdeb296bfce7fbc80072e074bbf484d7f898ed0070e0751052ba5cc1e3166e8b66872d9c8e3eb00b627697f9af85dfe9c46333f3b4f063bc2bcc88a7fae0cfc20d61b639b6f0b9ee230b57462b3e53675bb5c4c24923c95d3c082cbc9eceb166e3657cf20a5f3b0e1f7cf814b2ddaef04a365bfe8f83b095b6c259b118b5c364852729e4284c5a93dbe05985e329580a612b1ef77554e1f8cc06afeba4c24de371aca221b6dc6f50e14721c64c9bb3f8dbc79cc2ede052e68ea318537897b244f44b7f26cf94c295bbaacdb6395b4449e187ca54913a0e9398965138e59f51734e1ef74716517841c387d9710efd1f24144e8ebbaad3d20414aea7785f781c32934c3ee15c88c827617ac28bb1ec22843c9d93453ae1c590a98f439a04cf73c2d11c868a7e1bb375bc09a7ccb7d3a2d99a70becdf3a59423134ef43807bbca21a4f460c28d9d1e6b46c7b674b9841f152679b2ca5f58c20f9952daa4e42754fc4525bcb7b9d71c5296e489bfa004ee9f59ade1d949385721d2e38b5949f81f8d5a85b01069341b0937446ea6a43da5cb2c24fc58525996e41cf866f711ae7d94cd93a73dee381ce1a435af1c3d62b4e4a18df07dedc2c5e86084973f47d172f068d2e74578d93bca7110219ee92ac291489b3f8ea276863211be86e793cd41f00e9322c2492107971e5fa7a17208ff03f328bbd5107e90ec1ca5690be1c7710e1661f24f0e427831246b10bec7610e6e53ca2f04e1c4ce1b3a5ec9379bc62f02e17ac6fc9d83cc1eb2865f00c29138f5208779e623c77df1073fe4e03bc895fac11f4b4935fb93f445fae05859844c9bdd52c8f2818c9a1a1963720f4e889c3dbeb5b27ca21e1c6bf9e8e3cb83771e758707dfb2e5ae8aa1bd8317694d32e4628e52d6ece07f86f41ea705af8b591d3cc91c937a881dca07191d7c5f0fdb3c152ea25f73f03d8d76b8ff208df82507dfd2e2eac39c61b25271703a8e67728e0c0f9a2e3838bed59d34a5dfe05afe0fb7922b468b1b3c8bda5b31fba266ad0dbea7c674c694d7de2a3638e153c75a9664ad3fd6e06f0e21bd4f44ac9c5783373149d37fbe75cfa6c1f5a8a9534c8c2987221a5cb954a9d9c2bf5a8abe384319735c4aa92116861963b4de176620c7395c487a4dd66895a1080b9390b195ea08190f1e39f4e45e1355972fc8e0b5a95f888885f1c518fc286d3a9fedef14e1c343f8420c6ea7741d4c724fcde67e11862606993bf005184e8b1973103ecd79f08b2f7026b2355ab61a1d9b591b39a7cf99f482d71da592d4c4c58c1b7cd1054ff2b5cb854b45463e56adca63db701e15dc82671662ca2146f960bdf285165ce90d972e3177c9c64df8220b5e4c7b93580d356b1e58705cfeb455d3927bc95f5cc1938e0fe3ff245f58c18fa393d68cafef8e48155ccd418a091b53e5c8325458d4b66e5eebee55b44d7de3ce829984c9d1640a8e4a1e57498b78075f48c1cfb2d6a89cea35d47c904146191738c820a30c162ce18b28381d562873ef6c1fb58782976ce46e62f204276788293e4a9346744ef03d186d0fd2d5d4b9e78b26f869425f6887d9327c30a1ad0b5b97f80a0b9792efe8a116b20427edbf3aa6cbfce00b25f8eeb14990141eb66a4e12fcb035e4c3c6c57f982cc31748703b48962cd2225c4ce12f8ee0b94dd0f860ab4345fc85119c90a23d3ab79473ce413e05c5822f8a5075d7cbc64aa6588958d5799484cdc49c65436cf882085ee84d99ddf19dc4241211be1882973cc6345136ac2ae4bf0c16909171ac000227056388b1805ec01742b0244ff020a2c7903d667c1184bbcadce3db355ca5ebe4bd73ea0808d9ac46e8d4af267ef103352dd2abebec2233ab5dd3bf860d91d57e1fb859b36bc518930df8a2077e201f7dec1593c7aacb173c70fcabd2bdf6a6394fbfd8811f59423a59f1cb11db173a48ac63c335b2322ce3224db4b72df38b1cb8a1de2f3eae9828d97d8103a78324f1586d4a2a57376eb1865689a55474d59ca967895631b9791879dd1bb6703c5c8e31ccbcc71353376ae15b8c8b10df8e2c5ac70d5a38f9a256925b6d8c508301060f6eccc28fdeadadc205cff074df90853fb7d937397914b1fa462cbc9164d121e59fe9ef61e15f5bda089bec2ea668fc0aaf523e0d293629db55127075460cfe1670c3154eda4811f7b0e3462b8c6ad1aa13938e98e7a536345678d92b36c9a791378d29838c30388cab0adc58853f79a53afe94230dfeae80941186095630c60a56405860461866bc09ce877190a713c50d5578e9dbe7e253e23cceb080052e48859f3e458f4ad559de260f03325260a63750e1791c1dd779ce8cb2fbc629fc50b2a3d1508be621bd610a5fec52d88a991c13fe52b8d59d42064de906297ccf68295669d60a39e8821ba370f25d0e724b8a549abdbf210a272b4aaa7bc3f974e44628fc544b27ef9d92b8454c7003147e147ce342232b7dd8def884a7b2f92cc7c41c6b466e78c2e9f9d88d4ee4931e689ae67ed5500a6e706297bbceaeb62acb9a90ea28df7aac594dfa4a6e6cc28f551ea5c7329fe49726fcedd20cc16cb31b99f0c31c91ef36dcc0846f2184b58c35b192b715c0808c15a060051bb88457174246ccd239c30d4bd839b65fc118452be17ae451e87083126ece68dff3d34dc2fbf659c7b8210937ea53b8f5794c9f236f063722e1788e33f1e8422d3a8e0d6e40c2bbfc51df4d4fea20d6a68f70fe3e0e9529774ccf961b8e704e4342774a210d6e34c2ad08b973c458f2c99e1105c62dc20fcacbeed332ce60c10d45f849bbf379846d8f27cc8d21b89108b7a3cfe50d5b561261447c1962deec7c1dc2edce7cf2390a1d2e2543b8eee9a71ec275546a1c46a9136e14c2ff3092e74acde18216bc0b5ae028302fc6026e10e28ec1b55368ac987163108e5908cd18423e8b8a81168493d26415b5ff46207c4b6e29a67828b1c6bc32ce60c1dd0084d7da4166dfcca179d8100237fee0fd24cfe74166ced251fce05fcaaf51bc25544eec832bff91d2c71bd9617c37f8e068e71e0f32cca3f38e1b7bf023bf8e8ed98e1b7af0c3bce6c9e2c32da6fe461efcca20a341b286e4d0dcc08363913f8e37a6d364b937eee0a498917e3a6f07bfbffc53073b0eb1d364ccba41073f664d215434871af56fccc17f15cb51f6402d5d856fc8c1b3ec1fe683280f128337e2e0e414f992ab8cfaf476030e5e4c21db4b8a7c9d66fbc08d37783592ed3ffebfadd0bac1cd717cd21d5d42c6a50dde6a754c1d8b76830d968aac4447457648bd8aa96d750851dd35d61b6b70ae7e52bae4a106a72fdfc4ca173647471a7c7b8dc1a39985923c1a9c093241247458ff943378c12cbc57e71c4ed26670824f999ddc4719dc942b3ec57d3be8fa2083d721e42cc5e41f72f818833f97daa3d2d7ede6430c7eb84e7533f2110627fffcbc79eca0347a80c18de077d94304518b1d5ff0ba3a0533bffcded7e105ffa3d0a13f3cf0d0e8e8821f6694f5bf681b97830b9eb94b65d8589ef66fc1f1918e32e61c728e395a70b225f885e920eb62b2e065c9152c789243edf4ca21a7985cc1ef9463d3983a6bf6d40afe4de4c9d1a7e419c52a78b131e357c36b50910a7e76106345f4a6e09da7ac49fd72ea2852f026e5682b485970cfa2e0e7383ba414cbfa721414fcf7101f783cc1cf74611ddff44e702a45098f52fa26782147e4184d153d929e09dec76c8e616a2d5dc712bc943ffdbf42f7a65e09dec9948bf85852cb4982631a4473146c24f86b7fd16112abed8fe0ca8711e627aacdc746f03e32979accf8582e825bafd61dc6fc1ec725111ccf23f2d291835a7008de668f2b86905e720bc18b29e52e8f2d17d50b827f9e6a65cc629c66407024c71ee7b7fb4afd0ffcdc13620afdd183b97ce0b544c8e9816f61512ee483074eb5dd84d4f91db831739c5bc3d781d371645ddb86d69c1cf8e539e68e32e7060edc980fb25c0ed272ccdcc257d3f2b87c23f729b6705eddb5a254768e2db5f0e62fa57f18ebce675a78e95ae32ded2c1cb5f3348f6763bb2a0b6f3692496c32164e8a64cd07a38185973a550a3144e6155e988f66cb8397aa0f57f849f247f9c6d30a2756fa9c32327c3e58e17898a27be668f7f8b20a2f72e0f93d54e1e58999ca369d0ab762ccd162d9a8f02acab4848d72f2c1a770a2e3cd29fc8c7d4ce1fc67f478ed3b53524be16d47e9c53e2ef33149e1c797e93a626f0ead8dc24fa9c2984449fe5389c2cdd89c35ca580a1fa1f0838f37334d4d0e3f28fcb83a75ca1e87d07fc2394d1e686fae78c271c9818590233be1aba8faaffd86ac1e9cf063b7e8386a280feab1093723484c1e826c5aaf09af3d8e33aff68cc49c4cb8ea1dcbfdf548cf0713cee4bfb0da64111173092f726861dc3a77a48a25fcdbec90aa57b363520927663199f01452294209c77bd62dd6fbd7cf93f09268ba91ccab926149b8a1cf35246623e1a7c7867d9c2c4b6421e14525b77ce93c97451fe17998a33fee54399ea823dcde48fd219d8d70b3018db7a804cee4e2d15828188804c280280c0829f2362314080018401e8b452291581aaaba3e1400045b262038362220221c14121216128a44a15020100684c26030200c088502a1904808ade85407de25c0311b74c85744aa3c58b1d5158ce9e7a6c0634ab186c1f473211481443168cf2f9587d4b92fa547c4e4745239baed65beacc14b12d0d5302a26a8797cea2b5bc911af584bd35820a23bf32108ea300da470916a8c046138a8575392f3cf06d4fbfe86b568ae31434e218c35108e4004a79f8dee43f34e2280492d317c962c39f76fc6999d33d9003d9bcc4af01c3adbe2875014a99d3940a506e1cb4ab1b738f93bc3a9711290666d306462a0ac67a03f5189ed5ba5ee2721b453daa8441dfccc8dcad25d8f8bb9ac73089770c00e0babf38639293ee8908f2ea3e658d84a05fe83ad8edaddda900ce5b8ef0e49f45684c049e6975311674905413a341d4786a23e6ed35475102928f0f711fb58d5689cbd8775978eee0d5b7bab2ac04d99769eb00c9d7b906baaa5ca4eadd83ef8e623a50566c7845c0c671149e747a50910d007bce6f3b16ec695fa70c89476ccc9ae0385e5f7681c72913db8678a3b6923a50776584d556ddcd61bb5c21a6a5a82a4299ba897b7556b6a0595adfdf4d0aef51158da8209530c257fa8b0c8912f433ec25ab40abee6c6b7f43235334dc91738f07963345d43d4e91378bc713407d445bcbab9dcbea32c53a07f5226322acbb0cdc2e0a146654a3bc0e7611950009d133a8d1339a153edd40e9bf606f99a5b6ad8d8c2ba41b7ff02314585228ef7ef8579b9e2f392fd1c9a94431a1d6f34bec350841b6692a17234b46e27dd8e00745a222b04163150b1c3c3d5c052f370f0813d132d60a12b92325bf5a755faf1cec5e14d6be06a511255d07d9b8540fcfbb09eacc68b2770681df8ae2ce24e7764e28bc91a41f0598ab5ccf7cafd82b07a0662281a2d129197df06129151da7c4a802d444d8a4f07cee549e6a3528977e97a4334ea2fbb728015c75ea0b9e832ed3166f2390b1be26192d0c919a8a8090021b96c057a85b06e35b76567e21483710eb7cd509e83b939a7e6b12e53ba130b04cec57056858fd63e0ef72d948a7fc29983e0b05cc1aa4b0190d3be08e4b430c154b487a4c542a6832433fb429c639c6fe5218e83c085c2b25e04dd8974b3d0f23afdf1bbb0b3efcca1fef470fecdc2fb38b0e19021ee8b1f139bd5c07df8db15a06f99d4a0880f0736de5f824d5a41ed9bd589227360536aa31d93c1a59afc6e9ee2d07cedcb8c27ee35de40f86728c9eef8096630563daa0bc15dbe26b65df5b1264178087ed4d2591946fdfecffbd9331e0232c5c770532b4c294bd529265eebb0b500dab03b90c09df7dab0d143890d8a8229a4092446782dc36bead278dcf4e02effc6aaff4bf93cc39edde52be25165bddc510913f2420ecb4b4d6ab3a649813dc38e2fad83163ca35c7e37c7d8336cf21654897bf6e2e2375d13eccfe20147340871422189eac7469900b1bd5e1b4ded5bc921391ad94df12c96de29022f29a33e16ca9ce5820763cab56468baac54317e235f51522dde46bd770cac0d58f7b84c83c2a3457af7b34567f6e57807f98727377a03e7bc0960179f7767902a48632ed862688aa092a37bf07cebca1baf3a73a4effa826b821b217ddb7fdade0199388fa82ecd185459f79fbe093317db59803de5d1c9439c19dbfdfc09358d8b30fbde4960f0a06ccb8fd733d8550c0aeb8140199dbab2407ee9c0f61d17553812c62640a90c3d6482a38108d4a465ca2c979a87141dee6ff8ede982c89271651ab02507088fae332377fce7450f801104d4a1ed7c0eb3173781998570ea85112755e15b96bf8a97d738f12a2c9fcdfbc8db74efebffa14f980904786959c132b26d3ccccac375bb4a2fb230926fd03e54ad159877ed0f1fa0198c990bb7ca97c51bd596729683e840c422701acaf687166a2b0c30b9068a638b0f8826ee74e9a6baa4fe705eb8246f09f3cccc23b8f58b976d48611e71002a9376c68775799bc52a7cf8ca9618639e941c104c9079db0c53bbb043edfb419a8d140e8f83006ab3effe265943eee3662424967b0ecf1b977f511164e220555b7f0fd970492061b1430e88643d97325a5fb7fa6de3aa8692ab80286a96b9f7c295bc680e18b7586520412df5b7d06ea6b5c8076a9b430f046bb7001bfe01c284bb6425dc87ae0764102c2fc063a1f1c320569ba06d5a8f6afb6d5118a2c3bb26ee727bdf4037f5e76295441edb54712d078482a4f7fa5fd5437fd96bda143c8ff86191af441a8fd8c8f80629f810ddcb0acfdeb88454c08016877a32333d163102cbc14cdbedf0568e02c840d8b662b12569524ed47eda9bdccb4d530cacadf8b1da989365a71e8eb407091a2c42c0bf374ad20d814b8980753502fd32f1bfbdface079e8f8e280c122cf50871c7b0cb59c39bf4f0d1c97a869d40724b2a6f104c34ab9a90730a71444e2bf4de0bc5242dc0a566aeb043ff2a0f4c4e71810d8020d603bf08d5a5e1cb36343ce1ac775c8c67c128b3c11892ab22b6edb4883a6a5f4e87dc275c429e9fd821034fc0314183a66c58417d581d1eb72c8f1990e0902a91f714e1301e1faad802ad56c7891ae80008a6fb67fca098d8624f686d35fd7f5c24a3b19426f7f8fe32a84da98d15ce12f39f408074166da2c80b05a1dfbaeaadd13410c2d55db7906ee8ba715add240bb874e2553bce3b78d1d4709f3a9e70bd77b83ef4985cad23adc7e194e16637ce4de7760eb18b175b8f4b4f3269caf8fa89533845330f0c2617b3d47227ceeb48dd3ebc8f672682465104b1d3ee2d41a0cd449c3905d33121d370113f94d7769036336a3a55ba3ad6620ee518dfb183caf7814b051871e62f31dc604d8924290212a912b08563f42599fd143adf58922cc677e1987a107baa4b0aaf11e522039e070ecd8067c9a359ebbc2053a09351ee8532c69252e79e05baf49445d5a1cb908b78c0eea3d3ea6c2a600fe84589208ff69adf055804aa4e4c511ea39dd212c2c45e38e5d7754400424576cb31a0755dc961c5ee380800539d0034e53b56a3806495e9fc0c706f968c08214a899b4edb59caf7e1b08e9279c70ca080ae22adf1285f572767fbaa137e3a2fec4cdfc723ba4f47fe502eec41fc3e280f4b83fc4dbefcc71a8d1e37d8a6f8bfe4c7f2ce0c1519a8722b629b299272dd58d88e4169dfc4dda13b838bddf283796f77ed6135df5c4488a5ce06b6c86568bfeae67529893976596127889012ebb25eded1be8f877594aeff71ae611b7d2de1e6a916a1129139cf0053c3a54385d66c431b14a7f4c48f960682a8d6dc6a18a9382648b13b7e286fcc4823c20c3a08698a05b1fbff50d1bbff464e67ca96b1a9fc46a59f074388c265f608928d06e772946fdaf1f27dac579e873eb776a06f824c09e9d9cdceee23c6b7510433a104e27dc24ae95ecec771dd3235b3407d0129aa2bba5427e056b48f4894f144bfa8c36553c0889e5419f948503b4566c27aa519d9a4111cd5867658fd855c8d237e286fec481fc20b3a0839335614d9da3e4c47fd3e1c7bed636051c62bc7744b00b4410448ade251664a17fd521edb495f15da076031fa1b49da3a26464ca96383c0502db32a0b240d086811dda20386249fd998a334c742799d72997ea50d613e1d21439f2d276bc9f3c1c1dd727b99b163b58b08ae987f6e46f453fa96c0ba36653deee1fcf40f54157491d69538b088d28f271c5906c262c75915862a7725b0c892e117cf79626366b274d72078e08fe8161defdfc7b44838f81ee7db7684fc22b53a2cd04830103dd86be6c8fb7147c7ab76b29c719cb84a0a24c24cec5ad1d5cb6ee044aea8214b815791a64cc8524c98c358d67818c36ea874319a8fc8cd40ba26ce8061452bad81404eee7be798e2fa46179124ca22da404c690103e07aac78db4cd1c0d3424220cb3cd8eacbf5e89d0aa50bde8625f58d20d1299ce4fd0c4d983e14fc2b8b755ccecc9ef72ea3ee756c2bb7d438df4e42b8c9a7ddfd11c322c6b61c03326f2d03ec58f4a5d586be36ebd666c677851b2b1a8274a8c15765b6142e15d9a606e3da6029228c599a1b6341397d1f0dc196560531269567850f05152917c03eed0c08c3eaba84a65f76b82c904a321e1b923225b77bbd76148fd2055442916bd10ca4231729dd58e13e1adf0eb420708b77818a695e24345498daf710743b9fe6a1b5e69229bdbe113d8b3e1ffe427738dee4ed5c54fa7c17e5ed998b7b69dc6761263b9327bb00966e4e5fd3bec295389ff63c759e8d45a8b138b8cd70bc841245b19a022f46f0c9dc6c9425bb82f5912d0e262e04c703081ede1c1685193513303add3b4921d4f181f7a9fe6be8017e22c130d132d25bf4a6cbada32b5304916641c449c319084ea41a7ea7656b3c1558d962331ab307243d36c774c4b0864524b256eb10e4ccffdb2473d19c5a82a1ce5369dc1c3b059235d35b7404abd76d5c5848d95e5528619dbdd95802b4729509ba049ecb398cea580a6e2e42a47a3ce68b264c1622649fccfb864ab3195e66f87a7c82e8f9fdf175078295ff88d60628ffdc33662b74ea5368342d12326ecfc1c5f938c6e02b95a1d5cfa31a30cce696f9624918b7b7c12f763c8ade9f14140337eb7bbbeac5ffce178f7f66312cbaecde92da6f4b111cef5534675de1481835df7baf2665655045fb281ebc33316674a9286eb8b99abf63bc7e4310b768545f19c498ea8bd47100ed574a39a85339b72a87dd0cb4c5d0fd8e5fd1236d26244f8148b397988a4b5c3af8ef4764a35379aad33a9da8f2ca6d9905b5271e35aeb27c9b9fd81cb8ad9bc4f7ee29e45aafac624cd2910a5a6c9d3540566915542a54d51c9eb46d7a1b2666db77ea54c635b1e96c690e1a124e5c016dd93b7766e9d5323a56e48d1297a778761b7f9d82fe52665278e1f36d57f868bb3659c76874127ae4b7097faaa24ce015371102b55f1d13dc491c723628f26dafa1a8b0a84d8aa68152394b8909b93e7e9d0a0b7dfbe78e9c02c32a752feeb3c9793be380d6e2c709337f5aea24135281a7a6319402717a2118a470ae0e61f81df989009b1238b83709734efc55e1c55718f7fe0e9bd9c643e9c6caafbcb3d5b5c46b682240591f42a379e2cbd2746682e7be77fd765586a5ab04fdc23939acb66f8f9ba56de8ec9bdc6fc7c863f12891336f14f31fc3e0fcdc0d1d3a49783c40d724ad9af6521d6fb0b0ce4e37b4d653d5826788bc315a8cbd1ec830ce57c53c551bc24ca91d15bc2a208f9ef43312b65b76d52e829e8578cce4a745a3324ec6949818e24f1a72b889da8c8c20a08ad1d30411a6754ed48b06c99b7954afad7f91bed2e29e3fa345051b9775686bc64b16544c529eecee6bc6e2cd03c4419e325775c87be91ff671de6ed43db43f123fce3bbcd3860aaaa6db994c48ec19d1dc28172b2905a0b2ab4f8895c6e2385538347783e3ab84d2f978528a7f224bdd77c0bc39a918cd81f21c44f6841122fce852441d670397dab659e71506017b3b35dcc6c1aad92a9d8063e91d4a03410e9dc723c21850b9409612fc51fdf107eb8a4610981bc466ca9bbf7599d8b4032d68f65a3bc3c7c35ac0409bd10f4cb07d60041ece35dfb81b2672ad0d0e5ab89beacc1d73326e0aa4896f6509700dabf20e12eb137f75fe6620d7450a968cc597fa83ca39af250812302eb700480961a7015042f9a665cf81c15a52ab0a5e95ee2f6a02deb2926e024da4e75512231337a9b9f0f7ec9b23f3ee5a18afc13d1488dc38af28f055e7908d8c6579241d108b194a07cdd59623ab6e342f288deb70a7ebfc6c5c14ea46441731886464c35c21fd1b787e2dc764b4c08eb6c786f540ae3dfa254252958ea87cb9fb9bfadb94fb1c7e06f7bc0f3509895808fed4f4ee6b069287a53f2618c24d5a5e7710a9e0a49b3c5e1cca7127487d57ba4942c8b2316a0a6533c957894dbeaacaa87fdc66710a5f5499189474fe75ab1feb7b75373ea4004c33a71be705cf9b267c564efa503db36979e0650a13c30d86dd495e0820e7c63a8858361253c496d4d15f54f9e1e840169d4c43e120e79245d18d0f21259f8a118116419a61417d790714f954311d88734274f12b58dc584a35454582c096c989e4f83c8b0b6a5079ebe782497084814d8da2b9f4a471938817e84665d4b044ad8c31ca4a135f8379d14718c8027f45a81a6bfc3c482bfa262716686433f5077822ce4d9d6f4f6506850649f8278803efd3f35ce395d3320dbcafce5f6d810c749b2e5cf0ce13294feae3a194ff64325e02d7002921195e101b449de49b70e79563e03c89a7b2a6ffb5ab3684dc1c5639c4165d22cd7e8ca77c5f903e57a26833d77e2053da22bf7eb5810b1960141751b73b63096a21f45c95445f4ee36098344911fecffecef8392b3d555aa2cfc74b5a335857137ed36b34c1945c55980e870936509c536199ca7e6efdd50de1744269cef330ad3b540f8b0380bfc57765b84febb15f993fae4300870c6a61a4287afed32683e63ff89886db275297bca9e9da6f937b09a6cbcc231339243e36f5f55f7c18a25a8584709e28554b5ab584da7f471e67c0d6fc7c0eedcfd435dfe05d23b926e509aa5078abb49093ff82bb2e641e9997facf76b3d05684b756854400674780247a3c2e220869f1d51e6b56d58ce84662c7455ad58f3a2654b46e53280dfe19a5e688629087a76cc82f1d224f1f15cfbebad9a3a852cc4523e21be7286e9eecdf2a31016e63e8c4cb43bb7418feda9c4892a0c5243897e11042408ddc5d36466299b114e1faa9ef3f449fe956ab66e7d7f3b8465c18d27cd036a421262914d6459d285a13d0d1f07d5a1d6dbc93c49b6b79c626e41bfc83ec50a5720d348139201621a3f0162fecac94360140a22506f66386ce222d762e091935539f94c967886f60851ad6401b9330e65821b97dd48e0d081113b40a6ba08fd3bc56893801240f52d6ea0683628262adc8183ac22369c0ced82579d548689dcd051a1183f5d8d5d42965263619245fb4ce467855d57d2c76af3a294e21307739282f18e096fc5d52d1a8e72ae4f63fe518906a5b67cbaf9bb1dac29b04a0cae02fced56e3373f46bccefd03c1a47fc9613583fdec791661b49e862bd9f5b2d8ce07f292c3b33feea141a75bb2104d3074009df3eee3524254b11cebb0015e894421960056d335b1579594e862ca301653c62b18fd31f8b7f109d0ce203b90f833cc5408df34bea5768de4b46ea03fa1e95a6669bbaa48424e926cd55665c5064c72a0aa01e919179d8201b945d7e694bf9f83651f88b43a438e9bf21e7d809bea5a40ad11898b80396efd5ca3b86821cb29bb067ffca13711810f044d17f01ca6e0ade7d70fb3a42398f48089ef6749c16863c7d252f0192d5e501b3c464898c05ce9ce13834a924d99c647168ade7c615208d4bbdeac412351d7cce724f84a23209d01e11598321ca821eca0402173be7e0f6b9fabf1b41d849e4a84e3d86c1aedb88a87f1602da4ffc05f348bbb467ef673b235527384273b457a2bb49f535097963ccd16a5cf6bd271a24caac9ed47f1f4af233c049e2d35e7058c9cf68733bd9ae336d53002840149379089266b128833e7452934d9c2ce9843b4a1e0662d09c8f3bd343a45b664acae3ee202c896400e5df52c8e2df486bb1e21322c73567b8fdf4a89cad58ba8bb65c236dc757459554cdac33133e3342be02428fedb387bcb0c0823db3655375403755920a930f8032ffb1649fa31baa8e082cea4dea1b4bd79de04bd3e982a4a8b8c69d48f9faf292c4d8d0fee1244efc44114c803621adcefe47c98987af4a0e03da87c426fbc3b2b6dc3d7f57134748fe554aad3309d861476466d48f7d7836f1132ca9b839a96e84eb60b2f223ba6cfd6dfdb86deb1d2c354d670318e08f10f8c691405c5fd61aa70417bd8d380de6b1c6b3208432a41f9db626f8e263bee521401e31346d7d84946f3c86e093ea197886bec3cbf1dbae54c0e2b8e40a1960b901544463ee39a5778464ac9c86e4f8cb1039cbc91de7c6b461238936aa1fba3d316bcc6c85606e176a93b6375f750044603d2031083bb18060c73fd2edec0b593bef0b8c7fe82a55c8676c8410506c2197fac425963f370954bae0637ae5e2398547b6352a255f97abdc9a1b89a4276c83fb00f356f5e8eb63a9afe8c216b6a352b0aacc6a9aff54a0ebb94a4e25b792034aba39ab6fe500bdd3d9edec91bbf06beb120d1af6e626d4cd300ab88b87031c37f7c50db732b2f5eda3d3301bc94bcf4c20709f42b8bd6539ef983bb4a6f4938c58f9786125e987401d413d39660d98700d4d505e183bfa3e1472b212c5e5a8e254dd3e377204275287ae1020f484d887047ffed78e200008cc2938dca14e04bc22bebaefa45df79991629093f09cb6300233d5aaf8787a408e90c7f3043be2468d32b3b1266d01472e9be23426975347fd450dbe7f81d63644a8379fa8d3df921ef11852f27dca304afd6adcb95dbe33efcc026e66ba8f86ca54a9b359c2280ffd609d4575886710d711f13b389d0feef48cced3f4554570fdce011dd8ee08819e7498f0e12ae8268348384d35c3873b4b4f26d4304e9f36894846a7b6684bd7fd53b28a6390c4d33de2b5ea1c3d738ac0c78665b0e6cc481f6eb4fb0a8ddfc281fe21d6120e2a40c41b552f56e8a4b08e3793f857afec1b4474461802d62f2d2d0e8479b18ec8d4dc276cc2ccd4b6bc9717803f6923a78bbfba4c50c6b8888f9ed612e28a97a8c60f7e3a5e872912c63022889de6187f8aa741ef1cecf4a3458bc2eb127e096122080caab9c75ab42c4a2bcc1c49e7a83327df2c4553699c157cfd1434b4110b8ed4574bf5172af274acc9bbc079784a5bf9d608e5e22e47c34a48b536a038698dc49df401c1ba36416b43ac18c0f988190a036f689218bca737dced5073067a3b70da3d0e0586372123a43fe74113c35d606bda493e2a6f31136ed76389619a8feb316ebc45d2b85c03a38083beb1dcb468b82ce269fd67dca62b66d1ccc762ade23bb8f0e9cdc41bc3a078c3b909eaf7e28fbfa1e02f821e0a368977fc74b2cda45a8dee60b0cf5ea8ab0e887d31f23d56c53b7e2f23c3f3bdd8de56cfc8529016f9da2932efd99b89587332fb260f5ceb1bc2071df4c695e7159cc118f4e09e820202a517db5303ef23417f2f5891ad1c3a053a0b72073dbdf3a85cffaf4f5c189a66b30260a0542d059a77c00ecb105d9e538203d485863ca4217b1bcca33247101fca7a4161b02700a37f7dfc0363c3b601cf302175460a187d5e67b2304a214808896ee3c4e22f9126af05fad51bd0ca5336993ca85b0e2be555c3e7f6ed43b4973301ea83131d6e742da3255bcb5206d89baf8354791a4a55a4e6ac775575493526aba379f33584247b5950e5b1a4d7db92e754634e587adbe6978f154038414ee03af7ca1155862065e3114d1ce69fdf75a675d29637d08e5d67879f9e82537c8a9dca970b7bfee8c3e7e446f0d8d4586ccd73c431f0f3b4a79b8dea9330d118071bfae830586b10f249593742d3383529d76946dc1c400ce95d313492d9bf99bbba6dd090db51895f7652136b595f43ea0e43d6cbbe6d1b8b71e28e4bf320954bd5dc5821b9bce3fa695278ecde63a952ee04043a35164782108d622838603b3e0590f8b12203e55c60f85e24dc4cbd3dc831a7bd8b06dd2b51b91b79e09ed6cbfdca99ec554f97c104c98939ccc4625f631cb586b5a8f4ebdf53f46c0983bdc2a9c5a756c3cf90e20c300a9b0bf7c77eef9024065b1c15b5009e37699f91aa4b5a791c266f5975a4d91c132139e8738510ca0d111ad0087ed611ef36cead1458f11c0821415cbcd9031c8b778bc71dac43aedea97c08bb0388ac968a9e8030b822d33916594fe0c30b8e83b294630ddbfb15747cfd7ca2b5e85e3ad231cccc081ce6c6b9edafc37822b8e974e7ac93523621193427bea933a1b5e57643ae5038d53050d886da0fef5c9dff043dd22eeaa355efeb0258c8314f1ebdb0d1f707850fe3faaa617680ea63889e519a505ea84168dd8a7a2279fdbe3b5139d06e28ed6a978f88704535a63d5b51502543b3a1bea1aba190a16f4b2bf64c2704fd377bf0a12b9d124dcbb432d64b689985467e211754009a1eb1c2a8da835eb753de580771cc82aca97ae1356b6d4d11c692814b3e107b415e631fac31b706a280d04f73fc05d26fb2584bf159355982b89a8c760bd7cdd643c1112c0d5cfff6f38c4f83ac0e71b070a2ec70c7a6506c6924563b655d870c884b33300d3a3100ed91315dc7c692f128a6cf98b3104fba1549322f9fe2724144176d151016949885a65868551b566ea02111255ffa8764a0d2fa93e485ae260d08f3a4f1caa0183a2eab995151584e5c7d1c5127962fcd7a48c206689a73c8a34093a0910010411d03689840edf0ed801fe293e5b079988eb9c45fe22f715c62525d832d97293f91624e7c0e7a0023ea88f13695b721f7dfccea416e0291dea628360b5046b49a24fe328089f10e852ea72202f4cf254c8d949470230fae4607fd9a6df2c1f00443a6a9ee2a9d5804007c033572b5d98fe7309f0b319902c1b978a937f68ea58c4c5266be40f9c0d32539b9625c509658b4719775dbd0b1914a12afe353ca5a4a5a0a992602c94b9855babedf8f93b78ed0a71b1d8674ae340d625cf81693409fce7bcab989441bc08a62db7f5577c03ff31b2e9681380f3cc2a0d1b9d9753a145f731c77a22dda93b13521f37aa4b57f5927ae183cbaf1514a04685a8e0e1be96c58d194b3d4ed1fc62613c302f422a791dbcf30860cc9b6d618aa8bc931ac6a2dc8e7e5f9f810eb99aa29c06c18a9f295488d53f4d28bb6eb7114d794e98517b22ca5512ab5f1cb1d8372951b0657062f6bd0802aafe49d9e6478ee075a0ad17a25a65bc192fad75f3e1d516b5180b79935ec822bc53d4002cf475d446b1c96c9a550ca217b67170525eaefd632d4b6e06d4bc32200b0dc843261e8a810dd2f84fcbdd6c75b8e827873fdf52e05addd4dd02b54ddc938f7028b835738b4a384d2b6c89825fbdf8b4e3d8d69380cad3be38532b48f38341a9d505eaaaed2c7fd110498178633006f849b75e2e09e9dd5c1eac5a32077036b76b2f1bf748558af3fb096d00fa9fb93a6e438d17a8c3b4cdc65948bf8742e20287dd51ce7c1dbf48c4b45a3b9d028fd7bd2479be6b1734c8e0391160103b52651995bea8314d79553dbb3a843768f93a023a67ed34864fa74328538b18df5d8f0e4a3102bd139eae288221c0a733c5c5b9b31e28ebd63a6c0da0c12eb78720bf7269b710806665ca593df07be435c9bc99596f1960a1e4ba5652caf01e45de9602d63e6ed0e2c21268c27c7c437a36b9556b1d9f236b3ebf6feefa1a8c7fb9f65268ea8a0d2f9333439e406994734b73a3b9b555a88ae4a0aeb255e098283359ff8a2295dd969a34b498a16896a1575ffe687e7331afa01906ac7a197cc2970a87cdd96525fba4bdd3137f5fbef31d764b0ad67cac2961db830c0c063935e725d6c1d3e2fbccf24d8dabf85bafb0659e4496bbe057ea4ecb3df0fa7e08111bb5a5a237b8fd8b76b2fc013fb87f30f0fba81e747f03edface72d03beb84327c0db7ebcc003c5dbf70eba9edea01db5cd9f9e9a8dffbd0d22f413d3f56ef346211615cd2e1045672cf61f74fcb43f2ca01779480767cc244cd9cdf5c75c70246f1162e7c276794d8a0374f1cc198f8ca56555192c443b3b11a6e0029332310684970532b2a55969675b6bc72c2a6a5c0f9fd3bd63af451e44ec087e1189a77047a2a37cd4bf9bb5b268ecbefd57a4a4c626f4902fc12be88546a9107469a3b689ca64ac6af9de45efa1350d62883c536577224f8d7dfac04b35d8f29d1550b447986935b4987ec5f81893704f852a9aa7f2b7d35ea6fcb003cc739b627f567ddc47f3b03a6188d1f94222dd5ee1819aabcd2b472c28dbc3eb8577e33e58ae4aa36d5581e6b622d60958037979469622482a21ff5bf7446860abec1230dd3b74be3ff614db67b0b82aaf7cfd5af19a9455527987bb2fac40fd495914918b748b2ed2411c90ee52d97b5aa5bee77d96ea2140ab9763bf55a5fcebf99299cf4a36a20792bf16cce440ec08251b71a6663b30bd83de86353dc4cb7314b66fca846c5ca14cff18afd1590b71392e47aadb5482f09a22ddd80184e4d6cdc5e5ac5f52f3a5957e9a5592852b9a0582886df194607479b6bdabf7ecbe0d47463cd2636f49c12438eea0166909b5030a5f2cb26fef8ab24551157ee53b55c43e879481fab2c89497b9b9eb639a76b2b4d81773d5a3d6aa7c441b8564adc41605b16a206db6d408234386cc6e353da09831e3987a81147ac59e7c1973a536b67b12360611aaf06c9abced02486e052bf10870ee5998b9bacce2002071b082371df6a8041e897327b4e4a0322c6f09dde51293f30055cf5ee22426ebd2e7f6678edd71fbcefa1e2c13c301b03f6a41563a559b5200cbdc0bd0eb14e0fbefacc47287153624a910d4062d83d78ba8d4150f354a1612b17068d8d1e039cd6875a16b579b47301715acafca4e8685528b85e577161d941ba9a17c2afa2cf7948d30c7ec3a44002b3ee372b1afaa01193e9d021be822ce71c6908e331d1c98b205eb0b979694581ff96899e0059ff9ec0a93d44e55c155c0d620a5da3eb544d8089ee3bf2e399faa7fe00667f46879190430385f260f3a7af9e50fb338f8da48e741636dacff56dd2bf9a4f7edbeb2f82d13e071d6cf613945ae68b4618d8e2282a6819d8a9715807ea5fd6218749140621725017c18493daf402e1b400fb8959dba7dd0d119371db934af398b5102fb9ed5417a629d1c6863bac178550b3ba167d2b837b5b029c05f07be45589046aaba28fb5eb98e00c7df0b217fa24928f4eb85ae55ceaf280d11d6ee691db7753eeb7a5650ab120ae8e8bbddae3a3e5e1babd13a5b79dead1d77beb4ef43375a16f3aaeb2a5777693847b590dc7ec648ef90d32a9e72828b54ccf43825de753d9fcde372eabcaffefd5d3ddea1b8e21e569753636a8f4a532bea80ca50f7d41369450a10fcda188998651addd1145b15263fc0f1982326563f396f75d8e20d8c9dfe3d36513c77f91157555d97da82fb0e596847a9030758e7df09cddde796b3ae89b4eacbb09c33dfaf6b6af93aa34364651a2ce5196f173cef9eb16f125a527f0bcd0e98b877ee1234a45647bb9a94cf8d38c619e5db3f92ae33670a90904e65e9bba850b5287fcc62c28a3f20febf1f02995d1a4ad1207359171d1c8a9974c30102838a9e749970684613b8be8d254d27830e85605a4b05527eba04d44958132ab10433d91420115d572797be3a787647d5c535ae13db3661d6f4836b9076912e0742381d87bd5eaa73dbbc577b2cc702f26e89da6b24cfc6db2eef26adb963bd2d1e61208b9106628dd013612925b50ce1489d6316c057ace4cf4a48a929b4c1f1c2720888f63ffcf4442247943569c4814b61a7a4ee6e50d056574df2192f9e759dd851592c024633c9980b5ca506f3919acac5c2b9ad304c732b1963e7b341dfaa05bb570e39c144a61864dc5711746483ae3d6ded929a823e2ead0a4ce088578dd54b787cab33a12c1a77dcee3b522eb0b2c310fa9fa7c466fd18fd4cd6682f93afc7038075faee02b166b1b748b058db8b955c74f2a1cea35c645bc5c4bd0395fe6b2802b9f8791a0e474248474cdf98eda3ea2a26d65090c43ddb04e5eb906ab14c365115fbd120544c50279daa98c82db58616760d58ca426e10c3e84b64288e5b8246223e8725795771c4f4ced3ec7e212d42f4e3d0f68e65cc7847586fa7176268d294e8fe5eb7c1ed87e9be2aa7faba9f8892035d2ce3f7b3bdeea61c673198cb89a620e269d11142bbf4d1524ecf39f2e4b2c633bb0e1cc5a61e16961b72ee3afff796d90a6ca9e6191353bc2ca2d75cebaa0ff5c855b1da2900df2fda4af9c83b888ad0e313d2161c0413042f370d2ea7f7092523f85c0fb33d6e801027171f4eeafd82dbfc92efd320c287f0ea0d13017ab121473750b224c301c33f3f3f3f3f3f3f3fffa8692d69b5b55640a45999a4243314ce0ed714a494644a29251545dd41b2b7875b002e0c23bc606d3e043c045104c523b230ea64e2f9855774a1bd33446261d8f7ae6471f353dd0b166695faff2bcc26bbecb58e922b4ce15f59f0bacbea31a483482b8c99b29ffa4c4cd6e8b0c21c45bcfe5514465661565d9deb96c2bbf61a5185a68223a830faaad3af841032a274b0029153183dbd7486f2ba78f1731c8898c2944c9dbadf336d5167197c6078d0f89011f241835258763aab7a714333ef2bcaa99097a6934ba943e36580886183496178a59d578573a153374e88477a20320ae3abccf6af6a414e181e211f61d800118531757ee9242bba44da9150989347a12f5fed5ec92f4161ce73daedebae53fadc274cf1ee4f46778df00e79c2a46deef34d5f0542a413e6fc613ae31e2edfaa396116a3164f958a37619432bef42fe9ad2b170d229a30ab2056e5ab8a15b17c2413114c64c725d212d77d14f35268ad948e54627977f7e223db4dec0825ae6312d7819230baf49c95b02054cb133512978ba977a5dc9e5eba83bfcc55239030d7ea99365591b64ac57c84e1dc472a55967516af76845929579d2bfb836857d110698451fe438c289d75d276618429ebfca46b0b31b208839639295676922375c98288223a1ff1d9c48768d3092289487737c6d25e4e75313b820853fc686f59e9fdd5e1d58730bcf8f03efbf95b7d94218ca1b5dd8812b69565a810661d2d49f1f2262221ccfdb9c7654b31e2204c23b45fb7948f280853742507c21c3aae1063ae856deb110161f44afa3a2ac3723221fec158f2548ab75311fd60962fa3772f85d80773cbef5b1277a35d4b21f2c1d82f4f9ffef0bf7bf1c81e4c962dcae90f97e4bc54d183c93d47c90f4a563c1d27e6c1e4ad82bebe7796e11dc48371d4b3e5cddc4e091dbc8349df64976807730ce5fa51eb2cb10e46252ad74773c988d0c1f0298da5152b96c147a3060d0f908f3d431244e660da96b7113fb197f7a21ccc9d2bc57b8a2f8c83397bb7b6e787f8d339897058b40a5aebcfb5147c837133fbe64f28b1e3522c2ae2865c7a4a42e997ae1bb6e1ac2acfd5581ef15db1c1e47272e777c7bc5f8351a5b73bf7bad5f2d56a30befda7d95fd55715846930091d5e85f816d9ed190da658a74de56aa9ea757a06c6335b44eb452cb9beb97a9442673d9ac13822e582181d54b610298339e8afacb30955f355d12c44c8603c172f94fed62e79b931985dab9da60e2a42fb1b118349aba82e2af34f2f7a56211206a39fd2ff2f4bc52fdd296030a8a855e98ede0f2b622944be60ee98723aa7bdd668ad8817cc5297526a55ecafd4978d74c1349fb3a3d8bc254fd108170cfedd2e43ceeb3ea17b44b6609627e4847ecbead26d695ac04816cc9ef7355ce675695f61013b6410b982b13643bf7da758337f0670f110b18229ab0911d352c357a43052058312a62d8a14ca0d64840ae69679ff51db721cf9770722533097cacb3b26f7b0710712918259961af91cc50f39e9230c04b91744a260fcec12ea1f364d5e1c8182f1e4bce992f97bf2ef1b224f309c12526f9532f5b97509f164e22e0b9f5dd92e7a1a1fddeefdf6235509268c1dbe4a8dee65f1a6de417209c3287dd9d20795d254ce9458c2b42a6fcab2eeced9534925cc59b6a2fcdcfe3df45220a184b1ebf2deab49259330ff2b151542780b3917488b40220993daae887de56fd8c01348226190afa232b5fecf9087a271542081445aee7cbacc6e924718efb390235f8915ba7d481cc1eb9c6b54ec4e069fa411d7216184b19536294d564402c922248a409424e278312f3b970b971009220c9636a529f5f2a274d6210c9552ae1c93bd210caec385a595a74218e4b928add9b7625e228439a9ea3cae957a1046e921ae26a599a9930bc298af6bae6fbf4b287120cca7ae9f84563f204ce9a268ad44a8fcc1f441d6b4b3455915f283315e79f2532ea4d87dfb70d0944afbc92cf960b82852be07a3ae24636749bf48b9ebc15c1b5fe2bd57491e0cfefe2d9a1ef55beb588287b2ca9e767e968c67fd9cd75c32d8f80ea6d83d72dea5155be7edd0293b351f97d37530b95659940ed9d2c19cfb54cceed072a7a57330997dd0ed621f0e2472300891a71ec5e8f8a37212247130bb0a32be7e71c5ac8e040ea62865fd25b95bf206a334535afdee05a1a2921b0c7641ac78adf9594124694305246c30fd47a53d4ea51c44bf06b34eb184504953987a971acc2a8991ae32326568531acca375be86ecec24f64183e99552ae5e55980baa936730e78607a1e3c5b77f6e06939251ef39c98ba2ba2c834935b5d6d8b6300c2464304a57af6b3a6a25fec231984709bdf2fea55652480c4653b31fbf39255f7b188c16f3846ec99bf7457f200183418a08b515ab3d2e5710bf60d84a5a083b9de597e205e3a6aa0be3a63c82a40be63fd9b236f32a6787122e98ecb4abd83115462921f781640bc673a5d4b378fbbc1e2d18bd3d25d1d15cddbb9405e3e6564ee5aecad3c8cb0e245830fe8f9748905cc1e06a955499dade2fa8680e24563078bae75e5541d89dde0149150ca79438e977daefb5621e48a860ded4fa63c9f2345a79922918b3db4c8ea6087d158463600f245230fac7d6d4d21f54580e8d0f303e6e8c401205b386ea2cab53adfae40b4102854eb5644ce52e5c924f4aa97bed4a5525834ff284eb9038c1a0845c91f292fcdc6a499a6098d55a793115a2bc9430c13ce63ba755ccffd859827174e69abaa7bf8a1f259883d0d25fedeb4930c8ced183f4fc22c1f0d16f4cf4642b901cc1ac7a3dc5be20a4da9a8d60d8d1f13a77880f252a453088cfce2acea9209010c1fca7a23335fdc3e7970cc1d1d478cbb5da15fc5ba40999953c8f1e9008c1bc5a3ae50b4a9220187f3d7756ffa3432aa10408a613e1fbb65bd9e4fe3f3099e5f7af3bd507d7813290f4c03052bddaaf4bf2e93d090f0cfa62be2b53df4172615e75d471890e8c2a6b8b4c177371ab8fe4c2b4522a21846835e1591cc185b35e9645de2d7db730fb8bcecb7a5fc8b9245b1885bb0ccfa6a21811d5c230dee9430b8390adcb69379a85e9b4c347d103a64f295c14e2d213441874f6962af37b3c4765720883a95a77bf57e14cca2686300a2d42748adbd61dd449214c2aaeb930178d8f1969810921cca774ef44c47e504162801c072683b83dacb42cf2b46e197c280873d84da983a7f59c931a04934098fb343bc52e55213b450313401845d6bf92e7f273cc2a838f3330f983b15fe94c3152c8e74b0229e503133ffcdab7f7a3af3fea1c61d287091f700f3bd1834ef260ba64f1a49dbadcca2e37426c4cf05090d50adf257366e64a755da7543d2e197c323828e8e800a1c1e40ee691e2b95babcba23e696207d3fb2ab9e43a175b85933a201d700ed7319183d943878fb5e952bcee3898f644fa856f3d1ccceeda65a99454c7d64dde30718351099d35731796d49293365c071bcc51ed968afa7ba4bdd793355c871aae639206a3cfc570a9c338418339e5fda50a42278fa29a9cc1a094978d1ef398e1bc3896cc2b6dba87788b5a55eeafa4ebb8190e26653009f912a6b75adcb936218329b9e77f0c261d1d7d46485da9c4440c8691e7afe6cf0e8329c713272ee9285ea8dc212660307d168f429e8aeb79f505e35f56eff4d525abf68229e8177e9edf35e982b16b4bc7ace76b7870c205f389b8a877b43cb4306dc19862b25a51a7d1ad822e9868c1b0a29d1bba4fb26010997246efbc64feac31c182c176fcc28fc9cf98d5150c73dbcae5cddcad7e6f9435b182c19312d2c5e8a8273d5c05a312e63de3ae9d50c164a3b7af4a4e6b2d7d0a86fdced962983991c25e77fb96728e85ad31771205e388dc8f2b2b6a8ada5030bec828efd5d1271885472de555c8264e3087155a57d6efe84aa89b601aa13fd63bc7b8453513ccbdf1e23c9b32274b306a9cabe0299c52aae399132578765aca5c4d5b993049824986d79aca1fe54488264830a8d4aaa7a65345c7d3e408e61c3b1dcc89118cfa6db4aa8a56118ce5f1b267538fccf310c1b4953d4449570fc16072d5a513effefd2913215c87092641c8b4cef669f304082898fce004131f24c260d2031b63c2839cec60a20393be6e6f8ddc97d04e2e4c958b1f5c18e3e5a7a79b974b5a7d0ba3ecf9c7ca2d17d7d91686cf612e46436b955db316aa5854cba5733762592c57b4efec5ac8486d91d0c25c2f2bac8e98329764162655f2fb71f585dd306561d422a793c4c218aba269d97161618e5952f6dec4c87095cc57983fa48aa6b42bed5eaf7485d1354544e9746d70e3c528c11241d20af38ec719a1fccf6485b1939217e3aae5ac12e72a4c39cdd9797c07d9e0842008125598de84cad4d94b5b9a325361101d477d88caf7dc9a2b418539b5755a1d462ce7739d203985f1947819cab4ac0a264b4c611a6dfda85e7b0e2b35cc52986fa53a73ffdeecf42129cc23568a123b634ad35124536bad6355982b43220ac368d7612245f8e814c9e09384e2b497b3709381822fcf1fed7f7ecc0d98a001cd06c9270c3a07b9d51c75e2e743e341f0338e085a8c3b26483c21e90472c2f02eaa5c980795c47dc9260c4aaeb614d74a4bfd5e13e69cf3d44e8b5d052135f82f6880f101620008807c21c68c04400000207f438c90f3cb230111e8e201695fd87d9168187140c43a923b8e0103f0c206e80b0474110222860904e0c58371c40083c609c3000000b9f1490c55e3868d038400e4c3c641801757e8c28b2ebae802005f74022ed0050808ea1000004ec8511d03f0e2841c55e3464701ba08c0020e70e33d64904e0888874702baf0420105480f037084c1c60c301480e30bf91112860c90e3e171000e2fd8c046ea42c883ccf81904e0e08259eed7552a21e585f5b66018a1a3445d9f5a30abafae3c71c6cfe0193f230b46bb983ad665031b69c6cf28337ec67260213f42c6f85057c88f10556386181e1e07e0b082b92ddb89c8ea20a5ae6570e3898137e36f788cf1a13cd4dfe0238cf391de06885f088d8f04a1f11172834f042cf028014715f223e4860c90303c3c0ec041856e64546d9a011280a0018ce0984216d44b2ca58bb1b9dee569455cde4f54455d0ac64aea95f210ad725d98230ac63b29b2ba17941c5030aaa4252f8cffaebb8bc6098304af6a88a05fd5a0a1c9f1046385cf6f5a65f5964ac6e184e635f6335d37d456f7e4688259b44811afb4e8ec9d87d80003617030c1f0297e0b359f3c845ec9e05b1f32401cc4460d0f9b00c7124cabc48e7afc10b97a75e78543096c96ede7c9ced86aad65b936389260fe16c272f8b6911e320e2498b4353ca6962ab84a4d069f87a271c238983ae03882416aa9edf7f5a8cbbe1f7a34388c600ea6c266671d2a67b17a8e22183e9e2a53a6ddb5f411e48411030e2218f69594974e5f70d1460d1b89388660bc943374501697c1977e0ce71082516d952a75ba5ee9d7ab1b23e0088241eace925dcfe031bd0ac8c001847472edbbda4d3f06c80fcc25a597ec3eb542c88f72f8c07c26ecb51a1c3d30e9ca9aa3aac46af9673f387860ca49c87e8efb924aaf346acc985123e5dde0d881e957e3b3c38d6ec8732f844307660d6d3a2a6eed990ad508114147c75dc945c1c5dec2b4162e4b137d9ad8e28ae5eaa12297ecc5927a145feac5a7816e6346dac0a416a65842bca82cb6f383162d8ca6574d87536aaab26a1606d319a9d47bf6071359642c1216f80a934a325a5b7e76cbca7185b97729eea515e6fc41a9b6545177bdabc1d3d80ed0e80018373e0489373ee4a305135618b43e19aac2c8f29c421498acc2744abed2ec285598cf946987d1a734950aa38e9dd4fc6f74cbd1a3c2786b265b6b5b3454ea14a6fc79c4659fd1e61a9bc2acb9aae3eb7ce523af0c3e2b85296ee7755bdb24302185b9b2966779c56a7a544e4661fe58426ef8b628ad6247c70d26a230cdba8c1b393a90f326f8df4047c70c8fff35098559e8cb7ab070724fb4d64e4061b44fafd3649d1a4bf14f205fa8a7d1796d434f14c58951ae63e284a79de08441685678d1966e4239cb1916cfe5b279aaabf739d18469fba396daf339c984e1725e78ad3b880983ce2a5cdb681da4aa6e7209f4e63645dd35f682134b9c3ba4b4ac45e507a95289c5434df364b870420973149e5fbda6d6240c9fa3947cad724918cf2fc5cef67f5a6c1b09a36ae9f27233db632224cce15d7b4815eb47183be9553a2764eb124e1c6114b9325fc656701f39de36c29cb252e51a739a30c2fcf8715465db8bd217b1ade625b36d4b5e26ef266cf777eb4f8f268a30ac921e1fc2579344048594a893075a16e42888a220640c2288c6d201e31248201038248e05c30181485055f10313c0008b02d17024120bc48180401cc97110c4201403210c03210c43510429cca8520fc90cb000edcc24ebace102efea271d18451c3cac2a269153b5e3d0305a8746d1e516a62b57bc12c4db15088b6b196d28599fa5b333c1c904375f0b233acf2b3888f3b6ce4cb90d76d32ebe406f81dda968e356f632cadc5ff44f7a652dcac48a78ffd128d2ea17926ff869762db4eadb98d484692c4de2567850fc01893bcc0705d5711b6f9eda350d52d3d3ba2b920a6e7fd95e92c138942e5be734e0e3721cf1ee7621faf7ba750a07b55c8cf21bd06f14d1297590b420bb5097e6d3c4a1c427ddd21b1c4d1bc3a1e0522cb30d30ab21e7a275be727a1e6939a3e6021dcb28ec200328ccb6c5c2d725f6052b95c92b01260d7704aee97127d55b2ce52185f3271e696db3783318e9c2c4be91b60262a6787b847d6164bd8e949d5ae69822c7329c92681d697c266e4f2030942b14c401a9215c8573cce7578ea2e933cb77e590bc924fea71abc4e365da3535e4ed8bd43e9e5e82c730ba9edec1caed0e8c56b0d8c1c2322b4b71d15d5c992bdc48dca6415374aa7b57fe7568adb91840c322d43c2921a512f19f11b8d40f172af52fa621b417a676e5611fc083c7c66e3ccfcf906eb03663367f2748963a07914f4f4e8bf361ad0a0878fda3a9b1e6ebdbe10c628376c4ece27e2fcb970cc7ef8a44018e99f5619fe3087f0b672d932be4c21866c7d8d150850d4993c107347e36be6e5b034e2ecb5c83d55e42c3d8480b1f66a469d20754b821a782e45fb9fa2ce8a810abf9b627a7c72babdf8fa1da1dfaeb113b58d6f69a9eb1b4aba5093cb988116ce2dd6ce6a8758b228bd134aeabcfb4f98897a3bbdc2f170c34d116d4458532e87ac4ad769e981449861afad730b73a23d31029665fb8d845cc2852cac53de46d5155d1f0dd909757a76228fcb706d6d25d0849fe1ec836bd8f49783b43649e51b97aa8c56a0329ee350166ffe7e89301351bde93f69ac9f1c2e8ecb03a568ec7f023ffc5459d76422cd2a2bbcb61d2e75e093235a9a6196c0182e7b54a70ca7873bcf63594e21b93754531052aad3d29229a2f2a678d528061148bfe088436d1fc645bfde84ca409655fc9888223440bf0c4882e3b259d10228f6c760fe5405ba1553ee8f2d6f6b98baf85cf517b3cfc2100e27d8e64e494e227c31385fa6a281aed2e9ee08c601db4d44f3b3b005008fd966049d111566142214d85e31f0cf4827a672982389aa5b801da21b271c011a8ddf7011a07185a819bb58e6781df2d4b31aa54f169573773c9f1f6dd45962524863b9a8f36b99b33c08595a32027aab11a0bfc01852c4dad85bd11e2042b23ccb38e938fc9721659899316b4c6bda927e50d61a0f48ff829b4375e30b0938e1b4a2606917f77f2d78417fb554afba5beed5a3c3c0273ac59936b70ca8ac95fa61931742fc780d54e2fa781a686b09ea727c11d3b8f0422bf7455ce54a979fb8885efe74c8c6f6d175fef1af3a95070bb2d8a3e1fab8b1ec9909c99431ef38b7a2f03d4b1a992535cf6591979b00674480b62f0e7c07fbc324159d8469452581db709743992109551d026412b12546e62b2c47c1e92da27210a390dd25c23040e0f9b603ebeac8e0449e99c92c377396495d8c9855124bad2251b1143697aa76ba1dbc4a176ec107775035a76a2039dc061d777d96bf666a1d0ea3ff5d9e31c2fda3b06a93593f0f8226b4fa8cb82211ccafac6858b4a94bc8ebf60d19459371680a19e9578856c58f845c286bae3bcac77e2d7e3ee96f22b3656f006cd11bc9ba25cd785282089a4a41c5cc8c46b237522687bdb3db1c646f6af49376839214e5cff3f67a1faacee881680578bf3c499db5eab988bc4e6d171fab344e0085696e8f51638aae09342543923d57554776010bbf65cd0c76d44bcda98a11e47f578f8be96da423b9cd1a452ac1fd0431d20e5cc5526d84d463aa024e6754d7a0762208eb27ca48b81aad0c3394340e2a142970ec2deb7eba36057d1bcb460ee9be4e4dc8426e762b2f78d72b1e37b6d74b72a68bdf2b6b784375b30fa68e48a4f11fb50a48fb11c09b23c6556e2c952d2a44aa38f34b72e8c4cab687a02aa02eb6c75b343c2c96d0788e9b4bf24708e79cb324d8c099c1f32db29c707c497ea3837b0a246f77c296b910bd49c9e946b9e6cb3605b5788ea99548827c0496cb5fab37b9848c802c4135fec02ac1673f1e15ebfa682e3e68398f6e74ad93528c88c057d93e96770fec4c0ce8a03b0a9adeafbf5d9a982ed32bbde70fecb141b50d899084564ce84ed6c33d390169b03e8407a2add3a7a1d76709d258dc68df93be011fb7377028f652b2b553702f0795e37a72576341b58936bd35d8d1b8dbe68ac0abba7376dc75c9e53dcedb325d84bea35ad6d5eebb8c2d3daef96bc3f0046fe45aa4dc6a8a028073e3c4c70bc0371b640bc6be7c49f1c2d7301b77dbeaf93ef0a075c1b045ce706f08bd16a1d579e3b8c10a5eaa29e29c36bf11066a4a9474b56e422f2380d93748dc393b707fbdf858a44d432437cb6129b5bfcaf449cebf94719d25560ebb892f1fe2a99f96d9a04938620f5144bddf8e98d6b03a67016adf0f2670fc5248a7de42536648a81493b21835dc91e9fe693fd4f08e76e67538e6b9ff1fe1e142486cd37c12f6b3959eabc14032fbd995cd863968d49f64d896e2663080ddec31fe4bdb8408fc88a12a8ff047580634648d92a1004d90761c0527ac0561a04236b1a761280ece013c154404dff7e37d00308b3f3e9bc6332bd36c9f7d5f46c00774510845a237a2a35e32f12f468f62510fa3a56c7ae327ca31db07489013c28e2c49b4a051db98be2b46c40fe015d0ddbf58d22f6160ff26f15c91f76623480d6767b85d562c32a4b7bf66b14481b7666fdae20c9ab1d353f94c62151fd2bba7850a7eebfceb8a983cc9a425fc852f9293134e291d9c0d66f3219126f685433af660444cd8dd358d3621c04c77cb1e9200a5fbcbe4af9ef2aee9828a7bd99f7d0ab19461be80d8be6249872587e04887101d86c45e0e6f63cfaf12bdf9c10b49e3a645948d0503d4d733c5c2df8bc94a2223be91c79685d32e758345f015398283ebe2207af8b4c4c8c87eecc600d4df2f952a64167e0eaeb761c9b332511ef727d1f291494c9223eaab844d3d154b2f047e0ab3f0ae0fa0e20f0a36fb70e9d571048af004735f84d74b6a05c4a5e2ca2218ba6f7675e58dd478008dfb93d4adaa8881f6b933129e0393d7a39fd8b310ee850a861bc271e6d55ce544ba8cd72d6a920b5e1c17a77256a5881d84fdab4af95e9fe69b32a5c4967e1e70055af5f448e76a0bc9d14634e11784611a4bf5247a78bf3b3b4a04d5ae05cc20ee614e5bc2a3d21e264077b0ca9cbe22d74187f2067b5628434bd47755c65057a0f0253b5180a1023ec21ceceacd5b30693a5442ae95b3ae408d13eb48659e3dcd102f60579136c7e54946513aa253dd594900eb8179c014c611b668e7d01f3d3a5ed0bcb8d8b882dad8423dd2a3ee3fa44161661003734552296a8d114da16147d98a80dcf2acce5343cac6fcf8eb6fb25ecf4a683c1edb23a4a8d359411ba19da8f89d8548ef0b012f00ba4d82e8909c2d07ab4a002cebdc0d6f600ed11a436b817dff8d00c4903b2a44842a558c8a716040150901951a88987487366e6a77fe0e121adede23f04da64ed4bd8dffe26c54a97163730200824bb158e864c06082691e628296c8a72230fbecb4bc6e6e80074a69f95a82c03629a1f70e4f99b9099fc11aa83e508624065040611d4de55dc2355c178fc873f877fc6e6cf2363e0e50009ea7bab406402ae47fe76abbe878d0483b8e183552fe5a936c6eeeef3d7de151658aad3e467d1826524a9ae28654d71ae0081a34805de4057febe4c13759d8f70df2e022ae37fdc370d50aee69147638cdc4d90c492528628ae9258a203f3072544176c695ab6f7ceedde5f94e3219c7038d8e2e703e91a5d9d6b4b52adeca4c2ce3f36405dc3de2f771eac9749a4d56b0a1d102b6b35ab2ef1325befb4e8f7551aeb89d21a263d7bd7da0e59e892bf2cab16bbc349ead58598e851cdd01ee0c6165de36f6fa167ae302320a8db4e116e2852769b4a6eb7b89a4e690918af731c0eed92da296cfce669952a4e0e4fca3b50ae7614ba15216ddec10bf7abaced1d5299e27d0e0d079dad11caf98fafc6c9f7e6bf679c5dd9d341b129d0d8f011d5b2697ffffe063e19c851600acf2dd245f99fc6ffb23ae79a4c47d5fb09efdb5afabe0e0dc3fba1a279daa4dcc519c752f58a126b4e52055bdc9ab4e373a2ee00593dd089dc545a9358d136a062fd847012bb6616c1a5fe6418dae976dd2333d82db8404209fc04062e189b41a6b176506ff2452fc6492f8a39c8dbec16d351c9ec029817a9b9ad119c096ca34e9492a09dd1ca8003dfff02c356d0ed910dae36c170353febbd24cc64a744410e35ac5f6d15cd03301057b5b37c727a135c9144124804e4547c10285d016fba10484db12c3dd6bb5810c070049adf7e3fe438f840388d104d3e89f16278db9b9893f24311199d80774b500ad4a4bb89d945c95f9b031f98f84966a569a08a31819c03b6a4e80fe94ce9ca25c7fcaf38a88572278e7ff7b1b5417b8444486418a2a76ae0e6c85710746290337b294850e266236fa08e0a85ce047f4d434608b9994ba923e4edbdb935d3172bcf4e78577aa493f7e3d88f54d0bea3c13c2cf389263b728b0e5c62369fedd0507653456c0e7dde35f45060b122c6694292f180fcd583843ea563241d2683c2381dd03822b3b5345a178a3d72e67b88e689d6b3ecc2d9cbd9616387ed82439242b354c933ad73fa8105dbea65ef4072a32a2bc22846dd5fed3a70dd11846d08cb82381f1423f81110c8a4661b567226990d7e0e7a9cce76d825d5687c7ab55a9ff7c74334b39c44ca51f31ba787e2a56d6d90124dea9aa882be2ec9d06c57be8d9dc661c31d460941f99ef2501497f7b094c85a88c98856f8a84392b9551929906bb9279468ac412d7415b63d408a3b4fa78ca32d3aab2c3698758d82823afa27070565942e3b47cf699d69f83204636cd15cc8aaee04eb6bec7d8e7fc86b20a6d3f3daf157217f381ef6cd7b6a2b312e336f01c7637d3e090d45c10cb423c4bb9f68f8d1a1336034bc7b1c25f8afd011f41e6566a4853cc10bbc180fc02171a8f69eaa4d08f50eb42bec5b13aee986cf85d27bedca118bd3c72460af27a959a2cd5648e34234fd453ce1aa37a807a6c85657f4af83499a6228aad6367ed406e998732b19b63345601f7f003105ede7296fbe4c798a73645fbda8559bec5157e5c22a67709a4a81a0dab2016a453c97cd02ccf0f300a35ce4958e4b26190fc86f73b7ee6a0b9a066aaa0d14af062f1f84dc41c6b89feeb7a7749817275672e9f8e0ec91e982b3b56e3ba1e39f2c9820278462e66f8dbaa55007d96029c4646cbe75114266fcd994e2ced893544a8ba22ffa3a9947f5bcd6210c535879351af37db52bd1d317cb46ae94e856be88c247523482219d94bf37d44ba2e534b3389029dd554724196b0b224a101292edd8366ce1f3f0f50bffc5191a1571f4e77f19d99bd7d68a2f5c0111a7fbaa075131d93cd9d39c488bb50c4e2ea0c581936eb23d26618de9bf303aab51c90e7baa1203cd8fdc97ad299e811e982e274912333d74eaf79ab6ec16188ac61a5da15da2f859d2cbe6b009512585f04eb68393256da1dcd9d0aa6d9dcd3b8a731d2aa98ebd1434d76dfbf0d980d38abf41b045330ed1d0c24387b34eb388b0c509a7dacd1fb1027d74fc69bb39cdb6dcb7dc941886f69500484fc8158ef03c7a1b08b4ace28d246b4b33457b5cd30b2ffbab9a96ea3b32412e4854be1ee31c41fca79c10", + "0x3a636f6465": "0x52bc537646db8e0528b52ffd005834a805fe2f87821650107067947488d331cec33814873d528909e7eb07a7612aaaacbd9b588da2eb4e5df0437e52a1669d6a10ff338830bee9ac6c14a3a5b2b8ea52cef839a2b14919d1dda71df193d60821846cb2f7de72cbd119fa1470153592c4c98ce98d0c8929576d70bbaa1a4c66376e6e508e24232fcb82d856d5c864db0d2bbb91a998f245e2640d94353790f6f0b1614ce2b0ff90e171f5e8317383414b47e727be8e8e75e346bd69a337653e7cfc74dd870faeaa48afd7c9aeeb4893e927eea61e264aaad95eefe346e63efee3a71bffa1a3f313761d1e3afff193257bf4c0b8d79b64cd4ddca3470f1f3f55f7514f3d7ac8c0ffe0c123c74fd97358afd7c1e13976dcf8719d9f6eae633201e03ceac9f41d3caef3d3f51d3f6d35e733337cf3fa1e39727c070e38bcf41c3b9ee32799e7a0eff19d9f48df794270fee327d27fbc9ceff8f19d9f6e7cc74ff43a261c9c7a1c9de3fcc41de7fd841de73c4aa5efc0a19e72d4538eef780987977eca5e7a3fc9f3b8e9a7eda607801e3f55ef514f00e8f15a4f00380e38dcf4137cfdc9fa4e3df9f0f19c7a2ad553e93333c7a9271c385eaa279ccfccbcf453cd4bf584a3741c3f65d56775de73fe634766e339ea09473de1788e67d9eb4fd76b3dd9d8f1fa135693589d771bfff1d35595589df71ff5e4a33ef174b0f3a8a7eb3a4d3dd11ce371ec27ab0a81d5d3851da79eae67d6b39fb80ac4eabce3fc54537d589d77533df5a83900eaa9d6533d0fee39f5b4e3aff5b4654449c317636260861450f9e1c070220a28a8810c2f9002c68f14ee3e3795aece3b574fafbf517775de75d4853a7b1c72dc1ca79e4a36c7514fa821f4200c5dc6a8c10d9e30849f1b140c466005141ca10a6918638a9f9b9f64aacdeabcdfd4934d5da813a476a6de9f48755b9df71b2a853afb1b3fc16ac4eabcdfa8a79afac4fb9122739a7a227da63e21e4470abc8d7a92199d544f281a686183161aa8818618caf003f70a627a300314c0408d23a4e1470a3ce9a7adeeb03aefa47a1ad5853a01a8dd0ebd3f5555c8eabc6bd506eaec4f5c95acce7b564f587dc2f42365feaaa71e80c0c51874808614c4e0e0c7aa4ffc478a8e2ed0e0032358618a1ac2f023855ffd44ab6975deab7a9a75a10e90da09e9fd49d6afce7bac1bd4d9ef51904887818c9952842d08b64d4911d3dbddd69cd9304f676a3e7f8779ae66295f9a4fc33cdcf37e3a9c234f38c302d9f6e18c79f6fccde16705b63db6fdfb5a586f2a0a972ca21429b1f1cf3c26e6e9e2c63cf039cc73356c228c86cf9807f25cfd1efee9b2ee68c3c347214e36a7db964d1d651dfe1e5b1e36f8d743dba69a28ea4d8d204a77a4e60fa037c54497660dc802dbfba698d8a2f9cb3cd5f99162ac01551072db15f71a7b1a3c06b9a1270414d9146f44f30168d9d465fd64ed502d29acb82e76173f047b7e3520791fc6b0d58accdac59ea7afb8ee5d1d725dd775d088243a25bafab2a9ba0fa49cd0a9e12baec3e978ec6593db86dcf66a486243c909c1868fdcb2e9d5c8a6f7ad7707aa7ad00ab62c93b169d9d4d9f4bbec4d319145d3b0e97d71306c17075b6608217c7c1f86cc7fcc0ccff0bdd37eb574e43dfec1dabd66f81e176c99e7edc348cb3ccbc38fd8c371e409682c906decad06e3e1dfa106f4ea3e99234f88824ddb7cc82d9be031983dee356bfcd5625d36f9307cda0fa8e6af06847aef9101db9cee0d8fedce862d0fdbb2a9db1afe7d35a0f7a71151a2a8a888897ec7385be679df47e661ca26781f7e5cc626f8006c1d4dc3f3e33bdaf0180df3ec6d98e7353c0ef3bcc3632fb3619e6df8d5de7dd887230745473f41d1e6d3e65a3ac28fe7c73af4fad5c8a63dd78eff0e6bd05f13b05562db141359baa3bddf98675345577a4f9967534c5ce97dc63caff7cb3dfbd3d1f47e73b606bd7707ea3d0460db9bd36dcdc770ec9cb1bd7759f37b3e8c3d8e3bdb214e5e4ae3ec3565d37ebf3b24c806bf5fad4864d3de8731ce1e173bdb214e9e9816aa1a8a8d7ee76b3bc4c92b6a21043494acdff9a31de2e415b510021acaec773e69873879452d84807ee763307b1c6c6d873879452d84808632fb9d9fed1027ef4b43c9fa9d3fda214e5e510b21a0dff9ab21894545fdeec34f33b215f57bc63cdbfcd58cbca27ef7611ff6611fde1cae415bef0e143fbe02b64d99a7e3c3ef71ec9cb1f1df3bf865d31e831c65d31ec8c687dfaf86841f042b65d33eb269efc3a8f7148061bb32479e50854ddbcba6fd6a40914d7b1f5e1ccc02dbfba68a8a7abf1ab63d6ceffbb576acf0cad00118ae1d3376b2b013861d2dec6c61870b3b6076bab0e365678c9d2f3b3cd851c2ce0f764cb0d3c58e0f7680b0c3c48e941f6376523b5becec6027083fc6f841851f51f811c60f307e88f1430a3fa6b093c58e0d768a7eb4e1071b76a2ecd460a7899d287668b0a365c78a1d19ece860a7053b2bd861c1ce097646b06365a78a1f56f8e1851f57f041c68f2d7c84f9e1848f283e96e0a30b1f47f001051f60f848828f304c65f840820f2e3eb6f8f8828f20f820810f29f870c287141f4ff03145470d3f88f0038a1f537446a053e4a3091f423081c1d4051f43f051841f41d051e307094c5cf801041f2af051e4238a1f2af881029d36e8b0c1c7163a6bf8a042c7099d35fc1082690b3e52f0438a0f14f8f0c2c714a6313e46e043063a69f8c8a293061f33f0c184490ca631f888828f2e2632fc48f928c3470d7c80c147151f5e304dc1c4c5140553134c4c3015c1140493104c2d30edc0c4035315a62c4c33e871861e683039d1038d1e6630f5c0b4821e62e861468f30f428c31425070d3dda90e3a5071b7a9021670a3dc4f448c3c4821e67e41081070d7854c163063ca8e0e1058f26f0e8010f1ef0d8018f2c78e880470e7860c1e30a1e38e0f1058f27f070020f1bf0b08287161e35e0c185c7127828814712786ce181041e47e0d1058f140f23f028020f22f078010f18f0b8c2030b0f17f0988287143c62c043063cb2f0b8010f287848e1e1040f14f098c2234ace1a72d2c8b1420e1a3967c81193c3851c33e48c21e70b395bc8e9424e1872cac8c9424e1a72ae9083851c3572d490f325470b3961e468c9a1418e0d726e9053831c1ee458917345ce0b72b0e4c42007063951e4a820270549bc283690532587891d6cd81166071876586147183b94b063083bb8d85104cae526073b84b0638b9c1cd024e460b1038b1d38d891831d57ecb8c18e2a2a1776b060870a2a0b2e1fe85083cc1838beb83101078699307038812b23dbc2cd096a1430075a13342fe810ea08ea14ed0b37866b034d093836d428954a75a23aa172a9f1529ba8c94295526f50a7a81903c7053368781738439057645c9058e8d8828e2f2435e81043c7183ac2d031051d5ee8f842471a3faab811749cf1c3caac428e80ebc28f1b98ce5013061d68c8114375410c83890c9a22e848834e941f5466d430a1e1c713f5cacc17ea13a636541fcc8cc107117c688956e8343173861932f8073e4ee0a3043365e0f0c2471774a8a1038d1f2df8b1821f45f831041f564432e838830e33cc84c187094c6b9801c381f161841f5cdc3ce1c38a0f2e7034c1a4861f556ea8d01861260c8e0d70b0e0bc0007063831c0918244061c2d707880a38208031c2f70983023861932e044612ac241010f2b3c4e30234647156e58c971c28d2c6eec80c60b9a29d07c51da42a98c12174858985748599049c93441a60b1929324e685234146853a8139404944a46c52cca66b0a3053b5eb0e3ca05061a30d09c81a68c1b42a0658cd218a5618406920d4859906e30e3059c2b26267a8cc14941298d121a4a67289951f252e3859218252a94c2284dc1460b4a50283da1c4845217a52394b6e4885142424909a5249470a0630da51b949a288da0c444a9083b018d0976fc0007167054e106151c62e098426d425d028d0a705c0187977a45a5c10e2b38a2685d6a0f6e5ca1860ab505d5062612541ed43ce1fac10c1868a2b8c9e26607d5045c1a30293730a827c061059a13dc4c7123839b19dcd4e00607754b4dc20d0d6e6c70a3a5e60b3754706bd4608126053755541cd418dc700533c10d28986142c68b66828a8a6d8b8d35686ad09c50f28204861ba91b45b801841b3eb8a1831b58dcc0c18d2b6eacb87183cb0c375870a30537aca82fd8d4d061851b4ddc8872634afde2c613379cb851e50609ac29dc80e22606365e509540d7b871c1cd951b52708c518bb42d54263835e00863468c9a34ea974a468d166abed42ed02bd41fbc08750799162a153b6450653073469d814c18aa0e748ca16aa1830c350b1d65a830c84942ad818c193534a8a9a2e64a4d0c6a5850e3821a2c3530a86941cd0b6a98d041059a31346ac87081c60b8d183553a051028e133a9a2033059a15ec1823fbf225eca8428e19158b0f16c83ce12608384dc8ba30f3841927cc4061a6cbcc17334b9849c2cc969912cc9860e6ca4c0b4c359881628604d1063323b001031b58b835e090828d26760041a60b3264fca022032375905305993064a86032838c1366cc90d942c607323d90d14246073239b8018a1b20542b902943e60a17163251c8a440c6043224908982b3831e63b861041d46c0607083083b664042c225069a343025dcd002ec055a0d4851b22bb43434347258b079d1cea0a9b15d6143c27684ad081b171b11486c20adf1aebc16d0a4485f20799969a2a252415195a0aa52395191a07aa29a42ea42da425202290937b4a0a142290c242fc878210385560535c10d2bc0b66436d841c54c132e3368d070830b2a8691181217a4946481c90a2630240c3215c81854296acaa8a4782a20d5402b02ce09763861a60ac90ae90433399871c14c96192966b098a962c607335accf4604607333b98e1c14c163354ccd46006cb8c0d66a698d132f382192b66ae9899c1cc0d666430b3821915cc443193829918ccd0600606333f98c1c18c951914cc9c8064822785178507c6ebf2a0f09ef09cf0be785ebc263c263c2e6f094f092f096fcb43c23bc2ebe2a59e115e111e1148242055213d41a2c22b2049a955eca0024b9949038789111946658cc22023468d147064a051b9c690b14286821a22c854a1268cf8829b2d6ac078ea47a8e952130553141a1ab4346859d0b0a07d412343e3426582e645d382e6050dccf584d605521468baa04181d605a90c9a11b494a645b342b3c10d162d063562fcb062ce40c38136820a466362668b4c8d2c8d0c0dd919322f9914b228d878c2460aaa186461646258646454209d914d21bb425685cc0a191859970c0ada1164133855e010e1468acc08d18c4c0859107e90916db105e1264b0684cc079916590f6e6e90f1e0e605da104e048d081a1736a2c872906191e1a05a51b1a85ab2296a0e24169c1ee830036302c6052b0246041b2ec0965003058c0bec0618160c07580c3029302b395fd8a8824dc198c04680418151c18aaa1758139813d813b40934562e34ae332e315719ae31cc27728c707db9b27061e1b2c27585fa05aa829a4587182e265c5c7604e16ac2e5057d414e0b725670a3032c8ae585b9851933cc9461060d6e414d11ae1ce48c71e1a0268aeb06170dae1a5c36b8aca851c1a5e5ba72ade082c185e57ac11583cb05d71497145709ae2aae2a17141709e61a4850b0ccb0be6085b1c26081c11283558645054b0cab0a56162c3076d80007152c2f96152c2c5857b8aa608d6105c192c2ca624d61c5c0c2625541c7d4acc07a82b6c12ab201850d2b365460030516158b091b25b0b102ca066b04f40c2ac6c609e8186819281968181b54e8094c52803a9889525790b3c50609aa313bbc289d51ad51ada16e815aa17a810201c74a0d153553d464a99101ddc1a80b23301514ae165c2ca852951168179510aa215441a8b8a8b6a88a5011a1ea12011b26a864504d5165792bc8a132db30d9503531c75445365830cf30c130cd985f986198616619d30b938c29668631c530c930c14c2ecc2e4c2acc2ef3cb9cc2146332613e61426136617a31b530c7985f4c29cc2a4c30a6136614e6104c5a983d98544c19cc2ca6143950f428831c238d20a120792083207d20bb9059c82d6412e4162904b903090439047904c945f64076914d904e905ec81f4824482da412e41324177209b208f20b999244904cc87942ca4066915348297a804146912d902a904e4829728a74812c924c4431b10c710ca63062157106118b7845e441bc41ec81a98b4883a84544418e941d4c88544429620c7634216281438042805b805ce44cc98902b17868e02b9ce59d81ad78583c30bc30cf06cf070c053fc126601270157e01c780a3ec2023c70976c14b6307989c123c1cec108359b0e38b77c563c183e2912008ca3bc1078c782ea80093eec9e0c5e06111e299e08809206900037c10f0c39105182902a48004fc0c29c0438100841040871c4c3f7ce85c61b0d7fb6a7660315cf264080d2449628825462449823d5844932549925c3ab8300202e472a2082647784003a56bca72e0880d344162c9d0104b9c10f1e488274b9a2c29927349212209121b686284091324123044c412264c9048c08f2b8a90ab09264c862082099321123002238638d06409132676c9920d24416228c990111c3862c90774aea27dc2e488218696149164c9920df4b0c62c121b68724412103859e201a1244724d1434d96740004430071ab0dbb8488264834493244922392e825443441a201434d3c80041144740e8b0d452041c4922274586bec13102c094af2e40908961c6982c4114f9e2c810067ad613f704412ed6449901324268084b3d4b04b868628e20826434049b2c4034b3ce080208a58c2010e0c11c40f2b0dfb248888254610a1c63e196ab2c4c912239a1c712b8d26476ca064a1618938e24993239c0c29b1240908982491c410499c2c2982c9111ef809220209263f38d619f6090e0b8d1d22098e6586ed4092218686286288a1250c90b1ce08c1114c863862e8882647d45865d820229060a281244b863c40c4122596d8b0c4ac132412905964d8274b8e183ac20912460c796088196b0cdb048923868670e28122920c21c1e449922392e8219c78a06bf62d61a28121869a78600349868858e2e488229a1c9124c9cd690e2a2fa050d48bc2365554d40f056fe605860b0c2f8957451bcccc386cd8b0c13670d860b6c13870c0b93babad165a135a735a3be19473f28437c439a58c324e1d7321c309e5beb5e694f0c1091f7c721f9c53ce11dcddd1c2b9f059d6ee9cd6dc2877dfdc0837cac83b699490c291947377174e287777e15b5945585d52ce8a42b9905e71a3d41a454b4a0ba312c219e5ce1f4208239c72d28b4e08e1915dc0f27b734e8c1f9c5042c87327c671e78471ca11dd49a3cd5c18776652ca9d72529e3b774e0e4238e594f14d2aa5363746ba73be39e7c20b4a28dfceb750c2b713ae949346798de43422e76af37a32ce499a0be7dc6a1f8410fa007759422977db39e742b93b259d334ef8ae8d9074edeecce666453692227df35974e3f528cb39a584522edd28a18c1146de658e11cab5e45c38395239a75c0977660b9fcc6ec86cb2b7d90d19cecc163e66262225bda405639490333a67654a7a7137beb7142ea5561ce5440aa3642821957183736b6294d226cb22dc08e79412c239e34e2823ccf60149a800004439f7ed4e09270f48a19414cacd6002a65c2949d7755d2448bade7b93257def47dedcdcdc489e0c2fb93b65566677ca9e36125229a184504a39a79c10f21523c4b9483e0b37834fc2ddadb2dd7d506e25a5947125b672ab3877e5eea49bcd856f172e851032dc38b3bb502e5c041cca07e54e2937eec285bb2b732d8c1c77eeeeea9050c69d2b1f7c0f2e84fbe6a4948e20dc464b920790560ecb007123dc0b2e9d704a3925007a983b27cc268470ae5c09e1eec2f7208c31461a2f1821957327cc16cec970c23921dcb912c63977670679907377eedc6be7dc37d99a8f79ce8510ce272f09a384bb7032c788434d4d4dcdb6adb60b63a454d2dd1847a3381ac508af8b521a299532d2b93bba4697053338218419840ba10e28e19452ca97c928a594f2c928a194334e08a58c34524a63dc18254708394a1aa135c47aefbd5d7a411ce8940c659c3ce0ee9c73ee84102ea53b27dc7d1b218c1142782d9cbbbb6fdf5cb8bb73772b08239d1b2194373c290b0025846fa58c524208e3aedc5d1997d2850b1f9c13cadd850be17b2ba58cef4909618c52524a57c609e14238e7dc9d30c2a517c46121841b94bb10ca2821dc8530ee9c514a1821bce8468e92e37b73caf960a47164d1786db4aa2a29298453c62b4a08a184fb60a494d2dd95cbbb3ca59c924993a59c73ee9c738739e1dc9df3d138e9dbc1935239a2524ab82b690f8d938700a339e79c3c7518800076e4c0934995a7dc29640691715632c62bca18e1dc2b8370ae9472329cbb30ca6af24eb863851d2f706619044e90e8c0920ecccf28b1a4882647246972c4104610b1810d20515f0770d8254b9c6c208913248686200209264c867032c4500f991b0e4710114368800913247c0400470987d20d0d4e3544c4104f9a0ce16428c9d0111de80012a61b75a624d3644912490c8133002647040901f2a4c78ee9c7e630c41227a61b4b82920c29b1a4c9ce8dcd6109077af8d81c9e0c3d394289253e745600476c6089932484c86c0e4e8658c28488244b3830841324869e242982c9114610916488890786d8c09222744c2b802124907092a488254e9614e10489243c0410c092239c0cf9d081278712487c6008071e0208e03402c821890096040dc144034938d0e408239e0c61c405d06373181ac2c992264b38e08487b6022862c993274b9c24d101248848e2640914248858e224c9104f8a206249921c8278082080248858f2a42707083670849325509214200702104000452c4982c45012207042c40e8cc912284b98245162880ee880d26409c4d91c38d0e4080e70000926498694587203a5c91258da1c9674e088a1261e705277d8c09007724069b204ce6c0e499a2071c413274ba0245162891149869a1ce1248924443c39a203498694588203a5c91268cac860a2b7444b44448442a1a2ac942c8a880885a2444427143ca1a2a604f54844441142254bf450282222a2a804f588889808b212d42342594a500ff588883025a887224241a884e8113d22148a8808859a4a16454444f4888858c9a2509712d47b4a968888880825952c1111a3a812d443554a88888850a8a804f556c9a2a612d4434925bbac64178542a1a29245a15809eaa15028a804f5504fc9a29e921f621adeeebe0e3c1962033b24877e396032bb2ea4a58604be7b1d741dbe67c756235280867f1a91eb10e3dea72601fa25685d827ebe3a3633a81da1d9d32440b50a2c31e5fdccf925e6ab0b41bf041582be8a0f62c1cc68f8d3d468e0a5e1a1fcf529f357653eb92628d1f523bf3ba4fa9c5003828a75f97e2c0e0b21047487eaedc9767d4a752cb0175d3ff2f1a46fd3e00b8c6b7235f68c33728d1e3522ef36b2775c1013ecd9b5438d08d704bb761b5c876a995a32021ff44e3abc07b678d2372efb6a3fbc1a4faa1ed8ba8b4545ef23ae84693488a28a2b6810a5737a53557ca9a28bcc30ae34d2b4a95519c695b01157c234a961957644db140db2f410377ca51db91eb03fb33641eb09f573d529d5df8fd4382d54aaac62f769594f53beb2662592f2f32722fa59a9fc679eca7fac4a44a5bc7c3521265fc222d1464f9b12b296b04bf9f76a0993a82ccd1a10fc9312458926532d304f641e269d48889f4d02da8968d846bb8dcdccb5f9d584d06ec365cc73fa78a0df0b715ae2a706c13f1b16b32096c0f1ec4b6cc7f1d582c0f1ac9e46dfe45713623b8efbf00caa50b146c36f26b520662ef38cd33ee29698f9e852abc0cdb54f2e8899cbd4d3e835df1d724c66d7f1d3e8e65a3dcd3cfbfed8e096c87e731ddc12379f790db7c429fbcc2dae437597bee94d51f1a531c9353172b594d96b8e614fabc0e83527714b8c4eba0c771a5de61b771a7dfb6a1598f9cd7db8863b91aee31987ea2a93dcf6c6ad568193ccb59f48b7f1d58298f94d3d6dd774704b9c4edab797ce3f36b8254ea7ecda6ff8fe90b8d3e9c7e132dc12dc97f897c0e127a225706ee3353fd9fc74e3279a6f520b6274994b4d88ed33f584fa211d07777a3fa42ab92046f2327589ed3212c87e5397d03e7aa5cd1ac4cc97c84eba0d77d23eaa444bdc701dd78ead2644569bb879765225ba7e64ae7144d7cfb63b44d64e486ba1327a5689ae9fecdd837f97e148df38ed3e50e3decfabaf2681ad9eb26b75cae858cc1ac444ca7c8760b513d2d6afda3d22eff016d7447ede0736896be2e632f5f47e6a5da2544f387e92b98ed3f7ea19d7c4cd75fc06ee64f31b8ecd1264e97d829559822c3db36cd10b46bfd3b6291e5cd1f1dd16cf032c3ba892a2c20a15450da43725832e3308a37b7a5333c0520596e6e94dcd008c0c5232a8420651748ede5416343a0b982c5c1acb32c995aa7ac4eaf9d75757617ac154617a2e98d60c102515b9804551cf573d1b1b65922bc9575c495623d04b18a228ea79ab69af662488184728ca3423068892324265741df5f47e4e5cd5b1fd741d386c9508e7da7354221c2a08f89182fad9bebde63efc381ef4bb0c47e53f322f7154fe939dc411915e731c95287b8d4c25229d74ed37dc09f53353a78c2a164208e8a06e5f906e532bc8a2fbfdd87054fe73a2a79fa8fc8728bbf699dfc09d6e54a22c7bcd4f44365e53a9fc67749a4ae53f3395c846a5f29fac4e91a94d20e047e6d9b5da04a9dbd40aace8578762bf5f1a9205a35fedc0f684eea4962c9ac976e9a3b2b495651f3d7e61cfe3a92681d149df604f13a48f2a15998ac53cea27bed27e4005c91a1401d4cfc63fa347a28d9e5e51d1a6c4a66a497ef429ff197dbe4ba2672dc91ac4f6de29e9f7f7853da4ba84f6c7c3ab362fc87bfcd42af022a9312008edd9a11644f6513d8d9e9d3507eccfa86e50e7fd690ed81fad52a8f3b2ba50e73dde80a2bc35014362e337d9f8f014720b7fec99137a8dc3a6f7d3433de6018b49b66ebb00c13cd5e183601e3ebc1061dee422f71a36e43ab0c56d215e10f820d8040f0410b0e7d089ed723641a14da6db2f0ddf7d727f3c70c3e7c09b30f816cabf8efc527cac0b40b5a4f1b0630876483cbc12d8731dde08d8f37ee093803ddae195783c5487c7e44b51e34af1e24af1bade4fe480c05ec968bd344bb3029151d8d8554b92528b46fa8a24cb2ea89824db9ea698a77a3cddc23cfc78ca8579e8e33bba82289a476f2a0a331a83619092cbd814df812d363c3dddc2a6789a62537c47e569a55c5e00680af6502bac131fbf56baa3a98e5436799aa256d8142fef6493b564848b8a1a9ea8a8a883e0b769ed6a1a4a6cd9d12e1dcf8654cbca44bee4c3b6a4973dd43e8c71b6052c8f87edf8651ef88e6669786e0c6661625671d44a476ae5f1c01d4fa320a3e3e915e681901f1c3157e243a95ae815b5f5d7b2b400545b558b1308f8b94afc4d45d185de541460ba6404ca4ad4b28c1d221f4fbbc09eecf1740cd8f37ee2e917d8437a3c0df378a08fc7e64bf21ff8a23fe04593b892fcfbe19f8c2bc9ea009a7dcafbc9fe9791b8f7233920b453aefb80137a3606f92d8ca30ed52520b097aa9203462f551588516d62c7a8713d36f76b1f86ad714dbc9fac966615228d692d5474f8b9de04a90d3f53decff528b4a8a808ab4d54637ee410ef8f088f8ae9dd41345193ab2c74e9da9b8ae28a28b0b48ede940ad6681598d15c6f4a055cb8d8cb3cf19da9e57370cebd5a0ce2c377dbbb793e578635687ee3165a6e103f1e6a0c6018c597eeb696ef683af8f70ea7650d82e7776f299fd93c0d091f56f87a560f6c3db435dcc703b73c6b0c803dff340608e95d200cb1c032b0c50d23613d47224725fec4432e88ed2742588548ad252ed4d9143c4de8425bc38ac3cc62603be369b0f729b319d8f6efd872b135310dc50649e35e673b6477471a925854d4fb07e4846a813d3af22e90f9f8c7559f5cf7ce553d2d1d79affe5ed5f7ab5fbd1608cc24b6fcc74536f17cb50b64eeaf3d3f6a48b005c2df7a2d10aeeec3afa827d7d1e6ef026166e23d1a72afb90b2dfa7d73ba73b5e5c31e17c47f46c8cedc7bc60571113ec27f67d4b6a9146ce96b45b06d2a8b35faeaec1806b3a715a1b71e84fd3ac65c77712523b1a8a8b5c786bdda997b45adbdc6aa0cdb0542ba3c73a393b88ea346843faadd6b26c2dfee0337ae74843f3a7f54b9d291abf95773c5b14060b5c19efd81678e864df0a48fb8ed05d265af34245767c7b143e0a586a4b440e0b38a6334e25e51af56e4156991b90f6fb047a646d68187a4dad19e0fe25feff8fb03ca08d7755df7612cf2d388bcb366847f058d16083c6981c0a28e0b0452608b454cb476ccc2b44afa2e104b237d9475b0b18fb00fcd1e699c931129bb0f93b28f302dbba5fd80dac1aa751ff6e13d77effbf79d3255ddd8346b6d5969881e6ac4950bb00c6cb13795022c32b0c9de540aacd805b243d3342d3b764dd334ed9ba371140cc3300cc330ec9b83b1c1b22c8bbeba655996f5cdb1d0501d5bee04d8d3380a4dc326fe72af794c6b0ba4628eb2a9faabbedc9be24db1c5aeaa6b3b04885f55cf7648f5cda94e3af6beb061d382e184168ada7245b685de186d81909e2d10d21ff7a4d846d79e1dfb9362bb6e9dbefa93629ba4939eed103ee9da0ed9269db91c921630796cd62eeb790caec58f1c918e36775dbe7bcd4fe2eaab36b998eb883a5ac73688c9d5b236b9f8ab09bdb6de5929a0d2b22debab21996dd56593e4ba9859922d98595256ee68333d73fc82cc63f1cd47364de6634736d55c3b9fe6635626b9d732f29bea4da1804bafeca2b94636cd492993ace527109fbea8064c5e6ecc4331c91989c7a4945c948f4ae6b1c740d6e75903f28193a379128b505ec728afa0f7c358bba18e9f975c97b53c06a6b1c3e6c63eb9d72523fb042b8d5d76ecd58c54611aabfb8274dcf23e2c8f71268fede385a37d41248c1c93ac23573a02837a99675356bc343f3e6edbe284f42feef5d326cc24a7647bc738bbb8ea1647ffb8f9a709d1c659207b5ab746ce621a3023d5e3b1c875a88e8f5c155ff970a4d67d3872afe9e7ad77a89e346255f5c841795d1d7b59551d630e8a975f8d01f1927291a35c67fd4dcb7af548293dad9de503854ecddb912f049be3ab62e3bf6f64d31e232d0d2cc5bfc733578ae757c722e7834ff58771f63422fcead108bfaa2ef4c63819ca5633928411254d4ff741f1d531ca75b1e3a1559d08ad98a2a21eb2d1f4100e654d912471714e8410d0bc40e287665fefb8e32dcec9f5a1d9f4ab1d49d2d67d9872423a8410d06f8158d629d7bd8e56dddd89d788c8c73f0d28729472ef15b7bd974e62a528faaa2d0ee5d39e24b25b7e309291f9f9995d66bfb25bbf2e8e864d7b8bdbb8e5a0bc7e1c94d773ce63bc6f398e5efd02d9a0796bfb0ea948afb1d58076ca6c6cba2ea4b33f54bfc775af83e6ad57dc178890de63dcc6a6a55d1d99b72ae9cafe340c6cbfaa0d9bf659a55936edfcb36a876aeb19f7b8bffbc08cebae5b57ed625fc7fe38c8ddebecdd025046e8dd9dac76d7f9ef17b7fdac2a3678235bc642b1abc975f2ef942bbd2af4baaa3f1a7b19e58074c5e1b0692f51d5936dc0de35a0c8a6177f36c5639572ed8660bf5ba7611e6c62f3ba6a77ddfa35afc363937b8d5ddc667f5a911c1dd96465dc10ecebd8e37d7034b96d13f3ece0f4fbab5d7579780cbed7164711f04eb921d98fa679fed58ef6fb7250db29d3650d8f452d874df0d5cfa6aafac0e522d7bd167a63c68c19d393eb8660ef5f7d1ad0565937366534ccb3bb8dc33c6ff89d1d021b76390d8fba9eac02b3c0b6a799c1b208d3d72e0ffb8274b43bda339fceb543865ced93851a16087f97079f2cd4d820db5cbbf76e22c1fad58ea8a17073c0c9eb778be6dab02ca31a9438ea36a583325a88d4eff0a41db26c68f8f978d8861d77377787bca217657bc79ef69ed8de138a760b90502c2ada2f710be96582d9c7c30be3a5f7fc7af6677f3d1e6251efb12a831a91f552514ae9644ae1a3949a46ef5513d832b645cd5fee025bd07ebb7b45dc9b2a4197def7826d532648f52b62c02b6a58bb57d4ab21d93a1e72506247f8e53a546f7cc9c8d5b10a911a7ec56821dded98ee7617c8be222c98fce674cf4ac74bee025b907c8feee4f6a6ac6c69de5eb2439c08692d7bd47ae1efbb75d6285380fccc5399f9a9c23c341d8f6347ccd631697921ddd174b76438607fa2ccbffbb0e45e1536c507b175af4ac7774b46c79ff61bd4390316204c01842cbe1415fdccbf6393db9fc715451c98600623a082083f51a600f979a732f3b38f32857faa5339c0cffbe4a81ce0e7844510ef2720a04efcebe203756210f3af9e6615d26d2af5de6d974583134cd022062bdc600b517847d40abe208214527431060fccf0b33ffb4e48c7af16c48b8a7edeab304f8f7e567a7710318a394a8149607b7fbd50676bac68d138bd292b577a482704859136c6c77849d4f04f82e958e58caf6a93598398d4269fef60ed4e1dff3e91ec13acf4ac5ae8e53ba2ee2417c464c17475d9649f60a5e5bb10f4ac6a9305d3723631409454cbaa6509a220621c21881847a89d120dffb87dac8096258816cc8ff5158263c6b496a21c25a04114599cf0c8a2032e4543492c98d65214448c231441314094941245fb042b3ffb2e042d47b0607eac5ab4607ef6dda965ed9687dd20dda64cd0a5875e6b29ba91851d340186a2a29fad4b10d15ab4ef9827d62e89d68290d942166ad0862845453fab3160a6615d2246499e37c036a713d27061cfacb8131641549f555da803bf5027569f87e758aa80f5f920e82b7a5983b03eeb090b79ab1eea402741ccd37adaa00e7cfc03f6c706eac043ed88d5f3dd1bfeec4ff56e6bb83f93db9fc875a6e69a893cded74411051952816d4eb75f3a666f87bcde3fee35c614f658df631894524a6c313e61214f74dd82317b3b847b8f517a083c7aeb983c26b9f7d52a8bdb380a75e22577d18e871a105bdcfe549c11ace1b766787158c0638febb876a898ad26254f6666c975284c6616b70416f244f4d6c466f67608ec3d86c15bc74a463ad4142d3f3f6b87b241cbeae43d8fead58c5c3dabc51deac45f9c0dd489361d3f819e40e0ba5597b07e3d02fb63552ce4a3f6002710f0735513d489170275e2a986045ed60e881d34b6fda17702013fd6ad77a68eaf3420be0fb4b8fd61ae435d46647a6b3e87057ccb0f8eba08b40f9720d5dda63a5e08e6e97af08179ba1de302f13e55bee8780530cfebb85f743cc6d9db21dbfb8764477744dd03f3c0c7ef97de1d441015996681c16f4eb75d9a8f418e045bccdaa17a6230832408c342b61d98071ee7fd54a10235200b6cdd76e6e98408d9817b5e545454f4c3f7e19efff07d601edafc1f760824e16c558a9a4f93c33caf4bab85167a63ba53d25023b25e3aa21133e945665303ea5265f3f13d70cffe6cc1e27c522eef18c1937608ac7c1ff8b865d36a16d83a21cd9735569a1dac68be10e6d91409ae68be0eccf35ef7d0fcedd2bb03259f5403b621d83645822b2d7b53506cd12b83e5c54aebe6c00f603e6c5f12b6406cab2d00d531d6f71410840424c15205923607e3e57376d67e4075d05621a2de77fcb775d9b45b11a0c0d29b7a628dee481dffa337f544978e18f6a2f603aa974d5d6c543f0c6a4092a73c178bbc9e94794a445ecfcf4afb5d72af3727d6a08dabc07c2005bd77f0fcb89d34de5b22d802b1cd73858f72f299a744840f0f67271f04e729f3704f1ff661d40362c34850c41f50fdeec3af5236c5c76324221b3c5f88a8e3c6aa016c9921733b676c31c225d832cff67e396c79d8b28e2de1f719e4e2b7e8c73979cde7432ebee6fbf0966de63645658be436f5c415bd5acc24b72928aee8f7c83cf1ef94795ebfb306f4b25e8d488495322abee7042a5baae8f8d9b35b8a8a7ef64558649ef97d13bdc776878c8e61a8ec236e1748563bec42dcf358edb8b1bf675c47d4d9eb51f784a8b1c75fdf1d627db44046b5c30eafdde2768168b5cb0eb71f27548d1933a60d1d9f711d8ac8eb781fc6b8ed8b0b8a15caeb7923dcf3503b12cfb543357f1bfbe3bad7ef5023323f3ac6958cf4d38a64df05f2ee037d38e384de98a61f7125ad4875ab76afad5f5cf7fa3a36b9eef5bcf6a82189cfeec3d83e2ab64d51d1a2e3e7b1c5385bad8876ac76b131c850688f3eaa4f33127b1ec3561bd50ed5a3671c14dad931ae7b8d7d774856bbec4c86f42e10ecd87d20c6611cfc6aa32a047b1e685ee3ba79f8d58ec4cf2d452368ecfafe6945de98ceea2e900eab426f4c63975fcd876daceeee588717b76d71eff3152d10c97f7c1f46596f46c10e7ba490fe6f7529373e0f842fe5e6a307005eca13ef360ff2853d526eeac9c6218e4bd171ec7b0a7ba4089172c36fbeb7813d526ed4d38d9348bf913989fb8d9f6ed4934cce6f7ebaf1eca44b81f544e9b77ada5ec19f603dd1fac4fb891e87cb5cfb7e833d52ae7abace7ceca69eeaab1def71ae7ef313ffa69ea4fc564fd7b79f6e8e5d4a3c8e7aa2a1b98d7a82b7eac93a87fdc41dab27087fc25efaccb63dab27297fd513aca71cbfbec16f3f65dfea49cefc24af731e3f6de7514f3434afa9a79a57d571a8271a1c5e53d59cc74fd579d4130e16c4e1272ba73e619aa9a799d7d4bc34535353bfe3ba8e438eebc22e8babb9b92103b78aadeb06a4588f71568fdcabe20385aaa627ea592d36515ad1575504a2550836c507c50b125f5d5aaefbc08bab5dd64f086c42aa6933210b625a08cd1b0013b2f085e94c4fb63aef7bd2f6e4b0cefbdb8179f85d0f3cdd0d2de3e590ecc9536c9d907eefa163b243574274601efa573336bd8d864def0b3a90020a6708e3072e90c1cf067b5052a8d8228b27c6b0842f4ef003bf54000d6f823df1075e48ed98ecd0d90cb6ed6c0736bd4b4e08eb20c5d60981fdfe36a7e10e0dbf9da9e152e14a9086bf0b1a9e6eaa81729ad8682ff3d0662a5869daf4c9305dec8e49d6f02c3f6715e3e47ca0505561f0efbdc365fe7b31c6af0663ac8fe3b0c8b3f56cda6319438c30547841af97ee86aaaa6a2a65c57550a8ea8aa8e5ac32cf12c3209517842f3921188a17841ff787b95705ca6318ea5561134b2954b5941188b9c8a6873a9b2211a850d41829d2d0b095addb2d1d15e0c30f34d5e375e821db56a7dba9b22aebb8436f4ae3229ba4fcd9c42d9b2e2eeeabb26d6a0a627a9e76391c4d641e5464d39bdd05aa60a31042f9ae4b6a400fc2072f8e682b2a2a62e2070b4ae9b7df2b0de8fd806a7a4a5f1de3cf859d0864435adf9a209d5c079b1e93196b476875423f441babb2d5aa53ba0b04be43b5945be4086687702fecb12c2eb24e948bbbb86c7390a7dc14fa1325ca94ffec0ea09369f929427e7673e8665a5e5b02c8bf311b1fe33b09f23e64134f4545cdf5ad498a0066976c1682633406bc315c9d541fa2dc11757c9a91d815d490c4e663339bc766c61c1486fc368e846057751708cfac92ab961fc86d67f2f490231b560c8d0e40360a656bf89aedd9cf8a7ebf318ff5efdff200bf40627c45e321e76468eb8e7f1b24fe6944b86b56275e878eef7400b1d968966687b0269fbda3d8bbadaf77362d75b48e961a14daf126d80304d491a7d8553b9bee8080a7b48b4dc3dad574b75d8c70fb78c4956681bccdd6f45e71744def938b6b7adb31e9b8653436ac4227ad2eebc8578300824db2cb8aa13c6d80ed107ebd1b64c7c4e339ba9a853a9dd67bb93d14eac86f5c20f150035ad8235727ee04e161caf19a8eef6c340a7b76803af2dd36dfd954efde1d6dfaae4777b4a516260b447e07d8d381d59197dfe5d935752f8a96a7b5eb518296af6af727a5e567ed6cd8d0f2bc43cbd5e9f60c2d0f7730420d5bf7aeb4fcbbf2b0f001241336c91bc12659c6f6a8f47bb7615afe6589637240358145ca8c1584210d33aa70852dc698e08c1c5ca90116b15f545434821f21625cc18414656061074e08c34ff720cd5fd8a38124784942142e557002971f3e853d3ebcf4c08b14a0808518f4e0876f037b960b4578411b7e20461364ace1878f2d0f9b1016d23e9cf35e17b803d07b2076803df167cdf0822b3fd8420bb4c020073f3a9c418b21b8008d339e38c34fb7f59ea5d8debbdd427fde29f7bca2a2a2222a3f53b0cde96451c378b943864d43cb493cfcb3c31dee898285367a6c8dd3b27dc4694975f7d068b8b5ac91c38abcad8fd8aa51db8522446a79520753db30f5c51860c4c035a84491e58a2db674f1128679d0601e6e786ce3a2608185a61df2476188e9d1596380bc56bbdad81c65dcf6d4289d520322d5dd201df6f7237c6489c6e031ce7c18634b88a8483b02b7609356336e9b01f2a3dabdb1470c93d9c626784e01e48279b0c3639001b2c22d6a07e535bd0f4fa1e86d185f9acf9a918dd25f55e8412ed8f416ca51b4e22bae5ba2e3ac30f582c04b0e6e7180fc81a9cd0116910d530b043ab175508b86ef60aae1a116700be6e182796491c6740c1f36ed6ee92fcd0ca6b97643b17772de16dbfb72af2197d548fb41fea25f0d1252840646da2fb858514594a22f5eb8d8e24a146888e9f2c51556508902e64b8a0b2c57d440238c2e2d6407334346f1fe1e50972faeb022528951c07c497101b1c02b6aa01146972caee02a4c250c982da997e56159438d1de3ed83a3307aff9e0e4fcb0614178869bbf4320ab6c80cf4aa0e6c5a9d9d5e46c126b522af1fead518618423210b648fbdb9902b392a1999fd1ef98d848071af06db1e63861be33becc8266cb45a300a8f51ec91c34eb92ea7e929f3cceddd9b429dd13b1b1adfc1a65feef101eac0eff260c40b42a9cc9f964da62e9bba48b9d7cb3ca4f3317aecd560a3c7de8b1a108530968cc83eb50fb314c0f40619c2d16a447c803d141af178c87941e0563b9b51edb6ee964b47b5ca25d6300d8f65dc760a7b4c50e7f1a08017048eded968efb65ed8433b6e6c1ff3a823eaad325920300936c19bacc32be0f1b01be4baf551ed6cac6bb5dbacc7dad1ee6eb7347cc6713f366cf1cba6c8712ff360b5cb7ce0c5397916d75178ca754c727a3ee34a47b69edf7a564a44d68822bdb9048c8f61a8a64be1f9bd677dcf2c74ea6721899c10ecf7de8570de31ca26ab8a6cb2aa67093d3e94ad99c42226bab32e54adc1c498864265503c3cf6572d2eeb2cab5a17a25146c0443b81329b1e4ad54f504d27d70955625a7e5a43dcf155c9c84b35fc64c841e18ec7987b77ac4f0adfe3feb83a8645d8d6bb05d0efdf13545589ec33123bd620785883f6bc530d6a6c01638c863172f2ef55525652ca88a33d29b07cf1b3e2c4c82c85477788840fd2c379380fbf039df0701e42884dee32e7df7c29fe35772942615e728f2e90edc86d6ae5e30e99dfcb1df25a0736c937a185b0497e35f8b008913dd7e57bd8215f20f4f23bcc23bf830e7d0ef750d6a15da9650f0debd0cb2ff3743ab47c6987bc961687c3267ab88429931dbe37054612da86be5495aaba293052bd293090d0346ca256c56113ad38b940f6abc505b2afa10e30fe3b91ab1fc3ad14323f24d83c369f06743d7b7cc569df1d82714450dd65bfaa6ff57dc675556f0a0c2e3a2e90e5f81a57f129bdb6cdb476f4196fc58e71967157ffc220f6bd0f6bdffab24ce809aaad771f58031bc6f493ed62451450b455b3daedaffb406c3199518eb1476c66942b428f68b553a2b1efb14b8dc8d557d0f5dd7a7d3523b4b11a44cfefe8df113ee59643612f0ea1db1a1e82a145c3d3c0d3cc0251a882218c314636c1c804600a0695e62f18314af934a00b6c4131421825bce48c6c0d1fa3943df1bc0d81a0d0e3934cc00209bb3d106e5d0e4a34b2f51ec28590bfc096b11d4500f5c35f025e0aac4e20e087cf9588df378718b90b6c41f13dba03634a4b94914bcacbaa8512f576a165d542397ac9492088185d8cf9d947a96509a27d82951f5a8be23babe17d60e47aec57ab408f7e28c91c058c09b0df512a3e20a24859220b52ba5891b2842c80f959a823a5c1e0810abe08938634baf859a8c35f28f32a9b4cef4ca374a4ef3b9a2fe4756153730fcd5bb62c336bc62659b3de54173552bc063404e106305842182650c3157e502c98028436f0e08b942c47f8d96fc5b0cd5010c7ee84f11ce6e982d0bcffe8d7258b7edf721e034626e8d2c4959662f43b46127a1d8fc522b176af764db8a263ec50a523528c8e976274f704d59139a11d33660ccb2b9a09549a6baea518cd9c8e7e5a91373f72506ade7c2e8819d6929177f822efb00e61cd042b7a885bd68e0fe5353caa21d790e39a87b0dea3e4e33496c045c35f33d5f27a57c0ecbab20b4bc3bf055495df351ffd45796a4042af4e0d4808e81d9bc7b88b7c96b4249592a1c519c6bdfecd35adb4042f0d7f95ae2de10b2dcb9e69231cd7b0d1689403871b21e5c081f4b228699a0e4dbb0f9736aa956ebd54b266727018394aa552a9c4e5b03173fcc673e4a8687494a01a251d99361384e3d785f48c4604c7af47ed08fc257354737583764ce34a57304fe9f218d580b02cc3d16a8e8c736224c3e119e94646a7cf70a819291b61c9b8d7a5d2364ee959897b3e6b89951e4bda6dae1d33cd78c375af717c35243aad1d07777363730327afb049fe0607d160930cd79d6c70dd69e3bad3935798e741355afe4134388c96d7fcf36162ef0ae6d12e8f699a76d6feb8b751f9cf334a74fd5cf5f574ba067cdab19869da9ff5d1ad8f4697c746a311765da3bf526f4a07505882194b5863095594b08612ccb0b2ecdbc53931725dd8e9afeb3aad1d963dae93585a6ea363569671dbd7e8f5e8d8958d46f7e14a43a2d3a35a3aa2fd5dabef0a36c9ff9c127f3d576bd1cf712fe3e8392ce6af8c4a0d68d61498d6e95727176cb2faaadd07f8004527ea94e8f77353feb30411f7bfe8e735ca3201e8a7fce7ff3cb73f9dc4324fab101c63fde2e031ae53a2adafc600d37571f0930be6b12e3b8985bbb0497659cb9745cbc7843c777959c8a745cbeddf967f575c3ee303fc326a4170ffa116c47faaff797b745f57d6a0992ab16908d83e2abeb8b274c4517d93c045c3e3e03aeed247a50be9ee096921bd5ae939e4d0abe1c0b123669b17d21d37fdd390e078c7ad31453191c9a1fa71a58fb80ec799011f5d870e1d3aa00e1dc760a643c77d78db70c00187632fdb381c70386b40388c4659961d7bd988cb9270c5c3f9cb729070f4a67470a5311cd90d7d117a543f6ea47d04cdc8a6ac5271441289a401651f6d63a5ec69ef385a036403e4ab3ec893e81a17ce6f38ce6fc0c1c1c1b9709e23070ece7df8c75e868383534b47743cbb8e2cc348a457058e57383c3b0e19cebbd2f9984604bef41ae7149a9143e786e7f80dcfd1718e399391a415528e1c598e1c3938d295e35043a2d3396ae988cd49b739e9180ee72436ce4991269b5a64241289741f1ef5b44827d5d2919b8fb011971d87a3fdb2304ff6788c6b725463c46bdceb5136e2b6737042afb36bd991d7f338dcf6ac58f61287e33e1007b77dc35561b029de869b59b029fe064e56a9c6e84e97b472c4d4592d1db9f1d16f54aa069be247f565a981dd5563743c55a31a83867b4c6cdc5518ccf3a61633dc63627b3db3609e5127ad84611e1999ebfa158679ae4766d680aef316e6796ffbf6ee55b17dfb6a3ebc2d06396eab68a8016d32dcf656f965c12ceb16f7c74d2cab68ed4e4dffb86eeb778ea3f21f2ea354fe534fdc89ae9f6502507a2c665cfca40f939965f9203f5f7adf46f511faf922149a51bb533fa0771ff8b08f8e7d5465153645ecf11886bdf9a7fdbdcf3a6bf7ea10f7087b12b06c3143095124c18b12bc28a10a2f5b52bd258b2d56b61421014c638bd16cb522a393feb8c9699c1323dae98dd8b8f6651e5a3b2746e8656e643bbd66a32e9bb4cbd44ee8b5765abb6dc45c3421a2c68ed16cc46d6bd81b3b666518761f9e1a129dc66ae9488561d8146ffdc2c23cd6e371acf1b2b0291ec3f1a66c9f3265caf6aa6fc7ea3eccc446bfdd4133980b8ec7c4f61e697dff39b116599c2083a21fa218a68b171ce16709109c503f397742c8cf14213f58bccb2acc03cd609ed7587abb83629ab9743c7fb10386d9c15cf8003bba5745c73f2b2a6fa9af0a3e407d577a3b6aa1f21fee5b9adcb9df0138c9e1d89d57cf9ddb51b92b4b0e0ed205d2bea4068f52afa8aa6253318ae37823d8b837d54595de30aece5c17a9fca7caaaaa9eaa1355157c22306579187340323247392affa119a5f29f78005a4ff444d59709c0718d8e7bcaed0f3f562138669900dda6525cf410bf2c10894ec32a54f53bc3151d7f61e9782b7e1a618d9ec78c6046c76ba92a1d8fbd875ed2b5ef696c709e63629ef9c945cbca0eb3ec559665d8b7311216543a422f4f29bdb51a03307a8d6875ccbabe6d5d954875eb56f68a7b3d1f914bdeaadd6b7a5d968624feaa41f25dfc1354cf530dc91354670f9a8fa7b59bcfaaf50ad592d37e71a8d211ebdaad6bc7509d7d92b8c905698fd6495c942851a2903e653787c73dff7ea6ece6d0c19ef5fdf840a153c7ef0fc6c1ee501068c70c9bf60e3b8c5033827dd64e3b564bd8e9e55933a2d512568f54f3f1d8e4aed38a06550c8015b56a378f1dc3b82e7bc9fa96ac4a441e3b563bb33e83ae63b57bdd4d2458dd055285de18eb10abddf5395f5f16f7b6a50ebdef7aa0d9e38199e8fd48c80ecc03891eeae28c09ec35b1b10e7a535c38a1798ade941072d0a6de5410b2f08e3dcec8501362ba437131bbf3000a94d07bd26b628347e84dfd004bbf2dbd292dc6e89dde9416454f2b7239e14b0b29e97d914b8c142d4434ea6e880b59b099a2bb212ba6c0b8d0dd1009b820bb7b52051ffc104297ee9e6cd1a5d7082d2aea3532a6f7bde7156042afab77e6ba578b60e79ebcaeae1af47ef5e04bffe84df1808b1ea22db4635a23829defc3daabbb406433d715d99e97bff618d7cd4b2ae2b5f7404c6bbf8ec95fdd75241ed17edd873522f4d91f97fde2b4b376c4fafb6a44ac3f8debb85ecfb88efb41a12d04db50d47bca754315f71a553d180583593a5a8775e78ced65e9f8a5b7acbf6afd71b47671d9f4884cd8d7b11501a4e2e26436ba223fbbf894febaa8a9aff78bcb3eb96a1ebb3859278771946a44b45f871c7dc661f78114fb316e5be3465cf786b8f971da2debd03a06b9ea9586c4d4b076f29896ed3e0c39796cb5ac76a7ceae8da3f29fedcb07d8ea8988f465025c3f2d13007e3bbca9dfff38ec19c7dfb8fd217158647f9c56397a719646645ec72e4aa70634c44f43a2d3f27247ccf6b2f436cc92f12401aaab0f0d71b37c875c776a2750e8e187e2e7594362ea8e08729d12dded2927a40389fc83873ae04177a8eee0590754dad4f298ccaa216e79a447d4806085426bd0fbf6accba66e882b4e1e6a477a34aca4fdcb9205c78e986d88bb74e435fffd8474f4939f5c77ea298ff4e80ece8e0f2fb9eed4dd3e72503b626af8b2b069a148245751c330d8a2b6f8771c8cd1d8be196c9bca01959e87341342090eb6882daf1d4008814514b8c30b34314f695e48cb03c13c5d4ecb4b93122398a7b3592e3f30cfd5f28a2d2d01d05c7874b75ec0ece86ecde8913f5dd63ba6f7dedf9b6fdffcbe0fcdded739cce3643f348f2469fee4efe3babbf3a006f46657654f2302e15f75ace23a11f4fc69892588281113e1c31fac4a6b07bfef2691797864d6257ee6610e1e7b7c04fecd7ae49d6fc33cd5e5712a6e72db1b0d0eacf4e4646fccb3f3920d6d68c31bb33bfbc9bd31bdda025046682eda9dbd0f4f8e8b98e87786f25936c0f6156df1bb61182c022befeeac86847ba25c8f82053c66719b62c638db2fda0f514302f78731b9bc00d4099a2211b2621ae0d394b4bb4f8e3a222bec834fd3b356a4490b1119c95a4757ac2d0035455322a82c2da4a4e9317ebca3514794a5e7ee4e47ff1650d1eca2567671fba319e1cfda5d1d51dbc04acf6fdc8dc4c30a352125a28c8089a276b26c9a9fb583ac2189871d04abea019b1eb2e909ff60d0bbd0a93bd8ef912b1de940d0fcedd580264b35ee031062624e18f1f2942eec59d6e9b6ee4a6cf33b543c1ddd94304ff51e9867475717828bae7e01e6815dc11da3ab1dbada2fbafa6a38ccc35c15e58da0ab639c31c76dc33c9bb2a288dfc291d01bd3fb8d79e0abd3304f7c55ad186805b64b6cf170535ac4f43ede41cb1786360df734665d04429c1db20d9f638710c196870fb64c0b963e1fe7f1f0584b947821ccd3d1338fbc0eccb3a3e56d6a9045cbe354212d6d5a7ea391cf982747d6a04d45c148307eab34d3608de6d7004bf321e4ba77dd7ad47e888f8f1c061ffcc509e90dd583dbdce4067b78d658a30f443006172fb8d8025a544ef9c0b00e4f9892f499d1d1d786ed7d795fd8c4cf2a8edec85825f8d8f27d915ff856ed6cb68551f261981df25ae889796068eb31ab1e66876c73a4348b50cc10308662b3ac97218ab6fec648f4d82bba51a3e93b99ceeaf7b73d46401dfa6755cf7a55453602d2ad2deb4f03aaac4afb01553d23760837dda67f578ed89e1da00e3d7d569abe28fa614995814bd3779b86a6dba5e9bbc7c454c226fac715c1267a0136d16f94c9689a5eee006947b785bc43d3575a9157dcc316ca646caae8f946ec10d8f44c98079ebed2929da33fbd10e6813d59a594e634dd69fa9765ae8195e6a5cc7687446ac18c4d3c657ba7ef28bc7414d1a1e3da5ae889e9b7d0fbd2d4c232faeb9836e548c6dd21f23ae4ac5f5cbc4e9f86441e01bdda11f98ebb08029a562104343db665bb43f65d0ce3e8093794d9b4aab01e91355a6f56a10960523d5f3a322f21ece82d06cc37a6e998b6deab7979ca917a565a84f4dea8eabd208081f48a80c9624a961fd8600759e8000ca6a8e0cb174a4802153580b0a9b1843ae4a6e71cf66c70628942152c200117a929d620c096365831a38b0e92600631f450238a1d05a0d503637a40852968210a4ce8020915aeb4a10b56b4a042852e591a5e6476b83146f505b6399d901edfb13dd17afcf11df91c131a522dd39b3ac3173cc586335ff15455dd686cd87484d1567136349fe122075d4875a11225cccf067b0e70851640a18b1378c104317eaa541a3de8aaab533454a1ab673d5d55d57f1b1ac86d3731f71d63b61dc30c7a476f6a0c45ddfdc927a0d41aa89a500a54a460450a57b244e16d87c4c35243ae242b918ead659688f4ebd580220c629b7559477273434eebd5f8366c629afaaaf06e619b1e8450c00fdcd18e7768235108b33a2b6d9ad5589d9542d1ea6c7f8152609bd3bd2f0d8fd9ec10edfb9be521fbbeb443b0ef7176c8f5ddf7c03ca4ef93803d3f7c27eed9611d780884c7eb39c7f62cdc89d26fa6e6396c823b42666a2a9beba0c38e0e3b4274d8e20699b7457533f3ac6c31c44db3a3c38e10e6a139bc0e4f934f72b199e64cf3d58068eec35203b271cd7c6a4035cf590dc80676f34e768e77b3376a44e88d9b4c6cd2f16e871c743a5aefb88ebfd99e24a0cec61d72f378b9437078fc7c3ce4384ee97fbccd0ec1f1583b263d74fcd964aa628bef9e63ba2209d8b3963ceba89d0e1cb8022c10f81cdc9017041e87eb814df025ce874df0e714c03af038ea0f37dc0e0b04fee9e0e645d921dcf037dccb62c7e6861877786e1ebfcb533d26017b720eadca7dde707b991cce08186156677b0767040c31abb35d392360a8b13adbcc719c912814ad8ecd3aa1e16db81bb88ef60d6e885b56679ed8925a572c10189bb52a02c5575cec5899f4704486ca162a5ad6d0400d6866abacc8628b948d2c646a165bed6212acc4e3c2a6149b76beb3436575d6caea6c47e14a14b2ecf4ebb765543dd68dc4958ed420fa58fb6d6113105671948b6b2a125be8d4f347e0d0e3f2526c823d2880797e609e6e67071f1f80d8d9d90123cbeaac15abb33d2b185980b105cc68ef8b19898b6b92267e5a91d8550b950feda45667b9d02edb18abb3bddb63040cd3f2c8c79d96fb525007f27437f4366fb801d3b8ed97823dfbd3dd13a3bb34ec1e97860712c226f84ef6569d823d49401d7898a24fb5f5ee8696bf0f6b5cc6bd0d228f717081c85f5c5c20f249c8439cbe61d38a5e9775e67df85df1acd0814df0b1eed41d52d8bab7d3f06f0bf3742be60be609e3a598870bf374cf4a17e699f58d714577b7a28d4481cbea6c97d5e956cc18ab63240a5f5667bb7b54242a075730d8e674dce58c8da374b7a997841dc21defb38f87ed8e531dffb8409b2fdb181dbf5d3a9e0ab542af740ca91542b2e8b8c3161db3c0057e013bded2f13e4028611e18ff03f34005f81084b680cb421d7b9aa6bdc8b67654434ee3aa3306ad671caa21c65ee20ed966293b847b69d81465ed6c3a0d1be42e554840b1ca229b321a6cf25d2c42d9042b237132cda4ac43fce6bcac5098c5c036a7bbac300f7c18365fec161db867db769e8343238b22848f7ff7c0b6293164d1f0ef94135bf4a6a670919a62a5b11953598a268593cad9a1686c710d9b2897553aaa1145efa3199c823d56182b4c2a954a59665c51ac35c2b0d018c332c31293d131c2785dd8f462978a065bf7ba543d5618a8c3b7c46c9b0db4c2c8a2b6c2c09ed88575f8efbf8d8d1526768961443322982e7a09638c9d2f6cf18bc705a664d15bc3d66d0dbbe078566cb28ab4c23c5decd245ccd3c528cc236bf7b6482ab10bf36c3a0871cab2e585a9924518ac069614044365875cb143382b62139f6a46745a5ac1263e0d9b62f7c822d6e15311b2ed609392455ca415cdefb68b4d771bced6330b84df55bdcf9807990dc2df6d81b0615be6b168def9b1d48abc61f5e2085f7abd384297eeac30cdffd1ebc511aae8d897762c7b5cecd52416b979868670db1163eb645184bc4f8e2e2b333bc036a7d3c4341f4bc78e5e9ab1c828baa3d40bdcc21bc7d799faa5a00ebf0b4c41a66996b533c1dabd612a3e0e6e6113ed5861aa0d1b7be907a6f9061b6593e94bb34dc76f68486a48b7a75a1df835c1dd20f01bfb692fbe63d4c44c2c5f70b1a28a28455fbc70b1c59528d010d3e58b2baca01205cc97141758aea8b1c61a3b0b64dfe58b2bac00f325c5851a6884d1258b2bc280d9925a638d355e15b2064318e346c84f925e80edc62c11cb1a6a8c11861659402bb08a1961b86ca982b370d11a5ec6d8428b289e15314c16c81a5ff8b040d630e5acb1ad1c02b6a635c94963d38b83bd7b6f4eef4eef4e1744c39c35c9af498811f79c0b681cce9534b4c12902e3686c8c68781a260db32d8986341baab86892b1e509364a7bb1049c4533563b2659bf149bf85b0461cb361a9be79826a59bcd6f327527a48564ac83bd2dccd83a8ed27cb60229dd368cad34ffa9a146f3ebd9c234f317ee796158e7c63b7ac3bbcde69dcdbb0d7703778393b90fbf30cc3332430cf368e73f3498c70ad873e3fce7857964ce7f5fc0304fcdf96f0be6a1e73f2eb8e751813a5bf837bca37d7d61cf0d35bb1537eab24ef64b1b1d6a401a693bf638d2570352a2bba1056c3f1999db3836b31a8ef4d56cdc87b76d7b91edad6e4735e4488fdb388c331237739afb30aa6966640e65ee036d70386c9291a9368f0aec316275f84ce99685d9ae8d1e35a091267352d59eb1493bfcfbeb6dc8af34201a36b1f6d74f7b9ad66ddd3d2acdc7b8ee71d1fc8beb68ba7b5b347be96c9a9f16ac802098e7557e11db55a53f007101e6995509f3c89a6d7c1b1a2973c40958366546978e95216741c31a19f145ebf9f0dab2ce1a9035b3ebaf2deed12b46ac967cd8be5e64fb3aaa2dae7b5b4aac337da87edc90ec2a7ae92835a0c85860cbd8bb05b6e584746442185d9a4fa3034eb30db03de780edbd5b366d00e435b3f7de6366293fb9b5e42d0cab42bc9a53a3cd33c346df651dbf71cf2989a2a2a2a29f29ff7950bc01bc53958f77b219b658d528446621630b32a2d80216389a5a865520e6ec69af6e64323ccc7a9572af0cdb1bc316545d76f7c6ce3cd645c2e443ad86d547e505b98478da91e80365a5991c0e8d0d0ef3cc8d920c513e31dbfca3c1f91bc3f6aac39b76841c7e87ee75f7a07841aefa2e04c988d2ddbb878359a3e1737656bb2a1239aaf198c66dbcba579d72dd104b94f62c1fbc1a479fb5830f8a29b9395f95a8014d2e7c60d4809eac220484f35322c11a7e67e5b4c8c81ccbaa63a419862c6188d218cc649688055ee1285ecbba6c12e251a9af0a9be0f57729df6597f0921eee2b791949baf637ba3ce476ced8681d82ad6dbdea50051f5bab41b46af3d5bbac56b2a76684d62078d95a65d9f05591f1f261ed93a3f31b27f339b3cda6331ba75cf549b9f98db3f1d588d08c7b6d635632dc768dc3b2a6dfb8c83af418b744aad3636f1fc351761fce386ce32e6ea3b161d3fb3b551f08a310841c114469aca5c1a2588c910beae6e189628cc760fbf04832b56e1dc332cbb22c2be382aeef6ad6b3ccc2aa10d4aeebd5a63d7b47ba661d47c732106a5ab54675a4f156bb27a88e54bba77da4d52ec32cfe65d5e558bb7e249e5528038df6d19b2a834b195bf433416f0a0c563446822ff13feb0875baae3f2af3573c17d4599727eaf9ac19abcf785955175b86f28382f4eb1a8daed1e81a8daed188c40569df7ed7765da4eba439aa4270e33aa20e7ad7be1a126d3be99d8d6f382cf9f8f9ed34dcb28e4c1de2b6e8b72dced4ee09aab35187b8af258de6f5788dcbb2be6a67d54af3a0784168d8f464257aa80d0c575862cc60a012e64b982e2d80de54182ccca893a6fd51d1589395263522a8ae8e75b7b58b736a7b6d6adad4f6dad4f6daecde15d84fab73c2796845ab423876d2d83aedfbd5344ddb49436255bb965dce338266ed1e06499fdf26fd1cd5a13a041bab1deab268a53499c6951561aa7c014c63a4c8e7be1046f7e84d7de10b587a00bd292f84696cb1b855b517a25ad8900b123a75f5ede518bbd8d6f7ddabcb9f1a5005547d359977f38c5d865bd6d19e8dbe71cb3a7254b54a6b27cfa7dcce191b5687b8276b453a5410ac6c557acae7a0f7f9f7593336651d6b1db1ecc1e8d54999f53d36391bc7ae6b937955bb87d54ad38a8c5e61d8b70af368408f8ba801550c1b555b63afba10d523761f88d11375853176586ffc1d761063f7e1d755efaa4aaa1d37ff55e9f7aaaa343eecefb106318901b476376aacb5441f6fa4fafbfb8bf0c6e747a3bf11f73e1fabd8dda8a337bab422d583e2e85655bd8f2817b2e9e4f7feb6469db08afd51c1de9520583d5e5515abc7ee5979187ccdab387a478f61b57b557a9e7fac56a33ac4f0d83b5a2fe69939f6c83c34c72a76ae43dcb1997bef1456afb422a3bf86bb4ec3c97c86db4ee2b457a391106cb29171d8c806e936dee891460f8ab5ba213804af1a64bd3af6ee18cc2a1b7fdcc8462dd1bfcfeaf30ff61b7dfee26ebdf4f58d93e1229bb6da0d418d5b3691aa91064575adce5fbfae4b0de8c2baaa2c2b5eb55b2f6d59d58342e6d940830b563a6b1d8f5cbc304613a037e5852c648821834b7ba1a8b17ef1cad26f6bdf532c83cfb22e5e79545a16411d599979a4694570dcdab66e25b2e00af358e7671a1073811a901238f3ee32e770dce646cd672e730c7b15bbc5755b5bfc0ead472befd01a622e8874a27e5c071b360e1fb38e31c4c138a83a89741db5e3aeba78a5f9fd5526c177af3e5883aa936ef38ede78b7d5308054adea5c4ba4432550475ee2f09bff06eea3d2694c36ce7f9077ced886b8395e69781c5ca615d171c674c02bc9f18e76e9cb3da573f5afdd761c6a471907685d56d5714b5e88c5d78143edf8cb0d56bda15c2ad9a4d9241034b3ec8e2bea44f42cab5faca2bbf9210ec271a2664e33021bb3ac682546f17878875dc4d2dd10c3ee1e928e1b07cedf271ce2ceaa5dbcd2f343dc6c9d5aef16941694169456101fc7ad196bc6aadd5084124a28adaf6604c719bed815c77f241cef955604071f87cbfeb8a91d47f7eef6cbec110275e46f6a476d6a476fa8dd76a376dba8763635b5b3a1a9dd676af7b6513b53cbd4ceb46dd5856defbd57d5a06b63c1e3a17b1bb173180cc74e1a247e76c6b193c636249b5483b057b7de0dc9ce3e8fc1f7de756bfbbbbed51215027beae595c8773b068f77afef6c76bcdb7284f0a8cf0ad491ef9e43e98eba507ea9f54b5b9f4343b1b18fdef197aeeace19db90ecf7cf67afb422ef4158257d6a48b27e7f56aacb2f76f96a477a56595f7a3e2bd83b1bac7643b2adcf472bccb39d3db2e0f1b04059bca271979c4d3b10f4752c66946e5b67d316df3ad418503dabdd8bdd906c8c218f3a11f4758bbb0e3523b2af4a9b1ac1baaa91052fc8ac2f070fc2b00c03353096ed5d622f0cdb7befbdee14ff78408393a3430f3b6bf8a2bb1d56536281bc4d43bfa798cb72af1fd02eb7fd20ffed21cc413f2c7b5fe689abc6bb7bbff3abd8bac82d159cb387e6bf1863555555ace24e0963dcb8110c110d3456724f5ecb278699a594921f333f3148ebf194167d514a19e518246755acc40c6a40d1083659a7a7619eaa8a1a504517f650d679b7687c534208e71355f5254e6e17083f08a7843146980643491f21849359725c5c08a784314631264b2927b7964c6fa6b773c2f9e8f2729145b09a31565c916d8a9313468c6caa199b38c218ab2a3e38658c513221ca5c804d199661161769b6616f7ab1917245b62d1abf2399ae6e017167cca359dcc68d5e1a618b8c6780b1aaa8a9974d3476b1637c551563ac62ac209458f5a57461e4e49430c608c764cd8715e7e435657a1f86905ab0fad4802aae11d2ba1b65608cd309282c93e708a6974d45b6a5a46f8881e80281f2492a69fac5f7e693d2b2a275abceeabdf7a47c71f2b0c9bf599d21cf2965846013f62ef2af47ba73c6265f6940514a1a1b9c794b6a3fa07a7210de7a0fce09ab0a4208e7ec68386255ed62554519bbd80c21ac9f47c0429696df9c18b160a531ce6a1763641933da449907d59c657ba5b17d5afc32cfa9bbd831926acc98c83cb246a6791b177e370b56f46a402bb36cda57826d5359d8a2bbd7cc758b5dc002d3748c54d8ba8a4208774835abea3e3cabe765ebde5545d3d5ab2cc7c43cf1d57c55559f73ceea1bf34c213c8222cb5d5f16aec09269d864c32619d70a5b4713638c8f8c18b9b075341d6998a7a33638313edba29432be3959037a57d8baace79ca7b1619ef8393f1fe797db39a3aade9b53a0158dd7abaa06555575e1347df57859c56ac3264a29a594524a2dcba2354848174c926c926f69c33a1288668cadcbc991f1f2713b674ce63f2163f092a57da001e60a60aeb04577c10058189b0e2c8b5b05096c81867b36db703220e317b68ea6a53c8ecd1218c7c8a62f5b079be10e792f02d3c20eacc8f62bc2fdaa17b6f7cd816db68c4d508c2e6b0a60abbd296c713324d83e186c9bd202982c3061bec2b173c6563212650d92e77797e7aa46364d1f7e64ac175e84e9f9cd9935687bfc70802de360dbd415ace02b64b941982eebb5c2171b6c9bb2c215ddd12c3a3eab42143f51ca5036c9cf77da8e19b6f7d66eeb2df29eed986193df1ad9042b65537c0cb0cd19038d97d1ad0a982bc0606921bda92e98d18f8b8edd052ffdde1417525d8deae46c5867cebeccb33d3e320fe9515eb3648c5a1121a0881a10dbb009d2b009dae0705ebda36978998d238d3e39ad7b555abe82f2fc47e5f1b0cdafc245631cd580b80e61bb6a47b38d95721ded9e997743b0d97a37bb67713350438235d707c50b22abf5e2c372e3790321847850ec328145cbb2628c57ba1b6239b998918516d068a819892c7841a48c51bc201cadb089230b207cefc933272517ad28d1f2ccc52b305e61134a7210c28ca3bccc35812d0fdbabd2b1b1e561e3c7c648fcd874c6d6652d0fa53c3c8d423c281e0ffbaaf4155bec827459d7433f9a2d1da94e4f6bd0b2a9daee28c73327ff34205999641db9f94d7ae8a0779e0fa2e0354ef33beea1cd7f686c5d90e63f9e9fc33cf37cd3d21a37d679cfb8677fac3f4a03a7e0a8746a3425c24c4f928e31442333d2208004631460304020140b0704025116960f14000eadb450541e8ab3208842c81865882106009111000000600850dfc98034468d4a41d4b07342466baea31e62516c7aee67536c7651430c67559651ffcfe7e5a73ad7c75ac7b2ecd85df2a06426994cc4de08ce0d7815e3f5802dd198776a5541475ce3d9af49553fb76455cdbdcfe89ccf19bcd9627f1179ad38a13b037d747a2b60f6c6a22b897e33a63ec9061ee83568fc9ccfbca048d1f279b5f3a1161120b460fb65121a54137fa582104e1ca09e570156ea0687214d6e4a250daa8355b54d83061b74bf6c33742714b339becee8ee6e155a2405ea69cf05f86028719fbdd8f433c1cb55e32e8da51fb982bbe92733ce92b2a08c20e4e654b899131440dcc7ef61e4b6b6b5ef3c82f43ac200b59d32f122da967a7b30bde8875766cb8d8b06a6afd074c1452730fadf701a208192b4750844d09555e4775c26209745569c4be1d0f1c38700202a901bd0f82816dedf1a3b31c2f85376ada8f17b2489264458a1c4ca0156773f5099ff38594ae669c2a51d80fa159e1399d4955f9636cff6e7e225f5222380c3d86f7e93df420475eddd405fca4e34dd8d6e3d96e4a6f72bbc5d001143495fe310cf6c12f34d2e670767bb750cde5b8d681e32f30c8184a7c327f62e28821e5b2cab70a4409f2c94254f3b15468e0fbbb429792d5f7e73eb03e409ef87729a969740da647f9d660de01576dfeab3fa44f3f69f6930ca2aec078aaee528aa76ec55b1b15bcad972b50806e799bfe89aba90a392c3567d0270e40148671005457d4e220ea87474c3ea7d9a75c5f231fe3f73d643d983c91e57120901db578c825211141faf825e3b53f8b8d6b103b3fd8e4aae6315dcfaf3a4301dce0909beec77e251691eef7b621dad14a3bfc3c6617b8c7eaef5fae9cfd6c4fcb613b3d1f4cdd5811063b6ef406c3de48db74f1b11c0cb79ac13c362dc4bbede46433dfaebdaddafbff9b86e548fa2cc86d685989f8d12485be4f39f2d4a05635aec6b25be118a0063adf01494c4e63ba03f31c35234a134ae5e67c19a2db9215adba4cb06ebea0347995c98fdda92d9bc157a84c1dc7b6d6e05d1caded9fb23cc7610178ef8ae74a86beba0573c433a7dfbabe76b26bb0cd0ee207c53326324c10d4839197a49c1a9515c848fd75e01e5f134b02f327f2be1f4520734a1d18b1eeb52d9f6a272b9d7f5ae29ffabe1588c5ba2d7958d2b6fd28cd2d8bb6a139d02c7361ad50e09ba6040e1af920ad532c83d4997a3e5253f9ecae3467a232684064722af473263c715bb354e538d00419ca995ae6589084df92d2623030f9a28043144f1acc9c88a024bffd233d030cafd209363746c5924a94946ad055f5af778526d2de2114d6a0e3f7beb551bfd15f30aea629ddb67d7f9df78f9a050d3c4847f4ac2d1102e90a2dab08a5273f9aae989d6d0800eca3f2097eb113ee140d4f4d6ee5889b1518dfc206c7a219bb5eec5a74c9de8502c821ead24a9a6cb371db4ebc36ec89a46abe520db381b1be03e13aa7982296b8c02385461edb03fd17372cc420a9c3eea5e627bcd568b855432430d97228461a7abc49d9aa724baa26031985eb9fb4a88a76be3979b52e6f46281a48d4528087844cdea47095f6a4a48dd6c4f3b9e797ae129010e6c49a03faf5825a841f46b9da965d751858e4813b8eafb093078d7c5d875d762a8d2baf1de1f693956d05cc5b8e8338064046bb20d277bad1b89b6f5ab35ee6953e526106071fb1aabd08bc607f408c33f8428f5bb6e2136aace035de4648690e672ac41357481ba84fcb42cba2aa1d5071d23404a1d01611bb175ba858f8842a19e2229f66cfe2bba201d431618b035a12075ed680af7a7669d122baff6559a79f6c4f49270bd9415dfcf2f1346287917b89ffe2302932a08e160a75e73e00122042bf745a80b219013406b1bc322e062a8e200573135f9bca5b198e1aeb5866afee8d449b5f82265eaf8b6e79078bddff0ca89cc4c549c17c37036c42a0a28ac2ea3a02a779dc63ad4e7ad1c26337e8fccd1610602b8c68ca2153ad2efccaf2a7162cc6b79eaccfaa019bedb895411c66b87d4fbed0b5e0dd562f76559f0690b94159b9d87fd8225d0df349efc1a690dd23c8286b3c836a51a88a255c0baa929c1a884dd2cca7c6c4205517e1f542ea48a0f2d2956a571920062450052314149d340be57eaf64e08236a05503521b6991ad96e7f0daba8a8ce5b7669e73ffffd2d9716dae590cde39fc9b7d8e90f9262f41288b85fb7a6803f38a5868a6aa6b569e60736d13283bb690b2c8f7d74914ce8b0d5172df5560cd300720f2bd173932f1a15671f1cec7bb474118827bb8cba25b8644f7082e23991fc04924689837ed0b1867d41e8d3faa3b6b9149cac9736be553cb248c5944ca21cc4aac7225f4fca1a97bd59ab35c3a82505b6928f397225d8bae1b929098c69091d6ab12065485c25aa50275e705e0778b47ca6efc6bd8d4527d0b01e129d038b5d08186a5d0696b03768f0997dd45715a0cf9cd5a0cb10832eccb90131d478b521685ddf0f567e2759f9fe97c998d411e64d08ca376825845d0e5429ac13fc04c05c8549f17e21bdcacc81d0d110a2a2118db98a94ba9a9e4d961544ae5288264cf30fb2d8933b0686ccdcf6849a03d575ff6067b03b4e1ab8b3712fdf617085a67662fc3cafb8823fabcf3082a30d44a870bb639a1e2c0f1e53caf6a1b30270ecbcf1bbe6b2ab6c218da967792936b6dc38fd02daef238374ad9edb59d2a95020e0322132e6b1c6ce0131821dc788a89201e5fc7620770d7546e9e374e06dc5e7af80d3822d06a0f22c1e27d4fc2435872813529ea13f22ddfb826880476b12cd24ba031565e466dddab22aaaf28db32b4780c900379b24e429bfa32556f5d262f11a7c253506ff7a742612e71e6bce1f3132da0fcf3175e8dd14cc15cac9250a2f6aa8254b4137d4829c1276a14fdc25a76305722f68604ef270add53d8b8b5e314e6e4cfac5827cd72676a744d11b50d10a9e931dacdbb59ab6e74bb164a700a707117295bc823ccf62f20ef9762e1488f9b67c4da1e03dc42d4e646763e40d203b1a6358e7c15034d85f9d7b7d040c98fcd506df1f6721a34ed95115d91a721ce9944fa73558e69442a7a3ad9eaa0b78dec3227993d8684ab4f94def3e051a8897e0518a590f1cc4e96dbba4002ac038608ce5f90ad7a362a342f03783b47ad5af9058d287f65b4446efe95f6f73e0ec33a201de77e3c4fd3350bf9835710d36eec69fd2916f4c68d7a82dad729987295bac9932aac1dc79df329d31622e589c55de07daaac9d4ed784313482933dcce2eed846a09c97a94d382f1da606d5870480344a835bf51ea8b0505eabae482192291a2f05a3f261255e6a1b81faa776dc61f0badd5507dfd66ab44bcb34514f37de8f5b9a3da25a538d0d245add294656b892f0d82b26c51781244330a208bd73038f19ae50b58f88c979abfd1f2b2e3f5c5d7209effb478a6113ee875d0b1dd6b194170252a4faed7c69e9610824e6c4a8bc84355a57faca78351674788e374a39a244d261a0d3a76f59a6e051cf79cee832c3337dc236a10945d45fdff4648401070d0c772b797f60c44d212c6ef2fcd07c2e200847c70ebe5d066ac21954322c5070bc4a6cc1f94e3f1ef3e0dc9efdd37840866cff212674919ccb6cb3236a10f3700367f6eb957b565f2abebb0d9ea24dad3909cf200baa7c6b0736e1a2b795b1f7272e52524c7abae350c5ca7af22a4085a289e4fc44177204c375fa3da0e474c8901047261534c61b59c8b18b045c861740fbfc62d5ecb27fc1c8bff739616e2172fe53817895e3a12be139c51824b64bea4d18ae9ba11543bf9c7cee925f7c7fe670690c856c6127ce99a89e4419d37055794e4a8ebdb4dbff001f2667b095fc85a1094483c995635f820aa0fd573482eb5c3d218d4a84ebfadf215a736b647f405b7760fd5511b9f45444ac0762b3cc0e991b69326beea3ae809329bd22cb4ead5c7a9f4137799840c4b7dacad1f856ea0d53d12e3ab4aa04e8fdb89bbff95419da52ea3aa29b78f4c32b4f07a9e7d180aab503008ff48fe7bf5d30539c6add8cb9f3bf2a580e7b2a53401b4d097c0bc05f40b7dd4393429856cc7fe48d96d3c9b02e8c83cfbcddcc596153f1bed96807583cfd92f6fa913023ec893d93534e20ada1f6631d6399e467d004db6b7969269b41f2020cf5bda0874f32fe8342bd8a63035437a62b769b50fe229cfe3e184723be1400996d723a60e525f7f5d21b7a994be3e599eef9d136114bef62790574ad946c43b4367c221143c609cc9a6e0791787f1dd18c62d8cf6489f25ee6fc973074c677471c9f151588ad6638396b36f6704c9e270fb4ae93ccb8a9559a6f18d29ced0228ac2dd7be9d4a00c5e22050a25455bf49fdff923596649aaf09a59909bdad342fc4eabe44726d6072f22fcb8ff9fbc1a6ea2e3dad6edd40d8778ed92b6518c45d3d3a4fee1f56c87aa47179507c49d56959ce996fcf7451a6c312fcfe0e87325f80337d6a89f9b7d670a17d6a90fd77d648e5b56a8873b7b6782fb56aa871b7b3163eeb80feb6a2fe643f82b643e5ba596be7cf4783acc6741ab07b1e4e56b5e4ac890d5f5b262f9ba454ff9bea995ebe37effad4fbeec9e4abe05e4f23e99e3baf5ea590ef9b8b3f8f8ba81f5ebe6d63e571d1f363635be0419ee6a2ee3e3c6df343eaba6febdf8907c6d8ccf1a51b7208521d55f0b2226e86ee5235c88b13d7ce85fc547dc5d7ce72b02f82658d04f09f4530c9da952981da233c5d14d1904381dd10406fd9442650a1ead0e1779a4fa11399cbdb0aba39dd4db0b557d347f3720d16b6883b654a8dcecc01763e5da6d1d17817279c4edde93a62d79eee3212fee91a25bf991599bbac7509988145a3e07a6a475165dd5c3782f970fd538ec98dabf329c47f029de1c0e105ec98172b39cc00a7be78c46fccc14fcca33c6f2776ea3a41a493278eae31a2e8dce5c31ff2e649cc551a8d64b1f0ce9294982223b4392525066b04bc83e14c9ed4bf029df73a426ed0b14ba0efc44b26f748343d1401a3a8288456f8fb057b83d9e0f5f8456e102918f2101880a232b88ae0ed0bb52fae2d9cc08e912cbd363a40a8ba4471d08010caad4a754ee4d1c9fe51952ff535328695fb7cc305a40d0616f857ce7409e611675721b3d9b06b71ce7e733625902d8f41dc6eeb4d385593fd90a8ab8bcc6924d99db601528ed5247b04d964fd59953359afd5333c8caf669e30c2ccc9d4a79d70d21ae26dd953a27c070c327bea2943b9c9eb56e07794bffd8368998e1710c24a97e0332784b9f0caaa51d722a014db0f043d36ac4788aacfa3617177924a8937f6d09b6b9ac903c7c0132ab9088e520472a6cd6fa8fed805510c9d62fc0a30bc3e20bfe9fed866cfc681234b4377f0be6e27fb9e2faa47b9cea1bacd15bcd4e04928f3b4823b5875c1a5d03482a4ef0ad8b3bd825f4eb7afa4724182883b3e4c4b2aaeca601892ed80297a9956f96d63de7f77f86d84aaeb260854d0c5af936a550312d80e065eab00b361bbc896a7709d8f53b0d227d51ef4bbfea4fd2b7b584cfa99cd0bfb1f67a508d053f68f32ab7ae36b77571430b7df1c436cdba427fd459cddfd36d56b34fd0a1759e9ef476a9e6165468d799d08bb23c7759b7a2c0788fc5d09a5323852718dd4d26281285af3cee8986f7ea7113e92b4df18f7c8495ee01d8e7f60e6df4dbb0c700e4d699d9ea2f5e66120e28911f700c024cad9d044eee23d533b376000ed4f718c3c24ca51184158b077d06bb74ffe1b98de934557bc09a5ff83e81230176119a866bc07ba20c4cb38051c2793ec7e2cae7ebfa08193951a572af1ba5d2ff6352247cf324aa4e5c0df1336184e23a55ae1ef89a080b15b998784e922b6ab1d20b52e9df5665ae74d0454fc9d84332a193c24c13cb186fed7ed4dee38d815a0fdc63fb5de2a17d3f84461ca74ccd662c8a6315bf7936c6ba9affa2b4277ea8a546f91e434950854b4205487710548705b315aea8d982fe85ae567a17d8f34ce3eeab3d8d583ce67bc3d4f5dfdf3b0de2853f72a13a17f82e8cb0cce4851755386f19a0b52a536e56a21c548ae1e1e40c2d8cc1ded57c2ccc98a5818f84692c86980552aa56861ca2ea5b332ce4420c3bb54c9b94cd2e14e064f0ee778ecef17277dea9e801f7b944ad73f6b423449925e38a905de07636c3f204f0628a1e221002e4e27140a6e6772ec347a32b42502959eb81dee8ff1e04707f78549cdca24a413cb247e3c3b171af03de836ea602f6006d91d10c897b31ba10db0ac6d68218fb7289367f531af7c23d648696a123da08026748db7b2bc84be8cb442552076459ab2027dca9eafcb7a8017b1eb1fafc45d78a50850823fac84c5eb099847794703aaedcc6651ed4d4e933c44ed9d169a01900412dce8e9e55b51a3e1c5021316fea822b28d69cd482758bb71ddd82914302394cd62f821dd15305a82d16f8ebb3878ef8e844104f0a58ab1a71581e8483a15f2812f90084ec6a3a457103b6a700ed7b89fa8547a1afcb2e2b3d0dce85c8313125c7d26008ab2d3d12870e5287ddac6c1b31bc26e6fe3db8674b5bb49f9429d5a05a99e9b48d88f866589e9d98b3f34c333625a61c582aef646d828b7f3e67576eeaaca1796f85ba185b02d17b9ea8a4b8b5d2842c30d5445c0a7682ec44a62ef46a714b99c6cc5809a8aa18d038031d79ee90f735e9da91a0d9923801d39657017a77f4b7775da11e57486347655c0c99bd37a50f1e8e47cd256271f610a80ee8ddc99ba2ff757c37fa72162a0312f7723269d22299d2b019686fb94149be771a0a2d049f89442afeaed9f34ddfd368d1d44f33610eb48c07265e9c4b20a3a3883c44e9165c9f5988e1bb6ed7b9042d261bb4e2d874a38e080969be7a0b309e5455f188f7bb195f9708ed3b5b91090e1b940e3e2b8afb2c8481b19e132716bb48417bb009f72d388ea994602a60b87814a43d139d3a78f080d2391d7c25f480500249de5551970994d43c2fccaf5f2cb463279eb87967a40595475614eb025f97b50851ec127d9835618140b5e62dd3816c4868ae345ee50cd89c879be644a47405064dccc778942e74f8f790f441a21556dc8eac5aa79a888e35788eb4ad815a13fc0f7ec7743b4b1cb3e231940f34a4aaeb4aa0891fb9f41b1d122f6e94ffeed1cc93ffa6c17c3c6a2796995f000a351ffb2d48ba9b2912486bfdc7093a9ae390f6dd4d3b5201b87aaa6f60a6597bf57e5bc7d11dd52f6a409a5f847e164cc5d711c0b7ab1380d6df5b3e4428e939910dc86ecac9870e8969478fab4885d56e138708460cb8d1d04f06bf91a6a30bd22208c390b00de5ef0b4dd0412b1feacff1fb83f82667780121c9f7478c519c618685f73551e0c1dda4667b461d99494fba381cef7b49ed3f6b0dc13b2da82a507fcc4c67985ba539bd04e75ebb679a6e88355c69b463bf6441f24f9144d9e077971ac4fb71564b56d2d29de9ddc119330d1fb0ebc55dca4dddb749d28078147d220e033710afc2935ac347aaaee60025bbeedc444b2977bdb4139b521858c0086205bea658fe3f7dd489f8b76c6420d52a09b67f6945572c116a5e9953660b46acf58c0d4866d0d3001412db891679c205d9cbd79ac0f8ed364fdc64889c4789fd4a64773659f6eaf232b247e048833679d33b07f4edee35fdaa2a66314701e354a918bdcc824fb22e932f00a9e94e76472b5f3a4ad4b590afbd11473e9059d53e51634e885356d7f6dafb2ba553cefea09443ae859332af116c63f991e4092a68011cf0de2b96850607e265c33402f283744be644270e70efe1d1b7aea6889716a6c00b112557cae7e5c7eed654f7e9701f1137001e3528b1166984d6fafd5dc035f0dd093acc32a3a5b56343e65c338be597cdddfa9273e35ee049773e45cbc3ecddf6bda9be202615685dccd9e663074d80fd525cc46557bb329ebedb930e7b3232c08f1c77383c3809757876d21468c5b6a93da5912ed35c75e3346c3a26cf5c88a3083ddca299ce8a78369f65256d995df2899cd1db74d8ce58ee1efa0c5c380431c1b7d79c0dcab8f4af36f8228c0e80d371ca402a83c2a9136b99bf5375d3f08ff23f91ed3b04acbc0f3044ab705add44bcb812a2e7259933542e2b051476c65fc35f09d71df94fb862b273d8573a18912a53c4fcc07ec9dc2d8e9781e78e10eb0c7a8f0da36cf6ef3af25241c35cc6cf842d2f16168a82cca6006be4178c8941795d27867226b95e2e642160f78444cf37aa661f6a0372591b31728a9ca508b2bca8060c8a966ea3d2d433efa6aa859add7eb8e624c0ccf9a64d2f11294e0e00d5409d2a740e9507668852390e48317c492203c005555600a4754980e514bf26f6c5d0801f06f17094b95b093399ef9d463ab0710f7f0d7d48a98eddb5c80b758f1ee6ef29c3bc34ab4261c9a8b67209ce53b267be06ae074ff4d14a20b830305a378a6540c3db5bcae8083d4e70bab0d6416695877d98fcc76f7da3bf8b4ddd20531d685a481ed3e9c0e0a97acadd5d420f50d69114815526a7e77078065011daebc4ab80c0344993f14d1025e6468214be57a024d89b4332db9bfb093e4d50a443e521551c4675da1833a71ab101602476f396e3ab26802b4a50a8570aca615aceec3e3cbb4de53a0a7357559b818760116c0fab03133870a3672ac1304f9289cbd369113e85c527c1e68171e1b8acfea22bbcb84ed69903836946a43b9e6d20248f18192ba967e502292eb52c4b6e243782880534984bc3a5103583e08a9abdd8473614225495164e4af5afd5bc1d9807cad0bce95f4d0608c2380a3f84f2b8f3d1d5cc958131d9cf12556e70835226325d77a1c54eae2bc79879820639f402517b9f8ebb6346730d1076b9f886bc660e59ffe8ea909d2c21941419b99b3d8fb0ad66b2b4003a3bb47db7a3c8cc6b5630e3d9815bf726d4628ddcb0b458b3377714523a4f85ae8bb023f8f0359d27737fb3018ebae6271dc5b61de1341e33f2e5af07156f4b0c8db16bdaa007bd3a298744c5863cec5a659df67ce0300e2db4624bff50adeef643da52b7a3fa9ae14a72fae02e2b097d4ff799557e9f8e35bd738eaa672b2be8160021ced0cc8a1eea2a961e5a301ec5d1fc841e7ddf2c82410d85c3665148a0064b6157d64b4b9cb2dcc5bebc663cb58640993402e3f27cd45c8d1cec88230eaa2cb3a32c83c7cb9f836be20a771db77e4ee2b7c7fa8a2296e2ec8839de26475094582f7fe66888ab0959b4ea755b130dd058c5405dd948abac7d3cc0636ba29a36fcd063558997d7cae34ea9ce47653793d25ed5ce6735757ad0bf57b5db447730102353daa7b0e6657ffb28614aa36ddcb32980d42b7ffeeb74b590146269eb5fc6398a2592d101a51c2430ff24061720af025b7672d63c38d833933e859e0110cb87775524862cf091e5fa891eb5179a97f9631bd569cf38a1668db53455deda226ba77bb77b2fcf5e39066528d129ee75e600916458480c92ce9f0ef66a2ce7f6d000199492698db7b0852020d3d99575084129642af323bfcf5b257dbf11186aec5c0be9481f90393aa6a695e47fe24892451e7220792a24fca6c48a7ad3c74ab14bf636adf4fe2018d13e2b8f8c4c7d2a10eacc7a13aac475fd929b8d9617f211b819674e4dd21788c83003883c06a4de7f42b63f68b378a2b309b68ff2b35b10173430b6670181f7cbf3cd04e2e7ca59cb0664d770040400ff19649e9f6c5323746954d12fcf4e8284d70264a205c2299a44606d9e08a2941a30c82816255700ddd729b460217eed0f804fd362d09a5f3fbdda3071bad87e4e95be7d563b0cf44249812352a96d5a962295940ea722b4270337b2a5ba945d14c4ede65ec43c41967729042e6c9a264a0d4410ea648e4ed08d06ef1a5cd80d96424075b681f6ffcd3981d651b169ae5bf2ed72a9d546f7aa8fba2a0a5c172b046df50d5b0bf6f4237fbc56f1bf14bd2b74ad746e96a05dc3fecdbee842bdf05b6395dcc5a23f13058d437a79222d4f6705b5465301b74b7871f93618cb4220d84c2e0a2a1bd6cf61c8a43809ff22ffe6c1a5e29762fec0a684de20cbdc33fd07734abb0e4c02aa5e9c22169bf822a6aaea30bc4e4e156b35b2d4e9cd851a86ca039608459d17077ae6312c2c10be17038603978a00ca0c6c5117d40e295714a4ce922a17acad5e6b18caa487853cea44340c6281a3eba24d102c79d53e072db997e048b652b39794164df7a21ab28ad6136b537389cc8d6d576a2cce76b63bdcbb4384c4e251d749eb385a9111cf59a11031a5eda0fa72f275010909081cec8178dbc2f62738f3050da2522755e35aa6b286a82b3f127e2845f30e84b14ad2f222a4200bf0987e22be77a5171ef9c8680c088892979f772153406f53d9271a6b4f66bd89a1107932d6a080f3436cc3d84f8155a586d54bb72ce2eea4c1ed4d50a869abd03326c010ff9ad6ee72eed462b262b2105de2c2d60f0bc5260932d9569eaf63ea5d76c0b8a3a18c93fc1868e0b9552b04b85204488b6c2a109d029fe41dff698235b1a7033bca9ffe69d7bbb7fcf1b65e102cca7b36859f0473fa6c44edf4cf42ba7340b8737beaec3faa289984e3406e244c6845679e4f29f597dfc51d7881ca678f5b20f3474a6153abce2d2f8c6516e32993f28501f70ce808a698f4f31465039001493a3b029c132b795272681d06875616b4651871b5a996997480c9a453f6e970714be78c0632cb1365afbe929b270a651a621391fb662994514c0ef82d7ab43c9e4e875ec9ab0995ed6490643cf2adbaf2e3685a145d33c7995929f7d3ac36f448bca96500872ba18142fbc530f5593bbf98eb54502b2e76c5e1570f0a1c58fae13d0659ce9aeb091fa4430cd242717d958aa2e63b17d9acbbfa18357e57ccc159d1f091d234c4ed4054bb5003c914028def40f22604e73dbde2e5949cdf4261a6e7882b811fcc9aa2f563b0a5a5294e1838de475354c8eed7710309874df9c9fbaafab8cbc03e281e1372f7fc1516cfde2b7d07e0e2bfe87a1cd35c874bfefea9e160a024a0c9c3e63c62b420096c43f4925ebec1f0375448dda4c3f5e30735ff3d2f6c4a87109bf6a0110ed56f4bf8802a6d6bfb09b1c6101b6eb0eb3e80413b4e42b2cb9a7ea07f12e049b9934c02669f3c8d1030d8f6d41161698955ec67a2e660e2798f427ae5d4f9334c56dcdb12ca741ce469f12ca88764a2db22c9596d1d00439e6f74b7fd956a5dc2a2b5d4a1f3340bb5eafac7c62c304e1d8aa46ae69165193177fe958f6a96cc73ff89b7f543f54373d4e9ff1cf679b831acf0d691de55b8873ed51793f11f17b7b17d739745c533f12f7cb313963b6167ab5d14a8a38efa4e91a791de7148c007e357185d4d452879e62237dbd92b468d7fc0f1f9bd1e7f68142316937b7b10a3050f2f999e253fe0e1b902fe35a85ea9a0467ef49ec621b6acd05b8f4cc2778524f9e59414b76269da96a62b7b56451a9a52d895db0360696c92b696ea522f6da7aef2fe40e9b7e14bd78e4e99997478b522f06357e9dfb1e1294b28ed496ea5ac33666f38f3cb29ea516457bc09a32e76bf4c8dbdc75c0db8ccf7456cb4c0de76185a81a8f80867feccb9f7ff25a688f7bf165dc57bca0191de69509a967bdca36198692b72304b98322bc3caa805f30a38a6f3a91a9652f715a239e263c862ef90710514236b020c2f362e9976778d3c0f583f589aca8a8ef8de13b9a132a87d229d2e05ab5056ce85b358d579c86bf3fd8c5f066dc057de0ff05b1eadc1fc20c30b9317d0e6947ccad21e073052314d09060d1f88153d31872066ea6a2d846e06add1215f59399e993cdd97aab520169d7e4d419c897823ff742258e3df052286659e36a744520008c9998f8f01b445c9b879df91b0af80f51044e362fd8a332fccbbb6047884dfe1ba6b3477144448d4bd887e44f65e9e814ad5e237c79dee202fe7b6672058f463541ff86c36873bb1e7a570a56a16e3160a6ab7d6dad265d68eae4ed1080f5a6e064c0e5fa78616c09608670e9f32b9c010f1d564f83644819b94c3f7f984289b0fa673cee177e88848b2befa15b74008326d58b8b7e2809c19984392c7f57a03a8c84821566730f6a64fb064e1e278b35b1122c8ac2a3094c1ff21c1fee17e7bc6607ea4a8ad991c8a615a856eb281e3da21478a2c5d6d2af7d5b3a8cc9600cd6cf47e8d4ca4fa3e9b850c4491279475f900cc2872b8e2668f9ef1d291ba5471d6465152c45da3a5e23c5db30d242e6f57e503fbac20ae60db897f4dc5f7a92d46b4702e1edf1622d3e7f343ad90e2e2acde8f6569ac1174d2b608a8e10e1a058aaa912d73e0964c455eac9ac6cc7c5cac0594d6cca2dea2d214d27d895cca0b4b671ef27e0ce8821f927f130174e19dee5b6ef84f00e6584caad20a9e4a7e6a7c0136ab09491271c3f985ea874eec1a0db40e9c776328ddbb7bd4d54b1a136c947ab0f966aae901d5410cba8204657b8cc8196825c27a1c4c13c1ff70244f823050d783a3c165ff6c33ced00da60ada86ba8fdf7777bdd85ad8ba37ed105c89c1206943d4e828b638de4fd0c1cde1d84c9455609f5418e5c10a8574c358b9e243fa326f52ee7e98a0955cc9bcdb68a7da153950ea9e7fb09b898bf84c78554b8e80ace82e8684857168d2276c7d5d29db308bdd0572c680115c46249c126cdc1695e3fa6d5880acc3db9de1278c12aa6c9d852e0e0453e99f42139545c7859b192545f86ddb5f97a72d1f8f25fde69aa12c846e2e34e699e47658095d674529550d6bae5841565988a4102ae2a41252109e9a1f2d87da34671637385a19a36cbb4b05cb37c470fde98bd3704c3020c2686cc5c0e80e91c2250e180c3a6921b14b7610845e09c4ebf59dbbe5f97ef206096742a27c2b852af07c5186332c5e05665d66802aa9b746f516a5359b31c0eb2131585da7f56551de6ea8cfd4c354d79107e997bdd39d95fd279c26fd0891253ab458bd8b18506c208f338afdedb2977ba1d42f0cc78c9600a9335fe35b4f4e6f63140d6cedc5fbd5a9f4e3c27f09fffb8869810b231f263acfafe800f84b82f9f1235fd2b702c82cb518da8cae87620b63abc6ed2c494c9e7993101109dae8a8fe392ebeaacff417716b08b7c243d0b01430ade24208fe0e1300ae035f3c45a463a710c9432365c023fc8727da636dcfd4e42322d0a6ed586d4af4a0fe28d9556ce37a0ff90c1cc3e33d71387c1aa109fc2b81511c7f9e6228ce20dd8ae9fe0767ea90a22ed5cf29d1fbbe2ef73436cee2016d4c71dd740a92998f37433a042880cd0fa0a3adba719cf8341b64d19e23338e64b4826c9aa0cb1fb215a014141a3245412e0655c9382a76e8b1bd26ba2853ee2604edf7402d828133a66dd1a99c38dbebd220b6f986ec2baa1130d8eb2f61f563f7d03841207780535781e4ee64717084427e9eb8a422159b29e0e3a8bca9891ea0eaf8ed4418d3c619c4ef6a0e0500f3dc263aae465415e8cb5a56f51cd508e6106f08d80201dc7f4ac1c52ad2f0b04b7047c67030a755b823a7ec516744304a20bc0ffbdb6f45d6282cca468e0608009dd95515d81d91d306836788a35a0909addb701e0d711f6c690640e0e06822b017370e581026397e584b6622165426238b0472dff191533da3c768f1b046f84eecc13ab002715b02b4c572c8095b5a04436f720ab30ff615caeb3fa092ed9217c40e00994e1cbad9cfb4cbe30580c0e9f9daa9e5b70154673e8896a516d2b9dc37dd30e2297c9c69a855baa854a2a9ef0ac6f57954f83277bca1f0fdd09f303e61eb63722eab6570bcb1d0aa2b03b5cdb58bd2b9afcc1ea031392b6066e4ab69f729cc5f15ae58fe8ba3671d03d3d2195a09e6ef98070a4868cadd6bd9d19521462ca2e87ed40dc699f40948afb0dfc82a4234aaf4f7d0fd95f1521b99e2d5516e8d07308aa30772df1365f0d7d9723742a4ca6c820249a6327c30bb5fe36dc7f62f3953a28a77052b766d99f2273ad698baefbb4ba683c8417ac8b35ca8df42490246203a2947eacc0379c1200e23a11f04d83f796e809597eb7a461f87f2853f532740313a26bcf7bc1af6207391f4c3d4d6388086e0c69f92391cc978360c4eb0c929c65486352d1d43ec89f3118a0b6801252c532827475af190241f12f269eb55db9f8803b85b6a2a109c0f7a0aed32a8a12e9a154fca3fdd99bed1c17a7e1dbc9c905d97920442d0f37611d2d4126958b7579e78340109e36c5392ce58d165d05a1bf76eb4b41b691cedb08daa4d7bb58ea0bfd6bc3582028a6905b7dc675d4a7f7d4e650ad725d01af95860c9caff8d5cfc19d128b36dda728001b384ae3a3b923bbd5b622b5172c46f73925c392af4c86bb5a644dbcd0c77e3347e2768100099a7768ed314102156fd171754c21623c1bd54e77815910d69541f6070d09026f27f5ff6c9a136b086582c68b0d6dd90ed1526e89d0d1c6cb6ac87637384313d46e29ee74df3595aaaf443efe5f554a70a058eca4a924b961855660926dc16fa4f3a6ff52e2d82c528bec37c985eadd45adb7def8a643ff2166be0795f8117dbec660aae7f46ee5de7be5e25fa82ab25c59a89a17853cb18210198e977b9642fbd82fb760456e289660624d27192c92629978e2e6425d876db984812f5ff0b9e95dc96cfb360aa4aba6035707dc89ecac25466c80a10aa781d86132d8f2cfcc1cf0420203cf1e12fb229d3c239dfc3f67d12acbe169ec4c96810a569e55ad9c971b06ea21c725a1fac6b19c99d319aebcc63320722427e07f44ebb52637d46dc0fd77b7b127ff991ca4bb9fa35a55119b6f53258239d1d6d209244caf6614e21d242e0a982c95ead2c2a4f35b84338c433413fe80211794e2c610b2f1bc1b3cb4a8be6debeae70e2b7f08c63d8fdefcd7933a282b70c60ea7d241d648c01ddd008ebb524f710cce62eff919f351001a71825b54f17b5c4df981ea7928c2ee2f724637eb0936ef41a2cdb95022097671729e41b2eccb014d324bfb90bbb405dd1ed410d11ed89cd2b456abdb90bc4b1a7c237daf1d9fcb8aafd89f9ee3e5031e18c5ce150c0976c2119513b4ded217431f0dce3c06470e0aacd4a0f80fd5effddabbccf458be6b0295492b3af9685c28f2cb11ec6e2f63074d794ca854ce11580bcf66e722af4688f3969ae4c8fe6027afc0fdefc280a1500c1c35da78d00c84c0f80f9dd830b0a893e03bb4e24dfdefcd523d5086bcb642e42223172b0007574c3ecd8a0cefa486f2b806ac1a38781243677953b3da40222841fcd017f16287bf674968c573711808a9dd152c1e1434ab506b01d30f34793456aab375cddfa1b7e4afe2fa43033f546357a37abe490da9057392625fcd4febdfc9a395c4bc1d2b9818b50a512c92be0d77667e8eae311c49d8c2fec36c53f86d789a541d86ed32b09ee0eef7ac5d75b8447f194df96ec44e72cfeb98549243a74d3f98e602e5d8791ed6752c980f7bfb29491daa53ed960d57163a563eea27b5978b7010637362ceda122bc1b446a77920cd1f430c67f13ff68bddbb487df8816c3704a2685b76ad110b49ca8ae0d6d2218ea4c59685f006f82f5bb5212a1a1b5ce5aa3afb6563cb0bec128a321f4fe812c301dd85807fe2ca0327100acc644971bf22058816db2b20f9e0a03f1b0dc2b0417224bce3929da3cc2ca99a936a52351c7059cfe44537f7573154f2082665759a82f005fea2b127a914919424e031b26353e4448a335d4faeb3903dd253a3934c1cc002a9a3fb564f43cd8906900675d0cdf6aa660df3689d80c062656dfdbe216b1ab9ce1d60fda8331c6102ac7b5a45475355b3a627602921cdd0d7a3159f51c28e48bcc16c7f6776813eba761c419f720471b9335b7b565cc2197401ca83d080e14ff2bf6b2f0f3076c5e1094395ccda54f7e73d8ab9aee9882b1aa9bfbbf304699b6b69fa4802c1071adc5f6ab5281d442c60c14f98885953f736951c6fb178f1d5d611f9ed3b13661c7a70349a7ee384b19a152b63f4e5b37b50e8d992d76062703f00a58794a541181ea46fdb8f790d7f3c9f42c365dda9648121a1530d7cd1440507fd4912faf395bbbd95e3eaa212532e4c42a14698fac9b8dd366721232cbdd535ab05f204f7904f4a4aa47822748ce3bdb0a02613bb7cb5b6b5e93154f3a67c0d2896b07be39be601235d972c962b041857f1fdbdaef9f96326f526db7838a1da948be34a023ced21c1cb88f74e65026dd1ab0e701b5afb3e8c479aafec13b72555e356d187ed7fb54ad0a48a7bfb83d40fc93a84cc02048779313109027147ecf2abbf0dc7aca1983677735e7c56412676e35129a27034f06b6a60758504e4dba5d014b5f7e4133d3720747c29393fa58d6907ec31d4a56cfa63a90b166b1ab8e26f19915eb8aab4de0217e830cb8ab80af933e72170d09850a680d9483ef13365c2fe816e5c5d01c2572d7c4cf2f277b7388fa4f05bc285c41180fca962de28a6c8e5b037ccce641b607040843f6bd3f4da84ae01ef7bf06da51747b29b0ea3b0910e85d0d1189b9649c35499061167c13066ba60740b93fa72bab7a12b628470a77ffd72fd6868bc33f1108ea9b5dec7627c64554d3946b178444a2b3bfd5589cf12ceff4d2be5d69a832bc38626587e68a4cdc6d86a3065dd0efbf0856657ea2a8824c44e9556ba9e6df4243e223adf8873273390aba8b0d5daf9152d22a9fa0dc6011780796f86f2308dc13b4d2a387a952d225c4ba8866d0e72210a9ed0f73654b165b536824a951026be8460f1b48eccecae16873d3763e03156cddcb25340cc7e4f813988a74a96d0c6a681227f978859b6ce918298e1f642425e0d9c698b7b609d8932bd87000a78d5aa63da103b8c1212351c7cf29c6f6b64366c7460c27fa2118971801fd37b9d0548d3825812ce2d6f8d92cba67b1aa1d201eef4ef8caad249d720d578c44d9358e107cab90ace963c4504dc0dc70ab859a7b9e79342bd1f2aa734b82a6ccd8f1b47b2f6ba4e7f8a6cdeebf6b22b72d111366d9c5e35735b811d61309bce4f91b0f2e44419c432386a6ee801e2880fcb3d4f823d0a67e4917b3c65e7c4674f1f161523395ffe3f3bf103e3a22221ae2c6ba624ec55003e908d74876127a5d960cb9b7470f2134c2db6add686ebfa2b6cf96bf0d3d43488b19561eb3c2ca6e7d2e1846320552bacf815d1f82adbafaee99dfd41e27f57fa275c345ebbe1e11362368407133eab59c89cb9fe1973bcfb3355877e348243ffb314bb1db4a79d22abfabfe350950f94595d8021247604408548c408b24107104445c6044169818022242e0e2085c2c011121308a3374241b5e8140922aae06436b69c0cd72561d0a564dbab98b993bd4830bf98c282880e20486af2373794552a208f27932945d74658aa28c22fc0d642fa9484a1431be4e96f2530425fc2d4221786f535698be37e1888c16af5cb4f052613131aea2711ed5207ba9a6c1342501f3b836af08421a63d3b2b69a4439aaa82b1417292df6dc09c6fbf752771fad129d254cb73a1fe61da60c1d12bc1adb17c0f415dda78a667d45c0b170c551c4a5f97bdd55cc90592468ff4533928113e11b269e993b83aae925a2e16c3b0306721b671784cb60c035d23d02317f35a95f198682d92c54054f322a955530f902d3507cee95cada4f4102b849fb259cfd0ccedeb211390353193a924c2481439b1fc13e190bcd04c611d053f184e973639815b279f7f01c0c3c8bbc5e3a4bf70418cb421c29dddfee8c43e79363a58e217006d6b638313826406021e78dd8b52127e04412d91c95f48b0de236826176d4af2296d9e3f6d0b3e12d7481cf01fcc6a3cb0812cb8a43b200a12c891d36cc95a01873f36fdc613a4a785580455ed900128d4c2e0031510508bd0397a3267e9631c7481a67fe8301dc53a7234c7623637f6bf005ec64d0c38c20e6a805e866e20692873504d925058d7f17099928c015adbf8527a4c0be2c680dacd04b8193ed9b69584f311473a1075e9f1da7c1470815cbf7a8817a15360305684712cd1a5d014cc01fa2590383788c721fb31d2670533a2c791f529d2c8d77fd6911082f0e0608ed3260a9b30e698531d3669bd9fd5c1816e71855e0a3513b6ec0716b053fe1e34d0d222e7502ea52aebe66f4ae70f5de313ed7dea54a3986c8b8cd917e3d0c3bca98e4e89ab8743b35d64538168a7eecddd3107133c7d3cd5f18ebae62ab068985997255f0edf22f4be569349f0c98769fa6fb7f6fef3245c715f907da7c621425e6d53b39d9ac8644d2a2cd4843518c414d231be40d9d253f77872ed325c2ac33deac6671957462e02f4d06cfefd1712a367bc516ae7c6490c4512c723dfe68ee008aa29c860b24b64ff673bf4b061d5156f5a0811e4e0692601e4267068fc908a18d9a1049c710545ed4f91c09a46c029e371310f075829635e09e7aee72791b9ddf7987252256c04e216ebc0f6f95b0e445dd50e57701262a3eecff80487068c795c8daa33ae891f4bb9435642d40604219607105534daa953c80e1eeb747c05cad908808dfc0c043f8814b433670fa624ae9be03c641a580d570ed02fe9454aadb4b807c596403224cd2206fa9f896f65f54fea03001806f5b3c161a28be3d1307b019b18f92d0dd3c4b756927b72f8fc909cc087c0aecf0e6d623bec4a90bad02cf3fe5cad2914650a50751070c2e48b8d15e536146f1290e1bf13841fc4487e5c0782d927458ade49b76fc58d139ecf01387e4201a2064731907ab2af868fff7763a52f9339635c530b70d1a8059f44f3e84d283418495da054841100a104c9a1eb73127039ebc828861487503904f04e71da6a352892f8130c7139152bc7da229e21d44174c1dc1a7d2f84b436addcda1dd212c6a99ce2e681c40ec6c15faf5afd3bbc43873bb016f3da698b5d5af6e78b12e57821304dbea0d78290028aba184ce05e7825b6c41750ee9436857eb7baab1dd6b204474be4dfb90d9954a1e78eddd23a06823f410b5fc32e861ef42b99ce27c60f4be0002a8ea3a4093d89a6b4ac02b3aa6741945200092e82d4613d753f478d0d6a50f3af9a26e93c1d973f3aa8bee3e1f57490450d0cdcfe24e9760d9d431b82318a41d284cde2862e35ff480345f906ea6369de95faa43aa092945ab49db3984de67c6ced14c2c66fb3348da4ac2fab83227883921fa731dd7b4f540ae7b5c3bc131376c2016f7b3f0072cc481f90dd50cf8bd49aa3bc5458fab06f697b81a9ea343b118626fa235ef81906381b35691a2a1344a07688eb268e07b06824a2894d9438f0f6d0092406f739e1fd8b8c736920f8b0a172df22cf84101cd2675e4ff1b90c1c8449633eb5d7222605fad4462e8f8e98f35a3c8f133dbd174031c461c75817b473c06d9c05a339a35cd9e758b8c700756a7313942820e65ae4a99d8f387715e046e8196a44e50e9f0e00ad6bd8d714434c5f1310da6166b28066c9ced3e7e36d9e7956fcab042a0d17bdcb024a122016726efbdb2dad10c20cb3d1f34207826d8d2ad50884ed6bb8512fd35b6c867b1b50a56337ddd666fb635aa60e842f1a22ae5983b270363485a60b93669bb3daf173650e4b47ede83d32521fb290087c0d676105e88a3dfe093809af607105d68f48b4fb40f5f61f71730ff3920329ddda65e01d6e75b33a1c1d0c10521b11094b18264ee4e19cbddfcb06220e9b94f77ee240e038804cc12e422cd330f2414c9c3f312457223f340228282903aa08076dd15b0d3674b2d9312361020292e526ccd9a4293ec0cdb3c5150e8883c7aaf25939aa3048d9b70527edd94c48d18d42d9fc4281e4d4f11f609b3a3208a07968b1f7c71483cabf62f401997932da5c7e632d9e22b6aedf5aa64da0a1116c89488ca26f4cccb99593ac224eec677811f4ff8083a6920e1175db3d660d0ae0b1970001ed81e84078b1b835d41288f16da7906cc3160ebe69b07ab621890c92da6b1715dc900f2bfab34b6eb4f951efb6e19d283885f5d165bbd12af66cac79f814905b81e8ee06154b3187aee6596b7a1b31adf67f755a1973450cb3a9ee77fd06afa91148fe0563b1bef035175be5f7fa28e02bd4e57bdecb5bb1308680a3bdf49baa0e5a4525b9043bcef2f4bdaee4c09f0a3c1c77f38d1d78471875c7a76e0a53189f4d9d9c96eb48846ba93430ad5556e00b35729da7b02e73e677f78dd6954b0aefb48a456f4243831141c72349039da4b088be46ff17c4b16f37da11419b0f09159b8d8c1c9ed7e1383a7bb88425c877b14f5f974f32a3d3d61f0a3b1c0400527551a9fb45c2fc3a5c3e119e5376522eb45099d708be006f8c95432e78c8fb35b47efdea639ebe3cee8ad4c396e3864b1f9134241d30c17fd3ba37b3ca7ef87ab0d687dc91e116574a46daf5acb10248469c9dc958d1ce4fb57c1ce1d53625933cea89201d6aee61b526543ad448e89e9c0c0658b14fb7bd82811930b205012f083e7ea0e9fcbc182ee2b8a27887ec7017e492b7ba5b73584c5cd027f1a84c9be16f795ab8152c4073d23cc5b0f6cab30bf8d546bb86a1c0e294cb1b1cc7a189839a76c19d2cf3a4803ccdc93a372f1a670f45dea1e4108177f28643d29ff3c8b8d78d972a056779d9eddafd246992f8df1209ca0bbaae16d539b7bd9f41e48e003e10347211d858d6850054c549820ed464f3f6e678c5ed0e08d754e0f27a1bcc280c3aac39c997ac3c60400fbddf17d9a0b8ea3ecc70901237ad6bb07667796d7ba00c8ce0f2c64bf98df3c328c981ea51c3595d0bed76f2c6375898039080a640c8ae142d5333bc034ea693761301d1e6f444dc2938ea098d360d4d44709e249bc65eba11c2d6a08e9f02583ab76a755c9b60a724753e714a2dc1cbd30c6ead1bc36f498eee1173760319d6a91f1a2cc88a42a1139df6ddaa57ee66a9c90a43e21710c5274b17d7830441c77783cb7ab8429c9e43a0cfa76228a15b9257cb1b10a2f494fbb98f313d8bdd9cac5283b227cc486a356465d126a862a3c0d16f06c20ffa933cb42ce32b1ed53d3c04e503571e09a48f54637d6674fea68bb4f42186f781c9ee07240485eea1b7707b8782574a7fed535780acc07aa04320931cab6dbbd9f0ba2f15cc47c44863381b67cccf6c97cd7eb7b15ec4c9254747326c657b6a2e10fbccf81c7bdd525cd169814efe8361a206d7d97a7c3d0206bbab9cd5d5f09bd176d542e5d7e828c7a25ee2c9110795e4a8aa0fe3bd25f6d8fa93a7f004a06122a5cecb05520ad30d3cfbf714d53ab7aab28d5623b8096705fee5f761e8089051700808d06e20f61a9b3ccd8b48486488a616b97ed918373187c1c3a2c7fe78dcd74b53f813308828d66891dd8ac75e30c111fbc0be6871d552b4336427620a91e85811931c6d72e6934248038316cf3361ed64e3b2974956231d2e778f823ee4559202874172d302cbf8c51efd4936ce715cf93b8cff843a99bb4433a8c3bcda5a8af3bc348e065741be7535342e1d6d96abebefc12714e0abfafb81fb7bd487033dc07d4cfa0edfd263c8cda1433baff72b757a4a10bb5111bf48b236bd511da6ba05e7c1f3d11ef53dcc1c9872a14a5c77070a936df13b2b4eb69b21c083706718f6978b19b2938fb59e4340428a3982843df888f38db0005cf3dd5427258f381bb7c74b931ff6694660754b7d2e862ade549a0cabc226861a5187642b4f9ec9f52940096a3822fe36cd5da45a276cf82ae1b187b7bac8f1db061e997ae16a5d01e453eeee7e71459570f7a648f736e8d0f3f743cab5e9a66d2d5b7909197566d1ad8b1f453a94090c3911b1257299d61f7565d46c191f90049c1d0f2d06327688bc1a246c2f45f67e4b4e1903ff0baf83bbb8286d4cefb8e1a6b1817b5c734b23bd6b76cdf61d39749efe0ed52c69f6d6550d5ba5f9e304e39f801f2de81a7c291b98a49cd6a0bf9e1948e43c36eedd772bdc0f69bdc9069cd43955892e3bbbc61c6e8f9812ace566bf12052e537130e9ff35410bfab30bbc1565b585e67520379df7d6ed86568202f9dba65569c542661e9d7ae7b566e1e05ce65fc38e4888a920a13c20724924ae27d2937b142ca324eb5a135468027bd63d19e013ed46bb43fed862d4848654d5abf1b52d88555f67691589f11fb696a4affbf5704f5d0e114df2ed9f04c8bc7596da310353bf586338288e69e27b09449372da0c3621862ed89edcd3aea42eb09d91bcbcce6723665a8efdd40b5f3044a89bd482881fc2b08fb9f4780be1043425860616dd9d2a3cd956469ff01707fd3a969977b1c1ab46a8c4de063b7eb274fa0a7e03fa30a77a1a31529ed3f69837f302a1725ed0db42f1b826478a7c3c3630cc886b2809989f9739fb408f33a828ba76816da4fd0ea4a9e101b96e9ff206bae4f55433cfb8cffbf6eba2f383f973143f505ef1821678e70b3b428abaa18d38740049363ca7a79491804cd3d16a7b5e0a77aa1fbb08b7990fac76ae91cfbc44a7b05da188273022a65470f989e2143a95ee70c803454729162629aada39a87cd0bf428c1df71543a033577c18663c7b33dc79c82f1c108321f943f3ec8d4669ec106406a2ca7426c6ea387fa29455bfbe8aefd3644d26ee49a9c0d8f208c31e4440ee846c5a0472e161f7a92afb6fd33b6392f573f490000b876dffb9f22d61e3af9024ec8f3304947d28028a3feedc2bb60f501b50e0e7ed00ba71d42707202a70e2d98d13ccbaa55d7c4802ac7c2b2b0408dd7d57669dd9644b26a200fba261d320fc17fd166fbde919c3ae489a9157079c5ec31af7a3b977f97e6b67e1fc430a9169528ca4e715fda91f2272c921fca84808491dce0fc6e52a28f6f088bea55a16cbfffc4f08a788072624e6c7baa85d058d9ed94c80b88d27fa1c408522a0ab040212401648090a0ebef15149923e8923b68fc3667e5d8172296e70ddb4862d7ee361cba281b0472a34cb7ab334b332dcdc77e1829ae16a1befeea4b25c9d9196a52c08972cc0147970c9181e364a08e082c6532ffeac53462a5424ccdd7b385dcf9af46dc925dbdabae0eebd816148eae8d2a8a116fce5664434d0c5ef51f1eb7651c407b4e9029897736ea52a62c252291621c3a85e598ce65d0318b83d9bc8da352fb893015db7b36e10018fa7e2872c684cf7529283496bdaa4f9c73d7aca0b211107ad5f3a99caa084518dd5f9691d6adcc8b784a0043cf060540922de4b16e45727d48138092c620ba1e5cb6b4ff4e7d490a587a16223987219fb355a666e352038818717ea3d21f2c10a9923987f75cc857783e07f402606ef27a48c4f3558c3f1c80b3cdf033bbc43ff75669f55f7788093b074a4d84e23b9034b2bf3beafb77c98c63b73de2bf6b304039c7eb185fd5f9e2693a410bc6945683753db009a87df96fc8f62bcf1af18d7260f823ad1b85e490a30ca10893d7cded099bca0cdaa9be44ec0920ae903973fb1c6353cb905189e00f1a8417d8370c5e80b6ad36806bcb1f1f5544af7e6e424578d9bbfa399d72b6b5be40cd364f706ffce8485c7ba0e04e859aaa16ced51bd99160f84fe360d04cc1540882f12ac9a12331dfec5dc62ac82d7341680686e09470341e7b65491d0aaed09812bca7287f751db2d87e4b0fdf0a516180046b9f48c21ae9fc2c73245dce06381a2d22c059db99d32692068e04e5c163886f030b655c2b0279f8dbe5bc9851293125a4cbc1bb1ad5ac39c5e46b6ee002408b477705e8eac09b0225852ea66d19b06e86c471002c65cc56a1c141441b42824404651af3d01e46793a31013c0d5fb0452fef46691c6d99520432976c48aa57fdc0a94a2bfa4488cb19002c552eb6854b76884843f1b8616b3d7b5eeb62971aa7d64044d8a1e1911fe3e1d61c7dcb86b4dff3667b6f9646587ab4fdec88eef4716ee749317081b948a34fa0d94b392612c6a0058405e50971f877b23c30e8dd74a6174997ed340b59f6ecf63329108ec73c6c0e8b18ddd56cd810762b6cea9f181eb2a02ff2dd6dd9122b425ecedd1ee19cb3ee1c160691ca5050d73af3f807ab4bbe252a4d8bc50272f42c03be450020073e9343103d94e74ec350aa11b326e2873705ad61482b9ab8c87f0a16c2e058ec5d290c1ebb9ae38ea47e742793ea324b2951d5f542910c0a027939e25a4246739dc8a8b4c150f24f72c29ab9ab242e6cf0f8f527a1742f539bb0027ba990af0e6748398d215a2ab176662b15d98b3659d19aa704fd6ab8462226b3d51cf365a008d8ecc2305ada4d0c78824ec2519b80679e85b6d51141f105c1ef78f3de0933b27fa04d352556c604f8f0858c255e0ceb251be9ad6bcf1fcdfa0367a8c6bb31af02ac204e78c122cd7f92d281314196ae4527407171b457199681937dad26c479380d4a8a92f5d12a76d1761d8716d614d41e06d51195f972ff3fd89e1a31cd641b85cf2b2649dd524d668349e5983df99d972cd39a004c089a43cf548d4abbfe1a90a9d3b9270dbfa4413345f59b8f3d4a6c91d744bf68883f119fce88750a76b522cd9ecec8365f97617b7ccb6f6d554cd442b22e29bda5a47012e0fb59090f2f46632f32a9aa3d47332f53b0cf648f052ad17072c9ea05e3d65140eb12d439a08b21b848b18e427595610890863113e6f7f160c2a0a2b8a2ae1bc20c48636efd87cb3dcba7cd478081b1d10915ba63b60e3184a0f71499ffc42ee7ea0ce46a7afad6de00622121d4948a17af2ee7d53e088b1fd1919e101d6d16387d8089fac9fc3e6090cefcfde7fc0a7f6de4ff8a7da8744a0ddd41ce41c673475dcf14543163c143506641e1aeb398764e3bb26e99bbea2b586ce7571f38db07c7e6cf2a0cec5bf3ee02bbb54f3f00e0830c8eca9c64e389da51513f669d64fc5f29fba3d10e405d04f0a574f0c5fc97ca58cbdaf7626f68a584d677c036120943ce5a3afc52e20284871eb31a9a11e3290e50d590c84d7126b02ce8efcb3be868c62086436848a26cefbdf3c5659a89586a34a1a4d4d7164abcf5af02ead8e48ce6341326c5654584014315b69f15aebec11561ff8d385afcbfae45ebb531e57501ffd897752293faff1bae583761bf34521bf6044ad05ca0f7e8137c1c10f49ec1c5c642e43c2a3dd2eadf96f94641edc28af1c2b5c17483e5b96168bd502cef63c8cf21cd251d9b3e151f3f82975fe421d78d322a584e3b6d0bcbc2c951c9a09cf97c2c51bb5b93da94e84a40751439bf2b81ea90ce2eb52aec381a8d04a2b34517efc5d4d98a64493df0b4c6ad90bd05e08fa76e9f0f02e7aa2629bce919a9740dd0437d617abb33ce9cc2ae0bd0b27bceb81180d1d96586a69d814a219ffcea3ade2c4331d39f7f2925376b58f1279c57f0a151aaaec9d325b993c24679eaa44cd0201fd4af9804e7b6c8bb469e2e4f42e3af6024f44a38c4a8525117a99873e7cc362c3938d2d563767ca04515c890ec90612f316f67a7aaa309e9dae9ea405822f57e836528f4985477cf154872386468186ed29c845dbaf9249da1e1567c4471ae8d07427724632fba34dae3a939a130bf0b5f497c7292e2ff3fa55c405fcb282a3f1e5f5075a9d9240fcd059e92695528ac878e07f64d52e3a0878664371f5efa02c56644937893d1a6dca83840365eaa23ec85556652f596f868a12e56de22826e5bb875b2e458ed1c2b0e2c41937b11b100d0bc6e45d8858c3386114d6c8fd8b669086a18de5a89e8ff603c68119d22968a6d21bafd54116a047b175a9d5f34c7dfa24adc59f5b03e2290b33ea047ee1284412d64f0bf58a64fc02814d38ad070b65f59ed474e29f8ac8015fccd5d3536dac6f7cb380682d06a9af81fe383125f8792550c1597eaa729da528882a72758ff6bd80a33732be772badf0da1e11f1b6590d08a8839a3bcb18ac2b5a79a5c28b01997c93370689689ef64053881b03baed69b3efd17666e3fdd6a6729f041f2061193f7f0b026189438e34d6113a1a45bd575e8043d44a2f0352f6f8b7c7131b80ddb4cddf0a0ae66862b0838633d5c8274387b38613d7b3c022d6861c468ed8ceb275b22edd15b253e2c80f6088041c483159878e3550df861d6aea7444c74200cd607ff754228b4a4e494c4aa405016c606379198042ae74aa972695171613b16acd8e950c34286678511c591743df1b43a96d5aee394bd2d28d56bfba4a4bd8771fa8c9cc6373683147f038ebe44ef897bcc87ee7cf292161b3cfd29a15abff85e814cd5e0962b6575db6b4dc7f6824018cd4cc209cc24acb931e6d10c06b8625eddb7bad48c2f380151c0607a6859185108983a00c891e7f21958498687870af2592a0269e53c051e8a3a6aedb2ad2a63f3a2d7982ce9ef9b2c66eda746da3bd4f9d4e80209f9e6f10840ad44f126a4ca139887e755fefd43116009e976c15d0f86a6e069e754f15fe7848c9601eaebebea10d07e524846cdd831d2202f79da0a1eebb78b838e750d1b8f23f86821b6a082bc2c9df7bd4fba53545b327d53237f01afc6bc9deb97c87ab56db121796cdcd6d63ad21753b55d12e327430b74980a8808c303137d99165f74974cad627dbb777ac14dd8d87c9ea914f0226b43104b3608c1f9a3360d130814c88babf26ec5c28fc8d8e19ca879545f790d0bef0ae315593fc7a1a0d951355bf74089cb5f0e155e70a47bd86700741684c7a332c5fe993c0158ca09d9a792bebec962af51ad6d8d2c5ac250aadfb34c8fcd5f3384022f4503e425bca6ffed7cd206ff1d18c6481e3629f1bb0148d1788950e83aaa2b5ce8f42e310ab454eaa1c8dd7fdbac54f4be1a5f2f60e82edd79d4fa7f269b1f0c48be0445299178d8947f03801a9b295dea3b8de8a60e619f4d4ea98469b8e8757cbfab96d0e9cd62d8ce72b49c3c6d7ba8aba58e48e147d1f1f30f84f17844c35e4a4ca6062a8d81571d2d01b223c203c7a2eb5dc23948f5aa5be9f91ab82e26f04277c33d4d34a62dc16cccfbbaec26a0926f9a5b622186c22857892dfaaf918f503595d799cfa0c9f40ad8aaee471a902e0c91511bcd8f28a9bdb489df7f6e50eb79c4778bf1914e7e8a2d51434d57c10d51d18a49aee82275526fa7bf5d3b30915ec804e0fc05205197c19d7c4825345cd2b8a402efc870402a68ecdac91e4e2475e408c8b6f41d89f94c9368c36ec3cfa88e1130fc8619cc2d5f4b3732f92853e2fa717db2b12e7126830970f38e49608a7e72a349168308edc1b73207c07929e2280c6a9af56aed24b84a5d225fa8bf134992383c057ddf1ec60c01e7532dfd60a000060f692fd44d7cd4e1a34e675601f58fad97df2a2620283a426cacd551bd98892854ffc47d715d7373436a5ea85b7a018005c25e070bf0c1c88cfa2ff2f7e61e61529929048afe1550d550c516181d3ed02e8f091438bc68540043660d9a93eaa7720338e81e5b1c8ef320b9899c4a4522b55799cee4cee1f1ff6c6d7c533114980a7a170a720ae6820c3dc9cf9f2ca081af8536a14032bcf855feb5d70b0f018466b5fc44064f4491efcfc080cc27b076d236527b01d88dc2274f3b426a14aa0bdf78ee023ba1061f305c69c873025ead8b9fc7aa847a732a6a59315cb6f11f0cae1ea62fca34e227ae5affec90b30f40f5d20ba684fa7575db74380726fc4327d5003fd27c23e98425f848a87ddf8f0e00e0c76479df2e5b0798598a1531322ce99e641a2b6bd89294736296550bfda5f4d9bcbb316cc39e613003069c2f6215546f505255e4de06055cbddbe364714bc3690d6967cf663f20247803c4f184b7db62145e384423dd6b803e60e8f500da194182bf2b4f3f2c6e6b529b6ff5dc56239f640dba967514630ffe644a399febc21a02d8d330927cce72d362d5cb764d3604bc043e4e4eb746d82feb466638a60dc9ea12a8f212fea87b8fb1c1c46a7d43e28145849c98a82a6bccd1ad833bc1c24398944f238768252e3407d04ac88acaeb6656eb50821c9ad03b72099d313bac431b2db75b4e05dd39f1b05217d5f1fd3d74e00a5a932372542fcad04404431777ae576b24384f60f97a8fec40e65997f0b91c552ed8912671743367d92ccc87b1d59285d467d308c581cfd57af883fe731cc01586ec90cffef20a22a73b1c63f75c2278258222459a7424b34280ec1c014338b6111aee743f0eeb85137e796cf1eb240eca819d4f282d51750695733889b8dfb90e21a1774da358f50a6f485370e31644dc3a829676cba6f510cd6d5a0200904655b2f602fc290b0062dc69f5868314bd65fee332e037920bbd543350900c9049be501f2ef1cad0d650c6c4515e8459bf3cf7666e5667e38ad53cc12f7f2345bd6b2392ef194db4651640b013cf2e9bfd1991fed3bbe44b63ae6eb24a2d8d1810a1d3db0aabfab7de70bf7fc48f13c9c03cafc3c5ba42722c5b3b7d3cd8f19755902e76018d9b7475e2426ddad04020fee8f23390273036c7864e974f685c3af0f4c8c50b5293b6a03fac0aed6f9f9259ff304d6eb70f7b38907837f83154fd6b58c2f08dd6bfc7a012d80397afdf97a2763553d4243412df6accfee50c295e5890486d19e40fa31f3c2f542a2176a17176b53d99b0dd2bec6f237004a9d5e77af612e51487a629d73c6ffd2c74a7503a34e9d94973e7433beb6c8bfc8035a7b8bdd053bd2311b89d15e08ef0193632ddd5993346ba512c348cb76ebc44bc7b1d158c8a19e579112d4b04f93a1683d8120c66e1eeda208a7aa1e17c0ee7c8ef7fb72827064f2abe8e34a2da94d811429ad9292d0a2e59142de01d55f0901e320096129f69e501158d72ab1134ac6e0e4aab549d7ac124a127c8a64837b5f59aecf4133d5741aed5937d6e48756a2bfb1e0bed609da825833a0fe2a356751445c7315550e192747c23b63113bd8a25b64d70415b3a434c6b8e2653a114e455af9b4656bfcb7557e6659ca09216ee8576b1696fd281a58e2eea7af1909f8cf798f74eba5098626e6fbd21431ddf020777b1660426463d64de0119fc6915c3ee0121d954a2d6c1291f7d58a6fcf7ad70c05131ecb0badc320cee5d846725dc06b1e78f8eb64aa3b85d9442c21970b3f94d4a2084a26e424e1c4c22127ec67ca35c7a12e4cfa3f9a1cb13fa5f7212534a4202f8de3ca3842f8e64d93f0134962515d6a23ac4a4576777af11545192b133489e09fe0e489576d1daf477e50582ec79e6fca72e126683c41a5390105d66614add94c09dd2494975f03db657ab7e88e40e9982c85e0eb621c2ced0ca38d4da504d7718ddab6b90d00bd2081b121fe063db838a1ec3a7390e68aad833aec73a9d071c77f8530c2d042364661395e518ba4addbd18d88097fa76b8c3e208785bf7100a3742baa8f5366a236264af1f7600c23b42ede6f91f8017bc82513e0583b38d706858cf86f5aa423c0c5b5e4e986641d4ff2741aaaf92b3ad46fedd91e86587925b46bdbc92f54dee69da0b1e6e02e308ed8dbf142140b9039b13bd14b8d37fb183cfad13087a0ce56086c2cb64d99fe6228b6b38183644e74bd9669c02bd842f1a49a8f3547cab0efe11d99e0915c65b7787e71c3b2aeb9d7f638557e90483ad605a2e4c71fc0ae67dcaee55160c3d79a58fa84b156fd5985e5cde382aa7d2c53ab0b2713f08cb12285d2ea2caa67de76b9a1ed8371ce942873a16b69bf72bf06ee5dbed66f9e88be3d09c09f864d5f5deea4d59719848f00dfb7b87cf1d8b15932b7c9f11a6c3fc6a0dacfd2cdb68340162b88392bf2e198be7d69b96f582a6d56090a28bba2b559069c13490fb30f888b83f70604e9c0c9cb7af067e93a5024f320091c5041ac56b5c8e0d072d625ce50d3cf6830e106e17377bb5e4eec7299f9a875e85200eb163da2231e7b435893021e9921d99d1c347dcf07721966db6492c3965fd4030d32b4b04a1876fbbb1dfa658d8d826b139c9ca9be040978c084c0f5f77cf780fb161b72571e7642b368203dd1c919c2e3ec48df33663636f83c5c94996a46062a62b436442876fbbe1dfa5385726ba5bc8fddfcd652eac695ea85f8377c770069eebc034f35caf30e69a41b698dab976552d09d01fa509099f03fae6b05f5d745b08840f3440e921e2e7196de0a3d8221c1ed06cb5031406ed1c0f72e2b65fd4286d94f15640b9653c6c44d462e380d0e6cd14ac45a46432bc573f5a4ceb87bc12e3e6aff0ff33b20c353eb0327ced6d19f1e1681ab97ba55a58b74bb075ec45a3f435759b8cde8d558853d352e740b9c1775bc38bb5f746eaed16622b3ec14164370c1f5557ba3731a3c6803aac535d0cb0e57a6cc5805d0191eaa01dc809141fcd7c2871cda317537e1e2fb6b265e0c5d4bc7ed3ad33429017844813451e34eef9376045d0b143dc3a33a75915aa8584a2cfee923fe842aff98e4501254e31c9e59e1f552dcae385843a41ac2c6ae510b26582e56e2634c10d70512fda2e21243bd8d2fa533c2a4ba6b205047421f7c276a45f02ca0174c7aa8d9668a8eda951c3cd6b77c593a65c9d434799f300aaba4e3762e77526a93420752f045bb604134af6d21f964ae7fb8f82b7be76f70600148408774e2094dae87488f3028fe730375825c23abf6a715019bfe4c8a77cc115b0013c391b609fb69db2038869dcce1bbcf6976f79065cfc99eb14f9d82d02c2b00b0be72883e7acefdbc1ec3f06dd0b4b39fc6ff516a31d0d6806143df03ac71f7d558e91714976871ad79fd23237ffcd138d985f313316b1445a1ad1fe0b90ba95ea7190fd055fc42522bd3385d78f4bb32bf75b9dc186a51035f8806e08ab7b7b2dddc088c01e01b5090a25b1ee678a75ccea75725899c3a2b1c811f1c06db27afdd5daaa598825380c1c221959733dd22e6c337fb3785f3853c4f4be8213771dfc0302f98e1b669d183e3c0c98b5196e764d42cd6a27b5fb5a196ef5ce43487013abcd21cf30f2517276261955f9b898356bdc1ddf3d8da0c3c28f8e7fc3ab3da33c6fd8f18f6d9d17d780dc0ccf8c1f393309fe2f947c6c5bbc8805a86212607fd5b26c91932e6402b7e72e1b5e4826473ba1c4019a6b079931904fb66855bd3bca9fcc7cbd468a539e80ebb3574e81b708cd32ae4b04902747e1d20044fa336e1cbf7b066b5eb861f073aa0b932520640521271d7031fe960c8b58e1c3a60fa51327e2e263cf8ec1407545b57b6f38a9960ff5f1f957a253816504c43dff4a8f29df33c7ca082286ac3095b9987826afea0b2c14fbb25d1405f5ac12941a24b4295b59c5cbacce8bb875045b5068375e8854ea6e383d9e4fa7e1a2edadb952af9964fb360b3e566f12ccb71e56cc2809bc20e58e48baf5460f1329660cbce0b82f90012f2ea98d3462d6acd14246d9e23f7e014b5151a29e7c996fce1df90c9417fe2d37c609d79824131d651aa76b92a391c1c2829913764a1218b3f058f2bb3ec0a06237a69c16bd3b6896f1d0fd5dd99816e8f4dfeb225ba84c0134730a236a3e9d90d145a9ee6b2e5929f5a00351afa3f16d10f0939833ab34d9a3ead4c5929815a129205f3c4e9d307d2744c9ab09c2800a41775d088146c22c41c0148f87a2091ca85ee8ec15b7ac742c560c51400aa92fb0c2a5e760a27284f44b9c89c68e8dbbba5d9eae01281da5d7e235011d353241522b0f2f00459ec00ff390845abb2388b4bbab86bd450a68c5caef3b60fe1849494de8c93027480d27d934aaab05565669b3f4997362593dc6e620f3baed4baf4939b8c32a7cb39de0d8a0f32412cc587b29a6c7e9aa2714a64e0e26a1171261ee3a947a0ee99b475caee0390ba859b551f1f101b7368443fce21ae35a79625dda19b7388bb780933022fe157bce5b40b20745b623e93d4612ebef6f759f844bc70bf8ae437f465d62b2e53de57304ef14d52e51c6d8180669d4519c9ef492722292c094cff7e903961711052735fa007685be72ddb9fc9a33124a4ed6f1fa02ede0b1a411969bfcd477813488b24bacca5a224b5df78f410e6b951ff86372979cd8420b73ab97412c0a04fbb14c422ad19800ba30ff2c3f486c862c9078332dd86c5fe94da900d79fd4c72b66b9eb520f881ddf89374c6c5388d47e6622b307a2b3902d566bacbe76932df90f5d363f278e28be39457a7f1f4983ca3eb020560e4f785cf62d8faab0972cfd3ee1f0452ef92acb247d74e62d8715318513ed7d69e9c341d5d8413867cdb0924993c4c94a66c1edd385878687f9fb45295612b333aa3e15ac1baf6722810e1a57814158334424016681fb71dcb656e91f2b5f1cf2dd7c69d6628f3182fd1ae2de1947bb68556539fc83ee8a22d99e1a25e13973de46c9db843619051819cd4178369e47ca91ba62a20eca80eb109f3a7991850223fb2e5a12c810f8afc84237f9d7085a7076f9fdd77c254123ac40f225f4584828bf23260975fd17f0510b081589a9c51ee4cbef87f1f329ac7f2c172a185df40e89e66b04c327f0b35c030d1765581828fe550e619ea2efa3e532e85936bb7a64029bb1827cb710aedd92e0f5d224816be383cbf23413abb31368cf6bcfa408d0e442ccddba9f39f692996f0efadcfd21a1ed043ce22e28941a510b64f09d829bed9954dc200499310b0b6dbc709c3091599f7c99ddaae7f1a24cb4d48ce0ec84ef248f7f1790aca94e5263df0c003e24772b8d923baad8ef84f74d96ae3983f98056bfc277df614f31a486d43e910fa1e5ffa979e1273fb1435b4f63987eaaec06a081313af01f845f032ad7da8c57309e15a503f9f27be84cdbc9d8847778ee69c04b73e4c560b7c279c68dd01bd22cda6718220d08e07c61cc222d4055951601c460b44334f0702144431ba2ec043bb2702f42c0daafb6f26d9384ecbdc9965b4a99924c0187088e08d2087ef130f22ac48bba4ffa8f7eed8bec653eea963d52f70979ad23b9741229cb3ae994fb019f3a758923fb119ffa12158607fceaf0ab8f3acd79e4d047dd177acc7b605e13faea3c2a9b97f95d7571c56350e3013ae621bfc158e544d0436f587dc831155ff1e554c947be2bdd4797bd94eea39ff98e3cf312b76cca341f719f8f4cc401815f3d6a35fcd5431eea3ecc6be5443df0b396a376221f71299e715ff699b75633f28c3fe3becc455e39fed56a465dc69ee6fca2ae07e6d0b3ce47f65817aa6f71dff68b43aa7c640fa486e5a1bb70b6c5912345dc50c40d43a240e11fd2552ad50fd9dd0dbd9bfbe707b34aa552fde02a6cc49a141b2776602307f523498cb43e66be9d7ff4d7a81c99c20b7ccc38162043df6706024710be486fe87c04163dee159ec4de76d2e9ce60873975574e56ff65ecd7d65848c5c31e0eccf898e90107661c88fc1eed5967d072eaec2fd42fc728975d8ca45abe1f9d7ee414a561cf28900e88fcd9f5882e3bbacc4960cba885aaedf9c5420a82c22085112870a043f3d587c2affbd0a948c32306364b6cf14447091368d657034ca250f1a3df551b807e533675052b3807b4b8410b8090d086223b605141109838219282301c31425bc30d8f1aa0744a0c9af6bb6a4313b307d87fae862b3035f85c6d400117414446bf2b2e9aac66c308d5c61418af3f5708330833cf7cb5986521e98b713d6088bdd0cf9f7e575ce84022d6e558c7185d07f518b32c6698e56d7988fb82acd39e0c79db4ace9d8efd130c646fae07aa07066514b0289304190bf820620330e623c6f3c428cbd78a21328bdf7685b85a1d9b19e4a67730352467e7ee5371920bf91bcc05ced3f85d05053d6665160f2c2bcee242feb23048a995e2ab41e69afb82641ee230a72c242fe42a2111277dc4891c83594c746754b5bcd6af5e1de3acfac05e749932d44f66dff21b51f38ffecc88dbefd67074303c2c9faec3628efbe8571771904b1171423e85b96faff8827cc7b017a15665f8c4a819468d44eeec45bf32127bb112a15a20080c6cc007a3b88b2ec48f2044300a067634fae4b834a3101eb083a9b17c5dc8472554ea344aee7315882919a954ded703110bbb21acdd1d203fecbee8f309263bdf3524f8e89447841ee1f4a9e510f23d351eb8080cfbb067df183747c861f479190a6d0beab74141d80b39d51c20e44310ae8c162a46331924646598531c2e1a8991d3019d46eb46479c6824049baa5df410573b1573d8243d2a79e95d17715450f98a1f9ffb930a626b6c0aaea9f3bd8674de51eea37f855c3ae721a82e3dc8d630a2c328765a4445c1cbea1f6c013cf21fff7043d4701fea3cf63a67712cd4e5801e2bf7c1efae2e86bdceb1ce32c859a70a42040b2ae6d33ffe815ad761d331166e9f532a7b445e72ce754862fc231146b1ff505a2bc31ffee19f8f7fe0e6b46783f48211644e0d873b46af188a381047a7bd1a7130f883cfdbba17479db20eeac6f0a8e17007022620e4d229b0352e975e8145752919fed51a2abe9bb2d6445dc53baed7a31ee27677a01e39ea3238ea311cf58b7538c67d9887ae9153c7a64573909183dfe0ae73ba5dbcae6be45707047eec3eead07b40af568873ca4af00e89e3e2901c38ee614fba0c8ea36093f4c8498cde14214224e2441c222f3de230aaf3548c4b8f47e24e54125751272af1495e369183bff31b8c5d1127e26c0df9d2a3919873753e32e840e253f7c0e869f7c25beb61e4b40302dfebca452448a7a2aa4d92f38ffac028d87d2187397a70fe037ee7a14ee689fa45550fc7755c1c7265d1087b329311874d926daae525c7c1dbd9af7883c3281c5c6edeb2245de689da037af51ed1863de93fe0c7212bd9a1eae54a51c83b8e63385eb149429d67f18f7fe08df48b8336aac975aa977ea361701f7c18a12e087bd23d86bf388c072182512a46c570e97008a3286dd9bec5775bdcb9688473d8935183413a05449ba4d3d87df4ea6274b1e438f817718a08c22817a9f5b039f5a9f1d83c08a35c5c3a1150b535f6a5538dc7e61408fcabfb526094605e38e92edc462431dec2057d918523715fb6c20d61615eb91ff0479d03d8930e444b51f7d1ece7a5efe8544c272b43ff3cabbef466f489c13270b0e918b699109d7ae1b325e42f38b8a6f696946f67e1764ddff5dd3256546cb119532a7bd2abaf78b4387e0b93c94285dd8adce2a08b381d96c31cdd0763844ae074e885e95b16aec54f36fc7458ebb64dcd72cc5ae196abd3b7add6b9b24513af795b1c7c2cc609296955eaf919f33d3d44bb5dca95213990f82bee81d1afac78f51e345fe980c027759fe5b0c3f9f61e968b627412cae08d56453eb46976f173b65152bbaf1ad13a254ab06cbd5602575ebd6fa84424825c86cd13d47470f79dfef311f3301e1845ad07cd610704be25ca9a8337eccd0d60734a513f2fd338d8047b70c5a6e9be6d754e6715d49343971ea77f50498ac5a7c326d0098402a3b0128cb2aa8440db91ca46707efa47e33f0884c3447e4e67e17c68d3741117356e66bdf6a56207c7899c282615dfd3b3ce356e86066659325354283d4d9410f904fc7408c4a85d41594de8e4a763346b4bfea43ea7773bd57058dd89bdee2cb050c6e69d70c521d0d618b2bbbbd29dd8839d05d89b1f7c15871ae5329a92e2bb424392e9f3db2b9a60d4fcd6e7a74f58e4a74f8740d3e7068b304ac5a7ab540e098b8fb821e07411f703bed661e046884ed135753631ff9e1e44a758ba9d4ba75be0a23eb48f18061030c71683195d7ecc7d04a9d9d4d626cc31dfdd9678563c76f2c263be145b288f45b12c68a1e1c8af93df95164a1e831a8d3166d647e36947433664b972528f4fbbaf046f6518e64b53482b2d8efc67e331ffb6c70686c29c013bdcfddb7eeb545c13f4acfb326a751fa92eedbed2c3edb11654d674741b7bd80629dcab736cfbdb9e1d5ba31fc3e86575d1374651c72cc79cc4280a55b30b6c2d8f150a4d7ea170c2c97fd589d563a386feb97ca77c776d137b7fa56c53fb117b91313a26351c31d2078f3565d4cbafcbf62fa65643bfb99667798b936b8aae7d1f7876e854aba13f39d263346b6ee5b12b6b4ee5b150d65cca6358d65c7d2ccb9a1b3d26123d26ca9ad31e1b65cd658fd52c256b2ef4d84a665d8fad64cdd1c7485973d6632c5973533ef6226b2e3eb665cdf5632e5973fc58c905e645d4dd083e6a383a363317b80c8e001adaa9ad4d5c210d8fc121632066c912b90399c0d304b9f3b3040bfb832d4902cefefccc2cf1e1b9441186241e1626ccf1f1c1dcf9e91d6622c90b1e3ac725552c09add60b4f4022b492023e814f86f0a837858714441e3e815ae4c01cf8e0df2e699fba3cc5c7ee83dd3e751df28a078debc3418831c648850a9d638c31ee768c3146ffa22f7bdc8c91cd20d7bf18638c1b63249156663ac618b90c14a331fa4c8cf4f4cb53a8d0b763d4814929e5b5bbbba187df5dd60584dc51b6ccfd4e9ec9b9cda5a6cc5c0b087977df8a01f36fbb90f9b75568be9b12f9b752107554eb6ad66d5817ea3cec85d8193d2d756b505f4f5994e5bb80e7994dc0a6424e4ac0f4e9df8b4e853a21d8c4a8f66f9ff03942b007c53ee1840042bffd038bea8ec694de23f8e8eb49b7b41a1912d16e7786942b2d2ef45a6e6b440f2225e464083984580bcc68a5332713e772917c905a4cbfbedf29e4f4da10b5a68cdad633f3eba74d49eed76523cc61a775b3ba6f73ffb6fb74f80f0ad12904ac899d6783a6a05af26cc5f302c9e0d9435a0eecbb9bd919ecdc03f9d27088b2dd1a596cf9500bf4a1cc9203145c6f3dfef7e89d21c5108217d3dd3258714a39a3d59477affa34159d5adfa3699bb6add68faec3ce79c4f81edb8dd11860a18b5a4f3b45b74dccd3ca18f3bcee9a62431ae4a3376d0cdb5c52e8f5ebf00be2a3c3d845ec312cea34c7eeee8e6d8208db89138eb46194518571a4713ad99899e1ee187719cfe32db1171995b147e5731655f60e2e48d9ea19a58c7397e946786d48348b6c212a6ae6c3875dfbec8c20f6827abe95f4aa8ff09fcb7afb3cd34cae22a1946976feb3543e2d7f0545a142ff2c556887b370f960dc6d90ebdea4700a35a875d8f33ccfebe8bdb5897d8b3b48b91632c79a5393f0dc61f964e648289cba86cc9dce993b9d33773a67ee74cedce99cbd547327e7da914e58d18c6631c618bbd29f119d4ab0490747e7d91b875146383595cc24497068139c55733f91f9ec749256d23b3d55ddb2084924616aeecef345455f3e7d73adae229cca8e5c3e7375f9ccd5e5335797cf5c5d3e73d56539970fa9ee5c3799cfdc79760c56f648cc45edac77bbbb9beb466ed1d7e319883dd964e26c0d279c92320a9421320a9121bfb30891df696416691cf924a3f4e6bfced95e3ee92954e85fe7cc9df804b631dfb55c548e1991ff4a51364cd1d6994eb069ae329a850c6294ced698ce2ea370ea2ac226f62bae60c2c4891328733557cf6e75d7cd54329b98495ae799bd755a094e4d27e66aaeb2a8d76ab29402db98af739e1d93d16f3050df30134e311436b14771d243d677c8af13f975d8f1931973c68c766a2391b673721608cedfdf6e77c6ca7051f7f34a2fbd5318edade4319e0ca3b84a31c9c1f88bdbf5a247223ed6c4478239c51cc3b81d6d629fdc0f405820c7cbcbce07a085fc124b6f713466d8e3d39e9e5337d8a4e1e8cec6112436196e8c22c9c17c88f3da84c4db44592a81dca5756c5ad98e0ed481ab36b112a8c47279da2998d326460271da34061c7e4285eb58086b2972739365d97a8c824dec3d3b1512813659c64ea8d099a7425f55e8dc84948c99a092f1122af4262a742e4ab553d36d84d0906ca04d63a810c7ead91aedec96114e858eb089fd8a2b983071e284a140e1281ce5d9e757ba500e17aaaa4dec2b2a1a9220412c2dd922f196cf14aaff2c1f968f385ca8106bc9167bb15d3ff8e0630120f60703416c59a31cc01eef287d8fcb4b461915d7238dd3c9c60c7bec330c60efc6bec064a51a32157bd8c43d46a825cec26b13fb0b0d898fa1426fd178f477d7a2e1c06032564229e324e09031122a0c8ee1a41ac3312ef36cb746c3284a1dec618f5d0045d42ff63cb3c71e4645c1298b0a36b1b35b3e47a8913dcbe799b3a8d0d9a37b977ebb6bae2a6cb706cc6e195e76d985c62dbed89d53b65873b26c0dd27fbbbbcb6580bd8ac0d2b492364981ae7019e49c2a582825c3b29893f355cbea48a4553a755a671389b2d94f68ff7577771ced7656ffebeeee946cb746e87755ae95ac697318296b27d67f91622c1965d4b71e7dbd1d7a8f8e5c650fee8cede68b104c3ec26cd9627777cb9ccfe58bac812af4deddbef9f58e3e7a27c62de332608d847ea8455d557ed85361afeaaaee43989aefeecbc02f7b91cbd032721f7d7161981758ca56dbee23c2e777e7db5b0a157afbe89d5f87d170acb3930a9d3b9f6ba8f0bbbb12cc8bcbf6a28585b4a2925247222dc34217b5a62ce500850a69129e22aef8945f1e55935fad08f5f38714fa88f92c08b5fef2986006cf63822227a0b13c7bcb374e2d4dcc4e4cf2f2cb5304173f7f798a80f29fc326313143883186084c3013586022a6a4440b263190469ad5d2ec767274a74e8f74fbe975faf214e1e4e7fcb9c3cf3965c742a81b7bf0f303f8e551e93c3682d9b74c519fce3eb918a7d683ec1c309ad89bf2c77feb3eb267ff843c4b864f9a58a2c2873cc0874af0a870ba88e205f0bbea42f5180633a9f500492cbef906e32fbcc597512efed2a3fae575e4955b19adf8c859ebe1f25a555ca58359e96aaa8bbaea23cf448e715f8aaf3700c655ea03e0c37875512783865a3df308fd7af297bb00bdc1e7dde7db3737f47c7b49e3b1e23fbefad478c87c54451d8c8a5fdd07d3438a8b2e1f751f8c4a5793d28d5cb4ffe3475ebf149f3be0c3f8c57d97af743268a857e7237b918f605cd4f5807195ae878b5f9ec2f9c8fef211f7d5ce47f630ddb2b779d67d3eb277f1f517ee8bdfe2adf180352e5d646febbc5bf65a3cb2d732e281850716d758b8af04af8d1c6a0e351ebeea59102fea7ea8f1f08dbc7ad6f5b3741f095ee3815f0b5f35ad9dfdd4a9ee9cb77e8f49380f4e1fe369dd48ec6d92a1013d6738066c63607c64140d5d19edbe7059969c16b5661721127028d14e7594b24f90210c36f8cd9c08e099388e4be1b835b17b9b0ae2879eeaccb6bab1c3071aca514bd2c82863109da2b4d66d738638106785051f8944ac31057ddbde40a742dd8dab5b36519e37dac44ebb8f5add6ad51b1016f70b52aa915a99b74a8a6ee3068410cecc7c6a070386101353636a4c4cecc21011040f37c8bbbb95e01675ae13cf5e0ca718c026f6ad2747e3448453163b18c0a8e8a4d8d5ba75ea74da4edbc98a19f8f0167588f89fd7dbebfddb7d20f8bcd3276466fd466f26c31e6fe7d59494256dcaf36a69f3855ea76cd8d0de8615b5ab90bd739b4b5d137bf4d89dd8a77f75522a6b8d5d77dac11e7be79c5490d90997432b6e489c3a8bb191a24123db6a851b3b05cb5bd4985dbea712a73cbeb8191a44a021c3287ada1ad0a2d3e22e027682ce5b54efe366518f29d148c97843f0b2a82b8e0294ca6aa8d13146a2396bce1a8e6ed813f8f61aa7a5e2cab606f5cc45beee9d1ab9cfe9e77981bc4eed6813ff0782bfba8d25803caf5f46759f9011a422ce37203aa539fb0e07f880811f82380dc0ea971d54c524b819af7170882a496ddfd5cb201139e5906022229cc5411c68c4fbeea00d930afd83aae97d6c2e00af713ed824bb0d40d5f3104e05f9e1b1c73ead69cab81b3321b6ae60b8954d1aec3222d42fe661aab40d01aae0746a1c54e87d830a7d868c14c0c3ad013108bb61dba0425f23157ad7a0426f1a54e83d830abd712af48d6919740c1a065da45fd02ee816f44d850ed32c78b1f50a5c5e605a604e252f86a742c74aad820abd8954e89d4485de29a8d01b05157adb54e88d4485de47c8c0be01a043d627f0e8c994f59000646d8400b236814cd645ccc85a35808cbbd821e33764ec86d30e039821238000983c1d0070129df822d2dd3176ecd86b048cf4153267df10ae8c73e784dcdd4704a6c34794d8d139c2fe7112253bdd47c477c7393e114ad09320807e1daed3d5af879efc7a96f3eb508282a240891204258887b0ea494f144e44e1d3e3440f153f3eab22d0080e2c0271a00ebc81db0487339375d24d98fc368112f42408f8cdfcdad001ffb38143077c1a33ebc409839099bb3bc628e58c7336c30999bb3bc628a59c56b4ac66684529e79c9665514aaf500c859a61c8a2f4baae5028846158a6454d6b865a08c3b22cd3344d24128d6aacb519564d241a8d46b5d69494149595b8b2d20c576a0ae43e8a4345d3011f725f866345d301391249d30133c8b1b0683ae0d796d8d2d20c5ba808a6e661b72b242a82a9f93ef0ecc3de7a0156d034ca69cd5cd7ae428e61997789462c8a229196e3fad1a8d6aaa2b2b2f2625fb4b4f016f53bb5bc781143aa5b89543752dd4aa4eae2426348752b91eacbb645958e718b606afaa783e0678459d591fde42d2a56c201061beaec4abc458da1e1b0412386366383460cadb391038bba0e76d3f927d7753964333f9db7a8736332dea2c66839ae77193264c890f1e2b2bd90d1c242922143c68a0c95141955860c1932ac1df6a7451539ee9286a34a4bc34159142d8bd2eb0a85b0c8298123d3c9344d241a91b65a6934f2eb9bf3eb8bb33336724570e0fc7a8aa623bebc49595789dc0a07d5d87df57749246dce39e79c91934a58b44dc3d10474615192df6d839b14c1d4ccd87d13f89d5f6f895c7c11b94dc3e1c2e2e2e2425a51717149a92e2e2e231791e6e2e222fa7c8456135e4f6018b65a8590b99bee8ce8ad8a324a29e59c34e6902a69ab4016a992b60a4469a653da4abe35e1223a36e9479855aae978f1dbfd7cf4d096311735c3b44cd37044e735d4ed9c8b4a47236fa4e9283d566b4a8a4aa6b2bb6b596b59deaf5c515949a92b2b2b2b2b2edde763eed0d2135bd4f61bfd006c217794a369651c068b52f6c120b70da11158472155303eeeec0c0683e7850afde5294c02632caad39d713decb9e2c38e7e010e397da12ecf109bffb6a0ffe856f218181fa8efffc02a9acb6ba7428e85306ec8113334d46d28cd755d214e0898082ccde544ec8a2604d44370b9013eaa54beff0384d9ce876b2747279e006608511d87e0ffc18f048bba3c4634e13102e719e899798c28f2fc03ab682e9f176743699050ffdaadf5c8dee4be203fdd9a73ce1e40fa918480faca43958a86feb02b1a1a6980eda2626c4ec02ef718027e0d863f783dc6ddf55ed76aa24a0557bf0d1b8925a4af7f1566985cc272c90d5113df92239096e48698edb0e6a2816b9a2eb91fa02aa5033860209039e612904048668b1edbe485d008a161a7216e48c8316e08e6db269936540f6cd0ffa0d92580e53387108c5b9a5097a0351e0678ead8c2d644570784434ce79cbc44d339db43944e6bcad84d59fa60dba925a22f313d72434c8febc91af91cb91fa0aa836bba40703d0361b3840766be87f74268e86a3516777308f52396f0c0ccff68024cd8ff95e0d378acbce5184b517740b0d678e82ebab0a2b58435bbd83106584d8c1d5c4fca11480e08cbc8d36748865a744c664098e384114ac847d89ff5e1f579eeeefdd1b13e4e749e3ecc8139cf0d7516e6d000c360b7dd1e4007080096b1c5c41c643739cb698c0b460807ac94c1682f2297d1565fa4b4b0ac90482b2c2a2d292fea367211bd68305909c32104e38a41dde266277388312d83010075d001005e8c71a50b5eedd410cb8d18edd6a9a5c13aa38cf27478ac01f0589411f317b76daa5a049686722187c7acee31ca3d76f963a1188f61301ecb70784c2b3d2682796cf4f25875792c45e5c5632b242384e8764d4d83b0683514636979b1b9bcc064b484038c1819a55c97c37c2c46060074c828b73426193139749cc78081830e9e27ea6e69a25cc9d307eb254a7e9d36f9756baecba05f8febbdbe1df7920ad96366e6dd1a7b892c2c30d8043ec61d8ba142bf9e1f06c5864f60900ff7c8f8bc7a08b987798a8a7363c91b9c2adc749306a2b381ba09150d1495c49dcb8a3b51c915e28ecdd3573d85610c53d908692bd476d8aae73ed285dc514eebba44dd3577b409186594cbf6a245fa17638c1e9785b4a2925247222dc34217b5a68ccdd0657b11a1b8d374805146bd04524a2963cbee6e29236321616c8b09d8c67cd0ba3c4ed96013bb8d1d40546047a7826893101558d4073c465d6de3afcbad203a15440846411bfec0a26012eb05215913134b00f620cd289803935814dcc1065d498cf0ec70870fc01076e186099d1cb8822bb8cad1c9c9814c6cea42725dd48a31da60008dd30902fdec462876731077b6c646212c9017fa666bc46e418c710b1f5e6d8d659e7da205cc8139f061894f85b21b023e335c434fd153b4142d456a764a650f46faf2ec3cf976e9cb23049b54cb4d8c8d1d543c479f1490e13fef878876542a958a6689e549e2e697c97fbbb2fedb289ea9e02145107bfb91e301c58ae3018513ec314f0a709ea5d0ba83e1c1dfae83bf3b1e5244616f5fc8738fc4b9544a0263299899777e7ddd9aeb323633b31415fa6729017247392d7a85b04c138d6a8aca0a89a5e5c5e6f20253c201284715774a302f2edb8b16183170c8913e402d2ca41515e9f3ec2931bcc4ab9c943a12e53cbbe61c0cbc994f78a565d87cf2ec21ae7b8137d6ea49e8b256cf4ebb1c5ca07737cfce3087dee410b33d05fabd7676a28879f13268a8bb3b230a192d30422a161b8f916b9bafbbdb5bb53376a57427a2a5d0fbe2bb631ff6e40cae9c6d6369b33566bd6263e24ebcd38c96e3c5cb8e49911922272f8a43914e9efdab7dc31e1761ef4602b1c73af86707d30d27ce336d02059c6ef90837f661d48b5fb73806b0e9c6c49938d308a7ba48df1ca16f7ebb72a41b886829347794b3bbbba748fa0db66077776ff4c136e6b3768218d5326363a66d822cea47509a6b66fa4c2dcc9ef9c31e73730d6b62a7dcec6209c03e7b3a3581e60fa3e693a98545cd34f4cc35b4149e7bb5fd844d5945723aab0814cf459c50e4d91a621df1ec968a0fc03e813ad55574179e27d0b3cf2ee693389fcca09a3a9f74eaa2414cf309a3e6b4b49af8f0e266179bba9c7daee1e2d8a986c45d5aa2eefaea2a196c66e60d142ab476680fb08df9fae6d931c82cbfd508d5a7555b830a4ef115573061f25dbb76ed8e81d887512d7d03842382eac7f7593dc699a45ec62821197b7097e1b6512b544abb4d3a95356354cad9147d4b45a8d299350fc0ef27d485428a265e8651b2665139c6944a1fa584129eac223c36405f9c1c8f65f2b383a9f966c763f38407054db8e54141104f0a6c18c2e8df94d06394114a08bb8e56c886bd81f9eeae02b67085169657f5427e39b5a9bddce26c288de5cb7d25b8b82366683e981a98f3b2ebee2b01ccec7cb07cff874a43e7ec3c3082aaa79cc56d9bb89884dd1502a18ea882f964ce18218c30c2d87dd371b06c25fac8c736f2b18b60318bce5138d52b0e6294f4d875d0b77f3e7ae763a4a2c6d8ab0cebdcbd19f45f0d6a79d9b54d149a888cb277988924bd339f08814723f675c9c9a0a1b2cb6efd45e64965df8f912384f0092c37415f684915424d082d6926a1d57ae1094784562c37314a29a58c33c6bc24bd8c9c9a691fde4b89852ae54ca7765e73bad57dfe55071f29cae8f17089220c4478c9012ffe0245812b366c163f9bc529cafe604b922083fd81ab23d88d967cc944f7b667aad8d1a96520dab11e7a755f3fbb192c7c3678985139320517ccc822218e7e5266414aab752413789820433ba0d93779e2156aecc9c44fff26cfb7b396a3f4b2ab3ba39d95543804fcaf7ecf9673763ee6cec71c1f1d0a53c381b9933de9234ca855ec888ca42c31fae541620a1ef4125610c271840b96fc3ca102063d582d543d4868e106259050c5112aec88249a0add8f1c24b193851cb060088e102244e1c208452ce14412de70062d4a8ca28ae562076b984212927c0107490cb0022755f0f8d838610854c82f686f415105b5e2e23981147387992a68cb2f0f1248a05af88bbab2a9a5fed978982f55d276022243707eb526d4af3edc4a9fd5f988792476506059962fb53cd68f22110413542bead2405f199709157add2ac9e597070918bcf6cb8384cd7fd5e312eca49dc418638c31c628a58c524a29a5b48952fab2a744762d658cd13776b721158c3c3ad693394619a19c5ca661cdc1d8c1e480d0caa066f33962fce583a442ff640ec3b5a2a83b292d1a8fc81cf6d803b053bf904eceb38774424a702aa444484708219d277d772e473b720a4c04d207724703ee316477d7efd1f7e848a9d5dddd4c5fba19e6cb6eb718618c1d8574a9f31b630e18f1a7af21a874f69248b0e2d7e3cfd6b07ca78d175a8594b409150a41b11efb1795742ae4d3c3a81010148b0a61a1c4d270f83004d331871801bba009f9119406f3904fa7424dda04c4a850107b582c2ad486f5da878348ac893dc441162c01d8434d3a756a5310a3a02ad486454123d6630f35e1860c39c269161ae083459e610c9e1ddef001d84f9dc26480e1e0d9210ba00ac60e533d166da2105f53559dc29cd724bb55318a3aef7a1273c8824d61ce0e91d894f7b426e46c280d6d244b868e1209506503e3a16adbba723fbd2ff0d17b2484e717ab1b7d98ead92737dcaab23874046c63b06dab75676bc078e8ed52f5452108e1bb83f1b08b3b3b83bda1a8102eef6c8d18f20bbd03207ee30abc5f0cc42fc6185704311c49d927a5cb1ea2f7904e9808cca8ed0cae85c4c669b0be48ec21c19cb3989993c7e96757620f49689b61138fd3c72e86bd2cbc55cf20b260878d03e019bb2dd3dddd0290019826ab0a8f66b10a1d425716a7a800e825540616b3558f7a0edadc9235bbf3ed543d97edd1a1f7882db978e30c86eeee4ed918fc24c25851c181b452fa767797a5bbbb5d5e6c757b718179892ca8557477e39075163c9fd94eaf1203468ac7a87567c42c745c166562aaa8f3ce82c65854e871faf43e9a3116988c2bd3817a9629460108d1e91cac0760ab8c454c49001963b1c52a666294c9f849851e6fe4c31ed0888f8698f50f0d39bdeeeec60630837718c069c76f1533bfbe43372720065ba7a6e51bb54e9e6763666619e7b4837585b0ecb23a7a4b2bc4419a0cd29cea009e4a8844004c9eaaa3d75a57fd05197baa10bde2ee18a59cd3b228bd320e43857e39b6d694b1fddb28ebf1c6d65325576213114118d5a4eeea8ea6b456e6ad67db9e6d67b0144fb04ac657f1df05777682681f205605c96172b786e37219ea2a692bb17b4629a9d6191b34b619ce067b31d0f3d84977ecca94d28e1a819eb6f09fc1a8046c986b9a5a32352302000010006315002028100c098563d1682249e31e14800d829c426048200b43410ea328868118863186180208200019049072ac661c00589d10c6425dcdaae708eb1405c47b0e6e7bdcba49362998e128c153347080dcdad3b1bbc98b01e472f7fb7cff342b092cc7939afcfbf77fce3d95de9d8ade42b9000d1e972897a38b7211ae4b405fb7752fe5a610950b6f2da49241c91323a318ca735969e1dbb07618fee9f13934dfa6228f72ffe4c30e2983a2fa9807d8896cdc386f33f3288f459c7c6adeb791bf46394d9d1d0dc1794f29bb42269ff7daa76789460ec1960d0a277f12e503bf9c10e5fb27a77ec779a71d0f20af31254e9473866c8f2fbcb2b843b06cb2ef78f0c93ddcddec957b381e9a410feb1106731968c133f7ee83baa0732770dd3db0f30a721263222a5c21e4f4bef47c15319f80a6f91a1b09903231370484e8f1f70ed05087dd590be5c61f038f58ebc64638046ecc40d356c0a1df4388ab50928eb0600c1e9a37f8e7f04529225fa8554bc485e426630ceaf5185dec4764b6d43712e25eb73e8af46ed35e174ffbf4f3154c484fede0ca1af0bee49023b8e1c7d7252b2d6ba5dc068b0cc747f3095bb4d34846b9e35903970db2b06877a5b536d0ca3f5e45073e40518670980cc1f6bf2697d0d749680e895dffba11fcbf006094e8093b13601d63631bdd4f8b3836900032fb9c6e0be5b15bbcc6f5a8353545e6ed2f4801ce2c69028736140502886796806eb8401e5b463ee2f6f837cb4bfd1f794520c2cedab20fc6285bfd0829364cbef80f475417aa0780c6d0d56a183a7ca72eb0c721818fc1e7cd2c8a29e6c87d1f5c7bbfd9bea0441e3b9640a382a645564445d66f506aa5e0c9a7158ddb70d6cd1ffba420af25524b51e9f24c3358dff5cad6fbe79874c850fcf553aaebb53885cd8a7a5e98b6928ae03003086222683c0283c55eb81f6f2443d9daca3e9cedd31b0cd3681d73219bd4db141f275cd3347ef71a922eb1d5589775073e78d542eb8df149619461e3eb720e1e079837b6a0dabd68c8495770196b122ab458face99a12ba74f7a8fccf4f5710395760d4643d4a17dd3506e946bc00ffb36fde04b1bbb26456312ba80cbb0121c6a9fe000fe82f27a3c36195d2390437ba1e1871bab809be8205cb90f810a42a860154ebf7b63afb57fc074d3b90afdb8aa65515831d114e768083a8c18f7be417d7bcdd1141952962106dc4665a70d62b425ae257e4ecc34540087b20f7905b1b0a0a0e540e2dfed78b76fc71375aa1b5e1847af86a65db7af175d8b39a1772ef2b019f84b9efde3c72c8c386af7140884060cf1dd39b2bea1eae53f04a87fc11e47e2c87d60887751c21b9d3c8deff38262e4c4b0250f64debeba53799bd00b452c56c56b2bfb3e668a89f05b9929552272d247da5f3c4b5d72bec0b154c67fa3bc50eb6220a7da123ed30c2a9c1412fe618c6acf548c549f37ff9556e5edcdf9b932bfa87bdac12e243dc93ac4bc7f0b49da21a9a541f7665b8fb28b6d6688d012f27f3d2eb81fae449a39477ce90a43fa1e62d4ab3e8deaeafc65159fd27deb8b13f7a7d3f9a067d5b422be33d1e46db3c7958480214c29e917804e21f3b70ee4f7169efd341cfbb9baefdbe7c0b343ef964b1afa19d028a3f5bd746c6b0af2ebdf2b1228514ed43636eef572586d170ef8b63d02274c5e63d4a0b60cd037214dea41a7922420d2a76f11e879b879e46ec7faf7e45fe1512cb48f3f28c464bcc9119b5d16aceb8b4288e07312eaeef7e9ebb1ea1658e6d2874d8563f3ea52c10eedf1fcad7a1b314263633d065d09d8f3cc3e5268443a45ceedc49e5f60f0eacbc1b889f02f3fc40cc80e83a6d80e7f6750bab461dd48ee7ddba3efedcb842b3a3d6b11aa37212f4b5f4c0cb7a0eea077a874c334dcaf9036ddf37e78337386d3fac79111176a7d454522fb0be1dfa7c8649d08c9b78f7d50cf3a334c8f2245f378af83cbf53a148edcd4682a654b60182868d22dbab975ab64d76ed58ae9356fef2427c8ebac39c207602d4740aa7f6636198051746d87428492d7a7eccf21d0e3d0ca41810699f35a01cac3c3b6892522f15943a5e83a6eef0e1fba0070e7ab4f826da7b14ea0d3a168492a1ad7674c07cefd2d7a9e0dbb08996fc554d583162c788035ed5f80a37d66696e3bbeaa868009a1d998a961068236639a9b5615da044fff8a54a0dfb14775007b96e4da10c5593eeaf1f02926f451c4880f28c085ec43f1e969f149f22c246c808a5490bde8c26ef1d580c63cb3137c326e4a2b61a52761f7973b2646524cdc714eec8aec5d8c64f15f750963a434217b8983692ec47d54677723ea1448a76324a4dc1ae21d0dc5696341712ba2e1ba0a10b30280598937a3165730fe47e22655df44978cfea94d09f295898ca044b4aa58ba9a7937bbef49f5da51beddfdc61225bc8d65ae2b18d3047290379959059745916fdf4dbd1be612c1d2486dd04d51132e69ca524b71afc4929f3fb90922dc483f531dedc9c283df66899c8a16ce8f2173ec50789bb02041cad1a28f085d848bbaac5c36db3957f04556eec42a2b4704974231c602d6aa3abae1b116d6b0ee5f9b9065050d4ed109e292b48c7de9dd91b34127f75dac558d861a4b39ec2193eb384e8ce1f55feca528b344c0584d561723441362826c4c7f66cbff9af811c6cc38764bba038371ec8efbf831302683a6b8d79bfd6e6d7432369865abfe7a5a058ed302e0cbfd482381a48d7fa4f77bdeada68b806511a02e21cbc204939fd8a097103d5f081b907d36a7394f1d71e2ff157c3a2359691fda8b7506d38bc480e0141652a05e76f32b2e2d028bdaff3ece47139312229b01d3c49669eead12f12889d612dbf246d3d6c0bc718131dcf6478b499fa4741e603646ef829d2132a4827a6eee5986a4cb148ebb91b116697c286d48896e6d1872c951f40182586aaca0647c750b9f46fb7d50589f41a752e024ed91c257e76fbf1addb93adb0aacab8ee7d9ebd708890c81c27144a0cd627671c384b9dddbfb40315bd7e284eabf1303fa5e38200383bea3f741a9cd24c3b3ff56ce749b085f564c4eeb219d9c02af8552e12ca6692112399a711bd128a578c03600a5a1905ee90472eaa3f872c204a789d6102782b162453729867e83834d9aa7285e13ee4229b2a46d524732d7534a875453ab4d52086f7aa7d1f71dec262a6689bfdee7092e51a6cb229227e1f25b4a749650f23d53da32fbedee972dbe23d59834a9a6f6588aeed1e0852d8c382bd9ab7bd7a32f935be46e449a3e8a906e870fd4684e80e2cb5c43e077cd99b7c8efd6f0015903df19a59633045354f0d7a812844c510e5702598bb4bb3db0997a664ea81c869add1ff3cf6dd4b7f2090a09609a12f20575540b6d3c8fb416644aede814ea828cf7828113b0eedd3a6c83a4faaa90224ddf57e6677556090d65e1359bb7fac34049ce22b9552c6696e80729142236cf44ed0d4bd4de8a3cdae3452a87292dc20eefdae09a973d4885782e4910f4272074f9010c912b1f3a4df21d6ab84b218f9e9f83a291652ad9801123451e868d28605de745699926171fb21498efc894a8cb622923080b66980bc14d5ea7b7c05f0788f89ce5338f64a54e8a96b806837d785d7b2aef6905e092ea0e5ee6cd43396a84625b45faad3640cda693a11a7f86eaad3d57633d28653c6928f678944132e72599da4d28b29561641fbdac86d1c4b4e3974e8e191b9d8950ae2ffb6947cb3ad248bc1a15270cbfea05d2ee35d9c6bb561a233ac74e512a9926bacd35bde6947616a4dcb3c4468e24fd014d544a0b37e16e03c619c080a331b5f4f4bd40e54f0862c1aa39178c46d5528e548b6d53e691ea203d682da3067cc211675f41668adaf356e3e35cd99b9d079a37f14791cc8b79fa97dd3d9e8b2f6003e33e8f56a55ec2101f2aa1114d8f3db8b8225a006a321eb20813e04823f563a2d25ccc9455ee888824d3960a1253907f4a0b59d76b2d6de728e48b6118f1b8bc7b559980223b97a8838cf45ac5e4569967f09801d640a9e32add4c55cb1dea80b2d3145b2d19606728832aa36447c097a040ec181de1d8588eb7a3d9658eb72c391798e28320658417531fe1d6c1c46ca9867bdec4a08f7d7122bf0a7807d812ac7fbff037d2feffffa4e9e356832a3ecf3d259f0c39e5ba35527ca329071261b2e197a4de28a78c8aba2e3cdfc52a1ad942f21f49b606dece5095a9d925c13c8e6b24ab7725192ded1d20ecb5534ccb43513e0a566fbed5972ed1ddd525242e5276f231aeef2a0140d2e2c0389d543ee1b0b2b20c615ebdd093c67fbd78e8e35ef60723e8a557d524cda7f5bd16b5db749da40d13f8fcb3403049f051a43de5e49677a4f4e14fdaf28baa75a099d916ffed826bdb73c4f006634cea89b81fd36c0841187c4aaff9e268fc5fae6172e211d6021b79d768f42858f896c1938b02e3aee47bd4e7a62b135f286875f5917cd39c75423a299049e10a559b8668831de119d2806b4e807b6abfec8ebffad10f7a05037e87c50019deb66fe8455902760b458f7f8e3eb9526eef5deee3b0b432f1318bb33fd67415d759477e681476a00608bc56b35b7c6c53c7d55b5d26e21343bb5f973c9ce56da638f5847b9194cf4f66a1652b1881c530f9187ef05e57a055033a78c3e37c70b0b6b9688545c30d101392daebb82803cce91a4963113ad1711fb164397070d5428cb84050973e584cb4148b9d6b3d8b0de2b64bbb75a23517895a2c155c8b83fd363befc1a81ba4e367e7ed8d16fce8af790c74f106ffa6fefd240e60a19adf9da9949a1f94da0cf103543d3216d5b77bcb9ce8062d114a61736719f21f8ff2f5d8900f02e9f60e2b1cf6cf996a36e095ca71911b6773756d79979f4e72d3db142fd5a911036ec5c8ee119dc4cbd49a6a4234d55fb7c80a34c3f40fe683f2609bb4eb045ebafe7e15120918f147fe9c30a8fc1f4afae082ef95a2dd4c52d4bedf85030aa2068e252063edb3fb3bd8c2fb6e8f16dea6360847bfb36e32fcdc92386961b616ec42af4b2a581a9809741fd16cad03dbd6a67a6ab419824799f4ad982bf999f68f287395e9aaf61d0a584dccd1f1fca7dc2199f9445e31219adcf66ee6a0cb19e83a0d21dff782eb2acb29996d7db8ebdc24dba5b273f2a389658a03a1a46f1e2abcc10335d1bbea0fc28fccbcb52e155199b4f47e0aeaa19166c15893d98eab5403a4f164db2073079f6f427a5cc5f0ece0a12fdaa18b1bef738d2d418363a0efd2aeacb767a4a6c78a1720dc8606ed2773f7810c8bd13fff0d777cc134aa405fff1fb7f8321bb276876fdbc1247c336e95ff67ddf542d6ac0539e6e010325bf42f084d45abcc411ebb353c61e2f275cb685e793cefe2b6034b0239e4f1af02eaf8974a15bd1e2abd87582a1e4ea1021f2ec52d079a0712e5a0d970d7b817586d747ff10e71c8ecdb10a553c08f6de9b078dff8d3db5b1186c638b2e850d29785a34519f8805db246abfb21fa8e99e4f2eb58954bb6cf0a7324513ba2f0c1702da68cfb0d6273b17034f26ee3cc75bc64df9179fddae09200af61401c7b22b7ab0d3ff17147d3d52d0c8b095647252919a36c76f180ca42f96712a4786090ef2d69d27e9842025794596130ac4f195006b2f679211a17a4761798698ccbd278363c88594cbbbbd0126b7570640fe9826ba3a57b27b692404fcd9750666e9be2eaa00b4119588bbadf48997cfe4f9820ef301d5b5cf240b2f4171250a3a7b6315adb436f50b555fa970288647be361256728ae7789f0c58da1dcb3c49abb21828962f93845c56738a9af27bec54f2c66ec085948f710a33aa8cf2e3a7cf80432ae40b22df1cef484e44ffebd328cbe4436198778146cf2cf509f63e4d9f5927eb3a82b23af32a3faa2143ede000b6740df600f7a81d4e80ec1f828248494dc46692974d9f26a4aaa48af45f1997b520b3be484093c4d99d2a5be764c1a2a5ab1defb5f1d2ea1631baf99e83ea87a235910647b100048e35362840f5611680ba0db09b6e454cc9a9eeda8674f57364fd30916bc25ae9d5d0c0e02f39f804e10ee739aede8d8ccf96cf2e66fda20c83634d54df827db8c7dd846ae3c5ba386dfaa82487dca4189dac645d51392865ed8a0270624bac49acb59f47e53dde270b5be93108c5591e99484800322af2763b4c6909a4e76a774f2adf019515602d973f96f8572be340331f4db3eacf161f9d67ef8a03746e480ac0dcab8808a03a1d275534f862a25e098343e15e000639661e75ad73fd5283e2a376b6bde380d7132239cba3a464c7242e431a4413000b4fb73f496296eaa560e4f86807c4f7857ac8d7291dbc43f979d6c89b5e742b657067ed79e608274331336b5a471043577f9e875e20e2455a6f51307f91867cfbcdf411a3911459246211de0748ee1f5b007a7210573b031879dee1f86a3e489d0718769cc2210f3209eaa07de9657d678ab4cc2522506b32ed541d7dd250430d164825a888098d0d2fbe84bf5888475f3ec1987100c0531f15c06511c3c4fff2eb9ba02c2ef46c7595aab56ac514c67ccd7f5f6bb5e21b3f3e5046728f534791d2e818f83e1a693998265ef838097e9c4c005164ff7ef7dec3b986de31bc6258f6d0765301224077f9ec78c8b2df3136b8db103dadd1d641d7896e7635d2bb3f532cb7c92a5e62de6dd3abfdc8f869faa9980ac936e0e48c5c11ae2009cc6d374d30dcddc9a69021409b0810564fc8143a84e401a9a6730923acc79621ca02bf5d081d46c939961daea9b7c7a7a63e114fc33800b717446aaff0f0493a503aee4f297593fd6abe1396c62e41892b837087ad0b348d743150bbf0f0f0dc6f579f4b3fe0f7e7863dd4aea454a13b61c2e04ef49ba9185cc4807053aabaf6d7c45897853a428b681b0820f4066071bdfc7f6cbe2ea983a9818d541738759f192d501f79a7ed9856c8a28dbde1f856cfb0b4a4a9944380828304c5d27eaed24f6679c25a203edcd6760710ac0fa02c681c3817e16653fc381008dcdd577ea15c281480c9f60cb3214e39e62a8bfca0a044438c14c948842f63d7d64e3fb3d6080dae70612dec5810510209f3a1ec9371b05950975a6db9d8dba70cd1a027f7347273e3dfb1c0c9b3d90e1c2056f9b256e1906892d866d91c0318f75bc7b26efaa614284ddd7ec18e6a551d7bee5ca58d05c5b3c6386d618bc06900f50c8718a847a1e46aac4820324e29d2a4ebd9b4128ca972cd4da577124155815e304d2c1f64150a0f0ee307a2570726b6c21835fd23daaa0c82940b534228fab46305a95875c7f7239e86d8c2fc32317c10d7b04e4c445f9b57bdd17bdbea43766315e36fd7b6c06d9b9f89720c5755018a937b5a113e807cdcedc8ee7341aff151dafd07b5186c2dd5bcf7f2e03df56acd70aec64dea5b3cea377fd1cf77e49387dba457a5c51b9515d8d1f8ec5b4aba6aef6124070b5dc03b57b3bb577c3c918c035b0f90836ec12efa6476561f719b67686d8cdb93f2666b159864b70538274a1a1014353274d7e1a1d1a98942618ec8903a510a4d7d8a72f50387a120ee00052a559202cc6c28679c91e274ce3f20d3fc2f901f69133003f6739ced6c400ca60ff38d9d9469f5b584105e6d6a52cf698cc774eaa68147ee5261fd64403607a3c55b752f3a35ee74b1654ba2bd439262e33a7441190d592f7ccdba2996a2d6a10af35ec1cfb09313a7987490912dfc4f21c0bda556ea291e4634481ec6eacb9ec95cc36ff013fa2158e479c5dec99789ed69b3741c6af3c71785df5cf26912a2fbf6b43cd5edc892fd56304e512655228e2f7297d0990930d73b82f01c638f10ea48d088d08e2a11e6df19c7f5744158440eaa0efbd7c03d3e3090340207df45b6123b07b090b48f77956a4656694528981aeac8ad9996c8cfd174db4ffda1a7620d254d78f1d96a8736494fbc59dd6022d192cfcdbaadda3ba084d79618f5d09ff72e1931b7ffbfe810a2121395f30a19217a91f92d238c2c40c907f2e858b260a4588a4fa4bcf85d66385a7ee40e0cc416cdee43201056951aedc5f30264124c4ff6e552b8880df495ed530e1a6640d8fcc4d5aedb06b6a1d48ac4541ce2f94fd368d27d8db5df66a62487b75fc18e22071ed9338fcfe26be11ded7f21db94a8205a184cbef9edf3d4606a90962e1d4962b4fb39d7024efbf9eaa171c5c682cde7cef7abcb94777d4249da03c76df5f0465ab108b758c3a16acb42ed887e90580ba669d4a91176aa4905a20e6b810d98745f58816bc32e973628ed4a09e55de22200e9aec10bf3d894a969087635dd386463c25f32d775241e11fec1caa9281a6b752c013e33260ddaf2d5c0ec89a8c90853ae08cdd43062301446c52dfbcf2b87a933606d8f7988a60a4ed779508c18d5c3cc8d3bfa834ba4406e84d27fb5bd11587cc064d314b6bfa8a3d6ba8f336a68550551ee6ec5a9f431fc2b1df24bf7fc1a41299c670134f8afca8e8780e65f42fb03c32c7006fba447a9f8b700a04d7705e0180445a8528880ea374371203ee48a209ced2b491941ac63a78c460e57285fcada81cab8f6462b932b1d4d557a84e11236239ae23059e228a4310eb76a4831b58d645219847d173a2bd2e845eda3a730223327da84eef255a4c09523e67883b3ed83b5f08fd51a18e48cf41fccbb4b0286a305d7e56281056ee251a4efb412acd466bae291a7da44cc3e12f6e52b89b0722def896e38ba7bcf33eafea30cadfff658bd9c58e271b92bc6cc53e67589cbd8001a118288bea5a5137749776c52b439a39793d1443f8ca44bfd2e5afa4fe69de4362991e67a2c31283b9854c89c13c1deb549f0c3e3569a2b550ca049885b6916cc3f450fcf984f5f13f31167da9ff52882f5fbe1e4d8a98f6175546f9407ef54e30810bba045feb645c52a0f9709df4476c3f0189c0b48eddffe0c69baa31ddb72b84c0c27e0f70228633d57384751bad8d39e60f81cd2ea1a0c05b60196c630e8687c87a5412e860a2750e630245d6d075884ff303aacd4c9fceb00936a94e6853840112f885cea89c82a0c4ac31bc499217e8db592634b04740dff15e53410448575e2812ba179f7c4f3a43088e221c2381b05dc2ab84d6aac56ecfe181a4bca9b833a1eeed82218863da583474f928a7e1b7b6c68350f86b81ddbdcca2ede75c8bdc666270509a645246e904540c17416f8536fbb31bb2c08f5ea5879cb95f3b0be9bf107654158c9b96312c69a99f3ac256f184534e4e888c5ce7ac7f302d9480c71529de1f7835510ae317a8539e41b128e5bf193af84ce6a9fba92a54d27dd8fe985cd7588ac40c241f73f8aa4aaa72baded7d357c03e975df47c72a3cb5baa94156c62e97a42380a8393eb1f9a9af050221a95b8ea860e632f52714c9fec96b9d2b298f6987ae2e96bf684423f6bee8482c07e7a6d91b5d71c9813b2b767c4c81c2c52dabcc5b02df0476c3bf6ed154c6cd4199b444f8c0d8d0e58152c15c639d2e58ceacc2ff966e9ed1e47fbc13e952ef9b2b9037eccb71bf24b943d7bf7ba301a0e7278580278a9abef82eb3d7a0933ca0f160263a7e7f956cf53861721dbb91ee9806294df63c2cf43eee761dd86ba83410aaadf47364cc00698f31c45fe070475aa18b5abc816a7702f7ce13ee0234b6cf686d356c4c8ccec8cbdfabe12cf1607c1635f17e54525286d24ca4709b375222b0c318340c69ae64a3d2e62f8fe995ff475c80d9a4ead8d5740aef6c7eaa18f1169471e3e0e27ec242dbd640c646ab1d5bb414e73bdbb9501ced0e623d8831de1c8d03c2a8d8fefa0d3077381e69c5994053ba79a07c9b0646277e02849c2a485797e5f459ceca82b0a5c1ba42fd16e150fd884aa20299e594a5310f79a22cec4117b3ff83801ea29e6e619d33b1dfe8477f4cf7126af7e6cbbdebd13aff0804fde20edfd131301e280634519397c4fc617033664e881aedb8af36cb786dcc017fcc25521481057a97981efd13f9080023e9696f1bc3837067ca8efe96ccbc1b7009ffb1588647616bdbf2e15a845ba0148ce849f04b75d90598cb5b23d95b3c2a8b5998b1b3fb461247c64272f2cb11d16ab22d28d3bbe9b9993a7a132ce4556cd64c85faa79803bdb3c824ca2fd04cd0c697d0701adaf76ad62de7860fff4a9ec8c64d74378aee215c649c6a27980c4eddbf5a2088a063bb4ad32aa4945d5489760eb60170327166ae455b0e44503fa91a45c96b21b70f2deb64f68dcb2043bfa124f96dd049de4e76b6d640483b4db48dabd7d5d97937702238917488cc5948c55d31c8b3923ab364a76a353560db0ec362e5b5ec70c2b2015fa82a2abd5d579dc397abef93c4356e76102ecc4d45d750bcc6b35dfdd8f320dadfe839a74e0a78931076b67a13f0512958c15fc01c519d47318266743335f7e0b63a14b136d73f156ec6bfb840778066338e1542e098f8e1aa5ddd29fbe2b80165d1bf73f7667c5a2f3cc2254c20267dfe2fcd12c7d560bd4aa3d67d455db3402fc3a966a7138adeb39b32c1dfa0c4a1edd8a2fe4a15063a841ca07034c0799208a03a17ff0349a76817263a2e6a220a08f2a04545b279cd070348202c78d4e49f62c0dc689187ac5cebe4279faa59c0fcb914fe7c084ad79d48793beab7ef6e5cb3a53afba0ad211518da4bfe64861c2b6929ac3f3c528b6756c9bba4ccfae81f5c8e2b1f7f1c78e0d05a415f1aa90a28032a5b9fc5420854555420b2c86198e52d8e41f32ac9a08c98e4fe450847712831c852e3ba7b5134a180c88810e8c2ad4aff1a9e0c8c54e7d8c70207417d4e514d80aad13b3c5f1c6c590499d0b6fc3ff42396b178a2bafdc5dd951dd76c08997397cba19e49c2e1ee42cffd0e22cef1420755d23ee04c77a42604b6d4623c4e5ff66b11abd7c046600e7f6d488d4933b2bf65104e53062893965b31a656c9b965ec67776c17308460b2a52807372627ac5337da2da2e3b066850ea9f2d3343b9bd983a39723c9fd3f67810a02eb1c0e6a305daf4f2bc879be130053823a14dc1aa94c3f1fd0c9693470c7740219b8aada8c783f31d5ca6cf00e688426fd35decb6d5748ddce767c4bf41b5556efb4998741238cfe0bc2e2073843909a59b7a1acc15c8b43b602db055131425407190a7e90f6360b5267c74bb7529f4402756b468f371a6608d67c62b8c2d178728af5f1660acacfa84f5da76738c07677a43089b825d891d40fdba668f118db59aab958413745ff29030fd772e75dd7224b66021bb441062d471bab6a4767a72125237b2a8e448db3ed4aa64c1a9900adc99cf3657d98e3ca2350da6501053cf9787d23b521f0e886724c654944cbdc3b18f7fe088b53b1be2b69402dbf677d99482e005f807dc185bcfc25240eb53aabdfe2d7979ffe04c6b836d80cc9b26f35f6b5c6837132d8a4e610158c4218a3553c96872b45ece094a1f5c030a63db3eac41e0b200e122c6c920aadd462640b70ae5c0ade2123bf39b86dcab9a7d53487ee0473b12fe6667063018c567aedb24f335f2d92eb48c46eea2b50c14be236f5ab6c26c135b149835a9a53e5d9e4075d739a6edbb33e30d69cb16dc2dffa89eaebc06913025446739e0636f790a2a737cf142d42aa05c4a30184ede4f017097c2f0dd67e89983fee99c9d945b9dce5c9e196f77c9367f7e80015f7c2e204d7c85f7ba113816b1e06d9f60b178e38e68242c90b90f1f1bc4d6582b51e8c52ceb24993f8b931a523c754f1c4a305202814e1ef2c2b70a2ffe7754bc5d0aec25680df0efb8e3358cab12ee10a38da67f0e7eebcfb4dab267622506bdaaa235002d31fc670a60b2c2bfaa2a659e1cf19c201914080efc8e4df95f6bf46155d2fd1cf29aba20f000261b68bcb7760560faf0a6c58624e5e439b09bb2597fec372c32d94d41b9b7143895f2f523b5bc4dcdbdb163ad3eabd86d82abb6fbb5c9a63627d60548526baa24ac1f25499e00d44181b78b763930bc23776842e86f6d3973d35f44ffe469f916fadcd0f93324b7156ec6d7aa8a7df3c623224e84eb9bdbb9ddae15ce02c15440698a3dbe88a6e23569093d8e91369ee054cb5b2f4848fba616a6bad8504595634e03fa28cf9d2ab321037f112f07927beac82e32b0346a57660d6287b390f813f13a94728991f8991fc7289d93664786fe22de32a820cd5f1f936cd7144730442c9198555eb39a5fd3566c5e2c25963b41b1ec17a1c8aa22e93b0b9118fc1c053cfc8fa3083307532ad9d153a9708d01cd0c7aa705fb9002e73c01ed1a4d80c65f2db105bd1d05967d0c7e8114f2382f58f960ece09b7990d9800bbf390f1afaa5c93b61af69e72b51aa39d943c8f3aa51adc4cf1f440153099a1fa8a2061649332e5bca385294cc2a18eadbf54b75a92df92cb68b1ae420810c478f2558aee4c36b9f536429a3e3cebd8c45d4cc05278d2dd86b68a9bb92cd295b1cb6ac2871482f1b9161173591708dc145e6e9714ce3f301e489462add1023fdd4ba567046b0473f87612bb0450ba8c3b47be1d0decedf52d0258e659c605efc931ec667bc41ba5a814e72c4f710c19ada2afe7c561c925392c123ebdfccc2942f2b4677a478406a715cf80abc8d06a42b9d6a5b3982caf4ff85dae66dfd284c39c3451c1ca97276e37fb834c609da5a46ade81d5e9b24ea28c72faef52042a30849d702770b169cedb34917276f9d41b467370b4c6bcbb4db304fed908abab54becd4e31ecafaa575199134d2c92ea1ef11dd49c8940da0057e861f343133811d8ab8245e19bb53ae66a5cef94fbabb3f3cf7d4c0b6be74518c56a35f34f571a94e7ca6e3727c57f5a22375ca645050aff94df885fbedc8d95c6defb205f33cee4ea0ac1ca8084e60bab3992d5045da0a251d1c20b70b67fedd40170e5bad480e7761457915a50e98cfd0d4a706860abffed3c50d9d41e8be72e8eb1077d00f81075e84b652592c07cbb68e45d79d0a4b82691cde467a62017cb688e71686f763e9a528da2783e63413d8f2b3ce27ee35ae612ac54e13cb8c0601945feb6b708f2cfeb26a8294b4ea93aa2655548860485ac37fa18b676830b135c8dde8f0a4960e759f213e86a7c14faee0855f85b242456db0c9a622444ff82ef9f0416b97950a7050a56678d2a72e4582d157df1fc9c5830f50018281fc696d30568b66c09700a60613ea63c8a9ef36e2b8748aff1b1dc5f4a09d72e090a02abc4ddff588b6ecc122f5a94bf32ace89235f122223ab35bf5ced67374166ce65aac03bfc4c7ebc2857892656fdc9af0ec376dea178fef06f1fd85973540ddf300f17ac4773d2ef009aa7b609aff318c061ed267ba61b736f0aab6afbab22ce343b94a20979de792c83bd6f2f785b8679684a8ef7fa18f4df7f47f5c61e0c2ef0fff59274f7a8f1117df5152ac361c824cca863696eab759265629b31a367e82335a6303b38856ede0b7fa9ac66f06b0823a46268b742366c146bda9859461f841cdbb00273a343a579fdbcc9c261ec42e4c04229528a8c7cdb33f05b1ad98dc98a24244de257319608872ce3f1eca0d731019c25556262e80bc1abeac8f4d54641d3794c6922740e04d038f196da8d8e1585083eece42581f3055ed6e1355fc88eeb4ab13db106eb29b82ff50e51f55af017a2c06302cf205aa6fd46cd228e4c4d3798fd3317ab01ddf9ed45e498438cfa2c17a66ddafd07cedb545c9dc4e5314c83a3ad89e4a3d54e6d86b468a69368bb3b92accb50e4daf76115d8b47d203512041fbc73ff92521058e6c79bffe09d48de104cf19d952d446136a6670005804b0261a5e757398c30dd376a1cecb000756547218524c3202f456c0cb07c4672169fdb2962600e2e548181e4c99fecdad3414624d2e97b5394584074dccb0c24cff79333d532a890df9fe7a56054d17c3d3f7781918479fa74ee554611946f80aaa3e983e784021034970c98ea0609d96b6335deb35e3372499e9e9ca98851d2bcfa38ef2583c8f2f4ed99ea0c2dc9abd733ad30b898575ee7b4ca20f13c3f3857953254bb588a9fb830179f4a067dfafbc4bcb05a23112cde5e122f6c486ed6843ab7034411b8883ab0a60bbf99ffad39349812519bdf832179a9c8ce89c07b5c81903c2adb18b29b5b52e6eed4ab69ce95e81e8ae2b625c8ea5d81c65c45dabdcd1b58e8b58a6fa92dad5be4067759fef6fd1ca526b45864b5674df153f421e521f6d3fb7d90cc7b4672f5639d89d0f212b16525a2d54934cb91682aea7d040ed988bb74116bf6ff1321621edcbb699c790879b710e2e220cc3f65ff2155f6a124fcc6f720f69907735dc935c39cc0ae16a1627b659649c0127002f968ae5f087583e7b330b321da80e0ffec64dd55213db3d11c3e2d9ffd063f0547cb1e6c4e203c0b2d7a9c3bf7ffdced007e90ed7beffb8379d8b92a09767884cd3307e0bca0b13b21809fd328a0ad7081e9cf0951fa73ef3e8b9ea7c6845b1632bb6fb80906fe4488af4cdb276e26d71a1cbfabb74f9f27582a12cc92148f2f5c485dacdf5e5cd1bcd57ebac32f948963487b77502c9de0b9bd3204925b3f64f5081c6a1929b11252589c136affc08517a3d3a1eeecc68d7ee04a7abbdbcadbd7f11de23808ac609f4d03531489c0a31f7ebf66e8b95c3f254ac1a3a842ad28c8dec6a932d3a64994e449b2e5ef69f3acdb45d9a3436a8bcf9000a5150363b7cdd4eb7602c6fbc3a0fe8a2af74f585545a32c550e2c19ae97e63e6849fe24a182895cbdfa41700005a1bbc0428956b48f1035aefa0a82e0963e4910dcdaa7c40247fc9250e28aaf262a8ef0134d6ca6b430207b50b33a086d8a068cd3608968d0dec514734cf73698c66054e1c20ea112e054fb058359823ad4036bdd0d3aa088bb13af39e15c8d28680829d9c59cc841670be00932401da3e496696ebbab461443397e03d0fc0f5d2bbab05ff9fb83ccd1434f3a67fef41d496814094e722feaf36efb3beb189687f6b91c3bf9a70d28f4f34cdd687dca162055f5cab5eb488222dd9b034f7747da257d7b998d223186fcdce4c823422eac438bd42aab1f55ce7b3968871737e58e8848f3c64e66209a7ccddf7d4a001b1c97b46e26ea614bd9c75bd6d34fabd35f1a3cb8f99ab642949bbe61ad68849a9eb987ea8c3431e857c4b348d2229f1b8d9ccce14b9933bd605a6d2ba762b9046468da992b59348670b334db1d92a654647b2bd9cef4997733dd4cdb0c370caa691f708a31915c7c6acce77698a47f91f5c61cd92243012859eb622141621e30666738dbb9897089fef9644a3801ffd30f7e4cf19840d594a3b6c0148882e8df86591c43470e87355abbc98d72068e11aaeca9ebf67806b126d28eacaba012ff632f9e362eb5a605f0777c331a4297f4bd8e8d96339fa7dfc00e18234b4b41feddd510f07ce787b9982e180cc9e42a129632625092640ce4afa09b65fc88c31241d55b93404772118a4a2462bd818d0cd181d043ae7044d893b480653515aa5ca89a4220893f65d621241db1a0c45ceced8021044ba73850696905216beb7d6f67961f981756c06e9c600fc765fb6cc95d51494449d249d92830d806e03ebd97d580bb189a108accbbb88b4cf579f4c4c5d47f4203c3ee97f0a33995fa2345999b5d47d7948bb8ff1903de90e34b914b60c2e4685c0c8a027756d5d01fde0b4d4bc384ca9e78a8c22eb1450f782d75cbe1feee32cc84ecb87288582f49f94d8107e88fcf692a1d42f170ad5d40a904d9cd4e51d79523fbe7470dccf5ded78012dc0f7d4fb3f8b3184095c79b67205a6a7edfad1aa6101838562185472039daf363c60c4e6aeaaa7eab0ce8e8364b79ec4da507da1eeb311a9fb8e3d27da4d59437386285393f3882d9d61244fda16bf593cb6f30dd5b7f88112b2f8c1d3ce61c88eb3b4ded8071f2a694e55213041214f3e1f004f670f89c75e2d9a5276db1ebbae687e2f278030ff963948b8514e7e7bf8281f8c9f1bd2af96f3c3ee7e493f4fb06e5add59dad0982b1de67cde647afab6f92133d9948954ed862b1b03f9f2b8a709b363163ccb6f5e0755dd58e7f151ced2064df7856cafc8b4f983dc2a64ca662e05823521787266d2b1e8ee1ce272e9e19100b889bbc2db7cd2c179c0be5ed38e239c2a56ace94df2a093969d7666e4c99e658fc83b215f8c940d762a46ef9ddd19f5bc125c016d151226b6dfd049d4efb820b6ee13a5c9f037716da49c00b1fa1b2e5e88c3b5a0021a492b8f0065abfe31c25368bd1ba143aa21b2b410284c7bb31e2b3ebe773b422de6b4b89b9868b870bb228e49b4ddd886d1ff4102916bdcb636abdbd0669ae910b341f9f64c22305e0a7ecdacc7d12747d9201f58c1a224717b0b6d19deff943de539a42397fd6688de158c5c2633249700500714d43311a104f1ffccdf64dad40a2647c02a25d45950bbf863ccb6a10c0865dc21405a562933e4c88e4e99827c2222c5f573634d30c86c30737979b303f2efd3b48529dd2c912a287da614be92343a724e33ef3d65be7f03f4b95e9b3ed70c2802bb9444109a8d11971bf1fe020098da5e75012b47fa2eb08b52134cebd692f12db817b1120d10c4671105f42499c33c3801172151e1e9abe615ff765c123959de3aa9ea86945911f440e5ef935ef142de6db5c917b1a1c1d6d9619790a099fade274d7841d6700897a0484083f7d1c0fa480ddbcdc3bcae34b528a62965b7d78cbc206459e90d8914194535bcabc15f0f6702542522ab0066c580967fc2ac59bb33ea52ddab545cbd32ac1ffcc5890a1ab0cddd023de638ed61c5006a7d9777ac5f7917a0940b84059d072018172589db7f105096f4597ccdeaea66c267c583d28ed7d1fb21895f18a49c508c8de1e70695d80762ec20b2845ee494a7fcf0ca67459b86f076ae90194344dc966c92b990a2d72c4fbc2a33c4a619a2f9259a726814f19e0f869b5b4f302e5d3548579e9d002d172af5f067d65652c704d86336484ee3a2f9eafe9f53e7bce998824c7a68de40367f35dae88a9a937aedc99ca9d8c01aaf4a440145f9544ffa0a313cfc89144d179ce7e6ba5321c9b190833649fdb8f911338a03a90a2a45035d4c813e2ce0633393b5403daada318e374428284c39437ab48473e273bfdc0b1e11900923498c94737ba3c8a560cc9e9d2cb8ca883ef5e483f6a8801feeec56ee69de26f080cc6630e4d6570661bfc566e05df0ee211331919e63a3fbe24c960476128dd5906dbf5eed1d6e6ee24060c2fadcd3396c45bcfabb2659d45adb4e5a90a8585ba40a38963a0477a52a33b0fc74a54a8aa30d3778b491111fcf35da47d36e6feaaf8f1906d3c4a9fceb5195d9569d19057108aadcdd536a8c3bd9e38b2d58b187f2487fe4a4ee7fa86b8a3c6582c1a27ffa750cea72907d2d16c3c89ca4911454683d76c9166ec5783624163166f84a37a951ed3c8a5fc16c3db888dc497d2799709869fb3b37f22fffb2766966c86934f3e14185003748528ec3a02f850bd3eb34c2ed574694e97d7bc248917a943840be3d7952349e18b739e1bf7c930f8ce94f78e03035846c8671dbe3434e935728146512a4dbf339bf777325226db55245c309b6b9668b987760f5b7d67aefe8663c18a912961c489f3569d8622bdbacc4324e96eeece3ac16f951e408a94f4ac44e1f322b807f1a2bc3e34d8aaa3892e84ddd1411c1131186274a30fefc59f79d0c0930e2388d61d1d525693b49fd4171ae83d6317b6d45410d909af32d4abf8b07b44b892bfc7862b9cf2b9519fcdfcbc491d1fecea42ee0827161d46adc710aa471196042902736826ccc1ce61e98d9074ae143cc40126fae351b8cd0fec52020d157196c6064d8b0d307a4100a2fcec0eeaa1d16b30d23536d1551274d8886e2ddea0e37eefb6c5e1d707b2eadcabb37ad8bf310e6d61879a4c90a4e1a12b8d578d1f3e8ee4d69a1459a2c27e995929731bacba2f2f9bf8b6387ca1b34c781602f5953bc9fc46370fd0b1de75e3e13b7b361aa78680d40029660b31bae939cdda22e520b384d82a38593b98588be28d3cff88e9aaab397e28f56571a636a9f74b1b087c8c50e5e39c29c7168da200fd323b99fde9f326f5c9494e6b586478d9a25b20922ba06a456d4761701d5539621a0f93e13873834edb48558b54c539f68eebcf5c75b3f1abd82687e31b5445ea7b463fa3fb1396f0e24bc03d4f858e44de19e8f8403e90c0921f085e85be2df1c2a6a9080e0ad629f742b4222c01aeb8c82e359b51d925a6ca849c7e0f93c9bda9f4f6e64c7ecfce9fdc330d65ed0404e17c02d6e69c4585277c53dbbd18ca15de3e49f00e59350f0d8c3264034da0c91db77499d3eba79c937c3a080f464fa55e1b6d936e494e9a207a6a89456eaac874ea869ae74592c0c22196792d2db3bdd5a505d569dfe089bd0853ab6932dd234f37eaa6de9a3751dda385cc73aa000fc837751ccb529fe85140c8208e9f0ee5432f527182d5abdefb9c69c9fba3a7fdd855419e90ffaa09935c94d86a7099999a0138268271cc1370364f101ecc694da950ee0aee6eb114b98df8c699ddcf87834cf1e0f8d9611e17e8d530add017f435030deda0b2c43633bcd0ec07125280c0d866bb6f021b6cf0513f5dae948320b6919e19fa13ad25d5012c92f23cbf0aa695523329cc1827da676a88c6fa82c5f56919958bc46f5094ac233887940ce6cf89cc6857de0cf5663535a7cb820cb933900021a7eeddb946bd76c715cb669ae2e85796cde97287db0406a829de77ef10dbb102cc23107b6e278726f45d7a3f1db15489caa2849e1def2437a23be3b7a9864a871fe5a4bd08c36e5932b9f1ba008982edd40c6718a63c0c52706d78aad8633830ded6d9d52aca08e397e1f875a1e1c211fc224644d21910724d3e4621b6f8e0c4a6c6a48381d00eaf29d15bd404b6d76303c4642a7455dab4bc9062597004e3cfa31e46f9872cff010ef0e105362b19d9967db73ace1557794fa5b1900aff228073a748358b43686ef530c8af87a12d9d8b689752e5485b82b05bd19e283a6de7b96186af3ac26c6f66f932b8707da2e5fe902e074471a9b146a6e426b0ad0156f22705d65804a792f737a3f603f0de0bfcac0d226caebc3edf735ca85466fbf6f6345893f0892c22e282b74880469fd2a1942b99b1319e2aeb878b6be94f03e9092f2174c008881e4542c99182147095a6e3f916b0bccf80825039daab99600088023ab62f43db060f63b3cff7ba16a06a6dd1d9c7372494dd24037368c1cd39506ec69fb552d95a4b804a85cbcc140c6e5dcc7e06b13b2def1dff80fc9db841268b6392a45fd48ed3ca3151e6900ca38e89f281c0e80ac30daff0c365828d29c11fb8bed93f169d3264a3616bafdea69d61cb9e94e6406d90551a102ce694a91b0f5016793b7c623a4fab7ccd2eafe66be8dc8a98d6610edf0da43efcb2511a912628f2700a9dd6a23170607f4cf1a7913d38948e4aec1b714f71505a7fedcf51b4cae35451a6278f5694350761dcca33c538b71b9c5b6d12101896e79dabfdd59c0e70236eb7ef39090e083c17f2098661b0564edab274af865dc6a7a3a8f37c311ff98e8f08b895a3c209f3a131745bef41f2deb48a04843b3a00b837bdff69d4a9d61f49d35b612762e557461227f6444ce462492904905d9b4f59172af45ed252e8eac599c6382079cc15efaee64e32e2ea446085d37228810b70e7c94fce3238ff0b96c1fb2ff19903b4cde9465e8177369b99d9b941f9e85fa790ea739e949404f32b88d2b16c1c6a74fb36825d08e3341b522af2f633c50a6733f710fed10a234bb6caf9d43a68315d8bf1eb95ff32d5774818602b4f90b2f88c3330a6e4a81a27a7c6661922b439465e3c2a5d0889823f45850d4f1b0750a52708616fccabc73562d273e663a6fcb61763a3fddea280861e2480d382af889e4cdb494ff43e59bb3eaf5d0a061bd9194d9c21db5c66209312f27e91529adf8c7175fd72709839f25db2de001111b3fd733c9367b36c38b72dd91ebea41b4b2989cb28c893b7e96554c2cbb235cd8a124af840d659f5547f9212e0eccd06d9823b93ce0454d7510083710bcb1a3b0bad348986212a4baacbd7f9287d3c80f8f7a4fb9d4c1327a8e028ccb8ae6d99ec9ec8c406fb661f4505b56493d4a49456cc7e9d786cccb9e5ff5e49a6d786c60afcdd0e4741595ac1033c5dae5e2dcf6bcec1906054071e725c5cde574c083697bf2dd1813a92f03ad2e1ba28e1a92329474f3ad29310392297225c1bc5cd718e7d9c46bbf0e4b3d47c525dc26406bf1150d281e7187108ced5a80668e00fe2984cf14a1816c0d18aa66548b19239c33b99aee7f8364f4629c4aa28c2bb33029ddfaa714f70d980c512228389eadbae0dda70664ba862e92633688290a35021c25590f1c0496d6a888efd0283cce41539b2048dbe2d85c23e125d5b391b6ea2520559c144636fc49daf72943c4f282f098a4e6080b6d3fc722ba5c293ebd95c0e1bd0e663a0fa21f2c9b88721f5b56b1b158d589143382d8b0800dbce390a9791cba03d1c00eba12caf57e2654d39eda6d0628fae22b4d7d18dd790087ca0a8af8a8075c30d0065e03eb17ee9a1619e512d06252d0a504a15d0d52c028614d8f575fb4f3cad57a924827f89758b067d794d07f9b36a93d6312a3f38754941d7d058e5b816e8703857315d4017236b5551d77c24a39436553f79126984b30f70904054af8aa25708896a83b95332448f5e1df6582f27b0e72f5f50c76e836e0f74844d01595f73e6fc372fd9a404efbf4850df67fa33be3e96fc90b0c373a2389185bf14f504c50543c8890cd8d24281c12494bd75c932cc5671998318cf8e9228a470d2aadd9110e8ea36c5cada112fca7dcbaec5630110771c3b801b322c0f576fa030f486c8f6e11f253d670c91a4d2c98f376b488da2d4dd6af6a9d004278df241e9c90a3adc6208e7414591c33fdcf3513650dc1e449a991897b5efbf9662d011d2ce8f645585c5d2cc6f320ada5e6266753b43f871192a28d43032bc644e2a8c8dca85a9f39d64385e9c445071462aa59ceed09987b29bace452c27733026cc3e3d81e69d44047ece0f09108244a00919219026f39d8fd73ff0d87956813b414fb8a74acd796355094030d1d44d05bc801720e46398d1a1803fcac3c87a53078db22580dfcfebd4b725ee847430e7e632609ffe862e74515217f01041a1301f1bb0fb64b1c69924b2d76285c05d48a4524c6ef29c15b910e2c0692b5174334425837b5a6e62d0cf054db832445d4867b3c37b137fafdf3b1e02463e5ccde20488b3db45a99816895c2cc3005c33fcb87867adb40cf95c5c9e9eb2d1b8745c97c101f997fc334d574a469a284175adb242ba58a45005d86f1775f78cd8b886f772c1b46c0b155aae0acc8a1df99f6ba505c2db1347e310defc0c698434a04d233a56a296120447b425b163a26eee52fca6695ac345159e469b47b39e5bf9cbc3809946034141134d81ff75127294253b425a068f07b3f873f4b95d28b2ef7cede2e400ddd35028b0d03abd2a79c4cef8a4f0fa734a861dc1442a22f3540d5e908a251236b7857dc511138ff48a5d49d5428d3f4972c2fcf46cd52b4ac513e5fd210101c63864b6f697384488a76b2c3261d642c3beca6f68303272e98d4f592c03ac24a86ab4b88c4451e3a76cd6cc3d522498c58b68b81d27d71922f7ce16f158a09774944b2d4218cc6b37c5254a43726262fb88add9361c1438921fc26ab883050473539340e469d55886d319394f690649dc8836301ed3f0f98be3310fb8ec856f0c854557cd6ddfe5c931913079633883196126e8f9e081156a2cd1f230237cb42c26cbc1dd01b568e935f5191fb42197e2f6bb71bf22815f21a2823c26198350344f1940a12fe16412a89aa646b633fbdfaaa1339ad52d7bc50305b6b8ce94f0579fefaacbc189f15ef99b54e1bd84e73876746e43a0efa01e1bbca000afac3eefa110a86e29d0eff2b93e82d6888fa2d838695180d80251868266e54645d53b6aebe70d5e4e14f6a462dceda8580388a00c98971d61d91da0ac4b29233475729b71391a80a0ad7b063fb9205207dd7bf65bec7d0e2a791d4fcb823627c366bacc48277514a7a411b35034b53660660f4171bc8563945d00e917e7b7e43219e4bb242533d8b19e3e1c500fa2ec7458c3afa25a0c4bd6afcfc32fd8e27fa45e7ed578fa5982dcc3731a68ed5b68735c83c96433c34b62898056af6d3ab515159b8bc3e25cc5a7924d5137fa497f0eb02611bf7ace924c070f4dcabe5cd9649bd6fa7af3a97b623db49022c76a27109c58f1ccc65a8e2073f6e3c03fc8485ff9461a09b780f3fb7da7d65408457d33ad8740f72780b4cc3ebc04115e6026f546596643ee3183b19d4bc6de78f380b832fe7bbde23aa5696bcf979f77e6c6af709113d69512b24dd64b73242d2376259ca1c21f3f9cd49ad0a6cdd7300addc0f05e89a8a9f9037ec4b1f65ab405bde1ffd8177ee6c67118bbd7eeee61b71fcaccd17aad512cdeb95cea00801927ee2d89614f5204aa05d52ae0cd771e25d81190b7e221471c41a608707c4c966f484ba657139a724b5ae975c770d6e3faaebdc0cc90af0d6ef88a010c49912b2e008a4f9b1ccfd7063512f8d907185b99f3abc7bfde9e800e9d4c59faf7af046340f59e3a1178749725ca164d22554b3809a54148a32252337c2a2827f0c8d40a22c41370e83ce643dcd8934a8aab5e3f048e2730cd308126300c14afe18b692f8360ce4bde69ca1a95519bd5fb6f6a9def7623b83d28beaa08df84c4707e68f477346d3c1b885d0bc731abc126a60207e3d23e6d4a15504c5cc7e30bf4131bf9892d4e9ce6ddd0007b5f65e08f662428fa422ff2f9f164bf86b0edccba772666f73a8aa317e4255b11745a9c57a32b0e87d21b2a2f79e5bfd7a441ba3842c37cd8a5a65248802dc9ba0c81fe37e9b832a00409f07ca877803958c8e359773edcb5690107390b64151ab514cea905df10364405001926d8a5082da314c798cb78ea48b6caab6046904f4af453965985f921d46259320d654e027a264f036a9a06e4ad97205bda9b3883fa02ecc4f4bfaf20d242ca864134203182333d9a98a175a9abb8eba2a2169e5344aa474ef78686be5d465cdc53f1963902cace3940d261d57ac1918bc0c4673cce3bc8667da57f6d7651e7c5065fdffd561bcb50f8dbbe6f7a942fc545e6672cf04e03184088036e661181dced9a6259497c8c6dbb895e71b235c64cf5894124d134f6cc5ed17cf9593c252c2e94f14bb8244f517a8ded1974d0293c46929a7a3e54965091a513f3f43bb269beb3f86962a90f52ed9a50503b0f856cbd2159b55f2a4650e85e231d8b6a4a08e6774a4318178a6d37aa570cfa3f4af0a1be980cad8fd9f09804f1139b713b2bfe97a13285b0fd46d1868f75c9490574c1cd4b7a940a2c49203041b817a118108b05443241f0e949fdba965bc5a3c05b0921ea75fb9ddcd77cd67de0d965afddf90813164ccc888ca08a383fd125353546dd1d2ac36a080bfcf159a022806d6b7b748f81f98349e89c384e9b54116abb2555da24c043b2529e2c01407c20e561880481b08f3f164201b393dbc05e49145c9447e617b596cf6589882056ec0c25223984b089a94434739db4756ef4758c38d8b50a2a50d20824312252082f954029241a67d75a260c6eee315c3ca2b2236afac8fb31c8ce5fb396ecf8667be42d57ac935d3c48fc828b947288adff2abfda05b8c242acf156180f120056734910e1a1bfc4d0e423266bdd58e5673c10214ca03e6ea831d27440a04aef132674089eba0aa2ba8be7fe5174189a7e4f452478316c153b3cd08491244032d7d000778d4e1264fe0cc353dce97228910c0f0143714025afbfe086e387a73eff37481ee3cda40823a0646bdf30b221d9712bd48c1a1dfd26f105a417671916a45b4ef00777d3b943ce9c8d0563f055acdff34c333b13113d22010a1cbaf2cdf55537afd742d646d397276991aa1c28ea3a6b0da9ad7de9a02649bd6762ebf72de83d7c7ef76dcde0362874fabac02e0c2a444c32c38a0c4cab3b0b4061cd7f39538e2a747722971513dcdde66d02d831178237940e0b33214addfe32054733ef304bd70c284707fe4ce1cfbbc098d16182f55b6ea2590308c29f6d8df7f40ea0792f5466d5c95569e2eda71737aa026f445c1ee0b7d212a1b82d213fa3934c7be54dac498185f489db0b7bad19a48e681356b470421950120168e0cc1e2d063bd7e149956c6014f41a53df036d826ccd0c6b89593cc1a227b4817d095a2e696dd9d45948c465902f9fcfecfeb298f70f86538543f45cdddccd4c2ada5a9fe679ae252008e77759565188a0810cdfc899c1b87a73a639a455358c1d0499f66bf0c40c090658506382711f44f41cbb5f389eca71163f7962a5d0fcf2c5e248f4b189e9eea8864847fdeddaad811ced7bc7bf9cda4334498d6d83e16863b2ecb5ee1d36d5f4221b53c61786adfcccdcab4a7b666ffde605e324a2da3bef699f93814c623fe8b50e4329ac0e5df530f97c64c6b33509adee87185a5fe617fed3d7ee0b154371386ec20072a5bd75c829ca8ac069209de12d334904c2432695632d107b67ed97354210c13bd274798bc08d217487fdcb29b50fc855e238e299067663230ed4082834b0847f419841053c29a5c6c1ed0305ab005e7f9e35dbdb62b09ebbe59c8c5656394afdf31ab740fad22b3686d83fe1349002bb18b1b44a1975849dfdfe85807c979056c282820f880a865cf18836073c44c11a2ebed73d419382a905697bab4ccba5baf2431ad1031302fc5066446866d90c21a4fbb41cf3543f0f2dd17a6899c68a4d50a8c58eb2505fb8828a4c3116ac707721d8cb576629b78a5ab5beeb6e3dabd3f59fbe24048ffee947b5a7e4835cac848ec9e558a7a5320d753d7fdb74fde75a77ca7a8ecc6c3685bc24162f34561e5e1bcb10c84bc164161b980700073cd1fc405657b6cda25e79aa8518edd54a846c524c78fd864d5ffcf8b43252f957e8c77eb80286a05f6b78b95bf5dbc4e7f3dd3254500be1f997a533832b9c66a8b46a41e3ca00fd8ddf50bbe52a0e22ad07d3c117698d6208a423fe88019365e94dc4056af118f4202bac984b0f6c95127753fdc94a4f38edb229eb166021e4423a8a12d7a7a5dc816559770a395fa84d834e0afcccb673295c84c9d2593c55e56c60a718ae20a11100b461c14e0b17984d65c14b6a2e2412ff9471b49998d6e63b23d92f4e0dfada2d6162897e6943a8206a1556e630db5929b0b32644fe44dbef6c80b09d6544f28a284d126a7f7d1c25288841d5957855e648d1f542293ca8c1b5abce45efb8ed3de972cc1960cca56f0320b7accf594972d70dc2219e435d241abbb14e6594783b5fd55c71d4036a809441138f757641cb2d3a00346f56d32b8eacde3a4cf2414097d4e340a6364a289584387f1241cbbfa18f4240c821c5e8c2d8278481cc136f79ecf6539a389c232cbe1a838b4b3d18e4692b38b3fb3aaf68e11f59abd9bd6fd4aead1fbcc33237a218ad7e967e8772351594848a1eb3c206bc5abb0e8b98d1cfdf39267acfefc50eb1dd0fd79ffe80eef273a833ddecaced30390855f8b4244c60d8289be403b60ce63c423957ad6f06d1b50eac69fb8a9be8a98e1948e5fc5b0433c43220939e4fc1f0ad23ec9ada74599336c4d6b853e84189fb1d21a4497a9833c181b0f0619e243395e0957a80d714e03ac0655929baa9ef333a83e3d5eca2010b93798c938e568670e34b1326bd3e7e60dec92ebb39d3ab72100c5c41e4bad015abd59c26d83008c9371f6a29c7c7454ea03d66597ed0447d0ebd10ce0454faf58fd2d724095b440fe88175540168800e5c84ad0360d6707d6fca532813d0d2aec2e5c48873743d83125db346ae9fcddb356c995dfc5bf37357b91a04413aa33e5cc2fa798ee9d5238035b4f8b1060648a264fc50a8ae0a06f9801737565363051994e8a4098edb065c1126cdcd341fc9613721f786361b291a46ce476984a70632a15eaba7f16ec2429161e2e97c169dd40acf9ada8daa2dea220edfeeb3ffd838eb2e9dae62b8b3b3773ef5c401095fad4e0c1ad38c61457102763479cb68c9a483733852cf702ba591a7e5a30cc59a40e9a667ad6b14360126fc9988e9321ceb3bc15a138acf41b7b78aac60da8f81cbaa627042c8897d4df10fc8f4f994fb7a79bb44ad94a7b8b80103cc3dd03c5a86c995076ab7b0991aab16f29457637d9724b296592329407ba0739073c7edcb16d6cd250cc260dd1b1a10a0f35c840049d1d639bdb123c2d7bdea80183c4ed901e79ac0b3d9a90bebcc5e18fc96cada47e7d230c033f1451831292152058a60e388cc8b10304977b1366d7b73d9e767ded0a447ded3258adb5f688b36bed8167d75a3febc2077b695c0dda21fde0b9fe26722287edb943bab27ff6dc2129c1536bad95d65aeb9c73d62799d239e7acb3a9b3132ad15b9d95b5d66ae7cf7c37c03a32d34d96993450815d9c8bfb40c27e49cbea1d6b55d27a3bf9821f9705af5a6b4dd1e53a1a9d0597293f0617b41e03ab59e428da9b2675d427facae9826b976c2d164008741669832eb5cbbd593b9a864ab038151a9a50a903e0c03b1840adb45aeb015698735298154bda39ebfedb971f0c37e8a0478034b9de2e8dcf2de7d2f9dcb67f1e69514855f4e7566da07595244759dd0a97a3a8970d66b21f5e053560e1b683d9b27039caeaac0e8cb2ba1f5e12750dce99bfcae9e5746f5709475b1ad2a99c6aed85d37ea132a332e342a5aa8caacc74ba4edb9f4ac15e4c27ab827759a1d2d9fa81aafc78b6b83f7737159865209d7975148cbad7e9365d9d0b97b96e4885bd2271456dcfa0ca4157925514cda40b07de3c5eb0bff10257940c16a8809d30b1e7ccb25aaba40a9ff9c35434e9d285071ecc16535f2c57576b4eb5f6dd2bbb9c5dda37ea87c1eaedddde92d6ddeeede654bbf0a6da85375dcdd1d2789617e967cf7f5d0f2e12edc0abea89cb5cb5f47ddf47554a6e4a7692d76ed2bde13792959290a8071788101fb75cb5c39a33d7584b75e67f554c3b9d4a4a2b3182bb438abc303db8494aaca55abb4a3ef3bf4aaca5ed5789958595c5854ad60dac1b668bc985494925053a295d2517778ddc24eac17de116b943aed255da2c1dd38fcd62d1315bd82bbba42b1fde4dba4a200e42f6fc0b647a0066a11df88a8e0d7bfaf0b6afa274f3c62ec12e584027b0290bf500dccd0e3c87c9817f09e2504950e744b77f6cf547ae35fc5902d83e7cc1349eb324d8cba972fe84750b2f0baa5b796f37dd8d752b810fcff22ece52d9a5f8d91df804f2784d1a6c72a112cc61e7e0a38283bced8e491f1bd80574029b405ed3f607796018af8161405ef5e15534e18c951767edb5bad9e2365b54fb65b79ff718570c7bbd625f3fe78bdba97ae2c844a4abbbe494e361b9ba3dffe2669a2f7bbee5cd16e0cf5ca80292663b0549d5edfbf077c1e763575a7c7fa20f5e9430428c1b67de9e38dedbc3a2ebd32099cc57b777e388e38dba5277ca5ea85bc59152b1b9dbbbbdcbc66b978dbdbddbdbfe36b6fabfe3d06442ab337f550ff4ac83d3fd7ac1bc067bd91f6f79d81d568765c1e6b038ec0d6bc3ae6055b0b625f62831a5270924aa94a65ff368faf3083c77ecd4a1133547d3af4668fa534e8e53041c22a0ea9beaa6b6a15f9ea41dd20ee94635933f7c6d3553cde4c269e9a43184335662dbf6a7d55e5c2ffe326841b03a05710655a16845b13a15a354e2ca871515fa883ebae5fa79d9d7ab3a7d4549dd99928aba37ae2deac7a663fb9bb8e17f42078aa4ed0fbba5b0295254a7296c58a864c1926bd2e52a546553e354a8daab776a54eddd94928c28dd94e0dc367997ed5f9d4a1b66fb5f9ecbdcea5ce6158d2ead679f0bc2300c5536c7f992e71c8bebdc294ae7c47bead59ccd79369bcd66f3a71e54941498cbe572b99ccd66b3d96c18b45aad5606af2829b7bddf64aea473e23df5743a9d4ea7bbdd6eb7dbadf6728ecbe572b99c2f79ceb1e8dc29579d4ea7d3dd6eb7db2d97cbe572b9af6874063f3aea4479f4a907a5d3e974badbed76bbdd6a2f4aca6daec36faef4e9743a9d4e77bbdd6eb75bedd55eedd55eedd5de08a4c2020b2eb800030c7e1cabd3d1b56f540987a34bb81cce049d4ea7d3e974b7dbed76a34ebca71e944ea7d3e974b7dbed666fd5de30f87124c9152b6219d80c32a84e33689930a5a8cd46e9eaec2693fdc3605a53258aa34b3a9d4ea7b3ba15e48a582c830c0210000d645626ab4e659a9687b40ee664a34c90c9fe6130ad33948e82bd2dc3de467d360adba86ba3ac8daa362a7671740c8092003cd9fe1a2c6920d2f1042b9389742c2f95ed3f5b2580ee9bdbc06eb04175ba016b07d5d18ea35dffdc87b6cfa78babb5cbab337f912cb38a2cb5fe2e8ef7e4e55ddce565e0b367fe5946d3779e898a6d1a5812fa586fe8c26594484ad74ae4325a875c38a52375297df17b1e7df13b12faba8f3f1358cc6bdf53157ea76831e3265dce2ebb1cda74f620c26c31dd85cf2a3994d3e5d024429741fb05f30fa2743e25895c46875c1c2d25b1f3897a08742add9e6f9154baed4fab4ae725e09538b7e7fb155d0eeda04d472b44ed0f59f284bb67e0dc769fbc0c678b37e5afd65aeb9dd6be5e3f2f5be5ec301d561f03df41d3a7b33edd7908bab2f762fb81cb7408c36f0477de1fde775bdf765c811ff609750e3ff2b361566d11243fa8e4072e0482601194aaa82af6ba59d4af19af3084d51ab8e7679db3b83a0184fa7775efbddfcd198f75878e5f8cb002c1921f78d12bb7745a1f4ceeec4276b579a2aee6c9417d3d39987fadb5b65e6beb08b6b5765a5bc989995451cf16f866d9c4d56bb8f3c804fc6ffcba42400d2487dcae1000ee4bb29803ee29d6af76758d8419b8f7de7befbdf7de7befbdf7de7befbdf7de7befbdf7de7befbdf7de7bef0d4f5459e3fcd788dfc458ce806dd78b2e5708aecf6419be2b748d3e74a58023978b2ce976bdcfb3c69fd7e3eb5b6309dbadafac37d2ff7a96fed7eb7f91d365ad67fd0fe9bbe51a7d03b9dea8f5fa5d64901d0d1442ebf5b7c8d56b72f5b01d92594f1632603067e1c29ae3b02941ca22c0ab515d129ad9b737799b524a290c97dd274a29ed92a5a264d4f8b615c1b78dfc2999c5ba25d441a91f597aef9d4f7faec692be7d3a5afa4e29754aafbbfdeb765e213c0b7399165daa78174425fd4197bffda95732eb74f9efbf93c0ed5e60b353c2b2025d8ae58c29b5737df1058122b92d803d772fdcb162b2f509fe4c617fd6de06b80fdac1fcc7a323d10e2c098efce632fbd93e1eef13f9ec9562dd63bd687fdbbe93b76f43e8ef46a7769ebc0f9322c9047c229f3d4ae72d0d5f2ac24f97b01d9227d819e2fb10def77ddf373414d32d172ef39185cffc7f46d7a88af15a6e671862bd6e4db5c615533a7cf0f5287ef4a3dffb7cf4fbd5f7e2f7d4672c61a56cd336254fb0bbcc7997bf6b584d7d4e9827a72f7f2b04187d9fff1b3fb29c50fb7b9f95e85299a0f9d4231313dffa19574c695085e24fbc5a3fefb2effd5da355e1b24ff63d8a51e6b3ef4f8cdf8754748d73ab64b45a7bb54cbc7f6b8411b9ec7bd6f881cbbef71923e0b2ef57630c977d2f8e258c264c0ebe3731669f7dff1a5ff8ecfb9eaaf20c5224b3cbaf9970c69ab66ccf1d11237b6a6bb0e78e4898adb4b453ecb95342da6115af128bab465c697fdfc664d226fde6b24f0440500ddf94ace1db1f7f5f5f8fc9d2c7f565fe89ff27ff3cc6b9d67ebed6a81bfcd5ebff195de3f4992e6bd41db6481659d6b0df68f7f789bf228de8dbfd9146a29db9bb41d2c8fffb4b1ad1bf9bbc64e9b7adaa35e6b249963360fb7bea56c6b633b6fd684c0cdba58c6def48836e4c7600b62d6944dfd6b72411a4fd7bee5c9063e96ad500bfb9ae06a3ceea7fdf5b4aa96c4a5aea3a1cc987dfec0a84cf75b80f7c7324eac1dcdf4f1d2ee4837a70f30fbb0e97d9fb912e5c561f864a455487d2e89cb3d6301845617f6f4792a8dedbf6413bb097468df271bd14ba6011d444bddacbb25d74399f367d3a73ce5f2631a5d4929746963f670dd87e975dd99c7392208be56bea86664cdeb6f6065dda4d3f9f92047b0671f451d554c8cae1cb6bde1f513963d70fe414685d9baec232c71fa6fb8e41bb84c1dc3acc456df3cffca1af40c876c344d8404c1331bb9240f58ff6cfba624a93a0d658eff3655e7da9c5b795946291b3ce7c7a7905a5ed571e1ec94a6d24e081042e731e70a0834fef83f60fc7724af994dab6a9e98dce5f6a7d6783aaefc19b67530a3f58d022b56ff83e4e9f4981ee63429cadb5b6da0e0cedf02d590e6d1bdbb43654673e64cf68f15dccaf6d556c3b7d562cd5fbacc692b62f79822d5f80a00ac5909c11db2860a1b36609bf6ab41b1ce7d781a1e943ed532882bb8df07fa12882613896433b7c1488fc03613896b49d5d066650fcfb7b75dfbe8e7e18862afcc512b63f8b832e83b63fe893cb19439bf559f5feac51bb2c0cdf6714613e0bc3f0e90a8490cc4f547326b3cb2c29da1aca1c74198bc982fce98ca114e494b1c2b3bbfea83b30a1f6258d2c995d854a967457d5e32f8b2b7135d2a0fb7e5fa8ba24ce64e9772ca7ee6336a7b06fc6d7ad55f176452f171b601b886912042c9c3dedb50260627ffc6f84c99e7631df59690e527235a72d7a64b0e1764586351e387207aab7640549343100172e31dcb092823438d41c4d6902278d95303c721801050a9420664ef3c2090e252c4ca08608513455c0b9598283474d962dd60a0bf6527ffbdabe68df1a59f2e5b225ba14ebaba8a2b52e65abd0580c89fa055a992225a709d2192e33e46cd9a1852754a29c8aeacfdcd32fd84463c19e233fb00005f564cf0a74864851aad3238e1145c4d9b9b0c6736ccdce6f30c64966360637c618cb5c46a70b408c096d95efc3b2255ca090910aa286394642628803648d54962c49b89fa429b321a21ce528a2c48f241b512fd441620921dc10c166a9053c42eeb49270009d89a241963c4e4d6458a1882d73b2f09e66e081b46443880f2d21684c988962c2195b152278f0b44123813b42008112f364830a4296845cd91f8afd95d9dff7617c6d9565b0e7ce851ab6893d772e287d40fca63b64953f9f52323ff896cc2cb40b586cce40f003c1cf20e91a83a448da3cfaf79c97acf569add9a26a2d182b55b888626a4dc36a8d92c269e865dfd34f11b4d6af06311284c9ae35260baa4d9a0b4386767581c8ae9feb4f1dd4124950794ac890fa020b088e2048408a58a912648f9015848812e40b6227ac45b1724b22acddd46cd79ebb1b0f263e4c450c834d6173466bb4a1151ba6e26336897e8942b4dd7377e361d71acc3f5addb26badb5c260350b83a988dd749860ea3bded357b06916ab645fb044642891a7870e2e4c4cd8904161489e223a985c4953660340dc1e6a00d265851e72dc3c4d2f509000d12206c89832f6c887cd47ce8b1d277790f82142498d90355ea074f89103f8a34b1ef3e388cf0f27351f4b00fd80c195e58a1332324c5141902f5d6e7003c39729326cb8f830b32288a3253ce0722cb183dac3c30776f848b3470f145d123e90fcf8900213e3664713a5227c68a1e725026f7ae82da1a00c11483d9460f94072ed2fcc900b79b5e7ee86021591907ebb7c4db54d6283e86fcfddcdc98d861cb15b921b318b62cfdd2db2b943172b50adbee78b5e036d58f684ed29e698b4d9658c896e97b43d59ece962cf254ed57d15826f4ada3afa67cfdd12a73d7994766b88c992d2c80f82a35d55a451fd4c542dfd5bab6fbc3148966449693896f73f254e839257b2773318d95e9d3e088eb67dd548a352fb767c89564a833f1b00de5508f73e35aa9f7faeac7e851fc618dfc7646954ff1ad5bf7734b26f45afd1227fbaaab490e22290b0796c1276867ab07662f5897289d9a118e3f92fbc5675304a9051c3697bd094b5c900673a85bd245f76397b3208e19b4e5abad8fe25fdb1fdfdcd763741dbdfcaf13d77323cedd20591d771de56f64a32f99ec8eda8c265f9236f4b842e66beccf4a66697a4cb05744ed2a42389eec68a3d77498e24b9c1c219a4e99c39679252a21ad223744e402efdf30320a8cecda395d2fef96fbe2bbb572cf7bfeee057f0313e01833fb18f34e812db47787ffa8fbfaf74acdb25b181564f0c5048eed8290d73197db94c0f0e6be168d59e3b1c9d49716e5a703c138786055c103bac1e10833d77389c925deaa752f1e099c3020c3fb8699283140e40cd6003891ef6fc1012c31e36f68e2f1189d95a3b5f0cad1972e114076112967b582c0f7b59164b84a64d34fb935889668b0f4c0e286bb2a0ed965ef97c78a4dbf39056913ae896e8a2ea5d15aab266b9543ebfbfd65c5f5fe65aa960b53624d6d924ce1d7e0eca5f9f168aa15845d5d75045f6d860b20497d1e7b1fc6be1edce6d0ce29f2f622cc67019c693cdc6bfa28e9edff7186fa74a5cc849fcd8880be16e0cfc396bf169c594c6ffa2d65010f1db268c3f860b898fbf0413a8920be1fbaac74f6f2e94446d2888e4d4c694ac616d6c72e07f47d5085a2e9a7ee962e387792d17e17fafcd22fc415e9b99d48f9f5e1cec9a69ad6f996fadb5e3cc33f17fdf87ffc36ff4e13b31c6b8c41863fb8541177f9fd3ef5d66594c0ee6630c64ce39f51256fdeae7870e8e0e823f880077aff97c58df678cb990256b053fd1657435be7ca60ab2a3f18309982eab205472d60f6795ca7e231e4b2d543fd731053f0addce010aa186dd65fe92a4640814022dfd4bfa245008e287e18b625ee515398a210ec3c7e1d495ffcaf9bf4cbeb01fb86c62fc17fbe8775ba7fb568f79122a3dc26c81c2e480825fcaf6cc4df44b162e54d44af019adc15678a4dbbfa18f7451ad0e5ae642aa99ff637d05ff2372e14279eeac5291336222a8c04267cd06dfc270197dd638d2ed23fb3aa32b30c68b5a6b7d7d18df1a739d89b906559be5c508302200b5550f3afd3cd2ff46fa322cb612bebc16e433fa93fe165dc682f4ad6fed9e2b5045ce107706337d1a0d7653f0ce06e747c06b355eb8107eafc9f019f8b2a0fd810bdd1875067eeca6f3873697ddf01810bda2ce5cad9cc2d54877cb9d049fe4a6ce3eb5d55acc67e0e7ac4b4db6485b0f77ba60f10781fc27d535b9507e92e5fb423cae98d2df5b1568c74efecd1b8cf1d414b6dcc3b0ae4008c91a76bb092ef36f8dfe7a3ab1683eb01553dabf8ccd981cf8bfa8351ac667e083e0db1d40f0a9cd856e501db10d2e3d71a19c0b5171a1b2c6073e7d72a1d583e2833f69980d8a949c31797687a3ddaad1baac08fca021afcd22107c58aeb5fa96f640aa8272efbd77ce396dcf0aa1e97f11f79c21f250e6debb874590cb46981cbceebdba84989a19319968ad6d632decf31196744f349a9e50bf060914c23cc1ee1943db7fc66cdaf68ff6d13eda219d7fb7dde3546dd0f66d4b8e78c3bcda8bbf394e61bccb0ec9dce9744597e27e18a52c68414e73dbf29e26cfdf86b195255a285d8adbc75755b4e15561f0e54225fd5aab7bcf9d92affae2d676fb9c4219d0238440da319afed176169470e6297abd744f4893f53e8a2dbdd6f6aced69eab6fa57420c8c7d6c69ad5934e181b8f66dcfce5c47fba586ddd6cefbe12fbfeffb2cb62cc22cd8de9f77cefbd3685e3bef5f132c109abead71f7d5d6561c1280ef9718635cc3f62c9bd766a3299cb067a9e83c90b0414265c33ccbd8d79dfe27d6e9b30ba47a23f0f3abc0cf0f929994316130605ae515e7f496870589929d77479e764790b289d5894ff130b1f5aeb035fa3c386afaada9dd7a31ce6b67c48c992261767df11582cf6b1160b0c3d78f570d707d0bb6411064910a38da614bbffed683adf719cbd7cf57c08967b5c6d6cf1503e83ef144de7a309c225e2dc0e75ddf1a4b19bbf578b500f0f5ebcbbc5baf2ff57e91400a38da2f980b04479b45860083fd2281c23762fdeb43d6bf9ec5fa17296391a50cd98b2c656cd7bbbef544b53596afc7ad13ef1a4b978b6cc0896f9146279e451a89df7a227f8d3360bbf57a2c5de40cd83e418222acf5be0a4124adcb56e4a7d00b40f13f3f570b40f13f8fe2477febc3168a9f9f1fd7b75e3fae6fa1f8f9d1ef7afd80267e4813264cb45aad1f5baf1a6bd00db64095e5692011b6eb75cefae96b9d5d1949d2ee0854f8790c5df4f3ce48979d59e36b2c65ecd76beb9f2e84e261add6eb078291a5defa4f3c8a71baacf53f63eba7d780fec409b2ccbb459626fef53f0f344e9f69b2149f15311c238e2b030c6576c8ddd02467cf112f48ae04d1e6862425426258511f3870d8b991050f94064a885152624a151e2a0882018c86a5a930b61f90e0c8e0c5c610253fe0910304880a1000d1640b0d2a48a24c110f92a0a9b313f3029a1c6e47c214eaccf1228399209a7441019d324a4f2a4062e9881f48f4123390e172a3c70abb1a2ab046e9488f24446e513e90f81ced20d2430d2bc4f961cb1903d852e0e4852068c82ce981a4022009d7a4e58e9438b902046124862275bedc9183947736f4aed46941085b1b34338861ba7147cb549b1662608967c048f1018b6daa88559ba522419498c366081e47c4a71d6830a3e68d171e521c50c31218e24491b3a3c80e24744cd39333796c04b1a1c48b8ea7038f4ecf101d30152ca1a5ca12323a8cc181023b299d0e3c2b3ef0c0828f40072b3aa8a82172ebe5d87183889531727264b084113c7cd003c38f31224cd1e2a68d129452111c48523815224c6ee4c8147952c215a6216e9c705993bb71e4048bca0f375aa6c06142a2d3a3e688365e6e43e8b071c1110e555060a30e9ddb11500520630bd3664b0b678eac00b6c1810b112e42ecd8218709b8515272460a983c3f501550b07102050e9c1d88a8706b3146081b3771b8c0c085da90a8ee2cf97246ca12af05184e5089f242161b93285b96b0c0045e56b0ada0091c366466d8a10b1331457cc961b7078905820b123d619030c2254c0a293ef0f438b3636a871248be041b648c30d1c2a60d18164941f24c911264098729132d8628e164ca8d49c91825468ce111640718f4e879c5e061e30947648a883d0b0083c705db103ce41092c491d610556850f3430c4aeae09002074537c41c2d36c48004003428d3244d0d44c8b0441130e4383306ea080d687252607e80e0b283142076705488629a4080891202a4f7829b3779c0c40082a0ca5a6bf313554a838298d2fce5fdef0a169b155b15a92b86d2c72b10c0c901bed66509987972407f4a0913c4972f5f86bec4e85501fb31f1ae8901a862e550d4ad578aeab3c2409f05f6040a0078bd608c8fb0462bc0acc53e1ca34bdaa60dd97003cbed49ab1872f1be479fd87357e54b152fbba441e950cb2e6930290ddab0cb180d098da7ec9216dba3c3a55d8ab43c33ec3226a241b24b5aecce0bbb8cd1da24ed92164bf36397319a1d1ebba4c5f4e0d8658c56a68a6d97b4d81b3dbb8cd1e01cb14b5a6c0d9d5dc6686ee2ec92161be2cd2e63b4336a76498b09716697319a124fbba4c5cc80d9658c46c7875dd26272b8ec32468b6ada252d866705bb8cd1e2a46097b4581d7dabec324653236597b4189b1a7619a319c1b44b5a2c091a7619a34d25d9252d76c4915dc668bd1776498bcd716197311a1140f62d824a8f4dbfa4cd4c6547ad950684b63e75398a07eae45b54d84e469776d3f72615b67f5094ae5f9f040ae1eb5fbc02814e4d5000334c3d7a783388c1e18905224c60c487204d7cf8e1464d119e12c61ec144896acfdd94252a99ab644a130a789786295336a648dd9882c7c65dba4a343805cdfef6dc4d791a5ab2e42e89c59a581b63ba4edc3e909308f09dfffb21c7afc5d7074d3c1f864b1a38669ff9e7cfa240b7a7983d79f4cd9e369cae5fb01d964c7953450e172e73c03891e9cdc16188239e3c4901f824871474be0fe947962e59b63461a2bbe176431313123d9cd89e884f98fc4445a9b2cba7fd7814fa876620ad42bf6041f08731131f1a86ad631ba5c8c64845d88aa4a843fbecb98bd2638b59dc731745857df7dc41994a5381373d24327772f06cc8820405426e406263081e23f28c72da804c984d191514239ccc9f340714825fa5f94e5e253d2979b4c35a2bce5aab44e9bcf7fd92ae830b98fc7d3c803e718e66b0a3248a8f1e95264a0478b34398394d436818e224caca49169f384e8af838614203262ce797a55f8c75f8de3b370c5a5965aa5bc7fa306075364b7bafb6aa6bc79a7dcf5d299d7566f43d68f7f7912fea6cf2a0e4823e26c318e34065880e1d67763a1cfd3092f483ed490b0b2b14e19f4e6c6cfcd6498e8d7111af3d77507ad8e19e3b28ba3749baccdbb1d41aa63aea84f193ebe8618ac584ff72466d1bcd159950675e6bb0223bc2a8332cbba325814838417e5b348b422a7e20c0c875f6fdb5ff9129e0b77944a10612a8115578b015e5b78f420af8bfcf640af84f90c267df3aaed6966acdbe1ba03ec1a0a32fd1b7cd3a23e13efefb188804fbf8ebcc1d5767fe7669c973eeb84e98670bbabd687ec85a72cd550c14f2eb577dadd5098abe307ff8b3a865c2f5af9fcfd5196d512c9bfe4775264ebc6d7dae5fe50fc35fad42ca93daf45d6e03aad469d3079fa27a5027dc5f85f95def224fd0fafcb368f531804870fdcfff9027f8def5b328fc07cc22f0f53fad7ffd5cc5f8fee7893c469dbd4620fcaf3f2a0aef78823f08e8a671028d18ac073f86ea7dbe3e0d1250085f7cd693a06ac5f8def5306eb83e8b9fdf4502d93fd15a02b2248c59672648db6b54daf47f46204cc2a07fbbae546775763ff4f1041a20a09b068d07cca2fc0f9845aea711038804d5b39e459e207cd5cfa2fc31804860fdf71f7982d5b37e16b9fe01b3e8e7edb7fefbb0f5337aaeb33aa3df1a81fcf31f15ddb174dc0366d10dd6ab9eae48085ff5be8ab17ad6db18e2ab48d75181eafbfc8b3aa32ffa6d53d508544918b03aa30f92b23c023909835667f4679d1d15a5a08faee726e1f458ecfeb0363634747de43c747bc42e8fcb03d389710b4f9436c61789090a940aebe00967ca066ecf151e9218a207a7042cb070662987255d8820d2e48989cd05526b8502a5425a6bfd9ad4c14de8d05a2f12eca563b2a03595a9cbd67bee98b27c3feeed06b93b98aa3049b92ddc1b538e0d5313a62673de1b8e252f5689792689156881f2d4c30e5c9a3449a041b2d111820a6e48c621b144dcb18093396b7288a921489c325cf254598adaf3240977e3e276aca086ee7cdf4fa9fdbdfd3e7b478fb8e78e09c92e9ff684c9851d4c3c5a60ba916329cf2ef5cfb0d4c30a4b4e36967adbeeb95b32635b2278b921d696085db2789be8a8642c182641e910920600000000025316002028140a07844291304ae360dd0314800e6e9c445e4c32134722a11c46411847411084300c308010801032c828e68cf100507013474eccb92ab7180e27e75a4917a9b05fc9dcf77924c40adf55b5cf6a744292065a7c45748942acb29bf8ac4c5a0ac35b45c4fcaf71245cbc56ac8d55f5350e493109f5f64254fd3e8e8458a1bbaafe590174d22140d20109447c2a116a9114292f0e9155ce6824fc1b3b4844e988331a911f26b4a1e8d51494e6acdc352b5afdabc8ec392be2263942dfcc37095af4ca62b21644f932954d3e04881d8ad8d2aaefe348be58e190b46b60c17fb5524aa6ea75135f157ad31157aed8aeb5b0d25bedd8f0aebbcc1488e0625d256ee22bf486bf5c602fc93d1a09ffa00212693a718f06f223298a74e6ac706b7a74667f56196d5224ca3a32f3b2e12754ec21c2fce60fe8ba2294a2af7a2ce48893f7ac104c94dbcf2bea2ce133e8b8993a9245bf3f7c12a5f663333d5337cc2c3bb18d1461796fd02932dc980a97f88ad4d507c86fd04f4fa67155ca818e1896536a1dee9c8ce682b14d83bdc47936a86f941dcdcbaa78b2274462928e722ab50576148c7f4709b1cad246e4d133c6d62735388d47cfefe980dabc5202ea2fce84352dc1c28f016c320ae5871d5b2d9ef068df8206427adfe4d609cdeebb6143e80671cac2ab2a3142a74249a25e6031a231ba6370339618d033ac196233be33ba18cb19d21857196318de18dd184b0ce918d78cb10c6f185d8ce50ce98c6bc6580cef8cae8c658674c61546889593c90f09a0724484c5a9a566c9490f6f0d21d72c08d9f8283a0291dfb774812e40d2ecbc0903634201ca7c6573d033f3d41059bf2949ce3dd5a6a57c67014d4483df17d606b62a7aee334a5603eabf0324918280c666e13c54077f4af17fe5f8a772e44139f2a01c79508e3c28471e28f2ebfa59659773b05c21d6741ea3387e508efc29c5ff95e39fca9107e5c88372e44139f2a01c79508ee04bcd358d7e7d419fa9e73acf9717679a671214070fca9107e54878eea5daceadeb9c5f6b311666fbcba55666ec8f03c3ecf7fc4a6010bd6e61aed2442ed16564a6bb01156f187eadeea42099b5fbb30fa9e2d37ee8fa62b55d9fedc88a9d16ee8e89ea6bb4686f012fff5413e4730807ad4c81885758cfb912db2c798d3b07a42380c1f2820c8f03c86a94f084f857e6c3f9ddacbdaffd488e8b8af143c7302d8075b78c7b76e324a90fabc35a7efae404ecddda5882455f4c7609b5e2db69c47dc87b6976c7b234b527cabfa5d2aef12bd0a8a04e56c3c7d59c2e30abcf306169df0b181137b454b7730e5bc31abf815c9a9e5b1221bae5f203aff81f9fd5ed8f4ebbdfa44f24c58bea09c10a40f4fb2a97da98f0c4d7752bd169ac00d995d49f632ec01a8424279effb6d4bc28cdd13918b8cf8ed28ee76586026cd58a9e53ff5f6862f1faca841c4d34c5ea87ec4bcec1f980c1ed98fb673277c5c2565a710396e175897e159107bc0ea56154f384fd95fcf97cb114584822c4fd5053e9ecd109720395892a780615bceeb972b4a3560dba67f1e355e12b0255eaee1685cdc10d346b6c8565f392ad0e718ac78ceaf8422067052ea32428c8fba219d3eef6ac5e541c93d8d0b93d2a4f179be025100133e3de620de3fe5298724d84ca4cf531f804be9f6a18c8f0bdb3221b922acc67b88d5635cec7bb4250c8e0a18cab6da6826ba941ca6499e64733c73705a51f5902191fb54f24b4d0703f92a496f3e164bcb9c8e8cb5f7bf49d1f538031b7e2039c4ab389f315cb0f2e6f8d336aa816c015016aa4da6d41262ecb3fadaa76db7d9e649ead37a79b4b60a1943aac8eace0cf75871430dd56bca3bb987e1fd117eb3ab0a979a022e2e43d8f52119338552418684d252bd1bfabd7d52f321fdd3d239d6ed9ae10e6ff107ae854176c0ba22e67f5e94185e240c8f1ed00368b9ff6998de0884eb0c7f0f0b462d766daa21ea087099fb46f4bc4d18a086c93aaf95b10db4dfbc95c46da425b6c76163e27899ecaca964ee1f04a411aadcfc9e7429282e9f902384d94ba49bd0950f542b2b92db2ab1ea10b2442fea04e180e26de837f4c189de978f333eafb77bb063cb95c61cadf4b99657add495270da2aa2e041d3568aa28660306d113ae1a7b674ff13bd12ddf169c724737096eefe14540b1d1681e880debc45d3b13f84898ad7736a49dc5043f35bd0c20bc058a6c96219b3da23b5d36492b8158c38818410932691923c2c53143c05459505c424c50127d98fbd895bf8006b2a35d33ced084f64390c6ed8f6e84ed7166e92509357fc0282286df80e0e279f24271d574c7ecd85179acb5c9797722aaae3985b68c05c77129cbf6cefc87cd0026269f7474b6c7a2386a66a436efe097b6aa0572e740bcc7fa35dcf8f9bb17882e8a1e6c39ba9101c140c89b3119a16564dec9faeff878fff7c22b2d8a76122ce7a1c181b646c410aa8cf1d6184d1360f965fc6d265bda79ca4e30c00f7333ed2edd57a81454f13124639ce80ea302b9a15108a1b927b7747544c2bef8a46653b5da57c6661bcac1bd04a57a97ab38e479acc22d7e0973c66301648adac4d417aedd94171f894d3c6742ef5d8e43c8d09f0997260893e61565a6e19be905b5ee63ffc23ef6248877ca5a2378d0c4ab9d9058b5a1ad8583e9969b355e40f292af44c5887d9d37e45d3b0abd305e15eea6b5834fd25e8a64fac54dafecdf739304ef28fde623fd1d8c1814a7b50d3772ec46801e90940f791092867cb296d0e67573ee8729505decaa82122d41219cb88c0f12033299bebc6434f54e28ce25696cec6e087f1c3d2d3ac3beecac8bfddcfb388fcd8321d842194c19599409664e70f5567c60f6591d3aa5ee90b2265d30a9aa9131190954b48939a0d527d5e0e493c70f8d72a431c6caf44198b60563b7cba464d8e4b7a1aa7bfb97fd8a643fecc6a1bf447aa9497e80afafa878159062c87ab046ea4a8e93611d35c91efcbd3eab9491c79eb45d77bc17709cd4797b8c16567e27d61efb9f357c571ff3d2fd06b1ba217eb923453eeec8f196079bbf4fa44ba2a2f9a831c3124ce04cd367093ad01d14e9ab10c2e64cdcff29cd1834bb21f51fd9a35c64b322751c130b349669c62e5c04352bdf7e3db17d26db9cbf4c36faa0ccf27e437a1d947d9c8e9402b6a37d700f7d658bce6f1d9d8c587c8c05f3c9ff1403ab979ed3b94437396842842ab0e5410ca734ebee785b3e00908724167aa24f26839506544b6430ead6a8b264f7279f3b0f268d90f67914f79153b9285b69efc9e2d6f79a420466d8793b66599f10da3a93ebc66c6f5ee8149d4a93a68ab3421002f71c68d8ded7fb01c22f40f705af5157b9bfbecca80d32835d7d2cd5a73984e099cd0313c8f0a181b8ed8d55454e75051eec770f077fa5c24d13c2c876f4d3a466acd61839720a6d65b1ba3919352ae8469900c8dd341bf7080559b53d6179500350bffa2dba2e4a5ed8c09815fd32e00e8686d565a2b393e3dbe217bb737d4437dc0def765285c48d169a7be768bf678a2b416091cfcc591c0756b98a1ea2f76d4b390ee12702c551701080cde334bb1403f048b423f5354d63ca8a06ffb594fff5110a5c1e823689eb86c93c20d89135d3b7bd2f6524230b9c27cd582d50931b39799a73c144e5ca9475422b29a39678e59765dd2bd99b7b8e9167a4d0c8ba845331a2319c819b7138f054f48cd28c7a3a933fe56b1899dd4a51fa848a11ba87c53437b178a075ab60c76fc54aa524bde93934b5fc6d88bca1b1f70338fef1ffad7b1b6b8b80cbc580bc67a7f4397623e18fc997e476b845dd9ae73b61e7a17366971d8445b6fc313e19048999bd065886d1dd3b862551e085fdc48cd149415c1934788832a17008aa04472b2326d137f76873b8bcdcd31700dd909a4ab4f4c39f76d6b32b73fbddfa6f6b259733a88710269bb32af2c51f5629a848b73c4a4bd83dfaf9256b93f50bde88c1f519072a47ace99535e063a08188a16112330a16ccebd58c9bc3d71161b5f585aab3a65cffe8c59ca7098c7e801b4b6475885b376b6e19283db186b3a6045237d10d4f395ba9535ce90ac74255b20e9c8387afe74e5ab87175523ae42391f06ecb4b1c04da9b00d5cc9124cd972852ade39a127eb14eb56670ec0cf9bfac0e1d61d1ca93551f90ee9bcdaaecd4440ec3a72c5022683f5158ecb85facaca7284ac7c4804b734c2499c8f083e73b3bb63141f717b374e2c20e674ec9cec8f96676035316d23a734491a7f105da9973722ecf388d274cf707d966e5aa2487570ae72b797f9d24212c24acef388b805d0f958474fe89c22946bd2575bfc1e3a1f93be8c63fb363c224f08a0e448df789167e55c510c1859ba7cc973bf014468cb0d019022559a18641ceffc25a5d6181576c5b723723e8b1e29206f8328fe98eaa34426069529f7d4f100ab7602365d95915735fd12a639a0c6ca04058a426ec12de8410484dfbc252b92fd300200a8b30c0b7651712d6d545ee03ad8538b7b3ea402d2c19bf6957c99852f727ba33fb277f6b8d0f2497bac595ae8ecf318e841fe807411655dba74b026ca9e76a534b1f226497bf89e9402d98f83ef3e54ee9064d56be152f6191c944010b71ef9fae7cc7247a09ea12b326ea8778d7c70c3d681b42fdd19a2e36cc98a09cab7db3c08b83e19259bd1fb7ff6e38fbe8d8f1422682f44846f8ef9367d79dc69a639a2cac9b2b8025cf721ddb8b830741e34289363310b4e2c2e2b46e01a85440395ceb08617978e913b0f17170a877fb31c882d7fb7562b9e292eed5d8e6a3bd2f2139286fe1a5dc8487e78814845a80101b3a0f83fedb8846c08ab6857945edeba0ed4b8198fa890456d2c67f286894760411c3ebc6895b77e2e21da9ea4778a1896de8aafdcd0925690ec9d5a3c129ef62acea77914f08600bac15a03ea1cfe7caefb2c984bafc9b41a33097559dfcced90b9b8f1adc919234fe18df6f8e135b6cadcc2b04d04abd775ed61915621a31d871d6583683e70751cae7f200129a6f3f9b2eafcc1e40c079a542098ec4bf4718d1928c84424069b5b1393cac4a9d5036fec118fa5439ff26633e4773b503efd95114cd0b968a766d4997ad331220eaeae1480248d6e03f8fd6be92fbafcecb07cc0dd5addb452122cf19ebafc1e4489806bdca5e0ec515d5a79f0063cc679d98f80f45f858f38b86be6b8da526194e85552aa9873f90e8842a397941613a041c4de30a7800e6453ff93b4ac8908d31851e031491ee0e04868d65c41d484817d7540a225ed8ba5b0c073d120f8399ca39ebe28f68c54f872189940932a825af4a0b118c7c87f0af7797629273d7e6a73b41329b9639a88c35264b6b77ecaf0e209a0da458e4034b94347f4cac38a661e42c1ffebeaaff4845294d6b3841abd93047688b8f6e706753d5ed8016d98b06c57c51eb489c0c0b5b1ec31eff8d412547de360f6b5f9a5b74ff791f836990d9a4d1b338fce637a4c5e12bbee7a7093d6e02537a15bdf292520aaf05659b4b664749d29bde73837fd72c5bc59f4a04ef317b9da5cd1435bdfc1df06c9d2f3e7daa26424d44f833387ed09fc5cd75c8a5c3b6ed4302b2937509b29d8cbe5a86bfefaf4018fa2e77081a51890b188d6862c9e1a0b267a5e52f30b9565ff25bb1e5773f8e6faff69bd53c8271a159d9849af3641cb4d9baa9283de3fd82806dc952b06d6db47ac43bc162369070b35af4ba74514405c9a1c6a09f77f1492dca2f9906d5060fa105a4adb9d9c2616bf60182831927f9840f523d177edc7705d31e9568b97c0f6d1f1138f824e71ea3049208e29c979e0a883ab31816ac61c8295897b657f798a7d85db3a30f5506b35082cf48e5c92e0cc516cc19170ae2f6b85d80c179624e5b5b5c0c00a3b8135ce77110f2f8c5ece3f1262f721e260241871b232763672fcd917090c3695cef158932557a7e5c6ef8ee48510f1b662514ba44f478465b205bbc414e00972355cbd7fddd46a332a25e83696116436354c111366f10f06d3bfaa2d62e2b8e34fe5b8d683c78f12740bfc31994fa9b0f9cdd090dfef1894f509a4c70722d9c2c1d24c66b07d8d204315eac574e359292c98304923c5f91d33bfa1688fc2edb670d574a977f2a9cc2f65dd9a7eb0630017eb1ac12c86ddf9293be47b2657f9ba63063cb13ccf8eb8c3c171c5ea73b6d8a86a8be72f594a361c3c67e30588153de021a080b36cf4202df94a52f481688dde8c6031152ac190e8c0b2afa612f4383808aa868935eaee230170c5e97fc1875a7278137ec8c89ccc785399c3dd9200bdd281b2dcb9d5d52edddf9c3b0de62e260ee4edc132011c01327e46ceaca438a8623cef8a949c6f36c70c6c2cc65951aa83ca11a3fa589b62a59c5c4d6cdd2f5de11e3ac8b446e37e516f53a7c2a9a96c2b39c01fa497836c72585ded03aa5284a27e3c48bff1934990352dfc6360fc5998dc2b36b9bcdfe73dd2b1ffa2671385d8447d9007d37e52661e2426aeb512b4cda45e43aca6810b134d1d76257bd55715dfbb48f8a23e84d62f7a6f6c633209e44fa01b6a781b700dbc044136cc4b95e1b8c950e296151b524cfa43bc2fc70d7a875f46a1ddf2c48d3e971ebb34961774d80558336608c685a5d4a810cd129e587b8b4403ac54cc4e4606eaa1e7743799fbdf35291cd0fd13d19f93990b0f4a7c64260135d2c8c744ff1bf97c7b29784a15921d2391e9b9fade2c37003f4bc88cc1f86a732b010d24c866e0ec3dc00cacc304005d0e51b05c59780c8404498515c9704242d016f0ba958176563623a580d65409de2eb5bdc514aef099f98604f18d167203da6b63811f3145948330aa4fbabd6c7c13a5c1b890a20f06511c3ff948392716f892b85ec0da113c5d6422df7b6e7e4be87176ec8843510b9220952cba2f56d34a05a7555ea5bb852d6271e069b6112f12b67c0807ce1d343e4111be02c491db372717c9e7131191956f4af7aa5a30825b37f7e383d23392002bd71c7dcb912595a286d0591a63a1f954041ee221ed6b6424e74d31188e3cfcfeffb82f0f8db8a30c1d4755af97c9ec14e8ffdb1f0032acc228b2a55a950ed93c569cff42b45a9b9600f1d1d92deeb65b23849e6c211d810ba9f0c52fa627ed8eb63da1c53ead097643b024665b1e8787aaf089e6db8c249cb99326de82bff08c3168b3c49b576439b9bd4390d7c74c2eb8cea6fd8e87ea90d377525e264d0abed5c8ea496a629ced706452be880899becbd189391535d8db6fefaf9ffa8b16ccb760ce08a4e45312621919bfb67bf860afa15c4726b645e16bc710d1d359aa66c43755f5a1b8c12721fe97ae89967bfdd5433626c6a2997c2480cacc24a616df5bb3656322af97093be8e1c6b077d00486db8f1584156e1d7f07f92a3ed3b61994787bf7275f7e57e2279facea1fb9c58a3ae46b7e60e258b80e7c2432e1205744fa85f502e88b095b00d9f9e19cfc5c7ebd5b4335a2292a9d7edf676d0632c6d7d1fe15f6f5c3e90c1713b17f92c4d24814664369ef3fc2529a38e62d01cd1f4a5c33f38eef7162c9eaf93158259706a0652f6cb5b6579dee87059d4585e76c706b43569a3cc4267a4ddd920aeb68ed12a91cb9b8eb03aee308d1a4851aa4f28a1b550b6e62a000a63f6e8614e804dc8d29136af06328c60341e760309acf042193968499c410944a1ea5b215aaacccd7de9861c580f5c301a73c5cda09d3148c2c4009798b8a38ac8d976e08a8c7611a5ea491a76474b99e032b4bf084385ef50ef16fcf2a03d644453ddf9c86766d8293d982890044d80c1a50b0af38bad908447417b1d2c8db215b51dba0c38bb61330dfdd256dbc20e2649a7fe802041fa251eccd88d432b0136178644157a9886256ad4f947bd82d82ec7301ae0e656c094e66e94af36fb6c913ba74e692ac2f53de0db2a424feac42a64bf685e3815271a704b9d94d15f7824e6a6146b4cc916f0e8360ddea786c0ad0f238e15ab3e08d634ad1a1d7840d91f65521a5155a3654ac5daa611db98f674baffa071a3c2fc188be72aabda101e18325621da7b23f344e2746b82a6d35a895d64d743ad8bc7b68eaa4ed681e742212dac29b13137bdb928a86b76f427074cccc05f94dd653fe712097b28904f67b6c55b677de3fe0f93f8c7d094729f497bc00bccbbc8768477818b50c0d916e01dee510a1cb2655a04b2435d1dad57c68a717106ffbc99d2d7977126f70f138ac7bcad98c378eee69b5e17018eb33260a7d178c6f91062088c06561f30961419ef5487d7bd610eec5f3c279156f4bb658fa15e4cd748bfee5644a0ca2c0ed5185c0b35dc570fc382aae68bd5a954dc76938e37c83acaa7c7bd5d15aee0054cfd1a6f8af7062a57956515635bd1dafcf85b1acab6f2d961313808d98118ce477bea5dcf6ee3bd7ccc32c4ee0b9f01753f0bac7cfde44080ba663ae98a3514d08a1d1d4ac5c4363751a9af56bd0adaf51fb56c3a46b66c31318c1a20f21f1bd304b3c018f25c8eb04fc31f793e671139e88f6fd5ad994c0695e72de859850739dbb53a33943c2a8c052d8f423200795032b77e3a6cf3f2ca069163ce3ccc09d76a22f8cd7f2b313a568456b607796c8c2a0c7973c00c60d2c6258a8a89be82e09945184e31f9dc605c79da49a535faaf9f76978e0893d46199c72165bcf7e9386cabcd843ed3548cdd92c7e80fd715143be7942dab09f71f7ea1e420e13ce9f0f9570b030cf01cc438d828aa7f7441cfffa8056936c9452cd1d349781a76624859600bd0150bf2ba50649d86b9c9dc637090b9220f179be394626f59579caa0857e85963a667fffec51c1448c5a1ddd10b23c71bc3dd837212d28cf57a33d075dea24c2385faf627a41c4edb28058779f99417f98a9fdf48d552e3e5f7ca173629d6f10a3a926e4e58ad84269d64039bd4b8ca4305487364f6d87ff15f3d62eb49718eebd2f0497d212d3b310c247bf191e54224c920b15821143aaea7d65b73e3097938e2d157317fc74cd12d7734182d233066f63c240e658fe5045d328b4270d4a7f9d5e4de48e9b30ce3e9bad4a98d263087c046a8cd3ffa88fb643797cefa85339ec95e523d12fc193f7cb80bc6eb5983025b1a5ebf8fa8dd8ae9b9d9c79558e1374ff5bd7261d3ba42a25f373787bd8c03cba90f39b04fd7b376ae9c5b19ab6779913ed80c5522b589c40a643e85b2ba8257a402768e9a072cb15bb8f8435840ee8a9784d8cadf4eaabda6d091f2f8177171a5c5d474bd242e3a5edb5a98902b0814029a82fd3b1652cbb00290ba5a95212da465dd3284d1b47e6a3b145ae247fb787f617b2abd21e3a4f13a1de1595eddb4186b1ceedb872068d35de3d3f68cd933bfe6ece1cb0e2cefed93e047b9a23033bc0c0911a82ca9033718cf705bd6b4f4180459932d680e276180eca1e6fa6966c46024e0a681c2f2d3d5be308f8c2f15d8812a4e59412ce14d205685ac7c647ee543f2077015a6923b205ae81a585e230ed2def042a856601af062e2e23b3973472b7a5d06e345695008a26f62061a27cd182289ae8ec5c3657baf48c6e0fffa3f3d718c37fc85bfe0a7f46e77df5e2862fd074de34519ce84c97feecf6d693503e41c3bd65fbeca16f5658491df1e0e43344159d591a02dfe4137fc0379d67215682f90cc5ab5c601987ec9967e03362f842e999a4a9b70b3ef686635415b647fe9e0903937159ef4318cd03161725eb2dac62648bd37c96186a89b70dbb1466477d785ad447f31998921d46aa6eab8bed8fc138b1e6b3e2c1cebea9143e6f98d71bde2bd67cf69f29bcd44ce090ecc0c040065ad3a842439a78e6453e6eb2a68347f872db04787e819e9967ab6740982831404803072779af9c72e19a406ae0bb83c53cab7d8e0f11b82857b0c0ab3ec2f00c521a9af40cc79d453b5c7edc598eb158604933cd573a4101ee4cc792bc37020eb422bac22bcf690fb60dcd359b0947d2d8bbb31469092ccc6687bbf0bd0b7ce06158b23371857d4403cc09a3d5902073cb05779769370c1944966878559021589500a74ff284bd2086cfcc0470e5698f02cf586653645c0190499d741befab22ebdb6fea923c00104d823cf65e8e367674981408583d312668c598521b7ed750d60e9c8d08c1b34e73726eb453f17609d9614dbe2b154f44c9cca3cee64c984432f9a9feb78aacd02c9bb487eb8a5d571de64aefbe72c1fcd75b057b44da0126ceae42f673530ac816b0de9af597b7f636cde8c46c9ebbb749e1bd98a746da49ba450a99e07f63035e5ea2845e10be39ebb796ae65f6b05e5fe31872db13da5a96ad83f2086b682b49ee9a47702aa217ceee9bb65eb58c898f5c4256396f10180f3edd6865b07979e2b6430964b705d21ebf4095521b758877cd5be4d201bae17f3db8c1a5cf9c62155cfd06896e4296fe6cac5809169ef4bc175a509416b5736066e3cfb5a736f1a085c10e8c2f9dfec6e501aa20dc9b9dde57cf396492773ab02638f79569e6df6a7970ca63290bc1c4fbf195be6a19b67648f44ebedca32984effd594f976e66ddfdb8f3896aeadb92030a420dcaeca5193449fea6ebeadb0b5c4c12ebc4a19d93d7ea427af080d68162b0180df062dac4046d981ae0e563c35c7b3fa1011e6f31be7c1d69fd9b8d1b3c3c35c6c882893549fc4dd9a8aca56d1fb5557e4367056995369d4bd60cf8d73b8908e2c19aa66a0e3da1477f443928e1ab7f7c09cbe6551c3df88e3bbcca6e25db569bbfcd3ecfbe5566478dfd649613270bb3bea387b3f8e9b50f69e45bc8c98798ccda1e5dcc9b357fa9788e42aea39e1817215e21f6068597e50969c9a246936b458cbe834819b52d372503270ed67d2cd5c4e18eab17e5dd7d9fbffb4616795b19eb58e6c4564e72895c75a933fd6661639f389df06bdf051de0f743b8f92e41350477062962bdc297a5a2ddf5e4fc10e42aa9a69f747c60c9717a017eb6ebec901ad12a33a96431bf562592b2d4aa0844991d19a1a3e500d09acb256b215517aeafc39945dcedf7bafec736841d567dd5f52662b9328bbf0a9633a906963ef864c6645d26ea485a0f313e76f4f050c25852606bcb1a0321439458d2fd8ec8904a0d32779daa755f04744772310b5af0832c1369e02643f7515bc44958061ddd79b23d85e7f03af6da0599d1120d6752014b77cff1f6b01144af73dd04bd68acb16fbf1621151f4b268e3f01b7804f8b5799c80800253ec9f16692fa22d100e60edd05fb4ad552648dd810b5e6413308beedbd86f32295f51d86b33942b006c26530d7c0ba17f98dcc16183d800df5263f93494af8d681567eb4e57e14fff78b35ff3e5b6fbe08b3d3ee764fffd111df4637ba1690f2ed12e97ec8f749813aa8f9e3109fb58e592e80be25d4fd39b9d1ee07b86de2ba5474a35b093052cb80c15a6ff25f1f566d77d40f40ee2e2e97bb5d270a4b3acc2378ad3d1d1527ce4f53251dc00dedef8b4eb3e0ac5ee64f75bb26536ab56f0a0c5ce619ea78b5202f34bc747d1549c902f39f0a6e64193781a37c3dbcc1b7268ce0c70cab4fd6e2fd4684e9e475822bffe72621ba66c062f1331b78a251ed2865df8689b140e2320d5a5c87c16e5cf62e3efef5fd7fefa5533a3cfaff69cbd4b74a43be4305e5ba17d5a2885a7f2622b84e5feebd3ebce74ed059bd877d41a85da3838cd302f9a63db8eb8c5112eb38aa97eb5656fcf8fe44d9dbc598c167414671990fdfb901045d301644e491d06eb6053b14981f6599ce8a4324268cb9656bfbf6763174f1bac118164c309d69bee535a10a0217d04f87abce312e8d93b63e52788d800c4f7436aa11077fe9d5520c3bc0dc54129a2e5c82ab2f4f80f417b69466cd949af15460331746d3d501c225c0abcf65e53ccb64432d5cc6d8511af1aa829a6925bca1607afa7d5606e2886f29cf8584f67d011dc9380e9b96c97aee1e59a01c516abff84005f1dae727f879593085b937642a8f782657b7fa5ecce459a94381ba970a3a7238d655f3223d35630f7e2165db21d1431e13a8824a799223e84fc5bc91bd44e81b1b7fe17495182fdb9c451878ab6a6c35773073aee89a02126a807d046a5b58aad6c77f53b5a55745a0263b148e17c5aeccaf638f510d7fe14995ee89a241f74dc0d21684e6622634896193e550ffa88d402a27ecf22711b1ddb5865a222c6f8857cadc740dde37ff013bb7a86bb8a92cba8a43faefd2f053d0ac55f6761d5916c542dc991c67b611249fddd587be3f75b3fc6f46f343d792b7439db87cad46642358472a665a25ef4b3a88c9294dd5269b6df26f5f9512c1e37e0c033763cbcea5637fac90802b50360773f0e4c88dbd7e61527d1658e553d8e8f12fbaebc370d530d2755907eae1bee64deb7ea07e6d3c2c2d3d5339c2cd91baa7c77a079c550eb8ede0dbfac298fa5d5bb2ba268ee608a8dafc9ff00c7ffccbc2f63c1786bb88b10e1c97ff3a29330f2c66055d830d29efdde50fb3a56d08857edfdd8d30888986a7c209a1773b311677172f1ff5d69d8ad92884bd50f6c9785738af6de2c77db9e5a7c3bc898ad269718304309fcb387ed5abc224c3a2f9fc15566ccb58e566058256eee17498df52b637a06fb24d74b8d908694130f55b8439b03b503275be668bf7dbff5dec716906ce3ffa36b4ed8e9ac440b82e2332368239e1e464400d319b9df58065705c28f24e92b3333202d907754ed3e0104f4a087443d63632cd403f78c30b127f9a1fc1ccbcef0969c250d5cc8a897b7bbc24b5967103e2d213e9b39b59063bca900f9594b7acdbb1f12cd37f60abd9af89783765efd7f08785621547d41e9cdd38529425216274afae473494db617296ee71d8ae3a55f5f4b98a0ced064f733d13b14f548b0e5791d62fa1edd6ec615b8d4fa627c9237c02b01c2c9ddd8fc05f7e28c68368de0c554be17ae177f313b3643733652cc10b8612d067364102fa6664f5506023a7d6f12ce8a9fe4cec6c44a28fb82a164597d5da87d71eaa2021b05a60f453d9f755a0a83e2ff3e6d13f701c4a47afa744f13a442bfec36c1545ee2c7d6be8850accb827d2a9f34f0804334fcab93cc2412260db3ce0003a72b84d92fa0374848cd6774f441800001d81a3c37137f2ecceee332e9b1ac7d813b67a6796662ea4ffaa21ad4b9403047cb8e14eb861dfe62d8d668f964eaa358b69c841221a1442a195c51d5d912eec27ca200ba62f6287a6249191f3fd7c89b09a70bdcde98ee8ad98c28bf7dab894c18e6eda10c1ade19167bcda8eaab78cbbee41138bcc10daa922ee2c2a58423eeb3c99abcf085c22bfd2057d6dd863296d21be583ccbd6833f9f9b71e8d0161505a6d702a400476c33427a75308737306d96a55d5c095166756aef22a93b777194ea2471b848e81da4011fb714839046924bf564c8dc9bd05051bf82b1389a2da8cd37080c96a17fbccae04f35e0c43ee8c67b26ada696334996857bd33f4d117969c1e7f5d33b59d808c9f4f2471c159de525a2021901062a405e0f523e2f1a0191745bf41be419eefa101b10266de4b58173e11c729395275091215e93bc97280048c55063bb55197239a3212ac02c55de5d0e2ce6ec18a397b5154cad93684414cf4214110e596749ac63366483bc13a6885145a2208373a473093a31a067933c399a9ec5c2ac12af1aa8adf184129bd7bb3b5329f819c5d0f1294a0264b5962756266f8a50c19020a4295275503a108d6ed9afd6688796f2ac3d874169335c80411c5c2c072f8db4823464a7bae1f0665d850fcbb86adf4704db0d014ca2fa5cade9deeaf88fcba43c75071e976849698e67a1fdeda1b4accc106b7b1481f30d5749636174e5678fdaabcc887aae5d7b0f4d246d8c59dc8be232ffab5de2cd153552503e1c3fe648b39b17869faa521f34c52e6b3e42ba4f937e1c03e1891ad8e33469e22c4269138e733a864be404dd0a1b2d51353eed835ad1e5e1ec0b01715d553fdcbcd7721f532fa74e45a5190ceeaee038f57ed8b9943d019c21e82710e6a4c86a41f473cc95fd18efab697ba52e948a9f8454e5c16cd4a18f59856875f12d4024ec8dac291f70a8dd20b97141a22aff9806dc653a13a3314fd55b5d058d53d4bcee572007bb3f4486e2271424c8b213d605fc1e5d075e0f964a40133284b764333d929549f149e46b8c2d863379a41532fabaa3ab31132a9c3380f0a7b29780a1fd0070ea9dc2fc9971dc26a7326f84e02fd8d92d1b6e26ecdeb53fea475126c4ae444bb9a668e8648f1b9c1c3013fa776f6946489aa28ab922f1b82d2d7a0b09630d5005d625a21739f1d37fdebc000843e84462c7543401c9a028b0adc6896bdafb709d9cb81a7c7eb7c689f30f9b79fc3f7b28218e13a7bf6b2b3ba5ff437c216ee40333eb3335ad86fd9c1ae37a2f8db66cb874ab4c93a5c26db0fbbdecd95284203759775889bfc4d09378b7e95e57771ba82af42e081003394fc356b64f8c96eba1e9ce0ab5c82063eea84478a19d3e45c5f5d2804ae212749f2b61882199050d3fe82d058519ee8a6b762330452fb68781f2f98aaf8b679b0da4d162f14f5a1c504ae915d76dc4ea146017f88468bfd85b545c1b722fee52c2a204b5c2e2731c4dca863dbdaa4730329ed5449f38520aa327ba0db0d58d3361f02114ccf53184c6d8301fb83ad09369a1e458e3ad9607174b6d870aa75075a399ad8966c5e0439fec1d8648f4b69ce250ad4bfed52f2cb73cdd4fd7b7ff867e6003758aaf480b2af04a5ffe65f2f5f108a9937bd897b94ec59b9d55e10d81f16d351e30e83f698ed87ed5f918d82f46e06f86299f4a9162a1e78fade081ac963a26deef221615a8d6ff3c93587aeb8cd62df218e07e1e95738490321bf8c166d1a9a90bc9d816feaddf334c9aaaff4210b8cd678278b467d4d006948939c16c086304b93c658e2bfbef3f28f35f9817e754799b4215e41ca04b532cc001da9924455887599c2083ea39a9b55d011f5283aad219578668053d15063057db6ae99583c89f744bef23d25290699fc2e1e440cc4fea2cb03becde909ddcf7e22d591adae4221634f698c0d7cf0999386cc851148f740c99faaf5d47d3aa619a0ea51863482a4fd3705ac1ce2f6e99fb2235fdebf22bb6eae3404ab61b748e1190a65560960f2b8373d8dd011a0bf496b4a9f1262a38d6ad82faff73f50ed2f18cd4e8118ee3672506002da6fcad523361c232ae3762ec8da80dfd725e168c6fff06c44486b464cb842494cc0b99902d23d6d0f766ce3de2ca2c397ff24a5abe0c1de59926c566019dd68ca1354df7421fdab3dd13405693f7fa85d0db1249d2cac77a2b0ca69a67802e5d1e44f4fb23c867503349b9d5c58224ed045d295661b70648292dd08356a1a106e39b0ebc9aa8cbe710fade98b2840d8d0a4776394e7e765941d1b02c8ffce03c0078637938907010739719cbb6e39f68b12d73b9bf34ad81f117aaf4555cdf15344a78a2f5f84f103ca2113ab6cbc2b3c84c56efd08cbcdde521f551192b513a328bed007546f6371b48c5dd90224005cb8ae2d22bb0dde5d9a6791304bd86403dff36188b4817ccaaec3c6aae0abcf8e2ddc2f0d9c4a70948ad9d7c5af1c1a1dacd151fa2151f303b41d547ba975d7d58a83cddc9f511827ba9d37908519157bfc491cbe1831639da7692f385e351a324018cd46978d84bf5ab8e87887d79fed05965d38e1d0e3c89069a50e4e7cdb6405fea09160013851a49298c8e477549571a2fb7b5ec088093b1703c78b787c4cf01b8a78677be8e006a999caf71f3d71f44ba11952b4d6a853e2e0748514534bf46776851e2d168b0ba75c5456b870d163cc466a3bd9033d30816c1430005b52e818bc1c5fc4aaea1d48089b2a9ee8d4ba3379c3444ddacf7dd112fbb99e832dda6c70be4f00d192f12d1503bdd4ab3d72d812c5992ed550dfcc029ef47f0d31dfdda0355df3312632575517bcdd0ddb223752983ba90c2356266c531510c77b883e2dd53b898fb97065187f63ad1ba9f70e94f90b86c039b4345dd4db1fa41f11569652c1bb4c030422d2379d410386ef46981d9f624ab32187f0e502022f64ea802b30ec1564f6566d68874cb3521db7750d6603306005c237c289341a4c47727b70c2edb35024bf0892def876a8f878f295ae48253ee0a8842d154b9ea4331736ecb835804f2820187d51d3d075cf619a2a9372933562b49d00817495f756018af8017ba1c5963dd6c0645c0616c7836f3866d42a148010d8405943d40a27a487f7467e401cc23038188192eae3272e5fb1f2d89103837396e6b602c0bc3efc8f81402fc19ac6a8eeb07634ff9043ce481d82cbd244e7d0cde97369bc476b6844577873f667c32328a9142c3320dafa0828f84a08e9594c8fb8c4bd443be7e62fff8c8d1e4844bdcad1166c9bf57e5c8b8880137a83faf5af0a2e4e39c58ea1830e67a1bc6ef218fdb7d4b3e771e507ea8d45ba246e3f8c00c92d899ed38ae9b5fe590f81c9d16752ebd03aac2a7ec3a8e44a83449ae858a4a0181d0dd8f27393e69716375c6c68f4c7983b901c871b6036e3c91e3d783d68525e8638c9aa29ccb6b87322694640fc3ce7f25d1406d00925b005116f05d50199f3c0869cd30d3e0448893136c18a36a30879f9eb1ed54fbc693702c59392083f3b45712a67473072fd72c161a5d252592be9a0f92cb0ab5583b6d9584d5e255ae0027afa8b1999d02f36efaaa248aede712151bb763a8f3edfbd1f3705f5abc9c00d11d79f2c1496095c39d2c94f124cf128316215887e125cc7dd5c2e720842a89fd650b4986dc5e9b38ac5ba45c832a9962586be7eb9ffbadd7053f1549314f25382615949285ff956fe9a5cf4a2c258a744b736b0084a46f93c57ce53cfcb6a5926714ce1fec572a4933d8223cf3f234d51d959c3babf9bcfbf04a8c01fbc3b2d1c97b255e81c9db570d5c299460a81d7609250203a1a54128918619fc64fd76514df5ce18aa4507362182ccd0318a7a8548b1f6207343e984ed0bdd80ec125617997f5d10b36e31dc8ea28baaab41a89fe4edaefb8df059d6834912e3b9665bfe0a7bcc89e5f587f09550691a0be0c9ec3fcab8883817027ca2e93521ab6d4c948effbe3dd1856c007dec2357e910a0f96ef4e7344113cf012730e91f506575243755bfa3efce48dbbaedaf2635c9ad458f3e190724677008df0be7940f676325420fe04b9102c554666db741abe606c8860a842571aa85353aff3d6eb4c83b3d736c11f972ffc7b5a4efe25b07aa95f5f4f13c5bf0980582614d2f18447b6d6917787525f626117ad00ca96703fedbdf6c65a0f43c370977376a6a438f0c09a066a2e4d14aef055efc58dbe6f760bb70b4fef77fb7ef762aa0f2de6557001ead12eae4dc3c00cd565180624563eb63dda227ddd85fd71061f839d917a1ba016da36303a4578633a1b033cb6655d84b84437d08a2965a7786b6745342de386f1d8d541c58aa4fefa59fcd5a92134fe7d7b0e284f7eb2709ad4fbafb3e113e6d306b69e7b372b8f4a0b0637322f889411d1610ed373dbed99fa0f7ffeb4fea642148bf66056f08fbf33d00da78f640be376e6d39fb9b546c2660e67c313a527b649340a015e08b642cbecf508d37a4709a26777897df7468da2b6ebce3c5aa4edce45a4d8bceff80a241c2a98bbaf7544dbb2865d3895721c28c03742045a8b18d5570232d5a1d246c492bd10e618ef661e850e7d03206fa956c50fcbbecf6b9a8ca54a1168527c65b8a028211698588a278cb77d3c0d5a781d1f60a9343013761e50374033aa1178e79c01edb41a45044b599778bbf9e2280904c7094be7b527861ded088f38f77787d8bba22019674f5e4d3301892d83e8e3b95a099850b501103af1c693fd8f9d1ab552e3c8afde47e7a08b1bf9dae336d3051a4939383ebf7703f8b468f9605b5285093ff8c72e2708f8c35600a60bdca4018fc64c8529a93b75c89a3adc19505299b63ae2ccc465f97af1d8f004d270a44396b825277f561df4ec2591157a04976a19e0d3d5968da76b911facb124a110e9f69fee4c9456397e62023ad978d2e2432fbb571e82be595ee1b0bf91b2306845cb893c645a5e96f8f7ddbee44e4be56ad3f7a4bdcc2615097b1a478ebed3d1f0fd69cdacd341de67fedf16fb4281e46ec3796c5b691af91caa9e8bfc02fb9008fbbe3706819060f79e0ed333886817e77b1ca0299bbad6067f029d7ad756e10ffb4fcc859bcd7383b0876d74526a7d9c48613e3c68b077fc08c9a097fdd639506969157e0dc0d2063847049965701c11c9969d27738dacbc2c6bf51becbe57d285927e0ce7e7a1e34a65b4709ab4ea97b9f0c75c7258648e832db188233a8fdac4677b6b41dab7ab68576d60445a202730e574241772b18f708ce665ce5babdb72b32c676d25b79755b7f610c1fb273b2c0f69841c658b9b53de09c0f706a47d47189f6af0ca84bf8216a2a7708f2333bff1aa756e4c9b363b82812b174a6be5a41aef812e6652c7f5b38ad39dc0281728b718e5c73c37864cafac5cbdcdb4e6a32726489d6b34128602c52b94493b33d91caae02fae460976c1c1634436a2c4de988453db0140a471df30bdfd072821f61177f9906662022f859bb6cc3111591e4e40aafe151a5e1e417bd4ff4b06c502ace1bbcccfe6b6ea718514db3de3b5691a74c104c723f85912f765bd7a5a2df7b593a03297728440fa2904040b9e1135d392dd7e46cc03791f2dea47522a5d3df7cbc86ee4d71830e85d8d419b5770640c31cedf2a91c466c6a81228dddbbca19c1acdd00e3aaa0b4fafd0321b18e8faf7d0b69432d5fbd2518174628112707beabf06a63becf0bc4bb74f75f75a54ce33f29bf1d32c289d0de7d52cdc5c23f0c344881a3635ebe49860b01059d78933385b760f8bf4995e714d18a4cb4de97a29b38a09a08a6e82f300a307da5157db5e286ffd6b536d6f257a5419b12caf755589713948af2718f3baf569305cee4a3d7419933a69910836187afcccd243c0aecd108fdce80a2470ea961192521052fd468340cac26560e62e2c9f8101dd501a88c594d740c4f309fc8210a163c5ee3c82db15cc519747205e0762eab09d9192d295723decc1bed6fedb0a1a2404a50333e957b9ea87719079f5267610f994f93b3bb45da515cffc646df9499febce31bac546180718598c8926c2c1d1024a545651ea7899ad467828c7ac04f9f20874f23aebe6c555a031d7823500348007a29f06c1186c5120d819536de078a4eac35d34465d2a4f858b5035e0838df377177394c955bccc9818d558525c92587ff342f55c7280dc414953c9793fdbad59f5f5d5c0cdb5d09f0e054efe17bcb5dae2b6460dc3f6fbcf50149e813d094c884d11c82ca82713cd2828b298874ca01028972807e45878d87ee4741cfbc526b2c3f87de8c135b27873530cab60b09c6ce94c29c2c39a2fca2b5405a79824fe6812b6914aabc132c3209542066690ebcb1b33c643718d90909b129151a72f50ddd25188e16d1162fcf937a84fff7c8655712f8c9caf066e46fe41acf4c32641b8228678ff1ccbe2890b87904f26ae5c9c436e7bbd9add8b65c6033a35054cac38cf50a14b7822e61f56c21532d8761364d687e7ad9cbdd3215cdd454fc445e95721970cacc6a94f5e74df5226df1dac25595c798f5243411d4975f81cc6e3d68bb2e219fa57459ce552dffd13cba48230fc79465518e3264f4f32583d76034da808cd57b2e9f155bc8bcd759e1ca07833dbb9f8ffa2bb8d5ab076d378726ad664e662bd857b31e49312e5ffc174e7de75d6dbdca7346fbcd7e3884dbe8b5c5cb223c6e60a22ca23289ed77fb63111573d126b499905796b2881af8e8d3c3a4112ece5042ba237bd1c6f931581f1ea5c062d3bbbdf891a2b92afd964d1f0648e9f11a5d8eff25f19a11db30b12980f47fa6294c67f318dd86971c94faff7a0581ac2d0027ffac050c8350854157f907a0a5effd7e4d6acfd66de557842a7214d16a336466ca00966f30bcc56a1bd9f1d27b0886cc3906da39216b4dfa472b0769feee104d5e66b6b49ad78bd2ddb6a972dc53d17dd4e377a8e5cfae707a03619699408b3d5a76216533a561dbafb34fd814fea1730a1381dbe967cb063fac08511e6ade2a7eeb141e0108b744518c9700540122ec6a84824f46fca166e54d529bf529eb259699408c07e940cb64d442fa4754228542b2578dafb2fbab0e923257e21a4295a25bc5216f598ac72a0de9c90592690637a5ed742bfee5a853574d86d68a0baa031bd7f11c49218ed3b87c548f55de9b09866613a2ac32f6db5964af421c625e26d802441953ddd0151f1ac615d139974e0801ce159606228a95bf62dea3ab7e985da600fce6587e90cc2d95f27805a4234bbfd9d1603bb3f7f587cc9a904cf309e00a0c9981feab611d7ecc0dde79caa664ab6ad5e404e1b80e232664bd839db17a881fd43cd5619a13eea1359d20a873b81dfec20da8fdffe1312fef3f5627bd30b165083ed34c783488996b143a02218a327e1e23c2d18bf59616220e54ac67080699192fa01d762aa45aa8b4c4dbb39bd2c999a3155ae3b9083f9a3f10f9063797bf7a58c3197302b718f7d28d3877106d86fcf16e9035807b90c8cf60fd3a8931bb00580c8e0a3a4c2bd5aafe472ddb9f37e8beee9879caa3ef8f76637fef0ac17abc70d6d8aea2c189b58ec5452f094ee51798120122394a52a428e15aad93a25c6e07ae5cb4716f0a509eaaaafbd153f76d34a45a97fa58a84665c901584b8d30f9e2f7520a4c14d08f37b4d28d687412ea7cb8480d6888b1073d337fe8dd56ca368ccbeae2a7494c47de5e9d1c46c845714f28378ea7e195fa4502aaf729ee2c620bb0785343de473ac5e83d715ae07f261a809cba4073b8ea2746226c3c511bc68636a339e1ef2ff90a1bb0c02ec863484806174e311b125d4ca343efb0e5c964b08908c81d1a8177d21f9a5c7c5d44fc2c6946f94b0ff409c9cc3f5f282ce29104344c450a63ea8a82ab62949a255be2dcc0283176a07ac020147f58fa20a9d512d3f308bcfc11f6d1e8ea2fdc84bb47910a600a178317570d358219ef34240584cb442d981bfcd6de4da45f7e0d2ca4e549c01e26388fabc12e8dd3235544b217570462aada7d0aa146c3cd8204552878f6769dadbcd1c5091b2b2a02f51efacbc0dd814d37da0b1f0ededec1ba4cbd89933ecbbf9b1a5e7a5fa1f31056bfb1a666674df3b5360c1331facef18b72e61b783fa0e54b718ea90d7ccb0f6c9ce7a023148e80f828a2db58a78268a0fb2148786bd49ff21f26e62b517684dde9862d70acb67ce66320c5d34fe8983adfcefe10fe6744c168a69bc90a34ee46310e46b0465188d453426f323af8f399dd079ce55457963caa2275d13271ecfc9abc681516bcd06c5a03a2082c027d4f818a857d3b0d0c70b4f7e6ab48d0a4d049eaaddcedb64a3a78e3414c270ce2691c725a7647a0979d4ff37cc0b2031ab022a9f6a059aaab9204edafb58b339a9e888f22710e27aa61dc7f0997be1b0ad4dddc70138ed91f70989bdce0500d1e86b2ab291c06c95c16c7985b74f2bf6e8eaf78e3dd0c712f1c0918562cb3f6b63d0883006d4b541af0d5fa8363479ba95c562c485f909a9401e4781e1311a9d486e95e22cb9cb1789a5b12ebe29a77373c91836c7126162a29a8ce5436cd63e98fb6be9c2240525559e09a5ac6b95981393774820399fa235ceb796baa8db27d866ff69969ba9d49913f568f193326a6d9aeb3ca23db30493b437d8f63067a8ecb7ea32ceec919049c876496ad18cd4d24d42a530bb1ec3844ef57a9a6486584aa1ffcb5b17d227012a5e90151e62219c1a31cd965119150de9717f39412eb312583bff1c9e52c1de892c5b2498af6efee5968e8905572e857c007345ba2e03d6136ace0520ebf23507f78b527c22ec3b1c30c48e7dbbe6e97be71ec9669388eebfc17ec5e419d3c87e26fcaa040fc0b80789d64d03f7c794dd1b2a5009fd181e465e9d941513c50a795f5c6237fcfe7208b86ddffa254e7ccb4c89a1a108283f9ab2c1a79f6c983bdfc5b00d4dab23c7c3bd0f99f152b1a1bff2630801d9e56ef0248556036f2bb30f8effd6831fd75e1652dca715f515e1afdb5f7730081ca486a4d3c2db93ae0536d8889f93bbffa5b93a38edf0d8b82e91b50d408899eecb648dffc27bf38d69cd49dee68debdc6da40cbcfa364a573698efca68330a5b6ebe3e4a353c24c94920a130225ee10cabf2005e22d2b2cce881dd19556082eda5a8565bf517f0c734ca393099beeb84c2827a34b3c9eed142bfe5ac8b499aba498e91a0a07b10ae64d172e43d3b8dfee90f362d5dcc2726d2be632902ccf7f63bf95cdc97219e011716e045897e3cc061c9a94bf568f53d77ac72c9130740078879b9fa3f6f63a4b2a0bfc1ac163ffc9e6c549862173c77c6d4ee96fac8237e8f2286b633219923bb6dc893894e8714be81e4e89d4be50903838f746e45831a02427be47db5ac073b9adb05481ee2bef0729e200a2041f4b64199563ba198606a828d2133edd0429165de443248534963b497840fce9587f6e6fd01ec91190ed9eb7d2db4b59aade3d0988c8b197271ee5caeca83b5e330ef8199e5c818a9f6bd18c1675a175e178529f85c019a9150c9d582ba830923f5a269c412a0f8bd7af57a92b2cdf9c5a571aa4f7803c2be4382aaa753959540a1b72102feb7a795634c3c67ea42d13cd5410296a136c7d024ad8e15f5d4050b29a0ea5aa5267382eb52655baf5c5f46216920df8484689c14a63cda7f05b89abf5453c517de68bc7935fdee229d92f7e09dc89db27a559876af3e27a870e52b5e8db147cf7b64ab3fbe48a11c8087da82dd96d4d6e29659229055506b905bc0537464022a847a11ee5dd60038f1ae7bed607adf56c2440fd9647fd0c96168fdd85f25c70973f4d6819c6443830aec381c915fcf66f5cd721f727efe6060677f973de05dce55fc302181683bbfc695800c35a7e010c3b851c279dba7b3ad6c3d3135b9eeb50bf6db2935fea6888573eaa8ba71a7ca0bec5bbb969f916af65eef247790b60584e2371977f0beac1fe413dc35a3cbeec505dec53c3f8d45e4a06d5a5d37b91de0a1e0c5d71b45843309b00e1060be6650500958d0f3c48d5a0e162512d276e3395aa46a76683cd9dd9a3ac8b8d2337a9568b88babb6be96789bb17f199734ed3c6b3a3699ab67144394461a9542a71a7a42b276edbb6edd47264743a9d4eded228ae7d8ad0142014d7537eaa4667a9a58c9efbd22fedbd2860be3f0362a458acbbdc45b1d86f9ea4a4a418b6902ea1e3ab6d0c90f3038bdf31961283318c935e5cc86177b58ebbe2cb8b0bec2eff4bc4bd1c5d42c3e2b77e2cc30250a489173f3086e168a00b2124a1293d61086318c3c0d6893dfec3c671a3585cd13e2dd8681647f4059646371b25d998bb5d48734f894d91c234901206f70d36770741153cde55118457e103941ddc00ca154dd3b4d289863ea31b8a2c954aa56e285096b823d1c1d6cd3d044a4f54a247caaee82f1cc96328d8a8d4f893d43db3293d52ea10dd8648cad67c626e97507ca20cc929679425487c2e682f23d1ed689499675162e105bbcb436498925a4aa95524ae88524a6b690868e848974c2513d7cc436e1cea990ded9836d3367700d696241d1bb7715c33577174872e57d1c4bd8a136c7c4a813b394339aae20920b649746b45dca4f836859c720ee5dca8a40475522394c84d49e9b92929464811e2a64ca78de35215976752746e942c97bb3c8b0203594bf4f22c4a959b8a9fe97482bbc9df14eb69e3ba6b252ccfaa40ba916fe9f22c0a1637153f9f6d1cfb9b9bc6e519941f3a7674d141f4e859ae955bc5bd1e7577fba925d727eeb8ae93b03c7b3244c505f9a37679f684c94d3d91e27a1a09366a034a035a03dbcf3971e2c4c96c369be9a04c2813ca843259425340514047409fa04be8126a843e418fd0133c31c11312c07ceb0914fef589089e88a089dae3442442ca91145a804144193e3c85035f4851468f0b4ab0835ac2a7841eba40b28226be18c224003a50c1d1102f78c2a4054f9ab8b487c8144a34e9bba124075977ef07d70f704cc3ef5e0df1ca105d40815a2d4a85942da1d049122581e59913242744140acb33273f542439414245c81d7d5225a43033770ed40835428d5023b4a746daa3d1293df6448d0a8f1fa89af643251767c834ed91a3442c2839fa5bd797d3bcabc167ac7f5ff76f0cdb2374c0f66fed7e69e8332470a58c69faa3d14685a81015d246f8996f7d94522441592e98a25204dd2005a34a7dad20312ef8b7fd87128de2498e508c1ea162846b34894d5d9e05cd6e90131e982268080f4c1145290807a02b476808a80f354247409fa04e5027a891d657d33408db940e61fdf20ce88b0bb62e11365e9e0155b920c7cdb43e1a6b751135405cb411405d5cffea1f818e62043abacd4411451451440a8aa00089b45a4c06516ba51db0dce5d9141fb85488298eb09efd297ee0805b954da9663afe16073cf1bf6f7d48e2bb8d8d4dacdc5a55b5a6aaa7fa09ddc527683bd65e9e35b14da82a659b3469b273830d85961b3b9e010db95b7357ae773236bb7ba42d2f2acc2bafac6136c5111cd91898596ed821053e8891050c258a9a84b4090f2d2d394a6419e305394b7c7184175388a8c2c510428e401172c61651728812458c201518c1c4cf39e79c73ce39e79c4c86302962b93ae79c737e8d9fa5f193d56d52d135279323774e2649ee9c73ce142c258de823aa3c6266e42eae6c2507227030c50cae6c91049325975226b34b630062080a2aa228b20319c08a30e20b2a84221124480b881fe80650e0b3240aaa812525c86189133e500ed00d2c89dd7a79b644c73e531d2cfd3e8a2ebe2525556249c995939231b84bdfd21ca20d680edd81e2d0a238e890a228091737e5427c512eea9aa23db874ca438ab395ea2431ba4988dcc5975218550fa9244524d9b9e0d7f808bc1d92a0514309144024018319073e20c6067c9ef0005104152a1e4882e218b1f2051443e80409e38ca0223c6c71c4133d2ca1a2034abcf49003151af49440064498f06ab0c48f162a70d24418446834b220b078c20b16c842a0c3159e1c2890a0428819ecc4a802f3690ed5b1f1dda8bff13cfc46c797d5f1857959014065838666f0d0908634a4a18c81f35125ba75896a48313184265a0ef47b4991590b7e66548a66547e3420266bf5124160ad240d1af62b4b664272e783342ec79f3b1f5c451f7771f4893e1a10169c49ab0f9e47ece1369328cea4f85aa19ec6bbb0be615a46aa629ee57d7b60fda0e3bb9a595888f53c22eb595e0f16582cd6b356ab97abe7e13d582871b2bb87db8cf0d3f52fc277fd1ffc085db3ab5f049712c73cea57bf99384675342651dfa9027ed17897072795d683d30a99076716310fce2d2ecc83d38bebe51859b11e9c61dcf91b57cea65430df329938cea654305f65fc56bf923c23131313f330df2da03e46c60359bf5af5ff603d0d9f7d59926bc9c4c0ac3e9b52c17c8beb530a5186166bb55a3d4c0ba85f7916e8cb7a3ea1c0d254f19b5328be581eb8f258f39352077ffd2e2d99189815ab63d680b05ffc66f7e6fc2b140d13f86b75cc321d334cc7fcb93a6617eac402ce65b13c8edfea578fea74c46fe5e5a0fd3323f0fb76ee04ba3c33129af3e8366b36ab572fefca036fb8ad0eecdb5ac56089af665e7527c47835f15b797e14bf6953d5c57b9e19215df023fa8e667238514d7cc91e4e145fad56c7d7eb52f1b30fd31171bd4b5743d398403ddcc6adb86bbe7d0fac9d075a19aaaecb63797e145f3e6e336bb5b6bb7bbb2cb71fafdc21e242424242722497edfe3ed673b4ac673daf9ec562c967b1666ab0ea5e0396ef8c3622bc4b040f842eacdf783f9d00c27f5d42cccf178177f4cf1f815f32ae1a22d4a8c1fa1a2fc3fa1816eb45e858efea58df1d0ba603613e2604168eff991546f7bf5f76db7edff78510c27f38703c8fe8c292c562bdf7e024627916e85ffd587d37635adf5a4e7cc9fc7c4d27dab87ebe073f898a8c5a312ed7d745212174b18772ac4ec68fc5faf9315ddfcd657a173d1c0c3f83913c072e0613399273e148313f633ee6633e85bf38248e8f799791791ed1911c897754712bcdf24019b895f72dfcf76af55d0a29be5855dcc689dc35bf15d3c558fce6e3e8e2cec7d7ca03637ef5f3371a13851fad07d257e663bc192836b63a37da688497bf13e14100b81e74b119e1c1d764017fd391dc66046fba805df3a727461611c0487279cc2e706a71e77ce612265193b002a6990f4a22d6d7ca7ad6ff6df9ac77c9ad7e068a05554eb4f27eacbefb1f6ee445f19bcf731a71312fd3c520f1fbe0c1e80343fce6b3ba08742fc46fbe13b59c08857963bc1ef19b3fe385ed673de8488e145ff2e78fbbe6a3621eac17e5f2f6e78fffa4f1313faceec67b5dd701e9fb1e8cf42611085dd8fe1b0f4e3f713f8978475fa3f8baf1f3e7517cb50d1bcfd106089d57712bf19ba61351b52b0fb42cef86e748930874a46905517c01a05b507dbf249a45f165d497f52c0f6c7998e7e17c575dcb24faa003b90a77c149548376c14f5e701211a5501d385fe5362ddefc13d7d5c4afff739b6a2a7db4150f60828da3c6a6200b72564a73ca7cfeb84d5f99b229c33265a714e66d2b5e00b95074a0f82a7de4aed00553a00379f536ad96349fb22bd1661e89aec8cd5bf240e8c2b6e7430f4e990b4dd9944d99034d99034d24f3c8944dd93c32916831edca467730a3d2537484720935f405126f8c97770089b48678995ff1a55fa79cd3ae7ac3fcb9930a1d862a4877214dc82650fe9b54c1ce97f1e315bc1fd3b35ee51d2c99266e60ebe76641911bc199f83371b6829f1bb99ee2829c94ff637e952efc954f1385e93faf7c59e5bb0af2ddc6af3f2bdf4f2b64605e797fcc77ff5934e4cec7b99be4a20c43393b0bc404c03409f1e9898e61e30561b8c1d29c7e42417a96e6e0408c166f9b07b63cc3b60e85e2bec5b3a1e539fb0cb361fbd333c0f4d6b301f5a63f793618f1817ad3dbe0f29ba9db3ad4b7bc0fd4b77c7f4bcb73de4bffe9716037dca3bced51ef637bd4777b3e4c7ff26e506ffa1b97df1e078603e393074c53ffa51f07c6752fedd5e0837b5bad7773c31607e6d2dd18f1e1f2282fa1065433237518a0065d19e53253b9d286009c43c3c182bd732598e3cac8135f2e0486b0755e8840912bbf829d73f9b6bc96d10b46463d4f366ee1c2ca071b09f9dbccd77a4dd380a4cc115db20685a5e62559882f9e6961e5ca77018618e4c7173751027441aed24298a65ffe7a90840565ad9467b3abbf4abd72194b92132d845cf9efeceebee92032dbd93985bf727adeded78a9fd6c49ae0e5f890d8f8600efe013a01d9f891932c1f6433f80549979f6b6cec2e4fb027a0f83911dbc989f53f3db1f13b5161e54b0b64fd65906d95e5eaf5288378810caebf472573524a27952df840890906a7215233883942320d24ac6466669652a7860fdb6c87333b37179b66f26e4e7f77a7cf9d3fa54e1de417ed020a18cce046dfe1eed49d354ae79c43389fd6ac4a42b83f660c444c5f73410ee3716eb8a95f4da5d2ebd480559cabc92e05d6b8da73d534a65cc6f56f17eeef0751a9e7d303584a0cd6de0d7fead62f750cabb5966a7de16f8cf8287df56e7af88d111ff5dbbbf9dce55f3df7efba8eebb1a39acbd37dba3bff7477f7e95e53a33961f92bbf7b74f719a7c68404a594b28c0b4a29e59c73ce98040b909164881b91d81c1f8b192757107c8daf2c1a063903c30532237b2e5f58e958b0b333cb39279d53ca31360da4da2bd1bc1ff44df7077b327edaf38838fc20659e1e78c35d81bbb8d49f3bfadead40820b66675c8e0fde707d7604828ed4e3670f345d365d8dbabbb38c12b48495cb413d57aecde5a09e23378b24145fc9f5090296837a845c557cc9ff88ae841244962b65d71d17a4cf4c99575a13f6a7f69b46b5a7df4cc33638d2b920cec5c2ca155bdc6debca1ffbf2dc784ac14be26eb1e76ecec4dde4900bd23b7198c1e0687af4ce9797b380e4b934a02ef71be584dc8d712ccfb0c8e2d14dd264324d93899a4ca636994c26535db5803843eef6dcf1ecc8886bea407ed3e35cd9f260e963cb8f167eb0f4f4046a7f6a69299d50287d0b2d207fe99f90e1b33dd739e726e7044bffa3f4feb29480d27ba9b4797ce39740a700ce05e52b915b532c9c7881c58917a1642abd249e14d6aaa6742f49eb9bb902895e71e48a2117fc1efab905d6a4e2b7e27f50c03872e373557c0d77c5ce153ad78a2c97ad98811556fada7fb97b6a8975aed65d3c6749ce2e5677d1f7c0d2975d0bf5f874b9e5de0f1bc350c58fabd6b3d492d412fec11c5fcccccc5cdd55ba3f7cc585e520236150115996a0224542d8a4a004e365b0efec5e24ed5ea487424f4f4747acf14f3e6cbef63a2ad87ced67475dc7c2e63bed742a6c7efcc9021398208a285227489da0260c431dbc24557440b933474608918408ba08e303309c24ae50a1031f8008a233042cbe2a7e4d64a15b2f9fa2d01d628c31dc05dec1cc35073507dc2d839aa5666940298787520fa51d4a3a0495d10235a43b7febbab16818e3e984ff4dd6ad4443d557b7ea954a34a461c94bb154da5a361a5a1a6e4f7dccb8895f58abd4fca6438a03db442377cda73ed020405ac49d2f3b8c5fe744d7fc1b1ea832a3ce9bf8e560e58e8c99ac55f10ebe36cdae1b416e3c48776e6c95dbb6d6531c64e8102af321089907691120f5293d488bd050c65aa51b8fa354da36991bdb8d1b25aa43439aa3e558d353231ade30e100baf3bfe511f9beef0b3226639f0d1b36be69adb5d65a6bad75737d496ee32a7da5241a7aab717c2e1c2dd757eb8d0ebcf1adfaddf76fdca925045708cf23b63c9065adb585eeebb6bd775ab5764443126d3e994ee6489d21a25abf5b1d76cecd0d8eb7f97ebe14227da44c22913d72882c228fdcf93226637247f2acb6980769d87d6fdb7b34482cbeea8e0c0d5bbfad64707c4b06076ac7f2c4a26b3ec7e26786d5fee56168489b87f6c417cccfa73e361ea431ba7385dcf9201d72e7afb6cdfbb1bd677b521d04c46fd5c2d1c51fa0de89751099967723636624995aa6a46f25dd09c2c7743dbcce6381c5a2210800f8d5d39077e4501d1a24be7ab523796a42a3d8cb8334847950c6a80f3a366cd030be541f35dec0bff8e11d2eabcc586cc6925850a53381d83956cc884ce7ec619af8aa259ab8f1c1552c366366585005f6cf0ffdf8af629f3c548ca4d93812e7ec5e9039000b1208f5e8c13438e8f08a4cd653a41a02921db553a72b1d80dfac322a93c93e8ffca9906652a44efd85a7c9b8f1bbd626a34b70ed7357ffac7d147fbcc86532998c6790c59f92f608c3822d13f297e5308ab22d7c2ed8b236e3c68f3c431abaf1fb482fb9f15f5490777aa1e5a2875e89e113df6d9e88ffc28b065c46d1e4822ea32c583a6c9d8e35cf5c8d0134448930aa8960874345475a2c8c5d95000d955660584932695a4d288001e4f0da334d1071e84aac128fbac808c94ad2c60327279593e60c1175510d63873a5642ce72749ad2a7f425b2eaee2d93ca49493044a7acf911fa69d410bb22230697297d4a7f59620231cc4063faf414d4fa355c4e97f36507d9e3d96dfa439f779bd6a1610c2cf8ff1e846118fef708dde673f93f021b866118fa98703b0a7dd033630a46db09bc5f74b85a5d609af8b54b704f01cc821f1e9507d330b160ad3e3cacd6441d9bafae70f2739b1a6d76c082fc134397e02fbf263609fddbfce9caa3e6ab36d663f5ea0478308d11ab7a36d261233910e77293d01f7aa04374918c73a51261fd596895030bc630865d44d20c4949496d14eb12dc6b2b1a8b16a2855a88090b768c28168bc55c10402d80751e0890f19035f18b395e8260892f3086353533cecde7cb8e861b6ef7ed3ef2ffb18d372bbb97266ab556a5b2565b65a93e7d1e6155aa5a5aedc082316ca116ea58237121b7699e29bd632823422d54855aa885bc6ef123635b9dd13588aedb20f02216e49f201deaa8f9a2dcc07c41c2e9ca0b0bf24ffc1e4286f88aefd6ad5bebd57c6e1383db054498e6f178098105ad09f6a7075aed638988090820f115df6b60fca0000670f965f75d827b1d93103fc634b931c2602dd7be08b120fff08821fe98b81610e77e4cd30fc24e6c2464045201de719a3172d151952b7c3a61ce0af08e78ea584cc34274f9739b07dae86ff2aeb4106369a26b54dda5943d270bf1f3a75e8ff8f96f66c4afb3c4cf0a5b230bdb4f5ff322f1f5d2cf33a49c97f63c488cc557dc8943e2eb8556b90e4621d763cff5677f5a35afb1c4cf9d6f63a9125ff4fd3bc9bfadf8f795a953abb50eabfe15e0dc5f652b0f1980cc3055815dfeeece5b5cefc134fef23bcab63e318971be0f1b8eeb728cc4e7e1611c090036d1ad466cffb6d31da3bbf45aa8eb185136b052ce399b52f0e6322a07b63f7ed73c44d8f860c778e22b7ab36b9eae634a2ccee59d587c693b2ea713b418db841cb77d34aeb7e8ee2d650b752d149b3fcda8a969a05803691de369a0f8cdaf7185051928480a2c03c8453330ac4ad1cf7c1ff12bf21111c042ac3de6bfdbf0ff7710bbe647b993ca9d9d450335d00d4fb12084181a52d592c9942aa56aaa56cf83546c08231df25f306a1d3abc1c3a66bc9ad627237d82e884f846454c34f4017ddff745d7fca8e312bb1a75dca69178d44102c50fdf89d448dca66b9dbf791f758d54257ed38adbc410b06b7e84a22699ddf96e458362c19e48d37b82da91b065ff210c5e2b920f77461da699f3bf991cd3843ba57c31c376b735de213f1295bea8774e1d77ce7f1ef19b93ca9d59dc6900764d1398660eb91334e14eff298bc8105f933e9068536730ba9347f556351f8609d4f845a49e99a933b34fda571deca0793230cdfc78f98a4ccac62d5c5c207e13c8e98419e23769ac89df9c35d135dfb4a3f1950fcedce92f335c0f92b033c4d7942eb80d0dbbe613c000f3358f7a334c33677626942be00208a063aad5074bb5a479202700ea15e0766c43bd13c73440fc6079a6c54c8ba21b1f642259abb52ad5d7d4d4e490d30b63a44a82ae085db0a7dc18bbf2bf7eb606d4f1f3093151add6da5cc05d1708439dd8e53b4446ee026ed33eee925f6b96ad8574dd13bf21f16b1fb7e92476c99759c01a5ef9eeb58ffc6e9f294c235fa3c282cdd3536e7cc601a50cf1055620f1f5fdab54d6c6583998295ca0734115ef88b11a9762a814ed3656410b11d108001000007315000030100e070543e160164581b00f14000d76903e5c5630928842811cc6611445310cc3500020c010608c210639e44c2525001a40407b4daf6396af79354994561a0fd1fa0f12c3138d587be4a01cceaa95487fd8d09b949bceeba41cb22b6ace43efe5447fc0c1bdea28fdf3ac299c295ee27300ecdd1a80d74cff413b197e48eb0ab6415acc153a1f3c844f87523cab8c86329706e0791a4dda496e080c0f10afd713417c10f0575810e29844771b532ec04c34e9df92c9d542badd8bfe883eec5056ad95b01ed224d40a9e613787a0e8048317984c3332d034ebf4c9bdaa1d006d549a6a41905b5c03747d33c29e98b1158cb892c5421083aafe5abbd0d99c97f0b5041da20d3e2c653d40e7a8af887b88c8550b8b1e7d30482186b4def072df20fc92e8729e8bc8ea809d25d93909456c2e25f5527aa909a21b37e8f4f5e6beb195ab371857d413aa7767181ee083ed0bb1ec10cc97f2cd4e1c2a348b73e53df6e132c897ac355af2bc7fbc1b82741fdbaf56de61ba28804303915a644d698167361a62a18da1d6523f872d1b04a3c09180ba9938782c28f68278c40489b9464d51c59c01140bfb437c7b1cf3e13a97c55dc65f0c10504ffb8b6c5b1b9a0bcd97f44aac138070b755a1ef8483d6350392be5ea4c4601c480d3a4b6fdd7591b8f6d84e6173c654332ab55048810c34fbc50459ea354d41927de3c4f748b697605c54da1f9d54111cd303b687e4c635d941bb4bb9db5d7c417797a6a10ee80cd35e942ef9167fc560a1d23c21122b45051e8f94325e0c67291caf0bbbee550169339a302b684aa1478ba2f28155b2a38366a5f5d5a94e50f2fa3521d36fa8763b3f2f029455a49719f7c9635e9de3758f46318775ed07ad6f6e8247f499efa4354bf6105b10516937e1806b50633c77f248085fb357e7e2f9f47ab5bcd4b2d6d42b3ee9b92e451a22d5fea5796c9d34a461b14190b0e7f968af7853acaa2fca76e0ad4c572612c962d578539855a596be8a2c2fa733fe4623e31b5bf51cd016fe7d744627aacb656d09d3eeead7d73f5f7de22422528cf4df945d331251cd3781e73d83eec638bec800821732428368d3e2003ecdfaf3cda22a8df677c778e472d6101d2d662750658f2906413dc27e31e5ca9aa4ed390b35ad3e80aea07a4962b621e511cacba0917251f0d1b4c163c85a80d387f64b0af99fc1baf3d42a2c081de7ab8c00d3fe71d15356aec7548e29c3c49f52153b222af3225e3eb5263d8755e0998d50ffcdf869d822a47d15d62d34eb24682f3e821132b8b9be70faf915535513d7c60211c8628d220bc2d88000674a6fa6026a649b84e003b091f361e719d74d33a614b68354f4125fd165b87ef51a893386ccb30fa147fcf0588f7e91882da80d898f3efbd192a959e86f650d8ec0408ee5272d698721ef8c3638295c3d35846eef81c08b0e343ac7a0997b176aeeb83f876bb8131dfb06d20d7cb1c189ecc7707670c623b26f79c4c546b04c03f49f357d15127efbb121cb4358cd6d5bc2a9e078a303a1d306c345e2d225692ffb5b72833e1be902225c4483504a533f93fa0bc4cebe7215f0d925dc9be1e5f5943181f2fa8c22c50fbfa4994d9868c8ac3bba46a6601f75267a5a317ef659e1f449fffc879ec4908468ca500f042d67c248e0b03cbbb4cbc94a1e47ac998809cccbdeb90f0e94c37a5e8b42f93663c524b11c66c2c32d7fa2ecf3b2b593ec37c44bb008b607e951233bac541a00a7e5adbe3c8296649f223e7a8428d54170f305d73da85916197527f776771f691843f45f782ee71f3c03dc5b9d60e93a2489b83218144245a3c0574ec5a3370dd8957f8ac6ab4c40348bff35b03d132b23a8030b97164bfc0e18922d575821d06a7e1e3f3f36c3e29ceeb77ca8d58009497d14f2460ef912f53ce102ab571093292f42a7dd6228d2c229350ebab69834e39a2919f22fec2d5b8c2884c50d2695d14033e5750ceb9f8bfd75094eeb320b5149c556f771c9f3abb3c8465269a37747a739a40d84b74f080f8de749ed039de0d741eaa12b428cb2cee376546c85e02b0d87fb7804d2a8272b958fdcfe0c459e572fb5d7ec9d2b9855026b8eef55566ae14b50bf94314fbb1f73dbd804b19f94ce651deddcc0d11d13a3c878e63d322ab8786b98f4dce6e26d595807e4923c444ef36729897fa7023c6af1dfea230eb7196eaf5e78b54dc8765cfeced7fa66ad4196f419406771e1f6e0e78c9f52b0697dd6aa469382310bf98f93bfd3f0fe3a8789010607185e5e815742ca50e53e3c9cb73f0a30e8072ff377caf6685680368aad83813c765edf9de17be8fca54a85c1687af0d7bde7a8ed5a62cb2f87219bec957aae09f5253b9522c8c741a54f0e1181006aa4d32eeac086d3d4f24b1d0ce9747788df94ce79024b1233b5330de363f7a53bc1d6ff3d410b610ad5b300970c641615e4d1da8838983faa8c2ffe081ce832a61b4777d2caea79565edbde79e0f004a20be86b011cec4960a9ebe32437c041c4f9203d45f6e9084caccbd0a517a0c772f42578b8a055e58172496624597dcade687f7cf65a380a81ef42e0d723d0c144f9f77455fc1d553210a8dfa332f89d611627246dc0b295676bf30d164eb34359e7ce6d3e4f04049068a863d581ecb01e7c8e12b72122f2dcf1926736fdbb41695e9a95bbed88b9a88f61ef04e0a41a1253c007a6e7819aa603370176d807e34c1fb64e800aed829a1ac988046be6c0542a577bd2e093789afaa8f3ac48853d33b43488d82359aa13a98dffc642b58e4a0a698888208a2e48e94f0ce25a4f71e7463a59cf1c943452dca85a4d45bdf14962dd57d2ee03acb9500a4fca7728693083a47118d04c08a066f8ff561a55ecbcdd837dcf3959c55130d31b452f5654962dd9464044a7a48533e3d364d1fb649033412ebb8ec9ac4916c8352607ea03793b58eedc773d6e8c334a8ac8926fe06e8e4ebe811fcafe2e4bec975f93717f1233d2ae1f2226fe76cc94accf43109869f77048511506e90b859463a0b2d197065e7d89bc44bf01c1a2e5e7fc60b378d6fd1575f127870283621d766d69c2175810fd2031bf26d2594d8adfbc1ada8bb7a1c76108102209918bed5434e8a181fb2cb97d0bd1c456e252c291127cfd6040b36a4d0271b1aeae29906fc987224ee2c730664251a1729b1e0cacb9cb3fae7d67bec63b111ada98abea6997b93357a08469fdb894f2c7d52b99285bf11f73bdf810ec3b30ae1a78344fd6d9f48d986cb15c0ef84ae056b9d178869a56f9dc85f087ce17e8ec588b9188db79b7c46380c74776a6753403bd09172a398d5b9a9ce26d7bcd845eabf5068d293c71a68548189d57d4193946cf1c849b5f87bdfaa4160446c09b03124707411ee7a17fcc218272e29a9daf2a16bbcc75a8cb55ed94831d3028a3806a51817418f823bd5733f9a23658f7962cc468400c5e117980f8220953ab7f35a4d1d3fbd04c130717f12e8819dd45ad967f700840145434f63669037fd6610d5ab3fbe9bf6c2a8dfdafc717e4c472fa51725cd3fa8c47ea0237d208d312103e3f3c0d7ebf48e8728f59631ab6c387c6a793fe23d4243b8e00418fe568e69bda4c5113383dad5e8e0b64d4918fd7742014ef52a44944fc2d10ee232004bf3674892414c50cbb2fcb99fae065119381ffd5e585f8f4022ac8991646426808c9be1d05c8630496301d349972b87478261ae9a1eeaad6d3ff886262803e7641abe486d8c9b71d65167b305abeb07162499a746c462582f98b978bfd074d0f776eac0fe70cc8da4d740d00a7a79c2937a9ae935c8689a7af4d629e39c52280717163dfc8e4cbe2e810d53ffcb6167a39b5946b002e06be85a461cc536330728b8cb891396423fe6cb658b29f1560066a8319cca844cf1b33908c063e0449a09d9742be9e85031cb65ba049d2ca12e091f7d3e319ecf610a33d709a5fbc7ccb83c48c523eb61ab3ee5297a3006c50f56d44e9b9a9d0630d51dc5946738ee9048de489935ba66931e9b97fd58bb99fa0c3ce4ef12b5520f4f0d77201e4f143a44289d48c0cfc0da6d1c002abf8e74660625bbcce9e2786421019079203be83b5c5a73d3f9030cb99ffc52013193ae2a4fda14eb7a51235b6ee4959bca26f33a5a4ea9562d4f7bcc5a914823414c0419ba8313aed53cd9216b6652e82841742e9a15accc8af006e5744627d104406e3e963404b5140c20b06ac19095e72d0c210c89691b6fdd21a5ab8d1408c6ddb6c07d36f75c474f630e53c261a46fe5992318d0ca4d18cc5473c2fcde1ce9a08d0fda34a40ab1d50bab90349630d46db49b105f511cb3e6e0eb118c8d3e2bb9b5858a4b0b3525dcd0f85553b05f5da62867c8ff5f2c9b3e76f0a27975a13b443ec11bc8659e89d5b719286ea086308404788a9fb1a971bee22fe099f5510ab760642d785ead1f7e0ab9a32616abea7fd54b6bcc91c52190e5f3e0f35e503ec65fc45a9e3b9d76c9a654384262aec119a0f9ebdc5760052cc8d49894224c52088a6878c3c339a7b819acf258bd510a93c14efaf24b75f8fa178c05655cbbdfb0c4d6119f3f883fccb162cd007820965c4b469aed1bc13db3710526ef056c0d20146d5c7dd482bfa035a89ac0745e1261197d1f86c60afbd5584d9945c0718fc022d657851855a421f84c35358b08251a6b61c5329f6e4f2e8c9627d9b0ba1491906158fc3735b1ad61939ed4915b9f19651f702cd1cc07f176ce6d8fb48c8e76ed0e5180219d4c10a21b74f8695c00ba757e6f068d515ff516c943e1cc7d1ecea45fe266ddfc9710645e9cc12053d4ee730627bf4d02489ef7bccc07086e18c04e0ccefdd454ce458599976056b027db3f3bcd571c9b79f15259be3cb1b8ad4d54acdc9403cb72e0cb1c9598d4a77908fc50725f12cb1f4db5beab43c300b09dd2e24da3f696bc4e5165f30b7b46ac694a3d3068b2f8fb3f6e3a1836d88e07dd0b89fcb58ed3b173ea335dd75657902ca5ec397051d1e151916105581df9ffb48fa093305b00f666119e1225f61866324f8b6040fcc89e6562131ce1bb9ab6fee153f86b48d8bfe9b21986be94f2099cb03a9286a4bf86b057440aa55a9a3a64e930a9f086ae6e71de6d0b6c2203c85596d95a6f555e5c10f3e606a13f8c1d7406deefd7856f266f90351f7a813bdd91bf8566d056a22ab06db319b2c3ec966f653d2254a61c841a948cfa70636b26e273b898255401418553540e4f28de46830a85cba455cc076f956ebc4588e9f1bc170d8d86993dc59d57e79132ef8b40687b13c6b9695aa46eddb9be5a99187ebccd4c92e3ffdccbaba50de82502d06273d4c12dbead1b30c4b8136e859b4d62acdcbe129fe64530de347609051a5ba346bc20b2b24c061770907e9d238bc6103c5db18b346e468e2a2ff6871632cae842dc587b02b1a835597195c8668efdc2a358df1b97cdec6184721ca0767c0308833dc82def8a69f9da7ac6b3462e0cfa29ba6ee9b17e87632a56a57ce04539b01d752bcd8115c446c592abb8504891ace7505df4e3eff41642e3953469cae4eda38e9485686ca7f8c3181e3ebcab246ff8f250b6c6ead782f3763ed744aad03bd3a7328bed6a708ce67f209c6dac883f6c8cc28c2ede3149e5586e9419d323dda97ddd76ace5cc3fd55069d637e0a10abd6d29c4fea15efff3d7c073462012025979eaa12f9fbf7349a3f183f8b2f31e0900bc019bca7e5817f2383871f92f62ddaf3bddfccd83f89fb30481d5a5bba62b632f2f0fb3ae68eaafd86874d82e5a89215436f1afd64d056b8e19ea866e16cf2fa4c2d24412e63dc6be39825220ed0bd15e8ca9acd24402f532808014453d19cd71e8a97fe53ec36d18b2d2efd62e1bc6101b8c85ed846626e6e7f05563c46d8a7be3e06378deb8e3cc5a0fb0fee58e96107d8c242d21d2cd1eb2bdd702cb64c9c5acfb0a805b3e5c0b107c94328076ed81661f06dc18ac4d98a6504983ffa5c7366edc6335d2863cc996f551bd6a576fabf90131779c92cfb3d2ce25c716b15dacf8b7406257ee99ccf90a8f3ab0cef4ffbfb8176896eb9a81d6ccf6c0ae534194d2bcef92162d0cadccff9a9b05cf099461b52e813197ec7d11e8d77c8e40bd70863871db0854d3a65f26cf3dcbcbd3eb44ab134ba7e9c5371715c872b109eba029027893412b3983a5cc029998e5d4f31dd2511a3020bd16d602c94eff9037f6b7a2a62585d880fd38acd2b7aa6ad24a632eca7b128e49058cca3597a68788e0fd944e25c65962a8380569914e9f1694156cc844d6196ee4ca505a2a1dd0b6e888be835c2e3d90e60b2d11239ee353cb2bbb776ecd6359b1cc27cc94a31770783431d03a92db88fc39b3daa5970063ffc3208618e76f7b2d2650d84e0d1d1963e0d68cbc6498cc1b52b0a94f390d0a708bdfde4f904ce2f36b3892ba4a2859aa5bc1799f685aed449a238be612481060a1699b0074a18a6a51f07854e387de2bd9320fe36ff35f7c7f5b6b4b5272f3a173c989f506770658595cbfe2cb109608ef6d039eed6862b3de6ff22fffc0b6a2e98db47ad285d2955762c9000a9b268833132183d05f423b80713f6baa82042d018dea58416fb0e3d37f9618ee8469c3aef242bab444ed09392b4b90a33ca484759ac40829e10c65ba67fc8075fa5c76fc3a0b1ff446d1132206a335b529044f5310c66ab347990930e5f1e67400965e6da762caef6c166eb830e3155e44a193826b5e342f71466c09cd02d9e2222095c2b806d1731cabbe41d099d324cba1ba0f4d1f36a144835175f81d65fb4335f97b86394f29eca98f024ec8378e54f708c66340533cdd2721d2e3c8ab5b2cf06a053b3b688b39ac67ba30f550e75e53667410f48d015639f2bebcecf0190e8f354ff806a7917379e8dd4dbac8ba68ce790572eb138145c8a68c3554b0e89536528892b4d150a2abac0edef623ed72ac272b8ddc3dbe049e0e64344a3a53086b78d84a3ff084b37d3f32090cda1622dd9ee736b37576f9d1211a2641a8c35bd855c97cd9e43963495923b93e4c58043231a40ff6adc70d4cb7d1efb4eb27efb9ce619ad9cee4b871e55e2af227b606acc73c43fc64f19265f88120e36e4f95395d4435c0f38881b1cb62f585e8c942b9ddd282628c9bcbb8815e13192239529be56e39aaed9031cba8d96c9c4bafa070914ec92bcf9a41c5bec7f8f998399236ef62d0c702840cbae29f1e134eec92267520ad02ba1a294557783130208b0730cd5bc21dfa26705a3bf1c1085a0ac2efc57e4d9127be55370916c8a482f1c04d49535a110d1458e646351e0690c3a8a4170df901cb6603c6216e3e81310737bf31822a70013e00ae41ca36d4ad9e0f19a1d5536393dae94b9939d674d4188e4292d0006976ea90e6d209692e86d3296e9d3c31c7c898026d915758d6145090a4ca094184e788d89c7c2c491e42f57e4afbee16a11c30d3cba51b48038efa982b70bd023baa55657c3792f05f49a89066b2c481e76b64660c56cae84a14d10fa60a93ecfd03f192370deeb420f4f55cb9ac91cc58247624760c2b4e7e0359bc2272284ab5ce90b2baa3c41bcc12025d5c242870d62b5365658fc0e6974d4e98e9595d7d5feb6896694c012b64c2c682156d8c9fcf689f2e9a4c0e6799b6d221ca249f618c02949c914e8562240b059952063686eab441ffac63e734644d41eb526a21804f6fa172e52f71aa490133195c0b484795991b9859b600fe2a349039fa6f32c9c61bc3f77fa97b2d7a96abaadd955395af15834c600200c039116e2c49c7456e8e0082564c72a54ea9f506e42df089b0f37be4921335b54e933b199239936a81d6484a75e59cdaddee3a448f05ec67543aa8052149efb0f9640577c55f18aa2bf326b5a451266d7f6a32fd63831c2a8d613d0ab6933781705c12274493c9aee13fb90272d808ece97799952f86acc9aa3e51566574c6916135d2b18caca73445014cb47ee3ad6c67dea36d9a6dacb8fe7318b628bac9f449d6ea007e383d9cdd905efd21d82fe5394c8ab8603cee29aa848bbdb4229aba2b5db06e99a7f8556c4378e153f10d8ff6570610395268846f2678f03591d234b36be5d779f1fd7cfbcb05f1cd1d6cbf9a48cb512d71b2e022ba0ec5c0ce65f3d7c9d6df0b1df5194e7a269b67c7277b7afab5af4d68c063d6c03e8519bf5e0abb578d4005c54ed1abfd517e74b9048d51c80d272910c2a346290f6074f02aadb8bc7ba8e8641f9e0a1304146c6bb1817083e66196f12e1d670cc3d14dc64ad64258357b1793f619f2a850f302aa200bd57264c0d153580ab2d3619f062b337a38a841685a877747e0bdd58b19939d3e6bd53ad159bf337872e7901845495e462cc14fc099576fe0678c301084dd300a820702fb9a1eb3f7807680fde4f35d14a27e008bd498ba6c9d500ecfd80e6a346cd4f79c122e8814b8f1c64e81fbcc7b84658d1bf95fcf2a47c0f8e3872dfed3689a3fa859b7178de6131807e540ac547393810cdf3761b38685a58215c90ba49001ca4da06567d438c9cf21703198a04cb65fa2208a284bb7d8121245d10897f437f2750a334d0664793eb912c0cab7e67a0b88fd045af7d81919f7ce20fa1633938d0292d44c4631c5b8792e95d550e98429688ee2389e4b17ffbeb81639e264eff260a036fd8efac260711da125c9726d60aa3e26e50815e78d1202111f1111014f857081ead355aa3dad7e6cbf33442bfe58ad8245cbeff977af40d620335bcac0531ea47be50c65b18751a1e841395e6abe2e95edb186115fa8c0d26983b351d0680076943d3409116643e250fc59f58cf805c2c4bf138e3c9126d072fed93e4d2abfe882f2dd49dea6a526160d01a544a1e07cdd5de029c052e1ac5b52f183a6947080ac39e283af0df1258213b1105624770a85315e0a67092fd42402a6e888918edc3c8e39802d1398426c5774a1b52cbf1397e551b25e61f89152dde2ffa0d0cf499fba6880a4fd91732efbee150b1d5763f2dee723385532fd10bb95ed92d52941d02efd44b3266d02507384236d9e54208fafa3555556eabe6bddea8d321f4e44bf9a7a2b83ccd29773375dfbf8b138099a7dcc9a8e576088e8c9a59640f49e1e419f6d09b724dfde96a02885941df00f8fe8d44e1bf8af6b6446720cca31fe2095f277d35dc5d64a6d5cd5bfc431247569d149731c4d1ca2ffc04e9a927ad89618604fc814480908844142a411a51abd9ac54b456698a9ed36e63e98e38651e423bfaf71cd2d8c85d9e318355baaf031f4a8c9c45201d8510dc3a875f21511c50a5b2dfe4f223e4f6a9402b85a4608cccbde189503f2439691e37201cdf916a1c9075b4d7fb754926980954248ead3f315ad87dc8b5ea5fda44b47e850bb6425de89c2c2858ff0275d67bd1f5551cbc9c5a982184fc1b96326789ab11ba678b488eaa88ab96c61fb15702a60384de0fd5bdf47cbbcbe47b23f5d5045af70df695cf2210e46fdabe35870a3e044ab76d15d8dbb1b9138d9a1afca34be6a76a1c99c041bcd2e3f83da77b65ab9fe2a40bc21a76fbde473a01eb6d450fe07c64d016dec36db1bb2e5f00988f20ddd3416cf38ec04e164cd4d2b37a7bb19fe1567952b4da292565ef02169f8583158153c74368e9a074e9eb5ff1eb80f9fbc5a44016044ee213d68116e9e8888c219c70157ce28083b11087b0b7f562a6d5846425e03ee73e7f36c5b1f1712b0c71b73d4380a081274d670f6cffddc1df2feda82938d6e5d3a4cfa74a6d9f9caa935e546db76089c89beb15d0720bee9a10a3365cf7b06456fb8f112bc7d03d9a46536b4f3bef02a5737e56e0e0a174c1cdadce4aa68767be958109c0b34ffbd2a6f2b0f32c32014e61655d2c05f16ad0ace558156e196533752656d896f982d140f7ea6fcb4cc9587fdcf3ab810908ba0607bfd144544cef023cb9cad921d99cd3515d08c336b4d9619523a2eca903fd293c771c825647d9ad54dcbeec1b7d016d3524f0ac1c42e990c42211a7170d2a05379dab7ce463514610426102b0f1240270d8f1feb56c211924c564ce86233485ac82a0356e7334bb34aa8fe5e00278a0d601de3e0fc2810566019516c93ce37e156d7d58c2770df5d887ecfe8913270627031a02a23f4c0ea4b573cd8b41d8c3e186f1097ca7e10b731f276a014231f264b0cde9b671dd36cac552e68336810d66761e138d889a4fa73493562ba918728a547a9cdebdaaf1120ae21be68bd70a3437854aefbf3ec89fe7171032f577b070a20dd68d39f150bfb85bb15168918af9f7b6f796fba5def9ff702b2444c1947b5b2f11c076f9c77a696ee69284ab7368ecc239041f7655350ead0f0599a8cca5c6c75be91e122cb02c22898030f1913925981b3a9a31798118a480433768451c2398aa42fd1b57ed5ff788de02ad6d0c64e958b0db0df7704691fdbf26a5a25fa79d3a8b8f0c7d2e342e2f65391679888df26a3dd6da1c0bf4c9edcbb37b7a4d867132c762295ca05fa66d673d51ce63411f9d1af8b60706a9c94f544dd6fe0a4b45c8dc37fbb5b90573e2e4e8b8c8376055c4b1501167b24102fdac94e82ef04f58b4e61678e4322bff418ef2e76385401093b358356eb16959a57782479ecfe21f7652fb3141d1a6f20d81e4a35de0c25115c0f21609cb711b80ae157151b8cd243771485a7ff20d3520670801f46255f4d07cb3f7338d0b6877d9a5828def0da2a975078f8b549994706145a40bf119f78bbd41658b83284da265440b22d11bf4e46e0ca23156296859170861f2063122e8f9a68c421cf077d5d19f1561cf39932675d65ad0cde7827caaccafeedadbb0647d2661355c84cca6b5c59cb0efc8d11059343dc13b74613a96d66e8708fa5d15cd68802836a17a74c6cf12c1cd102a9a4655486ef3570b9e2674fd147762a5b26a5ac27a8bbd0061301dc456a14e067237e88084761c1e8cde0dd24bb764b4aa41b44227b71bb4e22804ea30df01b1b95838e8d450bb15758c1c36993f0869f4c3a67113647c601e124c88013211fa6070899d6a15fa688614237a12e1d30d1a2d5f1ad2e67051ee7b364d054107c5299f7383ea023f334b319a481324b124f4515892cde5f13153f5dd06d58882fbae0f34f75d890a76039df79da3e52f772fca6cac0d3390a0d9b22b074388652f4e987ea10fecfdcf9687fa9dbedbb3d03b7142c1fa30f17bdde6dd86b6d10c8c7d0684aa45be290a932d07e41485480f03291fa854cf9fd0557c9a99ff2660577a353ae9d1bf355534cf3ed4aa5ed857f2b767d301cc3e4e6aeb0ae6fd83e24589d9ec1f947750c8d40786b8b23e7f589ed2fc83ca586c277fcaf3c8221d9c082727253c85bb3d6d73241cd6eff02d3d2c686af07a1e810dbed83570231add294cdcc3281e00e0f78230bf928c5194cf8db4315253e2adfda0843f64cbe01de62752b21fe47243890eaf0628386822ab929773610a97bd71c60f32e493e6541adb0225cfead5038390efed0abd161ea40975dc4d32d5db33dacd87e882acca5d61baf693a3407f10a37816d807e5c2534b8d153432edba82db61efed2d7e583555c6ebe154b7fab2766da6d67a3e885f31b5716fcf0701691aa65e754da98501c27e43a3dbd83504095351f10800cdf222241f9e2ad7a4c723e54ed92816c15433d108c53ee7aaec0317824914e408291d3471733015aa367a7db133e920eb5c8ae4970b5c034013303f21628232263ce92062800fd1869c49c4cbbe78acc8529315c42996c6480a1ab0fddfa4839c701055a1fe39102f97d3417dc1fc98e20ee0a1fecb8eac841d38a0c23afdbd05e372505c1509d6f5b5c01c64d650ba516847119da579276b039a1e118df8866b6fab75c129bd70e85e69e99de5204d6fb424d84cb4b6f37873d6cce275a38fceef27166eb471d7570e4a0e573438d84f753108a61e06028c2f126c7e08c01947d480838c028fa1d6971dc63736b8f10f09eea64c0100793cf92fa76b1601cfd9ba770d78fd80d0ee49ee15c9bda0c7df7496fa38d70774eb9443b31afb56d1163a1ff0edef60444e915d2bd49fab3771f91dfb745e071e2752c579b7102a0c709a73ada41ed130d208895c9416502f641dc4bdbc5f99c05aa6bb9807a510b528bb5c0a3738e4faeeec7b7b56ebb4a9e6b745236e843c0c1e93d03f362f525e15bc492081986101ff02482df0a007b89b8905e5862623e03a2c555d7635e9d7e7b41df80877d38eb78789be0a609731e9b01b006b52235fa1ce9df08572c38cf16fe6db68bd01044dde33811ec96028c0f344643b4ac6c03e67ec04d897ef45c06d09dcb486e08da49c879aac590c7c3bacf5f6ce96578192179f51c2c28addc618bf0ec7dec426d8e087d7cc25484a77ac0b549ce20d23e840089e1347def08538135aa0be4ceb762d62120d140c5521b0c03a203878a8f30e34c6dc33dee0e9d1a3a330c97c44fb8a9e80b1f2d419b3e1bf7864b92e52e640feee22f6d55093cb2fdec0220e4699307486ad893d946fb70a6f31912915b5b09ae0669b82a293b5a0281202038a45357700a3d132fdf4bc8845ebe70477f7214b43fa81a61ad9786af1f2d72ac3d074aa1d9600ae6a84fe67f7a4a3a9da2cc970a9115c684014016e2cd1cb1bcf3117f6a60940e8b464bd65ac7aa85c9bad5d6adfbde3e93729d96fa6029fb2fec23a8bad63b42c2f45004574ca8a26d8cda84eddf3d0466b05d4f8465450b88bf346a46736383b3e098c623c274ce715e3c9ed2119d0f967b6751686654faa7098837acfea32678c672dbe4eb3eec753357ddfe40a43b1a416e3b9b9906a46830673f3f4337ad4dc173d12d79ac60f4a618d476c618050620fc6c731d4f66a26df14318ee71295aa95ce1cce8c6fb1f06e96a853445d2fe7c6b335883f96734bfb8972f686f2883793fc79c645ed995c5cc6554d77526cbaa562335e12ade443419fb5a93bb2208ecebbc3fd912c130367c0eaaa308783b540a43ffce5d775911c40082f41237c18353ffd55a28d3acc16b5cb5757a673175ab1bb69fe6d030b5da56b9c28567e67b7e754b6a44462f5ff7d78383abfc1cc0eeefc964cd8ee0e37d727cdd418ace40dab3f5f9d46c8030d6a2df7cc1938ad1861a1cdb4978536433f8536ab3196f4aa15fc873fa4651e1f6c7b1a4252a8a900cda069c1e0a4c1d280c82e27e717648eda41b90d946504ee8458db2c8b86f99f554dc37661b9a014730d4aaa8417ee058bf937b0164ab2bea622c696fa599a2ef347ae1499a572a5a8b97f3b69c387dd40ae8634388b9f47e90d845450cd86e32e9dfc346e1710240890ae213a0d464490a51b7eccb1a7afe04a7a974f40f19a1a51acacb868dbcb18af1bf5aac31d210321ba077e147c8cdf25abb7da4bae3a7c5b9a024502009e2d56f23388ec72a00d9e9454da9b28be7737d3d25e086e5d6de93149d9c794d964bbddd5c55952706aacbe25c5ad1c0ceb9040abdb8f91ae1616888691316b2926b828d2870cd9346eb3769f936f1557b68086b5542c5bb7c45a2ccbd62d35da16a2db188e656d81ae89924e34383696041652ced14c651421604868450a40748999690bb90baa387bdc3a240c9963d32c144969c2138cac906bc42d9a9d64049ff554ecbfe631045de1faeb3a3b1aed9527f64793a74383fcf4feb4ef01c58d335380f4faf6199dd5a892a1b763253eb391a1f9c7f9d75065b45eed079b537cb07a8993a47e2f2da9fce8e00d3f011cb83a130b8e2d013f1176dd2643aedb5869223151ff70c2af96a9648cc00c4391902b0f21054f69ac44f3a2fe294d28b4aca6db890ac25e52a7697fa734036fc2446cf6539a0297b33b2f252a027150a6ccf82744ae97351a5aa8d1ea2f4263feb07cdb1ae23430a6120f4aef1dd60406d59d6e22c01bbcaa35d6a7a13e425c43404054810bc5d8b4306d8cc3fde744a9fbb1fbeff2ff41d1787765233ce9924a04433e6f150a1ad74bd19b8771c588f9de584e4da4db0521a235474c8b8b09d1ec6a352c9d0b9e0f69661986d46e47c68cc8e6052a1069a0b7baa98a82e4ef312a4c07a062a1c158b141cfeca59f5ad55d1af8a3d19465151083aac07e724a6cfaa55996e791668126489a02d3df076f8e34877ca5591e36d2902f9b833bf868cac0e4c31c549c656f22ac0a8d6ed2ec37d54e99cb8323581deb21aeb4d83b98f88fdfa187184c8a579643e7e8513c04723e8ac4bd35d9a2b3a2da6d5d334769a00ce029c30f1cb8e1509afef2796cc12a3a569be5961e44e790b72dcc8eca645425f313b256cf7322f9ad4d0e5b26acae385898e91c782b18519785a734165dd7bc9b8065958a15ae63cd34d029925fae5b07107b22a5eb31d4888c8c77c70db426037b4c5e0229f0821968c874468a7f0d710b0f908dc18d2f04e09b463613292f9d93c6bd2dc364ca0539f3061cee25ca94cd99e215d3ff424eb7f30dc6ba586c8e0d05fe5377adff9712529a213687b10bcde765ce0a56d89ceabd67e46111d2c4d83fd012143d209bf4afa71c205085e03c37339d350c2068f2e35d7b3a4df9a3a5bdcd0e0d2fa86f70571359347b6d4adc19c599b1f70afb44cfa1a4219e4548ee48897e4d46c1b9007f677caf022f39fc5e80a4132c04cea4f6d3e7fa6d3f82ac449ba56e2bc3dbacbc640d15c4dcfc094f6af20e83b70fcd65f721a4f5bf059827ebc93f3dfa068a293093e5f86f63c0c649655fc39f178aacc72e8b239c5f86107fba1be29db14e8850d31c23a884f374ddad0f02a0efe6f7f5ea733b710dcd235ec4cf94202bc7b27490583ffdab1741023f269612afbe2395305a80734a44d97c3a09008e489b62c40a001dffcb1fc892768776304ed9a894a8b1353036b35e2fe99ed158e8ef17bdd501578ae8a3ece6655857a37ad4a5d8de914accbec134b40ae5a9d93e7c34bd7186275f950f809dbe412312085e99c1b6123975287fad6747cbc5d0f8cc1733c94e53c2826ef59f8955d8106b328f085d9fd9a3a920917fd3a60ca51431ec95360b9dd7c91cfbc661895b829e539bf376b4934383eecd1fbab2e866951216ebe3c3cb24e717d70a16ba5cf4765e2d4275fb8d0151c0aaf29162b66ed330cc16a40190f3ed53c14b1d51731e1d97e719fefb010607044b8914de79166cb84d153d229f9d45213ecef4ad204424f88cf8d72180726c15fb5da613e2f60266d09d87a981fe6a98749fb332fd4d58e9f5a0fa540bfb94c59f8a6ebf8ee74098b2483e0ae684f45ec37a27e0d476e8f040509ee8c4c0eff71f350ece83fd4171e9e537b9c25648ad393b8f96b7d99c614f3f6ca8caeb9f90d9f4724f21d7f02454f0809dfdef6083b79dbf9ba2c979d58bb1a843f3b1c555378f139823f96152463bf8ed0b5ac9842e1ded15b8afe84bd208dd4e8d4699b43d0c1f236a9913c762ba0e7427d0fb60b2e2e2733b914ca0c1041a0aa872e4f9f8e6956dc6a5061884ad2450e552f6084b50c8309c2c07106074c43d41e9bd7f9e4e09edbe5f0363642fd2f640e4dfb6c75c3dd5fe23ce6cf0d8a435e31d650b215b70840927f5bce53caa0a87823bece1a1d98c5c928bf5ad69058023f3b2375b0d07e33d71c5e4642e29a4d03d3e634c7540fffeabd3846a17af917de19f26e0430a29949043082da490430d29b4a1431222d4a1421722f4a143156a68a84bf4c072481ef8581ef41f3425b9d81089dbbed436624e7ffcf0206b4b7354607f9db150883007655a29fd4f8b5a945a979ecbb8abbfd099fa8f4704cc0d5529860aa229aa94f3e7c0f8188d36787a012486494546d3b8a9649b8efdc2ee90563602605e88ca989440962a32983d1b9c17aa3aa6094233fe0a803784ba18a5201899f14b678c498ccf26ed3b2b980b5ea2065dc220409de14f15477751f694cb2f863e0a44d65a7f2763d998533717943b625d4f112b46a55ca71587675a95243a31ef476c005da16cbe0ea410287bc02e048665aba46e2fb611a3f285bb4b67deae78b20acbaba2a77288a79c1b809f0547f82137d87b850ac08dd8050bddc11151d4f722c93ecabc41e32b1b4b2efa0a9b05b91724265c379988532e3013184d5104250bee70693399a0fb81bf50b359a71cf8eb5001925c981354435b496318eab0469e10cfab66f59a84adf54f3c9346e924a1ac83de416bd4f4d6d5e5af41ef28163d5eed2eee5c5d8a0464b87865aed6efd4f1c7d8e4d12196042288ac2dc0a3e70702a3537e9539b01e4209071cb153ef72538f5d9d929fcbb7f220dc05d0f7f156b5630535610e098146148cd1f1b79f7b003c28a477b3c0ad2be740e1012cf19ebba2a1270370f00213fae331fc628db7ec749e55b0f3f928c2fed450bfdb204031c2300ebb0641a7e462237fd1833158c722c4ec459c8d5643dbaa0feef422915a27a5b980c0c3a598e384c25625ba69e6d6d7631b91598f41ea4bc5a65dbfc2429c904eb79808b3d2bcb894dc5a461659a00d1f3b0bb47f914ef075413a66a4b295892da323459748babc05b9d131bce34bf732bade806fcb09dc45c854032a9b8577a5726ba8c4b0224a37291a2a327798e6b5548129b0258170a87ceafe2c1ac03ec0eb407acfad6e3c0284ee868ad9fee21d8eb3688beaf31b4aa418dd23abdd6181bbdfc1aa9912f06b82971e268832fd3d2445f5ccd91984bf233fe04afb6354f1b1071d71cd621bd34b98b83d3504231eb35d0b392e6dca6f428ded54fba39196bba740ff72e2610a800bb62067903754b5181378f184464c3c889ef3e4d3216e10d563000108cfdc49a2625b546433edf6a8653ae6c342d72b0580e8bc1c38b2fc1f12a37a3330a929e3741d899d15b443294f81c169dcb9483185ec6b740dc900f2ebfe093dc6996c0ba3da337f3ea8cd4807fed1f8998178e5600f77aae9699cd78f266b50adcf1c8d4c0355e9adb0afb5c6c0e6fb1390ad3a4192140739d7e3c68bc803c5ac180e67820e2fd8d49a47e0bb920321397e7a24b23028e5bf3aaad813efd4a0e93cf940a7acc68c739d1d614be35acbe5bf55260732c7c1ac7ff11c189f26c583a263ab3e3dfca216686f773053243a8a8b523b4de0a401fde975daf09b1d70a39f04321fbbc43f285ad3a09c562e0792cc2c31f0ef0849d96bf44171640583cc7029dec2e6c42a8d0013d427b3509b662d24bb2d8cd07620367b99e0b42dd0fd89fede3de0d02286df7e5e40e89532c5d706698774c4263a9610ad75b59ece88de4d3e92da4e23f6f73c306633998d5680bd9bed8c6762eef4829b872dc156ee485cd18b89eaa6bc239199f5738a5a5068de9118ae4851347f0fba595b8180066cb04e977a66f32837a7872189684dcc01bcd5e8047dce0001f352fd5e10a90c3a54474e1e45201001dd60fd42c5ed0798d7115cd5dd18797fc15db5fb575670a9a227c776791f7d7af5aa4b0e653d5b92433754d087efcdeadb57125156ef0a7d3eddc0d632db5b73531797340183d2d2212bfa52553cec5762130f098679a1cc6ff0a6634d1d4d9865d3d19a25767993f149318321e132d3bcc67c5845b4745254843cc2da7aa1887bc44d42d0352521f4e349a4717c64c576ad62f798fef5b62a0fdefe103ad715a73b29b4740ed4220a6b07fbceddf232db44e563fed186dff458e3fc728e4482794b176463d4b22f7244cf95295c9a56ccca460db1cf788088d516228d33afbdee717a7993f1c49de5841dd12d9ae689b07712f552e38ce89ba715a252e0dfd7868ac48688c276d234687e45a5105fce174570494c32d8edff6d12198d369bddb2993a07fb1a00053b8a4939926810040e5a94594bebdf9eaac2a47886670447aee7d703973f3da8ea82b1bea452232ebca6e916dae5f6b9a8b0e4a5951170fc60c4979bf7fa3c92ba6e288cbb2cb152ff9f9b584a3a2c99be889c5c10fdcb6f0dd93f42cf4326f444912c7cc4e77cb6f5b7c7272aa9de7b54c6e28126de292bbaad7d947cb7217ccbf8b0a947aa93279475701bb56efbb748eee826f187a18b2944f7c8ac5b7bff4fe8ea2b411a612048470d2dd5afec8d7243c1d4b451c0063d132bd5ef6ec47f9c7f471a923b21e4fb090939e03f992c70c15a4df8638aaae5f65e444a0faa5df5d83362e8ad916565d53479fe4ada654005c2e567d6f6a7d2f6283fa42d8fa2b5977ed0da0de832f8242d0c720af3a1a38b5a0caccca7461595997ebcf48777bf0906b092befb022c6ce4a07572305429350521fc975b7c75660b4cae63a11cf335946c78e2b0a3285a4ce41ad09cc1594f14a95c16921680a5aa10715ae11c32d03027768ab4f1e74be0e60df32b5540c85da04420106e29f351c4c9a75c26c7f2b0ccf13df6f06b6a603e99aa75f58fd67d7d9874fdbf5cb7e0a587dc8c113ee081302a69e5c7e4c0f17df228d8368a4d6a37a205269d9a1e654f1f23ea71f7325106ea5d54e0b07e5c74e3e3bd8e99f208f6e4ce0fb867c382f626ccfbe00eecef5ca70e73b0bc5da7354ac13b8f729f2431ce985099aae04c1a6e632c30d17e11ea71b1e5341174ea205c54f103a4fd854efb2d12534d4ea6cf0411d05869e56b0e312b93105e397742ccdeb10923becce57dd28cefd7db456a08667ffaa9e43ec707a9d412e41b261bd1feb8d652fd9700aec958ab4a66dd0edddcb826c6c43cbfa52c7c1b8518c7e7aa49d54064bc4e88e459e2c8f3c3f51c0784b0d74a0e109d28f679c52680d6f2f7a1ea71cf4e0389cd556b907898eb22a1c2588db10ddba67874a8c7f5b1fb04cda278dad459b03d1ee4c5dea3daeaeedabe42ece4e76615dce42b7052e081ba8230cd7e2e2ae2097e2f4109443a435f52236a670af64f6dfaf8ab2715c177cced67fd68e523a3b06dbc278cab7b62d8a7a407ff235663175794bcbac7cdb962c97b6e7165e229aeaa7fca82fdb9721b4d6755d88e00996c7a35d35337ec98981f8ba6f9c0eabf9b22081170a8b9bb5c5665aff179ddd8fbf71d840d53d6d75ac1c87396356e3ad877cf9bc61bd895ebab977b436fcdf77e2a473a5cb363a6e22638bc1bf2fd7d2be3d1a833a32c100bf97ae8cdbc4fb797023bf5aa92a5e8da3563453ce76be2804f03137574f87d34292236b251133415ce4430bb10da46d0e2351b381cdb402e3897af68dace68b26ae3f8c75b86a59a4f61aa4027f2b4859f5701c6f31c9420253c62221ace25d2b2152b96db87ffd13d8d5874db755d533a8648e8774fc20108adc4ebf2431d9984984a574eed36cc8f990c3c9ce5fa61b2b2600d23464b51499044b1a3ca81c6cfcff8ea820f7c93a6aed17b0a5e499e5782a7f1b9330917fe015fe2e923831f7fbd5d21ebdcc2bcbc08048fa8c5b5e2882ecc63bb2caab51d2be8aa964af946cd3d89a0cd7ffd6b88a123b30795b19a44c9f3dfeb62d6488c1ab43233c9e6685f1ab76e0fd5770c0ef74d353017b1e0639defca1bf32373d54bfbfaaa8df2d46424d7e6728f6c8ec46b8d6894157582179b5e481167dce6e146354211c1cef32d842fc41d925a143f6f9bb7c615227cbb8455bb756f1d8070737dea7e2b251ef1b1e86d5809081d11fa4dee84aef7c1257368c1f27862a24e14417b9a7c9cb576e7a3c9f4334c17a37d889dc3a55877bb09280d0aec01d8f78e06a3d80b368709a6013d164354c9b57f75d65b1f2224c46c6b3e83fbee0c5bf13270f9cb27c4a79c1004d9d1067c2582608eabf26741e7432543506f32683665df755630708912d154d95f7bd3c39c467ddda59bec88d2e9fa0e9b6407a2ec7a07a54f813cd9a76e25818eec88165d1b63972e2968b50abd5567294174487b822372af6e481a44d75271c11161a2063f23e10bdc80e47cae010924316b6373edbce60dfd20a523e50df0c67e886cea71648e849c637c123525fae4c0dc7a780d39f0e6d151299da62e0603a505a3aa28be2fe4d5169ff0b3e7fe1c5549ac552456c3e3030759d0001241154b42adfbf3216195624a3de1fb33fd24267842aaa3e9ba45bcc095fa12ac8914e916083fd2577d23b12304016cca02eaf6c1655c3010c2d21cb6cfe2d6c8d936a6fd6265ebffe4661c070b4eb6a58feae56a4afef236b10d44b7f30cb475f27138cb62907a2a009510d40b3545ffb7f28315d4803e0374a80834f2378ed5a6ff4ab78e6eb635d94d448484369132a51471065106200642bdbda434b753119453d194aaefa3824a46103630cd349167fe335a06bdfdb0299bc13a3da3b4e58c9acb54b4e8707d2c2d93cb4e490ca1fe314ae7cf7019c84423e8f68f90e436153d8261c66d8fc9091eae134636b7eaf6d3e930ef69764a62c8eddb54b7a170725b0afa63acbd349cec1f277b06977e728687a4313920c1058b593f21044b151bc4ac00e68726d2867c5c2475fb9d5020ba3d96302fbf6d190598cc1e38bf90f94bd5059abe70f962c4ed767707431b2a94521aae6e9c6cdbb6ad5800b8dcf445855a6b6559ef8c053dcff36c6bb3020441b0e572797181abd56ae5a2591941035a6b2dcd8b16f1025d2e97eb55d37aaa015fafd7abc6c64b142f4d6cc0297a490286ab57978ffde358e05820e287882b415794a2e8820414455c6eea52e47534cc5198a8aacb4d5dccdcb283b8dcd40493db484da298a21286e8f21597a9409185c5ccfc1941e2e4fc1ff7bea3ce1fc37b62e1f305919c9ccfc475e6b31dd975563fc7d518fb4677e2241293a7284d86a04188186819aae149851aaaac40c564045d0545b07ebdc492a2295354cc1c41c3072a2ee8610b0a25285239ea7549364b92725001145a8884602209a33057a030c2c2c4265a23d6470d5ec0048325820093650240d0b043992459a6a4d04068a2136e1d63f4f97a1427e7d3181dddc97525244e46d0c26449922957986099cd0694f92204ca0a31438ea60d62ff7613bf4169ca865eb04216583ca1b221871566f3a7708041114fa0d094c30eb3e935b0ce74272eb0a53bb9f36352d64c074ad81276e7748ae44cab19b058cd5c8581dd9ea32c8ece9f73cea69b939f09dc633846be7474774aa9135fd3af53c6967ffbcf431bee377c50fcc2fff1705e50fc9ebdee35b182e2f689e0bc9e08e31dfa9d585b52ecfc516bed60fb653de3ff38ed631cb7514a29a594524a29b769f429a554e329256a9545418a9214251792819d95e711523ba41cd4787be6f8c745b052fa72d25d704ad8fe160fb652900260ea9bab1039b9136a2a0971e77754e5043097a7dc72c69dd7cae63d252fc1554e8872e7d39d5d6e09729c17cb400061e5bac85583c1a6be26a85ac7061d8060073239ce061dbcc00ee49df92ea860b01c3e96e48c184f33a09ec8ed9f8a5583294fa63c59f264c9132c485868008506508c2832e2a8d963be4169941714d47950e75e0cb6e42822ef297d8a7ea6ccfb7e6e9cbbbfbbe7d9a016cd9d5ff215f6188a2d39cac78f9900a39f793f9f8627c0fbf93f41b55a0b83cdbb8d3c835c676eda512b0a660f44ade96c77ef29a2cf087373ccc89c93763e53673e9de494913e739b0ef05937c65cb0a5cf7cafe38e9f3c939bd377987c7c2e91ab490f4a3d2865b1fe6c946522e153e7ba3f6be4d5c4320097430678571bb7adbb5ba3ad1915e1a38867ba715f16e0002fde99ff2d831b6b18c6fc3932ef8cd36774152381bd413ae93ce7d4c87f0f8539e7b6bda0b8be70532f285636bb743fd7344ddb36d768161f4a00750770d9872244dc1755bafedb369927835b2c12d489934e99d848614b4fc2248913ef99e23d6c744b4f22759b9a3072b9c9cb900e2e377121ba76ca3c89ebf8cbc03bfe4e644bca24a63d73b9db8d916527b92f2993eb3f4e4ecac47bd87bd8b2ce7c18ccda19ecdfd293d82cd9c945ec6663abaf2166c2499899d9a9522dd3b47d1ef1e1aeb025333d57ef0b572cb02e614bda022b0dd35057ad476cc943f3a2154bcecbbeac0decf6373d70f9eb6d7a03d623f68381dc152dc0fa822d612ec08ae5888d81f588c5c1a9516c19a363785fee0d38e800ac31b00fd623f65b144551146d6a5ea228d288ae96288aa2c8afea82a30274b2df48a10d32a77c9d3bc777d299b00c841052b77ca60f4a3741c296ae14640b92eb24e4684b138ea39452ee8b580ee6e40b1a753f07392dd68166773331d54c5051da533b82e9fa7f525252425242532615d54a944e4a27a53fa8909290bb949252c770903a2a5dc9dadbb54e3a021d33f084945015e29d2a29a55aa528a595927487e536a1a94367b0cec4653986b82c863b9229fb711dfa589c946e84522a65853e7374a31aa5e38b292c4bdd393275a60f0bce4a1b89ea24db1387214d4dedd831650f83c1603f3ba66c6ab0263ba68ce80eda0b4b30d8b67130186c83c1a66c0423d8948da04d4d6de30e1dec4f140c060baadb46eed019c096ebb00dc63b2ebed892a7764c4d4df154a714d30243c754f03038730cfd9631c716b1eb5f8eb58ab1e5d0fd82c44ed0474747da11eca78fa6ecb5111663c1967d142fd8a6f8fc399c5307c7b81dc3c6bc3cf2d44cb1deedddde5d5b36588fe13d3cec016889fa67ca7ac450658a6a4c91314ecc5a4b0e53b2f0e1092439ccfa797c949a3eced9aa6857536cc95deb3d656fcfd33a09f2cd0901ddba077893b8af53c68d2fa7b7daf9e2f179928be263ea2aa5e9385c8217c7850d95e5cf39ce7ec07db930befc652ccf4f10ccc9183e730c9f8a6118f2b88cb110f9d0081281dd0a6369714b96ba3e0be97c0f733f8869ff610b2d9667caec746143c6966045c1368efad6fb4ec4c11fbe0dfef0872efd71e787d3000dc37b2afecc979349abd598e33a0e7b130cb5000815254655a228b2c32c013a18152942063cbc2066e6cfe3b389392faef3fcf8dff0e7f101fd5bb262fdeb761251dad4be7add0850311cde77da8b291293d47a0e8162414cedd4d19e15241659d0fb1f176a244ee608826ae560938c7ee6faef7304819d98d47a0f8162415a6bfca9a3f14c1d8d67ab770f83e653b07a20e8fd00440b2a9af44c7bb07a616ec880582cfca11bae5a100114770825b17f5f200145872244280933c44cbb31c54c17196810e5852133ed49d0de87f62cd1feb775d5eb6aed9220aa5e27e6c903ab0782de0f60f5a8a8f25068feea390c81b2de8e3f623bcc58cfdd8318209866adfff14e4c72fd0defa92d71f59f104c649c5ced31a0811ed3d3a6442504dae1a4d689d588ed30008a223829e464b7fa4ffcc4ee5de2ea8c99ebc3498d042fc175348ddbbab11546cba1c93a84f9ad671e7fd4e8f003d36ca54494982a96687f25b6fe9b46108d19327b0648f46c751fabde3793ae762ee323a87cfcd0be8b3497cc67da57af13d25e04efd9310593ab3d06b4d73e0eecd01b6938a9b5c4af4597165596041f7f687821d0677d8721843aecb3c61fe09499fd0e75b47e35fe4040d313d3acd512576f45d6d310c8a3ddfff80f0deff1c64ea42c91671cd54ae4198736fcfb9970b6388559ba00b8ec140513ae5b2acd151bc3d13c3ae7d1ad5663d9a384db7d6ff47ee3b67dc00d831b4609020e30ef94436577eb73df1ff49ce87d3796e0edfee396d13d8c39ba03b8dcc318a4fbb9874034ef614df7b465b8befbad65b4befbca1e84df7dc71ef0edfe5b49b134c461f3dfb3c4f2035ad915384eb142414ebafe13f9da8826f4658d2d17f881630dbfe0ea49f01e7742a9051514519112b8fad8121111fd3849bf25c6c0ff9eaf4b8c812b965db1582b304a2cbba232726bbf7a0fcddbb7f6ffb32249c4da2fffe68c2450cdc800d6afbe068f93adfe687f630dbf5f13752142e233ff8fb61451e04b7c21f23859fbab95935d89319c5cc55ce077d14ab44ec65c630dbfaed507b98c9b3812816537ef4f4209fe3ebcc775fd7f4cd99cf9bbc095cf0ceff9095375fd693449717457ab31c6114bbf7c0182639093afdf42209ae7f003fbab18f87dc1a71163e0f375b55ce20c310606b1426390930c089f67883f35b8279d043f58e970d25b38a0a67c63d090d5f8fdc673e5b3aab2740cc5ca3bdd8362c73bddb7481b46f79fb8358cee7f6627d6bf11bded8a2df9d220ae5eed9b8acf25501c0a3873e6cce5621fbccfcf14672cb13b460812caf11a7f59f17db2399bdfa4f4859339d4653cae453d51f17172f28ce1248f9353c64c1f074e1e598eebcce799842d7978bca7693829bbe135e6edf10705b6e4a8a06973c496b032e7b64c7bf056dea16392f65ae880201d505199f693d2a92d858f73ca6daa9999856433620f1230c7b2566b7ba402b434c5495fe960cb8eeaa8a1995450918effd08ca74e4f4d1dff1ca6d5875f830ef0470db1067cbf7a1ddfafc61f35f4ff18757c1f8e3fbe111cffabcd840b9ca0e104414820229af14c1df790aa862c3a4839aac104efe230a1bf4747c1313edf8ff2e0defb2dbdc4d4b9c4d8faf45b433c716b1850dc57eebd2feb3794934f6d85fbb6e249bce37d5b465f1e5f451d4e7ad0d63064b09d14e5fafbb851efe12622495c6e22d2e5c6b4efeee6313d6d4a54c223b11ab16d643671d29baacc5c035c6eaab2227e2f39d94cded363c3a0cfd44b4a2c37e5c73bca7bc6b2b1dc122e78fbbb0778b9ff3431e9fbc67eeaa529a333ff667ab24becdfb2a7a6cc8418bc1441441626786289997f7f9932105c08a2c80c62f0a488ccccbfa3fca99293ee63ecfcb2a3daa849127bc042b36a1dd5512ee32a2a29a63233c3fc704bf0f697304beeb4dbe8c9b9290aaaeb4d6194c0b293cc246c63911adb05c4962c153eb65209f3468817f23d912f773feff33c8e13bbff3a1184fa9db8d54ec8c9aefbafebbadf366ff35e13fbc851875a47b7ba6d4fe96fa2f71c76efb4abb86d9ad6c4f75177e6e6e66676766e6667e776ee1e7d38c94f51f83eb0e74372923d26562effd76e813be4dd4abe165c2c3f73cc5264f93e1f5adde7ac4594c890e3ab3abaf3e79c65487092bf6bbbcff969658f97d6ce850a8f241170d4ac0611c420da6f41d77de461c2bc491fd09eeffc3134d382b4b1c7b2f2d40101d19d41868898908e8c8a809c403443a18a30f514c3a77df2d4b9366af0cefcc911b134c7c9e92b1ad698978e3a94ce3156a35efe328693dcdd93e5df642086d59d3de9f3ee23f3053ac921d0dc7c05fab6f556933e24dccde373f24ca7255cf73961dd389ab66de4b55c92edff3af6da6d3d62bbbd69b0fd613d62e70cb695d3edaffecfe5a2d3e572b96e58778e6505ae3f18f274ee56e58fbbbadc9d6379e33a65bafcb54b5886bd8fbef64943206df315d536ae2a013b259ef781e1aab2582cdbf2989e3e5708e4832db52697ff556353737373f3a271dddcb4eccdcd0deb6615dedc809fd755ee2600de11dfc7b2ed3230cfc973f2501c8da5e13cec8bb65590225daebeec0b66a72a4869131c18cec3beb84f9e0c4b028d2e0f61852150a562fd93d8b6bc5d35893918f2b17b4c4a6498a1588f2c7b8fbec24745379ada14fd688a9a9315557700979dc258b99452ca7dd7fd9cdc9cdf75b5abb3c5399f7b8e9b734eed4eedc76775720e75ad69a93858bf01e244666e8068547c9c93c47a87b49d30a9315837e2640cd6bf7423977d9c57cce99ab6e386938e65f2c498e1748e453e84cd7c4ebad339aff0216ee44536677438395599d4263667901a89935c61e04eccc7393727d828972e5d3ade9c8063db53f0d5249d336130de9eabad6dda046b53a5396709dc919dcf3dbeafba607df0c0a8cf061a61292334a0ad342f87b9c089bd8a300d0ea25483e1bcb68de3aa8de621a9e78540a10dbf9577c0ca4f3f4a1fd7c90bea6079ac40bcc3d6526bad9dde35abfe705cb03c6ab4acbc53a38688b243d812d41a06ff8f833c22d997ad42585b69b03cc282b06157b92dfc6808642b8be36aed3acfc786df8ff9fb2cd0cb86dfad42d9cef3a6bcc32cfbf2afe94f710322b8deee2c7777da2018ae582090b5b6bd5539742beff0576eeb3aada3d3bbae79c50aaf8f65066ed70cf155172cfff7c349a2cb3e1ae0337e16e5dfbeb298d90b813ed05734acd15d30b42cdb4847fee2178b6632cdabe66561382f6b53735e1686f3b2fe9fcf9f7736d8de73a42c17ec7c172110f3cefc23d88d8540d58885e1f40633d892bc1c7400548fd42356e4711cc771b4a9798de34833ba5ae3388e634d948f7dcee0b60e9028a5f452a7222797524a290c54a4943eb7694f9f67ca6892a5197d1c4a85f38ce582e550074db2349bef224db234e350874b4dddc034737ffa76cae61f7d1aede12fe96b945f7391323353afa0bba855aef3401729b7792ececb69218ef9fe5a880304a5f601bd3cc4fb819f873686b69e4b5bd701f806509675d92948935b7e10a46dcb215f942143fad8407365b7ff73e673547f2d5f32b8254ecf2d81dc79e5cef99608cb9d0f63c19d4e2798217b38ea7387663b1060df66feea2b206450805bfd19ca872831f81b39be8e3a73c29def8540b31b92021c5e4801550b50b3d2de31446cc942c5142a2833aff2e149988f36936c23222222429ad1afdc532ffd2e04a2dc431653eefc1a02cd4a85cb102ba75b676184bcd58815782982220b1698e0c8ac845de7b9ce84920d23305aba418911337fd275ec600ffada1e737d8a272e4cafeb63d983bf90600aac7f491d477b49b125ce6d92e98cb20c0fc8a5d49b8071676d6186a788888884cc1a4b962c4f4eb77c718591962b96c0028a1915cc2c71bd064bae07b13860f99a4199f3c288d62d679099ba4ce5fa575bc5922ace9431e2fa933c305c6eb2a28a6619e1591cfb8269b3ce49e60a0b57be4c1d06aa968cd35173a595882f964c1416d85a22962c0c0855a5fc82e1d89776d909480fb7b4cf397154a3a39439270747eccde52630576ef91b38d99acb4d6076e80089855d6e0233437d302d18f11caad9d92f66ee3c329bb3fe9cdd58d65fc18d2298a60ecb66454e407ef0a050bae2a5979d82044e454a507354a3c26b87d7944aa6927949d942e444e9961586f3391b1348b784d57074cb0ac3798e0575cf578713cd3cd7e5a175cf8945427c66ddb8bd519d792357d9c867c6bd271609a933ee8d7c66dd7f936a74730eac69c1b64faa6da058cea79aa68d62b9dd8fed37569e75db06601d82c0dd0eb0aef62c6e80bb74e4a16ddb5beed6d56b1363f3b7afcf89b1b98d463ece3349fa9b58b9ed3f16c889f53791abdbafb6ef2ae753a9f01ea6c2f6f3f4167d3aa97b563825dc0f5d8fb65c34dd75ed7d6018829fd755d1d829ebba87585758c3ab317ad5d8b49afbed45c38ddc4fee03eee7b7389ba51b7b9b3d60de71b56cee076b512b8fce924fe78226c4c1e3f572b55ab8985a7743e5b6c9a29686e02aace122c64c5d85098987fe7ca489c30a7154a0fc4b6bb516062b03709babf2a93174b5a71c7be2b96ca238bf0952c7d4acf082f2d2e185431df382c2e437114cfac37a6efcb86fbf0920843b9d7534eed9bb26dce9ddd9b18ef64dc4bc5b8b75b4edc5abbdf61f8c734e9ffcade8c6f56caf25e8012cebe8cde5efa829ebc6463ae236525423d58c0089f612ee99e30c27fda5e44c6adb07eefcdeeee4c6e61ded29a5946e2305ee0c3f18b5ae753b31876f17c14799cf5421851766bd7abc2ab751cd67caba2775a25a743c3708022c1bf9cc75ae82a5602fd7bbd70bb88d6ad3268a0886a48f3c6acabada6d444222bbb006781b0989056dee4bc97ada371d699e784df17c4eaa6d1bc7711cb769744e913bef6bb0d4b9cc4e9a12ba846ae0c6d5aefbbbaf1bbc0f9c2ccb3aee2a634b7bc5df58ab108707ba7a475e85218e0a8897f2d0fedb1804a758bc70706a61cbeca8fbb280530b4c9795eeecee6624a71686487dec53c633cb5389cce076f797af12a7ccc1b9e50b12c0702700ee9c2468baf3612c18b9f39f852e773e4904063c320250cd2a0dbe5a30a5a594b6a0a394524aa717e13dd7bffa902098ae3f7d18c521cba5f3d2d74129a594f26c56720448ae6b2ee060b1f3b293d1d1911291279c4650e6c22e3b19f940c48b6599076ca0e14912a4254ba4ccf8612ce326949050b920091eae4861c6cfcc5f999f7f5a28d38297a3cfd132fc733014d950e48402c341c3e8877211e9d8d1c349052eb749a24964e403432995ccc5c948e9964cd5dd45b79f4e27bda79fc77b4a0e1e4c779baa0cc941cbe0dbaf232807f7d7a319be10c63722a2eabaaefba15b6b576b2c841fed84d2ccfbee4be81b81583f01a8663f084035fbbefbbefcd915ecdfd2fe9481d0454a89a626467888613624258b179082784195a6a2993f51821ccca0e08514a86634548872011219304d3c31f3f744661d76527ba714a62e79d9298525a7149a5c763a3273772e3b09c1e2da16cb789690b4a00a0a6eb85235e3ee6c2e94d65adf06dffa43977dbc18639d848cd9e673e2d06d714b27f2d44901cc7594b060f501f6d42fe9739ceb70cc94f9b79172d9638cd19f4f5f52689f91cae1a43b538c56010a8b29245aea7611662c9fbb048e7c66f8d83bdfbe36ce7d3481de39f2701ef78da394dbdcddc714b4306f671218687f08c2cca04d165cbe2027b17c0c026626e11b4766158c3c51e92c655c80d5ea5ef5315b006807bbbd7dcd6dfa0d0ade03bc4161fe00d1c3e72688e5b1ccb9394e7614906661d91e617144aad42a1c118e88085af131cb6af704c29abadbeb06537cdd957e579b6b7777777753da54889b118598e77c162975cdc96dcc71d2cb1e2fee7c9fcff4c949deb68d3a350ca64c4c9d1a86ffa44fcc746ea2ff1469752ed70cf3e3b015b58a2d9dcb2d7b6849ee8bb7c282cc5e101ffff7c54986e276f717a79a629fa1c9f2730e0f76fe1479eab4f8327936fd7b749b81ef6153878b2d6b73cf55523f8721f8ac471641f7026e52289952669e1e600a3d8140d96061834537998f49134722f22233484c492d4d89c2473d78072aeac68b1cde9943aaa635c7755fbdb2b9ee5be4849cecefba3bcee3b6ad374de334ed39ae7b8e7b4de37a7b0e354facdf226b1d5739ea3305cb9fb9769d835d8ae06e9b7ffff9bb776f5bf7a66def79ee75df62f79d28d4fd69edee559f1e3e57033e9747bfbf8b1755d81e3d7c7af87058a3c75a35e07379b09310a40b3607c3e797bef62e6a1dc4e75d458e63e63b96cc9452ca2c528edf9999c51e4229a5947afdade046c8c81f9a22a8244e774439ead08c8c040000003315002018100c888442a160340e344dde0114800d72843e6c4a36150843b120875110834110c618838c310418428031c810511200d06d78af4aa1d439a9f05c9c6b7b51aa7e44610973532a85d49317620dbb5992be4b16ccd7e0c4d7cc953cb9cb6eea87c95d7a5b3a6a2581dc28af04d42102e5a51e7c26872d3c50000a9bf6723050603c83b27be47b79b2055df5828180fb6d2b99f021703a0c1b56a3c1951db080e0d3460d6610e0d9c59b261312c6f8a5e47ac8f6c0c2591b6a9fc3044fa41461c4fef936b336f4c84d13e1f76da1340621a98ab537c1268b6ff0baf1eaa6fc0e558d720377b584109ea955312244fb22b942c7961be43c1c4b6ad08fe7b8b70d450bc467566cd8acca81d11cbb8619a67d58566c38bb3313f9d94d31763f370a8236ec8fb9ce662a0c323c9584a0963ad5dff21f4b6fc505dff9d94413e8b5bca78085f42920e2adb8dcf8d8fa9eb40b509143ed6be5d0afb5957fad493871cb65f4ba007e4cfff0210a4bfbb918248e2239d8f77b4e26bb1b3452215351093650b180d8da9aca113fed7018d338b2984f9c35fe5ac12ae38978ea494f214a5781de1f8c47741171e36fe123bf1774d1ba3a4ee3f631b9268afff458d86388b717bb18012c3208930bd5e599ad5fc8937565e2d7a8c6bb76c5ce3e152275492665b14602514728ca27a9fcc8d24d14f28c944b9160918448b1c24e48f39486b5a7745bee9ed7a59b38d5eafa44dd24db8f0e5907b79703bae2429bdde8536e202be47049434dcd701733b7f06da9c5cadebfc877eb7a649e40b4d019e852b61948f66371502063b5173fcd3a2a0468ed04833cf21a776e6d3aa0e10b864c3a1418cb6dae6ed098cd3370724b3f871e0c7f919af1ec3b60a9aa8cfd305cea906a6f54d1560f5ec2cc82ca63294671c9916235240a1ef03de4002c6c9947ad290809615e3c13a5017348859ee9be061cdf6ffc95959d3692198325b3cfa2c71420afe94ae2ebeb590711f2885659a1e7960fe2eff1ce076b166b100c8b7d889cb374c663e5e4eca5bbd6a98646577168df66d0d283e99e0e7c10e7c32097801dfbb8980b746905e9f5d91980b5db0ddff76befc2669727c66181d7efa7ac61261db8079ba030979cd5db50d22a6c6ffe3e7eeb77d5378c88bacdbd6d287d6661193d8ef1563fc7e52f0d61e96907656e03f5d3c04abec9afa9c83ccd2a5bf34c56b05494caec0e5aba776325045f8ce81f0d7c4cdce7449009cb8a8bdc410723f50f3bea72677950ca4dfa51bc68ae04654625489100351846c921d268535d1f30974b27dfbe1d2dbec2d9888880b15d9dd8258129c7c8c832b2e28fe9a58350d0ad9251d4fbcebd2d628dff7bf0001a300530e04e79f5692963896090bfd76b25ee7a702b1ea492bded6fc83eda3b9f16667c8af1cd657b07ab59ab9e5d21db7591fe2ec3fdabe6644cc32d08af9ae32a5d8f02b9d65516225c2f46de768330bf5e88d3b685abe621633543e3cacf4dfac513a53c1ab3b2d26cab660442759c1fcd957b774253abbf815acd7fd080e79cdb63ff06aca9da052413dac77bcd1d90e84489f97e6c675a81363489567ed3c0aea3d789e292a7c8b0e6f5b79fc18975be9a429591b3b26626d9d947dfce04d98f3bfeea404a1537a045cdec873f16c2616ea907dcc45d390dc63c28b45719700b048b37a1a5bb5e6c5a3af919a47a1fdaa8478d83776bce97795b02e22f87a2b332faf6aab8eb913c63399473091ed98924bfd1504aca53eefbb352a1423232a82262154aa6104f996550cdd294fbbc25c6f3cd5bf18cbcb29c2f5b5d3b7f6d7afe52353392f026d4a98f989fa2145ebd42fd77f58fe8874bfbc91a2140021fc044355d2765521e6f524283994c9e7c81917ae4c5ca5b03fa66340dfcc1cf66743650493398a86a4117cc013258d03ace82ceb167d300b31e5ac08c05a1d6bbd47efda2ee33e776b3a66be6feec8860d840d9232c9d07c410c647f182c11ac3d63a5079a0816f184a7181b8ae7bd35d91079369f50e5a3eb19f6e699c50fd6e86ea0645fb71ab9f966686cf1c4dc5310b6e7d3e2ff9a3b0017fa1eb95ad3606bd3fd9f64392ee5fe0cb05300949cdaa86d174c9b955c4c3a1ab3640aadd7543e17ba4f0a2713c079b8f218de27970e8f78c383984d33402114ac0772c3bae8b73515c7f1cd1255b66418508d0d078f4bb19ff1da32ee3177223b6b63b02ad4aba28340ed470fea7fd685027932bc0332f1add0e34c794369428ea49618c6dc8a4ba8e690a85139a0225ea6c7a3740c12576910c0540f5f15d0a03774bbc7737ce330705908fddcc6bdabd4eee296ef27522def7578c45c4b34a3338c7c01a4521ce2eaff8d077bb15b7f6ecc28dd77c55afefdcb44843816746d078f00a4387906e0967fad1e4df5f1c1c86240dd089ead19b9f6263d83d367c6113f3810b96d1e2f8f1214f46743c605ab52e2a1ce82bb8d033185356a87041e4a64c351031de4730045da5c75133223761593d4dc19e8c79483232e382d05d4a8c46da1311366b473704560558d1297a59787f9db3da666f7fd8363ac18eb9e66cc6cac1e0ded39cd5a12773567a0c1c11a8ad670750bf167002200dceaa3e18e798c7b6d1950d2b283f5ac0b2cd849b8d341101fb0580cd3e589703b404671ec820433dbb67fdee3bffeacec09ab82bed476cb026c0cacfed137b4456dab64b3ff4a34618808b9b5418f1ab396dca126205fc8fddb9bf2ef0efd141cc3bab656819a85f95815bf4e66137304125651f2d6a8059f4f125596dc1c974148d3eeca56b8082e72d3cc0d290c5d0da4e2db01a4992053ecc5d14c22d8054bd36ffdeb71ab341ff7589ebee15738b2c702b993f72fc902d7737df53defd46e76db3a05764efdb7fea4df876e36cbb45e3cb2d53de84583adec4eefe720d2844007be3dc4deca6bb96c96ec2b8c130237726bb4d283b51fa19720c05c129c2b609495d73e3cba19fb30f324cb14e9e645900453851792b066c130b1a81f000c48fb7291cbf4a618a5009fe1659dd2336b1acb2c80d997546f702db849743a5ce1beb14c2ebf65a1636f1d35edcb646b8a078b2b00990b135e22f7d31d8ba15de6ca0a3f003aea6bf68e96ba5f214a88bb606157eda230bc686b8b94113dd0b64738deadce8895f7b3bceee0f4c63a297a92ea6f73ba26625c6638c7e8611406cc348b292bdf9a2479fda96fd31477bb48ed066f82dbd8b91384412a0e32f79e84f5b1a8a441be348202ec12a09dee1c35ac1bef1396d6d1d8d8b6534ad604587a005e6ead28f02904411c5932fd9fb7452ee322bcb7f0f7462ec0cf51b5d6c416a7d52fe3b27a474f905ad46833bbb09d6445484acba598e4dde97448829859b30092d743b0a3a5ce6ecdec2b4e371d7e46f796e1ace7692094c728f1d233b31bcc7e2c2d84b4b973d3cf3a5f0ebbcf1fbc563c33e221625494d235f1c4b6cc1ec28bd831abe73220f45c2001079d246ceeb3e38ee64fd9c19ae477730df6c1c18942bcf5ae734d3781ddd6bbbed4fab18ce14f261b828ff3edcae48c3f0897cd9b37b17013e42be85a53ef1a986dec8e62750a2912f1a2905b5f02a4f13081530ffe435b7fe3cd60635736de89cbaac9af05dab15715414e4994cee60ce33976429b6768fd33b2edab8e7680b5ffc6e45de0d2bdc63f4d8ae536dc42987210a99536f9439b7aed24a1b402daab64571b9226f8df88c4261cfaede929754d00146641adb6ff13452a8e437f7073f9b6ddc72234cbb8a4e5de940676324b3a0e6a0b8b2561ecd1fa07b673e37beeae8732866cd4d005d5b0066be8dc8c11a3828e1091e1a18ae04ff888e66ad4baea96d195175e93c3b263189643be22b63423128dee35ce16a1f200f3d425f96a07390b16259c5da96b332838d0e73bb5d29ac4aebbb8e5659098f6110d89b1abc29599dd4425a94eee72771fa89120dc93e2b3fde79fd5c57a15182c959eb9755d2141434e20fcf22b952804493d12952d2ac419fce2561e063d5042e17f5947cd9ef836ffbd918950467023da129d878619a67170b737fb3ee0390ba754263d4279c41ca59114cbc32798ee4aae9eee2e23dda9529dc996710849e9c4b55e9d83905f66e4a508f4f0e85af5ce5ad1b269455775c574f532cc68bfc81c2b4315de357ccd8e962562c5bbd5a701600bac468d489e6fe31696054927f39c01f5c097be222490161733f65c71c000336c3c5aa53f598b843b53d09f81e22a530839b708d99ee3ba711beeb1ad5087f963f6e18fcdd75a9561d638c70dee1e29718cc72f45d30f6774914a860a80bc60a7e9672914b0dbc74423f9155812bb629d2769c89ab29554b400b666de420b12e3eaf4ee22d3c14f7c79c3f7efeee6675eb468e2b0cca11c649ad0223e4ab86d4046f406c6205d540fef081926e01eb1bf3691ec541cbf7dbb160b5b0d650addaa5b019383c8be5a725a66640d2c685a683a4d1a17447666ce83a483212aaee64c685a02379232344a6fb500b2cb2afaad2aa4cedbd25a46640f2c685a68bacd121e844666ce8ba483212aace24c685a62b69232344a6ebd3d645854e53eb532ab1d26d822082e82da1a7e06c70ad711b9efdca95b8f57fdbac1eff963ed6d2b4b0744d827fabc1756fafe12bc1606ba0df408f36d1723537252773bbd0b158720e6df7bf6caa624cf00bd29b217c83712d729354db06f56466e4b4fef8afef506615ed72e207d25f7b1b9f5330bc7dce535621386483b3df22813faa00b5baa907abf8f5117d663446f61d883634a2383085f321ce16d79955f9e8b04c793f006bcfe968c5799120b13ff766841a1d8b08ae4c475eb8f9e083e0ba601677e1453fa3289e21d7282f98c9259a39779c8146991237dcb506e1b14c004b888f68ab6323d7ab604aad9516474d0036e049aba6a6fc809ba61496963e4c75f8a893186c08d321467bb86b0c90562f0adab160246c8bc21e5db18f84d4557c019ed701f9720b5f716d189a14fe22a2512095b9825ae17d41f045a4c2cf7bee2e295475c847400b506428fcd0bda0fe356c838f4b5f6828b56f4c0afa3f6b8981ecb3705502897403221b4657e2abe18749b2ef709c4cd1ef90c7126c95891ac5b4e49cd2960d20cdeee8e8187580667a10c3146e98ffe7671f060cea053e77689d42ad11e2b2cd49f197b78c0adee9502c9fce6bc3dbd92144dd66e90d8746bd7d66958b8d49142e536bfed2c034081b2dc6182e1a2f21d2cd9005cc9e292efa3a30d540550df7ca57c485040ab3ce377210cc1faddd5b4010ab2c21a0f4812b89001ebd72d46d883e5d4e5ed224b622604b27887fe55207cbd1d64befc217a4b99c9fdd17ad03c18b9097012b9349e8454929fcb88e7fede65569f2dadfe304d47bea87bd964b146ebebb8891b02332dc90f24cb5f7ea70ad601489ac904dd64742243adf2690b8479ffd7b58e308913be91b8283be1b0422a088b7954592568f4c47c8ed5c8de3ebfd9e6108e1b6a32df6b150bad3bf90cead88be3b908031fac7aa685eb1f99b934d637a8fd2fc2f95ed5adbe1bc1c6f7580c5e7d841bcf0c2317acda340d1e76625052d576073e4311198f5020905ec804cddddbe1481a01b05c61d3064c96c44436fc87af4d89d860d864d5099b1a964231752b9211a91203473e0923fc31516de2765d6297baa296ec86525087f231c596ef556e4da68b4874386c30ec4876c4a5062a6a71dec60341188a7e9339d010cd598511bbeaaf9e0440a0aeeeed0c6fb3cebb83a2309c7a96436bc9c3a33eb403a83aa94a51a24a4454a05433a827d069a037015f2b86d6d24044a215ffd72dab3b8da4ad6813459a2d0eaf34b6cc394b91ec8c7eced923dd2882651cf5f36655367035474b1a61f0c51faf2d88fa28b7be803644d98431df16b327df6999451830228e933684e4462f56948bec45d885720e72f0f929cec5556a39361f97432cce6dcbd21177e2facb0470ff62e86a02e739b14deb835167fccc7acd317561d1f7c9646cd60c03dff4aab1b34df01e649938f3c2e0123eb1a2e9ffe983a7d9819ed29fec016f753153aceeb92ffe71a1cdbe3c56351e1d27dae60be15fa230cadab33a34b4e210b21f58c87f6eb4d430132e3f982cc1b3589a093dccda270f30c297a729a39fdc379224f21df73412eb7409f8a29b82a3daca2d21a58b4970ab2db123b2a34a3a801828d341a92484c98f172006a76d520d713916daa162ff6ccf986d3d2aeabcbbdb32205f36e151526ff8bbb2902e79a1e03c02e93c6ffc7a1b189375446de41ff4040aaee8250c8213adba59d4c4119516ade10d56ff4c080e0278294b15fd08054d531debd7f6c22b55fcf861ceb09f244bb81752daca16086b881f48fe35bd7f20254808c977c0b541e5694650305cd19b9d2d3e961789c6c3e9ffe1a1f98b4473823dd2342c07e8451f18c2070c2edbdb4f5706ee9335ca86d7da181fb5ce844e680d8c53ff966949f9e6be3306533d2d3fbfcc7ab503c5de3a75728ebe8cdc0bc69f2a9504cb25845863d5f57d85ea1287e3d1cd998b8312956150a97a84d29696cce6bc64b8ddb66a17caf89f2422ef624c02720980110795e309ec64251bf1b389711e0e304d342f16b6d3e2e0ea4420c99a119c30ceb135fd943a41f2f6b977e3c4e8a6b7e4ae8fdf0566a3b8e0ecb42c28cea082f1762c2d23193591ce3c1aa420d4eec5ec1d18c87469ca2235711368b63e08b997391726d10d4c3f4b5deff186a2ce62d9ea80f71de9933399c7891676a72c9d6c8675b352e319fcd767f794dbf37a38bbd1f36697b2cbf8e03dfb07337a5babd6e5c5f6d572002b61659a83606834f8bda6ee1ed0d51998ee1161ee3395fc091bb0ca08864e888effeacc105518835739fd2551f1ac4fc129afff33364a90fc26c356bf81b07235c695dbe702018630b839117a4a69342c738000d4b090df001895b10ee403a29b385b86217a04a6608bae9e9a1536ed6e2ec207140257620535dc849f2a26796943692bb72bea247cdb11ed633bd115010410d7775a33370f39b39349d49bbd4d383cd5058fbb73fd1c4571565288a5a501be06538a865b409ee1612fc838acc2e53a1955459ce528d94dc722a0eb86999b3eaf0002f6e19426f39e8a8a232432143f001acdd302b47899be1a62f2f82571e59e76ee49e61dd378a56a128564717b7007fa0ad0829c5d3bd918ce6e9f20416881c3cfd937751eb4e021271306c2a1e3a7befefbb600f49a863c2c926cce4564f6aa6b50686f24ce2c872a719779d3f168f8d36c1418cfe1ea038553ad1717912a0b7abfc2884c130b4be66548c11c3079427b62ae1dcf14064bafa7c4fccbd9e5b531d8cc05c0ac76a2d1154b519293b914f2b9be987e85c2b91bb7e2a38d0299aad4c11892f5cfee33c5314bb9bea0d74bee26d51be7fe9bd8e183013643af4bc0a028de645aef798409852a292ac9ed0e1595d9f799990ca4d8a928e55cb28fb3190cce074231920e2951ea1ec9cdb491c4727302cda48ae441b24b41bdf80c0b0b3fb65f9bb5be883b0169e233618a5b832be284211ada1ed48cd16d01b21c61485475c5c5d370fe974b8942929b948c9ef382820abf79f1d8f49b062170b3f7e02afdc4379a33b6f23d4278381a1b9c53e63e2f46d89dc758443cd6a86ca040ff0b8ee4d876b87799c9ff95dd125d9bd8f83e4980ebc33434d5cb6a5732492412add5ed6d4648cfc3e226f2b406ade8a268124cb550c24a404ba2bcd39bf893eae94ad24c28e44f7624ff113e1486d97b6236dd03ce9d246b61f539b11107410eb29be194353ad942547b6c03ea4f5bdeb60160f5bad90b9c0887f0a9fbae92f83b102d81417180d799cd29c8bb5dcc011913423b5d59d1a64ca28df187fba10acdd313b46d2577bae4920b604cf98ea32170a0603efa9219ba2cc050e5603821f3cef0938e1b28a694483a591048e805d8707b9b927bbd329ac854211f29afefed11d5ea103250b70406f563e0e3081477b5ca30986b3ced3fd97f72169d783c7a5c78fb7d99828243a6718cc122ab26d10fda6318f08d857725e61f81423044cb3642e3ab3240c9b9cc1d397cf35d81d2ede7bd060514710a279c120b86db2039c402170475c96acefbfe9d50ad45ba1dbcf26a61c036c2848c2af6fb8a42e5084ab88c75754ae0a04d745601c460382624644fa1abbaf8a03b10a900a40632ea350151bb1e341fa03e31f79c5360305c098a6354cb56881e0bb45e6fa1b8deb599e674630d107fbae8c03809fc70c5c54147ec943a4f4d25428a1864cd248bcefa543493c80653d71d447e8b344fc6700100ce6a5189104979d394b1ca63c3df0dfdb41f83db3810ba5c5bf57e0d18fef472b927ee9bb476664a61cdc82386bd38723894371add02384095d6b33e9df08885987a30fca98d36b696e27c0199fa526cc9ed03b412089c98918e7fe76c2737e487e03b8af47e908bf1990ff8d5b336f7ad687a06fecffacd3a14c1cd9bcf13a5101c3e92d14e7c0d2c6fa0a3333cb34bbf1c36efa860d3c68017e24941f820f53033d5984d88f7e9232613f83744451bd3134bed142316f29e3524ef6fbd901f6081ba52ed814f6aa49f0a79dcd707eb3655f01242032a23b51761c6a09afc8505e577ca37fbc0c71fee99ffc4988a2154c7cdd34f163a41362e08f783863e091e50ba5273a2fac17a51c15f003e097a0990c62d32d313362484c48892cba8e0f870effd8794d7e627e30ebab35e95245aeaee243510e39fbc8d20f48f813dc085737b2f40dec9bc562341346a2ab554f30a40ee0989b1ab6c7fdab1b67211c15e5b8fe285e9ea1921a86459d13be27b768133b15983f5c31ea9f4402cd3196c31a48fb4def3e0e86455d38d0979b9cc5dea0a0289418b9f4404f061a37ba81334334874e521ddb1538132146e6cd9583386200ae6b1f17b22197394b36a95dc78df3e0730fb28f24304b4c3cf5446ad4676c1eb25b3be01232449cc9353dc191b110164b34850ac470a250fde967a33868410317d43a9d3cf98b010576cf9e5b6e49f420fb5a0bd0f2d8f65a85086d55f9bfb37bad1a81dedb6b771dcdac51a8247b7477658e4a0a6cad2417889d1dda536d8fac324f585c48dbc24760fc67057ad3126cd2531081025381d50f9c884571da8bf8b4443279a5a70354060864cce10a25bbb020c9d0180be67ea6106c6c4cc087c38f858eea220777c0c1f6267eaec8847a6db7d6ae94804aa00ac2d7b46a05d74a7b0df01b940bb09cee3700bfd50089ac201f105abfc10409774ec4aabce3c083a21580152092b5d70680b0a5b90f97bf833079cc75d7ce368594dbd388e7bb3ecb16e2f9d81115108d3a2716a2739d38736c7fe09e711efea4941cbc42e6d04347f0c970ee662740853eac5a7b2408d02f113ad7cee56e82bc09d00f7ec453021393ed9b68acbe88844cb677481765a6b8e464113cdf454ce15e39132cd4c08411295e6975272f040663b977e9c06110700f03ea2d906ec4e1071dcb7163b39b7bcf8e7e9198aa9666e9a637d0ce8f5d54ded6420f62cec3d5a43c35cc0acdf1c2ad2df478b650897904bacb2e32914bc2ff4d030419c2e6050e2256b89ee6e0dac3763e852f213a08541b7021c78023ee93b420e01af287a512ed7ee548484bbc16119e14279bd4045b5199095ca8485b60cb60a5eaadad314c1085ec7c5c520e0eb3b26a46595137f278cd65d112edf5619d664a4b34e3a706d2485fd7bc88a5243ad2819fd63c79cc59e3b2b0319710d251ee5229e665cb66d8efd6d18f059f50722515b676f3d0be8d6f0e70756fdc80afe6ad45a6a06a1936c927c4b7c375acc484db550af8322bedcf06e81e81ebc02d90a177448fa10da059e71fcc8b4c72e6be893d021bd93727cf78b2210a5b7b83634bde878057dc2b180ebd0fdbea083104a8be287c007bdb3e211a5ceda22f7e59c051a5998d5ffb717482272c46eca51180f20932d3d5bf965e00b070e8e45f37f702dcd03362208f9c3f2e52918cb5c50c7c56ff8a876c007779ff94a527f57bef164a700542f76857541cfd7de5e7724a2b63a0c83d0868f827a77704e7f5ef59a6b9c9ad7ef9f17224beb23996915368c61612c5816ea073e7e6724df4e4fc9ded551922fa459d002c5bef7e3381e7f5c9e606bd9f213025a89b838a4bf3ed5419976c1d6045946d29b1efc7d3ba8cebb648b85d39f6c31d1754d2b0a772ac9c882b089fa8bf54f7bf2921d7ee15c2f844e25fc3c946d036e57a0278174e9593f222fbbf5d23224a7fa6fc2cc86732b1bbd2190c027a5de4e071e3fcb6a09ac059518cf6680dff682574a7926dc6d5a46d3a512d3532fba1da3973353fb5c8c8f12cf2101bcbeb2e380b035c764f5d933c9ef0a44e49f7a1fe6be3362bc55c7fb2f694900db6f0c8368c5f1c0c5383cc627cd9edbc1ec7222edf0abe0fe3d1e1b7616fdbd5790197ba378e8981ff25d3779ade1b9d6068fbb6adfa5b9bfa3d78ebae7ca14a7ffa4e9c0739fa4676c7ec22df9f6fc6215d1042398815c61719581f544cf073bfb7df996e2eca088b86648d3487f6db781ca66250d3673d0cf6122da65b0762320642a83af3daafc0ea6dbff7e7b47e6cb25b55a4be6381fa4aea2c941c9bef89667fd11bfd970e5a8b59dcb31ce648e5f0017eb13e833a6a5bf5be4c88529e1c4c160bb13f07cb599e33b73be37c312cfb000cbb74f18e5b2d1729a41f59fa82028125550322630c2f7ac2c814c7e03677fb45584ebcb76cc73a5742beb35b04b162405a14d41e1bee71afdc38710aa449d848a3f0751feb230b7493ac8f769c47f0ba314f091f27d0f4d060d6294f635750f464cf41cf946cd4e5d4ace07bcecbdc9fba266668ac3d03eb213a6aaa03be900a9da6cec7ea73b31a96e1e50771e452ca1aa6bebd14234dfc7601ea7015d75c42bbe9c5f4a20eff4e2b2d16ecdaaa19abc9fd3ad3c19d7e5d5cd44254caee1e2e07e3c579a8dbf618c4005a144b4958f4bf479c02b61c9228807830a9aadff5060e75ed4b48c894cbdb93f8e73f8fe4a6a05d69cbb2a59b6c5a5d50ed29fb7633fca15d5ba16ad0de10572e009b4b2bb017ac1ecfed37f1f6ce036dd4c78a6f53c01008b05523c68e15dfca0b90ce0a0d5788beb40f411b226b3706218529044eabda74641e0770df1b7c700576b630bef796ffe7cb34809be7b1d93a5c4e80ef3024b4578c3d8e41ad9393d62b58a156f1396262391c23e47fccfb36ae593c50c6af103289de584369f6963bcda2fcb46e4afa5742a884632d9f2cffdacbb014bef89fd378cc4946777ae31607385ac3bbc7959007b59752f8fa85792e14ea844751748c36fa9c3fc312045da42e3cccb9108c9c790bfe976afe1ce8f15e46f07362bf5df495765d4225c39d2bbed9fb34cde06b859601e3e6438a4132bd727613bbb4ac50f723424d2232958c1b1628900f636e48cf656b05a20f8a9df7929e09e07a540ff474af62abddde7a1ca4bee97aedaa2821aa4037b2e04ebece5e4f32d0048ed6ea26ee9e4a20eafec458bb8e009880f6be2fcb6a43168be1595207e7e09433fcd0113bd88dc7821b475a8870bdb71e5ac413f8aa78ee39452b72f00c9ccf37803f2ca348692599a36d9e4efbac0fd5c2a3838d8ac4ffc88cdf46bcdfccd310322495c1653b0c5c0e665f63fabad74fd1cdaba1b545d320e9f9f41d12dc91785904e26dc2a54486f7a870311475c5376516d53ef8a2271538298cf0e5f558d8bc45b1bca0d7ce790e18915484f05f2299e70e3ec50bfbc4f7ecd443f6cb7dab15a10a86a647acddb3134834a00c3cb60c0a0ba73c090b88660fe095abf08105e0a43f31df47564d942fbb16a37176e694fe4d4d13b23cc58789f89a54453823095b0dce1184298a7f05677ed408f5e95d2b37d939a575ad4b2c60a4d3f967fe6c4e5de19dfc7f6c8eebc588bac794c66527e869f045ac29b56852b451ee36a2022a73643360e10519ca39cede88167af5d52a019b9efcb0601c318b96203ffd022da751f7a15a9ef324c11e56c3a2934375890521eb20314110155808c3d83591629df5f71f6039e81a3eb8845714f8b2b63c906776fc339f431109323c79d6bb6d9b0c1407b17f8164fe01fac7dd5db62fddf4b4d1aea04a162f3a1f18bc8b41f16bc40eaff7af9f9ffb2d7e2f4b510cd19aa0aa7661e6698d138315088383ddd3dbd4f9358049833f426600638e40a5c525e73bea806fa36a5d30a9cf6a344c064365f1753c17e7822e0a4eba59e09830be365e3851a0d210599097867dec65e6142b3d91eb4b54e0553d452a1a0493844f3cea806a41706a0db136689146bb783ecd4c076a842fe456840624f2426c5849ddbf839df2daf27ff33910d6353b297e9f33410c807e95f84dffe317a33ffd9f25a2f80f6ebc3f1266ee486483a22c2833f7255fb437330410162cf7acf62a2c370e90b9fd72f7e11d0360a62e698b270da010021520237bea6caee99e00a4ae9f89e4c80fabe51c84faee03afe81aa4d9e1aa323aba25a0dbf942f9b56d0d44f1491a99adbc3210759593c6596d294ef84f631ded49b67e8fe6d733231b0afcceec30c802c56a635df934a3487554fdb2fc8f54183b48006575d2a65a17f4a5839b2d0917c6a33d63c385a05f1bc04a9eeb394af360a9daf9fd9252562d5b2a4a9f14979c2537a516cce3935f870aef82ca536afcf7e48f6bf2547473ac52d82eef3a21e78d7a48988aca9b79fd2c14910ce89267d7db19092b2333fac5265038543c5c4eb8f894cfab91bf82099cb9b5fd79c3d9a0e50b413d5626c766215983d02e488a1db35b9d24af98a2b4c8dde277f946c269ed36d20deb256598baacc542f02a4c3505cc246416c22407ce082bdde0b2bcbe61c3e163d8317585f49a37cf0165cab21b11ea2230e907ce5452dec852fff556fb6f5fc5ddaf0d90a9438133c9fc917cba1eebdf1b8c62b32bc85088cc04992a969dbe5bb2a44ab1698371267b45d61acf5037abbd22767d53df05905a2a1ecd8f268645f9344fe399823f0d0152fc6c5259cbd1cc8fe398e41c4d4f2e1d5f7629d7cefa3cf85aa29c8aa4fe46530382a65f475bb7ef40377003d75b4031cf8aaf6be15d99591cc0103d72499b2b1a19e89d2090cbb0d7190184aa00103ae48f70ffd2674140997e22328d6960e83f29cde6688bb8c9a2e9907f4805487a5d755a71067d18e2ec7182ac658a9bff25ea0dd6089f1844a0f75b0c2830f735eff5ba584f75752272435c7155f6b071e8405113e025d6a896348e25b0558d030367a1b04cf7ad2ed3251a0bcc56293d9a99340582b1e6d165bf0a2a653a1efaa06b39ca972e0521e3b28e6612af56e261b2baa4d9dafcf99d19a6b72b8ef4c3173400a457662acc4115611f8a44bc4de3ce443f5b96fc6cf999d64d2e17e18a8eae2dea4151e57bce32edfae6a1a5961287daaa9135517fad871e17b0688cda965a821b0b3fc9c290e3ed834f8ee10804fdd52eb17b8bfa70becfa5ef6311df2885cb9019dff14ade27fb92ca268679eb2d84b850f0351506a03be3177f4e707d0aa9c7148ecc620af42d6371b1a0121c00c930c3889575a4b1aca34142e67d3f833f31068ee0d646b106568be0d1fcd9ace83f16e0b6359eba9d04db65191e87b71d8b1760fd6f4610a6408091dc981e63c02a4570f3eddc53b119705db116c5da8706bdbeba95d8641547603595d225aaee7830f229bda47ad5e5b9b59cf8641bdfdc813d52df5e250842c2a850df4001d6b03ee8feea8c84ae0b1e1bfedd29e29f1c2487bf32f3c350978df8ab823120f6c45f1b7ecb8e6af3bea816d29c17eebb24108bbfb045c051ea0e774bf469fe0e05151e9aa15663cb5e23b11ee162707d1957af4b7af7ea676082c16b0685780f581c0e58b73b0aca7fceb0321514c92afca485e343dc2823c411633831d43554d27184a8bf35d5f15618b31c13ee3702b0df3c05a6d14a5d99738bb55abc3caea795a605230b151ce4f078df39a6a447b5d74bab2a085de7ce5fae85948117db1f780a3ac70d9c8fd0e7f26d75e27695091044997bd176b7317a3f1b21654745b6ecb214a2cba11e40c16524338e98088a3506b332f97e5b452b89abce46d9a14796b08c3fe8e0f64089a23fc4a3a7bf0f9f9c25e14448f32ba8f06a12024bb6efa8b8914668b62446b7a18ceff8786a316d7e0152348e5233c5acfa0a24560f1c528058dc11538b8688b2fcd2d231aef5e7394df5f185e6b1e3014b6cc48f043307630b1d6ba73a52650fc634d2eb71995dbc5104b0bebc2265adbdd4e3e41d1cad2a628dadde442108f50ef50605c246cced9794e22f0c1f1d1c43d56e946b40edc6a6e3995b24f40b07dc25d012da51cc7b52d384398e20e0d2d8e47ca817ea90043f4b199cf9ab364c54d0d0af2c88ac8e63b634d523780e283e738e4a494be2fe0e20d6f7bdd8d7c1ba4f84e1078bbc13d37ebb324e75137f09d46241602797a50e3e735d2438a222c1533c9316395405c9adf756d571e9d825834e9288d890d3e0620b7aaf700ef57e940c7b0c446a12bd0003e7e3978ef1c1698a508572839cd1aafaf1ede8e4ba271842a9e9dc01ca531baad43f173466a9489037153bea30ff1e45cc799c8b61874233848e17c158caf867c241c508c2540ef6e9a82f174f2ca32c0843be5cf1be941993c0c4723efcd0a52f04fa9ab1b543e63a6f09fe369a7bc7398b415472a5eb18884b2a8d63e3144c4e81165cd1eba12b343f5f8d8a13998ad0cdf82bafbff2b790ca8023b54d7f0127c497d8817deace16d4746fbb4dac2e50356a6aac741b19b212d80acc089421375a4d5fec90e60e20c53d7da153b2c9050f392f3602b4d2d34b9017c5d48784cee72445a9651a133a929be4939e8455792ae1c63824fb88abdf9512a4360bb0d551fe86ddc43db048939f901ddb27849e0445b1eca1f2b479c98086311cfa4631cbeb5af213b6741fad49076482f2abd3583a98e580048f7181d552e3a869149530677824f16d9d5a0399a55c30f5ec8951dc403f863c39a17bacc673c4b38aa8b1bb30a181e6d6e7c84103d0ccd22431b1b4fd33d74e2598bdb839951a2de34e0ec43a301fc6a0f3db0740da5e6d6cc8a4984687f4dc00dc20048bd93238a5d020fd97165ef8f5625a5ee23fff364cf45a23d3078f2381383f12d6a5a462dc0b88f9375674c8627a4b0b99c45917a26844345ba6e42c669629fad18f8d8ce8cc3e5aba86f187c78e4d3d8ac3dbf1bd6db39e2e63843d5fd4a4f8819a366f5b874a86763d99654e997f5ae30376d12e2cb06bf4298b1872765c655b0e1d46d6d657474b634dd662d0bd0aba70524ef5050335e4601094c40c738c7625f14c40b508f807236af8984ef1a6a2435af4ec9bbcb8182fc9070f469da182f9f4ee03192d25e6f438728d7adfb2232fd73b09775aeb7fd317b78d5c2d7313cabd21b64f68eb0adf73124ad31e72d0ba3792770f1a2abd138c6292b2da1cc53555d53e0ec99faf4750d4ee016c585a635ee80a060b74eec0f2ee518eeef5447a65fd9e7595e09d507b0ff19bbf28a93d2496ebd0b77c0dca1ee242d96c68dfadc11aa81a66e72ad28fc018d1875e59e89fdf68b8c086bc62daf9f4071620453d6260014fac2d4a7e22c92693a71f600aea02b742e3742befeef45803ed033ee47eff5a4892cf8f0e2f55a056788017532defd3802e552214b97a3a06ed1cafa060d20492295375977dcf7af4073f5880d29c4fdb946a4e0ac60794629814a10400b45b2ddc2f15d4633faa98ef1403cb45e94a38caa4c90ff00b185d2cd931a61133c6236accc2f384eda415e89d87c20fb883810d456031997d0e1c7b215a9c23977c4dd88d8994b51506881ab04e606460905986c40c480f5f3a790da00696022c21a931a61e706af75ef3a71dee02110817440992c12044706ef224effa33893c43858cbe817f7e287aec640ffc05ff1d1e40e8950294efc80dcbf4167d8ff4a294cd253c050e6c8fe39d774586ab945def8a495bcf6062e13c55be4cafc9a51a41f3455efd7087274be94de2bc18f2fbd2d48856eca64bc9a19759af1613baed8a59436b51de1c19bf011276a1aef245b04b9fedab0d206a7f26c0cd8b23cf57a6cca6e936aec47a3b2d427981e47b0b7b30c1ab48c56434c0204f937dc1f50db6d968f83740d32e0ec06a319c1ea9e34e9dd5b7da9545ba2b00333f865d5830b30963419063e1415f06ccd6564a0a8d6e5022f4685cafdcba67794cd04cc23bcb5fc99968f96c9d8bdb4523ffd995655f0a7662d579cce31a9dd6a67972a661ba6c6886b83fa4909c093a79ff958526d3debe3db4d2d0a0fa42eb119f99a3fa710581f3b9cc7ce7b5228bbe66715207c3ba2ae658a19f802437e5f402bb0180aa4ea84ffd5cbf78858ad88dc23571b43a788a0bd8832891094a3678bd4f4186000c3978cfcd76fbbe905557a2d86cbc77a6193875f55091e45463c1ef3ab9621c1c976bfbe93863f9e3789e395574ea7cb66fe9ed43fa76e713fc4127a3a7f6ba0a1812011f905a02093806d792ba70aed7d181d4d2d41240a007c7354225171df608fc08cfa0b9a257aa40f5ef4edaf6e0ddbcfd73ccf12e3d8a2600eb2074130d99319d8e433b9edb71da44c21058a4ae90e358c220c0c33a68c5f99fd86204a16b111858e7a035cda81f11bef7d024494c6090319ac438ce52b277e01b3695005a4d10e1c642296839af8eeaf241f8f12bb3e5c24765aebfea36a78ddcb84e1a3264d662bd6a71cca9dbbc36868dd5608e32303b8e82590b55fd773bb92e3a760838c285f43c352f06b65afef85cc3519ea5be92485ed3c400ac923c28b17f4ceb74d41e2e875c9c8e4146026882de66e46c105484c3115f5bf5035f7a8859f9b61f693fd816bc1d1a24d4d3581d0e27adb9226378e5d8475c71015ed99427ec8f179fe1cf2defb12168b88332c6473b016411866411a6920adf468125cca99a80128d8093bc9442eced8909cb1ef6363d8a917fbb02a4955ea51aba9d61209dd99640bc1d6f6d2c5c1ed826995e7e02884a2137021716809e25bca04079dbb31db7dee07a82dfac9e0d9f096db85fe1c261bfd5a7f99620a57386482b19027b8406e9e7e6c448d7019d9211fb85436f1f5929b3c981a25110cbbdc4601c2db8f71e6df92616c1e2df55b68a8e7a9c337d9f94f45c1b046732d45c3be5fb1d1f2cf6644bc2704c3242fd5d38a81d260a7be40ebfa28425d96a93befdd3d5b426e50ee892ee4b386d2b94c1b48fbaf6a960b48079f65b3ace77121ca415e344beb775491e0688c3920bf4d996c2d4bdd6ff644e85561c2fa09ee1f2b7dd75958e5d632767279f8608abd70c6c4f38e180239e63e1119b8a1f4c1b050350040c545985968a22ace464192d46690cbfb9e36341e6a4542c1ad48b12d9c373cd8df4b2e3188dc4dbec0f75bc8877b8d6299a380f485e9d648326904b40b0798116d11e10266aa5a9085ac6e5317ee428475f2f5f97cec3bc42105f86c916a7c7149ec218e2ed585648521e702c815e015e331d0dba2bf992dd03844cfbee03abe07583ca299bb79c442707384e2de9573d4af6985cca23ae1fc7b8ede0840b0f09166a6a6ecbe2c481ba4b44a6d0d62a78c3431bdd3211c2287748e79bc261aa239e6fa94c9e9247f7002aed558ccf56a99613754de132f91eddb3a624469373a6d13a53d1184517a93c752ca63de3f82ecae449f2cb9464d7748481d49014999ae89a4231901b92125388dd531806a25924c5982989cee908236b5ca1a4895c9c46bc5ca53d365f7cc66dabc905f0db3e400ffa3987f91764f7f5cfab138cb828b1f0894111e22862003417b409bef601cd27e10712f80edc3badaf041f2cf00e68f138a9b87d5cef55d8439c18ae529e57d10db6f94904efc4da7443f99b14ffa4f10c2c4ce1eb46010c995a2cd098a9ab80e9e68c2925cb77d04f4b3d1f83e153afad2a0479a044d9f59756948213edd274e4d6de1364cb5e8af46639c8768548742b8c3ae4817f337e9bf4dd1774156e93157127afc90f2ab3ea028d7b5aa6e9d49e7ed3c9fb15be9c9c82de4758d4042a8c9b60a92aacaf56f8c9ec5c82ae88db51577c6ec5afd8fd4037ae3be2d437e9331423e9f1c020e97fed22a59b5b43ab6bdfaaf0eae49496c4d2d7157d48dee9cfd61bf5263b64dfe37e731c712c6b55b9fee8ec8a7d87e50f81e2d3d19bfeee402bfa39d42d6be3e2d42341bed2da5699a0ac22dcdb5be5270181f1a70653e5eb97f9bcfa827f7b28f5a51b01421ddb9dbdfe78b302d8bb502c957cca1a7d3f3dc6fb8d56621f70191b60fdf803fdeda2f1032bdb178e4966891d83e341760ac460f354f2f74ab87482c4ea09104ef916d4ab801fc2b9e11fdac7db3745fccc52a239b1c48a2079097d9b7b0d2e37d335dc42b9fc6bbd808723918d8f7b4fa91f001f2b19bebf81d7e252b530e3e96349d0b5aef5e252d9719809cb5ea96336d915511b4637df302fd64f70c747108e01c96218f7ea454bdda4d782da2893509b323e470d6291a61a003fbfd0f5b22d27ffde16ae58ce9186a0338e10a35ad4d1beef349590b83ea8ee2d149b7c545788ac5c3810912989c10aa77693df5660d2ceae0f43ce8691826436c3ca2990385bde4bdb21903a4772cf667a3d3a7c2cee2d7e7b38fc610fb30d38c3778bcb485a14e83ec04785401fcf4015e80d5711f8338b9ee6e578b87b0cfd4f02c7dd58b353ba5cce4b64c5642d11b769197d39d7b73370dcbb5e1cc99d69fc2d184e4694056f1cdd20088361c4480c9eced83ad17e27fc0c0177bd3ede38f6c564702ea0401845999891336bc94effdc008f822f43357c30eb941901f016c3a81a46e025829e4ec062892447c112390c87b3073874c46a0d275cc680c4aaf55eeb16d49915fae005ae0f7408ad22353239c0a51188eb8672e1a5508b0d10b1721fa8708038b16b880a4497cdcaf435d72c3f72ad281d390a81d6826dc331fecc71aa93ba21b909a8516319139793b4ae5202e4056402fde90f3485f7056b4cc6d2152c8547f4cf63fe31995ba106e5a1a5340944b0ecbb87db5b4cd644fc699d40204b2325bde5d815f69c851b85be8983612a7d3d2b3201c0dc3949a252d698d208404ce4df62874c684532f27e8c53d1320021105e1ce127f8de6031d870bb0badfb4c260d75c2796e64bbc0dde5c4f19326acc1b20c5fc27602315ed97f70acf0bb5ed3f531eaab55c3178263e3aad271493d080a9415b2d254097e18f75834ad1df3af3225eb4448df093b2ab16ff3eaed8865a05a2119f9901d232a82b0e26b023d43af61fa6cb0210a789d307ee8237b5fef7ab6959c585923ea6621a38f9f7423fb217644e9a94c34ea518cce8aefeeac877c69e213899df7d2b0af18bd15b993d77ae76c04d52a555bf5686ad8c5a5f6713318755a0f8abc5609f99dc5ab710ff32b37a370f506002c5c8a4f7121508e1db1f6d41b482e451ca1adcf420936c826ae9da0c0053a64173695d5cb96b6e1fd8171c7f42615aa97fcb9e211645a84c2ac1abf9db87897f86987cac37eb28936e65237bf152eb112f2d78dc93fa826b58f72f70887e19e2b16237c25b5ca48ad87da99bb32896d77d758c95abbddb17c2c049605c1831212f6e4f3c6cd7f0c723cce9826aab38489108d9df1f050b0518fcebf4341fc7342c8c95df6279eb4a4c25824d1ed0d411dc693160bb7b1f98f13a3faa1f4e298f2a2879bfb431e8b5c58b4c6f6956347eead0f57323a1785fa2af23183b9527db81dc52a3370e1bd32efb3137aabdd81e229823f21a2cf9579fa204cc5ba5ffc517c223090a2a2243427a6f35a93af56b8cfbd84a046317a9f82122b09e476f281fc37b5f3eb3d1d467841388c491ab02dc37f782160c32a8d17a1cc365a5d48892ea5d2fb5299f48b1a31afcc18c52b169ec4c113490baf7d8f5bbd35cf033f9f7ac69b3464a1a513a9264fff89efcec429a978d77e22b885002cc5068f459ee5b091c46d1fe347332ef188c8f9f9780c8b11d6492111ca78e1a895ce64dc9f859e94153f89c622f3f6caee59ce16e039a5a38691269600d0f1466ad1886639c8902f95f0c4b1e5def79d0db969da5afb3500803f51a0287921de318d7eb691754cd315a377dee610837c1f0267469b5176f1db40d5825bd25f67f07671079bda0f01e0a264d66fc3e87725ab84a723f062e4a7f30e36e3094b36cc82a65886b261d4b5302e7405f5487eb0ecc7b58332617b05853e3db9bd17cb41345109e8c5e2bbc5d6ab9fda72c8ed907a44acdca2f3ebcc71687f617de30a0a127b72876aadeeb64c3473547f45e0383739b070985f982c0958364b3036c2341d248f7e5f1359e7a437b0bfb3e69eed7e62b9de2c0374241def76943db2e97ea10f3cc1dba3e5bf3234db1dd69242eb0e3339ae3f8f5911ef4b6fc6dcade123ce7c703c2b031999821263de77295019a89887aef45b8b445e18751339cb1600ca22b92f819b0f80185a57c3d7fa24b9e18d8042b81554237252a6a53a97f133dc7c24e22a60f6b7eb127d31a6e200d0c9f42f5d7a45f4afd010712e9a23f79242d5c4049a84b412b488ed286fcadadf36e372e79bbc30df58040bda173607bb71b97a726b47c4c96daa266145d6e60ee0d630cb0ab787c2d4da62c26e34830cffa5ba1ec1958bc00ec155193e6c503b9afae472c6c115004be853e169787b5398b54e94e8f087d4c8fda44c8d7b7313f6ee9d02291347137fdc92f56ef39a757afc182c03d45799d592d9365612a992270ecb8c92a592763b33aa91901572546915318ed9f77d558e97418fbd4fda0ae80eb3cd6de61a08d15b4201818b2343af5723fd729937a284139dce4be073ab4f86ae414ea3ab2514824d7ed15556c59065ee103020ee2ac29b5fa53020b4c6db9013b166c012f9861851511ce0fbbd57d09d1aaef3a3b6ae9924c9957ecbf8e1b6b39b4a8fc24257d6d9e143ba95621670d3274dd1d9038bc4d8496682ae6628e2da977fb48da934b1f7a263fefca932e67bcd814491460e1da1dc86ce748e76f3e4704a6a391174072a793e35d7f0c7c00460d97821948504c7201e2c4bd9b494090b23b4da9a40eea243f0a88223b34f98d6fc288e15e1f4e2415bf70ecdd3baa1086ea9d8a8184937fb88b7bea54e7c233f62ed64716e001c933074a427355b014d037165d594fe1d8d89e1a3b11b85616d33e8bc0d871ae0bd587cef4424e0f2a76825e62dfee5775560967a8ba218e6bd6ca7cced1f08f4e9d488671668e0012d63e119c6ce6c66ea93c58f5bb93229f50f47ce509cf0354c83f68d9396719e459ada5b5344eac4db14edb16135c036430985e03ca19500bdfc503153394e6d19f1dbfeb29763e125c777174b2a5ec79d84d4a8d0fe894c7f679b88fb2f4061a279f4743c45892a462962306d88c91e3164e96cdff6737b65c964a3814b38d158dcc6259698d1c4a57383df1a3b52d5c3802f1156926c35107a098e77a38e61dfd5720820bc858c26dc8783592cf0325db0a76e588fcd31ce58bda65205b92a0ec71739fe64155b40196efebdbfc794682d8ff452740cf6d327e618f595c13875ac670965b54e910cbf5ac4e0ca0486aaaf82db1b3176a6c23ac6e4b1a9e79cb36b2814c8e85e555628c6671072f4d57df5b8ab7752b4ea2e0295ef470d45155c2637799d1508a85d84d1b64d98438b2078151a7247ba980d168917fc2ef8ad7e12594437b74923e490cbe7e0bfcdf8923dfb6055b8ff3817dc9c531a0afbbfc1afaeacc71b1f413c7e4e4196f3148982520907d18a1a77e705916dfe346aa2e543b3c229db9452a991a9a47238810ce764759a154ccc54288e733fb378e11a5eb9bafe7188938f96c67dfbf6252c9fbaf0729b31c9e25d9d443e9f8c1eb418acec45131efe22fcd307bfaaa72f2da532f94a3a55dc9437eb88e916694079035045129ebc1de311ce84ae1c86487b048a7a2fa7050bcdb2d100d27e0eb55408c2d09095cdd25f1d5d5daf3153fa3bb5b14a68ffa5591326327693f67199746954e2b868d5745a1eec538bf7ec13e818656c368a3827a2f8051a436f52b9875100f0b3cb42c70298e4636043a65664c9461894dd07ca0739ddd9d8403f941b1a811fa7db1fa474190c546655fc12b4c064878ca7cafc41e6e1b0d5df2e97126f9f069d4f62d83efac4cfab23b9fff1540e234618254a4482ccc52fddde96d5ae92e5a6ba3a0ab7b17d29171c702007f27c67dec8b2edc918b726e5aad31bce56ea013efe416d20d7ea5962e27b85243886213fb57eaf680fb105fd1c07436c6d9e030e445f37d5a62e1f8fdc002f9b1761253dc70e7bd33af5e1854db1154ce44784244f85db89238ed0b12c441cf3caaf01b5db08f9b97efa6e788a71b99561314d7d41d5105ccd23735b3598f21450df42031ad9694fe6c4137b9c3948ddcc96f1b221c55ad7c037bc87620c9b167bedfc4172bc7b9020cbf6f5a32a1d9ddc6eca0d8fad034933b71456deb64dfaec30e5e1fc3269a832346c62b817371c12b21d5e60a812604889a18c5a369e5a436cb04b9cb7698f5b8acdcb751bc57e6b7982d872be6b8bafbb5e8e211c6358d0729665976e258489b1c181e973e4bf59f6530d1c079db984c1388338267f8c45779984024f9e3ef10dfcba0d48f397b729f664e526ba9f1a7139933ba8019bebaf4ee95e1095c36c5f60af384e5bb106369a0456a61853b370d96ad9b82f9153792217529e354949949869ada75118c2b8652365a4f10a382310b107c1cf1123147d344c7f273689b24cb6422d08adccee6989ae2ffe60c1205c80deb9f7eae7cae557a7a4c750793924aac9ea9f79d8f010dc00435bca7b30c01ce81ae67691e8373f1f012173e555608e36dcf286ed0c1400042340625feb1c6302fa26426e5a405851710ef9e37ad5d91066be59b959b98db00ae47639cfa85cfe0e2db68c8764a6941b6e19b316ac8efb33e41e28ffce747cfa676e5d6f964d1932d48a9c867e90f7b608acbc0f13a69e86b7762df1696969c916b9a59449cad706d406140714957748febc30d8e25f189a02e3c5bf293f6597ebaa5cf7c5d5e3a6ff4151592633c38da698397eca2a1d1f3b3337954ea0a81c1303051c9af2e2c5b7303f71b59a8dd56435f1ed8c9b462fbecd0145e596dc6275b0c5b72f9ae2e2c5b72b3f7132998591d918f1ed8b9b465e7c8b028ae27474ac0ab6f8d685a688d8fcc4b95c37974db9acca879b425da028cec6c6bfb0c5f71a4d69f1e27b0f3f712a5195a3237393a80814c5c5c41cc186a6b070f909d76aaf1aac168b7113e8c5f727288a6b71196cf1bd455356bcf8dee2272c93b98bcc57e27bca4d2167a028aca393861e9aa282e627ecaad94490285014b6b199c216bfce68cae7c5af347ec2aa6ad3636315ce16c117bfee80a2704c3dc1313dd8e2d7199a42bef895e5a75babd556cd257aafc416bfae80a2708bcc96f0eb9e962dfe0628eaead4179a527f7cf189a029b646d25cd7654bf86da6d8e2e7a0a86b534ff0d750895fe2a7ab121f074dc92f9e32b6f85b149f7a4d7cbac50f4bbb6350d48d21a129f7c5d72efea5a8db524ff08be2b3086d88b14dcab3bc23c39cd560e6590c33cf48cc9d8d1f46670372fcec9265d7675776c9367e15a65866558ec9aacfaaacca311b3fc88b7054cb2db551ad86ffe3021c91e9c8463299cec64f8a7c21ce65c3b9429c8b73d96cfc630b4fc4a9b8184e15e2549c4a64d1816a5c4b0d540b6b5ccbc61faed021321d510692c974367e50450671d980ad8d5d2e97cdc6ff7d3810ab6242a189555815b3f17b24f66e0db798b7766bb7865b36fece06e4dd67ee71653a32994c67e31fbb6a9e62cbc6628bcbc6e572e5d2fea76d78bbaa98abbaaaab8ad9f873795f9f5d2a5f1cfa18df86304769873a36805ec96d2fc31a58222dcc9e421f16a7a2c22bd013fc219665f590e10e2ccc0235b1381b876648a3262e12b4395a93a4aa0c69a14e58f3127e31455a9ad571937fe8e3a657f9966ff9a657223daedcd43dfe91e5271b421f3a35b0acb4b2ea78c9dfd6ec49dfec6da9a8afa7ea9bad597db3b5dac65fcfc6b765e3f7d25f97a10f50dfec09547d3d150586809ee0c7ad5088bc6d0c8ee043c3c6ef81296a82bf7391f7cf31465292a4636c8c6ddcc34d18e71b5b86f8439dd047680b77dc740318da325312f751920b8141c5e6fe0c6b1bfbee4295df5e1282d50404abb3e434a4210d64c0416f28c596524ca5ec29a47909bfd624982aa991670d4a9f3fbfa8fa4cbc5a6a8245fbd586b2cebc84cf6a0385bc845f974f4272120e6d21cd9e4095be0e69236b92608b9f2ccb96c01408a6367ecbb2d6b636c84fa14e48dbf83167863427e10f69e30d891b41848fee5d49482a899a50131be768a3640c5ac5bcd5a9bdf9be4b5217f051774a5d9336a594d2b72709575dacbf83574aa9db15d4b8c065dbffd1d6f162ff1f14a1e5ee19898f929cdac6dae7dd4eec6c5ab3698d13affd7533f040f5e12415bdab596b4420eb6c9f779fe09d017992d504cfdce29a965bdc74716ea9b533b76c7f4db3166bda06dd844fd587b679a173823cc14a02420f7e00fbde7e6fbfb7f9bf1f90f56d063feeeb773091f0ed772f129a2ba4fdfe9fc19cbf9cabbbf739ebfa67a907fb5fadf5ed7fa6883657485bd7adad36a9973c81e4b2105e36f842486df06b106c1bfcfadc7f402069f867077a7f8a76491348fc3d20cfdf9c8828229a2ba4fddf7f689e5a7324aa3f232775de73ff24249af215516da6c80a699fa5cd3d0e7ba80f7e22dfd7074d91cf5c3149df67963829bf57ea306fc9134812ee0a41772191d5367457dec96a9e21d71bb4377e5bfbd51ee176bbdd6eb71f3f7efcf8f1e3c78f1f3f7ef0f050cac3c3c3c3c3f3040f0f0f0f0f0f0f0f0f0f0f0f0fa53c57a057ffd03fa6d0377d2ba2dea8bbd35dddf9a437f63ebd91c35150ac0f3430689f3436f7278dadffcba1d69d17aadc0855a8933853a57b4a49e767e7d007fd81ddd7815eb7b93fbbddbdf77ddff755aa452f54e9fe03411bde50715a5d54e14c120c4bc6b0bb074395ce2cbf50470b12d496a82d21018637f679c14c821d19aa7cdb0b7df8403eb0822008829ffc37befd0955be1d863e84a14a163915e10fd4525b12c73a8ee33882842ade67afd37a73e6793f0401c7f0c6b74142956fe7f7810c55f2ceff81c00f28fc81da7b9ffe275401a92020202020d46a317f671641777032bc717e74fedc226a1ab636398c41266a944841ea474d1261a849620b54a84902a726091a999a24625a2e3549a868528c80268516f51a160c8107352c80a25619d4b0a089255450c302550d0b4450b344196a5dc2b669354b30a166891e4478a959626689989a255a354bbcd42c8144cdaaa76675dbb59a15166a56b37baf6c45a3398ee36ccd4a6605b341b5f33a6fe5426b562ab0c7fbbccfc7f6c75b38758d1233598d1236354accd42871831a25605093848d07f66f306d304b26c93c5d867986c81acc938c6192983ddbfea7752acaceb4d631cbb22ccbb274f752246431cb92e4cd2731cbf2cbb2bc31cbbacb1b1c3bbb49b83eaececd51c2ae7f5a299090f488d162b1180dc6ffffff9765f965f92d4296f21fc6970fa3fcffff978151d6fd322f1bc8623028cad205a3f46db6685aad56a67131323232323232f2ffff3f220a597e64a4fcfff2cdb38e8cb828eb1e29afcb4562d78fb93077754bf06fe65486c9a99ccaa90cf362341a8d46a3d1c8c8c88f8c8c4221cbc868f43ff23f321afd6834d27951d63dd2a95de1a66eb62c8c8cd05e94be5dd07a68345a4f0b914824128944a3d1e84723118b906524128dfce8474622d18b44a258dd221bb336568a1c9c1e5608a391a58971395c8c8b71312e4724140a8542a19048247a9128b42264118542a317fd48649e758742a190485977c8c2d89665c2c2eccbba6c1322912952fa6ec1b5381aaec5b5b81647b32224242424242424140a7d2814f29425141222fad08b4221211f1212725b51d61d72eb21c3cabad8169e5068874b71301c0c0b1008040281402121211f120202852c212050e8433e1402023d0804c26151d60dc2992dc156a3352124e48645e97b05ad8746a3f5807c3e9fcfe7f30181400f027d9eb2803e9f90077d08c83cebfe989fcfe755f7e735c3a3870d0d0e40203396138bc572549024499224f9f97cfef3219fb27c4812f49f077dccb36ed224491565dda4bfb8095cde72969fe0f3315594be414adf1f6ed1b45a2d4c2386611886614892e4937fde4d9a94850c43d23ceb0ec330acd51dd67c6861d76fe9d9e102499a18638cf108822008826018861f86e053961004c90f9f0ccdb36ed00441d0662ceb066d6443a0cd6e88108ea56f91d643a3d17abcaeebbaaeeb40107c10ecc69005ecbaf0c10f3bb3ebbababb98ea04cd8c4c8501089ab19c582c96f369adb5d6baebba4e8b214ba735f8dd835af7d4ad7b7eb0ea8b19baceacbebd164dabd5a2e1eebdf7deabb5de9ab2e87bb579d67b399a439db0e343070a1a67a7ec49cb2e4c45e9540a66dbff32c618638cefc54f592ec67e29c633eac633ec8dbed9f54fef66dfdf0d20f593968132122f64141a353f692fd9efabbb6b9a857d6a5917033264c1a6f6fbf8afb9b13b4d4fb1ed773820fd734dcb3ed72adef54968dbceb21736352901430918aad5b6fd5c7bea654d838c85644f51ba9ed88be2272d43d1025052fd5cb3a703d012be21c3b653ecfa67b66d7b02d63001b4040ce479cdf30320b840ad4ec89181228a28a288228a28a288228a28a290919191e1c183070f1e3c78f0e0c183070f19191919199956132f9bdcfedfb55a9324dd4e9da44f14144b51288a49fd9db6afbbd8f74fab47f5e4bad7b46e767d18b2be35754dd55a855d1f5354cda927f7334dc15fbf8b0129724357f3dc91b77f0d59aaa99d249243bf3f57563adb278924a7a24a7a42536050935b73f6ddd8fcae06a4bdf7d25488f424757fa7a3fb22c46273dc75fcdcbbe38b31feebb44c859b4bbf84046a20dcf49d6e60c1429bceb0305bc216a79ee0593dc1788734124c91608a65bfb0a49b03c18bb9ac3bef034371243f20b17df7070a59c122246a21321a71f1e24bd3ff6380d66f488b015ad8aca2c69826675b931574b9a85a5e90a02763ac059660e31f637996676e021f7fcef1530909fc1b4a30066c3929e525fc9a74b3bab4ccecce8c35fc38c6f8f19bcd66b391e4c7ef761b61fcf8c16030d868fef8e1e08ce58f1f6b1cc7f17ffc6666c6173f7ab7dbed36baf8f15b8d233f7ab3d96c368e7ef4767646911f3d180c061b5bfce8e1e08ca21f3dd6388e63e8476f666664f16377bbdd6ee38a1fbdd53886fcd8cd66b3d908fab1dbd91955fcd8c16030d808f26387534f30cef8f9b163b1c671ac3f8eddcca867b3d96c67d43b23f9e373c04ddd8f4f044df96030d8f83afca461b68471c6cf41511a67648d4f9d35b246cd1ac31fed8f33e36dbc8db7717c4fcf8c63be8de3578ad2ab7a827f7c2ac6086d8c3580a9598c1b9023c9ec369bcd6e1b7f0943343f18ce07fb601f0c67e3ff32fc8ff5cd7cac8ff5b1be998dffc50bd0c5ed5bdd6eb76fb5f1bb18f946deccdb19bd99e7cdc4d9cec63f22e2b5f0601ece0883c17036fe91a80b792c6f66f4589ec7123dd6ccc62fc242afe86ede6aec6e5e77bb79ab8dbf45480675b36e67ec665e379bed6cfc22151c4807eb70c60ed6c13a5887b3f1873e3720f13e738f8ed5cd74ac8ed5b1ba9972fc1a1a47f1e565b6339bcd7636feaffcbe63f17d1f4ce368988669982eed872bac66e919cdd22ccdd2333ac4ca00bd326f0bb327d2e6593dc18fbfb1045d600ca8025bc01435015d66307b95a5b0f1774f90a7bee99beef1930dafe2bbfb1be3a71ce3cf2bb36bf8f3cec8f8f3d26cf16fcb4da417ff3a112c0be3a6ce2c7192cd9eeccc4bf7b526c950c8da9976dbbeddfbe3ce5c21edd3cef625edd3ce48d80439e966d249f7eeb3b2b6dea1bb6b6a460ffed6e481071f4224877dfcf679408093ea8f8c40baff7dbd78c247320255bf262501f724bd1f32543f7f88a6f8e6be8688726700367796380d38897b5c12e124ae7b5cdeef4a15fc177fdd57036ea2cf3d1138422192e4be2bcbcef47befbdd7035dd795e78c7dcd19dcad96a35c67d21dfc3ead7941cb3e696d737f8634e0a693bc251121ad4324a8eb5effdd1e76bad337dfc0dcfb1f2d55e8ee4437513675fa6e9ee08b344827e5f7de3ef73a684a7d4c4bf4bf904d5fc5c8a60ff231d9f4493a7aa52e2f68df4bf055807c9e1ccb53c6fe4c23aa68824244d0d8f671e00e3809d3161e46547fefa3b4f44e4f5953d72db2426efbe407527b87def6fbf214625314912390674d551a12bc01408fbfd2804aea3a9c7a6b6aa2bfceb809e392adffbbf7e5a613e40137f1a0b5634c02f590a788f7f45dc43357489bda27953848bc512dc6a6232133427ad201d20795a32448fa2728648e9c84a540d6544b2d55e85bfaf62d0f20b801829daa2dd48af89ffff445dc5c216d7f277112d6614f2c3ee4ff0ca56889fe0aad434c904929ad316386d5afff9238b4f171b652ce39fa7753f3fcc05b5083c85188e4ef9fa47dfed65a6bad7579e9d31a27543a4a9093b24939e0241a1bfd23d3840bc87befbdf7de16a0608c31c6f7de8b2fc618ffc518334162fc18638c3166e2b65182b0edfb1220dd2f9951abfff6f23bbd5d41766d7122d9d2fd4a532a35a99596ee77fb7ef67d6b43ca22ef538de2a6fb241e74d816bc5eafd7ebf57abd5eafd7ebf57abd5eafd7ebf57abd5eafd7ebf57abdbed1927cfe8ccd2fcbffff91911f8d5e24fa50e843421e04facfe749f2c3f041f0bbeeb5fe7b1fc300291d51d0c7c0da2a45e5563db134d75a159563f5c4c65af51b55d05215d95586feaa29a5b426530dc6506e2d56abd5726ca42a2889c5257142e996326a6068b6be71536adbcf3e680dccccb6af7bb8a96eab71b6b5fb86d747063070816c0112212a40817202a6042200817f008c201cd0801106b80062013f8c7c78a1834501a21e5af0b09280500e111c2a37426cac40c0010c00da2c762800013e0300a9814a2105a082c6c914ea80430e3302208223ca09004c6cb8a1a4f3748924a386185f063070010b0851010a4c40021180c003827040031800c4027ef041078b027ae06125013970a8dcb08180031860ef5000020ca0062a4500344e261d66e4804300504e00605272830d25928c1a6290e49c73ced9f30d210b49ce319ee463909839f72029ebce3d6e9050a3cda68811439673fe9c6d0859b2f9f9cdec72c9ccc08666a60639c798a56f9252fef2734b8b2a042dd6cb08ca3205934aa56048349a0e157a767c58c1370c193434311fcc6e6440181981d5c062c12c312313d382d168d5a2f4fd82a6d56ad1c4d8d9b985e145951a83486423b9b9c149820f9d1c2584423d5694be4560c8c8bc6c208bc1a0080971e5c462b11c53a572412206665502df2c685aad164da9a353bb42ea66cbc2e7438349a552301f8bd9485173707a08c1b78a1730302d26602f571361c8ca89c562392e6eb4879261e5d242797c8f233838b325d86ab42674ddcd2864d11a859b61427b9c9494be6f0c3dd1c0c09f57e6027fde190b78f90e84106ebeff4dd1531015f8f3aa28f0e77d9980fb0e09b8bfcda1a70e44e04fab03813fad8f07f8c87b5d05e12e60f454590ef8d3c61af0a79531c0bdce00e1fe76454f15b6803f2dcc0f7fda181f5cf45e7174780b1b3dd519cb9f7e53c09f36d5837bdde1c17bd053bdadfce93809f8d37372fce9325fe1f8d38f60435356b8e8c9592a7ffaebc69f0eb3e1a0779f4180fb7b0b3d39ec007fba8b01fef4d5f6cfbbe3ecf0674d430f4d01a1d193cf0af067ad11e0cf6a1b8093efbe53c369e8c96fa83fab4dca9fb58700fc2bccaeea89a5e15f67688af8fe95454f9675fab3b64c7f56970e0efe0cb7333ba8fd00fc497b70c8016503146571c6f7e7001134c53bf993d600f027a599bc0e7ab2335bb225fe3928caeed413fba53fa98d0d7fd6b8e14be829d76cc9e2a029df3be94f19a118fed9deea094da1272db3a5dbf3fea1d086d3b0278d01f302a6054c202a2aeb08619ebe63159851603601f30ced1d15956912304fdf1db0a7dcb225fb113021406f0f30571595698258b1ec29a71cc06a008b01ac998aca30409833db3e6d01b01f603ec0702a8aebd18133b3272ec63253c0ac87d9b65f772a8acbe1c13cbddeec896badd45b02ea2d47bdad2a8aa3c1b1da964ba998a7bec1b2c19aa9280e060133307bc2b403c00c00db309c8ac23d3be06cfb3eb3059811603600fbbe535118d770bfd9135e5514c6331585517e4bf19b00fc4663a54fe6a94de6495a1dcc1933db5edaeda927d69e6e6ca7a26e4e3db19f030c075800602838277606003b33b1b3929d6d6feb565197a69ec87a2aeac2d4936ec29fb5feeef58ff7ade7f983d6df7bf7debd77ffd1be165fbff85e2ff8e27f1f7e1fa636f81a08ae8d02deb27ed43e58daedb990d0208961a86b38c95536af36bfd8c1778ca2fbd3a390c5cd1a5a8fe4a8dfc7707c37b593f28bc2154d9a67f7e1874216fde397430e618ed2be3b4ecadfc980f41e7ee3a4ec3d0e7b72982de587829ae4f7d26d404ff2e3d2674a7f7914a5f3a026f9bfd265a8497eb0c4178bb5255cb96655799ec77a51a56cd6e68d3ccfb3366bb3366bf3441eb6efb9549b97f2cfa0acb4adda4a90407a1faa84a63641adc33fe26ef18b18b7f80f433aed67a19b537d29b7bbcf100959dca43576257d0ffee7ced5982de5972971d3c48c66adb5d65a6badb5d6da073f14dab062595bac5955a1797a5f5d622fa4ff50a8bed497faf222bee556842b0e9a67677eff716058e2af25feafbcdf05813c1d47b583f4ca6e2c8f2073684addf9c73f9d0a1b6745c8e2bde3b869f49070c57bff238600f91d75ab78fb9cca66fd21c92efc90d28e0154da30d093fc2acaaa0229abcb683fe6a935699e24d99966e8ef85b5c549f941c215fff113cb8e06a48b9ad8680a68e6b761a02974db1d7bbbabcbfa30783de73f41f7ecb29dfd867e89cc5e6f7124bc85a678dee22ddee22d3b7bef89fad42c4216d004cdd3fb1ae610df1b02fc213eb3bab85955b5a5b618716f8faa72d3ddd9f9f395514d869e24f34cd98703e8d1bada9952d3daa849fe1d1c07102cf3fe4a6bb361b062a8273bb8b4b7fb725797e5a48cc39e6c8fbbecfc2d3bffe7da5afba1a5d566f9f3d3b076dbd73485a690251485ceb03f862c565beef573d5da22eae640f12d386345e44cad0348dd54bda71c0e4a3e4668840ce154b4949f3e77027ab2364ba90e1e8a900cc826763e39252ef56b4b2928cd02f454a9103445bf48f4f99c94b6f35313374f2248b6c81177fb17316e7fef75c822be9b47d4ad5f24bca14d12b481a0cb4279f1712f2eaa9597f2cfd09021c1ecfcf7de7bcf7bf1bdf875bdb70409a4fe1cd90876713b3f96f1dc236443d2ec8c6770f48c7d6217a913c23efcc4ae13f78022f7025f344f0d7a2547c3c1b899927b712fd4247f57722ba026f9c7924ba29eac9cc42a8fd01b34638ec39e38182fe597e91b7246e36a243966e7fc2ec21bbe69684adef9efedf6a02936644f9ceacaea89297e11e3065fff37d6a8f1fd8cb2060cf9fd57c34db69d6fed262423690c25bfdf184968840cd97ede2776fe33dcfe989eee13b494df2f4de158bed01c3ffcf133a993a8ec338ba831f96d76f6b297bdfc5776659dec0b3b77852bdf87e611758f2a7ba257e67d7e4afa096ef7cc13e7213ad35f1f0e225e6666b5a765e33597178ebd5d185dbebb58c0d7e611758b6f863744102cb92d9636fc75c9a93897172fe5ff0f91a4e55e3bffe7ae70a59a2e83fdc5b95093fcb7e45452785f558610ff7bfd72527ed074195dba3c97cc85d9f96bb0e2f3fbcb09c0e2f38fe5656192505231d5cb0d090823bce1e610a0e9394ecabfa36ed1f499e3ecfcbac4194d23aedd99b9c973dc646deeb2a00691a3d0e7b7367b42f1927f8e91b2d0cddb76fe6f0628e20ff1feca1d75af7cc89e389597f26b4d92a1d0e9e5fafea4fc5db8524d6b924ecafef673e66ca3eff0c1835a0e72c0ca01c74d41e3dafe95b6edfb7f44a218906788de7b3be025f0a3dea227b7f98dacff9beeb3fee93618275d6f39a9fb743b206f68e97e67dedc60f30c6d0b635b6eea4ef5664b377b7f2deb7623820827f9ebaf6f4d07fff49bed96a658ec3f7ab0cf61fc9ec3ae608b413a9ce4ef311fad4f6d8eedd9d7ce5e7881f4df51b7b627f2ef3d6f6c637cffb2dc34c4df15cc6ddd27688af8e38be283e5399a57c5a235a8d25f7f07f7fba2cbeb625f4eba4f9676c64baa970e79dad7e7b6959b586ec2a4e936b7b9cd770d55ec2ea2aa5cdca44ded16a446d47d5656f7f48516c8215c4eb2ae7dcf1bb36f490ff2bc31276d4b212220694d13afdd03be09fb5b9815a97d27cc51daf8a91157b4336af2e20be410f677d47bdfcef8cb4d3037d1d014f0ef5b29684af8f771392bc50f4fd13ceb8ed96258d20dde1827ddbf2e27ddbf323a204feb8a99adf6fd1be32691d36d2e3789d46ad29b8cedb929878296eeeb4003812442c8a7d87193932cccbe6e5d7a1cc64dad7abdd2fbd6e5a6136465eee3b2da38e93e58d6586551935b99a0a57f21bab7b42cb739e9fa8e5dbd4b88a4f72d8c93ee973881fc194dd17fdf4681a6747f6d5716316a16ff296858dbffbbd2bf5a2b625fc492b60cd796aaa8f4899b4c832854449200007317000030100e87434994e4381068ba0714000d6d9c4450583e150a44290c871804c2388c01430c0000006000111198a91a01d428215f544fce6a654f5e4b7c68572cb8981da043ef72ea782023e45ba43212f3085180ac2ebc3ac0bbe03e580d8cb9402f510d504fb44fa8cd76fbaf46af3402f911ae4cda03370c1d3a9342036b0bd7039d1ba3cf0660617f436ee2184acbebab48c26f528e1038db94313d149a3831c26848b0cdd7a2c0d270760abeeb0111420a04be5e7460044a0febe064a628af4c697ac747dc7bfe82ec1371f4fcc99162da92fb28ca13f9ba95aa97b0a8932cdde473bd90d762e89c3822c9edec5ee2dd08a729a40234f66ff90f69cab027c06ebc69a754c624eef1a04fe0789c80f90693fba46524488c3e877293f47f803b9c2f02628c5d41a5d0efe82e840fa546562361c2b8ee51e0bd80be0dc128068a35ceba30180cac9386578c3e51003e09d30f508bf27ed4f7a06f7cb40da0143c54b4e4f02e531a2e0c54a7f0a0f92d4c9a51c28d05e1cdf79af445a3e83e8e67fc246e97e6536573f619a5f8766a6d407d26a15b517d7c123e21717dcd0cbc4faaecbec66725ce74dde694d2137cf9d2c46a3f585d31e8002122c111cf72983e04db6d320e64e3541e03aa85a621a4e6b5308a938a18a830ec5f292fd51b22a2c77d40037df7e6c2e24b45df15812bd3b5a5de2521e2cf8f252e33b53537593b4705108f7321d7ed2e0472a5a89f30c62cee2a6b4d3817ef6458894320e231a0f58021a01b60677ec814073ae2421b3f56c2b4b285e1f8c0823c1763ef7903613351d1c225579fac573a334434e738365fb874cbfb2ac284ba328eb4d5adc423819312db040a4f934172e17785d64fda0f39c3319f60b433b58487f635c3888c59d83dafe54ccc402900dc12de33b12136f0df60c8a7ec9162713c8846c128a270a8790c108d69f8436d0ebd0d4d4bae7e2cb95ac921c06f63e052846a0e8a4451a144bc85bf2ff1ad0a894865939b5b9c85acdffc10c4de8076f562620505128719deafe5325c825d1b887202e8341a51e1131588a398caf5737d861d631792f69ca45e8e4777c55eecdb2b83beb7d6c5def92b3afef531b5c54a463ba1de52e70b6d9cb1c81fe2e0530e92adaaa8be99c3e784f5c0ac9a18a076456b4f1c543d48f05b9c3ba583ebb7eacb8ad1174243733ca6c56fa2ac758e7b178523d24cab30f24e69b76dab40bfe56fd3dc117ecb24fe7965a6e8438ea5774b460ee5996f66c7ecae21133ea2f23ad208352f3d76237c13bdf2d1afaa832c735609e78acf59a3e86d05a2dc3027c37ee667048c667220c7fb17e55b4130dea54fa72f9573c943b5041a0d31de68d392b3796342324f1336b335bd1656d23fdb600581ea6a33ad8badd2a695b6136589432e9427d152469ec782aaddd006a6060a8bec4b2c4da354fa5cfab5530529206d5f2570af3147e5bc8e30669a003bd3cd4561d254b8e22c4743a831c87922fe071af22420e453f234c4344f86ca1d1f34206f7e284003096ba6eab6bb342a0f662bdc368dab573ec79e3afe19fd2d9d8e12f98dedef0cea2109c1e4ef41568c5f6a915079032db91ceb3f9beb0e092c81340f432288535bce0d3f33e22fefbdd16949465e991db661eb92722aa8b0c493971a24b7880589aacb4b1b424d1c4751923ef6f25728c97c2db7e6355ecd5c39bfd1a04755b52f4182bcd3c4d2918f212e82bfbce6b5d11108c3d4536fcb6156de8a39aa4183ae667060f67eaa54e111f5855f44ad813ac3bb77a9656e880e568723245f44cf6f70875669b312c58280250830edd172051d44fd940f3d018945471023eb962a07c5e2424303b267b9daa6f6088589a14e6acc0c4377e0a3ff1d98af4be1c07f80b13b88f0c8e5eb8e5374b53126df430eb6fa78ebf51654bc7d5830e1f6020755108d9b695a5f7ac0e59192f6e4283d7612d4c3b75f1f26988e2fa4e538340fbfad481e37b03ab205b9a403ecacafc4a3e9687d4141a697415be0cdf72a3b642f258c84f79d5c42e0340b68c67c7cca9a03b133944ad0b35d7ccef4863b419d2d88c922f5249f5ab7f7e173c1ac67869f6f94823131e9a3708565df748ee274fa8a7d3d5db5875070b0d2c04a8452e7ab46069e43db71ea79d68db729cf2dab544cbc1ae17d28da10a7156e1df398955b71f1ac7f94c76c7cb760b861ca4c8a31e3b5562eb18e302b09833b4419a03db3c6d44127ec2b85957939cdc621ebd577ca7b9546b0b26c3212ae44f3bc952c05cb2ac0365713b838ef3d44ae8ac8c926566e13e12434d0bc382fbc5c3d937d7638058b02f0ff552aa0531a00b747df49d935392760ae306a4913d68e0d709ddd6dab0955b930cdd0a30a0e828f82889bd096c8d6b05438e89c7b706a13e54506ecc5bcfbdba2733cc52026788f3a1c3c79463f58479c282d80c80687e2153cd611644d3e1c916f173502e023d36b7546dcdd0d02b7bedf9162f80018f98031ec40a86974e2334ac51d1ed2c793961a436982b0ff572be10e3dca097e32c488bd6267bc130f470e7618c85c6151f35f0ddf036ce46d763d9950ce5004dcf0585687ca4c5456329c11b93ce3d38f0b9809e5d3e3677a541936b7d6363267588f2e26ff80ea64c49331fc93331142aa9e816c6fdf5a3c1b5078e98426acadc852a5a8b18d0f8ac37c65c2c7aaabf7138ccd14b923640385cce5fcfc471455358f291f1e11c4cce4d0a0a03dac05d9105db302c39b785d87817725bac2cb793701d7334873d3f5c8833e9ff4056d67c257d74b188eff2a694a654327157be4162500f3780a3c075f29cf367d42c9a177fcf8f395f81a83f71f5cd1dc6956e5f2b4dd4b567949768876a6eea3eb6291f803bb3bb8d9c97f8144b4431de296d0f321df5647798e46f550415e7352b1eed42692a8a1ba868f1bde12b18acfd0dbb497120929602f3c3687b9522ef6bc8758c25ef62fab0d5aa290f61437cb94bc6850292456212551433e2f609131ec1c4e2ab94aa5d3a0afba234de934bda4c5b6448990a2a4a6b20112ea9f5bf5a1ac5f6373b68b61461084bc30cca33147a7513a37c2e55002c5ae47b8f7413e2d00b2b409280ed990c2e324810572e854391b5637c07b019a5c2b11ba4a7c1e5e63c752cef642f898642d74d32bd345aaa814dffd426dd735bd49451aef4353460da6d616f0a98d370de76c1e4a34e88ee7c74903d42a14bb43584311f380421ffdefc7b580292817a8d4563f41d2220e0db05901bde27c1304bd3b788e9e16a9976cdb6f2de6529444fe4723f494d8eae4fbc77dfbfeaf06f30d708ce55c8e06f5cdbdb50ef61a36392a584f605283853d8e90f248558c9ec7d598693fc43e1f5aededed02b6bb64d31de143e98565e6a49bce345e5463ef24620e848abce99d922e89b05131d0217f6584f5b034697093d6897bd3893abdcd018eeb0b203043a9995d958a9f640050e63d4819e66275a840038a28b34389cd185db6317419431722a689ffb2b76186d681f2c3ced9055d3d1a76191fa7211168c4fa73b1e75d5d00377004e06709f005c6c78a5a9ea4f916554989612082750bbc3d0d4bb2a29b95c55c9ad002384241b2ed75b37121927d8152de3181686178e1cbb1e88456f285bfd633499585984506acc7e7622353c98d2e692d8d7719b1a514a592300f9fe75334085810636b6e922995ac03091817433958a9892be339c207a8983d6b1e8a4c0212c13954331b7cdcff5a4ea3540aa213c1a75696da65b9c21a0b2fb2e4669dca6a5d2c58e983b6c53f4d1ff65848155706fdff26059f693d25bf1808dbc402b321f188ed905892857971d12da22b761ae0e805d91ed46bbde02429f7bb4f7d05885f3da7b7a4f31fb4fcc0fdbe031822783f0413e05427b012dd6d55f84ae0fc6b11d357c8d9ebbe2e50ae1500f51e8e85bfb3275b07959de8107dff0dc17b509cc9f19b8f918b32446c612be9fd8d190152529a378716c2b6e2cd38ad661a96e443cc00dc10bcd0d86f706da1d9e66e81fa8876b8c6f0725641537d3dc48d58edc770ab188a5fc9119410a57cc436ab830331a5819a924d1492a73fb01f5ccaef1a644412f0203e38485931ade81ea3cc5a8adfa9fc6b686c739e7367666ff6cd157d5779760fc7020eb0e907c46ce688a0b3252f240d8ab22a8c35772a007dbc0a9e7dad0e44c42bb6845611fb26ae68e84618588b33073ee43466a5ddb6e7bd9bdb99b3ad452380264175684a87ab62c0736cbbbf728fb0661d621bd57d5e3d357bc7a8be221cb8cf21756070397de036b7a6fc184d48566aa4b62fc3036126c241712e4ad98e14f2b39e170e238ae209b95c0cd860e93807e4199e01824b54025c071626d7dcf8f969cf0770ac1e696fe69539b6700327c8f06fc8097d90142fff25d51387a1b04ff16d5f406d53580ed62f99717983d9b38b42df068a5f88bd9e439b494566a7ef292bc9b12544edc23d26af037c9ee695e5446dc18ebc83b5b2585f28144c5843e3139aa817d1a3581afec6c1149b4bb3f3c226707fe2195638f558c117b1d0b5afc07aa36726d204b05c1a86291cfe05975938f8b7036d89b5f3bae14b545a437f0b74b5efc2af9d266e5c2f4c13e1fac2bb8807d108f6b417762131522d45abd074259c220cf74c3240e109858be6222612f8599a8eae94c9f1d27228f897995f1fae53b195a31b6ad2938da17055ece156a18121d91c571fd9d7f1c2753dda1936e9d9b7d8ae954d489e562b2ce9cc5d179dc98fadc5b45b38c0a6c7c1f3dc80f021436916a31606c535cdf1199f2b2644a7d71b1470db1a7b0df9c34d153777a99538acf8328b3baa5ea97317f16561d48f437b08b9543a81b5e67bc06ef68cc7ba5f9ad9239eb4c6d052f5d7bf779dbada992b8448094324d881b841794ba84fbcf9764f8a94c3039dcaeedd06398c32ae2d4e002a29b4dd7b739e579f4d1c1c3a1162c8ac4ae688cae66bb8fd254c7833b94e9a471a720e36aa100cf783aac11d872fcbf7ddfe04fea4a080e82f6d08a559704281d0918894b1a0682a00d6f0494c19fa3bc6f04900e0658aea7db51f02984d718cd40803ad1b8d326cc23f0915beaea8b88d7e83a56228c292fa10accfeb40eedb73615a0a1f8ad403d57dd1b3f3b1a3a424fba9d229a53014093f3de26e3886d160242760581202dfec06dfa2be032bdd49572a64046de1fd4bf4a6cca8ae7f4397d03bc63104941d2b0f1a766a543085d668bd38ee794c73e6adafe34fbf88b59da8e5250256aa4b7abf81684b9f5081bc6676da53b03608cd121125d1619e656c785305061b286779b0d1bca0d191c441ec4aed987f927f7a875035cc1081da7c60da5f2cb52f66f5d08be4e96f0ae783dda4ff984004111342fd8dc5a79668ea0d950f15edc95074de1b50b4609e8cc5bf527ac29effeac5a42d5138c20796045f73b9f3315c18c7462ef81093faab3c027ce0e9865152f84af0f2982e39e8c54ee6f845840713b73e1edb74266fbc586175eab81d95e32b034ee3468986f6c7d8e700cf23a0c49cc1d077fa579746a932f10436b956cdf54f5f31e98d22f3ce81d1403bf8c3369dc2604cbb5ae4af93e6c5e8d140d7297a1998173833fee6facbff3ed7a9df8c3bd465c9fadcae10f24156f32ac6782f7e692417a5f24abea46a8cbf254603303338e416843d788b705f76ad659d3b3990ccbd3c55b61823a25a76c01ae6760faaf2a3c1853451c43bf6f370b8abcdeb2e32e825cd578ab02597d3035ac14f7528d79cb7d14b13cdf770b4831857ef35676f7982ccc5fb8c73b7950781622be24c6a79e3ab2015e20bc92f5dde630aaa8cce84c5bd07cc2da87392a1796a4956dd44c3824d99058ffa5d8097e5b2990402dc0723ff0bc844b036312a4fc157bff493bade5c73af3cc7815d93f9b9a9997d41738083d84fab633ba14836cadb42a0f8ed4f81f3fbc740d3a65758f2e44a6ac63381ce1b0dbbadbb75a6541d0f548a2ac86f080921c1ab38329669fc37f92a88f7ea858eafaaf9f07c2c84cadd12169a6b4533e472a56f7e1515067ba9cdfc8192f29fd42efdb3a8fcfe9c4a2f1b05f5125ca72a4bd30bd7f77f074e58ad7f97298ff38e2a66c72498a25341f55c9787085180a503a61152bf1b3c704fb9e041b90c4cdd7705ce49ae54aefe249818a800a9e9dbe1a90176f93cb143bba4a3df219280200366b4f4f76c981dbda80bcff63443c3e10f46c94603378dd4155c3103316d40efeb6c722337c54dd42c7c0a946095dd654f69be4020ac624345679b5cb84a36dc6372a4756aa9c118e3235a5a3851e4114ba8db5002cb0b58df37c3049e278476acae37c139ce4d7e63eef4856c1d972cf70f74356fcbec181f8b9737b3803398b08691098e09f424958f3b029992ea15ac30da17a7fc7711f67af45408489bc95c9eb24c04f9cb4479aa9a35d27d090d702a877dbcc7370a80059d15b2b5a005d19cd88f71643a219ccafde41e0e1fc8357fe49d0e51333395d28b9b7d545ae5f07ce8405b041510111431e19cf7680335edfb6a6e1bb2b8877cbe65aa648f09540d1b9177b63abb8157a931821a294b00b019dbcaaff514594e9a572d82a2abc50294cf85877c6470f85eaf4a90a45b34f98a5be247d0388555a114aed809d221d65671d56649309fb325365a83591ec2b56a21474b957e876f46e8d940ef88b737e81951ef06b723f6d850ef08b71bec1941cf86b747e8d940af0b48af839b117b6ca877849b0df68ea0c7863723f46ca067c4db0d7a8ca877c39b117a37a8572372433371f58a1f1528ccddd746601fa13d59751e538e551487193351b8622c0657166560c05fd6c320ccf8ca581a69930f95750a924432676fecbbe4ff75cb79fb24de8d4bbda13c30905bf12d38ecb3f569c837913535dda2f9cd45bdf0c5632a5bc8be37b36f1e44c159752e41c64bf0d60e5e02b0d45dba9728581cf164f58331aa5ebca089bc4860a98d94404d9604cd6b171df554d29076bb853440a5c03ca4984de0857ba7237a94d1cc8aa5029dbc149ca803667b4da2874e3a8581349e56a4e7aa32c8b12e1655660d13b66111ca2b30cdaf5aa17c2010fca89f3b37615efab8a7f782f2e6de2623c481fb281f95fc665609e6d7522b29284dc3949d84ab400a381351fe12ee0fa7f22924bf2eead596406a6b61b2884842365936772e2655a9b65484c882ae2202bb1a0f4ce0e270982af6239e70fbe10e59eac8e5d0910a48b98bd6c6ff046681ef0eb84fe24ab96e3c1bda45fdd0071cf65c0db9b2cd1030ed58f537b417f1471770d86b39726d3343d0d061ddd3f026e2134df800afe5c4d56d864053af7562f90b63c1573e418a856829c83023ef91bf0264e012189b546dec20cb2c7d30534ee4771e4dc63dfff26b1e9f3aacbbae01b8c1ad619c755b73a506708983a671d6a5e6550de0222e0dc75387fa6b3488cb42d1749cee6b9ac6ec6a1a765fd1e498ce2b1a19a81ac6775fa7e1b8eefe8197a7fc376232a640a7dc40d107e4411c2dfec30a39ab5e70df227f260753160f48d30d7cb69589c956a0ec88a9318c71a489e0827a825e2fe2b2fa85fd32cd3551eada7fc84cc0355c0cc89fdb023e8b365260dbea6ff208269b70a3a7c65072f025357af896188592b6bc8213b9fe68618579e0a88f49f72b7d055cf91128ac04df08874d607d4eba5ffd5170899790622df8a41e6e953c05562af90d7e41c826dc6cd9d0d172410177155a3d1e2bb402c207ac4c93685767155c9bd8ecf15fa18b08391781fe9c70bfe823e0543f02c552f0913e5c0d29d0fb53b28a04249f707f7f4c923acdb88b58577056ea8fb22212717e0af4aef28e479064136e746efc468ba0803b0bad0eaf155201c13853207d28ca2810446ec2fdfe9e256ace8d0212ba822ba6fef887b28e8c69ee89923b3802aeb71d8e206fa8f58ed52305aa7b788b4f50f209373a37869203256eaf84b27d0cd42d4d0459c189a53f9a8989ba08fa73c2ed0e3f01473e24148b826fc265135b770f6fd428e253c22bb802316ccb590a34ae107a3e08344448ca30a8cf774bd8f9fa3dd56fe191c09986709cc0caaf71819cc3d982058069d3f642c2a7ad6014eca0840a045f143d35582135707de954158c7a519a3d64052f9fd6f211da83882c60c4885bf92f53e543a8e0c6f32402c314e482248f6ab7bc2e982016718f03a43280c1288eb28906b390600e006cec9e246198c63148d1506e1919e844db5323ba11586e312a634eee843330c8e88f630e89c5e32da98e6ad0d1a1d909b735a0cbb232c6be565a2746cfce55e5af95ec186f5e49c641d78fbfd6e4409b6bb5e6fca855d518236b09420fea20fd057c1f37e6e536e2a99d8fe2318c96bc9df8980e8a86c7ba5d20b1864b387bc008a00ff8c0d8732e916584380de7f920031d0bc8b151b731d007f5487325762735280e108c68ec8fdabce092a940a1abbaefb9c50f3e496e84b0b64d028a0b4d9d944417941882d0051e47939cc3bd6819eb2d884764573bda45071a71c1768a14c6557f1c508342cb18f03c3be4a91a2152517ebcfa742aa987d453fd4a9bb7ba0c38a4e81b90cf0060ca0b1994c84664a23c20b57c36e47e01fc1d185e930b41bfa04a8d46c4c29bfa552d28c77dafe2d50de25ac87a83edabec58f8aeee4ad02e0dd1ee8f6b4b2f38f13e97384532db81f333c08a3a996f265e7e2115f2716a67606651776752702ef8e36945da88b720700ea2067910c49d7c0f9010887e201561c0d35b38b59b514342b325d0439f12b78dddaddeb1ae43190f10e638cd6026b281f83a7225299c7edb917876d3a4048e09563853924ba9782a7eaa35fcc4eaa8b6e5a050cbffe9d57fab244c9bcd3e7592b469fe0d4ede2b9bf66e2d290356a73e7cb3de0197c18298c2d143617593940776090c9610eefa7b54646b1b06b3ddfcbd31798740a96d9d68ca5e3726027a8c818087f98c5a64df7f172333fc396ba56bcc65e959963b73cb29d7e78ada1fb9060cf8a945a1e24d4d494ebad46db82e527bfa40a0259b2fda2d2a4a01065e46bd1e800a335d760eafc0d362fd6adedcae685eb1faa538550fd752b1683598af5d15649e6d2e8bf2390cc8b131fc793a8448201e7dc096da47de11d8fa32975e9566cc8ac8202384c2deeccb3e1d5956eba427c6b12186b77b4dad9061a21ff51a70f5ed6312a1c9315f26709758ac9cff85aa017136dc7b86908222c8e62521945199850268ee2cb684e9e1bea8da1617337fb44d9bd8b9afcdbd838f43fabaacf199289f0ac4082cb59ede069f8802b5cff6b024244ff75c45a6bc4b3df3790334dd1671d7de5a80684b75920038a02371987711d3cbd43947101cc8084d72793f6784e89595da83dbcbb4976931bd74471531e9a1ec4fb1d94bfa606bec66e5e2500c40970c7df3cd4f420790328a0820f8d95ccae9a17bae9c257f447fbadd269127a1b545f07eaecbca8d17b725757157c8794af624a0880eacd1065c5fe6fdac15f2cb1dae96adc7a5cec8bc6b38bd698453d4914878d51e7b00a826c9678983802cc1e92b34a7e4060c1cc7da2dc2dd6dba8f1729bfdce90a182598c4cd5b1c73ffe05d2fc193afb1872d078fc016df27c7b90e378bf8a6807230f9d3437a989c567670773693d9a7bd5995e2837baa0a5b3ea5ae811b4dd207b9667f460e16f5e7bac287ca553e89d59edef2124cb033a92ae507775c197b6a44c85a9731f1e7c67e8b801583d9aaf36b95b7873a001d0c743338847a2d6254f0cc5b497c4753568140146636ab427cbbe3aa63524c85dd041863774a6e8d0a5b77705bb2c8e978b702158f266a472095cd23d9e500981b1532a263bc4154b8fe449617441020cb691f6f627abbd3446dd104e67559131f2d404a523f673705001192a6db6c38ffad78aa440829067b12144205adf108ee0d1123d92ff742863215094a5e7dc12737091555cc209d47d8eb5121bb06d506a9e06acb6bd5fbbd650964e0508f1a40c5a48a3007d9835a0800d25b82610710598b09a4b819598be1ad3baa9c490f657f0ad9260152af6bdd90ed5754d895c4dabbf299be18d90ffdf9aafb4c380a486b40362260c7af3497041028c82812487067b22a890ff754d76e1fc03cc1c4763aed55fc127b84f99b66b86fa6bda6181811ada0872bdeddc0ccdce401ad371c82ab308e2e115102549accd94586bde771476661c1343743d242787547531121a6ade980d7b6a57518a2e55bc8cb5623f4896063f0c145b11fb36865450a519ab9cbecece0f581105f1f288522ee7b803bfadc50077bd38d4ae082a4a59af289e912c9ed1062f7e98dde0d714d0bd34e6f6a1cd5517a6f08f7282dc47b6e3cebf2ce2f52a0ad24fc872da5802d9a143631f166ec18efe394250589fb4b3d0c52e0fd802b89c9d6490090a50ad56eae834b1d8e126f1ed60fa51ca9a721da038d755a981f54a34c69e21877a24fe2612bb8db5112a2ca4639ce9630a24587f010ddc2e004e7bad6d06df6069547f2155c201a071639fb3096ea6b44e4a0e4210b674e90149a33e8d28c0a0b475528c7c8c27d071d4f493c4a5a59b1fa4da9d764a387c0ad0316518294ad48281858184472236dc139e41343283e6b49e86c208280b2b3cc49d0a597dc125a880755378387ce5844f593ecb0a606a41adf2066f56843c3371085f9f97190f80df4d73aecb37cd7249608717eb4c34b059dbda8cb624a685a7859932f92841f093054de4e24e28c6fe7d159dd944d5385340215845711a86899683fccffd3a2d75d4f94f5e3c4b56199c36e21632853521b9cf5d4cb340c5ed73af7809e32019a39328ce17ccbca7b31202e8b3644d953349c9f01ab6f66fbf3f8cc45673254c0ad2212a255bfb4ab8209d1021e23f583084f7d3924c89a4a68f488189d3b221d2a45250f38d0b75792a6b1d2de745601f5c1304ecacbd65f08a33711d5c9bfcbeb68607ad17e3601617e1b3aa9bebe71c7e3a57c1c083efd056e7cd277a3d7c4902e02ad103d02bd007d245a017a247a219a08f489e811c4721ccb51ec91623bceba02b448b4423411e805d122d00bd144a015a045a24da047188be3d88862a5193b815b0a722f52acfe06b9fca6a88587ad0b2c253c88c9f4710dd32de23e72323347449f246b2123b0941177c8f379c72bfd6138e60427f003d025adfe29148676eee277abc4cafd0b30f407cb2d116e20841d81a90196acf11ba4d1b974dec66a905414420daa0b27cfd9cf1d0307cae50854e2735b49ffb1b0655c6529caeb6bb96f3a9f18bd27e8cd0f0a6ce487de22d0cf9188b144b2b781c6179ca505f5218ce086ae2c5a32eb2944393887b953102006229209540e69e53f916b9e06f67fac5a20901e70c0046609f323d90aacf210793b74153c5ecd1bc48591abbd67069b29f69fb811161a6ad932660bdd76785e365e02bb2e5dc00da57552424fe73e512bd65c84b2f50de89f7abf30060aab78fdcb8811ade6625060490efb5a0108b1780cfe7c5d15ddd072d3caf2c2da56542a8d2f5ce6ddaf02d64a1b1c5ade0d6bcad86c21961d2513c542d0be5630c9520fc622ce712f9afd291f61ec8bfca653e068c5e65b48b42ef3b5687944b93fd2209b6ce9f43087db269a35bd39ba807fe4563cc15787707ca482914452380ea1cea9d6d6c20a5ae08072762cd097e861b6116bb263510b011d449ce1beae10c7369278da2397760d3f429605f6b030310ddfffa647f8c63c426c1c252b4bd4b59ad70ed4a333e5ac0ba7add7d04007fe9be6fd318c7fbd04b01ccfe762d1445ec9afa9fcaa93fe0aad71b40d6d0d6ea94a76e9401a58d2f55cbabb048b1ecdaed8f185a9d971ac10f78a7da5d2a011f0c64883d60e3a5b3cd9bdf61cd41f56bb5ef5e2b21556175785f8f6763c77a00b762fb9b91510d7fcffe20d20795c82c14a14d0eb0cc2c216ef918243140a9ca35272189582c36842615075163a0d28d1290a0e5128758c4ec9c928149da210cabc9cf007c12ee0221b9e837befc529e0ffb157625063c898be840c52ece0d24199f9c31a05f129b4cc4f9ed3eceb64b33eaa96851459f67850ad62f349cf7d585c7132c8f0ac6c282bb1db52f6834d894896ef392a93dbd7f5f2fb5718694c74da17fa11f870b64472e905d9141589924932aef4ae15516a42cae40c2e93431fc9a9e652da449fa59a29fc117f481b665e754214e97e178f27546b4e36e2f95381e8f9fe7c0a5ea9d5da31d5be7244d28c23be70e7f972868a62df141cc75b44d0b51f3b9882a53f78f1df0fa4bfa4aa0da688c69f28a803533ef0338be31ff5f8dba8edc0d41cf8db5da19ccd6b05068ee2099e1318feec7aecc1140cfe01a022304518fe521f3fb2f6ff28aa0a53decf87eae61034923035f7ff5c45bf6391ff624d4598f2cd1f4d6c0fa6e6e06f2af797adc37f6ba907533ef8190a8b246647140d48a539bccc75225cf48b075330fc87c00ac11461f86b7d7fd4dafdc380c4f34f7783a88f2a989a933faaf59fb4d27f49551b4c79fc87995b0953f3fed7f5fd316bf70f292a8629ef377bacd6c0d4fcf6608299201afc947129b4ebc48653018c8c0d5f5d03a396e84f8f38d91247b8228368c4692312a6da549b8464bbfd32dbe3014c2978c0960a4c4d97052e1c39982270b87c80a9e39edc81318c49c0ec09370dc3d4017ffd1aa6e023713cdf244c7773cce0355023078a2394970d5387a9ef1197ce83458f4c28e5be929dd0c5b8ae6bb094ca8bc053533395e6e1f0f9a6e25f3531bcd7696c703a91f0c608162a86ca800856a2ce0b4f64998e0708464ddfaa212475c080267d9477ba114b8cb9b92a7bbeecf97ab3644d88cac83f7d393bdfdb08a9186c6f1f0a0c510a62808529bedbed2d63aec7c93b640c535335f60ded78ff6aded9ea31bcc1eef92426ba1f47a58066480324afe6cd86d56a077e9ab126c07596160f493f6f52836a2db2d83d3555683fcf83c1c15816c52fac86f9cb83025d199aec1bb0d2729247761ae442c4c3bc9f02de57bdd0e2663323fe047eba3a565b0624594e6979d5b5704b28be906e9455649c9ef54c814fea80da0a0cb61e847ff72b74a8b747c710e145959540ef1997c18b92a912eceaf0e844728694140e202550ad12a58f6200ef097f03057a380886810a598c64b27e95743c288d4221b85a185370b7603713b8952600f057afe4399cf3d2f94820b968ddb4da7be707360e484c9dfdfcfb86d9402a9e689a645a30c92702c6ad560025f7309fe4ad787a7ef93103af34c3a1b72f2c43d06d34cf91f60781a9137e5f3306c8eea980f561a1e20f415ddeae15ffe47d6016de3ec0f1c1ef14834471c6bfe0dd9952af4b655051d7605ed97437951b11bb2a3e0246850b48d3d2371863a6fd0f0e0befcef2c2e5496da146d5da87d1a2ee9da867efab76076922125bd11e909cd03fad1bc67b8c78bce4981e05f39e40c2c26ce35784f16c840ab63f4545b3cd1ead13b7b61d06fa677380ab53188f9e88d47619ff2c8d5f959d78fae27a9d94e8a256b906740220bc1defcf4ffffe4d5dacdb9464df6acb687101d864affa1a498249fed0d5cbbeb435d3003ec6f05dda58b35191d5f8fd069ee71c79bb34643aec67c940f4856250c2343e2aecb1084030e7a270cffb023325aa81b10d0945fb701113d90d9c5ef1ce52ea9dcb48c615c9f4d3162e5d641e7b80d2b2f10fb379c4465b209c55b934c9ac13cad111c4459a9ae63cbdfdb8c30969063b02a6a78dd7ab37ae211ac4b4e48822ec22a634d1d7bb60c3e510ef78404a768a11c70ce96fac36885e1db7693922c1b36726a6659f9a7b2d25c1e44dc49c207a7557ec7689daf032b7e78308da21666c6c0956ec29ec885f414c8510f54148f47c0dbc016eca4d0de39db43a4e9971f1e7d9003d7e10f6777cafd0501331b2dff809975b9466a613aefe350b601fef6d4c9d69da17c6ae9baa62fa6c8d6bf801e126958019008b0823a98d4cd1cd9a6e7ef00601476a33cfcf4a830112a856ca6c9af129fff804d4621932f4bc5b21c2108ff15acbe2345f45df92313ddb00d64389cc934a270cd8a5326dc9f40d31576b0ac0b74c1f852fe63438a584106b3f46fef6510ed3e84519fecd703a17e2e336a036518682537590e157724a379f7124e0ebddcb6a8743498f3d8db0d2c38898c40da3f62679c005f5245e9913fd8aad93cda5b96a6421bbeef169871d0241fb43e0e8a65802ea61e739072b35bede450816d926ad375af6d5570b44506258e9be1693ea72608c1b6bc59a8906e22a66c84a9f319762b4a71253447ff1ced064d131733e2d108e5316643f89281240933e1cd28dbc1110fe078044a00872260548c022f04ad772a0f680d20828c80ddedfd9ef716793e3850940f31360d6b4700d3c08284e8c9bb3200ec5e490fc88d088a8bc757d3ec662884518c2ac31f83ba61b4d606fb5636207413af4c9c141e958a585b02b366bb3e88fa1ae724c8e0d65b0ca4e5f078ad867e85df32c7d82ce0340c5aedabcba0918f7e584c1ad53c08743ebe6ded685955a79e9f111f8581e55182fbaccefc3c8a365f7d0e91067e367c4cadacf1327ac4409b4b05817108af6620f4e4ffc058a42ac0888b39fc349ed1d284d05f07a73705935041ea428a0bbfa1f831202c6276d89955809f8595ea0147121c915b161ce8608f280d69282fa89a2a4bb5a219c7b32975a21322b9c8808f5dd201078ee168b5f9316eaa71cc1a37ca514c45514d0e6e1fa7df8eb3d8f74b8930a4f5fe705880098dc9f31107a4549c745c2ad1b2ca68e5f4f97f57a832172ebb5eb6f6a55c89ed3921883f209d33509627f474c2184d1b519f096596c4681a2bf1e4b80fc7a39b3afc43db8d8431758c2804b55e4d78730891cff673fa9239c123598f3e93249ca60bd3a856d37a9b4c69705e3ae8e31922726838d5ac58e8b4b1dac2058540808ec93bb855f699cd20537fd3c215d13ef9d0e849e1242de7482b6f2185b10e6c8525d1af0202e3914bc19a44fb467677ac0170c034859130a11718ac7746b0cffbbe52fa0850081cdb4710b1e038933144371c106a7e35f99e9c25a28d2244c687052f6205284776374d56c53440b12e6c95003c020314f39f83179290704a82b36eae034fd7a4284e0a70125e29c90324810a9ffd962d2409afbe9b8f63e7a9ccb7677e0182f30b93c93990adb705a40e130eb8358160a07aeacc2010136972d9c4fbcac0cf0aa6dc77f57bcccd87cc258ab3015500e965a1bb12f13855f10188f7345f0080753add60dd7ea5ef3eb6c8f489c5bcd244c211edfcd1cce33a60aba883f16fed16b016ba4ba2d53ead1a404404c9d291494917a25879cec2916c411999afbf4d0e38175e620910b20aea68ab19aca60d57a405026300aabfd325d4df5d8f30d0eebf3b25d271926811162940a03a54cc5a1732a074c62485f8db66aaa54879453a9fc691f1b4c9f2b250f1b2a110f3b1083debba77a560364f5fbcb9ec069817a44668dd2981d65dce3d09ac5aa3561a91803ec6b909184f8ea4dba8fde4955601e558c51df817a6862ff51d2a073233d32647f570a558b213e610d24e5beec73a17dbcc656354686a03987689422ba6640c59477d05394c1e884009def8892141aaf57020dbec891c3afa40c9b0a999ec23274d5d6ed0636ff943e31399d4c3446e2fe132ff1b8262043bd1b92f9b97cdfdae15994836dc04669bdc4aa631a6b5f888af8864424ed18408da3f1d780276f0fe3f7713a72304d18001e54480f693e675966800a4041809e2804a8ecf34049c65123e4e4d1b35e5645e134d170ce8868fa5a703ff540f7b12e857900155f3addd4f7218f6ff454991f5a7dc79d11998d207648f77fb4802cd7c41b182714c4761d243678881ad74126e5128dfb625fa430d28b9390ad77f7d04b85c8382e7161245cd60ca536fdcaf7c3a817dd9bdcd780b04458a8e8b4ab1d143a3f29c1ada33ceba03655e6d44294f65d8e6f87e58e38137c8730294825dcfa17f1b8c33f7fd04fa1a868709022f3e440aebc7e9a186995c1f20d7efe5a903ebcd498805cd3cae584f2807208df5ab5330b785d0b69f484f1f213b5bfe468d10fd00e50c5125901c7b0bc108ec1f97f0c1252f74b4cd5e939c0f3c54adc9adff28454de8f5ed98a14546476b9e4c924cb5abdfd8132951ed07d49b24e3ae16128c1177b043e7e3fb0341a481ff618283e8efff040e3c43a9442bb69c0b5f0bf83a50181d55f43e86382c136f0a050a1cc1e02e1e3f0db01154a25f8ba4f60fab84ff8af0e90f258f1202d0f9b8ad89ba89e1a46e831bdff0a85e819573156a914beec1b7eef03f02bdfdaa41b4b4115c6b9d23315543b560b9a8ab2a0a9d34c81260e0f7309eda8801f76d1750d238796352ef1470756a1487c41565e18d81b97d8b571cb1e235ec46fea41a427ee1836a2f45ad1e30127765ff7479b298c58292dfd512b13b5d59b2d23b4a5545a37624fe71a58b17a8c2128bebe2a034bced23aa1c8ca22013b12c10c1d5d806c479d55748111c296e0eecd909ac922a7eb23c3d2351233fa006c25d05c300b73d649dd3f45a341482e0647bda163d00460e0667e9e013384c4a7ac7cae796963a13be57c39e34d2fc8cc4749a901211fb2b17363a3672121c3ed9f0d9d747d4840a7fcdbc7c8121bb410991885f7a1953293d500f4ea6d47c1a6af0025f22d9d8e0b9f2a683566310da58f46dd0489ad05791aa41d100605b08d22541e68cbbf6d5f29eff7043c058adad76f82b88dfe7303b8faa7736f4e62b8ca8b4b4438e2501fecd79a123c73a20ba92b784cbb0ce28d31693f4e7981c3dcd80ca4de024f6f75bae8a5955e017ec8262fc9662e44f0397ba058ff47327b295c8d9828fc87513b7527f1f6433a524c4e6bb6aba7d2fed8892904b0b22442df0d6e61a23251cd5c30945d04118de9711629889abf945aeee5adc4c3cc46a065c7988b0a52c24d261295d4415f37871f1dccd0f5439fcd944307ef7404919aced526dce213f1384c1407228770d4596420a1b81607d90fcaf6057c04603fcfa009c00699c3f52b6856064fc80470272ba4b98c8c83eb43383f95ce7a1dd89adc5859d76eca2cf841f8afd2afebf4b735d18f842a4fb962b853632e370ba19ed7bb55f801ad1e1546d6c06461622ac3bb4b6b8f6550e9b8924a6a3c3eacf764a5bd408b5785988b9d2427a25103f833575fd6e205b96dac473b59d98aaac365a4d734e1147a5eef765324f3cd2a0f8fedba80dbc566e90b7ce2fc83403dd4e069c5ca64b5cc1a0f8f6dba800701bc655cb00883d07322818ca4667cfcd4bcf4343cb635eb755b55eab80e1afc41f832b01b25fc5022473cad4381152e7023ef555329c220842f31bc57c33a67050986901ac3edf09b287ec718b70ab4403b4b87517997726bf2cf5c055f00f5776e2288280c745f2016df2ce8fe8f525a2484c967ebb7cb9016ad346241dfe803c977309f980765709313020c34020ad7295c5d50d415271d9906f457e5b85bfcfbdfc20e81960c76a0dfad259738acd7ba609f47c9f4a7f5c618def3fe911de2f892beb4460199431b5dcb029cb21cd03dcf64ab3f081b846f5f66d758c922ea4d61d61ba2a6d6089146f6267b6fb9657a05af05ca05373708842d3804e6f8c417f8013ec163358eb895cf47e37eed7321df00731081fb24f64fde881deb60ce85ad0b9f89346e977a8e537c61adb5d6baa3ca2a444cc20cb12d26d61af9a033c88718990977c78d51b8f00a176ae0c27f2508f0099e76da6c38b1cb8be570447b1a5c310aa25c18e315ee0719158ff9e0033d767acf078b437bfc951e703b601de5866817530ff5ce1b41af12f17ef0ce05b40b11f00ab721c6d29ef62fb23213e82bd0411dfcd1de0d3805731073341b8405a2bd8f557d035b564338053aacb0c20a2b844b62ad1cd737500557b0055ebbb9b0c8c51ec2b06e024bdcb0f59683dcec05b64f60891b36b8f2c1c50e7f70b167ddd71764b1ed7ce3b61db3b4db30bafd6ef5760eaec63332119fa9b5f7042758f259f76c6d8b81ddf1578445a04f779225b25638c32a68016ee114bc00a364bdb183322ee0be1d42b46cd9b50f6764daa62b8501f7ed903cd2dabb2cc029861b600949b00492ab328232f12451c0737b0822da9350a6729d10a4f6bc6d767c8d4aedcd23da836f992c9e786207308b97167af650062f2d3e9165199665598665a12c14ca324c84fd0b1dc3b28744190804caae2bab308397169fc8b05008cbb00ccb2eed117626ade3e1c12bab500381401928d338cba02a8bf1dbb1eccab02c9b8730c330d161e8b15e57c4322dc3f8c62cc66b11136171c32e2c8a7ec563554229d2ae9841100894c5d0b57ac58884e8c6879e695ba665da7665da755dbbb25028140a8542a15028140a8542a16fa18865996813d9192d5fd251360dc3b0d109270a91504e4618270a6998866dcf32a8ca5a5996655d11dba5c1ac66982ac3b20ccb5a5916ed752ff804966558062f2d3e11ca421886611816faf61086854498080b894458b7e9901d7bd64d784dd8ca8e6558ca8bd3875ea4645876cd1b0129326681250823c378d3151cd7cb2720bed40eceecfc639d8f5b1fccb35a411c8775b29b2135e1e6bd7959592bc75dd91732aa7b42966cc913638cab18638c31c618638c31c61863045d33561a86e81708e4d253b872530c959760fcc5534e3acac94787dca14be8f038b4cb76781eda0574781f8008a25de44b777821da458b5b0cec68e061c6657c4687c395d1f1d01ebc0fedf590f108717068706862946fe8018ebe42c892c6358b5dda199f207b7ddb2eb221ee2727275994a758d25fd894c3b02f5eb230ae624bcf64908057b8b572a5154be326bbf218d674151be39985b7b3332f98f10cfc86ee314c5770f0304953ec2dc3fdd0ffeb185c5aa44ff435da7ab9bb48c6dd4532ef66ddd733d9bf2e62bbcfbb323215248ec81e5f371edaa38a2683866d9e1e23336cbcc119824f9c924a68d32614890c5b314d46bd2b26db3d2ab67ddaa32fd946623b896d25edd1a73493f6faa79bd8281367daa3893ee2eac76523909af66c3a1b6ffa44afd91864872e023a9226d2ad76c14edf3a392ea55688f66416f783b7a59472eb22eded40c17d104911251f54c245029340255dd748298da626659131cb77c1f44b299ee86ba430dc5e0e127d3d06822ad199557d163d24daa4bcae6e66d22efd2a7f6ae8550b55985028f41aaae7d6a955a7d61a696a1fa97da4f691da47ea27bff4113ed1d7efa8a12d46140a61171d0b75a150c822012ff6da48bc5b699c695269a5cffe899e71cd13c2bab8c5f49c532e913bedd1f3d0f0864235c3b89e2075d3a1ef90b88a43624b8b4a42d448e4b9a27fb1c8a567fab8aaa7f7fe1a5735aeeaaabbbbbbbbbbbbbb5b47d465dd3b501702653ced850e3add7a68ad5e8f375da2cf6a654dfc61129784def4a2b956d707ee1633dfcd29e6b14925e0ad166341e3f066e533dbb7ad9c8253ac6467428102229785cb50a000c8cd46a39a90e59b912213524d7b546aafda6b49a3980eb86b277651ea300fadabd72e9ab8242eb96838955d1bb87c5cab2bc8c50ad6ae308afef68ca2a7615918452fc37a8ca25fb13918456fb23a1845af6277c0d0c028fa136b03a3e847160746d17396071f80088251f4209b8005308afec420215263efb662251d2898f8b92d97a16062e6669796e590144a26bcdb92ca88c2f94b487b534626783cba34eaf0a90a7e692af069be460d930905e57e5127fb321dbd73b162911ef2127219b9f339b8e0bea8e3f251d6e594269bb40b67a44f505e6272271025dd7d75e6e4548ecbb1695def321436402e94a16f899913298d47d139b29ce30d2fc63f1cdf49dbacb9f39b27b8f372497c89de94a9f10fa615674e47affb2a8eeeab37ba8fe358baaf54a39b395d9d395ec4892f9d537576eefc3b9c99f69a155fe0157c9aa7d13887c1218594ee2b75415947a01146cd6733e7c727c86f4a355c4ecf30518543a1a404ce08777e9e610fd6034e3ed3b1a18182892497e532144c10b952ca2a7450735397abc881cfcd58023d3a286092bdd0606c3dc49ba1709717eb122277bae762d12aafe82cf805e63416ec9241551db213853b9b0947e81e4dcacb1fb2cb18a58c9b493e9ae4a9097bbda4918959f9277d98648dca2783c8f897f2faaca6986a3da9debbd8532a26a3ae74a64ea52345ac62a70f6d3ca494a7b49a7878973bf751ed13fd7c1d02553087ce4b87dc6db4edc05df77abe8361d8471749b3a20b351bd2eca6594db39966419ac5345b354b357b69766a566a365e23786878bb1c9ae57b32b2462e04c2333b838145c1310d309cbaeebc10d0c70c376126138be2d24f58c39dcf68f719c152e3cb56b5da53bd4bafcfa76c3bc48b311425a8b9f3d0c87639e5b28ccb386efde4a79434fad183905cd97d2cd708964b2f2bbab08651a08bee65433fa17bd98d67bb97d558dabd6c167d64f7b2a024a07b598c08762f5bdba6decbd22657cf752f3b85cc7b590957978dd70846816e43f3105918053ab57daf225b0fa72b67bcf644322c77dae3696ff6b04a7779f109e3f3f008a7429f9736983360970caa6213d8323f593f90523c115977d2675fd97864a7993c959252694397ac491e747918f68535c94c5a93bce8724606a169ef9333172b9ea6bcd1e40faea765da63c5f95ab9ad93dd5792dde7c9ef68481c71b1d1f683bcc66d3dc86b9d699a6417757a66e63349eca22d07ac33c9aea191f62aec69cf0812b80ff65c39d32f07f8849f0c62807ff2a600ff640d1031172bbe1ca0933bd100dd0b70f2af0444c7f18472b1623a8e27d2c5baf39c4af9a75dee481e2b709fdc712286bb3cdfbb3db42371440f19d35552f7558e2b9d745fa9e33a290f3aecc13e7a908557643f794336097935863dd684fdf34cd8bdbb5ddbba96b9338c9aaf1609b8e46231720c819be72b77248fec69990ca3079db4c5a04024e0c5948012e8e9a1be9e6e3fd4d36bda7bc858440978a3ce68cb815eb3df129776261e1e936b65169bcc9215ee7cd489b3eab44a31c99d3b3a570750a78351b32b6c530f975eb535808620d082064720810c48400251dfb407bb48cfe9462bfaa7026f14d91a70f5f45f64b11874eebe5249762f9185d5ae8d74cdd31e2bbe5c1814e9135f18f0b4c71708c622123943830b4efe653bbc34d22e3cb5429f5b046509e1148853d7b35fd9d5c9558c94175dc96cb3332fa8a9b191008edce9913b501ab9d8a304227fb4073f572b39d31e04551a59cac8c8c8c8dc20848baced3674e4a9f165eb582c965cfd68172981d0c3c7230c3a8d975446dd0a93dd8b4822fafcc09a9abe913b7247ee0c0155233c45880831d25eadb6872c027b12f0d2e629424a239c2a02a7f8d05e67fb5ddd07654d0c7da48fb766e341312c08ab5de0fda24f8d48e44d7b36bfd1f6e8fb459f239cd202bec89d78823d4870028c53884718b5135f640bf8041f839d1b5ce873e50e64920b0fda240ea3e0311370f17c3f59738373e1276b2ebce4e9913f30fa300abea65d4c31b2ba1c792367da0574977ad85bf0093e09f5091c154af102f0514843ecd1082b168970c86d9e76e9815b0e31c20e31b8b4a3ef88138479504a3b9a0981a8745fa7bfae4bae56bad403297620c50e44a552c392c62c5f6ddd7e0655c07d7209b9c3a82939d5c33ddc32cfc2add0aaa3a7057f645e2e5653be275bf444f9654e1d260d6015d5026ab1c5a5178201aca25c707127fd023855e3f40a6015eda20b2c2e7d0238053a3d029808973e084e61a72f0007e1d203c1a9ebf43ff00f2ebd0f9cd24edf033d0f9ce24e9f034b71e971e0d4e8f497de064e9d9cbe86005c7a1a38453afd0caa4b0fc3a994d3cbf072e977704ae5f42fc470e97570caf4a3e5d2a358557f0069e1d29f585581d4d0db6055ada1b7acaa363938b5727a8f53324ecfc2291aa73fa77e43e3d2cb6055bda1576155c5a14f61550d423f625565ad70cace383d8953314ecf710a4588e8d26facaa42e83156d51cfac9aa3a845be669bc34875be676faca294e75b7f1de62a8a45152d8532bc7954af4923ef4e2c59961c038330b2c9c99061ace5c430d67060000ce1c80009cd9061bce7cef996fb8e1cc0210c09971c0e1cc39e4a0c39975d8e1cc3bf070661ecedc430f03e0e1c30fa57f7d0970e6019c99c7997d38f30fa513e0270bb2358e59d0afeb9cd548f644c5a6dc6455be624d9761574ec3caf82d8d5bfbcfb0d686ed4e00fbc19c2139425841706e6c6a80fc58f9a099a9324d7e982c51d205175a94e290f64e178b82833d970c6c72670922c16a0e2eb899d3de3469ef218768d726129dcae2360dbbae7a5d2c6ed3b0ebaad7755d33099d4966929933b3a833874f73e2805f2e1f6f8b3b2716a52070555c1f1ec01e183873e69076315dd7f50beb74ba9e0cf6c0985f3771e7e14ff7aa81dcd936740595cc432c38356910d8d2c3a9d3e769f7465b9b392c8cbe78e9a5afe24bffc420503585c0168eaeee1442835c3e17abfb5e2a711cad35cba64cd408607fb03e581e7600b607cb83fdeacd9ddfc1ea6073b0385801d81becb536d8005800d81a2c0d96050bc37e54c947bbf82817548b3bdf25db03b6603f29843b9fc37ef28a3b8fb29f2cc29d77c17ef2c89d6fb19f34c29dd7613fd9c59d7fc17e5209771e06fbc926dcf918ec27a170e777d84f4ae1cecb603f59853bef62bf69813bff62bf89813b0f63bfb9813b3f83fd6607ee7cca7ef303775e65bf29823befd96f92e0cee3b037ec3753f0cd26bed9823b5f7027cbe565e92e618c366cbd5308545d2c21777ebe80555489121804e154d60256d1254b5c70678dcfcf269cb8e1142805aca23ff46705369cc24ec02adaa40913777ed65419191300e194260256d5999911fce014f70156551a9a10ac3835ea00abaa0f1f1ef0c1a9930db0aaae561ca0e1140903acaa3f7e68e0cecf194ea57c7e5a805515086c999f17b8f35386532a556055ad9102abaa0d1458556f9ac0aa8a035b66134e997e38b5c284534b3845e33557b0a1c2bd8902ce13eebc5402ab6a10d832bb605535c2115655259cfae765124e594ecdf8bcf4e1548c0761022b0977ca23dc9c2dbacfcb2014815575088a0ae6c096b97d5e0a815594055b7838553f2fad60d5cc812df3595c89c59d2c22dcf96c8665e131ec8ca3d818df2ccaabddded9facc9e5ec3662db49023070ae5820b2d2d3a74bcf0020c30c410c38e1d32c8e0e2f2f2020333c30c299587e3c60d6b59f8ad3d0dfbcbb034be6265a858d353acca4936e52796f4913d396747d72cf7cb6ad83b2b5fc3820e7be8273d9d4b5a68e16229c99143c912146a0913175c38fd6979cbbfa64d74e8a04d645e7841660606186668628881c6c78e1d3e5632c8b0fae1e2f203c8cb0b901a18989a3b5f6d66f80c3677bedea47054413c168ecf5721379eba51e178412e0ed68dd71c1b2c35bacfcf1c1b392caff19c8e25ffcd4b5fc3b2d86fbbf436ec0dfba55c7a1cd6b39f8c4bafb29fbdf429fbd9b8f4335818fba12efd8bfd5eb8f42ef693e1d2cb60bf192efd0efbd570e963b01fefe0d2c3603f8ee2d2bf603f9ee2d2ebb01ffbe0d2b7d88fadb8f42ed88f8570e951f6e32b2e7d0efb71112e7d0bf6e32397d2572b1945bfd91ac3728ca29f61498ca267c19618451f355880598159815951a3096666e61b5136216313366e3471233e05cccccccccccccccccccccccccccccccccccccccc98155d433368689aa6596143cac8c8c8c8748f4f92253fa028a38c32ca287f727272825971c3d3895894514619659416060c183034cc8a1b3246596b381165945146b9b22263c60c1adf7680b6935d171b768cc32749abd56ab55aabd56ab55ad5b8edba1a3558586cdc90376ec4863718878c51ca25ad56abd56ad560b161e3c6c4b9316dbc933c9d62c313e3d891d9a189324a1b3770e0f0bc537662a105d9420bb1610b8c43c6286fe0a8e1040eb8d32e2940a022ab303030307d2a7da70b6dbd46f0499e9b42042ac8a21669c8f88a308c925d814b04a3e4103adc0783e4ca27710404587800ab3cd8222f6f04a7ae431f52c2702a5ef91c3a7664f59e2c49c9c295532e21071784f6d3712fbe2edbe56ad7756e018c4a408b837c38e3004e5dbf4e44bfc00cd1005605015bae5f17e2dcc54198202e1da5587908f782705eb20ffbd04a2b9d73722aded5d4220a2aa288228a28a888828a2aaa8042dadc097dcc0ef5d0215ef92c6bc91d228251f59984dca18f02d7d4839430fdc271ab873deead8f66a433f3b97eb1219ee6881302b6cc73caf9186775de0c6ad9759d48a8a4437c09751855356813bd52898b31c61cb48b6c0ff95a4b3f60940fb8a5c80e5cd2dee8a36718d481b1b51f1b29fc704ae346dc2e29a39fd1cfe867f40fbba36b236d341ac5709d24bdb6377fe00325252446ee4cb15087512c5845cce8a4dbd09a8537ab2d981c1d2c6f4e916874d1e8a2d145f422d225e99274f96c84ad80cb4e9ad52cd6e8b19390fe7517d7a75d48d91643baa87d44a08d0789441a59b86aafc61f4ea644f355cb9ba170f0272a894b68563ed707dcd7366d437ab5b95c49e72819778ee32ed449b1f186b61d8aa8edcdd0b6c3a8237539a8e04817752452ad1c572a45a843ea441ffc81a2c1e8e8702adef9d862459d2f4e715bc7b698d145ad5127fa48097847a2d7ca71a2eee324241dede3e3d3e214bdf37149bb903e1f8914e148a59596921c46678944cf50b4916d16a384f0f4c09e01a3e63b06dc92c38a2996de6ae1258251f1667dc50e7d15b8a34ebebce0d4e8dcb5bfb0904f224e1389ae23fa37ba1fd411fdc32e1c89502225e4151d09d115757cd016432fea9ad5d25959f803749291d848525a481bc95e2851efe8479f84dc398aabe823d2704a1aaafac86c31e92d588b3b53baf661d43c2605c71d5b9cba62927ee9ba848b3f9226b6608c2c5f233a78bc22774a228c9ab7b1a5d38aa28f4eea2a8a6d96901ca8636191ebc22a18350fa7e016d8439a1b9d705c1144ba1c5470d3c5247a0fd92e2651c7c3bba29f745f1bb9b35944f4691efae8d3fc4ae963244b747ed4b058cd422142d2301d7070075a71e91643bad48145da658774f99494ee2b22e549c0bb85e8f37d8455a2cfc79948d32e279fef24fdd22c9f46d22edc59322c9f263295642549e3523e6f437ce916ab95c2a53ce5299f29ffbc9b916c6cb5377350c115711d7bec8a203d0978433d92e0340baf2974ed2ea650ab87bc5f24d2c5168a65241f2321a28b3bcfd966fde8d33ca8fb4a3d45dd576fb820a5d98243ee4c890d396586429737b47543306a9e2f24c22950a703d62501e365336a1cb0c898454787bee99b46db3ab27bd5dddddddddddddddddddddddd7d2164344d3ccd484d31544a305ea490504e469c28b4691908bb6cd5b618d8bdf2192bb047fcca9b26be340e47f3ed9034c618af182f1a638cf259d4a89df16afb97959159d06635fa958a137134939d51b22a97332f90f10cfc06fb88138310995348e934fe4528dc49a44ff395e34a4d24eaacfc6b2277222b597869ac7cdb624a3c4a979247698629864aacb1e9d3bce414c529595961c7188a5fb1f5cad6e918b6556cf3c0b0fdc2b64f936ca3d856d24b7eba499489339126fab071157fd8686dace9d34d1399828b6f2234f17eb00538b405770ed1a77e77cfd9db0fd7d5445a671261cd93fca8f48b98caa21a2a44030300008002a315000030140a8583c2d178144672a6f714800c77a84e56489c88845112e45008628c3108000208000000000040406610721000d1c035e3bde9bfbc270438a59c46fa2fe35335183a7e38b9b3a930231bd5369c2ae03ae35dea8fe214021595217827a35fd9a3797ce683706daf33e48f5deaa3c94dfcf52662a3f8b0e486a4824536543e9cdc10a9609145193d9cc0fe46df1e481292e69be42361099f44ae8694a40858e29392ab91923402cadd9081326f91d25329548a384921a9611105950f2717444a5804a0c804fb404f5d66aa3e0f29811b29a4485fca4b2640430a29d24bd84ca21af3bd55e29ef1bae93fde13021c534e23fd23e393e43065e4232ebe17729fa94e47f6d7f62915e41bd86ad24ff5093d7d300bc4155915abe08692a2544d1313dfc7e5595ab6e6d3ee465753b8c90ab61aeee8de0f01ded49204fabe6bf411f93c93d61a96f4fdf4b072d3ccad352cd9b7e941e5a7995b336de85bf55065d3cc5a9f36f4fdf4a0b269e6ad571bf57d7a50d969a6d6a68dfb3e3d5019bace8197309a2dbd04bc11d6c12b419d4c2970fc5e8eb5aba9c0571cf0925e10c1ff0c39f241a21e5329ed3c85779f892f2258b7b0d858022340fc056884ceb40ff09259fe4c8048f1663a30b6037943ac3d00809f42323502b9a9d17b609fbe5955b63004bfba413ae085e6acee5df42e884d16dd406310f1691ec9fa26d76626cdc4009fecee6bd4642a6fe6e16319901f72df036bfc5464b371d04975db07ff774e31e3604c4c06db9756098b8004f5c1e2de03bdb814b2a931909dceeb7ded80005c0a89e94d07bc88883a04b57354699afd3df7fa72c1d8c61360cc74dbb5642480e95cec4a74160a1f03ce6733ff8570c00b7a142d011ca8e846d37e95cee138819a96fb36712ce8cec41d46d2b0611a4833d2377939b78ee6f7331bfebd8161b86febcc1611879f98cdc4012ffac1c47f1f064f8b7d4c330ea044e5860ceb73ede5626c87389efedd517bd188bee964151de1ecc51573d9ba08b626fdbb71c0cb7bf52dcfb66829b3fe9e8fc5be07d6f85464b3c1034d7bcba5b49d8fa2974678fe1e7747833c6b2935f4d2ddfc74b6fe677ad49b79cf901155a5f7522c91039f3555ec8097f2d2d24215a204cfd234ec8d278a7e42e269adf9af8f87bf0bacabed66d0bcc22dc8314f76567287760708538bc3751a1daca325e360683c6461df05820d875eb2caf6528aae99712b6243568f3455e90999bd0e2cb5fd9f3da72b9065f1bebb6202f3f521970f74e2137b916b0d375a638e2b4b7a5070b151ccc5d01abe63bb0262be4eaae8ebaa5dc92249b9425eb666a5f791ad6435395ca99e717de9f77933e05a6338aa2157a23e5189cd6d215186088c892951f6e3cf3bf5450a89f2a9a34e8f1729dc574b40f2de64232c45dcb4b4a44d11f3db0f72c5b013f19d041d484a4ae6bc697022a906a2f698e144a84ab7b6348e5214a59315f23d484a843e6c4b4dd06da9f47316ef8d0348955a0d63d17134a04c4ffa4850ab0950458b4e75e3eea6acca7a8b949f0fda034f15626024351a580f6ea05eff7d7179d1b0084d7a63d1293262a73b989c192e63dedf0f286d0c6d750d4b83c4278fbd70b8480e88fc369557e80d9d06dfd889a876e0b18a94f40e030348039fc76e985bbe7222985ae568eefa19026e111d45cb4b5ad59b44e4845ac86c04daecbca2a91e9fc166679e0e0a0eb0e51ff5e1e479cd705d1d7883832373017be9dcc62dd4b360f786230358903dfaa1748bc7167a3f0f4609df2009bb861d564a1b9c5beed17aa3ae4542322e98a37520c78aff35a581085c710bd9b6de54ed058cf2fb51af59ca93a4de12ea7da75e456f04b7f152de1c7374bd44752cf62f8095a4105d64bcf7a68056a261cd6452dbede894529c5cdb2fa83aa4bda29b93ac83fcd5710d4b22b7a8f62bc1b048ae0e6dd9699f9ee97cf27bf064b877954d3d99fc2034a1d372140c900ac3ef8f260ef0eb5b1ae8447272339d9bc54efbe46ba2ffc5fc9870db98ec0ee625dd71c5e637eb1311888e7837351c845c206d4dd4447ba434e1f3947796035c85d52a3296e169f60cf673c57550d14cba16fdcb089f705b9191a665cbc0f3a6189404245439feaec823330cd280c9d34d4599ef25fa113f18fced2d891b7e572c13ae83ac99a5f1272d2fba7569916875da75f6e62ee47208bf054f8756a45184008a9f50785ac5123086311552f991499c556dfbe3292d898aeece303014a682a981edc9f2f2789b46990546309dd03e26899ca9c0928302448e32a6d440a7d16749a9e5e44cf89f9db0ff04bb8f3c128c52dbac99af73735bb6e477c6d6ae0d2688537d037712107b0bc7ff5b3342e391abde12acd48122f01487fcef7c6cd1fd53879817a60b3b6566a03b4bb714501933f419119d3c971026cfc7bd74021da050845b18df28e590246d95f9d89f4d6da2a034ecb81caef5662ff1be13210445885bc712de3f784579fecd5c6a9e247f4dbd6d520b1ea8243abcb95c1f85401129150890beb438daf913613344a9b2b314dfefae5d6cef4410292c52ad05629a9d752366523c736c28b8612158e03b966b809a8aec0409fe1e6f4c16a469deb24e8b34f3c6a22cd2d4a99652aed83702b975488f1b12444e30661e711226005aff2e4b663cb534624f6855b44ef01de173b391bb0a251cf88ef46c111a155de7a8cb1c30419deed22f932e124f0cd3c8e1e4cdb8b214ac25dbfe4a71961573410f095705d9d63157a4200c2b9784d601db9be23587f1be4d27c9e1317fa0e6a0cd44f5a8ebb6095fbf6a98c1cfb79b6176bcfec28bdb1ecfceb7162a4546781883720c824cd9566060a30068b5e81a894f8967b62603eba13c0713098b96800da046ca9582da22216606a0d333493a8782f0c941a5dbc924723ee9301efd756652190c297d247599d6cc6d60927929dbede11f5f3babf85428f94e16d3d6afe364ece8e6d5daf1caf09584eb189c1f7bfc201b4140e88e16495f2bcd44d9e7a2dff6bc4177f8cc842bc9167aea141a3b22339a5022a0f3e043ecb3b185706fcd131a126eea65329d5633927ccab48d22298aaf09565caaed94672b53975c86c25d751e3f6be28a4c4909a0e968dd44df07ee357f503b1c9a399539a5481113c317a9279a6d133db0837c9aeb0680a8322ff89db8432f9edd6a057a6e8e229a215783762a2594d49e7d0c30bd1d33f35a2c3a87180ef67443a76de25853757f69a75f8a261b89700d5bcdf5f3a6a1869662524249484ee5a493046e936315dd540786d656e3768daaee8bff80113598a26df90294522fe26fe331bed84dc7d6de91702f4f6b589afda03750c0645aaba8bdf40fcf120a3ce43a1a2989ccf69a3aa1dfcbc838944e2871a0131b3d073894398be7e324c6808e113844935148322c4250119125c671534f739133637c86657511f1d4eda9098173c92aead5160d2496141cb795106a9f46f52600222b3a070c0a1a1ccae109615ed59fd8661ee55c812e33a1248294e2d55517d06abf9801af466bd10f80fc4a55ec4602ffd2b6b3183656f8d5640c0d5ee6698bb14a82b2f230f8ab996f4aaa2ff76c990e9316568b8baa8505993c2a2ace2c27cd69e868b42e2679074128b66eaa60f8a9c5c382a39a989c3f05d1fe88805723075501f153badb3aa41b1cd532aeaf2dc7a14772599e96b8c82856ff90feee7b94bdecdf981686e42c9317da65505f7b7eed5e1cae1beb813f01f03eb92330a2bf288634d4b030433bd2858ce8ee6aabd120e1ca384b01256e7d904337ec8dc91dcc7b3b06eb0a0e95f00e05ac40706e3b202a0807758bf8737a8b361f64f4bb356f030e8bd3423d24c40a57950096741bdab0aa9a8aeeb84003bf1951d9aa41c6d6dd501fa07e8959799c1a4fce78ca80bf4a5a80f66cd489bd22fe3cf17fe7754a4715e6a38f0fa917437525d9da1dee84ebd3717d2284dc960d3ac9e8c53d28ddc8909bae33a7591b0825d8517f59c7a7a741efa0d8f94e1714b532d47abab8370de32d4aea048c65a28623940cd36572a066d808a4a9b873500ac18f5785aaf0e9a0b707c0dd355093bd456e310dd3790a1b003385cb1832933dad87f1876a02a370bc700db6ea352591704a137872ef0f7828df407a6602f6cc8777a596cc0b156ab5ad3b5221367a91d21af107d41250f54ab91b62efe8d40750400b248a000af466401470a734f06c44a4a45c9d073f67642e94a627debc828e948a89f885c5a8df174c308c0753c54d86cae388ae079b9235ee22f262acf0988eb0ef0eba72ce30d5e7425a5f32a21089f636b9d65d6836095dda81a240a8e091fe30c8674c788a49c14a0a3884cdcf2eed1bb68f2cf988999c55d21a8907a2f65492e2ab8505c9edbf8977bd0da51f64b33bee843e050f53bade6ad026805ed433f8303245e68791bc31d5c0209061b1c7b5b901d1801176986905fc09acc86a3c71c047764128bc7f672eb5e28b3e888a0f6198231c2946f4e098dc815c3ce09acb3e261d77b799c0d012b1e91b7c14b049577923c8db8266f967dd80de83762f640238b1ee5349a897a6bbe9fd848f79c7aed0db1bf9377aae708384abc6d320a3286d8e739ab28a26b066b507582002921d39fe9ae92be9326196a5f115e12c08044937928124b5178e248d2b9cc8caeab0400d8b584c00c388d9cf2d3fe458b1cdfa495a93476561cc08efb83d6969796d707cea06e80bad3b39765d7efeaa803f4416226e8b8e67c9dbd91881713a521e9ac0b9ae28a0c331d2ea8c99580eed792f64ddbc763b9552dfc41d63d938299a49e6779933cd7e522b657594eec239986e6414bc0b347295df20e1a9d7b0d707ffe5afd811dcc47e0182f1bd59bb73c39fb602bc20decf339ce52bc954266750826719964f1091e5775b9096c8876149c75a2960204bffbec004925e767fb38017dda3bcb6d15b6303ce7b98f5f6d04781448e8315f9fb1e7dc9933592c1d301935b96ee7be7877cef91647f83fef25b23bf121f01a01d50e17aa6514284d206cac771a6010dad22c192468915e771945750a6d60098707614249ca3741000d57d450c2664b3fcb3352f7661f9b1947db592952975789aa342c66ec1e9a7547cd529b9b077a2f6ef10ccbdac101c088154196f7e8453a4c5aa18481ceb050ef5b145d872e140317328a2502484615a9cfa08733fd241c136a3c7fd67f14cb6c17a0d3110458b49530b4273c2a38c18840117457562b5488db84b9922e9eef842b7d7cca6ff9d7464b54c4e13d92c3c2642d93fb945e6616e897557777819eaa3b0c0c4b2367704310a474f4c74ea2e1a75732fa4f1e8c02c576e39772748cb0cd9570f69ec87be6258269c3c6c59b67edec5d32612bc9001b92f03d585e5c6636e8dc243f3d91fa6ff36daf22e460e98cd70dc0edb450d230d02502325ab9377d1063340c58c77010ea52c2c79772175cc3ef64c6260dc1601577e8145fae2b61824688260f14e9cdb22c8f51608d1ea26c019b8782113171f5919bea7c9b7842adf592214880733c6d167130ce532105368c4c3cb9fa2f4c2f35228578c5230efc460809e04cceb59755b32d70aa66ba33c902f77b5e8e64d600c53d9674d2bf19bec37197a27562d34c02c12e8e404f8d44462ecded7435a833de951cd8dbbfa079900f3c2387741af749edb298f3ddbe35a2ec43eb8cbe7699ea3b1ae5714abb6660d8c819a8cbadeb6aec3726bc3ad54dc0187e02326efa1771831aa86c835e81ba260c235fca0c3ea9cd0002fc072499f23b81d0aaae0010988be42085c59689303f8d0a06b603ab098456811140878ec9f5b5b307b010d2820c1a08b22782e41990ed0ccd0c3058e42c2f708d2d4ed071fc5b81b46f4ad75e823be127a9764d529505ef3ec5c0d52e2ddbf478d7c17954e87716392fb4f6372994a94528d1f9d3752ea529d4a8ea38cf114bc92e7c8339dd2db3a729b29fc116ca83a957f4789b12850cc23c24ced45eeb9097ef27ba44c9d74dae1478cfa53bf1d81d4333e977b072149ae6e86ae9459425ad0d14883b0b31c9cb48bbc8335733e75a7629368109662a17a639818f3f6e43362efd5a97b093b096ea806dbf73ddc45916a466632a1d7bce4804a0c50428f29ca65eccf62feae507515bdf3f0892b7a7c672e962bd27da534df41d3314e0f09dd80a96e63d03a5c605ebcb906e0e0592ffbb22d04248f4feef8d73359c5eadad435543b3c9767365e436f76f6d5142bcc13832fe21c094858811a649e9f266ede933639d141fee95f939c86c25c2f2ce56d757d59474f7c4a328c71f79c578aa1f853bf54a6a941c35cf0fa828b48fe8ff0efc28886485b03794e2bf5b4e7db9c2b36db94901a4a7e669233e6ef22ce1c0e2eead32e76adff55d659425615494bb9fa3611e76db9c872168852dcf1f76c38c1566c6c11a7320beb1871f7872f07598e43069d8ec3747b97b05a9a6ea82cdea362f18c94956fc0e9050ae9ef801dda099d86675455c555818d700a67e17cb0601ade920fa9530d0202864a54a7f58a128f121f0eaef8c7dc36be7499d23b86ced9e79d43a81818f691e9f67aa4423520af4b748ed17e2719bc3924952d553e1cea882893d32243c3649c35b8a89464eb6bfbec13087c22cb76c85bfe02468143d9efd05c4609328802463e0a119e24dce98a96957de33020da0a0978b29dc5999923eee7e49ab6772271a67cab6b5a95f51bd55c2716f764a3f9bf843606e9b322c6f69b7350c910011ec75400afc275edad38a519038a4c40f47a7bc0b4183934e3e8bca1c434dbfddf5ceaabdf3430b0002c34e90a0b6241eabe4ad2f9569ed91bd2c167f5bd1265126ddb3e88e0ce4d9b36277c18d8c456b216f8eb63ef6ff908cd6b2bcd710f2cebafe25a856a41cab4fd36fdb2cebbfec8e79605d87edd194bc163c3d98001a4ec65fb78ac0f1972ad3c2e8c2127dbf86e6ace59b63886d36169771eab99f60b6574362b9062b4ce530c4500f9eb6cce1f568276a9c86ce98256fcb9644abccfc5b96121e6e47de4b18e5bb9ef3b7bdfb4307cb97645c1444b5bfb1bc8ee6144e375496f3a23a16058bb4269637e94f8a374a96c2e01b84b1dd37fdc6ca3ac3e8822ec043d140d2d15f82dd1c91ea6eed4d26f564df9d855ee17a843a6cbba601200c94b93955c395a02d3153561be8e8c599aeec0085f5a89875ca5c3ce0ff1940ed2494194dd5438cd8bc06250a5ca7e7ca56a0827cd3282d8def9344b8f4fd2924038d1f6cac6c4003c02001a6330d7a22da92898409f8338d777e62bec3dfbdb4b2f47be4d45f856e6188d79e152947bcf227a2db4c0e5bfed34e40ab29f7a4f2426c71b3663e2222f56aad8a433cfe566e14015bc3cb524a569afe81c04da5d1dc1d92694c73436e2770575c99852661ef3b3a7f6625a964940a6303f1559885806236a8c5095344c18067898962ca29eda379ca51692e882e827f7131b9eba592957e762afa4ce31ef437a630a6286ca0aac489d5498f3a4d8d7d9ebe8172d40f5f906fdf66d0a0e863dd9f6f8d1bc9f94df09f9f013459e3cee697890c00b5ba3eb722456894a887adce7fc308f1dc5a205e8a8085a8ffb334c7b7c0756b1a8c897c158f55e57df28c256037fc6a7a83c1719efd82856c733955ee281d745e442654433c9626b2f171ca54ce6db60a85b36c5c443fab388f302c5a62afb2786a5718bd88054963800b26faf1497d31e689dc5b8672cfccaacfc63a9d4a38df3f22e918379e7ac8c0a931a3998674eaaa8b0a99383f3e6a48e1a931a3938eb456582d150fd93333e33cb919586d091ea8e2d1483e215bf1a9e7c85b3cc2cbd730a28fd0b94a0ec299f4afae6f446de46da7f4cd93d9d8cd158d79f4e78114679dc646280ce205d82e3a80cbe380548ccc9d029e768c44aa1a213c211ebd866f640cdeca33637876a661f9599395273f6a0cfccb19e739ac4b00e6c601fbb1f6008d41130b4cf65162099a0d71aa0f071abc29c98875226e6b48fd59480bd942c54c8bedf2099f785c59a41b49eef3b743f76794e97ca171d2d22afc861f198c6d1c0ffdc115071750af519b66ac5d86837932dc3af0e9034a03b499f5c3bab6608a05d09513a5c28b41d5309eab113b9f094560fbb6aaa4d79c2b38d633b1eb94c1adf369b16cc40bd3ecd98127416dfaa964b72c926eee2d689e1999975e1f1521906c5345a51cbfa3f6cd0c62a6b63e1532081b70ace048cabc01ecc8bc54f759959a8780184c1c5295c6b0bdb389c91e8cd02113ae2af09daa669956a3cebbdf6aa892c4f3e4b6dd011c29254cb77bc85cc3dd632221a1667bd6c0738a80fe4b43ab6548003907d8b519221e01d01a66dea1b1be40d8fbb5b064455840e7d625c16a9034fa3141d0809bb8ea9bcb93ac0c69c5b0b123da1fa43b8f1e62b082521dfd3e58fe7d450607e096bf50d50dd8921d0843dc87253032d6d5fb9b102cd6bd113236484e2f53d48230c64c0956948ff0b32d1f96fb6b8908af46b65057063143a28855faf5593ff51d44191bedc623e98447b016b8cb475ad3223abac6f4df0859fb78eaed8a6b27eaaa217d6d5422dba4d87344b61858ee1abe8a4b6f09320e539340bfb6f227c1189f82570da714f65bb95ffff89e71164f5a885022ffb4c5b05717f3e5968a09cd92bebda7873ba254b69c1d20e729e4cb7642b62171d4984915db44355645c27dd8c5d6c2375eedcdecb622d5734c2bc22c57e530ae692b3ab4cda5c6ec494e8770714a72c1d32df8b08ca870d1f08de4078619cc4b1925769982587d9de5e9aa128c99a82ac81022f94887a13837a4655b9ae2ba5389eca76364150439b3b1d829d2473fb884b377018287e75a0d7490316ac3b66f4f8ed9609e8d3e05785cad3ea7b563699f45653c3fc4c980b5393b6333d0c1d2b8b563cb5e7b4d5966050e5de5788e6d135a929ba4b8a5e670859e08e303241c45b5fb12426273dc8acbe3a53d432600649f1c2aeb1f4286cde8762c1595df99c885664312b3b59a426a914854a76a79ced1ad513a4d98e354c126c818ea4ec9f2e87a3db11d4b3915ac20336357d1fe6a337fdc0f29491720a68f486ff7f0786fd2d3a60a51dc22945237008bb490021ca9767ccc73051f2eab77b57a785e74d06f11b202c1c4b7d6a55e0cb4c2f4014ab0bad797c3e1d35ac5484460dceb03767400037b0e80acbfe8632fb3432eef389a9ec7f9b17f5f165bd64368607a31b5f0ed56b7f3b26094295e86ff0aa5c6ed7d682d0b65dd424edbfcd8ddb6fd706282749ab32c689f1144c1d2541a6bfc838cc8a4a346c47743c307631e434eeb4216cdb62118756a696d0c81c3997a096ad0e8fbf1107c085fe76c6dad62799b0d80f8c40e17380f52ccb5eb506a994f86cfbbc6e1cd714403d46ecb28c5b4de8357d6056f586ee515fa4ee7309725d8139e776f20c8432cd5d575f3dd3aceacdbdd4598b009483b1606e97f535ce6b0679f9db4266e441c8532ec46a1fded4c706ecde325f284bd5142aae957ede6e911afa645355b8f60d49534358782a72734059439225473191566c606ab37210483f3cb67de311024d08222ff003b0f3645cb71632e89e145969b8b6d4c49064f7cd9aef7095e9b7927933df67532da3c53b92eb22a337ea90c8640a3904126914320ea50cc23e740261fa1dff2862617d482dbd3dc0aeec3c2c8ff61d2ddcbb0e436a2afa1c94e94cd5b4c839a87c65a0f839b4716fac2d7df7ab70d1ac805d4e338ad9fb439d93a8bc63e5ca74dc14cf36ef16758335e34e48cabffbe4c6e5fa67a4baf25d70d1ef8e8e2f33f0edc17edd9c884a2eefe92a61b6c5cb7223e90e7010f986f46a81307ae0d2e22f0810b453563b31c3e4032aed34f053c8c52280d0915172bb049348249a767fbac2ec33847760f1bd39f9f0466bb4eb9423ab4fc2136c323af2e082c3414c429e8eb038256239f5d768129e5441beda91b025443672680c1926b70da13b49072a496688efb156331e8121c52daeca4279b128a2f08f6b8d9399d8c1b29195bffc4913097e9ac0063395d3b02195aa0b40a552df9462a6bf1cf8522a5e6062de66eb2a5ba92fbacc01cde32e69832207456cd86e9bb34c45c2b02b95b9c969d4f7371765ff0d50679e3a519cea11ce996246eccea2a0ff79fbd96e1c4a57b263ff29a8382259c50a62ebaf5a3a88d12ea4b3b8a9b0a29259e90fb76e3dccfd74c25df48c678945fe79308289007b5a9ced85315fb35b0be2c55403f58ec6ceaeaee150f7a251415eb51eefb23fd413d6145d164fe8ab7205740d22e58d4f21cd6ff04d62034585e2e25a860a2b6cf207a52813640df25b38fc53c15283497d9927187bb4424fade66c34605a7ae21661f24f0dc4833d22de9aa058cabf2d0e93244cdd99c73b6e94986c9574911d91fe508eb0714b85038f4d0f45022790c5a4d720fa059f17ba7d06c188d70c1ebcb69f269b1005a7955183c7dac42078a6057e32c738a67d03ba6eb146c7022d3965f00ae1c412ab7389651e06a99da8163c58d569dc950fc9b2712f3534066f752b07d0a0d534d885310f9c9f748ce20efd32d08befda577ee99a18df33094d6f45f7a0b29a5c77f83433e252078da6d1c7d6a150a2d6940ae636ac1d7450aa94df3308d46007101980c7a179a8a75d55ed03ab15ffb9cb8e2b814e143180765051c00e22be72028f6bd8c91f674393b8c277ed135e64471c80f82a90eccb923180ba3878eb69319ac27f4d588a4085e3bbd20f119826b137bddf1e943c7d8c4aa85d341549f2ebd1d4c52856a80792faec26305d0809b6350dc94d09d0411f3049719dae8cfd7f0afe4949e51bb799025444c88abd2642891e7be2a9bf82c25a098746ff4171792b3233e58897a6c05a88b49435c3c7a2b056e9527ced470bee484fcb9ab1aef428e5ae216b13d1732a0a647b9b5c888e4254373ee8b6827a82600123e1be1ec9db918db163ac68c9cbe3cef92f0640a59923804ba53d148cc0d7993f5f74b063f01c1e81c28b0a3e8f0c13c25a66df2030dce22f5cf03f322223e8c3d7fe40fe6bb159423c83d9138c7e86e031ff0148d2dd18853165505725f6d1dcb5551a2e90a5ed426fc1bdd3f9c479885027a0fce20b59e63515f297e9fd2bedea9a99ef3ea50d6b6337e5a9f2b84bf5a83acfb43ba35c12bdb1753b2b7da82b19ebec897e8bf682ccfd7934ba60868be704d12a5a1c8a0abf92009a0b899d752b9743bcf07e7604be34237eda6664e5a037b9da93c0c53e56afa8976af0c8c6a92bb8c28297f9c3d5d587a5d2894b3046048324828c2828f728e67544cbbc8eef8f1c487d6d69add3a3114d5c998f53a265b823cc3317378f02170f0d7f583c72665d7b4c358941a1d8c80a327ef32dbcc89e42b703bb7ebbc3d33747bb042c62761770ec9c4c726fc9079b30d252ce8c03499720f92ada04415378aba06a2cd1b4e491961966e6a334980c0122f170ac0b40a9a0985fd69001b583678cfc9d22671d84c63f14088557c63281917e50fcfd15c2a7c5d9ee5482a90e00b0dda5bc42f495db344eac310e45e09fa6cb70fa073621cbd71dfb430dda4eae44367e4550b4d3998ade9dfc28d21cdbc96abe90b992ade364245375aa8b5721b1393843d18ac1dad41e174f063b343cf588d728c624e7f5d865d2da357c7b3e843cb60d56666d75cf6f83a4fdbc9ef60080508316956cc2ac07633fb8a6ca514844710ed0a7bda2bf18c826a4b29ee164ca66173847f7ba4bea603791d603aac524c0394d4c500d824202e73c245a4b3d9ec2f743eef0b5f322624cebb8c844508c86379dcc3bee53d41a187292fb44342977ac3a2cf48e81b7b0410ee500ce5dca941d4c88750ed61fa32d1631b07acba2d3bb39932514573660bc047789dd1c8d72bf9eb863f329e43e27f1f79cd2d6332d353f568a462012f95c56b4980a9c6dd6c7133998f4c1dd657af7cdfd2234250992039baf5efa0ab005a281a13a18f4cd2da5bc071fda9fef8449a541be54ba9d2be9c9709c20f20aba2d89c6cb5e6a8b3002c4aa6374a32d12dcafa984beb9d2f7b49cefe3fd077eb80069d72c0ee265f34354ff39b827dba4960294a7c92fe671c38ac8e5cbf35037319c4851b0815da928ce80c86482ab52c77ce0a13efdc89620be51bccac802c13f0682fa863262e12603d247e65d46b08c929bb8983a92394dea71f468d5e2d8050fc6c384cde58015d5768415cce85c271e219fb609219cb52ab7d8acbb5eb2ad3b8eae7707157422ef371c4da09d17d9663b056beebe27cf12097ab026216dc7205ed44c149113e6506aa7b80eb4e1b288e2fa0640dff37b707acf2bfcd7e1412f6afd38b518832a1994070052bced09cd52c391f21472656dcb692fd85853894f1299960fc3c692bf33ab266deae16db8f45357644ab7edd65aabbfaddc511c2e544d3c6d156c67253181c292112cb23432d0a511e95bd4300707c351ad7092078aa41323d9394487004cfe2e3880c611c1ca530b18ab7fb2e96799e7b9015b5a30fd4057e9e41c271e6cbce9848fb03f83b1f1f0947418a63a15c060deaeefd3132c0c688a2fb01e8ee1833cdda0380219e815d36a89944504ef090bd3f8cd79e03d96a4fca2d4feb0f6e0b7cf6cb17a518715ad3a046e16dd14e8f4e29255d44a0c0155f3af2f49db03f71a51441a662687b91fe652b4fb5d245c2ead919b52f2faa591b813d297c8bdd00ba7e649d73b3e77c983d08eb82927aa6c2ca7fcbca67728d26e51646130fdb1967b3e2c00265c77de74211d5dcb703cd01868968ef01461ccbf97d067eb488bc14848ce781b25911ff559dd5a46b20b51bcf971178ad38d0bc1088c7ef888ff99de056510e28cadc47474d7ae825ceb6a59a3876de1d4f6d52a7b6042ee8c22491c343a3e2d1cdcd525057c40b7a3f9c9181b241db51e110d841fffc044e1fc627fc862f5f82b4bf484996cca2d6469f718797895e5e0677b41a5c2c73d07f57dbf307830c7e65de9a5f36b24d66b16df3917a6c312b2a8d37b679bddc0d4a920858de3b59e769e9b972b475708a0c9e0f453543cae4923cc0dd88e2ad83972be37cfb29aa80910ce0c331b591df8dc76daf594e0dfe4cc0e87160550afc7497443e4b06db676f0855d1bb19e7bef07436a6e1c85610a3c0f282a19bc5e4161c8fc75186741b562ab74525d83a17bc68750371632b788474e722e81d91827745e326da128288a1198f634be91b5a0d90f6c2c54996835187de6d88efc5dbfdcebc9793414ba20717ea6ade39a695dd3d5f2d96216eeba7313871f7719e3f0e318b77182d03b3b1064d90429eab6739700c9b9fed9620f7846ed0cb1c58c152e7e45dab1553164f2d1e8f0585d33df7dfcb8ad4755d096f3b0c0395ea0954f09e8f2fbcbfa28157faf1393293d0f8abee973fee9ce7925fee712c4850a0207aa28e39998bb29a5b0c0a43d7a5fc3eeb9942a6ece68107aed38cedab1284c861e19861e9e368413a1ed7a5a23464bda507b2f14127796389aa9460d81354c5fed4bfac932d3ee591e967d945a3dfb412930587391031e8e0970b17a753c6341d321e78678520e05578f1127c21d850170284c27f81ea339e09e0d063de4e12f70b5ee712cc55ab1581233b124c5145d068dbe887b96914722fc8773c4056626de469d61729e3695dcd5594a8f64311af25f483e640353f2ec8bef2d69d2e9206197937ed5686ca7936349eebba0716905052175f9e181bedc5cfa88d1d833562879e20cacd911f195e498907859ef74936ccefea2c7ef7b14f65074c355259f9cb71ae989898d077520338386d7f7b19f991328cb4a0744c99457f406bc067bda1f64fdf09fac29e53783c6e9ccf2ff11417fd945860166df154ad59af900e2a4503568c0be0176a7058ecef535886fc58dd0e4a431cb4f0d17fd19ea5a76fb91c3a10a6bd2610efe5fdd8fababfbe957d358a2bf3853d9ff8c37c2f99a0f18378708781e9934d6b24861b4b261720105a53135646d68391087f49d3440281bbbdf2f866e8d1a9ce01cca86af0465c2f8cc3021217a3336e218baa5cbdab0adc8d170dd381af8e17dbbaafe2a6b378b0f27fdfa7806d6465ed2daee8349de0379ea1729298b53b75ee480d55f54c295bf97c91bd6c6043431419f27a819a1c9fa817138c2da380ae4e55b0679ca141d266e9c37d02a0fdcbcb7362e3f8977da5f11bfaee4050c8101b8f597f0f353759ddcd0803c04bef289dd0d4fb4054b9e9d1024b5438bea86724084b7aebf72afedc68cbd37d4604803cbb9bc7865ad322f2dba76c7d736bce82a05cc21af2ac7cd742c4701d0a7de32c1e4bb7bbb1c010b660728b31d40c14287cea3a6df8837e67ca87f6ff87f15b38ae5b49026ed7ced62a986943526d093f03217563757c1cceaae765b46d52912cead316fcc3338c2a158c9cf927eff97cee1c481116ba24494eac001c2c1c678b7bdb252f8233f88c2e187c07f3ee39840dd10713826dee23ed4ad5f1e1b47f653598a5489562f4b06311c3f2c47552c31cd4399869aedf49ae89c5fe53eb7582fe95403e9b7ded80fee57ae02c7cc8d734f77f6255eb9ea292ef338f6f3ecc96be913ddb396212304b720bf1a877a1088160d5f468d03bd3742bfc7618165e7bc3994c376f785d25f1ce08ca5c7db4569b96c1123f6d59acfc7a0c99facf0e2c8ea281d107ab3cfaccdb6c7550748b07bf7670924ec6840fe28201360197cf904ed7945a190878cb97b48543d907143734ffe24bda7b885b87a72fb61a527de9641c4ef065ee091bd9557208fece93317814c6cc7fb2742499e839c88fcc005089a25ed520a6b65ecbd0ee81b01e6fc50dc3df72394aa540cf6e1381daf73091ed58e2fedfe98aa2ad07297146ef12dc43aa8c9f3fd8acf04d75fdd50746b7f834c26fd22b1cbe50c28f8fdbc73d612a8dc6f80a288013d8f01839c94a40e3f65a86c48a0d734169c89022da8a18b5f28404054d5ffb06d5051400404fb1d61dd340876822f570091fafb6bd5ab511f95f490211d9168215467c235a1f8440846d24e86200cb6ffb0e1c60ba8716b87761c47976de116d192454684f8a295dfcccf82cf23cf0e1e82b6a8c9cb02cb04c39e0977beddb71a0ab50f2b6e12e4f512db2639a26e07f7042dcfda92d829884f7e7425983a45abea82f8b73eb1bedc47c16cd15aef07155a8a03d14e4e069e5c35f31dcd43266c428af0112f2cba1414de2f66954c1b0644bf93a984fb97e4fb311db6ea3ccb7d52fd2939685e4351df6a33aceaa6ba569270d28409dbff62747432d661e1f3edff9a3dc4800377bdf30534a1478d36187d66276de1b537cb7b78eff531b0c0fa8f54cc047e5632a26c9e9661e3d63c53067cf02f20cf44345c29b50c36d38c4f3ee4317dba010dab791677e3a7390e19358fc157a7ac461a9c1c798935fdbb0d88679336186a823a8acfb477e058bee1a65024be86a1d2922b8b5ecad8a8a0c80540f91d0072ae6290daa92262a5b8790ad5b0014bbe12c5ce732f8245fa165fbca6892965ab15faf3206869f5eb719d5306efbc9382406564597d5d35c8e6e31813e0f7547994547840c07e6e53cf51ead75017b90b13c16cf743939e4146690d28f3c5ad62bec884e6e83d0a64c5767c6410d59559a265311d2b2604db5635e4581cb2e0a9b1d8caf56805e3f2c935ece1b7dab14d82a022663bd171536f631c1e61dc76dc0166f9b5c22970c37fbfb0b362125b864a7105f689dcf284dcc5e97c615f92c406d99df0bf35820398ee5f217b75f9022545620b37d8e2c2f2c59e6926b95d1b56ad650d8f84615c1b3b7bec6802404c46c12410f7783e75481abeb76d219ce13ab59c3e925b240f6476782d08f0c0d574f827daac5fdf75899bd7eb9f715e254e4b9d0cd1fceee6b2d57977c42550b538de8cf07b0e854be8bd25fb817fe5c48302fa76c24e3cf12a2674429213840b8c1e210cf48c0f19dab4c47b5f81b51d3846291b49ced1ebc968cdf24d1b208350656d3f0c970a94b9128bce2b36c332695fb203260cc326e74409d5d209a54eb250e4552fa9897d8f7b626dbc012746b97f43c7e72cdc53b797db00724d2b6503bdfd085800341189a641439022412c4598e40bd6b6276c141f297f739789fddd09da15a0d67ad617ac81ad50039842e9a2c86145e1d082c7d2f20867d8970bf6fa55a8beb295ff9ce5c8364722585b7268670ba2f6162a6f318aa86bca8eec81b1ba0397512c759fb9ec3183b6e42d4ef7026cfff02574588f590ee783f52056ddbf56ac1157aad12bd0607592fb60755a62cd2f65cd5a71ac5a9c7529fd7b26f947e709c4b02aac5966656e492a64f3d71e4c146476666b5eac1121928640a3929e62ba69c01cd963b96dec84844cf392e0d83370858557565066ed45562ea3966ca38203e80b5f9c860b82af41d8b24283c9239fc20607210c60ed87d984f9045000e5dcc2a43d4c0166e95b4f7ede431eceaee15e75d91a31c4772dd0fdc302c71e9908786128911f71bf8174ee415ba1486552f739779a77731eff5d7f4ee3d3fcc39dd20b781d4ab3794002ad2b9be8b26c7275c0eb5f16c5e243e7e6a64cc5fe344e979d926160f082f3bb925e9750ecf3a6cad551a497a4b799e3cf9fb4982225e9108403aea2fd4044a151654b353f9bbd049e4871d269ac1943e75e943432302d94fac8baaa5cef2c2a9f944be516ff06a371bb50ae1dae606ada08a0089cc1b55089f53ff2ed05f47cf3450bfd86980d5b34f436ce62b734583381629d87ad6d2f0028e7f348f659cc0dd531016c0c5a3dbf1635eb4b413005e822acb468274afc9e567aea6144ddf86bfa08b5580f4959d44458b3ca3be3e487a08b44b0a2b0c52e508ff0e51307111423abf920c05ba4f2b43e0479b9ac105052220190b761c72c7a98ac843e47eed07a19f4122d4223cfda20a8a2a90c96e304c1043ff8eaa1cedc4ba2a925593f8a6bb4075ac3267ace3a9aff9bdfd7f98a5aa7fc2d5e5c515d0cfccf028af8b9665c30d0d14a07551e1cf6ef2636bf463e2651a3e3a9efac12b2bff7b8ff88000141ea21098c26df2aba7802b99d0a10e477305a0494ea7c784f7e3a6ed63f3b0f685b31cebf917a0e608648de17257ff1980713b164efbde5de52ca946455067d064606b7e839899970cc68deb496dca25b64c42a127277f8f9f655eb7e17a8e81a315191511113117191fd80bc9fea31da2d7819a813735b1b9232268dd943ce918d401b768e9d739f570f396d38b46980f5ea3b6c752eecd1434e8f3f1b29d86e893bc3093455b085131676d40b16150275e976e9dbbf950d579e7919b2c0cf8214650fcf061976548b1df563c31ae601b96347351a4987666b463a3a3d2d1d88bedd45c9c334892553a454895f328d9da6460a3300f3ed3bc034ec6a64ee2895accd8eda4fd36647437d8b489dd162b3e84a87db3d3b7a664c218c92b4c4929acce04845c117375c0be48e6d34854ca359d42d71a9d20f12873a499a37edec76f2c8d7abbbb5e48e6d54d4620328659a57bc9f5ac18e7512953bdaef9c6e17b56863238d92d447b1266394347907cc173fa980ddf6865121c4ef3439629327df0e432ab14bc9df5ef3e38ed6ce6943d6fb7319ea7775eb0a6e0d0a83c160462fe95fef683054c10112f4658b1ec3957fa5fbe41aad434ac94a93264d9a34af1ae20d6f02f4ed2e18dfdeba216b501f9de562b5ceb016e02ca66f6fb9584987e54fdc9e9c561fa9ad1547f71b595672d78ccc618ece5d51a5242e140bcacccd81e8db57ad95dd724736724786b930e28ef75544eec850df3eb6c2a70bbb306b3faa24cdb7f7489bc02ce130bbc2856e1556a56c51ca1e89d34b2d32d170c79b2a7347dad434797a88bc694732fb7efa6e1afaf1b691c461a8797399dcd1daafc2b4208e9a1ee170144b6256c247e0e72e3147a7c7b6ab63b47b3fee4869708fb828d63a7a16dc71b56225511accd81973746640f1129d4966863d3b38a346c768bf3db8335c795ebbe83374784f8b4da3c60dc933a7850c77cce9792fe88eacd68c489a61e26409751ffeb22e5dad69ccdb36b76d6edbdcc03937f6faf3ab2df4e818ed2e8e4891b92365980fde8f0f7fb936b08d3a46bb0676ac63b4b766b8291c5c0aa34093e50ce71defaa8dae7c7b1fb5926ff72c903bc44012a7351b0c456b3832d478394a8663c3c6db40cfb31fdba801f3a58514366fdaa3b8236dd2843a691e6fb71f5502a249453efc55634071a160309850b78084ef062574ae5a8cd1be4ac11d6dcbc995527ccec1a1596fe6e70775e9ba0c03ea18ed2e27e80ff7d360d862a5896f678dd074478625dd916113caea39cdb7198e92c960e8db59ce2fd69c4c9929b8bac185fa917fda45983b7edf9d653c7e4957eae97e0cf43d760cdfde31f876066a62a2af05903bd21fbfb761973224685e7a1b5dbbe4e8dbbfd5741ffeaadecd218c2faca1a363b47753ee684f88c1fa4602dda1be91cfe1c82a722331d6373296d437f2c71e1ce855a2f4edabd612cd533662b4af28ba36d3e57fa1cd7456f1e0fa8fd793ddf17ed3ee182461fa917e0cc07cbb55fdf074e9923698bde6b4ec687ac75391e30a91e7e5c812353dfe5aa977a415253f5e7e8e20a4f48eb492c4cccbcf9125aa776ca673d43b3b8104490cc9111222242a4002dbb42d8626262606866357624ab1a49811c786623f62b0ceeb3ca86faf38182d98235764479664479cc88ec84076a488ec480dd78723408efc204d81a403241c202181d484b484a484948414433a4222421a42fa211bc90c4911b1313f5a245a9050895a81023a67adb2451a3231554266485538a1bac2d48edbab204302f52df47f2db2136164cc4b9911346f8097b2a331efdae6bc859ded404e92c0deb37b6c835ceaf39ad3d4092dbe021287ba0acb1d2f5f294373eb9c4241da9ace69f4d7851c4d7a152438dad7ecdbe0689fb7520668250efbac417f7352d51233135515e64f65e572ef48da3eb2d25ae4e9db4956840b1744115977b7b61571428bc48a08d134cd72457e50aee3ba31df3e9fe80766d5799d77e5dbeb94d1ca8838611189c9881cc98810c988c0202302bb9ee77da93335460c718279c80dbabb277d291b22a6c778cc7c04cb8630b16c4815960df98165437458c2438e7ec575438886fce8386e4e23344666a8cc088aca1b6ec92f95b6c49062142645e1868e23191029313133ad394a745c4a30a0582ee6f4b4516546e1c6d401c3c55ab10d572a0129aa81c20d1d473180416d4eef5c96134928500332a6046600e9d9a9043170246712bcc011d1cba3a1cfe1386ece23d88f524aa369af5124eaa78ae93b0273c4e5190657ca8ea4fc3861b2231f522f6547493bf05ec4ec7c11dbb44a67bf885df6eeee242424242424242424242424242424a417481d30ec4ad39c46b70c33d4faa5533b69740c89d33e9368491cc97eade7d0708930747a66d0292db77b1f4bb1735947506bd7f01c1a2d970843a767066bf5c107ee123ff8ecc7b58c275dcc5add76b037a9fc5c7a0c29630cc008cfc204fe15388dc739f7f7cbdee1b0a7db7acf64b1a41cc1ef28f0d6d97ea194389d174a0b2347cb1d7b7a6ef44ee519bd237f3a0c2680c4696f91e5c27802cca0410029563adb9a38f102a82443615ed832e48024c8a4794190227ea478ca41cd5314bed4618d1391bb449f28439c3401032884c0e105162ab8218a20a7a126344f49aca7252a55d20c9992a6056484242007219692d4408991284cf4e007d7532250040a1de8a0832c4b204920a90928a27078e285a4a720354f4552402829c13d087829534a528ac160e4909d86b6b9b9b9bbd2ee8fd63086c4e199fa19aaf069a14c4729e9374aafa1941a913bd2165bee487da4967e056d35a15f0bfbd946d6a7a10d8e913efd9e862a7ceff33e3f29cc1ba5740e69873156492eb7a074d2d9ed85f22abcd1e170c78fc66450859e67ca627d77c5027d157a9e291295ca1c587e5c56e0b71a6a9a6be1589d86b57a0bf5e9d7e2eca147939fbba0d11e4fe75cf8b53857b7c5a985b7c54e0b351f2bfdf1bb2dd216e58ef46f6ab586363858a033be862dd4a73e5f8d785286a3f497120517cf634a2b4a16ebde39e70c79ba953c9acff0aa36e9daef50254e25073fea0e5726118d0a13212518fce83950c0ced870831d7049c1cf0c6a2cb2031a303838a101c810dc0d605eb49499d4024ecc11ae652ebacb864b32c840258d0e3fb79f3394c00464ced080884b122e4348ace087a52d56c02cdd906629e9859ffef54e8b9f35f0192ee56d072ffb5136fdfc513aa520a4861e86b0f2a506d80b8a2a3b4435fd083305ec354aa628673c3fc14fa7a1829f5e81de913225200ce39edebe944599d9e6c8a8e8b455c351738ce0a95770a43c7c2a3311518aa20045f9816206ca0da0cca080817205ca94ee09435102c548d334cb4119820263aee33aa86f9f63be59e7759e95d1faf0c407253ec47c28f241c887179e48f1e489274e4f6cf0848827569efcf0c4c993d813a327434f809efcf460a607a81ec644394287e5624e0f0a4c2b181da866b998336751be40f56545911225690e45696a367a19a508a8285c8ca24889a2c41425294a92284788f0580061018405101640b827adda66b9cefb5235aaab62c5072b162d40600120049b0088e022280041ad209ba010820010c40a0221c885078110d4228845d02ae883a015410e06ad08521174835441354160185413940afa82bca0f0459017d40571412f5c415c900d728d10648346104090004440a15934111212121212121212121212121212121212121212121212121212121212121212121212a22c5e6011038b1868c70268939225db255db3b7e6f4979ba272297509b656d9694b55b13409ce2d57bbea4e2d6fd63beb9a77d6b9aee338bb553139305ceeab16e9689f8adcb534a7b9386bb54d392d6dda7caa18a90541a9b90d7168be6daec347aba175cd3296b35c82fdb8092bb321cb3fd2d1f5a1d47cdc9c0bebe696b970dc42ef2cedb9b4dff6f996b2c12908f8bcbefe42cfe5aa45cf6f8b9ebb5c9e8ece86028f7f7aa7bae70cf443c78ef6bc851e297897253d19b581b25d8274f379cfd53b343cf7dc7bc75d2ef60ee79eb7b9e7e9bce7bdf90cc79ef77cc67b2e4729e53dcf1baa4562b12b593af73aaeeb28e5bae6f3ae736f7e16c91d73be4bb1134b2cd76bad6af5ca96254cef906712a7734ecbe566d4f309b2c035e048b96bface37d04b81acc42b82bae73ca3202771acc5cec329eec8b1ef9c67d5bb7a2f6bf69de7f4ce09f235ef3a9fd13b9b77ae63bd1bf968e8bba2ef9c19a8773aa72165f077ce3f3acf40f3d057277fa8f29ddcf25d27c77cd7c98e07339d776ebff33b3b7b6fe7d2d5853c7a880c12245ab0486963d772b389376b36af064c6dfef98f94b1b96de27196cb5c7f0b3949e258e7aedccf6b7c4b5285b6c51a4ed9d838af200b9c0247cafcc302ff078e1c7beb1e38721dd8c32b827f26c830d08516adbf58c1e5246bad7fd63fd03b9acfee14314d6f5fd6ad0500f8d6a5bc793bce786b5d0a7915330b030f4e3c80e1e1ca8f950720787022633c143d015eca9c8ca116e8b7ea3ede6c56cd9bfd683db09d825ead731ec1244ce799b2c102fd984f68cb46bcd96ab159393d41ee8ba4cb3cd4db9d38519d9c31c7b258ad150f3227497c277dc1e48e9f8f1d948428e198df1503b1befbb38100c355c1eeb8fad9a4f0023d348610f2d36f24f9e929f4f0d3235081237efa068680e2a77f60879fee021718d31310973143442815d1f053ca8a28f373723d92ad30e3f4e4434b17283b80bdc6fb53893246981c45f182a5d82bcc0e486ae69c0d43862c647ec6140d41791c34f85042074d2c79217acd3ee267939f57f1cdd33b5a024fff499ef6623daf0577a4df89e9cadc2e5558bdeaeebe524a2549c2dc6b87b82315828bec72476aabdc91be5c75f79719aecd1456a967f2a4407ed9c963a369ed35acc9b3c2a58b93e7bab4edd3bb06bc37e5359ef2b146cd34286df6d635a00f3e08e74cfba135f50e6bb0fa04b688dc1ba0a7816337bdb57305e8f3c6c65480369afbbce60cb4d1c2ce5eafc0bcb1ee3d96ec985ee33d96ec48f9f41e4b76a83ce51df658b2a3fd863d529837d67b478db7f519f648853d72e68d755538995cbea68f392e5f33b4d15cbea03e15da7c3e551dda7ca14d03a6a7fc0135de5ee3edf2a50a6dacbb306fec1d72fdc7c924a1e6d3b45e0332d004aaf1e9354c405c346faca740cdccb5d9916ab73e6735aa466940d389adcf265ba3deda78e16827d3bcb15dc8f456e54754e19cf1132e81dff25be71827d9c9549fe68df59a70ac506fbd45e48e93497b49970d796c9b4f6d2f066f3233cfe60dfb9d3c362fd9750b7b74ae790fceadfb6c2e539837d339b0dba6439b0658cdbbc31d9ad663b2e6cda42a5e726a23eba59d2e655c89e380d692cb9a4ff794799d96cb2f655a9e1e0614b77b29d302e6a5f709ddf38e77258ffcd243140c45c4805494e4334466a6a94913479c38010d1e42595c00c51168c0449140991cc49830a24409255ed2a5544097a72e5f56c806a0450a35c202c563c232c31293ad681b849083324070f082905894fbe3c44a1310132e461c7957d004310b02ea65bce71e750ad2948d15c2b153e058824f7d5f53fa7de198d2d853e0e8f3b6e3c12108f8ddba943218f6a3e7d553ce2906c8c0498563e773b416f6d43beb9dd3e84e9960e5a4d11d27bb32f4d4ed1523cfe36fa652dee190f19d7b61076498603fd086dae83ef7c2b147cfba07f25041c677610764b0d0790bf6ad94389c750e6477f6b15c79e0c9e6a8e42a3fcf4b669ea3560556a76fd853909b4ec8c3d5d1cd75787f605204932a63968c78f21a59ef03858b8f1916249e1043e645a58919bebb8bf8ee66b53883ed40187de32ddbfdec3774b0143fd8b0448aa518ca2c7955f9e1db2911dfeeb26f04c0d0450c1133f8280ae2d5cd23bc945511b2e4f44c75065ba5b6d6ead46df59aca31ddb789a3869489105ab7c9734e6666a6944ecab32a68645584c8acc820b3f243568588a548d74b03edbc61af20e58f4dd05e5ce4b12be9de9e32e6a50c08a86fe7792903c2c9cb948d09dc568e4bbe7ffb0c29630261f4a34e9239dd957447ca474b5c9af5b3fbe9aca5a49fde9aacbb02f2e8d8d37369887616da61b92235f3944e1b78ec1d962b4aa1f2a4eda70199e34a92544a2a117047d64b770625289fb67b1d52fbddbe09e2758765ba4f2c322a42faca148127dff6ced83e19d0cec386cf2036f0a6a069aa9a949bf34bf998f352a747636d93527c15aea51ce0e38224134031c394254484796da08a50e3b7a971555813ae54f83ed5f3bb4e97fd03ad14b76f6cc10369b58c83bea53d5ea3d639e431dd6e9b97d2e1b3e198210da9e4415d0ba5473d4aa9cfe5ad08753b7e3a122747893b5ab777fad76a31ec8d561ed4bf95e8e3d368d5dcabe0dd5c32600b5ba28f2bc5ad73b2d084e4a083142064400c754a2c70e8945828e96435304a7bc7a96e30bac1d869d6d5e08e1f11189ef18ca1eca53ca31f5151f3a4a03ea2de991fd1ec23faf614d4e461a7590a6a4bd960ba51db3cecf4559eb5d834b4355b96ee87ee07c9a289dbce4645dd4de7f419d61a2e8b9172540325efa964732df658ef42f7c2d15a7b2f7b40e24caf89e1de98d35a394759e6a7f416b4a7d2670e3cf6165d5206e350313d3f7bdc93566dfb688b4cc32082a27e4e9e53aa986a11936c062d23994c08992c969a9247db417c5bf9f1a34b3499b06a51aed0f25dad0f9aac0c7d938ae9eb9cd55bcd936272e5cce89dfaec377efc641af2a3f8ec196d81f2a3cef316a24fbdbca2d5b9e2aee2d7c63a7db512a78694dbe7a455db28c8366563054ec3d5ccb0f5cc2d0d09d5b45ab55a2990a771960b43ed256d49199bb3b6a3693e5dd334a7313d8786d73042cd5da24e8f565d01395c76af4912a4d865df96c8e082096272d9550491aba7d1aaadc945e28547c1f36cf08cc21656e007017b4ac84b9b6240ff38021bb4eb9cb5ceda93e5ac73d21ef2dae709f32d93103effaa45ebd3cc4b3c2a48496c5e5251320396ecb5c1db6ac1b5f793689a4bd7c8493fdd9393bbc1e91b983c3fa39e68541539b21cb528b52639b2086951fe2895d84ed9b0afe18d1669d46871fa8b1c5a50a1e1524dd3341f37e7d1711e82ce5558cab96663c314baf0b9d0592dca6f3db9341c73a6d65c124f73ae5ae8d5e759e2488e7a212efb016c98b8512921aaa062c3140dd685f6d92011be23b4c50b1b2c8b39e713b65b3d91cc3553cc39e75435992ce56c56a9521ce0ce7852721bd5acb3e4c07e1b949372a356a8dca8959638b5ba24c14f9794722d4990f293373584af2b7953bda516b2a4291bb4d2a07002e1873f5963720aa362ca66b9141127c2d3ded9bc32055b8ab56a746e9df72131bf60050580b747ac26053333010106e6dee11c2ca99cdb0d61da12584c42bf0aa02bbda72b6c01d9c001c89bf609be9062bb045d48b1bd86db4990375c424b92d0ea16992b6b8ed02a9df126bf37bd6bf1dc79236570091ca7696e43ed054ef35a32dda3549660fb9a3281b3d6c666b7b0ef6cc13c02e09b760b6e5200ec9a571c204b9e355b28b5da5c2558632584152fa53748010680cfae49e6e749b5d0ba44d590d036155236cbcd69edbd2c96bb28a666e04478af3e6df6c9fd5ead35cc9d07e4c2bce956dfb4bb3079b8a989d5c4d2b426ad496baafc757e73be8041ca86895998d9aa4c0da53a54aaba68ee9c13871952c96a2639c28c7b828a025be060532670d46fee75ded7b4e57adf8b2e4c3b5ab411f3a542561926acbd9749502591aaf1335cd77196d5a20a206a529feabac849c1731d379561c2da7b59ac541011e80f152ba40d62545454940b720492c77a3b0b0c177917b00c30bcd064e4b27b2b720c20de58cbe1d831740a380d9fe132dfa92816cb5d145f08f96065c3c42ccc6ce5c4ea5371596c5beaaa5a7cac305dc30310c4a6a6267913c605961df90c083f7213083f32139eb5ddbdcd52e55093527d9eaa5371765369554555b35922a0660b39a6164b78b28d4063445448031eff2710302b527a011146b0e8e0d543a0c0044b36a0c0c8480daf761677873a5a9c35ca5ccf9951a9cba7b788617238573f7dd53b2d99905a90b9ede367bf539fa4da5ba7a73fffe3121af61c7ed447b97463d27064f15ce9c42323d03b497009fcd5a9d3b35aa4cc3c9c537ad3b5d698d122fd5a307ac782db5db9446a5392894e298017295e9e98e19e3335697d9a3133578d695b9a734e6d7392546bad9b678d30d26a98939b332382fcca881fbf6a514a9cc94d59a2529a20a11fd18f546c8ad24173a3f17a7e997d69921267de404ac94abc1cfdaa45e73316907d397a29fb4224655e60df4bd917a0e796322541db53cabc447919f3ab16e9a49cc469b75ec07c0f7981fd489ba6a85dae172eb245eae4d948b7efbd8d947d697a29fb6200cf93bd33e7d7dfa0b7f630fa5315c49cef49afbf39a7370e9edfce3e939bccaa87550faa2b5dd4aa87d68e4c3a392963731de99cebbcd61b51a44dbd9f608bc5e472f71c78a4730b1eb1611512a7532bf05f289e2ebc510389cb3dad5a0e0172b8a394c233a38787cb2b264d3b0ba549b5d64aa936e7a4940bc312a7d6125066e615505649d553301b849bad30b2cae14617c5656faf6db0104faee8cd7e4037bb39907d75a1d534d05aeb403d2feea9a52b3a2ea5799b267b67da6f03e58bdb56e8683737cd43b069cd1b55057179f3b1f2417565c583aa4a9d3eafa2d4b296ef1551dc2ba4a0a915676a6a451477648ee33827747aa91cd5a977b3d295132d95a37a68279d614e4e2a47906a3b1ba4735bbde33acb757c83dc5cb21265b5169b1dedc095371d087e7e52a4de7414c1775dd71d618dac1a726bac7d0702d917175a1a4c5ac31c9e6d628e8a1e48d6a507b22e51501e73ea6b7a02f34d575e3641b15faaa9c9af68af5ecab440318723bd393df4aa5ce4198e94ba0b49bb9b096f3af3475dd2ede84a6fd8f7f41eae0b2077c54b5997a52e4a5d6a085fcab040e91224c6533c735333c160b0202f666efd4cc08f2e18a3ce0cd57d2e6058bc1c63801fa599c93f98a8e6473efae9f2e7a7d3e996e9cb4fbfac2d5ba2f8e939425cf9e9019a37a8c42d7636350b15d10000047315002020140c0744028148240aa43ce70714000d79983e6452321308721c48611405311003300c45216000004601849421b2950038fe05e6e8cb381ca9a1f1c1d2aea169874ac78e06766ee157012a544ee6e76cafdee19dcd2cb5bb2489e01de046eda676626de1b4a1c87fec18899e1fb4db47c807601753dad1c69655cecb81f8858fc8d828b1a56a4cb401570571f2980d4a1eb570848cb5bbb01b2939c489ae49282269df35c929d21e678916e056508eacbec87a5ec8277240d08c6a2c7b2109048e6b7b402705ebf36e81d30e4a3e614d8c6fddd4b843d201239af0b54419000a8181d3d2ebb664d460e6b7e986ba979c11b723bf1f2715f2b14fde22bbd16891116ba620bc98b50d8b1887a199d94dccaf1fe5adcf4db2cabfa154723da77a1833acf2d0597b0d121034662e95bbcd29f2df11b3a4591e253011a74254626021461c31503d4c1cabc34d629451f8a8e754b7bded7ace30042847bf38c3aa6542993a375a20669a0ae56b4aaa704d8569ff9e31dbc178b204ffcabe94fab0ea9c6891f433119649ed729e8f8576529e90b56e1078764e5decd4c1583b3479c4d782ce81260b97db5c550c01ed3a9748b6837930d72aa167034564f113ef2eb7af65e2da889735022efb8d6e9a268f30c96956ad7ecf86b394f2f657ee62884d1b99e539e29d9ae980cc0be08fcc8a1bdf7651c6d9dfc4cef1800dc35ea5ed4445787a2569a64d0d4f9b7005c1c1a8a5424ac2f9d8eef112c25013b6eadf976d732d4995d24876372831a5f129aa50d3d7452df5c5fbfe787bab0802efb4ce0f539795ef96e0a0452eca213698e9ee239fa8d4e1972b69d1c8e52aabcfbfe7803985243f62d4e61c8b4322f446851e582bb03b0bb5dfda039c54d161c92c2bfb396ac9baf8e1e832e28ef5f41e6c332753e947c65c30609139766714582870695c0f709409a57a63329ee2da07b122c244b3a5aea52c7abf77078d4b085b751c888cb4cbd3e46f73164b492300a1bb9b6a49438a14acd144b1b2f5d52ed7dd95672569ce83944de2476f383a986969c00c9f65c37478898eb0ff89626ff225808f191e09a1c1b3c49dcffa4b60030941c614b1a33176e30cb929a63b57580a3e4338fdf57e94cbd280679ae61f390ea201726f8f4b8de8ed18eee680dd491e827a97dd023f5de9f45d85f2ec5b9777087458c8c4cde503e449b4f60ef1c721085fb8c0022142e64c623c36e6c93579e80529cd43b38a619ee19fcb39abb87a647a550003dd24a19d0a264e151018847d1c057b5bae5e826a603603596c609337aa8509a38fdfe8099a9c0c5a05c6288e5696e482331e40c264ba51e902bd1654ecc372a88bc041df312f5f8fcefc7a98eb6cf23fa2413bb5e4d436b11704b8df461c9cdf198d6f5d00dc45107f51e2f9743527bef42f5d2e288aa0bc7ddeb8c47dedc2918d202e608180e83accf7cb423c6f45069a63b6772c5ff75e674fb468235f3faec649674b4e9799fe180a03c2c09eac500089c13f7752c361aa9248de3b920652309b03fc3564b371148f8f2b15c579fc25b18d61762d93603f07329ac374135d84aabf438abd5f08757624d56ead083f4001fc15e50b326b233b5ce2e4c93df17e49c4ac72d1ba6648ec2ebfd45a8e6b6af042fb2cec4679de87a448415b7e6541e684a99a5727dd048a19e9233b9a9aba771c5d13729bb65db46d98b4659d4c0eb5b617db05c75c43fbc40b7a6568fe8f47c08a7f18800ec7cc95f060d8cc3a483ff6d01421865366e2cf1c234b4388d7fb0759b53fd5ea1cfad57ac8d5f4a01cb8d42d11831c805cb7076ca2e4110873d8b79122656870412f202f3c74ed7e6d226fd165a5ed0c763c3f58227dcce6101513dc457a2bf9b484f5e6517b890b191389acbdc4a36d4f98474db4c0bd3643258b0d09402927d82e353da1389f8fe9cf5dcddc0dad8319c51dfddeba71629b17b93f0e47b39225a40477274eed5a75a08f759565637a4b075d76208ca1a79234365004cae819ea048ec5c1d012c03afd88fd86468ceb03d3fba10ba4e3ebe2808f2efc9808028762a9e3922043c2b91b3a7dce4b10a8ef663b1cdc2603d0d8b739c9567f740e1c8b27d337dd9884c4a35cf6214da7b7597c1bd72a11431759f37b62249f425878697399777943e39cf990d205e9319b7b5d22a0b7ed6255a301b3375e49a17312d8dbc20e6afd3b878f4a64d417ff162aac328c0e66b2c3229aec6d7a9996c1c2aca2890c598b91409aa74f5e9d0d041d99650d76864c70b56dcbceae7309bda40dd26fce31492623f76563ca933e53fd22c779f476c51997120d02a60e70af336df63a386d84ca0fca4c1f534ee5ad6b2b2f74adbd3870f228ad8e41b5d78cc25bdf56bf5f14a17b75cc683412c247ab72c98348b8d776666cc50493b5b1b0152d398720519a094e670ac9783d33ef705f57903d2a4724b65adf9eef3e82232083045284a50a3d21728970737f078cbd6b62e9e5136297451b37d188676f219a4546865881f9c246bf30233caf8b3bce3971b554fe8aa47d1301c85968efb2155d3d1441188a59ce9fa8408c9954df9be831cd81a0e5935b049ad13fa009fa59ce19e86b626d057c3ac162a3ca5b86506cc2a1dfa9cd134cdc70c33763efa02de7f7b1dacfe6a319217dbd68fd6fb9e1745415b53e92dd22c1c74cdbaf0643db18b48f1541952974bf7005a9030b1ad5c559d93947cb8b957b7e673ca2dfe0a69f096a7f54098895e0c2fe7cbe3e703853e8bde79f9f0afbe27e19d411ca8b17385a5957a97251e0b9714c41ac044e173890c408542dd8eb5dced6d09483f6f73f819531314900728b3f3b1d551b626125b132f0027ed3146ce619918c7ad21ebcb153a70f449c8284cf7c9a8ce34cc6135394f1f4e444825a28901841cf6320e02a645f05f5b39533a22050b3858e40a444f2cf5b626c88e4e1022c357ab93137672f0bd885cecb16de152dc5679ccd28b2e47035fa79f5fb913fef73b88eca86d50cfaee3dffba13002d1aa475324b4889558929c9d81dd2739367e2dd79bf1de1334125b61e8776d3ea873b4e1ae09246ca66f10f52808b65e6b0fb7a0c4db39c80e6a284025a95b1674aba3eab87aff5c596da966b8b8b82c7f911c45d44d31c3b13440a8b4f6a8324f4802a4cb976f6d4fd88367f6b4aaf218de5e2c45466b218f7bf81383b26b675374e9eb9f5de37eb9aa2db0e61ec24a7e5aa248bd4e080da78247038d681b180a023d1d8089a139e8ed868e7b2577821ea8d58e481340ebb32e8b9c3b558d9dea3447eb35b604116e5af20878caf205182f27e2aeb4f69d0871ca6924cb2ca21a7e274c8bdbe7025b26990be3adf412d0946d5b0cd52cc13ea91007dcbdb5c549b89d41920a5c0ed9535ebe77f36ce7de1978a92254033ff2fb9fe52dfdb3eaea7cd3d54f431c95e6700cb2beb1898870ce186df65638234ec0244ca0f75bf35dd109fe48b090106eaa590c439a2a05d6d3732fb7fe0674c7428b1d92475fb0a278528270bfd1e5990226dbf805ce45682677cdc0e8755d800291bcc079c64a786c4d9fd757877dc14093b1315749bbd7f0e9a922de7f95ac7873c117b41b90bd91892874ae619e680ee7e3291b78d46d3664157d82e0d5783bd7cefa5170bc6d45009621118d3093cda16123b9ce130a52777bc908ca8251c5bb3f20e3253b47ea9992dd0c81defbc99f06f1c943057a3d798999979631ad7902cfbb648bfc4fde1822182b0254b245a1f9d9a13d11158db782186090497e9361010e50f53ee0a0749bb49ed5ff428676aad63790aa9c3f59f641ec49b10b7268631c7238ee4ee83ee6a15f65152ca4b9714624dfbe61e5491a7959a60cf8df305758e8b236e3db4cc44dc2669209bac08d35b27334e9e13b92aad2c9a0e5eb9a3e6c0dd6b4d9fbd1848aad873726d5cc14b6bd8008952f71eccbbe8f0426a7b0699a99c8b95d1383edb7d4e026cc572b4049e98c202b611a5973888b93428b009d4875c1de92525112ea8e8ab7393bc56e1e2c05c55999553655c3673636177c9b4d6cab21bb87bc1fe2a703b5d7d547f64d1e65226c2dd9a48734df57bbb28af88463fa1731623281851a86b456cb494987d26948aee59d4753bf1cd195c8acf8a3d913143ad9c1793820585cc62fa364752c06de35744498fa984f08cab833942bd2b4b693c1dc9080ce8f9a8c6b03541ac5f05dc7a865f54cf11d4ffcc200281956f28de1acb201c7e144a7932f696a44e6a285e97fc19459068a933f5e2b4f3242eb35204f111528742843c25097544504476397be11c333613530bf557af7dd02cbb831b7390e6f6632d301009dfdb19a922be8d55e0cade62bbcbfd900883b449c108a93ed2b7eabea0dd3f84990c687c6e7dd9de9ec71249fc77384c4b36340f24ea683f49a67c960e3b0e95a573be38877754d3fea000e493f78f06f4d54e85bbcb2d83c3670eeb9935e9f35101e636eea7a3400c93c1d4d1228528ae48c147f76e1249579d64c06bed3f793605836ce4768cb4ad3dd0b985aea70468fa4a6000e1ae9c634c324b9e92b806d863e7690242cbeb0fb56807443d3890955610ffe08d4c3e6429a3dba1ce11f688e39867fadc41b7ebaac034cf8039afada618db2d50a5e62f779e8190b4bf872f915f18ad053f241b8d185744fe1c9819db009e5c7cf73569775b51670c9c4dafff4d06ba10826748809a33e3186d3450add44382eb8e6d1e65f6970cddf3ab552970e71a31e9141297319bd691ceaada8ccf05b7a898a76ed50b01d4fdeb7dbabce0ab9e941e0454d5b53ea0c740ead77639cb94ca605c9412a5504b5d3d8c708afebba214d0fbc87a1e7518680efb3f00567af823d4d1b8bee5fe2c8e51a100918a30a7821e557432e0e0f8b9fe5a586882bd25941a9c139a53d2d1b47820754e07259d477a0466944bb5752e4c8959f54b21e36d936bf8122b522ca8574af8b5838161149cb55ad2ae0917f9648211b74fa463d407a6e8d7e9e6117aa48e2cae8ab09897153e2e36dc25efd91a350b9749988621e4fdda5ac8a07861ae6a909012e846e5d72a1245faad0a65c4b4326d5a9d11635791dcf8384a61cca31ba205e2b153a2224cae8897ea1b141aaa1b8df5b94ca1749bcb29b76c23b314c2b2f83de71b5b2769abcaf923b7762e876d92a407f662229bae9027fb2b790a274de98010802ee751f527014b2c78e215821332d86b12f774396b3b1a2786d48521d0b78464282bb9458bac15fa59c2d5424f94b0ffb3d9767b6331a43495506929773d784eae7cb517217d04644f38e28ebe506f3ed73f3d4d81ec5dd9810a6dd052ed0fb75c346c81a15d8892a5c13dc9a9238f7900c318ed760fcbc387c47fcb3c387cafa071af5207757696cf4d87d562bbd1d95983208011d412ca5e7a72d374fcfd911d212f597d3dc38d1d774aec586647987b19847d739150c0b4c033079741b3390ce63bbdee0d905aa4e4ddf08e84927b6e39bbe307d34bd6b0aaa6146406f3e08ec9837c04ce33f7257c06c571ee6cd47e2aac55c71bc71b38e87e26c1fa4b9a19e749834c4f8913cf6b3f134986f518270309f5cab18de87c44b2e0261c52eea33c9994e4ea79c85581ab8a25bfcc8475ac9c63277fc2b8f0d80a2da5b812a7ae1131eeae2934934394cd866e051d773a77fa9ddffd05ecd91799fd723961de84e55122401f70d96c8bf86523f833aeaf3de895117b9ebc089ee3014ed392dece7b3d0e1db28031e5b36288297286df7b7fc6718646f469de028e55792887c48ae889b56c953407e71947d48983f44339cc194fdbfd4e6bbe8b9d3bdec2834f43a8f531d78f1587c1b4904ba8643732157187397d69c04405110741ca9e80130be117dfae446fd57e1a68e25c39dc429c08cbda7cb84cef12a6b4a5b6e9e33d563365f165cd4ae252d2e172047c077163ec62c69ee789a436b9e5033ce3cddf73e66cb1d5189e988ab3d02a2840b5d14b437f4372af35445238e21e3ae7962b2b2d6b53880e6bec83e229fe30031f91c2224a9584c46c6c506ffa7020d7269d179140bc446447ee6e15342568e9f6f8a32d13a1011dc6cd7caed06941cee33be2d41abf10f44b0b8a662f405dc40a9ce25ffab01a02535c675138113e7e4c4321d0b0d1cbaa8008f326279a0d7298f2ff2357145a7c31e487b9aa1852ec25848c550aaa53c640a98b2f567af67e431c6798b0eaf541d317613aa03f5f3a7429caa4bdf9d3c58de704e0dc739022571bcd803550b71750c0ab657c40e2941d549ea514835d80044128bd64197cb9777128d1e097ae7324309dad75500cc36cb883519ca2f07bdb2428a2d128417aa819fd52a55a041a12fc9b8dd1441a1142d410765850cdae402af6de06d63effe6f538ce1abc1bd7159400cc3b3f2528b3757bbc2d58818a7f93188b55555c4df12c5508b79f3ac46ec6297ed656d02e0414ec50dec32b05bbc11dd46d7fb55271b277756fe0d5fdab9893c01a24f9ecc01d9a1c35f77440cee4a848d3d0f62cd1ea7882c26fb846229765c95194da59b10bd276ce5e8eea86ee6eca4efca8a517175ace414ae131daf66617215db9cbc295be08ed59088c2adadbd4171b839203f0c98f535a0edb127aba859cea444fb2f44a4aef9bb3517cf76cd20eb32fa1da56b7209c518acdef571d1ab84e5e84b392488f9e026d451f4e03d970876d102190506a83610bb1c405daf0a059a8aec50d78520c21faa8e3093b82c88ae267b607b6cad9ddfc8366b1f4341bf0005d01e5c710e0dada00bfa62831b595b4d0c507b97b1769aefe5d98babb8e2619acd97ae581bf1cd7b4d971a2e93b9b98d182a5cf72dba49b275db57fee8db2adc48f42af888e2acdf3d40779b94c8b94ad2e0e5aba25e1a2ba9082d28556399521984ebf2d69481647bd16f1677bb6d525264a84259b3a73c214b7b1991aae123a97d03cfccd1e1abf01bb98d28f565a1ad0269ccc8ea7c3c71086da37841013c5cfbb741c6717a8c92c4ada2e12071ee888e46eaf8a1f27787cdb0d848271587b66b087350f3cc6e0ab5aa68dc8d44d9e007a772b9f3002bcb29807306541cb4dd37d27f38401bf59bceea9dacc8c80b0436fbb722d6f5b7adefcf602059c9fd055a563a113d6c137f349e2a52a46ee45e06e98388851385afb6100033a4173a857a9f498cd71a2a5f907b48fe9021668065241341a9eb314afbf8441740a19ce9d17cd622d06ed4ab88130b0c7d367ad49f562c59b785f4e160aa61c8edea097ee952674b633e0ec25cf80a4feee2721ec4d662053701ea6418207bc3c0bc1a262f1d04c068bd9708ab1155214e517f815f779c7d748c649be42652ccf299eed34acb3a427ee3418076c4ec51ac6392545777f52eb4bf0d5acf44c9807b7f665cf02c1a208a87e9f597ea7b709309b43529cea4750fc41bf039e9e20256e747c58d54a9999da9138936fb87dce3e5308132464c3a2a83197f6b85e54937ec785feb00db77362cdb406d6ebe893c58220ef5de78f0d58e5a2fab30a5b10c22c85880ff7a180682ba313d6569f85cf7b9b236be9537baea024bb61e032f2e23a18d1f635f8554f87eae1fe5914a733f707c218169567a490c97b871ed8639c7fdb240aded3927ca1ae6ae980d15412454e51b3a4ac5bd232dc46eaf409a5d5fd4d2040d493c1dc8a4491056da9c052b4f890cca8cd1919b15209c79cf898d173db6b0bc27b1eb3767b4d43fa83d3a2c9b876e8981d409bb8444376bdbcf7513691d48e2b569d4400f3b351186f2c9dcef7706c1a8386248c4beebb8f034ebb826a05781590003e08614cde551850016ee47f5c0599276bb722c2d86ff43b650c5cc0c409e29bb1b25389671f7744639eb727924d423da9cf81155fb5c9f3c9ef5de8c72d89ac9a12a7857fd2fd86f1d44add5c70bd885f5ee869a7c22e8385d3fe30c051881ff2d824a055b0b790453e0d52c2bfcdbe55a7fb9ebf9820b15c5c55a81ead5f048c096843f7e804b44379f7a05a4a6d9ea9f0ced8d2149d811c4f3e886aad58d4988a1abe37a045a7c231f82c58e92cebbf3f0ef14991ff69757f26a1f5c675cf39c07abb54ba5aef64ccf1b053e18ec1d429ef39345781107af56673a7b9add4e05348ee34772a26adf4e1bb30bc8014bcf630d74596dd7e27d11b6ad0b2d35f0bf0a9f6240c707703d91fe781072369d5e05e4ac5b5034236bc00bc6c5f2f96b596bac91cc59c2d704bf3c2cc1d860b3159be3f5fb557693314f36731ab2cff94854801bf42f12f91a28c90dff1ebb18a4a570c8d2b37a10b74dfca6bb3a82d6b072ddcb27671e5cd9592c2957ef36a63e95389f4c2901db337b42c8034582f2f00995fa1715aa5d481ee4a94256f41acd7d83cb96a03b8875be6fba580c8f63738728bdcd9e3f4241fc2c6a260b0cc826197acd734c86f98282690d17a165c9550486c1a5472fc8e5f7e4e9c5e13f3da5e309a3a27400ffc9c2626539117d41db4cfd9e728c22601b7e3265df4dc81c3a0f60fc5e3593fa59a90da03255ba29d6667707fc8cdc0937a1a91e02236286d2ea6839a8f7ea3ce455f5aba8653a7a9f8c873babd439b0e1078dabdd6a7441c8a06e938d69a158130bdb825a2e8d91a35e5945c3c1e062735291c73ab9177cbd4efdde26b6095007a42e62b99075237f77e2d0c09345bfef8f5f5c711a84b0323c14c89142769b1ec32d3299c4e66938a648209f26ca31a5797a236139d5cc08a4eaa16e626e73752848e4e78b39da89097891688499c0cecd51a4db50e0d1f764acae6035087b31f163912826a98a9a90e2b5f920f178518167763642661cb32279e4cf430c4f23a8be68e8c9e6e5827efdb923a7f82d5070325d89a3bb238da951b5796dfebdf89a600cc8cdc7655eceb6181ee8885f8e4e88dfc68e1f12693985b7fb83a4b9a45695eb317fc42c7a85a1c5208db42d4e36aa1741bf8e826bb69bf4f362d2628ed2f270ce0214f27a6d0bb2c369ea682e455f824853c332c09cbd31121244f06b3959e93c9e1b2a2f181e1da6d4f00257499b5af1e37edd42254abccd60227decced49d53ea03ee70cf13fb1c04f2cafd86e6e731569bef3d45f7cf2d685ed8682cabc4eed07d0d961e0b0b84c3950b53a49536e41430d7463efa9bc06753534e538acc8872a9d38778e735ca3f3c81f61581b1007c24d4cc4e5ba4a87a9b69723dc6bed695ddb4c10b32519418a2887b031af9083162ab06ac931b9582355c655351cb1a4e9612932969f79e49032cc711457b6d9c16022380a63e18f5b5df02cc814eb1571aba40086f958bee11475bfa693252d5b0a99ca9d1784f5305d0771906e2e7a808d762e35c497c7c86659f3c43786e1111c6de1a499db282448907dd450695d5f36cfe79914df124995581a5848f655b5541d980d045fe3c8ca2e48869a4ff30c722601f954a347c69abcf299205a91097043851df97bdd62fff9af6940991769e71d41a1177af6853fab526e1046553c30d3910430267d186b4a4ed4e57d8173ac83d5734cd19339e917cefdc39e299ba1bdfa0e1f2b603a2ce38bc67a6c396e61904a39ad2bf52fdbc0320e5510024821d39fcad757c62beda785b6f53da4f720304f2a3aedf0390c315148c87b1cce38e39d4671a3d9637b464995db36dd5b0a92b7bc61144b873248507050b9a5c8a720e2f80c08cb397cdf911d9d2f6753f6efa1ec3fe1ae5d2afc98ad603e53d8d2aea77bd416199dafee7c161d1144f56e256f3c5a27d7307dfb338ed39331e6684a6c9d7029354005d1cab6f2b63b5a27eac054ec458f2836c5216b0131e23cd1d99052c72903c85676da053cabc29d98f7d2a4fda218ce5e726584fc30af6e4159283d4196e72445fa27f7623b765331e712b217cbe6b14eb304a87820725ad8f59417632860de8c23315ba204f88bbe82fa585bb4c891ed4c9e8102fc52183d9c26439f52b499e0998643cf05e3c72aa6df8876524f51ef7a170e895902c19008eaf43dc7f921272250f1c38f0aa3fbc1e11550c6164afb78ee2b90064410dd0ed03538eb02974d0f802033bb232c414c66473c5726026aa3ce282c2afbcffd519033e11b7bc25035160461d1a48c9c5e905e70e9ec3e8009f9790b219366453350ecac9460210e3c1aff235e23db8ec3c924a5a045107cd27f03ce66867e866f9e4818c79a334e389e18b0788488883e2f4fc739871eb339f204003caab92457f544e171193bbadb7021119f04275713535ba52f595b071cae6303d05c0ff5cb8d89564acb2b9b7866bd52286e163091882288cfe2cc4feab1b7bb2808e9cc38181f8948357d05f72c8915b00c690191721f74efd556bdbaaf777da6378a86d52b44432f98cad281d9ebe6cf487a25fe6f4fef825e297cb5059f8fc0e54a38b1865700a52081be4660ad4c74c2f15e6dbcc4b20b859d6360710190f3fa1054a9315a641b99352895b84d1f7d3f2be6e399e3598ba445681f0af66a9ba994e635358ecb3612786c794368208c369682e2c295bd1c1c9bf36aeb4de08982f17bea55237bc802d47e9668569e116db601cbda1db6a34704e251d63b4735b13694d35f86c1be0dd54489e1401faae2afcfb144ef63fe21e95d885d347a1dd1ac53163bb04b2eb0a10f3ac53fba52146d02df551c2d81df5d1cad02efa618cd02eeae08cd02ef545c9a82dcc58a6a1a0bf60b522e5765bc77da1104dcb9389a04ddbd28ed04bdb308da04bea3281a82bfb3385a05de4d319a05dc5d165568f87d3b9b9988c3232684ed0b72512dc2ddb768632033d1f163033d32f847077ae4c0c719f0f8418f1aecf1031f65835f8f18f890bb7298b3342d699212cbab7106e4fa28fe2f7e4ba3c42084e1bb651ad62dce76f1dd47ef47640b4a68f60315777976ea0f859857c8c73731b53478fed0b3b4a3a2da02f838d8bb0c63f740cea3584d7006015985fcf43ba694013fdfdf4c60bbc11960726852564919f1fbd92137caca2b9bc1568297dd78eda8376d8039c9c523ec49a972602616830eb5d20a5747cd0f33101e76c3d4245fb1cdda2a286317a541c30c51bdfc1b391dfddfd47b3ac18b3d87a8c3fa822d632ecf6aa46aa684094ebd748511d0c422e84fc09d33da8b334690e9ec06a89bd7e955592b05c7bee871f5cbfd2f63e9acc91c559a9b1a5953684cd545db3588c2fca5e804912ebb6f8555700a74c9eaecd9789e823b071baf27ab1a05a9be32dc14ab6d3bc2a5d1cc6645ba0c54cf511d0a75e4d6b0d80d6dfca838b8caa0b91c6dfa86f834bf8f0ae9a82f603b9274dca3327afe9c79c1df37563908b101b042fa66f2730653c94e261c2be9163b8ab7f110d0a4278dce19d7d6c18c9d0e4a4dede42c41b12bda85c1e38c1c8c6820ef0dd2135f005d325cc10adee96569c4a163d6eabe49ce58d2b25886cbc23cf23d2b7a318e705946552cd9bad439abe2e4e23900f89d1d89c238cb8738708c0e4dae0a363d1a476ad9a40a15e68a0cd7b90883aeb73f352732b15df3e3944ff077db537a6f70ed8a6d4fd5d51975551242fa2b427d34215f894dc2063148ccdc50bef8d109a2109d4652f91c333b1b4c40637e4a132acb89515219b64a945bbff828bfaf2a35d7e1428c30483e4c86a920a094cb694217a93e1fba9c6214d0211720fa19433a3d04806d09cb373c9b1d0273b84bda66c60679ecd36de928cba0607fabb0bdb04415d9471526f27090a799e176d45df6326305f0c21ad5816ed0ee81eea5f9828d2c4407b5a87b26804925a0c6a7af4f3062ea32d5aa274fef7bf22528f149cb537d069c67ac062d7145c4b45114b608defa7a3465b069e128d2544e3729ce086798c7e9259aee34e42e4ebc4d50a7e7896384430ec7b238ba59224c428178a1128b566708d6ad3cc3ddfeba1e7398a17c64e02057d430106789657c7806209a0ec5b2df2c3c9a1f12c852f3a6290b9ce8eb33640b33b57b9f6a366e34aad30a726e288582d3775a7fb22627ea689993f9fb6d3227ceb03c9cbb1d68e5eaa2db30e3845c39a0b178f489e9679c39ccc6788a3b9f173196a0ce5d9bafe030e2cb050fcfb62efa64b1b7dba467cd039827998b99ac00d3cb1d324773462e59f6fd455751b29038468aacc10aa5630a3ab574d70f739259767e67653328f72f440d06113984aeafe6b43963c653ef32999982e4117cd343b02c0a4b0b9cb7484119a9301a43cb1851fa8c37b4bbe1affedc49ac61794d2197fc06d2ec3f9006e10d29a8adaad244765312813e41e61e86003efd7d59553f85e2c00f3669c17352c2e33bf21f2df2e406352f103d963a4cd1b0e0c39cedfbd810225cab28edd85570e630a3c844cfdbfc750ad5ff448bb374f7a5350b3c5f84cd82fe319f8b6b3216714a0e46be6a97b26b1e73f636c0aa5f744cae5a2a62fdd0dc721382a611367b9b8c59f76b54c33f2f40164eeb710dffe35333c611201408c6ff2319fad0fc6418435bc7342e8873d2ec1f89c7b45b66aa34f0cabf41241ce1d70ff2367e41b4617ba79a4c101a4382134ad563201069e90e1dfb289e478e5b03a85767887b1c6adf5cccff4932fbe5993ccc1899edaf140858c5d02c9d7862ba5528c16db180674d8ade2fb7dd9f9053164f793f525d4ac8b4b51226f7a7a510d12aa9654b2dc57240d855f56827d94e7957d2602a1a85e07745b566a58f805aa565965e01fd45614827c22c3dc1ea59f09147d6104233614767dd135df2299281d5d2836f10fef82fee34c1a181202b3bea3ed737e65eb96661dc2e4501e9490f9af121a9b782eaf8b13610ef6c74c7637541447679c17f5deb72b491a37465229d24d9459cdbbba0a4198d12384b545af5460d88ce3da7a5a713e03027a5d511c48845c8c94357f79c92188c96f3c7b032a609cb270a74aabc92603c71ad69a1a99fd64f62908f7befd90fc9bf319279e4098ecd3be92f6ef9100a96b22c86ff3e5d0b8c059f1de4bb784ae7a6eee9cbd6d1d151a88ae920b109862e72dcd47764eb2cc0cc3df880fc7ad53a22b172c101f68777b20de2f4217cbc302dfb2eb2f71a9a3b208c91a31f888fce3539acd52183a5be7216cb01de161028463505ead42ce343a0c077670cee616bb448894b18835c7e8c50f79ef173a8c9c244afb2291c74194807f0b8509bc4c54ed15a141ed0dfc5d406cc33232125284d7ccc9fe22dcad6841b5bf403dc16063454692448a07b63b486be82a56af7ae4a81bef555488acc9d5b489dc4fafeb54d260bc29a8f445a7be929b28e494ea519a4587bcd4af845f34d05e37a75edda4a7662a56db1d90b442bca4b5d9f918d2ba5d8353548aaa0648c3e1541a9e4ff8d0c6a40ac1d19ced9c6ddf60586197251f03b421670b8541dd0e5f4a08b703f725d9cb081a60579965b6358b384b14ba8cda2f35ec7a486d7efec2303c6c10fc32cfd3d803c014e30dba22c6fa7af17ff267439dc608e0de8f94d21d8670448b26a1877a74b44ee15a3ee68ddddffbc4313df538a0e3519400a478e057424493160da5e0fe0ec3198752b68f424242325f022fadbc0c7d432c6544464d9ef61c2e143d6e851f1c4bc5242cf2f0dee127d2ddc8bc8df11ac3493ad982fe4b6886a873afdf608544146249d70c78945d2a3250d23dcd93a38b44fbfce39cfbe2bd87820a47835cc06c9a509dcb6d7a84bd3985a0882d42d26e55e05158a5bfa233daa63a9acfa83fc48880608accc42e9f98350a6025be283c92fcc3a2fd2008207e6ffc519edec706b73afe569168c3ca6ca8237bb48cd78adeec36f7bdda5703d762975665a891e2720feb5761c24219ac4687fed3a7303159cf79de5b82cc57509946b4ca435e0762e94bd9180c9662bb448f4375d35905ae8adc3a4e453e8d59dc112c1415ff9c98d04aeaedb9d91c5c1e9052bca251819b5307634f5dc2d56476fd94acc297285d1d3c80eddceafa550957d42d7b7470c9e6a9832d25717b83d987dac2674254333b69a2d7866fbcd4f23aa389e74bc83c696a3df5e08f2c953c52780c5f9a29b9764147b24b9df77544edede3bcba0decdc8529b22d4c064920cf284e13d5da114c40c7c10a8b9d8f238947d5f8c661e3f038ef4a179f6229b6003c6890dd42e40730860c95c5f37a049da1ba883ffe86875068cfe49a121d31e6b004a9744652ca0492af98d02fb535cab04dac5b305d31de053c8f6b32f83671b7af1004cd2b5543fc60bbba54fec1791c37889df267f207e28c286e8455b9cce6cd4b3177d22521e57bae83afe0bc007bfad9064179404dcf6226a02d4d1582c369f28018f877e744753efdbba5e0cab88f38b4d0e61fd2001e4995c3b184f564df896c380234d4dc88c3a70647b795c9dedfe93d236886cb1898d8f4a6835b6380b2afd5f9860b7a7bfeaf2632969450919c2121a58412be1fc397210f9eb8b3ebd8e5fea1284e1e9f5d7d556451a14456efd855e0dc4b530cc1b40d65f13c06a120aa60691887c0bb6ba072c79d86b9f2d002a77ad803e72a5e8df4a383bcb6cf0333d909e1a953472012ea9f3fbaeb302af7bf070976b9fa991d56a8a04a35901457a4c465582c2084f5d5ed2e43ff13a3987d9fcbafd8b78d58628243285e9dfdc55af3dbbefb4e810ec1da071f2164abccbccedc615793adfe8676776b1dbf6b5273b78b9fc3b066ebfb4b9a92ff75dda4a549d158f4a0b90cab7d56b4298fb90ca08b1f929343ee8cfcfca656156e6495544d89b19be8ac21221d5ed69b328919214986128c3a217a0c0d519beeea56289541e788acad77ebbc352234997bfb3e1676c2215c193c1f8312dd84a57695bd9cd360082fc6bf30ca9e418644b659a2bc249e0422a7f5e85103a32dc05a988aca627c2e543ec3339752690aa57a8e87d292b15295452eb596deb7639fea8de34faabc3333b2a523ec7e3a105b98b750e6f1e76dde04feed8dd0bda58c4e652a58a28ed8db00afdae0cd9844713d096ab2f3fb6a60ce65887ada572d6234509e7255235ddb1805da47316a3457662c1fc831f5a0ed55e16d5310ff50869089cc1108682181e6a2048c3800907fd6a1f297c5af939c50f153e507e8c412794acf829c5cf153e50fe40e9310e6d6774b05708c3a00d8032089b183feb1d7aa01768b3900900f5614f10cd31a6c6c79da1db92e3c8aa8050c0e4b4b4aef7e3f8a30c5b6a0bde7bb069384f7e3503edaf7f9a6b986635af391a69c98eeddaaebaf6abafeeeae3cdbbd2bd2eefae835149944e39c551643fde95ae75cc99bbb2eba1c12972f688827f36fb050e387b6988eaa9afab7408f0b2b4b8fe08f6aa17bb691c30a6ce393b6b72f6d4793931cefd7fc50921d6c5c9025b09f0609e9e6ff22c98d87382ff4f0487e4066389ad6478304fcf6713eb1cf2c793b0897892a6f0c09a3a2fcecc39ec5f0a3192c4d0a6e4c0ac73d639e4df2261910995d3499e8185fd0b20ac12855de415189c7ee5f28203a7e674a757ead45e6b5bdc82bae321191e51076ae24fa6e4a4f20eef0832e9882b72e4958a112414e98358d301421a14a4cd93df56088bee861f136149c3d224e2940dba9784bfaf29720ba097ae5241d651fa49cd3eb9acbc40fae28fca3addd2e25f6b157c364a22cd5fb05c109e83c451da6fd3faa7330e7e9ff1689d77cbb8e7f50f9ac6679cc7975994a35d8f66260ae90dd6e8c4ce0e989311ed0e16d94ea0eb46c788efd05b852fa361e54ec3113af3b543bcae39f10d84fd9fec09812c57d2dc6ac8e7d53f9e44787763d9bf5ac3099338453a5f277f9b00a931e8608d72c8081c2b748cc6ef0359c0b284fcd5307a6d2f3e815a15cd0821b2edf2591f0f673699e0d0331307f4f454dbaf0a536c08a15f40a1139f1cdbcf76941afc0fd29ba5934b1d80bea69bcc40f26c5fb11c1d1333f3593f04992783d9d197c9a7154c7d0e0ed473bf08d06a0aba4ad72d98dcb0da66eb770774318ce3b910451c57b0535cacf009c4d5d026ec1b0bcf5451684ffac86b3927a1d460ec8d5ddf3699ad6eb5e265d2e71320ac086077aa45374b909fcbab257dc5c2355576bc400321ad3a01abd596324a10def72d9668f93099fb816e8cc071a96dd4791af7ecf6e9b3f98325dfc0c0af8411f000754f9f19b44732505ccf6854f63f7b0967f8c3c1deb0980756fe092e68ea5c03ad1aa8bee07fee349c54e285254a71076e52ed6b693a18891621e978ffdc42f8629bc5cec0728139b1da51fcf8e899e8b385a58335eb10463d85e76872dbccbd5b79653a98834dc1546cb5e733a1dff0872d1d2403c500fc2d162d02040c056093c265850fc9989e958c4a66f34716cccd249c02712ebb10767c81bb762c2ede570df8ea0bb0341c1a29a6055e60510c0b88cd366fe4be6917d5a460d3a8715d96ec11ba669c32124db48a22120ea6761241a2233a551520366b98b80686cec0f21a65392230e28a1c03e17c6d94935338237e13d108449b48f12023ef6585ce1b60569990ca3a62aaadd3d536f746728af01303d7a9f72cf1def2d92b37f488f64638a88cc2b7993331fd65035ab353e64753f28538752955dc6b078073998fcb115d4d64b1793bc78a71ecad75b1a31e937aeb35c444bf45179be704b9e2d4c2e4a16b66805fda4d74415af2419c0afd9a0158482c086615edcbc5642e6ab0b282615bbc1725573faec371abf9233cdefea9b4c526c2e41c928f21da6e7a825943e6a6050eaac690706bdba52e2cd6dca4802c3a198f56bafa37e8365a9126f252aae821097b6d4d2b40874db5b305f9685826fa69b0f30391ceee460b32e8cf21eda38ff467ea00658ed4adcb6dd66da332f033ca623d86478a740bd32b46f708a52b8752334171323f1ad11fe090dcab57cb058b43bb07f43fea1bdbceabdbed70e1f3cd8776620b0831f735824ca2320b392062f87f43885fbdd3ee17ceb49e3d071c03812958a647d205ba0e29f23f370bb46b129d655c8dd82b1cc8af02a0f70a1b26f1e6900e59a8ab2c43a69c5b8d318608d95663703ba42985e5814633f924fdc9c1640648ef7b2b68800055388146659e21d50b3ceabe83769a7fbcefcf0db811b166869a1fb34f87448b575cd246fdeae755a59e423bf450cc499f3ba8e36180020fef7af855f8b6648ea1a6316a60ee3f7a4f3a51b6fd4e5b59520b8e8c7c1922d186c437fe281e95e12f6e26d3e9144de874c58e12a739e2010e9c0ccc1195f07d0a00101a71b9bb89eb9402a91e387cbe4f0885389680b67c6a49e22f04c5920c8bc281524c90c2128f1963cc5a5c97c075d4f805353af6eb90595831392e88eb6b87c668a8aeaf45925b2b67047828d818382953fc5bf0eed9d13960fa8ac037c91e0ca90ef3555250460acfca12717ea63f1aaeb87bc49effd029045bc0b9e349075abb1a5a246bc4c5fca0f0d326d5ea14106cadc19d0453e49e4d2a0e65a94a34f461a4255bc5d966dabe3ffc237181249e80b67a4a7e0862c821676525a83f10595e9169897fcfb25735bde7d69cd3ffdc3acb2b837cfd57abf46773039db299e5400fa808e4ca4ebd8e93aaeb20ad4591ffedb1c916c48209a422faa6a12a0f50b97ed4abb44fbda032a25189bbb041d452488fca3da7385cddd82d7d98865ed14ae6dcc8982e4990a9076d3babe9fe7c462b252e6b237700454d7d2320d15579d77f2de1ce126f5ebc24659148ab3af351374c09d17ace7ad9f7dde01f55c8d22e45594733b0c318f958bb26fc594f4e96d09194541c15b0d0a124a72336d776d9d8d62793a5d33c64f8f87d38af5fc832735518b8c42608abe4bc3e923c728e113193dbdd92bef8f3be957f9ae95b28ef2aae829909f5a2cd467b95f4b704c18868753819bcc4ac38fb3944c0a942cd9d04d29d10df115765be31819bc88912898449adc8a599955f23b045350f8a3a6e30125424b2d6becaa748eb84c83171147860b27cdf94569dd5af9066a1907cefb710de33b2da48c8f30b7790693d675ec4a89499570965ed988c6a4441c04fb0a284092bc1c56368b51a48fb8ae5ee64d9b1da0c49100e285bebfc58c9b43d5e77c3692c804a6ac5ca34ca222078268b05a61ab8e9339682a0e44e9a6f21ea55eb6e066bbbe410c4f602c0e3911b8fd3bd4b4e79a8e38ce67a11ee8b4a8ee68dd73037272c2b97952c0960473b9de214ffd831afdf7e1ce94a556593468f0b15b3ce3fbcd8a0ba92dd5d967930da51d1f1b0b26d82aa0dc2815510d56d8975dc969b28525b76545b56d5ba9ea601e980a4073ab485160895afe985033d7cf0cdd6c8023a9693854fb54cd098f7562da02aea7064d5b7eb32cbe29bd3d1ef0834753d58eb2c7c27f62f4c57c13c20ebeac7bd45530d5daf11b1b410b042339505c135b675bf836863de9b6c8f8b9c5a5afa4db0dbfb1164fa3990f1333aa8db2e12654af2b88e25fc7f91b181153252d89e746263ff8ce13a8f23c35c6c0e10a14e6c2057969aeb361655141349988f4ec379d7c9e231404df1dd6b105ccfbbab39ce9490a46b9618561dbe60729353177bee42322eebd0acb5dfe9b214e83691f982de4a5e4edc6ccc3c89d3368ec45dd171e1771065b3fb300ebcad5cab8de222a33c164e780af47a226094ef19885c17a244e8cd9f88dedc023de03b39ccf2c77cc20af082c9990e0c8f0fc964bf4398593fefd2a4eea148faaeeca5ee54ad79e265a0114f935b12a30e52f7df586afee12888b49f297a4a2b90ab87db9c5cbe7001ae6da5435089ea4cbe96691382f15a4da45e290302f4f3ed8fbc377d0f43a105381c884463ea82584b0fbeee471a76d8ecfb67085c493b77e17d427d4d719361f40fc95aeb49b44ff623b40002b3da25d066d789b11d448c02f6c90e189e05881f4a1809b7f126aba0dabf3aecacad64e65fe8c861ef8b7be4a8107b17bf49aafeec80a607aefeaa27777febff9d5cd95c488633458661e7726d944c0bc22f757f06351ad16b018742bd1632d9a8808643b78efcd02f44035194d4e39969d33394d4dc1a518b060524948eee7804842d72c8728f6d40fa31d2321f5d59cd8af97f26005851337de620b720d50944035aa4a928e44bc29941b675fcb72db15bd8468aa76946efa8fe5e86696e3453ec69459470786dc918cfa8c99a0eec76c8a6db3fe3699ff45b036c75d42220a1645bc9bb7cef3a88b32dd4b7ab842194d4707483dd7150f07f22cf45f7ea6e58aea5988a21681d5440394269219f4d9c337ca667924672c54e173d6274663da6eb1bb5830c423ff0cc10a0b1f1d38e32f0c080f02fafd510ce2c5da529a7dca6a0d7c9ec860741c47e6721216121d5fdae2dcd58fb51e048345d9dbc8188a3192a5bc4d54c4c99847488ac7ce8fd6b5792730bbc22ae13a8537c916b4298fef04dd68514367e4ddaa8bb8575e686993de5236afbfb7b9dc8395d38d5e5be06cec429f7ce324ba909ac6f73634735a33f2bb0a86f23e651fdc0358608f520056ad6896cd8c03caa8fa49af8b92f153284cc1339f0fe187fcbcb559a85a33cecd6df72e5584b5da6c1e4038ae4e20a516286c93a6c622a6d9def2b35806e513fda3a6e2d078275451d60c7a77deb2fa1a404437091e38f6d6f99f8818e680ba5abbb55200f84fb1881df4160b93af1a94086880077f666bc861af79995f90b9891e12edb406fdc78175f27757999bda1d292481abb5bc81a4feb33da327af06395ecef805255cb1a50cb6b5a56caca019a1de90f572c895c40fff6d6ea53fe426c52ce04cb65a7477f1177c314b97c02b412d516fb93eab0113cd56e24cc5591298e29a6d2859cb2eda51e8d62712a35ec1087301fa505c8683c3161911ecdf98a9c5ef39ed42f0fbb7b6210612df635d42559caf2e40ab46d24864369863309dd18a382a087edf57235de3343ba6cff47a3246716f42b29843ac5abec7b42635ba27baa0f4b54c25ec0081710f5fe13e4089d7182e94be4829565ce741453f8a4789495ede9b9e9bbdbec543f84cc8974b8f26ead06202bddfecb9a8ba6c6829b3d9230b921b5dc566c9f3f2e2632518964d808b820db13f6ea8add1c233c35c163324c38ab44d924573182b7c7c89414d6004bf614f86c390e102a7e1503d56543a02787c300e39cdd77c03301cbdbf78831a60dd30793be96beabb12e3ccd0367a433580b98f9422190b965b6b755576626480101bb59d068240f0c59a036a0a72ef3263d67cd70471fd826def9ff4dad092ceaa578011685297f1854f63ea8cb56a1dc258ba84a283810d142eeec99d1926817a928a986181c18621a6faa71b030a7566a63e799f52a7797a301a8742c49611dab7e0de9aaa1ff957248bdd3007e646ae06d8aa8790c2b43fbb3fc711ccf539314416cd6dfffb0df0e001fe8db0a195964a9c4fe3352bcad4380594514c4e4a73e8d6e616953d8e2a68f6c37527c79f3455098f1e455578fe1112a48227dc73e9c94e70ba09e6ad6d5bf8ad2c957ba552de9cedf960e15a0c0156dae44ba6df6744a9c659aa4bf4973d8a3b4f88b24a552ecead17a86c9185a06e392cc3d6e761a5b25360aa98935396786b627d15f2348f0643e28522b8000debf29c4960258f6a1e7a37be38ca12c9087d5d8009be30c03e8c4575aff8c557ec6d3fc73090ad84b5650c69113c3027a7b237a1485dcd17088f5a5c20ccd24a471900d411928d0838d013d1d9a79362cad16f0d72be3ec19bf0517fd55f21a7d66b18d6d0c479fa7968ef469ebff9af4614b4480142a14d1f65de4b095a4371e7d3a6e45d997a3cfd72c43ffaa53351b610108ca6f2489c5b89042a63fc7ff4d025d0c245f9830090a65fbc04053a2325dd3b888082594af0afe8228714c18f2c81dd11cae3667fd42a58946e3d66a5c87b2be49860d73e6ea6ccdd93e3fd90311e2342f60ea34c3f8350a72fb10d1e3714504c2c68ce2801d88ee8075b0b34e3e5276bf9efefa6f5bfdf2edc9affe17a94623a4431808e52508b9e28222acaf2cf26979d2203966d9e34ae195584a6918c4603009bb84909be4ab64c60e98fb2f3ba3ad30417495c8398a9191704fec9b6d43e8d185b85f8b6551378de30af6be0186d46e8bc970ccd54e72b2fef46b73116c05d66743301b720629f18cc2f3ebf3a9f71bed6745f61d5eb295f6223989c4798bfa950e896fdd8e204719184da92816e4bc2713967b00d993765f45d782631a520923a3a5b6888794627766f2ada4a4ad8b8431cbe5e9bb02c0a6a78d96946d72d98a6f906b5da77b82a6e44540c398c270267925033ff5a1b41b0a852a801c0fd1b60ba27f6d9901090aba27ea36b33f10e1cbacc17799ff2c15d2b5d7a4732c882025912b88a059845088680af36dc3ffee3b5a44d290fa1c24d287dbb8f90aab589833c92fe64658d7b0a8e5749dd50341a7fda7746c7c4e98d3a163cff6d64ef6646776f9b9dfdb0cddb634b859dfee5c1a7654eab701ef37654a524fd5339cc7dfa816e118076c2570f77859db3239e070f44311dca3fd6fa5ada63ff88b2dfb723fef49cf3fceaffb65b2e1e0274bdeabe460b84bf5f888650a8824785b7a7809c886f8d54c142029a9b127519636dc07655e9326500cc59eb895b12ade11bade1ce4a51f13d43287d13920bb0cf871b52402e3ee71fc373ca6258f52a416081c8809ae16fe1078ee7b7c7496f1edd7208a69cfb42dc7fb58910250aa1d32f7bb1fa6898c833393622bba48ab9793afa8f60d2174c3a4e13520c43988322bf8070a84499b5a35a393b679e568e5ce6fa421aca48c2823bbfc1a0e953865b4016be0c92cd8500c87fe5ac16df9d8d67faf02ef867fdf9bf28b1e6f0618211e4355f8f31570f5cb4cd0c1dd18f1522881a28a700bd0523f8443dff8e5a409a846199052da16ea6ce9b18237660f0b1d03ed5d7451334296cd9603b554ca197e33b958e801da01911a16d832b096c7c9ab1578eb65c047ef567254f091f660b65bef17404e37d094c981b3fbfc5528d725d2dbec0b963446922bb22cab19a377f51b7918b14daea8d8ecb374d95b0e26204c2e8f0b632cebdc162b90638e2650d6a30c0010d3d34cd41004a0ed2052a21bd3be753b8dd90e8d05610780f81e15b5a81242aeaf19d1b98f4e8e8336e136bec48214d8031a190cdbe4de646f171f6d22f3b6ae513eb3df00a6e59afd40ffc7e4bf05630584fa9e38a7212136062b9d17cedb28e88245e8a8b390ef9ddccac4753c4818143662fa8d2fc2ef229981458487e04ed640cd59baa2daed68987564c493eb8d36b72495c5820ff0a4ac994e032d1bec392397b6050d83becf8f6b2144e57c0064eac8c282ecd846d313250572b70931c851b56a581ab64bd0c72024665bbc4a69bc37302f86b18e476dd0f7ab9fc6708491c88f7e459c61017940bc81a23d59a5204998605b88f6b16251e80781b9f016bd420b337bd138ac9d84c393b70496e4c26b128c82416b031618bc49ad9294d109fd10bc462fe0ce3b68532d5166ef3a73c5976876f0ecb4f30c6d152ae6db54405d413c5dd8d58536ae5c343a396f43b2ea032d8779e6f7700a9feeaa461bb6ed4e564be76c6ec56d69f2218a4dac6880a5711e96f080620e165e53cd1ba89284479bcf9111df1e3a2a2ae9da10e3f31b689017bb275558b527dcd49b55f6c888cc570203e548f66689992338429186c0a300458f01c5ad87c01c91cc402f70bef589466de8e6d869651979420cc997fd3a67272e17451acf678b7f660b80c8d36286272816b0a3e0f79c3b0449cebc5d986020bd9831ca260964c04256cc784228154214efd3cbeece4a00b26fa721180ca1a8b0660582f46562e850a84d5eee4e082a167dc9c0352310bb3efb0d9ab0b0224321e1a6c0f8af071e27dfce6fcf2346be350440edf54839703038c25ca3aab78905bf78d0fe7575d9368cd1ff0284be466a7dbcabdd901ebc161cc340b7ceb7ee48dfa5b17cf35b17f8591b266a7eeb363e1eed4b8a23f550b3d05dd4351eb0e38e9bb71ab649599c003fac7ba21f87b3465fc15fc5ff817955dfa6a22268356e911575ab482938d7337d8976d71945ddaaa2a280f65519f745adb70a1c525d24cd4cc946a4557c139233523311b65ae65368247b785c628aa54e47f8521e879862a9d3115ec266ce179bd135045e04ca4753a357309a19a50dd98c19038d337e0178f80d69fa1d7677ab99a5de166948f495c4db02ccb1e9a6e1d44a455e2130fbcf5760130e611086364d1d595d95e35dc3b099e240b5894d2430a02ffaadb52692104949247269cb4c328c0aaf09760994101c82a68454284ad5fa4df53b7852d2ee80e90ea6f0ad592f1ed6cd96c7ce4e09055bb05a4cd5452391de62da671f688c551576616ec07ef43c46d7f90c8fec6df6a42d8fdebd03581efb1ccf322dcbbe447a6d341abd367a9dd185b961f4d8f3188d1ebb3cb01d65da96b5276919cb675787e5b1ab53faec4799c672b9d4ecbad467b59ae89ba8899a4c26edb39149fb8c9a4cdac864cab22ccbb22d68df58d3a846223d86fd6864da2cceb2b7fff292dd5cfad19bfec5fd688b5fda727d92a6699ab6619aa6653fda72098ffe5d3037d8cf9e87fdecf2c89e34723cd2606ed0de3e0f2b83afe751a3c53126b5def0e0aa9a554afa3ad6cfa7d6cfb736e04d68210430766ac5d59c3c3b75a7cec9c3b35377ea4edda95a2091766afda1fe306b7d9e3a035bf2535254a462693e1cebdd46e77367a7b4c34ee9ab3c1658e89f9e74658f7d96850006f6d9cd3ba56acb255c5559f695f6a62d9732faa30cdb729661d85fb396f20ece34ad94774a7907dbcf3b187becb35cd2b02d63d8dd29618dbe7675e88faecef5d897b69d12c65c4a2f24eca248a45a6badaa5a55554b4b4b4b554d2c9476b066b137598c619869a7344bb3844d7c7d2e9530bd96b3a59dd2e5c44ec7a11f9f5a960fef2d48032f4cf53af3e557f3e5cfeb03ec01fa932b5825d3e94fd7b73c8b8b7d6dc3308b430083e9e8b59bb5afb66c616aadb55e9f5d9a768a91f1a1561e586bad3e60fb3ed4eb7aedea5c9f695f4757a569d692489fe3265335d552a954d2b449af506feec138318f592cfb98cd394d665f7b98cf79da763dac96556dadd7cb9c1c0b821fdf0786b087bc0e6eefe30ffd842a8c9ea5fee949a57f31653daea74fffbaf462a65a4b26ed7afa0efbd02e8febd2ebb00f9c5553ada55a7af72fa4d288441a3dcbe859462c2316161696110b0b0b4b157af0e071eaeb89a53556d49c3de257133a8d0f987ae803b4be832748257a7d467920bda80f3ef8e0830f9407f2401ec8034ba552a9542a954a2552e99248a427ac0f3833fc6886cd390d0fb4d6fa0cf4a10ae679bec514e8141ee5f3fa804e5e1f183e7579dc87f7c46e27a4f028ac2d5f91bebabccbe84f5f82c9de6e1acb67377700e210cc804d16d34cd7d3c7feda9ccf644f37fa2c5bbedefde835bbd1d1e778b565fbd45695f695cd601cd083e967d9571fe8c1d705010c4c6ff6d5577f7da4a3afb65cd1d1d3ab337aedeabc7cf5d7c6e33c8e472e0e5372219d4a25d257d2575225d5fa74d66aab18fd5931527dea67cdded29ab5dcdc83eb6d79ea73fc5d3c1cb77cb5b56459966552c0ea37e6f5eae171cf4a8f6d7962cc9a9e457bd3e67c46bb99c771fec0bb7ef4a4af7f651e2f8ddeaf1b1a8ffeda1c266d3a3c8e4737f338b55dd7f5d8a6bddd32c4f61ff6dae73cbb5dd8cdf1ebead0aff45ad3c715ccd35718985431840915a28f6ef680a9185dff73ee841ff5758b37f78079a89cc343bd1c80c10a8502188aa840e1c3040c4b2cfa334f0cf3302d5fdfe59ddfbc3c49677ef6d3fedc463c4c6f6feec0e310bce0d1dbf7ab47f6333fc6300c2b5d07f4e091fdf9d87cd396b577ef8096f9ee8a40e396cff1f9d8c3fe09862378fe4b91f71e0c3f38cf293f4ca60079c0e8b39f9bd5a636b5cf273cb50be3801eacbd2dbdfdec033db8744100036bb7076c3ff780b3cf7068dcf2d996b31fdd1857d8ecf668f979755abe74755e7ebeb6f15039bb3c146e8179ec661e0abfbc7b920bccfdeae2c2f2ee82c0e9593ec74f2c271696b9b1648f692c3fb1130bcbcf4c63c130ca7229a513c32686615f6d3c8d274629142ccc0370f6d6664ca83861428508cdfa2d2653ae606b74730f1e7d69cb8f4baf6db907ac61d8cd3030f6f64df6661834d030c30c313130302f2f2e2ea7534b0b0b8bc9542a9148a391a6599b6518765db5526a5955d5d272f3c4d89b9e65734e86e9e689ed6769e3e561286c4f3037478cbdcbbf6ccec970b93962fb2c9b3ddd0c9d0c969b21c6de44dd981e7b87dd4c7aeded4ce9735e6973af6df149d9d71f655996657d39a027bbb9eda6fdb3165b1c1cbe3e3fe6a12c9e9bfb1e84300fec71e912122884527ebc40c054a073c4ef1cf1fad41cf27d600e20f18798399c2b40864fe5907708136439e27b8e1c7f377837e810af7305c8cfffdea0a52db940e9ecb2701d1bfa8c0ca6ba21f64e06f5497cc6e1191f9b2969c0fb8d6c4115980481a92ee09826f60b342ca6fe546d55852ec8e108000a0e14e8c16f1c53bfe383a92c1a891439a088e4701ddf6f328d98022316a6dcf580be2010536004bf5f3de65f37f49d7de5f8fe393aec3ae0a5839aa17478d4eff0a8cf79d4e3f0a8af0105d631a1020a1c9f8ad83fca5057a785583ac89ce35038516eef68decbaddddf0b10b0c7bda940dd37b8f12882826a512528c69732c6189fda62a462081540668aae382634c1c18f1c7373395c9660fd5db460e7bbcb02f35d9eb053b0720a39be23bebc21fefbbc83774a6f4b624e08f10eece3fc99129b1f432a506733403445062d18a2a2c4101ca082932ea0b0833228810aebdcbb052c615d51137dc21017995720e171c861c683130018ce29ba3895c890a40b5d884245122b44c8e1064b5089c190941d7c2187f7e06cf4e9d1f4732ef04b42845f2dd912146c96c1e91c6e0a21188c6b6906d1138c00ec9810092521440ffae32fc1e6891fcdc4f40637934baea1409ddf8420621de77ee470ef6aa8517238ef32bf990a27542481452c22248e64a8121ac2c25011e85b4c01053b2654208111801d932986603b05109c6d51112cc515d39314d800c3fa840ea050b101901f2939fc671ece0c430c6161064453ae083185138ea0e00665c0a2ca156a18114410580831032e149163068b10ac4061034305cd176cff8cf6e46a43fc150318ee0ea987410375e17b2c3518315960a0a52c2cac0cb6bf7d60fb314c6257e264b8b77ea85604fccc090afa731743bbbbbbb714369cb3112d29742108bbf6cbd9e881b341c5c0c23675c5c0c24ec061118428aa90020540603294c3399a76363c0616b6e715030bfb60e5aaae66553925ab9861d907f6af02bd5588f2839dcf3c1d5887848538b0d941c981cdcec90d6c9ed406360836d7c04ea80b2c13033b047b85e17dc685f7b5349d0c0964e115c202153160a0e2055eeca0ca0dc40084024b7eb4703244448989440ea448e105203e3bc801822a8610c40a2a9c5891419dc389c0911cd8c00957d8600b2132cce001134df00214809c20408f108e5009020b2a4e50042344d113048926a6d8c0491296302308880f90d08223686183146cc1e34812a2e0c51449a0a8a1cee1908c4869a28a279e60052b7238a9c0112cac2ce1831508399c1e1c9ce0082a616041d01528c8614d38c082065850d1842041e470ef080005c209237c119ee0093e3dc5c4ccad060e08e1cd09c0fe3130dc8ccb7a5d39e87042228285b3a22aad570e578cf3e786e325c0ddc4d0a8810346500d313130a054454231ba93e1de1d8523ee8ee91a7f1971e43819fef166d7444c3b7f14f5efe1c01e9fd0928382f240011d9c8d68d12b875ae547ec6e729c8df735b8f836389c524c865d0d147cb2e7164dbb62e7f409983e031c0e7d8ae9d77037e4d3b7d137f1e92ba073381bf029ad7dfbc6fbbeb06559ef6e7536e0b7acf4e7cd17ee7610ab3ec737ebe6eb32e1fe7ce17c729bdcbc6b667532fadf76bbc6a9534350cf2eecba06d467ba731cb19066324ca20cc1fefeae1748acbb1150be5521b1b04a89bef14ad2fa6a7acc74b377ec6eebe3f7d5b1befeebbe9512cf7f7a508c1fa3cbf7328fe7ea48bd76c88fd21dcac3794858668bf51e132809b817799174a5440bcbaca258964549398df80d90ac94e8d8070247f8a48cdb345201f58d7eaf90bcf795127dc37f66f93cdec3be4d6eb93a22024743c99780c3f1e1e97049ee79caf8f6a5c78fefd3b2f32ba0ae892faf1df6ebcfad3fe799b6ec4b9bf5d6a1d869c4839e081c8e5354c31df0a087f3829c090ee73141abfd9ab7bd3ad577f5f2564a581f1d8ad06382c369221c0df5540b5587427da584fdf8579e48e8e064584f594984c371ce7a09381aeb29ebca8fd4fb407da544762b25ba264e239512d591aac4cb3b4ea82d6b5a3fabbc5391a864a5c473b9028b3c2aafe851a132a7b5a7d39b32c5df9447a5883f2bafe85579532415ecfd7db347f4a6143d2a8fca9be26fca4e252af28a9e9557f4aa3c2a6fcaa34244aade94573433e55a3ac53915ecb4eed49d4af4a6bc29446fca9b42f4a63c2a4ddf94197c06a0aa9f933744a8568f7a44cf8867c41b522f1d4f47d5beb5bc3391b4a754ca27a9bba47c33fc93977ff539fe4edf7e7a43b4bef27de6a1bcdf57335c2fdf85a10f13d3ff6ee6d1ff7af43fe92fcff051fadb9e115d2347a5f7f16535c39552e6503117e6bedcf7d2c97befbd77df57efab27e43d23f241afaa27a46ff4576f88a49fafaf6e7e43b0a32a6fbf3aef5bbefa7c5d1ec7fdaa57bdaa7a1fab27fbbdf79e3e215dd3ef14311762a16fafb7cf88ab297d9e67048f3b510e45f17876a2eb9241f219d137fa19e142cf8837a42f1e77a26784d0e90895988aca120cb146a2040a4ce5e034d457b772bfb95fc5523d244c2cf19b47e5d2f13e9fa8dc583e23bdd6fefabd04d875e80381ab2d3ffc5cdecb7617d955cc5731be0477555deadda6caafcef5f4dd44fb9ff785a1ef3959695455d5b73f29fd59b6986f1a739d89ec1f0d05f35ebdea3d8c75eda85ee7ddafaa7f8f8179b94c50b9e8e53d3e80f8c1953c7f82737cdf74581e08dcd5c3aa6a244afa46f5ee41aff22538fac7f76ef625383ef5fa59fefde9ddf7be31cb57595e944549d7542faf1d2c2f3f6efd2ed8b3d48a1b49764dd75e26da764bc944ecebe34ec5b45e4f9f3e67a26becb7f5d2def82f73f0eaa3fcf8b5d6dc49707d296fee487d0fcf99a0d799b8aadfa9b8faac913813be04abf5bab971dea9f4e64e829d0997225a1c87138da388e9aafe7a1b4f276b6fbcb9afeaa1dfc4237014813a7a7e69b3a3276dd5c748119131ba16378a88bc449cd21e1ffe523e0e22fe120750759294b0f6d7284957a796701cd137e44792576ff9d26dc15104c77797b24677f7fad8bb3b04fac2605ffdfc97079499de3d96183fc64ac61857581c457014c155ac2dd57b2f379f5cdee9c59f2dd5fceb695bdeafc502f9c572f3c974b3bdd9cdf355978e0b871315c3f20870fc186f15bfe3b7100e22f11b0710cef3795c67f440e0e81fe7578f8348c66104e7e9a3771cb3fa291d47113c1ff6cbef197ff4ed4f2929c2ddf1e79cd6427934ef3b56a318e363a3898348d7c48fd78ed1cb9f9bdb276dd88f4642ef591f28f8d1b8696fff6d5615ecf3702cd0a3a1fee4d70753afd10d66bec3d2897e60bf5a7777f5dd5d69af5d98f9d8c76c55c1d45ba0d3c95a2540987a1c4764228c5d4f55583fdb27d5679492a71ec711d5637fd5aff5c677211c47e02822711cd1376211fc9e524570cd3b54114c84a373e7ceebd5b15e5695a4168e23ba269a84589a062446ee412e04c34bbec374d6e87edbdb7d5c05d6062f1dd7613f474f69655996579b8e759965c5afaa686557477b5bc566f9bed9b17d969bdd7447b7afd5de6a315e18fbd653ef395e8354e2f16d5555bb907aed187dd391f52ca69d537d9d6af495972ee97aff680669d8466c3787b56e6deb1e1f40e0761fffe98f9ebd08cefe566fd0f2b77c08ce54c4282bf350cfe3b8ababd38ff9c368f9961b626debefb798ff740df6f1a9ad3fa38f6dd8c3ab7bfe755d18f9fd0fa7c6a3810f1fc38f4fed9c703fab47b51ebe7b35307415c4afbebefbb80aa09311cb3c023c55d037725b9675f3ce09e79d53de3961eba9b7aa392f96f1ba0aba86baa42e05a10a7eec9854016285109e811d132b90603140812beeefcf82491645f001b063820511c622099ec18e09163f180b279862fa4e3a084796ebe2814e6c8c1e4208af9c3faf84d78e16b9036402eba543ce0d6ea3979b3fb6b5cc8f798199413e0defd70d7df349de6c03c619de0c21844de1531e7f9b0ef64060b8e59bb71dfadf93f7d2647a997960982e0c1aee0c37bf1730379fb478b93117c218f43d8410bec71e42086030a69fefdf422a2ddbfe045fdecc03be7cf872ca1c9731aeb03c8e65f6f92dd8577af598a7df6eb6c1fedffc306e3e451a6eb6335cf9de9f679837c615363b691bbd0ebdf364336d86aae54f9f978e2b0b4c9936879f942f678f0f207608825070f6e7719d9607024bda2d6150df803f65f66e79e87d337482e5bbf437fcbe302ff25bbee1151a08142f9e68813ba80adcb1676c017f7651e4bf7cb7bc6c79b8517f1b85e59b5afc6150d7c897d78e96c7de37f8392f661b3dcc56fa978df42e9be95b36874f9bddb24ddbdc0e3e33e3e1387b7a1b709e81a3c5f27ded7823bfd9867f377fb4b16e30d53b8c45f161793258eb59582e4cf5a697df43fc68c3ffe914e753edade9c6b8427bf9d79736d2f646d70efa3adacd30fd16d21f89b0e18e0dd47de7db48e7677ffd0e9049df70f8fa77e9b89c50b88ab862d23772e319a51b36ec2b9fc6c0d7e79d1879270696d77d49bf1fb6e484b89a1732e91ad9310d8308d4b91bd1a377ec9a1bfe6ed738ea3919316eef3dfc78bbc0e3851a21b682c660f9258b524a529292cf037dca3a551e766478d8916142175c5a4eff0283bd7dcca4997ad8c77a905e0667555665f97175614c9707097bedb3ea59b68cbd7b079c7ef4395e9d3ec76d95d9afb6cc03ae3e5e10c85ec36c3ee5c7d58521f5183df60ef30043ba3c46da633c60fb0ef380b5af32569dde9aeee9abab73fad1d5297df5d8b62383abbb23834f302f2d2db485b6b4b47c8bd6d2d2a2692e2dd7c5c545d3344dd3ba30dab20c1e3db6651e30f6a62c2686e55b329fd14c594cf63159668ad16e2e3df6a68fa93f728fc990469a367a6dcb32581b699a8ccfc8b8273cc8b878f68312e243fdf88d7ceac6b8c2523e548f8f42aa97793309aa60eac76728aa07f591120202214a88c3c08a102e8c4a4f6af996976779d3e95daacf2e4bdf6659c55e9e622f583dbd9f0e5607ebf555663fdb60280cbd3c34ec07125479b9b0b72f2f4fafce891282abb75bce5eaef39996aff7f4ee5d4ca70b7da6e5661693a9542a95ea67f5b3521d8d46236badb5960b59cdbe3e4a485f3d2c25c4075b44302524032241954a9650b2849225942cf132bfa6a0ef2575055a79597895a682a117f90cfc97ec45b12f8f63fb113e458d4a26961abf54fa39ef7c962dc6376da58db4394733da9ca3893747f899879296b44fd9875f595851f8952cc2f19d140f7a11112f22626b3c1a1ecaa5702297c28b88502e8517514ee4527811119782a2a4e81af83fd0fbacfba875361c7ea7937d4de4e97336fadd6055967ae7beba6eb05e7ed4b0ea4fd9a56ec71f1ece7393de7c8a735a1fe5b4d6d4fabdbbfb9be1452e4550e6a322985dd2679edfc16f869a68871e824dd4433bc027fd756dd1da2c8bb202b378559cca0e2dd4443e237313f97535d1d43e632f9d0847927d6d738e86d24b1f9eed57ba0bbf877ae8bab21eea21ab5a3db3e3430cb6f24e9730744f296c4b62f4739371bb92b013d09e347d467ecea3b1665bfc6b746df12d09684f7abb8ddedae4f7152fb62561adea34256c6dd597b0f5a4edda66751aebfbbaa17a4bfbd14cc2bedc7468dbb5d553ccdb6b9da6a9218d89f7900282483c235ee40df11979e537e4866ef9596998d5c3e9fe7034d8cdf669b1076769b4779b2ddd7cc27e4a0a4feaa15f1ecfa8af1ee27975b49b1b6a0febe5f1ac51d8d5d17e6a57473e852775b5ab3d232e4dd3340dc62f91463951b69437437f46083d2142cf883744e819a141a121cf084d7321071fc7f4efffe1986e0f2c1f6fcba389a3a7ee3dd2e8abb79e3e75b30c763d44acb1b31eebe13de9e639b3bd14fcf1c352f4a9eced867dff786fbe97651bb6c1991834dee90dc1469498703368400933b49136342415637433207c1a504649adb03af129ec95c6cb979b359f56ec86596f86f89a8f55f3abebb75aa9554d1feeab23d40a1176c18e89952798be4a3d814e1e761c8de37d347ce655f7fd31de4ca33195e94b88b37f7cb9c5b8e2f2788657c7dd0c257e6f539ff2a857073e85e9bd3c8e29a481a34dd7448767d0681a44d0a66f64f736349c4dfc19361f299baeb1e99a17b779e9e670dde8e7bc39b70cfdba41fea45f37fa51878f9bf3a08dd5f409bfa9288451ca19b3faaac7c70c1774515a7f86a5905a9bbe216dae0de5c535298a4671d2bd63edf161512ad56173d68acd5aaf37eb637f6df5c22a765df3bd4aa152a8142a45896a5114453d9d2c1f5214f553c657596fb95b3d3ea6a543dfe19eb331ccc23ec71d9b3eadbcf3b07acd48fdbb669dd8cd1fe8c927f7fcf2697df5f9efa955cd9bf1d57209b6c70745a95094880a51212a056ed9f6f870344aa6c10c7ea6d12cbb990ab58fa5de81e0ecb5b79b96599fad66e9c35aa9142a854aa152a814b98585d55a6bac6ac5b09655dad8744dcd3e6218569fc775ae1863965552cca3b737d3c0f55f781c62a4985d1eaf6fd337e2c3bf369baea9d48a3757d7e66d6c7a6cc727585162850c5770ab003b2663a082b3faf2f6f89094aca2030496dd54e75a046786b8aa4375e829d57a7cb84f15ca5273b8a1855083af49aa611afd4b65f61f5c7d86597c48699f9f0fa6965ef82f99a2946a14babd79627a3fbb75a86fd0a71e9357ad6ee925955b1dea9a92cff4166f1dea1a6abac01d525e5555155fdc5c25a5c5b1aadc0c171463ec1bf19f3fcae7ad56a597c7e18c36a51a89409ff7f890514a973d3e641592b58abbbbd7222965257229a59c2f32c39e57fff2e8fbac943eb5f4a25f29adb552ede9bb9bede8dd33d2675f727fd236dab29bb1bb73d2b69d13b5ee4f1d2ad52a680c51e07b6370620c488c6108b6c18e891642b0c7477c559cd5cd37f440d8e3a3aaaa474929a17cf860f5ee5d15abaa9a5f2bcdaeafbf4347526ffd0bfc4c62188661f633d2fb4bac626df4a42d43acdd9c5db75db7d27bab529d571a56a2aac787fb54a1aa56a9445625ba1e23f268e474224ffedc4e7eb3ff642fedc319fdd07e56d56b5bbcf3cacd1fbbeacee9f4acca7f4e75a80ed5212497cb25401a8e3ae76e8f0fe8208e9b8ec3bd6d0e5311d2a0813dc6fa39be05e716e30a1b6d6c6c6cbac669c3275a40d10208d32cc6f99ec7716f5a10c13660c7248b2a42591cd9b2edf11165c2f9a838292a04df9cef2ef722df9ad71b691fec0a7123b5deecb1d13b7ebb553c21b61956b73a1f9377c75dc1f233665d7747d6a1f741eadfbc3afd9247bfa46eee87f71ab12e7d86bc37447ecbf52dd444a492e93d16ededfb7defc59f0f3de9cf21b6bdbc3b593d3ebaabb80c14ea1befada2963257875a3df4642c9926c27d72e9edeeee4eb3bbbbbbf710ed0b23f3f2e3ff0340be17ecbd3c00dea55f00e473777777bfef752cf9020080fb6efec075f9101919f9de0e2df4e2f3b8ce8bb790eca2f8ac97971a3e37510f35118ed4dba9efe5df67895fc48fa2e11fe56cfcbf6f6763fbf72fef54e6e5f6500b758dbf3c56c376fddd46bf6ddaff661fc6c6f2346cd9cfb0993e662b3dcc467adfe2cb8bcb3ddd3c5bba5be4d5a9de670fb975e365f9cbb75efbeda1ae69f9de5aac9558df1857589687bb14713f691b69767327a3fb46f93a96cb2b7b68871ea22e1d973b8e0d6fd1ebde43366c4e86ba7e9a82e6bda47f6660d5a7aafaa77690ac5db43cfa96bda39665d14de772d6b2288d96bd3af42fd2bb65dd4ba41cef389d45fffabc531de6fa51d554f599f64db5cd92da4995936e86da5c426937d5dde3c3b54f13c199ca2ca7befaf6a1a295f54f65f50fa666cd3e5ab1df772ac414bd322aabea671965b1f915d39bbb83c8af9e7afb412afa117690aea9be835455ffd40e6255b77ea66d511d44eb91152ae58868f80d94d87c0b661a93ea4ab5c3f35d4f1df5298deeee3c1e371dea32f738fae931b3c95aa481e7e8f2388e34cea7e685a16f3da428eadbeacedac3cf34b0f575d61e36306bb756ea75b44abd4ddfa0aa6539a218a3c53d3e807033a68e53f152d48cbe41bd5503cee8367dc37a3873fdeb2f8d97c7b14ee77a79ac2df796e98d3ea36ba897d78eda6f37ebb3edca799857f436f639de1726bef5d0a66f500f2db7a19ebef5cea62f1d160dea559bbe91e5539f799cfa96525e1ca96bd33530ebcc09a6aa0aa1424830e72ffb666f5ab53b2a850af98d3f7f1b7d5adf7baf6e3a97cbdeabfe4c54ca45fa265121ec5fafd7edddf5afef79ddea5d984bfa7bf499a869cb8da5f68ce41d96925fd35715cb33e2a6d2255d23525621f5aab2c787d3284ea9bc289212794585a8944985fc76e5fdf4fd47917aa7923aac17ade8bf8ff2ab2d621a11ea5a880f105b2b95d23eb472577cb0fd0cdba785d429c55dc1fdf533599fd61d7785722a854ae99af852a4a4421053294846cdc285aca27475e441c19446afebca909847e2b5c3be3f8c6e1aa994a88ef8cda523b66c28a62dab9bfdd2e6e40d4e4e231590cc95129d2ab1de6e5658bf95be710157133f7ae171d1839311dfb7b62efceacecc40ea0727c36d31012a4754f268587660c307e075f099f838f84cfca804c7df800f0f87faf83f381b6eabf168e2535bcea3891246ca67c5715c7ec4873f88f80d1241468e785010229cab85a48827d80a8e41a28831422438bedc1ef004275100f94d8c6f480b70aed108bc438c4ee31fdd862d009b7b341e3fe7e1501592771c7ea893698bde24b00fc0358558cf300160195c91d8cf33d9cf9ff170b09f5f0387df5c37d5cf59810a508f01e941a57f6dd0ba8e6e75730fba4b871c3782cd3378cef88d23c2f3690543a9f5338e5355993f03070e7e43e1f914f8c133ca4352039c69e06939a10213930a43a2c0935a558c8cdf3c16e0596deeaa5036704734296205459c0097aa2b10c2caa272458931468b3ad1c427884ee783c407e8bd263e44b6263e29c0b42b59bdaeebca2c95f8055b45d1eadb9a100105974655d3348d549f734d88086a4284125ca2503421624853509c7b5ada3c8a47e34fda84b07fcc0daca44eb09afceb332236bb20ecfda1156723018d730c1bd9531a45698d1a6f06d2a7ba1ffec87eddb4a73c116bddad6917078d1a9c0cff8b059b5d108d18d8df3fe76b90b1b1c3e1f730fdb8064c5f1a3880bcaff465c7fdf7e57f63168400095668020fb0a042922cfc0f6430c4911310110205978eeb6a5cd0e1f5c613b1d5d3fd55c4f4eb0ffc7e4461054a95274541423f827c9ebc7e35709f4e926e0e576bebc0c3d675b8f1dc6ac0c46f1c2f0d1de8406df6474f1235c8c2158ec881173618728118fc200b21313cc1021c401c1705218efd77806874931f411ec50f24d8abc0d7348ac06efd0666fa8c1d621f97c0892c408124882e50b92287ff0e0f4703448041510d9034b1c5951cfe39fe38f8bbcb07cc07f76f2e0769733928289a8fa6b04958f710bb2644f850e79c3b9daca5a85c71f62a9e3f48bdf73e52d4c347bd072f44425154bf9bf62544eae5ac9555f374d6da783de07dfc79f1a0a4d4a14e27eaa353b0674028e60c84134a0c8a25e087dfd32836c7b81ad880df5b978e376b1dc016b450f2450faea082941cd96212ec804a111c18f9398203b883bb3f1fec35c0fe0d7077f7ead2e130c7e007a7754d801001bf130cf164c69521084fbcf085129a90841c10a00a4508e1092b147171041144a8c17befc1578568420ad87f9a4008f68f6f0ec1e7824d8420e204ec0fabdf2869429d81bb813460ff233e7b80a0051258d0441642b0d005de020813509852a404a21cef0d118426f0fb06bcf71e9c897998020c033bac981732082045c02e9ec4320cf1dc84f30a12ca5a2b5210451660b0a30b2b51f8b142c48f099d454561e5604259c1072b932e8482bc8c128eb3838b1f8f860628ecc48e491751e013038680529b0cf1634b2cd831b942030cb16b32840fcef68550d7d7e1c48b01a779d4cd02c0ef7eb6c10fc3ee2926c475811e9c8c19d87705c152d8691802f90c123e83a5c0f66b245ea0d6b99fae49114a9a1401e4a411195080b810932b42987441c41523b2c98f21ef04f3c70f7538d4d1bc77efbdf779c31812d695b0fdae041b0352da5710ecc31962a7c3c3917100fc1e2600bff73ebba218580bac0e8fe1cd2e0adc9f297e8e85174bbc4872a58a6b628222dc8ec99522dcdf44ed41b89ddc8263b2051351a478411319085538204289135c04410b2e801a17ec7b68431331d8411368d045117c72f4b79587f3925861420c531419210c399a40c514477e14d5000551c8d1df450fa7c7c810aef841194ea005d117399a883261bb887a4a07152b126c6ea1f92de4374dd445b376a4e2c7cb13b32fbef802bb7fae87720f9f7a56ce93db7bc7435d3ae64f97438f5f0f80f1c5175fb41757b06b420410aec18e89174ee07ed244453ed3ff3d4fee77a48ef8d5d618525b7e3f7e7814561c4a157f525454258a1fef3323a46b60cad5d8e0cb7be978ef9ef6002790a8023b2665f8c1ee822eb04e084382cdae08c32d747d61b32bf2abeb0c2c10450101f5b7cff3891b7838d3d1f4cf398b6691908be204c53e916e4ed7ceb573fdb285a889773cc852f16011845105563873a8b0421c7ca6bffdf9133ccf78b3fcea33722b55795ddbeeb7f1503846778a88cff4d322d85c4b3243f7d5674a9d7b24c6b25a9794111e30260996ba79c2bc1edc8367c321ea6e5807a5ba0d46159bc39b38f88cbb0d7037390f0542c15de8cfd6b4befa8d75ad3cab3b9f8cd485389de33d32bca628dcee0662eac1bca770e31c6f183c0ace7ab2eea7dbec3b7875dcb5d47ba5495118baccf32aa8bb83ee37872462bcce697aa6676670bf98246c3f8dc37133ae090438769f0be08de34de3fa6fdfdc9e71df2f2f79849b265b01c0ee73007077a0bfc0f051ef5130ca910b085640e7441545aa2a72206b34134e4f28288290f285224801c91082c8c20b9118702144144a48418190f8820824c80afa09b1c51348e0c0c9114f30c21309f8c00843b8f0c410558c50c50faa8a1350cf04de3574e860094fe0011952b0c518b858027e0f8560027e572862074cc8821460a881108c10c50a48450bfa8278824a2a528260a47ac2a43205152a98c271991704ce3522113868a20a19b030a20c628072841142aa20c245941c7906173ca0b8785cd40053ec987031a408ed6ee7fc47d54bd3e46b358dbffbeadaf11c7643ef76ade7e6ee0e93500fec701ed8e13b1e86106ad7e276f7e75f399cc62de333aeaa3417976d4e6b4f27f7f99d8c7e455c00c990c079c7095547aa235e1d896fab80ba064e239512b2dd08d4f90df41f660622f760cab7e041f9507787ebe66c7782109c7926fd47675fd85377dd70c2b61d0e635b7d774500c2c72ef6f0fb2fecc2e0e030f63b1cc62ef611fbf8d89dff3d98f6d71e6ced9cf06c47f5d0f6285086102932a412552228fe03a53e7cf7ac3b95bcda55a80e1d498284de7c82a2e466abe40475a80e9d000a1454fe4083468c30c20821f572eb1e36efb7d2c9a6f47a083bab7d70096d1fe8904a2a0423845ec17e7f8a9b3fb5611aa5915420d6dfa352da003eeea352ba06c2dc538158176744825ab172508baeb20b9b7f5a6175aaa7707e5cd1ab52bde59e7a67744d756d2c6759940c5a40aa062503b52c6a856d9c1f37fd07adb7e91a7aa94dd7f40c9b4c5d1b88a790a0215216c1f25a791dcc42524aded95bddc266079af20aaaa2dd5415ea1ad9b20ebdb6dc07e80812a02348c60014940594b216c931002551b22408c915b69b7a9944c992a03a5489a40442b204e848923a548528f79143707620db40724a39dfa90e0555a1efdba7afb3d178ce8a4553d9d7522e6c7623efa255acce7c8acaaa526aab2fdf5df4d2285de31e00f1cc79541b6924de5308e437d1410a0b87214589286ac5c6ef06f29b2ab6fbe553ffe6bf77249ec46fa0df58544ad750573c7947fc8a20fcde91f02354cabc348ae5a8b78c0079a9e67d69e446202ae521a9a4c4a06e1f233e457c88f80cf111e2d33f325e79a9be2af7537e25dffa6babea4fe774a80b727528e71ec4650771af3ad81fb70e74c599a75e787f82fc04f909f213e42788f3f9c191719a1764c9cf129cabca04e9f609f2b3a4a9203f944f909f2541288a825fc9c86cc13e377f82fc04f909f213e4274810c602274439019f3c271ed4585e286f2bb972f612830cf2f3f5125272bef5f6ab8f35b01ccdc0f28efe7975f5a5bb9f27b62ced3a7b3388adab336f7637cf986e59b797a8b49560b904139ba78eeeee861445f38c1eada48b6ae4bc25a824bd442ba19650d22e895b4249172dd1bd44d7c09f8173e39d8169542933fcb9922502aa35a8f46c57a53dea14a201000000004315000030100c0604c3c1681ea7795cf303148010879c4a705496c9d32088414a196380010600013000220033b44182007d01963b6fe8573980a76d8f8acc7a5c09133c8fc9c7d6b85e055464c0cacdc078d7ea3d052ea8755e1633a6dc62454450ec1c3dd09a5510064b06027341b1932ff9864e0e354275ff0ff548be0100e14e57b7602f3fedb53445321fa56a34750da93ff2913ca136e8f2753e63eaef5bda51d5c41affa5699250df8cdd53acae2428b46df116f19e4edfdb3f25166ed162b9ae4ced853c3205ee779fb6eca0d2d034e389662108c943806c65bd6946845a6ea6cc79fd47b7e4fd919e2777f8af639e43482b670e3a88db249412e51057e6760e219897970040418bf3e4f3616008faa00d3d5b087dcbf0b7b779864e85ebfd5dc2cd41075a7b06a173b5fab1a25afcb0f94fba5268b6ed00ea3ad91d28b9fdd3186c2ad1bdef1c117ce6b773661afce6525db0c011178e5cb874c793a96bb1612f33fb20111116476b397ee0da07ed90b0364996f62d220bc7a8ef5e67e93e8017adb5657d4d62e6830551212382b9e347eb311f8bc013463075f21f586dbb762416183ad9c312b67cec94ecfaca098511e4dc56048ebe2d7512a024c44a7f7a048758d246bda25030b43ad4d51a721b2f7c8e0082557a10b5adf460ab35f2dc74cf89232586dbea513c080afa266e5a7c6dc6982ee6de87c29b3567d472b25b4e36c3b422abcbecac2311b1af5649e639d84a635a8db4527c98ffb93115b35f5091a9d13bba5084bc958f627eec3cdcd0360d633f60bfdf484685d9900d279d705de60bc970c05a7c90e66e6559e84cf0b888314b6078516828d501fba4b0aa450c4dc572a5b8528322734e31ee21a1e3cd1a2bdad6a9f3bd1fd99a7cd6df8ead7fb179d8179a356f5d6f605f5fb2d4044ddc3124b5d503b1e3e5f58cf753f0522cb01688d8c93b818d31e893d871a8c446666d4c3e68fd16b37a5cea5a97b0d18cbd06be8c5677f773eb499a9f55ee3c857aedb69ec7a2942a8031c884257f863b8fd895c1eb3206a5654cd73e2c4d9f48e0e83e101a325ce59ed89f157ffca70a93663e40c977cd785898874a9bad5024fdb9ce284a8f48451cfd00a5b81059b77f1e3545b7987d801179ef949b54a25b899b80a6954531f0b6cc953fd325228f1adf538da2f5305d101cd0049d14375c57783c0ec9be2cbd2db9b5e4399cf4dce9a0f6e5dd9bd917b825ce49508536d5a6076d770d958f294241e56c17be3b5ec9a94a4bd535e1c61f8bddae4c6652c8b8e8849aca99ab7c1436ca1d43e7716e570a0cb68f03b940b82e719f42a91a7b7f55b6c0f0e073bb17c26f4546b346ab32d948f8e625ad89fee23c8d0e8cc535bd055a9c38c3040347a805a283eb6d2b691e4c467ea981ed037ec87fc1f00c61bf785258678b5e4a4592e6e67488cbf8245cb96efa9c73a2718abfa7e7ba00917cc4c9ff64c5145be8716e1080191ed3064a7e0d050680a00410ead6d052af4e579a24c4fabeae2c7d3d660ecbc32404f4984828ade04ac83a7817697487a0b517b9d6db5b1736ecce869644fdeec64a93478142e86c5ed11767e8d9ae1aed75136014a90452145888a186fcf39e223f1708a7be7ec215ec5cdac375db0a0be7628a341aaac6fe270b14a9df7c1882805f9df1666d870d749f5cde061ea0e15e09bccdb509d6063ca4aeff4363d12be5883d848a73b5ff35b13c23418c34ae025fdb1e9ccaeb41e0bd7335c89a7f6f55adc7bce3b9ef70796bbac7cc019c5677456b10b08b5e3f26acc4a23693f840f1c22567a37a0d83c5443503d8f4b000a9fed3c229fdfb88109633c07e6bafc9989d984704248d97adc9e7e3053761997cb3cc405acd64f0c4bc44c9ad6ff2a3c59851d84c7c35292c025b4e472a55806195274e48f2bf6c674cd5df0f32dea28331c25f738628e234c3a12a1a8a2c1124d9cd02019e2d0e8b31f807f938216810ba91f891126f948ca76a341606de476829e9fbf0d752971832044d07627516e2560c69284312bf8b30f38e3a5754c60cc9438664c113804d5952c19b83031102ff2e7497a4fd4d9f8623f2942868748fb993aa35dc43d2edb386dd7ce99ea81aec4ab45e0883e9b31fd74940f46de48e010a7e22c21c1c6a002ce2da8ebe607e166c934e004a84dac20ce4ff94cb77ff47009eb22116b03c099e525df025af639abf841f5bb3ee933140fe0547a8bc9db86ef48e8e01fa3705c139cb7de7e3c901c0ebe402beaac823d626f9979958f22a0f25ee4037c2f7888822a53b605b8b6ac8f6492587487f9597d5c4c99b970bc14425702a29e2d6ca0f3adafcd57c4984098171b093451f15e0bf7fc8819a44651fb666fd56573dde60c8990ad836d2094af3bfe41a3a8be4a8c4a09786eea0ca2b01c7e6404bb79faf6224949f430b3194022d7a82dcd7ffeff08ed02828c4d60b4baef63dd61ed1a1f7a02a70f938b86228a956bf7c904d37d22d0a7c90d95e6f839f265c26af1df2c601a7de6717a4a13db3ec37af22e93112e1d078bd63d3a3015ce272a8bc996611247cb8b356f816c91853840a143d4718cf1c7cc052371c60d29b9b815a1d6ecfaa9be2e9a74d8898d50c4a9a618256183b443b64f7252903ade4c18b97e7651ea028cbc2413f4e36218800d079e238de04194b5488942d43dabcf66ad1c5ee7fe2d57ada6dc98efd3115f3e736b1808491a0c08528f462f608450f9ec844eb2f0aa96918174b646f7d3a62b5ee8cb6eb565c1c6989adf92f1a16768342a5cb3ebf22512888bd55800f42d0d269372055f5536a5a29a9b0523f18910a05710650d9124270d7e3a59a10c465d2592116621cc1619f261ced902b7ffbf3a6f71319f686d843b6f6a03e30903b3c44dc1aa3a72b4dc0ca9de63e8b3e961c351b6857575785c295923787d9def1c7c9f368d6c05c5a111d94933dfca94c7f81cb1635e20fa7f139724a9180f8f2d88eef8ef49c3492b7ca8e1047d0dee390c7b3b9a4bcf0239723bb64051421a29e522e7825decb47ab7ba4c69666c7b205547631c72532755428019c4197fc40e3b1aefa9db3622b72d0430998443fb52cd83e2087a576be5edbd22206ea233619c0fbbcde6e30d339ea1eab00f0699dd3ed0b37c1dd841f1ff4c3ba5a9de72e550e12855ca7eb03fa6fdb27a84dc679beea8fd94be0009a8970a943eef3cbdc299dee0c15a8f65fe517903cdc7a3b71f0d3ce18e02a97cd23f736a142ae70f302dea99171f6f80fbd221f34f45ee8b6f49903850b52886a9d8952e6ce4aa7a0e00b005fa3502b09f5e7e3aa3e5e58476635f50b085bbdd4ddbb47b9ec638f20483f3d1a7c29a694a938c4b5ed0e9a79645fbde40ad60376d28bc93685b8c37f49a4ba4d4f7656d704f9b7af938800ce1af7fe9c89f52d34eec981924cb714a43d6b854a103b9883e5fe7ac12d58fd2036ba59b7b4afe2ce6c45a12b68b123ae99a3da0a237cda069e02af1b8edd0f1082f1e1336f6c69f3e3c88ecb8a7901086ad20ed9e6a55694cdf91dba89777731633248eb0cd3a6c7f504d5967d593eebdfddf8380296907dea33dbd68e52f492a12d5c9dba9bd66354ee1873cae81b1b9ac21742f0992ba58cb21b7b3f2f8dba978f399fe8f008e0ddd0d1d7018bce4210010427cf17e1a49ef868640c9f4a5717c138168148e098378c425ae871f42a2accc9151a6f92e8815a0370251aed0b393b2de3b8d9555e41a010d9482fbf0a4f3efc02453a9f33ce39c1852bde30c6abc021af50b395569cb6dfc1e9d43a5e82834073077ea727a84d6f5f471a6c023c937b5ee85f342ca230df908c1cd83b7db1220ae34b655490fcae81c2d7ce53c2636e547053e98eb911d0d42a5e31bfa5b3da6977571695d05f4539a154afdae3e091a4929dbc5cd105e3ae5ec1b5daccacc81745d602cad5059024507097e85f1de94ecb7a2f2d01a6f4ab24b71d334d6829d2513dd37a653b3fb6011ed5a89ccb0e33123047c0232f780df391065e6437a888f998aa1b4f02b6885b62017a78b4095dbb4a190de189685465424a1668a58d54d0ea1fe23f8f79251eb4bdf7a89e09b5fab072011b4913b2a47a83060c70f5dcbadc8214a32d445144cc8c0278134725c3ba1fed29e4a0fa0d8c681ccacdec4a1ad72ed934fc5dd9417d1091449c8ff435139bf6d7b4e335e260e0a1096c0f56bb56071f30199936ccb120c7f200ad5b35791041919446a28aa0cb9dd003fdc91c86c19abe025d8c9a915275494b88e9e9ee0a11629afcd6352dc8b341923a091b1080e1dd087ca699daab36f25250d358318d9100eea792d5a5e9cfa763388a069dfbb17f1b3b3320e665e03b537e682a7a8a47d2ad4bf5abf0c046a3a06aa26dca090be7604cb16f364686afd1d78ecad14f1de703056e9d02910f0068902e400d402d411ba33c2c5751b9029d4639f014ee6e1e8d544e14a32911c6a8272bfb833cf0e0c49ccc36616a97c7aa0698e3ce0f72fdd52a70bd50bbf9a6964fc0209f4dcf26c0c71a3bcc7edb6d0eb8a89e742aa795304d4b0167dced285db447038578e17d3ee2bccbb872dfd4c999f8d697b95780f64b0c28398c805d63c12874ba23694393e6f61571a9036c0601f5dfa67a0734ff69376837ca7796f7fb507ea8ca79927ab4f792b4258671ff74e21fb69eddfc9f4d50eab3c9de5af5d2614ecf0bc5d7f1f23854536951f8fe7f22cbab30e6d60aa0d17bae0fe67aabde338f6dd8b07effb834a767e28c0f6e3618725c0be6f80960591623226a84ad1c838002b53764d0920b00f2a138544daad320251f6c1567a42d58c73a40294d5c1c3e7b61088e6f75320b23b5eb72e41f05042112338ef0196d8437b12c5424e8762d6946638ce10b35ba07aef02b0636cd2b949c925ed45ac703b36b949af829b36a6a5a4c39e7dd56a2e0e1807d347730e77e06254c2e1ed5e97a9cb7e4e9e01526721856c03be86986f5929294080d03c370ac9abc5d5f17a125675d5529ff0424a6f6f280e62c424c60ca90395667150eb31dc92de7be84325a10efd359f5624b3bc6913447bbfb58d4efed2b8730a3436a5a8f19449179ae87e0d3c6c239aaaffc000b699d86455de8cd19ac985ac897a0fa2a555f96219d75991841db1498054257e7e7ded89c12101b0b48272eb00c607a76021ddd5a51239e4154e691471f88520594771ec008b01d61e1160916334b64771847343c7a9cf481bca79113626fd64f879a5953eb0b129fa04a06ccd9d452a95eb04b28d44193794c4120a51c26cdece40a3e5a92cf2a1615acfeb02a75db7375f24b8b872508c1a1e5e322892fbf999a854712be87a999cf11ed3fc52f50486c8027908d0d311b1c4712fd4019ab9420e6582bd26a92670b728127e0300596f4e478be6be59374c97983dc2914e523e9776cc3fc3a2f3dcaa7a210ca4bdf8a2a4acbd46aa7e8edcdc58165abf520a7308f2d806bb21b2dce4a27fab54f123a168ac29f1b108d49154b2e6d8e5fcbb748f9c1617b0e8e7ee5c773acd00f91e57693abe8f1e6b11563ede30202260888a4ae57b00330424671cbcc01708ce35a3544c222c0fbe1ffbf016d22cbe9588f89ee71b23e96ff4b2aee85118c36955918479f1efe08444857d15d51f5f35f9444179b9c3205906aaa37903a70d3e484918958972ddb9191555024a5dac70ae8da5a0ce5b5673f7d55d84452079e455a9984b4f4935c491de1b4e0ff5b2457a5fbb56c8ae1fe6161b90c2977004c689960c09cbbd32a26daf1c9c0613f38466818d88203fd0b3aef2fd5c277ff4eea7fb754e8156f07a25302cf0e970a28a02fa7b69974d1cbce08ee5706c32eabd90544a075f9c57892958d14331aab2b50bbf52be195ea3b615bacae14de197f100528083917f685e7afc0a0cbac1c076bf770c00fffa4cf9170918121febf4fc798bcb297a755d2fd326cdde25708bc1e882dfbec0c402937346f79d0a301c007a00cbe384c5962aaf0a49f3439f19cd09b3828ed590e01d0d8b814288dd061349406b8ce6d31c99284c0d7d90d26255bd25dcc5d2d8a5cb0b1ad0ac378ff2e7463a113e43602faa2a9a82bbb0e241668e4ed4e523259dfd22e63aa0dac6fed8a1855ba2824c4cffb89d910510135a816f24adaeb7b37e8301a06ed07d68727f1958452ff09f6112c2af62dc78ef30899cd53d1323f96c34354039fe6ac1916785457897e2cf1138029935346cf8587d796e94b30de122d2aefce8c8cc2d6b179f91f93a3785cc6dd4bcebbda216137684fe78db16ce6de625392a83d40496e719ca04978ea92bef72c22f281c501a4fb1b06c4ef6215fa9f57129cb13527b762063ea69a2c19bbdb23085deb22532209f67d3e2452341b951725f7f0a7104f6d842050af941fba92ab595bf7dbfcf339ccda14fe1646e2108681c05fb0bd838ec57f9e44e4512999d31c3e92b23d3cbc0ba06823a5122ae32a153007294d796154434da3d895f71058014bb14602b9f582314a8034a00aeeb81840a01789667b0b566bf32064c9ea239805e66ec3dcb43de57e01b67e10b9e7b255143dda78bf8d0a65f1129245e1884d0827f640b69675b315f1ba1d91d5504b3c765a93fde2befe7b51c461cd681657fb05aafe01cdf8c1c96de372ca1ad473f06016c68d0b3d25b247634f6af0626dc49eb61e6d3f093dd1d85d2c5a7da15c944bd193017f94456801b89862c7c4f04ee69fff27fe1205a510e0883c2ffc15f75d66fc20d5394903da7e0ac28688cc455fa39d122b31efa6bfe67893982ee50f3a8780797bee361c74b0a8cee3d698c4c5c3e2a5866000ce1cc19275dee9c4dcf37d9646a3e069083f930fd8c3b046ccd940180cfc2240102a0320347516796c83b11359ea5425dcaba29e5d7cfc45fe9a9367d15f4db9a0083b624da8c3c1eea0a828d164726315d00f2e394e4001b82ec6d1ac3a50b22918ce10ba592610d0ff3061d98f3aee349e3bcb7eb95c8c99620f610567123bd7a563ef8c3c72e3263ebc890a115a110e371528db7659fe523e56584ef9207b4c6613162f6ae57bf0d99dd3fcd80f48f30478b1f07067e943b5971ea31173f2770b09c33d440a6b4f23d6f8b280e2424813b2f7c403208a9b57c96a88a7a3420059aeb7e92ba35e65cbe30c2dc86cc7acb6f6a9602e20d21045e790b52742b331e7cc9f20d0cf67fd7674c3d0b693c6aba45db8247ef39da6ccf9bbd0e356c89897dcbaa64b5b44f34ac41f852466309a24c406ffbd762008c8cac3956d22f76cbcb76588236b530d259bc50c2f06b107592be7d3c6394d3f55c1b01755d903b083166ac2528640a8ae81fb0144b3fd99898a87787bf830189345164b0731f12130b822f48263e07cb248ee47480926cc84b0c381e919b518e784086126cce18f058566182678f5c813f3106d06eb1ef98608325b61fc0f4e6abcce616396460870cf6fba39e108f12f657b30c8473c323056136bcd5ff39c9cce0e9fef33b987f9a7155700687f99fdfe387e6c82c919141460db6cef622b487a80294f2c1e10d41bea6f531c44ce09aa6853b1480d51142cf84ad988b3e0ed135dee50bf517d6a88a68964f3ccfb08135c38ef2a9290571f49062730e1393eff812d96587598057fef07faeb84706aaa45ecf28af84d46f5e391334a29f5ab390714501dedf0fb3fbd4694aa9921680247ac8772ef4f15d5d36d0a90605dd31f95ec9c89dbedef275f9b115cf7051f1334a0cc66a27f2055be6af8065ee1021c3e6e3f079986372e149fd2cb4500f17fdca43c38f760ad889fd95593c54dca3c104525d469d28bc11e3dae15b44138c33b00ca8169db145e8c0b1ebbac3d9dd88c241a04c04c318b44757d23dc8c5a8f0a1246bc5d46c6f6aca5678d89f5cc8cd4d86a02d187f8613eb6204ef5b0b2f3a35d81d483f70170f05fc9578f1e6849bdc2188c2b55037f63de9183310e68ddbacc4156adf740b2a47142693b632688b52c2b5e2df50f6dce1dc07beeac18114b215a8c07e17729cf244778ba65e14041bd596a1b509927e9f063b634d540f47425f7582484c70551f1aa40e5328eac6af9d133b08c893eed03bc1353242bec44b368c027004913d6b06e1f23827db141fb7533ea3836618ab74640fd23f2d589e533d07f5830b9b7127ada639bd7ceb55d8e54b78431a10e9c9da1e75540c13dea0d61df60156342e376a12ded3ffe375097ea33a8c1bbc6570878c1d015cc20f3541960394c71cc938c92f605063f3b6fc045d6656b72d0f23bce2945c9d41110a45c2abcb60894095c163bd576510288a274c1efc2eba238f61c40a1f3314ff19df41a9b22c28ed123c3490a05016d8c17ee5218012df8482e108543c8709838170f23d71147cd02c5dfea6c777a6df710219aded3e9c965186cfccee6658cc95c4f4afbc16cda04810371242dc60a04ffe74b29c81c7a0e214f1e520bf803c17fbd7079b6f84b94ec01bd2b50fc026e71e18e02b3dbc1914b7c75bf15988c760d4872b33dc59f763ecd6a61a06dd30635d53703e869576ecc8882059c9f24e66f5e0302a473e0a3a8e7ccfa42a18c7e6a195cc08eab9ece0eb2e023d08dd9ff0fbef807c06fb0904b78830f0d24e0567325805fb802560207ff1fd94ac04a0a576e4af645df5243eb643702213adeb40e77546a54b189f897c86f614c722117c2072f647d41a16391a4c5a864c0b448fe7c0fad277c4b60139010acc70b56828fbb906f4f557cbc90b4727a55e4420c4ef4f590814c089da8eec60691e0c859c29250087e1dfbc8979345930d035a42e863d738e58aee006206c79198ea3c35e846e3eaa6418c01972cb1f3775bf7dc67c4ad9ef418efaadf0b68bf0fb1b8b6e0a416682a3fc93ee233ec7d7340f67f16a3608c6838a5f11c6e70d2a6ca49204fa9d8e658cd374bc92e968338fb51398b94dd89871bc031de4fdb6436c3ee0550cfc7f232e8b956595e4002e074844ade246f6489df4f6f5baec2f0378a793ee3d62c4be0dbf56ceeab9f0a6ec2e1cd1127464149f9d12bf76a5d8428c636cf85f518bce761e64423909f25bf316019297720a6359fd6a1f962c1f7acc926f2d93677418761c51f5f908c50d71b9c9a6e227cb08a84f9f4cd5ffc70cd9532ba570404e6dddd360968c4e448eb94e3d43f73be9c1e4eff5da6de36359fa767293db0841e7656504172e1fd87ec8d5a83827434b7f147fd0b91fdbe13278245159da11345247214b534f7aeed23eb66e43554d31cf230c9fdc61915c3d27da7f9fbc6b7ed22a272af8037e07bf74a45f97ed85e9395186ab25ec9685329b20cab5ce329a21cad63311cd31bb44953f64f76c0785d13aa3010e3fb23a0990f20539d9d615f35321598758e09481cbbbba4fcd677a23199023b78a666338c5103ba1074db57702c12e4b236a2c9c2f1a67e70d29320d5c00ff08fe5760ae61fa075ced841467b4970f10e2af29e745331ea07fd297f330da92259241601b4380f535889c1633ec702e14218033923f4b89d8538c003758bcc19a93b7a36523b368cdb0b166be707b3e5f4811bfc51917dfe5db7579cd3430aaa991797ed910f2b5115fe3b3d52adb6705ef2b71c042f1b00572af61c08143887b87101260781378c2206ebf95f8e810e9907cd1404874552ba95ba2494069d07976b26044dac8bf41e880c855be4f18e408391bd2b20e5dc5e6224204872d10b909f2fb24e3f83c34e59f7433087c9d8401b3f6f371872a13cecda908c4bc7008d4beac68306084fbd7413992a2dcda15826bbe49955061aa0cb4810f2a7ff831e7ba6c5892ba8878f7a26781fc984a60c06fec16ef8433937a8d7f9e52e3d4c1b168711c98c47ef86ace22e54b0e6d4fb28c758c2e6ce8a725750a660cc051c50fe746561837f4b2bc8e49750db395fca8a8d04ee4a7c1a75f926454d6ba0616b1f2687a8e7418f5541c7ef9ac35505f45e251f7d58419a36035ef555d1dd18f79479285f5b77c158825d3724f4c2c70ec4f764426d3d73b9b6a2c4b949c42d9571c80c26fe0d8d4985b4b933f75028c3a2c9b29d147b74d65d4d16ac00015408345d80006d8ae962dea66261520387ea77bfe5c6fc6b4d1a831ac31d18f3ec8f4e10fa74a61c570c2e01b822f2ef393758cf0005b68c37e96d6b6b64ce94bb801290ff27b51ab90f1031a2058bdb87438a5b96403d228998143ed8a9ca19200306e7dd970c3fcc6e87fb52b118c2fd00abe58d7ad5610e98a65d32a96d36ce5603838058bd9a9d3b4286e5e1ac1c5b23f74148b7cdf23ba8b938d7226f182f9657dde02ae5bcd2156e780a8fe02a65f7b99be209a8ce83af824e6186dde52a8b03544496c0a5d7cd2a5533bd842cabd20e6dab3e973d72bf38e2c6e588e7b720aa405a640942ed73c2d80f46510eee03cbbfea8d69d44fe7584ab92dfe1f5d5da716379a6356cf560bee83ffbe2a87b2f42eb9b2bb9c91ecd1fba7ff0a90dcb0c65658d763a56e0e0bb0b0c19306aba78d7a5fd2dc773a93d7802bb9f00fee57c22fbda93d884351354f89f274beea1c959dbf768e0b9923b5445c99d8f507ec71b1e461506a8b5763664c04711a52503997673c08fca933973284b5e7a833723e5bc6a862b61ca941bfc9702b58031d1bff490d6b5495b784de3449e703c45c0a60df4e1909b49ab706202226365aa3fb291da7f48cd11acf573fb7721ac56d2f36078b03e1422522c56815642f0527f896be8fefb3145626fadc17d6db3a7f26915dc2bd5ee17d84677949ba08d060b70627f5bf0f3c9249122570512722367b99cbb2cc99b00ad7c67b2e02488103c40c5481c235b64eb80a7cbef9e1a74d9a88f854d02b660fcf8ffee7e939439312aa1091fd9e42f87f6be386bcb501393494586135636146605486283e329fd3a1d8eebb3f5cadcf15259fddcb767bee29775448dbad08f803560a16a66da167b17cd11503efda8fc8e8bd4134412a63a3edd5f9f0be4213cea3ff6ca77e7287522921c46d539f8594478b99c2d09044647fd88121dafe9b1685e5a2e013d208a57af9ae50521443945b1f89ad83f1f36086dc26a99f0c1371dde0cfeb5f1b418dabdd07a88c512a4f05042913086cbb7ca144361418fcb352475665ac783e42bf807af32a6ff0a5cb57464a006db467f733b1726d979d792e8ca34e9273535e720bc532e7a5e6ea858a48b92933548e706865a22cdcc679e70c1e323774dcbd322656a77cf8a8eb50ce59a69ef874a2a4323011ab2d16cc2c17360100ee39915a6b181970d39e746f6f4c0f8e17330646ef46359dbaa7f7a25db9d9c14db4993b3b6d113d8a9a3c7f829b2f587ab540af81643db154de0510f8e01ecb4f8fdb0407521662e664931208ac64b5b8dc3d6835123725fc90d4e6e40f289bc3290a47625c393340c68e809060842d63eecc9da28ac39e817de2a31f0b28cb9c135649e6f998d41f7617a63623ae7dc15658fbccefc5273c380b324d56400ac8364f059e0b826b3334d68c79768c6f50580708cbc15aeee8754f750ea412cd2d6f868357445208f3b356d91aa42fde9c65216f89d462543fa999122bbfab29847e7c42577a189ba78551761b99cb1aaf2b0ec9f432496069dd361345e7f0f9008a137a70341ab4d3ed8ee4daad0298361705377d0294f9debfe81870bc1d4590484b9d50cc7e5eea1ddb122d741e0ebd2440c2b3bfa1b046b4637d37b440b4621089848cadfa273c354cb55d2a7503a33d00977752d7f20381f859c9c2b61e8566dd15a1273c80059d065ad2f1a2692346b5a514cc087fb58ade94a456855980aefa5595da51af53c2c40c8d2d0dcf8c719ba835ceb4e84c862b3472c216ef64a9c84eb54054ac83f67af00fdc8b8b2d562b46dc8b594e7c108908d2aff8beaaa05463e456da5f64bb11f4457b450ba08c9aa1ca54ab67405b0b52b82d55359ff44584970fa96b4cb6026e924f5134fe3cfff021427598ea9c9ebe0889af02b5bb5ee558e5197beeedd79ed341b874f58ca76360f241a816c5f3a24218ebc2bdccb037dac45d391dea676a6305c9bd24f650c679898f5756f752b22c34a74ae5b8b394cf7d49a34ab2cbd5d29fbdc4beeabdebc5cfbc797250b243b9c3220d87a93251153b833fa85320d20b7dd93e05302a2d9a0e5cb1ff0fda110a25a3bc71b2ec7d09e4711c2132dd4521dde22df60af4a109b62a959f5f285131bc505cfb4bccbd6de2cf9b579e169eaba6d531aa6e18a9a0171bd2493e7e4f6c875111ac2771857fbdb0ad20859c4874dedcf137e9d71a3a1d853fe84d39f364a1aa594c9a7889382b3601f96d0c93df59ac15a31ab52026ac17b9e166ad8758ce6b8456597e0e9110af194516e1303697d162eba142598c34a1fc8634cfd6dbb43e2b40d59a24e6f1fee358d3d72c6a059acd0c92adae545c91ca947269e7556c41891391a9b02a643e4c9e8c4db307541ba3fefb965af89451812cbc431c6e1cf2c6e6b4cdf484df311a71702120e77f981366885d0a3b4ac49a9aa13d7728a029753f7f51bf006eab8a4d2c66efbf4fd28a5a0e620047f4eed711a4bc8a4c2f3f04c530ea45249b10488c7a95b0b2988e62516dfd30ea452467d918f574f4d8c6bf972ce444ec023bcc82d3ae510450b1480fb7fdaef2a73ca687e6a4308d865306fdfe93cb02a8afc29b653a4ab57146e86cd0b15e18b72c1835b0e44d6e289e7856ab9788dc8a1f1e3fb57a8e73cb5f855862067b1d440ba001b1492d35f68cd0fa073d4e39f261107ff7bec37cdc05eb98021d5792ae796895d024142944e9cb144c40e25c0f1e40a7737a78ea7aae3ef97475cbc87ee52fba9af343dee34bc98a6ed5964a6fcd9ac18fa7620d09cb18eec134843fe9eaef46095496c720ebe72f5d7d335f3c014d576fe9def6a3e23ed23dd3dcece2fbfc802ef0dcd2cadfa09c2c968114bf6ed929539944e1b8ae5ecba297fd97fcf87841feba7ac2336dd05194805d7d18dc84ecf9d5e723fad5b3681e11e749f5abd7771c9c68a0d39775da06590bf1579f63ff72e468d4346893faabef6651952bfa7ced11a4e000c10a669c75b4223e3213ba4e1ed16cc493f003e88aa0ce2b2544102412ea955679fe799686d15690e8be3626c7f2b4087a9b12c43dbeacdd1237afa875007fb7a8b932089f9cfd1c9d4ec55262b11962233d796760e60649bcf91c809bedf61da8dc539d428bfa0afe7968e8d9bec11e41d6b842ee4bddf97e66bd5cf5c592cfb9f20b267dd609cf318798e5e237b1d74996e121340559a70ec73e278bdbdf63522413182748f89fc888857b73222559b6fb747242eff00ad72726faa3b1fe3c5edd9cf4a46c80c142e9ad7e718861e90d80537678e8cefc63ad0fba95bd952a7e651d66b3a2b8d84267ac034d26252d9676c788d1af50aea67d3a9847346229e1dbce0e3a7fc92364fab6e9aec8299da1f78fa54297761630ec9275d6952162947210cf0dec7d7851fdcf50b5049971d82f52b5d76b8f9d29941a070dac63221b8d3cf1b73b8b68eb0fcfa33bb761a5bd19767bd81bee45a09dc9b298692d2f18571a71b0a93a3c8d93f619fdf4df3a9c7d2e7d8945244c57fe337717a4d3317d54628970df4f8fa5301e2def1b43c221220fc50535a28df4ca45748a7a229faa9bbf9c5a5bd73e5abd49531d422b61a693aed57060d2d1e3f04470c7411b73ac7a44c58557785a56996e70f35c3504628280f164ca4b5652d37c345c024afc955991fdcf855abbf4201cd66bbd94a01f7245dc02bec1d1b4f2f3a7fdec359e3db8a036e826f8a3c19abbb348ee7998fe518b1629076dae41cbafd34857b2ac44565b22418f01ebc4f4d02ece7c2c838f4601fbffa261911e047750051a7f64384bb8ea1a82e8d4a09da9ce7c4c413e7cac60c85b604ab0590410976790f19f2f61c29add8cce65142074aca9b964b395b046b9274b28dc04d056e5531161d63cd700214c7875825e9f29ef8c7250b68e707eb963d41bc7045638e8f17e37381507fd31720caf33811e67a5172f5b56030d9a839e56cd582fffbd14ff525dec73d013bde8a0d70d47f0c4eb9070122f0687a6c1a90ea7f3a77edf3078f578ebdc39c207b944492b13bfb39eb980e59a738e0470a4902619e9db0ec3bb98bcc1a7fdaa088d0844224180899215bc81b42611f706f3b326a4260e3d3968d6f006b8316f8d05f66c042a342c78d0401c8cc85bb2dec31f7181429de8b6902b96800afe77c50281d9e596aa7e2e87254d59832e91aafe46c3522974f62aa1187d0ce6d62066defab7f39fbeca84bb10d098d927b1d2f98579891138d19262fd2d5577c2383baf14df3052c374425aa339349e2f800ed086e4f4cae269785b831d15f997f63a1af3bac7b6c09cfb8bceeec4895918b4fb153c3cff515f8ab9e6d81b23d4386b46937560a7eba7665e13b5665bc2b41cff744cf01a8c95892e6aa43afb6dceaf653bfe0aaf2322ecc764007ba7f57255a5ff1b22b5d289e198930ec5283c691fe9c8c9f6840c2105c97d7740082090f097bc3b4bdd0f1af025b21400728198f63e97085c8b0191323b2ca99d3bebaa786a0768fc3baac7374ab86b307366c6fe5f7ff458c499ae16208bb1dd9c8f6f6d0a15021ca01d506b043e9ef5213b970093b307590588fcfa8fe5bedc5e59e702fcb320241522f00570a9806acd82ce33f4b276b24e191c1ad6baff7e14299b6e9e7f0cbffed3f959920e431a5167553f5dcc4c19ca2b556ae9aedf80410f4560347b62221a7e64cd9103c0051c8239526c21b11bf1501289a523608a7c5fc1c72c2e49520a7841bd94a0d5017154739317da5395c2c5b3172f112b75f0069e0880adb21a8ce2bb044585529b00f0766b76d1c2e0e4e143d2f892647669292b1f11581d262d761804d105f51d4974892aca8cf2237c3de3a55323b43b03bd202cf06e8d233eac317e70f155d72f70495bbe8a9fd944411a511e40fc2d6c12259b65b82cd4a82b5241595fe2aba991a23060ae1acbbc77bac652d1c8d5711c4de2bd33a28a6bd77c160974a9bc391d38e3cfa55bc028cf07528407b296cef64d02b9ca334650cb26751c7561dbbf7fbbb054a249093809392f1311cbc5dd3606c0ff213d15a12f6dd205e96e11836933d8dd0efbb7da345288f2c87ad3da44852b9cd42af6647523a0a27da281be06e785244e67f178d6dc98995732bae03682fd9371e474e344baddb30bb099af69a6f67c533215130322465b5ec51cced719cc7b43535ee9d8101a630fd06d57a686d7971090cdfc801c75864a81bdac699bdcfd0679e8a1333962c53c19fb39b19e64cd397121d9629cd278345a5da52aa83ba196761e7e6e02a5029cb233f24eba1d42e700d17c1b9d09325dc8f499a8ea2cdf312d5e77f8cf8dae5edefafe12920c952c39650cdc1999245541b0476d4ba82f6c4ba5ab6ef491f79c668f647eea8dcf4837bc2c1afd427739678c89266aa2067648238100baba48a5a5f0b29fb813366c319c5ecc47d83e25fd0b87d47d27fb2b3705d818c29567d7addc0c9adf5f685dd105cdcee96d71e54c91ad0955944370c898b499e899569a4eb330eac954c0a75e94c4d5e83a2d67ebd9f659ade8760b059e211cbdff59660601f7dd0c2dea38bc015d2a898e29e6ade61686a0738c72a160c35eb0c32012c5cd2de4af1a8c60ea7170739d0e56aef475cbf86b6e6bd2ee52e2d44ad6ea258f1a36fdd3e613098c5caf837403de57e87b85b8a7335f3518c9fcbad533c91eb709216cd8a75fb04ce0db63da213d7136034c7ac9d56cbbec7f015d9925969e57412ac494833758661238968eb9007498199a834f06cf012335de835fa3075a7f6ffd54bba46d808bde1ea905d246475b941d823cfc77c05350be58b2318021b9b787142b814703c4cd21ad9056ec13a6239a521d77ea08d81fe79f96899a93b925da34429e5d50c81fc3f8e80274a8dff84d1885fcbb2229e4730f9c09c07dc0b875ea611f6b3c8cc898fe925df5c6d3cdf0949d9ec8429f0a4134321247ec458460e988ebf525fef59483185d64b3c51dc41193e81a6fb783fe69d0452b2c3a682b29190fb8020bb1c1eba966ea8dd700fafb747c4289cf1bbfe9a9d6f330b3f8835bd5d5115ccc2cdc74228c598d7f123f694496d100a1a6f1cb269b9cc670d64e1f3a65e0da69982e25a17c1f9c590bdef75a74aaeae46fd4b7f90d71a3572df32f2910c9dbf42bfc559a8af500a61e6cd1589696ec39ee76558e36e1f98a948d8e6399b4157cd838b4310f42918953f47f4d0dbfe82b5b0d1af268ef2d92d07e46ac83238cdca0aa0eb91f299ef8dfc082464aeedb875b431e55ac271ba3f38ae8c6f906e06667e271036b8cc238693c1743d3c3975ecb1851f4c8d40fb022e964253f401057ccaec6dda5006c8c9b9164f9b50999dd9d15a0c3f4269da0597d7a3bfef04e59faa6a11c957cc988e9b18b67cd42a154d509995b934d794f9f60e747eb346c9b69a63752881e300cb48aa17d163bac4884c5d1639ecc789a3a902f23b397d75f87155192d96916bbeb3796596bd80f43ff080c335b7b84453effefd88f50f8fa9798314d189c7f4ffa32db512c96579757e73198b56108ecc1ccb00f02306880d9d6d8006f66c9e2d51679c0e01e7071842001b5f16a96d74ef79be7d0d4ef6f008737c723d70bf4a289306f5af9b9af3f55e18e820a8f71f31c7d5877fd17b4f6d9ec3fd4c7769fcd9a00e90e02525f202614434e084f22346b904090b8c79184f67a6d532fdef175df5a41c4fb460ab6f09994227191314037574dd45d23144623d8777bfa94aaef7a5df2c8465df0de27d8d4a5e789f2a2bdc2acc0f60a6f8073ac51b22bcde7e6fc01a7388edcccabee5c5c4fe2daa5dc142b2fb2df6238f3be488a7418a30e67d5dc8948d26ff0c064a8abc95eb0eea3f4a97ec498badc749190368711b35114aff925215e1c1afec4bc42aa68b960a8f2bf0b887605ff6b9e6a53cf01b85ceac03853569c80ba46f32f2d1feb654210ffdc6fab842c078c0a20a17666f38503e2f7e280f2e13466a82c16f68bf491d4dcf3f785965cecbbf6fc81c5b38b8e0888a0f07df4bebf9fe07068542a2076605e471013752a2099c74dc27a8b02f1a525ea9fe145f8dae2f56adac2cb9eb8546f03d1bad5fdf44185803c8174acde28749c8193d89b786e31cb3bc7612ca481c27debe299bc3783333331cf202b10a70c9b82eeb0bbff860254e41398e75b35d5e75bf22dc9ca07438086856725a28a15298cc7fba726ec061b248039f89988b604214cb90184456b3204097b470c3b765c6457ac75986457b71c49c17d92ea878c412f44aebebd945af775c13154d640da710dba6fe1a050c1072e0cb3d57b7f13fddc66dda99296164757ff3e288c5415166e2a1848f1c82380f9118ad51344827612a931aaad803720450578f02c20943aa172b1077d54ad0edec3f8f17e51faa07cfd809bd797b479ce6613fd0a21774f9d70c29a16266c6d7298a0b36963b18a9e0840ee7d36aa4c514e907754c6f8d9c0b69ea49a71541d02669a91c2e13d4d4e6dedd2b4f693114761cdce3ab371331b638ffaf35324bc22e2fb0a36ad3440c8d5a78110bff85194e831486aa2fa2a3b7002d103ba7ba75e9e1037f18d4870b7b2704d2250d8c01c61b8fa1ae98dc73d16d9037a618f842effec572ef743bbfe7965aa0ddcaddf88203166033d9bb962f4c7f45348e4cc03631ff89ff89470121fe66dd3f1aca4ff016db4d6d3089ad4fd85a790b17c88a4d6e2cba710ac20634eb33762fb08768bda4e7f4482266c4e3854361092739a31491008437f87bfb354f1d239213d247b9048cdde938f15e189140c861d0351883b9904154bf11344ff41c6f6291504f331ee59c77e8b5b4fcb0ae66fde4115c8512133359b484e257462bf0a2ac2734a80d96621770506920dbad50527b5a2c0959295558cd900ccf01084e285f1a7a26ffb424ebd005f0498559327c4a7e12dc51b0cc4e8071aa7b819bb0efabc19a700fb1d0cd8eee1f2965c7b7870f7dac1e51001e0450b045d34ee05cd1bcafd8563564d945d028963a0b6b2ccdf2be007edfa533a68b6820c7cf38e05190ce12c138aaf52323384edd621fb75893e0d48995510ba80dbd90160c0fc10c56e38483ddfe5ee12a045ed53c15446227bd46928bcec71b2f28c090f041d190a799a65a39d2c297f174b878cd726f0ca5127c520db1197639b142c4bdf3670ae86aaff9ba458c94a824771dc13b464a26555602f01ba395f3c57704f83756069c7ab0391a22fe6ed459dd059044c89d10fc8fd5e71a04ff40e392d0631580a804e105d32019b667440899e56e680402c18de0bfc7dc10e6429e5c362c62541eb04c4ff829b823af6f000f25234637c5b4a0478872d95b47d5b3e86576b3e03a6c0926d9166133081eac18018ecf78a64dc14cfbde9f1e8831d52827d45728ab881cfec004fa10ffdfe598f429359887d36a6cc8dafd95536c98d790de24aeed8d005bb85b309e8a6b56017c4d623d1cf21c817fd4ab6f8b4762776aaa544cf97d669ebd797886dd4dd94c0ff157a52366b0aaa1ee85b7b3dcc6b61e0681264a5146641d41728699f9a23ebc92e33e6f33a947f8cf239d22e54a12b44583b08c4a1ee219cadfdbf490f22d233526ddadcedfa732147d38030017513a6ee88b99bff6c42fa894f7c7f7e0dd15be7bf2d3fa0d3644e4c1248abe17ebb0422f8a386baec8141704e9bbd0ffab99f2c3bf130f311aa3d6f19e5d5c051feff664329850c3a5705d04994169db75d85812d4409bb5ac5a2cda4b569e0932d0665a042361914edb7e80652202acddf78f092c167fd10e08f80cf1be6fd41341aa6e407ac0f20560a90c9557f13e1ac3e1cf2551d0da27ce811f198239b041447321e559dd618cdd1f63f69ff4b5914f1df6b5ab76869c3e065949db4d148aabd0b500c19fc6b96eae553467995a024b0f9317c04b5d8f70dc0efdf5e0635a432d05be4e960201e1f40de8fc4fcf8108379096cc0b96c491fa9a375875a89ae83307028f8777c1b67f685ce7c1013a272ae42ee8401352d277606a1659a742cee7bd56ca08242ca9bfcd46c79fdf3eff6acd1b312b03f54b0326531dfc07a74d32c4e82ee000a90703c665f4424e6ff0bcf43de6d029e14727846c9c9d312915ef550c42bfb6b78fe2c27a20c3979a2bd44c1a80621c548b73c59792828cbf712b8738c26329ef5118c10a3291ccf52b4916da2970c1c80916fb7d04eeb8b12bca1147e0718d86aae6a134569ffa7cc6d7441084f406f4280fddc923b2bafd14598aa6c71e5a4878a46d4afeb064dae31f728149085d281f779826183fd28741af0761fc11e8c70e9d8bb412581e225a94b2cc3b8b080dc581a2233e3fc720f50043c8d62407b00db792ba127e024efce82e93379bd8e59b1767f254f3c84e845bde0f1219c2dc1c64b3ab39bbc7b0cc2ec6d9542e203e39e3dc58faae3bb73f724928ff57956a6db323c667a40c71f65eb2709dbce2077598331954772e8f161517209d157fc4a54c4c837565f80c4e214b4d7e4b87f15597ee8715245e0f0fd717504d4d5e947f88937f7df58ab01191fd4431f8636037afc58f923e878cb52685c51c5c50c36fbd3102c34918546d30901f585239968c40d1905e526a050025348ff43ced1db9f341d0855b090c51171a3c44eee7daac1cb54e2c762e20f827d52d12fe758e1038e2290e162057b4405a4ac33ccce163c683bda63f24856ed1bf75d117dfda473fa6c8caaa7302b75e19a039a2fce8885d5881f5613295b0ce7db10f65300a8d490c2311623188d199850fe29b18bafb1638f767e45c0a4a19b7802382e5cf801473777801f72ea6a23934a56c039408d4649dd3cda3a24e1d794e2420606f249c2fba425ad61f1b397a1d6b466941cd221474cc69827977e346182e85b4553e69d9ea2d1a0be9382031a9b8fc1867622dc7a50ecf2560b4d24c6ba7ae46b10b9d813f3453425d393cb80e4936902b97a08f22d31ebeae3cea22e9ae11c7daff53468187c3247a1cafa96c00424baa6c3307d0d8345d9c128ce69a5acea054bcdb9ec7939d41d686a222b02cf0341dd37b5436ceda75a3e701dc469a4bfeeb419d47e72510f7ad143b19472dbdba5b656b2345abbcc5fb79752079ffb978bf4b02ce236f228a69d0b22fba70244f5dc73424d3f01577d93b4a236f173babef865930b6f155e2d183ef94ee539bf1c5383463491f4f2f666d6b409ee77cc16b41aa51a464099542a003b9aeb7da15c18685c66523540caabccfecd042544d346d2e2e784d3be58f4f6f2a16a3c55b04ef481db5035922a4f60425562eb85f20553ab569e3c1ba51c14192d362e85aa72b638375a4ee5cefd42ab0da896f4ec1b312f586f2a9ef5e4664fa34e057164cc3ea586592159578cc1ca01c003b753e6976787fb9764b154fea5e6909cc417c54552003d221b64b2aa6b4b05442af3a524b06921da868209da24530204c233f835d9b8e6687de7b06316cdaecd69b513347509bc2df97d76913b233bb2911585a3fe5e94d8878a84f7826ff6afa19cf32a119469029ae95e10b28097373aa3b5233d45928154549da7eb2fa1d14c7dbd4cb46e123c98ea41f9402e3e2798d022cf4600711a7f189bd7877535ceb102b182dfc8b01a1bc913933d52e740690e20bff8019e1ff1401854c63f767bf150327d2189a876f32dd67037d7700875c341cf447919074eeeac3f07ab5253f9a1916381265d0e218fe109bd82573e0d21b2c30077d0e7b94520e40027965d92956874ec3bd7b037bd8042c9feebb508cf912ce7c50ea09ed46991a72b3628d8f9e030575c11f9769ba70266de6f78492d305656cb3d5730088c4539b65f2416789e2969b9491cc358b7e6d026f4515f8b0601133bd191ab5e46608045be31354cded97062f2f715ec5b6d2513718f7a35c3b2f0748fba317d3c401619cbfaaf1a0dc65b2ead34eb45a03441b3d24a3e47ed3e08145afe360ce72b3677427ddc39d1451391d93ca0f8cb26a2799f75bf8813bb161f6956e11e75ce80fbf0124604b1c9d305f30d9c76335173a41bf088ffc31c81de0e1f8ed51b3eaffee1134bb266ce75e24170cbbe8b89a0a9654bc72bb4333d471a8fa4ed85718b524319a466a6f294740ca5bdaf704f64a4ea6e3e7796188cfaee51df2e89fcfc86ef20b6c638ecedbe34dda3ce54d5f08d12a1688afadc65dde219a370752f1fcaede74f5656e3f5dda3fefbb7b894054dc726a98bad341311304716c885aac6a79b08190c8d7ac5bdecdf0605e23616fa03d50c669d4f072053505a9f08f5a6652f9dcb85b46eb1a25bc8e0f02f0e6b852172b564b3964eaad24999217ed4834998a8590e11fa61a6909fe09541b4a8440a53037ea81484a58c40a4947a746278581832152b0c61ddfb8f734e75827b7e93e89b49728c402b9d8492df67e31a7ec9a0cb67f2f381cc4d12183276fa0e25fa3df1e31afafec2e1899fedce9f11d4f205b5980c01052209975e8a9905968d25e2a78193dcfe43a6a368ed9e33280c53e25a2fe8f4c7504e487070c205f5f72dc70762ab7010a5c505f3cec37f57733278dc61563bbd6705c042688c4b401d1793d5f40efdbc5381d178a4241bebb3cfb2a2aeb6da0a64063926d9ade4a228f2d958b8549933f9f7507c99ef3f74222847db0385b2e31154a6e3189cd51711c90ee8edf9997e1656a18784f7f99f812dfb3b0545ed58446aaeb686761754e5edef542de83b6821be8f964b519a1eca28e0063e7b8279413077504d781890654e8f626d6a70ba052624ce62fa341926a2a392bb22396b5805a009cca52d6bc5b8ab4c3c69a38d968092bc89763d43b3d56e0b0b0e8e4708d1f96728c36c464d8aea3d838bcda5d9a62c52fcc687c188ee7f725655124f4a5995120e5d5520d5e0a543989f664b23021d4a5d464ace080b88c5201e723003aefbadf1249367aa17d5d8d3d2b1e73f331915aad39f73965e695b47af989b8cb949e90956157b402ef5ec11d38c7a79644dd2311841b19641b141a3fa78fe1d72c10fe54d6511db7a02c58ddfcd116771275020868543166bb904d1e61fa404fa0244dbd1e7fd36623fa1584a8d3fe3bb310288691a727181225bb1cb4daedf4ebfb93187722bf65ae4c3d5b32d019d98137325bae6154f1c643a384227d67037a3aca2b54186b03889c59de9d664bf09fbcce6269e5e7d69787d5281306797db587c747282d17bd310a965ac4b7f6b608cd6c4d091244865be33d7986522ce2243b9ba2638e6df233165a3ba02544136b69ce5c296f1388c6087081ebdb7088c6f57a6e8d3ecc9a43d2a5113eed891cb0d1c890d2b8902d82a3f9804ce8f761f253d012386b669b40b372c6ece5c1ac82955d8e6f78d5df26e69e910ff1107d112126f05d904a30b30e86745d76298b3b5e4e9f8e1bdb4513b94b8afca5c8421badf57361e3826058ad38e10f389c1ba43d78843eea4a24257fc393238e88539758f86ba66d44e70653bed5e5df5e80ed13441830290a3c113629884e4f7e9d551ba254dff9fcd887f84c23e1d7a93a75ff96bbec57d0a2efe4b8f40c118abea9a9dac45540d6d19deca4fd17c9aefa809ac7be89f3534beb59f97f21f03a1f9f322f7ff952c5c25e6aee8dfaccf61e3b1fdaa832bd44a0ffd7faf5d398bcc63cc60898558f05e68422c4198f02b1ab6c01796513022ec57ea9db3b6f5232544f5ddf7ae479b18178f2ff71606dde1ba4102a63f62f2f7eb53f015ec150c2c5e2e6a2ad8e93fd3cb172b7cce04521f55c1dd6c1bc6eb2f7c2cc06219d896793ab4ef2ed98a1b1eb3b9f19e634e931bba4cc560b518fb66f2d396d5a29627184933c42662358a11a2687e328da59a23198196ea1d5259db0033c68fde604e08482ec9b8d631138f433acd19c311676b77f98f15384d50158fe9243bcb3fb69a940693b386d7932faac8e574adce29cf69af8c5203cd17806a00b5f57c54c931d25950165678abd7902f9cd75a441ff38c54b06eb848018718ab25daa65155246742fae2a16cdc0dabff73a7698dca3d351e29d64151d4cbf5a0253849f24f357f3951d2d8305e9d30f14d754af989e4ce746aaa3ffb01180fb50cba3de9b7694f2bf1282d18af9a452ad91283f3db88fa995e41ff603d67109796a6d630bd065c040bef39bf70ee65117ec45dcbd628ae1048d4ec0c9f26c3f97aa5c4985846c899acde0e7ea163244ec9b0a47f61687fe25c9e7571cf23f106d3be7bb60932eceb2d14b68aeaf48112d8e7dd4207086dfa3f00af9587b96ea0e0fbdba266b4ab714e2c621f26d7a30cd19ec9986735bab20306237957b44f8e2bcb43b1845c7da6444954a4145b58d38f2fdd9ad00094f68c8fbe1ebb3564013646e6cae798a6e377c9b6ed209a8cdd1681bbc9eaad7da619d43fbd039b4f31329f694d5939fff25c9d3e3f9db5ac8c76ca141a56c238390a51b7957724e7e79699b94f8abcf75ab352e5021afcb3c3764ef0bd52e5f4c4b59cdca4c64563e86339d27f12f4ad4c97c9881b53237ea81344c8d9bab2a64397947e1836b7e5665d59af4bf6d8bca57de713250dd6c07d48a73551cbd8cdfb9f0a9bd32af068d83b1ad1aa5e740c6053332634c12e4bf1a9381bfd364fd3b6f6cc1897b872eaabca1df3c68abd485fbc35dbc8d2abb4f021bb0921244a9c80732db7bde10fbc120683030f4e10aa142af37ba2f9cc23c1028fba3dbe028c0b6e02c3b6e5852bdc86f118cabbe1304e9a88b19a55ba300adb4235d2bc679a4ce534343717da42f55eed494b39904a66d3d67bcdae66a068e576f4bda84ecbbb946878b7cc22772a2af970f064707102bbd8afbefd16b6b1332c4c85d0e22cc42e37833faabc8cb57166fcb1304c2645e2069ebcd829a4316076ee7fea64ab06d02266668a3e6cfa25d78e64e0bcb6de68c0e4e450a8210153d9a9915d6cedf53553808c09531aca01e5157db92421357e20adac5596889012df09e0dcebee7a0a0fc7f3d3d080a16fa879b8717c4bdee1c4e92dc4e884b1d74cbe648fe4354d90c875cae0128f6400f048a0d464b248a3255136a53dcf84bd3cef91811e76c9e2e14587cd027a0d74889c32fee6f006e9949912f774e653ee0c3c787d7113115b97b5405d5c4aba59619e3427b982b1230173adf6ce23d4f66866e5331476dce888e4e473bbee2a3af3b95444fb0548d4065a455e4bdd650b19461bd14e8d226f7f317b94bcddd111f3e17c86f0721d7182f8a4137b58088eb2114c42d88b9268c412032db861a54c2b9c128505ac179275ca004a8507cb61a66750cc037cf62abe369ac9227ede24f6d94f85f963cf20e97536a1af9019d8f1af92fde24a7e8611dea2670c0e2585532f90a874d9119aa080397701ee4ff4e47cb31862b0845c04ce9f5eb90eb004001f204a371285fd8463253f4bcf5c0f7d1a11cfbb8aac47dcbc56046fd7430b1dd32259dcda9b0b12c77cadd88ff5f02cdf59a709b7b6f71013f2c8c4b1880882b882f968415cf88323e6aab63c587762a13be6233aafab3388acf64a0226e7faa2a9a92960433a1b11849cb803705033f9c1da419ef5e5d60e54091949f77fb759d255f9b515eecf1b5877c1c05539bff0a5fc545da8b71b2fc755b95d0b1667762e4b98dea3a9f687c6fe1420eb5dec518c441434227192774dfb0c522eeed9a5b1240169c8557736bd72015fbebd0956e5d64bfbdce9c8f74f9d8f574e963c3aea0e01a9a10f435451bc649f5d4600059207209c1970aea2e4da093a76b50157e828149ad60a06dce5775cbb619a38f8cc3a029d50f91998043bd58bb19b81296103d745380bb03e82585d047aa34dfb01e8b08fc3bf58bf291bd22178d9c685f1c14f35c57e406447eac2cb45886566e47e2efedf03c5a9230e7d2a02bd01a7b71b84803f7ea0c838eb3249b6ce4b3ae2f169170648f7739a75a9bc2fc040b78bcbbdd2d6bce94a229a27e57137d2e85c685b6bc2cdb4017f0fd099d8ddfbca411e0e20dec8c10323faed61576be0dc25d0668a31b02e35885b09bd1b287e2fd4f8476f24a0987ccc97d94d0353488f912dfe98e6eb292b416fc7768a789ec53fe8369c1aa177fe383d6baa23e81c7b255a22f6714fc6c77d8289d56466ded6b346dc9351cd2376cce50fd505cb08450efff303b1bc6120d3e1676f3aed620685a4f4f91bd460cdcfc1416c777d9a84b531c7578af4ca2f50ca90eae87df5ff9c5f12e31a047741a4720e48ee7de24e20cc58d5e7ab2664b360ce6ff6f3c14061e3b180534c5fa8f9ffe838f95d3d83baa780b9411396f25eaa1978faa325222695e3b7688e3411167d4da4bb084858a2a20797fa65d2025706ed90b369144674ecdda58fda82c5524792ea868cfbab877425008ee2239cc277a194dc09011b21055eef0378ad13a6943fc83e3abbd3da058250f4056f3e3ba2cb545f37fc2ac8a59f1abccb4a20afa9fcd73306fc975e291d648060a776b875afbd90744793b266b9dd389d3369f8ea9ba677409f937a908bd4bac7df7677ad5a062407366d4858583d8a0c8424c51013fda57f42c3fcb94359b8eff2b50cd35f1bd2274ab0d2cf477e5edacab2472094305a14cb12fe75f044b2d503c38853b0529cbf7255113cc6c6adeb490371a9d136842f2c2aabf6232f126364e16fc65da2d339467c8e8cc8cb2f193f50da613d2bd30563b62134b16cf0250700cd1a2f59897dd0c57e51b1d49457f8a2c1686dedd07d3b4ce94290d15957bc05d1eccb953e55e88550ee3a13d7de34c8cdb122722ed0a6f43cf10a878e5a77fbe3bd9d0f20639aeafa5ab9aaec9b6a38568d709fc02a481d5e9a88770cdf2b71d48bc591d964c3c128feab01042c6e8857ffe80ba23f10da6bdcdc44d5379c940883825292c12cd5c6abf47e1580ec04694d78c40a08c0d1e521a2811d5bf9a3bc418ba915f57530e0ef735848a87ea783af8a3456193a583cef3ea277afd0db0a7f348796c3e8c22941453876a8caf73d0f645c58297820264efb4309429a631ab01d8335419c53167260a2821f144d0666bf4f6f2f64b59d3ff7edadc88397a57fd62111eaea9afa41e4a8cc8819ec47e540e335fa15a713c81c0afb2e244627bcac9eb52ce07a378d0598c5fc123cc9f3ce9dc808b99523bf15981722e38815cba332b158e9d32f8431646c74c2795b3c3f53c5979f37e0223e9fee00b3c56560806f9d0918d03b50b605b650e4df5c16bcb47d27b797f752e9de47c5d5d05284e1cfe7e886198bea90820570587ef2441ca8986ae72ec488426eb8484d67d94a023b909b224e2a824638ace082cff2710cbe2eb79bcf83de462a90093d31a898667dd820eb1d30ac273e619f881feb7933198c7aea54341a72e0ed1e90210c4b666f188a66fd7ed69d23c18b19ea1a3700ad0935e3e87c959549156af515ee4154361929ad9551495c9c516af8005d8d4e0b6311c270edb6d8c782ab244564b4bdd70eca11f7b7c95d70ae89276b6b5dbe86d45698621040101518b20404322156fe0f65d745fab2fcbd0908103002e2191f20b030f2c601e310f3c6ba9d267105325489e8756738f60b78e5ef815a48c1273ff79a6db649ed01878c28cec2654319108b19b4bfd09f26c546aff6809300588d859297d949d4ba7d338822ccdb76a6ef485f98b1a79df5844c152178cd905c29138b963e8fad3c38cf430abe7bba6a7f2be2929a202f0f78e395f444805fde4159a2eb35be96d8ca433e69c9e95b6f26222e657f69699b5d08eecda0ed5b12db318e9855da881730ce777b48adfc8680f7636e645dd6389029019515b2f5d4ee384945b51af43cad92059ad43eee550cdb24755535cd2d97e1d19cb41ffa02d0d055315ceed4b4c2099d1d0698828b646dc19229875c498dc80be1e361a2802c7f6746cf9cef06551710e8526f6f0edc73281db254c54b07f3433578d50fcdac1ccdf361b1cd84ccefab688232b63e658601f06d2bb8e09a91f1b67886de101a887b6fe8908408ef5326b3e45b410b7a6ec5f91ef5973afa102cdc12e7936c5817d9d2edf1fb2cb1a6951b55ecf646d3aeab794662143a00a6adc6cef97a5a807b127e99af9a0ea6a1756b033e017d3cf489f5bc4f9d06897cebdc678c8941f9722be80d9e0ceebe1077a3204e1bb7059c580560bb42ab49d657bbf18696dbb08d2717c716600703eeac4e1ef4a4512c5c5b94a58e25963edc5dcbd31c3909f5022006485bd32070a1e8f15251910b4da2bc68a97973f022b76200c0e2bf7e11d5f34b17a908c84816c42712130ae42bd3388d850a7a219e153d53cdceac5c02d4e86be9b66083ae439d0bf68138f11b6fec82761e855877dc3b8393c2c3c2c0991627b8d7b8c3b524573b77a365a213a08b6c24b9986ddd73166fd886f3346a8ebeedf2357667bdfe815b9c74482a00148bb82d327330c79a40dc4282d5db7dfc211c350fdbe5f099b4cc04f065477d6340e9c04eea0f3f364b0f46baad08f668ae21ec339b2529a3c2c07bcd36e99f546c76fe106aa19d143db362fc757020dbb5f90ece3998498b8618545a0cd2827f6f9af74c9891ce5df096d691b5825aaa6feb5066c211a5b2e7bc51ab4ae27126598eac95c298e9b41f9dafc27e6deab6c7df156937922cfb20cc2797f43cb45a6f122c0e202024556707d3357c507ad08f918bef9412d1f9836e20fa23a4444f219b0f12fc888bae98b75a5a40f013a4ce9b009fb92b955a411141bfa6b4cf6c086a983391b4e3ac8ac83dbbf4be59bf9040f8923f21c156552b658b24d24e2eb8859b7e4124df6401201fe9168d27c1f00ca457f9fe4128e627e549a73c4f26d5c74bd9d1a70ec7e552892470e4c7308dfb49a4ebcd2eb89365ac2dfc01fdbcc5843e63c04630e418a8d7006c16a9debbba29cfcbc121a76f0044d038b67fd1227968c6f1174f87a1541e4e37e02718e6454cdf603f6b800321e81f83dd98bcbaf0a208639e20287d0e44c8eb24cfd9b0b97c5607bcdd661e1ba8aaac98d9c0eb01f30db294f6022e10f774039a006bec36d8ab82e698d0443d5708146754090975cbc5e87fa7c26d0e311cf83e88ebc53f7ae06da8eaaf4966d4c32699456cab29895d974fe16909e3d83fdccb9f71c78f126e0770f901cb1c959bf5236f111aca2116173fdced797197cc23ce4dd78c70e376d70fe8c46877cd44f7ced3b1a2b74050b15b960a07922bd3d38a44ee11bd061a4f1e9d9d1afd1ee2a82333bd9a0056960a63db083f14c01cbc00b718da45472b61fc01c01cb926ca2f0d263ee6118cff1f9ae2cf784eced9df988aca52280983a39a7051ba39718eca7a059837379026bf7a43e9d5d1e471a40e5f2ae646e4f4dde20ee86483e05ed227ca5a2d137d8dd15f30f9d91789cb8228aa285979c29ddb8d299af9d23b96ad145f63f2a6954fabe1465801a58e82644aafc1334f1aaa321087e32f61c5a5d9e14ed0e17f65363c4e505e99ede20e260fa1285bed89a6950fa4f8de2bb389edefc7a9026c31e32eef1255b645b25e1bd8d8b5a1c0c651291b5433b2f11fadb1314e058ec8021db0716f6f2a6e682f57c88a6576fb356efeb4c6e3acc28f7cab62b897316c25f68bf9b559fd16362598d4f47fdd35f1d11e04e29cfd07c81e2961002d53bc2f00217f83dc273a60020eadff45d9dfa3022a3c03bb6b503f690d8df89b504bdc2d0bcb6331646b317af942351871dd21a54e054d241fd8bbf6feb5d2d0095e4c5b8f8923247bd71cc3b4ae47da0249469d18176d41b354ad27be8f5c1c9db0112e1def8c1c98328f179f065c7502b05c82194e2484ba4d55223ef2f31a359da8c8ac498eb27a1b002d12794bcbe222a77e1c368247ff7a60be42e1a70d887050eabe824ece844844c183d7e6a9a59b9e28305c25840c2768810f2e16cbdb7c600db676436a8531bd52213cf442c662fa6e4899b8ba0346eff8ab9fc5312cdd272d45477c8e71b7fd15d31fc68094103fa084148c86ece57b7e1265fe6d3021367ad01856bcd78828fe2cc9c3762d768ccee9dd6afa5f1f01595d74ae6950a875012809b931758e8814ca030b1db70e37e01f6459aa28c7214442df4ad8ebc7949d17c0ebb6c47c9885ab5c201d3c07c07ec176a8c4498cdbf0f68245474253e9b49d328317df0bd59faec5b0e49774e68322d968d2025d846ef65a898fc6026c55f28149dc9567aa50f467c4302c60a627504080b7569b71e5a7bf269bc447ee1afbc33979640895be9e61584b937c2362490d6ee583074c72a7d8e14cf9687ac265d04d66bbd287810f2995392adc6ae30e4c6464bcf05398ae045473f6e8c8d8fcc605ace417e2bc580e04f8b48e45d89e8ddffe9103ba0aa284143d4bf40b5ea228c8ff95c5df9825f546db4b292bc00a67c5b3e97f0d468b16c8923332d8f3043843a75ca087abbb8d6202e8eae570e93ef8b92beb36cd597c706d02b6fd56e529d88b7f0a1c9b26ad0d3903703c358304dc63c16f0a85385203f8f164697400a0482716890c30308d682a6ac7d14bd41a57f0c4b88655bd08930603eee17e40f065027c6c57ff581f7b00be8242d8a16327b342d524e95133c5552a02f0315f6607169a5696cd3658935854355f6ca7e3343b4cda504c971a1fe83ac461ab2e0fa64d20e09b3a9182c8c9015fb7e6e33179aff0b94770fff7a8ba015fa3daf0e0a7d2c495a6314d9b118434f84ca3951d4d73d82deb96a0e24912bcacd441d1862d15cf064b39eec261d0040e6f009d546f06909898e946366d33998f169c2da8f071c9815880846d11aaee97b54fe1538695664d49026e08b9c0ab9c2d964d7e07047cc6ac3723a33e4e50f34ce1186cdcb963e44b930cd137131a79e7873a136edaa48078a83f25a3953880620f9d51d325d02a25da29c41adfae5c2b5067de359217957b1ecaff1ee1f46f7e23be291ae8515106817153b48bcd54ab34dd7ffa839ca72746b5443bbcf06cbbd44d20d9413b974a6d622d43275f4c34da12b57bb7cf8b80030fc69a384231d174fc42007d0c370f506213649a9e7ece697bb531e9632682d2d04314d7c3d30862c89cdf4b1e601e661a4d985d4c34421df21ce90324a2e9e4ec996861789d254ac5fc89c617a4a74a04bdfc46d49f5d8c03b5046aabfe0f92b5626ed9c250dc4d289a0d819674e8b5d940af4a41df03d0831e53ade31f6bb3f22c209fe2a33676f7515816c77f4c507169e1b92c278c1ab240f3e083ffc3d85817dc2e85b0ce2932ed550d4a2def90d74601ad8664552b3a0f5fb71596ac81275df472c20d2bbd6eed64523f96c141186c4ef0d78e3b528edcf07f0f0aee17aaa0d512f270d8f35a7027c1fdddfa602176fe03ae17a0bbd6f443d886dec98615b3632faa83b61199822b29c38508064f75cbe52d7436866663a2b1fa76dcae6b4f443393d74e1c0ad31cebf038afd5bdbe4fd25a4196b7d1df27857acabe669c776ec3708c5dfdcdf7491002389aeb020a6085904ea61bc1cbe631a352803bf799a08ba9046e6b3bd94709f9545309ac1d9f9e4b60ea382efef628c0b5779700b5eceb987c114b303572c38aa60cd1664ddcdb35fd81fc1beef90c4dbd1b70ef8509a3c0587fc56bb19b7c213dbb9b3795c03e8cbb0696c3646475627fa8269e6c334bf07e9ae4ae11beaf9beadd01f6143805e04f682dfc9fcc5893e5fbcead3c1f6353a9b08f0392985c9efe167df0771d793a36ac6b285601931f29b73c4c57935a766d7c09556f7387cc24af6f064ab0f6e53d4aec370868f945506ece161352d90ee1f988025f97d204663bc6918e32e05cea5c75fae1fc04836f0c806d7d9a210419afef0553810d312b787d9192d8d232967ae4a1db58bd0b1e557510c2fd7c0c1d9811161ad3882f2a27ba56a03093bd7c2b3c4a0a02bfd4fcec4fcb5e043effd87bb26ec3cf7b797ad2d0d52c598312d52519689e5fdf25e56543f29576bea9730b1eef01a0d73d1b74621901c0abd1955fdfdd2bc262e7b03da762622623f71b228849bdd0d22f51b2d27d62bfbeadbf00834a065ae20bddc6218d62a3bb618d5e278f411dc74724ba5eeff1ef890a052c1a8096fa5484f678e013c15ed3b2ad8b4565e162b110801dc32484857e8374a780855e748f143150b4f83bcc6a3ecd991d9d1dca2b7b566f7d39161a80053881cafa63270318eccd656454c657bdc34e4f8e7d39d58f411ebd21b81d26f85313ddf6d6fab8002ff4a8d065c8cc57193076ee4519d8597da318cb00d6f70ad89c8258aebedebb0923d8d5311bf44450de3f8cc3bd4041e808814cb0acf62e5647dbf4aaa53a3c493bde0e70cea8d2121421ad51c64d1449c804bd078432adc7897b2259bc6758d243755a4cbb508d7da9402717d728c209cce6eec7cf87ab0db25c78393faa491de3ec1dffe5434004396e9b7b5eb2ed8408144b00104312ca0894a7bf54bbac5d084b6befe8242c3c0c4a5f03b98d2e33e78836ac8ec94b7340f21eec5712178de276cfeac0b03a46c744521b5dc1ec9787f94d24211fa6c206ad27a1e1cf1b4ed586045e7918f29677b5fad186347cd675ce6fdfa94f38668b77f166c62a65f8ad0e459cdcfa781fc43a13676e4582ffc9b16d540b1fb18ee502f0d99b1c06b872d66d6b90ae4f5d4eeb3d27f12b25601c69ef76a13c260f3e7ba7925693377d7e624d8d91f692045034d84b13a2b313b6dbace0608e1ddbe57a6af57ea4fb24e02e1a360a81a92ab6aef6d2028010fcc0c6ebaf547c62ecd8a6a6c008e2032f0064ec58c7885988a5678eb4f734534359cd86f5f9cc1663c75ed77d83a4a11e692ff1adc9763e838a55039718eb60ec9816a2e976e8154e9399e978068d04b5b691f8a3c6805f8331ae23e383586f32de6823c0af6b14ff80f160d7338fcfd88860eb1b893bd408d8740bb24832c68be53263941d5b91d9f5885a6abc449ea5382350724ce6b88fc6866061adade0ebdea03905b81a3ead9034967b5b56e3514d70877ea0c3b4e8fd667afd91c5021646d96646a01040ea907e639624a82b869be94d349d9d9b6783b98943dcd63ff5c09892995ecba74405b17470e16a4c890df57b8a6e146a72e3cae207b27a14e838bdbc8ba2360a1eba01c72d5fd02fa2862d4b07d102412ed5982903913f4ccf97701d9594350a14a0863fd43f46e8645a4807c5c84deacd7cc9e80645e0a6467ba04ba0f8948124fa5d5d254e1f0abe1ed2e8fae46be52d4aae5c4ba47fc33def5c3d4e3589bfde03b7d23fdea6a3d99e3f297f222b2c29c8698f1bc570adf8e99d18940872a5d4faebaed5b0e89c3a4468e68a09ae317ec383edd6e4f5243d061a4f7cb43931388b0d579c2a66a8d435e425ce67366048ee48c99786fc9327af0c9c95f340bedd8431096533e7fa252031dbeb672365328e0703e928a54e251c2ae587e50ebaad78dbe41d518131443f0215b85fc120c8dc60c6be168e7b447cb0632f1a9127cd73a13bd6f1469352ac37b64c9edb6594979e848e837019d25ab59aac5b2daf7463396124afd6636e67e4d6aae1db4cb04ed8a3e80b8885b2073c32becd84d0eb6092cb0092590ba9f160c76a39123c1347f66ca8f01aa586bcd899962b5e8c0983728a7ad9becbe6a5c167740a8bb3a308e4af418505542a7365c099502781eb348437e258e1371649b564b2b24b12d122f6a1c7da4a7556428abc47e3ba35526923d9bb76510511671be3bb06d4d8e5671b10e55168bf195baf2af7692a2f006d2ade06b0aa0b3e4278f9f8fe871bba8dc6eed881e3da9110c3ebe37b2444b124985d200a66ffa85830abdbdf0db67664d39eb9147585d9bc422c29a7b52c3984ab8163ca7a3a1b47baf635712bf216db5e39a91c030047264d25579a53787a9421acabd858f414fb6ba644dc51550ed8d3b99f4866d3e04f2c47e8c1840c05bf22bbb356e7dc90d756f4fbde2fc78d6480c92424e32d1e56168f5b1d1fbe9685a7a0b46e223f444a22649688555829e271e6b8a22d80e013426f14dab829524536759ee037af756adf810efa3eb88adb4107ff9fe4d242a618f4063f9fd36075e8dd94a893f6ca04d9f875e9bbc5657cf7b94ee9725acb70ddbcf9298e6d7e6944d7720c87e1d995c6043d710bd593a1b55d2b9343798ce4b0d8c811725ae67294ba4334a97039401d76c171a944df6d8d0b9c95ac23c473848c9e640b87e03cb8270dafa30540f0d5f2871b7c57c96a12b7428663c9c15a4304208e91365e3da4f2dcd297582a00f558900c2ff9b4e0ce21a81143c5bab4f40ba490e454673c06034ac152c3dce0db7df4b1a9826940140962773a1a8fd4fee54b0c7b21d66b100cdc12217fbd6e0d381726f788a60af3132d43f47d9d8aa778101f1f228265ceeeb7b5a235b018197c8c2acaa0638a12be59dbac87aa6d6377355f4b87115e56da524281ac1b3cb73ec192a51e381ec473c3929606677a996f0cf5785f365198c35f152f949abc1d36c1cf56ac0a3e7003fea3e31f5cdb2216929fd060c3fb6ad6b7b66140f0ddc3d12d08ff897e762b9ff0665f05f4b299c32e69540a45fc7dc722224fd20866546ed1204871a5165ea0d8c08c2094d9a64d920f8404da8bff61f6862741bff0a9fe457548d95c6b3f3d6ea103b84cd152b37b69d8bad53cdd3ce7c5d81362d28e56d770058e3f7577557b15cef7ba12fea90a5c8a41282038f1bd468e5929f60ee6b66b331dbb0dbbd184ce09c7dc8db54418cc8dbdff66f8cbd74ceca6e0eb0237a9a020106ada8ac2910605d5dd5417347154c9a011c38d480750611cca858373e1ba09999d8588ba6132f79b86081054357a47a51a98fc6c39e88a512e5751d75c5383cc964df74f505e4e3b3dc440c92b7f19653af51c65a38d308de043a33a2c8c5870bd26f4248a1192dc2a04b468d9b14412595a7275eb47746dbf2925087f995ca6a7c5a6df186f2011b95fb85c477f40b239588df35358af0a4d845c7a07bc8920a1fc609a7bc8cec0c732105a02a45c3b26f77158f4e91c6bf5ed63f8160ae3baa48ec53d6921f2558f24b13ff3940e9e1ea38242308f32adefde5980e076e7c80a9abb84e00a628882e67ac0a889cef5daa956b95703db7dedcdf1d36920afc3da27b59dae2e421b9fd7f657d2b7d5e9695bc79f31e4108d556a45f00d7d68cf3d2751f8b5a767b7a596e1e3e34ee16b94544d4cbf55829867e637baffe483c7ceaf1bb1b212a99c8df55815136bcb01116ac214edd2251aff3351cabcbe41186305069380c5f478b09e1a9209cf23c6821c8a69c684cfbe4230dfff91c1c8483153dd6de39107162d282098cd4704db188b338731de8f0f1024279a413939ca91618d369035683610424140b9029fb7556f3350727de518800b6e2aba95b153145b09ab133128ce4366e5686074135e8dbcc46f09d0cbe5c19072c7854e5138412bafdfc626f1801bdae12dcdbeb81871789a66fc1e92bf66606e07dc352dd568ca53422383f8fab6c44528674d5c58c4728600b5a7254cca8a2f7ba915f4022304dfe7c3e3b6301f44d9c9be211f60ac19cd59b4eeaa24628e33eec8f8c8402fe64ddec9c9c38cd13d12a5d71b86b962e99e825453f2128cc706d36440f03e077724f0c62f02d903db51f88cfc183f9b056ab194b5ff2564ac8c09b5cf8fcfd63afc30aa2f0e6617675b91a8bdf064d35a38f53204796874c739f89cce5f1586d8c0ac44113f73205263759eafb41cc46425c2a9f92c20288e238c18207af1dbe02c32cb4d7563ea46d0ff1591ba8a4e7e531ef30dedc7fbca9c77734665592cbc2455c39817ffada4e7a9358b46974f37b9993ff3277b915dd78fd1db9a47aec6b6c24e13e27487817dd7bd92229d10296749a8d4d1abe49dc7a99e575da6c1f7e82e56011b50a749ae58282fe11f0f2f2057da231ea9ddae72aff8c517bd71fbafe62f581f8788dd08d675f392eaa019716e8aced819148811e7be2fa3ecbd5b3c6c1b7e4ce3f57cfc2647138104c225a0548fbcc5b50f14ae4af0531a20ebae36e09d09a34a535fe43b0863d94427480171b07aacfe51b08e63d4496250fcb016090ced27e8d1dacc77bb3078d5d50b48e7ca99d9a90bdf6ff9443c6a936210f3c45ffa760830fb51d4cedbec2b3639a698d796c43fcaea8c0a6f970f1d84498c13efe957b7156ba7e3f0634d0c8922b83ef62ed7dec156d6bfc035d73b48763838e4bbb9b49e9cd0bb02389e72777b271680be801abc98482852d684df15a63108c93a7e7f25b519cf94a1f0f72ee0c334c475a87e5c1306e56737c429fbdde03cdc36f6541db447727abae41e2a6ea0ebbbfcf5e3f5b8130e3487a07716710cd6a3da8d8611265b578e8f5c13eeb36f1bfcec6221068f92196e63fcaf240ee1c1a6853ed715b02dc742ae16d2caeab721d2cb3dfe5ddcaf8b94772084537b442bb42756f6e71d2bd10a6f642f2d706da82230e0f0d3c3e029a05208a13d004176b9510556389ca15f2834226cfc2f17869b978a816f718086251f34afc38c24c89da9c4c7df8c0a901ef9118551c17a69bd9c070c4904aa4ae3a85b30145a4d071d017d1dcbb7b9b3dfe4a9a1230607714027eaae3374557df35e07b62e0a23aeaddb079b107d3680c687853301798768e33688c8782d975dd5db88816259ffd2dd1af9bd7c85870c9a865a48db7bef2db794322529038c0a1f0a410a1994acc7fb6ed0a8b0020eb05bedaa6183ac901d72efbb41a3c20a3858e5d5df9c8bac9af99887469e4d4924761738d4e1f9abf2d2b36fab58226b8567f2b07c6c332c2696efcbbabbe59336738559eb066793d49ef853c4d1e3b04305f7e75aee1665addad32b93c93f3680e9b628f8f493ad286e98b55c33887998c7e4ed730aaf2415d3275b2696961f3d7ab46df9ee65f950a84f024971c3acc55d71435bb4239148d6a6c20a38c0540e1d3ba86c7b545454648b386ec51b192315318b973378f05216e0e362bc9137682a57c5954d4ca68fc65eb10267896ed840913d878e1d350060c1860745f177a93050d863e2e0a42d9aace6e981625ddb4e581536930d07c701811cd805c9be5b0c7245b8ec2cde12246b991cf54daec5434d56afc04eb15f937741a9634e29a59c95badefe9683b357dc1da11bd69e1d31c66e12572ddf6cc566e27bba9e88cedd64c59a76ce0a5bd45f4fc663431cfafaaa3dd5074ae66af2fddc8a2918c455d6ea54b31240d8f53aa0dc90ee7c7bd6a23b3c93c56d17da061f59e7c5b0d72f7ec65fed69199aac95e5e03827ae8ef99c6a16830d7e3684c952f1c72a1d9caa8527ab53edd6de8b42b973923b01203f4eca35ea956462f4cdd54ede9e6b7216e9958857b335c4abc91292fd7c31d8ae630857070d9847b27826173ac5b6bb65afe8d6f56d9b43ba12a643e236ec622e4ca7572767d9309d93175b58bcaeddd5093128df5ef242fad9e0edfc310f3b61d0c53709f776ab5777ab0100c7195d7693b3780b0b2d2c9ec903000b1ca784cb6e53853c6281e39cb89b15ba5b4e4e8e0b707878255b367ea35ced48ce93c96439e3c4487349e9b71e5c6455e9e364cd283f8e8a1bca56e6da09f28d54720d0aab3427bc9a4b38d5ce9ad1c40d99a7f3c9ea95ddb1df4e783fd2f785fe7dda1782b6a8530d821c186ce7a6dc0c0a8360b78c7143d90a33d7b72283f4933946bab8f20883607be90497fbb9fc8577ca7751d1b7672e5eb9b0d328eb1744edbc0d4e8c1e656be3c1d924d712ddd016d1f8e89b003839a4e43aba68c9966cc916129283df2dbbc59dac3959dcb7b5b098e6125eb57c9287e5eb2f76776b468b6bdb1ba85bbd621e0de59a07a00b92fdfd4057af76708a4b5fe8e3499f0bd57ddca7796153f9f6295b39361d10eab6e88a9115835521f6d9e0e3e927590cb6f32777babee28d007a0ca039d5e4563e2a47800e861bda05991c8b244bd7c4d27272e11718d40c1a3132356cccf474ea7d3768aa0a2be000533974603b6a00d0b16033cd66638fa955b67815a710499e97a422f43d5952483aa9f2a19c82fa500205553a27ab5bdf2f12cb2850b1459ad0c1d71104e996d9d278bbc5c5413e2f61909b29d6c130d93f3ebb360a5cfef8f343137c740457538627b9236627fbcd70878666a0c1062af288152332648ed461596130e25b4856ab12b70ec14045c25013c02b09ccc0600f0dd523b62d825c58ec1b0294e4720cf3105edd04c520811a70e8f9f6d81d8954f07a96b591c808e48353cd3eea0a86fa0d61b0ddd65aab0b1c67047ae9b9b489d09e38d53e412e2e3b71438fbe3a71cabb3a94b821f844a210911c55dc30020d81a15d7e600e2e2ebb9452cadb41b2ec09e7c4d5f1e48632378c5c199b1e3ea80af3202121b1ca6cf971d58b9e0ea27b42498055f1c6e5abdf7833bffa0cf1868b5d7581196cb008208a28fa58c41645e0c0bd0adcf803041110431f7f8000f2f9f80384938f403079ede30f104a5e3a17272059c991fef8a344474ac93dc411eae3cf10408843203104103f431ce9eefe6191c1faa2a50719094893626335f12756122c23246b08c9eae17292653a5d6169d9a2258b531417265eb8969696961718219480e18c4009c182199c1462071aa430623823c8685cd4e0626262626ad80842c8c68b14339cf48248c239e9fd0421841784cec7799ee7f5276f70b2931c11dde87640539aa24206c50a9c74f9f89304091c9c4ca2049cf1f127c90e29d4c71f243938e921d1c1492438560049a612fc007124c60f10467f6290972899e2f3a3c4c98f12264a964cf941d2f38384e707490b7e90b022cd9473d228c32bed73a153edfd955070431f210ab56da18fdfe2a2da8716377e689fba0bedc3061f519678b8a10fcde786f6efb71fa9bec5a157414ad9345c3d40993b74cac65c452d4022a114f1a1f49164305873be1e1dd9a93a0cd69af34628199bced72d2e4b8a6a20ad352d038f4cb3b5ac6b4f7d2d0902680ec918c349f415481399967a3144a8830e7e395c8e08170b92bda446cc53c74a6bb1158c5c3f47824cb36d7d55205685d4e89b08251f7261a5728317cea318195658c1230ef56264c0417b3a551d87471c1be56243bd621161453abab861ed39c2417e4592f3d58f6043bdaa3d9d8a37f5e51782eeb5c75e9b073f0623d3a90ea057ee2fc60129cfe132a43cc7a7c31244a8e7701de697aa2e430e1de8878a38fc8554870e6aa00e8a9de22f9cd4c18f522fdbc9586d1a92d810af6ab8e21f5923ac8a53848e7cf578e42bf7b5da9caf56e7ab6c6ea00e6255ed21be36ab817632963d625538755e393cc79703fd6264c8a103e8393ce280142887f9c5c8303de5a94f071cbac96e062a03f8d157a7aae7f8a8ab53f545bda050b67c08ab6e78fdbc12d18f89ba480c1110fc78c88be04caf733a55a9c7479daacdd32d9df00daf5d0d85c1fa3d0c9248be31f779ec37bc66c24e58159b89d73ced84c1ca6ebfd4472f7df4e291572f4030ce5e1b0d110dc510a15df471111cf01b88c1eab2a594d9e9c18aec06faea423451af72784d79f53662950a5eb5db626975aa3a8b6f373c76403e77815b05cf7aca8b3839b21d06abd756bd2d1ecab726e29cb833be4dca89c1603d6210c32a6793dc936f4458074448f659a671dac6715dd701c188646b87c4953853345deeda2477866ff79a4c2c2d2d1d108cc84a151a31ee9be48cc4b862c37319b75244c420f7f24b725d7c7be13827aee71b0c677fb8320ed301c18c624d2d62b0da2b28540704bbc260c530a322066b24b94e448343d1d81d29a5f46467772c127b84411acfee20e980d8230c4e3975626264646a70345ea30382113158318c06b3c260c5aad8e0643a21d963556accccccc8c8c8c8c4ccccccbcb89c6666665a66584c3333333333d850aca9bee5f06288e4709ac38be0a4bc1822299f292f8233bf1ca6835fec88804ebf1ca8831fd8a9ea3044dc1003bf766f40b63e73da0569dfda24358f529e38919a16a7c8f941474a9cea1a26331e5675105f7de64c9dee0111a72f14d7738ca853d5a7871575aafa36a59cd1440a45f058b6c3aa225f7d01d94e756b6fd60501df1e31583120dc888516431fda1d5685190f8bb658d5ca78e28d7cf0b5da830dc51b233e942f6da4cbaf6fb8e6816fc3f61b9e79e10888be3f1b64ebfb866fb14db5002f233b4b8c5aace25810f4d5270fabe6579f2e5e4d1c6c885561eda93dac8a0992bdc9e357c7aab0aa9310b1ea5a2962557705336255c9ab6362b0aa7f70a16f789f070383d539ef06e979374cf7c23be38596f5d56d78a1ade18532325e888af1c2130d2fa499e18536a8ea30de0df35fbc908d7c7597ea276ce8abb7643b5f9dc5036af1101f85adf3350606757a157176be7abbba5ff1e68809af2c4e8d38d59bd539ed24e843d9ea5ee087ac83aaf2d5c36ef59296cd09bba715360c5a2ca97c8d42210b51e1293e3c5ffb48b2503d6c1784321fca1673b462590703d6c52fdb966d9bb66d36d67ca41a5c1a7a251353d3a7bd5426b37269e0b81f44345ca0061b700001268db0aa46222111c9cfc9d5e916bba17ed468c74fd187d5ead9a365470921b25b7614119cf021f82c953c7b64b7ec28665984ede3569a73634f738cc3f8cb3266cadb675de64adf3caec96633d7b6d89d51d7bc0e8ce03b93df5b7bf52957dc67bd6e9ecce564cab948c635a76ed69b1508f36414f716939837d1711c5e6198fd6693cca9d764726a72ed53b217b475b710477a8749278d3cc612221844e81f228230d43f44047547193dd90222aa20c2064440899aa66d1c114c885012b50df341a2131974f2d15be0f327019c362d8840f2f18708231f951c7dfc5152f421f8518910befbf8a344e82d30c46b8827a4183f435819626888a02a9bf422a69045d48089d9b30826452029e24811275812852560fc2c11c29648b14b96c8963469af130a4e0b6e6893e1d4e418e655dcc10e8dcd8f21403f3d4e999f3d7ece6ff69cced34f3c1f721f7b35e5bd738b2dd270a68f31737227dfe103c9338d0f3b1fda3cf77866f6d992c6cd26b9a5ee8e51f6b0c539e72ce2424fdadc56dc50e6ab87373ad8d55e94cb384f70763ea77baf369f9df2b01a46230b124d4a9b4ee79f744e99e79cb836c9053855696010ec953462e4a51106eb1108563bb862ce0156f157c7a16696da5a6b751ab2c7ec0e543111640fe78e8f9887d7c6185404a53356bf586badb5d65a6badb5d6a6df0e0db80eb6d82dbbbbe3ce1669a66f92f90b3fc020832d39ee80d829b2b3fe63696439499857698453d4434e72ec71dffdd61c7ba40fc1a7340cd2e6227769aca11e73744399c32a235287579d53972c562d899fcc6190bab4f65e146a7a084e1a38457bd58098a24ea30f9e76b18028040111a46e630a19d9820b29ea99d78341ead6f3c12075f67e30483dda34b51b8d43cf6e915c1d9903a3e4b653fb2d2c36f68dbd8c876b6dc430592b53da73ce6eca1fdad00629653c5cf91fda20b2c8f78c36d648b7b1c6094d53da7493db8adbb413afb82f864e4ddf3e19edc37cc89cdd771bf2f55e3b790883d367b4b8985b97ee4253ef861963a463943bf905c9e690e9d6de8b425d1b1d4feef41d2ca031106155a5d2ab5b9fd1289b324f238ff8453138411f1108863984555cf6718bfa105e09a01583046a6015fde93850f9e971ce2b7462cede4d7e3a1843ee1b890f697e1ef1e18e9f9c1357487d50f3b9180f97624358c5f2435865fa21acba1f43af620fb1f7a2500e625f681fc3aa7b93c121ac22714358d5fd1056713f8455db105669435895c5bca03de6f5b12ffcc0df9dd213b6b895bab9bbbb6737edaedd58b7ed9653d8e256b2f1a63d3acbcfc61a96266d114fcbcd04ddd99252c9dae94d7af679260b88d09dce3cb393423288a5259dac4c728a4b5157678bb1a8ecb668015a90d11f3b2d8a1bd61e9347bd2877b05a6dad59ad5aad5bad5cad5dada45ae9ce0fb2156b9a590c362ff98dd342881bca568bc54d6e32b9471c96971c62f88ba1c55d9ce5c565b626ab53920737cc5c2cbf6a71e95c8b678bbc9817644ecc0264cef3d73971c3d9b345c164278765edbd281408d280ee206155c3a0e8dbed152b460c64135ecf1d0366db8bea1ec0380d93821bda226bef45a164903b6efaeaab572c3c2f78c10a9048ea830f461c6f8278d5afec495c99dcf4652e9ab93217ad42fab3b8a1e6635ae252a73aed021f749a0927114deded82986acf8cbe8fbecb50f2ddc516262bb2405f309df0f1c707284f5b471f7f76c4f8f6b96432e1ac12ec13baa78c6f971d7fdda272fb3b7243d9ca9854db7559d7695db7751dd7755dd791baaed475b5156fe827630d4fae2c8cb268e894b44699b6711da974298bb228cb6dac949d37b7d4499967529e99cd609398c66d9816ce6ed239e9d434167dbd7a35b9d7e9956dbdc9ad7170b1ce6640d26c51e6e2b86ea35724dd3e942d7ac516653320954aa552e9964aa65289a5546a29954ea5924ba97449a552a954baa592a9546229955a4aa553a9e4522af5b0b1217117a43b3e942d3ad41a1a1afad6d1c5d55c63694b78d5e2ed9951bc39522282ed61ffc4a2aa7e8bc783eaba0e88754a4b5ee3a35b2c6e0b4fac69172bc111e16efe320528dfea9729c8c92a82d1735f3893f89e12827f830c33a36f39a59c18578c9959532b513b34940d7ddb7424aead11abda063662b0dd7dee74a6f3483cc2cc33594768473b8ee440348844a946bf76d250186c17833c0c3613ea21f3f0b393ae4a1f3f5e9a7e93c1cc458fe8113d12da423bb2459c6ac77c260797cb5add048a3775b6b4eb91922e67b2e21675b587bbf6549fda539d305727d10586e23ae9960543b3d65a6badb5d65a6bad8d25166b5bac3d59eb62ed8bb530d6a2ac9d616d025c78f593be1ba4174e1e5bc23c9e3ce7c743a90889cf43cc3d0c36fb68de1d104de8b24f9b62eaa4c2bc72096262c5b74f274636a32b5470e5db670fab7c5815aff0e1e85d5e15af584110af18a7bd4e76b12ad47abe59156a3edfed990fab180bad875561d6f2e9bcbda97450bca9f1a6572c4044b07d6b15dd8935a81e20e289eeb02a467063b9b7e5ded3bd2ef7bedc0b732feade19f7761fbff8e092e414065b4e2e2f3028cbcda071afa665a4ae3e8b573d1b6bbaeebb0083fdd1f0d283edbb4192bc504e798e27cfd9a4c5e33761a991671daa32bf2626ef18fe18ca645516cd0e56af2e8ae5acef2e7ba279b2289915df5874ab48ee74cbda7b73542a5ca95c134bcbc9e50546ee34e7c4d5f1a452f9f61b46667c3abf1ee913c31e7f0aab3407a9d8689f9028349be8dbe364d23cac253a888a9e2b756666e61a187cd161e586b5875f1b89d3d1c50d27cbc626c8b541285940a62f4686939bdcf4e9d0e2278f382d5e04471231e5c0f2b9b8cba783c9e44570a44986964f029d4cde462a0d19e123468688bab831b2b86c31eba5db2eeed7238b3a25bde5933d9d925e042786488b9ffcf4e5208d8ae0f017cad734793cdf9232a53333629e8d4e661e56f5ecd687ddfa05684146ab794c1c16ad2a1fb130e225808f58b49078a96308573e136edf5ab896126c9e7e7969f3d221841b76cb9e5cb617188f2f5c15773631b90b1759f5d23dc0e446ef80ee1e60f2d8a9b9238c2b3f9da9a494d228430a3ff0d49b983e2154080d0c4ababdbc7440280c07d301a10ed301991f6745a1360b0493091505e886b688594c1e593ce9e2919f4b62553217e9bb625530a2b68c097d3bd8e2275f6159c4d45050c45eaaf6e8e4fbf5cd9f6c713e35bf327993d12d5eb378b15b405776314fa7bac7e4047c8e2c5e6d377993a753ed747e93f57101a551a0e461b0c5c46d36146a9bc1cde88068ce800ec832de03b7035d4619d73921d749be39a94a8f3b31c82f51cf7e19e45a92e2729e8ce522839d73cc043fc151e20d6e285b581100be65fbc62d97a21bce56bca1b5d6a8d546ad33b57aad5ead5fad376aa5b38855d9b747aca85745453438209c1377b26a106fa6730f18114a917cf2927b5de9d8c7e9f21d9065f073e7cccccc1cc0e1882b5b567c0d3b185155c4d9cb70cc33e36a4557b7e86cd51e5bd4ac627709ad4ba553d69e0ed62f14b15a9f754e2c33a2b6a9bc6d2b9b9413ab4054ac633e2f66179478d333ad330d620bd3b10e48759bc43a17c60d99a75fd7e32a9cb24e3d1e623088a9c41aebd56320ce02076f9d89889c8fbafb5add7e439e33b995ab3068bd1ef58a039db21c136ec843403947d6e9bd28943b08863645d6ad15aec243acaa5eab4bf661cc633a201588a9d82fc48e62ca7a285df0d5390a51b6e28dccd7a2ead76317a72cf6851b8311577cc4456f9d06bf86cce4e086fd0a5d68ca2e062df7bc58955d89375478157184aab4950f92bde6d499c7caf7c50dd9e5f3d6753cb9f6025967277662a60e48f5dca339e2d52fe98453d6358fca96642279628e7509642d0a15db25908d75e9842d94b7ce016bc4b9f50bd4b0c590483224520d12c906893443223989e491481f896463cd1653c3c68cd7c1f065748be9cffad52f5e492b5a915571bef5bec2aaf8f302a2b73d7ae82d0c58dfc37ad8466f319cb08fdefaa66547ac22c37a5b6f9dde6916aba85bef96db3e12c5878dc4e7431a283e6c266f7b7cc8476f6d90e52157a454912224658a141f29465298482942e6c41f9f209f2b7c5e5bd0636eb9b861bcf29483c2941e1e960cc23a688aecc15cbe24cf0ffe217530c78e30e7c6b8a10d3ec2da00ebf2dbf143a8f7f236c9a5415c154160106e0806695150cea567838fb7443c10f4ea3ae636f08a08a7b0fbd9501b229be4cec020e61159e2da8f2f0106318fb1b606f14a4e1184791db2528d2a194c3023b2d57ac21b81e4c35af4584be8439aaf478f8558ce631527c4741e734b835815da3ce6d88fc730c7c228f4461856dd061f4a2b35f8505ee9f990e69ff85092c180263243bc914211882ac98308628ed9973aa2dca05e0d61800362884378ccc3b8838dbdbb85646f9ddb28a594524aa9bbd074b3492ee7c5c7bc3bdf2667ad94524a19444ff776a96b5097babbfbc7c7163c609f3ae640620b3424a0fb7e780015394f7eb7c4d53e724e8364ccd39c7a3212258330ea18fdb69c5883b90ed695524a2981f0984772ead13088719f3388790e2b97b79c78d339b6431654b708aa42aca28e791d8a379b6315088f39c9a339b186e593bed002df7dd365bdcef1c2ac07afaa10a730c7ec578318c4dc49d063be630b82a142ba4d72e30fe9bda4595c0de9147529dd7ecee44a9739bdea91c514756a351a8d803d17c6edcf868b1b7d764036971e16871e73cde7ba06d86d90add006d97a2793738c67e4cc2a71650ee73048c578ea3880800e61907af430be12804929a5a42f3d97366ddab4e58eed82e89b2e71593e965837d38937aa9e0f5128d40ce29edc1015f47d8a37d42fab26f7a415ab36d6cc8c88055ba4445f1dc3b0ce5de0d2834b6e7567af5e62dd1888cc20011a7a65f2ea35b0aaf3ea367080559b57a73af146002b1f551ab997de5befc5eeb5f766f7de8bddeb3870aaba8f5e49a07ae90be3ab3aa972a0f362f0886c3253dceadc656fc7dc7b351d73d086553b1e8b3799578f9ac59e0883b59a16404528065122fbda224d785b7e730557fafc7012d9e256923e23c7c93168199c9efc88d9956d54c4416d7225490a8d9349db47eae1869148cb286f52326392391ebd0d0c4e2f68b8400d5b8e27e4102347132ef5cb619d02e267638dedd58f1faf23896b5b88e9638d9299999919fbb050c1d157effbe272e909db0ca2efa6f46b3aa37cea85b4e79bbb7243f0a93f16ff4474b2c220d8ce45b1a6ddc61a3e11f5ea2474223a09814457e87d105d7bc5b74daef69a41bc8f1fc928d6b4cf6ebae63389112e7b75ed55599ba26aaf39b557e7ecc96028ed4532d25eda4bbb427b695334200d0bcdd9b3ce6037d74f3aefad04342b6b2ef9da175ae0b98f88003f6cb0f6ae04d40159c6632721c9429f7af0dd2721594f42996b1e37ed8968c64ecf96a358d327a26f0f4b407fbaf2eda72f4e44272ba7a21318dfd635efd425a0ef2fbe3d6c19e3db5b8ee2cde66d6bf0ed21cb15dfce02146f326fcec392d0b7977210db4b40252aa5a07883799776f02dbffb420b5029df53be6d5edf53f48dd99e1e1999443d82b1a6493f5ce92138838814846db34d2e37b9525ae0d9f9eb91327b7d74bad3c30d2d4b2fdc699c66c9118ed0c580550d808fcec9def89b7e3560c81ddf92636efb7d7143ee25ab521f6709b6e9dbb411939569cfd9946bcb76199d7d720ab6a86abd75db2b1897ec9be4b8330fe27d3663ac09359eb71ed223ce9ac895cbf9c6d957c3d6b5de6e4cde6e4b18b41b8b41ebb6495b2088f7b113e23d8c7c4e724397296f7ddb6101f8d68b71182f26fb62a0ce0ec362f2cc674fbc991e0c0f8cab53a14cd1bf4c51af9803833bc245c1f48ab67a55797ac52c4fe28d6985b7303c9db29e7921cc900a5f5d6f9d617ade3acc10c3b46470c3972319255e8eb82f6ef8e3487518d4874307c6c321b3c40d79b448532efb4b0e90979c58637d8610d725c8c5bacb16f1c6e4d65d885c825a2e462e419f7299e242a5744d2c2d27979778c39ff58a71b69d4e591c3a1beb2d0e9dcbf3ae521037f48e3ed60aae7843f3d6b9a21b6e3b471d904ff2785da8b864115b78c97199e202c4aa1712b8e0a06d93bbcd1c5c472a5d134bcb7cc979c9992d3ffb420b7c8928d6f0b06a73c2aae98a375d0078b47834b198a9d296796a977ee9f6e46f9f8d35cf030671f592c3e10b0f254ad7c4d272727939f9f5b8b6b679b46e9fe6fdcd8543a76587dee1431c3aa7170fb90f71e8dcbeae5833bfd002dff29588628df5eb6d504e1e69f3c2ecc3cd15722f396f8d704b2ec4c69af69714c416605a9205ebd65f725e8cbce8c49beb16e6056f3d7ce981db62966559e6e333b749ae0b2c3de6868010c178bcc0a066d08891a901d3921b4cebafd7e2254f46a20610c4a32579b4783879eb3c92e0d1e2c184070f0f25de7a2f5ef26818b4cecea0757769712bc69f70b020b610230e1d1c4758558a3737c401c45b7f7971f92f2e611c238c6470c0faf562ac69a15d10efbbef54146ba291c77284b76eb2db8eb5f76e3b6f7d3b713760e644cd39634e1a73c6cc2933678d396dcc59832bb14a00e0d1c271e4f6b0aa8443c7c3b1c3a075d31037e4d1da483260c7a1235be01d1e0792b7385837fea18e97a7699fa6ddd0341a4d5341d356d0341c9a066a1a8f1683d679f0783c98306879b478b4ba1a35b81a3473feec0b21f03130681dc6fa5662dd10870e8e21e2eaf6c494751ba5f5d62f1471b5e574cababd3fdfb6ddd8369a6d5361db56d8361cdb066e5b6adb32ce26b9591724fbcdc5a0f512ebe2588243a757ecd671ece0408283156f34b7aee3156f526f7dd3c15c0d0058b0a91c0f8c0bc09c2e56656f7dd3b48c247dcbe9d5e6ea949d5f4ec719e14271cdb79e586383645e1318df5cbcb9e4e6ed004f45f166fa7c329ffced0962e3e7a7a327d658d7c1bab7e7ad8b551b949e78b3b9f5f67a30686d7258b9210e9db7d4053a6af0d675f4c49b2b99f8b097f0d6c31c2978eb3974e24dbbed9c9f1ee2d0795bb3b905fe7ed64bde10a32fdefa966524e95a0764ebbe1b84c8dfbe1a628d75213bbe098c0fb1d35ad20f979dfb12106fa4aa7563658b463f9d058278a3f9dcf1d34310573f626a3ac740f8e919eac7cf1f3bfcf403c43aa315db36b78d6e5bdd366cdb6c5c0f15686e789f7bdbcb78d3dd3a549ae733356cc8b0c0adb870470f1fbcb2ce1f43afec57830daac1bb526562684c2074c6cafa70c59b8d00128600dc6415e6926f5a68da93574696a07507780350461ed43b20d3613a20d5c99552b6b7fde06caf6c96d926a84e9d9e88612c5ad9005303125e3a20eda300fde2d2726269819b734e03709355cdd20199df4c1957fa7451d32c7540e82519803b00679ac2a5de01a1d755d44ea22c2ed215c27072e3134550ae6791df2a472d9d5817a4fab425a0ea5817a448d805a93262957ef7b3fc4d021c519ed8b171c4133a33ae8b32aa41c57df981cc119ca8e20797f4f1c7891e1b2d2760608308277860dd93136c48e1c27481c475b9010f517c78f22468e09a09820643d0800629e879428da2dbf2f1078a15235084a2b8f6e30f142a47dceee30f94285e74593efe405942c608509240c2cd3efe40694161196132d8625e98ffc584fcc5bc10cae722dfdedddd21653111947ef7c31b5dc6d740ec8e3ced692d06bbbb3b721319c8d979c10c90e882085252c0841541943104147e306a654d24d1638a269298a47092295c475e10c6165f94c007437cc13a62080b273441048d82a9a5d8cb456dc28b7959d274c1e25ac2b75b1a1f7f5c540861d30183cbd18b895ee463cc0b319c1fbf9817be30467ebffc625e90ce45bec817f9ed067e1b62d0478e612ff2cc1c3b94cf524710577a8cf4220f8e71bb08db6612836fd8651897995903f1d4cc9e298c2b99996716dd924371b794524ad90991f98beaae1bc849b2e449b91e2ec6cdea118c95ee5056afb416cae94e7fe1fdcc633a8304f7a2504158f0821071b4565bab754166bee49222630dd55a5a2b2305b50f2f839074b60c35b13c19cb16acd692ddd3bb0107fb1c6ba6dbd6e1a94f897db1658b676f89259e67dfa80f3ecca4707fdecf506b3d7bbf98c05ea44f2eeec916c618633ce23233cb528c314656c110266bad3d977efc71bd3ef41a64b89e7c787225ae189c4e3f2e232cb67dfc7121f9d0e70a50d7e50e1b6767133b7091354c18e1d93bd20e9860c2c74fe75e806410c6d601993414610a4757e40c210825e8f0c30fb82882c1184f74d12f27aab834ef64cc9701956776ad03c276c691ac727222c64f9fd3ed1259fcf42b83247e7a863235919c1261582738f8e9f69a9250a2899f3ea763d684440c9cf0e3a7d7274490e28dc4c1500c9a2481830b84394f3fad4842e3a7db9984cecfe9a42d6e387972dee5e7b44f00c1cd69b9b65f93203c9798b0f7de982655b050541cd168f2c40a60aa189ad1648816bc48094295a1c4c587055324c409e8c50b13b4bc7a5c90f0c111961fa0131259f060b2c2d582840d80b82754142c168b840c8e945e46262498f0409a82e722e143105d14462529b080a32288a4041f362882ba23acd0c4e09e50538ea8c8e1ee0f78c88072b62c54607d5eda4b05d8149dac091f2a142cbb8409e84f0e7644129614ae234af04394212651d0e12986a691b401141bf85c2644e8210a8b5351489416a7e2db3b83a2134a660652ace0721b25f89901131f9e649470efc79f1918d1c30c746a6c7167be9849c1f52b80b83694f0c19df1f1a7891fa0b8a68f3f4dec5003091783c28c1117e6e3cf132fde46136ee9e3cf13a1b721c49d1f7f9e049d10f0048806dcf16407fbc3e37a968f3f4690e0e7c71f9714280fb4d794eeeee638a7101b3bcb47b99239700d71f23d7a3447e9324a8c3544574839f21ae3c58417d12b8b5794170d5e49bc5a4864f152f23af2da210a12a2fc208a16515e515c515a518888b282283b48b10429bc90c207526421c514296420c51052a0208a231b0c45e145143d88c20a1b88114513512011850a7c9ae053e44334c56b8a26a6684d81444e71e44f374a6e01f6336755e6d16fbc69b7dc47434d5165a201e3cd8c35d4a9a7a28ac6c8bd1759758a371c83d44e8c568a4ddb1ebf94efcdedb5df7a939c4739e38df417209b6f99758afaee82c4bcd0bf79fff6851f78ee33eda916c50d51b1d39c86abe286344f77d08041b874baf4acbe944f23f7d4c6b6608b3ee4955ca45ce7f50b6d4c44755c4c44598e7bd28ad98c882dfa88917218d63f6215c2fd02b5048f63803b7c759b147c953b2d5f9d5760e3ea461536a453b45a21ae11a826cec41334cad39287f7315902cc77a0486e1d731955d8912462b0045125bd207931748afa26bdc0be1be44ea72c86590ccb304cc3b00dc3380ceb308c84613870ebc4145d919cf6514cc51885186edf17f78a11af6eeccde6ab8ece6db7b1913b36c90e83d5b7ea6531d917843f5bb9f0ce92a7ce507a58c13a21b79e7a0c69b8e729bf9e7a76c4aa50127d28af3c19d463c87df5d8671571983c75f274080770e01722ed91c52d9e524bbdb92969d6ab1853b59b99f9c25be58e3c7a79455e9144a1bcf2d42591155e493230ea39b8b892a757f2a85334aaa412220ba24a5e6190eec49b9e9253ce913e379887b2a584237985da2fc69aae36b1a6bd7a3b186c2aa5f4bc07d82b4ac11d36f1c67af5eab65725e71e22481d1555ace325cf768a7b40b14e3b25b5f6c5aa699aa6699aa6699aa6699a967d16eb1a3f1ad10f207a855ee995188fd9740be0970025a244bc923e46b4888a9173c40555225145428f5e60e4431a1d1f569dc7ea0ec5092beb31b792d2500307409073814814c5886444a20b60007322223d20c2591b892811112122429188ee50a248a4ed6480860bd410c1a044da8e25a2448f39fd8212512baca2140c6a851251228da8e589a4b4279d744eb9d54b2cea3078ce009e9d861e3f9e790a0f0177d84422211a2e209d25106fdaa7921ba28cbed822bbe5a15833a98ddfb8274f19674f8c24bd4932b8212da245b205f90cb24bece67857a7c4baf708abdaa910b396dc56ce65c22beac32976a6539e3dbc4e9e4f3df1a607a5f2410cb28b426190a7b821adf2ec37e71a91525aa1552811aba4c7c460dd7e39481cec8b911e71302f826319bc3cdc9cbbd3ab194f9ae0022354f171010970d82fab57458e0042d00f8278f891021238ec37a75745a0a0e28756137686608417383cc3163d7022670c31a6a882e3d85f230c5e9defe6ecdc100c6fceeff026984bece376d9d97e2cbbaa6f56e85aa11b32867dfdc2269609c95e8b434830ceee5c9ac96e890bf3d1b78c9b9d918d8762a6cb8f09527f7e92cab37cf4edda2b2ee62eb0957853bf1cce410175ca7ea1f3919cb64d84b892379029eb3a40c25bf983b7560864c82b2450ac19e27625e096704309c4435f5cd95380e24d6c1d2946b692403f7aec901923ae5a4a0b1dfd90463d8a761079fd6a99d7fdaedc9081d828de14b1aa6f9699b28c25cb5ab2ec94652e59f692653059d693817ac53ecc3e3e1cf5d867c697f1f10706545e7ed82f20297e98187949e5e9e69aabfa888fec61d06a9a6f5e7b9330cd6b62f2cc6b72bdc432b9f5e91dd4ab3bdb5b9cc5ad6347f1c6cbd162bdc7baf5e4f4c0c7be98177a86a71f13f7bac9c598cfeeeeee6e974e48f67c1431cc6b2a0c5ae7dcd278b3b5900c8a379d5b121554a934a354a2512ac5944a32a5528d52c946a934532a91640e6a068d18991a3666b80d0441f0335bad6b5a46b96e89db1fb72867d08891a96163c667d08891a96163c65f3a0889d053c17a0a06c4a07dc114616d24c9d572bc5ffdead7ec57bffa88dddc721b0dc738afebb80da3816131182683613530cc0686cd6098631886615ad62d71318fd5b76a8dacc72124540a492ab2b523836c1757e866ae41e9e1225318b43e1ee9a9a7095d6c08f398b631fd0591e23ae2954b508e9123acda612db1de2debcd84578c63bd2756046434c457acb318ac622cde625e0da395b9b5d8583363e77a3a6ffdd401a95f0c7cd4a9a791a8242df576450b19a21101000008000315000028100c87c482d1783c501445c60714800d819c5a724a970b93208751180591310e1820030300200220b3498200f6608b3956864bedc8b7f4654eb1cedb902e396d652df56b9b7c60b88ad887f5e11eb1023dc75413a8c414d1c6ce1fcc3fd32b656fde45dff713e2dceaca1b3244866d40ac417b44846c0425c74c4c2e7f4c3bf33f13c535192ecf6946a8628e559afb0c440eb4c8aa8b6188ad70799921698f8a00c41c584b2ef585ca75445b24a51887fa42db5b100a2e47a2d21d4ce06387afedfb88375a5421b43ef787f17f21523d4c54e8245349d1aa416462b78267c78b10e088191cc79c2af45e68719de2b7962293e3187d9b166a4ee8b0de10d9bce7806029e5f9c67d79325ed067528894869dcfd567f01a4780c74934a048b240c1ea65072d5fd2e5329a08510b1dbb752c64522200a303426ca1f0c6574b8619fe716f7b3c62bafa9f1667d700c29b57173b8b98ee9f3157267a0241ed31a701333a0940a44e0244dac9f4a386d3a52039aa203c986115e7118bb8db392e64fa0f027b69de2cf2b5b536e30caa8373834e0764184ddace37033361b6af8bb68bb20c5cc1ac7aa79d63df481fcefd2c3d993356ff8e3a548401884a0b2004509d233193ac8c4cf8cf79f5648f3757ea6683e92aeb0f36b2662710b20fbe3ae215d5800dcba79cf11ef9178ecaaf83cefffe3a287d07656619c0a082ccfc9d415d8748ed7543b3c3882d6d4ea77f5a1226cb181625334a96b552cb8d87a6c696b3134107f73594f7da8a8fddfb7ca85f44107e2789d87d5e891b9901b70cdf3ff65cdab07c6abd11e8c2a7bbc4f7a45c8d807313e7c4fb762288a075c6521dd4977244bfc153110191face097264068d670b405b27bc6701966c01de1be0e1fa9ae214c04af1ade07e8eab1c78d61a3d0b1de506cc58628265e831e7464608740a346b4a1bbbc940d05014f573b2ed4850fde3a6680e67841add1ce399c2d98ff43637060fc37ed82d04cdb995e6881d4728fb8210aaced5c2cfbfbd289881f51b661d340e92262a37eb9de797da4435ae3c06f422a57c7455d1837e9924503fac2a9e3a9b44ce97649fc51b5cc59ae40fdc52fe52e79a56c3ffacc5ff13b08dfda182b0459f67cfa935e847944809eae58382384d57da146527b2fc52ee153daa5ec1f99cf2e938b5e0e22b74c7f6990211e8911d3061d9b524619599de1b477267d8ea71bbf13db309e43659a19cd17999b3a09c372e476de9de318cc32914dad9146adab605f2be0025e223fb9ca48f46efea1f915d7c08f4b44e5f8df25e23af21f0297188ff582041670caaa4043b842e27b27d4a3803a40850ebeb56d1937ab3acfd5d0835b4816af2c4dbbfd48551617a015b0daacc8c7c4eab51c27d86b3d7fcd3abdbf99ff1328b51629c9f8c1d6b15e11841ea7d9b346489980309145820f2994947d724e25c06f229694dfe573324e4a53b1621559af6dec95fc4e15d9dfa867359a5f7b7478a04f49edad39279a572c03cececc1a19d41c237325f9383e0a5ba15f33d421ab24028be71dce3b6002f184315eed6fc4829b0ee7dfbcb763f18059df96090937455210abf810d4b953090c637d8b3ae086fbef086bc8c496646578c9912fad098419b9ee1d2ed5d1e7f26f81d0668096f253dcf7a39c1d01de01862a24ff3ec44a0bd62ab2242041717a53c35fa39e16b280a73e662e30bb20547aad022af69d1ff389821e40fb0244451cff4d549d8ccf6af99b111912df3f9291b30d4af789bfe0284b433f28d8052020b200b082c1b8d47ed0a8d048641b7ec2c8c938adb696712080df4893d1e6aaea81d85730e5a8a3ecb590389890d2eda63039f66be985a63bc291ca154995f40d2dd8420ef1e8601e7e6d5509ee8e1aec020cd61c842f8aa885d68ea34ec84579b6d72790de94198129f2d7a6ccabfa19053499820b3882ac6f872a70506da915c8e80f9a1edb3b421802b93649860a47eed9fe836c0c7487eed1ac01770c30976fdd74eb75bcc1fb8267c58e32517ff5331f75695a1d862ee09ea1fe3a9cc02bed6c3257f76d3ca5d151e4dbf18c9fb32d115e733ba62329c1dd1fa912c10fcc3a0d66f83e2847fa0967ed23153b4d47128340ed2dd27b0e22f6cbc88939012598a68e45c460275448c55035b371787a972b2c08c3b1d33998cca75ac34d66ceb8d75eba5df2429c4e6a61d803a541ac15cbe7407cd25dc92a2cd2df0e4f43077fe10df7298a6350da9e4dda03fd45a46cdab13594ca346202b507c2c6ba909c719dfc33728590e8f46f117f2a5d2dffeb5cf6a895ec50a41d7729321f64a70202f9939a0a7a6ab38606f28abdf79023d85735d830b2f47344a62d0e58525ffed0ab520028695f0f5596ea0659d11bd25ef2b47b260ef7634b56d6d42547ffd0bb44ad6aec94584d1f6a00a87c73acaaa4d5d57698d8234bfb6af97d9d11838091984072461be8bbb3f0683022b7a6c5867b1db1b13f134fab3ff5458dd37047835ff486b1530af071ade64941c46bc077933db803e16f1b3d5b18162c28c6f04966536b4890680168a950b81980ef5a63ddbd3652571e67e4221e60785853c8856c56b6de32a8aa2427ed3b7dee3bd86c66356baf378dbcfcd1e0145d4b7dddaf8681e7e53c93c8e7239f1f9b12d48a64ffba36e60d5030072f387455397c13d5ed11a49bcb6761d4bd73d9a7dfefb90afec4722762cacef9b573ba41d3c2a3286b01527a5fd739e180c5d9ebac5b848b544136b6862750a3b79b886161145bdcf7ae712759fbd0ec7f8796e8ed27c7b9085ae54242b518d32be5d9c7a30b4ef39aba6bd3d0259b508335c6f6b16a31d6b448eb3675912e619830b8e2ffcd3ca87ec217fb6d8b2cbf1d8d05b2614a93ebd3fd5272f408254cfda2b0705e283c37ba9e05d457879af84b86bf195c4c744411901651f489b43fd2c0a377cecfe078354b37c16e2419bff815452e1aee1151bca370e4f8260aa70b1855020b985233062cbb8490e5b88291ae6c502efbbdb333869e3cbf19a5a34bb9916cd03e87a4887d22e500c150d0ae6c74144f4ad61c26bd550092da46980aa96a8512c2f71daa899a17ba8e2afb6c0d46dcb11b55a3949b5a2c18d3f92ef7a24e92e1e14ef8fe4b62b8b22de9f144628c721cecfd628e502c56f06015dd41de4585c9e8edc15e1560566381e3b04f513a222446d8185e74d47eedcf9af746e235099e8c44deea1b3615748d903e285039ca6245fefea32ad20a1870620f5b06401836cdb4cf0655a418beb4fbda26df021f8d004052ae604ac0399b5b8dac4e5ed65dc065f5536f03bde2116278fa498e4cb4fe31d5dcd288d48efcbc498df617a831fe56155bdf4203ea763a4ad286a321187c265d609cd56aec2c9bc423e8f755a59f9889a1d4f2165168c6497570899734af384af709916289fc8022d59b109cd559e02de63f359d30c7f2b2cf249a50e8dee15f059c948cd208ec2cba4207ca6565a63c5a7341f5e85c9bc80f99c255ab2f253d64cff6d98c2eee38be12e8397d83913e86b8807633e05415fcd698ce2c8b7a2d39b6faf426656433eed6aad5999cbcd2ebff033a7709f7b9556ade035353fa90b1db052bc49a43cc24f7a171f4711d55b6428c08655552743d4068a6448cc7c529c46c89b4ff4332760c26dff17b9f776367ed8a7c7c941e1fccb9206c81c97286ff28ec70c67241ee776367f9921b158fadc039aee01b49126e51cff2a60bba775de8e453aee37bdb37c85aa637a7207644a64cb2a723b921fd5c08b08133ce049310a9d5a02f4185f3ce901c128251e99d0a933a27c4465e5d8e1af88e72ef8796099401951661d812073f768671b9f27be4e52f6872a126775bf0ab0f6cc109977da2328a5c71e1e9adaaa289d320571fc1b5215a21f9d8927919add7c47cebda6d96451bf75abc87ec896251d9cfabbaec5528f88030edc30363f509fd4a54139e2fc1ba944bfb681b18d173486b562e605bb710283571c8095c1fd43dafe4183d24b9dd66b85ca43e54d8607073c830ca55a45151feffa576ed7d7ed38078b5ff9ee6f3dc4d8fb2718741937f8d4f8d011dbe20f68057dd00d34830ee8036d4113b48046d0065d408f4f2f26f6c0e7a0053a403b68065db21b08f9412bb6c127d009faa09b472f4facc007d00eba400768047dd00cb4829e1ef6315f7b8633a70cf7c09660af30bf64b550f6332022b72c96f360c45381d09bd58657a2f9f056a47875cb98dd2d2a11398f6a0e060cde2322625a700ed93b4fb55bc232aa42591a46676af558b7c94b136d986a2ef403177cedae6036ab80f27d1fb720dd85acc5566268339d2a80a7392c9874c0c4a1daab91c182dc4b6598f915b3e5d2c6e235fbc3dbc76b560d328db536e3b3c5dab917807d0efed238acb973f80a6b7f4e0d30339f4c67e0f309781ce473b2482a545accc815b823a0c230fa69a0b290256e382aeb977b38344cc741252d401c5743410d95583a19c1839b49e7246009f80742d3542dcdfecb73b801d8fd1cbc4e15f3a05314968bbd81a65807781e496c8a8b292986746c868051ef5e58588f9b903794b83054a9166495061e3eb8b05ab26a9616fd33ee8bdbad4ecd77d1acf0c0d9a5bd166382abb82ad9723cdb4a1bef61ddfb2ad5bc758748940ac544a7c64ad8415e50b447f16af022e9d1fff391bbd3400b25e48a5a6589e24714adeef0d1698cdb94dfbecd4fd8b123d33c01bbbd77e5bde71b0eeccf9a410b66a2c2258d9a48ed8b9e0d27512d2f10d51409c9148d1cecfa0d95018ef48fc474e8dc01ff4f5b8ff60ca7c5f5e8720daeae756cef5d3fbe2b0ef51a08924542f195f54d10cefaf7c23569fad7122b483a3bf63ebf9e95a7f541c88c09e3718ba9ab1cfc67978008a48598025a1762dcef69a785f42411aa43575122ea11a2750c01878ae9d21c4c2f9934a1aa01262d79630858b1c6a3cb9ab8acab5ff88247ecf0609bfc8d78ebd713e93df4ba2e18ea170e016390407db6453f7270cbc1c1715af00a4fecf5d166f8802b6e7e64d05f71c2f431b7ec089364aa249693117ede2de70738f34e9182b88eb0dd6044493a41eb20e769097365f992018c46f027f584becce5097811d7660e908790f18cb64b08a18bd4458eed0658dd4c22548c94b6eb2e901590b7d04462c9fa018aa2b4361bc92aae90f4f7cbeeb404ef703bfe5a284adf501dc4c571f870ac13b79641bb2de9975d80a20648d02f48ec97b46c1503029ce052fac888a80e54b9c29a11916eb96c884a31feea23adb3dcf3aa460b03b98d322452657029efbf7c75c1ae622c7e205f2d0f0c97dd9e6396936a149031edeaa3c4112601cc69d9c49607923944a09745ea794961cb8cf7624784350d4886035617f222b7bcf864d7e5f2346e9fa3d280c93260d038d09a5617de78bc2b15d9ed2e55ea73942abe4724a6f781d8b6ae34ffd7d1f4fa55b1a3a76cf416b2654c17c3730c91cac89671216d60db6588ff7b31a222a2c0d90d99c7b04df5992298862781c369138249553d4b1da52627fb62c921e37d8b65caa228398d748c3c7ca57a5a79ee68ac7e6501d28de4158351604dae96321f59faa63a4ad0bd43bebf165b51f70f7a10d9ed3635fa3cf4e8b799c823d61b1f99a7d21241f7af7965b4e426f267b4c10c584de4dcfaccdd5f746e8d46748d34afef5a2380b60073378ad7a00231edce7c53ff5e2c6e25aaafca7eca76e6daecd9e51609f652ba9787a6ae6e8cd3945e8deb1524534661c5d0440d0010da2c5c8d3ee2a18bea5a10ad5314dc1e9521b26303df004171e7e124cbf0346721950c1f43dd62b9470ea0f71a58ac0e42959aac909d92dd386d55c20ac69db09b4d7e48d8a122957bb464746524efbc8070789a9db2dc5eca0ca09e3f06144727fa4570ca9094cf51af221e1315b39e85668ee46909605911da78de9c2ced81fd69bef6f82b8d58f13c8ecfaa3cd16ec1b39819096f2484d8e9f819d5124231b4a2a4c5ca669db50a33169f27b7e7d5011a75d88d54f8a3f554fee1f83894194249058986096b1a3ce5d826e307c184ca05d91d5b59d4f2742c2a53d63cc78580e426dffbe7fcbc1897dd52eb561804d4ac20a20102aec538fbc388e01845b39c88f206f77eb4c41d06911814d8249dd73434565b010081cf9bd3e0f1ebdde11d80cd6223ddee21f6ba51ea20b01eb02ffd307af5c61c5c3806bfcbb148412f027dfb1c33e20b4d4875663ee7ec3916cf89bcc73c30895002d32ecc2a555820b25b421df6601a0b6b6952713f1ed375461dc846df169975166c27f7e7b8ad0c31ae0355b1659cb6fa99b96b3c083d655b11e8861ff9faa47642a09441f9a223d780f16bede3007a3426a011e8570ed7f5902eef7a457535dcbf3700b0cab6859466a04b7cf84202645934e358c3eebe2dc8d233ffefdc3b6fe9e58778fcc8ecbba708ef8713ef8954c97b0dfaa33bf8759c7d8f387cf0dd237cfb5521a009097f8d70642ec1f0bb5f2a58605785567bc1a26466a20552c7f0ed7f45473c5dcc7ac484bf9eb5840c7cfea51b1c67aa17a5516cfdbf6b9b0e4b03f1fb4c7485bbda31203e5f8fd7362c2aef4f7f897792d5bb1577576f6aa1f6e886e00f9c6f7370ab53fc2ffb74fb364c1a3e4f74f3559a0ec567a0618eda5e0c5cea6edb83b9eec883bee88fefe7540fda8841f57d6d0db0e8af3649451842acf4ac411e676f286dc4babb4ec25b9642941940645667b01711e70813fc71417f3084e9b040c2ab92a3880608682a074afe1daa7cda7330b3bd60f6b1fa71b6514452b3a69b9be1321c4c22b3ef8f3e5fc6a2892b919269b265ae6bae5921d41746c1b7c0d83e940049357397ab2df6899e85cf55409b06de59d156202a07e6ee42234a41acf04b25a2d1f441b165bdadbecefb7b638c4d511c2ed78fb5d58bc598c44ebbd499ef4959760d6e29011e20a6c88fe85c2c19749e4c950c5baf9ab7621a0d5a624e84239f85e412ea29d957e11eb0252f707c380470e804e52696bd541456b5a45b845a279a6cb39d91e32b548d11d050b56b0377ba7c6d32ef4efa928cbce0045d0caa08b4bdf820a59a13dfd4473b20e0190d572140b5ae27214a9a4eb6c0bad185236b5242adc8ea26d891d6ec005c4c0a66df3f3f22544da77d90d8bc32005d88ddb284cb7cd7dcb342e8d36014ae703c0059cdad89bbfa73fc9a8717322abe37f77bc306a52b2e28ce1a28b9723da2cd63297a19c63f370e13d89a41bdedb419b0d683271d2128e070306909cc4887a672b33c749f4f15cd8229d61c65a52beda0fbf69de433168cbcd129427506046991e462662c1a86321e2816e684ffa4b56dde355a489f6291459a783847ceafda2bddd4a2b832f23cdcd18664f24ed44995149afbfddafbc88e6c106487fef33f9096ba2d5bab247cccc8cd4d68e187251768da5e55cfce7cdf8079d810fbbdf42f5ba2a175e5fd11eb8d5d7e32f7be04674c832ff02e71b20a28f9f2832aaa51815cd1133c89d0d9ae2f2314ae65a1c0349a37702e6d5a7c6f834646c516c9c3d0e0fca2c4d7a39181f6fa69bb40987a47788a11375cebf32488ef0dada19d545d2c9edc7e429e8cae7f6923f39456959a92630e33daa0437ad135fc54022872d6511dac6574c6c11d2cd42407f8d007a1838fe341ee41751b5dff694f35710062308f708692785d4413bcc7609ae735093a50616d9232c015ca655ca1d3d1c22901176721e1299f182e0e8226d72874d201bb88342cf6165b0cb41117cae4ba6115c6a341d78b43b34bfc7a54aebd12ca9e14f79cea3e77bc544666da252ff832674d060dd0a360c4c742a677d37eef3349480b65d1c76f87607248f453c2e09c441e0f7f59c37ee66d0e2ef163de0d347ae0ed52dffb27ba53dea81ef913afd83cc7a314108e5679c502135bc9041fd8a8a0af9fb601ce498b930a73c7292c06f059617a8d1a60e9634f4e2f036912417726d56e406330a63bde096dc4cf8a5e8e4d7b8f2a109f8d09f7b42de991f5253e1a2d5dbfb3c693ed7f5339bb9e190d26f62f6c2c5e6ec99c95b893af070f346209d265d0c712cdfba719a075cdb25523b8001f475f30cff32f85cb1f73337530569ab2561c9daf4b9a36f3242e3a7d50417c4835d5c6d620ff40ee52f08a32ed9cd1e85beacfb2531006ca5bb5b8ea44199d987cdd361dfa64ec2c25d5b3f009e3a0a6a1584022c057005ea6ab4209cddf46f246d8730937ad285d5f411161032e5a785d1b93e6b684487f3555431162ee1e9062ac8303b3ff2ac57365122340a552b43762adfc94e12617db55a1f7803593b6739e51f14834f9b0ba1ca7dad9f893a8493f53323458cbaa184cb299440dee117a4735ae08fe3ee8cb91abaf1227b9d125a71b167e359aca5cda1cf1f02dcd44958863c617aeaef425b02fc1e078c4ccd6e1c15a377ec627b150c30d6c3a8043e5290ba421cb9c0619ce4f4df7c068c9e2280c2110524ec14f224175a06455b4a48171946c04166b5c56313198056946869d2e3f56fdef45ac94f1a75d5c8b805badfb38af6b1ff7eb673d2f7caad252670b48926e665504ef780217798e0aba3eb753aaa2869833d24bd8ed336579916fd70a0d0509360a57cf4401ed6ff7250215aae77d056ed2bedabbe15e7b27dc75dd34e1ae7d1fce75ef13ee545f939f8f2669f5865440913b220c171c50e37c3e7f9c55c1ab7c808060d50f3d7629a95dd2c0cfcc63f9726e15e37c474628ae387f3d89861cacdfca2fc8db83f53987e32244db25004b66c09e3105e4710f3e01daef36d998c905e553caccaa29ac7e90358d8b84ad7edf194ab7ab2c3353ef2b24e6848fb9d80ce997f11196226d9c4984042be1ab57cf6c53d85fd6af7e15c9e97ec8c9babd358c0499edfdb73204b4760ecf371f8a4c79dc2e94b68368160839de9fa031011321b84debecb147668467da0396557020702b6a809c466f7d82b3571752cf0864d7561c282a5c922fa850c9ec4d3a0db99f4c11fa2fe4f02eff1ae9d066d0ceb3a3e6cb8e22cbe8a95d34d9add83366ee3ef7b6fb292cf1aa0a66dfb2341d3bfd96a689a40f31abb896cddcd6b74273934b658be2121a7e39ce2ee930fc9c5cc68eee1a8149f59de14df4c4478d76b7c2e02ee9636f6c8c84bc88cd46335dc1b8359ec685c4b1b7e35db97bc8f1eac0717310739f2a87a0faa4a8d44acf11dbf15cf1c8ad86d2a6166060bdb176ad28ef401bc33fc9eb7f562f3de0d08ddc1b396627309b9460b0ac22f225374d898ee31b52b9c91e85e02562a47998fd7214d559cc84269989ea18c874e33a358ddcb4907118be89780e6a3d4fd7ac34b18175b119322fdbcd441e60dd002f36d8cc8d54365072a4b391b01989802556185b1dd1b0e3db626afd49029bfc0264c87500c489bed98cc61fc529d620037f1f6101c36a1e136501393ac462784f6f799bc7cf41682c38e5c3ddcfd2dbd69f0e9d2a6926dd423f9d181a5aaa4145201a902948914f41ad6607588006f3f1dd51542ac4f61857c8778af85cddce4c1fed6c50c53ba133bbd22969bfee5151686768ede3664c185f1a9a6d44fa21ed6f27bae38982d7c7b5e3de045c5523ece1f3a7301ad182ff7578824ec10fdf86d668b7e2fe36f9c595dfb19a36bc2bd12b5201f2d30a69144f06e33dc68c1a8eb5fddb1fe019e86189957a13268cef34ab5c9321f35794d3637a725f185c9aec58608492cdfc096c1c790380cf86b3e8c4e4b129bdc60496c229bc444099eeb16f4f2fe61a69f5b2188922e1804bf3b4f8466ff47f7463bd21fd3e189a6ec15a3f867b162d666be761ef8f24f415d11a1aba03c29ab768f816eceb47b0da8af6ffa9934ded603ba381065565b984421af5445bc8219bf2557002a8b1b13eb84a79a3a124657cd8d8a8d7900cb0d4a2109b0b71c4e26a3e282367a7d0b7391162aff263ba540c43d6942c17b499a679cee03c2700fe87ec56cf24cd198ca093a38b83786b333375d69a8caec95b3e34793f0ad2a70c7160b27bd52f2fa3bf83cd18dd22bf328f7d0d7144262599689693c5fa3032ed592d986dcffae5731a8d036e77955fa359b467bd2ff9fcec9f762eb93a2fd7decd08414a89a38e75525cb94180fd3a68c5bf7f617bc1324d16ea499a0c0b9a2cdfd89449f8c2efd698eeb719341e81b4206fbcf6af2d1a9089a5d708e233b2af250a19b16e796af2178eb233b60cba90987a31c95a492282ce67f4576ca1d11c57e28db6ae1507cdaaf5b569758b7c296c2b583ce62b79401fc4c24eb49c63fb0d4073f58d69a964e992d046972a6bb9f62f4e1ee283ec954decc898035d474d489cbdd1eaf7a4d620d11912bc1244d37b5b7c3b1ebe914f9d6bb136d667d0528a2babd66191abe6b3faefe502110a9ce4e68ec1e507cd345faccb87ca9e20170729a2443c1b9a9c281ad5dfc5b391a498838e85177a456f34e81b227d063fbb85a05181604737d527078724733861a34c046299c7d0015a83913e3f09b4a4a0d754478537939356618a511adb4d786387432c5ab3f123883b2490ebe5764fea456af7d51b7ce9741910b88da2a5cebac1a7aa7e60c71c896e8eb60c68c92400195ef1848201adce6999a8c3511702d7053adad48d5a20fea0c83f3d868c1771a218a726e03182b5ad927d154e178e2738800d2b4e1fb2d919f90333114b5819c9d4c0fac56d74bfa6e8094ec489d1925bdc4b4f2255318991b13622c47443e66a4df3e76338372ffd42be116228f526672dac4dd7ae474dd8b266f971cabf1e20c269976a7fe709fa8a85b039e6b6953072e86c91a27e82d156f7923bbca6f0ca26d738920ed9f4c8fe103a81fdd9984600dee72e30fbb25fe6f7ca7f43a1e883315034504520d8694db94c3696cac1893ed4091aa4c81154acbd3e4520cf44570d92ed8094c35f428a720ab4342b090239fa3f2b5ff053d10a32af30912fed7a52d15ba92d243efe7ac2769c0a544f13bd16625a9e8f3128e5dffb9a29349cd94ac80d8edee2303875391ad76db37becc214c99f187c6688ca7ee5c60970d06f70801a2813b3f1b64af657668d1a187865c206dd5e94e3524169c778e77f89e6e71e6534b85bb0ca8abfec825e0a6b8299b766556056a85216234b63960b1a92db5d190363744d7b3a51182103053e3b180b817b258a364d36521b06a2ceffba97018bae7916d462b206c4d2137a5ddee85cd4c45dac8b52acd63336ea2442d7e4846aca650d15141b22b8e8c2f928865310e48d820d4b9f271d77d26ea9cad939eeac626253ca2163a8dcabe5ab598a5632130a41f2f2f951e4da8f82211e84f6adebd1bf6b23033c9f446ea7cb5902cccea68147c0e1f1d459d9dffdf76be935dcf9394b9a80e2105d2243f461552e40abb3cab50bae93ef6f7c49e1c919ad39cbd925346afa2d14a53f4bad37f8bcbdeb998e0f3b4c6c50a8364223fb8e56d0e6b1f2642f14401c68c05db20b5becbd298f25ff1ffb2a7fa68e6955b4aabbb6dfc7fe893b100bc349f80595d67ec2b33315f44edf5417f08ee1241c89e88cb20470cbf06ca8065fcccc4929b3700036f973a5ffb6ce071d9bce23e5141a5804288f6bb1610f20b7ae3c8562c3de939f9451349266d6662b1c5ba9a0368f2ca5591cab39a815f441994dc4f2b6dd917523a8f88a43b6ef67bd3d27a62b1c33edbd0020c991a536e901820d942cf9ac5dce8b43003e21d111d9e537155680c35e22c983f719ec4c1815ae84982be6f00613783f06be0d70ccf600991dc872c4e980dfece0246b4f1c5e75323d0de519a75963c14469b9247fdea5a481fc64a230a877b282fd4e936608db473f3477fee81029851381977f653dc3e8afb83982a5252ea7d9d816c251521107bb71cba327c29a8c8d23914ac6602a4a1e395c8832d22bdbbd02d835e7d301a31f7c2f099edc32f02446d7af9af1ad62dfcaa700e594b29bf78b6afc67bc66a3e8b10ed7c1e1d07bd6203ea577dc72a1a92774be448b558b4ecb1dbb99a2025730b71bbdb96f2a29803d47022cb7c3e4e5f8870dcf3a870c276c7de8a246d26c0e6738aaebd84f7f9ca07f053d4f88473f32a8dfba24bbbb7c404eb486b7165a0c6f8394e96042b248c008803a8384148c6397ea406ebc0134ab2ce91633641edfb89ff8def6c80a1d9bc6fc83545c309802dfb91d3f683d54e128b7b7b9573a31cd031ae7de9ba898c1126e8291bd2bacc0447314128b722a6fa901df942388801df42396f9ead6ee01bef5888e046ac94a93fd23a41175973d952421940a0d2c0270ee711ea18a22e276bb0443630a0011f34abe2419ba0f21d3123ed2824587676cc6eee3d253ce171643d86b51b7cd32726dce4a8396d3b6197fe8da774449480cf3763143642fe44d8cb11546b2e19393afbc71cd74101771f590d08209117d6e1fd80e27a3280e1b36931b26256c1cf98ae57bcdb4e8923ae9c4d436d659292cc53d9441c89d0778c6521172d7c9eaa991d857cc0de3af95b216774273c91bd209c5c9dbfda251f6514a27944e7a5b8f3f3db51b62061acf142b1d39120a799d01b704b3a646ad6fd45e0c03768078a236e4c0ed27a0266cb8619456b1baebd84336701ffa9f08a168e210aab28a7d9e25553f0c412948ac4a82ed9e7f9985b1e61f3480340cdecf2b8e34f5cef3944953fdafeac255bc987ea4a12b060384bbc1d924f3af981c5858f8b3ee4b1c8d7fa274739e89a14f835eb24ecec9860984f5f630bad17c47df22c9d39a2cf2bfdac57761161fb2ef8cf96da5d6ec4e9686f0790f50ea898b9b263aac4df9cc3ee705bd71f2ef0adfe04b7e9fc222ff4ac0523138f95f2ca1616f5bb284934177fa0b2bd62783bcd8c7b8285e04cd7d8e013f0f608fa4f499c15e6d3214fc47a28db04d34578bd0292fbb965c0909a26a08f7131f7133804f09bd6ba2fb78deb3f71c4b3c39ce051f6c455b786358a2ae7308cf2e5c6a1ea57fe91b775a91acc926b3aa31cd060d3ddcd2c28dd3022674ce287c6629aa316069582819cf60e5e0b0fe2d177a86342c96695851d8274b729ce295d6deb68bee614a4cdf6825a0b572c4decf490a5a70b1e6c9b3f4c1e0835fd2fd65fb93f71faa0f024dce1a0cf2cc04f7490888eeae1143f3e06e6cf0f0c0e690fbbadd17ddfd204fef07e1cb901f5a09fee99f66500b4eb6720aa51f476c9e2f9027fe051197ce249d3abdc72d7ffcddf6aa0fdd96d9e71340f8b7b39f5c06fdc771cdb8f6eda1b5b1dfa4c1be1f832665af0c18e0d1bcdc3911b56c995f1c02f4d0b2858a62ab78535084403300f4b53a441864cbdb2048e6379f32bd15513e114478e1685efc78e29c7f590f0c10b1c1844838d8b4ee60ca8282180606fffd41dfb1851039d0c3c28e4777c330b02b5220832a59a46e997b7f49f084158ec52b111af93af63f9c4a6edb00ba59d9d0a66c71270ad5af9bf44559c10e947d155a526f498fc9402a8349445521c7185a9b9670586552cd6a9b10eb6881934467560344264278b5533e1cf3ce8716f270d595d23f3f768a2875630ee41992c9bc56d943e46460219504828ae9c49f630fc2b0b094a617c1142030554e4c8e984143d0d815854d3fc01767af16246002de7db8af6e4f12be82678fc4609705a5b9d392250607b1cefb30399ca44e81f68412a2100bd166ac69ebdd2628e56b6bfe7c467bbfd158d29eee30478280b1d95cc92a08956dca7371c0811f7fb6a3a6b7857c4fcc93f64350c5525b4023c2a2cdfe8c47a71c156ae64682ec9c22819b3a414b659948eb99dcdb226165cf306888aa9f705fe86c94bb464af11edbc51482218ad9d06e0a6ab935e0ba44fb01564339143a1e0c07fdc4ace010931649e98b40d2ff29c01154fa6cb54537a801b2d69367c017c72d9a338b3e483e2e54c6875786bf1414c84b75591ddbd0df98f8111ce5990d7d347cb0217624da59b0349c6906fbd71a423200b3550dadf0a4fa1ffa48d1076c02537cbb5eb328471731fa5c7c8a64c0c5aea9a4604fe13970be79c828256b64d114d688d670486ea2304044848fc28edcdf567ee60c98bde9b4f288759661c5b86a6554eea456e9d28459ed0abfdfc227fd5eb15ac1b317ee2ef00f077ab10e7e248108020e5cea3f0855b439cdb47b464138870c9a6a8d1d4b3c74026521a05f1d5f90bfce1903526e3a5ec29ccb6eb44f93b5e9fa3a22c68e21271443c04cc099e2713bf68481f84975c66cbdc7aae2237b1e8b403c2a7c99f8120b4a098b0531a3d1c25effc440566535fac3c3c64f11a863bb92c652971502ef651cd8a285738047fa4004eecaf400bf387d95df9d1524ca5a07d85d0b925f61fe15bb42f4075b7e25b5462be460d0a34a7a63ad4ce59dcce620fd583644ec0de266d13b120b3f6744b0e0e137e7477d64a9c8941d182f46435b7d529cdfbcc017cbbc9f7583bb137c52c7b2c785ae8f9b0d32bd71e964a65d7632a3a62ec3342fc686f7c203dfd9f3ae6d88d1fd84c36ca35ad124bc08b2b5310d3eb12a35c8fb58bbd8be0a085725384ea07fe5b38237073a319153d8a375db395d3a1cacd641140fb5aad368ac42b3e5984021b2fcde4f7fa94df366d2866e1e015b58a9e8e2143733b68b5cae0c668f0cfb6d0c48ba63308831b7016b60e27ff82bd3ca4cd05e0715278eac9192f068033378b06b3e06f05878b1f962b981eb60ee6bf0d5ad93bb42410a32be9bee2dd8aef9f88040d34638b76e6092246253a8e107aaa015d9cecc0a2b88e8ab686968ec57ae5c098bae0d6f16138efa4769ad099e5eb9fde5c0e00adaf9549ea7a53eda8dabdabd71569f1d554553b64536e9b1e3e0462e3e64f2425c1059a620590435fbd6c90ea16d6e1579187e1213697ae8ba85d2852591c4a3ab650ff0fb07e676a4494b4cd435fb268d7323599aa1e0bbd6e14c3b5103956b627baf13dd21cee5078f8053ac1ffeef9edb87dbda1d7157bf3fad838ca317c3412160d68880599f93c25c3e960f9cdf8fdbdd6eaec7b450262109807f10b15852bae02a39eb3c138ebc3204f5c3320cc109cfe942140cdef10f77b26521a0fc82cf7de85db6c5c9b525f42aa2a28efc15cf66bb3323c96bbfe280a6b7714f3b3c6f073775ede0a0d6f6df1a525ff7831497f1794a91e4ff7b6b309fc23d52ace4ad09b80c6430d2839f123ba1e811f94685be0fab314f8df8a3e12ab2cd47324f0a70ed3fd83f79a295c5c0760207df9dbcf332497dadc7194340bc40ff8c13d9a479d3f276e2fd4912b385b455a85de03e6c7f4fb015999cc215940ea2afe51254943a6c4433c68b7cabd362f705362aafc370030d216386968b07c7dd15ffc8261e35c3df0c70dd7736fe4a8978d9dd68ac767649db79881066cbc7bfc601ae6b1ff7b5f607f724906fcc8dd0cd12c3ae543295f7abbdecff449ee78194290f0d8b288a0d4b882eb7ae516413358731d97148cdb20490a11b4882713f07cf10f21ad1afde0055f8dc1384fe771c9b9836d70cf44a1d951d725f0ad5997dc16efa2a39dffe21e3d2562bc0b5aacc3d1a133b0160547f23bec205ccdc426acd5e2b552717f7101a60e9d47642df06c5698371a8d7761a68cf6a32e4860e3f068ead3d9c6e7b1b4af9b58c6020b977e92996a3bd81d0930d06a0e2ed25fbbbda9334e691c3c3d38ab942c5c39dada1104348cf79134fba8dd3f20557867888d3b842bd3e76b3421cc4be7b26acf9a3ee60655674228e8d71a062bff25f4ca6fda1e7d7b6e6a0f4fd4b66f817043dd2aad06693ceedd0a0cf4b58027caca241443fa7c43475aad133daad820d23867bf603d75612c54e5d73503ae7dc653a88073cc27ff33cb6de14062fe757bf84f2742f72523d7646cba024a0a2cb0c4bbd59dbd406fb75ee2063c25ff06300c4d530b18c73b8a6f7ae644fcfb5b9d366ddd3864f870cf6b4f545311dc7bfac753725ceaa21c1b70ee547997444031b94e409ee07f0ac637ce62bf9b602b54142857b9405ef11cf9f8cb163d3d2cad1ddc583550770c6268e28fcec5597a09785eba4fa6ac1149b2cdabc877b815c763d4e6bcb91e44eae6fbc1eb86c78486ccdc45e5612c76f70235f742764ecef4147cfe5404629a7cc36f2ce8242c63edd331721d52f55ef6e1d4130445d2894e3a442cde63cf3fe4c32525a79ed100bfbedf751d3d16cded1335eb6a703acccee9fac1f91ba38d621547a8f3f05a9520716c1788eded6fb869625439c06adb43813b381dae05799b0510dfad21a017fef220fe4a3dcea06f650803e8689899cc590a5d88ac4b4f091b68f52ae5a619ccfd00ee9c51778dcc77a4713ae0dd9ab8699e83ada740a968a384447742af60b0744f3761e9f4a93b27ab956d7e27870a4d88f6a83862b45ec52cb63fd913dbfb1089a6f36818072dee293284beb224cd5975193437a00ffadde282964986a873c9bf05f2d6a94d60ab1720e67fdc31786fa2bc34fa57cb369aa59d9c49ac5d8ae4b8722bd80934f7d62df0d9bdfa36022510c7410dbba6f1cce53be77c446f491b2425cedbb1cb18ba654f0bb9a39e29536ac41209ae198a0694823864ce5d9fe18f17b1a1bd1c22bcf71a7e9510769dad8e257c888252389b46be1a4509abc4758550c5fc7b07b2866c8581785c32d023eb3986be205909c770497146067beddc22dd09c4130a44a7132f628d674f386265373fb528f9d85a1b868e4f86f91eec338e5b5e7e3e0ef083fcef5649851865e59b7e7bb24f08d801b20153760e7aafbeeee50193461f067ec7dbd1bdfeb38dbf7c869ad835fa0be0772a9edda87ee2c57a0e806c326e4c90804f03256a0b70991cd2c684d9a1921d30ff847e1c218b55a1a0afd3855cce1999da22b4c22af6349b529803a9e1a2dcd4c3ae754a9affd393bf4780f49aeffbfe6a1f7aabd1337566e08f27daaa025215f570ae8dcaa381d2ca10d41f323a5e4bd48b943fe3fabc718e16453964907c3641223fcca8c46eb802c8786e92658485d8136cf1b4f3322bb39b0e20955db4349d77ef088140c71f4e3a32ddc9acd023a571aae50085b809a209a2913c4290920748f1cafd04def62cd7d5af026677c7f965e77a0fc1d776b37a59aa58f02aa3673e6bd4ae63d63ea466ee8198b4c6f3aace0499678b866f3f8bfb06d7247c56ad9e27bd8c91ab464417d591900ffba8ab7aa10095e502ca06781fc4f012a81d61d98f9f24ebc8226ed3d91927f905fc33a94bac94375da0733fef5f1bb043b9a7bdec105ff412d1f35fdee4c09ce56fb3aa99e2818c03315f1c60db51fb8e2ac259c50325414efa8862194e3d5c2c210738e0bbdbeec27b85bff89a31f6e5ed93bba391881d3b7e1027e703e1faddda69108ea1ee72e3cb69c148eac802cca5ec797cb49cbff3b535f10511d7c8e7897e1620426bd7dbad6a75ec5f3264a2880c595be7f74cf8264e10d713881a24d859b512d0ada8080c20881a9fc5cfd68725ea538ba52fe133cd3124d2425693d8676a904162dbe4eb4f980f9325fbf6735aeb76d4f03d4047ce2a6c3b444f4c4bb155daa70e236f9d5f766e9d49e4c13df738b277b4964248fe5993251c40da0a9327099c9ce9e6aa8eb33f9b6f1fa2ccc0f0f6b673cb9c85b4ec79516e17c2749eae1d861f5d5bb27ac878a884b6743b0954ee6de349c32f4848d4bf6ee1cc429d6888ea1bdb55851b6e9e20b86ce6a889f534562d14ff414ce26e20511b049dcc6be8346862a531ea8b50602fc6cabc06e14f67a07181886b458ffadf44607f06e042fee820062b833bb6f322489a141620b0c3e31590859bcb3634a6ab7bb3223396353724112e670e5b8874ec45bd79049c574fff2b2df66b6597139342afe2bdcf785bc896d2c6b478c489d4f5aa614e8e9016e8a287ab940b32ca70f1d91c441874e980229efe7bb5e407adb2385a556843a3918234c34495f2aeb87959e467d4da7b279a42513a09bfab72aac9e63f25fddf33765ddb2c8eae2233a3db294c603be4843e36a83321a18f1dc05064a30199c00ebc7fbaf22d5e3b260316e4ed30d61ba734400a347fb62e4684f6a384df938ec885bf467802842f0f92956ab749cdae294cf5e79892afb82d1389bfb834413cbc157077d7930f4295ff48e4323f7e69aaf3617486ac05c1cb3fe6829ce3147edc9170643232da81fe111b8fa771bc23ee48315a1c26644211ee461f45912f0ee269a44951472e3d434eca283949640a46f720a75f4a61f88501d1be597d33ff355d36d321f34cc598e616392a31bdf96e9b73b2e11731a5382fc4635420cf9e9873b2c599392f8069d935909e627ecb455805780d5b2d9232c98a9d1dceb5cdd580e67acc0ffa7c169994ed0f47268009983fec49521eaf28970051be91711300a0f6dc044ba4ddccc26220733ae82180c1972a8b0550861fad3620a7182e7d6998942aead32b291d9704fb3928d4d265425c07d044f4aa4762f80d4b2a6d12605f12820231f86b7f15ade4cd44a8c63bb291c8f604e2490a1d807d2ead08ad356e38ca9d14500ce40991c5c9a1460c4fe233abbbf6f9fd95b8c1321aa0648beaa898a90a20d6b799c6007180505bc5f29c494af65f71dd40b6c33cba8aab5695cf4685c802f551cf552a1f10b6cf105f85e92038fa6ef15c84d2a2ca3bd925ce4996e95fc6df885ca52f9e171ec68a8d73e8b82efdd629b3fb8313e3209662019b46b3cc9a8652af49cb612c9f1a2e10040028425c011c76d3622b1a97988c919487b34c820e6b4b17cb9c4f2d43615e791bc9504f98506cccb3ee43a90a0b86de56f9ba98dc604a749cc0adc8f972460965941c95f45f6d30ac326226618a27c42f4f26acec94296f4a6e40064a759653b24861ef9ae6c2afcb76b0f514ca6f906b0dd3e2c22089546a0a84ad7934913477a8c7273518f15383f0d4d7f98a0717cb64f06b78f85933505c796892407505bd5a7a73e340704134f6da5231a7843ef0c213f0d334d98397e6008ce7c9439af656e95685c6138fad17f41c94494e6ad1ca06c6557c753fa1309999e7bffbcdd7632677584b0da032946f00ff5137e6d2a556222b0c739ff7338ef50e6779a57a6c76ed5d6754617ffe82bfe1df59bc33ce971951de6100c0f4b4395b245613651e172cfde3b8eabf344702fa2086eb8f9777da5b2f50ee1a2135b5c1ca537d400ee16f1ac9d654e27ea04fe2c5bb499d545ef3da9f76088087449ae54ba145700b272a9861cca4b1f8633c4aab0816c6d1ab84e0b04d192784f03fdb701dee79c3d44c4e05d133f9d193f01f35136256f20d02ac58ce057bac3a1fa8b4d54071487f735aaeb74384059c13f0584e8a7c350af420fc34349499fecab04019df131a01dbe5ce8cc4394e3f8599994fc8085e9badda608ea1030c4194aa41d22d2e7a900af69e4fd8192d8d63c5292978da563f0acf948618495fa90cb8235ac953882741a96e5c4586f4b0c4a6ce59683399d5e20880659b876c3372e38d61791c3b34c720d6afbf531bf58b0cf17327e320776787a83a127f7f7fe32d37a2f3525ce6b3bf5e799d66745b71739c2accfcf7b3a927aba169f4b7a10a1bc2ec21d03ceba0e239b8c7fbee30addef6469a8437aeb15a48daa6925165cd415488a2c21b9ea3dbc8fb54a9b202c0e5efa336d2a63e19ced0b08c44d2ec275d05aa523948bc4d4fc53d42e3f551eb49a631b192811ad875f7e53a48a1b3fdd788cd1f18ce3f324cc27a1c80969e06db2103ee8fe566a6005c7ba5b8aebafcb3056086124071e59cbdd88a96f656b36dd7efa2e8ee5cfccfc0017724a1e3d85e8855535d53c02afdd2651172cc068eaa6eb9fafe493d45d74e495aef05bc7d319de68356ce1ce02c23daa014661cb2608d18c3f19028e15c2c9c2732ee5d76aa8c687a471083711773028783d146d92e684c0a584ee9d5f2b51615a1423d6fc9a99d6a01cf7fc15f45b8785755d9393dc1e2e4ed0599e3393ffa5dfd62815faf43aacedb993559f56775dc6b8f78b1bf1ff3436f076a789cfbf6cc93003acf539a0a9f6c2873a3acdc494c21bfade79a8c9697b725de2b23dc5d5c8a4d97d1877f252b811f1954cede6e17494f0ac41a25b866dab14385dfdb28a7c185adcf414600d59e75066d5d896a655fc89804c011325a3c3d4bcb1b50dd92fc9f3dadc40b2d9a601f2e9b312acb33b95c411856adfe1e4e50f84933c8ddbcffdd3639f2c8a63bb7a04b70fda36a2084d8618bf874c699b6161405f97c032289ebd0115610e1552f57ef357b5f324dff58b5cced0388c3bdc56490fc820d6bd56c44fbe81b17f7f9a8e5c2c4953412f27bec7e81cf0a476d28ba96da8322b369627971017042d5a858978f58992e490167922d8f68882591b6e61fbd69f1447c9c83eb2ef14c57f5e8bdfbbb71694ce18c68e813c4787c23848d0d96e079fdf35c3e0e4feb2575e8e7e47f57ece0ef7d17f9cdec7b23716d87db3d275a265de6bee59f150c236077f9b1f8df0a14d3a7fa3ff8dbd979b1b0c1d848e878dbd381cbddcc86bcab758296961308dfbfe60ae64a160a44d016c81ccc5f56ee10e5f3f1ba2c5d931eb6c708e2c6dbf2d22f91ce22d0a7e6bc20921691a025c2675ea913dbd3ba4f7f516bdab47769cef850797ffcd5b3474c3f710026f3ccd6edefcdb7b361b508d4731fb8f08f653cdf9d72196fe11ef17677d826135fb22343bb450a4b1aabcb06ed0773bc9ac2488df059309f1d2194a9ee3179e91328944e8561cc7b84e083b7042673ca8ed8c036f5fab34be8e1bbfbb2978c61bfb245dbb92d3f133053c3149873bd2996143f318fcecb8d3d41cfa87f2a5e8d92870a3d480e167d8828c985348a1bb9557bd944998dcba8a7bfd49fe9211492bb4477576ddf21986ec18f14de5f2902cbc165ca7947c5bf7f3ec9a1c044233cfa10061ca04002478d41e02229a07291a5f742439b5164accc310de64ff49966ac989b015abbf543ff708497d09251ef660034f4056c5acd0a1253a22d1e03134b886c0717c5311d2c93a8f909a766b475ce3b5bab4b2c1f0d22bf903cab98fe4c686e0f32144c40168985fe64848ad691d14d13a4fc1ce810472ceff38a10ff1e3ee382fee151bf28d1bcb5e87d978aa7b1ba0523c2f6b16893f12609c1072422304dfbe99d865be5942ad53410ee56b050798cd433e27c658da455df743b3cf76fc2739f1df2e682c66ae73bae634640f0def172408b0e578fcfc8c119fb6d3c20a020d385bb9452598eaa0b23b358fad04f5d03cb52ef3012c6c9d36b625dd0d1db30b37ed181141ddbe37a8e7ee24a810598635d94fa42bd5f8512980ec9d212ca69ace9b4c8880faf183514d6c7fc9f2af34433cf4dd551a6738880898106f5a354c37c19c3c81344e46ca64ecebc3704c97aac55f795bd26306987016610061abc7dc94e4c7d2709e50f3fd91c284706b9bbcfd9ae1cb093c4e8e11937d92c4355cc3a3e32c194b107f3bea081d57f94cc377419902513a9a9c2af021429459575a913c87598d622fd82d4f977f8a5b35aa5156c002c0270412d1a3797403f2028ced411d4d7f25ef0fa95a61b10093c236bdd75da3df20325733c0560393306863f8006dd044ac10746791c3ac68be3a4cb724e5a9287452a3f7be26d882746cf985a3a8b85302ef6cd68ef83dc9616a7958dc3fa4ef066471a4e6fc4f3368a99eda84258af7a47a4c8281a4eea2a7588a7a469456af8cc149dbdb5092ad24895fead1bd55a1783a1df0c8954d4f18e88a77953cf7e0b1cf5342dac3c581086cf6b1d79def22c92c6df21386a1e71e8c29181901e6be3e7f842a289aaf4628fc7787983bc0bbcd945565a1219aae3adfcd965dd74cd66938ace34471af6d3fee75edaba83f82378ceb5c5a7171cb21818869eb13699449d8c4dc5d3288413f6b07772d0648c4752076a52b2c96e253519bfa70d8985c605cc4f5535281d61d01a64315c3e30317f317b81c782db50b629142bd3632048ec441121f4a1ee8b91e89aa16515964cd9b0f36aec2a0a596849fd3d2c8fb9bdc3cb83f6b6d7766e247497eb0e02a6d171ed50b8bb30046b0d2ae1e9eec7a45624f243f343ca11fd50d166759a12d617b43940215458f392ad527ca2fbbb603ab9d15e3505da8568cc2bfd9910125a242f3292f8ac31f1f73029cae4c8c925982fc3bdc8c2ed5e313d7cbd907ffe01767433cc90d359ef3c261c5fc4e5c497c1de6928653e3d8e6d10574bc2b2f891cdd8128ab58b242d2560fb31c47cf0801288a4d0d2e346159c0cc360d20308957f12027d1b810726a2b31c20e4dd0d2603c36116aa212528c5924047ae200b2f5310b8aa213b6959a809cbc0c250a4054b37614f46aa9cd85c1f89c6adddba4ed940175a7267c385ced9a862cb359aa25b69f67647fa208ff5ee616e969ec4da87b48e354619fb389098c21ae9e838cc1360f005b7e087c9cfa8fa8bdc432347689567f55ff4d607d832a296407a6bdaa39f64c60fb885c33c689a1736c489d60e3ff129e0caa351d0c40229913e02f0a231c9d9bb1d38a4ef220971500a3a24af471da2ae9918dc856107d56648ff2c70d942f1cef78441061cf0517176ed93a885c846b58b24a692388b2847ec67e50d8044a340c63b47f37245b9264cbdd4f7b08040b4c706412aff15422768c762a36df954df1532abdaff3bf97ac9a195b3c5a999765c23307c7cbca6288cf47e01f0c963d201789baa8677680f97b4b802b2f6d1b3db743582ff8a44c6909309ecd7137020d6b98c9742e012b8823ab35b180e1e4620284bc399bb34dd53e3033de404d9dc2912874cf1360ac3339959b164639e4206c9684201bb689131d520d0434cf31fb784d34363300295bcd89530680df64b29d285c923246a7199436b4b0024a29a9d20d8bb24e4b4a7806995743a86ad895d782976ab938d20a8a852329e4fd3f27b7cc436da46b561cd6918ce52b8a83026ee42f46a9c6df6a8caa61c0cd946854a2dba460237de7e7ad81595c96658dbf5f61a88a6b6316cf0780dafb18e1842ffe118dd92f28c744de722a5ade1806c577f20a39413dfd779573f7f14f5fc59c32db40d1ab8c1455a020365794488906deb42ea04d5d78a7fe2ecd5d8b93303051f28ceba065c5d85d2ff0035f44c85012daef2df16fef6b712a54064b712723cb314bb1d0363e62f7528e5fd84bbe284c51f3c43b3afc65ec7c69b04988e2f9257276794ed4c53cc868afd4fc974f605dbb096238df47537bc4c27b4c8184c4d6563173a8f86ec2dbf9f5f9eff2cb9865df2099ff9f0aeab27bb9f09ba242f09fd459f4ca4a518f48f9ca9531983c47e5a3ec5ee3b8b3cc482934ee4b7622534789d5bff2df3b18efe4409d51ac7fce1820c0c7e20c0974ef37875916e70781579b44e0c938ee4778f24f91f42d6f6967d081255ed5e2669aa791bb55c28a16211b016e08aa2f2ca3c88063210a4f1205bf5ab9d12e407b774e915e5ea62065c8c5b45fc2be7d3780d1a76c34dee3a4cb808c7069f1e2d51cebdf788577580cb4f8f3c67e43896b16e2e013d36639a602159570cb17a852abb8cc149f45a42e89e8c9a76018b6e5f0fc281e7d13393aa55ec0e061be39ecdff68259385f8454ebe4610f78a58fcb694d499bb9df2977eb2322e9fea4a5319d1e2e1c4677e68cafd3eb11e7e7abac05251407b45c61c91649b71ccc653c2a030c98ccb1028d2e2de0acdafb3261399a94e6315627ca5a786ca29e55a602b1a4bc3818f12bc899f8d1d21ff12be793f8dd06e314db77dde665941cfcaee3be8856e8005a691f1a02e8bc69a080dfa69bf61cb1e57b47a10d5e30c064da11d42107a6703c3dd6513c012cfc63fdb08234ab423268491c08582ea734fa70e3b5225a0797a91de8800dde2b9f14e67e10fa6876d4e50a889922152eb03ffe0818885b3bac58740422411c6fcbf651f43d1add5562876d52ffac06b58ab49fd73686b6918e26558b2949f4f24e89b8295490005d542c38555c8348c13f6f6da642e4d28517631ce3b1a81bd4fe488324bc6d2a38ecd04305d72fec580544601738515caaee8fd73fe09e2f3d020deab80fae5af6e154c7f6a31a86909465e4ce4ff76f03bd44ab8295dc3826582051777a1831ce0bd1628342b3bfc093ce7b70212f374341c6e7e88fddc0fda2879862d29d425d40d4d04faabc3bea5e1749bd5d889430ad34e5bb80b38d66752af6b254838610c860c1a77ea6a10a599fd03f2df0bb1c4012f1fd0725cf2c525454fa6d4c732ef4485396d09e3ccf3338220e1657e81c9328c39011607b21251b2f1222e159c3e516ee05c5bf99e093a680db37981d915504bc48565503d32e27f9464f27e0c7de7b0232c30144d6eb84d099508022fae0eb75d421e03177c27a29580891e1f032d6708fcfa4e5cc3d36b108e4b54ec70cb5628833ad6f1d17be38238395a8532006d55986b465a1c47ec84a69f247bcd102d755a33facfeea388a04e9de31167ba74f204bfcf879da8b7c83996101322758ab13d6f717edc390717f859fff6c83faaa2cdee6a5f37c3770283be54f587148c6b927dc9e08c166e01e458e90bab432902f80c4cf01cf86d26806d771aad4750cc42a6bc7a7dd5ad5f48054d8f0a5ece396c6746eedb859622faa9a78370c9c023da4c611385806c90dc11dcbee3377b890879d5a8e16205e944b0173ef3a66cf8e8d5da0bbda337c39f426b65c773aaf0e98b124ebf6113fb6b82a39309d706202cf22a61169ed4cb3162ab64bec4ad35ee1d35e5e0fe8192946d4ce2e646cd2c7cc065e296018461e59189e3991599f780b4d3cb5cce243210fab8baaa0f9855baff536ca67f64454e2ee588a55e99de33faeb1b9434acfa145ff28142950c028bca7d62683552f311b13bcdd649a12ff7a1452256c3d5c30499e9293d2dfe3e9517872fbe9ec7ae62c8170c39f3247a4b0b49ee4057b797e42a61f2e6a6418de748ac547fc7a6f6afd12e9cba1df20b0289c6bf9478e7f103a3e50c245191f17d148398c87fd4a7533ac0d2e250eca039657b1c96a7663341ef987467d3117609f08a0519903b6f02e367b7f92aa693e190d0298375e71fe137be70fd6646138ab40c4d77bd7f4f5612ead5e614e36d4d33705e58d492113c44c89e907e34ba39c1999ed98b93f4821957fea6d44b30bd671e3b2a67aa43195e1c1254dacf9109cf03e64398e8dd4f07c09f8a5cb41da8dc593e42557cf2981c639d013d5d0c166f0a85476848878b3ea4a5f9af6a34529242d8a092d1a925f2a33f93a19254f2a6265e07d74644728aa74dd7eb6e51469852f981ea5224b8d823082e51561422ac568dec17b99cdab326a847b7f0e43692f18c147fa742bc5d6bb7926bcacd3d8011fd191d76dccb5f4ba010ef565fc63dada719219600aee4b94e986dc38172d6b363f899fc6237739f6ac6257602efbf9897c1d5fdaa96431de651371ea5545612cf6efdcf3264280a2b45614e8472c934a02454c2eeef20bea0f29851f7f68b24103e43a46c515b3d5b57ceca129b243a7c77b30952c13a190244f7286ebf6d15f7150b93476c5b6722eae6e041bf44b2bdcf3c870c403f194b5f932b8909e5285889f207af83d1eba2c960c406c19e343f58cc55f8c8048b2c9a521d01bbe1b090cc0592d5c0c6afba3761cfc82f3f13aad4e150362dd99302294a9509a86298a396ba6de8de14a03b37d5af15cec94cfe8becf596c4f4a9eafa526e9c6faaa81a313c0099d2745149c7812d8cd53329750a40cd8da89b27167e2bb4c718eff64ffc0cbfbc8e837c3c76c091ca404fc1868b934f891a04637a4fa9f0b14cb1a93cfd26e66289199e70dbc8c09dabe6458f4ec7720ddfc4cdc2105bb188de7933431e479ecb133140080a45bfc244a539d8853d5b5513079eb1a4e62a314439585392082d139af0ba2951955e3cf38fc485f257dad53804049bbab40197aa0b1ebd905296c61c7f3059bfb23732e2a12f600c1510df8513579e6813d98e1a08b69019043bdd04b9459360553874302a5edb1699bb88fb48b02773cc00233c3e8307e659380b082b1cf4c01dc8eafd86d5dae36a36296c2716c7bd5783375089a02cf354e9b0fed9768edd0c638f94b7dcad77ade7db38671a8f5f1d7c286590b9a6f55445254ede3273e2aa62debca12acbaf47ad0b66451ad78753cdd60dcf6b7ce644b78d5859707a630ef754920ffea41155f2f455ac16072218f0ec94cd795c9616318b5235abd1e0b137351b3c0071da5332438ee6b25c029ad4b90664d2f4d3390b5c2eb4ed2f79e8f1133029a3d7ef724aecf78daa770084861dc578b9fbe301e662fb0d38970041fee15891041ee79b316ad400720bbd6fc536368f4fe1981f0a77f2be260f326646fb93d55bf3beeeaf7c6cd3aab7f8f247c3e77b6c812108431455874c6a40b217c2fda1fec3e63145eb44b1f8caa5b17964cc1d728e3af32b109f7b281d02030ff56f4ddb105547a63c1b4e1ba381913c75dfddd38aacfbec625f2864243edddb294399f6bbc1e91175cfc9fc04bb74e8cfa7376452988643490e0d0af68882827bce2c9d5c386c902e8b756297d5e2caf7cf2c07e130f072a9ebc793c7e5c2b8d3b66bf24b02836e738417b3362a87feca52511916652b17464a8fde0245b2afdbf3197e6568be293af19f6de256803c87d200317fe1466847e74bae65120e591716bc60230c826f198fb21b1e3aa996348496052bb584240d56a75a8089d8fa11413b2c261a97594cdf7e04070602369dfd30c5cf5a6d5c4e675f4f614243edd8d9f4e3198df463b3cd9986a897682b3901ad251607ab95ca890da239291294db568eabd1ebbabab5152824cfa63e4e45ca8b9228e14fb157806bf5a9b1a021a6d1e52d0e89ad4385f71158dc57e5df0ddbd7394ab8663ba6897027ac7498da1a3dddc7a456020dc70fad069a324983a5088e32cae238a37a3866961492cdc49f79e9b815c2f90da9cc4dc50b5b5438155d07f2fa2662ea8de37b09ee2fd3d14adbc5d0e65239dcd5a0bdfc06a3396461f31005b6160c1730679c3daf9d480eaad93cbb7c95b0286ee375f8477163b2ba447469d22c0a94bcada284fca5d43a4c53814788035f7c7adfe6e40c501557becabd629753a1eda5ab997c0d20fc895d4248c08a3abe70d2a3d523b7348bff5e7faed29facd9243d79b955d5dc25751bb46b5a471dad52afc3b0e9a0a37a6ab5cd861444286a8712ec47efda4e006652dd9ccf4c4550258c2a2cb5a374dfaab18d945535bb035eb9790f22041f2ab13ad5342a692dc65d3979fa81d36818f1440dc170288d1fccda34cacc3da96e5c994556659af65b0ace77561ac870026d6dba61febcdc5c97a5f3bc31fe4e013ba6668ff653d7eb7b36a3d5211733ecf3e2b452c588e4f316b0d419e9aee05d3530f7fb670767eea9c5daa638e765ffae7247ed314496dff6c48a3ea9f967482717b467c7ea320b7a8d30450a8fbba63e646e99aaaa3d98bd83da56da5e9f436c9551f788b97b17a4e1d353c567a9970dc0bef4f385a402119fccc449e8083efa4ab434afd8a9264f766bdd45a8d9c52d40af54e812ed8c9020fb1f00d10f4ab215fdc66ac43eea60e2e253e79936cab37e042a0061dd8e91129fda266cd4ac7ddd120c652b2115bd81253214a7cbd11f66592f3f7a991c08a91015e64c679bc26c4b1d36f3a92f570ffa3260df454f41779ac8545e0f829bbf7c29aa512c208582d5f19ce837045e6fcce0ec617d5ec38e28aa16f0005f56a04f63a5f7c249ada65a9b2e8f192816dc40bb42688b38d6ef36289851385f4b854dc5644445b04ded07451f9537b3e6c270011d562000257bd3a8edf91f539dc8211aa0df37c6c5acb03aac13d08ff6c8b691d0c8b0fb4eed6db54398b06c8bc7c596e4549c1e8abfb6f98585a6acfb4a7aa6a8eaf0332495f422a970453b7df917919c9b1114b3a77f2697604b199667eb24d13e893fc61cb3476754f01bb6f82c5de0ac973a891240cc06bb71630f570dccfc6ae175a6fd70df6b82e10f43a1f463150e1c1eaba1ab2124f7fc0e8f18a6cb55547f324bffeeb92f98139b5cb504b9b64a929516a18017a020cad25d1598be6a957286e5827c5125cf349cc9fb564033c63271e5ff87e4240bd74bc01eb4ea5bae381211c32f29da88eca8377ff73bdde3f637fc4e7c26d257ecaa791cc8ada96bc8fd156e4baccb7256cc57662bec15c263566a19a654eeedf7505ed6ebc0d163dac8b69b0448f291c4131ab1e16c9ecb0ef89862ee6de6193cc308b7ab9ccbd036c33d2fc9dd939ce48644e04fb576ccbbf044d36432846ab7de8e69d251719c3b1adf0a908c9bfdc846e0ab8a02876813917ba3837d213a982105876ce2b6d49ee2f071a1c7b1d11f3a5afd98a54111821eca4ea4e4978ef2e1ec41a173f0ffaffaffa53f975274016373751edac84c59933cc2fafbfd8f0f6f163901dc6c2d66f2854057b9ba9232e397ed16b1c8c147e724b06c55f829355e706c53c27969c0b8867c81dfeda91ce4854b7eb8c7e66f84bb8ede69f24dc4515893972f2689534fb157804d314b157146092d6a96020c14f3a92d4625198ec9f5624fc96e2c3e419d6dc2b67797e70a7f3c0a60e419e592b8931f410077cdd429a8e6035548cadecc6dae59a2fc2c9ec826717b6ca59eeeac3c4f6bb52a3df4242cefc62f306a76971ee30de1bcb504648c47c3825e5943a9056a4b3f488031cdee6f8d174a1d9c2aeefd2ea35492af7e266e6070020f5850c814a3b7c19ebedc4eb6a47e09b6bc6e9810931c4a471ecf07448b2f8a614270570c3426d80cab7b298bd1b139f99ac747026cefd3f39e983410ed505beb24af94b14bd2fe9fbbcb15273530a365125763994a1dff0d897b0c5cc82b28e9d1fc3d819ee46dabf57a06900a6399cc19e69114188dae4160c7010e6b1679a90d5e7f2c9e916bf1949d98fb28c03205774f37caeedf438788f0faf60f5cd6438cdf11318fd273dc4e65b427c2d855fd8ad380dcca590b59906eea761d17210b762a9cec56ae3dc938c7fddc41fac6e22696501024a4206d716802772cc5cdd8a3d7939d2cf7ef898899f54fa3c77fc4fc544617abb34d5337bb8fe00e3a5566c8cdb5656725c12d10dc04cdbc8f1d2a3d384ceabb981df16a317ff296fa524aed6c9ad8827f7fd22345a5709a21c49ed9eded167399af2f9817c2390c1c435d46e6b81a820420280999a24b410f58bb1ab9d8da4a640438ba3b0c4f71c165c67db0350ec671db0596a7430a9087de10a0e43c1bd40373985091beabb7f2c76da5ed06338d53e01bb6ac120a6e9c93dc0764e5df72cec46cc96e0131d510f38151289b088f590e8032185a687a5fbd16a57d7e4594b073494a0f8606617e1f46180736956c8af797f685f02a965c535621840bbc729b5a94dd86f70fab5688a0332149ae352451becc754bdf5924fddf121ac9859e266d2170f7f9bec21a2d690c49834303f3a4d54ead9293c9be49c74cc2b6251aa82d2e3c0f11d39f2ae5f3f1b1675942079a2ccc18b5c9650874a300255239aba8982750986cad124953496299ffecf07006fbc9c42df14ebda239cff441fe34ce49179ed3323eb0b1d4163c6794fda376d4dafafeddde5dd200bf7dcd8983949c4e31d64374125cfab9cf228807b666f8efb089268aa0d20f1df860cc5289ed8cd747d4b4776f6af56f6b582723c287747f62cd8a1e37c289f07d2a7b2a604b7ae8304dd59dd603131833ea8ac69503f1529efc4f24e5447c2a76fdfc09dd1860e87bb1c70277ea8a7c2966a10796f18970ca41d9fac8c0faba3484b8bd809e935ff247fbe1b560a44171ec8c6eee9fc068262f11ec3afdfdd65812a62126a2d09182aa00b86e83d9ac71ad06c7c10144362808403b38e5712cb9aaf018802c1a6b10b1b8fee209ea1e5cbd4206c2d3ba1d356c6f8d4f7b379785cd7a0b509cea2179deda69781dd8881e06c81d60f462b4b1578d660c20671d982c79a5d4faa94c0dbf2bf89eb73e9cf3e25c2c9408d9844b38c15707fcf8e42f7a7730ced2a1c77e5060390387bcccf6b5ea7c0509b02af38a4ac15cb61c26ae5e9ef19b6763dafd989fe8a192ca93bd66af25f28da7106d029290b6e8d119ea360af02a52dc5cfb27fc5cecc99f1d79e70af7a7966d45ca250cb6ea9c5b7b76fd92e3fe8b018486bd307a51160c76b0510b139a14fd0c4e4e59e4f8831d8594017591423b17263e3df4741a56e595224b71e9c7ea06b31f9473dbcfc9c923068df6b1cf31739e3dfeee6bd6f3cbc128407a698577be839f8a885a890a48edfc85d19cb6beaa09c43b22ba4b92dcb64001fe5c140a6ec49b19c6d6502030bc803295a0d73d04b92c2a06ff554c5ebcf6ea69978fa24f5af620509e8511e74849824372ac5b83ac007ae9073b5b0695ac7562fc66779676de998594651da4d15d7c668a9406102c35c2020788c3ec8b762c415048cd016a46e75374da8b841807c135f2c7e4afd5454e283e0f0e025e3af58a75881b0895bad12585562d54c33721a670969f8683e753bb3fd6ca163fcf4d717e7d02c12bdb8ef7e5a976bbefbc2d88a6cb7fa18e4830616c721c64184361f650177ff984813be207bbe3945cd4830c1479d60da82e47f92b9f5da94835a6725e96d177f8ef11985e7eefab4894061d1766f963c002e5fae8678d90ea4633c4c1b94adf650c83aeee97d6aa313a2aaa43710329efc724e8972e90128d20cba1f8fdcd93fd8ba26f2c162406817d71385417ff9bf7897cdc049f61972134ba72f54f9a5bcb12960fa1179af85a93efab360725de5d743d84a97691547b76790c2697126484024dd32b6b0228b842aa58144e791fa99a97dd4a58056539f5a970608b2c19004f94e1af9c40c1d6744835ed7f4eaf2f17d174480e686c1f98367c03d556f5d0a89c6d89c1277c0d8437daeb70c3cc8dcd56c90b25c03f7726177bd3404529efbe7dca4f1c19607e34c882738afb01bb72c84b0d8a3578efb37c8a3d5f0974107b288685b0713b851a1f7400a3bcc286367b4e0e690b8115129dc3e8196761b7b0b19817cc9bb50a9f3137b46b6776323111a8d6a57b96ced921a7782b124ebbb8db6f9b86c30231c193b914cdcd8f8f042e67e442d47b35e9062a58b41a9a866fbe8f6149f4a3bbde546f0b889ac51d97acc8fac101b6a2d7a932064d78d7b30170b4dd7308bcb5527b33947e45a5d2c5b0bbf8098eca05a9abba7b10ab186ea227a0615a405c8362c0fd49af01656ed16aa5c2e4c5fe922e37746136e4e3e865536430841442295e0b1e0635998602ecf8ec2382441a34e2c6ca2a99d30266bf3d52269377c0bf8c51ff9e50c8a3c3e2fa632ee062e277fb4c86704c5a0d5887cd691b4cd3e2e39b9188dc4bbf992a150057ddae3eaee3382be3cc21c01f656881945df8a9c1ce97eee2d8f0dfc16ffb4e8a0ddae282141b571c1e2582853d2a87216a8ab9490160dc4ce7d002f123c2f5d8f18abcb27c7c5554e4cd610f7b99f4c284a208e8d3c0a2d934522ea6d97fd3fcc79f188a857dd50b79fb8f4a80a7de977de1010ce9a01e9511e0186fdc4ede077a606ca9f92a23f4ca17f8c5a8743d782ad68b0a448b58ce2824c2d1614815e36bc74c285231def6c21ebde04fb8b15e997d49913e0dddf083efc816ecf62afbab3ea99c5538017b025885e2205f8c8018e8af1ea785286b83a65990cd81d6788af09826e445971a26136c128a62198d8b147bf4ec14a47dc341d6cef210f3676ae546280084b1615808c73336021858e71db8178fc00b509ac356277c60a623c857f00097f4c8715c0fdc1f9ee815395475224d047efc25a13092a17a1351c66b6eb4944a2fd0aeb70edf4c96f6e9cdf7a8e60aed28d251018768ab902adea4daae018ec6bfbd4e75611192186678ffc01f2103e2f44383c130fd6346648b5b64068c588c136f88dae0c95c9f2ab0ac3d9318252809da11dfe35397787efda872704aa86617a0659537cdd2750cbb6914b13201f0d813bb3ec0115d0dc1847979a168cd9e67ae5fc190bd0b3754737524a7cb51e348bb42a941ecd2c73bb10b7180599ab617816cf2d37575885e2cea12b3520857784cc9a9d724349f1b0eb01cc782de09e19279e8de794533fbd0c24719e913179359a3b7ea34307be10a587b91ccdcadcec99a2e80c6306b7d892505af33033de00726b96505c83c5ea1f46725981128e78c199859ac3aef5a550884c27a0c48f70e8fad8765bff08e87984d5f09aae6ce18ba2b146cb780d7ff7ec9f83d34ee37a4dda550501f42295011cc324164dd8d8b1fb52a64d7acf9a05372b175ef291a3f925bf401bdf8f9e1e8b2e052be998f4d01fdd19ab7f43892951682075d11be9d000ffb2e88111b4bf9f06168f1db07ef120ca086f95ba0fcdeca6736dd1c0eef4d87e526a753acbbc742e7e7c9a020a2e9d910963e77c09ee31fc6072c78342409170e670fa46382be487e5064408a6cea9cc5b9375ec68ca2189bae8a02bfbb48d7966940077616c2b0882533a5935dced5aa5725d7cbc36da5b5596b944a5923e3fa48644996e0c5300ad5d17242943fa9407fbe136fa57eaacdf10e310ec22056efc192558bffcbc637f076993db9b02561c2b09d5b014fe625c5f22cafc5c167f8c282b1a8a6b9403b91bca230b8e8920e8ee91cab1003137d5d828010292b5dc4e53c4feb49ca3fa06248fbab1a04a2a60b39d1e034bf7901b75491b24e636c56487755caf3bd2d472713628a1bf802ffbb08a429a2c3bf0263e592ecd3ba9a8312b1d3fedf3711168dc8707ea77ef0e9e0cbb89a43cab63233bebdd3f2be23373360aab8aaec7cebc3256792928b6e7b42e6173ab0a90a62978e56fb0bea8aedf1bc1b745a29597ca040295ad0df372b9b05cf119fe045a39aad1ae22eeba4da7a5383fb40bf1dd5483afd7adb8b612ccd506aa14531b07bf52551f992e6033eaa14b67a5dc6a42e6bb9063a9538c3b61adec006d218d9aad0e8e916ccf8074e05b41845f1e7fd12a57f3f1412094cb002d73fc1efb7ea016a9370cd94950468bdd4e8b8cf079f2b07905e02a3a16e719f4079fec7ab21886522ccf27b406bd04fa835319ce027f0693cceee92bff2554df35728a38ba97a9401419e28049f2fad14c9ca2dc732cfc37e747c7b2b1103719ee2b51ff5cbf7ee947d44eb3a89c675b290cda7d49d47b54ae52dde14a122a690dd19d0be5265442a32a9467e63a2f241fe27bf6ecc2e1d2085579ee4f9eeca28367456ac6b9ea8fc5c2374150922785ebddb7f7c0ea3eb550e8a5aa935169db65a3c21f02582e98f837043c25481edbf156dc07fda3256610ff236446295ba28f61c7414c07110c8dbcd7caeff2611dd0f311f66883036190b5b0eec4b34ddf929de052482a9f6f2164c074d8c60fd9c6859cf220f7368c0ab20a3be318b3795056c466d1e359c6728fa5dba29b852b4fbdbf17500fe32952eebed86a6641a9f9a9c33e4a96154d726176c043b2c3de47849159014db63dd6dcbc417b1924dc6afd8144619022a7ff15068c01ee35c939821a0c896a40ba9a360538087bd54f4bb252df1372721df6a3e47e6c56d30f77edf3a956ceabf1cbcad07a1514b20296f0ef3fe3ebb5815c87e09733c5fbb1a8fed3a22d9eae28f974b6dd7ba388d88c586405e0e6f8fb83d1766384db3c24583a09fa6603a571e1e19af8f908d105d4cad0b50645c8245d3b0ee9034611668ff9ad8fc910723e1462879524c1bfe5d2f0d5d85ed3c52b9d45225874b7194aa6624eda87cba2ce299cfd98bbd90efd6e10ec3374ec7da3a3d9f086c9d72d90358aa4720aa76fb4f8d593a4d8dff17397d11466bd7e5c7a341564c19281462c1bd4ea66a0e677a37edb6d1f6f37fe7bfbe00d6121e99a87029021c0177ee65dcc983efec5cf9807bf0fbf257cccbd4b7a3b806d7ae3177f26d02993af1036ce3e1133ce3faaae9588317bbb3c8230930f1305d469746f836551e207d829b5b65499121a043af7514796053308f93e252d58a45b456165c49a4973405a68b574dfb7efbeee7eb2fea19d55879abe4b1cf6cd9a671d03cb14e4fb4aef37cb57bf3a2acbbe9d798c3bc8e3e6c6f80c0f7587da1e03842a61f7434b74e44e03ea6352795c40d6554d079db8260ad7889c1c91fdecb041b5a852761fe433db68d2a8f8d9a83886ef1d8e095d737408ca3df5ca01bddda14f1ff5584c3e0b163b14fc6de176744ba937e2fced2f8ebd9c43f238430e22a146f6eeb6f79632a594028c079907a607dbe2b180d2a9efa42f82e3513acec211aeccb8f51172021c988da781d500b18841cae388752fc221f370257643c797f9cb5a66db82d2e917d40e8a87b6370e5909d431db969599aceab011828eaa981038e306386306ce186af1a718739460f4ea88d2a9fd1d8843268758d16264a9e3ca6cfca1dae3cbaa0a888e5f036e35ed40371bbf851fda00553c6c7cf8a18d30b40186e1ef08063fc109348d09438e0022426dfc580a2a0575321be08c2057e964386438643864386427a06bea818ea5a0af293169160b2f5f65e338526eb4109b1671a4dc78b78123e5860dae42543119559016fb01e087df8d1ef05f2354f1a8b146c00256e3696021a8e211be8db711eac03dc800073158f83430cf1403eab2aecc74d8e40882ca95d98ca0161b257b798d1dbd00d6193195127454a162cebaf1e18f9c0d554c15e4ac1b214ad62afd21c7d9a0b446aa1454fb4d29a05b47d4e486852018eb6031845ca5ffc158071baafd347c10fb59e887d5001746035c184542bf8e28196ae62c9521787e70a48a2d6cb004ac1f25e4ac1c6235a041103f3780420ab07e940c15a463a8a399d1324b98dbf5f8c0ace9c8a05b768ec9ac71d35f5a58712e10cb06aeb665b2bc80b626a3c4e864d195499633aa494f3b05413ff91ac80cdb395fd3366c215c818e5c1de59070de84d3a6c5394407f4e6a6c53e42474e3342478e675b5a083a72933e4e1021949372ca9672be9ce0d8bcd1d4b9699b36b2a4a9524a4951f0d954f9738a9843578bf2bba2b89ab5c57aabf9d95d94ba5dbd61f4fba59b1a57b9d988f48b0ffa3fb8aa3d10618d07b1ac1b3624556e39188106d816f93ca4592ca9bec15930bc5d8cadb1d5fab6a049d026685704da2da1dd7babf18fdb902ab720ae7ed162b080ce7a64da50f73b7267b3e917fe16321b62f1cc55e4f79c1ef52f485f3271a36d48abf4386b8b6d3f9b922affe45251c2ed083f31859bdc8854f91b6e362d4a1ffca5f766559bb5287fd04a7acf498b52d33aed498bb20bb5a116a5a6d5b04cb499b338276756e5775db7c59ad52e906d3543fa05673b020450953b556e37400449b9e954b9f154f99dc63dfd22b5a12a7bb421f953f9596270dee15849d08335bc121b5a94af85146851967ea75f44557e577039a697cf3a8cc3752fdf060a7cf73290d0915f349acf3d36c847325d07723d96ab3b9adfaa45f914e426db227f822c04b215ab433e69e49948c620126369615dc0c017605d68b948982a7f6455b9d5d5fc614dc767baefbaa8c69cc533ae2b53aa1ca56cf16c55d93d831f73fc92432fc78d642c78c64d5888b3a812d49ea5dc629e8eec62721bc1fc82d4c81254f95ad578b67c1972135ea1828e5baccadf6a16a648cdc360bcfc2db605e997a91581f1e116648bb528df4483cf06a5df051edd7d6e8de0c2082dd8ebc06988089cc6f1800f0cb4e88047848e0f3f374ba0a3cdf913dbc1d00e9ed448a18480aa649dbf5df9399a1eececc00314040f1255c0fc5bce8a39410e8ad8e1884c881d60feef2ffacbc8827e8ab830b285f9a96d9ca893ac69ffcdea223aaf1d47aacf1c96ea2d19ec00c9b4c933a75f461a479c46bfb0f6292d3a154d2c983a756fd048e6867c9c5cfae8c9dfff719ba8ee8a50a0dd8bb4ed5af5a4d5f53e0685beaed4fb3e0699f4fe9e83f3031507d5abf014d4f6a9bc45e51f6a13d5e3441dc96b8f634be9beddfd82f479555419547de3ac2c56593daf2214a80f597bb4eae4d0c38f411f1d87f2db22873e641d7bacac7e0c8a4d4e27790a3bef49c9f404ea3016e52799e2fec54ca1e4d0a8eb0e63aabbbbbb94a32c11c76da62d4aa621507e392749ee8e3c1add93d68bf4955f2a3567c88523c752f73797ba4ee347fd22bdd1d7edeeaec8fd3be5b8bb3b47b9dd4cdc6a291571be685bb895328250fe15bdbb73ae2227e56aef86ef39323e40f94f49fe545a82631a4650fedd182401d8cc9e734e29a583ed492979dfebdd50ca3aab0f6decea6356fec944e87be4ea63d61e47c8ea8faefc3495c3cee300d3c83ec93c777777f7aedddda5086c02657777c9719b76f2a16e9241eea444896988f24b1771fde2f209949f7e6c7202e5e7c2ef27e6ee2ea594eeee524ae9ee2ea59473ce39a7bbbb9452ce39e79ceeee524a39e79c736e242ae3c6c7d2a5058019a20c325235648829d19d9d5958e962c00863acc0b891e306196442322119b2906db26e9b0264dd42d9a21602e094e3450eae0546825b15c07acbb7cccf2e0029754896d2d391c46e0b7e1ac9483732c54a073a587541dd595a701401bc680145c79c73ce3980c9742433c3afa12d481939003a80cfdd61706902e52780490ad49f9fc4b5c8311c4d4829a5dca494d2ddddbd93524a7777f796d44ba9948d94304554c9d12257d2e5135fbe1c8476c98e008c660080e3464a3892912f52ca941b2fccf76f697531e0e8f52cd418c94c1bb2050368b184070d353908cd6a6a7260c2902b0aaa19291906e0603c174c5c50196324236138e922c3553d1171490d01ab69af1ac5b0813a5febf941281f408ed2c81432e52a4db9530e4c56a0f2192601fe7131609c502f4632f200eeeefefaa4a344e14508283fcac8c4051d99b8a032f225a594554e814ed248669646262ea87c59001c1666cbed73779f73ce96543482817282414356ef06782300e2cac7a26300007081095bd0a6a90c8e5f653a6229bfeeb9ebfee55e275924e77429c1954f9f2f67ac44972eff7b6a7535e5ac04f286651ed2d0043a6e500debf8c83a73b9f8a809dcad6995f9dad691cc8d835cc342fa458a7e6b8f66957e7e3594c256a843f79ae720f76a6d73d17fdfb7bd26fa1189a63ab89504fe987514ca1ec0b19954d1bffc137de2e4444d6eda08868e1389b6906b5176ddb580d3c2d415741465326854fb552245e79d667dad225fd3b86adf23194d74f9288d7ef9369f5fe5386e015bc3f1ab9ce7f1f77d3f02b550557a1cfabbfed27b4f5335ad04761a89f4bdf6d1ef0bbf6d6dc5b2ea176da569db8f6295adbde8a5f6dd7b2270256e208b266adffddc2458b5900b77f633a5ac538e8050a7ff3b6f7d2eb52a3c9a234dfe16546a9a9c8ef35c35de91cc746eb480c969a31d34b5390fdc16dddd43150c5b3d546d8f83ff7c0fb7b7ef9ea636387eb472dce8772402692a833dbe3af2bec19177aaf71c38e650bd7ff937be8ce7f3bb50b628659573be0aa8f62baace812250ca08d4f9a2971179fc49b0ce503edd4c808412ee4f6d1acfaaa3ee2880ba4042754ca92b9696d4f7dc6427e23cdcf8359621e5af9b8b1082088ec07384d90b134deac664893a723f757d98d8a9e3c7c411266450f9bf097c75f361c2495d1f21c4961072841b233ce120e0186167c9104a899d254d9604d94842b664894d38aa011d659541954520d4044e1184548082142146849b0100016708a8fb41d08e0c07c68f13596c08b3dd1fdd8da8fe8c834b97524a16c5eaabea3d09d88581b7521a51690c1e034d0f8ea8f2391ca636450d6e6da1ae0a8d0f3a1cbce675e99566b29c82b70b33fa76bd6e57c475777777b7b6bbbbb2bbbbdbbbfbb7c5dddddd15f9e0e30354d767092241a8ebe313544f34520bc37d6f753c69b37251fd570837d5c31f5d2f90aa630662b158fd91aa25d18fa4eaf9f0f183ab3ee6b6f88bc076198e5eb7a5ebc8d55a654839af5c47aefa12dea68cde50ede5b8db5dbae454401da4812d0d6cc666952b9550a8558f0ce20953785a785a785ab40f557ee254cca626d4409a501bd13d2c93b10e8e0cc25ed5b2d0849a580f4b23198ef5388b854c1d94183128c75ca506859221e38713532aa5526971456de6d9aa343f57b1ac1b1836b24e6566250b33db880477c62ad54886897835be1a23194d8b165b4ad99a508bcd637bd18b421d3c22c0b670bd9f0696d2e181064603db401a184d4259e62a77966848889df4cbf6b79096757707a9dd6d53bb6f6abf4b661d5ed2ad09f58b16fddfbec867d8d83f9563b1588cbb49e5671c76a18d54feee591853657eb92cee41199e8134d86043c583d3610337302ee4bc1953480b99736681a63b0f196473fa8985bcf81b0fc86a7c5dc73157ab15f36ab14f1c7bc1c22712fd68272ca2e8b25abd708202760f3f386106db401a56c0bc948f035b36852742300fc7c7812db0c08a1b007c1ce872831e64b00d5c9887e3fbbe1b5a88462a95f20f4308e58db4f7bc2237cee24220a4f631a70979370b2335219e69429a8d2654bb271ff190b6d894dbf947efc06c6134e9e18f0c448d6d0b873ccb2104e5478d642483397c40479ecdb6e5ac557a450a548557858b00413604db40950d605e028c28b98192224a5ea064889220499c24699224280950929e243a4982483224499022ac50845011b22514a144c7d0d7f87d4fc6137444c9504bfaa5088def4705f907c3c171da7809c6f748016b458d118e342b85165811e3110c6245c9aa40c7525091300cbb14c4d42457870dcaa750b2192bb35250bf9498946626f0e31ae567744ab630a61115abf4b9d28f55ff52a88342a5460d0cd511c6f79836951403dcfa2e3071831e24d01145e3613c4ad62fe3cacca301ae34691518e1caac0532749810a2880e1cf9514202373f486104258630410d3c1953d05115530551d5845c3d958d0d307c6f5f907586234b9d9d8f047a55d262f778dcaad8032415ba081faec029f50bc9e4acef7195fe97b94a7f8cf74ca08e4a028bd4944aa51248aa2970a509e94bf57b9cf539add29fd3e211f0755e86f25d0a62520a5796c8fe651fe42c1cdfff42fd22bfe7b5efa939622daecc7e0747d0c2e090e158d22f2453f839af03fe9116fb7fe779701c714500b0c882c759e1733c342338f99c1e802042cd8a9089075ae4c67fce1f799d8521fdd82eac2c611dfdf43d13b8d2a4c57e12b822b4325b02e31bc6ca92dae0a969c97b54295c21994a61aac57ed2d7382b255c57f11a1ce1fad7384a0765d32afd29930ae8fc1165335f80a31c4528fa392b5a8c3962b5ffc4d5ae2c8041c2ff9b07bfa645212d22f1273591daff435aec6e1d3028dd50764215b088c148bd8cef5f79e2ac201f2875d145175dc04294efcf11cb1124478d8e9b858961fad1ab2b58ac0ba66fd27f9f6304eb02e95b0a41d9b84a83aa4f81333e06a8a3a298400c7055f51e0c183054608c9f01a61e0648aa28ff6a1860a99a503c289d1653e02f013fe8f40ea25e06483f05961e06e84f027da41ec69b40d2c7005b6a084a580cd44e0adc8850144f8c10a5731aaafd261c3aaea8622fc5eae84781bfa4c5fe13f841cfe45136bea72167a57cffe909aa06157356d8432df6cb4e4d6aff8ad0afcc569af44bc9c70f5a4d8ff29e889248a52ffda9c949a849a4f049294fbaf124120944ed80281e1045c4eae837811be1abc599c7417b9ed152e138f38ad93a6e8f0d55f26b46869fbc021d37a65fe41129654aa69cf55a157f8e93eb0e445d9f2646aa0c47ca6489acd4241878ab01ba4af08048955157091ec42a4909ea3f7217237d807a91f93b9a61863a680fc403f3b55035c3a6fd162291bf302df44987d06fbaf266283e456c40174e9cf8a1063f346042c3460438435801040e0c805c8ad91354eafacc802aa9aecf8c4706def6145c2491049e24943033ad60b6c312ba8dd06e5e02c76eaeb8e2fb542af56356f9f485a0d25335b6c5471a34b6c585288dca30ee5b987e2027959f5bf9c5e06dca38fdd90594584545816efc2b3d1c37a86317fc452f59dcc4aac8f7bc172f64a290875c457a1164ac434e1be07041fb9d488b72db388ee3388ee3b6cd715a947fd3a2f41bbf699684c95549e937556702b13fca82aab82f7dea55fe3d3dde8e86e8fe72def64b932121b57da6e0a9fd23b575718558f5e16d4ac908baefc9187afeef1ea9e2a171aec2d455783fd3b6d8a1ea85fdf159423503b73df70b53cdd001d1befb858dba411c3c5429e045ed7f51fb71c0c0fef82cf1a23ab83f3eb1da600e2fea7e07aa66f85e7b2d04d2fdf70be340d50c1a90edb55fd88e68f07e0b553c36d16f5a4843d7bd16aa7868cfbdf685ad43c307aaa56478b5085c18072e8ceed0532a828eddd333a9d9d46e177809b5df73df81e7b84a0f6dcb7cc2aab416db41ed39059983a45a0a82f6b7e7f07813685beafc574f99b3e6f7cf20768185584714cbe22cbad52a478e1b3754aa3a4ed994f10cb505f51f274faa9f6484aafa9bc1fcfd2d67310ecf54cbe22a56a5df7b51479ea51c36c38e7112b6a59f6756a0a3c603cf724e5c68da163f4610f9e9f140675399a5eceebaaeebbaaeeb6e4d70d5430b6d8f8c21fafafea34f03f3c2d2d3c0b82b90ab38737b0465598d32a4a01fa8e2f1fde847a10ea3ff9e06e6812a1ede939e14ea407aef6960af7e39000e742a7f4c734e4d8b5b3d30f581340594048aaec23f02df0774fcfe0f5c98072e0c848154550e04219250770403e90038d0a9ad45b393ca42d407fa332e83b3688660820844100284222c98028c9f06676560052cb0a2053c18210207c6ff7296c75685bb0b1cd0b1bba8fc2520e8ca59af9eca0ececcb4c8ed5576dd6b8607da1f33d3d25b73f7664998db742df29e4ac313d2719c7bbbb77b778f53e5defb978f5cf542b669510a20a420226322c464f61c9126d55522094ee5c2d44d1db9c6664865027522cda2232da88f1fb4ba916de1f719ac0e9e31a3ebc32487f9b746b1c4a9b6144dd6678a20eb23c54eddf5fa63fe3eafdecdb205e560e8b872feaf8661b7a57b0f775b3812d02e1cc3b11bdccade77c836222ffc52ce280bfafdd703fd5aca01fd3a724d29894787505af747081fbabbbb026d533d2043952b551f2d81b690b3469d26aa69878d4251aa765d38f6508fb691ff8131e08f1dca005d1f2434a99e53f95fb8b20f1298547e16e2390d82a23ade5019e08563f702376a618fb6a933871677fcea9294a0234d0d4d65196141d77b681402c8c109b211c13b93f5792228a88e520ce289a2268a20503881020b2985c47c8284380934a9eb03c5923a725d1f2880a4b33bfb40c1e303c511090591da41413f75e4ea061dd1300b450ff5d4a20f1429a8a7dd108a9c2788e4f84021840b9f279c3461e2f3c4123e4f20e11334e4f384113e4ff0743f8c9cc869d92322cc396728474460665ea23371d0237d1399035da43147a921e69ce01c5980ebbfe436f0241a51ea49906bc7b3deb27add572bca10d5e978449d24c9707abf307766c7d3f1744a9ad529e9786840258f9c5deaa9c2a889130e464da0d8e0c483ee87228ac0f17a60e4cf1e1950501440ceea665d50bf74435d14fbd26dd101d5de6036d9cd9cd53d7195a17ef16a5adc625fbc12acd8b3ea15e140cf064f6afac5c369b104fbe2fdb0627f73dd793b9e0e6abfa7d305f06c9c05c3da6013b043f070bc1c67b5561e8eb3562b0fa75f562bcf9ba2510c73becf9f3d2fb050e56c5bfa8bd0b311d9ba4f7edf6dff795fe77d3c6ca946d45e0c445e6c8abc185733637372b139b9d89cdcf73df3b0ac4f041f11db16b2a8868379618f8a6c6f2b226235b539168b80172b79ceb528890e676adb97a2da943a73977da03c656b9aa66973c642d9c98072ac7dbc3a521a1c0f14810721902208405c8104592091c50e5008524412403c7082e742e86e10d4d6e113140200d4f571628a5aaaebe3846ceac0936169903f7f06fe0d81ecf3cf1008121efb1caa1cc82f4cfec29caa807e1d57272ae8b8aa8c84b7292995ab6c1ad83e3da568bc8b0bc395e3fef765a4a97324b3a57cb236c8cffd8b7a62b1181030d1ffbef06fdb26b3a554199102b8f0d5a2f61cae8c8f1da41d68bf3fe1ddb5e8e19c091f2788c051d7c789214e8ce0078e0865ff31c3b0d562c7e8c01554f4e30ad9d41d19e0fafba8dfd02aedfeead2bffa861e39fce8be9f470d3650a05f603c8f644626f9a437bd277724234dff6aad2bbdf8d253d0f30f06f8e277444fa7d3c3b0f514aa508fc3e9e7e9e7a31c1cbf172870c191437981527a2f95688b5b025de0eb0363ba968b76898541051dbfef67a8f2df53651a14734bd8d92b89ba8e25771c72226f1d780be0e882a30d757fb9d5fce7c77547ec84bb0cde6277962cb68a33b3d82c86e5e022ef7eab6876dbd3544f35fa51c812758f609245dd6446ac8c2346b972f796bb74776777c9ccccccccced29927100a088e444acaefcba7b46beebbaf9899d78c6b5704bebb727977bbba7bb9255570f75d5e76dfa1d1e24a491ac97c8bfbee524a293b85060c3476b824a8574aa1d1e2b6f1269d204936a03cc2e10d5ae205123e4638ca13e6eeeeae74b272d3e49c737dee5cb9eb1bc56c1939a0deafd6ca952b77ee8ebb41bbbbdbe2b816d76a7151f9498b4550ef99a0bbbbbbbbbbdb3d319db8bbbb36d9ffbf63c27f4f0fdbda5d25bbbb9b6beebbbebd2deefc9969dbcfd77cd37ab6b3bc7af6745fc1a6b9e69a6b1ab749a96952d3a644fd80ae09c96a25935cec77b3bbbbbbbbbb2b98d5a0c5ceec2e9452eaaf9899d78c8b3637f3c0ae11c4b8cb39865b892e475c5c2e97145caeaaddb8b333bbb3bb3bb36bf58a5901713eddbdd57a81c44c428c67b86a0ddbd2292f578ceb6336664a578cc812333384c5e572b95cb3c74b2f3274716169b9b85cd85d5cbbb45ceee27669358f6eefee515d9f2aaaa8de2798b9cbe5726d4bbbaacbcb15e3625fc5504a698ccbf58af176c5b828d36e0e5d55685577bd5afc626ebdb8b572ad5e312b66e656abd56a798f3b33bfb333bbbb33cfec68cdb42c38e4d12afdfd1ab747069698d78c9c939b79f52b66e635e3af991d475aaf6ee2da2f8745b8df7edf5b90cac03513b3637fd85b3b52a9546a47cc4c8bfd1333b32366c72b46a82910e3fb43a47af8b33fb2e70a66ececce3d7bb656bd7269b5bcbdbbe5926d3c2bf0de65f900e5ef94158b0bcbbbb8b0ac5858562e2c2e2c2e4bac5856a59ff3693284eae14859aed0ebdcdbbddbbbbbddaf982341cddccc52a86d2a52c7560f64236067f69e3db7b57259ad5c5adeab1615947f58ad98206909e84a93614b035fda8f2dedb5a9692d4db66cbde42ce6fba56835317f4872be4e9f6bb1874fb294534e29e5a4c03259a11de27797ae8aa1ce56cba7490df76551476e48abc208f308a84f1329ccc09d1a597666777677676e7eee9e983a381c4dfd28d2b4eaae38aee6e3281784da40b98fe33eca51211c67f3d9d0938ddb306b4fa27a707bc696fceede0d974d31086148af561d132412cf5b75c6a7bf628e043133777b777b6b2fe09e917b58cb2acc621d9ed59b379487105a98567526a23a1b519d93a8ce715cef0c553184eb3992f95c40e5f30e19c6ad3de2de47323eb6e7de1b42b6b2f549c212eef141ed625404a18e0c44854e752b865416aafe5e3765faa7fa8e0de421c3e71f488550f9fc36f08e641de691ac236b68d19f795c736d9987775847e3d1691653c047ea2f87ac90649d55f1e738671dadc753426ff76eefee7637efeedec054d7a70a24bd72b55e2d96d7abc52dd74b7aebb5ad2017efefee6eaba51969b58868c5bc665c6628a574e6c5af9899d78c8b0a4af947caeb634590bafc37dbdb626fb86af5aa37a525596e8b99572e2db9beabd6ae98b9b9bbbb999b999b719a97655d49e8bed8a20c99254b960eba1a6cb5c8fb2e2d6e5787ab16f95d825c2de67559157e8e5d7c9a34a91d8ed44532d1e6e4284da57e149ffb1d7ac2c550e26f7a6b6a51e0edd1222a09ce22bdff0d3d72f8d12fa2776e7fc11a5ac57f170602dbe280d5f102a9ca900620df931e88f7a397a3f71ec8e8bd973f7232aaee797c4f7a1e9eaa0b19f03d6906ef47614afb31d52307f0c707d6794307c95043d3604307f50e1b4451146da0a186201a6ab081061b7838054467d11024b6182476b8411c179aac3ac751eaed6a3ca333a9fe9eac455fa2e10881f6b3570d675bfc7bb89c17bd8fce53473b54ab3ee448c6df6f8aa0dbaf729ce539ee397e6461902ccb8df02472307ace0ba43a43efd916ff931005820488f7dc03e946ef395d418120e121faee818854f37978cf3d0fd50c19e03df73378a10e4878702a337440e8a00638feafb671040e6c6148680c816ee1e8f29811dacf47fca7c56eef71a07eed47eff11ca0ff7f07f21efff17eef01726d3a9077e83a2d7a7b4f4fbffc68407d04a87a7777b3f7f8f7fb77757daa78a2b67b4f6bb3bd1d3093eae702eacf38ed2cce4fdfbed01767c978532a1cf7496d543872908a12ca00778886db62a9ffe52afda470a4cfb538a196ab08a17e339d873011c67131ce2bc6dddd873802091d601deec7f3b66dcdd10ba4dadaa12fead8fab691cc379219029dcf2cdda41d7a5a1852157d4b917bccd67a019dcfabc961ebd5629617c7bd5cadd68bb9f56297a0578cbbbb7bab35722feafa548144ab2502c1f26f0bffab4d33da2efe73fe86ab09b67eee8b336c8ef3065b2bd0a5c5f6fdb96a16c3fa5b1b8e2fafd02b1be2abf669c253bda7119eb328a9948e4a02952d5904e5ddf3e6b2ea8a282555ffd20dcd000d0bb355df9f916d6abee43f7a52f72967a94ca650f500943f3d8f178f7ad3a3421d9098421e287f0a75400953aee2ff22a48199c291e36838c329aee68fac40c7ed298523c7aabbf87961271285af93105d180e24b12e70605a38daa15c4759b7499d6111944f39ebe55cc83087ed94818280caf7389fc8a8246d583539cad4cc0000000000d315000020100a864362c16012c7912ab80714000e7a8a46664a174aa49124c7911087410619638021c60060882108d1d054070fa807f8f0ecf58a1807e84cd190863cf5c312eb264fe4467ea89f232bc0d25a0fbc85e11cc0f8dba6e690ad4e78cb560fa3b6350083ca7d7a8a3041d7664899ab1646d82cf3d89242ee0cc50803efed0759321ec8a2657a2b4ad0f0301a7681fba8fc0ba697cb7d22139da32cf50cec5ca6e9125030756032773306e2c420382e08cc3b5fc813444fdb39e7282392083d8eea2c3e21ca1196a75a19f4ddd4bed2425d76acf6c84e4c832070b909c2912d234d55c49040dfc1ef659b13d345bf7c8608694a79d4331f35a78c36c71753df1b3743a289e66a75833578246b4c486b6c3ab50303a38c0268ed37f98c755e7af4642fb48146288458782480a29eabdbafe4f24698a5c0266947b0b12e5f349bf60b7d8c30a5a39f8d57eddfcfa0ac3e618576812e0c82c0b9e4dd3a178682d131584a1ec95ae660982439ac322b649dea858ee99006a0e46b51aef9bf47b57c67dd1530b3c57f9e64c1ca2519028d5f93d8ef3569aeedeef916efee5b8a9ec2b562ee1e7d70b02047ba0641d980b69eca41a4168203ef57fedff7bd3361a3443e7f038a4c0423767a73d924c4335d5d7a286937c0e43a443e30cd9b992e5e28d6c410e9bf0c47a23708d4dcc8fea8273d3132c74e760acb92d72650b0909801a25dc87e84b582642719ab50b300b014112c092d79c4fb451a4efce4afdce0d3d965fecf7f0a0df3fed94a80f6cefecbb6cc8a095a456356725036771f0d9aca6d2d8d244182452460cd0a968516fc780401e1d3aaf24390bd2ca83e9db31952a19e71e6d9f59d9dded5270481218189375ed6c08834f697698b1f723f3bb58d32078e872d8a30a2d12a45e909435e001f8b480ec65c78968d7c74bf826ed0cd45159353364dcaedbb0ce15175a6762b93c603f7d509c045a14e3d5c7bc8e417079de10324e9821c77672aa401f197616b99b8e8c00ed52b0d33769b64e598cc1a1f8c5d06af288b0a07e9d5bb9e7eabb13b7719893cb4d9b2ec7f633840b3ebc1c0e14a38f44ce24af408a22c0450685c31401ecb95989178b2f2b5c087f35aff0481a0488e3986484c70fbd8a746d73370ac3a58e75bc862a54159c1d726579f6b1c6ba4897459986c76c9dd1262654b19da7ec394e5e5487cd4a2fd8a5fd879d4251d859e0ba9629ac5b892b25798a1891c13e7285f5b36259061310516ea1e86380c555438fe7c5a32ae09103a390ea142914b638700213c9c478d14b587e27e74edf6a9b11005aa9d922b56e8be8ce59e533bda2a49792d7a8c2c4516d67b1cd893120cd1b0ef48316f7b695abd817c91f81a1dbe3bf795dccdeb66f1327dc5f78bcd0ab6c60a8856c4d3e124b096fd4298c3a10908c016e9a8d54a8cee6d27190e22ee515d261598629caf906a8bb980d4e4198b4496e1a59f1467e38214884d58075aee93d56739bee7e4fc3df75dbbaed965722accb0bc17e0c32b321ff509d007941c51307396a449bd953f16eb4f38a76c17c022faf2b7ad09d9b4712c241585128d6bfccdcdb521feddccb6b310d2ad73e585c2ef903541818fb701464d7d2a5e69b3513a41cd35db872a9d31cc97dd39486b6c8ec9574285d865b93254c44b266ac04b0ad3870c8a9d6bc4a17c2882e5f03be1b1211009a8f5c6ca1e0ce97869ddf07f6230f7e46ace407fcfb0fa73c262cf8b81e72a4078473ed8e4d3f164b087da30dc01be56b7d04d1539f7cd523d2570220e0f36bbd60ef40c9216385a54e35e72c04ca8ea5440f77a6547ec622ec0085332c2eab7bc587605ef40755b2d5917666a51f38186a288d8f6b42d7304d6ee981bdb1e30813d49a0c98d46f93e7b0b4848091b8802ad45c0e1712cebead7ce30beaacc5176255feba5cdbf0c8e5228afdb2354be3273f79b4c15c8802b01c73cd67bf3edd014604aee64b6a5e4d21629417217d39ed3908a00b3a28d3dacb246459cf9657834991682b5846a135aff0accbf021cb53e8f4e0dbec294a87f8c46612dcf74eca5fc5aa2ad0b2686587b331ae18a38d8ef617808ca911208ea0e7875341a4643a6ae58949d53b416c4090791f35578c3f46611ee804bd2ed11cc55eb9ca6173d10e9a2d5ed0214c830bb4e0480174627c9bf373e2c03d5923147d19260046d38f821a112a5658f29139051fdfe7e7ee1b71eff4ad8e284eba833fabb163c624ac3f85877419d238e8edeb90b366e1c4c57e0902ec541b8839d58cfa832669b81695309d30e3b8153c84003090ec227e4a7aa8a612fa514c5931b62162bb304d13a2391fde116e2dde5014be43c96d9bd6909b7d44470397238f799ef0d7cc5cdfecf8d0d34b4590f74883f3e80fd22bc138080250383773cff93fcd600c37332c1e5ffe2896c311b25bb7cf6b4eb9c5628a08cf193384ba114fa0817cb6e978031f93355cad0c197a4ae1d152369d3e820533312fd41f5388aab8df8446bb1148fed20ca1b270fabebdd9726f067f53781faaf2feb51beba42a9908f92a1cf141249fd97cf09f455e659f57317a3c5184a0ca7456c01869a5f28c24a743f734b4510ea063df1db4c57a8ddbcbf79dbdb743943395ae299f82b9b3de2317579e70b615549be606984ae524151cb47b578664c648cb58393fdd28aa1c15b05a1d21ca583040b3beaebecb15cae3ba70f269c7041c770ead83932dc143eb6b96a69b12283d2f0bcc6393eadf85c2d333778864a4be417968c21b361f3567ea4bb1c5f5d57b4b30e69dfaabefb74d733bf8517247de70574e6245b61f595c224eb2c3d52a5f82498326141aa6459f0237f212af2a3c589300e34b4f0f05717099cdc083d691a2e6f3f9cd3fc01f41a05d45fe7836c71ee1274241bee87bf04b996412c331e703a881a7996a64b6bfc97244744b414db5c440e909dcbf329b39b1f438969aab411f9f86174fcf95a603bd966b320f72c2c0ccedd82846d1eda0134c9c0b6c5d477a9763101705cc369d0f84e89c4fb4a273ed4654766ddcc8ccaeab44cda990516771c149c24ad97ff2c23d42cf4cbc38e157507fcf2282c4913d3d145e5f3d8940ca6c79acc0e4104b1ddcf3980c7cd7721c5e9e711734ab860a73815895e3c720b2a2d97611023e4b1dd694e118b69cc7cafc3c29164cd51ab291472018d8a22dba21e76fa7f3bf02bb9a4c3fade41ff29062b430ab12e448840258babd180bf42c4ad5084f899b55373b4c7ad1c8833d9ebf2fba4806b50c1b1563f334c272a6d499bfb7568f27be0ce5b2115bdf839b1b08d59b74493877d37a56040e25465fe4a463b1382d69e3fc7b3efe773f751980f41742ee684f50c9c0f7441ff14db73ba98e76f3993d9c24a6e13ef5b889c2cac9c6915018d9f8f52f4454b09a2a10a19a65bc6c30b83005738e7069116706d856d346f31682f82c16499e417b6ee0056ea81f684407006150a6dd62b3d3cab35e0ee0cda489d0b0106d8e6faeaca068c2e46de54f8f535479c57e2b502b58cb4e771124e62a1916038d2a78a9c2373fc1224166ad0ae88c136b965ec89225e770983a4c4c23e99f346c04e3a1d410b71b88111203808dcb942ac477501932e38f55af2b537d62848dbd2c609a1e52eedcfd2b484eb6319fb284cc7af6ca0ae169fab87eec6645b4deede421451f1b1d4db03039bc872c5879125a5aaa66e714a7c21e8841834ab06a15940931cee391c71f8f8a3a7508979d0b360c123882b2a9b7c0c035752f652928bb1cfb877b0c44785a9fd082e8eaf454eb3b5981e92d784e0493eed5fa511909499ea4c8b6762cfcad26c88cc8d32d7369c969e8112bed3934a91c69bf124dae685871b588d1c727d7b6cd0c0408ee8f0695ee1d196d1b7d4df492750c1ff78f56f6fd1da532bb4b5bf11d74d2a1aa7b86e1dd52b82ce9e47d127be70317a71b701ebdbab728a3f643e76660ca8d9e27b68e8b67bad22b6beaa08d87ec0fe5aaf73ba8ef373124978108c662bbc596c30e0648e47ce44b3d0875463d6bb38d7c87b6940c9fc0f4e56a5d0a7b2ca99141fce589d55f18ca6ef35234142f591cd8ef58141c6883baab33453436b1e63eaf4883009a81190d55005c622eea8c0230c698568225d4ba07c0df790b1478f6df9040ff6d7d0b54b695bb47efe525d3a5c9888571f9a3cf342db6b8af0cc301f28623e537217353ef6f6df60a284038d1a063e5760df75c93991a29fb11246a232275b635a534b10f54b152fa9109a7f9c8f1e13d75365db9b341527eb8f0cfab3657aa7f4681d81d35c1669d79cbf3062bb01f65ef1227231c9c4d12ef432286f00597ef5066ed75cbe6d734f00d3fa9b02246fa362e8cb638f7ef66aa75c709655b41e42f28eae27c32e731914ca550a15746b21b1a1cdba1a96e9a8eb260a8717b752b737293feea8bacf6f8c044dcb8b871584a78b9974e1c8a263bbba991ff7ffde37d3cfc5b772dc1ba25b2063397b6c681e1abf390e375d46dad085400f0c38ab7d2f24527ef01cb67d24d8edfa525398a70b0a6eb91d3fe198bbe03a0c8140e8bd1982d41c1ffa4443a12b43d1898f41613123a110ee69cf02f8e350406c891cbcb8d230512275a3e36107b204c4cf8cc4bef0b5cfd5f2c2f25bc3fb6f1830f185383e1d99049f6576b2903704f982b3a242ab58303b01cb0c37e0508aa5b88d984e21ac306c68f5ce0c0499fb7094f4cabcd29360697bf9dfb3540097a8cc5691a50b9affb2bf2ed9a1178312019b164f7ebe449b1e3bd2ff1fd5011c0b72c4d95f5ff99fe6460d4b5d5ff264aec1f5df1aca52218a0d23d3d53f4268d3a2193117eb0b48a0d34a3fffba9ac8bf908544584745df90def9bf6531615d543346bab484d5e20c6b6b46d64f9eeaa711c0f8b25596074cccb1698cf6844cb0936a25b331f1b00a0f3719bf7bd6e6a2295f0406d0060ab55f34ad951a04faa0b0ef2569c0c654d5057d8ebcdcb15bd1fcf6a507f0287863d0adc7b0972e6e8965c57dc24c7115af937c9a0a15971193b31bacbaa9249e3737d4b8cfa5d73addc30bbcfdfee679bfcc1a04000b64e7918de9f74220e03b46c001d6c46a6a5adb3759fa4556f8c4f6db220b638da82f5877fc2d42acdf675406bdc4f68c1c71583584048a117d991930d34bd5ecda14e44df60dfea99ed0b07633394daa0b6bbe8299690c7d503e0642d469ec809c4e0c0a460c349dac90fc5086acb3e43d4f1d2bf35727b11e17e7fd62594121e908f4cba66452377fd9f14ffe7e66b24c211e77cd47b538cc4060537cc861de1a9d64cb21db9bb7906d86ad045af6c93c3a0412f482948d637dcdb5281f79581a1d07de44385fdc5bda30a97e328e6644cc928be73f1f2774ca64d6fcbc3f10c10ee9ed5dc37ae71c68bdff3aadbd3d0c30dfc5b43c8373f85a70fbdb0b68e6a333f871a1228e373417b3c0bae6b30f9344687094eb79aec02e26dbddc12bfeddf3271c16650289c812350c88fdd30d4a28d6f829563fb02ff4ec8457c4444551331c5fd06e41610e3114a05bdce75ec1c89841ee05fda0dd9a223e19f7211f75015407fd1c75d6619c56b1e0401d57575f119254991d9b07ebe7c1e64544d526f6d8313bf2a2f70c7e6fb7639d4356bd280d8fd62748cb76dd07b6c61a4afaa19d3c41e67d3f265b14d942b5564c6b8b0ef14639a696590d2aff3893360193a9b530c499b73a65522b8dfb272f9f6c353cd0db3fd41035de3dc1964cae5a1102d3aa26ca038fefd075e64cd25d7ed2bc3bd69929c9ea79d6567cd8369e7fb0e773e71f4b0f4a3e1f76f1417c8f6b800031a0005a58bc72c87dc0b0461e049e256d99b5a88398a8a32297a317c610d5272399741f626499ce8e738e17b66c7893eff6c797b5c29bfdc65f0409f5536a42320e0e7c40551d3f184bd1676c005ac577a20e20c7714b49254d43c50eb8add063630bb7a43b0443764e3f24e1ba69239b9ed2db6bfaf70430c8bca6cde3b17224f18c67c099036f2d46ec93aba3401d35307dd0deea39f40953c117559be5b07bd1ddfe125df5849cca521bf32a8e874a50fbf796fab8629adbb61017c7fc226cf17066af8dc022130f55cd364edababcda80467e2c6826f2d75fa05ba849b21d069f0349f8638b5b4f34a7dc4cbe36379ddc8d79001c34908a39eecda1cc2f4cdf74c75be88db6baa98395e9560141d47328086f41bed9004131cc2605136e29eaeff6f92e7fa607dd2fd72c9a426e006c43aa60b8e2afba09850e78d18866280e98b0ff5c14d93c4d6af5ab7e59590242fdf46245b523f9f3acf41f13829edead7ffd16488a00c8aa5744a8e74516099fc5764bce6b045979e02a838ba60314d6c6d04885e040bfbee24fd9c35daa5a9836d07c15e634411f165a2f55bd7f48f24d9cc3f5408a3a069670609fae62d4b793bcd1edac1ccbe93112d0bc580ad14531b9856ea2300b0011ac4c5c1da5ab3e644aa751a44009dd66e33ba442e378f9c1834ad3ca8bef7f424710aa5ff96941386919bf478b7d124f02dd740cd4bd0a54517a9c28a0fd2cad398b8835cb1b0ac52c65d208fa623b83b0267640a7e2d87194e209a655174109bc008c3396655dd4db8e0bc172b8721cd1ca9f3053b71b1b6c228f43f6fb1c1bfb6c148062007edf5a0e5ede31bdaaa445d5a0af4b6f9d505794a5c7565ab15911271ed008fa6209e5d687e782a64c96b9c9591d455654a1852fd6f0263a1ee28bd038aaaa0491f3cdf4ed9f9a8bfc2db701c25212e1bccef247ad6e744e2e700c4103a316451a4341270a6b8e607e279f798b617950cd950e0bb05995a4f95bfe681fc604279860c898dc4188aa625e5ecbf92703ec32679aa2db2b74454c26c55d711c03b03469940c8d0870b6795128604fb7ee6892d44bced1248a1891c3fbc6575b81c50f19e2490de96e0b8132ce7e3184fcb45d9740ac2f8f280b64c99479317ff9c23ed6a7d95c0028fb7e8c80e54b3ca07d12c9fa574c7c0e04d9ec3c6959e3f8bad231efc6da7ea18d74742c05bdc0b6d456ac704eff0fbe635e9d4131339c1b35b7140887c54e4645728e98e913a144ff68a40a5b480847eee0f2909b56e9f923a2d288a7c95eb32fe20794d2bec92d41ed43a23d3e9374d07d785adf550e09fbaf38d34fdc8c7a47fa84016e508a87cf7dfec137ac686cff398de0972d3dec2c07e83cb4d0464e08ba71a28b2438242d489b37af808cbfa8aecd46d3d155e05a9970a87130008191123266be65d994a6de918aafe578c092e47aab180cbb4c702091e51a7f7c4764d377e8516327be90bcd37717df9fa8d2b31f4bc40266fc4cc645dd99c40ad59ae4e62c638a235f605048eab6e20ebb52bcf3695d825eac676354496eb61b8c0540db1973b02435b29a39b5dfbb8e70cba954671ff042a6b6114f68bc41258f0fb892087e19663ba757ee0dd80a9c4ad31a20571271e9ee07f16e0d6a1bc0ec8260ceb2c0a1c7b6852fc529cfb0eb46d0087baf07e5021cd1f0984c2dbffcf89e7895aeb7e5ba70c241e3209a1a42dbb70ae373fb08d058f69374f77731c971191365d2a641639f0b4759aa4ae305d5a4b7cf89800c284caf9a773be3301ac5830ff307d49dbdda7818358e91ae71b18eb5308313e42d833897b3f126e6d152775627bfd9026903ee94e543b6fdc6236efcda48a18f2b830d49895c405d8a68925b38e59b6ed79ecb2bb219a46ee830fa1b6da1f985d7f4d2508c8b47f464609a8905ba772711b51cd34ecc3ee36aeafe2350b5482175095c11a39000555cd30a213d72806e772866bd11fd7dfec5002ad5f75355a12e2a5c38ae7e9863face57ebe89228ebd93b6321e1a9a067424012cc6b0b44093eb6d628130f9e5197e5709d92582b03dec223ead2f6c4e7fc0549c7fa2cb60dc48dc29e0aa49734226b495f86f3028aabb41798a4b5cb3a55b896d00192b13598630b809a01b67a179fe86a58d45c9c45016c547fce51547fbb863bb1141b16c5fb125d5032e68ae79db91da65fc3502dc92e48d97177ca5c7ce35fe41f65e828f6aaf390ac5ffffdd0c7afee51b8940ca7f16e5b0b6de6f648c8da6df08f09de0cc941e386a7b130a242d373b2acbbe94c365dbf5137f5335473ae99ecc53c4a0c64076eec50b123e6de7780613980335f35ea0cacb4659467edc5719b661d6ead24875b9d4c4de95463b095dadc29b814f0b1f47ffe6c8edb377d51e1b112753444a6d7bf278736d362cad9daea3ce78e7b53b699b4d2457f6eb3cff218e43f66e1fd652679866d4ade9a41ea0c076d4e50c07a9abf4daddd17ca257d5a0c257f60582abd765a90ac15cd4fd5a729407d88cf9477cd0612c421de80b69a51209b4c8ee604e5aa98f73280ed399669a8dd4abf927540ee322f28be00ea6b3f9f985e09a925f98cea95d15bcd99976ab9b5d83108d8ae6328367fab5ef5781c8f679cca0190fcbdf0070261255488ba9caab5b51d6b87a87d3edfa087c0c2f0e4ca5d2bb7ef245a0dce9ca204f2df21e6ad518843b64bd462930903a9318a95281d918756c6a08adbd28f95fa81c75d0b1eacb88e25d9f34d7becc48d915aa3a81f247da596428afca6e7b14e69b527d938e83faa25fac7ec77c600c3e068cfc299173452643b65d519211f04985b8dbd2256d04a6bacd60bc74bebae46dc67d0b389684ef1ce64e78dd16625f8bae65605f523679793e6e78b3d304f2003d376a15487c7475114519598fc116f77e6b5848b8263c4cf71a7d7969af4ef89e0ce30c3610b10c3fcba5dccd7aa6ff2818075fc5b9a29cba370fd665abf9db4b12cc9f137da5261f544a8068f3b481b021e04d36721345a6b82565bf3661e102fb306f82be38c780ec7c588c9877f86ba9cc8900520357dd0c134f0980d17b52c2be9efba2c66fdab073147774056ab83da423a15935983fdd2fbed1d8d093ad420fd652c57204470e82b37ca647c253c3db2a0a9210a8409cece256f105ff0af386e90623d317e116107d7a64d1409ea63d2fa961cfcbdb68804a0db9010c393822caadf4784f3a7f319d208303ed0e64f2535b7315f8429720291923eeb880b3823e5d25fd348b92bdcc9fc851b02c51761331231dc52f9baed649adeed51cec65b4d4218fcaa48961ef290de3271972894f73547c28f06482420921a40be060c820401da6088ddc06ede39d176a29df363ed4e609025719e4fb158584f680c207d3f65716c4a1b441a16abbeebdefa82cc886c7c75ddb8dbe257591c02d7243d1f104f5dac16d8b08503f4c052cc5228a630b87fb794f62b0b3dcf2bfe80ace1ee27dd18bb8bb2c683881e48646104db22e4cd6491fe16fcd5041bc5bdbf03a3b044ca80b011aba36542229a51ffe902c0dca5029fe3a471b84e57faa5f0ab7e8f76bbfd1d796f04c7eaa13185840ce1d2c1d8299104dc7027ed0744f413b6333cb2201e65041faad2c59e86e53b7bec5486eac6ce7310774158caf8204bc0697bb7456b163e9d7d70293cdae9ad73717e33a7a39f83655e1e935ef27fb825e401d4a101a5871b2039f66deb62682535499d705ddf7334fb70685ddce7152b8dc84ac73c3ad7642116c31a315b2e8820065a75ade939f07c4ef8aba4966cebc233527726ca655d32f205dbc674a728fd813b24f80456db6405cd4d640be7ee95b6941a6fd730e791548eb8cccbc5d80f5f68016b2508afeb6d175543fd071ee1f0651795607807742addf7e758e6fbd16244a2d54414306b98d80a9a3bc3b23b253e9b0893443d80ff580b099b8903e622d19f5423430b3806ce98053c5d76891eaeaa180bd8ca06aa9c0a5ec35a3a9ba62556b0119648cb5b06cc6fd017d5915affc8e111706cdbf355246d542ab684dc594076d5ac4184ecc3a5400bd2c36cafef5d7400ca7a523015d0aa1c1e96e3f59159a932ff62ec79db4070335d72b2d1315d0223c93684219d8f62edf01195bf95b7a0764320ca29f4f52fcd6329d3b315d2e854a6572f6f55183af7b019e6d8c8195f059ff05c70604f1f48fd87aefd72a80064949db6f29e5f7a0a81a36c429f93f9d03e9c36d09d114a571a41d3a20390f1cf952b16b4aafd9b04daf19179c98545eb94ad5f1ec59d5aa50714944965690ea46fe426d847b2ce02915de90c6b4e9b560ad3f7f21602518f9b4a8ef807782f0b5c4d821d904df8cd8f473595e25bc204a9facc761bac756155b9b020b33a90969742016f099d0680743e29d3853fbf5c28ff5b60aa131029be2a2f6458cc03c03f0fe0fcc2b77a9fd982f2737c9970c216b286e573408c131328f11d8bb7d094d967c91bd847cef1290719fb0f3908eeb17303432ab8d0c49413fc4bf77831abbc9831cddea743ddedc294d82a4bbc30564f92b8ff280e65b01c4df5455d556c2327285205305453c1635b7197162653070045853fee2e43798b7a598f3df4bd2c3171c58517312fe930950882a36776c13cc29c60ca99c653ed98c1d245d99ae6203349219a5b2051bfdbaf82c81f03b04083a0845437311cd818e9d4cdd9f365599d6d000d110efd9ef67b2b3cb6c8f6b014860bbd1677b2462ae876a55c6871a05238c88095bf84c61cdba3baced9cf25291f8c58a2d23dcb91e160aa15d3e4f66a1a8a79c46187ca3cfffb21bc2d860baa7caef20087deb34a709d13155fdfbce2c19f72b22f8ab5c033328412d8a89944a04f3908464700974e83018609f9635c1f8335ed43de0e677920a47c7d277d505e2e6a54d341741e3ff6d876a2dea044be1ef0c894b4b718cb77692421c28e4c789945b4a860270c220e5f76c2e219cc6c4ff91655f82f45b08a5960f02586a561c2283d8af88648c6badd7032e1e1f002e5ec2e2da53d27222d134038e7934f8ccea836aca9692d3019e74569eebd375c1ce59d3adaa6aebe2fcf37dd2d25c0f8f00d31a244030228f528545d4c363f8083a4f8071528fdaa28c2c511be22f56563ba0e979d3df6c96e0362c9e2824eaa74e0f34baa6a13d829866f54d2a738c0c4891d3d7e226155d283d2c253240bae8a4dac0b0e9c80df59acfe4b88106c2d8c4a07bb29209048f41dee52f7364c11cb7008215bdb11834e75dfc048c43a8fc2c9e7b2f52f84f38558f9800564edcc014ae9fbf8ffd97bbd5dcde9f74ad028858099902e0151f6426235065e44c7b4c59df4d581d46241addcb771d8916c1950904e61f547cced7edf0f887c5363fe38e560d044e17a5d7edd9b18a64e1e0cf193bd2d785cf6e66fc2c02f87ca3163db340de87e0e73933541fb098ad2bf2534a5cfe71d70a4de4db8cd74d021bb19182ac1da625be602334bf2db17fa0c2af2375cca238b5fa7985debb911ddf81269cd831b6cd3ac6aee5db7c434456881925622f69b25f748684a11bb0c6a6151b4901e9a85d89de7cc85099e2d74dec66d72384d10255ad9fad2e5040026d66017c38d8795d8cdc63fcc740f6aeaa058397a2fea7e6f90228942ad0a8d52e5b598e414fc6fdf74f34708d7977fd27e303c2d5e808949148294ffafbc49ebddb9454f086d8d90af8b251d7ccd2e5dbbe3f986276e22ef2f61a58998bef78b2bcd4d619c7813ddc4f7dde8feb69f33eb81eed50db7c266709f842988fe346e8f23ccf869ecf5b07d5dc4c1f0b4d4c5cae8b138b4ebb11207807acc4f664319d6ebdc742068a7bc989c9777025919d6c6f0555919b19ccc461bb4194bfcf761cbce0157995aa8cc9ebed92bd561d1f5acd15cc015ad2543a963e98394f027dddf5ff09b064fec2cdb48db9ad517a87d9bb550954d31b358e4c62572c67ae127295fd4c264cb9969b7c1ce80116d1522a0cfded1cf30b54506ac06a7dc926def82be159cc9ef5ddf2ca5466218d01bdd50ca3d8c2f276352ff1d465f8076d10b4b91970082bd8c65766e919084384668b5d3a92ca25f40a1ed02d6c28fc8104069cb9a075ff81aab2a8313ccb8ad3d49df5fcf7a270d592fd0153099daeac0372b63b8d817c28ec84d63344349b357d0cbd14ed05fd4ad3cfd82555821fb315c3903f0360e035baa6e3ad8cbe985b7876541a14292ed3e631c24b63c0832ae94567fffe80f497d9e0d70c1068811b267900daf5313affea03f222290702624f28a718df41dd5e1d2136125bf1d5d254ce831856c445c10bb07bd5eb12af8b6fa1a9fb20f6e5a08fab5a7916ca1bc6228c0df7b4ebe1ffa46e984cecffb0634bf8e4ebca6b870e63b5118186512786f7a0306f73eb4c6802b2c8585a9950bcc00967514e3c6b9c2da125d6143d715b6fa8dab25abbbc2c4ca036d2945bcc2ca8d0ce5e5dea1f10ac36f43fdb80221a11abcf4145f38c60e5ae92e2065a0ad754047ae78b935eda34dc4af1881243ab02c2c96b8a665bff0f28418ea5eacaf8d503b0c9e3dd8a1bf0a4e6d7679a4eaa63acd88e537f6d3d9dfb385802d65d8dea33f2f8bdff2522decae6ef6592531fb2aefbaa5d6288c732cc0b17449073013e8210ef72b711fa6cbd8f91918dbb3fd57214bb1dd7f0615469857aaf88e6654d605a11bb5e002260d8958e691913db50d6323940173d1b4dd27b28c5d1fb7fb0dab62a50f5091c1344ec6b21c2c18735aa60f83e65071f21ccf52ba00b97b5ca6e9c3e88b3d10c107e635ab7958c2e10b4d142dda28b99ff2740cecc338efb2b14136efed60975e85547671cc3e3c209ae797b4f972985dea0caa1c06e14479d499009316c6684d2c2a85a8c620956df5e69a24be76cd2098eab8e34ba05026c5052d737175f557c4d2ff67efee500aa9ed4abf8fc77ae54fbf81147765e09be89d1d93eba38461438c118ffc5d59c2202202b0ca5e7d40b62c61f4ad875b40215af8625465c7d03ac2f66d9fdb042f382fdb91c61522702872603d18a635f4e560dcf791887007b93630455ecd2a494ecef32bd686d543bdba132ee20ea778354fc149a7dbfb7dda561483f3328ad6e4d273f265ad1cc269763bf7e94bb2e91147ee783522ec32027d5202d8600f20ac00b8b9d37c51fb1c9fd5d9b36f74a7136756804e32491c65afead060470d2f840e1159689a94b264da1dad41ad92961a6ebb41198d2db7e8e47e6dd8af3a4c25b40443dad648a02b1e379ba543e5a9c05fa9de06922af31822c536438ab6c9789f60ac325dcc6afa761a36c4b59be814dc28eb45ee1027d20701c12a94e45c8f89633b8da5e0e2aaba2ae51ae60533c6f65fdd60bc8bb241d122cf4dfea575e232474a7ac170ae82410e14862d4e5f8a7ebff1499d1bbe6adc6b7244cbb0bb5d000bd51c604da66a2d2fca57eeb8cb19eeb49f989cac4ef64d522e41975232cf54f81a7e28e41d19d23124c9564903d4a12af8b260d20ddd15904b0b0cf20dbd57904151b49a8612839ccc42ca0484eaacba196c896e18f536f41de039d73d06930221da6f4ffcb8521c6b8bd2bac757ea3ae5d73bb1d1551258f43453023af297b6c258f6733411f88d1b329da8f1161a5ccf04767cbdbfe04f0e2f8eec461eb7271c6c6e69521187f1a9ef4e28c62f12870facee184659b42a8b3b801c5c011ec89ddd0b2dd45380f29134a3afc8bda0b4d15cc1d9bd018a7cb2633bdb1f422aede39d16a0c51adfa2f6e8c5ac704e6476efc87791b67a12f4dd60e90f9af9f76721496679f74435f25b0e8606f05cad5d806fd02562fdca0c9e299726f64f67851f7cf5847a268f42c75352ccc85887f826ac3ab612ccc7df2b310f19ae24106c12d1841a760720fbe579a960ed01f7fc0125a7e0a8d2a99fc30092fb3eead7db3e18721c620f4d80b64c733e1351c829c14a9648118d9a91d8451daa4a7e90284b49580c38de6d899031e1bcfb027a9fddffa0db9e8227448ea1d1699170f4cd2e90abba6f2af8e5b8bac9eaef8619da7308b41235613c806e6cd6924b1021f629792cdbecccf6b11f266ea93273067fff72abce8ed999501519ea0294ee89d2ecec143d3af289f9cb1911795084c3bb4fd9362085743d028c99a62c64cb379450294b90334072760f5205ff74a6c427d3ddecb490e2fa120c3bf93c1facc36f25f92f162c6f2c09b68e8277ecec42dd06001c24002716788940b946e7d0a6a0838d254c42719d104c3d975db9ee792ec7ef37e7e91332e19cd76ef55c0b082fbf0eaba1266a8cb95697554be4a4680423bad5a5c6fa7493d1c60140b43dddc9e19317c8f606ba650361e6743d20453cfe61e566174bdb3bb81ec532293bb7b8bf5cbde555fb6e5049fe17720465d4d9e898b3de2e4f3684eff063090fb47371185562dc503d72a265737d0b496dbd9437447ee4dc603228dc286aa46d31423ce485d2d2a801ab4d0b351610726c5a43d29979e37bec53c4a113d296251f3025274510398942b44e34fa194b3a20c757235c52f9429ab52a02570833844a9f543bf5989d5b23f579dadcab0cd2669b824d07477284f2c7144458c2c53053ede6031cac550cb4acd879a38a91dbea5d634a9dac17999ba95e3c327b025c9493c281600a5fad2e2d4e6aaab0c7a29897902a165d923ecb3fcff26efd2ee12e67671c7cf77abb51b008603e80db6c3971a27151b7b72f2849744cc159ac0cb312abed209b390c404cf261ab4dc35dbbd2c0147c1c510c9606d17588a72aef378a38aa8a2b02c3de3f05fa87b5acb4b11548ecb2e61c28643fc75ec4d0ab70b92b38b38b9493b189069daa691299c62c3481600f70d02f09bb4543a8293cc7f801d773a07fecec56c8f1707d16afa10b37f4f7520732e1704d3a7bd6c4cf486b6047da8cc603cbaf23b5efd21e83c023e9668c7f9ece4c6cd70ab6dfd0f3b7e879664a4aa35462fafbe085a9cdd6be80a936b59965006001cf3e930cb8b5a527a772fdecac08c62623e4461804bae95c15e9fda21db98d48be58153ab2c9515f21481e6afeb44e859b2a21c377db39d9fdd3211a54f7ede57f744f9ec62cee3668bf4ce713bea89e77cdf7a99d01d7a1ca4d6c884e038c02dcddd4c3f84e23461585034bede2d3846f7f32c4a86d50e580e228fc2cf818c4ff09003ebb0ffb492529c9da04cd8b18a7afee05c33d565fc11f3103fe25120ceaaceada2cb3ad2d979c6ef172b951ba8cb265b4d77e2b97c6457de205fb6b90b8f7290377609ad92feb2f37c0e729141ef932669f9f647f3210ca4f190a8be395e992a6ee9bfaf86764c54735326df3184acc93fa40c8ef055938f47b391c34ee15415501aa30808c9b543fd10b42fe3f3c343d28085941c305cd6564cd310fc9d4f3535b3495596d86e6d499b18555c266ae1f3967bf231842ead353274e657ea964111099ca9920dd47e5635f328f177d0121fcfbc2f8eb5315520a648643efbfc66b6a7d4ad1ea2b7958ef16fd507d9bab742d26303124a549ccbefb5efed83594112149918c143c27497a49486aa679f986dc8c1e7c523ecbccd0abc0c16916e1be530154a8f75cf1b804e0a4c2783a067f73d2f4ffcacc1d81da60875752b3e6a71d790f5e34b0bd1004f9d350c028711a5979585ceb3aa4cac78d2bb4c9b22f849b5dc93042dc7f640c0b3a85d31277c78ead663fa700f53e82bf08c58e843b503d3c946ca96329e70e2b3e270ce70bc1fcdb5927acd18de267279842546fdc617144793b09a12cf4e3e9fb613cea016e770dfb644417b50700c2588c0fe06fe4f3d17dcc21a47e1ff210131d0062f8c88440e34883aadf541dad3bffaf4971c824ed5b4c8ba3005aaf9a1d8eacfa61ad9ff1a993829a0360ccfd6bd16cc67e15de995859971a740a5767a2a7733b97c63bb83d2b5df4343a6f064043c457bee7868526948e5b0dd7d11e66005e4cccc61ffce159d1918ffeec71c7bfa5208d444e28b5ef09e65ede7861f2a47d36b7de86416da73ca8e270fa4aaf41ced8772616cd7ef9ddcc27eddd8dd0a906b9f124820799ae2c1eb9170112baa0c9db60299645524428ac452a2d294987d037e53148aeb3f543117c458a421272711a86e1937dc508eab30109b3f3a1f87d1f2e7388a08b4d75d203db7b4f2f3bab0310671843f58332c84d88ca53d9ba6749359f5ceccc88be3777e9e7a797cd00cd2b77b13ca49197f1e37d495d634beb5b243fbb69ea97f290538254221374f4cae1bee9a61434eb571f0e45820a0e97914966a5b5a2d69f9d059f354ca536eb57cbd4f59099506728ecd7efd450050d9f3924596d4ae9699e784a4685a1fc5354763867b38d8fedfd304610710345ba0a7dba98d5c86e1da8ab6fe28a5eef63162cab20ac4f87e06aa9162bb835c56ea77d205ca40ec166cf69214506ed99ae2358e79bcd5177a98ad0615d10040b1291eae09e8e0da4eda5be4cb0d44e9753c910ee3d83564b10bac166c5cddc1d0118278971771c0b6f7c1cf5c91ba2f828d2a0dcf882193870293658e3ea6e46076293490d4ecee468967f4403bb23bd1a2275223eeca077e6ba17b58f3bf630ade245c62706f1d1fb8848174a26df3e897fd381441b95fab8c0b5d00ded744cb561f0e5df9007e439bc158d6a94e6165668c0099578892b739d8bd3e71d7b675ae7a2f471871e87d597eaa38e7b9e2bbb38e9e3227aadc78cf5bc98f87401b98bccd658d5e8c50806012200ccb75b11a6363d774d42ff2d4747f32602b477cb8dd1560af7d88100b394e8681692b88183a306365f91337bb288863795020d2e16fc827b874497107009c780dcf51cc2d1d518cdb422d4ae8765e5ebbf03f0e2f8d41291bf76357d846b75286b6a9e2113eedc33128a2468f7a1fe6fa86731d67eb327ea904b82ed00da95410fe21f995b9566d26cf075aa7deffbafe683b05fa4287677f8319e1bdabe0cada8b85276b88fce7a89d242514b20347dfd6bd8ad5ccfd3b9587d2e8753077c1a53f958296727c597f7710807ef7d6c3e51a6d8853623b3b1683be932f6288b802affa040579c9234e39a7eecfec5ea16a64472090d7c4e2170aeaaa2b7d81b47e6710293d1c8f00ba0e81591f5b2052c2844435ed1c51c61c9e96ad9551b19446bf5f77b44684a58123de62ea5325eda5e88bf4caf8c2ed6cf24549799506b3fc105fc5f6e8bf4315643ca7178d687f8cca40da6316ea90f66894735c582e2e8330a9ccd5f353a83e6c28741307c8270cf2cfc280daa08e77d4a65cbfac07268c8c32f63b545d644f1a2a68ea07c2735890e1900fa07a9562b24da119912ca247d4d0c163fdd424746c0f785e3bc5ac7bfc14f9db5200da1e1cebdfe40ef0a258a06774f5a1ddd4e648c9f81e95afbf24faf1a9ac925edc950e078febd42665fd6f3c2071d7d7aa4605612893c140bba1fc3a2a895c9e40bde871756fc7623cf6abd0384782fd39aee32ff0486a7871a763a840d0b95f1fc7f754d953f880c89265b1f4deef3e7dc79c4190de23e21857b47c3c4dc8050ce201b38db22d94b79365dbf1e50c81f95080b0502bf0f81f3bb370388f1f768e014a0410e3f0ec12a9611ac2a847c0d4e103c143b9c32360651b94c93b53ba0d75cabcfb33e82a3c050fd9cd72d4af286a6cf0aaa7214fca109616a9979780a3299f1d18c644da3553013a260b85ba4098d9b880ecf6ecfa979dad8fc24276d1ccf2512f881269042f7ee56ed14662a134a4e2ffb2b6181aa8b94bcaf5886d352a70fd502ebdaec74cc5b7999558999514b2a040427ce296d4488ab857bac1d10e88ec999986d6ca3691656a44abe48177fd2505bde805d1ec5aaf1b0b1b6796fdb9c48941f303ba6f5b585fcb2ba638a0b8db1308f5d6b03d6f590752052898af7fd33726d450a82fbdff60197ca768774b45714a27ad01139a20d7a6f84552dfe552bd0188e247c95935af00d0da22d47ab7575673787dc59e5944822dac0acf7068a5ff34c9371c8896f682c0a06ad78c3b492557219570a3f88859fde51d0f3c16e1ed1f7ac28f36a784b1f24a8b716a19deb3ebac15c5cc68ec53ddf5455bc684bf8f7b4f7e52dda430213ab63bf4f9ae06b54c490bc12308104c23c0377a1e5725af033b60d01327324aa23aa6290774b7520249b07816c05fa154de074faf7b71962d988b39677c386c7c81ddb5cc1e2ce59802218200fd3331afc7bc5277e328abf69e29f8f9b51b17fd95754c94df3d37c0f20ebe67ab7460703edc340001993a8a859c842ca5d8e1875ff48ec9b0838223466a1e75086a4b73b9d7da21dd69a6161c475b593756c7c0809374a08a9867d11a1f487e5f09c14bf6bcab0387a5cdf9935163b80c81bdfa582ff3dfdcc5af1ebdbc2fdc3b5fc1f533ba39fed465ea19e4c4417503c0681e985532bf80cec30b18abef5ba0353c1b6dfb01438027bc2520fe621a059ae1b21950ed5acd77eab0d95e444c806fe1dc2312665264a19ba3ec148299a1e344077002b62d1b210063411336eb4ce00c72a20279bb69d703675d8022d1a49511dd90a46ca8521028f584a8c6308d2feec8817192b465e8e81a7fc8704291cd50cd763613f9b22d3a3865c0fbb9575e960c31b57807fba44850b90614d093e02d802479f2872515fe6c9dffdbd2c89f9d6aaef2ec21c13605247912e2ad80a9f8d8744528f84a4ed399fdf6fb92e2084bff70dd324b3f17a8a2f37fb49ca5b7ac8411d3a4768a56de0146237be52bce1f774dcbfac39e89560033369aedd7b5846bd72bd9ad95620f62b2557a18cac8990aaa6c1e959cccc024256e987f5b452ce5594400e385b3cdd6c4d64b38a6e41c55c7db8f5b1e6432671688a468910436ae4b7449cceef88322bc22a0c61031b875f44e5ca0981bd50d4e49c30078ca20587d3224c03b18c2d44a64f9caf03a99a4a482f121be16ffb16998d0451ae5969906c3f430a08bc7e34c89fbbc5f231a5ba42b85251372721b44d4656df2aa348cecd0ee8456c2e4cb7445f8ed842c5476914b88ba43a6e6241f1fd539b01be9c977f1db69e71f86d3dae650d1e4857ba4c173c730a04cb2874e204a3c82ae8a7c0eb7c0efff7c947c84d912298dbd3fe2712a13a45a9c4b8b7929707c9bf61f45bb8ff3ff0891aa15554003bdf7deb5ef2455cf3ef581fededfe34948f5fd2e440d923797ab2bd91506dde7613aed26bc041e0a2a7e7693446c4fc7c8238fa2869b329819306e155be29975320ae3f0dd41ab386a1859c8a567c12fd2b8f685d01a3dc157d590598a5f910a838673ae57f3ce00312e4dec59ba2dcda40a19600f5f6168855c67ad2cf173b06a09c20df8019671529742f7791c451b0124c87d84f520c1b3aae316fc84964542f55ed49b30f37771043a8ee1e752414615f9dd201644054e300419ef6c1c3de2372df6307f048f7e9148f9324717e5086d49f6bd3483ebb48b110497dfc51537eeac0a822a98f9cd43a36d286d9c6ad88bd4023c7161fdf15260bf7ede492217ce51af97d6dd08db841977ee771fb9cf42288698d93087be1087408422e73963518576199a14b98a14edab5d8c93905361669622adc3c1265b5f71a5be1ed28f675d2624a7b5436df463e381a87092028d7624c81b8c802a61beb1ab66d9c66067d04b877b14f8d105c7958984ff77493994b8188952709a8ffc8b7960822550653b2fddb167144d2de7bccc08a233041495a63fc630e0bcc393067b83de6cf572594e3a97e0102c7ccfe59e72f568e143ae0dc922705504ac70495c24a55668b54bd9b34229ff9b90ed15cbbf0ec42ea7bd9869f18a9e057698d389b3e9d2255ad39cd401ac26e389b1bc0943cca2fe5a9c6f330806e2b01a2de3e8b316b17454a40a64b00cbfed7f49813f5250ed1383fa44e6f053cea0f85287469584269ae80a159365e103b20bbba4cdacad9d720d56c71f256641eedbbc0a5138450cc8ed444013e2c13107ce3940114d7291814061238e5a2dbbda5e4f084decc9435ca8e4c3d9aa3e14be2e137c1707de7eb065eb2923364f0ad61dfee2701ca5c95dcfd710b46f8e8b4f0f49fadc331840efdf7a6f087fcce35d4df6157f6f958d3a101a74d21bddee0ea307380248c36b5ef0d49b7b142d36b801a0c99a779dd24ee1972e7323999800715e40ee6e4ddc9a1bc6d1c43bc8db62142ef0fd49e8beee5c44cac54a14e07134be08e19908475d55f6640d3028a87585d4ae35a5f48530d5d9feffbb3e089d9d47ccd9f7d16bcb2c7d8e556845d6a03d9869b345debace3bfcb35183c820afb6fff1168422c4a5740ad586141f5f83422fa679da521f7ff6ca9f9ff8a55d3b189189d97be68687e148e8ba3d1ff165129c6878d71da6f69c6ef55c2afc6d165aece7ebd339677f574a8a6f4a3f571ebde40a66cdb2a4df73633d13b42c68c0fe186bb688197dabe828102e2e1e22b8be9d00854012876b7653cfe48d2f2492a2fadff7ec28f3b50a7a652161bd3d058c30fbc2b62f433bdc1027480a79764cc8d6abe746d46285698202ab604e7798c428a4464929d8db124e05aad99c906bfe823fd369e93c47a58d59e59d06411a19a2602f415d08c67f76903671152c37a2e39bb8b8324f8649d1f2d128f0ef2805e6e9a064e6f89e781bf94a436097956f38768500184201ff7c698f36d3813a5923880ac3fb1732c39d00a29b43ca1d4ef66b8a922cb6900bb43c478a6e0003eacff9d6d5bd6c845dbf646877e8e93b1d74b674732625cde1d29b87ef89bab99c840476d3d5bcef4d63973277a4f354ae47a4425a3f4c92518243bc35dfabfc7046a4d662b1e533e2bdfd186fcc593f18cf1b744d541ce114375af4b2e592062a465e056c3fb4f7ec9baf46fbf8ce2847792f75beb7f13796a9899b8905adbeb84161c948c084b68f9e7c2fd1e7f6dad70c0331a55ed46319e20c0d294f0cbff82bcb5424fa28f639307ab7338f56e97b300b94f326544bed604b91f01f6aa4b08486c7a31af5b7957384f716fc3cd3e1c0a89f31f16c39a66572dea975d7b65c2604c385a9062b17bd1a98a4f2f2635cd308500b8dbc64f0bcfd1139dc0cdfd990036481c3032d6a08292c32bebe9ff3d31bb414226ad4bbe2e50efd8c7ae795b5d726e8de7b3dfb6064eb377b8d786dead4cd109c8a9065f070cf9a3a128c1196f25fd3a501825acd872ec0319b6483ca465dfa164aa2d6530179644a59f5068aa6ae081fa0bc171d8beb214a57b4decef63cf8bf4a794c56c3052447fd25a2515fe32a13020269c2e2acb2d18a1fcfbae6cb5f50b44cbd0c9a5d671b761c500b50c585c346aef54cf19d1d57cec73824f263b2d04f8f6982d6bc82d794de3eadb868b4f31557c45caa28b1f7fb1b1a398c62eab1bfb4a7550fc48e287abfde4fd7ecb74db427f960b748f9ded85b6a554ca646be217d09182e5a83453f07dce36c68bbdd84af613850e562d36ef41ee55a4f60249c4adb8a864b23d5da3443b6ea9620fa26a5428b3d14d590818968226acfdd03b0a7c37dd1224681e1a491b1e8dd2376d71be668405117086056afa994df4aec8c33a0e8be4a45ca53ea90ae9da99236068d4b68a6be0981a68c666de3fcfbd36a24c2095f1045318884d84858876a2654db56ff0a192e85156b4e51ddc8d09bca3d7ca80153fed633299d6342c203ae86d8a2d438a5324a25a2e5c4a5901703113a318f7d731f6f13ee80e63d91e0dd48820df5a49282bca1e5e9617dab517bea35621f1e885b49be79dbebdecce6d63d9253c658595431fdbccfab1e2b45a984dcc6cfe8c9c5f2ce1fef893eae360ccba23a856b58f5892a8726e89b4d90024c0878bd699989f3e9eada424e6686d4a7be109cb72eca2ecbc2c8ed406fc2e1e69453fdd0498482ac826433795554e8f0afaece51de1fe29468f6577589974d46afb08cdb2e68d79f66957ac3244144734a49f486fabbe93eb1b49254fba6643a53080c600580b776b6e307c29f63403b114a9b1146257d726d5e3f6b72095c29c8a633ef966db1d82b4f5319fccb47b282b437782a2ab2989748bb69fac51c4971095a62ed299bbec53b00cdf0247d9fccca373b8fc7393921b3617d9b13a72846f0dd4aaf5bbed85d8e177e0c3fbcc107d36c9f0b5124920a6c49239e6891981f4aedb1a1faf2e9db578eb59023e2deeb394291b82575b929d6322a4916ecc0eb9c72eada4cfdefada9a1a92fa3ce4e305b2a0a08aa3a41b992efe19b38edc937d455e67dbe0f06f1ea4b25157954cc825fe5a89d22385eccd3940897d20909af1d44375bb1d800d932803bf6a60f85289f253023c3ed1aef53349ca427187eb6390613143d6cd1b06491b059d782e0dd8c457f8dc06578286e6b1dd212771cd8f44af9c6a73331ceea16ee4ea8bde016ac48742e6005ccb19bea8f8d37bf5202570a11d4ac55d74dbe44104b0144b2905b1d413c43cf8833ede8f6e5d4b4380d574fe156ae93f1857e4e3e35940ba0c4a23510b07be2070f934a03d16c9a575d6304e71ea08ef03c6bdcf1ea75d82565b13685fc0582935235416936f9053788b2202772be143c2ac67c7c64c1e8fd0095163288670b343ca9a0981703bc722f5e37084485db20c4e335493d9dcaec29311b91b5d5cfd23ec7aef3b97b905668b5b33366c9b498e1bb1331cb69d43dfdaa3acd4e209ee436fd45bff32934d2c5131843ffafe9d06ed1e5e6521b5dc68344409a06e2d14ebe5d53a787bd61819160fc284ed83d4fb06c5e819787173f2a32f9cf774dbd862e0fb509d6b17a23bf3c270db13aa91873456c17ed7256b761d2476e7ad497c7f8d58168d9d70219039e348d01c213afd2a913b117369b3513bd2885349451a7b22ba95d091cc30946853373d38d0399b190ea30c1687591d22802817b63e1b678c2a2f162314d078277c509d0408f35e2b0058272cab0700a12b314f8f79d0c8055ade245ef12c429e4ea810f8c14039b1b314d724fa4f579b768d4e7aee48aff7249e3ee0792fc20408b2a6d980822137e38773a740a41a93bbb6ba158806247644578dba22f139bc53e53db73f5ee42951b17d53c23b2d83591da7d6a744098c8608c36d2eb8e4a60c667da1843aa83637f53ca7edc629d14fa6aca336e62efba6e179756b849de4786d4cc495123f0f8415ee88b72bc76aac794294e7986e24df5e1c1138255276ea9bd4a8099b4a90e1f28e5ad129fc258b9c12f90f7f200426819279cef6e0e2f966478942d44c9c8a9a03b6d34311cf980f23c132cf08d0ecb3dfedef0be535841c871404be3205f0ccddd049ac8d2c764f07594783430f08fde82451fa830550b7eab7d6d7713d6eefcca58a4aeb6c905b3adda2a8fdc15d322f19cbf930962e5b615f1dc19f3212ec380c6ae6140a60f0e196a6a26e1157fd5fbf31bb452a6f84772f3a9339c2dcf01582cc1bd9fad644c0de83935758b1bfc1e6982a105b054270c457caa530cef41a0338e74934e982519b4f6210837b4f2a148ac14836e926a7705ab176105285a70fe1e169dd5a26768669b4135e252247682352315f037be27829878fb62d189863509d3e6e0a7ae50166405b89654d4ae16f3c48749b0e8ab677b805dd5a086256463c094c0807e5f3ae853885fcfec808a07f90e12417b20e74613e31c3475142192ed875aeda3a74202a4a657de1b28dddd135ab12bd21e966ec281d838750b61afb4ec50e765d0b66b0f66785aec83c109e65da237c57481c67492e5961a3c725c8121794ad0f6ddf47d5d45f708e1e443e463fa21075b202d87972703f11f6a682a4ac243e6b45f9e9aa741bf18a2dcf801a9ad59cbeef74b72a191c354e84e080d089d9758c6cb57cdc48b150509188fb84b9822b3ef318343dec0182c4d2b64b07e41e885d505a8e149ea47dcc52bbb12960de53a7066d45750b6c4e9c2c9d29153e1b4b8ce1b1ac8a4475d0cd23cbdd363af9c82b91029061d1fc08495cf18b89fb2594e85b715a4782a0f0155d53cad43c15439871805d9e65b8a503c72375486ae0f1076eac89e6d0d51ef418ca8c99b754a263ac3c427f52cebf9e5ad7e17f013f36eed924a7ba27d63c522220063762b956c6b3c69266b9070e81d0c8145f1d5cdfe5768275738fdeb8432777af25f9c88d9b171867da5b6d6cd07ab0023ae6157343e581813fe1ec375577667090ccd98931139c406b4be92c80d3b9038bf4475a05e56b44cabedfc8ba3e273a0abdfc922a54687f12e8a65b00a8ab50422b50491c57e824d69a2bb82442f7aab1120ac4765b889dc093af6267f92819b9c47eb0d60a4773761cfc786e1e809b077c4d843aff64d748d4ebb11ed08c40ab8ae3be7c01d6904528ebd9588eb4b283b533055b04ec71427efccecc79a681903cf094508c4dec72034a227b75c654a0d8dc0db4ebb5f0360263e0fd5e0a27749e7c270887749e7b99b4389147c3be055d61872bfb14a07b91433f691191ffe44780927430bddbf2f3daf953b71a19ccab3dcbe1856ee13d2205be0e8b2657edc735bd91f6e4ed6ddcdcb4bc5608e4a2a853fbec909bdfdcedbec0a12b6206716a4323c5c8e022090f27f6ad8bd8e2640eaf80bd00c0aa082c31ab7e6d57263b805ae1cefec479d249af53ec693954c61cbda356a39b46fc4615f26ae3624b308bd7dc1ff1bd40304ade37907ba1d2e2f573f60eaee63f908df1c6772b75ca23e2d9186de477194140bc596cf27ee1cbd36443033b902966836f81653810b5d1bc2f820ff6b44c920ca098459d64153d882cf02b85c833984c2a52f8bf5bf871643228696eebcd6658736bdd9f37077ec266d24d032f86166741e29baa192edc79340f9b3c7e9b6850e223aa5e3a1da3626c658dcd0760108816fb5880c6c043b2e8624c65a114c7d9b28ecdb9e525ed8261da742419ac945d3f2a821206f95ec41fa79f2d726a065a2879bff4183d0ee368b41fb9632d2a1eb70fddfee2517dbf22d868f17353f9ce7abe018aabac7647be21e5441d52c13768445d594041a2dd5a1504c5cd4ffb1ac69e4aa0d4830c57c3f24bd2e908b8d7ebe368377ef76526909bc24a0c43070e48d69f96a9b5d4c04808969d71628af63abbfc6d5c3af7e3d23c164235581d0887481a7234ba37c6040c622a87b5bb4c770782c5bdcda9045a44aff40923b4e698d527f1c8fd9a8345b509c6917bddfb61c9107c5ac7f7f249d037460ae658c35ce9770eb67bd1f4b43057523841d4f72c7dfd16cc5a193a3ad196c4b75c126686c11930f6841802ef81c34d4c33281d691d91ae0ec55259211d93056934f450f1208c4bd3851ba130cd4617c6e1d545325d619e0fe6de4f48906ca044f5a8b888b9cff9fa6e54d9513e838cc3505008be4f25264534b8b4d4832c26d31df8e5e757c8f5375b5a29c3ce445e02ef73a3caa28a01a3e874942104f3b40a747cba599ca08af8575c0ac5789f37e1f275eadf7764aad1cdc92a062f998f3c3563753b838227742b0d0327e7bf09b651f167bd62119ac663fa0049fa105f04eb5789742e40fc19a12621be08ce871383a11311089b786b6816898810760e98d00ce0b3dd1045bd9a7a8cb9d9737ca97bb60c0e6bf456c4a1bf3f14e8ba5a117660c716933c3aea6f4d7611778064f60408f03a07bf76ebd601edce7d63ff3903b354fec629d41f27be9a0958920cd41f79371158fef9b82f773de30b618e20084ee19dc8872788b5fec332f6c2c86536115ed5871a1cc820e6d613dafd1862ec0658936b87a40f34481da577ffbc983aad94e8f8b2a6bf11651a12e1839a683f7f2c4f168154ccdd9f4bac4ed7249aae7c99608b7a2785c8a32338f2eb69fe293e2e8af801011a0d530e72c0df971824052f99ecb7e3d2666c39fff3f727993e25d35cc675f4a5bbc286862556b61204fb74b637165f971e89ba14c4755d6793efcb968b3408e805d430480e9bbca204f91c0950b9461762ba9a869b91ad52dc0cbee594893bb81e7548839682449a1bc0b686e243c859d7bb386f38d506c080bc846985115d8408de9891a91b142c14b777ddd8d2a47361c85ec04f8cfc980c69ad2b087f696ea6a692316bd24b816eac5eba40b8cec9621a058fd972a7e793180870a51544a2e185300a9bf229ed2e8e42a0f1b60a0588c0863f05d867a383454c19252a85ac9bca70e4bf2db6e70a81663d09886e80c4e35374ccd5ee836b0402632a262b4bd46c2c8dae6f36d3642c427cea5c2e1b9aec2c4a46f058066845b3401cc88578f2db40f85ec2c2aaf11196888b7a86126d70956b6ff98b24dfe40a3bb6187165a16490765849d23cbd7aacd4328640c6574eea9c8682c04512af47cdf2d881e63d8e770d8cbbe5cea0dfd7ba772031d3dca810699a12fc95b3e97dcc6b2a691e304169916b22acef89fb5209b2415d5d423dc6e60a66493d5fd80f9ab7f3385bc8d764453fb33d4551969880c371477fe8f7a9cbe2de6f3951054bea5b03ea040db074662dcbd43a298fd14d0d314730882ec6e65f754a358ab8402134f818faee852ad70ac5d89e2018af1abbc179bf4ac3ef83eca4dc9f833107c445dd85bb2f286afdb6d5cb0a25674c1f2a486b81f3e675e5436e80f4e201e0305f175441f4c4534cbb33efb8e71bacd15e8fce48f0c960c3817bfe6885316330ab1bef03cc7f7421fe03e4795ae635a2a5380b7900462476d2a28bdb82a4088b15c371c1a9c2f99b0cb9fd9d8ad60def6e24e8704b4d750d5c10a8ea0250f5152e42e687cedcd916be2862ac1e2cf26b018d530ac54b5da140263aa899326d9d16a6eff25a60efb1084263370ac0812892258f538e608e46c63da1079e8cf2e5c4809a4c0a8e393d5649ab9db2ec6faf9eaa421fa622293105040beb09df9e0deffc02efedfc2ffe06fba64d9ee003a7fbbb849dde3240ec9a1ede9d980044a27a8b5fb88ed81c3da3587c5b8b26ef60436648207823ed87b6326441ece0c45899d326188e2530ca6876bd6d904cd99994ded8cf5e7f9c6d9c4281c07ec2f3aa67687bb296e538b5e4320b0a6c3be6188764b6c5cac10b3f488c10e5d4b49c049dda80aaeb5de124aba029cc08bb80ea1d918602e18ad9f56a95f8358f636d7830f4d38faaf594a4097c89cd316716f1c1aa1e6736238c112a8009941275d30815ae086de0279ba5a12fcebf7a8e3748eb2f1da9e7a460d509d778df37acbf4f8f7b52bbaf8acd9a3840b1a540c5b293d1ea288d835080f299d647732cc11de969333e5744d884f8cc5434d8f5feb086716c5bc28b7a427cee3fdb9f18349186d7558c434f20c576a8eb4dbd5ff8782439498a19305a204bff4dc1c7dd7e031d8ee91027fa46215d1933b32709dc4d04fa6a87b65c20ccc29a0e4d9d55bfe517fa3ef9186eeab8a9fe40748505f6d066686d0e9fa7bf25388251dc5d2f055ce4e915f0aacb40f2f10927be76098fc8ae0dea73da37186b953ecad641e4987b9d03034db88db490b6775bdb7b6f29539201400b7b0b370b37b762b030145d525cc995fadb95446b955c3ae05a2c766e00be7862241e688c541afedd4f6a1a78eeaa2aa3ffa99ffaa99fbaaad2f0dc15ed6eab6ed7f7e34881d31078e4d60942f9f6cb2ffbc92cfc1267d8c75e1445511463b11763a7086e869d298f0c42f81a849ff2c8220e6164b631b3baed7e89cd14768e70f3ebcbf383f2d4e101105cdb407cfbe2596bd96f9d7886a960323304558f851e132208f1829a188ad49024051e2870e37cc13a78f8cd7ef8fda3dd41e453727fbf071f8cd055670a6c85f199d2da0a08ae3c2e555a486204104d0421fa21858cd39120594bd830028e937d7f53c1e90e0cf2086e3b3bc93de0e136bcebc01057484d81050527361baa0479e1042d2788798bf340f4fe23a8ef6ba9c309b9c5a8f703cbd1962d5a82601941398dd115f1563c407387073a86e0cf695b7940e68a134dcae8b68041bb3e41460a29ab07de0c34a0fd6dd558f6c42460cf3c2cee6ba2d22b6342912ab08a662061ca1649c828adf951802848724b709822cd9928a2c092440616b42025c1c3e23850c3132e3ce4b0806109da5e9e8c61c209177a4646d07e1d1ff8146dcd887945967845921c7626e7690ceff6a428823515859a33b03160cc10d1024556ae5c72d50245948cc9b284d52e157f3ae6eafafa3f18f8ede6c6f3f585fc46cbb9e17cfd0c1c47b3b16af3f55b9586ec479d2bfae0e4469fe2df9ddae3d94ecd0ce1236f69bf963a5fcb0dc4e791777096c042e78d9a6935dad78cf3b49cdfc1f3e9ec676fbff5b3af7bf69f19c209b2d80aa1b3c8638220befd2e3710fffb4ffb679f99765e93d3a27cb3e59931c6052caa081972450c453c58a1cb5ad2e28427a2d0914810577ca982e66a8b4d1059a472a06264550575219d1b8aa2d0b9739e1fad75da5ee4b4d2cc1cb395cc5ed246ad1ba2801b915dc6ab4422fb936612d9df7b3c0349554d972af214d99d709d425ab0d9436c6981c289485554ebd799f71c80da6fc34918d2e8d5bdef16584d584a2f907c01bdbce77b9bf8f34fa25846612ceff97eca07eae97f68500de5e1167cdfb1ec47ba5a6f4b1b2190fbeb4c77d06c402ce0303c8170b62c1f86f3292de7539c5f3f132d92dbbe6ff6f84c45fc39678a714e24c735fabd450265bfff9694af286c73c2e1a7bea4a1763cac8f8fcdf6ffb9fd66672ae28f46fb3efc01df4f6b540513012159ecf5dfebf0e003bfc51ef6df8f36f85f66e79879dd1686b886852acdb4c1e40fa70a3b1679a6e278a698f6df7fdff78967182abd8e7658b9a5a41a7b85696b6d13ab7cc3ee6e5cab25c92ada6e103cbf86dbb0f91a4eea724a82a6cfd04b7ac9ec29b7f5bffa6fccae6aab0ecdee998d26757df877f633d7d709b81ebb0d7c85c1dff77d5f08376aee13aa8cfb1a7cb9cf7a5469f8ec8f2a8d1ead6427b7ddb753dc769b72b4883172e28aac458c531e2f291424c7b43c0b65a3dc669f2cce4e79cf759d9fdaa97c677f639663a3f2b5bcd24678df66099cf6eede1b3523d55c5f9fd0e58bd6c2fb77494cef865fb588a9ba5182d3de35e5fbbdeb9d6daa4a7e0bcd7efbe4562d62a0f275bdcbe6665f677556ad2bc7c4c07beebbcc3eaa32be9b9f7d071bf4e47b41f0c33074b9ce2a049441787f6e4c1fd21654e1461a78fe4e175265dc0f81c0a9cdd91d92bea0f3fdd01a913312d73b7bd427541a28f405e25ffcf7fb36a9a1a1b9397f3f0320c7e1fc7d21bf8d5fde5e36677beedbc8624ff3c1b6dc6ef6f76deeff693451c4d8460c2ab07d7f9bafe50dfb31d9527f39064975db8d997653da6872dbd4b0669859cb0c9ad5e62caea246e892dc9f63e298d57bd2b662923b3c539f21f7b7522bb9addf5ac91c478809431512d684112286084bc6091dae504d986122aaa98b0a4cdc7f844fa88fdb155e0c42f7e349889d0a42a65803038c973148beecc4209191c159cc34b45016bd29524238199960c75ca5114d105325880d6296705842a39d47f39fab295cb70b62e93a75afc5fddccf00bf6de62ebf89672a7a78a62278a6f83bd13b735ca35fabef91abe9de3161a4684a210c0b2a8c11db8b144a3820c8102948d0f01404e9069cd26842acbb9ac27c110b36d0c0a40815234d74a9515c5df96a1055bc30b5b00589298c9024892d0c53f50246ac5429c929c1e20a289c2a11b92755443c418310a3c7a832b000cb74f6c18a22aa4001757555b1aea0dc13341d8962e58a941ea8a0f7de7b491784b0ff64af506e9d7ca0e30da1421a2a5044d427ae6a00673c3491544453164d1cbddbdc0bedf3ac2220588200c2862dd2086183982b19c4a29d51cf880b3c254ab4d0e82d2008824f5d80e0e0020c2444c10082200882a01319bc42ca202c83e0db2c4e87911d9434583071440b14044110f42fa9090ec3ce22f82698caf78967b6a6ba9deae63d69c20487241e94484302158e50e187332c2825557bd5c49551110f4d616810b3440513a7126068616a0a2c4e3aa8d1c9c166ff7728aee3d2dceea7a509704215955e924e490913bdd0068bae891da638d142ca8d0f3c1e0506b02831e40623272d6410c31ce1824018224d86883933858564773a60cfaa328e3c86878015456298c1042b244c51adb8d86cc002912aa82e5092d86293054eb1b55741408e00b932e5470d29a0a90f90b59ec52ed18398efe3a2295f98dcb0c5c895354f8830ce21700a233beea29e698e1351259d052b8b9234545b6040535abed5a6200b5385c2ea871725c20c4192e68aedbcced527dfd731e4b8eaf5defb3ff7dec7f76db7c754840e3bec44f7204af126fbbbc8fe5f15518f80e8b72d106923c57bc94b8ab87575f316ab7aabd567c31478419f1f9fef7edf673f6bad6def23279ff25bbd56f7ead6ddbd767b777b9fb13dfbddcf7e9f7fd63feb561974b777efebf6eef6a672f7893123c6cfe8db77468c8ee1336346ed183e1d01efcbc5faf5cfbdbdddbbbdbbbd8dfa767b7723a92df15ad1b4d5c0b74fd6c053039bbfbf8fdd6f0da84fcd7d50c85a9c8869369b945d69c9ee469bb0248ca30afdb808dfdf4ffafc5db64ed58b7e66cd2d771742ebd4cf90508ea919396ecd213434253494e35aa11c5342393a10c5a93a65d5a242d7395bcb05c2f775f4f1eaf17af2cbf725209bedb1b8d78bcfa3d210b35b3db9ad69f604aee8ebac0995e4a75f4f10ecd79fdbacb9d6afe1ad33fb8887edf16ad6dcaaa8cd5aaf5ebd7a6dffb175aef723f0e8d1e3e961b3d96c3d788cd0e331420f1e3d60541e582360f520c2e2d1b3d97ab65e2f479aa9d50cfefe6dfbc40882bfafe0576badb5d6da7df6152f45a0aa975d2fbb17157ad9bf75d6155a3027e4fa1a071575d52ab0b33d42ba9ced71d7b79e89a98623fc9e281c0abf7512d53f2b1afe57d1daf7e3b3a37546fd81111414501be5729f756b738e6b1eb9b466e5b4a2c9597d8406cd08b5c75fdc7563f1acdd2f42c5b7e159bba790ce84f1842b4abe0f111311131193eb24621a723d7912b9be75129d44dff221c25f51d77f455d67ed7e45c3b306fef8e25903cf1a06c477fd50f8e349c4047ef8e03924beeb5d27d1cb87234c5a405992cba1e217a1156d9db50b647b2c460176a246f224ef242b8a3976483bdb9dd439b7d9de3512bfa5b675bbda63dfaf8b49ed3eade503ad7bf839fc06c2fd6f7c1fb02fdf1fc8e27c300dbdf76865f76f23712606d72cf4fada50f9e4f99d208cf0e5bee9b706f5c9fe16f90de5e8c0f6f82b7f9d4bb3a28e85c207ff8a19b8cdfe776b6400e4b6061079adb5d6dad1473263fbd7eeeeeeeeeeeeb6dd638b60f83f8e6b2dbb08e4f020cc52eeae55b9c55067d4b99eb5b9c4eeee46f111f6af6d31f8a9f1d348dede5d23037777eff6eef66e1a8588feef1f3ef8b54ff175625c9eaef3fb4c6dd9f53f1627fe3c414d51e591545acafeb5d65a6bad3f3f21949f1f97f9637bfa5b6251e8ad31602fecc0e620f9e263b7895fc3497386db5a660c1b68f38fc555d44f5107098ab8c5063ff0fb3ef0abfdd5af82b57677edafc1af76077fa6e1d38b330da72a385311c9c5998a493c672a2ea99da988b573a6e298ec1f2435c56f77855cb38e192435c5a95606493959f1db2d926ba6994152569e76ca20a9a72bbf5d1572cd396690d415964e19248585c66f77976bc63183a4d064d1ca20a9ac28bfdd1472cd37669054d4544e1924352505c66f17855cf3cc0c92022345855306495101a1f3db3d21d76c630601a103c2e8a60c02c288e7b77b946b969941523c29a859192405a5c66fd7845c73cc0c92520344cea60c022237c66f9748ae199b4152637ab23248aa2755e5b75b42ae19660649554959c5ca2029ab28bf5da35cf3cb0c8a8a9ac26550d454141abf5d1272cda5191485262a0b56064565491df9ed0ec935936690d491d4ee550649edaefc7685e49a473328ea0aab2c83a2b0a6f8edea72cd2e33286a8a1359064539f1fc7683e49a5b6650142f0a6a2c83a2a0d4f8ed02c9358b6650941aa99cab0c92ca59f1dbfd916bbe66509495a7561914f504c66f3797a3c05089655014555495dfec9a5cf3670645554559856550949594ce6f768b5cb33583a4745246601924655465d41c1435c66f568b1c35c66d350745f5f2570645f57a36cb6ff51a1ded52d048f6bf518e03932c92e3acd3bdba55d92f98ecbec4e909d5142b2b6e2f2f3b962592727ac780f64c3148bbddf66feba391f8fed772276f72eb647160522a624ca3fddb6c6092c5f1018367ead356700a2681491627823b1fbd074d0d9a880672b0c3779f699f9431a8c06fe5451238ed27f7a52cfbe356c0a4ae6aedac686bedb2a73fe01713dd66d1b8cd3f07057c73303c86f72c0e7b4f7f2ffb7f0fc086b1bfc1fc8066ac3e8eb5ddde0f848528e0d0fb7d042e86d7820ebc169af05a50e2b5b0e3256dc14b9242892178495d78493df092a6f0926ce02529f1928cf0927ef05820c304181e8f85293c166ee0b120038f05233c1684f08ea4e11d918277240cef0815ef4816de1126de911778478e7846d45cf18c18c13302c533728567c409cf88129e11213ca4297848563c242a9334a1727a7948bcdc4a70e5214dc969ae3ca4283c24261811ecd98ab57ef8f57e58474bb6d29f7c6d0cfc9ae7b0db70ae5d2e97fbc1e338dddd41c9f671b0b7ef3363a9952d6f855db6d93ed0e802735846aef39bc522dbf723bfd92b2460713d853585a5812df78b2fb8ff45268d49aea4241dafd3a6c3e262388fb75677b42edbfb1e66eac6a61584c8ad36d336bf8af3a5822b6f8aa99c3ac077e109630757d9efbd17e34e1aab93e94dd1befa58f25f2349beebadb5d6da0fe10419f682c16a780d9775d913831fb77d2ff4b35a0a4561bb1b49b387db3e4b9e23903c70c6f43240ca3db9f2765879c4f93e530c625091b35f4f0e15856ebedad38609dc5f832008b65a60378e99eea099a2896dcff762105cb38fa77239b4664f211b041821783914ffeb310c557200b3c4062d80c0a2080a092ca069f28589124ce03fd359ee5cae061c7bd2b4a60d13b876f3e2779e99b5b1777e23bf3c6a5deba834cb5a6a70e32a8fa4694bd2c4096d510ecd113ce39cb6485b503e90ee7bb03c33709b0df183666f73dab497f054c8ca154cae3c1596c0661944e0c7e286bce7fb1a423805fcf9ab443401e4c809674c40e201fd6208e1210d92a8265f94a0df77eefb36fa7eacc269e75edf39d8cb8c716e1163f785e27f5f699d166482609ffcd17a79a3d794e359dbc0f5e3df70fd583669fa8fa6bf755b69030c4e3b77de10cf5a683302cf9e9aad20566fb55caef1f1ec47338413e47b857654398b7ebbe4db17b2b80648a1396cabf5e7b75a396a00c57408ffc3b7094eeb530d3bfeffad018b3f9aae336dfdf7356cab5e81e76717902d51974962060a3dc13865853028d3fdf1dfd6f89ac40d5b7a48e2021a1c5440edff581c096a80c2ca0911ac242d50fb6fdf66ffb69c8c3ba8dd532da8b37f677f504a901d114fa80e1921efb10f429fb5ab5306a735cbc7f6d817c514d79d1464d5dc1b6b0f5c79293ce5cef15270caf689ac2efb589c90edb14fa3c5a0424949c9b69290ad53dd6da6d8c7e248507becff2821db6f157cac85ea5165582518155ceaf0b0059b18bdbd434bcc8682d39a9543080043589f8aa6fd26da117a58dc0641e46a4fddd59eba411049b5a75d50e3e3605fbfde2cdefc3df82986e1b7f2f53e3fc36fb0d36784f12205b861bc4c9bf7f8974180485344125d2d3109283463d86034a901e4f3835403c8e787743069ac304a1df0976bbf9e06d5edf6f791a1c19fd3f7f979dbb512e8d206ad8a13d0c2c528052d5d64d8a10860c28489131d52b06288e78a02d6015f9f9fb77d4d57cc9ae0cea928a6dfd722beb417adb5d6baadf5566f7fa00cf69a5546fd4f04c55014db45bfa58d33046ed914f66148545e1e72ad05c3d84b8af65a6bdbf3ebc8f7edfdd29cec6f53bf9387f7f8d7ee67ade5bd00da0f2c5ff7559697bc5060f86b901c4b0d8a4e0dc2b7380cc78c5bb46219546ef07d61692304adbd506259aaa8d4f7bb9614451db3ab067def77d7cfbc6348665cbfb59fad79d6843b8986f2da83e231d372effd6e7525908a0b1d702c571e0a55e4174c55d985133c147839c5ce43818617fc6d4e1ec699249b04ebe4ca43619753cc3b212be9df8cd5db6833fc0fc316e36140e5f47dc221987669ffed63fba1f99c81b537152ab421399d9920255b13b4c8f64d9a94303a449428e2b1d72b2a4dec0031404ec912a88c207243b6ffa2b461310e584c7777bf557031b02520d162b13f0d8a2ee7bec88317604424dbafe130e6a6876ca3b2fd9dd28615dbad15d99bacc87e06612d092b645b806cada565e143a2c8de93dd6d384d4a9532c736244bb6b42831dc5c8000de10128410912d2dc71312c4e6777e90339e204430405724fbd37452647fd9572790b8e02509063544b06ed4901484134e44d59082ad2287a3588d79c9fe22a6bdad063121fbe30a04122a9c8efc68c252c44e9628459a48e14b121c2a1aa718b2fd0cacb5b604d98c07468c1940948ee001b922fb63dadb7c603f3a6b9218a2004778b92e31f07e54e13ede858a901739a35d11d37ecd12d99f9cf1c30a3facd1e289cc97a2256274c88221c9124765502aa0f89069b997cbe548402d552d89194a6891448b2ab6d86d31266b59d345cd930dffc14d9941e7da6b5fb48fd528c9c288d9cca97c9975163064fb6069c38a6ecf60e1eeee6ec20c8b156660d1258b229656734812e3a1cd86e09446bb55508fc8294ff62c1d8cb842852b6ec0c228fb5f5b8e3e2385cb0d3923f12c87c5d168b31decb5b756fd525584153c2ba4d220494326fbbb8f4e9a1f724ac2c8e90ccd0c48a059538597ec3b40704a3a995d891866d464ffeb2f9e0122fb6326d99f464595ec5ad01cc9ee3e999c2940cbe35ac1e476d70e18d76dbd30ab65660915c09e38c4d1f7149ac921c9059a023483c4050b54e6e933736488cf68649cbca76691cc93f7d49c8ad80c1024a031b95e991580a4507ae29d90f4f2e2020a5e4e67514869218a1794446194c1093bded19601e4aa458a22f9e6ca3bc292d3f7b951c60a230571f929ad2f7021d9ffc3aa341690fd3b4ae35a577bfc75c059b27f6d5a7bc9fe6eeffdd13ac57104cd94964110044bf1495719428f3fea9cc16937d5c01a780ae9acf793cdcb9e6928f6f8317e9b1fc26f731231817808bf0cc79a30b65f7e0d274b50fc1d647eddd7995ed02ccd344dd3f23bc8e00719fc1a16069a698cd2be68459b495b8ea708365c673f719bbf8df05b662f85bf24097f969dc176098cab1852d01bc2031591a2a6aa252a782a2049e209d0b401e6a0eab60aa6a1baa99d2cd935fcda39bc3afce6d91bc8d30e28dbeb4db996de94bf70d72285150fed6d0958a0de61f1d933dd8141ad9f0982fd35f7bcd17f4f0cb278a6f6455064cd6a41ff1cfe3580accc8c1506d1092e908af28432d9ffdef3c54ef0fb03f9fbfcf8d3fc693a55e0f13345a82a323914b720e4490ec5fe34ffea2f1251262b575e11a333572d65c0641d16e74a6578b93ee5aaa58cae4b1bdf57aaa1326cfdac7c510c4b9b2178f4f7d06902ebb03851c49846fb6f2be7392f0c632208ef2247ed3d677b5a9fb695d068cb106cd42a230445f9134f219ed30793f83e765e563b7de8b4c89d97fdd08e780ee9dcafe1e3d3c8c73161a86b7683bf96b5f09ab5f01492c9da46163b31ec5592a30bec85fe8a82cd6c64358671fef5e55b727cebb9a327a35c12eee6ed8f5e519b8f7d6956f465c660b0d8c3de06167b9c994dec5d3c2cce752ed5be2fbf08b5df59c3017bd70fc1def5df39e4faf224c2ef3a6b1f91ec6167edfb8a3f537c9a85c1526564f1272f6b60f3bcc77e3fb51d5d373a8b70ff7b9bd8d7b2069e4230d8eb6b382c697636d57dfab22a0d1ab8ad1aab7b38b7def53af2cb277d811b658b03f6363f047b1bd977e2177f6c3de9faf2f4a921f4f353b0a2cf5d655a2f5ecc5ebc7081c3c353b391d17666309d1b375f3ccf5730335fbccd6c36fb17331e99e9a3f6ae87993e98866aef7a1f2e3ea7067e05c6cff90a90ef125ff0bc9885e1d712ed8b592b0c217cf1147af1220445d90ad5c0cf317ecee720dff5238f590b9fe78bd017662d3c3f0cdfe65b61ab25ee346da9c109ca494e5bb7c5c996a49618d62d4e76f97e47d570cc66e2577012b9386be18f9ff3b317cf219be739896a672d3c6be08963fc9c1f22dff5e4bbdec62cfff53433f62ed8bb4cd9d712474d68f61c547466f3383b6645fbc614523e7e7dec6736a72c8661af921c5d3845a0bfc2a76c45106104318f80b33f99677984954f62990bbdfec77b3e3f369fb7d11eab719b7dcf729b7d6f2a9f09bfcc464bb3a242a288318da6a4148be11f71f9afaf672b7553876926faca7b6c0f0f0ad80a9b0ea5cab0efa647690bec63d3a7788ffdd1742bdef47d56d8148128029cefd957a5141c6611ee529313947df580efdff3ca716ee43934366a42e5eb6f590b4fa17154d275cb74af2f7ff426a88ae54e16177b710a5379aec98d6c4fec935cc9f6d8d4733a98eef5e4c74ecfc15cc0f72a91f677664ce07b821f3e7f6067faa0788ea7984f5ab6d6fef8d81e21dd3f898eb7b0a193e40bb4b96016a777ad64f3165bd2de586b71cc8a7e9735a1f1f4c12404fb2d501cb351aff9975f51d2247ffc0abcbe3c7de4fcebc7d307d350cebfde07ce932fe2d0c18115416badb5d65a6bad15416badb5d65aa1fb35116692a08decbf6c78f608c333fc30049defd7c4534877f3b36f9d351c384f7e0e9c93fc1c39e7eb458bc37991f6383f447b9c9388a9f54439ad7388f63a2711ced3ce6a7bc42b661c13255fe3cfccd2c6949918c37ef43a332b4a36faaae4596d8fcde9637bca2763a70e9f30fca30b17854eee305618a368713a2657ff108c96463e68f943304a5a1c267f72b5296735ab87c555f0f7eafcadfd75f17787e7716ef3dc766b56ebc2d70d11d120bd0665027f0846c7c7a6cec8071d7f084673fe75026e9979e366f915c84cf2616689317e12975f81d9a89b35efbc4e8b2c1f870e0e6a0a2a12f98ab6666d8f2eb9db4abd74dfb663f9ed7a70bf5e41792056a12ae3deef6b2d125419f7ddec1274cf7dd27cb502d20692afebec5165dc7f01c122887fa38620fe8d5a6b9d426429a4d3f1fcceeb6aaff3238ef97ad8d74cd98f3b664575cc8a36fa856693f241b3899188969f631a6194fcd1d40df141c937c26869e2d7316dde0a8135a19b9bd9eb638f037bd9e3b7b999c9cc37b1f932c79e15853e5e29e5fe11060c8761fdebfabdd21172bb757b3fb095c5506cb9daed93a41138bd3e60ac412bcf442353704a92b1984cd6327fcf8e453038a59135c71f965dacf65c829f6c01a7df8894ab1352b0c4e0442f0b1a7268ff68647116b8aaca6254c39012aca0fdae9e2b6b29f7d72538a5d5eac548958a892b86f8218d154d44ea14921ab2ac0802c5062a1abce7463fa7dce96325228e1054430809628a1ad6ec48c9c1851d9010d96185efe99beaffa8fabfa70f6a54726d619fe7ab7f60713c67e7ec79e63efbe32f42ad9f351cb1e7f9a1d8f3bc3fcf49c4e4e710cfe39368e779789ea8f6b1b3e65fd1d817a13c6e5623bd59189ca52a572572e561d9228f96a4d5daf3f8ad669e9daf3fbe72c0b3c76fdfed7b92c5e17ceabbd495bce9f584fb6be956dc66df9d786c3ec52edec664e2a0a23a17cff333b3a22e1e9b3c388ad0d8735084c64ea22294886988e763efe2878864401af3038d9d444432208dc9a13c3f331b1dbbc451519dced3be96b5d0058fcda5d13e54191648e3da4bcb72da50b286728d2f2ad8bf96bd0f00563b476281c83d37722423bf85b950677b08abaa9abaaaa14ac0feb61652c19586d8665a2df1ec17105cdd2602f8376a08e0dfa8f9db79f580c5b7d67e2905df2cc2cd3644a885a7900b1e219d2ee7755e87f3b41f2bf89a69f33be6ec6149d88dba4723dbd98b3b9c94ad520d47ec5ffc50ec5fd87cac829368f6f86bb80b33f63c26fe9a59d11db3a23a664569664573cc8ae298156d998dde9815edb2266473d63c64aba440caa1b3f33699638e8f63be5e66bafec62c7f66da98d55e0e2aaad38d4fbeeef5b0bf664d28f61c5434f615b05552acb006c53f7629a41352becc1cff453e4c17a3d16c8fcdf6d87f993fb6c77e6902f9b8d0d709614e11e83027c65a3f0c37498c54bf4c315151030a43bc0041eb132c4254a141882d5443a0b58aa0fd6bbdd9a45ce845d122258b260bc0220890224c962021445f19b3c29428468018158193a84a01d20c3d5411c3e8a491aff745fc16f7011ba25c4981414a0811f48b153f641da9c26807b41ff7d3faf504672ce22d3104b104c68911225bd09496bf2e38fb69cc5a50a1e0b0d632572b1c9f06afeca75095611f2603142c6618acd2b08f2bee003a16a42f0b72facad6822ac3ae80df826cad18e125b1868b1037a0f63fb038097c891264ea8b9a1cd2a03a928c28b1c48c18304c50fb392c6e044f1c2932e544959d1ad4691477264c814a5c4c20d3e342e4898b0954553c8c774d54bea5c98a2d4c4d5b9aacaac088388785c4052b8a8b8b182b2e5848aaaac4568ecb1421726ae371c1e271b15275152ee0898c9525b3054f6f0a2a32580d8694c2f6aca0ac929598d654989cd554551ad7aca7e46ac68f917cca6189c2e8a805ee8ea0e915e1c202142e47d418095d3926969ab8b4ac9838220b134d48ae9a9c1a256a8c9442b2896ae7c30d563cf9c054c5871bac9ac4ee541227bb2bc2f5b42549992d499e9c5c039052b2cdc822d36932f2de1629262ea52d3f346d91da8111bd8764ada2905c5298e2920292aa328bd1926d0614ad9ca728d0cc80ddebf7da17b747fa138f090a3c19aa783364e15cefdc8fbb073064ac6318fab5cd68f6bbdf317c6c6e4bc9f00b43f0452b4d81df477e31e0fa35fb8f5c794a4af9621f3c23ebdbb272ad2e943c06342efab33c48a073f8852158c1532b55c5b064ca86e0f7281893ebcf2a2f0624b95ac9298c5bda106df883e1bdf7de104e90bfaf217486a980c359feceb428bc65901575f8fbb13db5c6bfdf844815702ae62af87bf03d8741764d16f9b33586dbaafdefa4c55ec0f5c33325ed879586b5e6ad323efba005c1af064352aed80643535aa91cfc2c0d93c9b5bb77acc0b4bd1bdc6c49ffd4f6d5947cfc8601104f86a52f074393125d55ca551755892ea7b52ad7cfde204b739b392b823fff545c4804cb4816af8a0e53d0fa352aeebb2c411544072496aad00aa39e20d45e4dcb8e130c4e491ae1adcfc66ebb9f92f9f6393b71b863b66396fb6f9031899a2d679e6c3963658b99277049f65793538b26fb5b3449aab28c5c79499ee41778390593fc567949c6f05eb092fd4124fe42d20bba3cd61170e5b98026575e923139b5b9f25ab8da65ffe67d1f08822008826008d54f4f38b53da727ac2c299da77dcee3fccd531941f5aca66a9ebdcdcb3ef6f861fffaf2b19ca0724f5456e3bbbef5e23ff8df7f4e53adbc9804874ae0b4b5fb012b1b21f92dfc9691df5251cd91df2a0fc951f617d5f82d0593727e4b6dafa5eb0baad25293d31314dad40ba1fc56fd56cd330d9d0230e472301bb27f932fc57124ea3ff32c5652d949172c8c354b15afbbaaeaaa56a5e9f1c76d1d85462e921a2a75ac89cba9cab2b408a6acaa2d281c4c73fdef0bead7fb292dd7ff270cc60123aeb8d6afb5016383f5abb57ea07581f5abb57ea06dd9f0de7bef052df8e067a63bc85cbf7efd3ec8f5cc82bb9a3b6836ea577b432bb644b15db576b5d9da11632b5aae56ab31f8f971b9b2ab3576b75ab92596411a30bf1467f87c2fd08c80dbba944019640210ee896d063178b617acd5ea9e8202c3ad5637172838d66a754b811293b55add52a0c8c2b024cba011b4c4d0a6bb5bad6e29505a2f2975ccf57918fc5857b656b4f6da7bafad3a1e1467f87c617ffddb6fc308b8cd813e9e2d144122308c7fb1f57dc13c345acb7567d8350466b4b647be62267fc8e046c581e03954bf54b237ba154797c5e0c7e5ca2359ab4eab95dbaca4684970866d2ac97f7df9bbdfa1bd6fef19ba40578cd2f6828157308cff1a650348c74d7604e6a1e1eb9a7d38666d3966d1e2ba95ef08b2fd96cdf5db67c3ffc2effb5769e3fbb23338d6d790967db1e48a999c7ed51528be055ce6cabbc2430476e5cabb22c4952e26dc4843e54f6058aebc2b4e39c53e5c59cae9df2b4a306c31b2c0a31e3db5df3437d3cad3a2268fe0f95619f547dbf2fb23784fd1e6f15a77bf5dc3d711a3b5d65ab7f6de7bdd1bacb5d61e3f40ada6bba5d130aed6bafdeebb77adb5d21a0adceeeee1cbc564ac30babddbbb61b4a3770dae612c282aeac35890d4256f45bf2f68e5fab40d7a4dbed6dda5d81c935359ecc755ab56e3381acd3d7525b7e23b27a51c4915d9df8fb27f0c1cc6eb25a775eabe1ff13092fd95d38aa68d1a0989d2d20e4ef890a13a0a4ca3103a544e3b8bc77162953564ee92fd85269c28a18a0a4264817a608a1fa4a01081eaa205ad69cdca5e03160d50a87a4986a04e2d2c493a2305cb950cb0caece0858817a92c68162059ca48f902c6491568dabd0ea090c2c4113f785598809a20c90e515ec8e26408265c5fd359767d4d79b22b85915d5f8d64d7bb5c56ae64170f2764170f4764d7bb4a1b2e1b0132f9add206e93c30a6306d8c18c0184717175af74fee1d64c8ad6f7d58da68e12c30224b0e1dabe83da1220e9fc4cf65f012207f3a98f0dd6e2e97fbd1cbe5d07b499cf37e705dc1298d2786a9ec53a512dc53571445d12a053fc0aba49c14560f4b154db8d0bc0085d20f25412ca95c9c9c62365b544992ed5f9e20507678d54a1bb79db2c8f677a210a1b58e13143ca722d93e0d3b1171d3394350b922562d5ee041eacb13981414a901848aa62414b620c207740b141a6437f66b0e5164fb33b1c84912951e7440a2052a3b34f5c9b6f26468628509c9892349a86da55c2e47a481faf2b2e58d5439641d0077180bc8698c191844c121bb0f51b6902283943453a0b2bfcfcf0f1c8cc8cecbc1894fe160c4d5377ca39090edc3449d2bbacc88e1809cceb801095b1390261fd43469911d0a54f67ffd60a124bb7f59da709d2d6e00c293fdc9283b807d1b6f161b807eb434d184bb3bd007d5410e1acfb571db4cb67fed874830fd20001ca0e0afa7b2c876361bc1d40e4cd2a821b3c29a221490b14242112a5944aa40015d2d50ae186fcc605ad3ba9f1c7166fb56cc018a57f536c0931af2ab881accd0c87e36a161ec0416182aa81b552c5549e1c61927262bdca0428957430949d02ca16942e38469655cb002c90a243c275629588175c38a9ef7d49c8ab8875e0f5369c07631a7ffe28419b4883bfcb9f2669061a948054c702c57de0c3f2aa8b2e2c51126a37091031e975801e740a580c55c794b9eb2f02b57de92282f6ec060aebc254f7a80ea2108af899a3ccb95c704051ed67c589c4ce518b9f29c2c2177a3511d8d46a32c5471a351ede96fdd1cde1f71865d54b9dfa7e2c6a51815e7a2b2e214b72db9cea5536c721b2da7e392045e64d1c96dadc66db5490b4e35b0265b20d99e35f0a374a94b8d51ee77a9f19b2ba7f3db7d6f6a7a21c1d6fab983ac443821c249bed7afdb6ad10f2762486842489a1f3cc896d6946035050a533a40991fcffc9e68c0ffe4a2b238114aede9af628525f7fb90fba92caea25658d9d5cb4d55460920d9778c725c83790263e5b7317ebbb97fccf25be5d16065c678957b8c1ad1e41ed5e44653d22a1d2ded9a909c5a787201ca6fa9bf90fb3b7524b9bfdd88dcdf9f2ef7f77725f7778826f7772ade906f58d23dc54a2b4529555d8dc9922f168cbf95e5ca894d54b93fcc127361569815668939d148dc8559a25237b5532bf5d277c5a786cf13f963536ed08914a1f2a7f35bfa257d46bb24a5f433fa9a8c189b74b34929549e42b6a75f460e57b4fc6a7bea155ad1f12b50fe78d684c62785cab326e43ddbd3df4e359a6293ede947e237258b139d7c8926362935bd9592c55574a9c9c9a1c4267c42537e81c7083d172a0d7f10f8937dcae5b23d6b3d885aa83440b0a35ee5dbcbe5f23d6b9dd35d6537eb55ce21191d19e934416288132923492cd5323c195ac841cd1115467cb743ea5a272169f14984129b442709587267ca30ba882b0e3c617ce73dc54aa3ffcddae39fb6c0efebd3dcc97c7a1fff1fffb79dff5a83fdd3ff2ac391b0e8b6769bd451b973ff77bdd5ef5cc379f8f7d0e1b77abaff4ff6efdd06aa0eab21d2183f3c86990758507f881fb2e3b2033a709b57ababc3717d26f7c108dd4748b2c7e8a7a51d724ae69ab5f424a7ad735b71d57dba5778f8f7f0d7e1ff817790805a2fd0f2bd08b42ae37eaccae86f20db63db77b8cae86a551bb23d7dc3073f04cf9a3d71f8d7b3de4a228ab8bb8ab1a0285e675cbfd6aae58a97fb4cb14fae0f546bad511fa8becf8fcd328eb59650b0bf8d0a2583ef35dc1279b2fdd09c914b28d8e6ea5d705aa16e35eac9946dd25204072e514b1451c494a223408451a10c0a655cc87a4dc1fd6951ae2fd3028b5da2706a62cd135f5a406530e90284852c16b040f331ecd7b00f64932baf095606c014cc6b32957deeffbdf681ecfbfc7c4e62d3683aaea36343a3f5ce5b9b43d5739b5dfaa062ede83c3669b118ed63af13a3fd4e4b87f66307a451c8b689640bdedabd4bb5c1f8aeab96faa9a37aea7a5296ef1cc936926891aa0c8b94eb1ced6fd3506538d1cc76a2b31465a99744f114d2d1a17d088a707ef6ba9b6ffd0716d74b4b4b4bb1a799f86bbff3396a3b670dfc9daf688e1a8ed88eceeb9c3e68e7fd8aba7efc1bf3f5e3ccac68ebf5363358ccc6c66c34564dfc3eae6453047ac904ca64b1e6e199d56a3731173834992bc7a67c173c5ffb1b99acf6b2e791d5fec645b72c26768ba0b72c068a22f8204f0d175dafc379173e50b9cdbecc6c2fb1861222dbafe0d950e18f3737add4a1e9f97502ae6eab993ca60fa656e79b77fdd0cdbb8876fee6c573c8f52e4e229d77bdcbbc7917a6eb65df126d064d317fb54facf87d6c3fe58ffb635bf0f5fa5c432ffed857607cd9f8b1717c1f3a8ff15774f47b9364321d281cb9f3f7e2bff7e665af1caaab32a96647731c49927c1f3a3f7e45473777c4b28cbd2cf63b66a35ef397f9faf22b801f76faa03dfef2f4c134447bfc3e74fef562083911b6c022df10ac816092d213279ee7a23aa9c9ca1314e846587edfafe774adc36a1d56eb5a17823c7ab16ea1cab8df662f99ed4227c560cf4eeaa41b3587af63d6ecbf7e7c9a59b3b29cc7f91ce3bf3e07f9f8ad590b4f1caf1f7f083ff9c23966f93826ecc614b29f591392c946bf79e1d7d79b9959be6c4e5decfc1ab62756047a9904ecc5643159ebdc4af63b5f81d897a70f171ffb9dd307d3900b1f15bc4cf61595c5ac782aa8b9f8980b87f69edbb9d213ab25abda0b9e1715f5920399c9f331b3f6bdf3b217a2f3b1ff1b9edabf08a580888a6ab55553b66a811d1525d6c23056566d2542eb6f84d0fa1bb594823ff1efbb302b306b126eddbc0ee75ddf592dfb6052a54143cc59551a62b6560ab6532a8d0f878a6b292278e8a82ac37e29057b4e3baa8683e75d7c0e9ea661a8c4ec9695390b1562043000000000a315002020100a864462a1481607a2a8b90714000d72984c78529a0a846110e3300c52c618430002840043460466886803007087959914916f4c304eaa32be37a886752be500271c30e36118938983849276d25b3bc939270c4e838723b99047d2d0f6070fc26576596c3a2ea34818bb36331e9ad219fa321a5fb6e9e9a9d107ea2a36545fa90000f8eea4d5c994a4eda7e3ec7f58e91d04312832e0a5c8b75ba84c78a9addb6445f5a24c45a98083c672e40fbdca5c380c4566716148e8804974cc4d86c26138328b07034207c664160e8690a138182274604446e161989483418840804f3c1c01dcf8de7854c27237ec149104d878c4dd33ffd3c5da87510e2fe323e8dfa7e76b6cbb2879421a6699cfb7259bae5b92ae2ee0c689d17f514e7b68479bb2f50bdea127f6d07138233ad5d709009f259b4cb464d563035ca6a834e76af9c438372119a75fbd9087afe300ff3a66350e64d0edf433e4e1edf858611fbcd4a4049a84836d4cb1b4478486fea1b55f2b8e1e6c325cc66c939476bf6db1368f13bc13a590262c3e233646c629a517da08681d0d341e60059c046c729790ae51f168746df28051bd37d7e8f30316f10103be16f6513826c83ed8fc7f8c836295b3d2b34a7b4d57f412cafdf2f1d8538a74ba64e409cab56e208cfe84c0a23b8170c2f610c1e9fb5edcc3f10498772d8bf270a300f6c224de55876f32519f19aa4aea7ca49e1e2ad6dd03878444dd8fc5b2ae4b2e1beea70eebe8865725f1ebf08054a1ab008628a6df8844438720370076da8304a51c629c7046a4bb1900aa390fab3c56075e6d1686142cdcecf46b2c590859b2a4da57ed3b6935cd0ab384b1c3cf1894b06ed9ea43edee352f681533456669133125c25cce4aade5ad4fc182b5475ab48cc100b828289e05995f6a95922d9b7e1196525b0a06eec83541cd27a6bb1a2c4b79e728cb3999dcb30af5f507dc69195bbf92f16b484156a40e84450044c3e22878770dd5f74e67f3a20bc76639ae2c0214794bea5a64ea51bdb1d620c33a652e86e2e6f5eddeeba0c20cfcb33cd97b5d5480815fd6177bad4b0f19c863f1b0b7756901ae674fbbcb67d8cc3284bf697fbb57f9967edc51a59fb83a3fbd3667b3833a1f2dbdd631040055bf825870bcc7a73708aafa2fe3fb8a91342275025ebedc889aad8311c9752a1066a7cad43a088b202a547cc5328787e43ae8bdd456d7f898e2149a74919f4ef9d7066f7bab295155c7cbec3fbd039439552de765c025326ce76f0ebdf883e4f1a7d89c60b5c0ca05876d3ef510ff2c3dbb0852f7f51ab88b5b5b10f9c19e8bb700bc8c98a5891414472af61ed2151d8551f616d2191d84e15e1fa8e0af970ce9dd4dee245ee2037bbd04b8829f1a9d14c43c95158367a0ecaa163b5b74dd00c70306a7adf0f2daf75eb3c1e33a8d02b4c6f19e240b6269961959003dce86ae3b22020930a88209b2ea7b4cfdb3a9562ca0fc704cec1c03330ad9bb7027a21b234bba5f9d2d437c70370a51425bea8407ce700f01e171937236630854a37b79a0bb2d6235c9e39d61a5c3c4ae1d70b2feacb40afde0c13e88080f7db43e60253b2cda22108b9e705ffaa6159f367ebea522d00f54cc9e0ffca8cdbca163e9a89b99a4b1acc5fc0cfa8aeb657ffefc1f590a46053d67328401781f96ddeb00a3244def213e1da1aff2961833ad57e75102a4c0dd045478005b8f10e3a24a45899bc72183e7f98ecbf1123dac028de77d53770359ca0ebc0bcf8bd691b9b1dfd9f18da21a78c6447194ac55c53b3f938cf9db38d74047219451f23790f547ea7f9d83d24b7aa951820622abd0b18b0cf046c7ad97bbf733348270a8251e020764547606d15bf0ad46893e66974ca384df42170f12b919e4691f53fe638cfd1648f11295aa1f048f13d53b7078819340b3ad812ba07031d5fc3003685007957529bd60b1b9e4855e86a4781ddd3227622ab6785e269c2a9e551df02cec53bb20b3524227ca7a7b4feba372608be9003d878162a1bd7c37bdf771d14255e1728508e837e763dd40d6e0befd065cf690bea315b073914f213fa1221f9234be66cec520c360b2f81ddbe1e864934e9e9a72f6ee81d615f25e5338cd4ada62658224f8f086cbdf7ab408fcabdf407133be4533a204babe652402d9c03593c517a8af258234449f837dbb22d45e80a19fd8f6091b989005449c5418bfffdea234fd4a10a53f135ba23870fdd55587605b68fb68d5b1400e86f633f2d5ff320f99c2f5bb89a8c41d88db06cfcd483e80c8639bdb63bd3d936eefd943af9c0c8f6f0911eacd9c632089f556ea85ca04a96c2312abf6dc360c5ff99f19093dcac7c1a5ca761743fb267c86721fd6dda6d5ee2a97372425aef14cd3eab5ac03c2dff5bfd9c55f35c392143efab69ddad01a26a69e89842472c57fcff7971f67340f99920a83adbc8c4b27dbd32f1edf9637eac693e76d1caca437f72f27ed6c887164baa6287a344f80bb57c2a767c5e4034745ef6feeb7eb19bf35010798a58c7884045d7371cd3cd48ba8b9e1fc6e6f3006e7b6e23a42432752f1b84f8486b47bb5dfa2703961572a69116405116b88dba4733c7d64e116e359f835f5733f9294dc97a7504818029b4270eed5a43da5f7b20ab2eb93a847b5e24747795d4df11544d56f4b23dfe2f0a67d58a3bd91705b4df1018376a86743ecd5eb0c3058afc2c621c7d46815a114f167bed821e09c7a266ed4e0e40e965594c77ffcda5066e3f822bd8927ed83021aff6431bb326e21167ca4d9bf69c17521132e6e9011d0d107f8eadca3fc2ace17f7561743116c0f3a1523863063f0c5d2cda87c6b03b2869433463d5ce063d690efdf0332db92d4dbed4a3704e262e68fbbd38184392de4ac7e8d58d977dc9cb82f78eec716d63f78e5f36b45b88937638808e779e5a0d03b79f2c14b1dd6f55b054a1c5466c0850c63b029927dec01b6a51042371de8fe3243e00ca1b6c9beb6380a09b2f9da62030e746e91ecd7ffc48408d35f59c3b2432ed48a0dd15827278b84b6fa0d3f4b6d1beaaa06051edf3f5aeebd07372105a0142084c9b4fa1da07c850d08a7456f561127f8123edd001ac3072bbd114a51e83e1cac5325ec483e536bca50465abcdc07a554de6a917ad20fe72c16e72dcbac080883b2f152e76260d1e51407be04a92b6d599f80bf29b421d273b1feac21abaec94bf6833c158b603014fc07f40d272656aad6d6c8aae185576ba992c325e8ea9f04e5ec5475c7c7e583125fde13900fae840e94e43f8882d8d2e2f2493f0776fefa58b0f07b572bc98fda66c8fdbff773849826e7efd80e8a63ce0d2084d933083b2d3fce1f77f2f053061a8b99fba410e39b9ebf8dcfc062f143d533298c84b55fbd66bc85bc3d21acb64e08afce4820766b11242bc5e8dd275690b5f49b0522f7286359f114aaf480130ce253169d95e3b5e2ff98fda8c2093da87bb61dad9f377e11ad81fcb6fce97d425bbe68082527cd2f7ea4cedb1685ed4ddc057790c82919c3fa7817729be54d23a0825760753b05fb70d333e8cacab5f682400113fb07037460244f777c4a544cd0eeb87ee3b742b0c46c7705bf24d5445baf827c86b59f029312650400809e1cd42d0ae3409a7eea841404c08d9747c81b0852c5c6fb78a83202333c11a0ff7b456e07410ebb71fd2b35f75d8bba244b82f22a6ed6ec1ba2888a709f4f1ce5f6c38a88a510ed2dd80235c15e5eec61d72bae414844d39a502473e4715dacba732fd97572018150117fa6e9a923aeefdfe0ba4c7015e302bdebc4e7b3cb9fc2d299576ef734c308f4628a7176342882f9e7ea914380dec71bb915e61d1862863d8dddbb181ae92deee589093fa79b25ab55438efd4fd631309c63f553ba8ab43a7efcc283e8e8c5e537e8708efcac24e0cb99fe9c6fbc6f7df6e6375c5d0f29cfd627bc296b80e3c1b9e8baf6d6d406504ddda35caba309bda99d8a64ec4b293a990a5690ddc64991696c4909a2d44d5e91155d05e29bc932059daabd95043d431f66ed1f577f0761f0695471fd5843c7cb75934d275f461b662ffe506da1de4851f221f01706f92203ffc7a6b7d6a05bf4c6b21d2875f002f7e6bd09f4aa17a775128017f706912a2ce1a843e61cd840bea703ddd0c3ec43594cf6840ef58cbde5d6f3d49e93ca65af6a953f225709e65f22bd48300a08c3067162adb4c2c12ca325627a0cf8b383bd9de34ee3318e4ba3374bd9fc1e5831f87d10490c86bbe9202c6368f4a46c04468e6253d77639a797f587d9395c68b4fe6030bcabfb7b8cbd2a5117db1290d94e04e35d3c034b7920e090393de20190ae6909b008dbc5b6c160bf0c144ef2ea655040efa4540ba215a463c7aebcd84d29f1e70090e0864e4d27a034b4eee1d6e9255c7a19e76024b50977a41bd8123b199bce301215a7b60769ce513db51bfacd3c47d1a1fefa2b9f34b2da4cac667c70e4841ebe2eff87e65aaba54b59c9524e681be3b10eec6099791d5901fb8b9a582e637ba76e0770c19628f781e7c48cce1a0dfe53e05c27f55f4dd8f93cb0aa413ddc2e1e378f7526170fce2498c0e5295733aa28b5371867dee19d097a74b747f5123f75c48d58188ec9c6f33c3c643678e061ee3d5c0b658435b9f136b9a03c43043b9c00091de88fc0ff3c4d778daadc026bddc5ecad2ef78a480a04903dd976119b89329f0e1b87495916aa324584d5684065b0d40f502b1f87a2655bc92c2292870068e6d4213d0dcf762bd56b0603daa650f28d976cc5492ead47fed7202b92891e8deeb7ffca143971894af7ab581916188aeb441ed87ff8b74ecc7e99d3ca3f5184382275f4ace912fea94a2dcf4a804694549737ed03daa6b51a059c9804c7689d0c5fd6bdf1200d73027aacc17ba4303c38c3026cd665893618c47db806e47c43787b9cd039cf2a78ff1620e6f5346dbaa246415692bf20069b96fb52ae46c268cf40bf5d430f4889431a380387f040551591985083768c756f4384e6f2dc5b64a35cc0bc3e188a3f598a4b12282412349eb93d01a8728cb6eaa8e7b12ba5ca19627a5f960a115bceea69ca2bc4aedf9fc6186e54ac138c794a027651e216ca7fe5fb7f958046c6aebbb3fda5adbc85207490e7a280e6393f13e2a1731ec20dc12a7d2b6bda1e4cd06e11c2b70a774b6684a11e652243623297887f07178fe6b084015bbf4e258531ccfed78790f73c3b46ae2cd62d1f239d21058d9a23e91e6079b85d037ec628abd18b7c2910fe9397c908bf7c7d80c429094700c25b38a21281ba0abfc5df68a1a2ecb5283027c648bb21851f40645b5f40b9a80dc0a749a04703582cba94885ca18010749026d05fbd00f4de136c5f8859a2f63340eb621ea8d4fb04c8609410d2fa12c0186a9a0cb2d039a2eb2d3f89b630ae161acb15d64ae58ee9d37cc012cdd3bf5a3b05f9fa17a5587824bd071eeac9c58d1da1e1ee971bc5a5eaae4dae7eb8150a0479a5afc1ed219557cda46897d0de55d362cedb11b0de8e93ad94ec11fc85ddccc789116362d58adacd7b08ed945a9b070097d7548c13893e388ef9deb40b3c2247b2b9020e11465bb3c440c2766e6361584a01ed00bb431c2c817f56da1df6c211895c4e8cc3a02f9dc3d4f2d00a4e9241ef3fba87f9ec05870a8c7fec5202ee7463bde9a8a1668e6fc227a3f28e23d197917c960c2d2103260f26b6979b18240d6895e0790b25ff498139c04e81e67790be7df8fa4003e2877d970f6c9959711650c89177c3ca82225df43446a87799d35d52ba3085f367867a8f7cb540aefa35dec17d553563ebb9e5697b0907f481b7131f2ded36773a11d3e296c15c0b8193b59e937777b65c421aef92fe7b5e7bb1f102fe651c7a0a6116b831e3a689c97cb888972f1253df56f3d01b6b00a8ac76ac5ac2cb3cd042fb442d6367b2c6b2cd28e073855a796f9b4e10cee74bc68fd35a1f8f6e918bd68071cf19d7ef9a2d3525fbcb4a8bf0864bd2f647d779d4bcdd8ef0b868324a5cbb014cb5ec8cd8d2ed43ba66d1f0aa888e13be484d3e35fa0102a996e4400870a9852951ce9274cb0e8fcb63e158c1660fbae610e656681c0c8ec4df3b06ed1c053f8680722881f3af89793689226f24f6eaf688d3f5bd44d81eb43ab9a8c0aa3ebd0e28f509744c7580e970de7168e1e190eb4080be8487cd43dba1d542541ea8721bc028a814649bb0fc84100eaa423199302301b4b4d3d2bae725d70b2812f71aa41a3a3640fcabf86446b346b2143a4a93dff40c4091a41952fef8587802a4987d02f608924522d099eb6f11400e1731f22d3f9de77ec359e304e514f9ad32784432a49ec1e429cfe5a2c3f3da487826a73da1548628296d20b9b21b5bd90e462ce12402c0ad04791376bd897b33e94adeb60111bf8920e2c248a17009e0f78e6e17820b5d89ec5f972a8c28e05267c4276b9b9b6acd5aa10c6b5309d05337e003a450f7804e2732b54b0ba4a5dc0826d4b3f95c2c6b3f6b3cf2ab858adca2e5ecca18ff47a0df5a466838e32edabd20c8a3f6354a0edb51acd6fe9be84a29ea079a893ef628200dc8ab397146d849bff07422043498aa9f2ab389d2313f9d5a5488535aaf73118687111f05e767080d77d654a8e754d80a97fdbe2fa381e3dc0773a877145f369ef4114e0a682cef12584682da65f5f3d567cb3070694609d0c40fd91325a7ca1d5b6a41c7b0160c92d601a4fc1732d3c488a545d19f5c0e9433212a8929eb30bb302a636c5451d1c33cd1d40912ff432ab390c447561aa8f44597a965027762dc3660b7a11359e16fa561f980cb83f27ecbde484d8c823f014816417af68faba8b285cf9ce109c0afb47d5e8cff825311de8ab6f8ed36dea1b3d294db9e2e23f9e68a25978e707cb3af7e690000be0df076463e3eceb87ce9847a42dae6d1cefb35fa68e7a925d29141a6ce4f267efef0fd2d1122edd0d47a67c72eca3ada118aa19cfdccc06126de02c8a24197699d5925f6611a5d51b65f1f4a213527b57b6b151156f1066d8f6e586b0a44d69dd46e5da9b735e1f300ed4f6a37dbf5dddbbdd24a3d529b497ea55170689de61c55c915ae057ca900b8caa4adfafc9554702dd20803e9cc5d6d297dc1fcd0e92f536691e9439cd5dc57c202e95de6dcdfc98a53847d272a12b44382633142227f48a74ddf084adc205e4c280741f6890b96fe04a16196b7791ae97ef5b9c5a26aaab29acd70380dedd71874085435d4c203b7dda863b8be18f0477dc203a7a90b7e7a2fac5c18ea585ff898f64458474c348bfcae3fa7dd08c34b9f266c9adb6e42438189eed0fef4f0e1cf863c181152a38ab07eb5ebd2f7fd5bfda3cfc624bb24ab03cd663af601c284f07f8ebdd7e415112dc5615ed4ca731c7c1da954e9fe35ee25edb9844a8baf1a8c644cb9564cd5e7929cf173e34e8278382f48592d2fc46895f578abf7b66aa369ba2d780124e56b84dfc4a4ef43bc00937a4ecef7199813f40886dbad8997e60d1b164eb55f99aacbfc0282661f5eea64bf823911bb062a43ef8e434834b3baeeeaae47b9c836c1eaca79f81a5ee379bb7e4ac04474d6ebefbb039aebee245a3fe4b9e27f70e6e83173597a675514551263b7b80131048e4c79766f9e2a1f7eff6deb60ead692fa90bbb0e4677221565fc7db8dead566c46d04c8967080836985f1c79de1cb730eb0e237951585f9827bc04994e118ff2927a5c57a142976d75f21f93ddb2ef25d1fb388849698d02003ea77cf81a6e8a4cd84e42b2a0ca2bfd477794fd1139f89a2a3213ace1895b751e6ed6143063e0c3e60a11c20c8c0f8ae05f90a76660681a5dafccaaf1e1d15616c38e841cb8306a04588fff53820f14f8d9c61c984faa9ffe0bb36acb544952d2e7a530ee02f77aadd93aa69967f4e0d23150bc6fbd005d8ad7da9441c8069ee4e57bea302b9052ec9b56d2725a2b212a822669cd5dd7b04f5248a644b692e858faac0884408a6000d3f00a0d27183886ebbb82fddd7ba97c8f64314ea7e9d99949e0f64c649fb586c2ba8411ac7065eea110c4d529030f6d7e2bcf9357b6ca09e8d87d3b66309567a6a852bd4db4b2aa275040ab927bb682c6f463d10dca933bab25fbd938c6e0702728a432223f8e42d24e289066372179f56617a01b300b493f44a9d9949e0e4febd024ed854c472af61ef9797f0618a7e58b08810193a7ba51b4f3a6049dedda87871738631e4b1cdd1ad04703db81142f1169904f361a3c4917787673227f8fc8727a3ddb8a82d2926d2e8126e5fbc89a44b1a792257fafa1362e28d2a0b0cf4d9f59ddf75027bbb312e637cc700a4ddb7eeec0ed9c94ab2dbf7b843707a65301c5c1d96a924db0db2091c677eda90ad3ca45c6014714d5edb271b00152a5d79e53386e99cb46baa2372cd91e580f49f5b98cc480c956dbdef471851506f030ba85d0e3afbe8c5005c0b3487ee31f848e565f1464a2468ee5d885ad0f0862a204f8426b6b06aa5461cbf9f4e242f5ffbd708750b63fa2b1a6bd4a3ddaa39da0701bbd7fd75809ffe7605947614f3d6b83eed951500c89cfc6bd8a38c11a0fe79ac5a75faa1734fadd8d416afbf0b452778fef6e6cccc3cc73ed109d3b9a93a705228c1bcaf98f1c9b56018314565e3dcba3b3d7ef13fd55f9f92ea69bb24c06222c978689bca20caa3ecb9175286745c4c96eefe717ccc1c0048d70a366d1e5b7d0601fe78d3fd0a957b8330e092eb57a431965f6ffdd43c3eafd9c441803ff0e1b310c23741eb4897a10021a5e2e34986a8875f369a3077af3191a77276d889f25cd6b3011b2916f10f9f68a7c401591ed3b304b41b55189458479317f5bfcd26b01ca761cbc761cec0ad373551fd976bcb87531b51e727a98fe9695a3ae9cf979caeb5c83edca9256b66b6b748dc7fda0c13582a959018c99829c5c915ec0292471e144488e273f208f1c19c49ed0f88baf51255b9e78a7ebb97443fabac3e83139654258262c0a1623b1251f7127fa95001bc219842a9048087621d1c80a1fdd7c34ac851c696f972d5e997a809dd956b005014e0e845271b8749aa603116e57a71be099f345f22f69d2aecc31034c80b049ec92527b24da14de55559384b631aeb3cc1f24eff42ce444ccc557b76a573a3c801b98e2c48cfae675b2c618c8c71cc11c0b301644a9f4c225128f85939ae93512c4f4133431d29325ad6e6b6d62514cf53239f4c9ab196488159dc48a3113685f68fce392bf60519cf517114a41ef00663258f003fa3f2ce99868c08f366db0aad3bb0c043a9e53dd9bcb92ed3c6e285ca47e3ee9acdb826d6083e5edf8b4febcaca2e38514432b546647548809adf090e36c81f9feff20c86e68fb44e6b75bf258ecca9045a726b05d5cfd7e460fd5e7451e6227da95672381ec8591fbac1e23984886f6e256a8428578ce4092de24f1aee30b66ea24937076efe231865bc6d820ea9816e3677f325454e46feb7b91f2af3f01baf233c6f5967a2cb7f70a03eb60e700a721b277df325087cbdcd41aef80cf146cb2e9eb4b05eedfd68e6c91312fd0ac50e75c5c0532e2b6a11fd329291fc0ca0c8606a49c36c0325555f0f6774ef46891fbb5953aa48964946406f733a227a125d006b38df36ca21e237923527bbbb331a736407eff82e626874cf8ab4d667f36dd879939d1163e7d2fa8fa1ed3d84ecb0990c4d68893a1b19276e48799705928e90cd7297a9e8abc0581be1885bc95d4257d5d28812867b367b6c3233532f9276fb7a76dc3a0244d7414f88ac15891339ebb0c6c34891c205d64fdf9106af9e735ea20550cf493068fac0ce09217bcfe8b6eea6024950d3f3eca7613f47c90024b18d4ecf11e82e3dc497387ebb5e858ce45418e3565286d2c3407cbda2851b4c08e812d05c90d084319b6fdbed72c7fe9833017b40734aef73ccca8d5a5cb1d65dc8a166c1b54fa69046505d3125d3aa5f2d888ded7af12613d9466d397c9ef6a77c91ec9ed7f616bc62d6a7c024f00708e5424967d0486a2d1422b3d4edf25b502ed10e8f899d1d275786993dfd6142fd10f8fc69331c53450cfbf558e4ad049c5a1e16f065ad8884a3b385c183dfbf42133fe08041492282adf586380ff87114bf20e8627ce854f6d7bf5044c52ac37505f1b46649f1cd230360c2dc39813963fdb7104b1ca8c7988b57ed4e813dd2ee52d00b489eb4196a9731c40be3f7cf6d3c1224e836c949ff5c324147c154280e4bd0f4f96142a04558415ff9915c3fc3cee36fbf305d67276faa9154568514d8a169b62a29b1b7b88437cb58c8e939eb53d0b2e8a445e5569befe9fd0889c7ded3f0ab6aade56faba6370700db8e53b1d7e2f86e0e531f0c960c92c1f89fb255f2f4af08ccbb5b6b2e1f1cd30aeeb1415f78f910453fff23b45d4321455978f7e5cd634eba61eeaddc03e98c81d13ddc80e87afbff6497c6bcc8052c11f10a8f13747407d23d8af4c44c6a6914b28cf1b6b172ccc72914d2d2a522919e68516115c2d2130805b5d472cc532b4fba3b1cbad4ba4fa16a41b3b330e49684aa4abd5e70e5ded5b7c006a889a3c333583ca589ede83071689a81c43b60e9e72286772382c824e7e853e50fa079063c1c1deee6a2bc99fc9e09555288bcf10f2c5dc6eb805541096ecfec4d6ffbbedacb44204397e4e5bc88adc1d1519c2e24a353425ddacdab51ad30867174ea32c53e533b6ff7bbfd3dcb91934e32146ca092186f5083fde5840173a25e0e2ca2c052924fbe4ffbfbc4504d5f59ec328cc61191dc370323c0ba18d7773b326986018cd63d3d171744dfef7d5d10dbd2033ee620936fd404965260d913125ae9f0643416051d560b2175024b07a7778bbe2d92377c79dffd86b15af205f535ec6c66b64a59c6266b3bc72d93351425ac938c33a1a1e5f6987310e792d7cb98e1b264a0621809844cf0a34b3741633fdfc12e640a26cd2ffe811a78467a71b7d53ac55649984469c9b94ed56af1ef0d0d3f85c19c51dd8388bb457a45316d9717d47be35469241b020c06829881ab875a0354947bcd4ca5c7d65c2363cca8639c826e557945216663d7a111fc0edc2d17cdda45dc7f2beb2ab607c6c2c4e74505b48ee1015f395a4965342c2ce0c3ecfdcbe43781f5a4d757ced5be7500844315b321d5a3215e876df9a982637582ffaf931eee78154c69e27bf9b79806e7b22bf3a37e1aeac62dc5dc7903746c95dba2c54acc2a95af246174eb904a6db926643077435c8c781833ef9337d4818dba09aa3c2256fcb30af14fea50e162de215b90cd4c965ddc9ddba2235e3c3cc8cea6ccd97db024f2442737d8de5db8fff9d7d8d4bfe8fdb007828c9846f242553bcf6f6cec872b721887429ec14c47e626f42804150f87e6906e07c91392810c1f431307a8ca23c27c9895028da1c87eb5a6080a8a4ba66373d5be23d3b4c1e154aa83ba7f106acaeb38d85b4928c22e06cd23a0f29c61a6a1db21d6d6162fc6eab95c22fd90301571b280379e4b2a72a070103f65e48dfa9366be3308dfa742923d9b119572113dfa1649b01970d6e798fc09aa7c808b50756f7d64ffff4e54fc12f8c8224ae9671ba2eef64aa1b326b6d7cbaf77e96544dd2afb4603014719dab540f6de21eb3a309a21a0d65d6e4ff575aaac09601f5cff78e8e86befd1c1ebc913087b6e66debff96c6ef5441eae90bad08e0de1ad76d124986af0a418f438ef79060bc0932323af468934e44e7a06548c3f312adaf81a32fdc83615e97f66fc43624f4819e0d6fd28d12cb83c8504c22857ff3fe1f7c3a720626bb97f99376d231bff94c5d909848b49579bdb08131b02a785c7fdf0a75be2aa33e90d1792ee09f441242c7672b9114a9c8383d0942253d6a44f092947d578f0d19c878f6ea49ffd3735af3c8b3950c0726d9dc77e91e3aba9ea9679626170e80118c5bce9bd4abf97d3c2156fae403d033bff855bd08e29a2c706015016b381d713948b2625d24493e1c959add568c55afe883de2e1945b0288ec30c393ae0cc127b2d23006610a81c42d86ac58844f6f63e3d63505d48cd7797e23ef653eae6f5ec0e5bb684ef0316c1a034638885a7603281975c548841e1a1581b6ad89be9fc26bdf573dde5ba0cc08eff28bc1e8b358790995729f4a5a9afbb5f1d19402bc290d62078a07f4807d8ec9e9fa57d6e2019fbcff9290ed2bf93835b53b8f24838fc8ca74b85524f032d9434e8dfd1706fb78b360decdd06f1177120e164ef53a0dba9b7270fd57a946d7dae4241d5c39731c391f2e7317834e95bfb33b09077bf29e3ceeebd875b2f39db9388d6ba7cc5cf80dfafef25d9405c26d6b0652298478849712a8013f0ede0e9e121f18512f9c83c9e5ed2f99f9a90cd9e0209f96ffee95a3d3c8861a0bbdd63b09cf989f5f731d8199c9c336d113963ac7b41f8ed8d402ffec52e0fdd91e1e90547711e7261e64b685fd3904c16b9b150e49a8f6cb0b6c7a5c5b6f70bbc51143d470e1f424a5f1c6bd2a22857a355b6a8f9053cc9aec042e9b4ff25998b9c42bb8bcf1b6312d908ffb6a81246a001181d40d4c1ee6404b83c160ce9ea2bc4cdaa83864717189799949072c4b5fa57adb04978957994d2d178d03c06a8e586432554d48e3ce4a7a826a63705330fd1053ef302fdc803c6ea67d0116c6ced29c7709b8b4a2d81d93dedee02b500a7aed8fa39e62a2d0ea39965ebaa5c1f4ab926ca636186f64b7224a44bc79a9848100fe5836092f8fc63a1ea0d67545dfb93411305e7a2278dfc25f5dfbc1a0ade784a1b22900b905c0f6d474e9e05809ea685d0c8c59525f6dbf54720ec01608844c97f886e1625402783685accbb78f88b8ff57a9e44767f525a678bfa75ea1a76375dff73a15dd262c76a8a6009e9782469bf86c23daf2054a8ca099e622d594adffa7e75acff042ace8726b0a1a0a835e247573f81f3843153fc8187fe35ed35ff2cf113544453017c86e77555fc8650d4ff4cb0b93a26c3eb39ae6c3c3665261646946c7522761271a2e1567cf3f365c0ced4207ffd73855d8bf515230044478424b8abdecbe75638ef87f2dca860dc59a8d7e2f02c0b6fd2c4124f9647293d7b03b6aaeccd28b246058cca155dbb3203db091645a2db26ff5c212189d78c9e1d545929d3a7c775d085cc7779fc7ab7dc4cf716239a5ef0323e480c6bbe37a3d748ead73cc0cc50ab15c656d3e0fdc25a6f78a912e91f30c528b69209a4c6f95f604565a7a30334810243d74d1f899969d37ff72bc8ba6f4db05262faf4cca9c155000e9e569f0e59f73bf71a9ff3084682b20e8a9d2b0f59eb3b26da6c406e0200a2e0088b2fa1346d8a4147b66bf1d60fe2fb0daef81c449ec488c9bf45b40756ad873416c12b3a87b5c29038e49270e696d7b6f1fbf6c64beb4efbb0d26a7f198a9446e0849f663962002267bcf65e1566f82ae07849e2d357b3d0aa82c1b895a95be1f127fb1d359bc2b1e6a8b7dc16803ced8b2a8cd37e0d4ad978afac31e20b614dd88c43b65261cae9050a01f1d4deeb82e0084e9da10ff912f118829d0a11bc18da0444967b310f80067b874a3d216e0942a0f2b92fc7eeba891542280e1a00b2b05e9871e346bfd32c50621594067f43480b34253897890f946035c5dec4a59a2f537300858e8478016fa156ba12f1ee40bf6e89bedd89bbb46f44ab54fc1d21d2bb5f6874e282d2677fba2950569618afc73ae0fc10711b7b52c456eabdbc96d3519440b6fd107aea99b490715905a118e4ede515602e9771beb43eee746e0502516cd3183c9d7d470c62b8e3955722af5dbd04428f0bd86fd53807f333629249b87ccf1ac69167933f3e821db7a20dbb0ff50e547855778a2be7868050106bb0f270826880333aa27d2c55d29a45f5cd96edbd003eafcf697ad3d4ee26963ba416526517ee5b75a1159819e34ef70531be3657a19b9c23a46d1ef0d586433a8b7c146346e7d44b8a290c2ce0996ccbb16a2671b1d854d4e3822e8d8b9d148cf74317b11b0610d08c2a52327996881745b5152ec0847508a5eb3cf9869460c7f6540cdbd70403983ad3634103b0b99039c22873a43f387d378022a00d09345695fa95a65e8de22abe71394da2577c3b8d994ad5b18f201e1fc26f71ae593d4ff94ea493f46e7d5abdd220f6f2b0d57de211833f7045b576d6f50f2842f433d0eea0c51f7368276cc5214b711271c3abdf6f81995735b1b814306233550ee6ba6d73a0e044621fc0fc3c49ba67ab5fcd831274ce07ea8a35c61d56937c1dece6a0fce8744e2bd64f6dda44abfbdb6500ff3b9d10117d93ffd47978a658b08b9f7a5669546a34cac6f11981cb87c2652420529b0e94349a7d16323daf6712e77a442cf8e17f9d3d3cb21d5bcc3e41ce8c1f3e36030d85820bc7f24d333911e6484f1bbb1954800c43a9fd4f510ee3668ac54a0f8ef82b83f7218fa184b2f059104d9044916339a381d4936375f458a2b82ef7ea80ad1c359e639c363e5d3778655870e0a227e07e732838c125f58575bfd994a4c38f05140e9267cf4b7dccd7847c2e493ea51684db544a95c12e5706779fa9afb76d586e324b99eec1737b3e76f5ad6fd9371ee1af6a1eb5078e59bebe8919923d94780cc08c71882dc4f8350d00a47872053d98931248189350f41992faca9724efbff627125aa089783cb1e4db35355a8972ccdd6995956891cd1a63581f486a4d72ca5c6bb9566a30f8c98d1afeecb1d5810d811c8f2118dea082633035cdd367b1e72a021d10e0222282343dc727b3000b634ce03674314a2d6195a71ba506f96ed32007bea8d92d08a32f32b4d9dcef5ad671291b703996bd42f752b474dbc22c5eb3047e15e8e071a6a10b078822c364a1301f8bd1d1e32b92f275cb46676005de9eccb223cf832007401755631ed387898c4c91ae99922871ea64b9d58e94385ab0670602da5441c830a50a7145125329dc0938aee9ad1f46aa6af51d5de133ab47328212c6e29684bb7716d91ad2e32a53f45dc459ee909c045b8daa7d4be83429d5bf0791103e01005851141b0deb91897c700c699209a13a9b84ce5b2a9a2eb81fd5ac1051c11c53176ef0fe7db24c2ddb2aa695ca194dc3f43917a0eefe44a4a76553c40e3ba1b85a90bd05ba32b79a8bf431755526da32848ac9bfc526846643c4f2d831a2194e1aa3d0a8ca65fa380f735c5713691e350ce733921cd119db3818e03460785778b589e302c5ce879295d1d4406a32cf14ea3ce89d5a9fbaf4e93a4cad388bea39c00214362c35bf31e4ed365e27a38cd74ef39eb050a6eeb817594bacb3310998ad190dd67942a4d8b67b0d056c34482e7e515d91572891a6c787e6ff2abefb03cbc8f26b0bb5837485dd54ca28c34286e9271498de80e5a57ce25697447905daa11ec2ed816d708e9b5776856d4a49a48c888f1117ca3e6670079a390393da07659a3082ebaf72d0e917595411fc909eb5c17066ee884c7baa79d90c36d6f71fe01ec676ef10d7a04b71550d91002227149e0d2893cf5fcbade91853d702f08f02a93e9d324c9bde7fa07b088cd36ffa8e23d7946b41493624a41e91f34a921c33c597001e74266c61c449d7ec23ff242f9e2d0b9fb20a8e92f4421c8afaaa2376cf33b853185e0ec172df56f7ad728406821fac5bf09a2392407f4606bba1157dc8016658cf5a8ef3ec0362adca6a4de559e41563fbbf5acd92601c143f26c7b1a5de15b02788f67e720dda5e009c6ea46827d0845eaf36759790ee68577d8b0a2ce99103d4fcfa630136f79de6144b5655c0605f53542d7752d225571a50d6e9dddde4fa7b68054041c1853cccc18fdc34431e219d7396d23df84d2f4027b43e63221ee5d782947a56a7cdb900907f2944b335b4366072fa340d1fd6b59e0b404e1bff66409283dd412424d444270ab2b1080a5db69f573b19e5187aa44eb38b3b6eac0afcd5596e7c2ae67da6bc7463d49306c0b3cfcf2d4992be77ccd55942dbb6dc8b53d9a25e641aafcabcba0b029c3b42ec573d7374aead140b0b8b753074b8a75997fc9a3a6b9318b93cb18691dc3daf637930add74422e34fa0469033f50023d70029d04465abd9ee8514a8ff7ae35b8a247b2d6ef0aba98fe0604ca9543060c22d7b9d29d784274cd8bfb2f8b7a479d5efb445d3a907bd375093caab2caef9b757de7acc47b6509efeb38d2cb9a23baa9618403757ab1add09402abf4be58b777c63aeb8d08ad049a88a2d458cabbc73a9d5e80fe05ea3e251f6bbe6358f43d6095ef0bebfe7b1c946aba6f65e57dba7e1f3f41cdcc5d2f58e462f5d31f9c0283dfd2ca4c319de777c4b966ee1b5bb60c79b434e161b5440189aad936acaafe399956ab77160dd214220c263c4c3882fb9b8f06125e6bd3fec4d1d58ef1c834415088f2a7dfa863d9c6485c612daf4a2607a4619ba10b66a29c4bd427d1a2e7be2b7dc40b88d366ad02aeb183bea6123a836131eb1d41c959016b866d3ea7438ee3720eae89fbb48f97726cac690b932f7655b4ace2cb6b24492045cfb3f73fe98e7ae235f287b19a6dddfd844d653f81dd7e6b1459c4a45c185d576ad48fae80e3fdbcdc0ef2b3a3eb8ac0ace9bc6055e2190058a6b550820180ec4432b2ecde842239769302762d919f528c566f12558147c192c87149710f4a35d74483f59420383737b6d0a2438fc114cb051158c83771e798ca697cb619a6e82a52b3656ec19dc1377dd54de6b0e471e1c4ff8ed2e2ad25e1ade5757675f1ff5998b402b1ba81f2d76098d00da6bcb9e73810e1cf372093c8f292ad0a8c8ff93179b5c05177b8b20bb77d49e9f76a399cec173d908358cbbbd5fc4fe10d203bb6df7891b79c2ff9f6d90d1e9b4039d14d68c513427c963e81c0a42e735dcc6b6efdc2f8791a32828af76bb42eb4269e52e59b374d6423502766d45757398a1ced52672e3e9ba68ac0c2f1492a4fbb1dfb7c201ce97043be5ea87999bdb45f10925d7cea12bf479752e21af4e0cbe82c83bb39dc070b98d86d31752622a7dee642796644d0e67c43bc186bffa14b8a84a4303f7e9499eb62628d5652b7d07287b8cfecdd3b2eb40ef72f00dca4f613ae5942ff2da99cd05ccc8295994e974b80d30b0043dd78676c747e891dbf65e81c7bee7e800b5c1fdaf92461baa15fd0703f071fc495c6e8b209d8720fc3905806a0f28649f5249cd3f8e69faa89c804df7824820f6c30131772f8d67b835062b11b1a69adc7d62bed77c04e8f740b84d55c0088a84dd3d250ce1eecf58043a9af37f95f92284f515e91e16ff9d9f1b24dc2a1a79e7231fd5465a2100251acbf99e8d2a8a9f0f5174601154b1e37d18f9f7b027adc06babfb06f7fc6ecbefc29f365d97547ceb116034396560b36dbb92f2eef8d99046da00510b44911da8c1e5d9e551c5b605bf714cf4ccf91f84956377960464e23f34aa9f187af7746d40b49ad807c202173819419847faa0b6a1264e523f5c6e16fc7b846bdebca0c9bdea395493558a6953d37066169e260ab39666f2a70192ae41f868a64bf1bc4f1e7e5e519dd7569089ab333fd0d1da5acf4af17108341532e50efc87ea7fe6544d3e64f76dd571a3d60b25d15fc7c224fe630b3479a6c05b622c65984361c9b52496fd667b30da009c63552f5b29803d38af1448aaa9c90a6b04ba49183c4e6cd2abe52e1d85dc3751afcde3d22d40e16ac46ac3938e2e8210cea7ebbe656591ee1512ae94ce220f10ddf350b1e0a4b1c4580c3b286e30136858069ff8839bc05e020e7f6b24e38cb24ff6cf44b1fb911f118bd79c07b903d8ec680f7af88cf4512d9aa4be999d60bc0e6ce3ba8288efbc64301ec15a663254adcd2582aa6e5a999550813d6d766324840c5279cbd6726691dd9e27a16c2594f78dfb50a675fcc0da3abe5490540aabc0a9014c06e3fd2c0a901198c2e38970973d5f947a326b252a1fb2f9cdc8f702dc4a1352b1c34afa7f217017a97570aafc16b5d8cf359bd81645e180667d75004eaec81b4fc7213b5fed136b23230854632b7e57a5f4aeee0e2e2fdbc4719a51b5da38fac646ea91b43fcb68afdf63f4099107bf826f9c2af160016e427ff5e1708475307b7fa767738160332419246cba8e8d6ef29f7dbc45bbfcc6f5f561049bd287d64c9a33aee797b2e6334436d02d0a3ef0462d075385f59fb8e1016c5826a0d61165193f448f5cf38a9a9a79db118e5504549964213f1bc870308abe6db12acd9eb0ec661121266480a0e1cb895848eb96d9e670884a4edb81b6d2369df1d2b6d44c684b1a0a1948e1e2ca1eefd481c986d79f9708b037940247a881c9641722e0d544f8e26fdc554d0ab06852d11d98919cbc7394ca5ba63ca5c63cfb0b52625ee54a4cbf0bb3764911f857cbec095f5da21b891fa64fa8905d3b23acfb9b1727d6fe642bd9f17132cd075df5fb18cfff89c4be8842564c5a4fd667454ab77eb3e4fb19332d075973587a20ad9f633a3075c866d9adbd07a416039a2e5721423aa0acd290ad34b273bcabd551a3973431c46afa1114a0cc3620b22a0f25de15d6518fd31b0e6c904cc2fe3e856c5a74ba532b800ba0b7f9e02516dc1f6ec039572e5b326005e57c7f5d25b092fef53208504d65ce0136f76eddd2c85d440b5916e256a3fe26c48fa6d82b73e06af8003d17db91e9c6d4262c627fba7eba92ac935625b0bd9826b558d1d82d4b8c78430b4de223d2e839b533d03d5a67624b48f1367a99090b286ba2ab1b774631998b0d1fb2a2402547a36342d7d2c2ef4af69f85be2f57882ec4f03bf84e632f7152de272fac5ee6884405f48fce3580518d56baa9023c4444787457a548e8e8c036b86db5489f5a50513e4d783e813700f466bce6e8989920ff42eb36d467719e94882acebbd6beed302a0c7fd5a9b871bbeabe68ea5d0f15e494c1ee89b09e3a0236a48d213c8011698d02b46fde92cd49b4005e5df438c103e3aaadcadbd6d5ab4be6faeee010b7df58f333dd249921604b5df0158bf3e735d27b2adad6a2040ee59e3fb16e6f07449ae9192dfa21dcababbd2db91085b44d8fe1b0da2961da7045d7a3da205bdf31639257f7b816c36d2c600617e33d6f58ea2dee480bd12651c5a8d5d4ff470a4cbe05b129efe1d14cf7ff6e4406bcfffaea8ff8b47e225e3c9d5cfce939ce9ef548eb3e38cf032c0057e70c1ba240622cf529f37a63dd10734893816e8c223f818e23932a559c05408250b5fdefdfdbf761bf702884feca3cc6c074d44734aa21bce892fe5dae1153efb6982fc0a54c508dbb3a49ce94766f3423519c2f7aadcd70549278e00b0beb7e5c6cef1816cf2ad4c38b184bba0c52ad8e15ef3b1d3810602ffd0cb95a650a0ccd0b7ae4646962f56b1671e1becaa97e53e80a88400165add2071adfb26d20dbc6467da9580d12f27011bb19e9358b7df5833a4ea5e26352235b82bc2bd1cc405b70960a45d0de357ca5a62d54fe75db14f08feb3289a3c67146411af0c91b21897775a5029f0b6224dc6bfb9b035d23678a4d3287e5f94b13682485529e3516389acaacbc45f5211de4b759d2a1a2896478f579a226da381cdf6a00a63d5a558e58ea23f8c63b0bb69911705b684e049eef6e1afc645105b71eaa007eb6667eaeaa8a3b9173ae20c11b3918595d783b4dd1ed6feb2814012537b03365438fc38a4ced1989809e3ac07c1d8802c149e7e95bdf63b95adcb3c4f954c5e26e4b03b3dd6aaf03c602881185b0fcd74857c1f0bb06cf041ad2e92db465facf2b9c58d82c66579cca6e857001336f87203f9bef0cec45d3ab8867cadfe87aee7f0725e6d01dd3ae4097a6af2bb128e0d0c7e99fce0a2a193dd00eec9022b2f7d37af5d71d9b5e959b1bd91bd7c1ae167a0e2119d2ec47cfa95172410a6c7fc23f3ec0129615719d8d1a61f826b0b3b82339f2f56bbb650b181d45fa9c74c40389a7feb159d241b2947abc05c96bd1cc5b1603799e15588044f4687050f4f04cbabe3dd553126c9572f269fe2a4fb34ca6ea7b49fe23bf2ea4cf5e36347bea54ef9de563768b07efb7de00ceec68e182216afc9717d53ac046bffe5398d6f5120d66fa3ae13ee99d4dcd77a6d77a50af216bd41867e501510a1f5ef36db99d4a3b5524c8990da29865ee6c86094f378d4a0f5e29d9aa684da005cfc17be79db7a1ac1a2ebd2d271dadb91738f668ef67b3fbef34a2ce511563342aeae5bf895ba3e50175b7b73bd276e1e3a2e175d605cea2a099e5c6f8228e9db8ebdb385250006d14026e0432c2bd4a54ec2e685f76d83a5e397bbcea1c038d084881f096bf2cc1c845cb16993b897d49d7624339ca9695c79ff507045bb568408081714ac97354dd0335c590c6ffc27399285f9d12c5ccc68e1c4998ad3cf2d637af69b4fe220a8d6be3342c03dd4cf78069f5f15858878a98ea44df5ac5a8d049e17316dfb6e0563166c1117995f574f762c88b32e2456f23b2f2b93dc951576aa118429cfd8d5fd8642503db1e5a5963c7a04ed6c7693bad58df2712f6485eea8771eca35307ca78ce7c159b3548e970de8e87aac710ea75ebcd7b59c8f0062e1be1b67369e94ae665450ee45f2f8233932455789f4a8b8f33997cee8a40219377d044d9d41be99e05b8f80d75e1f1b0a1219e6ee881ffd2cedd7e7339eb754082281e25d10e897295adc195269e84a39616002475a88e4e8714f94fe816d318c96ca28239023067900d8480feee49a9ac085b3341e047cd2dd0326038d6ff2bec36e02e7eb89699bc80dc30229010835934e777d6d84a3f2712d5b17fcda67d490216c909198dff81e94864ad856e81f30514fd9037c0dc05ff2ba1d2f88ca460aa0a250e815fde4c02749f8898ae51083346883a86a2b0ffcb05af014b222757ebbd6918080e8ba8b3f8bee89606ba0915b07d09e503641d00d7ce3d7d27a2262bdc53b15b5640252ddd9b006cf47e288238ce5f537b5626f9c55767834196369b0d74dba57e66782755113de7afb43803f14e9b2fcfc42aefe650eb254c4af9c90555dd882ddc8978b49684f345a068169611f28bbf9d05feb8a72c8197f4513f971d33dbb18cc6c34b7393e7421333730d8224e1afb52cc3050b9b8b833eb705282ae7b047d5b35a13c4d66719f4b4857fd67ea608fd61831c2abfef6f945042ec0dcde450f20597c80fea7af050f8dd87f56e539e55e47659e75b55754a1a3b84d8a5b77aa99b9eea0df6aa5ff107b6d122c3b627405153aaa895f41e724a9adcb42da69845fd73c8ca23753de25cb2417f82b799a011af00ba8255ec7239d020e814dde9e7217c19cfed96c895e7ea034c3c5573b5362b421eab987fc78ca634378ea97f2ebd7e09879e725c0a8466878c96c87f78853dc11cb19deafd769a237e4ac421d3c190649645e8359d79cf6a9f28a855023e72189918a40a1d7e9a12a91e450331bda18e4fc1fab647721cd88de33e3e354351aa01fb4e498d023d7c88afbc11761e31eb979ac19e69afa73697c27b7ed7062e56d1e6a147596c22823b7349e00b43773b97b381856b3c9bd3099412bfb0f738a9f1041aa5b93230f3a3c63e13db3b1050de58580e8a2abf30af4b89d53fcc5b133df7340c16e132b0e7ffeab6327582923de154c681c711661caa44b0b5bf2ea0ab7af213f9ed19e8ea588514696af843053a41855dd2c0e73f081c5cd076c4921a34080fadda24e62332eb49ceca183f24675b84720b220d189a9e5046d10e4f950cf9c488606937c9e526e75c016b2c40d8be0efe9992212d3353c67d9298199f4ceebb6436d99cf398ea7f9dd2c4884a1040b041652645416394bee4f849862071e98b798ae883ac91e358041766616b766858ca230129b1644bdca2559dc5cf17c833e69c419bc09af734ac896373051a3800ca3f3cbe51792445811050991f97791d9ab738a72fb73aed6c57470b0664a7ce1491c7c3d32bc5dbe80096c7ea402073be4ab968366f84dcccead2084f5c04f89ddb91ad8a66ae0a32dc8a5ba7491baa8cba3abd95286ac0c7535a6a9dd57b6e3e58b781791021da48cc8d622954dbdb75013b8a2c3445a520758e87088e85bd63df2fa90c25b59a716e3a36557895aeede3b76c3ad10da03eea911848d530e92c17a370ee1ed0cb14c90082523dc8fc8bd61674ae081d8d1f4bf01bbec24ebae1207f2dfb37facb5ce5fad1e6b49fdb98e87e55a1e1f6badc29eb4951dcd3a617ac0f13a940d10574e090e8b573157700991814356329b45d6da12c9c2ead8934f10dff336f47f885c7092680f215a6aba35fa8db6f9ada226e230dec2cb117d5575c7284d339d1701db90d7ef284d41a9422feaa7ad2d7fd765d3d594ec772bdf23a220b9cdba043686984b46ed1ad1858681ec69d209440206409acadcabbab74693aa9b20bd99d61f65904da72a062f1f2fe6863f3bccc9504cca9ea9785901882d57c4c289bd04cd052673112d66877743f51d043f4badcd09da44e53f5df8900b0123b3851b7c9a9de4af3786d5408a115332365756b6fcbb68f97fa1d0966978cdf40a23db36a88cef49d07621259b181591ac51017db73316aa55e46631b85290ff4a56e5e5979a8891ff1d78d3202e7b0ce0a69e0d69887e367431d26f82bd9f8695853afdb2931c3f005da0daea24ed9fa71f6e19f19ca294c839a7372765d13a850b3e8ce89ed82991e4dd599ea34f4e97bc79aebebfc78dfaa0ae2c604c33a0718948446d8e19e4bbbf4191efab3fedc3f2c1009d0fc630353a1aec1c8a62d4974364b1c3c34a0c0875106a1abd1b03c7231f9b2b92b5df09a410c716cec01602ba41aeeed43480d6348e53b9a5b1a534301259e52bd97cecb86d53921f768b904b9039c02ad381cc01a822e3c09187f291151934b124849799df3378a2fa7ec99b7046e9269a8da14c8442eec48294f4f6bc19ecd69a084de23045323f0870eb56c2bb174c0247ae073f68c7c66703b4f65b5776bcdc80d5a1e4afe5bc3143f50e5ece13785e32ee3017cd164c97f88678b30cee1e55421762363a16f13f1b5d8291d6b9d297eba516262ce54f296fba6981ca342caa998003b3eec261e59f6b07d95d6c8760df5ba5a69c40cbaa2d6a34202025c541f17327a914b70f63f58956eda58f2a4ce33f8a58e593e00beb8a90b5b5267f1320030b582474d7fea246ff572fa433105cc9293d93be0d4e0b40dfbda333e9293ba27cb544dd2e103dc0cf2c604b339b05cc21cf61a9ccd11bb9b54c080ce1df0981311a738078b145986a806d84015b9e3060749b33e06a83f22014431facb5b46e63aa62062e8d2f881ab0d3425203e6166c81ea262814d82dfad08169f1ef969025747e0a6275665fdd4765f165f038adb43b6a414dedb4f8fd9d89eed9c741734c50a65248b5366ecaaf06f022c67954686a6a5d5ca4cba41ec5781092f92f6ec8cc395ba604e7ec085eb7f35f4604e8a90e0c450ff2578d97989d65fcc0b1a1ce00de0f4cfab0f1d82294ffb5a5f2bf48e8ec6d23434134ccbf992d4118e106e44f7d2728b14eb60b10b399847935bb81b341f340b52a7652c70792deec1c5b87603dfacb9ea64e46801d192e05f277e9343d31773f76d501fdbbd813142e624bcc28e2680d709662f34aa3a31a7313ed495c8029c21595bb72d24ec8d1ceeb33d322786f08b0515173388a9495bf207e68e5af839551e81ff2986040e3029c70c3781e4294502e036fd4c5997429db23dde0ea305c4fab86fd2d0b3e01984d165f78b4ef9010e4216e76222ecd86561ee2deb2fd037f30f0f9fe6c29b1008d189014e31650cec4f9856d19ef7c937598cc8aeb83959eb5991bb613488908709543306e3a9443bb68697dc9d5d097af2f0ff493a2b3acaf380c4e69770c6a848a8a714755e5b7438a108febbdb662a1249455c06efb964b4323126ea1d74a2b820dbf4661337583005c610807322f6c5d10a9a19643a9ed348aae15bb51ad958acd98bcdcdc32e57da4542f1934b78be1be3ccf8630c9c5df9096a4e9d292b7e4341027d34fcbc470261568057585aba24eba94679a7babc902e69e8f98f42eec783f003b46028b3c35a8556fe318936aa3f5a208d20eed6440898f19228447f1b7c6d9192bef32f7f6a9897a8b46fff88be6cf0989bd4f5db95046f903cc7aef1ba1ade7d6c8303d1ee884477c726e925b4a100b7b3429a30bcdcd3e67e5f6f984e0024c5a4ae0ce58b446e6c2ef7674f6846de0824a2ecb07fae6b3e46286762312c6160e0a43c19d40bdeb5476d4ef04cc0524a06c299aa9aa96921ad0eb424b539b906d9faccd5efe85308ef32c89ebcd80b61dd2a4517050db6ebe17fa1f055ef758629b843588982af59007d5e5d698d23b3d3a3a00693fbf7b526c7f2ca1af815e8382d7d3f7a3d91f1e6a59657117fcc5e3eafbedaa27d5fe711f7b8241af550706de38f67701e6fb8f3be0ba5a40a3db61ae5538ad68dfdbc014f0f8b422b7683c2839abe27c9e6c60136bdaef46f19b0f0e4b4c5e932492b64e9236c8c9e94743a5e56d55c501f2694f8bb81f67cbe80762daeb640bf48207a0969e3f5e08a30feac3585ce95be82d90dd71e1d1e3adf8c53d7b5b24047b0e0ac22c83cc6e36431eac15ab8352affd2823ed001405d02590cda39e11d83a65a4850ecbba8c838948c5e4849fd00c476aa7f8e7216eea964016473c9f45a8d0f3147314a6b480a4843c7ffaa197d0d21bae0e48f8c5ce4496a15ccd3c18480da13a1be693d622ad0191ed2ef44ded3d3cc628591dc0017abaa6fa5e4cd488837e2fc147f77ebf7b7d044c5cff11fc0193baf7930a3769c326eee3c4d2c0255db9e8600ef711c858cfc7dda783e08df3e0e54ee94e2ecdd42be7bbf4cfe05702cd69aaf5ee181153c955713821bbbea11d38c7cc0a3c444029257793742aeb9c61dcef2a62ba68b6bfb896b8200f16e69259ef96010cf4bbc645ff5baad6ca926a7044ec7c7f101010ec842b4312e13a27800fd619a8f37188430fcf58f99b251ada9b2abec221f3ed47d19d0378c104600e0ce0c347cc88820423f3c64c26a64c8e4fc088fb51967e137df65fa7d2740bb60592f9a0fe2a1114debeb51e2084f6d2494d77dfc2978fe4761f7faf5d4f37ec1ad0417ef49d04c25ca94119ef15b83807d22f6062bd9e9fa1eb2f71c5ac1784d21a50bfa17d9c99ec2a5289b61f220aa682b3566d4b962d6da7c3add95ff8157d92c74e0cd26103723c398c9817660b0071d3c917828d5fa616891993d04b498738f0dfb675c940e0fcf27681419d27307fcfed7c809dbf9378fd09a8ae47f201b3c9663c03a71fd174017c9f5a4e6df9cc9cba2632e0018339560ae8cf3fa7277eb1c10c776ccffe0be04eeae4b0f53a83cc1ef6c75c3b86d413366f64bd8e5895c53044c9084561e5d3c6bbab797d64baec0127bf7d617a98362ca59d98bbc901606869e24e42db2b2d1d68c97d6620dd59d6c50bac2bc8ad529a910a452a80b3bcc03b1441070d518eb1e3c44e3de07283135bbe0aa3a69f18364ad8873a24a22c85a2110da3ce518fe222ad803e97633bac26884247bce99dab4d45b0450cd1b054821ed55040ccabddc5061001070b94ce6a73bc6a76f1a465def94b44ae2f10c9870c54fd3f6e721cc26cb7170253fbb8dab8a277599594256862b4c2bfbacf096dafb0e6bd4c8b9cbb676e91c4f026d7e43f2d89cd9ddea1c7c68f29254e8224a1a757dcd924f5466694309a2ea63ba2ae43a5690bf967d307950c63b4808f67d64ea21685ff3b701a7548a38e45e6c92217a70228e87fa0508f3142d7b9fcd6298257a233b6b9be7cc3241ae5e4f99f8410183555947aa9db2aaba044257f1ad243894372cb30a19e66dbc59ba7397c51a47bdb961e4d8cde0cda1d507f93533f097948aee6e7bab656e07ceba11ee02694f49cc016b20ec34a85f7418878e9332b69de2ec9a86398a09e85a34b55a81fa7698d7089de43746b8cf70b14dfc48f27a8e46727a25129fa962d01cc0105c52d2dd1b7897b1035b8c10600cef1f337aa1c2b7a44ffb3a30bc492800d96c501b6641e568686c1e0455f7f74de5e8e69c07b36e94aadac726cab93141513a91c9bd1f70fdb9ac94d5d5a58c0a69be4d8ea8147ccfa25734e724bd50d9e2c04a8f72ff42ec3a30fe0ab54516ed58f04c278604d9eab06d4fd432b6ca11bb850eaa3eda4ddadc9124c4bb3ae858582ffda34dbe8680a957d965acdaf05cf66f1a0a5a7b7f2bbba7f799b56b12dcb3d1981adfc679b652c4af85eef479eb89745240de458defeb0be76c27638c185d578040d82467dff6e5b9d0eea7b0b4b96937954e40fed160e149bb0aa14684f1e581633a9fef9b97793b5927910467b98938a829385a1ab1a18dd7aa482afbf6f900b63227216f75632b47188df39225e2afb058b7ee2fa85a57657f9bd3d2a42b0cd66c837220dfe5cb5d1b67f26cfe692d866bb7b292ee650e45610ae287c125e6aa610e876719cb83036bae405e25a632881e879c9e9ec23ea72d8ce0549505a8d18c559ad85eba3852adf7ea908abc1f927001fc49916c2c23ba651e350cc1e0c3d40ef17796fc59dd388712937a09f6aee060acfb5d3f52000a2f4433895a9a60e4899f674690c1646b8c7da3f54a80188033e65eb4ab6e78ca932feb3a242a7c2fa64e50150da7353611f4cc9922472ecc50722996558b19af1e45c3a8ddaef85b3ff4a63d13fbdc3995e936c0f648cbe30b31141aaa9718a0940026897ba0f408d57af8df88205993151ae411480e167917b23fdf643cbfe61d8091f4bc469faf9abd47cdfcbf379a659b45a00977b9d90d3e9877d83eea1a92d7d4b58102f5b0e2aec0693223e97d9713ddeb3760a83d9dffc44579a1e5730e904d9e101b3d08fd5bac1d8c7ac24e812ba5aab5e9e38a67d0133aec8b4813a8c8b2c69721ceb05a928fbb9450274e3ff5cd2639a77e7047c2311e043bc3b8fb69605c585183283a310d04777f9e1ad99a12ed62baa7dd0026e9474dbbcd80c6820240c6d4e712cee2323991f14a033fc68f6ba63334daccffb3b08a628c9fa887f8c4c6203d6ce2f4e80052bd7c07fe31e3896dd113cc7352ddc0a10518776130c984648b61d0081dd26f9ac8b21512af4f0556f42f37a9954e8da8f86ba330da21d7dce6cc22dec07ee54cf89e7dbf647994c0eb22a021d3965e14522ae13a525c5679896ac1c47525f3d4fd6a8be4a5a4aba804045fec0696d8a63102937e6452dbf5a4618fae383b17f52e1a22e9e32730d37779820afa68be87edd145a32200e2f87a50666d6028957e891242a298fd0f47efbe7750d71a58fb6f9413c36fc9caffec4c7b47e6ecc32bf08775b4a589d90106f8b908a728a2613d9ed4b2b42921d994dc676643eb9299138d8e9d614feb48cbbc53437644ebf9f45633ee0f6d320b31926ace2104204b7308f5ab23fb4c83f8ed9edbd116693aa1f5c08aefe859ac5cdfab408269d45af8016313e907c44258f5144277593a50f257c5fd5612842e4ba9e9eeff1dc930edfb232a0b5fc11fb4d9a603e024e28b0b59081b668b3143b5c48e5ca93f356cc5d67cc7dcb500557bac008150405126e6b4ee2cb7c3c58dd7597f73016274318a84966f4df793176daf3e53d7da284cdb0c8f089375798fbde2afaa3957971c0e0c7d43f61d6ac593c416d39f15388350e0f6415799bdf476d013d11533f933e32a49c15df5102006b778182cffde457c402a3f847a25fe5c38ab26fc6ee77a5d56c8987f738179e070763c98ec821012cdd06f047ea5e81b646e4b7803e83727033521a065fe81833bd0e3c0fa2186b5213e7e63c016721781ce3500460520fbab387b0dc20172209a45b97c9e401644e8355d2c9583a18b202f12d48adc191ce25bb766ae736ff987af0274138279626e80606b186ae5964737499977af2b0152ca340ae4f442e62d4a8767bd541e770e948496ee2dc55e3833d2d509d247afc8481f2f5a179ce1cdd2f1392a6cc487c707c53cf00758380b79428be296a4481f67b1333902f6127c0909f17dcbb215e62cd38a8831ae58b92227a5b084b697f2ca3d799562c898862464086434beb882ac35ccc391ce3cddf3f17455e88afccd4a5edb79484aff661511e6a22cd6621d1aaca13c3c3fa3001bd31d98fc0de9e930fca1fa44f02c928fbb06bfc9083473179d45a5f4dd35aea2cf7c7341f4da0865319254fec39964564f718fa97e771cc30476ba7ce3dcef040965dc7d280c0144938e77bb474c7d0501b2159ee10b44038a413d13e838bea5b1e2ca9788d431c0f305ed2598e320684b5223cc9f021a17da1bfdbc0625d1ba37e58e805d03f7316480a895fb1362f9c4bed124d0d8450ca51f40ba99799f8faf59ced4b4d596e3e1f9c9f24d8427b5ae8d78b3011f170c294e4e896d4e4258653f2ccbaaef606f1d9d9fc87ee555ad80b0d795b919519a4b045d3ac7cf6d7820d285720818cb699afc3a590a77129a6cb7105ee53c138c3e9a4ade124577be895b09d9005939c36f2756b34675135e2b031738e141cc99a26b11fa73650a11d9812bbc39328f8a50e7bacf299db11c8db4daafe9ecabcddec66202575e84a28a5afd310ce37da927e92aca7d710ecd023c241df14c5fdb9f81b2b0f288e01cf14579fa9402e33617c5ad2a7f4e4bc4828c213d95356de234c5368932b2089cb32fa43a1b0e5f9eff0fa9900370cae9c34e171690712e36b6cf791cd97a90326b0463da25d15414a29921b190bcd4ba4bc3063a1163c997464bbd057f78f6be1e8a39070fc427324bae665d73cf42ea14a706dce1e7dbe66493e9cbd1db5569e49f92386605122fd7014425cd1f6e8474a28f78aa712426945a0d2a2567eec484ff1c9910695b0ed5218af54f18d556ae664226f266a0faf7fa83d72a3947c563fed3f19f7c01dc836540c014fc4d9a2741f688e4576351af543e6a51b46a048a4ede2f764d14dfe9176ca33f3016a43d08d7fc4d65514d7c5d0e223f6ae2b0a37966b746d915b1edcffe0f7c6f801bd5166b3eb36f7b72533d566ce086ec7338e6981e01a0a94618ce15868ef0490abdc36cfd8a0164b141c3637549ddb7a9f5be1affed78439b6ab4ad0e41b2b9bca9345102179513a1be156c37c43381cdd04772c89d46ad80d130e5ba484dd733a29c8b7903ee0a0a38b0dcccf22b29b7fedec66156422620813900794c85b65ae7161e2989bae854ced8e0a40dfc3e02394daeb778e775ac567f872cf271ac4d85ef5c27686861d22aea22587f9aa36a490091dc5440b82933962057c5a290fcb1c13bc6d5353eeefbfc64ed86c72022014b1f7a3c6d1572ac6d11cd4aa30867ad322c13b122281298215f2e12ec3b52b0472ba6aab6fda5f4f985713990b9b17ede1ef71e2771107eea9a52da4b68d401c04136024d8aaaace48943cdbc64ff2a91a4b4d4df415bb9cefa041f917ecfb8e508fc81130b158cecf4bc8cb0361a6e61bf3c5a8a89b9026cb4b590987a2cbfc40951f487f304a2d0505889246a18eb99654ac2f959446a18b472113801ad11f9e4433b71c523f878e1091c060b934202c351021bcea6b96dc29fc82cde61165081eab5da48047b73d9f6366f8c54f3b901913b7cb0bdb983354c2bfd5f08b4f0d46758fc11ed0169114812bea494e0924deef52c6b8f6e3507f57cd4b7f665c68d7b1cc7b92eb5ad358a5908672f4602f33bb5695d6ba0cb927ed0fb619edc7cc2e753474469eb7faee7a530f523701c410cea9bbaad1a698e859adfe6202d0f4df72f3ddf23ffbe13931cce9d0ff857bc64b04aee30c5798eb74dd71683cabfff8b0928294da665fe7b3f55dae55e6b6ced6f74597a4ce1cbfea47b0c41e6675d8c76dbbf4ac9e2bcbbc44cdc866eb60d2ebf43e96d5b97751952071db4bc48ca6c211fc686aae8503f945596de4fc8a733e3a15054639395c1056bca079e86283df8f37b911c877834d71426481e228b8e6b47cfdffbc7de27242fcce20cc26bd20dcd6fb2acf73b61b2ee76e9310e66e1c7da571fa712b6f2e371df4d8caa909882e4e9e4346317282c59340b3bec6c50e0942424ebd8f89d6c84b7df99ef7ca5fd7e1943162e269fe8e0cdfe097a8d641d7cab3861aa422188ad36fbb26c73d3c5c32f4efabf2732cf8f6a32330711c8296f79ef9b813e05ac516d81205234adbd9be9618bb07e3b05de78bac70d7862512e00a230a0a3b9f25249a66fd8ab31f7eced890228c52c47e37eb0a3cce6fb0cea844445ac650df13950d20b70e2abfe7e44e3870c1d80fb1003ba80ff20662da52a17fb67c076375c795823a8d728e8bda3adeb44cc766435df931b32601f7dca15f78044c29b82a17faf9692544876370132fbbfab7bd7396172a28bca7215dd70a257bd3f4ddd284d9a647fbb69fb9fea17246a7f4dadee09cde9347d3e876bed94195c3c171949acc191272487a2b36e2c0e9766a6cf33b1e049073a7b58c4320890930b820744a01c843b7db1a47ad90308bf248699982f70b98c43300702fa1538d33d301a1539c21bd978450811e2d671b9bd0bee5d6ccbc4272912dc21c58f626c47039139028d9a08dba5b63c0b001357cb4eefe5f3cceb59f5d1aeaa5694072ef51692e8bbaa3217075854ac3bafc319fa64cca989948dc98c6f38844a117c2582ce759e77e2ebad017ca9c9d9173ce0ccd25ce7e0559b73d0edb01943ed3ba3f4a39ebece9d8859e644a66e5ec456c63966e954c35379fd61422bc67c19085a9199f752224770460dc6e1db4aad6f0703c9d1f40e6da0c79ef97e700299d22b11dd7ec197be1a04f8d562bec53b0d7c4389eaccbabd477847b9d0e244a3d24bf03fd0c0ee16524cf1dda4c4cba93999bdfb1449597af6f0e60d431278b02552fdc2da18ec34130ddff48453208f6c698a0c57fbe7075f6810201798c60a4a7319d7c49383a392a0963e3e57b35dbb2fb2a2d35f1ab070f8d509e7ff1b3817f1c960f728d759638195e7338950cc2a09a0312302865b9aea9cfd63c1ff0b3f3273bce73418e72b467959f9dc2eb8a09f68a0f4a5b8745987cba2bb219b8ee4873ca325d67501f2eeeb5459c134e9ce22f4f8f88833faf57425425b0084d1f7ee9fc07520961c15320e1a34df7c42fd8ddd60ad0091006dc729b27628b0d3c5e8f7b81302476abc3f368cbd71dd27bfe1135d909425277aaae0763c9d608585d0c691a3065fc888e4399c343fc75a77d05cbe49bd308069d278bc02755e6c654ecd77a015f7b6c3d0e946584bdd5cef97e5814517085a765b9743aec4ec185edba28359ae27b0c3709400fc604e9cb42ca4ef4a2aa87368f2bdb16bc9bed4b89eedcadc9ec744d3c3efb0f400d1eeaea72991a5de269d73b662ea97acc796bfe99d99e8b291ad1d2cc252ac5cb847813747784aab4060bc36c8d8b7f7f8ffa93925cf04541f4bbfc64170bbc7e3bf0c7bc05039964317e87ea13af70fc11bc8e8d3d90f3900fd299d8d102124a2bed6dd0ef290f2463ade7fabf76c21b145d2f52848bb5c90f0ba613a95dd7287cd2a4e2b273889526473e7a64f90d85b66da89d0c01d06285c93c163920a0d250e852a98c698d457abdb7453d22c3d4a6c38917cbd966959fad75a49529c3887ec6a4dd4c05127a1be85e967885bc7ab228eae8cf287654b88ae7131d8045d1923ac37055b6f693bb14ef12d992abb2ddf5bd540ad9d80a59a953b7ea716b9311d385778d6ddf0a5393959c00aec22b5db92094faabfd964cd1881dadaa69608f720367282c82d9ed439d809dd62ad36f6919378923b7e002c0c0657c42f9ab6ae75e27c110846d4e0126860059ba67301967d321c91931e5990e5445c22207ccd215a370f84c5bbc0279e80ff5c04030af9e0e38f9da7627c244ea88cd75e3b49a71ba5be40b6e9d17faa0fce9da91c53ae8379adb38f638e1ccb76bc2a034a1ef3aaa1f3500e13d2d7642d10fe05c8fa37116db94663e730e9876be7990cba76028ab21f0581a50623842a06323d01eacf78199204409e97a40c3f321ec9ce1b218208f0a7a8e2b9872b524f055b231d15984fc9b3f0ba42b9fecbee34d7186e8bbdde8ca80ecedb737c5aca72dea41b2f691a63612804170ac097435cffbdd956048baf041f5cd3b4622937c8e27abe31fcd494a6629852e7af4568aa1b31976038892b295a27e478d201a49c2090912263b529f893b5d96627b9628f4888cfaed952b30dca529a517c4ece509781f3b94aa08caad307b81dd9449ae74c69f0d01cd41ee54f402735743aedfc66baec432048aa0604ffcb95cadbe92c6c195ba93049407b993872023a13ced1c82edb486f5bbf6413b1c827e58db39b1f189a153d5aa851caeac558f25c46f66a4d9e969f80931a00822f0cba657a5242938085c9bf4d1007431005d62518230539a704ffa59e2e62223ba4a358023821455537d6a89276d4b12658b10756f0323e05816b90942fd3dc93ca7586208ddeb492caf8fdaa28fe37fba8f7e8c1920badf1c5f94e3bf524f4a48e5e8fa303e13d02c5ad759412179044cb01fbe088e09cb608111a4818dd7f756a703017086ea4f5e41b515d3e851c6d3aa4fcf2183e05e5048edfd9f223bc88852425882e27c56f857b81be8da37645c62e5f7d07a10988c8c9190cc80d43ca5b74d76016e87c410a7ea585d36cc31780b0a77904e53c7fcedd863ed530ab5beb809c8845e784967fba7e4436434c911e1ea8e127e0f10bdab8df24d8237b84c579fbee0b04faf66bf78c4108146596154febb7f022a34b39d7782f00a78bbbb5e9362168ec26320c21aa80e49e5f9bd630d810b4b3fbf4c5aad653dce9105190178c2451fe0d3da3bc41d834ce6201ca0a6c7459465e39fffb143dbbb7958a9d580b36e68779a939e1750ed1d32d430f232eaf986308d7ab13573b75b015a4b3c31287d945ccd1d349d4878c017e6b7d25369ff083df04923549bb78d0476a8b93223c67f20fb0c9b5c2b86043295112dc5149ca814f0282ec213cf4870d3c30d1a5b5757103f1a7a8d83d149421ef3823c5b81e54190c383ad9811df2a23cdf2af6ac14c3fcf1a26de6248e5274ada3d82a02afede26c083c32719ac90c35bb8a3b93ead5f5e02fe9fd4c15531ec9ca197a19eb1f0264748f20f4256f060ce076701fc75031a971e81583056daa40d75956afaef5d9403a992ef651a18c265801f361b9ade59e0b12d1fc95ddff407a8bc3668fa58b842084ef76908d6fca96acf15e149a3a4d4c6713fba2c845080b445c8cd52ef23e3b7bb9b90a595ddbd33a50c5e08f507f607f97dffebbfe280e010e3e3784d8d315ec9709081adbf3f6d7679955deed57bc6c3c7ced66297fbd0e53ef4272d3afbee6da603c56539f643362bb9a9caa27d37c5a65fdd5616b3329751eccaa9ba7fc4ef3ce326f7b1a73bbe60cea032a5ed435ff5b40ac36e9a5fb1772916ecf285b3a4fffd4b7eb97e55b32b561f331b374dec8a6f67aef8a3fafaf16b7d9be9d459cd599581b1f311ffc5f988d4dd0f161300a189298ca182344a40c5696145126da04105154f389992822458100aa92cd07021bb54163f79945dca0857aafaeef1cbc8f9e8c7516e6125082440230918610bc89842e79c549e68021337782356d895530d10022a3f5acda80c145cef8dcf293321f06312cec042d3a95e49930008456850fc4f9aad588565d1dd1b3a73e5d4bf726aadb02ba77236feb0f8559e181225402079774e2ed4a160392310239a214673dddedbf4bdc2ba0e6518bbbbbbdd39e79cbb37c0ef3da64bdddddd0e0dbbbd0c2184325660d8a5675f06001384bcfc3296adebe7b2ce2e93b10243c7257bfb11d6a220f6834da3e0f70edddda200bf6f1ce0bbf7abc11f93ec2c0a1c97ecdc9d93338010c6afac3529d5c1d4018437d1ba737e21c58510461863bc96090cff8544737e21852889ea6ad8a21b1922c78778ce2fa490f5090f42cbc949e59c3b903b80945629d198a252bbc4b452a231858d4ab81a60674b4a34a690550dac75ae2d8ef301e14826464a39e7a4b4c2aaaaec1378833dc09dc12eb503c21186ae22306f4a80703b18ad4c7ff06689801cc3181cad8c760dc6a8b8c28d042bd8eaeece5edf4aa7bc16466bce4929add5869bca390bc738e783d21b6a512a78a3d45ad409bc5996752d4bc605d691b607b38d160ef01d1720bcb9293850af8952623f8a5510691af75ac5989eec700a39090ff05a2730c93e1c3cbbb72cfb321e9ac0efb9e4e76a80433c1c9c18b9ffd5f0f01ef06abc2666411e13a604a112c4c987c3ab473875a746b8111ed2e5091e19a1c7a210e398914cc5628cc0c48c2a94c85b0c1488400415a4bcb104d7ec5252d888428a1956e0985d4a0a1946406111454776292220010b2ac24819614aca0851aacf845a2ae004144c880217450c810b214208c11629286430841d0861c921a4168e19c93c69094cb13bda253c85ec0ade62f248e6b3212ebb77f0b720d9df3f0876e79c95a34b91bdc1c48ab14280e333015c82739096008ffa596da1f07c7f99917f8ccb9d850ade9c16f967726f42c4c6362066b2fc27e143bd275c1e4fd00e10904f9629413f9bbb32f33f4a3e338dbbdf37365f1ea04b97378a44249ee30b118d7ca04b972e3f195e6026c3ec87f71e83accb776fe00dd3ccdf40cc11fbab82b71ab2ffdc80e798fde04d031b3aa64b56c09bcc169385e89c9f4c1cc0c3e1d9902d2b783b40eef76f1c83111d837e96c8d59058c8168e19653d083263c30f0bc7f020042c6c9840044af028014ea9a206195728c10558347fe7601ad68f191bacfcf2fb989114a0d72929575252ae64ca631dc939a7630978a3381be29ee6ca1ee3831e3d66d29892a2a287078a94142352529870d98205e8874a2a65452a15254545ceaa109944c9f2044a5115fcde8aaae00d66cfdb895a0ee55b133b6c92e563e980b2c8ef4162f1f538c4200aa230ef1f2ef27f2c7904961e94dd92547257f8d0079b616915e894117a159a56a1bbbb9d736e36c166c9eedd4fc9eea91bf865d40d2c725de2a23a843e856c2ae1eefe44b8bba370939d19779a1cb143b3280104a3c09eba04c42e87d093c0d0dd1b08b3e7280f261333891d6ffc08ea09aa1375a716f16810ac236dee079569f62c4d76a664ca25d34c439663355b118da8eca226b03b9e2118c5080bf6bc48a09b05090b04137dc799c05edd1bdfc9b07da6ecb0428c67fb82f2b35c5e04186673890b7ecd2fbb40ad7b03aff8101df9658e5201bff71a7259b7d817ad79f0022769f8688e59281ca08a28a2680e311d47c389269a92ca0a3a3d0230509a9220458ce1030dbe633aee0a4d89238206332830054ef4684a6a68c30a134e8398ce7be20a5c3425332810205180253e9a634eb3d38298ce7342043b9a928e82e69a006ecaf7aab3ee093d30238be6983d82d6d8cb7d83d4155a3cbb72329d778428419aff498b7fd2663fccae1c484598a382df8ffccaa084bd13159b7153bf95423122160d300f6e72533f8e2cb063a135f03dbd7623aed8d192af28824b7e8fd334ee8a1d2cf9a5300b4ae0cdd978cd8c8d13991155015f81714cc1feef7f784d3f469d8b9e802f875d4006fe711992d7256314fe33426a60f7da7f30042d430083b4794fd689f163f527cdfa931682f99316f3274dc79fb4d19f3417fea4c9fc4983e14fdaff49cbfea491fea4c9f027adf427cdf4272d66574e9c1fffa4d53f69f64fdafdd3cb9f72fc4963e14f5a0b7fd2ae3fedf89386fd498be14f1a8f3f6933bc097337c0ef4b3360232958068c0756fa0293b019ecc71738c36c308c4815f8b11d180f22c030602f603e40f15e060bc24def2fac0357c02e600fe5a6f72d608fc90e1e616fc74def59c05e131fe0eded3c1e37592cc0dbe3793d6e8a41090c83bd606f8a9bdee320027e57c6c0dbfb7940315fe0ed01bda0c7c54def75ec006f2fa851efa91376dcd4c44def4350c0ada5b5f414af692dcef49ebed6028457c3fbd6d25aba66476f31a2693cbff72651f29b927d89ef78f618e4e73e0d84fc3ad554b298d24080580f36706fe95207b5962e3d2ccdd34fbc27bb1894f038c1be448c46a3d1e8bdb7e3a53011b91f46f2586992fb5f7650281412605027b91f478865ee20f78b7850281413da4cc34ae5fe10acaee4fe1bd420b068e47e0b0885423d614415634beeb78e42a1502868629e20f757412814aa0828600c727f0542a15047409e8983dc4f9f70272f3fc8fdb37d5028541251aa2e72bf4cc11530633821f74724ac5010e47e78041877e78cca82dcdf3e027fc6196aa8d154c8db5321b7a3b21e6be006cace518f05defc893f711b349003d2fe93864c08e6745f50d1c60f29a5fc11a46bee5b8f7f301011bfd84c8f7a832b15000119be1f8159d69a259137e0102401b5ca1b8008a9debaf5e3862119be13f951a75057bfe44384b803145afb8312018a934aeea412a984aa820766cc39a74553514af3fc4a4a39edfc4aca59c9b7b3b25ee7acb55a961b524a295d7d997feb425f884285de5e6cf3e1de2c4928070b197ecb500eb759a085d0bbb5e9c830645d190a65313f6c395c0996e0578c6e40e02c45a2227a668240a00799454a1f82d061028a2c0ff58cd869c293430e0e701c18181d5d277873a998d9d0a5ff99ff9e8ec2dd7bee44524a777777b70189991e4124fd4abfc27aacd12308cb786faabc466696efe894b13eb77d204b08a5b521b0524a693de7dc8ba14d27439405e22f5b4af7f97125e88dc7446e3d6c5a10e4470ffa6e242919260164a746f6df6e70000f5b60f777b5be032279e2177306783a2ca452c3a01f41e69cf3c74c8fd20f9a954a1406f821214a02dedc949c7f48cc2c4f72eb49f049103ee9493f414002949121917af468c1071088d65a318a6107817342236d2ba594ef7c7c8e55c0a80fe79cb3d653ae0f61cd84e8dca54b97fa34ba3b84f76656d5143f7e5c41569873ce1ed40a1d59e0201b29079c200e88abc2b973cf3d7fce077cdeae05c789b829871631dc1a79cd3b139c7126684324079ca6a1ae04df95e037e65c096e41e46851986586442747d8e4a74b6ea54bfeff2a9fff51f9344dd36cd518d92b9feaa742414ef2b2bf26c05b15a58a525931a757404754f893ce29a594ae51cc3953cc9c4c38353fc3fa3b77eeb9e7edeffe5c77284be94b384a311e8dde4d99999119813b034b2925f59ada580e120b7d4b37d02f3862802822b3971c3f1c81f25d6649e8cb05327c97d8f9882f18a830e79c333df65a31768e859b734e226df27fefdd23ddedee28ea8e524a21fd1e6b60faf2fb1dec4d27c70ddc223062db079e33e299c69f7e17e00e2bac232a936829a57453a6c82878ce86512c1c7dfc8d943d3ff85ebf861373ee21983927343a757748847bbd861a570f7124af8b93f990b6a9bf7d4b1624f8ca308242e5f901239ea7923cb1ce5e041b014cdf612d7290636464b29b3de773774f5509caee9ed242094f1d818ba7b40881fb7cfd90806b6457236fd67505dcaf052a6f41b2cf1ca2c0f337d235224fc093a7943f659664429d2e9267462a1d817301af4b9e5992e97cc4274d6c03edcfc110128fef19a9696216d325fa148cb72347d0ef3ee6a9f3c13d0cdac9fdb0d451c89b8502e79c739bbbbb77fb73ce39e8ae4b288b03e8b21c0e31303c40e469a149f6dec9f2b7ea3e93fd2716f3a4ce07cce26a2c677256904c96d2f5606239a08705c6ec4add4cdc9425db68d5a0ea4c5b9ac68de08eec1b03ef0d8e0f6f7d56f2d64c1cc84db2e11226b2fccab9b44976b651f9765aeee29d41f325ed2cbbeac3776f262ee99098adcc83ba241f62dbcdf2773401d3f7bfaec6832c0704fec6234bf8c29623cb97b2993c93fcd108e367924fef8d7cff19f8d267337938f8cbef221c4df5a29722167664ca643a13fdca437776a6dfd767b0796f7cc639b1f9109b4fe77cee56187f96b08ef4628d88740b6e1404330940cac4b490dfe84a7e73d4998f62f6628d460fdd8d297304a9234459c2e21803bb2ebdec80e10599cb8516462ce8c8118303e6058b42d7b255a553466bb2f19a8003e6058b42d7b255a51106a2d0b56c55e994117a3f296ea0a608f29722f8f4e7d7df817ef5f3ebbbb7a71cfbf5e1d7fe2ad3d1390581d3830d90fbc9a95fbd7c7d98e5e8882ef81566bffe0efd553644f5fdd9102f3f73453a5072acbf9995e9644ef45fbd5bdc7f31a07ef53bd4afeaef50bdf596d3b69907dcb72e78c1acc2de570c3fcc9fb4d0ebc1818ac9741ecf4e0f0f0ae6e150857a3b397874fcc869f8b7d703f32fc84dfe2fefeb3f1f984ce701fd4b96e9bc9facca74b297ea897e7b41920bd6d8151f9bdfbf03bd80beb0c11629f0609e1cfb30994ea3b2e6d96994fdad791c0514041434c258c07460392a500755efb4ca63bef1eb40c9c1f196c9013498d0e34c074a0efe50a61393b5cf8f4ef790e06930edf3b275cf4b76c53f693ea2779a28bba2cc22b9b8c99fe463ff69164a4ee8452f12fdcbe788fe25d381025f672747f438d3f19dcc7b200f8fef6c19028ad386a8b22be7dae13e940b6707c9c5893456b082292894e63e4c5aab5e497d2bbbe05b7ffd7b48013bcdad28420755aa60a9b22194d40c65b322100551178eb59903f9c7c0045c80253ed9659137c853ff6915ee40547dfbf5b964b893fddae169d53fadfa2007ca6ec92c6ef29741dae4c9927dfa5cc97ec10c075ec902941dfac01e37790c4dc04eabb49737d893614eb05918011523720bd9a5a8f0c80bc7729a7b99269534ec827f218417fc927d9dfbf57570daebdc4cfe498359121d9c86dd24bf925fb36d14faed479651739ae892314ba283d3704e5ace8583ffcaa17f9f663328177032df897da75d31c35952dfc2b1329da7d5cd4dc1996b6427a5063cf945699acd9f64f9d27b7ae43b15524a144cb274385b82df7a9bf6276964b9e38a966228ebe9c9bade5f0c857fbebb3818ffccbc899be4e3f94f9b39364b51f1c9423894f896f534739e1d9e46ff69f4655e20df7b2c8f62ad6c08ebf1bf588fb3ebe1e7b4172c08cc872ec92d860c6c61ef3e549764f555f450384b44d9f542d6b3febd286e9227cd5accc29ef45cef3d266e92d643b949c20cc3af323a33b7a7d7551436891034f1fa0044965a434ffa17e47d4152b0723cd49230f27ddab9c23adb3a9b5ad4da183ba03367add9c6817c2fc43178ce3adf5acc1da1195cc3d5b7e9ea07bbd412b2649712434b7ed9d2d90e4a178685effd786f2ec51e137b29b595de6aeb5f4a6ba5b5d64aefbd1e63dfbe37cbddc401712e8c5ccd3bdfabf56148fc3d51e856efe53d69a77531fbeec2f0363db1ce366d593bef8dc5aeefb1efb012701e3920db9301731a0fcc69187fe581396d867737c98df519783bfedd1b987ff7a6b2ae691cd65a5d15add63ea5b43a679d05ab8cdef9213c854cdf1ab9562d602fbf208579ad6a5a8fcd8f01b711a216097b9a0ce684f432604c5e93e179604b48f09a0c1993d748d9e372b7586acd803513a01c2f2dece5dfb5b25ef282bd203660b01dd8fc0c66026198cd512706c3bf8b0306cc0467d313c36664985ab75cec6dc95e10c68227be33c357f07b9bc3b260bd1d59ff9fad9319bec26e60dec2bcbb373b3e84dde07818aaf0b028e66486af330001650967153babbc3b7900f3364db11beb65520cc62d54c122376cbac26c11ac2ba4f3f536f309b9f03606985d4a0c2bf0bdc1f196347900736f60def278c92e35c693181960b24b8de1848e8b437a3bc317448c4a639440e6deb4f0d624720386d15b005813abb610634b0e61ef59e82672c42736b03bac8975932e49269c0ff9b60afce68ea047e2c131ff6278913c31e079574896eddb0aab98cb98de9bf982ccd797b1483cdb97b1d955a4da5028f4ef5df42fbbc8863e1492c1c2d462afc983a24b92d4023baf1067856cebdb5a55d09dbb73a4d0c6816cb39f7e619d5dc05c9601731a0fcc692db8cc029675605ba3b27c5212283f067356fdaafaf7d6fdca01b922cb6a1afaf771d3d8bfa7ad7a7a55b662483cbb7b835f2757dbcbd3b7d8f5220a5d5b614874f265c4fafad63f97dd3d0273f545aaaf5f65f533ad30a698f596f5cd84f5ef63460ec8c8f918cdf956d3d8f7d3625b7d7bd5f97472b5d826fa2df4dbfdadba44f3afd0fcebcebfaaf9ac0bd6c57017d8a5c240e5ad5b90a5ab8210f7c5cb0f22b93735bb8ad0af5f33bbd19f6fe3ee1ea9cd03430f51c363de922b78fbec9046078e396df05fb6f1a63a70b3bf55bfd5dfe0db4c4875559990aaba6016df73e7975d7e4874f2bc8af4cb97ada6e91867350d7cbf410251a825b210ef5fee6b8485fcb28d03f933a02702eedf207da80704b14877e8a308fd0a122400b24b5d79929b10615da7ae9820e5459736525e680123e505152b525ef4a4bce04979d124e505935417564875a1058c54175ca4baa092eac227d5454faa8b2741b4fef784fefc1de8cf397f88f734bbdc6958e9bbf416870f174cba7892b75ee2206612630c6a9aaed1c1f346d3b854173c5396a0b87892b9d8c9dbdbd2117ad340292ce0f11879ef0e09e56784f3d17fcd006fefa7a1784c74139e36f57bb6d1eefe0de79977ff019fc2870ec4be2eaec6076f2272734122f743a1203775405e8e2f031c13067e537c783f0f8ca7e561a1020fa080821317fc608d20cdbf8978cd8b824a91bb1f0f72bfebb7026f411210a4ff3d71eefdbc9fd0111408d8c18f2fe968f4643f7fef7577bf8eefbd7735c4208c2f339df83af04f9a934e461831a8c3d3e08f7ae426f7f033077710c6531f677235ae0c1d5cb98114156c21c68fe69fdde51876533fea7c963ca08682fb76d94d3ff669f42bd695d287b92e65b44bff7e7c727c3b934bf4fba963afb9a0ff0ed57b3604941cfaf587e8ecfa4aee3004cd2e78bffafbd5d70c6bcffafaef2f469d5ad99553fd476e8a720bb6d995f3fd57a94bb134a3a5a334cd9558cad1a64bb1aa32226fc9fb09a203d1f1e0a61867cd0b3d0f484bcc3165c588f8aee418238ac99430882b1dd022448c40348dd7b47f7c6ff9042b535256ac4859b141caca0b5256a05002deda8adc7fd2fcdb73aa8e7fcdb0c3713c9cb4f7b06b6c95ff78da2463b20c40137014f81384d778764df93ebc9dec9ad9c500fffe1daaccb9a9ff35f1df3a4ac5b0dcf273fd979a8a3729c0129fcfd78f2e49596b66f3b0f434cdcfbb4202027ed96934d8e08a327c34a7f1e0c1c1149416311c37c977eca2b4a3748d0c8a4ad3b8c6d2342e95042a524a30b29441594ef94496ffae340d7c15c8269902383c788d3f0f95c27acdac19cea99505152801caf1254f4ef533d329f5cda92f7115360ec4e3c9f161d3fcf066bfd7ee25b47920cf74144bade5c9330aa9a491f8fe116651c9ebf7c43a922d923dcbbdd7ed0e618c524e6b1e81ebcf982e45dca5f8cee1307235403aedbb2baf866c36aa000084ab7f791b01800bbcd11c63e2b434c651ac2a3aca71c4046ced0c59967d5bfdbc43ac101ed96e40bceadf2d428f54d96f38d7ec960bb2e22cc5608f1a02c4d42cf19f9f37b2cf046577a99f2cd93fc81641d93f0155ede6c9f227753e2e8c77c8cbf4ded097a44cdfce9e6fba3927c4a1edb4a40adae289dc98c3a07cf8f248cca0d7b88b9a731baf791a7c225e231f3e8ed7c48f9f23b3079d9b84e0c8401459c2ba0f6097fad9c9306ad8b9909118203be7e388a59d5ac9eb87aa4960d75c47c9f077ecc3ef245c4d477113fcbed251b820c37e2243d899cde48f9b5cfa73098a1d6584a350ea313e54026f504b973c0665ff2cce87ff643ff2396610cb440565a7406ef2c782c202b3348d96a6a93b3db65fbbf7aaae4ee14729e384d46b57cfb9e77cb887d4050f4288fd2045a6639a44e4c508152bde95e2138931ba39e7849f91e864f94cc05269a647c92af92b795f222dc0db3f7f245886c574ce29b88fa7bce7754fd3b816990aef711f325c8d83c0993cd8cb2307c49a3fe70c5dabaad5ba33a8ad27b3c4532cd031ea094f5802972bb250b9e9c106b661f030413a67e76729fa2c1f3e15fd13bd75b69760612512ce7e094079c80c5d2b140a85dc5e9b9edf5764d3d38ab029fad0b52e7e69e1774bdf25f9228c0405916589b0aacabdf8adfd4204395ecbbaf82d0d59f7e29f4320c2886caf100410c1c4955c76ae34b314d23914baf82db5de862c1ca16bc17c7d181c309665dd6b5956869f4e2b9fca0b7343586559187359f4229128742dd1d71785422291e869d388fe3d4cf5a24a04c64fde6a78cecd6985aee56ae8b97084514d4c0c1086311e1b0951d78bddcc4df4bef53dca7d733d40f4d6e784fe865e6639a2b744d94c92637d28d37937f55b990e4e2bb9a9a575dfc62f9d42ead7edf4bac2eb104208218410fabd7188590920f2d0489d6fa9f5ee028e449a1c66f29683933014a185b0d2196155d9aadae2bf08639c954e8f315e45e0c78f588410f2086d1ca81a4fe1b018d87fa3393ac69e5322f13c6774e8d3be7cfbf2f16ccb65946f6355bdb54f9b063a1f7d6fa0f3f1be9dbacfe96fce89c9b79ed96749d03a628ccec5f8ce45e8103aec7cbe9cf05deaf0ea4ea7845e6b55abc730dce105a343281b3a870ebe7bf4ef5a458ed6e10f42970e66930af23dd8b47bf329a337a5955291e8b983fe0ebb1cb67b7c10f655e4fda14307a173030879d71791e0de8d8bdf8e5d11c6d8ed9c73b1a1eb6e24c4c0c631b11ff6a46f07d48337d61805e2836f6df21bbe08abaf2a9df0757cf9317bd55bcb6a8c874a81aeb11f739b3ca74b3c98d404770f30f7c00576d939fb70689435af0d5910234981fb7b7040aaec6f71947a94caa0f185b2f1a2e5850c1c3392199581a30d1c6bc0e076214ecb4f2d19bee728b3cb88fc49db801d738fc89f9356d50a6d1188d62dc442db49062116f4207549074abf924aabfe804a07a7419c4a7b1baf455e32fc2be4416f27f5e852bc3ae0ca862ef943387acf5d92bad4a3094c7f23d13729c43016452a083301381fefce648137529ee901b166d3ce673241f9d5d0e15f954e09dd1dbac3ec08740be3f39428c618a3fb3be70ea353c2171d1277feafef11ef87efdf5d4075dfff5c7fbf137d7e867c87ef3d9c049c647606b12904febb47bc87d090bbdf75e6dfce9dc3f8d0b92bba6e249efb1de6a47cabef8df43752fbfaf7bb0ba0f788ff4ceeaceb93298ba9d07fb4695e1597efa4101aaa1fe4c705c88c9ee27b54d8fe410fec7480d3ac6c08fb4eb369fb72bc61e40170dca52db0fd21f2e35b4c07be924ab351077773eccb2ad3febb425c194e8a101a688664c3c9f51e891b4ea66fab2b217c09a517a94732c5734aecb9ad552c4c05bbec2e9c315e704a08b7ae2aed09218cf0a784f12d76f5fb3b0db99a991c32232b362cae82e13f2a7f4e99410f58229bbd324004be7c05b86c5f7e063aa0811d59663fd887226c05c7c719523d05a2caf66d35638a27a8e4e0cc98e2892cb2ad72adfc1ea17f5d5655a5a9be5e56563ad9bec4b06da35f6117cc845457947f4d59e56abef9d208fd39ff15a9b2cdaaa699aedf7c5306f186ab3f05d65bef5ebe95f325764df85a5ed5552f0adf9bb2e193d208bc1338053d61652fb86f41f89664017e9685c1e02ae01480cd61618634d254645b530183131954d818411a537812607d5f059c249000ab75903320330decc8f0610ffc717631e8f469367c826b1acbb21e374de82d2b64851eccd6476cbb1fc2ae6bfd65adbf2aebaf6a855c8e3224e55b0e6b817fb01efee0eea62382d74583125f49a55d233187beaf0e4f68feeef2d0021533a678828a195334d144b80a3e02b6deef0fd687ac0fc50f3dbc37a18a45ec7a35866e28db7472e82b66c9dfde5b1fb1cbd6bfaa4bd6bf5e8d4874f2fd97e3bdd6cdae2256e7cd7af9d657399421795d6ee69c8fafacede51fe826bf66a7ea4937803c07c4dd2312e8ee4ec4f5d8fcdfc32fbe7ef2fda2d77c7fc9d74874b2f7833c0d1f42f9ee92fde2567fdbe0bbda7fd1fe6bc2764874f2fbfc62bf1ef23ec648abcce81f9919ec52556916b87b6bc2be21903ee83cb43520c72310880332bf3bcb6f99d12436790332c90995911c80e65123d4913c35b111f07beacac849fe3ae816f6e79ec37b243e7cfa5f338e7c1af2d6041e7287d02025cf32f2cc228c62abb75565b1b0024f9ed5af5b1812aff654adb42cb6ddb7d77569dd6cd3c9d7fd067f0bbdf5bf422ee5a51289f72d027f5efbf11a113d74cec77de77c84de62a26cb31f5f6ef662dbbdd9ecd7af5788fdb6f11f68761999707bdb7dd10c0bfbdfeb36807c2ad8a594f0867b9c23339214d80d01e849de76e4be2106e0b5ce3bb9b718d691ecc4b017f8fd0b7a777fe4de0bddaa8a44a2b7cff2290d20c36f366452a96964f0c74003f3ee8934cd8e779f43d3643860c05ef81e37c9afe1612f669fad7c7caa2558eb20c5de0e133bd8cb5b9bb648efa4f4d6ef8d13d3db97905561f31f7332c353cc09e961c09c987e07e6a4f431901ecb4aff7cbce601dd9ab32634cdee3e359c0ff941b80c13c605ceec2e8e26a38405c9ec2e4cf6b674690c4c7a23cb786f244ece4fec1f417ec4482487290defcd8b4d027c647860ef8d36c99701734d802d26bf606fcb7c797979e9810240312f305be9f7e6a5d4a344e5bd79e10102576aad2f2ffff2f1debcccd830f3b6dc1b9cb591e305214490db91cc289fd1a884add6a445ed148d08000090002315402020140c86842291583420879a281f14000d8994406c4c9849a3418ec3400a52061143940100004088013253323355004819086aff3ab65bd4228b6433ff7dff79ccf602d2788f92f3c9f19255014e0c3c4f19cd2f14e8c71dd28769c4542da2da04ea3fdae2576f4ebfb4e3b6cec7652f781e9690a4480bb7d097bf75e0025fede95f41a244229df83fa600550a3859639adf9c25b2b0a6d6b88cf92f59de3da0518b65641020ff7b322ebb3b99438f333ec5af0999df4ee322b89a5dd0cb10cea31b1db19d6f7017c4a6557b35a139b041fd4286a5a2d11d236a0cf598d07582850045cd772bcf5e8c0a097e06f0f0b3fcdf36178b5c645d9af328f34c41d58e49699414ef63176a41b4f681310fafbcf7d376e393ff6e70e04b9680b32d84778852ed904f95589b13c2dc3c8dcd449d52d95bd65283378622abb115bf20b7d745f93d6c0237229d049395721a2a06edae157ecf39c0e841ae65a79309bf5e717d3aae06de7302a07ee4b5c30652c948f3d882dd94e04af5361c3c78b385ed00afc1c2f7b1d47003ec47a517630eb6a1a45b23b766a9c0b6e99598ad84b36cb6cd466546b129c7200e0c03e1f9970f07dbbc98ab93a314c6609338c427c847a880d3caf93fd4f305e97b972bfc4d2eb6ae603b3e17eb9f401fe72d9eda1221b0f17fb75d6c02f462ae37c94632ff6edcfcdfc61600f710ab5b74d24c6e5dd344ebc5765a2f05d849f3ca27b38b3fcd066525ab994c2ea5af5e24f57d3167521a2b56732ce537782a0b2e878f41199ddfff845a0a5446ea55607b59a4cd631f908da95e80f50759bfe08178b63c767a2fcc5f606b4d9669328eb22c6bf5e6a739a82022a16079af4f44245137c365628ec7b8e69fe747d8649f627c284086d581d980b8958d2f86864f79d8d81affc791e1ff19d83c266764947a6721acd9e4de2ffe77a92d690e0e0dbc3db884d7e5de1f8cb0ba223dd627e4829612b19362d78147fa708bdc9d2daa1b841d2ac36d223ecb758205eedc16369973d50b223c027a137955f75b72f952ae3b527e2612b8c09ab8569cfab8e0c756e4ee879336dd569454577b726e25c8d6e99ecef9dec62c04083d8c4564a36839e5630f3493042fa8072ffa16b17fb8b4b5105f557180a7ff3b28e4e0ff93d4307f70e1ff0c80aa121038d1899e0fcf119562a54bf248f76ce65eca768663a5ad7ec68300555793cf0289db25dab31d8c0a704be489c91b71d0550ec1cc86fda480f42f88e42b0999a560e8d3b44d63a153ee9dbcdcb82d421274248f93655592a9507da217ba5678ea54d7a605ac91a97fbc838c9cadd3a52ebcc9f229627142357a04e53fcceacf0a291083387383640311d5f6b1d1d8a84824d96b1eeb7be74f8d6eebe6006e45dd768af0f5cba6f886fd9de495cb33812d00ac8803e5f43cf8ab102cec4bb2ee99225001b41b5830297dc3c4be45bc3fec21c6ed946c257934435cb1192f542ddf865f95f8c7a55d8e081aa2a6e36514038d92e2ca4bad3749eb67bbf17f700f512d64bf6d0528f0daca544331b578f3bac3157b09252869d775b60c14c55a8ede5f1eec87e2e39d69142b1f592556fc994e70a76dacaac993c75eecceca4aba5799bf486a8204c72fb21bf089f082d6f56f4027ed0fe0df664a983032a45db5a6048a75303502eb18bc7193e0a6f206e4a3742f00e05f991a556f049417b2550bf96892ce6af5800d4618182ad72d9f1c12c8de3d46ea5a03d649021078c0de0ed7ab86925fe58bb70d459c595a50ea900659be69a9536e24e6859ae1c50ef1ec30a764a9ebe2c45745c45b9c13b77d5b0632e7ca10073ff49f1b6ced81693d5ac8b64eef0c33ac7ea8ef0615d5fffb4938ffacc48f42da08684a00b3be90745508bc74325f21883c06afb8684105eb02fc536468bad915096881fcc178e65303adb475695485e0b7d12e5bc5bdee5d384e67bb025cdddd276823995da75085c8204526dd32f0ecafa4ccaed578407357ff892f7573ebb1897916c771fcd427d3904aab891e6db7196b65168b563fa8cf47a82210c829509ca48d3fa3bb662531d4382b398648ca4123776d30dca8280efab09b7850c8e3c7137587930a17f1fe6c13064c0cf7db05f0edc10b30be7fed2c9e0d22b188cfbdb2038be2df51235092868e9242f932dbd2e0e595f56de24a25c1e96a41eafc8413e4ed15e3ee756d9ac16da8ef008117b22b1ab0fe68042d1af124325bdb0ff6d190fdfb03694181bab6df6abbe73175b51a5450fefbb7c90d23ff2ee1808034d87f3dccc6033083db4153f8695488a66ea321629932982923636424e9e6881c5eb3acd9d90380d5d7a596a71bf6e017b74dd918e294fd5b9fc58672f8258e10df66f2a10e312146d25adce2168c459fba8f45870bc769153a1a560d604c449ce1dd1e4621a3490e91af6c82882185b368dc777993713fec9f045d6a029c7c943802ae16f7ce99aa66fc1a3b53c0b01c89f191208c59a824559b1fb47ddb790be9a7c71a0fdd06113dee45ec3e44a7a00ce3bfe7b31c4c29481ddff2701a87691f6d32e4f56ae13023f3ab6e4fc741adb44408dbd8376a4121f1f37170acc4f0c8202ef131e4bfe95378c74b4782604fa82977c8f0b1e978d26c3066e985944072c41e72da568ca9485e0b2cdc095346e81704499e0847387b33711e86f152f2068073db327ebce3d2ffdf43442df5ee793ccfdd7b2afdb140d9621e8d79d7656a84462c014241e4026d581a21479b4802def6565144a61b031ffa2993b19aa35cee7206ecd6bb98808a88af3a48a0098e43d82f1744c1bed0bc5cae10a3e0058059e27ccb06b3d53ab6523bf57fd52d651fb408188d5ff07dbd1054caf5a05c87bc44d63da301f300bf33651987ad1cc6fb304ae8f7bbb0d67a37daa180d3b187ade5e8a647902b4e8e110c39f15eeb941f86f018db52cf39000098c18283dbebd9797f5c9cac2a11e201deaacf2fbe341962383ecda1954bd581c99216df506cf9cfc6108d76b29b072832eefe188c09d5333c0fe40160df5be47fb58b90deb4f16c9093ec08821c5ea962ee472eb1d51ad16cd94f04ceb48d583dbd58389cc6e09a8c83491a37cea00c00beb002e5c76396cd90f0454e53ba3931eaa8024bf2e5a61d455333a2ab42178b9cd9dadb9d3d8021a4b9ab00fc4910d51675f933eff5f262bc613968603d5cc277931f43a5a6a3e9a1d58c4a03e5588e60209784c46abb3986d68b11e969a9ec09e1a68bb562a5688cfa67a182eb09ee1c951001f7edabd5ad214e5616875f46508c0fd1e49df7c6639c05b4761c64fe6d2bd2021663742e4997f16f3de0109abfbc09b08fa22bc6b1ce304e197f089bedbe4966c3c45258d8327d866a5ac86603f8953927307c49144808cad1cf96c2298ef22370cc54024e741361a77024ef49f748198aaec96e0fffa28c3a5c25408c0a410e888a0a4e17736ae5c1410aa21351eb4ad12ec156e2b27ea29d3f83850d4c686dacc731d58b40d915d3e10b087ef3512e0e019fcf38836805c5dfabdc5a4134f43c19fcd2c81825483710c7a5a02d77d4a07db7b753a89623fd8c78ae4e83655b6bb33953a18669c36aea4fa3c055cf41495388f6d165ee52645a3244648f8d28b0ea72311f71be915f881e63a992c3b4cb6991b61c75e663486f17bcc9d4143d9069772547dbf558b563e1be1d503d96b0bc2c3749deb30c6aa1e4032dbdfcb9b5cdb79c00a62323debd8147eb79e9f5d91d4f0669bf6e6de541cbc277df1343fcbe868cae9179565e7b4f7fb2866ccb87ce725dfd069241fd86606c7f771a3eaff45fc0677ac9c2b1540639df062d42564243beb7cf48d597952581c610450c64dc7371d8545a24550ba750069ab1fe00d2e09ee32434e4068ea4a400bcc09ba6665e8c5daecb12d636b70d4b95641fcfde8fec7a162c0af0ee7a83741607958155b92e3fb23078db7e258c32248ce6ca7e00d7322218e4f6bd45c9bd4a4be5a52c401aff984c1754a0b512998b1a95293af01e9a6d34002effcec46740fe931f46b0fb2fb567681e64d475885b5bbfd76ea8555279ea24d96e884a0ecd2f00e5e80c15a3ffd508f4bbef24bc01d0488bcadba2c33cefd316957690b289ad1a16207f892d3a57fa80efcb2affa223c477fe4ad76e183f5782a05468f94b3482d3d2237e079b81a2bf1011de86a880a448e7eb4b6c390e9988d3896b4688587fcaed6d370500804e5c053678ea411349f00b4d69a68b0ebe7c3f42026e480c9cd4f0b7de5d843506a4e4636120700213afe37a26ee726a848acf2453721e8e10f1a55fdf032a3b488a5f417c55c11ca40f9d4a362c18f2da83b3f4dca0041877fee6aa6604aefdbdb192e60c8f15207818007698ebfb18a84144e6db432513ea1c8fccb9f1659366dac0c18eb003af22d57e37b54b41f0da043038c881981adaf58f166361b6e08ca8fc6f7964313ebd4e7f504f1bc37abc21751157599312c851fab90277e59e4a72fa6f65eac07ae5a33d72e57b70e144a303bae5e2590e73cf4f90dfaf740cc3d4981b38dfc4f63b270c7b0097a4fa3ffe360ef2bb880c85234bf8f568a8835b83ad2b515b9405f53fa911dbe1facb3c12cc3b7828107e5896426a017f973c8996e376c519b081c78825c6683a43aa0c309bf7699d03dcfe9171d9191afc8709139ae604db8186566aa454810bf3d13d9d6df85804a3021fc4578d8a9092d4189cdc1e7d1d5b6a20f50f795cfa6a3994fe40e4dc077f3594dd06b3345384596aae3db08b1834eaa2a832c538be47ab03319003b710a0719136fa2524b3be187fb1f4265976a742481fc49230aaab6492338223c3df82d7876c2d79e823099306036a96cc14c6a774a294871e5fd9bcefcbf286fc2dd6bdb050250c7166d3b463d5bf2e05cc802f4dd099148bfff314ddcda144a5197ad2e7144ac8475d43fc296cd347c2f7196b1d9c3a538ca6710d94d8971e25891555eeed36b352d5654965b3f5fbdc92e08eefb2d0176f399343a348e544c8e1fc82350276a42c8f8bf2f38d57aba732ea7a74eafeb642674e6cad5a56ec25b67e5b2d73988d17d2138e2ac52c8ca2ce41b543db7ac5b3f7f7796eff7dd1da9a24a54cb668f25704be673d99b37281e06c6a0a4078e47383f6d345cbb3a4ca281fa8b85b045729041cbf7ba14be630fee1d562213c301dbbb9edebf4540f8340a3f09f7c4f2c11646a0ad0957eaad9c37524889e414bba49f521aca8c189ef8b936cbb7ea61ea6219b393229ce7301815440f6c10f0b6460513922161f65aac8af06129899afb105bd0d587ea9839a539bc4d932a93a3991e49c1eaa7ab9dffc35703d0866dceca74b70a85302ed4810d339a5496d8a790735aad20dcfb2df5830b766022dbf1e026c8e97128e8d87ebaa0c64c7d86c9b05e6e60d959bb0a61232bb7014456eed78e58782d279eb796aae03e90ec8ceb97daa2b8ff3fd2d7b5eb159bd05909af0eef52959c863c0ff6f502d8c5ecf1ac771110d7d371f1a51e907ff7bf1bbb4ee43b7461218c2b15c2acaff8b7a2056a4375a637a85df7140804ba62767184014b4691534d4e489826ae646154f4dd4160e52365d37438d3005ca25492910e7d03681ebae2485a5cb702cd2b8a7c8e1587bc2f375892d4ec9b6a967ae14f1cca2bcce41b6f5e1d8d5733197e9eac43d5cec97d36c225c5e407e6a9b6c096b007f304b352b0119fdfd2af8f5676932a8fe1bbe81bbb74911253a03c8f29157716741b25604e59590c48100c27485d8f3bfadd200f2a640089af9883e0237e2603f8a659f5744bfc09a6d712fd07451152dbfa9456a79b53fdb4255657ff80247786f247a0d30b071cdf559ee7ab0f7231da172fa8c0d2e2e55d9889e45b766a687a5dc8a05a2e2e7f240f44bc885600921a193cdbfdf8040631ce9549e85c595903e9220fb330c7521797c69c6dcf47604779093845fd98305650946fafbb8063b90f0c30b997db9f818fa7f261e0d86a189514ad0e13968e80ace83b0d813870e4e0564afeec259b3966685dbd9c6860daf36496d25d773a41cdbef7d23c2fc0c657789bac6b48eae7f8cc75dcf9de4d65abe62a27f5b7ed6442c88de0c898e9898430a46aa375ce9160927746db47d73cf528a6b21c90bf33491c5793efdc6cb0672a6cdc5dbfbcbdf4c719ba871fe40c76776ae3310b0abe9d17a032bb4376838dd47708e7ba1f7271ac7b376dda197327152ca5aab3876dff1393ee5f45e02abd2b1ba846fd2203617aeda39c0dfb4c28cf3b7ae5129fa46b97f54d7edec56195d70c6ac7ea50f1b2bd63a993628dffe84e214a2012920f98a290d40aca6bb6a2adce5b2ed674d31c7ef3842881c1ceee2839f0c3cca72a5c793724ae8ed72895af60cd33ba2fbe0327f54f61bdca96cdc56e96a9b49372e0cf6252f8a6589f463cbdbc3bc54301621e7aa03935ed7a55f7471e6e0dcc142d611d3566dca0f175de88bbb1334d47d2b655ef32a0e7702441a375ff18d827d8e0f2a685b261ff845f9ae1e77d2331ba64ff9e60f8a114d279464e9ace96a62cdb8530cbee7d6d631f9c244a5d7e4d10a1ae46cb3f15293767a3675675b6e568ba1c12c8d2500abe236cf0583c2c36714feb368e9b15c634f5a0f071af1655dc03805118c21839e1ffe5327caf1c77fd31316788b79d7ec2ab794473b8707b80f8968b6eb26f8396f7801073434be555d9e1275c468d3e590d80e8a68a1a4de97c38f7263537bbe91249ceaf3b975ccbdf42fff85f5d0886e4fdaa5686f3355463f867a227b327edc87c96ef345da25113c8401238f7e4ec1144646e3d1e8d6e78bb211a3715e32503aa35b9be58182ca6ed6148e12fa7e75c338aa8c733a307c062999ab104442565c3d2643a4990c75344ba5a6c5a3cff3bf3bcc87a4e8de88c92c7a74efddad654b86d636652ca9a89b5f109665dc790cc2c5858c9813e705f5a490d20f6c6b302b241dda11c8cf9f94d200d24a325d04470da80246816f4fa6e12563ec1a87a142cd60c745989c472a407aff00e51ad6c644b6f1fe5f681d1d19e91f28ab05a4b4c1589e1829da67c59da92eb504349c1176334a20be1c924ef1bc011d9da203ba15e8694067fbc62843c6f1cc0380d58554373575681c4456318c4cd42dc9dd0771a241e5e35a922bdb06466cce4104cb6d8085b5b9ac7c25e3e88cc3d7d8a5110581ab0d03cb247293e8e673a07676e611c18670c4bacaf07ae354597c9ab10d7590244e4947599013149e275a3997ecf06c395555bb62f82c3354bbfb7da0f988c159a117954fb23ea41c7881767f6efd3b2f9f230d871172ce804e88dddfee0db32c1cfa14cfc359f4d041dcc11111198e1c3ecf863ff484e0bf96d9104a346e0f19ea13babd0bc1ac4770b10f31bd8369112b7e1a5edee1024041df4edc20f3e720d5cd0a3dd1dfdc8c4f03a004e5afe51912fafb7ac81638e8139381cdfe0883309a46fab12eef8db8b804d86d8de18db1f403182b8ab571ac8614444d7aa9800cfb1e426546c03737bcf0e4a36213e29f0d758eb013a42e79a1fd89116ba94064f8974d63fc6e8672fe38cfc2bea0025c6de6e6a27a84e1ae4d91e3c0f33d3928674fa55c1a6b2b49b946d82c51b72877c227f571b8627d69d79acb7ae5acf42fb43640bc7423b9d4026edc73c5541b5708a8e6894a2bccaea11ff2b140d60b2aa7de8c65f2dc6c7ea9e6ee341bf8d60f8f27e5577b87ffb858b615780a6bd5d2b33a56bd5e915acb27709ce2b017c2e5c285e1715d786229e09cbc33bc383555b15108a3e04363c73c1d53131a0debc8286d6d5e731060d6331bb8143fa973d7c0b39246274a48397a8d455d366a15318ca85268b06ffe8eb8f962b71d806643327ec9e9b08453e962d822f623c9b071f24efd9b729fcce1b9cf8abea628d5db0870b6ca329035d56900436c609c1535002acf1cd57c6d71ef73a81cea5e4fc28865ab26a43bb6bc865986e81f14a636147ecf6da253c0d0ce6699dd12355d5760958d45b0d350c79b2e0b2700f9d50a36d2e0fd93f635b2e4baea3405761ef2b04e1e71144fd0ae0f41192c540733502c3fddaf037e6dbb7bebe098c2c3bb6cb2fd83aeac630d43a19537de6624fabef3b6c50b15896b0f28c6bb554cd893432515d7c1bc7e2afa18f34e9668c670200ed901973286ca9b5010c2d334bbc0ff85dab84bb1f017580c11325896bfdf197fa5ab2dbf228c3780536afb615eea700c0665f88c0da0ccb504930779581e1e3538c27bc4b4923d42b1d85cda2c9276303d13083bf61a2d2ffcc9eb7a71d655ecf8dbbfd923370c7bccb6013a2c40acc21b51a2995a875536fe88f40ae4b584e77482923cd0f4504a3a419c7a002c02e55d25ea5f9886d51d9a170d954a9faf1d616dcf4bfa90483ae3a7e037d36fa14f9afd0262fd98e5922998433b746edfa3c45fe125bab2945389f22867ed21aa9a07a3a16343ad63ac8a027c1d9129f2cbfeac4276e71736ccad80aa40198ea67903ec703b249479049b740457935500dfb8b44d918d1217c4fa7ab7a09c71c06cb016c1e44f2882e65d7dc28106b4377433a091f701f712827bf48461f6a28dda79eed90e3cd0b9f78a59de8cfe9c3983c07b05266e7cfe3f36507d4e679fd74fce4d64395774111f39388892c65d202b7ccaee1b5e10ca500136b6ff14610cb0dae36dad5acef8a0863a8a17a53c3ae82eb903ff584cbccc26704d493032e5cc6d802391a3518d1440d005b39f43ac065efe461aa98fcf7e00b603d3cec12b803693c3adc866552ccadb158fb5bd1d1f9507a8ece4970637ec7a12e01835fd5aabf0dc63c6b95491e7458530b071692cc451378830d6e755611bdab4d423a17f7f9ad6c142a57f435a24222d767948d406b888408ae81b8d536b476b62b66a6845d51ef6aabb6264488e94411d2fbd226afb9a224455e543164bf64c026ef3010753fc7674f92161745585a189e8e718057f0e7ad0014168d2ec0c331194012fa6d2c323173e37b23a8df5a0339b85f12da9195c6784ddcc3e41dba6698792468d798e76a9067f005efff22d153e945fb4af16ead541bdeb580764bf0e23f6623babf6fd5e9ba5145c8bdbb995346a1150db84941bbd7959be7f193505038fef992f96c3a01ce83662bb46298cd28f00f549063f9d55d449dd4077beb2169a43fbfd2f792f0b3ee12728de898706b26b265d6f454e586081f9487b1641e418d8535d30acdd5696cbf709c690d7ba4349f17d7b1f5ad0898174df3c5e172180b2c533d2e2245920669f7d109cc266f0b9f2f8fba4b8a8c72fd21775c71070c68e62ae22eaa003843a53a01c98884b8e5a30a54ff3139a41633fead3d0ea6d0a24c13286610f0710f524903049a902a8644082f8af1642fb3aa020df4f55d3b8580c7f00f5f3460ed870ce3bc270f9e241c1b1cd6488c7f6ebbe29c1a1ca8cd1bb18cb2d1a23f207cfa52679d00cc14e67a6dd7d0c0e0b8f451f1e184853c7fc45afc11abc2f6053e38b1eff29a3e50f744656700f4b1fb23e03a43cb149f737970992a57e0af079d5ce8e5887f5324eff133461197e4c8ea384b16187f91925159ebf19a62387f0433fbaf3ea013a6ce4352bc1c724449f6012a139c2dfe0306cea1e7600bc802efda32a613a0d64c28e5f812522842573d32cdbe52b2ffadb1c9e79b1ce587bc78c0c4e222562422dcdc347120aacb98befd2e83338a431879162c79e018e8c613c58c34accdf78785ad0568b8c96901e00b13c15bc21d527a1acdfe4a8cd0128d0bb999dd8e7acd41e38210c1144f6d8f14c6472ade4c434b21dcb93e711b39097b652b11ac55d112b7be98deac60f38a15beb40d30766255865fd208175ae03517d671a75e8a910cb98c0ec379e91c3dc1b4fdcc472fb40d927bafa1cd002e760c673a92ef256797a9a869341c44cc13fa2aee595603f1e5b79c02ef63f31d9f211d875c7b0adfed4c1fa9d509e15bd838577f9b1dd3146f8ab3c87f2b5701b80847f4fcb53d47e750a43b55005a222b288c8cad4ef58208a57ac9a7109dc490557141e2668a7471736f3ce19fec03809743cb19beab25d28bf7415dec378fec6bfce6c35cdbdf84b74b205e3758e18e37e061e970849ee80bae7281a501c932ff57aa9e279174f0bf481331e2967f11beee67e87f4ba15908446addcb99986fb2bcb87119aaa8e56be54f78ae7bc05b6cadd286a1d364920781a125629fa558ef082a7dc3f95967bde5e4012a03ad191b231dcf2eb8601f566c9744cf8fc2d7f9d8846d54bf566a68c57bc9ebc6789a6a34d35804c18451e9a7454b257c76b853b62616c169fb0958429222d8fb5d87b1470f88df2e81e2db3c56f1ab538d1118d0ca2f8577f628ed9a33cae222ccfd658188d0a592923600cd8e35ea9774166655990565b78c642408a8ccbc2ddba6642e8df28341146bb41240f6340f23768bf932ef6f621696491382cc2cbe2bb8a33468a9d12790d37aa04a2cefb42ad4332cb75d8af3c39c0043d9918e09edab26d4bd991a2747b2ae41e5fead38f02c977e1ccaf1d07316b41c86de4ecb821f52f3cdf3dc1258026ca937b35e9075e1336b7870a8bcf02320f60850cb4172b3d6de3dc88559c4260e48c969282a50dc1927a515e31655009b93dd95512ab1d6d586f1018cb89ffd0d1d852d87bac70a48d4020417b4ecc7537af80549a10a15344203ad255e0142a42171683fab2f373d9f687a5056e72c256e778b3653250921d862b860ac91686cf3332c872ef89702a53dd06b3d6d3025a7ce8afd6b4a96abe4030605d46e7b78e5b9f32e21a212eb33d7638af86d07afe3c3485fef73af290c9639468f1153aeed41d4eebe8a1cfeb55837a6d33c7938a1875d9c0b17167ad111d7276432592db03f54ca5a7429417456a348bc034505023a996b0ef9040a6982c252d338427ef73e56dc4e2c1b353747ab963ef8342299da28b6a2386b762602ca1a7051f5bf2c1add753c75272da2955418c8ae4fef00447fb839c9ba3b9b0dedb9ac0999f65f65dfbdc41a5b402bb4d1f06063d4de837cce25a07d740e86586d9aa1a411a30648dd172440c4166a8b3040b894ebe056913b73e1962b852fbcc1b9163f58285375fdee21062402c2b617ab4588835dd2a7e07342289022264dec301794e81441f44a1fdf71a63d3ec194bef08cde8d5e45dcb51f092bee24db6c81fbc94765949aee3fdbf43b4c575ac7ebc0bb8541c26593a62c86477781e9571073cb4d162eed57ef04970dfc8d9a0436481a5461b92307e07871970f15c804254ea9f23ca874294f5daa53b0bf89483da6221ad319b4d42c4ac741d69328d3d2227a8d6367c4259e90add04fe09f03b27d08f41d800bd5815441e396eb01f6aec116dc4f15c93e9960adc9236a28281da40ffcfc560d59db974abe918de466b286da46e995dcd705f499a36fe584573800e183c6989764132bd7b6ac779e45d7b87bb98215c13026fbf72e649ab7df491a31c632a83a341501c04dcb7dafb996556e824f592bef0428e8dbc422cb764fed6e9c90feda6db8a8fec0f68ae3b8a36be6b23425de838adac1c0f34a3ad2afc0d88fc86a1a40230dd9bce0944c055a11298eefd0eed016db2eca64540058c6794db0e4152970d61e5db6ca24f566075f1003894e14d44008a460930d7645d17ac46b6ac699617ec674eb119d704d4f197ee26326368ab3fdd7ffd7199733fe27708160a3ddabf587c18f87e07d062c0ad2d99d07155f724f3122e6ede5b026607579768424a3a03186fb47a29800e791e12888f1e579b92e742552ed442e5b23361188defd0bb6b7cfbe8742c8ea83c2bed4d6cfb92f55fcd126cd46dc1cba8928062cfe1b7e68464ac1883d19720dc0006f155fdb9e7dab84491568056b34e25c394ec702ec12088d9a2c8fbdb2f176098eb78492130962140260bbfae81c4179d4240015a88c1748c35751e3f223b5cba6d7966c4c93e7b944b3c653ca217024a5d1a903b38a788b78f2700e80a4a5089865b49da0ae6e54c9e32fedfa495a1337e789c25d15ff8ec2d5908b87010dd382067e4ea01faa71c3c644bba502568bf8ecca73af54984292afb0db3b80361ce79dbfd029e0796e2587f298c4e152b0a22e1533f6dee0164c49d9b81463f8318688ddcbbea7b8523bd3e773016b160abc822129745c26adc998c608903d87f3282206f19a9c53824cbee40213e0410b45bf755bccefa03432a714c695600791c4b156636d9cac4b7d7e3763a20260f016b9092baa064e29b5d48ce2e804acec032a53db2e4e69128e08603bc7830c58611863e287575aa730fd6ab56eced04213df4ecb39dfe4b2fcb83537886f243b4aeb5ccaf9f9925ada7ded0720945df935021ce9d907b900306f04b06aebfff276b4418f79fdb273d7dc813ec31a9dc0b189b59421daa7851923ebd88bef6858b905f7ee0897d02c997c713d9619b60482ab4b886fa3f962b36566b220976ab016b393d8eac9b95294ea2f12b01c1b168ac21b10d018d135b70a11d156116af2069e0221135dbe7b0a76c5668c7f9dae5e99d2c594df67887e4f8edee6be52e998c4fd964f51a00a00ccf67d61cebe68709ae5901f5c63baf4b75fabd5534fc4582e19da0ecfab016c48c3a413f960371068e613050d5edeed88135dc4564c087482988161ccae45ab36410919611110150b5c0839e53ca255dbf75b25f057f94f2d6f6fd01ae04bde292a1bc0ae147a75ad075087976d22b41e4f3b29ec98f90ea0ca2a9e38a6700954d99f88fab7c3ea2d40b816a8c088877752c0117a4c73c5941db4c0c49568824392bf573aa4f4fad143ceea947d8f96064f7a2186e68d0b00b57ed291f971fad8c1a9747a179ec341af650cb62ef59635130027789e90b099a2bd27a5b0be017229633cf96fb9503f21af1fbc1219692f914940b9154e4619ae613bcdd73723739bba93545326e3fe73ba66799bbcd020a87c029bdf0ba520046ac5dfc097e36d15e6739632a708d8cef30757915c808b0a6b41891ebc33076293bb3707cef4e22cf29eaebb5c9c6ab148753e990f84cc0de240878be2a1c6215b0f5367cb2e52a2356a7fe2b39852d7ffdb41d6fee55b3c904dfb304a2eb0bf236f69bc35dcee8f854dd31e8dcfd508490e4e6200bad664ca8b2ebb4fc330454d26d3a2cd43c0b76a3f2b89878096063ea2a871040d87186613f2142c8f7c3799afaf006b78f5add2e9d0620ccee55e4299e590318ca6234cda25cd64dabb539b9c83afc94b3bce83907db22b04c587a8fb253e539f7b5774167c8c6f874c96f791deb64cc22f0c48511d5b5e2dfc0326250c0544dd87bb8b3564917d6afb8c3ecd2b279c5730d8346c840a8bedd2c3cab9f67e52d68072245f21c3e01b25306c4747589525f8e396baca9e40831128fda57f2e60f72215bc20d629bee2c400191c0b11a05afd68d086462a785a8f54616643e5ef00adad072aae5bff1f98b0d9fe80d71f910268eacfa143fbe856fb4c314a7b76db855434f75745707b7ea70fb6ae9be72f0089aca254efc85f74f8a2c1a0720632d1849a2569318fec3cc116be6a5258484f7ee9d9697059fbdb3ab21e1a92dd1f102061382029e4302ed1acad673254e10cc9930d28f1a90de19c800cfb951a1b7e1dd6a5455f33b036e78610b766c0653976de41cb1cef771a47c086aa2963919aa6facc60e7837734cd536253f2609fbc42962fb487454dcc2dec423bc0b2e42d9476955e48a212e9b32cf8015809c69043c10a8a3ac7a3d14f8675d795710d560138b83aea4a5d6f3c2efc157ede73d97297c186454147b821907965af702c358c42f719b07af90fa56c41c293809973268b6558a46ff9070bc78c7461310658c235032c678f330471dc824c76421290587005e99e7539d9b05aa169dba194c8469301b30caf5a8eb3a46484aab26fd21517273f3f936d76614181b1b81c526a4d39532fd292e5114ac6c385dc141ba6e843084a2065d6a67de68f8c52aa6b992682a89f36cb54cbcc398437aa2a83f2e501705f217349cb90e1ce17b03f2fc9d971f5a6f2069ec29a5e8b054c9066cd7e4c37e8ecffe688c0ec9904bbf89b45522c8557a1134066a34f2a4de92558230061664c594ccb557a461a5d17d5bceb4c8c9259cca3007b3d1e573aafd847574b1db70c4b846ff64832d583fbf71b745231ae1b7e9bf0a61792bd9cf3812b678e00a147d1ad94a9c7d24e0822d57c030483b05ba4973d90a0cf8493462bca7b232ba82d58ac20b8aeea6773f3b773703e3ef7f8161ffbe3ed13c826ec91a0485ed4fc57023270f402316b291cddb0ee2d9dd8cf2816245d521903716ef185f82b771bcac873e96a9ea681ef38a43e71939452ecf0af530dcbd41beb9a8da1044c5cd5d40d0395eb8519866c80548737947ac51ef7ac7b4fadbe9c19cc5512dd3427f2699813efee982c50d0f679feb8119eac8fe30369c64dd8fb057cbe7abd79ce5519159c40e917a000e1b3461e591313b9b6cd68743d5d8a68881383773cb26f7a0cbb87af6951b37cdb527623dc5df9448f4109b0c7a0b54091f92c15a4cf401b582aa2bd82c5d942e3f2c91d3e372e148b654043f24059220f7755f94c2391f816a463f3de04c1b1cb39e94a05bedbe06d4262a2f19481680446e933516c1a10f68757d44cfdebf1273155d458e9700a8404bc46763e050faef79379e8c123d3104410e0c63c20924ccc71c9c3af74cb20d600f1f117e9ca7b48de5126b2339124a84917762a928eb5d503b147d4aea0b4038a5d1d5198bf73576ebee4012d05766153649ba7500236180ab87064ba7cf019b19a24f4d96c3b3daf9418637f2b1593045c6fe3409eb7ba287cf2a5948eaf799a2149f90efdbd3e934d1c93443a99deb47df35081f73494f4cfd899db95b2ca305a94a6bb5b96433adaa1917c2ad0fc4b0e7422a650303a7c8fc5b3a5679889d8037e51e7d38516a55010a37e39d4da4cd4ca9403038af99b6a5a9af2aea6882a0ad1cf0619b4fc0e808156a8149dd6e8a1b2591260188671bdc816464a3b8c6cb378b21da030ff070aa2c2b8c534627b833e14dd6681d4ee48ada71eec7cbb946de5fec3fc2458c9b88966b0a1c384b6a5b409bb00f125823a61ad0b2d5c05bb44a19d73145bf8533098e036d41b37a48a0b704c91dba23729fad71d08aec2b545a8886ca5f33dbfda00f9bbdbeca8fb5e69d698bdf8dc0c2e1bb4fabb245b00fe33d09097c130c029477dbb52dc9b701a53914267e3521920eee574f1042523ad03a736acf01e099bb581c13322ed8eac195c6ee2f4cf536862a070eafda155903435545b43f0301f295c817a3550bcc3f95f5ce1ba6274625d232f4d8b4dfd7c250d419f1b98d6081d2e64ef3a9ea870c7f17254b7ff62cf170806cdac0ae7d593f6057390c87b1b40f9416127630c222449a62e8935f1923775a89019bf8f14f8e627bc0f12b1c43302e839a4fd947f107970f869b1da72d2d162faac77332e03a63f8bbc8168ad894a0f8b23a117ee8b06eca182f7f1f3324953ef548afd1fbc03816d68f7ea2d59c725f6d5c1238ad2ea7a3b32f819965a2f5afc40d6ff9132dc9130ef8a94ed8aa2004b3d524bd1da4147b56eb80e9fdaac89e2d6d17daba244d639d9f433987677bd41989f5d788b139bc8549fec38a2a220a50a440adffb9201077d267177d988ab34caaf3ca5f81038c36844652f704ffc18ed331213cbe800d066f64aac1eadeb3c9d89d2351dc010a9bb7293110f1cd5cc17a20aa9e3921c70dfbde5a55e48fd32b8357c19668b524597c9512b7f78e656528bfd8cb0382cd3dbeeeaf90c6e3278047e677ccfb215e2a513f6da31a73a847e5650bf06243b2c2e9a3219a52c9553fa980e8ca85d6d8865dc82060b8da9524ae8a9765c4e287cc3d274cfddd4c497d70bec9ab441d83e2399a7b57ab1fd6b1f003411b88f5c89d37110ee5ff3db9c98ab004150d2decc45a2242fd5f335cabca58293c9062c4a960044d21444051ceee2d8d9c2beabc770614c5c2f1bd5da706398a0e84136397a4e90e40911f51c7eece3011e4c50d7f7f3dfd0476e5d9e66866166eee7264d6226c7d95cd8bafd7a79d4c34b489df0834f47b289bdfc323e9910f8faf8a96c2eced1f16c78571ea465ff3b705380e366a9dd660c31d520151d5b0b293b659284d1786b298cc55f5d9d265813e9b4dafb7b94dabeccbcd5adcb48f2ed884218a200ce51befd28773d3813e760185b91ba81ef2db2d5c53df46d0a1521bfe2dc88717c1d468ccc935e638a50b04c6e9b1b958380eaec61b140098da0c5b944d57b82e5a9a8e84623c1fb248e6ee3e98d2c795c68a5e5f1a5c603646c97258d6b708cc7a0711daf658a94f544acc2fb366cf6afed10012c444fdd6e2a48141822a11406d560f7463c760323af3bd62aa296b55ff655852c9091d710e1c13fe23eaa7d410784ff5d78498d2ce3faeb78514350f71e37bb62c07d581d9ab91001c93d45025d6b2f7c0860c554d9287d661fbc1d8825b953eeb3d12f07c1d5a6d24581d5a9d691875c610990e62e0b64b2987b1f6ad0a1d3543c6f91e4f06f665fc8c8c0e1b89d6dfc9e8d97b165e02578902009dcc6dacf3ed8d3e80eb0e52c826e039594f962b27ac3b98001c473f2ee55eaaadcd1f0879fc5b88752f61c87c2a7ec2eb517e6ee2ba42a56f8079e78de69f908b0cf093676e7ea051be4c5df68520a1660b23e9fdc86e796c65c4dd7365f7feb57652d7d833b385b1d3b98ee9b533115fdd78cd9f02791c9a8be6f15f36dea5fae6a91cf16dc52de7d185530692432498b529205d3900259058f3bf0cb2350dc6c2baf095c79ab36a7796cc2b521a654ce903e93595b65f909b8eeb7ec3b1edbebeeacb4bf2961ce042fdeba3abaa633822cfdd9dbb3e5ca5690bea3f607aaa1b255da232cb6e6c38e4f7c834a09d5888a356e90eec177164a60a64db1f78f2e06fa0d44e46452bc07438a6151f6327cfae76b5a3549f0f40f2ec6440aafd1ac9787721312aa3aa4ae5fd9d505281a29ce8a8d2835756bfd70279750dd72876936c7a2cdc84e0428cc2a5696d2f11aea05822d4c496dffb1dc9164f5d793044f406d161366f64396aa39ee45a6dd20f0e7e93953b91a1dc9c1c54db90429e26c4425c24a0d555466da2b32673b7be51dceac12b49c2467ff7ee169512768749499630f1b30aadb854f076c4896e561221cfe4146e8af68dab21855eb7e96bb338943c9a34edc0697c66074c605ca694e61d6c27d3a46087f8d609bd5b2b584c019346f35757e8456f388ccddd5ba761a147d4451f483e9d2593f1e021b3b19a3813d2f00f2d52f8a8ecb8cc080c804fa439e97bbf2fdcee992bb02013818cd14de7d0ac7fc4c159a6c17b638fc23724fdf895fb098b109217dcda00bc9bd8ceb1bed3c356cdbd3630fee81ab20c65b244d955792b68d8619429cc11f86993f473b03262b03d5c8b5bcef14b4674487e60dd64e96c57a2bb437a4c803205b5188311ac0504f6b0f24cd27532c3c258556a018e58c8cb970e5f7d85f4648c300dd21b18698098ccc4abca506a5c5d159abcc0ef5a77605c923aef5094059990f23b84b1981de88d63359a0c3e05a028b34d9f69006848a7369fd09044154d5cdd7ada83756d428b65828dff536e164b33743822a274e6d2414e4b921b1866b0074a5fd6360a7f11c3bcb40c17539ad352470f8d598d76b923de43d392f436d3b97cb1f8ec38cd0c5c37389059105a72a782a8bd8f701e9d046745740aabd2c5325813340d5aaa86863bb50faa1eb7cd81eaac2adc7e8f4c5969bc6b302d6d4c307effed4e107e01634283298737ced3c076de97ca4a9355fb3c6bc07326b40cd439bef6991a2053990fbb331d85dcf3bb2ce687809b41a0f3d9752358a2640092da1372863c2cb46cab30d38522be522dd97a8997b886ae579354acfc521591f5177467d6cc24fa743215ec5085dec07d52dfbd329cc5d0285f7e8e96aebb2f739fc4d3bfba762b4e9c0d500ee5c396d259c9a25e55ad504d45ac0500d9596cf471472c6497e1c80a1ef0c8d58946a51c0f6e12ef7078c85fc82939a8762999d052871e5853049284e7b173c9986dd1793dc50b512470f195711328b32c7d674450807218b7f7def34896b26e215d4308a575991fefc9b776d8168e3665c114b62507fcbe8f83f4d1b85b1abf9f0ce716e3b804dd810f86cc60a63efc6f47c261420f6ac429e7a6b225e8f01986caac0e4b1259606bcdbb887c4f40f4c3fb7226feb2d1a6640eccd57cf20446bb40ea84ea8e201b04d0d51a9f586ff429ca7ee8923181a2ab24a633fe28a001965a56868c22030d722806ca56d42717faeb754d568a976883e3f95046ba9249feeafe13b1cf53205a6c4b2d595dc589da52e27215881f7d46003e55b106026337967b1ba3fdb444450ef0fa6c1af7477c646ef6925f4db87bb805723ec99dd1e77ec209ccd5298fcffe10eb304a95706ba4777ec1a49020059785ef420cf9bff8cc1ce09013033ceb911735d989d29183078b397c83a596d60158f27403b384432f1b3bc7d34f3c7331cd08b4d4dbec4dfcd08cb5ca194ec35fcd9a7b6dd32a279cbd9859e71385f3bb03d0019e2f3ce7b41f0e0dc409050613d9f930d9bb2da0e8ca255a824284ec8d2ad779add20cf15a64be27c40ea4f7b4bfb46a98c885c1fc1b73f933901927546d1f928c6465dbe0e3fbf703ac991c3dee188b51a43bda38775b83d8a4e8815d1e600cf311263d0fb7b4f7e128a61a59a45c6eeb134cbc3d813190f544474ac1135591e47b8202f041045d8503dac2def37dc4ca51f50f508e620035eed010756c0698367a1924c9592dd13ffab8ba2871687ac35d430e4f21736b798f1987589792769240a9deb36cd3df0892b9673653e317850bc4d3bb2814d5dd4f0f963fc71a8ef8fdd90c707286963680cfd07ab76a22348edfdca849b142448084aca24fe65f6ab44f8742fdcc5d9ceb28af6f666db8cac12d0ff7d98366b88e20779f8d09694ac448ea05a569014d068fbdc9cb7a33ec250e35c3f7f8946216475b1e91b42c855984c7ddcc3fc1dbd8d51d06e2134f86e25123871a2d06007b8cadc5b6d1e81456ddbc434a1d40c2d491a3d21deab787dd5b55d3e3304aa24a874ee4ed83847ec0483d2bd8e9072029a621ce4b7af847b8440faf1f003d6626664b89ccd2266646e7d9b17e2cfdbddaeae9a728d388a9423da9a60a6e3d07ffde8701d7931b9b959188a617fe90420f08581a32a27277ebe4d63021fdb44eb06aec47415285483974d9d20a18f377461d934666537a2b6bf0bce469874f2ad4a6c1faf4c25f638b35dd24134c65c254269a62a2a926d84e375831a699d094494d9ac434534c32a52913d2b4f62323d8a000b79c573b96d041bbf2584235f4051eafbba6c6c70c50ac694d98d0a40994c136788fb0ce6f4943e8ae01baa538ea2e2ea422601787b4a86296fed0f1d6e11c07f1b73b6011de9dbe66d1a633611a93a631c934934c6bc2b426b3f9994bd0d6be31eabd427087e4e136411589584b0bc6f7401212b04f573cd97e71e00056bc60c3322ef5f9755372728f4f3e02bac2a06af2d8710d9553f2fe9836e600851ed9bb99b6af2fce1fb452a7f7b8fdb37a610323d2cc13986ca118cec237500ec3e51a0c5b8456e861d830b7c5e9d4263820d52cc181022ca25824104e970782508a7232f64c0d9d585a188505a4725ab51a2e2dd6f1945141da21498b8220229293ee8138671e4a7fd0a5e4f558fd8ec31673de8dc50719a8774a0854e5ce5c11f609e4fd7210c5b527173d47dfd0ebe87ce3ea677cb3780e0939a41f13424b53c8a55e3bde03c70a78acf81e91c69b990334c79462ef7bd33826a68c13195b70de218a54090d29b4a7cdcd812050d3480b07d64a8199e02c2a50d645348239c71371ebe2a942cfbc591a58523eecd98d3092687e6796f263d6ba7da176ea7189c10c223be6b66944241d4d44060840c80ee9c08ba5fc043eae05d113d239eeb567e12cfa729d923051554c294959601a8203b965fc89025fcb3cb85f90cdfa07c74c0920205f9fa4d65cd92cbbbfda86dff633cf52a3fb0c6650f372703b4ae5e550446d50c3bdf7d536c147e0a2201ef4c44cddfafc0826e45cc6b576f8be4cf932dd844426443aebce91535aebc99c41540b6df975bc568721378b265629996684640aa3550f7ed27f5b85816f7d355b8b0d9b68c55e81b1382f91f14528ab44ba00e99e8242c94eb205423c984e3b4f2700e5df4e47caedaba1687c388ab356c104c701434b458a7ba22cc41f1fce8e0fe8cb8caaa46553ac2eaea48106ae99f73c2d983a87c671c932558708ad6b41823841536ed9e178f2b6c481602a71837a3cc84bf31e75a1df7f4e538d14520fdd210675a9f65b951ca0d05d4f02c57bf10479b3bbf942e63b1c5767226093c910be0e41a7a47bd9fd672a94e417b1391d060e0e46de035c3973cd89f394eb8a741ddbcbb7b88328b7971120547fb246ae4d40804da67b24876062ff967fe424e103203266840c5acfcb58d1237abf00a8bd66c7b90ec4fa470c4a0612c08decf3d3303317e1f9c0dbac4eec552467fd8bf973e931f129042720dae61cf89c39f8bd059e2c3ad29c895a358eff5fa6e1bfe55cb259d0523480aecff73e1d88a2c5cd1b8a0923ae24e7369905620be1ecb969002f0ae96047e691c94cec7008576e7eadaaffcc28e51be7c5bfd8069c5cd170e005027b63994c14d6a7809c9c9e15a0bb1f2955b9818c3e915f369874941417f7ea8a24ab26af3268f4b8d62f7826382db2b939ad9745b386548460d8ecb173f0aae546c6494ebb7b9a474e086883b8e081650dc99362a3d97fb305ae1aa507484594b25bed8f14c88ec6c793912e184ddf741340ee28e8a4a0cb8402a8171e509bce57e1ae0667c01b330a6211fbd81d318b64f8387c0f4dcf0406430ce76f78d7f4b6bb36fbcee2e8c128c054f8803fd61b12714ff743a126f382e913f710a5b130ff948a824485794c181924b3d5adda1352b18f1323a378df076d49ac9e0076cb72c87917fe18f531b378b65e3648f3861b3c9b007b47c76d6c5406c091c559d62a6a4963891efdcaeb2d6b725fc74b4a5246ce8561ec62f3dfa5cbed41c58e1378e7245d11fbe40ebdd9cf55c94fd6982b4ac729abe0eb1ce07ecb29716b5d27a6204f60e04dc02597133aacd9c3cd19d684050cb445e3e648d66e0c26042e83cbde03d5d8c40f488ed1dc32a901deb0e81afa50a47fbadb6727d268a1932872bc10ae40538264a66f41dd7a2543436a8ae3d192cf1dab45fe5a2fd37d9adf0b812c0e6024b444598c6aa9d88c9cf985b38aa42823879a24739cc1534fc05f52a180c1c380ad91ec27afa61ef24366834e71413799b554534f4f7a1cf69003922595f63e398eb5d47b1062ee789e94738001c65c3809df5f04b99602719a34ccb307e3e0c4e097376182c2be5d2fc0249b3393daae4285fa5c15ce83e23f8fcefdb9ef42322b0af2d2682e865a7b50914fe9c733c40adc81da9ec1150dc7a5a16520b6cd59ebf1409fd16cd0c562992ca747f121fe31edc3580666e690107c00247ed98d81ffa470e5722450e4eb7271bf1328380e8273e8db6544c0f70403c233a7d366c9d2e56aaaff4ae1d3f5e35f81ab26390e0cb31285a1c0e144eed76ff06873dfa064e815d2f26509160f56fe3bb7b24f53416194ef8ee24a1cad5c2993cc4eec0574c682ba0c84bc70dd65a3391595036b5fceae7eee92de0b9ee311e3ba135764ced2ece519942707c1eab1c8c4c4635cf245005bc87f04155cc7650ddd170d3923018fe15573f7fce4866917e7d14849a2144655e3fe646cffd8e73eec97a7a9ccc74ed1c299232f37707f1539d7a793d96da4236e5646cb3be8fe7cf67177eb66ab887ab3d2d8f886f79279d20523342608600c90e379f0e79faa6670afd06cb43154125060446f43d7c850be30e52ca5a752f1383d0a011c2ef339da34315d4c8a88463936686fcc3aea5ebae6c90afed0c36d3f93f677bd4988789eb5624543b403a430b0a5fb2663e415e034051541bc1162b41de55b0f3b581c0a859650df6ef88b3d185d30e6bb34a842f1e17c8c18fa41522a2ffb3710cfa80d2fdf8316c5022e2b5a65e229faece6d7df1e952b7bc86f3ccf5730bfe57750951c30ccb36f40259a8a93538a87a0c612b7cb113362451a77b721f310c9788d281cbeed4084fdd3d4a6ff3a848e1c238cb6070921f853ba1713898a3df7b589fa0d6c90d0c544b1e5e46f7ed2b78f0409c85c2c0f9a74e90cd4b440d2ca0ac124bfd8c98eb05f98752d49056e12d95459e7ba01a68d7c0d6c7cce7cac5f1658648eacc47ddc3fc74ec724bbe10f3c90898cfb97c41b1295d8f510240d99dc5523ccd4bee04a7ee27c4a3b846c6f8a4ae0dd8a5640c302bc33f549f6c7dc39f0863c0c28704a12dae5433b86c01e478c6a440ed6d0762d1d881aed38c03f217c7a1f72ef00c093e3a347394478a113eba27bb36e4d5d3c1526801db191d713454b1827148d097eeb091a764794d68ab17e4b4319fad712c3b526c0c04795499f0fa793fa8cb311413f7da01dad544e40fe27db9b63a092ed0eb91d51589972ae73b89f03795e1b65666e4a22ef94e88f0dfe4a293faa32e47021903b4cca343a6608e546cd02a697baa543786a487936beb6d6a9f65145dea3c2fce1198908e6c5667e0d2121f605985db3c67bfcb480462eb2e165defc9be40e180688cc1a7eaab99a8877621448435f2b6307ee164ab32cd8bbfc40d95d5ed8c80353f5a91703ac833efe85924ff84df8cb59a49a42c113c5dac0e91c4dc77684d2390b1a2e3b30a12fac364a14f43f807df3353b41c5aa5746383be2d96b70efd51200bb055afa5f79a6fd7d3ea144bd5cc97056ad7665cfa709d2cc56a4206309db95eeb249e0d7b40bf5328b4e0da8e4c5f295fee97a0b14f9cbefacfdd384b75ca751ebea1554195d07f7d53413e8fe46c1a5a7eb9f3e54f94cf53d80d4d493ee86464144bd1c874603a9c5f59ceb1642ad86dfd8575a63c39a2d65100d74f4008ce0305a824d6e8a2d720b44d4547c8c2b21f3d9758b6c711f3cbbbed451e8fbbea685fa3abbfe8638a33ba89aa398ad5d6f01687ee7e09d75bd5d472308137a8a2f9acbd4141310212efac89a5081d676ebe08fe3229aa00d00548003ed6806c2a15e0393d58460bf18c9e16da8d8cdb70b4cefe2e0c26385661df5ce68e346e09178c822316564468a98c17bc4a3395c4aa0c6d4ac6e3a5a5bd4f96c132f40cdd0af14d48a4d75fa5696ad7128525c06ceadcc79f18ce0b144a439a1fca0048785478af09efc3da7912aec6ac55fe504b2b301c70d48f38f1e457673a990eb67263abb1c2975a7e7b39f13379d1fdf451bd957c66eb4a4998899b5f0403dfecd3d3375394a61b9bfa2b16e0ccfbb2fd058471df6e9b11fa13a60891799f9fedf1cdfbd7c90fec0db9eb5307a1c9697d2df7f5d8094e27d2f314b296fead018ec7228639ddef0ab86b123c08659206aa56518668e7960f78e63ac83c15c8b159e3cb6b4dc2dc6fafc0a0d8030792f5078501f36944ec77216d95552074491e2d62d7fa53ee936d9249a36e1f191ff58cc6df17d39d1981a8512884f8d988700b3364b431c5839cc02cf1700330dc157687497cacfa52f5b8a38a1dd2e33586585ad24cd6d3b6b54002d5af83d46cc8c30a0968bbb836806b5ace0eb3c0f5d4a49e9b8a528568a61cb4d017d39ef35916c29466511587c1714596345124ab850b5dc353cdf4d5b00a6ae776da03b4223d44ec223ed68a751754e228ee8dfc0cb775fbefaa0efeeda5f700e33aacfb5c356b13b1a35602334414fe107cb0da618833f22a804d79d171c85e839f8b99879e22e5fc1ee06f0049cefe128dc4087176573cc5b02af6f828f6860193d5196b4c6d3d19b812935dd48de37ebf7f39d792a753b909eb4fec7126dcdee7deceefd6522ecbddb4c99ccd7b206bdb8b66cf033f75acfca0fcaaad01913e607a1db7cc6168a5de32591d4a0b274042ddb28a88a71e0ead88a38767ad4a9338b8cae51d4f7c86a202106b4043e0b603031384b410f4467ed54df95618f337687831fe308e292db42c41200787c6d271616c9fd4f80bed7bea25c4fc0acecf4732c2911b3e9caa36ad9c46a566edb29611a4594f5955120c8925198a1f40288540b1e833177d37f97de516023d68ac7d42ff7abd301115ded0c58dd3f1000238fd39dd2684f4c341a680feb488cec1c26519b80c59f69381bc0437c937090b7410590d7f05ea020c02a5c37259a76ee13f6b6651aba4ffb6c33970c8b664bdec952b92d88bf7cfca30672cf1d2ff6f5288947e9608ef6610afd182e00dc866d44ba6d185094f01af2802a53f8a69754a1217f003f56a76311858a4f349815825c472a5472e88941d0516d571c8109668fe16998d51c95270c006d8d0c5f003700557b8bd8a4bc0f88d6be8288bc4d4af5f0b1e705916ed4b34f2278267a8699fe8699eab7809d58fb78182d463c3d454703e63de2569474f863eb7421194167749144f9cb142a583beaa8751ab68b7b9966c3ca8d5703f71d16ad7756b29ce9de9ed34eb6e995fc47c93d729aa28b3613faabe2946d6c2d30fab1ce1a707a4561c28e70146d9ddf45ab614141e43b2ed874e25758e27b175a05fd23b3db4f6d3467a959b31f43202d34507fe667528ac82c39b20767c29e39627e90751dd47b2c03e2b30034748e5d3447a30715358e7d54f3e65458947b52af59a6f59446fcdcfb009dfb8f7016f555bb994dbf2378a2c00ea6d2ebba01d5a9b30b1aa9754c7a2d9b6013e50bc09296785d28829774ff4a55bcd54cddc33730a76e660d56adf22072c15fc1775f38e7502ae0243fd1b470d48d865f7f2eddea89c75ff88c591204aaebeb88db4f4adb495495c426a91ce5ef20ba6695782e202336bd80588519443844c676147e05d2728ee296e27956cc16946a4be7d2ceb3975e4734a7a4f14110806f299b150ffb8a6a37b28ddb8acb3509035920a368676fa5c5a270622eb2e09d236bac8d2b7d13a28d6abeb484efc02fa2edebcbf46d52a764358e51c6666f474d4a0df671fc93e96c34e8680de52c41f3bea99089b2590a4a190fe92b52a5db2103cb3234e32bdf621a7e9cc1422d0477d8b660263cde3fb78d55c6399aeaf406ae988935d495352565d2911717a04e3d8fe92b076aa59141550ee19641ff071c9af107cb6602ca9df8606f38866e04c1e9adc05892955ac895ce42f2861dbb7033e3c51c143327406cb1d0d71af4d024637952b22f16c3021f2e5bda84a49a94316e3dd1bc2be674cfe7cbd16352152ecd72cf90255bb7369d7126fc2582bc1c6e0886ce51a98359a45c0487a03840c9c830ed2643232cb69d76b1d1f79658be045d45fa3b3111e0375767533d08f0d98b50d7e3d482bbf9fd0182a325a51bc441abd45129625535362345b8ade2c6b30ec61b2b976eeac158e3a254bf0e8c1a94981ee9c1a254a93e8c1a954be9d5c1b851b994471d8c1b3f31d2933173f1c3428306c6e3ed723e36cfeb5f8f042ed02940c200b39fdff31490ce7a0cc90549fb05af8343597501e135800be1d0b802acf7d1b92252a3524c6d3082b98fabb589428a392cafce75a93708228f99f04398933e0d54cbe36551d8217c450bb4bddaa4e1669a3fdd73e7754ff6faa72d042fd15da880b1d9c35b6b04d9f3428c927112705a00ed6d9358296fa91b92cde1d455e95f7c6e2ee74b16d68b405dc6bad40deda2bad0a23163efbf40026ca943865e578e0279a19a3fa7449efc90f8b37ad332bb68b427c0c37e3e947835aa65be7122650acd172c1f230c6f8a65d61d69c50cda177947051a83729a19555ae16b73e6a5c713242e07cc340d671759905b091338c674ebc6798b23592a56635c611d09df3a64b620651929835485e9a42a275934de6df2794aea7a5a9eba14c3a44f8dcdb4614ad73d73e7ab6c1a21513671984ac94b4931a9843520ff3b0aba64b1eca5e92f782a5f9872ae6543008a77a6e97d0f44ffdcaa517e52fe1a3891d1bf34b0783fbae20d731bdc4ce80332a66c5871ae1bd94ea034b07b074ea624f5787480e1a5d63fc680e8074e5299674ba0587d5d8c169522d5a36270802810bc324e22aed40ce672866920a9cc62ba876eb8555721638cbe61647cb4c52a64739d4822e1b5056719d84347dc5d3b1cf6b84ec4d06497373c4d0183fc4379e615a1c9571e16679c3c3af195e2f2370d6ed22676c3d51002e31ba2e82a02d5841a880aba59e5ae131001c9ced0d1b0c139a3129b11ae9702e8d86bba53d0d73d67c7d23715d8e03d6f73e479e5e378de4b41c3f3228372165d4cd77adae085544aef6b7bc888f63b970d200a32b5d2dadf6bab0b209ab7f6ba768e0e6cdf5ad5efe2671d8974b40b3f226c6f2108ce3889aae0bf2490b55534f388672f24fc4756361267f83aa6d8cb4e971c4f96aaa974d452cdd07f263d67935e195b155d740d587d88a61a2472768f82e09792a8a2274b1a0d46985b8a975195b70b479fc98168afa1913670366caaea430f8fd7bb19af948d54bc7220e0eb3584d4bbded735c9dcaeb0c7b0f19a15cf1ba4d3d8ebef142b718dc2ee6861774c9c556d2792537228f89dd62c723e32c97f91dbf00fdc56837c2329fa6dd95e89df44f01b51038cc8cb42baca8bf852828093d4c232c71ba463bb8320ab4b8226fdee255bb4438ce81f234927cf7f9d3bc03d5517a5aaf7bf7be3777664361f70e015399defe4d2a2b015e0a9c34a82494c680c1797ec4cb901273759b0dfb8de52ce6a130ff0cb5ff69520f46f5f8bd83752f0f74971dcce2f474dde0a2aaf5821059fe0d79de2341c6df897dfc4266398081a29416d72c1cae054cee37baab788fa785b997658713a3cc764a0b7180dfe70df3167d2a22e0228fbfe15179253f245c8dc464d1dd0f8eeaac81a3d333dce8e215fb818ad3eab673f41ce26f76b7a15ffa6f9d76617ee11d53c7302805fd4e814a36948d42441650ce08540e14e39f3e5739db18a6bcd5007024e2d4303a28490f660df62ad20d717efeafce2c7439b040002152a602dee7f279d990cfc67977de39b2c8132ea1a28ed3a9fdc596cfb7873a49170b47d007d27392f5dd5852a2c918009f6043a9a8e9e10e4f1169088a64f09531fdb895b514bcbf0012096e03d54b5d73f750d3d22d1374ac83c828664029705aa6fdfb67dbe206216865b8284a01da57f4768a2e12fe624fb9b1df39fc4a98c0553f23e094a9c68579ab0e5a6dec041063f06e0978da89e2c589dad4dc2a20b354e4187bca7c945ebe1bb7a4bfdb4574803255c80d07bfc458ab00a99bce1a2881bdc49d906132c419441c8b1ea947dd123e267d1156b439c19ffd7ec182ddb7c4cf5eb4d339a07114296f2bf1f18b24f782276952df8e6d907736a99cd2796ee46b47ebe6c384c82933d0531b907c6d5cfae911640e52a37257d50363154a67f7616ce11d7d9be1e9bed1a40f6f49a1d19c0fd51e5cf944b173b9db5e3e40ced4ae953a2337d3b994689522c5b69dff2ba8f260b5845f16bb63b410ca6594979009bf98e10c9662aa23464e3c98f6d0b1894466ccc53860c18c49ca610d905749e06bb066bec73203a2e6126a6e8e2016474b34ef302c7107e25f90ed2b8e0fd20dff7f751996e52274327e2bfd1d8e55042741b9f161fa43aa9510ba85de9c8073467b09584ca3e885b2a2ec61e57103679b64b0e72619be0157cb8a1ef1917e4aca3ab0e677c6448a39507d1047105eda22d524541c4f016812c1c07640ff393c9908189e2f0f293f9c6d7e59d50c69e392666528dd871d6a9e9522463cf69302e5cc17974b73f7f7ec70803bfd0accc551d59a1285cc8a93e99ba250701478160c7d1a47048820b9e0b256e4852581c97d682596d88389d1ec17db3f0ae24ac0865604b113a5b8b118ff757a567b1091d1c329a075b5cc086e0751594c00e9b0f1d8ed55d12734e1964779e9c0e6565b913adfbdcf65e0d8297a282322a7122766277c8b75d59822b95a85b7418e68b08ee1c9d6d9745409769ad5683532352638e8ad5a90cbaf6ec84f5415fba32b493897ac491e75ebf40de190379869fe2dc3dbd5ff19c8f1d02bc52031a65d27c59309032930e33d02fb6ee4a025e66f14ef16fc3bd4a9de522828122e8ef02de884382d2587cbcfd22e12aa1e5961c1d0500055cc3309629f5e6a9bd2dc0a32c06c1abbb84d0509bf7ca0f3afaa17de4277befbda5945bca94525807cd07c507ced2ad7096e3325a398de3b89b9a753d382b60b8311df7d520c17598e5b84a99cbfe398e4a0c5ab6cb5462b8b2f9d0baf3d169ddd6553b936559d66ad9a0ba610e1b4dec6007d585eac29396a608086939827372ea154b389bcc4c3582a2bd927fcdbc8c6774f4af9957f2afdf1ec8abc73703673c1c323aeeccb2d56a857519a594765965b174ceeb2de33cbe5d6d8e52d78da6fdc6719c0685155eba1e93d3b4b060d7a3fab071b7df5a18b6d9b89b466bc6ad69dd75c60363ce9c81a2a3b43ed56efdc06de3ba5bacce878d0e888d5be34a6bd5e05c2e106c9a6ed880260fa04c1a2b37015106b8bed63cd7d8b66ddbbc8aae49cd0379f72b2fc841a1ad696ae5b821bf1bdd6ac530d78dab56dafdb0ce7ca19fd8f5d836ceb76c8b18a7691eade10571f1953b7fdb3e1f21ae077297cf9d5e90e7cc8ead98ba7c6b2685b626355f3ba15ab955c7d548e30d3938ad1734d55e501050163b21bb8262d3acc870d46b7df562bec6338262697e562b9ad4c45861c4ad9d10eb371647bd20192b70b85b2714f3dbcc56b716473ded091b2f377184d295accb4d1c71824b7fb35c8dd7af96d7a4e65daeafe1fa8efe55f30d754058d4d04e4848cd777704924b3f76979b30c28b3b63abd00377fb861c9cdfc3afcc67200ed0b5b55a2e4e7b9ce77ecb6c6cdc8c275329a594e37c64565768b92167612dd6435892d282c35af618b758a577e429e7ec9e734ef935dd30e67ad7c3c69d737e8e41d96aad327294ed3b03796b94652b45ebdcf9dd5895edff976ec859ae7fe584e4cb975dbcf1bcd68df33808febb5cd6f2cea5dfba49b2f4c396ebbb71d05d6027017ff58bfb3ee67461430e28f28ec65c0b91e69a9292184861b45ed61a8b6e78237e357660d8be9369a434caee963146aac94d56b68263a4b49b4e4a2926b5ae4b36c6e138e7a9df8198333f8c3c629e7ff3ceb46e2d66d569ddadfd562b0b6d599665abdf3ca1fa9ae7836fc6c4c4c4e47da9d8b62ce36256dda43e3f3e55052d9b65239090791a141a53ece9aa18ab98621553d596794c585c2e454649a6b13063e92ac6d25573e366387b695c59466db21bad7badab1d9521f75d7d9b189b557d9bac76ddb67574eba8747536b80362637bea63aaeb7bfd3c7a990aa90b5e76c26283bbb9b26cdb326dcb321b2e66d5556da3f4b7a71acb8bb73b1f8cc6a5f4f3bbadbcb0bb1fdbaf9ec6ebdbf266bea559b1611c46f39be456deb6d1c8b176addd3871f540b1e5655f3d9ef1b8d68f6dc5acd37aee84809cc6eb1a1c8e0fb65d5df6d928ac07daec84328f2ff55ab548df992742bf9683372598a0753d980b514b0c165a532d1ccc7c2064480fe65233464d183420642ae87ab07035a2df467035166ed7a37e3640b6afbf7dfdec481dc1ed20b07df5e086f45bfd916d62334e9f7262d96f5c29d56837a5dd005889e06a5f48bf6244b619ee20b07d7663654219cbeb1be33912ec49782e058bfdd065ed87758696caec60fb65baacb2be3b1f2f2913f890d79b1c9c2fc3e45238a61996ec84b29a65d9d74e28e3b89855c762ad56355c96655b0d96c777e368d6ad3ef37cb050fd0ec49eaed5bab4cd56917513c13c9be7529a08e65ef2a498337947f6d3556723657533e23a12ac93347f5211baa0b8f3eb17dadb4492337555557fe11d7d63647cc5512cb2442d0ab861639c304ae789481789b30f79cae5e72514600016182ff62176f919aa4675017d76b42fdc01c123f028823cdaa973f46c6f524aa9f6d313a27f025485721dc59eee12739c9a87fbd039fc7d767640b0cb51973eead2c58776924f7bc6eef20f823b61448a41708fbb96b0485cf78f48aea5a51803e7f0af5e440183ee553a07940db78a3f877188eb0fd53b34a142621d2f6c44a289b665e30c0efafbdd328a55ae62f4715ed3fc49acd816b1c6b0cf9d38e82f43e7f8e3806505d7a3105d9a861bbc4af38832740e7f22a082b81e79b8ee71062bd7b5a81843447227d7fddd893fe96274b8617cc2b2bc678cda3c042536c6f1579511cca5b68533ab3da3f6b3f3fac5d146eb8aae70e7aea694546218865521f99b8dd2566163f58e38e8df45b58b76dcb5837593ee81bcfb8cd82b6cc85123c49e10748e7f0b617d014bcb705d8bba20601d37c23afeb68b0d39eaf28ebe4edfc53b68fcf858154c6ec41c73fa7d9d36f63d6356b16dab3dfd55b1cd6b5c6071b1c33bac267319001e74323b58e71d3b4dbab35d577f5aacb27451a269532df353cf86dbb24a2977b4b3f911e79c42733e776c5913c3d2b8d957afd2af357b9a65d9d3d73c1bdb71dbd4b2d5d75f7dfdda578bc9be7ef655be34d39eb07c994a0e4c6ecb418c629d0f1b402e3b203656bf0ab3b2555857ccb62f24badce7621d7ebe02e986372ef69c65cfcdfa9a4d655aabb6b167d3715b362bad55abefdaf775ad52fe1517768bb871cd3bf8b2b49a9457af9436d3ac8aac7a380e3e55c6d96b5e759ed688d4cf9e663473aedb9e7adb67b7d66d5b75dc96f986e32015a29a9b85b2f1f2531045f7f61757a3bf7dd7efdb7563eaadbe7a36ddf3ddba2a9edceaf9c5ba6d15c3449427b74649c1a55f2bcb56cfda986ddb38ae6edb36c355cfef567f6b5567698f710135e81831a85849a205aa1c9260afa1e70a6b638f27d1d083135acc9045173ec501d004c5ca910d8e48a306464078d18222ac502207a688d170e50c576eb9925d22248ca00295850c9c98909a4b4c3145c31054a6c8420a6921b1a14b080f49827b3d8cd858e420fe62fca0a1e7f721fec8cc5fc89125d0d0f7b3e3a00e3b438cee43416274291a95541f20a50c1836fbfa60d61407c5e13d0c68020ae2c4850a890b276ec83971a9e186ecc474438ee22b2cc55baebc711e76daa2eaca7f2e96aebcb92ee771faf1733928e3b71c8c0f6007e3d3cffbb36fa57449997df59338ae7c169315b45350eaf899fdddddddddddedddd241959f1fe7017500fd04fd00ed04fd04fde00405fd00fd00fd04fd04f9e0d8f9d90902da19daf9f9f9f9f9d1966c609cb66184e53ef9ac24c93e91fe609f0fd07cfed0e7f2ff38f845ea03e4c3efa0fce233d7caec72f1463d208efc3f3e92fa00c5707e3a401c3882a4a448885f23cb388613175ab850fb8539248794e060ec8f0413a44a70300a31810413a4824cf8ff37818412a44a20c104124c1821c84d140951267c2921ea842f5f8e9020f52ff5523773c9ce4f505010a7219f2041419c7004091234e434141444c6a020403a82826c1912b2658b0941435146295bca2027272e48d8c90b0e1f20291fc8c121f9413a1c68c89b5c82434340414d432da5041a923f3b0eeab033b87bcb26d6226394d169cb952b3f7a0487611886c59e2fbf393bc618e38f8e18e74f894989e5e78a0f16a02b436294314619b5603388a1a503e771062512146cb942c9daec6dd69464932c54bd58e56a52adf4b124a5274c4e3e2c496982aa72b1efa88b7da5b35b534a82c9806158ff5c923172e2a24409f7e9a020de418654f117e26004f20e32a44abfb76ddb369c3f248810aee22f6448bb0719e2433cd8906be2a911a69e4cc5209c13bf8a7fa1e52a9812dacec596788777b1a3d853b1a4d843df1f53fac0c771902b867d2b8a0dffe58769e11dfe582889b821967561853131a68b614cde63a9b0a62ace83c579b63cb9181046442d01841137c4a4666e8869c1ba84d8d4c57ed2c069891f8cb8dcb91776e0fae3684d980c315c7ebe8dc3a763778c1d638ced1edd5d073a60107178d41162dfafc3fb71304622fd3e0e7a431c9c3a7e74f8fc62ad5ff8a3c3c7c1a8a30372e3f6fbe8f8711d3f21f691e0607cf9edf0952e5bf01618681efef1e30951c796a62bbfd0eab848aaf3f4879263d7e031ec31cea747204e79facaad5fa2d9cd05014070610b0c37fc2a2dd2588116545a74c12e3b69d1a482cd15c1e8de926d7ef8042ed3a4510669c134318f6bb96eb2a0722d4b5ab6b8f2b253165311065b96b6eca09591c59532340c86034801f1c30ed07032e3d54bc880da42090f4e18ed50dfeb579faf949508fdba820d19b18f1fbdb07e7ca0583b7e45a6072c2436d2efabfdb26bad3dbf26fd41d98c14151521b9449accefb0af9748fcd54a4e3913b3c99bd1e8be7dd77d616f5e671ff3f2352ffb15d1d2e5ae478c17721af74530ed5bc1c62d82bd0788643f9f48f692c3b8ecb3e7b2af8826f3331ef728102dcdf7d145975987f585f393cf716fb99fcffdd6dc7cee99856baf34e2304a64d9411968a40126ccabf549fa75445f24207ab53e8e39f4b9078ab248a4cfa10fbe45e89d4fd941f99b27bd1ed86fdf6d1f122ddd307b1488966ef645b40f8d5cf9ad203ffb4d7a3127935f11ed43fa2bc4db2404adcf84684febd3dafabe22315f139b2a2c91ed59fb6cfb6e235abadd6f33d388c4b7f9915df928d0bb42bcf2351c5456fb0e73c3ec370a011a264c1833b2a75fa87d616dd27aef9a1cfdabf5b1c0512f28f2c7957789252dd77eb9bec4105eaefb0a190889ee06e8a54f74bdfbb1baf49310f0af973e6085bef5a3df0af1ceef2392f14e868d71c219e549b7b6511f7597d89334c3da554561bd616d92be149fc4a5e84422f5e73e38185f36f912f64d25f7a1e97ab4c1e6aa75bafb4bf738fffac5f6872d97d672f14b415e141ce9fa0bb6a4586524e6c4af4a4ab1bf56dbd573273127be91d8531565b0b5684bb2a11f5101f28faf358ffe287328e2c6faeda520bfb9dc9056e570e34b8f16758ef8d56b8f56c51e9a24ac34e4e0a228b89156cdaa388b527023d40d6946c38d7408d6894fa1708ef884091bceaa2737feacaad55a974b861305dcd3469cd31f41c03996b0c3c03cd8c770fb8f66221ab73ff4176e3cc3f6c7d7941b36152347fc95f58074db1db32e22fdb91cf46f49cb4921d9fdb1fb63b70db66606dd92f5fe1b4c58379280fc1ce9e548d7a9e8ce877711f097f65b4bac524d12a932eba62d067f6d4d2b163bfaaac9b6694fec11a331124197d8336c98f698fd26ed19d6c891acea868ea5bbb8ef5cee13a071f941c03c9a49e7f0e7b7018211c1dc53e86e9201c9562424df691edd529878feda28c794e450515d05aa9d1c6c621d5f8273302103afbe6aa23d7722f44bfb8eb0f0ca3e7712739c6c7f2cc2616ecb4e08fba6960e437691c44e70439f1b9d4c70312654ec70a589162c9644f1e2318e682083872e7088b2e515820bc06207505c4840c5962c5ee18e183ca0200c2c54bcb0a2c48b284a92249878e194250cd42be4a833c268a9620ca32d9c5e2177b9914b164000b1c50f2c00f30a994a0b932537fea3408b0d377e094a3c3a80792a230c521549afa20be4400e5e76cab2e54671822ba2e6d7ca1b6def848a70599665da6b9f55c165595667c70e16d1de07c7710a5d739bc755630595594eca5072fd7d8b113bd8aaad9ced1c644cb18ac286b5e5f2e122e0ba571bc6f5d5d6d8c88801059589258d0c254b689c923445c989e7d4cf5c5fdc5a5ff55bce13bfd6796badadfab99c9c3c87abd42b9ec34e52ae9792017b5aa252c8968b8ad2e431a82045aeb2ce000b666b0c4af01445c9142c633c596285b03c03a31930f11cbe61b54d60922c15275f3041f9620830486950a162ba37979dbe0093c6941736c6a1bc23667e25b0b5df0931873ed12bb4d951ec017daab72ac286f6d2194a8005924ff7e773e9b37ab0380851d5e5353df982325eac14d808e439f42ba5a12b08380228fef30345207acdef630e7d7ed1b7d164b3df623c7a37e776972c2996e845f4f2d7e6a55f42ece1d7a4afe61ddbb327fbbb8b4901022338483f7b1ff1fbe5c52e7740a2df98aee3348d2f370f8bc423e21ff3abcf3c9b1f1976fd896ef64457763ffc6306bb875fee65d7fdc6f9fbf52f14c1f55f7921765b765f0fee878cf5354fd66cc841fa6d24c43d4d02cea14f6f6e6868c28ed2a7277c253848e9b3926c7cae959ed8ba28d6bbbb28b6e7476f59157b22c845d8d8632302f7dd77dc67b9fb5c7208c8411b2092880d907ab3af37fb36101ab9d9f3edee4776b3cf0608111b209a7cedc3c93e308875e2739e104f40fc29c4392290cf8f8e26efa2d8befcf2fbc624157979e4c728d451c8084043d172edd71ff4b7fe2eff16a1fe08b67e470400434781e9c4195714bde6176fd43efb4df3a23341aaaf89407f27e664dfd9b7d15133f19e20b700fb60b3cf3eec196ef643de53bba860dccc8c2c7bf69e2c7b666cd5a4fb98241bf651c7653622d0ed6909bca36ff616e01df3b3cfbe75e0256ef617e89eca39d9db1cb8c2b8d9739f71b39fde0eeb644fbb0f8c3999173bc19b7935e64c1d70b28f084605032fbab31a59d652ecf1197290555fa092e2392bcbc550ba5328622b984a979dc278729ba9c8c8490c2d462cd9c081dd2267038b95027ddc38e8feacefeae05ceaa6f90d35bf97e6af8eb0ac5f296159931d64fd8d8373049710e7c97a70585f14eb81fc9d27fa571c36acaf47bcd94781f72f88a77e400eb29ac5820189d5614c31d090f3d800617d7dd637c4625a72d0e31ff4fbe9135dd63c627d5db4d44bdd87b551b029d236ac27baac2fecd81d572cd6c7fa78593ef3366260673ee419afafcf08a0c83ccde7b3137b6c44a0f99aaff98e10bd68be9dd7fccd59ef5ebc5b8c2c7f1b19d6f716bff3062526294e0dd5577864eefc969afe9a2fc3f239a1ee6c2ad91ea55cd9c4dbfa58e0fb9df61968c2ccccc75aad75b9fe43f0ae62b02c2956852f626666be0cebb336a4d890b5581ad70d0da6fc63bb6e1c9cd373e6afbeb0765f58b9afc88d707032b1926c7d16c1d59d0896e6bb1b52e36bbe23320718bc6a7c356ecec9781d9c7f3976436a9ee63bd2801c8e945e351f770fa81fd017d4552536bcb9d3b58ac186ae28428de74e045be33bc252b0e045f3559aaff98e34192e6ca97ad17c2e2f8a71970ab66a6487e4c79c1d0759c660e587958584f5e7ae87c7624c1a711ebf0dc3901b5eb827a05075e577608a0d4bb7c75ff231a62be59424aa2ba97ec4305fae47a34da906282e773d86e880db58c2a9244be95f4449679f1fa0317cf0898a3db55aeb72fd908341dc19ca860c3eec892ef6cda8c9545458b65039cf1729377a1835c4eee21486d10ddb4b95174d4c82e1d44e5ea86ee46a7cdbaa9fa436a42ca882833694b051c95dc9c1bea2641b0b2bc9ce2f24f27e7c5038c141a54dcbe8f713ee8b4a3eab206cd8511d15bf6e5f58adcb15d22f6a7ed817557030f688377297d91609110c522da4808b1ba2fc00c62b1241c142e5052a74f024840b5ef13b2a7e630171c41e9b21ddaffcbbef6d84f42a06cb9ac72c859112060ae70595d20e1c511027c00112123798e1051377714314a92998f040461620b6fead999999bbeb5fa8816e41b6942d5190dd720a052f28b844c1e5d494f488c86e39e54507445e7f157847cb8f4d048cad1104a3b30f37d7958ffe4215aefcb8142cebc44ac11e97d2cecfd0102fa45c526053158fb23da437ae4aa50e5beccb7d2deb60f4625827be94325153483732c79a18656871fea649c94907494e3a38729a023345c66df12c39e9a00901b1654f8cd3821525b98d9403167441353331f9478d74c3021bfe0871042c44d8a11f2ca5ea92d44bfea49ff4937ec25ab2cd374fece3788f912e32e227d068f1c2491fc93eaa4262c23bfc717ec311efb34efc1b206cd847110ae7c43fa2c6e009c7713c31127b4ef866a4d890bb7819609df8fda40753c2b04c395569d1d24506fd842beab2e586edd4c5c90d3baae6867d450a936da4880b2c871b71b821771fc09e01dee1df2d270c9b327688734386fa80e6860c2563631da50ee7b8c7391ce7865fe3039aba2304d601e1ba043129312951e8a16aad430571dec137b8fef1098db2f96feea5d04328b647894ddaa39fdf47b4570887183e7c74b30e7f1c939031ca1881f08e09701021437e308f9bcee153d799cb15dbe5cf9807d7ce47941e0ed6f170e24d8d1a91bb1b7efd52e81bde5c8f51c628630cf26e4c4a0c0507592cb02143ddfce0bfd3efafc31ef368ced1efcf3be4fbff47fa5459531a783bc14589fbce1325a8c1132530a282891038bce842f5855297266e7043121724d86452c315601c014512581660860b527881a2c9061f5a471a9726a61224f57005951aa8d812311bae24f2c1a8090e485240610516451ecc138bf42f8d505a86cd15d4acfa8c34cad2982d991306444c212c861131b378b4b2450c6366192c61cc7cc54ab98431f312bf471e36ee1548a29d18b95f804344f337c511f41cc76181e52211327647b1c9671c8f7ba677b72ce37070004ba08f0efe500790d68d1f571f49dc6265e4772c364520b6fe25de51c43beaf75f6fc672c4e3492212e6f1a52f4ebc284d25f915e76f676a30b73f631ef24be7f0efbf98376513d14e6e588fae17d1a8245c91f0d2941252569d7a205c3f8a52485b92a6ae3bf572fd8b2f39dd1063c2841561460e1e7d691e580938873fb604ccf58ffcd1281b58fe102b8a2d256b459504377af8a00910c04c1470ee0d155cdcf06f20c10506eb979f8eb46861b931d2304752ee76f9e9e8c9e52e3f1d55b9e1ef78b1d930921e0eae0753dcdd5d8b2da68aede7af52eb018beed91577776ff718c4e65c639ca8ee456b9b3caa0884dbdded5e42fbe576d40d2dcdc53ed7e2a07f164564b90a899086f0c1966efc6e8a2391064cec2858d0d24a2468a52c5c6096ee69e918411075d90325ee31de404a1e8a9872ca1c48d9441118f6b1436d8cc32db01cf7608d7d38340c4b032b7ee306e340811359ee30e1cfd5dfa5059371fdd9bfc625be5fe806081fdcd87860c355a386a63523c3b231ab8edbb4acd289c9e8ace34de20379fcdcb1f0278add50362d0a1b8208b0fee1d391d1f5973dfdd2810571fd75340fecfd799a47f38eecb15873795eee31821b1235d940161ff872fd862b24e1eededded075885444e32a7db5ce5891e4c85ea1661281daef67ea30f3d388c2e7af016526e7f961db040638b2458ea0953c15690e01a3cc1545c81c51937760f208201160ac8a2801756e18f271eb80656725801c3b8fd5f16378000c1f08004565836dcf841a8082f5184e4aa30bfefec80b4eefc420e5ca9756715764009560d3c58f8d8a6aa1474526d157e20ca07d5a2c7a4e1b60f0c871e91c9017386db0ea837b8386aa5b5d64a69ad94d25a2bb5b20aaf03621407c434fdd8717b665fbde61cd9635ee41cd973ecc1b20f6b641fdaec0bb39f39b467ce11623f89800ef6d5a4b0d93bbddcf928c02dc261c0dcf0bb9997c20af3f6ab506f91065ced6bd699dbe4a4f3b4cbebfdf1f3f8f660a7a22457c797c58637f7a779f8c9280b18b6df9bba293656c1f2942a5397a7549122c0e52955969e8e98dcf8eee1b0c07227447bb0f219c70ecb106260f9c9284ba8e3c7af8e1d66e6975febc6418f1f8e143737c6f8b96c2b056eba2bf82dd25fae4c61857ab157615ebf337edfe935e0625f110e13e6ca0f080db6740ebe5f6cdd30b8a083bbc024ba80447a51c285122c73cea9044a490bfc874c890eb7e5a0ac6163e791127bd901c188f87c1f7ce717bf1073771c36f60d670adbcf4909c686d6b63c7e61cb4197ae2bbf255d5a9751c424e60af925c6fff7a6d5021bfe652e7ec56ed48152fa35c5dc8a283f7e3cb0f7ee1c25dcf931c7f895611d7415300eb3d8c7355705ec46770126277f185877b896f3b4cbc5dc3fbfdafd558579fb996b1566a4c2a738b92f840b599880f292841334bc429f261ea66698e10c31bc0801354313e612e68b17aca081030c53002962ca165c92ba24e580015193059328304b4b4954c00928282d48310115265b3a0cec87e8420b88f8e2441a4db0e480093044a4e0c88c2a5ac4292e537cebefee22f2deb04ea4611db7cc3afeec49f50e367471958677745fdec155687832b2f26494c49391114f463e3c19c910060c2e9e9258f194248aa724504f49a63c2531e22949104f4968784ad202195db03cb500f5d402134f2d4409e2a9851b9e5a58f28424cc1392319e904c3d2191e209c9124f48867842a2f48404a9eaa9c88ba722a9a7221b3c15c9e0a9c8054f45373c1521710ae325ccd477b4d11b2cd6610e4a2f71d29a812f5d36b8b48deb5631962533d3a2a9a9e19ae99ac89061c3039b9b0f40b8f1de17020e0002200010bb5bce000880030c800eb892d679280604dba999c46e06009cabd58cd65073b716273d9a5bbd241df830cec1b0f88326e66e3637dddd3ee0ee06c276b71bdadd3ebb9b57eff6d1bb8530ef8623ef0680000880cb3c7ee508207a3308aee42759077b4c045736114e61aad0248931832ce30e0174009823ce0d638c31ca10b06f7af4eb8d0c04ed83ed86b3e93c58d98871d91aac90999965a4a48971a6d59aa191a961d5b0ae181b2b0f3a1bee66fb400321bb519f7af3c342903811001e801600d7cab2c50f09db75053704afdf800414320091c3952e4888989e28828b2384d06109949ddeb2b14f7e9bf809198a39fe540c4b031a40dd9ea1939c27f4d101096947dff9478e68510314d56b7ef58e84800b262ffa5b6332a0724c4607e3cb7511b024315ef4b91b1275e8220ad20b74d1e9ddf4608fe0214c0f4e6162b8e183004598a31bb69680a902430515d69b7375fc6d7ef88d3fafdfadbb777cdc1d8c39fc1dc62c7a1e352cb604e26bc70648b7d7f7973033738c313688e33b3e9a8c076e460d13c8cc864ddec4e86a13488e36d01ab11aac64703ecfe8724a39a7f47c5e8c4e1965639cad6e9ad4bcec630fb38729c465437cfa000c88082a91f858dc3e8b6e99641c47b19f2f27d760127d074bb2b547a965f53d9b64fb2526a57489612c7b8b13932f5f8a01ba24c8609bd1e571d0a8a2f6606c34d338e23a7bb9ae546d17f5dcb40737e42ea5379786386864515d70e95bfaa5caa5ff692c015b2dd81d6b6f7ab061bdcdddd9bad30caa3be71933b8138d1caeab5e0c9352dc485946195756d5e04a337c28c309288b8a2465e2029ea5a8444db8843d09d5d04000004315002020100a8743028150281c6ac22c1f14000d7c9a4674481a0ac44190c330085208110300228000000801326333333500a7ef1a11df18596ea69c106f815b57aa1db56c45d81876c09da8580c9d380a62effd25408a258153efd89fc1738e2f059025e5f86f14e610fc021733dcbbfc6e5948711429220c2ea2d0bb17ae92cdf49880f5df394f8b09bbfa1bcbeb951174793bab3d17519723dbaa08791b184ef2fb5a7168b37eb0b04db1d6247841619de89d5124c9aff8e5bcbaa035c3e3bce86e15ad206a16913e55eb7b86b1613d426980b72c52953e235bd84e8a08b797c6d28dfe6902d913f50fba542892060451a0efd4ec58efc02e8067c83156154057016eb54874973dce86f3f1b8279a575d8e6ee31c730ce3aa3e9e25197d06b392d018b63e3cff2db21f6cdd72770dc73b24eed6287afbf48ee767466134c71ea2e814da31154301361313ab6898794e30efd68b6e984d831babb26e41436cdd6611fad946c76d90f592aff04953dbeea9991a1d4e343fde029c36564f4502740e3705841b4ebb7771869da155d70d95bed1293f1654378719502923876610386a6b95e1ea9352d85adc4c840f69beb410b4e99d33132fa871b8a96235af974debf6dde6dff3ea9624c11b595ce5ba9d9f38ed6a7f18ca5b1f2fa64a53d8d038bcb6d149cf9b55078c9ac7184aa0db49cac0294af212b7571f01ce83336d07c602ea1db5d0c9549c8a46848ff0de98d831422d2918139b2cd380c714a01a516dffa691525190b0a328e4f1cbba60e50ae969102307c021123be449ee5c71e29a134e8bd3f23ecac36da2287b036ccfb517dd3331539d540f9b4be637ac1052d7baf64de3e948f8c31f6b7eabb4b9d0fe82859fdf3c381ec3c83d2a771864db9345dcde8bac694ab1d8fda8dd5f3180c18c66067e5f62eb2c48753ecea81531719b7862c75b8dbebdb998376088139ed1a34e1b9f4f08f0d799bf4055a182878826b5d92a63444a470417ca95ee899a0f2ad3d1caf8dff31710bf46f8ba115c8424c899e6653aa33b2708236a730a3163c8d8d7741502c30259604be3916d3541c038ef628d2570334f86e808ab505f5cdd953f54f6adbc90c78146e54510b1c5e4135a81f920482729030bd665e50da0d0647960bda1e1e586089326f86f57cc1b3f8a075327601412dac60996f7b15efe6756a02530d33d1a2882d283d00c73c4ddaba69a33bd685ea7434d72f54f0bd43c3afabd4b7297cba1fd52928bae325c5d3ef2e08b4f44673a6bb21bb4948564263901331c6de6ba82ff65ed88565f5b9fea2bf4f74b7c0a961b1344eb578ab16b808dcb58ca0dca7ef96440d4f10e3fd582d969df0120a856e0b957927b95f9c4939f7de197f83ac2f43daef6a56343b7fe71a23e731d941c60292d06116e24b14e932d4fa84126f4595c7d76101e06ecc6d0b715ed7ae3f7230e1e00aacf65da7d7f25403451a13d07e43afa657611a77dd86de2bcc9ca1520c7c72c095a5c3b16b84829b4b8ad816ecf8074f4736a95fbcd2122b7307fbe12aa84d0e67ca2484c5abc21210122abeea72169784d7bbb1a0d55014b249457a50077270322e11ac8f06b234217510af0b2a02c744d17ffba398ffaeb52fa3039cdd269b2dad88b73b969b6a9fdd3eb4ca144dd997bc22f7d931669a10132cbb8a5d2bd1e4caf74e53f00b4f53e119f482e2ee646489766bc2c177f162780d5115b571a6c11eff91bef01c03ad1413a0f3b8b39dc6a963520e0329bb23d3669fb29f05527fe2b6ca93bf05f3eba39506a34188097f281b4fc7eaf464adb5da6fdf82bb406189dfd8d0a8a960d965e0bd550a069da17560e63c585106d7f36aebdc502d47c330cb7ef6294f5d90834f361856360b0c69fc340ae9f84a3ee3bd3cc6e231e3fdb1e84b8604bf0242c17b610abc73f0288edc150db15b372693706c081dad05df2e7f9b8acdc0c1ac98b453cd228b16bbe7584dd1939b9f2047bd11f04b1484a695e63a7d7fee597f028fcbf788b344b1a9125c9496120a5121ccd9e22040945fb2edf2e2af6aee1ff556586b21c13406352d74768c28c0736d0e791600d90fa3ed43d4081cca89e79cac45c9cffb98e126639ea17ded53fc04b3f93ac4e1e95eff4054720a213da5b484a54b5d8aa38a924430fb187a54424b974f9150ec40597ab5332e0011ef8a5cbaf0b46125d5c4d54aed933f3537296b7b3cf804502617376dfa3790f6d4c34486cf45041f8698f65bc1b302a3b06a3d1c28c179e3d95c02c2b60b59b91cdf8337052290382b28b715c058915f0d789d06513b5dd08db8e806aaa0413049f9c84e54b74db400402f23b96d0c36862500c8d66304025042e24986877945b61485fb3531eb7bd85851b1e9f5eb68868d1d2c229bf750f6d5f3524b9e1e28356c4b92ffbc89874fd8c6a1318014f729bce014bd209df93169fac6824f9ce8f05653c6cfa175a0ded82aec9a6c2db6bcd76c3834e79e83b81602949f805538131e1f7a8597f9605d6b66a0b98cae2b4ea40893fd61b0233f8bb2c00ad3b5659f850c574ebd0d4165e3dd3af8ac671c5010188c2da4ad8776771fcd50e32abed2adfa02ff795f665ed01567be4e998f583ea05e5920571b51b6b5e63fc44055cb1a73e3554221b426997d09bdf731c6c902cd745201d5ab10dcde2493f9d2440b1746dff499c6676b0fdc4cb60111b34d0cf9b21508387f474a4efa45d2deed1ca7fd81f671802d326262427a487c022b8c435f84f7626321d0afdf0a5fb982a8d9a30f6707f344343d93d38b13b7fd4fbe8b565e8547a13959160693b9b196e54b74cb7c15e17c820122823b96b080af3f18774d4aa73b7f3377a6ac891b21a9f8e81d0cdf6f56e7d3075b1cf7284fe136f545444403be0538c769365c02b902c34c8956eb6ec3390eb50a59c8f7f401a334bd27c48fca1e855fa4c355f255e23ba9c2b1c8c388658cc184d03ef99299f3bae707607211d103b43dcc862bf88aa7fab5b55745f4b3dc3beaa4231f44976ff929625b9dcc8a0d0544651822ec659393edc1462f14d1a57752a706d2c0b86ed394406b23e310ef1ebd08edd8c2426a190ee9f0afbc8be31cb65e608b02ce9a62231471a35a8fd5dbb9b9b3f40044a60f129ac506d37def079bbb6e6ece6c2baed5339b79f05ee5d5315617e5fde89e7fa12c82834477bd19fc90176683a3fac69f8bf67c7ec3cdda59970944646647bd1f4fb7b4e21db00981fa3dbcaa4b3f193ef9f651c64c87d322f25f5546d50530b85c019a17147b56d32d1a900137947fd783de3821708e6ed41108fd1ed3e167ba9d3576c5c4e3cf443e29e02d1dd3ab93771de904ad3f35c108b02391fecd5f167338a3e75caee77572ef5089b9861b83ab150ec1b2b8dc78a295bda292d2599445f1b385ce6ddccbbedddac67263961bbdfa8334f200d80517da9f2a0115d4a1ce1b0f28cc1d0731f4ae2f1e3c23376a678ef21370c3c531650e4992401c18cf8c34f105b91223854ba9aec4e6c9babb30c39552a1e95ddfb3edfb8a39e107ec3ebab0e270812d70c43bd68b83aad5d29a1f4086eff86ef130fdbe63f2a24e4117bbb8effffc636d702e9edc7c969547cf682675a7bf7a4befc51d5b8b7973bd69d07ad569a841b90fbf536ff2689a5e95eb50b0a60fa7070af5fbfefed90a2fb0a288a0a164e8c779f04ef5b11ca87fa9f5e6f4ef2de09e99f3241ea12a1f2cee351e0c58990cce284e4ce324fd737fc16383330faad4481f71c3451b38d9e179a3978d56f98ede01e7f2b200807233001c78e1a80005230fc8ed491be90944c850ecf934773c39f49ee7f43f1ba6fa511c9b28baa9315a127b6c437de31c8e838187165dd804ba710685ea873c2469618ab967ae5cb711abe8fba573a8f5842ae37c003b56bad8a6707bb7a362d2617c8899a04a39b804182e5ce7619f9036ff9aa360f00a6b599215506bcfc9cbfcd51c1155caf2f60963239bcc56080ea938e0798bb73c22e7f451f2c8f5610896fe0ca87aa34c036f186c3be9159979c877ee9068cc934dc432707e2cce480ab9d1edfa941964a1a63828d791ad4c4c6f034c614b691468a3c821dea91977f77851d1836c13cc1e5344d32d96331cd84621322ff1dd8365f36596321cd76e8b9fc2db490e76726669c49e3a6cc98a565674625f3cdf2f8e3b5307a93404979bd50f407ed17710d44e4219e2a5ef27c3f0978c818c8251eab8d40394eafaa4eff8f23a754b1d96c0c7a349239b9ecff4f2f1ccd8adfd124233dc26a44562ee418402a15c01949cc423ac45f08792fc08e0b68babc12e5bcf0cdbc92cf2103a0fe45987f05ea5c017bd6a173ceba8a53cc39fa5c670c5be786ce9566392fe2aa2accdb5c8a73d06434917d2a3e50973a862b180972b02c9eb2a045637095889584ec8fa394db3fea407710abf56d12b7bee73488326a92b4eca23238eaf698e277e379acc8117d35088b0981622c1ba17cc78ec230e9c1d3813238d2fc93b5fd4335da5f6e90c7be16b427d22579b33737f96258d9e0789b32809a2892b45b0a17d25afa2f67802e2e7bf5b2e4f4b767054b5a286356bb515d8dbb15e894f54e01427bfbcc73a3f030094fd7a99296905bb096c9e7c6d24b390f67c9122d479980dafee4b2b5eac1fd75b37636a6d956725f76e365881ae2b7d733612f2ff6a377f1d7722bd84d3c294d5d3962a44d93df00ed7ad10ded16d43f0b3ff63203ebe55892db0ae8daf3314e94ccbefbb1bd85d446c0e17310b647c2771a6ee6e1c61c3e07e17b226ca761661c6e8ce17316b66710beb56cb942d703c2ca529497080c8cdd0bbaaa7c9fa1e043e1d1f1ce6e9ee9e0992eefddf1180defd9e7991e9e69e5d91d8fd1f19c6d9e69e19d4ededdf01e0dcfd9e699169ee9dc3c1f4ce6cf92e43b9bf178e605ecec1dbdb364e9bd4048762f79ee4a6fb9be9140db4f6d845fe27b23b89e38b6e635053b98de25c729b07dc8d00952409c6e472113c2c83d71bbf51473bf970ab0c145c0fee8694601f0dcf79a60b8bc087fe128e35d14cd94416613e9da6da20e8f830573baab489e6361c267947a42afc64ac9070e13593501e1367c1724878a906eea41f31af727e33ded93c989e412cf19212fb8bed79c839d033ead2bc35ab7c4480649713b8ff17f0b8f4c2106111f499890b1ea25a1cec50277c29c6514a1ef870eea9c54e4776553473d1c3937d85007b54aa608c67945021f1eb684fd8293b2bc54c0f881f22a96c67833d7c8c5a485f92cb3a25a3667772c03c3e7d46f954fb1cbd7bf8e9876edb27c1331824c6ec7e9d722fd11ed63859815fdb9a48ff1d22b18a7ee264675971bdaee0917ac91dea3f4096a4a5f654d1f8bc1b565917abf127361e4fbce8f570a3286375732da769abbaa7f5db0d88a6bf02a0eccb5193c4e2635805fa1f02288e30489f0fd48c96ece0f498d259c7154f314da91f9086c0c839cc0e492eccc17b20621150c9ce6a827279ac0ffb960c250aa34c821b51653ab0e2f762ad167f890a94a414798a352d775d3c2654511f045e381ca8d7e27fca0592b65f42823d251b25849c586e7654030cba74b4b77ce0c5b0a5b238bec935a9346ba6867dd44fd45728b0041ba4ef252f1505ae7371017e67d51df002c77072a7a6992054ed1cdff07db23eeebabc940d0fcf1ef9806f983bc1fe65d420b13e281a3aa53acee0fad5377a765afb3c41a76c4d9c9a5a9377acc6ba5c21a08c7d78912b4d3910846d854ac6816dcc4f74fed635bfab5cf280aef2d9a4160e1cded417875ab2ccee65bcadeb71f8ab61372f8fc6c26dcd3f3e86d49d9f24a6cb2b10572daba6a1e7e4241c1de76d3e2edda407dc78a4af31bd3a5ba4479deae32c5943344bd28833c00a8f56d74087ce2d2bb99adef47a13c8d21e406715d71f0f7fea2284d3ca15dc8e9793b8dbca37fd119cc91a744d9c1c48930cba00c9b2eace6089f6b933e83788e382969d7751abe2746489d8dc54bfc6d08c1b3e8d2f212440df4d6a6aba48274d28fda2dd3cf711131cb20a8252484f4eb685275287224e7cb5388d4a350bb661067a493c423a9e1380bfa1098f58507bb8eea3b38d489d0caff93a238c940edce4f6b8aaf41e90b28f8ce00441bede0da2b5857a4ba94f6279ec1390b0a9bb6dae2dcc66b26961f28a55beab22a1aece17a22a49e0ecc03099878bdf393caabc83e96b8da105123ec0f703cc81b28a83d5b6b34ada58134a5184ae4e9e59661d3287cdc37e830a11fcc43b3224a20472cb278b2f8d5a13cf611579835d275cca69dfcf2df87e39959cb33ddf46e01bd73d2d4c9ace39576dee6fd627e6f55b147c076deb145a8379e0e6d5310acec3ca30b8b49dce88f67966434052d52f33d80afc14d87c91a72c7a9731c5c5dd69927ddc47363a7619169ae45fe89a00bdb908ddec223923ca3cb63b00addf59e44dd20f0d7d25e54291abcde9c674238ff5ff15e00688d6d0ae12af0137dddc354a404854bc4f0a63342a0bed59d292c73afcac231c1f37af535befe4ca4aed75101a0acd7ae849d741e945b7a4e486cecc87c65423a8f3176511c299b249819086b1df7c38bb2334ba3343ee7c41b6379cb54dab999db7edbd78772c615bdc92cbf298ad68ebe8f6a8e175fcf732bbf7f8cfc30253697f977cffc60862256d1e251386deddefd158233f0ab0291d1ed911efdff99bf80d1663f3832b4c51812bb0fbedfe118328f1789d5a8ffe50727214bef53281b4a21f1b962fffb9b40c20426bc9a8f7d4e1eb075044d222df27dc281a0e5c6b94a30a3d4c3b26c45e0dca98b3fcd34e524bdc5d79916043aaf2f812e5d1c14dc4a6438e94d876feb1f03ee9cd092dd2c4b542ab250b116371fa2d303cb645a0e138c2b47203fda86f228e62dca2e9d188f6acdddd23c8f9981fe84dece9a21db448760791e7e916cd39aaccb1c5ab3c1bd436e8ffab261bb21eb425ab81dbfe8ce0aeb5e9a89a6a842d0b640e6070ab1806c8136df5dee6052bf2b8a48e3a863e48a3f858fb1ed00e5840d9bcdc6d63576c20b861f18d753b487e69df49b92fa31fc77fa845de5b10c4d3d0026280bfb6d73efe55e2938e6a48fa8a9a1d738458f9ee599dd5bcb058b5861ea4021afd049b9f9bacfb08c9f274a09b623e0a47a85db623fa5a7e616841d53bedbe03252734bdf534d94367b397a6c588f9cc503b09577d490b9d50c7134ef972b54c982c13de9bec8d99c318c1ff8657b5fd37d217f702b2e711c197a10a9e5e6ed889a482dd5c3b56cb4cd8ac28a0d6c813cbaf2e0d88e64717388d37db6835f302728a6e363e605d604c13b9e4cd567a00abba0c35fae8d2175e16776e56953d495b40c6638723b1964621e303f0d6c2a3c3a6086b659fb96dd8cb70e444febe622c1229afb34c5fc7cad23a765643bda265421359c4320a8fd0c41da86fbf42025815881f904c61af486e886711025cce19aa00b402c094da985235f5529fc69694cabee9b1c54403fe45c7019efb9d8e5d8162355a6c917f3c42333aa08ea18a71c02e054bed44bd7da89a3b8632895af9eb5329d94b9bdbf678f3144bd24926cf2635ccfcdf6495a0c22f10fc3d6f3f8cfc8d9d5691cb014af0c31f348709b0c34e43c13080d3c9d414be7d7a1f75e2e1a36044c0611ea77ef4e62e22a3949362d71cc905bc8f188fedb4cd95f49186edbb2a71d562c7938083e12b35acaf1b1d628a925dad15207cb64d722e06e7c2c9b661efcc32180ed82751bba927a61c4b304ce2ffc11649b527b3676e90e0d14836ef89f336322167e6f04f4c7efc6860c3e90e3808ee4f6684efe4590eb2de0fd6857cd28816435c34133a31c4eb1547c49efc356125891b0565646f6f3089649bd3ae064728719166430242bc3903e9a86233da233e47820b67de32cac0069ac8882fa634a72fa903597914f549cd57ca49b927ce9c7910f55b05778084d72dfb30bb829cb5b8812757b07bf43815eb7985c41ec8c3868e0f52bb421d149e041a41752c9ba25bc62bd4cb55dc7d296347ed63917a9fd4133f1bfcbc524f362562eeacca40a07cb85b32feda2bce68c291f60dc1e451c589aad799de251ff1ed83fa06e9996afb5840809a6ce76d8d901d1a4554376c0cf02d21c38f82cf6c942b080f84cde502fcafe3ba6a23c1b714a022b9d7526bead446c093edf8b49e8b0aa639584b12e5f567978a3275b569e758d1fa598b5346d342e70bdd3e1efc76a73652acc51058c8225c41653367319165a81bc4871e07a574d3a05ed406e34202be160d312f26e2634524aa8f3bef804dd6ece0ee647ec3c49eaea60ec19d553e0ba8e12f7f8e4fbf0cc938efc3363589732dceb2cb303b91cbca391444a5bf1681db0cdaccf2592baa0f4f4a37391591ed73d3a7b97ee365dd93cacb5367a96a009ab28f8c117e1304b970debdd4c579ece257064191457133422f66290cc112ec671e2e28481201025b6ab803d41a7f4f7b1ddcedd60468d12a13bb781aaa6931820a2968fd70e29813590bdb95fce4798bcd2bf5d9afd376f89ffb055771e58cd5fc2b93b31c44a43df20e321714f401cff82d576db80bf5c52863f29d8dcb03617f2044512b63bf6043ce4df11ba1e48679a4d3567f142de43a8fcea723c8416a3e6d82c0885a7f9e148becfc4656a11afa81d35fe85f18893aa22119c80bdbd7f43d6081762d07499422f84078c0b19ec79f49b4190591b93e6bf7d9a3427610350cc0bfcd1d20a2916790c04d1d51849cd65631675946491ffecffb2b384bdc8694ccff56dc2ab183becd317d26395b62b171daf4c11936d3f0075956e50b744d98536f646d14b301c231b46152ffed041b52ff8743317f365ae5c0695dd30a0f36904e2e56e05e8f80db729493f039e07decd1eaa20996a6b2ad1d26120b1c4b099ed23696166f9050e8798a48b6d334e8ea13d69faf5bceb26e436a9c0cec3595b58cb0217861ec1c070f65c2bca696a40c30aae591101eb0caeae5e8c7d1d18247332387cd214fcce8f84f3ecb74e157e55b035c5f54d1eed638e221f3380b6ded315270bbf11bf2f2c435dd526e5a12b1c2e0ae11908f95cf174c2e551b69c33f73cffac24492c166f3f11a78600c36f888c79890a6809c9dddbac958952b15a617e142f9f1c4b0751936c91356df4995227bbc64c5683da805dea02a41eb60899f73624ee87efdaa2deaf652617ed3b7af2cbe98d3980e1092bdb1dc3e826e9ffa7de7c3e64693f25e7dfb7381c50bfb6951f9bde7e612e8bb5fab1caf9a0c20292ce170e205e6040e989f5829c45c518ba44a80615e5f921288b2f2257892e0f600f2a284710f75477dbfabcd0e3455e81b3a1193d4c9099e7385eceba6c3996b0db695f3c9c4dc51961158974b23bb8f76dcfeeea41b3b48673f609a9500181256ad7c3b4b3383eb327109907f7aa10cf9007501789f9956769a9b55f700e5f947aea3972c6a86d462ab3250cf3969c0e30c514d8f4ccdaf7ee0de33eeb0357168be86ce72f1c00ba5782c1f3613f76ccf0cf08000d0c7343b8187ade8bcf4788a4b97212ddcfd7578bcd5c9072b55403fdff36a1cd2ed992cdd212b28997af055f829dbfce7444b74460f1e950cb83b8bdfb059a75fd924ae50596d77332a199c9c71fdc71bf0fb4a789b743ac96b6611f9b26dea0c4b1293b4fc8505ca794bb5af759820fe649b858f6c3f0d905011fbe17bbfa4dbe385d36f81465b9bbdc88fdfb121f3f2549800080d51610c988b5e97ae3d4cb0c4294fc58e74e1cc86956a707e5582064440eacdd4d3ce10fa7a8e9aee841108879b1766a98a2a0603a7f96a29b86e021adb81ecd50315439cd6615f4e4247604d075a02684b88722667362b8b39f93836c054d624f854111e6839eac143ed46a0e8544200ce4181b071d28f8c3288a6b73d834a0431885cfd8ad799bce67e01bc25144ce0f8b2ee61f558af62f695a9a1de4fd70d85b7e061b86757e428b525d32e3ecb7468af5ee84514c0218bf3b82c6e91f25b41b63508564afe0820be1830f08cde981c27d22082e2ebb6e3c73949907e30651e1683d473b3a227b8e1dc09ab31366fd51fdbe49ad42471861e9c838c93c9115af1cfcff456a402e80ce5ac4f7301d87250b7bb59981068e781a5308b02ab45f090af5171d81989699e6478f256128defcc11338b0d325e2e0a8c26fe260d0a658f103c8b402ad130ea93709a1acc02fc034fb4053754f5afed5a08ed09fb05e8e26af4714177224688241ef37cb68892575e783078c0f7a0f96e262f178c0210a5f324281d0a13192f240bc4b62f9e1f9b6a0a940a6c0595b4e0acf993b020618d28f6064ac8e233b7dfc9a9660e1851d0b1c1e6c05236784980c517666e641772e5cc7bb3d0dfff8d9c0cd56da5b6b6b7568fab5765c951457628539da014061d6f760ccd52c1e3e394ffc19c88abf50a93e30e6488947f055f3d190c9f600555e68536159c5e3647379b05ae610b3c77eab64c389e37ae1db558eeccd21d4722286c1d56554c8f23d6fe0a48208276995051082debdc0307459b5b022f38da871d631c92c2b6020c47ef93db39a0746ca6fc99603d0cff51a0c705b6c57b0db7fdf8c48c0f65bd4db989cb0d794881cf2fa21911f0e214128e5c8f35cc87207678eb2a5d964c827e7dd98571ac6b75ed875c27d0dba1869fe88206e82a6c711657530ea06cfbbef1c5343a802173584cfbda721a8b5f261b89a878af97eb42d76de86d1a48b93dcd1450f2bf43ada18f932dc72c0e242d5a03dbb5c920e771b22e8cd3701a54f71e7895e6598a0b318430c102b12f1fb84f57e9315b7e1625f93a86d06674244faff2910b5841cab3107f5426834c078ec58a06ae2099975dd146d0c6fc24544954ebcbed0333e87ba1b9e77b4e83d643f813adb82e2e77f4ad7aa1b532bc29eba0b5eb6ad2a8676da219ea7e71f2421fc6107e0a87536b6766ab281330dd0b6b800652f4ccd1f737f0cc17589ecbca4236927eaab58f3230e7368f5611046030b2069eedfdf2fd9a8557347da0580df76c05d7efca52c82c90669bc03a46259ba4b9e85330cfebfc3c0424b3ef33b64feb80e21b6145cb1ecc48b40593dd3a323545abb2d438e2e3f9c9885668af97c458ac1ec18cca762163062481fbf08db1cca65f9a06adedce01dd337d8df1c83b7b3b699242f7865ed8bb4c30eb3c96b58af89b80aee6bdaa2ee2d36bf064bc3316c55328c50cac9b4c4df1e26e0986fa2f06d12815b60a0bc86b3160cd2b0adafccfb4c34ed172ef1c2152b51fcfee151c35544ab980507db55c778bddc75279c246728c9fd0ac853c8bd17ee2c4c382e60f762b85a50763650d318e960ace1f231105da2d888d941df23f8c39a64a1e2e7c7948e90a17ee9c855436381b3b29f9d4973f46294e8fed2668f00b6c2ef80fa2ce56bae81e1d36ddf98245be0d4d33ec84f033d988f20c33fc55ff69bb5725079a08adcac141dab46715b1556f555f4025431522b2ad5d7caaabd3b78fe8106e89b4fc3af44fae8c9c80d23d0448e12a8c280cd8dbf666550c85b7048d086370a299a2c4474002994e487845e856286b03105f091e966740f3c3649790cdfea9e615867ad8c2cd47a163df741aaa6d2a38915405bd23724dbe7bc115d73c686629185894809ad5524bc9dbef14ca5ee6473132f4890f123cb48d7b968c3a3cd3fd45875e02f075c85755271b74d2957ceabcae6ea48007492077f5cf3e36c09812eb571c22f1e793a8732eab99d3c1df502360d48d0ef8caa9c3611f53722b9166046c30adf93370e19da31b396ca2b124863a8fddf7841435e2c564b95ecfdeae3161eaef14ba5f6c3cb38b608a902d173e3b2f7a0fa0abb0e61f9437540b0ffd5a683ad6a8fec257379daf503b3d145971319893e9ac523467fc0691fe695bd4b3a20bfb3c8d75ef8d6bdeabfc2c0d0128c21f6fc38b04d455e8f7258ef4bc25064b90b99fd3f915d0c7cc8fa597661c0658e6297e1a1e0081318b5d04dcce27ca952a100178fa8bba4f665d1045893710698be512e124f9ec361a824cde126e209fe01a080829f0881018ba26369158f2350debc501b7f821f94660c225f929107370c08990b53c009e8757d3144d7726522cb9c00f00059fdabc62cf1e30dd3452e6fd43b04cd2c21a0813628400bda817e83834726945632dc850137bc14edd723448603b3cf3a080593997652afde4b40be23fd37e1584637a513dd47aa8117b5a1843364aee06b058ce200e6375a7c0a1b2569d501cf9927a0e2f963eeb25f276700870978a62a4ea7e702e2fe4e24307f4c19e9117dbb69c7ffbe53acbd4b6e2a0555062b947359d01c2225f8eda7c1f8c7f5f5bffa307ca26d8646efd158661b6def531130e5886e14d258e8e836e319cbacdc75b2f65a3253db54a1cfc4f0ac9103be78813f1a816ca036b4547e6491b7d0ec098f1a45b4b064f914688420502e75c09926c1479408af7f279c02ab1f177b7a1230094626ada3f5c72a198ce918b3651f0ae99f751b0fde9f30f6324721078eb24dc6eb59ad4d349c56dfa61fa21b97670114f3997c067c1c1b12c52399f56289125c492977ae29b8b92f4dc8ba8f085cb1dfd899f9acb0b970c6b87d1a6003c83e3bc13e0e4af519d0dbfb5331dbb5892994ad542fedc90d81592d4d6515ec150cf85f9669690010ff4dcf919c01d562ec214bd38645ff62bbb9351969eeec5ed2fd1266a974e06e605eb67b3cb533fc7056c1550222f58481d0381c76e20adacd5b0575965c463b7b46bba568a242f4d13441442c674bbd6300a9019381e654876de0c9fa0bd1ae4da0ec712292e7766425d2e948c1dc8d3fdf9844a3985d69d43746bc944bcc643d3bb0de37462d879fc4941498659747acc08edbf096073cd849b27c03eb42668b89a707e8d6558acda4831d9966002a2a8b77b04976bf3bd30fbe65be7cb3beaf85a06a64f87d5ee71907789e6df81889db5f830f4edfb92ae6bf0c3f495b82f0200082c89d939e8199d99aa454bdd97b6e68caada9d0efd6d7b073962f233fbc62ce402fc49f951576fd2a95491cc09c75052285d9aa1f62325912932450ee05daebae83587d069fc5571b0f36c1c8e42012f332ff2306086d8c0b93134c810cae58ec92379af49f5883ed786532e4d4fe1b3f00476c576ed455cf8006b301380a47364919689ba0b8a770f16a707de2b67466b48b2a108704bfbbb0ff7355a830c8a72e08667368cf9b3571fead71dac84c24ef8fc4ba077ff8cccc98101fd2467be0bd53bded879107377d6ad5d3d68d64d2753f92179e8499381e745ec991465c98f25398854cc039088f6e1b1e18a5fd301a4a261e4138a44140aa0e8f9a138f64a8b8e58e3da756c8139410c2f5d5074027f0c5665f3c0cbbb35c7aeee1a21b6e1f51fdb8b5bcb3d3e2b8c1df582c90da7570ef7e25ccd390c70ce3225aa5fa9e192c25a3bc57051017655d1e6674b91ce0a9d907d8b2588372905e9f41a6d2ff6417f4ae8940820de8bed1283d279457eab0f0747f7e400fc458a736cf3a90911787603289ba3fbd9b69aca9161b6e6ffeccb64f4b6924175e5a187dc35f9a916969894083d4abeff37ae953a6e532604337718fc955f370d47c2e7b257b30d211d611b7d645bb963bb7430c85b547ea68cb04d0b9df8315a1411d220d636c1b6521a6f78b2b610f050c928416409f6e78f3159259f0ab8abd392db93e556275ee0e7e76711c8d1d3d83f6d1253acb5271e057077d5a482ca9c29d22f1869eaa12f4041ac34fe61b87df19ab1f8dc9df0f17f9ddd1e5071422a98ad3f187cf2e8dc60014efdf232bde459fc94f1b34ef782c3d188154e7305516114271ec7220a75419d2ed60383bc3771066c84691301820374e5e9be299959923d3bbac7014aea9cffd00516801aaedc11a234be70734deca204456e1dc2bdc06211241c0ee10db5007fef7c0bd9b492cf6fa88a97f50d5274051aaadbf0bac7d43f9056ae6acd39a82481219230edc4aae392853c08ff84febf064c07e61a3ce6d219631e975d55011254bedfa7b0331b655e012c064319656748a7daefc6719c16498840da6cdeec862782dc1f806c4ee7a0be8a6754d164313f01f9e73f53916b197ac25e803e5fd4f51111a4b4bdf41249cee2e92f75971060e337a48fcc161908193fd76b4f0874b6338ba9211d2ec4d300e0060369f7379694ca19b48df5122e19a46efe42a4954efb16ae88053eee82860f8fcbc171d03823a616ad5d0172b9f762f083bbb61311d0d288e1a5574b8b234f24ab1cb4d098a700c1a84ec6724fb31f41b5506dcce6898a82a079968d1b92e7fad9a1cafc22a3c0dfd808ffab28a8221cc6bf39b97ebdc56ea89d19f2f23c8da37975c8e1a884e85cb40e1cc4dffebe8d3c2548c8d58cdeb5d150176d2e6e65693ed846cf114fb807822f9a972df01b1549ace8c162ff481c3e1de1d54883510d7fa66d3b989838651338ce64463fcac1d38713526fe3850cff07bfe86a0a368b785c5459848a1ac5e4644dd682ca8fece4d711d44919336f140da56a8eef5bbf5238a78603fe5abfe50949376c04bc2e9efc19171f9bfcb202a2055b0342a25b2c6b27c004b1586836668a00483f291d210280a4ad708833a61315d2955c6a6236c2a55931f54b09c654da4ca140dfc48303db04889f2606d0cde551e25319de3186bef4b09ad77f786666e72198a851bf67a72222eb4cca27901eb366c359675bfbaad828a52efc6c8743a807f337f519e70e905ad7fa3fd17a2b8d5f53aeb185c8fb85d8ced475c1f8ade9d916a3558009cc9cd645cba0b5bbf3f677e014aa2b8e99fde6ad06ccac1bde86dcdf3597e6a0435e77deb3de6edfae321cb94480f119e10610f1735a1b30dcf5b1d0f608c4cceed9a43d917dd3b4b05e53855a0299ea99465ca5dc174b5fd49ad5364e2e11393f3365a66f24a0c43b34f1acf8e4a0f9cef98817b379324b141d93e7fc13b155e8e12d1bd9fb7c7e266d6d7fc211660fe70e0756b42d6550863435cd22c36b3e4ecc3c1d0f8d265fea9b6dc061eb958adb456869d552db2fe934478195436d12b7d50d1ceb38fb3415e39b038d98b4027e8ca1c837ce2a661894cae60badebd7bd5dba6c18d70d32e37cb929dad699d30a643f1ada242b5d60290613d5a40652b08994b97b24c52ca1bd5aab72ab876790217f7d6744b0215df01dffb9afb4ffdbca211731cba64a1f787bd4bc4a52b29106f7c2db8a1002d35eac7f8045c0d1e9639940a53889b473b015f3e908b5302e1aab7d099880447d6e592808e0e3f305f29983dd3f926caae0cdc5d40775d02eb35026a7fd532a9801a7eef0bb3ab214420ded9a75637bc259b63315cef25a435678e4995874f2dadeb1fbcc3b03e038ee4f53e24805c65d41bfd1a57e5489be0dfa56b7017d95f844697d77f2931390c5ce54cb9005b999c93a58258a1422ea22a4e886f1453e8ce59668b336097412c5746f6f9fb04f1898a3b69bf456372412885a5bae46131d18eceaa6eafb754ffb1c1a63fc3a7465613c50d33de980e42668935f793c5d36ccd5dbe0e9258179ec7b4d7932686ef9a6e31e31ce3c0789848793d91569b6735abf57fc4f8575a5a7329a41ffa68271e10122c6021b8703b6183d04614fc5ed5f0ec9299ba83bb47c776b7fd0bdf43f5cb2f9ef03aad1b7d911a0bf8bdf153b2bc94aa467ec0efbb02e52cf053f55061f73dec14a6474260be5bc06d841b2fc2907dfef6141a7d1cba4374019d0080efaad576975d71d674d0f1fd456770040ee8a37113d49e920125a0eb5a7c0ffc4fff32cb66e3a57919089f6fcf81813f7510ade96cc384c1d3afc911b5ff4e55b4fa9407a6b426428754a24f1f33babd7362a5ebb1ea1d704da2ee276e53b3300dca24c85dd1eb691aeabdfa371ab230b5d231497f7cce6d020cc5ffa2788e3a022f1d721efbfc534bd086f259f4751803383b15a6e568da03de0707f9a6157f354551490be48af60abb617d98db389b62f4238adeaa45e9c383daff179c15ba1aca219d27352aceda8c2a1f1c061e0d71e731b9a63b466e703db3f1b07c946cd29830d4c1ff29c4d5d136efc8db39f80cb617dfb6595b39b3556b693a9bb654a8b349def352f7b2a425ca3414eaea8c09c2b87e3fa59a1de158b8a0021bad76af4c096582b70959064430bad4bb5f0a2acb493dee90b4f9b41c2f8b463141d5722a3ddbc45e990aa5b3022c474e49019d54ade6e7610fa7edd8061782bcac0a9d36942f1463cadc5b92cb016f535887ea7be26d476c4b245bd07c9035a79c9c54b62c56ed70932bd0693c56622dc69d021e41e27e995f248f08822d8755f22b44472806d450bd9ee44a1ffe620bde0a20065332e4801396e9c74f70acffafec01729974f8fd7a10b23cb901dbdf26f20e778002641bcb41fdc94f3608c5e07be2cb9d89449f115b01dd5ad2fd4e02111a41ffe68f7093664d3096dd38b392807ecfdb823243540d55634dcbdc310eece53fcb80372d35c8da7de11492bcfc60f68e183a53daa7ab8c98db05898189a8dba88119a36676508791c115be58a335f29535d3bdc95e0cc8994c943238735eacecd0c1cc0acbbca5ac433a5bd001f538a6b40aba9b592543f02b03d740eb8785e00216e97a7578ce6a89b3e4ff861dd3e2ab4d0814e167a456a0d9852a62c0380e1a85d62ab5a560cb854162ef02648b3f24e4ccbe1f9c3daed78a93e3da913e8eebd6954e0e987260942fc1b7932c5a92f225ca1b4985a0303062a68c16669a7bc1b8a26d4c65df9574e78b95236a84da31cf8f53fb9b8b4476bdc15924ee22329eeb9adb60dcdb968980b9898669347f32bbd1699796139724b95b0b65d0fa9dfff248542d025d62c53e7814abaeda8304adec13809d0850598c6471dc91b373cc5c3abe4c2c34b1adf69379380c413b551612754367c2e17f1b948cd9381c575c536d002930b866d61be00bc95d99ccc09ea138ce46b50d337b388e0261d67c7254ade9c418548a476d6ab820385da8fde485cb563cc480c05c29f3ea7685422ca584b42263a8309e004576d93a0f80922de0409ead25b7c90cfda7ea2a7a0c006c303cce42acc7395cda2aee214feb6d93b0726220173ab106ac1b8e25235a73af15c1b793dc5b4782315afe87125d799f8aed90d0476de321da5c6b665f7e70fe079534227fd74a81dd440487b49e1ad1f51b5a81f400b80896fd2b6c7f15628acf20aa5553623a0922f94ae07951ad3d4bdf219dc9490d5e3e492c7a8d6d9158aa964e02d780e1ee730675d156cc52440e5ace6af56e2589d9541873e8bb3711ad3adc6a724c5b9adfb312b4612cd976df3c7fa1b5b89a87525f9233bfb9e7d949a806fb728e6bd6ce0d31006dec2cf6fd928ee638da5000c33c6e38fac35cee9a393c3e8e89735a0154687a67407fef0a0c16a62eeebf6cecb3a8de8b4d43fc204a2cb3f452f716bbf07b317cb58763c1210c07cae2f5213a6093a412da8ae4f4c6349fe974b368018a29e7093c4d4db294ab12e531d44496b7a9df87fdc5d28765862cea57308f268b56172f5eb1acecc94c1cde1b07e4b064e3d2b3fe2856b7ae6be407550e8da896937d05926568db1716b2780e846c80097590eacace621b18ea1422f3201a4203ef6015f7111e0cd27ffd4ac7a09828c50856a104267f4311b90edb35a4b3ff3985cfe43838b4992ab5bb5af068b7df480cc32bc5e9df6d759d2d1a6c9fdbb57182458c5f51b48ebcc3430b7e91c654116b213b7407848132734374c6e21fee4a70e03ae2769f4acb8e413b2649e28a6686bda8a27f8d41f5f048cce606b25ddb26a01edef0b9f4469203f5a95362b205f3c62a5503ce445936e88368e45250effa398ccccfa59999b01feaddd33cb1fa177cc8d9c27d46dfcac73bd167f16455ae4d8bd94e315b9822afa320fe2123007cfcbe10763584c8c2313ad729eb52791728eafa574c0379b5b1ac3eceb05389b0fa6a464dfe9bd04e54edddfafde7887484b8ff10848284f92e405f8cf392aef1d36f6ae951f6b9102ae2e6a5ef5d747184d3792b0305162d8feeed04fed63d06af2b3c227def633acf6551d01b07dccdd6d1ad25caed6717367160bc13efc32055cb0be737eb991d6b1abc480327aa1903f7d757c0ae899390d601ec12c3219f3d9a0e22ecfb70a947d376272865016101f1cabebb1d03fe39d8c7dbfc8928e9a492b8ca420f83e95d2ee478af2b2961127a3e922ccbd50e3a26c4c51093b6ac6be96e76b7e0420429494ff0aa48380a053e37590caf10c049e2a93c9175e8336e127f972a2d51c42a27ada45c1a302f4c2c01e5d8c093c454b2e6ebf8b888c016c2bcfaaca8c208a7205658bcff32a72bdee95c3c7e78bc03c4b95cbb4b4ad47ca39155f49a3c02ae4e0d1fb9504fb189f391aafe7d8502b0865237deb38e43a2bad10874e252f94f9af50d0e2d6cc8433cc4b8dd00e3c2518739e89f793c6f8515c4287b898ede3bb6ed496d290a7c4a9741f1f3b91c55852fb296c4637eb7dfa295308d22d699de7a719c1d0d663ac7c5687e3c18834a8cdad0497d83082d9d5a0eff66aad793bf1dc955ca033f51da7ddfe69dd116be9a640ac18dea31f297760928b95f7700d67f7148cc99ee8f4ea6bbe749693cdb85cbee27037e60fbb12a1081c6981abccc6f578d2d88332a93ff135528b1156ef5aad7f604f869086044f95ecf0b83c6f592b66a9004ba2f86909a055139d7ecbd25d12784e02df9407610124945d6f2fdb6a83b58085b952c063b8229528c237c6fa0e6208a57813462255e08e926cac1fc9ccc6800331a74b4acae35480287aea372c46e0650200fc7958cd1670b10aea234bc916b5a081a08542af51cafa8d5411d30408f1111ea82aa0cfde443e1fed7b7008350329f526844dfe0cda28fc05daf979b2a9ffc8a6cced89a61ab7be3e83b0b480bd7c1d1af4293a1c5ea46d671ab044662c03accb35d06536bc781c4a228b937ea59985b98b7600bb4717bb324a8028feb2df8084a629a398452e5c4172f3bc5302781e54714f7c807c31d9b36bb85f9a7f0fa8413106e2960b228b8f8b146b8a3d8c1fed16f078537620f65e0806f925467335c5f6e5acbc4eb62e3b5f7accd93bff8561857c8f366b292d4eee74ac920b0ef31d805f9044328441557db0c6734b6f814364a6ccd116ba3f0a6b2a0a397fbdf1b7f55fe04205fcd638c23222caf140ce6f655a7d76fc57c71265492c47e84b37c127d2869bf514201c1ad186ed5c6bbe3cfc2ff3cbc0bc1778c2d07fae3a0dc911c4db9a4e1c6ce0f85fc97d1cb72a34131e84f45a2e8df9466d7040aa6e22b4f24ad302b3a37d706e8ebd60cd661210278fceb6aafd07991d7503d9e39e6756ffba45669b2f935ebb016dd8e02a3d76a612c794f2cd4338054e469303d942b77bf46a144d0da45ed9c1074ee984a79ae324f33d41bd2ab61dde6160d2de4e5ed0fc939de45abd9b5e42e5060f66bc9b9245fa04b71c1e3050528af791b8cf501aae936d134d11d4a56373e89479d56a8e4e1d83c30cdc9af1f513e154fb1c0f13b19a3e0c765eb954a8d54de02764e50863408c4605dd1b467122531c5906219411b9769880f85734f016353b4bef871b5c3b02f3649d4777074896390429f501c1d6c6be1c2d92631a4e92dbe7d877e46c81f7d1fb3731755e2e640a6d1f5e73e1de980619105af39ba517145b265237ccf9d60e5495ffe9027a071a6a907129666c4ce23586c82282452dca9544cd68acc3d61ceabd932a32c3cc031ec83069e4b9994d2249af0e5a3c93c0e0197320291469b2915568661171f586103d5a68dd3f58b9a42d4a5cd4d014b68190d1a4d2cd20c850b463361b5c3180d5115052fab39adfed31f3d8e685f6e1d78707c72d969fdc5eaa7af07f529402f037e25c71f7211bd23c15b40b2215f3ef5bef5957074efaa351ff2ec26b2e8881e9574ec97ba576f0d5985d487b76a94965fe7bc0d798657a823d228384c556d481e65d9d4e6d7a374e0887e9d96ffbbab693e0ad6c6e12b7ef8d9eb38dab950608a0a7169dca55576a6eb0f9463b5bc394de8c6df9665474058bef1428756c1e5bcfb9c43f52d1f570e630678bb6adb4637c448f5e2b84d741352a632aeb07ee1ebab0375813eed4ad71bc73a9470a23c1e62033214c0a4326d0a9f1de31d8bd32d0c5f24733942df39fcd63dcd123fecb6ad3e40d9d3830f07ca84a830775b4958a7c48b43142916107c975b6b1ebc5016fd33e2bab3f04278739a6949d729506189f07ca15b5e89df76d912223883965e71d4f7b6cfe64b78be72a1399bc62a48a6211a3b8acfce356126bcf45fccc11a47ef24f1ec4188ef2a806b5887267661643ac375063864cdf9617f45fc72265921945de6227ab2b1cbe03f3983144f5a34fa4027d4e4c8aedc93670493f62a1335592fed11b4eb188df25f55bd7b97c46e11603a7a2ed2123c833d401a15663a37d5a99dcff4d08455f7080c38eac27ac21d4722430e29beedb7030b46aa427ab1db787a6a033a8aac67d8f4f2df430619a49501fbf4da50ed6fa8779bb2e3f4a71ab70718cefb8fd30066a457b8fd6d7f9cdee2b3764a47bede3bab97255095c088c605306e781998fc7cdf065a2407300833c286a1f3a5ac3f029f75692c16a68de82f00219f7d0e7c0bb283fa173d96a66835962e3f5de803d65744d7b412a9004cfd9024c256c1700e4ac7f032d8dab0e4f8e160c31d21c1ab0d21cc315c3d3cf15472b5066efc0b0448cfd74955338c6c1607b054fb218390d22d29315a3264e735d8c3b3a13f2278d65e2c0a9d81d4afa7a900e583bb9b41e4cecf30b208afb92916fa93dff773ca1cefbf11020fb5ad6e909be1e33322a81a185c830056d0e8d51233692d944c8ee3d10b535491e535d3ab398b375067f99b3e07c3bcc678715bfe78018b0aeceb7bf497239bb148d4ccfccaab3509ef93e99d1a54271e96a18e7d60f87c3a25cf58c33873868c380e81d5d4175e2dd7eb34e91f417d2ae00353dc188a4cc3c2152785df8f4c6e2e47b80c4710dc413fb8f0729b85a851f36d9e7f741191145b17a5b140eed70984167d862cc3ba419e71bdc2e00cebe375ef996771394431da8182b632d207398872c3293829b6c9a317151f3fac80fe284127b62bb43deb49ced328ab100319821028ea1e990df21e2c61f98af7f03eacadcfd02a6f66c15f3c0030bb781d78481d00464a52cf60608a0d1d056e00b7b73043fbe6745f66b8d201fa45e9e8f1a1d69797a7ed32b8d4d15163be057f91497a512f5065c8461d136cba50161be3c5c26810674afcf88c285fa230861ffa1e7de068265b8bd7edd54ff7f652bae7f9adafd7fea3281285bd4a334f5d4e216f74f4cca8ae00387091883569140a983db2d163f57b62a79a2ea227842b5658bfc15195308769a5c439185ed5911990e6f68361f12ca078985eee681e4a07654de1444020fa6711029b66c13a8793843e53f40174e39de0d0ab4d4d21af955c880d4716968ccdf6a05b39a0715c5271215a2ab98a8b6153e388f0d0e4548be32f240e32267028abca4bbc644ad024e13e2e4ea1e3b3a94eb4d17f590a9ffdb4765880b436420538ebc8a5abb1d96912d1c660532d1d6ecc9d32006ac73173534dae0a24595a92b498a91c2d560f2c0f5293ff356ad88113a8f5c1d9e0412917ddd22ac0c32b66478a9a5a9e005ff6ced8688e113e6f129f17c6f4261560301b96aa678a34d74230d0ffb8d14327242a0d479d585b49303a96eac6c400b3b4f921212d28a95bd77f412bc4d67240d5a966853d65c8ea06aae84c9171814d0f4c0658d1cb079b3c3000704ea48c684a25aa14de0b31d8e023b4086654ca51d9e814f7b45de6e7cdd8b8a7a04bf30f23584112099b37a02efa8c3f778f61b935649794193b2229666ba81245dcf42306c03d6b108bc1950c9317d27aedad707a683e99f9f53dc8bbca13bd67e1f1b8b1d78300c6476753985140c9482f700d854b9ede5ccdf6638a86a0688de51befab9a6c0b0d475be3b0bea37038f3121558f96859814e38c6850a04ea785cbb6fc147da031bd893c25fe8c3bd8403f9941fedc9d20af3b45b35c408b1f8816c5cd04f42cc7f1c043f0f859617f549467b038b76e609e1e8cf840cd40905a791e05e6bf568d646894f3a31c1b7cf85c35522a1a2e23796453d31da5b67e34e57eeb3f29d7295f490638af44683b3a872802167ca2d58b3a3057aaf85aa6edf2d01a98f3f8be378e180728b2413afb820eda44591212b9edc122d8a98b8c43de7f595f591e6dba2a1833ea0627f953eeb9d1c962a31f7dc8ac88c6f79f51544e97d391d79069c843e9b74cab988a7a560ba3dfe71117f25edaf884e553d5c17997ffc3029afbd5e83f3269cec4371c2ae05cdb073f0f69c8d276442ea3c2805ea65fda3008959852888783078645058cf5f89ca1725e390de46c4dc817696ee78c7d41b1c70aa50a3fee60a785a90f8ba9bd78652a1128381f05631ef891a8d27416704b073c9fac292e014e03a3d09d505c9f41a2c4d4fdc88a96a1243e025c8807597c14c26711519ccb1a51a77316b3670d03a88cac070da1577a3c829f3149f22d11b9af1cd8a4de5f513211f1239a83f60637d930dcc86cd7b9aad1ddf34513473c6c40e9902bee410aef976d24f315a261bf1051b9b6ff5138a970426d401b3f30ea2ce4e0d9472cffff60cc5bed84989f239957e0f3fc978e80d4d761cccc164c733cd39a9390e7d11b13f2c4bd70a66de12c2e9f5901383bd6f565594e335afada12398653a0b7832bb8f6e3780b2abc726643fbadb2dfbffe49915abd6d972b7bf569d6d597dfd716b2778ee2a608b4876374ccebd016e560318ce693880b3089faf69f90960282b372aeebc19aa00eb6454440ca23f8152438412f640779ae070cb8a04aab7c1607b8a0fd01a38549834ee53b62a51aa1a23f587f33fce2df4f852cdc9833fb9e36094f36a18bb75d4be291e84e6fce109f370de2085c0fea8bb4635c361ee51f072a45a58f25e328eb7572a3879eed495d6dd18e43ae8828d1d709c9a5aed7620267588ce942916b448eac8d5afd62efc119e85ba38cf0a19f0180e04cd8c08f01a796b53c36fca1390b74e605612d9e6556589231399bcbd679ded3493012e80662008d2660e339e62aa05087bdc6cec522142452e229c1e8e34b2ba3623e9993e04b4bc56803df2f630de522223f9c5cc5511fc55d49084a0d915b915b6cbb714d46a4ea71be91c29742a49f2f1c2bc9a0f687c1d36bfe0436420ec5cd825f15f6cf8c65663454e596779a8415bfc980cd8cb5e77eb9a9f0a9933456ebed8b3bc30c21d009fcb4f0a8c6428af4f68bd458ccc50e8917955070f13b4a43383824f3245b6aec6ddea87e675db8020d5af6eb5636ff6c58d12fe8e30fb5a58c3127b40662832a6259bed1e88433481681180e02c2bb539bcabec1fc488a6b2deec42b348ce29739ad8e13c2676538b20d3064bb3ca2fb3dd6b47d0529966310c1e45905f48e280fc07b24c8208f48a25294a604916938ad7c13018a6d50759ccb7e6a4511fe58790ac37b1719202604f3144ab17f91c9a8e4efa1f20a3e6a69bf9efa918d9616797bdc7100b2b3e4a6c708e84abcc3d2e89ffdf8fbe5540ea71ae918854ad215067801d16fa2616a97af111efeaa6c10a5355da5bb66b98a72536eaad885f5ad20e08d00faee20b1c2f8feecf1258e1b6fbed5cbad98ba2733a5466907d11d95b63017174c60e4ba496e74d780c1ad7d79b1cdae02652afd92a5623dc60b90cb3502d3e152ebdc2907483e65dac214f175341432ed2613619ff004909963e888779e95620dfaa8f507bece30d25deaebf464a1c7171c7c3c21065cbbef20a904c44abfe062a35c91ba21b52579d16e8369c32d000dbfeafebbefd8ae44c968a860fbe679a53a32009aeaec1b46b6685bc390bc9b1599edf7d4b737d4479a21d8bd807cd633e31aecbb0b364adb0d92488c5577b6d3c523bbd1ed1a7dffd7e514d68bbd82f4c464438115f2a7624d4d04e8e6249bfe4c6264c9d6102ef4e85aee17b6336318c3c520fccbd5ed8a571483e13651e58ee965932405dd474551e57a565fdea217ee5ca8c2cbcc0e7308852cf648f0783617ca744f6377766a8dd8e2f9e9626d8eead7c8302c36da8bd53b26b944f4f369a6225a9ad945e6f04c5542ecf9238841de4e0585843b73a42a2a333c7a17638962299244b5f4d9581b361368807b12d50c2fed01e8ab72e9af77f31cc64bc9326405da45c2c46155e08c65f71f3fe207e9147046429a7acf12ac11d5646859137009884b6f81c759e035233d6e854420d8afcfb2f02b19419aa81fc33f2366f4d4ac8281fb03ba986d8ad168c5073ada5b5fe4145b6806c11fd7af4db38d23d64c5607141920f3861cfaeebc85c1eeff8b98ca0aca2d15cf553bdadcb98112c8190459f247dcbb0cf1db524bbe4c0629b830bd19ed8c476c6743a34b9451906978b329f63eb5671f1b3be49cbcbae8cd0cf33d2be51be06f89176fdcf81dd21469bda933299183d2d85390cf443fcda5024efeb97f03e3f893cffe69f1179029866691b15939259215ab6d56005a34fc70c0415381d59793662390c18199af1f8949f88e74644a7099fd3a604e4b299d0d67d6b801ed6c64248b9ea3e63ae98e982a79c276f22516da1ae9a34fa83cc0dad81893c867a8bfd9a1905294afc2dc15d2f8a0817132dae52d198d8e35cb26ba430a4f8e8025f3b1b56a4a2d55a9e312d0ee313916e44e4b3037ea72b76041d1c4d27d62224163bb471a81e42668afd6e2750de8801a9501d040a0098874cda39ac0a7440e2ad8ff888f9311ea495e60033c2b25a48c408d88a6cfe190b46b0def82a2f323ee184d8c9c2f93ddb0b7a292d6591850a35aa790d2e2063a8422689158f352416f6c96237c946b56e593333b9a5e8b145a42daaf38303718bb0acb629283f3a4f21ae0e6a755496eaeda0abd8880eaa5a96b5ed0d77ae9a2c33f57641b12e5be66f385552f152466fffadf7b0ad6c96985f0157c93fb36e4e760f2cbbe7ca3a952a1be6ca74b4cf645f47f9af04683016ca687b3cdbc951b285de860a1cabf832f1cfe687f589b2210abc905e8961fa218f9aa424d744c492fad48e7f5faaca01c6c69458a0f6d018b5002f1cffb700202a3b495bb5584450649bc600e42e3b86fd58a092b445f10adcc197e4976642deea08f35f992467c31cccd3433cf52d6f21653360a2bc0ba666e11e74645c8db999514cf91be09a46301a7161091e327a2c5783a3d0faaeb69758fe77bb75106e45260d30c736d8d4025a94c0cab3610da92926b972cb513e7bd22be3b0ba55f1fdae50644b5967c06af1c1a2c1a2150973ccf646eee034cf180f2cf9c02d045ba943e62341b3bcbe0999a569a7fb32285244399f25523b61a5ff53813e02aaf6c3dfd893c36af85d4fa8c0a6521d09271e25d6a09316989e55a1f13eff2f39387740f6554a1e039b904ad18f5a7e84456a585f923aa0afd32eec20507a8d1b276a3b4960bac3cc41753e230f3296a4b14cf6bc5dd604efa0a54682290b47ba0c2c6fdad3c4917bc3e9d71825c9a261ae2f901c56bb5511365b35b100375174e6f8ced8413286c7f990e79225bbfdbb80e0d7ddd6620c562ffd4df26910408e26383bda9d8788405f39eaf265bd0cade62fd28b36d07cf8cc575c5072c84845b5124cac7db3264dc831442680f0e89615f35078b71cb46f2032b321fa38ace99591aabd2d214cfba7fa64aa745cc8668a8939c2805c957b7457772dff5a4d8718e4bbf186f55f7cf23fe2aa01de1cff0a65077a3dee68c0cacb52681a5a73d58c2c8c78d7c8caea87b6fb9e493f4e2fb3d0c8265c9da39587336fd9b381eb3445b46c2468b699d1c6f19b904c220243c0918835a2cc445e12cae0000d79f7295b516608e728b1e1561922237bad867b7b1ce1c45615c22e36da0514a18b717ff3ae38372a909db02c3458847ccb329ce5d05b78cfa6335356e7dd9096e33f9aa14a86e14b9e3ca29db7ad92e0e24de547c2ee4ae5722217326aab09f9f72a41cf487fd72c54996f371e80ee0d2a1c3acd8c9ae3256318a029817049ad7b658854df0d8e4a68927449889b93674a08d60b1c5c718f1b0cadbc3d85e882aaf2ef15a7388e412c80cf07381f8125903908842dadc291c31d3b5b34d54a4f26e9f6e675a9f65a1ef54c250ec4e5c958e8f08ee5110773541059f966e87d792ee8c49a3e332a876a40e68d3c58ab3407a1e53cadc2ec49c98b1e51d274a780c55f574f96c80d35ff346dad8f39b0283133c2ec9fc6d2c7098713beb3932e320acaa6b14509932a7c269c7c882a77762b3298802e449491f5b6bda073c0defa3e49a45b9f8bb931d95b9674ede605e59e1b1d43fea536fc2e2cc8b6b7cd34cf520acad0c82b9cd38412c749bd292a47f696ac4c9f188bc52193ccf54b55b9a3e6651ce8a5748c8b230b6aa975d154c9f0e899b3a2185f493362016324f64a75ca2b087d05a3db29cdf309174fa4f8168e8bdb533cbb1f646da0550f4836f9926882791b3ad7093149dc7e3a256000b29ab6233f8018c0f729dc4bd5baf01206c247678fe35340113e01bea8cab3f047fd2842c0e8022475af37c0bfa8da9147b22ec20172ad58d01dce05fe642e23cda4876cd148c407c935da105bcc4e09f29f8a4842121f65b2d125b88a49a80a9c37ea46ae63a6ad6f6ad44f1213b031f51ef3f8ff6d792f2506181def801190373dacb1f710613670e595862b9cd127d66c1762102efae4289f8944d44a061248179a19d0411a16c9383e765a26bfb059af90282a16265c944e0e51dfa8b44c303d09a8588c6c96c2ed77c5ed65b685d2b27f792386d2f2cb302e1591601c7e5532d73a02567015a284aa74a68698927ca4f02bf97334c668285100230237b42c73e63ab4d82c10b6315dbecb555b7f89f2602b2f8e6419054479036a659a77593092b24a0765a8f176a2bd590057982b82f56df365f494e0c43caf5513786d6e5c8cb6596160e6d1a390b33947f634dfdc67dcc7cdc3cbeaa05d4c5dee5c411d21d2c5b1302ab9640c1c58ff08d424d97befbde59632c924654307470742075043a1ce80c118e5c4402278e9ddc9ca44366c0821e418a6cf9e339b52ca217e96b10bf6fe3239bb67b3f4d2147ed1a7d39bb1d7d3e7e48e6a3047193bb200eb0dec47ea34da8fa70f8ade1d9cd4238d8ec918065e0b3a75cb3f487d768d912bcfe850b210328d5b9b3dab91e350870106070c872ba274503ace39e7d773ce39e79c73ce396777775bd1724e5af5845aaa25551645b89c3a75ea16fc9139ed2c0ac30350080f409d99af097b84e0db2310ae18bba9aa9af3ba9f083ed2d94f4c4a29a594ce2b99dc60431acda64674d3d81e29979e5b50dad5e85c6794523b77ac1fff597957b529b3301fb2a7a386161de752a50d336a57b7fa8a7ef5c9afac9fbc72863f36af2adab63b6d1dc31ed3b52eebb0e9d74fef3a937cd78ace8a561597ce9a894e57def71b9a54acb316812a48757d8aae1963c13e3d14c794d29b59f86372a8238a628f4717db70f6144105338b9a30b8e1491746132d87d0f0473524a7a47ee4572e81b87258c96ace3b248120a5f2fbde2013068503a8f9d783d355cb06f2700e64041e389e14342ee32cecd2a5ba42b087f454181b9dc21e8c10c3444b9411d0c050281f8ec6c86536f2bc41f95c4259940b56eb42f666266bf7d30b2b1255f3619728eea667a6546957ccee1dd8d48084fdb2cffcf3f1dde33b00df39be6f401e2228f8837a128993a170c82c8a48928c894982917ec180eb915954b7152088a0b4d24a2dcb3bf49b45b4d7aad61a348df02189a33de79c93527a9d985c12364673ce3929a594b61816d5b3a7c746110483c3176580606a9001d30182a95aa2dc00c114ed507d76d9ccdc933cdae6d3abe4d199959195164300c4a10b18f2dd419ce959372b0250f8ee32f0dd7d3bd6300681559d5070597416276c68f0968e746a7e48e2aac79dc09bdec5d235e39a5ba2458849292acbb24929a5f3e3a2cca2963002e206c7118dc4b6bb3b36a13226553795be4cac022ad2a2c231454006b96e04b306c7457cf4ddc51730958f3ea89146d0dccd94ebd9ddcdb1a26ea2a0b89b227a76cf6e3a7b52eeecc538a3b1904194ae8a9ecc171a23bc9cdd5eacaa633fee2b8fe96c77eaa014d27162abe555ebace4c96075d9235ffdd8afdcab90ce0d22b8105139a0a37371035131ddafbdaa9c3aa5ad25cc5166fdf374e010fd4a51606b45b9f7794c9fce7ff6bf9effec6b334e44f2a0aeccb5ac6819995ee9897edf3e9a4268521346432d2d34c5fad2db0bf846c0370eed208f950e7f30d402a547f2a460b7fbd5bae3e95bb705d8a30a1b1dd68ade08b59c4a90a50ba8e51b0a5d22a9cae6a44d6953dafdd5afaa88757777f79c935ed44c116aa266cf6ed47773916cf96b6fa7f79b7332e91d2aed6ee6e6663a29f51be69c73ce49af6472630d6934bba70fbabbd2b00882992294a3684484124434823b2242a148f0b0a54628dfcce4a4e7fde20a2e7c74b842bc41a1503737ec59147583e26ed893454c0f9a5ed59ef366b7679428ee2632b7f340e7a4d5e716c5d47bc6ace1f378ff9c36d8397d068baf7b0eb503c28409f33d44f6852265f928168ad484b68062b9c1a10345cabed4ebcb37b14ca41f5a30b1541a9789747df942ad0ba314bb6a6c3ae99c138a29adeab4cb64d5653d84ad2a4e5eb5bd5e4a1d88bca4d7acaa1e533fec95b30e16bb886d374feeceb2465d9da5a0ebf43ab9ea79d9e900353d209b2d6120d15e4381c11c7b427ae91813b843bd6d8cf89ede42f3e8650fb6fdcb6ce59f0d128c31a2b2efa2f24c0ee5e5bc5b17d84346ff2e2a2f2f2a9376143a20c13cfa3e2135107c872b8d9ea2d984dde3cd72e3e84ad252eb7755712599e07ae2aac2d908b294eb6333c94f21d4535adb5616fc11218f87fa7934c4a3a7d37fdefcbe289921a0507d9bd22b84024a000f5bc2780ea0be1fda5067b7d726b633762942747ede1a28f884ca5ec402eb6b06d6066b1f1f5c824950c9a8e9d94d28f2e9cc163cbb4edcb1d163ebdb9eb713dc647eb044beedd965093f50014711a2c32802f5aff9a1cb1d2fe547bffa115da094524a2965faeafc98cc9a7a53ea93529fd429a594a953a7b4a294faa4943aa54e297bfcc9b4a215a5d481f0108c0c21150b4aa9534abda294d22a2375a62e2975acc2386f64bc5fe55ca373f459658d17897fe52ca47a8c56da83fb2375fee19fd76615bb5cf0e7e3254f0ce24125197ed086304af26294e18718638c31c61863cc4243171a9668688206241a82a0a1090d4b66d8c10c5dccd0059b6287a4ee59610f76231fd74802226317a390d2c8f3e5b85a2d7b123534b39b2967c300630f03b64f3fb8819dbe08003b0121420470c14e656471f2c1066cb41890e1c9056c1074f841985403d347200d05cb427fdf15649898802c2084164b198c74106394cd06186d75cfca848cb7e00f889a55607132d73c8111fa15381286a985d22cb06b625b6e4c5282690ec1d4b298114208610b4c12e9a1df18828d0e2543086116496090a52401ec02bb34c5208328a3f3e56282606194d19188d106868e50a2945d0e2e7925fd9512470964177bbe10457a29db0baca3905c482c48cc3905d204631e81c44264e941930caec301737b7624767bf66d470cf3dc7d2ebcc045cf0c1d08cbf810a801cf8e04263dbca99f063c7b039e6f87794c4e6732a3c4ad434edf44558c4a60d0e50d5efe596a79ae16b05f7da742690729dc1e7b500d7e087ba05a831ce18ff8311be3bb6ca1031bdddd50d896524aee11e8e0c5063192341fa4a2173e6a33582cfce9317801ccc3188cc08c9e87317821e9c9b04127cb6ab09547ab0a7b446f610eb5ebae50c922e918d4f1916e51965f8edd21f02d685d373e618fa384c2c2a74ebb251fd9d0614b97874a395cc9a18a1850e9a1120e5f5c11e6234d0f96bdf6f015d10861e37774d66882b0ec4024049a7c6151182d6377374d1040d0fc602f19ab549155d883ee4752a033518c110a0c6e636c62d8c630c803ab3c431ffc4242adf2ca7b4405f68b36f8ccdc198ff1199e9971e9320ed99371214e5ea0f9d265bcd99371206c840a9cd3b59caa74ac351f996158d47cbceb6eca315975744349ba16b42332b0d17738ebf0d3c9ad0b71ef4e351fbfa9d3059a7ff2d34dc29ef566cffa8c56027c1d3775f253f46a875b1e39bfba1ad73a9aac8b549cd02dcbba4fdebdb9f05b37b6659877639877171d6bdfb66e4f693e48707877f0777490bdd36947dc11b50ebeb4715a19921c2e85d838e6531b82c371b86b3e29bfb423ec4d8f4778c7babd91097b5d0e6f6dc84d0ecf81c5e893d94ec66337e33bba18871a10d6111d88d4d159a70ebe9cde74adcb71d3a53a6f9bd371743dec4db7e9b8aea633a123c2def41b5d91ee02ec9140351fcb67ba29d78df04e8cf10f7e71a7633e5dc7478c2ea5ecb0a618a39452c64ec6a8e3038974bfdd92ca0a387198a66918b66d1eed49f3e89ba66996e618cd90c464531b9234b521727a6b3ef1ce18cdc7d3303fc2a492203b6d486b3142dea47738441b7e72875d344f6c7bedaacec19c15188d14db2e838394ee252bbda547125456555555d5564713c5b2d7ca050cf2c83094c5b1675956f576aca38162795823c0a149cbcaf4c2cab133e8411c0a71a6ffe77d97007bb4a7c04aef274b241c96cc39a5e4ee6e39e79c73ce39e79c73cee973ce39e75cb2edd37d080c6e616074f3aa9391321e63fcc28975337460ecc1c229ac20e3211b0fa76062c30422b42ba25d3edb354eb1e653b925c4fd4c9db9a9ea02cd24ec598ec9641002f0eb4db107d1cbb78a4acc320b629dcd3826bb2076e9441f047fe6676e103b7c1f962ead0cbb3c76d2af0ef3d2599603913f9963286d488c67f1e4b2b36e755a95c9c14c609e25288fc183a06e11d6db4be09d1c2058eb278fb65aeb4058eb2ee10611d6d23e21eee3059a1f3dde24ec69deec695e6bfc93f57614ef68de6ebbcadee6a70eb2b7ddf08e9497634d1fd1e7c25f116bcaba2f3acbd821c1b2d843b0c67474be7518478777600bec0797da4b308177f88a5c569bacecbaa1e1fd40338447812b4e2f7dc809f6905e65f94e43980863d95487bb61a752ce18650099a7a1d5b2e3679c736651348ee931b667cf316090c711c6913152aecccef79b476055e3d29124bcb314976c3c52d1ea5c24655c4a8a478c23ddab3a928b622c7947eafd6aa5b6ba9c0e2cfb974353d16b55a34727ec351097a8e811e93f987444b66c4983d20d561e2a1d2de93c54ba61c96327c852d69b03610ef3440cfb2fe7dbbba1d2b7cb9b93c54ae7cb833de941a6285895f286bdeadc7dd5afea7066075b39f599d1f060a5b35b8cc54c4aaf55607003c3367b29ec08cc97bfb6fce0bc1949ec5d5afe8a31cbb2fa4971e902c21653e181581c31125fe125bee2097b612b9cc45b9889bb70133f41a1adce96300fbc82291a39e9bf3c222d25c14c573ca664c318970d4cff452a7f5df18a97675196f1975f2ef82bf3f8960f1205b2b665b9c553f3b1ea94cdb94b654ef41977344eecc7549e30157ec23b509867f3cb31f6ae23f6ae29db65268c73391ffde574097b97d72c2b62eff21d56d8cb631bf047e697c72144112cbffc8ccbe312de61bfdceaa21af100d71997f38d42803d2eaf6670397bfb35fdaa7e396bf9d8ca5f8e7112bc83f995bf2ec73acc352d939996dd9a04efc0bf1c6ad2bf6c4b481a1f2c7bedb2cb01c2f429fb08a3f1c1327bcb7805d238b1eca729b858c143ede7f44fb0987602440bb3a1890d4bcc5032c117ad54c313671348b15445c7617d0865bc412d25d1cff510f6fd5cf8d8b517df0ebbf659399d4a353ca968c798f5959d51b553cd49e79cb2c61f54a190b95a29bbe6be92466e0106e1ceecd9925d5ee8857700e8f008256a5051250749a851031bec95090a4e8044941dfce08c25bc30e279a034860b94b88187278240a42698a0c0091f8858634a90cfe6d859c1ea86e32a57ab5eb5d65a5196b556965d5d59976559565691babbe57ce9f39add4857ada2aa6055b9f2708c635137c9ce76e8525e1ad0fc919a0fad346a3f7de7ad74b6ac950d22cf096f388e32cada4a4a9ecba1f343bfb2d85657bbaaa35df368cd8213b6e41244193650a8e6345a06db188a773ae32257b6a254430f0378a86464869118b576c0da9a8308ba77e0d77a33e05e6d8c12048416cefa532108a64f88038297deb38b410298953ccd9f67fb749b2809f1e5ed573ff9667d8b72f21a8494af6e3539f946e5e4958a28ac7c75cb312ecba981fde2db6438b29c1ad8a0a1f84198e748e1b0b18989a9a1a101c275470cc631e67ef17be00f24d5bf9415e33596e51684316e5931967b3fe33129eb02793f3387faabf7c01e31c70a5bb9dcee97bde59b066475f4b19b7d156e71ebf8e3e974aa4e5bb55540ea8e6ceb22e65f0e76f3a136203647693e9b90c9577c17f6027f58975a489fd14ed8fc74ba299b3ac99c64d0a601452aa268f2a7134e5e7dfbd936af9b63b6bddb35c7ba93f518eba76ab98c715bbbf89b86c2c9b7936fb6dbdc3a55bbd9534c86dd6c3b79b763a78e1f68fbea5bc3e7ff94584cb67cdbf59c349f1490f79b6fdec3dee6d8a99bbe75b5cbd981ad52d62beb5eca5e20ef4fb767eb7cb017a5d59cb515e267b0477b0e175bc5b84c508c5b332e9d01f007caa563a8ea321e935171c5c95b5eaba380ac9918ab0bb2bcba4cf7596efdd2804e5eddd27eaccdebdd1c8321b0506908321ef2e0a1d210458f7919e49d14fc4ffbb893fa91ffb9a023311ed865f1e03137ae166f31f753f2d6957436263942d9db17bff9a923e3b75b35ecea8474def2d12c13bb295874c8a3566b390e4a9ccf93ee40d8aa31cf969071a494ac032b6486b166335b24b5145fbebf88367d971c2649939e210f4d424a2641a0fb601e18c4bb58fef28cc35eb9da222e89a6ff6a7779818d9e8fd8e38f978d4e68d8f85f2fc55ee22bbc93e47f457eedc4c6229a0606796038df0e216cf6afe7677060a5730996794c609cf6eed1f13ecfb5b096fab38da21451abcf5a27ad26952d190c88424941c12c4b5620f90e518c91258a306878394a5156c016f750294a0e3ff350294ad1190d230ade4c8607f6cbbe1b0bf488f10d82dff55d5e6d5bb54ed6151a7a287472f8db893358bd7a9c7df9ecbef9cd3b443dfbac66aef5b74fc7baeabd7df50a0d3d07add0c26f0eff12923f3df513dda92624ba55f985f50d82de73d62376eb7ed55a5ee34fed873fd6ee634701faa40e5bbbf6cafb5db163bfba4f68c8ea846410748875e6145ea120e810fb54df1fe6fe837e99915d35b0057838050e4512875902d6d6ac7a64420b2520180026b01834e27c9be4fd382325e8f448d9dddd524ecc88ac55decfba484e90ce75ca2e81623f9d8c3d6e7fc25e15d8e3f6fed63925613f9d6704401cf6057058985d07f6609741873d89e42da24de2aa8d030a6b66f3ecf08be7ceac853c30c9066318add1050c3738a2025c78a1824b162e8808023a04a204c54829056d28a560cb950760a9c283338650220d2e5b44b1258d36c2e8d0a424440f60b026f6aad63a4fbe69733b69d59c73cee91eb5f08eb5b42552a97356d5641437dd796c1df4cb8a7ef5e974f221f04f37653de854b9f5ecabd67d43afb9ed60dd34edf25a6b15ab5ac525ac5dd6c0d053038365e7e14d1f4da46c49e40229f8e8210148159a336cd4a2a7a4d72eab666c6651e3e1b5768a9b6b73ce6a883fde59a34edce2165d886b9de8f59eba669c18354f4597be5d48c4e49dbd79898cbe72a9f9d004c17e3ad185b28f326696635da5f960d84d0dd93c687af46d42a2975d55b9d6dd3704a5a6615bc403581e97605d4f39793cf9d47cf8fa601c761d1dd835b328eec6bb8b44348ef9016befa1cb472e0f955050c46da8d006a780c94c050db0a785bd2b98ba0ad29524d86be2440a14f65a28eac844032a1c992f6ff49246aabbaba7da65ac37d517687e12f6e495b2e79c55d555358d9cb021339e53b2caeb50f5a15e15a40b717f0df157b27ed548ad6a25c455d7886454d635e35497a72a977edd8fa85ea9aa92fca9249a0f0d10ac91a554f5b191107bec1a30c21e7b4683ed1266a669903f235edc2f259dba57a8872798c01ef4544604f6801e93c393eac3d143a51ee89325ff0dfd27c4bd75c863934172f218b73705ffd4cd3861a7b79f9cfa26e3d431996e89cc2da23a0eeb9b6354f3d9e406846fc65efd883ec6539b5b9eaa1ebfba4c97aa3727880785adec79f21473535b927bf29e56b77ef2e8e9a6eaadf1723cb01ff72d6d89546e2cead5b12d6a1386e26e4e4e1d73ecd4c1a85dee1c33ec14e6ad63d6fa10f8f6a6623ca8babdd563aceecbe237f49bc774b69344bf616d593532595a54a9334e58fe55de976559448aa490b22cb7aeaa1b02bfbae645027521eeadcaab9bc469bdb15cbc744a678aca21189db0f67ab0d385b47f903d783f15fe4b4dbea97993b0071de39bc17a63898529ead0618afa07c17c8afafce9558a5e2030df0f9d76121965121875c80353e2a18ad20e6a3c6651d69d71e2630fc4a70982ad9eb911deb17cba0654e01dcca767f3193aca721e023f5a1856847760e5429cc5d3a3c37821e571c383a3d1c27e39954fd7f151dd2110080925f0f5c8c3e31df626038b30c63c8c11f26830cbe27fd1b1d85db7af0529290f9b9b4c267e04b8413e1cff657f7d7630037af0e5f5d9010c3c40b4f9189ee9d0a25ec86045103e7ac31de951c66f2879eb9fea3f179e7efca8d19e48604c54f4d2899e90a9e9488040989af083a43333b70ed7f11c95bd23ef0b1018f428a36472087b48284d90a52851295a634a1a3aae104ec5976230ecc5a28f7ee3fb2241fdd0e426d8a3063731643265c8a12641ea079fbc576884af2f34c2439b253e5944c7185b76c74969df6f7ebc95cf30aa41cad30d78e785b22c8ea1d9a01dd9e84bb0c70f1036a3ae5876d85677c7d4af495d7692b2f5a20548faa58ff0f20ecdefb1c2550fb24a9a18d99d22d488d82d2da59c41b028de6196514e271faf7cc1d976d796fd1c39c6189923c718bd796c731397125376c776e9f27e290986b4dd316a32d8afbfe79c9a09f2bfea3b4211b2ec51dddff69b9e651cf7a1e07fd9c720d5ec1fb9d47d7c8e3176cc02cbd33631b0bdfbd9750f3521f4a5bbb31738e3698bfd3a738e9e7d64c99fd065c10e23221403b45185971cb690e2092c98d0c1650030c46084112ff8a08a1b6c6142052bc8a289328080a2829b2ce4162fbde6208c283148524119561861a10200528e58c3062276e0032a5774c4a067891c55f02ca103074238c3c91a41787185104b4c310122a260a20b368650054c1058c6d841082b98010cb490624a412484d2d113616819028a134de86822b2844b0a9ec8920415672c915086952062984197359698d831021d657096974a475dcc8065a98a29bce448c14d1453a0b88284144d4d51a810830d46004616134c8981091ce0172fafdce0204813194536886203097288c10d4a4491618a163db0c0e84a8e1540325c700312cc70c41859302985208c2572f0451638c801cb951d2f805e1c89f182a32290b0c28916a333ac888105065c5e40a3091d35207a2245ca0c275892c1098eb21019f105962f589083143970d1848e295772d060427182141f6431030e51a0600d266ec25cb94a5c267620a134658d3438eec6794c41e3a53727bd7ebd0395a67cf9d8040645b05695ef87d1097bd2e351b603fb6552c25854c45d95875ea554281611d3aaf2b1cb8678c79d1942786b143a027f10813d3a13d88b9ef3b91d414bd296a52b98babc749410ec178fa040894f7827057425fca6329af83734df044ffa6d312c92eee9b95f8d3834f928a594dd3005349d7dc87476a28fddd71f61f7b500bb21fefac51b790977c09070d1c3cbb1875e3911ac5ec4f2ead06bf5eab620bdde146ca1ba755390c8eaa0acba0a3b68936c8fe45162b9f4cb75244f0c12835c456429e8570ade5404a8572f322fc76a076576b9bf11c9930a72b90a92a772e914b0bc5e25d52de94a30979d4b9ccbb18e63effab8bf1cd585951a91caa1e428b714f4a1f829cd378f5fbb1474254560aec4f2ca9514b1dd22edd595546eb9ec52f0a6b45bc4f2eaa6a043891304bb45aab72be99bbabc47e25cee854da5b0ca29607975951451447a7525ed96534089f4aaf3d794ca81f0357348fa80854a421c3d757f7a5d9786d59daae32aec21b127a59fceb01f5b29a15a9c36c49f3a5b696a693e956614422c5655855dd5555db7f28a043e9a9239ed32adbac23b41d4a7151750ebb268c54eb28e9f300e652b495c56e08fe802f803abae6028cce9dd8ecd58994024852ec257c6ca6893322a90aa17587957500454ae4cfbc17920ec49ac7ed5bbbdbaad9a4fd5a147dcfbe937ecdd15e293c05e15ebb22e8b9d70612abc239da5b010f087e5415ce5bfab77579f26106121febc45d86323f62496c998716f1f510e18b6bd2f09b2566b595af2f2ea37755d20ef6ba3bace78b168d5247968529db17ea2b709e5d8cc680623cd227c1b4a7da3be39662305cab7d73876d34edb693bdd36cf36cfbcc6b39a1ae762f498294d0fab78a834c5e8b18b0de076dd87c377e8d091e2616353e329cda726e51fe735355caaa6c6bdbf71aee6266593bac9912375d3c5c791e3c6c6c6c6c6a5733600d08404208b3955d8d35bef9135ef640e71d8d8c4bfb16d4e6b34a048b79aeeb2b8553ea309e1afb95c8d53efe19d1acf32b7cef98ce6c3dd54e6190ee71ccb3acbb90e8765b92ec5b9b59c7b9f721c37c55d20ef53175a36353537b5427c1a67a1bfc657387d8d6799d7742e6b2e0bf1697c009a101a97710c27a34931ce71d6c678a5794c55792f7de55aa0d04eaff06235a076ea379c85f837ee77c371786fe19d2f6b26de09ca7cf36ad38062f56d73fa93f94633da546445b54e16e18f1c2aecc74754aa6af31c2ed63a43b1f120ce6be08f9457ce3ec01f375e397693b98d73a92efe4943a1c6b31acfb82ef39b9a14e72cc4e79c8d7887e6563101988f0c461160e609d084d0f89001b2087f542b654fda0f579333451f05713e14bfc671dc9c29ecc7475f393be11dee1ef18ecdfdb826bc53738338aff1ca4f35be693f5c0d4f16e10f2141343e14ab2e670a21310c93fd78c95795b314dee1279857ce5034ed27e6f285557a2b7b59f57aeb1780a7399e7e376293cce08fcd69cd7827a3e920aa9be9be2ad30dc5af61f8ca2d105ec23bd2abae4187afda87a6af7ceb7a09ec515ded7ef5190a7bd3b1cb4fd89b68f07438b5f08ee7348926fdf46e923c3048ed20335617c87b1f1fddc7db8f55ad17566a1301b002ac566b39ce21edb15029882acf29e03cbd81ee236975623feea7ce07451722f29537f59e374872cc439d060b5fde1be927548cbfa1f8414173abec6155d644ff49b72aa2ef20be1c7b7402b007651863e5ed2bc430d64d591e7473826053f5fe4827fa14d82b027b509fd9225629b0472fd0a3a3e379ee1c778b1c61376090c7c7db47f41709ecd9cffc338f6708361ecae0a19210503e9ff2a8442eb6743de914d1080000500093140000201008060322c16038244f6555ef0114000c8d8a44784e180ac428467114858c31c41842083004003140446668ca062890120357dca013be598f29abde42ac6532c9fe67e6b7eb52985808d937616f266f77141e4308ff15f64bb7dc72eaf2eab8c06ffc00738fccdf7601b99b6ead949e316998a838c6eda620a77c22c254c065a376a2e7f7b682db7c12dca1b4b6c2b6100e24be56a3a5255599861fedb7877dcd3400b0e8f83856d32ca635df50afd99c2b36d12c3e3d13a63e6cfbd41dc59bb119c07362013e52b78949ac726ef45b103e6cb036a520b4335c60f4b7eaaea2821dd5ac3cbcfa2d65bc892620f18a508afa425b83c23e12740864ca747af5830787eaf6d8cd1df41df8a4352bff8187bccc149c32ef7c1a0dc1120db1be102848dcefb585ad5f2fb1acc50fc342d6c97789fb1ed310a3b9c4028e6f105ca9cabfc6d5602435ddd33bd1ff6aec84958a820b6e68fbe431918a9d2289428379878527502d59fc42a9810a91dae5d5e0085e2dd4b13c60aba5f223ea1d6a38f41362d34af504c65dd88b909a8522b877eb3704d0b600a934c64535b40161284c7a104b26ba010f866492f0e0d708242089072e2c4cbf0f3c39e6b2c9a1eff69ae8ff70f85303c965a27d1427f4b918a28f0bde93267ecf521ce71715d0ae3408fc4b017ac18ca2f5a9217982247503b1149ab5e29d09e24659a574cb80eb93056e3c34e4329d9e4d14eb93b7a949bee7bc2f5ac16d25bec8c364581bef52f6fac57b77e4daf1c3cad65b5659b02efae30369169fba01a1ea1dd3f5f30ef2145862a53fc035eb00d5c7839e36d4363888272741707c31855579c5939f0e2f2bc31ec3493a5a7c2ecf06c0ab73fc8501c837dbdcccf81035e88855b478a14c0880df30bc08b6093e5c764d506c399647daf510c8537b2f435c67a348b6c71b0a0bff4b74b6e3eb12fe196521351c12a6d681f24f6dbb025057799857aeba376c1351de4819db811ed4c4a4eebf3b69282d379b5702cd6b6997b39a9ad25ae44567cff9dc5b61f448c3ffe81fdf7b9be6e3cbcaaa11e1b787d2e0c4b516a78e72d9b1ee60ad8a351ed43b0745205901d0f2249dd4c2f50787a4f977ce289633d84eed13e40248a47c1c0afd881d96348a6e60f9be92fe116b29f854369331878c706a031153a1b0816cf00ac81ab919ef3abc1ed1d2a838aaf82ef4bc5f401dfa78598734b814c5288269beac91405bf51b09d90787e52c9f28f65927da1b80a9f4bd2d85b3887a02853b209ca6f610d31ca69f35a9297cb0f4652093faf4c915764b51ebf4379dcd40f8953f0ccba3f52ca6a91f2ffc0524ce33730dd020d68bf7dcba2e803a604b1ab94a775068d46f2854ec1aa6dea620d38fb8e61fee7da0e0af504cba1c54991d6fe6a05bc5be823571752fab38a87cdde0a09e2e6e97c602cb788201a8ad469fe991be8ff73ba34aba314919cb092f7ff19be0e30e9a7a055f5a07d861683460cd986c7bfeed919ddbcbde5b79acc9bd7a1437cfee1c6d302dc247680b4c91db44efbcab52808124a96ec4076535a8a5891d1c066b5cd16f79eb5263abeb04c61fb7bc57cf49b63f7c7f8633f596491a2e359e42699b4bb616f6a7b0a54f11689120fd8c26e3f6c29ed37caa0fde459d9ef5845e931a5dd4f4cbfdb2e4c7b68294e430af37ea17bee1d92e080ca5e6a072d85280f1bd75f5af6fc070a2831b8915e845ff3217a4ede5c714d6ba5ddb386dad5fb27e37ee1504ad61c50426fde7bb3b24acaefe5a2f366e1b0678f48311fd68bec8fd1292fd02860ed8d87d061c5d60bcfec81a2c371204ff624debd50b5a69a69bd31165f11f06532f5b752300180f58878b018cfa517405fef773eaa038da9214650bc35a2f54aed368f3f2178c1c877f803a58f78eaadc8020e8176b7831634effb95b7643bd170d3a60da3ddecb518c98c2b05e51f5816e026036c2d00106fd5a35373d6c007b0d131318f51755dc688120ec4638748071fd5ab507bb9960f3176bf162608e3e69307288cef5fb71b0d4796d58b181513f4a9cd0e4d38f86e2c02e8797020cd03b0d86fb873c6f47fee1899073732c0c7118b981f5d1726b35c60856bd8f4f81085a343ad2c086280163c3b09ab5150959e20defa3df42c0a8ae16bc86807b63c1393f9d4e267595faa1d131aa72874555940b0b83a3ae637d25f80e2367dd034daa59afa280b0809c131054e94e3f37d6334f81fc8a430edadfe99c07b6d8a1e507ef5327ce8d197ed7f400a4483507872fee5b980c49f4d519b76f7fdd2b09c2f48a40d8279c9c2adbd8f29b39aee93a5f2900c4922dcda24d385997ee1eb85210ff5879f3b63bffecd26490ac07e0ac2d76b6269978aba30325072e9ceead9b1914f4e22032e6b081df827be5af8e9a6d70651dbd62a7cd86a8c091cdf2364d9d0fafba48c2b2499741a9532871ae849273c53b8489b567c4ea7307ca9549098d9d4fd7fb8a5dd893e3f263d724dab0a643ba231434713d336fcd1296ee18f30fe259bfb8c55a053e2120b78aad5a8a0c4a773df2aa263456050f15d914dd72b07b407b81ba324243238225d862840290b168374421efeab66f4098d3b20a042fd8dc42ec98825357cc666f3a2aa3ebe602dd2508cafda62ba1fe3432033e20029ae526826abfc6f22bd9a9bde5d83e2a8d528f97dc416d0eb7b997ab6f2d98939f1825c7185d8c3b7ed1f365c6c59d0e534058516c87c1758582f6f022b1dd87c821d30779728d54225c0fe1d515f5ea9143cd33c586f1bde94a8b7974f24a9c8ee2579cef9a2c0b5722df24ab92251098eedcb60ec84406a75e178dccbd8d0a261693cc877d1d1f325086249c377e01be464e640a3c7e4d1abb4fbda46414a26115042dc212ea053bdd1e0a1eb8e2e0b3a931bd588c1eea5998bce440876f172a44829d57c23f0738b10d5e1ba1f84cdf2731fcd984b35ca5a4deac5002c0e77612203df05c8dda016ce5b33f1408afb2dfe8ef8eae3c0fde34f825ef12541e81a1d14415896bce0715f9efdf683ba00272380d283446dc21748e11170d07a57d646a8d212f77e0c68400fb6a49e182fe6e846b9c51702fa78737fe8e30b6a6d0832ceeed362162fa69ea0a3b05626f6d23b3b114639cf63641829a49a067f2facb52afec57c5cf2c65283e54509ca707c5500a56411c45908cdba3bcee14fd4a274ab0164a6c06fbb5ad59a22d386af40a4dedcb8c309e4330932e236298080a57063bf083887b14a866d1d53e3bdef5741df23c5ae8012e68f0139c4c106afa4275fb92027983055cc18cb29a2fab8ba9f0ecf368789729f41b4c9e1254b7a198326ad3ff395c6a108332e53089b2b5726bbfbbea17fa47da42e1d0a97ca9a1d90df7d957e624937f3750c32f58c376c3f198e1457808ac9acf0948bb6179f7d2bbb742cb56d4ddcacc107a5888fdb06657158c185bbefd97af6597026e2a1c50e08c7dbf873106e41947e00b7de5dd163b875be8544fbf98a1587fc5fa200811dda7b0916bb5d3d700498af38c6a28d4c723c180308268a2866ae86f0ae700d9aa2ad7ad0f9415987b5bd1c1c2a2b3ae2e54ed06b68f781bfbb6f5289ac0cb5222357a7f16f06e7180f6c6a9048bfddb5014614851f7cb20b0125e7ee0961e014434ea21555931f2b35547aa8541f782ff7ea1236eb9a16cd8b3ce92c958d51d3c78f2092c4c0ce51a87abc6e74e54934d92b095098f2201a20f6800636c762c145c98b36035464e146b75d75ca2b91a5b4e6156bdd7f824c51bf43a2c2b0ed01bb320ce5e5aeb88e2ab8109afd17e13d4f74cec9bb3086699cedf543f52d8ab7ecc009808263975d0666f080dca767bdda18b4722e1e51748ef708354fade5aaa0fa501be3ab17f43f6623174e5fb46a14947f8296345329dec2e4648f25e8d9519279ec7e487a4688a543a71de9638783557ca3e52199ca8d8914949bde0643de8cebd0415a7a1b96f7fdbd4638a86ccf1784ae32f15803812790b7bd336f3027992be8d9075223b82b8d5a4968d30f9321f3a8829be97b9ab6e9b4afe7417afc042fa999a62f6676bcc7ec2511bfa30ad88740278b736b6d2a65a91f2c8e45c420450d2159fc77df25a6776333e7ee8c15a681e02d451b5904427a9322b11dcc290071b0a86e0155903b637ddb63fc8c7afcf79c090710b23e46fe3ad76e9d4a6ff2afdf3f0819eefed58a6b8954b12d084d80a57e6f54f9e2841010e62e2bde55fe0677ecf699d0eb6e57e2780b0eb63c211318a960664abc450d5ae0b9a18ea4828a1dd4c7cd0b6737092ce51430d916fef2f4af9fcd1875e03176ad94f7ed83a8c332d1c5f183b77b47ee1f83255b03e91047bc560c929f6462e1df61b02a0c21de86d016c3305753d2a20dbef90c485231a7fa688eb328568c71615d07dc2113e2436bba8155397dae7a2bbc31ebc247372455c4f26594528f9bbe95ef5c4b5cd3becd15ddfbe80bbf18faae69d936a7df30c98e274ab5b5d95d7bc4c92101885808643f5c4e365a26d0ee03f18a3bc1f0ee87c3385d14c5bccd8bf2baf069414095676ae41e5c11d8558ec1e04e332cdf8d1979b542a216201b945f1d9de6efb7b619bfada86b8cf1bfe11e0f35b044b63505c1a759263c66ffd2e348a72ef244c904ff7fb86fdf10e7804aa026018388397dd87b828883f72327ac5abab0215c789bb9f71b50dec37839e0e6c516d2220ce309ae74d5042b7263f6dbb1877076874edbeb77fff11d4b51f58f03d746ea9e992e74da4d991db12f43228d196d0f2d36926b7f2a83b3e9683cb9bcbdd0945cdc080e30e3ca111d4ac76ded663bf78f756cff73f4a78e8133fac8d891f162eff0304d804fb3dd93ddaa1e4cbe8f314f893da622cc8618a80b0b93ea5d84dd00b7d1ec144d68ff77d38f4dd6375e3a94bcb09ade7a3bb3abe8d2834221de9ba070adf1d2f8d4c20e8f5dd441f9e97dcc67ff8e3aed33b13c603332c6fd30142f6566ad31b4359cf135369e1f39fd5d912ab24993b4f32a45586160b3f9f3d249702fe3f517e1e6a2948658fbaceb0a764132c641dba467435b055fda8f228b535cd6f8d295222c64e91a1a3c58e04419621be9cc0fb43c55e97336b71c7c96349a0da8ab4ff53bbbfdf1c51590d314080cbb5c412376b1aea608024e21bdc0c41781c050d2585ad5623629f34786dd9f9df019496e5e305170e31a50fad3fa81ef4d2451c5e4ab7ebb06418916429236946653449fc4193006f11884ab3268945e34b9f08e3d3832599a18ce17e4ce2e0aa76d10daa30c316e144c32c70590e645c7524c9f645eeea6424259362715f4349c2097b8196f11f1e8dd73bc10aaffb35d6343ae81aa8ac93060271e4c8b73447d550fbd42828730923dc35274ab1196290bccc0ffd733cc69ff512aa926a0ab30c62cf579bf6347fc484829bf143045a9e0adccd42987b5019ea3d714848c3a1a8358ccab505568501e6ce083ebad97d595bd395ea936237ea8f2c300f2403d94d53936447b1f383d7633e74b13b89576060c1e021b51906cae34124d7d5a25ce00055c0e4c447d42527097f28f2b34e93e21cc72998a3a667ab9b3b8c94665d2082c568c1ebf7d144cc04826af10c4c987dfae0ad19efc719cc71f5b2f58192ae2cd5b25306b9420a53f9f647b6d43006506379ec845a45616258d3380d3e85d4a211e85404710f06e325c50c28c52653f9cf92f97c520c04b54628f530516ab993228084d31ed5f57ff46aa26468cc6a14c86e4e671dc0955680a884443114aa62bf0c82ecae01b83c07cd01285969d2dd76a23022d709ef6b76c700298208bf3b0b9e075138e1ddd018e4b3457bddbab29e8082798ff71e693f062d50aecc4b662fc26c8d241ce135884bb4f2bf37313261bd8f9e052cb954d269683b438b28e23e2c97b5957a8d53451058bde9a9bc05bd92a35c2ff511d7c505ac4779018942b89e5ca16ab7127da6e858c8c808e9fac12c7900f1a10d8a4499f8d222cfe8ff1b4b7eb0af3f286a0113fa480c2a90b4d7edf44fb787643021f994ecb1960dad03580c6943d818a0d2ea675c6067501800e79b78050669854c8f98ad645a58ce05e0d54a2d0f6de4ff78e068fd1d6b85eb240606629dfa88fc170cefe1ed48c9a87c384b58c34a1f1351a342ff969568542310d89436d0d0204373d514c68eb3cbc261a779d4c1c8675c4d1b5d9fcc50bce9455cac79d7126f8bc04f5d36b81db212f8508fdb8df1d36f74e6e0402af946f0f8622d030f71ca2601f601540b79a15d2149f31951c838b9000f25ad286696dddd0945ed669ddf969b17f3ec2c080e6cc5a6cd157459207c0a955f29bb7f4c77c2e30ed5565888ba39d5e7f89d70b46f3744aea1e0af2f88266ce721709b75c03cb73dc017f0ccbd0dd11c9d07d31472ef50eaf0971d0cb0f6544d863d83eb47508e1504e38a4938f675f90b3a57f1043a682ca6f515e9315ed6dbf1699ac4920d40835ce1401c0946c18b81ce338c75883a8537a76cb2f788312affa130020ca8404dc603012bf5fe0257d480d86ee02366c5d0a6e940a0e9c6199e02cfb8be29137613a9a11b995b68987a554d0a3ffb2a6f31c95a59d0e7b27d54602c05e019b6d12f1902aa586c46a0cbe09214c01640bca98c14d73ae471529cdff6e5589bc6eb82e82250330b6b4c7867aea01af2ad97f2a2780cc824c96371dc194e8067ddc908303c0c60f6c3b6abb97867a861a2a3b72fffd07bac409e6e4dd7534f8e3ea0508437c831918886e3ff66c5d6bbb47c368aa5db2d18d5cb24e2f33182dfc42ded9797203f4bfb853f6c1bff013258ca7749f688fec6aa84dfc5061279ffdc1ad6f9d2f53bc641625bb1e423abcf3d1df5027ee7eb2b7d97c7004814b81607855d25aff29e746113f239e78e78e32d5fbac24d7561548677a1d0e45adfc0fe42ad2ca60670f74eae9b15e4f4f6816716dbbb409284da988a3f5ad9774845cb6007e285fe9f81a037a1965e3ad0b4ff79127b0d33084193407ea04686f60146d428d26e6138d7938e0a84fcc5433d7aa9f516ec9a963c597aa94715c55eb1479185dd80c69e4201c7840144d6dc80ed7af152000d2176feee9fc62498a328baa92e76c184bb2fb3dad0755b1319fe2d4b850eeec04ff69cd82d692388e2a8bf542dfb1d72cec8a86ad5c15bf6b2094284f3bb6b84683b81b7b0df51352c422a5efb998c242bfb72a8ffc055c7c3723133b1b475e9ccd3f967d029d8b0e99e123a62af3a9225c985c401aeacdfece20faeead70fff097ef287f7b5d9a4b4574445ec095eef8e8caf3ea8567d488f88ff83abc768554cced219b6e7163310e93ddd37c43f27b1611e0fc306fe3191c94c0daee9d599064213651be377546cf0456dbc572a748a2598ea293c47189c4d85c9edd3d6ce524127afce40fe28977e592ca22a74d8f101aec370f71f1d54d040b11d12289794a3413d84aeebdd4147806e4b1c34bc9170eb7ee0ca5ac689425c5fb32b41918d0e8bfd73bea0ed44646a67f7c0f21dd6be92336aeff1da90b0c29c70dc25fdb2cf2c3a7bda6e4fb42f25db2f0e456ef0122fac95e456c52dcf75e487f0d83ec167818269adef114324f098f22d7022d996200aa1f68857521f1f0040e4aec34c402d3407fabc06bcd39637c1b09e16116e1662d54b58d5ca35deab6e4d3ddee7ae0d3bdee208eb2611e928397c4b439bb6e4dcdbea3d6d31b477b84a5b00becb825ae4bd86f2f9df6115252e51db3627addb8fe71ae21b72fb050ec77e5cce151b6d84da16400ebb08409546f5b8167a4d132b5d8f1894e213031e3e8e966451d314ebf50732cebfdd56133fbdca66df85fbad7175c6af74a03927f0028f8dfb878b7ae8750d56e8d89f6a0b1646aa5354541829eac508501e9e35e863b0b8b3d6e1b11099c1d6dc0c369894b7d1ae44062ffc1c15766ea97bc284962151bb4c1fb8c3b2fdb2e4cd6733e07febb980fc612582bf8059415fbb9ed9e833c3fd5c23c80544029fe8a2c1995c85b8f9ce41b64e3df9f43ba2c4ebc9d822db8dee6e8b2e8afe76593396b0e073b6a82b55662aed4050603b75f4c9f83081b4d47cbb1da1d282fe98c13be491c8e1bb23d09f7282f5ecc0add71b513f129c55e58db04b23d8caf32b5bc92cbe7c1888b4db1a812cc640409b03e2d72ca33cd9d44392f5f7df2ff5e4c1953201eeae966fc81690494c072f128a4d3cc66b33ea09a64367f67363578b93ff3ebf2c911e5ec5eb53aafb5d6ed008852860e3d243bea646d53c8352cd41a2952be4a79bc4bc676a506130b7a45df1bc34ca6e3d525385b555815a86d09c928c4e35e54417da486ce9e0cc902199f7e9e57a761fe10001880faea8a715494e419b8c807d3b95e8941be2f5406ca2355e5078886af896aacc2267fd8b043a29e65970828a220544a503f0823efb4e6894a910e4332803c0188934fc4afc7b454d3f4129df67141601d928134f8e4885f697a43b0fdcf593edbb6f61ce1fa80c151a52bd75af9325bddc07f68ac88f80f8bf8d1897c408d74bc3e9e7d816d6c5ce4719cf82fbf02c88a37462a5c825e4ff8374bacc2cd12937766e7eefc17e37e5d90ee03f074c6c08789f2f30b903394c5f11acf0cdf361cffad50ec3747fc388791c44b596a821f16af21860db3d5d1e84828a968c2faade98030341a19687ebf669802947d2b68359df0a3b96b3f5e02dc708816242b64a6c530183281b3026e5a0ffac357ec21070a0a32e88295d88fceda08e60a7948b6df6bb25d676179510e3c2dd835b3fdc68d62545c1b33115c9575b07716e5c7c70787f5d5ce1b20c40b8c1dc430a06e7aa680a7bfd29088d6c482451e6241c46958d1c0532ede5c8b1d9b7cd23596e8631082dde15ec48742f5f8cc201232275513007131eb3987716ac8c2bce0ea47166cd052d0ca9533ca7bc9cbcb8510c490b80b9c8b63d0296e1725aca684a3d4b447c324ee47bb268691366d27fa57b807b83e19caa02fd7b9e357be04d62c9a2140f6000fec23822aa02a42d7fdc9c4e21fd3840d81bc2ad33d8ba5b6e38520f3db319b4ba5260fddc4a7e35393f39ad98b034e4b1f6b30f92e0184bb76c5284b6a1dca1aab0e7b2f798699103c59244b3bf697e6ba94da1f39a12c7c09a0707d769a5a182c32212cb3af5d0f0ef01f9be2c1840e7334326c69e6492d71b5ff478eb4271fe14f7787396af95573ac7912168e3afb0f19f3b062110552fcc1a7918e077d4261f4e8baa179ca8c322758aaa9382f5f548c9d4b15b5445c05c93ca89fdc1b4f1da5a74694033d00c177c551143c6f901e43499f75fdc675564153740178a3cf87ede9012c86c7ad1a99cad976a85977d056e881a54df868c93f06df8e7127b21058ec44c9243a9f10a3925b0f16e6c3162e3532d64d6cffedf32ce49652183572b13304a52ae0fe0231a9181b1f540135ba5971bb5418314c79677fb9609eb7ed157ac9bb03412e71b336666334b000bdfb91bf68f029ba7d987c94ffc8313a6492d15d875555b1e94678a445e54353ed8f3f49d9aa5d99ec56140473761288446b6e70e4f22b06394dfba417f45b35418ff0f2d78b48932d01eefedacbdc174bebd4f65e21e29d08ce7694cb547f592e16dd9d8c6de5de22742f5af45ac2fa6428812509fd88a68295c0ed063680b39da07d3c97d23d54d9b632d8561e77bf6e77bb190c6874482d751c012dcbf758a4b280905e5c6a2f8829fd21ff9ab9fcfe2b5eed98bda1e21382e88051036a0de1d4f83a3adab22e355197904f4b28510cb0191eafb6c877ab50540b970bdc5fa30d67ae8b0cb6e21efc51ff11583a3171333f1c6594720d7f290b454771be81c2f046f65e9935837e6a9dc783154872876c9d9aa6d60045c69831045760d3f4802c6d79010183389fd8aeccefe94f4c621a8a710067f616cd2ffc496f3880898cfc47afdbfbb38a556693c05f630c3a0c6dc9b015a2fdc89611855ba2400137d657d2c912ea3255f33bae6bf7e181620b0d704c3978185f6e27518579d228271eef69585539bcc7858457ae9f291c1224e30ce493e79c7fcd70c66e5fd7e5f28c1aa5620f170a4b05a80aa9928dec5c9ee9232305e98772194f992366711ba1aaaffdea912a1104158228753d78d93cffebd123f8b34c031b08e24547c28271bdef32411e5c0da4b26f8037df573e6b7959f394ef3ec1aa95b84f47bdb80e106341ed23668dd6602878dfd65dba35034f0112a1d3943d7ec1e4712d511b8f86cb3e1221b52d4aa7a4148eeb1e3c69ad0f026ad38eba0df9b24ecf75e89e077efe32315e4407219e7aee73a6e70496631ed78e90a6030eaba326f12566786010334150d4c8476659626ece4f781cd22ccd55731404fe25b6350c2f74bffbb64f2f9ae2d530075515886e894140002506d01a49d4dffd355788f192414c18c3a69b51eacc24bb861692020d10f1cad46ab58c71be3dec65ad2442c1e44f756d9bc2a59479a50c683e84a849710fe6a55b79ec5fa97c4497b2a2d94a3bdb4523a19fac802f779af8d6adef1a06e4c7bc721dadbc2b5bc838a433159d22eca9648f8ab677d281372856bffe2bca400585ed9c3a359b7604d274b6ff8bbf39dfc1ba02951ab271cdaf4f1be5ae25918d3348dd8d8e33b353001b80a7ec9eebf5343a6c5bbb3afb24303b315fe437f1eb95ceba0e66812781cb1e00bf64b6b6b55124e17a6080712337fd7dfc3ea7668892e82e4e9a0eebc8f903e3f2f0c98168049a46649d8891a606c1d39ca24740d46be9aca4c48abf5e812815409c247d4b3f95a0b1a326c326d1bb43aa74358a218ecb90e6d192c26fc2957ddf2c607b2852db5f2aef1599336ea0bc6f111d76c7327fa238c5417e9c5d0f224acdea448dcf161a80a7eb05bdad6222cf86b65d5010cbdd49a994b7cfbaf587e2016567a6d458984f14563e2f199ab5048ce8d1470372810a88998e8ba07eb47ec870714f72b7e51b0a2624f28d0daabb55317180210b606274182c18ef0f826e24a8ed0c018a0678807ad8faaa4b5047ac5033d637cd0bacb1717ea2c3b8fd4335c8bfa1599a09141f92f65c499064bbff481099889055644cc37d4cba7ad80d258d3544d493fa9fab602f2ff4496562df8584d75e7179e4dcbf4fdec7ebafd3e8806eee21048c4cb9514110076ed0274d9d585e2ce19881100fb0bffba2b01a487f861a4388bc37f1acfb6de3a8d037a132638060c0fb6525d156adb9dc492eb2e34c5891cc40273f043df2f98f945747dee7fa7aa3709723bcd776b00e521229b667c16186e0023376fbcee0ab3c3c750cb168879881b82335d5db34de0ea693bbbe1b402b00340661dd2ab7e631eb6434a960e37b8f17640fa852114f1f0ddf0344ee9a4fd566a2330377b132550867a82814a58c84684ae904f1592e523738ad3ec460d65aa4e3018a4454717edc3af25c4c4db1b8ea05085b10e6064d498119b8f98717bbf8cc42211e82ad855f764a1828048c673d1ecc3d1dda7274f50e3fd092f8a615e066945d33e5b1f2afed52f14c553c69c73619fc9088053e89d1295d245d3afe3a7856c16f9de704f652b64639b72ac74bc75811b46939f58fad8c035c913a3f684fa084b189ad08fb3e1e768a888b709e758350bc84eadc4cb612e0febb55ed34e667d8f3421277bca738ac07fe5fdb7e64d86fb58f0092240ef19901f1edc04fda4e8728a6f46230f41413d0a1b1c67d20e3490f4c75ceea89fa85afa65d03c3db63ca199f703f32965a67e29084999a078deafaa08d6a0e9d5c8ae07d4d1cebcc45544a802c2abc24aa00d08fd237be908997a2b4760595f4f5c793454236e753f8c24b61c8c96d5a4702955e59000894f9055597be1c428972245c2b5009bc1dd4285a29c6131f6ad0a7d4a98c3c8992c5c8c61a02edbfb496b9f309884c25b9d59d1f8d0c91e6c27bc6f88e85cec70cb0d33993b6e07f2af0e5cf5dd634413dc56a003b97d5ec1f34b7c55e8d8631806f502fe2da10455e7f97ec6b1e7b28e076bd932ed956ca9a5e4284ff5e870996276f6d132db79025be1b0bffb8ae116cf4238619d05478b1a0c499905425c298043c6f603eabb8364dab5d5d0cda2614f104192b581af304c0193a916615e712bb6a4e8b8b37e547c0197e500ad93a881faa19c1568bc503e7a8656124010887b01d80122f8c7d2c56deaa7b37cb69ee7746efd9ad289ae3e97cdc83a6cf4a07357ea3af59a354655e963b994759f04803e8df972d8a1a4f9818f002ef8faa3f0c4050139a5b82741e43239a5115d7eca233468b31ba3dfa7c9057dcaddbe2a57258d3e43461cd20c1e5b018a4bb7fa4e160d84534c9d8bff2b90af42940555f39d1b0cacb2d904872f5f4576cc6546ec2996efa799b6013089cc0060addbdf8efc5d101e00e142a6ac5ea5b047ac4f209f616a3e8eb62a9e23831caf70b94c97deaf56535890c9f21d8d4e18217edf1f8a0401fb3f8bc573f4bac473bc65a95cf191cc40c488fb33556a61634f6fd1cc7bcd6af117d6d6d4bbc10f724690d3fb543120f2b8015545c26bcf2c055384153def66146aeb0fcf452c10cfdaf4aeb1a547620b0953119cf36013f64d37ac549644f46ed10eea697a43099a8515dee678815369e4f055364231fd9b33bb4a0840cfe01bef01ae0687dc1f4a93f87264e53f7c83c85c7545150dfda1d45bcfa65201942d49968e6c095c7ecbc1207220d59fc8b7eca696ed757b438f787b7de4a854b425dcd336a0f0fa0b2a643452035ac2a9b7c177e2bc58f50742e484400ce4955abbb24e9dd5c7b1b9d2eec48c9a54ea1cf5237c87a513107ee697d7122e45b7b44ff53f98881ca00bac4b5d82d62630010ba0c29f580504d42be66de82ff2ed8a2bb3a3148c50fa6377afee635240a9c8431e49117fef36586d0899b9e23d3f1e6080aaa31b13bb863fe4280d1c779f2d591ebed640ea04a8b23d30624e3e306ea36baa2860acfc0151ab31a73a35db1c84b29fc2f627fe5ee0a016bd3df75796a64d60931ec2cdf9b1e6f65e9b1661b2248ed1a400a3e82551d1fb972b428ab838968745ecfc2a8f49b2e0a4ac3a85ba1c1043e2583806a2a044f2c7bb4e05c769659c80d5fd9814d49a05ae2a426b62413855d9fca36990deafe2add9eadc69faf31389fb4d744e17b35a55269b9ed332c1648e036c79b1790c96acbb4ff90e10da47c031322a2e56c0bcf8e33ebb7241fdc1be38a8e8cd4a4c0f6c003b0b7d86a7accb5b65146d128b0d1da07e78790091bcdb743d8841b10d766531ba683b0f404cd06a249dfd4b06437a243d9c809ee6aa9374faa6aa649a595da3ef585445b70d0025bff6bf726a71e34c018bc0c240620b949c651d5b37f21afff01f706a8c134c0b12b9ac2ff46262874df0b911048d5661b4b89f48f0a96e68b55a14be68e98bf10145536d1dd2ae54b9d4517e17c423d9a5275c15b678787e7ed109316d076ae40edea56e2663347a95ab1382588d5fd188b3138b201274a538bf6594e3e3e77daa71171998b0207b23060cf6b4b43eea716fd0479ca4d88d0be4cf11f256b59b66dae2db667f0c828677fef85d9e23b061042a7f4679fb858d114f1277ba9dfc3d9e7e6808e2e85cfd4166643bf9c149aed6827a3753c19d94166f24d540d15b84e153c898ec1cd14ba88ad1f894a0bb8f245ea3a828b79a6d5a4233480a5b15cb875ee6e003fcafc0c4736b045122f2214821401bab18011b2b6e92c51c339f7fdbf42b9280e61c3a008b7487e20fc99df9b2a30315e06e7c1fcb312597209f7e1a55b1eb92d860840fd4d7b141135a24d854caa8ba890e0fcea4f381af4d2cd942e7f2205f53b5ac290af7c7374a1632e62c3b0110094ba77b81539a8357205a1e1ed06c65108854516fcbe3aa015744c174aa41453870208c28d2b12b28db343095f1f708dd82f8460b86bf74afb957c6cd5c8214df3475d7e4b8b982a2fb732cfbe4c8948ef88dc8751286d047dcc12d38bc2be4be157743540b977c39f923dcdcf48134f9a0a3920f288d161835a6b3919a596f1dd3af31a961373816f88d01593139f8006fe1bf97e009c08dae5e03a21cae049013189a027c05f9b622877750fe0f0ba4dcc50e06c4e3401c6a24fc581d0aa8fa2ac8334b17b096e74afb053a6bfe2c9606df5d7438edf88d09097db19cf3812379908b68645f4048d5f969dec948d53ec74ccb2246c63372830d97a8acc047fa86ca6487c3f1020ef5ecd74ac52c2e5279159142a72b3ca8519816277d4dcc8938197fda73850e5a3c3ed84b51523ad4126412949fd997ddaf19c00b4f4854884cd3d9e79250376036c35230cffafd702534785e43351c5406f1a654718c0da1233f91b50b22c158c3708d424607c3fe837c7d3ef18205929c9899b6e2314bd2b9dafa5d57d204b8cfa59b362ca6525aea4357f1ad223015af7835b2cf09991be4cf0e39cf55d651632e9868a3696dec583bdef7c3d7859cf4851bde705c7bbfbd6682b6053c9f5e3004b8d4d9899bf63db6554682558a980b58a4f11ddd3cb613fd2591cc665ac10939b61c0bc24f5adbba4bdb1161645d1ebc681a31c88017fd77226fc847685381c6ba98cdac6e428f95839188d1a986fc4b83ea96a22f771343ea02da6ffd747f655c3bd626865f3e8c32c601a591b662f322ff7edbcee895912484baa54b5ff624719ea0703800e2eaffe244a63b0b28cbfa516aefc32013f57ff81adb9c6efa4a3088547be2667b483087302c95b8c844a1db8138dd8240f8d23888b615d149a4052417c541f858bbbb79a2256e0e40df1f42b6d3b8d3f0b65d8f95389d32ac658d4000cc7a4b1ad3ae3b4004ccca9e7d5f70c9408cd1d412754e43e3bb0953b01d03664cf51430f27f4466b46a948627f58b072b3849c48cc881089bf4dab0e6031d8af668bb0df03b6d874eb456dee073645a043698695a3e53aa53257bfe0adc29aa56ab26f91957edd1bf25188bf2a71e75715fa85def7e8d4024e03661f3042f6e772f927df43be3548607025355aa41c45e751c4ca3113235e6cae2493c932c2143969f42f17497f8a3548fb7a2af6b3a71a9e79dbb136a2a175ca708702faa152dbde841182d827af74cd44516df032ec00b6e22d982166d9d5cc5e2039cef5ae9a3e2d244a57e7b58b75c5829cd5a91d5300ad3c49b022b139e9ba87291f0d1f8dc8905c16d4440c9b75fc433f7b2991eb2606438d2f3f6cbe5acfbf778a8df62991fabedb0207e39b998876c4a23a1b09841d67b518d7442a9f4c414ab1640306e0ffc1344805cd36dbbd4a274886944002bf633281856f135cf4366d7d7a571a548fbdc59825d9863494064aebdd439eda5c2b3702396a6b8b074c7c88807200f82c2a5fb093c975edf584910d5a307d5fb934503dcdf9e4dc0e4f824ac204bc4ec2fcefb3310bf4d7fdf36db6b1d27dbd27f9bcf5f908ca27e00ea6c602a738356e605dd4c4e131385acbc52e76d56261388bfc48a13659fc954ecf250b931e4c425727e37d43972824f1e0593f9d00c23403c2f538e595d0b3ef729c98327500a1b2a3f3508ecb91943b7c51cf5241a6d91b22c6cb030a5d5809ee4585fc16ad6cc6bd8dc88b91869fec034883a20520e53b78a9452fae1daaf66df3c05f9bd93f770ac8db204cab3f0f1034fd40be4b931a156cf53104e2338e95f78372dec1eb54f30a5659a3941e4b7094301ce64d5d7dca5b5142036168b8c3005cccdfd856cc66924a3c4e64541d399c6470010da1c64e510fdeb569457c9251cb9c8c126188ccf18d355008e40b4702cd05d6d5db171f5bb3f7ae4919981f62ba6b244444b7f5bcd80834e7d403ad1ec425692f9665e2e0e4fb8e7171d1878c0c22152c12e77f881ef764e1ea1c61c8a67720ab3d1cf0341880806425335c937d261b2daf4d164c5fcb289a69c7b4a77613e6247507a1d57add0643b2a82d61a371ce7d6cb49f8dd30ca00494c646b3015ec1f5ca872e535f37e2c84e946123b0cc3e32be1b608ff908cf4945f5db5bc8b95f694cd8c6e41950b41241cf8a092a34f519b9ddd66325da494b647c38f82f8e923228555ebe91cfdb82c827599ce668366f24418c5551aa85034ba9d4cba4b1f101686aa2d2be6a5c34e335b96171b3dfc2543f91022823a0b96afc5aeed14bdda4299be6ad28c7ef2640dc4049ae0cb47664e45ca1b4e121da8a64b94aa5eaa79069b9075b3a16aea6de9aefb652e3553d405a18730e4641444f5cb6fcf48bc80e1b4404720ead6e6a8c837083b0c724e11c845377b2c295188656ad94ee9f17de9b4b10c3950a57abca2cc26aa5898566ac1bf2702465d35293e313ebd4d8e87a642d971a7320f15e2cf727d7707c3f7f4a7b66866ef251c2224fc6c6e3eba9ec26e75c748594694cb3897211ff8c5e2b9640f5239f06cbb18e5d861eb590fb4df4a30034d3120f36047d3cbdebb7bd5f085a3017a82a697f379d29f595302e3d0fee60533e9d0ea19c3caa87e23674e74a7a6d4cd188816703b93ad8fc88dda2caa689049f24f6341b3bdc567004cc3b879b60573c931812e609007964051f1c36561539e6fdc9a67a504e2393c9aec181cd08dab27be066aa64baac1dceb0530947f01568daa29a7791e70c073789a82444e18d261990da0ef54ca80f468e4d2f126ff008b31f2524bdf62a16e370e214a0ff997fc6ea3d1b7e41ce61f227d6b7a0718dcdd526222c697580c80d8e881257cd8fa73982591317d6e20ab58b11c885741f349aecb9499d26712c1a87274fd90ad6cfefacda7003aeafe5edc27a17043b596358d37d250ee12e9d1ea0067d904f9e09c2a55184eb28fc457aeaeb9e619bc4bbaa1eb0ff0e8c62f5b03025d5b9a04690320ff9f7a461a9b917133c85d0510b95fb36e70b4f2389f2848cc37c1c8c52290d7f66d3b1708741a604dc3dcc9e23fd6394f2988fca189593668a605777d8d5975990c5599298ba8312c5c8b40bbcc9ffb1645ddc941fc19221cd1bf5cf18982ff054deea7899847069b11ec55ee5e1b337a9f9294e6382958021b93d80568f8c716b158525a37dc20cb990bc2a417a9f0774100755f4aac8dff90404fb134e3e25d275ac1797bccfa39a65a221650aa90bea3c43ae85ed5cfd222aac150ddabcc6a68b0c14e46ae49be749dcc54433686c47069ddf2b62466ef0018aaf15ce099858f04a9c406f9b7192dce231316e7ca8649b02082be46e919b06d81ebf413be40f8c839f19892d0bcbd274f05377b8dc57a53b2095f8843e3f0d4d86aec7e19d24ebf8a4e21b59b99f3bacb7a2aa8a0afe0f28ae757a78bbb403a4241c3ccb3f99ec3fae91b191f0e69667626e3935e55b3de883021dbd98200775990679035b313f2eb77d02f44eb09faeca93a7c09f760deeb2f862c331feb85820a578fda8add165e8723efa79e7788990c808618b7e402a9f9c229eb5f618d710fb2b96af757912442650671e087eddc21c78f2a5ba385880427574b467f85af32a3e207fc0052c327bfb36eac0c8e218d5af90da7bcd06c6d2dd37313947a60ec4b14c16ded425fe8f0e60d522b8d069bccc71101638be474d2e4072332e440a12ef1b56ccdde15f2f4c781e18ada514d73fc5eb5b9846e8acbfcdf01051df4c500d554c835098656758eab66ed01a225a09b863f48a4de4b6e88b7b0d667c2b204d55cb443419bc7335db9db089b87fa1009bbd60336f8a4d423f3aefe7a39814f553f1b2d25716789bf41668e942b354bb29615ea6c95cfab5c97505fd9cc2f003d874bcc231e65026067d605c45806b81902142ba228b8d44e1908068dc4cf58c2bb721ef11c1497601abe72e5f0baa0572de9699538a451d598691607d116ff635511dd1e26415856b50e705e9a8abe951f27b31af0b78ec934738f1ae4227a7ee5944ef30928eecd32bd4b4a7ec593f783e678fbdc83f847172e185063ee3aa4dbb9ec6ff8fd31aafa1e4d522fb78722f6eb58edcb2bc7f53ddd2a9209feaaa00ed36b71cf179b9d8008d8e84a5e1b6b528af7b06180ca978f3105974e1c41fd6cab3947e925a094335c2b1a3c756dad51b1cb0103adf3419351c264ae4e81d62cf91239023135ebce33d92f229bf398b85c91ac3885deadf0460dc300a1225bdf8ead658bfdd635cea612f176b43bdad643c7ae9ea60ab250ab1ece49f1f15cb5acac981d6875160e51f2538c9e34b1b055615265bfb85b3d702f68e1e0525680e6bc691118739a11ecc2190c89d2e9025f9ea87bccb64d67e9df46532bf2b3b093a1e72f04f685ae5d9bd1aed92f4ff7f2899cbc23fe1313fd766775970467d930cb1e7240120101ce111c611ad74c38f1fb905a1814add815c75684984254b96976e0de59fdfeee2a5d96d8efeb372c875dfb591fff026f2dcc6f50c0bdb368a4b05ed825220f8316af22c2d1e5084c043f9276d4890ed3acdd40140e63b4bc92e468c09f7826a339d98d718c565a52ff1a48463fe81ccd4f38fa29c8ab20f77e16672f90796f205b5592d52b8f41ec0c9fa6c81037690a9c3b784ed9b4201db66828e46101ecd81964357f54524b634a4b347f30f8de922c9c254e176cb9db8ec9ad0b00fec0eec823d207b59c287119bd79a43ce59ab6d44363bac4f207851e731a12d045bc8ab9162a669fa157f066df230bfdb90a4795625d58e93a2e51339fffa65ad80ee4336acc8a47d20fbbfafd7dbf586f1c12143f25286cf6228c1cba285d32efe322aa4dded689c2c933beae53c7b9d712901dfbc9d57556036276ceebb2958952aba4d25ac94ffb440001db87366fa77383a33f711f5a9213667af97de6c03ecdf79509b8b6b42a64582bdfd053bd4f8833fea14668ac32083f9392fe14feea7c581b5444779ecd616eef2634efa85c692066b073a90d5a73c66c22f933ff04303c750679988d9890c4f770db9b6502b9889fc62f9c5d2dfb0a626dc78a172c412c3f7f6adbabe88ea6e3b9cecbec45026388df02e29355149e284fe5922663a2c112487bbdca7df96fa241a2a7d07d130db6589bf4018652d4376fcb018564ce4aac68844c975be98f2f0540fd6eb8792f7994d58bccaf8149903447e45058da377099e45f1560730d3ceb38469b51d2159874733283475f3b2e89c3cdf20c5347064da13e42932919445ef59e97dcc8dc803be3202521873546cd5234bc1f6d08e2be1f528d162a20beb8b8a83e354552a884df1dd10759e7fcc9865d6dec5e39a95198be2618d1ebe484f998f0dfd7ccea43d853186884e4c68c5c22f6d5f55f8e53ed1bf0a2d303fe289b00aa550d7a510f429467adba13f18c26b562dede850228ea51f4492aaebeca7f280efccfd85f0af939625c8786fbee792013f412c7f8b33fdedfac3203ac1fa8a14380074808043285139778164d758c7c9f6edb65f100b6e243848c751fb8a950bc212fadddce5daddc2af3785e05cb1d0ea9e83ffd6617909e38908281dfa9aedb8904d57d784ee22903a6f2e8325ba5ef3ae3338b497d485af3f3ddb9fd0e457a47732170ef4b6230127552e44346274f43a15d62629b097105e8e06e25c4c94f48fe3af9d02191de53371dd190de26c9e55741be5f961d6d925ca6480cbe5a4fb6703b7f1875a0f2df6f2fba4b32710b08a2926366f70a79fa4d867e86b088c03fca0c88a3013437ba3e6672661e66ec121cc4c407cf147fbed96f8bfb92002d997a43e691bd8f18f0bdcb6b94f04f870067362b1778a439c8e0c774e9f16b6f726e52d92755a20096d00a044bf430b35cda6554bf141d1fb6768a5cf5749d2bad3d065df6866a2a9870eee3d138768fdeb3c1326216e7b9fecd1f6cd296166afd04f5998e86fbc55ae781536352343ab7aded1f66c47255020748d34cf8d97406aca3fbd436186832a5aa8f237b0ca3dcca3a148d5186ccae50fa442fd4dcdecd6e876dd254dc7d2e3eb0ee9f9523a107c0af2e7c75591612124c776e4c4081e314a1ff4ae5f423fdbda4cc190c6f99b1a35e56beed432672b37cbdbb36c9fe43152b6819a3cfd35df44f5dfacfcf95bad7097490f4063af42981dcc95a17db1a38cbc29e35bacdf3c44a0d99da6a0c7abbb22ac4312c8baa69dd1f6c941fbad9636dfef403231ed0926655f74d2559667c16a5c1b77ea014efebf712bc2fa268d986dfc9c38cac6740269ea9994e5585b95f21a038656c80ede36f8e5deb67a6c360470260e23ddbb0a5e3e376102df7a5851893657ea5551cbd1b322f4f1249988391c8472271868fbe142b384fa61cb9fa362d734225aacf26910e3c0acc3348242355e2a79113cc3b627679942580ad2260ea48199dc5168917a3167208cf7f568289f43794ef64a76652761348547ad18f5eeb5c70cac5436d3cbdced4a2936b6e5fe32c0d92eedf2ad776a4b8c2dca304326667f0d3593ee87d8efdfb02ed6177c04fa2b74d16ecc2eb8e1994c3ccbebae1c60acb9bd217454f8a1d1e6e8ae9d485ee9a658b7dbb07244a7b31c3001ecb816545cc54b4e951d8af74f1ae24359d084ce36626af506dd2a6fcf56a28daab0520959976f86a25a881aaad367e638f7468ab738308ab6bbeda2e8efcb1e0dc65ce61a08b10c2483c7d66c717684587b952fffd2fd225dfed4b4a94def5ab070d2718f6f06573591ad00181846e9327b3688bdec87defd98e3f4f31820a400d72990a5a2e62605e4f56925107458ba3046636ac813cf0b3945a2b47fce464b2c99530e8cd363042d452eb51c2534f07d5786d421e78b5c99664f0c1e52830ba85577790f44678b301f12cf9947d680174b7b7c34fb2b4adc4043f2a1dd01ce3eb4bca93204b960efb84217830f76feca62098a1e9a6e640371a4acce651b5bbc57e0f614eb74b0434e16f4dbad6f2090bc349dd5954dad738e858b33f1f572d7360668b986f8e22c0cd57a30c2a7a315914edfe05a8a0178ad64f64b87ae37e8d32955b815f41df559c78bc2c44df68164fbbeb39d14b69978aeb9e0d7614b7262d4a040c404eb2c6cf520e85d2ea82c5e197e483fd00f6f428b3852956260d493fb42c5195a35b7af003132d300e9db4161981fde5df7eebdf87288cec87dc8a420c5b8d5773d7b511a3a5b8595cfffde4b0d93cbaa5ba4d7699b63f4fcce410cfc517a848ba8fcd9a62ac46d0e972d0d84f980abb40fdcd9be7f97fdf0e0e0f0c799898ad811b09d014991bc455c6d187d71a1baf48d522648c60215ccf6f948b913fc45c07375ed275327cd30300f601ad9264b20f8b4675708ab35c69badd437ab159f7a00df0373a62f428131517f6a4029cd042abdb16fff515a457b9da1cb8638b391edfd07cbf4962e6a9c5d862b666f503a6370fd4ca2018d849069689ea058204ef25994e0b428a4e8dbb6c9d4fb77afdfbcea8fca5d97a5450a1bdf8b52c8877ec985a56143c9532eb9ddef44c6f30a25f68f7e688d1d935f8bfaffcac3f579e0b954c03c3195a17571ac64b62fde71280ae92612db88ba1cc6910f78179b39c56cc94690038907af75a7ed015b79594688806aece950714310a8de1d2a7cca55fc5ee0a84f9bd64c1eb18380d81468fc5dd58bb9b00071102a72280c74a7c83c3c8f49d1c7d95be030edaf5df3cc000c15fc1b4201066c421c76537dd6f779a35d32431c0f1e3d536687510dee66f2b838305903d036a84b115810de5df7e99a881c826331bb02985dc675c7eeb256c6661877f3edd1ff5c3d68f00f934a09571c76b23f8b910d4a799cdf70ff1a2bfe1abdc92b3110c6da81a3d2f01a8b3c9bdfde9b8120962e2b465227e8e56d832d38dda73260c5089c608f542b7463a2a1a2943ba9a623fcadf719291419d3aa8c370f03d55a451a551a10ac86c42cb66a5f98881e3b9ebf04ee677c947ebcb0dc72610f9c82a09aec58947e84628e8fa31b2efa5ae7c6d0f1af4fa84d3eadc185f09a0202415af69d5f770a5a479f946ada4ec2ccf4eaae0c0442f08d14e2e863c1beb6355bf81d53d20a8d3c01aa90afa984fb35b67d66befd02ef5f9cdbca99230e61e251884b711fb5377bb77a3c8ac704296b94193d2f9dca913cc4168d24020672e9e6aec0c54a3dfa238f48da8632db26ed28aa75dea26c9d929e64472c85c3cc35acc8cbb3dc615be7b6c14353bcea803f2c89b476d07b06a0528d7ddde1eddc0ddf32bf04c4dfbba3a42144b46816238685001f8f43c02441d01a82972a02f88982fe0e35e226e93dd2e7148c449f2a92861f8986beccb76a1b8452cd245e228e8eb46203aab187203491e4a08cc2f1a089368f31d0732daf2f2a8c23f8ce439ecbf311e02ed83c047631ee9c64cd8be00433a4d882f74ba4ad6bef094d4312218e2a3a47558e8f35ed9e10b465564af296c7a947335f80851b7a70e4921358f05919c407f59d7d955d2c736bc8ae438ee94f7ebd4b0a0e73c00a04da77ad8a967ea18150c5acef2e88d25e4106772c732528f5171634d7056b4738a2d739bb210b4b7f112d79475be7eaa70b4b9ac9dbd0cf1903a14e3914548cd4a3cceee3e81ae6bd08b4459ff221d4399a1b93a78d9c1d2276a84385c26519268fd7c0b11b54055e8a17d686b4caed3efb935bc879f1b9dfe40b18ccbab0b46426627a1e2f7a5475e506a2e46bcbefd8c9f4db0e122249aa0820b4fa8fe9e777247ec70f6dd70b6ad6efc44f7ecb55002c0f01484c575fd25bb00f3575dd3d56fae47aaaba7be5e50dbbaf14dbdc4b43c7743e7b6e865827da4f98f5692ee2c0a7ec8a920ae8553565371fa663beb4a390adac0f31b5e33cc275bd04ef9a38ccce71dfab0e5cbbff8db46dc3de2cd59e6a6fc3081528f6ae4fcb2c6248cbe0ff5eaf154bac719d632ad0f2302e40e407ee3634b7481a10308e36f3252372156dcc2538edb0c3b2038ac34ee13d326f72affe4600ab711cfe0029ee564b923df4a61c9ec62587157e46855f74a7c25fb86095f707c73209189b66f8bb8b323d81b1ff926d620055223e9be5c37be7da7142cbf90120a5e4d4c06d50ff425c78837f4b4c8a2f539a7704816342fcca58722b1603906d05a9da060c081a2eb4489663290c5bd545700e4b3633964593f87dfbdc79c3da838e5da1fbe9012fed1e212e35fc8016245b1b8efc1774017db7f31f10f42022e00ec5cb25e0a461e658a9696b4eda41171fb39016d199dc1359729a5f6a7e47426d97d0893b12ce5074f587b0808087025e5b782cab8b0a0b812a67261957130f12b1655afe072f05474f0f1e4e4671e6c83452ec2e602ef15ed06315d4c5795c4a4e067a4703bdc1841901f965681bbf7656cfc579eee339027ae7562a80b6515551838d41e83123bf07dbad9a84b3e5c17aece4415352cfddd17027a4be0ec54ad775d0c33dd277c588462fcae78b57792c16746a01644f67e9ef93242f0ffdcffb956c8171730089d012eab885299b62299088cf40b4036153f5226c0f04897056136be35ee296ed5a004510b0f8f348f70c47a112f1085f12b00e9a0b406ae9c77aecb5d157b7cc5178ebec0ed2e2cfe19a3b476e2fd8c2447bd19a16533fbe507bee48798535030a4a3138c1e6242ba9185838c2222be68a521a14fc038df6ff59ef310e33ac71d78a7020c4474a76d706e1410a9ceaa4ee27ab4616096ae619b8588b25257de3222027700ae9f1178481e046408812a0e1699deedbe13ac58fef1c5547e98b3c494ced88882c452529f0ae42def5f7100d200334ca949dfc65ca60d7e043b7a3259e7955abf79327f97f1209e24fda03cce2e85c4e7366331946593a4f37840ee8b59c767265a1d313318058166c7b0a44b5220479f81cc67e790a03c4f2ca112c0d38efd93e232f39e435e28036217d2b19b1eddbf9035b4af2a6f1cc5a4f8a52a68839d94ba6632152e4f8c4150ee8fc35c16a3937d05bed01f08f010ade1ebfc4c110c78cf42fe15952ecd49ac2daf901cfc61866a8c1a62fb8762e189a79c206ba8c813608011642f4756d27d41b24cb1c872f49b7ada169c5233d02e5742d3f7f9099d1ed593f6ceb23ab69e3462273776a9ac1fab92aaab1d753929ec4546f3b97f93ac2493260bf195bfa251e1b7a53bebad175fcc9087afc38de6701f858845251b8d111a7a23275427d79b74998dbe754a3db9e996632d79ad453cd9b9a9d9d7661ceffe3e0b335ec08fb4ef0f5c171d4349a2faa43acc124c6fe2fe8f15bd21d9947848de324e17f549aa144b32bdb2c02bf89387267595aac93ac945a0914f63b0fd341520ad7f9a0e0710e0ceb4a612a67da2c6cfe42427ae91838bf29a4e90ec090669d82ddd19e2804eb6a48a1a005cc7c08e3bd03b6c7f03d96f46cdf11e0606e191844f0e963d58d97f72c1d3064120c9877c4991b64431acfe161bedb35afc1f3d31dbf3a5e7be0afd853e1b7771ea75761441b5e042eb3edd8b636783f9a7a10eb58f3d22f21b89b374dd6e3f46ee3a58986f681063dff9592273a90f6f26af3cf2bb4f1d7aa2650aa21d33da098ab891731346cf47b91fbbe3650d12beb3b6907d9f4c9d58f607a8a4262f9dea290514958a48831200b7f28b63b3938ffcdd974ef3a2c84b04b67161eca9ad0601a4087b3f9e9c5450f2440cb2adc033128b7e240ac6ee45bfaecb8a47feed6ea84f918252a435b75d30f1a3a83d854c202795d8d60d0f1db3d2774ac4c190828d942c4537570ca5e5189f0277a268015f05e7a43a7c010ba46f8cc7f67db1c2fe43f50006eb1f81210102ca48c20e301dbb185f09c622998d35f6d58a6dc2098d324534263fa02a9fc087eae382f3cda8a7ca4758cfc1c3aaee545da792312d33297e76fa08b2a1300f403d5583f458c10e2e53a05d306c8e4952452333ff95e0ad3c8345073d9572aebb3b2043c401f10572db68652962d43a3012d54521d9ef5eeb7c130a02e9ee4a45984d10575b24ff945da22be0b9c0f30825beeeb789413635c6466c6ac41d1cc349920455c26727c2560a74fb96bb6a03e0c4e4fccd1f99d7af3fd5379591e888caca4e40be2e46de0ae10829a84fa467a5c513efd395ada1313788a9dbaa8620f108dc018e7e9a2d68d1ff76d7286a0253b6ec4cb99f85839fc30533ca3fa0cb2d314ede7c3129e049610855f4ed6f00958b66186a3ee1ad8b3fb70aa40e0b2b863baf0a7a3575da50a46d35e1b09e509dc0b9e5a51f2ae26c5db07470ce2fb3709a84650c0bad734e716ffe5ddd2757b1967bf557860e92ffe916c9a4194d5ae4030d899cbd3912400a4ea0948aef81ea34cf50358cee325cec65dec0de057d711f8632f965c104f0bbbffe4dff060e3951b903852486a85719c01245584ed4566ccb8991d24a03f77d02c763929af04200258d468f59dfa13308f7abba511ec05449debba15ac8c57654eb749bdd82cdb554125526cbe7b9627c649d6fc48226bd478c80b1dd5b4c54b990d75c4c46f8780330b0c72a41c70c99d3db67ffadcbcd3da410b4c6a9f8dba8c3b45e745503e0afc6bdb4fc46ab20a869215eecb5c65785354596df662712250293ee69e2e69ad5d95b68b096b8de432994d5cd4a7436404c1bb43095c0b16bac710f6a78b34f9847d733c168f6b6678c764ed8354693bca43a9d7371fe31189dac75d05c04995f92d1f0a85706aa09326335059bab413d58cf2a8c7bfaa67277ec584cd1f6d914800bd2d6904a0a0751f20772f6c89207230866675503f1fd4721202b4a4730ac93fcb8756ed316af5a470a10c0625ac5e081c6991ee6b91e51a42c5eb317d37295ff17a5b769b091421f30538d1cf6a11181fd558cf14a04143e92c433125fb0943fcda9a370298fb96eaa10fe068bc5aeea313b81848a23aa8855e6a29d7ec1303195b61ba00e28802536849f7820b82ed7fe405077a73b6b90fb10db585448e98f04cb5bd6053e34d52007c0c68906c61cbefa9622e33e060fd4bc5bfa4a557f321342bd34f041f08896ff7321c53a76623082da425c088213f4c4e61ec4dd91c57ed79c02e4fb6abeeea707fe2e0e0959be40acf8a9fc9201e4ceb3b57a01dcde2cb9360ef2faa8e33d293d80c5516477126e318bd556da7c64f8634cac9df452be9e448319884131ff3de68abcadaa1ee70b798ec550315260fd4e589fc80eec3a0ad38d7b41c40d278064e95da8f510ce6255656b7232896082787b41495fc0592c263356c177a232382d0d7211ad731d32e093d4724ac795370b71594cc05465159b4889ee3376a23dfd5cb3d6814c25e05e236004681be7488360157344e71be3244452548af60097614803a0ea8fc57176c5fa60b42566fd54df0f829d03ec8371a01d8c46ae9a8475ea3261db02e938e49232b2cb51e4d658416267e84623b651b9641eae2229ee0a813f9b715b754ca816c9fd6a2244bc7dfca13ba5a9abc0cf75a2a091f236c54f0751674059bada3b3f172030bae8f2503bede0f5c779bd539f6142a9b6e63fb6c7a62a660c894669dbb7e66346c90a9a7ea605e7b82c3aa324d09280807450133d13468d6d5e85883b42a346d858ecce42465a76a0f6e7ed714eaf2c2c41c47ecc8fd0959ce64c06fd4d83298f06b9e8a4830b483dd29a5fdb098c17f407be1f1e673276bf2cc8bd5cdf6c79404dc70c5c088bc032097f23fd6a0800c4a108dee17ce5330cd34f9132c10f26cef6a4e6ffbe9600ce523c5e0ea1564b59766d46bf030394a220bc267534af2b8b252b1d60fa46987d44b7e2997e2d5ad3a968b47c3b1a22451d022a79f56d47355ee2743d505933b1686c020998e841229b9bba271ad2ae96792243f57717e7946cfd0601d2e2a8b65ca22fa6d2120b1972740df16e82b166824acf49a434c4131cd044280dd13de6bb228de941c3afcde8f569f1a587f76ec69684abe35c88558b470998b9acc1de303266bdcabcbc746bda463ffbb070fcfbc91ab087d2d9a8d930b8955d37ae74154f8e39bc3742cc8a407071b72f027832bf95d57c8e8fb8a04ff194f4a0f603133d683a70d0d4effa2075a89801738ded207ef8ab4fef47a625cd5c86a8fb051ee793628dfe1610fde2a74ced4251cef543c6812b34dda062f322e46c47d31718d036d06b538da4d5130f7d204ba1d6ff26a46fedc2bc49c6a1d3cbab419ad75865c1fb8586ebdda99a7f68f98f6f0b2a342cb0d102bdee075b2ceea4e384a58ca7e8c0fb884cdae598782352410d1dbf185d861809e7c44489dd92053e92cbb1a1dda32c5034a850d827dbc2a8e3f6e2c910e3ac857676ba566ce4895377e08072d61a821dd2a0a04b645e75a980ad223bd9222a8a3943ee6e645124f69d593813cbc4ba5954a4caf7bf5d22776040186878b1e5242a4e930b499d10483790115a25b21c1d215d04df1e033469994be6502dfa5567f14d2d4cc06da7bc7dfe20fb8e7f7110ab4ab524bdd8fa9a783c6489e144c94c31b6b1e6602b17b54803feb9273cadc368aca5bd0bc2106701c8bfa181b1d04f1f4db9ea5cb9dd3b095545120846a62c69d8a5b1005e96b8e6b87edde81e3f9da57f0ced7a9fdc14f2ca758c1f9b8300afb384290a1380c37596e2fc429da5780e23a4093e30f6bf7516f4b35326894f3bd196c9bc47a809c2f9519d85dcb9bc9da8dda3f6f16ef9f0159bcea2d807682b90836ab6566144d5a7a58f887496c370129d25aca4b3340e93e351f274f9277ea14895a3d0dad15e163e8244edec3743ac508a2c2516893ce858f0b2200dd9d270772d1087402bec538ede417c9f8314bd2c713c079c9b78610ecacb92cddfc2ae59cb32daf2e5129aa502f26929759ba657d7a7cc0226a1442c342be1540d07459d785869a191700a5d481c906669b6f80df77ed3662c4904063df56199063a6f9766c186102d33b541d49c6ec5a432cc7bf545b901ba677ca1235a1720edaafb2234fdc337f2466345eabc4a00cad1e2ff6da1d545cc00d1e5d562cc8eaefbd29a03955f4c8c68d3227a9370dd023cacbed25d7ac07bdeec6e644c60260413aa096e2aefc35d60c0be3093d45cb4c9450aa114b5eabc2255307cd1ded8a5c1bb6ed77bb1124a7731af7ce7299826e682a2e55412ddb91a88c544d3dc39c8d1a936617177caccd5a13047b64c4a2c4857f270de9f71e3815bc34f2ddb76280744c099f2ef252e90d41116ee252afc4d53644b862720c4bc6821d05cb6de16f1f19fccb373b9574fbae66589c3280d414a217bdc5fc945a9496d81e1f9d9bd9e87d0dafeb18f3f84720fd704cdf598ca750d1ba30c3c439fa0cfc467701bb14de4103fe56e40502ad59fb2960657d715f1d75758ff183f66f452cbf5dcc7f8a08ebc5db45e897751682c4207be1dceaf8816df1b68677530ead5fdbf4460b879527ca653757d313fcdfc69add540b952caf23aa326f506a1289dd357de5274cc9dbc66d69fba2e92ab5de928a08f04e43a0315ff0e429527ba6561032391672ab713b113caea020a717b6e62e525a04bad33b8ecf284d769c02574fb03d9f99be413929157575e670c029fc1043c52a90978da46b9530437579697a84f36b8091ec8499d0e2c065e80ab2deb785c2d1bb0d9db75e4f3f818d82e32b4148978b343e81498b558db480556ffb17c768e6101f6af5cc2978b1caef54ad848afeb5d83c6473f9b2c297ff85cfec552ddef82481ee79f80e14ca4649dcf177dd5d969f593f06beedc1c13929b57ccc70d1a9b10b108caf06630857ffd6e2352419dc999a446c98634e1fe45f2aeef715475f943c644b49028c749fec0b6cf2b9042b0462d015bc99ce0b6d41af9166cf7d58ce25cce044563fe175b747b1b2c26a35e96cf577ad2a01cda0b9035bef587603e2d24320cee42f15827130d415b7137393c0601fc6620ab7dc7c54178922aa0fe741e887a742f6620c7855b17e8f1f45f9de9fe2a2d7f3630f15db3f1f8eef7076dbbbb1523f6cc16a4e65b5c4f6a2079d2ee6f496594b39becf633a0f09c4ed32df31a6772e5848b7d5372f59b4129af924b01b4c537aa92eba68a8de51200efae8d8b2c68c67ec95b9186c2c6817ff0cd56199f16c85c742245807a019ac3d7ad3665014c6984034b0d954ada327bb0081cd1fbb6c429a8043b30887f69badb1d23ea1010924c25243910eaebd0eb3fcff02ce9b51b613184f364ee0c8f3df960bc9a78e2499fbd42f231ba67327d462963417a5386295b1e1ae09f6440301fd69c94e1eb96f14c95c262ec51e045544c5ee1f93d9d79474dacdaa4cd0d7b84df627d6c3b1e815f9b0226b3ca1cc6b1e974f8bfab72c30f8435185c25bcf1771ced9618bfce80f97c0203ba3542745b300cbb4a07cde6a217ce4e5c0dff6a720b0636af51393428e2d990a92034909cb8ed8e31b9fa5ef66d66af2b7b21273d28404657e7bef56655e6013b17e9a5fe6fe44c4f750a24d6f7421e423904165536b2f7de5b6e29654a32053c076d07f0064c35c8b4909343550b0b17706c90a2e1c4116b8732395794dce810850304131b1ca65843e0b0a426c9e966881088c03a296373021b687638aaf962b44a0a63a7927c3618d144c182e7c46865c585ee86a7af690977c394a7a4644bea908e7828336b5a81051c86362965b440592d1bca5414acc083149815928eae5861044752b818b50e470ee3da84110f4e332947bcc003524baa4a66b56cf80c8a0903299b9cd6ab7b3962b0adcb33a62717c70e967579c614431796c61937a62c0d191b27b0360b1d66412881c3089b73791604930d42c968f5afd7f1429a722537e0e822082656825862a38c208672d4606bc848598e8b2976550514ab45dd686257576c98616ba2d8fe19103ab0e0b665592d0f646072c1d61a707061bdcb33205ab8320b65bfcb33204eb82f1f28250b6514bd88a64be3f28c698c2b2fcfa088b61274aca336599ccbd1a38c73c657c0142b8058428b11165462b3de39bff64bca5ab55b5f16c12fbe32f7e123a5895f7cb7304aed037a7db6087a347736c54fc76bb5f68b436008f2a594f2653a523acc433ab143bf384aeefea4cd081aa41a9e1edf6dd86d7015c5caac4efb7015a6ae2b88fcfa3594b90a5357bed79a84c41d85772abb4073699caa76c33d5e9313150e8a7ba80bcc7406d64219c5e1367d729dd270a58395c923caa47df0c7159395d123ba43fbb8f97eaad43e58df4f8f7c07e73be7fb37a34dc9cb3614f08e1f552743de04efb8921217a52b94b850f2620bf7d827bce3515151a2a644598982bafd55a916717f5d5263d8e1f65722eed9be5ff3c23b3249abc23b126a8a7bb8efd7a8704ff7497528898c24142489b9505da0b840350135bbfdda0cbc23ab1cd629e09d89a421718f2706f77c9a9316457b5285c345d29820694b90b42224336e3f858277e653145de29d19c62914eea1f9a72a315e9eacb8bda535b355647488dbd1b986e8f6db185d3ff29d16d34abed3b32694b8285da144a5d4599847370e4fa2a2444d897a8aea24e6d1ef657c279ac1b0fe2ef232bdc4cb740c5ea69b78996826c977a2155eaa188b8256997eae036313f3e8f7c078c43ce2100cabea9f224713ad59acc294e3490b87db5533dcfeaa0b300f0c30ecc9778228c9118b5a66d814204151adb05e5a619e3c601e2d1b38600ec80e9b617c0700597224a0d53c6ee7801c63f1d780fcbed5abc5668d619847b360b94bba691a4d494d965e36c26adf63d53d0b8c75c5a7f1423157a4f140394f230c5a8a1f64f33961d01250cee37c10eb697c0c8170826e725e2866a373afd1fb40193fd13cc782829680687c4e1894f3344257cd732c88c6bb6a4270d184204423373ec7bc9c0e220951a75fcdb11c1e1cf0dd574a748ec4817e033a1294db6f03ae66903d65428f7c887b4ce09d4906c3fac5c8be4af6b7b370a4dbef48cca3679995132b73249a649b1e31632269c6c40bf6088969aace84509a502ca1a2c2091824c228810f1e483a4106272a60b182286dd659b54937f040a7f594524aabc41c2d9e27658bcaa45f48525288b629514c5198aa602a92b149bf2213118c486048052e40a448b780eec1f303c8061ebc6cbf74229386f587dbe6f1f60c9280a45689394df01028d693aa9149937e552f1606e6d14f438595b1140c214820c2c03d6c25d0af210deb8f46afd77fab7542e8573f0a362649b1c3453c86164e810636923474cc3ea4f4d6a0b984788b748c459a5fbe377390383474d953a8956a744af728ca814b7132a1e3755e09dd6b0cebc0a6851ec831cdeb38d4408d75ed7bef857c5ec761ae504c28d6df8144dd7b2091f73bcab024709918730164f3bb72ac0339c669df070760caccdad76d52c70bd6814bdc8e98413ff7edd8a1e305ebc0a5ad35292e2c794b1741c73a9666c7814bda4fb004ed83c8bb7df781dcc20b144366987f07eebc95afd0ad1efd42305a2281e78e50c46ffdd7158a711c48c47d922512786e112f80906f94ce550d39d077db3e06f8993395e3b64f7bd976e7120756743286de08f1e595852e79353088dc80dff89acf90c60c647184f85a0c3bf812e295d1db94cad035c28cdcc32a28c239e63075f019e425a3afd149dfdb9b1e4b082b3b9eb931f46206f527182f4b08db5103be3deb77b3562d087defc0a7cc6e21a2c7c8313e6969c9dcdcdcfcb1bb69ec2eedded352b20cbbbb95407deb73f409ee2d93d21ba9566959376074354f7477773b33334721a5fc60049c20ac3bc2fc19a30a8a90de471ea1a6e4cda794de35501a571cae9847ff17848d2f5b454a23154dd3b8bb484ae9a4d231334801f0725f2119a35294f656ee7c2c55184b6ce7e1d1d179bdfee7954b91e02bdaf4cb3a5a0ad135b70f0df8d576f3c1d3afd86a353795b46ab44a495f03f671b5afe1694a5f164e2074f77677f7c8dd6aca904c4abd2120dd43d98e5516a1374e7d2fab2b1a0b72c3a2d0e5afbe94f9a55fbd6fc9aaac29287bd5981491e251342a63a62a0c4fb11447311495e9c41d973ef37795b972be8124f8ada14c48485250d64f8d54051593ca7094ec75e97c0d24c1c8d59e49d0aec6cca376d36709f2d7293a6ea6a71bde1f1f28c6af61d0f631747150fc0e5d423106d9fd43f007e2ef81f77ca08f37ca3fd25fffc8120d81b48f7fa47eff06ba3874cd1084fefa40fd350c81e26b7f040bdbaf73270e5b6cd9a2ca154f503171c513624cd10455135d6810d92144e2500544600ab27462cb95f194144c37ce9cc872e357a0e3cf47764f41d9cff597f47f62f1239208940a0d49cafd8abf5a62d9821512969fdfe3a9a7e162e7f3dbeee3b77cc7fb089564061967e850c55115b1f8467c476868043c8811a2a9ca8c2a167f88ef0815b50066ca124c504d5cc900082840281145105c906251c77b9d3ba57ca235286809c8fb2e0ceade0b833c2e9421a94afab9f435cacfb119bb80ce6d0d8c25a89698625ddca498c11443c2585478618986450c09eb87d91238203115494543b14e267185293271e24a9858833a4db18e6a52407c61146bd0860a31241de3937e020629a2c0a18a13142a68012ad6a08b8a58e75342d0042a5671c21143b106990a1b623dbc74818ab5833e46901426d60ec617c8d8c249acc11e58625d75820ac1e639c84f5009a20ce739184560740446e739888193a1305d785228d182c9d764cc19b16e350229acc43a1acf417e428a8212ebac96223027a8f11ce42a8e4022818de760004cc0c5cb981bcfc1a00094a1e4029918921f67f46043ccbfc1a0f8c31831242c1b621e3ac84c0c257d116b90b99411eb705837363839579018fa126b90752586a45bd3b422b494e183181c332d5508410224b4209163480b1037ccd092148616166e3c591b3338b458eb050e3158e038d3b4028e2a2c4b8b0d2cac8d931176e5438e2412d4c082ed2ecf4870745f2430a2f475bc76d43935a5b391a67de53ae627dddda594d2a537bda3ee9cb6555937d9d238a7ddf4e4577de5ee5e8cee14f439a78ceeef21d7ac2e18eaba283d99e4c02f7318b15cbe7263ec9f49355b37efb8f15c492ae30b5da1dbc5183fb2b4ba59aef38e1dcf95ac1bd779ded1dbb8ae87f779c78fe7eac575deb7f28eabce05428cfddc9aebfaae773dee7a7203716e17db6b50361904afe4b98aab38c294ef81f935b3ddbf6bbc0b709608ba3a0bf3903838b763e1d80882b7a3e11d69f05c49e6d1b19cd525117122ab6fdc93361f938d93b76c5093038bb4544a77772c3277775fc96fdb5e1ec72c7360b1b1cb818573fa63077f9f8f2bb17d5a5d693474bab3aa582965d286d9c60bd611d6f3dadd0614363e8e97038b65ceb1ad262e7d7677d269ad35de4dce0d0b8785c3c2c9b9891127091a3ea50d36614caf915668b4acd4785d2a6d5270e443c3985e23add4b0c0157dcacfa78c9a7e23add8f87ce6db90377ccaa8e937d2ca0d1c5672cc303aa84733f802218c107158ffcffc4686d18c15abe48b461e38a4079b312e204294300fca99c30ad0f703863c3a3a3a0bf0200a54a869382ced021db265add38e5794970e0004204627ebd52a31905bac9418c41863b462f362624ee969dac675deb7b235394c8e8e6c70941819ddb07ce8c6a5fce992e9e62687ce19e818f32987468c4fad6dd231e653ab8605314e0b2cb0c0f5b95c2e1b934231e9938d1b313eddf87ce6dfc0416796499f983c944c39fe89e9c1294ce09c915f72826086174c61ba400700621c02005e009cc009408c31c627d814327e1df8dcbacb95394c8e8e56384a8c8c685891a85f4371c8dedc1e8a66feaf0c838c48e132343436fc1bf8a8ec05d5e597005008fc205c91aca421229b9b1aede34e946ad1b8fc38ac416c62d54aa445332a90f4e3e71c0f674e4e0e8d8f86f7347abc1ba5ba851f372239ac6503b8fc30d62032c50c625353538b7e14918a13527f1c8233e88f426aa42298475f9a568deecaa2991a353e1ffa352cf809e175347d226e6c8a19f40edea979ae012da869431cd61c41d0625e18c263b14dd4afa17eb551c7a6a841348333e847ea33cce3e3605e0f693e22fdeaafb2c0e5550f37a07e750c65bfbe1f970d6bc68c193377019f07366e683aafd76b0320dd0d0f92387278d66146e8e8d7e77810850ac6827dbb0b6c3461fdbb8bace15b356c8d99dbd10cc733bce37d7b616c6a272d43b7d029ac6afdac6d926a6aca119b6e7f97c335065a545b65cb3edd1a879ef0c6e0c9e1fe084102313e912c50588c1b8d6e64a23d47a5a11ba144a8b8254e9970e3776591eac6323712c5e74652428a1a57d64d2295ef659d254a494fd1552d86accd188571a3cc95dc186db54f322e73631c62728a61625592524b453fbad1916e5ca2865b53f3f6f3a9f96b9fe6f3b1f22f8d1797e6579f0f4dbdabff3e9f95fc9460e17eef7d3e5f7515a6aef7dde7e3755fb5b8dd8c85db3df7f9749675b9df3e1f4e6e59aadcca54d20aa9614972352c595cedcad26d016069e84c528cd269823b715c498a49ebc3ca0c75a763f6e90ad5c415947f7dcda24b152e1d3b90789204511253b7bff554c4edffd95314b775b6e8a0a2c26d13dca64275bb4a152464b8fdd489dfe2ed8067c4502d1962a268880d5458ac20c9135b4e30a3d0829332d6d28700dcb55c23a4aefb11275c37a2e8fa73b1a163ca11016e7fb55390b8fdadef571545503951b96d574f5899e4699d2bb34184934a0419b7df767345d45a6d1011c30a35727072111182155a3b3c5970c6121a4e02de7bf293d3ab469d7c568d72d2cab7528ab25a7d3ef35792664a3a399ddb028303bd6adad75f7d1f684066af1f41611e6d853e8db452a333fa57effba0fef6dde7b3b98736ac5463306e7f27ad58fbf9f85b5923a7578d3af9ac1adda415eb43df561b395da3d5896a1addaa159f1aadd28abf8dbc91d3ab469d7c568d5669c5c319d2aa56b54aa79c52353ae513174c5dd779d3568d4ef924358f2e354dc6a8bde64f5ad52a9d724ad5e8944f5352ad4e49a7c839257daada944f5ad52a9d724ad5e8944f4e15a36acbba6d9c36442a044d4a85120417128945c42322365a58a0efbace9b1cc81b91bbfde6793dfe4948b173f718916e95dff7ad1c080f0fcff77d3ef33f8da67f7ad41f47972ad19e48347afd4faa241e6944a2d10c65f1a92a08231a9a28bb679dd7580322310390eba13acc88a67e31f5ab9d9a48d4202e7106fdf629082850a8a6f156fb068c2796bf5e9e4d0df1473897187d442943d70fadf5233b530f4270ee91efeefe235b0ed3409d2967b0edb19d8a6aa545baf5b20d0f1641fcc062052c46164cd4a91fb8c84f0cc565b290e2769595c8a2a8625144f5ee9c5fcb5c718435c095efd2a59c0abfc07f5cd98f6b4b2075fd5b2600e2fa7f9724d7ffd5a5cbf5d7e1599712185dff46ba5ddcca884f35d6bfa2d6a82fe1955faf60c275e56b4dc49915395c299f56a92bf3ae94fae14a2965c5c5c2caaa744eead811935c598f1f9c65cb95f11432a6923bae8ccddc90924934818c54a2f8e2dad6bf74c2b8f2798078f033440422465cf946a4586288cbcc888c2b675398b9f2235212172d94a82082c9852b675598e0caa618acfde1f6b78ce2e593fd524a195a1b80288aaa7def050f0a231688a4a2cc2841c129ea8b1652488ad2220428848962420622a528249624091305e585a2a4a81960486214451443d1d41363b090c4a97a816a2f495766bf86ca93145bb4a8465ba2b83256165bb0e440c17a97675b8af0c1de5c9e6dd9c146175b445065cb095e909aa34f6d996ae2faf393144c4d8c600a6ab6a00107ea8dcfb27ae1ab67e418fd7fcd24a0f8be336bf0dae091fef90ecef0c8fce9ae699abb6b0de54d888886382c6a1a75b45b019ba430fadf0ae09e7ecb02816aaf5d2d9f7b21fe5b18722f393087784234617bee653d571687ac103ec415e20b9186a8178801f3a0bff2bce76f3e90deb6d0f5d36d1b07ba3a7481c071dbc67f8405c672bff537bf8b33f6aa87effb1312635f18bd4f525afd203975fa6ad20bc8f7409a13c1034320b2eae417f2d4606571888708834b5f7b5d4afbf955b9ede5036da1ab762f64fb2e3cf23df785aefa5e3ce2fe7b215d18871c96148d2e7d8e523a2431e09e498f3421ef2d0ae9b0b9712f447b2e3cd2df3d171e5902eaeffe88cb6c27a5a685ae9f8de3ba8f52cacec8102411a68e34edc5813a407eb6ea5a68699c58f991881d269f6888c3e41371987cd9134c4765f6d5af86516dabd1c89f7b23432612f7f4f4d3a397c31cfc7198c334f06fb015681ff473544afde9d71cdc339f3e0eee915fb545ab3936b5678eb53b90ee6ed766b70d72a98b80504c3e0d1209dcb3baf1a712f7f4dc18a309377258a30a37f2f6b1c6a14914a95439557d77419338b48409629630818a4d371bd1a1f8942846af61f163f53cd70fa52e21dea50b26b16d87b3f0c14da0f8b8039b894650887165914944f2662e373af56b7eed422e24e2b0880401aef4c8bb92a0b3cccfb7631d32baf3e330e943c60a79789e88fca125c8b8d277ea8a86c761f2693f0f8d754a43621ef23fbe8c462ad1f423c530d1c9773c4645a6304c44fc873c1a691cc643111c868395c5d8d43ee474511775d7de3b2d96e9977c9f2846bfe48791c961f29d3e552c1deb90cda74bd977e4cb7af0300d9295e9501d19867b7aae7f2b0ed9323ec59ab2dfb3bebf22ade87b56e8d29634a0ef09fb7df7854f3f3c0ea33aac297b64a9fe91ee597fe47befe347a04e7ea14b930fd4017defff85dff7791d18bff8f91489fdfd107d6ff39d37475f9110cfe8801de8aad5c6e6857cdfdb7c3aac9704c8c171e9cb563b38228cbe8cde79bf870ab2f92e04e2b05b3750fbf96cb80f929c7f5735d0a670e3e70261b5fa5e280664df55bf07eafea3f9ee6b0864f3356ff342fd31205e239dc2e5cfa7c8f647e47f2fc4263ce22e1058dfbd1056f7367fe4e659df692097c2ed3ad055c207f11ae9177d9f223f3737ef12d23dcb467b9ce7d80dd83deb85d83c4e78e4e66d9e151e5902ba096dc2231cf26a490d0804fc71187d1a901dc6852b901da6853296fa1e48fe17f200f97ba1066a77b5447ef740f2bbd0559f63405c2f7d20f43da0af439f8712c9f79f4f972f40d209cd5e3d75327adf13f6fb99a1eb87be0b48fb4841e098083fdc63c43d3dd365cb61530375402033a491c14af93ff189fcfbe59c8a82fbeb0b89af8547b68f5fc3234b4047b8f5b1be502c5ce77dd5934d66d2445aadbe0ee49d472d9f9ac5b2e59acf6736d13851696a1c9c88336f5834383938393939ac1b9b9c9c1a9b93934393b3fa7272bc1c0c56f1756e0c3b1cbafe1b23ffb8f281708f76e5ca02611ef26b3061653d7a704f6400077196a1eb7bbe342f74e317c4dff5418dfd9ae75b6366e5d3801e58038bfd9b302c4d18ffe3015d361fafcd7f6091795d36618f7ec9974f7386fd7b01132be3270bae985820ff546beb7a58420433a07347e08f4236ce1274ec3b413ec39623aa5810129da6aaa5987c242b282962fe41cca58c5810123026c3a5fe241ef370293e3f928e1acc503034abaa9a557131ab7a6256e534ab8a615615825955d18c4c1833325cccc8789991899a91799a91699a9151627de9b83bd69182aa270bbc589e9de089ef099c6efc71022697c7e5d91754978cd195e9dc263374fb7bfc60403fc05f7eab7f88af988af115589ca4e0050a9ec49a0055318ef9cb6e39cc42b17f69c060bf98e2f28c0cd2cd7179e685d4d5e11ebffd05107226d6830c63dda35fdd63ec5f7efa62caa53af99d04f9f68f26d13550f6b2d9e4caa7b482da537e202d74791e81ba1189ceb3743f1764db405995edb8ae811cb8b1d0d5c0227e6928afc40ca4e42b546314d34176c4577b2873c4b0321defeeeed6bf1c20afac7b7120743bd4d12f679e32f3a3497774e77bb3c9ed9410f56b7e68bf5899957544773e10af357265a617ca7adc3925d5f52aef78de5b70f58306effdf3f17e34e932a766970dfac5ba73837e4d2f04d22fafd959ed30c3e6f7e0f9b15a8dd0bde6c984beeffbbe0e947d80ea762f8baf6d1cd84e97038bccbb853f688819680fc4b93ba230385df7e248e8c6d831286baa0b74df8536c458998d2d44bcca43ee99e3ece5f8039b6acac7440de2e5bcb8dd0280b89dd5fbdbf897f35486f5d380d57756a16558bfcfbc50ba5d7b1d38c2f6d30beea7e7852e0ff87adf015f2ff4be8bdcad03657fbbf7b4af4277038f28dd0a1699738642963eb96106e64885191813665fc6f862f6856af6650b95d99726a626b32f48431d153f72b419133b768d15eded535c3059ae27e15e8b902e8560303f483023b8ac7e09d12e3f975f92c620c929e718a33144628889a098298d6a3c13d3e58ad97265e065314a88a122a59462a08849a294d2ba8939123314376ee3bcf0a6b88eeba61659ad5b182a97c573f9237318a58b340b73340b53a4d3751d58237f99028c19aec865e6c1f6caac0b1e689875d142d4ac8b14ce9011c66c8c175f6663b0988d99623626cb6c0c11b3314cb3305066637ac04901278596f9b794b2bdb08e601dc13a0227094e129c229ca2e8b5cb28328a4b19454691534691516614da50b4eca1a3f38387a7dd75fcef78bdda87b3e665314d8f37b0a4b0a46cb1b6e654ce2999a9335fe923b2bbbb7b6466666e82714aa717d987f4f994bb5d6b91356ee5b3a5d4d14d038b0a8b886aa47a67a352473b598691f6215b2d6eb5c074b2a303b8070ef33980de9e5f6b7552fa91b5b087fa5ce5c7817c3a79cedb2fe5b56074dc3e5caf1d332a252a27cc332a192e8b2a05a2ce7a282372b967707baab594524a29e516d6908816b694524a29a5bbbbbbbb9419a945f672bea3028d58111277774ae927e189d12f0a9adf72582c128ad1b088be4b04204016c47c002e804ce8caf8391a3217803f4a9063f17297fbeef919094b2999513405159733966241fe45487824c1c5932b64a0c8412a26bfbb3f094fac4324423d5471c20a7ea8c10713a28811111119f1c4fa8d5eb17e22a356acdfa8c6fa898892d4180a346586865a3114343344495e3114fc8ca198fc243c31191679b8c485ae4ea891d4f6b074dc66bc5e3574de2f77fa3bc0b0f42becca9f2e7982b1a7f611361bc057fb098bf2f5d226659d21e7bfaef6349c3e41edb548e7bfaea4e1072f979cd3cdb0d3e79cf4690d47a0a18bfea4af3bc357bf5c898e3f00c5b10629e6d8fd01c71b3ad621b3dc711b7f31ba7f79c64598dbb52bc8fc5a3dee83edb56fe318a09de16287cb332aa73b80cbb32dbadc1a443b73e68c19373e6fcfdecb2f08bdb207a38f753fc11eba1089175bea9f1f07fddb73e01784bae64fd77c2abdaaeb982917c3ed415619964157fc79e9d7f00323eb1d3d19eb361750b7e6f28c8b2666efd1e3be0eab6583bff954fb38a061643ba0dee56cb40fbecd7120675df1bb97f55d917ffb0e94c9eb7afe3888ac15d8f81cb0804c887b2e1c810bb73094cdc46c8b272758aa4365c28630b6c680838c16706cb145921b5eb618ba7186ad65b2d85a958307bb81c181c5522f492c35c18d17a6b85186ad5b6c4861b5998d33ac8d14309eb8804395e52ecfb49041aa851b465aa4e083164365a27ce83ad68d8dd7b46d9aeeeeeed5e775cd6dd57675ed3d089b4ee93cdebe436777379d5d6babd5eaeeee9500c8e84a90b7c86ca1eb51ce1f873595fe1e902d753cc6eeda82bbbbcbd0dddde79c734e1fae4edbddd2bc74e64be9b3e94bb2a6454d1d3c878d76019c1ba8844c99ca6ad421220100000000e315002020100e88030291400e24a2aeda0e14800f7296346c5430190823390ec32088a1180821c600600c00c6188090528acc460020287a162b06d2e137e3bbf7731ffd3e5288db468a048c42b62df10558ddb7cd951fe37121e11b73fb993bb031db9bca2e9e98522e9fd73e504b628ae8bb90e8f4171d6d90ea097a106224a031aca42664f2357e10d8b0e09da4dcbec420cb464cc4c7190bd699af7e8eea61bad491dfc2e6ced18ab4cc68f38e8741391f781b99cd3c2faa7abcc9dea2522a272f858028780be72ecc06daef608474cf54221d90c589c339ba96d098efa3d8cdbcef6c88dc1e8636d7872b136f24cd20209ace9325999886dc487a38614486b98b086ee21c35a71f0fe7457af6b87146cdb9acb3aad3f604c4f939d5103f33cb7fb453476852beb2c98e0d16e956e972d77dc88ad693bac46813c1b2c2bbafa8729fc8a41da923ee384ecab975a2a0fa77e7c797d37583848f8c34ae23db76a3c53fe051d7bfb8982cc00d28d8d2311efe870c60b0fa90d60319d68f277900bcd4a9a2f3fe8e16a0dace4f2ebae90a4e356af253af5c3d0989c90e34ac19fcfc118d5fbc04377835c486e5344d2730c6032018a15427463a281462f40144c3dcaad3c3ff1abb0985d45877e3a368e8bc55358ccd05b15c2b331762fb1a645216eb35b7a920866b6aa6424c5fa74c65b1bd0e9b17c472adcd5ca05846d74acd99b8e26e12e9f18f4fa7cb5f7f6c4d7b154ad7940133b22763d10fa966b6825ba492094bdb091fce5aa6d313faccfd88831dffde0bd743e0516d98cfa8a86b687314904554b221888ca4977caca56afb663fd658a92bc16dd143c8b1457fff0d5c4f24eb4b1373c0861f832980ce7322e006f0a6f352dc6ccec642ca4b7fb8d71dc65cc1b1c13e722d98d2b2b0b17bd0c201347875b7448f04223b0c3216232b40dce72caef4c1dae845e8a01f5aa8bdda1346b505129585069e3b1d3efd8cb526c361c75fd8060fc32332f683f23f64a417bdbd568194d92edc0ee8b72c0d27d9e3bc834a8a2bedad5aaac12a3a3aab89647b84466a16364b5d934e86e3b55e6d3cb930db22bf98afa7897cd6c0d6bfc918dd6397bf115a29f2355db6674062b320bbd001a1270b35862a08ef571fbd5286f0c8da46f035f4edc8f71085849141382b25d22e57d0b2ea89120337caf981b919dafb83c485f9067b058107773c531721c8c887ead92ca8577fdcaab9b3d28fa56427bc118cba372221a4adea75c722e30b9a90614ef7a9c6789e3dad9b10e69b8fe2c45be85d431636e84e1d1797955419b26f766c6f73b764a07f1248e4d50d92179aa88d64fedc8198ca88bc6ff6f43ade62e88282852e0cb6e996e63227181f4a3d79c00cd7474b6766ad46e348b072a7f3e7aa60c09c9afde7966c9c9c23983f6a607cc6d6cf564ec172c721290b00bdc2f2731b55e1d3c6a940f592fb35c71b2eafd0c4691adc74829f9ebea019c4626d4e42880be2adcccf55891663430a2018b21a9ae92e0cdf7ce1308513f908e6b78dbe68ee869b931eab15e571fda8d294004e598bd6f2705c86f5e95bcd2789ed71f70eeceae6a5fa35717879d2d399f1c0bc8701149578f1da9b251cf8f243ef77564149a15309aab578dc667bb8e64daca0daa13174e9b8240e4767e86d24718b1ce9a5cccb9d118ee089d361649f37a191b89b76052b54160f3e1ec1e6173f8d7bb0bc980a0c3d86a30a07dbd4cc818fff87d3471a2908470dba6f78c7a48d6f6b42839efe242ed000a2cc3a9769b299b31d92b820e5fde7a86c6ea76c68140de107a8c03231f55277dda43072832202973417b2343c8be14ace53eaaa9ab433defaf27ab23eccbc7e6611d8a120bbc89d9ddab9b4856687060b9f2e1e39e0f0bd78073282ee4829c11d8106130e9edd831895b046e3da4aba39d657cf5d3902c1ddda9b4f7df21cc9408f4453266d3a8c120eaa2c9a20f43a0416ccee498f96d6a8991f91dd1ace0e72f197e4635e1db09a8c7947f8b7d48e580442ea532b33f1c164404108149273a676a5d29797cb794869b1021cb11d0e4edf4e17a6d58f2c49eb469ab55b96b1c8480e8a8f8c1b4eca247e4641079b78f9b1a671fa782613db23004367ddebe2245ce5457e74e1d70ae24acbb52bbc8e2287c02a0a33c65eabc19bcf5136bfb8c9f9518a7e3b928d59a1fa51690877937bc6c6773ae1964b68fc40bcea0a2315e2242fe5279e63e9a80af97ffc1cffde2be692b8fa5d4550094763c7075d523082f5d0a98d10a7796f07e1a65eae8d10f96b7bd9916f50457cd97e743b2f813dc3f4d0575e02c53e9201a6ba06f4e601f76070d8ff7cc4666b1b34d98620ed6ada9d5010402c913cf57134412ae553740755ca8f2c33c94ee014f82d3514b039974ac77ffaa7ff6eac17e7324282a0dc45e1d111ae33addb2c82cd07bbdfe4133310c10d7eb4157c28277b8c13ead01be2661f4b1b3e6e35320b109fef02d08331343b1ff743f1c01ed313f93a500103279a4a3a86151c3acd07585cd45ccf9ec06311d6d578d892d22f389773a30e2916b31834efbcda853315ef9310f50c00cf05ec526fc1d655509b15e0de36c1b93a6537acf3a7a3646480640c93dd1223eda5e2bdefcb2b1186c87ecf28e08bcfd0a7e907fe9f9332f6bcb7fb87908c0496a960312676b393ee82f78e2aae7a816b5b0b1efbf14273b396c06dbd982dffc12f92cb162875db6e7c7464a82f44ac3ea7a65692353f68db8bfad08813d74809941e08f826f7e8e46835b59c164a69c21fefc0cd3bb210fe700d57a8ef0b1dd11d2172d43725c4f7e2e261aebd05e4bdb7499de4ff0bb0fc22f414a0232d6a31898333bc25a0f3ed071c9da0f368a1a143bb2f52104f6b18ebe14f77e133da7c3c0ece9088e896c8fc366093d11d5b3a09c3d74bdc74532fc5bf1efd0c37a6d3ab1dfc610d20fda365925de6d72cf5034f29d3c414bb5e12d21d22f58744e456a8d497bcbb7002f225181a210db41800eb76ec07f399eb0ec33451f0616cd03379f733702c0e3c70a2216bca1dd1100310e3c0e82734c8c99e08d1022ba0151578c39957dee39823fd796116eca24a4c83cd2e77af28f0cda0a7b1608d3568f6cd9ad66597a8f26a054b7c88a4e369e12c2bd0d70d21a79c3d8a4fe8885613821497bc99662ba2dd94f111facb0ee3f518e3553af3a4643208f3c5551bfd90c62ba7c17d2fac45c99b1cdfd21dba9fe17b54a6e262645b061d368f23b67e97fef9be5bdece16e61574f167c9f2f7fd652a90dcd77507b2d61e7ddd0b25c21b2dc8d6da8f583d6c4c8ca6712f78ba9cb15c50794daebf82bbebf8b2cdc2caeea9b7d6e37390d8fea93e9e51a5cfcf2bb1b56b629abf0f84cbb4f015076fa3cba265f09cfec8541465d0c1a339ebcce6770eb02c3bc48534b89ea4da295c01a85ffe1d78be80957399973f1d9ad9166117a39d6c4496f474dce46a5def75f7cf97c8a77872070b5fcb387a1dbd3ec5408d92cda4a52626a8a3d81dbe0684507d21352b6ec532962a2d5ecb7d35c365a4647e306216fc9e26f724ae5d3ece6c97a876a86cd6bd190146543ce5fdd1c692560f347aec54f2002e8f1b3b34c986dd667d4df000195d3323b1a5fc79cf708ebb23f4d65d301e902fcb08dedbf7a29cfe0e1201aabc4adcdc110d42bc50863cbb59e131a67e3db617d74a3e3d3d78b8cce7953564b8b0ac8c96169742cdf496024fb2eee170a0f4c8c50dc1a2c40f0e4fd2e28cc232bcd72e9c402762becd6f865bd9fbd7ab6f77f535af2ff9aa3197dfbae38cf7b8f9356f7d69bac98f4eb2e7a050fdc1ceb657423d0d3e12a67700fefb28fd0fa0774bbd059d72e97f5bb4222d3f9939b1f5521f219f99156223469a1472b90457c742fc7e74868ed727ca98fc03a88fc7c533485dc600acc9b6d2d1b493462e9a6bf233e1caf8f79389fad4507520ee209905bfb9ff8abd3c8b1ce77907d1c214603dbf0c84e0753d9b1912a283619c556608d255410fe58e161f3e9cf17c83e5e412553d457556c62cb73b3c1515f8a27fd20c52010f2facc5b22f54725bce5c20a0f22ac7f438fbb12e16bbb5cf1913c5a1285ae1ac2260b2245896e25cb3453a2365790abb027d7fd22ac4ddd74f09a69ab7b4948b587681a5b5127e807af7d4508a7eed54728bd1cd87e46516268270c45eed90e7f5f32b54d927873fa8d9e4f5a8771c63eeb409eb2f3fc88cb265d58ef8f67cdad69656237c15371e0f7d321a7d2a9ac631952fcdae7b8858b93d1538d96e25f4663f1a503d0753ce0f58e231fde767cbf54f68e642ee52a4ff3a65c062ba4bcf8ce340ac374b8d6ab40c2bc940a74d831c87b3671466f1eb023f7e0dfe3eabec65572741f317d70a5323050ea6d4f979bf9d62402a45db67622f9ae4c8bc0d005ad0795286356eb15b1d27aec136284c1ceaa40c1aae9955f17e1b3fb4586fe8d69551d3a4f95f194f355356306ea84d389aa2e1f9b612eb17422d7204d3994d46fd9e00d4575a9317bf8a6206825ee0aab29aac8938e974c4907ee7bfb4ddcdfa17ce304d93052e05538f4b580113d116144c37c1901580a4897ae508e670dee363f2037909822be659a5041f65ef9917398b4df176cc893bf5651491ceecf5f48a9e0da83151abf4cb7c4c4b1ca1855d7b9e878d4431623f47a2ed1e5f5f1c0a77198232f2d5e337d4d0c5465ecc9b9b63a28acf285b21208cc537b50e6ba56a5b27d0a653c7ebab202a38ea5c97eaf178afec8c72651db5a447e25fc4427709a5c6849fa30e1e40e5de88345cbc592e96167c151873a91e76a565d984947b02dfbc0d2c74971e7a9c83227235b13680dce58931a7a1d25f166bffe1b3a06e680528ce30a820418758e60fe6b2612df7a640b8bf923f4fd402d2777a046eb0e40127185a591360989b9f34709f856428a1c88176c61b61d7299589a650dd4f36afa3a458852402ed22c79f5dc04ed1b02fb53b6f1da2d0140bbdfd0f88f64a3aa7f400374be92803c1a7d797b53928ffe491d5c04a81825a98474ddac1cc6a746226b407841bf68f46310cc3423061a6bab093ffcb18a14678be198d9949a8b5ee11980603a7e962947d49a55bcbd696e84dbc08e8d2c99d7eba98f629904aaef8a8ca80d4ceaf486f1929c610e8d52991cbbd90300363fe3d3091c31385457335c033df2d2b03c059b84aca1094121ac4da57e95504cd265f06219ca0709a51721c7b6b011d9268f758612d539bc4c525fe2ec5dab674612f3e63ef6738febd10a24f35cf0701549157b9324000154ae8f63489ecfd85c423c88b24e57e0f8c1285943b256883d77e9f149d07798d08940a625ec385214144c0af94a64ff21ac2176d978646699f5dbfd11d8be118e9e51af5ef4289d3733171acbc386c5bd965d8c0f662baa0c1f9f13dbbd6cc466e66bd30ad0f9c8f0eaeff1a4261900f06df46fc2bcc54a72b0d9a4ed9ee48ce4fbb11e7513afddffddfacb4c9b1bdb8158e7862008895e005004081078a215bc0d1874ac10061f577fb5bf14f5d384144ab5bfa57b770280e969c9116b6abe8ee9ec15b93144e6a9697bdcb5201b687eafd4a4911b278c45e8dcc5a18d059dbc4438f7e03bcc5bba20471b1bb5232fd6fd57ff78fd63f37f61ebfdc7b6e6e03f3fd025188c96045fa22bcac81e006a406da0148250bf29b18f6e5704e4784921002621d7e31b9f4d7e78dc74277830db38f998fc277e14e5f2cd77aefacef2b0703b2770a13267e29206c6c91370bf3029802de5f7f0b8c94015332a7d129704191b89a133e6d17baac07b811600212d7463f0a1b40d713720aafdffd032cc185c0305b7f0c9547d00f1170b5371506000fe0cba5b10c8913fc3c78b05a78d87ee01fe09aa1af6ee15c7861d1ed7d8330ab44b894beac3e68519629dee93bd421d8efe1075e9d678787f490df31e883ffb62c60414a9d8f81676e2433db2fc33cb81d2e4599f23e4988269d5df284f26b693324919ddd4bcf10393d542754294e1018aa174ef46a06a1151dfc41270a2376a68e6e7602af8c4c40d82c6a48fc13d92fbc72ade93d2e9d54e7812a7a87d73a3d089e35ca2ab08643d50d0b2025070cc85b7f5b0b4beed0ddf57ff8a2c9ac0e13e750a8889ecf0b57d563a3ef346b1f88702273106334f63d581e7992c27746881974a5e10e3d107c1dd66c5e418e744c0967acdebf9a653730c792f4a6fe0fb91217fe387ac40f051fbfdadcf15a2127df8059fd372968a08f5c5d618407c121b5d541aa9b14749a4861e3185753b33275d7e0a40770911b5865e412e52dbda363dbb06accee5d431e0ad97462c8a79a68cee2b6c2ac44d5cdbec543cab792423a44102be2101c2bf8a3c9c61c5436f1e90694a58cac21c4e7eebd3ce87d6099b1e885b763e864f3884a0c9599cc755f84e65d37b5a5335b4934e10e5438371744913733f907fcfee08620cd7bcffae0ed8d75cea1a62084a4b9e3a9196d34e2a9d23b43665faa726a3200cde4217ac1b00d6e38713e88788d6d7f6cd356cb3fbf4c8faa97299cdd9195ca6d97db79b698a00ce7524df6e00e0199f46c2268671f16ba3b815a167cc61580e61e526748acce429a8a5047462c00677a3487693d5258257d76f7e06b4460fb1a113da26072586ce10d068e68ee7fcb07bd170b53d45bd951b1519993371c54c9883bda14ef3580c0395421ac2fb65b070b8330f71eeb83da3ff6a9af5e3ef2bc843f94aefef741aab152aa450d5ce639ee1095ceadc30b82c3ef35d820410cc93e5dc25e0e7a31dd4251df7831f8d8303e6c33a780f62ad95034e6939b9d956a726419d4396aa1ce65bc67d3bf1d9139a2dea8ce4bf930f77563e6846254e436987cc2e61a3f5642c31b49e9ce93526369a2ae376e7902018499fb65dec44f432274114dc858d560788e18485e6cd0f68a902c2c7689b150d139a7810a860cc081e7d4253cdf9d83b5918b04b70a4ab000f0326b312bdfdc74a6bcf53a46d5a4e339e9e4e4a9ae884e81956a34026483298a1cba449faaab1917d58d836b0635d101cf11240accec98ef954e1da28a15f9f3588c5ce10506fc5ac589230f4ba0686c71502e4b59a905ccea1befbbfa34451cc2dea3fed9c4cbb49853cdc426d0a4dd8b5cfadd45a4ab3241b37e80d6df44cbe36a31af18b26e45033b81b47c45c5f10b2238965a01b31a6c2dbf70843ac79270b4a985548c4c2277b84b040d935de380063d2ca9d3f446c2fb4dcc8ad9858eb7079b9121e59426b67c36cad83d4fbc2da98b23c99f6c9f02ac9baa26c99828277ddc7b78d0f1964472aeea10966bfa5c0f4c3bda7a41e31c5d9c26722750f454db6be4119c8912ccbf2cd61e2e673929ae8e1d45f54ff2bbb9a99ad5adfbbcdc79a95fbde31c1783fe54ccc2afaf7cf996593899e6c5b6b47b5d23974e81e78d5d1132281a2f514e6bfaccb81bfe7d07b4445dac1576fefed9d86f797f989cf31753d945929979b48bc08bfb543ab27db90b60249d2849392670fc83ab188ca16e0a9a6400c2357ef3a6e958d9c213e06ec009c858995cc19bf239bd53be759d3149df57f48d64faeddb6d45316ae30f86ac9135d7c6536ada1cfb28e302792bc62e4bb330221705404f50d1329651ec80c844c5a1dbfbb0b8f33c056e33e3e02123a9f809e655a4c265688aeeec7dc28700f56962d6ac7e14a98ed6899f0a1a30bd0067bd9a024b6d5269ab912a584ad3066993bb1482d1faab8aa6dcd02b0f7a9cd53a1079194be21e87340a94053aa40e3bf57a56b180a2b6cc8a9b80b666bd6a58a93bd986a00ca7f465d296581a66dd42546d55302cb5c307b44d6b3479c278869ea6bbafdbbe0ca3cbae71077ad477cc99d9b293bd4a77ab75103bb39ae64546e066c2912eabac1d16ebc13dd8a63e62b1fdec5ec4e2eeb06329930999ca9cb08dfab0be972dcdb085fe0c6e5a990dc6a040e9ed714022539a86784cbcdeb0e37f81275cbabc40f13aadee657d95e2159b101a1ec14f78099c01463d9163a0be57d2868b982f8630433bc615ae8c8fdad188fc6c2228010483f5c37d4ef851783063d1a5dc4da6b84130a72ba56f2feafaf8f04da7987003217aabd7497a697d84bd300b3774035266b4c79a81e481ca9f9cc3cdc4879b7d83a77c9f9e976ead3e3f0c0b7c8595a6ead8db032bc8968abd6c0658be3fe62e46a8c06d3fefe6fca8d2d78ae7cd4fc8019e0d0573960eb8f6bf68be13ecfe4ac1e0339889ee81b4f3779a583d4e042f3756748b3f5ee1e84a50e35f73465b35bb6f0b312a710a9aae2a2f7687b10d52a1017bccadc25c67dfe86077885a0609e0ac6325d3131e29a7e7df2397ef4f1ff13bba8d075e960d6c2b3685da2d79d8117148dce0eaaeaf5e2378d06f7c6c70a1b02e3addfa372ab4b95c5a231e6ef91a8c5a5c92ad1feeb7fe8dc50eae082b45c78dff060c798514d098ed796270acd94c9beeb0435d5591fc51f98163b6ed805268327e573987319af1bde62df3bed1797d464bcafe6689f296d1dc48f7c688ea7cef0eb764a963ba78ccbead7f5c906e13397a235d4d248d919a00f5ad0359b314a0849a5d0628402dbfc874c5312238cd2f406d79547a8fc2bce22e85842f080541da7e42de7c2fb76b4b7078553212c3d5e99caaf803dff8b61a80c17e878d3fac220e9feca03579927540d22e8b753c7c71fb1a94a5a3538fb7650be01342301824c7275b6ca3e89440276780983e195da88b41641a201b2cd427e8a2b3a4c50798324644fb4d03a66ce06e2e2276476e66b9924667e60bd6e72b71f97d01e8c8ddfa14b3b16e81d6de41a96a0304402527a4e33d9b35bee977a646e9e4e9ebc9a54fdf1595ec04daf83e0ce1b00fbd3a570a3880af1b4faaa8ff391e5785b291efbc14020f7c1e3fd725f29945e3a7251ead18d1114a54f6e0390afa43c2bc2ad18c44924fe25d57febac86e8e3ae215663206eb2c63c2fdf95ecaf0f7c44786a1b32cc33e113f535ab4702070b115eb9d6a70924837ce1145ea20f67068cadfef1e050ddd60802393a6563dd7c30d8fe68ca2f8317c0de62e122c520ebf46d0f62054b8065807e986c8f5fb0568bf9a96d0a0fc2e83e26131d04e2957cec8ac013ac044e0700d5fdf711eb7a38f9519bd64a5cc313c66bf4583a21378c90679cc90352ac8632bcaef976962cf91f2ab7199600dabaf348dc4c65138747ca69be9f49381f829d84d13acf6cdfcbf0a62eb69f094750c392078e9735c58af496acc8d2781a3b0a068fd9b3f220aade1b4c891b1d3e12b32def25f49a533aca7febe735c1a30d5a13920657f57286b497ba0cd40df8f9c629ae99ab28add983a45e0073bca1740eac0801a8d2037577f2295406ba57b24e91fb03aefc6067340be964815cdc09d2be26944a2020392b1231dd01fda9e0e8ae7ecc8382f623fd6418411c03eebfa86c77b13a3db8e3303515fab0ccacfe0129446a89bb930a0012df8bb1c81402058c49d7f50e13ae00877bcbee9c3454b727fd3a9323ae18fd2d04a18c070a0440c271abc2348dd678754c362b3efd6df3df0c9cadc2d88a260eb8eb6af391fd914fb2ca70f1f51d766f1727b0b14a96888d7d3abe55c52cc74e215caa360a482e83669b546a0cee159cca59f86da1dad2e96684fab44b70be65afed8d7e63d5b02d1d0e3cd477878ebdad996b3e1ce27472c53a04199ad42df4f97bfd755f2e406040a35a855b422369dfc660259494076e0a6afc82f921e72098e5e12bd222329f8d56a3b9b1bdaf91bdb90e8021836c5fddcf7b6eaa2d859f908cc2d22e7426afe045e579925b5c7147d4c932e1851f639c8009cb0756a3ebf39ec068c90d1261521a6d53620c8aa847a11235ecec31ae8952de30ec170b981b167f851b9c4067893b50c3aeb5fde0d0d73512c8f29f32f3d91bfdbcdb50df335b9153a435c7950f4160955480fac2952615f9a451f9137aaeb9532015541d864221fd9b57ed6daefa11e3bd703f6bee38c4c8787d71b05909af06a5caddce366bcef6e98e4b5d4fdcc2f9278bab1412574f1bac20ed486a4d0033ba39d52edd85599438f0382186ac238fa42722dccac80b831ce79bd49132c80a9467d3bb4e5a4452d8d4765842ed98d758f1f803e8028cba3913c611ea1182e2deb2a654fb7dfe7940234ff4e677c77aa70de851f095fefda5038f5b37ff7228d9b394f34d2d4c4664ece3ab9f503187752a0a8e6bbf9270dad7bcf78cbcd80d24aa5f299e212e9b9cbc436b0bf5cb58c08fed18fb1969447ab37d6949d886d25e350c33a488013b7724c84c7180ae464a244a0e4b49c03502a271140a5a6a76a360a070ac5af583e2ca9dea76fa6b9a198011a18c11929bc81b6b825104f23eaf88783a9ef29e294aac5b7552e2c53c6ea0bc267abc40c9806d25315ad7527e9169bec13393c2d3b797a83aec88ee85e8b7f3794e71ee3b5e911e33502c278ef09a54deb96b0df9d9e992d19799600eae3570ad5ac491872dc30aca577f166c600b0ad2344be4827823e5203eda7349c064d73e477d4080825037f2e61abbda641dcd84bee0fbd34fa784b47f8432fcf6e6cca001dbe432f2d4abc8bbe8bb23794eee8b52000078943ae6f0e1179438892ad0f8f0af933bfe71504ae28df0ac115ea0909e8bd325de168951ade96d4a6766f500571673e85e66133e900a75e93b07d9de428ee3457cf6c6a34d8a094aa25813fba17a6acff0c091fdc65e593c1642087ca445081a7c29c333d819a677085d852623491ca2e8e221a2e9576c388bb00dbdfb705556da20acdd2d7ca264f70a846b869aa62d8d4abef995354a26542d9c8029cb877a5a97b494dd3d4ec925c8bc7d3c690eab318e59be55c1f4cf8e10e5a011a23328b64e02fb5b6df44d4fec32f2b522b6eb4a11ab8e190627574aace5a67265690d4329b0133c210f089d57c61dd6e482c9c45e07f76bde22c3910b2d20c1a81961320026a8ca2b569c87d3f161585275161d2881a95d4d35ded4c1a1480b89f4b42ed72373a618b04f41326bc906fe8026cc1701b9c743650adf0d08b4b0ce8d9c897f20fa94ac7c0caa7b09617dabd2e06bfc5b8ffd533f121b4d099b93b0c2d2aef87d96c2186698146d6cc3015f834bb1eacc0de3c47255230587416ef69611debbdcb8ce922ce79fc45eabce6b3839e03cd2c5a9ae7a17c476cfbb1f708072ad287b2cc79730dcdef65c1a82f16f962187171b25ac40911052a6d3473a9386f7536a3956e021a495b16d0ad870adf01279fbc4dab78e0b55fc889a5b7c2306a6af9360df9d5d1c78eaac2257177d02a0cb6035530b849dc1e8aa742be2b5081714398e78e94b6f1a3723c63b1dee9f563f6df224ec30563f5d3e381bf16ea6523b5b4005938419e298ea2257f68099b7140eddfecc0d1a150cfa9d48916293a8a0b2cc156d23847b83fd5b471350287754dd26189c7155a4ef0bb3530faae90d2a4e96657195bc4de0265148e5ed31fc894ac549aee29f51f0b66c004a7e18fc368a0521c2d5e6fcedd7d4d7b32991552be63f5466590f9bcce71fadb2848104193a0e216c416d63d181bfdfba85b48dce9f5ff54459e1e9df1cf6ae9b4ccfed06fbc55072df168b8c637cc6f2ecd154a14776538523c281fe4820940c816ca4093ce0b3aec0829ad5821629e709e97260d74375931a013981ade0dbdc0ae6f7e35bd5eb6a7f7e9eed1ef7a7b807f0c62b4e87f1c11503520e812e54a3000fc4d8a0824ebe0885076e1fad1b03056515dee9031d384787b7b2b7f73a6ba7313888590a33e83fca4ce481be0092e7bf2d666983e6a67483fc3046535d1dae456712887416abf62709d68ed7035faa4c19b011564b54e5b6eabe9125693860b96fdb993d5d51b18f9912de755869f2b83c60d674f6bcab28fe5e16557d721447c1e638686620d78f8b0cb0b500666248c52ee0949b0ec8a261202afc47745aed1f7c9da46452ee3df135aef7cd09c7bf7f9aecb42f691fd3c0d6fc4ba565af34bc3212067871656688c7e247cd38514cac69c1cad623ca62b4d9791eeb211d004bb76ce1ea66172c0459fc8ffa0c66d051c206e0e6bd64d9b18de3db1979ffcbaa4cef5c9bf7e0f4fc9a248dd87b15624a33b0def7cdde4814d0f877c196115679be13f83293e0411753bde2787ba75cbb013ed07fc9ec92c09bd318c449130f27613584d588e2b251242c47f83efcf584a28056987807c80bb7d642364124d2d5aefb83d35663a4904020e5334d653fee9f6577ba7f0aa36d59db8937e6f18c68d7e1e706072ea8d7922dde99e2a39433ad5012126a43950bda260133f33cb69dd09066d6342b5d4d868c2ef4c9bf33ddc86f1d480e5c4686cbc6f9fe0993cd152b8d5229f4be1818c0e9c139d8272d2b63437e6d59152ea978ebfd995e1926c4926abf88cd7c7478c89a05700cffbe6d38fc1ba5fa503fdc7dea7c399ca450e953a650f84d6a6d9cf0c49d6f8c8b1981b2cacf8eda2a54581a8f31a31b840b586ba3d1e2701f64f9c59061434261c8f85dc539eb0014244bb9befea6f1ce4b1c953d06b6cee6bbb596f456da287c422ead451b0945e441fef02e805fd99f3d06ceb9d867711a11f541fbb0e6f8657e8c86b9bdfd646ed2f9491dd42d99ea5e6d357ecf291146d7af9e6cf04f5687ff580f90d0601583197595736661b9ba84fefc3ad4c8a3d9a81e0691ffad4056ba31ef5b8813e27065bc9d03899339ce234638a6dc5913e9e1fd393e233358cf5645088608077fa2dd69bd07430c3bfd0e2075ef301f6d80bb7b157e6270f7a6eb7835c564f0fdcb7d4819440346605e2df9a70eecbf524e92f1f865ac9b269b680c5889b5316306a1331109e7f88ff25c70ad018fff4acab30f314e0f0f73d75bcbf0f1f2b888ace60144f07cd8510710fdea8f1b49bc678879215002c2a7d1afd7002eb22f36d299390c6cc869bdb311fc80fcbb46b25bc00b01c013ec10cac748c19a90ff5ec4a950285c69263a6e754e016743bf2cf4d03a4a3410e44b7bbd84ece873939e77b64545d91f66c8304f926083a1fc5b1da731ed251a7f6326a099ad2f10a134063660cf84d70cc8bee621f39ad0041a3e45cf6415f51163a93073fe65e3819672f3fe0a8c12d332ff6e5eaa18944c30c72d58d0c0ed0d20cb04e9946ea9ac5108aa580e4d0066d8b0ef7d5f2b4fe45f969206c4e07a6b5dd099a3575450aeb0f412dabc5f6ca20259a360416ddd25221bb8c2d880dc7282c1eb3ba855106b37e9da6c76ca9e491648a997eec2db63ef6891517c71037c4b55fad7ef1aa0b18a250e90a16c22f83d666477505e0fd9b2b327756baa16ce96424534411212ef52d3781e7a30fc427bc4232fd1587d79fd50dbe707885641a5fffd16c93aa363c1aeb90a86aae83a30e77a7552890f9d0a39038b538b880fe7990156f6230852ab62a26996f5e538d8dc0f046b55220ebb27e96c37e5ac6d65cab78cd9ec5a7465f61c7bea6e72e83a2640eaa7ca2782cda19ea09c8e42382b7b208a7ffa23aadd447439fa584e0cf16f6a49303a8ab441dfb54e796bf6cc619d1d2289a3db1ec0c5dec4289a8c2320aa5ed810c10d571a41234e710f7da31a84764c94d62c1fa857b1df201726f81097650b7f6c57490d2828cb84b417b495919407ecf6381cdff2d63112227164a607c478702733db18ad47ef05a1dc1d40e960ba4e9a3d9ed09faae05e7f16c890b7a3502d9dca4cc57a396b6f9350d643caa627c8d05537505f20730ba89ff676b321583f5e7a6cc48187987858c0c7b147a91e2dcedddc9498d31067fba44d9c3da27ed51f6f1b4efe6f1066e8037c76498fc1832219cb2bb733451e07d69be1cfc0668d333c6d50e763f4bfe2ee2e8edf695442353ad310c9ace216a23b3cfeabed40811f64f14f6ccc0dfb2cae567d1a9d9e549848589be4a6545699f5d4b67e28db3eeaf961e05188b8e686b9cfc9585e7dffdb5cb87b53b5d5a9a24ad849add2627a11c797bd291878111927ee7901baf3231812387955472f1281eb7ddc37b4370598d6923bf0501c96dcce4b67bb01a1c651d52037be4e5eee6cd0921077ce58d358a5b3012cf2c909b6cd9db2bef4da48b5e8c7c2796f8d4c86fbee6377c7f65750d24b5dd1e0bc39d39e5c5f0baeacbd8d055c7db671df5f784ce9962fb3c3602d9584c12efb4083d5dd13d81e2c4c7f9a368c9a1cc03508c5de5cc1852597059d8b2a9d3ac36e72f2db8f9e69f12c24192c7b4c1b46ac6167af99f5df614f5c3d145596607ebfbedf7a77325f02c2bb4deb5b491024d88638a21c1b8cda528ee2131e60bb43312fb340f92178d97f05237a152b6fb28cab7c76595af51f598881f14c05fea7d63e8993be830a248d4354c895b133d466bf83bf1134cfa0f3ad6edf9bb9997fd98b76c3894c672f909d03b077cdb9f8f456260ba312516d5a03dc47794178c12682b59700522fcad2c3fb9db14a121488188e3d290523d84c4d4d019c358924d88a7a2ead134f654d3519b46549f3e2514cf79a2e290a5e26a047c86d278d620c06d47552dab0a30509a9cc8962d840372a7ac4fc94a59282eaf4ec8d68b8a927e5922010938d3a71c0bfe893f1f2d8de3b0a445fd88a6806dab1f9669e93cc55abe0644b6524b51bc9e39ee58a30166af4d5ab4af2819e26607343c550b1dc429f0ddc9dfb5a888e31acd2da9ca6399fad48fa96b11740e0c35d5fd24b12b74db80324b8c90fcfc344e5c0be325d6c723a5c651f16b93c9464bc73580445b399726284b0d3da369900550cbe480d6b8029b4df6da3b8dd4ea4276549d5da301e7966c78796ee94bd9bdc8bd7a3329480a3de35288e4c447294f4a540e4e6c3a1086dbcd6180fbca22782fad1e72bc5e505e8efb14b1834f2ae41a9bae1fc7a2473f3c33c1c1fd203a0f8e7e8a0fce889bed43e8409069960b07493141a6a50619555f37e7441536913ef346c8ec1f368840a726a5e9bfa47ea45f4e68859385cecae8dbd8666aa5fb9017ae971fd6ab46518b951a746a8c562ab95b3dff5682e5746df3c5625b00043a57aa9e418d1f5b291dd8b2953955646c44ffc4ce4fc42d1d125ea0acaa7487ff9804369aead8af80a75a550c3ad206e6e0da7496514e7db8eb1b96e2571f16c91d4d9e075389074b20f08069cba3278a0df2ff4322f1f65235a5d5674ae37a751082a79be9a50457e30d6710cf67f2d705ed035565e221142fc0d1d36a1e63aea08db61582157c3dc1df2161525f9d5525040c7fd813093597fe1b672b5d29e0482f8e5963f9e4cf6ad0dde2f2068d4340f07c2ba13380b7e90a18c3471f31d8d20cf45b34ee625fb094a52ca2f851a082ee6d0f11a620a665cf719a77baa8fa13da9eccac70c3f97bcc5838bd14208b84eb5a0a0c94432a4f23a320132ae786710033dfc449f7ebe0df3a3986bef8c40d806a11a996ce7374985b752304d294bba59efd8295c88fa74d381d6ec031bbc941442c05607ac596aca74000ed11784b075ad2526c40c019cbd817554e1193df78156e95f4755beb1018ad25024d81efd4b08a7172ccb1cd1cdc03e295024ce8ae0e42fab7d31a43c4f30f146c41cf1e6b9e708355c69a70a8f9de28c0741a8b1e26ef749d212501769959b1298b757ba6b5016d945357cc08170afebc1ffcc8888dd377c0e605174f438cbaacc7c3e3196887c4b4a122f0183c2a04255240712c8e1924a229cb8b488c0525e97723680cea4eed7f69974e0d7f7c333f74b80873d5f0cac16e2f99b4c8e9d092b1270bf3e278390cd033b4d61a825bc680dc76c816a3d8fe63207cc21228eb48ae400efc532207b233f9138622bd59dbb703c39fe435eafacc01fdd1548a8b7068bc003f2464e696e6bdde0aeb169a1233d3bd8d0908ab2e2c650acc06c1f4ea92933cf3b4cc1d94374e90f6b842552241c31b731f29a2dda964f7d3bb2ac077c003dda538925b8e1b94c5ea85c3a6e3924aaecc1a3a54403aa341b5300469e31196d25cfa4f0ad48ac4f355a3a0a8857cfc59020e1d963876b95fa5ca37a10c893e208d4157743d20781982041ffc35d978dcb060bf9210cb9757422f0d2f0a2882b145b4e2014f8407d5ecca8c55749abe7afb814a89192972ca35b5403b576a6ff19e4131dd4cec99f0ea18956460fdacc98c89c7894acdc46956c1fe94c605575f8f2b4a0a9cc064aaecea61cc39e0ca0fe029329e0690e53e3afde9f4844c4d91e92460f0bdc141b2b8a0f61abb482de38720d8ee772697cb6b3f78d90b36fa737f622ea702d96dbb39e7043b42a8a74bba3d47c36db5da76713ff2ee06704dbf4c50f188d8e65acf519e9c2c80804299af74e260c3da5db2eedebe60785e740abe5efca55f7de86276b63f453b436191a0339040b9eb29265b03ae8c61132bc0e7fdb7fae4ae53182defc73060102a71490e56bb7d44fa6a985ab0a6a44b3ceb664dcc24b103b4dc345432e856d959f99f738e1a0eb070cd20a990580a81563d3a350420d18b81c75ac3d6ab95e8024fe87cc5c4407358596bf4b4024221533c8d4177b9f3def0cbe0e7403eeb043195965693a0f438cb66bf959728e6bc264afd388d5d0d2aa0c56d5f36ea74116abd3804514da38f0c00d122d88981da73871ef5ede8020a25ba3036ba2bfd1ce2a5915d9a43dc0d3ad8b32385ddbbb99008b3cd3ab085a7663a3687c6032b07fb504ee73c932bb1a36d0eb3780a0a36d418b2bbb6ab5a86a9c6558894686f2113713ed3c230ee4997812d4f170f6c4acc3b1499dddeb4e5d8142860199e4b3e32cefbce4f7becaf7cade82c7b86cd6eafef8f009d51d430fd2a539d0173017b3e73fa05c65c1a4eb5591dc5b2d70739daa8e340e689bfdb768003b279d7f650a01f7bf12d835335d0847f2111478727711e9775535c96f3d53f160b6fcc761eca0da2a808b6d7eacf8f2a0c1e03b1595c69ff765168a1de134bb1aae5bad7c9af727fa38dc2fc83961e07d606ba7729fe55c051315684ff66ddf95db56775a71644db6425510411aeef184937db547653ad10fd264ca716c267405ad18a06f22f95200458a2c16fd5617d355ae99ce515f1897c20ed95395d02b5036ad422b65967d2520126dbcdf0b95850962dfa85378a06b1985672b745b8b529b6203835a044dbbf99ea0f5dd3bebed37836623503c05326ee5ca6f56819bd0ce6f7d72131d9313f31ef2cdf16be57c67c98f6d3839ed9a970a65e11a5fe278a720d296a2d540824ad57d1d4c00789c46517d5fd56b028c7f9cf814820417f2933f46b910f4b19fa1ff6593495c8cd94e1a6bdc430595550f14e1b320301a97d527d1f75417e461771143fd821abbc3f25bfc72eea9d39141337fa49284b231069b8616cc4fff6039f71d675cffc6d32132c045c9ef292c20c06e0091bb97b06bbefea0f390a8c78745755d49d0aea41b6a4b7dc0a17dbd35cded62cfaf1bbc012487ad99747210e224b084c534ba728bef5f5608a2de72a56257e300c62c8b0f33ae0af1e3271597681824beb79756b404eafe4cefbfae96e7b210a5b7c0680f051de9eb757a3c5c55e82dfa6e1dedb32c8cc87ade5569e78f86782b8d385312e66353099f81ece0357376dd996881c222067b3d701340b5031edb189eb97e6674d309a825784d6acc4fb9d97993b88a68005a2b53671ffeef4cc0da3415002d14cf6e2f8edfb4c34044d822888762fe2ff8bebd911403b01044e3b6bf1ffe2caec04a14d000dd1ee55fcbf1835bb02682f80c06977159f1fb85e9ba40466592abfb462f8baaf91a36ed34cd9f906b8c0ad70803602720a19399bab085450a8c1b3381d28937e4f453601693fc27713299f9bbfc66494c5e79e98292aa6b257f882569e5db90441a7a506d5cfd082df89ff22a3ff9bbf866a1aab50cbf11d0687c93a36916383362427bdc3d0208646fbf41d3e143e82af8f26f2fd9c0ecc45da37707e3123828c0e39c602b01eddf52b35cc4df230d38724466aae8c6bb2272bd88b742d2920ace0bce298bded593eb2d28184ceb1f79cb319b22b6dcaa8ba0fda84ea0f263aae20f7dd9f338419a797ef952783738e9196c9c030159812a4d54cbcb33edff0d65a820dc3471c625b21e4ae8dac8782b8f8cebc3b7ab1fea4d5c54159d6feeb7b45772895542b7d6f92a596d05021768509f6054d1c6e0a981e2ad9baf7c2778f68efbf02ad84c857dade12a5f313d0c028ee3d457d14bb1a87724b6ed18ae4772f2506f206d90763ec180dce16d482e19b3f532f944d9ceb9a107aa480002e6167f2906ec11416e4c8c2fa954daa17ba6000947e86fc38cad0956460f190bb68888abe70efa475148ca57d39e70505dd002f2a9faf539cf681798f4cbd2cbba94b61690b83696c41b3de9d19d543be95f32c934a489297248afd63ee4d2bbaa04aa911ad49cf0bc4034d03303ee8dc96fced2234b0d8a6b5cbdba1e86bd46bfbc50624d193782ea2ce570bd24f03de849d167a67f64b4fd9a5a5af837613a1e03afdfc6f039dca83111bc30d94f370d2decd87b8a58a657296228a3cc0c0489122e9fc2cf3cdb72d6c336c74aa7907467d3e7cacb9555c29ff55d664a9b4f34eef84df9f5828130d97cf626f7967793101790fdd404cd64aa6e84f9f10cb1eb40d859610af058cfbdc43450b2c1c430f972c254b346033fef5145014fa0e4d23c2ad421b52f62dfc84b680de63954a9c0b5188495c0e8b76e2686f0edb4a48a4b486ad50eddfd6452d2e62ab3834909e455662857434137110d91e77dc754df182d71fde53d0dc5bed95f7e9e8d5f9fdca10fcdde7a46e8dc6da7bb44a730bd0667554c0cad2be5b43e1dd21435628e01a6e58b740e01d2c554dd0933f2c837cc8e994d59ac03552c8accf5463536f842620a15e0c395f4b6375e1cc0cdca252d32a95cbfd861089763fb0b409b925b4dce5acc6114ec35e7c9a3eaebf4404ca3d22d841eac10493626c0251d73889e969ca7e5e663bd56e30bcf57617875a0fa38f8a156f06ac0ca1321e0625cad2bea381af0f21a177c855206ea9dca1d50d41f90e56a6dfdac3f2d4f401442e7e05b308b406f36f1509d43e40d95a22973cecdc0372d331780d370d383a67de90254167d25d64ee84bcfb59ffc1718bcd51544a1979135c413ea436046da5262b5200c2f6c34e72667cfc10756c47e0fcb0a665d1ab544a83a4135f28557d338cbeccef63ab4f329d880ce4abea2cd3eadb97458fec96b2bd649b2450de342672010e9c49de52288b0795e818e449ee83324fbe5ff7a8f770dc1ff996fab3886833c70856040886e24e3564166c8869b33111082629ae96cdbd891d8d15dc02739835887033089e06cbf985b899d3087ccbbc21b7235b6b9d47f4af5cd4c9081b410875937c6bba8056791dd33f861c5855d8c31c6d1228f286626fe2b0c72a53b072339288489d40ca72b1da0460488f113fa72710a469940725e29824845898b66e1be2b551fa1b9e968bb8eb1ca7f59bc2461fe44544757abc974da5fa1575ad103d64931d2cd1b0c6115773b4eddb187da5a0e37743e1f9d7df759aa09bcd814340283e6fd4b3b5857644ac066b5d36ee6046bf781dc98d6935a276ba11ac17afd98b83c85e15ae8e3dd436b90fe802add69912b184ff99d7bcbb8398b8ef347287aa2d067c0c4070d45602a8b523da7461b30614858e1c9b519e8320fc0799f59da1fe01e5af93023ee704811f787c3d01a79bc3e97d604fc3180c26dd9321f05e06722bd1d9a5c73af6d4773e5901594160a99cc47f8c0810be6d002d3172488828700430d38cd63d90bdca7ff809af5453b40b712ba27d17a9865aa231a55891fca79763f64831643b82ff7d0e4b29d0882fcee125dc508ea272d553da2a49a1ec11976609c36338e6571e8489109b01135c37bade9be80ee798c101c2241d82a8618215c069d4e96bb2823135821e1010f83a99fe6b5c9164780c958ca8a212e81868cae164e3b73bb9a6d4f13d0805fe5b66147b6cd68238fc7e0aadf4fbf7d9116cf16e071f6e4bacc8b9399f32506c17f6e204448ea862389a832aee4825a0e0dac51f2c52d0dfedd64b03dfec829c3e266470edc71b30c701373491558bb80f812138b5a52857541d599b4816f5833af62031f6ed147fc06f150a2103d03348487e5bbd384e546098fc7d023c301e3982f21c6fee034772a028a60be9d2bcf482026fe23c2f83a47f3ab2b7978c7d5b803c3378db611d8d11a4a6a8b1a94d64380ead065e4de22c6e48858ceaaba1e3fff0abf254b260eeb0a0622f5c56c8042bedff0075416f0f42d80516b1ab794b2bb238422bc1d926e77faa3ba4f339228f1e2b0744bd899b9c6267b40cb7635074a899b0b317fa1169c857653af8f137f162beabbad179173691b7ff77548cdd357576fa9d08efc9a41353316292becc80679542a53667e71db0cdbfb3f85f0a196df1f57c7371836e787b407f153c06300f989d8224ff263bd0af2aaee1eb79f3b19cf4621197f453a7511f4ee4567b05646d1354ed5ac3d6206053a1c902b84ecfb63cd3c6198a1fb273eb204b2924794e114bfec92827736d6e5f5ddc723ed61b01c3360f4af8947532a9ed50777a056d8628f3021df788e4755dad92dc4e8fbb65f34df68afc66d352099cb3f68fab1a6bf12a5c454d0fd7b9441e591f58e504007092d61567360616dd9c46f71f5a3f4d64940582cecbc33a1aeefd379b5cb18ba8b88f096b8d14a21ed5aac975796a36010a5f1ff24cc40c2bb9f18c68b50dcb76d250bc60e34cf1ebc912caafd58f45ecf05a94172db95f7a96d48c1b5ecc5a6ae54d23624022866e0af806a9bf19e04e3ffc1e8688ee1bfbab6a753dcd445772ce950962f611e66578edeac95477595983418e963b520f249cf6ec511f21015bfc80918c87ddf916832756811d7eb2ea57554c00fc243362e57086493a015a5ee5566801f3aac301f369fbbd711d58423b003c45105ddaef9013871ff518525b723753ad149ab907fa87cf42db15b1020db51f9246a9ad650a5d326c43e03ffcf1209fbe9657d0c4ea453a1f6855d1beb3800edc9b291a251a157b20aac0ce44b0aba2872d838e17f0d3461081e015a920bcf2a351cd0bdc25844e3e233267e988ebe84ab83f53b249c12d9305b11ed6792a0abf8b9e36d87f6e131ab48f9f60da72802ea935a681d514fd21ec0527613862f4ed9db647c7cae9fab20ce00cdc71fffab300bd71727b8c48ee29e6b234801d5731a4990500bb0927bc07c202207f103051f51082166cca1623100a3e1802fb0dba2114ab466339fb24a6a1ab1ea80d053325cc275dedf0a6368bee5466c030680ac594174edc5df0991e6e5889ff1662ef86cbb2ab32d3d67e07f84a43aabe3247882e69391a0d3644621d884ca131e4b173fdf441bafc93fe5e9cc89b46512492c0a1ee4aacae30bd9e3b22cb11fc0de56a6a88b2c8cbddda97eec250bbe06eeeb96750f0e832c680155c91900aed41cf941adbb43463ebac0daf8e6da605e29a6374d97073aa1af34e614e8f61b5ea0bf53753dcd590de09fa98a746db77a84ac041c25ed0515113e4795600e8a76927f50aa5a503527ff8d5af145a1795a2a16f964fc47c49ead3364feb4bcf810301c83069f4fca6ca04a12eaa28c4b88f610923029c2c3081bcfa5d7c998a85e6a000a5a3046303a67d83a0ae83903cb1712102295ed0ae00324cde63be062ed18818a130becc19873937d7aeabbdb01df0dfc710352c1aa64748487e14a68c95086c22f37ef35244a3b257ccd2af951e6b7bee56a44f2ba10c44f218b610834f0d9e55a35ec07210bc295a49dee6b36501299e6401339b6f53089f78f453d91a4e0f0acb5a247dc4a3e5513f92d53e911dc53762980c0b868aabe9ea93e992e2990df5dc1ebe3e1230ca19447e5a77a2b707b328ea204520601d46cd6a8194c4f99374a795b9f02c5eb0ec8d8423868aa078c6d34cd2c5585937311e4ccc9278a59e874dee7b52d1e3ee5decd5d195b5a02f245812b930abc204c4de37467c975efd0d18369f92993f62a5659f3a724bd96ed052da9ea0997834f8ad89bd3cfe1406e80b70142406dcea6644b2dcc567c889799ba9b98280d5507192daf10f4351b57c80f3c785dce9019d2a7ee13b5da60fad62928d78cdc863906670c61e81869a7828df267f8f48a611e1cd8548d6421cb4dc8c39e0fcfd6a6f368aa42b31bf43228407dd6d81b14a5a58122eead3108abb04800828b0681e13f70af8cd0b6664b5bc92c78465cbaccbb33d6b4a20a22a089141d0437d42c7e9b2b8dbc8a149b3e328ff5b90a921a4455f8ae74db912324665d0f52e1ac0338d1823461917cbd4f0300b7fda9ca2ca013b0cc393a4157c811eb3e710041f845cbd3cec32a1ea5dc556b6b7ac18c46832999553b7c3c155681136482bb3729e7a4059a71c2d89edc953b61e951db9e40ca4c7976ebebbc9c3bd09e69b7544ceed8c90efb236d0ccb843d65593ab5c60626f13eeb28eed4d16a7cd34c6f453a333e71e1e921160ca28ece5bb4a09018ce7634e332e06fa11847815cc0d5aff0e23a569bda6c1a41dd0a77f025a8db4f9c4b3dd5a003f6bac6a02814abd5bae3a3a24e2a08ceaac5105e86f805790d6a15842adbb212c20aa1902245f04d09fa69a693a07a470151c4309e1dd1e394c2da7416c9f119b148e9b0a25c58942d47f30aa6eb6dd3e2b9a0a256a741b265f49a93d9d8188a0af0098f1c3939f6faccdbe21a2d2103888eb268c485a0c53807d7b01b54664e8c0eec2e362e1fdd454bf07ca54df291a86f6c7826482e89ea9df453c847c9d68ec883abb968d0bdd573e62e2774a3d1c312e7bd81be69df08512a40353ab0dc2be20849deefc9bffc43b516303d1e3eb07e53b76c866937b1635cef8eeec7c2190c428717d10411520254c4492c9b95b7fc014de50124cefb18a0454ab28ee22591bf0404a0ccf6f7994f4b4eaf94521d1f36bff338286bf437630afb46b46506add6cedd8f22cfa9a1196aa71a21c2296ffe802c28020a14886571442e07c8d401e95ec073e9432ccf702cf95cfe160bd298d45b21489b0bfca3e7233c5098a78aa811dfb4c8b5d90cf4ff019d39c110af7f13d6ae6a3bfa07d84aa5b3598b8ff8caa1e0753c72f96b0aa0939315a07af83cce2e93fb2d520137242081a2183d416a496117cd2176532097fba3249f753fe8990a2e2284789df44e8ff2a46400439713d3bfe6ce6bbb6005cdd31c8d9072622c7075d2bc28d5fb74e0862a2d151372e2fe0e7d48ce16a627d612b533c96c650f71c0e8d8299f958578d00024ca61bfa9fb250f4c5b4b5bfc4e9076ec93d2963b6c5a5014c538153d2635e260c7f1eade6ffdc1f2cd7df0f07c6b701e51443f293896e30ccb0ac7a85347c7d260c4b87ef743229b18f58f63a3bae1c7c65a2d079d2bbc3e454a3ec586e4604333d38830aad333d11926704c4adf319a3666d9a90809a0f92a09e7ebcbf84700f18b502282ca4f6871de178135c08fea196c86df82a17f34e0fe47e68afc4c4776176ece7f21bdaaf3545433663a8753968bd3fba64b8be94637fcd2ae4f290ebdc2d17d109d604b2bdab01834835508011dc7b2bd106bb33791e68d8cfc48f676fac3cdf83cee42f8bdfe7d784e32017c568ef0428204644836e9565d39d165979b80df14ea60d8284287470bb5bbb5e1af786aa72de35b6ccb15ba55a7e797ccff4c9ba815131cd369afac3e21649b7e5e6a72bbcea5b4e0220beb2b74851e96b2c608c2d1fbd73c24784e9a50c32606b1409c2c390100b4952bf4d3d1122b1926fcd575bb40d19e3018b0ff9f2862876a63f66f2ffc1b21cf21ebd81c3ba522d4e2e60557d14d43b72d56e693c34e0475930682d3a25483c18d498660d3a318639d900f7f2b3fe0b1c689d311cbc1129926140eff96caef320f9603a4792cd889e937d53d98287d3b792e02120f0a521a39bb10f363dbeecc10245762d09e6b291414c41ca2a28267c926eb4170fbcc6501b997f73da46ed1488066a9d8699214171c218f5f321e56617d5d6c3fad95e1adf38f4642a4e2dd26917c151da70f2b973c9c0a565a6647e4b256cba1f0926c642d58deaab6de04585c8f0afff6d68648b7007423708d4659f92c4158ef7929bfb5a94e6fd071190724078a36f0c93626fbad3440350016c2103ca0eee6b5c3010c29a0e934f845ff247fb34c2419d0493e5d35fa977a7a8950cca8c10f6b79d116e0793d52e66de0dc09c733c86a043414e71a8e40b080b0895f898e56213c1e5c64146f44b1150b1ec951b69947b9da0b677b72da59452a62403d5067a06b50638726ec020ce971470beb76b5ceef3d98e4ed3fa7187602479cae66c292b4d458431bfa53ac67c175ab0fcf83ba4cbf57f6521be73bedce987523121d344d5db7630bc4fef75e56dfba694d68ae58e9493e37e729da5e300cfc8c58b9f8505cb0f3bb9d90fe9b6b97254a9b65aadb59dedcccd39bbae7bda8151ee7496828bf10720dd0be71e63043ff08df0d576942b071d06b599c7dcc85f2c1616a52c65b5ae579e1163d7ff8b461d722787dcf186b16ea8b59407b7adfd2203f0039aa428c3bb254bf9ddccd2f64ccb6ae5e020316bcbb10b9a590ef1cf86d87ae0d0844103264ba76fb1b08eeb059a1a36344419e7d8054d904db2e2e7c437beff15efeef636c14bca472552f414658422ce97325e206ab596524aabad60cb5d33c6486304c12887b494f2257dd75339bb695cf4a3486b52ca61d7b12c25a512c259b95b0b00d1690aae292c3e8782739107472f4fa0e4f935e0ce713e71579054441439f06134a5869f212d3738e2ca10443c31620a9a96a926a808ca324490140b40e2440a0e2f1c9529c20a97a8323228cd70c5892f2070a24688061ba08040ede067c8500c48645800a28b0e5125003132824c11245090aa3061a68b17213b7421e2030042a2f890e485a11b949ce102454406420c251982411415482246c90716cc1069a902e6d005074a31177cd02c2005959911172a3b80228420c28091428391168e4095e002133ad001c8290922a68456b288a1819318b8808314ccf002237e3c99628a93276ea0545b4345862485841338e0c109293f14914216a50a0a5148b144091f41bc30614053ad0734412839a2064d408046868525988832850b6678541173831cccacd0438c4a6c028306c8133d44a1a1a2542607471481312265c604076c60c5488822964839429788371063830f1a4089590ac24a1164c64829cdbc40997262614a124a4a51b5182811cbcc9045b6e5062132513ca10049d40c420c4141c9ac38bd80690726279890e20b0a2cfc00d4030c8680a6501dfcc8209b92c40c518a043d419358410d2fa081082484500208892f3f5e18b2841227718a25961012460759820ca165967852640c1050d480882ad4c9024a1c41449118befca0c60a174ae79c93ba3b9706432a73e9d2fb579ca1f2dbe97c9781bbcfe9ad16c62f7b2865791153e2ec38b2a46c779fff64525a6bad54c6972bbc1ebb5e0c3dd679d7bb741efb4f4ae78b5a1ba3a41694534e39e594524a1dc80e536eca727c56508ebfe20cf6a13249251217759a703fc7e410e77876a69ced63567db4e1f7ed0b288c43820d0af2718e39e27cc1e82e5b23cb775814c1aae250de43c780bcac9df6bbe7451478daa7b2330a4020de64100ab87b5414d97d4bd499ec7ffdf6445a8c02935539768952ca612b2ed12a8ed4d4d4a3c33de03a220c29387cdd8bb1872fd586807bef9dceb35d0ee888504425221243a2344d456963e9b944ee3d7cc7bf63bee35fc30431c60b91060a220c7f87bad9ee803ba4e0302afd2bfdcbeef1fe228d7e58f380edeaf7ffe003162c54fda101b6cc7d131cb6921869d0294eb25359e7ac1d61f4d4a11df175538eef4c39c6974dcee4548b823261d26aefbc577adf6ae316efa6e28abad94d15d779abb98a9db7b289df7dab958d11931c1f7fa157c9f157cc584c162ca4370b2f72577ca9a829a92807f2189412d2172524a6255a13f59226eaa166d2b2f8f4149da2a04c086780202322bdda5dca39699db54aefda2ee59c94d6b6b6ebdb9b6aaa54d25b65efb6a9541cd779d353715de779ab55db34c6acf88537b6882e5c74d183d66cb5a4776bc54dd8e1e8cf8587a333f6607a705738236c0dc616b715f0028e7bbbb5be19e461dd73b106debef3a4f37698fbf9de080bc8db47ef86dda87b24a8beb3ddfe03faaae9415cc07cee73111730bf3f56c7985f5bdb837703bbd8d5c0889b335c98d102076cb96d5331ddc49b7b5dc02cccc23a2cdc29c8ed05370e389c19004c3931c618638cb17f534206196cbab503d2517d9ebe1f76b4e53b730b664dc1d4d6b72f840b97eee60cc7b9b7cb407a225819f15f393696d6dbcd22560d67cbaa49a39ca72c0677538ba3ee96df044b39e79cd3a58bc1361e8e9c8c57dc1b16372bf0cdcdcdcd0d0056fd39b941969116525a48a1534eb97a758dd26d83610bf22a871651ee479dccfdfc74f2bdad2bf3953b779ed0315a48c1dcec6e7cae45147c9feb7b5bca49659e60a8c28d32ca38dbe75cbabc1f6df8044ee81a3a1767aefbf05f295fa76b84d031e46a46a41ceae4b00519ef90f243e81a2b306c4999555bf03c41e7309af1d1c9f53b127205a34dd71e648d99deea916047b87fbb76ad200a17a4148cf3025367fa8c9b9db5609459a79c53fab4a6bb4b01743fc8c32e1885da17987e67e959dab33ea5b487bba82a888bedddf03b69b577db0237aacaa3c04f76f77cc5c7bbe28bee002fda58ebaad6d58af33ceff1dbd5aad6c7365cfdc9f5e38c58f54bcf86bb977a3754b5d6c761ac65cebd734eb57db2df7584a9ac73dc856bf1c365d9897cc8bf9806531c593f1cf9f4ab7c9ae7bba436a4e7481087d7f85c65a5c1b34a39c1c6921b29874dc30117756eb8609bbfc901eec9713f276ee558d517fe6495775dd775cf71bffafa9ed7adf8e879d95b617fb32a561379cf6dde0def7ae065f195c577dd01fffd64ca659b8d456541e9dcb60ee795f738afb66ddb545bac71e5578df7acc85901ea7c6d616c035657bdb9d6bf5d55a9eecd9b94f257fda954d6765bcbddeffbaa4d42b1822c6ac93129f625c7b0e498f403288711b0c111b33b53a4d14c1498d3cb1161482370d86a8138627ee1c8383d160af1d0e8a960f31c8867db38c775efd3eabad5cad65a7ffe5665d7bde76dce7174f5befa6eb502e90685fefd389bfb36dcf33ccffbea7d7d0facbffa2fecba2f6c1eddc77d3e5d56d1f7a24cfb2372575722f6b7f7b7df4fdeecb6fd562da573abdb56eb9c4f29b5f66bdd366bef476fdb6edd41ca39c4172c5fb06433d987a531999bdf4f96de0d557417a7923d2a781fc1ebdde8ae88ddd5b03b5ffeadf52dc7711c88d33d0adce3dc65ee71e6c0ee63d20a45f927cf2fbc218ff8a9e44f969f4f97b7b0816cbce182638ed9df9b220cef67e4f872577479f2554e91b8353ed444317300553bdff59a91bffbe5b0df7d2c77e447d980fd7a41152296a00a513650dfbe0af109248a34c560155c259964a2c4601116c586110082f870366c380fce08ed0e5e972e993849a1b2ff7caecbb982b9213814c000f2eb88484a0f2f58011305932f805bc66fcc97f3841c431640651f97813bdce55da3b3fc0e879f7fc1d0a7f539e0df24de61d3472b4f30f4715996e03bc111091f4de0fe50a7e7c29c36650ad797614e96b1a0a0e831a1eb424de4401ee431a1188ffb115cd409cad1ddb1b8ababf48cb654d45f9cc7659523a27c9fe03027c79e7d8f9cc90f8ee44cf648da2c3fe17eae141c438421dfc512389c46b38af384348669e43c3c3118491a13ef9946be0325cbea6edd5ab7d6dd767bd3080963a71cce2a597efd26943973972c0287cdc4284bff221be65a1e202286d880260895f88492325e8c88d1c1890e49cc5449e4b0aa4a92504a02885a93e08d888584d10a4159a6aad0020be2063062cc5009831483b5d2b480844408239c30020b5f6a7290a54ca246892c69617c9c8101cb942698a47d906317355e3252e5410696d152cece9dbf74b1040e710e5e6a35c862493fe2ed52699ed2d4c6c457bb94554a3915abc2bbbb5a334e524a7b99ec174ae9ddb054b1d6da4dc5a44b1530447965154a6215b2cc8a5245cdac8b9a223544128929a7a62e534a5da668d77699a2e5d865aa690153b3d035258be00e3a7615b1a9a8fe8ead26680acad4922e533050f343066535311759868d89524a7dced9ed419654c946e56cbdeb3583e689e04196208572178df21d7f67927d491e9a21f4aaae4ca7b2ff923b135b043571500eab51762a454535929f8bec2250bb811c464b4650bc4732293a02774553a857816dc6c30ceaeeeeee496b1e8edc190d918bec5d6b77cfbc95c46dd2422adaa84495a82e913227296b6d4555b07660edb031515aeb3c6381b27f90970d92fd6dcc1d20e55254488fc51492e62e8f051adcdbb66d47956ed71e49e954581ca68876dbb62d0709dabc5d9b83d49de136997753dd4db526da481d8131f59f52158a522abb0a45e9083757a8700539e8c2545fd7d42962cfabc96f7635c18e30e8db6ab30aa48f46d2ec0c0769f1945f6b9cb2a9e6af7121e5947236298de2a20ed72d72c47749c6a49452ca0e237dc9795c48190d5c744e873bc0d4920a22cf75170f175df4331069a490a36bccfbf4457082cf0e1ecee33dfd1e91867dfa1a883d2d9a3a5318fd97ec99301b217cd7583d7d30d288993e012204228cfe01220811469f93d1a956ef06f72a95e765ef6ef3af9cb3d5e179bbffa277a36b9c403e8feb9a9576ad494629b7b90a7ff26a66f9c5598788946220eed0ff9c63083b8dc938b8ece50a8624c831c2a8ef7d3c4ed8e12382cf84a9162a882efa1a883bd4823d220cfa33031106fd1c1d83be0b243c69129e2fbf3ba69ab5886a218584caf3de8b71abf57a659a8b2d389432974120ca1debaab48b5b521669acf2fc969a8f6f6bcea6c99df9527028739ee0d0caa254d66182ece11e0191460ad8d535eecf4f409cef509106fd6925cfff1f2297b046035a8f5b2da238eab0e80531c600bc34b83f1cc0c718110607869200d937309cd1223720013ee03880ecdfb5a7e14e60825e632fddbefb1254aaef54ddb340d57df7c32ee0cfb495637b1b6e6fbc9d6d789d2177e2ab627c2b820d1313903d0ea3df11c4f93c6fe04beec49751b897ecd954fe297c4d24772a8de36e6e707008408010c408b64cee8020c2a86f42c7a86fb384dc59c9803d87f3f078fbf73dcbdc9e08f62f98c35d27f080bbeaebb811667385155ba104f69f252521b121468e494880328b1c938e40ddccd9e412b48e66462d93b2472bef7057048f5c994153d2500b49601504f24303215ed6408511e24a1018054d903b1ec65a18956296924357941c461a941cc6261a7218a19ee4b0839c64a31cf69193313af85023668b520c60e117a1015119267258a209205810190c51910a2a238608d804c3b844c508161872a0840b4c82619ce2098a0e5ece20218201a61345c994181841e2a10ccc8c0b4d98d63c71449327b026d97f604113b444cb151f602fa6d64021c20a14331801ab629af040a5c9091242c07e8e78c872e64c8c8899302120a20652429608415501731bf4104418294c9078806a01521336d0acac51e303e63f2b8c4902854c0c102f453f32175e308426cc0ebcc800a624a985a71a707c118e28251d89251599ca02c831c90895a416a6fc398fef5ceeefe6f931b2a407a426215780008a40114a4b108972444bd391da91a516b018a1d2cd8c2c1531c6a34114334525880c952ac810310016285e6eb8e2c3123a98318273b6defec436f68b5d277d19a94f1b2a207fceea8df0198539ed3dc00a400c0006987644734c2a22bb6ead0d8014b8cb316908941cb2a0c05e8e49436210a1c864bd40ba0cc833c7242234214945cc241519736549448c86388184eb0c70885266ea4c1035c8d00408424fc4988cd4041d314b12c224370c38260919ca49428424090182e22267639f8b4cb129d622d49d01594269406cd02d01490304cb0d13a3190d035470e844ded330fbce243275b25d4e5abdeb77230c77aa5e6bc3288ad576a7a52725a75e627a9a2f3b9003cb9d18a0b55c189fac12acfa5e411c9e55bf52b1f2f470b4cb49c39b67b4db4af50311a97cbf5b0b5014c4a4b494e482a8ecdfb3956e7bf53040612d65837d27b245195fc1613f657bed7794f3d427617bae3d9c92e28cd05fb6ba6df7d65850da6e45525a72dabe91969cac754b8f64cf94b9cb7690dcb14fedd7af873742838dade0b08b8a7ab8cbba832ab8aba897441afd96c8797c932e9f47f55abb4511536d8f51514ac6a3870a1deb2059131847842de399bbecf6d466dcb5537301118c05abf7fe76bf02bd48eed8f7c02b77ee476f034472477555aa8d16fd18a3da6ecffac989a2cfe48efdf8f5b98f7ecf9ce7a9cd50d93337a063070756c1de40ced32fc1cefefc5eee58fae14eae00c87545ae71e73ef7dda7dffd17394618f7c51739fbf62b4ead39b3582cb602ccbecfb0d06c63525050b6a18f71811b659b0434834dfa31653d3b2d2cf4f62ee63c21f6201bbec8f6adfb10439682c1c6c0ce172dd933dfda67398f74a81d315c743a3fcfdaad6eb552eee57372be80f3bf3734ec5f7fbefcef2757ebbdea189be3b84da5eaee0671bc47a11f67af1f7bd6baad3fb93aa79ab72dae75510235bbbcf0946717254f79ce2ec9875376408e493e6ac89ccdfc38e7872d8ca71f81546047caf3bbe63cedf464c679a06c94d494f348300d06d7605711061bca5d7336d866fca87e7ffd3a3b16eff7aeb9cb81dc857cc981e4d744bf7df70a0e02278efd98fba9879c47d624d84eee9a6dc65df367c766ad286cc6e9bef00cdaf4a02097cfa019ce20b7d3ed743b6b4cd90649756dca72f76f2adb79f657ef369aae5107f9cefca51518be94baf95281f23a185e1a0ebbb6d201961fba37c55c74e448aee44cce5397380d6ca22f22e0e13c40ce7344c1f927f8f498d1af36bc66f382cd9d5d31e099e4c328bb6410763a1da69f43e7348aae98a5083e689036bf8a04499a77a305770e1d48ca9a51a660f87257aff141e4359799a1ace4aefe02030e3b2af73b5284d1ef020a1cba33851d5573266f1ab3a47bc8f5a2024518357c3bcc22ea2c695a387b93057b2fb7f7d5fbe64eabab542ad5b67df7f33995cd478fab36e0f6845eba9ad6bbc16d75e336f07a9b67adc4d8da291d091781d081e69473cab9e4660b8ed987b8edb7ef66877befb53589dfa737b3a8371f8b2f469ca9f79c7b1f95e12efade8dd716ec85afa7372b7a267b5860d7e40efd9b7be5ce6c56933853f8cbdd64c5b757825c010665fad16396d2bf4b70bcffdc5d82371b4498dab4561f622fb4e1ed9abb68d732c5b5d67e8af98b3e7d79c193722fbf856443444bba8842f1bece95fb0f3c2f43dbe7321772010ed7441a43b0142dbf0bc2a164b572a46d12e6738f633e07fee4eedf18d031acfcfa5127228aa9fce5b8258aa6ecdc8cc5a632f79cf5c09f8e65d9532cc829bf63db4629fdd5574f654129eb5a4e4d241af2824e38bcb9d5755dd7bd07baee75cc2d13a93e66390ff79d6a5e0e0cefc5f7f3e5baefaabeb04756fd6ae64e559ffb7eb26aab7fbf4aa1ec926d35815dd682618ecbf258b7b8c7fbf905795814d573deb58a52da423e39e33ce2cae07bef0b6c55c7aed17ddd65cfd651c05d9d1089a50db80fb6ee9bd87cfc1c91c66ce5e99adb277f9bdb5f26ded3f92dda9e748d0d4a8f4dbff7e09ff50bc177660813709ece4608d45abb6daa2d4edf59a243dcfcf975a69c191d67b594b27f7b1cfd1b682ffd7ef2e4e1f26dc8da1e9591a57b134e4e646a649c9ceeb5dfd65aeb4ffb5a1b4629e56f1bdda8a4d7da8f5fad63c4d8643a467c6bdbc95df1a5a4f46bfd7050897598950577ffae5d6fa51b48ff7eb365b5679ef3bb293771d496eeee744e3a657b11175fe08fb46f82b8530e79784bc5456ba3a59b5581f5b78f3ec7c5af4fbff8957a3722e8b5da234719e5d017fe98c0e66aff7e9d67b7e288d946569893e5ed70bb8f8ea447fed35d5ef9dfe54c1d2d6409d730c66c9ce9dbf0f9611558eeb323cfbbe5e4cede8deb5dc11426092b10e2891045998228f4fbc4d1af22edb4b486fab072582da7261b10e9a029ce0859fc59378584840409118a2d7058f6441a8db6d15e2f97ebbfd59a319d9866e6d3369f26548d9beedbe720ed2b4772ce58a570f7b664322fe242455c56e44253ad56e7d491e96a1ed491f1a0cea973c281e331bb8a63f11c7ad6332c8ee506ce27426112a59452cab93d9952dea229a707220dbf455d9fc45e474757aa5ce9a325b1cb6433ba451b142a80625a62ed166d4f36282fbc64cce8302be3008b912166310c41c406514c910313468692a8a95330abd554425796af20fac1dcabe325df271e6e6530e0c500193282b8cc85bc88cb5c165b6849e83323d76ae7ac9f3481b5953ae5dc4cc768f9d4d3898ed1b1bff903e5ae394d60f3fc8e317ac78e30e82a39f4e9a6d3fc68e639d09cc6834fc78d899c115c4dcb7ce5d0a73b3aba52255ee9a3a32c4c204c26104088598a663c9c7e210fd994524a65c7f0c94949e54729a533efc0c51b20333a176070c862b5725ec7f5e225a39160a1855a4807e968213a5aa8855610fae1548790ae21b4146bd1b200e9e68cd93f176468a2a437823cd231e8cb97758ceea7b4fda3ff79ad871c72f9eeba5d7fd4d478fbe8ccae86c38f47dcdb611ff8fd8ff2cc9c0d5e4146c863ce2b5d23e60683e547207b10ec5938f93f230d0e6393538e3666b82b0dd67182f3cc971fabb3089c27bec41e30c16787d762868c0f70c00a3022ad822a28407e1daa7fbdfe9d48b65156811c883bf23724ee5502d7dc47b07fe8d3e508f39269cf2a0fb2cc13267ac87246881bc0e808193521a585090f42aecf599e3520a9d204992652040991a529096c3ee140c50f420409aa21ca0c3745183fb6a648e3cb2e6949ecd0f29eb9490ca7041805833a187d1cf92ddf2637590105a59452f6d4f4998d2fbb3b0643c59751441a296009d53588220d25f2cc0b8ebbb991506ec3dbc6ccd7c8d4649074410e6ab55a0d274c8ec7eabb8f981b451a4e228f5422fe883d924bdca95fc1f0c50b8ebbb9c1c189e59a2f289f228cfa760bcd036209a784d5dbbc0dc8029b5fbd54ed096a094c98080131dcea53013f0b7c9460f3f831c802fc361f612aac1e83d8cbb102a3e05c292b6aa3d95151d7883d836e02d5a3631dd4b21d2740410aea0913c8a1c3041b3009e088204458fd034ce1fa335aef7ae1ae7113211061f53d8820449892ecf981d55f7d3f30f91469d026accaa65c67d1f50ec9066edbb66ddbc6711c87e44353cbc8724947d48073525dd9b988714176ff96ffcbff3ead1dad68982ea1a72efbb7fc255213d12a8a73dc732ff97553cac5d95d5a8860d2f27fdd9f215fdc739ccf8cac023b704ab9a005c357052938c1f0b34b307465f7197d4385ace529674df248d2a4925c92334945da206ff025071369a480f352d7908a34d0441ee924bac2c41ef923be78c171373738383fc7606924a58f0863be8c758cf9384b18ca89a43ce6412e838ae2cc144f4a4b4d35da162e3db4eca88d645de348a481a493c4a20e3a61470fd91369311340108211842f1d336c4c20c78b010de839c0149e73beeb625aec7f60f35d29c2e6fb4cf64cd8fcd835228d0881089b6f2308113665cd52f1001b66b0d935a4044fc003e7eebd36408ea1b5f1e0b6ecc931c601728dfe283f9d5da8844e36553164688a2000a0000315002028100c87030291482018cfb461f914000c8292486a4e1a8963499083280862288620640c318620601020c6d48cd0110080502cd03b82ae76b2e2a8ad572c9e248072da40d5cd8b8f612b38a0503b07cbd19388fba94c0383e7cd765f3426bca98df2eb1a18d5d991fe92b0357ec21344d45c069db1143f87ee15f91aee1142f9e4d799195bef2f4f59f057a4c581cfee7a82fde3a8ed48816c1bba1ab6ba0d4909ff7eb778410771aaf983082b15c5e80bc7a17ebda32d6b81e1d27768066bd7aecea3ddf567452744bc30cac5c4535f5918a9d5c0f8fbfd4639873d888e56aacf9170cfe57e5a18eceb8e5931c709544431584bd1634adaba016abf6ead5c321b479bbd031838944107bf2b862867d7957c69f89a4600a75336d701f44a309a1aabfabb4839ec80ac783c726aea542b385246760164581695539b0e4a19ef74a51adc4202439fa7714730bc547e636d3f191950a0dae9e46e31c8ce2d9d98dd4dd72cd493e603dc16424c00da0c3e8d4e491d2433a24696c528d5907ae84bd189d10395588e074894e98fc50aa81e2d7f0deb2ac1d6e34434043093c9f8f9713ef1866e9912100b4c9771f8389d1b61c775baf8fba0429e8e06dda0010dc25f5c2849179e12c8fe9ae01e1eef15392f719fb157974b51dcb98db816122a1dc16b63e5bf725a178600dfe79c58ac5e05d3d77345b1f71e8b8caef7569196511befaf090e804108e64fe8b81b2ae7796c25056400d52f00a5c387087f79dea21492914d7ea82836e9e60654ef39b11dcc84d6ae836ff4c1c1320d2b626eec4317c050546d623a6cf6b549e574836c70de058a830267817312f142b6c32541111d8f8a7f9d7cbf6564dc439b1ef73866bae7c759167c9c1847b1a3ac280f62256322e2f2f52ece462a21dcf0805078cc8970c524316935761dca3eeb379e8633a87d839bb33d22199c1cac70f42b2f7ed3adb35bd0c1183e566f7f37c4e8e7bfcb5cedd12770c2539b3dbef87f510b03389d41db1731d0aaa573996ee7fd5c7af21cabc7a80bf84604859d4a50f2ec5d9e82a0ea3eea7d125098699029d9cb342b596060a05f65ae85475f15fb01ea0ae6dde07acf642d18725a12dba845832abefb37da9efec441279b7418e113df9e07f6b260974c1088b651cc717c669591abecfc4523aba5065dc3bc487c3df408bc7c7a941ef84ea218a3f2f6682489f50f008b2140d7564ea9cbe84771b469eb6501cdcae563fd72e44b6b48aa1ffcbb4e2c86e37d1548e0b7b3278f3e964c77428856c0a021d71948ff48bac842e34926eaeb5c35c8cd28a50f29e8390dd3ebb57ec6f306e4440212fe2fe78c7902416d3ceb03f6f475056673da13b690c7cace74ac8e62e146ed943cac5dc638a82cf3d483d6416a15185957d2669d95154d065981d15463ca3f253a659e64a91dd99e508b05ffc7058f2b134a30445e5e04f5b79be1c6cf589c8406f2891cfe052416600436c27199252a19878654607fdd8cb340d0805596b18276becc15aaa7c9c7b5a899e7bda3b0ffc4b92db890e6baf194f39aa71e07b18e61fda916389580ddec7ca925c85272130f12369ebfa00cc6925f919d2936a7ad20e8728e3dbf1e84631c35f44197f408e208fceb7a98fcaf7100d9275c70dcc1670b36409e52b0e2060c9b2b58c1f87f2e038fa3215e3b4316b01e9b1d330fcb81183bce1c4b77b4dd43b7d3c05e855b27b9148840cb3c2dc8c6935c26dd0b0206ec2149949f8d410041bea97bf9cd299ea1257ad064821f5480f4546bba08a39ba687337eaaca8eb99732a8ad54c72ef1e9034499bdae880756dcad03f349e34e5bdd40f64e83f68eb303df18770e0e33ddbb8ba118cd3aea92ae865ee18568f090bd5ca7228864a21e4674a4432bcc8364e1cfc47fba5f80caf433cf05de44c522f6871b8a4193e8fbbfd7ad44d564386fe7d1fc0431f75a8a66388b628fffd0b068298b885c0adec1ce47ac56d6a9a8e28569f4bab5bbc13791e3b1d2e370dbefeb5250ad31a71af0df87c38aca1086b0015530a4cb17c1d1c9ccad7fb0b5a0bf9715af738e153ad7603940f267465976594c2e805f7725888c0d0f2e22a70b2ac0f840a97d97524bab5a0239ad57d3b3a234f483bdbd70fdca41cf29f9213a41a8e2eb4aa7e4848a2316d8802814b9725a16d3db877c86474bab83995e916724f0a7e33844afae9a7d10bd02b22d41c50488e3cb6a06ba050072a9cc25c4b96f495d146aa49a6119fa9595bc49c8f45d9ab8364ce936c640cf79d121df56aa3712b77d1b5be467c4a73d9fc05e268bdaf4bcb37251892af90da8ac26da7ae5087a850196035e42a8ef6298ab7c538832880d5af859aabb4562d08cf0f078ba4b57101207ee45b731c1b369a877e747234cd459aa11cce9d95953e7521e176096d19bd23b17959b01d3c85ee4049ff35cb6e270737998d608d39a17af23fab86d9119ce8ca59e9b83896819dd3e30d12e19244fbc6b5c566c36210978dc4f81500695590df865edb6dddb90fa77cd34018c36cec48f57202cba92d7ccd09ca4c6d820809e69d1e9a772b54828cacf096b300949aa6cac43d5ee98201c199bed3fac3c0ac084f3724ff46bbc82e7843f3d5594fc32d781aae8a3a600d9c80526f23ec1555388ed3a5cc5b3d2feef9903153654e65ca62e9bef66db091cac40054d0c286c64c6123c87bd0ee977ff588eea30aee13d2d80b443ced2ee69a43395989510369d646b190151956c252dc16c009d53d9f256be627573529034ba32f7604eb5666af3caea694eb1892cab47bd3909eb39cadcc5f211c23b62e3b0ad11ac1affd212818bf162f248b40040dccf7304ad07295fe4a50eee2d687d73efa2c8c1f363376677810727f47029e12b8279341052f8e9517fd7f0062361a6466a348f2626ad312418860ccbd69270a6260bab7e9e0d4bca8715dd070b09c92be54ca7bc3f434e916ad644d2c67bb30101d829459488b92343006868af00cc94a5a1fb1355c22d391c590b8b4e1cbfa18be77a1880611c0d2ce8359d5de4230f1433ff3a213a5873af2e3e825ac91ca2e6a4b1bc4b29996e822762dbe5907d11381760ec9c6bd669bd53637f64206e94065f1d78075792e15a4376c97c640562e6152177937aa96f538c2b3f1aa1d797dedb35704730716e9fc80050668f8cc9ce48c431b326bc960756f657eada59882235b3449559741b37ed341325eaa68713413d2f663bdcc5747ba0bd51044c546e11a985503267668924b491fbebb9522744c6c694ca748a7b5cfbe5603ac042b7032db07cef4fb9ceb654c255a603dae68fc30ae282b4d827fe23b1379887cb95e15a56188286bf74e7810564d28879782783f33bc23b71c36e0d61946c7b84cfb87877a4cccf099d2146a78fc38a2185d343d8a5d585e5cee08d030332dbc0cc1d777a4ff82718e996a11b5fc498338227716255b4a5daf8838a7e56c9bdd86a074168dcbb8cd809ee78406066432e4a4777fd8c42fd654df896405b5aace81eff92ae1eb171f6e22591e45a68d98204307f8117036856b3329a67cf50202edec77888e790b86955076e688bdbf60fa76024c7dcfd51c88ef87dd7a2381712e4e034e19d68a03a1082363fa6a3351e15b829cd1fc9f2dc7708154c7765fcfd7595bf3c243d442afdfe33028dbda2b8e70ff7101083c83da67a9ca5d24209ab06c13fd31ad9006c110bdccaa32199b17d7be0dfdb7021ae92b5a2e6cc3671769af138118aaf15db63dc0bae37202604a065ac40973aedb89b52e3288016b1c60936f6df440157bc4c8af577a484c093a3bcce566282b9f152a6052b78e9968e4b5570251356c32e560353a0a32c7e412f29acc6b9a66516f015405d6f5fb92f81aa8b6a26369d8f3e7a35edec594d6d27ebfa7acd428b8df0e57731e081af727d22c09e1ad54bda195ffb44402db767c87c4c9367daf89f031525a700591329191a3ff10568c5343913bb82326980306ab020c2401cb8ff632dcf548c954dd095c53f78d361c3f4c378d52e651ce88b1f737021087374c89a4a03cd1f8bb8e01ae645390b68d0750fbe2e2d84711e31c94f99b15bf9704a5d12e14b1c556311bc7b15b936b57c7f92a52f14ca811d1c0063ca25206230be2f062407fc610e44d6251d57b1d286293789b825f86384ea9bd3c90f2ae436ffa0e63fc0f8a935ec07eca56bc8d09a211b80c8bcd6dc2b1b8f822eeefffb30a054170515727f21ebf2551cbc8c7041977571798ba375aab2fbf440d5034b374353b5d043753183ba01f3517d2cfde3fd059ff2628121219c817625266a1c01d052a1e4973a473810505401c7189c92e4011f519a6bc6806c1a11031883ca9bac81e93f8bc8cd1b809b225d5d4233cf96270eda5b709a4dd93ec38c8638189bc227c00c7be1c15e357bebef1fb8cf9e1f3230582c215a996802e905f443b3345b0ed6f18496dd2ac7dde404f82b49058449ac3662bbd0ec82c1a4b696ed03044c9f1fba09617db6944463f9a0ca5659d54f1695ebeee5283520a29f22354183205d71bbdbea5747534ff087daa22be987b071cf00d5d71af35c96e2a33c4b740cf16ccc3528bf871c6b91a46223dc208d6253ab2b495538188423e47eb4c97285a732ae1be01a6f4f2b2f580b5c154937f98bedc84b9fb16eae8347fcc4bb3d0cf75627211481a0007ae4cc1b3f2de76cd6ef457452960474c1ff8f382dacf76e8770291eab435e635b1df86336fb6fa9b154965da4d0250a5a7165f8ad3ebb6a490c3148af748e4c588ff181c64d745a1c953a981923200693c727dfd31d4c1e25b63b8caebed83107a1186fc3ab86d1a5e5be558a68d0da426c9954826b76ead086cf2b027402aba7c7b2baaaa430f5841b1b16465081b13fe1110407b09c1a75bbaace9047f873e5449210efd483e12c429e467a205ccd417f45a91eb98bfad198ca9923bedffe162ed5a3264915ad3f638b12bf9b72636738ae535c763786f4a7de2a90e05d022dc98122a19a2dc50c0f272b84b4f8ebbd0c65f7e99434ab4d0defe9e0eee18cdc24f3312a988e404bd1b49206b361a47ae08c05223b6da1a8691ad6e27030dfbf3e42e986a1a7889652d7f0b0bbd6462ac2a492fe420e9689d3871ec6ad68fea8a93969dfcb46a40c24654d22522388b3d4edf6512ebbede3d507b91539338e5bab287d2474b2984246d49d97627afa0ee6c8e4804e86937306dd06e1d3d0fd31c9779064447631a0cfbc0e4c8ea405aafb60da97a7a9d169eaea10cbbdfd1f5385d08720a4b1e0199b0770624aca5c3b16b6aa3bd886d1052aa7864d82c612a616fcee53e24895135ba80b546ce7808c4781af4a65c19887a3bbbd6ed7b93af8c7f1a39328d8c844b626e0290b140e777b0954fccdd256713b58bdbecaa049c2c2c0be72df64f39c0be2b0682eb8205c6e11411c5c95c5f89c250e559726dbedaeaf2a6be2d9405153bb9f4e4780ed2febe986b525b526a4d865b58a54b42edb8418e73cb1cf3c049a4264d523b8745a22a5a60b27ad85d7d4b302b245998764820a5b7433233c169a22c16f4710fabb55b9c74481fecca7998e76e1fe18e8fc2aa88c8aa2e4b0a2613565b7004960285da7abe210348cc390f3b1483c5a135b0239c37e56129d60da88a54296c06039200d44b0686e2c193daf307b4662e857cd09feb0cd13279e0bd055f6ff1c352fe8fae008898a6f0b0707e36154e49045853adb642774cb9e8694faf0752ea1e9fab83ddb5ac8765d021361964bbf320aa8973cac241a40cb65f8b702ba1322a6fa7bf96cb64e69661683888c22209a951c762b0c854d132a29b857072898a21b20acb056631774512aeae08d5e134871dab1b20cbeb5997325faff84bf2094c6a412d4ea3a5f31f3292de1865430dfb00f735321bd436656da02ba45a252e2bce66866cfa5066e28bc142e351db735eb91cbbbe44b9e46902aa1fe594a0c5c4999c881959959158231f97e1fe7d16bb261d1104789eff2fd54860b5bc4bf23eb80a3cb1704a4c3b657cf4728dc916a597ca93578f7b9e9007201de4a0f4bb0934787e172f6f1226af8b412d63d6fc0e8559ba88c23739df1dfc4f27fc486722d65d4155cb1241995e3b17359db48575aae52770beac9758a1c6e30aa541b18bd3863ce3761e00e6ef3060ea045b8eb3f9d4042049b9706f4517c99eba37634ff7bdf19e0095c0ef3cb9cc73072d38fe29d01d7c5c07c0103479a6db5851619411e9ef5b0eca0d5d34872c4e419f0c32fa178c9a0b4318748ed1d30e55430b63c2d2980b66299d8074a559ad4d7409f2a4529791cecf9450cb535f5a11164c06c00d1e219bb5ea03f8af5c5e4e6a2bda2a330fa43e4eb8c919ebc49af05019be20edb717463e2a185a803ae2f0e999d63f0d2ad176dda5f6d36296a5cbe13e95e2a74ee8a09d4e81d69c61736c7d8680f0052c7a211adf6e185d3b2fa087b9d7614088c476c2434adc46d39d30e76ff61095e8761b4ec1615d8e09c9508150833dfb6ef6fd5d43f00b6b526db90c3f505c560e772fcc268b661bb6a530005b5a7f66ee483e8f1ebf7a7e613520cdd8dbff37206d198e3a905eec787d04cce3742d0d5f2f7ccb072ac6e4b812689d024326e31a133ea8d3af6418c6032f07ea3baf0b7839fa1b901fac938d21dd95bd9d190bf11e639dae2ff57fea105a65238a6de75066887796f34ce3a3cf4b2c831b3916d932840c47f98f2f8500f71de16d6699dc6ecda8dc8b902d463d5a1694c4d0003e7311e3055ddfb8cbf75c6e6f6a4c98fd87ae33b2f6afbdc5d9afaae106e1fc9e3c3644acec2d801ff060f8699f8f05f2e0e745b5c8ac34d8464e0d92e6d6cb4a8467d806ef0fe22e63b4fd7a82d1839f0f1f2b1b2c896efe701ce7eee1e41d5bfbfd84ea2b2de8fb6afb0bc4dbc14c78e7a97a055357c84997868dd775e396caa08d38582e1c11504f5c21afa28fd83040df4c58c2cb5841fe8aec93dd07db3351b6295c4155a660049e6823f71b1761564d6dd19b769dd875c3b7a63dff8408903edf433ebd760310a6b06ded18c5481628bed04b69d732c0f8232ba99666e5ac305137f26c6b1b407adfc9655c68bf918fa3c4b38f1c975a2de2ad642595cf5a4d6ff581432248e81d307b251565521347b3b1da2921f08c3e848d97059d84fb32fac552edb6b94705a40a23e3a9588b6b8766c6d426b841fbe84e5a93d24dd7af35fb580a2c528cf0bef3e2f1a14b7d2f4d04acb319e270c331a61a0e22b36a8c8bc43f05bfa6de16145f6360e5c20bd4c9bb1cbfa3e224ad59cd922860d8086b2bf6368d3d7242230570ad8a8ab7f8724800a5ccf26754d5dcb4aa1de96502c4bff74e193fe4a9b985513e6b72e3cdcec08bf032992e3e7e44372c8b7a85e08d40cf2754270ef72aec19671bbb6562372cfa12d5cd6a523119c33c574ddd818403f0c5305f71ab914ceeb666ceb5f083179b0b805142599139992f1127cb1263f19c7b6609c7fd9a85c25db3f1e4b159a5aab2dedaccc083821b8551837c20a98191284396117a48310c6b85305c28f8436d49681e0fb173d11178f6e1729a3a38d8fab1deca491539b9c976cdc5816a071b5dcb5f1253b10575220f5841ecd9a2ffee0ea9b3ba5d39d58a0372f89ce3b9f17badecec37d708207cb45a7faef6ea937919800ba17dc4094c74075f0b5d04cc67510cc5c61d1d148e889963c4e3e10f1c00573ac309f96a8ef702b54067bc2731c4b459a4954c9f7ee3fc0101705741b71e3c8aabff0d24a8e76396932232164bc5ab89bc57dc7b11fbfba177035c9482532ac7eb1570082e242107ba4fe85b4bf0baae58b8c09ae134152934b975b31b38a4c177d4e265a0023899cc9c7fb277a50a4d6e1efe97724b7fafca71dec5c64177e3a74af885e3bdbc808379858c4e198a724a957c53860ff3452f33c263ff5af2506d2a1536c0978700dbdebdbb72ad06051be1382c87a9ad3a5bec92719d2d74010140fcd23a7abbaf2e30cbbd62c250e86b5e280749fe06a6a38be469ac255962132a6053f5e8a1025d7580b95e09cb3310006e4ff362fcc02bd59a31893efcda2175c70a4218743f30bc4942a8e1cec91d1c6ac588eba57e2a8fee327cd6f435a76ceabc21c88bf67067a19cc6bfe11aa19f4c872a6eb5d7c9079fbed4635cd4abfec0dd8a8503f575cd6c32db780d33d2bb87aa54058ff76fb0ce83b4590ff2b79ec377c2f706e6e45044e092accdca42155aa443ea87897f1fecaebc234fef56422420c7838127372f70a7217a3511e2279871a3ca77980e628b10ea464db89a5ccf82d880e48066fe58164741159010701ed8396f2fd4ca637aecbc055fd2934e9b7fda842605bd6a7a3fd886ccb329a7e1e46d343a8d19028b867cfbb41a31aab50ccf9128d9adb224107b896395d5c8446c68b579d794b98d79481578335bbb102b2ef6d402f3be94ca18092c1fb2ad2d99999a05fc56cbff2e28ade0266d6853864b3d650a5390ece4e6f741f53fae990509d6b4babb99d02e0b3e6949541a1b7181cad16539f6a188f1821a0f5892b1e1fcb4608e341a309d33490123c29e5e94fdd7979f47d355ddf2f3e3f41e162df3e5d5d186f7db1552f183a00cb642e3dbcc8e7b0f1dddd18d0e2041ccfb8a08d69fd780c07949bcb438d61192f5c4a0145a3868c4c55d91901c4209d9c30d109d5361194e0ee503ecbf60196ec24b840660dfd0179e7cbb8217399186b25925be41c7bc3e8b2b25284d00e3c1665138ebe51b22a7baa3b0f28d60ece735028109721de6ca0e77b55bddcf70a101573225ff67262c3b8bec10f6e517ee6d3839025a010a5225f78d1abad9590e32651deec0202c0269163a46b12158aaa74a011fd5e253942c644d2d4389d1508735531a0bd1c90b33e2e4281d60b4a8ca7209e11794b8f42fe1721d8aa77375024d9b5cab2cfbac7ff7154a9f8f34b8cad3429253d9431b0d26dfa5ffa36be64edc47e750d4c670f296b11fb46044736dd8fd9a3f015b606535ff6b99cdd413c6edad72d9e353160f9115e85c820e60a778d83d04e01661b003e6c28e633658e75d70a09d6f44621a7982eda151b6f521d94617d891a89528a1dec83cc4280ee7704767dc57f03e0702eef60b0d97c964099323a218e2b5e59b54b44dd0fbee8d9ae13500a78ed25e28ed7070b1c041a621927f92b39970c7a1279e9180e8591ee398631de606faf121bf1c2db5a88002d274f320d51159b0a7554ab856bcd34988f31fd543ec200dcaac0deb6c752addcb4a2ae1efb30f7f5bb404948e5379d077d44598fd0e91be47b188a82b7952327efcf318ea40cef1099d84a19e7d256d955e8c077d47c2fac3e85934a35434b87aa27bc968bdc56d9685150ce1863157ddfdbf96e173a4bdd464880fde2ba00f436ef2222bd904ddcd820740e4a61b30dedc8514f7ade7c78de91f42300041112d60f5125655320677c30900b189043905e19a8e41bcd625874a01693931920407ef06abb163623e102e6bc2c5eaed7d018ba33b421349a8d2af543a0faf8fc0fe13a943ecc54f45579d6af7d180bc6baa317679c96901efb0790ca8d87aeef6bad5f6e6fb089af8d40a91150d8bb2859e7d8ed48a78e3160fd97270433a5dee676ac650d0165e4a680215219c0d91cd6e6135cc00e8852598875c1d92358fd413f29f8b22fb88e967c88856d9ac3d280e6fdeb11444e53e78050eae8dc0666630568a47e8a4e9766ae1f5a86c03c40aac8cba32ff9967ffd8ecae3921f4b3d66ae933fb58c9bb88664d5ae53ecd60284e35bcd422fdd2a00e69a87013b1c21770e00200928889f59a43a34ef1e6d4d16f654b5ddae9cb7d1a04afb1e258857ceab92f3cd715e8a73731740e57d387a4a118f0c7aa2d959400abb0d4876802ff01f352d619e625f7b3643fc8bf42815d9efe36b63fd4267fb2e886352fa954fe41e7f2ecc74b7aad450f987ef73935d82d45c750087ddac58207087c8d84bc2fd34fe197fd7659d25101cadf198a811c7285b93291ed02329b7f4257d9a756baf15a333c7fa855ef86f15ecccfbb368398055100cf81949d663a174a3049395a484813d4816bbc19b6fc784b6f9cd1299e2b9baacd1fdf3b8c312a3659f7c645769eb608da5e915cff4daf91055badb36f773b9b9d11c350c52d27c012835e82df2507317210cc2c67e3c5aa7a457689714cb003e0c9090cd205a3ba6f94d6bd478653d28bed876e644f1030d785b6f08aec3ef02ec614083fbba7b8011b9e05ca6f7ef8551f75485ba181c009dc33515ca301f2b1688cad0a4fdfb6b963a59eb13c327e2b6d55431df2f7474395449c8b4964d6f1eef5b8315f32adfb303932ab0ea3d9b3ee67be05efcfbad1895eb16eca88e9b0deb41bb71e2bb5d5ae0037f1c52a40b1915bdce453292e49b2854d4bea8037838f06ce2eb6ec1bb0e579b4722d755b85917686efbbedbbfba00d179fbc4a8467aedc259a57e597a2d8a89659c5bddee374cf1459167163a36f1b0ee93d186654fa4a95b66c1a6ab1212f05508547cf13d141ff1847ab11f03597a2596a18318ee50c31a4d8c9e0acb15258602a45685a0b3d52abc2ba430bb5ce94b14473d532cdeed4455a28b43d95d224d7979e17a93a6833d81d5c7bd9eb9f2f9c8a2c430425a71d1d5130b0e2876bae99a87a25d1500b11d798c1c1c17ac111e53669887b45c56a5529c6937b4494a7a900796b94c2df569f43c8c8313ff578484efe2633e0439d6ccbc7f135db3dd36029bb0b2b9ffbc156435b23a882981c262f8affa5c6f80d47df4f84a9efe07515b2a8e082ddd67477af75fcb837e1daa81dde52b413fda7a0026daf73e0f151f57c72cd42f6f4060dac85faf951f0e61ea40104269c64dbe3fc44c5467074e0fdeeee19fd2395e049a9bcfe98d9c11ad512b2e5053c7b61689163c6502ae5f38e99aaf1ce07bb3210c59992012c8aa98476ecf44202fe1391c7aad8c4c88bc6bf847e68026e2241c419689638c03fa6508edba90666ed0fcfc85c9831917f88bcac8dd0bc89ac164939f723ab566b1e2775e4410352ebaf593bb6b52fb150e7ed6d07740ae1188c6a151e21a9f540f88837e47931f0bc6d0723169249f6773946561f85d972c79a4dda652f52de876c1a0c7d70064ac5df03fcb8f110043b0ffe55d761bd973aa8b146751e67c56958f7e5a1aa90cf3ffdd564751ab45db295487943140f8c364c48126d90fe17710c323436b4b88b212fd8474db1d316fb53ec8796fb8547370553eabdce1a1889b4bbfb8564875f70012517132ecd59d7d166406522603df40b4ff40dcc6c0c67c8d7c6654a1ba4e53f0cb43d1a108fb6bd11d61c3dc14c0d6f20a3b8c42f15b8bbb64ef281c37d7aa424942498266553de370bfe6c866efe30e143dee23f2419cb422aa2558cdf627e8330b03fd1f59ef1b989e33e6ec23d348f7f0785e8347c65cb926ce58c4a6f665adccc1e52865877f283946d2ef9ef6e0cb18567a7f6194cdda9ce1fe93a80edb5ca220c3872cbaeab56c2a4b2253ac649745a72321882b745bf108ae8957dce4bfcc81fbc8533b8ba47cdee565315034620011e722f822519ce11e1b79136bd0431c87819b0c5854b594863abfcf7da754f22ba376fd070ff5df7c11f3aa90836dfb79e939c3acc4dcb053fd1bc69e4668402080c341c15c35334a6f6a1c69b1d1733e2c328540dfe54ea1a94ef26d380dc95732e6a3f1dd0112e41804335aae13137d5229fa79308613a0873869b9325e684498db3a3f972c4cec24753b3f6726ffc20a75e70709990f21c4c2fedd48032593f53a9f3e87b84be941bca48080c6d68b84c23b452442373c52fae3bd1abb71a089db8991e329c0db98d5e41d11ef8d406b67abd6e7f9fdc9e5c0cd4d8b4065bdf20709251a48b5b7baf51044019c9a811a92bd7a66b014774f9127680c35fc1ae61d90e81ef37d16726ff4c0a9e7fa4494bd752f93aa2215211f54bd0e99ac55893c170410ff6741d36118ed7bf011902c7501ed14d79bae5eca0e9dbd0e3858bdb594ddd10454ec129dcb48c31ba4df7591fa6e621150afdfaa1004301febd9f0564902e7d2e4f0d2efb47b60a4b090a98574c3b96afff3a3bd073bfd70d6e766c1c15ae50a53f1e8b2028aecbfb1f480633748d10b1d05d65e3fd647b0fdc958593fd45c50f3fd032699a0089a42a22fc0217d819a741738cd8f59d7e4055702cc9db1de5e80f5c54ed55a1a517393f617e9519aee1db2b8be9311b27f4da3060f3f1b6c238eaf45a0f35a23b8e102f24ba367fdcba783f6bad63cf275234edeb8375dc0aac26a71006477493058138ffac4e8fa1292266fcf2586bb7b290b18f9668ad9ace042672ca0b9b6a5893479c53698139786718b5844b5a82e992e4a4c15e494bb467a9608e311ee84a980114c1102a792fca4a00b67794868dbbd100e8bc1e876fc9aea587a4d11db4339378f2fe8a2e2a784710b6c1893add23080e7b36f524f00cb70bf84acb4d51f2d3e43f5001faf5986cd1c8c3e6e4dbdad17ae2b67b778ecdd71808a5aa96a12f0bbc6f53b13dbc2578d61038f983563a44a9dd42a94c4f929d98da6d571371f0cf1aa87839421511bf4a0480d760a49bcfbbe347a70fb9fe61990b6ba03ce00085e8084ec7ae1f06c7a197affae40de353bedbaf47486c7f73946a1c93444ce3e56113e9215fac8c705d847e4c74ad049b9211c66e3c85d35aa018344a166ecfb1297cd1fdd64457153b9aa97ede70c116835492676a9bc0bf39b95ca644ce61f50b8492ab3af814758bed05efbd2acfd56e556c5122a8172ad3a635f99c37543a3fe6bc72fdd66fef04242706102b5cc4c66890179f010457588ad4a377675b6f87fef901baf0d1e836b65d5acf29228ca20440c982ff86fec87f3aae7aeaef603fd14322e7290f60333a0750341f59005b38a75e5d327237f6546865f46bf194cbfa98bafa7906520d56a6bfe819f40b39dc1d686a5000da0cf7bc3c13e0c627065f31aa0391d7aaa47fe12728a2cd1acf42ccc6f0fd80651abc307666ad89f0a0370d3320299c75fc1f02151673bd1bf7efbef1d3a11f0dab830fbefaf620b6a1c3733072b81fb77d4b8e23f6a1c59fb5d9d225e56b6148165ff31b2f9a563a65ad613bfb85f2343698843948603d4868d05ec5d5de39e4088d5da1ffb222b5cfde8546b68537f517c762eb129fb1c9afa5ce7bcc81b669e134210c84d9e3a29fb4ba05649494aa8cd9fa020fb7e13a4baaa7c208528d518d1896c541027e9722c06c446dd6a04da06f8368d3b38da13345042579d3e7ab1b18fc6a820321474a35007fdbe174cb4b3162f44cf4acb98170ef5d6fedfeebb53f7917875ff22008ad8b03f559e62e187df9097693975696f4ab95ece189781e3ddb0d853f94099737a45a1f5163e07e0d70862a0dc67235c2d129ef454c27f806a31f60e54a00f8ba4108601390367546d93670cfeb4d951507d8c6e7edc8598b97113921d05c7135b090f3c96091914e394d0677bc2afc07c8e3138406fe6bdfb352e1bf4c67eb9518dc59166e56b26eec4e5b19202d7053233b643ffb74bda765265453a2eeb4abf55beb3e9ec1f828ed0efbe52a1f0bc087b368e0508be0ada5fcea2e3bfb3d6d098d900113c1bdbf7ad3b25088eedc26f0e96e2ade5f5c7f4056a6cfb49a58105725499b165e5700e6d2c7ae323f1773a5795a062f69b8f0d3135146b81b992754936ccdb64c636f023ed85208fdae8e186a67dd81bf4eb4adcc8b177f4834df4ce897e765f0e9d7d48b982332e47d66374466fd7dfd1ddce36ab91b3900e237dcc4c1ae3642c24f7850edb3d5b4b38721f6b038b84422798958d1dbb9cd87a2ce71c6ad9a1ed02422a68837ae1f3b3c6d79b08170b67a0cfd1e4c675fb0d58c39a33482b738a0fc46cc9bc081510096dea12c8c07fd6334c32a5bc39ea23d81494be6c4059002c81228491a4fab82d0f131b4034b12b1cbccaa0af496aafdadcce47ee78b6841340ae9e1380cd99dfdc3da308fa0f6397ff3970f13f0a27f899a3d95154c0058ac39de9250cbb78a75b6a94eb3529c4943ab8bfa523c27844e251b85d8e3099abde004065a92ee92d50a7d0ddcae565545140fc4c66b7e5368c791ad72f6ca774a7dd4a6c928012eb2db0269609f52dbc2e2243cf5fa194149aead04cc37505fb2295be84b0575ef1861e735d246aaf021bd8b590fc42a606a4ad1520b1222fe9d2981b4c0953780e31d74b4dbc32db81ec78599e38bd8ba371942a05a72920a62df3ac90566e202840dbdb7b2ee5d6edff613bde2fe06619486d446c073c63966107f19ddce3af5477393a5a036c357d9e100cc82df8230b53c9c045590f6e613d37ac6fd14992aa3a97781c6cafba5c0f0c585846bf8b0a9aa604fcf2e52464029929de6cfb2b742abf6e8db9c4ce87f64a39c74053c21e1d6dc0d639312d139fe31d681a24bd10fa776befd984279f0f7a195c1b9a01d7919688047f7f0e37c529d83896f60452090eed87d72d1d8b2bb217d0cbfaf756c832c3f346c2cba1da0b8217326d41b4d46cd6878209123993fe7fe0efdc39502aa5a6678296edaa99fb8e35171b313f5eb25e167af3871cb2225a0ae44ffd5e3d4bf640a3f428d9d3b53bdbc8fe30894d1096da7ba0602c00124710ef3add24c99adfe53d191f42e3c8c1be07df7bfd21fe98f9117e90915f1100689dd34b4b5dfd275016d629165ed0671172a40c3a5a1f84991c0b5840580faed867e28d4df512d07cea6f54778ffc0f7fafcce1679807a78cead0116d3063b2e0672e582af4f38ae0bf777cf960157b3f399114565f4c1c004ede5d543eb0dfa14ac523ffcf7964717fa583489caf2efdf94964dd97d6469ede8688d8b0c006ceb78163de5eb40fdff125bb80caf9c20c811e229ef8ab5919ef1676625fe86a7d6b9cf07e7db5408ee9d4685deb629cac8efe29600753666e7ec411d5d09feb047e82647dd571449fdcfac0286a9ed9ac9271c1a17afab1669df29f1891284f0cd1f01bd34f8b82be3ec553799cf3abf93eff6143c1067c70bc55d85716ecf03ea0afba323c70afed811093f0bea87ec8d91f6703c0e4e19c16d55be1cae5028bd0998420dac03d10c16dd74e60a4093228aed548494c722b744205ed07d6f56fae0c1d7a8eaceb1190f4c5c24b337df5084669b53736190b6443f220d5b78bb69609748adcae273fd0214f5dbdbc7239bbc17ec228fa8364576df166e08529c665d84b2074077980eab3ae3b922fc33a67150a9d84c28564e23ad6df936d892d371c31be503b578ad523b55a99749ee13a344fe168e1ce28d4ed80c90548ab419c98776140ae8ab1f2bc2a360d4c7a942f2b5e689e57458a4e2529ab70edd26278be83a3656c9888ecfffb5d6eea8a31ed063fab9b4c7ddc3022e3db82891ecf99fb81981f164615a2f2101d50b72eae1c994f087fa34325cc275a32747c0ad17d482608f32d341c72ca0b885cf6123c5544d8454b29895250cf518c12a58d2db94bfa2e42a5362ed62bff79ab118693ebf71b8cb6adc7ac6d997a93b431b0ebdc2f9f2b26005d275713c1a81f5300c0b489a9568dc51b204b8d7052a483b918495656c52b6293f5a3513eef90bbd470dad247cd7902dfc1befd1f45483de39bb9f6a87200ceaa29976191304ada260e0f62ec1355845267b6d9db1a3f6c64a6489adc4e97db00d242b855d064691f8927b0860ce93c8fecba12ca9d25e68730e003f443b68e0aa40f2fc702c2d9517702518aaf9957c8210ac5d59113a5edcc33fb59f04a633d0dfcc8a869a65c6d961baffc612c405433c2a1460a1a08669ad5bc0f7547aa6fa176311ed4d74b1c441d83c38d0345cb2605235d63b4f6e2e1ffe0fa479beb31f982db3f6f5c90697d2325ea505d90dd62405a748aea4360b3b3d5e24d0dfe602216833857337faf122431d716ed3cb1c8660b14493c084bc50a305892672fd9bd74e0c8272893e182a930cb393cb7e65aa17fc0549b722bbbebb8371226a2070eb3a31e8ff766933146d928f6896629a88a3bc5d661ec004685942fbae0afdfc41efa278cb6708ec1d76ceb42b4a6193c0629a9c95ec4805642e364e97ebc565e2912422a12532137d56a0560e152fba8166ad80c9dd4da43f42c44c96ba554d0f05d5d1652348f4b4913660d9f020fee48602ac012f2d7477064d1c9df083ffd01bf6273722a1acaab00b4d6445dabac34bb9ed1e68b1be9018d1df56b6e8c10fbf99ac36234ff35d243cb409ec607b50b838f42ba23b3c48c093e4e5a664c0ca02bda4121f9aad63ee52e145f04cbe22c0dcc90c739150f5416f10a8929cc2531f48a1f893fff8d2c8230e7f4d2d9832389824e0f85a762de8005d6d9b1b1b663de9a2031e8bf62b1296e709620a398044079bc150db13352cf024883ab2b6194bee4bf6b600585b4d6c8d9d3d8e7d4b0aa034f164f3d4c7059b9db716a7b62941a5e703047fd406acc00349b81e77ff249992b62e364f0fa2af8d3481bc180fd38449f343ff1dc1065b7e49b6c9b0ae833a94aca0f20debe4f822b9f0f97543d7011597ee4407c3c5d05e8ed944447d64fda1039e81f98f5f997058ac076d2f2c8c219080b2c32386f55f20892935e4375f8de61a0b90a2a056ca776436ad8df3fbca151ffbb9475ad614c09bf79875160991a26e6e049a321395c7f46f8daacb39fb514b79d0ad964160c1a054b7fd9fa8f4fcb34316d126a321bb77dee0b027c3673a31498c222b5d972aa2078152401ea6da93f8bd4f6bcbdc60e489873fc30a944e0ef13818145d4180cfd6881671576c3257677d69b7d4a3ef7698ebe33d87c1309a6a07589fe0bfa2a914137522f1448c38307519a7d777477f4a97bcfd34638343919cb8ff7716575b79405ddf733533e770be2b96d08ad81aa4224df0602f8346590845c6ff4b0cd1b2acf993f0c3b5ad0e4c9513d58c43ee01642398bef3a0f8c4a5bb1cf6a0dc168819fc8a8d1ea1813831b5f445b34bc945108d1a933610b8d5c8b78e1de0138bfc038913e964a46eb9bbb4bdf09571c55d4812cbdce5c1c249c3c69ceced69ccd00138ed8324a65700a84cbb7084ae3a856eda71b6d30356ef023112d9f9710171a9bb34008b4e958ca05b92ce677a0195d50ee4e0f6360d2d548f9a29bdc0351f3fccd980c3de8ebe496c818e7e4a56bdd2f6d3eaf28a5f4709295f02455fa9f0f16479916aa622684ea057b8c82883aa5d754fef9714f3b15d5bf344ed17b3c9526ba86ec304ed14b501c86aa28d28144715256a23239014e9cab2e4b1f95da31dab7760f184bfec2f6c1a998e20625169d4613494f0dde9871c2a19bd674959de1a8bc2bc280181cdcf7ec55dd8832074597ac666e863d68e8da169bced2b2a9d9bda46adda2cc112ad050ae5d89f3dea5bcb0b82065291916d13d4b5539a2b69e39252d83e7faddace275dfc91d07b10300bc5e769dcea090496685a399b7c882f2cf98af8a34433dce7cc81a26b3029d5c28a0da75bdf1aedc501247133a784df84ef9b4d8d892d10e20c035b5af5376a062112dc2ca9c1bc7881c5631dec6aeb86270fe421d7af7672bd8c0dac70187fe3f01d2433faecb8c14bbe5e81a617f59b11cdde9272f4532e18bfa540683187d32208cfb8ea3a9fd886d6bbc67b5c6dd5d2569e361428677cdf3d638e67898622ade367daee779ce08e77a7bfa756ba35441c32da4f563690cc8589f2970105e853f863f4ddf1fc5f242ef16400f0c1c50dfcfa565bd242b108a1dbc798a014122ff99e24ea8c9c97de33ef03336352934bb9ff9d635dcc6a8c2d3b26f3434cc0a5cc9337b8cb6c0f29c3376d01d2a12d91d1af4088fd7a57c11be74e32a051b4fe60a765aa87e4b5c65c1c8c122cea88bbd6d875b862328f8aea6525776729ae0f1f7bdad9c82b6838fd53fa4aa7a089d04104ac4ff55e84cd1ca04198621434d786f74664e7ee5a0ba6fc1b712b76682818b08bc4f0475ceceec78f9ab377023e445d2e85fb7f2101b40f0cddbff845071152935e1328f07ddca5bc462068586359428d66e601ead569cd524930a630e4973e83cea4d7139862265ab5abecdd1a57e135ea0eedfee1d9ef14e7669c74154e2cde9419d61085cbf992e3ea8b81e38c1433d27cfd54e453f84fd33c3c417aa95da206124748cb8ca4510d282e9fc8fc38c60ec787ef91160565a0af4886a8a7fb4fad20d7ef79c550fc1e3aae0cdc000d959d65e48a3204707f76c35150846dc36c55c15e1073aa8dea862734b65a04760ec17916132224284dd175100be6d0146fefc5b90e2fadf140a48821ae592f7f3ea17c5e7a1b38eb75eb928987bedbee04537c80630c42144cd6b14790070c30819ae39a1d579d8408225fb5a61d20331ea0517264fe1e7f38bf909f616d01df8da7f3311dc0c888c545b66c77e90f8eedde2953bb84d9a905e3212eed888ad60b81f57cadcfa1ca2ceda7b8ac984339d704c5319e5c85c23682fa3cd42d21322dbd44ed05ec338017e07ffc443e3c6349d1a2007ced7875eda71882b60270349a4aeec62b73112d79ff131f25689597ff0ed47194930e1f98f19e536707578e8b8d8724add1c89a977eaca59105fe5c0d68b0b511dec5e21198226d9e31858cbe324477b31cdb4eea03e3cd7357df25bb30d2c6719b5ae03148ce0a4088ab70410d6c655730e91bb7d7f1e427014e8a93c244db9199c6ce07604c329d31d6da58dd52740622d25e40f66db1178e34fdc699e87cad4dac3f4f5e580e91ee35fc4840db08f90009115a08e1f2a922994e22f8c41931af6a1fe5acd878919d09103160381c8f2362fb9a7b5c9c80efda0dc587a03c19e4800024df166b4aa378dabe685e9a6910f97a16f8f7ce44ef48cd9087663ce8cfb45897b516ce749b4dfbed3efa8709ce50896f8ac92833aae5689a866c36db2bc3da1fac71872466c65dc171951b245da597f5beeda1cd07b37ddd94b1bb55a87e75f9520203046fafce9ba032472019630f72f3c305ee550e667f79860bd3ac888e14dc770512b5b0e6d997171f5d12a1ebd099374365fb51b5e1eb2d785465df5219aa0d4280b59d02ab67392a2a3533f3fbc62187f1b02f1ff33839bac8414910c8990f0ab7d6ea994b25b776532eff87d2511b295954922e596a44c7c765ed5e5d534e7a0240ac1d8ef670ab06eb2e3f01fc86da59354a67e7105d8a56cd8e56704fd186c595f8950f5190b40744fd727e3b4108eaf93cb2cf466706045a3d927b511e05c40336525d3978b0b9ed305662222e3e3fe03145678dc1c23dc5beb57b0cb78baacb27fb7990fccb23c056716a1a4bc228fd1046df18e4e95eb1aa4912a149d80c14f50e23fe9545bce036f59b6b7aa8158882379ea3e201a4856c6ae3f1350780f8b1c1af9f7427249f2b3383ea15945813ff040eff725dc6e91ba5669c243e0974347a10ebbee53b245610d03b8b88da69812cc51745a1feb146abb3828f1a418f662873f03a93c2f85742521a72de418a279d751c20e307f57d2b661beba0579ec564499424626eff5324c8f6f274ad0ab3a0442013dada4d61288629bc8d2cd8ca0f1396cd8f2813997e1cbee9d2ea236c73aff88c52cde21953f5d8c6af7755b3b51cbb878103ed74106b2fcca215d4ef703649a4f4e79cdb1b9bdeb05a53c6b00543835b6f27df1265e2938789498faaa78ed57fdce018c2d1879b52cf04b5d331f225fb428ebae30e529c5fd9ae4e43bc940b0b3c5494f76158ff5f8aa20ed894008508930dc7a8723cbaff4eb523e1a2451a63857023481f05f999181a6387194378ff2fb16afa75992f920ad2a00a11df2b32c575a2eb640b5190fe8ad72025708aa7acc001ee137c0669f79036a2937789655b0ec71376644eafabc52080709402af46dfc14b977101ba07051b055552180ddec573f3035b8721d709938a531059c2dbf0261f95de55f73c3db4c307c8711f75650bce9fc9658f2e96bac2782c136291d4431ac344bdf82bbaa34b421b9b03784d4b9247682c7195b431d9febd242fc6fff4ce1ed1bccbff41af5a70d171a03b97f1def32e069794340ea0d7175af58b413bafcd2b22850eb57f14ef7d21b7d6555cfb2b282f2c1cf416a2407d11b1470bc76018ad323570f5790bb9290ee59a6f90b51c208e1d7212c8a94b44537a86e53426e6c981b037e1447fd657c1904d8a8c60d2a2b666ae6043f1af36ab0422c9dec4d5c81f84e4f7ef3dceb7974022f1652896cd821616204a2c96c9814d5723b45e6279949ecbb0857cf3de55c6fe6561a3cb3d5259ad9dd196172fe6ebbc6e44bff9fe2a1c8cb42a31c0faa165ddd3b4e040a8e83f9b3de37d1f02399ce56e25389cd5e672090e34883d1a4da42b9ebb7c0eb18898fbe2730708703066bae425666320e5e4019d46a806ee82fb4c3e4614d137371744e936c234085f4dd04aa23ef701551fe3d471a4771bbbfcf313d3a066207148d65fd6a9739135ff49bf3e38ff1c7ecc4f970fdb8d36888cd17ce60633b860db56ed4bdc678f4ae148941fd09ce9b3885a13e81db24832e3a6495e5e42659a35e22938baad53855e292d1b5851eeeb82d3aaa3fefebd128fe5c4559af7d1840c890a185f6da217f2d59e2bbe696550e54081842ed58073f335333e435595313f58237cd4de303137aaa61d34c956c9a17c5d7302e5bdb1b3620582393b016b07d26873780d3a08227507ad96b1dec26494df048efdcba5bda79a6dddc64a0b07fad9853e0eceacc096d6c5ba1d35299d885aa5b7afa748f864cecfb6bfdb1f7225083bba5dea8298e5ac2c233ab261e791de7f23e7b72299ccafac9d7c690907f7f11d082309ca5f5f1789ef42ba438dedd643c0470ae12a685f4dffa73e80c5813afe2eb1024630c9fc88c727112f541c9f6632a27b87f70aec83559d8a24af5faa0706d8b3fe6585ec00b912af1a042f4545e6738f8d3f747069f08eaa0a85f3ad7ada7ebfede8531b00f69c2c593273a2fbcca8658baf6ad739d200b4163553cd85622e382f4c95c98d1a82116f3f0813a12ed42020f75e00cb7ea07d58a0fcd01307673bbad3406586cd4fa5000fdb246a700cba02289ada4304672e774c25acb20797ecff01b660784234aee40510285871663b878e3d194c3b38bc89cd2567cacec4f0501341bdb38a39b9a581ec0f3f79368d78fecc3cdd2a1b3eb0694e4047578237d021881bf8177d2c4197ae72910f2a5bb982eb94f14e67b6bb7e455b23b562c79904bdded16b946057bb89587cde68698ea405ffe8adc4854e55b0bb7f349b29c62028371745b7395a2efde2d6e0e2fc075168718d4e07d954b6e2eaaf2710bb71f3f498251383f0203d1e85b8d902868efadb1fb4bb629d7adcb1560065c979917b267407f392f79610044f6efcd0cf86ad3b0fbe59ece00b68f099b19baec5ed3d44adc619e52f54e3076cf3c80edbf747c0007a45770b1d7a8aa879bf280d9dd104b1ee4fa6e727d69ee857e663ffdea09e1f82820787c04ed126365a49da06ffa661fe4e96eb1187706927ae76f07fdf99f842941e4b7661b58c91dc85a937bc52159fd63225b313e168abe88c5e3070733102f5891ee770c084f0fdec69bb204c9b1019095e520d468ab43ad6158ca232bc66234827e95fec2a4198655c513d49fc892865f89984de4a0daf20e0fbf98ae838da9496285f5791b9d4465a1826138f0ec4a2326f6072865c88198cce55bb286acfa18333e5d08a59c282e06afb4e5946d21c3e86c535b47f0f40ea4c491459d3d4b438b8179727f4b648af90d8c9c4809b3229a36918819b6e2a439a6a29606540247d5a743e8d827ca8d11e28bf7a0601587062a1e2c5eb9e0f6216a2a471fa48aa7aef76e2c872906fa83900604db811438ca6a25a3db43e8a08c13c1616eb881887beea3870e9583c279354a8137c70850c52c6d8065f1604e684333536f8bc2df4e83c8126adaaa021a8debebed54d59cd299f830503784a74d87245869f1882949ad2449395f05926336e97f0b8be072eee0aa0e66130eb610fae7909fe88523e6b499d314edd74bc97043d060cd8900f2eb09afe14339bd0cf6b12855014c9ad3b4bfd3409c4ce7d984968de16db06c5160a2b9d6d4243a3dc104d66c22c916c9ad36eb9071839822afab054174f121db08f7e2967303813665fe51ec86b2700dbb72d43a21d4e0d435c33c5306ad49779d0e99670a46d0cffda79dab0c4163236794074dfa6274cc5ec2d201ab95f02fb7b2f76d4ca263d7b81f0f78139e5f64a8e273935c4f6bf3cc0531388acb161304be9cb08dc86124c23ad7f30ffccefc79c1f7e8c9feaa3b5d48588e8bb29ecf47061f4099aa0bd2ca528454833107cabbf0897d6d0f65a1abd2a1e98c573368b7e5de239ce5d67cbc72b2f0d54c3cbed0c2980ee69ea9d0f523dd90dd7d7d788d4c88aacf906f39ef63d4eee7b22684634640f32fa584a4a59e049e92acb4a57eccb0c36eef0591f13cbcf69dd9fbbdd889c525a885ef9f6bc01e852b89ec253ced8d23fa80d57af15de62dc66dd2e3356e366aa61e4c26a37565dbb6c68e589230e9d98e6fdd70067dd52b6910d8ca842004de4afaa68646bd78325ed189410b945d4670c3fc016cd69c0bba0162cb8a6542387071e1ea72db7c6a7f0071d0f0c8cc8de37c7070bf8d47206cab5ed23530a53bb47fb424b3bed64923d64b869fbc9f278e5e01dd7921fdb4e98eec4a77666ba399afa092e16287d942f1b9fb21fe23b587e007ce70b2c519f3ee47c63b22caa398f196f893a5d9e8d5c96d0943af1abc3dccf4c2125a04414c86e550564cf4334260109922d1cd5805055e60e3f8b5177cbe9eac5026c84478495d62cae8dded775d91e3d1cd687becc2bb3a76f6e89811329e22c29b5e679d05ca74b209faea4fd24681c378f1eb2c07f55a42be667d466ee6c9da2ee90628e52f0b4807424ae818d84ed8be2d987104b3215c4470375a4dfc909752a114d69b029315442bb82ef21826352b6b7e7d5fb42ef3c8e9d6596bef2667dac23c7dbf8a6c932d53afa1a3d92ff8c83c68de3474e230b227090852be4377484cf001b983d56a5b70345ee9a0cdbd18862ca2dad59c98006b18d131e98b718db3ab8071d602ce4a2ce076cbb3debd3123a745fe75001672cd49905620e5298eeb237b239bc16dc7f13ac433994dbdf49b8e2b0588f2a3e1e9cf98450ed62788eab672ef29726d6627a4255878684eb19dd70a6f3d01edd45b66f4f1d0db24c9df1096249360efa3518c3c98d0a845a8bd48a92f22d47f1a32062ee988d71cd338bcd53fd0ee79dc19c941d57960f5ae0e64112191e3a95f0c2f24295c76ad0c7a8bed81f898503a6aa1c6eaa364ddd9cc4a079a7643103959669814f39903002c727f17b0150a4c935ffd5e49cdef4dadf3e0bdb1a1bfb04a4194cfa381f589a87f67ac20245b5721edcb58f5fbdcbd0a5f162fe21ef68b0dfebf90c26c36d9889024485ee7015c9b208088723ef500d3c8892ceed4a9aa333826ac360181981d02104d9183b70082ec76967eca4210ba4956a10573cff055debae85525d2c9dbdf83b033050d89aa751e8868ac0a07f7d61a92d17b6d7bc520ab3596d3e2589a1b8127ec3fa1c6415975ae032d44650768f4a93895d675b4adcd9aa43ac0eac7051608ba40a53205173e381e4dfb558fbf8553213ec47f1ae639af9562d6b552221f7b1f1b5ffb8c0a50a608b0a435a2d7c012ea458112885b619782c7d2bc6a5353740fd36cfdfd3469d78e4fe1e30ba2e43510288d2e8d225696761895180866f4815a6bc62129b036678a39cef5565931e42b6b2a4a04eb6af6461a37a0a5293ac59eeb92c6d20a249bd47b0349767225116955d3a705ecce06035f205326ca12672d4d3dd569e524683ed3b61ac11058ebfe350250987e76ca95e839c63bb0942773521079ea0b6ad1f34b30b8f425c3d05c02c55c9948fd3bdad8941b3a062042ff5413382eed7c6f06bd0db9746460fdbfb824c0bcd28b29d28666e681ede81005180947acb02b4266bc7a2ee4f726c80c2fc7cf222b73618cae2ea3569407c455cc8a3341d076e12527c5ecc31f08533241851c21f06420d78cf2521c7ef984b84cea17e092494fb08193db89b329312898f23be68dbb845a1a35d817d669fec914dcf0d535d3dc74d7bb90d7c1812ec1e24634880543e6440fccfa8ebc439379e09f53175548d6bb700b07ec4cbed5ee21e0d3a4ed8e6ae805d2028ca18e745d6f1388c4398a9cdec292255cdb734b46ab4f35d4a49c9400363d0d1bf3f22b866f9f47a5f4873485d9fd3a0f39b1566401e771059ae1b79e50eacc6b6ca5324a5235133a9569b6f58d7e53af4f6e9bfb4bb88433893d3f06c59fccf7aa397972ce3d5b2375b474d5cf84433968db0af0da4a3bc19feb4d011989f7ecdb571d73aea6f49226593f4c1e777df1427f0e3e422e107994f05a982ada3586a35856b9c89b54b951935418467e76136de736b9cdd963fc3af99809491c16ae8a608526016685f5ba7355323ad4079b4c4e319f907a6fdf583390638a0ebb862ee8efb566052c6ae7b4d6bb37993917d46ccb82dfcf90f3bd71812aade02092c3ab41f2ae099e12c0a9f1744de40c5766831a0bd2cb811825c5d4ac12d380fe08858f082c921f3f3ebc95cc6e811674639817336a1a500b52549cfbd05f91a9caffd004d51cb931012b4dc03ed210b24f46b46cce85a4469661ca672f81957e01d3a548921efd21e0262b770bdab2fe13e002f38804df540416382cf2494eeaf008d9024f4056c12ee89829c0f51578ad892f3101c5a161fdfb6f88a28f3c956b3fbb0d33f0b4b72d04584419f03d2538ab3430978c435236f4b9269e013f34d0ccee8b7ad0e5bf7416068510ffbeb67f7deb4bd0e96982404199e277903621e255bdde53dc4a158cad7705b2597552537c03bdc0b14e102a37f100d33434bfa7ce3ba33b554ff1dea6e653306a84d25a31b58216d12cc19fbd9cb2ffa9ce46268775e08a4822c02d368f8990d96e52528e98b6b95daa81c373b19f0d7d80b843558895b496cbf6498cead120985c473b5f22613166930b8040cd41b1ad8848894c38de8b967431012226740b7a74d074c2df15bb49f4d8683a62c8e59e1c46b650569666687c6bbe7b02c1158e33b2ba1e9667e26e38678476d075f48d21dd85c1996d4adb36c01286d6edf720a41631287ea94fe73e821f939eb827001c57182eac5bae48fda6e1c3b2e5cad46f0c3f2c5baf48fdc6f061ddf28ad46f0c1f96a1455221782580a0c971e4d62aab7f23f8586ea9a2da1b838be5d62aaabd19bc586fa9a2fa9bc1c5fa962a0735c966a93e55ed6fad9973df1e0580320d805a4e9aa8b928e8513a21499878171c0708b5efe3c03d96810721e43677c06032c5e798b36f9acd5364d2bac1b7f946287373cadfebd3d1e03547e9b665c0353b6d97523f93c775946ad6be7a018ced59aea7fc9d49c94ff435f1820f9a2374358e8c595a021659d7b0a5b2de108331f8021e0013e29fb8fc7de09e71eb066f24c6c3bbf99f6c87d02a4591e34a0151b6737b0f0147675a3980b749b10ddc3a758949b430d8c75acd2dca81eee54b99f539ce90f23582d01824ea2c6a74cf5ce4f1facc21858a9f69df3ba03bcc171c3bd5499aa87a959eaa2f34af36786e8549e70405dbf460e1d8646b9f28a9773d4cac1f439d262ff4b24b9f2ac08e8d41391b4e26aad1ef50a76134665650ecef971c4e09e3d963a2b6baca0a3f36ee9d336ea89206cbe5eac19225b6dd0a0da04a8e3a16e307a209845bd41656d8dced01be401a03f38c70cfb3c205a094e8864d1748517981d77e87ad5642cf948140a5f3e1327ead1a1f62b1c49ca65e4623f1c3577c0d730985d4ff411535f0ac3056c188747d4d8ed94ea4eda8ef867d71398844244a738efce02437318f0a7b40f21b382f7aceeb0baae088b246815e05b7ecf8f928a5252dc69895962e1da5b6239222bfef8d4318a1875a007babc80ec21309c88bc2516a7a999dd2876b34c1d56c94d572ace176b6dcd6c9db8124029f96549c8b4acd99adb32287fd23e7eb650ce6d57a37998bd12517e9eef7ebce42e2e02a8cff7a19ed2cfe79bb6b756295ce0e36dbd6308826ff11d6d9544cfbe88691ce0a31c8679cb48d791130bc8bec09bfafceb4dc7b8ac4628dfabcf6df70702d4c9e23f004c7fd51e7151083566d109a997162c532a76523144ff59cbd73fc580e638c20339a56a9b7736fd21ba2907f1d202cd1325889e3a01a75ead99a7644238562943fd388d5ccaf65acbc01fa0715385c30ced19a0ee8fcdc0d0ecfdedf7fbf0442d0d30a67c10c06025e6078b57fbab9fd3377be042fb5ffdb5ef96b319db78be31f8003f8cc59baee2ad59ba4257c93bfe106269c3b55807d697e6f0c14505b3185c2b6ddd6e4de522699647c036b035a03a54b4983547a24be0f9d8b11654a4f8325b7d2039bc8c431ca938c0b4026191780bc88c4999202961f56305ca2a7e74bd9f3a5a8f460d4278ccb18226896a028959e892a4f4c50d5f385863dae61414a5890a2f2c39ea2d23b417d9e20d10648f9a16f69e2a54899d2ebf1374bd65cc1f0873d20bcf658e839c034b35d4f33db7be6fc292a3bb0ab165aa262bb959e4b05c9522b2715000d7fbbc2be0f9d0a992656250d7bbe94de892baad243f17de82afc282abd14df87b66a4eadf4348d618729a4d047b0860a59a57c51fc3ec46c6eb792863d524a4fc5f7210f476315a58c7d1ff29851448411c3031624a6420cb50a152a54a85831499d1f13c491a2d27950ea9930e7ef4e4f223a537ad9eb9f8d6f8fd0f16b75a4a3dbbfd5cfaeb883ca5e77a20580ecbfd102744a54f7bf6e1737d0e32ffdf7fe84519e4d593e9b6a9f33224a9f602ac2e8f86e35656f655522097e59c088fd7a043af3168f53697173ab48455a765ad5234c314b46bad49dee28eb0573c69cfd049ab3173f988d2c52c8d541cfd5bdd4bd87535713a3410627457adf194313d1a8a42a51492b809083d3dd07b9f63c5e011b7932e04c44f50daa49aa8582f84822f92e9d40a0b0c3153842fc60c10b3ac290c901c91ca9296f4aaa39262a5dee74da6b7f8cfdaf3111fba34c9065ff87808ea19b16434169afd8545faa310a336caa33934da39610d1ef45da1fd4389909c2c508a9c8926cc88d8c112252bcc82940920a92b6744894541969299d604b026707241d95a327514854dba390a4b6eb178cacd7dd656ed8e430c315353d3c95288018313204934d0b90d2b5c615b3f13ccfdd9bd3e7f4393d749f7fdddd33b0811d74c6c2f34ae654b84e33d4cbdccaa0d954dbaa3229c660aa365e7deab488fd3e606b4743ef9ed2a736d3d15a6bc92998b26cd55dd7759d4875cbdeeeee9e986bdb89554399d954cf4b7586b58069975e2f0afe40922727625566937b6a21a2b6e993162294b6de538b15904de7d77279b023d27cef681d9d6abb0dd07bafab13adbe2e0f3c219dab0607d31c475977c70e0e6947adcf3e6d0f34c22d91c8dc55a439ad5e96eeacb62e0fbccd126f7835ab722ec481aca57ac7bb13ae5c71aae274c5870f5a4581a066281055b40a043e9e9e9e9e7ca041f367be8a96f933681ecda3a94835493d528f6a927a54912a92d150098690864a30b4646849edbaa0200090130033c8f6a0743d20469f19b77368f907769d7de4a23972e2c07903bac1aec10f3c22bb7b1378855dc3dcd3c04eb8a739d186cd1a354614410468855978d5a55a8043c8dcdd96460834419c7941d5061fe8826e4c2ce89b427e30e3430f3c9421d3821dc6e890030bc4e0b082302a50a306cc0d36507d49410d5eba4c7191a2216a862d323850c7ba2def63753cec9eadd0cbcf9b258d82b1af5b17b2b1a8c5f6acf3a8f1df8b71ce9a629c812975cb71308b4d442525454a09dd9055ff7b31ce79b4e1ed3c7fae117ff3566c1df3e75ecda21d2a284bdb969861bac5c4ba4141dc101d6950cc99289af071ce17df357a63d7ecf58b9abe0ec9dca0903bc5be3fb3f9a59ff25061df6750b458ad3b7f3a3dbb8edcfec209989e26f6d4168f2f73ea4832d5931b8cb2300c79c23083998e59668ab924167aa21b3febf42c6f783b5bd66aab8ebf576ba411e9d606bba6391255095e547175fd765ee0672d91c889e8f886a8c33987306f6f020f5e8231a519bf70ddc12fa32f24b46fd0f8b6dc1b8be1188ec5c864ed3e33cc91e0ca699f1de3c2202a73916442de1b343a9833fe8531496632936455e2d1c69fdf43686aa29fe28879785e7336c2e6a8eb1c1a72eda1d69b1bc8bd75386554574dc3dcbd16e39a73091f45540b4bdfc954c28d24c9e7a68360d3368832675ea54a76ca647a2369599ac258a11095053109f2ce9bfeebabe68eebb849a33c4a6bad9cb56efff35c7aea6fcef874340f067aeaa9c920a121a29fed74607be2e582fda7c583b2b648eb8141985f469d789c30177610c2cb80f68b198e8ed3472b1cea9886e4f6dce5e217a333587e31b908483006f006a200840261009fc02c2016f005f00a680574029bc02a20134805b4815f897d7f965f4e600dbb9e608f063d247e8a4578b06f822e60d7600b200bd835b842f88127c0fe8153b06b504aec03a3acf81d2e2cbc161fb834d6496e5005100af8c4e7039dfc7c6013181fc804e803953e30054c02c1f8f179e14236b660b1a245922c224738b8d2110e4d74f8f725235d72da0bc0612af3de75a5f88827b6a075abb475dbf2f2e60fd5a218ec8dc0cd983078548ab852f6283fec5142c922a6f45e8a9251e9d5285347a567db54951ec784040985c28354e9dd2a636c51bc4a925be9b548a82a3deffbd04ff04294d2fb60902a5d42928e4a001839a2c87d70b2e442e9e1ef435f82e1a685872d47250d7b7cf0274645be4218a963baeb2e856bb5ddca6a75b5cb4237905cc7b53c77772c36ef8d641a83c5e53bc9711c12129ad40487b1a710f99bfc9f20120c7eed38e66d7f7d19cd42e4a5315ceca93ffcb317e62e8d0144b5c4c31b37475cb561b3468d1145106135441a21d00471e6056bd654b900881fccf8d0030f65c8b46087313ae4c002310ec4dd4ecfcb75ffac6d3d56e8e5a8f597df517aabf55f032e64e34fd53559bc2a96989f527f459823d533860e3acee0627a4a8f7001ffa90b88306360608e54ff5ffdd46ad9ae0d9055d6ae1d60edbf53563506aca6535629f99c08a68d739cb5cfea5862d59c8bb396b3568ce991845a6dcd72c45aa333e860abad36ec1fa6dcbd0a540daa66c58a950c558bc1725dd9792deb1afb030ecfffd37a02a55ce5b87fa81a1c1ca66a18ce91e953706ac8726ab55aad96f393f6c88f5471bab5d5efeb7f92fa3055f3cea16a35f70a558bc1d32ecca37774bed694c76269f7cbeac163055bd9d129f1c365c5a3b50d540daa0655cb2bc861befa905b0560f20dd9864c95bfe414e41ab297dc254f652e592ad390a3f20cee6e256f71b772b7ca3260d75a62b8a1000a86a7f7a99cc5dd6b194b7e215fc956b2536eca5532d31d5264b3d96c365bcd56ae3362b14721dfa473ae15b1d55c688185154e30454a9425153294fc243bc94d3293ac9453c8495757d9047949462197202bc948f9849c2423c947b209d9482e928f3209f208b208eec889f8bb8f5f160a414564c7929bc987dc3dde9d05fa62fb9cf1ff94be8d272e642357adb5954d104e3629354714b55afaea9d6a395667613a465fb8e55384aefa73e1701de0ead6b52cd8155d99c351f5d59cb5b171ac3e58cb555be44fdd5a6d5333c6dd39cbd91bc6fd9f04c577ed7d611badfd4ac2ae692ff2088b0d8bada9a929d7aabbbbbb13691769429b922325dab1e36554b7a68873feababdbd54d894d45214e114fe56860b16ae52e8b6369ebaac1b2d171586c311cc3b138426aad95ab4ed5f6159399cc649c2d74b4d3d659bd7e95fa3845369bcd66b391d635f5993f43e6bb96f0ef2abead4f22b9b4724e3692eaeb5cfd4edb7af0fe2b27c571fa761d8705dfa67ba58f7fd6b53cbdc10c9ab38fa5e3679f483474b3d1da44af24afa9d574e774f3d5646569d58162b13916dbc462cb43b0eb2c04bb9e41b0eb69944bc824e41064201904013486d553df965e32d2a57727d35df2f48b89d34e6e4e84e5a5967e31652a73ed33328dafc4595cadd7daee59d65aafab5673e4b6228c8eb4abb572b56a2b92fbea98e65a36dbe8131b7d62246eb16ca3605e59627b56b7d652a626518cb8c141c99a33417628c14b0a6188c4f9c104272754351598961449ca228608871f4254b1d0420d44ca3f334403ae0927b1a93b7b4625b960ff9e5149666a13cf9bdec7d2b496a679f7f3cfc5aaa3f37d9f667d9ea75b1e77afeeee24fa1f61dcaebd9056dfe9e70f049d5ecb0d0f9871db2f5102763d432b6ca7d3afd68aaf2beeba6fb6bc39da3575f0eb8a3306f7c3af4ecf676d0c54fd24be566afd5656cb65757e87a6b0fa9b55830ad2ec266028421aab2b288baf86b46afd690068005c09f64983a8003cc617ce3e2a2463860fa0c53734ca5a74594380efbab92f7c7c7c7c7c5e8c2d5810d9ffb79af67657ca596b8148922449a0162c56601aadeadfb6e4403f8d8f070c072e1be3a641c3556dd830c0d73ac20042d6be8c97f1325ec6cb78a17fe1423680ff393487e6d01c9a4373005336b6b818c797800428c0755540a704bb07475c0e68d0a0418306073f3e2f32496d7c390c70e3c6b7800320208611f0e170d5981a4707ad39d813f081a0000f7c62d819905b73aa7f5073d41c3547cd5173d40faacf0b179a36e0dbe9e2006bed03e69c5f3fda6bcb715ca5fbc319c25743cf015fad303a250ff82400810800c126f0ed74b1ff9e04beaed32cd1866fd14888923f56fd46b9ecb43781ef862cdd85f78d70d9690970e0f792073a7d43a35b761a860b845a54f4d3691f1708f3562940810a54c013a1d62ac2bf0833a6649973ce79bfff77a421e11096865042c8b8a7f6ffffffa756cfd774bf486bc0b62778611a202f13066dce39a7f6f9ffff17d6057725ebbe7a85c7fad516ad1a534f2f970d66f16685179b33e3f16a15aeef9585837553d499c4e3db301ca26afcbd9cdc143c2832c0e0c42b03d8ff6bce394998b8afa71273823567704e132534e831e1aa31f5fc9f334c73753338f1b5e48c3a9318a440c1a353e8da9283c5f0ab3e31ac23ea969cff7f8e1b77ea2bcb2bcbebc985abc6d4f3ffdfc6f6b42fbe9f73ce9971ad3edf2b4a2d0104fbebe9318c1f0a04c349201924e8e09e829aad967b2e0bd940daeaee0e55b3da92e0e4e42484f4b5a9691ca994900cf6e3ba9202a8248e9a6cea481200028200a316000018100686c301914810c88126d90e14000f5474367c6a3c14876381408aa32008c22006a210066210440c324621871cab644000ec9b3a2e38572b74294ac1ec4dfea44eb0cf952a2ecb5b9c26877c16fa251ea157fb83f55e05f5ed2609284671d3fb137c4763147d9b7082d4130747ed08463901c89920098cf6c1e54346e1750cc5b48b640c74ffe195a9657044dc20eefd74404fb9e58f8323b54ef348a4419dca90dd2167f7ba66866cc9a478e8df817c4f4064d3a89b11435f5be083d7528769807e6586ac07295bdf292ddf40a607c74ddab3a773866c6dda9029a25d19e9818efb653df80bfb8d7f055b31fa36ee47b7f679381e316f7c6be759baa83039079681b53c03c7700ab541ff66b62b2fc63e4219295b6067bf5a945f5380c8fd44169e5790ea8dcf69bb9a8ee5d0c804d887480042f141b53fa92fd9e2f24a46b1d2326b8a3ad806a50f8aa7a58ac0e319c350cb001a53e8ce218ddf17ec91550aa011d03f20c5a0e3b81e111d777d76143dd62d68df7ad10489bac7249f50f41e482a5c0469e2cc439d8cd2fda24deaf5f023484c923aa5ea6e39da948ef4e944340cbacb4a36dcf44552808ee9279ccd47969a6b4e55a924f2c7ef1bb396b63c2a1e72c41f9a3e4a8346715b5f35a3abf51d4190355d48e7937bf38bca0e8df50bfc764fb9600e8131be07ccd8ada330b6c2cbe0cbeee5e039baac20468bc5c4bcfd7961b207c46551fb3b59cbb29ff0f549aed6fd318252c1c98a25d939ea415497eb173d517af11c5144a70a3941ac4cd0adae0c4b477f0d20fbed3255ee1cedea972483d978359eb2fd011623b97c36fe6125ea9246a1b9fb75cc33afbd838f31497dc7670fb85463267b98054698e93257b7437733c477b52dc4c0494cc2f6b0dd8c39d9e66ff6ec5fde324514b4237aa11a25597e79d411ce2354f69ba68e0d3beaab0488c642453c95b7a94b40e8c8a080bceae3219471b0082d75fd12a2ac8d617a4c1d9b5329ad81cdd590d94859ad0dc77afbd43259c149c2d227d1334bacf35c107e3a0e0fea18baabf8d034a70e841fd0e0848c2e9bb01a65e78e27a7f14af2de864a5fc00372bc823117f9a1f79e79adf95241d020ff49d8b0a89fd2cb80eb9cbe54541b82f6a9eb9a969293bdd455880a9db60d7cd8a412427259d08bfd4aace0701ab514c1b39a6786b2f9d043ed21002ffaa2a1da1e11d7d1235fb37a9014c8525f9228933d0a15707e244525fc0e3c7df43ac55c27384a58f8d22cd9242e101cf5efd42df136121040382a19657951d74cb1f55e67df73c093fd12119412cdfa748918783766631359bef45c2714f748ca1fb80c5cc6bccc8a992ee5389bbae9bafa3de80627221ace57657cd63050385a965e7db839dee3a3f91f8a6828dede6e9398974e8d05dab1568127334b0938d8f6c95e5014bdc42626592fe5164be42bd4cd2ac1543e8a1af6be14cab97a8d56c0483f3631a8e712efd2c757341877aa1b168e9dc58fbabe0df838dd59fc45fb596f21be5db1f9d19a8d8bd3e897c6fba60a60c36007f505037a1d1803c60c6f7c63eb858f748a10d8fc55969dcc1441e3a704621c601c6b6b7c3718c5785b2f0a7bc297a4a9489bd988d4e36b15bb1281a8e198fcafab71751a327093d57e6e01d372708da9300704f345f266c481a683a8fcc7695422013ec962d41f098df1a2b7a29bcc4bcdc19814be5ceb7852d2cdb9cceb313eda39d7beeb328cd9954446cd925dcf0495431d7b63c2e7bac2b1ca5985057ebc70a0b171fb32c0f87e9a30924e01b2d371d94b1e3f4be327ffc5e0e185065497b1717911bcb960dab81731387ffc64b9d5cf2338901b443a2f63406fb9be16fceee5a5406d5586ea899cf3e0f974b6b24ec9891c38b40e551b202f261135ff3010b588d842ed00288666ca9ce3d6d4d601f3a4c19931e038366b91ed1e8bf4980df118cdc973f3691f616431b6eea6e6436694cbb46fae0e4409b6c70811618c6ab6cd4da5855c1c4fa87f1a675bfede90a821545f20c120e4894c2d09cac7ce0b46367a6b54697aca49950ed183e66465e7543183f1d29c2e139d532c70b96220614da62e7982da437b2e510d5d1698b4e81f3384ca9dd4e2514841efc00cee601eeceb91d9deb0fc53514c61ff13648d3f7811ff6d9a0629fff99f4f1ef8e64243b7ced326fc8c53f50dee28cf50697fee6e6db11898750df1b2ecafc72df3f05011a453df13117e8d818ce4e713a7a6b130e01b3d0488b7f199da8df884d1c2d9e891193af9102f6f21cf7048aed1f4127482b5e0481501ead1585e38a0a31b924572dbb911ce3ecaf426c4ce6e585a438838c3aec3bda4715cc7b3817796c0e61eaca5791352df9f600b1b9c240d8a460401916b2ee23679fa34582032e09c6597919ec16fad72d77b753e90a8b9389b7f33a211b7bfb3f39734fb1009efc31dbe4d08a255c3449c412608ed60139710ecd66b32cb8fcb46ac8107181b13c9cd63f6cbda47cb3e25816921fad2f00cc0f451695a46411ee3af178b3a9e9b0a379fb45e4a9b6832e3400046a79b8b275ba61e8c642b60f835f88d84148d539ecdd34a828ee04d4016a388ca72a6f4e144b9fe207611663952ec32e45b6b3920103a8184b1d6eeacb52915cb83ab5c842d5be760fc3f54bc9cd3443d51e2506ae15c72abed8fa75d377a5cc6cfbcd25aaa04fc6ee17276d02cbd65ea9f629848de86e69246636bfcbd331111b60780d307dd4358941f3e2121cb43b1360c09c02ee595f8aa2706905708cebdb56a28949ce7e0337fdd33fabc8eb41246105e34b924dca3ce4faf8cfdfb962490b2200c51ecaec7e0974be6b1f33cc92d565680f241d4bc0ef5762a01b677780a9e56b30223e19ff77100e27ad650a8a0ca50ab568daca816659bcda120455cad2c3e199da5c4b378017fa62bb545557797163350b53262366258b773cceab41b0b78a51da9cbc74b5e80f2da97a1b9e91497c259be6c86c70ce0ef541d71857440f095b3a8f9863739a59ef7786fdc54cda15ac3421c8e001b1fad99be1f079535cdc3347317b6fb7f2afcbc910ae0a137b7552e96a10f1257a7e591ac7bac6d81576bb807baf65e9e3006ae2cc33ad2e50b9eb9e3298a0c8ca75204c3eedbc4d25e9b5a6887753f63ee82a78963abdddd3400b14a639692ecf8a2aa69369811ce36e5c741bb8f2edb43ad907553feda95672b15221dfc94ea320f0db4320a03af5134e2f60be419b6251aaccb425ecd3bb2be681a5208827c55b4b2e915c2ba20861a5000e9b4567070cd2b890da8d0344f86ade9c692032b9706f6666b860bace937102ed3f5e0581eb90dc0aee245af0385943ef3c3ceb5bdcd5b3d50cb2814e15765587e7b1f42240feb64a22cdcadfbfb78fef9cd6b508649c00ffece3250586f8f0d66300cb1203f89d45cb20b3208f705bbc889dd1ae98bb978123d4fb85013f24567993f10ca19b55d2bf2232557d5e6a99b6f09372295a534839685972e0b065f0c593830ea1b6bb18051504dd26ec9f55acb184306976f8fc479360d27fea39034170e6e48632a07f99b0ccd29ca612eba6d31de307a53b1248b0947477d342ead8f3ec58a61daae8d24ac2dd34617aeb815075ccde96b492840882bee5a573772710f40d3df1a7ce24fea7672a2a733543db28e9a68c615db8c8fe94af467a65a939bd23f85ff1df4b762bc0f65a3a9273622176ba33e67166064eace150d377d067baeaf6b28b0510d9710ebb3e3f83a18cd65761e3cf209b3a7ab0e628e59163d5a42c05c762555026f3d71aec8221a6c576445f59bc22e0e4ae7b7760ddf134ea857e6254d3d4b85bafa9034acd85bc6db78b8b47704c0916638a84846f1878d957eb942712b8947c48811352ae8839da068c312048c0c0e470938ca9060838d954ca2ae0d1697140c20552a8a6bda9ec41678ab5ea1e27239ab60e5b26344e2cab9341a262e633470ad0cae42d7f1f3942aee3206d5ef57807efd33540570708016399bbbdea43305ac9fce482bc104b165f08deccbd4548c3bb453bb3042beec9d8ec14f83f952b0fccfa6bf5afcc909bf6d6fd0d9b3b366dfc4659f6915fbfa787a8be071a78da7d06cbfb66b3b494a6ab692d780c63b6661f9a1a3d72e4594c3857fbb8422a6ab81b94ff4dd37e846e978803c9ea89e82e957e9ed07fabc18a457e23e7adb98a36df06309835b235cb1c419b93fd01c6e5ffd266d78148b43ba12d5c91c4a3bdd60d2999d96494b816780ffe3a3a42981cf5267410537b79bdcd03b098c3a13f85374324500a712b92197778be4a4157e6abda1e6287f62288dfaddddb47a0909986a2c31943f21506ead9c2aa07e2a1ffc18b500bede2998e128d90d01847e19a0c81aab1ad64a9bddc14d53dd85f751f727f0118ceb068a5f2e8cf3de2cf52d74365974a8c3fabf00bf6f8a3fbbac5c6c3ec9b72ecd9bc68d86262dfb4dc9a23bc92317778bd1220e26154998cdf527d8e8344f733788589a480b3e84f7e90373490f11a0ee6c52b5c4d89d86d5bf621d7b1b55f5b472e82512a2244a04e94377bcec418d9cf698d49be93e49d001de465d7910f7c11e84cc46fe1b2741b1eb5424ee27d4b0d3946bb733759c663455852681ecddd3a225e6fa4e047dd8d21e706d40354f856e1641e13ca96087228477ad1106bfe70682d9299e7dabc8967ea55de6357366dc3e204301d7a12d87ddc489f05ae43b7d2a7a92a7ca1004e4043144b7a07661dc9020e5e60d5b81020215ccaba8ba9675d1aeb3ae62975a4594f6b21de462b9d8c881d6eec1e2ace7663633c409a8777e300bf2661823f8d1dabff2b075675e89855512b98e04d6c7921ad09816d02baa185070698a9aeb74e78b425da0916aa8a07a969bf0291f0360a51cda9b881beda1e65eb4bfb8bd2ac7fb9394937905d707b1c38525c894067a72d7998f2c4f0336eaef7d1a4c4eb5d27da294706747dc37732e2877b41c2da6b42fde294e2dc863155ca49ff6d23238c41ea7bf60b4e66f1a4f48b93a1b376f5eeddaeb3f154f0c629616fd568827c8cc10bc8454c359965a52112ba4c7dcb01c7f9f1447332be547719f0afc13c00038cf40afd5afce719ee5b96db5f8237996aa4bb680954b551f8a23f298196e42700e4ea5ea03bb60e643a46b85e91120105cad8f70c9093fe1cc5b3d401b117b74936ea9f26cbaa3e35b319ce33e5cd4427b7507c8f2204b092af5a776f804b6d27458fadd8253ed758b639ba2797238854bb1f634e8920cca8ed45516e52792478fc7ddf0140ad8dc4bb77557a030255b0ccdb37edaa9ac1fc63527eaf94ed5531efc031136529a700eddfca7c75dbca686b4129ed25d59ceecb9cfdb459bac9b7f20e66a28858a811acf9cc276934bff43a612daf9c9c5e12565a497d0813846bea9b387ce44f643a109258037b1b78282120f4a22d27271f97b3510b63e56cfa04a66fdc038ce319a9fdd1c3ddd2bfc3a3e5f6ff007b62393a4af8cf4d7ad1c42b8d4c84af5ea02efe690dfb9c39502bdb8d479add27e821670d67d7ed5aa82fad7348f3abd692af2b726d24baaa40f375477aa67b1d42d00c42a4ffe302a7942762eceae46f88a384563ce514891ce44ee02d24cf5757acab9882d8f030b4d7373eed9e7006a2c8d9ebb988e8cae81e68d3951642ab608381b5921c722a6b61fb1d82f2732433eb0c6abdeefc49d2835ab6e3c6cf9ef043100cc350f263fd582059ab1196681e7950b73687cce4a99e0580c3c0b42b99eb6ade253f658251834e52395bcc4253166850aee672fc6fb94fa55b5ffaf3a963e72e2af75c6bb5ce64d5cf277a929523a3f1dbf3a55bbd4d4e87cbf30cdfbc5aaabf12f7d04709f7dad6fe8a1585f75767f1c75eedfdcec91f0d0fb70d9a737495c7f24d7390d458e46d79dfaf89c9b3f14fd3bd9841646f0e41a60723824f7133712d97f4b2cda0f749b789018f70d93b86f14358b74b4adeac6dc116d999ecb4fe3239d435d3084c043e1c8d3ad35fd0f523d27d085281c75f75cef97983d836b2198dee3b3a94714ea5e208630751041dc98844421de3904fb81b439e3912c77cba7280d5cdda9b6bf3db8f0bfa16ef02ce9eb4d3fb74ee1b1c6ca99546c4f6330a10c86981b151f959b932f90bc212029300a716ce6b73936f1e17cea71964968da8f43545c8a0ea27e27dd2f9f7dae174e098531440b1b1a96f609f6102907317be37308348b2df297d7d6ee2086c9f56566eb1be429b4f4ec083b290ddb3329bb7ce9be25914a512da9a0bee66a283d574c4922e99b29b69ad1f836164560f163160083cdc3d3b118c92a9603872b46638cd5db7d3f96e7c227749e84b3a64a1502f57f11dd676f5a5c4bd4fd36b73f180ec240beb5f10634a8e87f3fb81211caf5158c32b687e98960810bc1a687fc8ed855243b6da22299b05cc7750659f56707c6510f7c496e267eec82cc6f63b0f2e028d61a563f84c238b4ed0f6c70dca0631992c52f48d16e84c7431124233392f275714b057ea0743ce610b660846e90a3bc00105fb3dbace5683f946bce67172bf1aef1d809d606862f44a399e9d32aad05f70ea5ea251188b15dbf3268322bf7fe26a90118623cd6a8ee6b153d2b918d1bfc1d7de7c0996f174193489ed0e8e228382db194e33b816cac1984a5324c2efcc8d4c1763d967346683be8c4532e5ad19a61583ba61f09530e88c34875d998cdcd6332b5fd1666c7897002467d56d882410ff30d3e24bd738ffdc3920b0811e3103c81d27d4b9618ba0696e516ce258cbc138dccc7e372f98f5187253ca06476a19a8d39bbf8e0e80290d7604af7e5b1a143620337ada9dc312e0f1f140cc9e13d1ce86aca982a9e01b7631c6db17a2c5f5bf0221c0b5bfba60a422f620d5dd23212a0865b07c7ea16d1277b78083e92ae25c6a0522702c3ecdf689835082e259476bd2faefc8e8d97f287c676c364b046a59fa291bdaf00f0ca28d538b931132179c68b3f674584951bf49ec41d37f4a8eebfc821226c0ca30cd979cb67da8cc4dbfe23e7e4ae32ab778f4a7e37a037f4fccab871d28385b128748413f490c653e9b172d956d72bae63111f47e70f1555da59ab8220c33a56041447bfa531f4476da14a514d236d32d45a305ce495565595cb952823f3e2514c9084f09101b3942500d49bd46fdf503386cd8df59e7a1827cb9f2388a0deb99789f7b382248dc069234c15a3b4688724484618e7c67a2ee53ed4d862a126ee00a92d3018532a22e96925dc4a6351eec6b01a24b6a67198952775113309712ffa64c7e310704bc072eedb1d8f3a28163f57900b86a48f9607511bfe5a9c602080df169b984a40f06c074a7fa10a27bc307e44969b468c77d111fce162f32d7d9c4212a977313a6b07c13c8ea7c20b75340e965c8701f780cd0a0400a99942c538138bbbe66423b364c038153ec9074cb117fbb02b477cae648e2396a28bd40984d6b50718ffb4a70e378e0616bb463f373b3034064b70e35e8364762c27a6ab7daeff34d30788195df50ea42f1ca9154b728d13e99b81e7a0e8490d24a4009d791e15803e417c4f62264cdfdc9fd491e4d03e67c0c331ff8e22c321a60d7bab3c1a676bab70b78dd4a3059695aa60b1ac918722247e4d3d8efb86c734f8485b80bd0df508d0e68df24874bd14ef7da3ea1d0f75dbaa23cff50f30d1d2fcdf895303ffc9a1b29cbf2667b2f61fd2028539d24eb8b3c3c166f4245954d2eef0e2a848e2497c66770056b46b3bc227b3cb6423a1d7cace3e6c05969420c3718629fe864cdfd99f6e97399315e8b5c1ed16c3e398264e60cb5ced783c86f411bc3be8b55223f450d8e9c481b2101709670419eea9687aac62fbfa3d46885e5c31f53996d0a73a0004865169249630223a27d486c2d7c6ae28cf82132467584f98f8adc8ecdf8f205642a8190d3dc3af2fb1a176beafd4731abacf9644e0f8bee9db7a308b15f1a267ebacd7ff6105e311d50e548dca5b0cbc310c816d2bbcc8fb018b4e9b11d3aeca9df938570b21e0ad1526838e0a849bb3a436ec19db40e7b687d8ffdb5835a53103e2883ececfb4ad576e7b1ca740266255706c3da0e45679c13b3dbbdd744b2aa44b46d77712d6ca39b161d71c956fbc4a5e83af164d47fa861c53f8f918e3b09bbbbcf167d2eacec40a7166f817738db9947dda6fb8c07c8b19bd30506fcbb318c060a7bf2bfbe59b4052bd90dc6445ba06a66e3d71bc97f788d83a999576ec58cb171e9c25d50c68063ad697fabaf1189555592b61f06ea9d54b0c0ff872d04163a8db8982cc99b4ae52938e6834ac50fb8df03090d8cbe24c3c0feae98461665c0f724509aa479f6d5d9dff79af82da4ff9b9fcca5e5f9809dac7de2b0c7f87861172f7ac348c3d6eb25b027752c6355772876ce200bc8ef6f6dd1521142493cecb6e8d3d6ab145ee6dd96ac67499b76879375b4b574c7e094fcba0b44e65d80c491933e5485f5b646eb67a498d51a5b27c1f7537f16bc79951615057bf1978d9e6f6dba0d3717732d431f8577bfead04aa227111ad06ce2dbb069694738f232c69232af630c0f409a1bc46545085f533b2264b89ab77f640ab516d21172a42f7ed47ca9621b043a10f7412ebb29f5b688269b99c4978d8b760c36be7e6aec65559eab6a45d303c05718e556eea0a12c270902b997f84de98f5ddf14a733fb880ae5581071fcb8671b3137f4cabee7a14b737c6e0af6af8f5e69d094ed00ee08967d7b4b6708b4848732ea0b353765326e4059ea8730692132a5ef6cb5c563c42fc33eae8a95943ffbd4d73628f4817cc1277511f585a8d852da95e9d86278f6fc4e79da3728d85a0f79dfa2d1d1d23badc84d6492df5edc58ae623b0c7de6da6c134b05bfe7de8abc8412f09af5b27d59423327ed946f0d1e440162985a25e1901630357821dd64c79a5b100ebb94dfcd2a98e7f3a681fe5645b07dd64c6e779fdfe6fb1179fdfd0df50a44d74dad979fffc610101d1e689e1f3fe9658dd0800e487e4b97bb6df0093fe7577ab5cbc03857b599c0b2a7e74fddf1590c2f07aa301660e2eab4d19de5944d5ce4875efa37f2111def3cd61a4b925c14afc5ecd61617c945d787d25551dd26829f5df7bf1f651b7bf8884c49795ba24efd4c451317e2c6532fc62b71d61adc93731f670eac0a13173ec6c9ce5f8a4422f83bdbe5770720fce307f78491c4fdd8e239b06276614182854628d881f78e8a7dea9600d6b6d34c79802a9075a7164ad044a5b179e162becf99c4864fcec6958ecf425ea0604c29b4123cf71bb511ee7a30440386b87548f92a11cbd90a117e5cb3e88e8ae04d5a91bd1942948a600bd13f0406f75d4fa63567108274912dc352d5484cc2506388a8c5c583b21d90e2c1480e3baa0a96941ad6760ce9dd5e65c1946c51a66b4ef9f433d9f2ab9c9c317bad62466cb72c4ed337717316d6ae0b9d29c5125772bae1494c06d5a425e3b65f2e332d4149c545932f540e740a1d97c1845b4a4d590ff4650776c64b19b270f6b705d027b793c860cb9e35f7db09552dea2605ee97f141a05b26f9ed8c215ad4e7d4f215637073ca527fea98151d11aba4b8d8e4a90f6aaece777a31f55b440da1bdf80f7c44d2b9f8d886e05ba658fe2e3e69361fe0084e9454a844dc7a8d251f8f7baffbe4f1587c3b6803a0f40ddd8ff67bb6f5f20670c0eb716f8fe936ebb4561c35b253859c490ea0eb8909d68a6e6fb1cdec7a695d430c00a5219a7c7e5669b9a94b3d851cd3c3a67e489af5c6a81cc765e6b9a78b86757a6ec9cf618de1a6a1a14e565261adb5f201574b74ea61095b7d5799f651a63c46119ec7e2d1ecf202a1f57edc167fd5d0516482fc0ad830f270b588f4aa8ccfbb4846c49c01238354a5c136f6610374199d2e372adda3fc3d496337837afa72d9018fd3ccb5daff94819bbb22014f489f514aaf2e5e6d99cc2cd94b966f62d93f6861147bad09f7f56d81ab13f95d75f94c427f4eed833ee08b3e2c2e4de4283f4efa6c8cfbc9985dacb3d48b0c3b952e927ea85c1595f31e6811ca822ac637bd5daeeccc85bf566e808187780e68df1065d54e9dafa94f54718603b5d9d8b28136cb1b15d4aa6a472810a2cf0364429d476aa66bd094928b892e1e365ca4c0972eab1cd2b53dc396fb0f221548ab6cdd7086e8b12fbf8ea9d062aca7ad57e7a88d14dfc93b0487979c82f0296c10bebc1bea3d0eaaeb3ea32562b88571d462db794bd41cf23d9f847b98eb4eb689c0ef1cef747df3292306ef63e13182351203ece19fc3e1867b5a6342112ed14ceba5743775727465af449605ed43f9bca48282270a7b69e12ac6c55d2ff7ea2cd0340b1e00fb49b891f422610a59f721d0c2dde3972b3adac717c4cb1ac9f3c1594c7777261622cddb5135f0eb9bca77fd193ae7e2298d1df0a83e9f6299b6ae2c951846093927b608865300647062f0c2407c2153f209bdec24b6cbd92d8dc9d3972a6c707a266cfc5d4287d1310b369cab65b49148976062600260be2e8d9604c04dae2fc2013f6baa673f9af4b2bbb2db87756c5ae5fe32564bb46c6046ca985497d0536c812b1874b75c1c750de1473fec169a1188273eed4390299449326d4c015db77a6b3582705e8943a300d722fc4c1dad0f028a0d6e6301f371b59ac42769767e002fbd01ddcc482a2b0cf8a41b99c55792c45b1d7f921c960610de7624ae7bc69961f9597adad9e2e8cd496024f3b0a5bb9cf2568cf46c678acd777e08511f712ce45f30b16cb13fdf98eeb9da04def73ff8a26f160dc5b57c8fb1a472722c5d29e63bc0e4fafce86a80b35260fea6401e833719492a9b0b70d42066a1a342767ed04d7512988319477869e0054416c5a9ffcfcbaf56368591f9de7979d8f96873fd881d2fb751b2c80ec18ecc9195e525a232fd7dc58ce3943814151a79fb3e59f9fae06261338b68382d5bf576325f1a9c7cdea2c58159ee64d39caa114932487148c9727d13cb63ebdc9c676892752f7de129d4377602a4a70a21bd2c0943b38d58f182a0c45ada95dad612911d9e6b988fcd76f3c37177d6a9891a59b6b89cb514192650adc8f20cfd0e410e71bc462e70261b79235a580857086799505087a6da1003424d761f5e0fcdee02d314094bfda3b5a710eeca88de6d026e89e21ef59349476fde2ac779f841e2ac499ec9ba1588216e91207ca393e0d817b2ad992f96b7335857dc3120d0b789de575f9c994bc467d3b0ac410c5efb5ee01d579452dbda00064ef5637b931698af11e759fc7fdde3afec0f47879417154c9a86be1c52a3a2eb353da6f7879c698fac5f5d53ea74f959de1438c12b9b08a6564cd7543f4cd620b2cb8d21e08a460c33b420f9c62156c50372e85fd06ed06aff1ef1ad5df455bb0a1e6166ca695feadfe73c1fe7b5db0312b186c6e6570b041bdd076c9014e4fb326a70dc048f8469befb2dc42db00c2849e13c3068d6dee43c19511179294f10160736173173dd1c117141fd8b496105a4dcd535484743acddcd2ce2ba86ab6ba0b99617bf0605674d6219c7cad7325d0df6b4af0694e4d50228e9f51cdcc7ac55adc57a51df779bc5c140cffa299bf095cec2597fe1769c1d6a4922aa11d625c4cab2f7edd0eed7a573c8ef65f48fe3f9947ca13f312d53b9bf8e3975feb8cb5c8ae3f37ae0cdf4b43f23b532887963f5442e10fe7ff329ee038d7fde1fe02247c39e8d4aa25e0e6dea0d3d8045731a02e47d95f2fc7cdb536d24f13e26fbf0306f65441b60a8db4c73ea66853862b6429335b87fee46bd14f8f40865e027f6b84e7c1d246bbe6568533deb9ff754bca71ded2ef3d90545330286497c95894f4b005460a8f5b10fd4de4e32657b92a21548bd1910102519183a5b9c7e96d50a8da3eee6ea5619b38507a05a43083861555eb0d13fc94804967980bca006113dc497819b738dacb91a790f09a733c3131d49c8dd33581f811015ac17700b3d5363c81b92dd8680d775a37ff5079414cdc9693d5cd253513955d3afa13b104470566bdc50024e691435da03206f6a995b1cd9ed880da4867bbca609b79e8263db443ceb682dab175513e1ee356bdc7624a86911348e88e853936d9323eea1a1707900fbebc463a98a6e472b7202eacab73f2db12ba1d9cf00eb717f1e408a36d723da6a5e66d3cd320a2302511426a77fabca7c86947dc29dc85ba912140159f641b4f99e3fa5798a2d11f705f754da3e34b08ff2d5a428fc643fa8bf38e782d700f5882bccde11904e21a7f2b2fcf5c89d148b143f1ca4a290ed9dee89acb72032fb2c70bf869880806955f9773efa2df87f345d7e4dc28950a51ecd1329b41c776d93d740699ea83da6336d2a1d51b61235118193a025539bf0e7df4071e0267d44c375bf92577009afaceb2c91289829ed5e9edde34a7d4bbc920e64becb0ae51ed5cba55a0b1f2c1da3a40f5d16914d58352dec4982203a854458cd3a03abb0c1a003f9dbb00a54e1e562af4f5707d24a28c0fc2ef864983f75692462f92c32eb1a7f441894415530c334b9b0ae919fd472084c20df289337ea2c6413558387563fd6b0d8b7a94a92076382050fc7f284b966dbf92c402b83d6aa5a49f91c3422fe98c9cd3430763a2fec46792b5b6cd3dc9a948bfda57f68f6286e3d8919f6533766d374bf2636ad8e2891ba575e226263e4985c2ec873e6ebc89f700388571a717d8ae21ea98b4b2df0f1a801c2a5ff511b99a01a24e8c171143dd6ff149f28d7ba1a15776933a027d217284fa9dbfa98358351be78a91b62b10c65f8874f1960c8c68857e2ba3a0dc398d034371ac5821441fa1eb93d0fa7ebf01d893cb96cc8113efa23e50bcef79aed7b553685fc5a49d4d57881ac3d2e80a21e48d4d2057f8d4ec754ed94ff810622987858559a21da269234a4a93fc492c07dece788135b271352747578a41c0515720ffb1cb24d925a0ce2947bb628eff4fa426c15ab5554408a4606de6ffe19186ab0bb1b952f33a981f3b02019419cfc7c5eee1198204ec27e42eeff689dae2b20ed0ec2d455e7ee48aab9ab8319b7b6e0a87818aa1978770d46d78e6d2c9ecef0ce4ba5e2154457ed99188a7275658d67e37fbdd2ca1f6dff7ae2a995c423ff7854aede850a5760803b475dbbb2fb38def80063de09791319fc855b5267761865123458f907c8039091a57f84a4c4c685f682a888e918b03f567e3f94a8561c14722d0a26440b1ebdf40bb0e405aa40c3676f0d3d87f9fa2d3aa95d4cf14c06da6844665cac11f359242f958e7b5f9aa68a23bf567bcd22cbb955e859f1a2ad616087de0658d805069c458297391e8e8e6777f4695fea20d5a3acd6c8cba569a50492130bd85f36aac4d4087d1aca542b1a8d5987279615956d019f84c02ab1a6322a4225a4e8c9f11256f02b568627a4e94e72b9093fbc738a942acf17813a3cd2e002a2f339c618cea4b536b4cd76475330e475015347a539df2afcdaecbaa00622dd74ebc83facca0e60b4ef4776558767eca69c683edfed1a7422abe135b9d01054d1566e2dcd490d5b4b23676eacb80783b215e0ba6b72546d39e8aebde54845fad6141b1209c2caba9a97ff25022f8b181a8940ff782a297703f41b4e7e11ac6445f1138c953f8a9419ede90e51660031b506b8d97806c3785b47daa24c1c340e62c6035152cbeaa5c02b3fd6577d29ba1f8014219fa587ced6b78908019f324eb82d0817357e47c726b957ed02d06ca11847760bbb43d35e253bc93e7b5bed9e889c4814781508c4fbd5f707ae1885dcf32def9d552410ff1bc5d2a3b251d683c750f512affaa796569c65ec9ee78590bc8040e470f47549d3443276781b6367de958407ed801571c19b7e6f38b6ee5401891e2a8657cf470dd35b041ea4bc69491e9f43142871f5bb8b1094d8d2e25479994dc813a0eade56bd79d8b6f79c97d9e3cb5d602fe845afab41e290876d48f5ec15d7dcc96c09c254f11f7ee6eb0e479bc27c4292974fa071186709d41a9a7d3758feeaeabedb50129700b4ab69e0fa40f5e907ae7a1b11f2a016936b7b111619f1aec256da62e857fa804c0aef6a899be7f7519d14dd9ec59b262bb52eefff0c950bdce927a9d8236534560d6c1f1c5264107334263201e3c4a3d0e76698807f9510347368046139287ce693ce43e4f74bff378a580f3746c673401921f9c3912e428b111006fdb7328ff6aabe44d74840c4ccd51a99b4f38a37cef78851b69c191d8908c8748042b1d95d593b223bcad2be5103841d349f4379474819a5e71f198a4c131553d42ae6674b7012488f4e1a73087403153ba0c0969c7fc3c3678f02b72c2ff9cf03050e904bb4fa6fe04b42e7ebc802cfb4af88f25c1a061e2c9133f464069f3a768348a77fa1a4bbb584fafb8380ca4e1980700215773badb40d2821ac4a3872f50c8d4dab523546069c68112f01445ab79e91dd58bde0d8448b83a30dbf988840f6902975fadec67100460158b9b993462f299277e88b052c89358349a96f81b95a6704b2f15de3a7199ac713279d9706a9c11fe80fcfabc6c42fd223d1ea1512ccb9ecafec59e841e041075491e605cfa41cb67e109cf67254ba43251e090c819425d3b422f9068e7cc834a1c9b31002cc2c81e3e3ba5bff6f412edbc54efe5fce0b862ba3dc4c48ed9f298e001ad2f7fa76686f0043ae2d62915fcc05c37bab59301a688b899a4f132a1e43b75cc139e0012737caaea5ac04028b376177262c7cceb3b19ae0b2a01ac682c3423bc80384937fbc1892b29553d3380e7aa046655cdb1738e18d51840f9a1c9ab219aac0145931b1bcd6a4b47633b471a7b766e6f23e68a1afb9da11dc4743365c2d71cb4c687567c8d34b8a66a15df951c4d71b54c87980da4a2e58c5de07f8a1d91a11d5c330bb33f11638502a45ecbc5942a2c46032a4dea7b5d308cc29a0ec5149d95375c9864455f400132f6249ad26bf4c6797c6b68d5fe033219908f58a4272501033d2004bba459b9386ebebc8e53173f7f73377938cc8a33f1ecce004b756b46632f0b6c12183436b4d28decb6b6f79632252903eb07d1073c07e5f9c507c7a8cb197523539fb3f2fc924307b863d4c9c8f3294a4accb93b773b101c77e0b803472670b6e3bcc5669f2b0f962dcfa70b00903303802a67e6a9b205392c40ca61410b433996b6e0c8e56e8400c70d2770d86a58b1d58892410e793e9d52e7d449e634739eb19d459c5e54e7112799fef1ce32a7191a047effb93ba5fc04229a3d0e139d53b31910919fa30e8868d48dba4f358219a3c6264627c627c63023146314b3d9f77d3e32b4f09131c6c7f934429163944b8d53327224339a711a22afd118d134b931eece273f698e68906e8cbb477a240d3698f9c872683f72664072042093e5d8828839b32003a803b0211a771cf810a00039426c06c081c3767e71e2534671000f54e7d3e9e57cca197723126312a31223d4b8c4c8c408668c1a9b189d189f18c38c508c518c528c624612e4902398518a316a94224735ee6c8842604382cdf8d1726c4230430091049c4f40444044f65a20a2b264f938bf9cbbf38964f91875e3ee7ccafda354ffe046ddb81ba1c6a831cca8230d20038213bbb1d180019f7777808e62085dd55d05ebd6ba759aad2015a1bb481dbc49e5feb046dd5c198ea993f3f4859ca47d55f995f4cabd742fa6d7d26b297697bc56bfe949d77473adf3bc5c6343237372188adeee46f6c8faa53ed527d085479a574d536e50095c3f76439a918bca9fd5a743288043e4a3601bfa87f13ae4ac9642ca97bd09f58b2159fd016b51252a75b5d4e5fe92bc471487d74892520b7017865cff65c8f561dc16f25dbaba2c93b17c783627c93c4b824487a414874993d1e888351f738014a69135064b87060d1a4ed2e41cf2a6cb1d39e91cb65ca972dbd23fdfe3d096fc9cf50fa8a341aa21426896bc4b38312cb9376b4e8e1cfc7862996199c9a012b88693384ba19145b75b33c869ba179caac1f261719c60dc0dc99569e46da9777493368f5e46b99751b6debfa4f42b097743f2a8238f0295c0760785712f23275b994616ddc0c7216f494a38384ab2f286e452ee2d7137032a0fa77c49691d960f5bbe925ec016aacf595994e5dbf50fd8032c81ec45a23df55564120f0fcbc77d1ed60636f7e0902fa3db93366f4937295db3e50d89956de4509471f70996dcff8a42835ea881f268217b9706d9071f851fa2bd4a87aab4bd92ae937c9172fdb0c74991c7346739383744df79dad4d37c6c3724276fc6218b5e4bbda3eb3f65f9509295af24af75d20bf83ee99356e2f44fa5c5623fb389a012f87e0e11f4e2a4a5d15e06c39856de9e74cd82ba43c47101abfe470461c033f286b494dbd2a6924e794bf29a4fae312549f5fe6ad2675116ef1a79144cba4b3432e6359dfc93036847d04db46410cb9637a41ea225a130a818d4ddee029f2c23efd145ba49d9c99e1c62203ac9537d708d43fb6c233b598329874ed7054753938e291c3a429045276b190b8ea536fb97b6d872399b169bcdca131b929991a4f82425d9e8c2c786164ed2c832f28674cbdd74b7a6dbd3ed4b6d62cb6ab4fadb06288f24b17cf37d08f58b1b0d3408f6fdb7a6fef16e5d6e4fb7243f71beff96f3f3b6a33d0eef74b93fa489b4c769b15cf8b38840f34962797cc5feb6f3f365f432da19d5bb94c12ff6a219b1abc51269383410bc2de4ea84bc518fea118d2056ba5c6f5c2db93e8e06533ea23d4ecac835cacf1b92d76e482f19f95af29cd7fa69e44be7b5fe19f96af25abf0ef9ca215f3bf215f50ad366f94a42f2f325e5b57e4df5b034b0c966198c23a7481fa2933b39d440743246f648a59c9ca7914559ea925a2a99bd8c04739c2cb325ad939f6d95911ea934fba1998c2cca621f851fa2bdc387a5412ddb0f0520ca4873c8964ec2c821072307b45b20d41043a78c72e502e61a06116f5955d9499d1cda6c3e3e3e37ea7572964302884eca32761227db6c3e1d884edee4d066f3f1f1b1f6e846096688e8242c8707109d7c651db228cbf7b12158cd67a95fa3bc5b06e88f082224c1659258bef13e84fac50d8906e1904559500087705ec6125b9f45041192e0f193c4327e11928099e6f56177adb4bd96255f49af1a5e50684fff0df98a42bea4bca6d09e7e18f9a2427bfa5fe44be9b5f4aa42beacd09e7e17f9ba427bfa5be40b0b8b7c657975e06503ede9c7796d79e5b0a3c99712adf5e3902f1b68ad97aa2a2f00779b727d1a9157d2cd8e06ddeffab81b2472bf2ca6cbfd3aa636ebe7e4727d1a4b039daa43c6d5727d5c4c0b487bead3c89907a2932a27c16c494b04c77b2545ad8077af293ffdc977b91ff72293fb3d910c6dd8f0bc1a37a95633593e6ebbdbce5efbb79df52ece3da24163c68c193262c460f9b83d69b3adb571e5de926e25cbc7cb88f6f4d7208371af1b52ee7fe5fa07f732ca9d24e5b5d43f58fa0777e4e6f27da36b4b03900f432787360322c389dd6870033a7f76e8b02047111b5d57f92675d30b00e3eddeddee5e93688e9414e8d880eb579390d2c206a4a050e228677a4880c1321dc021152584d19102b732758a62c409a204011565875d942c3a3944e14014155ed82183615cd0ce60d10a22a91c2718f625e70520ae40c1010a142b198795b02a5327283564dc7ff94161c185598e13187ff104b62ab801af3275aa018b8cfb074b70811bda143584c9d9825d993ad550440d4d2bc0747258dc92c30466292d8171a64e35c88005df64ea5403d10998a5854e15523942603153a724a83238ccd429c94bce0a494c4e495a5458d1c8609a4c9d9268c001bf32754a6a42138371b4c8d161d08a22300ccc0eb38678d243c6e12cb04da64e342865dcebac806b3275a2c1851c0d27d8b00b9799eb7daafdf66d29d2f782b0824ce0fed0a0fc99de477ad6882d6740facbd816a1d4f57b6d0d22a70e74e9a6a55596a98cd361c3996bc52f4e3694a9b681762a05010acce4f6dc079a0b28724dd3ddddef5d4b946b97dc20e062a992a99688285716104b4442f6f7925ad2881d002d6626745117ee9f3b9220ad815f9f36d822c9ce2eb25253fc4b012037871f7ab4dd5bad52a86b16c3cc225bd4b44f038115b82a59b4c78a25ae258247bd5be28af44c59d94620f753d38a6da955726b7f6db5d5813a2d06c3a0b5d67a0f3fa4a0e902f6072f5651dc33bfc5f23075431dc24b131353cc2044131710a268882b5e9461c2044a5d3ce12812891aae4ae7aa1f6cb83f5051ed20c1cafe317fd09fbeeac9040c8b1d81c30e591499a0888b0f4cb4744008a529286ab0428a2d6c1734b27b16f68aeb2208a15a760828862f85c8fee4c3ce9e18ccc264cf2c4dfe1496a95396a52c52c20d60ebddacd0dedeb5bdbded15edcfedb6f9d6beeed5b60f98821674eb74058cb3372b54a7ef59d1ba692d6877c4f73c1c380b52f37d9d5c664ae684b9ee514ae925292de69ebb5ffb237a1ece660b5a0d8421adedf67aae0f031f055b2a30e0e3dc80716006a9bb5083e210083edd015908697ba3d8a66d93c2c42c4eb21865339962b9028b181ad2eac3fa40d52a14592d1607a0780354ad4291d57279bb38e2f0d4104556cb85479a975763b15a2e3cd2bc609fd9c223cd0b56d372e191e605abb1b90894836040632c7f2b9ad5eab55ac156ab9ad5ca66b5ba59ad54449a07fd5100353df626915101305becbf1263da14aab06903fa51d12e23cd0b5663731363712054deb2818264ecc480d5d8dcc4706433d0dadfc9e18be5e33acd8773c004b72cfedee62686239bd1c01c16074c32f8a0e7d8253608823bd96ba10e8e6c46cbd1814123da3e41faa251817162309e2c63ecc8987163334656330626e4a790d7ea3f3d05792f8601a0663f28d4aa00883130dc9131838659ab6103ec37b34d870d65cca061d66ad8e0010a75c61934cc5a0d1b3c3d30300db356c3064fcf0db1d220fa54e060c12005774c9e5a0d1b3c3d377c6c3b3c262ec51669b11a36787a6ef8d870c41e070bb5224fcf0d1f1b8e1c268f7b8ffb0d771f779b3b0ef71cee16b8cb984103b45fb53cd546ad622cac812d0de7b040c78e9f13e8c6e280b663ad0527d0ed1383aa0365eacec23ac01ddf8f775e207bf31b14f2b86fbf3a656da0ca2286f529d4b5fe16ea9fae99c238a02c547bac30dbac3cb9fb14da3d9166fdeed223d73771ffd4c8ad23e3ae8f7bfa46b54d8b9010d2d025f68f0821d42f2e48865001a2ec95a2e7b9e759cfbb9ee779dee779a0e7a9bc5bc3fc9176954112d39edadddddddddddd4daf2dfb69ff88997e4985ed92de0ed826f98c5219a531b54c941315a80a48d5a4dd919a548708292ca44dc1501c463851e9e244852953272a589ca82465ea44e528532a4679053cf6da3be5a8565615cb88eeeede27e60b73effdc02f2e2607fffb4050254a9142bd92529254456081c2524488c381316403a8935253a6d449898e993a2935a9aa7a4605217d4a29bd80f6f4f7e031e2bdc4f2edc2a5c905a48cb338a00b68d094323ac01d514cc6c56853a0326ec796a508ebd7767bbd0f54ad28a5946271a41969441dac4d1a56ad95e62505859758a39c81b1dc5dc5728a65092c53635363a3c332434885cd8dcd8de78415e6267613bb2cb48c88e1c470bc14ee19198e0c0b09f78c6a07d94c363be329b04e94367065cc15315814457146bb0245136b1415724497cbe5cad101b9d081a103e34a10e2151d489b82c3cd8956c078185f71bdb234858b957abd5eaf27a724c1bed4d4d4d490e51710889b9b9b320614141c6288383838383176a058d91167b3d96c4786ad5058984163060da5970b20ac4d183060c0a0614a01ad0acc9a59bbd224575c2d1625881123468c1a36ac0d51860c19326cf09cb13c626deab9d173c3ca192b6472a54d56a4c280377c6ef8d4af46ac23623e361f9b0d870dc713c69103470e2b3a2bb9ec5fb164b76e6529b716392cc86181ddc15216e8b04047cc0a9285b5e9e3e3e3a3638715a34c83bce0c08103c78e9f25273f620db59c4027906a0bb1d62f686800ba01dd545bdc826e41621522ced4a98a13a0982a50385a04f108628550bfa8d2a58a0fd9635e65a90a529526b96b06ade0d183478fa5339e028b021a0c4c8f0b7a5c40254c98a9d35215b972c069498c1de2824a36215144bd000097f6b45d825afa6295c2649ca8b48b312d6dc9b52e49c93831b7920edb0b6b93070f1e3c0080818dd205175c70010642352e088918b07c6080810a03a1ec24050bed2089eec659b145d07e60bff57e15eda99ee759d05d39cc5e7dc7bef5bcefec953804843078fed4527acb5a4bd835e1de5b36ccb3b6840579658bdd0295d68b90eee0808e72ff7055ce4c46b3e36e941aa7c63163d418556739758aa89ab9f7fcb20a59f5c985479af3e9053bc9d4d8dc9c4f393939f5e7037feaa7726632da4d0c074736cb91cd72607cb93363c60c1ae7138d3ca7a49abae4b0e54a1531fda37a9c59949fb2fe99a241e01021335046c31497c4a5dc4ae0da083546d9fb217d48b55a8df3a9c68c3ca37a473f8d4c63d3a81b75d98e50e3ae8d546d64038868d4cdc8a233ea7b1cf2dce594e7d3f9047a23d4b8032aea5356166551f5cfd70308b461c306cfa8f3da9736cfdd09753e8d6172ffa8c488847769d04c876dc69323a3f5ccc019d2f93446c96439e5b81b775ffa9cc902d9633694302e469f1eb9474d2a7d5fae74e04a97bbba9b74975c4d5e7f4a47445e3913e23ef3c09f884716f15a9dcaf587382223a4e525862c5e6891723fcb107fef87f87b4bc07288ff2d9780a559e2402f67fd74a87609246416f17386112e4461a5841368218289d10c5dc270414513292c0cd51742a4db02617dc042edcafb2b083e566591f288300b28d23f2e0fa70a5cc40120842bd2f520e97d650d80f5b55d7f44cc2b09d47c59b53b495ef164974aa522bdf0484cc4abef65ab777dd8a4cb5acffbd2c8f7aa6a6daeab0fbb499bbf0afe07aede03cb9dbff9adbedfb282a8fe63959feb2b8913b3ab9c01691c6502a455f31131ab561f90d58bad7e5b69ff8383363d24e9acdfcefac9193ec248fc95f81701c1231d500404a4f737fd71ec929455452895c910e8fd094c862c935907de7fe5ac87d8bfe5125bceba048770eb64b91fe73c62d587cca0e9fb1f0e82b4ea6336adf220713ab92bd9cab5fc5506418c4bb7f64b3af39ee61f6d3698bd526817d29d5004deb4fbf372c48354777f34493672411ca801f85121c8983a6aae4e5cbae4fa507ec48353c6894dba2a320e88872df9c987bcfe40a85cbbec30c503964a859a96f4ddd6285db58474a7260bfcb9bf125523244a70a0cdcf4acd9907f6fdbd1c61e6c11dc1fe2de9d0d7ef0fdb66f35af7d37eb0df928eeb91fd22e44f87eaffb07fdf837e2f47f0ef191da1dfdaa74336a0f7fade5ac223c2b6bfda82a96d8cad7fd2216c02ae1fab3284748752fa8dbd9ff683d54b185691d60d3a43f9fa667d1cb354859abb2959330d6afa150a118618ad40ed9b2bfdb1ddddf563f5697db056514d3f1f10d29d9d9b13307edaddae26f0ef40d110c3142376b8c1047a05105f9c623832428a186bada541d48fd525ecffcd9406d19ffa940a358e5150cabfbfb46d5e9acb1d24307d9eea9ea473d78fd5a76015ae27bbe26ad7b1bfb3939debc79e08e9ec04f873fdd84effe7fa3bf4dce91a3d695da327ac6bf414bb4679324f16eafa142c62a892d808bfe9943edda1a5115b92135310a0404cf6778515a9ac651298b2c252499bb5a93ed55cd529e1f75a874262b5ec3ad6d757d6873d3465eaf443988cab39a71e9ce49af3b3e6fbf50de26235250c04694a4abdf059df2c0d584158b823b6cc7a1a86b3d5873f0bd2fafa95662420c6311cb6b208d6039a7fd95cef34a490dad5f5e20fc0e5ca22d8ef4321b9ce581fbeeb3f72c6fa6a2367ab72d6c1f8f83f184b5c7ed0fa70c5a3856711acf762a9841f077ea6258fd8b2d75cd7fafd0471f7e398548b4aed5a776aa547e4fa5f805aabd74a846d36c070615a819315485c866abdb5bd4b4408398488e7ddfed126122564902801cb0f796c266eda46ee7ffffd0d72ff3bf23dee779e87c7bf95431617bc6ad60090f829c459deec03f057e507aaa7de43cf10c8f02051fd08ab077f84904cbd3f02f8ab1f41f5a08f3f03e2cd6299d6a66327f8630e380115221033c314510811c21556b248820aa81f9e0cf92351c2e28271c6f1f47b00feea3d507dd86507e0af7e08f8abfffef948e782ad90ebb58713928fd894564f85d8ddbf49a6125523244a8e584ad61dcc2cb8bd5fceea7fc6b35ada326d33855affbea8c3b500b6f193cf363f79c2dcb0c30b4a4031c1113f98ce90a086106c91a1893b0b21c6aa5e0011a80510e9ef7fd880eec518639b3fdc7ac2362b241be9c7d96025c0ab770dbac4d9727fcdaafe9bdb96bf98f7c306d47fcd5c7bfd880332ee419001fb570780e065f7df82451ad4b2b5fb7f894be2e5fe26d83dc82bfb3b1d1a02bf7826195022c7c40b5878b1021a7c28f53002a43125d86266a8fffbcd28bd63533df5cae282bfc789a4f77ddff7dd176a1c70cdd77e9057be9415c48d38e8791e2ec9f5eebb2ba9caeb2eee3c2bbeae11c3c3d3cafdb808a8dec5ef1f17595cf09771a2471af922f368a12a71df4ba066effd99e4fbdfc5ae15f4ffe8b7f503d168feb4ebf7a34c02ff10f2b72c1ff5b3e54f09044bec1bb4585c707fbf7f0e3d1b40cbb44ca341add5af489bcd9258075cf3bd7404abdca282672da38c6b1965b14d244a8a80e0ee5d16015ff53593385bee6f8f3c62cb4aabc7fe7e8243fe31ca12c25230127f25fe45fc41b02498553fd45a5544f8400598144cc96289a19a85120c3e44a1829712cc0045540954ca78000a194898c1c3940d33a0e0860be030541fc7321046c093408be0533f492cf3a03dd5fb6b9722585bdea859bf3dafb236a839879e04ba2d10ed8940cd7506643506f932e6e6cfb407dd82852374569ae0a025cb50754207284660c50f50f830c450ad820328ec20022d4d60605284011cca10e10394991686ea937b3dcff3eebdf7de4bad187bedb596568a30118b30118bf7da6bed9490d6193075ca25e5fe9acbfdde5f5cabe86f27906bf59addeb53afdf25e8c2959a01b998be48c10f042b58bfbbba1ff8fd07aa9e7e0fe6ef6d36f295e07d4bef2d7d05e4fe9d05b1a591ec746967daf5cfddddddddddddbfebee9682debbf796f6dfec8fa3c0f779e4b55fc230d63ffe9dbd9d7247191bb9df259e0509ab5c7b14102fd75c4bdfd19e36d3669fc966727b4fd9757e36f97975c8389cdc0fdd0ad2a15cc67d443b95998f6895eb2554bbb01dccbd34a607d6251ad46436994d6693d964baca7b1d543bcb8191d66eb7d893f0965c8e4cffd8241ae465fa5415e5927249b9a45c522e29e749a58a2897eba10914adb5d63a06a35c1e96ae2d3992b794fb1dc99ff4e9e9bc2d14099c42f29a8608e90e4eccf996369b527777d7b5d99e6bb33da24a7327194783d9f65a05a5daa98e9a544efa14c384112366cc18d52ef72dc524d50e863da73a123d12bc1c8651eaeeee31db522c7ca73c241a34a6cf7b6f997b267b4dbc22cf49934cbd279e1347bace24962f191b229cb320781a8d76c630a60d848a824ab89b641c0df4ba784dd74cff2cdd337daa3c5ff27cc9f325cf973caf897ea5cad3794cde165ff2b6785d3c0fabae9790eee0dc9dd6d68f689077769933f4e9d36fb223f32208c672300d8474074769b5d64a69a595d2b23f059dc7b4648f3661c880c0f56331ea25d0683509c96bbdb4546b3daa465ed3015799135c41954d2d22b24c56b764257b41e602ae2f6b417624634186015c5fb602aeaf848d74f88c3eddd7a4cf55983062c48c19d365caf4992c1b6db93aba2366298140a75e16c838abfb9a7e20cab8aa6bb246aa2474b01a1b55064274489b426c6aed51495a86e5c29b18cd591d6dda644d707d990ab8beec0233519602a6758e0e2d16e6e8d0609589567556a763eaf3ebf235e5be26d09fb66a2d59c002e048f382d51c4dcd9cc9ca28c5edd6bb9fe7fec1604cd59b721904a6aef31a7da1ae5901f882315dcfa3598d6228daa4a44cdfa604cc125d2d1606bd255f6a7948301e6c4ac095e51291ae0a0a1c695eb01a776772b737362a284f5241f991f59c8531c93e10f34bca707a2673a7b9fb4cb434a4952308224c7775a2d67a3d2f174418da1c48728af2258518c0277418a8a1908127559a4cb1859419a1772181772c153610a488d8e28b095f0ce1853aa183172313242a723812c1130e53d000de8069349a99db56d073e022bb3f6805051d3220e6851b48e882a8825e134d64ff0c344002a3325a68b982872fb6666f9b2b300ecc342a763498b878b202a5042b9cdc9d86c99e830ed95dd94fc0b48b8a7281264b2650ef0cde26c4d323462face841a01bba78d0ddddfdb3aaabf2549f57e2406c4b7f18cd977cb052c50620a45460c587282c2c00eca2389162698b0a8ab0e10446084144174ba48089ea81c97ec30cd9bd54c1e2888ba21678604265882414be00626a054330e18114c090a4808110ac40051d68ea82c60a9c6deed2370b16493a146131e6897befbd4be4eb81a27cefd391154d5401b505698ab5dff77ddff7790cd35001c6d172fff0a38121c6bc506402304d2a14198f0916295e78b972421329e430e41b38452bd4bafb84c41262aaf8c129892a868a5c4f897c734fe47b7110d11005114553307065e8de7befbdf75ea7c1889882b288c490e0842b262c613184c3d9fd87bb9744f65c539ee515192853a0a04314221a86a63630a4cdb6652121610f2fdbf6cb8b2e035af7be0b56b08260ad6eb35e2d6737837c4b215129a43be00d78a5a576ac47464eb6b89a6c1f66fd24698dba3beb499c02fe5cc4417021f4891019d226b5b985b4499fdae803d17ffaa66521a43b3f6c404060dbba4fea9403ca40c80262626cf4092a4aca7a31daf35026d7379972315a79547f6ba15496f53c1247e9dfa7b1ea51847ed8802ad15338eba0df87f8fbd76752a58418a6b6cc50850f60ee07ccf440860454785961a8fed7379d8474c7da72569fc9d0f77dcb592d8514d9fb45540fe4b5fe255996641962dffb255986dcb7bf24cb10f0ef9be512a0255d52af49e1c0a7435f89c15bcebc9c7d70fffb21b61c72bd7256cb1f6db610afe11a90f42be92f02c2b576890bd65a6bbde68aa45e737b2f582b97214b980c59c2847ec941993afd70944397aa84c1565a4c3086091867036a206be47bff5a039638efad970ffa6987fab10cdfff835e11529914987e00883019576dc8b91f8832052253271f9872b51d3d65fab4acb5c868c503b6f50fae2ab14010e3fa20178c7bf129293611277b4bd555a6366bddb559a1daac2f36c1395ae98ad2d5aa321dd12d65cdb55977b4e672ddd4671daab4ac4455c7549fca254a581bd087a2d94083baa4d19e5ad629b4c709c65132b58806d1af8fc44f2230f207b60d467b6a88f829965505d20fcb5589037359c2c8381b2e7642c51df9fa25e0cf48945829b18790ee08b9ca1e5ae01e95a87bf40febacf9fa3f381092a47f565f5f49ff8467acc9599090aec859909511f069f6e17295232986b64ddae60803d27ad7b74adaa6abc4d936c777953858867d48c316694823ae666d50bf783d4d3903829fe637c04f53d2366125ee488ffc2a71ae9740cd340f3e93ec34a4f82e211f5d3649605c8f1eae6fe172039a5d5f5ddffa99b9ca6ff568b30a519284831fa450d786f4f85c4b1c1d932b15838ff0f7a844d5a826c1faab827ef562e549feec570a7baa52294192247c5beb0923c1e2b77e743d5896b858eb713f9618045d18b362b1d68be5fbaa741569c4fef7b9e75adfc9db81f8adff40fc56f901ebafc79a841011fa41c9fcc1e06aca75c5d466a594ae9a56ba36ebd78c00dfa46fa5f3f30baf51ffd4ec8f3580dd63f689f654a3ec29d9ebaa1deda9bf5a1a419f34a8046d1846b95443340200200823160000200c08868442b1581604592a2b1f14800e688a4864543699ca63498ca2280862181200c818030c20081950668a6603002cc71cc01f7c10e495787a8d28abe20903f72e67b0ac6717c9aad850703c992d8cfa5016f86b941f3ced91ffbba9d09bb3a54a2d05809e977b06f872f86b98378ca6adf798e7d239a2e40edaa4525e49172349a8c31f3a2700478ac9f25c44f2ac5862c82d983fc828fefa2892d289a5e37b0865dcccd34abe1816d24ce86f3fb552ef21b270a9e93f5fadb68d8576812d48c5fa31a257016e56e4953a01d440d8d2e44e5b7890ba65f6f5ad9ece816bb4b858390f00bf1b9195e7d276546ca2264a148960082a7256961c6e038843f5e31446baab85b2dd40390b8a4adb5c0ed67709fc424350fd39d6c637215702c51626f3700f6fc21674564246a463c4419cab0aa62d59a1d4e5c2a8119ca584729d9888b82c119bf285fffdb83fe7aeb4719293512744337520064bd3539519b341ad166d03fa67f9a18d934a4afeb3227140a74a5313c636109e15a31e4ed49d4f2850c49f125a4c6f7047d0d2edc4a79f6235925308ed2fe47a2a658fd2a9abcb10392621846c633c87c3199eac6cb2041617334831465e9157b9073622898ed1bc6991e16cf8a7b5dd3ba0b2b70112d48696d6560f0327ad7926e3e33160b70a231688ac35cac6609d019b33e66052dc35926216f8463c052385bb8e584e293cb00b149ade29d755915fa306c3099947e57503c9da9c13a59586a6a9c113a5bd538448f651f918524f29362a0d2fa7be30c5e5570304295187c0c544181cd60fdfb322135107b1682ffe15a12b1421f68de5010514338253d19d87140f93ad743b3e1fb878313e35df4ecf9e26fd90431b9d21ce13ebb942b4b5a0b07f3ca2ea84b66007701d08ad6adb3b8fd129d3694c981e144a0559cba084e39a2b0161097e03062812aace42f78e16996aa72a69a1365c5c2e7a0936e0d1cfa919b0152228c01de750bcd2da0a9745bc7a40180543ce4d0bfe9d2f3c9d9c78bdc3fdfa9b047718a9a60969149b6240b3751a47e52e988fb3fdee9b605022029b6ba39977592a36b1e286229badecf2f1e5f4563d70e269aeeb5beb2963b3f85b0bfe4a57cf4662c092690dbba2832cb748e776638e9a234892b6d77d0c4a45122d89d138196dd091dd14546a4d746a1081abced8c6028fbb62c41f0cfb6975c819b8237868ef8dd74317884bb88d37d337bd49167334aba43b0982e7ce81ace568fe7b8eac82e8edbe0546333c5328049684fac8167884a22458ec006ea0c0a994f4733457e418bd2153e50532e74d0f1e04533f3f8262683c0026ecbc85bf3c157afc742387139d82d4385dcd8a130b3f78682fd1ae82007483b24fc2ac3d7f984af119143f2d3285b5629ee8b1b7d8184536e4c825d11b0ca63790da732285a0f74ea75809f904a1e94d8cc568d1f43c10ef26bf47bc99b9f905e793071a6e84c67cc7b6867e39a8f4de203480f5340e5661d8b7b336afca0a0a71eabec30e484a89d3de83fa2d1943863180b45d344fe2d56b03c1f45ddccdee14ed8f7ad7050f3d0850d63308a7360eb5132d7285cb20fcc7cf52a9cc9dfb42e0a7a73c9f8342d7fb8cbeb08ccb7fc3d8fed93006698ec5aba938842f0d77d2eedcddf7b089da221aceb3ba1515aa77984073abe2de702c1cf34e5742eaf8eedcd7768fd6988a3c45078dc5e5cd42b3250ccda45027ef45969a57fdc6cf15912966edc6e3cc63f9a867f2025949a0b77ac07b979ae5f069ad25ea4402568daaf8d4cafceff9d48eb937d80b3a7d410d15052667bd664bb46903b8fbd91a5ea19b65f63d2b199e92553287d6fd7005160691209465ed1d6218a351cae2cb58143473a167725c75013f9ee8fd4459296916ace6533b089f2fbca6f1937e0f9b4ec28d7007d8dd9a5412bf38e752675ae9949a26fdccb4a76e19a72f266e93d4f701227d75128a9b6460b6db421af8cfe4c89199aa7ff7b543930a4de4d7439766afc8e9b6dd345d875a341099d851ba3a7c4a1bba3e11114e12740680656242a87dfc041ee4eb38ae128cbaccc63f98fc1f585c35803cb1b74bdc8166266f6e48cd55a7893abab31ec9dd4dea6f842d51618fa00abaf806b60b4b1435729b46787286572ac600d6e4776ef8eb4fc238cd87b21712a3fcf97349843017939db6bcb8313fc6d4abe2b680074b3ef147805e805bc0bd2f9c2a8596ce914701ec841631f57083909a17e06b9b8f1c8c13ea4a02ddc9412a43415544c662efbcd2f502a65b2019163a23be1c4f4e134a7cb81f682c3215b1795e1440968de47def2518700a0dea568cebba7c59818e00bb6b65b6a99537bc1859279cef5482ae755e532679d7497717dbb23c6b0e7f8b60b13aedb194e22a92a27409d7d8fd0be13bd52a8c0898681aff5898c6b8719b1578a4dc7b8a95b881da9776f025d89d4f890b4a2c53dcedfd1d54b165894d388c75b08989c22ce80fe8cc1a02e6776c08cc504ad0bab0bd042c2e6998dce965384e0756ff67fdc40f00f6066e00aa076840e4605e119f3db6b5dbc3ed68150748d264027a7eca5025e2be0bd7c870ebf8ae7d4b0634926065c5fdd33bb06a123b114d0d9e1345f2d4df31aa36218d2221cc599ca92ee444c061e3aeaf27586aa859887a0e8cf656803a9dacfd151a6fb717f85ab95cb7c221f2f67f1c7489c064adff5150d12248ae3d385165d6208a084169286e55c9c9b14e5044320ddcaccde65c99b202cd19c4536a79c009609ed7fc834f9fb91be6fb90f65201c9d97949206283c5a87cea4c68dff2d44d4bda81846a5e188f7c81ee45b564a2ce629349e03d003d2b7ac80891d5cd4c68436975e3fa7a0d57e926ef46b087fe8be6fc288a250f9dff3a2dc860b36ae4e262fbda535d5309820cb81382284bd5645eb43a910579b083cf618b0604fedf11f6b57e8bd98f92ddb9f648e36f8bf9f9b4443ac52baf0e679e1d88f2a7eca3027f414120daba5302f975b864abb3239d61ac19e7671a02f8acacbc8a5a2a003a551e287d2b6b05e0dd1ab1cc53b7a6bb948887579d5238508587854f726aed56a5b2fe8068d21c8956ccbea7d68b4d1de5266eebbb4182268dfcc9007d52a711b6fc677aaf9c552a6f61ab46244b8c133984dff74b9abeb7a111347c3b2efaf032f5b238cb58e284bd3513a4ea04568137198728b768ba7110865d7f9d82e6616d19476da96b15c1286f1cd78914deafcd86fa538a24628e16ca069512a2e8bd7c933e2e81a1d163f8a111b6f8d29bd3eca8715a9d413228ffae47216be2b4e17301648e5f57a9b793951e57e958058bd966a9f11da34b881ba8bdf52eed9ded8d919b509d0af5ff0a68adb441d67def4a9d2ebf91c53ec666fcadb1e617032d1b3f3d11272e6ab919eb440ff7eca48b6f53b77838f87bbb698f24d91d20226a2f2a74ebc37a64c8c6ad04474204290af5a1732471640689e4140e8d48b1f007250a9c62494cd47659e50f8dbb6eaa2120be2bc4eb60b62f253a14991d982960aeffa507150b982f8b55b1bbb57752c2cb8892a21c8532c978d8d83f1e5413ec7639058894c2c54a69825991bf3e51d6f9d3852767d6707975e23bdc9096e520c9b1f0a202bf35d065142f4170866e25f2400fa918ecb37ea7c18536de9cd698e3136422d65aafd51cad0189fde7eae4e495bbb13760e8a90bdd879d2c4f9061f0e8d2bbf8bbf22ab28cb34fafbe86849fd93ba30a4a217b6f119dcea10504ade0e78ae87ee316cb85e3ca755d5d31905b76016b211bc37f7c89d7e2f1166597f2cb0640fdfce84b2b446381f4ddf344106c5b0e07b76c31df0aee4db87d742b87094683b9816e9644233a997cc09610924fe1051f2c014873479269169fb973e30c3d25f688677e9a092a9bdbb4a69d7c78fc2ab0baeba6f00ac0cf90f2eb1a6b957d2cc0eeb7d38acd0466296cc2e5737809e021e3dc85f2818fd0a50d612f587a0fbffdf0b9e16a82e617ac486d626dd81df546c346dddfe9782eeaa78a33f1f5b9025254500415479d72edd982168f6038644761356e3090a6905d79a56343d5960948e05ef52011aa6b14316d86875fb1483b02d6f25ad5ab398134683a5d8e66a8fd9973051f5a7d5f37a84b9aa95ee0030d005e5726020da411b18975a07504f65f68a95563dbc4b9f415b2ace16b2137393aa6e68f567502ac8987e0fbd44baf2bd96d878218b7750523fb33039ff054cd536617a6ea103072616a29c524eeae2ac1ba85aed9ebf8b5634ea704234ef50f65a06b46563fa52b37cc937446624fc193bd682ca5540210204a4ec413cceed5732e835d7755cca10678369efb51acc317a7073e0ef044990e7c67ade1ecc0dddaa6f73152e2934e0125d6fd07dfd6b2d6d7953771d6222742d5718dce007e439428c7d8e4686a84a428a76b76247c760d9286758ef9e0a55055a2a280cbae2b0cee88df20b11a05f4eba8d07b5f2c8cb77232c51ed34503c5a96dfb1b6628e35933f0404bf424c32a2608cd63a5587237409f70aba3f76d5dfdb9259e035a72a72f0ccc51303caa3c20c1a2fe2c107f0b97fb56efce5077ed982882d6b41b0201bee08b72a1f7563e7394c8d0ca1b120d908bba80c1899d04ab8156800a4883991ff09b93cad0a060118e0f061a63374f6ac456f877ad436ca37b7a972bd5fc29367ae7d6fffe4c9b2d50635de96f7c4d87263bc7d97fb1b7938f612962df5519b81ecd2efd39bb9161a684df35aea64330a7f198070d5ed32785b0d2593fb0ab8eb32a7349f9b1d6549a12f5afffefb2b319159ccd47f8b2b0b1d57fe45050e8864043c58655e921ea76c6e7a1529104fccfae9097b85a98fb5418c1e2bf8cc8dc0715d69e0a587b250fed4e42b942885a1535133139b4bcbee860b3d264b568802526f445995b84983c46a4965ebaf8a40d4eb08edfa3367531366343b7c9b155b720a29c3cc1fb0d61394546b77d70447890b4e947b9d610caa33e6c44846f7303bb070d0b8f887a7736c898f04688bfde6e532ddcddc814a50883eb387e53c7561cafd3b5680914ba75a499fb3d11157ce4ac87c091efeb245a4edb51e2f2984f5009ff0c236eeddacf241c5107520418fdcdfe0cdf073ddb88f95f074e0e478487f6e5338e21c6e383fd0666c4b36b3d4da1c6e30f62ad6755ecb664314afa2dd048e63646e1bc9b648ffba3363190d97d75f0ea791ab62be72933d1c3c950f4140161b9e02d010f0b0099a78a5311a5dba4c08fe565711b0fc2d82d61026fcead4e78cb4e6c21bdd7cfee98aa66afd8bcde541a1e19f6a33823cee5ed4548502e844e05c4ca2fe408d3ba4fe793b235fdee5474c5f45a9596810a411ab057aedd2e4eec5590bcca6edfeaf57d6d344e031931f3c18aa9ef55c8db6d1d3bcdf7654fd23ca9bce79fc560c97660d75a3e95e2b7a8d33ce017aaeef7ccf059e8679bd6517d9a2dde1e5c2b1b1daf45ce602a7e82872e6ee16b75d05d36dd781d9f0f1727c12724a988f00a10cb768a8ace870fcb685641f94d074ec2c3b380d8e235cdb3a2f0f2588a9a0fc045446f449f6707dce600010b4eaeb751a1fcb5cd0570127710e4cbe1401d30faa0ac10efb2526902be12bc617f94db4e6552c016a3ddf3d12666a1c3f6280942b2a8b0a8066a5352c4ed427b3fd74509c1a51346a77817160d0ceda07282a0229f31cb07ac9ca0eb470757987a15142de9fb1fd8209d512288bd6e77a39295858b239f88dc09afada9d6cf6820093ac4eb34fcedf7d54512c50fcad7d3b7ec1d152e1d99142bf61a44c803f412680a640a872a812f8a9035647e9702d60015bb70ba56340c862c9c5acb182f842ef23b30b82a9435a2ffc33aec43594c595eeac893a1d31339e393d698c3d2af14a9cd3b9f36ed4e843ed630373490c6e96505ef4bb3b0c338b0a53292eaedf90868e54ff3c741dbbaf959cd83f4360c5b0b749cae15b2dc4dc5590522b5bbf5bd3dee6962f9b3f073f1e32a039e26ee685efe5a7d584114d7c2056c0c677008cec3e3c4bf0f62f7870f585d405051605042ef006b291de3b0cbe17bfc1733581b324badf80ef23122932f2b62d227401ce1c6322cf6e414d8403d05339578ec2c7589bb4c12381550347d08f0da4eaf0630c69387f8ace756de6209014aae5518f155c99a3f8358bd6d33babc5bb4310030d8a41b824b4d264dcd789ad6cd90f5ee47e23292435b930d8c0cc41f8de9b52b026e71c89bf7a9c1cf3bd59502792387e2d738bd1bccf7d0a365380d43875f070c311d1a2f21aa8d40b1f8dc5e0743c80e58afa443a5c051a7ac657e8b5d5e6bda0289c345e43590595bc89116a3d9a152fd2632eaab584777bd499278904b8d720f94edd444efa30dc7c7a38cca8291a7680db12fd3687c9bde78d1384b5820eeae38e7c36fec9666afd3e0e05bcd34d0e19799439b03d2174862c30bc34ea1ec8a4d92c258ed5d760c35f4aa4e6cfda8e5bb101c74e50b6c0a702b0d4a925ea2e71a5703fd9b84027107fa6550a914a76cb4e54e6583149c7c87162b21d3102bd49244a1c3391a6f2c526fea62a5d19e877eca4facfce4bb0f2b4bf24b8aa1a56edb1f4d5fcee343e48ff5abef6bdae0ca746baecd08c4361d043437d036239f189f49ea1a616b0284c9b876b31ec4fee46f2ed7991c9d875da9843363983b35518588f4ee317ac4459444dc4a65aa6c4cacdb691328c560867975b2d23ef8a13695715554926b599835b130de7d15b8340154dc37556d832648b270a761e3292c8d8fce09c1d54b2a6d70c844d9ec69527c9a65f2bada739194109a2b916e12c87e6fac80413095d0df4633f13c2b9ee637d12a3584ceb847792e7201e93dd34a059aa50c923e5a9de4387bd877e7ac327858da7550510674fde2731eb7767914c51034a0884569c06af212706767fe11159921cf7e078192e391975ce27aa1de3f159523f5ad4ae87208a9c523de2b5ad09c585a5ddfad81997eb8987507075490b530c89cdf285c7227fc59fc9c68f91cff8dec819120ca53bde6e6df7d1294ef854509427e27b1b77a672bdde984ea04ee1d8ca50faf78df70cdae7f7ed890e6e551998ce24dfb1fec8c1367cb4c769614d2d68271a17c19f06e57cac1ba9d05cff653eb13117fd08242cf218989f84284ffc2ebf372cb87b603abdaafa114d313becd3bf286e405602765667dfce21fa3661e83b877f1c513808ca06aab6a2b5b67c80717d97fcd46a501f0861688c75dcf0b0ec9b013350d242a7ffa8e192067c2865953d886cb014107a406870bce0185667f8a4b8701104ee30a81096302826faa30b53f684e9947c8c2d0f75a30025e058cd3e166c056833149ebca6fe8fd568e0efe91a44caf569f0feb350416162c99e44fbac105e329fde4e1a2d87ebb0a09c0bf5cf29573578c323cbf028e1b2c452c126b5af2502446936880dc5f8b3ccf2a52e02c3f94082f44d4bc8cc75744149260fc619a255815e7a0f244dfb15a17383cff1c3246a57915401598512ae7262f9dd86424b3161857e0212e6ec150ded1f6e343ce8ad34903ac1cdcd39f74202e562e529ae84d653d278659ab6b7c5eebab5b6d383fc2fdcf81c81400cbd33febea106cade6c3d087fae182b93397fa06c878f2bf4c754b9989607e93cf5ddd494569312dc6e009f95cca637f00bf9f594881bc81527538b4168c99ce812e8aae060091805a0233c3fb53e0ed7289ac99623e741a88a4e598edca53e261ad93ddc44670d6e1c8be2ab620a8863ce8a650b66d76bef5055da4e7f89576c5dacc7825f8a66f15ca0728a5e172f48e64ddff84c6ffb40d92035e195e16ada35f89a29eb2a0bde5a0d93450312be23d7720aa5be7b661ec7601d1d8edffd9ea49d2db70ece4388ef2db9259e2041022e3c4310a69f00c32498b6170bcdfea376410c8a70fba4393b9d97a2133583dc711f910dfb53d7fc6b37544ac2921b81c6335980c6da2f88195a0712b408396b141960c253fa634679a35cf61afcb1b784022452da9e67cdd9c2a3d17a87dd6c174da260e4b0832e6c2080508e2a839c3b9632a615e8f772642d387446488000d5a58915a76af778b1e6cc4983b1906b3b0cdb6d3391f3134407b0c9600df006a881ea30ba5f5d46dc83a06697cf1a17190e0cf3d24e98838709d86d81e3f3d92a2068f313229bf0ce7e9aab85c11b309fcd8542e68a6d9df1b3fd490966e3f7b68a0fef2e607f98821ef0299901ca53a7f4120862f8e671ec8373bc204c4666078675cfa2f6efcdda7a8022dd47c259ab2c2b7985c55cefb412088373d653360d7100ebf1ce75786386ba58a82490ea5097615e5057ba961cabc84d969c82b419d390ca19c481e9ae4523c5999c7b23b9800b9563055c156cb3785a696b7aff63c91cf2acfc473ea6537a70e45298f4fb701cf279633e4575f30ffa572efcbc5c8f4e52336a926e1ac8483c33129d62a3f48b5ffe2afcb88471bc5739bc49eb6798091daa9027aff335e32107b059addc9050630363f08451a8e0385ea02c10fc80585c7b7a230e0a6eb445c4ad52c8cd026426ce48df4119c90130fe67e0ae673bf7b5561c41c115b8c98e364442938a1aa9f76d39180d91ecbe851ff24de51abf450d02344b79b017a1c31aeb60b84b04475415c3576819da939159a4525f5f276cd2216c229b63d587b5c77cee355103b2017d8ec49ab6143c3a66248eca07ed182f4f8235e080f716ea817d29069ab1b44b7c9ef1a09ce12ff1e1b8288577996fec310f30eb23274e960b137832335eda307af88eeb2f0684748c35fbe41f1d520b79df0540d830fcb99abd4460e9f332cf0be1b147c76da00720b707a665f7f9de02a501ff0d527c43a1a2b9f66cb7e8a42b65e71c54b1a30d8e0c483705f89291f8dbb4da0f0a9614b1c4e09cca4232d99622fb6392ea230b6b5d5020bf93b3921d51faa90740ee8266e177ce5715af2b0a85bb01712cc1c63b0034a98c8d8864acfeb1c3ca4a6eb7ccbcfd0dee63a69eaedf1905235a995289d9e82c71547f99fe03f25d7bbc363e080efa3f02512ca82744d1a3bac0909197e6aabb862299030fbb823577ec4f0778635036bd0fb76f34aea1ae8be34adcb35637d755b3e4471927216bab61a68d31a3e9c7c596bf9821b1bb81c8ca97bd2345cf9284b637ac83a4e1150104d4fd7d731ade2f6708d1fb7874041a1ce3f09230e64b649370ac66f1630573913888f1c6bf1fcd406365a90a28ca54b1627837f61ef70fa85a750854edbfe803672ce18d407afacc81f5b0b3693cbdfaf2ccb70578dd0090c24528721931420cc993dad5a0bf960940ae85e0a7103b56ad4bbe338fcc141737ab65ea29efdc666faa3fd477aecfe1ab1638d991f2e96dd510b7f41a99ffa9c978cd5331c9975946f121a217307cdd2688c664f5542ed553aff82022046bda39a5690021d26e485814a49dc3342ea68c2e958224ed8e0069c3fdebc30e471396d2dd04f519490cab7d15473b9e5044318cb4e6d5e0ad96dd84f563498bf16d2d25ed949b584bdd064e9e7b7b529600eba9fb2840709708cc482e2bf0c1f8272d5047db615aa89b29b692d7941b896958223c98ed210c98fd2e0aa791a8282f3e2114394fbde92193ac3b4c128b9b664118c2c33932dd691397e79ae61eb82b312b1468a52a1db54ace2083800e3e92da8090408455cc5675bccb15926f41399978bf45561f2247cd8c64720f70b300ae41dea64a148df923d25cefbcf2631d895c5bdf3255ac294ca0d154ec62288129949ed8a71c55559139a1bf38e691686bdc5c91f5b6179e8862012490022a24796674672c824b9d992e24c873db0273692c302857ab90ee260531e48f0a69021190c3abc9710c84ae285dedf73d7a322939c5a0eace462e7446fa26d60670a656fc29837aa4472efe9fc573e638d09798168cfe6c117c333ca414c6fd34c64f2306fb55d6ce00cd35850c7b2acec26f0af6d6324a516d74b94f597bce94c294b24cc353042755034af4d5e9046e881cf78596bfeddbf63c31b4235e9fe4b6eb17ef08321305cbe1100e7bbf82e12da5cd933c3fa5cf471d1cf7207d02a9c103704295c3f7d8e3facb1c5c2b927fe9de353014419a73f660b2296d435bfc01d27c960b31c3ae71b3acfe799805a7d07484854cc57ed1656cb42a5cd83256ec3d70a7249a4ef4ae705c10199922e5b5df0407a4d5ff5e17fa00dc7d540b1961cb647c6918f17f9c2b6d84ea0994ea9b99c64533f6e16f1221d2037cb4fa4d7e8731c10c7a0c95bc70e7b4e4580b89b8c261c4c5477f6de20af51ff85b32d7f4146a4e914a442145b350ee285df9113b4a6239ead3c73af952840fb847b060cf9526ca9eb2dc6111902d88b5d31888e46f1b53f752b5cb5f98a32f2971d00b9b2fe0b0359b40f2b673445a5410c6a84ead59967f817a6c982593b904f169b0a7b6ff6b3f2070a79fc3c5c6e56d6ff7e204d8c7271daf30d97d018db43c34d8339e66f987edde00b8510b1ada107c110a740449ec274c3be8bce2b453888b00037b841ced6b317622bc49fd25eb735bc803d7acd2477ff0698a012d26a10f437427619a483c91709c8df5d223f003791301c044abebbe80e45b53fb6915e0025a7ebc934f7751662c5f0d4523e3df19d19f7601097a0ee95e1113b16daa953f166cf48a070dd287ecde6188ef5b33b918f984ae665f8ca0e12f449ce49c66f5b964579bde7e9db9641b935cded72d5bb0593f2ba0334a55866206e890b92735c20155cbfb0b03872a03d94f40c7dd99b6237bfce159a20344c702286e581e09d5923eedc7eb1fd1c36f78ab3f84050efdf1084948e35d78a378c160d25a71c8299b5a64ebd3cdf98e8873bd3951c3c9e3b40073fdbb2eaaaf9e9792419f3843a1dcb14196552b9e27460d0385e40bc91b650c1f652f3c6c1afaeb169b6f3b9e44fdd1c0c6d0bf4e3414a9b069f4ae3b53eabfb1180ae7c2a55482186a006a881d28a854755f145d6e0ea4cd19f5dec85138498310b6514a4eabc1aa2231e0a4e55a8925e8d4d5b1e2d794e532d610806621c6721212006823ff492ac30bf8218309038108ee11087c187d66ae6884f05ab14f11271c11f1b6c09f2f7bb58bc602d8b7896bf2125c4ea12cb8f65794604a6d241e546f0f416142e8288987744625259301933425756450c87a31a5b24de15cc9db71ca7e23ebcbe6cd1077f22a8fc1d7a47cc09623b17bbbe0e63142a277019c7c04d8505cc0300f0dc04d6e5a2954fcfb60f03fb28e5195519332726a38ad83dde904de9b600dae46e9dc13f07d866c7124ae040aa1954938f9b82ec6d768c51e1c18e42cb103bf85e3476e4c2564f26f2d7947a1008cb82fa6d3c80a2baef8d45ad3e3b569f07ade21ee771d735cafd1672827db673035a6ace5481e1788068b1e6cd85f6ea9352b88334d94fd402bbb8323621fbc71308433738463180e52bed80c45bdf18e938b95c36795d7a1b57697b9968877ef1fe82431309513e92a37478dfd57719ca9721cafbd41080a9d0317107a364e64d8490ff7f9328f6657168cc552aec4ec1d14fa72c65263c522b489920410a26ca5a65aa8cc616c2cde98ffa1ff3e3a202243935482713d912364346c537c8e30b9c719c34129b100886d309c2caea520dbe86a782f911c77c1e344143da23406971f2fda94787a97076739fd9133b86d0c29f092699798d132390b442bda62d74fd282b0fe36a0127e04cce78d1b8676d59fd647fef5b9572cba66899f5b31eb95f4b8051c71df3dd6e543aec4c96007e7404686a97160c37c635ebc8fd5f9f3a652e57a2ab8c884e02c3961f73d792d69f5e289781976ab3b168f556b408915099a9797c33916e7678297deff081630f801e8a50854531f2376a5550e8461a3b821983fc9147ac61fb4fae00922f6b353c3b2931c759a0461797b76662e073321ce953de6d838d76252f61e786dcb396415310cd3ba1ced102d42e91cd387db54179d7c2a3641811cd88a2a224d50d5aa162e03c1a692c3759433c4cfe2f1ddd1450f65104d21cf2c18171ad88b471fa348543c06522714a41f92adf46f2d7e582dea8c2eee0bfa064b7c0318e68330211067fcbd4d5fda6f1f6803ccc5d40b2db280998c8980a95b85a1291e02cbdcb5de415b0ca5d2f0e25835fd91dda42b72f80346aaf4ebb148f8822d6fd3781aecf2e82ab766150073f10a71a75bff4842fc4d5a38df7d0869be54672cfc9c702e46b47e41802cad48090b809173c3eb1e5fb6b61ec83c0c0d6ddc5b1bac3361f4a2ee954f1f8d322a4d366e98950ed01cc0314921a427e0115fefb3eda5e95ef0b3787ff7d164843ff39cbd770e4d1c15f4e0710829eddf09fe0221dccbb75b0c40df3f2fe36c67b194716ea230311fbb78af2b4946bbd9002a2c074609729d5941ed575b532e86e4748cdac5cb73df6355ab8e97032c4566dcbb62652d35df815afa8fb4ff9e75f97b23113429b537a4a512baeff566321af2a5d1ddc9997dc2282b9dd4d950f3eed89304ac8b2a0d45e23cb3603092179367cc2494bf32c04ab0886639ba008b5f6162bf1f4cfea8ec98d4243493bb85e159df02375ca0c264ab4e15335be5de431439715442c127a6853e85459063bf8b654cd9b4b194ab6133043176e9af61f7da12a8c1bba80d61779b2a702271ca82efb7391df8aae500a7005c38f7979022ac3ea4f99b4b9c86c5298efa4fee64cf2ea9aa2cb8d37f515a4035921cac50d94fcf867f1fba0a6f6dc4e5716a4d58b719512cd866f2ec6c201982bceb5d8a39493849b1432d694a30262c52a90e7ef10e03cbd52ac2a6093094dbc767a04449e7315dc59c2205b009dc6f16d4761eed303a6b22fb17057c642c045fca93ac037e89d90b97fb526af5fd620caa6016e0081c75fe6d5e160f09e6e03b8e8ebb5bc56c9b8845d534cad2f1f24196d406bc04786269e6cb1f91ff7cca9c431b306d162680bb45f8495bc55b94c313da3172dc3aa6e9478867241d7fb82129aa7873cb810c662358345bf404e494cc8f66e52ffface8c80aa90f288dbd32c9133c61563b5c7ec7a3341b52f6a14ad0e754c01924cc8b46d1415ebd41fe9ca4254ad9a6cbc292ec048c29a570eb4e1140c71f6a0cf5fdc2c4bf0d84a09a592a2bd8e896802f41ee6b8ce50e31e9ce2cd911afeffc6f377309ec088be5fb03964b24509f82fc41db9c2025450900923884e316a1ab7022583ad9ae4c4f629b5d7b07da702e057aa060022427c93cb43f98920a6dd19628e580bf58f407e49a1ce6d8bcbe10e307c64f1f5870fab375ecf84297a291397548ca2280edd5c843c02bd6f4062f49e50577f8cf4f5904a4ce7165c9aa2565ca447e3e54e331bc483cb6ac8d690683079923cf752ba7f4d7ecc3320d523db748aded1a8cfd4d322cf94c15390e52745a496174a9c914753406e3c2568766acc0c44ce7b0c6dcf9c416ef2c8b3b797948e1800fca8c4d67be7290a3903045e6ae5af65432a75236ac1257060253dd6dba9a68356682947cc098a0366e594b4fa7cc8afe0bbd0907ca8547c109569877f0621cc2d9bbb9d8fca0857570ddd48170efa12ea1df4fbc231a0c56b0e82c6631c17c06c5cfd5bc5e8e68e2b53e4ffd747537a242da0d1d3e243078c80c71446f676203929490c6b4b49c6703cb504a748ba44b06a68aa9e898cc1a1a6d53a0ac26ff4317e5dde1fc6655b3790818079c5e09585902636697e032c8513a9b6074520f2c6e330ca82ca01de417da310a16d445ab85a058b3b4219a6c2465536bfa77b5c6eae52728f907f8dc81b47f10e203717ddc0be3f58c2b882b3c9c8f66a4ef2c9f1b01cf02eef3f49f28f3266cc5bac915ea46d213340d45208438bf2eb438eeb8a35130c624f9508d1f3cb9b3c676897c121f524fe10c8d3c4164896a6ef074a94943e8c0f7eecdc8ab9af4a6371a20a798ad35b4474e2f39cf22eabef8650dcbd32b9d75bd6dc734fff4a1972937981e75652d8f0c0a24c77a404de037ae00955a52e96c2a008249ea51be26cdf858b593bc7bc5d64b7ac13d8f44ee44a26a35da980bab5cfa8d8c4310e72f9e30815e12b0ce35ad4e541130c9979580eead8c2cf791e3166c5358078921d3b88cc077df667d62940c4f9e773cf65539421c021009a329bf38e07c244d5bca5fcb1b98738285999637c1b06211ce56496b4b2632fcec2e4fb950a6892dc2e32611873fdfeb1d42b6f737bf828878c71552f7460b0d93259fe9602cdb7e62efa3ff35138e0458b7f0a9e22f9b0d70f708324a071daf447109980b9693ec12f861f252381e3f5a85d3328f5c3460083ced6f8cf227ae51a64fdda85662f829fa0240f06acc750125f17713f6f44b9e67804631c6b994a1a949149492d71468843f75b3f5165d1cee0b1ba013ab5d50727328b228ac3a931dcdb7ba750c597cb7f79088ddf30271d0a7f66f9301b5ffe0c8652d886a4b9620b2ba6339445b20f6884d257249cf42285071e7d462e44848ad4f8218d240b64011ac694b02359d25a539bd9b94287c3c8a33698642338f2a949a73b16240cb5280766420a376884482647c5d741c600cf213f7663ced013344149164698300a6beea006310f3b66d1c632cc5770996ae33cf87d055b9afbceb66b0d794f7fd1aa518d42d570e508447b15337998e0dfb9d640105f9c80e74206857308235d8cb0c0dc3f778072682870208ae0a10c8b5260f95e4398d00ed9e7f4e3be87a7c79f6037d24835b4742f6486a97bce7b511904c7da486ff4bbdee62e0a338516ff1758767b92d21852be0d4fa2444eb92f9b06122d89bed178340bd5aac431403911f3b3b10e442adf605642d339dcc69697a74fd5cb63c357b711ef49837fb60a75ac6b8112e4037e7789e58d8616bb472223b22eb66c99751860aa10fe27f9aee5fcd23f29d7b96b6dde9408c7aa0487a1fe58a3cbf0e825c9e490ff84100948837af947576633435a158411637242079fba9730bf4016680179577b5156b510277f03617b416a1d0ba530ef913db813dfa0a70b40547fc0b79990091a507912786e22f9218d7537d0f526ed5935d8649d6401151c9bba605e3d47b10208b93e9dc55225ee40491a84958d253a146452061d5fbc16e3769e8e9daae003d60bbd7da600e1c24e06ea4be24bd9afc1b3b6af1b02b0ce9d7e984aa465d7bcbe6760c58418d8244e6c2fba5177abfddf947da50f1c8799ec563a39aedb550e6d07b4f8c3bd2bbf9c3e62053926b68830b0a6be1970d5a486efa60eface8e1fdb4d66f1a5ce8f0b746b3e1cb6b01eb37bf0c901cea652f09d74db20abb0150797235a66a64c29dc6a58584e0b5565cd0a0c20d1b6290802c93e974a06804e84d36d6539f35549bfa75b4024987d7a23160882693204bb210e1389d870c634521bef1c297f0305473f329033de4e5a7f761cae781baad249dd04cc8f9d7fe2b4839554395fed111305728f73235dc6e60f14841a31eac97a751b48ff008b9542e7b6ea5eea7a746031dd713cd19d0f2982c2efa3affcc61193cae0099a805a303918c8bc2a05aed3d26220c348d856bad2a98fe16ac2f629b0c30d72f940584e1bb5c850f7e74b86260bb22c1fd4664636497e340cc5a53aaf601e3a7743ff78f01f985457b3d4298af150e45d1e4640ae8c6a2472b2f6a7e9039ac1d6051732530d108f9fe81771a180c034ab1786e6ec76c844809ac9deddbc2edfcb248b18464934bc662fb94ca80f41869a18d60f0cd4e2c0100b399d734fc5c7e53ae380caa3dc20faab5cdae4b6fdfacd0e72ddc0651d35020ef9ff19866059058fc2de97fb54462dca08ef44ce20aa0a7e5575caf48e285efcf3184b55bad3773bed2b56c0857fdb38cec244cad3bcf89204bbd1a86874aa216d8e649c8562435de6fdb2e1b1241ea295500c95755361c909a3f18013594dadd1d873060aec9254becbe92b3dc64617afcaf88240e74b08542614a4f0f0a0a89ff05b18dd4fe8faa5d65bcbe33510428a25676191198c226837af7cb5a1abbff91cbf1f21c0af51f82393d53f873242261bb66e7220bb094befce92f767e9788f880eaaf34037e9acfdec110c99273d1eb025f2998b25f1416f10c115a278fadec6e143716c1e902ed4f710b2bac483049fb88a99a51b0d23146064221f285c0b49aac32010a04d553ad5cfffb121865c806454e96fd813acaf141567460c891696b651410a367661e7a0d63ad4d15b93bbaead187e9b98daad979a7d0c6f195f22ec6fb9da2b3d45a5f58832ae3043a2431c7408071dea4056042996fc968b6675b2e5b3940cd94269b5a6f43cda0dcfe4e3cb9b67bc9e68fe207ef76a854833d95dd2b47f54b37072b7c0b86b4c822c04181d89af1c9a80748eb05a68565618ef61e8dddedc36f65a87a8a5363689f16ed15afa64d8dc59641f01db6f96f675473f4f0161e184840a0862f3f4d5f167277d03d8df19be6f80fd31f3becf99f9f366e6ce991ddde0dea2bd442b448713122c4c9840f7fab904080b222c700239d118e0863073a927af8fff90821def84b6cc6a811941e678007a5a7729b5d5cd4b193979e110f64f00a43b96079453fc014a73ea65675d4279d1653107590379e85fe21d580521e1ab012fa2c8ed661333d9094d878e644aca5628fca0e163550c568a8845d36e5db409b1a6cfe85783fcd154f7799abfff6b7067337827bda9e8dd8ef51714a4bc9ab440bf5ed04fd426afdef1ddcf59b48ac13aec1adca00d4f6f3636780fd73ac5bb7da031d491d27885c51343836a1030f3f2e0b63eaa1ee42766e9cbb1a730fd02a2ce3318f3be6ec5427fe19660a10f25a6f5c3a28be4cb478ec34c312bd80758dcfa69480b568ded8dbb8d20b240b0b21f5e1bc73dc82e660a05d850b7fd93f154f06015fa7bd9a2ec139425ceb95a2450b0304182424b40db8bd7ce0137f3d380e2495d9bee392b6628a1d05adae822a902274cfdfcda9d7912161aed32f3fd4525a730fd2a13099eb3e5c6451a113ffb81fa423571c3f3eaa2f97207934528a22d8a6093b458def611fa2003e53808e5b1f642b9633c84827c643d7d13e19ba9e03eb02e8699a2736451f7929c8d2246c5363c1521f2dfd6ae3370e2981e5c64710b1742d1c3b18665e2bec7df15ef24357b3d8ab0c596c7a930ac1b50228efca72e192670d61654b610c4123bd27de78624be1521e39f8b90e55991817d8b99d6c691777359bc28b7e1ad32dcd4add79e0aaf4b5b7458ad10bdf0940cdaf89996027b70a7e8494415d969e12d9b6ee9e5b85a64cbbde6fcfbf491a4b6e0ae43bcaee953c24b88b4020e48f43e65a41fe98d188b8c5a54a3166594227056f58bfece0ec9061481aaa0b14c63b42ed9217eccec540d73d690a41045531edc7c503c482a06fd8cc211a17bc40891617a267420e0f6c0905b90b040618228c0c501595f8bf4de40d33433b7f6d11990815e5042d306a54ca944ca5d4222fd55009f88217e06fe428f825aa58f75b43dc949e09dc385bea0b432d7ee72584360a767720aeb1ed5d899cdb277cf068c81a408a1274911b4c02bece7e15958528e294e77c86bb1fe6a0f33af8060c2024b406fc2766adbbe49f23c1718291e018692bd913c90fa4cb2e532e7525921fe111e19052a703ef555fc7f2f879c5b7fdd47f90993bf8020a11108a4ce31f092112c4f89e2f69bbf5409a8abaea24ea56aa92d67a89b3d254d4c55ad2a35aa6aaa8e38380badeb018475cc6a57226d5a27d1cd15718e1617ec6eda0a5529dc614324f848fa799fce50320fb14fb6a209e8eff9bcc200165db9e5dd08151d3fe49f12c2d39075a0164cfc1b2e2761e18224a09058c3e4e7f6956d94de5993da3748ad4869a5eaf823a6cfc1dc80cf154848b01001b3a613aea8c393cc689cf86243dc39e1207266390e5f62982161ea282a451a6350c5f72c58ebbe1ce3c54ff6ccd93967e667e88cc3f769c8d7ed8411b4c2120cea69564e496d894af4c9bbfb33d44a9a7324a63a71e819c812b182286541f8ba1cb663403632f64381c6cef84021f36431c6a83fc2f7f8b2f640ad3244ab52a172c7aeb6857d3d4ed9f1e7327d0f5bd7ef61ffbbe2d0765446e6524a56c892b3781ca7ea848192d1b5c7507b796868d504193de0039896a2aeed0b96337165f590791cdd47f270a3f3cb8cb90ef8cfbb76b2d0504a8563252993496cc88ec6170b177569d306cef8489dfd1f639a4244cd571ce7e18750045750fa8610965b82b2e5a55623a2e7b1c6fa171ee0bee08fc24cfd298289ade85db7811484add987a63cbdd778474e70b968392500bee8cc414cdd8baa6421c23347473778581b6fedf1037bab8d719682f3e72ba75c96973e67e28b7157e5c32d330cef421446cc228c7b2e8553be65bd2b11c3c54fe5541d809ac38b93d09efce6d7d4033be45619ac8cfe76909e6aea39136d9b6b7d8ef7bc33a67478b5d4732674342223784f03ec29e9940ee074a12f24d15f006b0a117949cf928b398a9ec1ce818654f0efb952157a33ec2d926dd0e1c8fa8a65437d56f171cb01895f6b29ef5aeb88059ba2c306a550813597c1d90bac03079eab10496ff01a3dcc6b5445583ed6eeadb6e4e2f91807348aaf2c8ed16258cc9f292cad5f8a68caaa73cf54c1e4dbcd48969409fe152c0c9c30f7a20b4c8432e4a0dac65b406f4641d163a5e6a02189c807396f1049191fcbd92ffca919afa9409906d79c3a7dc5976a0609dec2afe4189e6915444558691ae20771bc9c5c0dfdcd58b9ded0d5dd81ca6db296f1d4064bc5e1288921f091b42c0568eb29cd9d0afa9c284f24823f33ee942106109f2d702b62ce7e2b1a4b52c31311f3244a8e442c7d791df3ca2cc5484d25a3280213f0d8512e4d11a7d8f996a6337c94a4b68ee3fe83c334982b00186c238c912b0ae43e53cfd0d285e4fff6a5119302147def9e584413537ee89463ba177de9b2e1df9986278982cac37df07a2b6e9750a96147ec7be1c22f0eaacef4cba7d9fed5ea7bdebbf1408386577577c52c68d0dac63313d38bec17c120566371412be87a008ce9512686072e6a6357a389d7e0c0c5867603174538bd4afac2936c8efd4cdf9c3750c2797c3e558dcc85fe4b0139b0be818e5b40f5e6f829f382826a0bf8f0915ea0c3535b44da691f5b16b1ace8724a4f0b32c28a8c54c7e1ddd3853da627cad66d13cfbd7583800fe72ff48c77f9be6ec2e28723d717d81d350e63f9e9b7cef308f77b9c6aacded025c1d0ab73c204d743013ab4a8761f6294ddeb59bd5f0a0d152f55ec04ee3c40c663588e4612c4ff9e4f216ad261dc9d6c55ea10a80d6d5695bce092736013b5d57f2721ea284ad9c2dd37728a3ee0e42c61ad706aec33de4f9f5e71c8eecbafa30dfec49180b12ec7af85cf3b008848bbbe7808c686a0de3896c0c34146fcfa4283d3b3d815546d52e7f2acd8151737fcbd448029633838a71477446410af3b5dab3d754e97cecfdf03f1e6b8ada3d56d275f7fd469a74c8d27b1769add1766273a09cef946776c243291fe2dd4209a5452d642fdc78e36b0d50b93876b6adcb6c684eaab4b8e4d4541ab5dcebb798e76030d2dcebc91af556bae2bd353b0bc68ad81868744ee383f7d7242f91d68b7711acdc2870b269fbc7e33c45cc595da8f91085614d1298ef967505c5566927be62a5ec7511411608f42ff58e68d2c16e55d7571575dd465d75dd705d3455c869489f9b9502065dedf9555bac0a0a8c8bad8b735e6d929ab8b410a72674571b999eb8bd0951ef68475e551a3fa67499b24d91e53d2f2fadf68b44844e8249691343843df5a93a19304659d2391bd7792d0391d30fe8d8564d12131ddc23913107314fcfd1d2fcb8dffe37cbeffb1e9ed38a1ef2551e6acb02c6e5487c5dccfab19ea37cc287b9c7ebd6289cf4574eba18aaa189b115b94ae1e6aa88a3103f145e8e8a14aa95a33ef1780fd7479740e45c8a889c22d8158c9a8ad05e1c1c0fa485ed84a21fd1e6b07112020e033c4c4fc5ceebc3c6bd61286422decab0c1a484f0b4b1da98cb9ed43930f4d9a954eb088ab69f22ff28ab26fba4e9c4869735bddb16011111ee349c8ef018ae3aa9ea25ab7e09c9f43d5486925bbb0b23d2f5c4f6980f005563eed464a66f8c11c585f56515ed783d074ed8ec4655ca72b194f919bb668870a8497c94a0ddaea0e58846b8f3395154502135ddd01cc5877be443b256d86d1ccad354781091edcf23da9eb185a8d5b3577d8a0efd1a2df41074df237ec41c9d841980e1e0a03372c0628817a7451e0a27a83b9aedc12922625f52d4882bee00165aeb9d89cc7fb166c67eb431f752b9c30c13e435a08a4fa2f23b19262769c35805d058e022095ccae36bfc1d2212232b98e8390a38d30812d682e6bc53d19d987e3de7c3032f24f5b758e819908b067617433680d8c970fd4c4112020f493eca12c793ebb0234cb3afe413eec57612eb280adc065105612d00da55fc0e3431ec657bcf481ca2e15f3883d20648cad8189eff60764c86409e42444ad679fe105fef18f45005476ad18f7fd9681ff1a3f35ba60cba81d4a0f6b416074c35c6cb3618820e32593f74199652424dd56e044ca7a50f06400c6ae924b4848b2cd69e8370371ab22380fed13521fcea404e0d081dc5d7a188cb0fb59301ab440acf93496a9a0a56acd27733e12f638a3b959e3063b71772dfbbe2b9fbfe9d81b6d198b9896f454d3bd64eae7cae6aac60f012fb338eed253f215868a2f98ea603ea9621ae0b6af427b4870854b3d8752d36be134141f1259b68a23ffe49fbce0ccd77146446c19282220e8902c2fdda1b9462f373fa5e20e0c21c34fea494bd4f07dd92b2023c1042d21412559235de6f5a8499e6f1460db183a57971705bcd58d3865f126926f04ef368c87d0717928ae05f2c0c96a2aafbab0f174a05ad77326126c774a342b312a99b13369e0515895df2871e39471ca5746d4cb9a1e6f0ab032ca82127a07bbf6194cd59cee6a8e6133bf5107439c383897b9f5c4232a8791cef59c374bb4eb176d8bb25aeccd73f91d190a58af641b2e2965e5eaecbfa17c3cf014d9504d3b7710ef5eee408040ec81d64103259755e513a1713cededf98255e34b076cdbbdb28b690f2376ae35801db9d29d808653f09a33b5f2c1b88e5054e4af15830b6f92af7144416209da0cf0c48b181d3c867e8f3ebf0d7d3808c29e649655f6049c8f663c39ca3ba54931788946077a74402989be065ec48aa61b7bb53e8320e0411a21402ac60971e88584c0dd75bf86bee9a0139210b835435ce4d39fc548f17f3c5d06b34bfb74464fe0a50ed1b88c3bd114d0a8230631a6c098863b05e8a3ec3505c3c39b11c904bfb0c93f9b2a1250d1552a51bec1512b70660c600dfd64573807f45debcc5ff6e803e3b071cd51a2517d096f18bbefa1a3cf3c6647811a4b937942a5a81e23742f1f32bcadac42ea2b4b0f2dc47047f32d0e7c83cf513d870327e073bcb3e67654d02288a0ef82b92828ff04fb8622277186685fdb207f3b6947094a67d6b9e99529c82e1d3972574dbaa611f136d8c8372a8a2e920f022d578272f9886eb03b9172090fddca453ed1bad375484d4dc7b9c18af5951bb86f0eb719e419e0fa8ef097883d7e3708155fcc63dddd573786a7f2771623e7ea062908bcdedd97a8eb598167f1ee25382be0a94a01785b73997000dda359bb54f6666d31fce4063bfca5fa1c3a6b3c591263a8c9b940697476167736dab70bd05c826ecc318fd26631c9eb31504c203b281e4520aa68062045baf321e49f9a66a9b88a77cd42a5bd544aa67ab8415dc28c73e3b38fa7e9e90605d6cb1e374c7a991da639c5cf4407260b3ff3f983edcc0b7cac60ab52108b22fb96891b348ead227eb2c99e03ee666b132c56c68179821b7c38de6c164ca4963c737f0f59ad8d1e2728e70647198b3ec53e025545e1b4ff80c77217074e3748275eb39d921c8f67c0f27840cce62925ac1b646ef1b912f660dcd26ef0071795c4010ebfb46e05a96c278d67a41b24642118b52a1ab85a7fa30d63575d3d5391efb1e41f1e8931708487f4e2ee3a83989dde0979a3333c7a17c900736e709f63fa398b645cf5461afd984ccd19b9b5efa77434037a41294ddd924b37c818215aa88b4dd3676f27f83776ea9e6d37d801fab0cb2190ff0eaecd4bc20376a75c7949f9003ebf22292c680873807124fa363b7dea47e702ca194337689a57588b01bb3bb828b03b788b969122d47ef1404a286b0dfde6114e0d23f55286013c8c8a925fd474952593f34c594f9fc84b1007a6479051ea98e8066babc5a934236ed04a688d240c8e97ca11e316d41ac9c6a4e8fffb641946713422486262d5f63fdc99d5133299585a43841bd4213937c2a33c6a1900f526c0bb8bd1fa15a0fe690c9c1a52a1c240b3e7885ea08c17987148a18552840c770244c8ff14385526bca81f3727a5084441233f238291d08422c3add85447140dde15be14c3694696f4d1a366b120728e9fcc523b6145fd7433294e4b0483f4788e0a0696eb62b3a79d5f70a0ac5f53afbecfde44f0a26e3e24986ea72d11a4de4f302a52920c7a487db848090998440cd20eb57048aff25fe29c44e86e629c0735075d3195a015905c0d388be050944c7705d22a69301ac81d1164c462b3a202a76082acc1af4490e11e1ee3ee602990a70a8bc7c11027e22b1b11d48682e12ead5be2e17c692672a383d2058ca232bf41c53d72a61a28294fe84a8308fec0f69c8a90ff85c136f0b20b301cce4c93395a99b4295bc017ef9236138a3438ab7c86e4b60909fe1168c297819599c8c0250db4b2e34133cfc84f6af87a2935e76a933dfea481593c20654a9e521f5fedd95b0c17f61505e21130e0a4d5a79b6c2729e36b1684fd86dccb090b1157d259eb998e21d1b911f99e29900652b9a5fc29627b758d07e975fa9628d24099638c209dbe77119333fce2177069e2c913d514722d34f01d33c8d1b43f269ba0fa40696f0027ede7ccbe515bf8afe34639f243fafcf0912bf18caea1b96166d247a94d3c4fbd4698ea2e61be47adc7bbc8932dbcc1bf85835e9e5edd806da1ce4176850b293dc816aa181d50289619a0b894a03a20d037d47dded493c12ec9d98721625601ffa8a7b69656fe14ea81d3b986d984e18318b277242339f9f432c891d02fdd8ab35f51deeb793614f01bd2095bf23a20f1d7b7c4d79de230624332bf2e22442b1b8a37dd55452c839e62b6c6f85da013c8c53d503b5566810fcf77593f49ca162730999f404e9ec8620bbe4007737edfb3806d3b8980ca51c7f9b42c48a6fb33e80bab65d86470924b02b875c1eb9ca9dbc0547b561f4626b98b2e26212fd48bd48f604c050ac67054acbde1009e7a993434d81f4d0b4ff79f9c8f50e22cf255d01c6bc6e32582f9647c7fe17c828155e221952010e7ee6596099d5ef241f3443d211cfdcbb4753838b3d661e1f7b48eceb4bd833bbb739834986e31baf99a7621c78c17d30afa56b6227a796cccdf394832d6314ff07efb16d2034273db3175bac600002189950ed99164eacebe22e0979f8533b5a590d379652f1bd63a6f042ebcaadfd366f32555397aa1e5159abf483c4e67d327e5c298c3bf18f5e58df9fdc146c81005589f7ad93523b1fd7604086d6c418af5dd2b06f7e99363c319fc8a58de130a6b2d7a43e4db7560525f58a426dc90249fc5a6ba10e66c485dad786706846dfb812f09b050e0a4fa3203ec8508a23ba159d85ff16bd273d7d1ca5a8c41273858896f17ea4ab85b860c64165a4b43364d4ac838255fd89e617638db6dcd8d95303efa725fba8ba771baec07b7d5f98829cccaaf32772a23869e988c2986caac8226910eafe065df84047adcd4bcc2d0a467aba0838f840fd234ffb0bb0f6c166b0149b1668a155bc299e7755b48a0447fc7c942a703bed2c6030c43ea85290ea725a5f9c4723e2adc646277bea57348e7190c1e967244fadee640f4c65386255bbde0011d4853777c750a2047d9ee8c7818f17c94c1bcb453cc64dc87cf2cbe1c491d25fa4f674904b1528132a09545024080a49ad61e04e9873436396c69a88ee27e1d557f197d60adc5b7c0abf5d377b893e0f262a367c4986afa2cb12af105b4d0568c492647fe35b296abc1e22397daa9ecdd45aa37c5c4d1795e0754830bb4153b860b8a8e5380de58b6067162affecb81207228fdd4ec7dd5a7b551f2c163d11c6292488d50f357c436ce3ff434c847b37bc602a7f31108a665ab8b3484f8671cd43239d8c8d4470df052dc22db6d1460388db6204208c4bf9702cbd77d0b275b164077b4c346e6afb38b100f0314e237877030d94a23bd1d6122d0eff0698edec4ce8fafc57178124ebdd23aabd6d24dc649e5ccf262056e9c6f9024bf2109046ce38fb3e72a0fab12d6c97300898f84762f5eaa17097102269e25d69b559c22ad7fb4b2be2cc2d5d91f9f9c6a55ca2236b8fc0351ee2d7c4947ced4f3594f3e22bab49753329760fa922d853cbbc7d344682ee547eb8740c120808bc5f92fa204d406c0a1c1c49f818363c25c819212d0fcfcd03e13986ca020db41d46ee0ad33eeb81cc6a7fa6092c9bf449505b0e26f193dbe9335eb4e2a79fc8055a4f55baf9db18f813415821c1375b037327ef82eeba0a915fda5307f1f8081f03f90f7db7d91c09fb81bde55c74d6d468bce98f43a825856f231de20933f4585380291271e0d00ab3c3ff31604fc3b36a291bee76781834d5e481e166e1f927e46667634bdedd433cee48becab1e99738b913901eb313299430c0ad95ba5a99759fdc0fb2d8ac138cf9841996610cacc4bf9349389fe96535417ca7f1bc79993221f39d74c3c2866ef94a7b14cf513afa2f4b3f1fe2da42cc22670f15a104287273c97d8832b9d66e50bf06b33a5868c0224dc10e26939097ccfc355a38cc2835796d188a3eaffc552d543f135ce79e957506f1c0b1b7d52230a0b68165d1caf2b6668b93f83d490e7b24ad0daaab254d5065740f057d385bf7b681ce13a4c1990857d87a89595d241dc34b9281a812def2271bd4f92638112623e7defb42c428311af8b6ff831b7c30c868d118516c025450e3eaf0836d1a08336da8e0c5d7f0b4a0e56f1c3e19ff7ab4642c6166185c566d634a20003ae449ea22e57123be62e5aab7c5b22883d7373181ac96cf479e68179be5ff701062630ff4cad22e25d6b825cac7d6c661ac4ce9e564ef4e41d1fc85d321aaafccc5bcc413a78e59e85ba72c15e2406ff3197cb425f19911bd41930dd282dba9e16b0f9f9879bfd22d331cfc2a931eebf5332cdf5a1fbf4d6eb3618ba7731ab6c337a28b18fc1370637964dae6413b1b644043b3e654af466ee4424d12165eb454cd0c82521fd68b9ce937dcedb38dbe3bdb310bf722f91887f7f73adb51688dd8791a94779981534d45651acdafa89ee0c8218e02961f235349b7f6125c2becc8b8c454d112360ba8b45396cf634ac0c01c9fa928814e2c72c74a02a74f80e71f589427f35d08de9f0f459513d7969bdfe4940c47b8125573928318edd8e812d1f97316c94ac72609ed03694643df52210cc23853d10daa5f47c3ab1c0dc8865e0668e145dd4f12d87fded1938a1e2459e1cffcb5296ffba07eaa63efb9672faf5cdc8245ae84cbe9c58858f4155aaca84a085d27ad5b1dbe8ad2092742fa86cab3b484258f5a013421b829a01b9427b2121483763626ee2e0e436b4c06a91cc61e8028ec4cc4de2c4f506ea3ae66f94de94c944cea1be9cf27d62f0ddd8476cb16da7f97c8063cd7eaf7d2df700c2d933ac52332c2ecfd4077c52ffe0de6be1ee64a0fa18ed148f1b3405498bc05cdcecab921fe00bae8ac28aec38d635a93e9990c3084eaec92f1fe8568667d8a6833f8ba545afbf551347dc8d3dd20cd5392899bbe911db9084e4e37a2f4ff883f091d342ec80ed5f481e689f9119567c3474c81c025915a5c645fa43f64263e0495d5a8edd44921515a09eebd527eb9768fe66c2344e7e272a40625aa4bbbe766c4814935d9bbfc304c0e98f633c61446cb12ba02fae5e8bf503a9d87af97ca40ba2a6f94f0553bcfc590f1dbc773c1e07ad10e696ed50247ee348a0f267d43fd0e702ce8edc16376484e4f166c88bf4c1c781c9002355602731a7a7a5d4a63da7a75001f3cd1f9a10e517a14d9f8f6c429f3dbddaea661bb6a732a9f3d4a5fc14835f122a5ff5a7b2a600f1d1fedd43bbab56519991be4ae44195c751784c5baf6524028a8d0f2f51651c3ea41be1892f74bd1e1ba96853c2de2a79ac8be80d86f16dd45fd889e2de3e12d7c965a87d0e71026f55789fa0951249cc468aec926e8853323e97d8bb0cd5d95fb5b4d0ac2b4b5856fda53a26446cf4556fbddff75c5dc6893417163922423bab86b15d977d3e37fb64b55ed76f1dcb638df2d3be297c5ae9fc04c47a22fd1fb470227d3dd96d2da0f58d9c24e2961979e16c8ac1860a4c26e7eb837a0f2933b2e3a19508ec3b033a432a785e3012b2a20e09b5d665a800a8f8d2e5cbb546b453219880598de934c2b737bf31c835656e24ac0805657986af2b4708710630b425115116218541729f58def101409688c9c09d8a89157bae6e2f1f919839d77f2164ef265beebda54c4906ec0742072207e2cb0b9ba28a498a9343a1f2d1c3623c3d438858266a29d4fa452c7da7d285c2641a73d83779a71b9c4c4c156bacc493bfce7ae17522a2a2322c6fd46094a6f3e98e1889c12c26199902d86c6caa5a016caada4bd599e9c8747caaca613ab1a22a4d88f20dd20d0e27d7e5bc7ce59d4c378688469c1cf5106634e1259fca1bb51934158dd28ca5e9444462697a51911f1dd9dc6e3933fbbc19b4ec33b3172fc61cde8b986c98139b36b7d3caa8aafce67364b564f513aeaaac9a54b3f68c6fd618f836b8234f19913630244e92ab6c906c9208f0eabcd86ab65a52e445477e842496a6237952ddd1819936371899f7c1c8b28b8ffab0c813d8c71cf5ef2d52c9d1963dd67383bbc925e085d279519aa11be78d29376c3a3b3a4188927072152757717239329c5cceabaa726039427262393c3943bef246edbbdd14b71a0a400cc9956d255b1159f9ac8eaca298525f2f9b9bcdcda6c8c6c8e6c806a9d3419125c0a8013c24ba15191d01edc47466d961623d433c25237224db6894da2b4a6d0649aded30d91907d8bc29824d1d58f7825555ced1826a4327759294b7a0297f9f223b72528489604278728abc287172558593836902dbdc6c8a6c8cb2cd05cb44ce5a2db9e56a16c230ec067783c4123f1ce0028895b4e714a25bd1c78e5ec4783cd5e3291f4224dbbc57f8caf92ac95930a54d91abfcbbab275207a623c453aec3a3336426df522796320236bbdb8beed6e53a9cf56ad803983c4c36890a4b3875c632abd12b6d6e0928914560fe054cab441679f1e08bf2aa5294895af6f77254aa544a4c8d396c8a3ce5dedf27d8a624f274709cc822315f228bc83c8a74f5b86455e56f9271f900cd5cb16ccb44f9968b3a321b9d5c3ae4a34725394132913ab0aad291e910d139921a517017cceb9480e27400869bc577bd7ce5dd3007da1a5d3bcebac1e9c02e2804880735e489e08e244006b4042797d29155560ae7a9038b31a1fe05782aa57056560ab7146e2f2fa589ba36379b2a97b499c286073645226943854d0f6caab031b2b1c2e60a1b1f94489b2390b4f9810d104ca40d16281b241b2db2bf0dce11e02f489b2a6cb0284be8b1c182b28c2a1036b7ca2aa107aaf2ca5a2d71957f931b94fd0637849a125b11657f33b52a92d9dc0450ae664934a8a7fba1cdb2797b4a600ab7aaa21104ec4619f782842113f0aa0980913772a4ceabaafc0677e3463770e48d1ff246931bb41b415cdc40cafe37b2a0f5555937866e1c7d118a28fbebc694fa3271723e38399c2432e7755656ce8e107fb2bc5123000d36b750d4c181b6a43c7103c549e1ec1a29dc522872d68b12c79638b9267072f9d6180e0d07475be3fbe304392b13e9c06e703ab01b9c0eec06a703bbc1e9c06e703ab09bd184976c7ae981e9f9710164d87d7ff14b8fcf4724f78b43ce1e7c38658c39eecb88319ef0926b996d396c621dd84b2cc6b800ff6c7763d93b99cdadbb5f0ab7c6a1b4069572cb0eda1cf68a3130dfadf661f7439130e6b8c1dde06e70b44561a6f77af1f2e2d222120009661973e0e4288dff00b0c0a68ecd2dfbebf4f8cac4c9658709d189e9f0f8e3e4bcceeea00730404d8d121880193beee7bde86c4cf5963151293817afc010334d6664108309b03f17661c718218a427489e184102977e78b2c30c18c8d0e209099ae053a642405c50202094c085688a2ca0c801c6990a010955011a420610501032a01c6ac062a6424034c8b80187b92138f1813bb961147641314183206414c1375321272a10c22e990a39a921461578dc22860f783c925105bf8042c613f82553219a135c03da12ec8292c12ea1916ce22fa9a0074f68c1e426050ba2c00105370c11c4840992b4c008154bcd309b5f1b1262ca098888020820820c418913d8c04516371ca10a2a3176406341d8051249b41c68425e4029a5ded58ae082947a3c219d5102f3cd61e7e52edb1c824e4b390ca957ba780907380c456f5a32d5b2a913b6d26aed4c14dc4f334caedf75d55afb62676badb5310bb017c8d51631e3323c6fa69682a97636b376a62241f3663e195ef7ddcf7eb6ac99114ac174f682dddd549280766689991997e1331595aaaa9c87c9b5ac99819282c9335606a752349c25832a42c5643a738b1245e6b4355b7ba14addddde791e892f1137290744bc7441440b56806640454aacb55d14255694b928a9c1ebf65a6badd65aefaa92972eac12f65e8fe24a3eef9352a48489764fca1729911181041167b59df7d17e5a4604cc1160297cc123bed8215779ad85d4604a1a2636a1811145fccc00860897da4bed85168830eaa90d715689c8593b6b67edac7da7adb5c8fc5bc61c2c63911888c8bdbca89d4dd4ce1e29600f1e2bf8b0b180d221936b3060ec97735382a770c0c8c4744850d6777e3628d94f148a84172f982c512263e65d4eac04cfd4a127c5f32ab95f6b1daab5ec5acdd6ec90b3be29df79fa897956300aa350f85e59165860916436440c90bc8c8c0c4cc813279c10a2abb5b432c11940956aadd57adfd7d7a9116ce83eeffb9804e96ced98582656aab5d6da5addf33c6bab055fb3aeebacad417e402549906aadb5b6d6eef3beaf13a24b52ad2873a949c424b55a6badb5b57ad6b3b27a8310c19391e9be5badb7536775566775566775564befe5356ad6241666137be0896320909179191919940cbeb487703d10b442d824dee79d54926c2153ed77fef77954922cc1842613848a4c102a3241a8c018b1dd4c7cbcefbe90015fb200618ac0bc00c6053044703f4c0b60828001024606f3030c0bc40bb3029821b89ffaa0821e7a6052801b86071917a0baef7d58eb5959f7628c42fda752b71b735052b455e5b556efc3d47ddaa21ba0b96c0281656b0281e1ca92e1f43f627a8c6ffab11c0110177ed363ff5b514f529657a1a5b03e587fc8e00327765c279cfd2f8cb628504c0fd3afbce981b8567a8ce303718598f41949c6f46079fc2c257e966f21637ab87ccbbb94fe53c6f4b3946ebb55554c9728b86be5574aaf957e56950fe1e3b5caaa2f57f9dfdb3f46b0595f32483075d23f44c8267552454a238e24759dc80ffc3003205c95bac21fd371d949eaaad4454717682edb27d8bc3710228b3960981fe0ef4d80cd7a66981fe0afbcf5ac67bdb7d04d230871effa4195c861a707d70cdd14275ce1b79a8b4c1f06bd3100055097192387bacc994cbf079bdeada70aceb3c2cb628bec6ff2c1a677036dacf11b267304f8772cacb584d49394aaae11b8b31ff6f4101e95e555a12a7fcf8aecb8ec5d7a374ae3329c5e7c194c1fbe4b15a69741fcd3cb10bee963fa7b9c5efc1ea6982e5138bdf82a9c4ab17c5a552a98ca16dd96446cc36a69defade1098ddb946e02e7de5b5de5a6a0086ae45da9ec90402921ae8bf6f3ff448b3c15a2ac1d0650d78df4f3d9309245f4f81fdf539d0d326986d3a7577a79ea97aa06d048972d9e591345bea22da016931dc4265f50d54e5af438679371ddeadb2debb7937efe6ddbc9b77fbffff0f71a09f8e007305cc153057e0936914c3123e9946312cc15c81cd3e92bd89e4ce7e22cc15d8ccc94e29c5f77dd016cdddc35c5563ae1a01ade16fd22ad96da03c004714dc557a7a4fa3c3705495531a8c468339cca30085c157757cfbd1ae54fab0c4a39445dbfa46368ed2f8d7ca72977f8974978eca0aff6f64bb4432a6479883204ab866a8391792ef81b8c216c3dea943d42168ab73ca8578ca3d9602ec319926b8cb3ee2a9951d64b30e2164450fb2bf0bf195d7389d73acc23ce575274607d874583983cd705426b8cb45b973741d0155f997e06787ba825add7198c31c1603cd39cc6118d567a60098e102b9be321465094fa645c8348a1212e4f0246b1992acb26cd890d9a0343e56f07cc0aff57e2dcd36a1ff6b18ba3187d77f494a41074b168af090ecdf3e2d1b73c4c084daf2109600c5f9c065a17e4716113bb2cbb608ecd9b4516dadb634d68aaf8d1c16b42dab3a481e2fc0f54fd8e181e52d690bccfe9d8db672b27f2dcb4166ca99cad12bcd7bc3b296d4f6b50c8622e157b28858c2de15963aaa4a4765b5cb8e45e02e9b3616f0929b6c40cd309e601f2b38eb8709a5dc650c34c066cb6495753d99ac652d93b50c74d3cd6d6e0b876c95f5c355fe4e9368d20f4ae3de8fd1088d445bfd98c763c0c5bda8effb48d7d8c2faa034fea18d5a6b5c44fb83b63cfb127cca264d7a798ed2d01002761e9b977d090fd86c241e9326651836fb6c22704157ddfbac22354e0f1de1427c0829ffa0adae95e53b5095ff0aae0b309233f3501a7f7fb7d57b31b680abfc8f62471a0702521cf1416972284d0f350e029ce536b7e1441e07fbb67fbd39c1730da5f1eeeeee4b823dc45da860183a771fd35dc6fcbd66d3724fe80a0aed2528cb476d5ae3c0d035fc9d0a9b94ec48dd1dc303043f4685fb618f0ce8ec30dff1943f8f9db0a35d32062463bc320685fbe1ab00821ff6d932d09256550c95d5405c233849f6efa134deb4a679933e60681c03d01afe3647caee34980e88e7e011b43669ca306ed86b499b741e6cdedcdcb4a33e9bf756b1086d17987e2bd4539e0f65273b60ca95468edaeed4ba972505d260a6748921a4ec640760b82698f2477ee0665b364f8c0af64c03da48d027dd382e748dfea63a307b89fe71b76477ad266f1dbac78e511a3186fba7febd18577287a76ac814a5e9e7515936dc85c651d11afd1dd4dd3fbe1a19d047c85eda20e0964c9dbca01604fc1931d4e4c890284264c0f62b15aa2565f366f126a44e24543b6ada49fc90040fd9c5535ea436f4d3b45982686f170ad2c1abd720213949e8494ee809ce56fb440aa12753849e34d15ebd06e1babbdaa05bd0596badb6eb842e90bb2e9e1c71c10b5e8cc4ddc192cfb5464a6129ac0561fbc3931d3ccff3c4f1de3b9a6a4b2c900b3ee11a915acf4f0d56db9902afe015d415a158615961c1422c2d2c2d4690e1169716974f0b2841c80e1484cb8bcb8b25e2837a79f1f2a2078a1114db7d41c20b12a004b5b4b4b4908082b2e4a26e306060c040118209981898182841c4c8c4c840e1014a0df7c90dca2bbbc8c49089218413ba2257a129413f39868c1832847c902042eeb6445ec68c8c19212118161281dd62e6673e891c4ec228891b2a099f246cf728468c1831666666662c39e62049b20440108dcad41091442d3c59ef7e57002a388527afb5d65afdf4664f88a4e09ec0fd61bb146cade943cffbbeeece214ae906453007074cb0b98b7d58428d394c3ce6083f14457114619cc0a3c9643a9d4ea388c71cf4437cc2a611afac608c31b61dd93934750e4f64e7f034722044e2d6458681a2a8518581f1f46b0f094fb9e0c9f4ab0e74e539999058f894c857a275a31d2425d0a4c1ea4efc2ffef4a63b8ea489ec5c3d2f34799e292710c420b802822c20d802822e670f75e2e3f09b6c7a008879732fc62854aac2c215b25df51583c579eafb462418e4a93f8e0493e000309b729e4af29befb8ca576d049a728f5d219904f85efa7d6d45f73cefba6aadadb573f74cb8a5fff154d009a62fd59a509a3a9e702a634c65919517cb98b12c2df155e9574a9b02aafaa12dd1bd087a63e5fde912902756592b25b8c30a4022f6872ce65209c6c617f6586581b1aa72bab22b1bf394832b1f96a6137118b628688a5bc0f0c5ab65ca5335d7017dd4384f79d9489ef2b73167751034b0870838f3559321412e3bca25258e904dd04789a16ccec826f8d9047fb23f48cbee32c1af6dcc5766d7b2fbcaddc3f9aa71d9b444b0c8a63d02846ccef07e70e4abc6d196e5a13459d095dd81a6fc6347364600241cbc516185116d795f041f5491fdbb88b6beef0bc3f1fbacb5d67edfa52fb8e0a9efebefeb1047d7fd537f4e10fbdeb6d65a6b639e8b631c82b1f07ee0b60e284ee7ba06116d790f963d257f6fb614f9fbce75ee23652ccac62ead896c6376a4d9582c5b6badb53e94fe236774df0fd2680b1463b4d5bd29f66063beba600f6dd937411fba97d3aea5ef5c2a697dd5d259b6b4b123d80463b1da2393f9f8a4c018183b53a698c971f01066faad780ebb8e3ebef4663b8f054ae34f9152306cd21b120b434bf2ed24c73da59452b0ec5769d6a452b557cc0ef0adaafb3f5be4c095367a7bf35557b4005afba9b4f663d25ad7a5447b024ba1389acab63974589bb3399bb3383ce59debdce7a520e83d5faf7b3146a1fe53a9d0dbb135c85553ead0cd7b99ff63e257fffc6898900e68ae19c422452e243106c8c1d53fb495a3ad9cd389f421b69a1bc1a7365661a61760d304cb271e9cd67db5d26a57d6377d955595df7baf8f1c1b9edfee6b942ab9c6ec28b2bf973e84566b6f2ac7d22ccb5289cb54362bed55694f60b32ea94b7c653aed8746135fb58b89c13e698b82d56f34da721aa571774255fe28d4ca8adffaa7b2a80bffe955c0e5a954e1abcaf10eb46e88a7bcf3eaedaf34a1df7eefc4c45498a7bc56eb596df5d5b4caea207dc3a5bd2acd86d36cd06cd06cc09836902aadd26cdc7374961f84748609de6aad56d3a1e385fa7fd55ea91b70e132513f6894151829826b866e48142e246da7f88ada1384d92efe397fc0ff86b2ff77da4e8fdfec1f196db911d86c24a3a3576551d7127cdf6cd98842bb56fe9237876f7e36bde957c85b55a6c724ae2ad39f48d3879501a406baab5df727d837f58f950cbf23c3916c2391fc4edb37f4d56cb4559fb68aa0ac2f893ddb66cfb6d9f3ecf2f36c8a61b37f7eaca8fdd8ec69cfca42796777daf3b4a73d1bbc8d3e0285edddedbe63686807a5693a646db5de61ee0682b2fad5aa7e989158f71491bb89985880cd7ec968b00107ca62e1d5383f7e60d4b2a3abf51779f0bdedcec28fdb4de6df7e7b089f368183e6941e9672951e76e32a9533f5150436a951adb5deb08a382a2b03eeef2d74814d4ab482afbefb6dd48291d18d0da3166acc03fa22ddd74ed59135657e26b35b140cba0a657a06495345b05953836bfd66312698f20a94c6ffb25670daaa12a0389d84d6f0574269fc472638e7512bd0968f4c706774b4820341599db3d1167d92fdeb8eb3c4774f810c55044e923d67243ba52ea32d96ecef41ceea1855b927b923f9d11dc25362ae0abfb9a0ac4b03c621fb3b0ab2ff0a115c7ab363e6f5232644e1f7124f85b98d7a465b2ea3347ee42c27725512ca72594d8d4a45923060cc40d09683054ff9600b942bb82c05d8ec5ca9d4b992fbafec202623e2ab238d63bd6b7c55967b4126c3e53a097c2226b8b3498972a65de3fb2454e5df4e5e1d05d63399cb2a0be532975997f5e0b1a35de632140a954af9290bb15daac0b436ac71c881f64ed740c110da879d4a6b38284dcea33adb6a1273c066c35030987b093828cd8e9dc6c9b4863fd194273b9e613094f7aad692a65c4d43c0262dca5fca6b9d71e94da67d73535303745299006d55a3e78208526c680195d8122e7f228829a29c208a9f1d1b5c2c5095bb3f31e2c8932264907b9c800cb049a978ee9a9caaa9a9a9a9a9b9815f7a020d1f34603881692c1ebdc3086cb3d96c361fd4084aabf051df47657514b65b15b5ba88e309a65ccbb6511a1781c026c5f50c625d8bf519eb1974cf20fb7777dfd028ae6d6deb3645a1999dd95965e5cc7268cb7372dccfa12d53763ba32deb0465b5cfcc26a1ac8655d51042c08ae8b14ea2646f25b0d8e79fb5af1c03485a2256a60365d91bdac7cedac7ce3ad0f9b34b300c930db84b2354e51f6b9ff68961d3ce667666673ccef33ccfd3ceec2c14a247134cb9da80c104ee376dd47a7554d6b5415b9e0336694d07add19a8e6e88f0298c4c2dd863a9f47c73ad5fb6d6cb5dd765cfb3f9fb6abe0dde5afaca7bedd77da4e77d64f779e247da5bc18ff4d2f7d53aee00926d1882a6efc9afbc98d28064ee1b746ff51cba989a7e2c7f7c433df0c03583f3c420c985c43e1053d82d7e6ba0be589a602eab9520a4334cff9144ddbbdb9392b0e93d7efae0437cf5f5d0d35a2cf1236e02d7e2d462079bad45f62d8ce041b430c10d5ad426427761430ead454f6bd1d3d3d3d3e33ddee3b7120f0c1622d1a02d775865d170a78169501a533669745d37e3521ab4f583cd86b90d032d505815304ae3655bb6cf0ab04969ac16a8aa8a2a5018805118ecb4411876d65a4a6badb55a4b69473b5b939a71694e4e8e8b48d8a439eb3acff33c79d4c43e22d46a6b7d0654242870a28b5ce47b3a4600972f24f56740f21de33205aedfefb158f9fa384208133312e480708001dd9094c35328de800837a084d4035151f3a119880a1a90d11014ee7f1f0cd3db2d1bbcf7ef1d7bfc2800cef5fd2d859a98e2423728ca2ed4c4507677eae303a86312dc1cd003db0e9cf8f020f103101a1c2105321bcc008a931d907a2b0c189ad2820eb119363b26ea60a1b2fe466f2c9458d0371af8d20842edefdc73e3a95a6da0708b3cce93070fdaf23023c131267cb93e98c56cd293472dbbd35349d8a441252c80e27ce07e03280e8eaee1ef3d5013f97150dafd4a5aa7f5f45a965ef43c330478f4f041a5a8a458bbf276e72dbdba93b6aed945d19ddd94ced649d1d5db9df906775d777667d7618c310602768905b77b3146a1280d472af54f23eaeec15153934aa1282d07cb82b21c0654455b4e50561bd52448fe4681ab3893ecef529be2abaeebba6b9ba762889190cfca6aa3f3b2c4d2a7b8cadf61101e05958a9a8065af6e596693d24e20f0579a6d3b7314231aeabce7799e77369bcd66b3d3cfee5bdeeff6b90968682693c96432d950887f05973f3a29564471cde035d400076c3ad15b63f07d9facde8b310af54f9fa24ea0b998d3b33c101726634c329c4f3df8b355196dad647f6a7a4ea4f4e2b17bacacbc89ec81f1872ca4fbb0bc4be93e2c2ceff252facca5f4d3d6f22da5d34aafc90c814dcf796e36f349c08a6bec408ff56737e722bb4073e1155748eac2552693c9acadb22aabf5ce300f9fec5e8c51a8bfb9b949a5fe6fce299546d7cdb8b49f8491c3eee6e6e6a64bd36b9e84b23c48c3523bb44a8cb67095d8d77515127257a12dd781d24c7182ecef65102af00177a5d9a7df788c7acc631ea3edd33eedd33e1ef318fd4220429cc5595cdd4169acd5416346458abd0013bd6c76cce26a4d4d0af7be93fd3be9851894a0620409d78f1968ee082e24e0cf50d30395235c48bac7811dacb2bad6aa5c65b53ceec9dec9b0134ca9c02cdff250b0698bb2bf2df295f8fed6c8592eef2d405c2c644cfd9607e2b2d656320605966ff91e2cdf627a96f207921e2cbff23ff0b77c973d56fe54fe38fd8a0bf91db9ca5f243f236beddf30345bc8ca52fe60f99632667ceafad1f231a358395093af75812075b1b4518db6da46a1accf099c11ce08873b55f091dd0bb7439a7ab0d9358b5ba2092994d53eb5d6381dd43598640f7a01d638dc8c191637a3078f1d94c68737c0c8e7d63e4d04e1703d34a3f4129de5e85e8c51a8ff546aa8a6269542894b7e5870010d4340c2f583e567a8190274e442527a961249bf290a960166f916f7dbf820b9011a9435d03fdae0cc54e80648353215b2812c7bedde6ee109e3776936013befe4af5e0292dd047cb39764b0ec26feaaac5379faae7cd56a2854add6fa6b77535adfac2d4d54fea675250d8326d29cc9b534dd8aecdff71267b5cbcdee3ff12b094357abf7628c42fddb6ab5a6260650fc414190822005c112521f036d798ec19d08926d51a8caf3dacab7bc0cf8595e86956ff9f1d69781e5f1cbd0f22b6f76ecaac0f2f85568f9956f96c75fcb1e2dbfd224d7a0d11ee13c656463b5574dd6df57b26321dd467a8d243291009b1df39a0b201519f4f1826793e6707810aaf2bfc17590790f3efeaad52aeb6bb51a48f2d8a1a356fbffff7f93935043bb0f1f95752fc628542ae521c054c806b12cbe8fca7297bbba266633f50ffa440d443bae19bc28905ca62ebb205fd168abcbfd608eb6685047f36e92fbd272e79ce608e80f71d7f98f0344a775a127829d84122249c80006392c954ad5081c7a13705c82436fccd1d156b24b0f30cd0fe8ef47143e575723c5fc9203ec3efef63f32f4affb13ea77a6ff073a7f3f3e902cfe478aa3cc57b5bff3a9acbe1d89b3cc89c3d2f4209aa79adc1f4f35acbb81b22e10eed3d1ae8cd2f49b62181c79d0aa62c1532b944637bbdae93e49b0e93e28b4cb71f01c1cd6385de428a0fd5d74fa90bb6794b6a811aaea4f728bc0fd1dada375b41d3c3cd5a36b5dd4b52eea681dcd4f1718488193c2480a9b14a71435da52fc482103242878a02801143b419862f5a7fed49ffae37eefbdd7f3eeed3187b5b6ec26fdb56f4adf5afce93ef48a04df1d703dbdf8e1dd018b45c0a68dc9eceb76c6908bb1fc3c419fcaf25b55fdf8aa82439ce53bd0557d798a06dab4759db6e32beffdabacbedd70b7caea29536eb96baeea1a0966fbaaf5f4140d7455a5bc6a93501c4d27bcc2128aa3e9845758ba0b71349df00a4b8b389a4e7885a5e55559b5085549a1abda029af21b2bef2b653d82aafcbe9218aa4364ffeee708d8ac303086b3f7628c42fda7523696c3214d21b2158d206802c19e67a8448dd71635756a460000010073150000280c08864342c1603892e348301f14800d6f9246745c3a15c8d2204751148520a30c52841040008021423333330e00ea17683a7ff5af1bf18bec8e961fd249c824e468a717143bc5e58de0f43200f16e54a5f71452cf9e7b3a7b5c8c1fc7c09d2f5dc4e4908fcd67118b7bd030fefbd552089b7bda1a0840f753fe9f58aaecf90b00bbdb9466dd03c50d2d25dd415a5a48bd49414171f851fa17440aaf9b9dfffde6034b67bdde21fdefc80ef506576ea2b887f8da75533aef697983c8abc227bd163e4c762c43b688953df35d4e50e27737d78d3dc42d2df25bfed78c4518a3fc6a4d0c7ef8c5daa0abcc8b8fb404c2c9c680dadf525302949059f67605044542cef603899d96d1e6af3dd4ceb518e8ee2a75a8d98bfd69cd96aff613b59aa266dc5aa3a6572bc74347020d656308e0d8c4b3e262ad73bc10120855ecbb3202817b3c32cc8bc3501f2dd117f06df05664b400a2b8ef529189304cec8196254264a5cd7884b82349bd85b749209fc7223ccaa8378f5a437e242b1002de476da12210a600868c21387dc5b7931755854c83ce406fda32aa0dbd0db667de615ee1edc9a6497dd07ef321b34f04b88f103eff8bc53599a5762473c860677170ab935873b37c5444272646a10929e9416f503dcf308183cdd0a4c12465919f44101b0e6af8fbcd051b01c499a5f5ab477ed96728252a2ec9cfa9e8e78bb6e7c56ce76c7392d32915186364f2ebe4b57e4bcace055084303e7ee2c40677688f3b53f482a857a4b150a965188a1fd15f5e0bd41a1ac523363be0aa9cefff4d59991efae858b2deac95675d2c15ce55603b17aefc3923899a1e5722502c8ad31b3a43aca5cd7c998251461b8075270d4aee20967bf43a2626219698e30af0c344b0163958d540d1705936dfaf6c5c7aa3f7919aa21e2a4da98099a79cbd1bf7208e3c3014fdfdfb1edeef5fee7e1c6076240c7e8b99948900762ccc0e97f25ae928f13e82f8b465a48532199f7b794e694a4ebe98a8fe3acfbdc3c352a56dcc1144bf80a53ad41d34e220d5db11114875f9a3cb0e014f159010ff3f539ab7e608e51af0a6344e90d723d776541c6d2ab4102b4cdc84054dc9ee184da8038eb47b6ea805e72dbc5a00003db64a554e3af585f5068363cb1187b7e784404605efa86d6b4ecccf158af43080c68d397dae02d9754e28f6584eeee4ea99b135ab05b03e11b3717d94cc9bb8b9b15edbce3b10b08abd90ac84ce86d459dc30a538f82ebb64b2412baebfd1e5a47563c04e02e0a5fb62dd278365923ad4f873e5402b50fa503453bbc443ff641544da1c84aaa9a87fe9b7dd502614ad9066d220d9289afc0ece29bd38bbf48cf34e623b5ddb304ae6e137e960572617f160bfbff3d0775b1aab518be94ba61d73d194bad9e417b0e054459c28600c895b9b817965e0a336caf22986b7706c7c372b6532a44bc28ecac65ce73a31790919698a9488bc4589e9c3063399e8b32dd9d0236108fabf15715515e72c58eb7d2035357cb68e04beedbd2fcbf76d0d610646552e358ea72e5174b18cade3edad42ea82de673beb300fb9e59b32a1c2ee2e084e1fe2557ca11b07c7804774b58d178368ec39868783bdbec9a6ad84551f23b2daa45c35f2ccb29da7c28f59d6e6b137c4cc5cab0aeb4e3d25adcf72c1aced3faf07b01534a8dad880abac95d61538df3af8500330c6d12cf9744ed7468a52c507776de3a73e9dc79fc7756d76f4420edb8727d5958fedda84bfccddb6b676047a5acf8210865df4072b8ca34ade25a83bf4f97866732b834996c7936e5a6b29edc577cc919637cbb43db51e424a2240a97fbcc53880a2d381b0b80c8a5c56e2230305918f50482eadf740ea2ebec36e331d521041eb9f7e13312210cc5dba7420c5e35f32fb92c9d46950f60312b52c61dbf9dea87f47dbe64c252912c0f1e59e90222904cf82ea348eacfc2be92c34232716a8765479c6023b899a6a086a1a3e8b451e16f1cdadc8a9b48e51ff273290a76e49483053b646e2c289c191509be3800518700aae89f4baa764d7e9339740f70ab55b57e1810df3580e0af1b625b1d26d4d3708e3f5a29dd5b81f3f114bf208a32705f68f5967cf41814eb26359699f34a0996ea005f6ac36e23f1ad5f9a02bd40d17031a74d97037509c9f78c7e5433705365e0d81d96ceec04247f4a6e3af30695ae936d18c4b23e2e0eb8b15848da3927a2abfa9de5c2ddf0da47935fb61df667300c9d516322e8ceb1cc9afadb7672413499da8f3c57041ba2c63abb07ef5b6bb453b048dfd85ffdee01e7d315d88ce2134c4f3a043cdc4f0ea30b4ee2809a484fb8e1207347208f41d505d5f9b496137fb20a8acf4af40f482e0b5d84bd54488d0430fcd41814d543190c31981d2032308b061073d777d68e08207a428360038f00c099ccfada4b0bcee41c4d950b7024f57afe06f6fe1de5d03de929ea96cfe0c35ea7a45a562cdf6b4bc36e31c429342b3ef27ec2d35e332f997fc29c673a864fd63670715916a62755842faaffa48352a04ccc58856cbdf54973c1f19f9f8de868fb1bfcd4a5d9ff5da040cba2066c28691339ca2c5270bd4d6609d81993f8dc9a5f80ef03e4e4f7c9733c7f889170404dad14db3517fde140a53f3fe39294432f3e49ad4d192b1a4e352353299887b4cba3239bf32d85799c61b6de98097e1c3d9e0166c7de16fc025f8caac5afc1416f43a464f78eb0652790bef3373846eae344ba131556818f890b39cc122942e08182a9a11689ac8d5567006883e4d2b554863bd8339e397428bdd9e4b2369d0004ffbad2cbc0375e1a52bb26f5351934e593de3209fb9b5f0c36978f5191c426e7a089c45f4876cb68a67924fa7e2de57106a66caaace43cba338deac3989df391b93063132c35dc933ed303a7a42ecc98d9e0e2018997dd91804585a83a7af4166f67345bce0c9c6f19052380e6f8dd4604269c16d65b09d60997e4c163b13f5a9ad25ec64897e0aa2b0a290eab232c5ac996be7cf6291c9d00694a75a32ce9b269100fbef7037bce68a1c5b101c1a76ed3d5b4dda067762b15ccb9f18af537e444b4b0fd0639836f68230d59ad9c2cc6cd0b59bcfd15204861b025a087050ff6d8c9aab5891a224ee67df5d2b54dc425fda845ef1d464160fef017a65cff656ddd98d13b34b067cc9c6f06bac6fb0e11bee31b9e07a63b03824f93ea41aeff1795f9f91ce2894f2c5c660b937ebcfed984df4ca4cf0b9ccb02566d6156866b342c900954d0604cc50930a93b01ee3c1ebdcf2c08d07d8ec11b7901260fbbbcd1871b3617b3a2ef91184f29a88747877c5b196c164454528b14b6916aa418b8294f8a6e777a0c88e28f0a3eb1b6a2029e059ecfd89da278e7011fefd3c5f652efdd2d4a1cb4e87be7d0d08ec8fc49f61449ff894182eb4fd77967c40a3966756523884e0d3ac8f418a7c245aed04968572be7d9abecf83e611d87093538e03c3dcf7cd9dca8257e9fbdf82055490b9d9750c44e91981170a68f834735d7fcba568f326e412282ca161baaf5478ca5e466242a785cd8bc0809dc4c29dd77c94ef0d0ccfbe8c5ba84980fc5ba7885cd6bbcbcc6fd64e8d5594fd5f0897d9fd4a62ac641afd733e4fc23a1b840b8a371224e194f1c40c07562ad891b207e15264b462102e9ae202320ffd9bc64955e38370016ba9d5fd0c6ea9289e4f2199ed2482c12d260874a9bad0bdf7ab5fd6bc685100a4b6a4d83d1647263fefc290b295acf035cb5e9c487598ca6fa739620edc4a3e35c1232adac1ad3d0c6d64674220887418e7b705b409c890a3a51c75442d06c9591473644fd6c15787e9bb58a4ca52d809fd9415007dd4e0044f160b8d4991f660a7907e6409dacc7b6a5fd814b29c87d597696c72b54a6141a4cf33f2d23d08fc649853cbd14eba047e42ed3c49bc3847058ec9138ab965b1f53cac44a95415d87fadcc6a8b4ac54681e92a785f2e52f7b40095bb8ab7248455696ad93dc2c743b47af05831e55b33361da56d8ffe33430391bae43bbf28cf43b531a484426ba90dcfaf96469c7e9e1face8ad8a8d733fcc8231f6aa792ebd1440b27e24488d16738d8d19bbf0adacc1765522b7b367108e6932e4bc7ac67aa01e4fe0207474b1c227d14c24ec316a1441ba1b3c43eadf5945618e168ab6d20b6639f63a4f4c9ac07acac091e2f7fb523e7a5a14cc8162c7c216c8c747587a1d3e1b1ecab6a8d8e2b5c5ced94155693a2801b53e6d0c54e1417e16b2085b450b709a006a32d2a9563dd493f8582da7a4b239c80d8187958618cccebb8a8b73b5cf0f75596eb2c2479a37b87a151f78f18f08440391424ac4ca05a35db1bca6fd42b57cf297710cda6247537d1c43b4329d1814a37ca9601055a4c14322f427fe486b3528241cb4089610149f46571ddd5aa28e093d149f39a681dee3329e5f40dce126bf12f41ea7afb5638aaab9aff16dcaded3f1d7b37daa32710674966b8bf40081a185183ca65193c35a196c36e7ee2cedb7acf5c4d606a63c6fb169c1ac28a10e1e1c16ee28c21045c2fc546bf7b56290ac4414200e630b29cb3e983c36bc0c7a20c7ddbfba50c87717b2fb3763401a8702e80445315a1e42bfe8a1119e263bf1e6bd8973345f86e5a7fd1caa1a595070c594cb0ed31b855ee1bb59ad2a04c0feb18deaa2ec29068fb497913f21a5ca4441778bd40da1385749a02807f4ad901b93fdebd51440c6427ef091897b4bf5272ba014f16f1098be8520b254569c11b05c5f3bfbf300d1d7ce8db88a61535d3d84ec7c62f4cddd4ae609a54e5ace3d0fbb51f489da9860c96129add48d10928f342958d44f4720210acc8918dee247720d90164b3a798b67c3eaf1001c666e98a484194e958c795689cc82a90396c42dc18861fb335168be8675dbdcbb8d303cb7f53bac9b534f2f3c73facd398160046f17836ddc03470df08707272cc122a493592d75e88acb000a93cd9820e7cc234891fc2e5fb26b69dc07e4310540754436afd27f146d624d5d76bb9e114392bd9824fcb2dc7a181fa91a91d38192e8ca17a5465f06d726f86f642da71d754eb9249db2b98656277334883527615b6c41a69917459434b5f0486c0feb5d95b1599c6de95bb2bf5556c3e78cc264eea4ecb289bf0114a785d9b20570a58e8a4e1651130713fa9fbfcd9db18cf002ead9ad173d70c900ea244c1391f56a362bba01747fe251a18027b0fcacd07b47962497c23e9bf0fc0d8ba4f5afaed015c66b3d2a120050da44e491f5fe13aeefd6a5e0829c6dcea6fea90b4e581b7e8340841f4d0fb494d2b5dd0d54d74be12788836d3a08ced5378039a94d53a04323032f2ffb9c433e18f6d587c91a1f9239b362c1b8a8ba20d6d474837f4ca579a81eea97afe50bf62f4ea254486522124ece5e5472a14480aa6ed631ed385dd0d3446dac7c02739e2b942a17915c74e63ffe14126b51d2e95d43b0375cf50d2b3cdd0e5dd764643958a6e22b07184178bab56a6b1ee9a0d74cbbde760f44153268cd19a651d1a8f41c8bdc4c179046803522c70c918fe1e8d1766480e823c9e4183b6168c1e7c1c820d00909dadb2f88f1f42f3a69ff215d8acae1fbfa4e1c3c34914bd6310e62de3c8c634933994f25d9346a53407f52817883d69ae89d9edcb28c28f9f20cc4c032649a89c1372c8a380bcf84e522805a8467be6524837bcbf60816e6f2e94ae2f2b94b5102b5444b71f39b02bbd0eaa5158d7a101124add9e5ba34ef8560b91de899821ceaaa8e2d45b53cf48ebe06a08074148ce0cf043da1fd08399313c575016ccd11ab8da8266e42d79389cd776301d990d78bcbb15b4ec81415bc8ad498202c8734062e04ead58a60090e82053546cd51633c1f51b7dc2b113f6c1ee189faf80016328b835a9c8b4f7b74a889006a28adb98e433ba936a00f7ccb228116144317a8687adfa637bfaca65fe82c765caa5be9c9636c1ee8c7baf264529cbdb8f0fdc7ae067c5257c546417c5eb12a74ebc5bd9acfca122efe86eec7874cf8c5363ec108d117ee374e72265f0f8f0923eb07042bab621b0341d3f3f5d689bfb2daad32137e8db0746f9b48198f92ed65acc4a1fa5022b5c291df87ca15e01ce266dc2943d29f6cd59283b09f3843f1d5a42d5725312c1cc25ebe6284c11856a7057028042eb4f12b74ec0fec9612402a7744e37e17b9e6f5a3416247e4e5be3ee587e4e09f93ad25350f8e99d79434e888849567717958c72d5af5b7836ad653690df2aac379db7c14414f728c94b0a641cf632c1632cf1ff3efddd42cec517039cc5d2b7b3dab38726a5119c3e3b2bfe53acbad04104acb48412021ee4e8a99c180ed1a98968d492d1c6ac44a60c6153dd948ef8b3bd6b1438e74e890c09de31d38ce81c38e3bd43e90ba47d3a788831d38c891c30e896e39d2b1631c38dec13b40b03ac0110f68fa1287661c3f304cfe87b3eb89cbc43910d949b5b0c8902e59b69ef4b0570aa9434f0d05c2e7fd80128ece585891bccc5fed5d047e187273eaf8dfd2c5e6e6b01d039d455526816c3e3d8bde896060b602115d98870460e87cf94dc247c4fbdfbf01b930297f4ecc085f2329ab0193ea25286cd1413be06b98e5181459e75a4012447cd1e98dd9262e12d28e909c9ea60c1849d081ef05e67ac6ed5857fb814818b2b36a0b3c64b25100c9fe84da9404f5e1d6516fef39fdbc61d1889b9692ea1d95fd12ddf112d221a6ac93bde57db99b876967d857d0b49e0c7219191965539f554102d499afd2e878a9a0ee23196191be6a0c032bf5717c49b35172b47503abdbf38daeba8d1de75f189dcccbf698e975cbf125167031c78d6fe8cd453c80a23eee2a20d6fb25595854401596765c6da1ac47c9dbaf054b71c47e61b6b023b9d428f19ccb8720c0a07c8b682ea903156547f9da5034c2b3e19a5d10958a53624d7591567b2106975bfaa6ba18aafa674e88b33b1039af4c82e3ab6b4c7e1d8becfc63b02b13c7b8148c47431e10365c331a7cc40eb290f1fa0161cb682cae38e963621be31985b22875336bf04bb98054a7dfd5771b31a8cbc0b9ff9fa8c049a83f1b0fac276bc0252d10d6204af34a5fd7eaad765e3fc0931fb60b54846f2dfba9295bd7bbe1ef613a74cb8a07b116377879f913ddec6840236a0227600f1f82a92958d5042cccb410df1f416d1f82feaf0b40f75203a3dd6768e4f30fc1d8a3a04762ae7760809cc0791198db68f565045fc750871d83a4310371b1cc02653328927461a835022af8eb8fa5723b5c9047717bc8c00e9467f48d1f0a3074b183f84ad3c20d705a2068ec296ec56a1af3425400eed1bada73344569de616b83c00bfc361418ae955581897a012fa80995c6a133c187c6eed80f34d6614f555b1b559f53074c6af5e3b03b424e5238c9c5249c8e3d0e175128722fabdedcbe66eff13ed0fc551e61ecf39d55566732e20c26ee7713613147484e79c68ae23b40952252a039d5e16e96f1c1aada00d04557737a6ba8da2be4b3af591283372550f448e28cbe34b07aa2474369d58d36b1027ebdeba419239975d86d9b79fa35227220aa64961c2707caa108e56c60ffbef04e0718ea9e9cb13d660cc5261b9a33ff2ad254a9a63bc30555e5777a194ac6eae4b713950909c5b78f8602569cdc34ff2ae0707b0da02065018f4e7240b50635a8bfb81f15466b63a482e41a508658abf6057eeca241fcc919868a6590ddcce38168e327314045f4ad0fa70d47c43424463b995afdbdcb371105233126b2964b4314f877db4a96ce462935cbfe136229aac4650bc5a8651362da704ed15266540928f3b0a7acdcf05129eaba67ae9bd4963e16d164ad250fce3f8e3fb75a97bc48a86fe4a02cee6ae0d946d1ca9a25448f9f69e189712c5516eeffaf923c972d344c037b24071d4b416ca4ea06d371eb7101260c51a5c3023a9b5a9897bea217361d49a8c98a1744b69efd49ca8eaef70845ea771f8d56fe7d4e02ed6af970ad172f94be73e9008b53db2d460876a59e8e07ed6555e976676699e218e4ea0893f45553f5ecafa5a5faac26414c42ab2107159cf9efa28d3968088ec5dd69839c41b2fd168252790b44b5cd836d5da368f17ac6d168a9efb47755cb96f86da93c2b5fe2f740914c58f64c89f8555c62babc28669ad0b803529e51a2ff0ce940fe92158b9d720b00d53f18bba1eafce2ad981bbb48ec5e998658ec2fb0b5b9a59e780c2dc6f966f274214fbb797091652042174b505b5edfb6c0c0add47219f897cd47a5779f60ae8dd8087c8abde986a05b2603aa19df692fe74493e0f8ddc1197460aa97472d7801e86da85a54f41a311930aeae75981224598bb56f71572b6aa5156666b3c3cd101370cf5540dc33c39f61db136aef7ff4f76a3092a71c987d5f709b20ab9e294fda1f247243dfc1dd51d64a6090a636f89c15a23f3d2443316353a866d30e7aebe81646e1c8367db275ec0f46cb0080ed9b1b897048b4b6460397ea9cc766eb97405cd7b4744afedd103d205f7597bea3f91e69d4a005a06d0163272c25bfae62e546c3ee32c0336585cb7d06c9b559225d109670b928b55070cab512deb960988aa577456accf8da8984a7663d6995703b1b30075c5aed6aa92b97c4bdbabea8990b0acd062224f1598bb94e1aeeb8ecb30257c4de55b39c96a4bba76de5d7dcb9f6c637a6b94567b51209d12e70f53a4a2aff359c6e2ee7cad5ed45ba80c05e47ad1943381450ee483882cc3ef0cb432bd17c0c4d1b71fa9b01c119bbc9e773390f58697e4ed0b1c743e5819be54edee853520adaea1164a864ca399cb524da1709112efeb221a494489a06f493646f782351e98202341182d8ab5163f7334950bd6af7bfdbff93f248ec6e5ea556a9a2efd0d163417ea964dff239176d0da28ae4dff2ad0cb66431c7676631e5fd4779cba4aee3c5961d854930286fac2a6e01570e4d05896a22562de256fbec29af877d8d81dfd8a06bd4a2f7421e2b16ac83c2bd07c815cc69eab453c5c1d73ae0a68621e47b9700fbc0a78b02771de475175bb72fee2dd4c66497279dfc4fb92e347c3f98a8e6ed1ad357cae0e0c3bad6f3fd541926fe243109c39a5b050241eded11f9f9a4f41228dc912fda803e3bd20142ff317f3011f51b06349a834c5d2ae8b896bc01578f53fbcdfd067c4408bac9e07de63e020e18b462f1a9ca2fdf51b4e2ee22fd737756249673bfa11cc9109bb8838b5de2c941ee249458c3241a4936926efe4363db6d8a841f0d89e2b6d20be2f3aa606a99d1961c099b1f5c15980e779855db6c99aa222c7c3ffc8d2492cbb8c850a8df7a4774db2cf237b0a7d9dff6e557ba2a620a9dfae33cbc31a6234a5c2a6ce630529260f29d0de8a824589da7486fb5b807575385f6e8a78e4b4a4d72b258785960b3e024d531a80ca749ebbec00d1919961df730115392f3a78a3d8d6aa5c2e4157383ffb1c75c58ae41361c54718bcae9c269ea11b22d7be5740bfe850ec2c89d013fa6afb2ee137a146b958abb4e9f2f5233dbcc5d5507c4acaa615bb9d6f49672639111d234d2e17a9d37bbbb83cf4ebe1fb9d468dcc223548fd24bd03572db8e999060dab0fec8fc7cdf8d8898e7bc1340193004d7b589a578e1260488ce2838f1d4580ba5ad72955682de66c08874c88087d79751ccc0250323d4169a07d951e71c44293cf81d8bb2bab554caf4f382998eafea4c0b2e89ceab52a59a460b3d5ba3013ebb6939fbc4c4079a768189833c4f7366858b89c7a8240f5c3c95e7de2870f9f4e02986f2070feecca87faae0f2063b3502e05f7b1fc4bc9d1da4b9adafa20077135f1fc7e74a65f642add6c11ed911877fec3ec5e7b700b5a1fa51dda31f8f066a5de3aaa13b2a446cba038578074be88e87255a4a77c461acdf559d4f321e4c8723db49f3ee719832f51919a72d7036cdf410bcde2241b7a551d1c05ac7b89f35488fb80918c45700633d88d71f63cf33b55be01421d411887c8f398028c5c3e3a8ef3cdedd310e480756feb6c18ad361a5a0279d4d29111fa68ea88a161d1b3df9a62f16a92c708357ea496d9ca1967124d202e87d45fc0e78574a9803c74466b3ff9ace8da7a4546911e83086c5ac1ac5a3c04cc4352c9e80dcf5eab5c2016779f57dd629eb06ce23d5680c6e9e71bdde44469417a7143b0e12e3c1c1b798c5c46884b9ac020c3752935261ecf3807ae6c5a12a25b53b784dbce74498194a0fb6e1c8338ea413314917d043b8ca5988022114290cd8731f2b6f3a589d024523ffb110236c90631ee9e8b8d13e8091dd1d7d8aca2342216aa7ac361f030273aaa48409965f33629720f83533b3c406820c4ab12104b97c1b6b32a6112027b17f064038a50140f80c80e977304c66d263352260e9fd696c6b1d378a1dec4c1f7fa70adb4b228f49e79125563f98136a0f165c21c0a061ba4d66cbe54d7abe35aeb4bcbc066405db1d7bc5206c614b3e259c4a2870b195842f53a01be746037bc23c9112b7a2f566625727d37096ac8f9f507b889eaaa1106367880596d484a1c6d68300be7dcd1f522661e7213843acb6e0c99fd342867306d5e08b14d47969bb37c745379df4e27589f4ab2823234c0a8f114cea70ae273405dd2192963b2848259a602c050c56ce51b1244aaa5cdf3330f417a5a76ba80c7a4e47cf42083065a52caf0cee8e76d5a7c4857251490f9fd07e1509c49d900fb4b8b096d2e9e7f139995a4139ac484842fd2288b09a8aec954b49897866442952c722956b8aa4b165f838bf69f7f4bd5fc30f42ccb3e1744e2f8f7834124a75e92d2ab5309e8eaf6fb750ac791be093d09d91f89e9aaf9f32267963fb682a82688dd428a1adb545aa94b5ae9f3a096a4b008f197b6358be567e3d081ca6108322106c53c9e296779948aeef0043215b9aeac07eda57df5b78af7642341e06e40b3dedd014875dcc815470635a0624eefd218b4d9ecc96a1c366517faa18c5f3bab71651e0fb57d6e45b7334121f9fe9b67b013c827f7efea505106a7db53c11271114c471ad1d1e2551c86fb47812a62b313e251243bf10d2fe6bc56468ec52fddc5dd2ab101a49df1231606773ea1fb2cd35b7e2fff3c426c0d224140d15200ddce0745913d0e350a231d761536d83c254c45807cb89cd2bfbd71c65bc1f622a836a366c2aea05400623b7c4fa5c1d9218fec7c4eb0cacd18b4d7693dad59918273acbbb3419d2e2591888128858400db9506b8315f98fe443eccd4739ac192290e95eb31fafd3c55b2db79df817131cab1b812fb12de4667ed10b397b8ab3a64ec645da7c26fc60ebef12f4d804dd4771cc43f4ca64f4ac9bed07e09f0da3081322fec6729b60be13acdfdb31a08906bd435063b5378a960f408c4d5ff2ae841f6eda0ea24ed18f251c5f2c8238241afe143821a56dc5981e33e2f4396c91718161e2302c9f824211d15b7cd43b11d0fd0f12932ac0fb03ccf537bb7a43e1ed97d1780526484b11181792507c3090345c80d70024abece2730a2d93e1a2a4b6635f82da438229e032910502b671be020292c1845e7d1435792fef597188bd4fec537eecff73f4070b644f82b20591f818a75ac7baafab15a9d93956502ae583d464c2dcfe11dc5206007be2b15e6563e900c40bcebe3f3e1973dbf2cd273bb9501f0b513a55e9035f4fef3806a93096645e5e690a7cec4221ce123e2f69db6401249bea359ae34af6ca6ba7460583460e2acf1d812eae2746d56258a7b57de4d9f5135909a3093ee977453425ee7d92dcb92cf70336db518890a69acfd054fba11a4e7868dee560b0cd4494d17eed30de267cc877f019f2d691e5d3c89bfddc64cfb43dcb6277a05633b5709826c9eb9beae408ca9b93cd9dd06793eee0d12fb0aed8d4020a5c356e8d1ec493fde6b140b60ac2c707da36c080eb79e5cc49e2bc73f45c276460561675de54d677bd797b42187d6e72a1afc07e0e800c576bdf265afb6b067ae56aad4722e44c5e44cc8f8f63de443d907bd68c0c2d2ca801417ce158a3a8ca95e6570b1b25f63a4ceff10607af5fa0321074d1f9762641c7ab260c106a758b26b9aef5793d9460e59037899a077be7b108d56209e70e70e1b67a384ec2cb32f0c59e91a343ea8d92b0db875922111d1459fe8f8f8977d9ab010eb3f17209b1c8629b21df65ab1bb9377ba1fe7208b824160fff607c1870934ea0caff4e07637e7eec64213ba864e72b65f7f1b94c8d4bcd544262386b87b6ac074c33ea28b4a41cc84ddca0e59051759c41be1203964c7b2803745457063b08c87a4f2a0b8ff92c1f8b44ff0c1f0065c0659898eb3a64c2064f3bb3093a2c05edd366af55a31af97517311bef960f9a3811f8ee086f3adda3bd713414f6fb3572c973ea1284839700d65e22522565cd02cef4e6ed7974bc91ec056932b61f191a49629d9712cf9a9546b673bdba42c8774e1eb1b7d9150d8798c329e8472cc8afcb2da66b8bf2cab279b2f39f6b906cb58cf7aca739fb9c6250a4fbef4e1b710afdd850023b0273d1a30559fb804be254278d921185b16cff78177f6a7b2f04e8b8d260e183f153e5f90173b3ffdfa2c7bf7005d507dc14653b6abf224cd492a15bb4cbbcbb732580e4720c9cd50e17e25344f794e4a47196d395a26b1274e13f97f716825ce28891c463adae34f65c55fed665dc99d336a31b4a61e496ee138ad543c94f721ea1ed1ee4b3768ab2a518a4ac64b708abb33c1f53331e51fee5159ed8ecc12237258aeb127899be43256e728e00b3dc0e57f78f761921e708f9099923d7ee11645b74b3984e00d9b0f7700e8b03c13cffb164544c426b0b9f177d74953d8ee46882f59619af5e57d1e0f96e54829aca840281eca5eff455b81f0ac060b4323e7024f4b8c0be117a8059841ee882be73fa0c90dd4428ba5d3904efdf569b76c83bb253010a1521dd487c9b1b8401a67e0720fcb5fe32013185e42b897d3ac75039746e84f17e34dabd8a9a12a6113cadf415e3aeebc0226e26531fcace195dfcb8c2b35bb37e1b57cbe765621c01cde0995d513b8059431aa7fbec9940422e44349c1e7ff4af5c5c1f2fb51b4345f2839abb8c59693c006a6721b7e6e390bdb89985e32e4fca712f31332f1cbf0c3e803aefa5184c8565d67695898f7a0f8b895374d016a5290139bfbe081959453d24cc2b4405ed09f30588129bb261de6817ef7a49115569ed68dcf5b55f47dc7882a2ae14ec037bab2de5911372506173e8c562b61b16b89fd291828313826284c6966e8aad178254221efe8d986a93ec1db30572c4a529aae33af6e1a056c9a6eeab076ac4f665518cb942deeda3151947875c2ac3b12eafc53ab51c6532d5ca5bf283cddab0fde0b99386cacac24d6a8bb93685d8d2eda917e07aa5a9f7117420804b8710af2e17bb90117f0e02a630873ccd9781f90a6b38839762f5624e00ea12a0003fad443fc1aa6661787117908467b6001a0514654871c33efb62e8a502f584300b6acc18d8e28555a6528b18c4102ba75b358833a6ad865039e6d080a47abb730adf90a9eb32abf09a4896bde13eecd4f2e932e0bab66f65b5cbd6526b39fd22d9640d76b16c49288cbefce3b5970dfa0439a7b74b5e406ac383d2352ef8154d517ade0399d4f10fc4057cbb1a78bde2dfe56fd8a74d23867a26cb6898da52db9ae2a5ef1715c7e73640eeb22dd289e903bcf02f082fd2c5c0af5535d7e08a5066f7698bd72ee1deef29513fa83a532c2f8c96404fa599de478a47459e46e3230754738e7164b41c097194474352aaa01f3a4a49a94ccec4b10fded1fe99ec48e582c7a794056fe89cc54360752831bca565753c14d9be0b9975bd83401c0366c6e4bc43d4d569a57ff95155448e0ac15f83f2a68311c544a62ae2f0f3a6a3d2f21d039a775bf2091c78a92e576a7a5308cb0b955a0c7e2f68ad6d0e712247486f5c2ff63b6d44ea294069abc4c59ad35fbd736241ff34167ef1b7ce63ccb93a9486eca4e3a650634f1f5027b5248830d6a9a989afab09673c5205918b378abd4002d2810c57bc617c00c8fc0dfc3197fc2702a469003ada9132803da43f5003c48494d5c258d75bea7e3ecc4ba45578c50e80a370391d6c0b099390078a75db71b2475f7764ebe6a441cc4dfbb182347b4a8416f4fe7a4f1808e33664ef2fc82b1e087428af3a769fb8065a01d2febf2f9658054caae9822bf124e3548cff113427c37d55c598ffa38bf36786b671c47c9870e85dd5ad95c84d264a8d443b2b91af6cf55b3a551466b3009cffd3dbd373f129cfc14d613041fc614f7460db826eab416335021a8137ef31f0320ac38a4781d75aa2bfae7118911ec712b81c317185fc81ffa547340a929325e7529b608193568cdd7090343a0e72e3846d864506bc9d5499ce8eba675c25f20b422e5446c690b1a655ff9b3de31ce3e9d71b1c60bbe44a44d96bc9ba77f786410f5ef7adf8dec04d398f3b17b7478788afa33c461e6bc341d70ed10c9b8467a5cafedffbedecd31936e9a257f10ba02faf524d058491e6e322287b8adddb6139498eae0e89f3175c8e69b6a39f36e53691caeddd3671cdbcb963667b1e82ae39e5516a18b252378c434c0d8d2f2f5036993d564fc6230672379b66a590345b4aa04499e32db807fe85a592a748ecde0d4e954ff22f535cd1e052343e9d080b1c3fe774d7aa0c87883678417ee0637f95402369e36e9f31b8598586730c819c783d200fd88c32f68a0f00c9a2707cd970c6a64a2d6706fa17c1d520116401389a5d2a24cad9363f50464ba65904012772099e050e7711df16891e74f9f89ed715895186be91185bd9c582a5f465ca90da21f11e1d2151d743f5251e56d6819f10f330396ff53892e780baf44dcf93f2f9d06c192bbdbc6322cfbf6ec556b8f03b69fd19c0912de0e7c1dfe5cf8646d693be3ae5bb2201b8151136a4d42ae9f620c95acb27caa4923c460cb10a33b05f9d23398fae1bd9835cbb1607c78f58b45233e8a986df764d3216fbf8395e95451072b9feb10241fee9d2526b69f15874946325756136efbf87fc94d2dc225cc99f9642b3c7eed81a8b4e0ccaecd0fd8879ff018b0e1cc32eb030c647394a511a354471d5513c3c9a7ed54aafe817f6087c12d068437185505af692ba2543c7f028872c3b55c16a5ddca8a73d9687773b83742934be38cea16b747d80a18b8804da522483a4ba33213a5c1789fb09ca088991f7ef56a5ec95d507561b164dee3b7497a3e56bbee3bcf05569f6de550760ec3b596ce15f8f818d03927f851d664a051bb33e704ca913717b5ae62abfa63c54b88afc710f84154b824e6a8b0337b8943a8f28c19d4390520fc6518bc3458f808a3cc900009d11ef2e4f31e46d2e9b4c6e2fa8827b17ac6722ca3ca8db8f8dbb690dbe12986407c298fc08b61c518f15d26c1e74ea78a9dd90374df78b34a9761c29a480489c32ad2fdd48ccf0b2f9591461a6f96e78fba16ed508b8fb6cb91ce18e4980fc8c97e986807c0a94fc870876b8828f37c0ad62d3868ebb61e5bcea146a492301904938fdc14fd39b39471df1c534c8079931fba312d75c9728f4fc15ffd2808110011125b405e2161ea882419f25b8dfea334f3d9428a86fb33dc02beae3ad181b68232e39608664da11465f30a06cc33909d4e07aea591d95d4fdd7866b4b7706c5f2b10f5dae374b689a5095a7a1f6cfa460c33161af71b8c5d40cfb430bd0caa5c315f4d40da5dd17d4d13551a660d4b27a44cd984566ca13c1cdfbc7a4fa88f206d28914d16147a7ac2c4ce611d4aa8e93bf372e589d30f299fa42e76071370fcdeab828d2c6c3083b6afaf9781945c1e42e9ba90fe9637ee4947c7842aa8b82688b740a8290e9f33eb92d735f9c8814bf246518447f982dcb6f8dcd4959e6487a6aba184450f25d35308889e0c118600b1cf84d38f4e3ed825c4d40a333e3824c7494e1f71309115fbc14b72f95e61fe70d7da3bf4584698757a08aa832f38f8bd5a6e55dfc5e625db88c2ff5a491515d3c0bc0f59e305e52a3eae5b72a0df2d911e20c069d47c0104775a8f66629fe655e03bdaf86527bd39060b7f2e5c8c9e50559202927bcfb4b3dcfa71e49246a0cb460225e296958f818a22a3a0ae63f034b291dc9149e74872c6b39c345be4b20a90581096be5f18481562d99d51a0cd01c0262bd29ee513e5a40a945dd995c0c5cd9b5641fb07c833f6c39ddf2228a1b32a323bdc8051606d2b6b42b00aa30d08b51bf4c352ab7bfb36d10d4d47d63874db54e35bec80f6d1b40a65d689760ccc488976f2c66b2581575e2632f5f8935ba19befa51ea72e5a1edcb305fd5386481c000ccb4cfa5e80d8299c75ba776768c719ea53ab2c0308a2ce5c12879aafbdc9412f46d6da6ab897eacecef60e55e3a79a9c2b040803252824f7670d0d76825053d58e33a9630ec525ecd05708c983ec2b23fe4fc0c6ab3482060c00a5a140200a15b3924eb41c7f442585b90ae299dac37cba8dd72c87e4b0e224d4dd7a079c7caccf86fb05a352a227441f33f2f2ecad88d626b5b0ea5e74536edc4e4ed224cac87a1aa942f5b1c802bb4621c1c53196e221e83038c2615f9914965c17566e36672a22d0ad47a95ceb28c2c787a3535f9233b4b74e362ed213cdbe48a9e2c01d8147ac6a919c46950346db6893bea0aa27f6a2e337750718ec5f74a7f409a4d26f579f5270c55a89811bc814486ee3f4c76df0a1c39279ef36f9c268d25e193972e5814130c54f780b557d224c607720d28d19f6ebfa620eb6188120cb992d25ef36104c9ea18ad32731d560f0d1fa6d44df0210b2381c4fc6b0e5b75adc39a5b199e82d468c41b8560ca7057cca46da9bb2c29c7a6c33634ce108a857d6c11203f365f47272cdc4ef8e63e4e95aba86dba3f75a13ba8299e8622a201c5672331413d22f4e10494dae429f70b7056ee406d32438317619b1f1dfe89cdd6944e670a9512436d43f1aaa5e8fe25c64b2da8c1fa938d6929b029955b681dfdcb022f9ac6f586f522edd0ea2e23921ef0f2096ba1648361cf232bc13c66d0b3978b2df09ea71432e4874221c6ff7c3d160440fbd4b885c64a4fd27e678ac25e661889fbec123440bbbb3c8d14b30a9c8eae68bd30ef25d8f384eac8aec16acd2e3c7d15522d563870a25e36526915edc59a416ccb0a445b6fa1d78fa2cb6a7b5fced769c261bc97873aa1b052a9e61b7517aac22c356bb9bad63b8cad082c2a9bcabbe694d086983f8254b29730e50d3046c10b1804c04b5009c61b57ba56fe5bfd4e342b53179cab31da202ada1a3a4092f39cd8b2acf98e469dbd77934428ba097ab356225489682c8f48ed66fde7bab90e87b4b30087bed3f28c4754105a4d3775b6df9e32189a20551da969b5bd2d7f43b160fc7734dd9cbcdd996551455b5e6ebeed1d4da57918920d4ae8b2401d7552dc97f74b6e7c8412be81f5b7f3a51bd885a2bf64387179a2b208e5980b4ee50c3a3a4981ae338b52557c765f4e177ade152be7bdf77d9d96eb96985d3fbe8b33a1850f80dee272ee302a7502d47489b83d491ec45a5d2bef7941c6a11f2ea91ef2eaf8a5e4f31f9ea1dec2bb379a20587321c298eca4dc4da8ca4679a03e55fe7e45809fed314609387f114930fa488672a473691b29119fbbee122aa244ef61eaac5abf6ced9c9b880b818338e93420ec750152b6ffa0526c70006036c7c52394c8e41b0ff3852b313dabea007151cea966597b00059c240b03453308aeadb59fe1bfb99f9365a23674eb23e783b8f45b7558fed9e1fdf4c4af459ddd1149a5275c5b4ce5f5f8b178a3a18b7f6cb513e01d35d860e0bb8b0d65fa04950641f309aa77bc3d286ef429e1ce075b63e7ab0d024b433847ed3a8db59a8844f3dbd20e31283e924158e7aeb8d42e69ee9f562073a8fac70675c6a6f4c64048063290df86a3a900e6b945d66e90898b3dc5482079d4eadd5f0ac63a9cf1ef4fc9442df6efc3501cc44e9bf5ec4608769426fde1c91315ba1af38dd3fb26c1e8cde36edcb9058b1aaffe9347e34bc48bad072f43cd5bb36f342b8ad30346aa16bc17aab1d67658df104da3dadfcbf0c52c1a0c8f1038aa812af384af95a5021a428a2f72d68a753e76ec7833b1d73791c17f00f17febe23fafa6f5fc096be350c1aa3f9a18e25a646f0551f14aac1693fb1bb71ee23be4817a441f71bb68be17be7ceea0fc11e57dec532aac1dc4a14d9bbfd0813866fba838d779d8ee70663836236e1e33c99d218324d2296cad93dfc2bc11a56d729206c0cc1b3f9f00d69df9b4003d8fc31c00c8f3afffc6919e91d8fcdf1fae544287b9ef55764cc5b099d3e2e91226685e0f329a20296917e218e71234377b8f631c94a3734d8f474e28249f8849525cdcc344f6ece8427ddd04f53a65cabacfda6c13c7e347fd40d4c7900491c7a2f6a00e7adbea85cdec042c8f1e60adfe15362988c4394cc5e0dedf949bd92d8c3db6d0f9abb338ab9efee67769683370f28312c440664db2b7805ac0ae3f639f1d53bdcd36d479fef8867eb47f640687c8796feb711726fcdff2da3d701ca916fe40cb81e61ac908a8744a950178d4c272a98e7b0e5e0f8e9c4670884a6ab55155098e517f04bb4170b93f886dbfbd1e1c964422e9f72b33ca982e840996c295d232297dcbb6f741032d854feae541fb586bd060a6cd6be1b3fabc59fb6822672009fac6a2afb9ffa7894cbd6c12f6b19084a56ce3197425099b812b26fbd16ee0745a8e4d41c8ff339d6aa110a327b2ae995f45da6295bbaf1139af916799bd67c761a058a13979c65925856d5b9e7cb6aedb7767cc159e4436118009111bacc1846ec18e616b07539b5eecac761ec68aabd8d7983a0ecf280df149ba3c7bcbb6d2902f70986d8265bee3906b64309a32181cdf595324fc6bc347c2038151f5e51006dd8859065320fe3fcdfc0da84c6baaf38dc100e757e03d193f0035c13493feb95809d86acc01bf85fb6bd60484fc4f7b69077264a1999d3ca0c26ba4868c3beb4487efc7802a0bf3edbe0f51aaf11c467aa91fdef32f9801a07f4c030e54e1026e23097c360d03cc2168bd5f71f4387f6f2cd55c18e8dbf6b1b1e037b6b51616b3719f177f94e9e13a9a619b1c90029b22e1dfb99d23864e226aece9b69f29be1011ed544d053b374c7b177e5227cfdad8c49c9461afb03ceb330d9dbd4a1b2eafa5feab5211963097f09726ce5fa5a43db92c50b5243399968f55e85bfaf051717b8e4f8684daba7f00cb8d21f268d8cda5a47fec5d4983f94e193be42885f25e0db69084289c872e1d9f8043df6b4940c608a880b1e4f4e769e04cc541bef26b0c6a3a9281a10e54cad49051fcd3e4e35071fd727e440d9eb893da90e8929fb5b868a017852910f9ef010df277acf5654ee8153b73b04ff010b959953ce65e117de6c761cc87a6a9178f555b089cfde332f22b8410a7b8fac66f68cb821959701b0177710d89d3b6157c7f0ce2277031f4651eaa0b7f6f475d206ec88d03f905b98be032ca8582a5c7cbd35310793b2d04c446542f570518459ab1faa060d98d36ff8542eb7f6ea4b459dcd0676e86a75602fc1c4f0bce35744e8c71f8cdbb71dac129f5d86741218828ae63d38b73583de37d397ae188f6f9fdf37881a0bdd77eecf47ece174a4c001d22cf60030f283d64db45d1e640dd6ce163556b4a86c6cd82a750535726809a619d4e6a5df819b16ff6dfa948f40d663014fb9baa6e1aea89097a3292e9629832edc218439149cafc7e567f620eeb0a68b01db1081b92acb3b317726c9ceb6b194082f337db858d6b98beaea221d0115be702e52c2f91e95db8ae8cd8246dcf5362d803b93c42ec6d98b61e2cee4bbc682630cc3df814d3c5b39ea24398b678d234921fd43eba86360e289ded08f7c39e2ac0f5549008901ffdf526860b5deaf199209edeba80eb376617c917b873f348d2e7c53e29714c9db0896e6ac7b6df170f7b932a5467099ce8c38ae2c8d5e7174febe97d412eec705af68a252c5c181ef8a497b240c20a3645587c9ad511a258c9c6c258a550663a9dae5e77edb14d6744103571651eb3da08aac304dfe009ad615a8de892b7a43b902b98eb1dcc48cb5ac153337cb0ed7872b781c6604a3fd03dcd6a94aa90b09e9e5f749c914c6dedb8c8925b9cd475968065898f68407da3bc27143532653baaefc1855508ec80b7c7dfcf4725a022abcc11a6c06b3d875a45ca22417a5d914ed2390a82842ebc36743a1a3a76e429b1bab83696be2000f3bd0ba02123c16fe996e14dc2e5aa6d1ac94c2b68a49947d18fd197b2b00d232a5049ec3f7c1d9af381d41f14a3fef8d00a1dddad522385e13742ca094207c1f5ccf8fc841af0d08e0344101cb1181be2633cb3ec300506a9e4f86a329e48e9b4ccafc95e2f128d7c22f1887291c009503c69149495e9c53e058efdd5a82ec273e2365f00034ef38cb4855101d605e51af7561e08527e561e3fb04d0357670cd3d249d78ff839104004f17b8b174b5b42f1244662267d9197b60659840a015596b671969311c262d3c19ed6120d423d39bd66c181b2b600ef9d4f0644365f9a1949500a316edd4691b5d99023cbece813e1ad63847f5a635fd3ac69b71d3ac2f6567a031d7774d21d2f82ce2d3d7ff61fab3dfa591ae8dd06cb11cc9e5bd7eb239881315052174a0526d803e07d7079d544e5761103ca8638c39bfc1a1a06d6cb6245252d3ce54e31360a4de83ee0e30e6cba50485483a28e40ddb51164c3971140a73e1dcbceb5b3c6c7868ca88eec17a6594e2c35ddc10423f25958253c7eebf852df5c61ef97b4d2041d384ff754da83ec510aa254515fd341a68f11d7851cdecdec0a8b6dd7d82033ba22e9e4f8491c2490ecbb9faef6ce2b8d1d157d15a5d4b83ca2533e6a130582df087beea13b474a1fe662bb0f051acfb62ca2bd5998f9ceab239a4776e4e284812733c4d0bc48da5d7510f6ec0424c4d816c42519e246d2662f33775b7a53ffe3dd4afb1366200db4cfe38d33ba3bb9d982390833a98c4179559b526b702df7b81254fe7b3af91323c9cc14a9b993fc77b1f65d147267e11709222959afd88fe3ad2ffeba4361381a162bb24642863311c9f66c7b24c906f952e140feb398a1c0924aedcf048624a531c08f4eaf4e3d417375daa8f38124cba3205a3de9110559eb4d09dc3d2b1cf6f04ddbacd40812c9e75ecc1b40e45f9d39038b2764d13b8ca1e62b635de8092c1844a14d5c4e192d6e0a2699b21420d92b9150847fab0376d258a1cc4efad357aeca66073143f788590938382c7192d34515cd35263ff07276aac5bf4c72058ee9362bf64fe9f09933097bc60b4afd030aa419d8768441a7a280a60adecc831ea17b63bf0a04e5a74d4fca817cf354c4579bb285a14b6f5b3a4a7b0b40d01605478c3e789c2e753e985e95688e1a94f5e55331466d62fb572ee9610c6b0397ba54a726a0e81b46cb144ea6b63adc6f3ece8a9b57be43fa87792d60b69ab32e1fffb2aca97633368799162991682b47dfe80d17ca13cb6a7aa1b73d936cea226ac7d451cd064c6f528706408d1db9cc000eb2100fe80696321fb089ccb9a851c8ccee174fc7694b84772709a28d60cda843603ac7b2ca14054890ce1a325e40c61be18eefd4d77f056c3ee186490e23e95c5eafb17c8e7a400b7f41f7c06fd6aa20a811e11744021eb57702bffdf0ae500ff3aab2fba4c72bf7f861f023d04f7daf3f99828b2f45fef9e9f13fcea80224911efbbcf8be3203c8c16785b189d0d1020b200af9576dd3e602741edbafb47ec43e00d37caad7188688090da96efac64dcd95723e127c07bba02f233aeb01719c6823f7e03933b5adc6c35ca1c0281954f505d330516297b551ffc70405b05d46d61a019ef2c4e543810773cfc6239cc07a0ba2022301b99890200149d5a0ff15f1463052da7c55eb8586c5496c22643b1e39039f8c5e2cdee4e080d0735a2165a19803a00f49b53c578007ecc5b0537f863d81b59aa5edf5f4018742415f968b6e8926b9ef0306de8b33ae28c7d1d081e3e367f8a849e8176064025e8a1d52c2c13f481b0ad3e8a403a135231b5d18f21200252e5cd026ddac0e7e0617e132bad788dd245e1f423e4f6ef0f90f9edc59da58ff7fee81ea97f2e7cd0b2ebd588626e1ff472a09588e865d5ca6588ebd93018344c2527115ac320e577247704245b40bfae536afd3ab373f9bc3ccf28905cab558118a12cb814468e1ef1ac8641c6c0d2af251219947b9fa0a841139de078556fe4f72b56d4de27bbed91adaeaa3991fe462c00629df331a701539508214504b10883b980a6cfbac852327984beb09ca4750829dddf1dcb0642327b3ccbb585a061f0485b4e766decc12ca265da01eea9e35f379b7d05e9c9c2d81f684a485538b914323f25a1822877339f791fc5e2c19e990be71c01e440325daa3689e88efbf99faa46030e86489afd055d4f51ce524ea7fd75c300fe805e50fa5caa65cadb636a998344674ff4dd9b5387d933987b18d9840c1ecd2aa4c90cc7a674ec3f3c8d89f07978791b5dae3f310ac2ef106761ee7f4c3b9749e9aef9d20231a9ce779b2417515ee11f8d2b0c2bf9a07ff921f405db3b2da9033be5a2227f202a5b6abbacbd8d604755ca4de701830fd2520c96a0565ec7d16668158fab42ba1922726a82f88ae74b68b0cafe325c1803e56fffc6335c28eee1d206afaf025ffe4e67f339adbc43201ab020be6832bdbcc819c99deac7a653cd6c8a7a465cd4ba9ff3e658fbb629570a0e1588f6b427dbed54f59501f93fadf6ae3f3e7bde0ef2a6c9c72a93f936a35a8d33b993c433135f090a2ab5079cebb31133bf5f036ec45e6f35c786fd418ceef4bb515222e2bcef9923b9d5574cdfb4f51aa297fac57875908749bafa4a31d96e6da215996f0db179df3d5ed2249e756349442448a8656dbeca94b839ab3426bfe5af54c0b25382be8028d5be8e9d910fed6422675f98cb78d1ad5aee6909d23a21ad4955f13994b13199d007d8b7aa401b2f1ab2adacf60e2ee63673642aa43f8c8ed1f800f0e94e81fc7dae0725a9696c290bcf61dc7e2e5a6ecea351f5881ff6409059b0d20ff07ee3a010093f044f46419a04e445ae7b4d632c5230a8a2e8418b2aab4aaf73ea7dc1e7c3177add2a74bf973173d2e1fbd9e5a6c07323bfa99d5cd9fdd11fbfa44e8cbbf3b1b55d0ba0cdaaa2c6d540693d31465f593c77282b40f61024f148a5044593f5bf688ba141b6ecd9053556120322d702d5325abcfbef904b4d9de4deb0a3b6048a65ac7ee77a7b4a8ff4171ece7683307dd37d80e701f81c20fb3f5c0742a8ed4178c6d801d8c0a6c69319ddb0f7324feedc7487989fb196440f1a669bc8503a01b278e2961847be479f62a4c400ebf758431113bba5053dbc8471dc4289a812640dfd4b0fc575e1137739b8e722b3ddd79ed2904d0c30042bd1f5618ef4490cb81d6b93e8c9e9f9799baf102abd9004c2164c79414158e02cf981df454604e21c320990a6d2c0b045ae97e0c1738ce74ee705209aa40808299dacac251dfae06db7d12a2f9ef89aec2dfabc192fd3bd90a7a895a67eb7ac1f5a5d6fdaaa14f94589f85316b7f6678ac676bc3c4ef9fb5dedce063d6de7aa8f0414dec3961d52b5b8136640d6d593f707807c6989a99ff881d36d61e631af7ef43ba67f9c125e6efde450ed0d8b0fcdf8981dd29c6e986c5b8cafe0f3a9e0801344e74a3581bf38dcc3472a098fba2261075cdaa111edd0221f8114068392097e109c2f09344a853f2466950aa38fa2d9fafefe0b955292e1f546570a7be0bb076f030e975b8efdaaa1ce572622a8d6d5243cbd558a0b5267362f00133356ac565397ae04f5406acc38fcf8a11b019e5927852102abd5f03513f52818cf8b5280a24e003acfd96e17807f43a590a480bcc414841fc22de92c48111d65b5910933d3ebdd66c0f81bcd4956b39d5e2a157480afe0b040ce0c70231d3620469dac5517b8ae6b4d4fed620ec6d3dec70c5451b81c8c93e10df4e144873d1c6674f77d1be86e2b4febbbc8eb49e260e81a5f25ca98504eaa865944e48737fce49101614e754208497d40a65e862c7619702f172dc02d19a498d99848c4e6af95b89e943fb5c94e282ba78e0759d0979d1f5273064e88ff6594c7118bd6671b77af65a53523d8a8824e418e984f99527e56966f6d98208696e5a8c6ed503e2613195b591e2823c32e87dcdc2c7c4d1f8e3e26b4f30680d83a0c9073e96af79e24657b096d5d21c7f2d620f5be86d54a9738d018f76208acddf1cd9aa77bf23a65f37e98b6caf43b0b72c3a25d306ede7ab1b5d1e7593076f75d239d40edeac4239d1ecf50b46b65dbb4f4518618ed673dff1930c10a565ff77e5376cbfae94631ebeaa65e1e4ac6b96f9f3848b98c3e971784cbda3862d718102f313e12e1a9be74ec4bf37cc0590fc35e248795b3d8af872566b9ee837bee17f727b3ece5d1b5307d7c7b4eb4d74d2b27338b0c80f6e8a283e0f83832c14a9264c32845e0944a032a4011f9593668d14edac5e9d6076b6a7e90b02d18614269b059ae50998e03e68b49df38a3aa31a27f531abce9cd9ad4f26d2675bc900593a94134434617cee7fc75309368e07b61f888ca8eec6de2f3ff5ec2f60ba210cec90f8eeb7f9b23c4a29b1c55970eaa2488b7a147a271353d7f21620547f3192a3dc7cad70ba165375c7a6c55875c672fd98e3e8fa88b2360215f2fe94982d7d81e92b64e76ab00c33e73cfb0a94646080ef6a310f5e536c0af02e6f4827451998857cf5cfb025727759cc8eda052417239c8b06909b49957db16d311b0129cc6cd07fd895e8d8b1135dc31ffb6b1b4fb1e9620b45d3a2ba978c9d10d761864d070ae5b9a87d2ab3a829e6f15fb9de01943197bf051546f680cba01fec603a8e19cb12b0de2a6c5e1af46bdd3545b8f6cf2a1639465acf38a63f78b8f0e152426420d2fb39ef4df7b2c8666e6bc402f41ee246762389a60cdfdd0ba38e88393c6ea605b2b51f5c6562d2eb94b5e8e814403635db7778b69758283ee5740845ee4b81e7c42ba1359ac47b64f42ff0f0c2e79b2fc9877d5583bb06aaed632351adbb2cb7fa8a0e58e7b689002a130364e5a36e622f72eb67245b24661cb5c50ab957bd14f18b19b7163c68c769789110ab5af0ed5a8a4296b58f8229d366a32eb522f5fb26c82a79543d4bf14404c54024961a847b0ca41707f5869557ef38d41b36774faf30e9408d64522b6e1b83e071a455d9ac2332681a7e379b48b603df8eb10fea1bdf4a851cda2cf71e879ebbdced5f64ba70441fdc9c8abedd63772e4cfbddbd29a0f75c4ab0b19f9925e2163e0cf32ce7a0d40b249bbcdd2aac023d66299e43d31b29d41afd6cbb6affa1e51a3edecc6c275ef6423949e113b2661f555284b19d66b48f0d925db24e0ef8aae26b013330bfa0881520ff89df5978ed272a52ffc7d324d29f4727a2650c7d67020e6f747531b1579cac3c6fbc1351286fe3db4abacb2dac9478bb8793607c73c88671b61e5879e969134844237e56a099e3c81ec2784fda25a4a5d2e2cd05c4708ddc625a1b63ba47407ce239965be771a51de7cd328f2adff633ab3a9f6c3e13d6ba16b5dd7391f139952afe03fb3df20d1cbedc43f6d58278367e72d0f9c7714dfc2c47c86faa789ba74440241d04050d884e3af4b07bafd08d32450987e9dbaba27ee68599c1190cd0063e7341b8d1da7872087b6cde24a034a111df9590ccf614b7ade6f502d010b5c69c4dd535d89eb95bcbb5c0963562409f7cc7b626e9ae02c4bf8c7703744ae62fd3b7074738282bb289de65851a1db5b2dd8b94fb4146fdc3149b8587672307e231ca328e5ffb577ed5ef7229cd9c136149befdf315e895ee649022961a124fc9a39edbdf9f477d521988b9a9d2840aa57e0288344296b99645ef37f7555557761f97f255fca0b7ae24ab8a877cfd25694966ecd50ea226b9e9154997106a6d0a7e73d780b8979ce170372086552d3ae84282307f383d57d67c45b1e028a60cc4819545a7924eda698130c1522997a3c31b625c600826d9449f77f31c5628ac899ba04bc772c108261cca79d7ab2098c79859166b397f1d5c6b2f2f2801fc88e27701e61b60e00e21e7beeda143adcb201f3b8a03fc182530b93822b6d08b3426138c8b8b7a82d4b34f5b0e19fa6c0b90813e571fd1b996d8ef6088b7f60fc090fab3da4c5443ac3241d6e436eb24331879f709f6819aec93bea68805cd90aa237a7928b91c197ca2e8c35bda1c44065be910df884c33bf2e7cfcf7fef279fa839a3c1b957c6149bf7e6c558d264455c34dbbf73ea62dda827b6e2ca98dac18cd4221ddef037de9a3638f52098c1b048aedca975d3052325207aa29aa8de546953b556fa8c0309cb37d593d61e48ed504cb19205f97db9877634128af662ab8b81c8264909a5ffecc3dfd6708211013ea894a45179deecc87376aef731f476eaf34c3d2066b84d2c8de25446e29a54c49068d098a09610938d03c2b6d4f12fd7b314ea5de567ab3c26c26692e97ef48712fc6ff1c0d8d2892e44f3ff1957f142bb295a201805c423ff5520c40520f36b39ecd66b3d96c36ea810a8dbcbfc327fdfbfddd7c5a0d5f9cee3952cf09788b54f24a5e095401c15f7a5c2a3d7e0f540131bdf7260f975cd0e1c40d82de777fa4c5819c47f2bc2f85dea31abdf72552a81a7d69447a92271a1b30e2ec4f91c84b4bcc90e1a007190e6c90e10004b22a7c20ab228b2a3590558184ac8a216455b44056850a6455e820ab424766654866650b2b4d18319359214266a505322b27905911812ca88b2c280c595017b2202159500d644143c8827e90052d910529c922a3e20a1915332aa65001032a9a0a11ac523e38804743c0153225996236c5cf1451a660c1144d8080808080808080688026cd8dd7f4ade2d8818044218e0778c60eca0d04d4423da39147399b3595275cba4ad7ba633f5e63c3c8bec3bde7be7f74df0347cf81a2e74420771b74327a0a06c9fd5cd8b0b97af9cc15027287cde3fd807bc90e10106d7c963c63a766ffde8285a7811aa8892d43ee8afdd4d81ef412b75af2d8b9bb0f3df46ba784cd56da400d24f18bdbd9d9d9d9d9d999dc967be71469240e9f73eaf8940a30b8248eb9030daf1d240a18410bc788082dfb4608d0aa56906862440bc7c89665a7654328aa6ba49f8841ab86505a88868623fe96c07d77e0b69403e13df80e4d60e93b4cfcb86a5a96c8de57fc9da861c1d25bba56db49eda4521ccc8cd9cd8e183529a5945276df48295b863e5c9c537c2195fed8b0a01954bb6fe1d66ab7569335203e6e5c94b516ba76b5dc20670159caaa54c93f964aadca4f96b21b8890a5ac8a4eb6319b84c4210597304b991441252f7d7d8b1b64a249a0aabee98fb44aa0aa1fff9156908bee575ccc028f13d62090d2e32d2e8238a7273d06714c5ffa9a059473851f8738d8045e5005a4544a821d8b8bb54a731498c23160afe39e46152ce57ab84b71570a8d1b0c39ebf4b4d00b3c569a7dcd15cbfaadc26bea5ba01cfcb6c70e61a1d827f6c9e84199365936b4953653a9172b8da62bcd2686048f558a94ce51b3b40d249a5579d02bff12e8c0861cd819a638e389fa832aab3417e0d1c664ec8b581e67141a39c0fd34a6c0b58b24789c30dbf66da4009222f67ac96e50850a0f84aa44c95134c9e384c9a24892276cb26c2c16ab35f11a19e3412dfbc7c0f8712ad99f073125bea82991658acc95ba8e62fb25df5229bf4afb3553265236ac9fc8ee91596abd808b16bc99e4b94ba06cdd23f0e8547cb628ee336121c8d05dbbc36e8fb9cb95d048a50d1ceb69569a8d12da2759fef44cc934b2c0a37d92fd3b8f07ee62a32189a301a612a848d192bd0bcee3516934534b3f794f52bf2c0a2cd9881cf31ae9f5689a487a558a8dc5bc66f39aed5a259b75657f4be58ad770c9fe031424f350a5d525ea11554a3542e2e8b076216748f072a5c580b76e4aaab44a9392fd4b95e635d504493441923d8abc8563cd92fd0730041e6dacd2ac90d7582b822524d8ce1c66816cec073c4e584e1e6dcc2ee1c263a5a9b69758720ecd6b242c85a70bab0083e083471b3b4165a3e3f112fc36138b8b547ce593e555a4ecc480b2ff647705dd1d5a0e8215916736c8c6266b0631612fb02136efc558da58908dd918d7b901a470721c808eb6d13504622a70b58cd0215ed0da5e7e4a3e0dc91ab5e46f60ebb808fe1ca5f4ca3959bda3a373340d353c20fb370d2d789458866040aefcbfb858065d406259829bee9326770f49e5f920fd49a477d00d83c16030186ccbbd18a752ff74bab531573211f9a045482b94860621a1b83430fb72b2ba49696ce41455c008a265a4dac083167e1247335708615704c3342c4ada2dd152e9e5f6de6f7236a9cf5cf9bf54815998a4a71d292481fb8e148eb3ebbc2ec7e5351ccd112775c19e6c3d5d48d676032c079603a33039b3edf8a879943320a61087406ee45c5914e8931e17fde6262e3af58951a0a6a1736ec8814d9684c160b0d30d3ddb3213329b2c213321455ca9b5df06e6a3ac8642aefcaf5c1102857cd761a5b190333903843b1c9bc73b8166d50f1a4be0eedef6691faf91e2ac069afd63041e7bf693bf6ff6cdbed937fb80be15c8160d0dc63ea60c923311d894d214f688c0fd45c8996e9f0d0c3c4aa01b2058c6e6e2c384b1cbc88ea3f3a42f7a17b58f04daa1c3c6450c0404e4a2cb75453127bc32c468da514a95a07409a553465c61d2683ca894479a2967bc1460191769349a289231e2388e1b4d197c7d8afe072cfa4db4a3b371def1e4481c387a07d6b5b9c3a95aae6afb40466fbf3bfc80e8ef5bee713e000588c8fe2854f54b10cfd5080bfc023cf6ccfef6810b647bfb40447f5f6e6f3f852d4c41147650c348704aad5015175df4ffbec063c3b61bbb8536c44107e9de5dbb6774ca1920beea1c3fa40d7f2c4df4ac6742a326b8121189434a1c36d97ea743152a15816f242059dcfb168ed24ac6227b8734321573e5086e5cd62b0d4a24afe346a2b0526e1436159ed9360bfba7db2766a3b8d85058c93e27cdd791bc8e1b897a26ab14de90663ddeaca79bf570b39ed1ac4734eb01f2d1b959a1859ef5ccea3d5d4fa7d3d3f323cac16b369bcd6633ee86866636cbc1e9168040cb949611ebe406add1e3cc186cd032a280d62884925375b82b16dbd9318146bc9939b3ce99e5ccbc3b08bf41ae9cee4cc1a3bb543fbb9df3eaf19d161292383a868564754cc68476b815dd9e6005e2e2fdcef786374178bc47029dd3b385aaa7a1041e5f0272e56f05088b9b1d716767c777445114c557c9860500c00b3cdec8a2fbad4bd3ba3fd6c8eee33370986c2da994564a9da75b573260f41cfc062982bf0b418464f9cb615ee33b784f760eec069d747fc19cdbeafebeb75a68aa80842da4ea17fd6814debf610fb9ab7978eac340c135ec252ed63a6b9db57a158739ac791cd63c0e83f1f48b47ce38c1630f0df5cba69139b6efc73248ae641e014848aee40272db180349f6d890c3fa8b5b27f5fee2cf9796bd70b3363058df8b712af52f8ad64b35d8586e2a42fa0af1a2e051eeafb4ee9d5ef5bf92e8270db1d54b84c4b13d27a5bb947e8544c1a73cca2bd9c1eda9779fb39d83a7dc3039d30dfb01807c24052f45e1d84e418b830e3c48560b73a773b48e19b9fb87dc3b42248eceedb01b20415ad0d16958c3bcdf8e9e6c03c831dd8452fa7516a8dddd7ff620e1419a01b76cf7ccd57cb9f0d84c9870f11154b157b8d01390fd77bc0e1f3be0918686a65b128bc562b11d75b6dd979fda7e86d9badf835ce2028183c85d446ee222f86ffda465b7eca7f9ba2d5294a11907900348dbf086b9f8a4a79bb8e80fa473740fd2c60f72668a7e4dc1331cdbe5b95fafd7abcb1eb9653af8c9a3c346d799b03ccafd0e8b92fb3dca966496703c1a9eafefd9532b526170d177e4b7ab060ef078dd490c50e4532ac372f5e34a298e9da5c7c3c171481ef26597b50c2482590eb9ff04ad249c028fad0486c96a254a863a1826abbd462a118103b50c4aa2e0b195e49eb18d072d7eb4f0d1a2470b1468c163a9a596524a6d8c75a18b199d5e6a8560fac5fe1b59e8e4f6980c8d4d6e2a6b4687e5fefe691fc44e980e739ffa77a660c33b575228379633b2afcfe60a3a5796df5dd374dba77116f7b219410895d9cd39252dcf6feb30317f461ebb2c411a6239e3aa1fd6862a7984c686003b022057934e21f00893e75f9f8fbdc6632e1715e2e40c7d0745d2c698ca52620f5551609f1f4363f01c6b4e1972e00bf4c794f3dd45a08265070b0846ac05972c655a64c9520b2c196729d3a24aee0a943ccb98317c61f1cab55532536b46ae41a60af557a87f3359e0ff09d4b2c058900be4fa38596ac694925c6b1d6af74ed5582eb9a6f08b2d91c6a6decc551569eadbd4ff792367ea7342e02dda93c06802f7b7fa7874e76ac3a02894e0d6af1b33d25ab649e8bcd4fae7d320b23f183f3fec10032e3a61e4d0a240f4c4b8ccae7b4481e5b73069cd6b5efbce597336ef6fe12893c75bc331268f3766ce60f2973dfc983ceab83a64ff20676cf87334466b0859d0aaf783e6e905e914e4e4de3d2241e45c894141664d05643485c279a475a4c5a520e7cde845e09dabfba21bcaeeef487b2aed71162a26a9163b42312120f248635bf248a964cf239d8df40a15cafeb5a5f57edc10e77e7de901e95e14e288be1be73885284813fa6cf2c4b2ab80dcda9196085401c169d11f6985b09e14fe9ea74173e693969df6cc95535710d9290f0582f6088147ea830a8a7ed1da09083a6344192c7afa2d1883454f2e409632a1245738516bb7e70a4f50142a3d302931a05915a117183c4c9a5c9f3bdeaca3e793b918e6459a1b363b7a9ef4f4f4f474b8bb351db82b8060120738af5092af697b55cde23563edc9fe2e565afdb9527d9cd535ecd418953aab42158bd748d9153ea2bbc1bc66ac5db23ff11a8fe235b68cecdfb6ebc92917dbc3af5f7252069be6fbabec0daf51d9b08767cb52e242314b68785de772c0829c41c82ecb814e6ebb551faf91e235d35ab09d8c7e87571f5fb9cf74d6e8fb4720f5d5f6f3c7d87d0c9c94b18239797b95dbe5e2785553f092d1b74ef6f72d6c700babab87b4f2b111572e72b38cc9f267eb048d9dd3342d237bd21cafe97bdb0601720720f74bee19992388f46e178e436c72bf6cf04980fb49d8aac0a30c220114e2a2d76f507e0549e897618f23415c8804c7cbcd5045e9531bb7c132748f878e1b3c6e489fb5abfd97a9829b66c956a44da5531b3ac9f9ee6edc70d17f54355575588298fb3ba471f15dc60b0caaa42855f2c56c9faa645882986d48938b5017687b3749ba4b6bf43bfc86d774783dc8b797ff5494d2579e18322b82645600c9ac384266851399153bb22b5fc8ae6821bb6285ec4a13b22b47c8ae1421bbd223bbc223bba223bbe2aa710d81ec7dc46803819602034cf3d852484460d212d86d0d4c7881c506248ebe41ce9020fbfb90fddb04af1d1df7e5ac0530c00023b501307676767676766adb09b6bf3127bee105bc38491cb47d205966e417b892d70b2848ca35981e1caae062ad56abd53a6e24ba36b5dab66581bd5eafd7ebf57acd7b31fea73a3e25855e93b523f68abd62afd82bf68abd44b7a38c9eecf09113822d48b48cd0ec90a3450bca168bc55e124707d19ec93ab5eb854d1f17d8f4a75f922b0bf5aea24f5251d12601d39f1e88e94f1e7e9cd29fbe4320f8431cfca647811b1370e3398db88eb6704eafb2957673345b2091ce53b64ca06cb908f608ec1e7048e2e831246b43f2e279f1bc785e2e1809a4af4ba364ffed35c4f3a2afc94abd5eaf177dd157caa66a8aa6449c9772c0b9ff80061a986819b1452cd152959069684471c66083161010756da931b096ec5d503a82f82eda0510b01e681378ec2bfa0a89a36f77fb853f98542abb0f2121212121a11a1231a01d26f8c4f044cb4895810913197cfbe5abced13bf0f0209ff801e6d9885c1ab27b2dd4787878787878787ace39e78cedc061341a8d0a8d0a8d36592650a151a19920a938e9083c36cd7368fddd406303d54a250e2fcd762271d0ef2e9c38695ae83972a61fa89bb081144040b607e613732267fa694e727fd368341a9dae028e9010171acd1d363ac3e2582d40aefc871447c9442ef114e96921304cf70ac826d2137265ce1973a5b36c76dc5d74477289d9004b1e3b078a9c3cf612b09bfcfcf05cc2135c4e9058b899b3541052abd56a2e98a3e6667373ceee09f2bc7073877325a2ddad5dcdc41573c598487937fb3b0043d684414ba13a168bc5623842547059269d8302d2864be91c2230c9af97949c63b12d2e6242c8dd65f065c09310004900d0c88247f93382d7d0708234c2c02d62f998e108724673abd094e9028017b86964f065d9c4a6f46b4a14975fe157481cb27d6eb8ddf07d7c365be974d957ffbcdfbd5f51171d67475544eb6cd6543d4899f4a686c919a7d5e5622a9f4c3993750a1b46f2d5fd98c0e3ccc9a1d44a501015203cce20e7e25c82720df0e84f9c42d25f2a5d08b0cc1d4e25cec5459f3464ff0985dfc08a6479ce139dc39be4a0839c27b2d33a4932e0d1b9dc2749993a39260dd2861012c7ac41cef893e02a60219160beadb31e0f1208f0e848baa6a4c46b483389b51e8f51109235670ecc8b8249ffee91c010b2f47e8099e4c4f46d0a9d1b75dfef0f8051f4a1ee59e80e7d249148ef5b5c7452386e5ffab1f43df432937e87fb16af794d974052a8ea3f923becd23788c3120f92e849e0e6855d98a78e8b33e70c9c93dd6d2057fe54dc2bb8f02766cecc9939332747893cca2f54b8c00a23ecd021677c382008023f3fcda476d2819c53ce291363bb674864665a27a53636423609ecc6c6c666663393c1d746ce78683357fe363391cdf4a1a15286e1077894b3263e760bb23f8e9edda1a12118da5611539383dc3773d542da464f69040a9c6819a92f28a2c74570b07b5cec27423a47ab208a932b5c50f19a6d46d3228adc5250a142e3a0552057fd50ee10f8882672a6819aa8802324c40508c8fb0aa1a436cb99e5cc726639b39c59ce0d0dcd6c13d2915d488806cb08e2cfc7f2a4690ec342dad0a2054236c0fdb4e3115e7c693dd442565a89c56e845e4848484848e8ffffdf72556817bc79de406fbd6c64501089a3669763b06ce4ca59414192d5aff97abd5eaf7ec188e8e91beb3e91db84b6d14944e1022f5a462a2c8cd6b5d947842c94ce69df4118bc08d8828bfd26748e0cc80dc8990e87c8997e1a359059aabd59212d6cf3bd14525e0a78aeea7ba42f8538dc9346a3df5e9c2ceeb7ed45e0e7a2b7c3bbfbb5d33fb2d6d62bc6135bb9f66e886db6c729178166ae3623b06301557071fb7bafa8f613854eed278a14dcf6ed86bc7dfff62a78cd88f168b4fde08a1851f2d852647ba57171fb1d1ec209308dafb6dfb870e3b6ce7196756ddf3b5bde6ade6462e4cca454d7969fdcbdc26092b7c0f2d84fbe6dab7d6303205eb3cd90371ad317f863662020a99fa4dc4b1962292b28a5945286f3398ee32495dc48c45d6ee3466f9f1bd93a92f4afa4bf49fa52da50f5438643741cc9437484f2bf084349183b7786a38e3c1fc685e7dde8fd79e7bcf7e5bdf7f3f67defb66d9b9d75d25999cca943b27eaebcfb1b8e404d98028c9162ad2fc52aab10faef757e3f45b26d760b3b4b2925c17b1bc2b8b6fbe3b66ddbf4c071888e5cdfda69c72e4ffc798df53ccff37efb1d6e3faff1c2f173f7f38e52dddfe7ba0b7632732399badbddb650f5c3da50f563b3e1101db91ec95cdb2c7a338122f0d09a38b2893276682d23d4071cb4ae8bd07f97d07142a765646611416b6ba28a0d525a46a80d61b4b650ba08475a37bc3254a5b0bde8aa52b8db8bc2bbfd9116768f87a5218c145c5d043c57174726e1244a085a46e650cb4517c156182978ce50c645147f590f68b50bcebf9b2a7dbf1a20c0a62c655ac2a8e183162d6ac8807196322d52d4e8410b909698169e21386e7a2eb0d64e3aeac8944e9b4aadbd41adb594d28f7a4c3bcdfa9c177071d2eeee9649cc4ba9bb13e92e44ba0b91eca1b46da2e20229cb4f409661fbd36f4aa9bbbfbb600b903b7441e545aa8ff4abaa7f8a68a53ffa278c8b36bb50a466d58bb283dd5df73ccb983d7b36a594d22fcb392bcdf6432a6fcc16e79c73ae00f76f3634a38e2c7df827e54a8159011d3d874cdb9861cfc9e980653da14666c15e29e71c8f64d50f9a67a8c345f91e1975d26a475ea9db5eba948a46003ae93575dad1a552c6875c6d612a8498ff970f049500e8c679629d227b47379d0fa01b8aa721fcbd9830ea0473f2522992570ac0b6d5d8689d227b4737413ee66ad3610b6b9c81fb396b82e7f9788249b29d64bde6de883c1e371cbb870d4de07a38bad91f9e59a8d1d5f078cca7755a9aabf5d1b9e8403126ba7dfab4db1d711e89e4f1a8254a29b5b5e33611a5308838114eb7550ec64ba5461ef644d46e77c4753c2ea22a7c1e8d38d1fd30de4a949aa8ddee88eb783e069c3b91e82927fa8d133df580f7a38e44f4823b401db6b3e146a8f7c3f3a4943b75a80ee5f1b0bf853624a05e43b3c0f4138284029f3eed76471ca92b953c1e92bb2106c9954af1ca4b61d84029294e06777430a91447ea4cdd8b3e3ac7fc4b73c36613df6672e1bce188472a64ee33f79c274551be228eebbc51d8dd48f4617cb1ea0a7c8291e91cf365965f6af4f2c512b863aefcc666aeb6123c12dccf89aa14efb52fc5fbf75e916c2789c2bbe9b09d9da7ce3e87b259be4dce014f1d3b6cb6b091b4c67a3f5c4c83977052c8e572cd7084277fe0342e972b890c724bbfec06a30639f2f6d6e3b14926f2f8e57a835cffd6c75b7890829aa27fe5ec72cc2823a7c8f3ef4f9e8fe7ff173d79bef8c5961df0204f020c01c586eec9760a9622022f06252823e87c804826c0811b82e6e98c86787558b6032435c4c0678c1c21665a72a200e50087227898c8a1081a112420226805371091c30d3e322f661841949c2e766030c4eaa165c77e29989aa5ac4603010b202e6a79fc029005e32c655c087d2fc0374b19174179fc60c8c05f96322e7e6a425f4d879b859643c8524683410d873c3e0ca8d7a8eacffffe89310baa2b545fece42baad2234166ec7192fbf15df41287f7324647662af1d545226d249133f7c701d0715577f24502721e8f12151860e97982267152ca4948694542212b13b907b943aa081c0410b39bdcac9767fa5858f65ba5a88470cc6b8e903964be5f6790afa7521f0d6f210e141c020c01c506d7fdfe1990ab255b4966972e2d28fe231e75edf1b82fff02aa80d87ff9971047041e5a36dcc9f78fb436500504e7e6e4fb5b88d3342051040e5ae81831b4a08cfe488b9b4b789144122d1c23a22a2d28a63732a738a3056524020f5848d39582bac30df9561af2fdfa83676de2358a9424f2fb71d6207f9c38e43b79c8f74d28c013d399aa9ceb050718f5a3d7e6178ef79ec2b035572ad48f73a8c483ebdf17f9dcaf3e5e43fadbfdfd8a44b2286caeee8fa219d425ce0a52a578dd92ef58b3e45bb178ad926fa5f263fd61529be4fbd2eb934c79e4cca53bf4e47b7bc8a85002deb2e11c9aab4bca302ec023855d7a45bef7e97d2a74ff148ef70a1c8ef8becd50be1f17d86373e58328545de16d5f73e6ea7e75cdd59c5de70d813d8fefcfa9aec06375a1c0fd484f5f6f10e9d199c6c5fb3fb8d08405f77b8d2693c22bc5c5fb228f84ce7db8cc8d3a0e1c65e9f5b878ef9b74b8415ce8fb300499f72f291c2f16b9cf64b55cd517c54c40f9ce5ce8ea3ef7efc538754de1cc09a7cbc5fb224e07992ff7a20a230557975cddbf297cdf9403ecbadedf9f3a9dc3ffde27bd074e25377be174c999fb2a2bf0bc5fbb70bc2396d595ef73a33aba2e0e819bc8ecd2a5b38cb9210ba39d1a36dcdb63d7dff629fd1f024f3a04ee973d7afc2cfa0b8ab60874bea14c18f877b8cda31f45d409e72b26b21e2c91f540c91557151d08e5515611cab205e3fc5894e4b1f3115cdc11eac03c504111406471036d4babcda075218362064c5c3a2e1d8e86ed65a0945223321c794a297d1933feb66d9b0246e944beb1bfc337ba6ddbb66ddbb66ddbb66d94524a29a596524a29a5d46edbb66ddbb6d56ddbb66ddb36ba6ddbb66ddbf646b6b96ddbb66ddb466da5b39d2b0167bfb3cc0030c580e54f40b6aa05472f1c6ff69eced02dfc98c70d2a4c827a9c232dd473d63e0fab22fdbb68495091484fb2f645445e98d94907502ff3bd418549708c7469a15e86232d5428c3e9711812996fbff3391e81e56efe287cd50d4b10f3f65be8a4f427d048bb62af9d1c2531206925915d5a39345aa59006d4cb60448623a924dda505a53eca098c42a15028140a8542a150506828e50c2ac42eec3f431c1a4268c960048531c618637cc218638cf1cf60d3c2a10c1e6002091d8cc8e28b13c05aa737bd0c4664e0002d89275a4e205bc10f5af88da042194a28140a8542a17e069b162a94013f4a278b2584784842073f2dff13887dd53a2021850d5914618586963f068f3451f284121fa870d162d6f21cf350c96096b22d7a6426e02233812b6fc1930790a50ccb2b3b380ed962288f0ef3a9b245ada5045394289992640b9629498280a624894d49029b92440553922c999244c99418cc9812c3962931d0a6c41034250628aa5c97f1bf61421018a127e4ac8abcd2315e335eff778a04cc9d72e6c0c9efc3f8bfeff1f7f8e5bf97ff5e40c0f8059b30c6f8c3df873f8c31c618bfe0ffbec7f8bfefbf0f7ff8fbfbdfe5eebdf8fb97b7de8f9797977f7979096b960ee6eb8c31875f30bef8c3b84381a367d4f773fe074a89024178e9e1d1f7f289b8171050b87bf9eef7fd4b0814046abf765d08e104e10b59c0fffd4b38e27fc12fcf914818df977bff7b8c31c6f8bfeff1975fbe0f638cf1bbc7036350e6f63ed20b48c2ff027ee075b1f49dd7e070ec72e9f1ef98260cf2902e5e6e24ba9badf4a53f25ba60c93159cabac4721798077a4a5da30b3cdedc35b6c02c780fbfe2f190a9b103dbdccfa73514d5c082c79b677727f6b7200bf48b74b62c8cdefefc8f21c008ac7504d6175df085ced4e574dbb292945097cb9895f5d0ae6e72a3b5d25aa9cc0df048b36fef5f258efb2c74444a59ca19baa1607fda9fe09c20f842cbc8cc97d2fe946109a168bdc0a06abe98ebdb7e31d322327286d6d27dab24e9a2e5a2243b87ccb2cb16bf3ebde8d87c19f2b04deb1c2d679c36a7649f73ce19932bff39595407afb1384573d13b6a69f8a5eec739690ed7e95cbf4e7129c9dbd3a74d1c8eb714d2fa47a70b47e73630c46fc96a5aa5d981ec30f2e4c28ec999f9221db0fdb1634e1a8fe48e754cb4a098e9f715af8452a661d36299b69ca2135c99bae2e227d4285afe1ee73392933f233a2322466695d36714283d1ea7f771c5c55985f2fc2eaffcfde9f41fea4f337071b6b3954ba7244fab93e7cb8f3159829607b5c5c579fa99a291bfbae5db2257f3bf2f1c8788f9f4f50a0a5f584f61a5c948815928d279fc3e7d91cedf63aa03d21c17a74c142ddd6725f5a859baf885305ef385e391fc7d210c10de865c9c8f0ab79a8bcf5def84ef4fbf793f4eff7d7f3afde9f49d6074f0f7a71ffd09ec3c7f743d205c6b3f6eb57cc2e9516fbd1f28144e8f423d2a8cc9a8173aa342135ccc5f58b3705d373d12ead387f19a2d437a4bfe3e15e02f8471b1063cbeeb036d0e7266bef4ec123913024cf38df8fbfc7d2f7dfef7dca8fb3e1c357fad8fe67b0c8e9ef1d72cb576aa6fc2e0cb53d0f4d2fb7e87579ab364ab3bfd44fdfcaf04788a6b492ee2f9f4dcdb25128757c9de7cd44b7b9f8bf4f3e9ce9413158eb7c3513c8563cda750660b8cfad38f76895d62ff05a80642485d2ece5a0d2d302a64e17bd49fc2f1fbd37f608fce52ce9c3e54784f26bc25cf278123cd1d088ef54a9e3fda25348fd4357ed3824bf2a4a1f471bffe5cb4d2cf86a2bbd1ef6aad5f2ba5f40b8e8959920c736bbd21b514539a3b3aa3e0a8dd68c78d6ec78d84885ed63be90c37d8b422e926125f62896d2adff05510dd6abf3abef389b59bfd3929377ad1a744c99273f4161c7df53bda173de7a36f0f85d1d7af5e0916c831d9b2b07dddbe3d14b6123c90ed6f36c4a1a37270bfffecc28952acf6fef831d923c98c40f28c118390c08f11e28130af4207a6602e90e727532be489e52792524a9a8f784d456044c73a820c1a38b44db83941c980e5db111b5c36c09c08a3055bc64075c193050e5a38415b0289251c1229c8930a6c73860c6cce3042e7873374b8705f0b70e3eede3ee2ed50b4cf4fe2701b024c0d6900191b374a72e52513e0feb194eb103aefec8ae4e997521c4a33996cf5de49b75bebfd7a6fbde01b516fadb5d65a6badd55a6badddbeda6ddbaa8d715206dfa7b25fa0b95ff5a35fd9bea422d3e41d937bfae39c39e039facf2ecfe94f3dc7f20bd66bafabe5174e25ef05db09e5173a92c4e142fb53972bfb0feca2ffe372650f5d20226b2e572e72caa29fb348974528b490dd052210c82e67fa8bd8d173fd22b6040b647f2235884020b79c6922dd257b261c9199a33fa575f42fd2790ba78ca1960acd745e7a6d5670717eadf4b70687e4da42aef6eb46a4b3b53e2e3882aa0c996d38e4023d00247894b51660f01ad937789a4937e12afd1b3a70c0f4c71b36d6d6b1e640a494b7efbafb63ad39e05a5fa0d2c74d101dd2a6d28e16e9e71a042b98255b220e3ad9f42ec6300bfea69fd287fed23fc9a5373d37bbe991e03de9a7c763f4939374ca58c6e148337ece04961e66093ccad9cd641541bdaa0c5cbfbbff7e1cf265d3cb2fe2ac6ed94785e3b55f7aeafd30fd87617ef02863dbcd9b6a4c3523fb59047ebed95432dd933de1704ce5d3cde9dbe3711abd1952727f4725a39ef44c443773f684427dd1a833f5f09e4402cedf77e0d83d2ee2f9fb11675b0ac721b96402c72f9b3ed24b174d6f3d14502175d1f424994de06862c1149e5e7a3d1a833257af84feee3fd0f43b6607f6f09ef42770c8975bd35acb919e03477feea75782f7a4e7ba8e7a8de9eddf7b4d26b9b26ffae9f1303dfe1153af9119bfb5a6dfe18e4de034bd3481a212d864da5c66ae0b49e0979e2b81a7e7a4870ac72319f52670ec8cbf048e5fd843ca19d34b3983bff43b2606b94781a72f61d50fd37b8fc371c8e779612702410d7cb97feb6f57370627fb8712972577ee6c06975c4fa8e19d665cc932cbccb54b273913b3baffcca9c4a83bdb2a72da9276544a7961f008fc52d3494729ed7e878bc0ebe2f48b04fbf75fee37d00967ebb7677f8e623f4ae87071debbedb0b9e1e27cb0ded63cc580c71b376ce6cfaf5e8f99697867f6781047f0e12c4e14c19adba3cfe124356a2e97cbd5e2649cc5d5cc81d4572d923321e428f6d36d614ab8a76aa54d7b3a25d9fb411cdbf0ba70d763e6b1cb92275833d79d1599f39ed229490172c63f891154c91314e5f678d0f8008ff7d66a0938e95c4ac02549195ccac8524615654c29a388325e50c60f6598a08c9d324240061732b49061051935200309326064bcc8d821a38631ba8ca1650c2cc690628c29631c314694315030060d43620cd18682866243420c3519e261680631c810030b319810438a1851b838e1eee5248ed177a4e72a2b6f22c9a2912b0fac2d6e04b63045fbc00751e8161b087ed0a475e40df496f44aa03b78bb09e283b4224bd9962cb9aa305ba166e335a314a2f11a29f3c196bc7520c827b430591807e9b979954061982c2e6c61e7adb555f4daf2aa7deeb66e3434dd8f42dc52a5f08151f845b6edaf77420e0ccb966cd1d84c16f75e23faed7d4c1694feedb9168a785007a569a854ed96953d2ad58c08000000e314000020100a06042281403824590441fc14800b7b924876641b8ac324076214868c310418641010002030202433e32000cead6c42f16ed4483fccba7c7a3e493f6ce53534830bc0e5fe967ca2aa24717fff36e6895433c0f5ede8f6f41cda1c88b49c25bb1e08882a05df2bba985d088442960a9173e1b58547b2969f1b270ea80af5511983ddd132edfac2b2c0a4d1d5d42e16524251ed9ef459024dbb52f4254d01b1812391608a43032c7e4e070067516a13acb569d7c77d102338ed5d7bb3932617563031b155aa8b90fba5fc5163237745c229d2e4d16c95f20cddd64b00cf98a5f21a5a2db011a7e6edc357474a9fa22f1fadd3b9af6d1fc8ce47c81fb7ae284afadca7b77ee1e765e73e30117ad505a151eebf0dbae323defd9d6a6598449cc0b53d8f9448d52d6e19e065fa842177161a26ead6e5950ba1fece632647d80a1dd574da86d0ee538867c745411ac6499ca6f0a8dd3a72df59c809f86cc77ceee7fca219285b6e6a40939b2f9efbc5c6e937aa063ea0f3e3ef3f024b2fee13ca3e19cfaa705f1cffa250cf83cac01e39ffd69e06d20044dcb6dabe4782fe0248b80b56dc348f240ae676992919ba952c8e67b1d298b9454991ba90bf441927f930b04d9df194698d1dba91715c771ce1460a2fae2bc8ce01eae2949552ac13078274ca9926c77546cf40004b710825b02ced8f31a64904beda93394b449554077d895ce1f277c92fe7d75ddcb45571e51c07aa159fe77d9d0b12552ecc80e1adbf82c9a7ba67a5aad6515d9e541f6d3abd02d2cf28158f26724456841a17c8b13065ebe95de1607ea07c82f76d6f48f14b41b642ddf51995f9349524d83553308ef216b2797b076a57b9b6f46ade4e3f407a1edcedb3af457730a451e9e14eecc05b148280a59b1f088d5d6c62ab36ba1b06ca59a037fba1be954ea8c272e7527757bff7af2908be993160f4731aa4ec9c6742c77e247f0623df59f01a566420c20f8c5b79214d6ed9ed1836b837afea8ba0cbebf95483cb3024b1c1b73b23ac97361042d2980f2610a1d577006053503beef82092e8ed5c345c4111ece2f11cc781bf43f0cf74a652aafc347bd589af0c1387096d75f582e37f38cf04fc380925a1af293f534af2fc1db4cc03cb7821b1b4a223b8ce698ad1ca2e768f673a33eca7efa2383459b8426b3b2cd8cd5a94154fa466d2d02783785d7701719bdc63184c0c2e72b11c32edc5ca997fe3a566fc298136e25c82f184dda19511f81e83704c25657e866144c81b9d5d6a297d82e177974ea95b360166788661effa68faed9d6587242d75cf96e31476ef4139e2750dcbca6fcedb40902298982af692fd77f3dd313b63ddb96285a2ed8b71c8158b607ef4e3d0fdb5fc27ccbac90d16f0744c2df7a4c7f976b029d4454f01fdf3204a6b376b94a3baaee18db8c1f188420ed7e54916bc76813d9b1dc77012b6080f8cafda3e7e45c0d6d71d7b2b9ae90605326d9802cfe55edd2a8a5eee00d3d3a0fe0e14840fbdefb101a54fc461c3e7b9c8b6edd2e4eab9ce1bbd6b1a67e99af0c87af077dbaeb02922dca5fc39825143b6481d51a2f20407b7c8105f9eb1fe92da1600bc37e0b8079d6d40362a416bf331a32f3e7fbacbafd3855e365da92316e2662962ac334772dc6081edaeb5cff4d6da5474996a5c935268cbd50f7f2ad376399cafaa9528285ed7ec6736e235ce2e1ddeb66edfab818e01f291fd03778a7c7fa7b8272dd17d26ab38d7e01ca4e7d83e914ef1d7eba1981daa23ab50096b38b6028c4bc604e3252aa8bb0d44af1ca9d6b632fb1dd3c73e826c3ed14467e83bd134c224ce8ac0532a0d8bc339e8d31e1ec6d1464ae52bc0a57d27c9201999ac607e0416df148c8d7d593909246e352d55638458e87ca1bbc1947205a8cb02a9000fb108602586766ee3dbe848ed0cea06c0c982a05c23708b40a519dfa29c60e73373f5aecc9a1dee0e46a0fe7d95820057947bbb73af9924edc53d5c9f3a98ec60c4382b005117991a0465a5017ef4cb369c0afa5361eca0ae6dd501010f2ebf2ede9658c6a3171cfe95b6231e8dd030438b4b8012ddbf3e3f5503335996180a40f346e969f1104781d3a1e7e9f3933cbaa0b802f0171b5390df21ceda579c3b5787b34e283786ccc49d567b39adf14110311d8c2b191f6c6a8d9bf378b35d61119def1918ff01205dd558abb65d26f4838c8360d279726065e88b48232eceafc3e2089aa2cb55e59f74dc83f6ac5b11043cf18ed1f9c2d4e27c833c8687ad97bdbefcf64202a75ade9c18d163360d742a844cc498ae1ff2cd90bbbea03d9975b41251c2bd470b009e77463d343f12a1902f3b1af353a5ad4844efdb2a478acaaf7aaca703275c1d6a2816425ca549414a4d123704ffa6b18dde2b3ab7a264a0eb3c5d5cef55b90216a00e8770a2f490a40c28ef067db6a8af37a96a041f54baacec143b37625f4cacd9dbb8fadcec30c72460da842da78462ac15db5342321aab9db2470f7036340aff628862c364c597cba8fb8396014d68c9e659822439ff96b286b19a1b2041ecd96077c79777d4d6eb836ade7e75b1ed279fd1b806934e03ff02ec88998e032b4d3166b704b5f532bbf57e7b3bae0649355edc30436526b4a3a144da64971bd8eee50055169b7cf468a5aa2607261f22c6ef20f69723cd88ab1091d23344e2be847b11dc6df7763aaa0958ba42b7d86a4f9b1a460835120363af374d0a8a7818e06ffb5c387faa3a4a5d139565a1a38fd85c491fa7f1aeefdf812a53f389324ca451b7bf04c4e462af0969d3a4635c38002d77ccef658209fd6190979013a54985337eeb84fbade95407f128ab10cea73d4df2eab1d7eb978f7c795b4c1b57613f3489c78421101ef0458213fe1701bb2c6ad060cf34858a5c2632001863b9b4af124131f4d228b282985253adde8add60b24b4df7d60400161d0a0f6f3bdad8b72f6c7c522945e152e1af9a3619c1b432dc52c40647f136796da2ce490ef7c7658077bc8b88a8f6fbb8a4e496c0a62cc4140c7c2708f725506f29005f9320d2a32e50e2bf2cb88241c454c2c0b9f03f9fd555f7aa9f2b570ae126e05c02e6e4f60ff24fb3dc7cedfeae7f816b1f5f2ce01b34138f27f69bdad9a6bc94ae8038ba07f4e6c01a00ae0591e35914e1df85b1904f3ce46022ab530539b4f143c57671b4acc332ad1b60da2f42496f8b594d7d8fbef551048104f59939506da96bda66a59195495fadb750d46b53aa5dc8eb70d42b9c8a52beb3d0c8469aa23f59a9893fbb233dbd5ef9ac1f4f7eb062e54d2a6ae99709e1dc3356dbdde2d89283bb927508f920f770e441eefa3e1989779e493ad0264224857ec47a724660d719eb904285a1f8e12e478dc0ba1cbf24ad7ee7488cfedb836485642655b2f74e4d6a070cf05e99a1528f444238e824ad050da4408bea667a12b9c0b903b235aed970933898c03f2a100de4e72a58529dbfc94779c63f76a034a5a8b59af5987cf3f326de45dce3a8caf7eef6029d8d5bb19872504a2ae564db75edb1761391409c36a739b2765b30de2c5ce9046c8405c5074918909957cb68b7c26dab90e1a5e0b8b6d7843fc150e45aa732897d32d4c3ee8c778119ad9845967ac4eed38a699eee953822b02e4b2bb57e3b06bcedc300ee02f2f428c7b5e03b8f9c776249fe5f4dc5c0c4ec6fd34c40252cead7af61c41691f4d327a795450be10b3f2a2494e9db2d0910afd3434df258e9515ea0e247dcd6c694780dff5db9ce49912b3b67db7f8bc67c8e0141e229e2b174405f041beaf91b01d917e5c872b8643f3b07c281f401c73e1238251326db018cb2ce6297043032a7a4d38aadf43871650276b91d72e91e13386957e93eeaeb2c72cf43ae4f2c56f2741bd88323513693a3dd4e02dfe2fb4d16439cb224051bd5d48384f4298d2b52b2cc45ce5df57ac4d39231965c4b9591c5a55e23718171ce408899a8459e74fc2ce9b7fcee32815a58c49f0185665ae406583ef9e16f2ac44f6d56b2d16b8d4e435fb781f04d7f803fe2f981068148bae706f918a8851e2d27027b81a8d68969e7a69640048c725cf7c4c0fd4990ae837c459319a8a8ef8f3ad68f427c36fa52d3973c0e4fcfb56ee68ee179caa44f9bb74d02bb78b356f310317196fca6b4a877b40ac92ef27a310def97876b85e74f3fac633a67be5325a2e5bcc13f6c3118dcf61f0542ea3255b90f0959a93b118a75e864eaf12c8ad0a5609c572743cc77945d29f6f9d0210e895c533f97898acaf7568212406b9e9e5f370ee8fe0b6fa029390257200168761697ed2563fe298d1f8471da164d7dc3cd5f935746e838229be42c5443718c7ff7d288f0dfe1c8f4fb606ed68f13e2b031be8f6afbdabf32910de6d247250a5d9ed1f0155d5dbc91d2a87b6bb380e4c9891370ef14d2402970b81c793f2157ec692913ed9e832bfa772aa51165f64bf227b6c791ab7ed341bf55aa8ba027a70888430717419a5edbadd0419fcefaa29cc8971b57b4df9d1d9263d55e1f4dd06f88bcf963419915153bd7903d9b845eb6173aa780e5912b24d99a21a96d2b2bf614ba95f5aec2406971406c6f0c213becff4ce0be474843bde131107baab1f44d6693a1089b100832f7e57cc2937da6896e41ecf0e94468195d38745d86579a2f3bdbe734baa9db1863d0b35107fd1cdef273c17b5486b8bb0d6d24c03fce1116d7cf63f80b03c01969ecc6825398e5f4c38c881e287fe8f928132b44451e279908af168a6467df4c19598246e0c5660591dd26f5331df688fdce41256bc46d7ec52d274ca97584d6fd542314b69098b09c6f4c5f70e5480bcc80b50b29f21274b52d80f05238d2b8f13c2aa8117b4b36b6bd6cfaafbe7fcb9fb7d62e96512090d3977264f37c4dfa3250285dcaa998533f1ca8b6523d2943e40a698db5ecbc2d816326587c2e31f2c4ced14c995834e2a80883ee496000b758b8823152863e298ec199c10ada512ebef758d92c26360a31e9afd28b3034d1c2d04fa52421339f452005d0b0a78f56dd59873221a050877c7a04b4582d9276946856ed43a0f2341bcd2c50f22961dbe1219040bf742949d2f29744c397589d805f35ce8cb4cb3994bd8ca48da4f5e2942d0543e0a9a64c2e09327c6759fe90efec7f7d8c7959c810e8d5eaf1232ab5599d8cda7c3c6927b0504bd2c1dbe016af84ae9fef3c3404c0370d55e778dbb9e2830283e71d896fad2d2c0b2766b933ae9093c51dfc29959489c812750262435c776bb65b4436ce40635427bd2126706be004f5d00f3e72bedbe0472afe2597872b4a7bfd300365d1e6c4c6aa631b193073a36490b4d482760c7267f437f8c575b31414c70920d01d3cb8965253ed70a60a6551b5154648acd2cc68afc5f0912c132e24301b899fd6c12fe5e1c9519055724f65274f03340b6f1660fb03b6bc810b1a9a56b3bca67c7b996ad33c164b171626c29c77410a4009f13e5190ac1035ffdbb6d5c7531d5694b39fe2f7e5d24eacbc1817cb2db6e55ce8e53fb45d5511ae595cd529c8376481b6173f5851c4796e7459b8ba5fbfcb07226585aab97aa4008da643c8f07fbad952448dfaba55ea474d529716c419b62cdb4556381460eb0982dbcf3b3b194191c140848e32b681c201dbe1d1dc681712d4c1684ee8da7f1c05b5c3b7e92f860f11ed7ddf196acddd13e203d8d7befd7b0b819fd7f664f60409488b007def5aa1db60b962c799f75567a5ac3aff01a6fa9008b6cc807c244b493ffcf68b90e1fe88464594bc88fc44479a91421c2748a493e94b3c6fbfd6d80bbb22e87284aea1799d83fa019b00787b4010a49e031b1eac152806b4cbb9a9991585302f4afce0d1d811d2abc735d456a2749570876ff26999e3b5008f0ec183ac0a419573f4de4321dcd419a1a4c86e5ca497a67044a95ca7d66df782cfdecdf0d18006c8fbab7ce5080e01fb7be97ea1e0fe97c339ff5fea28cda4e07b1ce209dc896ef66e5c77fb2917811d2ca9932a2a85d869a865adf3f8d8f7fd3e2f2c2a0c657813cf9bd17ec1dffa0752750e109a2744dbddba139c833d328e785f276aa84292f99305169fd5819ec8de6f4eec4a1eba9df3cd36d87165d69bdeef867df27d7097c548751807a81d57b9ecbfb86edcc015f4ad868c216ad786348f43d7efee7f7a7166b52b3a82fff05b3ac11c2ee327ebbd1c985759eed65b9f25c564d85d7a63e520c1922be286a953c555dabf8af5210f3b9d8e80c4a1b6b231f4b6cd124824adca3c29bee9b8fe9701449409b492bb5f21f16031841b8b3400f3eed98a46c806b3d26719d9b40c5e02cf88712cedecdad3f2f71be2ba21ac42ef4d3990f45f9afd880f963f9760f9f9e6c5173199053544340fb4e38a943cdb980f94535ff627d0496c88c5bc06ae27b3abea2486401e8c258aee6f36eca67f841f8e21a7f1c5f18601ea31b0937ebe3bb4c19bceb49db1b7b708493a31a8ad408d30b2e612036049f4dead30fb91a7934ecea368d1a1fc4728114ade7b4ab3088bbc5b2bd9df3c3246ea5f28bf05cd8ace1838582f2e5b27412d2753ad7de097f0adee22d3e0679a563d1cab8ab06958618c80a5ac0cd1243131be9aa1cad9504bb960d33651941e2adf18f6b05e664e5707ffb4b5121c57b395fc14e16133c30ef2296f07d4d8b6a1678f410ff8f61e3db11b2b667ef6b9fb0ce47dd07e0271dfd81b81e9f3f73190fbc04fdf6546f2b7cfd88740efcbfba47743a8463d339d7ff8c4de07ce7fb39d28f36b1fb49f40dc37f64660fafcf673744ce8850a2a09c6ee09811c069416f1d91896cb19d90e2a3f52d8f1a28e67ed2b08779fa7656a52d3c5e9f9420d9b13561bd6a31261ab752121f9bc028526011a10661890c864afb33fcdd845fc1626240459b4575aca4bd3a770e80892f4416c041b3a221b90a6586cd770b9a886fa5bbad6ed6637c59d0e0a557916de1285e6af394410f360b4d9163006efc8216047b0af5e9f292a91e2afef3e882e9b93a03c1adbefcbbe65d98227f827eaa67d158527fe601c6eae3b26e61fc95f21cdc2af01d8658c546a4453c6332bba08d21b51275e6515baa4d73ddc05827cbcd07a3fedee127ad60a28b210025cc73037ac80128353c1ac48c39818104b2fc562322e26bca0effb02e41e0ac41f194daa3b9ad2b22dc0642429031a9209a22dca886df7cf091b04ef08c916916de73af24c6c3e588467542acc046063f54d290199f3cd2e88b54aac6931be78ba9546a859bafcac184121e6c60e4342de1414defb325f8bed26122cc4b1caa5d9fe35b40e0980a6fe5389a070101e5c9d68ab025330a821f0aa03ea4d8de5d6fee24565f0bd8fbec52b255ed8eb4214fb5b140670062bb18335936157208277d75458d1e3749f893a325aff79774920fe8ca3c0207d4cfc91e8bf22c5a20e25fc22a53b11040cad58290d7f14b852b778e79f5378cdc9e1d132bf8608f444972f5c26f5b1883af6c2a8357b0e2c57ccfdb403058bbd6154dfc30dd8328185c458574f9bbb60972a164895ecebbf1476c82e90b87a5c2b129d48d79b108548e26cea3b5e0c33db173c22e1e781a73302d00fd831e0bd180653a60f4161797a91935d8118a884d25976b250bf3b08c47a32b03528476575bcb6867cc08f30c91ae3e5b02c84d04613a1b05c88e1c854d70995201540b5bda9c619407b91c2118a6e0af1652b705119d56ab6c301a2752b4e91227e83b8056a9ea06fea4c32d77dd7ad4cf87a59084ed4a6b8533121f26084907eff408b9e575d04a161201d7813493bdae3e221ff590ab8a708bc1826ebfeb0b7511aa132c13817a6e9a62cd485ab00cb10eb2e438b68c9778e03257e4a30acfdad52f026f295c2c9f64cb2497e9763de03d04239605770a45f8690212f1f03f1bd0bf15aed428ae602e1a3195f029326296bac4e8dad7f904b9408f2337d0d658931e40fe191ab122239b0680080197fea386a4e1a63e244ca3cad02a1cf6c732c0f1ad31de60c8100b0a9159a1d82cb07acb3392586c85dabe7fd4f7369382b3b212a23853bd816a9b763eedf795d11d1a45324fa583120c8a62b8bc10a66e8c93df80098dce55533067b825f9b295c268a743f0356d51bde7d76928f05a86fc77d5be7a0a9e0b2a46a368f90e0e308dfbf51df813b9ae38488b13f11e329365ed61ab76cd7f8a6694679f24bc7377aaf257bfa673ea456ae11a4727b805cf99bcc54291193d700f89f32b8cdbc40039e001891fe5bc5a0dc1481908c960eca715cd9e0298baeb36d1604258ed2d1937878af1149a941349930bdb6d2c88a71450caca91e0c404688080480661e16245ccf3521a546c850b6a0172c0133c035461472e166089a339e122bec1ff44b0ee689ffebcbf6ef7c3a586e2add108704d8f9743f4a85f8ea940bb5c55989b590b831a682a312dee8326ecfedccb62ab0a9a20b277613a68e154e5e8a8e01d40001d10e909ea3a0672560802e10095d2cb2dcab58fae0fbe83516e12443b31f584cfeb1991e5b2e94e4cc97c9598cbfe9f93cb5491a0fbc63682c888ba14b5a2a45dc3110c13a895b0604dc30c3463afc88f5cb3a86bec5c008696ca47e2c12541dfac5fa3a3170e99bcc0df8a503a865f17803d61aab4549e8e626570ba253a0b93af1d1da2b84e102758d744608848afec8d895da02eb60f794940b33b692b8032838cfc1e9a754f1130f371da8efd7f5eaaed79f9953004c0445d137d09cf4112743047a36a084a4fc3995fbfc749f232aac7cfb623c7e7c427e2e50c2bc7a13e65e9ee9b7917e62a8f41cba3fe7da79572543769c844e4d60c586ad4351648fbd7b48b0d35c88202aecd481ccbec35684a78efcc3fc38f7460cf2ef016763ff6a208b1621338f7072a3c995cad2d171c7580ecba3b88b5359f0c0686b902a2f06507028d5534e67439e38743fd109aefb14b32c49118683a89bf610f87a51e6f445c7a6163329cce629d30dc363b58cc294e864f897c28e05f673c386a60fa563d74694742fc0a8833d9b3e2cdc8b0cabf0b3ee252a7d851fc406e04a46b88f19361299a6141343d4ea7116c6f1512d15c9ae51f1fe417ac408e44ae6b740df279b5632af88c13f70eb02c6a7f83e0c146181b8a85448c9999dd7988b04a65d3ab849e2381d003e71d03ff1fe2687bdb8e0e032e61b8a8840e00041add36b1a170c06e84442dbac8e8bfd4d960c643c96a8364262c157a042b7d372779d32e769b1ee9e43eecfff029b120f2c92dd46c800ab412b8c7954574cf85fd817ed2f2b5b888f03aa6ad7663fe4ee88b4c0ea805b9e51d1837ac91c4693ba54f9e4835012bc7b88db1e28d5a0b164abc014e60463c1a22010b13d90903b546d51c0f018d0e8f4c14612b7217b3a69f6ad7a3d1b72088ed102849834fd116572028fcae68b66392cc7b3547d8bf6600d1748b2fde0242b871ccac25227ab6568d819000325e229038b52ba06ad6f1eb8e1ef83a3912742c4592fe88e231c62fb26cc06c8e1375c4ca14cdd1f9a3560209de4850bf6ac3b56410957f72ec049dd29b2e77f4553146c186e0d7cec0c1bea5288a32e3f0d7985bd78ec63f978c7fb61b74c80f86a0da270e90c9b7dd0f5872017afdc52e696bdc0da357809dadcf7777593689fe405688bbc252d38ca39a0e9213c8948a882acc576fc2fa2384e7d8abe05e116542c42e93bcd0d2411043af8791aee096eaa6793bbfd0492a12d971be9972c3ddc443e2e884da4ed8aad69583953f65aabb7b693115671e783c855eddda4e57c32e49f5acdc80ac21cc44859a13707e7987e8776fca041ac0d1ffd701fd51e0b64f60aa48874cc808a5f65d80e2ca201266de9e1ff23657041aff27921b7a8fe2a4e5f1160ee45adc602dcef8f9f7cef5a65b1ecbb25b67ed42dd3bcf1868e6a7e71b80de4485ceb2c09e5fb689a5f7d37296935a289b31ca4ff4641a7b240891121018da963a8b551224bb7f8bbeec7e90cb5a92ac1eacb11ba26f0fd7a2d5bb00054d7ddda14ef7acaae04e977437ea2aa33cbf53d872cd3ac2ef76a91d688d435acecb2772a46797291153a563d963652f7b6c303f8936c02b030d67bdeb7840afaf901da6669d03cc98c0bb62a329236236fb92192f50547396923fd0c56ad6cdfe6d475ba39bb9f09705aea4f70a8f6b903a1651846f8edd1ed6cc788ed1124c7c8d56bca7a311e58f61a6358d531f8679e62a8beef6da9517a81178efc26754b5fe5d896f74eeee66297a65de6a9c11774746e6ca6541f06510616c640d94b9a9288dbb15dbb70655eba30651a08f2ed696f8de5609f2d95518ff7c6daec0dd0f856cb748490e0c72636f5fa21e6ec41c6703fddce9e90f600dd03c545f8cb8f3f0abe8678521ba04fd19281db6e9730a8a407259e90e889a175a47c6750226d10ee6ee4a9808a8255c1bacda0fd1b195efea0ddc194791da1f5fac2218791bb9af679b9e5a3ba3a006293516a7c1d01ff88aa1104b4ec521e8f12228e578d769f0b51866148608291198f5c7ee16f374a259224b236fef8a4cae225af63b6c8a06e7a913e0dbbbd92caab29cee450f228c18757545f53ad3a7922a1c9df74adaea68c9d43a699f0dbf193cc0e43f767932ca17a3101bb3043ca3fde0d5b1de5fdeef8d926838e183b7b07ba3313cd727372f0e73d7c34525e34dca1421945584f0792e1bce15b95103c1a9eef15832c11eb75141ffa9bc83e75f5f60aa9819d60327e889df0083a027e7368340e3ee599c517370b496ad75e76af24b32e2794bc71b0ad155ba70598ba75242723df83b9db97e667509f2ab779ef926e41696c1ba8434a214d5942998e14b97a97bb598d20ca1ce3f3ab8050b1c6af76e159cc47be0a0b3957edd9e905b1735f76a5443c37a34447951a12af37afe95dc6f531883dc50e5c25f093ddec713aea9588a4647126f2ec83aefdd8f4162542311d5fe1f75100d2f355aba1a0a26f9012cdc31f51ebcc2b4ecce9b4567fe9cb1a699c6bcfb0498e7ea1f008bac3f0d04090800721c991be30faefc49fbc896df258e6e6e64de9c347d61871ceaba6b2be0be9dd0adcddaf9545fd5fcee2f7b39e88de66d3477459b55d92837f87f26170533ff9b2419b76640371d25fc5dd90a883f75aedde5d265d611078c9acb5c0a134d93197d402752684e3559209d4aa308b9d8a9624d64e0725523635243892d242d172d2f65a22dce88fafbb3ae65a67fa031ec28071595f7da0e4da7378530eee320a9ef09eaca89449f3a38d7722c82aef5a5abbac07eac28d73bf6358bca51d99645918fcffae26ebe8ad4dbc62d8c95f18aa1763f97ba257d7dd5de43cb89abd42a548d466ff9b0a4d8e3c40b3e3bf8ce409db63a2f306b5fbeafaedd4eb90e95e8a295921373544a0500fcd509b509c6bc00679d27068c1ea5708384b3c2114fb5a54472201c36c50e755f98f27fed18cd27f0c20c0ae7bbd2eb3405a0483d285eff9d1837e91e42939b98fd234605460b7b6ab581dedabc19567be4771d1d5d7cd73c34793dc44345f20f710ff5e286f65c614c8daf824562b427124538a09757525378f161b1f7edb59e62a78876505482b2232472bb26064823574b4220ccc3348bb5a9af455940f0ebe8a50a3582d8976fba79be65e7768055214fe1f16af88ec3dd5a0de5120849733abdf32224679082197ad746a235b9a08446651f5b6ac6520e7a40a8175e8b1f35ffb6f4532f7f9012f44e7820f17e2d973f60cbbf3c26909f3c974434369064279322de3020719e7a002893868a0d5b3f938a92138c12a2dafaa8d5d5ba8d63fb5b5b6404b6916cd66049c29fa99645a2fd7878fc86595f9a3367f7ff6b3ec362d36f1807b3733567e76db9d789356b7b873104b4d1432fec24fc486dd92a42eb3427613d1a532a515d99a8b338b9ea411a561776b757d2019c9c58a8778310cbb5f2ad3b1f21712c16df44bf12684bfd4ec63ed5d08d24da693ca2b244fe9e887c54fa86537d997dabf905fbaa667e52d447063614948ff5207e4f85d8cd420a262600445acf989a8e1f79028a0a0b9ae3a4b9ccf2e511f77b17a1d509239ca7d0b9ee9532aad5f64128cc4c1bf2177f9d3542920c6339463b66f3a3882bdf0f933526269e2e00623bd7770a908b7c0806b3f90eb875e47b15281198eb6798b5ee2c1b1727edcdd9cd3df78199fd13278f8c17afe9dae762d4d9e6da33105674416365f4067a958ea947d6087d1b8f35400c78d901880cacc930b25ab5339408840e39fd646bec16d665130ad44b4d878c39fdaba958946d882da47eb4bc0785455ff02859e05f97e530bd09858f9b1084f2002fd44c4c6614a8b800b679e9f7b70b8d0d46eed2c0de6f9e9af6044a038cf33e91423a29dcbd32d4c2bb27e220d2c79967c95e55aa243c4297a65ca0497f8495b2c32cfca2c1b965570fed56d24675098465edeaa533850998ef399e839baf0a4bcc2f4d0618684da5ebee1518d48ddcb7a6725c43211db94e0cde76a6a771a1e37317e9ff4bd9d335fbc2b18162b9b0713cb2ac49d3f21d0096b7b734484373c81f97567b6fd99387bd569051e23b5de2bcdde88c60b94b801a91cb971615b09f25116a1d8ffb333cc2ca64bdc68e6acca9392f5aa33227a672bbee7cc4afa679a0300f8b0281cb2d0f7dc8807b9f175ed3b59083ec367245132e1922bb662ec2e43fe587d08a829cfa677e6bf5e77a91d47ce711dac99fe0e9ee778c613307e64a9f676cc04295c3156f78ce3eccc7e066d4cc28e9d28dc6199c1b9eff7d77ad3d7f51e4c77b67b98961f3170651e2033755d41e852af2643c10313993cbcac1726b48f017f47f2f40afc1d3c07f929fab5a4b08d0ff9ab9d6dd0546406e775a9b471fb776647ac7fdee277a2483607f2ed83991eb01e3032247a996df58a5549eb4ee5f904fafcc75e4a9335b2b1e49d8942573b75ee6a897e71cdf53de7bcada2cd374792b94652d9dbf5c9b6aa831734987bc7961a3a45e205534af4c58fdd67f4a7cdb0b782d638ac02b9cdbcc191835ed0a6d2abde0cc95db73fde01737096552f9e761d8d9568d36eec1709c89719c7b1d6c65a007dc42b1cab3be36b2ef0aa4533cbd47a6e420dfbeb714ec8da6e64346ee607ed18338db9c6784dab2a04916f47f42f7f6358a8f8bfe542abeb7664e4dafdc2cf342ecfc80819917bf4c03ac66702bdc7b5974da78008a873fa13d10258c53236a68e86b1887f9f58400b0bc36f659f5320e037a60026d5349d4e8588044a2bff3efc34e63c53df7d4461d4a1324f8f81a495ef3eec26e60943b483fe35fafcaa80ff01ae46733bbf6efe8b5d7bbe502b02cfb02b18ea4d6ca1f4fec8a6beaa1f814741c745be07934f1b57d07e17646a2132dd89b8d9f2c463eee64014b76e0d8424f86e3a54e44369bcec9c269e2610e4d97cf05fc2280f65ed331f8f0fccba8d0ab29f8097aead64976cc1b4ccf2d29aac2f39e0edf9b6cf77bef7c01555bbe12c87471060fde18a67ba75250f210dba6db4fb2729410655c280596ebbf9f9ba3629d7a552e36151acbbb9c4b2608432e4a78399d91497fa1febc137997bd43f85e74c908e7a8a283fe997d5ddd67614fdc1260c37c86fc317c133241e0a4bbbc876e481d4d4ef91b85b47f3da8aea1f297e5bc9d8f3b27f0c7cfc1f684a4d1a47a523b6641bb81dbb32c130f3f0f5a5467b788466b4a7e3288ed19e584d0d1f5bf938edef5006f1d70ca0a357cd91c51afb24762f2e64302049a400cf80a8eaadefb2ee1cb98f20dc481ebd584777018f40e9df966ddbb92320acd1653d36d7f7e6955db8e1c3df5267096d4b293c59f003b8f1215a5b5b29daab4de98bdcf358c1648a5bc6d3cde4753d600e3f3216274e3f013eb20198b45c5c910bc701c371fd3d60f1fc44193f1d5cf52b3066d0086411ef0578d8e7aecc3508c100864c99a2fbe4d495cfc9d47f317bfed8acb3496824df17320240e6874824406843fea8d94d2655a3bb41a61f0dacb89ca6156fd0a3cc80351a7f9c59d54c6d48ac8a3302ae25ef0940c7c711cce655fc639760773568b36efbe88d67ae4d0facbfc395e9a88fe9c31ce82d64e1efd2222aa6b187e9a38f404810ec464588ffdd646271794a1af206a287e9c3252bd308d97736a67e18b713423362ff6537f65a073d5f776e1112ca2f6f8f002d9d0e2184e263bceceae300790a2b1b2e0b4e2f2d6f61c46a15beaf3696b9fd0ba106e7ab0b9a98149f9ea744c570849b2180a666580bd8ad4fa4844167fc684e09550c105bec03426ffb9b0a9d33b07743b811646000654cd38e4103feab28f3cdafc7cd847930c8e7998ef336aa3f9e08f68f73fad34feae484ce3fb367feae9ea2dfc0a3041f847afbd1c61c66013f1dca6537e867fc4a1c1087d420eb0343e60ebcc1da3aac55458ec53cee78be27ccc5d5c3f9003750f8601fd2e764cf495d8df56d8cf465f2ab2defd47c5feef7629fb38d15aed4e0ac3d34390c70a30e74ed5a6fa4bacc8e4a2427f430ae3c731979b9164b8472fd3321ffdbd906b068417005a3282473e7b43b32b3fffed1dcb8fbff9ebe51e25040ebc4357caf18d1f2fd899d5f768952f9de82626624a81664c56d6970dc884aecd83863fc05865d36c4316b2ad4d4bcc6e2a7ee271dcf8d68f9493ed3e1c13b2eb29547215f50942f5d2668900cd866ce9eb229a2dbee5b1aec29f8b5fff406fac1b195b8c2f25e35c666bdcc50922ccbf9001259f1e1fcabdae0941c55c0fb4995a999d0995a961f73a10522c4d8db7fb2ca8a49a8da6063d3d889384989ac66278c99ea01357b44230138bc8c5d31510312ead4c631981622d3c53f2e9ab64940677495b8f4e5db7d62922dc8f189f67b9839ea9d28f071fd33142b598e6ed812f58881b6e8eeff59a496554809551445072ee453a5f6e8e04a8182ad0690cf62077d2c3652870ecfa1f213b8f3b668286249ae77a7c9b8351a1d02778c48c466ec5d09dfdd38355e5a6a07c873b7138f5d6aacd1cc38c0dd240b399d64f44f0d868b879ba407a28854cfea93f57ea08e6b7952fab05b864670649bbb5a5fd868603d1f883adc5ed89bf9a1a5d1ea7f2f29944606eadd62e9b48da1b35f1e23a200ea6e10a0574a8877c31f63ef16d6e8d124089f22916fac07c86238c6dae5fc7939d29120f454b4d04438d609d6b7234fd48bda7b7c10ce6884430f714ece82f6c52adab2edf0fd05fbd61ca2de50809f1e45bb9d2f89a01b2ef2a19d564e9ce8d8240ad4ac11cfd8b3ccfa3be37f953f14c27beb41e5f1338d4af9793143bfd1ea6bfd6a198a999756685dc354dd6ba0081f04b5987d262353156f153961d6f75e83c26d5cdab886d1b37b7dcf8507bff003b27514af0a45174329b80dcfed9bec63eff5daac47fad3ad88e757fa7cadced33fc41a0013454a8a865a8ee15a740e2919692d1651bd16fdf3a1f81ec0bcf75fffaa2010bdb4d3ab5670e77ab3f704a1667386eac4e653e9f299882f64b655e2283254434fcf1deb858726889679cbeddee5639976074d3de8b0586f22ee80ce218122bf0cbbdf5c4175d1b47418bf57ded9144bdc04cccfcfb6718e30075c53ac6fcf3ce923e686116f363be0d0241a458f9530cda3c5de4117ae5db666906c32c53db34e4261961e143040564fc838a6b27914ae94ec0d0523b0e99b018cd6b4632fbff171d297df93145c4e8415dc5fc700aad7d85466d6fdbe27d819f8b799467e45786ae393a3aa151cd9f9ce672b689cd24ddc53c42b12401d2b2505ff0786a28a6a7f80d434f6b6d6313e29b001a47810fdcdff63b1bd8123deed4873e42fa7028945047f71fdbfa71c67d3e6d346abeb77cd1865c0f119125e0380111832a23a7a4039abb040a16af573896ec10d5ebf4904e707b40c2959e739639c0ec31ea8b8edf82f2342641b26be051e36ea5133280e6241b98c88ad341a09cea412dc11f0378cc86609460a8615c754144e74263c17375d80893f6c60f3c730cce243c2dced603690e2b6be3ab241b9a414e45ac35be40eb1169220c39ba56bd1fc293ce9793837000d9010dbc0257e3096e97bea44de7b1e2b94b735c525e41f77ac903ca91727c36f1ab92e3f1e73a4b94341194a0077f0c0e756b1a43f82d1270261f9a2f2bf2615886247b41b98cdf36c9722893fa4c4763dd0279cf8f31d34faf1ea19a97b477d0ec8cdee0387a42568206f29fc5a8866c01df92060b32fe4fc7adad6af7045942f310101b12d5eb82a2faad38470b8897fc9aa5cabc897bf735f0c9c17610bc9160ee00deb422165c3be8dbcbe7a9fb9dd27622b678e24d4bde781a8e52cf5a40e49bf3f20e50388fa9c6a65f1cd29f9b65b2a29169409791c945ed811440b0425de84145511a1c7447b5d065cc44a2f590060af32c6732f581b1246e2ae037a1a13c099d82997f755dd628711accec566514776be4597201bfa3ca04b5f36cac3fe91967b429e0b1f253766a07b1385f8a9e74ae679e345d0ff1c47e093473f57f282f1ff051701ca8520c3d34a2489e8deae00f5cdd511bd7b8b2aee4ed828ee7218ccbe5136d4c568aa4c949b1eecc31b30dabb150a49199fc60fba17169b808551e1f54cd3b948b1c502f2be9db82fe371998e3e9003a9a602da8939ef1edbd5c740f4ed47f8fcbbf52143122cb220f239c2f3cc1b820bf049cb71b5dac5e459b048573d40c9185915de889b3b4817aa2c2ff3606667e8b355c2a45bceb887da7ad2ef46260967e9f1a9e81cf2c016572f10d314c1197c8b70f561620464c43d1a38b90d10e166daa7bbadd617df34eab78ada73b72932d2ceff7ef75bf388d9b3e6f36206af50dce8aafefd6602c504afaf1f40921eb7a25eee36e938d7681af39bf002fe8b97802cef261995046cca30709ffd80cb574f7991ad479a8f0dc17e53183896895a1fbd0be782806a4e8bada8dc8f4bbfff6407ea57cf3b2460f467511f6993e898652c8469a77823a0657fe06af8a9a471fb33674b08748f9bbe0e33846ba24819e8313faab70bb783a8629f5af44e0964137108bb39a3602e2e42cc47181037fd9b213b7dde36be0786f9ea7863b50dd5d259a9748ff324471fc123546d8f8dddea442eca72b584ef8a06a192c0b15b25dae9c8dfc7f060c50727d5b270b28ad42ac6a03e2fbe8e8472608856726a0529c32a4e5477be2af6e95e74cb0447488236522b08599547c6061a452fc6c4b1e9ab5095f573f437fd4273fa2cd8ff216c39a35ebb7f32c8cfa44fb97e8542706ed3f16f6eabcc1c542fa7dcdb570eb492d5dac792acd691c84e7f86557fabf14b48481bfc629cd9bc849c01be345592f4c160808750f2fd03ff48c0cb4755bf21677fa5ac85c190e57326182fb53053d659a1d33f437bcb9b0a9037c5c480349e1064c7c0a524e80663418ce4e32ad95a834ea6db3014dfd71730ba3cf455657fd36e55f542f5ccdec80e30abda91ddea1d1a2c46c26a75213e4f9ceee6e2f471d8db879d23c06d34dbf97442c0a468380aa928b4938748029b01688371fad70c8d4313752c0bb451ac157044d4558a5cb6995111f16936ea529a343d50db34c65accb4c53a046c5533de89c164cd0c3178edbb35a90b9af2d60e8a313601e5ebdcb4b80f2718ae035873989a88c0c3ede3b2a4f3d999f85f73d3a07dc7bcba6cac4c022168b23d69ea63920b7b81038c15d0f2d0557fcfa09815b72da8811a45c9c6df6511c6592d3ed5f8d792335f8972955c16c3969a098f152c1543780430892eebf126274946d69b699e5a207bfdc956a306d208dfd9bcaa600b71c9a708eee84d083070a6a8b317e211d7262e048d3cddaac812291e1a147c1d94476103f54cb1de7591f43b9c3aa483eae5d8ef40eb6323365bfbb471e51d2257c20f3eddae7249ed2c0a1064aa0840ba7c0d3679f30e9a750c658d0bcbf89cccb99a1e26a3efa877a505e3fcfd2f7aaed726e0c9ea3ec9bea44bd4cdf77a941ac18147bf12eb8244c411daf9977d15b51c3fcd3da0aed2567a28f1a1e3de198e27ab09643c985e39bed9c099e21487d12e142d42779d34513b9aa910fcc53560a440fb540cdd954a9d14d9b90b88c78f3015b377f27991e6d62bc512acdea4c4f648f6b42266a071e96d5cfa120ad8e6c8df140636b36cc4fa4dce5bb0442f70025c9039c95fffff7eeb80f43791af82aa306f6f0746ba493a92a4d70cb93f1f5f0859b944c25e9c08301c08b0ad143019530ef0488c18b81c6a48df5f0e8ed4979a79748409d521996b0de8d57192e1a848ecfb22d490d4137af393b527497797c91d4f1bc7571aefa3d8e5b5d93b8d670fe4fa8c0f47e9c03d9e20c849bf0a83730ac6bc3cd7a1458bbd367deea3b2eba2047bea7ea3f33a8061ed61cfed9cbab87b0a9b6454ca5a11cb81552571326014d8f269f32dffcfd93ab478d2fa886195b53db9e06d37874a6678e2bd5ad2cc57d21d72fd1effe356c48a084dd519178a49328f36bcc2650cd1c9e81311e0a38d3b822403896a42ab7b6bc4a9cc76d709b249ec91862625828c166c1db249ef2cf7a40fd0ae8e72245499b660138335b9d46356cc0635d4a5395405155c6042ff5ad12266c9cc31766a03bec7a4c0bbc623c202f99b96560614c03db057afb32ca6463c3a7856bf0ac711ee6f876228d0a49f40cd7e48b01649147ae80856a427290dd27a8a25ee1580ae184582b10dbeb83a18b7b6dced4e68c2afdbef7553effada2d44d9f198ebd0a1219574e47cd6da2d96c20ae52e1c615a5df0e5a73466e5eb94a7be3a27e518be9295d2ac0afa6e28c95cb8610378e6e20d1bc033976ed0009eb970030de0cce51b6c00672edf50032873796f30d600ce9c047a4fad7002ed20f8512bc1a2bc40f0fb10c720f003659ec07c12d5827f86fc72bd07bec66d1b36f2f8ebc876bfa9ad44db5f9492f803c454590a55e128c75f3e46ceed186b8e49f9366697c11220b7fc515bd9ad696a008626441fcaa6bc36556b2002852e132edbc041a029a708fa525cae0351854eab7a12f489de39d949488a1aa2a439c543c7e9d3208929322fe961a1a30ed489538d1fdeca9428b9584ca13ea8400a33dc35b6208dc1d8125668190b4f698dd9885a965037b2b7831638a7d2db6d044ad25f3dad0161d1994174fcd393e97b9831e0e5aad687ab642a9f60c5a225be6de0b1c4883b87ed6fff8647b82c8f1703015a7c4a4b0f82046cb13259f382a1078c1897e0b8b2d33a9290c94be829e66a332cc2e9e60c71ef69b4a34cb29455bc10047aec00f47953654ff87b46157bf48e7f2992e8af564391b7f223599da5f9296eb7d8eb37a58de3cded59f0f066754e511f95494de6a4c5135122e080d9563cd3138d09ec3fd94965a7d397d908fc2b09b1469c7d22f028962c66059ac71387661a574ad8cd6252d6588093ed046057fd53436c4f958e571c209e743e4b0bd354199e6bf30981e6f604e3abf478fd2d787ebfd2365cd9a838b30ade1d55b0d388e98e1eba6b3829d4343a32027fd101bf3d8d81b712b9603c695a258ee4df5ed44a567dba52cd3723d4f0294618bfdfcd32287eaf98e2b0405d32242bb110bd2ad759342c0638ac27f69b2cc3a401822b2a4abe5642ca09b2e9e58e9aec84dcc7c602b8e2d2a1a5969c33d1c9df7676e66da9ba7d8a0bfc0f54411817d830866163516ea1410974ff1b6d58871c235049e4c8f51f0d9204b03554c165540c89df00a84a6c2cc82c2b3687da996a1ceb9106df0ad0f9ccc6e25ac04716feb0b1703781220094684637eb787902c11b424374092855230fc0e485889a1ef782e11d08fb73dfa9b77c2c9a2803bd24caa726da0c75da58186b222529c901443e031865517aab8dc5c90d22ee026a15c827edbcfa1065b5e438697824952f1938627ffbf9a5b20c76cbd287cd27a44f5f9ad2e3570fe8852bcdcc9b64a0419d3f17eae2a9a1a600b27c329a9ad7056f847fc22c3fc3fce8280a49a290131b81ab5f95c39e27884f5e3c332a1e353433262541e15dbb5c3ec9e1cfd02a5fcc1ef2d3e3c35ec5272c3ca229e6e8b4147a358f77648916e05eb617e5174a7afe8a2207370ccf2f41d981a1d20e7e552a02435f009082cc4289b9c3c7b5bdfdfe98919644b9b4133558b5f766c55a0038f44be4a6366859b1933c2ab98049f9382b63c47b3dbb4eb43b37319751702d2e1d43e3999330d29441cee837bd05906418affec2b26554957f2ccadcd1a30d802a1514fbd582b1d4bff07d599801604b751d2e9f97dc7ae51ac0ab2a2796ee65fb25e49e5a11f4b1b5b88347076cf71895be5a5ff20034897f9c58a3a38ac15dca91897ef12c2a513a13dc3809da1485fb9a17f56b0f32b050d3fe90aadb73e6212f84858c834cb1fd365a7508d18e5902adc364863998c05d853f89aad564366b0a24b8bdee99a6b1dedd2ded030ea1699255c2cee428bb38a66d1f5db5fee328f20391e62b4da0820c909f106ca274c11531858448a87ca4a4eb6c3d486a8557864a330c4a48aba1cf1d44815f9281708d0bbcffa4377ab629554bc2006933bd2cd3b569d29591fcc7aa2c62a8f1b0ce416ef02e34eceda0c822a19eb3930ac02491c4d8fa37fe7e4353316df0c4bd827787d121344de1ded8c8899c365fe4b806a2ea94a1a00c58c7dbfeaedfb5472ffb812142d70b8345bcb00574d938506a4c547a218e6e57355680773c0c4331b1f418b48108b3045058c628328ea3c4f12c0e6ce14b8f38b6af8959f8a3607c71191af06ee9f3dbbc1c7c970065c884c4c2efe66cc8e37277219e4ed6d7db092298e3ae8537e82d3831b09f4762c1e22d16b15c330455c87584bdf24fd6ccba00681d406e088d92e4bbbb140f058c648ec3d7cce255a53bd62c035bb2e9d9744ba390cede5c2c7025cb935da2ea086f902c4f1073dc3fdcc9c7ff115c5d6a3edef9efb1c832e958350cc49e69d6c41110c39e9b180937759bc8e4c521de50e941d96f078169a32248d33fcb099aa7f1e64c9c0fa18b7d64f0d1a81eeddc64e17856090d0a9676c9d423cf54f0fb6f06d5b8235a99bc92a66878bcf1f42c1888d384580246c8b696a5732c1e25103bd4fd2fe4b419e573fa41e283b6bd0fc79a5859477f23a3addd90d80c8658dc94f0c1c248b924d02fdd8dc6b7720b6803f7927a572c725b11b6bf2f86c4d6251b0e381f7523af54e6882935569e1128660883e6e820fb37b994ff8908b99cbbd77c73d7f8b3220c69627145ee468a4bdd9870db2206ec945ee623f76a27e65399309d34af36ce556b12006e525e44f275fcb9565526f0c58652b38465f75733dff74a1a9d38890350c0588dde4c07796f4da74ee33d00b4e6e835b87e9dd765a1d561009a8be244df268675b6f5eeb8eddb36f6c55c5b926a9f557bf2db32ee1e4152bceda2556d996410ccfcb2e0b6450ece918879806574f2124316a85950b0dab06be1190f52a484c6b3102ca559973832f012b65f42777849ae6b278013894fc1def07e96de061adc02e77073876a8f868dd56283eaf033056693249e54b175959681324017ca6e65462025bcd2ba1f9cfd1a303af72a6e91e7800aaa08e8b89496b3e44d5ba4094502c4a8af4a6a3dff8b578ecf6a72a4d6ab014398abef9236fbfbe339b676ef1d378581a863003751888a8dc264bc6d5a10c2ae687f7c40a2977f489329d83a7fc2969ebccb5cc99260d49a55d5789d822e81064321d2fbd32249d8cab1daca2680287daec401840fdd3928bb8c1bc662e47cabeabb0b8ef3f3743aad886e25491bc643b7d8cd7cd31747d9032f40aec60c52e636bbb6fabd963e11f34a08b6240fdcc74b208e9c467ffd5f58cfb531ea100bb8d75bf62cff9665b02a3821835bacd4c24684ef28a05b76a9b780eee6d2b7724ff3576e29959abe29778b97ba2ee6bbd6558de49f5b98b7cfc573a129013b303e8a317d42f3d0087023c1194467c74c9403dc4ef0a9fcfd9d17c25ba4fc70b0af24acf9e26beccb6f5e3fa7c90232a5a3d546f91c627a4a52edc7b2a0d4918d4b4c4d67196b6d7ec8aa72593917bd9744c531f45991799bd944c0af6be90d1d3d0bee263ff4f1ce5fbc9d5afa06aca57177ecc9ad67c78b0276402745ecac5c8bdd70d7581a382e4aae4632ab857a03536f0058de13619770b944debdd0a93ace51dea315930c4bc21f1b502b0bb2e0ced37108f8a0a6342fedeb85f216aca0142f52157807399c5b78c11644a5dc3c33bbbb089908c79e709204e16d0d40b85ee1e73f45c343ad1f2b940cad50a8002183956b9b91ab3fa6c9ea1ed7a821c86b31423d52a6d576e6ff57d63563bd64923e4e6b3d6fd07595eb298a0e23aa034fdab31c65304f814962cdb3590168579e831148e32d927605b4c95765d0002c42c710cfd0fcd242bf4095334ee338f4cc7456ba980122ddd5680330ec3e3cc11b6f0589e291ce96dcc5632aa388a9628bb49cd82c9b0821517c85ec57acedb759f5ef0f7142e9a4c97bc100da36611d4777b472794cda54c7027542c9fc3c4c34c1e56f3092ef2fa449e569ae10f36292ccfa4490fd4d901d1aabd9fce026670c968ab539e467c2e5eb8d1a514e7e1853cd1abc698205b8913051263fb7b2948dfb2c78d76ca2a8f39d0426498a8adef2b1f4bc9cd2332a59cff7c54b16600039131ca10e76847dbb13e4477c4b0a8c575912d7e9a0d45e92a6c75e01833ee348f85cc0963346c680b04a2d8f51fd3bd8ace547e9b578cb2bf4af6fa94a1e504b9d61d2f5a8206bb5caa5a365f0ce1d056c0b1e915ca4988c23fa48460ed0a6edce513c8c5f7ec2b9e4a5cd1e612a4e6c60a93f4c5fcb45db8746791c75efdca5c1ce2de5de1b0ed9bd4ca2930978db8bacaf4f82457b181b77da73c318c5e9463532d91dce44edbbe944c67bde5cf088d08be5de360e6ff68c4678a1ea6eb5b6d3c756df81f89f87d635ed3a8d10f391c12147ac42ebc8dbd109165cb8a364e3facc2aea8ca82e0311be9ee08fa918f8472504f614241d71d7d2ad13d6a3fcd15f01d29b6aca5b963f57d0bc270815991c051710b5496d66c334194d6a81d29fd283729bf97d9906d2aff786548cb4b1bdb7685b89c27fed516b4b8c3b36f9b836a9d080cb20681d5ce70831c13ba83c863ec88e894645d6ffb8765ca0065d12b8d9bcc70c55cb390e0298af1f7ebf3a84aafc27cc82974131315dc5d3f450cf9a95d753de33d314ef635c99e9f3a73b6f94ed1e4dd41770723d7b7cbe89b6b44075ea7ab1629886a1f6a088455196797f5ac04ba1f64409b67bf67bc48345a10f02ba1358daf04bcfe2c564417d37f22533a24f8c27f9051b3a73ef074eb44091f07dad21424831f2ee4178fc635ab1089a102f819cc33f1bc0ab2672c947fe4267d4ef542e9a9a488a62e47433fc8ddfca78dd8fed437d27a69568608eaf86ceb143c14b6a96ae9de054958b48122e7cab8453b8864d4d8a897fc4bf6129e9fce1d0e8d5213444143ae079d9436e3f6c9cdb171fb2f8c4499f4eb495199b08e9b0ca5a144674481767e6dcae2c1787e22ab00c2f78872ecf7c0740243d343397278908700d0ad9bcf8242141b4e332c9430522dfa5186f49220ded30f17c99e04fa2295712fb5f46dfe93db1881164fa4e8f576e0adac2191550099acb16dd108254f0076f6882e102aaa8025d485d3267220ae0ee1933133cb92bf0af30dd7f55422b81f9380516918ea5b1cc4908dca173691a8e5f0221d00b2cd45a864491ff5f7a12d18a7dac45d3e786590fb2b8193ce73aab46e9143ed9b1a52edcbee577ebe4a6d268d0190ec3e6f10c31e1b0b5442821d92d012c248b5db9a55dadde1a172d3f5ec70bff1952ac2df45dade219fb71691a9dac3b8ad59a472eec88502c46ed805943d28c0e9a87f491a02b5fa34fe1026cac07b252c379b6afb16832fd1f443ee695517c3c88cd99796c30115dcb14d432835a766cfa35f6ca1066b875cf1aee786fa8e8c9ed79b086490a30089852d0ee3206ea88a3f698226bced4d6895cd84f533b0c7d46405561570582ab8a6118120ffef352e7e2c530d85f431276271de920efa98e80cac72fe6c555057465a1f3db3e23303fa53bb3a3c7e381c05486d831fb18214c72939aef19ed63ae85e5ae824e0052f6f10867650c9e09b851047ab5a40e23764cf767f8d3b9517082260bb88b2a7246d379029487d43143692195c3b3b1609679af7a3ef431fdb04d110731ce2cf0a1af1d3894021752890c3db74dad044ed1125240a8c63eced5a5358324130074a92d2d4abf25c3dcb2892d3f1ec57eb4f8a8ce6cccd9110bea7d299e592249a764a92d60728d75ef60d8c44c0168287e1f2395b0cfab32fbf8d0b1ef8f2d1db654d535e80e633a9a3b6ca2fa93eb666130cc89e89fe78ebbaf541fd34d10693edc69b42da26935e288a69234d4f18496139dd19795dcb3684639e3c91cf25af85cb947f1838784d54d4d3f117262f960b7dd464ae2bd0a543bac463c134477e3f06c87bc5eb9713c78eb08dc16e9263a64e502ac7273c9b17286965e78cf3f6d28bf5ce8a8364e129b5d23838ad314575d1ec36711af2f811175f719ed6df9a215f20d6d18e9fbc0be15ac7162d0b1d00203d25573fb4464d3999bbd0b8f0b161e650cf5fabc1abb64351dca0006581ac3213e1dc8583f6433e1adf688dda584eb670b11a8c3f874b3f53f1847aa050e37cd8f5450594319ada92e515299c8907454de52e991a8fba3865b4f66a40ca388d1ea8e0875c4db96aabb2456778752c9fb87753ffc7d418fc70570e5ad64d7a5d4cc8adf47b23d9a82017a7de16a5c23ee820bc1a5b879dc166d86465600c6c817741859e3c4ca03b6eaafad4c1bb73aa88eaecbd43575b2b845e8062a53a6f4c59db8785ceedd28fb2e12d82961848cb08c0c7380c5343e7d51f15117bb7afaf1d19b7ad93f0533cb77ee3ba6fde8feb250ffe58982ba3648d375987ac94d392bbe5fe3cfa1f56a2b5007cd796ee459ff1f139c9db43712c6be682e677e7f0b189e3a405ce4dd44d09944fedc94a13dedeeb2c7e154af07d80f3fc710d57c0a42b70d14e17d97c7e28305e35ba2cf5f72a935aaf7d38a21230257d886336ee914e84db78dcb0a2a49762c0c593191f2fb6816a405cc4425d09c28614837f1d7aa4c58bdb2b48e7a8dec83f25049de70bb52b998c65282e611385ac82c1a5b69730077404c3a488f1eee59fb9397197424643e3de8c0832cc31168be37d18eff3f587a36525eec3d4b391396089f645c2c213632dbf1775f068023d518cc592b9b0c77b72696ac221acbd8381f97ec19bfd4ed351c9acc3c8989e43ef814c08114a245d8962b39ebcd9e5bcbd8ebb4ff9e9758be2dc4b30bdad972cf9d80c64ace90d45e0f24723ee8a03952b0cd325e5f648d44da5277b1500522676557c1eee6142c4700989209be66afc9845a45be37188e346c3963aa32a55385f5036a769e6378e7b8291f7ef80560b661438492507fe889e3769c49c751062e15cc481fdf20839a8af14ae72bc5263f13245b45d753afc79ee490f69cd6db735a75cf6967dffcd67b928ab1f56336777c3f17044eae3338e1e5bea9161ee046cc9317fa86449e318ca329fdef7218b23016fd2fc90ba68d24a9310c75f6d83786302bba2d669f00ed4b50bc96b25d71de075b96b5c2deb1ca917f33cc89489fd1283f25d6820c82e7ab3c08cc42b45764c6b98c714b768e594f1688ce2b77f3e21ce4b6e8c05a906592aff1fec4612f0e631604c116a7ae3b4602b1d9f4c99c55e56bf12bec0209cf1ec2a56890e48ddf9c010248456c6f7e20891fd792806a1d68aa7003c9e968e82634b8320097dd69d81aad82e3f786a5252ed590bbfdb062216cc4c1c81a0b985c8e4566dfd5ef96605b6e0bb1bf2ac12443d32f3c6a84eecb55ba485613fb92771a3403947847e3f0aec859856ee6fd0b14f31783d856080476127e3ef93f0beac16b2450a5c73b3e374d9346164d2801bdbecee0eb7e5a5cbc1ad666d4dd4f30e5ea25ad99b0216480c4dd1b50442a836e17fd9806dbb6829d690beb4ef31ac8e53cff3a044410e7541dfbc461eb84ff11ba80868c3a8f9a301aea8f85a350673aac6a024dee02a05efeed48f015240ea0ca4171df8f1f68a1f066537d74d0d96d9f8e03cf1650673f797266b83ab49a172da9e593daae5e945edb8ba64d65a30596f8289966b3ca06c12f64aa8ec8230759a6620484c9264906154304eae4fccf3d50fe9e8e35622664207bb5790e46ac4e82f01ca8b00c481ecbca9d1398560691d5b15c41fa9828ff048e32ff574da3694e3288c0ca30d45107bf60c54a6e6f1dfc01e58a6c51f4e9423ab5498c5ba2821b2cb8a672aa9f2b66ffaf2900870aae1cbb4582c29592142f50c0512ea11ccddbf1d5bf2dc72979ea25f8cfbc70926c02ca97e86aa2e6eee8d16ccab72f9cc2221e4b7f564010119708084d3722bf3e188c39a28947ce2bc4e5287b1647faa471d36d8c7efc5c9dcc876d5dded9e330fe38496738599de9162f03f123630ac186e2fc38ec260ed18aca0c1f4c14ce5580bd6afd573ea5f8d4bde8e06d6a62be72c591b5606c5415062fccbf4588bf1e8d1c4134675709aa5e21f20132d91b2648e9ac699e2b9255fde7419327e549f6da413702fdd18ef998b8be3f21fa561d6b6dd016de37c8dc37e51c93055994747b37b95f0b7ea22497bddb239aea46fe0db7ef15536d36d9c87d3ab99c8404776d8f68c9606c26a0b00428db11fb5a9a6d57a3fd0f498b67e76d01230aec5216d3d3f05399a51a6e1c2c67bf7576ef3286877c6f517dc26680d26104b7e3b2771ceeff96a11fd8e43842f1da771730c228042f1951d6da5530ce3a0c3bcd12f5f984f3a16ec97ca758d2d3ae51ac7143eeb3ea2a21517509d14a7c430b506e3d9bdede5e2d25c8a856e13302b9177dd5d266b42f03a50c82c242050dcfb39c397360a5326b4d7a2e9db4e2c87e5e6539f2d5ea2c143611692a9696799891f07a7fef662cf9308e594e7d2bb5f0574216468270575c919c82efdeca1aef4c4a0c1e7fe8f9ea9fe9fe6641a2fc6d5e29d50d5d4dc90db36f684c62597f59d788f45e88d29d065a0ae055aef642c8eceb5efc1358c70945f40a32d68e9ea04119b77ab645dc60a4f96bfc387922a173299c16bf9c934cafdd7af1a3e365d68a1b5af8da602699e41c8cd8437d0fbb0ee9d9558393c2656daf5dde552a9a82fdfdb6afcde816d3b7a3a2645a797e3c89da7c1f818e1763b97e2b075a4997bfec6754d557aed82ad174672afb4ae612e64458cec2df1c2a3a5485c50255a86991b291b333a42d4de0abbbb2ef7cb60692024ddbf4af58546164fa2acc3a6772113bd8bafddad73ade94c7e8badcd55db549af13262665fbb28c0d6ddaed26749d5a0bb6b5b5277458d41f6e37fd839c86d5543df022180c8e313454af57ecd19eb8a5b689bb42954d70d4814a484681e44245a084c5ee999fc45cc4ed87862253c1adbeb024f510398fc9602191e7735636d4372528d9f3259306eff1f3010a7cffb432cbd33503e56251110d48074b05516a6c7351a36e9c7b445d3dd1f1959ecbded81fddcb5e593c30eab0975fa87665dffd7d143dc234999208ff9f33bb6612cb58d2d2e1999098d51c250ff4211d8e993cb6b452dcb3070aeadcbf103baa320636fbead1ee8f801dfd3fe8c1becb26bb12b137421c6881a4fa97f0cea91c9b5237dc4fa46df779fa8710a8f5c5bb4e833c3fd17fb39f100ea80c8f9966dbf715cd8dcdfbf11fb1da4ad883c9c84faae8056afb1230fb3cd6096ffce4f3f74f866452c12869eaf8a68fa60ea8c76194e95187d378bc647a6f463c8581e584b05e259bc1923da86c7e99d1d25776c1b1db81c70bca5692afd7517b719d61c02125c658aed4cc6db06324b107fb728e968a0a0c094737dd8a98be14427ac36ffe73f7c48bdbe48ee0e053a81cd58afe129cc40b27669278d18153e310d26a0aaea85fde8d931fb75601ad83680b4acf7827f416e4efbd26698dafdcda043b14280508bbc46d58d29f8c8a9532f52fb3b1d29c72e59e6d7a78c20b6b2cf209a4650ced51c3ac6650a28742ef1fae442737b2902d61c15bf104c33f89fe8f7c747532418508c571f35fb81f686749a532073de951b4cd7d8efc4f04e59fd9f8000be4e03270b0c968176504b7cc384f5328ab2a8e3b29365f8aa5799bb6090fb5decd874106e09d65a002e5cdcf80f5ad6133ed5ccf0efa73e91d74ec3cb365bd941ce2804bfe849601f1b6712cbdc7106fcbf3762e59fa2f2143d765768305db2b9402c4a81c8578e4f23fd2ae9b6f65e95de228cababb5cab497094e8231d44974663e227c8edb6496b9561d795e1f0bba9b695b24a1d67d9d7ac85bcc26a57bbfbae13cb1f82bd32eb678ecb20bb1624da5d5516a3c9553afaeff5aec32a44ca0e589995c01dad1b34d8913d0300799186ff1f04c3eb2fdb6f2b63d88b86f8a95b7e7fc265c631b094e6beb877f5bf231c2c51c415cd2b394c2d7531b8e04ecacb847520aed1419fd9faa0fa915831fcb2b702c86c64ddbd684e2320d08f455f6a0e30bf328818769e224aca54939b4cc08dc3d5e7624b7bbb5ee0462fdcd653785fd278a086fc70287aad58ac7643cc3c7a8ace55fcc5bf338cf2b9e402d66b517afea678ebc73736e180dfeda01c4b08f40e7f825e13c8fc64f53a030a22dbd091d028bf61a45fc0f6a9fc6c200adad88b6b39fea4cbb726a9e29439045e90083b28adffb51fc350ab8ffebc12ad3d99b33378109d2304ed7d924ed09102789f091cc64204a9cfe835752e6d65704921a52126cb84ea0da9c028d7ebd8cf889038fa50308e53310c7356ac7e65fd267ba964b4f8d9cd15cc09b073f9fe7c160d6afdb7cb5c80f8c076c54f93704d09345cbab3ba0603f398eb4c719075c6150c325952d472be3484fd483e3802fb3da8a81e5731b60e9cb672f306d0dec407a06b5dcb6cdf69c4cd4d70aba2bcceae6e33ebc927b52a32b855b7ab32bcfe46f7ff1b685e776955c9f443c68ff8262aabfdef37b0d3fd45a42413c7a13a0efce66c42280d47b7a3e2d1a0081fd71d23edd8054bfbf85e2c31fc0c8e661297ad20bf5f22ea2c517efa849459526414b47aff4ddc250da5fb934171f0dbd1063fd9279679b488772ca26b523e3025124cc00e8a2c0f6c72579d12577cbfd0759c1c0af088eac3fff279d95dd8e357d657cf24209f37f0a0f8ef27f13cd4cb51f9afb7e7c8215f57fe811fd9b458825bcf815b4af6f683ae723d9bd1a1fc000c80a560f9c4c9f06444070f8be83d11c1c9c0872a4e60c72ff6d7afd80ab1657859f1c51b10218868297ae9902570644ad47f35ce1696ad6c2e738630853446d9726508c34ab605379e329bdc149b3735e78be84dcca857513dab25ee15e1de4b2202523a2419f9d497b540b640abbfe1af7c4f49349fe20eae8dc1954d3a1d7ccbe7e0b09f963eb1d65ff4d1b6ec30930570f40bc6b3706af8695ecb0538332427c24f2619c925e983bd4751d5977c50efdc292407e8a938dc67d2ef86e6e193c74d8719cc5501cdeb0641161717a365829f8638ae0ad951789ec0509c1b82bd6285c4a881ab4c387700d1401207623a528cbe2a483cf92bfe88f439edcd870212ab17b09d938063f6ea17dd74d417b509174e937906b9fea7aec70be1a73956b32baeca1c450b9917c063f3f67174cbff4b014e33f0a243dd7bede2a332f24e90bd3f2070fa5fd6403114924a064c8bccb199926bd77199bff4e034c8f0995b2ba13aa259cae5799c902977b64002636221b954c6e82b96b80ba0c848596f4291eee2e6a98c566c2f20063beec7087fe3ef5a3727ffb095e5895cd9485ddf9a4528b4cf1bf11d9186ab62e571f7073e08e7e06db04926ec14689db72bf4da3c8e1af1a47adb6d2ed4605e2bc75f6ecd03df011fef2d3529a6baf6c0b05544c755e88d6531bff4ec5ad3802a81a8ec47d325bb24d09adffecad63cc9d24944d7ca7e729f88d85010cd45d7cb8c4ab18d125ad6264300cbfb69c608cc4ac0a3ae3785c677d71965eda3e3641dc43a300deb0cb275e435cc273d4d0d30f1a22a41266351dbc863057a4b8cbe117ee04e27a2c18b09f4e2037b1960272ab7c50369c2368b74796587c50f9c45066715d115f414b308b984d340a043ef7dea028789b389e240892eb60af5bf94830c86f471fa1e19bba30b90bc7ef9487c91c83875d8599e1889b8c3055ddae16ba36c32b5222a8b4c4e8d2923ff1aeebc85028993557120828542e5c30c4a05a6739f68fff38b1e621c44462e7999bfa34344b9c887508e3095b05415c1cfa41abd6351bc342c80eef9c2c9334a17fbde5275793479bc2529d44195257d73bffd165f6eb5bdf979c800f91dfe8a7b4fd665ad8d011c7ea2fcb1add44ea0681fc95af97c8b0150b4b2949aee0d210c208f3b871313256bfe11185d9cd6783de7690cdbce5c8c8981707694cd29906aa26afb859312eaa290014cd0f3a2c72012be88ee4082a4096a94d2508be58970ec1de1bfc05d2511ee82971ef0b6e0ac9e1d14bc97c97424cb775c38a5996a4a425215a2f9ac00f97132881eb31a85c53519238f6732ca07f279501167b328b413401292936ef1b32cc121cb952fa005379fd97b6ee4b7b6ff160d73b1212586ab2b91ae470424b2a2dfa81f73100a8cfe5890eb7ad81e74efee5777f0940702c636e3c0d6cd9642db75ba6364ca343580d0fc564e2c451df43893722eceb09d0ce313013172a5ada9691d1b2b505f2993c10f522300e96ac54f363d4a294378720b0e84bbc7d50523ced381d7a3807720c97a9a6f30ef08493f340a2feb3424e2f6aee8240ca3ea638b6e14f44d5479240f33987ce3d9af12266fec6116453091277c983c42787f17eb67f02379f07f29bcc8b0ba4e872e71512e4609293b3d2fbd63eeffd4d8d627ef2121e2dc679bb9755e2c1036b88875c34b4c8368345f84583920e4e527bdc5798c5c987b1d5ef655f3c3fd7619369eb036440f9f80b816fde7813611a36ea5cc09b29abbc334571d53ce4f643e760740bc18e4735fd02b3e333ea2751ee37bdde5ffb447a5be2fae65905e826aa893ca3f14a7fc9b24a54c93decc77b4cdb54239521cbbd419342320ba8cce4b2be0bcd7b8aeb71d5776e2b491f928b060c62bfc6b3b17f87a559c75ec599dcedc44e1bd9ae0686736973bafbf054fee9ce72767903ac86a9ef0a0801ee8c3b644c1fc5bff4cacb0f920aaf9cbcd8f30e966ce34d0c809722185e8aba6ad9f7e56b44916d4888b9bb752bce3b73cef5ac89fcb6b09a8683ee466c3fef112263539ea9b3dd7592a8a8359677bd76b6553130a5119809ab1417ef4af08739f3723b72318e33afb598c83c2a6c74d378ac468e6eb81f0f0f5204d14f49cea436751b635edcaaba9b5b0dbc1d63bddc0dc2e5a75a8c7ccff41170d11473ad7c3ea3b6858c6ebf85705e5493186092a477bec3d203c9be678fd6ca033f5da31e22a7ca4e321801c3cd15fd90df0a74e173edaaeb0bf56ca470d959fa3898a3e0fa8a56e532bb68d101b17735b05168feca8a6feb95a3944acfd508c3c92564aa3a326752aafe09e33546dfd40ba6704177d0ad032c7b20898f48c3ee0f032cc60e12c1cf719e1d1510f3402b7066cdb9882061a2fc0b5484bb1b404ad2c38b100e1060689641c42ba6e810c976f6f609df9f8516b7ef5a1db3ca63aac17b5471aa7992771063d00be13b081b21ea163b2157e912a7b0756c06534ff273762e3985e7a10c934b6a7798b590b5c28e25f693bc050b1fb6a2c8c6e29d59a799d640acc7ed6c8880390c0aca77dc4aa833d90e4deae925b0b7db74d5cebf44252d7e633b0350f183ccba2405d9055e1cf5be2a1e3a4b887df15e2ea9b7502f9245580085878178af200706908966a362e8f4a490dd5c6dc6e8b0941206bd6426df59a2d3137e8e48b9780d6cf5fc22866cb59d7d9792aa037d56764d928bd780aa997af1c06e6edb399666ffc94982e47d6581903c214503c61d4bb71d28d62718a6fb19a2d5da17790f3e3fa539b2afc7ac837408f7827286b6e9c9e9312b292ffa72c11adfedddbc9fac72a0b75625fe202087e7a0126190f1fa1d3448f8eb32c3f7e77f0a4f9bd54fc4be9a800796ad4ea7ce0384a21ecc7977c671a19adee69a0a6af2754ae909b4c039e2dcd3de1cb0706b543a5ab3956a0d351f5e419ced939704fc4c1ddfb8356e17e4d8cb391c8d430a5f4a5d854ee2b77e08e9bdfa971dace355616259a4c71a52ffac7b98105a98c2bc7d90b015647174c14c0ae8a91c187a7c745001a97c0ebcd0c5f1da03bc1708280d08f0cb314e958df80ea305697ac7097753ec4acf07fdd64431bff77f9a9df6f288c3bda591add5e3fcc73c0a55480c5ff45fe1c5a9c77be2f266ed407fe5ab4cc0ddc5fb76fc3af5c0ea7d5ebce1cbe362508fd3191e29245d05a67448c82ca6550cf738052b80ecae35cb8306024066afc4f2e0b36913272e38acb4f7f79eef29d9df188448700173717bd858cbd5678e4d4f946f9ab5dc42a1b8279c249fa42a879309dd7e9ca7e0746f3db895182ab44d82305840b7235e70b1306579c0b76176d9061e28725285a28347bfd84180d2318d8030f026b8da281f63e615b35a64dad788c51e7d99741ad0584dbbb0b255412c1c6b6fa7508356647179cfa0a8c4dd260a2c93b0a8243318730c1336a81012410187266b216a147fd1a783337321855ac7d347996240457badf4410efff2f3280ae139bc023ad63355de0ac41677a293d6b082d9e6228a6117cb56ee2f58001ea1b0f8c4f47201871c36e4980a39d3f7bbdbf6d58a2b50abaa02782cd486cd8c11c27c33e1bae8db522ab8d1dd72c1c3bc2c52938fad371e3bfada123e9023829f436ce0ffa2ad403d98ebf0337c64746f56e5c8a02bf56132304fd537cdd332a1d5a10110ff5414ade4d10455a2c49ac29e274fe29d0402e23600ccd8c9aa789c6c502a041bb1d3b2b5a9b3f0f96eaa3ab89902412d9d65c859f75373cdf4bd6cfda44d0ea084d22a1513a419a74344afa9088c3535aae423204aa3f96b943995826233d3886d8ce867e22eea07b1f345e73be2e0d439f1d1b3555383779131d6269229d22462a38b2b5597fbf7188407e5b88c75f037bcf2af99a28cf31bceab5f1746c94f8c6eb5423ec60a2e9226f3a283a4a02ec205634c2fb927a0d436c4d0fcdeedda14374c674740389fb6cfa0696d443a857763117234005907bc50320b58b806c9beccad9587373289423e2af04b39ac310d53c9fe3dfbd52dfc095bf8308e42c68cb16a653ab6f645d80fc9d71bcc6d5522c01e91098fcb6bcbb4437ef11159993aff8646f1109f0970599421e066f8b8e2cf7b2797199b2b4e47c170968e59a76b34bd6f254444163dd8f83093ea9bba30b2a61d01d9bfb615529af4657e82d9f832e8d692b811180b7e8b4577f3a0e6c4a36b9eeb349f5430ea6e6338b00d1dcf8e8bfc39cfc654a8a6e4a1a904ca2cd61c07052daa5ee252bfb4951f656b31b25c083bd734b83f9f4abf148be44626aae91e9857b445eb8892bd77b6d92363de63e1f3da5390ad167d8010124e902ca730a8a5720d0289d0eea32e1287537110a4ea439995c600e382af6b324c0192a8532c38c0723e870b05d592accd55c8615de61784020185082db1da954eefb51d406e35ff9582bd6a461cb860e4628482f697bb7b52db794524a1993087e0808086baf3802202628e13257e47382baf6a6acc4d884a2245d1153d79e91066757e05c2cad31cd50d71e0cbb01c6dcf3f2142f4ff1f2148f47c63b7bdc795e98276be19ddbb578628f3b8fc7f92bafea571ed5afbca95f79c7c7404646c8b2c07cf050575ed00c909e7e78715bd16482baf28e688c54312bc143ac18a6aebca2d050911b939b1b1375e54d7d28c16b4b590b12cc8aa82bef88ca118d1c48bcb48ed495a7f518c96ec848738fd1db57b4edb3120af7b8a35460d018bfa252bfa2288aa26568da0e23618e4452669480a5ae68718c515b8d26125c36d4153dea809a171362092b4447d4152de24812749622adec85baa2535dec862e738fcfb833ee3c693c3e61fc7a46fd7abef8f53ccfb2c74945764c3171bcc2a6ae671051d2908de30a1f45d4f53c7a2cc2690c096a5464465c61ea7a161f1ba5e0babc38312688ba9e60473b8a5adc20226ba2aea791054329acc462d06822415d4fad2fbbe16beef16a829960269869e26e7a611e7c86772e3e33c51e77934aca74f1abd9e257b3f8ab79ecb0e305d01512af21387535839c3899706543ecc897ba9a355204d9e02234440811f56c0c0d14c7165b96a8aba976e24ac59a89ac2f337535955284e1b2f22106cb95ba9a5a38763876ebceb833ee8cbb5d55d46eb7dbed763b279d936ed51575455d51a72bea5f753f449d4ea72bc34025062ad7120795655942f15f4ba85fcba75f4ba75fcbb22ccb3e08509c9b14ad2c4bea5a067d216b7293d3c25154d7f2882a8ad2da18241f38752d8b497165249829a130aa6b49e4aacc09eead050c12d4b5f461f122cda8f8428509ea5a6a61b11bb0cc3de66ffc8dbff1b8c79d173de64dbf7216bf72a65f39e7bcecb109af1d4e3d25ec205257bee4eaec4b13a314705beaca8f46e0f882c1e24d0e8b8abaf2e2aaa465891b092f439ea82b67638322a494a34899ba72e3d089a2314f4dbafcf85257aec58464429263e418b9922a76bf923f24499263b86c86dd3063eef1bab136d6c6da7befad5df5b37f884bbf6eac0d246d8c4f50dc11479c9a81b9323522281b605dd4754f01693140738ffbaae56e904ed39a4c9ffd6dc23bb7df262df6b86b128ff5cf137fd5c415bf6a15bfeaa310968c1b5242c6bec2d45507fdb4698dc5b955615353577d0485ecb8e4058d33221875d5451faf1e703ab27860a9ab9e8a3214e583cdc70c86baea34ae274590709870e1a6ae5aeb05b9cbdc63391964cb458525c5af9988958f9f2d5e735a6eab4a8a2164c915294ab6a822d0fa2136c58a0d294ed4351f55c06eb87dc562bee61ef715bf91612fcc43022cb680b905d80df7f637318f57fca3f42b266299808617303a986421f150577c14fb423c01296d495df1d15fb9c72b3af7b8dbc08240ed86db3f4029d3c2daf206e445b551d29674e3899413baa876ed440f212d9064956853d73b2505c79107195c9632358b09540ba8a02e1660d4f59649e59033012746aca8aed738c653aa49bfde238a5f2f1647eaf5b83dee35b01fec09ac184f0e9e4a7bdcf511377a5cf439445828b2da861029a2621860889cde9a7a92a86bca8130638a309e4c68fda8325ca4782421d16525495d7544188d3dfd10f1f135024ac56844b21c61336ae9508148f4575a5305ee6fcf69994763ddee83713b5157004a2ce356d7d3efbd7bcfd9bddc47b8cf9949d5ebe1f630245df5ed3e21e99a4ba42b1ec2422905a574c55ae9190580a57495e94a7769e9aa7f77250502d9d2f506bd0ec27a6fc831c2fcbd3b0576df4090fd5507bd0ed2476de9aa4bb6941797f67a3252dcf35aab5f1b90a14d79595d7bd98eb788a914f30969772af79cae1c3c7cf7a01376acd3de8e3a253e7228b7969e31f209e6d198bb5d39b10ce55b50595077861554ee4ab312ec8adda98cc14c530d5bdd1f0babfef32c71a42b064bed9123516ffb8d23cb79c560180c7718e3d07b3088be0e46993634521994659aae3650e9de76e7a4207fed6f81584767bbe0dee299694ba9d49e3d102ecbca91aa712c9330aad57002c7d2dbad5b2f2d5dcbcf3cbbd76c60ef54e3d46c40d740e7f8a26ae11dfa727c53b5453dc8a8151793aefaef69ad96252b82543b67254a906a7b79a1a85eb0610160047492aee51fb911e58d898a7da6db0374501979da7d6c758f2b5d4b8c75159c73ce3967a019adb7d65beb9c733e12b4f0bbbbcf7b937b937b6badb5dde94bd7f248579c1c1b2468e1b777ce39638c31b691f6b23e8d7fa7c0aebef70b97d412bb7bdeb9cfe8c075c36184ecbbd74077720b6f70a5b6c4e8516d7003618faabb16eeb1bc733758deb9fbed1a835c15df06b122fb3597bd0d3203c8e723fb216b590db763351bf34e8ab4eb649e1d9c982f5e3df78d57448991a31eacd57364c17a7ab0981e473dc5cc838db827e807b6e2ac47bd1d133158dcd805c36f39bfdd29ac6b34e69ddb330f882f1b5aeaed20e4a39c7b3ae81e32cf552d161a8fee2ed34e4cabd32449a624dccf93fa49b8a0033cd93b49923a58e75a123d9ee62d97948f37df720509f9b5a399411b289b22be6f750b3c40fff60f7a7f8528786b35fced421db273ce852929867f21df389bd11a8b21215545425712681a72e4ad88248c86578f0b94949fe00a4272f247e69c73ce39b96373ce39e737f8bca79c8b8de7fc39d3dcf32df59c770ea40a1d0c6fb9807efe7ccbf51307c3b498069659f3812e05e78b7811566be1b51aac50c76a60cb1d2b5df5dd57e9c5d703deb935ce8abfe63efe9a0ff067fc3f5a3f027eed82d742fc58eeee14eb94361b478744da57209814db2b85e1cb101c545aa0a9780232c24de8a0981da1186d68b5b5b08962b52c393a29cbf2438a172b2ea91b577060e9eacaf2e206d15d3a8191578d2238acc66049f349e165885b9bd9d365ea9292a3132c3de00e98839ccf3705395f620892e6b75c3e5ebfe6fc18f9f53c8119727472f8d00d807e086589bb0225d6e1acaaa240dd3836a968c42127108370904872e4425dbc1fa8b813a4fcb440134272f908f95b344390e2b75c3e49b87e6c70fdc4e0fa71e2fa514203bd5f816729f9966b2a4ddb0481406e0546f4d0bb87ae55063d1ccbbe2cb57ad997bddbb72fcbd2c397323d5aeb6fbf4016840eb21b6ed74325fe16a58a1c91f1e5c4095ed4f5aed748022a48473f256e948831801a5596a2a47c610b53d70bf6456cb776bd586f3f20434c1bd4d5d2d7996a831625c66210911c3952b52e1c91b7dddaa0e56043581158fd76051e5e04b2d740062cc01d36d1db0e82ed1d6c136f8918aba7a727c9769bf47b77601077a0df7deb64f8ad000fbf6118edd1ebb7151bfbdd457062c6ef9d66db7e5bb8dbc384e2f70e22fa7d9588bffb2dcef8eddb53d78a425f6fd6dec7ebf53bb8fb2d6b02f3fbac425f6f5a9b85be5eb8ed44f67b6607112935fdb65cc5a5df53d8ea77d6ef1ebf3bd6f2f9fd2bdeaae92b3e7afdc662bbe3b214507e6f9cd6f61bc3e1b8dfdd4e25e07dfd0374e843a2fadfeff7fbddf4df2f45d3ffcedfd6af83803bd8f45f0fe1f7ebf6f7ebbf25a3916ccb9598dacf060b1b5d4e304eb4e0f163fb15a8f6abcdfb325cf95501ef13f23e28efeb250aa7f72505bd2f49cbfb7c9d83128ef7f510e8d0e7c1c6c6c606e9c7db740fd0a14dbf69bb29bbe9fae6c628cadf1c75fd8d11d3df7409a0c39b213afc75f80b2cbcfe428f003abc50d27ccd90aff1f59a9a5fafa9e965e6014a69d22349d70f31456a4d6fb2b675e4256d288b458eaff935e057e0ff6cfec734f5bfdf8f29c9ff5810fdaf43001dfebacfe7f3f9ba8a0e7d8f0e6b9eb8feece779f69c0cb8834d3f3b870c45c29f346790f3ec219c17cef33ccf9a7e9e18cef33ccf9b7ef6eb75f6f33ccff33c4f239493efbdf70ed061bfb9b9b9b9e90f40873718a0961e4377003ac450d6d4d4d4d4f406a0c39aaee12f3c35f90b9d037478c1e7f3f97c3e9fcfe7eb20d0a14fc9db74799bfe011dda947a17fdb4fcaf33001dfe3ca0c3d3c9e875d7427232601ead6aa7a5d73c08eef0ebba87a0ad76c27aed536a8a72ea7aed45d774ddafd715bb64afa54ae829a2c4abc89cbaa62fc22847570e21464a605ca9fa872685c48f3933a8123a8889161f1756a2b85969ad6b867c4d4d4d0fe20e3c5fd379d0614db75db294604a825635a486af077dbdf43955bdaf774087bedfeff7fbfd7ebfdfaf2f001dfef2c921934427a23f7b793a09fdd915800ecf04a0435dd6df42d393b7d011800e2d54a850a142850a15bebe8213873ffb01d0e159f2b2db2615af3b0774a8fb067458c1433068ea83dd00e83058a2e97933cfe3f58e3bfc3aafe7f03a87cc0b4af13c9e16cfd779bc93c7e3759e112dcccc095a952b3c9daf175054c84d9d80c4e3310aa084943fbb067478067dbe1ef4f94ad4785fcf800e7d5d482f83550091d7bd04627bddd319af7bb0eb70487b0d24f5ba17001d6a0f22522021e331e54a8a30533f20ff4b72028d4798a20937d41f908bff7502a0c35fdf41873c0a424a4fa1eba0430a25b00781c09e8381c05e02811e18b4e44f04fcd907800e4f01a0431d007408f44003e4697a0e3aa429812ff3e3657ac71dce2ed37364647a7a7a8454992d4946315b5535c2a2a832451d6d683db88ebcd4357d996e65bc8cb65972a339f89d5fed568a301654a478dd832adc5ef7be02c8ebae83e275e740acf1ba77b0e4f3ba03001dea63ce9fddae1efedcfad3c3af76ec4f2f4d8a594443946aa8b0abce9fdd9ee7e9e3cfdeb3fcd93bd0f2672f33cf0d50c830d1c34b8fdc9a7aa650fbb30bd1e15986830e653ccc1085fd4cefe870666848af07afe79e93017738f350db675e2657e4dc45904d847d96c9e452eef728cb642e22219f7309bf5ead0e5e63f648932a2c4d747c4941525f30e329a86844c5444a26008f26572886a8505b5371198e39b420377c74607920b0dfa043a0ee96c36bad7b577bad75c7800eb58c099f97e917d0a10c07c41e5e5afcc010fafd388fff55691bead2242707a44bfd0d81f95fb741873f0bef1b52f2be5e830e7de579dafc799e4254fe1cc2fa5388ebcf6e011d9e6990d74ba11fcfeb157a101de6b2342aeed34e011da62eac1e455114e575147d11e6511994ef403b0821a0dde20e68ff41a3ae3cea437310aaa2fd1251144567a000c301a58a0c0d154162ccc78b902238541ca1dda268d745afb58ed2f1bad30483fc0a8cf2abcd8e8b28cff5e2e973d6e73e830e733fcff3ec6707a2c31300cf7321f4bc2e830e79e8f17b2d7c7caffbd061afd8e44db30771077d7cb39ba6d939640f5edee4c0ec2084809a6667418b196f9a4c66bf4757c9e499662fcdd4ec76b5716f9a5c2d48781eafa7e890576a6d7cad83be5ea3511eed3c74889658387250397d2dc950d7540706a1264496c8e86ad1a56613679f3b8a0ef359b4f1673fd1e1691ae077dd5af95ddf95e8eb72bcae771d5de7a0eb1e9ebc4ed7adaa7b9dd6e974e80042858717b82955b755020b138e766ccdc1a96bfaba6e75ba6e8ba45e5774e307f0bacc998b4494cf5c27767cee253accbab7ef21cadd0ce1e1b730051eecd54144d219bf197371bffee41effda1eafbf5f94f4d71f8e5f7f59bffe7ebfdfafec9766c3c490a42129a96231a7aebfa01096bc29411501037aa2ae3f192b9eba2c9120f1b5a5aebfe218b3b32856235cf8a8eb6fcaa7817c08f8d5a7837c413e1de4f3f9ce1e779f17e6d14dbac9e763e2bbf1abcfc6afbe1abffa8e5f456944dc4c608952575fd05631694b091b971aeaea03a1e34a12971c3fc2a8a8abef080b9a0c1c692ab8d4d5c7432267ac21c462081075f5314dcd09e932a3f281a2ae3ead6c25cd56d29d5fd39c96be7d1af729d9e3b334aded714fbd304f86cb7069fa9562fd9ad2f835bdfa353d3a20698494aab034b31fea9a3e399284a869075b0e31ea9a1ec9b109cd95159942a5ae290c1e2568acf02284c24a5dd32a5d7cb83051d15224465d53a30086dcf8d2a2e4060b20754dc37a613d9d5f7b62bdb6ef5115e9cdf8b567f56b4fc6afbde3e3de03eb89f5c8be77b6a50a0eae4a0ca43675edb911490232d705062c8cbaf68e6630a4b4657424cc54173569723ac68c2f96d435f83d8e728fa4279f0413630598b32e2e4d2a4f72eae729558c7653dc41b7f7debb082befd8d7e94a1c1efcbdbbd6fafdbba7bb975847937d2d3d2075b7e9f651fbbd4f70f1fb3707a1c53aba7715a9dd427dc22479deba3c515dcfe4f97ea90cce9bebcc121d52e825debae8d0a65f8c9d58107b43796badb5d65a6baded23586b77ddca743bd3ada5e99642b7d6da8eb7ec0760c747d65a6badb5d65a6badb5d65a6badb5d65a6badb5d65a6badb5d65a6ba3a0884d1468cae4caca787046868602b9ebe999ea99eac93cb8c9ee609a6e3fd82d3a0199a7d03bc076a6cbec3a85beea97d9f599bee2a60c6f69cd04647ed7698422ec3a70dd096b3e003e850e7c0adc5ecc13d27419a108337dd781339d46889b3e98117a607193fd60f5cb087f3838ca487cac2bf5b8ebd4eca5a5659eee964bd20b95b3a4694685b9adb55aee5a9cb785dc4f5c0e9919eb2b5cefbd5a6e8c6721d69847a5e46edb5b7711743f79d71d73cdbbbdfdcc1d601cbcd557dbd75daf69c19d9b5971cf7627a7bb63a5ed1c076f590d96bc47bb4ddb635e73ae52db577d3663f652df8fc64c7dbd1f4d58180d4d18cd2f0c0804ca74fbebf63723b45683cc7d995fb7da97f6c2ccb0b0b0b02d34bdd4f733813214666a6c6e5cdec15d696c6c0c0ece68348a89158bc59e9e9ea626119495d5a0032dad10c87aef7987036b6343246219893ddf2f05ca9814666a6c6c6ae2f01291c8022b5598a1300637d6833240a31805e18ab3668c2cc44c21918889333dfd99190b14e1653e9879996e621ae08cd0146aac63fe9a8eac9ed25d4f0435b820f05259991c5109b188a342b820f0529696150b329dde380a2f75161c1095108b380a2f65593dee2c6c88b68ba8b9bf2fa6ed5bf6c3afe732c77e28fbbd3d4308fb41d76fa700ee70f6db319002fb81d7cd5ebf69bffd1271075f97e9b75f23ee40d32f857efb1db31f82fdf64b06ecb75f39fba142bfd00143bf1d07611edc538389622c084cb4d0d733cc53b6fdbd72778396d6510b0c870571c9c86ec7442ccf9dba5f7f99fcedb7e9f68b6441dca8a8249e13a4dd1e155810f767039887ec030b82046747521e0e984727ef0ce06f0f80051181bb01f79cbb01f79b535a9ce22ce3edb888797013c9f3d6e589eacc1d2ff5f56828c8cc0083ddbcd02d3ac450a197a807e463b8807b30d1c646b8a65f63418889158033657265572ed8c128d06891cd00852bc62293e960d8c9eee08e673cfe015ba438b818141514d5db9927c83c78aaf3d03304098c29d6994e6f9d08e8e86c9542dc6435e01e85758a58074fe55c10d8091b852bc6c2505683103759dc455cb8bf222726086464a94282c90c14164ad7171c536f63ac94ceb61a9a36260aa9e38ccc99e30481393a19487bc6a163917972d6cb39179101c273ce39e7cc75942712ce843694ad1219446a44515d7169137185624917152959e4aea09d408f684c1c49ca85c5957b89f3960b4bea776fb9b09a3618b3c41dacedf6a6bd74f7d2f2e0be85bbef7eb7b014a16f80315691b32d7b2f428a93f31d9679c7c28c8cfd3d92695ac8b0251d01af23e011f06fdc6f160a2f7a01a10842112a20424f4aaf508bd8f7a228ad2d3360dc6db7d65adb1fe32b2cbdb868b4916b86273bc94523e84992ec66cfe674de4bacb35ab87dc5d85adbd7b4c3e5250681717a09a9854179bba947b82eb8bdc662fb567842dafbed64b7b11f749dec293058e182fdb0eb6b8eb96bc17d5dbf79f3eafa03dec41d9c3835bb6e5f045dc7227a5ed7450079d3d694c2fb355ca85f7f0798dc5aca1298fb095ccff402a978e77c6fce39df7bef1d5ee029cc62189729b0b51ab03c3a618977f2bd25c6252ebb4ea8df7acf3daab4d15643ee3571e97ac1ce7007dd571b307ec72ed81bc6a14088a0d6327ac0e2908fbe14022f1818ce9d0537abf992a4d897a4076f6a2dbed61e4d9dc538a74c29ce39cb8cfa11f05bab01e76d9037714e868bff72d0397f85223ad89b3c8743ffadb5ce18e39b75dc8f809fb7f656edadd99b9c5c91fabad2fe57a87396da2ee2490ebcc5c1419952db71368e0d7bf34479bdd4f7e3e4d63ae37bed8e67afd560fb7d9c37ef7973ce39e79c85a57e9b495e8f067a5ecbe38f856b880ff26414a554bfe5b2c2b222dd81f1c2406575054ade015c9296ae65ef2c5d4b8ccdabbbee2d3a817bafb044893388b0ce7d7b0ff06689f3bedf6f9ee7c571c1fe1136ba75ce288aafd501b9a46bf93a1d9a5fa785bbabc9b0ce4dc169f16a8522f479839b2cdf2ccf8bb36a5da9d3f15611d7969cdcda667c711eccbca9ccad496d5260b0047d963a98027d6fb9aca27e4dfb0f2d9d1590a6166877b2d65b7872903326b58fc40aebd815a800dc21f79c35d60ac01dec88b22abd1972b725d6b1ba04f66c1f2ba5b7e7e4b3b720a94dfbb5e45f0620496a8395aef6eddf4ae08211560e425e1b7e7dbbb5fdc4a7d5702fea8189f1b518bfcdb962a669d564ef9591e6cbd8e66e8360d9641bcc8380370d67579dbf2816170cadcb25e3e75a3120572e33d6907377969e8f147d4a87148c52dc4d1ea9c53a4d290090d2b54cefed3bb3744d757072de5149814f740858c7be1dc2d6e3f1db216c3bbe9722c5c2d596bdc560c6865c38cb8253026375a108cc85145a8e18a696d29209f14b47ca8bdc90484f1e18b2d21d980b3b5293c6cd53aa93ba3025e5506da9af082dfdbde5aafab1d952c24dd329e6874c83247fcb35430807015e0e2449f2284d7fed364dd29209862869f975a14aca8bdcac484f1e5ae90ecc516abee5a2a221834aea2ae56fb9a8a0803852df5b2eaaa20b685c54242e4449d1b75c54588ab8a6c4d44803bb8ed42387e40493163f46694266c6295d5adcd46d64d3c0e7708d291b3074322bcad000d09643ac61cd789273cea3946d0fa2a4a5397657ce2a5ad88ed1d026aa6483d97d8923bea56d1d2d18644ce98c016a9b71a4174424499224c95f50c982049aa199271b142697fc85c496145432322b6a108df0520b83651887e2c80788099f25261f9341c908919717aba0131a4001a409e86d448fdc4e4c85b76064efbdf7e6494a1d448c1494776cb9d3db83ac31e3d16774f224898fbfbdb759a567283ece3937ab0ca02c7bb0bcec80ba68430b58c828bafae182c2840b31549080883dc929ad599d55a452b9bd995c92a74900bc499a86ab720c9150448b0f942c16e882030814f1eb6c8e0d89b31175613ea81023e3c61155d416e2a4b66641ed6ae7254fa152f5b3623138179d8e651d40279668e4a8b9ab6c60ca491460d664b0f28e2d8129143e4ee9a39137549747a6725a62070c2201c3a42d7569e478e7d078863498028541aca343748deddd4ba71da39b2bdda4d89494f3de7bef146567b9773f37e79c731ac4bc63cb9c06f7de1bcc58b0479118194d9a0c817d88f10449d891ac224e4c30b8ea4a395ab93872486c8d8c886c8dc8982a694f96b0557635650a0c2f474eb8406a1b50ec105a8a42676c545953b6e2ce8e6253e791cb8b1e06352c3141419c24f9e07137258e51a414b2193e86fcd8303aeb95701665558293b1162ad76c2d64bea439d178c0aba8a78d051cb1872d32c5ca8ad0db8829676c62a6da8e9d97bdf71673cc3b36cade7befbdf7d6597af28e2d4b6d02a250093831a61f43b42c7952cb180a02d3891390543d0961e15dac902449922449923766829b348134b9905da29e8443224dc08a03a63b7e332517db789c3012822a53f1c109ad2749132340766ce91d6d8cc8790ec739e724708d31dd5c896cbfc60a60d7b23cd93549dab05a53414afcee5ab7f7de7b034915602874e4bd893cd9b4bc634ba4b2939324494e31e61d5b969a24499273ceb5c6f28e2db53df32ee3e1c720483aac758577d4eaf2cb673982696f24d559d28db527311e4b7c632e8ccec87e1889ea2651985c38e79c73234ddb489411ab34a82d694215303ba6784cb1bdf73e62a53b92959ee5fa4268eb3882cd84147b0739b2e5824590a22d25be656f233ab0dd657b6cf5f02249922c354992543c6db3f6812a51f3dafddccd956227aba655e10d0b18af12454d456d5a9e3cae196742189353d2e483c52a08d762c5a7c7dab60a2c5ededdc8560b198e275562dc30c31202458b3020b6a411626f9827e1bc8619af5164662b4343a0fc84651db92861ad69197b83725483c859232ce5598036a2d4b821670288120f944991ca3a6289e1a5c6924c0dab0adccd0611e79d24d11544766323060f6c6c7b00569602d3e3fe2ab70b235847b15433025979db72fa624402331b5e24b4bcf092ea1a91c502c7325535a62cc6118d2358b6902801894958d9975392b62e1f27364532ba8e9bd408a2db96d41b104592d4db1188d9918d0b8fed46842b3c8cb82dd10a3a6a1a514ad0c86aabe26a2302aee98c9a28ee260c8e27df6050e1127148483f44468c8142431a32e389ac0dc611a01ad5ae8b84a81b154e309e6e2411adae64f8aa30210a2354a696a40d2b4dbb4c2e38e73c4731ef58ce39d7f183c793611003ebc9dc5b8923315d2eba10a9900084f4c49805e457742431b98e291ab49433313350430bd4902eb027695f397e38d97a422637c3adcc904ea6ee514f88a3a09477dd1400104c715727d088a4c89ac0983431615a4862d8bc4a7e166367e22d9fe8a5b11d7fa408812227656566e4a6a4b8c4238c598b1e6a4f4593574935162e542449728a0036526c282a025a23c2d62306082976203911baf24a8bb1db646c4ec50493d43c568d8165ec8df37befbdcf92c693948caeb5ade3d4d90fa63612d6acd0602b015d0be3e3667befbdf793209c7cce39e742727be827d5360b9a9518961198a82eea1a7cb71f8a9e1b0401f2518a6185c58b5a9639df79416ac3180589a3662236a9f8bd3793179d706dac97b68d30d7becc2c7af3182449924b69a5264932256d082cb01a66be31bf77f6600c31f86a68baf87bf7944f3971255542c90b244152e0240a0c055118139f314074638e335c0a4992a48f1f9d0fa29464cbbb67c41124668c112c5b205c7ce1aa01f545c4c696b5669ce15132d7f1e4ac890dca54142b1e256c171b2aa82c6171839886c5a5a492567232ce394f42fe702a442ac59d69a70009b990ca3a1b911425e684931a5cdb9712d484663814aa9bae9f1b16f80b5d555a88aab79473ce69d0d09c33813de79cd3d8759120deacd87bef2a3d67b9d662ef7d4c4ae24b744374648f2e0b49922449e2c0d2e946686102eb490ba31f22c9b583f8640d2d4ff633b55ebe145af68ad9cf92294c4480acb090a163916503b4626c470e18337618a94f988e255a91df2d6ad900e4540a032d469424dd98431a01848aabc8042a3834164e381716f94ac294244592161fa02f498a4d9e90a6a47cac8d73ce79cf58deb13e4638d76eda2709e769ca7fcf39e7bcc9d46e829502d31828c565c918f254e666bdb4aa78c9621b9bf2a38a131d85e42698fb6a1f0537febdf7de665a78c71e4b0fccc0f08efd350d5279a312f77bef5d55ea3ae79c87f5e49d7dd6b33b1be259c71a6f4265ceacd1a5ca50798b29a92303da4fb963d01c9931bde8326393429f681031335164f44325a7f026539c73ce5d9c6a4d52ce394f7596bd07f07befbdcf725ff9bdf75e8bb1f7de3255147a081d81fc0ca549c958212321cb8f38b623c6a1d3a8c27ccec444539216495e0409596281d8951e36ba4a2815d52a3acdcb8e8bf53c96a6e5e024799f2449923cd32ab59538323f499eed11534c80db440e31e348a3d84bb3d502b53d888bab12f67bef7ea65b8e34b18b70ce3910dbf89e73cefbd5209c50758c82e224490703865451728b5b42c5475a945c85cbf37ef225cf394f8329701b808a8a58d095149497881b4b3bbe4a3479a2d24342fb78ceb992e79cdb52dbcc933ac08dc58b21362c42452ab831e7434209201f5bb88c573e3cec39e7699a76bda6115074c4c7841e37d066902a90c0e09ab2e544054a25afbc0082954a414714554d4ebf8dfcbe46361bd1669ac2cb5f46f7c9e4d12a898039294f62797e632a1b2d8b274992243b4992e4ee24d983244992648fa052885999e0a8148c980a83d2196411110102e316000020100a0744625198c5795c4aee14800c53a84a60582e9389e3a11c88511483000c8430000000000000206294719c7185004181acf0806fff56e8d9a496677ef76e1ac59184efe2e0b69a4d14e301572352ffd098e869b1efb9e2b1d5801820c673098584b41722d234b11b4f5ec5bf69ba24e944e9dfb87fea9674f469cec771485a8d03983919e20f5ec7f464c61061b027e1386634eadf321949d885e3a45d8a760feff0c98fedb6272a6aadbf55e23e2dcb89875065d17e9d6b9c60e29ec7c663dd1c05963c96ad5b0e5dbad632850fbcd54537eaf68570e10b41540931ac03472fe93256c7e9fdaef754694236b3ca199b8c5a72a050e9959ca3f33a64d1d58d2664436440d63b84753431c95b13459a76e1b2265262e4074a2dacecf7ff55b9683c46fc2de8833190310065036503bb4c7a3e194852e307c93d0e88f45618ceb3f08661ba9d46f7a0f4f8d3f1c9f76bcb27b0ffd740b84b6b86786c8bdd8b83308200f0a0f1f3953d93c41c4481e499d574c5bfe6c5fb8c82c098b858b440e1d4b2bcce28bb40cb60f950fc0bb4a9259eb4c46b8bf667c2d05bc34631c49316c8656ae696c395efc1cc9f4f737946dbd9258ffb0d16240dc15b59a1b6e27ef03515c44f149b3070c305851b4276248398fb0b9743ec28b78085b6461de759546a3d69e4ed7a22b9ff3721808eb6277bc26f2aaff2536624e140011ce2dd032b361cd4ba29349dcca5e660efe11273cfc3c74ae605bae8ddf5d10dcf2ccf4ffb53dde3c9bdbcc608f60e3e2db63d7aaf4a740b8ddd2f7ce19cf3346b3322da6b33febcfea48082759ac3cd24fc814552ccd398ffcff81096227af19313362845365ab0695aa6ba0b52c5a352490f7b8c20ab990c4134e8074bb456f6167e262c153a09da25c9d7443ef200f7633dea868797a78bd595c0f9e4ec24302fa51ef9a70ba3140ece41d49e0c4a9f0805aa070289b184cadf40720e26265143b28f9d9551f1d3b37f563bd7902691a58a8ea46109e5ccf20359c9fc0ef41c1012ebcfea7e93f6c37c8ad6a83962866ccf07c2aea91f9989435b2a73aeedf0068ff854b135a833d92085a4be4186cc69e325fc9ec70a8cd17e5737fef0a9eed3163365924d8f88c0e93f616c8d3c4519840ee4e6c7694a471f8787a834174b3189a10f77f77126b981ed9ddb396bddc965c8af8f5a842906aad97f1d04a7419bc994435d66c7d4ac9bf48ee5ba2d71ae7762f69df47939aa94c1cf9cb98111b118fc8a1781f7c4127f26ce4a471f7abe6fc0eb22c5da29d28b704d4d9ccc36cf6b78d53f884be6287d6005f464f8ec4978cd78979ca7338498845ed2f15f0e9a70f57948b7f4a344800686ddbf5d0468ba9f6fddacacee134c25b581c19844c0db868a3838ec9eb9153cd35584b1d1db2839c475dea4a252ce425106f018048e3cbd187110d53568cc3330174a961a3524c69454014023ceca31a342b2241e24f5c1da468524314a03b1bb94b0b9a747c07457c5e0076f9a9648bbb483a575f788946ff08c1c96c51fc772e77738f610f928d3fee558c184a0c4d0fced8d29e5e887ea8e0394df5e2c252b8965ee477a1d6c031954c028a3bf3af6f78be48dec1cb2b890d18888c59a44a3572c629920ab28a68c62c6251e66a0134a2c8d2e63d8eaae9bd2092ba0cd98b67646b8e33bca6e332dccc43f2b0ce5f409c5a29be23f914685c5c09f01d93645a929a5d870cc98ea991e845a3bd17e1da469b4141a65694e5ab6712e07aa2ea4838f89b8b66d25a1d2d5128115db390df5859d9a872d1e177e6a0e711d04fc4c9056d891ace234be313ba7096c2f9d8090faacdd14d2e6b1ec88d83f4a9ae3556eb3aadb2334f55f8b265c8efd3ceb4873851311ee3d1f4e20d48add51e9d1375bf3a6c40fce564c98110154492afa2cf30d28ce81e7514cad9b24798af8c4a4319b967347ffe49aa20297d55b9691eec820aed4ca501764899705da7945a261a89bb9d8758b98fa84c634307cc83fe3ca7882bda069f41c147bc33f18b684fd93a072611a6433e9d85d11a25cd835e402958a12acb616da0c0930f79607eb2cdcaf78c77ee8c635aaf49001469d730f4d83e1e1f74b955211bab78544c5050e88d7295f689499f26116a64c183ad688745fbd1f85f792bdaa3710132e7310bcccd66f49f2b8e376c86695e3a2bd99f051db5a29f5de23242d61641c858f7598fc2f30b504712a1998f83e5e5fb8073161e1b528956ad9516a2a707c60939d4f7f278344418f45b2d7dbc0ddb299e28e3e6e854a14c083a2ce462713af4e0797a87730f0cb34738999d168ab991baed057227250066093023d6fae4dca1f6a8d51482462fbdde2eed54ebf08d806d7782e67e443e3f03d7d9f801d318e282e85f88fc565881ca98d6ba21e8dcc3f1c75903828b6eac37fadc4aab68c8f04f173f7796b2531b0e991893a0f50364006aced321e729af468bb3ae06a53298d577826fa08793a1135b65a7c25d180523fac2eb325c025d0eaea426480e61bbfc01e59450086136c8a63abae61bc4bd20f57e629192cb71467ba507192bd4b0d4475374a28be6964f848f9952d00134c0505e517c29980a56b38690cb0a202a2e80762bedcfb867443dfd328779fda640c5190e9759255832d1273ada9d91df2832ece5ced4cda966dba2ebc46ffa2a63e8c269ca14d0468940d28b843061f73e11b685327d184786982232d83d46dc7f4211d777d406c85fbd14120e4c29c531cd397a7ea2cb5004bec2a5e62fabd5f839a12d4b2b2933fcf362c0e2c6c14b40433447c20df6732bb35eaf82dd72331fcb6bab125dca6cd62b775b895f640c89be981f1dfa89610ebc035e1cf972aed734cdc1fe9182b5a7ad24528841195cd49d75e79b6e2f7fc0a32cea685c15dd25d6128d8583e06fe208270243bd6cc90e51d0381de41b6ff074e640b4d8aa62dc0511ce36079bb1aa1127711369556c111b17ab5e505c4a221d478015d4bdf12353bebe464434fd284745c505f131ea01a643358f33ce4651877f869ced8e7b1620558779b44191c71645ba8d35306986d115b7230fb94321e0c3a9426c5883666b3f59bd80fcd7c17780c404b639a0718427c3c68cd37a9ba0082a597f3d5c5b937cf61f28e77c6aad73ea8464faf27899abc8fe4357e51f102a9c93c128000a0e0e4fa9a56deb658a277991d8a049e842dce4e7afd0781d20050c09b7cd9513313c55d8ad45a9fb544c6306a3113325d3cb19ec5cb88bd8004094af012cc0ce0bccafacc4bf6ab24f8806ece2a95bf80d8d9c284252c662bec3de8b174022134a19d37f07a6a46304aa53e5782ab77564c388edb5f7cccf087b9cc8a32e86b7b0cc614680326865f3231b90040653ba71fe9b45c7cfc87671e93fec93817ff2faf8e4e16bb64692f04d0dce323ed78749204a138c65c0f31dbe531947307e0c0c60616c76bdb9cc5ba23ad9750eb83e0c99a514c9de4b5fdf19d5b810f43cc9e37a385d12506931d0311b3b88dd9612dd4c4b2429e6c724621112d3b85cd2ee21e53a03109d622777d7c8c4905f5a40bb72021f8260b5efe03fc8d13843362e7443aaa644c5cb1f440a8d94d764a7136102564a44c21d9ed8f420f7daf12a9655883e26212ff4fd60e04e33bce1312929ab08c2eeefd7cb47a167750fb5c216b01aec8d4c50ceea1d27dc640e89f87c52bec1e802ab46c2e7abe0a1f1a43d71547f9503849e98d3d4285cfe719b54d3e6b0bb1c1091f37d133ab7f9c62e67655250a80b96fd999d0b9218c767a4c5bc78f197a1cf4187ef18a8fc24a5a180a5b2c3b79c2f764e310154705c9c752d671231ba15cd5a14df4e263456fffde2ec57a0b102aec4763d64c2ca0651a16d4695d12bb14d9acacb0bdcd36eddcc729255b9715796e6497080fb95d16dc9ae91844627ee0abc7e7a7b7c15be7a42e91e7b527c9c9060c5482d236baa20ee67018e42722319c1213143a1a26e6459b1e7bc395e636d7daecb20b7b41412e17e958a3b60aa72ea180db8da04a3493cb879527da05f10c3e20acb4e99b48ddcfe4d3b0aa395137bdc12243cc13fef59fcc346afac46a0553030d78f1152c348865887570547a4f687ded49c06c54a2e2a33fccd15c78680a8b1f20e0cefa53c5466d2fa110279c3adea0e10abb92601633e0464a5d0ca6d97377acea52a067b2d3c3ddddd4f740b2eb6f591d6e4261ef70e884e58014e1953cbcc4e0fd19b681916e34a6cd85923e0e1c4c94a5ce6ac7404dc953de72c42c4787112331636364d8e9b219fdd6d4d9f658334bfa1c8f508a15b9962de4c532fd8d7cd5f1849e137d4fdc4876c83bc169e874f5aae246c59469a6f3475fba8f36316e2fef09f407368ddc63d20851acd25c03766a01bfcae2fedccfd6f5393c33f7651cbe12443f5e3634846f7cf8995258f8c41f473400d82bacee9eeb9401e7cbf74d94018de267b9a35c8ec41fa011ab38b82ac124e1ef9a344b8bcc438fbb141eaed2e91996962db20463146b0eb874982e20c5f4e078f9962f94d153318316f87a7f7661950a3dd775a0fb4a6304fb93ebc29b1d17777844d5af8f9bc7928bedf893c7fa0cf0643eca6b802484ebb783c42678eb5e664b90252f1e9ca27234b58c659ab44f57118d4e3783011a159ea09880f884f30d6bed3256d33b96e36c89ae8dad0eb943241641b406e9f5ae0fc4df570770fc4db5ab575e7583bb31379f4685901e91c34b1b5c13338926e8f79fd4d5cbcaf9880990ae093778b99652eb1b2bfde5d73d394db671d5ddf803202723a9a4ee78f92f4025ee9df8d307b944c99cb80fddf837af869539ab8f130fa1715c289223347ebb5bd8ebf33c3776dade8e4a78d202587a5c577ce35bf9e8b5adbe9384052185a3799b65403bc8b2ce0117def302e391a7c72530d62d196825a1ad2921f17aaf0b8f9b23962436a4b868230558a1245769c522261f8c700d32b5babaecba9d607591971971ba3c1ab212426c35c260e4552e993a56a04dbb6c539130899cf0fbc048e954ab416d901e43f3e1f967ee8d147ce497e72dcddc9b03e37331ba0aca1f071d17ce9b0a0d3e1fa8aa7e2a3e769393d0c9b1639c44b7a95ca0d1ee1d11ee7e34cacba9d4949a53def5c2ee959114ce888c437db05e7990afb2790c4dab20cc8b86a1317ed1a15f3775b87df57b31688fc14ff7a781d66afcb74a4bd981d65962b09be60ae11996336729a368c64aae8d02fc41e5ac8c4406d400ddf625c8f9efb9d0a8edeb3d038cd63ad02743c2b6ff483034950107cdaba4b704d2b7015fff5c4970cc8a1c2ddbb5a0d3d6873fe57e30a8331c7d6b3ca09d8d64156c2309e66ed4f1aeeb5469df8d243a8dff26603a234166fda748ba7aa1344ef452fcb627650e5a764bd388ea81e21001cbe7b2ed8fc124141d64190079e51984b4c9c82ba9c06d669b5bc40a1b0627fdfea26f8c7bb614153af15fb775cd3105a0627ac521908ce8ab1321cd1e1e51c0c345ac8f0801723b02325feacd79f9332fd069853fc2146476d3433c92fb8489718d624f6583582eb9dfb2c0b4f063ba2e82697f03bf4f7c0e9955788c970713b1d072b1ab2192907635d07c5a1dd47247c4a2831fbe2ae0065d30b20af9fc0d79d126caf1605026ef991eb8f11b503a415bc67d66d8ad199f3c26bb2c7e34efa0c788c91732c711c070b3aaa67601305164129e69b3ccc3c0445b25bb56bc25e5787bcc770e7112c4a84d5d45058993fb87118001bb00dd76e1eb569fa9e78a1ac6515c9ce1d3032764ea3936c88a945ae1d820bbfd10109c6bcf568b00d5d4290792d7584eb0ac4550c51e124e10215a8ff70fadff43947a4424a459213f6ac1004559b436bc1e7e77483ed932693d9b59c29f17af60d8c6310dae12dd5b1f55eff521a0e0f4bbd865d0622878e01653ca29d1a49fa9494a45f118daf1f84b01794848471984985fc73f4755b69e071eaf699a098ead51cb8fb1ca4b7cf89eada036d2811952287b02f3ae0b3d46b65afc2c466940e332dff206056addbe4f916352fc34f1f9be9465da6a56b9a98cf0ba6e62a759020a5765541fc40175d6c6b2e89410fce573f491b7fb0f48481e17802c494b93058de8b99bf7ec079480fc4493e0c08cd43d45a6511865d11d51977c85d17202b0cc54247b53a8e75f734824ba034c00b859c6a4ce66bbd09206d419fc12c25a7f95b9ba8e196e18398a512932fb133f3f53c1054158ecbd381fb401cc6c121470f4f1b676d3c90bac589ce7c4e5bdd4bdd72a97792315c1ba6b52b7cf2ad2b2c0387ba9be8486d3fbd99164b32c0393acd0eb83467931020f8a460f43e4565766eed3d7854cd3d2af8a3c791af38908548862fc8741cb32b7e1890ca264b09e13e3a70c7831ff65e0c4a3e34526dc32fa3c04c81913f9b436deb17c87f2a3af48c6ecad75b68103021553b958a43583a3e8d9f6bf763140d9bd8c12ede2a623ca6a5532b0962e55cbb80c3642f2e1df41bbc19a62ff5ad5be3eaa7b5fb79cd1687232a36cf3631106527d46ec5ea8e209710ad45290f667bc87b4695016f845e83a99c76a51fdeaeea9cd27ca443e4baa52830fde07b5d05e4b361e0a878769e31a3e24a2224797622fc28eeeabcc7ee16c1a8f9f9bc7d37bfcff3be523dbcc29199d391c02b42a26c30447c90e9f76032a0733768b36ae01639780ed8ad68e13a21d3fa80a4f3ad4c1ba5b91f695c4c33a83b91927ffe8b1da2460be283862826de2ebac11bbb4c550308e9d214199d08574ec601b063eaa8d053310f5ee04d5ee595743e2d89c081b7a07a1578510ae8e50c6e6190e1a9bb4d7954b2640d016cbddda113fb098f7de2e588be7437c60d43e4ea63c5ae1772b13905397da145eddb5421a551089d6db754ed8f9acf78d19b685af68c79de06aca5f8671392ebabb7e5977d61b9cef447cd96b79f43b30f95d3fc8a9b4a713a2c35facaee016c30e8449d66a464a77ddea8e751057c4e1584771c51cc637e258549386d42cd7e2b84635685bb51d25bec8ce94a82c72ed22318ab699ee74c768ea5128130b13ecebf4c82a10aedef811b72ff8d2f8c02121cc89819cf98698df97b3015743f4410733cd24ed6fc7d5d3fcdf7bba0cd57a782f5a3dc471d82f13a0f1f555127c1b25649b183f1b9e2a286984be1c5310622eab4fd8119d41fe306efbf53e4b88d5ff787e9c1bdea314e407d9f082e035a341dedbea71aa85fc4a352d907f2286e9e33e2849cb2478fcfbb60532bf9097cad69a180fd9f62d3369573702459eadda78b6c3016c26387adb5ce974e381b545c0992c61e3f86e5061318c59b0476c1af23b06ddfa4492692d8c0d8f4c6edb752c05c4dd17ac0a24403c48aa84ac35c9b67cd0a61966c8da898966b4fc59c78b40c50848346f51bbd4c64eb9735a4c02879c1f7c0490b17aaec1c604be5af8ac5d58deffd713453bd24cf36692358e3c80b92d87923c17f5501875f32091f58a2a2d64743fa9eae57a172b76f252e8b5e4b2b015e54bcc5fcd2ac0bbea50d6131d50d08c49412f28b5052f53935b9e081409593a3aed499ae3219ea3b80a5716d80ba374d5597d6dc337a0bfb76b7960323ca627fe75d1f717ec6551a3e5b041615e01320f0a3590a8c7b6dc96e82a9cdfb7f01c16aecb7aa0ec708df06de24a89a6f962dfd39939cf80556211d3fa9d47a722a4bfea160dd61c6bd4bf6bed36ef062f655dc318ad407e296372b127e31f757ce1136ee8a40ee243511aab65d8319dd3a672cfc51b8208a5c43d545c69f535045d2eec6e0688e96eb9528ce1b2700a3c74b40c20f240cf48aeeb3ac45defef0f1ceefa897895d185594248396e18b0684c37c4c4ac87302e598b3f0ba17e7f8ccdcb717b59b14bcc303022480ab35db2f125ecaf3180bc12056e240edbb0a7a09d718663ee0646785739bd4cef73460850abe031681ca6b1c6746695cc3ab156b275175d02572b32d64757ddf82177c2c35ccfd0fc62737e13d49be9d7f95ca911dd1ff8972bf5c059692a3c0723addc8f2f0e87878b2010c51a234c0018908acf64b0b8e3262a8a479c35555120e6b459b7452ac8e036728b3fef9d22241169ee80a8791950e22d74537f33b8a07d55c7a460a71a03709e6f23118c1debd255826a011f26a5bc4b8fbd8643056e17cafdc2fe1f59c947fcb6006b63b24b74ab4ddd152fe2ec31ca92e8e55cb1ea31c214a839c7f83ff1bdae0de7955ba52d0db60f9c73f17eeb25fd6e86269c3f9e01f678f870de238b2a20d96003ad7624df317b73e298c5bfb77173337b53d829de2aac3100e93995b8de92dd546e660ae8a4286300101dcb4249c397e51c6cc7fe9a13c600a3bf6cc691284ad141c6d1c466502207e95d42fa587f212089f5fa2126d4b4c55a27541d483fc21bd08372ee475f873442fbf0f6d4936fb094a9460d50400ac725901d5f9a3218190c41381cfff7dd2fe9a7b737f4e3d17cb5ffc3915639865c3581f131cc96bb8e557243d0a19c9a3dd0f974a194ac6f08850d14c920e26f53f527b21e8216662db4d996a1780e6171677680855449949fb570b5368c367c36044aae9599bf3f936ca3c2c04da0098fa28abb313b07e6b8a4b568d1ef14a46c9beada28e82ecbdab80d217ec14f5d7eddb06c78ac1ec127a1183b7a2e4a57711880aaa5089d82d0323852089be9a036b90aed297d6bf85ea2bb871b00fa6dc8eac0385d0cc4cc6e447054168585a270d7252d9e8c69081b1967069a061d9772e6a233a275ba5cbfb7b9cb12d036274f0cbdc27be2e91d461e33fd2afedb12c1ec6587e327945f66554d313cf6126bf09d6ea08c34c8753ff99820db870fd7c6cbb31b5948c47ab619ba8c4de238c912276bc083dac976a8c1ab64d6832a69aebbdbca88eaaa431b19c96a8dbe8f4d8c5961baaf521ffb44684035afce96dec1cbc38c34af883f1985d1e9758d12bb6f3c166e25b9431c3c8c0290e5cbb28fcf590ed6b1cb05461d501f32a1e194ed0207b89517a2448bddbf0bbd64fcfe749e0f429d67afeea464e4e9f3fe3f4174976004971f1cb4ad351d8d99d8d0295023fe3a90f227810860581bc19e3e7833a613d3f81a407bc4dafbe96aa159f0dddd30fab4dfd0f59a0c9c03deda97bdd7f80262452f0fd62993fb2ff4a11484d368937563dbbed527ce4d5eac69dd9c1f21692c9f5024f657744cd031c5ff1096876b04a2bc545f863c820d7af5387af313905adb27ca39ee08842cc99ac620bb331f28436d6f4dfb0057127615dd3565551ea3f403b8017a47c749a4895c824bdc24bc574d82b599d63a0cb15ea050ec6767ac50a1984de884abfb6bf99b7d35a67022a32cec629fd6f8ffe8e5cf0a238989ace199acbcc61573fd858bef4a5af94a17bfba57988b105f82c84cffc415c4e13b5d10432529d7dce7273399098bbd068a84cd988ea955817f370b6a1d3053234bf38600d7d4631a55564e8923c9a53c809ed558b2cf0ff4ea21cb3824b330cea72d9c56e316f100ccb58dbae2dae64f3cfe027a17bca3f9c9f4a9228b14263f064552ded3a65c7ca4d30e92ff491afcbc636e8cbf37b305de7e3843f9ba9d4399e5133d966135729ce214485f071a3017684410cfa3acdc27d83f6590d1bf3cea2df8c15711e5b96b7f2a1f2c6288366144637a4fff7116fe959673112cb69e789376aa6ad31c844a2fe5bd615ef5a2a36204df51cc6e63f276780aff320351f47253bb3386a5d3e0385773ddbcf987b5a61080a6f51ea29c15b5eb89a9df34423cf53e4862aa83762d932f6aeac3529e4ccba8c323eb824e15900b30a0c86a1f151741dbc61fed9a344669094812b19c2faa8e5cbf15ec922d59d5ac5a75a6ccb44e7abb1fd88fcd57098bc9b661e3fa12a24262746b43b978d88f8deb223593e4a7d5ff599c25fe7fec821a2634381b396a4d3acb8a3d23577f014adff7a2bcffc2ca2996e679f0bd9d8c296f1e23cd0743112fcc5293eb2ffecc8c8e8b7a9867bdcda196ec884977c76e146393f028b9177eeefab56f8d45b332dd5ef93af10df7292bad5c6fccfec1fa318d968988c799b741f43deec1ced23fbaa553a457e03f64c615f3dd049015e1d2880a1ff95df7f3928bca3391ff398680bd8a4a5fdd13d293ead63271b31475cccb56dde4a893d860e1481e347f8648ef78484679f4a6c83cc4063255fc09722661839da9e8f1f62d80ebc045f861e6eb503117d6e27420ba1dee0794f4ace2f3854267de309e4e34e06f24e43be1520cdeda11f66cf86ef1c2236e3453456f8f179ceb7c62eb38659bb8cfc127f2c09f3a5be85aff8f968f932671cb69924e653662fcaa8951f61751381d804a0c14e35ff50b7064783bb0170a507dc793aaea43a25a37aedb6bed85e4c48b55440dda4a2c4a3358f0701aac92608b936d9e3a78f7eb97f3fe4448ee7aed065bd0462fa1a6fd987e539b370801cddc6e60b0c27ef362ad30645a9f2744b670afdaff6e970c27501ec9a065ea1ea468421f0d92fac519651919d05eb06b1a67e4cb025423886e8180498c24830a40e0e0c7c3ac5f4d4208e3d718e7311bd5ef41c0aea73e0fb08942fb832d78c89643bf6a94a89578862242888d2f7b6c0ec84409a5b90cd95d181632b13bcc03bdbeda8e9232b7fddeb34fa8216bec21e24cffbac68bab6e61eb5a164f4cdb82b101a7437ce2334486917c2182b367cc1cb12ba4773a48710e7c511999aa24c55310b06fd8f3bdd21308ce784ed14e1a51762e7483743e176bca866dd5cb34784ce5aedde8a70e8e94bbc234c13b9262c86f003e05188100d039fcf48cf088a0dd0486c56cd667448d33c78819e4a9c351afbf5e972bbd4ca2d780770af1a129f1571059bd30eab81c99229bc64e0b54ec2fa0ff5791bf923f7760199ea89d091ac1b178e8d29c404781cbbe58a1614c877d603c929320e45ee158512978238c28351418d97855891feb4273802cc0c29868b59bca2093f9e15970023c20f6a94f3dba603ec0e08a9fc794e06cb84088ffa9a8b0f1fa4feeb7d293a4874e8ad9b5e43ff7708bca097c34083a89765913c990972bccc737522e64d48dde2784c67187ebd1aafc91fe8c328e5989e7495daddc41599d98285819b18d023151ed0038698325969213c3a55bb6b1c3953e187616e7d0754cbbf4bd1e1b77bed1f6a98cc5116eeb78b3f5bb64556e763cebb629fbe336a1a1b728743262eda0a744028cfa5fb312bfd4f05a9afa9ff6712bdbb98cb8c336c40e35695cd6243a427a7c5f124eecd403fe5951f4f12bad283a5848e6e5d7956faa8b522003e23fc62896cd83f962a343b9fd7a93a0f8a1e46084ab26d687a9684937433a99c4738ae11d0575ba6b87224774583dd8b265f61d78ac02191f8d5d1ccef826af96b5e8fdbacbe6707e10611e9cc36d01b6c5f243a88976efe764240b6782fcc62e490854c591b7d2faffc61cd2abde63c0aff79f03c82d63c2e809de9e2eb19f2ebcc1cde9b1563ed7e2512c291220c55737160aae7c4df7308087106811b125511ba9b232eac87d7a0486d2f06c3c0d8f2b318089d42353f88eecc0c01aa9afdf4b376087d6ef6cab2b061edd3d2dd4358bfb68c2306ae08ca1b4507fdf59e82866712b776a639ca6927e304d0fe88d2c144ef35cfd8217d045ac8153109ba40938658ea88cbfd306414f138ca6c4be39a0ec37741c22bca67b19e139019d4bc5ae1cbab29456724bf32c7fdc8caab7b40fc41947f298562feb5d1caa51c82be82c12d087ea3bc077a2729bdd964d0c569b848029cd1914ac5119c7eba0bc9eaf414bb4e01a0dbae2d59ef077888c81b92e29e35e6658349a31ede0243ad34d99acc4ca98b34dcdad0a57830a9f785f5069bfb372bab01253766cf7096c4e110ddcff3851a112f8ee7388ea52a3ecdb6f6448774eef9b266a0fe7793b22933feecc1a15bcc0a7d5923824a051dc3983f07a30072ca15a911b86c93c935c0ecb85433dc2f0bc5a48343447a0d4049802c4564876ee0e1f8356b4aa23b026c3d6296963b2844e1cbbaf321a3644aff711233eada699913d226d315d386fc1e71cd2bcba9082e944d55d6867a3f1208cccde0e0ea97888c820b44e602ddbe0d56c3bd166cfa6721ac27aec74154c2b6a8747896282665f18eb8aead1f81b926fa919460dcb853332515509768d59288f3041c549889fe873244f49178c1ae442e675d47488e342f812144aa9db9be25574c2a1efcf1ee41f8594642017da2549ce1b7679f44ababb38318c1685f048c52100b8679a17bc891640aeb61d894636b3852c89ecfec46f5dd8d60e6433381d81df1ad685392dca2097a509ab2f1f1ac2f5c8a476a69b60285c42b6181542873b02908f003b88f51bc4007c8781b4e037944eccccbcd132a2c050028360142719f485e07bc095d726111a9137807315e39c84bd4cec2d5e5fce796ba35355dc377ec45eef89751ed384aed94bc7d815b678e13cee5713830be20d54925e1e82e46665f2e2cceb342c1540f7cb9d48fbdf26eb3127f2529934f821f26382d442de86fd5cb669633244678c840a2fe0c7b37cacfdb46d9262c10a79b0d8c1cd3462ff5a35d66eeddadc16c79377a779b184248cf29f34c4e38c05a86e93ad673eb54f4a0f5c6b21220f244cc67c15dcabd2b1872fdb194aaa2a89b8cf240b4fa9925843924b2489f6851ffc54b64c31c964a7bc59a26717c97f26e2db0c39a499f782df4e302b7fcea52dfc018c38143c00c0d2ae04abc22ed3d0143245025ccef55379609bd522a47e3c857500eeee2629f89ba480296a85916a367b775d232a4760528430d5618aafa24abe4db4311898174f7b53cc3dc0e29b8827469977d4ff00acd1433ca7fc52c0d3783f6befa14a80fb822ba638bf8583077832c1435ca3e68242ae06e837897a5bda459dbdc2f59f6ec175617e950344181289fddc0757b92f0929e23f9f17ba00fc33a75677b0df382345f0291079a74cc2f7ef7ee6b87977e5ccd69c1ae2de190d2bdc306467d684ffc83d25c197f1723b7c9a847e179cd82b6efa0e9c4a650acb0018fd7486bd2883b9d13345e7db1985b87c078537ffa47f3b4e801f19e606b4e8d3ad534909814003c00dc866e550ac16b490f41f275003e0fff85ba4b39ebcaa77d2d84b640d60d2b9455a10621a463c611643d7fce99dfbf397055e5f0f28abc0af461112860988dc7994de25d7d399f883f500904c44d39add1edd3505d45eabb0ed92ba66bcbcec08de808994ff8b2913b5223cac191bc5ac23a8667a35de2ffce33914a732d87d3c257cf36a3cb0b28e10f08638ec8cad9d46e625b4ed93faeb1959fc1c9348901de3f34a65f1c58703e62cbfbb81d8a67323c9b887b2cdf1388b0feb74589bb42bfe301b636e96a4b1d60322ee587aeb0c25accd5656737a87f9a0472b8bd7e84aac139ef8a0c3c30036ddfb65e180de6889d19f80376d1a76038ea1b2d8c16f15602a2792a0046905e0c9d6ada05d35bd1261b2b3ddd095194febba13cc7ebc91395699e92531e67d356f31494f6aa0b4cbe288c7ab5c7686539a1bcc2e1980c2d07431136b5f7fbec163b1094ea701fc35d71534e6af126cf436d6f4f7cc8b142576a1fa802fd494511ee35fb4c620d2caed2e118460cd0e6906ac800bb9b326c5e0ff32bf461be9616e73c5ecc6e58ac83dffcf98c2fc962e0c50e75590159dc2c04a84e77d8089ea8446dd394db23980bac1ab32a54d92bce8a7d984c6536bf740685f0739741b99243f2385200695b658f1f4718a7a7744dfaec54e4704bd99faacaf02754622c0fb7ad2b97d3ec15b1593b6536abcc6945118e071a46a480080e2f030a10b211648c1a2759ff27cba3c10ed6be023eedbbfb4894cd4e25c2c80e53958c492f5104e97587fa0b38590b44d9c7a6fe928016fa4b91e55e9f0e01638485f06e68bc3b5da02a43426a0998e96cfe29b5536620187784fa1d3dfb44555dfece7fa0de67bbadd4216ee140e77cdd98b36bd74a94ae7ed849095162308015c28681f652e5a4228c85c0777089514cb3a067a28046f90469436766451b65428020a770df4d017a11d324e56d550708168b11e27daa9fd179dca03e4fc62aee1d0d643e080f3bca7394c14307a5202183e0d821dfb6f03967443f8bd821a1dc842c24f4580420928312518eca1edf424e2522db4afc0c0d1a2895d34b28f9b41fc53a6da2eae9139770b1756b4a3dbf019cf7d611d045de19202732fc71150c9189a7d251db8f97fa183879beeceb5e0f19047b285fc20667d67f48c23555813b24d5376f434354c188d22a5015ccc9a4de86a17720a3ecfdda271eed1b2d0e74ab4f6656dac7a41e09812f095d5829ac9c6516c4fdb7827c70d4e80dbbe3630cc18fda3387da75eece1b08f447c9bb54143e035a4f40f4c6e42bf13561809b2b3403e1bc326b254a7aa3807df0d822243064a5401fa628561229306850a1278439d58ebcfca684c2cb5d38de789c1edd2d70e9a6addee83d1825e4fe728b2ae1836f4ecd5d1eb0e89aaad604a350341e0d52f1e1f2849bde9af0770240746896b3a1152943ad80819e2cf055e9b328f541e3727414acb3713c10011f908cf633167b2895d3a728c5d404da22853250fea80ffa1a88336796b6c184b5f2bac34f90a857328535d9f0320d8262ed656de1ef0129becc6c03dce6fa377faff8b6016c19f17ba1d2cc3561226fde858afd6d54a5f3fe4aa9db6fbae6c94baf5a8ad1af5064da6761c38b7080fd9f59016351133d5b00f1ca181e575aa7a44243c96cfecbae4b6d090b167393aa91e18bf73adf31ebc72cfe86b59a37a676962376f57b4317e2c71ac08d4f11a35938df6ed29125d22cb60301dad5d79586c9f637885fd7574ad410c9ea0bb3e385ddd575fcadc36b5caa563d142afcc1ac7911a1fa8c2ee34d1852f48c6c6e838719121dd596961bef0c7ce7ea68fdcd09a8c3f6f2c515d3168992b389e7ea7ca7b23abee9c106f01ea1f82ad33cca9fa4b096bf833616f3361c471f0b7ca27f8b41c4f71ca4a00751914df733e57972a876509122292f051cd0860a92998355ccdb589df8e2aa98d10b84586adbe2752208d6350e90c1dc48583eebc6283e3eba39c23fcc158d67bf811a5cebb73db422f82b8d9bec3243dc5312fd4f86266942d1f0f1b0d9c2ffd1417200e5f71a5be2574af28a58ebb57343e2e99030a34dae08dfe555d1fac2e44c92e259cac3af87a3410ac9df8908e41e0860caa96c2703827d68c99a513dba9160d21d513580162dc565f191c50ccb9f886f30a74f544f71e8d4e0b445a4188aa30b85fa7dc5f5bd979e26a86a95a8d7cc75329c040af9c8408eba21e8e5720dde495709e0f0d8114751870349acd5e3e56c0d734db93cfa91f70e0810bfbec7aed9c16aa166088ea65130fac4fc4ecac7e59929744667587891d11e3173d12c38142805535c4932e3cefe4fc87d6cf19de17c6a68620ea30ec45ea03b1af89498610d846263ecb2f15a8ba676ab5714163612a0f338ff1ea92611460ef44a2f693ff0b04bdcae6ad02d5215cacc66b153c4dd05cc9d9d5c3ddcbe2544b2f7b37236d0237bd50d8fe8cf9867988398987dbc1fe45db3ae728277f2c39a107713f570603c2917474c5fba33ca768c226bc53c6ad73db88f322cbbaab7f001062e06104644e544cb96e564c915d11f22c3b9f82ef2a980d24f368ef8a008587aefff83ac274779959a9b25cb825c0ead25929194001f1250bffa74ba2e20500df89c7c51322a2f850b8912d9a181778f50280f84065a087b8a91e59b1b840bb7601e59a35c845952c584f5896a91eecd43a64f2e8522eaf5f0e28389c3fbd4cdcce63c765373f1762c729c0d16babf59f1e7716e50eff206ff1e68138af7a2c9b47f0f72e834f70f7c94bf02036454954e721f8a7cd1e78214ecd9c2ea83a0dba823f8e7cc475b8020febeac3c9be1e895b455c8a67968d649e6953e4013d2edc1a75c5ff9bea819f133288367612e31eb4144e1d5892a41e4b325b18850e651a00e1ddf9646225d1c3896642730d7535f561481f315b43b3254ee3690b8bf56e416d3edc7f05c5bd72b3877304d52ce3d75bf48f0eb9abea6a012b8c9262dfd5f80dbeeb13c75f70d4339356cabb1d63e983a4d4343616a01753fa89452e5f5ae6be544b47ff5c5fa868a797a4c6dfcd5653a67c57108dd77242ca89b804aadf6b43bcc1142fd36106ea59d92cb9df139b0be4ed2005bae50ce1de9ecfaef4d22414b3dd013532d61d9a6c6a2947afff2933de79907fea8b19874118ca51f45794c137607ba6d7cb334789fb5d8046c52c1905b04b185ea9b2588f89aa72e75e44d17ca908b605760e596ecea69d0008ff77a6ceb7b993f4eef4ce7a7687e3e83d967a4b0b0f08e5312390d6ad83ba7e3a293e9a7299a0bb536ae8fc24576587a2370f519cc53eb33066e20125b4a173654dcf9add422092ea180953478f9716335856969b324a844e1ab6d0b63893b071e012e6a04b3ba28a4b2d0b554b84619588c520cdb77562d37a07fccfd07f49437fe98046bd42c4416b9910b4804dc218db58aa3a490bff08a71ac17e27f97b6265624a03116d6dd3a518e21a4f98a333a5d8213d11d095e44b1c989f10bccbe12b7aee5cae3fdaf9a292d97d09ee1f56c6f62caf8151c20d8e2fe4773d4249f932c9a2cf6a1df4141a8ba5326ba7539aed7f0ae7409a5d51d467927337e7db811143474fbb716751f815bd005b760cf18b9df7a170eee80f5ce18e1d594029374de9f4143074948c20ee9dae5b7f9141fa004e09cf6821a0395f098c9db997a5976f37170d0ec05ae7e5f428e4ee02fcb4683ba6a5fd8ea2d7216f6c2e9d3aabd8564d2c9c8e210074ea8c0a0538749385a89e13546bf026916f8640631d49cf79f2c5a5d529b6f55df00e103e33a01b2621cb650bd1970693cd702b3e0b0003ae83648019645280053cbc3415a57a4a77b8226a0562408fbb8468d0ced66feb4010a3221f4d42f67b09e27f000e2833c450eb31bdbf8a48a6f8cd0d4f0e76dfa5314942c02cc4cee07f0a08404d324eba4d743e2dd70df154dd4eb4f7b6eda8671777105bd39567fb8a533d7b33b199c95d8d4320dfb80524838ff0ae51c83e6138cbe3187a1ce1ecd3120e77c41afe1c1ea2674558c9c8d61fe67b9d181c86ed009b1fa93cd8a7a8b2a4378b11e343b55f9c1f6e63edf999752dd5139d4e50165b0f78686c765a701e429f026111c81cd1a0c2cd5de2b4e9e03ae1cee93f71e2b6c825ef5ef454ca8f660b72a15966438471ac708653f63e02ea530b6169d1bf931629374fab904bc33ece8c2dc9d968a8db6a88aefa5c572bb02552f8269ddea613f35de7cd87ae17c67e19499e87f26c1b053788be902fee7dd06b5f1d3f83d52b09eaa245124bccf7fe510a8a5d274fe3554eea3f887d703dc758dceca518a937056f8846f01e494b73f81524645e9c5f4c6606238f23be44cf59f7e1c16fbde4f0589bb0f7c404e5e4ea20bc750f8d4b3a28bad09be4797e966d047aa38ea158717ecec4fb445213de750667bfab413e1c82943a9e62da8af413c542f4e7fa300b0773cc52b47ff919e1c5fcb89d72e39c6f98329a345b8e040edf0b80613e7a37f09b694b926fc5b9ecfc18a75d4587c27c72ef9f2caffb48138358ffe4c6b51c3a97813665ab57ce72839afa14b3ac8bcd2f20eb875445d37ee11eeb3fd41d54ccd2781eb944ef67307bfde3d9336698aeff1e633a20a74093b72c3bc173684e2f0fd49a2592bc3740668fd74f70c7dc8420f12f516723287282f6318c99101abdedb8a11773d8504637225f4a86c9e4e1ce26d80e4b53f213e8d25912d86cc22984fd06213c79c34d642bcfde6e11ce1a507e34e2453aa27d9a57729bdcb47af8ddb7998a9b3959f44b2d0e1bfd5e413010ba77ab7b619914ec0cc84c4fd376307858bb73096597530e1e2a5fa00c6a6978abe958cf82e75e24f2541a09561f4db8d5d7dcbe250af7d73eda054ba0acf0293599c7cce9bff33505ff9c2f31f6e31f0e46cd66d83d09ece14c4e66e00be67ca09565fbb4a5ac7ef52e04497da1185fa42ae5481d86998d92b1c87464687b6a1e2ab6a96ba2c82a457b09fd5a6edd1883cf5818f3ef5c79b2debf4da4953db881b4c86e5c0ac6bccfe19f34ff357cff1a3a5261866f2be48ae1ac08447e99d538e7c86dd509fdc5b10daac92da632cb0b01278190bc7afedf5e4afb9bd532ad2e92352109c111f9bcbe6bca203e7da508f345507f4a9a3bc3607b030440b895be4b1afea41bfec4e89b97ebca7f4cbf1f53eef0a73b74aae5a2f1d9862cf232f7631a8ee6cacbbad3823d2b3052ce2c90db2099d10791bc1e1c9554d8e5b4ee0901ba906467002bc8c8a012c776043d5a64b7f690e62a01c234e9c301c814fe1c0867e5072fdae5df17820d42378d5b804475772c5d9976fe7dda6b8794b33a8d7bf082554fe9409b6c493a839f6838ddd028fb7dc32a162387822aafb508b0e6988bea57c7673a4d7b417899dabc73e4e94a84cc218c080d92247ccda34581d87d41cffd744d0b1eac02bee971048054382915c3f8a743386097d03b2bd6a46adf04fd8b01482bb3dcf86ac731ca1e0f8b7442778658415fe8460593c4a9da6ee71f598acb07c55d0f66364ae728ea587768c83734f2904324395f8a6027deee4c8431c64039c55f1ad57a51351ca1e302ed8bd0dfa2c8340a2a5c4340750616f5e78fcf54fa5e84bc803eb8b5ae97e8c795286e90ee0bfe1ba8e43c8afdf6c2e95a202eb531af071a3809816153fa06ce812e3241b84be3e01e3d89401adcb9c76392ebf999484afc0cd77ecc79d02d122c24d1c43dbf96f4246b16013f77c8c5fe8cbd1ddc8f2454ac8046fb04930901e76eeef44f372101d798e8b43f499bbd8adf86a40f950b81899c30ae5c9f94363d3afeedfe8e61d68e4c70e2a19949413a406cd631435e1e7bbb5406b9e62f6a14198a05c52ca7e122e1b102d448d29961d8b2dc395834ae3d9d1a9de84158ee18bb333744aa9fcc0869f8810841877666dc3856260aebc8c5fe83a833f44c32e637199c86459163da6b57218b48c8c34bc5d65c219ec97ac3a7e7cdcda60c1f052ce7fc612c890372081a05c5aa36dc21da1f72dcca007dfd218b869f7c442e283a8fb62d59a179a098e1dc74d7c1ae7734dd0bf268e002d9471e7483d165c3a536e66c7ee529e4e806f094e34f5ff578b059b33a97ea50dfcbcaac110612ad4b448615391b5be8de6013694729a1bab6e99f0aed65b222254d95492c125cd034689c1de16daa7335a276e5f1de6f3f491346dcf1ad7055790d57a7045b4fa26b354bebcecf557e7f0cbea853e415a2909094990bf25f66a679f9f0f325d2fbfdb90c6e81b11750d6c9272cc65b18b76f5de3ad0638c96695ab2468b96158b87a32036448b089d6ad22d6dd2d0ea24d04b9a0b3a7c53e56e8afb7b9d6700d73b826ed1edf09b488a5d365793c65997d364b5fde5a472f374df4833407184f17b1b111142da6907353c20181264e61a154d58d2df4155b027b3ac516ae0d2b5507f29d66085b04b91843fc8ebb94ede6a109516c2dee9959a5e18cfee51851da7e3f06dbc8b086746329df22263864c053ff4e9de07792164858231ce3be522547f8f79fa2525dd305456e098dcaa01362ee30e3aeeb15e0f9332985287d7ee032ccc91d3be133bbce689e5f1b50fa574c8cfdefb54ba6f04da5c8244db0d20ee12c40edaf5d76643bfc93dfc6c4fc941d8585f7499ccaf73d05101767db998bf9ae014cd6ad914758bf34cb6833db6af245a1bb5af38ac84227ccaaeef6c308a8dcf3f7390781cb02ae47479e54a8ead4695e735ed87dd7d56b14d94b3c84cd02585498e23514e1b68e405845ef4a28adab1806040e4145303a4be2f4e7b2974980f1a3f7cb9d8b28810694a3e42e321e8799a3514de78bb060915bb1fa96a55479af50aa7aca7e4a4b333969dcc4ddf91e0907c198e3d64c86d066fd233871a1e98c1f46f6bcf0589c88e3e85602a386f0a0f6d12272115b9d2435490f843ef8a59e07489e50526ec569b393f4a1f59f9251cc4544f9493db170f011d5d75dd287fcba636da5a481a9c6e0bfb4b141dd8e3db507c4d2dbf9a806ac5850bb0c6d9b0ccaea82406a62011dc460963108fcf7abdb0baef5d0952cba87256bd74739ce89154c040d5ada4e6d9dcfb615428486f02c4d3fe4d1d0b967c4d610a2e9192a2c0b5858ef15a2414cf9370c2954bf767bb0f4425a41cb36427bfb705fdcee43e648c519595b9c91a6237003889e011abc927c28578d0d718685e00d127a85d6a89e11f204663c300a6c864808b95e362436ce3b38d6c82b15ce465774cd57f0bd44dbda4d3753c5b35a6a9b775536fe4b21e4399ca5b20bbca7410812d858e02952476a0f86b57f905308081fc02204f058b7eeb298f5621d90191a21585d925f01ddb429cd1807d48723a1c8056f43d82f1edacea185e516131c108820a78fccf4143c7ac73862a28994ef692610106a4d8f00dd50487d0b0e74bcc042c8d898e9238cd05a11e68121f54c56ece2d740535e493e798b450b3b202031c20bfd4ef9a9b81f9eec788497d7f7d3eb7050769557df2b741ecc9abcd99162bf0a0da9d76302a85b6fc8eae4fc3949b151a03f3e084467d17620a73bfb81e0ff8086a5c0d0b7c239ff0443acfe82c3ae0097e44244eadffbcade1c980d59eeb70faadaa5c4b1d832a3c6cedd50c5be9dff581d765d6ea059c725b2536f80de09e33be2c1841dfc94d7a69e786210368fa5b8c476bb38b574087910fd5c20868cff398640eddb150e62fb7bc140da278021b5f95ea7cd2b1c3a7f12add844e6ee1b1bae0398697d49c27bd77bda5a34b53f693a574d495c42ee4c1ef7cc6fd14e01516b1672e12a0bbee575cfc17faeda042805eada417c2b826fccab075993e077209056cac31079dfed643112b6124065d670bd00220f7f4c09b1ae68bd43996c3ae8e63c6dbe38e66cfe7aad042ff02584f3203156bca4401e6de444dc376c7bc1fe39ffc9c7ec6551c4d3012a27653e5c40ca61950ea18c53680b06ff9c652e472a95d91209ee41d0791810ac15c54847870ab00dbc3869950f1a2ce38795f7a7cf70cfd9e798f7cd107bc5950ed900e18c6dac9565312b43ba426adfe0b1a8426b77237befbda594494a29652b04d603b803f8154287bbbbbbbb0f3550bbbbbbc3297ac12921f4f1e17842810f8c31c6cdcac0708297aa204c5d94a0e04a3820cd96114e4acc13293a7a88414dae1d114da07921aad4ccfd4ccec196439c19105b994911bc86b63565b75cc05b4f2cb5b2d385d6a5d6a5c9d128c1ac9517b1622f194cce810211724cb5136e88b2ddf064cac8912158a048e874529601949870e12a797a5909a6dcdd59fcf004ea1f9eb8b7d982f203936cb35cb09a62a564e9b654c6694821c871ce398fa0cbcea4ae3071772d8da54b2c8ad1eaac5667130b560db252b7dc67c5c9758d6935f77377c75f704e06cbf39bf11735263ee8e222e7081511d6509180132e3de0d4b2c6f4b031268446e2c981959130b976763d853624c98286cd981b96e02809e144810fa8751151931407859ace61b5dcd982b62250d23df9a9348838861e0cf460b282456a8d9b17a6ed479323aa273bac89a1d34743af22584bb2788864fb743c619d1d8cb2bbb885e61c425e4e0b6c32112322588491c25474340ddf20580af426edf660e574a82cb46c3c2009dd87747cd4947ad81cb873776762026a77f79c73aed2aab359a5bd14893119644f3d19898832316c053175054a0f220eab16b88adc7e84409340a447aa2b072e207f861c427de49c730b224fee4b9a784ba4e49c7316525be49a78aec725020e0e29e0ce8c56d7c24c97e8bd1173cef94333c110518ebd0165c56f08271879a9812a6b87243374e0aa05314bb41e2edc609340e3e88ab3717662e44c1b12d69c60240a551033723a8ea4b8ca1801e171651e7236e02b77771793b3b3a92fc618632b16603e6c228f1a0fdd9504187fd1d8ededa9ba16352832a11af603dbb11f2c77d8bb8d21dd65c718638cc948d5d9d4a271622e86f55a75365990e90adaee9dce39e78cd35c57fadcbc72ce3967aae5d426d723d5e64d8fcd4ee4582fe79c759b3c82bbbb4fd9ea6c4e4969f192719ada18835487ae8c259cd1a4985832bb4e06385a5f8cc419d24554c6767eb2b53d0071d4cc3932a543181f88f408ee1fbe21e2dc4b2d855d40158d04aeac1ae6448560e4cd085e7e40b93282e1488b3662b106ea0a638cf5c556158c1c1cb44ad8bac1888dabe413e218d3a404213f7042b4081863ccc68631b6a26e2a57d31aa67029f78e270dc905a3a62031d4c0350700515c98a18d0f35704d11b954169cbeb173fe13eeee642ca7b1ea6c5251e1ea6c6e8c9fd68ac6cbd08c0131adb4404b9573ce54d806ce565cae7ba5d9a272755b52fa410a560843b4bcc90ac10a27dcb822d236dc7f6a22b4f0bb216e99a1e0cee55579162759a264a912b3dac1636524b45cdf0b4530126c5c9c5a7079124bb85c5a6619ad33336c8c3105fe42a2592f89d40f1e3a7777073596bbfb144dc3a26f2a58eaf19bdd0401c3c6d4563f37a0990940edd8b20293d213120e1491c245cb1c35504c92405de439a4f0d4d2642d133b9b3a0829d7cafccc9da36561c8ed95c7a7ab904f6c8408bdefd31e184f881d51e715829fd7e98cfdda4a29f58991784da11aae00e6d3558884db6c751522e1b3637b84f7ec3cfa9cdd0fcb0eecfa7a636badb5d65a6bf33889ac1df5ce1b5b6b2de91fa85e2d99adfd5ded131bb1f518c32111318744269748ff8eb0fd69f08e3c3bc4bda3b83f10bca3cefe5ea07eedef05ea807704f7278277fcf6b703f2809a07bca3de1f0cbc63de5f0f7847bc3f1123bed8e703fef89420d1e99bf18562923b3d6d003a31df6e603b0de5449bae880e0897d820fb2922fdf2a9bdd1da571adeb744403136a8418b282d003f7be62f2d25cb209ac90ee82e8176d5229139fe5420fc8f0401490389c2a75d22233a0bd03d3852a21a667089421287083a44df57228c1b00e323e72c00a52203155a8786828264b2fa5fbb295b3f9e61671773caf5c83951e8ef64272c090494c9c0603cd75a6aeb9c734e90524aadad51d80c58b53f3d7356dfbf7e904de124d037b936e6a33beb7ecd5810f41074f00b5fc8084317b017e8a3fdbc970ee863dde2bc5e17bac03a32b06b9f1dbfc01e5dfc9681dfbeef4c7fb9658181587fda63af5fedd743179604710334c6783abea3efcf5f979c1385f55b6557098c6698bd7608d62e7f023962b7e7eda88c04228876cfdb911837a2ef793bfa22810db1ee793bf202037fd8b6b5b7a35b6ccfdbd1d3ed0808106091daa59aa2aaaa3811eeee507636750a77d22a84ba06bb392a122d584ddafe37858a1d5ed8f43023830f1626aeca0dcc91291e505a444ce2ec6813c427169e90d02a29681ce4883112930413ad9eec60d1a5904658809e74f4e4c42eb01bed56bb63bed44fc95c83b30157344cae70dcdb06e7268776a334f4f5d030fbf1c308d6aca07304cadddd9de2dcdd3bada11ffce55e35813b70ee1eeed2826137d4281a8e42936ddd978983895b74b5754ef4090bb4d589530ab3ac020130c6f2638291ae96f3101c2516aa505d016154858a9228307019c19917d410b991334297805f5b8aecedcab62a6745ce61da32d281c981c102a305a62b4c51185a985ace39e7343d27d02630ca31736a32d358a5c9b2697af0309adcade8ca9b172a1bac3904673fadae24d76b5747469ad46441ca61c15b326490e64aee490438e89064b9443c7d65b4b216c65732ec55d92828301e09948b50284f5137bb4547d9aad32dcaf2aebb3ba8bd67cce7e54be2d4b9bb1fc1727f61a48abb1071773f83ebcee4c41854f09cb40f8b27e81923226b82203b522cb69c9eec15920a2274f09c736ee22ec2d27cf7090977ebee994ae772f64c948abf84b8932a875c3295195c6910d181c118e32d50fa62ab1c36b6cac23d666628804b5036e9753f345889140eb356dd94a6361522ce9b52947df7bc29c1705362529fbef966fd6635d1c54417f1de7b2fbd1cd020361c27678da9a2d610930111fd3a23964141f453a6a63aabf6841b11bfb3c024115a2b23d29a811833986a91fddab5ab5211fe79db9155430a64a2b0ffe55d4e2d240c21a20677ce9cd6b71db85d6b79379d336a41d84fd8b5af8f40bb331a5133c1c9ab12a97dbba2a68015592046ce5a6bef3c210bb23f4b104856c33781ee7d0af5f4737e4d7e90f57f80f1e70f810877597a8cd9999dc1c894736adf87c054b18108ac19c16a023186cbcb0c9e28628b2acb63101e925d9035a3a688e5681425359930b5ef945396518d0988570a812a19c0b85317b4b0cd50827b8a7a2721eaa62a49a36e2c6e0adb9467d312b88e2570d6601dc14d436c5ac21db6f37f1f58476f53ff0a7ee17cbd6878609eb85fc770531f6795695d8a97c4006e62955c858aa60aff4b9b644cd9fd12368562d8d8f74255a128358588f35387b25d0a502819538846753aeafe0650577b7e9135e34aa1f44fa2ab4910f47bff81e07dd7c1cc88dfa8edec3e9d5a35b43680598974d7ad7f68aae060a24840dd47fbfe8d7d7ffeb0ef97730a4f14f1005576bbf1edec3abd5fc29d448d4981f4b0efbdf7f6dc4b9f36fd15772802415588fea55a5eb88fda8af3f7b18fa4b45a2be8b3eb38af0009b23f0c6a30303d2b08f32f324145fd3559c276498b86b6dbd04416d1c5bdb53f0ce21136667f19d4b23f0de29147cafe3ab08e25e84f2b4898f6b48284868dc71294b45fc116da9fb7c336856bb71d4d9b921c7cb03d2062d310b71d431cd95f08e2114c617f2f108f2198e8d89f0e58c712f9a7952570767e3c96c82f8278f4d8ec6f07ac63fe6688f97ad10f771da795256776a681995655997f37525c9df97f74aacafcab3f8901dc681535a2b4fa4e9f3e3065fe256c0ad5d8b1bd73214a35ad50a802e8a65f3191c7a85185a854fdc014a257a6ccdfb5d7d12b45fe54cabdf32a08ea8410d8a99a94e11f6a54655e5446948261d4bdf72e1cc8c644e1ef3fa337b6bfcf2e69510c8f3e9b2a6dff726797b21ca58c164d14fe3c51c4af32af4ac4effe9a16695d53fcd8684c4ef3567322e58416d1a61ed759a8fc81410117aa57ca2986fafb03e5764cf866fde8d36a9df84d47920dabb5e2ac03857cd3417377d7dd2da9eb96e4a64be381f96e4937f0961415de9296bc6e492de8806118863a621210117bde92706cdd90ca68e1e1e1097934ac8722d9760d35d8b3e70dc9c8fc7a9082209530e28634428c841a9f9d30247ca6948815f9b9e5009283294472cb61743bea01b615d69f3a9541ffde8bfdd67befc3ae1ead57fffa3f176b1256659705257faa2c3bced52f2cf673b147f9f1a57b6bdfab8ff14f15deeb17dddb8fea9775a069d04dbbb2ebea77dd0a5c31187725451d13279e73ceeffb3e3c270a4bc52ad47d49bffbb2eb3a0c6474b5ac15ac325cc656acd0de51ba454d479187e8618f14ab0c6badf55461f774dc69ad2dfeef1b3badf53fee3e32566518e3c79da73b4fc7345540ece771a77526a74d674ed3171f503b3f95dabfbdd752f1fd7ce120ecefe958d6fdfd47c1a7e41d3bb88fdf8e34e8b69f3f5ddfb10fa2e71d60fbccda8ec1b8bdb7c06aed3a5e854a13bbea7c3962eb4c21efabf8a5f8f5b30e764bc52af3afe044e1dfa1501e60cbc2cf401dc3b720c66b60aac8ef21fef5defb0f55a11221c81355d6fdcefbafe8de7f67f4c639b5a8bd2f4d6c4db707ba5a0b6a07748b630754672c7547e651b3009feaaf528a41a565fd5947edd5ddbf9c364afab42ffc94524de9f7fe91f9825385ddd3ab0d9ac2823af32ff5766fb4a0cafcf3e76fb1a9475af05122bde0bba72106399c282e4f94835401745fd0009d3da0bbd697bf6888ab1e4ff7febd97013cb076792d8fdcb6fff5bd5b0fdaf62e18da3e4a8255e83e8bdffef585acca9c0443ed01073a9bfef7417307ad68918106336a18d5803c39b14de1eaae2fee5712847936145dd4ba670565f7f5bd9fe10b104ed0ddddcef1cd7f29b6610464e5cf8d2d114ba0fc274859e901ddf87b34dd7874ed5ac5fa98037aa2caecb5d556ea2ffc792c41d8d8c9205a8175a2a059000b452c8180645a5d901b13d49eb7a59a00f6bc2db5b03f1da324feb9499634ee8b302b0b5419adc276deb7b3e2605419a5b45a45007d0064114b0a44e8757488f4c97a4195554a93914b624969b45b85a0f61d3ba055a68d5665db71da8e906ca71bb725270fa1563c319e18cf39bf9c242e05778c195566c9aa2a8a1393f5442876bc42132d414141af4193d7e05dc80a21f0fbf34415c25ab072415233680605d99942b4b35a83c617f1f6306ff5bff6ef584e9b9e419a2cef67d085b5622c56457f7181df57c690ab3159ced8f8eff83948e9b5e40f7d2da389d7e988cb61c1b859e38b49b0caf21714259617067e5fbb0b56d9bd0fd31a9c335a9ed8d462b0fe0cd876dfb79ea8323da586d3f4c0d8cbcbaeaa74c4584e83c3b3d65a6b6db6576caeded8ab3868ecb57669846ded12525762cf9bd20edb0ace67228c387fe62f9201a8b4ee17e5a8533335200005d3160000180c060483c1804818864938da1e140008559c4a58422491468381401c0c040361180403100600000600200661189403c10ca705682b0f6848688833bac8539541a37951ef8549bf6159e4fd93cdc37a035bb327b8db4fbfc3f5ee2591926e2ea3f7c6578be960199d46576ad019e10380070693aeb45ba5f1b7594d221facf6660f3dbf5cc79330a044831c548b822f31ed25c91156f8d650145d5d43d23df376d45cb19a677e975c4686b70c648f8516e1d85cdb27e93daef113fac0182778a3590a630632c9256f97052addc23f25e48316a120606f6bfa818e049c6f0924c4f0f01418d31fbbc67d02e1e8f359579d125c39d658d1650c0e3f46bead983af2c6eceb02dd61d5c71d80b504f3aff41887b9ffa1ce50340115b04bda1cd02b599fd8625542d24d38cd19480cd41a7da00b25620598d1ad8cbb9f93083596aa0d2a376c30894d446f10129a8592c3379af32d59d330543458c0ee062807afbbc6e745247067990d7629cdce3055993f7ef48c9143157444ca7e37d6fb6046d63bcf2b6babc61a83e6189bd2a725b35657d709ac15a6689a03ca84cab58295afa29b92d3acedc7d202ec73c32f2c27a904d91b86a559128a310d2d42f640206101438732036519cabe8cc97a322d5d0e001c7eb6d170807ad52457e41ac3472954307b17e5c574ea9b105ff8a07cbe6eaaaaf70ed1a0c893d862080bab7556725d589d245f4a8addd5f650d47ac39ec2246f411955e97f1b38d110bbcb1e529cd11b15b33fb29d5ec35961bbb4d9001d7b4409e912143a2f9c30e7527601ce17d414f4874aced4e0c6737a66c5c8012a7cca55669b01f82bdc86d359ca024e5c61add27d8e5098a06453f63b6a44afbed92f381efe3dea6361c84703c5eaab41f6297ff77ed84c2ce4cb25a2c9421c9e48535ef8fbc1f217792da290df801655900d8ccfe3848f3e8afa22e8b3b5d70d3e17bc87f23cae4c55ea9fcf0b0646b40ed3156269e9cadac79b15f8dfa935117927d6583ff40298e87d58587e64e9b3ec8c3a8277cfe6d76109530680f474c894c81133326a9fbedb8c6b9d2675a565d1a6c04716b1c1df1f2b64ffd3f2554096183d7b6f3c009ee28435ea0424035d18bc6fd00c1de43ddc7a6bf8e51a8ef488320aa6e001b77cd0af688e828c9d5910ad5a8eee2abbaee08bf2c22055c20ad15dedcbdce3fed346e225f85bc5622d56bbffc7fe57fd4e29a302124a760d33747ca78668dbd87d8268e2e73b6f5d78e5bd99bd8ea88a9d96b50f41959507dd93e161d26c2e15762a21d07e91343fb91166706868798c82550bdc72b68eca745c5c45bfa671fc8f3c44970cb35f7d5f793fa2a3cbe96bc1b07e20c0cbb305349f406c931c07b1c980f1da2f33695c20a7a1b46f94746b4181391d5efc14fc238b1bab337b021de903a4f2c6d3d18b12b244d55628d138842a2cf10239baf5d307be2d7ddbf689162f9d87c8dbbe735c62db9b19ed06486c17cd805c31f228d40062c5cc05e282f2870866d1ed4f63b7960dc4059abe36ffd954476e8c4b2c51104533e795eba28198c8f3e280cddaa51d1b3dd79a896d761115c7fc44d2eea07c3058375028bd22a287b5547f3e4ea3b35bcc1450b07cfcf77c5e23fa34987e5dea48d21ecee71f53286f3eea32922a91561ee24ebe86f50c8040a6555429141a4b82e82582f0193d81f5bbb8c7f35e2b574abea547d33da1122f9fc4e9d38994e83197f7f1da5b0dda3ab78a171b35a7774df5dc9a5435656c07b8c537933b972a395c3910aa9adeeb609d7186302f7399df3d90406338804829f94e29732dac5c252828400990e12dd1b2fc72714154dd16e7277da17377c4bd6f26bd408f7740aade33ab082d5d9b2d5ae0f0ac87f38068787323dd9d6e0f847bb2eb267f4d475232b204e913fc3c1d1d3f15b99cfe940d41ec724ba8ff5dd1818b2d2520b0441ad9859431ff79e2e8cc43ca915d90a89942228b65b5ce03ca831c3ad9479455a6ae6bb8d368467f7c6701083a89ee2b0bb85e5304f72d0265eaed11f42b212f2fc4bde7f5d351f2869f130838de03b0622e7c0bee18735703200878ef41a76f0e4351976bedb759fff7950b2fe77b9c854916c5a361df2568811e1871f6ac035044e8a24d9932e610c055621f40df1848541317a9dd60e3d3db5876363d5d0d54abf28d78487e936000f50a98f1f54990015cadbeed3445a499830d4a0c4e21b71a82d4c5937dddddfafeab20442b044b91eb427d83ce44e799fdd9354530e4b8863fff2a2ef369e4f713298c9db9244d3cad00cec041380bd3d9f5574c84f27928e148cf028723fc923983bc694ddd7ed6ac1c4af894c2b8a084b6342005d42472ab213898e2cbaa401e80770c49d4f6cdecd8ed5e76c3a624f84cf5d973d22a5aa0441b52364708270c2674355b5028e4f19d61f2d2fa4a1a5cc11c2bc8e008c76b3a8caf97c988ca183c582780229a64c958a673c98883ca6b4e046f3138655daa3d07bf933077137333ad293919614c78195fc00e828a340ea8924185193825e136f75150451d76ee40874bb4095570e1e0866afd8a96d2f34825847b3ac7c347c8f97af25e7b2ed20c1eca01d59f21c05e2ddf86b12df02f65000f7e08c083bbf8663ad53326ac036a771a2105f95fe2ca6b253e4f4f4960d94d678a7613a845206e21dff6b00d0d0f4a2145a34dbe6d08c616529f38e2a112735a4eaf04607c6d83f18750dee49622e035202cb098f63289a5a4a8bbdab590d34b1fd2c5726da7ed3a48d2b8d1cbab12ee400f47a30eaaf351bf701431ca6d09a32df95c7c3c2fedf28a03d679a94de44270026068807286bb3c0d807da0d10c55433d19a099c4afc423595eb13b9bae3c0018d50be62e77f9fe04af5fc2d3787173dfe97d481617145da23f7a50d36642d93db202ec508ac685886292bf0c53d1ca0a80557fc5996b582fd7f410fd41b00f9245c7e635cbb54d9487c0a724b08af033dd82016b547a97e1f49e8b134dfb13e66caaa74a216eb289f3fc3a26d2542488096a4deb98cba0bd5de14643b1787e0f749a10292c6e57ca1ff1005e5988a96197eefa313ec09ee7d6b235b9f144a4402ce60a1d3c31005a284b40c7aad097f6fc65b06fb5de26168c3e163b890f8fbd2d019c4fd1c5fc7948fe3699fc12b80a18a062edbcca390a4e3964fb8ebd615351672f7d6c1d2294ae086068c6364ca6e1f27907c5d4f9f0400931734128f4737c433171fb393c9f06a8abd4a2c13a0adf883918941c2cb4273b699e03b633f3e641489dd7705c245c677594fafbb47b0cda7d7c9b71cd42403509dab2e15c393875ac6460056ab54074dc0083da8e57b526663157d216f71db0fac7468ac7699a156538a413170e50190486d7c1233988028f32c80f66a8f2fd2b46ddfb19b6d757a398fe043197536d60411a27e1f4c7d60f0d7144e90fe26f253f0364541c8226a66a3f4da5df9dfe927e140cf639b6e1f34c7841ff6e681e6e40b888822e8d9591b3018e6893e426b48c6aab4d021b143d4d1ab4fe4fbf2340ebaaa86d0f1acf0264f985c6712ff0bbbf90333d0fb2defc5ec52c08b87902f56e0d5303e8e985dfa339c8a7419022176164ce2b60cd77843818b758b4796d05a321f2275f407137206014b7a0fd9110d022526eb842abc4c8e5d3edad68e16208ccf8319b5466abf24af7ac0ab6dc4dfc012f237152e887866db465aa952b1aad20e9c98ee6f3db906a282f56f1ab051d827f37c7dce04a9db2d877e3928b91a24ca1e68d74fb8a5f3cdf3bfa60e057e89ea982a77ed0cc0741f8e0bc9de9a19c745b8ab05411c4c3a2716612651e32a3f408bba4d049f4a556e2a3e4f472e223727e032df0e358dcab9ca73501e57297a274cfc1c71523c1cc7e5a40b069ed06fdf0cd82ee01bf2bbcd1b1e49d16aa11c3b4e1115a995f7dee42049be8a3e4ace51f3af6311ae10a6f2f6a549e8631053329decf3bc59bb4475f6132d0023eda18b1c6af4e604d41b3aac50f79c56957a2fe84f115a46edb68a07c5750f28d3f741af0e583f6ac3a4ce5b22ceb46ed4750555484bd4c573cf1803cef481f06ab69b916640d51434654b6112055fc0d1e5ef63c0fb86b12492ef22eca3e7d605635a4f0b1cca88904e1dc91034272b142785d6186e1882c2dd83159a63bc5129789a75abfcafb1632cfa3796c841f6aa2f118eecd9470a9a49edac759227b5c9a3a1551a4254d28a8c21e384f04bb6e77711193bb7c6316363e44ec04fb5f98506980578beeee53acc176c2b8ea6f48ad9d858cc440897b6b314adce4635e55ed5face7ee8a4c1ba30522f903cff746c122243dc5b19e91c34a29865478344fa574e347434793d4c027fe5c0e3af52f169301a7950195879a8ac08efb16facc4b356df3376531702b046f44ae30b27fdf912c7adf32c983748df8809fa355a1168db3b5b2e0ae5c612543025f88a96b7cdf181009fadb1eeee4cad3da779510f19748e875babff900a8bc58d57a386ff03d821c439e5e45125dfd39ea81548d4421ec852959ae039fd186ceac9fac853e5c9f017f6f3048a02a8ff1e7fa590d62bf6e5961a6d5832aaa0c6cbf2dab84da28a1fe4ac16639341ba168bef50c16cbd630b9dfa9d6d769844b2d4d822cd24bced5fd6e51fca52d5988d274932bcd546ef0c23c07883ae8275c26adc8024e3ad5af551cd7dd2ca2014f1c76ee71a70dea27207afa0f1f11fff9a0982e329d5d29a1968f7235587785b12c18bf29feb64e1ba616a6e7fa47734ed3809975f7b7a1b9647baa0d9d7fb118368900f0f9a600a1a915720a833d2a1cb33aadf67c618dd9179db39f4c2997ebf75e6cd7757485bd35769d1dcb69488c1fd8714d5b286d78451f485e1ab7a4ae838ecfce441f047c8a8d9436c6103cb39b9236b65856d77eba4150c345543d1ee4184d333e7f1c208716efe10dba116b8b01f8bd52086b8be86e15a4341e421d2530fa67f86a6919e09aa81284ab89174c3f12a5a7268ab76a106cba0902c161b526a909f905700f5f5582ad77c44ef40272dfb38c63bac3d390feb8ab18dbe846b8c868bccc68a6fe07432b17a59d6311301c55750d058738ec3f4b5fd458b04280f6f4415344b8383ce8de54b6554247c4004f224436054a2272bf3c5152ece0007f0651e96e90950396d781ec48027f6af206067f65c9e40d4cb8fdecacf3fc45bb1549777b57e074d4b102649dcaf27331c7140ee533a218ef05509c4b4e09dec72166b5335d6f32761ab453a19c30ea02f876e261c04a643b2be651aa1953813860f826e5eb2e93a896aa291c2a2769fd48ddb506a540a29330b7544a84dd355e75577db0bb604e4c3eaf28658986177de77617626e53c6dd755364a9203b3a6fceab04b2b15ce8c89ef21a3c3ba9b28685888fe6f82a0a92954b963df78d79e739ec5af4f45a900fb9c74ae75c0c4de6d4e8d672def184f631918384dbcf55b6b950d416c9391a081e3a223ddbd74e68e5b9f14b03bdf3aadc9175f362dd496c2babe6260379030db2dd5f6678bab82972589ee4cd0167217b89a8a165fbe83f94f49823385b9bca32dbc41602cc96cc7ca8331024b361aa5f258847854d685c5a351568253394e774709c4c9992ced86a75d199d34fbf47370f10c80cc8da06fd0db9596b237fdd2f4dfdea8651465e59c141d488aa4dce1d078b208104bcdb8f69f67e1167c76a990f2f68f2e39f20063005f37db423bafd56260e8ccc02877e8b93ae816e7ce6711e2d624c3234d792651545e8ee476e51123437342dfdf46e5b032c839c569af8c33cd24b2fc03fd1370840331ca72eb3b3b117f4cbbde8823c11047de906beadd0350c7aabb1a4954572feb83c862311bca535002bd4e14abd075bc5e0bedfba0b4b2070d0e35cf45ba8fea90bbb6d3ce0562e96bbda24cf14e9cb8c2ca728b54e805789e2ff62271c1c56b5e8af471931c7120d26bdcfaa89edf4d46a66c08d3f5a55aa11dabaf853e925feb07986b967e325e3edca89a1ee62251f5d94aa4418f45d122a2ed7592b6cef850aedde6d5ed8fecf6630a3d03627efbfd62449ba45fee3321b23eebbc7ec6acd55507774a2d798ceb1d152636e531a309efb5208e07a791ce943a2c34267e34f66304a0aec4cbbed58991be875b248884c77d3c766dfefdd0e4b6af04f5815882d0b25ec451478613bce36a692aeacad05c7325b5d01218296127450309fac0a74809e91156912d37f039c1940b638ef3d36a9026dd8d507cf8513916fb80129a75abb09add4b0deaf1c3ec26c081f268e0d88436eda8704ea7a7b34718e8c6f601c08ad4891c0d5c2752c1654887863c74395ae3aa93e8c7cf0ec85204bb476723d9b392c7e06a87df94e84058f18f6839b11792bca261587041034ad82a87e1624ea6d656449aae40d6c0dfdb10c00377fe97472163ebf49234f41cb19e29e2b0be0b5d7b1fe55a2fe7142228136a44197fc5c437371ba230b7bb944631338bad8425d7bfef9475b3f74ddb126e4823fb2ceee9c5e8bbc2e26d384af28bd0f264ec11d647847f2b3401efec36091bd2d4eb36d3164b4d27cfea582a26cffed7ff71de563b7b8cef64b4056bab39fefae6b4b477520efa53cc42664d9e5b61c06bc6edebc12ae3044af02b74b21a739ffd2eff4d7d538591f333e12e505b452f0857e47bfc76c9e46c4ad9bc7efa75acd135894743db0a5442c69abe89050f4692781e3496378a9a254b61882d77919da71402ee0c16ca4b39aab6ee231f296cb33e8abe3bbf4e356799278a722611b1828f6a9326e1260bf12a553b81bb85246f2689151c6fc2e82f14a705dacff0308d014bdd7b188dd3a28f460df3dec4784c7b3c3152df4ebfae964dbd9ea06eafc8df872f8d5a10d3ea552dda1fa6724025039edd692e11e1132255a460eaa9825fc28bc7f3576bfc31e3956362c5c3bd28197169a550b3a1190852b19b124a70a493892ad1662a21085a359d242a70249620eb3fa8300fce9698cfced16ac401059fa029e00891aa46be6d4f7ccad0d735b8afafe02ca2d43b657a05e62022ff246dff381116d6cd8fbef3dc75763bcc0325e56e26a419add17145e9690cad21fd6029e4d20f6cacafcd93ebfec1d1b074084405a438ad6164f332045612edaa7f34470a28bccdac4c84cf1b26aee43a0083a415c08f5b7938407a00dc09a17aa44cf8fce362fd8070cb04f6cc038d4fac9cb1c6b814c08ec31960e345ad5856eb35ae3dfa5630561446b8d77ff3fa4c2d97fdc4d27c0c6793620241343350153b5d2e877ad380a1dba43463141eab5bdcfb09ece319e87969c1c8a0ee343f4b6d4083574f81e54043874b06c8af57a1a7a76f1d071c0f437d68413c3762427e5b8c1fa5af76611618fe1ba39886541f629619561d10b004fc1172fddc9316795857bd94be1a171e2beb1cf8c8f7e35af348fd045bb988fc5d1a44be0afe3686ca83decd7a5b586070eafc338e0b9996d7e88e3b7f24e307b1948199f4cb6ba5ab35e17a5d0b32b67998f60baf8346b84a50118a0fd18c8e3e93c6be33d6894d328a7f84cda28aad77e3d4aa31109bfd67899ea948851df6a85c32e92fa209ea1a9a4b062b9bad2573719b5f1a9c3d4b1f1564a5552aaebab578f7e0b66c83cbcfada6db04cbf0cb439a6c855fe126b01e0819fd35b56b74e6e6576d3815e00979b4e1267a51c8d7d49f31361072940a0adbc3bb53c93e29d1cbdb4938537431594682e29747070f7f610c50de16809445b3a4ee9a8f540fd5d3d116d422f419af5e54eef710f6454555a97a3cd00d56cf0d7f9bc86a5dcb5dae662cb27b1e0ef6021d0d60581133d8eaa15041ef7696be7a7e9b4161ef7cc6989407517c992092ff5f67cc5169ff76ab708359a113be64136b7fc546b68582a20accf52aa4cea5621e8212d7230393fb2e9756c54300861e0eb468815c44780cbbdb603a8e84af114948d0097f0ec650721622d23d7b581153a0030e696db02b906947b3c7d90961b007e6902ae2dd0fa4f53e1ee1547f06729420045f2afd5f69bb5f7ba10ea60b3ac33c2caab41bca26f4bc6ce6cdf2d66ea11ca8c3d3ad144c93c76425c075ad2ffa746ab8c92ff78d146a37b9457b70fa9e78a5292d406ab1e8a8cf451dbca58f9d9f46962d115213283efb22fd3016b288281ff0599c5e9f9e0f70008c607c422cec0be312831c5584768209a8234b0a536f8f248a300a41df2a3199105d2b5d24a78ec6f147e22c455077f33ee1502ea971e8579426dcc1e95201303af18e5e72b3830e3d4824f28a2e4851f8bb5774543708c7d56ba8ef956f199a3d8de98b23594a4ec887aed52ac9053694e7b246d399becf92631fcde62077ffb990bd101ce84d524153bf5ab4414f55565de18b536b7b7a85ab387684092f8dfb9bd689de55513c403c88656b4e9f36cd1ff0becb9692b1a549e1ef294488bd56e3aae992a8bf155b39fd5706364ffed721cb5c6ced0c23180b6371f8ad31ec08454a22361a77925f7f7f09cc89dccb661471d052aee6c4f33990a0371787a0d309bbee9a0a304251b0a0c871394c10750792b4733bd7cc9457f5ebd65303698deabe8ce6c0897cae4b0ee14683c76e6f81459de10113b612de20424d1056c81e86be8de2dd088d213c67fcf5873ac1bdb7db86c38c6855bbcf0ba70739c96c86180cca18ce958c95932e775d1306ad249d4efc68d4ec3c78ab10f3a2eed4f475af09f98825a30f40d62410e5793e73114389b31d8b0b26d72982ca2e450f167b728bf50a6367c64c1f20801e35e104fd55ec73a2bc0bbb86f94ee8c6a5ff8826bfcc523a6d71a210954d45909cd183fd872969b958c047627e168b43668a33237e9a8c0c4ff62d1cffa0b5d0726799a3984ccf11318841f4da6b5ce5c5c7eb481ca324bdc46c76e750569cbbc464cafaca1fb6d1215abf5361a2482d84836d22bd9714ba3addecff3824725ce60105ad4c5be00e94082b7bddcb04f85b8bcb80beb903d67eb2f88ae1d98c0d4797b117fff191d8a6520ae883a4438557d98c7c71a58f5793b8f12d57c528eb5a30ed5d480472c435816fd4cb4bd73d73b6f35da082d9447a61437f288ad0b02a96acb0322e224fca711be0189f8089b8f10091b1b2f92b30842c4db096c0557fac9bc3c47f8d2686b18a516dd294ea2ac3f1765bc15082bd0ce8e4cc189c31ebace8391420a06c388c9851f964710e727fc21c8be3cd15a87d8dc1bc91e44c441b8416705168dbf545446ef08c6a90967a626245802ab1e6acd3af09d41e8e909390a225b83390c64fb682b92976c26a1007459bfaeb448ffe9978f620b601892b81f7c9083d2e97f2fab065d837d8f386e455ff2279bb1d73543abfb527d3e2b676731399ba35696e08c4d66a3075196da5c412b481a2096438c8135f4698b8e6f3d876c9f91ad0e2aaf78b93cb13f6af61284178aabdc46a4275f48d514d9b53481a664649e8d1e215abcb2e8c5405f138aafcd6765d65b6696374301e2e9b1cc932009111ce85c2ee07776878f41b944df2d099935103ccd789f4905dcb533cf5015f5fd32fcbd0ba36c20417eb2f7e802df2303885240c4b5709ff71b248a379bfe59e37c317a9f812bac288519db01cb40af8830745f26e0cd06ab9fb30068b99b21052ef71cdde7563c93d4eee096df893ebf9a35b76372963c2c2711e4995f8d700b9335ef972ccf22c8863773574b35d5776ba7111be4b4319df58c64f58718cda239aa5789702b3639d33a92778fa677a2b2757332cacae698ce57beb5ee3cc4268f41f4cd1503f8ee2c574378d70f8f050c18169efc6d1ab83c9e86a3b831be7a7dce215c42ea59ab84cb29da7e1cbdf674b8a76d8f3cba176d568939d251eb26ff80303d581d493fab93b550b6768ea73dc00e356a02f5af76192746741b54664c3c6e5427d6b87d1492d4e39f8979cf3236b9c3a79e09210e07ebb41cfaa72e37b43dd67470199f8a8d1c972e997afe2c6465fc901072b1987833cbaabf428290a52fd2095aad9cd56ebf387bb2efa840a3eb2d4f8ea2cd8049250ed298832999c570d69be10a0e3300fe0f80516cfcb2a9ffb5a34b349acd59c34545882af75515e8d75729fa84d1682f6147279ac43acd55680d15739d927f840ecefaf62a1994898e794dbe6f27670633ad3de326cf80a5418a15feabc767eac6e8abda2245ee447470cbba78245c449345c0c4e877d05cb189cfa0f958015df4601a17d78a0845ed7461fed5daba3ce9afe7fc4575be08414ce6aa93b2c8d61381e06582223b21f13c32b4b1a6b6e3872182058d2f692cf87e02b9ac390b5f592496af284c1ea1c8d08aad38b52e3179fa44f3a4fb104d4c34d454e41a378abe582f205cfb1d4a324f3ac7d05167752b5828cdc98ff898c6c6a90204cac5cc334560f70c0d1663f7da9a3742b0d0cd81ae903fe4f171cbce7b51520288e8dcc7f800c7282d7f8195dff871af36da8c4ac48ff9a09b71402acdec70cb5194c39b62fabc9e7b1b11c7a0240a4bd92406d019dfbb359565871940e94ed9486bd99a757d7a033473b10741f67b9465bd29062c82bca3ecdc70f7dd6bb20238ef10e77c1ae662d3d0c7780500cf1e8c618fa74ef494d51153401c1621ae25e5ebb3041378b09f9542e6ad26266150fab115ca38e317f9123f5013b5869e6a912897e2b9281f9d48a4b0180919e4622b051f3579ada894f06efafccf2e1372672403c779ecb2edd1e84b3d830cfb46089bc25263d8e1c2267f3a67ac53b355de26732d9c33923340fe47cc659fd14d8098ea2fd209948eb70e9f42a480882bb29acd88d28dbd867224a7fa87127d0232f9fd9273d0d284fc20e742236b0b9526aaf905da8b3c7adea0e3741109332c00a555de770f1a4e721ccfd864e24c49d5607b13cb85674d02fb57760d89da6a82c631abd6672c627a834141a30eabd63ec5653a8a6764700df3c09d658cee46f10ccfc889e8e774d31ae7ec64e8ccdc7d213f336234a5bddb999d395d10256b73613111e92de26a2a14a7bb9c4bd2edd047613a3270f5db516e2fd3b2aac8ea35137aa2e4b60f68648c1ae2146a0af50992d3163a4ef881719f441e91882ad14ca7fd3cf9a5183ac37aa1845298b679529594c819f98f2977366150242958c83a285c768408a7d4d133c00e8258968bc7ce34bd6db1d01466743836c368710db2f77af688da5de89c6dfc01509c77e8c2f58dd5f218b4b10019bbefcae63572d3c3efc6e320282701b6bdc4bf4fa510daf7496c2fb501330daabcacdae18e80a25c28086e91100fd12010edbe6c126fcb2552142c1b160ae502d0c00ad982c6fa4caba60205f7a3f0316de590c328b3049cf7be73abe891a773e00b7f509344160edc1146742b35a083d5350b9404513dfc4e730011f1c7caf87ac7f48e9d9fda6753564cc1a26d490aebccdf3f622008399c0bf3a5b71adadcb7e641bcc3a7853f20ffcb6776ca55cf701d0f8a0b5889f5a39fe6030a5169fe88ed16335a95e30cee042509b97d104a7005110d96f7d98c6de7ef6a3694be7ecc7afc193c1a6faec8ce3bebe0e51ae670f1bb4f1a69566b8c2f2a742e7f684b6cc2e39af89e01ddd167f10d952952d2a0f8edf910707b4d808d24bf8949072e0cbc52de0feec05fb9fa97e0aa8abb641930f3126b21c47f4bead108c970687e9b004620d1bbc08c9542d88420a591afaa08ef106378d5bfecb24c4f69dcddd6432fb7bda298c9dd8a7529f24b02f163c01d0b6ff472a8b0d902d73329435ce16158e1bb61b8d1f2c2ef1289741a63b966d1137fb98b67fa82cb35cbd2f83451cf6bdaaa6477d9486063417e0454d0c10024334ad16f67315898bbfbed27d68386c795722d8d5023e95d64c02a967dc1309ca7e8a28168ad9422701e288f3ce74ed47910827532d94ef2f01e0c3425581c59f0f0eea7716f2761d24ef50d575e9d6557f8941e2a7d1b58aafff818b0da85bd2c5ce353744ac68dc71152649cf9c285de0b064c4215a4be545b71af5e35cbc531942784900fa2005592b0f95db31a3558be9cb2ffe66839f4a17e0a1a06e2da1cfbc921607dc490804958e43e31c4c97b9132e01cb473fbd48dc13728870f8bac1df4147b09697c387d3954ec1959bd58e609379c4d4434191deaa9b13feb06c1867f8816ff5dc2e4ae0589ba8184931ecbdd05e98d2df9bba0e620952eb0e9129ab8e41e4b214f649727f2a8c32e0cd62f1c0389a77451ba3be006211e295af7edfc8585847dce58eedde03183d2e283ab4d5a58aa3eaae68169406adb57b6906cd4f0eee9dbe3238d936555120e41335e1fce45b21d4a1df33763209eb65f7188108fcfa0b0390c1f4fb60a4c716fd7f5718274dfdb29bcf7d185df174a06d7abc338d9526ec451654bdfb70521dbb23cd206921fab412e88c31f6a2a7022a31c4c49bf588c6f08d13b977ec6243863eab36d170ff1764d8e127d67b186963862e5a68fd4439a31abcd0323138cc9c7a2dd26a327ac3f5b1d4c0da6043f2e91327bfd4ad641b146119d47b4ee47cae2485eec218828ba54b843fbcb6b47094a3f2729f934639feb9b893958673fcd977cdc80193e5d421d7dfe293e8ba0155e6ead45b07b4060c3ea2c83a3e3224bec55362e669d0c74f1623a7e127e67bc7714f6440205f4e25d5b3bb7d84d04c91d852482c69bd41942738ca43a5ff2fa0d92f7b2366651d745b7d72512c6228a702b3cb0800ed27d9510cfded966865caef318af0499d198a6ec2d5a1e23f1d3e3108b824c1eb43a1191991f4fd15dd39a571cc42a709dd8a93a2e0e55aaa284f274e1cc748c1f0a32e016c13b6589366446cd6755ef52c35e55a7e42d763d09c90184d23665361181ce78645999240363f800859af332af7328283bf5e2c32ac80abe500cc86610f64c34dba7cf249a8d85d6fbae8199387e54c9026ac2a356f2ed99f0b494d7a1c8412c753de9728f51a1655ad77912d28c172ddd5954691db3e09465a772ab01fdd430798c2c9c2528b57625b888817250ef21d63b013536728711ee6f07c363a7c81c871867641000ccab687356bf42b851752c00d065b3154313cdbca453f1db0371a4118f8a9b8b34438662312f2d7fbcfcefb38fa9b6562984166d29d2888d4a6d19138dd38a87aa6777a0342c26b13fb36fd974946f29c970aeccccc6c0a79773210df529aa7fb2e189729205c7e13f00d7297f880a0e2c02f01c511cde009b1adcbeb00f702a0ba8f10b1c8824bb4bbebb41b3e8b9cadc51df18b13e8e3882130ab0eadc213b46f1228c63d117877a6ebcdb42f7399677c5d4c56002f489fecae69e3e28596bd22b52f21637b35565ddcd16046296b76c66d6f47836d843a96d82a3b23df1451d52560d0778a55b50a1d5b4809d01671f2f96d6551c55b2f4dd8351e9b8a35e45322a9071f48bd354b952c3cca46aeeb2ad712253da5c52423c624505529a8e2c68645a0106eaab0a737bd24aee26f31f0511977f21739661b3a78323bbcb3c516753551fcfc1d09a34ceb663cda9ef67619a38317a0bc23853848f7a8aba5e20e50232ebf0858f18f41192b08b1c986d196d34233d60350fead210f6c58f7cb8cdb0afaa52a52a9c64022e303e269bc9e6e0248b950325e27e72e5db07512b469ed88d896191b75ab881df58b74db0cfb7300f41829e007cbc0d59dec6cc7b4a1ccd23e4b2232ee57a0729d8a662395bbb4e93b52c4b1070e11ad652676aeac5109e9ee7a6b833019d826eb61d903ff4c1687138a8c4eb6f801634646c08afee808e295b0a25aafd8943e22347b8ceb94d5ea95cdb5c577ddcf386c0c982565f7cf6c28914fae834dd29b5c03e9448b6c13ae7b14ddba4e3543845734dc55f4487149747ba671877e5eca05145d50724675db09b0f7c4974937632789b9fb86983469fa369103584ab60aae833dae10a4287d510fe550533402fa52d471804313181b4c68c7cec9a0150014a2e0dedd263e343e788d844057089097ebb97127812491a1b12bc7cf1f9119f884c2fe5832485e3c26079f453e90656460e10c29e5d2aef6d89e64821e470253ecc1b7c30da27ce9a0707682515782e63d967172a64d4cda24a94ea30a0a3d42646c15e6497f418f51b9e5dbcc8e7bba9b7272e1cbadb4624422da46a2e6335a10f63844819adff6caadaff2abfac63e1139f8d7a4729d98538acbf176dbe514422abe0f83b31205e10a35bfbf6d3eacedfa9405caf05a4fdcbd6843d52d0769a06b1d09062d809f7692d678e6310c6e6cab492e0c8f440546436cdf7b986c8229124504f961006b7236d3fb56422e50357120b627c11959909c7e2f5e33ed2e203895a12a6c2fd2d9187ea593d92330b0c5441109ba8d021c7bb7563d23a71cbe109f331680e9085cdcb2772ffc7c54a713c0c78ccb9dfb66eafc377b7281209f58ecd42e299644b80129dcd54d8a00741ad4b5fe1661539a5c051a6d24270c7e9e8c3a8df3d1898a0db06a301b60efa3e2acd26b89ee026923d188709066a3f7cb8276f620275e50b00289cace2dfe227a462a7638818dc8f434a8d036f667606f9e91fcfe054830e0de985372d9b43955dee96e73b3994ed62bd22eb1cfe304a56e9f378cfd8c49afd895d7020b2262a63e88124060bc0a1712cfc1824fc1f61b024e814cecbf458b702f1986f5fd0069f1e06f9ea8b1b0068f54321c86f8fb65b17299fad8a6724807391f0b4700fb67c1658d5ed200bf586153e802d6ee90bb28453b42ad5efda5ab7034acb553113dc813221703f81354a8589db7753d38120ae08232a89b1f403ba1474dbcad267632ce3b9281531c6fd7df44aea621e59f526188b65bdd56aeda39e62bf032f8a8505dc7698709964c5d38798adc32f4a9c604240fd0ce6ed062077c9cd8a4876efd58795eeda29dd24615c147e518f588e378085f9ca93dace927cef1065dabf544cac97f062a65082a8b02432aa271b9115d957afb184314a9bb0af96e04c5d2c1cbb6245a69f44fb9ca622b6161cfb781b328332a15556a9b14ef1e64ab295b76962e9fe41ee675076512aa8ae1a15fb1954dd911f2c1a6c3f3589665648a9900123bfd8ccf2387aac067eaad8789c2b85b172d2491dc020d08a8bbc6e5ab9c871068da50d264910395227d6ae48af8ae24594cc0857cb735782e00f55b45e027618d15f37ff78add59caaab32c406c80fe160a8e9407ca5ca73971a1dc77197542919e3025b79f81a2365425c02855f98c713254a6a9390290e2c67e62496044f6f72f41629e2abd81bc33bf63c3b892254c5322c608a807a2bee27f4ba516ab6f7b21990aaefd5ee1934952cd608a3576f29438a1d1ae1f24b654ff936e5e3a954422de9613849328bdd976e8671824f91eca75b87b3e122aacf48960d22a1e341ec7202bacf0d6460504e615507f5c385a6be85e47141e67621b97e5cfa54662a4f3b31a01ac9a34275948395daf3afc346460f2518ba8530188343f4b6ba05003088d3930ad5c01d78bc00b474f311afaed64803c712fd5652c3a88170a45dffefbdf7de524a2965f60501064806b6cdebf84f322a6c1df89a4ade7d95fe1b24d34bf8dff22f782d5ffc2cbfc3ebf0583e87c7e1af3cf15df0377c0bdecab3e06df81a7e98deb74fc3cff0559ecacbf031fc9417a6f71f867fc195f38f5fc14bf9280fe59f7cf09d7c131926b3e4227a678df3d92bd22fd71d40f51e4dbe7f34f793bfdfeadbb71ef7ee7bdc3bf791ef580dec07ebc21fb36f63f871f00dee1aa7c4e9f7f7bf2e41bca8abfbb67c2bc2eaf29a2c28b9ce79a9bce58f7fea8b49bc33c9b5d6fbe4da96d6645dfbcb3dee6d4d205ef6933c509b63c3b695cfd3e4e593e59f6f9e82f2eb2f4f415ab591ffe793a711e7c93b066e1794e4fb6422b946a14c24cf1de6e4d9921cb52ed47d9c8e3d9023b947bdf38bf6a033be270f205e48b583176cf6acb6da5a6bb5b5d6eabc6d09b4a31ded68cd27adb5d6dc5f6e5cecdbda711cc7519376dc76bfb5d63ef9e4b6e3de5d4832f591da4c3749529b4986fc5c7e6967e697aa8d2449f2343727d537416a33912fb3f7de9a97dc363e69efaa0372652d0fa96640a68f2a89ddf70a17b1cbda8c83b5a5097ca4f66f92a4f76d37f9cbb4b4597d13a45a93d0291e2281f808b481506c32710d948130103a9a4cfc02e9f36d47c9fbe3e7fbe49be3978fde3fd50adcabae3a483bf969276d378de49b6af9fa473548f75b81f175c7b702e35f180ee9a8ae3ac8f6c4790716e21b6111af5cf08cfcabf27cc7bf6fa3f71ed5bf278b8735d8d99e52e65b79d36df966cbb89e6f59ddc21912a4b6cd850b5ef31614cbf22be731ab1ad7f81cd78e9147923bccc842139380bc2790f10072eaf6a78ba10345ad15315a6badc5d6aa36ad71995e6bc9972234ed240984f108b48150d234720d948150d334720c849e26b23c05e1a00bc0f4fce7a983b457409340e849be00ddd31ba0470a509b6724107a4d2487b940c729098481d06cda3c036920749b36df40e868da7c04ca7a936456399045c8f82a8171ee66b9176a745981e40331e8096131e6173e6881500798084921450c3e27a58350049a0553b92345b82dd9c023c70d2523478408096d1059398291428b139c2d9610a0280b4fa6bceb361bb4409d919e9f83259f635aa1db5e4676b181435211bc81898b2b40b6efb8c69219884080024825378112a0104a3265ca0d474c46f09978a1ca708b95194c1aa30b153babd0a9eafe864aa4c8b6bc59546449c96e7f3aa25a038a5475a3cb91cac418c6d8d2cd6e7f3a61b7a5df82d6b3a5b5b93ac64f05f88b2105eb7b24e79cf1939c73c6c19c73c65064411cdcfb31939c73c6c19cf3fd9cf5939c73c6b7e3bf50302e332d9873cef849bef7e29c73cef9628dd515beaac62e9ba10841b0c293c98e264c726e94ae50c9698273790a510bcefd6e92ef2d3bd9fb6fb79b122c7a280609174b104d22025d307877e38f2114dc9d89c90e263c4c4e346e52048582480c454070d520990108082e1e0b435ae00587a615a3148641126479bbdd48903b678406a17e7f54e203832b82c34736b383098fde0404950e931d4d4050352973137d7b7e9cae01117ee3dd01758cbc20098c6fd8092d26c78fd624f3300a405cf4fb4199000c21a141a689c6bd03dbd34ece9e9d4204c5d94b0108b65816b9d1a2db6210bbf2cdba4c91da6448bc2af70ed2dbedd6c77ed555905649dc9ed5db44e79cb5be97847b6d60c414df7b3f0454a3a89b39be27ad2f3e81627e8229a6f74f23ee7d8d6f085b885770ef04d4de1bfb4dd6ce847ce83ff140e35bb5f4e95c9ad24bc55a6b8139e7d2f2b4c8170513b264c992a5a3eedb13cc0bee1d81c26f734a16a97d5bd9ef08a84bb422ec15ab45cbb57f39c097981fc522dcdd2dfa2089d56a066e56ed2562d5763b16426350985ac0e8b0b3c30503cc0e37483b472cdc0ca5f62d5984d9c1943350137ae8bd6a2aa3695d03eeb2032e69903b140921613884cb110f00c9fa2f868b9246cfff28ac9800011013c4195bca6e7f314820c15b6089c609447c2ab8402447d2911d32f8181e490a923094446315167e317e50521821f2801974395680a4248b0a66c0c39772468c5b03ba3049228ee08348099624bda0a2a30524c061d465c83641cf6f92c11b81a5fec1d042d3ed0f860c1dedf60723d8c2deff012758a0a002156cbc20b7a20a09396660c147cf061268ca1b4df46f08c86fc8c86fa8088e1862b8b99e64edb5d6da7c4dbc0ade650dddcde597b5e59cb32dedced6199de45ea4939cab74a2c1699af40c8a991639e76cb3d65a9b73ce59f54739e33ef304e67b94ad540c4ba63c716c52867d9548cada4a2727a728e5e3b4601e4797beb53a45a9dca473a94ec59da29c38d2f1c451de7bc71d9d13c78963ebdc23bd7c4a7a33dac383633db20dec93931d1b652252b0f6eabf36bf914c9aba5ea5723d07f4bdf72ed92d502093a67aefbc9f261b756e54aa0d6459634caa32323343d26bd512f3c079ef9cb31eb1a9d43adf5bd7aad61b5f9b73cf30a0c8a4a9eb552a97cc458e277aa3926d80671bc876c86a5cedb3225a9b1c7fdde620a4eb83fc1453c8b3816606061ee44e78139a191c9628718166a605af52b100aa200523599a272fa647e6ac77abff05d25c5ff302e51f68d679b980382f29410573026f9482acebc58a00ecc22730cf3e00fec3000310b86f1f2000af8f5d78fd605daebdf7fef081d63608820f7cb8a73e75b0d51c7de2cc9ad4276aee8c269d4966d22ecaa50fad3725571947b2248bca561f79ab5bbcd258c25bc24b4a4a5255a9a2f738be4ab5049300252929a9044c3a8e50729025598ee39725b98407850555745072dc7bf1d8839255589b64b5519126f788ab90452692253c28178ffbb7ce4b7878c9844a5f4ee87916b5ca2454d2cbe90553d289770e7ced12de7324fcc8097edcc78d7013f012f0229c0827011fc27bbc05ce021f015fe22bdc7b93b808b810aec493b80a3c0807c27ff0143812e77114f809f75e1ef7c17b701e7c07d7c18fb8110fc10e23c9955c1d635348a6da8652caf75e9db1169d974beb1bf83269c1ca8d113cf081b7b9dea9ce781cf7fe530748256f858c61ec5a2574dbd5756cf66466e4763b9076200509124465c54ad62359062183dccc648598eb0326359972cee55892e84d4d6eda2eaa1ae034cfa37307d2931ad6ca4672d456c61b24393e599273d6642fe3274b4493d109dc75dbe6018bfc098f7823e318f79875a9adec1b2692bc0389bc5ac5d65997e38d7d730ada6fbb7dcc3b90acec1e79a266f97a687966a441ce202a5a7e15c0830f3880e20ae2dabd8d33177c7720d91d48cf73701cfc062fe23b6e83d7e03438119fc165f021aee331380c6e027fc15df0169c05cff112d2fbd68a90e9fc03dc037c052781abe029388ea348eff313e97dcb4730955c889be01de025f8edbb7c0c1e06a3911c59be9967e72ecf509d9830c4149e70c894971c8f54637a2fb98ebf444f209dca652127625149d4bd5d493c112f0a745eae14f06653039449ecb8d4a85d49d43d93a89b68207e710a53d39ebe2ce3db39abb2b2bc795ba9db3f7d798680d3d74f29560a5e6d6794338a156177b12cd354a5423b02664ea4425d62a6840ffa49f3d4412b62b422f65b3b443fe9f6b4a60aa5cbbc6277ef9ac4de1561fb7691dda39d23ce35628824599a271662c6149d88b75463762762c76f8ead4ef2560cf106eb4605155450d1cc94ae3ccbeacdbd216d486d3eb5dac59747ba95f26cfbf28cdc49ddf6da18e8aaa05241a5f3166e611361c79ff672f67947dd6ede3904cd9d43d05c3e0193da915cb16b7bc58de1929f3db0eb9e471ce09b23c77e815ff8776efc51d596a8d4bd58716b9b858b0fe47240598b628d3aca77e74e1de4dbb398e620da6d1833bafd3d646bfbc58d61d4519e6d1d7ee1df3ad451c75b875a422de1d5865a01b582f93b7574ac3b8bbeaddbbb4db45fdcda1eda33368cad43f5b48ed44df7ac84bb2f40ad44d4edef173a930517ddfe66616be6d28de1d31521ddbe003b3e117be46822318b2cdd9a39c4c6f09b444c16bad93b057b3d752be1e49579b65f67d25aab7919e31ea81cba519cb9d3ec599e73b7511b6c30ee57f102c4402b62cc40f610336802f10bbf09348b9845f06a338974222f25f6a8bedc4c24a6cf2c629a4bf0cc5c6202f30b70142193e99e1571735644d649803ffe38de601756c9c8e4e0177e14befc51eeddbd1a6793aca7aa7db4791bc856da4bbbb7775684e9ad2d44926e5f03ad08f4edbda12178a86a0a5b30bcccaf92bc9bb797f0ee615791edcb5b6905e9fd2a6e816c4e6e54f3268de781d4f622ec2fc201ecf20c15bc75db8bf0a8e3fb22e4657e6d3d6a1999542a151303e208bb40f4c02e3ca4f1401c75fcb41e5e6da8218d47034253a22da18625396e15b7403d1acc80a12204d8e91bb4951bd339ec1476d544ecc2383679b67a1bf339f09a0aa18f2ab235fdf6378e6d54d4a2bb92aba1b86ffd49123bd3c524fbc2f6f5103bdbbcfcc24f442f75fb5a885df7e995b6cf6596a916eb466bdd6fdb845a0ef0b86d4c2937660ab1cb94c1baf09b523a3687a7d1b93b79e78f58cce5fa57a9d2f454c202c02d75c44ae438a4fa6d2bd19462ca600acd17cce16974eece1f270f78c63873e779338be6f05496a7114636cf8d6c72d0211d15110d099fe8543821640e17fcc28f9a17d5640ea97e98986e72a3d697ade742ff1ffe840c487ddeb3d4d3eb21d2e38ba188dd62b9988bbf674c375c891ff8aa830d007e95af596c882b560045eccae517fe10fa6bf8d2add5a6f41091d2d3c36bed890c3d4b3d87eb298aa1d0c56e7956631173b12296c36b2d05b0c7d7e34b7b7c3dbe1e1d3dbe98ee34aafacd47303131b2986c7ef902be94bc823a3174723a3b1d1c1e686664523a472f252fe02ba8134327a7834367e7e1157c055fc1577048fa0aea1c9965e6c398d28514f5a9d3015a9d2c9f036c2a536fb26e2c132c1ccb08abc702b294a8ae874b7367aeccbdaca045b14cb06e2c1ccb08abc752c202aa58380f2c1c0bc7c20d493b0bc70aa6ccb286b843a535c494a974925e99f165582f836a71211ffa85d087198335526a6048c5b24d95d60cf10bab3554b0eb84d4b6d650e9f857629ed95a110bd1f2d4046fad76a506062b3552f05aab21878e3f15e4edcc175ff9e2cb2fbe98175faae6c0d72b36867fd429a4369a9bd2f8644a17d27366c685f44475473d07f8a5860bf940fd8912c804d9a54b17201f192091f6f2338c10460698618c51cc8de1c5fcb0aefb37e62a6f8c52bf570d72be62c121947d5c8938a4e750062b3042bcd66ab02efc3c1dcc30cf6a4831464731bb3cab15c5fc208ae1e1b53624ecf869545bacdb608633aacdd56d30431998614ab5a9ba0d6638046608335475db4a54eac4b578cbafda2ed86db3a3b598f97a65a7cbadc0dd562e2b16ec42e514f7d1c95db81c4dcdd39c0ea0fbfecc4f9ce7acc21bbb376e7af101bb6dc69b95b031fc387c76b4e3335d7ecd5ecc7233dc4c6876b33c6b71c562a2e35f85b7b65e597358855b5d899607486a7bf1bde8722f3426131561d0f260b536cc2f6c539b6263527aed890c37f41ccef2e0221d0bfb5ad1535817d06827a488a4a35c89a79ce2cd29a2af8b43235dc4d998d4dace6777f3d9952ea43a65437373e2ad9e9faf44be72b1797b3240acc3a86b5147058bb7786a83c37a536bec2637b2f91467a9a51521e3a753cd297ec831b16c5a35ac2f596ac962dda02cd6cd7873a37506b79ce26ad4d931e1707dbb01659eea2637c279b4e64b9cd7566ead46ca8d69225ed720d639d8758d625d585be92fbe243b5b69b02f5e9eadc21a2ad8b589d8b58686980b7ddb177531a7e883f321f2d1719f9ccf0aee7343f11a975a91d7883c0324521f123a7e9f143686ffe6a40012c8c4ed0284f335526eada6c5c6d628587a10afb52bd6856b5b3a7eb3464a4da976c46b3b5f9ed584d8170d3c619ed574d8170db51c3554f05a2bb22efcb8368c4de9f8c927e9f8d7f1df175f6d48aedbbee3f095d8e26b91c56737dcc900645f893dd215cf363907e0c894b9c973727d96260f347aef1d0dcdccd5a3265fcbc8a452a9989ce2881c2ed8857d37a4b6959853ecf86737bcda5e7c2b71c5b216572ef9c5b775ce07953f4e8bb50139ee94ce2a7c6dcdd909b0ebf6030750113c6006d8406df9f1cd39e77cadb5d6f6203189537ded789168bd937692cefaca406d0e901d2d90c640d7060e092d23b7448d2bfda60533fc6a48f9d558f26375591ae157e3041cdcaf068e1b197e3564b49efc6a788085e24723063458e0228765839323307a3f1a3d8ab6fc6898d0e4474305eb851f8d122ef811c1f0238a62f4234a4264a475c38f6829c58fc8c78f68771303d18b188850b068a469961b2ba907e10994d4f8cde8b560fc660029facdd0a1e23783e83783c54f46979f0c2b3f194a7e328e74db1753996e7f3292ba2db5b1e326cb4f060d960e3f19284af80de190c26fa8ca6f088a08236831e3b725c90e47324808818123860856a480028729e5472138e8c241b157b443508cf049e123b4d1f1e36039578ff9a4f011ca6a596ac41ab1d6a5e446b312b3a02e6ad0659b87ec07ac07451224cc2f3c2b314b71239c0ae80a9d78201f302aaa4dd3fba05163684ea971e33c4f5554ea14436332517d69b811cfc770a39ed7dc085702f13c0c8f9aea51613646981a2c1bd2f1c38e5e1ab8621e7cab0b8ef8f4b8c365d6e100861df7d62c1d3f7a0053e6196c609e79e0cbafcc735200cd8eea812fcf60c1fe401fac47d361b912525b08a5104a08e8c094b9da93f977f34b6eb4a3f6a499e3f4f0f093cb8696a7865c8c14b910257059cb2d5f395214067d54a6487902fcd9d710eb2ad29576382c975ff87b384c97417058061cc6b33d32fc22ebe1950a9ed9cc733280d9b5ca0383c17612f08129739b1e1e0598b8d1ce8edad3c3332ea0a7878787e734c20324453c007ae0839d4604115528c4abaf0d5e073ca0e446423a0f7b121644cc2f1e760d5ac1baf0af414af8875d83885817fea01e7605a920c817140c8a529669aab269609198efe1717808650869dfcf7908aabe5fe521943d7d94870bf9385102f13c8c0b9d283f3c09555773ce9f70e1fc63e076e9fc7b54658dcdcd8ad5cae1b01c8c85e5c1ff81c35a70980bcb839f73d80b0e33c1f2e0c7e130181c1683c374371c36c461326c386c068711591e1a96077fc96135603cb01cb01008a087c37838cc867de1878dfdf2fdb09c0dd9152bd32223ca667888173cc40e0f810b2114e226e3825d366693e9d0f19b5b3a86d964596443ec0bffaf4c923e514d19c69029591e990ce5b2a0159694f02a13625d4480f4f02a43b22e15d8a38ef34c56141445461414c4ab6c08d775b80ffd3cb29e09a9cd1e81e53afe20619e8530b2f6c88bbbb8cd2f0d38880c42ec32a6d942a0d0f10db18380599211302560ba5c1adce48c5b030d409c4604f97c7aeba020629ea5587564dc1964909393f381fb4e233c40721a1144c421b5c172be8e1fb6c3abcd1e21769c7b01d3c188f06a03811644fc0f0ea0f23082a6003332a91818016c1000008490c57a28408efb83ce2fa049840ff8b27082d056ee80654b91b5ba49c5b46054a61485c291161d6edf5a503ae27b51dac03f4d7485aed0d56aa5b1dc9a69c5249a3958e9d82c9e4927efec9d44622ed79b45b378fa6c541a8fc6a3f14c2b660e26d1bcc12c9e492791b3973b8dced3d75f40f4405746ab2dfbb61b62b149103d6c4eb3c5855a1fc3122bc6b698b29bac059992cc273b92616e57062c69416c00f03fa725d910485600f863802d95c60371148bc5b0c86432992c27bbc1c86e256eb29bec26b34953d3cd3bb71d133bb81d233bbd1de08e129a1999f2dc09ee98d8b9ede0768cecf47694ec00697670333b38991d5cb9833b77703bb89d60fe907ed0a5e9f966eba8c5c3baf0b7782d17d8576b985b45dcdaf2aa14e766d3168fd6518bd772416bd8dad22a7a68f1685abc99164fa6c56bf15a3c9cdb89646377a54b57ba9ad2c6f431b795d00a4549d3d1669c664ead72a8ba5a41e3ad5674fc349e12109ee559dd6eed07c9c650fce8f8d1f19737a2f034730a463521690f440f44d47451d38b8a0bf9b869ea865d2913d6853f854b1949f552c094921999f24c0583405095c6438f4cf4e837bcfee8b02efcc4600a97673e5752467c86a95e9ef94c4929f1919202e2d5e7c9cfaee39f49e16452b832854be14aa470295c9a0a769e928f9036ec5889d37e581e24611088c4d75ba201c1ae0be2087d29a52a1c1cdaeec6ee0d07450d694494d386d8d850480be6176d090d48f3d18af42c0f4d89068446a4e3a7ed6e8d8644fb41dbd178a8212aa6881adae4d8e92c0f567f8ef20baf7e8a6c8ca8ff0ce1d8a1037d96074f0926b12f24fd675db914257cb4f85cf1a9e105c4d14ae661b56f47281cad7c843f421aef47f8c25b3db7388d475be2349f5913a3d2946a6c6c70587f42551047ea07538d8d4d8d7a73b31a41dcdcac56abd308103d6e80e08138b251a3bc744cac931bb1dea47a5363b9b5955011af34dd16bbd2669c58f20c356cc1ce6846b4dd6ac511bbae4a30f70d3fbe8138faf1f11f29fca7c57f80f9f58344c57f7a3f4b3f4a3fbc9f231dffcf6fc5fa95d0adfd08a1cdf80142d3e1f507e967858eff5c09f9147d8627ee23440df3cc470bcdc88748dbe5994f0dab127ca8ac56e0d567cacf51c76fa2863f45a8e1cf50c76f420d7f5874fc286af8930255a2e31feaba4dd5693c9a520da7f55634decd6a831df43461280f7a9a3d0197afa834ac37f9b884464802102000f3160000180c060684e2d12c4aa22067ea0314800e5a844a684e4092c843c15890822008a2188641180000420c33c620a31863ee0a000a6473d0439d8801be4539a178089395a0f6897599018cf1b38210904660958c99d8a67c3bc5b1e64c8c3b320b4ede4b36070730a57aa25a82abc3b566a5168d2b861093f69700e0464ac8471d7a2354e0daec09633fea6aef8ced08627c7f897aef940b79b5086d6f2751ba8392a4e5342fbe3bd0d1100d1ce4a86ccf2a7f7523f71ca25e851b15d5d8d7f9bd488e473e3d1ce92795a28d89abd963aa2455095c552890bc1a67b290b9ffe4c1bd7b250811f68d0791969b1792d6bb07b050062ccd16ed50555c7c225c264b133c9beb80b6a21606eacf7b91cd3a3c7498b8f86a99af9b10aa869e3f099bce9b01d2e5fa9a60e58b082ea28dd4d28f6f64ef5b9450e78d0d6156e080f0262a9e824c440d1fe70ffc5ffe30353924d9ee271591a7e8c484b84e0816f0a0cd26bf5114236ef9bc7bc6d61c8212a29fff4114162497e9b7bdeea8c4711b38389840dcb6a6b4c7bf39f34345788a7d77cd40304c61ae9e1206fca513590fc1e1ea5b7643e946d6a2d19f36a2d4745bcb07c027998ed5d6db305d6d3a141cbf778e4c997b1d7f3dbad84cc5eb6dd41606303a1caf3a95896766a2507a80da72b9b174860b798f7e12a0bd4133f483538fc195999737f83474af3b4258e55e729c858e48091a90ad323396112a32452381c0db2b81bc9cab63321fc96264525a1790d8ef1ba4133b7906fa8729148a6cb8ac7d9cd4cc1d7480d6ab1da17d25114f0aa186758342f2667df627a9e70d35798645149e39e43460ccaa24839ff811497bbcb1222ed6e261ca21b8bee7beaffb4cd6bd71f9babbb5e467b815622c5314f10ccf8a11a54076baa438492023b79df8fbc52636566df7eb0cc00e60df63753758ccae945fea2296ebc61479e87acf48569d358f05d7254b1121a6ad7a64ce5f9801ed6641bdc369d84b9ea14f87c23a114604b8d11070e24cad02a9efab148aef0173aa233446c0871b3e9f3d07c408261fb29463405c758aa0407a949f2a5686393dea178caddbf72b3707a81d25659862e163070d2e423209648cccf58e7a4e686f71ba26678fbff99583aeff3582512233c1ecebf26661e5c93a8bd25e6e6bea4083d9b15331b7df24f01620907cf7544efb10b6597564733566d72692b01e770011ee192ffb83abddad37797bc9f6242ae386553f695ed9f358d50a0e34be691f58519546535cedd267585e7c2cba1043768447937cb756ea72f16b7459daa32b276901fa002ba8e206b933e98b54c2fed6b5f98716063a6a39021f53db4b9dda3028f556fb9ba4f51dfbead64597819c3781969c1570258e5462d8b201691c0c61baad92dd28d77f080ef18c6eb5c54e28f6561d057744c541eaf6a8cb2debf86872df299cd3474e26ee327f1424988d05d203c178ba3b54472126d324f6e266a5016758ce1d51b99d3d83e58d077ca83c872b85b5fddad5ffc66b713ea91de1b8893548f33c667e45cafd51b0d489afd2b656c9663bf5eb93014be657a6737c65b3d9b3d69f747e9d01d51cb526c6842ea54b90b8cad916a49d11234ac4fa6b602c518c2dd4abb3138e424bc5da7d18d87223fbef20bfa7c99a910f43f7688808b05b6b0fd646c25b73f1ca8600831f5cefa9cf17ce040dffdf60c5f58da1dec7ac277457bbdb19578f8cad2b12608a381a9d3386d2e74e1c5b210d3b980463bc7cf4db6803db5943074cf9adab6ec48ed72d5e41bdd7dfec0e8346b129326ba90852b9f2a9d5403015594f60afb99e098259faea5cd5ea9128e2ae83b9d873b08bf1b30ebf5e72069469cc8c5a9c333a50f7f996bbe45cbc070697ab4aa06110ea013bab59df1fbc484b403efd56e619da48cc1b7c23443e568c7fa489fd37e2f656c13a1c5e4e7e2da08b4314bae9cce5f7001430881ecf79ec943e7d74d55ff990a5bcf852c1ac49e975bb4b5f14ac9b87036558f6f93f728b54184681ab42cf48cb14a577d01dc1e633a98e4d82b9916cdb70adba89a8e2129246306c4377085f285d49d7a5b356d5fd82b2c04784936a8dd7b14f0349185f2ac9cd2109db7528f2f2d347a4c9042997602374d7f2601644ce2272b03a2d1c30bcf713ff7c87b403e69da790de42d9a5a73f5008327c8321b0c0bcc03b30d6f068067200fbb7c7b8573eeb84cd1d6527244d82b0a779af42ded7b8bb5b47ec2b9d2b29c628a53812e6e5af7d56ec63d927b2240bc835db1dd3cc7c4a898f2482d68ce7e2f2f98051099bedc801d102ce71df4e4b6d338cdfb4b361ed3baa80e8f065e1bd422c54ec90afa0e76458f1512866db21538c78f28045e23d21dc1ed12e076bc59cceed615d753a97b026611fb4e80718df0a732c1893303768c72f32647bb68d1da82e10a64d0585b32bf5b6b163e79a04db2b87588d185c4cc036098336a56bca20eaeeea5e9a11bfd9473297c2b34a9442358c7bbf0f23b95edc7bb4d803f0e24d903be904c92922e8cd2741e671576461ee4e43d054738d9c2027560dbc2210cf978471b39c143dc7724e0968e2d89728b62900471646a9f93440ebe401ba4638ed622c5f1676c67d06ac5508dde9a7fac45b6ea00bdf05be340e96da1475e9418569531837bbcca83cb5f73328399777c5121476c43b301a81b8899c8774c8824723ca0b9acc3bd5e90e2487cac8ffeb3538243a7e9d248774e7d7a5b40790ee54a8424c466a6544fb1fc941cee108e0c0635d9ae4f6e6fd06c35a81097cc553384703af4ab2fe250c6c7ff912d41165c15913b6ebe6356200b0b0c976270b0c5350d1115437b6f361d18e3409fa0e319712da663c81219c4b54cb48cfb34977a522a44eb884cedf54c3e25e127140d530cbcfa283ada0956cf6a906840a28cfe5e4721948f00f2d4c9420840ffd7f98d535b77cd730eb501fdd119790d630589dcc44cc5ded5d3bb80e29043529cc4ed83ec9af6361af4a009a47709bb857f43e1d99d26af262ffed458de0c3f279e9e0c21cb1a7291720b10b975acfd56288bd404ffcc14cdfc69771352cf61987273159df654558885cf2257ac6d48e908dd9b271a2baab81cf5f8ac4710f55f5f6e8879b0828e471596987c8fd6318ab8e2b3ae457f94293ec36d1d0932382d3bc6932b2415c4997188f6dbabe579b5f73affca0b606a0d742abac7bb2c4baca457d6cd4588a5b923e41d6a1a28d42eec221f75f7e570628f35c3fa07f7edd393e0aa058d82ec832a022794b9efd93c433439b20c82268d57013dc889c29f7bc20cb779957a12b051128a44804d95dc9cf05af31544e98304f7f6db171ba9280f32c378c32842083a928ca9b3c7b3d8d039149c3f68c3e6794d9006fbe63e4fe44d07f5c30eb8d7d39f03c9cd810f09282ae3bce0941668ec7c87f516b49c80fd2272df1869f7170f2f5a053847d6868d6a251bf4e166427dbe5b4880c0f4c909d284e9acd8176d46b01795e8319a6c8da76d0ef9d179922bb0cf93835e9f45884b25f2bf5a64e98e2677a6907fac96bbb26da3a72a66527bb50159e5a5949d36fc5180e005b8220bcbdc8fef35f8ecb628c6ef6f7335033e59f3c10fc50f9c542f3f4d96c2f8d0907045724b2c47f2d8d3fba9565387a6443ecaf2c40f680f6ab4b267efab4b28429f7ebb4869127d2aeaa7bf453fd177a4efda3caa4cc035647ea0e16349e88f0b2c24031b31eefdf9effd841d4f02d3e1e716163f892242b22a73b1d4cda9caec6bfeccbed238cc604de537b863ce64f87746722eda121152600405a5c2ae02e9c8ff3d058a8725829fafa30855a30ce99d5c23edda31f1d4f9383589355dba142648b82fcc2cfa1d9687bacbc3d5308c2baf701218c185710bc2c72995e58694e6223e996b54b354f02c160959a143c216712269cb08ce7d5ad86c908846378bca7601ea57a85fda884446ee6c12a7c7ba67edc9a854db0866238a2329a8a174b53e2a9e86deceb1180cbbc3a57c31052e325230caeb3f533fde33955a5431a16d7d601f2763fffb32905c932ff517e8bd1733d91c6fdea3ebef4f77ec3dd484d4350b4d53620e7c5c68228b6a3831e7691a04a6a1eb0a251347c1a762d9692fdef80d2456f7852fee06a7abeb5b63aaa1aeb24b8ad663b83cd54a9a7522f132e55a271e25ad0b0b475c8d60dcf7594613d0756c743fbb3eeb34d093c210423e2cb3eb3bf7c0610387c4e534ab25702eb83698dabda8cf3cf486ff25995b03a33e217494cf3e48fe69ffef5c2d7c9761d2c433204a275dde00a2c0091f9fbf86baa39c9efd760a1f1f9f62a7a717840c998ffe54d574a65eab6b5a6900948a822cc804b03dd191608868400dd2d6baf0c53075a6a75fb317bc9fab9c425401c45199c50ca977ce6cdf2fcae45f4dfad9b04c709fdaa1084e3d17fb9e2fc259c6da84f2cb40f581748913ad5847d222ad96ab11c7e2baa781e7e1ad37cbc6c9acfd48cbeddcd8c92ccd2b3d80abed6b2c9758c1d4db30fb481ff3f9549275ae349690b9beca3a0ed83fbd33a98aa4be25f773b62430241a9e165fd018a6d4566cefe4cbb54ac201d83e874003cd94a0be2c69e784627dafc2d6f80bfba0b33cdf40884cbd6e3142b383bb3e4808c5bc6c1628cf8df9171712741e8368428b40105a33eb098deaf4b16c5cc051d04ae500ff66cd951ccc501f0017763d56e64e1255202cf300acb201ea3143074933f6c85f3b02712cc834144b2fd12b77621da1fff5de7b41c0eccbc28d823eb1960cfe75beebde39d8675f69bb25d4fbbedd26c522cec429d170c3186188eb504106bf4295d07716836460a1d7553945880bdd7fbe40594c874f8a74cf7e5379109ed925103fdf31256caefbaef3a3cb8b333ac8dd5a79649c2d56527da1e25b7394eaa98102dfb814ef99ec77191bee539c2937e44a984d1202bb7d28115cb050b71fd00fc7a8df3cc675bb4289b9cac9e2f25635d9b7e3eb16749bc2e14f0aa8f57a4703dbbd15f20110a5e311a10e2b22f55c81e11aa8f267aa8f0214947e262e2c242a2385fb081cd51b5cd30bca05a2078afcd16dd19d7496c3c201e7521645e1e66a58711fc3f6d1a495c4de548442854801c036b4f7d5f8ece72a09a2c4713fca464dd76cfb5f2a09698ae258acd297d43280b12027cda0f491d9e7e0f06a9ccfecab4f2236c447521d1cc9452234f9b9d0e6aa21552db56414ef5a611071f40422569b20a13ec6096390874d113ce89cabcdb7f340961e6bcdde2043e17e6d5636980bce630f451b7a55f16fede569b8e36a449c118583abf13d892353a8c4b8b6a0b76dae586c587fdee83880c6bc54aa32f06a9859fe07dc22a78945cc1343afb0375328bf47308e4563660e25a9e504fe5c35335431b83237e60c401aadec11f876de9307cee6c66216f3c324ce8177266c2c8f3cf83eef9cb95e15879d2368c93ef41fe6c582988208c0d1357285bf6a4ba3337ea49b8a3d9e1831409c2b5122e87b002b7e0d4bdb03362037d8418ebdc821f3ee4c298413f6aeef047aeb53a7875565ece4daa7c604cb018aba3848b0f59dd232b46ba1d6d4b92d5aa8c0cf3d83d0d35d263b9de64fd7ee3a7dd456e6dcfd425ac4d95decef7c4615ac94ab8298c2149cfc3f924dcbcd25dc1636d4c47d160b9c85ab6f54d7d92754ad21903c41b3eb80418187e6d7e077e0fb781f1830ffc2dc809b1069ab41e6f9ad9c60fcb6a753277a7b625f553e6f3be517edaf01d11d6a021dc21112bda9998abce4206519f495e59c5762494f4cba5d6fb38a69d78e3f096a30f3c0dcea2b6d3fcb58dd22a2318f70b2da98c96be6b4b572e951ecc4614da8b3a81ae85d28f580a68ca163cb9b2b7927e8cadfe93ce873c8a0e6bcb4dd3e01b7c67d5c1890c8d0032b717e91f10f975847dd600d30398a1e8c3fc39b6522ac4c418ee0f215cfdf509c3e84130bc34648db169bbcfd4037730b259825743d672e8c9cda3159fc5ec06bb3844754c6c7a5496b89169dfb8dee76d613ceea157303a97f379017543dc8149eff336defebacae9a148d12b91da72d0dd6fdd6bef165c86ed93f5243856905a4ef3485b398976d048fa74dd913ddd25761b33f7fe27291097e766a1b9337608e4f82cc3a99115ec633784f72680b5b8ae0659b938ad7052e9dc1e95bc5c9886ee1f2cfcf50911aa2141d6fd7d9577203c8fffd2ba78de1d00528bead0bf18cd256f5a27cc355a136a4555c389629d2a44e301dc4adaeb1a5c023bb40fcb3509ecb641966dc10cfed7171907debf1c2ca66ada8146b9642d70b794909cb8e9e8dd69e95d2a02b16568c658cd0635e91f180b354c5efb830e07220217e61a8a7dc0246ed46b12bede1bc0c118f547cced5a49e7e4c0aa594746d76e5ed12d35d6f332f86dcf987757cc4b43129438fd390cdd75bae09bd05000423ece675dc4eeb0c16f9e7808967f29c28618bf057b081de9126d618b7d07d5d3f944d02ab7bcd3c70cd2720afda4ce7b5a18cc4b300e2359dd643724f3cb7a421aa72b80ba5c5119315fc13eac985a2f3a5784c961e4c2cf7d635a81778bfd1ee74a2d288a70ae193f7eb80308a3c2b10ae0703228153a34126f5e1957934bfe12da228a52e1d21434811d4ec3dcdf16384d79528ec88a1473fd0e2c2c38fd1a8eb207773be6c6a1d6484ec94b26e29a97b3914bf7414f84770d31a5a385d4aec592f494fd1a43bf7f481e8fdd71f0d86798d046c848bf2d83ed6e2f3f91e503b241a417185588d9c422020700b4b257a4eb4e91f77be48fd2de30fd070d82abb7e8715f33d022ee268f52a2f459cea68465d7780088312d132adf3235898bc897861424498970f5b65ff7a59b68e85fe96369c848ca3e26ef0890c5dddf76b0f680ce7fc71ab62dc80965a71877b412003c95e37332f0686921353d8763900d576f0bbcdbba62271f558d5da61ea7ef538d3dfc90bbb64846c0c3b451383b16390b8ec0d5dbfa07537bb4d40487c28f8fdb3d3dddf2409345bc29b43114b11d5e93b87ab37fdec7a577028fb3ff8982a5baf9865d01abedeb847767b14c4bd481aaf7ff8663bf9034f5519494480e58733c6d17eba1fcb3adc750a5a0085768f5670e046ff722112320cdc01f14d1ae822d2308484c70f98ef65b740a336392ea611c24ffa783abd02daa56db08a242e3b5516534ca44291e8e0e9830dd3c667d2a17c436512adde24ec3eee652bf4e64ec322c66e1f9e7e533852023588bc69df3721dfbd4cd4efe3e7de4bdcbbc5cab5d6b8ea76d350afab1ce4dd0e8a753dcc2d896dd91b1cd0b5459aebe859d0e14a2e168b8c91c77e9a86600e1ecc94d4324047697ab5e426497f9f16edde4b41a2317761ad88d31a76f18d4d41c6a7bdc26afb5125cc6c27cd11db11f02454f08b1d9f167757992c8a666b9a36bc5f017f474b7cbc941fbee68fef03748a9619f2926ea60c2301148cc83692653dbe54e0db37f97d2697125dc318af8ff30250d2f849308a102cbfc3f41699c5d82ed720587e98711e72a5803e5f4ad6d9b8037d4c932a785b61c87d7aac949246e187caef1aab95c289eab29900b5e2761ec853847b0379c97cb39bd0ea3e52ef4c6533e8460d14517182190b15baab4d224af6cac181079715ab95cabccbba32880c204325dc2908031cb3170b16d345c8e9cc5c2362ba4ef7864e17298849f3c5180ab9da5399b6b66928952aecc78709e047f13cb88cce428f4ed96a4b59f708c19cca54e07ddb7bcace15ef83b75398d0c79220d7d2a3ba70c904a131343242e671d46e97e9e824780b2284080cb2153f898157dcbd1cab791ffcd7313f00eadb9bfa9a6d6c1302c474c67df4dde468fef9ecbfa68a4b704df1ec2b0067fbc354e653b1c2032b5a8f65822576d883560433ca0336ef2c3949abef39c60edfd5272348c7421543b2bb7b66fb93f111946ba506b19b1251ec01cb341b538776f39a9e2df2fc5498696ba94856293f0979fc5844aebd52430e44f8b824599dd38ca875aec836ae6a53690f68e010e134e20331a78c43f43d5008b61f6b430ab524b58a2e93ac1f5b76cd4763338c56ca207f1c0a1b20d5b2886c835ba3dbafbfde82bb3be23849475c8e9324deb4186fdd88764997d65aeee61bbe1bfae3e41bcb73d95c6830fa135b24b40bfe2e06ca85c1ad51f637ec1260bbad2615e6eb7244ec09dd97d692da504c41cf83f9fd70ac5585f900aec2be75e1afc48ceee8c2505c9aac54ebd130ca47ae548e5f5abf8735b0d06543b488b8bfd0c38040231dc581a4adcb99379a6b0178652cd9f38e27378c09765696b583f5a47fcf692643782b3c238c5b9aace91b46fe2cec187e8a8fbe8a865ebc27d1061f599c5eddcae42fb83d113a0d501e99f854ad3f907f43a0c6dcfe37060699926caea0ec57ee18f17b61f5c2712c30cf0ad111748797d1125d682976b75f5ddb2b5392ad27dcc36444c96925f3a1df4a59daea707f69f2422fcb162a2d4cb28ee3c2f9a814e238f8469db88bf5766f968af20e5806827c1485a184f451479190530a4e6e24cb2dbd8da15596359a9cf4331716dc55667b1b547a4354421e2946f63993d3bbc04ea1cf19c2f2d3e4b904dfba64aff3d224ed02f4d0d7abcaf20e783c66c3928c7f2a20d9a26a720585ce0a89f25070336926468c7179b98bec2c64dae2595d9b3a20d2c0684c99b387a125d391abc72c65bfb5b0f4bce4ddad74649793aa8ef7751f6c0285fa19f7a52dc7e4b8d1ec88b9d614d6632b689486659475dcaaf0cad79d1be05fba1087e7a319de2f725a1396af48424c5fbd745cdc8459de0c24e067b75fba2893b3fa375ac2c35d394ba75dc0779ab0a03632a84f1014bcc871a44616e3440f27b999e1e600c7e93b11c1c9f7a608f0fd8d2306904a6b1bd2ae696befa92a904dc8ccdf8c0f46c1e1e30a564ea0e147e7daf36cd185c941fd12d4e8494e1b901776b552b8deb91abf9616f9b2234918013c345e35cc59de04cc5bc0bdc3af24d998aecb2496561157e2e25c166842493a6228543688416210268a57ad3c06f69d7d526d2b63bdfbb2cadf03938b2957a6415ddbce802c38fc89416642e1cc464d27751033ece7e3f24347bf5a041c86f3b93c7bae1de06ddb3a41005ad5dd6b51b032eb44e052bd86467d4835a6cfdbcd8168c332be70be526a4c4e5938c9bc12403769b195dc9643ae1654d0f14c58c56c2513fbc32b462c01f01c55dab6384b94bdec6feba6b8da7c46cbe2591be31a02b02d7fec2edc624a2b481a961494ee53589a73b15d525260623d7dd8226745959d273b70e17ce7a4bde1d1918fb333c2327542b76cf4494af598e7091860caf6719af34d802b5e560de0280b06649d2c96b892b77b0c55bfa024cd9dbce4e23c75b240595706db125c710addc6d0d02ba5a204f28481d051362eb580602bf079d120dc5bc008978cba52e777132b6732753f265ea605b8ca2547d6647edf8d1db9a1347e894bbece30222f83a1886a8eb60241a85748b399786a9e054eebc7e53a542a9c8c13bc7bcb28c91f90f64cd4690067e9597dfe1bb559e616b135b6040de279778d28381b1d7228b1ddd0adf51f525958dbbca75445c9f849201481182af7e476f811761af92dbf4b8701e9c254dd263cd4e0bd451bac3ea683a3118b88c8a64e372343cfa194eda40175821261af4a2445028fa55c6d4d2794f2a3c49e0072465e002a4adb443dbbf3087df87733d767f85366b22a60f23d7bc5b34188c1ae888be1818f70d7470f1803845f7dbca29167046dcf14a936360dbb84eb3ce50104835390f14f7c6eac66807aa12af06f4a2c3f7e9e034225287e4f4a240f0aec090e8240b36d96008221530a286c2ff3243893ca31267d7a5b40a8280d184b9e6e9298b60be71b385efc91ae38d9546906265705b2973a9d0ef70733fd4f3388e657adebd44b97b8604dd4c4fc0bd691c88ad8b1c89c239fe6f21a0019107ef02fcb56ce720ec042f751a5a4660baf9526262950145feea03963d87e6c8cca5b17e09254403f1d0296c0bc197f20aa88ae2dec57b1f4e409a48e705c9a802422975f76c79c7fe13844349621b0d81a2482b39405bab3e0c097ab8c33470864ced4fc053264824b088958d107353b24e2865aad9a6b71d33cd0ab60d77265c2aa078f7ec58a00c92ce9b9ffb1c805af5b155c3bc8b9a9b73caa7183f49fe9024740ccc68b9619ae82d17be33921983e269d737aa22172f75ce914974219f373287044445ef48e5fc0253857a8af7e57e8f4e03b92071eb64e1531aa8bc55f0c3ef4c6005a6b9466bc5fef37f3a61b7f071ebb193932e88ca0ac9dd120ef1f0495865431b773c60d77c1ec5bc40ebb1f27da09a9c9a402429a45058ea6826c6f6564225df7a5d446abd7de9f7e11e6e7bc6ed4ba4d7af030e2c5db0e61215465dce6a4f68443fb975db41f087bdc0611e4307f5683d6571ab1f942e9a9cc9a59781174312bfc95deb5f1a895fcda51e099a2540d10350ea169cad0ff70d4a426dc239b3a4ade47008a180438ebd4f0f2515788a0a61808ef3525944251878b24886f4274409b9e72d84cb6c0e3ee8ee5c57fcdef72087306369446dc66098754962a4722cc521654f331b4d6765901bdf13bb4a632a28558ee20ab15b28b7dba952f161059967e0962f0730715f7152093d07ef363586e7f9597f0c0bb5ec7577e41876b3e59b37c67aa9ea3065c7357cce5c7959aebca51363e3767f62c4ac5872cb5a005eb9b57ec8b97d29a5207195e51ad41178332eae7e93d79aaee78e9d45ef96093bf4eb89d937d7aedb3a8fe23a50cd979a22d07fd07b13767a754129188b8fc4acf24e9bb2213cd1e9ffdff449ac7976654177f86686fdb8d892518a8f97ff5660fae4faa00c35c479ef1700d4d4bb330dea69deb559f9a4866c4ec969d10f33ac610214b5805f02e335a341b7902aa7045dcf2d1537a90b23e1357ab9b27012f7c07d2fa5f78d9e68dd29c7a1572ad100ac8527921b0810c15d5ef18757b95d8340561e2d711d6cb94af19ab706acfa039e1041bed7b5095af91517be4e2e5fc8e9362af6c0f3b1fccba1cc1234d0bc64c5bad7735808839b22ed7146f175ffbbd739b95de07dd25a8fe7c5a66e67581a9243504f38fff77fd9269fc7f3bdd900d6e0764f51aec360e62c7f6ac5f5c52c5674c7e8ad91afefc10495d74cca4079cf51415630b68959ee145e9e4217a5498f8f5cdd92a581b6be28b0c8515cef945475b2058642203763713d03014e066b3f90db2f27af6cd2c6f3d422f5ca0df72bd9027749a88ec97aa7b02bf6ce96bf04bcd81d02241cd1e53f47b8b5e4eb17a01776f20c417a3575f9a14df6bef646c8ff1850602d2d7c95e7084412731d47707e9bcaa5711c444f08a5d10bd0f9373fee020e17aee6f1052901c5b0552b0af51cb9cab305c953f616e0b66843345c24b9e56256789cf7bf7073f0f03108a9cf926a380b20ac870c3e6f30954c17886c7a5a99541b5c65bc0cc9cae064822ce0ce15805205df1d404a85d03dcd6392ce700982cad2994abc955877d00c562de9ed6749a8571a33b78eae62ad2a4f7896da75d2968089c5131e05671ca6022f36b4ef6ee19ab14d64859fa6ce53ca7e79b56d98a5d90b88a46134c578e097f54bc71e74ae6b0c1b5b82d72d91a65bcd6846dae1b3534d486e812ae172cd64c10552b7014ad12a65082b98fad60c2f2daf9cf4cb5649b7d6743c91bb4724f8c14de1c815d269f700670f4789dc9d89a93e4382867937d81a68e808eb3c10bb004dcc4ad2ce826ce665d918527d0add3c55bc730fcb0e1e3a2fc8b44992637a628b17deaf25686cf037215d053344fbd1ed358a13d6afeec272f86bb8ddb2f9f889a939d714401d889039a5a8ea7f52af5a20e27d6d8e269651ce7961d9651286580a20f4b05f0b31fc0b4a46876493cd4ab15d4e24a5bc409886806f76c651905d9f19122c7f7dc64a8d29f9c2fa0c9cd567b2861988b9e8aef3ccd0bb907bd2653ed56c82946b2674ff5877f05e9c20ab4000682a0412afeab9a9ca0884a5a75ffbd0ed7419e167656af0e806d63a3cd5c445fc9d13a59cf95436f0cc15b4af8c973b5b57e61f680cf4fb51592cae7709cb03d600b5886e4027f4fccc070c694bf7290abe2b521bfb391ff00021d0022df75fa7a6921b3054e2b0bfc6baeb4a71c5bd62932281b08199cc516673d3874902356028d9aaea5fe1cc4b624c7f04d80b4f3761fcc95d53c902618b9d2a522ca9731bef14fcc7c389c477813b7837ef234f2487036132fa7e51d7eafb76d43b28579bead27a08cc22eba73f9fbc2c7f4b1787035289730137265cc04195b906f46916c965ad53ef9b6eb958cec07e711936de3ddb03857046e0d2e16417deb6f2e420daa69c112407e018004802df399dbe08e1d3a0567084667c96c10217eab99d4f6d5ffbdcaf5cbfc159a182c24b9882340ab96ef992d971be9d74f9ff4c3ca2c28cc9f4780fffb813526ae2425c31d8447c0778d9419d07ee02566e0c96a90036181d6eeff6bfe86a500627fc1902457aa9427408a2305c8c24d5c130bca48e12671c7a53e318f20dbc0f9171a073676f7011d54057026114ec89463e5bfeb36af7fb3a47a83629c526432672531780e1dda49de9aabcef540b325765fafdc5c591faffcb73f805fa832cdf9005acb2b3ab7ad8294fb02f97dd0dae4875eb2f34a9dcd15d8698dd528ef5c84abcd363de19e0f9e1750f68f6983a4344a863004253070e4fee4481f0c99b3070fa7d25c25f453baeab322f91743c0ee5e9600969c6f5ddddee161b9110091694e9cd6dd9d6ca18e3db8e164e1a461d44b9affb488ca9a00c2c047054d3b84402da3779eae664f11083f8c373df8411b36a2f05435f4d88e07cfd4f93a5586b0037155d7fa7ceaf59200d6e0768b618c668d285275195ac2ad63f7edc689789bd0c532a8b154d5551017c2a4fdfd6c0ed95427c068cfb6fd519b402dd5588da3e94cb4d907e59892157a1e587c247cd7282867e013cdf89e14439c6f6d0f0081c1fdc109d4f8ebba27fd12e160e293139f6320ddc920238f8020578edda2dc8bf489315c4a505e4bdeecddba0f13ead3022c2923c0a5803ae259801a772b512aae8dccc1dbadef431d6704d505d7a3a89b50efc2b5ac0f01ea759148505442d7ba0f4e9298ad371a1e42279d610859e068163d205a4c64f3ab0c23bad09f566b2b46d263cbd56fa6920973d0f9a02c4bd9ab4136e7add70e0df732676410547d39f4dc7f80ee0094ec8ee94d3584a64d2e7aa77d60b05712b6836e8be7ea1d5ffa7b7cd9b481843b43dddef043487a0005f05b288b56bc10d84cad09c175700e7bd183932a1894c92fcb4ec832d8737392e760ac7a3c5262e7a9909800b420b541b2918f4b03e782935358628498b7809fce000c8fe8bf84cd83bf6d9944e3fe26c6a32ef20a550c446c2eb002bb2439c4d41467cc6cb1d3e45b0c9ea65a290a2a089edef025091e615b2de331a4b4a775137d9ebfcc284162da05575b9465db80666aa5c44208c8290f385a603ab7075a12d27d3244bd5147f5498b016c26d1f979252cb2c57c11affc002843c2a68d8056bac426c1c2b9b22275d42c59a217eee465873086b56a7333fff269a92b90e82af400dda8437a3dc73c80b5297702666970d6261f53104fa621a012f231659c0802f469895beae4303422d3d05133edfc4911fa62ee1984b35fd8acd22190be9edcd0dfb48326c04661cebc3f2b88a4a3a252c93b61bb7fd739196f2cb703f58db7a3bfdc49c2404f4620f1f7f17f6446e4ebc52b8aa243015aa9c9fc8c2d340be9c2953a1ee803f7d5ee9c170de3860a3e036209c425376b19bd928004b0e2a54b870590a5bdad1700429b968c90c940dd8f2ebf3f8a8c527184850c8b13b12d5e2e97b94bd9464909bf769ffda2049abad83c58196b4f4a9184ddb8738e0a77ff506c9f32064e277cd856815803997594eda0f144c7987db87cd2da0e3ec4b64068131fd44bab3a8c5d59a745843bc6a9941f0dc8f05ad9802c6dab6ed2903209c262f13cf030b1856f494e7b531c5cbf1aad4a6b673a5527f92ea8cc3d1dba7f432002f31db70f9cd845a9d9aaece9a3a2428dac7b2f346489d5d5b7be10b311d55f5ccd4ed43431843ac44b28712988a95ba11f9d87ac3dfcdd4a31b55f871abd97eb3f0d5268888548302bda8f8cb9b645ce3a8ab2d8a68bb1178bb8213760f5eaf5092f26673b44a5185cdaada925b0f40c58980194e45dc9bc0ce5ae2224105a10d8cd3a0e98af5e73dc0d59b972f926082e829cc18150b6b1a2d52a208c39412f2d2912875297565ce8b33d342db4c06dc804916b0fb7c8217055a9f1ac5e9e34bc251c64caa50cbd04d64150ed46b988c3c1641404c1f20e41fbfdd2b9169775d173f9cab6264dbd39fb36812fa79b3e81109803b9c50d070751781ac325c8c0a6aef62dc0c8c4427bc50fa81fabdb5c3b7278e3475509de0127516f7f46cc18a33f3156b1d7d0cfc900c9495d55642a54d3ea6a556c9c97e3ebe248c760e769a6dc5612d109e44c4c864853079b0408237fab51b82ee16e85f7536116ef605d8ba8057f80e4dcc575d0302c964d1bbdd98433df59251845cc7ea88b77c3b6ee1bc6d986e8f85b0e2ab9dc4b97cb64d9961c8cdd067034a2a679a398ba4409d1e772d8c1b65016d25553795d279dec36ce98e9c780aa93a161294e3da85a0c4b765084a188e74d67c2f3d4bfbc8ef0602c423df2745f4ecc173f8f7493e08eb379563164963ab0622dc5b07393cfb51f4278474729ac6c2e32aef4ab55b95f54101ff4591dd68e92c19d70d01e4069566b645a0268aa2f4fefe7e001550eb0c2df1142713068d93d3259f1f539e0c5802d253caea6e8e41e818fd290ea5427d024b8dc8de6335342e856d123c333af987f4c5031280b11b69056b719fae54a87f285f7f9f90c0f9f7841f478bfb5503d0797236c83a034a7763a459eb124527b9a66e104d1f69149370fb87dcb69a8fb987ede5b9e1649ff73ec607b608a80e3d80062ca3dd836b3e1b0eed53f2cd35cca66331263762880d7ee801dc88d4332c401c01ce26751c37822633cca9ae0bb0197fed76f33b6c104ea06fb112aa4649c4af08a06f28345b0ab21e43d2c33a6f81a0cf88ec586b023b02431572148c7efc007b6dcd7b97a6f565c6ab213990d848a5779a716efed480f3b1b4c575c6d4b78a5ca53241a6296e98c573e0695a3e4a6320be4cb6f0bd33e8cf141b9a6bf469c9a02bc9364fb70e6abee825318b25ceb1429eca1487e0cebd04e76014a041bc15f6a30f2923ffcdcb5506ebd4fe1cb69cc223165cabd60e679dace92b4c56fec2990625340cba9705019d4c442f0c5fcb0c20016f1b9be6e7e9445b8ecf6f03212189291afdf5cef277375880b336546e330d3eb73fffd61f97b1cb8acd9bc8f824823224f893f741ccd845466b297101e7598cf6700fb5bfd577f01080b2826ea3f8776ac70d67e122df9aba00b471273f3d4560f57ecd30443ed9d47df3e23042a7ad026687201056b696280bf149124b17d23a59dd8210aaade56b34bd58325f0c28ac41d99f1abc30dfbf87085bbacad212aead82d0e2edc74d57e6b6f92d2b4fd0b1502fdd46c6754aa4c17100c093cfe6d7feae766e51f187ff1184e5ded18908fb09afb4e6122fceb08fe8befff46b784bbf3119cfcdcb2490eea72cc3c8532533eca25359ba05d9e456eb488b6daea8cf17195ccebdfe889bdef5961e6d0674b14ab59309223f97b4fdd1286cbcb3ded91473cb2914590fbdbf1794662cb9899e1f41edf01b9b5d503f8039c545268b48b94d05c55c35e6cf642cc22ecec617c5ce6b94c8912d3bd46d0f991d1a64405db5495af8a924a717d21609bda90e092a6df3ec882eb65513cc49de066f5cae4bdd4e34553cc8a53e72a8b77ec2a6ff82d42524015a86d1aced5576f2987fde3c3da2899e2f228adb61e77657a046e552a02036dbc7814e947fcb9bf29571c20b1aa9b62d6a6beb8cb870ddb7da9d664fe9fc4d047bd2b965d8297ed30a82ff2c4b1fb6cbd3f53049a3ae237e7772ce142f8230edf7dc1f280808cb9e250d197627acacaaffa6fa86e3a60a7eddf944c1fd77c3163cc193df00d388a436e01fe69c555f800429f37e231cfb01c798571d20fc81ef85d4f67148261bf1b4cfaad9e148b95a1535c87b1929f280f42879c1bde343055c070e2700e43643e298976527f6ab1507ac55da64ca5147ff50e00a1ddca0bbe64d9b21835ffd81e01ab6c1544ed92dc0830d6b19c498a28a01abbe7cd362e5b03f0e1d877f9049c85ff8ad1ef5f76790f360a1b423c8615c98b4492c31e833ce886201a56e832e637b6c5129c553aa359b35b061ead7eafe0f839d1d91d2fb2b86bf7cf584424921d7e8d6f550a49523330a3c69b0480489392a4376b40cd3beb234975f6d91246411a5cd6380b6e03e20e891702ad22d4276bb5c72e1e649f4675e80b197cbf0bd8af472766d6cc411d14b1d608560e5c85dbb11e91f2df9c4a7cc9f69852fcfaeba9f4986884898f3547af00ea877419373c80e5228ab86c8c44e425a07d229428af0ca271e67867a405f9dc402dfa22e1fd129239fcd838cc20a0bc3c0ef451ee4e22c2f14b3efff206e9830ff455e6d493d48a06c346f09e877b74267c4ee0bd55886c23c69d5518af88be33306a23e213d48bb11d59b269463fa44b09a632fdac9ec058a28670c838d263c91d51c8143a4563e5ad53aba37e59e676281720d70f0c7aa34315ad291e5b3382b3a9b5be4619988d1e2f07ef2c48e8b727cb3e769c7b3d58a8f40d5b8737bd7131c987d6982364a7c31fe92ae26bd512082d0ac7cebe2a6a3fbb7b3a0f41976560edae039895fc347b26a9061a1ab095d3ed4a88d46b98a3fd34787b10cf9d23cb44b06c0a6b00a57f193a5b2a39d60e24a2f620c1996b9bd6c9f2f0de5625f63fbd8889efe8c06c4c3ed9b1b63b5c2dc785cbc175bc3027580a3891f4c7e86f02db476479a4a97a84e308f7713d43b8d0f992dc7ac2488be2f42301dae57f28a3ecf60cc03252793e996de49c92e04f9637e62f560c52043abeb207152ed34f4030cb2887a51c47449d17243b330e495e9a4ab7423e800db7398d8c2ae7c11e20b3c6a265e649d422e364cf52d36d1266cd2fc1b66694ba4a4186f812dc23b8a2f6893f838810ed6a71f4056139b57116f7672e43e5b8af6063eba72f5d69b764f64152fff85f0e898113bb25da5d7dc174ec4958066b3cdbedb78bacb31873064fae56c9819b14ce4d3b6a2ab49fd2fd0c63f5ea2e0d4c0b292bf1c2e0324619fa44d229f34db81a80ccac2c3d9daa18534a1dcac9a45f43f9e229a9969530c013d822e6d5fdf8339b8442459c82a34d3b257ad8a79bc43ac98be2f822474946e23349bb62c6682ae59a56f84348d72779552696e31379d2201929ac234e2b623e8df7b84ff962a0500c9ac68ab8849c75efa6d93154cda47c96888d08b967c3882baee30d91dcca83a14fb5662a58bfa23d09de59b53cc2854026fbc530daf800b33112808bcefbf7b29df10ebfe4794d8d276760da4199422ad033e142be06ebe4756cd312bb768d22709a421ed38891e267a14ffc8a7211e49181c67907ee1b171af44ef8371f4825a5426db4132ce1515bdb37887b845d6d287fb135d521e3dd25f6aaf82cdabd016edbe776a44484a51916b6cb9ab9d17c95a0db91342e27d6364bace83ca8628bd17e2d55140333210a7883b51ff748b0c9cfb92f930886db62299f9131111ca59e9cf41af4034c38ba91bb263e8bf73a35581ed9d82f5c5d59a54a62ceca1b74c29faaf65576cb76b983e134a5c9242c54e2f321d165bdae9a4f474ab25f6fee793843148b145ee4f12c53864d5a33da842685e089422b0a784a012b20246765e1bb24a1e2831dc19202024acd25d41234aee2a3b04c6e1b8c750f11b3e4b88194bddd0a4cb36419345d841adc63d78c63514b7c1e99489abb88ba24db6eac1551b3d7178e4d1b974113d428309bb722bce0f0578f31f9d35d193e1400f1ad14d61d0f13c11f34a8f049c2b688f64d12ee62d22e09742290efb6f8208cb8f18733a95e39f6431e39d68ec6469131d5d77dc63905d9a2861d42e7af0b4f9ae19fa2936312f1dab44b62423df983bba629e3e1c493fd40b8841cb191ac4b57e659f37de4e9478ff79410be603535778c760df3ccc9d96dbdcbe70f5a224657cec3c708aa1a7dd30256f19c7b5028cadc7ef4781f76519360f67e7aa94c6421d0072093e1be96b4c491d00950fe84d4fb878a7625c3a6cd5b1f53b567f24cfc0c37bae5ece1ab4a7a05ac03e4dc5a1f10f4e814ffa2130fca1afe5588ce9dad65e0c78e24ab100ebe11149c6979d81441a9be7c3b7a6b1114827548010809e05f62b1075d63156246f4c1014ab8fa0d19da05a819ab95cbebbe97e5e8b673785f473144f963942430611b027d26e2a50d927c5e9fc3c3739624da4a2f980705879d0094b1cc6466f0c8fafa3c51ac2d8d0c96007cd26a420f6a408b4790ecb458ee117ecec8137af5f3abd32740cad533a6aa34a02ddce5d48aaf9a208cda081b7a60b9f85fdc35040318fdca26c96b5563cc3b991631a11175f4731cb34cc0f3edfda892ae532a820798467491570e2475a5d033e2e0557acf9d985d84fa43efb5f904f4ffc2344c00efe0f014680f91183f413d12d82ced231b10f19ec4129c1b27c55291ed38258588d15e49e2e9cf657e9c8c206e9ec4ba45458165669c704771a7e10b6bb7b35fe2c58b1394ffdd831d0150ef7de706ba9612553bdc23aa0b70c123a1a92475fe0688ddd8dc53d6e2d8f452aee1b1cf3e19a2051a4e8da18e38f4b2707ae38c43cab8a0a83018df0496d77622d8fecd45175c5e1ce281d9bc5de0a6c5d886e8a97f02ed36d357dfb4339e5ccba27d5b266e0dbe889acbabc3720f9c68b5ed6d2a9ba770a44489aa1d8b75bab0203b5d43d2eb0281498d2d5dc32cabb212b1f4f0477f3b027d54dce8fe55cba7be39a39a5f03fb1c34734873596c80607b1508f4f49f005ce75a8afc7892798817323a485f861a7b63ed38942b12e9ba8b070a7d2363b23b79d503aa173056d502ecc6185895e2d6630745b03fa2efa745a308acad21c83cb2a01b74de041f27a58888fdd65379990cbb0761363ab2ab91cd861e6944f70d943b9ff9abfbd76daf3dded0ea600fbae86f5562fff2fe65032468c669f88ec1a6768e4a47a7d0f7ffd6537111112b2a59452cac1073707b3069bcba50e4b739559fe75ab6a894e75096be69ad5f3d7a9d8a3e7eb11d674cad50d9635b3bfe4ec5bbee2ec9ea737a9d99f3a1e173d06b2a1cd141c11696f24291d2d5176eaf8ab88ed9325cad9bff28cc54cd3b72dcf9af579e7872d44893601b14ab4294745f1273d42a93665d7219e23769b74775c69fbe94a3a15b4f033f6d92f69a15833efe8160e2b33d6e71176f6705bd0f2d4503e39004837d8d5afd82795f3d49ab728275e01650925edacb35a6756f6b93fb4e6eda0feb94fbbc42e91d523d6ac979c13521cf669c6f8662e677ce580b462b959b8bd6dd2cd4ad4f399f1bdd77211fc18a6467193a812b555a3a6fee7e92daacd8b4f6f5156606e51501f45fb33cb9e468d108a5cac70825e7a6473f8b2c20d4acb0d8a8d5058f527ec0635e666a5ea0e91650dbd61a1f47645eb4fd8539da7b72b6bcadcac6c65ddacb0b957bc5c5775b35226e7dce99b952a5dd769ef6665891599023c1c444aabbd52a5d66aef952657347045f6a335f193db952ed55e9cb94e7b1f1852d7eb6eeaa04e0b9d166bc2ab2dfde6a6821b2e361e173c5c5c785b1fbcf1f4f0f4705dc4323db01e588e727d81f9c07cb82b2a6479e1f3628bcb142e5054e0c08b9f173fb42b416c2e4bb65871dbb2c42d05257ab86d0122dc72a581a0a264da28c365f816db0d6a8a4dd6e5ca1a7dabd2c46d0b0b4426d1162d5f77dda18a0d372e4b4019d130a2b105ca96d994163951d0a841a306e7a6428949e81ab11ab11d2776143bcad272a5c5eaafd7aabf578bcd034836906ce0fd64e3868d1b5a4b8d06b5c24d0b4d3f515a525aba69d140164b142c5170cb8205053828c071cbf2c42d4b1155b72c6e70e4c091838b1b35b05b961ad42d0b941c3a72e8b8655912e6964516838e00e808c0d60d4b11372c6e300b1504a0022c6bb0547d55010b6d0c962e9fa56e58aadcaec8d11c48c1020b2c60fa9b95260508e206b575834ae2062544141310bc57bcf7969696f5d6410de7a97b5a14478fd32c2bb3a7fc01154ec8c14450252ce712d1d2cf1cc5cf2cc5dd08ec49194e79cc212217e38c1da82a388be2f8a6ecc72d50d38d0f34294b59530c35d924e59a355d6208ce62ba0b72eab6e610f2681845e000f0667833bc192ead1795d7d32bcb0bea05e625f59a7a91d1d27269b9b4debe6c7682281a237669bd9cbc5c2ed7ebf57abd5eafd77ed99ef624722e783cd1296a8626a3663c89221502c1f8b146ac316e1a233c49d5c0d92c9cbd7550a7c58e8e92155e32029e326a08698684848484848484a4f5de3c4859a6ced048fe7072f68c07698634439a21cd9066486490a6906a40b221e98064850404121652965458674cd9d49a4c2e88829e44378144a72822bf24f99a8c22728e8cc9a15da226b32556b12c88947c10a32276c56d0b0e113eec302505554515abfd0a9448cb032066a346512220228d6084978c0192311ef4d04509d3517e2208639012842d7e06b96446cc458835d57009866a43460c650d2931a435146768cb94995a7be66c879ea918591485dab05e832c92428fac4b40163da1133c558192aadd1e7731e3c845cf50cd1baa0dd5866a43b5a1da90114359434a0c690dc519da32959832732635c28a5c2ab624556414eab4e0312aaf829404c9829804cd82a404d182a082b25ca14e07499557babc122a4fd82dcf5d5e052909920531099a054909a2056509820a922aa7caa972aa9cd234441e313ed469c1e34c3684811583498c598c1362d0625889f1a4853a588c9ad67a6f18ccdda437e857fa5367b9cb700a030b0603cbbbf284712e549e3ba884811583498c598c1362d0625889f114a3851852316a4f7b82920aedd653d413a8a7a30f7c97652e5d068fcd47160c9b8d46a86f1bd730f21a2f1a4b5a78cfb8e3e3087b7d6481b921eb680aed891a55c98a4265c8a9c0bab2b5e88162cd0a430a86d455da564aea359b5d63e1255d156605ab0226c747898fccc789cfcce7c9870a35ad5b59f940651161414c5b9df084d680f254054aaa4b6dca76892ccf968f3556a9a82c8262894427af2ca2c9d9d59f5093468db2a24879eb30abab142362066bc2cacaca0aeb6aaa0a981c256c5e6693623b50d389d5cfa8f83cb90fd45ba761042515c2a66053d5a7e288d88376b04626e36c3c61a48d5628d1f87447293b6abdb70c72acf5c4e01c3d3d79ab75d1d5268ba2d01ad6b3c943163d155529822ad2624d29b2a866cd31d69cb2591549a1454554b8b2882666ef6091e539e4e57934c25bdfc1ea29cfa30fdeba8cf284c5a8d83b58239371369e30d2462be3d32835b630d6de7a91540ddcb1dab1aaee566ff7d651783402ad61cb92f6243ecdf0f1642221859704b19c99941933a66c1b9acdae34260875947da4147e54bea72fcb07654d305253dbc26cd067fb61f583cd0fac1f592e5cc865e41f57b4225a3dfa40883c1ae1487634a3465068474d6257d4e82884b7eee288c991063eb603258ac919fad3d30af2b4e0bcf59e52cbf3b4ac6a5254d6fc934d8adda8693f3074eaa5ae522c0c252213fba66c52acc8f6b4a7a5a54bded76494e9822caa624d28a9ce1ccba2276b8eb04f9795cb4aebbd2f4841484eb1711579c478d1c3a241c2fc1255f7b02a36c9bd34018ea51c2178492ec88884d188a08200885ef9c3eae8c80618132ff01ed421819c14226b8f0fad511dff7c75a143cdea20537849a3073fbc64919047c328022e88ac12a899a266eb48cd14355b481768e002991a991a276f899eea099556ec89960db80ada02cc3926155746c21a91d086205e85cd48b6e1d6c253b6553225a5a65532256f73051bfb90ebda758febdacf7aeaf2f417455b9bbe7d7b6a50d75a4faba9f5d20315865536abc848b1c232e1f6098b84dbc76681617ce856911ec284339f28fb0cc35958841a85b31e283215ca06046469424ca19f48be96a7068261d7c77e02bdb5a675ac24e41259b77d1d7771d15f5287794d20b76517faacc404f54c365b6985a2a7bcd2b45cc4b0c7336f7d772130a1aa7c625c6dcaa74a6a9f9c8db3c1e0c0007d2d7b6a2f72d8278c9edac3c8e26cd488b3f5d44ca8a22bdf15c501f4d9c2fce87c7005cc3ebfabef4ae7839f287ebe2b6af45dfdd88a6a4932282fc45caaba949e20068562bdb0cf09a42690a23862148b6249a025c53e5d4aeb5d6a02296a64279092402b27c964a8a0eceb579147d5d5fc5aa911eec331bb7e18d6add3d6ae6cedcad676a9bd57f90237a803b6b0b471f49d1d1f4b6a4d570b9d7297a2bfcaad2dafd4e5168d46bb2159df459ef8b4b5d329fd9cd2ef5bfa5cf64cd6d22c6dd3f4d69f83d6044b6a4d1b861259b754f6f6b6666930eff153f3f8b961dea3354f59d6ad1d1ba60052a19352d56a2873d8fbb3bd7ef0cab8a238803efc887cb6ffc2ecfae0de5e8d40a67300bd8c2b191724eb5bd7fbfb9c7eb667b25ee982b66be06a3c25ecd3058de288d5f69943964346710071b5efcc77c5d54827f61981ccf611c8803e878cabe590c56c54b58e0c8c7310ecb2eb7f16d78ed667b2582f69b29e53d1c9933d9365b227e8c4d5587676a6cb71f0d97e48768eba8b31fbac358a2346720ee6f2fc6c3c8e4027dee6ae96e2937dba44dabb6a1f7b9b487b5b430cdbe2cee0109fae3db23ec6b83c8910f92c5ee091f424528760bff7b64215a8bf49d978704b14c48e4c2227bd56a79952230e53e74200b54d3a29a502b89d6bda3987ffeaaee4f0e5b2915b9b10f298525a9e9c731dc769ddd12560acd2fda2b4eb3aaec4947a2e31f54bf70b353cab63e7c231acdcc5be2d576b2d89848f691a4c31a598524a31c69452aa0566da759c53cfdded3aae24127ec6e5b599bbb77aec6b925bc12b5748eed6c560690e6dcd05382ab6380c5ce59a2dd72a609b03f5d978b8c0d59c2cae76d32491a258328a85b557d9fc68cda7250f20a538b40e80ae18635a7335a2bbd833ce3be78e3c3bc7ee893e38f75c8b3d3af7aebeb7c45dc9e5bb03482b1610740fdb240a7ae5f22df2dcb5e8433be89dd8c373b03cb17bdc8775a9eba5d4881ae1f2c4175f2959774f4fee298ecfefbbbc56ebd2f856279c713ef2d82f35ca1e82a4a546d93f127f76fdd9bbcfce759f6f0b20cd91b99c5d63ef3aef6aadb5ab18ff0571c6377cf1d6baebf2bd620f9a7f24c950608b2d603ba871416a742bb618971d648f1a5dec51f3e28c2bb639971a9314a8ffd32397f87eb8858464c058888325224b5f3858da16c83fe47a185a7f711ac9afdd73507b0e6677ee91fa35012c50bf62cf252e3513f096d91c50acc7e5905bea213603a0c5be04deeefaf56ccd4a856cd275cd79fe812118964340c7605914fbf053ecd4255d9b784b7cc4ae6e852aa7bdeb3c3bc64c96cba505f0eb7208e79ce72e97316b5617b2a6d524e42936780016294528a932440c50aa24889245eacb9c0fc6d440b0c106559819e385871fa03e50834f1b2236808415311fb8a201de401b344940b13a82098de6c7d61b2b1d9470b102458328b436c84b2c4580529d00429a335a8040e1898a081916287088728516213250c1a2058b0c1a5061055b932c71a48882aacd085042ec0c626671a84a9822429f39b265e9c084144d30f1a281124ed2c000429c0ecca468880a63c29b1b4430c2cc142142ae8853c2ecb642d4116690a01087ca2c2a062280d04029026836386203384a4810e289cc134e3ca0cb241953451b1ab2681822841984d4273608819027b634a073a8ac789963e5a4092fb68d0d263dbc698382084f372009810a25d0a84006044a68323c6051c184892264644098396185981f4ad0d2830b33f45891831316b2a05983e689f626051550081302152d4312293dd048a06213818829847450255cb1c20b362d367a2ac9095b4e88e18715543083427eb30103a29471a3824c8539545c386d645ddcb44962051e9aa8530db209538ad8e2831929b2e000958e010456e0301546093867dc08a94fc03475ba01b8e54fafb86957a7d57575588d551bb2746e0a15bdb5a6f553c75b3f357618a545d785b00f07083dc69eef8dc598f4337172f60c60f60ce409e91471a25395b266aeb5aae5ac5858d5074a94fd03c117ddeb30ac4ebdaa0f34e9ee780b3fb5928ed30ab69fb0773953188665e897042a619f554bfdab6b2df3a863ca5a03ab164abb3a754bae3c6199be15c9b3bac833ff59b12a58eab066be412e5933d7ac526889b2ffa00fd6d0c34fb76240df3a0ffad693fc254fe7c8b3067928b683d7c3602d4392bef6b271f964df7befb57edf9627121c5211f4b2b1b545ae67adf3edcaad0bf2536a74cb9a154af96c69d49e90433f616276274f874da29dcbd22e51be61cdcc259e008ccb049448906481b284ace996452e517595b0cfd8f518ddaa8ec42ad1a6eab4ac75c9574a69c5465cc5c2d01b4f237fafd3f2c4353fb3fdbd706b0fafbe5afa994de3423c03d638a458eb5d6b870507de20afcbf5e3f224ef3af15f3104b9dd911de0bfcec1ce9dbfae35d779ed1660cdebf4eae4722b65b080ab74c3125d3f8bae9f407f1d762fc5fabba90ebd41af8eec02e92e8f2e8c2765f21c036b5aafe40e6bd20e837287db249bb9cf7fb8cebb1253077a77f71106a4bbccd97b3169c39303d80fb9ee74f1758aad12a699238530f69c3549b5aed9c2b0c89a7644723dac372c91900567d1ee1ce3ee46ac050bde7abd4a5e940776d02f09c4d570f4323e2cf4bcab5e57bde2ba4718fe3eeddde79d7b5f491df4bcea7525f50f608c3bdd75e57931c69ee7693335da2406837d7e49e73c5c9e170654435cd20ef61f0c4883ae35695a22eb9570f6388ad1485e7b8751c06178dd23470d865e583f2c6168f6f77d9f63e730fd605dc537671228cc3e6b3c2c8697e830bc619fb0f12cb24aae2014482a526bedc8f04bcd60e9e702fb9d670023755893fb19c8d128f0b9f520371fd17e5239f675c06c120f165576e4f26071e484c1ce4abbefe9e8f0550add2cb2b0ab74a4d2a4205dd7719c7e0efff4c027e7dc9b37ec0a6489a8d125b21e920f283a72958890d8a7d00b6181050fef79de78b7aca73688c95397462fde787174f9e9e2e5278c17fd04c08b5b2ccf0d80ea5f75cf2ba546e7180b3bfad589cf38b44a1ae321b8bc4dd062d7c3cf43aedbde57ff6290c39c8c24afebaef9e108d21ee609bd97c17754c6eb329b01ef917b7b64f5deb0f6d3233b97cb1d4cb85c3ac37d3308b17b9ea4b38bb2253a745826ef08c9e1ec954ce58e8c4466cd3b7e78c26c5db20e160131483a1ddfe05bfef4f8e9c1f910cebc25789bfc7526ebb7475664ce3e6130ddb90b79f87529646a1707a04b206b6a85f59b01748f3cc3f78ebce766bdd4c499c3dc8739cc8d0f7ea06bd7da33f29dd71004abe8e3be3ef279dad31d37005c623cb5c4123c73dc70650645b8110a91c8207a9ddbad2dd1e52acf242fb26eb944adad251b6ef32f797a5b6f33b066116ef2d5b83c61badc6e6c93ebd9437c4b08e40c78e6b811f20134e584115b59c82ae958a2b6ad2d2e6b6db9c9c09ad6798aa06eaeab7e6fb016628716e7da3e7f30f8b302b9614daba3d6f1cffd22e79df3cdd76949647cecc3c6943548dcbf7eff96e78fd0cfd25b00ff102176f53206bab58514b2f5c857240fe4c206b9f3a72302cb5d792493405f497a9aa6699ade7b9e6784042d87476bee3631ad7990a1c54e5d7ebdeceaa58afe89650812000c5d8b4e6117e2ff3a6fbf2687643a80d1129960c5931536ab568c7b40c0008e5587fd34f2f808f6248f33b8c475f6ca03c11004bdf310ecbe2cf41f795236278663a5dd7aa5f6d02ad92b255174d279f627110ca407048cdf8ad973f9e3e3dd856ddd5a22ec169f3fd8bd5efd602b3994cd0f4b84011c2bd07a5dee8c4665769b5c286f1d96668ad65b1f2dbe5020cd42ff5215b3639dd392983f7df5759520bed90209abad92b00fc9332479b2b2aaad156bdd754e89c07c48d0868536cf718e9f2b7f384ff2ce71dcbd5d2984aba2135706c9e2ceac69cb2ac2cc15b149b9e4b1a461d8637e8c2d63cd29f1c7477eceb9d206b14436bf6053af6896cd9a5565a891f53084d04f1024b37f444ff2227daf525024eb4f0fd15dee2a4f978b9ee44197cbb3bb1e74b94af0055ad12750df134b1ef443f2baad1d0f0c6c7af3b2e47d9edebc403d18862179ad78412792270ffa438858173dbb5872603d87a253f65074e2fc23af1579dcff5c1479e05273f743b2834a8d3837826da8350163c597cb215f99bd3af87948717c1f0956fa98b41f92358bf7e083d75e65af414d7118a9ef047a054b264b436ae49da2583b2735d4cbe59c73adb9563154e01c3a50bb22464c181bc4b410e64b2d8bb6806187d664eab204ebd33f371bfb10cee9e5bcebbaceeb3ad7ded9b92e2be79573ec542400976b16af8ab98a7315b3538ae503dc6106299f4504e8f55f56d418e3c7e5c9b9482012fbf7e5902c7a6283ae1de3acff835937dfde6bbecf9a3762de5e1bda4ba543c7e7a3af445fc757156b05fddca3cb4f581e4bdf29dd612f12bbc8fada4f988b03498fbc9e4f9fe7bc2389e8b8f5622b20d54bafcda287edecead829ccb4264d9a414d6ba9697d86bb484e2cc15c6b589a3a939c7be475bd7475bd3ab47989f0a533798e9fc30fd3f2cc64e81e791fa4492fafa2530d7558c3b256eb7d9e05298e0f7489fb0bc9fadb2582dff570786efda338bc97bb44a7f05586fe55f76a793d13199d32cdd7f3c5485499adc8a622cb48415441544bd42b757c6bc5b5de1a27288d11fc664d9aaa1ff3348d973450a19a289eded4cc7ec6d35b1a370f649338d32a69cf319cad6800d7a55b2227200f7657664b8ed6cc25137b733966cf800dd8d5e9cd862520b5b734b45b1ab14ace8f4380d5cf3ddaa4d3f4b74ade84ffb2b9fa1b6feb0a23996d35c65e49af87c0eb6f5c5dc3fec4995ea52b93c9644f4d7783a034756c53e7bce29db1d6b6847dceb9e64c3166e22ab6594bed75eb35c9add54b15d6d35b95d6d7787aab927a191004ecc000c875080902016b060161d8446cd2493d0804ac52953555996d87a66b6a6ccb86c9fa38e78e5b634d1bfbac58556f93e8ad0aaabead47d81cde3e10a0173656d26e8910a5d961ec122ff4dcaf7443bd145aed7af10f10ec94ea755e0aaa2b53acb5f6e22e5af045c12e4165820c775464ed0407bee982a836365dd7795f5519cff33ef066d302daa0f2152011486dc6b986a71aa07c0d4b9e8d57059a27acb55c67ebf26961ac351cc7690f4d19345db0f7791f9a2a6fd13c61344dc60ffc402bde7a9ee2d4372a2d1815d68d8acd8daaea4645e64655db200886a2ad8a2aca95f5c2ea45d5d6b5a39433932f1ec79dd1c2fcb6abdf7b2f19fcd3c343f2d49a4260c11c77f3ad8f5ff8662ba6176a6ebee07bfca286d7d601996c31a61e6c3a2038d582d4afb33f527c706767141a75b85db4107d0c19479d3d8e62074ed8b50bf062f0856f8b4eb7450d4151bcc0850bb103a7cf3be7a9b55efddd1e8e731767fdea8fdc8101530f3631e4e14471858b73ce5c6743d7755dd775a218579b6e77de61aed3f7b6d1f7de193c5aebf78139671dee91c8088239e43a18c230bb9873ce1cbe5dd65e39f2721dd8c6e24a3177aff8a3985ddd06da8bb91d3bac99060433e9bdfee71ec46106bb90bc21c662d805da4a3f50fc3cafdcc1797e65a03649bbe88554a87bea58877b2432f2b83a70bade39ec729ff1e5b6063379eb5f276c435bb1835ff8894e9d8314534cf1c51cfd51620c7a947f1fdcb7dcf1815dfde24ab12b97951a65ec41486d5292f8d999ac18ce6e2f4c75f69e21e1cc097f2f0d5764ef2e6598b6b5bb19536b66ccddceeafc799fce1330575d6f67b97befbd37e79cf3cdf972fb85f1c51ef54b41196aad35d79aebbdf7eac79816d938eceebd1ec4b95b83f8b969917defbd39df5b84986e8898093b2200a723011ddd713967cc719dce195faf3a61f5fc3803f9f307e4a273ebb1abd495422e14134242a81607cc825d2f4a3dafe1314a54831a69edea670d4ac465c7d85d9bdefdfa8aa1e843023a5ba77300e92d3807909ef1fd10147d484067f360f0eb096bd2db1a14892a69d7e588e3c717bd571e19f07ad9e64b94a7d69cc0c562cbd631e1969d97fdc2077feaf1476a646fd971d9e7f8744c1496d3d8bbaef3b25f18a1a1d83a3c004d8186061abee44003140768a0fde9230e66acf8738c11c60c1c3366b0fe1c6566cc3c7536b3b0f15798a9a374b4a6538ce941b4dcbea251460a19387f955cd0d2f9eb18fcb04ad476efbd17db31c65bd7649acc1082b730d70e383cf9d7adf6b9a29a3efcfde1af6b317f7dc366d8f2d7c4610824ac9228430b224cd3b913c0064b05335888a0c393a67baf2fa04a4c09e29a286fab6cf56aa0df8e9e0a81b6dd5cb590e28525d321028acb87dade810684d5d4142cac164a08e2e916830929fcf004059520e40481c20f5b6aa4f4308bc1c90f362d2700218706c587ac1b0c4b9a60494541eba11684940f60bdb0e689178415cccc0803ba9549e2459ccd46632027bcfce94280c122e30918274070f67e7afb92c5dd5034c16eba9089c4d3f5abb4addfbe08714718125b32be7c5993f505863f770c12b6ced3db972dbbc799aefb324b78e4e3a7b7331cf021f616c905418726241eecf4d0b4dd839185262fd5ad03b94a4868126564983579403b40030286a65d7af9f1518768af658e511cf6ab44260be46fad2fafa1bfc813c8bbfc9244c81d9d77dea3def20774fa4b9f8bfc015d3f58c6c01d3629ecfcf5023d7439d37d919dab0b6b586bd7855db9644d7bc39af57758a5da64fd0718fb487d1544888ba83f89c49e56b966ffb3f792961d440890055ceb1c0903824d9165adbd6f6f638ef8f0b5c04cf1278de2c6ac0bd91b6aa058289705af0037a5ae2975ca74b3d16e36994e5458bbb9208776033385ede6458620a2746e62663a4d98ac3058b7304d9edece6c293dbdd5d8bcdb245cab7a7a93c1ea6badcc57172afaea9be93ad38d251d0f5635db63e3fe62d597aabb09aed91489cfe5be22015cfccd9e973d5f703d1bc937e7cb237cb1d9253d31ed50b87d4161035192b86ab2e49193a614527092459325857418820917ae68b224cd02a18956618212334d96bc20e8d054c160d144154d96bc525034d9e8428255139224382ca869f24084c20410483c314d1eeccc69ba25b5139c21d7d9786244adc992b4c9035beb0d3e5bfba45771e04c01d554fdc8558a8d69aa0ec45d5cf68fa657bbde21b6fd596dbabe44040b9aaecf6a13f6d8167f80dcf2877a76da441f01b609973fb4fcb901a018a8242e3676ad643324000040026315000020100a868442b168348d9254917d14000d6c8244725c3a16c9633990c3280c820c210611438021c0206314a2a1d9000013f42cbb70d193d8b1521db40e481012c2a14920bde2fe6141f3f7db13acc3a50a45de8cae561d9c28ec0b15887edf7e98825b6bb0719715d068fb9fb7be9f8679a60a6374e1f5849b7d585de8d40d04a4d26182edf4850863758fa6bae04fffe758b731c9b937896b9365dd57c0c0660dac7b9ca93237ee9a7665363ba3729c82f7a7774b95e3da0efa148e69b080bae56e316f94b6ad64e0e667fe50320244ad0ab465ea77205dde84f604e3176b5958378b3d8e8c4f8cc0e9a88824c82662a7303232c837540f315473650fe80121abe931a41d9033bdfe13fa553f41d0f17b623799d2701ca2c8da49391bc3244f402b9b32260b704a0746e94a0122c0c64023be4f06ccd7e49aef304532c1f31fba15d2fddb0cc43655931e15920f8749101bf548bba3bc303e4868dd63e8e8ec356173f1a88e030fde0459ac1dc1c9c81eb2db5ff9205563253e03b6d1ef4a0ca93e6c35b239483781516b25beb482842c45ed459411062753cd55fb029a3670072b1b3f5a733decac56a84340dd6779a055852838b30b6c8c8dc5ae7662d06a1ea4aeb482225b5a6573b63ef4eb52be3af8e7d1099c151855f72b000870825a474f958fe981f2a213dd0146bcde5605a26a886003aa8294225a18661ae6d6a2489a7b8df6b7f4091a5e87a79b608b3ca33a20f7e52d697793a9330e948d8a9d38d96db06700ee9ce77071ce463d2dea0afccedf692a46f70fb065911a0a2964e9831b021e7a1a643f552c885d0fb412eee3e77d51a97b9877cbb1f113b6713159aebfacc613f59fa2762f093030f483870055153d54d1b51e27f6cdb51d6a5b51535413b8f308b9caafa1de1e3e3ec76ae79d16ec8752f64c1b2aa67506bb760d920d6373bcab810e0a57ac033a6f20017fc437d33f23ab202eecf04885d275f858470ba1f52516c6e8f78ee256428d41fcf8cd716024140c4438752354132eb1fd5c36ad4b82e032bdec0f9fc45dbce39ac567fab246f61888b50293ed4b5053a53da42bfd7b76335c16002b042630f6c656dfad096542fb3e3c08500d10a0c9a0d424e8c975147be0f5a79401d336c07edf319ddf00cecbd5d977325aaaaee7c82a4485f6f129381b687118a9d9db19e9687cfc419d030525d303c0bd360e126fd9e0040bcbb3da1e60fc92286ce56ac38f7b31505dab4cf8357a8782d78735e07da7f3719adee3647c1737b6d6ff271a269781d88fe2784d59ae24aa2248e0518c78878de00e8f0d6755d2ec42c63b9da675ab01b380f572c68d1744f1b2aef1568d81dbb9b5586b7204f615d17d206600bcec2208f1018c1ca98d301d8048a4d2700413c57a798ca1c710607069084a9105304dcf69e5286725ab69125d5be1a7c9a4b44718bab6987907f371a30d1373c96d25204fbc5a83a1350deb05886841bb49d042164c1a52287cc030937fd67d8810adfe9833af1906403f0135d7c82d7c4c82d780c0d93dfca8e09d14cc096fb4f6ccb03777ba386a8102578a18d741a6e9abd11187509d41a9cc5e3a298e82950150d03b67f860957212c59876cfe254b6b0e033dc6260906f5d2b7035c13837c3a820ed28cee0404b4ba272d58ce3f211dc3d63c5aa0eb4d06f1314e38134ab365b7e4e3bc9f2e90b006c13f1d5a21fc2fe12e4aa5b07478c419da3eff4c41d6d2b07e6f7acefe0adadc804fd812bc9fbdbd43293af9ce8d09583a7e60733be8b40295c40b8c985ffbdc4a3b109df6d2ac24e9c633eced95b906506e8d7a7dec16e3106ff772b26944144c055a2a7ce770d4108a17609bb2d0c45714e6b9c2d72b776ba2f2a792fbea561782deaad65db17d627867148b72e51086c8040b71e1ce9a8db501426144ffc154dc5108781f16fd1290dae3410cd8d26181c7b680205b98532448a541559af46903128b9695426012d1a1e433dc896f7590051ab122741192d3a1db7e9df1a01c3b54dd23521e89baaeb4c36d6bf54ac041ce275fb2fb1a3dd24b419fb6e5722bd6dadc141b87c164c4810ea415a6f916f0040b392906c641e901bec283076354a03c7dfbb6b6eacfdb9c2654502a15fb3928369f4f79189719a141c032572b588351ec561b76df6a566a99ae924710d36e83a4d3a650360e72894ecc0d288e97bdccd5dd99e041ba70a3a51ccb38fd7d4cf1842225993cddad5a95191861ca74d9ef79092c2318d0624255e7894e6656aefd51f0629f0fea48bbc4cdabba91dd7d93c309d0553711ccd6784668053ed82983b82d6f8063f1762ce25e4926a8b2cda4805eb11371d13be6fd0bb1f587857d0dc622a4f101842f1348689bd8f4d80490805232738eddee44a710dbb30a3ce70fd931affc87997aa00acf07565b96933c1dccf705e314e13d9983b07516cab783de3ca228dc420a598108bf02da5318010d019475432cb42e820996336d8f40b9de69e8af439cf791d53518af53240567f31fcd5649c8b602147cfe5bb0e865c03625c334dfca00204bf88f625ab4d470a75d003914a708000d2c5c472872927c898a559047d2173e508f7a3036086425f69915f13189b8545d50ca8436fa66432e1d59f381840728db6cb36e8bd55413d9235c814631ec20c98ddb1d5050b484813f8480254438f123527fd5ba4f25a7b1749965389e289f66d339bf6590158db2255ec4c883be339549f6b92cf8914f71b15da7549fb9e0f63438c8ebb77c52af64853735e61df9610a0c8b0d9dac6fc8ba190887bcecab4773695a59d2489f37b56fa931d29011d2d4668e8699725ea3a130ce6667d5a8ae331695045291bde27d1a452e7b4fb28eca98daea6a80586e1a44d78b5445bd0c15aebfb3bdfa378cfa1d0c5a3b971aca10b05d0671070baa40efe2663778741e7620919582aa79a0a700d9a270e8f7d0606c94dc2146a5ad82b1d436a7742b2990c66d9cc22c679101b147c26fbcc87dbebaa732d829e312da6139ea0318dbe18ab161ac0c1dc83d45ca042743cb9c4c286c2fb83bd33ae4a31488bf44b3521c0e7dbc706fcf84a5a817ed0fb8735adcfdd0a11c9450576093a9e2fcb64036c1cd06cb04d3d5dcaca6798e79d79fae072c44ed8000315d42f3b2d08701f40b3a11796e643097e09159442085e58701ad34c1ea71c62e7739aaa9d1a5120818bf1a0ab4409aceccef78d6f848f5355b05c707022ce196e6fb64cf90f088b7057b851d2cf6e7f60cf2ac3b658a13cb9c7d3768c78fadf8c21f99fc1a8538a28352ef7084716605492cb90db97f495f9a2230c90852c8c5e4a5ed2707fc5ff19646fc280759987d7f66d3e428f67bdde36e006d7a3bd42f6072333e18c09a3e50fce94b66f2ba004f2e7fc541f5f866b589a617c75112c55d7fde53e397f2411724caaa9f5a07078688160f539cb0b1ba51293994715d9ed574a82f283ba4c5b079b303bce75867b89570570e75eaf4a266f21081895cae526db8b97c411fab439b601732f3980500fd4b0edc9e4a198f7dae3cbeb9e81bba81994212d3418ab63d223226580308f6cb4dd2ac21ce66d50b74d15d44f17ecb9511a6dc6d2ab245dae8160aaf87e19350427b6e27d56aa224a9cc591c61f0544ebbf1bb2b84f0f80152a10264dc6d0ecdd1651801543cb452c75b0db1ad706d3a78030cbd14ee512ea3c1ea3e413d00e6509ded05ac09a27c69c8ecfb62dfcaec8b3ec5c0a377460cd408a1861017db318dc21be3960bda1752b3d205152dabb44020e75cbecebe990ca6022ef24d24b0f3ff7a23a606a8512664b061efcb5c12c997c6c2b5081ac189a7d1060ef84d8dba10f7d3257d29ba0e91f126198ce3771d781878c23e7f18d986281129bf74b115513b25b719fa21e2bb3013f705f4ddcd2deed19ce54f150f3c7ca3e2aa813bf6d9e73d9abc61a2df904eb3bb9ed1602501a3d96db1451c06c1e6d59bc0930c73c9d3786f7d94defca31f1835b892503baf8ae818e4495fa18ffdf5b03269834f08ee82006d1ea2214b7c463e0af8ff25ec61b2200ef34d91e3821751232a3951de3ada51f2e5ec6b908d86de211ba893fb44573f2f2af3b78af12605f3b006c7a684e7e0168f977f70998fb65dd7495d6a9c2ab6e77246a62530500a5ea4497824783275dcc25eec202fc2de10c7cfcfa2faa04b7e5e6ab645e8f2af2a5328342a4224f0a9dc592bc6f612a6ae7fbf1ee10d02d387045518f24d0a51f9030b592a1e2f84085409245c0a065dd7a72c96b7c36b41b6b00d1924ae6c44ea0778214fdb07dbdfcf57701d325d80488038715bfb83b7c29cc35017f680ea8e43e3674cf682736255362609f0bcc62d95f2539d436e0868a0075c7590a2d4594d65bd9fac994f75e79fb5a28ef0112e4ab680ea5e6e75a1d6fb3531c29463a48a2c398f2f56342bff30f31d355c1f6a99193c76d067ec16485a3d2a04db1b1f6161e0f1a2b2424de51064193a608805da216e2e65f1d7f810ac827f798b6907ffa057d3da457e55d6045830fd9a1a593686dbfe734d5a34ec1f3f94fad7268dc3d2c41d85727a92044ec6ec4dd9fd03af1d731f62c3dad2d13c4a1ac5ffed139b7f21122f6bba59488200494b11e91e93da99c8c4ee7c903b4c12a7e82d0bc3e1ebce3284428252d7623c8ccfc00e0037865b18fef1ed554924368d9dd08094640982f748768da4664d7eb27aa7128334bb273eb548af4a7b77040329743b8ea872eceb3191f0601553263751af7285e235c26eaf22cf0fb9d1417ea68146773cb1586d62d020b9a992952dd780502e4f2544952e8a1aefc742f61066466b734b6af31987a98c2f487b4e472ebb8407238078c15883e387350fd4ad904e847c103815c8831c87b3e6749bb2513cabc89dcd1d7535a7f6d23f6a334b99c35394af3d9a49bb286882168b72adf28561caa12d356f75b1ea04a33fdc581e0d2c5c20a972e9b90091dfa007cc09548cd7032a00bed69981ea40ffa799658be49cfda61a98f0fe00e598039dde8343bf40dee73e25ff0ac28f30db2db7d23d69508e888cfcc66b685d1cf3d8d268eb5921f01a77bf98aab38e112348cca54aec1f45813759a59129c0d1d5f2a16a302c3700952e0574564493eb130acfb23734040d720e108ed3c6c88eb4261df4298a6880562606f9feb0b41cc5b5cb8f7d5242b7109939c03f7dd38bf47afa063954b7c0b2d5248c9efe4e653632602d42fb74da3c63c5e2208501b2c38648df347b4fb8ce9165fc13c957cbe37a7776886a878880789cfcaf3591c73fcac1d362ef53c1733599ba72631fadd077e32ed529e5eee6762a66146b4b9bc3ba666a2c7bc90d2fa3310187d0eeb2ebfc902f4e8b9ed411f30f2cf575c741c2b5f27bc949c62d5675d64f5592b247e6f4a090f048b7ad54f930f9f49a3c982a2160f17f9b2430d61333bc78003e15fca29fcd90e03cc76267808f9c8bfe78321167bbc1cebae6a79bdbc759db87ecb1c194b5c30ea4399667d6f52afab06af468ced44cb146d56a1f155275b9b7f8612a8359121613291a0fe1c722865e5e3db1e2a9a2e64a0f3c9fd7ff5571d1f71c06c1297d021fea3345125a9c0a57e1afa299dfab28e41a97093f353c640fb5710581aa0c26df64b1d04f55b9953666198bc8c1d4948c94cf2533afa580d4149721bfa530fa0ffac482db3b22647c4125c14c8bb229ec8ca9a6c113ba7186198f4b7741340306f3e0d7dcd99e468c43d3bf4e1956fded9e1dfc0d0db2644db9ecf7fa67702085ed79767f9c3bd458cf77108c306200c76bb5b4433276687a3c6e44308e8b53c31f04dbcc7c63b32351908b0d0b522acc910f90d811806bb14d40531461176938161ea95c1d5bed947a216550c9ec81d6d60eb3a8acd1a363e2507eb269437ee4617999876892e488881fa0c122e13dca8ac151d2c325090a2f001951152380788d9356b802ddc02dd21837374038dc503921db8aaa08864c24ca4b1e4b32e6108fbcb0c594473dc758eaf5ed223a047c6a5c7eed9fa19174312c49164b6510a5568c6d5e67b6194c40ab7b787c0465912998b5c2317a965974a67ec078b9454a8b02a7a0ae6408672f3f3869235d0b7c56f39f0a08643db318485c9003559eeebce11c28314de37a4e67310ea5fc7a016d25e815a5d3815723ab44a1e6c76d4d7ead356db2460a818bcb64fb4c329f7e2b4f9502df0485450eeb687ab3a35a41d0cfebe0db5bbdb4a7ca7b40f11da6392e08217a003452d253bcffa5d58cb5da423625b1ccc176341f216686dcba738e6b75fa83de7dfe56409c6c34191c6e84fbfb6a3ce0e5cffb79684d34080062426a1e5629038c4343f1ff339154298fb1b0c14d843dae70dc3a34168e9fcf866be7f879019ae0ff248ab7c7f03e3e4a47cbfd19edbee9526dc039e30823e075036d0d5c96a81528c164efbb4638d1510910d1629c2fed7a4a667875dc8f2031a9adaa95ae3b757ea9c1b5754db8e84644aeac01863169d55e0182133259be50b1c7807faf7ab18e7d535ab88a7be27253ab8c83dfae702e03e75ceda515db083e922affccec32232ba8609c6f79e34285a240104587fcb0e387788142a4aceaec5e8c77cfaacc76ae4706339ac7a89b37415fa6b9345e1293c09984f94302a0dd4ef52d1d90914f4303966ae679c15de778c3969f550ab9360c94d797933fad1e52e34f01642f3ea7f5bce558993506a97146480807902a3c639382338528b0bdf729ed8255e750e2ebf1c01864694853cfb1518242d338ef5eff27f58a2e214d0638f4623475451dc4ca0041733f201e8c76318931842a1d76e2437e8e15cc75b4ee587a3f4567e0b49c6f8f01ca0a7c522ba9e678f6a34d6ef43c3aa0d58216dbac122b47fc445cd376b21676c8aec25569cd48267d2f8842fa50c0065570ab78cafe878141a126b91d840260f2ad77b9ff57f62e46d8056c669de975baf93871939bd63fe6a9a2843638c6030aca0089beb11f60218a3140716e61e2d74057b60f85baac25e14ac07f8994eaddb678ee27234e969ee1b27e25e5d8f985eef9667ff1dc606fc4ff67cfc70113c7462a1f4ff01e6981d25f34012b0ace6d2bca1f9bfcf0bd347738981218b285a9f7dc1ae02417152e8610c51b041d6f8c9635adbf5e6599704d9055a5e5cfd45c55db2919a7f260bbf833feeab3c2887f2ee0111c27f70b6c1b8472d301275c617b51a84afaf212fe9e5f5ea1ef0134ccd0626fa40ea2f33ef81f9d0073e5ffb88c4588de417f8a09b8f4176338ae56fdf88e466d088fb406e800727f146dd5b3c2d82697a0fd7a0cd25234f178c15002c39393da78c163cf7e92722453662b6c18cbc815b26168e3e36b4828cfebea3a466cdf22dd20f2764dd27b70dd259fadb2df01acfc0c883c21f16adef26c7b418c703aa1d2ff4b3b4cbb435dac548901b07e69bfedebafa8369be624fb40d2a63b9f870302956cf01eab9dab40f5a757a6aacef289a62c4c4a23401855052e7ba702ba6da8b97e96b7288d21f68002f8b9ae82f26444d702f7f1d77eebd8c887441cf65f99157d80b3f7681dc44d735aedc0a6e762c4b6e2d4122c4d0a51a157833e4ba63f35fb48561b78f55970547e6c4ff3c0fcf62fd1912ea490d0c7f17ef1b4d31a739eccb95abe866dcecb138d1ff1841ff43cb38916c63763900cf474a32f1ceb8d736376120d7697f7f6269493252d5ce83702d5bf07cf6ad6b2e881776d359fec61920290d3ac2a0d447fc058aee3fddda0f2ee829a988d3a6b59ce044707a54d9fe8837cdd00a042b0b70d2ca6450c69280e3dc920ddc8e535bc6f71a7824df7dfff0f74dddef92c9b7ddf5d6b7657fee4734003e238ed1569edbe19227b73ae01316f9419d8d79dba3ecbebb483d3fcd1e26e860558627f452f7d495e9a7648cbb14bf7e2810ee9e57d3a3edd6d4e2bf4c358c8c961d7d919df7ec147a4bd3e3828877e8b0148340cdfa6523032504b4d9c4ff32b91f5d1b5d25b91430f51e0e418fa1a404c0965ef75c4244c1012e4e0f74d3f81712735faf2ff64a48e1e93ed4b92950ff27bbaf9ccde8e83bc5816372ffc4bf909bc71e02ba8fc3236716c352403511a948cfc9d4f33c28836aa4c54bb9acf7bba5697ad029b9e7314942fbfda040bf5edeaee7755a71f044930b64cb6695a1709349123d824bc133bbab2a1823084746ada9d1054d42cbc03b0880997844f95625b9c5df480209e15256ab315aaad3422be5b9fc14c364f0c6c47bd612ce31614e6adb91312292f573c2c72da2c179a39cd7842e0d5d5ab94283a7aa009a1af0e163fc5d561b71e3204ec8ac363306deafb608bc38b0c82d670bf7188bdbe18a3c1db9f6788dc20de048f1e5a384f3f315fcb53c0308b7728b1248d6b6db4ef3fd2c27fdef62a87418fbca003186ee083c94be4f47814c3240258e8a8c33da6a152155ca997c6b51dfd843814f75891f33ade26024afc04d19636c38e99368a95923601bd40f0c89ba5b4c05440923871d74bd09b5d88efa971aead47d20e41ff7c005958818d524c10fddaca246e0fa1145057879b978c76d725fd3c06c1f7629640bf158268241031ef50211065b8297b024ec68d3175668a9647855794a96f4e084b583509a5f22eceeb9780de10a51cc755f93002b5997ff87e11e9d8eb3e95523b5cc472d63ba51b8fa0fd7f5250a8068fc8d0f471e55136b8e1d529433a24ebe2eeaf86b216ce1c28707e83fd9c64f3ae287d3bc0f90a5299ec10d0001415337be6eea04add5f4c59692cf1ed24df9d31152c089989c2fe8ec08a50833305871205050c3f491b5b9cc9acbdb423a0666874089e897fb7cb8c27fc58d55916d2070a303bfc98fbf963331d711f8ba9633170e26969f0877391815bcf96e970ec59d89b78ef64985aec9a70627005921f863e8809f73ab2ce62e69968d922736802fd3a3c9ff60c6822f8afa9da2ed4635866feefd7b5582893806495fb1ad7f531fafbd1b6c2e88810093a4fe2169a369074c86d3e52ee986e38919a0c007a33ab58116738a6e27ab43deccb9af8761674e2af46133051c9ace76a5f65c28d4d50375bcfe385c0babe62810d580533a67d7e977244b6b1412d94ec0e0e7dfdf64f823b51dda074ec1330466dff395446fc58904793e1b569b8c03b9dd312651901a2afb6dc3227ad7e7a745ac6b7df60969c940184ffd628cadc618270a420f18415d49028f4e210004b3d04895c0a3bc179bf5cbc61410223af79e2f59d55d108a7a1a4fda8d65b02219ae1afed434fa9ef19fe8fa8e40fe83288f39b8a0008d18d4b93077b0a31c4a9f1bda12b17ca17f58ecb9f3bd7b1854780859fa34177efec25ff68b20862736d76ef8642134e9045bb4a9807a1b94d95edc003b13a076c44213f4cc703a9bcc0b5ace72de92cc6cf8f4614fa33073a29e8d93ad78cb13dc7b578a64330039a911414a0f6f020062a2eeb84699941e65457740c4856a393be9164c00509ba8b6b9e75c47419cec82a4d1e3d42711ec1b6f2b8844b6533ef4372245e36d3fcbbd470325b260e87ca4728630a6791062e45598a1b62d90dfc2aa71ddd4d47009e58fb5c7833a6366c91bc812bf11d4dd19b415c0a683c79c82a3a88c19773ede4641a01f587d82b4088896bad951ec854cf2d2959cf8ef68523a1c7022e4340bfce1f960248e86759b50b0316cd84ba92b22fa68490ea722fb901021c0ebd4d59998835eecdc774640cd7c0038ecde25a11d497d0a761c246c47da6f1e9f34154f97e9b2de74944673417b5e69893238e58bcccf232d60182137b9930da9c8db30bd2e9f443a01432fa078e509ad686dba305f4861954434ee01592329675a1af0bf42253b42bf12bcb56d164858db08fac2f7f6c156a0f470160813a9e65d1fce652a01c88e5d6f411a5003f87bdfb8fc05ef06164b0159153b953a7b30201e77773b1cb40e0391bd15b4720229bdb267273d3c88a5547081a2ea72435d7be53fa6ab018d5d34cd90aa6359932ef5cb730f5c70970a4de3e2d2464f424ce7e13549b994c70bcd6a7d33143406e26ac005d31cefd8c786ed4aee01d969dc7b944f38f8fd07f33ce4da530dd79d60d055e72e1207f72525dd0b593a063fb2c1c69a22acb63b770345b272c6f122b8b9b7fa1d9b4224f6005f65ef8e9b56958dbd6f9be795f564f1ee1c018e4d5bb846f369a9f97ed11ec51728be8dfe7c5c30a3e3f4be1169fc8ca6e257b56dc2c7d9620a82dddae6f6b8f5a45503bbbadc7d97cde78dfa99032a6cf17dad21fa27acaffecb047b5ec2a95ba605b3cdd24c52fc9280f4c42b62df3f236396a13071832c8b660d00306b5b1913a6921861c7edfc978fa7d4a617027a8b012ca411db9cd581f349db21c2c63c783b9d9dbfb6dcf5775d9fe505b42cb771b0deb729713d45738e41c4a9a41f96086e874aaa5ef4ffbb96af6c43544cb25280711b24573f800280ed68105dc0a81cbcb171ece4acf605f54d2d7f3159e14ad5626d83c79d2ca27d285ffca575b38cfa3e35114a5f5a7b32032437b98fc841dc53a4faa1545cec96eb74bc5059f82fb87d64adadf5453b627456c30e47e771fa1b6a01399d8de68020a35b6598f9093ebec4d2465dfb751832461ac2b8298639d71ec30a06d8bbb119f320a529cd012473c40dc7492cb1ad295998bdf5ab61ae7a9ffddcb4a3026995f1b42edc9c104ffd9a0ed831c49bfd3102959d9d940f10d0aa20349d7b75b7d66714f45594937486a9d8ab3d80060ab0549ed65c8ac527decad0ca4dd32ffc0f7667d71ec7cd1602a41368116991449d85982a39a013ad464ca61bcd92da16f1a84ccf93285b690191302e754e0eaf5432d61d290e756d3d71de6741456bbe52da55aea57cf7140b9b8c691c17a4f4ce8af399b6f99bfe825070027819385f6a5d0ea00b8ac705323d26b24680f16ec1a7516a86c27bfce296939411fd61c201f5a92b65a27229586712cbfb7cfa2141ae9c256a9ae320164f5c0aa962c21a98311c6b8f834ad133a03bcd26d2c7d36d6bbe7ffb6d4cc4c1a731ed8b91ffca7f5d16d3a3e4dd45dc12e5a8149f7b2fccdd665372a20805205668da09356987520d4f67973415ec3933e9a0c5f8d6fb9360a7220d7653b18fffb39963d57d55a3fa4328aa7f9afc3394944660446c0d6215e7c8bb3ceae5012a22061cc0e6f30218dbe4a376fcfd97f5b6536a5231bc9d7a5d8baeab627adfce0b265d7d615b4c88c96497ffe9d17f1db1987d15111093c57fdfe0318468b0378a5f901dec3a40c6cff75e1be76e39870df443be6d0638d958d608f20ca4d061e465d0eaff1548ec900558304b8ae48de54b974e36b9e8e684ccabf981efbc5eec6fe8a1b370c92781739c191823211866604046f98f37c5e09bc92e76e77bd189d079b52ab47f1d8360a30427d57da207f26721a6b4c1ec8899ee097f675abd9c3a5a4da9107a28c157c44874540fa0f278ef51e943c7303d5e13e81730a63ee61b43242bef5061ac142670c0fbb6b9cac45e99d9c24494a7bad4361f9958380fa84629d71008ffd907e6a685f320d840919caa764ed881e0aab3ecab00aeaa059f918ee226e6bf52b0f4c9f68bcb8659e1b034fca5a4652e73758d19001e79a82beee476660aba9a62fef2ae6a1a56d1824f7303e012a037a072a60d75db9ffc04b608f594b92a5b92b50fcdb69492b6c8b392ea7ac4b848209140da2afb99a11a5cf394add789e335dc71c115587a05571bd41adbcdec9a136437f373fa51b36c41a9c249512bbcb4dc3c9b0b7a9b35676ce35f0ac4e964d70cd170f9c6f8672f5c487e67c40a7202a2f171f05e565a4ca89878420722494ddbc8443f4640d5591829abd51fb6b9ab164e790db7c469e93f88ea340b29b2e1218e9a2c1a94c8b505d760ad6727c7a45e2a454cb0aa2502d0c24298c6b6abc72c223ced7b82596240871a408020e0cada23eebb482570ef2f2ed7543ceafdfec211eb3b2df1b1a4c2fc37f08d8e1fe9f959cbdf5b3e1b997c596e3f380e8491a068d185110ba4f2cb44f7698a192d118da5bc4354b70900e7c77d95a833808319e8db418de1317f14275f70249bc975fe38a42541a46a7fa21eaf841c7e42cf5df7b82c88513c229bb37de98174648b398dbb8c9153ec9ca067827a05970a084de83722086c9a6f31e46b5c4527027de5c8b040fbf6a1e715af55de8b327274206bf3eb7dcf186fd075373ad4641c24fcc124306e7bb2c025fcb41a67462834f308b86eaecf5cd5e80b3280a5266756f32a03659542e068e797d201635c28ba4d8695bd3d0b09462325a9690037b21074b9560b25159fe95a141cd4830d581459062207a79891cdb3531372b1a7a8e610ece8633c4d4b3c0428555c668e082b6dbbe20f5d77df6734b41eac78eec94d5894e4860d83f2bfc211f89071534483e6555cdfc9016d10d1542eaf650672cab3e53902bcea546ae23a5cb4648ee83f8eac89cbac2846dee466588e37cb33c1fdbe2be461aa714556f5f82702924e05392af1933ab5e5fedd85e46e5d0680a3cf4d296621ba59d237c1feb2a5bac0cdcee019bce50a92444ce1753e5f72cbe69a7ad07e01461e771d771400b7964b48017010fe0816a24b0ac085c6b575370d0a19bc7081bb7f97bbc8429f4112bacae821e245c6e7ebf2fe9a370cabd64a81d93ed20cae3bddbad35e9f05a77dd9effbcb7586ee4faa44d4e5bbaf7386a8f2d486dc7dfa17e6f4c4d16b907c34d2feef833c77f8add8b132e7e92ec67245ed1b92f8fa1338dd2280881624b1c640cb7247ef0872cd0b9bdbec4939941e9d9c20ec48b7adf3056b0483174b770d45c3a50386e122d471771c0598759f2326f642ff12d6c3d0df82763a9a0f269af3b9c47b3749a5c5b96e86e57ae21f40d756c5454c2c2157f122112e271fd9176b50ca8ff2830c3aa2bbd5a5c27361f0b9dadc955c08e5ef17c8d50d7c2e628752d398ce868a42f370d21f56cb300f00e3145711120939b8ea4ed61df632995c44a67e8feae56e9ea5194badca1a6b8253cf14178a139c795f62c612f9f650e590c1065a69148181524f982604459842a300e9efd0ebd9f7d41a68a35004406f1c226ef3bf0678a8076ef7bc7b98f1d4b6bdb8be8a7b85ca83409f7781af55007a1ad7c92f61c8cabcb915b9d0e7e101689f01828dea486c60c30693de0dea9e450226fe7cb9add11123599c67e127797050323579bb2f6b01f2991439f032e5566cd426dbe92a83f22024079cc61262d66b104d3ed666b3389c63bd0fe2deb5bdc0b0070c8eaa7daaa1b59ab90936a3b622664b27f5cff06948d0d118885ee721cfcddbff0a143a36f7a8ff54de7f92a8c05c0a672b05225536366184e52a8e0c0184ea50a1f8559ee3fa635a800b2fef3fce01380f3158ef3425a65ce2395fc35a058b58a294b2b89613c80b4e675ec13a37f520a80b70b3e152dd297fab3d21869a65438b20bcccc3f16040e2c857a0e6d36ffc7907b1c19d8dfdd3f83c60036ed0c90d64c12d04de97ff423291694856606afa6c241bc23a2dcd532d515263bcb722fbf015293d74b144cfa38b751797a902119427ed3bfb672051f8172fd9f002e234310938b2836fbb663597699ede551638e00741102babbf2ce0f6567dfc4ad56c9654ed0db1bc432079117b02ad77cce6c5e8601a3568d5e5778b694a35b4bdd4827fdeb5e372b092af28645afec1da9e053b62f2ece5141d3364fc66e06a2fb8d8030ef70a87fdc3750f70d0fb24f27c0fdae3c5dc3ae09a07011b76bee1b355989cbae09cbbe416c9ff39a6810c8a3688b6e8930a1f3ef0ba6aa81da941c973476969ec3d8e27395f19b88c7c32f03d7a0cda73f149e801b0ce728f98a4fb5d7d54de8567fbda77181a291f0211da3cee9b198483e7602cb75f06c874612950e627ff8f720da8a42ba4f96cd4cc2409d16cd2c6d5b9a507c89540f445cda09d7fa5ed44bd32788b49332330a17585cc2f5a702c0212a7ad6153a6c7c5dbe217e37e55c463b55602a3cfe0ae62a1722cfb2ac086e8093d45e19dc866b2bfb9b3b3d92b514789d276fb862d82523f7a4803b4077d99971bd38762dbbbbbd11723bf4282c2b0d715fcba75b8c99ea78a56dea676ab13a8c389d27367d4dbb583ecb357fdd12af7813d4a3c14a36a29ec918afab990a08b28a8e376eebe4516e64097e0b34510a241b2e4440f27160a0c36c94ed5a6250b3f9d2a25a670ff65f46bd4557dfb75df88afbfd12b9b2df87d18e4b497136a0beaec6194e63d48255a7a4bc0dfcb1a1ac04b0c24a8a37ae8420542eace07c31bd78775f3414cd29bbf564b5418c63e400f8d7d93f94f4ccf9a1da4141d158c557fcc89aaa70c20aec04a34115fd1c9498c50d5d56e2f7d9de7698869548096f2d02df48f48f67bcea82621774a27ed4706177ef05ea727aa1b4b4a0574d3f38a03dd5dc0988fa6e57a18c6d164ec01488d20fe6311bc11922bbde319fbeca550174409d387f33dbf11da9eef0bc2f98e427bfd14a5269826587a90151a1695df6ac56e2123aa9d0f5180fd8b3ac7ae9c1c516b902b3507af62079d3a1f39c5a06df02a85126d10f5017e9de8d42909603623d39d79643a33bdcc5706e362819d7692005f6712016ccc31a1cd64e5663cb811a17e97093222448d616b786a13de05b7f382fc444001f09a1dd9ff517a7d1aed770f9e79cafa031b42c8064cb1fd43365f870e3b4e1fa3917a9e2c324e22b0029a70a58190c9b397f3e68eae7bb6e0b1401d8c6d2eef94a443ba930f9c57e6dcce8f143834433cc3db1ce9108906687f3007561e1fc77c9086f4d4a8554a9d054a293ddfc08a0ab5a40fa649825fa1584195e342117ab23c4576035adca358173d1233e612c11fde2818c6400bba6786412633e2b4fced7f7ca387a087a27215429526efcc356090e067c051a47a658c70ff549b00e1eb90f7d94f2984b19edd2ccb99879fbf7119bb2fb30fd491190f0c3938198f940e2b5e1d491ee4226fe9a0e9b3bf5f266cddb307408dde637c960f4df8a522711f6e1197d3f22c7b43bfb11a2b37394a2c8cf09d457a51091f8e3af98da2d598ada01d0d8597f3564b9368450b66b2a9dac2ad06874b6f9ee18d3cc782bde398b4c5c0b82699a3043dcc434e5e8034cb04f4f98d5564240a3cffd88d4d535ba8faf8e07ce0329fe51ba23eceefb407666019b467af0f4a1e9bc98229e5a1e38976ed8de5ae63db67e9435a812b8d4a8e39caa4585c321debe6559697e01aaf2d9c7056ce4f0ff40309ad03642f69a33801b5e223b83fea380a19cc00e83fd8ddc419a41b337b9f6d3a5d6903d98bb46d3e9fa67330bc29dc0e2573b896f6237bab0fe0e7a461dad1de648e78e6af1ac78eaf4004bee929ad939a075d77223169b7001aef4d2a2a03f5a7c658c1353c0810983bdf32fb7fb373569267e1a847724ef08f808d27f31b684e98d13cec8ffc049bc5e8aa6616e0b947f0fcc621d091bafe2c24758adc8cba861eb422026bde39f675078bc859aa706039cffe82e253d5592050b9622c71fcf0dcf021d2b246cb177dd997498aefcff70d62b97f5cdd6ceba0d3bda7cdb10ffe3f09c349a79de1428fcef2e223af5b39bebcdb4d26772d7b349d18f07642c54f1909203f1ee44a4e150d26f6185cbb1ae426b0802f7a11e89715521c4352876062433487532802a83824d28c3c24cfd504015edbeb7a01d6aad9e4aa5facdbc29b2fa5aac7540f5eebf5f8a25847825615dd105d087105908f7b007adf433a3a266f98589b0b2ee39eb13925adae56aedc24ad187db077f061dbcfd1af9188db948573a345004de8c909f9c053faa202ca4abdf08b33db5e3454a57731f8a4b70561215ad4bdd0540f4edd61e720d9ff7b98e2f24deeb98c8e6f545b6b90e262034421b00019dcfa75ac864e59f834daf643b0a09c5e9d8304b5fb9228ac7baca7df55c8fabf459c9c47001a76b5125df5ecfaa3234fdaabf67d811ab7870f3d0c440bb067fb48311b5208693478c1ceb8decbbc981b1c7f73cd703757b7229b15aa6baa49eaa9c21eab84d849c8b781b683313e08904ac2caecd05f034cf247dfbc0dd693fb51a3240709d0f05e205fda71e64292fb8e000fd0e7acbc9b77c2aace50b092998c3b0bd4cdacdc0e32d2ab3942fb12349046308c8f5d320abdac0bd7cc1ff62ede19fd1a0d1dea82bbf40893d36a57485b401a48218b2ac311c47ddf79f604d446d288dfeae9f2d4ae9e142df27a7661271b7695088c015c96c776baca68f45c6b5ff327cc278aad8ec9a49bcc3ed2cdb621d2ca4b830a414e0f2a9477134267aee83cefdf33286f664cb4bc499d8574ad1608609d26581543b3f07d26e3869cde1b36a6de59783722220248ed54f82af103305c6bf2a99c95c3c21650ee4c42453c8600330d4a5e7872501cafae0c148afe90443a15108abca88fb0e2e7e0f82c35b2cda7b2356389ab8da7bbac123cf662dfd89960632cff15a50cf9908c1220edf14a279acd896d351979243567623c37d79c9c6accae7c6ce765434f3f598c6ea1ff38b8a27d04afe9e6032b94ec805bc36c1849b49f15b2eb731ce58be9670f8d17bed7f9c94fcc20b20d52db915d8b53de940669c5c13ad4274d13661ddf647b7af86876a7c6b848d2f2bab1a805fc660721bdf289e98401f7021d4c1502b9728940bbb00805345d3ecdfe892b82f25ba051d252a0a1975a90e5da369f8cd70686737fb2dfec2da6e1dc698727286e5bf4b54213392be1f3147a8d0d2cf74985337c3a0f660f1cf47e70edb05c518ad139443285de15cef394a72968b980ec16add7f211b040b33816087e418f3db2be1df390dfdaeff219b8d2c941f1a5ecfa0d2d480abac9cdae4e818028bfcd373769db88b5525909adf922b3a012d88485c9f67c75455a02eebd70076aaacc935173264cf419108984bc9e411d73a6fe8b5ca028e8d78abf4acdd9935ca68ac27fb8759bf2636bc7a8f854809d999e3b2b3cadb513ee49ca1473a88cac71ed69040f3ae17e6dea23b35bf127bcc9f81c2b960721828f6739939fe9e86e2a9b8767767bf21a1498414f9b560365ec7267f65fcd2942600391b28689574d280a69acad9e1f73846ac7cd8b0a6532f49345056b24a9224405a1f60e4bdf2f4525ae3b59929d9d7ebfd3fe3a153bbaf146c4a557b4bdd0c0f8ede291771c2d58506dbf9219202b5b0e4dcb34ea4e40d3f585b441cf22a967e1143dcf81a321e782d9ea626f7b9d071ed6f01615f6de6263946f7b862f9bbe3a24083e4c8a3ade341191abf4308f0cc6ae3308101a486bc0008c1b272a257d97a79533d3f4d203ab5ef1cd1be1a105e2851674ea99e1df99cb5712efa8aee2a11dabde57f99c01f1dfa6cacce4b995ee5cfd9aad44758fa444afbb8e808be3af9dd04242e20234bfbd85b8987b4e32d9217c02f38102a4c5eedff38d4756918c09f1fafe9f8e6c0815cf1bb45b54c4dac5c733236693d9e5778068f33a1cd9c477bb766bd300a9f149db7a5bc1efbc6a396febecee62342fde8653cff1ad6698d28f1b25840251871eb7c66b0d94e4df4c7e4c46dc1ee7d58635ce1263222b9bc105e3d2225742a1e3af315bc25a4c8a4185329c19c75084900bcdf74ea0b2b0ae237657e0b47e720b366fb43d35e1892cc8cb6845caeed3e5082587fb114014ae6882518ef6bfa2dffc0d80c373546ae5729bfc98fa85f4713323e7775105534b437359950618809b13893c5b60bd4da2971f9bc13895e6ff6f9c2c60d2890b687df574ccfbe2a11a3f0ee6369c603e669811826ca89ef1d52b6c0d3a0dd5ea60749313b74321f1a5567b8b82337088c8acba047c7663c8b8287df30fb3c7a237bfb1118c78097fb417f89a484520ed0ca7f3f7d11a0b31f909f8152cdd68ac0495e1f385c4e48959a146743b14b88abde34e94c65407f24145babca282ca4be65d0717e7374c8cc1b0594de72ffa40601ebe4283b13cbc241291d06fa8677e81e97869b8a9d31c6befa1cff3727be83fa8441806f864be3c7f824b9d0fb7966eff96b17cdb6cd3483e07ab91b110b119ba660e6ae06a645a2233c1042a77db1442cd5307dd33470d4011ab0982a5df46dc74e738b3b48489c764803403c2c1c76e1d776723182f4cdd756502b5717de14910d5a68b3ab5bc54ed4a3459232623bc44d1acd48ced3e54459871464a04ce430f42f095e4272799111276689dc5dbe3812324c96adb3fbcc18b3d87dba74bb5d03aeea833bad8aecec2e2f0b44911982aaf441d127479fd0477afde88e339865c7b92b3c104ade94bbeb2032033c3865da51231ec0c9a9c5f7f38a004fd807ebe44a59613657f8fa9921c31cb02eac355544c27f01e993ef8aa716f08e4853d050c14403646b7b53b07029df942396ae1b769f38af2332141ed4608fc4e5ad5899eda2fe551a98734a4374d9280d64ba5c1e8428e2aa4a1b58712f1b44fc99c91ae20d73da76d4829c71a5d82561a9e3b3c3d7731c3460ee019e81d3e35fd610b01bfbbee6b0c59580b4a5452802015cead333a6a9d82d57886f5a08f014e6d0f5c9b3e14da601fa72157fc1ca07bd9038a691c1346e3ea4f318760f84bc939651c581a266e282612117604c3b105f2e30b49443162f649f8426aab0bc3a7f044e0b9543646b1fb35c74066742123a0ec0bdada8ee0c04418bdcc70f81379eec2c20ce659b27d8825bd5e6b734edc3ed5bf42836c263f7fc3af065e812c7835d4e1d925e6a99fbe9d017d315bfcf2677786aadf5256841d0722d0fe728785dc6a0a33b017a87a47a7e1f8efc67cb5a45eb22e03dca87360b251bef5bb73e41af785536e2fb2bdf901b88ce0c9a6e93092774e79a8a17dc1cd798ed205cda82ba3c4d2d90a0a67649aef298fec04bbc9633ce6186bc7f53a41544b2f153151bc3d6ad86a3d7c59a468af233abf4ae5c00d9fdc0e6e04a770bf30a67f1e63da4300092d26865c277466f2c6f2a527d2be2705b11bf651f0a17890140ac26e2f3bdd658655ebb5ea269344c9b09cf15584f5d8cf3ed770b37c01e5951449de00a4fc356930556328853101e2af3040e018729c51496701cbd89379e8c628f9003ca690f8ac32c1e6e1fc43a798c3c52969fb98d6543507dd961a8e1f0036e4a271817bb42722a3932f25be64924c8eb53cd4f1255672ecdfa9b59810264ec95899570b7c3c9a659be97e703adb4cd6f09eee08a0e6d7080c19ef03f2a6ac1821e38dee8b9029c7e56e56449b8db57276965bccc0eb6b34edfae0ddd1d50b1bf566bef1a91ce6d1760c8d35427d6b9ec28eb658703eafee9996d00544dc0584351738724696784aff15584208c195ba0157ef89f52ed097b6c54ceefc5254f09f1caea3effd366290514a43cc700ec7e650b86b6652ef024cef14e0bc9520f453b90f25b245101227d94da3175df8fe84709819dbe0580ea40384ea92dda59f3778375ba29f98f59935bb45918b1786370efdb6b487e27fbcbe9ad2239c0ecf631726ce3854adcb06fb8e3717da4eb45a62a814c93364fc2c11412383637257a76681298ba451b52ef70ace64257cf2bc24acbda2cd128a850f744917b554adc38dee37d88b97a7f0c8953d95ea3ecb54d9411de53ecaf5979b8b0ef234aaa16113fd1a3ac952cf1588b9e35931179f57fdf9b372728075001393d20264252c2e8feb57345a47d37637edcf15f3c7df80921d31dc073f52cc7f26a35d0f9cb1046833d007c6f1add0376c45f015ecd15c42953ec635c6f093e4a1fc7eab6a82dc82e46a691652cd3de7a9cbab09e24128bbe584e0c7f0374d1b01f9959e0d086ea4bae133cb55632bed03ba76061793ab8eebcd2b389ee9cc8d2e6f3decf218b5e2d0e6f0b7d81bfdd15893928bdc67a458843b16ff999b73c20246db774701911bce0ba756da935876cbf237c97ae97c6039375ed4e491f354aa017a7b889b69d75f7adbeb54efb4a2fc662094bf30753eff47266b6acc33e13d26aa675538959651cdceca152021cdaa6a80085ba1431699e428d3d1784d435973f67297178a066546e38c37a78fb9d981fdd8340051242b45869ee4a53557daacb1a042cf91dd438ce29b32e3752557d2521d0036c3ffdd4a379139406d9bae3817fb95e0088af15d0fadcc114206c2eb721df961d0ba691f6ea7cb3c664b0bde844f0dccf7f0cd0648c97074a117d25460bcec18a0046d9d30529a32ed2548b622c9832f41b60007f98fcfe44a72c211e005b5074a877d0fbc806c2b3ab9577579e640a1059809877f2730ef67a96c9109ca8c9e5f24135c3cac37a8f105c1c7325573205fb0ba40c33e5a0157fa124ba515d089fab816b50a14f198a82662d3a1242567a6e29ff8fca0c1160c866c0ed33861ea883e11aafacac4ecf9ace20189ab1278804faaa0d827545c45f1794ce9b50fe8125611c5fc06a4ca992943548fe4dc66d435349b780ad23075bcec81c1f8e5860f0403342cec60b0a25a980849c0572dff760738e002df358c40c6ef04cb7628f67e059e603a6eb96af64a123cd2c5d50bc724c115306706dc2d814b14a793a1be25581ce9d67e83c972aaf70d0d79b69c0e747a6ba501ba54d311426f4e8dca32b97acff90afaa726706ceccd1a834a59200808a44a1a7faa6056c783dcdacbd8b3813ee6a52e5697c497971e0138e2eb3065a256775e933b2560d1190cc134d319a2d7e00fd9b6648a88f9f09312d3f8b2b61c5c2c352fb2788cd23cfbaeb49010af80c146bbe7f3a773b6b011e603399daf2526834ca5880dcf726c70e741a2576c7908939776e45ed9d70845016b7b502f5a152b6b3e08f27ea18e4cfc132fb37a8650165908518ec1f8b6942e1ee056aa064806d196ff0961eb23a96955732ea24ff1ed5951ffef0d6b43e9e3de641dc9f56b905e0aa1768d887a8a17399ca61ab932b1e36f3fca98bb9d918d09d603ea09025124a66159521dfaa9807227b1f7c2e1dad3e9c6093db400025b0a773e9b34841c57fddfb339b50d81a26996d3e67c494352e9878c8904f6026d1b074ee3d15029958a22989a2b3eeacc4e29c818dd1cc44a43bcef817d2eb2411ffb19a7bbd48ce803c73e4229f5d9a89781ef71c5cc95f55462ff107c85412ed3a4417b81b9682af831b147aa4292e047c560278b7acf70fe2683674f6319d3392029999b2bed924ba906f4e53913a4b62fa9fd4b40aa31185148204355f9c9146b47a64211ac0f5877bd4da0649916d8329f5cde3609d698b00c4640642aa2396be293b10de09ff170c010fe641d84a165633899e556c1853162c79374f15d566748052dfb7707c8f5d01b5f1f6952a5f9c877d8c7f39cee73bff83933a8930302bcea3a0c20d38ea33e69a43079be66341c2daa508c1aee3c88d1a5acb71a842087b604d89502d7595a174ce08b529f338ee393b9abf9e921a584ca520f6baca9641d1d3848799b2a4a924e90604e7eec7f665b47231f3bd077e96403884bcdd251e32f00ab31b24f075ef29ef6cb68ef7d866f9e7952066e633a9f4f690664b8acfa361923e43b2a307c39a011c3b0586a8f0fe87227774c8711fe8609cfb415a90dbe0896c85e7b8fa341fb05707774344aad13b1e8f9f00fdd289525559f57379c109457733b7fae802f2f9a590b03edf67c8a0979a16014e5c3f272704bd031328a639c6f87530f2e050e77545325d17ea640779bc9d8d7bc676af9f4224b56b8f0bb13ee512af0a506f38eb523ea61be7ee0eb2ca556af417c2aa59d7a8db17afe4564f07c295afc88cae826fb007a9248d199ce31484ae91ccce530dd8e1abdd77c3d334d0b411140cfe753e0f14cb8315085c3015067f92d962b6ada232e2e885c718b76f82666389cbe2d52c02209727b52bb801e82951f1427a435779f65d76bef55d2c7cef41ba6802682a869a4ab1e6aef0091e682214a63872d33b9bb96a7f026e4990567ecab8bdc2580fc6c858735322a8f08d82542614813657fa75f1819ba6fe4e6bc74afb3e72ffc4e3594e3400f8b67b35e9b81c6c7f9383a20a98feb7022ff4476ae32476b90dec09daa4ff92c317dbb238171ad0452fb9b96915ed398ad2fa139f14259e86c3cefe3ec85df927f612de3979684fe17f8ca4acca0b24911f70cafa2e56a8d9fb05cad14f44c5dbe0ce25b607fa70efba630260fbb5962e29e33cde8a81ccbec04256649c84ed832f0ac89b6c0bb950bb664944cea5700d9e934a90c46176fb9e46a5a00748f935623dc63cd16a5c7be2f498304aa15f5a8a1d7b23839ca45b05dbe964e95efec7cf118ed603c6807af51b2bc6255e274ec5853259cb94a074c65e50b133a4e29a0c7c4e2eee033813ae377ed8f300392bdfa12b68e5b81b8f6bb82868d12101204e4b3882e86e2803e710e655c8905252770d7ad4be1857d72ab7428c13cd731a339a93cd07a434e5b362950fef0f5c8c324c854b3df4571834d5331c6e173c01316d36fef43ea8a1e57f1972ef7e1340a8f4094853cc608f07b1c5aee507d0398069e5cb29371cac1c2749a4b06b85d7f7d2d3c4ae7f25459f0664cf80b5a3a03012723e107690892318e882870f597c099e4d0044ce19c29987d16eba63654e6b796ba44f29fd5f30cd5da308abce6fb58b6f78dda6ddb7bc6c35fe60da2513d02ec137d8c1a204f342cbbae8bfec40ef2793c4dc95d691e09a97815ea8ec542c91669f7a3a22c91607abf0fb76ee696f946d31dcb478bc62e18e639dda47c01ffd8bd588b1c93562ae84cace49336a798f6d688f883bedf1b736b7957733d81cbfdab59414448f7d012cf8d502cf7e2cecb5e54e9d3c92ce14d38e7d33e0bfaa79351eb500d79a27b3fbf517893ab6459db4473db3c90f5314e47f55b6e4288b4c0fe48183fd7ae832671ba2403956d23e663d56d9197a7e451ef16bee2f0b6f5e4efbf40f2a2f2c4fa4b9b031dc88060da1973948e5f6a71e4caa1d71a7f829afede246dbf1430f1d71420fd95fa9502e813ae181d50fd2074fd7ab1c1083b041033ed441d168d0e58116281663fcc69e4630cf74e25ee1f417a58fa1f1b22696fb23d13ea995bdfba20576dd389ddb9d2711a5a768375e086bc9e12ffd83f686fa6129e2796926ea3f7131b7aac6e382169cf921a35204238f2dc8632e219cba1908ca8822aa40c3b46ca508e7e01f750008c180215a5684722a142856366d9be9d764bdc0e2e76a2642f31d9be31934ab22f8da1644d7ca53477023930399f0b95032a9569cb0817029154042c854b17675c08a726406651d12a4326419dccca8188c69d56a7d3dfbc5c21ddb15f7c8a1c509f7d1f7ae481f64fcc128f51a0a4b889288d4634b2c634aa466a84466bacc66894864480315df528afbf06b21cdb046f93b6b18eff2f3331ac1b301b8f0990c52759b6f58336a018ddec233903fef5191ef334bad24b7f3346f099609b3fa99ef79791c3c7006bd9704618dd240b52821fcf011eb7213452e9c3bc130183da591183e0e0be1301c1db5025316183c32eddee4a5bca97234960e38c3c68f180f27dbe181e7201563b340f8ac2163440458c80b4358890f5a545abfb736e3b431809b3c96714e780507753c667e6b6391a93c57622f16f41fc9e90092a6e6da47aeb14a5daaa05681abc54a0d480460c2c1f572cfa430cf3ba9bacdea6265ba6ea90d731efdbf29a47260484bef07a907678c209d48af5a921a7c6625a887d26ca968b4bdc6891dba9ca1800b43e0cd395b1308eabca8dc2abec764399d457f14b30db86466ae8dd1740ac31c028d0b752c03edab01c31b495f8be8a8f544fc4cb8074d8156ac8b50bba621a8f93d2c82e982ce662a873d496493671b78cebb65194b76dfb6e97b168b7b791ea31d86a15825e0679584893978c4375b9cc1bf3327f33d35d64274208b06dd2628268545483fadbf405b9d11c96ebc5a5e5156284ac0d8c2431703850f6e24d3bc06d3b4965b4090483839fc36907a881540f3722b6036a8be660266d3eadaf09bf8e3d8eae470f8f631bcc7eef0f323bc479fba615c0a96e19d9fd6f6b105be30544846e53f6a5faf7b54408bb6ed72bfd53ba372e5365ef5c9aff6e129c2f65a5e451bd5b591d5602ef214298b5b5c1b6e1eb2dd4ba0c84b6d5fb111822db4862e5d8b519aa7ee92f3321ac19349cdfca358f04fdab1ec1133998c858cb111f2531d89e29990a0dd470f460b38ae3570c644a95cb651085c57a8120af201647e1120282b5f60d020e739bd7256229b8e7c2c9c24c05106002a4a8f7cacb892cd8d973c9f5a9a01f93eab1a215ad4eb8396875a130c84576e46f3059d263cd5ec7b396a2a0a4aea4dc305a57a2904fb72fe386715d1b873b7befa81e58add901fc9e734cab2ce3cc05571835f3ad8bd2a93e4957b7debf5dc27b2a75f44aa163c2a95e0a53427c8e398dabae24e0cc15cb8525394512630c66ce370564d6ce999958474a42260cc6a206744336c4ce7e8b528676472cb38be725cc5b0f1e3aa86ed58fa8ad494cc195c2d21790375d88a3917523b92b7289219d37dbb745b66480f7831a8321dbbc43895b7fb223822050ecc59c404700bd9297ae8b49ead6a180e535ec5701a536aa08e107551d0cac63edcc2aeb623c0981fd5c824a434d0e49290815f6b0a6954c7136d2545ce8de856723b3cb95777766ba85b16077f59d28ef6d1e03a80f16112a8f5f3aa4ee21dc4f8ed30aba0ab8facec9c3bc7b145558dccb00567b55716433e993d63155f9ec0250540436b925b34279957989e359a492676a42e279d399fd40a00515c1f01b9a06f1285938858b64ca6a9d9071ce6b83c895565a008c31a0534b3c8b3ca928840db96e1f5ec8abfef6acf3c8417fc6c152912392e4d69b12393de40591a55bbe44828239143cf3d90f0a075c0c67f9ac6004cbfe2f0c5658755f53422fedaf764e6caa111035706b71c6915fbe664491cd45e2fdb48edf43c556b5ff3d3ed3c1ed040f45b1c6d30ac7821f47b4efd8f0e34e7876794eadd0de947e144899b1acb449ce68be35a6876db6b82501edcac02d753e849587fafe11120bbafb1790fdf9253beb914387b5ac75956ac803158816bfc1add53636495de56b6a121d34fb2cf3663427911eb802615d5f29d29c85c247e60be4b7443e367d928d12190964f0fdb88f5dc1d166190fa2d2c83fbec232d0fa3014e302b6110a6754c1b91abaa8b3a5941039ec0759ec16f663853ab72a0fbe4a240de37c83c4bab43c581ed959224265989196bcf5439eb3b738718c2dec29480a1c4ec37c8c594880e5f2e0d5232d79ae2d6135a6c1ef91ea7d576a42357d8ed598c8e7ce1be157764ae2c0f17875cd88ace91ca91fd7464fe22224bf8b9082a016227badcfd9a439c16514a37bac95dc01990bb1bbd68a777e68cc013102a4d1e84990dbc19a8352db97cd1bf203631aefbc0e8bb05a8cf663014c1bd0e51b18ab06fd57f607fc350c01dc4a57a34aa202e82b7c560bdf1faa96c013d4444abdc615de84727b1f723aa5100f32944d3f5f4f36b9c527a385a7f086abec9d9de45e37c42abdfe19df1c6de14f6a8e2df462e57545e89505af0d61df6b2b3d94750474cd165e2cdb1bab5eeb6d0bd40f6950096ebf881a0fdbd4237f4b87a6bd7c170f217bf47a957a4cf5ad3e2dc0e08ce127d00b2a008f9f222f79346c3cd850ffc632ab32cd55d7383de3ef3c78fead4ab3d502cf4d76d824f9793991ae5063e805b8174df246d8e3066086c092928d3f9b617040b2b1a0430e72cd3600ecff50a33169a59609dca801d19e51e7d31796575cd510b8358eaa2753a56e73986b09ed4656832ff625fbf2f64606d43c413be1f6db83fd26ac3223f35d6458ee3bae8b59a553898307aae5dd78147ee94a5dfd3df103d1c9905103b4ce99bb36b62817e34f5d57bc8f643d86aaff513317a131a983472774475b932a63c8afa18b44fab1f88b96d4b1bc848e00ad39450e2d7ab5ce2c9f25ad9465e1bb216a71920e20d1f76fb63452e24b276200c3b35035af1021a6d849487669d338a1f2565919532ebaf46deae7d602cda9fc84845d76c3d481797bf40d2e903315a94d408aa974c26c2858af670b0c35b1b6ab32b3232eb5b4fbe0b736946568bf7e18770a89f64e9eeaca5110d8bd524135a970dc7cb6fcebf00cb4a02d56d48d950224c1430bf7cb3aa2d40357c459012bd2e9f5657b33d22919c5b34d04ecbc315ce59e73928580c703d8f83cb21f27bb1a7d86c70ad4653975eea935bc211a6a5a729d066fde1d76af16936ac39bee2571a49421073b4c68e395f6c2f02a541429884e3d124a2f007bf00fa8887984e16d65181f142363c3dfe8e7c83f2f5f6deee3c2fd556b3b856fed14bf11b94ffc96d2b336b3a7605ff214616665a112ba3dd463741bb07b755c0ee03b0a3a004c6a1aaa94f2907d0a9a6c6a35580b8d2998d17384de424f714707d1c0430321e04dedc3184ccc932b83637021f85c59f9f0a207c90d782f0a1ec02ece949144fbcec2309e59de15106a6efbf5f6f0d691c5590ed1a77a8ee59606a13cc7333b4628024a03b9a4301f196c7a3987f6d5e6c8a0a68bf3b8663ba524f71e60ae22ad8f2c22c9b2716b8bb6db7aa72679dbb58fcc72cd2f565466cdc782f2c3583fe943e5ab82460815844cee5bb36fe7bc38b6a08d5a783e2a27b3805ef8c47c3f14b6558324032eb7ecc5e52a02cb7272c167c72ad33dc2068b6dedfe5f1e90a3b64b4cd3d74dcb69e58e7f6f62b35fa18d5131c8d7c97273a037281088d9c344477f20ba4bc83d1a730056b803ae7978ba41a8ad850f8307cd1a57f4f4c3a7f1e7a44cbea512024f6118248d7f1817ceab4a55fddac5e03ba4e0cc6e048efb5d1ee430e3bae7b5d5a3148ec27e6141aa5a842cb247b449491d49e309901b6f339b83246799828ba30614531f3f8055418f192a4e972d3df09527c417427336085ebfc566495ee24e5833d883332046fc277aec9d3d6ccf6c0fd82318e0fca390b50d27cc208dd9feafe0823c86a7d1fc752312c961e2ef00b16eb46b0fecf634a6600541f6fde39f2e550a7d98942f5c5ab7b7fcad864fe6514eccb49975baa8ab3a5c4a0695eccbe1e4b07ffdc9b4af9b40d99a1f3f0895f60973bc0e2147ef91c5fb11dad5b6813af1f7b239d089fb205789c07d0e6c69c82a3ab80ffd2ae1914d04819cbd27653c1591d058c5b180c2f9f4c689de6d2e0aeed2e5b61c95c592b76b4ff041f4cb3fa31d9b8da0023413fd2e5ef68899202690139bf89938441dad5c6ba4b464abcb30b6713760728e77d9a0211bb2d54ee32adf8084fc88763e25cc39568938a86f23ac8d1d0e3559cf2409210c765242b1177fbfd2bdc8c24d68a1512b3389b1df472661f1f8eb489222755df0c244714397b35f423ba6d81b0ef32f20cea0cc226ab9502c1a597ccfde79d73a376d67aaf22b27e69ccb4fe5c073a0b70e1a3bd720dd66065c8eceb5ebf7fc6203236aaebddb863eab834698420924892ec7b9f12610e90bb3964dd9297291a3f0dda3493cd546b818c5ffb8af1e1e7fa2c94190c85694dd87009957059447f68d6082224be80bd5ba3548f4f8796523ff81d3276018bded7737ca345d5ea80ab4214f633c623c17dab3b9a0e8c0dbc1d9421a8aee0cecac530397cd3965baf505c1d502c925d3fd5c3d80c48930fb2fa2cbc8ed35c92fc077b20a895ac5fa7d778033aea12a014e3c4c263a5028830f143b0ba063d4cd29e5621b3d90420c41af7fa2df47c206895ff71b99ff4317edfa40ba5158e10ce03a63c7e210815dad38c815bf06df0aad03531b2cc671e637a55d8755985c9e567acae60d4fe8b93693e98927d287f2b3aac8785b175eaf5d2cf97e319b112a50490b42105494cfe2fae65da6d8886126e2d9a689438f0d26045367f194b6c0b33752583e4cd05328895d9d549a426185f219fb9bb4a7a81434bd164e1a87fe25391abb00584735d401300be2df965b186a6900415fde11194a3f1016d736cc9859c930870c83d40ab73e6aed65d6245f0b295768b0d90f7f69a5994c7f801e187b3e2a49a198c62e6fd544bae9f4cbc458ffc4c36162a30f5cbffa84c60d32177ff44b9d342070beaae5b73f07d7d42803aa75727d5b3054324a3a0a1f567a54b4316691a4a8bbadc6f5755de8b37fdfd09ca5cdbdf0f76af8c0ee4d73695df61aa0970e7423d0e19b373c8ea7e3b500a77c4dacaed04d758b0f6e0cdadf748fcb6e0df43fdaad11b209d97b93bdf7de0173076e07df072dff72cc4422b7929f32670744d575fd3c1fa4e7037696ae470981afa6d75f4cc3a64ddca987465db530d118e9f75e1acc6ef3cc2f7b497a066f69fede09998923fd6d3fa4cbe1679ce943484388c8007daed56286427d493edb0ff6b9221dbb89a3e13ad2e967b84e6805d231d2f64372935e3e25c3e14baedb2e87c821d8b721f397f41be4bd13b26bdb90fa6e5e9a6eb94e62376594904bfa4f7d27f30c94a779cd36a462974f4149f25e013a7bfa9af7c41e79b9d269b86e2677420d0465b815e9b031b7da800875295b9983399e21356b597b3ea0107e475abcf40b9b0a4254b62078fb31513f73b6ecb7fde01fc8b2dcbdbccf32ec40b45dc80e44fbfe6d4358b0cf309bdfd381e54e6e3f6cdc52e8e9f77474735ee69a6d0d75a20a7efb79274020110914a2899b15105e4e7a92fea567d3d4fb7ae9bc94524ac9036e5b1093a45fb4ed079d3f607e12072773ca917e39138e13caa604003c6e406eee4e307797b95335cddd0eecde7b8122c6ade2cb712ff6c39b23afb0c71c2f03a2700f3b6ac273e42ece2f0d0190bb1d5b4ac89d6a0b9bdcbd0a54ee4e47271e8a2353caa333c283bea3f0323f03c5cef17ad26194884bf80680976a7e1bbff7e58ed24aa9cd49f526aedb82c05379586dfcb9db6142ee5400c82f21a372ccf424188fb2c940b1e3a594e1b22d88cc31286dfcc9d7c897362c511666199213eca29d837b8d514a69eea650103d947f930c7a28bb29a63bd281e2ca74244de5a555be4e30dd91a0e9373aa07a92fdd2a463d7c9e1705cf0f750debca2371dbe93dfb2658b2c55603932c241027864cef54e879e740adb7449fa6c8ca3f4394c24d3ef499c7c8f9cf90daedec4bdb6c1d5709daa3b18258ac9e2ee84dfede88e47cb680eb72056e64fd2e0dced50fda74bbb3a60d040525e65c72e243b467354149973edd8a152fda713b61809bf44c2879fe15e546519eeda8290bec2dbe736446bd26114f84b478bbefe2eeeaad2d71fcc5d89847dcbb30cb863960151a8f3cbc5685b12745646a7d3f164233c1acb7edf19e1d1f037773a4dbfca5e7f0f7faf7540313bc6651936cb8036f06824e9f73bd2424a9630add3ef288b516bc1a407d0ef288b2dadb57dfd92b65c446904f43bdae24b6f51a555fd8eb658d25b60e9db5eeea59cccafa695ea67ee32d236e476ddb620f8f3b3c2d75985303bbc37e3f0efadb99b19d7e1ce60fdcce067fdcc802292ae5c273b6bd2a764b7a649caabb70db17045fa36f3dadb6772179b74e8a5a1296fb366afb0d69957a46fafaf2b6cf0a489da3e4f57a887b93b9c16d69cceecda16c41e5e3b6157938166b5734253b605a95f59ac56f8b9e4ea8df6d691a0213c7c0773271484a4665d0c5d2198eee881e20a1f4943ae935ddb66199cb205a2503f21194764777048a5e9e8b4ef48cf9e359b8162db67b9d33250ec4819287685c7cf3e73f859b9d9240e36fc86b7c01df5750b829f9d72f0349cf619aef4c8d9b8e46ebc72f43d1263eec1295125c3a1362803e126c305a240816ef60e087b7d06a1cce16532ca1e9f1e72d970d651040c04349b74837b32c706f7640e2e71b18349347ddd82c0af48b983741ba23584b97b41a8ebb76b8753201788c26b2fcd4dee356d4b82c67e67f6ec725ba15e6e625146525702acb16cdbfedcae1972813b288e3445dc1520ab21917c0b5d342b3c7147f6b04f520e6791050b307ace799485979e534bcf791ded2608f8750ebce452afd4ef088b1b60b1a575aeb8d7cd1db4009e2c1f0b3b65bbf87b849b0570a7c313af93a5e37928a0ffde1173ce39e77da4908f8c1c0a9ec6d33f1fc9a1604ee1c510e9239d3955b09c735e7fe19a33c648041652bac3583cd1b28896524afa7ceaa68290904fe5847c50f1d763082a8ac0f3a1bf5031a7f062a07f3e375e2a08f5658efcc50de5c817e0e35355b0cff3d101e6f914ade65f98390426343cbc44a28b54175d7491eae206cb4d164758c484c192c611162210e1d94a6b15a3865a6badb586d1b5529a495acca2dfc034d0a2b00d369db0604a29c582a5293d61b94177f84d30391a334414637e2883c90290b0c2e8081d483182ca951ed81f685c5cb1925dc1ae2081af1841baf28346734496020a5849024b862124a84863678720f8a0830f416c91c319a6a32b35d82df049d6dcc5e95241031415582e152ac866a4b2dcb88a073aa829b2c183206678a0c376a3dfd11532b0f0505a72e3831b2d37561c59c1e2688a2d375520c11429184756d2e871a3c58a00f43b9aa2899ee977344594cb86fb52dacd15dcf1d81ecf938ad781dd0001dbffdab8ceb4daae7d8a21daed8f768b6db7dc8ff62d779a5dd567bf51b39c76b8d56bdcea9a5bfdc6d56b5cf6b76d9cbc66baad25fda3251d8f9474bc4daa23dc7ed0ebbaeaaf7a4b7f5db95bc96fd72fee6745bfa2afdcea3afd4557f2db0f7a8617373f48a5b6cc999ad875bdebb2f5d65b6f3d12d4f7ef88ec9b579c35c988458b591965bcb3ceeeb3e7332963bc33c3b80bb539ff82d011f9296306a90e104228f333e950c19dd6971d4d97916caa82676a42db53ca5fa88d68d20a84d22322410b1219f361f3c6e8c84889144cfa6d52504ae99191936ab3dce4c04e7963a43292d239fd8e8c7460e484d47203c58d0e249435749d69cec9cd361da90dc3cc8d797922dd524988d0133b8ce94ee80916ab5f90535859ee8c583d0f94616161538761f51139664c77af0aab67b6017798e00ef9d41018a26167cd3b41fe6da6141118be33652619ad7278c634b71f5448967a826fb43c35d18c935d63b261aac98e595776d3a41c0a663468daa32ceaa2b0eca82ba3144e3a6bc6bd596b9e2dd6133d807e2d969286db10a12794b0fa05212a53584024132c3985d5331f9161589d6512dc31048655666694d9b1f964b4197b9c22460496d630add8628c319c618c2fdeb0864945485d06bab3d7a21a4e1a4769da39b36c66f3fec20c3baddb0f2438fb8b2a1929a542b41f543b52634b6b9fbf27edc59d49e7e4b29feb337739b077f78fb34ae0ecf77175b310ed7372b1d267d3ce1ad4b3ede450d71e85a12e7b14b4f348504fed88eca9f5d5d2f7f7f76d3f59ee60b5f01dada1a46fee91dde462cfcfc92db9314a19a59c7d04f563614c122184104208218442649ed94615a49448d160da8889a2bdedf544f9f9454b1b638fcbca9c04cc5b39808783a01094b08b7bfda5bacb50184bfac62ca563a7cd1746cfe793a54da7a60946971e360be0ee94bb58e9789b48927952b9265c78ce14869218466e99465712344a6562c1c80103936db95c98f8c28af6051470b39142e2f285920458398092050286537c3959bc850b161d6f63df4ca6450670cd9479412f10422f1172895be014c825462fd00b84d7150f533ae02e9878f03d08e3df2707af0bc6f925aae091daf1f3fdb2518df94b6fd4ae4c669716556ddfa9ac9d94527a9d48299c63e06ec6f979edecf9eb3f84c46b0f12af65a1b65cc7a3edefede8af0c283616d4f372e25a8bc51863b4d78cb7f55072ddabf2d484bf24b4f913c2e035743b80e1275e72c425cad1163178cc59c6fc32bfac485a66e90c19b81085ab6f866031b0254b5faf2f5d3ff223bb3da28123704ccdd794545ade02795eb4cc17f78250cf69d4d75142e4af2b4a6797db6bb855f69acf705df6992df5d27c72428dc3cab80db9845ade08a2e54ee8d772755e0ebbe5665ebf11b18936369c0ca8d3007db02d883d59fb138e6b1b72dd62db90ecf2b7fecefcbd13b621d73b696febef7d5a8fcc7114b6697ff4a8f744bb05b19ff3276e55f3d71ae7c2e936fe3620427d391c5c47fafc891b72dde62e1b823ff3f61e79833b02fb273bcd6d70415e67477176b59de626aea3c91b4f54a54adc8a94c52da3803c28e6d4ec9ddaaf75e16af3d7fe6d2a3c1df6056b2fa6c10d88907a5d7219b7aacf136ef1d2f03247558fec821ac87bf7c46b3b3282a1139880d5efa9de7b3aae4bae13927005f89957ef321f09ea4e1e47d4a890b33f278fb8434bf81be9fe3da592b99451279b2dc3a9ee2d7195f67635e6aee7c8be6dd8c6cdceb00c14fb7ab60981d7e3ec4c96b8d81b37a3aac4c12f562b71af3712372d11f0ec309eb966381b73b04d7b8c3651fbd4b28e22e0f88bcb306ef6cca6cdb2d231bc88e285132f76689317ac36d5006bcfb803e7550daf3ac9abb59e57c2c96130c8ee46d040b28d9caeed07966d953d2303b4bf3f2d9f6ec4600fc49da95d9e05d943c2be3123556fcac01c8017883b93f4859631e5645363adb59e81bb53d7930d0b95031e18416549f981937e473e90d206e877a405098d4d96ce3953326049f3dc60d66ec0e00eefbcd74528005180ddd739e081b8137f1dce8063bf232d61de9720ee8bd7fea56076ed837de4cabb654057977ea394b2b49da480a89a13be8b24df13a3950d886d997976c0ddd41195a458f8bde3f9bc687659e23adca5ad744bb054fabd11833b1805321177306c638e3c95388d7b3df3102b28f600819497b9d3b8d93746c0f24fde5c448c9c28561e2601a7603c71a7f63820ee5cc74e24ee90a0171404f0693e0199cf3c02cf676806fcd26790f94c16ea4b2a719d3ca649a0d95a865ce00e6c4a6358ae32dc84a4b821715faabbb94bf5bdb5893ba45fb717cdbb93bd96bbdf94813b1d7d1dbb0e9db82333f3cb08cf7505689c0cf7a20abfb5d370254e83db8fcd72ddbdbcd572774f0f5f7756be2aa418cda00f8cce084fc3574cfebd27d7e8bb85a73b21252db1dc024f7729b4cc2bedab7a3b3b2d773c5262194e87877bdc8d187c9f5d87c73b76fb9edc5eeeb4d7f748cd72406cd6de04021a33669150a271497983c6945aa45256077da994aa2967c29d4e4a35df164a6ec8c0f6f1a9096dc2601464a1e050b4798c2a1d5115a7cd5e1afeb5ce78a50682be4eb90e53a0d997bc210313a552d1723aac8ac299ba390291940ac87678ed3cbd71a6a87a58743a3a3a3a3a3a4ea7d77c51e0ba2e9e07b1a913609b140e97178af186996e76d24bdc9cf813e3d2ec4dbb190674c512943cd8d96f4212b6f9f3714a618cbd6e3fb49fda79fa77c275cc996432e6ba37b61db6f1ce543383e3a69fbee1e0e6ebf6e36481a4903766cc98316d7170af4fdcec1b9c56836df04ba4e3edc736fb6da5f7c412e99494376eb6c6cdbedcc3b8eb9af1f3042f335a48f50acbb2f7c4fb60bdf6a5670a0d1fd0f04790f4ddd25a3d02fb5ee36c546559ee8ca43abe1652bdba5effec4d12f0c4920824e02ed50f5a2824863163c618c99c1678faca5a5445d64d1ab056aee7e6f86121262081d4af05440e4000c1c57db1f58398345a3f9c514417229e84f104882ea498e2041443584348081e3459a2076138d143114cd4347e10c30750fcd045df7ead1fb0fc50a56dbf96501ac9d60f51ac11fa5934bad3ecd3f18058db528baaf78e4f1501bf77da1b8a70c2abb2582c56159f8745e6c8c36391e7c172a75373a7dab49b4959b5e5cb4f27b247944a78747454aa2932e7271c7387b314f28932cbf3f15a42563f56ccd232a808662c32074bcb43a3e7635efeb2200b0641964f8fcc891c506d4ae3210ba836cdab1f311f8141a88605e0e7f37caedc03b27ce411ba767c5784bc2374fc8e0a4ba078aab7a3c212299eea75f7a668796894a49f184347b032660569f060e4239d40620c2c595af0022a9cf051c0124f94110330577c39c247c808286a4031220c982110c147feb2c7aba2861eae20c10c2066a8c2475e257b080571022e5290832d8e9085c8041c18810654b8a0010963f8c8f3c81eaf8b2f4810918220c2e4e0083e365a19504abb2aa620c20ea0b0a24b18151043c51056cce00a22b8f80198254d64e942c4933088b0678ce982fbb596bc60491158aaa0820a2ab47e2d16f070c512252c6862c5122712b6ae5c31d3afc50256cf7e2d1fc4181d4511451453f8e06405525a4251d4f8c206452cc16a61c91923441727767822842c7c9852b24590620a1faab400fab57cc8a269bf960f57269815305901ab7fac8cc0d74ba9a56c6c4ac30741d635b7002f9ffd642d64fd1e07cfd343929511799a4d5a4b05623a9e476c61722962f57b54524fa49a48395127fc3be662c85efae562282a92e52773ea4b8f21c2ecf345b2cff8ec582ea25de62078eddb49d70126668c654efd4befee93b97119fc1b7f5051111b10febe08fcbd87c77291d34b39a8f4532622732acc413a3227cbe4a09e1c54eb6de4fa791217545404a220309fbdc87c96838ab007e1cf20a844e654887310089e3d8b3908b2b292ba3d6616644e7d10e94fe6d8cfe8d0fcf9d4fcf954d39f0facef91f3f974b6860b2a2262ca41d02786fbec335c0c45456e86d963d00106d35f38c32932a7fe04568e21a888fefaf3e9e094d2f3d9b8e79371cf47fba102a3c6d1afa5822d7d5f7c9104e5f2791b8a08fd04a0cff5ac968464ac3448e9a0a5848c99622247bf160f4734d6afc543962daebd98cc41454482a0cf7c3c3c0a02344f60434180e6eb49a00f7d7c912b07c9007dae6779888606f8d027813e179c7192a0cfe488c81c7bc8b12073ec25671f2ddc880cf5c81cfb54157c1d9963ffa0a222f2f0414545e6e5838a8a649f7f3227e6a0a222f13707e1c31c5454043ee6a0cb1c347350966d3cbc4e0fd194cdabf7457a81a572d052a2a565fab57618a3df86834a6bf5810ef16591a4b583151b523548e5e0844d5bbfd60e54bad4afb5c394eef089e0c9925a22955a822795442a89231db6b4aa5f0b0558f493b98fca685165baef2fd5a9220f7250d2f29aecb418c85b325ade9251658b06277d69d85fa328ea475ed8837c4ca26b4e73f93835cac186a24dbf71f9488392d6e9d79ac107f7926e3f57d77a3b25fdc99e6528382e73d55f9b10ac6dee88f4c82a33d3f632dcdc80c09691f921837f98a04cdb1f3337de134f37fdc68d648d5d8b43688ee54e3b4d8682e31917e43592cca708d372fdc13a33eafac9446ba74b5a3b7e6b86dc957ebd0eb57cc4186da1a08896375d3e6e41e0eca0d0d5b48c9bbf2f3e28499d049ae624a8953612cd06449e86864648cd69aed1baca2e0f3b7cd2e31604ff32bd2776d8af1bb993e9ec335c27d32bf9ec276e75fd034de256d75fcb74321fe8d5bc4c04be441030e8c1173688c2890fb6fdd8aea7772b6d3fb6d77ce3baf91aae9b9d0ccd1d86d1b83de0b7c3def6933d0399c7f21747738cc379755d043d57f234b9c3fada7e68dadb7eeab7df1aeef4c9d9f8c6ad6c6032a71cdd80cce35fa5679ce550424abff1d26ffcda6dfe387daee857a56f428dbd13b0df53ae834364777d6aa71975ca40849a74d44fcd4baf79e9a5f744fa1a4ebbc169dfb88e5ec3397e83ab89f3387e7134afb45fa7b9cc36a4bebb6e7a8fbc53bb0181e793e3424d7a4f9401c769f83df4e99138381b35dc4afb6b1a6ea5fdca641e0e25447be9da4b393524afb42dab204405890a42db0384a86c41aea08ea1b14f0e493f4ca8b5ec1e886a07a27da4f67b2794b4188e98d01895be48da663904a7063a3526d4165fd7e00c18ebd7ba018c788a2620b8d414dccdf81ff2bd17b503e0f75a4351fa46f82229057f701f107eada125fd5a3230e91efd5a2700a36fe99d47a7d3c2414ac7313a5e274b49c1ddb3d21359883b455ebfe38d3c1fb24f60a5bb53f7803eaf75dfe32c806d5489d1f16fdd10a663d43a9e74a4a460a8dd60c5a65feb8629370871c30ea97e2d1bc6d0d1af6503151efd5a36e0d04a920603fab592d4200951921cd6207dd1c0e801c98806344f5a35f880438d1c5fa0fab568306ad13025470a897722d11aa06dcd90e5c52f2d1fe75f0a5e979cef9af3cd39e77bf25d33ca38b5282ddc01ffa0945162f345d435e39c73467a19331b77e6b529e57c72ce37e79cef3dd99710092477041273be44104a390418df7befbdf7de7b2f5a711f4401f6d326941c4a768f9c178452c2b806cb14210a1d3cd004b25d0f343b83631a36f62b2517e925edb168ffb28865946d4d1e722879cd2865a587f542d12b5ed0d2315d738b65655b217ec6fa831a53fafa9c594669adb4d65ae97cd420adb56ab0ef4f864f4bdc21edd4ae8c6e5df6d5ec0ec36880b1c7afeee4ec4e0c300b9a262da22af067e806252a08a34397a31fa0a1650a2abab002869110180ea2402e515068d222f282a84918445788a0bc1d24a9820837314113b8258726446188aa504274d3e449518026b40916c50b2d445a408162871e40ec308418fcc084519723b8cc6055a0b0c00b911044af094c82118e9af080e891910222053419c307444d2e1a6054aeeb2a4206bbc165142ca20334796aa0002231a686b1c60d6840a387176ca18335cab8610656122398c1a44b86d9c005af0a1c82085c1e9620a020ea01510e9abc2db3c90d8894204a4013f8840bb0681a650ba2074513b8a4090f3d70b8d2648a2b4a90c20c22549328bc20c2015c828719cf2816e106ee053d10e5265fa4413466033b5041e58c2a61725082068820d0708409886610840bbe604f4021037e794880462f0be4420c9e2704db04f2e07d51a1e06551e9107782bcaea71e169e8ffb47ffe463a147e6fc24738ac41e452e2457845fc0d7bd2c556e0682e723e89d008fe5c0c1f3e60588c41dcd066529a594d67ad2a9ada45a4fd28939f1333435b207007e2afd5100702f5a1bdc8baa9a6ce2bad9f6a7dcd974aaed717e51f5ba74ea48f69add38cd0675332c070e99d28916cc8d48b5a8f05dd7755db427d2fc7a0ba60b8e572920f2348f86720498e26001aad14b5491116d9c51829e0fccc686e3e182b693ae3d30ee05628f0be038bd53750f2da272fcfd92b80be33a9ec6306c455f3ac6a5d0a512fe8b3d4ef319d39fec61731b7fb24709bf5102f762ce8d1c1bb9b37d9968381d99dcd9f4857397eacb5e5bbd4e57cadb968944153cea1a0e0ee258813b1d23cf4bd7635886f01e8854c846a459dc979a5a70179dfc535af6804e64ce29be074bc31be12a7149e9f8b11477481ccd8e9305ce60b8ba63a157d8659ebd63a165b0dcfd45aacdfc456a954c9c2a70179d442745c42871474adc99c959eeec955c54426dc45ebaedb04c490ce64a1982892a781207932c913936a098e7633ee6c0f17858e5460b3cdd3d2ff04bdcc954af4a04739ea6e9a012ed29348665233c8d3dcb9095e511f48020080ebd13e073e0e074640efc894b41e6c0dfe058a831d1c0507b357f6119d7e15c81b3f7c84e8895619d10ab6b65758771b4c01dccb05bfae9c2ec0e2aa9795288c40ac9442c09f73df8a084d0051786a1f9c11a5f8be90726aadec3b902cb0b5518bfb8f76dc1424a29651622605a4a29a584613c1055efd10c2ccf4bdb8c4596f9bcdcebb2b9ea2802aec7e10277cf8b0772ccbe6cb62eccac6111e3baf32f82a02750772df0f4cacadfcaa323f690393da5da29a557c51d18ae5e51aba3eded35eec4a5a2cadacfec1ad7dd0c74f5fd61b37c6b73bd5e65d6e40fe06d64519c2bf07c8f841c0c35772f4c5ff0385b68bfd92fe7c264f59561d9c80b236404503c49018b3e7bad9a3054563ca3d403237187e250456b082d5b1e270beede9766350e16b8762e74fc9700e04025a91bfcfe68a7614d069931cbebbab2a5383530a275bc8c42b819bf79397c8a10c67c0c13704dc06fd2777a1c1f3000f0f58012345554e1ac804725552a1d3a334a0e3638d27081c046c9dc1cf84d1ca71b78a808d2701f1b1110779a882d5cab8a384a64e0be2a9fc815604f5aab852fc627384ce03011a40652c621b261be80084520f331ae40372119c83f9cad19cb14dcd78ac2a461e32401a5b4cd0b1046082184ef0018fe45e9a1a15084d089ab5e92d24b5e8d539101d8afabaeebba0d966de0a1229bd94c7ea808465b334aea4418dc1a3c5434f37d9101b3073461d91391d867ed717cc034b87ea8e89ac161019629e102818d51a9aef0aa57c6790277a6aea9ae4f4506dc9bea4ff536b1c77573090f1565df2c9687b7eb97cb289d272e090f1545f9d3cd9d117ad2f0fc755db25a8bf1db703c8a669b4fc739c257048296ba048831664532860960adc5f8e58a878aae4cc37db4880079f987f3c4b5e96c5e779b97d380963638b77167d3d22632605efe297953ecf17c66a6188d0b04f685e56b2e7c0efd5a50be7457ea6704987edb0fed2313f7c4977a0db8120f15c979211c16e088878a20cd8578a8e891a2e4108515b916142d577b36362a1c15609ba7543a74cea050acf46b41d9d204e8d782c2a4294e0f784ace05d8f44c4c9aa1c0b7a2e4d0937bad28ac7e9b8463dc079ff430f9c048ba66846b482284fa75b6bb29a4ce3a7122c4a9011a162749ad3409da84569bb8eaa9cb1ed8057788d932c20853bf96115b8e28c20b1169e0d8409fe02207366c41c308342e14e0c0c40b25b6d0a0031ffa17a669116270301d8cb030c2880b0f0e0e3838e024c1b121cc9197302d309a202aa187240851250828603486829652e2e4805fe324c19da661d309ea1081068683116cbfb8635f6a086dab5c62e88083821cba5335c47068f8076f4f42b0a10b2a57bcac110576c30e2dbee0420d29ba3811e65539a9a1861a6aa8c143b7eb94a341ac1765b47ead274e1ab2fae568839f14d1f1a614f62e4d56869e79caa3fbe210609e0cc521c0c8328451bfdf7ead216cd01a22899e2d2661fab59878693179a23544112933f06b11f5806382991213afebd2a2058b961050b484b8414b0819b48886fab59a2c69094146ca4b3cc63490a2b00d369dc0c0dd3c998428ea0ebf4b55a3f66b09d1825e2244126b8320230831eda3efefd4aed0f6c9dd23b1edcdf41bd721e9ad7b01497cd64ed072b75dbe47de23157e5bc10c036cfb135fdbfb6b880fd9d91f96490ed75e66d9c5728b091326527a5efbdd9e71f71bf7e3a36f6ec147672f3520f6132564dac39bbbb8fd76b7b3972b233e3acb2df8e8ec5976213b9095d2bead27c2db0e5e496805c14a0901c704ad274a52b10a8e0c38ac540ae70473a6aae8f07090eaa2c30ab400c2931b48b104143c3ca1a2084ad460075b2831864a9ab0a8948d54b5494b9daa19001000005314002028100a8744229150301e99ad69f40114000a9ab03c644895c7921c86511003510c0186100200000010608021c82893f4a906b1be1c44d6d30877911f625aaec23c35d84293a13c53c28e83667473732d46d35e0dbae1f02209aaa3d2e538d68b06d08a2142d280a8105191863825d224a211d762b6475ba8252143698a1594cd514f47bdef405f5d1ae090910868b817e8d50c4154210814489a22c8ca3a4cef0eb3dfb4885a0cc150671a50e65711d03ade8f8646dc846c1f6df4c8501c43775cd5c486b3112634685a90ea5303d7c91d8661293e70b83b85e0c7873eb28a69d441e29516d1a52c50342224296d44945bc88c00312df7446f4d54117ac7f41ddc69025d4840d316937ce58eb2f4d29c1519c1a38d523ca446e2c40b03471919895b705198329d10c18d5c10891a8e1690c3fa4c5fa84b0a1829960cb2cc4f0f68a815371dcba34374c469bc2a7d0f6ffcb926f2a938bd2b6274578b492bffe872ec071a1904066b23b72a5eba709ab61cb17147ba6b240bc5bc983ab446145149c7efc501976f7c39feff477fca362739005f212da033c9f119649226cd618f0eef1deb8f835e1de2de41428fb6b8c5340968ba14e4d70a21e82238b3d0b4c4244389a3ec3edab214927c348952880ca51131129194697220956847c7ea0dbd9fb698afc4873cd4c96d7a97b243d3128764458d48720a649d12d37047b4bf665aa00ab4f040d016979571dcbb837b87d0d78e0dae62d52344da2e659f8ef538e8dd21ee3a124247635c6424024d9782fc3b8aa0a7c95d222a87370ef575dc030eee1cf474dcdbd13d47fa3b6a6f4759ef34844a461cc46588d0c6bb24a81d8f48a3e95690af836a4d4f42cb96682958d95d39b4a6a15ef29b233d72d82387b773ac0f077d3596b23f477ae368bd1c44bad0404b0e748dc4c593d02d572a68ffe90c69212178de731ac19f062167fadfd419768c0e8aa36d04901f5375bb3e95b7c917dce96354994c66ee679e848535f00b48b10f3771adaf4913a1bc261f1f5802d34aa6edbf13e63f2f47a9b84ddd0a10474ec829c22e1b09d6c9b647dec05225c988b7cb6faff54187ab9e207e3ee1674d937d2419c6a44caf306d61a5516dbccf1acf5f250db54000c9fac474d7a27c1a0c41e9200796297940db59601af1e329018bc6704393ffe7bfe416df3ceea54630ea2158a972b5fa6926ebdc4c19db42a632bb5c484528566232bea0680ab247a9bbc44b059a0390bc61617f6f93bb9fc370447a63a10219a1d70c187aca62725227ee682ac56436c548a5d2f28a34b4720ce9265020603444152b7ee96a717f551fd78bd2d2f7052926b3c8a5c39412857317195af17221921689bb0e465e4e90a061b67d19683f6b1d84337fe72506824284f9d6c21c3930d1d790d15195647fd98ae2b39f2b3caca96f252b99ea807bea136430325a8c76c83a5625c78b4ee8aadd4a840270f25bd08577f99672755f4136eac93d92fdf505605fe4fae181a23544ed75a12af0aaabdb7ca253939054a5cab509c81eb50df2755cde68b71f2725b54d491c0021874a906fd1c3265aff9eec05846e246f826d84f0a034b118ef87bf108fb026d1407b8e9a69d609984503c3d088587a072a33e524890a1040d83220d291de595dc8d07cf5b7e998a73487b32698e9d55446056c306bd148096732e9984c578507fd73d0086cce09844acc7466166b3418aae600e349258876dc1d436875ad43a415c77af49765cb8906c1587a39c4a0acfc564a90d2238da52dd49aa5a7383703739f22c19ef8a5fbdebd6841f544c0cfece0f9f502239206c7a0ce11aea90df7c7eed5771d5ed63827b984647c2b778a58c3d6f064c83c13c9d0930846908cac2e6500c9e2ddb7a551d72d2e599ecb2b1262700844a97d7c12dcd9cb816206ab3f47d57bed8ab8f176278149af43b4c684ba40d98ef848cb9c339d3a3e5312e371c12351888a3639c77d82ff6a646033b42d9da6d11fbe62ef977ee75c36081872e9ce4d7302933bd3a43641d2f8de3587bf8d9d6b21a3e737f73d3d032b1d345ad7b54c5d1cdce87b8bcde86b0de3b762dbef6830f1aa2d296ae146e34fa133182a70ebc586339e8926ad4c87b8a9bdf09ad8ed6d48d014875f2ab39268d4826f2fbee4fb57948b60c0c574ee06cd154148a3d6a5681005d5226e8ee98537312eccf8ff60970b1064015a7e9873e9f3c5652ab2925b2379bfbcc6008eaafb2efb3e4bdb8a12bcf1cda1b2c59f0d2a3e71cf4b8fd753bfedb15817382b965bd96809ee79f9a4ab6cc2ad7fc328b403f1bd8638132212f13b2c6d6b697c09ff118535e24359254411940b3ca417360a9b5cfad6f0674eff877d5546ead6686a6d099b2f23dab4b8794d8b5b779b5165107d3bc8d01fa32e57a26bacb88c50ab3a37143212b92f55b9687b960dfc5b0bebf0313c8114657899e09a840e151a5ca6c082432b784b0193ee6691058317f85e76c309a496229c74d428ecd379eeda8f5a907118b36018519b0936fd6668667b8b345140ca4a5cafdf69cd176c3f21a26af218b5df989541970c2b084edc811343a3dbb5040c2676e22e6a1db356c8bb5eea006612e089aa01a61bacd69a147722cf4d594a28402e76997aa858f8afbb61c398db21e3e1e19dd8fdae2d472495025984753b79c8230cd1cf7dcb873c050c3fecff61b2e6d73be15990e08022a32d8982a2a659f33ac88b8548e9eae7fe7617454e6bdb56e4439d2ce628b420f0c7a4e3e0650d9184a4355130a2d6b13e18a23531f496a68315ac8f749813f5fb2974716a88f607d199894745d56f9f895455955d8b2f8138853c3d86395e7af1c2b345045dcf72810c408b31c224599a47c4b1ded0ed072e332147e7823a89949b911453491e8bddbf55396da8ebe3898213c5d85e8975a60f3f550082c570d81554257e7979eded3c27302cd271bb6e8be07bb2fc4520bc045268c3db75c51b29c14b182653da398052677d6738a371b799f3e6764fa839db5790c3997a304cb3712ab64cd151e495c38ab97b729b66741b20781b5a54aa6732ad0298540349e525ed21cda0a4d8ce41f6ce05b91624cd59aa3c5b3c174bf028e573537c03efa171585df4f43404c1f78511c65cf8347e223adf211c19510e254161020ea5ec44271ed58bd9ce40ce9dee0bfec3a577990a6564aef380cde20aef0a45e68a2e665ad3e4b2472aed05a00c779cdec79ee49fbcb3f3633408e0121359fa9f953e29ad9f699e9afeed8d5b8b5cebeba614fc920942a9f3e7e6ac31ed258489aecf99a92370af84b9a385e24e7191551f26d1e026a7c22a70cf0ea9e176205c2e43ab8a5b82ed041c929acdc784303400a720790fdadf3ed758d452f8ccd391b2281830793042512c0b1c1cd387cb89bf1c4b9598c676e6cff4ed714729b45cce65a88e4886d99760fa3595629b8ba58a7e80f7b980c3e7540501d2be2b26412078f11eec2878636c4901b8fc7dd21a02e879d702de82ecd2c3e99fc3a4e2339a0582bf621d2a528099d08c1302d90d59b71f1ab0481c6a66880293174c5fbf3d99082cfd8357dcd3d791bfb7e6d622aa316ec524976918293b7a33d0ffa5f89c83a97e7ab1c48558e779c204660aba25ddc49e65b7ddd561891c7a659b3373ad56adf732e73ea5e1e65c413a714bd1024c57ad2d051535fc397574d1f6623d593dcc92cae3ac4e82ecb84d17fbc5204d741b5770d11e3a50698d2be959e6252392d1ba75a8cd34dadc39be4a9498ba9131cf634377ad8598c34ff0901828b9139bab3d4eaf0441971dfcf1474524bf95d3d5536806ef725889caebe32690d3fe24256a8e0fd3c50da29aee516c97e2ea0dd1c5f1644248d3d59e9b911d5dac2f242669999cdb380785e287d959ee888dc3ae71118c0411eb28160b897b4641e5c51087b817dca5fbf9ffa7e96b029df3535745d80336f466cdf923c95edb26e14da7e445a3d10f31668c2af21446fffa7f0c09992f9bd3e4bc727d90b0e930f1ed032058a7730f638f9f101fac2f3c11c3d2533317cac7690e32a32fcb21275839b7b0d2b7366b96ad8de6c3a873d8a7cddc93c69eef75ce95d1a2d60dd6091f4da197d294174f8f0e9cfd55175687acc9146718e1e89fa101f30e6f7ae40c07e361ca23a836100dd71bd5d202be5965d5fcdb907e7c0f2934af798c1e8a21ebdadcee3812ac8cdfb118c3f6498c363139390ecd88057580212eaf95fb0e91473cd11e9ebe99d68616946c9e6ca9a3c126c23e23505e898a795616c9d8c5fab996b6e302dc17ed5eeca3656c24e84ee504a6a7f5e6922f66c1cb83641f7d0c1827f9366b816dc75127a6a7d896784790ad4578127ff64fc3e65d1a86400031567882f4fa36bf669e494124b12ef1934c76c134bd16561c862dcb0d6a408ca812c5395b40d43efcf6ed6889757b127509abfae7ef380f771bcddcea9358cf3f60154e37015e0ad1bcd885e281259e25491906099e11e77c0ac05fba6c4151bea7373b5b67304d69c95b87dc527f93debf02e664507a371a7340a754a6c88877856d76c2f3b451e046348b72cfcd08127371949c63a2184530c429aec82bd15a849319fa1e7043f0ac549785e590092546596c543b0b5ed85e2810c1c08fd6f6ad91a0d1bb92e88f8c355933251195b1cc9b31e4321bab3e0871d32a31be9b786249a5b0241b15619a0721d426a92e216409c19f1ce2b22c399038536cdca7543ed75c2a3219cd9333351dcc65ed800cb0b36bc9bc99064b2f50b9839da7b3b4e8cb6b667d8eba5e870015c86a166f0ab4f108b46701815522a92dbdf0621bb7198aa9272c48c9c0431d4e33f02cd27a85aa14b893ab8f8113a04429c44e1576d9d6f6757928c9e486db9c9fbb212aee4b347a3612aa44642e34d68e286356c408922cc6b53340456bfa8dac08470b251c9769e80ab103d5a4e88491fa5539d72aab5d2d3bb3f2418ca5f7c5477658c81b2de0fca0502e49603f39afec9e0c42816026b832bcf58cea59fe3136758cf144e2c5dc20cf4fb677492b4b690de95700dbe9156fe30faa36cb315a014bfc247d0aa3d6ab656a1491701263fe81a9b7bf7b54537475a5ee8f3709e909d1354d42254b75e0ee4337468d7290ad038fc845c31aa3762c96a8890b50ed5d78f99f164ff1f73b14aec6ba2eef5c7c45955e19f092b7ad45e40feb426f09682b67478ca3ddecd832b54bfc6d6f1e5a87dc054358e6fa0a913d26ee4538ec4540ed2000eee7f965c9f836f5322be2fe517295a2d5a6d6f67024036a480f3d45abf4d744a643a07f100d869ed2729f9ad258c49d5ccdbef39429cd8267888605e2cb3ff20a9eb232b6bd90d4085c206063637f965a4be4d8975635a6a2ded5a1a2c0e9b6a90ca1343652e898d1dd2834f0f313117a08d8b5f7d06b45128f2e94e5ccd59d6682f74c0cfd47e2c9c86480b9b6285b1239d893143ddabfb43f20aa61279d968e11234e9ad1ed04d9cd55f59f580c70a9794f2b06dd7931904f08312777fa655929beb08338992a241beea7e47cb9b332b677df1e774b6cd93af22dbfa9f827d894350cf6b934760a2ea529a5620b322917a4884bc9c674be7365d416d5d0dbe24c90369832d5d0e83c6cfeea9746fd232272d98897928e5bc826ab60b189c20ece9c214225597891c90a092ef42a034a28da840fd5aba99095017b5e9236479f819f1ea1521e645eda45d993aabf6742d7e92f2b4c6088d4a5449270411993e9551cb7174c104b9c4abaa806e7c6266f68cb0634f8026ddcce1181d3439436f7f91d97ce079fef90e38ee54ef3314644f4be4f848f9548963664b52b4f963b6e53bfa828cef7be766e9fc02299ce71dfd825d506a578484f3ffa77249fa527ec86e9d5787a1385389edcbe384da5056ec1d91a2f8b1f502248e013035ebbcbf4c4e9a3382eb59e1926ca4e134a99a50bb21c781951bf6629606371355dc9f5bafdffc5b5e6275c99b8a68a071783b85f7e5dc49d5f2a94c47f2ce5bf247ff08aceaa5324d5726d0abf857f6eb8927578d2240cf9984d5979330b3a6a8ed72379875c92bf52a09ca152b78f3769697171eb6d67db066eea9052936d57b2c0265a1681e0558a70af79d3afc64618094748df9b37ad96e934b7f4ee5e4099f45057bef94ae8234fd5ccf0258ed62f63fd0fb1687a0889d7a860247a6f8a14728f4c8671d2dd5d9cd7cc0e96312f521abc32488a4e0437ed6d497eef0816db5cc9caa4922f4da6bc2f594dce20bbc99b1ca252800288c1695e8f3e5c8b3dca26cafa101d0a9025f41a16ab6ccf53f9aeb5cc23315595441c475650e2b8cd4fd8d19c10887f81fb422ee3cac7ac53b8a9b6e83b107c680205c81b7658aa58a2bd35c2eb7791bb6a9d83a3b74dadfb32402a5178ce309b8ddb62a9e57a6e8353c2933c113d658ce17e6b162d28dc5bd2a93c5801135612dd008a0794ab262318d87e515c972a7e64aa5c38f0b7645939ad01945a413ada81af58325723ea3e9da3830186382273d1abb07f1bb95753d452e88f21d72a2c81e3927b9632f8e3ff79cc98854b3bf841933a85bf1901ddfbf9b2800d6e9c8b2b5aa58a51bfe72955b4df2168ad164f12769fd8941267cfcd38f55783b456a4083545ba06ad8e670b7507793caff84b19d4bda35690be6b1f1edbc04b25957c4ab09b2cfab1f2c715ee9776efb79599cb1775dc0c943e2172b0185175732a8c71bf35e7f61a375cce88b04a15ad0910aa0687a19c61c43a99e560f3483483633e40616bde193820b0bcf4b37131b13acb4bb07d30992a22aef59f43d0c2798c01485307492f9b6078d34d2eabd1164972a8d83228b3863d0be288041fa264257565331b1b5ba2f9c8e9e915acb000be63869f7fc489c0b9c2c01cfc5fcb43ee1f68ce0e4c43e14601da83103e8140f4e450880be7e423806328b89c4d498f0527e3465462eb3eae96cde5efcef0176bb0b937ddd1165bbd63217c78b7632853e005548ca52528ebdab9c0eb2a732010f3547e62c81c1f3511e958b3e7a20cc0432ca3df0769ca2896277655e34b87aeeb487745edc57215f4fc420518e0a2b5e388d9378fea2060bc3571e83da6f4781901f71bc4bd44671a63ad61eb1279fc3513bd7f1d3b47df5edd840ea9daf667b41ff262012fd29b81ffbc9049e0a3632524aa894ac984676253e6019b8e16526654a3c007b591cf848f0d1a046386a4c7e9205e67ca20f3de2aa1b9defa108f73d667660c0d8922f4e64e150a3e0eff42d4cd7033bdaf74ac17206a0218bb240b8e517b29852015f72799e617b8d9b92f6097a035d4bb556e2102e200c5343a84af1b387ad82949fcf1ac270a665f533c6659394a2b1e8165ef6d94e04c4467ce1860b5020bc345183f21158e974f15138d72eaa3b4feb9f3d6cfb77282e82a736cef41026495216247847b88f6854573bf4ba345bade6c1a21fc38ca4be4e890f973cdcc8f8eb607dc42eef780d916d0803a1e87ed95a99b8634a06ef1e8be54603b069adcf0bc57d2f6c00a00b1328c489fb41013eaa857fb2632cf6f241f87f0b950ebcd43a18ea8e92fcc17693075ea08909169499777c560d43ca6d4c062505195ba1efe0843bc6ff8c87304dc268bf990a934a70c8109f9c3ec26ee5992761c056f6b8b2de4589ef6d2669eff20c89f60b19c40b06c06c1af5b1adb1c22b36925f2db87e1a8d2c0d01df4291b83c9684f22c21899272e65b7be4df5b4d41e122fb963155a6c763dd9d13f400ace4042e580216bcd7d615579a0b18e8898d94808d6ca3135b52c90ec4815428484227379e6b81748b9c8307906a55d6c535170fd2c83a242bf77551f7e26847dea592f81485ede2969d39d3f25c58ad552b26ec9facd7108bd2bf89a05ed43ffa3581c6229208fb1a51e5150dfd3f62cd1931f6858d383a17f75fbe1b22fd9590443864be30194b98337c6455d022fcbb0b35232ad97027270be35a43b38ab79d8beba6eb560c80f0f05c7144fa8efc6dafa674d1920cf125df1ba1bbc999f1b2a49fb7dbb816c5aadbc35b1df6d45f6702589fbe6f5bdca1b75480339df302bd7d21c0f44e08d5c5940602291b9cb10ba64994ab342396a92ac1e92c48c1d03570d9795929963a0a8ff07a1f6afeb1ae0bbd427e4af5b9a99365db2387fc01a0e7c26da774dce2499fa2817112b9c0bb9cd76630756c2076fdd9579132c4c091e659157c86d20dde651636bfb1a25e15d7148a07e1e24ce71632abde671db4072653b4bbe456cb28da55f46c0d7978dfba1e8982ca4b3f38112252234599e89d53426dbc72928039794e2088238002fd2105304044fe362fc567b578ed1a4fb776219e59cbbab66774c418dc7d5b7d7922615efab2c060fb9dfda3b6babb02cb5a43aead6625b052742234dabe146a33c413759a208bc820c5e792477d2e808783c2f034a55af0ecad912d22fb88bcc1a169d8f41565375b5b419b217ce08097eb7ab5eb166c45d615b2c48dbb76660f803f1cca7beb7a24fd0d8166ab1bb1979c299b3bd199d3b26bc4a6ac8f745fff27430454d78535134a7e8fb24782218e066a6be90d52a001f744cbdc4ae0f5ede2df4d088baac7dc2f9bbf4193c4bcb5581a35cb16172ab5387384780b16cff18fb8862c7ae56d0d96b3a46436d0e342c0d812b7ac4ce24cd4804931298d23257f0810ad194a5d17f698911f846744ba8cb395f3036c369e7992169eefd994bca9ac65cdefeeee35399f77163df3be0fd48f2df7dbb091afca2b2d63e393f2c31121c5ee1bc35e92fcebe6d2d46e6a4f21eebb9cddf3964058591ba6dbcdbe6526c25e3d8e9b3ca003138b26d988d6191a4db7a7a7345060a7c752b6ef496ad0bf3b6bc20c4016b1c60db3778df05c27e0c7a6cc69d0ef14de0aa7779c25c37bd309e43d7d0f2c953b9d45d4ed073993d7492025d0003502873b763d78d1022b7aa76a27eae02d63866d849c38128484983a397259f6b6e5deb36401ec6980316824c51a2ecb6b361372e1e21543e78e947fb8f128a543d4973737c8940c8b94fa4f4a0e10b47ff66b2b90dd4498aa8f7dbfe7de10fe4b6b50f4cc76ab0ed6d891079db237f8f1d3675f477d3ae9895e84ef1b5c604199b6eb432bb01b74c34734b8d52ba53956e898aa70c696bfa281984d95d82a5b657c054304a3d71653aa8e909b164a1892cca48d1f2aa980a48d97c9006ba7b56312562caad4ab18d04776c8d80ee1eaf3a2a8a6992de34b3cfcfbd6684b5ded45c9639e7be6078f6fb9b059c14c333117ae9d4adc9a40f9e76961518fc005b1e1af3efff9dd59e5c0579beea5dd46a8835856b3a4432c7672b8a336ec3e411cc25c3e9f18578c864296e4a873b594ef777dac30fc2d103ccbc4736c1cd726df2526200422eba52351628100d875f0d3afc14725b3fc3b70e232a56ba7be5dc1dbe1ddfdc0ca649b319310086ccbae1b2df3f82131bc37de5de25c8b3ae66156e94dc07fbd105f5001ab6a9cbbdc79a461e5605736747b602fa429052a178fc76e004d2ac86ffd76e48582801ad6cb34329be08d8c05b8aead012874a522b9f6f79a564dca8d318ad8222e77a83e7b9281f3006524a1200edb997371314881abc2702438a254d8395b9bf23faa920fb52f406f94524d176d0eab18c62c6018ef049072e3148e10604fc9ea971352c6c1cec15fd0a0ab8002e2fbbe2666aade848d532cce41f026ac3bbbdfa703f2c3844233284b4520f830097b889deb5ef86dd9a97c7962770a646e843426d82be1a5cbe78fe6a6d42151f8bad168cbac8ec204a90d7e4bf795f4a220d0a3825dd56cdc54ccd2f1bb3567836d427882c48dafc20f41a7f79009663154158e8d1f551aab6e561f94efd9fb1fe6084cc4a05470894092a18dff5eb3425671084ed256d0c96a31d7500d2a629880c0ef17bb0d3a4994136c14c59954f333a222f9d6c991d48471bde793966a5e055181bfffdd018c1fcd943795edac9b924d6604af80b582644b09525df7fef02eb3c03d574ebeded24629bd055d547a6417b13c8103bba9537d850160e6e727fc87371049bcb01bcf3bbe23463d2cb235e04a6146164d3851d6e713cd87944633bc478d7cf5c0e8e5f4e618e52ab12aec6dad710e680912fac222c20f40dbd075cbd66733519273c9940e619e9a45b6ecf44677213f772c5a5c6c664f95befd5e2e0ccc93dbb613cb74faa7cc01f7873a97e3b701a7a901c038481e84df7771224916655da8321cc9c300842f8cda4389d2daac24ce7b8306b51c8fb4a0bd2d63214ce904d9d167679bf11dc2f700ce1ce87de64bff8fe2a93e8927ba6167b278d782785671d539742c8fabfcbe36bd08111d707efbe258839e3e1a9fe36e32ba88bf7486065ef8a713703741774cc72035fd80e2059e56fb7b4a77858ffb3911b4c84d1e60d834300f4688865583ea94ebb1a68c18e63d29d06f9595d2e28c6fbadae9b5fda46016bdbfd99d8327d7049ac87ebaf28d7ea0504a16340618512573f1654dc25d291c791449fcd3cb5b78ad9579f4a009ae6e79273314fc80dc11d9274d281a7ef1a879ae8b765a4684029371a7ca280a7f570e1bf1d02703c37e06f8d9ae07ffa80f29e1da232477844216b462789e3d9f751ca96875fcd4c7c00965a273ee8e90961500f5d79a727dda876652a27995ecc675003a3143d69e80b826f9ccf563b3ae00972f21b4d68ee9bac6f6972e81ecce91c5835eb609781c169ef1ab5bf6f0dd23299e531021d0178fb7a7b8f2d4e80073098f5597c83046e85c029fa7c9899c1f8229b8241453b89278335b383990fa3d30b3e72ab015853f4ce9ebd9d8ade6d5a7b50bbdfa60b743555bfc8a2c6fa3e75dc8fb97672974cb562345857f0e5a3795317d839c12b68781da43c06df8040df1ad1029c0cc3224c524221b7d2f11fb471ca17d904c3e192e10e174655d7f2ff7158e0e3a0f0530224a87ce6328537e327d08b3d76e326de89153d5ab7722b7942be48d79ed3194c14924f900a322ac9a87a272f03371fef51cc2eebb5a870b456ce9f017590a0f10d3ba8699e2f91e4245148500c102601da3dec98d36830bfd93e5cbbb1e5359b07c453ce2ac8ee52f76db724e582700c01b755e0f3a930ae9a22e6d3aeb47e60d8a3957d5c5d2f6f2d4e8b80630752e668ab7ca147fc5948667e57f852277dbf137ac154084bbc09af1e48401818db92d6940eeed215d49763375cb2b80607d055db39edc130066eec11b980f4d195c182961debcf4491e7b496f34b28b5d9a66facd9e691b0b89a6a16b8a5ddd66393b968d425bb177c9cd627c13373e0cd85418ecaf75f58aa7fa828760af739607327455908aca0185a4977dd8f71d682c02e7cd4f696170906a9df5f37da5a383f672bec6cb812fc9f2de068d7b87cdd8c1288a2269e63d127a8b742c65bed156bc8fcb41887954c9324cb9a74bf861a73651a6057129f4b2f219c011e20572455cc0f6e5aa5f4634ee896ca4efadb6ad2c17f0afe7b8742d22233fad060aab989ff12224c0ec757859b61b69f33a4f8e303a307d108587c3ebe6c7d92955912ff2a4af6b5aeeb7cac51122d884fbf14d32230ef169d4ea27eeed43dfbbf44ba21293680b6153d7a2d18bfb0c1b44444f6f5e75537b011a94b8de733250a9d7fe3e8fed8f913706b60385abc14bc7d427fe7d6cf41854799b40e78afca988a28be7adef295c848d27a5bed27a1130634e28e6d9e0805be8d933fa646f3bbe665793de3e084f579b41b2192734422a7879556ce50289cd47a1629b63ba1503d6d1be710d0ffc327756e790ceb2d32e92415b480351ea9bc67e006956d7a2ddc8ba3088f0bda7c007209d5025cdee02c68bf99d057eab0a0b2b0b16ba5036637e6cb5cf51f132977c24ca64400f00e564da0a59af67ce73ed53a1b31150ebd6de28678024798c9340e616a8e3259c73389434cdc31c564f66e708e7eb6ff96ff5232cb046b674f4aba6457408bcdb734f8508951154ca63a8e4b103b36d206337e4f03711730abf89d3c0c3b546dab8d712279a4dca8739a9dce6b450809716608794279152754326d8ce68f3f4d20aed244d59177c679ca4d1c27d1079c43ad7a8f5735229258a05af7979bb0460a594bf3e1b70c6b9f41a330da533b80dbd45855581ee5046aa8c82d36f77f5308a0ab107396191d9e14d5d5c398ca6c04317d07d2960010b39e86103be2a510833406de8e57467d7901f70ac460ae1cc9d240c0ef28f56122cdbf2d719c1dc93ba4671d622abdc3886b31491f1abd3913fcde4b3620b848c09bcd6818395e05dca70513c306cc2977defd3f82f8a72833be79f00910e5d36aac457c17ae3214bd0999a43d97f4f4ac5fd1bb01ddba706e0b165dc54f3878705d1fabfc0434ac89f35db0e9bdf13470c11a21a6893d78096a6b88a8289347547c3448941ac04477072e14324c18400a6a2e91a0ce19a18b0591d75d032615a629489826c303b314365222024ced3a337cb897a06709c05c6017ed019c170af357a69fb6393bf094b5a948560851392578993e46adff0c116b6e7cd6689c529b0e50068df5bc90f21834278b2e419b1b43850f546d1b1b388716966d9ffaee4497522f56f6f0fa85a28be59178727183ad7acb89c7152ad318fc1590f9cb261e853dea229d3197b9a0f83010b504e9a41143105f2b78161a103540295e2e5ed6612e37c04bb2785a3ea9242c6972db144a58184516bcda748e893ec3f73262e5c1bf4d311d8c23d5ec5452f13a6cdc8385b542167a11fb3ea43cd08114dfda921f60e9e2bf7537c7c2d68d7c5c94a5a2b01ba78d2c85ef7f717b36c2758c408ab2a5648ac88ce8ae59ee1fbd4866dd08509b3a7ff060ad820f81d669204ed5f743aa8f3200d654c60cb8cc7ba13e193814762a12ede0aa0b7f9b202f7c0762676147a48cf5c4139d1c7dd0a0b270dd88cc9b6495bdfb83524e6c2932024f2202d333923067ad201bd678af502eb23fb51455efed3442a353108cd8edde75fa5190277e18b65132190fb5419ca1f2dbdc208cb0af587d478e12166d5d9f5a53e1cc6af00053c37b2aac3919f6e0913badb142b71c76f0e1ad36a405c4584928a869b9c80a6a3f180c22ba690235e0c8880aa1db07ada5cab6f593fd325535cb92bf215c1789bd792c3ace56a129601c54497a5be1d2433cd604b135d1ddd8eb8d8fe22ace99cd8fe5252cb895471c2f8c00caf64d142a74a1ca695a3ca69057d5314a1c99d02d936a3d63f52efae44c684e11dde2782180f6d729ea036791737e50353c4f85165032f4b0c9a4295461aea45ae3ba06c0a021e753c5fb05d09acc21269ea434e8ad4b536af5d1b3707fbafdc51a032523930ce31bd2fe9adf3eb6f5fd4228e36b6695a769a130637b0e0f922f188b17cfb08272d2a11a5455f2d953489f674a9718d47c6df1f2277012e876daddf7dc46b7cfbfae90df465a336c4430a66d3755d11f9e05d8f1394d51c071f4e0525470314a381c1db8441fae0eafd31445b88ca8418385f7cc13c60c3008084e79c200415bc0e1d456a5bb46d0aea6c18a56af5ed5bb119acedd8b49e535e67d7905b30a6fb881601b03d8398752c30c78ca88bd54443e8545e718f1d38b19074a2e79f3157581492633ef85a380aba3c52d45adf295a02cedfbbe302f2a800043a064a02dfd5344c7bb1176d88422c141ce1381aedc0acdac3bf15a4397203f71ccfd7f8cf65beeff0aa2093bf18235183a34ff2d09b9ff323b4a2dd4616e4b2af0ff15f983c8ac3af0683cef1faac0fd8ceb2568642f6aa12230ad8af36c30dbcdc7d76e76c9d6f5b5e3c1319c10ba82fb95e26d987d2328da55e9bc173e84f8012096c7cc62d5332390dec460be161687d3d1557089bcad90a768b4e27056ac09bafe86cd8fa043d8e5e4830c910f134770f710c5417335c3aadba6799b8a77239ed955f31590edd4c3fe52b73fa6a65694dc8cb7c0016fdcc1826edb9ecd5b08a124a83577bb574277b020b6e0b68e3f5233a222db2c583a1acb140dea999747083ccab2279b6918044de93ebe262b6f073779ec1ac67f0a49fb99ba3dabd35b30ffe8638f35caab1adb9819989b100d44f824bee2e304fea435741a474ede799cc9d6f53a72990101b3b3e199817547a864e71a761b4178ea7cfd42a7c311451790cc1120f829a14d224907ba3aa3e851db8573a3465a2f89394a89f0c3c677cd1b913912191343527591290d22d5f88bc76d195caaf7f9b9e7050fd1ce88f093b5fbb24127640b0cb476b7e9e8b90c057827cdd0af069316b3c1330c98f3ba9a705de4fd2bd66e2d5eb3323489864c7de2a8e0e5444178d17a10b948f2263433bd00d4261ece2f902ede3496a20e4ef8c3b844c9a0072c8ae208933e50fc30fd99552416dd44c1341417a71473524095d48d0c91ce0eeae4f3401e1a94ab851dbb1343ce0824cbc746fe2e29272a66f8b5094f2c659058232c3f1fee606859da9f83f8fac5960a4796f96e785d4ff3e8042663d625d38bd2c8dd3301a59143d9827fcac43017d5820b6eaea44bc659c5ae2599696bbd54e09111a875525eea808dc71b90f88f7131a3560d0ac687959e94929ea9eaee1893b31b72c71cc0e7df7dbd5d56ec0eaa06358f12f566e6675861a3b68640bc5b4552fcef1063173c62af424ef33370a9ea45e0a715c6d18bde8e6c5e56dc3b6e8be1de8a074e1efecdd8e74a39f1ba207630d146afd4d4582fca687fcc32327ddfa2dca209fd22655890a18798fa441f549565c58efb8cf25d9a2fa45e8bd0489ca92155405434e2037369fa8861fa91a78cf3a72cdb79835c0f369bdc5aa0517fa3218b219f83adc865d0e3e10cc2e0f0d18c81e2c5927b469e6771b42b8c80223b4ae4e7380926a763ce882c50720b760a354b43fcffa238b96f2982b88d75c54ab3083c1e1c98b8e7ba05aca3f04dcf057d487f8b4f67b4c8daa025defa4300505a1a9cf51f48c604b7fc008ff59b5da0524538b4b663c747bcd9569b6a566643a98096626d97f63905778ac35904fcf990b012e975a99fea1e4f531f0bcb278bdc466d6a4fe829df9c957b91774bf183dab2de613049e47ae1d879b62c9ca90859ec981004fbed31abedcdc8ab2d0d5f4035266ff475060916ed2e6871daddb81d75dd269ec7e8fcf9ccd8a5df25fecb33548c4f3362c470292f5378250dd4e1c8f58afba43db9d34d1c46616d88a4b6567566c877c2069cd523493d350fc75fa5b983da95814056b1351a2d1ff502771f16d17662e8482941ab0be062911822977626c486be4e35a127787a7547d9b342dcab200d982ef4401eab21eed9ae419008a34f63a2d17b8102a38d8a880d9ee9997a112635cf324f24e369b1de96ff0cadc5e7c91be6371151f4e0d2f63c41a62ddbf541097a6f4e53a54057f6bd357e8e753a9972e7579acc43e4ab4e3f04df2bd83158870a082a9946f6b81cafdc0dfc2a42acb9dbfd3c5945159f360b57b3587bcea895c6ccd4f297120ac5a0bd9f942ea0be7220ed707ecbfa3e990052e12cfb337527196c20f456cab12803b1786b7e2f1141cf2dd24857f08ae1b48cb142eee6e1d6fa4abb1108ceffc2b7e49ce80be42e560b7184c12995651298825ace0686845cce8faab31b38ea5e84d90aad6e95140213fa8e0064ca611e62131a8315410594f80278445e162f9f0ab17fa2b738833ca55c92566bba03dce1687054eccb67cd164ffd6a33d978023d73fc0151a0c9f537a2018b56d6e9a64cb2c06b68cb119c4d7ad31f1c22c5c8d8c228e8d9acee950d2b1417ad21172363bdbd06de67aea43c344ce51682f2d6dd7ae7199f43b9badf625f24ad0982001317c3a4a825709f9a19a0ee9a15a067742db5c25b368f3c811f0989f4b2482ae689b7ebd705b474ea08734fd4758b2f5ccc51de1f234a3d4173b8f15a606163aa3418dc295345dd1d7c87e4438414864e38911d1116925a0d7dbf046df2f9d5216f1807a66c2bdbcaa3fbb8efd8cba91febfd1d106ae5b2a2a5d6c540485778786121bd241feef0eb9edebd73b5b988c3f328baaa2aa37e2453599245c6a8d2d55b22aa751cdebd5d9130e460688a9092569d8dbe9451af13ee107ff1d6a9c09942207fe3e7c938012885af0c4da83a1cb7bc7820862a39d1ea709490c54170b9a5acc7ce7b0bb19b2ae3ff03995f75be4db460df97259912672f651da86834804b4ee325d167ae18176e806be1ac52641793ac545516d400ee161cfad0f9e7d5b4898418e4aab34f42724ae6d3cc534c91400b47a93de0413431429ff6a667ec4c28769f50cccbef9307508b0e4b06348e726098615b66179428a68cdb205cb90a36e2af21b51b8955318ec706a1e0691b7c8e77887b8e1096262818198ef76d0005290f05943e385f690fd4529e9263bb812d0546e14ef642568b3a59c0c9d5ecb180890a9e046cfd1790fb71bfd7505985c7d35f979dc54d20bf5e07f5e7a34977eaa4b5f3cefdc96d068801ee39732ef0378772e25fd6059a05ca798641da54a3973560d05fdd52900591760c6db16b18f338d942e053e75584324a7adac003e959688a141b1642598fdad13b6228d3dcf5d0265b601ed26a1829de86cecd69030cdb2f2ca9f0461369af26b221d34ec591aae99a4ad7f42a519dfacf5d5da5ec01bc2312874a4bcc166d390a503dc37aa95a51cd9cb1301d8585ce7c2a3a8ad9d775400e6212c1ed77b36951f510e4dca906f85108e04337e39f59ebe3a2a5ad02b40a86487a2f0e1a4e3d5dce7b3890611d8b5cfd00bbd83053095695a02c00ec130e3ddb5f74e7ac9592f1820591374c53f5df13c9df4613f5ae4472bb29208a0b7ff2126891aeafca3ecbf8798fecf2f08f2b36912d311d7aa42b47d2709ad2884e72276bfcedf8405809256e5fd35228092d92079d4db29df7d26f05770501396edb4508c8c9d8fea6db3e644ca556c18a38c03086cc638f0022ec40960c578fe5550c25f86c5fd7d11540d5be989f8ce7024ab7564ab10f905ff1abfacc4b6e6437aa24420c1558518d7012228d0da1a079514aca0d54d0b55a120f93c78802e5a6822cb147f4c993a1b852a802c4fc65500bc681e6b9e429263ed321db97beb674d44c4de7cb05caf8f92836def2f6009a97101093c652454402aed7fde9299e30dd152a39b28bd216b13074f3e07a5c82b440a6e8038149a47ef19219ee73af3df8870936305c9ebdae92ef8053c42a13dbd51929a388668caef3a030dd51ca886054f56bef4c4b08882c45ce56567af5d092e580cb9ebebb14eb7768884f6509e8b6e498eaeb9c8ec44a7cd2a51ad3d69ad3ae19df1bd28ee584488dbadbf34fa49f9b0c7852d29ff60bc9f53c87017580ab390d9cba649b382af5a21c0c9808deade21683205c8ecc4c92a7bbefcc2d786751da6e6b74f4bbd0d1fbc2ac7576a12d601ff22319d44a0e8b434523812ace0d5901998b0682d5619c0a7b1dbb4247b8178ffcc9aeb1506601a45a8598229d47936cd19a6220451c126091f59da381208b4208f88a6b4159094f1461a64351bf2e6a89c8315236789edd06e30fa7d98554ce738d92293854dcc2a93489e079a22b5b601b0373d0ae6f5d9ae721008e1f703cc3f40c264f2ab12be123a213828ee0a23c92b7dcca4506efc40a3ae759dd44b38de615d47c01bd6185d0aa1232756bb8d044ed564e59c5b29d559deb010c2f4d27498fee3aa773b146c66c2c8c03fa75763fb051f2f71055fe35c0341b4fab5e64a27f5f3f26929f80695ee7bc00c2e05c036acb066a0a270491e0cbd08d48781b2bd5793491c76acea612729836150c4aace785f81f531140e8554bd91cc2d60bb3d86f158c2a08613091c475c8b05c475982a86494b966c513cbf0104f5ba2d9d664b43a21e39599f0ac1000a5e0351a3a0d8e4b04dcb5d23b3bd341aa1009a9879d245ce0884a8b6bc9f8ea7a84f60336ef897fd4ac9f17e9dabd9162004f3f58ae8d614026c1a31d23f3f6a23ffda8622bf65c037a108fb5b9f0f247d750b4755e5b7731a8e41971aea9000d61add4babd02c5437ada4bf7cbed585971cfe3ba2931ec3de701418bf810a409a9df1fce7b71027a6fc5d914865e759ae11fee3912411405c9722ce223a7a0bba811737d9dc0285718fc6966077c4b76e675486d11261182ad2e16c77c368ee6c15d770695292743915d4f9371d32e1076806fc1fd9dac7f0eb051a550ad0037d42b503e384866382aaf484055d7cd5fa0ea11ff5704664342c1eb96fa834aa4fd53de8089b7e46fd69aa1cd53d5b90cb0b1ff552169751db00ba8d0162e7cdf98f321e32f65ab2be4d95af02974b96a774e4925b9ea292214abdd414eed092861f45314a453353fc2eba9a68510852b55d2b87ba411455fdf34af3e3361e5af59006de76e43663523ba4ec409e3bdd83f31f2ca15b0451967ebfce9110fbc42ea8d0e786993cd7a2bac00476bda962c962d2f5cd918ce2da3591b45a003ce10a19f1eb50d43f3c670b353226d98bfa4d632fc16396f799a73817d47dc549320e0459a48e350f36126441208b42430f3357f6024fab3d5f999cf9b3011e6584c7c58860140d775310acb1c0d67eafe0d17eb49d8881a84c9bb9166543e0b4537790e9a5b0c4fb67fed663817f8c1154221cdd4640e2e14a880f69abf5b3add016da9c696eb0a1f9bbd852f2c0202ad8be08885ae85ff2badf07eb198ef1be72542e33cd17e21c2ac017c60b99a125ba4d4758b719ff853018fbb58250a88326e83145e163ca1b20871065f678f4745b562fe0dd40c10f30bf2d6747b61f049114d6e5e95a0da34e9211ce33f159e82f29cc151fc012b0906348aac99f7e1059a7d241da46301ef0c78afaf423b5b4bb51bdbd8f3d544b9a3851d8bf893b109f6a61434dd66114aac997dd45208a83a0c0cf2faaa25c20a433fb815e92fe2821654b5fd829922972aa8418905e3761debc99ca7ebecfc593c81c205df5691e202a94838ce34af218d05b35b550e13b135e6f431a989625778b33ab7ba937266510cdb44284f591f229a45b83a19a545f959076245b510f5aca7e612b69f16933c74ac8ab28ffe56594bf180ab968740dcc299eb3519702975b28f535861dbb0a9a2b0f7696e17519f22d3f05bea3eb973b5859a4b96713baaf74d6df64a8d9814b1a925c4d6e7b2376f1ef9b46d30c9c89059d31f06c2d7650d3b27d0dbc0a98040d3a0b95263bc216463580007d7a8a16321b8e21d41ba31321663f281fdb9dd2e88842f1c8692e18d1252e10ee4c9edf76613aebc7774b35a79a00e9055cd4db82d1374db45d001eb7132b6633d09274a6e24c341282ec1daf451010eb32210c0bbd4a37c6191c9bb5d4e6d202465de979274723e04b9c2701bae1240a7c29490cd26d10d5566cb3d1cf702dee10ab88a45db48bf2dd04b440cbf6fa1bab2c7c41e558c418456dc2c9e4632ba87804a5d27dd55768896402defefc0132fac02aa237a21b1b71d5605cfd19645e7d62a6ef608e9f141d08ff2df4ef3dd9bf6465510c6690383d0e53aed8a0738742c86a9309a8a227abc3ba0b4f0e26aef83248dde3813ad081eeba41aacf5bfab640c60714a32a655f5ee1f6e45413df92de13372809983e78c515e276ea5abe2360aff80c1a3b7dcd8bed046e3199e1273bdb16d629493cd90d0e8b788726fd785e17dce5d429458025726d462706ae88c9b7ff166b1735b9b61a408753011d6462d3710f7345fbd4c0d3435226fd788269397195a96c8859f135c555955e1ec45bdd8d1253115e00df0b55207f70aadc0e5d6d52a736c6aba7ca0ba607031eaf9dd19520433c1affc40f24a9a146b0020cb7c15b317f08867beaaa48996f44a4ceab85bfc5e5cba1d2d54c1b19dae44b88e49d1880b9aed00ed4a184ddb11108b339a52a1f14a30bc7bf0f88d155966011b897c9d881025922a2da009a21f77daef46b100cd5943108ae7a9793f774279c48cb4fe50d5f7cf9858223216969f65501cdc57ef1ec6dd224691065b584e94d26d03ba1ea0841802c5809c3a17754bb194ac2f09686b66b07b04b007fb3e59bf5445881683f65b28ba186c8018b80a8d949651feb893db5937192aac009941033101c47518056779dcf51b91b6d4be2e65e63457ff61a71a1c0c2f566ada4942e39898e10c768d2ca6f3da2c0aa47deb42abe90eca321133ca31db1519ad9279360f64866b587a296aaaf1529a654d62c1e22ea2de70e41651234419d3da06c28317c48eed40a7a3e6a85e7feab45445e9692c946ee709296832939c38d2e474c3278299b1350bbfed34e45b9c16402762e893809425f30637acccd0b317ae9dc0cc79e25a669807edb148096e5ac239ff12f49ca0e2bfe17c9da72439d88dbacb371609d779731d35c8ae4cc4d32fc9703dfe6d65f18f69ae1546edf0e552fc85a5fe243000a92325944a2b555bc887387338ead4de2ad21a2efb089518c0e525d1af563f1e58413b1ef7597691cbed928e308c2407d8780b1053d1d8f4b5a5b07224a726792a2144396fd0849106a6173d6d5d37a327c48504635e3b776dc89090480d885c03b66adcccd83c3cdaeb213c29ab8622b7d8b2dd5af0a97af282ad72ce4e82be9c4d00fa688db31fe9b300fad016dd88556ab7d8e41b58c76749404a6021261cfb98448cb6b5e88117c81ad629cb9744f689965a8e6ee8f83124c072fc2dadba58bd391a78526b36c3eadd4859eae6ad7b5c751e92f628028bb54ada89de7077a8abcc3f0ce930a064b41937e6695bbc6d78f20f36530429c28332b3ac1a106af59e374413ba377e39f05f3b8f887b4b237d5a32f6816291ec1c3255fe6153ab38beea16f31fe57d3f2e0f07dcd446f4d42898c8b658f88f865c1711a62d5a20e3d8ff488b1a10f9b07f247991cf206160562d01adb240d4f21837fb120da24ac49ea266c9fa11fb2bc8ffce7f3e70d5ea71cf958149c604fa734fe08bb538405a2c3215618029f59b69fe0cc7754bc434a3f573c50d14d1ad4dd913f39707a846965e644209fddb3d04cb8213843d656ea27746ac45fe805e1c769c7620406a194cd6f23cf8eb003c74f622c59f0dc67ef04c90162c7aa4f31840a762759a103bda95156d096701590c9eb84a70f457eba825a4e58946369d3fa7c68ceb6af96928787f13ae60184d339e3e51c2995d920e6b165b1db1984ac11f9262a68c8e94ec53a69da01812e42fb2f3d6ed0948610dc6436dbc0de29453ef6f91e496b5c453006e1fdb89ed3cb82a96245e55ecc3305b206185b48d3cb680d38dd885cc3c823e1a79856606f508238baac8e2893cd917799ed75c37552ec39d8208530f2cb029fce04dea7cc6f1ce7db26c5268f9246d8a3ba05cb219a15aad5cce83036bd0c90a5aa2a48b5000bd1cbcbcc54b4b97e74f2c212f2d07252b4ab7ac940d7c363ae992a7d10d09adaf2064063d9a03818925a8933dbfeb2513647ebc340442e6ba2657771b9198c41f53457349b982dd4866a02dff67d63d033fe33f93c568203b74d8a0348cecafbb04162e8177fb4dc7b404acbb4596512d9f09e20b2268c1795cb5707a4f28c26661b72e1ebde207473e5c1e5bad5120aaffff67c79ca83ddb788a7c9819bfc4549419a61228dac9898c9f8429624d0b0ac6956cd09e50d17ea4205e71c6cd90ba07911d4a7d57b36e7511018a62c58f0139d6d2c6e4282059da30022e5015161166a05b3adf67da9431725454eca5b4ba808d6195e2d8eca6568bf19d76d799295decb590e7bedecb6f1735961ff0c02fe9f135c12ef2adbc3037fa94b049031b3416cd4e82c10c6167f1a41c3bfdec8b11b6c43ecd9514a48cdb4f28f2181625b8794bdbd5cd9fa94a52a9eb20a203e18bb85297460aa57ff7ccd189922f3293812a643230bb500bcfda942a8762794ab782b360b5ba31776edcccec553b1c0d18fab1106e7e360df3d007d6e739904986d89668a12149e218addfffc85c397d27d23cc4893e224ca38fa560897a7b1b213d8580aaddac3e419f54237df5fc841319b7ee5552c95340ada527b892e878a2b322ad333a05b7275cb4e01595cad29e7a3a423d0cf7b0ce726466a13ed31abbd103b071f27234be69c784009d9963e9d4006806732ddd3c54f1f560d09e986d14b57610e1cd92c738cd2b14bef0514e2820152139d9233c4e04cec4170cab44530947a3962f27f8759aa3a2121459e4b29ad04a9dedd0fe7e841cbfb54fc3053c2dc5d0f4c39ec0bad5f4e0363e11282221052b628af2a662d3c4f070eab9d00167394bf16023d0b16f8c7df873802ddf96b60f500d4ac6b1ed03775d98ca4193f086b75e77bed31eb9e4f058306eaefefa4b2d625865a30d00b33c183902a6ad4c76acc37b0d9a9dd82dd1ad22dffbe4c53d33eeba3a49c1c72e945595287c50f15322a2f55ba15fe02bbb432e7ddc52f123db14a1aa4691b45644ba2091b00cfd2f2a1646295ea1593fba28bff5e0e570dc2b874aaef9e93d20907165fc0dce04a1f2baf16b8c6d298c4a7f533fde05a5314ec67f6def5ee2d89a7949ec3ecedb6cb666ee57e296232584646304f7c134ac465482fa882d567ce2ea26694c55a598409aa25895a32be9bb8e54b2c06c34d7943fd4207a392b8273d3664b8f3ac4ef749acdfc04ef90f2526ee80043332273618f0e3a3ce2985b9a121d1e3333d951961488612a8344cb60235f8d0fcfe4014121d3bb10f41bbea4a00282184c56fa0800d452cc13618e53827110a081394ce64ffd0e5dbc80210c17b7b0cb91e4cf17e504b8f12f22fc1fe249ecfdc8f6a7c33b434613816f792d301726381540e7e8833db04280eef77e0cc1d405635b23088224389862273f5b0e127079320fac5246c0db12818ed593d792c3901f0541aabd087e146054d686cd48d1328bf558fdca249b95a408d78bdc1318917d4287847c5b043d673710e5ebcaa411fb8b9f28b8f019bf19700ca6aaf4e24f0c5707a5e00209b89628712260cfb259b20ac928d40c46c1df398fe8f71a6c8de7ed1cdddf8c6e2cd337c32ccdde4203d6605a420cb2fc41cbb0e24a4608a1fd6709d1b7cffc5f339bc46a74acc8ccba9fa019b146398db5675b6f42de26d5c15587f8f04992ed690fbfae43cd0309980bdba2ab8df398d9d4cf9fcc92b603d9d34a3e0f2e728b086dc9734e0f43a1cfda4bd8df90b21a2f01864b136923ae49373799d758fdd633efc3d3d1162fa7de4143051c4f4f9201890ee90f03152438feb5aacde199aad7d63e9847cb41348e869adb55e2dcf65270d8e3f9dff4ab9a68517c84f02b83c7e805f98adad1d56b5801a0004a57d3c1a5cb2f27c3ea6e797e209bc2ca67acf4c3547220efe7ab9f569b58d42d84e8e1604c7cd25cbd024a4e3116c4174e14005be7aa37b4770178fe42b928f426de66f61bfe2b5e8c61b3993b1f20eab199e79d55b0a68a577c6b484c49b312bf9753bb70a3a24fe89e2ef3c513797b48b0a0cef5b6b58084ee138cf6f324200bf48e8a1cae3d51c15ae7068e04e2065b24fb59e02533602a79d82bc5ed5c6dc74b1651ba0ae7f0e5c4932a625f8f583a92b4c1e31eb183e1dc72c74125aa55e9dc7b5fbb78b17f55c0e94e95b44704937fbbfc88dbefb2fa62aac17e384f752bbb98a7feb43e534740b04919749840d9e723009a8d75fa475fb9f7a80913819334e01737094083e60e87758e0fe7c843ecb7ec21311b7e0461a887e0fcff713b47d7ad02a414790238d79c565c05743d7f4e62c3fa4955ccad5a7477d67bb081541974c3faa2cb4a8e46c6de07c0b01869df07c0b47c61b9a3ffb3cb03baf2073f0018fb74613722163adf2902fc0dc503d3f86afe401c8022f059a3e781873e93dcccf6f5fd2cfc15cb5c839440ec457b17d48092364e1412d943f7e606ff914757bf238250420a3d943b974c0bb6df82fcefd1227230c34a6029e5bce7101c98a3a1909ff2d39b358b5a693e5a94c665a9c3d1cef13335441593909a29c52081f460c0fadaabcca2b4d2a35a896e312ce43e9282b651e557c9287d7f13cdc0162284294822a681f2939daa6efdc13a6304cd1d3acd805323e85f6f2db45ba121a3334cc50e29fee4353ad930e5bee5e3a4c64242b17504cc08aba7fef025b6fdd8a588c8562e896e560f60665ccf18cf34b00a9248fb092bde4c22dc35fc56a8d69c3b07053b39f4770f234aea544e3805a0f99641b1faf1f8f1b84d3776c7622e4de1368fe54db4a810084cdb060cc6a7f500ad935e02274728cb263b3041721333fbb5ede4fce76f5f183f13715853a7ca335eff556e7e3edc1d5329b0668c610821e1111128a6f45d3dd9568b145358d87e178b004b9358c1d1d6c1f6b6f32f6e5f8180a22f52fd4d28925a5d16f2449d91b74aac5c8e92536094ca9c2818595144d08c47dd00792faf866e8bcf4ba37f0f1f93548ea060adaa21c79b846c55165487a8408f25bbd74ff60228771cc52e7723ece912e6133c9d0be08d8e2798931f0957e6b063dfc1de3374426b18b12793050550a81b882b3e64d04f34ef52516c1cb09c52b42c508a2318710d1c4a552b481cbe7df39ea91f929c7faaf49b2a822ba227bec535f8a7c054e8607beab7434deaa1da6700d4fda0d255013e512aae08f2ca0db11af8bdca089fe3bd8208691ddd6c287e7bb986b5d28bb54ea99d3c032f8ce0fc7fccfe66cd031001c3e551a07932076ea936474e1a0834993493f316010c75c70b118543a513a89668faebc35cd482aeb6ff168a7b49f351c21e66902b06d8f21375c83de312b820f0f0905b2b395d8feb19f5e574645c9cc0a8e414c63a06b96536fd2862f78a689fef40eaed5b2f4028a63c3a6c9f901948b52737aa2c91db81f6bb448888f3d3cedfd5773e2ac4f220905fa8e3cc70e4c8cab2d25c348b2de3ac9de1a8e54a0ca65df4e41dcb241ca37aab082b44b244f0413b4759d0da2050420d621892883bf64aafc97a1f58fb4bbfd8b9f8bfcb8c470a664ee7ab8ddb6dd8f69d3a5d7b6ea116937f748b1488244d3ede2fd2d84eb8d63888fa0a0fcd1f87811a8feac9525839f878426820ce51a3dddf71da815601243b021aa4955a5c404c2d9b0e54e04d9f7dbd20f70ee81ceba8d199cec393a38062a1d2f9ea418de8e04b72dcbaa15e29c5a7f332e181f41dc0ee86dabfe239807dd5b6a478af65a47456ac14b811c3a547ba099330e515696ddb526eb9e5de524a2903390641056d0530c878c17ad1a5a6828a1828b4313b2b137ed4fca01991505bb2840589b604e5452d07e5442d0a1b9a1516686fb24af0521bc14a8d290a0d8b921f32446a5274b4aa1c34264c6266d4c03c317af124851a175630a3b4551ba282192c52a0a88c4c2505a951d91127b782062dcac911ed8a9315536f7ebcd0d4a8b85280a1e9d042238242eda9492dc6094c52b4139e68274ef0c3428d1334c1d1963469a10427043535225e35273159b87c4981b67b423b01929fad12a47c34dda89d6083a693f183c5c4450e26b7a93553cad07cacc0c5aaa94aed06af6695844663c84f17203f2ee0a85931410d9744db415544834385e2e7aacdcf972f1a1a2dad2f35aed09c90baaa8645ea2542a64288aa213dd140708262a36602245a0b4b8aaa2c4971e48696064d91ae1f31505d6861aadca25c5952833255238a52f2449be174b3515b42a2f150520446498a5a1637b41e9a1e5d3f67c498d0a56642151a55145a8b25b51653351b51b4179e6a386db1e105a95695a4889623498a286e6a38d01475fda8200645979a932a5c517ed22c19618a4b14ad84a72ea71d366e20d5b47645b4dc2e050d889b5a0f342cba683831b5ab2eb52a2e44a1a9b0843664eaa72beaa7cc534d0427da0a365820bd415244eb8224c54f1b37b5196854746911e3a60b922a5951686b96d05298aa5589faf1444be294820d2548478e14d57a4752d48ac8d00ded8a0cd13cf1faf1b2028dcd1721596a5d7ab423283f7194f4d3e7c7cc543f83684f2748f5330cb221ef841ef7dea0200f707cf816d328661af9d02c3d7aa8d99224a7f4c20424658204b1a1e3d2b1c3c82e475331dfc7c812168ec962b29e98ac2726ebc19f81a54bd6a42749d27e7bcc0a61fc517bf187b30d312ef368bb587f16dce2fdd0bc3b531ba75747025537ac498d10f53b86a8d4ac5fa949f7bef89639f60e6968bf8b6badd55ad9574b1ccb3d4c1724c6f5e4551f29bbf85eccc2bdf7de7b6fad09f971d19c48dc296f2aabd75c4c79e927ae9d20abf40f0ec9d3296f6ac8d40f2a1920631ace9e5b5a29ce4b982962dd5c61bfefe301473fb500a3b9625b7cfe48130c3a0510479f7938853c9e30541e88a3d07c9f295c3f3f28443345443495624591372d8a74f5937c271f58fd8c9129e245d629af0893189b004fc1fb9839d35c9c1f04a916c161947d6060f37d8a24f5f383709822452e44226c9034112fa3b00d912c2257628044a8627c448c10612226acb844a05810e1d182080e15fa3be511613124cd8bcdd3017e0f6cd446bbd9e3e3f3fd59829b3e3e3dbdcaa82cfcaa3f3f39a4c10e673219a4fe904458921ddcef036b6f8c6da2203998314c9c89a49190c8e1c4ca0b555810f1a27b43514a496cd2f4a091444a06c84a9eb9a610b2febdb8f391c3723a1f797d5bbfd6aff69fa2d4b4d05b30422db82ca50874c2e28b9a32c251408c6e949351148da816b817361acdc2d18855c4b9bcd829b810a5c8b1535e10aa1f2d52ec9417a4084d04f21342020e24656510118abe202e6260198d172405940b2e6094311ab342439de827f97c0715a60514162328aa9a0b589e90f43c809ef30e147ace568b79248b91e4ee940745a49f1f7414ab39566bb3234987538d0d0882351ae4d7290f4aaa9f4f9be2a3c684cc9df2a070e01e59acd626967b2475b1531ed412d4110966870c90bca8372705da49b7dfc3a85759b7402cee357d60ca7282268a85a34d25a14643d374c299a68f498d03982a178d52a5ac34d1323b4c55841c26aea6694dd30e063055282d556a5593101308826088411004c1279e148c92dc722440c121b530e629c6928c224f45ba090f24214d302626666a999189be59aa33e8961535479bd41f62281cacfa02cd92a6a94b930e53af00cb0b0c962f3831d8d02fa8354ba67a6405c1c2238666a2c30308754c052db469c280c90a45a3c245f511244dedf1a5694a1355f24c34aba945936d400a576762942913240e181563c90913c024e10284d45439583475609a42c1d425476456a05d2a92aac57403532a4b9a8098a8d4a90a074a1378a546575312204d1b98b28e1c63f2529d2817ba95d5d464d5f4a6890ce5286aaca0b5c5e2042d4f3f70b72c1c292031136767c9d397a6200430116902a3d5948149004c17c7d3e540902215e7c8cc8a5c1aae344d6eba74502bd1518b6069a255a20f8aa6060c69ea6172a149c694e2a986d0a4a3561fe00f759d873a38c3f55ee1583ccca63c3c87fadd6f7f8715f61b76cabaf81c56018c1f56c2ca5384bd8d7658c9b39f04ecc1df250568481e11b0071f5686d6fca12ebefe71b6ebf3a12e9690f5b0b447f70eed6aad328c4958376784c172ce9ae7ac79188e658574d6f8ce485bee6a3feb6a3feb937f9188fd07dd6a0c9648ff56cd1836ff5806dbf973ac5e7732d7f5da6bf9c7debeb5b15a4b9ed8e7acf7e658f9c99d81cc90ef9393ec67c8ed865cda0df7ef131e266b284f52976709d97dd22f0c3626f118e7596b7ea5f9573fc1cf786bcdafaa02ec67bea5b7e558bc3c3956075fffa66fce12faeaabb7def907b53e4bc8b2e531ceaf6a0576c3decec0f1499dd929eb60ce7989726aad9987a9f7616f9fbfddb09204af36e7eb2ca7e4097f27552599d5ddcfea6c98d31af55dc23ee707f5f3f2b4464afdfbea2e392ce71284d10e1b31df7b731ee65ec99cb8a8d0a2a36f49b385aa6b51b2eabcefbcc55d6e740474cae3e2d5795c8cf0b824f1b854edfc34b444e0f3fad696b0d80a5590c81e8160b8f37b6b51045f14f58c0449734451ebe494da1e550d5f4fdbc9d7509eb6eb9c16d7cb5a923a4fea9060c943be988105812166edd7af5504b5fec487cdf868dbf95a92d8115f4306abc5d1669f842e775edb5889a1b43b3b1d52471c22417dd082670996faf9bd382301fb0f7ab59a483c3f10f6f613fffb6d2dae7fba24511ff6a07d10c422605f45ab43c2ece7d1067bf0bf59fd9c6f3f0c46f463ade1cbc6a72305c21f4b9efcf5f193ba14cb07eb5f51bf058145f0ed917efe96c81e595c98f339821e1e55057c3a0c45b13c4bc83a892a3b3f51873d83a53daa157c25ed61a8b120dffd6c98a3e9c927dd5eb1d2edf318073c2b563ae555d9e255317265c815a57e858867850dcf0a56a7a508482d5e951ebc2a3778559678558cacb9c37c7a83d56bb741d63f4dd85e757dadc54f04d6d4a218966738334920f5eba7e2d7eb873c94b2e978d791d6d7e2d79908cc1390e2d3e75f82f7f02b45604dfd595b902c79c452021fb726fd4a65c49adff320cfa027d548ffbe3ea955b557ad58212dd5aaeac6ffc66f2fc09adff7dd31c81af5f1e9c87f1cc7f1635648fcf12dd1f87cfc3c6e3062f5f1ab0e2bc4c998acc70a8974ccf9206b7ecf67168080cd327880d9833c5f3f6c26fec8cfa02c8adc82ff5e9c517086d40f8e1b845ae7ba756c5be29925baf766703dc8fdfbd2c3e2d5f73d87f0b801b6b80c6c880b3f082ffe6f768d6a05d8125913638bb326a6f9cebe9b67dfbd7696c59a2390f969e73d5b101cc1fc64ec7b32d633ad6d2db2c3f89371b2e2a79f699a3ac89869dab76f41b7c0ac419edc820ebe05225bb05b4c114c11b2eceffbd0da4ac27e55a350552b489a4a2489fcd6ccd1236a51d73e812110909487c5aaeb07f5672c55bd2ac003b56b926280492be401db4dd81efefd3aa94385c21ff57fa38d4797226a6845d8d1023967fc22f0ed566905e09b90750b3e1e251002db3db871def41aa77b703d90df44d8bf3144ad965e0cf3e0f66ce620eb9fe4f5b9b987b94403d7da04051d805ee0837d14101404e2f68058c05b59a7bc294afaed94370549b751422d858f5a901b2cd8a0fd90b1658a8b5a9829379a09d6fc8c29a3630514ac6aba2a5f785f496abb213f2b00f94183a386c40465927eb2a414d170484151d3d286c757102da32fb433576a2054d5a296fc7015910245dbd271a4e9674d085e5530682454a9a07db9a90139f303660c8de8aac6cb52cb9a4293c18446c50809513f2ff058314211a5ad2820d09a446191f482559ada93ae1f386168bc2d35143d314e7edc1cf9612324490f24a79a0c1162f062fcb4c02342210e8c1602b6c5ce1bd4ccbf0c7600fbf14790a4d6d9e69c73c621f87da30de71b729e7398479b0dabfef468d37abfc5fdd4d1b1b7529d6dbacca0fefcb6d9ac87b61dd88fbf82fc9ca7e3931d90f4ea689e6736fdba0c4991ea9c9c1aa78f80893f96e26883e50c1c1c43c4f80801da7329fe19e481e9458a1ffe86bd0474b715464511a69f4744e6e5d6a568a23cc1a73cf86df7c3a588fbf5033ca4edb6daf46925a1d87de4ee28fce1cf48b74f4e26a0c1ebc2f1ba5ef0ba5070b1e1716df1b8baf0b8aef0b8785c551ec8e82c8a65466b57020e1b3e6c5cd0edd350032f5353907430949cc0f723c243b694b40dc710dacc224711b99f4355f3130fe9d53ecf24bddaea15a457434abd5afc1af870b53fc3378bff766defac3a7ab53d7b731de3bf39fbd53a6e50bf190ef18ef432b3cc2c6ca4e3c743ae57c77fb7ee151e72953a781fbc4b1dff55ba6fab3a7efbc4eeae526573ebf7f11b365ff6c9adaa3936a7ed1b28ce100670af737a43fc177f14ef462e9b567bf19703660e142784f53c740131e1ba0164029708405264d8298f4b06ee91c5627943a7bc316ec6a431cf9067c823a23ccd33247d6badec02cd4e6badad92010e2a334f24c4400147cf48a182a32a8a8a31265821012750507159f2510403aba7c425a409ef3655e501142df860b244a5242616660d950a1e31c8cc1043a9b8e0f2ba210385a82e1da66b29c78da919452a14f1e045ae31a2c1546bc79ce9f6d174fbe15379d23f295cb71a7bd8416128bd236f165b211c7eb8ef463fd4fa77031d97c50399353d5a98f2e0d5462a6c6344b7f191d79cf150c303190e3d7a78e38b736e856ad9e3e10b79bf72023c91e11545135dd7cf12b4d76ba518e0bf1f98c7097cb786f443984d7d428ac12dcf210f5848fadcc315991fbc187fa32d0c31b7f80b113e38da7e7fb6528cbfd146a9193e0d617b3d877a1d6d64497edf689bd10ff767f443f81750b16245884a3fdcaff44318eb5b6b716f2e7200e202dd077181c2dfe268db7de4a0fee6e1f37184d6b57e06d6a6bf6a31a41fc2907e08f71e6dbbebdf9cd791833ada72d7bf476ec31fc711e16883f15b35c6b8d210a65fd7d2831a27c4eefaf518628b6116c5b789267aa568a2eb32a41f72490263ab616049bfdf95d2aa61f8c38ead5971493fd017d568d932e6c4f702be59acc6108d9181050b16b0f2a8550bab2d2d5a5a5dd088f72a4bdeda0ab7beaebeca625a6925f50c9df2b4a86855c1d8f4c33769142d295ba30cf54c1454a8eaf1dc5031c4842a2838846821a9d02fb022658431bb9e0d24b7539e16ee6ae1ee08668fb7c2170f0b8e8942d69831ab052c18cab8b8f254d4460d182516c8a8c83a91e6c8982818852f4878146fd2d15585309aa9cabae92c17233503a22a94c548b3476a2d16596cfaf9415fa69852a24489125a1a9add7ae9d67e685f56ad8ab8bc39b302ea052a2f68407320a1a205020b2ab3c742891225a6921a98a4ab9c3925e487943164b270197962599889e294e6880a6cc0dc10c1fcd0e9a2a1531ed6169695984d7d420b5a4bc2f2cf6c8284a4d83c8104498a01f8f871c8f18f1483f0f1eb500cf2e39d419004f819a4717428807cd38839a5b99854a6111989a5e57e78b17a583d27b3092f8c8e176647c51323c5040408276108620bf9e757fffb0dfd7bbb143a5120dacf9c0e3ea517444085240a443b589edf83d83481dc20a203bd3ec6b3baa184126a2fc75a2f0b525dc8063c1554f0bebce17df1e27dc9e27db9f2b2f332a4e32773f6c865b473ce7fe4e2efabbb4b6e4d30ff20efe7c76f5270675ccf6296f4419e3e27171fe308d03a42a04680769efb24be0fff7effb65a58fefd556c61d92a4d3f79c75dbc3a7e327cf0f5e3d1f67df83bdb6a61a258e62fe8c9b675764d8424be12ac97ccce2f44710e1e4b1efd24c2ff3e0c1a741d723b19440ebb0cb81d15871d871d871d871d875db70fc67658f725cb6de86db869d065b8ca808b51c06701d0c02d2816eb4141411bc397b6318d21a793d2e9743a0c3bbd9b8adbed76dbd9b975e8e9e474743772b95cee8a431a0e5f1cbe387c71f8e2f045e2aebe30e4767a3b371d1d79f581e683a1571c0e87c3e96e1a808d9b5ee99c5df8b091dfad13c2be74523a9d4e47c2723715b7dbed9633f672e3ed86ee900b3be472871cd821873be43eaec3ed605fb0dcd81b6f5ce70108acbbdd6eb7d3e196c21b240e870bf755e677eb30276f9c4e4aa7d3e9743771a7e276bbdd6e1d7afaab83950ebd0ebd0ebd0ebd0e3d9db3bbab8d1377fa6b57f0a17ed52f8c31aebbf0ee76dded7639ec81cfefd6210cc4e14da7d3e974e22deb54dc6eb7dbed03afbe7ae12deb827805dc5c43e672e50db27ed52f10c45d5921f1ed95bdb25776d47d3b299d4ea7d3e1af13fc76b8005bddbe01b00ce0d5ed1f60eb00db025e67274f9a6e1f01a3ad769e2f2a840021a16bab5008e311d169697b562843a739ddf6cc7f99ac97cbd99ccd99fdb439b1f25c759ce3c1b29cc7623d3d3e3e14f493827ef2f4702edbdebda027c902d95fd272e3aac75697eaf67b8c8c21c6fe953d1ea090e7bde1faad5b1e1161c71f765c9e634f4ee5c012a594564a8226308320129c2805822008e61d4561903323d86001cef8ee110882200882678858dc5a2b78e64664491908a433e302900ed24cdfea27f9527690399df2cc6c098198e9c5626fc64907c10afe19b3c9809e48f10422a824a72124ef946786461112d629cf8c8bd815b93be57dc1a1f1a5a647168be52fab2f2b5f6eff6ba8403683b1ac1790187cde7796a16f9006e51f675b9c8dbff78c6a203e8b200df6f30fc21b068a63beb10eded94e17ff753ad9f3ac7e39d4e0f761fc7d1883f803c150e70d8e7ba6c2c77d16a106e36b2a44a969aba9df7e18566a6157d6cb5efbf9c138f69a838053f7ba35106dbbdf590fea5543bd40a802d9a00bf4d5d60aea83333ca31fea8fb3a02d542f002b9015750ffbbefcce72effbe377e71d56b0dfbfe559f6faf669df548759ac74c3f0d70b0462f76f76d25dafbc83331c660cddce72687c298951fb028244fbd2d1e2078758e44ea7bcaf10be52200d40cd51d9f562a682d163712180aa170168c20200438e7a7c14f1b05023a9030b2c90385c178c6465bc8e3694b1c269206519c888c49df2ca68a9328a1dc1f003b7933bd2493222cbbc789153e6840b5857082396199c4ac6160282989ba1c920c108c9a80021bb710166cdf8b818e124352ea65e3b94ac92d7128c5af2bc92883c287d315ed756d70bfdeb94d7c5a69fe4d3b2ec4a8adffd3abb57f76dadb5d55a6ba959797b7f216ad7a1c618d7ff66222a880fcc63a8b938daa8354550ebcf1c84a32deb113a8ba07e71ccbfb7dd7bef9d39bffa33ad16a6b94d97b34d2fd00acec71024d7e468db5d1c39d83b9b57ce39e73a3a9c8f2176d7196dbb8f2307b60c1b01cba939393939393ba34dfc2cea122c4f3ceef09c31c4ee3ba30d0327470ec818d71937d0b17104bd5767a7eeececececd01bc2f263186df9752e773839863875c2ac533da871fa07fb3c2244139d565e638bd8fb6bfe7c2dc6f7f6fc5f981f0c71df98e73a6eb0b32df72d1b512bb51f1e6d19708d5d0d765e3f1ecb21d72b765e87fc9cef60a7d4e162c8f7ce39233a20737848923219496abdf70f75f1ebdebb8a6588dde9073df23c8efaf36c04f939afc70eb2e6e58890db6acf7fb93eeb1df3f87a7c5bfef1873a9977c6fd760cb13f60db5db4ed3e7e9e8db6dd731962f771ebf0ad53a90883953c22c4ce673adc56c70bffc6335bc623c0321cea75b40d753bde10864b1edbbd1fb0ed7edfb67b9c4ec710fb033b746d95ada8e4ab183162c810d5000001014317002020100a078442490cc3309891ed031480086da83c543c30a149e2602007611004311085800c02300c008c3106198420c2f4010a7538a0c87686002c24915cad70fb31c2b3644fce5a1857f931604fc506375eea4084c50fa00ece375e5eca111e8c02bfde577ece300782a70c415f536f5783312640a521ce698b2146cde8ad987b3cf62e5f15d82309bf5a911798959f9a923402f8875fb9fb617b0c7e5857be73ca9ecce511a0f7de3449d89c67a3692957d94c0da1524835dbd3879efca6057b8b573542ac76b6590d0f0f7877a52c9ed471b0612fb1c04f5556354cd73f391004924684a8a275c06c60eef2da0a7f6c78ae761d45628446c385c8223815fffa14ab9cc0cc8ca67999944d09c1eaffaadc867fe14d00a9df928a45a3e00f11404dd8e942ec74432c7083b8e38c4e2c84903a9197d584cf9eb9f133bf9a2f8b52399949bd23903e3851f40721d0793e63e82943244408ff7a8dbe75ba749f6c4fcc819dfccdc5e936187de5c981a3e73087ec321280de12e6911bbef5a18950f8af7f2d66ca62139814d1448ba8634083bd74b140a08f3ad831fec2b911209e9b92e2c35c3296c527e15e74798e4e7ed7924721a2b6900884ba61847519880fa129351b2d31c7a31436b22b8c164dc4e7fc554cbee9192315d3515065006eb329ce285a3c3ad51725a26f85079deaa15223488453723ff303dee26b2e01b8fddee2f3c1c86620561f3ffc2d6b11a2a83eb1699610dc0f9b1c460a0fd341d8d42062fa97578c196340569048b512e16297308b4e4f42da1c4a8b59c0c097c026bdaeb02529250f4a121a35d0b7a32683d536eaad2c3aa35b513e070699afa5a67d96372e0183dc583a1803dd02fdd06c92730b232b219b37d2de0ed78d0dad01dee99f5cce9c713a96ec8e88ce6793b183a8c48f6db9292de423dd7caa30b3d28a1675224e9266ac6b0757231555c6378e4ab12bfe90dcead57386c7494fd1bb30101d571c8bde5d9b43bbb0d477a1d164bcb733f1273035b3609795a7d8cfe374154b03577e795eba187cb3dda9e6c88ca625ff657fb026165f9d9769157409429d854bb132335b67ad626aefbcbbb3b880c2827d9d6481d734bb3b93583cdbc6e093a1508be8e4d1972c458a508fcca83b7e7aa93dc55eae836df63982ea4dffb612246e0622fa81b12a29ba0245f443e5409f7024b5799371358e281ecf45f7a184645e1b06785dbdd562214ec948c58ba8699ffc4a24a802589198671bb2f0c778ea6bb4b46522d8e0f8e2fd769a9dd670734b384d876abd6ab145da3c2ad3a9327e47a2f36abd153be759ef6abd97f53ac1cdb1dea4393bac372baef954262829cf9f5a0513360c6b30c0d34d0f10b87a0e3cb969b329f95ddb1584f756b5f858c50dce26a9d497183f45e8e47893c5ec005442670bfa467b61a94b1b8d693efc3b8ea1a96844ccde569235dd6e56defd5d7281ad32a5bf1b8be4c5d3885ca17b3369837a8af2ac8ef34cd0492f0b4dfd6dd5493964357ea183f6ecefbe8586868766799b32b1b8c303a32fe8c4f3bbe8fa5ba0a2e301a0508dc772f845111ef520b9763e59d778cc5a81a2333a97b3e7a6c15d24d79f5d7d6470d9bd011b091f09af85363f948ef1334be1acc37878535bbb13560b417225a4c3664dbb21c1b95b855bf1c0e13fd22f1d886ef4f05414bee60db5e9efa3a4bc6cbc540ada19297415dba6f86ffdaee4350792e8795f713b5aeb1951bf89d2a887c157156ee40fd689e040d94b36283ec92f290020eba374c4341f3251f81a56486975fa8525d027b9fba2165ee9137c53ca0631d288c964a62e0b26e913786a01cefc61012a4c1e45108b4eb4891d208d38e09fbb2e9afe693e996c9d2183e02dd068382fe2c3d39cb498f9bf2f6f5d1cba98508449eb87a94b16670d15fcdb9e0917408cef07be577b077235d686a0ec5462d3f619d512e339975cbd4f848f4039e5d725f8e92d43cbb307b6ff51ea27f877c848b59e57d15b593186224479b1ce853b0aed1b160ceae2204edf5296d10ffdcdbc1f8aadd24b1b3348c1d0f4a24f8943e99c31ae0aaf10f80c84ffbb1787cd2893a32f474c68647a1abad87f7a501689ab7009405d166fc51b40a33dbd24ad3e52c42d289b40917e3e4adbf01fc17a5049b64e81a93c72c7c25c106fdd2973789cb95fb031f27a7f9d0b2db1303b9dde3a42f466543f2eadbcbd4ef9945bd92bdc07f06bbfa6c40b5d94a0636fa1f639de666619021e2a976e4dea4405717f8504306ffd64b01690fa3897062f56c62888e6bc461db0227174747375bdc004e2e740a89eefcbe85aa2a60070c30821e33119a21df8259129b1c528b7ee8147a141267428bb8fc2b27f0ec388587bb1db6d6bf103d20be54669720a3376c150ead4354601e561d999d6a2771036e8a5c3c27d11037dab7dd2cc46fe151ddacb5a9fe7243c559696d70d256b555c5ec0bca067a05bd36a32bb437182b9aa9381f43be850d38e5cfa05a1c9dbc1e33ed66ef8540f9d720ae04d4e217481096106108068734042e083805d968111efc0c5413e14b97db2ae44b9957ee9ff7493d5caf0b5a4a35ceba6363b8d9560b4eb6a39b52a04b3b89a5677555c086bca448a5ae15068aa81041a0287a6994e48a1506bc2b32115adfa408c3b82dab035282ebcebffc7b41dd3dc340f07817342f858f3831a41126ab119c48064e6a2c35d2427277228080a415b8e64510f50089ac38c1485812168a519091a0243d290033974048442330e49511fb8103462408ac6f010b4a4810405ad9d19b037ff6fea1d4167bfd248027fee55dfe99cdba97ce461090f460c73d070ee76df6f0c8060a0ca38db6a6aefc424c76cbdcf6ccd441ac4b65853eb2dcd49948d4f3ccc6182e8790b8107a68dcb10cb75cd57813247f2ace9e7e99852caf7d0ef70a698678fc35404e21b4c223baeb3f88239e09737b3a6ae58c86fdbea8633c90c2c3fcc9a6b7b448dd618ed85497c4d6212fbcb13d0b17983bc839c73143cb8b257c42f81e73611ec3a3ba080b928988ed46907e964586d18a97273238e528367efbb331243f57976b00ea27f58bb57fa67206145d83c5538a4f0a503f21b5094dc65c2eb7ffcb62b042ae2ae4312a9ce7e93b4d9fa40fd244e0f93ed13e42377da52402c0e099cf73da6d0383b2893ddb98de920c02bac4e86449167aa2018583f9940b15fa5dc8f4c6f911c882a945e7262394168ce879f0860cc05e7b4a43317b8f79e01d07674a507ddc1d91088041581ad0fa22703222784fe9ef65922fd33351dc16a2f78eb16ef28f7256f11adcd01f0a41129c123768fe49cb2d89154caf262679c93564ee7c7473dc938e576028426924d386322f21037c77b29ef1f816d4ddb938d7a3db7a0a592205ba0cc736b914bc589f1e06a0a1ee68cbd5cc30dbace9b46cf8b88b1003c1a6ec11c40f11d093f7f11e21338672b05287923f68ddfbdaf90fe0971f6f0215eb912b2dcbf73ba7158d1208b363c5f163919fa697aa8ff27619e671e9ecaac001fd71e26a0f04a6f254182e72a3513c9bc09e0975ff5f753fff47f4fd62d8614c465ab5898d41864b591f76acba1e4677804cce1de43c15d888cdb5ea33700119080dc58f92fec72d429919ee9a2158cc7dfcc0c47f1f8fa25f19e20d72db782c679c8514d541c311e2b307226a053140d1767c7988e1cddc45b1da04f7b4314a68b8b4359bc370d33d4dec54a5ce4fe86b6a4c1074ea2f66ef4fa28690122cb36cca842cc83c6d0f1abfc81d4ce2e48b6cea667582a0c755ee6cf4c849ae267d12539f054b3d17453c78459317aed6e6da1199d5af77905829e761bc312bbe548fe240bd0e01f5577a5814fc33a3f786a46e3b4be28ffb5da9afd72719a46b33332f8b2d4d8139ab79cd5465b89dc09f37eae6b4662cbd68b5125dd2ec050e98692261db5fbf5bec991d58c70dee2a32552870a9f137ef3603abd4350415f66278c7a10956581a5136ea3ba51d3f21703d0bcdf80fb462e4034f75042184cd12830f7e834eb3a5f5c4da59473748d3f3cff4a6d0f5883867b8f91421b20b4a249f059d3274585798017ea13658793c2680f3a24ac442acb3b70859f870e3554bb07a11afa6522bf1c74ca2a896e851c7ea791394ee6293333a605b31217dcd91ed85ee8fff8dab61062a189b803031c9b10346f5ae53eb2dbb8a2f24547bebba16f3867ddcc65bfb032149a4ac770be51858508fa278eff17e6e2034ed17af40b05236e6943ef09f5ddfa837797ebffa837a5dce75f508c6fff72ec498cc80c5cb012fbfe23b90ca3f970561eb9110a3e4c47e3ba9ed819cbfa13a53730abb84c6ac3403710fd6783d67c18605d39aee482e81f8c0a72387ea36a4a2c68a7308ad9cc4e4a7aa7c6c67d63fd4b0c4d51fbeb0f86838b3592aa04c89557b311ea7ddd291003813d5bbb75e7ff85e5e9ab3cfe9821b516a618af9a0217c648bd2cc3dceba962ed59f51a73a0749ea86ca1986e90934f44129e7995b3297db3d2e55bf51667c5ead0768f385aeef079165b5534a3ce8c9a8b0c68729b0d8800f38b01af6de4d2a32ba8d2d3c6c1665ea5ca2f7d2f0c8929eb04a96197458dff4b1152b344c6f319a42fe3a410a5bd352617c70bacf2575caca1f45ec3898545d281b1cfe937a8502b24885fcbda98177b2c804563313801e7a236cf36921f6bd3d25969dcfacecbe52a38323b813ceb4dabec3c45ad464882a7387e5964f8d5d5d194150af4ea78c77a5551e7eb8a884696a3d755babbf6f8a754b4e350f4922374d1f42f339203f8f9f171b170e136ee259761df6780e51427d3027b9527031bd2709e7609366f65e3e1fb1157e8e86532b42cdd1b65fe1789f6d0c46ca17432a9683a7c0765877741e4f0c7000266701d5c46f9601620e9c9f301e0da693bdc41eebacb41d6d3c5bcdca5e3411da813eaf3054b9831c0255a988b36877de13fea52fb594081787a3d3965267a521781ed0f1b0fa1f5a6bff9f08a5dde351ae4505de04499b90c69103301c87f10ef2b6811fad06e59006e33f927063fc78a1d138712f63e34fdd5121788eb49b25b3bcc94cd9603af053374289ca7c78347c9634099105e1ba77a132887ffe8fa72590f7d5179e3b522ed22f605b6ec6d83e7fb7fadcf245a19d67351d1a0cb7217fbc0423bef1c868b04f096daccff619fb8948bc769ad098c63bc71e5665c14164ebe93256ae053fc17d96186e2287cd3e62f8f25ea51640e07c875eb275cf499ab19cb4ab0e5f4da6994b826c38f56000fab1d831e38347d6c52c1f5a5751c03c013486eddd6d978742cfcb97156161f0a46d11ec5026d4c0944be8cd5349c611a0f6aad21a28b85b30ed460a647f145f5bf865f9b29f1cda903898a3dfc9bc3cb7be238f790384baa7061ed0ba435377bdd7a957ed7121ed6fd2d22346d96375ac9c83bacd988db3260ce0b39fb1a14dc0f421facb96a6f9cce6d5c92f33b5e4414eb5e56ba68e74a6f28d67d9220a67e1c4082ececfb649077820b0e5ed455bfc877911164394697774e9ba29ef5b88a1e9705e0e1fc3468d20b14a19c2ad3888e4d3ad0e3558ab3ed3b52e9c63ed60b79863ff7cd275226cb76a09e967380a21edebfddeead5f30236c5441baf7b6d63aaa0b9cbba5b48c9b98362816a83c59185326797eb18ea29c63824d0c844307c45e38d6b1da97f4d784d5daf775f60baaecad865995bd652d875224c89c60134f9df5bb3018871e11c0939befa10c3451ffedb08675acc2dac1463d3c14d2426125101cbad886ba1ae9938c7ea609845e419e3b66fec33d7f8e4ce51a5f30f86b875769543018cc8507e7745f26a97f6a88b5672d6e2be078e3c1e01fbfe27b5693fc0b1e2be842abb30ce6cd7fe44f9829580e886046d25d73650ae832c2a84a10e4f08fe792dd2e65ef43bdc67ab60b793cd7db832d969568438ecb425dc63fc5ae785218e27f0370b75c474726d1c3e5ab15ddb9e1adde72795c932b5daf161e9209a481d03a2b4f6ffc72655cab102a36cef500e31b1592bae35fcca8aed5170d405496c463ba4ec318f5c683e009c1d8a514a04252eb387151015c6a33cb97a4cd51b950dc7f4122bdab132747ec01e02cc1534581a242525d021151d96fc43a007e7b08107ac9a0f165f6538e5c01d0c40f24fda584657cb12e033174bd3af921b739f165df535c5c720b6e5889ef26fd25f591e06d32a10f2b68245dc0c42926bbb64c3ae51e1805986fa59aed666e76b70b97f4d43af2cb79521441a9625b44b666b6dc73c8216c3d1c8deba273b98a4613d2d9321ce77956a8390fb33e3178d0b8eb46154530903c95f27ce1d9b8291f8477e718afb757864f1b260cf96ccbe891133d3f20f0832b4a31107834a6601b6b6c21f6c98200ba32a38d98af4ea9782cd98ea80c7f0383bb4753aaeeff15a033342c17bf29d39849b82b1efea32083bc3467f07c2b989df47b26cc4debfe60e769042d4aa16ec096bbe443b7d8d42911ba19ccdb9c68574a5b8789fd8e95a03eeb944ecb11ba9d78c6a888c1bc9913eda16d5757310f0220e9f13f6ad4d7bbd79e188110848f4793dae0239672120baa962a6350e18dbbd0a7e849b5f185211e594d8e6f7fabe0b6f6876e75f13104c2edb6e8a6339a071be82ce9b3d5a880924be8869f713693271a91f736258d0e71cf9046100c26cd756529db53ee5e1b821c1c61c97b37073ed0b5f872691ea8340ab4dd5c705bf011985495e3b5406955f98d4c8ece7f2f608f983fadb24c3f26d3c0b1781485bb2344268b05a85581ef137dd7308d89e1c1ce6638f6b101531946a703d98bc2ed2fb144a8a5667716a305c0fab3e503ce48fc551deca56b66115d49e10c9a94a5f30b02ac952676de4cc8ce950a91a7514ae6c2ff1130c2bd266c79aa85de7a5748299e371c551fac4a829491e0d0dad0974c0ecfb783f820493bfb77efb47861ac7fc61386d740eb4366761ce2f7d3ff9d74e3104d87d175dcb883a861a8000ac7289076b8fd74c28152700eafa34a8b4d4bc2e2fe00ed088cf3c003f711a501970ca77ad5784221af415276734fee3f4ac53719d82c65b3fa22f68586cbbefa20b3eb35990ebc946e74e5e205221043324975705d1d3c9b70374f33a5effcba43c0f3ec645dbf5bddb83645ad1d28251a50ddbc1c551b1310218d66ae8d2989b2d3171c9972408ed2c24fb332822f5b28a095a49924c33b157650435067be424cd8995be34669d5a393005406d969d6ab4cae561fcad8172f1baf914086af74e04aea3c67edf563258ca14adf099f66c38648edf7caa9b1ce53b82cbb727bd0454661ad81fddc3f575137d91e544e74b6709488029f99dd5f8401c47b7cf9ed0b7042a974830fcb4dbc23cb817b78ad455a2ca1924d94be47132102082989d24d9542c29d9e408d984cfb851086450c24040eb00359b287507b4493eab2083013e31a128f0db586350a71687c90c3cf85d86109a3aba61a41264c5f6e5070963adf9b74c217803e5f2008d3bc58622bbccbe5d89d57175266913fbababc46183122ccc25df0a2d0a30c4c83936066c7f074214825fd8e4201093281fd47137fd0fed37a1cda7217226a4ad4303922f613453d7b4ba2ed06d1726636f5f012ffc857e5e6873a5d82adc1f906fd875ff7970ac6924f15ce4be4617551d542de915e3ceb19a896c0cd35b06e5d941105c1edb28aa1f77f1fe3288074b4e33849a5c91118c55475741c21c224dd5ddf925f97df51a7d1aab095b51a1a3317024e52dd8513700a02d151a062efe8275cf4469b559e928feabe13314a267a635352b699c7475c9fa88fff2a6d3cb49d4608309f4ad90d27df63db89001c200d96c0093a52f32cb9a40ceff8ca73fce8296538f8a5243987570025a72af4b27d1fc8a9aa9cc9bb5f08a470dc4a54778e0beacfa6aa485e5f50ed3afc14e966f7d22323230ee6733dfaf4ce7ae505f751048e7a4804ea1da0b59c40a416e33ef492be61df2ba22f948435b091daf749702e799a929ebd937df3227785c07b2cb83de4ed0ba7bcf15144d6666024ac4d5d5788d460a0e53500b5290ee1f651df05db8e9fae2316f801614bb8b9151fddd015bb2a618b331f4421b110f7b8246cde85857579db682a94b41fb060ca8eb40aafcc7085c69cfb8e414141cc0768ceaadef1eaf4fbd08098e636636a647cc2bc0d01bb20fc1c04fb785961331ff122a1cb600549437c5fc8bd9f2358cd77a6cb0dac07333afd0da16988454f7e5e634230f38fe025d1ed6479dbcb4390d72380209fcc6ea0e62cbf27bcf952d54e570cf770eee44aa66c1666102f572fee8e274bbdba90c38c54e7ca21de418d164b8ab5f0ee17d19093238e0adda5906fc0bdfcb861875d603f428d5f17b78fba77b9e754ea5bc032e3c368052732c68114fed73e9606536472fc73aef69ae0403b8b96ba55f2e904e99dbba05e9bf180d8e944748d58b50683f4fc40cd81eb16407e17407221d3b400ba6deaa211b1168625411eb526f6067f285fc57f436b2a545cf27570ad1e34093a54659fc3f78b6441cb61b2e175cd6d1c1bb54844535c280dae1b68781010c73550dc5f96a9c2dc622eeccc33b39ea5052bb900710390f53406ebb19fa77bf50f27701dcc83e62811c971fe1c7c155445f8841c2b2f9ca3e6149fcb6dfbb80f407e40ca797b04f21757e47b3e4b8e967733862a6b80a7948f1071c798e01076042a40316b621a64c1531fc81dec0f699698b217044f22b596f7a60723942781082cb56d6c6ca16cb585b54342b3b74cb737143e992e5b961f465da7c1e532a0df74647016ad75e621759a29d0da3b100645abc7b995c575e3ad2fcfaadc81132f93d6d2384ffd0fe7c0b71456bbc6424ac8cf3ea6b98aacb17e1662f5ca669cd4547431ced6a073ea5c15bbe206d73be7b84b1cd65580fa6240e210286e0b99f9b11a4ca73064b8e0f1254e160f41e5303ab83bea0682257a774ca0ee55cdcd17e92bbeb09d4e213c91b16174aab31512aa46e372cc0e4c7aeca6ae9f9d70767e9ac2583e9578db59a068a746fddafbd8d5b1e81bdbdb347857ef8b0a2e20ee3f13a7c0106846017c47cc059d39d8a912dd405a6dfe7e234fe4edb600d4c1d900b44c3661fd481bf7024b4cd10c0a233aaf6583d095bcf5d4716132aee201f8345b9092605e428e0cac46a1e903db7a51d982f39372ca05c6827380395f32945e1c75f055e0e11d18dd209611ff87576a5d4b8be507e1dab18fa0033fbcc2e1c9edf41623afd6a941966bd8089a255041ad605b02ec2704c09b67e49855166f7827e0fde923c962f1be22ba756d6e01d0638d23fc964cc64b36080fe453c74849fb5edc6de90d6f773cbeae9a49c7d27be8daf7c189bf40cfa55728dcc4dea4a033574470d07430829d21c5173bd0890def9866def28d60f2161f321c722111183203da5d05ad9c42fd08f1976014ea9a9eab7795aaeb73023aad7797da8cb48a43f4e06b510452db0320be35b485613e94349aa3443c26d4a2cdde1ab34e0ebe7987eb0663776f82e72c462f04148119cdde3a78499512d02d7a624947d115c2eac92a04568f319470ee151c98ee8e151cc11b6a9db186ebee9a0d36e70c88dcecaf241ba2804f2f4aafaf9acdc0ce585e5eca0a993e64306c4ae74291915d1047ffb65c3d3ffeab4ac7253574c4eb6a17c35ebc4201e8549c86e4103108a7dee01bf3201c000d388604b08f7082f30c5b730c78e0226b76c5e10b91bc4310407795cee282314cbc6feae81eb7c94d573c76cbfac591c568880bfec44166fa18bf499eba39155ebb4721604840f2dc9092442e9f996ee4e0eb8dc3db06f2736593f503c89f36c2a2fed54aa2df55f24ba1a97fcf4610001372a110d23d7ee712597266a6bedbf312c8fbc699f52e80fe58dea450fbb8191cc80de2fe08ec8c594287f2344a92dbcdca950c5173dc7059743a4760d659f9ed37beb3b745ada60206b6247b0604575c9e9bea22ca57a474cb5c426c25b77732e9f0e9bdb162e478f4b859759e60516f0c5910d5e5178c01b3ca0b975bacb6d842639549810f64e3a7c60632f21e14bb20a7cd2a24848aaedb3f8614ba94c2b1e7d651da84ce9e1bef1fde36e7c7d51ca7725f7f3ca8dcc47c13c9b125edca972ff7b1584bde27b435d2126d0fee879db8e458b3187641841b8c1c5b557b8c84b7adbb744e42e66d45ac212bc49a619f8496a19c87474ffe25e15aee8db29f725c47f87054620f43a7280b6563ae727ae133e109491f6b1e1a68a2450d91bdcce843a60d7b51fc6ca1da303ca1bd1f7d2367177ffec93dd6272cf371a7b06c65b81489fad1ec018d3d4be4d2bafed968ed3e70e64eeead0827dbc942805261849a32b451cdb489fe5d33eee43eb2b0ee45ec4e7ccfb15505ca084b2918a0e3b953c3ec9a2557ea57f21cf5928b7b2186d4451cec680c059ce0629620c792fee13f55767503d9fdc041029da4103cf9739cc3e657ba1a2a1abcef322f037bd5fb7722437b2a2ed06384ffc329b756171000a619fb6656929b34d8b4ce649eaa7f6e75e77b8d506979ebb4e51f4f5fbf12b31e9ffc4cf9957b61d269275b42e5692f999c5a5dca76ae641769ef9e4cee324ac032caa2c854a334f129f99085e93c73157f9cf5d935818a59fc3e78a78a5b34d5bd14c1fb99a58e40e670de9f84f589b549abf30f3fc911c4f38d16ff6b7a6bb631e73b3ec90d9c45a94efcfda54ec48dfccd78df5a32dd399a355073feb101c50be7f0bec131a86f0dab285a7d7d8a64d2f8a8f2d9063bf4df67fb494e0570ff74f2d547bb12a2966f0d7edc0ebc966d64fa7f12d85c777b1cc42109fbebb1ab592e6362683aba04f5d967d0add643f61d23f00a6530556c68259e75db22a6d64b56f2412bb946c9a01e092bccb991e406264590a53a92dcebb9a7f2d00745e044dcee34a6427763baaaa05251ec72ce515d4bea014f59a7c828f2f293e5d0bf56da0edbf85fa77c3ffc51928fd7b1c5d2ffd11f9cfeacb20cb5df91d61e90a2919eb82d30d4524d15090aeacb08c3c52bb18f132e4d677c2c441fe7305340b51a34272c1e5fd72f66b4da00ebbdad3c4cb37423dae234391a1ce004fd856903db7d306d441db85d9bf6b162c9057fd57b6be01876c0d66a14af9f07a99cc3576f3934d5cfcedacf5c66531ad8025022ffcae30956c698c54801f87d3c73a1b5b57e9cecbc5652b0c74a35c520e055fbb23919394c8b69c718619ff045e1e751d8c0933fb8131579eede7b096c2a38a41a58d513d91dfe953fc84f9e80959ea8ae33606a7a606017440047e4817bbd3d70c2317c2632334efb874e1e28174e1462227fd4cc5324926f4384b2735f054aa7bff2d916d23df5c68aa911a7d97c2ef43f63a7a294c73361b66a871aea8d1589ddf663bd90d8d69f2113d2fe2ef7bf55dcd40eb2f4e005daa047f22bd214aebbd694282407d4ee628ac2bc7f177d80d8255a244d0043c93e199550bf9a63ab7b0238329e9d80d0028ae7b1f89b848ed1d75f3e6f66e2690034fa5970c865e969e52503d63c379603d857f0215876f9ac5e146ce0a034a186781fc7441dbad74f972903a58190f7024c998b2d0535651ffafd42929ae4b698e0904a78a03009a48f0f7f0db1504ea03c48eaa357ca5852fad7bd34fc7c9700b4d51dffa5baa7c272cee15190e7eca4fc72fb9761514af71f9cf5ea3c3504329ba2da253f533a549c011ba60ea897a03c25d0c78fc456fbb7f143231f8ed95eed00990ac976ca01a4d9f432b63ca0f95473a29de3a7c47cc8203ea8f51345a6f077ceff64a16865f7379c08d96704d491c84c08961833f409869f569be556a99d9a9222c180b81f5b3478cf788464f853a1a618c6f3163921bb3445c17db74bcd5c3c6813b691dc2370cc9c169ab91064fa3b7f2d18c9f5efe617287c7b861a255cbe0dc92cf298ee405635107729b8f8eb1dce605ad156794e2cdccff67b4f2b4f7487f8d19f24a090d7382d418667bc836121d169460465319cdb8c121249ce06d7fb5cbc8b179e1567fa043e5296c396accf7d1ab18d1e759b14b1845dea6fc4754227218d24bb87457bb38d9e128a9b01be953a79cf59601d7392c87b938fa4f744158de2104923b268576dc4a9ed7532d7bdba4a3ba2002ba9dc5716df9274ff8b448536b3f8180ceaad86d80a3d9d21923e823efe19f40d55b3d1b675a75c1143e1632cad71f112be9dea5d5b05505bbba8944257b6bffcedd91533ade4f882501c274e5850461841e3b3fb2cc8e6010586c5b05075de307c3117b47cea70de61582b0aa7de5a4e4403585b924354ec0c529ffd3f3c95645e79958115419b4f496606210d20c02b3033382be706fa91feb2ec6c04a611e7198e85eaa37d46b8d5daff8aaed1b51c061d29f8234de1bed38c8387256dd2fdea4a012a3421410f99384c92b9988dc6ef064dc8202a00af711cba3614f08a2ec853679f770f659b973e2b6fc9c56426d023268f495c61378facdf5a9ebec2c2bfd9b09fcd4059cb306157eacb4f3e3e652c5748c649aa904c5beca7d7ef01d62c668e4a0e6fa1784557829a5777b884d07816965cba77792ca96d7e8566cda285146d9a84a5e49e0c4df8fd2e3332d914f6c2b14c6559409634de0bc4aae740938b46817a49c786173013ddbb5615016afbbc028075876c49ef7d5ebea7fdca0291425a9a16dd33a9e72b85aa0a4e64902d47c7c5e5852cc7219c7692551260ecdea25c2f24050c1e50604252064a200d4736c705cad36c93355f7ff064c9934a6500d01f0b8e49c3f2a49019d77cc5c69a00739e1fcc8b490e4100ae5d2a798587a9ee3fae614002d5ba0f9af1e3b4b80900a96ea7dbe395c22f6315c9dc1b9e0a700e0095bc72c443512fa0969f62a9405cc83a8590d13aa4765c101d0c4aee5d639605b441d14ddd9b017061e94d51b13868914a066b444b351cd9ab00663e991ec88b695d949f9d076177db7c328f0aa137c0b161bc173fbb58f28254a3070694d26f401a14dde164433051972574182ffc1af3e69d1791f7a4e51b798ea7bdd13777ac615c76be6ad556b4669a75354b8d9e541d6d1c0e0fbd28fff93bd46a3966b86820ff5568290f4219bb83813b15fd63095a81bc08a567d7e331328e609e7b7ae06d4612d814e741e91c2f421e8010b6358a8853f3cf90f0ba0a2978082b6d769331306349c43a573c558b762b1896a7bdf6c625269f2a6453495b8423c66088586c4fcb0ee0c93742c8ede0497b1536b3a598dba375915d9d188b10c8bf00e2d99b61e25a9771b26737eaa62f888090e42a8e1091a247b3961f05bb32ddd00dacef386bfcb368e3c7ac0ac1bf7113dbb4b0b6eeaf585df27523c97e7696c566ddb7a4dc430bd2c57a42845d0046a3e42b9e08a032eebd8aad1be4905c6611969703ae65ca3cbb7c5b87de060f7560e39d9349c6d221ab917ea7aa5890dcf7cb1b347e632188714042285feadd953156a8d2396ed7c0536693d664f2423a0a7930d07728bfd6f1aedcd44f02d857466b82858eef25d42754ae299de068042df5e289181c8756a1930adda812558d6424b793f4e88bab358c06a54e0b6c08c9a8062ed7884dd4223ded4a75d427abaf6d26b34165b0c57928caae8e5e960b6004a62b46553da743128772adea58f310afb812a7a08735b0911466bcac895884a2e485f5196c8aa3e5ee7ca6f092476fc86b1a45056cfa1ca1fa284db9b75f16c34386f29e3922b1d6fcb5ac5c8509345175da9a8e0491dbbb5c6042102a22b3e772c094a466ff8cc401b2d702102438702f25ef0e4b33f23d2b277a1135bcecfcb852c5ca448854da465d5d2da6604d20efc0946ad8c8492ebe64d6451a73819a88ba540839f35861af450433efe6d02100b857f7742713b6e91a2b4c0b24d073f7aac4beaa927f7ec7c05b658deb06d160b4fed715b60a035894d40568a1d1252f1730218bd6b8f544995070c71d9c28354beb2f6842f6196b9c4f25b0088c02c9890ed0480d6ef77dc03212e1fea2cb5f0505691798c13b44482f5e164c5179ec7d0c87a4ad62ceab0ddde0b566de0a8e1623414012096fc35ac4b15ac011b7b894dad0420f1ddffda57b053fa121313050bd4f459b867012c07af9838906388c72b88aee4ef30af0e1105a05bebad96cf1d0e339bff536ca32c2850cdadd0d0846d717709469228f50bde3289b585551760ada4da5fa2cd7ee3529c8e90a39a6a108e4b03358dd667ad8262e84a7eb86782d852e804543c8b835d25f71201be6714205b45e78049309f51148a4d24a744710bec8279c5f71a90598db609f81fa4f8e4ffe8c05569ef233a1d21956047fcfc68ed336867ab796ced1ce7ab5bd5729af9ed5754fe1126a67c45e92012a307c08264988cc4eb720c0d2a259b437a5dea21891335d811e41d959728f48f2c59efcee741c31a3d3bfc28b718a648bb9bb0bd0beecb93b01f22b0d036cb54cf6b62f4073fb91aabb57afa5bc316425497c1e69390b82ef7c311d53fc771e04dbd3c6d1ffe81c0a2e5a2f7e51ca4c99cb1b9bdaec4c6418ead4ec9e226d9e82a0a5df57514c69bb3483f9f228b9a33227a2c8ebec49c829d0a460d7d2808199fa5fce0e7f4c9e8841fe13fd9818815ae2ae4cc2d43f7504cb54884393b9cfd57a2219d74f40d9110c882ec8b2e770c81a4dcabeb88c12556e30938ebc7d0025b178c72f14bfdd0800a3e2fc3b882d6970c4f079c778c569a186451d5e2963fecea8fee56ac23fc191dff76018a539195474c225a5cb56de8fed1a94aeebf862f4d024eb27b69ff962cd3d99402b2c07e282bf577f6397364cca6ae0df3967ce35805f7568a7f761e40a74ec6746c2a1c35f4aabeb26ef41725c63e59a453744074af690e0915eb08ae8abb5b3ea44f45293444ad6e91723cea77d64ec51d54b5dbdeff02dd045603e1a93e4705385b8af0590522cb3f8378256a61985d8bd81290ea639c50150a3885656652c5dfea907d363c11159f074885dc19319eb44c91862ac0322121bf99d663ab46bb0e1ce060ce548249a46f36a36e4e367292f2b8634f4a7caa4c225d99ca5d42d9dd4725441f0c0fb3e7849de037aeb7102e4c6e93d12f793686db2cad5064886b3cba87ade1fd0b9e87d5e094e8f870adfdcc1329a05c0fc145993754946d9dbd3b570d14948130628615561960b5d9f2249a5c470088466a811552308c428217d40097ef53d3bea39fc533d042d7ec2c60f5bb26739a09c52f07a4828094f18432256ac78da620e66d72b11e2c368315cb63b2792c4331c993d27aef89299584aaea65475f6dd36b4671e253ab333ae111f2b1c49db2343b82a63b21f3251703444fde4b85c3aeda771c0e455f19fffd3e18dc97d75fcd783e84f2f652d4d2b1c634ff5dab07a080fe966924eb94e1219748e4187c75c99dab2c243f2ec52b91f36c6a82bf377cf312a2d61460ef501421f8d36910002cb0615b2dfc031a6b51ccf69cce3cfb0f5de16387263e741ec1d5b6248a4742ce157429458a04748ea900cb1d7754917be74a58de28f2332c1d34d34509ad707cb753fc552a7eb676c1a50472eb826a330b39e819ccf910a12d5b1951c7968ba4367ab4f6b80febccee7d54b00c395817643c59be14dd18b0b332ba39a524e8c60ea6ec5d955e11aa656eca11c9f93364d3d9807b059c73c93493509b9105ec16964ff6bffa9dc1e034635c7b95ee7bbaf990161635faf715ecefaf8295723ccb4312e25b2f9b0bbe94fd907f26b0123dfd14f292cdcebcec50e4ca8f26debc0d7c8fa5c522604437e605aee24082deff94e88badf3b3cf9e5af5bb502bcaec6210a6f0deafa3dccf6660348c0825a35fb93c463a34cd01c5af93d14fa385228520334cf2f952ee01336e0a92a95817b3abf2c981c9b61db9c1aef881f6a890088ca2de7f3754c9bc491321597c847aa6bad77e1cd225da48f3591b1a040eae7247135f997818b87da2d28a0d4a93bba726c29b848a67d8f46091f9dd16a8210ed58830d302e89460ee57e75e5a764d3975851282caaab59d58b557a03682467b8bfb6fa6765c937a6c825c938474ddec7ab611d0ed8220c9423082f4d623477b580c9edf6666ca80bb4be8ccebe5b3a54c4101838daa6171763bb6812e9c13f17a649a118eba23c89d1a4e0655276df333dc88c9389f6b1a4bf422213dc3c776858beaa4853e3ee73562f03268d48b382e4293503eec34d48649830b80d8900c19abaa59133f39f8784d88ea6ef3297e0fef3f2ab397983a20c1391603689ce5a2e8b711b8ab0c3a82c0dc5ecaf3652c80cedba32c2257312fe105b2b535c7890f252ad539827338130bf36a20cce37246096356a4b6c5615b71c01d67098493274f343a0018036485f75f374ad59074d834ae5d3cd10896185fe61d0ede225f269afc30305b53b52cf7d51703a4ce2213e8a33dcc36e46e4ef4c2e40084184e17886b3d11ce418441d42f551c44af412d1c7ebf3a2e219dfb583553dbe4320f52e7a532dcd4b4d9f20a686e34d7a62304daf311b547670581bb90b4c803187d2b5f46967f1f134c831547dd0e952563dcd7c64c49ea6591cbee390715a53484f2db420e840cf918623ada64d1abee3d8315ad3657c1da6b9d364081941a469978be740568c763ae99be36d8e7ad741f2a6018d0c9183483a5aad24711c8588d39c26e9eb30c44d93a1cbd124d0b68ac3711011a33581f4ed78eb709fc3b91d722c3b0744f862d10c6bdb5e625c7d0b3bde716aa3a50cd16ac584b91b03ba99133009732998dc5b2343b6581dc10bb23a0cd143932d324241c3511e3b5e6a214925e4208246d348e07610c3213687d80e7139c6e4189363ac436c8ee21de27288cf61e31d246269775a88f4d32e948c24d070a3b88d1b9dba9150a44793c11bd321f71de872a0e748efa8b48eb2e869b02123e2d14c0b5f1c6f1dee3bdee178ef70ebe83607de741479d382942470651fa63e920a8ed7e8d1e440d2e1069d9d99d1d2448dd69fdc27196f9c1dabc4a26eb334c5901ecd409211449a66110f87180ef11de21d633bc6e2a8b15a1193093f1cfcaa39b9a0ca0cdb09b46d81cb71e25db1199320f60e69edd1648b8c50a0e194c739dee0a8f70eb85d69a1a4277675ab68cb63c7baed909a8b165a3861c7fbe9340de1f8b5913a29e7dfe0a581908b086dfe47bb235c8163243d0db73cc6e136c73b1cef1def3bfce58a949b032a9364d3d80b57b869d70daa707c2d4a9810601bf573aa5bb675f19e60ef443cc0a40b458c3894a64dc400f6a30abc18ddba854810e32ea641e0254658b43621ca1c23f53438659c1da6d98fd1656a1daf71d3e42f19b1a78196cc3a1eed94f43eb7f1215ee3524fe1463a8bc2587227d0b9fcde7da62408df413296663ae9e778d5862241ec209246ab4912df41761cad09495e6d64a10b8bd21369d02a86c0d1e42919e1a58194848eb4386a1a17d68fb3532a73d44175ea1c054c9802da00e26a5d400cd24a078b275a70e0c0650e74600b3efa9a17d8c6eceda8002b82bd150f8855503490366d0c8e994da66eb41515eda745c3803d029e834d984bb98e361a10d2687c933ba0d69ac8afb66aeee83c3a39f972efbdf7de7b6f296592327b07630640067a895abb226cb556da50a16ae38376b589e1cbb4314b3bcba900ce7674abb7bbe1135323db162420dd36103071ca122687ac2c452c60b234d3414a0c102e605db53e1f4d142bc7b6d5364748271853466880cc74204d595146862754905010031aac12f486421305a14a8912b09cd9e1871f0168a19644030e1d4529204f608010502d6005b19285860524ae30491d3122b5c4f5a0b5272f335440a24bd30d4854a901aa4c1a28237634b181848fcf04248c30c2030b0c31293450c81024c8ccca061e42361e3fd88d8d97902363dbec68f2267aefbda4d2bdf7de9f9dad84156a39884045bab05112c5c3923669a06e20e2080a42f0c06283fc946c98ca711c57c9701cc7711cc7711ca7062c434940d243981374e15265474a0f2b26908a12e5c7b7630533f6470d2d4964aa50404313116a6ce48084c7991ece10e0d361a42aa10490aaab18d0d46460caa1c4465684240907364cc08f04902b3363061c56a8a276a832826603264444590a83648485f14bf27befbdf7869d1717a2d488313a126b3afae1844985344f8ad4c0541be497e3ba17aebeb783da27df16a78bb725689aa94a8689ddb66debecb66ddbb631b933868881f2020d607cc44a00610d8f12aa9eaeb070c11aa2f5e1a0533d4001620515c30b3c20a0c66c0831382891030e69848c1fd2bdf7de7bc32e8b6f1963bb274598a42033a3b4830c245362601a83a4082d6b6a20c0276baa5b962ecea64ac859510ea238e17264ca102c0cf144238a0e3d6499206582f8dd68a30259dfd2eebd37ec2e1a21ee3ddab66ddbb6adb3db966e8cd3113589abad0a4a0b41a0c921075403667872450c112f3870dc7c475b289b176e1a2cf7b670af573247d424aebe4eb139a2371df4b6b90c74db9a383533e86dab367c4b37c68b90232b4b8c929c9880a9a47a7059c28648124e4d949bcfc807aa26c9b7658c1a267defbd5d4dca963137a0408c95982b393479d2c1c30e234ab5156a2d7c35085065b4c6870d5382c4b234995192250619bcb880268bd796b68f46fd811bf2020f6b962025058940932223cc18613982c6e6a8c8e9aea11a39259a2ad5bd6980b8d755b9dc7b6fd8a9c962b78cb1a286877b5dd55e4161a2c3862c23666891e4e8ea4a13aa285fb0a25a5fccdbd63875639050991a284ab031e2c9123125273833a6062b4a48b2442fcb48572a5154d4a648193265702cfd6032440c15149ba5561bbff7de7beffd8a8395a1c8103c082142260a0fd30b4f418899f24448cd49c7664bc009558a40c148182343a610493c524893e3862e55d0d41e6b8322a86cc991e50508140e46b4708407224598b05268adb1f88614b804c1a254a4872236803961480a505950c0260aa88662008d962941b498a15a42bb404305303baaac515ae343005e9a266f62a385082e49481802a682246ab01183c1869a33ae5a8fa6da86a2a0449421544f985ca80a410f99133440001922aa2625a2f13445b8bc334d9d8c138e20d14386a406098c285e8e2ce1248490183c33f80b72efbdf7deb0bb47d424bc2b344b98cee810f2c3d30d544e6e80baf1a4c8d41217f7e709bc325f7d9852c978db15bd6d9bb56bc06d735bedf6d672dc09b82f7f7db868b67463bc059ba4203b4089896195004b0d1a358a60c8f221895553ad2de1c40c45d5d0d4430f2b48466618e9d064052082a0a1c80f58515a619c6a9a34422ed08dcd12375c0f3968be3879ed08b7841123492e9a2b5b15f4e3cc933335f87c1a809e56cef43863c3ff833245194ccbaea494016530d7c69a410293a86174608e08bb0226a582e06d072b46534c78149899d924f8464f2b6684e88d77c03ecc2899c961c3be5c18ff98a9619be8a6d467ad77a4e544e16a8dccbb5a4247777583bb0a42b65d61c971afac20d92b2948d576334071627415c3e7c25592a3ea5744648e5f1c10ed4ac815901a5726e88d9f862ba51af5ea065219344a65c61cbdb0ab0c9426f5b452668832537ae30f32c1ae0b37f10508bb9676dd74cfa3de1d2f8ca0172127be0081b65993a53f609f6a9a4331831ccf73cf8ef73d114690b69bb3e88169ec405e860e43a1440cc7dd99de7ecbb3daf1963e31367ddff52db7057cf4fc712fd4bf25a8d982de25edd67fe32ec776e9f2e54b95de98628ce5514e05ab55264b0505d08f19f47eeba589def8718841efc75a667ae377e105bd1f4f25d11bbfd411cc04bb9e56ca38e98dcb1031fa59b26554b8e2b8c0fe870c953ea1a715326cc858ed28ea4c6e559f2c55ba93ca27c60c1d6405ef72860eb282e73531a9d36a2fbdd7bddabb7196e3aa53ce4913284ea83cd94b37eed2ce7a3e321f239f241f994f0f1f258eeba8f75d0a4e497599fa4205866048c5f152b2c7a987484f921ea726b3d84c63f10508a5fd6fa85cd1fe2d2887e1884495474afbbb78a2726c4e4e759a03d6b43fbd7298f360697f9e9ac37cf718697fdb13bbf6deeaf47e7f8133f544b9dd3c50245b2e1d1e9fecba81b9940b4deff2c5abae7c1271a115de7912f7265056505901be900758546ee449dec381507a854a7551fa42abf47cfa447bb8107da2402891244f4d9ea008d1ae0a5b612579e02cb6eff2524c0c889a1fe55116b890337914c8345faffd697d5981981cc5b0822fa65993d96c36cbd9898a19c562b1986b87c331114c84b8e06a4d09f05b61e847f77261fc7de1e1e2503cc15d1720a4381d3a263928ad06921a515c94733561264048b8d393560309a827ad06138f1f7a633b04733cf47eac9494a3c6118e1a45346a48341a4fda474f1a0d206844d900da6929d975b6f489e16f9fc86d75a518d6ba5bff1140fb2069adb573cab5b47ed5e613fae3dee338afe33e6bbd8efb8ebb1fa59bad55b476ce6d9bdb4491046ff36d9ddd2d96eabb485454cefdcdb556dafdf80449e9938d4e4825ed4f923d9c45c77d7dfae5fbc581fc52398cca61fe05e99351e97d9164cee24bfa94be1ef69188425dcbc9f4059c3f5b47fb84b97532a7a8e734e5a5f9a0ba13fa83aa4263ad02f9931f94f6fbddefd1eadedfa3d5ed381c16d238e93dd6462b1c261d2a2ee452aef38475755555f5e50bdd3856a1a63856da1fc70ae70aa7e62c5e4757d9fdae3890ff07e5302887f995a830788f565657636dbc511d7d1dab2fa04f8cf9db134dfbdb8324f51a86759bdb2c37187656a776dc33b64ce4312ce99be7d907af6f44b6eca60a22fbfe558c614b2f2791535be2a90213b9b6ed897cbbde3df71d7cef75dce7dd4ccee7ecbc0ffc3a9188f4c4fa5ba640d781ade0eb556d0d3dcf7af527dade1fa4d55aa7b3f444a2d1e7043fd1fe96292076d0719b7fe8986675d03df714e838279a53fbfbfd799f68fbfb3334119de227c2c819abbf7522f05a104fffc6adfc3ea0effe80f6f23a290604c939371833e808e6ca1d3e87c1d4dd7bdf6f3b35e79c737a4e28a5943a1877f730774b606aad9683d26eedadddbbedcda90c5a82bbe7c230072dc1e01772620c1d0d3ec87da739eec3ef7418963e31c40f9f48fca6b47fe8f5936dd89dd2d74ee9bc4710a565dcd90bf7a26cb535d8a030367c4f15c745e2512787eacbc9464a8e3a1739afc36ddd2b01bf50fc8fa90a7d4c7ae67473e5ab54020f137a9c80828fa51f29a80024df20f9ae9073efbd3ee6bd42dea914edbfbd4975e29b7db32a04ab409f930fc72f0fe0fcd92d2c13e63bd7896371f3772ec095f3fbeaf99bd353874e1819ab403ad948498d11622e747e271b1dbd0b25e4287e1ef864ac56f24ee5ebc3fde17211f3ed728118f30d02e72bc417cbc957ea66c1c957cbdd325578d4549182dbc354e17f932f96a902e7269d2773936c858b9d1f73936cc8c5ce8be1ce832260ddbd974578e9ae6cda79f072d53a9d971b2d16ff2bc464c0ebfdef9629b4f3feaf3ce701b66da702d15bc4e513fa4655a12f3681fcbb0ee32ff681fdd7fb8b691761707a4e2ac6c87a5c728bbe58d4382363375258379588a64fc6805cf5a84afa42456f0b92b43f491ac99c857d98756ac55cfe6d01fd413248869c201af00c786397757f2f739e2a5adc6fdf81f71db77965577615e8c64b3a55e03da42f114901aedccaa10ab4ed8e680cf58a4e2c838c604f24a2dad3b5ec386fd26facef5efac4f0af4fe4a5ed01fc8b896c4754adb55524f23d435722eba48fcf04c81fbf03f143b21c6d88655776158808a4d66df7170c184a5ddc40477b5666655eba7b1589b85a9dccafb5d66ac168fad65a7baf2ff9929e7fefdd4422bb51284db78d13892ab767add689441eda1c84c41389bed1963e449bf75cb9d927e29c74feb2fdef7db89fa1bfd203b68471427ba59d8271e296db4e6910049af53978250cb8260d8d158ed050c242c346519b2231638a90282aa20808ee0c172f3c6c3062466681590e188014dd48e107155ad10eb4222a413c10ac1cc7d1bae5b0e3386e0cc779d933e17d2ff0b671a1d5c6719bb78d4a2cfece353555673f04f9f0ff21c8c70f57c4093d694545b4a827ad680905124c1fb4b3d9e2849eb3d9c2fefd7b6fe95fda99fdebd5de8d83c0125cea7745706bb2ec08520228085a510924247d25d08a8e68454743602ecb9e41fa59b24aa84181e33835373a353b6cac09c371377ad2623f28b9629f30a8272d268516abe153a0c5906ca1c58ad0622c6465d1623fa21c81473d69b11c5608be7ad262475959377e966cd6988ac583844a668dac92610326a142c312353cb181871244808491d15841cc111d6a7c500384e638d8ff6465654de9fd2b5830e21eecf2f620976b74c09dea8cf53705d0b734054c57b07a186a697d4aab05d2f3573419807e269a3eb156157a8a1b4c29ba96257620af15682f6f6568c2b7ad0ccc9542737906e9af135f6cde0bec303278bf40fa94d6addb9cd6d96d23d00a1c20484ecfc4ffac6802dfcbd381aa971c65034ea793b650a04edd4a960daf5eb362da2a65372d9db53039ab8e89d28daa3e17e57e1d8a8bd56a6b4f355d7f9b595badeef5cae4b4d52a5d7fd34f94d62a6e3a0bef660b1dfa9dd578039c2009f3edb2bac1f6e5975f1b982decd37fa2ab8ec6d19d0b814f5ce64ae16f97799d2c045acbae7ebdf7de7befbdf7de7befa55a2a550553c1d4a5ba746574feeea01ee03f6947e704440a909a4e4b94a70a0e8c6c80240c4abef03e70024315683ee8dd2fa4af97e759bf16245f5027e25c7c3101b17e7d4bc2b01d07ded773c6a51f1130284dd09a20358e01fc817d3b637aced0d385e6052ee4a2cff6d348d6b9e8de7b2ecb3a17dccfbc47e8c0632ebaf7f2d1900b4e04abeffbc4a04cfa96b5dc23f86c2507dc4fdd0176d1fd9c2df6f63e313ebd952090fa964dddfc0baaa5319d2b80e9530d14b3356021018cae404f1a094eb6d71b4c6fdb9718e8db7518bf5eff30d8f6f47699b6be6edf6de1cf2a84ef4db9bb922c370e4bd02bb94edf6fe55981b67263a06728e93d5fc69076d22d9b2b60900e54532824382575d128f4a425296990fe9701d53c556f0fccd89d7efdeb7b5ec7e703f2c10fb3f764be89d17aef6603f049229a15e63dd47518bf5eff1ba6c3b0f4b9c1e47b4fbef7e3b7f2c63f1f02aebf795202742cc3b7f4c7a4981e7fc78a96830a53e9fadd94aeb56670f3e08f79133508df1bc73a92bf9ffc0dd323f97b851ec9d2073f586e1fa2a931f0c1250c9aa5c97263a0bddf1868f0a7c6407bbff16fe35f1103aa5d0fe64dfe4d99820c264bd78fe507aebf293fd8f9f1719631b4c952c6d0ebc39d9fef93b7d53a5fc50c688c9dd23aec55ee9e723a4ce7adc374420dc272d3296a90f3389f93f7081a677c70ccf4869e069bfcd1030d6a1c2a6ab0c3277fcc297709348e06ae71ded3a0031a2cf7fd0f548db3adc3c6e729f70c8d53f2fc8de19a8767047ff4c6eff207a8ee7ecc29c860f1c518a403f6c9806af2a926ff7bf1bfd227060dcbfd69f0039246c2924ea1272da94a8354d400dce0d802fd8f96234a7f0fe272cc7b488f1fe68d810e7dbe87e75f3a2e00bc899e970effa503d3e1bbcabd62d64e8fef53eeaea7dc588fcf536ebc53ee974eb95f8f9f53ee2f370c7653ee1575fc137956a0f13fcc5bc690fe7e7b9c45a09a249f8a19d018e47fe5069f24f34845a2e9303eccf86bf8b8dc433af4e7de4518aec727b367a178018bbf87b418037c31efb09431a4c1f2fba9bb3db4317871650c6911e8938fe35912341c503a1a0e262dd070180942c3b1638986a3061134243352684849d090bc9878b95c1c0d69a679f4a42141d1909e92808a70ad55db58ccfed42efacc92833b750e2d378faeb8fefcfa33acb51606d55dd63e31f6ade51e00b9a9e6b8c9756e4300816681a1e5be7cf42e865c01346fa0925ab7d0cbd34597577c19f48101baaeef03a3ea5a5a5db5eba92ff01b82793e59a30fa4464a3825dcd71a34cb85f7a0f5a603649d0befed6fb3049a367925ae367fbacbd38597ef0bfb6f3dede5aed316841162d3598837b4d53b6ea3deb881facf50b7d5d29094906258555e6453dcc6c9a4b48c8ade59cfdff4a4c9a2d0644d28119a6c69dbb6ce93c96ad4fbbc0f8cf6af5fc2a90ffcc029bba3dd6832448476838976438976e368cd8acae491c13780b5d62468475db42b67a9b4231d2aed68ca934a3b9a555a9968474b95564a3b92d18e62341b5853050a2478bf74a5d9a8d2936644e5007ad28caa42a0da9740d0432a12cdd05c89937bbe9579fe26bf1ee79d27b3ce8f39e7c5ec12bfdfb48a03b1363b930321f27457fa92c36060b00512c16c6161e868bb8174dd34e0320e4e6e3d4f6eb5f2cddfdc64fc3c19ff2be3dfc918b4614f269f2793ffcae4ef64f2753209deb0278fcf93c77fe5f177f2f83a79fc9c3cf664f179b2f8af2cfe4e165f477c5716c5efc6f0bdefc9fe3cd9ff95fd77b2bf4ef6cfc9feaeec38d9bf95fd6fb23fcefe64f61fb3bf98fdb91c967b4608b4fe97b7a7b72fcd986919334a5f7f99f8fbfbc72786e6b8add60fd2827707c4971c56eb0705817d49d770a3597ae3a9a2be4f065ba77757ce0cee075b79cb269f9fdaa7acddcb3b2e34a32e5352429cd26a6df55a3baf427830ba21ca4806ac27cda8888e2e38d49366f4c3ce803f3d69463b8c30c2f146376afc2cd9318d5502753c596288531834396c29624b928d2616da309d213f215d982e767a56e907550e6c9e54f1e1043436342dcdd42805b6e4f69c9afada60fbdb47bfe79ee8f39e2bb7076acdd15ee9b51cbd798de3422851ce4247cfc77a55b9940bcda814d63eddfe5fd772bfa05eedddb8cefbc0501c497cd3c271e5e8ecbc787a7c4c0060aa105fd8f2c45441ff850d001507f2bfd249e12ef78bf65ba5fd535839ecca6b0ecbd1b4bc4f354c7fbb95d5973b244b69ab6739594b047689993fbe84de1b8698ba5fa0236cc14fcf7b3b6a29bd5568b6b037fc99f6ba5cc8e540b4c39dddc21de297b5d7bbd7d6592bb87d7d10145fd4176154eb2c48d061b59e6abfb94922631a81fdae44807e572041bf6b0f14bf6b528adfd5082be72d00c09ff84d06e0f7a8e96f51d350ff063f9d6245050668f15f80df9400bf7d00bfebcf6f2b80dfb7fcbde5df9cab45cf6fcf012a7edf68aae2778ea62a7eefaca8420628ebac827256a0d9a528778751941b0795fba581cafd1a566ed8acd25e805c9f0890ab9401e43ae527571c04902b957a829c2b0a6a0e15aa5679e56aa5d24ce47aa5ea5077a83cccc0cf9bae384c16aef7af394c16b4e9caaeffa71d7d1a5edd7db6ba3e555aa13e575d9f3ebbae4f9fa9ae39cccac364c09c07d85853d7ff674e07a0823f51c10320cfa9c2844f05dfe37a9e2c02d6ae7f65115eda55365550aac8d9b9d1f45de04e6ebd4ece69bdeb71705a38ad12a4e105b5eb309e5df71ba6f77cf27ecfaafa942b1587f9b77285d2c99bd2198cf3dfbb74d0190c7ec6d14167c2d7c92d1d74068baf936f9ce8644c659a3ef93a99d44167307e9d3ceaa033b8f5bb3eb9bed3ae727b40bb3e8b3ac7557a4dd30dab3833d9bc6f4cdfacf4b4f59051bdd659060e43131edb130a6f1df1bcbfbeff35e43239ecfbb1bc4e4a2cee90c9e2da3061d7bb4e6c700ac1fb95dbdfd99de91a454a145dff3ed91ab21c4c158661d82386ff8538acd2b369e989e0ef5b85d2ffc0fbed6f06a92876dd2d377d4f8329f4c64e4321eef9beaf4a0f0a24f8fe05756868c8ab529b2a94e08d9d7094b370ba5d87f1ebe5a41d86a7bd12f6d5b014550d9c3f7b5a7100f67d7fefbd970330fd4107f3368c13c24237bf5d5aa8f53b14c279eee7fcdefd0bcbaf8411c1e48f2f7e14071db810fe79131e5417ced681ee53f10598779743b09e35b2b99cc5f82f0db2d816685007a69373b22bcf0ad47a1c70fc8eea71fc0b1c3f29962dd8cde7e1b22c29fd28d55f130bc0daa570a117ec558538a855c8830ae42fbe3a58857dda7b0e3ca84254c6422693c93c18b08c36d9ac6edc3b2392b86c7d38dff77ddff76d197506922a60aaf108e2b4766e9ec21267aa2fad492a11209ad61e499ae2eab5927c2abe209f74edb0586efce15ad3fe5724dad1ded7a7da7518bf5effb05d9f36ab9a577a601c9685f7c764a5fd3fa6d9c2a334045a455ae53ce144959b6a9cc779fc200e4a01538d83f3173825415477f3b589be5d34bd4e9ad6294dcbcb813adbde2b3faba9c2dffb3a721443707a1fdc6f51dde53c8a61de30fd3d586e1c202488d2dbdfe0f7ef5a18e73cb5eebd9e77bdeb5d98be303207ea4cd73a23ea34fd2ba5d659f95925c11b33697f9c256741b11ce8be779fbc3fde17ef8744f47d3089beff7d0f93d71c46e6dd69ef47318779bf576e1c20daffb3d2fe1f52d00a41407e7e828258fbf34503436c804d06a4e64f0d7043cc9f19d88969ff9a83a6b0ce6cb6a05e3accc3237118afc622a216f186ce12ed3f4b3c3bcc43fb4f1207ed3fc72bed3fc722da7f8a5ab4ff146f68ffe9360771c13954eea4040f44024ce1a379589e921c2f942af44024b43fddc014b43fe53e9af6a79ea744fbd36a735017bc5bb120b66e07f7b48dd95ac82941fb7bd905a1fd7deb76687fe79eb4bf6f63b4bf6f2d687fb73607f98077eb69b6a058c670d7c8ca508d7049d1fef562d1fe95bb5606ed5fab11dabfda2d56d54775289ae637ce18ed6fb7b2fad0feb6baaddae6a01ff06ec5e8911468ff56542b365bd8c76141fbdf23daffdeca45fb5fcbf9a0ed5f60b6a06f43fbdeb6d5986743a07adfccb47f79336bc5662dcf1b6b59bfd375c7a33e471451a2f7db1790e88d9f8c11bd1f5369d21bff91227a3fde31446ffc25b0c002763d693a84e850c1e867c9f6e849d3514423a116021d9d05458104d30a812856946e5460c0d42587aa595bad6a35eaf4e36910eca60a0b3b025b195b7dcf53cc807ab577777aabfe9bdf202dd8be670ce40b04b1e7d40d97a7a8644dd635410a15c211000000008316000020100a89430281248a82448ed60e14000c63923e564e30130983916018864110c5501003010882300000318c314651ad2c1ec2ca9c6f994d383864e7d1d19d87fde4d4fb01050bf335fdfb6b23d72284360afa87d98ed3907e4e90077fe6ef45a922057fbaf00092415ea6047fb62d6de2b5486e86decface2fc872efa2e95c6950cfe69400b337626e0d3136b615afa4592be00f792f4a840ff2c4fe4ce65fa27adb53adc49f9149cb39a341199f8d16a4ed2f1447f9a6b4c78fc2da31d7cbbd8b140abc964d9a840f9c06c94778409737cf744cfc63e69c85c678a760349e0ce3d53b313460e77f69cca9e0079c899270addaeb45184455eca4105b61aac2a4359f16120a777b8ac75b0d066a7aa38c257d4d550d260325f390f8e1181f0d08d9d99ebc6a3f46077bb2f20e4271d1ea433395ac8b347770e12d1c08750fbee67ad7014aa0ef76bf0cb57ec29ef6eca407f07c5b0a78b42c8dfa13ae4e94215f6ecae0a787451067a3ba8427cdd15c31e1d0a01ff8eea90571745d86fa722e0a3c3293f705c7528b66d4c5127db554f77b3bfafc297dd1b6145d313a46249308ebefc8081e9b937eade14683783c8549c24986a12c7b3284a2a414517cb7d116f0a7ce1ab619dbbae64fe7018e45a5faf5a6f22a88a8df3903fb765f0e9ebbfd942807e2ee3c37c288f5325eb6c7dcd47b513490950ae35f28f65f9be4b425701badb23b802188880d5415304b0b696c4290eba10ac6516f3395b06a53872c2518834c66b6bb6ecd62a2751c745378882f75b82512ee6c6143e566f58c24372cf7410a448fa3d5a9a95b43acbfc870b81a1aa81ff4124a2313d9647b1dba7627910b7e2c239b36fdd0734d741ed1d4e549ff14566526246ea10c410fbb8d1eac1461de93688e47dc9f02c4cc0a0ef5a7bafeeb93c014b4ea532e227d5d250a4c53e916a8051e1b68ba02aa04ed0dad60633e118c23b8566300453eb8ac17c5bfa67ead50dc4f005498e5a4a124e46c47ad6f018b808f8e17ebb3f36452adb33d5b2c6a2599262ffa63a4ee4253c2fb77f347047d0fa5203b30774c5f5199920fe6eb8c7e210abbac6db5fdaca33df8010e7c483cd38da3ae74742d0ba5892f97108780842fea9b0c1c850fdf47bd85353a86ec1e01152e9f4c29bac9b0cb9bf3e44b1dee3cb654fe255c04fa9d56702e9c0a23486cf7c0717cd516edafe58ebb5465863fe4f1302f73caf90664782e9e0b96d926b2f074a07d7ecaa95ed562dcfa76a0fb889eec5e4522d6fc3a542067786da5d8b4412caaf1c263a6e1ab137ec355069047344840de1bffbf52d307b9c7bfd6db544890ef5cf08ce273f99b6acb07106f54dbd35055bb6194dc290d5f30db2343845308c077b84f26ad700a8688e19ee828484734acd6d4d02f5fe380e956d755b56a27fee1228d0bfce4ce050d5f927a0299a397441d6b8b2f2fcaee105eb28caba0a905e3fa10d6fa54918e64dbe7a4f4db1043551aa17d3a27912eae5fc6fb8d8f8f9d77649539482b26bd9d4bf187028b2655ddc632a8de41f01833b04415d7a42abee5fc1dd26cda460144d1f0ddb87e48515b08007ac86cdaa7a9bfe553ed2aeaf60d5e897a99bf7284c956bfccae343191c6d929ac3522dd2a171aea62b216437eb6c872ac476b2994843b8bd1c72f95f407c05f8eddfb0620ed2439f62c5a474b62f7130ad46973c7afa552b74bccbe6fe258f5386170455e2d4caf923f6cacc91dd659788546206254ca0ba7484f0bd67e70176fa08ac6d50c4eb80e46753f50a2d7f088853e74b099f4bf6b5f046c7d9c3fe4f191024fb18528892806ed5c347f2c5ac6d3ca7ee032e1942264ceb5537607bf14583693f5b9675709c6b8e2172b1006aafb71a6be6b22178034edb49a50900f5e942a58b2f8212d8698f01bfc63a6061d04b0e2415c134da1682c2057175585d25195c89755437f84044ccd9bf5d9275990ac575b3bb9bb441ce3616b87a54203462a5610e362ffc73d838e385f70a061b049c5cc70752feb5ecc5d246730351c29744472c477cf8e93248f301008d695477eebba89624c6b2f9d9145cddf7f4684bb489954eb0080d32a18dfd4794668021b8cafb2193857e18acf6714dd6c173f02a36f90bc1f48b2e2258e64a0eaaf2a3e102734f3ac3775ba93f896285bcd4a87d22c8b8d65e9ea21651b1ac2721724af2c74a35d90cf07f34c898042f9221bf445099b058a3a46ef0d8e0c61e03041f62b61b8537bb5df2df2b453d6e904395283413767d2b3d556da764d8ac85999439d31a4e2441d641781a8ba062ae15868eacf2a8801b63131921f305438027f5997c46a043cdd16058f496fa4218f98598fe17e2750235bf01185defce40848c1f6f0e0365eaa84911718c40c6b71522acb4f0d4e11be7e9aaf9c8f6ab95af42f0e2806fcba09cfde00029da0b5382ceb1c93bd3f7776b702b74075868198e3db87a170efc39300b7c1acabf790ca318c6dcc51f850ea00c6ace32580c1faf24548b99a70e88f6332199d20c3a1e867aebeeedbf4b04cb0cc23b934da56dbcad091e84d3c07f3cbc8cc0189fb019ca8f3cbc27a6b98460fcafb5d0807f6603d544a05a754bbe2f7ccb5b75ce8a154940cfb2edf65c60c85d92071f176235bb7ab5db05624038de21c28078655584fd7d9d2237cdf1264b73b02ee183014ff35fd92075e62054ef12620c7d44702c6ef4521dd400038b3a12eba14a35a5e59ec151d11d333d081b58c6a9940f818d55f8357088a6926709f3aa5d027361166fb0556a3915055d60876d56510b8979891280508b509c5272ee46f00b9e1f53b8c30b127b90c965865713d909f5f15f43cca591b9682aa63e44758c911f85fb105670167672ac1fd59f7f6376282619ba77ee614615a3bef49829035e97142e29d6e534b6af5298c213ff23eaf03ebea5c8b4e4bd3328797be23ddae8d7570af15eab34a17ff0792c76da6ff0da5b7ed8404c23b7996586c58333e12d525e2f6a4349fbe730109897adbe6ae5bc11934e46fd73a060491df1381dff347a32fe14cb60dc24081d81588e7ad5c63ba1ff332cf71abef6b620a9d62eb856388d8b6d199ec22da78e5ca234a7f96d76bd2a4aef22a5280f679489a91a1e85b6f2769a3ac134bbb65757a5be8bb8b6a066026e400f63165c17368ad604404003794fb8bd4b3f0a5a279676189ac4751323286d8d8adfff90c016e9818911469c3f6c17c84803565a40261ca003296433b6df965480919f8e100e8b6685247518ea6cea35d92adb3fa949bd4ff0c0cd8568e8cc77503fbf802aaa3d31764e2479629a3549eab16bf52959e182891128d1a61841e51d7f9ed5bd70d78cf9ef0ccaa4fb77ea26c806764d9f04a36ba2a5fbcc82776db66c3a2b144941dcf1375d9d69b184f0b40b3994a34dede0617cf18a7b356b71d57a9f55dd2b08c7d3a6c871dfd4de2ba082f2c07b0e322db8a4a6afcc5873b7b9af5940611b505588025bb1fac1195d19c8394101f20716434d75c50ecee98279a47fc0b569116e6e7c4bd86605718d1563c2a80b740053e42c6b328ec177440412a88945449e5628801b199a6a517c843c1076816d230c598b438728074fab52bf47ae52cdac49aaf105658830384e6fe9e15507a61f5a35d32d0df086d444073e7690a800c48ef5a684dae41bc8ff5cc906851658de5fab78b5031ee39d71684b5af9edc5692073bd3c6bafe0cbb417f4f0beb7b76c98e3aed2eac255a9cb44e9648f5a13499749a5e1e56387821a61729e28b3a0733ec36c8804688e6dca639418ab91409f2ea99481ec62e7f3ee5e0b16a48806a5232a029c76b2bfeeddedaf2657a8fac787f02e3133715550443b342a5cd0718903d316ad52ee57fd923d9476f970aea57e574d322d5c980b98363cdbcefa2e3ad0ca18bbebee96072dd14fff9355ff05112154a21bf7714d58d72ac1a606dc097175b8ae981579e4292e440d2391d6c240847b390e99388621b930d91028a648c8e3c22cc26ae4214542b0d6b93d5bc69c0491be078dc18b718797b42d68caec7ff751b98034578048275b5b13c88e2e2fa0f66097daa5b1c20852ff0550c21d8d4f43e5e00228ef04dfc904f7aa0faa1d3f5f96576b07ccdc928547688f66841f34c16885ecb4472bc35055a5cade9b29fcaf4d6bf55ebc563b7d49605f127b7fd2d472ea74822ce2b2f36302224f46e0d004c434a5592caa34de84082614a81fd48700f101e3ae488800df535952c32bd25cdef88dc87d09ce13fd23b63f72d8325dd89c517e7b7d44da393003b480fd8eb67d1bf51bf66d05206972fbbba708684ad894e4b8b283111145f4eb73e845ef4865d014617a269ff3e511889191e8433f966acb58259e5b9d012b3ec526f28b572f2cd7a123c8936f640c273bf6a4c4571102c72435228be0e3b0e8f5d785940cf65dde1e72fec0fc18c9245c778514c1506c8afd70cd3e0ca3707db939a9779332b7b372fcc3414c90cd972e27eff5062b3fc21758d89ef5bfd6c13cd5d6eff401696ae89aaf50857d17c09a1351d2136ceee2cdda40fe732dca45eb3c68a58d2d84ede0282b6b979505008e0d4c5d54cf61825be98863b5d4ca5bbfe1e16810d190770981305801a8ef6329c75f163505c195f91ab36cc117215cb0df243ddd19c1c290b81e4c9ec655712146aa105bc27ae2196996e896688007a11285dc211675cb19e36f95c0ee5e3c8484c69220f03df3802db4a58d6b42639b206bc706461822c19d5f91281715493e609e445a1f23a88684ea306afc6992085bca0c3e76e56139b80dabe4842e955347db147315b78b4b8226641cf7c7af9e5a7cd1bf7b2f2531738af012d3312b7d0f3f853650467e23e420a537950d405c2aceb12abbb1b31a04c3f1094c39cde103818893fcd36e3687620baa571c1df980665c4322639071fcecc8099ceb7409432b1394f329828009a94240c9141606fb329a9e374add8bae501c38167e8abfac4ca3b7b0fb54ee44f8454260a6e0ac364f3cc2a2e1c3100814c57071aa5255232e22c470406c180a555f9119c382b77c26bc0e7318ac37dd37856131cf8cc0711f65180bccfaca06ba86835519e0368dad388c362750e2221580452e2ff700c3685694ac5042adc214b050211819250ff8d08185e5f00622dd2653c8551684505f3d6175187a4515047d0bdb51ede0b84aefc11e80a5220419918bd4397ce960c507208e425463d2fe0b2f934be282158642d66fb11ab6438407e39811c492e74d766de24e334671240705d1cc44d7cda851b09351d06af803aa069ec64c5ced3249e24483dce4e45aeac941d7f4cd587a88bb2f8c409833b7d12694c06356c3f59e1b7152f844d1fced07daee43974cd295680b23edd023f0bac8573532b652158373c540978c27377304d02957d0a0f585f8bd855e4f82af1157e43974e284be9300a29c335ab5e891575448a13f7b6ec4cc660e656342efbf0466a3afad14a01dbefc84eb5494d80a77d804a4c4ff27253137b4ad6c710030618c2e878db001b49630fb438850433e1a99dfcc1c989204a9778285ce4a6b5f09c14920a93a37c14cd078d169566cb3166a99365f47b3725e0c2cba13aea034c270e54e80f72994a801c5db9a3155bd4bd8ff54c5bba6cd8838668a81098dd35eabe5f9eb69b3a70fd11c8e20bd156e0611328e8577bfa4e07eeeb00fa0566b55d19f55143233fef2b00892a9be758cd14a320ebb26f61b718261fb22d873ca1ea02bb0467d81d807a6fb0204e9d6eb64037420f69881fe5079dac8d983394d33da2bff9c89d05941e5d693ae37beb1798077f9e18a2d1a8a4532ebd1368e8d58c7e61b0d69f87917afd14cddc5b65da125fd5149653b94be45a65ccef8aa4dc1bd36b57c29ab3dce555e4e6208bc8aa7832822a7eac001df71a3f13e54b28a98c58fa1e4e647520b2eac1113f82f66dd23a09bde3818d4b087fda759f92fc09df78c0235944217f9da4a828a8facfe4f5fae07783d545005320664d2e520419fc51b4b0b94a7a6b1250685d6207da932361a79d88cf4e7082df75b0bc0e813612b92c34b3ee2871dde07a5230cc481c0e0d04a2671d94fcde13d59199303683ae367c88e84977c0d23b57a4f61132acb6b219a6f87879242e64e452a52fd404cbaf6cc83ee70dacd59b448e88f3b7c50be504704264888ac8b67c7ce695248bd9250ac0de03845e6a5818bc69e3014440772a3f4dedcd6b1385ed2ddb6fe3f03f7c0f9b448df1ac36872ff0ba554d53d2d96d590dc46b4d122176a7173dc54bbc4a4ded3145b1d7cd8e602810af1dc0b0d6df305c9fca514e48969f715da6089a5e375a88549038a380ac25d630fb61a47411b986c97b88ad07290b64b3feca8ac32b3a8a279cf4d234d8aa820160f8af7fab396f6a0bd1e21df7402fd66101810c36984c35d37d69d2ede4b967baca167a73f922081c1bd595554871b81466c3b33fc2fa3fd2907c7f6a466114125b9c6a3b7ab60beb5f6ec19c031cfd03f4ed7d36aaa8da4e36c558f6858899f7bf9236dbd8facab1cbb2fb0911ed77d5fd9c94e8f152cb6660f73fb68b5af0d1b77513670610221b7a17affe6a8bafe571986ff53d23e8dec438651024ac72a6ab930bfe52a03734018e85d1506ac2c69b915c5e30e690be1aada8d4a5ef1ab654e6f838466bc0e1a3ea3be6fba4366be0d8959c91f3eb9a26b052509ae8fe5ff0aeb4760dade7054c125008a666584e922cb8ec5f96523fb2f7bbbf345d47978fd38ad68130ea0adbd890963c26cc080f521d952bff1ed4e958a258d6204f18db990fc74b32b201256f89c03b46ac0df57c9242bf28cb3e163914a8b9eb0313dbeb0b17bc0fc695747a6adb11d5f9d0c9185c54ca025ee75a2557818ec91d81d2ccc9cb10d2944905724329e7379ec0d5805f8385042ca63775c4349adde717201254a88a652a54acaf699ba4e1bf5eb821cf2484485df9b7cd197997469d32dfde0bca0fbb03e151b3b5192c24affb829bfaa1180330db91920c73d044efda10183250691c9d225f520993848f5a1b3f3925f817581b1fae26db2da5b5d9d587c90bf6fd6f3cfa10a79ca10ac3cc1066933ba7623ea1e17464be3d5964d4f253336216188505f289c7416543337a4a3c5d547429cc2757b8df76122e0a556999a6d75749242f1031f8939220ec512ccbd921948ec68d62fe399ec4a11ea68478e8959cc1520da088b1c6ad31cb5fb2121727bdd67e305d84a2f826e1454275b20b91f2d044c09dd4b633dfbc46acb7eb11542be5b1fb983f2db0360980cf4518ff2d0233914533d6112e2fc7fb73ce7f0882894146e44dd1da09e3bcb451678f77a829c90bdc6a9e9ac6285433fadcc093ae3f80bd07ccdb26f344a03dae35a08646eb19b4ebaf07b957fe8f513405de421621d296832f24f681a0aba8c66fba2d50dd347c5f5ef6803349a5a019ca4f5e3d36297d98d3b4ad8a84a2a94ee6296bf6f53d5bb3da899e17608d159a20ec4b367e19826e320c93c47b9c3bda148429718410f81d6d3003d4677b436896de613378233cb8139eda2a566bcff9bb1b2160ec8510fe1eec9f6afe201e2cb1eb7ef139d556a932a1efa6a3afd5e1ee6a2da8d83f02be3954a9179469903ce3611804511a8b6b5a6caadc91f7eb5a60bbc68307160aeee068cd6627b559b9b425282ff082738514b27ed88c344855e3fe802f63e6dc8e38203a0e275ada08c20ec5c278cdc1b0df9f578095b3d2355b4f5452205faf109fe41227a18c2e7ae62df8857417ce6694fdb4169b8c986746171476c377624639fea8894c4b7966dc50909ed616c0f184736dbd6b0580edc7a4408c4f418fe919402df4324af88e3cd73f3a05716bcb78e89ff5da37488d5fe8f62d57e4d2d0354aad0ea31cece0ad9af0ccb2a1bbe0e66e5c39086871706da659cdb822223489a94a73dce04c85821df5bed2075ffa9c22e7341b626eb8994d95adcaae275f40a6f6f21adac9d538c83ec5889e8b44d8ec095ac7e51a8e12c99613b24c6237280f81f5707fb560f1aeeb22b621a81096135dd4ea3c83ac13d6b4bceb588ae3827a8ab2fbd2b87e407ed9b6f86c6e838b198e3a9a29e7b4fd2f7e58f3a760ca0a39320ee8ba30e9c386c38a0868f40d9ec5f1e4bedf8be1d44de0538fd7c70787aedea8a4bc1ae4f4a6af7b51eb823de86ce7dedcb5b42d2437db850025d07c680d1a912a3203268873680b58a1006594b9473767200e6a9829ac0c84dc513e2d3ab94ace8693b22ca457dc862fb2cac100acd862c21315a42b30b53911c7df1b0ca710d82ea1b3f06f704054814633b26df3f12fd5e076aa306beaef956e719552d59be3d138c7203d5c29d56fe5cc9c1aa95bb2ade159c7351872b5e0ab25c26b17f944bbd2dc8a6f11d8a8e56ea5b12dc147eaebae9a354bab31fd88d4028da1362ca1cd1a79fc25fbc00a848f739652160d22b6633d72e9a459f2f3ae8324106ab841c90820ab665bf184f88c6bd8381e1f1b8ab2334793cbe09ba8a1df0ce7dcc70ed57f4c14c651f2df7f83b56f999c0f53f8bdc07cb24dea51d52ac52af0132c1e9821de4c1549d14d9370a901ef695d11dee0563d8d7485a2b35fcca0cde4098ff7125a4a50673f58c3a2996b9c6503d8cc993ab3c0b8b1704b87224eab2b4e9e6d276860fe25c4ee9f4049417cab503c4f0a8f895f517a0a22770b787b14c0f97654c7a4c348f061370b2368f32e63377e3594ca00521a10c2d2e48fd18a62a57d75e2db8eb0dc8eb1ae5a22a257ac3b5d64be34668cd853c0e9dde69f6c6b3581d061a609019df075b29b12cd062f8c872244cb93d22d1c9be23cf625898087a9fdaee1ad09154d4f9802f7ba1979315dccb62962bd46bd0e0e43263ac3530fcf8eb9338f047c98ab358bbe1f131acd8ceb61cd4b6f7656e58a53861a4af9477681d237c296c89cd1f5387ad30029736fca4e8807c05604d56187020ad28eb90a4d51b93898be44ffae935682220b25058739210b052702b5490488d412d5397108cd0fa037822fc52ae169c5ddbaf6be90d025b52c422aaa41474626a06c3fea2d12ad6c2ee0464531ed875539aa132c70f3e2c841c55483a6d2ba890a0f1144bdb2c88d6fcd16a27c334c56103f4284b1f634142b3ee84ea1252c56f6d04b7cc99d9f1e4e5a3130dafa2c4aecf741bd0c85b98eca14b58907412edfce26b86bbf48974088906885c7b8792c655e1d29e6bc150aa7fef8f6b4e39997cf6c39b48bed86b724f1dfe6f353341782b0dc564602570f980f42cee63da966a33defb353640975c1bea0e3155a06baaa14a70dcdc8ce7ce35bca781aba0f3f73509134be43aedc4e9baa2564a57ddae5b2c7b8239ff8506ce3201dcb2809f4fd2c899b04347c33f112baa5940456d449916d89a5f2690ea52b183ace664cad677ed4dc01743aeac27d945ad4aaf042d57b555e9031a483c71845d354bbff7189383963be0a1c6ad688e58a171b844e7ebd09084fdb3be9af0b5b32a4cf39b0ae2a264341a472327796466f295d5573745cdfefea7dcbc03e9bbfe0dcf12a316910ee2d9cdfdca1ba9efd50a1c9c5c4af8f1b56b895b23a04cf387abde8e1f68733fe246e616cd064f9ffe0f35c32a706a43ff8354b086447515488587eb6ab3128af7b1ce85b981103f3e9eec90974c58ea6c06310b517f28c6265ed75213dcf22170b61a5c29bb7fccb7a528f4048284038aed71a94d39f7e309849bb1370a3f7f959bf43ee74105c1da28e9ef730944b6f9f07877019a10ca622ef3cb6904871fefce08d63cef378e251e1e15f0980f2822aef7a3f8ef897be69327df71b3411cc78c655220f33ed9685a956c626ac2cffeb874ed81b38248972581a702a46e3027c1649c758c53ff427d022ad0cf1db8b50bd5eb8ca2ba21e3c7aad9109f8d4f47fb33deca9138c6ce5bad74b97936f133f45627f6d6f73fcc06eb43fe530f46bb2b182eb676376f383965fad32cbf93ec5aaa0e0cb32f8ba33f8cb6db5e59c9216deb9b061530142e1a3915e5346dbe7801a9b46efc46df931253ffce9f4eabaf08741f6d56668a65a2cdc65b251e4af6da1de868687e42a383d9181357c36fb544284f4685fa5ab8bb4ba0fc07099871c827000c9357c1cbc3da5cea68e895844f899c99bfcfa67f6e2bfa0d04999ef97dae3678403a4284582b58a0cf53781c8715094d76140d321fb95ca04c75af927b5639853677bed5f5d707ef9d65d7b5186d2d8fdbcb6f861acd9642fa58199f0935b1093f4c54e21ddeafe7ccd9e915c972b301bac0a1f534c831ceda20434918386da25b5304254740fcace1a5761256c978da267a24cf445ba6a08896785e113281a09c3cea30475fc4d3108bc38d9a7718e0865068c618392c43d4112f99102ec91e4c0fffd4c603181e5ace56ea5d3026c668552380c08b004e2168324046c8c137333a65ee658552173947705688a121b82828ff9dc77f4f13e2e7bdb811c1f489f1bf3cd05127ddb8a370d6700e1363674424adce3996872218ebb8878a5b58d6dc91c522c962011e1f0ca38202c81cd51aae29fae5ec922c0644d3b0c6ccc2bf244f55493cce336d9adaefa631954a4ea2336732d5a8c9dc454df81e12be622fe1cdc6f600e44956f62f1ba1e21cafca3ccce6e3d3911ef30d628657b308208c7d1a2cb7b1b5ca6674113b7c7fa6ad5bb7cd3b9ffda62986ac4ed99dd16c7208a2bbc73b0ace2fdaa9b2cc5e4209c86f4d5f167fbb1700c928e83ba6353402d124ce4f508cf2872ec541aacb7d1682ae08450d18c1eba526948fcc773a495df1b3b6917908f877d3973258df0a28e7442ea4e7763d0aa437039f82e4884133f0967a44d67344278a7be23e2531032c7584b4c126f5d2b0aec279c7a566694cfce50ba58d52c9428bb6b9595db790e4700e963b29258703acfd57ddeb5c24a391cf8038a9e36199683ed3ffaf95699f059407d67a32b5a52d491914d2a11e9aedf302ce6c273f30554cb39a2c0791be59fed0ae5f0f7957fe44433666288b3ed34781ef52e19d7b36973f9d996d39e9f56999582a6a7af4c1bd45b844d1961858d636483bda45d4810eae2e5d8021677f3ae53ddc1c6dab5498f001a4cc0d92817553908ac6a944ea263c678cb7360ac6cb046a554e2e6572ee85f2f48ad361133e440c4530ff3e324738a02b9a996f6a3d81125b39efccc46d61f3392901ea2615987f5978355a922075b741c09172ec5319431e6b66a28654591396558da98a2ad4bf2f3784cc2c67294fc3f218a8bb29a662e6cbdf8d756ec4d391378d736e639e116ad7c198d909eb3570c12d38e1ed23b2586606135dbbcdb8093687e8fe0d094d39d35a536ed23484da0c7308fcf4b83d8620044b7f4d536ae2f89b8d850f338b85871ce3b10fc2f124020a509a6a0e075028e01d737f1fe9940c9271ced59ca9a2e678e6c483f26f65326901e9c27b99bd3e0f62f0e03efc709df753dd2b23f345d32b14a00aa8c7a782063578a0ad6f4c234dfcd1588b14650c92f000c3a0c1a5a0dcea1ba1d266a9cae67195bff3cd7c467d75bed1389e731e93fd88962d695bfdf47da3c93fe2fa92959f82a8caf0c2378623ac1111883e6b3706f5101ada47f499208bf08ed096913aafd3b9d5ec238d5516049fd1513d344c3c56607618b3f6ba3b90e058afc79c3c8429f28f5b8fe091c13df68e7da04e95ab2723909d76e0546a69438801915ff64e422bf2317b9b62032132dee520a406923221d338b3fd925e9140dd5b3e25ca1c950073aa0dc1c8a00b76b35ed5bf0d504422d7ebfea8f33518db6d048370317c0a08afd5c8b63e3d8470e2123519f80e51e8f7b388dfba185f3db02f0122e2ad37993257bd400d05d6de65f56ec238163bd8043f4f9827c805a0353e43afe9183ac8da6270d7fcf205bac66801e72e48d345a857e3162fa266baa230a57e322c2741352f407cb5d8e9499b4355f205d20a6f9c0fb811a28af344eb00d80223a2e85a5f354757fc00c51ce7a4ae9e7db6460cb610ecd1bff4921f6322998ad0ad0b38fde142c68867cb23badf90bef04d3ce84578d61bacaaaefa033255d08dd819c4134bb80018e58fe7a2f91b133b2666367731349f291b48f3b4c1a089abb40d0acf036c06b0ee29a4cb32e0375270137cd1a41107c6494c2e79ab54ba44383ae794d2a0bd551339a891d067f88fd2ecc5c8b95047ece02a18f9b05f56b612edb8ec18402dac3125cc626a01421794778c75ccc1bf346b3253a47b8fb25231c8ac17801a482376d0146cfb44864c678ea353dfe7545c721b063dfc0f9e30a0bef2a3abb76f1dfd97fbfb0c0490a5cba7eb1cbd73201b7a8dd7366c5ea1ccab322ff3389a771a88c0a17e1a7a053cb1fcd48c3bc398d467eae6da07b66ad7a82ba31ed46e54125a8adff65ed17c5a9df1a5708081ddedfa9d8452990c9bccc864ad487a21a866c788e4b6dcda2832a2eb226955d00054cec298ba89a7fbab99af598e4944ae72a45e6ed6c151037958ef1db344dd188c541e069d3c94dce5ac520a3f3508287191a0db196a39023b2926cf3e4ae074516203d2cd05026d87e354822eca724ccfbd5b84bedca10d2267423262c0fa70f1c60872ea334122674275c7b50f639a7279da59ab6c9d2e6477ae3c981db86e19e6dfd3bee71a49e30556d449cbc934a091ead81941b97182394a452131f31b96e692812094eb2c0468040595e67830520a92f1ae21f7bda5d4b1dfef0cd5987e8a20527b950f51cf92e117ad5d1ee12fb1a87b1a64f289ed8c8b5c5c0f5134a7165bdb2b72ebef1f0203c1d3d69e37e266e0b2cc70744581f97565b76c7b35a66c4c05a93588f4d896af32adb5642da378c9a23e241330f0dafa8429729cad303ec5f186f5f87fe694e2a02e608174f9003c24ee90043869370519419240b16978bf91b2f8e1107bb68b8982ebefbe909f11740afad42ff362ef089ffadfa752e18aedcfc0774d63a94d069866a3712e969d11008517e0c53b008ac16593c6f35cfff64b542ce062648459c42858e4c89fd76ccb784790582221f4780c0a93254890720b82d260ae071570a2274c83043b089d218c7990435647bb715d233b8d71d030db870fcda6c502f56d314982b025049eb8080c8927247ac2f441b76ca46abfa758b5aec6c0c21620abb6207cd65da939a0c9def99c827a80cf9cadd06d9bfef651a5c172d201d51a59d8225ac1ce687f427738c072015b54486193cf77c932bfd76471e95b68d1cd452b59aaac44359d117981a12ebc23053002b679c6d1c2659a8c2902d4c4796861db030df658034cc2de6b0ab8c49888638cde286c04f946ff9c0d1484c4904641ec77bbcf688806e872b3f3b6f6478814dccab8a4fdc6ed6d3116353a469eac2f3d6efd63720b10f38b1e1c814877e41673cbee2754d38697724f58d828a12646d3cc4b7cd6525da569b89b1a476dea2aa3b1ff39edcd92c0d4e008bfb587ee3b89955431f643ce17df275ed916b5fbc667965f0c98374cf0686dc52fc70cc521c072455b95aaeec804dab72023505d6c331f8a4c10c0a0e68ef4f0255a7495195019a218102d27b98b066ac9519f8afa9b4781de0ad5989ae88a68a95ae82e7069ae327b780ab439637fd1d055f540c6eff52d8b35c836246b379428623abcd7d5ef6459bb0185c60db232f8f15ab7c846c8e32e4040c921a904398814a342148a2eb51f5f1296b1e15d126f4a42c188e5a83a297ead2d24b6e29a31ffb583a55bf130cc1f11befa631692be14d7108441e3465dc71798184541c494a74f376d7a53f0425a805a3126a26b5163effeebecbbf3e7483479aea69e207527e6f4a2c1b8e4ffa429f241da44c0dd721a113730524f6bfd68173140a34f96cf0ae9bd6ad58fcad20da36fbbf72a0c9383607db8fea9e4df39f27ac70cb507acc20dcdf8da15bdb3bf75eced508d505705fb8a043f4d1937c6578ca5f964b27f0e9070a302ad2d8980c0e15a8d1ddd1e8493f9fc80c9dcc42e04abdae18b58d0c50f13ae104cd7120692a3ab9c4289762a68be58b24a9a4ac02077aef17de8f605a0589e4f84ef6343f079a2f19a355e4c6ff0f05e3c0ea88d2682f85a0e8f214c1c263c04c710f497e0bfc76eb9ba05088dc88eca84249afd5fb7657c770b11416a6b5abedc70ba20c149404ddad8a7c95bcd8c5e31b99e308984a596b233afb89ab9154fef241d257527533958bd4071473db3491728b03acd788900a24e7cbce9a4b359629f8b4c68564dd41f100291226122852cebc95ee85b65bee7c3a15be135f32e3a5919273145c6630f324b8ce5240f02648ff34ada7ed7ad22de0cfcf5d8d6a16418650335cb16033d6d0516c56d665d1f2adaf4666e203a37cb850b5fa105a2bc3e1d996dbf0b32cb0e657abf9e1f956a3c6a2f8d478f1c282dcc2254cb3d8e67bd0840cce183d7ed0a12706e473fd326877ed615ce2602f54ff702a312c85a00549ee49b9389c425b6a963eb780cc2c75a9b467a82f4531a45b8b990e1fac47e5f2b58395e7430bff25360879617c03e1caf852d5eac79d4a8a46316e68418e471365730711737a6ac8a7c6eb86320958cafb29ed553b4811b0b2e2b648c09b30719c69675e16d1c84dd64fcb2095ef29a8b4b90d69851233a0e048db46f8899e4f14271110e305ce736d886524a8249cb64ce9dd13e48e508834f5247cddda08232da8fdc0c00240d7b893823c329be427c7ef54cc7853e526caf236489b525fba1589c0ff04131ebe83eb05e343021280f0d7cb8bdfea2d082228ed7a69eaea9c7d374cf4e9c436c1e32a085cfb2ba21d393db865f8eb40c744cefbd3303984f72986acdd008d112424814e6e518550982832d118408893d73e8761b0c83863d8c90e21b359abccf1ecd4dd00002a4c83dcd7b3d4c25531a66402d33ef46ab89a65042685dfbb4b1483c20e270f5a70f9f4e0b1b1fc9102701671d33cbed4b717036ae261f93717ba07082c627968b70eb65a519371bb783f9b53d178fa34b0ba308018b1b68431a28e0f9f26f873202fca420c409be94d694ba98555a366e8fb01c16c7285ae0a05dfd83412675ec54a4232f7e3501e369f9d76ccd8a55d9e04bbe8cdae7ee848f1d46f1c63469eb9be13475144ba143724f13320674532f04a2c70831576e0008c658e478faf2b2c5a845d405f402ea22d402a24549ae574f526f0fc7ed58313753a5169b29a7d568059526322c0982258149c83e39049999f51b869d60d611b1720df9c32f12c0b98def95b3df859f57a175b86ebc1a980c6246dbf7b765106564e6595cab2ecefeab4245d1ab6ba63cd1f60c96be00f54446b6850fad33a94545407522668af3f8a02487b78f3d20a1ef214b2df549b24a3da66af1603c381dad278395cc833725fd3262a1990d0c631a7f8325b463d74318c634fecc41c008c473fd5f27a8548702e3bb4c82743476f1f39d5f74bce80950cd969c7cf74416723781525068adaab957ba94456cb604f9b202ceb33d6a77a068461e3cbe644c361987eb973b9d26520982088b5ec5d5282ca14e86a25a9c0bd65f1a2bc429dc15cc8c8528f8791ed133113ab31172e2844f8898abf7c06fec1421bc8d305ac91d50859f1541e11c618efd334abd2c06eb3bc2affaba2f1c806ffe598d1dd62c4696d6d2f4cbbd30460157b5a44ee8ea454234c909f7e0208d5402051fd272d218acb6027d3653d24d42a0094e1132fe86f6b5be88cae83b1cb7502dc664737a0fab9b6e19a0d818806bfcbad65bb22031b745e257f26bd0c288117fbe9321402bae34c5eea8553770711a07dd66d9adcba5059e4782ff013e5b5ad88cf7afe0299aac5b4d31a1f83e2e13d443bb6b6818d7d030c951b88684a1c54d08a835af6c2f8c8cdaddad97e4f244ed2cb3eb9f331ad865e2355b5a2ff9a1d7fc589d9dac588c542e6aba28ee9a95ed0b71ce6daf01e70c4fa4eb69ed765c3e1fad17d151d00ef16ef64196f2a296b13ec4204cf1fa8a17317aa42d76c5dd619eb2cef2e6f8bae96f196ce5a526e24270e91e40ac86b68adbb21de9c73b4ad4337d3025d2ee7f42a594c5c951414bec28ab38ca92d0bd098dbb2fdf1dd9a5911025726314f5257d4bc7e220ed497b5ab97fb524562a58f3eac61b2e6100ab03c98b0973b0d28ea363b24dc17223c0c1ec07d34cd4e41f1eddba25d1e0cb4dca045091e6326e16dc88d01f1710c4945a1a08526aa642e0c8369bf875cb7c11cbfd6a2d73bd2c829ef9b17a7658b118a95cacd134bc2cec26f28231c822926ce006533468540c2015d5d9ec33ee46fc55d47ce918ace7087ff5755f3804bef9b13abb59b31859acd57448d08a090f2fa4b8c95922d07f70751bfeda23b49fb83fea8596beac9846685f486e868c7595ea90404f98b74823842a0c5ffe823896e726fdf1a86784b38255f9d44bde3b6a106261ad20dd2bc26768e4c4211936a884f8d8923a7337eb0ad5b345ad97221d7d5dea80f8bec2d96e1094904244c0160cb65d068b3c20c245d4694d54b5b76884a2518e600157d5b6176334ecf4b6afba16bd8b32c930a108476c67152ac8b2db13c8cd6448ab762826a35de1347084599791dd1bd99df55f1c0ac57641e38c861be463bdeeb5ea5ed40e075ed887d05aa3c194f25e3e7f53103f7d392e711dd987b1c6a8efcd2735e1cfeffa8dc315f17c29b69a94ba4cb6a764f9816c0a8187b81022bf28d6d60f551a48b198a458b0df2f71073ecd6dfe47ac411f5382c12eb44e409fedb185901b3daf7cee8919e95619fd88580ac31ea09b2357a05f56e1e5bb4a88b111d8be8cd328519555b3df4b803fd23c498381d548b2ee1c6a1894cd96f2a70ae1d9272f637e6c9597486970b6416f3ef6af40d77e5de3228e4b6400bd97cf62d2e3e0c78ef4398be86aec88b561f4dfaed72d27de0aaacfa91687525f7da21ffe302f252ebd0abd4118f0828ef749a924375e868b79c77cc774a9c3a2f42d465b67c6200c2b5db520e3d45c6590238b871b938312c826640948c8939f17166961e933c649fb79366e811c518fac688091bd1abf00fa5f3db9ea252901cc78de9054a4493edf349ef0b701e57ad9ef9312089f3edb443b7d2514d39811a01396db687cb2f6435975586bf4ad709bdb243c40dbe1096470a1d392d9703b20cecef5f3e212374b11b9b0a48d4c2790ca1a4c53eec340789a1af5c3d58d072eb6ee006a9a7c7fa28bc23af8e70b191cde647246d769c6150199813d6a1faee230362e59691869517c697370113e7f1d9191e5c161ba7119647a7cf4d030a493de784439a3062b8902b12929254fba2a147248483d27dcfb9dd679f314080095b8d0fe92e5f3ec042f635d2df9aca07a0087afbc05bf98483905bf9cf515a62b00759dc78af02b2ecfebe53d67d6e37dac6069512f45d1aa78d8222f394d62154a0117572ca4f2902509b57c68f2eb029c9e96d06c3c4c527941017cce1ad58eeab6345d5bba02255a2e7b180b646f49faf8ae5aabd0c96d265e79cf0c79cabc5cfcf5ede751b23fcf67dec2a3e4f61c5150a8f1655e8619dc398fcbd8caf0cac8280d868b3ce277e090494a1e3a89b85e653d9a5ccc88c56d79e2b5724fe2936af2acba8360667f472ef7094d9000f973664dd904fb9fea48e7d80982e0d2c99d059543c65444452f7450dd550a32144c8988374c6c85a64f425f46d6f408f179edcb21a79806f64b12193ec5d45b557a2b2addd18ff0d9a32b3d95ecef4d2e7b0201cfcb1509e51664d3693426d3468bb2528ed9b16c0981454822c80d7b4455df566546ec1e52f84293ba15fb3b4acc7ed6a4632398f9b201080a84882d234591ecae4b69cc4106d5f554e0a2f898eae93bf5b25c751e37820e6b2dc1acb0fb0e73b83627c9266611e39f87810b612be8a26865d86d7902b32bad8d9a0008fe6654b8410bac3c30e5208f64c80dcb758bd37b1fa1338c3d1999066e197fc5392c500ee63c29b87678e2d656d964230e406808305411230d485c69315a1028e414233463ac91508ccaf39f4b8c7604ddd05c24c4ac717f2e3237316343368161f032362e63c31cfd9a39192684c922ea18522c7ebef49aaf5cabfa57b34e4c6601fffba656d7eb639a0ea3f9a88d8ded0dc57070552fe399a68a2933e8e47b66270c75bffa2810e4b1a86de8758a3cded5f30f8239c5b9efcdfdda2394913a2fbb28100866fa7e52502649cf0be01d644c763abfb80a837d5b19c3154808c38fc1301c248fa3e8b378b56ecd71568a9e4ad5e747f23e67ac7ba5c8d4297f7d75703c6973b0ceaf0e295408cd975f10ce670ff60d1b38340a8433a36c244e3619afcc4e6d8c44232b5a669d5423e7010b5cd4b903e67e246b73faef560672199291fd32459c053f303f72ec4bdc867c594135daeefee4e24bd3425eae1aa75f91fb2adb7582071e2b8fb48872df2fbac028bf2ecfea531fbf10e3f0e865b311109718596dfb84d733506f81ac04c0f7de15068c75fc75cde065bbf168c97bdb3aaa620e4d5b68cae4d6b13c2330a231fcded570e42af813918c3e586c07a37a79bb62ef1b1f44e95b143e43deb6879d115558c40ee49397e42240c888b376ac20c3b6bec91194435a4d774d55512b895646f610baea99b71ac96eef858739910538125e891661b3c709daff7e819009644ad18bb1ca5e9f058f356c078aa510019388aa609ce12964538531dc83ecfe551403aec3d978db307b615a8116d4b1868515afa47f2af79a62d50ecb2beb342b006490fd9155ed80bc2b958666515addffaa5c134ac4bd6bf2462dd77620c6748a9d7f1f8d92ff336f2172d1130adeb8b4a54009bdc1a0708bf472cdfc38fcd3f080445d4a800940f600224fc95bd9753ca411d0b971a1042f50038eb60c908b9bab9d385485b19917cdb387ec108b7ae82343d005639fce948bc8d5b336fa627b902f6ddf4f60f6048ffd9bede568e0406c61d459ab2e9e88dbc25bbff454ab72cf27a922d3ad540255baeae587fb55001427cdbde0024be9ef6713b8e47baee4687ec860b5b744fbcebfd2e40abe8aecde8f466503ed02738fdc378bc012cc88ce894638f19f7aac73b5e95e84a5ebfbf7df00cd00e2afa32588953b052740fcc7f73167fe1a047833ce2cc2b7c910efaac32b7dfa06694e4c02924d912a83571af771798abb75dcad2bc0ce563d9ef2c5b18bff9e3c864c6267d5c3128a54b3ec0edc708130f13d95d0a2189c21bf1ff0ee820244570c36c1142321798280fc550e0e47f1454bab0c0e47d7bf0fcda11a89c44f8677bb7243153270a8bbe7865056d6ed890d47a62eddae7f6e86e07a6defba1c20a56ccefb304e5f9482720cc8d454905456528ed646893ab03073d21c97b77bdc869fbdbc6d13cea7cd8fc6668718f21380e376aa23ddfdf64168a039f2919d58fd6ea67a10d711dd8618ed1d4e62c8de40ada7ab9eeb5a6c83eb6f6b2f9b110a1ed149f4252ec6c6dca3aca26df896ef947176c9c1d54ba273f991b7dbb433d480b6c75c87b2b09d85525f3e4671f4f685fb59895b35b6ae4cb3389ca5fd407df86bcdfef58b2c38ffec2c1900918338874afed3d2fd8d237769bd0687ec8387db3b0d4b384da516e412f2fccea01c1c19f1469fd2b68a9491c9df3f2f7851f7b0b5f4e5fc3aa34171a59a5e17ea6895a9fc457248b2120029ee91302beaa35511fc5a2f8163d198d4fd63928b4cea1b1646aaa179b0f1b165614bdf79546e2e815c2f4fa9251615faed379ffb476c66573cda54857b87cb55b82e082966ffde2cbf645d4242aef464a31706805f3b1c48e38e2d47896d3600aa05696d25169ef15fdda0b017d0010f443acf0d28ae4d7162215893c9b6364283c3dc4a8b4ac414a74b2f075802796904354ae85e28c15ee9480441f5a678a713ca4f4886f122cb8680402d6e977d6969abea1ac85829e9356a798e82b6fdfad4ad7daa0ac75e89699817adf471615ef7e2f698b3fed9f076a13d03758b29382779b7a4756a2488b10a50b25d59feadaa28cde72ce4b092ffbd59468a214e54dfabb03e4b0e66703671d51381c90134b24041734693a915409d3bce7ce6023e13b90566bc9d33a239e2efda680df573bb20ebea9ea1d75dcbcfc3e47714fd2bce5ae4f5c7c810370cca32ddecacba65bd20e6087a8df2e9eb1cfc054e458c51054b4ec5a90a7ebbf442144b67c8a50a07d8a779709645109150526801b4a1038a8c0e805c40d659a503295ec2467fe8143338c5a13c6aeb1de901c9b453ae16f42487a1975a7b3ff37cf836750c0ba4387cfb83bb9382fe093737dc3c618e9768721bcbb171dc803353707f04b93ce1edfc88104288247b6fb9b79452ca94a40c32082c08c70732c6b95a4929e59c734e2254441415ad56355444d4ac0134c7b7d6ab128915123a350f8fa9a8b422e5dc373434d2f27b550be58e4d5e7c8f88edb78d6136231b52a988617e3a653631b68d48331b4c45c4ca62acb8f1ebe9d40ff6bdcf9ad4d2e4db7854f2a25b11cafef665d96364c114a820a71898a2988c28f1a0e481889a0215e4140353149311d91f967890fd61c903d91fbab74841f65b842b6404a45da11df182604929b845b8424640da15da1131bef420c3c19ab04bb0444025aeac07190ed6845d8225424a1726d9ad2cac135422402cac8b89958575824a84395b72e813b38a9e41ad39f4895905a52c45646fe23b7416d1a4d614ec210913cb1eacb7e210aaf8b020bb8a8f0ac8ed547c566eb27fe9a667fafd57845c0cd9f7a26b016f7ae0c8e737383d7ce0dce8e4dc4008e18b93564bce18e9c7151f49ab75d968ad37b493ce49adcb621646a9f5b0db237d395a393a44723fb69319c9fd1acf288e46de7074a196a080504c504b502b541394106a65a39225a52829a828a8292829a8a21e37a8a2c9d36364891e1e243e3c50c5894a131527ae4285ca908a5073fd37b047fbc8fd8ee337b55bd159c9f9496994724e5a3798e97d7662747b3085bd8f3e4f86bf1e4c91dffb103c0288fcde73ae7822bfef15d093515d08099e0cfaef7d0d2e4fb454d152044b13961e522c584942f591963d065d9ec8fdd28e1e1b7dd75245ee9fd7755dd8472d4544cbd232cb599ae47eaf1776ccfdaa56c6d2834569f58be2ee0da55890fb7bce39e75c4902cc509e866abd37956a219f9fd5929c9c9c9c9c9cdc7f1a3a0d9d864e43a7a1d3908b0983f684591bcc10ae607383b985098a92152523a41d903af07a90fba5b5cda37d770222f7c7abc618a3668222f77bc98adcdf252393b4035207ae50f3748fcfcf6a09cf6ab55aad5657e80a5da12b74854ed8535979299696d8d2e20d5b266c8165082f0f23156846d074b228ae0cf37879c8fd6da552bfcabe1ba920f73be6f6cab06684dcb2626e359d4ab32872bf95e51449e99bc6c9e91d1e5411aa0855842a4215a18a727f9693e56439594e9693e5602ef9095b852da209bc22f75b97f51df644ee2fd51a638c96ad22f7936c11b91f5e4d2e9ed51221274344373c3c3c3c3c3c3c17cfc573f1b04c1c581ba84c3450757bc19c68e120f75fead8e258b1b581dcdf32638c31562672bd81393b9007f6f8fcdca808a908a908a908a908a908e5fe7a536fea4dbda937f526bfb470e1628515fe371c31f6869825a720f72c820bc9fd90d637f41d4dc1c431c648f12cc2844552e00dc4b9b9b9b9b9f1993ed367fa4c1776859fdcff485e49eedf7e9a83db0422ce6cf00a50ee07c0caea457cf1c21bbe78782595a7f022cc97a197a197a197a197a1c72f43720a9f151fa7917118585777494ae8a54fadf7a652ff8fadbce43c183f6e279fbbbbcb1b9737b9458e06311044063a2b60a2c344103a2998810e0a84e81c71818e12467492c8810e123a450829d2f141e7a68b3e70a83dc77b158b208fceed9e904a47a5f35e46418820213a0812428320214f086981102584886005414280f84190100ea420288894a0204e484207affc647e9e5fc3545590dbc5fc2c747fe85866f72dbb3ba4c00a59b66499ca126e2b0998c9f6d55adb55b2cc6cd8ecb86e283b7d8b9e5bc0d93e55a601c8f445a67003000d1e14d9beebbafabaaeab71a6990dbbd55aa935af080ab283a020404a8282ac20884f50901e9e20414010148403529c80842020a68002103fe041101042ab159820088812101102880f4140f0109433852a7256393ec811caddfd1a60b752dbc31ea1df814ae388653748c3dadee3ead634ac4d472a4bec37003c01bc7e30ad80b7aceffe5f26c3962d8f1409cc86b7c2b08e9ae95b34ecc4ec5669501ab662769b34ac85d94dd2b01766b748c369588c6297966d14f55c80d956b3cd69d8cb5af8da462d8e4e0d03b1ac46e6fdb2a8552d679ba581a51ce665da08bbf0f58d5a7c9bed76b5d1452d13bd427e02a4f41bfd62ee45a0c851224a4e113f7ee4087992f323e680e0c70f20591001b10110297efc0002a5a707128e3085165021058a133f9e24d1e3848f233f7e0031020c3fe480c96a04427600a4258a103a4400c18f14865842e7c70f203e90404e909e88b8d6063e48615dc00428409478499d4ed408104537e617048427770fe481000102e4c78f1f3f6e60ca49e13c1932c6a09915c761fa6bbd3795fae72a4e5582e334252a729eec44e1294de9c9a61ed527b7c9c74feeaba3e4e234e7a3e4648adfdc3cf860d4fc0716b95faee4b95d1f1747caedec0d4e0f8b637dc4985dcec0bac4f05ebecdf3873cecc8dd1ddb487777f936fdf23d93a125bed2c5fd5db9e9b4aa1563cdfd1e95f7d66ac14ea51ca64ebf3219e477ee99fb3d2b93ef9bcd8be165c72eeddffed21f96d9c45c331b984de63660ee516603e1e8b5a5496c29c1da9194735ed7bce6d571f4a2338b7bcd9fd9632ef5faea43793e2a5fb00ad95a6fffbdf7de7b52f27c08218410cbb625bd43d4dd2e77f27c77f74894e7fc18a3fcc973be94b38b3879ce0c67d9a6dac0a55fb32c5f18ee2890b17791a1e6ec6bce704781ec6d34ec24cfcfe685d9f93d5ce74e3ce6709f0c5e56d0d4d89c94dbdd582b3057527a46a5f6b83e523a4fe4d5bcb79a73f238cd9c734e777777777777772f22371f01ca8df811b9df79dcdd9f4499d2d5f494db719e33e90fd6df8e543d6e1733b4991ff106ab90e7bd36987b7c8f7e6569590fc68351b3743fc95a63946f4729877198896133ce19a5bfcdcb7e617ab893564b8bc13fbe8d631719ac3c1f663c79b038dec77f184fd81ee19cd85b2dc32ca531bc1cb1cbf538e8c7bf708c159746aebe841042484396ad5ed24bbabb3d42f9037f26c4c1092ff75bfbbdea99b65d94b5aabac1cd7a757512fbd569506f2df6d8d727c3c2b2fdd941950db5794683cd167712e8827cab8dae63a492e994cd80b2ffae1db9a5929c04ba007f46439f9e49020ff072a9af23447f1ca013d28829723b993ce3394c0cef60e8199f5e411762b8036577199594dbb930e4c293f1f2bfa8b0806e84114279cb2fc888257c868e610a17e509156fa3c4b1e83d9b19a6c844e19e3c156f892a0ab77b32c8b1c930c7696a1aa63f468c7704a70f693c878f047d1b53e4f6d36deb14d1ed52b90628cb9635f225cbedd1781d21926e58a3e7cf681afaf2532f1f2393e537d79c7c1516b73f7ec765d9423e050b638a5c887348c22dc2a9f5de54eacd3c2aa075a56ed6386d7b0ed37191083e4b7e107c833e9a6b95142efc98bdf6c764085793076d8a02951537fee3626462d4c030630131cc50c38d1b7078797e27b9e900543de1c6eff970a64e6cf370c801023ae4d84107067a401f2f12452845f93df8f0f5ef33c9f3435545b9dd29f75f49e0016286b85d2abf1be47e3126c8ed54a73a95db7f804ab05e7592fe813ed0a705564686e3fe53a957dbdddd6391bf08a22c894f2251248273680927242022022a60d023a8884e101116ac7a15616011f98010160a8970c0032922dcd2139a8821080922e2076e031fa795c927a754821f24217c5c227c7c604404077cd09a2044e624084c8a20b60540ae1204618520881f6a50083a00840e91850f73082384400e910320e2104d0ce1439060a77d089d1f600fe103676728afe417b473459645b9bbcfa2c43e088b1e94d2ddca17968726dc985fd00e932b7680769a00c2073b47768aa8c12db2c381173b712748129e2a1c61a248154280420d41087922058a210cf9c1141eae0b053b3e7cf09a18a18427564bf42082042227a0f0438e1421ac48e20432bfa01d0fc467a9e69c73ce9d1b200c41c290210c79c20b862061c81086e860089321510c7162481343900c51c20795fc828604310427b31f379b2dc4dedf0ec0db6e476294f8491ca127a3461cf8c3f8f360c0a75b57bbd84486a986e93fc5d86fface941bc698320f135695825bdddddd6bbca6a5c82d30b9ddc7c909e1c27f30ab94b8ef27296e77cafe2f840bdfe796a3668a39e37ca778d64a69cfe952c618a5fbeca65cd17c6803afa76f4394e7d3893b2999a88fc2d9d26374d913dad85eaf208c2fd76c23a652e2d68f990d2bd7d858d97677fd617f377af829d7a1b97e08219c31c2c73e061d70a070174346fd0e4e0377a0906ed13edbfcb9eff8ce4e562a7dcbc870dcaabb7015b3dfb0216ef6156bae97e81beb18dc812e783350c84f673d7c6337975ec501500a0f06a66da0141ed70f9f782f1f1fbe602cdb66562971bbf67189bfc2f3a0d1627389d8c58616efe26fb478171fdf05de7124e21b2e7e05bca36f1ca6dfc5ef780e93fa16cf8346fb985ea5826bfad37766333396f260643ffa8eefe2df05b7608b05efe030fd968a90c7f5af4009ff4aaeb9d4d6354ee75905c79073d47470eb9a076eddcd1ddce99cdc7f7b07a7e134dc627b0e733daefff4b2ed3e180d3747a2c5df6f819fc354d90293dbc197d9a549208831163181237d27f3c98452f9d7d11899d4afdc15baf229ab5e7f9de66506408002c4786186a6c600320e00030212a080950794fb49f1426a5bd914809f026a64e48b32433ec8b065a0f441b5347259955e6fdda84f2fab5239df453e8f3c65ad15524a7bcee952c618a374f7d94d3926dc6ac9c71ce66ca4ccc4c25af822842cb0a71af0c276df62ac31df9cb0bd61f7f4123e3d46de4b9fdc3c425b142952a6449922258a94eed138454b980031115a02b4a48913a115dc813a9008d4813bd008ec81dd54bc27543ca228528a72800dc3f3151084ddedee3146291b76bb7b8c514a39679472ce4929adb55a16add5b2acebbaacb51876598b615896659aa68d4699a68d46a37b2f89442a91b21aa41aa5cc06ab61329d4e35502a5145c51baaf4349daa46801f34708212217ea099dd796e55e5449f5a585dd50ff7ba951276471e5dcdfb19ee0de1472644447e98a22a72e1bf9b209e642ebfa02078c82a12dcf860bc8d918a47de78c79738faf476857d39ff1ee5a4d5f2adab5925820bbfab44a0de9b71799c7f277be4f79287379392375bf65784d3443cce9d8737d33bcdf9cc9455949f27ee2e44637f532971e147f91d781a1c8055a071c47adb2e32dc4c420f867f13616a924d387826230de3bf440f121f25fd6302caee4c6e109ac915ba4d1ac65f62134f73fedc940b2d2c56d4cd9301ed920baf131fbc0348eb94d9b0dc47ae2d7932e6fb12263d23f46458eff23b9b71f00e00fdc107e48aa38fdfd80cdf7a2ec0bfb689a57a46e6b4cb9b91dd268988783354c8dbe9199ad31c8fd3d01d87f1aff5de548a2ec9ee6f6766c3c576efd580564a7e90f82cd1a319e1b1b14aac12bbba1e6ef1654ecf481e9e901e19bec34b870a99f5a69eee5c52c8ae0911694b1e0c7fb9693b429ec624e7f48c3683c7f9fbd31da7d1887051fe498aeed8253bd96d93ecdfd12576c966996423290f86bfd092ec6f32d234af4d3c533e4aea4953d15d2120ff2bd4a469ecfbfb03b2859b6408519027ee9c871f726c18f8726b21d51217be9dd6eb07441f9490e90725bc13593c0c827012c40f8284209275b44baed938ae8adbefd2676a10e377f30464cee13e4f4620373ec253051c64f1923a9d68103f412411c412ee09b7d647299cb3a5f418a3bbec9cbb6ac3b9275c98bbda551bfefedb076ff7e8b1284639a594331bcd3947405523805f87863ca757bd2a2a823c906704128055983dd87eeb9903320764deefdfd1e59434d6d4d8583b3307d0cc019df56736f25b620869b52e0cb3321b181f0cebba2cd618866198bd1ebcaca0f6e801f9c238ac5a1b40bb1c582719f56948097a3296e1c32fca2fe41774c44f3e02c788a17cc44eb6398b270bdf7677776309b5ce329bede7c709e9bfd8462f37fad7b63d00b6f9bfc2b7789767f995478dfebd8b979694ca5b9b5dd775651b0e8c05f859963d6401e3c81e63e1e10b1a5878118b50dfc58861f9ee854b8bef4e2b482931963df61d86b10b0b3f9fc29e00bc2600ee614caac732f44b1a8864cff0ab886e9b84f855b893690117715100019014c31db46063537fc96f630dca9fb46635ac9c9985ede54c669b9498c70ef9503ea4db6b20cb4b4afa5352b87d3fa5978ecef2fbc238e46f0f9f28c6508c9317422fdda9696a1c26fe8b872fbfa33fb798b34dca6761a32f9f6636db5f33fcc5367a006cd96fdbcb78dbb66ddb361c899aab79bc02eeaa0bdc02773777352fd805772916dc3dc7a960544d7e98d9587964e272bcf13a9db00bfdec25ec31e14e862be18e7b12ee3e75351cb32da68a2bdffe687b36d9e3d0b0ec618f47e824c7d8c90c7714e091e76344d6da0bcad474f2618d50e010075b1c1144021f3c53e079d2b02540433c4da7c920c4308a6115c32c0cbb30cc6218866119869d4cf45b4583cbf2a9efe04fed09a18470424821ac105a105e105a084b5b57bb9be1753275fdb9f5169ba3152ab134ebeb43c2628ab82aa18b61d1aa6e7063732a1adc9ea6136a25c5d262eaf9a28ba139ff1bcdf947fa26d4e9a4723aad9c4ea9d389e5746a399d5c4ea7976c061ef9748af5c12865351aaba0b8b7b10d0620b043cf34c674f4ccc48f438e563d31c3e14fcfb412a09ea1ee4d269d4003ea77f457331ac69f646143c88346774e11eafd5ba7671a1645d810228110426842b5a905eaad7424fc813fed342c3f8ff49de79146fa518e12b841a0e6a092169db3bddc394e7383c3784e631d1e0cdfc1611c02115ddb33374ee3d78c05789f6077773704ea99ee99de1f2a397ddbd3968309dfd0bd150ecdf9bf6c70d530fe96c2f6059cb61c9af319cdf9bbf4bb7ccba73697fe961b7ac6a4f27ebaa7d3a3bec5babcb470b1c26f14c32b2b232ca6c8853fcf496946dfd033a7f7c7218727c3f45e5db6968d850008808369219b418542e177c2a636bd0a844a9af33f6d1028833f26dc71d9dfac4646df67a923dde7e4e70783403f1bc5b1bda336df7656a3da5a67c4d0a87ef1e4a55441b74b715eddbb54f6f816c658438f1ee65bdf03fd9a8123f23340bfbad830dffa1bf32d2cf18d7ecdbd34978a1fe9945128f210993c08af87fdd7f58d2d4b8ac5c5a7522f9f822efe65a5fd7d050857803f275874577057f325d230f1ef5b88c514a9a1878b7f79ab62723b48c4c5ff069677f91b5a3e958123375e3ef51970815db077799677f90cbc60170cbb38b6c1e559fe860bcbdff8964fcd06ea1f4824474884a7b14f3d0f1ad3b18b0d2c9ffa1b2c9fc23b8ef8ef483d0b767ca3e5599e05ef60f916cc83c6c49d8eb7de404497f4a967f91e08e1fd786b8813a5e2de403d135550cda4695a7c54c1f0a7b9c8042a416d7085f5922743c8695846df793695fe696ffa56e25b0335d74a9a8bdf62eb55c360716b682efe7c3c43df3c18f11b275305ddc6f11ea779f918a5e3cbdbec5f36976dc8e3e28f749a8baffdeb8f6998fe9689b9e686e8f45b9f6d59c31d2977b0e864da3a5269235d6afdb55945c41481587c08e8d0342d1f1f5adcf360c4165fa292d23d4fc68bd230311661f113b079d977882972bbee7945b27ffebdbd47ff68d73d3f10ca20914ae1fee9aa86bb9bfae7b8dbd62bdaa167aec7c08e9b1e383e726cf778bc2edc9d32acb11f0ca749d1b0fc63d9b08681294bb197f56a66351af78fec9ffe51d234a98fffa9d4bdb0a83fd69b8aa9ad95344cfc9980bd70ff00dd4bc90ae8c2362f3771e93f9d9a83529a8b3650d1e0a69ee55d64f0ef6e34173f87e6e243f8e334b08865eb1b8789b1288a1be73be919bbf5359bf4cc041ae0df35aef83e182db31a35a6c8e5b2c5c5a8f5c698f8fde3b387a6b85dccfde36fcdf6861db5b9b57bd4267691c1f37ccf137717c836b03c99e4f833dc18eaa253b310857d76c4d5c41489c94f86b3935a2c7b25d2e8ebe95e532a55fa27612e5fdc3da211ae53b85dbdb2f7c7ee93817d24c52f6da4cd8e1c2b49ec34315436838aa6d9b7d6e22dab7103c6ea68ce3f870eb8eb977f616dfdd81ae4a8a9c18b9141b7759a38c6149961012a1bc4975552dcee944fa9977f2113a3a68b6f95e33f1c658c41d7e7e6f3a0011fc63b8ebcdf319f627ca3eea05f310f1a10773a6c4c91b761f45b7ecdab891edd1f22718f363616b7861b3740ae61a64462df8b98222e7c950cee920baddcfac2ac12c28dffd7f3a0e142b18b0dd65f7fc3fa0bef38427f47bd615998070d55106e7c7fc1a9e65a1583db3d26a97f1183eb9fc36fe8197f975ccf44b9c598459e8575e2d64ae99c52c6e8de1de3c4ed7ef724c4401103454c91db71f9fdbbeceb1817b8f7f0c0c6c0e03d772236460984cf495013395b1336e60531494a316217d337594f5e1bbdf0c20b2fbc508aa40b4bfbd9db4864371d9a730898b61c5e6bad25527cb9698cd2c5a22c9f66ef1f23912ccab61a852e168b6284d2d5e47e98d416a37debd1c407e36fadb53642812ec859bb55d96df608e591209604fbec68043c2b234046906499fc828cf4c845414544c99f5f50099c6412ee6026fd9c7f3b2cd3ee9194f2ed85fd55fa4bfeb57007a5b4dadb4e35e72f2a1b6ab358638f99b097eb669fc6917deafed0e7071e20232dc3ec65d5c8049d32bec7c363849f29f93387a1197aa693f91c7a95c36b42b38019324e33e5fbffdc2e09ecbb8f13c2adc9fe96dcf0dc6f2fa067ba5b5363554adc189ca6064a713bd8a3ab81384d33430ccdb520841bf1bba9eafe604ebcc2c6f888c1890141cc07627ca097bd36fad6b2b6d65c21a599f69c36d3a58d8c31da44e96ee3b33bc7b730fb13b1976f83e1d79cb4d84506fbf36d2cb670e75fffda2cc7329d8f8705e31159a6590dfb866db6df4642bf31b3891dabb4792f6b38c68a1b73fc69fa3b33171b4c7fff8609df203dadd6d7b7195d1ed9c2ccd66a5321a559f69c59ba9459c618b394ee59ceeedc79f49662da16c3c485598ede5a74ca58473fdf6684a746df46c3f47afb339c6e0f86ff24657f0d441e58cf286cad7dc1c77a65dfe35f5b7c6cd3b14125343534d63f780696d9bc06a7f97a4527b9e20d4d15d85aef4da5fe396f08692c6a8e4a39bd5e5a2c5dd8554dfdf3e536238434e01b9a731dfcb3ee4fa9a6d9b1c3cdcdcd0d8d0e3c8d08051600beff69077618a306f284c28dcdc1db75e5f1d567bdeb3d1918667cf496e28a318192328aefc909b77b4357b5848b63f492f4a3cf6ee94990b4bde64ad9bf8c84e3933b8a4437b4ed061c6e68383c499920698cd2843b1f879ee9a06a0917e6ee0d4140871c3d337aff1d7460a067b40805ba30c2231da6e400b33f894f322d1269b4cb7084423f85e14ec6c2352978a145051ffd83d65bfca23f81587d885545b793f1eca9947071582f73279331999ea957f6d8fbcf58400cd896e18e47c6befecb3078411f06c46c61a7f80517f382eb999827e913495550eefcee854a0917cac4a87139631fcb49a00b17e66104919a1764844ef68f01c3cb2edc3fd0051f79d11f699df5b7d2778a6bb47e90524a09a166a366a56c29438c190ee30fc29822d70232e3987f5d17c8d2621988c51cb9ae6d966559160c7d8a6d34bb4cd5b6d7d46ef3b9cff392d0c695a55f5bccc6b93fab3324104208e37549e8d33fb3e3d14926843efdd32bfad5753cee726042d995e09dc41dbbbb7b2719c1f5185f86d6463fdb74dc4c0b1d2269187f6c832b87f1b796ff0e4e6331acf5c6c4e0ba7b51af3a89904308258410c29822177617c80f869a18e9cb5aef4da5fe394e76a55ca6ff964428524a1a43cc092efcb7e459155888b9bb7b8c1f610c2ee65fa45e208ec3c8a7d8534c8962d10c8f590d3867248a453d433fda1cff4569554bb838e6cb2cff27b3e417a404916c1b83990c324f2ae5df548ce1b912c32b1b969442e594504a291fc32dc51fae9ca67d1c46beb470c739eede9252ebbda9d43fc7c54471a5ecfac90462c671c3110a74217e949b04fc82a31e5aff685293af4d4d833edaf78fa669fd73699a865d18d6121305edfe085f5d0eec75565db3f5b3ac7ed7ab9374924e9235f5195d2529a52c6d383490a1a4b054a2d3bafec24aafb9582a5dafa371d87ff55f09d75a1fbbbe54fa199d616fbf96b08a5d4eba5a564bd8db26f5ed516b9d35767dedcbaab8730a050c5a6b2589426b1f4249812cec55af3a4927b124927dd26b6e86db8e5a6badfd11852412b4a411ee7a15b31c8de64bd28fde54baacbf774a9266df7eb418d711b619663b4927e924975641091fb985fc824c30944d2094e18ffc829258457f97fe87cab22c93a80d8706ae2c938f42e1fa7066ff2d31555cd67711fbecad1d3d45a150a8ec5f8617857a4ab31f8d322c01cfa89fd177eb3490718c68d050afa3f3e8719759276882254882178e5eab270e8e7016e56bd96d0eb3f0a4748b50a00b13636f55a3701a79ecb0d652fbf07b6bed7b4b1fa511c8da7fff6cafa8b576be530b657a7afaace60c77da8976f6a6ed394c963d2a1bbd46b3bf4fef25fd89744758b34ca50beb88d93a6191c7ed0a83247c5656de7dae24c1d323a587281320bfa01e24f1299d4ea7d3e98fc6f72fd359573609787e32b3c123d7187fe5bd958f44f1c95bf919bee21f5756b60ee695a75b245af918a3440978863fa3bbf7f4299d2b4f6955f9b96283630577104553993ea7145bf9eb5bacfccbcabbacacacace04e05e7a8c9285ae9a5a9cff4ed452d1ca19c3095b68c78475f87bbe38ec70e7fe89be709698545feb00e776fbf9eaa9c4a579379d95a36962db5b23d87a96dc2dd4d654ff537979d6b99ecaf93b9708e9a1ab73c4289502294154da2c7081253a26720c37f9205905f101240190924b900f905217193e173f81c3e87cf75401c12d891ebbffc36295f17b38eee20d6d1936233ab51ffd5af0f7beb6f3f2f3da5b83efdd18f700795e4d17dd3f61ae68e70c5cf7e89b4cd0ceb88993a86736099da8e078e8b7696cbf7c738e0d3874f5f743c814ef44b258a24559b5248bf52fabdc2b21af4aaf2e18675ad907e6d26d78663f41ac8b4d47df55fdac35aba4a3d6ad3357a53af28c5a38a43fbd1d311d6a8f6156297d1d7dad7551fc3329bd3438c03d280d5ef245f6977394e27782fae5d3b49cdb2a2d1a8767733c171656f2da5f32bfd0ad419c611331a68fd99d1efc65daff2cc688671c0bfbebfcb819952325c0f2f6d74fd40172846f17c13ea7d53f9b8ad7c69cbeecf6892ddb04e07841a253d09bbd4873f699603cbd76bd9af6c238ada62c38ce86bdd4934dc49b22c5b6149e001a65fd64f2ca479a8044e36663174884600008006f315000030100a878362b15896258218cd0714000e80904a68569b8a845190c3308c19450c218810001000001119998d0010e4531f9d54d8dfcbc75ea462b32d8bf552c5fe567eec252ec3b3073a6ac75ffc108815c2810b16033f20f1403f9088207c1b0e9fb0e0ca8a400e454a398fe704f0d6555863afd90504de8a73de63d8fea522def137971f084cb75ffc4b7c5fbc6fc5ba044a605dfbfbf5dc683120b4a13dc408e830031173854eb496781502932a806dce875bede7e7fb2277fd6730fafd6d5dbec44a4117527494858347ab8896c49db0f1ed7e5727627136a9d193b7fb19fc890fff98f69be8951d390e8ba9a9c27c59fb99835812cda23fcfb7a0873335a10692046c104abeb915e7ff51eaa0d0ca06c05047eb039dd455f33b94e7af25b0a31bb0adcea18464a23d8b50c25077431a050c6ffdb0da40dd48646fb943a755a79350c0a17371a41deb20232b67a889ab3c7561fe0c738a4a311747e5988e9f35932b8b38cf19a9ec26c36237962e57e97e874970dcf7a1b559ec0e0190b80e275c5c2ba1d86c4c410f7a8f3e5a3ea28234929349f6953a0931bf76575d986e01ec19f05f18f1ce744f6845d2bda6a5e01a42385befa8133ddf50417f0ebd326d5accd624010f6d163954a55b92a36f5fa3b79ca4c82b846e581923bca600e34a4201ae04d53061c1ec0826efbb4ab85886b3130daf0ec7440b32b9aeac786cc995aed41867a4ed7dba62f98952fd6eaaaa82204050fcb6033491decec0bd6337491f115c264e24db444f9ea848769bdb27af6cdcb651228c07910c7d22efa928278f01ccb1fe6f1042e6e7973d6e70b288100b5201de6b02f381910bc87a59ae3a0fad1d128fda578cf1f7b0b3679c1115b6ab57ea0ea690742c6992bbde40b1e5ad0102607a646dc803930d5cd1cfa758c7e781a3fb785497f140908fe570e5d15a40e90b1bdfb693e5d5d5911df94c9fc2a3c7b7c39a2b1de8fd25046b49f5e60ccc5816d5b09790378dd0a09a35413cc43c70c7efdbba383a0f684762e1a6d34951661371d3e04243f2239560e054756427563d24ac3da8cb02dc1bfbb9246e8d795fb5a3633e9bc4cd916dc43c7bd669645f1bbd5d4a4c0b116ed8c0f9bb33d923aaa0c213732e53bf711b067bd708b4f5fcbc1a0005399b21debb28a9a9e6ff046c6f3797fba405613baca80f742efed6202625a1bbef313aab4997fe40b5795f348296d7c6eff96eaf46cd867212b8a88d2c3545e49625aa86b8528e2fa30bef897fe5c3933910ebcef0fa4cf72cbce31c70776e6e0dd75d6470c514456112173e061dd0f1a70759ae087d17c65277daf1346d7b521389c6d6b6f8b9cbf341e97f7ea23d31afe3e4ea00080fc7b7aa8008ffcb88129de5b3c23bfd0b2d1845d2f808f8807d78c106f395f7ca1488949b3f6b07b3082cfa4919cb890f0c1041234c466e2e780635a1c3bf2b2911de9209b682c056a0444c26a05ab8cc24e3dc4603d4aa09bb3202ea99c6940b966672b98f203c67c0fe5c1538fca8bfc778d89e3ce0344fd00d828ca5fcc5f36853b5882ae11b1bdf4a858e50f664dd328e937519c43fdff1d931523f7061465a70902923eb67ffe39cedf2a397b1344ffa6d5e3e115843bb0bd70be25fda681a0fe624f5139c0d3838643a4a64ae03f60c11d5c87b588bee6f33c7a4f10e8ef03a0a9b3693019248c54e1845d8093bf9c14e1096139dee8541f43af96bed2ea69f5c2733c6bbb05f7f2c0ea875f2db54326e111bb8ccd6bac2badc6e212a2cb75f015188da909ba5f35b8217e3a8a968e8fd09d9641d4a5f24fe3cd458f88b8583fcbf46ea8f179b80dd6527ef47c2b3f22c409e6a89d9ed86d6a7e216846d2c4e92cde850db2bf9528006ae460b0eea62a0136f519a0778b7fb3db1005e84e9fa5917a3deb424abba9b63a49142268724609099e2a4b8ce60c5dd2f25fe4c060c9582ffb11963cd66a86c861201332f8cc057f35fb86f8e2c4696c8f5f58e2dcc0ea3a1b1a943c395a4d10888ea7cb37fd508a5b17ad90c27995092c13355e659bae10e5fb752ec8405fa52d01f2299250374182d61e8a83ada316550f6ad4510edc02fa031e3249c3335ec7e2983a909670fbc5b781b42b8ba4bc0190817d78cdb572dff0626a50f44b743c060f720353aae5f06939ad70dcba3dfbfcb51a5a9e67aeae760c15d92be98f5cff59065fbcc6920c5838a6c989b082f483627b46fadceae93358635d732562c2c0deef550e82dd0bf06d2ab43ba7717280489c96388c83a6770a7e6bdc0eb1e5f32a574a302dc6aaa231ad41b403c6eebf02e7c23e020ac5b1a96efe7cf540b3aa343637fd1fa3ab88eda27081544ddf81751deeffdc1094c46aadc0f84e0aace9d8c694f04c3791040743cc82fbd16e0145a6c8622356f10428269ebdafef51a88689cf79ce4a5ca33d272e0c02c4ee612719c87cc628309045964de9563a2e8e0711288187c3b415c02da89440f41b1e99cedf4763f5b579b70b8dbc3b2780a7cb73fe6dee00c81e02164cc26f03a4c77cb5dad31ae1451cb18691e5c0607c95c44e07fda324ff94218390f732e49f4aa3e8e9b79774247f28b883fd4eedc993cdda541c0b9a25118943a704509609587494967d6d7f730fb534ee27bacd909be9920c734a8a05f0a92b778d53be653aa59e11f404d2a50b3ad70e6418edc80ae6844788c681984f410836f91782cdeeaf9f0f7456d65446c1ddb38ef8a600af34971a86b559e0f2120e651bab9fe0d473588a45c4b7d3eea3057a7f2d830580134423ce72c664f42468904900061625575cb324a1c7cf54e6b92202761230d6dd0114cecd98865cacc39484f9f665a29c732b0bf682dd50d79b9fab5c9205a99411147fbe52fca871edbdf4b7509147f328fb4678d3c1f00252293874b450bf8b5c7fac52f50980b8eb48c5786e3e15daf28d97ee909455c6c95ae5fe7f97ede3bc9d57613cf29482790757544c2a7827c2178f9689f3edc375882c950dbd0adf74b512517a2e3bc3c2deedb29c46961ea4485df8aa0b68292e26d80643e1912f30ebdc12cc17846409fb6bedfdf02de422993b27d3dd2f372073f01c7e7346a743d6877bcde64adf2f22348322c712a790bc922bb004d0e5b410d8cbaaea9fd7449552671a44b2a564a07df2213f04e79a403304f2fb3c1e4751b804231dbe52d5d059af8f84a719969d64322afdcec5abf1f6e2eb398d1ac810862a156108b7ce0ded4a81607910d7b34a6f78fb3b8473804fa4596bb01a682945c008df101a321a4dbc4bde00dae9b32de5dee0550dd73017d5234b4508259de16b7d3290ff84952902a885c09d97b88ab25c07e576c784d795c0a687df8da3b54ec0bdc18d1da1acd70f8f601bfa50262337cd4ec82597dd1e89def44f1401120b969d3b4dbf8d7c9060d12d8b51ca23726e26b638d2aabe6b2cf0b6295670ad81b0796e0e58c580b73b68ea4738e52bf00ac06e18f70112a9d13ed2c97f48505350be6e9051b6c967740bd0d41189a986197743b2bd42f612f9faa4753a5be3ff54fbca75b1c8a326631d0d6ea694668757abc8f39a098c0c8acdfb94fcc732f80af56efa873144dd77f5722188209dcf3848e5b42f6af2ceecbc5fbc4c1c778c02c577934ad35ca7892d453697085e2848ad91d8f10161d8b377485500816feda58f8eacc47a608ce1654e997dcc8bf1c95f696de6cc5d8178af6c0b0f2b79a5224c990551950e2c4806f3124948e4d399808f1b3dfeacc8678de3c1274847fd1d13059083546ca82076c2aa024e0015d8b5b3d92321d8f244c5aa3bf11ad6400a5fdd5c417726ed47b35470d2b3d394cd5005be67f3b3ff0860af09b44c0063ad193b238feb80c27bde9eefdacfe996b098f5a31f3a5d230b4ece2f092fccc76a57a5a8e1d0cdd5d15e19de524a1cfdafd88f3d7469da693cbd8850a6743e2596b75294d7badcbbccd9059e13ed104ab2ee592cf719f1503fdb86f6b0f7f0322de5fa3cee6d75bf0f6800e61e5ca53f3c9d2f574d3a8c2adac74d611e83581c8cd7a92391c9f00e09c7ccc723d51463ba5d70ad841b71e1df3e260a94a4738d045223b743e19a9d2f59fe403c50d776798b30b81a580f155c59afa3e73826d9d3eeb47572d3366e2f268fca6ccbe051a9709303ab666b7dd911b089c3060533e582c143a51e001cc790cc511b85e44c0df5214419cf7a59b726b6f9a143fb3fa360317565a1f9fdbdf66bd676f9ae76939742d8bca438e08dc612e118b47b3697c66ef0d07c54db57a8df1b297db73e3182b524aa32ff7986040b20729e27cb84d2ca176cbeebb4f3ef6e082c9634e481cab23f676ae92734612497419bc3c78de6e86178aac4b5d265ee59c4c1d5b58c76a75a76ad914d6b02a9ea387dceba1fd791eb38d1b7562e91f776f5d7e20dd790f0f093c60aa815ff6f4bf82081f05f70a74b8257ea0c8dd449e91ac4ba25d782d51d13b10ef1f056a9da885ed07af32eb3b14796d01be87ae1a7911ab82ccafcee574b167c6e21e7cd86e8b278905b513d9474535869fa6577fa45cc54fd20103da2aee5ed060c63498fd393f96c1e1cb1ace11a153b6557ef9a7923355bdf46e31b11d5226487031a576e5044efa57ba4786dc05ff1c8fa0a4cadbb731c35f5b136eb334486cceaee44d32c49d3d300044dddf059e1f93a2ea656be1a63fb62dc2d84796e46fdac8e63f15d721477085ef941b0e878c6246ee9723d5105f0427f51d5a82c5fe66b05e51dd6984db3c8948fbabbf0f2229806129fc44612005b052c28b194c93f6376291c0c20e2c133ee5df9604872b02d0f6d943d498b26c4485698dce4df73d3179e379ddd9e3246f2bd8bf12a97903097ca6c5532e60f50b2723f7f592dac6669620484045aad0e790a02eef07e97ba8f43f24983cfb8e17ca0bfa70701e612ac0d1425db9a2d474f724d0fa41cb05e5a4a1a72e51116d1298aeb9afa004b3f4080660890345c3f34d80509b286c0b436a0458b79ca67ea65c8076a8e4639b442b84c21f9e893e3ec85c65d348a3e596e81d32274f4e9adc878612c0050c1e46ff60dd8d798314b7c213db78809c61f724fed15961af80091eee63ae0038aaf8458ea4e7a9d4f5f23e2be173c48643ac04d470d920acdea14fb69327482820f566c42b8dc72ae99086ed36051bbbb0460195e7e640be2935cbecc6dd4b66438f078e2a034a6678c707751752ed6917092feeb7523e5a55c5a672c5fc8f65ce27c641421fcbb346245984b94e12b960aa6974bcc18c0c93770c06a70ed4afb42376c706ce1697feabbb920451b6712e37e594a51afdf1f396481a4289d0b03ce05e3a74f851856a180cb0477f5330163b9dc0d7816202eccf1acc9dfee8554def4760cadf396ee48a2633fe5f310d10e55e1893f1c13ff7ec5f39045b279ab038ad34732fde06527dde1dc3aa78fb4424ebb2660f7aa5b8947d3b41d0eef32256c7b07df0f62b0bc15838a42a6c8d5e272d0abc9f25241b0901c8f474188f4b6edd0a2a43529d8e7ef62d1a63dcc56d3820888602cafb25e2938529d6605e1cc22a1166e1cb5c47585d99d8a9440c8a928e8353f157bd550f0d1e3c0d48d0a03e532d04d22c51111172168e526a4bf9466dcfbd7cf42784c5c60629bab8a574b1ecc6e3bd491a868d316a208ad99f3412521286f3454ec723b5ace5ae0dd39fe0fa7943a28b4afb8bb1956c827053e8d3f2ae0aac283c531103e3a226bae83484dd64cde89c0e099bc80680f070860033b5a72513b78d0067a2a446eb542270055787ca4280d6049074379559ce2622b87b8be6c110ac40f08792da4644958848fc78e99661b8810f56a4d9fd82e753304755ced8957a3aaa526f9e88b434a00bf7f58a93b0f72b11bd3c9d05fe0a3864452911af2d5d704cbe85c08288011bbda1ce6a06a1da47970fe44a2e9a98c1e214cf9507d77d050b86d069f1fc6ff9edef5951ec1695ce4871c5135f84dfa86ed6595f902aa54d9c3d1bc28efdfab128e638ddac0cbf7be6bd9ddc8c88047f0281acdd9ec8a3dc9ac61bddf07cd9a901c01ec2062a351ad7321a6f92e656b8c40853216c33b6ce0578c61ef5f57924270d36356c970a28b5acb6377388dbb7b610d968a5f8b6f8c343604f2a4f6b397784fcd440384e48377a26f4013f5061ee274f8015fe7ca084af43d63a65ce90a01d07fbbaf7dcf123d8c2e9387d9cab625ba9453840cd213f70263fd974f435e930aa40f3c2c785a3068eecd796eecde861474389f57482ded5b416220e834e99840a68b142a0b322ae83e012de81ba7b859daf5b3f7cfeb4c186c33523466c4a3228933fadf06c7aa6c4077caf68fb5745e5c558cd7d9d115e5569f186c9a2dbc87f7a9af6aeb82e0b4fa509e7e71be3eff2b89525f1375878e3ac07f1e2eabcf7cc6dc6bd9071be4cdbefb8a1a7888295b1feaec7dd458224ab23cc2119010db646655b2a0ecd881e66c22ec34beb95602cab35ea4420d62d9a7cba0d56e9a3d2388ece7560c3e86212040f6804b17509c5124970c1d65d6b7140d4fe635949df93f669d96b2d4d2b20c7a0277cbec0c975a56ea351568e8aafd2046883a9f82cdf5d08b7b879fd8a5fb01ca8fd327037129ce60caeedc15d87a00da4844f92961501ff360ce6d6e2eb092ee6897967b2e7abe27bbea8347ca3a759168c5abf74b842ca0f5d61f2dd5145dac32157d88a007573c96f2c9181cc27b5ecc04af093fa0f1cda1107b91acc96163042a05250fd06c60cf690c1237c0531a111fb9b07952e14fb882321642d3e953da770de5486de56a828403792330091f49c27ea6228cafe9d9e8315a90d181b18c598de5805568fdf11b8a0a0890c53e5e99b652071640e32998460b41397284290ff13b84e403fff007cea5a1c68e302512399eb3d774d883a4c5ae6ef1d41e1541414b91b2bbc2129e2a832eeda99de27d4b2f203407ac17b77401752081b3d6c2a3714208df1d2c73b104d1edc65604c3b7bb3b7cb810636de0e6bfce84455aa4127809e49d3c991abe4add93e644ad8802b084736c253dfdb28435dd51013a983e222fe8f01128ca4f6459d47f962568c7d784c4d4ee510683ce23c11aa50500cbb187e332cd7b2963174e6eef19b8c1ffff5b4a175b418cb8d4ddf5d61151d5fc691855dec6dd8333806072e8628949fb2afd627692cca7399cb215897583d220eb587157116236ceab30e0275b53ef41c0e5778e7c35a8c34613d784972e180c51d8b72933a9b1afaf23950b934376066bb7c96d33c03a93e8a5ce99439f83dc1d23007d99618e4ad20bc946e5f4f21c28f4f1ef04372c4c25bc5bb1eaaa945fe3fdb9ccf51f7bd85356752dbf400d5d45aa855806aea9985fbd18aec42861666cd5653db817b762f954e53d754567a3d1ba8add5bffaa181678fdc851a8d3d4e141e963ccf65b6c7962c1c4f0c81cc1166fb15f6cba2b997c283292c4d8d7ed2ed778ab74237a4ce5030ad9d9c709b05d4ecdab2d6b14b349bf17df4c40d90deaa5fd71a2ae51584da69c121fa45a2296fb9dbfc999a7af553779582cb3008f9da307c024e859a01fc136ade7b1222b513d38d9a00ea67ea22a61cc279f38daf158c5137debcef394a6f687f129f02712571eb538d0e93baacfb86fb5d7ae7fca36e74ed9348f26351aca41c7f01639668abf683c729fda1767fa8abe8b9a55f3d78c33a23624b8b33f70b99b6b60e2dfda906b91175c3dc4206c9994789ba416aa6faa1f40d0778dffa81d310a2693f5da2b16ef510d59f7194e016a73914f651129910a1c3407d66682e3a122f3c064ece11380f25db24bca070e43a467789c2ab9e72f9845b95de609c9a1ea1e0138e8c6d3053006d3fe2cf161c6fe51cc1f89d7c2798a5e55c75ae4461e04022738361b0615f37ce367567bef375be7109cc48eb125c3fc836f5ace2937601d831ed0f035efaf7dfc08901ba93516a6313a94118d962bb8ca01618712b088652debb403e4a9106abcc30e64ef15b88f529460b32c85de1ce2163c7c2a8d54061e6526f25de27879d280388213604dd0ad6d7b661f8bed44f5920d0aff30e03ed254c1127a0ecd6839c0ff84d428fc52876f63a7df9c61161ae50a76ed1654e41f0c063371fbfcdb779c3efb00b017260e969853a0cb93bbc962cdb00f67d16e678a48ef371072f0e22cf8d720aee444c1130808c9dd4dee77896ff28f953eeff795a15b0cd0cccd004fd74f86d02965dbf2e105a62c94b2761e3ba9dcb594e3711f45a1de0330dd94f7ecab8132eeab93fefadec496823892dc23d02f53746eecb787586e7072ee07c302676526248ca5bdb0ce085a36684e25d41f2837415008fb420419759c9f8527515dbd44f0d0ad4eda486d4614f4f0cef75a8c6506a7f66cf0036e9c1b92a682641dc081cd3172b8ac0af0bd127c0f49733ed6e1c94eddcd39ffb7e4b2efee8e3c4db0be859a3e9f1d3382ed6cced7fe71e9969a5baf5fcca1869e00eeb4aae826e449a3b68b90aab10bc5b5afc6d571caea859fe98e3a5399f12f3140388c45b5f897aae833661fde16ffd6620c6747055cbd08e9509288dca828581b22e286e578cb3d1f4a1c39569b9181eaff169d484d600552e1fb706862e7a95ce67da5933a1aea6176a6fa85cabf5dc694faed4b74c28ea26d0422917fadbed9738cb6acc998ec6e116cce8ffabbe4ca1f9c9eada6fae6026d4d8d69b3ac251849af3f9ee0b01dcda666655ec07649ad931053cf3b3c08a4172efecb475bfbcd548e0c18f9958f1fcd7552bc731cdc97c3b4766a9686faec0da3658e4cdbb64758357650a2c69a07cd09ce957d2e61ece5f16663a73264654da9e8d957a8b2c6682d8673d95cebdb9b0e2b916d24f08f832456e0e72a4eaa68846af9c03e79557082778d7af5a28eba67cff1d84dc8388417e218212b5abf1edaae839d126672c4d48c951ee0126f63762fc2cea3a76969303b1fb813b2162adc901f41b99173a0f94edfe85aa1237ff0ebd0956d5a8f937b065e1ca9d7692debe566477c3e31743fe9c1664f8940dc414d3c63987016d5b340999ce703d78ed0ee40cff0e98d3b603fc1e0ae00326364a762faffb949d3aab476c04c2100374947b57d05834cf827166cb832169f86bd86cd146d81804b68d93def0de21f9b7d1beadacc2e80c7a37d8df0866355f640406f55d6249a3af5a68601e677d3673c5d2395910db4130aa8046850513cb3dfb282cb5ee1f39495841fa804cf10ad3d16403ec72d121dd1040b436d3f9d9e689a757f1b1a2bc5c510792cec79ae5d2d988ff1750cd024e0d58ef9b80c98928fa642175a78a06f0cbf64373a7ba8c449d819017a491182c873ce4ff00ecbfe92f5858daaf525b889b73e3c38dd03f1f0294732a75acbfed0c5802adb1dabc73fe104e7cdc548a4965ff731e1b0f938d307f5bcccc5d3bc8224c03da1a9b17fe3742ed855dff069bef40e6d4e669cf10ec7ad8f9c18213bb9524a8f33b7fcea80231eed73da8a8aefcf4c8f5aeaee4020885e4207d8b52f54e85714a0af4bee7c3694d48705f170c45efa94eb472b274587a9687f55b355cb89983972ec3e15233fb7bfb9dc96208662d466e60f43652cdad92c894b9f08ecc8b79d257a2243bde7c162c031027c474f02458a96d59cd137449887ea83f903baa97813fa666b04d78bc8a0ea3230cebb3a758b55aefab336ffd25a3acfd4bfd211f22277cfca185f6d130d37756e0298feaa13a28818121cd1e18f02295dbabf7fbcbad4a184e646c8cf223e781d846900e3bc0a933be0ba48d414fe9a899586e1dc161f0111c9054720e75187c568a8f82a3010903be7945259e5d0c3c88ec0706973d659bf7627754b1259ed14fb0ae3f2977785af9c8424b8c21b1a3781ace054b8a8e6139fbd21adcf603df2343d7ea71e8aacce099e5b8cb87832cfa52c7aa91e1a62e14be1249e9db2a11870c77742c29b43359b7e5080e9f553fa12fbf3ff47d0617ca19b1fbf926666d927e929fe00870d3520a543399794125e5ff5e5157b46a66df64115bbac75b7d122bc6dd961c7bcc8af538fdab1f4bcc8a774eac8e0bd0143530c508eea3ec6776eeaa211cc1213d527333d6ef4aa18345f797a03190f996808ccd93ed675735b3af4cdb1e968280e7a0c7d3ee31b59793889a0ff7065153073dbb96ccfdbac0c45229f73042384a8dca89c8fc67b403b9575d654d31cc1c2659b8aff5523913c578f8a51fb3286b49da8abf4c19e8409334deecb3e3cef9ce8f6f464bafd8cd64f4dd7cca2b497c3c3b5ff15364901c741e967507f6625e37161b4edea8a6ca788417a1e5639fc4e5d621b9f3c6fac153d49f56714734f2b7a749179f36ffad175ddfb030883211cb4a561badcc1bad0ec1667016a87d1e6bcd4c54fbcfc06333d9d43923f22bf1a9a68d66adf334a3dad1c5b6ed595c11ea85a1c30582871063b6194f8f94cd1b6dbdc7a8da84666b016df5267ddcee46e30e09176ed698225458e75121336b97c8e9039850025ce8f502335da1e78ec32ce964effa14202a1b5bc7a233a046240df0d232dca74daa05fbbd93a1afa648e9f412c7ef079c076428c54b186db6f4d13e4b126db51cd1f24b05ad5466d1b270b2d64f4ac8a92b9b934c293a92d29548bef39a042f17488b62eacba0956598bf07153f96579adff182a58390c5ba3a21868f835e9074cb9a2f8ee9d101b2d96472eb7c72f8591e8bf8a2df0a19c5cd91e7cda3517450c5cdb1ea8a4aa4131f2d6e8e0b8b4757cca128815c5f5a5f512ae0595850031efb08ebf5fcc1282512bf6899dd512a45975a0b0277278526ce4ff1115992b3b28c635da9d24248bccf2736c582601b67f6b3cdcff739b41fd3806e2ddf70bb9ade967c311c770df93362018029850056517a901ec4298061b8fce2963d608bff6fe8dad8ecc4d175e620b5870d49cf722ae1ee77194d32f2b9eb3b363d961fec5d2674f33780fdfd713dccb8485c569499af4edede2b7c4607f17bebcaf4d1c7d5659ddd17a1a85696a34e38f5c37409b0247770fd524e8cbec4e7f9de0795015c13d823b2546e508056fc544528bef500b899370dd4db0e20dfd71f42006a2a790ba829068510a2bcb72a979bc3bf23b7bb29897dd097119f007f7f8cbf24c08a7d7f9c3b6724e243c5db6d7c456e8996311371d5b0ef7524a4944bbb256ca252ccbc48672c33be3acabd10d83d29c2175e6c832dc2be6bcd0e36385b5fbef94d8bcd04150189772873d929c7c1fbf5c7893a356e29f2e7fd35bcefa26bc3a2eb7d1c3a8175f7a1e875dfb20553458af22bfc609ce23a8752217d8267e0eef4f8ad3111360e569d07dd16a0adfa9e535cd0f76aa85904b97d0478fd64484a0d9ef34ba3a710c5e6f1824b8c4472130596360a1224e674fe7f3bb8fc405e0fa5fe8420fc3b28bca341fef0056ad2b1b66ab9aeb63ef175aa9fc522371abd62826e0615ef119b9c4f0898f16e41cdfc61fbd651eff1a05bb4ea694b325849e339e319c2386e815600f5a318b0ddde0fa4adc5847368a26528056939c2795f20acde2f6bb0a60d47701d8692865e389673d8cb098d839e4c78576e2e684acdf6c137820878de9ae33deb049d61020c965276185916fd036e6834c8600305b27fc718d94e5918ccb6dcabb41404849476107b5f5a14c73f3c2618b25742634ae03e8e82edea20de3339210ee835bffda3d39987878686b6fe51d4bca92ea10a50c7def885fb4f8d6ef444288add61d8c65373fb8d3bfa317f1b8d41e2d95e0116188c2e3b29b46788c9fe4fa74d841c8d45cfab0134bb6960e2bb959d31a6d4730428d9cfa4bd22c4511e09f06b839a0286803d5ef126c3751743ec740156d080a87fdb4bfc4ea878a8063226bc2c1cb41fef242fd073cf5692915de66e5fddf6f424e13eadc0ddfc6bf515e38251cf03adb4fa29b9261b8e06ae88054e0f4772781c6534079a80f3328375036740210178a6b1174f6c54c2a1d73b2f39cced27e2a42e5bd329306b5c7540397456e32748c4e826b36e94a739378c2bfda58293cf58b488582f2aacfde90d2e5ea2e6e821ebf08df82087d3d355fc7903435e90f7ad37c5b7bc17dc477a1530f1116143cd7080c9566563118b83263af1f3be03bdb825c5911ff625750a737095ef9a6e35bb846fb04787b838dfb30e3b8f26629f5aba603180aca50216437aad36c9c3597bd104023a7e07ac1db937528b11d0661b72b7e12dac037ccfa195fb3dbde1f30cb4f5df0035182908864972d2095b37ccd8b00b70221314603098403236a70ddc41ed8cdbbd68b9865928d4f1ccfa775f87ba83914263a2729815d6075bd4967f28a74c538d2900cf939bf3190819143645670f22a73f8c3578aa9d5c23724cf6c1e17ac5ea1c8b21a89981211958f22e31744462a41603bb9bbce9ec030dc01763a5cf4682c67237c3b3bdc832ed401b1cbddc45d36d8bf8eaa9abc5c84dd116e6e8e0d6123f7c1344faa5ee297b2c1277f72e985050b96eeac93c5e0fb97968209b9aac1e2f40118e14da070c3cb8e52a9b401aba6559ec1ebee62459c48fb212a53a9271dbccd071602e6ed39b4ef74181f67fdb0ce9a2697a72c65ab5e9febe7fd65f0bae0cd50af05085a179c13402dda858f07d3d828708bfc124e68712ba2ff0463b8553a50c15eaa16637752e71a0b30e0b64f3a66d0708bc9e62bcba77bbe3d9f57dfebaa309d05275572b1d68c53bcef5b4ed0559bd6d86ca576f17a85906559232a516884d6943684f0948a5c499767881daf03361dfea310be48616244505c51498678a0d2b8468773560576c1a9e49328a3492c2ccec05cbb166fe6569cf139503ff0609eb006b8ac04233b1d2a8e7f6438a64c134032f691975f2e3b76e37d90eb4f81d61f984f05f5ad0d99deb80028c1267b683277aa5095427b1fd5f8d2d9d219bbb1898f421d79e659d0aaf7e752b921319934099d0575b35cdf8736d45e2002378f714f1e0f1f9a89af372829b0446811d701bbe66e37acc29def7512dec087439a0ea92ba1951959769375bd2857c4763b3a808151a354d92677f649162e914657c2929e5d6f839479b6e596473ed4ea2fbf0f534c7258034c29156e5c6f469f96d049335578f530873cadefa647754963476a8f68b18a53f8acd8418360006d0e9d4748462470bd0eace520be3a7e845908324b417b80ff6ac35bc9fa2fd032d7f3ad7fa2c8830258c53b91e3711089023710deb86222695283c5ea83b7661e50e4a8b272083b29f69cdde474d762d58e90c4d6d0128ac6800169516613fb64dda36e3437ba6158e4d0a321e431882ad6387847a2ed109098e5303f09f03e1667ec7e3531f2c70d9ffd918bd35e0066d270dead4e773a6c4b4cbbfc45116e2c474b5dfd3a5cdc716c0f466b798f100448358980fbd57171858bc4202734607eafc0dce3f553b17fb6e5c392c209705b19b08b34a608df75ebf03822905f024daae54422357d0c392e00a1442ff6645033148fd8bbc75585db439512241d7f645901942113d7830f50a5e967307930093819c1cde2313b9626a3fe6e0d2545cd7bf16b897a04960ffc0987c144b701a914a71f4b25045b112ac16e59364e3918cf17cdd0b1234822702b208000077811e580b0e527dfad65313072155e508f6abb4698c6565e3ec46ba440dfbc14b0ee8c0a60c2fc4accf50de530cb4b86b5d8b5a5b6421c94a180dae3fcf750c1a520f5d4773bcbd95d2f68ee1afa330565b1a8e206c509828d517afaefbb16267d8e8188f3841e2947fdccfe5e507423102a1fbffefbfc6c28a532652efa012e2570d2ee987f8e9e1ab8878853ea9281e9f98057782acc62e086febafe6b4c99e90b61246a8cebdf438f1c2d6065f633a7047bc938f76b07b1a090c2e68007942cf9dd35f096f9fb0af84e6e25e230d8a0dd8245ae8b8305605c556d755e1a362fd1efac118933001ca372294fd3933663c6eaa426e6a34c161ea15fd21b6836ed9166544b489e70ad989b94d58045392d917a59bca6eaa03c6171008e19e5b910d6271f56436ecafb35816ce02be423c0e00b018dc9114f14161c93098ee2e50d8dc7f60469e18b686a157104f1efc95528d7abb8158dc4fe6c22b505abeea0e0b172d1c7fc7eec790c15c619b60bbf9f649e6c9f312b92961103aa7b131574daa1556c8053750dcaaa5cdcef013364872cbf81230238de17024edb949899bc7a2d73d6257e0deb5fa78cfb2a707a07b6d80b283303a69ae66cf6649639658dc20e7701e68a0f872a140240678d2b5570c135ee4886361636f13b20070ebc36465d9d7cbcad2d3a02398352368bc0f6a4ca1a60e9b696448f51a7f11ba01008643d159c740aa9f70efd0e217e8bc0244ff97ff4dd95ad6bbe3d5c17b7c29bde2f07b7c148d8e09b7b6ebb5486cb3df4b2e8a599afb4cde896fb0006f3bd6dca03a5832c17421d62a2f85c6c4717b26a0d2770c4a8faa801dc39699f6ba819c02711d75219f3955a39a50f6389514332d4a83d046494247cc4b8fabd63e356b0a165d1b90e511adf9b6c1114d839787d6ec54bae0980ed6db9aec56ab44e14fef1b86ef2cfc9507ecfb96610bfd3628c26e26be9f9f27772399f3c7601646223e4a90225ec0a13dd4714a522871588697d010f221588963fbad525ad85a1179a0801813c6326059a04a358bd16fbd7786409347478f212d890c804459362f3bd2f91cd30e849c9028ce6fa1c3cffdde3a17644f02ffedac9b02e0ec2d1e17576b7a5385772954a0b54ff36facceb8230e3943bc8be6f68fa456b2a72719dad408778f99ddeb88ba2ad37f354196f2f2ca59a156126082a297d7d744539c464b12ee15fbbd2747c387d126c46bfab8ced6d7490275005c4eb16b01253efd23244b64f169f08f6c5b303d0b0c5df074fd425a3198fd44421eae16084b2ba9768467b080c4a6f5fe618871f8ba62c2757c945664de328f9fa7b40436e295ce74e16e90b19e307853590ba4e46e5d031f82a72fea015b2590720c98eb8252b3b9cda38c431c973de3db42a413cb9b8010ec1916baeeaaa1def12e5822adfd429efded7fb9e53080c8ee37915231191f0bc17e6dbfe0f4070b5666d156d76a607c1534980bdc5cb8c800a64e649190851af4c8614d77e49a061f33f81568d81dbc6636f1a14af0a3f63bd4ef03d696dc165f7125fb506b2bcdc01e5468f4d21586a00077cc5c19d1d92e670888d39d6d9a4991017bb0582bd16da641292ca46f8743673fa6957fe38bc80a67b3e2b7a3bddb60bfa856902577e37229b018003aecd24d76945950f79fcae8a0357e71e128be6c40cb29864f0207fc9667031a6566093cea79b47f9708dc84ee8a9eecfaefb7d7dd2ea7531f625a80c5db670cc590da0c44a822669253ed79bf34bbb36d81be595d0cfa1b40cc32fe0b23c926213be1ba625f99d8263a31d7d84e1c2b2635337987ff536efd0778087dd5f1487d59ac115aed28b98cd2c5f4365159c9d4e4e91dfd4fdcf4dffc5ff89588bc01906a7d941627961ee10fa7e9100445c6cd6ed69888762041e811d821f5e79a826579811ab6bd0e7b3f5f4f337888523023544502f5defe1a0405a1f6e8b2bab332c2df2c4f6cd4e6a6db649b7e89351b2786bdef165cce53ae6b7696c4dd1a9043c40e36c0f8ad2a784c5b429b560981fd26bc038e49f554898e995840a43c733a3577f1173d36b35b34a3d20c425b09ac9f45e56babe02fe7c873116fc25f1e2be3af58d743a2c99e31f3604d4b5bfecab501994cf4e989b9e0954b8b08db96b68629cd3650205bb27a75aac707ebec67e6e212f70802495852dc7209cdd9ed5df2bd1f00220d1c7a31c0ec58871314d69e469d1edd7a1fca70d113c7d4fc366d238f43af5a44e5718afee2eed4939d998b0b92a0a81b8202e01ad31a63c395ec181b1ebd0f3853da18b2b53fc47f8bebd2c916f51c0399e37ada3796d76f82867a5d69ad5cbd9e3365a66f252cf4abc2e91f3ff35eccd57583db0216acb68680ae824d4914d17cffa58b84e6ae03d44f454031b2b6b9089489368ee3a12fdfe249c80d0c2a5911eb8f0e6b793c02305e47b4332a0b503a3d7883c06104b04e32d4d75ef9adb922612548525cef0d1b802ef4750fcc1e809389e1cedf6e9bb1d89fa9837a6ef599770fc7e65cbe1f14bd0662024723e64e6b5c318d79f5f4f6ca5f81ba3a5e4607b2839e3468919857e60775c31eb8c60c21c75c060ae479248b5c9c766893c130d554e3e6d0b8594145d01faca913e0da5f95935168fc34b6b9251b9f93f05e9b359dfd43370363b10a3826aaf8ce34dad05394a34971b7993635425303bcf622d2be12b92ea90836a2d6ce90d1f55dd9e34ebf0ac80de044d0d1ff71c17a94c50fbd5523a67a5be8d9cb32d3504aafa35623a6bcd44a10a2530550d827e87763f54f887ce584fa9cc42e65300dbf9440a0f21662caa35bb1344406d598840fc84cc3788c152de5d5806b331b56fdbb5ea42b9591483cc5289b74ea09abc0e216d33d86efec56a0e8eeb6086aa4db9c9753fc6a270909bcfd3999f9fb597e8cf21e8cdcaaec7656a74c7bfe3c78669df360b70e4f43bdc9abc6bb360513dc80434e5b8e8958f9cdd0cd769cee3bebe5b7800b44fda766da2e700855cc26996ba696d8aa2e4d426f7e91fa1c1dce1d1f9a95449f1281140e0cfa838e440102e3bf05d12a7754389118ee0589e7d3fca4aa8e9397fdf4929e2fad811cf9357cd35a1f97bbd716f9a46cb023336cc580e825c717634bb2a133e8a7264fe564a995e0a1cae6e2366bf2ef6d518e3ed4d59b1668c9e74b77ebf87f49de463d38f782de8ca0ba953b0d34ffad60fe0e1a0422a10f5c8bfc4895806039fdd33fcfbf6b2b2127fa652364274ea7bac396c9c33911045f1f6cb406c3857f122e293a25f25be5bd392639823fd781b6111d1a1a1f4719beff45905121cfd693b5699d31c26b5c9297909b741fb870cebd527a3fe2781c5ca90c3ae5cbf999548d7f2950493430cf863849787bf9999c0e15b027d340ed4abbfede046d3564fa816eef9d354cdc00dc2c179e035ec5fbd04778d075f4be3420d0991cb279a26c2aa558811d357b07060f3701226a98a8afd9e4b5f893cbf5dc30629ef4501841b2ff65c7ad52ecf11a3987e7c6cbc008ef487bf4eada08dabceb1408418c12489abf25f3fce6028e938af7a39ff00d7d84bad2794be2de817ae7a6a475b3f9785da795a32ef40c5af8a21fb66516203fe4bf7e742ae33627c4f07fbdeddefa27061758d170e31ba9f92888bcaef73447229773b1a07791d0fd8fdbfc0f1852cdd8743bb72f31dd3860d303bfec51e50b3fdf31744d45c032ea7af4b182565dd6a086c489a352904f5ec738708c62a303c27bdb03380b2a103ff66ffb605ca20271e1becd0368910ae2647f9bf100d695a9423cad8478840663a0b11036f9c1f355577d67cc8173a36c7480d8b9cd833905d513273a6f7b8030b33ba1ed862186d6a21a6d6dffc9060843017d4658adb068b9f93f9feb15614b9a0b3ed318d200b27af9067e87a213254ba171028509b3c2ac77bd39d4524a98bdf20eeabc460507e51d64f34620e464bd54d8bc5e8bbd79cf1cdcc9ca7bdcc120e3e480490e2d476f4c72d7438f7948c3bfc8cf54f22c3df3c0793e618746511446bf3250edaabf0fa4b674be28b22987e37118a3b2010c6e785f70d79727e6eb70adb3db4b3911a2ef71318bfb3a091d132fb8c160f512f38a5da3ea6be4fc0be3604cc7fbe5f467d19d846676e90f1d468f8fac6147bd6b05f3b373e6301fc7d2a95f6474e2d814be588cba7791881932a1f68ad79e247aa9622081cfca61b182482fab01e89e9f05163fd0e303fba4f22a85ca6b10aff46574cebcab35ba8340af3eb974390bea6a0359c6a964455c46807050d31c49cb986d7ac9c4b60037cb63aa04401e3edc912b4066d87e00fcce81d9805738e8bfe69c0b2ba0918c6a034e78e1a0b266f93e136839e77f910bb6cf0ca549c6e5593f3052b6c93f9c2a815b2f1cbebe3d5dd91823ab7a700ea217e91eb4a8045c79b711ae27f3e3fa01817fc5d5a00cf3bc818100c8ca53a996a8fde87b2afd111385f15ed0db7d69e261067d3bb69250553e26954ea9435446209bedac15cc51de7c3a76ab0f57e5b26bae6077567e4850b16138db08d88cd32204aafc8aaa71c2d2053f5372e60b62de9308e22f0c5a29366474b6b8d6558219f32554c3148663273fdee37a3463d6b1c9b7e94de6e14c246efdf884346b0df19294f25be0adec8799c160f55434e193c74ddbf2b3a5b648bcfb301eda17abf51ce38dbf82ee4a91975bb66c4cc565f7841e65426d709a2509898eb20e80247132f9065d21ad85c0694f8968f4d735ce35de6ba3f227f47893f5d2179392488a3cdcf28b3f03b9a448ac55d69c5527d580ad70f9bde3710b702fb09ea65a2b926142c4eb4e4e255a03d5206accaf9aa9a1c50f0d55a66161d165e74bc3b4497c5946c3e835cf535b6ac4a0680cebde8ab6cb8ef4c8be9dc7c18768ca4ef8c4b19adf337f10647b25d330f653123d47251efebd650d74de39571b30a034cb11cd031904681eee0b18a04fbdd8acc960ea5e871acd39efae89791b24bcf33201223f6389e3e05f327a00fe2860b33c18b66c0df76072d50aa2b7260b08ef1f43555ac882fa7368d932b5655bcc7be84a3067029d124a2cda055da6450dea7e3f954961f1aec9f25c99e4182aacdd1861325b60403bfad341614f7354122f35336a708bdf3fe5fa6254140066088643b1f6f2fe1929b1d3da361decb7d25670d37625de332f85383e8db178e00d4359eb1063b0ee31a3d44357d0060b6362adfb59c56d4fa18a6dacb808eabc70c5804a76cdd3e3cd430c719089e8ebb48f34355fa35124a41070acc79fc1d2e7b4498c52c6270943adc6898ee5bd702bd6e5b4af86a9bee7593d61cadbaab68eb1131e4b32bc55db7f275823677b0fcc3c8c7bc0e7fe0c37ca0674193be025c202163a598a9c0bb2f54cf24628f35c5e142d60f412c8781d3addb38188c5c667bccb52340efa0269728192c41632cd9f04d05ed64a7620b281242b19e10ad6ced888fe5ca70934d50eb33b79ea402ad8726155a4ecd6ce52b1ee14a8893835cc6033eca162d592a13a1575356bda1cc29e18b44ee26485450c1f2744c46fec6b42d6f63fbf88467bc0e07ad860ceca7f2d2e8330f038f311aa66de74a9339f737219520148cf5df7f378b69d33c32070c57180de153968f79903ca06d18d56ce9903c25ec60aea5493054bab2663c1d3c3e7a2468bc2def22d15f5115a19ac84990fbe273798ff900fd14aa8c973d525e56feb8db97b5750c012044d6008aa53668a05b799e6dc171580176fa790eed9013819d9f5fb575604fb9fa8f34f9293eee1c1936ec841966d2383323dc127ae362bcb491ea012bfe4a6eb57e222d5450248507749b393745b931fe63822d8222cb51b7f0a731b76e7c9742506eaaef79c4093c553e2f98e1a733eca1487bd9fadc2ed1b6f1d62f7cd39a0e32f009060d601ed4aa0ed390e9743d73e488cb3e2bfb4dead141aa4e8700939c9a1ccf538437e11d7bd275642dd8091091ffd0ba1f2d1372ba2e4e657a34f2794ef108110570a400ef5fd3b6934c6dd98ea66a9587d66000a3ac863908c4b53732f79767c979a59ccf7fc63978adfed4297055d6645044df5bf33add720ad51c80f2822377ed7399f046bfd34229b2fed35ad27a0053f1404d7b05cc5abff9e5f5245ae3f2c740eae4caa5958aaa199c467ea866c974dc4d9b528cece8a478c0655dc3a9c0922d052aa3e84de3101afc077dbdbed0380e1b9959891aa646aab76add66049aaef5a5e372dad5726d5d24daa639c54a506b4ea8bb3063cc9f9f2b9077d6477cea2103003deb5cc2f476e5dcebd238725c8a199ea21f6bc9cf9bc911423c201414b6914f0d76a68bc1d29365a8158eac66c4973b504955691838daa3cf8a5aa671317a0d74bb394f6f813c14832f8055987ee4e887bc2cc261f934fe017ba317b41b647ad2b8c1efe5203bb80ad033eacbedefcb01448ff498bfce52728cd8460ffa1ea8bfb8e0daabaf1402b8365a9b8716b592983a6cdac3e3cb3f7212237b59f0d827be683dfcf70d429608bc706c91880c5ad8e23cbafef13b402fa26a648176d30abfa67732a7a6fdc59c1ae8d5e80dfa96ce5c94d5114d2447a6ac47101a7233ed69248e4c0acb6773c33ee80652727338bbbb74d7403cd09866ba07f26a8683a7c9653e34e55f27166a31a8a28fea66d4e93c55ac57fc26be07378351a3cb02c241a78055a7e223ce07e4ea437a19134e5e488ab190177d67e5b72b21061d390ca3991ca3f4a7c690cb7a77c23ba9d7c02ad9605a81e753e867976f61478ac332194416194f8ff99729167dcbafb0d2fc95895952fe06ae80fc1cc5366670dd8d6903bbc9831233bd52106905cfdfad282603f2f759c073448160f7c5fb0607e56be09ccb581bf274f930107aae484fa835e43d9042c62a2fbaf65f443770fe8c0d2599a67ba8215e97f8e093e594c0ccc11112483ef77578703e3b73ecb72ef4d917c0e39d311a915c6ec319138c27e11dae13cb42899de23bac4a264710742d4044624f1be794be0702ccbc0ff68d971e9f0a2e67665d8d0dff4e551433451f5be3485a7fea4b7f480015e724497d2a4f028d18a27fdc35e695b9d120e3d3d86b579f09903221d4525e7151ccc8d9ad478d39657710c5fcf0d9723e22a57048f9eb595bd5ff703f0ffe6cf8ceeb3be4fac823009cc5eb3bc65f7b798e1e73595f670b06d30ec8eed5ebb7f8a117add12334c91db0665afd9ee8de3e91b71d78a5c33ea6bdb06f8771667e37e564d987d5531cb33a29379e76b9411e9e024282606facd3bd985ec670d9c7e512489931af122ec0be1840ac588eb13319e95cc8cc43ebce838418a78e1760ba86be8d0d844d4846ff7b39d489aff2d9c85c5bed5e085ee704ddcb25f1705ca65c20a469f3c59c267fd86804520d078b4a31f7fb0a1bd398a09ad10a161836d56b569aebc202a8682f81bed5cde14e8f61e76cb8b9e5cf4654f23f75ee2f5679cd3f8dfe82f0654c691e29de41844170235c7ebc204e9a5a0d18afa8cb27b8baeaa8c550d1b5a97956c7b229d1d762e6a226d077bbe2cb8e095f4d76a4bc7022596a7d04e039b3757a1f636f260153fcd520ff1a6e6421adc72f9cb8d4b93cc75214ca3adb5bb052c62375d73896de162f8c5c98a000ab651458f4f4f2377d613fdcb0a84d577d801be82c3bc5096ef628cf0861081559f0c6112b95eaa7eac9b1c33565f1529495171a51ec511adff73a10451d1f6cf4cb6b161f885d2362017bf2de9b516a8f476bc797778c0b6464d0edce00617b8c6358e7c8f92a12b76df92f09d40de995cd135c16cb3ea3a864cc1899ecaeacc15982377cf417c1c14997ce6c660eed725696575801278c8ca6995457389a1e7020662a802ebd717b0f79f7a6128199a6e2f403705bf750501c102886099a475485d3c7a0301a1a2cc1dddc083ebb8b87303f5733bae39e59ead385f3d675ae6d46425a38beba9ea340c1eccffa3033f9d7f1460d7481601c7f1136da14a6a9327d9ec800b8a17ea5c9f70eb734dba470d5c4f8729bd1ce43f08c6221fc6d6c905d017d253b053ecaae73e04b6b8122f9f30949bd3e78d46d0fa1064a18d315ddae5955c58c58602a40786acf0865de7aa64c0d31ed6ded2e40a18aa44d79724c0790db42698cad3c8cbdfe51e95f31a82dd854b937256f143e3206da9e0015a2bba07176b0fd615f4522fa3f38099b44be4ca9573289a7eab13d0764d99930950038a18ffe33c0a73f6074d86006461100106d4de901bc4b62ff413f79556039aecbcbe5190f01bd9a1fa05d562cdce60045d680b687366cc78ef6ac8dadc9884168b108da684df26170605fe89ee8584e05799d5e679198e111f50853b1dcd4123b33eacd4a061882a00605e742e46254f289026443dc04e2471e9a501ba59ee49146c52d5257429ccc50f3238eeef646054f8d11966d71490078164f3b4f715b8396568a915228c8ec4fbcc1f879906ba32a765d42bd7decc2a61af98f51e7d61c36f98661000b2b6fecce67d6987c8bdd38d968798e388f2b48e69c3dba7e80afa799c8414fa24a3bd883717153100ae6671c207d1aaf5dcd2bc2453931cf202f5f5bfd15481174f43fda721edaf90b66b7b72154753feb3460ea6ccc888619d00273d46fb4400df3881bf1c3bdd9720007f754a8c12d62273ed86aacfe9c592fad0defadb093783d31cc0f91227bb5b499950569a5754722a91fc7d568c0143e7b5f5f7525685480dad9454f440c059a60f11ca4c381a667b3a8683a071b4ea16dc226a7e908ed82e11ab2c1e205cfa0470548a4827d3ed6f31dae47076e63559fb7495858b1926ddd95f6898621917d6921bb62c29463992ecac21e36651e32510fbc3ac841dd2d7d15ba165394dea8721eeac2edc4aeba002f132e7dfb69d97ff4918fdfe8025ae13b103933551ba02768a2ed723764a411ad14fb35330354380d8b5a619c1814d90a82605e7d8c697fa9055e5becb69068ef8ddd092e2e4f5cc770f4956c6a4969dc1727127a4d94ead57092819bd591696ce6185b36f869304abbf5a1c492a8ed544a3d783250874df94d2ea2b966429d14acc64ac49580c9bf3078fd56689d6ea368c31cec9e02a1724bee2d0b78548382ce5c47eee498a8d306f5cac462532b8a2377232a797e220b0772f082bed5046a36bc7d5df36e1ca113a9f0faf812dab9d564062c34d66b969d602186064199f2c0ed3f5991d832e406e162ee0a6e9414a39130de4af71336a958b310c8af7a3416c571a3e573212eb38b402273b7c38dc90116ad6c169c5683da6d03d9d267cd7e07715064eda34cb6185d70adf13c0144c48e1b51539c33f915259cffa688cd2fd56d01a8c98648ccad2d89930b361dbbaf1ad4cc82ab6d2278720b8080c1767f3f788f98f90c873176d331301a21a7b7a3a971edc6842dd8b27bccc2408c631164b8b3044d8ef9c750855088c89c1446a3c9ca72bc626babe1bdd114741eb209433f2109670064135a23eeded43f0340bb1d310415a80d8510beb317175498a3b301a025e3ac8dcc18865a11a09a3bebf2ceb8f84f9bbbeccad31e4512be605fa9f7e6598bbbc97d5086188d2fd72a20d0101b0c0ca04b614e7424e9af6aaeb66a36d14632148735dafd40c35809c995ecc76a1172923c81580a98b7a1ddb09ded34107cb1b78b0456892fe7781e3c9423356cd393c766cef78eeb749be8c22d68f477446f054a581022ed9f5a584cc8b7ca1bfdf656956d61b273c8e1e310547be6dc276b8ab63f9a08b1067f7a24bc5eb1fb4d0b0f5c92ee15145d8e10f00dd0dda1df256b34686a22137c627ff93c9d878ad95f591f57c52daee2f2030146af86d81f7b933ab47590421414070030ac2c808085a8a61f3bb7d86f1c9a97b9c92c9e3f8fecdba37e041a86cbc0703d7aa5a239e8f5ab7e8d689c351b6ab22190ab3c25cb9597ff20839e52cd7fce7edb428ac7291ea8f0f2d5b04c90e37888ada2f39c64f8d1d1b28a052cf471db63932594584d058325f8969e2689786ce94e03e1382106f4ee1c705e1e27c7b70e65764e132cb404ddc31f347904f16ec97873a9280dc04822a0ea2f27f810b4b480cb4fb3263ae190ffd05b3ac4a495c5c9fdc0f826d02cec2a64ee202bb192cc6a333550aec25d8c75f6c4bf21bbe437dba79ad0036ce98a05b19ced3b209392283382c3b8148414a103ba72e510a563afbc15cf2653563fdd44aea815e713405d015f51e5b808ab11edbf7ab53ada8ba4fa97df28ca20fab78d6cefa93d2c921b7bed9c5b341c07a08e912e2f31cb66d471bd6d6337e0a42209bda6f1efe4185e02b5aaac0e38286016c0748d2e40f847c724fff7e1ad935bab464948920a25465b108f41f6294d193c219a49fab50d334593c1bc069c5b98e949e3b04c841d754a38119843df03909053109f418c428d0930419383f40427d1a7d0e23821cfea219c073b43c121276d3c041985dcd554e8214a598c422d01be2197e978c08d310e53bd02d5efea1da239195e07026b728971e64c720aa104319bd10c8e0c42441c51e4f092b0bdfee054d1ece675c9592f511f6057ca433b65143700806f4435086202910c9eedd0e6a3c7aa636a0f73de9aa3e0c1b9dd62ad83e52b8769c4d9a57955e039a148f9b68eb32c770267efa00c538846d4455c4a5d9e0803d00a0dcc233b85b2d4505f3e07ed22101b1f69d50a37c7725bbdc03cb7cd7c836b0b57249ac76ba42906c75e453180ac4389cdde7ab868f47f69683fb6d1fa4c287eb3854f9b34294fd260a68f68fe51583629de413387dfcc770b029dacf59062a3af3e6b3c382ef997eeb701d10f9e7af0c3d0e6bfb494110daae9448a78d345b63ae2708401970c18b9572600717e94db05bf7e4b45b27a1ff0d7a9cb4c3134ad8191c5b4655addd5647c06f3a3391fe2f62b1412d2142b6dd556f3b3b46d4ee3e495878eaa27f400f5755108993dc131665a81bb39e979ab91ef117c9dc36f2152988db77c90aebe59050ff81364e6de05e22d40c0da505adbd4157b54e447deb36db9fef1fca4c8afc078a364778821d1a5c96bda9f6f483e59959c05ac0fd99c8248b47f3d24cbc8b6c29e10d8ad50d3ca9cad16f199753029d6967a677e383592234d79be745ef4cf9a4a06273f69db281f99351b1451bdef2a73fd70f7e9249635df6ed528cfee2be17049476e02eab493806557fe2bee8d86b613863606af23f74e345d0eab7fe47f29a64e767adb8d424db2b1ad186903677f0a21a1fe7447556e743b3b38243c889634c9bab0aa66ba23f16e6cdaa876e09d76a6bb0c1451d9a07eef0d57cb4b5c2d50da2ddbff966462a648a8bfb49634456449c36e8fdf58e00fb1d91bb7d6c97a8685abd35e226f395b0755ef5858bd52b926da6aec9eb4a6c09cc8be1b64ae9bcef1397c493649adf4093c2a1d44810d1b1a6d4456e5e1d3bb4b364d8284e3db4e209efb2b506c2e1a2c211362c51048ebc252510d185c28814e8c719e50bfe45c78ecb4e21c828c8335ef493b00fe7ae4ecc9e5fee2b7e65d30417a87be2081bd9ea5bcd940ee26f2a0dacffa5405b2cf04fa905214fced39b6a032e9504110c246ba7a8ce370c5d0581e34848d4373cb9152befd736dafa83cdeb87c68441929fca46310b4b7cad13f6925b1cb996ed104463035521bf58f4aab9e12d314f44edcccbd851ab286bbe2d728d26e22d593413eecc9f3c820394bc595d5c35a1cd1575ece5da55d6f3dac282294c82fff42830ba854f49d94e237c546c3ca7e9b60111f98810e17dfcef2d91c13f39a8fea4d6aa55fde62e96f46fdef7d0422dd5cb55cbec5a627bd6a7aea44e3413ba4c78b5077ab94e13b0d0331e2a12a291945ae2c38d532a7b4212a46054e05c0f1831752017c6a34a32611d7d10684661e7ebdf0bd5cb7f4f225fb076816b2b784b87e3172a800aa035d43ca6ae5912e428b9f0fbe4a190e1408bfee016a20c6def2ed734ac29bfc63f9f1b9e3dc749154c4f5011480f4bdd47517d1a8544fdaa4932c5cad300473e50426230229787c1f305fcbcf8dc22a1449253543ae13401a85aa841dde008b9a73e19f45a1b78c2356e0335073a1f25d11c5f6113cc7a373c7017e396925e7e9d8394200acabb5fff5aa85efe7312f95b77b9066f2800fea625cc3a9c213f05c0def4610cafab77257f57f57eab4407a7faa66adcabe3dad7bc3991d0a0c9d5fa3b723b936c55f05b62e095ca2464cca25c11bbdffa2782b032e814e5cdc1eb5d7f2586d2e7aec841f7aaefaac80fefc2ee353fb10a14554410cd9460dc61b3063f6f8b33bcff6e4dbb4bc0cb7b15d12c58b46975a88cd67cf341bd43618d774c849efdca74dda9090ad0b993a5da39c300c20b28f044656d50ae3bac5168771621b6a986d3499c2c96fae6d249c1b8e4ef4ad1cd13743f923eb54c88b185265927021540e909e850a1bb42faf2eac3405733b49d14dee10b29cb75090a52d0c070bada83573a087f530334ba6b118398b462e551d1d0456e377f520434784d25f87322e3ba2362d91ced021bd773396bcc8babf1170ae07205bfef5795c226d26f2e0824d4cd035199128a9cb83a658f3a14cc1122f974a5d05fe831c4344f83921b17245d97412d819a459768c2d7b009a6de43e34694b659dfc4eff48a46c0a04c418a9bc6f43a4b861df5135f0f3e020905b2e80f3c896aa87d745f911a2b08633d6a48af7abc233cfde5e728df6de3b1875315a24818794d433ba65339d48253b9262e0b684f0de02795e9ce4a1b8700dff372e950129cc06f4192bc4d8b187115a2521ea638b7d6f706c3495e923239d17902b88ced5abd094e72cc5d00c2af0577ca862382d65c214b241a156043bc0b6aa6a3bd540c02349e2d281dc1c79641c86424d0b6154c2db872290e108c2eda75fd45aec14c45eb205f6d8a168555a695c3c6a881485ed61c4b1d75928deeb15db17c4cff4a2b62a48a73704f191a6491177a918af4b58275bce56c074814d321db81047ec42e5587bf6b139f17a42c6f179b0cdcbef62133b1c3d29aa398735db063f4b43dba5f939a79824b9f1ab2d12b976196bcf15f976806f8d1632e2f2970fb73af8643b1b46e05003d062c59bc76d171448774815d17198da55fc46a7608b2cf8384c3f1cbdc8a9cebafe0282dcfa65a0c5c1ccfa59940d6613c4a3a6704c3e934dbda696a0654d257ece9fe7c0ffc703b4c12d67104682ca05c93117e6a331df55e422189518f571b67b9c1d0329b89f17b5fe7276082d7fa0c3aa76537f8612624ba9cb26a793f58fe3890418408d8d4f600873831d1840d6ea371fb062eb0491e421de06a1fe859d3081fe48064a739239c5fb293344772b1edfe760b63eb3ebb30af2cb2313a1afd93811d92cbc2d79ff7e39ccfecd691ae53785927c655e4da48bb30f4534220f17dbbd0a798dabd5f6e9d30929cc6412831699fca02f62db44566a54787c05e18cba3430cbfd700a97aece8c0fb7f0b27dd6f07d868b9ae2f800ba92f139ebacc66ba2fe657ce268a32f8b61e99716e1e8d95b6480ed27ce60b33f82675cc2a15d4c78e8eba6350cade35e05b73c436f25e92a26fdbeb257021ead938ed519dd45f9a45a4fbad7f69612f2505793a5a2c54be9c80acbcb0657751f406e3a0e568a760e56fb226a95362933588f316597a3283cde067451b38acad0f9a68e16699f0cf1eb948775fa0508e9362f1866b5cea6f65a3fa412d6a43c9471707a8aab683e7d7cfeb308df63623d200038e21a712436975a15c7350791d6a43b20335a4ba3814e64a89d105d2127bd615b46bf6bf8ba1e1c24f250a2475b71ecaf2836a5b30793e2c97d381b7618d347c4ad3ed277459aa6e9813349347652cd6d1a1509949c69a45958080ea7392d5bdee88c19634a25ec7571aa4da3d3b016198d58c7540973025097e3600c5ccec8c9b30eefa46a7f9b11eddf095a9933fc538a08fe1b190ad3fc23b84be4b3ac8640c88f6854433649ac215807662b76ab9251830fbbb103f3d96ead9f45cbf1ea7d40464f99191656933cbcd9f2cf6ed9ae66d7283b690051d632cbb4e9d30185015d157ec01a8170ebf7b92c56a4d21b533bfc2cad022aaa73c6f2804dc688dfba01b9b86181306e2888216162de5dd4b607438359eb4b0c685f4dafe90d748b90963a29f0ff5fcc8cc8f9bb6c5423c070d174962a14f981e7af3f532f296ff785ade91c946fad60fcf5f478cd29aebd07b8534f6ddbd9fae9196968d2f5219fbbc352ac05f2e026994adde2ce3477ac3f35735f4613e9845f21a2268d8b2544aae9a57140369b349b680e14f6cd9f25a6692233a6df99ae640dce194497082e51fc499eaac7f9ede8d13fe17e2eef71beb65c242dcc9b29fdc438593332528ef4e346f858b80a073e205b7a145fd1571bbe33f064c7530325f9e9a2c456845b950c5fd010c10faf40d6b262ac3c7dd3eb9d85003b32b34cca1f60026b65584056912f7d483bcb1b42754d107256b71ac98009f87532034116e9e85b2dee723bc60a8ae6a001e88b694dfaefac165e156f2f820730a2b25ad4b7efacba4db56314e372cee80a04e46bc601c7aa2ed4c76ad3b958f26ef5b6202c7a5f4bf019bf5edeb8fa4b4bbd8e8b365ce180f2e81a6689d30a8dade60466f59dfb099d358ac32341f7a3f6a737027a73fcdd4eafaf3a6b3f4b37440f335eaa5f9e2279c506a3eeb57c1c34739f08486fbe49aafa26a8cfe1f67d1e7e76277c186283c4d4df21ccb4fbbfec6143f8bd1047a22e6f951ed0c2426e810c946a844ede01ac134015db4cb4b0dd2269468d4766cc82659e6b080e7ae510dcdc7ca0743a03806d1a90792cfe891aa2cdc2060fe4cbc4c81ac6956cbd1b3579663466c215311d35e7f3d194d0ec620610f8c9a8411cf29ac340d77ebbc93669c5b7c48960e98e3f0582009b7e65fab4d7b601dd893e5d28b66b07d86467c2d4c77aa120e08567122a2bd08cb4807deb66384cb398d5950b1b53763b0325908cda710aba27ed7923a29de380a6ea3c6db7ae54880bcd5c33af2b76b99b22c02fea22484ec8230668ceeb7cf128ed495a817fb637b5619bcd5bd1fb2df00344a7c06f04e80a4a374226d7bac14f0009249878b5f2ef8c2736ffc2db5d3af06f14e6f368a98bfc97885b2b4cf2347a2daeb4f9fa3782e3ccd9b740dbe0b922b6b7c1db525ca82934da6b7bb918dbf25b23c49da16bff4645b4e1bef0a4861aa21e3e8b3a72a7c348a8c22de1ec481537e5abea0fcae4bf95c74d5ea69982c38d36ecf21fa96673560543529be3a7642472da35124bd40042da3632f41a3d9297c4b4cf188152429b2a85913056b6bd84ed1f1c36f5ccce080bbbb3c125da962de4eec2737ebe37ec4f91228488fe51ac90915be7f6b04dc9909516cfa583b7efe7ea589416a0847295397b9e9a3dff047abb72627d0c5199ce6a7318651650cc4ccf0cd824143384f6859d1f28d59e6e86644c09288822a3afd8e0315981e2edbf26127023fdbd896c8c9fd5355971ecdd8a7b4df28a0cbe5b22e82679a55de090c0ecba3df1fe5050c511db36089659695cdb8a47c21334db860f0c917289941b26081e56712da31856710b8795f070091a58cd5602989bc192fb1d42fa6a6d7e80513bfce6d29479c39d3cd82986a16b15bc140c66df416e320ccfd1a91c436c4543d44fa75d0987a1a605bf4b177612f44af29fe23e9fffa9696844db9256dd0d30b7483e233568148f37deb4df9c8d2dc944c62bf592c4d9f78574375776603c8c3283d7a62bd030ddb24fcc456d6fae4fe5e8058ff5b4a55bf96ba804d4270e54453501c624ced3126465196b56fb67607f62dbf03856359472b54f82706add82ad5714cf9f43c5c21cb99667264092ce8568531cbc2eff68223e38bbe68fbe718ce3807eb49f7e07349d70d3497ba8d4140e358f900e2a5f35750d95fffff5a1088fc2c355ef22abd25f6fc1292e94a336b3dc57551e3c9a0a9de972883b2af7273eb2650e200556e422395b6f54d7cb99f44165db8719f061d6edca1f863efbe101de6e4cb3501ec111938738e0c2c06d2931df44992da68e8b285e9850844ba04f404544d288490f7d40c9efe90c3b82db8f22eb9881b211c3260c06161322f96950fd965c01f8fb871d4fb9a909fd929952c7b4e52bcd53dc1cb2be22e0244e4301ecafda44b42e184ac74a1969e833516ff4c0fa7d2ca54d965699fea9eb248352210937bf5c88737d1aca246ddd138a6e6e34e1026693a9c57e1498e998ae2d652cbbe8974e81d70393987f45e8efe73ca4e52a7a2dced74cc887b14f02753ed867a824a7206c9cb617f8f31d107fae8a6e2bf33845dbe5d6d2e6d453f2e4ad7b6080a2d5b4a14fe9404395de39e0a3b4b572c77e2328002e90e4fe37a1899a700fdc9f0beac9671da4a943affe5f7b3fe4f1aad034e1aaa1ceadfffcc51ee3ff507ef27ef22b4424e2ce51a6aff19a0925ae333b6e9f28a7b21e903515c589a3c2f20f7977f76b93333b5493509e4b3ec196e062c45a6ec4679321521c1762322c10712e7549faa33fa8ef7b7c3f7420995e2b853ac4ee5f09ea3231596345c97cc5d993d2af6bc173d86bb6273045b5669cbf7be79cc21be81d8cf3e401002f4bf048e16c55811571030ec8a3ae581d7c9e70f777e4fcd3e5e3c1e702fb88f4f1613c7ef8b03b4797cbf10cbb1a160e76f523b886c0efd9234b99b9248ef41751dcf8197cbf4a2bb4cb4e379f13d289eed078f2f9bdfd3fffcd21ad97bcb149611a4121a103836f0d281223376baa460460a199690810c9a195e818d42990c4cb03dd103cd172ec400828cb46406a71d68ca3041c260c454c693a31a68823061884e100422a680628326860644b1f48211aba85e9a11cd0820e032030260042a944183e6da50c54b0b3fec00451832d0285de101951e21275b4e08030d8d0054f0f8c1852b6886788146a6c49317c428a92860b345192848030c028d12486ce18445195bf8e03b03c7135b9c9080bbfb19519401812f74981189e848c285bb7b7845c5a9d5ed05e954b4e936fdf8a905d594287a2245dea747c5694deff5fa92f011e423f7451e84a029ba5f0e0977df4ec2a4dcdda727b87d3d7cd3684df7cbf198f81cdaa90ea8f753613f6043ee8e7febc63abd3a779fbd5862bca804ed9e8ec7796060411044e88bfcbafecc0ddea66f902048418e8218050112a428085190a12042418282044142423a42324202825484448434842484148414e408e9e8e8c8e808c851d111d1d1d091d051d051102324a32323232320464546444643464246414641802001390262040408902220444086800801090212a408a9e8a8c8a8084851511151d1509150515051102224a223222322204445444444434442444144418690868e868c86800c150d110d0d0d090d050d051142123a12321202225424442434242424142414240829e828c828084850511051d05090505050903b6a45efa702ed9ece2a886583bba74eb6a4f45a3b730fa8f753f19acd214eb6c83fd55fd6fdcfe34030227adad014dce39d7ad7c7bcfd2afa184d7feb5fef6d5b456f56e879d7dbbaf5ad97571dc9ea018dbbd518ee415eb87b16ee3b0af7958a1877950a0b8cbbcf48560feeb39c76f7284eb288e4d074af3977dd5d87bb5be0bee43eca46717472771c36dc69b8bb8e3be9ee39ee8e535413fad17807adcf6d167797e2a448069fd9c467500d482de8070988ce01e98482828008dd5c6e68e83c12d219fd64b4a6f1beab590bae5ba33bbc02e5dd7acd21779bdd7dca49b189a906b54dccf12fbd558f5bd724b857efabf9713e3dbebb02d59fcdb6d39fc650b83f719a5eb38b5b1cdc9dcac930cadd6f9c0caf50e2c4297a75aff10ee6fe75f9836beee19e5e6bfb9783b7890d27c31cbed1d4a71fb72fee8693d60577d771d286e19edeaadcc3abbb5b27ed0eee8ec3497b84bbd770d2f2e04ec40a9f2aba62ada23eafd19e5771fa431ee7fe4c7f99a7dfc7dddf3dccb93beaa4ade1ee7aaded9e0ee6ee2ffceafd13abeb6fe3f5d58ceebb55dcc3a9af87fe46efba7fa7a27bdfde9a757f5deede5af3ba267177967bc8e3ee3d273d87bbcb9c7414dc8139d5adb82a7f70a3e6f55d53af351357dd80d7cc697a8182eb5d73680a64ae1a2887a65bff56a01c9a02a92870bde70f4e7dbefb5364743342b2fa09a69bb7435520ada29767a6396f20df6febdf5a03ca3cf3aa407ac5da0990e8eea1bb8fee6ee3ee36564687988bb9ba2a5d8c99e11223554052b17e14af889649ccab88acf495c5042ce187a32d4cccadb554f65d55c412368ee3f8e14d92f147f15fafb7e294385afba3285a99b22fda8c56aac22dbe95f225beacb85eb32d96ae0f6f96d829d78b54ad1955ebc367b1fe35cea6aebcc2a7f29215bebf68dfbfc4dca75e1f83bd2f8debae0a8d88234f951c2555ebbdac9955c951b6665b5c62cb97686755ac94319fd9d68b2c9e92cadf4bb20c99180169cb413e09fe251e59b15242f8e297607ffc9ab79245cb27b14a80fdeb675652f824d6cc4a09b019eb5bb3125aff9a69f924f15db3125a33d64c7cff125a568dd1cc5881f7f890872606d963b4c5582fda19efc1a2a5a1a161d9f0844926843649bc126d6c429bd06d5ab31d25d7b7a85c331e82e1b7663c04c5e720e9c59365fc2bf1ed87a10d0fecc39b27d88f3c594888bd855de149818324f16b78b2a4c041d2f8a28d0962969bd7f249b17ff164b912dfceb298207ecda7f049b1d995f835b32c5a3ec97e0a9f64f37e23c54878c373257ef8363c26881e8852e2874f353c5a6c52cdc378b4d824d8c778b2a4c04152cd6bb149b18f853c363fdad8cc488865793decfd26ca936c66f649a8f990147d585fc3036bbd4da2954156f134656b46c543307c1e82e3934fe1db9b1d0fc60f5feae9c5b075428c7606197e2c662d8f162d3c59b48cb3145ee251f849214f0a298c59b4fc508583924a7c2feda730ce7ea8c24129be8b29c5b7164aac65cb91f6ad6f8d6518c2fe25d26c4f149f9e32f451dad9d41e2d6bdc69bd7d87f18ca56be7f5ea2969ac15ca40a1a50c145765c89c2943060c2fca48e04be965a068a20c143394290343190990e144f862026044e9625240424c0a2e944c74517a1926a828a7724af17f945e86091dc29b678db32a569c5c69d2a439c11131ffd6d34040bac470b623b69ef6a20a99c22cc890b165d833fed4c89aed8ce2d45f79d9b00231ef31f57abdde92b96122fe4b7cbd5eef5ab2ac970d2b2c5badb7adb760c05061b11063ed0d13db046bc9d6586b6b6661f99a892c960e30e020be2b072c4ad7bf9a109ff5049892f52d998e4cf63d76d0b851b2624ad758b2c61f52f8967db1be6524acc182cda65c6fc3d2886893a347d0902552b8d42a8b0b5c7a08cbf163356c6c84373630d8c05e376c58b0a9d7bb9e897da28952645a7abdabc60d1371a9351bc351b41eb270c4e06871c24b14a4135c9c80a17422cb9833c69c8940174d7c29fd6d97d27fea4a198126ae945563b92326d911673c7ee36f795aef3c4c6c693713536b3675a5147de6e3b84726d63b6ddc6329b63e7c67b24c5357cad62b094b1c6d8f7dd6efd8962d5f3c4ef6c367595602624c8cc1040c762a5686efe32b41004d5906025aca9a0c94cec40aa5ff3865537e53cc43d8548fc3623fde2489d94cc5de86a1f8ae58b8c7120683bd60b32a5bbe58ac6ff5788f50d4c2653f34125bdf6aedb45a61b8e372bd4ba4628d6e7bfdf82cb7c17efc1755eb6b1ec6532507f69667cac9f52dd7b75aae6fb15e3f52608c527cb18bb2f52c2a4a7f8017077c2925808504c494db96a2b760350f737dcb350b479bdf63097b57eb6b1ed662f9cf8bc7fda7359bb24af6c5a92b6bd558de30b1bec56ad9d63f6b87b5c36af1b878bc45fb00d97a6fb55ae3cd92dd797d4fd97a3bdb79cd98f4f48c3530d6acf56e59ac9dd6fb4eeb6d8bd5ca2969618fff6b8758f82388295bdffa527ae9e5125d4ad88f1f1359a2c8b363612f5ad88b678f371fbbc929abc6d2f57b2c475114bf46144b71bcb971b7ada2ffd8d8f7a9f17798f494af9a16ec61b39e2abbf3b2ac87ed58eb3fa28b2fce7ac4192decf12b36965585125d945ed2623be3ce3863d253baf83bf6938c2ff24c5da19550da77b978a85c6f5fe16c87490fd5d4ebd90e939ed2be9d55b1549647fc70464b220e20e66e53e2a5a5a29c955e46092f65d55856c929c577fd140cb6c3fad7c358768c52a48546e3ef78eb269cd1c21e1bda10a3d1c21e7f2fa30497d2567a9924ba286dab7df79ff0a776c2f79d70c6a4a70c3f74177f8a450301e9f67976ecf794e3b3c6594f39969be63ffe1ff0f0f54a5c3ffe95d286374ad6dad9ce92bf7d253e6bd5bc9d893127562bdc79cd965c3f5289b60c588e526bdfdc28bddc6d7ee706f635373c552c136c56f5ae59957d26adb7341b1b56111393a0a28cfd6b7c57a249809c1a77c450ec51da81d5fc4ed558fa57c929fd6daad8f235abb2a51ddf6755b674cd6ec49992fdd61b11adefc0fef59af550b146724cf8621665f862153b86fd2998750a9d492844ce6873138e42c43c34a2123f44a287727c7186727cb14a4ed99ab9d3f82c7f26e31596b540c4dc6e3983849623c028c51f8f2823c68b92c57a2ad72f91a50e3ff631bf518a7d5842e98ae54cb17e5b71b623cea86654b10f9d67697c71362ec5724afdfe233a894ee1f354d9d2be94c460bf53c596fe556369bf4ace8d53eb5db32aebc47a3babb261cd4b7cd78c6afc6dcb1655f8db56b1e5accab8c3f82e32a5eb5be3bf8e30627cbd4832470ed60e939e9256be74d0304056b165f8a228d6dc24695957ebfdc6695c6abdcb6dc4f1ed58358646e1eb26c968977c4a3ba36afdeb439ea956eb5f2fde54b1554fc5124150e6881e4ad68fa12d451b9b1a3576843430c829d65b5a19be65c2aab2a5387b4120dc5102320a15dcb9a3468e90c562f1d87021a75c8c90a419809cfafffffff004310f83c0e841421ad253f434188cc742c17c0c71ecdb900cc5578b47496b0ae9c563f3b04721f635cfbad9f1c0e6612f658324159bb9e853330b5b4baa20212189a2288ae2c3bc28edff80b9c2d70abce7f5fa1e3becbf6296e561c863935a6fc710a7898f8922f9a2f83cb87e8cb1ff630c5498e4fa30c98e0e0823813048840913e687303884a1218c0b60ce8001034c1760b60043064c1349743961fc227621ba108a71418b315ce842c517310f6960c04451c418457451c41645445104048a30a2083045e85004028a80a1882c449c69b55a2f9883914559c3c26a603564caf0c5266c8ca889d5c458384cbdca100103521922aeca8419a34c982fca84b94090cd4d98ab3056b8ff30419a11c64a20c63c30b246560f65c84505aa2853c6882694286304114678298de052da945ec60816dc798cd052535313b321224b11695c7441c05a777777d70bcc176bed0bd6858b288a229815c06861b158ac9ad8193262362e97cb15b3f1a20b180c06b3b9a1228a582c768383841137373737383943f430840e437481e194118bd91b14445649de88634942b9fb882fde2811c527c919e93fa1ac87c6548e231b47377eea85e3c7b78fe36f906f83249f06f93ae4c7421b7777b73323a111f9f6c9a9a030c471b99ee4693d520ece382289473872706e6c70f08ca14feb6ff0b4be068fcecba8c5fad6eb8d84f606e9b58e2f2c62faf572eb72d9b0d50a45164b1cc77164d1986882c6802c5208628c20c088b90d45d68dfbc81ac28521b4586b59ad33ae314451145bae2eb260b158ae1799324230e172b95e305188244221c094351ce6840e658498a18c105aca0871d50a228b30082c8268a29cea0902024120d123ecb14f7b6badb5363d68618fed1186a20d0add67533dca1ea1fb4f8d610fcb43cc5d5278218514627c70f7287e4c418636618f0d6753a310b1d80f0bd81f169822096d06316c20c9cfd1b694d166d021c99c279f7c1855ce8c360339b5644949beeb903a24694312da0c48b41968336009c2cb1759e97a98bbfee5b6d8bbdefd637ea324670a5792ad564d0dabbcf1b7af57f9b22e578913b65a258ec8629538cfba51c21ac7b1c461896289f3ae1b25622b0c4b9c7fd1d04152cade963834786a3ee62fd82ba13183fd959d251aaff34a682c2965af53c333853352ca6653e4fbf839aff23575c5c6d18d67d9cca66ef0b8fbb46cd49095add6c37878c6b0a7f5ee6a85ef384a5116b6c4c486a00df10a432f5ca0d570f5258c2f5d80c0c2c60d0e0b5e078ecedbc89c360b8683832323616ff3381f7bbdaccb15b65a228b358e234b145b612883d9c8644fbe12d98c7cf90fec63b397ffd8c05e87878435d9b2c654cec366b412e0c8ecc39a28616f019822207428831aa043297e4f03b894e2d38a5838269cb789c562b19c9cb78995b8d2e6611f7bbdaccb15b65a228b358e234b1459374ac45618ea7ccc65f36799f3ae17a9f3e42bd19979d843ce72c88fbd12d2e679654eec5b3fc27ecc8191332a0b1ef6319ecd2a616fb3593816bcbf0e980537cf7ad86c0ac7cdcdcdcd8d0d1b366cd06af8b2c5972f40c0f0b8d2a6068d1d3618bc68cca6c80bc812076767b3fe695b7eb31ed745b9c7251be3951c618d1b624a364d29da0f43994c16863c2c170aad9912cb4731b42c9ca92bae440c5fafd0e5125badd6c862b158e338b64451a42d41866158863ca328b2b0b0d6ed0f675e637451bab2a0621cc980618323e688a2285a893ea32d6dacc4f0cc6b76c6353bd39a9dc999e1ccce28095f30712aa864b1c02033e5bf443c0ac3d0863624535354f31ed6bc6a60353535355d589b570d72478e1e2c31768c7194220572ca7e6181b12a8161c3b70abbc4107055be4a31e3d84390dbc06aec8f5e483bbe70e29187a1db2e575dd6b10cb2121ab566538e45505050505090cb55a3e572b5462471161454866150008c882e1f6838d07c68e2c7143fa6a0e1f0a3891f53fc1853e60725cafcf043991f7a28f3c30c657e80a1cc0f2b94f182868c325e4450c60b18250d01a43f0d01a4dfb8a0f40fea4d3ab176e2454eecf3a1ebd6b69ebec0212e06ee54b1cf7771cfdb28f0578ca6ebc57fe25731cebdf641c3102fee2aeeedb0be9df8fca5a68aaabfad628d57dfe3dcfb7a2bef4fbcded4c4e7467b688a8bf89c7877a26baeec1962e227dabc698dd79d8adef00fffaadc4e9ebe4b6cb6f362decdacd2bb55e99d580454af45f0bea7cf498a55f5f28ef87aeb92a79d4b77bd4f43762a9a77fb976fbedecabbf97a375fef774befce7b88e877dbe99e10360c9c29fa0b12aa0dfd649d8afee0f49afac4ea0ed5faf2f67d725f226d51dc719acba12115a4ad86fbdb22e06490251e54efab97b79fa72fd6e9d0f3efe3aacbe399280ff8b4cf5b45cf9bd3136ff3b76ead66f383a99a5fa3b5fbbaccd3bf0fe61eefacbe7a4d7737e2ee1cd4089eb8ca0bd9fbfeddf77c1dbcc0f4fe8935cadb7faaf779faf2fee2f02fbd4f6cb613ab40277cee5494675ef3f17a1f4371f722ee4e64881252d18f2ae7548523324c4e1ef9dc9d473fbd8a3170e3dc637df16aaae807d36da2ebd69ff7eb1363f5a3f0be3b6aa7a2bbab3566da99a77d57d55bdf8237c5abcd76bbdd8eec5454456f0f43e11ffe79c033f7f5691489081440638b097080c3073a00450f161832c546ebca2b4c8d2c8c9917fe081142d50444ec4081034664908342131a785cb8193a800d60c0fc9420470c39a698c00290946085d4008864a01500230f5c3502127e00e48bc54d40acb26a20a18646235284c8fb589d68cfd6e12636a8d569eb7093ffff9a11deea446f7877e21b9579d7dd0a026bbd582a900091223a9cb2a02032e4b7facbe6ff7815a7b7db99661103e3162317d78eadcf2742c45c752e073934c4ddf199d57f1b3eb3f938cd5d9e79f1aafefec42bde2a7e9b8a76e122f43fba14eb2742e4376f87625e0def4e1cb6e0ee569c14c27d20b574a47c2a8ffc90b73a512c4e0679f175ab18c8777b4aeeae2d413cdc83807aee5edb58a31b4dafbae26d853f89f300c073e89cac7d0962aa5b7acdbc83bbfbe09cac0515d5846a423fa99a57b44ac54eb513ef8df67ad9b41dd4a8cc9bcbebe3dcabd7fc7d79fbaf56efba5fc5befcb9a945fe58ed9cd7c7bbbbe6ad43f267c88a73bd9feafbe04d3194b53423f45a03a232739abbe17d4f34bd553dbc7550ffdcf5fa80f4c6697a7d40fa97fe7a3f93a4c1e0ee3e548df3f9e7c5bcdf2a5eef93bbd7dc2d06ee1cb8bb0adc7d04277f9c71bdd67cb7e73800b987389ef89164df1d5a7555208cd79d03d26a46b789d3349b4f98f82e13c6ab54927b099c88bb9bc0dd43707203174e8caedb0617a1ca06a3fb99cd9bc655e8467be8ea03cafd3410d5a97f763e2f559a7d403afb3014d007524b50e513902f6f2a8d91680106e9a345451aaa05fde4ce1f8caedb67ca47ca4f15effbdaa7e85431e9138ea1cb8fd7ac5befd63fee204ca9a1d5f4f490f024d4d06a46f8b73ded47f8ffff9e1edc6bb516c81e2d5a7cdc6b6cbfef9f98ca44d5ebeba1d243c5dd6d640f529abbfbd7ebd9e1feb6137ff0bc784d2fd39ad73549928f71857357cfe5a38f44acbbbad89325b32ecfb1ac1b16c7be86c623176118317085af176b14ad751c61cd43b71e8c1c58770961794ecbbab596c52a0a63a15b6bc57089b52e1b5a2bb644086d685de10d286b5bd6e5a1bda98961abd553f3760cc3d1053b5a1bd6d8138416e62c3b8622b6762ab4367c390977421bb6c6d08620b4b6155a0f2c0e6bc5f0150196e8c2b137acb5f112ad0d36b4add0da50bcd970ac81158536b6c8cbb27a8844ac2b0c4721b1260cad4f8e911d61148a29894fa18f1e2ac08e62cfc80aade8ac03d80d580f9d2449b76e471bda11d857b881b5212b0c456b892c907d599b300cc3d611eb230cc7d00689b598052f0dec8d8e8e5006cb0a2db0a315ad874fe1d7d8d143b4e58fb304109d2702d68d38118ab6654797bdb1e20c61f8b2891649b461387e6803ebb12c6b5d41a3108f201bd6b45ea1cb5a9b0dc30b882d0b0b47b1cacec29fb5e28f85c542fb72d9d048884188417881e8a2db1cdb0a437b3392e2185a1086a16dd95167613d6c8c155a96c539da09975c315868732f1b57683db02f6bc5d08e7689bd200c12ee0863a12b6459d186368c85aed18a2cd1da232bda1e0bb336d65a211683b04674d9d768436b6dd6b66e8435ec185ad6688384312b861858510cc3311c6d9030b43ac21a0bb3af31b4d6daec05618d4bb4e36bb4d61ebdcdb1c16b88f88365450bb3630e0b83d962537630b000186d18b64217b6a48da0d8126b431b5a6b7fdce53e9772c58ef1c108fc3fb8010c2a3ee0f1220c2877030d70a2812e5c8a470b8fbaa10a1c75cd38d40d48d800c5939d3cb8616a8ca75b64a4c90d189860c9dd1114e4861c40412e8e0f471ab8e971c453638d3460cd30c2a54180d19fe1355c1918fce07a08695dec90691fb4c18f2e343178e0de86c7e3d0f12e3440701ceb05fff10477d19d8a3f913d6cfcee7bde6e702c138b4f80e26eabdc56b189d91aaba0b5be02088800acfab9fb95933ca79a77773d595129b86d21c61464a822d8e26a8b2752e004899e1260158881230a275a8c99460a6748d215522eb061d4e30727745f3410a28a3a8103649163a603d54795812727746c0005200b0b246055e28a004c99a166c5367d808706e20e44572c40428a2f5a34316ef1bac2cc09c200c0f60228c7069219221734c06a0728627338891fe040056468c1830c22509144702e31c5c3fa087e7ae51414bc8881050029942043c01d0804068f858009b7423fee1864b972f1c6887bd3bbbba8707732e169b680f4b092dcdde7240f2b7aada92bdefbfa80d6ad6f72c41d5189ab9100576393d6066f5d27c042ee70c562d9b834d002cb7883d088c346071f5a03b81a9bc06ed4ecc871c215ec83518a88416cb76c5e4a2fa4568d2824470dabccd5cb88ab1a54b0c08e441b4a60c3c5152bcd15cb460705ae6cf64c892b580e9cd0258405c482418b8d9805329830ae7095c393c323fec8805e3964694c60fd7821b9868839e290970e5722931050aba6e5e54a8cb5748cb4989068479b9156a3c4fae1faa0a5a355d39ab2a9615303960376c3f5816886092d1de217135864ae32981a7b7fcbe082d16693d3928d56fc118f8c4f36385aa10b8a6bc7d5c4b281635b319135da88a2188a2ef125c26a768ca2cb894b27e7a946e66ab9ace81a8b46a0d1be2c1077b0c078b07cb8c2f18245d61a775e484c18b93061767b4f7386072c904515544041e6b78b7ac18524491c1039caaa182300f241e6bc5c53a43835a599020b2b78b41034830c46b6705101334f2c5104103c00d53488e1b75bd0eb094830c61613c0624c982b258440454a14a726254a3c30c071038923ae00d1801248b85db023ab3c70b8c84095de559a335280022a5370dc9055e0092720b044114404d1020b02b885f00114a7a625335338214512332cb98016669e18b384123be8a0020a2790608c0a4c600925901022cb153e9792c86ec6e880175c4031e688078059c00b04c0e72d042a53a02c251162f391dd9899020a1b6a78210b3e43e86049298910ef801766a6908013473c004c100b28000b5940e860898810db5191908f8e6cf4341df022031280c28931473c20880514e00516089065033710a87000544353461326393818d8e1c20a2a44811284030154085afd004b239e119ac12a235cc1cb879101e102421eec50282406d95aec47fc21fe0d1ee10ebbe3d2215a60738c38ec0d180d1d1d911c736c70c81b1d3616c476d4c860ae57cb15b65a2c9668bd95a5268332572e980b36e2bc8c5c30f1021b292c4db3574fabe68534dae4d8d1a6751b81e28d281bb33861cb550b2774c146dacd05480db8aa7962738e341c2c61d10ecbc9685b4398b822d20489ec8470ac199bf8a4e0ea0b1336a0028b65d9643c8c6009471de28fcff21461fd98c055abc5e3298b8d9c2414442558027065010c8a4d0d9b1a2228d9f0bd740d0aae866c98125c0148174cbc61518d025801cb6bc4695d607388b0780007d80614c8f23a23034e18631991b9828c4cf0942f26d060f5d428d568d0a2326ee00a6282036e506202035ab8410665b9319b0ca089abd84f57c309374339f6c90e5188cb02232c35ae20ad9a178e78b4a444bca04609055735aea59ba8d7929d244a35b0253651e710075ce1186946352d1b8d9b564d2cc92c841dae6a5e4b30c8a970c51249966d79d0aa6109696d502429f683f9782d69d5b82cb84102eb3136c170d4d8a1818e1b1bbc7e3081d2004bcdabe622ba213a5a7a72d98c2e1d2c9b6804b3197dbc1117cc553302b1988c48462c6b47e461dd0882bd4c31481221395e35376047588e34c58a5e3d638fb1478b01571be08c48583f5818c07a8c3b7284c40b4cb8aa01595127fe8c226b845908065022ab4034800a315f8060800e03b8428295a6d2611317021529519e38897a6ad2c1121b12518f061900e04727c6a411230c0f70502483990e0b5c5da48882871d3c48c281ed021b36b15613483ce0871e78d021871bbad8e0a4c70750ad862d525169d090919322c60896b86559015a40754584d4b87a78c185239805b258400fb62046386ac46a5eae1d3b451041059f4e4d1d2c2925b11509f9e8c8706e4604b0208000e874012409201ac0802b509e1c19e5a831564185099e1421620473b58248e10142e0108301541821010840400b4e4d4584f8b0b165882b08cf8c63fc084230460f841a607561b5082b10520036011b2cc22a423321126110221021d538657b581eaf0b583b6e2c087184366c0d190d964e28b3e48813c6583521ecf50a5d2e56385ad1da96bbd718553969c12ecdddada2ab0f089fd944d55f933bcc7d7532c7026e4e75b7207a02f57e6ad01329f277a7f8c40070f7dc083f2a5e846305eebba6c63a7c9ab91b04e9c8084811d1905050d017f915f3762efa21af37ba434f605ed79ccbaa5b2fee9e9dc4916387e6dcc26e7059b7be916af4c91b43c81b45eeae81933770c81ba23bee75f97dbee71f9fa856d1d7e86ff48504d7bb5e9ef917fd1dcc613537e15ecde8f639d928c2060fa48d1c481b07c0e17ea7a298077c9f2732e47bfe54f11319f22abac339106ab5da14f7510cdd9e52ee6f236b0cd5d8216bc4fc6d356fdb3a9cfed7e0366f87aeff5b87539cc64478881071f70ddc7df4a1110549c38bfb6b74ff72ff1a7dde7e9b3ed55fcebd2efffee577f71e1f34aedcfd8793349cd030e2ee2aba353e9f67eedbfb9dd5d7389fefd3f3bcbd5371fad84453fdd85c7f59d3a0d1a0b9bf2d8a0edc43319adc430e846968141209d92201679d4003ee33c470e5394946dca6d0c5dd07e92e82e1eea7bbd7b8bbcd0006ec165e7acef3fee0d3837b59df345af3e9c9fdf4edc45426e6993523f626af58840fe61e9f68157a7edebf7d3dbcf7b53540f80819fd90212fd4f3437e34204a6a49c912929b92a5a85b9492c987d4c700f7a02ff2faa7a2bddab980a02ff25bbdbdda4982bb5f7132c708d76beda7d1750714dce17dd7ad9b8c3921886109f5015c002d80443c01022cb84001c07060670143442db020c2610397158c288b44312cecb8008580244d0b3451014bf0786144f482819f1ea20a5748988420020f6650d821fabcf4bc057242c8f0a9213af1005943193770b1b1c146145203a943073ef082908f1dc5a7828718e40e50b2d0d0882d157c60410c228c70d14146188223aa9a34e14107246418211565d460c5023af08064881721113d58a08a282a1c1822862dc21a36d025cc1632f008b261116299e18614138cc013c54514a12e8a9fa2862ba85829a089b089163426c0518259b9012442a122b658224aea034a4c0126bc810227b6ac39cc90002a5e2c1a05d4c044d10582ac90810e560319504a40123474b971808b7de2001b80a1b20219ba0c0183f5420648d4183231804064055b8014a6a4508029358c61228b058291f2e28620067200ad582a2580598d0086042a14b64dc2a197030d5bc40076905a1f5ad8119c3a7c0400c1696f0ac084d276d8f140142a5e822640b8400549552ed822e5599cf0c48b051d3ee00b34f124be640023ad40e6871e90380e22307110c2a289327cb86b4980930f0d706c992529f2de04ac40d2c1870f5cf1681ed5420943538c00022abe1e8e244686294680c26563881d8e01160e82589d810196c55dfcc12a0463bce4dc260d186060a100d2c7345370318226cd1055148123ca062cc03432d2d0b0021251c0f2939628c2485302121d789d0590e9088117694c330210a60427b80470b648b3c4801e3d68407501aec0224dcd0b2a64131bfc10d28a224d0d1a38d88013548c70c54b1367a8408a2f1938c14242442071061703788d7166891c1b5460ce68c201487c0668a1871acc7839630167167033a3659300830e67b4b003174924c0880e18d102973336172a00f6f0f99490040c674889a10985155e7880064e56388303289048832b824050549633320840eec64aad74a08295336ac284f9a10706a4b932629b2186093670c600198800093448cd98400e3ee8a2dcdcb440c169c6032ee025ed41424e0159a898d1c500540998e2880ca08841ca0c14c66000890f1d5748f18026665065218305175638c1811024663c0981b42b63032042b030c40c206214d5cc10169fe8cddd9ee4464fbc9a1aa37bc5bebc3e59d3e6ec4d01ee44ef13c64a523ed4e05ed3da87a23a34f5f52e06e270f94f5fef97fb9ba3be86713e74679df2f40f87c3bd109f1f2f840963a5dfe07f3cc6ba9b9a51ddf344de87eedbc6a9101f1fba7bccf49a3722ff1ba740408fd7acee50dad6bf1587c37ded316ffbd09d7b9a8f0fdd3dff134cd79ba23df5b7fe6c35afba57af894b6f6fdd4b5fd36abee96f87d757d5ec43f7df15ef9bde9dcb9ff7e330d6dd708f79db71b85f519d73eef3fe990fdd2b5a357bbc7fbe5e3671b8f29f872ddc578ca63e1e98e081890722feb3c3003c4d6f2f2a67a92422968a9dc28403a2a8820a05a4a0d79a0e1ed02102ee1e25e5ee6ea57ce06ea3407137f113aa8ba1e860c4dd719ffa7ea70eef4fea30e272b84014eeaeb3bafe7238c20b0ef7678a515d0e2e90396071dadbd01aa21c5caf356da56c940753f5f7c19bfa348ae4afbb8572b71eb8db27271c8aac06c81ba870e7d1414cf53bf5859ebc21d6258cfcb4b76dacf5fd5e5e9536d6bac41bafa69a8fe82eabebb5b6622af3ae52514bd6bc3536d5d2b78a661feea1523abd5579f5f94aabcbb443f56d87ea5288110fc2411122418204093244489020b62048eef6e865e46e81b8db22774be46e87dcad90bb0db240eeb6f643fbe14f4e5c6420b920b93bcfc91ac8dc56206b78aa61c7dbd26b7ab1c5cbdb30d6ddf2be6dd9ee6f3b6f18ebb620f1b70557fcabb28534d5acde2e0d59d0c0c5fd6d3a88a96e78d3c07bdb8aa9d60cbce97459c8491a6867dea66f3388799b9e41ca9d9ce1df164c7dbe4bca00460739298395dbbeb7294eca90e3ee7bde8d7b3174e131c4b0e4005db8af99b77f378b039c0efcc1a92f631f9086014d6dc53add2fa757bc71efaed7f759b59db79d53fd79ff7c2afa27927bf8c5dd7e71b73e3db6870f0d3298d91e1600eefeb2332c05b0c1f55a032a32ad80a29a9c96a48e3439e9e016a564426fee96c7bee581eef4c78414e5288a511420518aa2104571b7185c6077d81d1d16e4b038826a79c386bb9fb8779b36aa3a09d5f07aeb8510a2b48250dfcf34f3ebd0df589f58ff5a3db59d9a57e06f150337eee5a8afe9dc4ff34cf5ae492d1e74440c4632762aca636bb85b1a2fd75350bd1bc567eec0ddeab85b9925dd6d8ec549000b4d543455d1c7b95f71157ef200165eee6f230920a68673b60a2ab624c08edd0a0bd8bfde0a46766a4e3fe7fd2a8851c18b0a5edcdf666fac686dd2d8581a5b6361f695c6bad2d8561a33692c2b8d1dad68c334d6a6b19e260550e9dd57c9ddcfd8a9e8994d8cc4ddd194e1aeb746ad92acc0ddad0a3ca005c9031086549ade234f4c358df5eff47775f87c35a7b95f3e377ad75f49c3a9af77adf0af5929cda15ac5faef6315edad7953ad19f8c174f72ad69967fefacb1f7c4debdfbeebf5f9eeefccabef37d860af17781f277d4d9f195db14f457b39f31e87753735e378e6c5afcb98b75f5d0ae6d05eeea73ffde97efad5ecfb3d0effd68dfbbc35eafe98b77be87ef3314f0a8b286a381edc79de0bd4eac5bd0fa6e9fde91fcf9a75b877d5cf4d5938406651b38450c3b9d768d64fcbeadfb2d0d858f7f8288256e5d547e4843ff107d3970af2ddad7be8f6f5eed6b8876e2013beb42c704df18518d60934900214b89be0c38497fb0ff9afe1f4446f6afe35eb482c47b8d7f4e5fd562fba1e49d37b64ab38ca8c828504772c4c7ccdeb2a6575996a184d7dbefb698a6efd20e07c3d330a6e4a0e5d4d8dcfd7a84e977ff079d72d2478a97c828282847a72e61df91a36d19dd5fdcb1bef3e787be8d50553fdcb58bd3bfdf550adcbbd5f0fb5babd60ee31d6617d73c1bcaf4e331d89a2a2bf53bf9757dda39807e56bda447b570d9e695eb79acd9f56cbaf6d15ebc7b9cfe805e2157dfc5bf76bf4d39c73c18dfef07628efef9f2ac6bcadaff92afaafd11782d5fcfbbefe35ebbea6811001016294d507e675f71af77e5adfc750be86c33d8eca097783dbd7d3785f133d5515f3f6d3d2fbab82b1899e2afa19b897be967feb9bfea95e4cdba9682f9b3877aef955f47fd4acd6569ca6b7a7d3fbdbe6a5e17d7be8d6f867c555f9542f30ab5454ebedf14c15e7fe497eb22591726afa1a1601d56faaf9f19a7578c5266ee3a8249cc6a6791fdf9c06afefb19affea20a65ab1eff599fa1e031f9b2aaa1fe7bb4cbaad5514f7f735fa1ae5497d2d4dcbaf9d50e579934440e3ee697a1f9b2f2488932218e1ee3bed24c20ad60b779772f2c781bbfef97eebdf147e2056ffbe101fea3545b021835978f0f67efde95e889013eba07a7b9fb394bb5fe064d087200cb59d8abe9034fde9f4af59173c5d0566954a75420669faf37edeee979bacd0f8ab4eaca238717aaa97a7fe723925ad56f0da8971eed31405be104c95d7dcf72e5eb7fe47ff89096a096925e5feb6136b275fd34f4c47a2a8f877568f9056a4f37070ab708aa17059a7a2b78d77b8f49ac02cdc7da7a23e5f5ecffff957d1c722a0daa6a469a909aa8402ecc1ddf1eefaeee7ad035a718f029a78777d3c64d519a62351fe83b90faeb80a4df19ad1d5f798ca44a5aaa270f7e9a1ca3dd34a839e9d8af64cabaa261affb4467926debd6cd6723fde4677404036eddb9bf77bcd3ebcbeef859c78c5bb1dbaeef587abd0f32f59155415e4fe362b277f39fc0ce06f53511d3e312fefff1f357f6de3f31f889b5e012e24608c1f5fcfb4fad91f70ef7d561f052e1bb8fdd48c6f3dd36a1d410892f87aeb92234bbedebae4bc78895985a94a4fcd28863a2fe69559c9ce69547acf8b453006d7ad26392f86d228d3ce19caddc30881bb83e003ee0e8607dccb3429a59a9ca42c41392d797fc21dc7e4a4e996444919159584e98604aa84f2e4e416a564c2adf85f975f8895877f15decf678419ee0ee5a44fca7d876a74a7bf1e906ff4da89f5ef71ee7b782ff5f2562fefe976eb80bb7be1ee1c70f70d68c0ddbb70772e32e0ee1870f72dc80bb8bb165ddcdd02f6869c85bb57c0dd29e0ee1370772cdcfd0a77b7a20a53c55ae35b38c2a6b25251a9e8a8e4a850a132a3f2e221727fd55a3177bf39d913805e6b2bd6424242b5a09ad08f9af5d40d9f2bd652379b4dab19d52ade56d86633b12f8acac4bc23ee6e660a775dceabcfdda588c21df7d07dd3e135dd508c63d21d544f4e8cb1394c71e0263ef311fb83bbef9c44910833409fd020680e777f2243fe6d38dc6f7d7d8f4df5569d2a9079eb9956369b9a7bbd6cdeb456d1bbd56cda6c3dd38ae49deefeb6d751695aba3b134810381263b40410258a92204262288abb1f211405af7889038c70f7228858331a068c56d18dd3f49784d77c4445b3b9d1a413edfdf08a793b09946c6633439d2ade1a43b9bdab7f4c9e78faf2dc7d88d78d6acd4ac1248d6aac6225c124fdd32ad66a3e92de5c4e85d8ebf5b97b10afe046d3bbfed2a73345794782a9ea74f73dddfd0b1041cca401e95db18a95b8fb0fd854efd6ead2c669ea2588a982868298890f454656f854dd9d0127faf21edc9d6acdc08dd521a273c92c83eb4f5fbc4aa9194555b4779658ab588791a41735d1f3d701ae42f74d35bac34dd26ba22acfc452b80add3f135b2571f71cdc79f01553a16a66daa8eac4dd7750807a795278cd4cd997d7a7ad2f6eb2cb5e56f1e9ee3af4b2ba2ab97b0e7ac5b91e66c2269a9f342972f220c0062ea69b565acd3e8da17a669433753ad5526fbc5bafd456f1bafe8e04f58a511dba73138ec2787777d40e657ae2eeeb9a84ca29899438bec45074852d57cc5d972756eae1bdd4c37b496f14ca11bcd5a50b94a2fbb7e2ba70af9d585fe0a7e935bf24712eb8bbd7489c11bfbcbfafa23dbcd1c7e94e45f59724eee5ee35bd7f39f2364556cf21a2dfed057777e2e46d88d7d21403f57d9a8aabd0ddef54f475f9bf164cd39feef1c6a9af97cd133d5fe3d7e524283c04251f7aa296424fb68a7bc1ebbb617db183200409c2e9eeb5adf16ef7d3bdc7bee0be98b76998b755dcfbedd6fb98b7f18979af2fef1f889b4c1005c44d241520dc75f97b3f153f0ef79827a535d65bc55549a8f04c71618a4bf14070a35bc5277af74562046408e3952745754d133331023274795146408632500a53dd3469880878a1848880172a880878a1820c012f14d210f0421d0d012f94d110f0420119025ea8a221e085221a025ea8a121e0850a1a025ea82042c00b852404bc504742c00b652404bc5040848017aa480878a1888480176a480878a1848480172a08f04221012fd411f04219012f1410e0852a025e2822e0851a025e2821e0850a025e28ace626bdbba9d25db75592342d4d8d3261aca4b12fb86d369dbb6935eb8ba19086847e1f5c59140ca0be7bc3fb56a1abef761baa15d5827e7639c5eb6f5fac7b9c567fb72a2adc89d3dc5531bafe043195bbffdcb57b8ffb75120a1a07de75a84624540bfa518179cdf1f4e59150b258424229e359a72ee1f3ae3b9f93ad6f1374a3ea9208687a5554294930f5f94aac2fefc9dd666b62c1b87b94934f52df265ed76cfeceaafed7a16f855fa38f79522f04775bf30d77629e465554f72b3e53f497a4d79a76b7aeee5474dd5150379fc6bdab1eb1d9d48cea15570d11fd8aacf849df56ecb3babdd5eaf68a0cb1ba3d13d52aba6e2b7cc3fae68a0c11fd8658dd5e56a57a52277077a9153f7970cdfb9eea654aef8a7d4ee9edadb929789f7293c61fe8b596dea8295eabd57c6c9cd2f6c5ebee776efa9afef4def467a6d7dca9e8a9fe6c29aec2e9cde63c7d7951adbd669efe9cb70deb1557e1f5d525bdd678faf2625150452ec4031d7c6bacde56bcd19b897d1ac8c4551e0cc066b3d9ac82480f8e7800e4fe361ceef7fd3fb15e6b27e6e9cb537f404027ae5ab1c65018af4aa6467b369b563155defab7ef8ec2a67ad39b74a618fd60c5554e27569d6cdf6f5df311a5f326d96cda66db6bf6f97efa867b77d5ad795d933cb9ebe07dc25877d3c1ebd3faa647b4bea90905e88402d3164c629878343199dcb8fb13262a7a7947d0bb2f129ebad4b4c4a8ca6673779ebe4b8a0c31f1135dceeb5394cd86d175df7cfac45ba37ac54f77df73a77bfbdeb68a75d310d1af2afb6e56b7b7e4b6c40b1275c91df7721456739354d6a94b699a8fe0152fc1fbeef0badb95eebe62de76daa149394be5a634fd29dd7d919c172f392fe6355199394da25a6f6fc5fb0287887e2a309fb7136b8dcdbcfa8ae0331f793244cde80d88d522e9dd6a16015d33af8813dcbb9deb05fa7e4b45907e434cfcc466337195cd766e7df3e9bbefa9943b976e78cde60dfb7aeb120fdc9f9c5cafb52035a15ad0cf8f89ab6e5417036db61beea15bfdad4992c82418d44ebc4decd378c5be6cea57d15ff33671d59f18c995b350800cb8df7d91ec509d9a8fe814bd1b233971149593cfdd77dcdd3c92e3a64642bfdbd62baa4b73ce6d8d5ae19b4eafba43f5fe396d15a33ed4c42beefd345e7d793d87887e679a791aafbc7d3b55ecd33f9de43380104a9fb28bbbebbc6211707a5e9c7edeaf379afbad62d44475ba9ffe136f1dcad3e6f5f5b209a4665423faf9096e74bdbe9d8aa63934ca66eb99562aba4357277723c11a34d0e0839e08cf6fac753a56911f0d34782245fe54f113f7918911ccc84206ee630717b88f4be3925148112ad6ac81c822607cc9dd3b585aa244e98507b83b769288187aad9d2aa6326fee86d175f77eb2ea7ec4dd47f72477e7ed13059e01265ab5e2285c908d83294fe3552908929dd5139b787d9bcc288b2037828cee4851b8d74cb46ac5faf3466a82848484e4fe36241e470c38da72d4415e83ab5e3750d0e73223ed32a329971949719991548880d006a3bfe81320613810237c88e88c02b2822ef55a03da454db82daddd6cb69e69252b228950f0369a2e654457ee2a7ade24221f0a63288c27ad99740a5c7099d018a12aee2e04158481202982823c8dbbe3f5b7d3f49e67f9b3d94c74c52ade9d5875026444070941ddf57765402493700002d012801450c872820958aeae9440c2cf1877d7447a45353e4f3527054d8dd3dc5db19afeaa54f45cd2414c75dd432be1083f3677177af750843068b7b01a5d18b7d046b0da565221700333de96ead76b0d28f5f550d90651dcfd44c35fb8432df3f1c29590f90c21f369c1dd9ff6cbd96cfac84e45b513bdd67ac6707f9b3ed55f4eca3abdd6d69ccdd633ad7a82dcfd91b82bc000321f45f88a79e6be3d998f29998f270e260a990651fcc9878469dc1d049765e073cf2b16e14795ea6570d3c301ee7ebbd5749aa6e9bdb99f0efad233f77a1401001400708003e002f71b6fa3c07b4bd37bc355283e6ffaf2cc7d73521b47855348e811cf680744578489ced0cca520bc4f42dccd3d0cc13d04c13da4e21e4e710fa58451dc4328eee113f7d0897b28e51e46b98750eea107eee1937be8e41e36b9874cee6113918cecbd38cf5bb1f2277e2245de8a95f7e9c92b1601afbada16274e18eac4698a3201e2a628190f12643c9cf0189f908044456154a76e2a2b54b77f3977bf66629ffee04c090988d633f3a63ebc3e1290a8a83ff13e6bda8792cf21a961aa5ca5a2af5ef3ee7b669ebe4bb65ed1dfeafbadf199e69ef7614cd57ba6af519939ad699bd61afcd7eeebd01acff76ac63c1c5eb74fcf7f0d3744f4c3e1b6c6e99cf2f6ab9fb79a4d1c50ffae89738ff3a115911ab266a51e1c4fe3156f9eb9b14e977b1a552fcfd478a7f236aec2299a9a3f9bb743d3d7f834d1add1342d87e8f2f591c26bcfff65fadad668fab8225243d48c7b59ebf2cffee5cfbbdf59b5ca495ffb51d1bf4ff29346817b495d7fafbfb6e2f5fa685fabc2ab0f17f5359f8d7edeaf7df86eafe7f5d7b4ef32d17679fffef9d2eba35534bd3b4b7d0dc99289eef5fafea6e90f43e5154b517313eee523aab994a5f4897113eedd2613fba25a1f90c9b6e0f56ede676e7280ac460e31c050038bacc696d5e8c96a9c359c6a30d568e2befc3e19f400bd4f06ffb40cdee6cb4fcbc0467b10a6c86adc90d140e3d3b3afcb681421a39124a3316493e95ce0dc2aaec2372b5487575f9aa254b7fdcbf8cc1aefaeefe6d354ebede15526fbe28ed5bc93c9b27870fb7ad81614e1369145c98cdc7dae8af735d57ce477567b3eaf4848326c3bd566cac82d23a3c87246f71c2e23917668ce26cb1965395f4877f71f594e161e307dde7f62a22a9b2d27869c01c87242f09adee9ded3d65a2824b4a500870b83b88748eee15108c43d2c0a87c220f710c83dacb9873fee21cd3dfce11e6ee01efab8873deea10ff75083b0877b0800f77016be7bc8c33dc4c03dbcc03ddce11eeeb8873adc430bdcc31ce10df7d04658a3ea060bafed549427bbe9c179fa9aeec3c96efcb41d9c4b68d09471a27aadfdf44c2b8c75365b4e06b392c150190cc96bb9c7b9de07d5f597f4b5139f36db9a71293893821ef45bf1b93d4df76860e5692b3e55ac7b8298ea16ccdd6eb5d1034488fcfa33c715584264af97bb6fddf5e9cf2a4b94b9a87067c964ae14dc7756b78aa39eaa506c62a8139feb35358aa48c5292b5a490b56c90b594dcd7dcbb6dac6d36dc631cf5355cfabbbdbcf5cffc12c946efbaff316f6ff5977b175d575c955fa32a069aea2fabeafd35eb7ec02726271b077f67d5e764c5407d81b5af99af4f5c75f59fea3df179738a81af2ff06e9d7977fd5e8ad75ed6afcbff5bc53a773febf46e5ddbd5f0d37cb9a76974c55fc3bafb1beb8df2d0f4aeb887793ebcae19edf5f0464ff59a7fe22340dc849b82c3bd1c855b7df9d5f26bb8ad39f8bcd58cae18cad730baeebc359a3f98aa20e070531eff36d6597d1dfab5ad6653fdf57ad97c9c4337d6d9ac01b10a4212244e476cb65b9a62a04f4f010187cf6cda7053d01548bb3f79f77b8dabd09d9ab37e5d7e0dab19a5bdfebb55f4e6fdbabc66dd3f31412dd939bdb9d7e5d73e8ca9be06028e2ae725b8298f795ba3fff3672eefd4607aae19a82e7dedc4db874df36ef59e2a569d9c78a7a2bcf477629e19b573d3d67949b9735330e9c41bcda1bcbc3ee974c5554e675eee1a0127c6af37da43d37f180f959953fc2afaa1097038441a42337a2d9bad0b4f10c5099070d376022ae76d9b57c5bf1b16e196cf9fbefb9e1b6b5101643c4da9a8fad3fd11119110aa83fa9240a5b33241173b86185669013f940006bdd6b43ed3bc440731936d859bb4efae523c7d9768ad4dd497a5b68aab92e89c744e3af78b5ab10a740a62267acd4a5439279d78ebdb446311305e95eebe48744eba77d5156b273aa7356ff32a61ac84842401958b4f12ecb8fb4a8eb19abfd34477b989546faf99c96e7101226caaf85705ebbf438f454075eafbedbfeecec3bd741d2e51aec345c7756aa8c2dd7108d10047109d1a1ee03a356cd7a92188ebd4a0c375b68ce13a5b24e03a5b7c709d2d30b8ce969eeb6c29729d2d35c4c8923413a3c7ddefbf8e1190c1d3370123008384871158d572e8ba5fcda8024680248308b0704c8a6006f7dab935dea1a7d5c28c05cc64510133143063c6cc04341666cc5c61c68a508bbbade244dd2d6b9ba5bba5224a6a637d73dbedd6e4b4140595e4c92d899212ca492aea76b34939f9c51627bf2080935f90e0e417ab935fa44e7e8173f20b2927bf58e2e417439cfc82e6ee2eb2459e19c3c9335c3879e60a27cf10e1e4192e4e9e89c1c93326387926b774a8b05c67ca095c678a065c674a15ae33c508d799e283eb4c61c175a668d7990282eb4c51729d2947ae33a587eb4c215d67cae83a52c8701d2918701d2951904edeece0a8816304282747487272842277c7910991b94c48cb65b611b8ccb685cb6c147099cd0997d9927099ad0897d9bcc45a306bad2c0c122e0bf383cbc26c715998155c16068bcbc2045d16a68acbc284e0b2304b2e0b73e4b2301ab82c8c0d978569b90c0c0a62b21cd9141b2e9b12739994335c26450c9749c980cba44ce132294cb84c4a035c26e506974951c16552549749d1b94c0ace6552a05c26a5749994229749e97199941c2e9352e3b20fca70d9072470d9071e70d9071870d9071370d90752b8ec8323dcbd2687ac71e3857343e6d4c8785a5cc6b3e2325ecf65bc9ccb784c5cc62be2321ecd653c0b5cc61b5db64381bbe3e4e0d0b121268b93624a70524c1527c54871524c530b87cc46075c66030b97d920e3321b0e70998d1d5c6643002eb3915d6603e7ee3636345cc7154e387945114e5e418393575c71f20a9e9357984e5e01c5c92b989cbcc2e6e4153527afe8e1e415384e5a6186935688e1a4155e386985164e5a218593568871d20a219cb4e20727ad388093569ce0a41523386985cf492b708e0e568dcd0d9c9a1b964e6cc5c1db2437b9db28cab80446770b05193fb18a7d5649766e3ad3bc44c52200738a9382a9eaa44ff5a7544507be6cd001243f395e74b1447a61e59e841735685f2c0a1c68e25cc00879369045bc80dc00001c8b80ea9ce58006b6bb7b1796117731c8dd76905e73cc98279c9832e3368813ab4ec68c1933668c875dd82d32d8c286bbefaec00b80f1dd15f879df0bd8e05877f589f57dd2182ba94ea0f67a77d4ea418a5e25bc532fef88c654570aeb159fc1f33ad92a8e2a2d70020b44e0c4ea2f7833d7acc3a78a751626b8bbb6ba4c2b46754da082e7c5504fb5afe19d7b6acee9e3f57e2da8ded7a14fc3bbbbf56b1f357d357ae2735fdc10d10f77bf06cc2a15159a021f03bfa6cbdfc3bd35eb54f431f0b58a4dbcbebe4fd3eb4f3f5eefeee555a7aefa97d1f55635c9a6ce3ce06b5d663a12e5f346f2359f34bd1b7d1dfa423d7f629fefae7b459f7c6d45afef7d701af727a6190119fa214c75d31c93f79af6dd75bffa5b639e547acddc4463ed445ddab9495399b9093037d93f272a13f38e9c3887aea6cefda272d379936e529abbaa9313e3f587a39cf44cabdba9626d85cd8a2277df1a9f56d838a9c20ba62351ccc000ac6206ec0bee9e69753bd5ebc4411540b69d8aeaa7ad5877cba7fb0defac92546071f7b7bd46998e44e99956b77dcba7cd46450d2a6aa8b0664c1086990ef85b9de80fc6baa7d13eb85ed4447558c5b9a73ded7fcc347177120a199c84820527a128c14928ac602d1e3c0a40529939559d6c8d7f55301495999b688c95f06ebdbc234400115cf1cf83bd629dbb65d91872b85b2e3e61acbb056387a07272b742006f1b9dc26766d2182bb9db294d65de1d85d3dc3db27393bb0d02436db48736e999514e54671f46b273d38957fc949ba8ccdc6463a69d9b34c64ae9c5487213d49a7d5649cef497a1a84bb8779b9eb04eaf5212df5da57c56497296d2182bed54b4c9ea32e11e7ad323bfbcaa4ef69a7d48b008a8d565d227c6a6559233cd4b709abbc0bb9ebc8d42d92b64a953fd65a59d9b709a4397766e4ad39f528aa5d6ad3a519d38fdf00508db816dc00fd8447d795b1f18b000f7232bd6bf15fb7e513b14afb82a4735b94f8fc65847048a1a143ba020dfb6feeddd34c6ba57d17f9b0eafb7bbc9a0f1b74139414125791e1e9e1c4e9229820c1164b8dcd61b0de86d3abc02e95fea5b7ffa6964acb83b199c7b6e2233448687ccffa9a254ff7bc555ea1363fc13543cd1e5092eeefe5be7deeffb78457f55f09afbb7ba4c4f58b93fd1c4dd714a697a8f60dd4d51dda7e93dd2049931e713a4bb1364a4a99a51f4e684144488904eccb0ae9867aa17afef449513f76d496e5b679f133b9c908d09c36fe97ddbb6c2b4b7ad38cdbcbb4a6df1638618a3802d63ac7cdee6ebf9dadb9ee7c4e8badea4356f8dc7d4c60060cc8ebfed696fa3adf9a7675aa50003739a963b37ed9ca1709abb297aabaeea44cde889b7fe5d9e0be9b52d98e8c63dde4659a0ca523aa85ea69ca5f4fa949b56dcfb69351300a7bf33339d37a9c91177bbc200dcad0a760011d0a283982a022078046e6a414cf5e371e712f605a58298092e88a930d55f1598afc6ed54f454b19a71ebc5a9f97ae31dcf5c2fd61f5caf8ae6f48a795b4531f0f7d5bf7d980a57e920a6d23ef40f6b8d79504efcc3bf2a27cac3b9dfa92846df447b59cd663095fadad734ce4d3a8899e4a6206672223997d67c51336b5de6262de686efbcba2f21802582eeb58d751053d1702bde5df532e13e986b4ae2cd5c05512089002851e43c5a455f08ebaa24498000efd69f6f635d05557f365bd097d7ade2db5db78adaf0998f482539d76c62a8bb2f92dc9475aa1012db016e448f22f40d95bbab4e12f1844f8f8ad3217fa2bd303660c6707de56eafb8db12dc2d0976046b6584175400c3738f02536a8cd6703735e3706de75407bdb0ba4c369bd4ab97976eac373044149ef3f17acb21826a78b753d135abbba5bbfeae102b10220b7753fdadfb69bbf5a6bf359afeb6c26a172168c0ed9c46e17ec522648d56a1e7df13eb203e108216441141f0e07ed7dfbdebef0641ba7f01f343036ec82f3b7c39c09713be8c407e51bfdcbe7ce03d33cacd3a75292aeb5454dfd6bcfeae15beddf5777ba6d59a6f59a72ee9271fcad3258e5af35d7fe5b64a72d75fe9eb99517a66949e19c5c99a97acdc2db0caddfeb6bbdff577497077337ae734caddb286886c1523214783e46e6d51f0ae6be97be13487eed49f92bbcd678a4271b7aae38daaa80e2371b7bd54e794a6e189b7facb47a8744e695aa66907e7d2946bd4dd47cb73f5a773b73b9d9fa87ba0d5a8440e4ee6a920e61c4310d1c88820000000831300204024168d06a301a164d984eeec14000672ae66844496ca634992833008328618030c200618408c0130544353240037a257109f37730f41fa59c92bdfc5d3d4b14ea1aec268599f054e64ed2f42184bbe51301d87839b9017dad4f6e2291def6a962022de8b45e0b1cdd1a4d7a78ef03f7ee8dbaf1a9f986400ad5cc7e7d2834039b9f1fadb31a4748e08f975f313081f93def1629c501f60eb78789a5c308fab8647461aedcf5d2979c7a4fe66c78bcf41d9679c9c46513ab29455ed76ffedb7b703cf9a9ef4176381206dda4e63c290eb17abe54bf711b64ed373aba98f43d2a297960f9f73ae920d78ccd664ff834ec7f3ed66bb7e88e8bdac6fae389512def424af9a4100340e822e0d2ca99be84e9c8621554cbbdd88f34c4c75f21c1ca0eebafe0fdba3af6605d994e7d477414159ca1e3b97ed3bc85e3a1b4138fce353e1653794aa4c754e09a0e045b141d24197729afa289e441e97022db57a8e4c06500780d4ccc8fad6297e45b398045ef910383f466149b2eb9ed3812ba14e077c957fe4f991bd09c7c567747827b962446009b6cbec72110d4e52ab2ffd877051d45205c1d1e54ddb7526375a8db9a0c8d845d53f8b0262e75f4905da72bfe67bc756e4c28f523f21cd1ec20424fbf510d0e2e7a31eb7c9e307ecfa3d88e010c31ba6751893ce259f2fe93aa0826b4b286631f6b75d4e6b0a50471155f447031d94d145215ad0338ae6e3a3b9071b1bb886112cd1048e3c64e71958cd6922ad0335cbca9f7cc347f4195ee28f3e44cabeccc88b745df47e3ec968b1a4e851f1cc4278e9af66e74f8ea81716bfd841ead7fb720782da50323f12c7b768258ea1d697bf9d673c022b9edf85f5eb7693d7bdfcf59ca0ef9e55e845f409f5a9c2d4266693cc9e2ec46c17f849f9e0e2691f8829a58b178d65e1b9464d4bbe4b5322bfbe432d9bf9cc163b00676ecbecf7de9bc114423298475be98bdeaebf9b4bb0a3aa1b05f4343126d576f836cb00a055db2469b1bb1026c7943b4f869aa7eaf435b87eeb885e1b9ee5589fa4eaecfda33054ac0099c2ee2d2adaafe8c084066fd8672868ef4cdfaf6fe6e64877f20f7a6b6a35a4e8dddd088960785273c59a967bfedbaa586d9051e8c347f9645435bff350571c2a06307be5f25efa9a11902b9b917fbdfa163bf712ffb3c314adc3f3abdc3f099ceb05795748cc370dfdcc08ec357de377274ffa1144efc8e782b8376d40ba7d592d011197afad8065cef9a5dddc4381e6e4ad7531acf3e686545af20ce10401496a798af04bb03de514e82877595c6f58840b192802f40e024986bfda24c11a1f344da12350ff8a800e69a9d6085b4b666d09f196a2cf7b93bb5dbe633ae4d8f25f950c00e7586dd600c435d585f9034190a91652306c9de0bd4730ac7fd5238a0886ebe02b795c907ae56f0dc3ff93591b12e2ee7983f11cbe288fa52c1d6ec9ec97b7a9b479e1522632c458d7b6697b0256a347a92133fd94b2becc91ee6bf252710437b0fe80fb2e80b321fd9f8680a0186847a90f866526432e30fc28419ac849587c08910614a787629c4adc891f7fd77bfb9bd8bbf855acd0807b20f35f6d0bbc9f918953891ebf2ffa1fa0311cb5239a216248f9b448f60934142dcb2108101146f44a2415825ca517e9e1855decdc0ec580bf8581e2ca283a517b80ec5ec26c13d5b5e4a0e64f303d95da322e921df080ab885eb2e43927e416d41de2b546a6242130e5e0e98fb828e9cd4966d73b604dd04e26a82febe96c815fa44a493d060b5f82a1e36f9445688a6222aba19a70d9b1877c6e916d68a7a1bf7e26b44c0411b87a0662a3b74e5daa70f1d82363fc2e16aaf5fa2ff266f4f93d24001df98e90ac5224df43bbe0331144a8d1ba551cb2aab85467a495e794d4e06b6a8b7cec0e1fc486e24d122a1dea06ec98a78ae0c2b656135792a7af182994093c866b018effd46e522c1fee8a2a7c1cd7c458e397cdaef530ce9c361d16057a89bba10a2130d764c35383bdf6178ca14aaef61975489b3c67b4ec9fb050348f5161e1cc490912a4ff2e01cf5163b6879ef2d34861f37f08eaca6391573972082a28c6233b887e89eb0c57c7af721a8476c509d8a33b0830813d9201f829345004368fc4c6ce8343f765c45e433739cd879adc3477af0b92b70d46cb0d9b7b5a7686a184c6c0a09ae194a07c6b714c6d9d46a67572ee8e290e1442f71cf69f5040749a5f06211500edd31f10cb11c08d6c87d9db31b43c8d579569b67e199633791a5a9f2f155b91b7c7a7a6a883af1388fb71786b277ce4ddc09224677c59000b823ca270b6019269674270a0a07bd3a4d72cc52398c44c70b0f29a9f97fde8a10b77c402b6db0f662e8acaf5870b3146870bb63776781ccd3c4a06424bd7bcffcc05f0b219e0a5a63fbb8c31066d13288ce40ba515a9d35e9dba6a7d8dedc85a84ba3e29a99edd56adea99d3f48233503585ab657f6fef34adaba6a99d7ac3788df60b58ca5321e70bb5d80ba2a8e84f3abd3bd58350e1734d9a63d5cd45a3f7995a6e809c8c7e2ede5ba8dcf13294cf20bd9ba349420dd9bdca79aceb5baeba0500d43d3cca02ef5fc535b257b9599c5be8e00f1d675ce7d2381b99f9a5f385e4303d7bc7a1befb6e4117efce6774546a9104681ba4e425755b1636a9c4cf63c7028062ce0dec25575871151f3e7e0472e19edf312b3ed29913eea9e3f985e09d4308eea21595f5a390c5ef134d2b93d78e446f5e8f9c0d36051fd32926e164710efb6bd42839a8bb7b943c8b3ab69c47971694da488e268206543032b75fdcab61a279528ee215fa53ab2c389c28d66c618a20f9f38d605d8b089bece39fc71fb98262f7ac33d79c9c5b5c9cc9ab0a894280c7c136b3bea49b67642530362d93e8789d48f2bb094ed4b51490d03ff6683bc1af7a4b28e715bcbb485f0983ef03c1d787ec3b329f28a1fffeefbc7a63829fb434f52dce0a319fbeb82839d28b2953bcbb4a4d3bc60e1ed7e5fff054da9d1d0183bf8857740b57e22524641843fa76a9c89c9115c47fd1f44495eec07c444df1fce4a046ffab066b886d54acc5ffb573d351865a625f3ef7ddfdb2bf7b6a4d7fd193ff9494f5a1d10661bf06d4d2f6511d8e1a9b8d838bc5f202f7554c5dfc917a53fdd61cf6587859c45b6cf959ce79ed3ef8e2978bdd266771b204de8dda27ca2c529d5ebe584b92f4db3cf9b548f9ed29b33d90b90054fd0eb5c500f4a98ecb112f987077d63ec34d1d006b4df657ee198f75dba51ebe5bb7ed01b885186006e992a7b04ae1105707cc12872274fc00c71e679d3362a919f8ca970866c59322b65f8021db71ed36b83b1f0a04fa622a137fb697e7fa330a95af55e1c43f32ed7b8364a71c34aa4790f9c6dae4a1f5a916c122658e8039dac77259abb96281324dd58faced1bba9f1036590166f9f9ea986ee73d8bdfe23f0450c7104279c2524d9f94766fcecb77a493ec0859ec5a62819aa275bf1f06ab644a89a101ed82ff5d185b1f7dd275ff75d9e3b5e04b5b8b3830e690645c1930d2fdbbcdec533713e90e0d61c61cb6f10ce74b785dfddca69afb84f96834c4ffe138dcf006c95d53d92ae5c0f18fc2f1c3440fc163cf5519e716f1cc3dd0532d08fc647218b7b7da8b843630ffecc250d5ce6eafa9d99ce8ef1aac45faa9581a68a0764c1785fc216507446807f1a922835401316e54b21fb11a196efb3bd23edb4501d515995f08f9eb05d1471ec29c12cbe6df33946effed4a140b9cc90dbde61a2c1dd2dd0f4f9a12843117831700ce614493479a672824ccf78bb9db96b77f812c87990f10b0d8ede22d12d2410515395e185c7b093ea184d101d427d18a58161f39163a10ecd48a2d7261e0a1efdc8c365ede845d30015f38ed15117473697683e943b89055ad51506805645deeb74fd79cd6a85608523a240b997ccadd2c8f9663e8a0ffc6a8026c831b2c4c4fc23eb04f704802957c328cc550923cb06127578cc127414c31c290f82196a07f2a311b90bb020c0a834119d5b139d1d8dc1c611ac2350be12fdcddd58d86abf9f953fa03d73fa766030f305676d0164dee6591e07de9ca594006ccf20a0e5d0024287ee85f15bec1c05b10902fa0815a7502347082b412523630fd7e169f9c30bfd66693da15ff69086e1156df8bbe9b1828774ac4c9cc8e111f76361a60a580eb9993d73563ac9bc2dca3f7e677ce6fdae748ca66c888d41a46a02b135675b0e546728e206acc1b73d316650a480615f1f08594fa9f360b985dfefba4ca65525b0fbc5e91ba0ff8fd2c3e7b3663ea9c1dd56507fa0bb2ec08025aa9d9f8015c8120c3fd48fff6507f492eaf82778a2a67d3bf297ba2b86d6bec7c16369f2c4e2d42753f33efe584a9955d00004f780d66b2c3e898b77b1a141f6ff610692219313d8b2c9114ffb5c8e5279848b254507030c1f20f1dccfb4607936837e9bb4e10fce7c4d4c39d336dcd7c56e805a84f326ec59524113b796ab3de94ed6c2267e35f429d3ec6d3c2de9aeba753ccb214deddf75595e42763147276ca9324d8d73f7d27ef34dec3e2cedcce51a7c0cac31babf827652f91d68d7c914403324af8c6ed7576b9cd38c5dc9da7c85dc99b2c253f83b513271a914258dbdffa946aa191014894111e85f8e28465a6a34b04a8d92e4b3aa841f3c2c9c93502c08ed82203d716790c162c729e8fd365b91e3f707220645a675d9fb44cfc8f74cdf978be7d0fbface868f671834ab378074e446ea3b85fe2a4a1a50e333632b878c6c386b7ee00e787e6aaf6161e4abf223b3ebf52c98803c955e1ab86d00ac39988529ec79e4d7087944e31afc2c1a95d9d8ce52e5dd97b0280683a56e92f14ee07ddcab70b7d1616c02014bd31bbd944a9140f06056bb6cdd7ff93269efeb3fd5fef3f6ed9868e82cc240223ae09db64a43defb5149000c42e8c724f8405dda0fe80da8d668af578634b96b28c3186f1690ec52f6adefe428cf969f63d31494c41355bba4aa97256d49ff23761f8dc6b6125156067b71eb8c08a2bb28d05fa126eb9f11d8676e1d97a893f594cc381cbeae627042edf6c81e5f2cb8fb6fd4134acf2f6a855f3e180093318c6bbe8fe7dfcb413449f7a14bed6fee779a81406ff1cac5a0c8ff16195f5e1b811f4290fb97d4b5b2e386aa4e172c03d12ca1934f3099274bd2e256e469e493a9ba32a3952a7aa07d3f0b703b4a2d29c39eb54f2a2c836625fb0692a4d23e2f0f6e0957a98a16c70781fa5ad715746394123846f07668f8fc183cc619b135ef3e289a35c7796ef522c8d2b192ad03a12d501c206610f63babca76ccb762d34f8d8b2d261546530d70df0af937f6e59eed1845964498ae784110e39a18bc69dc5fde73b31834aaeb79586c123efc3f1c49eebe2ebf18655ee90897e80f0d1c47fb553cbc82fe4f82ee93cf2014cc33a5fe973943b637453377736e0c898f0c214f9efa1cf07e7c652645ff100eb9f34b2435367af270664724431184abcedb6679a02dd515be0c1a7defe2300f2dcd853c476aa88cdf289f6381fd4bb577b477b5c296c5dbd7c3574a9dfd54b8b67c385a5e92160ed0478f6ed17028061020b6282b8974f103618e47411a3b94c7cfe9d1eff3b73ac3d3bb1bf7b71da73bda57646343c35cd9bc4f9123066442a46c7f82333df3f6144b9637e4849dcdccc3d3887e61be39990437df1ffe63df4eac66d1a095069b8310f6bd3fa3779df76e01d03712c46c8390bc352800f51877ea7e31d3fe040caef3aee29440c1791ec1f327679e2c6e0703792fdbc55e9bf0eeba533a03e6be95fb897755050bf92042fb30fa5de193c67769f382e150e415aff19ddef36765cb8f0e408c333f9fb27ae4d92cf7ea69e23d1ed983b2bed5fbd3f946dac3879fa9aea9eb0963ec1118fcfef5d8a43ccd21d1fc5f07cd71babb3d1b5280dffe1c90f8ae2d4f946db2b418a1075624e63d1485750b2e439c7d3167313a764f62b44fc7c8e2d5b25b002821648764538b618de9c7bd270dece73241a81ba4a43a5ab01093f3063d75bc9ece3e626eb6469de6e1343e57a100bd7fa78faf55325be4b88bbaac1257d8338e2c9df43acde3e3e1fc1d9f9f35e5964894c77aed433a2f21335e5b3b14e13ad5f0e0cf2be3c68d1e9c44c7932b5cca67d6225e49cbd50b7c0e424a3c2df1ed69fe3406785cf48619fac3681d15ea04ee22315d70f2022ee9774349298a24b618ee43392fcf61519f88446f878c0e73d2685bdcae65b948e0e0274e121ade275d507bc6aef7c0dcdd51d2630b743a16a73a2f200664f1f3b78fd01ee454082477a5ca68c1ad2fcf0ad065422cd03214a0f5933d8d08b7a6156aeff5e037e84f9666eed6a72777adaa736c838f7b2ec93e763624a34149aa4d5daa98e09d0d331fc49238f9dba506a03208afdd8a8d4de169245175f812a8c044bd2e660e950cee25e7c32411aaa1f1db875fe20e37d2385290ebe8b5489e7053ea3c41d0688848f0d0e4f15bc4e9b84bafd08ad3d9005134f1538af7bcec6332b90e67073f95c10b941d913487877ac2e58f6ab09dd90a0e9ae46105ab67ffbed6113ca9228656f2024e48ece08e897578097b9e07e4acdfaf15c3f327bc40690448619581dd3f3139171d2f7b4929c7ad8f945f40d33da2be35178055545570bf53f442dc7a22559c6d1301366b076971e44b7b5bb82b579345dceac1a4caf3197fd484d2f0f265e1c3f6281975f29816490bf3536a002c3ccfd8f97d1fd980e52df1129044a339ba86e61bb754fb8c7c39e3acbf6ac8e67618232a0d6722369b19a8e4fe4b9c6843250074bc42c627637221db7c09e23b27132e1bee506a813639810477d8af11a3f1673c10ea9f0701e2deeabda5c891adaa771b1717911030b962269cb3c7c003790bd32579b7c5221dd3d1c48df0cceac682c8c266aa3bfe2242db51a8b271ceb3af0f3228becb019a375d9fc08fdd0a0e01b85f71d9d98b48627533ac42cbfb9f4a2c84324948d8b45ce444a16051ff5188b01252985e6329d0865ca61d26af2bd27568a9df3e73b3e230573142162b4c99d23c23b37d635d87a42fa5943f455c5e71164f284b37941c7517f18949e18429a1223ae2cae23e665a181f4e3fe46bdadb50e1206bd20fd0b4fd8ce6c2af404ea55744769fa898d1dbedbcce521e6e34fce27dccad2d8c55684ccc6ca6e9fa239f3bd02bd464f58ce95d1036be27b5cf9f76d607bd553b0deb47c85216459bf4aad7d47a94848f42c8cb1992e3fa35080d00c112f65da16439dd2283e6a2d708642aaed1fc8382bd7fdd62f133516feccd318b7352e0d268ff679d5b7a257df3565567d6c972424bd928399b0fa69767ca4540407e7ba9b6b1039e3ce367dd37f2ca9c30957503bab4ce64fbbb44e0a2ebf788457b30feca090e59855ff548d584d0ec0bdf94c78d2f2a050ac3bf0176275bb4b7d4d6ad9fabaf9d0319ea748d74e4684e4b1c81b1359dd432814f42d185ff859a600844c40d0e619388b97d9511629d659d547df9b9efb979ff6d094e6255ccf92f614e6074172d00ed884b260909734a3f14496975834fb56eaecd6d3cd7e84d68cb32df9ec88806abc855b18aaf05f1e6caab4a6cd47fe55617384cfbe48f5572d9069bee35888bfbfd9892820dd03040930ae6b50d7d974dbd2eb2208e6c16e8b69b7e85672a3888652df91e50ae5ec31943620a23452a049ab8b177af85d255015fae1195c392b0cf2723b94bd8b8ec8c3aa533736b0bd75febb4954769abb29d380ac4b41ca4c0ea1c148853b7182bd02483a0812dd5d5581cb97c9eabfa9380bc06f59369046d4527e7d4d98ebf0eaf64d59534c9aa5562e3e705d6e18074379b41f9c017a7961d4e418034d716928d419d40b6c8578656d50dffad7d6576cee27f00d421fc31031de53b75e138623aec92c47e19d5b9fad2dcbb75f124732caabd1af63cd115fbaa3504263d5472ceead88e10e7f3c991492acef25c63e3ef98f01f2f6c6bd2b7e685b80fb1f73097ec8e105636eae695318c7c819243e04fa1034e5e4fd171ca8f843e91944656b4827a5f10f2fc0f5f4d40f51dd1bdf9f6ea6c89539edf49b25266fef040ad1a2f2ac15ce83bea09c35051c5256bf7f654e1bfe576ac156182d9a338f13f10d406c772d8109f09db2a5fca8132975aee1bd0c1997caba148b19efcd236206a67c4205f4093cfdbefef4a0a6553338b80c6397f97cf12329069cb6034e0cbe2b323f894bc9bcecd4a4d61cd7dc02eadd686dd53fbb6e72c63b4097082f314aee615b01f81e5e185ca6e068f6f702523fd1c30dff87e6720d5123b82fd8687511627ec93b6d844f4f10c837a7fd049d3e6ef343c02f6029ff7a6e30bf0aac7629e82f2090c319113ff3242637d710271b1c40b07a86247a256dffa14a6b84cfa8c7816bfc8a20ec7a373c277212177935223b07d1617185b1c74bd699a391de67cd5e2b1b86f7ade31223417cc731d3c7519ccfdcfa6e9a9ce774bc7a46a7c2f097fe7970186ac1ed8ce3f27f8be179a7b0a52bac879e462f85e4d9c427218846e4df0aa278bb2c507d7f0023fb215a24bbd8eb3f1550f7479535dd1642675a1c56f287c87ef6541b26dd6358edecd59341b078944e061ebad6de2288ef2bff6698c2c7f6ac511f9d0c35d810df668fd4abaed7938c801d4173607dc21784524c24754a8a7446444832919a7fc2fe78114cab47c32564ff72ad445859edd6d0e04f7ab72acb07842ff4a26d96fa27dbeb929a88fa207c32f3ae0b52b45fc0da30f130f6a5072f01b0751efeb176c46b6d978710ef879b0a1414e339f88b6d632225a754c97dc9ac244bc36383543b4db39f65d045896e3204ee362ab2a1ab4b73f66f54d652c2aceb7a4b4e4f007dfa83aeefd2362d864fce067d5f1f3ac204ff224156867a04aeed0205fb3e631f7b18a0d357b5dbb70dd456b5a18f9f70b4f1cca02e0bf7713e85b03cb156ce05301d2ebd94089e8341360724896497feda0631341ab34d94d1cd5765cb5c10d3d2dd865cd5ecc15f18297f5d1a5516bca51d65300168896aa9f1e32a9d0dabf9edd01bbe44b24cae88b330faa9ead39fa89c8ed651517f70c0fbce3d3aa21dfca63eef68a6f2384e4e2e252a714e7178a0fba0bd5fdb4fcec6c24b493450b083aada59eb746c904ed92017c3d0f01f93674702adbd509ae5db6523a8e835eef592144eff7e9aa93ccc61f5cbe82ce1abd8cc107571195ad1bf772adbb2c115ff37a5b6645dca43634cfbfcb187564fb05f185dcec81f67170ef13d39bb0970ea544361d61e4caa9bc17ea6d3e695466edc670cf147c3bcf076a4edad495aae82270e4cea930975dda2c745129098c8da38a6a889790d83fb1c0c6b5509afa9d26b39609976676d6381ff3832e848f17818338b81f64f1f8f966b5991920c376f4e79c98c1a64ed7bdf32165d8a5f5a24010edde53c7b999a83dcbfc254847fa4865f4d53a2c7d6fbb343e7ac1603aa734fc98be2cd82a9f840c839faf1eaf0e3eb6f4900e54d83a91e6dda1b119f841b5994ca48140867c5d5dc397bc0ff77e8bbe42ddff37ea8b1f0aa8edaa4ef9d69ccafb7b80d91e653c62752ab8875c422e9302d4f2e972b408a16c7d0b6906081a6e8b56ca9f0d30fa53e2d4b2c0f9680308521e9e242d1b6828b902b06355b4aa8d610e194aa394c872d967c7f0ad819805879deba92f68bcfa005e2c02a382974a3a3440947f48a0c2501530bf0e0a985b42619f406aaf659ff6b03fdc88171501206693c53fbab4287b8834adcec0993813c3947e5a3e6c2dc95b5a1e82d6ddf26896e5fdbd0f93f584bf10dd872c08b397477e1b01ad2a5392c5a3953e36d7b234a9cda7305870f1f72af641dbd34bf611ca5655a2d26dc6d3eff9369e5b0d8a368daaf83f8be4afe7e003587dbce1dd0cbbd0a0cef289ad1450336fd299f74e27f7b36dadd5e881fdf3fabca2c214a1e447df989554fc5da4d1882261bee2cff2d57389599d7dadf04a2bed089e306c3c17694056d1e374e05b279545eae215a2c384df47eed6f2354e4eb7d77c99b07a2616a8b19a932ffeb5197a6916754d1c491fa09db292a86b69d74951fca9e956caa1c180bdc77f99f7d63ed44aa084347d52a826bce7c4eaff0dcbab37ae208e111051a70ad37868b5885d57e26826901c5e3c95ee573998047b4f8279345a30d83f29158b31c8ea6ecf780d1c51be20d9ce70434bfd39a3d4620136b7500988c4ce60dcac91ba35426591e500e8102ea08ee94dc98b2ec1f7eea1d168d8b39321017d77f7472219144ba249ce880fe0b62ef1a140a742c720ed21477b8272ae3d413726f42cbaff01ee4aac49151bfe3b0771439ee77a8733906c78a9c90cbb37664f3e2e7fe924b5a70084104bb9f34fc9a285a1ba6160cfaea27eba33de686fa013a683e8221d519eb1a957d5df46310e48625bf924de2fa51933f7bf134498628177bf7bf5e71730703dcdac3a7582ceb12c9341c336b2a42d3ae0f1812d913c61af6f92e3f737652fba9c60fb276eafac7c7302f1c108866bc85fb00394312319fe5a5338a0eeeea22d2c543cbf5d2791d5f85e6ebc78fa7374159e042af62caccc5b30e982d61c8d5dc66e151801ce1fb95ea814b3cefa1fbf5ee36770f3907c84c94c4804cf437f9e73f8debe656ce34862336916b74b8aa28771f79712a10b2988ede65f876dd63228756c802e92754d9ded98a7d996a670be897ac6cefe856e455c3d4254ceb77109cf627fdd56b48894c3705716e3b625c293d9db2e1c8fe17b727a243abbeaf27802b52618c85d13b151b9e13e726456ba7f61e151e7177d43b6081cdc24b8cd72fb667ea444213b460ec7da9ae5297627e2c5ae82a248d573a6c46409e76a5deea476e8b0c329867b976c391121aa187e5b51c01c2bcfbc946c4f7a92d6fc329648b1cb321d1a8be3ec75a60ea3b2abe7003f37a97c8c8db8d12329d937bbd6b6f5298674b9da75e89c4c57f0df3e7d9487e625f395b6481b257f6de38d25c935956b5bc57c5d7609c58745d573d1e94ed65e14f40e4460af4f62110e60a44b0288678524fb2df86218c13dae241074a989aa17d80cdf32dad6e521150e2beeb14cc95adf6a6068c9b60eefb2c53ffdc198d1eb7c2eb7c2aea96e55a6aaa9de7795d8eb2d69bf0253b823a6564aa8cc97a2aab8185f0d32321d612c4df10d1eaa9bb0748a0085c5e38d81aff73b30b9d4d0c517bb167f754712e6e9d21cd4aac67f5d37add1ebce62fdbfe91130ba779fc629e8f17fd72d8d37475e0cbde7dd747cbd5f70e44739ef17a74783351ef91297aa94b0250482aa8d05734fd23c17819ef32f9c1c7d3678c446274fbac08690c58771414eff63b2a4da98ec671982431cb90809f421a0237f6c108cece9dbce582ced8185c052933add7c4926c883e9e76eacbf46f9d6eeae093fb79e72151c989849089fde394bc2dee135c6d18a91e6de6b0f04ddbec41ef97163ba67bab2e37d30b905b787f8ec4b11bfd54d93dbd7d8a353a3436dede53ed5c850d4fc0ebd29bfb7e183874e1bebe84ff0a46d3a96ea72e6435e1e1cf75dbbed0080bacbc18435e0ec9df23a1f3140df92a7ecf4702c0923fed3fe598b64af98a79fca4fafb0910540533354c25ffbf8947890681cec033a81cea50cd098116a948aa183423e3c801a7b7b10aae9cd8884e49c4623f4f3c87f80a38405bc51fdfdc3aab552d9d0ed839544f5e4c4e4a5250eca33e7aa3b2828fc3bead73bd2b3d65d9a03cc64956d4e4e382063d00d0e16a77c79650b0ce0f0d762b9263adba3b254455d258495a2b19facaeada336fc6f0fa2077e0056d4ae6aa6006ae1593e18238df147498c066c0717873af6ce9de0dd81942ddbc074b90f973116dd3a665449c3767a44d1d2219e4821977ad078d78f03ceadcd4ff8695170d5092f08d0dc9118426a218e51cc306f6d2c6d1bc7b1182add20738d41ec53fdc0cd4be920d115ae99399b281664faf5ccc54fecb818c6bd8827919f27629810c3870c433904fc34cff797eeffc4d674de8bd6c20d513abcd108f77971d72d82f52be31a3e6c5950820d4060dace7739c0a565dc3ea9cb3d53bc7d122825bbdcbcee01821f506d90d3a783c40c37c670b017cb36d8c5c7cef22e5e5f9bba83830661693c81abbb7fa6e4c387c312bfe267c3c18c3d8175a7e5f78c8fd7a637a9dab4f3995352e851bf19cbb9277b3ebbb07631d5899c6cc299bb4d58b9d8d2af2f7c75fadd82f5ef9fb63cbfd0699f73d8bf290b6f9252bad07c8be04ba4576cdbf4626c8a4fe9470be78b67ec769e3e559f2e008195704015973b9f9d35239d88f28d3f598b0129b254007921bb3029f6dc71240d67ba7fd2343ba780e59b73cb2f58df2f80b71e05214d3089a10db68e3115298f576770444a94af2fbb9aee5a68974124d4e67a0c8c936d2041577fa9fc4ff0b0556499b657b3fea351db9b31751272eed7cab05c4cb8be359249d50368770f9f1ec88e0f21f06ceb4bb0855847bb79c50629f5280e395b111df500f614e96e9868edc106a26496db5726190c856449fb13898123ecf7fef53edf8a68aa1e63ba2dc2df317de3411e82b11836287b8cb992b2204134642ba223faa5fa1094b7b8cd61e6a8aca937fce5bf99ea1d57b37fec42d5e8a565d2b453a303102e23da3789e3420ae1eb20f95f1e568f316941b46551259e854fd4588c43b1fff6445fd1a11fd8b187f32890e24cf5d9837671b1901c2d43a6f6a55bfd8be047d4b254b0f2037cb13a3de192b01d8f705ca1af643ba5a60efb125f8de4bddec7d61a0d534d49846fb6598369dca9090e522365f460adac3560c8025b2b64bbfe4d343e313838ad94eb51763b6fac637f850bcb507467e1794e6e66658b4bf66ab9e2a11380a4299f23dadfec4214c37d5e8b9ab6a8d82cad526fe3b91d8f7b880be900bee53ca11ee6b44485cc43a32007da479cfe1f4f3fbf6916c4f8c64c4386fce29d3adad5da53e09d7f80c0d3b5d1734cd8e7b486ae19c24478921990c37fafc154a8d6d4657e21403f270b9e48bcb0ac682f943f972d4fda03ec48598dafefd98ab8f2fbe5b6439b12923124b6e53dc8a3724e28e3ec4a2c312eb3b5192219d8d0a4a23bef1f48e91e9c611924515afe34a80f8d718975d2e17a0e2084540966adcafb0b86c24b1846e0c4a60386ab45c08728323bb9f43fa5d7e1bdc090ac6d1f68493eb114130ef2f67b42e883bc109750f4c45383191e64004d9daf0c983d219be0f73225ecbf40d699df85073b8a20ca03b3af106cf66b37e84d8ec3f203b3bdff9d52a2953b63320a914b6f056636bc07d11c43ecd8cccf780e14fd533711b4eac96e4fb05cebfb69d3612289bfc2d4c040f27f1375a750999051fb579d33526465a51abddf0ef261b46e7d2939b00c03025ebf8429179cd85d5711eb6195f37532f128083e1668241845faf1a8064dcb815473bc3ff689f6af015950b7619af91373c2e4275378edc9ca0cc8c1113aafca1538e11b97b08c26267cf5fe8fdc3900b50dee3213d444d2e64ce253721393ac5f9317cdf28eb98ea8f3b1c8fbeaf4c78c807985aefd4f5702e2a3971ff8a93ff9e6303ffca170a7c08e305f671720ecee29109c87f4ec8da2ccfb27be16418ccc9afa8e8737b8555eb2d7b4af43bbf76847766588f8e63bd7146cd43481423888d0542bb5c7525e3fe1779563840502b224f16ba456463eb9e2afa9ba6bba959d4efb872fc190b90ecae003b7016651edb89239478ad0ee636731b0fa32d8d696d9d9ea0ca1aeb3f320456ae20db5733f1f8fe8d270bbde52e5dfcc3a96fc14e9fdd876f9c3ae0d3e24e98db3e97a3423e942dc3215a1df084220ee87f227f2bf2b2f4c2af29aeaf139a55cc36d1fd72a7646d283c9390478f368bfa4d6de58039f7790ed6e1dca2b0ad0bd99fb8d55df80c3c84ab078ce05562c6fa21932b1cd052f6a86480b1f2f32c4b4d24a6e5ef30b8202d26133813d0952ef187e4370c9139acf741327390a842fd758bcb53f396d2e6b8f4207fe5d3aff627d0584567b3186f0041e97fba0a825604b33829c9f8dee4ba3420c374628992a66d76a121ee724fe0347c6e1a16f9c59d7322eb266fbdbc4808ec96af24d3820406f303f015720cf9a95a868072ac4ed600e4da0a1f8affc2fc96bc592dc7399bf4c6f45d33d8fdfc8fd3df64f357f68c7255aa756ca0a5d0efdcf6051cfa8b9a6aa19d103a79e51b3e137b22ef0452091b5a19f007999f782a7222dbd3e8fa31e5aa989bec9e1c203cf87dab5a11970f0a3bf79bb19d98ad6d79ef7a18359ff27b7d199cdd0c2eb3b82ee1b9aef4ef14576498147ee3c2b42ebdf0c688fe0e25b97de5b62996aff428f1d53984ef2e290f78b915517a3b9095b4c3378060a20977b58b4dafa11fa908de65e1c75a351f35e270f82718acb83522f67ae5275644d116cad9eff661979420f3d7f0842bbc09f94dbee0ffb1abe55a24c2bf46d9463d1536d6401243ae51c219e812845a08664e492407e9e677a048ecd7bb0519bcddc537651f18de236a6d53a30f823729900b52b44ff212bef07776b135667bc1d73acf21aebec0664992397269584d8502f0b78219a8009a00ce4e6937bb8a3cb5136cb7621f98a3e30ac25a1fb3ca4e9be8858a293fe43b68b0d5a722103cab798f90a7120fbea761b3693843c034a44eae340f621e4184f64a5cab054fd3584a8e49afa92a541bc66baafea0e93ee1d6431516c050cb4c3cb5f257a5f15e9e470ab6b051e861a983f9048cd8909acb32831c71586e32c53e770dbe123d6001252a8dba8d1545b4fae5f3ef6798ad59d9316a74339a1ddf78f2aecd8c49ae15057e18d557a54fceb2754351a8af643072f727b7a847d64f5b9063cece67d271bb9b149cfa6d3e4411b7696b22e93c019d369a4e9e70a67b0cbbec8645e4bc95e46117d1db866d82545d24a5e2b7fc72d75b8fccd6626fd32fc54d90e88a634017c0cb39dbedbf8bd76ed452e9e8cd396b10c2cf099a7995743917c8528274d6ade90d5691273610c1cffe843ba0b6ded1106d118753a9ebc8525b1360d6493b42726837c6f797647fe6f1868612153b4bc7dc57c0d6e38dc8d33507bbe6e389f115599f9c4f240e8e89eb2ff43ce07271892455bbd1d05540e0163d200edd3fec9a8cfbe4055d51a3d28b596634d59636bd9202b3a8f951e20bcdd4596272f6ef77fd8b9e0b0c173834959e6031aa624b8ec55479286351e1cd5f1be7ac03fc6f5b74afc7027c9f793237a8581f4862f5bba2c8c4d767b2bdf4d9fc9ebf07180893d7322817bcee20528b105d06d6b4858772f1d0a5295d94bf9847119dbf7b428ce6cccb34c3f8aa9729e7c2ce960b648042cae242a023647a6920c4c68c1f008299b3a5f8a04a53b40a6c0f31ae62e3a142ab0f92e7a791de11a645ce18e2b10167bbfe4fc8700f7cce8bfff3acd7047b64caa16ccca17ff88e6002b70328e149fd48cfadf11b12947ae7887fee67d345b337f60af69af5dbdd7ef34684fcc616aad748459978772ca7d90136e736b2f4e92c2342d02033b17f22475f53a161e313e602d5d98b424674b3849203d1082ee50d15530b90b7a9b9a2a0e7d0432910dd5c2166cc3229fdface104da132254c2f2d040858dbaab9cebfff60f0913d43c4e21aaebbede5dd215b2fa853d7bab77d5ee2a75d13754d41034d3040144d42a40bb262f6dc4c39ad782aca4505bf8eddbd30315e84eaac3f044545c0bb4dc3c77dc0b676d9b38381e33d826263ed8a1b5c7f4a419313222d95a2d75f15c0c8245dcc504196c1bcde6316d49f6281933d9cc932e441295ce0020ac6e0b63d29ca22336d90a8c9656ec6cf35145f850a2d7abe5676dad49d51d391d0fad2bb3e1b44c5ba79af48e8a8f3a58e36814028b9b049c8b969e9d325d13a91e62361f367c9d263539ddc70c5b4fc806f28f05edc09bb4b78ca134b111d88eb94c75d3ed9c0a6eb6bba336ef45e5e01292be5cf5413631674aef325cebe608f31f37e6ec2fa4fc283b3571822e15d404b4401606224b11d1380dd8a3db772283964d74a250d3e6482cb84eb2e9c81f04584f80ed1251b452561193febe0516731d444301f422acb13e462941bd5a59cfd7ff0f17f1b5d605a23c3816e7f160cb3b4fc3b11f838b7d5446fcceafd2e7e5fc2a5a16b05d5dd83932dfae1b5f987c58f9c2b73c93d167408dcc29ab42b6f6d6ebb41572d670983d535de0ff27da9b1ebf0dc67f9355232826e273d5028727e27bd6564a6e9581b26878f2edeba7380e6e265f7913bc7800ede61bb9b5b74dd3fee2a3ae77ed2799594f9ce6653513bb4b4628a5ad37c75cd964776ec6517b92a6e13f780713cfa33e9dea0bbda2446129dadc28614afff202cff474ddd77bd945f6aecce57294669558eefd2661ef7ac4e5da76c5e73e94708cbdaf1d569b0395a2195f60a509d1c67c9f0388419d7eaaa0090b272b52247e545113758b1dbb1a319486e5ff496611991473b3189a884474eca0a816a49860e453293c9a0209f7d8dfe20ecd43d1712a1e7dfdda816687ffeb2e7f54efb36f697fb64de398714d60a9bdb7a414a1f495e10f1e663ce0ea44a5cb9e2512d3571fb69f846fb3ca7f97f992e1f61117ea4489f6995ffc0719c74da7cfda596a3d4a0443cffe6343e9f12f29f52f096b67593009a5390217b9d4f5ad2f2bf70829376edff92b7187fd7d1ea6f9f748d77536eed6459520a5a7c401510bb82e0ebc3cdc4b965fb0b7054dae3a1c3acb47f67dae27c9e78cfdd4dfddba8abb5ef1540b5fb3982c0e031f471a0ea7143c187e365df7dfd57972b0a9e071d237703331f93adfc42e850dbcf96a54a6ce032f0bc1fb8155f14d77122acc111e45918f697de36d5c8e1c29dbd128788ae527c8bce70e3b84edf10244ce1c06d0af0dd7f1bcaad625d7b0de6cc55f9cf0a390df3a5564ecf255468791f9615385441c575ba71d5c6d21fd0fa08aea41d90b66660bad48a6bff30fa6f2a5243321f251977e1d871606541d26722d674f3fe48cd067e0465e3dd1a1dd0bd8eff583ebbeecece3689fcf1dd608a1b07eb0d872ea759242c8a83ed0feca104d89ab904b1b5d20c8d3bd27698dcf595966966d29f5bc93ea4bc63594e97d2fe5e868a6d23ff9852e0b366e409f0c5e3f8d841fd7cbf126d3df08659883d81f0b882e8e874a8218bab7045b590df4779c77afbac3c9fe5fec3fda3423c7712f15eaa4074e09e815bbf95aac3354cf8b2d4d8e242927e8af8c489acd06bd384f72e3a010708adecb62c849517cc91c8bf59225bf16e5dc71fd8bb934c978f6983a8a95b4a47dc86fa2b2484ea2ec187a7e8df82b82dbdeb0369d3321561b1b6a6af23023325e59cf1dd1de97f2f2c516aee017fe6a2dc7375b716c4f58655a3bf56b67f4277e386cd7f5dd7393f0c847f67d0bf5be4d92bade9696470bcfad0c6d947823237534a3d182b40d554fe49aea6d5c0fe28b0a9a0900934da3ce5037f24d9c58d37a6cd8153072f0e058865131b8a46de87763da511c808872656f0c8773241e66ed2e06e8d9be9c9cfede544a108f7cf6883e703fb5e038513380bd30b58c8dd985f479fdeca4dfdd6c393d00b4ecfea119b3bba76bc9b65097171f1fa28287fa838d9d9eeecc5ff18a2c27f579e7adf44c6c1f45bda6fdad3bd3e68e839cb212ccd2aac5bb60c3dcecabc8c969e3b62ba5d4764f15ee1c58846b0f1be8ce83db38e16d7fa830f10e4d8fedf562678cc9874696c1dd75b43ade3fedc88279b87e4cd41c51b2ce342b0cf22c7ab2a1b1b6265861930fd4c86b988db06ecbacda30bb16603587eacaae7343e044a5a7ff0869b2928ab4b1b59cdf9fe9fbbef67a5e41a8937426ea6adb7d7c4bb8b1f855bad8f80e1564e30761a383ed4ac47db6f8935f69e0eadd10e3be3b3790c4041da5711a92e0398a5b0f24e4178a5f4c4e760ec88193b26c710f557bf17db538a6100bb9328a910575ef36315cfc0693c5edaa45c215cdc162760c828b179277c8cf895368606780fb84ddf6f3b4a1a93835ccd400eee5bd2a47d1fdefe9fd99d057d0acb34eb4c57f7b5ec7b96cc1f08fe4e47f5bdc9f33a933f34b0873636dd001db899491ce8564a9462503fa489a70ec8e18d4d21900f6d74b2403aa2b19305e4484d4d668113fd8ade94a077381a7315f7a1396e344a1e3c84280eea47687ab2801cba895306ecb046a6345087343659203bb2d1c9027684a64e1690c39a34b507aae5842811340e43a327caef5bc3ab620f1c5033878441720a1845a4f9ecf7b9bd87c2fad9f767e1d6fb8560fad84dbc1f5896f56476f93f0afad5a63072f702120bec76c1e28e30ec5dcf778f6ca9d080924edefc96ca01bd67cd9a1128143075251851d318884bfc513f15834744fd8cd0f84f625656f779f9bbdb737d3f9fa61abdc4c9ef171d71fefd6ca7b847d00f9a571065bb891c4933fc5bf3f6d408fad95a05c25947174b5c8a6ffc6fe05bea67efdd17d3db20e3c9b663df1317e6566ecd9ec7e007f4deddd112692527d6cd192afcd12451904430106aa950096cdf8673e4503ede1037317cf599c999425c75957021f6f8ff81f7145ff0a389ffb99b50258d38f9725f17fd72c7faf158afa6fdddc6b6bbb22347f0a87d7c458c5991c3f54f4d7c138d049007f4f8980c5bb1095fbe37d0c2410aba02fc9bcccd91e1907526396321e75da60e7011fab2e1cf96f5b939043fa9504597df5f29f393715d45bf71241af2a653b963f5d72e27e32f1d93d49930d0e300bbf13899c68f69e5f709038bd52631c4c1eeecbf5042453342da3765e04cc9d41333a3b0c93a280258e034353b78bdc9013b2e91e82738ad4b61870207f9a001b306f64322ba2b06888287c83857d0025abecb6873931fb21a58455a2f649eb9aa9da6317d83f6557bbd351058b3a0079c307b80c658eac5b0fdbb5c44d6180a3ef9ada4ab91773f63e8e6015512709ae4a6b244c1a998430eca5727a29bf7fa7e89d533767ff5fc5371d1c1b345ff67058911c1a7b018412c81a34b87045826e874e30916e089cac93607f9280170f2dc7f80f2fad84323f8fdb11ac487e090fa075df8a0fa8839cb2496aac24a482e1b032bd46c32e3c020a16d6b72619c82e82eab67b65f5d782f56d9acfeb166349e304b0ad656513e357d190e45df4b09d972adb83a10701982beb769bbd56e7160dc350555326329fca0ed2a07fa9b716587dd2f65e1ddebfddebdc5949a0cb995f8bc852228de45166d8f09e0b5015a87cf3726d973618ebf720cd68ca990a9859a4ff46a24ca915c392f83a2633545c71124a823222b484ca12d7be338e0388df67a4ef42cc531f7ed4b04878214f1061a518a71fc8dc2f9ac132d7dfc81611127e540e4a893be3ca5cf313996bd3ad45075c2b952dc258acdb04260b27032f6134c3654d2c9a65007a050fe665234c44526f249acdd2c746adac36d3860794c0dbd4ff84ddb48ff68a5c7f72b75fe8ff49c9782746bfd959ffb92fa0c8e39cfe49911e26859c841619c67785bc5755e84e72ff07829b412a58542a84516bc0e81fe15a07b13b2193981fd3dc519d14f2ee10b41f1efbb54890dc73a6f351c8494a6dbba95993f8b34e2c801b314d952079396905e175a25878aa2e683f8be34523c67b6a94ecec5c924311fc167e227148123387c3472cfcb9c0bc2859d36c5fb6edb8444e9b0915d6bf5c3d112bb8b01669bb1a8249a6f53714759afde30a2cbe47d60a39d12856f9481160b6d73f9f04ec7d9ad856f0c1176b6e87e78a3122750cd26839cf2591ecb93d6eedaa18294520466eecc1201dfd8291b7a09bed6ab992bfd589900c5e6ae5fe1d8758b9901ac7dc7f923027c68e528e57045f24762e472ae460189c90dded0ca2b35f7f2b1800f07af9a2fec4abb3bed1d8f60cd3e736492eb4cb06ba4b21f90285650678e187b5cffb539174397cf1b96e5ca2987266ef3659ae0dffcceecbdc7f9b6fed9258f5b918c20c348fbd41e8e9945cc5d58c865bdf8357950e8de02853d19a77760412c8ee108695536cd62efd465ef1ed7cb0accce095a2baa4586cdd39240297ec4f8cf6bf7eddbb3c96886892c63f61e4a6ec6f0894224d79d429b972c66fb072090bf4c51a30efdce3220034e351262edd4245cda28493be6959c1fec327debfb50368217b9a333c458046800863a658eb9ca74d7cd4533eb0b08c27e679f6b374830db43a9948913d05e49b069506b9f61eae6c7a57c83ae6342d8b1bb839b8a4932d407bc73ac31dde5aec0e627bb3d18d516e04cec90c04850e9440f9fdfbc69964e8bd45f539a068233aa2cb588114f7562f409215ea8441c064c3869cd668db5a0ae0f38988e2ebe9b0d2d1b8ac971395bcd8c8209387d68f1f7cdb2559bb7adc2992b05008f5f3821127cd415b715b9b95eb8630a9b3468f3e650ea3d3a3b2745c2b593a4842b26f9ab6678073d776eeb055707057c5dec19d070bf0e9a27510611143816d7388bb0a90be3547f8c4c93633f345b3562639c78e0c1e8b81a32925d021b0b87464f1fcabaf207f9044be1a033ede039aca3580313228851a21eb05bf2efdc4a350eaf6c76a9d26f91d6af5696a6e930d500f40835c17f58207363708c3e8cefb0059f35e3455169a588d0fd869cb9a85fe784642aaf12bd0c40bb7728f0bc8d648f6d24e0331fe3a0c3d31b141092f94b2a4e1cfd9a57f57bc40a3ff48f8a06f3eb05448f30862ad23fd78850937e6c4755a93b5443aee1c13601573ec342767465ec7c048fd0396e40b46db82f5a9630d2443fda445aad33388d1e243292aa97d4cdcfb5a7fc4f48758b0cae461c3a4be69360f4468cc3f70f5086873e9ec9b4e1a52934efdb3bad9e1d0b43f2a8d378bcfdc68f301c7ed335a619adef2a6ed7db2eb1e93afffefd3dd192197d1a88dfe2d117512b930963f9e0539a8caa78bc852d62a5d7d7c995214342c56dfd75ae8e93e49670495139c4bb10d8d206c0342b88207f34d6d9a99db7092102125d3041c805f7573981b584d6643d025fb6af9f40e5a6e91f6df5ff4f29bab3a586f784d658eafdb79b71b32ac602e3098fb5d1cf91ba483540cb9894bebead93184dba5f1388fd9ada85adc5e0b21e7edfd9ee631c915561899f6278cf5fbc7beff492a7178c19a86ed2a497fc9aaecaa06f9910b720f7e9de5bd0ed20a669b9a907b43e55746071ff622c563cd6df6a201e237a5518acdba7c5f2700d14103e635596406567bacccaa100aa27f970c335df57075d0a3f36fad98ec7765bbea69436a3b0ec7907abb8b37121458de844902eb0f167a049e4eb0463b1023ce5bad9580ea1b6562ac2ba875bfac5f6f099eca69bb808536e8a1de264b8f0cecb26c51a5d528b7f28f56ba0abc0d4226fdbf7737d0b3fdfba23190612e0c9b3b820c0293791477d870f8a47e50684a1a0ae90ad6e5b4f371b286bce10a1ba2f908e6cfa02cfb377f131d855d7cad6d2561efd22db15e02c6c4af4c98b1e5dc6c3ddd9cf4eabfb0d6e1606a1f98aeebf1a878141d1b75586f3672c1386004aef04208dbd21b08d5ab8d307968c3a5212a1161caecbb485a6e670157bf513cecbc8acfa688f233464ef4bb11dc8ded620540dfffd3773a406fc031b2d6d05b5f5c3897ec9e830ff704c2501827d94913de35d9a7f76c632d78222958e17c7d438882f7daa80dd8c0c974568e7c57da56f66c905480d88cde1c1198f8a90db02f8773dbea138995365bcc3e706b468d0f03e6dd77ca92d80777fce73f7c5337984cd7b3a9941743d1145b9cd98d6644810c8ccc13bc26715563b6329167204bc4df447782d0adafad9d5fefc5cd31d83c793e9dcbbe57727c98666826c6fbbd853923318bf9b84c0742cc2070f8324687b71fab2b0a94004221494fd9899f566f0df8dfddc1734aa53f583ca0bf3f77bef6aec9e0e89fb4803592ae110027060a2f4a71f58b1949578066fc7d4ed24427c8a9e02a70f6cb2b3ca9a46928acd4237e133fd7c7ab1b3cdc2dd2d79d24956ae388d2f68e04fbae6235fd68ba8259c85136eeebd8fc8f8ac3547f0f3dbc3fa3442c91769ed544471dd9269bd7453f2ad4116d2eae117c9baf56c97912ab0ef1e214b4f634c76406b6100565912d66abad0db5b4d6c69d13572991a5d5d1a3f5fca7dfca3d68bfa63d299ba31af0198d5db5d9c1245711547aa8e3ea8e87b38f4702c2c7039c299cd9348dbd0b98d707fda21447110d423d86f53fc407f057b9d37fba5c21ddfa43ef2fc466772e9e21d3b25dde50709c07ee9046698a0b0f66eb52ce88cf6b3f4090d26ef35b280d0bbb8556a6756bc4ce3533af123c3555b3cca8fd6917637d9b29486e83f6954c2a204465940a9a65a79ccc30eedea4314a5c6d391294fbac2ca0a8cb2b0ea38b4493fe34e9ba5ca343be5f00a7562991b111d22b2024aebec0cdcea46756ccd504129649940e396c0e2e9b0ec25db70d2f768c2a20be3e174633b1f06ef6bd2edf42492a4d2fab353f357f1b87480c542783f3a38094c7f51e9d633e8fc14836afeeeb95d4a8590e3bdcf8e1bee3c6f1d376db242f7c61914588fb6859325890bbe8bb3d612a9c9e295508f6719875f4de2d01c9b474cf1d441b42978f0b74287a6793a592416d02c8d6491085eb1c71e197be9994aaee7cdcfb7b027aac82a93d10d13fcc09e7c993cd4552f77c26e735d386afd057167d4dacd506ad8618ed90a9d43f98856fd4d49415f207056540c9c5f849608a01530fff39ddece0563e07b94ff3e2804f0c5523cfce46b4cb0d0935c4205f3691c9389da9d10f8170fcd3599ff9e714307a1384e2493f89cc5c771ec6f8788ce5feebcb4efed547a1a618cf0edd6072cee1a539e1a5a12f2f5aac76c55550649f263f5ae86ab60309142e19391c0ae8d61a4edf8bde1c0e34f36959547e864ebe1ec5b52829666f4311019785b54b06bec38ce5bd1e0b7b4486be836e94a1820e4f9ca2d94c7a9c2c315ab1093cd2982ea311d03759d2115349aef2cff85659095d4f58d538440c92736c84f27a2b37f0b0f3329c9ed84774b9f700d1dbfe3843da97bb63d6dea000a86d27d0b4e624660ff8272f7bdc62ff097515576e3d29a9fe23824ac984164e3943a4c4bfa83286d9d66296901fbc95c396d227a761b4bbe67419d4669f6a5b934b010ac112517ec1d9625885b4447d9a28b7d74a9d435e50b39d532bd87bbe899d2587465051dc32cf40d2fbd1a055a7630aa0d63ccb433203f57fc03baffe58605b9f4e532c899f44a8659a2f7245d2eb198098ca2131ff03f04fd366f51c56ae51783191a6b487fb6175ae654bc539cb28efb2e207c4d838216893dbe26e1eb09f49da23d9df445be5324130e6d9a9bc4f7158e2ccd726d5548d44581127fa35107477ca002d2730e76c41a915e00dc5bfb075335355bb63213730997a65f0768bd6da273aae8f01e49e82016a23ca05a50df23a1922ebc5e1b92130aa020d1dc11cda1049cfdf0f380eca644ea9c67f84d842651c19f3e4fdefcc6ff7a7f6560477fe5a401e89bdb019c2732681bec8889205a3e5b91feb5e1f919ca7fe07bc9cbe73577191e7b130f4c6fdf191b2ed182066db4bfebc6cd5c4c215e1308dd05de705ff799a7d32276d984a1276232fa0943454c158081a9d7b5e367019671cdd5ce93c99f8747013c651d45ccac5c6788b098cc57a92cddcd53a2f37a6d222536411b90874a074d21a6d509d5b03d44e00ef7891310410c2e96c1c3b4628ee8fb5c44b910d484e03c3beaa813c6206099baf35ffa7fa1e16ff642b8041d2bc06d0121005ce5cf099a385ba3c12e76492f6b6a824f00fa760cc5b1c241112225224bdf536f5631daf2f3769d89e901a71c1accaba094673fbcf2e38a3287cc4a2a3705ae1f52d70b72c63f30b441bade9d09a7376760432a9ec6e18592fb2ed533485642fd34c4c066e5ef9598e573b957028866d8c0de00b3db7da2a1f2757b5f52d926037c56786a4d26e7398f66806d7f7a01fa12434d0bebcaf3a9d7ce811f6c78964fcc790eb63fe15e47b2b8c2ab039f5541c79b8a3392f1a6a94d843bb25d30ee2005bf8b91c48fa9d05ec811f0fdd5610f463aee7bf3b2ee90c1771a2df3a38a4c6898c1652899f5a3606a74c6d2197f184e53cc9091aa89fb38f9c0840f1cdf372ed62914b561febb1cd617f2f9ecfc335dc8c839d6692a9da748b759967afea4c7bebb846a33d007e63f7c38f13b7ed331b8d95e142abbb724754367c972e6e02fdec19fd66bf34c3873f0ae1aed4e9f7621a2c37ee360ad48e70d27880c7ea43af23975b645249c29612c5bd22a7301525bc810961a1c24f131b29cbdf452a157ac651a68653f0d1ef158b18bfa05f849e511b0419d75aee22c16a56294bc52975102cee89a5fbdb5591520e957452ca98e9df19957a468ac25b9445654d091a60db619aa284913b151305284c27a0a6909d316774f11c562c5cc6a0ebef90ccc777096b101beabd3871c6acf5ee7498f858a6642f28ba60e0a3bba3e467ada6fe7886b02ecd4b6957fdf56999908e1034afe818526d4e0901f143698bb6b0515cbf8b1c90f5dd106f655d4919e812863b469824c351b021701c955d73655bfffd47e30bba4f87e62a5f45f5978dcb4ff36a10c519d15e900db880e8ba395ba3e26d2c5449ca21e57d25a3d3cce4e89ed6c748bbfcd35aff69b0c86e2cbafa676d7e024e816db62570cfc6a322f823e5f419d5a8b8bee1239c8cbe0d1e40ff2e433fd344c88c8255224d2b211d25063919e074e4a787b90b17eecdab895278d3cfbc3e610b855ec433c6cfb63819102c34c03b7164cf703c3164b34ecfb650da0da3e9e82dee9faf7588d7f38641ab7853607b7fb820779fe8b0befb30636fb5da05e1e427e2dfe969692358c5ff649f27e9f6a5f9858ea0c01748b22bb9c8d618131e2931a7dee62baf05d6097da25d385e2064be0a84b8c013dcf017b7cf02d0821fe1e12eb658fdd6aba2ff300419d1b0a1556d6511e8c7735d00df39d9ce65b9598466434b231bf47089b9019b7faba7128fa718f902480fc1263f975f829447f30c635050cefc8ae3c8d0622c873d409d6ea4a3c90ef20fee221d22147f4708ea10a8717e7df84db9c7fa7087e8a06f8ad06308e3b2bba2ef6bab7deffa009fa5bcf183fb21e0eb0f7a941e70251c883782b091444b76f88d784431137c0b7516e2207c91519eab299bca6cebd6840829b61d718f79ab5799de7d4e69056148dd05e3356b0543720d5a54a0b91cc7ea8e75cb337a2f8d4fe8e9bb918953be41ce5e28bed2ec7ae04f190d14373a65538043aa0a59f800977fb8225f563fd0625ae5aa424b50a29f51adc24b348864f5af9d300f5af0a595ca7fc418a749ea395f31b767f92541627627ea7b53e64b618739d75f5c3a110d65236a54f66cd17adc058e9d1e8c849c53ab59c8a14678a2d0a75ce9473f9f42605892804586fd0de9b2e02411d521bbba6118330cf062dfa070d4e895aaef06cc7e7c52244b70b3728e7753a00c17f47fecfcd15c990e07e3dd0c46f7210d234c46f0709c8be0e6c146b9eca10d386d726e166a37360cf19e44ba3e86d9080dceb800d13aee411c52e49ada70e6a1a80af0db66f2af9d890a2c5ebc20613f19458cce9c9629d8496a91bd734ae1707e80136c56baf2cc8529d9af409970cb0a62809deb6aef0b16911199242ecbb5cb4b9f70b08c071afdfc68f8fdd86ecd8711b18db1bc47aef9bef95a35fc6959e62be001c9f6d5b782eab1fa8e0b90402098e24e9ee609fddf7cde6ccf8196aefd9882f7146848f971f9de3f102f8b6182a387ab63ea447d2dbb7ef1292df8806e543c21cd610a7e5b4bf2c16a91dad698343ceef6c7e27563e834deb8d0d4ee46bfbf22389aedb9b140d12da1074206b116aafdd0aefb1ab5834147c99a573b570927bbb101414342b2e4aef6e8660ebdb69f22d4a8c7847804b05377d7bb4266a4e24ae5ab0795f53c084252fc48db01fe81f9beae17ab16c0fd762300776a604578f5823ce9044aa4efb18bf00b627fba6f166b23f2c42a4a6433412f11d584326cb2ab42ffb7879c8b828fd7462fa8246f6056e29d648e490a36d5bee73b2aa7fe233fc0f40ddde45b509d593e214c3d40fd4f5d3878d8eb492693b2b1e2806c5a8383b0ef19830a541c61b4e089290e1d62774c09051c1a827910fe18ebb0e778c9f3b5cd07c9a0a480bca64c7fdfef6d19df3e6ccb133bff70734c1ca2f12f06937e6cfe41a7f46ccefb14384cc013b9c25252f3daee4e156520e1a56295de67e626977fdd86d9471ffe0f56e6d4ae8c3b5ad24acbc182574ede7ced4aaa8b005093ce0803cbcde41af914aa39ca8a353e01a11482e4226f014d1e93a8d1b6c7fa80521f04b882905ce7bc8bd4ee89ad32f913f7ac8c22a6901af7b8873826a84e8348f608b7e59ad7b3d619843b51469760a19eca9ed3438611cda719b715004cde2b74351e61ca518a784d8231823479b2948f64a6c242d512a81b008e36d332ef3b331ae7a2b8ac60e6c14da9f0f0639aa00289103e2133017adf6c12787b1de0eafab228221bdd7036d3e701aa5dec79f353678fb3aabae507ccabe3cc8fdf3c6be45cb28f4eaac554cbd7425775cc3e902f492be906f08831f92547a87ba1e7d2d9e110c31a7aadf3875f3ff401020516d11707e04af972e019e9e1a5fd3e2e90758d54fc149778174f14c5a70cd226d582ed70e2e0cb0885661d90da537fb97b4dfc4fe0b6ee4bde5ff8f1a35aa4e7d7c36293a11596d8e8a98b15428d3c5d9dfcf4d91a49945b26015270af497c369dc43178530eb4240232207b64c0b7a28659281b906bc512c651b7b962f3ff4e4c5dd0c3c6b31109c07e9380679826d3750886b38f197e8b8ebe50f1d3c32df056ff9aff7370b9094ef9abd078fca80f5c0a84e580799a8882db2298260347d0e6f9a71c6b526f7eb956c8a7cef64d0e0e549518521252811f9a4cefc0da0141f698de0caac12cf7d004a75b3bb2b4106943a3dece3cb5677e01a6243059998dd6a8daa1adab70a47d0d685529d4867e04481f43a20b4dc830e56ccba337b59ac366b91b937ee9e7a512b46a9279c2fba2613fba454f8cee7a554d73b3f4dd0480efbf24f531b4e4d416fc8064baa3322e2673af4cf663541b2b0514df92c6712eae7fc5d6063f6800dfc3768321921dbe4ff616aeaa77c13344f27b9cda344d3d371d233a5464be9a0c593a93c585035a0dec2990ec11c36a070e9e9410a8cfde1b87283d66c640b03530bca387dc27b6e041c837edf9cbac46e6e14d0fffb47e6ac2626bcdbecf532443117408b03e49901029188666349e631918bacfad7895d2a93726c21dce13b01bf0e99be4db3c1df988e200cc96745e223b03cd85c53902bf0fd88228996423df4c13ad3460c8296f6fa5ce3fbe8b7ab344a7e530be264192dad3350179e7f7433511db10509e1886e6c1f0e3d27abe83d09a1519f5216ed67116b04e8398a0c74c4d11a0c4a58de45d12ea14637e3abe82821ee54bc4e1884264ff99372edda41c45ff834104319f0ad4f5c51ef8bcd846a85ed68a46d26182c731526251d32b5012f9f70c5fb67722ff98e6d198649a1a2f7016d54873c154014bd56888edb629b49853d13cb3ab577fed068ea4c73e1d76b8b0e6cda8edd720f5c5b29e3fe81ab186d4c0fe9a22f902560b04fbd23e1e585e89493e8d40b23fb5a4ff9d9596ce412f4a005d0a245172bdcf8525742cabf2364c03c8c67476ccbd0069665d39c6a8c4b308a0427ac9e24ddb5c5b874563659abf88dd45f7d4d7ba96cc7eba512e9726e2995c61ff0dfbb6ea44b10b68a544a574c922e8fdada1b642af221131cb95f17afac446bc7b870c20a5a340cffed3374d5226559d16b553694b97b2db287021578cef988f8f4d9fed2489def1ed6e2afa552d69c37c9763d9ccda06652445725f599482bb5bf9cab436f3344c9d691563abfa78d77acd8d1e7d0141df4d6651eab9b558e2b1c2774e684d35908c42b925c905652a41faa165ffc69e47fff0d58fe4d10fcc2907b680c403185bb1b73c90f8089e6b21ca4875cdb23cde223c0104743adfff3f2bc6896944310cc9112d87bb6be2a8b2d4ddc7190978c23b89b2e14351730551f808f44d2703ce2f67e1c436eaee5751faac24a46d1a320196e4e29ff40accf250ee6749d53505d0b2a071500f9638e2ef3a085ccd325f9a28e181e4c132a92ad8f4f579b0b197a757235cd6c4111a9f4f3a01f377dc695ad93ada7f9ada2ab6087165df04064e6bcfae8a619e362abdce3e1b01ab397eb6fb29ea5c9bf907e536d5d899dfbdf378da63d934f5631348f808f836bc6f14dbd5d15a56f07a702f537a446ab6e7e092aa4eec670f65a62d666add9224422e34a5a47c5c7aa739193e8ff2f6f1c33b452f6a32becdb3644fc8a8f81e136a40586600dcf513f80b45dec04a34939711bcacd11068437cdd18c2c19b5877e6905ca39ed0a84de54b538701c489be27ef46572ee5948b27c1ddbf2470833f5392e1948a5aea4405a7bb0e504118513f46b968d0df91b79f53c16574a0be6729c27bf9d2193f285feda19bcd4fe2b9f9da100cc7dd1cdb0ea419191f4502ac61fd3170f9d208577e1e90c8ceee2a6fb39195c0a1be74c508a359bbb169d223dce20fa90a275dfe50c1c6437c4615faecf72db109358d8455ff679905b6742ab260e28abc367f385ea8cebc06ab937e688f571e949a0dbd62d347d76a312223a5b2e38f19b4948feaf609744ec48e0dd6a572fa93c7a49c6794b9685614f36556f8e1d691328169e327d98cb5acad45a9d446630f022451b65928de5dfe9c671d619c01c1259bc44b660970f068a0c4bfbcb096bd935af93a64b139ce5053c072dcc8705a04cca877583f387ebb69552480f69be028f3fff310d607d8937f3412b5de9658aab34cd312bf45de2ab9ae90e0ad878bfd51f6231093aaa4abb5dfbb32eb87f2a95742ea97e20eff4d60abc0ef093518a9c0095618790ab022c3fb2212e1896b2335bd7a84104a0b341b4b5de80d095b30d0e2e3fdada7a478f1b227c791fe2e2bdc98f4a794c3daaf780f7b464a1aff91dcce689666960f7a5b534d88b336eaa191f335dd7d2cbd7a6007e9e58134a75f12efbf665c315d2fcec1de91de764f0443e3aca49dd72d8313c4271f3346e32647720b192840f6cbd03c6441c63a8f18c611925bad34f128a1b879e7b3ef8a30c4a7ec036baac9011df0a1e14522d202defcf3a17d1aec410997335f75d8c2814623fdac408680249accd83c12215f4e8e6b640b90564fee522eaab805ee5ad7c1eacc436b5ac4ceacb92a635dd966fcb88b70bd250b7b1833399b86509806f201a1c9a8d6c0ae7111d895fb8bd976c95b341447b61cd3d6ab0706f66ce09bb0ace63eed6c23979ddb1aa34c0871c1b7340cff79cf85c3a75001aeddad5b4672a3f913cdeb1f86f11e8c8976a9e7ffd69c1220507b49a4ff251e74b742f72d7fa92e406d852f691c471cf27066b6ba713bc4fb7f5b9c62c5ebeb290c2a41a2be53449051d046bcca8d4820e8263686c6a21c780333836b130a3c01a1c9ba6b0b1208d8e935468861f78d1a6ccc048394c474e7aa1835da3e994bccc04ee7f847b0f501020cf4a75b705e7168a1ae0a60046824a601630949d8196809f56043183849ba0ab5a9b92ed58495707314b229b0816bfd171d3bfe32332f5b92c351bd9ee12aacf8b189eb093d8d778e184841fad0c160f3c10b610795b37da9174e0f012bf54385a7014d97a92869cde774f58dd5cdbf3bc81e60d2f3907bdd1dade7ddfe0f296068d8ded1ad77a4c9bf5acebe6d1d858d749237bc16a8ca771b2b1dc48a3fd8be586989cf39644c70d1bdc1873cedb8e699df58975da589337fe6aabc5d26923cc129d368c666f1b5ace9bdbd3fc9375d840239f3e6c84c9db9fff62b141b42e7957870d9b3512f0e86ea1d0b7dd2ff7977a5cac0ac7ddedbcb34040ebba8780deadb17e7e60a813d08fac0bc1ef7320a01e9e1f18ead47931ec61d5fc4f817e645d2802af08186d4fad08f070f65f35d66c4f2d35caa8e125abd1da9e5a6af0a4b1667b6aa561266f4fad34bee4fcd44ac395b7a7d66af54d63a76320cda767ec74acf9f0fca0eedafb69be2a1cf787a93050cf186b3e63cc3303d2629a3d658ffe8b8efe8b72ce494fa274cef8925f777bcfe072d63a8b42ad2d14074c23e81c98fd28ae762a437ced463a65e891df84e3b6554601f2b3fd5d9fa232586580c077aab19df5d1fac37a534fd92318eae4809c6fc0b8f922e71b2f72be69c09931da1c002b6372cea9315266e4f1e48c28625b049273b639d5267d8f3870b823e77c63a5654aa20c23855820e78c23468823962498e28c98734e89400012a47c89c1072a72cea919f010408f9bf39344ced906a914618e1992ccf047cef966021bd05060071ea88040ce99010314604d8a8c15214e72ce3672f471c30982ec10879873c63940ab811e5e5f647123e79c22e3ecb6c052831636b6a4add5e2acfad47a5b2468ff4ef151b556ebdd3eb4357debdd3eb4fda6b641ebba87b6d67f5167b5e2168effd3adf5a9a6b6412b2c8bd536e85176fb176b6b75f69ff4cdeda9f6b17455e3b3a5ed216dfbd47d3865bbcadfe5daac8dddeaeb7eabf4b65af0cbbaf1abb1eefeb5f7567b190ca3db7d185ee3edb3d9a5b7afecc3601d7dd7e75dd59d6a300ac7adc6d9fd7cc66e8ded6f96add5828fb4d765f7d9d7535392d204456b696a1bb4dd3868db6ebcb5febe8f3eab1d2d05699b066fed557d66eb76e3a04d53dbadb5845aefc6aa337747bd5b91f6be9ac23a0ac75d6b8334b50daa226553dbadbd1b4ed3aebd36b5dddbb73318042db6dd77f6501baaae67dc964841434d1acaa469ad3185e316ffdf6a94c6ffedadecb5d9439dfcff5dd70d056bfcff5dadcc9eb24734f4f098f931c3638627676d954abd1392775b8df717fc306d760a611381153f660e22079183385ba959083d0cf0c97ae396c0bdbb375ea6f892f3e6eef6dd760afe3a53f8e4bcb53c2a30d4a9d56a4d81937396020f1d29a8f051a56821270d394501460a2229b825523c1005211a0c757add0d86ca74a23021eb4411679d28daa0b4e7a0ac13c54ecef94d535bb9b00ec55ea98c0f6560658ee4b768c9bbadb65daccaf9066beeb7ef16da3aafd5d3e3c3937610b4afa5bdeabaf9d658b7a7dbed293c4335f6db1eeb48bdb3a6b8d8ee56e94aec91fbdc95924a816329aadbe1d817f5ce0aea4afc594f5879e2884c21e66bf3dd645a39374106099921da8a8c4e02d6c8398be16088040ce59cf94e39b1ee9c6f5628a24297149c6837ced720278cf2e6440639e7ed51762f717f0c1d63d6c8396b63b8187344ce5903d2b495c61a53039326d0c84d40d1440e595b69f0eef1993d140fce9426946426d26cd9b3375b6ea26e66373227e05854ce37b1033a48f090893a547e9ba523e0bc6a3eacda958e6c82b4eeea117344ce3a629cb8b6f6b2b11bc20ba4c936ac0123c0a41cd03162cc4a59a7883439bfeb56817e66a74d05ef19bf37464500b5fb5f2b9d222030758838830831341d221e202285803508b8230e04ac918764316ed6940d54bec9a2669d3010641d216ac83a4270c93a42c46e8e6c9678b56e1878ff53f7a354d78d2bc5412ba9f5ed0cbe49e13782e7376816e36cdd4cd0bad9299b5607c41f4048e0e6e906cb0631dfee6e7394bc28fb2fcd2745e5073439df3cf0c398571d1f04d9a0a46870677dd02367a8aee3439b73900f5872ce60d60063068c99ce9b12c4fb10fc4d5c251a7a671f85bb0fbf1be9dd48b1ae94c45522fe41ec23bd44fc5d6c57f71bbdaf0e3d7b04cb5ee9f56e23292d8ca80f5551918e5a986b44d4d7a657e9d75675599dc5eef87d8fd6a617663faa9cb91fd5d157259ac2594875b9a2839a9c77202367b6abedfed70eac1d44d00101713f5f2ef5957e8bdab4b49a3752943a6cb6b139a6f0949c533724e59cca71dd8fe19cf38d036e6755d3ccf9864836651b06e77c8314e5fd4f734e2560dd30bb631fa5ba72be8972030536651b66ca362ce79b23f8ed3013de66ce37469c55a1cc9c535ac05019fc3e7fe19b27eeab4562dc9437223891f30dd1105773be11ea297b94f34dd08d9314941b116e806e9af4943dbaf9b909c1edac0afb35e61df6b0cddeac6ec8d7e66664bbca8aeb1a2b6d7585bfe9e1ae04bb7dddaffb512a3b0546bf74e329ad4c0d82bfc9fd6f6a629ac542b292c8ddbf0ead4341ecb7528662afd4c25ca33f5ad73df445c150a74f8a0d15e497bb3b06854675d8c6764ddbd4dd52e94bebfed7fd28adc37ced6aecd53e06c3aa1b7b576355ed853669d9a4610e1a5a1a5ab3199cd0a1e126e72c02abfe39db30cde77d7533c5413360d191c10c133a3110f2b25eb6b34dddfd2b1fe41874bc9091f99197325e86bc78198613fed8c91986095ed8e205225ee05ed07266b95026e76c3e546f6f90dc7070a385b1c2072d94793886d52a2dc039e7978d75364a4fd6698127e7969d02aba8bab6b2920535476fd037b92c16c270752fad1ff5486d67b1d0cadaaae87dddcd5c818bf6bebb7ddded0b15aa5061899cb3055947851c72ceb20dd37cb4d5abf9406d56ce3719dc60707381cdaad5dae20b34d8b8e361f6dfe5abfa42f3480187f661566d3bcb080abda1e066821b23675f856e247855373a3745525e72be09c00d919b086e007003c103441c18d200033938373637a928a9066e722139db9441c8b35d09ee9d29b699524e83d8086213c80572b601648d095e8a9ef551aa0943b6f0b1c528676d75ea6c819b58e847a9997d91f38d159dd98f161dd9999cdf1d7b74a74b645e72ce1c70976503874d1c703c892de59ce1bebefccbd80e6c95737ed8fd9eb26a16a362afbb41f5fe3265bf64bbf14e5dd9cc587462286cde18926dd2d8a861e3864d1b366cd8ac611381958d1a3d0069ed46cdd8b361046526d748eb4d2f413f2a8d2136689c917386e33edbabeb9666f08fed178bfd2ddd2de2cf9fb32afa3e13fff87d8f3893107f9855939a5c78b7ec14fe6f4782df98887fac73b66ccb688968955a30e7bcee9855653b09de1a5ffb8b95eda48dedaa963edb1f6ac3e21eb5536d6be9fa6f27d256cfaaab06eb30dc85b4adbbbf45d5dcb8ab51fbf5a706bf6bb6616fdc674d9d48737b960dd3b6d6c61afb6d5f41bdaaabb1b1aeb95a7fb5cedd8ffa5837d236fe26abb6b47fbdc66ed4a7bbbf45d594ccd675bfab243dd23890c2545ed194828c581a53c90a2a999e68a590c66a9a92a46d5cdbbaa66dff6eead3b4aada6c653bfc6fdc9ab9fbb9fab65adaebf3a6697fbedd8709695b2bee56b8681a10d0cf863791e6a3f900fdac56e9fa4d3f30f5d5d4eea426dabb1dd6344d3341737bba5a69daaf6a0beb68675bad96566a1d687983a35418ddcfb50dbf70dcb5b46b2facb2f1eb8d9c7394acf3d2216f4992682bae9a3e6ffaaed6dddfb29fc8c5aae53b8355aec65a54241715d7eac282a393f29173ded6adc2ecc3af2a3b67aa1f935691378da7ef6baeebfe2875dd66fb0f65bee0fddc8cf5751d836889ffbb4bdfc41faa473d13d31937f1e73c6808fe26fe1ce40ee49c37f79f2f99b1fb85551f999aa632b595955b7d3517abfaa4b25849db60b29da4bd9a7efb2e39e3eded3c8de84863f7bb44475a1218dde919bf0fcfdc6f51f5dd42fcd77fb1eacaf7f3a7d66ab5ae7ba845c24c43e1d77c349f99cc8d5b6df62ff8556176c7b4999aaefc67b0f66c6f372c49db5cf55ff0bf31acb61ba6b55229ad77bf5aad5563d2b61766b7db5f312d48db5aefee61bb0a7798b6aa281bcfd68752571ef7b53597aac1af1aa46d67fcc2329f1756352467fc2259b7c62e71bf8ddf17faafb65b5a01bac0a14591b2c4494a954dd3de24301bf78efeabf9b05d858b347677f848e3efaa5de9655a83bad20cee4a32354de32622b717c15de98c9be0aef451ea1328332854859bfe8bbad27bc64d40efc333a19f40a88cd171f241c7a906a72017abae2e76f399bb7f9bfc5db595bddb53f8df191c9b9c6f35d612d561eff2cdd54f4df85f737d94dda88bc7594c77ff0afffbbadb3539df3a53cce85019ad649d29e51425538ee45785317955188b07160bac1ce79ca2c1064d2ac7468c0652506cc2c829340ec8798755dd2e1cc2ba5517ee30dbb51316bba8b6b5f75f6fdc6acf3b6b769855cdd40a52bceba9be6f6f5fb0bbb58feae7d1f3ae2444f4aacbd238bb5d945557ab1316bb432904acea4e5fb505c7b05654928f3171afbbb91ddeeec3aace08540c697546f8c93947e92c9d6073858d191b2b72b66140159b26e58c942629433933510a93732a10a56f0a2952bfb93d855d1f071c70c00122420fa5cd6057e56ebcb5ae05498044c5f6b2ea76897e70620a05e43c44143f9ec9fb2efe511de60091ad7176b3fd570dde338dd589c214e5d3560ffb682b9effa62848a240907b78f8af5646ef7fd118ae669b29dbbf7d453519fc31cc6e77bb54ce76546b7b5fab3840647bf96bf02e7280c8f6c6dc9eb2a9b66e75db3c45f5736bb35ec5ca9a626560738105726ac827c5001b5ee83cb1a3c365ce365194b15980027296bdec572bd36cdf575df80911daca555f318dfd564a57628f6cc8e46cf3041956e954de31a68727e7d40d4cd82ca144cef9a3e251e9a8aceb1e82a14e548844229f9c61a82cd5241d62622883d7dd3adcce5c94bb3df6be7be9056f999a3e2c7e6d924022e7117c9bf8161ac17fb7d096992c1615c3afaba5ed2c0c2a8bfa725db1e25485ca145613d3084b4a494851a0183d292a89868482c8510c97f81452482113189140a553880d02523643e49cff08a2ddcff4aebd544ad1112149040d80bac87963374c6bbde6af566f532bee330dde7bb6aaae5f39efe1d1d60d37c976d2c63fd6663eeb4655b7c3affad258f5053fca4ad13676a331aaf5bc5adab5ed379547fb2d6a53bbdf687b6aa552d8476a91a0cdce77c7faaacdd675ab1ff7eed28260981ac2bb76875dac0aefefe161bd2a1113ff37de4bebb9d929b35575b7db5bd8b3d823de95deb597bad2afe76ef733c15d496725cb795b2db958158655168a4987543363b7f6a81ba3efc2eabb764b8ac939f3fdee588bef37fa2c28a9a8780006214d40342298b247fb0507410211a64c51471263c836f062ca0b4c79acd13a22c494112260010ac814a99992010e1bc85046cbcba2638d232c207c606125e068090f72c8820b8b8b101342c000c4c67af29a010a12c903964a0a079eba68376862c38ff844830cda64c49a27354b6091d2f42ea9600255b840d004c4040d4c54602fd134648621ace051da611a43083b3e0a34346002022a000ef458e9824945e2c2a4608264fa30180003b63dba60ca143cf085d315eb080da0c28d24ae00b78c90c30e1650f9949c19a1257b43278b29b0119490905240ce141396fa98c0006b7088ce25336d4c8043e803064b320892c7087a04622e4dd9c18308246192c21207e502e070c18a1ea4e021841568ca288404290ac0000c23747aa0408a0a4d982181088ce84841429a4182a328a09042c11042c464e47083121c19a8f0071b434628297101958602901028c53629cc60a38b264a42339c49420e20b8120094808b563c00917446153d0f38b3c58224210699220232902749eca9451c36ac7193462937768800481f4937ae0a43ba6f401243839888160c06483cc851820616183301126a871c726061012224266b04c1e294814501844bd21e3eb4aa44d182035d91234982285f96341c4b4d8e8872c5023bb258204850949d3760f062a4016140d1e38975658305822285144f8c14800b07c5850d81283606310365040c22d802056e0028189480c2102f56361ccd31870e13c499f7c88916929079220c96a313182042022c8f8ba322a805e83184e587239d3cb8b022061724a3351260861f47cecc8c8ae843a6459a30dbc87dba80788105751835417bf6c8020b11460dac00031f60a068f00402618ca18482209c78f243056586aaa8183c79a9001163a6c5f1c413da6e17492b141182e60077a071c24dd19922e24052d4003045389481028a1cb68222b3863cbc0c19b353d40364850c43c31d251f3acd05e8388383d24c923a980840a54219431a5ae420a4059b92b5041f0be86ec0529b41890f8fcd0d4477c8866669f8f00411144b6cba78038a1f445df4108381a432084014e50239cc80238f25a2099ad04006050d4e86de7092a37543933c94c4153097d2993c14f55571018d307928288b9998a64b1e8200aa8f0fbe9c85cca0428b0dbee42c240407660e27390bc12ec84108d1284a4dce59c8268ca939c001bfc3192da02a34415b0b5dd664c9c28b0d4eac38d911418f9c73e7c52f2b67cde725caef4e2b0f9923e7fc94556e111c249fbbffbedbc57de5ec2e65f747e572b0987d7727b71be61a51691124e7d8b35ad4909133acb2b14a8b132d54644d4b1818ddee7ea12a2d5d5a1accaa9dbbef7a9855555a9ab44069b53476ffdafb39dbaebb775b809c73076e2f633ee5a42fdd092bcbee15154bc50bde2d93198c5302ced3eb3efcc64cda0bdeadb6ae41ab95680407396454b0332ad8a88202430585419638043b2355961f55161937834a1593c5819cd5de9afc656aba99642903e78e4e0f2f480081b7364553985081312668d2fac20c36b61ca0491d7d383193c30f73fc0c400997881a2b7cd80289215ae4914212046ae4c1000b0031bd5fd668e2f240c31fa866c6a76d000b2538a4a613030683b0879115a206b678cde468f171624c1f16881a34498561802d8a005345045686150a416a29e084b3025f725031231512f44004963000c8b20212806900164240ae204300676c39aa3ce0023878e013416ba408f7c21c6b88719382d6471651446dccd1444a210340a3e70b261efc609043105b823e00830da69b24b62ab807b4380076fb19b49433d0ebdd2f6cb6d7e76cacf3b577d484c5ecafe6cc353b2f7ec1edf3df036567ef5eadc2a817b6ddbd2484b2b33748f53c2ace838a9f90f3d1f33e64765eac4297c0a992330e151cd0233853705819a729e78c83c3e404eb7f8c9073c65992927326c2b36a8bc91b94db631d3e21c8daaa5dff65e224e120e144c1818273846384f3c4fc811fa5ec11541313db8562af147b25ae2a4155026c8342f7f9f056f9c360aa366b692feb76fe32b548db60f4a9e55253ae6ada367b3792b6cdd6d9a9a1efd658f5553f4af6314cfbb3f5b6de96b6bd3d3e3358656318aca33cfc7d54f43d62fb1458778b5e15a9b38ee0aea4aee59501a8a0ba0267d595a72b5fce1d68f0d658d8bfef7e830b352a2bd9498fd48dca094cced9e6cd81a8a844e15441ce9ba9aa6226e7fc7259c2440c151523eec36a90989ca154537e72263024a56229610096114b7b3fafcc55ce3861ce3860ce1907e7cb328e65ae564d649ac4e48ce3e174364cac524e6e703497da7098a0c9381bce121c1f1c253820e028c1e9c1e1c9192789db5d37e79413381fe0789006ce8ea74272428554040c95bd717fb6bb6e198f10eb480f6f22defb935fcf0d85ed2acc8f7aba34cbaa285864551429b22a8a1339e7081ce8ee5f9909b15d7dd5289568ca86375110ce0365aca182620465884dc94875f445cead168e0547f2ebdd4639e354a0ae3b671c0a7026c0318223810a0620b20a062f5905437b24ab76b822ab76d021ab766865d50e6456ed2080acd2a190acd2818eacd2a189acd2610059a5c30c849c4413273042ca39ab8c4030eac008a7c39a8fb68275375d23e7fc448b2763b2b6eaaf98e6f3a4869cb306c75df5a4f5248ab682f72ba6f99870bbf936c558d7b8084795b2e1bace8b6d267e247bce6e98fd2898fd28ae762aab151120d4e948f3813dfcce9a7edc5eb4ae7b68dd43ab1591d5ca7c9f9bec73aebe4cb5dd66fbbeab15d052db0675d66ab5a3bdfb67bbf1e66e475f95bb0fc36a0c7ed786a940eebb5835355b57bbaa1bf632d58537ecfcd8ba5dbf72a0d7bb8db4c038a96de3b9b551ccdab6633bf26ce2992dcac4ae24f6a842343635f6aaaab04bce39c76efc8646e1909c373e5bd5ae048a01af6c60fecee4af0720d3ec2e9303196d77b71e185ed4ecf4f94f359fd67fdad2fed3a0ff340bdfbffea7409f9aad0a73b69fb167651bd69d81df6d76613ad947ed5f3ba3fc7647f2f6d432e17fb59a9c33e7bb8ca9bde4dc4f5357e9eb6b9a9ceda7a9f3c655c1bd661ba6bdb387fa17cc696c9f9d6b7246a3c4444c1762d2e697c564296ffc59b567d158263c39f64cf286266f5b98cd29e7bcc14adb6e7f65fba9a1c93967d51259ce6f12a80d2f315aa2e58df5519373f629e3c3fa702a1f10cabc2a085ff2b64168e50d049e475aa3e48c121e94bcb6a79692eff5ee578f1e1b1bd46346d5d3beb0caf61e221e34543c5ef2f69ef1db8a3ddbd2788ccef8e5ece6d1729235495880ca39bfea765d4b9e5553eddd9ea46d1f6bd96dd76630fc6efb6225195d3bc9910fbef840a6fa00040fd2f0600139e7edddbfdf854748d2fe052b99adbff657c96c8dedcd032e1e2ce5ec816a078f1d8b615aac1bf17f6373674cceb915829dd9daf992553b5cce79fbdd727b8befe40ed40e7270a93ad8927366caaa0ef8dadffd42a20792323923e1397fccaa30db51568564547100070765727e177e3f6afd17f62fd887ffc72e0d7ea17113ace2a0bbad16c401e7da4b1a1a955680bcc14bded566711ab5f6f75d6db6611b85d5ceb6efdaedbb76fb5bd4a6d58aa5712a2d82eda915f56e0bcb9e0502fa61cd19dfef72f67f8bfab2aaebcf77ed2520a0dfa236693e3f9d37a5c3ec91e633c6edfe17fceeb50988f5b3c1161be490f313161fd506ac9cf658b5c1cf06193c61d1b8aa9180654b1a7282d987f5a4d58a15ebac067bfceb62d575dd432e56d5e0cb866ad0ca9b065c8e5db16733080af367085d95c1d2a9c149582d832231150669f2a6f5bcdb613cda8cdd1888c1a065639f6abdc32c0c9c6c1bde17e8d1952e10d3590dfe99e61374c1d28e05a92e289237950568e475dd431674c92ef595624193dbb5eef5ee17106c1e19b33db58e7439e27484e7e5f61ff65f31a077b3ea8655b0f46e5a0197832aa0000dd4bb291093370a64148caa09f450773b8199edce8226906d50bdaf9cdd138446f480d50d7383544678c879db6d9011b7a74146be6ca4019504637a5e58f5e1d1342d4825412be7add58255adbf622d098ee49cd7954783dd1ea49240a53293739ec14aaa302a5597bcbdef19bf2aa39c774c7524e74da583864a878757e9c8543a4e32cc3eec8ba899ad6b9c1611b3b5aa225e72ce9baa48bb157192331beb458e6c2e565524e72f5205a08cdb59d68d51b407e04bce1bfb501b5605e04574a40a8051ce5b00deed30ceb7a66dfc73ce3a5915411a55046c67dd186e5245e07a89ac5640dabbb5ffd4946d58ec592020a0a6d58a05d4b3e14da4f9f09cf10bc4fa99b2e14de43ae35705002d43a0c719087880e095b7a7960a02275905c19107d4a81e28b33db5bea81e707a60dc9e5affe90345f2f6d422a24645e4ccf6d422c2435611696522239122aa1a332a070c00f46a3e3c3f3d657bcaaaff295f5f2de24732587f63f8bfccaa215f72ce5b8fcaa30d69f90f1973de8614999d410db8a16ae0cbdb576d6b3ea516ebeb9f1a1c9faa06c69ccfe70cacc917641503681818b37115035d540c38d97a78aaca59b3f5b8af0acb3993375685a972bee4fc6ebbe52c6daa1c0872de7a3acca371154e162a9c36e7acc2d1f2d61325ab6ecef8b45ada6cabaa1b311bffd88ea96eda9cb7d68d13158a89eaa648ef3015958d9a9c37958d98bcee5765d3caf93bacc554365cce5b4b95d2c315a505a95266845236b45a9a12d0bba9197bb6bf6240ac9f54ca6ac5ca39ef6455aa4856e534aa3c266755f6b23db554b9a5ca63de9e5aaaec003f52dfd7b5d7f4df4dd9dfd2ddb41019421da34f0568b562fdc8bad0bb655d68cd4643881842baaceb360969113212d29506414374a429e90cd225e7adc330557b9344a9ebeca3e49c8f649d415a5babbede9f9cf3367b28a6b477b77d671f65b5620d32441038d6dd5356e5472c5310568a205c66830409244dde313381f090f38e05c97250203bb01d48bec0980bb439b37f0127f904240e1d405a5a4b2db7d8b3af03482b6fe812f6b98aaa71930e204e72de78575a3387cb8d81600fabefeca1cef88572671f65f650b38ff2bca36bbae4eda9b5c628af39f2871e7f9cf9c34bce7fb4fe7092b7a7d61f45b6a7961f6afc88e2f5ee1710abfc77bf96feddaf76c39bbfef76cbd58a05d4e3d379cffbd039db490fdb2c0c758202b33bc68f9480804aa275dd2867d52851aacbedaaec0be317a8f3a260a8d36af545bdde0dc76defaef93ed00ffa54f813d7c99eb34f9da78530c624e854e00629ab150c75325dac3adbadf97ab7110c75e2ea7ffabe1d0dc1cee8f5eed71803f1a33d3ed0038d9c37548537acc3f166ffe47a0ca187521e6bf2f6301586ddaef96c9fd9cec34cce5b1e5d36931e39670a54418117058c6c3d2d18eac4d96f6a3d9c761ef6fd2f9a92752650c40496f29ec01176a3124043022b4880091e6ee041031e63debaeb643f8a753faabbb4246df6c6dd7d17bb39dfefb29b47dbb8ce1d6ddce1057ed5a00d56b5fed2b9038a1d7c84c95bab47f3e147ada8fd8a39ff33b603ca8e0ad498c979637b1bef0efbb0ea86956abc6456cd2b6f30ab05a91975ea582373f6eb10a20ea46db6f267f7bb5f9a0e1d6be810828ea535d6f2aaf0bb787c6ab3f5e950cd4145dee00d8b3ddb6118a6f1fd9a638639bebc75b6f5501b6e416dae23c71b72bcc143ce79eb71fbc9a3c16a6783e498e9c8c1e5ed7d63ed6d3bfc6a720c4197b09dd589a3ccc61f7eb7751ffef5d4fe05c7d17a18ccd5ddc601071a011f9aa61ad5fce3dd4bd46d77b986425486e8a84ff153f4c7d7e4465f1df6baa1f10b35176a8e033dcd7562a83b4e8ba818a22819925b77e8e65ea27eb6afa889aaf086df4e834a57cc284225a9c14df27ffe6d8e875a7c891ad6ddf4db613dd919e36d433f0ad6dda26d13dab68e54ba626e093a9d945dfaa8e775a3773ee75072ac2242c9d3ae4b79a8bd944c4152ef97a8b50e47f03d81ca737f7876a3dee0a7bcdbe34bd4e3bb7dc8dd54ceeed3a1d215536c02ebdd5cb96b9a0efc94a3e6cef0fbbc3dea10d4ddbf443d6a3184fddc7764bad3930cb9cedb64a874c53461a53d2d7aa2ee48b20b452fec4670e4a7c8fdf7e994f4463425d36ddb360f6cc9921b9f8762f79da2defc13c734ed26893496a978821bec9eec44f11b494e2c4f920bbd947f5c27ee517fe34bd4a6a7c350a31fe51d85a30c8cfaca9d8ededecff17083da3bc597a8cd4e87302cf5428f0bd38e83e73e41fefabdd173c5e71379a0d21513aa7bed71de478e64e7899e1eb9f1133bb1dbfa494ef21425f9f99c7b895af45a5ce9a1ffdc276e1da69ce7a5dc4bd4af376e4db7a7a1661276a226c34e8f1fa93d2fec3ed0d31b2c6a5db73214c9d313cfaf7bcdc574445fa28e75d7656aa4adec468edbdd77ee8e836937822f519b9cddba1377584f7682768676583b2ca41df4a9c43613696549c9bb0ed5230f4fd4fb462e762f519ba2463fca8c6d570495ae98a34fc99d9dfeeffc748a9e24e7fe256a77bf504e9b2094a0ee3eb0dba18792622a7ae24bd42efceeb09eec6c1b0c4bb7eddd8ebe7b87eb62730495ae984f4a4adee94e444354f44674244fee25ea1dd6939d6ddbb61d16d28ec9aadde7c22d524f098aa2b8c9ed7d5a14bd94035fa28661a9493eacba554018967aef76f453ba62723ce61bbba6794112ed03241ec036d8713bbc3bd0ee869320b180830b3428749febda9508e0820d36d0c0820c30d0a6c97301120b30389241051e47c19b6402237cbfcb23818f4a9bef4aa2a35f25453a2e00daec89a0e36f2a0180fe420d2090f518bcc10321d869443a6d9a2e567dbdfba539d07530c4f4a0810ed651f35dd3d45021d8b5e8bf220333d33461d97790a3651b26001c6df6d5d5570b6e90d88c291c6b90d2a6ec5fa689be2acc84659f415ea2020841f4917ad8667140102209081ec85f84c14750ce29cad1600a29a228b3000540f10499043831a609269648028923c4185104110818428820c200f1830f600e60801c702000ce0d385f6c8821e7ac84875cc4a9cd459cbcfc0d9a07e42023e79593e6b872d2214471c891293081941a55a4a850c521e67c0e4773fe2deaab041c279c9b08862728a4e0e50d131a2821a7651261230dcc8012559a2f6960d40d52a501e20730301865178c60574d12ca79b3acaa85d0691e68ecafecaf39e7ee95556dbca29af8c1c712b9091d25e7dcc3171ba82c89a062e387010aac1146ce3954729eb0e49c7348187265c9ca925315274b5496a62ce5b09672caa526267049682967842529a39298142281513e28de518e51ce939cb2f388423d94239413e42447049e0394d324e7272784ccd53376ce1892573964ce288639e0977356957146050196ea0132345de4785dcef98b1868e0fdaaafb9eed7ddde1c9d731e92c3a9c4d85185b173ce43bc0383043096f26af5d904e04d357921e68e0a3ff2e2092f8ec81f158f4a0326d0003860a8ecccea0c93f7ecab50d745174cf2a7daa2a5daa27cb540420b2040c851928324a7278727494e06391fd881a326c7831c2dc7829c1d1516391de420c9e12047cb39f355adc23b2fd4e315ab2b98e44f6545162a2bcae4648041ce05b0cee69c6341ce91fcbeabd5e745ad56dde745ad56ddd16ae5453d8d62087e5e07f4a4b51048f841dda01ff4a900f514887da4477ad85692eda4876d76c39b03f1a3d50ad6d9f7e5ab5a05e8077d2a71ca433dc2ee6e81803aefa7f3a6c02fdb87c64ec7633c7ba82fe46a3c0552130b76f7d28c7721959dc28f66bc0bcdd82018ead445ad565994e99cbaa8d52a8a2b5148c95c37fb2f943d67b3ac565ff6a2562b28e480228d0c43653878dc91338e1d386a8eded5ea8bca6e8cef77bf3026b326ca34db970c19324490c9a1475ba59d8715eb43ef183f8c3e95576d835eb5dd2e565d5b989a001bcc37b39e00394146563961658c15f907fe26ded9313ae79c5ad3841468987186194ca09131d1424621ab96e06389277296715609a3247618738cc41a489c511db1a68c31c8184325664d900a5d4e30c1883572def0eb8211577236dddf6e0982200882e0f77ddff77ddff7799ee7799ee7795ed7755dd7755dd769adb5d65a6bcd755cc7755cc7755cc7755cc7755c4792244992244992e3388ee3388ee3288aa2288aa2288a611886611886610882200882200882dff77ddff77ddfe7799ee7799ee7795dd7755dd7755da7b5d65a6bcd711cc7711cc7719a24499224499224c7711cc7711cc75114455114455114c3300cc3300cc31004411004411004bfeffbbeeffbbecff33ccff33ccff3baaeebbaaeebba4e6badb5d65a739a1cc510fcbc4e27c18eaca87e4092b7fb4c50d5e5ebfe2677e9dd46474d53ba92cbb710df42effb825d55886fa17763385ed73d348355b7b3b1c66ed8a5be1bff10d44d7bf79f7b4561573db5adb167cfb9d9231c31701c0006d37e395a9670ef4cff4cafd2cbf6f88cdfff33855f55a672368e4fcd873f1bdbedebfe6cafdaba758020679c2f72c6f122679c069c219232a4549a4c5298984ab3449a422425c9740a4a5aade0edda6d775ba4a877b17d7d9f03b9366b698c81600f1fb9faca8f9e555d6c99c39783919c730f1987879c7176c0d1a10039f7f0e4d5158303cfeb6eb3d37cdfdd6e5685a92efaaa9cab2becdd31ad1b41a1ff1a6adf9c37bc895e13aa6b3e3f1bde9c0043beb0bc72d4641295578e90828e98ca26b3649ac20a527a72d4f4ddd024e71b3ac8dbb6e58c33832167fe028e0b382da8be28d9c0c3c20a2ae49c7170bae0a48002573b152939e39c8063c2971a3ac8fbe5e8e78c3393e5cee3d9c6898628340c4143103410e59e6ddb78b4922937bd9bbf309ea10922b8af4d2fdcd7d76cdbbd5a911a043bf795a18a9c73034d6428d2e69c3d78dded35dd6f5532e0e49cb71804c95262d8b07a8e9d36df2943c2e49cf76aa57969bd3ce005abb1b1d3310c8298ed1bc406b1412ad50b82e4d7ddba9af2a30276c0916a43f582a67ac1c6053e5c0023e7bcae31abadbe9dc12e8871e1071d5cf89273eed1563e3e3c2ec05ce02bb0b078eda8a63dabb2fddf0dcbfee5eaae1bbf6c5f7b52565dc20404cded9ad256d2e0eee2d1b4f7e1fee743cd1eaaa748735c8c6509c7715c8c85475b7b0b0997279fd6aaa5a19fe5ec1a0bbfeaaa6d77b74552ca1972e09c730fcb3373b7e9ee176abe2a210c10598147a58212385a70da9e330e0b2bc4819b227206b2f92055464e89f1458a8b5410283879dd8def77d59c715e39e3b870522c3976d39885cf388537c0b0800b789c099382122608e04709d84b21eacc1c5e74f0a52705a1d508ec0a6948910200946020078e0d5f503883154706685c355010020929509c9000070a3036a2209171b8414194e3c74b8ec1a07093c120640f7f8ce112460e67b0f4d080c48587180363386842840b4a00283317ec100217264b4aa45ff65873022000a052e6e5a38b13b4209204175928194ff83224062831581738c18a1142454760f0e3841d17c2f8610b03a6097a403de044202392095210b9c10208351499e0c20d1d3631348180094b62e001ae7688800917d05172f0879512b6cce1020e063e4f52d8e284189ed0c1fa5b4c984186d6b844df52e440085d9654a1618b4e184152199468676b7c5d10896d499a15f10588100870a6c9cc050012133161f4ec070e095280bd15660d60200406163f5232089c00b6504a70c97cc0c10b1924382264ae23563d2c0b9491751338c341112c00891172e4e4abe3072cb133ab1eb290000a6362389c46c054d17d10336f584b0261a18df188113503133057a22c90060842d0c06582282bae7023cb963d45540cae39287046894914ab6903a7304034446942282c81448819f11d3783c061c48b3de227c420442936c44cdca5887f800030570c650832dc586ae2817802296ca4f05af103bf0181131d1685a070124f54b8e3013cfc00c71008630abce5081c146b61c38f3346e007f2c840872a45bcf09ae114471233269c3788340a40d2058ce65d0d50058ecb52e10de1e0d09010e580d746a986f704f301d701504cc0e3023a097707b60131e4c0470cee694503410cf94186bb8410f70040ecd1a4e50f42b0a0c0821ad6d09245f7b5b1e58c38b40c4001520c728315282d4e0460a2838c50d1d281180faec86ce8b479bcfd005f0e76b451f47c30411648b0da16343c88c078196a972e9882860b29466b41165474398325852e07181d1c00a3008c3e864ba96547d5a46f398740c1000b39f412839512283051bd081c3950800a2e3e6c047038e07281ed064b04983a7608448514582d5098dc10c4d5031b02121b784b5c1b58063870020b19b08000f6802706008610460b03c3a2600a02c441072c3d2289060849c103d67140657580b78375109b0ebeac2923ae5d7c7638e102102e56027c91c20063170f589f9e78ca620010acb026c90285f081262094056cbe28a17325500cc8d2c6202930800494972929e80e6a0aa8a6180f7cf050e1a004e0c1152f14a10752163578a446176a2092854c1edf12110143b2a430876664858137cb510b168cb105ca862c46542684ce5081404dc39ae11586c80c1509cd0d003860b5870ad771e48c33ce2baa933269945042a90995c815ae2d4b4071e25586cb8540aa28e3ca2b0801fc70124264f4827a2fc44156007881780cf1f12287335e292f6354191293c00546041bec61c40e1e2e1db424e08a043488c1b5f91840131d4021c3e52305973972885e48fd0864873bb2f830a6589c6e50608a3180a4356429440e53051bd22a5ec0504002c28020453286196b6c78a0c95340000cb882826c7f190b7e020d889a67e1490b45f8e84202af84c6184aacd7c81f59224663c886211e47157fa409210879133a5849a9484385cf4a234c1c1919271287600b60c1052fe203fed1f302024d230d1527212784a00820232b3a80ab435b1b70806ac2852bd0550a4ce51c428881e67462c43bd41071a2e9a3c9cc436be13c00920d0a99239371fe1373f4d0423ee2d44f2d6c419361d8819c19e30f321f049b8bd5908f0d58ccd8379c01ab10818b6c637963d8be08848ffd01166478d005c9a2550130aa052b3bd8b4aa405265c5b3870f2d189494d86048e2448b89082a3300c1c4474b8332aa945f2c6002661d6cb801e580b98749a68239f258914962a240c310479ef0704da37685991c5490604a5003b82de9d044096e184da1a08e2a299470040348c8a2508151029c3365492b026694e004876827e984244a70200c8c0138b6ea898c2e5546282e889fc2a44a2c7962428ba72c4dd21815400ed8d3474812036d2c5579ca5fb41088f2ceb078e1c60577a89848c05280148ca6088ac009587617a600611c71584068e1431287982412fcb8c1a246015a1312ae0003a5490b3a762081862543518440840612a8c800260726210c410292215c869c0459e18a04d438734858f2c395054c808178c20e0a5756881901c269d05d499ac1883e2c3823e54a054248400b236144b002879a2a54242c00c30a13414c021065c31256649f0744ac71f7b03284e50e3c96f05c6125824074644641a0131a67d4e022cca7c4698831e018bbf44ce1d4a350f9c8425b38919b832f198472c2497ae2f59ef2a88206a8a70f2c9ca0a14a0f8304200f1fd4a4a9c2bd783fa860025daa7041f45146829d94ca05c05061a5ccaa09952da0704fb8c881102a370cf900080814f9820a094e9a80119cf85d983e170535861148f151725cd88129f9759fd63c4cd197a8a3a0cc74ff6a7e9a4a14b07340ca02259886271fb9f829cab5e88de4ba59296398f2235581929f5ce7795a7fdf87de799e2f519b9d8f4fa93d4ace1bb99023d3738fde297a2efe2ef76160a747798e2f9e9a4b53aeebd233e45ea20ec13c4ad0433b4d8a2409f2f4bd6e7c897add0fbf26d41a9f2e56253f45815273218982a206bd9d6a8f4327507a5ffa1ec9a528088ee119762f51bb5853bf8b97fb918676e03869dbdc8772378cd3ddf3ce7e36605212e8f4d879a3277224078a202872e1975a218547c979e9796a92fc4871fc3891f4b82ed44a57cc367547e97d3a92e07886dc6f34e4e24bd4efc880941d250a8a213a6e6f3f888ee4b977584f8c9e4988e8f56ea3d7bb5f4c433b463b433b4d2018454a4df969c839df1e0ff5b8f5fe3a4af023bff3b70876e4d9a5e1d3517e9cf314055392d3e3a3e0cf516eaf4b3fb2dbe0186a70e45e8e5214bf51fcc831e49e0c5192c751925fc86df47b0da220c949148e72d4e0e67a7b9f8adfa747f48d1204377886e00e39f1d16f9f694a31d59c13f507729db71f3cdd2849111d41fefa35fa4f7e671be57b689a8ae0c9cf9324cf71b351861c1d53f243517d3e893eb946e9ed548ba21792df797a274a46a0d4e8888a5c9f0f6e104c37a946e9e9ef4ef0133d9e46898eef7de238a267c8b9487e689422c9d313f43c0d6ef14339ef8c121c39b1db640786272a9e5f6746897a9b3fb7bd537724e9ed32ca738363f8e8a83ddeed8e83d5d8b7c37ab2c312f5eca14c72dd6f9422a3443bceb737fe3f178abbd363945be4dcc73bfd81278a92e47e89daebb4a42050a627c75191d3a378862447921e97d403cad3eb46f2779a726e0c4ff2d1943a1d3b74fc104d51114d4f528c12f54094a3dee79dcfc91d9e61949c8361c7c3f1fb529003c9940a2907941b15f74992641a862929a2bcdb9202a3f44652e4284739cdd31d7ef77e51921c7d0e453f0f1db7076ad48bb2d31ce7c0f143908f1f4fc90694a4a7c1adc7b41b3d30dda17e895acf52674aaffb380fd5a4286a2d7268f712b56742aa8bf2e3ba174714e4bc333cd10e7c899af364292eca4fe463387ea8c974775e08be44adbb9edaa22445b44351144cc16e0c392d4af40451fede3882e1a7c35304bb2ccacfdba24ebd0fc1ee450eee1d8bf2f4be91835c787eaa5130245fa21ef515e5a83b8f93a0f8dcd9917bf45ea22661293365a8b9eeb618761f4f3dfe71971525f92447a6dff83b0dc97ffd8659520c2837797e1b0c49927ba22641f0ddb7bf440d95aaa2dc9c4c434ea6dc73a2f891de4bd41bdebcfbf4a7dd1415e2477e1ca7c9f003c58ff3fedbfc043bb10347fddfbf0b9ff16ba29e06d9be0e6d1ba974c54c15919aa2d43afc140cd327bb2d822897a2f4b6265370fcf004493225c3284ade75e278866038862877a2de4bd42e569d714e77983d02bb76c33c506b125265ca0d8ae418ee2739518bdea95fa2761f569790767658484aa4165072dca729ca892fa23a05415db433941ec1a8ee784829a024c54f8fe8a879da3ddf1dcae91f52509424898e9b1c4f4e1c43fea1e73bfb284f9423778662f7244a86e30eb9673f2a3b433b51e0a36d1b67489129454d72dc0bd12edd6347ee7f891a7e97f7aacbfa785209281f4d35dffcfcf344bbf13b9d28b5c8edbdf9b8d150143f3ea6fcf4efcdd38d76fb1c1f0c9b2847340cd35073dfa122b7494e73ddab3da52be6951413e5d6dd287252e428da3de9e925cadd3df9a5de479ea11647bdc4b423b433b413b4b384f4c529254a92a7fce3ce910b45921341fe12754f59b29db1b62d04d78dbe6f2a8932e4be748f67c79da9e6fcbb97f8bc2b919c3eb98844b9c3ce4bc9d0e31e177a24e7dcff17ba87b66d68686787f564f6515eef361adad96121ed081125cddc0e7bd80e0b69a7e4ec43a15be85597b56d1b277e3780a48e287528ee6e7fa7e76d9004c1544ca93bb413c9330539507b63c7b76d3bf927a68c28d1cdc70ee48fa663f7a1a47e893a043ba36ddb61216d9b165db82da2fcbe911c39c9bdf3db1c49a22f51f3b5a7e6cc85c71dd6939dad686768e7688785b4d3eea46d6b376cdbdeade3b4d2153315438a8832dcffe9c8bf549f64f776fe69d0855f2f4c21a0f4d094fb50ed711d923ae463e72435440972a8c7bbaf7bfe9127493efb9f10a516bd4f43f24c47907c91a78238d18d72de8362478a5acf5c987dd07d963d9a920a53827cfc50d04b478ea67ca3deaf6dcce2524094dea8d3514cc7ef5ffcbc947c891a6cd27a8461a9f743d989ef7d3c1c3f50779b033b35e543e96daef9f9f1d44343ee137f0c95ae98ae1498d2137937fe6f901c45def1f774d8a50e508ee2f9a8a8bbf145547ba8d98144290394a74ebfe740f1bdb03bc354dc613dd991f12317bb99b6ed5dec76b7ed6dbb1695ae983cd5034a3e07c390ebf8ef8e77e96f51df29dbd6dddfc27676db60317b428a074efc466ee4bc8ffc3cdd7d5f08821afc3a11fc714c350972cee3c0a8d40e2547bbb30b39f13b12f5468f0ce27b69db5ef741176ea9a47428bfeefcc8b44b51fd6991831f17a0fcd4dba848929adbfbeb3851cda1dca097a69ef781629aa29fe6e04ee1c08d23397e690772ad49717c89fa0b450294dd076a7dee4fb5e791bbd39d17b730d53b5337949c14410dee908fdc488e62282a5d31d3d497b2d3cf75293fb7f6b687aae6b73378c6066ddb8cdda1a774c52c5336845aec44dd79dafb48f21bc74ff4f4197664da7d1ae52987a26c37d775a3e4a3ac14b6281cdfb67bacd400ca7da63bfdbe4353113d4f907c89dae4bc540d25876aadbb34e5c2ef3edde44bd4a6d975ebfae84743f9ddc93f6ef3b3133547c550e98a8925354339825a1c9fd421f98de1937bdbd6f5512e54ba625a49c950922807b96edcfaf44890a7e24bd42137b7eb0275a7a1a46228b9d1e340124ccf2edca3c7ed949772934ffefec0937fe8a51b7c891ad42918ca2ef448afd3bc23d3307d107d899ad36428947aa1d47b443f0cd16e732f8edff71275ec59cffd26176ed25a74e1d78532e5e3c8e96f3faad333ecc897a8cd57ed740b21f97da4c76972f43a5287a4e6bc5373e7a843314c4f70f36f04495129c542c9851ca751effb4e12f5bc54bf446dae318cd33fa9154a747b27ea8d60376af04b39ee25ea2ed65b738d6123f7c93acfa50a8d212c66c9940a258986a73772519ffa3bd0734d32d5a54c393425bf50243b1d7e9e7786da855f2f8552a31b24b9277ea9d6df73f225ea318563f21d5df8f53c14ca11dcfbfc34ed1e05c7ef48924bb94990e4ddde1f86224f390e9e50be0ed1f0db248a8ea7388edd4bd4269423f7e8e9751f1745f0dca9f71235e8b3a5e4d0ee23d3cdb7776af43c39abc6d8b8b3e6a857b3f24bc7736f12dd69c7c794bb58158ae464253f538ee428e7f13144b94e2f75a56d73fb11aab27b69db7acaaae6b82556a21e29925ba764988e249a822f51c763e7c2ad0714558e29f7e1083ee9f191fc317c89da647f15f5aced28a83918efb0764e30de213b302e47cee3464ea65cf82237765dbbdd181b7b3aece0f2bf473d3e9e62377eca71fd123567e3ee9a9f95b7e4c41425512e1cc58e731daac323b7fc94fcf47baeb7d8753c6cbb496a7044d25292bff7eb93e440b113c50efdc2146c4bed91e1a37c772089a2223f5fa286dfef3ca35e7ee148fed991e3164f2e72fe12358c6ed99beb86a96407b2250775c8e9eef346924bbf0e7d6e76d814b5088bd91060e54677faa53c0d498e8328c87d476bd981faeb3a1d929bbfc7edef9e4095fce3de3eb71e3bfee9d1fb583b454c3bdd932c65b7cf50d4df8986a787a663aa9621f7a497eaeedcaf3d72ffab24c9f7be533c491144c39013e1972b5d258a867b0c49b11b454dfed66befa7515a7e1eb775ea911cf5c60f1449f04b8ea39c43bf70dca338a622f7f1527c12fd140541b13bc334e51e5a8a2329a65c08ea4f7334e4bcce2ccf122579da71bfd1110d7707ee97a84dcf0c8b7649929ae3429e721dea9ddae3ba0b6a959fc7dffbf8f63a0f14bdff97a84dfe3029825992a9eece300dd32ed55ed8792f51f3dd7a5b0925e875a27ed00347911475f7547eda13c393dc7b737204c37f897addaeeb77db69f7e1221286a5de88a50477179ea0f63617bdefc8f3256a1086a51f9050a6cf47f24449fecf79208706814a574ca72be57ed2fbfe0b432ea23aedba97a861d99b66b85fdd2bbafb857e4d56b8cef33c8f13bd9124434f8ba4078e2089a21fd77d9ca35fc7cef84e11d30ef9b970bb3a95e02772ddb8d1918f20289edd287b23f7631da92ba14afae4f36e44bbb0d3e2e6c297a8c74ec7260c4bc7222ae598ea3fc1d43bc9f1fbb6eecc2924378adaeb44f1d35ef791a0e6c8907b1c48a2ded6fa4cc3f40b63f35f77b7302c4d6295dc4bb94e4c5f7321289260f812f5d8e9186eda36177e75088bd95753799e7cefb1f3c6f31c79c7bf97a83f0d8b59a6121537e981dd7882af35c87de933b93ddde1ba786d61aa18bae2f3793b42099e9fc8b91315f7a8fffbf025ea0e96be3404f52982dd7ba1f8715a4391a251324451efd3a7d8712e1c5fa24652f25214fdf1d4db7bd2dbe2773a4a52497a9c1cc5733cc9f4f334ca7927f58854767c44bdd0eb44f439b1dbfb256ade57514af1fb9e4c410e14d1ff38ca39ef504acde98e3c53310cbd50f440cd75e451f9751b4dc7733f78869b0bc397a8d716a69afcddfd7a47d1a83c45d443d32deaeffc3e304dbb2e8427650a8afcbf114d49113ccf6e7cbd625854fe299e27caf547feb9f7d761dd6d75b72a3bfe7d01a3b4a8b47129c7999864c818010198a2090048e31100304028180c8783e1905838a87600148002549e66a84e9d4ba56914c4308a19630c3184000008000244866a681d008bbf070caa0dec750600b50377f2eb47d06b675415af162a39c1c0c7884c2f7df3d297ba9d04c88102dc2fe918e643d36b439194d06babfb3bc32d12619fa14b7c9e030866eeb8c65720e7fdfe05e4ad97925478ed0b4606669ed0c83406b14d7556b1c9b474cfd05c6d55bdd0fd2ddce120af4a48b15effe8b220e96ca4513374f43f15a9a51052fbdd2e8c241f6f013707b2d36ba87b3660e01d322ead615a876385eefaafd567a40b068c7dcab210d675e846c4c25aa7fe4291027179b2370414a37f1ec8d3a2c38e60f0afa6e5086714a8b7c767483e816880698599835ab94ab43eed6774242a0bd9022c4d6ebfc1c3b64cb6594be93642cec658ad688e15cdb0a2195634df8a665bd16c2b9a6d4573ad68162b9a614533ac68062b7aeb893ebb93201cd0121fba6243c5da41b9df213ec6342031398f1d43ee516f68d4177f996a9bc445f99d45e97a7bc44a3818550d447aebd99d6c3d6342d6b0cf9a09ffe88d0e4eb8da946080e3a72f927fa25268dcb847c501ef24117daf173ebfa5f539b0ba040a7858801e987b5fc1b75143aae763b2725bb6464d2a5e7c8731c3d5517709b8d4f4aa482ee28abf0fb205b6a5651ce5a97a6bb68019020422dbd1a5121731ded5463871a83718d082b8628e866d7d1d1500eb8ac576e108304ca64f381b7b4ab44fb9d79726f12c3c0e020f36e28aa99197c45282066bb52d3194cf8153376f6e6880a6093c48e494a84299160858a1155695aa185bffe49ae82223783705dd6ec1cac7c431dfcadc464f9ed8ca0c6d37262a6b719eb4129e30c86107f379ef8ed41526f4a44e241c25154334843e8246ab25584891895ea1002981ec03954c0abac564c8d733498ff08c92d5e6d1f5c509172f1ac5d08e4f580fcbead95d50e6c9b69f30c00117dc3322da0fa02556b04d4dd47f361809097deefd7e8b3fce5ec596699dfd407475f6710c8c5b94d847e2a73482b00ac6f2c562b634c29508776100b402f06d5151ee3d4abccfd24d54e6f60102f36189e75eb4a06bb49203b5f63e14d98664dbd7d79c1182043283918e7046599061f923f9a2a1207c33c04fb058ea32798f83e209039bea6061decdb0dfbe08dffe11883ac90ffa914f1153dc54c8fd89a7abdf8a31aadce6171fe4833027dec873a5f465426b0dc699f10bdb8ecbb3f5dc0dafcdd8cbbcc6a34d351b389ea41a273d5ea8b7e8c1dd995052eeb83188c4409483a0b97b59d2158c2a2af66cfc5734078c99896635b214400e43bd7cddf042bc418ad89303712059b82aba6145fc4b414f8cc78882c09e68647afcb565fd6e0475b640973c5cbf92372e122b61d4fb2a22fdedffc9adfce9a06540429e0a5e1195261ff102ad8de09dd13b1ca411b8b373f998b5f9c18e205673584511e8d223eed37264ecc592adf9179a0ef685cb707be38ed8c661483018dca6a556d71a4862679e8ea0f0211af83f211100032950e28646e2f82e2bc817c2ff68e2f5dab3e036d61f936e9338a2492a38a38d7206e4a8e61ac289d56ebd25c09e02ea977708da4acf249d4692b17f442038a016caaf97e1495d262405b3b8a2da78b921eea04c9cf019d15b275131a50a40b08597c021914edc5d829a2f52605bdfec37ad8e7150a436d33c42e1bfed7c26febd1cc774e47030cce89fb83ab7f86273f0e8533be22e41b9ec0a2a4f7c86a0388a1c1ec469ed1be1085f0eef927162dd37dc7d17666ce3d2f8f2d617fff013e81c46a16d5935580788ae26c2b12d585ba10cdb42556b9e1c06f28313412ff44a49f0b1b9be6a9268bb7ff2f819fe37878e2c5c071c272e046515c684e7a6ddcfca1807bf1d559a838db6807ed3861999c827d7ccef74c09788ea6418d5f199fc30693a9ca2894e7c84b06adba735845f18112dbe3bae95cf14d627428d2044fc8c944abab83a7a7da5b3c097a86e33e315b19c88fd4d006caae8faf3bfa8ae8a8df0f5ee7f7a64481493ac34abd4a50e5ac3a593e14a770c30986d64806e0db78f5088ef3cc9d8390235aa9b4a1d2859e7f8a68158a2ce4bc3558740432bbfc12d8abef0322a52eba237f5fd384888dea1f41178655f7d622f4085f3d07979973d0aa7c5996b1553495c181ce6cab38f4c22e08f928dfcd4808bc4ae57ffd1a38266229c217cf37a5bdf24d2fbd51b1ac875cf0d9f6b9ba8ebec9ce0bb0dd28494990c8eb46d6f9992c728a3cdb2182abcc4ff5db681ad60a937c4d567340978504e3ea1fecf62bd840f8be3440a42895fe0690879f89374b4330b3294b5ddc9d89dd861ec4eec6e150f6e0ca34d9007ce91aeb18badd56d0786dbf2891955d786d05c36d683c8d1d4f34ef509dceb90176bbeee8d59005804543e0bdaeb58a58ab3279caafa22e1d58436f56ca6f44e0342ca0e36b03fd6e509f036f5b00f102819ffb1d2c4957494286acd0c5631f6fb0c72373a66e43967317138ba478feba8bcf765185b20401d372a60c1d2263f59e3a6a481c39405616917763785852da1d0933efa5fecd49165b936abb9c8c474531916694b26a39988370b087c94c71e51ff9f77c4074b8012892d3100a877ed5e28b53b0426a86d9757fb30e287b10449433e2040ce3249c7fdc0f2456f97e2e8583055e3ba0ee7833a5848533e41d9a9b2b7687c9c35a976251db363031db7a093fb31e5fd173a64794e601db3f4ae83be8901eabbfb0c6ce2e1e8eb2308d93dc46218598387bcf85044c57f3fed208d929ce15179ec2e9c7af74d5e81c63770839f512a2f4392ffebfd6b63914fecd2314cdf25ef88cb054b1a3176f7977d445a1133a1b17cd016379129469050929c8c855e1e4033c5a8e8b242a596a5fe41b9451a605c0396bb3801500ff2764a40e010c28be925b87a5c2260c922701201e3a413069f5c8e7b4a54a02f3ca9b6ccfe346043c7a43a9336f8953babc3daf0de7eaafebd293fb9be8ddb6b423bd32ec1942738b9bc963c081e57ecfb2fe140cfe2a1fb4d8c92ca20d54a84d495c2af54da61081752dcb470afec92bae32545b9ea92e54e4bf9fa6f8c46d76d66c550c897431184d545061461996d9eadc6ebe896b04ed23bbc6d07860c73d3f197e315450e5dbb2b4394ac90287e7618890c0b684b37a50bb874bd2e05444adae231f35a4fd3874274d7adb4d71c0b541849b4586c23c2c67054ee254f2587c75b178ab49366e03beb08751098c69623ad67febd2ddf48babf52691c7071c2f2c5a28919c0a68ab0102169f276450286eea8714192b2a97fe802881ec03b0060e52046cd35c23006f6eaf8ec770052ca11e8b81f882a0c61830153693758fcd1b5180189bcfca1384a2636170b73e99b69c17ea50567cc68dce18eb4954c663fa504b982f33cdba53b6f5a6d741d3cef887061b2d4e0fd7cfd1da46434e63dfeebf57c9911c3c475f3fd0c14201d3a14708a14160059e828b50640be34d6f152b8331c18530b886cbc538ad38b12b1ff13a641b94fee1830fc0115e8364b918b2272357983b5b054d562db5cc7ac70538afcfa3aed546cc62da763a091f54d8509ce4494f0130e7195447553d8adaf3d4a45070c984e9d34e8b39324b8c0447e639941b315e4018718f06f4e6cb9585c0e6608f19e7162cfb2e2c220c105f2189f008c83ffa3cb4954c5cad800b74db17bbcecad671671d3149f5e640a33c59e024bec63810e1c7fb71ff2addba75b9b99275fb5d26e60e3343e579a83cd667265e5f6aa6fff95a2cc5d58a99d6c9340c0385c2a9f47fd0141f02d4d1d07bf2fbd0b6e4ee1ce3b41ece28271ef471d0f22b45fa519d0f38f56aead5102ec13914a62310cb90f7a89dbc56478751fdcbf6b905f53a72fddaedce9fcc76eb6a748f772842ff995450853757d0716f4dfbbc2107dd4ed0fe553e6d524fc8b71e477699ba309a2837329348249717d36c9e46b0a777f5059b083baa307a24a262e4832005cbbf46e68e6240f5ca887a74fcbb9c3982b1067b9b4b47f1e23377c05f2d1ea17d957c548b9c9bfc49ff55cb5f731534f57fd6d1035351ffcf0cbcaaa1327666efcb0ddefb33d24cff9b3c9b24785152b2d21ec875569b970373f5aad4db5ec54b2cd23cf68ea5cf3d98e9b9705c87627bd7351ea4037c604568373725827582e51edd2551f771ad076f638f59b836e5f4edbc8e797acd392c0ad11ddf9f252bc5b1e724e3f0108618d0c9eed616ce9a7956578d8e039f46f60c71b75a5b100b9a10c79e83b76a38475fe2611056feca31e6c4e0a288ac28ce331e49c7970772b90e8ab4728d4b6bdc4827e93f7ea8a1b0740f6a95651b7725f7c6c542ab2c95ec2fbc0b1320bd7a473297d6a7522b0c20ee9e8f030c5be3b920ee39df4fb9f3ed0d9e3389b6a25e4e67118651cdfcfcfb1bbd80265e94fe175816e9c6718b17220fc3ef8a4e1d6e7e3db8b7b360ecfc8cb02ca2b5543df444938dabb0aab6992edeb937c8c444eaec9f116a9a7a3492678498d8ea40093f8d9c310fc2586303644875169cf401fa0b4d1558672d7c9bda1d7325b865ba062c65030066e170e291bbae1d553b3dd9fed15965abe047b10881ecd00756d01abfecac929fa6d99dcd263902e2ca01ece92aa9ed70e0d849ccf3b44844ea135f0726dabfc7070cf8886a17c3dd32cfc7d9676f95b3838298ebc2a9fb53e93864d17cbac037027159a7ad7de21d6d3c588add23d43ac19ab8f55ad2221db1c5648f242ff4760420113b6dbe8d16347f453c70e1cbaebf7eb29cd555d17ed8f49de3c8986a82697eb53852841825d614bc88630ccf2564afa756107c59c02bbf346db27323dcc100e2cd4eeac55b3dee6f8219867dd611437d80f6039dad600d54143c7c41cea38b484bfa52cf0efabdbbec320b5f29dac478cafe2ab7aea920377a4199fa83add56037808fe4a3b5e91815e601fb011a157ea2b9c87c50e6ad830e19eccade44f3354599a59d07ee90582318fb7b9eef295e5e19de620993b81784abda637ba9d462a869fd4fc1cb073b916cd0a3842f8e09c2829940c0ec75da44cb5dfb178b58b06ce19ea03cd080fc60a5867381b39eea2b2733bcec14f2e58991d7751e4e5fce44d408f328e7e45f9b84b67d8a9070cc078f3b48690587af1820c311b98a834e9282aa834a7a6158692b92bd0ada64415e7433dee873800aee0c92c8d28fcdc8678a391dcd0dd47eff104cdad0bb19ae9d88e616cff4731fcb3a7827b457a0f406e89fe78bf3733576ddcb1722d1bfb1bb98ba6b018587311167a1e90016804df3b18f4429a628393cf2e115a6d1df22cf71a167c37a710cf014ba22db1e0cccb2cedf9039e9ffbf4771d61df0b89267bd1b9c6cc90de50c8475698e71d95d345cadec83a89d88056363f42af2c072ae0278fe55295f244820ca6226dbca2b1791357329665bbc58ebaea0d745d703f42d82980e498cf0f7f0cc65680053a2969f46c10ad14f2da491eab14626690823e534006010a13f647f730be5c5a878f7f15d2d3de916f077e68eddc8dd84b82650508c9445806b75171417ed4b546a11055dec211e44c5422e9f86198e5ec64267fbbc06680c30b1d205379442bed3bd00a6c673b2c46ded2e6f7a44bfd52a7d4110d7f9cae16721cf6ed545b106c274eaa2a6a19af1cdca322a5c8e2af7e0b3960fc31d63aa7961c1d0212efa4161ad3541988d0bde0bf7a4f528a4c0c6a5712a1abb44a4415c324fe8b91783836954ee0ab624fdeff6baa5697b1f3fa2eaa6b7d2245f34458e7ec277cf8b678e2ea3c8ace4ab7d954ae9b562e22be2f85ace85eb7499d42f61e637a14ddbca3740ac54739cdeba544bd981a6a3d08299726c2099dffb6c0a4dcc949d17fd9125e156326e6cb631723af271052a11e621a2e0a53ff5c0f965f1c6993b0ebd34b02be865ecb983ed2a5b246019c73fcca6e799804d3af7438330d4e807cae912d295180c48be1efc0ef93ac032bc66449aff6c129d9d46de625e6c1e24c18d4e9e8b9528c36d8f9db60776b89dae1f69debb6b10ee8ca6e471a50d768adeefa6aabc4b52aba986f99bef5f94db6bcb6944e1e78bc977777cc2cc21a592bf0ca9ddf75f0db72fa873597bfe2908e4dac9217b28ab9d1857734b92db92ac20be4a1f472a1e65dc2fb5f7efa85f12daacd7fcc88267c5a65fc92604ac97a6faa49d8e92cf7df90548fe7cd525f62364e21d8cdbe63ceea8e8a6eaee3da868d86be6ad074d53e8920e0e569f13f4243425cf4e8267365acccf2e21ae40078e22079fd849ea03d5534cd2d74467cfbb5dbba986e1affe306c30d1d763163326233b8c3c707b4fcf6867e7eae73dee134d85b212d58fb6f4c4da796cfbec01269c79f6769782560f0daf8d8eb3d4cdb6069d12a0a8cf5c058238ccc794c88765d38bae0c7e33c4b7630629b624f02bea6d71f60cf4b6b71502eb554798e99dc98fee10b06477d50d89c81fc3f62ea5362bbfb29313fceb5e404ec93ffd91b1c7f22fcb30500d39a0a9f2834116f44e6b9ec2735cc156ae7a17486b6a00bbbdc163ddd5630d353b83b0e818c6e39069f53499246a3227e51d49309855ba3372fb60859598a6e12feec6ae58540eaa4334afea4a307bd4bb3a69ec6406bb9f5140c810af6b581839b6292e1a1f03d34db30542a360207903bd77657c524a20340ba6bede3a0443cc060586f3e0d7bddb33498e0007ba9bfa68e7a4a430d8c74cfd2df4191b88001305efc19b6b712871218e19551679b0a799001c31f32b3e9ee21102c6ac80b236eae8b25c183c47f6064d770410c147c80efaeec5c164b400514f9c6c28fb362f180c060be7d18b26d2d820208da5567d1e5932d7d71a3775b9cb5596463035b36d7feb3e67135e2d4c221000fc3a32e9ef82b27723c30081df4dec15e8b82e26082ec9ff94e762a12103c047c271d35f0a69978a803e1f9c8a17f33cdc4841400cc65fecc3b2a222b84f0511cf3e9a9431fe121830fe988290bfd97480c20b608775c33e6bf4cd324d2bfa261423f7fc6385fd60cc87c761961389e33061ae26b7b4f8e4d8f4faec027b9bacf7eb57e7e4741463dfa2ec8a5f1188f2aae1ba518a5dd96491828ac9b72dd114304b1c113c5bfa28572ed465133aa39dc8ecc1a20a2c0b5186aa7f22138a872b9eaf0c7d8f23a319e69381616f38542dc544da178a03c26dcd8a10a10fbb804228e89498cbaad0b895e99007606617118ea46e8cf4d1fa14b8d7db6dbeb5a66082d162d81a223b0196bdb2f41617cf1a9d21c346bb9164543339059674132d90de80ea4c2a8bb940f89ae01d172ca97eb41dc51c2ff85b96746d092535ce78cc37b8acd4ed4d24c2a99f8adaf2b82c2d76ff6d20c94c5b14a86b533c60227bee7337a9ef9e4ec22b874e8bee4c8fb5b4c438ecb155c8d4a73a7be228f5a88fc607a143a092d8f1351751973238e4ac04940937fac8d0da11eabe5e16db2b9a4b56a652296c922f766a30a866b7bfb069ab84b26c8a5e717f5ea4af055ab6769d97bddc5efc1e72ac9cb0990df9900a5d7ec7a4dc46353d3b3990558ee65dd405559119b3841540799247e1c522b8ac03fecef0e43aacb11b491e5b167cbd90ece71089f0dd82059e7aa79b202e7ad28469d749488b8b2768832af3d987100f5455fc5799a63880afae2f7420dd2017b693ba6bbdb3ec957d36f45ca303d047a426616d40bcbd384049ac26cc356544001d928f26bc36122d7c2796ee5afd86ce624d5228529cda3f91fdb77050c2b234c2f530c0bd0c7df755f1d11c85bfbab7253712b487ca5725909a0682d82565f165a8f04ace1d05aa05f75db54cdc00bce6fe83fb2cc72d4582e99e44505a3edd3d15a2ef70e0a76040fa63942829a2de5b8e0d0ee84d73f02b488b3b7ef5a8a4bc4978310dbfe385f88a1a30165f722d901fd154875529df8b74cc3911e7d4810c9e065f2e072460f08b3d2bc0720d4891ff1810579c664b63e7c01945845ea22c32d679d224385a6a95930745f8f2bd725b6a1f58663424fc71cf0eb0feb56355df347ee45a19945cebbf2a6ccddfb502a0fd8b357eadf40eba123f89fad777d6a17dafb6b97d4559bcfc932ade310ec318d46194cc7d2677f56e8422d1bf7491114c5937d78aa3e7d8d222140cae0fc824f3c0e6b8e67ad9d7a9f7a05f704b850a02f268eba2d216992650c72ceba1304b9c99e15d10441952626960decf864c8f1221b17fcf1182e1637f3b6d876b0fe8bcfac4f6da7f41b13ee66dd64eab1012c84e1e3c425472d4e933d1ad3d35b649b7c966541c3b331c1a423d104aad1ec156247c17a3abbe9bb2106ce2aa884bf351807fbf9bd6e4d72760fe895be7686f7bdc2762d979a15fcbb7efc2e3e85fa5d710b448cd92dba79573d7867ec0928e3b02391f5263253400239843efac6f81faa805b19527eb50b50243b4d78f7946a0b199f63ad73d8c39adb5c37bdba03525bb27c373eec961060823b43fc4f6842201afbe83241e3048dcf4988aaaac7d6942386e3aad14328bb514beb0ba913a8d61ac85b297ca02dff103ef861b4df98fd6d8dbfb983283c7ad31e28eea173e2164a55a2f0095f427f8c37a87998e6433e2569593fb96b43d01fb23e38fb62962f603e33967d29bb2bcb2762534eb1fb460fae3db25bd062cbe3be488e9d36f86e84c67b601d0ddf7d45b649ec9685777896739c5758277734fe22bf6b46511a4ef4f6919b9835ea3ee322c43caff300f18242765b0d10099aa0336a62b8d746bb14f40d8e939fc02d495f4dbb1ceef06344f5d768baf3c3f37964f7c4e91a05c545f62ed0dfa692176ab66175fa0fcb8ccdab08a0beff8e86394b0b03dc95956b015f74e8b8897e64871495807c529c75a6b682f11c8a4e9f40b7e0dc45722a34d28e194cb65de7b293d177143df5d6fb42afbb87ac175ca93598b659301ceca492b4c678b8ca1b2b7345fb2582e0f7c496437108d71422e2d9cf35fdc32587473c442a7d8d4d80b58c8ca01b78f569682a8d788bd702c942609e8af27eea9f049c6d73669798b7cccf1145ed0d966b1369f06e3e6b98bf16d31e74842a48de0f52a2876e9c82e983e9e784a20aaff9b97c9dc6e3be7a636d523c69f3c4fb6ec691092cbbe881ddc1fdbec33df315279f7d2af8a4de8167c4be8741bb9f9cd58751a09a4a47dd71f2307d5c2a40f7a7e36ea7c77b0d2a829fcad29c52119ad46bac0ba14fdd39835e2c7aa4a7da440ae89976e3b232fa93f7312aff06445162ca9069df805f461ec81e20dc1fbbecd2692ec866cd3aca50c43b100e5db4c4269682e715690e8692cb74276328890bd0f6e0908610dc28a0a9696b0709073f7743706e6e031cbae1e437b8ed2b22670989a247f6a77584afd80fdec455b43d12fa6f85e2db542008aedfb9f5a7bb10c4aafcb957231fcd0b7c87d755570e97e0b29cb0147a3fd1fb569582cf1fd77900310cdf1a0e4b37ff0bf2d18cee735bfdee3b001004c9dc2dc8788e7b6679184b09d8f8994e5f6ea616e3082713ef4fcc2b7839cdbbdabfb7dfc49a8212f1847531a7d8e61af3cd0bbb1f551b72ae02ca4d94839b46f9235985d7335e9449f2809f76349cb9ffd0d146f119e19050e78ecffe8120cee3dfd37e78366c9e9ab6b5e3858f34699eb4335e80fcc989deed39c13621da8e6195c406d14312c462de32193d390fb3106689dd15867f10347a2a314da07eb57fe9b87f7c8cead1e47e75160a12f6db3bb135e21900657752b55145e702e2f3fb01d8d4f190a54e5407cd89778ae1321cf5019441ff405c8a6fa2f2629b742bf72cceefb2fa6be912c1e41e80c89617deab4dda536e43920fb0c6239f62b8619cbaf607ae5914474881a7987d1ff84fa7bb6023f09e48af6411098f12d1a43978457fb4af3bbb065e3db12f60d1c53ec57ea1762ceedc1180cd6314bd2374d3973997383c9ce6ba51599b641bc6d2dee85bcfe8bc494115c9daab92627999b01181585e50ba404d37ce0c4095ecfa1b872f82f118d7348ef2048215daa872fedbba4732c9a6edc29c75fd0135d017354d5bbc235a0e93a0812079e2061c55ae171bfb969ac6ecabbd5822b89770f542bd04c1ebdc534e49bca554c826b5aef4ed0ea9a1f1d8c47b20eef176c68f3841dfe1115cce68ddc2ad6966e7fa85b14f4f6e208efa7ed2ea4c1ce043efc97c88aeb40d318b38ee1ff335df4eed28a30fe1eb0f5cf09cb54a48c1d09d0c2ffb252e1906cb9b59b11f46470d79c5b8dc951dd1ca45cd18528f9d5b8abc744838c09b6c520cf227fad439f70dfdfd3ae305e005af36e313b1df6cf7d1ec3360e3af5f68d3eb67bc3e03c7ab9b7937f572a3f183cfb59c3214449c2584f81424ca35333d5865458a31fd3610658d24c46ea655fe255a5b9ac5b0da6ca4eb9ba70b30fb0cff07dd032605be957473eb419811ccaae0a8a1ae86cef25fed86b9d3288d4cefc80cc93d64d0a9faa84e9672cd93f656dda0acc5f45b210989ab664d5e8dc2776c883f15ee680f090f1cf91034ac85bc063b31ea44ac405cefccfe9e135bec87f89bdde37d283d7128ec9a07b8a10b6057b2e13719d8bc8209aa85fba2e92209e0119b0e0ab2354b46745f517b04526e78d41b5722e19be3a34d49d667dece8cb898477ed02946f27479559add34c6eac2a414d8245b6fa8da6286631734d199abe18c006cab502fa4cf2a34c8a90119bb735d9bcefe5fc4ff5266e372eb0081817d4978005ebf7b72b2f5ab72f5826cc67035faaeb99a02a17075f5feb55bfa704238f2ec957020cca5007d17a7c5b175d22da12d289cd9a45222fdc19448a1e971979cbb597203aef137ec703d5074df4a41e1f9f73e18cf6938bc8abf13c969c18c39814e9906277cb2dfe64b663b6c6655495a49934cdc05989771ae20ecfb82e8ec3308c523055e5b9037445c0dac5be6d99e3911f20a5dcc94e98658d88fe62964a67bcae5c6b4c6a24733962054f8cf1583332658a11381c392e1bc272ece5cd4ce58cce109f25e245bca2ddef289a244a678e2cc2b1a0f1266a30d769c1c3be9c56efc8315a0b09c833072433fd9aaefd9e0f1e8c2b39f049998c184d86dfc9a2e81753e7f213c850ab69bdc45394d745b36b9f39fad664ea4bfcafe53e60612adcf2d8abea72dcc2088ae3e06a4edbf022a001126891a0352224d52ab14c33a50e34e63b6d11d020a2c24c3fc0c8415eea95d21071baae040228e001ed92a6aba98c29f13cd5f0fd8e899bb75dbe85df69f22bd44b2d14bd223fa9c2bede276f8ccdabed133b2778f6a36c2a3c245f38a3a207d5ae8bdf3e55ae40dfb16ac759739dee779a66a9f97ff7edfe789375a16e0080ff53a7c4a16141eeae97e66e6efb147a1e050d529fc3d49c3143f3bd85532508ff5c27367538807ff19ebd57e2e086cc3fd7f2c2c8c4f31b3c67ac2bfa3ecb234b08ae73526186acbb914b680c436996050d0719f044439330623512cb01e7dc53bc22961edd8f5470403444b3cfb42636493610e3b8c91b88d6722534dafb2352d5d5dd8a0cb25934423baf086e35c35734584c38939e5ec247c6db25986aa0c4aba2fc2706e82d01c5a56a77defea1463504777f3c35b33c14b0d43574949851fe5a22c7904228ede95cd1f5f7bac7172fb984b1e877b06832b601fa641bd051627fa5c1fb326615f2331019dea0c3726071886a1631127663cb29837199606b79dbc9727d6b5c20df29d4861b103b0babbc92a742b99f21ad6d8d36d09e52643506d57f4feef3f0d1b1f4c1019e0c253d4f90522f7fac4bc3214374ed1f2d28928bb255ae82f9ffba00c9226acf375a0788934d8e314e13730cd47ddd667e49aa3591d811c2a5384095313b2ec61018514b24304c036de48ff043499d8ec1f6ad5da673a8a7d488289fbdea6704dc92cad1abdd42d0f243c2c15ea37c3bbdf54225927f9b61cab2d41f280e4a5b552c0be077a38a6d9f48fa885b72328284a7314713300b0140c337e34778fb500c63432bcd9bcf3a52e5884cc0370b7c4b23b194f227989a4754302135f1996d2638c05c08762c22378e61187de32263a356952c217b710ff9ce4e43ee0dda9bc044f6748c41f147f17dcb7c2599cc38f23e10b764a7b5c5673b0cd23520330ac0c9be841099fe94e9054624e0a2a5ccebeee2a4f45aa1434df78c8c6756d8e8f1fe8c5bc686eecd5205c73e8f8f87bdc04c1170a83f9fb73f31ce7ca2445a93c08645d0918f55bd826de8f9dea7f0b3a174755a442cc3831550406e1b87a0db8884bffa8f78bf75f13fd2691c755832a6f012fa04f7d05354b86599a5556cc379508ba9728b7fbd0ddc2dd4107575fc7b4dd6e2463854371bd36499a2d02b545f1d28b9dfe0a0014515d1305712bc0c96effb986519b8d439bb85d0820747edf927153d78095db7fcaa74fac501aa2ca77876d03074675e366b7accdccb170f759c5ad9ed6850beee6b123eff8453067029b8c1f442e6cb639a6d8ef313fc69677a0f23683db6c33bb425f89d3180df1454d92d84eca2aee4a17214823aa5240d52c375fa9eb24f3d07935c66537f03597ad4c9f2d05353ee0a0cb7ab5b6c83a190f20c6cfd948ee518779807c98f81b0b0ee88b47aa91cbcc99de9a35ed662347a837e6953c214c77591c6e7fa1d5bd23ad7ddfdb761b1966321dbf54ef356c8582557e64dc7cd74cdd4bd93df338586bf707ac823784f3ecb99a01a8bcf4b68917bb1ebaa182bae53d6f1787807da75481cc0bec35873589467f5b637e7a43bd229b1366e5e9190bf115f6b4e607b7735e30df8d13ee81bcc786b68d2f507ce274581872e497de5d1a74f369dd7e144ee074aa372637ff18106f4a84a256f2fdc91a1f8a63e5a97b8922a87f0fb221a51010cd6e521b03c53b3bd630e22b082ea88bd5ec27d539285391b2df107b3bf9ce5b59c965e790e2930166d607748bd9aa650ed0b816ad0af78cc6c6c6e78875b32ecad5fa71890527eef8ac6c6c7ca756c4d1a38e51d4a3eb371abf7c0b9fdd122b8599b5c67b5af1c745dcd38f6a459e010015aabd74e270f70cda0ea19642f94e7474437a8645403a40ffb55b85bad061904146668b776ca08fd17ead223409e9b7635e2aea1170d73c6e6e629d3b7196c8e8821bcebd53afaf84272b316905d72ff995d462e08972c74baa2c10d9af0e030e4497a31c362bfe95313d63adf1f82042081ee80788f75e8107d66affbf8c6bdc7b4c953506012621d49f92865817b19683d0c3ee38e7f82eb77beb079d4f9bc5ac9630708d9e12ef3d16a5780d019bac8101b2e33c7cfae2d8227b1f0068a2431a9dc4d76a3c98666647d0c45dc5570085c59226eef5360b76bf3d09b0d579d1806278b669717e9df65678ed0e10685e8e121922bf323bc2f9fad2051b62cd60231048a31a5ec664ca7004c98d2655185c73b2d08f9c43cc6b1053e9a501cc5471f1ddae6016a0fcc6d14f78d6a86dc7fae2b4778352e4261b205e2197b093b5f5562a5a1e7ef1ba42909f23e352fa9637402ab98893a753937d03a3ed7a0f1831bbe17c0359ab783795698732044df43a11fced6de5c0e4f9a75f896e7d645ccf8035f2b05cf0375afcf3a8e5c267a8b2006e9b6e818b938de9680019d34d2745e815956bf7dd903a2c8aa5829aede249b1c77cfe5f947e81bea7eabe236bc8b2ccea916c078ebe066cfdb3addd6dcef5a8318c22edc08e15b3b70cf7e44f72d7d41a864aaaa5fa0027475e5a3f93add1d41d15d509d0906cfb77c93b887f0c48a4a86cd45f0bec36ebf7ebb4b6aed9f6d511a7035aab5d7fe8dce5cb81168b5c9e0db0931383360673ec1d83f9700c9641e509de887fcb754375d1c13956e896c1112e05a0dd5dcfefcd20d90ad0712568186a7379b91729fcf7f932432a6e89731bc001560b04bfc22fe191397842486ed6a214f2f766e4950f03c718bab61fae40e08ce07ed6ef82712283bf896d8dde07fbb97033b477b799020caaef9e1f66d40c2167474e4d158a1af6f17d311ebd0933d23ecb31d5ebfc5a5bb0a06148ad5fb846531e6bab45e0a79b13dd5b1492187173fde800bf2825202357bde5d24561f684c3ba163f0811bfbfebdd459fd2a0874f86f93c98fc245c9424770cf6da78ad856d00c8e9003cc017e5f79951a9a9b5d68fa9e9907b71e84d2c5e7688a6a43e1412f7ce850aa1771e704995a2edac94a94eb7524034054f323aaa19201c57c229ff2399ff69cb99d61c51f1a1dd49f1540c233e1ddfdf96a1d131e20c80ebcc2e311670bb28997acb46af8896f0dc7007eb877120b218fd75c795dd42f153c7b0f9454e488f9a7818e3e783badc05b2b42c621aa429dbfcedf034457329ece101297e0224f02979bbc6fe16512308c5811ea063fe143b9d73014788cfe7f635d4f2b8b935e77931687e90657502dd2356db4eb0ba661d3053f3f2c4c01f433cb4837d265c6dff6ce4cdd86b52f57708d61806a49611c77f277abe919f197f59092e6221a271dabb21edfb5aba3acd8d1d5829586568d5e493eac8464b038d012e61387629b86c147c5d6ae380ff0cf52d9f9193042a957f943fc1b4ee6225e3485ff581d6e6d48c5a0a18d1fa6fecf51192f1229213c0865176fd181a08e86bd247d877ef6914109c3bc834749ba337e70846911bc360466de722137955b5a62b9bff401109f14d1a09c690f106c46e6302f8bbf72c14c8a7b6b8782a71a5d4279b4fda9f37f9bf884a8025284bfce4a546439258abebb79b9eba4472810e0f3e06bfa38561f2d72c9bc2a99fc8963e2e47169eccbd23e21683bec034f05d7b51cbf8b2fc6c0c5d0c4bf0e8a00a84f35bbb9623a14b9010a16de19f475c287b02df067e227385cb103f408d88f90fbd623f9471a3f714e60f3d68cae7f5d50be4d5b5fbd58b9caba973f5ea29ad8635f8dfe498eff5678d3578749da966f0b698191a4ea38a0c74e0e8e4684ae9523b46cebf79cb1bc401a7a8ebae07f6788266663ee909a8dfa359f6009c7401ac1c4357828ff3dbc386e185aac69429fcb6a480799eaf4901cbd5675eb82a2fad947b6eed25ec49368fa676374c80f888405029111818ba7811f19380aa54cfc45179ab11a8a046b3e5e4104d97ef9dc0b6a490058be9e62ae94104e1cb801489247b7830eefda9c6055ead2e303b3a7ecb4afcb1c04a872a8d1e54e5af5a7c7756672ed202e438935461d505a5a743de1cdf1d6a18fb8c2bd15b71b64c8036d00a09188ba8bc53cde239ae617c6d8b22d4ce3a2f70b5a74df8c7994925553e28b32d27a6fc2e1dd0d41722653e517d533d6f1c33c7bd421ee88192b02cee973b818859381708d0c6a6093cb7b54563f40703f0301851f1d507095f791f88e90f552c872e09baf6af3611671379dd1d990c9eae477be490618eb752570c864a9475e641c24e5392ee2c64aac4dcdfac3d6ca85964b83c966ece357b227726b19443389c54a83d74e3198e9d0d2484d3bfcd1dc7ca6d226f344965af978b895d2ca950dba2b73bb39edac5e41e1723a18e4484c82a47da57b4293ad1929fb0ad9898d3f155a5dea7d2cabee8d45f914b0574257d3a999f3e02c6cd48a42d996128d039453ec343ecb0d5441380b4f5bb098c9677685d3d6c379e3dade92886cd93c4f4d89a7415ed646395bb359d90f9cd4d82c3e529bbf1f9c1e7d8d652679c012746a9223344b51e9e0133a79d29a97640feb32654f8e64d704b33375f0992da02c5c0e12bc9d8b0416f0be5413528f1fbe160f024747c08e26361eb134e633e075af980eb85e7934249c385ecbd4d164581f47bd3b3b65512f28ed7475a381aaa1e931e6872c0faf9eebbad02a1ce1c30a9d1f36aba654f287b1e73650eb35a7239527017b11304b93c1779f07c91e1c98e21a1cf533a59e950e9d8037b8649419c0f772742625d4b9f2359e2596b3c1202e3886ecddb1e8fbe2323c3ee39f86b8e0d098e73bc9027a28ab9bb161339995f7ae59c2dd548f5c4f6fd41d5f4e4bb401785122e5b1964b191ec02dcb8a981b0b497725e50317b32020d26b98051352c55e093133ea2c787885e85b70798b8486ac2cafeed23187513abf9328aeb33a6e3489a9efec258e3d5519008c4e882d64f9ef611ffb6a590281eb55d3b19d7b10d0697a2373cd0b033357fdd22b32d3feaa18549ade6203aac093fcda80c3df1ce90160839009009a6dd0e089f721114753ddbdc030903c0c6c8482153d3e3ad9e111e4b0cd6726007dde2c70688c83a4fb6af8588b235759ab446f7793fe4149268cfb11581029c5986dfafc49c0574dce41bc20cd36750daaf22de59f75311c2fa628c9d415a697b0eccf2732668a11ea0b45c8f7918221539a8e351b02ff83f68eb9fbd532821f4000454e149b440507f8dc82974c0767febbed66f1b7b316e3ef5f4b2eb2396f4032ab76b22779f19e689583099c1ac7795b3d47eac244314a7606e561411e5c79c63c5d05c9d97709cb4cb41bfeae8b4fe9302ec91da17125c8b57e7b923bde31f39a714c3aec22618d5850d1798bb51131813968707610c19d0d259b450623b90f470eb9bad50b0d8e28f00bf83ad5901d51e2c8614c0497f5b9d82388e3114c9dad583d8ae5ba1c6e0036f3149ead17c5cd06c4d7b0230e64f6d6e8a566eacf6b00f853a5ad8f28005c57858a06b1ccbd958669a55dbf8ec4e72029692a6029ad95bd6ebaf641a50d41e694ae754da6bce78db5eb0935a8239bed30cb11569250587e3722ccfe8da832ccdf8d1fe482746e0d269a059d77d6fd066103806007ecf7cef310d91ab723539f896996691acf54094f394650d643b9050e15157651d8f0dac33ebffb633a1de8563ef8e2a7b4e2993c3aeea866433b231a9bb1427c4f14296da46dce048f0bbe2409d864f84a924992c1b1ce83e7b271bce9549f0cb461f64bdd0974b69540652d75c16ea4a321beec724186faa3a954f14f7795ac05d038c8b725fe0b54dc6827981d9ef0946971d6a9483a51728a9f8a45c069306c4debfb930dbf21c7e65da50331d3abeddcb984084299138502fd38f95d5af2f4babd5177042fc4fe8053786803b44caede293759bd796f434d562046ede04b6713325d0f80c8f1c1574eee55f302bcb694d2b4097a4bcabb00d51a93b37e88b3aaf349843a2ad00fe333be05938234bd8425f7b8b5c790a9c5c10a50f75fc9a191098359f3537ce25eacbfdecabbb2e8c7361066853df76517431df151021983bd06f8154ea9ebcfff4699881407f6edac0d868c9a66d4d86d7aebad25635071b7d9ee6255c0199e16a3842d2f691f94682df735d790ea0dd77b0967d414168b00f740a5d693577da0f443af82ecd65fa7d02c05cc5269b833a206c42974be7ee2459ea8878ca359808cd10a3ce6abd499dac8bd9f958642faea31b58822ec1eed52ca89b703eaa11ab69e89d7b2f7ed6d5dba0f4fe961c15a183c284d707439e094c838294d29f2f941643b09a616fa084ac0db065c1739935278cb9723cac4ff52ea110d104c1c4999621506d6ae8e44af32b481b3da8643a2daeea84f6354643824c35463768d10a4524d11ea8bb36777a6942a8a18281d8d763d163b0eb13e6fabe04b588c4c54d0692a43e1297af6b300d462bb93d09134dd900cde6061c6c3a5694989a91d53f1d05a9ef06b18743e7980116311813f88e6c88a00a2021d4ae5c731c69d68e327b0473b1c7e22c45697665d7e3542077a5a95fb3d3cde6bd6812ef7ed73476c0ff5a313653d3bd69a25b46ce495166bad84fce4180f9ce2240ed91378fdb95d716d933b194e7e3661a4b062e093b9cc6d2256bc2703910cfa60cb7f6a13a7cb6954b1f8ddca1730a96413186ad87a98246d6b8bafc8d8adfbfb4e4d426f9f212ea20859d7d55ac672a63df6e0b67ba7745696f13534bb36a29a7db942dd2a6dc079f12b63b0861f8d3d9676cc5da0004386ac6b6cad66ea20695d23cd200db81c0c3f35b40d1c3289b9728d0ed9e64029e067b70dcfacd98cc5b15fff92b1113b7dbadbe990bc54ba36deba69ff9963cb2f2568e3427d55ea638197b530ec5721668d0cfba93ba6ba3f1c88c899ff6cba0af5672203b256d9612b28bf86884852801dc1d66684e3ff51defd32ed8d6f43d39197114e99d49369192a602a86776d2cfb3ff38f969a16e91a04806bb708f51566c06755b3bf294add372c90489ce154a09408d0f4029e2fc0c58538ae82aa37a5756ab8da9b5ba24dc44d15c9b12e2d65736a95f72034c3130779e059efb70321af5d277d96c5b85ea8a120dd3301ca78f0c73dd02feae0831c7569739b07b9c5a94930fb6a8562b42c19db6aa19e69249367e04ac1f5c120a5328bf2e72ce309fad45e67ccb1a6ab70352754aa35c7d0279e44309dbd25aca17fda1cca406f4758061c75765d185ce131d0758e7134142beddf09b7d0ee3981bace3e308c823e13273535657bb4b65e215b3be7a00a1b0d4954f7574e9330825e7b00fc0e6eae1e62736c67da369cb63855d2788fab2419757b7becdc916bd13b78266b9307252770ec1d62ff39856c91d0c6f6d7896e507792c086e2b26b75a28bc73f20772592e22e7836d72d1ee9460a719352c5eab5c7c269bb966f4d18ed0dc57932df893a4dc765b0579d2068f389b3c2e4d3c3b26320335f6cafba8452b4dd4709d93c82e512dd87cc90d064ea90b1fa2247eed77cacd999b6d7d889433c2d656209c3508cf1d874ef6ac5c5c8587f90e553258c3c15f2cd69308e3caa7e98e097c57067fb40b32c6155b0ac7afd91dd699bf2ffe66a57369385d1cd98f5dd8af38f43cf26116acaf9df611c4fcc0eb523c3496258efff79e204dc0c627cd762a2f4d80b67d21bb162d8a4e1bf1ff5ff51c029ad0df5198b3e645376ef723032fe2cba49c3ca0ef2c5f20cfe32fd745ac4884da308977a8d008f41fef9b64b85359669a0f60a454dc1f42bd9394672a9b9ad0ef71e482af2ca1392377951a781554838b7a1db8982aaf476b6f939c9dd3d22c9b67bbcf08958a4c2f13c0f36ceb6ea6c58acf0e08d74c2c2eb571795202848d213e327eb005ae21be65b270bcedbd638e375411232733c12aa4becc57318aed0b678f6aab37d87af18b6f9d3217427987051b8d25e0fc5a6f2817242b512620fd2885a51340e319a1006a805207c3763be8e0eade00cb2b0aab30e93265b66351e309b433e8099891bec5da77d98c87e4cc9e8801fa04a122c775cfd6bbca201c70c72eeade47fb9be1539c8052258d69856927b3c5ac474606b40cf6149fa24d1c04934b2258f7079249d9b0c0391e40e1230cdeab375739d70fa7e99d2cc025b55854b60e00beeac33fd91eb87abdc04fa557c6124996ef6ef40badc94ad7859d34914710b81d3e8a8c992ae4cb70931fc06816e9640b1e8225956e89c5c04d8b812f53d3b1fc69b212f87aa750523e50272719f767199f62afa71a36bb231777adcf24291380fb04100327099c07aed4bd574204f206fbdb34648f0c831e0d6c098f3d9a2cfcf1bf1f9f8f4b71bb3a28c5f3555e140a9d7a80b610e76f6344248ea2962124766487454db785bbf92d2b7cee37571174220970d04332445062133e9db6bf54796f828d970cd599e50be08b52af45fbaf1c7aa4aaf2d1948975290170097e6f15d8832431db2877b0c41e1923b6a41b689816495a1204f85c0f1d0ef2b2e5587e1ab03c2415fd1e61cdcc5333caf1e06cb5035786eeb0e11d44a23c5e42a74eb80ad54c2bb0c1338a9176ff0173c4be19a81314cbc064a718c30722c17de044af32af31bb8c87e2038b8145d39a4cf7403a53448014d227846dc89732c25382eb27d7d2587f249233122f09fbbe288aa3df108670e583b94a0cc0e286ef860e25955f02a2e4d62c8a35df72fe358abd2c61d6f1fd572468915fa3a0d17e00d5b71a1774a599be28023ad6358202a0c0f62e637e88ca557491da398124a8821dad458cddc16b9ef51bf77a2265b9a6b5f35deb7903f56903a8b46011a19c42bd8ffdc41abcdcef3ca63daad704feebdc986c93fe91a418119e7dda060e660ffde37dfc7f24df2312d18c79113573dd62cd18f12d7783b437b48b5003f93af41bc8c807339c2b64e9713d4fe303804e3fe61073e9b58fa0cdf93aeffaf32e055bdc0f737e99d15beba90042810c7b5392eea34145146678c09ffde0895b53f8839744d0addfbda1a25c08ea1a26467ace7498f01e161b8cbff267ad3c04672a20efbfe1d1b9594101c6e1b53203e0057a737eae7d32ce176f727f8b4823e4cad1200920513f48469ba6ffcbfe5e15ea07a4eaddc73c980c53dc1d3fc20cde4be79d92c000aa969b3c3c1029bea93244cec6adcda1f6ac61fdea83e0818ec4fdca10fd64c2eb5d699423b8ac8bfd6027908217ad1aca7f0539c3584141cc796f59e9c858430550d1619f5b198da906cf2665f288917e48aab99e6e31de3e43b119009a8c313c99d7b83e9cda0a65f7037337a0c198a12cc48f8e5264274eada20a89c385fc1d5bf85e37722a32d5c52168afb4984ab3abe47c7054d60f1db8efcf80fe21199185c24862e3ce0e56e35f74c93b2b642914790b320e6cdb3febf4d442467ef78aec932d5a861fa22d9a247ceb7a613da13e032fef21a8d01cf47f32eec8ff4c7607018dc9b44d77d4bd9a888bafde7d9b0c73b5a3d0a0bb9222367464d95fcae9d8ac9a786403b222ff9d1980cc34818925b3f4cf2d73a1a852f97fc8f255d4e751466d3350c40f13daf933131d1783821d38ad43c99472e4458385c40fb4fedd1fc48580637f77eba68a33d4f82e28889827c7f9a4c498e5276d61fd4917e13e4cdff78ee70b1999cae321077bbe60e45922c60cac8cc933206cf2535d464b2a571214c216da96fcb0402ed8f340e0e77470409f47a0d272e15ff481c73f3147d5730967cb6b001cade1165f85f68ac31bfcf7885043a04712504685022ab9c0147fcecd48dc0ae8d887593f197c2e05b2ea34200c6b79e91cad6da664ec52223ad12e56b81734ab4fef419f56c43abe841e6adb47dde8bedee4e4918a047f65a758f5c87cf3e5c93b0ac7146b018fa9d5d8b7fd8a7194c0d75428ff54b9fde92bb6ca6357c45cc2661f3dbbf5ef79a9700f12335b21a3b04981d037654def273126eda5ebfda8b473ff184085dbda1d5c7d0b2a1a29977d8fca1fc3d85473656b35340184f162cf31038a86b541142b0cf465cb936ce9601fac9eadbf0b66da96804cafc2045648423ba6c3117402adad1bc0e2f30c337bcfb3400e0913cb2dc725d984c14660fe05c0f680050606c8cbd01b8bd6223fa3fece9096806dd0951fa0e1d00730a2be8f34451d0ae0f6337014d39e04d438abf9f52ba34940bb6c0efe3b213304202073c1f7a8f138084250002eb1f5f04045659d1ae78afa94dc587171490ce5f2e200d3d900f8890168917b250415ff87012318fafff9297f812c701d98afbd571104b407c2bb49a2e6367083ce885f1ff25b180b644ef0789c0454b69f7e75a5fc601b6feac210e053945ccc11b7aef2d357964c2e6a51e217e5d8d3f900bd277e680f686ff07f420bf5d8da2a2e33c934f8ec440257c1231cb96743784d5b4ad80b47aebe631f9c7b23c2d031ed1ac7bfd8cf9c6bb34f3d9c7d6306170253fb73007a475ebfa442a440c40206fbb1accef05faab14403df04b9eb8d3fc1d27f3141910199d597aab65240a79b2cb0a31be1a30624b2a70ab92013031889ec4c1e773de9c50205d799f8d7cc7479e5399cc76ecd6fa0f83a8b7ac4181e4179129cdc13902ca347b2872c9761260e728763199a78e8c10e394d2482c995bda3ca4c8e7f3d714bc295e830e10683b4d44b34f62836390b22adec5f63d1fd9f7e778c63c9be2bf15c2446fc0ea4832fdd7690e88d6663c2af3db1a408e40b2f28ca8314327cf570cd2bdcd7225dff7006dea9f17d972dbd963741f35deb6335e8fb6dea14083e1a344eaffe8c29afb200104decdda034c2d5994ed9c97ea8de48923a36b34c9104a4e6189124c1b3950a0403a1748a88a85fd0090ceac8fff789f0213f9a4e481dd82752333b32be633889d03927815515db4dd6ec506ea0604eebadcd0754d75e3b9f1cf2a2e5dc3a97a0ae6f5bd2a35d59f79ca881e49fc89af69ad279076ea3b25653000bca64eb9597ca46bbbbad3dc8f0bb51f16afa8223f8225aa09d1a00583c6f8346bf26d971fc3c904d9ab8725244e8b75ba45934b895c724bef4512c9022056c9844be67b80a6fbbe21a1a28bb4ccbe6aa5dc22794c7de8382e5ceb479c1391e6d743d6b6f45e746c1c9cd333a2e1e8b7de6015d09882acb0cf1aa9da1916f84a7000cedcd17dcbfcf1aabbb9dfba2a1aab7dd0edd903afbc1a9e67d7f178548e88f76e11caefdb2e9990bef21cc47dc270919cebf8150de408ad90cc7a5edfdb641312ed9eab17fc9bf8eb5233287af925c84993171a58b45cc2dd8b290da048de68ef1f4e9ae27830c7762dfb3033a919d7c76cc3891832f955a1f4bf680a19c3529089edf8a4a2cd1c556611a9fa83b7973427ef7647dee756715a95f040b85f4cac057ee4d32b4799dfe52872fad3e91287c80242dec7699ff49ef16c48248cfe3de7795c6ba0b2ef600587eb4515d4bd49dda9c2bb3d6e96e79b280c5480c6db4e8cab273b830542fa555ff27edbe9479304105aba4663333601e1b10b8286962271f412bc832574c44565b75e92c66eff1a199b7b9eac4e86f261709256fd2ef45ae8ab9d3b004601900b68fbb2a1fd6cd9ffec8b0780af56f2a07d96c4f690e3a87226de29bb41ae687e7f49e0e492b8881a0c42091239738d168a6ae2b58c1c17abc430028b64ec9832bc1db956c3a8b6092230e6c4d3c5b2118d0acbfe1b3d2ac243a2cc071880f67c9ac5554027df025428d4cd0d662f311ab351ee82208fc1db85bcdc671b4de7c47b70a84c4c5bcb7b8fff212a0e5e09e84ab2097f1d890d705c0ac173084d2e93584e03d8fb207a12b346f3f633a6b97dc1d818c59ae9f1d1bf0f451de4705a18745b3659828fc0736c5d1270abb19f2620a571cb85429a64b165fec3043c40419e4527a122564346f2bb8a0d20a12c2fcf9a5a34a29d2cf839ec4400d27fb12ecfeeeb2315cd97b146f0fcc608dbd7eb0cd219e25705359e7076d96d8bfc22a5ec2aefbc2ffb1b04ac4f909f3a2b123d312e2a7a72a3c293cbdb4d390c4d61bdadf3729da958bbd1f77de54b99f9e9e09e8abe188d04c081a3e60f032ee1b0e269afd2deb394725685b4dc33350175a10ea8a46fca3b6e6727fe3401bf059667cc09e43c8238151d7c0274eaf0e02ec8131087422eb97b890b53a9b2aecd258c70b563a7f44515716512c09b2dfabb94aa2767482f4a99d58852e158c09f51dbea2c24a54a2427b937eccb81a331153efc98b6fb4de17e7384f013f12cbb9a2414ec0f82202c89a208f90a2c83e642839cecf20219100909bcbf215d425998ef94cabce691e3ca97c04fa6a94562e3c690c5f9f0260131f42cd68890345a2bee96419f58f56cbccde22345b71f174ff9fbca5689681d82ce08c9ddff701367fff05a48333ec4cd96f1ed9019e6ef8c5e3cd7e4a966094c5229bee85ecf5743dee7704f60604f5517d19a883c606ad7504db5d358e7be5829578eeda63437208fbca1d00a71a500d3bb8da6fb6c833334f057c12d450e58a2fc9e7b6b2833fb1ed7b64a7741dba188db60a1bacba299f2e40ba6f6f5130b6be737f1a243d719b67df61b23d96ae71787c7054887d34a652aac90874d6eed0063c4b5a78e21ba1e6f29efbdd3a27a3decc585c8a9a94c03df00bc2ded013c125e93822c0b385c5a3e05852319e0cebd476cfdede5e4322642032b825b870072d102c17fa0330b0630cddba4201e7e9bb8b7e33d8c908add1f6e7d85cb817f690f5627da1274faa0b86d68cd19d49303441db80afe688bc90971bbac30e5505e5cb3c735f3a93808c92b396276b7e49328436fad99914bd5e91b72b7f3bdccebe375f7d4a83f048f2d267f63a62f0e17d48298ebf588d0f79434bf06dd89da9e337cfba9ea1a8a5cbf189970ffba6c6f345a1f828d5b42f872ae3f9594efc1d12e2a6d01560454030a107baae9e696e501ea10d6cf4fb6eab1a9507b11f078e1f85d044cb1ac7a65ec62850aefab0a10c6fcef5086d3f56dbd48ea798baad3fb6d41f1f4348d5a0860707b90c7d4eeaaaa3d40bf3f4c87c5569f5fd5c198aca2665557fd02733b12e5456c561514a683637b81974486af15120a43a895af39d647e5a98a41438868341c982ea515f7cdd95e863eca522be43581c78512fd5e62d1d1e5d601fad22cc1a7e9c6ed30284dbe5cb1158c30a635f46395331f62581554377d9a798baacd4cc6ccf97f648082007a5e8bf1bae9cfdc446c74d1385b3f1c8dd7f534447beb15ce8ce90e878ec1017e292d99e601e861263e6418588e8b46d3a23337f135bbaa47cc5bd3fb33e3b057ffc47e2498a9e8e01ceca4cf2eefee34791789886353eb64afcfe1e7f2a242124b81789074837b4bcd4549a98eb8c1e6707b1591cc2cec7c15c848ede8d687fb088751e8687c2e5f5c0c99df1fe54a38f6b9298f22593c7d95874ff655bb2924a9d23ca7a3bcce51ec81671f74da0867be2c52ed1513f9fad66aeaeb11b7e4a2febf43e5c287197bafc759997cf4d57bbe23ec99e79c7cc3bde9e651c1b909bbef17e3893b8b480c3b1499a484d24522a164d8fe8246f4883b410739737088784c5c0e673c7e0ae5178087a9bcf0ccc44c7d2a5e7388c46d612ca39c573b3e23a343fd940aeb352e1f3572b7de899de5eabfeaa99e1ae9a7f3a875e1e6a6d638d50fd8610b118e2e936cd3c2f84da2a645b56dd0db69c2e65e4457391db9dc56842693acf6e6ea314fa37525a17f043988e1745511cfcee18ad77f988aeafd6f9a1f1bce9e1815576d22141c3175e5bdb64b8b109291d827ea44eaa012335bd324f23cba204472a4603a028eaaf0f853165131177a99cb4d0d2d5b742fba9f81bc27deeed1b9098b6375e4dbf3a61425c7355dc03621ac59adf860baf45dc86703ea0ba2ab13b2b38bae5423242d3214b9ee99dc6f08fbae9a9cc5e9bdb1b77948dd444bacc44cef82fa6dfaee200a0f8d28bc84fd9817b749974ce516faa91eef1bf66fe5d4498491d37b69cb9006d3320f7bc13a1547e4f27e5fe82ed7ba4b304c6b9f5b441215bf69dcefa81884e6feaa24a8b7603042f1fc914858bd6271e403bd6bf3b6e3230555d674988003007527196f2b77999af8b7ce433e1acab31867a0ba0c06cb02b540882b3f5ab601484a6b8cc7d4f2bba0eb28a3d09da5e8dbb353e181709aa20e0536ba5fc79fb5474c7b7bcb633289e2f7468ecc8391d82b4c6fad4684e014e1b5cab6407ca3899047736fc6b2bd4cb2a76ed68de50865d7584436bec9895e0ba17a59ce1f650561db5c6ffd7c6de3f44b8c7f7ccb89367eafcd53f68a867a3df632f421dfb2b3fc61468aa6f464e032ac18cbae690458471266c7b4448892022770183d53b0e6fdfe1173d0cbfb68bb33863c758a834ce90549105e5256ffbb40a488445e9e1cd4dc72bf701e3cac8c8a1e55b64f0cf37f70b5db388f4171f94ee21f2af46476f7b80349bae571f978f82c6bab2a4c5f020fcb0f496e87f875065743d92771f2ba40d81d2f6adf345b2e5d5a3d585b512c0c538949a8745e8c786f7b86e7d08d7d13f28aadbbe70752e1dad914d1d4f172415fe88a01108fba8fc4f8770230965b7705d1a5415445a441a5eeb48c91525130e461c9b255bb9448892745018ad4e9249de95df06bc4e11b4afbd3a690451185b9722727a19f5c80d3c2ade28c2890ce447983acbbba0d9d0b66d03fc4c6241519d4a6c332ac5111491c0a29847a3d95910d25101fabf9e8ccadf09e696f6033c123b9995534cc04c5c17e6ef5a6426258d204c2196a0c5918e2c111d855d337082bc86921dd8cf90d65026dab63849e7134bf4a208820be4366d4c352cfccfd70d8506daca65b752d95d6895d2bb55e7d4b6b32c637253afeac6f3b8cdbf1894dcff20a7d3d20cd12a8bbfa344277631252eeb841f4686cdf34fdd49fa0c2eee21d51b6ceef4ab9431e4fcc47806f8dbafaad59e513712ee7645b87f027bda87651de6fdd6335948a5d4c579eccca836313fa83c13b400bf6310fbc52bdd2eed249a204ff0a92a27a92c05711cc0b0ef815208e8913dde1415de4e8248fade317b09d89fbf83deb405e509cacc51069d425118ce6f65973f46949e387a6f55ecef06e226bddeba677bf4c4993f2329e66434d082c6ba38a0594c219aa484e43d4c0aef76565a6093a90f2a34b56753f68b9c491f1ebfd42887d613208f91f46a7e26fd2644e1b967e657d77745c92740a21d4d9f2880be778e72cf0dd2ba0d7c1de6226f27c9a51f65324716d6391a7b898fa278971e397f9633fcf97d243c6d92cbb6f5781ac013ca86b436676c7fd9de75ea176e705a901e51d93e1918b0c5662a9bb668c134cc1c78611941fb038e9a4b021ded20111e31eda782243bf87a97716b88f69a9724779a539574c74f91063e6dcc696c170a31c9bfba2f147eeb2e01de377df293746a6e3aef0aea7a49e748589fda67cbfa595294c10d5e164cbe2cb76d5590267f15218f77ff3229f88a96174695065cd5b73a61dd42b0667330e1683e6449063c5b27baf38c75c3157df9ddd97fbc5047f8932e3c70821fc57ac77054d48c1f62e250630032c130e67b2bb1e5bb5c60ffc4a4fb4e0d6b895b8442170e44b9925af9e3adcff69dc88a0c1445b0ca04e45318bed5fd32d3fd7b844fea4d8b0ac43477852ca7ecc84593048f1264d905d213125a444cd48735d08bb0e3d0d70c544544189d102011964b841780e32c5fc686a389f7205c63f26e69fb52aa81a3153f22023015424b6b1098d380ebebbc092ded0a2d96ba36568894d33aa3b142308f63229cdbccae7ae2de7b23be0fe0596d7097f27e7fa2712ebdad7c04c4b86ddf89443003e895501ebca42253639e6d631e8c5e2ae1f4d20f52d499ac061c7f19cc9238b2cccebb0b472ef44746bc21131ac020ccb54a831daee93f23b75e0c157cb13f2eb121768e844ecfb144b83446c11f65f3991d6c9acee66801ddc60a08a238c86489aff229d8482f8dbed913c1c661a3c10ed995ef7e32be1d14c6f633f0acd20667020f73e18e2fbd4eaf88372c8d586ef454fdeca6c9e4c9085c54cb57cb9fbc3f0d80fc2ae30b2c7b4121183ccfa37e3adbf462f5d8546c5e2f2a0aa01ed285b368db40e0d27d0e462e16412ae1045e8f5f1d274701b27aa750be2fcaf2a61b52e4f98cab1f974a2fa97cf6665214dc05ac5db070ddd4568126d3d9f2baec573a9a97e69a98f49b25b65ef32407cf5a4dd2bcff1b33a31f3c680e7c75d2248361498fc9b857e2eb4f55f6a9006405d379f9bd9f2be6c50121d509b0e81efbc6ecdb81ab3f93d2aa43c6d5dc58c3e0bca5f7ff487ff30ecae43239ce397687561a32b5b30631d42281557261fbe0bad665b2137277299dbec2cbb37d2058812e775223bc6192c0a2935beb14eb14e56dacdf0f9bf3ef71561f8dab051b0d86bf94bdc117b2f6ce5f6b447c1d499c34fc66b8bb689ed25f8903427026fc0962532c5dc63b981061df4acb054d37ba68b1cd5f59af4d01e6d653ae5d7e61a8c7f042fc6d26ce7211ccc87cd975857bc27aa4a2b8c4b024e3c9809c9b12e0bdf863f6b34eb879e9131dd0ef293c99cf3f8ef1645d65db72b8aa74ddb770ea06c14559a8d76ef4b4f7f282bcf6d4d10d882afb0cac12ee6f5690ddf40cf0509ed40690b57ac94d84ee128837b481ad806f774178953dac5cfd29a7411b876de1c26f2b3cbf986333503d5f59900421b88412cd5f5ec3f033324b049dbf8eb3ef80967b27d2538dbfc6914fc3c9934e069637dae375cf60e673f31ac9fb5ef251ada3f6437f057c844f340282a23ce73e94edc44307d114fd81ee59ee27f7f5bd7a1d2adedc88759fb01d916703bb1d19ca0245eeb909b07b7f189d6356acac8006e570efe84d6ef7de6f60499019650b39821a8adc22433c3568f1f964ec9b0b3e5984cfb12c2e52dd4641c6dc3471b7e1e9574a31759d52e4d995310a26925abf62c618de966cce309ec7d47b1d2a00c310be67b2eafaeb836aa87d55da39de1c0a1935aa6dbc4acdc3a03750597c64d4086a9f12a804633827b825d41d2f87efe3c57fd577f9ead25c536ca01f05eebf1094c0085bcdd2305a3b74833fc16603e8c5210e1b0320a828b5712fe2ef550503e0883e708ba134fe6f8f097b0353fc8c79b57aef1e0860784ce17e185f17be689ff188bf767c15327aea4ef65f7d3f17e8f3f1d0f6061d7880260718c5899d3ad968e6619dfcb9466f6bacde9db2e51c836dbe85f8ffd1e5b40ca122dfbbf7e0034e590cb9093f6cf25ac5bb7acae573163d491d9b290cc53d74173f56a5a7a46bce73ac6f58c4451911208868089f22c30d80f0ad0c7872306ff1cbccfe4e2fe489a86f7f30a78d7a8209eff3ffff82020375982789e779b2ad631c3658c514e590a90d7543f1e4fadbe16cb3586f87b47977e0c618718f1479e69917f2006e6042059d25469f38cfdba3c69b338f66e9665091cea08c9c16369e6bc4a8920bf275323064270db4b16e717904b5f21ce2a3fe19bbb5c874ab1b4c64f4bb0e92785daa97ba13f16d380c45f57c183d8b1026bf9f4a31ba59042fb8c09381fbec75642cec22a411f1401c765b8070a1fce9738bd88a209cb7e522ec36d51e98176343f2ad2843bf1e71565674385600a0d44634fe10118965bf889321b4f19205ad2334c7dc27350f82fc45f30c0fe063a885fc944126de9513f84d327bdeeb24a7e3c48519a805f083f32bf36e3793ef50392cda1045779b14a990c70d1706f22c329d1439433e29337e2193fc0fb6166473a0b4eb47747db9e534c33df92dcba91ab5b272038f5c2b4b23e7bd90526fccd3452aeac281620e2b675d3db1ae857b2bfd82a7a89039b171d4da4bc166be8d142115315aff0c0fa3c087bb8932d09ef187b1cf58ae14abc7dfb001eec14f58b0bad9b2450b06d6142bc60493bc9ef34f4c860b32adcb7fb0a2193512e295bc56a8e27e03b9949fbf617380704192ea9fd8c0f42925f01786f6fa0076448fa78da207c1506c6c4a44564e8e1421a3dcd3649e9d03cc8d5d7f9bc4013ce74759889347024199b343298903f8444b5945fe49bae11bade06d27784a51b130fc2d86817527ef329e17bf6b18ae5673981b041bff51ad9a8b5c16458718160273412baffa85df0f98750124a00115fcf17353fa886b80f0498287614f813565e7d0477fe93bdf0370b5796caa5191249f0b9df3760335d8571147add796d4ca97cdf58542f3c30b6cbda1ba192960926abf66b106ce274de900af89bd5bf22c5cea554c2839fc7e8fa6f18b8628f4ca73cbbb90a3c1f8417994b5d554e83536f4216a6beadd03fb3a235db3c0f1e2ec0e11eaf00595a080508112436c2098c0fd10705ea500d464bd44e8a6d9943a7a09b8f23d5b6a05a585f5edfb798db4872f569dd67329be4bc195a2116724f9f634c32a2a6561490fc0520d7af04efd50233ab8507da8eb9bd993a9e016a46b3163af53637213191a048105144d135505057f3f63715d3698e93a7dd6632cac18bb0adb630df375db9909eba0b32723d57690ea90ced8ee54c1550253d918902d500dfd542c6d4a73a9c9dc3512eb86ab2688967dd80a9ff3e441b8ba096725122ab82b9118469f6c42526823893a3a5f2a6c23e06f760e5c9d82782d12f59d93e6c9988e2b5b56555416d9ff67d0a8030efab4722a63452a63794129124b570f1ebc82e4041c10f6f05545bbc98c09fecc3ca62f1a69b84b44a57f4c95fa257853e97b6c6c18fa2fcede2f58739542a480e72699944922dec7125b0a1e37cda1baa00ed725d3640239f149d4d304659e8654213f3124a904bb12a0e76dda4c4143c81254b105015c4c40d2360835595bf38fb9b7fa9e89f494a0fe44aecb08a1dcd566a11e66e4a821520a0b67d38c1006fe553e765a9e52418f888d7d22598b807aa7466432a8f016a2896320fc01801901a5b98aeb2c4cf3e51e585299bc8f692de42124764f85eb5643d2bb3cde1e7b1b52a12b1c5a0622da2ea75ca1c3fc6621230eefa4c73104cbec0e9a002a78be067207849f4c45476ce6286f1763972e6438ec7ef47a0819053a520aeb82c8ab36f530983d8c0feccfc3890c98ab9b97b07c40990d404650bedb91bc289623f1d404ad94cab7000f59b47e61e7e7c42ba87c21f0fd091260381a043c80bd9c5b8c764efea62a0416d75a1c8d3d68e8acae253bae58d2168fef5366ca4d228302ff7ba29ceb961fb0dab466a1da7791427fb9090a7b5b540fab06b0d9204ccc018f6c889500abdc9c56d0d11f8dbefe1530811684a7ae4ba00636153e9caf23c11f4857bfb265492d807096c43e36aeec2ce1b657f33bd379e3da034287cc32a08920685a4e841132457fa56e7b86d098c8ee959875672599cb88fef73bc85e2a323c8d7da709130e6277958b8ff6c4377935d086ba1630ff5d72018623960413bf311443ad43582462a7b6e93e63a8c83d0b17aae3eace5e0e26283ea8769cfba6f06daadb7185329520b91976e94be2c4e17cd42d7bf5fa275826ca7f36aec18c4177e0799aa5745d8a476a5f4dcbe4e351035ced19b2016b8417551c5d5469c83047c34edc333e5893f1c60a57ba7f589022b948f7b4c028406aa6466023f2492b6b9a8923580de30a22e30360eee80b4a41f9de0048edd5618069e2ca244861c9f8eb19e235f6fb1f5f5674aad1200bfd1cfc4ba8f449880f5f3d84986aad91b10395aabf7f93f9a1994392b3a4a4ceb0760a84a2b0aabd47f0894bd8a9798fb7249c63f78b8c566a0f724333db8f61309a56471aa5c89bb873cb281b74c7fe6ddd4da0c52bea344af6686603b20dec4488b394d51bf13630f5d294f6b82eeafda08c22af81d0bc9403676e406fa617118982ef7bbb7b0de0da9d00cd16e2fb51f1e11f502062ca8179ceee76cab9343eb28bf154061e9627932605a21eb0bfff278b0ccc185c06d0ddb171fdd6ea5adbef0826645f7d00b80fb611b05333c0a38e05e29eb34f8814acb8b8838d919c09e4c3f23f9adb2a1b63fa9302486f7b3e4cdd738146500ed58d829ac34d568a013e4d7d93863ebfde6d01f2cb3b194977b8d57328f496ddbabfd8954423ae2643adafa3d71faaf8caceb1fc8f92d4c49af4bf4d07fcd0b3ca60c3b048e43294f8bc148e29540ca6cefab34bc8e9e5ceea1b478929b32862175656810cb609ebb5ae1ef9112c7326c589a741114a3529aad0bf1538079989d760f9610f6a3d6939be08dcc4ffb52c88a8a7e08a223c7b56c7e19f6235c5ddf3ebf9c873d0a5986e01e0f6b9b0ce74e0030198adc33a5927fcb9d2b7519cece81324af80837dde6883df71a7ae5bdd0e47d34aab5f626f4909161131cb8680228f1b0bc2c8413defcef61a66bf6db1f7bc6bac3a5e402d615d63112e196590990ff7f803253bc8690d080ce53f7291df798cf0c5daa51998c7c782a3c806c4b3bb459ca1a1bbefc7fe45583de6c1439dd69cf78e421fea843cd436b27d1e820a8925ec358267cf6ce280ebffc46267d8ed1ef44ae0b6d62fe80a84fe6c40b4af176702cc8a9b64c4741378dd876983dc9abd0dcdf188b9c560131822ba4b97396b13366cc6da742827058d5e45ee2ad71bd47df96c723d0ab46a4780aa57f292187a8db12fd0827115b3e0f0eaa81a9af0c5fe07be8d1747fc7724897e08b2d8b68ffda3f0270ae4280ea0aca6ca6e539d1b60d85277beb11787b5194c7f0ca6e9c706cfd8d242832e7724f7c09f1434bfae0bbc068887ef2047b0ae3285e8cdc65085ce333fcca7e9d38e24c9b1282ee1784a68395af0be7d081a0d5b7a6cc8b796a7ea7587e3e030c491dfb4071b7c225be8fb3de918daac1026a3a01b67d2728510ca79b2a78ddf76120cab6aa10f491a3d409f5e859a9d26f0dcc29ae561c04420283f0f58ad9d45f62fdeff089fe07c0f26c896b6ce73701f8c2ae6614dff15cfe1494b8a5c0fc3afbf98dff3596f687338d0d38f0b6c10423dd293700067fe3ac9984ec69ea2a0ddbf203cb305ade87b58ae6b88fb1ac0de0089de975f757959483dab8e28703b9b62dc0ae2de979967460381c3903d8e0151e9265e8b0ae6af1d538c1dccb0d1dc156cbe4eca93a7452c0f2bedf72a497a28ddd821f47762b3a67f718a809935fdeda52d7ee615f6770b3bf5d3916e02c8af843647b7a3cad475c753f9e8b2aaabf9341dfe11319610f6d761b27086c3172b44923fc4b751b2d3bd43bd009fd00c94596d5f47f9f2b202f51b3f7bb3d5c8877677d4ee13290d5f9f84f9ff007228f7280ca201b621000c0dd0255ed4ebea9824661dae1ce65cbd8dc44de63e9001698a6b8671ac983e584ffd5b841063a02e50ab2f27258cf38657230bb47f24064e9c92ed367789fa65c429331c44f69433791317ee06e337e7bb64b776839ba6870d8ea07fe14f8d19c9e096103f8d2eea3d59316be8c5d9c9c9aa81e8695d6fc235a791a52534e0d8abd375f6b09eb05d687af249339efda42ebc8c7c2a1ff73d606a8b70d4b3ee56f4283a1c366e4221ab3895d50c7b1194c8a1c875c141338706e6503885cfa1d5224c703ddcb978121bb484d31c77e6afe2976f18eb6b7b7f0f3efff8ee857875027d397bf57f18066ea7e139ea9f01f69cfc9fc47042362d98cf9732b5f3baad800acd327bdd4d9a9ef6b532313bf79d7dfa58a67af47a8e3e9a69b6cdb260130aa7abc7f9396089e90ba2ad192d0fcd85b43b355f37e673487cb86413b2ea5e5c75c2936646e447ec309038311e0c596fd3061ccd020efcc4c30c3960b46439330f0f0f0f0f0f0f8f70f8b7565bdb03ee20934c92e9e147f1d245619229a5945212bb83778133139fce4c7c3a33076413d2089507d30c850c780cf58c08428c118972c6dca183fe35b52a22248afb49724c257ed6637e4421e6f556eec96ceabb188e2809a5ace46e491abf3346230a4aac6fd2a3ba4935aa85188c288adab8a3c93b455abdf8a28b188b28071dfe79534e6e18da156228a2941aa3fee14fd48af9c18696885208592a83c728dab475878882c4b80ff24bbe3b4421d967ae5eb10fd9ad218a6377b759d36cf5ce8e518842cea536f69a5b36fe4988929bfa134ae7f3d4d688106310c5fa484284d88e26454783104310e5d53be9c143c3d7c78128e9c9a2bf6fa35fe40544b176824eaa312b3926ff50b89171743ef65236078165086ce0861731fc508cef1ea16943a4dcdd84187d28c4ad91ebd892366748f3a1a07b25d7b8c8892b499931f6502c1562ceff23774eaacc187a28ef8ece5e6a657aad021e1e1e1e57841879288820278f8c881074e98831f050d8502341a99a33b916a21362dca11827bb857291b91d9e3b3b14925528695afbf1cdbeab432982e4af2b11bea343f94fdf7812fe494497dccda13c9ede7e62904962d99d1c4a211fe2fbd64799a87771280951179db8be23bf854379424e3dfa9a3373d262bca13c325f871b1513d4e4b8a1dceb12366fa7c8e99a21b0811b5cc46843397c7a9226657c2bdb0fb68f1c23e8a223c086823e7b33fd1fd395c6aca1983b46689066f27e4362a8a19c3f8dae52fd2842cc31d2500cea623c64084fa1d6186828a7deb3b84dbab9678c3394c3a6c6a4d73f1dc78b6186d26c98bbd0a1ba67c38b801865284bfa8cf760a7244810190a32318a8836bae7496328c818e4830e5aca4bd5622885e9e7d19733971d1286629c18cf5472dc59190c05c931c44fd1ece8aa7ea1b46143187b4f62e4c40b25f78fcbf3fc4fb666174aa3cb72e387784a963006174af739be272db2ada72621c6164abe13fbf6b362442a6368a17c99f5438716a5a1f1f0d03b428c2c144e95cea9cd3a3ffcd55b888185926e4932d793ef9a692cc4b84239e9483ac5698e8cd473a4156258a17c13d663d4d161bdf32ac4a84231996579e951fb3a4194420c2a94d3e44a55f34a3fdfa006e013624ca12c4226b532326fb6e6522846eb931ccc2cfe7e8d427993cca26eef2d3ba62a60e30a1b59f893c0acdb10030aa54cd95ee2396ee77c7810e309650fa9329dbbc6d135760e6238a1d4a337e9c92fdd3e668c261493502d179d5b03210613ca22d2e7e7bcd151632fa1205feb647bbe9fcb4f09852863bea3bdc5546e9250528941ea79bdbc9d0909c54ec23a84f8e549bb7f84821e19becec77f7ba446288c9a768dcee4553b17a1bca7d52bd26396dc1c22946a2c83e7e75252366708a5cda1acfc62468724211437245f46d1783ae62b08053929849a204440288910dfcc9f1bfbd57e50b4efd231e3cb4ffad207c5cd786f65192272fb1e145c3769ad4f92070519f5c3c2cf74bf593b2866b95bdadc67df4c7550561db715ada35effe5a01c3b9ab8dd0b1332a9382824db106a6290a5f5ae1b94733d727af5a023a9db06e57e0993226ec7a4eed4a01cb47308da93b4874b68507213ca83d49c4493b26750ee8a897124e9204ac9322829ad53a547e6f4a6ce181482c99128a3a93b7b0706c53cda9e3e925e8dddbda0bc231a3966d358a1635c50102d1a3793fcf565b605655bd711e1b23d92ca62b0a0b8f5a9c64f9912b76e15c5b9c91d4437574531c56eacf4780c2b496580918a6208e9fd3a95b9c62494372c51518c19ff8f15d1e1c3b337609cc224b48e9c12a74d861f6c1e1e770bc314e78c7afece182dad4ae1e8967e91d35164e490421bdd9a1bd2a6499b7681c38b0478787481c30bc410d8c08d15c0184549e6cd416804f12e337fb079a8175f74014314453499e856166e13ecabb4c9f1999d0d26e31f6c444351d4f7dcf1096aa2e77eb05d610347f2f040127878787864156080a2f8a21a4fc4545ff3f944f15e76535a998e79c813c5fce9b1fadc377808e944c92e469ad0f1d964668413e549a223243331326ef2f0f0f048929b286fea8aa44d4cfa468de60086260a41771232bca7b81d4f268a713e08b5eba8a79dc744b1939fbc92556f06302e511a393e23235fe60acd1225cd2ca552664768d89528d7ccfd791aa57af34489d2c8d31b3e5134bbc83d3c9c8b134ca218f4dd8e7dba90ff9e248a298212ba4145e7d52412c5ed244de717fd41240f12e531ad96b66d1f6cd34794c54fe8b1f23acd12ce912349e0e171c372743aa218db71a306b1261a7e23caa94d8d99ceb52860e30a1b35011b12c0c2066fd14508b4d823c0604441894daaef4ae4e81f25028c45143d66be75ab3482ba3d3c3c3cfa867529a224e1457ca365c46b51220a72b19ed5c3499b3c414439c6d3fea46ade13a9439476c5e4de4a84958f1ba274bf793ce38a66864e218a2bb93a372e4288d2687bfdf910724ef60ea2349bc76f3e9a8c102288727ca41a9d438eb1340351522a3f71a44b90393f4014db642a25fc4b4efeee0fe5b3ae8cbfd1fb649b1f5239b54d3b178fd4b6aeab27f1f732cef95c7d28ffcc766de9399f60f2a1a4279cd0213b36dfbb0f365482341b592ce0bb3841165e60c0043810e0e181de04384ec300c61e8af6a773a632657d23d643318eacc6d8ed47acb40930f2507cf911db6832e2988687929e33996f1fef31c356028c3b1447299dd79c4abd0418762884dfa423759c559b9827c0a84379757d5406a1d566731e1e5876c3083201061d8aa9537c7efb2748ce56ef00c61c0af96484f091eb6cbe6f1dc09043313deb8f0893f9c20b2301720318712824292e417eeea4911d8183f32a9ec6736fe84298be7ee44e63b51b9c53b23f2b2b2e426c43232ebfac56e49b8a0d06e1a7dcdc6df288fc1a889f44658abc5135a4549fa44d2268c9c7a4a1943c31cbf988d654d1a0a59526bdb64d5fe719d0b895f63b69443b66a8da44d27d8b4d1493a4594a990e32b879c73432048c32944f4850e12383bb98d20930c85038db74a36b32ea44ea830dc71736b2c0c28687c791c0c3c3ec861d090ec6184a9d3c9685e5e8f841c8c3c3c383dcb00d819b8004018618cac9639f0717ad293d1f8692e6cb7c26935811a2064331c8983a6c56fe42d925840f93e536869c7aa12437378f767df89fbc0be5fef9df52ea4cc4575c30e4aa42cc2ed3e326ab487c8be0e7a533b22d943c647a7dce255b6f7eb0f105d81200430ba591d6fafaa3f3eff437b8c0a1851e8c2c144c29ddb89f74cc5bf607df28fbc20b1c391206160a9ee33df3e7fb0a6539a979746de285ae5628a6fff86a89137310c2a842a95cf4c84bce8d4987418582e9b8ef3b3d7dabf929943ec8bf0f3a3db25da9011852289b9cad97e01b4d72260a853c13439ed824ebff41a1984eeec9c826c6bbb72714ab355b878cfb97383fd8b8d0e28639619b90b233636c6444ee52366af098eb5c3e5d309a50966866e9a1de269512130a515fa2c98f98a3a56909e5103d9f483226fb18fb075bfb7751010f0f4625147e35e75e35d3f53fb35066018c241473de5f4af68c5962e483eda04d1848287b6d8dc79d68ad1a465ee430af8517593000c6110a56d2945a8941a48963036018a158faf762baa341ed308a5090f923735d42f4ec11184428accce9ee8b8eceaf6c7c803184924cd293700f5bff9f7978dc00040c21942686905d5379fd23023c3cca70002308255326fc36363d6cec1004030865ff907bfdd3e603ed06b103e307859c61926ae9e88651ca020b1b1e2503183e28ae660f613529599bd45be4f0e2006bcec50972240160f4a0fc95a7fa3ac733d3a60fb62b60f0a0683a5fb4e374b09d2009018c1d94deb3a6a88c1513c402010c1d14528579e9eec963a2f9605b7b008c1c1456d75347bb784f597db02183630b0f8f2ffe031e1e36b258c00dbb8087c7321e01060e4abab2833699ad32dd7d839297d9759e30df9a91f7620439706ce137c8dde8620437408003c7167c36b258808d09d8b8c2061636b2c0c206166d8342d0264ffde3c73fc71f6c36108fc04608b4f8c8e141021b874760a37203306a505e4fedd5b81ea26db185f1e442016730685008329cd2203c472b8f7b2c81c0066e9000c60ccab963ce31a9759af5ec07dba3408b1cd6306450486fd7b1bdf95e675301728980118392e92c29528a796aba3d3c3c3cd26e982560c0a0e06d3af59ceaac69a30f362f0c6300e30505b70f111d3196c64ffa60232e80e182526cce1e239ed492e57fb0ddb8d1f702182d2895668cf7c924993091ba0f182c2887da33b96cff0fa6dfe2863f096ea03625b68a72ec4fccf30b4d76ba0fb64738b8407b8403024900a08a425e11aa76ddfa4d8937707ca156960af3482e00808aa2b69ab0b4b9106bff83d70e8ec08687075a1400708ab224dd93ba413b780ad9c86201363c3c96041e1e1e374ef085165e982ecc6ed892e03a0b00304549cba9565cf597588b011ec4d0d812002845c9e44aec7572fe6c9a01155080036c5c6183019d5f00002934afcf54195309f7b511444499d0185bcaea0f360550c0c679f145171800c028ca13355e6295c868498ba21ce4a9911832a44e7a0480509452eecf88d322ca2177e6980969430e39459454272553c696f86f4a44b14e85e6fe4d21470711c5d03cda32b7861c0f51921363fe786986289ca6df27516662e9595188c2b947f2fba83bea8408510a31febe49ef22446f1005d3701e4fd6c66e491244217a10b7495b64ae6703510aad3e417c470d9f5340944e6d47bb1695ea63ffa1b45935d5c9ae6935d30fdae48cd58a68114e72855a51ae514d5e7d2846d053679731c6904f7c28e638a96bbf9abbe7b487a24f50a261dc4bfe4a7a28e55db5db46cdd2f5e7a1983edfb4ea6c4811793c24337c161945fe3b94626446d1a2193d75901d0ad25f93f4afeaccbe0e2521a446ea50fa93e474289f69da0729222671e750d032b1439818f4c7cde5509cd15127d5378918c7a1a0dc94a89f8d1ae37ae0503e192cc3c9f02185f40d653fdf181dbba22c346e28994ed754794a88a06e432944564c3fe6c974361b0a62927c8cfb2dfdfe1a0a3a734f34dd1e21cd6a280991555526689928a6a124634a532584e6f039828672c618443b643424a13d43c9636f83168f11436286723cebac2169cde8b00ce5a054447e49d5e12f2543d93ce2c8befeb519730cc5133ba21b6944de1cc550900fea494d8beb0685a128397dd2be4ad6b801433993a667d9bc2782f40b053da9322a3699bccf0bc531a12f527447b0ecba504e92ab3d924e7b1917e7d8a28b1068b1022bb8502ebd6136f283fe8b720b45dd1125baa49afdc936b2580081c0066e786185164aeb91846a8b9c9d4aa93db0220b857dcfa71a63b22a39e102470ef314f0f0f0f020374c150b45abeada20ccd593daaf5070bf9adfd37939236285a2ac7b9ebc72726ed32a147fc3c710e24d9a0ac5fcce9a27274912a4350524c94c9adc91c3dbb42226212275075fd34e1a2994b5b4cb7b76a7eca02814347d2ebc433819265028a6f04f9f57366d6c4f28dd7c969ee5a597927eb0165d981b08810ddcf0b0c20987ecbe2975f3a449b748ea563481d3a67492dcf863fa0fb60fe0d8028d154c4844f418216e661a9e0f36f48c038bb762097d87a769bba978699b68cc25d5749f4e763ff0011c58748103021e1e1fc0b185a2175f74618512cabe9b6e26f34b6e980dac484251822a2bddb3115973be6127b00209454fa1d33df78f106bea0eac3842694dbef8886c2a374a1a095618a11c67b2bae95c114b65880fac284239ef64d46c1e5b26ac4cb08208051dba3faf8ca5fcdafa61c5100a26448b656f0e3a2587dcb04208c5941ff1639fc4306d3f7a015604a1783a09714a866549498eb33d2b806086c9d5574ad092a82ab29a1baeef24d8a72fe0e1e1e151022b7e500c3234e70f32c75495f141b14a970e724cdc838266a92e1d5459b08207850f2bae9f6f2589a464c50e0af3da9a9bbdda3f8facd041314f361126e877cb6c3460450e4a1ee7c7d7d645c417e1a0a04f750ca9661ad4c9adb881f121df6d5b32ef69b1fa124ff2978e55248903acb041414e18e541ee89749fb6a20685187e737246abaf52594183c2ace8b4bad1f9c54e332875aa13f7f967b364c913ac9041c9a4c9dd97acda71aa153128b78f10628257b564b1ad8041b9732ef5dd535e9ee88b1c384060c50b4ad66ea62525aa2921932058e1828258061b7596613bb539cc1657b410ac6841396fced24ad8d7cd790223010f0f0f8f1b467260050bcae9f63b46577d94853ed8fc91dd16062d0b19ab287ff2e4e9ab25d6c9b42aca193cdc6dbe9f8ac2c94e1e519fe13eb70c5414ededc429cfe2eded9ea2b09df5b79ece774353146d2e3688a0428fbe50294a9e72c24d8711abf948513a2de13f3a949dfad4284aa262f171cfeacc936488a224d663d2a484d02f1b222314c5abfcf90b59a7fe04456236d1b423da97687a7934e1319fe6d767517da2203a4a3723c6d68ce6079b17386e7cf11f48fbe06204c413c81cb54f6f940f59199d505bd3e254b636269a4ddac8a15b217407137b218313e5be187f93c93f9eba878787e7d02204b99b28deeeff4eba18138f7eb0dd582c0e80800860b180bdb1869a286491971e4df5970cfa0f3613fcc7f50d0f19992887349947dfaa75f2b63151d0259250bd939488eb797890bd4449a4b9cc13e91ec2429628c7099ddc329d5989f26cc89fa7123e8ae632931225a5937df49dcd937ccd4914bd94ceaeda49ef11cd9444414e3291747db496a4894429739dbd7e65127a960c489423c75ca365f2c496e6045e7cc145c94714e497d050277ba5fb7f91830b1c57e4a6238a75275286142d5ad3800a743102f40940dfc508d0232ac86844d14bc96ed40bfd1c39238a27398eae7afa7dce633541c622ca1e45c7943fc1c3b277810c451424e9cfdf9cd4e61c3e588928a76ecbd4345666ddaa5de00a198828767e4fe2eb22737b85707c102ec83844d13f8398d07899cf220b810ddc40320c51de0f9f344fcef35f222dac1085f975dfbafa7c775f8d04374c8d044888d2042592930ca5f407b9d0e2e3c6a3408b1c8328c788494dd387e049293fd8b60032045150eb9b9384876504a2245b2163d2ea7934e65d9c200b820419802866bd1fd39addb6dcf6f090828c3f94a3fa2811ae73af040ddae2b5508087478e75820c3f14ac5b62fcd65c127e93c009beb86127f8e28e20a30fe54866e11e6b46a98dcae04371b7337592f35b33a38c3d94a3ab864de7a6935e891e0ad1d43acf9c4ebaba923c94435b84a4c2844cdd900c3c1462d9e87cbab46c7d2de30e04b175491549cdb5b223ef68f01d2183cc2c7d21c30e259dbc59a547c61b5d9810b011c200197528678ef941e48f4fad790732e8503899f91a37ea24994e73288beeb978c98bb8fc722876f81c9fc9d7f47714876250b91d4f7c4647ebc0a174d247539c0e22e296f986a28874a54593667a364521c30da5ce93fea5b72643127a097878d88d94d1866210d93a27b9bcd950f44a7fffd4db7395594349e797758ef0204bd66a2809b790df263236694d4341ab454395082dbb5603b020030d85a06bd64ac8928df57eb049c0c3e3b7381e1eed011967288e3e79fa2a21cbb96c06ed35c2aa44934bb91749ef1127bf8437cfb175808c32148492b89a26722e3b9d0ca50d75ad3a594efcaa38b890318692955cb33ad341fcab62284e7c0df390374d4d2e0c85686295fb6f159e7f309443935f8b5223f79e2f14bd4247321bada96390170aa62b4f5b787b45ee74a1b4a64f526895b950904162b4d754aab6235bd8ee6a2ebb5c246bad7cfa4855539e164a95f16b32a9df4c4a2a230b250da77ef3e7ce1ea1c9c042497f77b2ebe049ab475728ebc91859b459f5664a86150a41041d2b9ea56391633eaee022838c2a9473c78cc4ea1ce77a4bc0c383110d32a850d29ece3ba6d2ade3251953287a9e92d1203d2895411cc89042a977ad64fedb5d0d1a089c166444a1a4a26e9d3522626290018562ec681bd1763a6a621b596061c30b329e509217935c2a6d67b41903194e28b797d6ae8de9e2f596d184924cda2ca74d989a976530a130a7848c603aac595c5990b184e267cc6cd6a61721f44a286a8c689f63a4889c3c096513dbb893cf35ce6c16c84042396c354b7533ef6f7008328e504e2225fc6acb6d08690f0f3c194628a6289d35669a363d932214c33e8b97963c4b976510a124439a577cf8c6c6ac06640ca1244fdb356988fe216c6408a1ec31f8c9adea1051978c20681d926babdec546d2c56fbedbdb5b492a823280504acdb4a17e269ea6e607851d19fa733ad121449c00193e28041dbefe749e8ca17fb465372c4f460f0a593ed74afd05820c1e14bc64ac0ab5b6e6e1df0e8ade619d426685861751860e0aaf313eee9da717a583282307e5de5c7f5aac43f41854820c1c94267d50fe655a555df6f0c0ee818c1b945747fd2f4d988890b741697f6f62681221ead3352886d121947e10b11137193428798c41b6ffc9eeed2f6306c549fe31c656fb671765c8a0685d2763bc1bf9fda18c1894ce949a9375a2f4852f0306c53e1d7b3307a99a9396f182c29b75e8a431a47f8c325c50fe5417ea27bf66131a192d28f9a8c5a7897476322e8305c5aa8c11224cdcf5d4afa2a0cbf3637acf149f455514cf4fbe6c7276877fa928a412f2b46cda926f1f2a4aa6d3e6942431b7ee3e45497a04efdef78d5d3aa6288b38d9d9932cf1b739a528494f969b3e4d501b4951ce677243cef8ef719251947a4563f4ec1bc25e268a824cd4a03ccb36237942514edd52a14fe6ed281150146ec6ba72efd7c38b3e5192ec1a3fe81e19277b3c519a2093788bf0247f56274afde94b4c35ac7ea83941d49af35c2533c44d145b7495d25dde5ed5216aa220527bc6132131d6e811335114afeadb6c93569d47c444c9357b578712b2614288972868d1fe6a3afea9e920a225ca794b89ba881f25c346ac44e97c5774d0933dabe62052a298bee2256caaf03f1531c6248a2379cb63ce5ed9dc23c69044c97e5d3bf327ade7672a0954463da3e844a21043ec1c6e2707653e42a2941be26690db22e1738f28e6fc8bf54c92ec75479474503a4c7cd70dfeb14694a37a14253fd746dcc788720921348cee1c24e72ca23442b28d524a9adea829a2a0c53ec56b8ed90e25a2bcd1caedaa7ff2adad45e202c71536b2c0c24609816740ef0617341051fedcff12b792f292a2718852674c1173ba9b0cb96818a2a8314689a60d69f64c857ea05188926e51cfb9f2b89adf1b84280993314f12fad5f4ae3c3cd01844c93ef2ef997c75c7310791030d411494d6c42851d3964e76204a27fec2f4de263da24b37d000442944b2b5970c621b68fca1a4d45778d01c42889d345b030d3f947fd3c8f43d1f21dc7e8273e36e8b63b8b040571a68f4a1f839b24aec27dec90c7a375d54e004ef803fd0e083418288dfc97934fec16762a0b18782300d420719d2c9d0411f6c25305e1011d0d04351837e9e9bd0ee12d98f3b16d0c84341aea349fdf9f1cc130fe5ac3166b0d5d12983e90ea58f11469f08d1db9f1b81861d4a3f61d29f3a7ddb73eb50aad91795f6a254c81451010d3a9474cacc9a3e8625a031076389fe1ccd4a82a95fe0c0e1050d399493721595f128373a12072bece4ead44a26c799897ad352d12197ec702887f8642a366afe74f7190968bca190749a98aca362274c68b8a120f1fd84e8d5dfce196da1c587977d41a30da54f6b132ecc4fbc8e68b0a118d35fa8cdcee9dd451a6b28e6986f2e1f1d41086ee41768a8a1a0564c8df6141faa836ee43065390eb0051a6928989614322222a40ed30a34d050d8f430e5a393afb5e6832d04cf55a0718682c813e974aab4560d7db099a120e2e4141626c483cb1f4c051a652858de450eb12db22f7a51300a34c8502c93e14cca7dd796011a6328dd07b5fbaade156e124331f8cef587a05733fb612807d349e9a8329e948c83a19cb2a16d3ee6cbd0f9170aa9cf5b44b8c6bfd85e286b3caf4f99d2c377d285b298ea387a434822e772a1bc1265946d5cd3f9e716ca7924ccb8e8c954496aa1a03ee6a74dfde9641cb3501225466388bbeb7e23160aa732c731efd59cb47805e65bbed4225d9d7704f3f620da639b464dff83ad3d3cbcf81c1e1e8fbcf8551a5628d66a741d19d1977f15ca1f44e7bf9ff8f752a1249b594d9c8eb935328572705ff990f4a7cdf049a198438699953c22ae1f8562f694a7acbe74e25cafd68579c057e014021bb861001a50286618edfc23c93676f3c1e6c517396ea0efc2780e625e7c0e14008d27142d763dae27d94932c8c3c3c3e38611cb517aa0e18462cd79accc1ab2c9956834a1244b67519169573d321a4c308fa2b1846292c16b439c0c42899786128a37efa54b44bca7a492501421479388793647396920a19c74751e11d93fbb33093c81c6110aa943849ddcde94193742494c5ef58b9c25435244a0518452957d8cfab6bd49888950487a94fc6dceb90be5108ab1ef2cb28567df0f56106808a1b0eab69bc4e6ecebf80a1b57903d018d20945673a6dc4eed49e90f84c2e6db9c84888ecb8cfea090431e9dc466f770caa3e18392eeaba798371be9168d1e94c24d567a8c591d56e741b14c445bbb93f123da0e0afac3cdb43337452b1a3a28c8172b6d2aba74ca7c0e4a22e790547bfc78d93b0e4aa772b246d21362a77b836298d12e31f78720223628483361eabe42471d6b50505283c851738f8cb9a441e9f63c97a9bc9124c119945bef465676a9f7df68c8a0a49f33da46472306459564237692a40183920ede41c8f84fa26394c60bca217c8f1e11c9e426130d179464a8f40c32b8ced56c3eae01345a50b60cd96353e8950899060b4a2639e42c3a6152ff386315251b932c177f1a837f335451f2cc5c3a4cb2481ac15414729ca46979ef0c54143ccd295733f9ec5933e314a51f992be2e7b329ca23cebe45fdb7e7d7f9c508baf0284549ab7be4b4119a744e3ed86ef08da00b2e1ae0058e1c5e8ce08a9e410a84edde5a7ef99a9c63c6282e9bd8317266355623b1e4684d4926d641f92e8ae2ff77f0971c5945726684a22032a9fff86bbda5f8c1b68521c16f61b408010e2e4eb0050e09fc2b809c026680a298af47c908e97b239a3e51ec115727b54c7f758c27ca5ee766ca73aa6caf3b5194cf1b94ccb229d4887c702a800236ca3851103ac5debe7c9b287aabbcc648a6b79ef4c18666238b05fc270f0f0f0f4d1c5f13b4ed555bc4dabb0bccc84421449f8f6f624b3b8289725a55cfc88ce719fc4b942a2db6637ce81349648972c81c729697afd0ce54a2281a24a73b55197e5b4a9443ade72434a8fee973128570eb1167463346d724514e2154f2c9be171f2b12c5917855422d746dab0f360550c0c60c4898c78c479887076638a2d8d9d1e5f4aa57c8a71145bbd7fa4995f90c4694f557f38d74532239b80b810ddcb831631125b1f928423f7bb61429a22cbff1266c189df32811051d493e9a3ca7ee1d1125716b77a76a278a7c0e51d2ee605a2fe2cdeca52198618892cc7822044f79f93c0730a3104511aa2dd3fa8c507f13621325e28cc8f9735e7cd1c58c41944c27684d5252411494f2e8211e16ba934d0ecc084469afb2cb3e9a4e917f4094e5f54c88fbe8a654f88762084aa48790976bdfe40c3f7460461fca9ee5a1ec6365526ac4879270cbdc95cb1c2f7d0fe54fa6474e3bc6ead1e8a1904c5684f8b7b9a1dd3c14a3a7bc2c254f9e30e1a1fca14d4c2ccda6f7bd43692b4c987b68d172a51d0a1b9aef4747578782ce92eba3c7641b4336930ee5f81d1b849ed1df3b67cea1a054c74f9dc543e5e97228c72063734825319c8571288cf05ff7a041d3f5824379cfb483a6eebca11c39a57ed0419c9b8add4076719bab4e15f3add6fc8ca0e9cb456d28e6f22ca3db45aafc8ac886c2d59c981834b48672d0b49527c9d3658ca8a17c1bb33ad3c47ed9740933d25092ebd9a73327e204fd0933d050f41cf64d67bd29bd9a33147da2ba46f1183394734ed6d93f67e25e5d8692e7c95624f150329564288e76fbf5c77a868e6328e92a1d9e4e492deb5b0cc5170d51538a140de787a1dcd5f579c2568bc90e0c05cb2ca57627bc3409b160c617cad6694ff35327ebc76778a158f23a363655c5d538a30bc5dcf871693a6453ca33830bc518d9bce4a76aae13cfd84229f3b9cac7dd2b6d3a2d942e3bac640cb2a1b59e91858288c964b6659deaeca21958207f483567e78c2b9463526af647a9a713eb0e6658a1a0bb3decc94c652f49a78319552876b697509373d850ef1d150aa76be37788105423a9bd30630a254d291ff5c3f687a433430a2569326d0e22e584577d46148a5184ba0e91b02ff1c31c8319502868b01019a14acf44c97c51012e706811023741cf78424988a096d7e2e761224e2865dddbe9dd794613ca26aa43d409b509339850bcc9ee97b1f737288d003396507ecf6f21438ceb1055f1f0a8c10c251483dd8f4e63ada3634a425193babbee0e1eba44482848b40bfd9a92edc33d42d1347df9660f9597a311aeacb7972f0b6d75ab0cf1a3196359c411212a4249b4488f924baf6e4544285967bc0e21f70739fe8c2114448eb6fdd888bed01142c14743f4f61c36ff638250bcefd05acb20ae1d0142d9fb3264ace4f733f707c5ce92a383ceda9e62f9a0a4632a6dd5255f33fd3d285e767f0ec232c6cb8c07e53452fc5fd4ba636c7650ecb817b1aeec36b2a583c2c830a9328b58a93ecdc84132666ef2aa11b53ba20479b322d3f3eaed8a337050cea8fee6a97d5542e706a5cc5bf35cd57e67950d0a136d3329cd213723dd9b51839292eb6baa766b44bb1934286c0a931131b9f989ec0c8a3947935a9d497a9238430685ef1467e9412666c76350ecee33b591b4e9bb6c060c8a7a6ff56e1a34e305a5f020cdff63762b3f5d707585b5a798987ca8461031e9a7c8df8c1694e44ed8398d1aca27e40b2e9e04a5120733585092699eca5a3c48f0dd04ffc5084240ea20b0811b11b062150525631cf16983288f2755944ef6bdaedceabf4ea92899d26e6b429c864e122aca35cabf3ecd74da954e51bc73ab519994f0f8235314648d90f691366e07a152943be7d48e1a7d44e72052144fa7d15f93ab67b28fa2bc21c5e727a53995eaa22887d8a5c1d4e4f8913fa12808757222b87e4cba73405190e7e31b77f389828f381163dc43d3359e2895ea4938d1a95675270ab947aa67bad11392cd89728c3173d61b49af994d143484867b2bf7bcb326ca72625b448e19d342928972eade8af4ac4825c744d9465ffabbfb6cd2e14b94d57e643c253f899f2c510821b5dbd6d7c6e8a944215c4d9279db22f5b99428e76b49eadffee2fb244abe27c5732c8bb0a94aa230794b8e0c1a94ab261205bb1369e1b93cc72c244a19797d44f44f8a341f51badafd11f254ac7a1c510ec9331f73e475a81b518ad8f969b4c35c97c888626bcef4f16ec3011bb821801a94c849ac637af7d3885712e58cb14476f9abfcd02251eca826b399c48350590d4894e44cd68a1cdcb4dbaaf188b2d7f7d806251e328e66c411a5708f10e53c6f64fd1b51dad49a21e7e5d5de8811c50ef5a44324ff7c1a526311854d1937a68cae9a6f1551d2b03d3ae6faa11e52231185d169d733e2d4400d4414837910d2dd3c06b5b90fb69c408d4314e275149bf92892cd1a86308f1a8528e91c621613b9f1b6f0500114b0518310586310855711f7fd2baa2188d2c611df39de4d87326b04a278b9a235678e0acd692dd4004479339388b48f215c8afe500c4284742a5f7195413f942c3643dedc329ad0d7e843f9ef356f48b5269490d5e043295564ead9d17342ec3d14c34feca474e97804891e4aed56224a88172dc9cd43e17a4c7b0a8beca7492c5e0b2fb2f8a2061e0aaa1be17367364fc2740772758a282552c452b61d4a1eaf41a7b7923313d6e19c9711f744a40979a343a93ba4f8f71453223387429620329856497622e483ed0438bcf822c723c6e2e450ccf72975a429d597bd09b4481d87820c32efdc631039c7180e253551924c594942270135de50cce527333269b52c8d1b0a1ebe7962f64affbef48a1a6dd04cc4a3482ba1e3cb6c288b8cd533a6336792d31aca79ec7bc48c9898268cb6c071834d0235d470b684978f899fb3a64d8d3494539357dc8884bc7a81e30bff2e7270a145046aa0012d65adae41cde890730627e9d85a67868250d1efea64ed169b8f1a65b066dc44ffa95d8d3719ac4f539ebb4e9ff683cdc6500c5aebcd4e04cd93af188a219d6dca595b44c3f0e9f41b2b7362c050d458f3a4e34779b7bf5052d7b825e17477b0d00b25c9bbb55ab17119de592ea04617cac134e68569d0957773a19894f49451a273a70da8b185a2adc81231d66b86926ba19cf77386bb5221caee2c14948ce874fe9a83668a8572f831539f3e6b3015b94241930c72acaabd3f89ac50ce1b42784c274734e8508d2a149352554addab482cad17386e24036a50a118827637d9313792b33354408d291445db4dd4b73ba98be0cf46160be822045848a146148a273f56fccdfbc1e6e1a1aa861a5028862dc9d1f754e9ce13cc428d271455ec54fa86fe9c6459c6831a4e2886164dad0bf713e105a046134aa1bdf94dfdaa8ccc9850fc09df21e63c5167234b2899982429594ef2455009e5cd9a5423f6bb45a6fec38dd7076a24a12482d6cf5fd7c9a3ad1a48484b522b22e418939c23581e1bf74ff297dc088c4493d871c2d4a8ccaaa046116ed3d68a2dc96d5b6b117b2669e61249c8765810eb1a442886fd2023d1461f6c5e7c414ee0451611a000da428b1184a0c6100ad27bd46aa4db0d791242498fd05b6bea209442624851e29329f312108a1d4f9ad079e4c63ffb07c5348d1942a6be968ef8a01c23a36ff09389e2e941d1d43369999ac9ca9007e51f1163fcbd26f9f6eda0206fe5224b294b194d0785989e73927b224a3c39e84f88f8d78ea91a3828b9e670d2fd93ca5c558d1b6c5a2b31235cbd6884f94e933135ebf9c1a622281278d7628b0a7878741102f7f03800005a50c306e6f1356a503ef5d173b00e226fe63568508ca6329eecbb2e95f91a3328990acdef49ad52c6af21837248d6f66aa7b522bd356250ead2277cc2ed46bcb0060c0ada64e9e7dbf037c21a2f280935e9752ebb5adfaae102f3a8d18282fc9117b7b133e438fa60c3aec182ab559c073a54510e72253bc498f432e95351aa32bdf78f59f44aee404541c7aa11226443d29b748a428eb122b23198841f35a1c314c59064097513ed529473f6944d563aefdb244549c490f2b579836ea894d0318a924e3599b9a52e1e6d519444caf7f513162abcea0845f1ce3c2de37b90ba3e288a61526b929dddf189d3e18923a6aaf09342600337707474a210f3a7c93148ef1691eae044feaee33eb3dae1dd847918a04313c5c9d7e55ed62b5f5a8651868e4c94667e5b54876c216ac344d94b6eef9b5026c4462e51d452b2744a5a5989416544e8b0444154073deafe396ae698a95582e89236527b442fcdb4f7061d942898bfaa6f7dca11d233092d4cfe6bf8680f3a2451103a4598698e1d13821f6cc9838e4894d5c3e81d95641d7f2e018e2b3c3c4a80c30b2f08240a41c87e91c1a48b50d20c3ca27c32c7ff8b9c3e6973bbc311c5b0a74f7c6ecdd350370b3a1a51f8205c83d28f5dfa43480a3a185152a5be33c8f95a1d8b28b977a6fea04ea6f2ce8d1b5adcf8117c61b65080870717ffc517668bd433d0d0a18892c89fb33e4911414ffe6043107424a2681b3e68d7d0f468797820a21862e7cd49099974d4346bd17188b25d8664732622d684fb031d8628c9744a7a16ebb193e92844b984754e39aab39e4d842885c5c43fa5fdaaecbfd1318892f56e9f68ccad6b7df13972ac175f74d12188627e10a3b17ae1a2c10fb68e40344a25bb75c75002a294211a23756c4d2d35fea118adc43e042583d8d08e04ac1ce8f0434158ab5cc89cdbdef6f0d840471fcad7a133934e9656a36f1641071fca3125dae45a6fc975da43c95393927a9931d143e1b7bb83798ca6f8bc1d7928fea73efdf66fa34cfdc166040fc5daed8cb9648e66f3bde7f0f0c87185c2a1e30ec58fb3ff2e42b8997a3bec5098db13f25293bc0faba30ea58ce9f48d6ef1b20c1dca29d333e36eebc88d6dd13187a2dbe67869a5ec4742500ec51cafe387dda07b7e9411e888c36e9957b28578ba0fe1a04dd44c71429e9cef0de5ab4c17a293ba962a012c6c04a1c30dc58c1d5f931192326ad0d186a2ca89f990324c6e46c9628c1f74b0a1d49effecc45b861fff0b1ce68b0ae0c8c2c3e38a2b4e603c3c30060c3ad6503eef50a24ce40ebdffc7151fbe87302ad1a186928c1fbbcfc37512a94d72888e349447497b0d113dc69839ae40e643071a4a9de53be59ad8d1d73ed878edd07186a2e45c9e35c4f4a8be87877798a1dc12cb938ef946125e69193aca50d2a02eaa31fd7465888707175a182f107aa1830ce5649b315ae297505b76a1630c2519222f24e8f0373aad5b6c614250010f0f4b2e7488e1d5d3f7ac4127e0e2007b858e309435a6f58c4e1dd4da0686626a079d259c751afd0055e8f84251733839dbdd9f6b4e1e8854e8f042d9ce26969f98e4f98d8e2e944fa7be3c1984307d421f6c37ca461658d838b4808d2b9ed0c185d26791157fb9a326a61bf081874008b4f0f0388123a1630b25cdf88c9af9b6672d42465077840e2d14948caef1417e4e3bb19965a1983fa99114d954c8e422168ab1d53f98c434f74a85d07185a2689e8c2683a4f66b58a1c30ae518557f23e4f4a953b72a943dcc8c1cade363caaf0720200154e8ddb6c455084fd03185f2a42dd13db3166daa0a7448a12c6167829e77d5d6930429818e281452894dd5fe2fad21e783ed0a1b5028cca7f1b426fe2e1f3e8110577c476ba93971a113bebcd219e9d38b0ae135a11cee2bddf60a8167202d081d4c28956d8e6d66fec15f7c05bef81c694b284e5027d9d2ca4387124a137573b7d326ee040d081d4928e6f72042cd3267cd663d7420a124498d8a5ac91337c711ca1235e72872a373921118a17c93e5c3f49677fe590258d830f3414711d22184897fd758071d44286dccce5577340979f4c1e6e1b139e8184239eb68484a620cef39a538e810c2083a82c0771253512daa747455d00184628c704aee4aec558d04b0b05166838e1f9413b266d3b38db1f4c196a3c307459f7cf1e15cf646e73ed8dedfb9c0c185c71557d8b021012c6cd8b8c2c6216a8087053c3c3c3c5c0b2cebd042470f788d13ad36bb4f15b9fa6d190d3ac308b987d0c183828870f71b9e32e4e0ad11a06307c5ce1132574f437c087fb03104b6400de0220207810ddc80e1860e1d14743ddfb3444f04f790a123070555d761940c99bbce86a10307c5aed2a325d84cd29bdca098324d0c11f37f4eea3f3887df77d8a0bc9142c76ce3ea13623ed8d6b4031d3528679d9552991d3566180b1d3428ad7550ed8925e2746a858e1994af2de27b109b0fb61b39b468228a0e1914b75d4535d4344ece6631e8884139af8adef8184f47383fd8fc061738d6b888808747273a60507cb74af9ecbcfd9a2c2fb2101d2f284c50a326e9984afcd60fb61c371e04e68b3bcf8087c7d1a1c30525d5bdf1eda3959c24dd42470b0aa36d5e7ea124ad483ed810dbc86201d6c182e65bdcbde43c3ecb2a939cf0bb16b9cf0f8d5514c6e36b0919d2490e3a1c5a6cb185b9d1b7c51607408087470e10e0c0f171464315e536a16dbb45c447146f7cf11f60fbe217e0e1918ad2c77daecb892943ba20b0811b2ba0818ac2ec697afd18e9bd341f6c344e51124d2289d8f519d4671aa6289928371dc4ec9485a914256112447744364e0e290a799229b97134b34346511813f1ff458e9c4551328dbcf176f29ad90f4549df33c96ceadca0018ac2c8cca7938938a1b97fa2a4441015ff7aa258a6fa3fafe410cced4461e54d821029714ce99c28597d34531ad33db48982bd4acea6b3cb797a34518c316e89a4799389f28df0d42ff9c644d9fd64747d4d0f9fea4b14b3bca971bdebf0165ba25c19b3840f72ad44b9ae7dfe6c4fcdda4a89e2768fff0935d536751205215bfd13148e0fa8e48f46e348180c044281301808040488d5b601d313000000101812c6a20181541496f914800344362a4c2e2c1a24241e1c129084638130180884c2613018100a08c2c1301448c25124f53a00dbe62c70dd8dcbdad848474c845c95c70298b52cd8050e90add34c2aeca8e9e3bb00cb599a854823e21a257313f7cec8997a83d4def2b237bdedba5b3074a012fc8558da827220b798d6227b9eff3fc97c5c56b89f9a9082d0acf0c4b1df7a733a6ca251e959d6aaf024850f480271ecbd2226bdc4b0dfc8c7c2921d91d71bff453be456ecb8b5630e662a46bd66a0e8120b4aff0a0ff269a9d5b95f9cbabb5015f2ed3ea12095a54e1572ec99000a13c9e498fc6a3432ae40f350d1033f434f3711dd8d643ce938864052202174db500c700248a8e29e59a4de8cd186991d82e15cad2285586644c1579f396b55d227700743b23120a7164bf1e0d0d6ec5243698404aa9a8a7f42033e218e76caa09162ae24a1b522b72572418ae1c908c6fb0fb1815a49aa63e0deb6a04e5495fb52864b0a32f9de8bafb7b6875883f65b28c052ec00ff5259173dee3ab900da887aa8fe70e3f2b33ee0ef315c68e04fb60bb846eb72781e549038b2d4aec034b2c9a605d5ee105c8990d54f03f0ea9f58aa48403efc3168fec0d84b6076b9c7ccdd0316da71ac75c64bafcdc0c106fa554042e1e9ccc0ee9f9add040445cbd719e1d9be344bc9ffc9e21c0c58d62711d59c3c057a31e570601dd34028355e92a61ee6ab76339efeba84282b274c1a73b8c20022974455c9cbde80a37b1634cbd85f6eed173bdeb19c8c8430ad8be74f8d19bb8a4bc9873127bd2f68fd4fb0c5685318f592191b99482dd8e1b980a191d961c1cbd066b8aec237e77b9fafa4a8a0ce6c274dc5069944ed2cbf9bb17ac8d22518d8d6a73aa145087623545e55bda8d3771fe93535c7c25679d43dbaa44284fd80507fad7e08ee091342559215641cb1396d098637c20d485aa001a27ca5aff5ed8068f9d1dac7880daf160f7b98683a4c45e6e9aa80268de07c4068cd911457dd687e04db2712c3143d97340e14944c56176f624a3ee9256ca2b1dee0c38100044c1d2fe2b1800c0018903182aa42c3402940af0eca3fe0eb9f2cfbb37d38fb7b5ffbb22221146672bab9eb90f11d69a465a13352018e683162cce8681af615ce298f46690f5c103899cf595f5047a55690e2bafd19367f401861205065e8f033230406e7e3d4697664980534157367cac492730deb61f395a19f36cde581c25020a8d9d62480d2dbf41f6608e75b587569a45ba314d0ed524d79c910e6336560648c9a4e786e6d24aadc2a0702b719fa92c0c8c7c9937e2e20e7395aaed8e1e54bbb6024746d963777af4f612ccf059e1f3ea76b4b64388781fe0b31abc44a9474d1e23e24f232bbcadfc2e7cc1812f9765e89f7a953eabb44790c3a1ea9e0503cdf929c453f8a12e227bbb2e31227ee78026dfc318339bac2ceda4ad90657f5d441bde1673ed02bb1e4e9b889dda04085d66bbcc245d12a5cad29879f87d23fcc309c90fe41c566effb94fe400a7c616c4d8c64a6296c1e9a66c4f1c4568ba563cf0dbc0d4faf333a1218c6a58cd624a22fb3d6c385947b9dcb2b5721961a438ca13780a074dc41d22c73f780729d55d356b17e29e824c49274924013f7f44ce74c969ec05d82666505c9afff5c5dfd9e908fcefdb3aed71200d0bf0f123cddc845b78f569a81fb382f9dc0efaa199ec7e9c83a28d836aee84087fc3f4e018b122c5b5f85bb437d17393fdfb95e6d91473b60b0f3a14bf8e2db0cf1cacc630d800b30ac4602d93c1469a7526effd16538e59e3230ca58468a90599830935a60b1e6e32d5ae8114e00ba4f2f9f1eb5ab9a2f8b2a2860a5d0865a18bac6cf9e390823e3dff4cbfefed822e235bedd52864015409742d1bba4715c8ee607e7e4ad95b094097f1a3d5ba041477b30cc69276b0c0cacd353d5ecfd16869a50ef074891dacb8b65360e51c4473967727bf05875f5083da88e882c8452398d00c7ccc09c9889855b554258ae9a5775a47f5b27fe7c603e20d6abb1bba113762f42ec92f0973d251dc477e61df6843cdee5080b6b3d2cfab1833a70075ac78b8b4c6ec4501c471dc38dc53b97376d5c17a33219fa6f12c62cb43fac4d9b683f84edaf4a6c4097d3ad7a0d46d510009153cc4933beef58da52fc5f2129aefb950954d7f54033ba52f8eea3703b534f24bfafedfacfadc16a714fdb9bf97dce4010c18c3d33ecfb74d903b2c2c426e22c029b302f2f444527bcfca02f82483f8fb9c0823b668a2ba56df52b457593fa89b4f10d3cba3532a7d579206a11c24e55f498f57268f65d20198690d678ac27d10149d8e962f3ad77f4613ce7894bc27363c971dca9f407d308b056d43e61fb938de785b08bb67cb5f1f70710189904deb94fc5d4ac99dd819af464448840b378d752f7d2d27a7b23e44b1adb5f6d25fda94e7caf39c763c5a66efadf09cd52f5046139d8807a4f1f269692ff1e8f754b2f95811f8bf5f2a23c774ead9c6687b325238f20b4d9df2ae78efa27e001c32c6dd5545aee65774c4bf46ec50d6d72016e558e70ed5bec1a7923b5e1c847c7e1e6bed59f01d78b65786942fb1764900b15b553c4cd972dc695f28d76cf7b3502fc8d9c0d784d229c6fd849998947f8474b89928f6584559073c708de8b7e6f33389e00e942281e040670d24723c37f2e2b11d093c5a6cbaac6265e22da1c3898dace0046751a160c138ea11d31ae900380461ff9a6612d63c7bbbabba29895cbe0baa2ef6be4b47efbfc6aaf0ac7af6dc480ae934bf1b5d8c98f7a3e61f6bda2359a8600103f374140e00b705bc2062a1ec174709296b98d4ce75f9137975cf2760456dcaed492403f74c50e09a88252910b7c5ab12bfc5665ceaa05b2824cd72aaab2a1b8b5ab325b95c9e3392502a2f1de71356d4eb15c2a451f0477af115088fe74c1c681dfd921c00afc1a182f01aff51f4e4137cb6316c0c420bab2f1b891898cee17c37286b91a4b042d296590f70b6b85dedd46c2ac7450f4527b1e1c5f1d267d6214b057974536617dc044d701a83d6b1f7bf24d617fb082abf6da15961523b0bc5a532879b0c6d6f8ce15dde882807f08bbc00103068430a3363d5a6e9c955a5e65e0f553a8e81a1f157099034e6c4cffd94704309d356b7a1013f4b1bff524c348ee14329f4a15a0dcc35a8cd92eac5aabe1dc302bec56484d4d97246a8b80363fe67f0b155e02dd8451674680a0eb2617800b6735d5699429665f14cac49045b7a6e52f31ee680290e50e85d397d12dfd456a57d016bc4843c206c0a239a7642c7bc517395b25e97ea2f77d7090122419b0d2a3b3c6a069e44817083ab73ed414a0613c3b5ed2f333fc982ccf329aa437f781ce5f005666e4ba38b44a92a08c08cff0e539952e3e6aeb91d5c3f44d0e65963bb78b1c2ff3b316a30ca597e30884f197f6ae145d437db77797b142eb083626c1cec1a7b93b2d9945ceedc210a2598f32638d816c550740a935d73af4809a859a7772b6f7ea7bfc6ad0c91e585df198b292a839580901672968c2b540371c8287f0e99db337a04a792bb38fd2a834c149fde5993a34869464c7ad634ff6aadf4eb9e2a05d864602225c4f8d0b33dc015ebcd7b079b27e0517d59599f0e88ef109a600b0a990cc52d1a8d24226cf21900b82205ac684b230047812fc55d0d114d6859c118056b45de4261277034799cd1255a56a6d8fd200ce076b6f765d545f6e0304396f41b45d418c79eb4026642acc818cf76c7aa693b37e887fc1301f43526b09ddbf918aa5133c64983cb88ff3a1288e8306601a541004a1561c3be25643cf90b18777fe08241e505507f078df0786557a827b62f2e85a22a3e8cc6bf8f6b33daebba6f686f7400929d58013a3750ae1977da190913219fd3a2541d7c93ae32a87290c8a2bd6509de3116b59a73fe17c026e1811f5ea6cb24d3e181122ec4c6829021de7d80c284f578e5633f1c0c2fdd3f7df5fcbb23d3bb23bc3ddcd52bc260d6199befd8433e7bd1e2746597f95bd7502e157fe1c529922302097a461e2886a3c3db4b09fd0bc84f3c6bd601e51a7199f13a1438d3dafa04b3fdc33994d55cf2a59224675714f2c1bc27e054f207eca3d4f8dc5cc277d501de67a6cc5f0fc363a2d8582792a9dcf280ee36de384222e4c482e516758337648443afd80b112db74a8cab292156ca407bf52185d46d6fb16eaf496506a1364a64e36cd7e27b06b89501ae827cd0d7e9c7b3f5b6734265b74164ca63dcb9be064e31da5feb47a4c375059d14162367b43f1659a8af7f26e672714b6e750a2ac9eb4f86e2c2409f09fec6df5ce5a56042786af3f74d6304b35134721ec35c4931903e7eb7bdc93b5b3ea1fcdaf43b0ceef86d5db2301a0e94bae83ffaea5807e00a1b49f74ec36c25abe4cf3dfdbcf484ea09892fc3255936789d92a51f0ecf1099413b239d06006cd90abf90026f0f4b450cc688b4f9f85765dcfb5a7e44ad3b63d2843e1143e71f0e4cc7d1146652e0cbf602355c62a6351a52e642747305a0c63132e78ce8b5137c0fa93f0cfa7acf54c437efd9ad7ef726e8a60753c1c89dc3e2be0e7deeb3c17ea3b0cff08bec018a8771c3e8c1714bb4eaf0d19500baa9cc3d6b31ae01a008608d616f80a9286425354addca8163ccbbedb5bbac87b9a81ff70807bbd3d200ff1da3f7bab84b14d45c1e3779d24cf13e6bcbf2234b2e5d012c84589b1a1ce42d9b60d841564c7db2d69b6f89232925448ede1aab9381d7926e7d1d668bd31ce95c8c8ea748f2e2885e79a5ab070348ab690523a68f5c660de61de6c5df19383a7e4aa76158c1ee0dcd34abac944098ac29044e3dc6faa53b3b4f16e299c466d35ea065560b038462913faeb08609e53fd340fb95828a41e20b99b886961e4c99e6234407b647cfc51ac3bd8deedb4b325706198c51fe005c8301dba5a0b4ee672aeb35f0eea3a4de5567ee3ce8d33bf10d7fd4967524c5b29e73e389adebbe0651be73d836f7971f06a862de946a6ab2df2c7cfb813b2613d05f8233e76a874fe7175a140ed6c81ef7fa025267fc113c23a66c324537ef9213bf33adb60b65c026f6938c7552c0e46ac9f7bd25d7319baaf13a6daa9b1ff3ce035d29d71426593062c0b4157a93b598d8f74d9106879d3b262ffe492ac95bd8499f458f2d1c09ce34699663e0f8ac3684af6c6b1e8a238755d75b472edb85c708bb1b192eba369200262f81e90408a5212993f0610a6229d424e3acce5963c5ce2d874874ea08d74511da09ad32916b5b7f0216680de12e364538cb1cf11a79ca64b6c1a33ff00ed9c586c269da82a1efe7f7b44a30abc6e21972bbe896d4c0424f8e424969ac148327796a99a2ea82f8dddebe4b592f9cb5d99b6c528824cab97b4527eaa029c54d796d2c3149d4467dc127d6e1a5d5ec6d4ac95a181acbb960a803654db11cd52bccf9e485812f6046fb6de6a9ea1612892dbdd52d869e6ef9ef004bd6889474a81808c191b131836f3971622340490b9aa6e7d4b3c71a15ba488190c6c492f46162de8b8281f048709de271d14fa686daab5a62fd68ec7a0a36cf5002d1f62fd91044fc3ea358aeea8b6e0d608cefd2279423b4dc5f7599ab98d450e20c4f12c97e2048fe6ff75283427b4685ebb386cc153f5140974535458a9dd9dc5105f631b9ee19d54259eb04e253930e3a05fc0107a8d1a2b74f13291e13aeb1cafe9d4a2550eac63a63f256b1faa9e7ec007a4c8acce6790958d6b940c21e37f7d9256a908ccad42b61494384c7b7f60bc5a29860a320f1d7ec5723182062a1d8608a3abcec53d344c17c852b6802d608b58cb946a015f4e169045a4cb52fbb74534401d9351ad6cb7802367c9368258274287e5c8024d9282ef27e4ec17515f6ee357f675c40a1d16b97c23b1ab5b8f6401af9f9c7063d503fa9c1c8a1258206446036aa52054e0da470f6a545a656262021a5cf18461d6f40108ad204f883e45a13add2f32b38d998f14d2c71d407f20b4b54024ece21f2a54ac689a76088746c61e367e4a80b3989b5b604da384853b7c0e578d1b8fbb35a887a220180402c794e4c9b8841ac027a16e41c1965dd02ec0b9737cc39bb5cc802c48a61ca91864ace9d815710d080d20ace96eec5ff750e82eeb9b69eea7c4a4cdce826ac364d6c688c8900ea061bb8a572fc450ae219dcdaa43fa3d27278ff5309de8ff7dfab0cd7d8e2b2b3a9de49bcf9af873a0d0fb9c2decae9a67732700ea4363b7e9ad03c225d2d1064d5ca53384d7c7f72324f36526571380f4bb1047f1a98cb3c89cead082f39f2c6ac8a907abefdaecf9c85cf64681e26ef9f9428b631a33ae06e6c881b5906d8fa135531fb148fbf9841ad8bfe37b4541a7dddd5b15d803fedac5cf6b788361a3c23237ed696ea6b82cb51a69fb094caca0d00115aeb0746b516bee6df7f36c9122766a2476327689da0ef895c0eeffdd080ecfbe1eaacc8f0a21e65f6a398eb941df055b732acc83545c6e0e514818b01b0e753c453b2c5990193cadacb199be213b4e52b34cc3906de36eedd47ccb6348b9acb5c650640aa0182a23683336d629d98781109dc1d612d64358692f5365e3589217a7e5bfd8e9d12e500506b420ae5740ddd04cd12334fbac8cfd4ee24549f67f5ba3048974f5c79c8a3512bd160016dcefeee5ffe315cdce132ceb7e2f9b2820ef1000c0c1de389a2a809393d718322efc4c9b6c6619060bc49ed5644dcbf2716b7e6892a6a54b282546c435922e2cb18aac12aea96d06ad69538ad352f66837ee04d54c1b082134077dfa55ab0718da0dd0177a46f77c63a0197045b1cd9e0b7e49af48928be591cc12f8552f188a8b020a028767dc673c0ef348296833044b52f75aa5d7ab950cb405e4517a30bec89a45a3e80cd09c0c75cd242b835d94efc4bee85826e017318dee9fbe0aa190c381420c0080fdd3343496a1f5399377707c50a847c57fdc2ca670a15bde28496cd9785251432eba1be3ecc5aa15952c14db956fd286e4a8c4547c845848a5013acb8543f3269c88eb79ba3ffca7d1089ae96985f96c242d6e81718376189f1461b5c3fde6a002a1a1b383459b6050f56b3102c0e0951b3e6c80c584655cbfc1a8fed4914f1ac35506c0ec0340bcaf8b0d935708e0694aa653b0a38900a2da71432560e5f37f263e8f1e8a152ff1f3532994d1486583c2306bb2fe7a743d95482e7049d0cda6592d900b23356a9330ecdc3f0537e020ed9f3995008e927fe098beadcd36d66434a4cd2f9932ae101eb2e93dd3e9421bc5561488d2ec0499c2a0f8a6616158470f792ac8c1d25a73b0a32c2073a73ac82ea6144daaa5d0a5a4cacbb0ce06917d963a927d3ad14040d386e01285b52e143e26557824a4c88f173290b8905572484d4b4ae3e91ff4c3a1b51e4e02fdb96f2ddc283b65041b65fe66570b8756263897e96adfd61efe13af41664186e05b5bb16f766cc6c29c6c66181e0e0d1a6e0ecc51ee5b28322e63708a59ab93f1e4b7c341dae7413f9f5555e8386a76bec7b8e52941d4c2792c1668d054e23c5d1abc635b18bc943df577e30b59275ea27d11954e2b1ec92b9c5f447e8835d48c50282ce54111a81595533da2e40dbb92e4b631a6505af82a5f2fa2b5b74a5b3f2bf6aeb915a33a58a55413ae8075b42ae99a5851abd32abf9aed0a69752a2a5b1f6246142a32327c16aeea388182d380cd3828755f37dd5648644962fa177170282e93865856015925d33118b07430026264ca3e5cdd8d489c8dc554a6c61b01de30d0a825e38856aa19af5afe67d5698d9f95d8d63b6c79b5aab146c84a75eba5963f5605d6d059296cbd60cbe3ad0aad11d63421110470668ee420d1a4133e768919da566e24ffae6081f4bcc421a6cac581b51ca14c59595156df5503dae0b2d9daafb7fe05b5b45931a7edaa0081aaa222c3b79902b4748c19cb7a4209239378acaf7803d49df9c273d2130e3227a3af769c6162486254d480d6da87777478879635ead89f53cada4d40ae4981ac9a82ef9f6add3ee26e8153ed19f33b3549c7a9f6ad084bbe9ee437139adde92e00fe7c68481b21d03b4d0e9d7505d4555e09890504c57fb0c1cf228b115e7e239588628027b5e1ec0861d794ab17752c62a9c58d1b0b407aa89c63d3944547f223a95b4ebe1f1b173ce7def696bfbc816b0663b96dd2281097d89299922f4f07cce80538c086ae00f26cfb6519002cd3298e87e2a1f1601105b54c8ff0b026903774e27c04bcdee011990217893b837d81b138546c9ecb49f878434ee3dd8fa79e0b6510b1d0cc40a2911ed793923c486afea7c7952a5cfc87421ddd34486ab81de3d78c6ab184b7984383b0fe87d1e5d08cb8a80ce0c544de049326412ba6fe7d0f0d8c24c13033e418564d103b948fffa60f129595ce0c43db8c3fb06eee6cd5ded582c6250618c8a92ba73bd1adebd68863dff3d818a96b564c056cc7f009b483fd4ea22c329e052ff8ffb0af1374c174f6c72a5aaae2dbb594376587e18b3afada0650f2247b3bc11ae47a83f76fa0b1dfb6fb78ec517075bd471462e740499b40d98e34a57cba69b7bb854393fbe63776c35a0a67c86b9226c19e853b28065264ce3931191ae6b892fb6aee1a7f1e03bd589f13c9993a201e0122052e506fb8e724b1428c6f9bb29b117c942323ba0c94f6b4097cc6fd2fdbc145abbd5b8967754d6c9432105dcd87021c81c8bf1fc8b48fa6cab9113073ca4e3c81633473a2d1112e54b2e136359c79c6316c66def699d2b9e9d8f55d8e56645d687e5806031b27db28c7e96459cd8df7542674ab9beeb509793417f234f800651e8813c76dbf09be214e8ecdea3d71b72555a8b2d22aa24b8194ad3ce98b0db6d7d9d3d66d26a271eab301c91ce206601e30c7e50569455397b6cd060b8857a21c47d01adc47eb55161111fe7d0f1647d6ff3377fd4c275cc8b515f3d02e3edf1f373d469fb82a5b2b7163fddb920860c6ad7ea6f2799a247501b7140527e0677abc61b5c6cddbc3ec96f10f21b441f046737bc459c2c3826ac9a5e03aa50aa51412f9f9cfc9137b70041976db44a9421446261eaec6114d94a6dc8e11db86f94fb16acb9b58f3976c5d65228b19e91bd4399d6d2e790fee2e1430d6a85b9f1e6954ae3483eda8ebf554a28c503436fd14728725a35e50b7d5381ec50592b5b5639b219aec06159b3f8428627ed98de33b190d90841714a97a3589f1dea1a874c4e9cd60e2440389f617c07c48759eca586708edc8e72a87fbbbd8fc5ed78bb78b9b4807fcb7daa963354460955fa8209c844a5d223eabaad81ae2d7a9dc3576f6d4c185b65724aabb006c3f51b06c8856cbe8f1e28cc20c598f9f78ae4eeea1354e5071ec0f1da7970a9890151dfc26b4e444a468b177cff70a39477f9e7ca0b4f6703b3e95a4d4087a9396783d5adfead67fe11079fc081094e085f3852ede405724f68bfca2f301147e1b87b82b3ebed5d24569e2b73676f040c3816682b60665e49003193c9120171ed7a8e3f467fc4c6f8a92c34368b811871cde5ce00e9ed0965b7fefe32c811f077e61b06ab97cee7f65e2a68f3e36177dcd8474a4530e334dd2bf599b3cdca9f8e66f27c2a2cb64f6620f71716d6652a760f3df607afce99ff22a0de5f77d6d2cb7e19fcd6cd49b51da6d227700005851d66533f59ec0c739233612467fe55d2302f6a37e75a94380fbf39ffb1bbbebe37f298a9586d6bf3e925842af556d97b5df2c819cd346eb5af00d46c846bcf77dc321435ec7d84012ded09e4641b944690b1c5add70e27475f916780382cf7b9ad4cefb9e1fdf9e70ce9654248caaf3c68df5b69ef051ea45368211aa4fd7352064503c79699fd015ae2adb231178d87393458ec64a7012139a18dcc07aa62087d88d8925aa053de71c382b1c9248ae56cb12c3f9dba2db15ee139fbd8144dd7ec1160aa352d5e1f4d3391e8772d3cbaae45eca95f7e1b377c3a79c9966a586ae20fd1586c9c07e0d57ed3c0133244ae9dc531c3818f493335b631b86a3a3230e4d6d5bf0d8cc8d0d377c2b85bba90a3d0be61d6c9cd8642e74c68e495e4fb32b13d29f946bcf7373aa86a23b21014647a090d8ab917c9f48fb38009412a53d1253dd6ee1bb8bedee2ba45d3dab913e95c72996417dad02cfc43b1f761452fc42384152989f324e3c162c852ac5a51492f3c6aeb2e7a3a83345ef716aad7b91e03f02e9595f5f141e5f96aa48c4e39803442f1b7970becbc40040c3276fb8737ebfa8b9282e0fced406d7389b800031bd46a19ce91383a85e07b9df7144986fa0333e7c39751b143f28544f2c7beaf184d253454f3d4fa93e55fed4eb2925a80a507da15287aa08aa17548a455522d507952a5405507da05283aa00d51baa94a1504d0b92574c168833cc222ccd71bc4422cde778445e9ae4f888489ae2f88b9c34c9f1139934c3f11789348fe32732698ee31988f490c35a2589906350a2962067f80d83a8057bb77a5e480a3477eb208a4c8b27953734c95423f84397c220f9c6681f3ccb8113bbfa0ad7ed457d461ba4a4b3f303390435afa346889221080beef01b37a22cc7f4310bb7f4b24966a70d358aa24866855c8d42408a31091495ec5bb84b3146212523c3872baaeddf10fd0a8f21ccddab8f8cef6bb7e3b300828c4f6c9c2784bb99b9fb049f71dfcc8e293214440425f6000e3b3cb922fafd8c7c2c8949f4faee86322bd27daf79ec01b017a0ec004e3d2e37fb2aee0a413442e1a4824a00c46c0563f6f090afb8310d805a066a9c8dc428919ca9c8706a909e818a01e8f3f3e71a6684742376675385200c347c1549184319054b053433ccffb0d166d3a385d81d188a93c24538910ac1704d579bd092fcbab9cc5268183a8f0921442110c901086cf9507d3b8829a1d7e304a843aee3c9ab86085228021eab406087ce4e9a6fd0de0830edef5f6d41061c707678e5b185c65bfe11ea2db94da03f9b31b2737338b415375d56d031dfd3b38025a7fcd67a14864fbc4c5310345d6819f673c254c62631657764a6e448ca9f48cede7e254c561e73a40a2e29d6bd4bbef21223ab60b11aa2ba9bcc2a7094eb6bb6196034147b6904c0a034b8d15d842912260f14e29bf1056037331c10c9c68a10810986ff57fcc4ea28f78cc340897b1ea0096017cb8ff03be7c07add1a2107d46d19a9bec63b05e6751471d597d5af6392df7e1c9185277793120806148c28e4027e9f8f8e3f602169f75947e52675946a5b91721db6276ace1111e41320942614af21239478e7ce3679b47c06da9e046a8aad2a28ffb49faff6878c446c5e5ce4d2ebd21980fb2ae9473664c453d5e171fd1cb542f943a50a5509142f2854a02841f10d953a51144ad55fa0eeb5be454d066503144f50b1462848ae99ae93006a0428e6a172400505151d2a0354f150714075824a0f5507547fa814a02a82ea874ae1a9e58202e62d7580a750c05aa9185b0122c810ccb6106d03e16b9a1300ddc01beb083adc4844123d95f1abcc262518e2000d526a3a4e5b7cdf47e490d34bcef41e1399bfe32994ec85e5fb948400940b27a9af1a00cf570004529b8c2965d0a2505ce3931be0f8e26400bbd49b66466af797c9c4f75f7251b12ba93635b08743893c0372c40740289a6e587c18e36aeb4d831d941c283719a62113dc6a1cf5e8cd3d611476b9fc9b32f507f7cf95de20e689f0b8eef10219e4c2e04d04582d32e534c82e23023c444a739b35dfba3e49ca190a9b8285632be23d31e33c57afdc27ce8d9faaf43cee3577ce09c814cd6937aed60c6ecab1f8f983f8fe18e1a0a4777fc7bdb1850288a14060e3d26a32cb1152a1e90faa738c80cdcd08e608bc7290143b637749af716828261d4b2a59a8f01071aa5e93cf10d610eeb620cc80213ccc7e1291ec628633e41b63e9869c31485f0bd2c06414f9207aaebcd48b237a9c744c83de0fa2b58a09fd704a6dc578282922a66dc4c54ffb169d89d727533969404ec75339c7997a829c943732acabdbd8a502f9c2c02953683b63c558779a11ba79f176b55cf8dd07af2e03c7422e91eac702850757a774520e5a1d4e9207e23b5be9031f10752b910d2398ac1fe82faa8cb940164131356f8ed29ef63950c9e77d7c4cfb8a0a2a352f13377f5ac0724aa17451d07c54c7118c0f6951ae4d547907cadd9297772d539af400c3935fa0987c122d121bb897f22f8d42ca6d7133852adde85ff88d372252a1a7a7e9a98e8eaa96f2ae1cc1e39e83141622c76a64ba1de98b23978cec1980116791804a70743c9d22d425a76954ee1a000c3087e639411a11acad3c3c2c67b615e9a2f989dbbade96c7f6399244cfcf2cb2970f81fe751920fd8aeb4afb6ac20e1b96be08f54abf1dced6007e797babf3cada6079d56449bfe27a9b2e2c9cc33a4e797547a0d0d4544f0a1dc020c13f0056c1818674164148d816e1210ea9ee057687c84c4b3af0901833cab6fde7fdc05ccb6e097682afc2160e6ba80f7c13bd1d550d25e45301cd2572edcb9f50b316a544e1d00ecde2301a2bf260d37d69d2dd9b075d5a7412c08ac4d8d7277baf4a82f953861f5882b3b2fcb66961f383c17a465da182ff640c89ae4bd7ebb310f8e78b38b1704eee4d02ec229e40ddb1315346a3a0380db7db7db6327281d016d37368973b39aa19a15a79b3eadcc721e5c56eab5262a324c98d2bbc6af39b1d9c680df869592254af3e9c04cee7551b11366e1afef75f078ccaa75239343563ea7506f61440269f273963fbd03169ff7f9036480ac5208be30d593ec42ec76233f17c2b7de69d2d4927b388736c65f3cf6989151343020e9522542623a4e1e6d8b1d76236516f323431a793a919536590fd94fc3f4f213f05e0b1125cdf063be6e63a628393d6e3bd05d548a3aa18a28148f04584157663de46e47ea07755cfa7ab857b4fb67ec7205ff62e59d4bd76b5943789444b0fee551722c1ec7c3ab8aa2bb9ebfb7ebcdbb3dc59b687ea5f8e7b126eeb1ed5a03c879265b303b8b6aef0c9133ac491380f8e65bb0c53703c774f81b8345cfe81406a46aecfda7ea7c3c788bccc1a9a1c47a63bd6338863ac9000637a065c21ca46077f6945164232ef986d465319a770afe34d4f662e7a233de10949ade6a14cd0af1d85d2a53e90bf6e0eeb3d2acf62d9afd66dea4dc61604c90fd2ca084d770004689cd7203b022f2d6a75b7deb6d352b969f1a61d680b988501889f1300fd0df9768473e8abb4e6e773ccd3da85b7f10d7dd480fb0dcd6c837067b958212ef6a1b80a7c6c010a21766e820b5fcda24c35f989584be758b9e659253df6b7b00c2bc29a843d596092735b94e74784b15d53f34d5ed2d38ee35156dc63b5b778c4148a23131546170a601490058494cf27b447a19063d4b870d4cf65309c1032cc9e9919a4a67d7b2231fb0b23b79f80ddc7af9841481ff2e7932a27f272aeb2370506fc6e67b60cd947e13db560445b8d339d69c7b538378e001a57c499de88dca2c30a6a0f1816393c6e1e1235bd858789b16bb2ab78a0ebde24594275c2837b8dbf54270970fb783214431aa8db3135e7aba5f24d1331050624eb32abf9f03c600c866868430d8bd6c45231e68f59aacd45933a0a4d9ccbe2018e07aa2f6fb1f1977263f0212a0bd0deb426d88ac5125456e38c76f293c82099986cc0dbdec32656cd8267bd53802588ec779dd6001f2d34f780613526b53bc1c1320b9c0739901996105e0987db1013cda8634b06188ec3b9a053fdad8072261fd0c4657a02cb5e0ae87f00c4c926d0eca808519f8369d385f10f674b8612149e02ce2184da0a3640b0a6d0013c0c3c0c3c0c3c0c3c8cdfda7db333ded84e5212b53834ca04d1534a29a594928efec5ddfd69003cde6f6a4d1adf388f37fe0ad50aa50a3446513c41cce98c96081b8b86288a9e3262d2baec447972181c6884a220724de6f8a24d4c1a82a23042744ed2346429cf278a5a52bc36e9e6c6eb3d51ea5ed5242b64cc769d4e94644ed7b7e749ce9f194e944bfafcb2bebee5a3dd444136bd68d6e7786f5d13059dca42868e7926caa6b2e47c9b7f63271b132569f44dc79bd79231798982ce9bf81c4e87134e6c8982685775ccf5da335f254a1e33fbbdade7ea26258a697e529cd665663b4da27426daece8ec9175a2244a2daeea59776d5cb39128d956956a8d3e69d307899230393aea93245a4cd0234afb9a3cd8aae788726ff898729b3264d48d28aaaf8f8792243f598d11e5785d4affed9fe546631185af924493fd5ed37d8a86228a5592521a4a98a5fad7a38c8c981eef8346220af37a5a277ad2d5c1d4c15683df9163078fb40af480062292c4ec62db9e573447079b8e1f3bf004340e9168425c67fd6e707294758fff31461ac2f694251a6ded56a48373ece0313282238c64058d4294f2af54e9f7d4183644887250ea4afa302d1fc3af830ded0f3406511a2927dce8ab0ad97fb21c6808a2e4315b97ff7fde3705a2386e1d77e5e3dbec440310c5eb70223e5e87086d5981c61f4a253c7ce927eb1e2b8180861fcaa75a639f2c62a4c95b075bc2214606c6c0c0c8481f1e911a93b42a32ca36d0e0c327d5d9c8f530bd309043f770041a7a289eb871a3a74cd3c843dfba66e5a96bea7592a4e6e1493c393ad8eed4f4303c94fbae6ec4537a87627be758699f8281861d8a49fe98e3c6133c3c894241a30e253542896b271f4c6874e950bc8ea9b35d77cd68d21c8ae1fe34688f7926fe722828a5b36c1091a549d7712889995962c9baf16c4f3894c4a56bd6c6d91d933794931855a25d3a3794caada4aa7db67b1d87181918028d3694fae45d937e84984921369484f930930453114a73d6509451baaf24418811eaf1649071831e3ff40934d470f2d01eb6d6639ea401253269497b0b82061aca3db2596c45280de19ea1286379b27ad93ad8ca9440c30c2551e245935c1f2bec94028d321433a7913ddb123125322827af5d09aba53114f4e426b924151243499f766f9613d9bbf13094c4dab8b775ee9b460d86728a4f52cfeeeb933ca2337afc28010a769cc1c38c327884e1031a5f381a5ee80252ed3aebe7bf9b8f0eb694ccc888e921062c6870e1149a362739c2c412e616b6f564a1b1ab84ee7ed0d042693326c92433bdae6dca42d1b46f9918e36f7d586960a1aff594d9949195d3e639e9d3f5bea980c6150aeae59e6ce34e3451a761859260e26a4d7d38a5a4d80b34aa50f63e258812bdbd7449a242b9a48c6e9ee6e2a9eb299437c69fe8bf3a225a4ba1a44147da9bb2f250ea05a2501ed54c6aa5dee44e62a0503ed3605ad473e920e7a3f184a3000d279454f87c0a75b51af236a1e4fbef23328dd464e279060d26146f637a996c4ad494830c320cff18a38c31c8c8a1e387199f6c406309c5d1eec144cea6a18482102b9d4dda13b3a5ad83cdeb0a8d2494b7e49bddea2acb4fda316820a124b377ccfb394f84fc0c8d2394cff5ee34895c40c308c5ca37155a21166abe046814a1e49b4ba68ca3961a13a1a432cec698949ce4763f84a289273d6b9e1c1a571242e15488f5249685b2ad83504acf12f42919e7fa648150fc96af0c0f91d6a9fea09c84346974f3951e1369f8a03032ef7f1879e1d57a2fca49f6e4392613720184170533f526943eb1b2e35d943eb7283f55b54968ad8b92f071cbaeddb4c84e4172518e7da7bd930a257a7820b828e82c911a3ac911173ab7287dffda7b769dfad580d8a2b49fe4786eebd7a22832f6b5da7c75ae9c1625f14e4a939598a409429c02c82c4a361a4a563e892cca5194f8d1416c4d6ee8c71965e0c0000970806005394200120b1b81c5e52bb0405c61236780b4e24058514c928c31893531bb6918005945594594f02d49d0b9a1ea4080a8a2543bd79b84c6e798da4c45f16dbf3e08d3a645f3b23a80a0a2fc6146eeb293e86ef2298add757209aaef2c54988098a2f4e9294b741237a88d960284146fc66e9d8e7819930eb61a981effe30c33cae081540c20a3287dcb982a4d9ee11301441465afd693a5d3a8e9fc630c1f63d0c0718891811f63f818e30439728c8c5c60642407ef022414c5eca2f9ed32096327068a529d205cb5f6f388bf403e61d596c95c87cc586e764800f144490c26ef767ab3e62004e944a204a1224d30cf9e1d27b294add7f2b4ccccdd31c9cf45e632794a3332d2eae3806ca2644a55c3674d7238fbcd4034512eb5e5c1f3f536b72099b0114c944be37b89b3a769d9b944697db3c924c49fef8716102096280661975ea6e6bff257a2bcd9ed5e65a11b834e8952c98979925d6e929c5d016412a53eff13c53dae739e8c64ed032323397c6c606464c7cb80c78f1c3eca0091443156775062eeb6942a8944392d848e573f248a9a3372631c39fd24659047944c98f8b4d44f234a47142f35a7c74d33f93ade886269d33b190d26f5783960b083118bb23c794777c9e21023039f46461651ccdb2126e2e7b4ac1b034d3f9d8228a2062089e81b8020e2106d6e6a7857cdbc766869c698fb3778eda6f6066288c286fc2c79653ca9d82058410e33400a51508218ab93e424a830134294d2449a9c1ddcc4756d102541af2adb55ab627f4194dfe3596aa8102410c59c54b8895ff3fd998100c24640fe50b64eeae69993eecc35881fca269fea06db5172c5ee43496c44b38492e9419ed2efe041062a02081f4aa2ccff5e061d5498f418c3880087181ec061b800d943315f491e675ef4c8ec9c32be0c3c0b034791517088c0033810440fe5d041097ff228e5a1fc5a26765f58f77eac030f040fa5b1fc8d65f2cdbfa3a500b94341dfd8899f5d4ebddc4a5180d8a16042e4fdc4924e8e71e404481d8a1a3a6a3f23654c80d0a1d8229470e22775d227614980cca178155aba3d938dc50f228792bc8a8e9a5a3b8a4ae3500eb2b3fe9c659edba681c44f80c0a1a049d4959835c3d36e206f286a0efd19b35f22b57443b974446cd29029b447350d01d28672bc7fc91beada4fb31c46051036943de6d0a73363bea7131c61e0c01146183018c3c7611e40d650feb89fa1ad3c897133628c8ce4b02f80a8a1189ebf63f8587792fe11240d38f220682827659b4d5e4b3d49579033143499fcfd9b4c5c0188196e0220654832ec184a5aecf404b5328818ca79e3c41883fe30614e63000943c13b76e9dd54b79922301493742d715de17a2af3855287799978e298109f42070388174a1f3344cfc433a979ce1f8074a1ec2a4afcceb973f7d21d8070a11c54643e9d43ba6fd26fa1a06a3d78d0259f9a446b00a285823afda5c9835ed86db2909451a9b126f83400c14231e4fdddcbdbc6caf60a8ad7f9097e42a9cc810288154a59b5253e8a5ff8a86c00528572cca9bfe386918b13e303840ae87ad3f0f3b51da7052e0032858238b9e4101f5fe2e62385e276cae86d5289093547a11cd77cc593cc9c37bd5028c652fe724a8bbdc9df13cac9dd2cf6bf244996cc6e419c50526aa726a72e31d7e69b502e25e891d512eccd345a204c385dbc4e4bf56577ef653bbfa4fb74f627409650907e692afa354aaad00b40948010004982b600040965d58a933e8ed4d314418e500ea693a0e41257193d78243dde8c3a1c62642031ef01c50631c201408a90030708111c0032840211428e200001e4070d00f1410e3116f0452f12f0052f14f0c52e18f0852e7230e08b5c38e00b5cf8b8858f1c0bf8c21607f8a2163910f0052d7c18e08b59981c08f84216607c118b310af0052c06f0c52b42be70858f1fe30701be68458e027cc10a348dad9b1e29429cb2075face2546123a950656e33dfdae452c74354ea0925fa4b4d8e50612313f8e2141726f9339824bb694d244a329dcc7b1a5248144375bd46dd58ef7f56186a3ca2a004655d6f52a74e5592c3d811e5f4569a54293d1ad6b30113e010630326f061be470f43c61930f81e232323233e6a34a21c5782e6e83cda92a6508311456f13bae3848c318bdcf0506311653d7526467343798d3c7cece081ccf61c042bc8c1811a8a286f2939e75b4bcd204a6a24a2a4d3d878c93ea304956b20a218c37d75c6cd8728dea60ed7f5498628c86425092b9df54e760d6a14a21c4a2eb3ad8a8713270d6a10a2e47ea27d732783286667c7cd294b4e25bc71a8218892d22a0b31b95d9bd33ba8118892e97025860d236428131f3c44a0e3c71828a801886287ac9069ae7af2771820810b6afc81fde07d289f5ecf31cde469d73c1fca26c87cf19522cc4cdd433998f429735cf17c21eaa1f0a674bb266945a36835f250ccf6a326d6e64ee1b97e440d3c944a6c8c25c487be29d51d8ac1ea2419440d3b94a48d6b522d7dbe1a7528d749c258fb955c42856ad0a1a464cff3672778f88b732898bc256b7f4af1a0ac7b430d3914d48498dcaa734fe750230ea513b3437eb816cf1ed3861a7028f65ea63db1c97ccb3794f3bac7b4ed2173da8e1b8ae2497633e9b693aad40835da50101de4e791694dea9bcbd850563d3d429efc8a89bc0c35d65054934f9a18948e93cff21a6ab09134640d34649f616b98a1475a50a30cc55ecbb862fd9ba39360a00619ca2a7252665f4b3aedf1438d3194d47acc71fa4475b70dc7a18618ca2dc2368ede769293278c8c428d309494db09269b5cc6384ac050b0dd4eed22cf45c4e90b45f7e4f977f7da84906b78a1a4a67783f998f2fa68186c35ba50fedae8c963663b0d750d2ea4569f2b16379bbbe26a126a6ca16c21342c35347cc5a486160a6392e8c99123348b4807db99617aa0200b05254a10bb1394997f0c0b2555659fb96736166a5ca1f8db2b27b69656287e3ab13174f60a35aa50509b93e86122b4843b51a12832087f99b551195d9e42b183fa24876f923ca6ca5228d6cc663edf9ca3424f2ad48842494c3b7f5ec26dfe1c37a106144ac2f7e328b91d347ff884e29ea0277dfa9c31a7724239c8aa13ac438869b2b51c51a30925498ff6ba5126c95b5a63206a30a124d2b4282b93e4da202fa1bc5a1b74fdcd69a8a18472ea1c947cd694cdd5484241ba8dec3f15c2cd5b33d44042b1ece40433d9a7d13b30d4384229fee4606292e6a43f2c2ed4304249c8d3b635624456361fa85184626c89e69eb649e888750935885092f73346093586505c1dcdb29d4dddfe7818060e1c222081083c9067851a42286d52fed72509f35bf21a41b0911a4028fd8fb64fd5e29b651c197110ac20870e6afca0183d73f2b0d3bf6bda913ca8e183a27ac6899b5786acda300721bd28b9e82bdfbebaad122fca575a6d257f7835f5ed2e8a27870c197a3ac95e6267e48f105d942ceb939e513acfde71d72324178535b14badd0e541d883105cd8c82d6cc4163672426a81b428879790234e12d64ec66751dc9ca6b388e76d11b60eb6de11228b8b4549ee4fbc5123b3599ce8602b03d920c72b2ccae59be395786250a5671884bca2b062829c92443b275fcd0f1fca8610579442279d13b7fb1f3eb215c50fd9df996bbae48acb18c390816e64a44e0d21ac282671cfea53a692b4a760b0638c7e43c82a4a3286b8694cc2a9a5881ba28a9218d3e8743a79c951e43ad872c3c0d13a425261231b820a1bc9531473c6e9d321caaf3b9ba628a7be536229f5c1ca746210528a828d50eae922a36c3b423032b2830729f2122ffae40cf93083478f0b98a121641405df5c99c449fa947c7a88280ab75a772efead196a48284aa29f4e23664a527212e3410828ca259ccfaaae8753e1270a9ee6e36c7484125af244c9e4e68e579ea306158674a2ecf9155e7b264e9434aa9be82562a2e74dc8260a4abaccf4648568a2b879591bbf67021f65b5ed5aa31d6374e0ccfe289ef773f67570c825f08c104b6004422a5192d632ae045172fd5e082574042110328994048744a27ca2425aeee6708db9104894c4cf31f3856c9a86f511850d2709a7fb3ba2a03aaef5549fbe37eb1f03232365e4f84f421ac18872127d654da99e86da8b289e5907d33b1f3e49f5785744f96284dca0d1f3797275b08524a218ce442dd3f77992b308421051120f16965b571b463e848d9020c410a5df68d2c6ad930eb6b4e37de407420ae1c69ebb5e95c559a6ce5967b87bc93f6d7308214a9ffa6a9ec24c7a10e568da733c69c9204410c5dca95d726a0e6662ad83332410a5ae3e4fd591d5fb5d07db186e80280967f2d595d887ee9ce1235310f2876288789cb417130a42fc50ce24448bffbcc9d01e042bc8c181903e14359ed26fb2873ca11d3e14ff84da6e699371cd71831e3fee04217b28089bd37b26644c9ede183c7ee8a198f4b8e993cb9470824a079b18217928aaf6ebb509f7729a640443f07077288fea524af21fd1bc25085690a305217628a69337629d7d2c942ea40e364287a20926085f938ddb9d84fc829039144b30c1cc04251aebbb1039143c49aaa619c75c4e34240e36120287924c276cce1a6ee957a283cd070c7a181dc8ec13216f28690ab9b577f3af902642dc5032d149bcdf4e3b6e65a0147c8520a40de54c3a8efeeb9d12d6df826005395810c2061c09594371d4b94637712177ec1035d8880b42d2506c4d25ed5d93dca4835010216828cda68e497c552813d4cc75083943b984685a9f1827ace4b910628672701f3bfd26b32849070c21652829697e661526a9ed11190a1f53a78d9ac4ed16992e848ca1207b43c7ec32e9bf642308114351c44bac50a5836af43c0c85ddf026a398f0f4716b29848021cf514ccf23198f902f9472d39d2e71a14f2a132f2421a40bc58c99e75233aa6eeaac21840b75bce6959d996eecad97a443fb8e691ab285626dd27b4a337a89b6c12146061219639c1185102d14af93d988f2bc26c89c902c14b33a8915711a4ed4c34251457eba65fece59b309845ca17c971babe470bba96d2b143453dce836d599a7ad4229b37b4b4ebba33554289690f1e8167b623b15328582127fe56475f965a79c7588148a416e92a4a613e3269e989191298444a1d4ed1ad36a3e39a1748a1242a050ee24272994e8ecaf69f200010e313c808347b2230b21a896e421f465cc1027144d3879ddc6f4e9f19b501eaffd1873a619e51d39bec7193e76bc5d0813ca1d1ebeb9717c7eff24c39c202511b284b2ebd8c9901f37fd30d801831d63dce0027b01f04488128a31fde99693e477cca424943a3cc977896e32570e004c22040965d1be1dab525df9922394b4ee7c92cc6398281aa15c66a73cf7478d9fb2cd444811cab1dd45093a99ba933e110abee7f9c4f8e4abad0ea1ac22ef3584b0d73c6388104a32dab68f693f0845df78eabfc454ff0e01a1f09973ce129f1f94a38bf25773bb1c2187f8a0705e4acaa0c4e6e0edf6a22497a44d8810a764eb9517255dfde415ffd75de52e0a2a637d88d0d6ce12d2d045719336f17383b4ce762e8a6ef265dc8b1f17a5fe92b6349ed0d1a2b680c62d0abb9e2cf3e64de2bbb745c94dc62dd40825a9abb528b75eca5a09233ad8c983062d8ade69e2ba6f69074f9a45e94b12456dbe133cc85d1625c95fe49f3aef4c9337a1118bc227fb70727ec3a2a46b7faacbc4687fe92b4ae2373a85f7861c65d270454950b9f557ea4266f4ad285d0865e2e7389f366c58515addf614cd7d1565915d373ac684911f564541dc08bb92eda6a2183ade356de824cfbaa8288f2af936d2d7539474a3092a5623273e698ab2a649b931fa87d0d995a2a89a63bfe69ff09c93a270b97174cdaa97502dfe578bf6d4f9246a87a2e6fc354f19aa7b947528c7dce613dbee94a43a3a9444ec2849bc358f4f4d640ec568824af52ab93531b705113914c45a776e896bd2fa491cca6fb73efa4ac7f8a78443b93b8aac2b2177a53b2c88bca17c3abc6745a9893019379494cc7b0dbb3a52cd6a432973e7f8759fee82081b8a39d459893613fff2a4834d063d4c19df632f20b286d2f6697bf77ff5c93105226a28dde7666cd98440240de551926594d9fc2077331a8a622133a92841d694b89d207286629599643537baf66dc340c40c05659b6e82ce11524d4e0e1e69712052863344c8903a9d4cee09d38f4186193c76dcd140640cc59c43aafa95ca92593114b7b3a8f04d5206934a1d6c39761874648884a124baeacbc87feeca6220028682f9597ad21cac73f0bf50b4ed8ebfe9b346a9c70b25af3d2d3adea60bc5d33e711e27733621e54251a37ffa934477d924b985728ccc5c9268d24231a36877e8f9f8798459289568e2c32e937d658785621e217ccccee23ac6ae80a76cbaeac9c7ccc69d4d27544627ed781abc1d1344ac50d88ff2fe9bc48c9aab94e302e006912a9484d31bdf83b891f7b40eb61c3f8a0ac51126a5cf49fa41f3ff0491291493d83c5aedbbe640440ac5ef3d49e6a6147d8dd9c1a3a9201285b26a9f9e46ebf2dc0007868c3da4c1390b44a05012539df212f3f7ab65224fb09124e2041b11694269abcf937aad4f27fec3066564e4870d7e2b21c28462a6dd0721dbd6672c1dac4364093622a2044c429abb1f5b331a5fa2e6fae4dda74a1d8208124ee4082541c92856e31e2fe7163142319ef0135d7343e46afe3180230c1c3e68308641010e313c80a30c1e3d30f0817f0c948152303222528492bcfbb0c1b2ce91813211222805448650d4f174c2e3b666fb464408051345e43509cbfaf40c224128a64972a75fcecd3910cb200284528e4efa66fda15fd383878741e407e5f09f4b7894d17c39d2c1765a10f141e1368a6f8e278992c42e0b367a51d0c13263ff2be66e1f840d5e14cfca37d36e34999a0ac2c62e4a3fa62cfbf3ed934917e52c3127bd1abae3ba988bd249dab5a3f74b924f7fb0818ba26cb8db598886b7ff1625193f6b9bec4199e7d1b1618b729ee09ea2c4526da6b5838d5a94e37dce11916992acab0e366851363177d45a834791f32cca29a2c2bd42ba987cf4226cc8a2ec513e0897b7bccea70eb6351c6264c0462cca517d376dbab310042bc8118049d88045d99376fb3a91a7a4f175b01906fa11365e513c91ed9993ea86b0e10a464ee334ecb453ecbd45828d5614cbc3e81cd521f2c1062b4ae2b53cdc86b72ecf6caca22c1a27e934cf1f640a75b07d0f33ce4eb01cb0a10a1b99848d5468c1062a8a26492a26697dc79cffb1c3c0404f0c1ba728ebff6f34498dac497e8e1fefe37bdc8dc086298ab1a6523c4568d4cc3923610fd828453909c2c273c957726a3b608314c5ecb941567396f6ca986d8ca2f0d957a3f44a6fedd4c1b6364451caa0d64af0df3ccf5b0e3e0d58c246287a931fd306286cc46c7ca2dcf94a778c736da44f0d363c51363993149b7db1aa493a5150ed305bf29a5d7c9e13e515a55cf74f69142f6da2a4a4c7bf3357132525932731c4dc73ac50268a9b6ec276503d933f0713e5343d9b4b94b6f4093aa629b144417ad2193ee2b239ec9528a9cc32a2f16da3af4e89f26faeb6d4171d25d49328a736b136cadcdce85a1265d52ca79f654598bf9128559b5d7bdadedce98544b1fb32e61b6f1f5116139d24fd277564544794bec6ccc42c72930963234a6febdfb779329a3c469464d7e8268f768b285da6fdad55e59ba029a2a0f77ade3bb99a983456d84844499cd39dbe73f2b826036c8629037bf0f861fc09361051ceab1d3e8d95bcec9343144dd294eb9125efbb648882cf265d2d69d33a438528fa66557991f334b12144c143e7532b257b105a0fa2e023d631ab9699921544794d89a1dc4d70eb60200a32a5e79fdbcbb9c68028795231c14b103dd3f20fe5ba53a631fc8cbb897e28a7e9ce1c1f9d4429f5a12027577d7ee872d1203e143329bf90d3e216fab387f25ed86eeea4537fdee8a1e0f7c9d7aedcf4f99e87b267750d4a7b5343c743419d9ca41715274ce7f00e05b1d9a489f3203629cf0e6513aad45b4ddf6dea5036196a7d37089d57a543419526a14ffce6508cd1cf1c32c9cba1acb92b9468f74c5e7d1c0aeb264cd06e3a1c8a396d7392e42c294fde50cc9f9b4a929a6b3dbb21bb53f9701dbdd59a7160a30d05bd7e53d1bef16d6d36143678c94c92d66b287f983ec15a94f99fb01aca26685ccfdf98e6e4d250da71db4fea4d1e25b66828c8add095dfac0e9fa128724fb83cb1c5838b6628e7989420ff25cb9468194ab76f32cbcc23434ab2ccbf99ae1b43d9e3e2e4f6147e629918caa245b669e9f85c72c250123c599d8e296a82baa060030cc556ddd8a7c6a3e8d27fa1a484d7c9cf1279a1d849e8ce5872ef42f9dcf36689ae41740e174ad66da7ce3aac68acb7507ccd242731c6ff9d490b458f0f1d5346d16aa366a1248c7a9ad8311327362c9444444edb97ae508ebe4950f2f4754e9f0ccc8f74820d2b946df449bb35cf2ddaa40ac5f1f41d37491b46649e0a0521cd4eefeb348572d0319d1e6d2485b22991490e27deaf9e270a25cfa233b24a1a0a6513e1a7458454cff97e42418466e8f5c850beb3138a313bc79770e24cb0b8090511f7a04ee8cf1ecc6542418651a1eb938e92bd2ea120fb65b5e44f2aa1dc2756f2a64fdd34ba249433e9f524c7341d1aaa26d8404241efb5fc46c65cb07184921c1bbecdbfbc63fe46287aa768cf5927fae25384a29ac91384dcd1da388950b63625858c5bf66c38849264e276fc7899f0a010ca63a29eaab4a9b4acee0a368250d4d3313695a5c9ef2740289d09e25adcc452d6f483821245062da2c794cb367c5092fdacf3a45b75484f2f4abaa46a9065fdb92be745492c498c9d24c1af4e4ea1506317a59149e9672b5994e8578f1f653b4280230c1c61e0f833c83027c011068e1b7c07708481a3c7ebf0613480230c1cd666983210ab50431785cd9c134d7269eb2b61cb45a94445c7be0d2a216ae0c22f2d2fb90dab79fd18398f224e12b2c32502bd1ab72866d6ced0213227f9638b721242e3e4e97113ddaf4551cb64370f1b1b940c2dcaa326ebc7d8a1599474f415d3a5a32c8ad6224afd767892833a16c524e8cdbdd10e624f1416c58ce51d84123a4efbe84f90881aaf28f508a1f14f73748d6f0d571493d2ebd7614c3a9dba569444132be4047533c13669ac288be892b956f3262d31642432782018ec1843063c789cc554d45845319b247ba9785df7dbd3043c7eecd880086aa842cbbbf30c733d0d1f19949cbbe820a4834d063c78e820238d71978ac287b4931d640e2d5aea605331d44045b9f6cb63bafd6b70c750e314e55efdb72aeda73d86200c1d3fc640810f32c8a8008e3070e00803471838c2c081430c0fe02859a6a6287a5a85950e7d1d2edf51a314c5efe82936a7eb8df8d42045b163de2bd1baab318a72da924da99b9b8ed075b0d510858d84a22467ab91d13cd9890928ca25f75bca98a0ea4cc9270a426f2a695a7f9beef744b94f1af9a2a299db369d28e949cabb3d644e1445abc8f560da443143ae7b90c163354c4d14553e44c97066faaa918992d68f7da33e8329258989d2e91de9a732c99fb37789925c8dd97e4ebceabd5c0d352c512a19dacbecd784b75789526be69449c88aa84953a230ea4a93def41efb348972c7e98ff9541f94cc21196a48a2acd162284972679242e89343691e8662f7fbea6672c1507adb5913131e4767beb0c9493ba707192336e585c299245d492d59c7feef42317d497295f8d2acd9b950909ae74437a92737745ba8fee6befa32260730b4906aa88a28b3d1d62c0be50c21f2f49e5493c40c0e6060210dbb26ae6ad55e435730e9e814ab4d7673b515f6d4ecfd5c158ab7399e24da874c429c6c1fc0a04241eed68f8d3299c23d77e19ed9b454e852288e52cf49ee1acff276141ab3b8aaa150d0d1527a43c6b5eee8e5018c27b01fb33465e9a99c706b90bd37a593e79c37212d4149f9e104e57b09c0604241eccb7cbefec718766756780063099dbd6ea78d7a6a688a9dbc57266c6fd63c7d66980f3c19e70c1e1728c19a19a68cb22580a184062309456f1b37a1e48e7aa524461ec0404249663fa94cad6ddbc9827184b29f2e2f19ab167692dd05308c50cc71b1a6b27a5ba2660b6014a19ca473d1e4c174c6f4a4010c2214cec73d47b6e7f0db8031044546b6beea2e3e5c75054308c5d4a0f4ce9ea713babd3780118462ac946dfd38b296c130c0004239e860527b4f95f6920fa3e37be43031c4e8810e8215e4f000183f28991c4ad6ec7c82961203860ff6462f8a1f2dd48eed5dc912bdc18b72fabb2d7992c99d94de8c3364c083870738113776515ed379ddf9254779755198f178d149666edd3d1777031705a1a4991c26fce45ce11e6edca2d427a7cfd374bf3e411c61e0c011461816871bb628f62929dae4106782b816252f619a476d9e16c5f8412cac3f6616a58c319fd5c9a298f384f997feb128bc691e533233a589b13360514e42c4f9993c773bf62b4a928749f29f18f6d7c3335c51d67b9113a5a7569474ab2aae73565447ac289fd8e3262e6eeddd5945c965e53a4c896a116ea8a2f46a1d64cf9ed926f95494c4cd98dc83dc1cf3125494defef7a43b594ad3e714c5dc26f371577487899aa270429aacd9643a1f4fbd8f1ca5289a183749592eaa3a465294b2b276646cce37361a453944469aae9289a298a4cde0ef516485ea84a274312e1ef4058a52c99fef278a321f64c9fc96278a27c91a93e9ac764ae63a51d08ce94b85daf2d8ec4b50831b9c289b2cca63d8885ed1990f1f8f500566f025f0beb189b26cd6158df10d4df86936e36c524a695107a7e24626f098976f37726cc644d1bdbc841d532548efe860dbf15c6e5ca298347d6434614b497aa2836d070f3278a01c9628999cf1bb938bfd91f5e8f11ac68d4ae8f999edadda6dbe3372c2e9dd2463c60d7ee490c1bf19ace306254a99a9aa6d5575fdef0d76980dc18d49944a79e93d2d9ee08624ca391efe4b38d1a039aa91286afa49aa1ddbe7e9844471b3693455db933f6c60b08307193d821b8f2807a55f42a8f5cd2547144e9b9df8e471c397f0ce04371a510e56929b32cf103f268c28c9f4aa69932462b1a3dc243f706311c570523dc9ab5dba5444718367760b6562cccc74b0253c3e470f1e8928685082beea1cb5b4d73ad86cf0e8811b8828d68b7ad29ed9bfc14407db218aba9da6435eae83cdcc8e03370c51782d29ede42aa5eea20e36edf13e7a1811dc036e14a2707292799aecebf4361c6264a0c70d421464e7644de2e14ace4a47d9a7bb1b83289e6872f424cd973ad7ac216e08a26c4266da34b969ddc33f7c60800438ee4620ee06200aa67c4baecbc9c6510c317e8880871867b8f187529db7fb492e1a2a4b12906064e431a0e3c7182820c3fc0502d08b1b7eb863d2204cb251ebe0b3333c0637fa9014b8c187bcb107bda18736665675acd96ee4a1746d92fc9b49cb6f14c50d3cdce0c61d8a49fe11c2bc7a939caf0eb61e3b4c1046da4018fd891b76a8ad64be5dddbd33e38b16e17f82080b0f8718190803718f70a30e25759b994e6c7f2c939a31860c7ca8958152d03d9efd061dca565a4c4cfb55d1ffcfa1ac1bea24c94d4ecb9f75b0e5b0dbc20d3914344f4eddebd3498a1a87f27fd29d318f0693a18f1d63e4d032500aaa70030e25a5e151e45b6d831b6f289e909b56561e206eb8a13c2f4a8e39a66e59a7ebf070a30d0565e204b9994992b6f508dc604339f9c94d17aa54ce94aca11c4e7b2cc1bf240db51acaa542ffba68133e8e69287addc97ece223f6c8f86a288f4cefadae19f249da1685a3a6496ed5f75cc5052259a7275a232144e3a0df731e990a1182edf6baa443fd79c3114b3ca6dccbd75c9f1fc2b72d5837c8f094349dee852199f3a28d980a1946e2a2ce4c9f1e49a2f14374e9246e8a094d4b77ba1a41eab3cd68d759ebd0b85b7ad1d3d33174ae2669f9d9449462f7d0b654f62cefda283ec2ed14251ff52554fe447932c947e354ec9b35e92d437164a1f74d08d13e22b949449733a838e15ca268378cef837317e5c85d249327e82d6ceed8da9504ea53da6fd204ccef914caddee9a32bb7589e64aa11c4efccfe68f61926aa350d6de9ce3f86f0e3b82c29bac73d693ba3ea1e4265a2b2b73cd6f7542c96458698cf92614f36434cf6937c61231a11843df6aef84e8e45942e983ecd6b49ae40f324a28e6cd1c7a638c784f27a1f869f23166f1f62f13092525b24e07d320c3c91fa120c4c3769878427d64842f3fc99a4ca45884c2c6249b12b521427944c9de20c3af78ea86508e9ec2b5642384b2cb261fb94f1f3c188492140fbb10fe19936540289b699fdb9c675228f941d94feb8941e894cf9a1b3e289de634f71b55ae7a2f0a9715caec847cc992173d447671c6bc99aadb6bba289ca97cd0da2aa52f0888e4a258a2889ac90dbf9d275c946436490c27fb7eb2ef7710b985e7fd1fafbccaa4d8169d7cf5f9a3313228837f1f63f410030a22b5287ffab0a6eab465d0921c3d78e4a881610e88d0a2d8372736094aca4c6d456651f8cccd589d9d3e8d89882cae4c11adcf70d5d7b43c55f9eddee03b108bf26bd06752896292a44a6051b2334926ffdcbfa23026f3a3e7ded41e4fae28c836f525eea8f0d8c156945df4daed7a44645c22ac28a79de7cc878bdf0e75b0f1c8c8480a708481e30338c2c0718230caf8e1e38c18a40afc63207dbd426415a537a1f9a304afefd3ad20a28af29624df564dce1c23174452510c6a4cc687501d2506192acaf975ab3249a12a4b1c0e22a7c8c44b1925081d630a2e4531d87cfe9fac4d718b90a214a673ee90fe3957f922a3f84ff79a38a91a51946386b1ae10a348284a426c27d1db9380a2a4cacd4f90a6a41277fe847aa25cda365c3d9aa83e4ba413853b219a49f0564b1f8970a22435a9eef0cd8a6c82add0d89773d935d9ad453451b83cd9a83e8b64a220dba56fba1bdbb911c144397709be214e2a728992a094688c101fe2fb648992a81b322698703ff7a944312813349b8cfadfe14389a2c82cd949145f4bf03913d38bfa52122535729dc2e4dce68f4451557454b54db268cc5590286b90b919b97ee24f228f284925eab39ed2dea24c441c51921a3d08193f09ae4147a4113822c288624af7b0d0ae1283d8e860fbb183478fa4cc872fa218ae3467569122ca2f427e66092264ec924c914414c4444f4a8dc58828b99e0993dd478f92c6431464124edc9c831ad126038388214a56e1227b57b20993538248218e1037881544499254dbf9c9c927561d88f26df61313336c8c17af26de1d4400514eed2433e656e5be3d07913fcc40c40fc5f2cecd9f3dad28fdb92044fa500c0d39d1d154e17eeb60f3c123d93186be8f1e83081f8a9f2778103a2625e88e75b0b59999999937af660bc00b227b682c74e7f5f351222344f45090d1992f36fe93d2267928e949f5f7a54e125395f050de9353eb759fa96dfc0e052b8df0a8a491a52269200c0543511484400ccd4d57e312000000101a9286629160442e9ba71f1480034f322852323a262820168c0543e140100a8601a170200c0885416160300ca33120e349d23e00228c76c8249179d3e8d151af86aedd7c93284d1910db33e856cbc88f11ec1fedf8298e176a0274e14a2292a19de232b6cb2cb04a3c8f02b3c04ebc610708f006c59d95e1d23d183228fc06020c20ce1c17c2b7488feaec6e74715fe4da7c6d55d5fa010705a8d213a3780b0ef474ed18988c003ab4b7bda43d3d07bc72c350c0ba4ca50f0abfceec1fa8a85f34b0ca5c871fe0a0d2b7296c46a522998b6cf52ed8077380a8ed248c679fa9590ec6aede8b5b3fa5899948e4903ccfc51fe5cf4e5aac78173fe09169bc865c3a69db3f8fe089db3e0fa65629cd728947ce369185c6908c81819231e71729c7bd94d0cdf1e43bd29c66e505eb0d0a92388e31e8339380533f3599545c2961a9b64874d6f30a2b7aa568a4737d01f121b414e971cfc6cf1c6475301c842559d07665d946d4167b8a8713aad0c1c05838b45ac0618cca32a2c66621fb5e38b0c0562e31fb5d4ee734ffb0a4b33d6281258e2766a158c7ed10ed1bad38975fa2b32b931be07ea9fb6410e85041c15d31d9486a715d36782fa8a697cbe8819444f62fd7b1069a80a59a2d76e40f01581e5a530cf4f2115697bc9aa6a1ab1416f4940e0049b20318d12b4d004374ffac918a9d9727802c026cfc31a21cb9f069e860eee5c5b91754a531f6d0723b26022f74713b7a55297923b7cd1646925b942776cba797e3921494c918bec292c25cfbf431290d908e4ce43f35c0d01c41893ddc529d23376d802d8871d61114d8f697568edcc05b06e1684680ae9f678e3091226351463280a44adf0b750deb1f36e96b1d28c3f6a16265d51b20408860b7bc807f0a1328a9adf4b8857632b640b805b087b541e09b7afaf91ada6dc4e5f901725c6839ca4781c0a44351b2455efa1413f15e70973b330b87b2b3ae1d097e4cf23d83363cc807e9650e6ebec3fd368a60fbf608b12484ec48952336c250640a8c430d7ef8de18c4e10671b5b616d423c16fcb6900124162bd2a98db031e469ab48a94539187e9fd4b2c64f4dc170539bf39ed09a85416b0163402c8fe4f6d5a458f4d70e5bcb9e686a55033d1ca16d0f0b538e6bdb9be5c624403012a7ceb3867a0071861cc4dbb54028e71d9cd5f68d63eb5f26b756007e525b1353e77d150067aee78e936854f693ec86e49d8d6a9d03838dd7e3a952397ffa6eed98588a16086d73f32e926486fcb8be62a5af04017906b3090ffa95ec4ab9cd02170403b16f5b6dff831683e15b24cc0ed1cea962b73ff83255d8999d772fe2124970dd180388cbe0c211a53e8fd53d13248f6030a7652ec43d547c07b66cf69960fc94633562272e4d62d10fcae1c9eda3b323cfcf1d5a6e8ec98111d6ab2194bac58927bb3300b844614601dacf6cc45f2403416113fa0ae969bb040eecbb6c383c36176467f881f786ab56c785a87f5ee02c8717e4c1791d4bfcf81d594d6d73544d107ae4288a86203ecb1d9c3bce42f35788caf0b2f2740b5a688c7fc90bbfa640c8941a59722d9528721548100c9b5cffcf58034c0e9e8e0f1cf5388158f196308eb8b2a274221739564af0086a6502480143677c237ad907f2a2f40dab89b64ded71288abafd5ce799553575e1ee3b895eb8315acd1c66c7b59f33f1f6c4c0054e0812f742e0438e591526a91747bf95fbeea00fcc19d0ca84a254568202a3c920a62a3811c9d72948ab0ed5fb2ee8916a6c53fb3ed3944fa56723d222519bbd6804a49661432c01fdc0f9eefb9f8adf73a72474623e4dbd8f9328398b00d69167f99ca6baccc673a8843c0ff24c817a7a7c1c35d8583a9184b22283dc710c4c169c77f4af0ff4f5aec3e9d8bb422afc0fd15a03b420fc77bf08b542322b9ef7ace3ed76d358cd1fa540c5aad132b57d8a0c119f70f0ee48d8bd9c9d27306a9e27dc9582b5207d57683c7c680e523f0b233979833ccad0244c2481a96b9ab84d66aa6b861d595f264d7d6505db972463d7c5b4386beaf5ec6f2dab84fb427dbbede4578fd4a8e6844f5333390d117f3ae7bedf70d1007277870bc25e829868002e44b32dfa6f72cf09b26622fce916cbdb9e2c6e8283f340fb85ac7312a00c982886e610603db14d0ba7b9bf53ae54ef491862990d0ba3be6dafa2a91a6ba69e96839fe99bf299531bf3536056063e10598e324fcadacb661c0b30686810956dbe29829692433307fa44e4adfea09d7ba7918997330ae60572c6891adccd081ce60145830486a05b8bc91fdcb115e6252aa9be5f4b15c3a53ea26c8f14c204bf6a268341033d2e4015f4537b8404d3a075aec77cede11a177e8dafad89756c9acad335f0528018976b33a373af6f9bea08641cca8815ca623dce59bb783c9f890207a150ca3f83128ef85133832124ddfb75fd8f3bc983b76b2944f307d4b9d7c64b729c91ec6efd2f25529b9125f43cd590ec4020b9aebcaed67d419396aea99647645f7b802c38fb182108413631225bebe5d2ec356a5454b826f2254849a6fcce8e10d28812fb2585b2258563332fa920c4a58afa3680418e44690f0e8af01238d8a4d23bdfa0a9884d7ab34fc321e3f58fa73634640899d22dab82754b3aa65bd3a3b535d52683754a4ef9b54364a63a9d203c02eae178873043f508e7681960e5845a29271ef981b51e20ae714d04ba4d3375863c1721f34b2f3bcc8bf95682f57d9621760f192aca2e00562032015c424b61acc944a0ac04d43037cfd64b62f0eabcfc7127d14b6d904a8413224f227298cf50e743d60f488388e6c7c6218d26a0919bbd5d9e2ca58e683741d1a79eab593b8876d7da4fb3ee56c6eecf9a68181e6b97b480240c7d9d2db0d62d3fb53bc1b1b4935cd584760849d5b21957b91e06d1b8a11ec858c57c0649096ae19bd9ec3a40e1d1eb0a2d9b70f401f8396a852392871ccb62381ed5be5c9c10d2d2e2c002870496e8b48130d954084c60b0bdc36ba53c824cec31f591661abd6689301f2f83d6d239cd9cf385f1cb0db629a8542e3c5903995c20893d0e616dfe562d4ecb81c3d5dc80880ed3666d1561c71642518dd30df1933ba5e98325d90b30b574dc0fbfe86dd43b170a5c1b4ab9845f51371582fedad0769920098180dde3e8822be76598e9b333806b165832631c44ebc97ee5bb682e7ce7d00c2f5dccf4274b395849b3ee13fa3fef581a51b3db186abc20257b4c392f72087893ea9c49f45e45d24e50b5b676e18d30c7903dc21ba77b3898cd8d19ed500eb01ba89af02a89262769e15c0debd9c67ca4b494a339b16e3e3f67d3fcb63bcecf0722d7ad0aed1dd88a4d482c196816181bd71ae73b0317218becaa74bc1c27507f285a8169bfd007f9c58a694c632fd5ad74f8db15ec7eafaf8b3120f971aeb3b819d94d2c3a13b75e8961b3d95a03d5948fab3bb8e574bf50f4aec3ae660b28c56ed57e52053b81305f54e79d5b06de4c2b66148129a466762dad4cf687cf494ed71b688a5f0740cc0ddc8f126b20c94744007fa7bdc924a36722ef27aad321166b4940289c4ec8b3d0a58c4f445a185342ab231050a17692e24c9b1baad42cc2509df2d1192e328c187ee534e08485704536b999deb4e48d38a661d4f0253abc1778f54d9e7b1510201176bf1a7ceae21cd7364c4e0e3a9a8ff8f6397c1e3846a2f70fb049f84f1ce65056539066bc4ea65e0203f4b96b1ee43c18c27607869d74b6d0aae3805fb4b1bbc1be0c0081c80304c585a9d1de6e241ba794e54da657231f5e6ce9677ed27c4fab778f427c0e8f4f5fc553ccc85f1e42e12f157885990af1d78e528659930ab9711eee250ca8d0b3e8a7568ebe07d6c6f3e3e4773b97bd1b10fdfe803de361f9f7118de8a0340d2d707d0e7e326f7723e92dfc538408d0e343a03bb555cdbd6d4b55a33743a3eda3137986769f85ab751e92459e65e2d40628ac2e5375abc95ff2857c63843b506df6f78b44aed8d84f624a0cdc356ca1d20a6f559e8d0ae0b2d7ba6d27f603b4ab421abf9576f4727e9e07218a91606ca4aeda1bb4f7002ae85aec821d65606d1c96376eb294211603c3296024f37d4811015a650ba8101024a25b32d1636ea2273a445ad353b4f1cd2bd9dbc9d6e5e69639f27c62f424dad5004934558460a2dd9a76e7d4986f2a2d691b51dfac543a107aaa41856084d26fa4dde2f3470dd43d15961e967e90a45fb97efd41dc2bb37f62e443aaca95ae6be761fb37d7b60e806404106bfff213e94260b04f53a4e8e60b80ca998103f1f65823cff0eb90f13dcd8d6f7cea128420014ad2fc9728034e57c92510a300829c1db88e0c2d6ff1552120f3fcd864b86f2a6fa74a21b34ee943b910aebf3ae926dd31570672d424d82a10d48e02df740f0796ebfb6216df50af98cde4e5ca699a5d0e15f36492dd1d6e7cf914a982b4b4ff3149ca33cb528e3e52fa2590716925c1d24fa9347023d029980548598bceea15050467c8f8d76d89d8c5cb6c14cb1840ab9dde7224bbdeb9a887b1ae8973ce9e0762aebb02f3fb4d7c1b96d64baa60b472187885ef937928090c3785151f286355cd2bfe23c0ebde9d8db9beb0cdd24c64f0ab80c5b801d8dbdc932f46c01aa4a604526c171e031f5f8dd2d06b38721f90c4c40403506dcd57284e81d7b0f9fb5e4d5f11bafae27813e12249cf09f44c8f9c279334d18e84d47f9e4abf4ad010be39e24e82642692d4f586c2590ab49ca74e67f01f9ebde71f0f0a335b99b505c6a0d95828f8ede804617b1b3c838988a76d2624c924af166fc70ed74af3269c4732eca35a9638cb80e10379470cbe019cae52e18143b81d2e28d184de6655eca1403af909bd65b18a6d743aa2b83a063fff56f215b8f83ed286cf49c8af3f26a88d4e82efd208c831d1a15cd4f5e0e9b2378dcd7c79b12a9ef8f4f5a193f6c4153290b7c6e3d9533d723d0eb911e66f621232c817fe1d173758c0983535ebfa12af56872f347a278546b05eb936766f5935190048003cd18e3f6ec82cae3248fef43aca9084c6e1b3eb76f27f64978e9edc42d8ef3a2c6a01406e9afd27b678c18384b4ec2d1ae094fe0327b1b9ff69553113bae89121b908fba52708b67493f664a9a1172e357eb55ddb538039554a5b990913373b72d3b60ff4895822c5713ffccc82b347c9a25e8bbda8a936ff85f623a9700eb4fd5eee07edbace814adbec757bb4fc41d0d29db326af5a6e25e5421c2dfb4a83a0cdda2300d0152a6343e2d9753eae43ee8d84db5cff3b3aeb6493c054b19045ad206204879b5a4700583bae758479712eacc32696266bbeed4bc9651e57177a1d6cd993d246f9f66f8476aa137dde9ba4d975db19bad84d5d6cff3a6a6cb36eed6a99f03d0cc4162e3bc1b2a67137b1e5da2e9aaa96b9eae4bba04d32dc5e92ea724282b78d5c5abae245d4058f73c297ec8525897a4ab5b9f5a23a128cd6083bf410d111e59116116ef66ed09159977fb20e5b6ba836812b22acd83647d23470c783afd45ffef50cba5b50aa150757fa79327a646a7c5ff73199c16bb380b9025b08a40e1055474c0000a5c4c409840d5cc9e81eb8cb83f0044fc2d021605c413604b80ec0e5422589040750b28ec032bb02043132ef0c20235845fb8252754400b9820045e24fe302c7701a47090215404162303feb4459de53658802a16e820cd59ef401678d3011e086458806f06901808e40b32a4781348080f1443d42319060482a381ec11642813ae8aa9f127ffe2fc0975dcfdbff708228a2ffc771d80e2fe72000cf7397aff854494dbe21e70f9ec636cdf5568f2d009dec24275e7c4e1539e2c5443065ef1f675576e1b7394f91379e9f12df1a2ce5b6f3e4582ee0346c0630c6fa188bc90675f6dbfc555dc82be5f9efde95b9af50f823688e542543342824b80502358b77d5f501a7622197cdec09d06de193c989d81e69f16bf0c3d9291899f02abded38aa77b9d68fae9f270b1863aff7588b1d5d72eb917e1ece522123afa43f5c0e188f3e75a901d86a9dabb641e8cc481eee84893fe071b1fe7f2daa8524f3a33910e464126d9a0cc0dfc19b428e73057b2c1ca5c81cc408d9f36b2c7de065e36031479b3b2508a0ddd57675c3b289fb6665b6395531bf34ad724a9645426087136684364c6f1e0db568c4f23a35bef75522d0822ccb2aed1506780f94a8dc06e72bbcc5539a1561810748e678714bbab265da8a76618ff2ceb6a13aa5ce5bb81cac78794bd82470b21c1a87a078c1a38546187bdc30021ea7a390b001d3b00291ce068372a8ee0b0d844b54e421558669966fcd0ea105ccf324042168794fac7f5bdaf37f910bc8a9b2c4b0ec8546c885f9afc1ccba6d7eb927104a078ec2d1ea612093698229906accbffb34ab4058427ef1928a714805182539e1b00a20e43851594bdd583240fecd30392f0abf959fa2c082b459b3a84af06e0f2ca3d3f740ae9657204a2a6b54cafd71eb7c8da099824b2e83a1a95c9138f93421d1f2cc23c18165c8025a9b338dd675baca95729f3f1d0afea9ef6dc85719e5dfe30ae9096a3007f1b3b794a762f7b69e0018ff370555de9a3003bac720fb0e656a2f46c886733c38dd63a808577570c33773a0a23b68766026ec49639d5dacd052f70255e2c2d5f5a64ccca1d8558d548104ba2f2f45781389844d5a07052eae78efa36221b527dc6e6292593017594997a4d35d4f54badc0d61c9d1f96c5058865346a6f34d6af8b12a53b8c4ddaa9f47460174a1554ad55c06cec0bf0fbb02bd7d6f6072984a5e38b9f4e86ea83dd69b37277a9099a482f3cd59bcc12a3520f486f362cd5d7e3aac4b196c17cc16ea94dba8ce8dc3ed869520c2f24ae9fa102e978d9742ab140897c6442ee7874c76657a1ec82bbf5341163e28bb3db43db635343934641a772d9e3e7e371190241bc3a27f000775441bd8780d9b469dd01a8440c8ded8414680cd487cba680e68bfced81778e7fd0b8d6c50559d18de51711eb9428103bf9aa9864976b311892f1310acc1faabf03d549c63641108d29e6e3f25db3e12e5c9c40fe0aecc546dc5d7afec87fbb181d82088d6f108dd19cbf5d4a8b5d1689510543076e2eec85bfe29a9e7ac1bbf04b17cc6a26949a983622c393b19a791433d0959d65c774651588b4098eecc5c82f560723bb536a29cbbd9c34b4c185c1c5643001efcd9c3ce0e67b98a49d20119aadbc4fc9ccbee30e94b59d53104757e7a0bb0ae36f98ca125831d2a4a8ffa6d7b1f5ebe1369fa5172f090fdebe0db00c37237a3d70e52c1f82fc59aa1a35c0b6063c46fb2ca80219148f793a8901f900bf3eaf4002c4f4e66ffa252abd1f70542975520641d1caef70e2cf0e106b63038030daeeb6651c231f6b43c65bb4ba57ca2ca7ad4d2b3bacaaee66d6d88aba3c649882c58df16353fde991918a21882d36d4743b277a9c1955243ddba242a5309e6c76f04070b82eb82c1e4723283228e4a3dcece5c00832d2cde9c99f9db7640f4cc83d80e5cd6dd7a261893746cfacf0b4e08cf3bf29c009205665e8a68568339a9da5d8796672254219c59a4fc7bb543d7f3b52b3ce7d518522c342f6d52addb19c2dcd9214b2726cf48683cf743e34501835d471873f2b17971c6804bb87683cfa73072ebde3ee21e53dacd57c63b6cd9ee076c866b79e2637ad08ca76b4069f36c193bc82b104c69fd0b5477d344b95600590c60f30b75b40b0eac8d174d7f44a45902d8e43320783b8a854fbdac1a12eb0fb3c521d0dfddd00b311288c57aec56f2a9c602f9be0e23d7f82777654f08c108cd7376f425ea599bf729ab771061f774496b49a7918aad7ca0a05d6ebe716f6108ac80d133f4da498fecd1d54931c01834e261dce419f6463b046a5931c8a4d582966aa0025ed38bf8543f6a6b558812618318f7610d7963a961531b959af0cdcccfe7b5e6021c854d09a85f0465672ce60d7c9507a3a5b763020deafb7e5b885d9959a2640af6b33a088b91a59581ed091d94a150fe6b7ad95cea117af9a85dc2b38741951ad43a82389ac55308c1a76c832b7b9daffd78e704e8a99838eadb2d366f3156c8cefed5b748b3042673c700aeb490ab7195ee38d63067d804292462527d79d8334ee7b6b228705572c99deca802fc4d3459868aa7b08715bf36c95bf812004725badb26088b94d03dbd727b2c5471abb2a92e49814b62016f2a1ec1a89853450008ef5ba24aa9310fa81948e709848e2ceee4f6994724190a4231e5bd3c39271327471eb91643536421993028e096d91f19757059047637a676260a5c552eb3383d21e2e2e79c05812a3fa9a173841ecb197fda6584bc02a88429380b67a5df30d62a7d6ecbe7b66a169dd099a04a20d88780868c3cb33d8626c9c787880cb700424e94d94707c8ec91b1c0f01bcb86d0360db61890323728af157770b29421dca25396c8443985c51decd997b1a8af3a69e7f404d41ca5384b24e5dbaf10e4cde6611e7356da0ea947271bb5689327455a226a38c5a0c6a170622857c2e11364dbe5af80b2224f7f4dec9a7ded7be8c570d94c096ee6624356698e727c622f76dd90cd5b676376d23f27cb168ea94b0f2ea82b6bd80401c0dcca951719f4868bd870e179f893fa0ba4eff57d8e68306270409e7edcaf03430eca527f7fd639410bca3586907cd0b3c8598241a770c9097be358ddecad02d15857063b691963ba90b1f4170a4ee5486183e936185e4c83307ade66727a101dfc9821a4d084d712d1346e0df14937f800115277e342e76a286fbe80081dff1b319a5e8ee84425262a513f2bbee139c5c56695b65cf6b41506d630b820b20f8af61d00f59a818026d22d9219d22408b38169a10d7aecb003d8f94b12069905325d7b293cc27d588feabc6e381a149bd39c41a08a2d198ea09b2162b599c7a5d0575215dc6c8c16d70487e193b262b38676adc8a47e12e2fc687c5661db5077a7aaf8057816e53c6881b402d473219483c9adac60e53f89c7fa92ef38c9ad65494a882391393601126f8b3ef617d65c835a638315e57a9ebe3eda774f1bdefe343ae8ed0b7adc944b505e8db2b772b43e2bb8865bde3bb35139410b9deb2a524437c492f36ed56cdad27971c354b826c711f9f29879febf6e44522379d9ff048fe0ae741d55aea1fe589f1b73601789838269d49c24ccccc04306ad8a9eae34ae37ddd7ab2f2e6394b50906ae932349590796a6d5b199ed37bc1d49e567d5b5e1c8aa21527032c3adcbd964381892f1b27ace9047df1eb751a2aa1e5f148a7cbbaff40ec858d3c40ec3d0cc77dda1480e696566de29359a2b169c1f45a7b8e36fcd7781f9d1b1d43dc3de5ded1729beace797e7e094299e802c24e67e44d196c48252a9883c1f06c61484b7a2c7ca369ec8711556fcc316f233f0d58a5f60ec1ae26216d64c240f11db6c139ce9da84dd18b226e310f1c17a9cd0dd20cd2b6e86e3ac92a57e3f02aa30f49b3ed21c33ac711662b253396ee86a1752aaf9d918d78224d81efe2d465ad2e24b68d3a90af3a158b34ce56019c7da270f67830ddc1f2e19d43604c6276e1a0c1ed8bef620f1e594d2c17e7eab2380340a4b7e753b8a8e44349d9dc8d32cf248445710e4bf0160d37c872c909de42eaace91b6bfd079e26fd122ca5a4fa57509b9082e336173bac03baf408a2d184b24c31daade6b168ea0a9bf1562349dcecce28dafe657c6d07e5cf96a56bc62107652012cc43510364c374ec8c98dd24fd633854288154d8f5a00063a474d87e017c15d4c63f85fc8453c0e4593ce4880afeb1d4875a5502c0f1ef2b1f9fa3a0cc246e07a68899d145e4479e1c60bdb47d0e554a715bf5c6e41200e6a969908509fce3b5738366246a32ebe6300d25c8ba62d9da41f918b5382ac12318404bbf627db4b64580fb13efaad534f343a60d9dd060ddec37c7a6917ada328261a451a365906ccb59d9c5a48da35b50a2670485d368ab0b7405fdc16c2a903ae3ca2118c7daa40dc8b93b72487765aace088edefca15fa60b65710f153dec33565a06fe27ffd8649b263bb1162e2a4e907f2dde08f9ced26d5455dfcd92a729ca371bedf1cfe8d509fd0a9acac53a6d4ac537376a112bb22a1eaaf179835c98a7ce9d1907cc9f10f79ef8c64c00a604031e65b186c349bfa0d9b3e51aaed391f6438c2c6d0affc138b6c702fb4499d4ef06bcf80aae87ab7dff064314ccb81b24c6871c1ba77a289fab9bd9ffdfea9fd8d22d3d98121345f0faffb5e309792bd3c61899b9bb81b2f8c822e3792df1d9517eb6720aa6151cb79454a62be021277a17a89c6780297f4f817cc95475086f8a4fbb3c4f4536b507e636792690357a73696596b074eded70b8b9840adc287baeb4895c58a46dc585d3888b03990ea454c6a0c3688555294751259026c188a32382213fb592f66e49ac3df08ed0406325a3a4145355ad4ac0d16c1cd943a4321ebb090f95de42769c18f525b3824fb957b37c8f10cb2ee3463941c91594155cd98aca7d0621531767053cbe58700f906dc7685c425094ea5afb73bae669ea41a0a47211e539c4e21518140b829c9e8ed83c881ccc9f312b9c57640471a205acd72d0c319fd939d4b0806e828521ff16f3259c5b207d746190124b06a4ba16bcbd85dee805bd01c34837a8c0375790b733d745b88760a0a73b5aa6992bba059aee58c81b1463ab05310924882e5a778dc45e689abcc220331c90c16bb0abf787b92cd8527b042070f8a0609524c841d703fcb530457e87d89207b71b40106edf9a58ff1b301da633643ee1ec9d930e4bcc1318def732bfe98da44b7dc0f69a3877fe0799f54c6ae446361a5fbe777a6456f7c4109850d5a764c1299ea20a6ea9c22a785566840221e1e08529b3e136c9fd97ced8d97543552ba58b3b41d4a7a0aed25c38babff8e6fa867e9daa22138471119ccfda725cd474289298201830a92cac66909bab501727a65ee531a7c58dbcb630d4c6a2ae93700f67a0c9f04069a44855832654493e776730dbe43a0df44ad6dbcd25ee222289997026ab5ecf758e5859ee49bccf899d5cc716d6375a474c18cfc3bc1cc9462f10c60df1c416b0dd6f8cdcc0c5ce341956c30633886d62ab09b525a229f9b7445eff6039fa964732ac5003cc7a0d5651964c0080dab23d16b81a69dae1ca513c6f30db34f8341aa831d1c3dd336273d35252fd92e4bc693134c743598e6e6a9156970962c87e7cbef42acd7c4ae7da1e26d15bbaad90b63b83212392fc2f1de6a0b5b2f5626293114c6e5cde6c8dad5e1b3db4428b82949643c279371fe821aa91732835d6e9865765c330bfaf5d7a9fc647df45530666a8a2bbb20b6cf0efdb2453a4c70c435d44c91398cf0a354c566d7212c888c2744a29c39d914ba3b79c6e9ef16498a5f24e7e0c7ada0e35f3285ed3fdc1ca4800fa25eb1eca383680e976ca0b754d7758a296534dd751f3a00af31cc49fa9fa90d7b5db95a654002e058021b0ae4d7fdc95c49045512c668bbf5266f93eeb3b8c492a458a260c40f6bbd83d691d3b9c3027f87ff86e5a8aaf805c45caee934026c3268873a33bb8a616807c86158abc7c79c1ec4b1c85070bf25df278798fab4a96868a779aa77ade2136903903a48ffe3ee2c3c704b29d75d22e5466cfc247d3387b45cf00f591c7a5859e562e60f6c1fa0b783161cc70a6287cb76b54ae876860500880b8b69b80331e03ddc245a0299d509255e3303257ef03172fceb58e76045fb99543f51968d5fe68075b8e28797450b13ee349d60fc8d185a1ee06066f894615a18548e77553d52a01641c61ce5c403256bd4db50da89e3f7e86be848781dc30473863836dd30b83e65d6c8908781a81c0aceb7b9eee0483b4e21a41942b440a101e329b43c114a4e516118f41dde05d9f3000cf6bf6e12967a6ae20d08046d3cd2f15e03f63581476548f962624cd058e7a9f49ea4bab712b184174f8dd0667176578f6d1827d3102ec851b6aa21370ddd8b4db5f64ebcbbf1e360b4e55a861530847f619fff36b2363223a2c020c0597d522cd106ab129c84ec0b08eb80e364721a6c781fcae82e52e008b9bc6abe25379d4f3d3863933868e758d929610521f9d0448c8d984244fc568112b85088a13b73c1001834287cfac8201f517f2322a5b111e0681d392ae6605fbb7cb6e6028a8b741119e77d0876ae987348169fd627ffb5ab3244af55b5390e4350ca0c74e5622487c666db1986f183fcb7ae15c324ec1885fe3b41036cea1c11fa7d92ef519c437df53c8c74d2f9ddd5923880332a6c307f1a30bf835bed38f990c1281a3bcaa39c11cd59681aeb66a72e5effb506909a5c0806e5598269112e61b19fcbe1be65bcf4048b53de66c75fa5e1a90943549253c61b8bbacd26c9c93bb6d076ceaa7b28c91e3d69b49460a29cd8b2631c609ac0c105f17b8d0114d69ab603d841f4b20e7cf9c479740111759594b117ddb4a5a699cbabb4716381226820cd8a013a3ace4ecb9bb091d7dfca96ef47079632645f51d8be76c1b0ba2c71eee75a99b618786e7b561ca9452a911fa567e69c99f4625eb2f1b2d2980ab53644d148a4cbd56179191295c5390f276e6952bc9cd9f687347284b13068a305891fe663816128a2f14d4e794b9880231442a5df941b1dd4790a86733e46a1e381d30183227c183db94b313ea86ba79795a50767271c2315d4f1d337c684ae2d7824a5c89d86b2854d4228c539e168f10f2060102c400661bca0d0939f2ae10aac2c1c072add4defe401ec0530fdc2f0183b0c62a62e93e20b5cd2539323c9f628febc6b022c8ea40d212024627d0636b2cf7eca051641a5810e1dad1318bbb7f0fec1397d4bd76ad97141638f196e5c050b963c4253404a8be7fdc9d652b9b18b5b936194aaa1eea458b4e8d5689ad47ed4e8408a1d86982d8d639090d628660705a9b49f2662652a3a08127a2ea302503f6e0c52abb01f6b24f7a836d24c4ff9851e586a48909a2ee6572024af73212bb6090837fe00d81f25506c82f0330c910b6a051ae59d1defc76a314829053dc2af64b5b891e681ab497f67656f100fbe8377175696de8af5980373e358d36d94ac13e540e68036de688601f98b64eff65c4f16eac9cecba25a04333e21b73b270cd8e59b4fcc2c1633d4ebff02b199f7b8bc00ce8469e88311b3931687901e8b03b60e14e63a1c15dc389f434b9204160fd8bce05793aa6917cf267616556ba8b9ba66c23f08cc0bb30ab1ed44bb91793fb9b57fb4a2b811d3920bdb956a636a2617a268994b2c048c0e9fd34b721f4c18d7b8ff3fc9cf34516dfde2a0339362c1266601b52c13e38886a3f86a61a9e4a4558ac0319f40755b601032502c50e076118146be04467b5ca185159ddf48b405c114b7b0d58d1ad45c9a539ed0744bcbd39d633c2b99dc10875b9a388e128776bfe059b792fe38ca227b39167a54ec9d72cc4fd88668cb7acd31838948c12e007cb6285801734171306c0687d811926454a33e914bb5670d446a21d66aba51cd745dd8844565f424327deef249a3d59226572101aae25728a33b01e9a89adae3c8d65594c69ade7f518ed6e1335a70542cf7e82690d9054936453d64b486c54941a1a7f8dff9c12ed1881ce5323eec0effc4b40a5c405dc2b1420bbee9c2a303b8396bf534bb8bd5daae0feb75695156ad63069205a035b3259c47e2229f6d152ef657b2443b2cc1c4be0b10b188e0491000c09d925624e539111827e512741c642a49955acb777157ba1e3c99c42c8c7832ac5cff28079bf065a407af3caebce736848c3ddf28ba8ead0c3cebcc1eaae082cd06195e58774156e27f2a55e946398b34d7e627617f469e0b1237dd8d5f950aca442529487183cab47df218050c3fd23fb8d4e1da9ec934f81a26284081b8c5c709dbd18ef3ce9516c99d8862029a42b8028af92337b3580e951239902ce9e061ec9ec8b64961cbb67f18d44d572c1a72845080d3445fa08e4c694b7ba89507ff4de846f9b35ce6db4a3197c89c5dabff30e2c2ca442d01a751b759da8f69539b0b392a0e43f48d335fe3da060f0470a67c85652e49c2c5d0a2aea3ae567b7a5eaca8a8b31748935ca39a509b08d0e179e6edf37af4f7bbd5d97730b3aec53bfdd28dd70af8b4a233e2028d97814c7a5db8d18994eb4bd1d52788b7b20295efef702894aa6c1f4d65acaf35cdf09d7d10f9f37123795daf1c93b301defd194bee2af7875e3f9f2ce9a70075f6e68124c837bcbba6d841dd77118345b580dd81534bedd0d592b5421ef6e685dc06e45139e6945086caf27a1b65d230a3e2d55683abf6d29f25a2229ec2ff7f8f91b731fa5cd154628617b44a09c6d24afe992a5185d808ec2cfbc99d704a181ca2b03471042ee0701c204a48ee1f0645607838f5a297c4b305d070440888606de8d6e0adb278a0cfd5ff36101ee03f7933cc5840547448c44021e16445c0a3660f0547230333333333333333333e333aab9e197f0d75e22e59566fabec02a33333333895fa40df845daf0d66fad9b1bbc8377885502410a6e0aa40a5ce5268b5cd1200239aefe78b32ee5e4a132049257b050e3395ef9e5e8620c638eba2ad01002398c2b97de1e5f74d182d2858d21461917e8e2040d50028d2090dc3e6c750e0fb3010d2010b357bb3777c790bdd780c60fc8f9d3a5a5549b03f38e0c6c518108d0f0c11980460f8829e718329977588987060ff2283b3ed5be7f0c347640ba1b9f75fb5fdf34754165347440cc9979dbca1f3920c7e21ee5e9f02b89cd38207eaead941717346d92c60d48991f7c7d7d6cf196d980f4a167f4d85ab3d9c7d48014f445d43585cf7a591a34207898b3e5b819193466408eaaca3fd2ce81887b68c880f49a7554f2636341ba34d1bdbfd0e27167025386036090052c0861dee2a1bd12f7d159bc82d0213daa6dafd0fd5f16ae20669d55af72fbe490452b88b616c3b4499d052b08eb9d3dfce9c71676cf6215a4af1c16c6d2336d9559a8821cfd5bfc699ad10fa531b2480521c34fc5fd2abb1c43a8a820c7785b93d5753e1f9e82ed4016a7209c66d95ce9b2ef86670a42bb5cf4f376d16c97521073c7cc54170dd3719a14e4a8a463855ff59c4d1a05d9e463def3d09041da1694ce0364210ad2feff07e771f0b0432714c434691795d1e8515640410eeb5783b6f709a2a7f7add5a8297dc45b30edcf5c21b44e103dde7f8fa23705c9708268d93a7e4777fdc17b3641340d0b1b377b98153b9a207aca9f25a5ebe3ecc904e162d4eae71a1304bda82efff9fc2f972055da59fd1c1b4b10367e4ab777bb1264b9abf6f8c86d36339420c753f374a1b9837d8e49903487f69b6c531ecf0f4990234bf7cafb880451d3485be977945c3d20411a0d39bb194fff94479083d914b3eb73879ef28e20d4a570ff39e558bf7c23c8514cdbfda311a697670439cecc334fcb2f826cbd59f42ba70a1b7a45903a8e5aeb53f618d6531241cef76d29876f19baa320821c7a9bec92b66ce5cb21c8a2bd65c92d86207b9c34f775cad58147218896e3b89b15be3b4a138218693bde9f2f7d3f1f04e9feaf2db95e6d762e0872a664e7a7d1df2d2710c47013adba9ec30f1e40104a3fcc1f889964e2c388f46d871fc81f7e5b4e2d7d20e54b15de3deec5df7c209a8eeeb6457b0fe49ff994fe3d3a0fcfd603a1ad7b3ae5cf7920eb4a064d975e3b7c160f84ca9d2e7387d5229fbd03496a4eda57fa93ce6b07a2c46515bfe8d681ec3e77972bc6162d970e6489109771afeacaed1c48e2f31754db72148bca81982bd724f543ffd8d4389083a70c1e6caef74b850329638974cf59082df50dc40ff4827ebc2e6e9eba811ca3a2b2e6a0a9a56903a9d3bb324bc30692260b6321f46ffc630dc4983bcfc29bd7a7871a0855291d3e4c25d33f0dc4ebb30efa37fefb8206d2c751530a3fd1e95b9e81d0b2e19a7fa51908d353d625677d96836520844ca6340f4306928a68958e75aecd8f81581d7f8985d1a4c1443190ff72b6aa0f52be370c03712a5ecc26193f87ea81816095b36fcfb665b5fb02f96c4307b71a2fb2c30b84df3c7b1f2f7f1ceed60542bc9b6d85dea4b1332e9033d6531a0db376295b20252bf19c37685fad05d2be759c748ec377310be4c9f02d5ff92d4cc40241d3e7b75c48c570d515c8fda139c3d387b15559c1d14ee5177daf02e9436b5acca5ba51a302a934becef7e655bb288b2990435e67ce2cdd59c9a5409a4e5fd9437eb2f8312eb8e0820b92411651c03288f7abbdc7e920140a8bce79547493c44906195d88518615271917680e64f104c33b33a33b635ec6621664e184e2c2045934815c1b5b43e5e0c187166502e9a3741f3e2ecdf6712e81a89d4a55cd3a4c1d971208f52ab3f3e92e6b969340b6b055339db52c2b8a0ec80209847dddd0a3beb1aca31c81385295cceaa3e960e34620073fd7f69a22902da514bb206b553a118896b462feef8ef1eb21103a95e7bd75e6e58e8540cce143b32b8dbbf1370844f1f0d3c88721df5c20903a8eeb72d8e2f93af407c4490f52b2294e4b1f90f2c751233e6551abec013132e69c1b3bd546dd78404e3eba6d66aa6b1e3b204767ce76d1e89cadca4207243dab101e6f61649103d275654fc7c428230c072460021ee8420559e080109edeed9fa16208358b1b10e5235b8d6f173a4a1e59d8c01c3c3fc65cff79b165842c6a40128dd1cac2dd87ee5c01b2a001e16fc4e7f35663fd3320471d74e3756c1990850cc872d123d360aa97fb8905b936663e6f4e69623ab020072355af513b5e41fa48d3e30be629e68f2b082b952c3376b4ee946f053947131e8c6eb2506fb38268e9d34d87bb1533e22a88b6c9cf92f4f7f674aa209fe8079bb6349bd466a482a817952f7ef81d343b0315a4f1f035fdc4d66d927208334e4188d7eaefbc5c212d340539a8ae9d8dda943569334a41b898a894e3fb19a420dc57e770ab4120cc1805696f3a4e5d367f503944418c7913f7276662b6cf0845251aaa7692e929d5d29569d9139752858b8619a020994e760ce5dd27c821a35f35ad34fc5e3c41cc15ad9aa2471fd7792748b3316591ce3126cd9913e4e061ccf5cc3bc28c4d10da335c788c211e8f468c324ed082315e5713a4a0d3b9d6f26582199920bf64e6cdff9e91fd68062648c1638e6e59de9fe338665c82f471e6b0d74af262ab8b168ce1617c51ae02332c41529ff41c29f9d16f5c70d145179c64dc8c4a103427ef4f161e67215382e897a3be5dd4269d8e4990cb3a49054d1dcffa2909b2eae7f823af237abe4810c32c86f79c34489077ee7fd62a342f66c623c8ab6fd1c1871a6ec10c4710e5e24d5f54e71c66a611a41ca6d4cd9dc2471d1546902fdea25365be0872685af4709b540431a54e5666968364b612618820bc445a4e54a64a99e310e45e4bbfb5e1d2535c671882209665aa2f787c781e146614827416b387f4dcb1657c0841ea0f6e7755f53afac72008a195f347151b7354db0c4190b2558eab1ff967958f63c28c4010aa2ba2f3435c58720620fa0fa48c79b5425f86be6af830c30f84ce95f5d2eefc86197d20c76d1e3e3bceaabb1f3e10775cec3e10fd603c650f04952df3fefd3b4d378761861e88df81c565cccb692402c38c3c10cf76f454f4c703f93afd27d12b8bfaeb1dc8213bc2230f266da3d5851d08abd1bf316da80ea4187a2ff795b4811974204f7be8610a9aa19f674e61c61c88a1d92fe73855ddc3c796c20c3910bebed355fd43ff3ec538360ee4dbca319eaf4c83197020cb98797c231d35e787175d9cc00429283b83196f20a4a6f5d498ff634aaf175b673998e106a259b0701f3a9aec3818cc68033933d9ecf5e69dcb612fb6c82033d840df7fd07721c61a8c4bd3f2b03adbb856a97a30430d24c9aa94c482c978276d461ac89e2ed5c5e38a1b3cc3196820c54c173a6ac6cc3f1a13c18c33f00c3350718133ca40ce70a9212ce72c9a73908160eb39748fa5fdd19435630ce40e33352dc7351fdb27800b22c50c31d88c30141733c040bad1dfb6789b737ae5c5161605b6c04004de1233be40beec30e59436427a722fd8f671125516af9e7294a9f9ac5c76802d1660812d10902730c1ef60461748536d3b1e06adfc22cfe002a952d89ddcec55d99c2d90e38b850f623ec5fed00239baa2eda54d7ab93bb240cee71e75d81d6e3acf62a1dcb6ab13f24120ccb802316f10ab0f4eb7f2fe6504355241b0d010b517a21b6aa082d0de1fc7f7503aff88a720069bed94d2847e6fb55ba8610aa25b6978ed8ba153104b4176535ffda0635779570b354841fadcd59b3d3d43faa3207fec28eec68ee35d1fa2207a742631a659a2d4d750902ec3dde7ecae211e82821ca68e9557723cb03e537074c1a5c627c8b1bbd6cf54269591bba8e1099279f417fa81a7709dd6408d4e9072ecfd9ebe3a4da8c109a2657f863aafe9b90e136a6c821cdf774c9ebedb75792fb694504313a4cfb4b2a53992ee484133a1462688173a46eb38e868a3053b0057a8818972dcaea09fc37841868341065ac0a450e312e4781e07daf7417a986b50c312242f2bad1c5af562eb0b160ca14625483abe1f2f64b29a12c4fb6837789a8e82c9a6c62448512d1e784af22956c78bcd8019a186244891d681ffc912d0cd408d489083ced694e33c26666a6d81010660a0ae02e0831a9020e647a69bdb816f6babc5cc811a8f503cda542aa24d1ed4700441f3ce82bf6c97798a0c351a41308be5518c97e9de5c53420d4610374f4e5e7db41dd769841a8b209b07d17148ef08420d45548d441032266bf58e621e8df155430d4410aa4cae4b327d086228a9d833319ea31def0a350c41fa3e4db229cd26d3b710c4cdca7ab13e5893f0ad50831064cbd9b3927915778f41103b8c8adda1c699b85b10244b0febc2c71d97ca5b23106c479d63f138bf0fd40004a9a47394316d87ee19b7408d3f90837fb4a395369b5e9f841a7e205c5c0fcf51b4d458080935fa40da9cf38807cba2952e5850830f68faaefa14ea42f74094158be9ff532fb6ba48410d3d10bebf43c7d11ee74deac5d6d516186040561e8a88938e8e52893ab1b6061e48f9dc3ec7dd24186adc618f1926b5cfa3ed40bad631ed9caa3a90243fca186f2e1fce8486871a74205acafe594ffd71ae9f03496a2b58ca54710f9372204777e1e3c8723f7f7c7120f7f97c599b75841a7020765062d2a96d26da913fa8f10652dc8e736c6785bcbedd40ca5d9f542e2abfa3d00735da40948f628ad3f95d3268d840be8c3974935715cf7d0d244d796b732ce25749cb410d35905c3a0e1d3fc692db4b1a0897cca4a42c55728ba3816c95f5637c8fcf408e55162dc67ee01b3a6620d8071f3f6d0af1f9f2652065ccf9b24ee87bd66537a8410672f438ee37cbe8675dc740ee0c51ff1c6a6220f5cc6eccd3992a7355230ca4ca71947bd9cc3a5c0f1808afeb611ce94bfd14f305b24793d693d2e105d27e247f7651d22b2b5d209645fd1445772e90c38d0f2ae4dd0239acfd7e8975ac29e45a20265ff338eae5585d7516881fb3c677186536e76081b89eefcc3af3fb327b05925c761af9f39bbda41548292f9676f4b0a3e95805d279a595bf309fb3865450830aa455d7e491648f6a7d4c8194c36e79785a61667e2910b3ca68766a6b96cca34072b1fc2f357739960c05d247f2519963c8bee70984fd302443075b39579c40b8be9c7d53070b9db209248f92f9b1534edd4c206f8759bd21364fa5b6047214cd172fdfa4cc5b4309e43c3273c9f27f2ee6a89104425d2afd5862d4c370c130263060101318308cd740c2d53802a1a3e2781cc6bf37fd3002f9721c27ead2520452a8adebd48dad23162210eb73589bed62aa1cf52110f262c7a7985d2110feb7cf33a60f2c662f08a4da0f4f99ac9278580181183ab8bfc771508d1f90ec2d446390cd296a8e0f085fd37bbae6371e687a40940a8b59a23a7840aab2ecf321de6277ca0ec8d1038bf1294507c4af928f7d3e2bcc2607c4ca1566f6e7f6abc371404a0ff3ac59ceff57fc06a488faebd9ddeca1611b1033c58f34a67718fec235205c465caabe8e1fdf34204d260f6f57ce80d4a176f81ff52fc56e6bc8801c765d366a44e8d5b120f8ec4799ef38320d1316a41cfa73d76cd2ab0a5f418ef23066f6a8a3df7eae204a65c6fce16e4c7fad15c4381916ec731c2cbf448315a4ceb1630f743466ef6c15a4daaa31af8a416c32aa20075f7ad1d2b8a9207de87199789caa643d5041ba8ceedc98f1b8da9f82bc39e477589f620ae225ef482e73f09ab99482945a9fc53eceeff44e0ab277d041caa3e668151f05613d4d66ffd7987c2d0a7288caf0bac9e338d43914e4539df7d05fe3a1a4a0205d863ab7f5e821667e82f0be6f993c7fcc69454f10b3b8678d95a9f6c35c27c816e5f14b332b67fb38418aa18358697d9b206952eb68ac3a2735a60942654f25bd0cebe8cf0439b68aa93c6bce296b850982e8a5fc1df4378be512c41c5be6ec92aaba44342c41d289bdcc649ebae756825ced36561fa3e257b08b31c4c0326bc118658461f2046e82a304c1ce92d8684b8c572a0c0a648002188880258d499063db2cebe8d12ac9de13a021094254c7eb7e995bee169812308d4810bfa39cdd936ff7cae1001a902068a8d029239a3c9cda4518c68b32ba3010d07804c9e5369ea7abf4a609ae1c41ca65868bcdca8a4a4975c7542966a7341a418af3cb1f5b8ccbb24b036830826cf3f162aec877d8712b306158adc02da0c616a0b108424caabdeb4ceaaddef363c377f0a1a108424cc9ae7c7b6aab6022081191b3aff5d9c31c88207ec6476df9298574dbdc40e31044cd61129951ebe8c2878621c8f6aa39dc7417643c8520e6cd182c85ff5fa9ac17dbc518659c80c418436910829cafb95d5ed3830f250d6205340411081a8020dadc6ae64d35dca3f107aa03d0f003213af7c27a1ce211a5e681461f88ba6e1e5377c4061a7c2046cb19fb2bf34b630fa4ef7836dcb2b3a7fa68e88148d59ad9ac4dad8ecd68e4819cd7262b31d0c043715168dca1b8281a7620886e5a1ccf4e5d316a68d4e1f0deb3064be948a44356a1f2c72d196280f15b693fa03107720e5ded3d8cd1c3f0e1218609f40c34e440525d0bb71c36f472471cae299b0899f3928ceab4b3cfb0f0a8b752c790a181331a7020e6fbf0f1d2dc72a5f262cb8c61bc5801058aaab7da40e30de49c3bee4c361197d312040d371083a7ce19798fb2dbe936103fe372b4791d0d36905ec4bae359446c2a69ac81a0ae73d952d1d26ba5a106f27978fb51b8ed4dd5b6e01003018702e6bf10430364382069a481e451d12b75d773f9021a68207f8e3e2a878cba80c619c81d545fc42efc6205d8021a66204595e9182ccd635a87175b2b306198ba23d02803b9ca55f63443af7e070d32103dc8c76efa7bf29e5621d0180329bdd47cf87fc90f53c440fea0fe3c43fb8655340ca4e051e77b67cc8a1f1d041a60207a189b3ad4f1d0f9be2f102e7e6f8e8e560c75fb808617081f55878c29fb6b29a50c434617c8d3d152a58f75321ed0e002e13ec88b693ada3ba0b105723097d9d0b466b33f18607c51022d90af82c64ef1fd2c906dfd2ad7c7f73135060ba41eb99892293aa0710552eaffee3845e507fb5a814f8f7f5639ae7140a30aa44e11b5fe8ecf63daa9400c9b29c89cc5890f3fa43105924655a54ec71836e6c99002f1d285944a177a27b32890fcc5e33ff2382f6ae50b304c1966045020e5de30eae5d1a5a8dc13c895c377ec5221a9d63b811c69c7cb71f47c13087a1fa3c7b3512a35a3010d269036751cf58b74cc87b70c682c819c35a64711a6fd61d0d0500249fc47bb7bc7a3b999011a492076ac7f96972eba48d32a8305e63c40030984de2be90caad5316cbcd86a09d0380239b4c7d917a6afaa542fb60c194bc3087694a3abc6eaca15a1147d454c09627464c818343a09e25d7e38adbcea9e9616e18624089acad47294a59ed627841b9120fe6dc877ce971bd6010962fb7ece15cdaab8770c5386030a08371e41daa81a34aefa87e99b7204c1d2c3c857fb9fecb011a4ebcd3851956104693664654a5e1be29545106eab2f8799792a4bac08624a0fab9a32e5b8741341aeeb6067991d63dc1b11e4d0f21416db3f193a046159163277ee927511d7dbabb1dd3dca0bfb0a370c41b88b1d6a189b0b418e39082d69ad5fd1911004af6fd71cbd9693554d41b83108b269690815b9a9b98b20c8a164dcf78d51aac315084287ffb0ed2cfd5fdf80209f454c76559ededcff81683593aa92c1733ce90d3f90e2ef6f4475c3adbc7d20ecac9bb95f850fc41191d48d99f362eb8821c6181548803de0c61e489a3fa8a94fcf419bc704c2c8c40d3d9053bc5f77fc5c02b6200a6c91802d68025b24600b92c01609d88222b04502b620086c5181086cf1861b792049471dc5c9ef38453c90f5f53b634afad9620e4be2c61d881f5ba983bdb4d0bb79b1d5851d88f1a3887fe9fb9c749cb85107c2a6e0fdda6639779cc2c40d3a103a2a8bb948df385ee2c61cc8b77b31574aed41ee5886881b7220a4a638357b0f03b64800d922015b28608b04f00f6ec401e160fcbdf38ed9ea026ebc8198edd374ce1a4b4aec8cc30d3790a36f476db468a93bb68168ddd591567b70953f66851b6c207ca8539f2c45f73067748a1b6b207f7d9659096f4d7dde50c391629b72ae1ae78d3464fd17de391cef0c37d07037ce40d02c0f6ec783d4ca1a2ac40d339063fe499b4ff61e426fc48d32907f3beebb1ca71271830ce460c9feb53eb4798e5d40dc1803c1dbbeee33375ad87cebec86186c0f2bb3c8088d39737b70230ca4d85d651f74ace5372182216f7c41910037bcb074a30b76830bc4d3fef0a87d432ebcc018268c30c0f8828c39dcd8827ffed69dc14257f5828770430be40b6afa71cdc60e6b7ab15ddcc802394ab311f5e17b689ea7c00478030b244b1abf8368eec5568571e30ae448e3fde68ea86fa65620e518537d78399365586426b85105337b94b858228271830aa48afdec5e3e1635074e8110f7ebdddf2105f276849984588c3d62096e4481fce1aa7524e37f3b1f5020e6a898744d96afe641821b4f209c48757567484b31eec5967e71c309e4f0ead42897e593dc5e6c8d61ca08c3348178999657df49d36d8809247fe99cdea3e8394c1de6c61288ab7dde51636897d08f1b4a80c28d2474e2a5565752d1136e208174baa379ee435ef2f82fc638019702c61063010bf8628c0a80e15f102eb8e8c204cf022eb800c01e6e1c81e461908f55293d831b4620bf855d34b5b093b38070c1051900a0c18d229032e49f744c16b2fb2102e16b26f5df2b378640aa3b9b6fb1bbad73ff0b32c2f82247b060b8210472b89873d9af63ec5b30461955bc3782408ad11fef638fb1e2d10e488117176080de0002772aebd125b232df59d5772be161580f3dc8088c058021c6182b10038cd30518628c5106195cb8f103f29e25ff14699da21e76c307c48acbecd5b9a53ed6ed460f081e9488a555fe404ab3b602dce00151c37d9c3dca0e1f7cb303724793770f355ca850d10169333e544ed9e235760ec8d17e6c2953b42df37140ee308357c67bc8aaf606a48d6639ea30873155aa3620fcacca95789cdc3ef2460dc8d93e7f0c9359186ed080347513bad123fd18fc199032cf44e53f67cb2134f3c20d1990e3283d3f470511b7cbcc462c0897e3e0faa65b45d3b4051bb020e5efb0749dde627b945710b32fcc6bf76a8e2fba82946343636d9acc6cb4829c3722636f47fff02d66365841107f4d577f755ac96266631504efcd51740be2e6f166aae032c2c26d6346a4255422da7354779578e4180d588005b6b834d848c5da400531d9ff587468ba9de26c9882b8b9723faa5421bb8d52906483e564a79ca3dc8914e4b3d40cff0d1f97de28081fa78f272d355190f27c98e7729e62c834c760231484cef23cab53b13ee680c10628c81d6a94e8a5f1f0c1430c363e41ec55eb88f5bd947b7dc1862748215deef3bd99488f66051b9d207a5f5bba4f57e5c1c40942c7a17268cafa67916c6c8268599e79736ce6a5a7c6c08626c8f18688e8f5c7aeed992074c5e8fd97960b6c60826c2e1d3562a5e3dacc2548f1be77ae73766c6fb10469de3a565d9a2b410ed7d6c4a3d54f5b9012e414de7ea3a7f3ad9c6c4ca2b8501b92302e2c12a4ecb8d19285bf9ac940821c9e358e79968ee1c14790de7ffe3bcace11e4cc61e45fca87dbcc1a41681f4feb314355d674c608729c65879ea3baf738b439d85804e9c42bd37f7d0a1f8751043993e5407374ac6cdc24827879597d47d2f72c830852afcaa8868ed152d80f410a3b5f9d3bea86204713bd612f9be6186b2188996b6fdf63134f2909418ec74346e6f8419042b7a85afe35ff04417ed318fcdb827f5861208839658b29ba8e5d978020abc59cc43ff473beff408edea19713e1b9dff103a12676fb34f4c7be791fc81f84852ecba7b271e6032958ad5a05cf7edd59016c901d0729ee692aa307c278a4bee479dd7c3e0fe4f8c9601f671e0fc46829f8c7cc138baddf81bcd7d1746bcf6c8e633b904e2d35f35cadc3d0461d8896ed5a9dbd5287bf57800ea4b99cf1ffc2320772fcb7c66cd95f6db21c4891d12fc7f2e842e35442b01107d2c68d129b9d4ba9312a3890b2ba03d5b6f3dcaf6dbc81f8d2b91eac07fdabf1314c1929b08021630ca3822f147028c0851a6cb881acb5b96c4a2a6d20d869c75aaf8a6d9f5fc0061b700d36d4402eb718667a3dea9c62d240d4fd50b3c9859b5e0c1aee0b1eab47539a448367582ae6cda31ed3b96706e2deef0731b9975df43290928751c73e25033955cc97242bead59863d86a325f3e5ea2323118536eb3e81f66061b61300cc30618ccc617c8d69a7f97e2ffe6e20552750ed55367ebcf7817489b929e791c3467bd8b0be440aeb5543fdfda4a36b69044a956ac5d84e74459e768bc582d10373f4f4afb69230b84be141db56855f678e6828b31c4c0828d2b70d1f6f1662772d1d15d19259dc30c0f3accdc8615886a97524cb159bf17f6622b8c2e4a2086180d48400bcaf8e2c500c368a0046288e105175c54817031d7f13e9a8b39560f36a8408e4e193b64264f29346479081b5320ef4878b81566c3b2d386b02105b225f7d0fac0be3a552eb21036a2408ac9be6b00206c40016d3ca1b8701b4e482e9a505c20016c30a16f003696a04ac024940d24102ddeb2f4a7fd98e6390239e798531bfe1981589b6ea4a4da5368c9461188ff1b1aed9b51d52922903f98ca39bacb190251b5743eef3f8e1fcc53b02104c27cae859e7a50a37d10881bc37cb4501b66e70204c26bd4ffe8e83f20467a9e35d534bb90f10129a5c31c59d6d403a287931a91f5ce9fc30d051b3c20a7f074bdf92f1d4d6b6307c49c725533c7f3cd1f73820d1d103c2a0fe519ad714baf828d1c10b44233456eaa48587040eaa07252e9edcec60d4841443ebc98f5a3746c404c194397eb684efdaa8d1a103f4c251e55d28e2e5fb9050618c005175c7041c609c410c3060d5caf5cfd0cb6e6950a6ccc80f4aa9fa38c6c7d9cf6820cf7220436645090e9d8f4962926800b2e6ac4821cbb274b1d5d23337fb0f824e72c9a9b74fa0a425f5d9e96f55d41f2388a636fe9838fecc284214617a6ec01355ac1d67b4b97abbb46b5fc946d6e67daf0cc01b678021ee802033558410edcadaf33073800166aacc254418c55b9d2a43cb4bf268920e594ef533ae772e43d22c83a136ae217ccfcab431025328ca5b79821881d6eb8f5c83a85206b475fe15959732b1382a0d1514e3ecca5b97210e4f9f0243e5e4710a4ac511fcfb316ff3a81206aceddd93934afda2c2048974be6753efc72caf107827cf8b187ea317624971f48d73973e7bbc9f6ffe80359672ee757bd0fa4527c20c6a42bba3e167ec9630fc4ce2776dd93e981a491294e56720f3dcaf240cae4dab1ef5988ad070f245dadd37e4b29a91e7720799031f2d7d5f23a6607627cada6789aea40f430c595663d8bf9d181bc9f354afff37314f53910c543a86a747572f5e5406c1d69f5d0dccfa33c0e84fdb2fd646d97627fc08194ad2ef5071ee5f8617c03a9c3a4cc061dcf5d5137903dbbbb5d16f9dc34b681d81ab32fdf111b881d05e98ecbcbb1656b0de4cc71f429e6e328857fa881d8dffb518ee328fa6b380d64b11f91cd942c2aef6820746abd88ea286d5e672054ce91fbf070dd63d50cc4fd144553ac9481bc7a52295df9a68f850ca4f7a8c954263e8e2a1d03497a6cd73bb2fc8179c440ca8f93caf1712a5d3b0ce4901fa53ef58f7a17c1400a163ccffba5ace951be40f0d1aa69492dd98c7b81941abbf2b13a8cde7317f438ff6c9beecf0572187d39d4b33e960fde02315ab098d02c4bee1d5a20e56831c66c1f43ddc6592068c854917a9b2a74608168592c6653ba071d65af404e390f2d879b7c3d6fac407add1cde455e6bb6ba0aa40e9ecfa38c777d9fa30239e52a9faa97532087745bf96c1e2990b592c6fdb71c344c1805b2a508abd55417e5295020e7acbf787cb2df617f0239dccb81c4e79f8ef19c408e4fada246b2e31c494d2047197c2fe95b3aeb9809e450e5d1ab07d1b9c75a0239f4ff58edcda104a2a77c972b7ddce5584b02218326f9d81583044285d7c7b0b6e1827e1c8124fa296d045234ff4cede0347e142b02b172bc85f85b44205c77301ebd9ff3553804824bc7f7d5ecbc71d342205a87c7be98e6d4980b02d9230f2b747dde2daf4020d598d676147d6f99fb0139fc736fcd7605e0038225dbece922f580141e9bece338a7bd130f08d539d6c72967b87dfc0e8839fe47957b4997f17440ae4e1fb97de7c7906933efeb9667cc340e48ea19ee72e59371cd6f4058b9fad8b0bb0d88b11fc8defdbca6b4d480d81ef565dc87d1ea1b0dc82baf1d2c07cf8014ea97516e3c0290015152272cee9cccbe180bd27696f8ff38e7b09f8405390a1ddcdeb3ebc3d3bc82f8ad1eb78fc4bda8ef0a620e5d5f93ff2945f656903c5f466fd9762462b38254256a66ead3e993b70af258eea882901abfbef287a9205b77ce5d1d5e5e9c1e152431cbdb7fb3ba93ea2948f5b37a9d2d54c7e16c0a82f986eaf09dc5b27f4a41cad7c16c3de530ab274941eacd76f1a1468f306d14e4169b4ccf22ebaaa928c8777d1b1d2f648ea21f0af2afc6ecb18592a9ea4041dedb883eff90da1cfb09c2c77197c36ee40952bae8bf1e59aa1364cbf97befbfad2fe20429bb7e6bf6b0ac1e779b207cfe6b8776a926881d2c896cf69d09e287a6de7925e3ad4d4c9063a81c1a4fa64b10453f140f1ddd078f764b903dba47e6213756655a09e2cbc965bc8e30fb8812e4b0182b4b570e45ba9f04392cae4ef666fcd348826039a3059fbc22414a73affdec691f940e0942fd6e5d58b098a2fc08524aa14a6eddeb37051d41baba1c34464d97bb3b1a41bce8514d3d8abb1d2623486e9e62e768d3152e2f8214b33b1c0feaf3f3ae8a20e5b8ef38dac5cdf4940872a86c8f9e1e22c8767bf17d2b868dff0e41cc718eaf6519bfe27d4390ebe3c268c741ca59a510cfebc7eb9c2f8510647ddb6acd7172ed7f0741cad173f8e151fefe981104d9a274ad87527391a14090a3dcf363af5b292a03829c32432fd676fe40ce1e666a5a39bd24a71f8859df9d2e2faa2b7e1f48eb3f1fda9af1f7d27c20e6dc5147b7c136f7a5f740aa88ac1c95767de97a205cc5ebec31fa6f5c9907c265edcd690d6ffb131e7c0f56afe7a17607e26747a1b2aae965b6d8811cfa99d5ff8747161d752054d09876d66f3ed1d1815897a359ce1c53ee949c0331db3be60ce291bd57722097476a674eb536f5c781641e76b027ade3b13d1c08fe1f5cd4d151cdb0bf817ca9e3dc1edd2f8749e3065292b9da4fc15637b7369042fed4beffc32c89d840f4fd50b643f9ffed790dc4f050d1e3872a1f53d5404cd1511a88e135a518f57175ac201ac829d7f62a9fa679f80c877918ef33ce6e06a2e5be0fcb535368aacb40f8388a9d82e71cfa4a850ce458e7b275cecffe238d81944c3fceb13d47fc27c540a8dcf0f230b77f0efa30903fa53d74f20e4e250703713dd52323ce3d66fb0be48fc277a88e95ca35e30552ac7e0f34744c679fd30572ee1c593335f9714e5c205c2c8f8fbf287731b905424a274f9d3a450be469af5ceba982dec759207e58b16e835b771c0d0bc474fdd8ef1eba02e9e3242b903ef212979a1cd394aa02212df8e540435c4cda410542a78ae261fc2845f16e0a647b4d1693decb74d44b81a8c9377fe774df9876442da2400edc2af5c39c6a82165020f4b6865ede9c4ce4e309c4dbd029fb8769f53f8c0c5a388198caa2838cfabc898c175b8601b6032d9a403615dd94b2ecfa3a4b042d9840f6d8535da6fe1727100303260528f8228c0cd410b458426aa104f2b7a5f46c77ca99e2056891046267c8ffcdf1d5cd6ad30209e45c2d773907712b9623072d8e40ecccdb71fde112ddf1801646208fe775ecd1e9479b924520e66eeb10bb087b99b420021adaf676919a36daf1693104a2e750f9e1dd2c2dc7130d5a088178f561141be9fad0b8164120745e8648cb1d02540c5a00815cea12bfdf83418b1f103de6b84e17acf62bd9052d7c40508db9fb63f00a9663b5e801612a5fb0b7f0718e030f2d78408e37a752b5eb708f62bcd82d30c00030c0f0042cc08b32bed8c0186294da418b1d946d1d75fca9052d7440380f6df5d1c509ed7c0e487d79e16f3eceadf6382055a79cdaf3556e40fcc0fc2de61c071d7bb80d4829acbfca6e43ead335204d6448bca6b58f373420c68d4a19edfb1fdf3c0372144fdade731473f9d54206e4bc737173b01ebf75c68294e33856f7ef55fac3821892fda731fd5b15be82e0f2ee710e73cee599730531690e63dfe6de78df5a4196ef9cde3a911fcf0a824cc97f74af20eea95510dd3355a5904915a4d048f3b5ab6877490551fca3b3d891faf9ada820768697780bef146435f738ca0c8f3cfa8f29c8615ba3a657e74c1f4e780e75b3d78b4c0a721c75de72664abd975110368e7675789f3c4caa811ba220760e836ca5476dda9450903d87460d2d1feeb4f5c00d50903dfa78f3471d5ecc51c78d4f106472d73ab4cdf66fdff00429b807110ff523ad3e9d3836bfbf648c9c2064e6e03a7f544cb6399b205cba70fe7de1a7b34613c478c1dac328af316d26c8b966a3479c0726c839c4e8e7cf5d82b4d65e1ed43e9a5f6d0992b66d659eeed4315d09b2e50f835b018ac4a8446f65e270240a0543017130140683875817d3130000000818134642a15838a2ebe23c1480034a3020462a2616202014161616128d83c1502814088601a14020100603c3807060849048c17cc2662150e141014189f5d9ed69940e84fabd2b0f8a03451a45adf71aebc3792823507ca809a815287ba81b948783a2fde487668da0b6508b50bfa0961728545b9cc81128eab4d42e54151432543754052a09549da05ce20e789734a84ca8a2505ca84846a54a55f12845b96f6443284245a198df792823287c284aa8ee5014a8e2a350e588e6d7ffa07ca06ca11e8bf22c95874a86e281624751402a687a5c4050eb7d28ba5c1d9408140fd4046a059405ea1aca8142f5c52af8380ea0d629541fe9f23f8e503010541f6c01a4f800ea110fb58f28a017556e961350b499a108a07ca022504d61d414d7e33c5e0326e677cce39313141c4a0114068a4551ae075b1e54c214a543bab55c8b1a6a1e8ab9a280f0464cc44b53c0bc4b1270fc6401e584fa0ca5874a86ea014526a0802bbe9880f893c4009408a4484888125033504aa83050752806280e287c282aa8fe50b486028a3c07ed4516a5e3f95c1c4b478149f14e1450f8520e898e6ace84656e0c501265459ed629945ea4416da050a03ea02e8c32d4a7504d2c2ea11f8ad75194522c28ce50745089507c50c576d4bd28f50db05056a8c5a1c289a21d9eeb1299a1e4a10ca0b2a18890a8f5fe09c9621f6a036a066a0135845155520c507545eda80ce39cb4a1e2a114a09a4d91a70e502450fa502d28f250582876282650f9506405a5239984d6e4384abf9542a9a8eea4be011a8cb21543cda14e41cd40b5401141f54045a1524055a1aaa10a48948ea85676ad196a03ca254201ff845fce7651b4af96ba2135969da304f582c20235851a010a0892c09c992dbeb2f124e7ca5b029ad041ef68fb17f7a261984f28071ef01ff0554d8c3b531fb957ba4c9bc65243db67cf249c2067188d412d43b7168e4111ec259b1893df8581dccfbfa29d3cd45ca78558399c9a970666d69ca6d25a69df7d26935a0f5ae09b517631df780f15ac52a393e3a1da39dd276ebcbf3987618368cdb1e9d3c8a9be72a251dbda59f6b53e5cd23500e1a4dd694e1cb25385d6d54301c74462993778b77e30181bed724baa9b1a9899fc45bcd03dcd9cde11acfebdabb2ea38bb7dc261864f395c3b7eecd6d25d15192687cd6fad0bfb8e68cb36b0d137889b9b5b4434c09494a8705dee76eb785f1a0195b880bb9aa986fd25cc04c0149861ac7fe20ed963b4558f002cb37fa4265fd94220f9eb21cbcba4ec0780491ba0c52ca2bb8cf868f22b837e641afec5b0d44034761ad45aeb07224fee02fba26d5c1664d70b68311563ed284aafae68602dd0c8b2fbb9a78972692771b312c38b533f97c7c655b4791c8660d7d2f5f01597b3508e9f674daf94ea4f5c9d828928adfd8a790601f6c2a2bac54ad99b00676811d78e92b9da96be5346e0e48d8a53b54c92c8a59a9f6d2903926164dcc941da48322c1b49366c6bec19ea4f0c18f79a29eb55e071802ae660d782be7c8e643bb1229012511e492c8e2801b9e294e89bad68e15c3b0550f8d0e4786052088c46888a0d996ff0c666662d4d8d257194204a609982a03ed048bd46f0440101b2576903153678bf60713bd0b053dc83e5051a7362b3182181a671b70171deae2b944e2b6737250e5c11e15ecda957885e5e0292fffd92479b10851bc87c6c38c791b43e9ed3df8d6bdcf745b2195f42903e5ae712d37ec7c99ac6c5ee3d5870e188b8e8393d692a34452cd9600e49894fe6ba33ef752d81186f67a340b130693a2ea184060485f81256da14f5df1b1f7496eef3acdbaa2f8b10b33d274aeea21cc9575d0b0b7e6b037d4ce09bf25b7af8368458b0590b196cb1cdcc143611d388a669c5cecd4c2327283948914dcbf65d90169fe114adf86e981c7b98390b13f09c8d529d81de34c29b945ec3deda49c0df431e5200c9c3aebb298544a734626c83270e15759fb3eaa66660fc0ae523065e1c9d6068861ff650d5a86206402150819abd88e755445d70421a8cb3f77079dbdcd81bc5b8581c725cf7da9369252e336a8fadf7ed94ccaa081785f37706b3a5ac21c2361afd4377a90bd39bedf413ba4ce166630d7b69cc32561687f14265e7a698699a89b5d87fcd7a34ba5f04516c9ac73d0fc1ddfa25b397011a14a62fe7884f1c484a203099e261fc143914c05ef6bf9affa5b49f4546c1b268e7752d44550a3991e51244001e15adf46a72dcb3a4403b9f71983d81525a9495fb1e398f222a1829399c20dfc61eec555a988f0c17723d04ca1fda27a0a5da1605567ccdde49f11d52801b6ccfd73c4b71538ea47b4c000c09bd0fae57455cb21058db30e48d1976e1111bd701f2722f9fb860027a60d0c08ad5c3d17ced12de5b0c96adce0ade25edf33cc80f6bd7034793f57ef2cb6cdcad3dd64fff16abbc62d5962b85c183440ba85e907a1a99c7fbe56b36509b361c14e2143678462277653906dea3540ab519e7ca86d470e2b4181186df42d6cb79c15b0f77cd7a0f225724786fcb54f61bc8b84e27ba6a177f0540b5a769ee2da853e2efe23d5fc4140d8c1b1db27e12869b15a482212905602d6356b284d57029fa3be70e612bc94b048dd7e0b6acfac438655de24bfe37b26e8d537decc619ca0d73b5aa07698c3a021c00e525e7d2b63d7791972246c075ce4fcee942b1c007818ebd9d9525e02ece66e24c938b69d24088192a34c0237371bdb2f387d13d1604ae95ee478015b35c9e08718ae60c56da9ee7ce837ba48a73f5921ccb91895c8938656b3d4faf62b8cd063bc1fa149a948a1fec1576266908d9052c722d0f11159cafb84adff1f142bea61d298b83a89f5f86d4c10ee8e9031e623f3daed818ae7ec2a11169ee3b6f1a41af2aafc40cc2cd710f7edb93fcd3f9c86c34632515f6475ef2b5a04ba399bb122f484762003cb7094bb639b0802c38b627a156fae72d0649f90d571c10bf9a2adbe742d4d70f213b5575ad27e0bc70274565693aa0e037388c53461fa91b64b9a2d660d73d957685c5f3f8b93cac5b268fac00420c8fb883cae5383451f103a69f9504218258a1be099af949d88f324addf50d89f30c309498865a41638162e3cb05b35b65dff20014e8a361faa1aeeaac88c2a989edb2e4f8c7863cd69a0f6713e80da185e7ae5ce1680f81c70980f04f9c37e84085680b465f7a687fbb53509dc1a5504ea6eb75f52e6dec61899367f1d81876b840bf4c8f6d15ba83a3357bf2ca78ae21c5770b762e24731095b6f603cd473f6f9b1620981938403a4e8968c3c7f72ce15cb5369932111d94fc2327332765556bbd90395e8bac8d66c62eda2607a1ba3136e5b303bb8cfdcf66f6d7a538458b140830e84b27765f3e2027fe9010a920ec0662f4592f4b52a1362b2d08ffde9f522922d9673e2d8e411c9bcb496c4229b7cbf0b38440bcc89deb86a32c1f7ab8e16a2ee21d3a7313b6daa6939289a9a433c430c9851449eeca08ff7a5c8be68b110171bb9591356727cdf51047a24b2cd8da88cd5d7db488df65e0a9fd59356b07321d4c419b444446588d09a6ac669033805d332e827f9a781d3db90e121cbdb5b6a0832b3fe14b0dded7f62071b09ad37a7307f7bed5bd369c840828b7e283bc888c121aae0b2e072510affdaae251eb23fff9c16c3f3edca4ae8465f9430546d35ab726b55498ad0a1ef9214adfeb54dc3b7bfda246085577c82f5ece32cbf1be06b6ad6eb59a86b7fe1ab221c80a6b7bb0309114001133e55ac27214702119bf0d0289098c495af1a98f8ef4c113937a6474093a33d0aefba2714a4232f46adde4545dfc39e56a6c1400e360b059cd46403089c1d2bcbf8d9c5d6291fdda5c1a06939a5c51ecd30020d43cdff036836436db91874829dd9c9985ef1f48fbc55d170a5d960aa7cdee3a6ec9d3fda13da546d5466c237add68c5da1545da46a18d828cd18ad8c870231ec95a69b98f762b4052885b734201254eaca290515488cc56906a48a469286d1848e02a64d26bb586db1c7177d3c4323672e0629b95c306f02c08c760b5717dec65c0e67c4ff11d19c87c7024a31f74ff82989f3f4aac9e0aeb09d06a349727728fd9f94960fdf05a7973a58290ad79f1142eb03cf96531500932a9a2381694a21ddaa3f440c2b7ac73ecf0ccfba8ab66487a46ca4b600f92cf607a0e8cb78f6e7087f362e66d28fda76a63663c8687c886df5a066448b9b957e9846f0d1d968068d2112d9897f54dc88afc876dcb49a8b006c8fe02fb235548bc137f068703871283f906588da58d341bd839ec0df3172687efd1143e04032e0d4b55bd69cf3b7908586aa8c17974231aa185804768ee3cf04ea174fb6a542f39bb068430a2925615d365177444ed5590ce1309f6c5b512604a919058b2ce4b95dd0955e02578f86d066d2999133384ec8130841876153822b29b473b5df403f0fa4066b7cfdc0f2934b6a56a3ff1912d508acc97cb344f076c11fa8fe4d3b203d6368897e51aa96869c704536242a6c4ecadd008942b40940daf1f3820b461a54f54f8444094f2ae6cfc14ec10fe998b275a731e58c2a5e4ebf15ef842eecbf27ee9267705b2cf159f8f05a3de2dffba636bbd5cfa0ad02dda79ae6c5346725c4c7036fcc37e1b76aaf27228ce3ffa24eafd6b6e30883f96b5e9cfc43c1f8e2b80cc380bb1d4739fc52bd91b766cc68d0ec2a85443b09341111c5276701573eb1e6045560f80f6bbe82845e86db94a10c1b9e4ad0289834aebee643a4e32058bc747e274e60f1920e78928bca1ee50b2cbf9362876223bac56f04be59caa4e66f1ba76559643815f1e075338656312e165fbd8dc016b684807e3a92a5752b74c415e3ca4d4ea51018c11f90531a87a61716d038a6b605a72b88bfd4463020a265449e0ab60cc2a13fde5052104f5b171f8c36d5c9a154797d6a147dbfbf761611d1362da5eb2a8dea3f94091cdbb8b5eaeaf364524364769d381e444ce3210295e7751f76f1d430e088a7c74c0f8fc59cb510b0ea8e1b8a557cb3d22c67d9487b4762a2d7293e646a99799a6a5512a458a2e9c8d4130621b0ddee7242d1ea9b1773687e2007783e754d3dbf615ad75762abd080247974f4d256b523c4f55d760d42abb84c87b9cbc215214e8082f5e86083522622d508f5e4100159f9649eca57f30a826750ecb7d756de1a1ceca50444a605a336955fbf94cc1699aeec7b20c3db8afd3e7a2e85b122c07aa89a68299fccfc7d83c4d7db8d666ceca13068599a966f43a2a152a5d6aa1f937df0b82dc8937f2d510dccbe205b356d94330e51ae5abd56832a012653431dcbc7cde013db069ced406961e56c88e6a9243630bd46a746aa24f8c725ad2acbc1b04b382014ce5e1ca40c8dc65ff0d4fd42c6a51c770fc16719de77a74a4e84031821dd02b54c88c49538fda6000599e9dd52ae28b26026a718c85f898a56d4ee84691b36a54a2e80bcc97796ecb2d0318b4e649b9b2650eb28d9554c051ec95bd66f1dad5940d1a803c59759e4785571496708e0ca02e16862b44613e7b67bf3f1c8885c262ab0cc43a00e2386d200751d05f2a3daf576dc9f46f51cb6df2dcd9001a5ac2abf75a9609baa6d23171d6f822397b07e5df1d1ad91a57e3e22ea696f801550d3d4c2904d248e877ae120290f034bddc8cd4a9adfc15fd75f233c972faef07ff555715832c757a25bef59db709e61a3af4cbce62e222f4517d3dc92b4edee03c003798d4404ccb39687c3403480f639d01bd5ff22b30672600023319b99faca8820d0f1ad099fca68d21639c8123ef114ced7401329cc38c57d70263be9ceff55fc93a5e19ad4cc12fb99798c19693610f30414810cfd08add515d254fe4509f606cfe17192a68035d54e058ff60d59e4899a0936d8e255b3182257c7b275cfec0c99baead9bc4d606c6dffdba96d467ade1653665555bba2770fcd7829d6edd619d8e6c9d1e0cbb1971222726de3cbf09660f8c6538204809d291af3932236c8f48d93c6e48365d91be244e3848e72d5a1a3503a014b6d3f382371cfffb9800f8f366d02f22a071807b5033831d11370e438c3981d20875c32eb8f7bc441150117744b75139f748020a40b530f2923a3b02503715dbbb85f4017d1be7dde1a0286aea3f4282b496311fd0f455dc012a8f98c1ba12f83d82074e3132251594fd6b389e11944dc5d0afa4c0c509c98ee9f21ec8433975c8e729db49537c84321651390eab8c738f284d2350d2c72e0bc45d1014998e864f7e04a25a6dd0b7184f355d1f45d44ce04495c26fce321897ba1384251f01bd574a071ff752ea076d195b319dc835f830b41d083ebd70e44f8cd9cd7bd0ff3301abb082d945af32c3c3a6953f302dae1d06cba9f969deb36fcd02a20837be06232039ab02b692ec1d45c6a12c28d4f37ef7d59bde7535ab7582dc8c2eeaf75886bb2498f810effd0a69030dafb73484226065c2736cf2532ce684329a388f0cedaa1c4d993c6bcdc56b35d045ad592ff89dc863bf1a944a5f9f812e187028c4ed8780e9ec87e08ab0a023701c1fda42321978fd75f1ed0f708552261f539edf8523cf722921fec94cca65944d239047503491861cfe6d0f64cb11bb41b60e67933d2566026c54be92325b31528b754390e785d37a509485a599e26a2846b56144d562824460db855d849dd60608b5200882da68e0f4ca9308a47094d49b71de4908a4460ae1ddc513420c9b48fda232fba1ca28c89c93d1953148e8087108afa87ecd69ac63a112014dc88721198a4c44e284cc8c1234e46a641258dd345df15526497b4e8b66e59894e1891dddff491a54c1c8d6f0a832efa033c3e0712ae9134c8f224f1989a0861b222551485dd50db3618e7c9ccaa32ed1adc2360dd1b33ceaa9588b11fcd901eb8e254f2ecda0a2d5529de9f365fed3097d2ea7d4f9eba9f2c03f872781e2cd3893b350c1c2822aa042ada78360914acbc89f7a72d2f0bda2b950bf696a5e3a5c372bd01854547406151d8d434346e1a0205138284383c292a43ff9531419a91d35edd2f6aa0c0a4e19d8c010a0fdc31ee5fce09ecc3f0edf0dd1a53ab4c83adaa26bd699058844e8756224b96f86733393b3d4b8c386d2371a61ec291aca145e2b928e6e4ec4850cc4624865f042f0fb7253651c49094fea1f40d3231f475b0e0c08087c795034b14ff6ac9198ed238f75fcb0d1591911e39c284d4712b878cd3c6b69b7aa28d949ca225cddcedaefdf27e8cbd41c5dceba7478a96edac324aa76a5797205978254d3025733aef78684157964ec5bd2ff75a53eafc29546ce03f49a0156707bd042ac212a4c9dcbbae46d9aaa1876743bad8b43c5e0046c881d456331cb30bce3e36299f9644a03c93fee383f08373cc0a507f213b91dbd37dfb712cabce60fed51d5570f1db85ed230eefa171c07194f101aa9fcb8a2df8443037bf15d4bb905385c2f7166ae25c5f5520695cbba3302dd7c1aa9c4391ab5468bceae329b5b90c6b309c03b6e48da0ef3091ecc3b2f93ebc0eadc0708c36be2410f164363bf98ae0ccebc824ac2b6ac5d1ac497f2f936f14ac87b7e3140d578755825e441c62ae5fc1cc58a95b02cb54abfb73bcab0d91040aaa19c3e418468317c995839f0f852298969ff874d53930f8aedc700cd42f2365d9704d323cf333d1da83abe7fd4c083e3ddb54709232475aaa0c43ee4f2aa1b703006a2e1dab203bc591036a69fb9d8e81dce1a45d58d7ecdab3c1ab099afd121fb52043eaecf8b81b6a462754b15d11b2f4836cdf78cd8aeefd6493839f26207833b2e0d3693bd466fa02021c4808620baa12c71ed6e4202d2b5e0798d6b91400dfd0d8be493aad0d24186ea67dd3bd43f80e6dede38d66a617ddce0ddc2660eb44539c800ce2d5d5547402938cffda09255b59046d05a0352b75063cba87d99c7b0d2ad091179f4d01f600c70a1f856073e38ba274abcd057e0fdf72540ccd0e820fce3f6e6f03201ca29588626f18c73a82b62933f98a2690b9eec12023f7622ae0f33de82531f459e4859925d5a4353fab35bb9a784652b4e756c4b3fc9ac8b0ea410937b5354589f5e6e31a8da18bd22c2c4b34f3246b25372f4ab4730b364470c22c40195358cfc23342b3e17b0e2514a276e8659bd2c2db2d778e0772bb3317c943cb33548558dc586b09bf58d1f3c30ac493418ea533f5c1d37e0157ee1d38f492eb39f432cfc39e7f4f2524111db9ddc41cc8c38644281852c16a6f6ac9650dc0ac044adcea3f308c5cba5054568333c15ade3464ab76daac428bfdce409ffd6d97db5148900f49c47c40e4a115c3efda25a929e89766f3108790b1ac07e7e966a1f97028335f0dbe052cf481066dd46013396d523de9b16021c754ce67fd1a812184f5392905824bc9727e5bc28b68f43151d6704e1d3104ef42039d5bef597a9cdbf2f8bd4dd337f4face1be0311648220d04b1bdb42ea388b8bd41a844a4650a167b6a7935285d9302afa96f46bd61ce742881f45c8f05206ea05ecc356895cae3bed807d8e48a8be26dd0155101cdfbda22c71cf42f7bb8d76e2c10b67664781cee6134821c87ca9378144b8ee1f6f6fc93b2467c1e3522a17d4c0b648c1c7dca1e542e5b4c866268d7cc625f87cd5766042feed5c6d04682ee6a4d4e9e31348fe0308a66dcb02246d3a9670c42db9947479e5206597bb290bf6160fa7452703d18b265722f3bb36d48f7bfb6ae2568cd50fdcf6ab8b72e511c0d049ef15ff00785f169b89c80ee5c47b4fe15c64d3e08346894ac66a9f6d5847882bad0912d9c67e7c9e2caca15a911cd04e1ed738caa706cfaf9e3ec81a607dc300236d3b7d60548dc5acef18b00a24fdf79009da87ee0dcfc7ae4fa079bdd95cfa89cc57f5dd5f99e28b518f06d9ec40c212ee4f40c304f3f151fc4df9c4933af75970761a3721cb3e5e8043a97113594496379fa67220ad162049db9a1561a4c0c17d0c466092fff3ba9618b0184313c48a970acb3a53c4c89442b8795857e3ba3ee714da7f4a020f9293e15600c408c170541398b96c766c86639e84a350b2b0052a209993b95793917888f899bcba0177d1ea124efded01040e76461ecc82c5490a4889926d189f26de85b514019d21b305a915797e1c43ece7257d17612b90246c8cb02c492b64e40867a0dd2c4f5cd7b902951801e390908b948839fc4e36ac423b1885f0110a61232765acd7dc6a8649f12a2bf51d0f1ba585d10e8f1519a6c79a83db854a0c71541a95bcbb6a0137d13ed6346b942ed23b69a36ca66bb9745a17db6145eafc155fc15d4719f95bcb219b0e7e9853de2133d50bd297adc8ad4c425e23febd62d9d775a4d3ff8f49fa040b823f358d127e0ad0b907ed1171a124263d3d40d62fcebf1c64a9e4450ddcc2955129b85010639f48f5ee4a302957358eb64ae503f4c7c83a81eaab18e5942f6d4c12ad7f5fdd8f70cbe64885f5324cb39229795345f3969e1bad0446c234828689a23b95d9c0b2d3f90b01e0ad02213bbf87e132de92eebf2dbeb8922daf2b8244a5d923c11d11b89ede41046abf1515eab13d1eb8b73b595c4270b4480a92a1b34edc4445c5f96ae6ce2cc759acc28cc6feb719524652dda5a99d56b85999311a60d62cdb2205c1e8619bad2f4567873defb8c7ba1b9f95dd1675c9ee7ce5c56436d0191383b519911d4b3800a775587a203f600c8cb20fd4970c01a55ff0662eee414133214c8e550a70e6a1f9600581d1f580cd56b3a113d2ce9de2b8724ad1fa8a19e3161b68333865a5285d9a90ae8999dc3b740e1364efe70b1fec4ae4775956c4fe2fed6d5cfe50c548614bd8838da3b8e8ed3be0295d7fda7a9a43353f25b09eca2a157a9731a95e9b18f3c34661c898f288352c77184740fee60282a8514a4427025ef106db9ded429f9c3168de3dd7d5d1a395bbc577cd35e82156d1438f4c958a2450ab55434e471af3f6b849a1b0164acb83fc56404e3c43b710983b1435355e3da5f726b1d6281c2d414328b5a0dd5b789e8534931e89f533bcb9d18c01200638f2da3a36ddc499241ca55a448417c34094b8f22cb629c0508f08751ba7a1fd334ad88a411813d65c6f72c6c128e9c7ae2ed5e7a6f96317565c10228c3dc534def8ca06c824f08d49d766ca5462975507bb501f6941e01a458914a2fe13ede7b3d1aec92a38958fb1e887016d0102490e2369aa96d1c9bd05f8c02016eb55266116ed3438c3b64090a49002183b80cae8ba31ccb25fc06620b2dce326d7ff1350444f6b95df1b535cc62943e1b4c214d5dfba736308225b86b7284f2a76e17b7869129b999aad543c8010b5ea93d10e6c068c48b41cc6187f4caed240d1c8c4ff7508ed05647ec07cab431e0b0528ae3a1fe70dc2514475396b416284fcd9018300978e16f2238e978e1042f2da4ec12ffc02479339ad1d9ba770c9834eaea0af6470f27109fde806689440bf9125836c3874529966b2a7c05de0152ea0101a4c6149a24325a850227c10ea592e802216c1d95036419eb56aa68f3e630a68c22dc583e03f312ccf384d0d40496c301cd3e77b500983f83d064699e3fb20e82b241247a3fcd531d32b7c082728421865f41b71a4ed5b0751d9b4367c303f9dee0722e1f87620b4c37c34e931b921d5457b210f642c807dc48ff71be92873424cc0d106689928312fcf2470359528ec3fe59993ee21662804d74449669c29dca822ba98c217c0e1e04d8f842dd34c1d47448dfa33ce7731cb8b36bfbed821e0902c6dbb9877fe53c89f55ad45899da245c99821ce131dc3893f7140eaef680c7a3b2c54658dcd8922b22cf879305453ce9500f2ba7b528a78b986946f3039f3ec25d36b628339afc5b1b18d19b9c9db9ae780ee1e5a1c58f52d88b17c91b73ea112406630c4f10d220c5480cec8db4986d8f826645c48843c45b5d60c43495dd764b02cd377865ff1abc64c3705cd91dd1320aa64be7f36b9cfdf2cdb2e831d1602f83017153fbf16d1d41b3257ef031a6e8fa49d098a6bb4d788229d75e26081c48beead9746ca7b5606ab0dd2e9a7d3b49fc42f429fb4fd8a0f8609c1efeec35246fa56c1cfffdd5c8ce20f4d229601e7699c87186c4374cff175d1bf56d45010f38c436e091c3b02fe5cc4d90a3360b0a490033033333333333333333333ee74f18532e5b411657446045076454444da9e4f67f1dd2caed63a45da7c8936fcc579cd0a2f0b630a054571060fbd50ec3d2222d661e8f578c1d780532006a5808d32e0052856efb073ca39fe5c62399f582fcfd74a4816e583ec89757394f21c599c8e4727d6aae80edb71902291e1c49e1d2ae6a65fdd18df26d6d598636f73f34213e94526280c82892424f0e2125b7ca8eb17fbf375785b624b27216e3fe6660e3995d8d2758984ac884c4e893db2ee2391d4fd13e649ec177c3d2696c7a93446127bfe7c1d47237e20911289752cef3c2f57d4c52024f6f58b159a3be48751f3e2115e38a2bc68c4de817aba28719f62d4c6504af782117b9cf347e2f1471d6985bd58c4d2b926d988878bd4f1e0e0852236dd1c32cc44c818bc23117bb89e10ddc9cb14bc40c4e61fd3b9ba2fa2d37f88256ce503ddd2e8d3a721365fcde7f12c52879a6a095e1462d34b371d75d039b0b909b14734dbcf331513e10f62b109672ad18304b174ccee9acadb985d03b144c9e1b915b53b5d5490e00520f689796bc33f6624e345f0e20f6bfc380c12b4a3fc8db8ca0b3f2c979972c7bb146be43f82177d784b2772987f3a4c3e101673483b19a21fb58735aca5bb8a1036695a0f5ac58f230911a442cc831b3be798d5142e060fe610372c73f0503b4cdea1ce3caba52146320f620773f828a60f838f7675204cd8fc387ae8218d450764439c0ebdf3e5680eee7e1ced462f9d941cfc9c10ee2c6ee57c9c38f49d7329397a8a7b13381cfdda48a7acedf586c5aa53c8e6c6bb1c7c37945b9aa38fe5c90399db804fc6a4149911773694738e8ffe487575d51a4ead481d76a8e14996a36cc3a79dd3b007fea7ddffb729a9a3818f1e6c4b3e54cfb086ad8c5ef998693a66c053aae81d74e258caa0df8549c16632942f49871e7d94da118d41bfdc972b9f8d75e089c1ddca69ef2f686946c2701c0533fd0e7e81c14e21d54f68f4475a5fa0a3a88f62bc8f939e7a819bbc4f1923c5eb823f1d47f4453b4f72e1b043670b5785483121c5d697a5056295745e919188b3e07a12bb8c9db3381694ee4b1da40f83a65cc1f2db88619b3bfe87ac40c8081f7753f2ec47550191c95121f39ca6f693e33e4ea6c07cd24919292cd7e157d4d18e2b664a14be8eb88a4922c672050a84644a11e2df9b127b821f564e9d4cf18c7f39a1581247d383e81c45af09a75c5265fdfb4198097a74e7cb274126bd84e23fd4c9a96b7b2344096ad9e5981de926250958ff850de3518e111a12b4ba0e91a3f2086fe78d0c97ab1108cd6021a458a952741c12bdaa2a989d63a825bc28c29a827f7ad8478ff1a817bc20c23e1e7cf8ad55f8b8d321ac5b5173c754e1ffc394174258e3870719733fed33e2831741d8e276e02597a1cc3e08d113bc00c22261251f99530c1f72fc60dd5989b9724791c17f1f2cf173089a12a3f1e3e8c12ab152ed788e173c58530ceb3d39784587bd8b553c8e3282c8e69c95ba58f3323fdac5f87e742eb6cee11f571c99fe1c5cec1f7e45ba8feaf343bcc592a34f17a96c6c542f5b2cd35197723ebff3f05a2cd1439ad647d362ab689b59a9cff7338464cc62ebd329c9212129e74316db7ea58d1d9a1ec8e688c57a73bd33e13d2cf628215afed9f29c739c572c2978b01c619f31ecc715cb97c4ae90f6b2cf3badd87cf33accfcc0e3ffcc8a33ee5a66155b5e8c3f49d12fff6454b1d8071a52bbea7277682ad60c23a76b1a45c5f29b3659eecc1b2385a7d8924e8c7a397a9862bba8d4ca11ff5c1fa5d8e72ee5ca35293d3fa458c244c69028399f65147bf8513ed468954e4d516c1e522b7ad4ae8f9885624baf5413639e44bb1028968cd51c4d4f4672243790f18955f6b72bffe778e37b62b1f891a978a4c7504a410a4e8082ab818c4eec371b427f388f934fce89ad637d76a0763e0c36b1c71fc4d9fcf5a18965b4731cbf3e27135b9969e830e906137b64ea6526e17289a5bc673c872b1afdab25b6a91cb596522edd532bb18c9d6e3c8972eae9a3c4fee567bef142a4b39bc49e83158f6156763253925836ce8d86af3c127b473fcf9bfd4b31910c5a008925d5450fcfd7c179be1fb1d455a52ad1d168eae18825dfd67d98bc6fc492913f3ba61d93e99d11ab4d7558cd318bd8f472b8f90e3f3fa5b42296b01da551db54a13f89582ac7614e1d4cbe8fbb8288d5a23383845849dff4105be6a88c243e9ba531c4d2791134e54c6a61cb42aca96163ea94611e771062d10c9943fe5de8c87263280d624ffe6982e7bdb9ea0f41acfba934ad74f85d931388359747cde1a553b95f01b1cef4c592add0157e1c4369059f02441ec8f8c3961e65fa5e081daed57ed8e3e066b37318174d57197dd8aefc5286f50abb140b5a20460c580cff8f010b5640c58735a64e5573183186666328ed6111538fe91fb33b69ab0fc8d0c392bee30f720e35871eb63cac192c55904bef05273808697540061ef60f72394c692f2a4d4cde61d9dda0392e6e69906187ad62942ef34c61232f07061975d8ec64d3c24a847fe40183031500e30b32e8b074856d0eb4826034008cb7c1093680011973582d898449c99deb4056800c39ec1dec8f24499b424839e2408839ae0f2b2bc341298d94215a152459e8d2ae7ce923a91cc6c851deb0a9ccf88ef6861363f002a418bc80052da0c15740861b4a461b0c4b20830d5bbebc107aa73979909d0464ac6109f6112d44a5641ff96ad8532579761c6887a7cd18ba0219695873a6f267674c21e5d8187a32d06032ceb0a768ca410c553721c232cc4061c828c3b6659be3183af29da832c84061141ac818839e180821404618960ef33dad3c5a9af34432c050647c01bd502490d1854546cd3e7cce0a213ab8b024c971b08e335d47b26f61b52013beab292a430b6bdaa7b4189b9272c764618b1a92e61c84aaa50f16968fa3c3dbbcaa9b1bbdc22a2983559ece99ce7256d866a207fb214535e77f0c31554759c4645061fbf9910ff2836f04654c61d3641b3d5c4b11428ecb90c27211344fd28f4781c29001852d522a9b10cb03329e40619806643861edb0946eefe38fab8989414613963c5b9ac472258309ab44885ec1a3eb88925ec2b2ba511bcaa394b07a9c755571a61de29f84e5eb3e49e7e82746e92061efe0c6722cf8e7ae55c611f6d1ce206929334c906184d56ef24b3b27b1ff4b11b68910aa936331e8882083086b798cc53c5d515a159731842d3d4c3a5acc517994228445b6a38d29567c6c8441d843cba4ffa1c5dbef5e093280b0864a7fba1f85a80b292dc8f8c11e26114f316cc889f58f20c3076b7e5a0eb31463240feec19253ce423d90c8e0c1ba13346c8e7ffe21eb2ef6e8a28688da711465de09401728805cacd79d729f6176f32127005c98337afa305ecab7584268ec8e793f6de58e2db61c4f4d3b98a473f2518bade3aa3821c86df4e8a4c5529743338ba89491cb2cf6a4fbf1fda4e677d464b127f5945692723c217eb1d8d63f34c6881defa51858ac1d6fa41cd3c771f8395fb1f4c458216a8e2e761cc715fbc7f00ddd7f69c59eae5266dfa458b1669da5c95ae80d21c72a16cd9c193ac947b44faa62e9bf086999d444329e8a2d46340713c9b36e2254ec41e5879ee3a4513cfd53ec1db2f3e7e8dc2193628a25c59ca77643a944b5946213edb435f90d277152ac1dde7d64ea20873bdd28f61c44f9f0ab621a3c516cb9463fa7e0e15f852b148ba77808eb3f16af82a0d8328e74f7070dd5a9ffc4727953b0c897f7c4be1dc6985339fa183ca7139be8a6919cf97062adae7c15d4ef4dac13762cacd5c956e4686289f5ced1a7dbcfc9d24cac398a1fffa57cbe0e3598583a655f48e6c894abbec416a7b239c59c830f76b7c43af5b9e6e4c3feb98e4a6c93c38f52f54c4a6c1d04b9c94192984e3e2a45b058eaa3c349dceb1f895eb1ff79ce71896cc545e48ad52ffde6f2898c84502b960e2cad64aad9ee072b968b1a3c471dac871fbe8a3d78dccfcdbba0aaab62b358b1085599a7f454ec3539c63c54ac293b65d27492633ac5fad17c949f2bcc236d8a7d2a8a7e18e2520c9f522c1da4501f6fd4243629b6f897be3a0c8f62aff1dd0b738962fdafe89d190dc59a03cb3fb1b38aa48262c91ce79cc29f9fd83cc7cf8748b2d2d313eb7cece95a0e5463b213ab9ef8d6ac87645372628df3709bf207e1737013db4ae88da8fe9f3aa88935c30715f2610ea58399d83b547ae78d1bd30631b1d8795cd1f2e3acb64b6ce1171e45e45de59825f60d2b9d912bb1f6c94e8688fb1f62945892a6b058b93e2a67124b685893b80fddad24b19da5ca633197a54d2456f5c83aa718128be75a0f3cc628d12364e3116b08192176828490d2e988fdefd36334bf375e471b361ab179c81c2aa36f44f1cb062396d9154b162dc50d99e3b5b108d4bffb6244ad88ed23cd9f1ed98faec724628ffae05722583610b185ac986f77ab72e657888d43ac41f33caee9307686d3eab061883d4e3a922e7385281ec71c360ab17a065d35b16c8310eba5cf133a8729c122350853144926c182664acc9917bb7d151d475229762f0317bc03fa3b40f53270c1bb18fd3330636c0862f91c3c6dccb13fc8c76328b51d4908fd29c7e815f00b8e1845607000021b5001ff0b620003176c00629ddfbb8a20d59126e90f4b8c1c749ce3ad844b054d83a21b7e20a5cd916cc4d8e8c3166e3bec899e2b7ed4e812b0c1872d3cc6b80e5d1562086eec61598d2be961af0e5224f94451496ee461eb407d54e247860b1b7858a5426deccf638c707b0a581001b371873d99c71c1ecef5c7a8acb061872d6ec6e89b348fa1941d58c2461df678d371bc9ea3a6c6720c2553830e5407c2082305fd1e46186900e0c1061db6bfa0a7667141f2ae3bd898c36a514f3b0e3d8811e914c80006ff0231acacb02187a56a7d6236c6935d73230eeb8f7cd8ea7082c31ec73b7cf86b9b83fb150a1b6fd82f4a2fc944a496b0e1862d47d211c62b7e1446d2066d62d8f0b4fc1843e9052710834847b0c1864542baa9fbf0bbcebbb0b18625ba334f4ec307321e1b6ca8619d1cf3713cf02061230d9ba53dddb28931689a52d840c3e679fe2747a1d2a362a4848d33ac6192439f261b8dd7d93083b5a93c67fc9c2ba75ac44619968d1f5f498a18ff396a830c4b5f779e1cfd76e7cdb4d818c356b751d4ae330726991cc28618d6087bb27173ca396ab711863dd62cd37e9cc3eb0d9960030c6b7a5c91af3e2dea245f062f830c605960e30b7bd08f9946626622771898086c786191187a55d7bf7f57cb276c74c1c860830b5b606cf3e318912a15b0e005072a36b4c0fd85e7c8267b4f3cb2700ef663886b1603830d2ca0ff97caa30fb553c48d2b90529454217485a6a41fa4594dcd7167c30a4b4add6190da8ecb2a2737aa40613860830a6b508ba013c99ec21e379e4f764f747a18296cdfe561e8f428c593e04614d68b3322e9621c0aabf6d5c5341ffcf6739e805aa71472c2aa192d84b1e05139ba34a13798809967d49895a29431d858c2bed1e392d96c881307146143095b8ec7287e29768a104ec2fa7b31663785a48b790e6c20614bfdd0cba1840731c5c040062d380f6c1c618d12fd92c9870bd6b3a7e00463b4211434c760032f70406e1861bd3c4d3167df8e49274611da8d226c17f27e78a2bba19a0d22ac2156f222472143ccf11b43d83b82a4c6b08f3b6c08a1d431a7cdc18f1e84652a25d191ccfc391a088b9daca5cf61ace8b0f1833d4e89ffdbee3ff5a80d1fec71bc1ea98cd9e8c11e48acdc5d1b9285b5cdb0c1832d8e9ee5a7f97206b58bc572280df21dc7f36cba58acd2850cb9b93a86492317eb844c3ccfb8971b2e6328b160056254190d5c2c92ee52ec9c2b8e07dd184ac4582004621840e316fb4e58d9869831f95e010bcc0a2e508ea0618b35737eb8f3a7d7294538d0a8c5d67511314ec885c99c1b68d0c2cce26471b1d8c27c9462249b2e4913090c0e40008c0680d100a3018b553a2b638c1bbf26551aaf58365de6a0c42a6deaa7e18a2d2e9e7e8e29fd3a5883ccd1068f30c21885062bf64e1f918f630839edd358c5127b73a70f44d450459181462a920a033450b1c48bf55c8f231aa7d8c364dd479ab89f238729d6394b118f7bf37a0a5918344ab16ac418be83f41fa757a45883e4b8122a7f804163144b4ce55b371fb7c27f8862f398d2c86f4c09c5be1d844bddb592104e0d50ac513afd26680c4f891181c627f65d89cb70e2710ebfd4f0c49e3c445f8c9139539a14343ab1e7bd9e0e3d857879e2632899156870e23436b1e5683ee14294b9f963c02ff816b04053a0a189fda39012f56a564d52185ce940231365aa9586e861b14b553246d0c0c4f61973272c5e0e3a648d4bac132ab93e4a3950c02a3007d0b0c41ea93b3cdf4c992e741b00a30163c0802350aa05ac8209685462c91f44ce13d5e195851b0627508106256e1245122612843420b175e478fdc8967ae8a6a0f188767326e7eca5b28e185543d0700419b6249f6cee4e9718f5038d462c16d42b5aa7ddfe48d72e683042631185f8e5fbee508286229699da50dde8b87369ca82462230930a1e298967a594295db962b41cda6a84c56081239142c4fe4138fdf0483faabe8af2a07188eda2ed5c6f54931c3784691462dfca88121e4386b552c03360810a5e032bb800180d88820621964ae79982e62811f35281182948017759c1035a6310c4030d41e8023402510e1044a6f107a3e107ebc31aef63489ffc8f72f06111d9b1383ae9be3e7bc003f17821a7cca1873d669da74a5b1e96abc81d22e544ca151ed63c7a973a88619246c71df6e09d29ebff294e871df61ff15dcf5b62317558b43248ae8cd10f930e7b7aca70f9c1c5da6b0e6ba6e65adcfd874d72d8273a38899e23993cf938ac923fec50f146a5d270d8d37f0c61e3e420aff386353b45cd697298efa3b86159df3fb1249f1991b761913cddb153a8b2aeb061f1ed4e1a348e9507f51ab6b8512b9645f5c8a186a58387895da44ece9186c5327fb2befc4183857106d330c3f2e171295ea60c4bdec4982ac71dc2a40e19f69a9cc33b65d2fc8e312c99fcfb736f72102b62582a5e448a31e438211a86b5b2a633e86d8731088665e2f242eb73e207f117b6c9b4a9cbe3cf51ec85fde4c3130d72365977614d217577b91a2eeca1cf5b58f42e2fc71f464d1d450b7b5d79a9763cc93ed064610fdf913c0efd9712192c6c9f2b860b5b61d3f557d8e359fbd5ca32e9482bec69f9316c4c3b656615b6e85185a0653d92ae4285cd83aaa8b1334da454a6b07fd052cdd1c875fc4b61318b1172fa0f76b58ec2be492f59ec0a85453cc646bdd0ddfd9e605aec577498d409fb5aed8a071f8718226dc21e69b009e641cc5f4499b05c085e39b4f412f6e0763ee828e7b9d128619928cdcd91e6ef2593b0ed44f87832865d8848d8d6ee73ff4ffae69647d86247e6bd7927e845d2085b6d8e3c52fc9c3c3f8ab0478d1f2125f3284e92085b071b348d6d43d8c3d8f5c9c310ea83140a614faa9962ca5a0ecdd708c296f1a71fa2e7cdbe3580701a3fa830347ca01a3da030ac041a3c58538ffac59ec55c7817c499bd0b9ea52e3655d5d8d1814eb4602eb65499ec3f5fb828a6fcb24c25b95bec31731873af872db67039cccec15c8b559244f494d568b179764a316de440feb4592c39727df8ce65b1e4388e831cc649a97c89c53a51fbe32fd458320b165b75c7b08ad02bd6b0971a9a83acc99172c522f12b52d577471352add823c7293b5df2edf88315db95c9741052ff155fc5122f3c84f3d8df711852c5f221875e7e1643d43f5ea46229fbc8636954d4c7112af6286c5d8e674f43fe5364e99124927595a678618a45e207c13cc54bb1e5e8a7be7246ff0a29f68a986a55a2516c1d87467c024b48c9f1e6d42287c684a54c3c9324cb5499f912f65ef5d4c1d6a3facb95b0d87498f3072b095b4e4c0f3e8818e24c1c095b8eb3d6bf59e281c711d68d37f6f1f57cdc1b61ad541d21cc2fc25adf15629c9d088be64bbb9b8e37920f613ddbfe2449a552c485b086787eb99e51f37182b027cd15323f07084b54be0cea9f326ffc83c5b66e2ee8e50d1ee3834d76b7ab5473ecbd07eba6c9e70f529663ca0c1eecc93f8e9d2fbbd8a726584c7aea79a98b25c72537c9635242968b3dae86301df885f5b8d823335bf91af5306fb1cd6d5ac6cf57972a5bac173a6e5ac9637d215d8ba556324e2e558d615aac757193d1eb59ac9b246c55cdb2582625d5944f2cf60b3914991ca7aaafb0d8a27fb4f7831ccdaaafd8278793a2b3259aa92bb63a99f4514c911e8aadd8563ea547bafd2988acd8544bcd2ba5e70e71155b980651894d7711aa62e930c7a50fbf546cc163eb76c4c3b0a0628b96b7f2a64d93143bc51e7e183147e6d1466aa658654f52a5ce2ea4ac146b089e7350ba721da6438a55c2a67786c919c51efea4afe91c3b4792238aadff723bd45c87dd118a3df038eefde900c56afd299e7e6687e73fb184d14e3a129a2c7d4f6c79e329f7e2ec79df892d52acd4b9f2cf853c27b6cc81a74a8eb1e3c637b187857a5021c3c6ba35b16fda8ce9d7c9c4b6a6f9193ea55e9231b16878e7beb134f79b4b6c769673fef05cb1369658afa3b50ee63a7ca595d842bd64772ccac449892d876312463e75f4e524d6f5f063496c1f66c410f34e48fc3812eb79ec45310f19c763482ce9bc6fe62c7ec43e39a5eaa8be596962476c73b12f62f9d7d5841bb1aff55eea0f2b5fea8c583347d3f541e7a84e5fc4a21dbce328c3a78e6f45ac9e23e8796fb094ec44ac1e6d2ec6ecdf0ec38858e27b7ceb23d3f4f121f6a042c4c40e63e33786d834a58d7ff9a7624e29c43a97926aa6c8c1e44288b5f73388f5738453ddfa8ed62288c53ed85c9f4b63fc81d8731ac9714e88ee1c105b0a993b95fe618b90591222e9874dd5e33884fbfab09e87bba97ee6327c58e274dc9da9e9abb3872578643161d3c3e2c947e34ccac31e5a561d66fccdf1b0495ec89b7294b9c33e5ff13a6dc80e8b4da6e95a4b96c37558535cf11f0952731143876d7a43d89a77fecb1c4c5719446e3be4b085a49613251c873d0a338b9296227138ec7177c40c29d88fe96f582d9447d210f3cfee8675c253ee359f5abb0d5b38dbfff438292d6cd8fffbcf722ce5d9ce1ab689545132793eb4d5f0d9ac96f9870b01d2b0777f9cd3a3e4e92ba610000d4b8ef13c7a12720e35850067584264a4b423d1cf510a01ccb06f8e49f37429c39263e838058bf34154c8b0672e8f266cf04bba8e61efd8eb90f24afc388a61cf90333c8710c2272f0c7b1c65c518ac03c392d6df218dca466f5f58ebbbfcce438c299b17f698fd95a6831cbfae2e6cdd3154de5c61739ce2c2362ae2fdeb394eadb6b078bc1632c72b5e3a69610fce24257c52b2b027af1cf7f442c724050b7b5c5bb71ef6e4a948b9c21236a737ac5658636cdd27afdf991c55d8b45662c6787b93830a9b6afdf7a70e93233f85a5738e87e65258e7378498233b0a9b860fd594ce76830d85f5838ffac454a2a7f304d7aacc5227ec84c5d399ce57749c69d384bd3e49928cba546165c23676c1eee2732431b884253bee24e69d73bca112d68bb57e3907ea71fe92b0a487d2e87143c26a1d77a6781a5da71d619538a1df7567a39611f6a0c3cfc104ab087bba9ca3c79cc22c2a22ec61e4402b8698e11d43583ff085b0a49f59d30e151e4241388d7698472e4481b08712c9f387b3fe60c9e16cf5c6da99d5077b6ccfa6fce82147df836dffd4520e0178b05d8ea993b9c3c3ca2ef69c15bd6cc74c43d7c52aa11fd24ef82086782e56cfc8ce7176f041ddb8d82ced2ecfae437dfa167bd039e7f8bc37b1c3b6582323a5a550c9c36e6ab1f9787d4986164be4b9907ae62a24cb2cf6f839c60b4fca82e9bc69f922188b3d2ae64d2977b058369c48fccffd70b757ac2954d82bef8ebfcd15ab651aed8fc4b4a3ca562ca3a162e9d827eb50b262b93849e30769157b7690ec4f77ffa12455b1871f543762869429472ad6f4d8e0a12ee3a8d86287468fc23fc596f346c58e6e8aa34895c34eb9147bf0413bce2965d492146b1ad39c1cfc24067b146b4d4ea69b15c1bc16c566ba997274ffc6b809c51e695d45ac3c2836952dc9ede843e6f289c5bf3a3c09494f6c71433c9eb0995d7762d91c87b171839c58cc762f276f868ab889d5ff73cac1869ad8439fc8fdbdf1287f99583554120bb39e7c3c4cacd191a474591fa4ec2eb1afe4f92876944b536789a5cc3c8e300d2bb1adfa8979b49d671752620d95fa6bd636c4239cc422e269c62793c94e50124b4d869190bc3eb8094662ed0ce18309516d578290d8e7e38fd873901dec767ce6fb1db18749d2e887f1792cdf884d35346c927db8e43362dbd8f834514923f945ecd1c59c2a07be21d9ae886d3f79e4b0c2a4587b2256c9ff41dde54de53822f608311deef305cbf921f6c9b890442af57fda10cbcac7c1aedc85d83ae490bfa9bf1a6942ac41d4cf3ae22ce641eca1e5cc102387153f23887533ee524a9b402c415637343bb40e05c41edd9984ddca1fb691d0d071a49f1fd63c125511ce731cd7ebc3de410ed223d992cdf5f890c65748f531ddc31eac4a440fd1a076ea61c93d917ff5174f9379d8a398e62cc698fec18887bd2b576272dcb328de61efa8738c5e6a9e163b6c9632e5102746ad727558737d98becf1ffb8e0e8be70925397214d5b4392c391fd2871026656972d8266e0716b957214217873d777c1735f3cdafe4e0b0e4941cc5efe4b1c97fc35e7d5ab39d2a4ef46e58f32783e54587cf9c36ec71ecff90cc8a54396c583f07913171124298d7b08498d63afaa7a01eab61fb0a4133d498a56fd2b0781ce54a7f2968d8f483c5c7609a9a3fc392e47390e8d50c7b98463fd8906375142dc33eddd751ee930caba63c29e4d4512c266d0c4b8af27169d36bbd3231ac1fb9ea9b270bc3b2f639d52a59848e0c0c7bd0645136c59ff338beb0d5c4b8d12e878feac30b7bb41ad91da70bab4cc78cb8ceb3e5c185a536e5499283da9e8e2dac1ecee5ce814749fa5ad8463447223307ddf12cac9652f37ca22a36c7c22ab31e5fded32cb5afb05896f5ac45fc846c85e53bf478ce2fecc54d15f6ce7d26fd9155880c1516cf1142ca19b5189529ac19e6e96565d2b94a61938d31b3948cc252e28185d0e8a8972c28d0416db237f7843df69f47a8c879ad72c262a93373f2cfd9393561c9112cd77eb25031524c58227c7f4829648ee425ec3b33152f7428618ff6743e3a9f8435d73b8492987af946c21a1231a3ec3ec23abd7e71f95172dd46d8d7739377aa4d92ea222c21e440ce362489f21061f309eac9e72f22748640d40f394258aa43fbf3287dca8f202c99966fd384306903843552a58ca0d761ff0393c8554a19e501f860938e599aa196d23603e8c122a93164c6d8eb1533001eacd7390e0fa32fa75d77b14751bfc277f09d5075b174885751d28ee538998b357dc73b91272e364fd69d5298e8e846bac51e4a258729cd9543916cb1763c9f982b86e6388e6ab1c50bf7916584e57e448b7d267427af9bc5363db1cb27a2c5cd64b1f79de6deec49df298ac51abd7b39696fda5c57284018969443d1dcd1f322a60e0c7b1c4968f80f2c87fef5856582fa47ebc1a4ec4fbdb05478904e25315fd8df85bd3c428733f1fbb8a25c582247592107fef94faa2d6cb923f1a9b6d3c2f2fb71dacc5123c80765614de9ab42a8554769272cec51c36c64667685a543931ced8939e82badb085f34f52b983aab0844dd1f7826ad89c112a6c779da9c3a78ba5a74e61339bed18319599440a6b9ffec74776e142ba4461bfcb7164e8cfbb29e5a0b0d6ec85e84edf1356cbb9df9424ea48d94ed87efae3accc1f4a485a1336091dc7a73eac8af599b067b2184bafe3252cf7e1d7aa97df97494a58620c66117a269fe99184f583f24b395f88671921618ff6a2ede7a03ec2aa1ef4644f5f4ae9c346584d2e67fe144b39774811961ff990323c4484c53e4d74b42b979ba30c6195bffde8fe1ca6da8a10b6f9ff683fb892f4601284f5bb8398bdf9373fee00614fe9f43c6c87d2f9f407fb5e8c31eae1f2c12af141ceb9cb93c47e0ad0832de4543a8964f744a8003cd8430b951fcd7c249dbbd85288bc7a397de5fa28ba58aa3a55c7291532c4968b2d76e75decce70b1467cd2989cc36a64bac536e6d1e9413bd4868a2d36eff47c1fce558b3d8cfbb03bfe458ba5264deaa0bfd3071b99c5921ef7c7e1516c089d92c5e681751c9dfc5cd8c562b14dfcfe942ed4e63c2158acb139fc302adeedc7dc2b96ba482751ca2772725cb1c5494b13ad7ca23669c596c1bbb23473562c112ea63cbae21fd76515ebc5e50e16642648c6aa5873c6d4b89893e4a82915ab862415d1a4793e4b54ace1693e8e31e3a7d8bec387749058d5e16d8a753dce8dfb102ac566a13b88cd657e410a3fdadeb590e338a3d8fcf2bf3a462e5a8a88624bdd2f0f2943a1d823e67065430e0939bd2f40b147951e8de627169974b9d36ff3c47695834712b677620f1eaea3e4a0e2c496628c96674272134b86fea789bdd2721c737c1939ae9309f62e729872fc694c2cb15b317d3cc6e338ec125be7f88925968be3732b9b15c22f95d8e43ed029b158d2a4b339928ec3844c620b990ff77c63f47c67f6852496e4e1e428471a31fb22125b340f3b5784cf41ac1cf60524f62042de30c1738f583e6c8839f11b47ac39f6c7a6df1bb184d64df0d47b9339f70523f6980f2edfdfbf883d908d1f737c4ff0e8be50c49a22a458559aeecc44ac3b5d73174ae4525d5f2062891cc6ebe829d5a398bf38c49ab1d91f77a80db1d79d7e187443995f57f8a210545a898f4a6632882f08b1c781f87d9e8abcc00e5f0c6249b65fa6e10b41ac16391ee5dcfc71103b02b15cfcc7814d7c24cf7100b1a9ac97c4e77031235c64862ffeb08593b31cf346a718624e701c32d800181ca800185ff861195bafabc8712c3f0c4603c000a3017ef8a20f8b88a405c967fe133bf8b08739d8ccb757b9e314dfc2177b582364ffd85ff494cef2851eb66049f2a527f58b3c6c97f3a3c44c1e785824c41ca995fe3b6c112646a78afb1f77db61f50d1b33cc72c8a1711df6e81c3344bfd1b4390c1db6341f245e4a61e561ca1c96903e3c85e84935e790c39e3f8e5861f31987b5e3c493ce6938acfff1c72944c40fedbc61d10f991e3eaeb4a4ba61c92716fd79315326b661df891baab303a9ebb061f58e37fe236d5a946c0d5b7414e347b531b4a2a586e5e3a79a24f93ffc38280d5b481aa3ec268b8929a102c11768d892fa6dcef871862536ac7c52cb4c6637c3fad3a9bdb1a3c7c97919960ff123dd8b6932ac7261c1e2765d0c518f618fbe3344e56831ec9d3173b82ebfdb9c302cb9562e36c51c30ac9be3120f316da70dcf1796d38f2a1134f6c21ee233ec544e98e44d17160f9353c875315c583d5f0e39ea34f935992dac1dadd263fdfd475cb4b0a4f881aafa8605f14a16b68d9d3e4c0c21bb03150b4be8e7f06307d6f7695e61f990bd9f251b2a2a6885fdc3302b52a52112c52aac217948133d33d12ea4c2d2c1e424979262c88e9bc2ea6106abfbca817ff449610b6939955568483a2f0a6bbadb3c1baded9c37286cdb156b1e7ce4d0e1f6842588479a13f693c9b0da583557a126ec19335d293deeb8723061e9a8696dc4834f155fc21eddfd6c66ad84fdf27afe75c7b313235f246139d154a96937d4a3025f20e13855e221cd4758c65726791063d41447087c610463b4dc11921a9275faef53db8e025f14618f3cce786939277975226c7e1fb226697a089b6a188b398eb1d4b385b084af4a3b617510f6f8346fe65017314e07088bd8479f7c15365ece3f58c63b3d4b43c37834fb600f8dfd182a971eec1f94e9a62eed10aa7ec18325c22e2b2d8faf47e32ed6bcf12c867ffc7043d3c51a73b08f54313356d38c5cac39e86c8f85e5947210038419b8583fca9da2947a8829c919b7583fbab4e12ff63366872d96201fa8f8e45f8b35e4871c6f54df0ecb438b45837c0aaa1691346e66b19707b969f25864b1ec546f8eb4903ce688c51e25c78f636dccfc0cc2629da9e839eceb9ca0db2b3699adea78c6f2c10c572cab99723421ec1aa8566c52b16a374c45999a6b98c18afd524cccb936c72af60d279aae53e5364315abc5851427f7938a3d073194f7d7871766a06299bb8edef124077f0a4c0e669c62fd20a6ad49fd6943ce31c5ba3b122f56ccf387b9147bec89173e3f8f640c29f63878ecb14a47b164a6da887c153a679782734eb002310c116688628b0f9a46be435887f3cd08c51ec9fa46e55c8162bff594beff15700a5a30e313286816a4e0046086277046276c062756cf7176f2d2a89487ccd8c49ef323bae51d754e9aa18935875e9ac34bc9c412772279bb227298818935c71caa7545b80aa91997583cca6b21e38116c83e81a2618625368f9fbff3c734f65bab6046256c0625ae4a306312ab47b998dd8eb437e7904485d18048cc88048501099bf1883d4b530ebff189000c6af01430c20c47acaa9131c794f32c30b298d188b54a2647d293316490c6502ab198c1887d73704962a694e245c56e3163114bb408fb30d1a2ede41c180d00038c0634c1c50c45eca13c5e11f53ccf9c1c438f0146621cf58c445c59c00c442cb1a5f339c7bb923cce21d648c942e8ad66862196efd44b29c69e5c9dd3c28c422c95835ef4a8c338f1e384d8ea73d073217c9494cf20d6d4bc136f3c3443104b56fce062d86820d6b48ef3ce4731e9c7380310db46a87cfdd1e73a510531e30f8b57dfc8457cf861b3ee8bb94bb3243ebe0f76aaf80fd22bf887197c58fae37c473b1b92e41c1abcafa0a80e33f6b0869c723c1d3dba520e3d2c9923d78968851c3af2b0c56fe49acb4dd3793cac1d32cdceca4406fb0e4b90dc394a8f245fc70eebde249ffc9c9cf1a9c3363329a4afd73ee4d061938cab9d43cfd49599c3a663b143a5997ca92287757230ebb4681cb6dcea60a726c2a60a87bdb3f373badfb08694fe9dc92b2b896e583ba79fc8396cc39e662fa47095a3a73bd8b0a595a97c47c71a563551554913629ce450c3aa61b1f26ae6e3f4a461e96072f8ce331af6d4c1a33c58de25f90cfb5afaeb68636fb2d80c868f2eeaf7c79461c9944a2e53e7868e42862d75aabadcd17a8f3a863d900c63991e49dc530c4ba69ce6fcd37ec8330cc5b0ba39f70886edb2f387f4308aa4ef0bdbce874afdf0c29299bba937ae58df857dfd2efc375cd872a42a57576d61f9b07b638e480bdb5f2a39df4a16d6943e59397c6061e9c8d4f8b03a0ebf2bec1de27acc955b61cf18237cfeba0a6bc968e47c34b18f4385c5b42f9c5dce14d6c9918977902421c552d82707972fb47278394a1496b22ef3905373c81428ec1deea61cc347fc4f3e6199e0717c79d177c77442e751763479be260489eaa8148ca542e221d1481c12090562601804d77c00331508001030228ac4c18024c8538d7d1480034b18123424241224180e0c1214121612080c080a0684c46040280c08820161303014b8201981f100860ea51aaa0d55046a3e947946e998ae09fa1d283f50870eaa4fc69667c4a1243251718c67715000950eb50f5548150f353045dd03f9c144202848288950c81c752fa2feedd686f2421141c9f6281d3a0f4e6134941eaaba8f8a633be153f58282877203c5056507e54aa0fa0076392b0b14e78990936449f5b9a0a6281487a729fbf14b0a589e06f5de5040ab76847bada1d6eb93ebfb048a31d41b8a10ca1eca1dea39147b42d14ea0349f7a4371a19042e9423154a8be61c7f1ae0b8a524301b5ca323de3440193af94839ad8b5c4c52d720095eaa0fae643548701953c59f44adba6e1b955400a6bf7cacf51409ec723321d2820c171a9bb7e143051b4269787517d92e138eaec262f402189ea1b143381a940519ea83ea38ba5a74f57a205054e507d96007ce9a7522b14ca1050c037640dbb3c13ad4205bfe3112735f721ab8ebb5ea3c961540b9b18e0d5c7098e9c00f86e5c2f87a48037b922f1ff6e50b4899df3d5487489ebcc87bed39be14630d7e2abc2fbf3dfd077fe8c162e86e4ca065a21d2f0388cf4bbe68759001eecea057efd004d47dba882c2bd4898929cce0a420e66f3cdb9a59de0eb41ce7fd85461383f64ec70155a9f79917f6fd4cb6248e1b5e8f6d1dd3900c2a505350c8ee53d4a88f1c94746313b312432f6cbc492e87f95c9272dfb665e6bb19e3ba63040b303346b2dbe73fb2d112a144e0eacd4e80bc9c9efe370242d2699ba0810ca679c738aee8c88a96de514ddfe907de05421c05bf517211b1e1c29b85b408e9e81a8a2040c3cc673e7590139855262561b76123e606d5eee288a0a26a4f8c2c1f9982bd30d72f7ffbf1557b8ae409b73e7629c2c0ee1039be2c7c7012b8df88d7b245a331fe2ef31171a7ad44342e7a18ba5fb04b7c3ff51b897cebee9375556e1c6b41d9102c38da2100a852b076f6e32d328c492c6af11dc1a7aa157bd67330181810aa13aa20304724da92a463f2107426a46f7516e8a32bd24e39438d12775687da2436991d4433fd24f5eca1b35f73ae129a85eaf62525efc20cb4d264d69b0accbf8ea05cd8f7639272eb409da07c8fd3b8e7f66578490caed0efbc56f85f5b44d0204e42b37800a293a270084cf5f2593583947acb2086db809b62969167ee704d32c1e8aa0b95a69cd343573b1564a5d03b84f023d54c5118e34cf7dbc2d43920ee827db57c672d0eddde62389a2e2848c88958989281c8f6822d627e3864e7dba4b762c85d41423f198a88496272b30ea985fb61ca33c3eddb9a2e7a1e69ccc9f14e689230c51ea036a24bbfab6178e32a24b753743930c6902f2755697a0de83c90772e1b76a26b569c73b59d5cf628a4518acb3fae04460f56931ab28668844a8dc279e3730f64266c453ef0986fbf8b810dda249d9efe6223cb60a8a584220765f84689b10be6018354906023e84dbeabcb6a785017db7d666adf0fc5c508d7d25b887bfc23c7e206dc8f974c10f5b2115339b3b20f7b850458a23621e921764c196d4ec2be771628b4c75d3973ecdb5b6310d0032c361c91d95944f61a40cda8b5bb8d666479a02e04198d975d4d94bc27514227ef0553f95bc3312e019f8b836a57fd4e5c54c0f55e04c468589df9268a9d712d050cadae0b5ae6091eee7addbe76471a6fe7d003e07adc4abfa7fb7b39a44c8ef84ac32723e24ca7d9cd591c42e1b5e98ab40ae38bcaaa061a43ccc00793a219112685b4cfbfe8b47fcb97b0cd672a3046eaed0ecd46c752d2c2b980b310258bf5f77ddc7888c7327adad18e4c6462aa62d3c03b4ea6805e1c1b2850ea2c89ac0afcae3e18d434d9ff276b80498f0f0f5cbe8f031c52fa530a26a10fbfccab7082d7e83a0261dd014a03ceb1711e0f8c68fe37b851c6266da6228b9e1688e5a035c4a42de227e48fbd67dea1d236085351f02b6c9dc1597aba10dbc5c98cbe42d7c95b12882f9e31910450191b008f2fafbe39b84b242c2857efee5ee8db6002ba4f03fba709de5ca7740b5d7e770c783a6c5c1753a27016f7bd82c14dfbd53c291c2c0ce7825bc5a4a52da85234655052b24976772b64c6164458800d199a0099aae9718d046db9456892a9a640bd5b9f20c45208094120a52a403858822939deda804c058ef368636f2386ddc6c7ed82b66cf8d309807ddde091adafedac03bc6c9e89c9f3549321c3c055d4b17e633320601e43964de972907af960d2d50066a6a735f9c9b0d3317c80e59690d9c3c139334018130efdd472bef60ffef11007febe713633796c2e75a0800ab7144651ab5317a4f9daf041750599fecf48eb3baf4ceed66671c8b24636d9ce556b6c80f45905466892cc232f50f255b51c21e3cfb940321aaa8c3ca18d40ddebddf8a335b247557984bdef19a37e5451e7f5e99bf97a68b60c567dd871a3d159a72ec7e90a8545b6c1f7e4dd9b2d68dea3f85f6d90fe7479195b76886b24b9b0a96668f6fe22271faa18ae8947eade37f464ceb71eee5942b3969f6a1b1027a76a7b70dc1557df4bc8bcf997bada662a8dcb000ecc0b00f31ad810d9df0e9cfd2cc8cbf62d0e5e22e33bd44979474077026e4da652687b8b49980422d15a58636664e534c79690a7edd8e849cfe970f7ae0939ff4964fbfb866ad604b759c597e1e477106636ec2821c37d94047bd55a387aaa51ae2fa87b88b33aee12468f4e2f194c379079738c30d0ee122306cb834286672e2f19be404cd75f5dbac5b6da8a4cbfa9ce5228739cbed9c73312749f7a1ae63c2c2f9a95589b0020e6354f0c0873005634a9e148a63be61039bff19463b842a36957bcc759cb4be485b5cb99b8d05abd4e51b94c7ac8fd4b2b8f6991d7bc4031576ac1ae8bc6c07cd726d8ec173610474a0210fc60195f4ace12e30ebf067fe3115a740bfdb955d776ecbe8417dcc67fd6c073bbbe3eeedf869d8b761926b4b42aa507d5873bd23db4cec2687e114cc9124e60c0f0b8b6022784e7a4a5feb2f0ad83c1ceed2cebbb9e396616f9d0ccbff64574ec36a53e986e516b6428ce062bcb966517d99529be2e43f60d097b0ce65c7b0112a63ca1402ac9c677f7d12dce30c5738c19968119d549ee7c23d8629cb6fcca0caa6709eb45b07f6cc3a37d46779bb9b199bb4607d04598897016354f736585b0176b437dba65003bc0f78336be68082fc7896ddb19d322ed27a4af83dfe5a64b77585a66c968c68e95934899b9e676612aa3cc2296f7aee43e36b55edea3a0ce9909e34d422b951c9840d08d53d176467f8fa97b88b33aee18093b811b28f6cd97ca35dde0e190317817d1b49cfc01d15dda6a6b09461098ac7db4e5884a890326ebf8a7d477ed8339fdcaa59bef9332ec11072a9f3e9af718833dcc6d9f02229f73bb233cbc708c17dc9aaddee0f7b684d69fdcda63aab0f2b5a31e6a66cad2e4aefaaae08f77b927be7abdfe9d1d77ec019dce00817e18bd46cfac633dbc92cf6d3b8de3d9deb9892761195b3c60c45ec2205417651e35ef3cc64d88ee17fe7973df36d6e1f4f90533409924a9fb621ef700c5550861eee4932d410e2798e99ce6cba4f8f4423d0095114b708e2c94c4838dd8b856449483292b33657b99933e399d1d0082b39b891c7591886a924a7a2629973ca706d5fb92f32851e41150f852c9987a100aace729bf31ccc29a773cfd5dc289d59c83def40296cf914d81ea1f2d92e8ddaa8808c6d7bc5cb709f43883b6e7d1517c8e5618e2210b4bc4236b79d20246868461b49cee68e654f7963758991e3bffa731a96ed0d06a1f14ae1ee3e83ed5ab258698cfa6c7199e0ee984a14078d880cf2f4b746befbd928ba46084f3f528d8fc39b37daa903520182f2f68c7fcb99650166da5fbe84f05187760a686ad8fc6819ae5933f740cc15e74564d2550e183ad4d22151abc8186662d442cbcc2b8a70c913313132cee22baf051432ce51a9799a3562c69d1cb604e00e825aedf2d3a938b453e248e2baffc233a4050daecb674c08939dd05fc5bedbed57812e9058f47972cbafd4f27f636942746d634eb765e0a63e824542edc64ec985f1ac1df69a81282cf3e22592e7caf6373b8e9ebf94d388c326acf8d9323223cdc1358103420624b5e0a1e38b2b5718699ac6b96c7c866f9d36f2fc203cc882a26b8c4de6108bbc38bc60ab37ae54b741d8ea357c29836629b817ac6a25d9db990fa471923207f8479d2361829e13095498f780099aa1310cb5e61f1cfd14218e6be81842db8ad7c86cf71a56d8ef7d1dab1eca411928b75899d420b3c8708cdb8511d2594b7dcb480cd2454f0c9410b8631624e2d1ccfa45fe5c040feb890c44015026a24c75266508f5737e58f244fee46d0c3108d8569f6fa9e7923dd9edc0789ba374a5b9bd82d31c15da04aeb2c2810c17721b50e3a8a86828e8dbd010cda3020c3c400672278a58f207abded4e2debd51d84acb6c3b0627ea4b3e68cd93cddf2f908a0be81171eddf6658f5be2aa9d2ee22e85cfd8c79bac12f78638a349f73680c5603f84d22cad13b5c0c67bd507adc3fd6f1a8e748be7e564217a8428a21f72da2b556bfc90348c071c1a3d8202943238b30d30e33dc022c630f049bdbbc04acac30e124dab5a667f9addf6debb08521f6de17d3a4e928f65527314ba9f94c192eea104dcbc635ae2e63aa4102b6825cf48035564f03165e932f23434028030c7415be2226d9edb18081a6a9959c28a053901c19d8e520ed4d901774e3d556b8c1e91e745a6490767ea11707d744aa3dda26b993bb9dc209a8d076fa9658e73ceb5b0934b1fa9815dc6a95cf3ed6c129104c24888ed4bc8a352fca11caea8239c55b925d58bf8cadc2195e25410519663f82b6b2ff59001b415d89938a295a027186db35db81ea9aa73d3fdb8476e07dabcc2a87f96d9dacd7b011c544175cf8041b00d330a852309b050b30190533e75153e50c0b1db5593d3f08419cfe76941b4aac72314c35d9b7c44ce147c042068d992fa8e3c60dd06f23539fae115347377ab742e4389f2f1ecb47560b3ae26432c712dd55c6fc0ae87bdb4358c0acbd7bcd310e13af47b2e5e4730380e09096304694e9f9136211acef04d1a6b229bc966d50e33f699a4c842d352199f04e902569ecca49030cb997be68c6edd1fe370af3ad480dd4015a33093b9b3c4f62dc5c510d77173d97ab40e4fa1d7dd789effc137f90d4f606cf8b986b245a4c1266813de12629ac964ba38d03bd2cdd203a50ae4a58ab70a60bc24469e067e5888d6f58b377db46e18dbe5df1453e8523f84685f86a7cd5fe43b7fd0e0c941842e4bb13d936e0fd03430e1e0e89f88aaaafe98a27a361bb1979cedd8bfd89c7deb7717753e3e42e73181fbe0f9318eccd5d04a2da067f4dbe5a0f1662a130f544740c54cdbdf75ee87a18319573959abec71b88d89f1866ee90ac5dd400ac6dbd2bdcfe14d12dc920ddd50e2d2950c2c1f44362fc9b4a0fba76c36ac8f9b07f78355aacadd494d762cdf458a0d4b8a8a65406caad075a2b4557bcd0cb63aff8df24819ffa2e04cddb9785777e0221610cdd9e0de3e7fb9f2821ea872ec52526a055e474911923c82cf6f1316cfe3a5fe37233d1ed955682a7a61cd918679164f1d54f35db83e75262d0a7a8ca077ff095666b236c3b5a569f20e044ffb0aa08e4c1639d6187c3b3aecf00c97b02bb407de94741412e8d9327ae416fd3334f336879de5ccf7a707b69d03910a55a26ffcc360a5f46c00d618b650438fce29259d5a73f2d54c973040607889e6ae67ad5cc1916094fb1149c58c3f4bd014f7d5eced5d607748b32260050dfb9a1d58fd25201939e7da86395965ab81df139664cae2ccdd0f8e8517594e983c27cc9b45ca62cf41420d3048634523dc0d427dbaede8aacfbd90ef2eeccbe53b58fa49d5ce3ce316742db493b2d348c22d7083d1d626e76d6d21a64a607084b12cac4f3ac0f49b83a4dd013d767034514adf5bee196fa0e25e2c1f49945af1aae587dbd6028820a0578f2db0e4db19b0fe8e1e59571d0fd22765770dfa64ebc0ca17cfd2330611222277155ce72984c6b8243a66ca872eff4cbf3b07288e656bfb4c4ddbd0d3232c871a51b82c22f1f4252415036d29806a7c9146577e003969eb9efe21414501b479008975b6782f84a8a84aa2fb08abc8d16ad3165f01c4d79f5634a9f18c6a7ffea6cf6538a8e9a80f00f18fc76de1b8e2aed272b75fedaa544a009068356c32cfdd809f4bf459915200a34aaf00aa108c1e01159403eef69d5bc1df3437c526728c212d550856ee8021f0142d98d46558cc0b9c1274ddc0ff0df2c99376e63820a26379abd379dfec7feb72d0dc0341dabaf482bcf128685cd8bed32c9c32ecf3e81788971ffa2c6cb2b1179e52c80d5138a9659eafed36c605271a4905b47b442314a9dffcd9e299814de12faa52902c6e47c534ffc8f76cea34c5111101b8912c94cbd667edfa583c24a78cd400e710991a6cbf9e21d9297188704a4f50872f51e506a1b8887793c2917865969e671ba38f1620672b1beea6f9bd559035ff283ec9a1190f44b8abdbf2ebb9d8c8bdb8c47de7c33740e37a8dec35710910f4b8e911ee3b083bde71791c7eaa310415617b117b5cee0d67380feae9ed42634edc24fdc173db9c25ff4690c2a629567257d3092f9a729286af9597f37466140264169a500c170933c1c4dc4c474bf7464dab3f040e09ab5211f7a7cac0f32bf42ab54db18af15c04a4d64979b2d7fd18242b7c408d2e5b2de1c4b2d277cb68535cc059e0db2b037e6e51b67895cc0aac49319311cf902039d1590d41e8cb700af8ed4789f3580dd22f13ea943f125230bacfa3fbe005c21a1f21587ae5f0639b5da95610e60fdf301b2d159b00be2c02cde36940e2c812b7f18f0f07a87ac814b5c67e41fe081d71fa103a322c842537d25d78a67c31618b44742f820211e11a0ca870eeac3d2c031b8e70a46401c2e01d50e1e897f1e4f9cbf297f3b3850f802e274069f2408135240893ee0bb09411956cdae88a220141af88393d99f541d15af8bfda81aa0d573634016380b76406c7ffdb985d905ab836aedf205a4cf5f74fbe4e83e3405a453e73bd07e56e69cefe78915f04ed83b8ed24f5e2cf3d4d7320858383167f011db66f55600e70a02adb0126c812edd42f9172ed9163b7623b8302ca8d549f0d7ca3d2804ede0aab8a6aa950eab420cdf12c0ebafff715503a3b0810da88b7fca0968c15a0bc6f497af2e61c50612be6788cb45327d460ebb1e862277415cd314fa32febb3eec080e799542b04bc95b9913655b039526eecce4db271e5b6f4eeba86ac0f1b42025df7af0e0b725aeab4859860e5711b272868fe1ba2f6648eb768671802b9e2e6fb28ed128bf576996614ec49713f49948d7206e3748c0183ceff6cc8fdc114456ee27cea5bd3b1518e84789ce94e9da60491004d57a68eac9af9b42d670f5aed0fadb0786355aa55a5f1bf767ca3bf2b072129d2cd7ecc81392de6316f5e45be6bd8e7586cf5ab9a7c288b23d5dc8dac72647fed4872c9335e054c49ec81e727e105d10ffa97bdaa067a0abce244483070193b520bf3119917d79c32c8b9ffe4b6fe62d7e38174bf7f89a4fc8a5795990186cd332842aa8d61546999bb70d0c1bb5f036681cc857ccfd5a728ef8097368c9ba8b9332851709e26059e7bb20d269ab6917d01dfb6576597883a5ffc21d61c318d8daea6f99512032b588ed47799e30bba4d73e2c58ac59441ae32d17b2b2fc8e756a1d5e2692cc48a25f47efe3f54b994d135aafbd0b12f2d2add72ff19c9aa813a75e7db998d71d1063f7be762cf2aa9c9c1ad48af2cb00985e2d24e9a57f83feec87af176389fca32933af22668a7b58af6b6979455c38e5252b9a61e864ef7d75a4dbc695ebc8bfd7e3450e999a3868dade5f032f0910cb1feed9f99aaf0ceaf7eed16a4ccbaf8b6afd12c7b6170b4d7ae993fc27c7707dc54fd95f9d5ca69417f079bfeff02b4b080d753ad9bfb248c5a8cabe6649eb0259c3f9e2855b2f340992811c375f37a877b5f12f6b20465458a1e62bd188e6ec35256b5ee6c0fe49826da3e7e67e065eb518f08a2eff40e4c373ba9a3f65bdc0652462fd91f54204f7d7d4a0f27a98b457515967835ff4af3d6aa3bb9068be68acdacb23d569ea28f2d79adcbc50fc5745b13d12962fb66a5f330961a16feaa5db5fe1fd23032355326e0c2fe2fa5a53b5d92e05d76a3542b469ab0afc0514d6a07f91901f9ab918cd8572896f7bdf5f116034da60592e73743b53e231a55f900657f7312f8d0b255a90812e85a048a17453d2a9d006d6f6352ce1312b4a7d1db9fbb9cd6d2d5a62c052c0f054bb3924196335b29fa317725145b7467f46378deac7908e388c5e8d23ffd17b5a3da1ac1cbd4e7734c28b6c85fe905e5b12dc10ee5a6770a5a69c94323ee45a5df66b66782a65ee29cf424ad4e097f64ae692e6529c4f7dcac07fd699da4f2b123b49754b7f76537ad6483a44e99ec33218a0e174a1aa4051b854a0b82205a07a32511210c86f560599d7fd83704119e1839fad9192c9f974d16d7cc9291cd7e61c16f82416f5ce89cdf8d56e81036768fc9f8ccd679b4c395ac4d825c6306334640e190c19193e938709729411834c9501f0dd527084d12b84056510e9c1ff74d36f81f75b3729e44d597e238c5a182307aafd34020dbccc3f4350936f660f879162024822643809599e2c0fb322dee19909f831f53a8a765cd99131a71255244d613ef16e572454460cf45b8ba42bb52de210ba843b86fba0fc60da6c7b0b44339048ac72de2ea4a86222037b3a823841c8c9cd88f952dd0fae14259fa211c12ba8751ca1778e90714d5df66f8c3c7262be071fe099422670d351f340e015be350edcf34d016d06b40477c882a43f3a408ffc923eaee323192bb8e2f0e8d39565ce7411aabec2bad3a327b0b76da7390c9e4917546d282c27834a3b6061bcbc570c54e1f145a3d77280f56cbed48c57c2971bc428f82e0aa1a5b6f9d482368281eee838d0ad5187ee59dd5f564a59c66c5c263b2a5987c471f115b7a83600012f21417e9ed4f5191f723c81c5b575aa28045b458a7be31eac69793f4c74ff5a7b3967aeaa19dd3ce303b4959e43e46fff0c231869b0ea8b7ed8f5eaa98560d3840e4b0962490a4f4cebcc272cc6f4820988e8eb16499b306eae809782fa0dc5fb97fff22e2b3cc91f709af58a6e34e0bd5c525ccd50b6c03ba59f6d81247e8eae5803714aa3052244099961e2cec67f5761c35fb750d9ba80c7729d0881957f8aded468560ec5c3ee85a0fa418edd240615043101da61967ad0d35971b9d967488eab98be5b777da51e12b494b36db931b66b7fe1b839db8ab3e18d1303a7cd9a97d88e04bc5676e713b2cb6735cfc7c8f264a0c02ec2d80c05017d8d224c1dd255c600744816cc920ceee5f4c716c552441c2393c650bb9950b3ac8478232a9924a288b6fd75a022181d470b4b4a7ec71e221c04e2f3c372bbe8edfd0bfe351d93786a0f28e982632b0cdf5cecfd8e4a3ec5678053b0f123223c56e9ce3a9713ecd154edac479f3353e2050cd4004edfb9588b7c2cb26d32a2771f94751eac40bdf0b8e2caca6004d211915d1e4a97b331f827982ff5c3a7c2aab2e544419ad3b532d3542c8dfa1262a646a95a1a3730a908be2349a9467b64614e6f20843733767dc4058da5809bc666121bd77b1033f614762e41ff60f3b95ed29f58a09241e8456dcaf1565426215d37ff3d7a23279abc66323c3b3eb245196a50e95b033602d916dff145e71b4171873281ea821280b281fa046504d50525a15040143f152520436569c95286fb4269422540b1a106434181fa43b9895a4b85889a2be5824a06253b517d9a65807881023fa28084a6db5d0728dabbc4ac3b817202f5822206a54ba8be47a834142a1bfd72219a42312f82b147013cc602ce2b85110d3550b0248503f3ffffffffffffffffff0f7d08ff18e3abdd926cc7fc4fdf4149494949e986b319651bcb2d00000080c028000040a20b0b0d430dce0c8f4fb8d15f63c8134dfb07da185fe40083035a55579ef0b6fb4c429a74c23ff1c8e3a9101f331d4e385e9b246ad285cc79dd849bf258f44efee3113135e1754f271f8ac4a530f78c4c78ee39fc8a0fe34bfbc2c4299e1111e3e6f2b196569bd2f4a47429b23e97f0f3870fd3fd36a6e5f1332ce1548f433a851995f02e068d1d628af7d418bcc20c4a78b1c4f274d61e4b94afb03063129eff5589654dfbe8fa0b3324e1a7947e3ae5413a23127ecec1d2fcd8d2569379e3c68d1b3a83b3c30c48b82e91d5bb2f5b9e1c7d84f362a2292b8f469dc4116eacffec1ec5463831c6fb602b668a9c0731c2f91fb788f8307db054cf58849747e9dbc653a3bbe4314311ce878fbe290f55c3a7ce8c4438694d36c514cb629e081b6620c2ff931e8f3bfdd0198770ec2f7a8cb9879eaa2cf36040c010cee79868f759fef3289ac38c4238f5433bb7cfbebee19941083f5fe68aff1ec570969f310827a7f417533b2b7e7ef0608620bc0ad144727ac4544903e1967dcc11e6e76d219c01082f454841bef2a042856cc61f7c951f9954ba3cd61c32c30f97c445a6db46bd6d87f768b27b9b8f197d7062d24b0a6ae1f2a0a6197c70736e2ff3f13c66ec8111b3ce8aad9b69eb50ad9c27b5667e303e920633f4e054520b8995ed1979281c33f05064c61dbccb11f3407e3c17799b618723e791fa34a30e4c075f7b102a3e119c831f6b2e3e30d11ebf967270c482a5aca7da80197170d6c76979729be74185cc80833f0c093936da67db66f330e30d6e5f644ed3ed6f297d62642161861bdc700dd3298946165790e37c0146590866b4c11fa5bbd833191f2b330ccc6083df434df543c9c3988c88175b386280e38b83e30562101ae0c001c618770f98b186baa16aa81b27989186ba8186ba31e30c75036798c11fd78bc4dce36a46191ccd7395f211677f1fb31964284ffb50b2a7f61883ffdae3d03cf8fb2c1a1583f75bfe3e4a8f755ea91961d81960f0625c86cfa3cb92b6b3195f70db531ef530e4ea61a4c81c003fccf0827369fd2a39c32a554c4d1033bae067fa4f1e5b3d7f6f757598c105d746c2a598b6fe13da2d38a79e6207f341c490c7430bbeadc71efa209a05bfaa4d52acc829f5b8c482733e3ea9fed23400e230e30a5ee7fe9c3273b8fcc3a8159cbe12db3c1e8a898219557072ad6499f18fa16106159cd2ca9abafa3e7984cc30630a3d430afe754e52aa11ae02c10ac81724038c98110547524ae6c912927f96674081d7685775673cc1378b98745ae9194ef06308ad4122865a98d104dffb6cbe2a3e67094925cc60829b9385f69c375a67ce8c25f8eac17d224a5a0e3f4e758000034b98a104e73bb422a8a431fbf14970d2b7c5d090c703097e7708bfca831f477026fccc423af9fbb318c1c9a32c493acb07257e119c583d4e2a1f597b5322f833199572882a55171982e75631c47c4ca68eb6109ca8a9b51e52222c8583e07976cfb14ecdee9340705b34f3858ba13eb2f6eb9369370faa0f7c97fc17bde531a9df033fab5496e4335134328307fe68fcbb637e2dd9b90b2f33d849d8446e8d9d2ebcf1d0797a60572edcce122955f051b8f0c2e7149682f745c8dfc2cf5125dc05b90b91ee20c8b0851fd16a6ccb36a4b27b08326ae18f6e2ee6ce3cb4707d20dfd7c3349dd287998517e3c1a34898c47f5e166ee8d21e46cd6acea39458f8492d528cac15587839e613f37168b9fffa0a3fcf8f6cd507ea2e937385afd1b55534dc0ab73744c6e498793c5956f8d13c4cfc78d82a7cb5d8ac09172b04a958157e0e1f6dfb3668b8cc7d2123156e454b9094b8309b37a8f03ba9988c86bfb441720a2fb52d0f6359d474316d0a3f4c2a8f2364f28f61eec7c3e3b47f9095410aa7db47fd37fe28fcacb50976a2289ce0222b569f875dd987c291687934d12d536441e1a84d0ffb87729bc9229f20ec72e4641e354f38319c6ca924ab13be9fa575ab3c4c152bc9e0847f21fb46daaecd83f118c3ac2006040445c626fc61f6a0c5cd83448747137eaece9483d8ca6fc464c2f7d1b60fba3759907cc1843f52954a5b66b984e7e3f1b8535b46499b614bf8e95f227d8d58094793965ac8fcc9a084135d5623a6d285fca99431092f77f4503ece92314c0c14013224e18fd3737c6d071fffe681634b023222e10717f741873c0e24bc482fae12acb38fd2e611de5bc87df943f48e7922c311ce67cc7539c6cc43322390d108bf7ae0a3b08d74c937440623bc8a94e99c2fe6f1a8223216d1db9647bd9c4667848c5490a108e726afdd96e79af77112e1272f9bbc312dc61ec520c2b12c0db779147efc7c1cc28d5e95b8ce902d47c4107eca11eb42381d53c514b5d6c7e3514d08373c759e7ce731048b0ec2bfd06fea431505e18907f310722a4f9db94038723d8ee1ab26a3472940b879a879b4912d24e30ffe87f7f90f3dedd6522dc8f08313725585f2414a90cfe9839b4b7344c8eaf9e0c62c4fd783b03d8a68efc11f898fc387185a3db81ad232224d78051979f043320bf3cd90cc47ea0dc8c0839f2b63bf947c07379d5cfaf31fc598f721c30eae7f1e8410ddc463ad9d061975f0cb071df2830f3952207898303e70e3c683600d32e8e0c6e6d49fbc53f67f19820e087454a09a20630e6e47ff8f7e94071ffe72e4e0bc9ae741794cfe79dc89833ffef150b42f0f07ef2c32c905a94d49dfe0bcc53cb694d2cca969dce0cb5d8eb6c1bb0e3999a9fc6cf0fc0739f3a8b4498abf06d7cdc7c3a49a4b6bab57836329ec72a585e4511e8f34b8d121e4cad9cc2ada071a9c0b3e8a7212bf296a8f33f8d126136ef3270b4d31831be53a05eb90210f424a19bc8d6993e6f9537bab90c10d216519d9d6b8d99031782d1639aa3ae481db440cdec5b7850f5646628e84c1cb29abb4222ac49e08189c38170dd35d7fc14dc1fcf36a97e551c65ef0a23654c814aa5212b70b5e8b9fc9e741aa8b8d72c11f79e8c16c94710b4e0cd1b25456fd8f372d78667d21ccc8e5b52a0bfefc789c446ab37c0e1d16dc6479906e7355864ed615dcb0cb90ef51f4983656703523bb6ca6b9896c159c944a437daafc842851c1970c153383841b15690a5e8618ea42780fab1a9182dfbeb123a673cd3ff021230abe84f02d6e7d91010537059f33319f554b912fc0c871831c2fc83146181bc0010a194ff0eb87614452474959ca8bad4a800c27a08c2650c9608213f265c9129c1e24ed8f9844a43fa7044c322bd26ba4d3c2324e316424c1f9141f599eec68615b99994006123c4b4d667d9d7b3c5739823fbeb5fb4bf9de530a66bd418611dcb41ffb64f7102c194570539a88f7f0eb3fc81a306410816a01328660a70019423092118492010496f10354810c1ff8b33997b88b464b791c193df05772686599105ece97c10337a5faaf50e6efc22f0d6d9e7b9c872ebc919c3f9fccfd86a6e4c213ff610fa3474e1bb5c4056f9b07f97afa5b3832e93fccb8d8c20fd2ee9f638f7347f42630805af8ae213a5c69660a5569613706300bbb81039085eb6d1f359f57cac9578c8517d3de424e3c4c87082cea869e01bcc20b19bd2e85d4656319802b1c4991d3107b98123ab413c3005ae1e6410e9fafb18f9e1fac70a6ad62b3c73cf935ce55b879142a2bdb4898986155b8f2e30a319cc6e01d36a9404b2546da8779a0c2394d3eaeaa9a0741d453f8ea79cda5fb93dc844de1a4bca95b2ec9b48fcb52f843f7143a686b48e1e55a4f2e639963f08cc2950d165fa123494c95840188c2f731b34eadcce34f13260c20146e8572b36893b2368aa0f0ec87b9feddad23c2003ee166f21c21d9e7e109ef43aa55d7e51852ccdd0da013ce84f48a3c77d1c20038e15decbbf3141d63feb209dfd2549ea421bd454a9af0c5553cfd541e9970ccaf2f426c19136e544ff9c847425eadaf0903b8841f7c68c9a73e56bbb6bb0158c22f2bf3d03cd40e0a03a8842fc1d622e5281ecd369470a297b994b756f89326e1c7ea0da9a9c273984412fe5b4fa7ff1f2412fed4e4e4a156617a2a90f07d94eac3a7c92e19eb471c9ec1421e4f6f8e40a2c99a4ae874233c359bd93cfa7eb59067849bfecf2b47f1ba6cd722dc9ed6aefeaf20a1a9229c56995819b44d847fe5d31fa6b33f8f5f4438d19277873ccec8e381e6104ea954aba5b289e57943389691fc0791631a4b17c2d5f6b7fe1e04eff43142f803b73c4e3d21bdf2a48370c62ed3b62457cf8e08c259b1a9d4ea51cca1e440f81b2daec245858bf002c23535dbfcc3f4b0fdc1aba81fc734f53e1effe507c77e528e2ab5e69b47e9835bc9c7830f3974ae68910fce86cf086f6eeec159f1b3f741c9f7a82f3db8b9f356106bef4cbee5c17377d71425a4fc622b1e7cdf3a4f5313c9b7c277703d53871c1261fc3b3aeb3a78f127793c90183af8d229c4dbc7ca9014cdc1ed4c5af53537d152500eaebb780875a938785f397375490c0e5ea7a93af18918ede43738e9e7d6ef535ad24637f866ed6d692ba573f9dae0e730a621c4f4e34c261bbce87c69ed7f90357891e45dea33328fa3062f8fc2a51042cce3ac9ea5c1f351e5ef4cf3d0e0f7aa7bf56df468227c067f9c434862395fe51e5566f032550f7ee429638c45cae0c40f2cfbe60c19bc0c2221e4f1782e2484c6e04fa4d05a3e6931f872218764abb1365881c71c728f32e5c876e1b68510727610b9ffe8c293f4152c63ea07995cf821d4bbc761830bb7e532543c730b57b2ca445bed79e96de1f58594967ed1d33e6ae1a6d09cddc7d3c2b96d975e174dabc92c1c3f491fca2d438a892cfc89ca94df255aa62416aea5302a1e24b070924f5ffa3062f89857783fb65c61b751cad2ae70364bf23c0c92b24ab815def740532ae4fbe9b0c2eb341bdf1f422dbdab702ea20fd4b28ff3595415fe30437d147e1c7ceca5c25b4d3db812159e74cc9fc2f9614a4c29253172ce146ecc3e8c19d9fc6a5f95c21fcc7b4cabd9feb157a470330fbe62454ab7e86a14cea7a6d4cea34b9962250a2f0f7aba7e985528dc143f2af38f1a4333a0f0a2e6428f7c58a1d6ff8417faabddbc378f47bd27bcaf55eba1d8b5448f4ef803bbf492938413bec8475935f941ccf326fca178ac09c7a2c632f3514a2e67c2ff249f82a498f032872ec91f7ad0b88413aa2624aac88f5745acc01f6858c2b71cb6ba82e74187e92056c2f30e2a39c3998848095f26739490de7389c936071a93f027b3cba589eb4e153e1a92f07d30996c2ee768a11109df2783488706f54d232624bcdf3c0895f490b9f74005683cc24b212182e4ec1a3d7b471c31122bc48748a3114e1e5fb4e455ea29a4448311fe949da5781fa71ee54f0e1c6188813416e124cf1249df2ac2b394d1dfc38e99226db012e105b1ee8c7d3d6820c2ef30152bd4eda365c88bad17e821dcf493da708d89c1c13684373d0ad2795811d667052420811b37d26814c27f33a9682f1b21bc91706e19e2c2da473106e1e4f13044ea41751ef55c82f0a2e6abee94dd40f8d1db472295126d7940b8b1a15936fd783c933efee0c44a31dc27cd2796871f9cd15031cf23397e3cba0f6ecefe9af2c9c78f4d7cf03727fb41d4dc1e9c709b99447dd431cf650234f4e04bf6844e99b253ec6c1e3ceff04f3f0a0df7318d0727c8598a4580c61dbc241daaeab247af4e3de00217e4b8c08d1b76f0722ae941c71c6e21391a75f02b6592ecc17634e8f09a8ff2b8d5ad15028d39f8296d4c4945451ad090c37f9183065fc800c7173956608a0068c461b5d62e93a8753589de996a2ff60134e0e05d97857cfd792893df37b89e07412b668ed075bd186ef0de25e524f620fb92dc06e7fd2736d2e7d18f47a7171b021a6c70724c3f917b98d3e67cadc1c9769e2a8fd24d5ed98080861a9cc929213e5da54d5ad3e07df4d774d43cce988b0a68a0c1b328cd296a87b28a71968980c619bcd0165e2563f57708194d3b33396230068e808619fc968dc1cc735e6ca16e19fc810ffc6a535a650b512fb6980cdef8a062ea71080f9ea68dc10b1f997edc8314b285ebc5166d066888c1091262fd370fabdfed30b895635acfb97e24b796076880c1cd08a942879a77c6e5c516ded3f88273ea9b3f7f6b87a09e175b581ca0e105d7d284fa4b471e6dba0b7ef428b8548af10abec8b1821580e182751a5cf0e77dd8fed1c3983f45b9011a5bf07fe85a5d1df28847778c2fb4e0e7f0d186b2ab2cf5411c3870a83dc4c8f1020423078e30c4480d980007056864010734b06016a071850ad0b042ee639f949e5426a64940a30aabd88856cb9d695aa9faa04105d732640a11b26b6da5a7e0dce6b104f733cb32638e73c27841056cf00031c4201cb8710387147cd3e8ae29c4eaf1fb15053fcb475d312116d45d28783edfed1dbf3dc169bf90aec63e76b9dc001a4e702ca87424b5b1e9ec834613dccc14112bd687083498e0584ac83ef32ec1db3c4ce187e9adbfea568293d36a8f33da4d82f33e521aee6d1a48b8635a6b5bdbabde072ab9e46aaddc4d1a47f07d18a1f9e3c3b8ab0f2dd030827f93e2ab7e34b932faa05104e70721556a4d0e151bd220827721e447e6df51f69fe4018d217821d724eb710cd929f2a021047fa37d901f6b951e8f4323087eaa88e46a9783c38401c6430c09d00042ef43b5725f1fe7077e8f2abf3ef047736e799864a3d1034f2a8688b28c2c515a0968f0c00f6f498fcb1e554bbc0bb7b735b3a4ce6c79f077e88297530f8d754b374b39898bca75a91123fee5c28d74d2a1b152072e5c4f8fa9e6bc6c4aec8e5bf8e38a7c66223fec946c5bf82956b46cf6157946ac85af9e4e63478fc937466b602870e3460d8c17b460cb5e66d5eb6aea9885e7ab2512a2d66d94fecdcac2cfa1aa3d08aba9df072aa02316d9010baf362e962709798577f613ad26e461069130a0c315de0f32d3cf826adabc6940472bd46caf79cd96349ba9ae83156e3e954f21bd7b8e5075acc2b3ad1ec55accd5a1371daa706a42bc54fbcd018608f4051da9f0cf276353cae17c70131c858a8e53f02af3762327b15d5e95425ad0b0f65e97de0e53b829ec425443f639f3749482d441d4d2410ac7f3c83c7ed4a6d2951e85db9fc624fb0f168527f9a24375bca1f04796e5c3ca29d5010a5fa32c25cb90e0ed757cc2f9181632d7e6bac3137ea7fd8f2d455a48ff5e6c694727fc64dbc31ee5db70c20f31460e9f829bf0c776a9f19699267c6fd3147a10d6eaa02313dee6cd793c8ee1a28b588ba372071d98f02c66e9c8153a9b65db7109efc5fff22095c8f5662de19bf4b8ca4e9285ba662be1a5ecd1c827efd8e33b29e1fa9aa70feb1472e67e128e96864b6a4e1152fa9c6288c107e8908493b346cb3eb658ef9a07ffa023127ee51ee71017e3410724bc9887b93a7d0fba079ff208c7d627f538c9ec08ef7f838fa35ba627b11be16ab20e1f62f2282cad8cf067facec7bf2c535e1771dab84779a8a7a66d47ef5421a6aafc2bc25b1fb787393b0f1b3f021d8970ce45542de71f56d6670c305cf0811b377094186380e1023118081d88f03a53259f1cd6536ace211c8b6932c9cf32c4740d61b06c370b69fd42389afb34f264b08c0c219c9fd41fa2e76e109ccaa5ab85abc65cdbcaa6e41af9c21d827053baecfa8d561922a56a490c6440b623109e4d04cde52989a745739418180edcb871a30310fe4696a48f45b25fbe74fcc1d3de1ea6c5ce21a9b30e3f383e1b61f3c8c859873afae0451493e0e5172fb66690e32f02cd56cd074f3d35d45b1eb6e75eabd0b1072f96ffddf6fbe87a30fd173200c30605870d5c10061eeac1d1cee6e3a1774cb12173e3068e8e3cb8f61d62f3a02578f0c7214f92f9916bb525efb0a7abd32051991dbce9f00b9139748ad4a30ecec5a7686a17aec42d74384c243526a65b55cd4e23b6594d6597cf630eae4f4899d1eeb153a674609ef2968f36e4601cb859b5b4a9b3b4142951e971689d85581b75c0c10d21cf454c150de305396edc0023c78d1b5f8021060b70a40a3adee07468f7fa783cca1a237283b7b94244948fdfd106af07db91a5216d6aa550b1c1aa2e0b8b929bcec394cec6638f84a5630d5e1289967f7e3b63d04cd0a1063f62ab699cc6d031421474a4c11fb938310fd9483677a0c14d89a94f5bee99917ab105460ecb8e339c19ae0c6eaa18f321330fa24b1e23e82083073ac65037ac430cbec656e63cf6330c7e88123d6376ce97c542450b062f457fe9b3f00c931e55d9f10557b2f6771e4665b8f2898901dee8f0c2d7039f918c142fb66a60bc884147179ccef5ad3d928db99cea1c1d5c702c2b478ac590d1f6afbee8d88253213692a79bd0d9d339c6c82106186170070826408c07cc23870b3e70c38b0e2d584716ac030b4eb209eb58b9de73b6e0153cbb0acbe8a3ea90f2e80e2bf8db1e6eeb39a95996468cdb8e2af8e9d27f96babee86cb17a400715dc4cb7a939c2447a6a1b305f6c00041d53704c62875bac8c8f21c662a0430a7efa3c721f2bec63fc08414714dc94c77396313b564a814216ad528c8f75e97882e399ebd2ac74826739e62ccba5bff0519ae08f3fe2c7d6c3cc1a52d8c10437430c1acb32d5b4939a22e85882295ab65d2e2562e65d49e2c799a7a286c4000c09bc2006609c227428c1ad90cdfbd3c9cbe59824382d3eb89f8d564963b003094e8816dee57a98fe7d771cc1f1d164ab10ee26049b74181d46f06a936565c98f538414c1cfa696ee2c0797af8c085e0a16cdb752ba838f1f822763726595d7a7ecc2167408c14dff41d9c7d0e358d01104270fb62ee27b760118609474410710bcaf0a79b0115eb1e372c490410c708891834b0c17e4184306b9808e1ff866297a900b65870f1eaa657b55114fcb0d3a7ae0664b32617c70db6f21c74460061d3cf034e491b9fac724355913031c34305f68edc2b5c81d731e0f6c2fc6201c402fc62061a00dc6309ca18b2d26244ae2c4426dedce627698cb31fc482fc6201cb871c38b3172e1f4d0ea32c60e2dd9b1635c78b59935ecfbe32c6ab7704a53ff44378db8296de1757e1fcf49b84b3e915ab81dea27799cc716544b5af82229aac66b380b2fc3f86c8e21e55c9e96c5ddadb5e5599aa919739f55ec53b220561edc5878b66193f9204589eec3c0c21fc91f3a7dbea277fe155e2411f1bbc95ce17b0a96dbc4077d9d0769853fb49c5d31f5687e369ec10a3759b66c4df7e0276566acc2f791c42495f3204a358d8619aaf06272890ebfde26aea6c28855abf64a3157d3e4a712239ae58519a8f042b2fa2acf83101bc253f8d139f650a6d2456b688629fcc93ff06469d255d4638119a5b8ccdab4d4ac555b4b63bac33483145e08b5281ad6320a379be78b50793cfe52d56688c2d5349963e6f31747858293f88a493179b30f15eff1fb70a9e8cf0085eff9a5328f4752629d24c90a35f4e0f6c69ba41eff28a91c428d3cb899d2e51e9ae7f1e0fa2058e8ee8c2a316335eee0c5bca2bdaa1abb2d5fc30e9e07b51f648a46f418ac51073f2dbd5c1aedb1e4615a4006c6f9a202ef821c5e40a0890e4e1ea5246715ed396c121519dfa56176a132661deace3a39b866279263f2c70fac383459d13526aef611e3f199538f3d25978f52030ebe0f52b2580beb0dae6aba3cea3c4aed9a961a6ed01a6d705398ffd23e8d0dbe89474d79141e2fb670ace08b1c5f7c41c21003871866056f701c62e84c51630d7ee5710ef9fbdb64523a8c3064a00627abc79b2e7336ff100e1cff458e6368a891067f445364ccc7834a1941836b31119e39a6b9c6b4c6197c93b518e524ad6106af53483996c67c5b911a6570d3a61c73cc976cbd7b32f892e9af63d64cd1a91c831f5b938f45d4fafd3435c4e05df6512ec95111a4ea1a61a80106dd55aaaaa325ad4443aabb3a4f3615cba13be70535bee0e634efe1e34d29667d0d2f78317990a387a56b74e1346d995819557199edf0914f545685a8c1057f903beb471d3168fca8b105afe65f628c16a121e65c8d51037310a8a1054f7b984c2367dfabdb59704e524c2d19934bd6100b5e579e72093efa0a6774d4a9ddd99a78b8bbbfd66cd35bc1cf95871db2b78c6d8678b14503f3058e18808183eb4a0335aae084d8e6eb2b7909d4a08277216af238498a39ee52630abee58e0deb633e9e716b48c16f35f109d1fb1c3118c18d1b7f3118238c1a5170b4bbd376be4a0d28f81951720f2377778f3b4f70edc73f4e93bfcde7662738ea83bba4fe9e7c245d139c4e519b2159aa06139c3c1e57ce123cbfea41bf4c7a929495e05cc81321b3a492a0cc454dc7bc895547a764531552e8b10612fc51e74df98716d5c22d29d43882ff153ea7a11619c0c0940c60e0358ce0c4d28898f2af07ba46119cb32891154cb2c5b40611bceafb4ff19953caa38c183586e08ffd48dac7e12304c7277cffc5476b04c197145d4e2acb35a85f03087e4e979029844c8d1f78eba3c810713e9888560d1ff8f773e7b14aae34d4e881137ab5c79d934f2ed91e319001181f3035d4e0811fc53ef5d87fd23be73b0e05d885bf627231e6b0d425135d7829ceccc2e6dd075173e3460172e175588b0c72f93bf4e58b1c454b50005c38f383e03faac917e0169e8d7f8fbefa533eb7d8c2dfd854a375d3112b5b0b3fc5d0a308fb9c3255776928002dfcaf98ac72faeb609d320b37c7dee4c31e9bb2702c8d5ac4ecd93f9eab00b1f0738c1961a9b302c022d32a33991671b9bb74a970e1c3bc5da000af7053d8cc9b24bcfaf82f376ee02857f8993c64cae3f1a48d49e6a000ad70f3aa8f873944a900ac702d8faa3cc3c618d7111c146015fef8c8d3e2c7a50e0aa00acf6c2a2e5b456c683270c149538054f88334651653be0915c402a0c2db1861f220b682029c22adb06d35930a29996d8bcf9647f167c923cf18708115c014c4c9f9c0f26527830294c2cd1ba1f1f9430a4f3d5285f9350a27621e6b8a4b153affa2f0d25232f3a80f859b5a3655aab9aff0010a3fa50f5172e4136e18cb6849373d36db137e4cd91c6e27573e77c21f1fbc9c70c525622b652691e826fcc1452d99fb9cedaa269c885ebf59d24cb8daa2de3f2a8b492726dc102df6963c5f46f3126e68380d92e59acc3b96f0b4d38ccada0fd6af5309276a940cdfb09d153a94f0d5232c4f6612cec61e9674e40f29fc92f0265aa8e8b88cf9f38884f3e3d952d33024dc9c633578b70f83841fe1c7f8418f3e8f6ca3c98ef05b4afd9275ba496f23fc54f631324d2cd52423fc514aa2215b581f86b908277a5569f61fdb6ba908372b0fa22e8a8970a26988461f659ed310e1a48a74d7e1248f2c338770e2cb47a669f39921630837c73c1ee7d4c814c2d9189267d50f730f3a84f0b46bb353aae7c31f84933b8f6cf81f82f06e45c3e6618df45902e1a985a91ed6ba9b4b00e16c87983b99cfae923fb8d973d688aefde08f3bf7c04e7a621eb90f6e76fa64199552ddf2c1910fd14132ba073f6fffaa49f4e0ccf6676acb773f4cf3e0052fb3c92316f28d78f04205cbeaa3dcdfc11b9bcf3c2ccb0ecec71e271fc7b03ccea1af83533e525393ce72f2a18357f196fd7c1cee7799839fcd3c6987dcdf292c076f26d4688a58e4d11a07378c07d9e0eaf9620607b7af664ced2f9f468f37f8529e2a6b65e41e7bdce07d4a59aac731ab7fdae0594bf68c15dae9668333279b3538795421e69f8c1adcec902273ea51f7a84f835729871bcdf7bee14741839ffad74a528f33f8f9bf2b558cacfb8b19fc8e6da6194eae93a50c8e85a9ef81da6568840c7e8a18d76ed6c92e52c6e0a6f6402d8fdaa547e92206b7c77533631634445cc2e05c8e56e56d2792650183af76e7e3398f3562b07cc1b5ae8b7df5932e8dc50b8eb6f84a59f5fc0f2a5d70429008eea941cc72b8e076eef1e7f2e016bc8d3eb2f0ed9f079687167c09d2e3f176eea865c982f7e38c25f26dd1532c381f41b53e8fb26faeafe0d55ac829435a8a545bc13f39b3a98b793d47abe0b8e47cf2314a0537c68e2bd3ca7df99c82f31e2cd7a548c1d1f0cb5b4954b6c628b8d96793578550f047691db5265536b927785f2d1f3479c409ae671f4a0a9fc663cc48131ccd41330fb28f9384106182b39e291f4c224b7043674eb121fd3e7b94e0d5488c1aa28f3daa27097e660c6f1f0faca344821395e35525d3affb23b81ab5c7e3a9cc1fd91bc1711fd6b6668f1ad1a3085e9cfad82656f44c0b119c99c87da331f96025d66da4703e161182a7d6e1f3790e827f16f2388855cc642f103c198bf39af5076eec618c4d4afaa0e0d172a5f5c0bb3c8eead15d0178e0fb789053745e0f4bd92edc24c92ffab5e690962efcb1dd5c348f7bdb2a174ef748d27b7bd5c5d4b8f03f0fa57dec431fd5457d0b7f3cfac99823c7169e8690d49fd4368f34b5f0638c897ea7a18513336cfe8abce1b19f856b9d6a3f9a903ad32d0b2fb3c72e3e4a9a22120b7f54dab679bc512c8cb0f07c2892fba5cec672aff05c52b4bb57ec0a4742282df18a5be1589a8ffc62551ea68959e1762695ca112da7e7acc2d18e1596b7b5358f57853f1ea74eed29250f7b3c52e1ff304676b0bf90434685d783dc31f2b0ab4ae353787d995c3cb2a67062c3e56197b95a6c4be1ba853c1e6cb430994792c21fbd8ff6785b0ff2c81d851b6cdaa3e7718a289cd134efb5da5f91db5078794c7abbad62276f41e164e6d47191c783fe6e3fe17bf8303284ccb551ad271c2f310923210fb43e9d707c34553de8c109c7d6adad4e3ec6fd9bf0e54bf3a964657a34e1ca74050929a5904cf821878bed1c3f4c19135efda0db92cb77062fe1560f22e51ff678fc9a25bc6c3691267dec1a954a78261f3ce5b258e950c24993ce24df6412aee4b225e1f69be6f148c4473b8e84539e66adfc871adf42c2e9918f431ee6a144ecf1115e8a296af5e6cdb838c20fe982c56437c213cdd513226536cb08bfdd3fa4150b12e1229c90d42fdc444e529d229cce79e817f296082fe6b7cfe59b22c26f89195b71afbe941ec24f5e9b39a690d726a58670a67f90ea2f8f36e44a0be107ad649535958a574a08cf7c934869a58370238f37736fb81f6b46105e1e0ffeb73a0f64d40f8497a9a1c3071531a307841b7c3cb81c35fc78e4923ff8532947fae71e68b4fde07f0a9752f4f39831dc076743e43cc8eb835b9ff9e04fe8cd176b3cc9b47bf02ae60d1b1f4ac4ad077ffc831852ac79f0c2c42496c70eae291e7c4dfd2ff623f30efe30f520e647a31d1c49eb9a3cee106abd3a7812bd5c5b2cbddc967470fb07e92a7d0cd1d299831b3da6e71f4807dbc8c149bb10d29b9fad64e2e08f7d3a53fa388fac0207324ffe0d7ee4eb58b91f6e702a24d5db4d94e5943678db799863f6b76f59d8e07f481a565b53c6cd6bf0b3666dd1b4b315590d8e86fe2c5e3d1fd44d83eff9a28731658bb9160dde5bf251ca6f1733d133b83d1e7a8fa9968737cde0a4d40f54cb327856aaa99652fa8f64f06cd3c27236f50be118fc3c28dfe8a312ffcb89c1bffff4a31487c17f89bd9e1582c1cbfaf9741f845f70cc34a68f47e7c3fe1c2fb836978715fbd3052f041f46b79c52a875b8e06c5ff061ea68cd837f0b7e1e5cc848f6597ee46bc18d12fea398b344293f0bfec87f942b671e58f0228fd49fcd0fc3fcb8823fda903c246db63cb258c1cd83903c2a55425fa50afeda95c648f1613d54f04242bb43c814dcfa616ffe51b8454da4e0040b1a13055f3baa8fa2f750f03fbafdfbff26fffa0437a2e4897ef79a83ea04df87bd5261739c55d904ff34dad4c6e7b13032c1f53cb4791f8f7df4a3ea96e067b2ff9b5cbe92aa5382ebd3a66e298f72f93849f07a4ad225d5a4761f095e7d5f085937799c7e1cc1f7a1f77acca3ff3cec61042fbb459249a631e79022b8113248859989e00f66ee62f4b3fcd91d821fa352c43c5485e0845c5f8e3ec81c7b6410acca196366c680e086964e51bdab3c653f70abc7d7bda90f9cdf8c31cfd1c7eaa307dee74d964a2e454921000f5cbf4aad70260fc2857dbef69a98158e9ce641fce83cf4307aabf02df887896643155ef40fec7abd525388b1910abf556aa507e7f731f8b0810a2ff8a418a3a4e97755d360e3144ece792c11d30f83b6a44de17f6fdee8efe15238e93e5d0e9672ec6449523cfd83d8132488a3f03dc98878fe1cfd621385e3b1f51f44423642e1f8e551c50ed3a481c2f11c66f6e93f5c480d4ec1c627bc1efaa45507cf0ec147186c78c2f9641ee73eca281df559273cab0cfd6e93627eb58b023638e1f66df5b04a2b73c6ae80e18215e0f822871763e4a0c126dc96dcd3c34e1e71018e3172b8200c314813fe69a77ca7455e6ce1c87165011b99f0e47a344dd4b496c71b4c78bda631546cffe9b02fe1f8e827dc935cb61eb996707eb49173c8e9471f7f25dc9c56312db78f87794c4a3851e992e741692e33cfc6246c48e2b0aeb5f13015ef085fc12a6619fb1e6823126e578f62657a48783d52b71f0f3d7d64f01fe1dd874ded4d95471f3d1ce1e710ad364485dcc3ba1be148a7e751180de90769668417ead33d0e9d37c6ee16e1b86a69b8e4167a5452847f1dad36d58524e1933612e1bfdc67f4f7fb4f8f391b88f0928d27cbb0ce3cf23ca060e310bea9847415f3a0248fb3867033b8649ac8f94210226fd818841f51d525a6f8f5a8d11884613604e1984b67a4fc25293ad240745e12d9a5aa69ef3e5695b164db00848d3f58913eac1c51cbb6e1872c1b7df0438f4fa3841c55f23026461b6cf0c1f90c99077da129780fed828d3d383f35736e66792459825bb0a107370f7e3c4c679793872246891061f268030f5ebe4a79a0162b156cdcc1ef0e17ba534ce21be5e4820d3bf8e9c9cebbf260ad47958d3a7823294b36e8e0a7b4a411b3c939b8fed9e152e498fd42d2861c3c0916bfc142a6fc6b1b7170d3cb07d2a25908180730d061030ebe798b8da593dee0ad798f6cdb2236dce0e7907ca1928d8f465262d86883773d9f124e52b0a4a9175b6fdec4a853810d3638dfb982a791101b6b70663df2c0876ea9c18bdb9c2a429dc774292bd84883d3212485a51f451e74e76ca0c1d31ca255f4506d9cc1f5d1dbba24f5ae4c291b6670ad52c4fc9e4717f2b38d3278619e42e5636ceed18d4806277f7ecf83cc238ec14f9bee17239712ab832806efe40716cdd22f7e94390c839f473fbaf81ffb4842f4110c8ea5b02a3968c4e89ffe8213c247e12b0ff228dc5c2f38ee529ed2e6b20bbe0f7e2aa67bc6053f573a8dfa929e2c978d2df8f13e5e11cb430b5e501799d0a3f4e9c3b79105dfc799b2e59452650ad9c082175ab442adcd3f4936aee08fc5e0fdb96de3ce2a810d2bf8294d4b8c8ba83d486e15bcff98bab22e2a9c5e6722b3755256239e3da6a5d898829b29553ffa18bdb3210537435aec08d388c146149cf021e714ff4a67b1818297ecacc7314c52fd783c9ee0f838dfb58fa2441ec709dea62cbfb88c8f21a504c146139c488b7e1292221ed906820d2678db1a4a3e9965cbc19246b0b1043ffd2057a559f27a604309fe7c08ea31ba25e93a6f083692e049b4e450afeed94082133a4ff6e0d6bcb471043f26ff7ffcb82c9d6746f0bd3f9dfbd4a874f9c0b3510437b77d4d48a9ce06119af18a93ad0b2d0fdae309e13cdc623686e05acd6509adcd8610a812878d20f877e3831e850fc63d7d1b40f0ae6563b4e0151a5bdaf881ef331fa1de376d9ffac0cbee81678fa2d3fae57ae07c49a5e992f5e93045c1060f1c53cd29c4460f6ef266805db83196ac8fc3a5eaf1204717cebcdfaf278989127f2e5c8f112568f54de4410f5c78a9cfedecab47765eb9851f63f4583ad9c416fed847b1a4937779bb5b0be7728850f541f881e769e169cafed13c452b240d04340b678276a730ffa1527364e145f0616a4a768f2de4c4c2f96196a944ec0bb30e2cfcb49d3c4fcaa7253f5ee1e788f629f550e30a7f2ca1250fd346e5609a56f8733982a87a8fac27c30a2f7c1efa68aa07aec21fe78c9ef148e6638f2afc135791f70c17a324157e99e6314fd73c8a2a2a9c689247622956b67fa77072246fcfb1bd29dc08e14273ee94c2fb903974a787776448e1dcadc5b0591e85e3f65f19e342c3dfa270d3628a56a922b3b5a170b56ee4ad53fb8c080adf23b627d6bbe3f2093f7c74696bd39ef0cdaa53e8a1f4e8841fd47d1032b20f4e387dc1ab6276c9ca796cc2b18caa54693da4872632bbb43eb03713aed6848f7ae562004cf895abb355c58c8a7131c0259cf4c328c9b61a7ca3c50096382aa7dc21654e25dc34e953c7bce6e3ee50c237d1cad29099849fcec7a3cc57e9729625e18f479e3f7bdc31d56723e15a278d929c19b63b48b8e123e616bbd0e3b4c8231c57c91af3b0228e70b27c10edf1f8473d398d705359b8ce318411cec4d5cb4d8ffdd5ed45f815638c981a6ab693ad0827c6b0e13fbe3a119eb4f458266f6d481f44f86939a53195f051318770d57aac924263087fe412bbf2e84722fd17c2b9cfdf29965ea3fb2084ef73d721d437455506e1e751e8d2bca9209cb2abf3a1a41435851c0837451fd5c59cc702c21f0f3adde7611e7ff02a79c89dfe93c694e207dffa7d6837e122e6c8f6c1ebb2d3324b157b79f9e04d4695981f0fb4d4dd3d78995b34a7e8f0d36ef5e08ff3d0a62e432a5b270f7ecea33cfa3c4ee9928f820727d34f0e2a11ae2c45efe0f9a4caf4a3f4de6aab1d9c1ea5a4babce59654ad839f29c864ebf130a6964a072f79d690b1f1d1d9330737985614db9463855f0efee85ccea2e71107c7eca582d96ad8aee1e049c8d5392495998bdfe08de5dc69f3685ca96ef08779103bf9d806279a7f34dbd8e0d8fc268fb809295d6bf0c7ae116a4a7c1429a51a7c8b412444e8601adcfe1082063f6f8ff2c033e58c31677034a6fcd763affca59ac1ff98a1e66f1db28f32f855719d42f26c29910cde5cf7b8267f1e77c5700c4e59670ce9156426470c7ebd6cf2710effe2c384c13fbf91eec8d8a3c8030c6ebcb884bbfb0cf00527768f7db28d6db6f60ce0053f6652faf1e58fa4e119a00b69cae34c5e791c17fceedecc67ffae3ee8b6e049eaf1061fd4e5618e4e0bce4a541fa78eb95c7d163c17c9c3e4171ed9228605af2c36498788ae49b52b7821ddb3bd1d2b38f69b642ad458c5a60a4e65ee4c4b2945052f92640ba991297821720a9f8e8aceb7147ccd22a12169bc538e82d341336dce11335c85829b2ed4b2b20f5289f904b76376fb4a882979ae9ce0db8fc4a029a2868f5513dcbeb7929c5d2b5fac98e0f65ac8c3987213f9b304efb2741ee4d164d4c628c17791d8283d8e59ed91042f855acc5b33121cebdb60a9b67eb37b04ffb3a62d72d894836704d7278fff2abdaf478d0c5004ff62da86eaec508bc80044703b790ada3ff8a17d85f8c10043704b3363d2c72125b35c110c2004a725a28948f6a1a6453f304010fc9c33e71ca1e75473ba81600020b895b2c6c24b1e4d1e0ff203af3688c7856c75a9cc7a60001fb89efb73c53ad9d0fc5182017ae08dfac86bb3b7b80303f0c0f18c1fe54c6f7d506317de58ff88ffa5cc192d5df83eca29470f3f0c11a1462efcd214f97d2ae594eeb9a2430d5c78296f864acac93e4b6f5ca8710b3f58d8feed0b89291d5b90739f06c965d9ac8513624d071fc48532f588518316ae657c879831644d9b9aa0c62cbcd6084f3ee3b5a132cbc21f94d4bbaf140b2f04b1f1978e3158f8a3999bebc1aa6b0f42ae2e09355ee18f3fdcab07393c42f051c315d7989d4a6c44d6b6c76b47d77c69a775d56885afed39e3c3e4eaf1c538c2c87201c931460c080758e1689f8fc2628a182269cc801aab70ac34f9864e1943400d55588d54786d3de1434a182f785c0a6aa0c28f12ab56f37684fca337061b400d980047076a9cc28d79dcea29274d57e9c314ce55faf120059513cf76293c3f499aaf4db3450a5fb3f58be5af5b4dbf175b16e876408d51ece1ede9ed2de15e22ed23abba1cc35e6ce5183544e199addf458e581232582314ce565affbc1582851aa07082e6f1ea1e48d5f7f81a9f70d5d3c9ff5ad7ac5d6a78c2cdd993a4b33cbef43caa4627bc3bcfd4612eabc1096fd6721ec7fe1f8f0fbb1a9bf053e78a5231f36a14c7173988170f2c4d78a9398fd4076135c339c460ce841b1662f8975f30e1f47a76f80cef9f2a7a097f702948b2694dd9410d4b78c9a3aa36646d7cf49570a67b10accdc752d312251c1f77143b1f6c2709d524ea1099bbd30e0b8ff31ed649746b8cb1162192703d4c59dae0c39c3c9951a8110927442bcf39c5660b91263e420d483812621ef5598c351ee1250d3fb1b2a945440cffa08623fcac10318c4638f9defa6c3ae51e4f0f4638a619a127a28d5b448bf03b44e49c2786f561ae28c23bcd9cd52cba89f053f9790821319d461811797a8b4a7f5c8a9cc7e3106e874790ca9df2c8fd30849776133cbeafdf3b5ba3105e848ac9f4514688c722dd83707288f02b9e29e5ee5010aec5547f3db516d7c302e164cc92656219b3870a0837f6a6ecf9dc5274b0fea0cc7ac5665b8bb96594f699beea13cf0f4ead4a3489ae9da27e428d3e78ead1a318c9af731eb75e6c1d625c5061d4e083372722b93cba7bf0ede73552c8e371b6018c62a814eda402c2d1502c1409040251300c54653e031408001038220bc56291501a26b2e607148002582a182626261e241e1614181e121409c3a14020080a8501a13010100c8441e170702a10ba3c4c6013ebb4991d889e5a8c606f66da6203d66eeabab9afd2a85910e9790b1c721cd1776f61be85d030276c9957037c876deac1efe7384a9cd2520c7813a71391a8fba618f79b9eda440767d8d27a9e2e875660eaf0638db66751c1eefac7aced4f16426c4bf822886e2ad2218360ed2837a5da6fd902fd210f12115b22ece78e4200b396c0e6bb7760d574b408490859851546344720c8a8a4407bd387a7572f848d961ef0b1603202567e7ede8bd2db395fcbed1e0957c5afe0e874bd1e2ed9e28daad4eea0762938a19c21cc48d06794ff72009ba3ba1e7299a586546684b3672a0dd49a3634796d06a077833da73a6d7504c6af3a8ea2f56e6692910509da15825a0ff42a5a847d4660a43bcac96f1667db8b0947a40e4b1405dca53406c7cc8210e1e20af498171ab43e4fb5a47284eac393085550832737354b9a054b98b9fa8a988a7510690a57c51651dfe2d26d461424ca010b9108b600941a7ef76caae7309140a00f4ea261c429f59b776b0ce889eed5243b0aa8bc1359a17fbd594a671f408f0c732861c8d77d48f0202de197bdfd5b9bf7c2980094a29fba8b76791b48ccc9558d300ee98fb1364915112d30411bdb07e41801eb61a67b643f44a339bbae68991a7cec249acf4fd0e9bf38495cc48d945f8fae5148a1603f4899169fc3a22ddaf89338b75cdd2a4024852e8efa9551b715616ec9bd58c698c08cae3d7ea53ee48f252fb17208e7858d22d2f6dbd06cb04654312d449b6f7c5d22cdcac2a68ee8157053c39873f3c140a481d15dcbf6fc292d90e881b0265d39cf18da1932284426e5585e9657e20797c0d22564d1c0f9e266daf7dcd44b9c4687b50a583309c0c44580c29e6e80635dbe6d35f48cb0bf7d1e61db75a456e5bbc8b6d0cdc0495183bfeb87738f557878e44ea1c2b8880ef149648a48ffc31bd34aa6abf4d77efe45b8efec4551bab40011fd378e8186c318a58c583e19331ed5a82aecd45eb5ca91f3501ecf841c256d53f5593fc7d6635d2a65641fac17034c9bc286ec0716a5293617ebe6d2f7a147b784d90ad6a1993e177a096d757ee74157efcdf6076ae5576f2cf0544f2a80bf343cfc1e97897e54f69f07328000037105b17671db1839ffccfff29005984d02eb0c23b763c8f5a088bcc06f71a59f235dcb35cce9c38ed6e74a6907338a830aafd18c96aed2330570a79ad87b31c2ce55bb73933282359c0436398cd0292d861403a5a23d17fc30ceac7031bd3ea0ba560d4aff90b4fd2ec42b28448d528ef4329710c40845fd6279e392fd440dc0c3c6280518359a044cada4195e8dc5bceb6746fa173f95abf83034b9a50026b680d62cf428e8f940a3a2a2496519e026238c3e899216fd00bf5b9a123343f7120f6666718776da63af40cb2758bf16582e045018600fb36822c7dc75b98054531281de351832b38b1de06898235ce41468ba619ca55b35c976389bc3c57b4b37f5bc5a0d3ecac9de0d954587c6d82dde6c7cb28b80c00934ecd2d78b5e16c2c5dbe1bfb5edb2d1e562a4892032f808a5568e51252f946c633d77038e3097cc60839c17f5f816d5446e04d241e0580f907994a764ed5487ef3c5abd637b7c5632e445fd100c4417cc05abaca1a4954d42b409d60a2f5144700d0708f4253bc422179d8d8438a211db6f1ca2487384d9402438f2accc191657093017244eb890ccc0ccab95d5e55cdfab1b53bce5e156f954044f5c68d709443303a323d90fe0f9ae9985012a8cad00e5fa29faac1aa98d0a9ba5e02edde5686ba352ae192b228ca8b8d8ecc19ac39a46097b7ed4c589d599c131a517ac7b394c176ea5ac48dac9a0e459361a9619eeb00b5a8f8e222c87fef11c44cdba156c1f8d3bb5d07046777d27b0081b7f899fe624a5d4cb45c171a1f295e1d300eb412c4ab5144c8d55736156a7168aa1b0d5bb327b1ff7f7cfadced56dbcc33245f21f5be5bd61e79bb467c2976b6e4d0a46cbb96c2441f7fcb55313e521931628fdcc2645cda05c9cdc39ec29b8c5598433e2f331b7cdb3de351fb1169e81102b1481d6ef9bdc57eba7044276140a8c2066dbb60acd1b7e98cb7de116a248aaadd0d7b8ea3c6c06ec6889ecddba434cb1cd1b03d2985ce9cf7b96024a42d4bd02dd42149417bb3f1c70548d308b4b8ab12089a88538df2c101c98cbf1758f3bcce558173e8f0ee1608d6c238ed2c9b2c92b1a89dd68d8d06cc32792209b274786b8c6daec534bee24a9156d3cdfacad24600ffbb6468b88e6e40031ceb4d5a21497b8393e1a3a65072b6866ad21c8712bc1f27ef399617b92424bc8a4c521b52bb1288fbcf02b998aaf87d5e1ab6432f32c7a6613426672eab2bec197890a6f97e89eee6850c327eaf19dbe92961167e5bf18633cf5f4e69dd07135a45e6b719ad2c6effa73b86aac5422997860f35266457c10c77c317f9313b6c8fc75cf1b042d79cb45a3fdd1d4531371a5626a7db48046783f38c0e0151fa6326fba12b4068fa6836c4593f06f823f1b269c6e3df7db26dfbd4f63f82d0cd6983d9f3efb01ec4d3164c1d2dc7638cade04b68c31591f97d290680c0e8a917e3b51b24391b8385da2dcabbf74cb0906fb5267a688e2d764c971f932cb4a1317167f12c0e7dcd384b68c2745a743bd049e4ab02cbc9a8807e7948a260570dbbfc306cecd61c8491b9864739d684cdc45eab9414a89663c673d67518e4cffd89692634831abbf5cc0c11c59693b0bed4467901e7c3f541e3362e1bb38f4041f02aece67366b047fca96478f9378799c6b3fd33a5f45a23642ff6ec897338c96b1c895fa9d7b955f0c920acaf6e68e08c12d60ac460e08b922de920942b82aeda17c313f62315a8891b5d8f1fdaf306c21e185da3fdabb2f2d3ef842770244215da20ad1f001fca92a42a3087d29ca39647eaf88be44a679d9a6a6e9b47c414ac361f4ea178900dc00dbb8f101777b2102b53f06b23af309390205bd58ba7da1e4c3e0f8973c3a5cbac639aea4a10a3100b16761dcdae5308b82dfad9be68322da24b78b44aab90fbcc53e8f47b420386d333834a422c723cb4e924b13fb5bba9e27d2809e26d3a964b92723043f2ab9075c48aba6d402ade5453cfc50103a3f98a4f40b73a66460a0fddeec157d80677f3115ba88f31b48f9b483a6417c90c1d1e00f136e4e1ee983905a24dd556c7d01e92805298cb923be62403a5223380bad2ece280261bdbd649a55412b0166d7a4c040825cfd47ef362678ae8343cbea383a00e53892a7da175882abe4b55e5c41c2348d16504faabd02ca87386c557919b5d6c3beaa9d782c12c3e1e2a28864e78c2406903302d10e42441122951336f781817315a59304f4ab1ef28afc3ff8ebe4dc651f2d48230f8777b8d44d61d6818c77de458bb20f83c302166b74941e8bb505e51c82682b59b1f33a4a5aca13d121436932b50b10faa110a20722b16a21dcadf6f6d008bd14b8ab101f31336c32b0100ecd9d37062e573b3840e5c1cd44f18a1013f2d9b73774a61e22b95edf8585350ed77c3ebe16d5ba392d392ead80306ab5f978d36139f422634f278e1285ac67020e3454d1d507b615ee6eec782194c02df7f9608226df9f16c7247963889ad4161e64feed86d3c40c997e1d0aeaaab742b73644635fee61e623cdd2c2de338e7ba3a1c83edb49c89916623845d7aa6ff7e5d80549ad14044f7f35c555f22c22778d1e76989b7f6f17f81b85f69f17fc95fe277eecaf9a60ad463134dd543b34d41f10029c2d2adb735372b47ea96656c2cde9be76151296539688835482630c0b27b6d6197e258811e4a9b109b3251d5a008f3c3d56794705db9388acc9f88480e12722538382fb42599945f9ba47a59acba30e17d1682db9359fadefcd7004552272436c32d2edb806a13e61798fc90f49559137e2b41a73f09e145566853d98ec1a269cf37f664ada0332eb4c25ae5e7e9b8071534a5620037dacc206edc517875e0b4c55111017d051af01deb59745e750c0b174e03c9bbd6f5736bf9a0fdfd90449cd8ccd3f7440330533cda943124055d5937ea6055b0bb8613357e49395e90e06a723dc3742d417248e2c4920c47cb869be1ae20f39e592b2e8cffc83f3bd7fe7953c2d07b1422bef0fe6eb03f858c89d8a40ecad1453830c065b3ea2f7c75bc5ad04e00a68da7e5f823515e87eb909f6df3f2a4c73fca356e0aa9b6d947e53a399b115c8f91c1c688750d41da86653877e0e8cadfd5d27fb805848932787f4bb1a9743e457addeafb943c6046847592c3b30639c63207d81776466b93186acb4263a01dfce030970e1699d897da8109118e66660972ebcfe5b9a1f7ca530717caadf10eae0ab71952725375888f0265b21fc9578d10cf4fe1a3daf91280ec4028443db06118c3d432912844857356e4d81d3ace9054b7ddd148f94b0d4b4dacf08bb476eb5e88ccd0f8d26469f42eb49a24653333116677371684d3475872792419cb5257a1dc48504040026dae3f99e240959e00aef5988b777b8a590769977507a745272c905cdb2c9c7f2389407f748a663d1797936507554d60503d48703186bd601c504f05d5149b018f773a97a9fc281c889ad2436e3e324700b21c59568d208e824fe4af60fb53fae9d16146f10f2c48205a97e5f13b6c6b7ca3fce10becd3517c3b2a5e58191beb0d3e5e8acf3971b24a4ec6ddda6d7cdadb9c2828f04a7973c1cb7b016f466fadc6681502c9188c3ad76ad78c0e7c1f66f0ee9f15b3e2f4b469cc1780e877e215e8999985102da5c74ae6e43299ea28dd6dc68d359686ef88ca36b0dd12fd81426c79f7a615e1e90233d6a9f2ef2460218759b6a91d5162281f483fcc3daa8bbf6f5862eea87b5e1b981286ce2e33dbb62b0d687b9f0f0cfd3d1ad8922a9600a9b7bdfc57c4edcddd0e8c196ed50fb80cefa32aecfb55f0cdd076d297bc61d936553210bab94422e22b9782edcf621c732387939cfcdbd8d19163990e9683d03b752532a0c9f32363becf1289451f9fd38718a11d7f9866e82b8af179f93e65bb017ef6a2ef4f5adaa825a39d6212acee0aecedbd47f6cd8729473631e8549745dd5e604aa44dfa03bbb179bd228bde98136688896f5cd1b7df0c6adfd361d308b64e4ab7e85b4885abeb38aac03ac453c89730162028c456cab730df51ec0b07f11af8da77092a504b14807193f6aec70ac70a65fcae5bef497d7bd7cf65bfc224ba13daff9e8da94bd035e3ed9143236f43af3147537d33e87abe00efedd2c8d1dfca33230e15e9116b31cbeef01d15ad9efda1fec8d0eb715c8d415b5293a796eaf378abe25448b7b52b296df8e5bbbb5bb03f601fc98eef69e2ed7021ab54ac027e61302c5a986325728278830186a43e79d219478983c421053923354511125ae8dc3dbcc624e3866327f90f8dd1fd4e5b5fec98f4722699be84368890553047ccb65189d5956c8d89e6447584448804ac9e00fad5cd0025de62b78994b74f92ee9b22d0633623392812e61d794b5d52f7485a2c7240269a4b73686956561b3ceaa43c5976b64b3300805546182e6c7def6f0761dc2cb5ca3cb7741577dd5701fbee0be9142a695bbef014fc9a483be9f5492c46132afa888d1061f3a4aeaccccfeb684b75cc2fbbb61770766066b9e2e2dc7394797cf0a8a1175fa2f869ce36b8addec804abd05a9485d3dd478c2cff8101ece111a847016d1211fc2c33914bd08373943bb8e1e2d72b7a11744b94716f1b30e8d230e500d7bcef4e11130baaf660559d453e1485faad3376c69e308cf70dc2f42f7c139f4164007f03a574a6f87a3ee2ed3b48b097245d62ea32eb4c590ca5ea1fcc56b6b15f0807c8d83cc7548a6255312907392d9c519443594f4c3b89e2bfe8b646b8a1fceb3e622344db08ae623bdb2cc525289ecdffadf912970fa55fdcf360b3a3e9a59715d97e05e14e3265c57d4fc43e886d7f90a35afda3097978e57113577a617da6299242b61d3dc412092a2452fb7ac10dbfe8c935bf13c6776e585abe58020c603e436214404e78b8130f647d750803cd9f4b2bccd50211322dca51041806dbd5db5e1421a864e0b1da1b8103a07a8a85ecf05cf83da483b19c3a0dfa38afac3c4bb0119f50f5c3d491d581909d2637a1a05110bb6995116ef2da96a1a444d67661a5d9ae99e3e74c06ec123bc42dcc990b203dc739e2ad00baf604a27e7b62d532810a4624bd6b24bb8fbe2448a5ecc8820f7da973ba3a0603841e714abe247594109b84a9e8ace54428ff43b05d4ba4775258e311723431144cd519b9dc328cb83f1f1928d6375655b97e92c40c7b3b5ed3d965c110fc5aa0bf520ebb05c6275770e1b965350624498b5d3369a9a88a3efb1a4f1a483e88ce48886b81c7817efc09f65161f293130b124be7f49a36b4382ce94e13d0fec30a78a12121c75f40baac25f100cb638646fd3e7ee36e6606299fbec85abd0c9be0dd7f55f75dd2460dedfcbe2a394a430207d3767d490bdd8661d98926ffab1b52e737844346b038d57e0543583ece1faaea3b9d136daa6ff709ec60704c00d82a65afb3024f2280e000bdf090e17ecf82078a5e0b8d437f2e271f0d210844943b094f637bb4752cb393f1b2fcf51e3d3345730c00931e95088f7863ebc04acf632e68f9ba60237d77c946304956da2acf5f1b9b56daf78ea2f0c341bcdbbc133a81be83b73822edfa35f719481064ba1798264cac50dd2c274e432c9a356c2b00cbd3fbb980cfde63fb47080f68221e5feca6daf3c76425291c23ad3ff6b5ea5bd8c046aaf18c8016d1fa2a16d1300a8b6805b1e948e4cc776c45cca851f21373a39136ac215dcc9e43d4be9c19be5707fa554cbe8eb58d25512971a99268bdafe757595228cd2a9d6d5b34a6975f2ac047aa152bc1ef30125c36b22b6f8d8967ca51456bd2455ab59dbc82b0d15f2826cc07e1cf85ca97a362a4c915189174300aab4d65522c8c2e42f3a4f5046479f2201a28629e1de7ecf37c8064b0911d2f92b9208a5bacc16bc96413734c53c9da4bf7ae4de7651c4518be28f2cc69a93eb70d426e4f3a28c7c7f5ee47411f9d060a7bd40833fbdb01b916c7afbb32e88d89bcd4f9ff414b7d528dd31e8716572e0591960c23bd516fcc6bb6ea4e1ed7750bdc3a53c2fd54cae8e502bbf4a650f9263c1565ec25690e5871c8c341b3f3217a663649e4504858ace946a3229b02f4189bbd4ebcb8415c40f6d945a8502c27afe6a9d87f7abec93ba886b5537e36f0828b085fef921abe11b78b7f67d09a7aee1beed7601aca26dd0679e835793c15089c68f7dd71a28dcd8b645e670ad620617a9379a7293696c237f3678eae0d97ecb0794030bda025b7899e0f711eed2fc7874b53ddcd65b720a4538c43c34f336e6a7f57ddbb02554201864cbfb8af4fe9eb2f6a793723e2db98040a8a57571b89824437aab52dc13a0b47150571e4aecea2c0889c7ed19f595c75a6d1cf30b31bd0853083101e260fa5da81d9c5eb3c18130354f889ba9952373ff0a0066da871c8d0602bc6b180ae675c864d6d382996902e9c07ecd6a6c5bb12d536a29f32795765fac67d06ea25e0fc45006535123feb5d30f3c9d4ff8a4553c269c71d437a4deff54182c64c794f433d935b37c993d0ba313593fa72591ca51fee3b7fe686d460c4b7ca6cfa5f2dc92bab462c2badcbd31edd20b0bf03aa14f260187a61108ce1f7a0e6d51baf403d186bc789b4509f416395a5bef710f89afb91cefc1ec4d3b95b6495dba73f52062fcb4e345e44de0182320bde993800846403d281850941120a9219bc92bcc9ab090a798a246c6816698295c0512740af3c9e28725e999424b0e3e8bcd51d746c92ef9e14f309ac9b55bd6b3eac31065f75240228a362e931fd9f15641cda230a66862e3c3491683a963de1175b48ee67fb80275a08e4111904302b33f70076c7563015112b9a288b843cf2f3cbd437e1b85e5c3577e552fcf2bca6d92d6c07d98f33d9f57267320ab9b944470709ce98aa3557d324eb34e00dc74f2885a10ed246c8472fa2bd2a81515201ca809b15393b6ff9f0e9f72590b93dd37c4c139f525201606d9f691a16d1a70c7a1516bcec88b3539b02cef958b59322317b6f724d58a04a94889632859cd5c4b9dd5035fec8c12ad7049ab1a90635fc17b0d941cb4a444c2b9f777cd2ce450fd65be7025d2eb10b6bda4c0024cb1d8e46a6ce34edc5074934f6e3c73a1497a21178af5fb7d44f8aa5f0461d1d1e858b703204de9c27f2b9566f3596c09e9185131000366b95a974b0194ded3748ab42f2e2dfea45a590e8847714027addb12e1c123c0cfbeb9a024847b31a25c021d99f5d55b186875c3db7d463cb2a9bf1c5303202950eb0b6a488e44ef3155ef6f302e356691768d4d0902296910bd8a0474251fe44111801398beedd453248174a1468c231e4747d9f71425172262e62dd12393f1e67780122d71e92f03b4e09fafe84eff1059137b503cd1c80e08556950f36387f083efc3b89e563a0b3051d3cdc39b3e0d3793fa88d4597df1ddcce72ae8e19fe3662ddb01547e02fbbc212c57da9eee09a56eb0fd29b13767275197bebbe9a7a0efe99b0f34650c561d4941fb990496c92a9bf28d7c8e75812011eb082324579f4cf8203c1a94225ebea263808979dd94e73e9e9e9e7650735750f6cb26d00beeb51dcbb00d59b807940bbe2db19e9fc24e822be1463a22477734169a9796bd6b51740a5dbd2c6527f1a543a60ac29a531d928eb6fffac253a23929461fd8d6c1deaedec7d803c4f0ad82210846e9055bcfd70f1983e4772cc2374c292bc81aa2b68efc21f0243d2beae41c2967725a4690dffc33f2530e803f79680bd53062e91c9e7e210199922647364b8e385223d9ebc0305c92075d1c8fe5b04166c46e4f3c24ae6c5b1f78af51fc2f2f34897b540c4470f773df3f6decf0844c0853a1e2f2bf08220c81f660724e6682240c5c5f0c91f04c938f021406b5dd64ec0809a2de3c259901361bac7822b5c15e8677dd444a6b0c1816c26cd3d82e5ef7260dbd2b6e40c82dbd4aa57888eb393e72d6e02eda7f12e686b89741321019b0dee1e5e800a5a5bd4b5b4c3880f089bc390640ee30c7291954fe59f1340d189461f0decf67df75a866c123ea1c9cf3b6f3aeae4b1570bd749a10b850253dc17c46804a259e13fb780d034178d8cd66fa09bfc837b8fc733603c1ce4088ee59c3b48549cfa7fb6fd2fc13b41c6924f4a8b6afd0edf24e02f2c4545aefc3a96d958f752a0eec91d085c19c0c473a9803e7365fa2805e55bf99573e1218b4cb032eb8a14fa0df910dcbfeee6f9a87d7eb2ef1af90b0185391a9ceba74b9ce4a54ad36aac8a38c42f89ed9cca8f46f19a00ffa0b109cd72c5f1969b865121a0e6a610f528064e81209502376bc17e2c40ab313b030e2ffa840faa2be0c2fc8d15363708f48c14cc5f3af2aeee0d307120251ad57eddbc61334baf518800d352c5c3d1c1efa1cb742cf77f4e7e9eed0ed53e488f25bef650f6f782e5a2a5e5e9dd179fcb19973883ceb70f8a2f4846f59977ca8e1ebcbdb385d69ab7aa11e91b823b34a980969e893fe3269e5d2c7850310ca1f0c96e004cc7decc9dd798359b76affbe48fb9b5c4a447f4c5ee983f0100ad438a44e420616a8e0c406b747b63dce2ada2545442b17fa77e1c1162be99d85813708bb08a9c082928c747e5eccef14e199d782ca1fc9f3e7f5c599b04a653a85139a4b8e1128b60f2a2644a96b7b1a03be015ec0d7d96e93c92e59be62d0c03cbb44afec5cd8b45c5ce013dcda5a29af8b0a680c1e82f4504ba26b7168bd50170a3dc4a139321c5f76d5abf619002b0e068db79dcb3d8845de5d159d5dc9497bde7a87d30b496d406af3b8d09252a02d238b4de91e23d083815ad314d85d9d2d8104741b2f4eb4d1fc419d87c00126ec34798dc836c90b22875cc585d5d5ae791d01e2660bbd03e9129a21d2018e36ef60ac62076253f00dbe6b492fd1ee9427b7575cacbd839537186f127bf47157936088972e2709ba69647945006066da52ac2652c3e64634830332386d15724587c7ed61abdee2c933d892c110c1111f015df2c17e7fccbef923fb36d5aac47112765e66fbfac0b964204de4692490d965699d8bc3fe03ba059e88c7040427c1cb07503b483d1bf59ed8b6ecdc321035bae898263cbbd3e96d4667b1b7d80cc50bad5554e5e038321cc3a10e09c50171e1a30d89dc96a46d533a3cdaece6b6613b6b094e6e05292927eafea6e8dad6f8c4ae8685c9e44a73878bf259a29af62fa19464da2b3a68aee98c700cb5b02aa0673f032395642af7a828a8c8a259fd4cc2b290aeb351d6dd45d3731f2d12e552d1ba9eadb3561d7aa45f54fc2ca19c6e72c4f24fc1bfa05292981c014dbfc7e0fbeafe3564235b79da40a556ef5ab0cb67b7b2f9f9294239f387d17709a8f4b07582b9ccecc0e79fd291a292468c61a7d2f498b681d1cde8ff2e8c93a3d47fd4bc009546aa324ace34b643a3d4fe160f3e6570706396b5bda18713a7da074e12361047608cca89b08e0b2208f01a630599ca164c378cb0074e06a69be8281945f4d68b8df0f70e4a2c4a61642907068c8ae6e13b7ff6e6694128db68dbfafb52418626f1ea86cd61b483c473ea2582ba9b0520694dc7a942b04cd5c21349fbdb50732f6c3df1c6df0c03880b12590c51c90cbcf0a3bb2504a47c7baa413eac4bbe4b80bccf5833c10b4072be5038b34cd48f19e9257af1dfe41dbb7e8138cb930f26b4edf66827e0ebc962b547f8cc072d7e329bf2e7cddd6543f5b60a65c519528b7f085c98c20cc9710219c6707677a96140bd88a66b76e6917669fda7be33908218334b90f7681ad99a5e36a4bf712fd0b024ab14ce900ffc4609e1e15996c25946ce9d168fc0470ab38999e60855ad338ab7a079930e63b49e1928c6bf0f8833e48474a40d9269884f4f1da2d6f6b08558cd1c981aef1deee1b551d7d2861578ee650e93a7958818adf5b256d58ba48c196e2b97483d62aa24eaf1c783e41d114b883e8577ca301014cad06d6d56ee58949ac9ece8708e9638b56e0d418d42c347634cbb505b681c1cdb1edef4ba95285a53ad84a00c558efae21dadd04866cb3ebd059511f702f1199d35e781dac29a2bc501b05a521e0e628dd5d2cc4193d812c46919e3b5db5172486b7e20bc21b7a7d35e12339a98f6381e386699ad58ac86483098f958f298cb3e053b3ba09de0ade9f2502949ad9a7668eab2cb0c183cf56ffd1c6eb49488e1b846ab2b059cace0f968303958dfa208057ba491c16ec02f507b50780075567e459dbf4fc729bdf0c6940bdc1877c6b601cd87c1734e2d9e7e1323c74b3a260def64bea76612f38d7cee744c5a25db759c9db153f5fad3c8c4952909e235c8f2f8d71f67a646012a2cbba41b4e01181be438821307219e1587558a2c016d50b329a56cc6febcc1c7dd36e6cc66d678ad05abb099699871f567cd9a89ecd4ed2a16408f09590af564c499132e590984314c2a374772afb83289dc511131d7a4aa3dd4ea86c11a8420652fefdf263db65e2d52b296ed0699b653b2b5512bce254c4f1aa177ea500dcf93c0ca2863bf1fa55535d60b26583cf45a97364c54fb57b1ade068b15c5f426d0e406c35095eceb52297852e4745500374485188c228a0107193b6fee74d21ba129f0773608a792824353a84aa094ef6defc235b2ba00ac663d2f7278156e9d06eba79a7b201e1f81a1a617120cab0a2599b66dbdec5e52c2b35d3908ac263979ed340ab8a3e7a658a424568afe445c10651ef661fbb31d2bc7eb8d8321461ceb3b724fae9bd3f6f288f2f1194eec449aa8e7fc8485f6acff1f51e7fb581126a43dc606cfc0ed6bf869eff522f7f7fb7425c567dc41bc98be685e5c5f4ba7aad7ab9bd36bc0c5e5a5e4eaf4af326340c0fe836bdba9e49cf55fd3e1f24b8e379bf3185f0c1aebc16bf9cc2d8070f66f206d578ed35fe901667b1b1055e49ec164f0a768e819fe176dfe98b9237346d4ee331169e061f26f08e4d4c56e108767c371cf4fbd37058152436148d9839576804a847fb85fc6b6e9086146a8fa4f7de43d128672e40903641ace721f1e4b57f745cd7b231adaf79d2f87618e46901b8c0c582584640d6a8c716a814da1feb5061221de50701faf5a8fbde189cba0bf00aa34bef52e06336177d08d102dcac6a4ec23227173afb6cb4588f07d09eb5514980dba5c3b692133b98702cd0a7a0814e74dbab3cb40dafaba035dc3dfa9c2cb8df52279eaf97feed730b47c89ddd1edd58203bfaab174f46650c0e61a6375e909780ddeb364c6f7efbac8a8ac63632dbc3691dddd0c53376636ea064cc087e830d783933537dc2e428e502cab4d2ee0176aa1c04f8eb9b816cf538ad735281e361a5269fb14f0aac540693e7c31527fe0ca60e6083cdfa2b1f6fa998f8a639e295f79b52f9ec8dd2b31b05ace26abdc210d923c94baf0c0e438590dd865faa3767cd8a6f0426e75b31fd8bc05130955c9516849f7891772b01d0d152c57270e81493fadb1a48ae9890cb453349c771655b17def290938074b15df7c197f48469e6abd89ca0517b4990b9185d6a8d9bb98ed6a2fa2a617e9993db1b5a7645cf275cd26b5a6341387736e8d5b18a07b085eeb5e40fc759c2b09af7b42b487802807963c0e16d605af2b4405dcfe291809c63fb7b4cb64c694ab2c09f7b27246e0243a3c8a0fab8419d25a33878ce03b512a1c82615d4d8a0804f7a52b4e74765bb8504d9a983229b0ed4f050410fd48e5cc192854f52b4351da8fe502b88b25cca17940a284ba17c43a972501659f9865201ca1580a27d6f9d67eb85da07052c5474a8308f023a58a34bcc55004da8d90c0761c941e968c4b1ed2f112a1394478a020ed7266e04aa28da09be4d1d34a85f5028425516559fa474940077a8a942094f75a882ba17fa00835350f440f9832aaa40f57d47497922299a1b0a686dc6af25404164c4399c8226c7f82bb5bf00da3759333b60b024e93033333333333333333313af72c66fdb36acb5d65fda922949527b223a022a42c0c2a524534a294582f6c9cf146ae2736560036efbfe7f0603010317039fbe7c8390a0e12ce66e29eccbac7151174348ce70526155f4df14c2a2bdcc707a99d7568a337f9094e1f02a6995e772e7840ccb2813f2d5f4403286a33c5731e682298683cb0e99b2a6846138253d5f49df370521b460389adc2f2d33a6932f1c84eacaa723cfc40be77be51654aae8d9781ec64480dc857c4f6826f96a326bcb85917041d58c29e6384be7a9766fb285934a9ac7856c5e2d4489168e2244968d50311b49168e496fccca577f5838efcb8c318456aea5dc557285b38aa5b2752a7befec122b1c5dac9ea9cb4b935935a9c279c556d4e525a9f7cd192454388b94a62a35252557aa245338067b9941b68464904821a390cb6bc7893df132265038ab1835f3a9b4f109fa66cdde9ba490524e9c70a6dc886dd725cf9457d2e4a22c69c2e1fc47d5d4c47435bc4c38a9ee7baff8d33c31cf235982717c9128e164ffadec74263149c25975c56e595261532141c231df976b9d162a5f4b88c9118e2dc3d44b97b52be3df55488c7092a36b63ac18d5766815e198f598ecd0f716544b221c3f85509108c9108e196b5166b5a97ebe50084735dd19c49b5f94e5a71092201c5eba9f0c52ab918b9000e12042c5ab144feb46b3f30707a1d2cbc54fcb424f9cf8e0185f9756b1ecbca407a7d8b6b219a24a86dcee121e1ca392a155f36cee921d1c459ca99938adbb4407e77599ddc2cba01c9cb7d26bd7abb59059b12bb7840407c7685a4979cd7cbd6fba4b6e707a5b8dfbcfe41d12121b1ca55e2e11b75ca395ea2ea9c1f9950957a5bf72090d8ebb599790ffdef8aee2253338698a513b5f64a7697e890c4e6eba92c82055febe2e89c141598a2a75cb18f6a4d4592181c1513766d3b899f13e73bc571c840b3d99ff56e78a83c6a045bdd63dca82d0b5e2a843fa9cfc5ebc1721561cd376c9bbbacd9fb55771fa8b794fc829557194b174a5f42a460fd18b30d0c707d22d527190ab6405a52246c5d15d05d5e2eda5986d9de27049838a63cab585298e4a3fce3fe34dc99fb628c541cdc5ddb83a4437bb5b90e2e479dba954cc8d6b3e8a8390a6dd557ea5746c92288eadf4898a423ce47f8ec7130dab5a74ee74f9ac38960a27afe21895efb7d0a73345214b5471d87c5adf8790bb6a5592541c4bd3b482d652828a83da55f93bb35794a6bb88e414272d424577756e8a6396f17a56a53400fa9094e25c7b419e9035551791e2a873fb4bed9a08adac511cb682c62493ac68a9a24471dea432cc66b5511b8392509cf449d5b03975ce460e8a63b4a8da69b22fa697e413c7e0ba4f6e8f8c6ae3c81367572a7e4c867ad3b8493a71f6fa14296b723cb38e134761bbae415725d9c451e898545af55c8dff9a386a36192fa9ce2413c7e4adea32eb3cc1c439d7b49adaf73b2575c92570cf7039d1143a329638d89f9cf68ba3f4fd9d54e2f8263533539414ddfb0cec22a104a79ff2d55daa1ec6d20d109bc4d2ce4f57be535d462289a3ae183ed2a5eafe8691389ea895ad4b5c7e97515e249038c99e2ecfde2c0f636603c9234e498bba6dd1cda1e2ac1682c41107bd7184060b3b3e5a6a35924618c74a1861c8dbd7ab5dda58e95d5dcb72d7dda4692f1ec6be40206041b28893cb5c5a05292bc9ce13459c2debf838592b2fc824893888ff9dce5b1622ce32ead1bb11bee1fa1fe29ca1b54397ca1be298e565f71dcddfedf2421c53beccf5502d9946429cc2681d979953c920ce9a1b9f2ec282d073268238aa9c51e870a1e26af19240ac74b4abee36fd4d3e204c6ef7b629b225aa722f27e36bb9294cfe7016ba7d43bc6878957ee287c35a1e591ba14e4585491f0e320bfb576b227a592be1c3595c678bd795d1e7f71e0e5e5228f5a936a960233d9cbf3564f42975ad77cbc341a80b4b5e415d75567838bf8e9595cad5d49529b9c3d95d6f636395925ab93e6a8420e442628753cc525fec4c7ea2fe54877397f65539bf4287834a51c5ba513a3745cb07c91c0ecab55ca54d48f172347238ac1cf5a3ce7d94b44d12876354632f7a4e6b5d8c07876314ad15fc33b4d3fe2b246f38fee61359dfa11b0e3fa2f48d8e6acdf7bb8c1823c8369ce7624c96eea5d242a83c48d870d271d95a6e986507c91acee3bb9a5e8adfeebc7a90a8e12446b9ecd0a77a1e6b1a8ea153496d5a8903aeae98e12d955af03494068d2ef03e3e24860922732869686870afb5d1d7d4d0e99a5e7f11396c240ec7707f516e5a89aed6e070d0340be7e5ade95c1b79c3d994685db631cb0d07696a26e4af1affd5b4e1a062b48a272a98f291b2e1706157b9d6524fe1e31a8e223376dae6a28663bbe52d3152554fbc8c04226938a69aadb9a5110dc61139039ac194e1f4ff1774cb9753955f11321c55ab3615548cb1397e640ce753296ac470d49a537e4cc5125a0bc370ba6da932aff9666e8f80e17c52c60a9b75b9ecd52f9c7b45c90a42f4f5e5a80b2c44bc70d8886cdd5c92b78d4965cec9d1d496d4756d63868a74e124ff6a715f4e65399908178e3a4c4c8a7519a5ab8604912d5831268de91a8397dcac89d82c525bd6a34413d1c2418853e1d4b6caf62d412092858b60e168414b6c29b552207285a367e613d76ded7959e12033bcee3e84aa700cf175955d665438b82971de32be1e99c2b1f42b1dcda12c676e11299c7674abb45ae691281c94f766f44c7942b7d2074a20038920e43fc0c1210381d111f2206c30004d8840e194a21a19836e996ab3dec3f8a7e0e337c0c151ee23c4c626224f38ba5a1594ab18d2b2123d8c9520e284637b98ae9a512f57c72674a669263d4e88094719cba26e95bad429556409a738bf15b357524409c713db52b5ab78527e8e24e1b451f5a4451d1a37368e20e1242baa5e15658982c8118eeade542e0d9bf317eb8811f60491229cdb4be8515791caa48a0847219390f716bad5bc3e84e3fdedee9ecdca2c4f4238dfb7964af2f4e8c5a048108e5a8718571e9b46661a018275447e700aa646868d112d565a7c70b697b5a1ed2bcb90590f63ff816c7cc1d1c182480f8e4a7aaa8aca824af6f3e09856698bcb6fe32bf43b389d32571ae25d6c9a940e0ef2599eba6f2e8f9873705ed727daff4670705c8f37fbda332f7bdde0205d7654d8b47183dc446c708c9bfc57cc06155fb86a7054f73a4f8bcd6254e33438bfb8f5ec9793faf26a06e754fd4aab189ef285940c8eb1162e9eeab767db91181cdbbccda4884ad33147607072d7f4f15ac6bce26c59b9b9ac52cabd82ae38a918192de5c76b5e4a2b020fe8c285191778e51690b98a031610868c108f14c4a0c145e150c3610d502120373e06904518898b036401f2f1ea86d7f8b0a1c5018961031d208b26609105165c30022a80050848e21000005008728e0164814290d7f8e028001601508016356c747ca1500848470702b0c8220105d0820b189c523a6de157846966d92b8ebab315b4455d2aa571c551cf5fab09cf781833337e462b4ea6e2c9da32cdd2b5337e864658a1456415e792263352a88ab369d5529606253062f88d8e8e062386dfc8541c45363d457df96b0d7b1863193766202a1e8c1a3366fc8c02444e813142bcc68c1b1d1d5a444ca145a414d8618008296ccc1845183694280eea55a63c0c9fdd389bf11f1d60c4f00e576f03a42d14210f32e3671020020a83cad43c7673faf00091f1895372b9328650b35108a187318c1122c303047574b486d0888120346284c8887123757cbc8c18e689d36b15f5d03a835dace40530e001060822d28908278a393656ddad9b782ccb929979b78826ba944c3668d926dbd0dc65a66b6fc4bf7e1366e2f8da5636cdf659926304136725225b28fd5e3521bec429e97f9baeaecd7a239638c992235e54a9bab9990692d181f71a5ef07b0d1a59890825ba1939add91c1ab41199c4296710526a6ba5c5066144122612c79cd7d5d3ba242cc8d945041207fd5ad9e2284d66417ec4d1dff42ba1a275a353479ccb624559a3f4e2a96fc5f00069101b353a8a4520d208174418612957af4d097761088d9f611800820c30c002e847605e1059c441b476a1fbf56bc533c900e9b051e363021145e4ab6979c4a90a3dd260410d1991445c1eeee57229998665ad98e2a508d973e771f2842b8820e220fdb75c6cb72fd687389c14612f63cc8d591d32d0210c2286386dae28ef4d25b542ce186934228538bd5649ed9450238438dd9e893b57954bfb034132541019c449bca2de8ca79d2a06d9c01411c479f4c977d91755dfbbeac1e8401c73d74553e95bfec101401c3e476c9d9a788b517fea4500020d44fe70bc944dc62856bb94a10109f94021207e38c60cb2bee6eb155eeb65a447a40f27d35faa725273bfae14ab11e1c3f155ada9fad2ea7e398d11d983f22b67d65e681f113d9cf4a86bad43a97b9539249287d3ebef7b46955e682daff1012f3838d26cf170369f530dad3df2a18ddca1a065299a5dbab9510d2d6287830a1dd24dab4875a5aa039fb1334e33636c6ab62374389c8d2983b7a802744a29638c3184102232d8c69209120401498ec3281224a575d803124020310805290c831886a1180a320411420c218410428821c4181b2bce01d3bed2698d1b81d8ef282ddfbd36e8bc4dbe564b3ef676194088c744cf72a120295b8c8a261750575c1f16d16d3f77184cc4a4e12ce00c162a8e38169eb81330dc96e827ced7676cf08d73b9b7711e3a29876e26a60c6446e3e16578b51044e40584a61fd02c184524ecd61dfcf97bd38b17887920bc13004313920d24da8965e5064a5a7070602c2935facf30c653f18876815a971299ba5d3e22c5ab97828ded00d14efbcd86e030699ca914d3812cb43b1c3cde6b913aa3dfa7163ca0dbde1317f850f4d832b01da8ad0d39508eb92d83dc3e627d639a069494a1b31f29684b1bfd5943e4cd19758a1367708a2cadacc8614fb46ed25055f27bf34aa7dc7061eff5306a36885351d3e5622f9682a9762671c85e76a35573af1261a23f018203bcda627acc87a3915bc0ecd636340da3671a4f584c473eb8bc20cc7bea814c69d2d361c90d40854b4d336d6207d6262e3551602a597aec00417b88d5f90a30c9b2abd3616e32b424f06b7cc8fd600fe92f1aefa9ce21e926e92ff2da86a2c1047f33f99d512cb7000d39be266e15c49db6cd8ad5b9152acba4bf1e2c671aa8939f2b739dfc356f751a57b1d3c19bcd2c3a606790c632fbe9b05124627deed862cc643f508af4fa8c4b3419f4c0e2f462e0916738e9160171dbadf834f1e28cd70bfd940342e4f0cead938f62d13dd53f75dd39cf62bb196b9ea0f81a9927366e9d43cf34db7525c4a59addb33e6ba89a5aab6d853160175cdae6d45161a911394325f8ba48883c05b1403b2cfb06110ff43aaa15ea755f4899246b2b9c6792ee0ee5d883b73993df1abdb731678c20315d629fccb558dd662041c420e0f82e5f34d1c7f5402483ac3c1c90e017f8faeeab2dc615c31f9d5792a7e8166d5bb8dfbcba2aacfee4ff96f9225f2dfd33118173920bc8b108512b3b880ae22724f3f539723edbc6b32ffe78f563b9bd086c2183c1ab5e6a3b8c8a0e657502fa55e52a5e8784b39b66910801dcae58aa4b24c10f5135699e4d4e032a4332cca7c430284737b0c43afd7c0d6ad307df786ebea9a3848f583b9a424e6739165d20f0b6bf728bb74bc6442c1ed01052055f75fab67727f1d8565a6a6dd6b1b39654b0cc55ac3c7d459eb823cf58a097b1c5e32b1f334af13158e36ce534d4bc1e5b03e73d75a382a962362b547f14ee5e965207ec1cb9862fa04dfb68d70bba189b75c43474f48ac0899aba7c8c4b4e3da0382b7c8190a901fe9f397571059de12bc4af22bf078034416a577e2ae30e8d3b4b4e4cbb240e85cdd84dedc7555781cd2dc678bbcc1a8a35902aaf350327c5072371ca4ea4c9ec1b106eee8df296ca6ed34bdf35c68db1d5d09f4fea4216a41ec9021c2462f7a52024a83a329e47b105376b7f7f19ed864c0e6cbc9d3e917ad863155e5293c01811e2e33774e378d071642c69e90c2d7693ef3e3ab0da7dc1d387e5f961234082304a6a9728a909d44cbad13c78f36f1b38c995706a8bf7a3162a7861f1eb74b8039188f85047aa9707e370099dcbd2d5924a0e84df7d3f507840c118d46c8f2ee0a01f027f44a1ccdd4a81cdce53184f50322aa51069d55e033d0768b89666caab9b4a2636302df04977a97ac266c904951574e5d7fb0d4f2e6dd743c7a21b0e65a0cbd919da5d3aec411a7a3b09e8e624f801ae3e7475519c3170bc0feb7c5b928bbba3d99214e80fb37f5c66c62f3d19268ae5c5fef33b83c76b89dbd7cac93c6a1862ee6b388eaa7eacbb2cd5c952a76a77ca8d7293bf5e5ee4c6ebfe29d40b0bdd0ba5405b7a22175f11f04e996a94d72272a375d887305484d2a91087e43909b4b8712f9d9993dabc288a9a5f460943edd070d46385aa9d99b6b3b787872a2a98ffc93173e019492da27b661e55b663ca7d1e49feb9bd5fec58e85adb3b8cebfa44e701df1511c4ea912fecdb7bfc7c47c83b6b3f53c4d33b82ee7b224fd1ebba02688702ff3034ce461398a60e87e7d40e6f33308e01dc418ab76430df026b9eb9f17ad5e5e0b3c6ced24348216157cec640bc0685882906509ac3817a3454960c9796c09f66591eabddceff693044e59b3a651333d7c20a38e8096d4d16893cba88778cea4e2c10bc2c5702836aeea16a51bf8177f04e25fe0a02e887d33dcddff262b904569acfe7eb0478f6f019a5811510d36e05b8c9d5ea7d66c6243c910ae65df3d02b0c491aa5e668f31a5bedf5bbe1342c2a204d5ff325955eaceb077602396b7b8cb93eadbf76c33d65cb8a8bd515d62eeee6065c6d9b663759eb792aec5240c5fbcb72f60c8c69eea6fc37ef39a66e51c8d8d1131ec60c96daf7dc94b3daea0739249a7523ee72ac708a53fdebae27cd3ca45e293c955356c69b0a3cc64630542ab37808d0b985abbc1bc8db1168f86653e0e5b5f034c3c5b8dc169d9a98dae09c6b12ba25f233ffbd7dd8f2c330362dbdcf33a06b5e41890c3fc520915eab1b325c2bffb7622c6d4c4cb181587a90ff3b26ea06a10bc33052a4db8952880d2227d2d843b5b860676e816a5ed43eca4b16102f2326ca59b99c023e991c2dc6d7085a90679cb135ab3dc0877b28f05163522abdf54a4880b669468d9e81720ae052106a6581f47a79bb8a02352789244838e171fce18374111eec9625eb41e4d1b36beee47c0bb801c68fe94899b437ef468580759ff8629d415d29f3b7e8627a74779b61b626c28a549bc7518fe6cc020045a0b9e0d5d241be525fa3d02307d604d3f162bf8df9779721ccd89b76e478fb42b852877e19ae8b6aff045eb32a8368c208d29dee757484f5dcc4831ead1f134e6486c235227caa742f9818d7bb795a7608e511d8c5ef49784b30a7800d7cbab5f4b1b4f7cbca6bd20a211bcc8aa066bd421bdbfb1e26a5558d03373b80e98a4c2659ccfbb7caaecc03e15182c8f45ea15f2964c2418b1fdf72b7111aeda61893ebd7d604a0b2dac3540a6669f476be4917d178c092034730b331297b8ee5f6733898991f570d538804cf672223cd46e10a243311f4427cfe6e5bdf628e0f93f4fce6452a1ec8f7499c41bba8d5a1148a6777111f052ce4912636ab04608a584028735c170b3c010457c1e81dda02e49b17911bb4157cee3ae3cfdea3c8afbb7d83f002ccfb44232f093e75c6a0cd9338c792d6093a870027a8729de9728f856a5d79c41917769c1ef4cf5a189978a84018aec0224bc8d33d878d53e77d470ff1f1fd651916171b6bab90c58a72950778f7d5bc55f3a627ced07dfa284c2772560f23a4b3b0e1bd7532e64ff3c7dc3c1d06c7efcd6ad203edc7d13fe1880865091321d3e22ba40025173828bae40311339ac4cfd3bb4ae512c0b7111f8a8454681b0e2537b6a9722e1c85006ee258ab1baeceb4801c5380cb53731a663309f65fdbdaa0837000aa16442540dce890c22921000e3717e81e7d8be164e64d89de0d76d89bb9235454848ae2cb4e201d5a7d4fcc82a0c927be82e12ad0c370a0c76932ff0de6d0a3bb8e1d8f39528f4849f1eba638ec43c0a346725fd0cae38d1e6e0939486f884de6c927467947c259911cc1684244424380117c8300eb7997cb496e60b9de216368f2264d62e044c628221f2a792b4d9acd6dad14f37f9a3c6f359113a124a1e842fa808827141deb22e4842da9544b2ebc6c7a09d6ad601e89119805031d077a44b3fa8f3f4d8e4993c8a61ef0c5204db0ac1b8f3e39696113c7cb75b11634fa00509deb89131dacfcd2885fe5543d635e93beb328d5fe4521daa6639da9bb98c4a9fa1185aea8a2d446e44d8cc6943ecc3ffa2dbae18035d2efdbd5ce8093d5bc3db8f3c185423a0ae8950b0b84fa1e9c829d2e6d63a2ae3f842edcc7eef3b11183539b6cb2bd0ae5a80801a83e9bb3b42bb26dcec0d94a3abf9f301f2faa636c3ebc9b0ec48e6c0e", "0x3a65787472696e7369635f696e646578": "0x00000000", "0x3c311d57d4daf52904616cf69648081e4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x3c311d57d4daf52904616cf69648081e5e0621c4869aa60c02be9adcc98a0d1d": "0x100845a5993b29977c58c9ef36aad0e09946f8a10b2ad30956dec1207beda8014a6ea1de453086c8ecafdcb8c05c2ffc5b31dca333e27af61595e11a6dc88f744876aad3978bef6ce80e5b7bb80e9ae9e1fb23fa1133088fa9e0555d6d96f1151bf8465e78528188a1511df15027568a300d1319d346dc7ddde5bc33dc8c27fa5f", + "0x3c311d57d4daf52904616cf69648081e5e0621c4869aa60c02be9adcc98a0d1d": "0x080845a5993b29977c58c9ef36aad0e09946f8a10b2ad30956dec1207beda8014af8465e78528188a1511df15027568a300d1319d346dc7ddde5bc33dc8c27fa5f", + "0x3f1467a096bcd71a5b6a0c8155e20810308ce9615de0775a82f8a94dc3d285a1": "0x01", + "0x3f1467a096bcd71a5b6a0c8155e208103f2edf3bdf381debe331ab7446addfdc": "0x000064a7b3b6e00d0000000000000000", "0x3f1467a096bcd71a5b6a0c8155e208104e7b9012096b41c4eb3aaf947f6ea429": "0x0000", "0x45323df7cc47150b3930e2666b0aa3134e7b9012096b41c4eb3aaf947f6ea429": "0x0200", "0x57f8dc2f5ab09467896f47300f0424384e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x57f8dc2f5ab09467896f47300f0424385e0621c4869aa60c02be9adcc98a0d1d": "0x100845a5993b29977c58c9ef36aad0e09946f8a10b2ad30956dec1207beda8014a6ea1de453086c8ecafdcb8c05c2ffc5b31dca333e27af61595e11a6dc88f744876aad3978bef6ce80e5b7bb80e9ae9e1fb23fa1133088fa9e0555d6d96f1151bf8465e78528188a1511df15027568a300d1319d346dc7ddde5bc33dc8c27fa5f", + "0x57f8dc2f5ab09467896f47300f0424385e0621c4869aa60c02be9adcc98a0d1d": "0x080845a5993b29977c58c9ef36aad0e09946f8a10b2ad30956dec1207beda8014af8465e78528188a1511df15027568a300d1319d346dc7ddde5bc33dc8c27fa5f", "0x6dd12b3ae7975bb95f841f4505bc193c4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", "0x7474449cca95dc5d0c00e71735a6d17d4e7b9012096b41c4eb3aaf947f6ea429": "0x0100", "0x79e2fe5d327165001f8232643023ed8b4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x7b3237373ffdfeb1cab4222e3b520d6b4e7b9012096b41c4eb3aaf947f6ea429": "0x0300", + "0x7b3237373ffdfeb1cab4222e3b520d6b4e7b9012096b41c4eb3aaf947f6ea429": "0x0400", "0xb8753e9383841da95f7b8871e5de32694e7b9012096b41c4eb3aaf947f6ea429": "0x0000", "0xc2261276cc9d1f8598ea4b6a74b15c2f4e7b9012096b41c4eb3aaf947f6ea429": "0x0100", "0xc2261276cc9d1f8598ea4b6a74b15c2f57c875e4cff74148e4628f264b974c80": "0x00000000000000000000000000000000", "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb328a22616a0e689030845a5993b29977c58c9ef36aad0e09946f8a10b2ad30956dec1207beda8014a": "0x0845a5993b29977c58c9ef36aad0e09946f8a10b2ad30956dec1207beda8014a", - "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3295d097b09a3ea2c76aad3978bef6ce80e5b7bb80e9ae9e1fb23fa1133088fa9e0555d6d96f1151b": "0x76aad3978bef6ce80e5b7bb80e9ae9e1fb23fa1133088fa9e0555d6d96f1151b", - "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb329ce21f6fa898c6a6ea1de453086c8ecafdcb8c05c2ffc5b31dca333e27af61595e11a6dc88f7448": "0x6ea1de453086c8ecafdcb8c05c2ffc5b31dca333e27af61595e11a6dc88f7448", "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3bd4d99ad2324a061f8465e78528188a1511df15027568a300d1319d346dc7ddde5bc33dc8c27fa5f": "0xf8465e78528188a1511df15027568a300d1319d346dc7ddde5bc33dc8c27fa5f", "0xcec5070d609dd3497f72bde07fc96ba04e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195026e3d4ba592e973c617572618076aad3978bef6ce80e5b7bb80e9ae9e1fb23fa1133088fa9e0555d6d96f1151b": "0x76aad3978bef6ce80e5b7bb80e9ae9e1fb23fa1133088fa9e0555d6d96f1151b", "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195045f1ca6ffcd6f95461757261800845a5993b29977c58c9ef36aad0e09946f8a10b2ad30956dec1207beda8014a": "0x0845a5993b29977c58c9ef36aad0e09946f8a10b2ad30956dec1207beda8014a", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19509ec5a66bfda48ac661757261806ea1de453086c8ecafdcb8c05c2ffc5b31dca333e27af61595e11a6dc88f7448": "0x6ea1de453086c8ecafdcb8c05c2ffc5b31dca333e27af61595e11a6dc88f7448", "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950ab6c705e19963ee06175726180f8465e78528188a1511df15027568a300d1319d346dc7ddde5bc33dc8c27fa5f": "0xf8465e78528188a1511df15027568a300d1319d346dc7ddde5bc33dc8c27fa5f", - "0xcec5070d609dd3497f72bde07fc96ba088dcde934c658227ee1dfafcd6e16903": "0x100845a5993b29977c58c9ef36aad0e09946f8a10b2ad30956dec1207beda8014a6ea1de453086c8ecafdcb8c05c2ffc5b31dca333e27af61595e11a6dc88f744876aad3978bef6ce80e5b7bb80e9ae9e1fb23fa1133088fa9e0555d6d96f1151bf8465e78528188a1511df15027568a300d1319d346dc7ddde5bc33dc8c27fa5f", - "0xcec5070d609dd3497f72bde07fc96ba0e0cdd062e6eaf24295ad4ccfc41d4609": "0x100845a5993b29977c58c9ef36aad0e09946f8a10b2ad30956dec1207beda8014a0845a5993b29977c58c9ef36aad0e09946f8a10b2ad30956dec1207beda8014a6ea1de453086c8ecafdcb8c05c2ffc5b31dca333e27af61595e11a6dc88f74486ea1de453086c8ecafdcb8c05c2ffc5b31dca333e27af61595e11a6dc88f744876aad3978bef6ce80e5b7bb80e9ae9e1fb23fa1133088fa9e0555d6d96f1151b76aad3978bef6ce80e5b7bb80e9ae9e1fb23fa1133088fa9e0555d6d96f1151bf8465e78528188a1511df15027568a300d1319d346dc7ddde5bc33dc8c27fa5ff8465e78528188a1511df15027568a300d1319d346dc7ddde5bc33dc8c27fa5f", + "0xcec5070d609dd3497f72bde07fc96ba088dcde934c658227ee1dfafcd6e16903": "0x080845a5993b29977c58c9ef36aad0e09946f8a10b2ad30956dec1207beda8014af8465e78528188a1511df15027568a300d1319d346dc7ddde5bc33dc8c27fa5f", + "0xcec5070d609dd3497f72bde07fc96ba0e0cdd062e6eaf24295ad4ccfc41d4609": "0x080845a5993b29977c58c9ef36aad0e09946f8a10b2ad30956dec1207beda8014a0845a5993b29977c58c9ef36aad0e09946f8a10b2ad30956dec1207beda8014af8465e78528188a1511df15027568a300d1319d346dc7ddde5bc33dc8c27fa5ff8465e78528188a1511df15027568a300d1319d346dc7ddde5bc33dc8c27fa5f", "0xd57bce545fb382c34570e5dfbf338f5e4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", "0xd5e1a2fa16732ce6906189438c0a82c64e7b9012096b41c4eb3aaf947f6ea429": "0x0000", "0xe38f185207498abb5c213d0fb059b3d84e7b9012096b41c4eb3aaf947f6ea429": "0x0100", "0xe38f185207498abb5c213d0fb059b3d86323ae84c43568be0d1394d5d0d522c4": "0x03000000", - "0xf0c365c3cf59d671eb72da0e7a4113c44e7b9012096b41c4eb3aaf947f6ea429": "0x0000" + "0xf0c365c3cf59d671eb72da0e7a4113c44e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x2aeddc77fe58c98d50bd37f1b90840f91f7f3f3eb1c2a69978da998d19f74ec5": "0x0401ecd473184b7f5028ba310ae0752ea08b7ceaca214d81dc9e952e23fedb95677b005039278c04000000000000000000002200000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf203c4e6f24381f9883c261de14a1b6edaf24e30971039a4f3efeac990c8d2d6c69f98876ddc60ec024608480ffaed245b": "0xbedeb75f75809a9d5ca347ab1449ac09e66a634146fc1c42a4978c167935216d0d636f6e74726f6c6c65722d31", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf20b8f114fe74c3b0361bf3e23eccd0faec44e6fca1307498ec40baacee27e0276ff73d36642bd6daada61b45f91c76909": "0x6eb242e526f76b25959e3d2210b0d1cd74adcae9dd8fa5075c59112614a449120e5375706572204163636f756e74", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2187e65b66687a8543c26bc2d3d90adbcf294460b41333d87ec6423f82247db5fc694d813b70ac22cecb4b4ae87bccd18": "0xc4b02d21e1153c24afa1d0310e30120df39b3f74fa6f255c7b9d55dfcf17ef1c032f30", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf21e7e823cdab34059f814fd4555c6ab818eda398d3b92e5ecea94605e3794b3f2022136197f10adfaa2a699dd2b4af435": "0x56730a7d8a360b0e02830dd9a21bef29bd0816f45d8b8fffafd4bb029ad4af3506456e627931", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf230c463d8772c974d68cc1da810c9eaa8760950dfdb9d02ea30a3aa1d809cedc5ebe7a63a2c0de85437a2a1f07922b412": "0xc4b02d21e1153c24afa1d0310e30120df39b3f74fa6f255c7b9d55dfcf17ef1c0230", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf230dc1d8d67195f17b83aded7c1d31867a0bcc553cb33f8b4676e6b6e812cafd86ea962dd99e5c765663a0a673e43704e": "0xec602008c477a948f8b3c76a21103910966be01a881b1498cf2bfcf0d2a45c360a76616c696461746f72", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf23e4203ad9d9a5c5a8a11fdd2899527adc23466000b257e5da9fc56f0a211510207c44436ffb167c5ad548f078157db1f": "0x8ccee1fa5ec7dac5292617904714c47846d6a403de4f8ca7df156ab4319b585d0b76616c696461746f7232", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf241af130650d486170962f4cf441108d196c34c8c60b3690701176bdbc9b16aced2898d754385a84ee0cfe7fb015db800": "0x221d409ba60508368d4448ccda40182aca2744bcdfa0881944c08108a9fd966d0bf09f98882044656d6f6e", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf24e87cccafffb2f988919b685ffa54ec1580fdc278abfe8b8649732b5a0c68199442bbc7f140d78d47eaf86cc25c46c6c": "0xe0b85f6af2757d71bc6edb8bbdc316926832bba312f26b4e25343048ab970840035032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf250deeeeb4e4ba9c2c98b8b316bcc263e78edc7ea21e3183d9ceb60cf2174d00b96b41b44d2c21631822b608ba8b19905": "0xa84dfd606cfdd686109a62f412d354a53417dc0b76a98faf53d1542fa71d8e520232", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf25293d1f766a621eeb6fe0489ed4bfb2b9160d585f1e4b64a86d4fbac97a636b540392b0d75b48202ae9fb0792ff5835c": "0x02bf32e061073c44300056b416cd66a4fde1e6c120dbc0089bb65134f5693a3b106d7564646c656265652d70726f7879", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf253ca74d0bd1e564a332b395d9a851eb4da99163f61cff9a7062affdc87b652c48625c637a997dab88fa302b1c5a7463a": "0xb2479a4c5a314be896da932acd7d770361daf76a8c0795afcbb09137ce83d5450e73616473616473616464736164", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf25ffc431d610b1f14273260521b52652668c49a4f0080335885316e176bba31567dffe9c9b32d5781248efc5982b26948": "0xe0b85f6af2757d71bc6edb8bbdc316926832bba312f26b4e25343048ab970840024e", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf26686c8bff4e72421b76456b8136c1a61a8353ed11e25e10bd64deb7d6b8d455959ec8b675e5d66eec8da33603b141202": "0xe0b85f6af2757d71bc6edb8bbdc316926832bba312f26b4e25343048ab970840035031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf26c19f8debe547f06e245437a9b26b39ba671656bc9e844a15653f6d3b8754424f32ce10abadd1207c0bd492af40eeeb7": "0xe0b85f6af2757d71bc6edb8bbdc316926832bba312f26b4e25343048ab9708401154524541535552592050524f58592041", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf27073e6700eab14c5eb0594dcc2d49e43f36bb24aa9d9bdd86b9ccc68740ccb755f47ea1f97f5d41f5c7fbb4dface1435": "0x4459b50f39faab6f554cb3681fe028358398dcc94b0c870243930108ab82b3321e506f6c6b61646f74204272616e6420426f756e74792043757261746f72", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2761f0c0566b49bce460a96414f708eee3c4a46a459c81a02401a9a5f4cc55a31c5a4ede8cd1f13d3990e56b84978936a": "0xc07df91514758b0283c8b8af78c6f015e26e089a265f02e7314252f129ce7127033031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf27f666adc5effecc507c6b81eeff496c0b01bf49fa0db7ba2869aed475e132a82d6e96fa1961f739b0fc65e1bdbf1ad1c": "0x8ccee1fa5ec7dac5292617904714c47846d6a403de4f8ca7df156ab4319b585d0b76616c696461746f7231", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf291e3ea77123746340ab4f5b68e6275dfbc71b498e20108fc9e62b941c7559c36ba5159f68e0f16dda065e50651ca7e06": "0x7f0005a01ec46bed827ffccd59e7af4c23c0e636ddd76a127728213c8f3c7b9f1e506f6c6b61646f74204272616e6420426f756e74792043757261746f72", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf294d70e088c909c1c1f4f30aecffb5e8aba41a8250073e63bb75f3b358a7156a0713247bb91fe655a36e9c838fa664739": "0x4208a319985529f22358384a2a933a0e9300a9e64b74bc508813ba1a5092e1a81e506f6c6b61646f74204272616e6420426f756e74792043757261746f72", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf297ec1e2c0f8868e0d9455526174685a2a644c21d8a9fd96427a0d67ab273f5c70abd7da784bfdc020fc92e1ae5bf9e48": "0xb0b3ece3ed0e60604850ccf4814129898287cb46084dc3a3e7500a56a88ad34d1e506f6c6b61646f74204272616e6420426f756e74792043757261746f72", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf298c74b4ab747dc1c565509092764e2ed0a47e3b9403c0693e4773a93ba9ff11a81a815e3d9428de57d49f40dddaa7123": "0x8ccee1fa5ec7dac5292617904714c47846d6a403de4f8ca7df156ab4319b585d0b76616c696461746f7233", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2a2e9bef0949d23bb41684d83d24d504116a3c1eaf4e0632b3198144aa79f93df54f083be28d65748c957890a06cbf432": "0x5c79d9d52526f9f922c5d885b01b61b0269082c81bfb29f46daae49f9bc26c27033031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2c2484852d433d2bf7e79029f48e7b8439c71265aea33241e78b67d2740d8f54d86016e13830e8bce23107d526b34cf7f": "0xa84dfd606cfdd686109a62f412d354a53417dc0b76a98faf53d1542fa71d8e520d56616c696461746f72203031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2cd638b7e1551a8ba01cd22859618fb84fce204cab548aa824a2825c772e40b7460f123d9ca9f01f2bdf369750810820f": "0x3c2c5b4040ed8e2d6a98fe6efe77f8a3a4a16dc276985f53dbb38c09238294210574657374", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2dd82beed6ac1dcddd0fe9856efb4ec76b91a28e6099036742d1040191826bf2637c047d3f03e37057ca4d7749f53d489": "0xbed9c57c5719926bb9f7eca81cc212ea586716acd68f4188dac22df4794097981e506f6c6b61646f74204272616e6420426f756e74792043757261746f72", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2dfab5a81a93f474a0ddcf3c54b9caa5eb462f161bb297af53cdafd8c053111f904aa664805381b60a7c647fd2c29cc1b": "0x2ca5fedc8da5e9adea2a634719b0486eefd392418ebb90b236d26160961f2f720234", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2edb81f84b660b1da46ef291070e005f7362f53d7fdf79d8bd5b267c5cea0ad1ab3ac832226100747e4a582b4aa220110": "0xc4acbf59aa0ca73a3786bd526aeeb4b3204b8a3e50fdba0ef02a1bdfadea4070033031", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2f11c801c8ef6701a3797a36cd90d98bd2072990080c13d56429b689e8de37ef17d158f2c01266eb2ff6602b5c4139614": "0x5c79d9d52526f9f922c5d885b01b61b0269082c81bfb29f46daae49f9bc26c27033032", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2f42c20c78d103f9e5db9604b9fad100ae6a4b4579b5abd1bab83f556e1bf0bcd0b8bbbe53470100b3b3374e0aa711e13": "0x5c79d9d52526f9f922c5d885b01b61b0269082c81bfb29f46daae49f9bc26c27076261636b7570", + "0x2aeddc77fe58c98d50bd37f1b90840f943a953ac082e08b6527ce262dbd4abf2fbaba9a7a5543064c977a5c58618866a469a63204cd58401499d8ae3bc9ceb0cd143aebf5fc3b41d5fc49e4bb155620c": "0x98391d304fc97382190403dc6a5137a9b2c6fb67d67b01331afa970c8fada51404414d41", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e151fac3b8fbb77364459b50f39faab6f554cb3681fe028358398dcc94b0c870243930108ab82b332": "0x0000000000000000000000000000000004f36bb24aa9d9bdd86b9ccc68740ccb755f47ea1f97f5d41f5c7fbb4dface1435", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e1583c7461c232d7ac4acbf59aa0ca73a3786bd526aeeb4b3204b8a3e50fdba0ef02a1bdfadea4070": "0x0000000000000000000000000000000004362f53d7fdf79d8bd5b267c5cea0ad1ab3ac832226100747e4a582b4aa220110", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e24b6b6893fb3743e221d409ba60508368d4448ccda40182aca2744bcdfa0881944c08108a9fd966d": "0x000000000000000000000000000000000496c34c8c60b3690701176bdbc9b16aced2898d754385a84ee0cfe7fb015db800", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e2623ca21b81995f32ca5fedc8da5e9adea2a634719b0486eefd392418ebb90b236d26160961f2f72": "0x0000000000000000000000000000000004b462f161bb297af53cdafd8c053111f904aa664805381b60a7c647fd2c29cc1b", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e3d4896e45d6f2865bed9c57c5719926bb9f7eca81cc212ea586716acd68f4188dac22df479409798": "0x0000000000000000000000000000000004b91a28e6099036742d1040191826bf2637c047d3f03e37057ca4d7749f53d489", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e496fd3c0ebe3acf5b2479a4c5a314be896da932acd7d770361daf76a8c0795afcbb09137ce83d545": "0x0000000000000000000000000000000004da99163f61cff9a7062affdc87b652c48625c637a997dab88fa302b1c5a7463a", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e4e939d4bfb9fc7d656730a7d8a360b0e02830dd9a21bef29bd0816f45d8b8fffafd4bb029ad4af35": "0x00000000000000000000000000000000048eda398d3b92e5ecea94605e3794b3f2022136197f10adfaa2a699dd2b4af435", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e5faca8a6580da647a84dfd606cfdd686109a62f412d354a53417dc0b76a98faf53d1542fa71d8e52": "0x000000000000000000000000000000000878edc7ea21e3183d9ceb60cf2174d00b96b41b44d2c21631822b608ba8b199059c71265aea33241e78b67d2740d8f54d86016e13830e8bce23107d526b34cf7f", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e63ece89a61e49ed95c79d9d52526f9f922c5d885b01b61b0269082c81bfb29f46daae49f9bc26c27": "0x000000000000000000000000000000000c16a3c1eaf4e0632b3198144aa79f93df54f083be28d65748c957890a06cbf4322072990080c13d56429b689e8de37ef17d158f2c01266eb2ff6602b5c4139614e6a4b4579b5abd1bab83f556e1bf0bcd0b8bbbe53470100b3b3374e0aa711e13", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e7bbbb11172fc426abedeb75f75809a9d5ca347ab1449ac09e66a634146fc1c42a4978c167935216d": "0x0000000000000000000000000000000004f24e30971039a4f3efeac990c8d2d6c69f98876ddc60ec024608480ffaed245b", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e84ce5c3d388f279ab0b3ece3ed0e60604850ccf4814129898287cb46084dc3a3e7500a56a88ad34d": "0x0000000000000000000000000000000004a644c21d8a9fd96427a0d67ab273f5c70abd7da784bfdc020fc92e1ae5bf9e48", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e93e9a6b835d366604208a319985529f22358384a2a933a0e9300a9e64b74bc508813ba1a5092e1a8": "0x0000000000000000000000000000000004ba41a8250073e63bb75f3b358a7156a0713247bb91fe655a36e9c838fa664739", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37e99d68355f4d476713c2c5b4040ed8e2d6a98fe6efe77f8a3a4a16dc276985f53dbb38c0923829421": "0x0000000000000000000000000000000004fce204cab548aa824a2825c772e40b7460f123d9ca9f01f2bdf369750810820f", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ea0b881b0063a363a02bf32e061073c44300056b416cd66a4fde1e6c120dbc0089bb65134f5693a3b": "0x00000000000000000000000000000000049160d585f1e4b64a86d4fbac97a636b540392b0d75b48202ae9fb0792ff5835c", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37eabfb0790f33eebeb6eb242e526f76b25959e3d2210b0d1cd74adcae9dd8fa5075c59112614a44912": "0x0000000000000000000000000000000004c44e6fca1307498ec40baacee27e0276ff73d36642bd6daada61b45f91c76909", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37eb48e86b477e312727f0005a01ec46bed827ffccd59e7af4c23c0e636ddd76a127728213c8f3c7b9f": "0x0000000000000000000000000000000004bc71b498e20108fc9e62b941c7559c36ba5159f68e0f16dda065e50651ca7e06", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ec1d48927defc105fec602008c477a948f8b3c76a21103910966be01a881b1498cf2bfcf0d2a45c36": "0x0000000000000000000000000000000004a0bcc553cb33f8b4676e6b6e812cafd86ea962dd99e5c765663a0a673e43704e", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ec5dbdfccef1b5b028ccee1fa5ec7dac5292617904714c47846d6a403de4f8ca7df156ab4319b585d": "0x000000000000000000000000000000000cb01bf49fa0db7ba2869aed475e132a82d6e96fa1961f739b0fc65e1bdbf1ad1cc23466000b257e5da9fc56f0a211510207c44436ffb167c5ad548f078157db1f0a47e3b9403c0693e4773a93ba9ff11a81a815e3d9428de57d49f40dddaa7123", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ecdd82614af0293e2c07df91514758b0283c8b8af78c6f015e26e089a265f02e7314252f129ce7127": "0x00000000000000000000000000000000043c4a46a459c81a02401a9a5f4cc55a31c5a4ede8cd1f13d3990e56b84978936a", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ee942fea93b72bab198391d304fc97382190403dc6a5137a9b2c6fb67d67b01331afa970c8fada514": "0x0000000000000000000000000000000004469a63204cd58401499d8ae3bc9ceb0cd143aebf5fc3b41d5fc49e4bb155620c", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37ef1791bcba0e691f1c4b02d21e1153c24afa1d0310e30120df39b3f74fa6f255c7b9d55dfcf17ef1c": "0x0000000000000000000000000000000008760950dfdb9d02ea30a3aa1d809cedc5ebe7a63a2c0de85437a2a1f07922b412f294460b41333d87ec6423f82247db5fc694d813b70ac22cecb4b4ae87bccd18", + "0x2aeddc77fe58c98d50bd37f1b90840f96ee5a0b09e7e9a96219dd66f0f74c37eff3568b3e9283f5ee0b85f6af2757d71bc6edb8bbdc316926832bba312f26b4e25343048ab970840": "0x0000000000000000000000000000000010a8353ed11e25e10bd64deb7d6b8d455959ec8b675e5d66eec8da33603b141202580fdc278abfe8b8649732b5a0c68199442bbc7f140d78d47eaf86cc25c46c6c68c49a4f0080335885316e176bba31567dffe9c9b32d5781248efc5982b26948a671656bc9e844a15653f6d3b8754424f32ce10abadd1207c0bd492af40eeeb7", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471403adc196911e491e08264834504a64ace1373f0c8ed5d57381ddf54a2f67a318fa42b1352681606d": "0x00000000000000000000000000000000001c5061726974792057657374656e642076616c696461746f7220313100000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471403e65d4ca28086078c2625b0e10c7bf65f283c576878cf00f67478d3dbb6bf39ee62b3ca19ce893d": "0x0000000000000000000000000000000000117061756c6f5f5f7a61676f20f0938582002068747470733a2f2f796f75747562652e636f6d2f5061756c6f5a61676f595417407061756c6f5f7a61676f3a6d61747269782e6f72671c7061756c6f6372657374616e697a61676f40676d61696c2e636f6d00000d407061756c6f5f5f7a61676f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140615401d5f67a879103b29e095959019702ffa05c0901c40baede6973f70e35193989c3472cc3c13": "0x0000000000000000000000000000000000055961736800000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140a2672fe736d19284a2d91e49e215e207dc6f70d8b1dbcbb1caf9168b5209149ddea4c35ba1f345b": "0x00000000000000000000000000000000000f44656c6567614e6574776f726b730f44656c6567614e6574776f726b731268747470733a2f2f64656c6567612e696f001664656c6567614070726f746f6e6d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140b1f48e194c65da836a8d9cd83adc53fe0cb6cd66dba40838269dcba9c1e0833b67dcb6477ae5d29": "0x040000000003000000000000000000000000000000000ef09f8dba2047617620f09fa5830b476176696e20576f6f640c676176776f6f642e636f6d1c406761766f66796f726b3a6d61747269782e7061726974792e696f10676176696e407061726974792e696f00000a6761766f66796f726b000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047140e6a72b565a94a850c8220c20b57d955cd84344bcb97955704f70c88c037a2811b92ba8b81ceed18": "0x000000000000000000000000000000000013524f424f4e4f4d4943532e4e4554574f524b13726f626f6e6f6d6963732e6e6574776f726b1c68747470733a2f2f726f626f6e6f6d6963732e6e6574776f726b2f18407370643a726f626f6e6f6d6963732e6e6574776f726b1961646d696e40726f626f6e6f6d6963732e6e6574776f726b00001140616972615f726f626f6e6f6d696373000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714126724bd6c3cc3510a438a90bf20752d0ba6f5abe0ba6060f1d9f1a67adc03a3968ac858e8bb8023": "0x00000000000000000000000000000000000b7776616c696461746f72125756616c696461746f72f09fa48ce29c851268747470733a2f2f6d797765622e636f6d13406d7972696f743a6d61747269782e6f72670d6d7940656d61696c2e636f6d00000b404d7954776974746572000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714151fac3b8fbb77364459b50f39faab6f554cb3681fe028358398dcc94b0c870243930108ab82b332": "0x00000000000000000000000000000000001e506f6c6b61646f74204272616e6420426f756e74792043757261746f7200000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141583c7461c232d7ac4acbf59aa0ca73a3786bd526aeeb4b3204b8a3e50fdba0ef02a1bdfadea4070": "0x000000000000000000000000000000000005456e627900000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471416d5103a6adeae4fc21ad1e5198cc0dc3b0f9f43a50f292678f63235ea321e59385d7ee45a720836": "0x00000000000000000000000000000000001b5061726974792057657374656e642076616c696461746f72203600000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141b02c85564ad1a8555d5d24534eb8d4b68c7f6e4fd129834285dbd326dcaeaca5018667772ff72eb": "0x00000000000000000000000000000000000d546573206d756c74697369670000001663686576646f722b776e6440676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047141f8d2882be771a968da8e57224b21bbcdeeeb5a49319f8d9705c2b937c858a725ac6da01f98ff4dc": "0x000000000000000000000000000000000004414e4f00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471424b6b6893fb3743e221d409ba60508368d4448ccda40182aca2744bcdfa0881944c08108a9fd966d": "0x00000000000000000000000000000000000c53616c65206d617374657200000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142623ca21b81995f32ca5fedc8da5e9adea2a634719b0486eefd392418ebb90b236d26160961f2f72": "0x00000000000000000000000000000000000a48617368517561726b0a48617368517561726b000015636f6e746163744068617368717561726b2e696f000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714280ff05065ef56c920857356346d9d91caf02ad14950ab0db995d41d237c3be71dd785bd1cc03609": "0x0000000000000000000000000000000000087465737431323300000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142a47718370fccca6c6332dd72fc6d33bf202a531e66cfaf46e6161640f91864f23f82b31b38c5f11": "0x00000000000000000000000000000000001b5061726974792057657374656e642076616c696461746f72203200000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142d04b89675880bace28fbaee0b6495ca0dd577a424cf324c56d1f4a228f41d8a7d22b5cb0ad8e95e": "0x0000000000000000000000000000000000075365636f6e6400000e40777468616e6f743a726f6f6d086140622e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047142dbf07a05f640743a22168166bc6c5617ee3699125591513f54576d82b9ac8f9a8892751d4f9c565": "0x000000000000000000000000000000000014636c617564696f676972616f6261727265746f17436c617564696f20476972c3a36f204261727265746f000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714301121c1a8d96ccab65991822483a6c3bd24b1dcf6afd3e270525da1f9c8c22a4373d1e1079e236a": "0x0000000000000000000000000000000000157061726974792d7374616b696e672d6d696e657200000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471431747b68fd9a8689a0e1a33870981aa76012429e64409e7445f64ba6b3bf75a2e0c97ed51179a64f": "0x04000000000200000000000000000000000000000000084e594d45545641000014406e796d657476613a6d61747269782e6f726700000009406e796d65747661000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471433fd6cfb1723695048f3bac8919fb80326d47d028fc177b8199f76bbf254d9b73696dc85e4f4e177": "0x00000000000000000000000000000000000d4c756e617220417669617279001268747470733a2f2f6269726463752e6c74000000000d404c756e6172417669617279000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143514b2f81426145d008ccbf8565fb5d4ff4b6b3142640fc9ead4d2ee7291b6539cf50543b45bdc66": "0x00000000000000000000000000000000000d73746172745374616b696e6700000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143635b95e2a31e59704b42c45250880695e6cec68c5adce35a0e2ec60ed46b77b734ad6020b991658": "0x00000000000000000000000000000000001b6b61676f6d652d77657374656e642d76616c696461746f722d31001168747470733a2f2f716472766d2e696f14406b616d696c73613a6d61747269782e6f72670b6b40716472766d2e696f00000c406b616d696c5f61626979000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471436e6baf6bf39390af0dd6353da84f33c45f501cc4876eddd6768031064b05c8421167010abfc3b21": "0x000000000000000000000000000000000013746573745f6372656174696f6e5f706f6f6c002168747470733a2f2f737570706f72742e706f6c6b61646f742e6e6574776f726b0000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143bb2d34a52c604e6ecd473184b7f5028ba310ae0752ea08b7ceaca214d81dc9e952e23fedb95677b": "0x04000000000300000000000000000000000000000000185265676973747261722023302062792043686576646f720d52656769737472617220233000144063686576646f723a6d61747269782e6f72671e63686576646f722b7265675f77657374656e6440676d61696c2e636f6d0000094063686576646f72000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143d4896e45d6f2865bed9c57c5719926bb9f7eca81cc212ea586716acd68f4188dac22df479409798": "0x00000000000000000000000000000000001e506f6c6b61646f74204272616e6420426f756e74792043757261746f7200000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143da2d45d953c8319785a6702020a9d976136860c58d1d1ca7ebc218de25a81f9f7f9a84844cb4f67": "0x00000000000000000000000000000000001b494e46524153545255435455524520434f52504f524154494f4e001f687474703a2f2f696e6672617374727563747572652d636f72702e636f6d14407961796f692d763a6d61747269782e6f726720737570706f727440696e6672617374727563747572652d636f72702e636f6d00000c40494e4652415f434f5250000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143ddc78443e98e3b2fe0bb66de0655eba023fd7ad99e99458a1b189154590d2c48d7b0d047c464b70": "0x00000000000000000000000000000000000a416d6972206b68616e00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143ecb31e90f8870f218164fa6f9ce28792fb781185e8de4e6eaae34c0f545e5864952fe23c183df0c": "0x00000000000000000000000000000000001c5061726974792057657374656e642056616c696461746f7220313500000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047143eeeca9f73e5dbe0c03b53ee8578764e4978167a7e2a4aa95eb867b2400f7d54a5e142880a1b3650": "0x0000000000000000000000000000000000025800000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144245138345ca3fd8aebb0211dbb07b4d335a657257b8ac5e53794c901e4f616d4a254f2490c43934": "0x00000000000000000000000000000000001b5061726974792057657374656e642056616c696461746f72203900000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144460be899b41e7b904e71172850e3a81934ea878027be5e8489809fac6dc240d796605bcb052a225": "0x00000000000000000000000000000000000e43525950544f534845494e495800000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471445d0219e30278bfda46c3841d26e49b28c267abb4731374da546a09fadc68293d1f64a70fe0c1d46": "0x040000000002000000000000000000000000000000000a64616e666f726265730b44616e20466f726265731d68747470733a2f2f6769746875622e636f6d2f64616e666f726265731c4064616e666f726265733a6d61747269782e7061726974792e696f1264616e4064616e666f726265732e64657600000e4064616e666f72626573646576000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714496fd3c0ebe3acf5b2479a4c5a314be896da932acd7d770361daf76a8c0795afcbb09137ce83d545": "0x040000000001005039278c04000000000000000000000000000000000000000000000000000012414d49522e454b424154414e4946415244001b616d6972656b626174616e69666172642e6570697a792e636f6d1740616d69726b68616e65663a6d61747269782e6f726714616d6972656630303740676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144b24b7848917b87b00afc486ba44db593aca06f8949d10ca104c594fe47675a106b23a9148119717": "0x00000000000000000000000000000000000d574e442d522d313030302d580a4f5243554e2ec4b04f1168747470733a2f2f6f7263756e2e696f00126f7263756e696f407961686f6f2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144b3f0cabbeca763d0e1dc250d6ae40439eea676bb4b0023a6aa99f902e174d70d31fb06b0899d60c": "0x04000000000100488d2ce40000000000000000000000000000000000000000000000000000000d4e6577596f726b54696d657300000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144b8c1fa82cb6ba3b7252d008c11b0eced201044e5c3f0b46d154ea504f10e68410e99f8db2d8ef12": "0x000000000000000000000000000000000009535554494d4d554b00001540737574696d6d756b3a6d61747269782e6f726718737574696d6d756b4070726f746f6e6d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144bc1a1e9b59e25424e3eb46b76d5b44f4b59e04d65ab8409686495bb4aa332014f980cf779070608": "0x00000000000000000000000000000000000545444d530945726963204461751568747470733a2f2f7777772e65642d6d732e6672001e65646d616368696e65737370656369616c657340676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144e939d4bfb9fc7d656730a7d8a360b0e02830dd9a21bef29bd0816f45d8b8fffafd4bb029ad4af35": "0x000000000000000000000000000000000013456e62792d546573742d4f6e2d436861696e00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047144f0f0dc89f14ad14767f36484b1e2acf5c265c7a64bfb46e95259c66a8189bbcd216195def436852": "0x00000000000000000000000000000000001b5061726974792057657374656e642076616c696461746f72203500000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714532c603791dddaa296dbcf1f758fc42826d60bac2c404ae85f1fed6063248a2bba867762e3aa1028": "0x00000000000000000000000000000000000844657620706f6c124e677579656e205068756f63205468616f1968747470733a2f2f7777772e796f75747562652e636f6d2f114074686f723a6d61747269783a6f72670e64657640676d61696c2e636f6d0000064074686f72000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471453a17b2a2aedf266c2f78bb483e7cc4fc6edb30ff7792b5dab3e3dbb3178b37e400baea54d549548": "0x00000000000000000000000000000000000b494e54454752495445450e496e74656772697465652041471b68747470733a2f2f696e74656772697465652e6e6574776f726b001968656c6c6f40696e74656772697465652e6e6574776f726b00000f40696e74656772695f745f655f65000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145b91dd90df1593a7807c8c23cf1b052e19e26e59942b16188c1cd920abafbc1170df57756b33d04e": "0x00000000000000000000000000000000001546542057657374656e642056616c696461746f7200000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145c69b53821debaa39ae581fef1fc06828723715731adcf810e42ce4dadad629b1b7fa5c3c144a81d": "0x00000000000000000000000000000000001b5061726974792057657374656e642056616c696461746f72203800000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145f303e9fdcd878ed661127faa225949b1c1a48f834f43fa626c9f58fa0c7e522551d4b9616e18c37": "0x00000000000000000000000000000000001c5061726974792057657374656e642056616c696461746f7220313200000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047145faca8a6580da647a84dfd606cfdd686109a62f412d354a53417dc0b76a98faf53d1542fa71d8e52": "0x040000000002000000000000000000000000000000000f506f6c79636861696e204c616273001e68747470733a2f2f7777772e706f6c79636861696e6c6162732e636f6d001664657640706f6c79636861696e6c6162732e636f6d00000f40706f6c79636861696e6c616273000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146318d50a26d00c113e33e5b0cb049ab36ed75f1ab83baf81a2fc5d5bb6d2f6c3283642a49b155d13": "0x00000000000000000000000000000000000d627374672d77657374656e6400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471463ece89a61e49ed95c79d9d52526f9f922c5d885b01b61b0269082c81bfb29f46daae49f9bc26c27": "0x000000000000000000000000000000000014564f2057657374456e64204964656e7469747900000015736f6d65626f6479406578616d706c652e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471463f539c3262ff11b8009eef982029af9cab660583cd2f7f6da25d8f6f5cb7d98f6b62c5832c33448": "0x0000000000000000000000000000000000054a6f686e00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471464f0ecb773bc06d3e0f3aa5048258ad9e7892124c224dc631f138be45f27cfc7606b000b8baa9907": "0x00000000000000000000000000000000000544696e650544696e6500154064696e6e653231333a6d61747269782e6f726700000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047146dee1dfdacc49424b00c82b2bc49993a087496c10cfe20549fe663c629d9fd515e7ec070abc6f452": "0x00000000000000000000000000000000000454535400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471472abf3c45e0e11d1c88e6de46f9563207dea82a642e9df9fe5eb76925c8dc96550b706c4c3998d1f": "0x00000000000000000000000000000000000f416c69636520f09f91a7f09f8fbc000a616c6963652e78797a05616c696319616c6963654074727573746564467269656e64732e636f6d00000740616c696365000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471474e91f24b625d4c85eb083f19535ddfc1936497ce8db7b4dfb4af273000c4e2b9148077da9260547": "0x040000000001005039278c04000000000000000000000000000000000000000000000000000009416d69722e452e46001b616d6972656b626174616e69666172642e6570697a792e636f6d0014616d6972656630303740676d61696c2e636f6d000005616d6972000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147508abddac51b099c68f7f2ba81bd9b2922a184acea664224ca9cfd98d818bdf5048801701295608": "0x04000000000200000000000000000000000000000000056572696e00001e406572696e5f776f67676f6e3a6d61747269782e7061726974792e696f00000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471477a9553a204fc1a03206714184f4a56362be26d2cf6bb2ff0415953d9225c1fbd83acc77fa1cbc46": "0x0000000000000000000000000000000000086d75686172656d114d75686172656d2049736d61696c6f761b68747470733a2f2f6769746875622e636f6d2f6d75686172656d13406d75686172656d3a7061726974792e696f126d75686172656d407061726974792e696f00000c406d75686172656d5f6973000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147ba03701bc9f2896a0ce091599c92564ad7fb09cac769257c3e95dcd572e5ee172870651b322da6f": "0x0000000000000000000000000000000000095061746f6e6e383900000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147bbbb11172fc426abedeb75f75809a9d5ca347ab1449ac09e66a634146fc1c42a4978c167935216d": "0x00000000000000000000000000000000000a536f72616d69747375001968747470733a2f2f736f72616d697473752e636f2e6a702f0000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047147d4356618bc994a15a8eab7f473b704d6a37811f6ad979be7fafdf139f8a5a589585a9f22df63813": "0x000000000000000000000000000000000008776573746574730f544553544554537b7b312a357d7d17687474703a2f2f6a617661736372697074282e292f2f15406a6176617363726970743a227b7b312a357d7d1f7440632e636f3f63633d73406c2e636f6d267375626a6563743d7465737400001c406a6176617363726970743a616c6572742830297b7b312a357d7d000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148186dc320915b65f38c991f782047dc9bb4ebbe94a8b54cad78fbc45163c023467ab20537fa8764e": "0x0000000000000000000000000000000000104d6172612028636f6465726f6265290000000000000a40636f6465726f6265000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471484ce5c3d388f279ab0b3ece3ed0e60604850ccf4814129898287cb46084dc3a3e7500a56a88ad34d": "0x00000000000000000000000000000000001e506f6c6b61646f74204272616e6420426f756e74792043757261746f7200000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148c6b3416d23997c11c4968c9b826c3f4dbdd34cf5f1816cb3d7a2a0b0541771ce3313a8a76720238": "0x00000000000000000000000000000000000b47616c612046696c696e001768747470733a2f2f6e6174726962752e6f72672f656e0000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148d35126f566cba17ea5006ccf61cc5e0bd82fed21ab7b18537a5193df4a823ae592772318db73b35": "0x04000000000200000000000000000000000000000000034452000000146461766964407661636f766964656f2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148ebb2f8180b9ec8408270e4436898c595fe5f85a2fe671ba028b35be25c83fd58758ef5642051113": "0x00000000000000000000000000000000001b5061726974792057657374656e642076616c696461746f72203400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148ed745f7d7a7892e64b8b97d790834e20857f0f517198465d2024838e002e48cda42de6650443a7b": "0x00000000000000000000000000000000000a4f63746f43657274730e4f63746f636861696e20496e63000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148f39a242feb4ed89e0c06e32447d97639572f947aa3b2d51b3fed3285fe37e913aebf554e55b5549": "0x00000000000000000000000000000000000b434f4e54524f4c4c4552001468747470733a2f2f65746862616e642e636f6d0000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047148ffd787fc893ba7c88356b8011860da46fd62af7f556774e34353794376d3e4538696982bee9ea70": "0x00000000000000000000000000000000000a656e636f696e74657200000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471493e9a6b835d366604208a319985529f22358384a2a933a0e9300a9e64b74bc508813ba1a5092e1a8": "0x00000000000000000000000000000000001e506f6c6b61646f74204272616e6420426f756e74792043757261746f7200000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714942774d4213e98fb20fcf533fe2aa70c25a70f50bdcf4d315fdc261c2626dd224c1fbdd718859721": "0x0000000000000000000000000000000000175069657272652028506172697479204465766f707329157069657272652d7061726974792d6465766f7073000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab870471499d68355f4d476713c2c5b4040ed8e2d6a98fe6efe77f8a3a4a16dc276985f53dbb38c0923829421": "0x040000000001005039278c0400000000000000000000000000000000000000000000000000000a506f6c6b61676174650a506f6c6b61476174651668747470733a2f2f706f6c6b61676174652e78797a1640706f6c6b61676174653a6d61747269782e6f726716706f6c6b6167617465406f75746c6f6f6b2e636f6d00000b40706f6c6b6167617465000a706f6c6b616761746500", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149acfc1d7ba6a5099635719795390894809c72b7b6add0a3208a6a58f4cbc976b56b7609fea8210d5": "0x00000000000000000000000000000000000b507572652050726f787900000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149afb96de5bd6c558f6b21d624832094b03aa672e016462a020e217cc67b1434785b99114a2b4fa5a": "0x04000000000200000000000000000000000000000000054a61636f1644616e69656c204a61636f627573204772656566661a68747470733a2f2f6769746875622e636f6d2f6a61636f677219406a61636f67723a6d61747269782e7061726974792e696f0f6a61636f407061726974792e696f000008406a61636f6772000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149d2cd526e185ce7c0c6af745ed553c17661b382b8ed3e3208fb0a5577cc8c95fed80d6306bea7217": "0x00000000000000000000000000000000001568616d696420737461736820326e64207465737400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab87047149ff7f028a9f0b7e1b87298f1f74a0dcd2f287d40d26b6ab7fc931c367df44ae3abb0cf646d3ea05b": "0x0000000000000000000000000000000000106f6b416c6963652057657374656e6400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a0b881b0063a363a02bf32e061073c44300056b416cd66a4fde1e6c120dbc0089bb65134f5693a3b": "0x0000000000000000000000000000000000086d7564646c657300000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a55b8b65eb6f12d8aad62ce034d6e753415007acda745f28622fdd8f69baf8614167498d40847568": "0x0400000000020000000000000000000000000000000014526567697374726172205465737472617420311b5465737420666f7220726567202330206f6e2077657374656e6417687474703a2f2f7777772e63686576646f722e636f6d144063686576646f723a6d61747269782e6f72671f63686576646f722b77657374656e645f7465737440676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a83c0ae16f97e358f859d1d368b37d157a67131f3f7c7640da743a22d53b6a923866e92a8ed18921": "0x00000000000000000000000000000000000f746573746964656e74697479747900000015746573746964656e7469747974794074792e7479000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714a9a7dfedfb4bb5aab8201ecd19908f555834d77d50296d88fe9df14485cde4899c9e0382a2a1914f": "0x00000000000000000000000000000000000850454e44414c460847524159313233000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714abece8628303a8c2a28d87e5fc8c0e61727957121a8f449bc72618bafb124df12822a1aff23423ac": "0x000000000000000000000000000000000010464f524b4c4553535f4e4154494f4e00000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714abfb0790f33eebeb6eb242e526f76b25959e3d2210b0d1cd74adcae9dd8fa5075c59112614a44912": "0x040000000002000000000000000000000000000000000d4d696b65546569786569726100001b406d696b65746569786569726138383a6d61747269782e6f7267196d7465697865697261383830313340676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ac65c790f331105a58cf2a32951e3244b0928a6bcb4e32020283b3e0e1f4545ce336160e6837d7d2": "0x000000000000000000000000000000000019506f6c6b614d61736b206163636f756e74203120f09f9a8000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b15a287f3185340428206ed9245a88889037c43aa84eee43c465237177a0f6005f4dd0813a8afc29": "0x00000000000000000000000000000000000845746842616e6400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b1c960df538f7c1eeeea14ba942c445b1924e141a19ce84b07a1a4b29a325b119252b96e42e52204": "0x000000000000000000000000000000000013416368696d202d20436f6e74726f6c6c657200000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b1cb17645a292a6836d6be834cd4a0638a346adb184c71c8186965540563713d5d2c97956e20b255": "0x00000000000000000000000000000000001b5061726974792057657374656e642056616c696461746f72313400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b48e86b477e312727f0005a01ec46bed827ffccd59e7af4c23c0e636ddd76a127728213c8f3c7b9f": "0x00000000000000000000000000000000001043757261746f72207465737420696400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714b55341a1192bad2026a948d457ef9d9d74a424a7ebd768d3390e2aed26fad8ff6b1f9296c096411d": "0x040000000001005039278c0400000000000000000000000000000000000000000000000000000843686576646f720000001763686576646f722b776e643240676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c1d48927defc105fec602008c477a948f8b3c76a21103910966be01a881b1498cf2bfcf0d2a45c36": "0x00000000000000000000000000000000000d6b7573616d6178692e636f6d0a4b7573616d612058491568747470733a2f2f6b7573616d6178692e636f6d15406b7573616d6178693a6d61747269782e6f726715737570706f7274406b7573616d6178692e636f6d00000a406b7573616d617869000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c3448661d7062a0c7a83d0f880499e120d25104e5469452b9c61764e5c73275817da827e08ee8c7f": "0x0400000000010030ef7dba02000000000000000000000000000000000000000000000000000005574e44310000001663686576646f722b776e6440676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c5dad8e8b3b4327c8cc1b91e8946862c2c79915a4bc004926510fcf71c422fde977c0b0e9d9be40e": "0x00000000000000000000000000000000000876696b6976616c0956696b692056616c1c68747470733a2f2f6769746875622e636f6d2f76696b696976616c144076696b6976616c3a6d61747269782e6f72671576696b696976616c406b6f6461646f742e78797a00000a4076696b696976616c000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714c5dbdfccef1b5b028ccee1fa5ec7dac5292617904714c47846d6a403de4f8ca7df156ab4319b585d": "0x00000000000000000000000000000000000e6c696e6d73206361706974616c066c696e6d7316687474703a2f2f7777772e61636b746563682e6363174061636b746563682e63633a6d61747269782e6f72671677616e676269676e616d6540676d61696c2e636f6d00000c4061636b746563685f6363000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714cdd82614af0293e2c07df91514758b0283c8b8af78c6f015e26e089a265f02e7314252f129ce7127": "0x00000000000000000000000000000000000d4b696c6e2d746573746e6574054b696c6e1068747470733a2f2f6b696c6e2e66690010636f6e74616374406b696c6e2e666900000e404b696c6e5f66696e616e6365000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ce6a96a3775ab416f268995cc38974ce0686df1364875f26f2c32b246ddc18835512c3f9969f5836": "0x00000000000000000000000000000000001c5061726974792057657374656e642056616c696461746f7220313000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714cf48516c0c7933d3a8ceab88b82d857d3e64a8d67db0d3e476054a42572522ae359b962b2818305f": "0x00000000000000000000000000000000001b5061726974792057657374656e642076616c696461746f72203100000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714cf68a696f5e3e5bc428f44f5ec19a8b2e1d7f7e5436e156a1846c5f941a1ac64e69644026d92370c": "0x00000000000000000000000000000000000a456c6f6e204d75736b0a456c6f6e204d75736b1368747470733a2f2f7465736c612ed1816f6d0010656c6f6e407465736c612ed1816f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d2fc312385291aa3886d225c2e5ea37cf074eedbeb62d7e1e737e36e8e0b74d6e302cac82269ab49": "0x000000000000000000000000000000000018434f4e54524f4c4c45522d444f4d492d4143434f554e5400000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d33f981365b74ba8e2dd2049909ce840caa501b9703b9d67d5846337efd96ecc779642daef6ed96d": "0x00000000000000000000000000000000001e436861696e736166652057657374656e642056616c696461746f72203012436861696e536166652053797374656d731668747470733a2f2f636861696e736166652e696f2f000000000d40436861696e536166657468001e68747470733a2f2f646973636f72642e67672f78534177726e4357636700", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d52cb7e0ea9debb300477d547115aca2d56792295e3366b37371876a489ee0b15e414d0931a0da20": "0x00000000000000000000000000000000001b5061726974792057657374656e642076616c696461746f72203000000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714d7e59067f802974622c89cebaabfb29998d11712a0b4fe1f681f30ef0aab0f1d39af17340a713c72": "0x000000000000000000000000000000000009417472656964657300000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714dfa899943e583c528c5a3003181155566fda64162db5c8a94b54ddd0f1210bbe340f16bdbb7f524b": "0x00000000000000000000000000000000001b5061726974792057657374656e642076616c696461746f72203300000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e274481c2245e11f226791373ca0426a7864eebab3e9bdf8852aee5c6d0108fb2d41a6e871da0211": "0x00000000000000000000000000000000000d4465726f7269207374617368074445524f5249000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e2b45b1aab018b6996b33e0a9647f13198ad16a2812c549a363646a3a7ddbdcc5590f5839c408c62": "0x00000000000000000000000000000000001b5061726974792077657374656e642076616c696461746f72203700000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e6c0a23862435954f6809d851bfb9bcd11d458ca8dba80b1527fbd47694e3a16e4e3a9a17d4ef267": "0x00000000000000000000000000000000001a4275656e6176656e747572612050696e6f204d6f736c65726f1a4275656e6176656e747572612050696e6f204d6f736c65726f000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714e942fea93b72bab198391d304fc97382190403dc6a5137a9b2c6fb67d67b01331afa970c8fada514": "0x0000000000000000000000000000000000134d696368616c69732043726f776463617374000000196d696368616c697340776562332e666f756e646174696f6e000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f1791bcba0e691f1c4b02d21e1153c24afa1d0310e30120df39b3f74fa6f255c7b9d55dfcf17ef1c": "0x0000000000000000000000000000000000086274776975736500000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f3c29ba2021a91f1568f4b844412e983472f1a1a68e982aa78a29558765f79541175fa488893b117": "0x00000000000000000000000000000000001c5061726974792057657374656e642056616c696461746f7220313300000000000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f48748132b60e423c0e8cef7ee8034a4429f7530057302daf2eefe8cf3f560cbf5506fab34bed342": "0x00000000000000000000000000000000000d436872697374696e612053701e436872697374696e6120537465696e627265636865722d5066616e6474000019636872697374696e6140626c6f636b636861696e2e617274000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f567a24c0fb46cb1d619041b935c9697d37259e408b1de0e3f5fd9663f49e1b4654bbae1e0fe6962": "0x00000000000000000000000000000000000f4c656f6e6964204b6167616e6f76001068747470733a2f2f6c6c656f2e6d65000d6c6c656f406c6c656f2e6d65000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714f650acb4a81d60cb2a96d7b89d235c7f75608d978739761062ffd98529232f29e5d5056f211f453c": "0x00000000000000000000000000000000000664726970350000001f7440632e636f3f63633d73406c2e636f6d267375626a6563743d74657374000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714faa55b79d5b983962aad2d511e0a2ade151b1e3442675156b71aea1f049ce004311cf33c9d70c474": "0x00000000000000000000000000000000001153656261737469616e2043727970746f001e68747470733a2f2f742e6d652f506f6c6b61646f744e6f7469636961731c4073656261737469616e63726970746f3a6d61747269782e6f72671b73656261737469616e63727970746f3840676d61696c2e636f6d0000114053656261737469616e43726970746f000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714fc8403ec26b4feefecf36e565cd1a42755c3231ffcc2b6187ef82899ac2b7f35d96804da24129f60": "0x00000000000000000000000000000000000f4b757a7572692057657374656e64000000116173616e736940676d61696c2e636f6d000000000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714fd5e811f9d22dd41943e99feea77d4d5de619ceb1493d232ca026fe0d2af6ca6ed304afd7738ae2d": "0x0000000000000000000000000000000000086772756d6c696e000014406772756d6c696e3a6d61747269782e6f72671b706f6c6b61646f742e6772756d6c696e40676d61696c2e636f6d000009406772756d31696e000000", + "0x2aeddc77fe58c98d50bd37f1b90840f9cd7f37317cd20b61e9bd46fab8704714ff3568b3e9283f5ee0b85f6af2757d71bc6edb8bbdc316926832bba312f26b4e25343048ab970840": "0x000000000000000000000000000000000003544600000000000000000000" }, "childrenDefault": {} } } -} \ No newline at end of file +} diff --git a/cumulus/parachains/common/Cargo.toml b/cumulus/parachains/common/Cargo.toml index fe5e24ee6079e6e0483efe7455ab86af21ae112e..fa16205d0fd1adee1491cf3abb92a55829b16a44 100644 --- a/cumulus/parachains/common/Cargo.toml +++ b/cumulus/parachains/common/Cargo.toml @@ -14,8 +14,8 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", features = ["derive"], default-features = false } -log = { version = "0.4.19", default-features = false } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +log = { workspace = true } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } # Substrate frame-support = { path = "../../../substrate/frame/support", default-features = false } diff --git a/cumulus/parachains/common/src/impls.rs b/cumulus/parachains/common/src/impls.rs index 957538b7cdadbd68ed298a5a867cd1a7754e083d..d70fdfeb7095a2dbd6f5fd9a53caeb1272476743 100644 --- a/cumulus/parachains/common/src/impls.rs +++ b/cumulus/parachains/common/src/impls.rs @@ -17,10 +17,11 @@ //! Taken from polkadot/runtime/common (at a21cd64) and adapted for parachains. use frame_support::traits::{ - fungibles::{self, Balanced, Credit}, - Contains, ContainsPair, Currency, Get, Imbalance, OnUnbalanced, OriginTrait, + fungible, fungibles, tokens::imbalance::ResolveTo, Contains, ContainsPair, Currency, Defensive, + Get, Imbalance, OnUnbalanced, OriginTrait, }; use pallet_asset_tx_payment::HandleCredit; +use pallet_collator_selection::StakingPotAccountId; use sp_runtime::traits::Zero; use sp_std::{marker::PhantomData, prelude::*}; use xcm::latest::{ @@ -29,16 +30,20 @@ use xcm::latest::{ }; use xcm_executor::traits::ConvertLocation; +/// Type alias to conveniently refer to `frame_system`'s `Config::AccountId`. +pub type AccountIdOf = ::AccountId; + /// Type alias to conveniently refer to the `Currency::NegativeImbalance` associated type. pub type NegativeImbalance = as Currency< ::AccountId, >>::NegativeImbalance; -/// Type alias to conveniently refer to `frame_system`'s `Config::AccountId`. -pub type AccountIdOf = ::AccountId; - /// Implementation of `OnUnbalanced` that deposits the fees into a staking pot for later payout. +#[deprecated( + note = "ToStakingPot is deprecated and will be removed after March 2024. Please use frame_support::traits::tokens::imbalance::ResolveTo instead." +)] pub struct ToStakingPot(PhantomData); +#[allow(deprecated)] impl OnUnbalanced> for ToStakingPot where R: pallet_balances::Config + pallet_collator_selection::Config, @@ -47,25 +52,30 @@ where { fn on_nonzero_unbalanced(amount: NegativeImbalance) { let staking_pot = >::account_id(); + // In case of error: Will drop the result triggering the `OnDrop` of the imbalance. >::resolve_creating(&staking_pot, amount); } } -/// Implementation of `OnUnbalanced` that deals with the fees by combining tip and fee and passing -/// the result on to `ToStakingPot`. +/// Fungible implementation of `OnUnbalanced` that deals with the fees by combining tip and fee and +/// passing the result on to `ToStakingPot`. pub struct DealWithFees(PhantomData); -impl OnUnbalanced> for DealWithFees +impl OnUnbalanced>> for DealWithFees where R: pallet_balances::Config + pallet_collator_selection::Config, AccountIdOf: From + Into, ::RuntimeEvent: From>, { - fn on_unbalanceds(mut fees_then_tips: impl Iterator>) { + fn on_unbalanceds( + mut fees_then_tips: impl Iterator< + Item = fungible::Credit>, + >, + ) { if let Some(mut fees) = fees_then_tips.next() { if let Some(tips) = fees_then_tips.next() { tips.merge_into(&mut fees); } - as OnUnbalanced<_>>::on_unbalanced(fees); + ResolveTo::, pallet_balances::Pallet>::on_unbalanced(fees) } } } @@ -79,10 +89,11 @@ where R: pallet_authorship::Config + pallet_assets::Config, AccountIdOf: From + Into, { - fn handle_credit(credit: Credit, pallet_assets::Pallet>) { + fn handle_credit(credit: fungibles::Credit, pallet_assets::Pallet>) { + use frame_support::traits::fungibles::Balanced; if let Some(author) = pallet_authorship::Pallet::::author() { // In case of error: Will drop the result triggering the `OnDrop` of the imbalance. - let _ = pallet_assets::Pallet::::resolve(&author, credit); + let _ = pallet_assets::Pallet::::resolve(&author, credit).defensive(); } } } @@ -217,7 +228,7 @@ mod tests { pub const MaxReserves: u32 = 50; } - #[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] + #[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { type BaseCallFilter = frame_support::traits::Everything; type RuntimeOrigin = RuntimeOrigin; @@ -313,8 +324,14 @@ mod tests { #[test] fn test_fees_and_tip_split() { new_test_ext().execute_with(|| { - let fee = Balances::issue(10); - let tip = Balances::issue(20); + let fee = + as frame_support::traits::fungible::Balanced< + AccountId, + >>::issue(10); + let tip = + as frame_support::traits::fungible::Balanced< + AccountId, + >>::issue(20); assert_eq!(Balances::free_balance(TEST_ACCOUNT), 0); diff --git a/cumulus/parachains/common/src/xcm_config.rs b/cumulus/parachains/common/src/xcm_config.rs index 15b090923d501b3769a18efe1916a146d4474f42..a9756af7aed245ea792d12addbbb2fff529eedaf 100644 --- a/cumulus/parachains/common/src/xcm_config.rs +++ b/cumulus/parachains/common/src/xcm_config.rs @@ -45,8 +45,6 @@ where >::AssetId, >::Balance, >, - AccountIdOf: - From + Into, { fn charge_weight_in_fungibles( asset_id: as Inspect< diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-rococo/Cargo.toml b/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-rococo/Cargo.toml index f4f8b3603ba61e44195d6be8151b296f002ac720..98762beb0cb23132c3880515287328bb09bde032 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-rococo/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-rococo/Cargo.toml @@ -17,7 +17,7 @@ sp-core = { path = "../../../../../../../../substrate/primitives/core", default- frame-support = { path = "../../../../../../../../substrate/frame/support", default-features = false } # Cumulus -parachains-common = { path = "../../../../../../../parachains/common" } +parachains-common = { path = "../../../../../../common" } cumulus-primitives-core = { path = "../../../../../../../primitives/core", default-features = false } emulated-integration-tests-common = { path = "../../../../common", default-features = false } asset-hub-rococo-runtime = { path = "../../../../../../runtimes/assets/asset-hub-rococo" } diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-rococo/src/genesis.rs b/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-rococo/src/genesis.rs index 80db56444696a557d5a11fae47fe2bd72d3f00a0..e5378b35f5e484e10db94c66bc5244099b682604 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-rococo/src/genesis.rs +++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-rococo/src/genesis.rs @@ -14,17 +14,24 @@ // limitations under the License. // Substrate -use sp_core::storage::Storage; +use frame_support::parameter_types; +use sp_core::{sr25519, storage::Storage}; // Cumulus use emulated_integration_tests_common::{ - accounts, build_genesis_storage, collators, SAFE_XCM_VERSION, + accounts, build_genesis_storage, collators, get_account_id_from_seed, + PenpalSiblingSovereignAccount, PenpalTeleportableAssetLocation, RESERVABLE_ASSET_ID, + SAFE_XCM_VERSION, }; -use parachains_common::Balance; +use parachains_common::{AccountId, Balance}; pub const PARA_ID: u32 = 1000; pub const ED: Balance = testnet_parachains_constants::rococo::currency::EXISTENTIAL_DEPOSIT; +parameter_types! { + pub AssetHubRococoAssetOwner: AccountId = get_account_id_from_seed::("Alice"); +} + pub fn genesis() -> Storage { let genesis_config = asset_hub_rococo_runtime::RuntimeGenesisConfig { system: asset_hub_rococo_runtime::SystemConfig::default(), @@ -60,6 +67,22 @@ pub fn genesis() -> Storage { safe_xcm_version: Some(SAFE_XCM_VERSION), ..Default::default() }, + assets: asset_hub_rococo_runtime::AssetsConfig { + assets: vec![(RESERVABLE_ASSET_ID, AssetHubRococoAssetOwner::get(), true, ED)], + ..Default::default() + }, + foreign_assets: asset_hub_rococo_runtime::ForeignAssetsConfig { + assets: vec![ + // Penpal's teleportable asset representation + ( + PenpalTeleportableAssetLocation::get(), + PenpalSiblingSovereignAccount::get(), + true, + ED, + ), + ], + ..Default::default() + }, ..Default::default() }; diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-rococo/src/lib.rs b/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-rococo/src/lib.rs index 00f412564205507f2deb6b516ace435302fcf4c4..f1e972e869dc94465aa28356a7eaa1c4cd4503ef 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-rococo/src/lib.rs +++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-rococo/src/lib.rs @@ -21,7 +21,7 @@ use frame_support::traits::OnInitialize; // Cumulus use emulated_integration_tests_common::{ impl_accounts_helpers_for_parachain, impl_assert_events_helpers_for_parachain, - impl_assets_helpers_for_parachain, impl_foreign_assets_helpers_for_parachain, + impl_assets_helpers_for_parachain, impl_assets_helpers_for_system_parachain, impl_xcm_helpers_for_parachain, impls::Parachain, xcm_emulator::decl_test_parachains, }; use rococo_emulated_chain::Rococo; @@ -54,6 +54,6 @@ decl_test_parachains! { // AssetHubRococo implementation impl_accounts_helpers_for_parachain!(AssetHubRococo); impl_assert_events_helpers_for_parachain!(AssetHubRococo); -impl_assets_helpers_for_parachain!(AssetHubRococo, Rococo); -impl_foreign_assets_helpers_for_parachain!(AssetHubRococo, Rococo); +impl_assets_helpers_for_system_parachain!(AssetHubRococo, Rococo); +impl_assets_helpers_for_parachain!(AssetHubRococo); impl_xcm_helpers_for_parachain!(AssetHubRococo); diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-westend/Cargo.toml b/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-westend/Cargo.toml index d4764f63bf64d3cc650d53ee8c637129448121a2..a42a9abf618d403852561d5d4b20e7fb6ad576e7 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-westend/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-westend/Cargo.toml @@ -17,7 +17,7 @@ sp-core = { path = "../../../../../../../../substrate/primitives/core", default- frame-support = { path = "../../../../../../../../substrate/frame/support", default-features = false } # Cumulus -parachains-common = { path = "../../../../../../../parachains/common" } +parachains-common = { path = "../../../../../../common" } cumulus-primitives-core = { path = "../../../../../../../primitives/core", default-features = false } emulated-integration-tests-common = { path = "../../../../common", default-features = false } asset-hub-westend-runtime = { path = "../../../../../../runtimes/assets/asset-hub-westend" } diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-westend/src/genesis.rs b/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-westend/src/genesis.rs index b2e4645ee076803accc14c3fc32653228c61ab98..219d1306906cbc6c20609870bec496c5bd16eaeb 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-westend/src/genesis.rs +++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-westend/src/genesis.rs @@ -14,17 +14,24 @@ // limitations under the License. // Substrate -use sp_core::storage::Storage; +use frame_support::parameter_types; +use sp_core::{sr25519, storage::Storage}; // Cumulus use emulated_integration_tests_common::{ - accounts, build_genesis_storage, collators, SAFE_XCM_VERSION, + accounts, build_genesis_storage, collators, get_account_id_from_seed, + PenpalSiblingSovereignAccount, PenpalTeleportableAssetLocation, RESERVABLE_ASSET_ID, + SAFE_XCM_VERSION, }; -use parachains_common::Balance; +use parachains_common::{AccountId, Balance}; pub const PARA_ID: u32 = 1000; pub const ED: Balance = testnet_parachains_constants::westend::currency::EXISTENTIAL_DEPOSIT; +parameter_types! { + pub AssetHubWestendAssetOwner: AccountId = get_account_id_from_seed::("Alice"); +} + pub fn genesis() -> Storage { let genesis_config = asset_hub_westend_runtime::RuntimeGenesisConfig { system: asset_hub_westend_runtime::SystemConfig::default(), @@ -56,6 +63,22 @@ pub fn genesis() -> Storage { safe_xcm_version: Some(SAFE_XCM_VERSION), ..Default::default() }, + assets: asset_hub_westend_runtime::AssetsConfig { + assets: vec![(RESERVABLE_ASSET_ID, AssetHubWestendAssetOwner::get(), true, ED)], + ..Default::default() + }, + foreign_assets: asset_hub_westend_runtime::ForeignAssetsConfig { + assets: vec![ + // Penpal's teleportable asset representation + ( + PenpalTeleportableAssetLocation::get(), + PenpalSiblingSovereignAccount::get(), + true, + ED, + ), + ], + ..Default::default() + }, ..Default::default() }; diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-westend/src/lib.rs b/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-westend/src/lib.rs index 25d7c1079b4dd3cfa08a27ac3e10cbc498279e34..7f05eefb4c208dab2192bc111347ffa4f2760fc0 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-westend/src/lib.rs +++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-westend/src/lib.rs @@ -21,7 +21,7 @@ use frame_support::traits::OnInitialize; // Cumulus use emulated_integration_tests_common::{ impl_accounts_helpers_for_parachain, impl_assert_events_helpers_for_parachain, - impl_assets_helpers_for_parachain, impl_foreign_assets_helpers_for_parachain, + impl_assets_helpers_for_parachain, impl_assets_helpers_for_system_parachain, impl_xcm_helpers_for_parachain, impls::Parachain, xcm_emulator::decl_test_parachains, }; use westend_emulated_chain::Westend; @@ -54,6 +54,6 @@ decl_test_parachains! { // AssetHubWestend implementation impl_accounts_helpers_for_parachain!(AssetHubWestend); impl_assert_events_helpers_for_parachain!(AssetHubWestend); -impl_assets_helpers_for_parachain!(AssetHubWestend, Westend); -impl_foreign_assets_helpers_for_parachain!(AssetHubWestend, Westend); +impl_assets_helpers_for_system_parachain!(AssetHubWestend, Westend); +impl_assets_helpers_for_parachain!(AssetHubWestend); impl_xcm_helpers_for_parachain!(AssetHubWestend); diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-rococo/Cargo.toml b/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-rococo/Cargo.toml index 322d8b44e6ea6b293fb1c2f52e0de80fa9cd29f1..789f10a35f268c62e0cc9fa153c99e7e5282ee8d 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-rococo/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-rococo/Cargo.toml @@ -17,7 +17,7 @@ sp-core = { path = "../../../../../../../../substrate/primitives/core", default- frame-support = { path = "../../../../../../../../substrate/frame/support", default-features = false } # Cumulus -parachains-common = { path = "../../../../../../../parachains/common" } +parachains-common = { path = "../../../../../../common" } emulated-integration-tests-common = { path = "../../../../common", default-features = false } bridge-hub-rococo-runtime = { path = "../../../../../../runtimes/bridge-hubs/bridge-hub-rococo" } bridge-hub-common = { path = "../../../../../../runtimes/bridge-hubs/common", default-features = false } diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-westend/Cargo.toml b/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-westend/Cargo.toml index ec1386b7f6e2b231e7f9ffdc925b3d0c802bf4f2..d82971cf55aeddf20032be952b8a980014434f6b 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-westend/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-westend/Cargo.toml @@ -17,7 +17,7 @@ sp-core = { path = "../../../../../../../../substrate/primitives/core", default- frame-support = { path = "../../../../../../../../substrate/frame/support", default-features = false } # Cumulus -parachains-common = { path = "../../../../../../../parachains/common" } +parachains-common = { path = "../../../../../../common" } emulated-integration-tests-common = { path = "../../../../common", default-features = false } bridge-hub-westend-runtime = { path = "../../../../../../runtimes/bridge-hubs/bridge-hub-westend" } bridge-hub-common = { path = "../../../../../../runtimes/bridge-hubs/common", default-features = false } diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/collectives/collectives-westend/Cargo.toml b/cumulus/parachains/integration-tests/emulated/chains/parachains/collectives/collectives-westend/Cargo.toml index 03f755b666afbf87e876a7f7d5111aa98a1bc727..4c2a7d3c274dce6eade9c9d42be00301bd6dc462 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/parachains/collectives/collectives-westend/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/collectives/collectives-westend/Cargo.toml @@ -17,7 +17,7 @@ sp-core = { path = "../../../../../../../../substrate/primitives/core", default- frame-support = { path = "../../../../../../../../substrate/frame/support", default-features = false } # Cumulus -parachains-common = { path = "../../../../../../../parachains/common" } +parachains-common = { path = "../../../../../../common" } cumulus-primitives-core = { path = "../../../../../../../primitives/core", default-features = false } emulated-integration-tests-common = { path = "../../../../common", default-features = false } collectives-westend-runtime = { path = "../../../../../../runtimes/collectives/collectives-westend" } diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/people/people-rococo/Cargo.toml b/cumulus/parachains/integration-tests/emulated/chains/parachains/people/people-rococo/Cargo.toml index 65a358d0ef2f6b697453f2c1cbef20d3b2cd93a8..f7fe93d27775a28cb560d8791a3b0d8ed49c9d68 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/parachains/people/people-rococo/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/people/people-rococo/Cargo.toml @@ -14,7 +14,7 @@ sp-core = { path = "../../../../../../../../substrate/primitives/core", default- frame-support = { path = "../../../../../../../../substrate/frame/support", default-features = false } # Cumulus -parachains-common = { path = "../../../../../../../parachains/common" } +parachains-common = { path = "../../../../../../common" } cumulus-primitives-core = { path = "../../../../../../../primitives/core", default-features = false } emulated-integration-tests-common = { path = "../../../../common", default-features = false } people-rococo-runtime = { path = "../../../../../../runtimes/people/people-rococo" } diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/people/people-westend/Cargo.toml b/cumulus/parachains/integration-tests/emulated/chains/parachains/people/people-westend/Cargo.toml index 075698848bcf0705c00ea46e3443802ca2fbe6b0..57a767e0c2a3eb7d23df7f8d95fd78128c996f35 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/parachains/people/people-westend/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/people/people-westend/Cargo.toml @@ -14,7 +14,7 @@ sp-core = { path = "../../../../../../../../substrate/primitives/core", default- frame-support = { path = "../../../../../../../../substrate/frame/support", default-features = false } # Cumulus -parachains-common = { path = "../../../../../../../parachains/common" } +parachains-common = { path = "../../../../../../common" } cumulus-primitives-core = { path = "../../../../../../../primitives/core", default-features = false } emulated-integration-tests-common = { path = "../../../../common", default-features = false } people-westend-runtime = { path = "../../../../../../runtimes/people/people-westend" } diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/testing/penpal/Cargo.toml b/cumulus/parachains/integration-tests/emulated/chains/parachains/testing/penpal/Cargo.toml index a853825d8ef626aef9f7a7d1c013667aea9aeb89..2ac508273c6158ddae08615d8574102f98e3e788 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/parachains/testing/penpal/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/testing/penpal/Cargo.toml @@ -16,10 +16,11 @@ workspace = true sp-core = { path = "../../../../../../../../substrate/primitives/core", default-features = false } frame-support = { path = "../../../../../../../../substrate/frame/support", default-features = false } +# Polkadot +xcm = { package = "staging-xcm", path = "../../../../../../../../polkadot/xcm", default-features = false } + # Cumulus -parachains-common = { path = "../../../../../../../parachains/common" } +parachains-common = { path = "../../../../../../common" } cumulus-primitives-core = { path = "../../../../../../../primitives/core", default-features = false } emulated-integration-tests-common = { path = "../../../../common", default-features = false } penpal-runtime = { path = "../../../../../../runtimes/testing/penpal" } -rococo-emulated-chain = { path = "../../../relays/rococo" } -westend-emulated-chain = { path = "../../../relays/westend" } diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/testing/penpal/src/genesis.rs b/cumulus/parachains/integration-tests/emulated/chains/parachains/testing/penpal/src/genesis.rs index 9ab32a977d7113a1f01fc287d591f2cc2c550266..d81ab8143ddba678617aaa67db122298ce29606c 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/parachains/testing/penpal/src/genesis.rs +++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/testing/penpal/src/genesis.rs @@ -14,19 +14,27 @@ // limitations under the License. // Substrate +use frame_support::parameter_types; use sp_core::{sr25519, storage::Storage}; +// Polkadot +use xcm::v3::Location; // Cumulus use emulated_integration_tests_common::{ accounts, build_genesis_storage, collators, get_account_id_from_seed, SAFE_XCM_VERSION, }; -use parachains_common::Balance; - +use parachains_common::{AccountId, Balance}; +use penpal_runtime::xcm_config::{LocalReservableFromAssetHub, RelayLocation}; // Penpal pub const PARA_ID_A: u32 = 2000; pub const PARA_ID_B: u32 = 2001; pub const ED: Balance = penpal_runtime::EXISTENTIAL_DEPOSIT; +parameter_types! { + pub PenpalSudoAccount: AccountId = get_account_id_from_seed::("Alice"); + pub PenpalAssetOwner: AccountId = PenpalSudoAccount::get(); +} + pub fn genesis(para_id: u32) -> Storage { let genesis_config = penpal_runtime::RuntimeGenesisConfig { system: penpal_runtime::SystemConfig::default(), @@ -58,8 +66,35 @@ pub fn genesis(para_id: u32) -> Storage { safe_xcm_version: Some(SAFE_XCM_VERSION), ..Default::default() }, - sudo: penpal_runtime::SudoConfig { - key: Some(get_account_id_from_seed::("Alice")), + sudo: penpal_runtime::SudoConfig { key: Some(PenpalSudoAccount::get()) }, + assets: penpal_runtime::AssetsConfig { + assets: vec![( + penpal_runtime::xcm_config::TELEPORTABLE_ASSET_ID, + PenpalAssetOwner::get(), + false, + ED, + )], + ..Default::default() + }, + foreign_assets: penpal_runtime::ForeignAssetsConfig { + assets: vec![ + // Relay Native asset representation + ( + Location::try_from(RelayLocation::get()).expect("conversion works"), + PenpalAssetOwner::get(), + true, + ED, + ), + // Sufficient AssetHub asset representation + ( + Location::try_from(LocalReservableFromAssetHub::get()) + .expect("conversion works"), + PenpalAssetOwner::get(), + true, + ED, + ), + ], + ..Default::default() }, ..Default::default() }; diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/testing/penpal/src/lib.rs b/cumulus/parachains/integration-tests/emulated/chains/parachains/testing/penpal/src/lib.rs index 8f586a46a75cb68a7ccdf62d2f23a1865dcf5d9c..0b49c7a3e091a615632728b6ba74ca4dffefae66 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/parachains/testing/penpal/src/lib.rs +++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/testing/penpal/src/lib.rs @@ -14,9 +14,9 @@ // limitations under the License. mod genesis; -pub use genesis::{genesis, ED, PARA_ID_A, PARA_ID_B}; +pub use genesis::{genesis, PenpalAssetOwner, PenpalSudoAccount, ED, PARA_ID_A, PARA_ID_B}; pub use penpal_runtime::xcm_config::{ - LocalTeleportableToAssetHub, LocalTeleportableToAssetHubV3, XcmConfig, + CustomizableAssetFromSystemAssetHub, LocalTeleportableToAssetHub, XcmConfig, }; // Substrate @@ -27,8 +27,6 @@ use emulated_integration_tests_common::{ impl_accounts_helpers_for_parachain, impl_assert_events_helpers_for_parachain, impl_assets_helpers_for_parachain, impls::Parachain, xcm_emulator::decl_test_parachains, }; -use rococo_emulated_chain::Rococo; -use westend_emulated_chain::Westend; // Penpal Parachain declaration decl_test_parachains! { @@ -75,7 +73,7 @@ decl_test_parachains! { // Penpal implementation impl_accounts_helpers_for_parachain!(PenpalA); impl_accounts_helpers_for_parachain!(PenpalB); -impl_assets_helpers_for_parachain!(PenpalA, Rococo); -impl_assets_helpers_for_parachain!(PenpalB, Westend); impl_assert_events_helpers_for_parachain!(PenpalA); impl_assert_events_helpers_for_parachain!(PenpalB); +impl_assets_helpers_for_parachain!(PenpalA); +impl_assets_helpers_for_parachain!(PenpalB); diff --git a/cumulus/parachains/integration-tests/emulated/chains/relays/rococo/Cargo.toml b/cumulus/parachains/integration-tests/emulated/chains/relays/rococo/Cargo.toml index 2d27426cca7599e3284caa6c8ca69a2d546a8da2..7ac65b0ee1ded60939072ff61d6886fa53a10b94 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/relays/rococo/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/chains/relays/rococo/Cargo.toml @@ -25,5 +25,5 @@ rococo-runtime-constants = { path = "../../../../../../../polkadot/runtime/rococ rococo-runtime = { path = "../../../../../../../polkadot/runtime/rococo" } # Cumulus -parachains-common = { path = "../../../../../../parachains/common" } +parachains-common = { path = "../../../../../common" } emulated-integration-tests-common = { path = "../../../common", default-features = false } diff --git a/cumulus/parachains/integration-tests/emulated/chains/relays/rococo/src/genesis.rs b/cumulus/parachains/integration-tests/emulated/chains/relays/rococo/src/genesis.rs index 45e1e94de0100bf8a765b22163f519d0a54ced1c..55437645b0523b577c2e9d455952f5526ba9df0b 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/relays/rococo/src/genesis.rs +++ b/cumulus/parachains/integration-tests/emulated/chains/relays/rococo/src/genesis.rs @@ -25,8 +25,7 @@ use polkadot_primitives::{AssignmentId, ValidatorId}; // Cumulus use emulated_integration_tests_common::{ - accounts, build_genesis_storage, get_account_id_from_seed, get_from_seed, get_host_config, - validators, + accounts, build_genesis_storage, get_account_id_from_seed, get_host_config, validators, }; use parachains_common::Balance; use rococo_runtime_constants::currency::UNITS as ROC; @@ -71,7 +70,7 @@ pub fn genesis() -> Storage { x.4.clone(), x.5.clone(), x.6.clone(), - get_from_seed::("Alice"), + x.7.clone(), ), ) }) @@ -79,7 +78,7 @@ pub fn genesis() -> Storage { }, babe: rococo_runtime::BabeConfig { authorities: Default::default(), - epoch_config: Some(rococo_runtime::BABE_GENESIS_EPOCH_CONFIG), + epoch_config: rococo_runtime::BABE_GENESIS_EPOCH_CONFIG, ..Default::default() }, sudo: rococo_runtime::SudoConfig { diff --git a/cumulus/parachains/integration-tests/emulated/chains/relays/rococo/src/lib.rs b/cumulus/parachains/integration-tests/emulated/chains/relays/rococo/src/lib.rs index e0d37302120fa7c7ae9e8cd4f5e62135b3febcb1..379a29d697bcb564b670eadb638f7088f042137a 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/relays/rococo/src/lib.rs +++ b/cumulus/parachains/integration-tests/emulated/chains/relays/rococo/src/lib.rs @@ -24,7 +24,7 @@ use emulated_integration_tests_common::{ // Rococo declaration decl_test_relay_chains! { - #[api_version(10)] + #[api_version(11)] pub struct Rococo { genesis = genesis::genesis(), on_init = (), diff --git a/cumulus/parachains/integration-tests/emulated/chains/relays/westend/Cargo.toml b/cumulus/parachains/integration-tests/emulated/chains/relays/westend/Cargo.toml index abc40c2040681cc4cb41246a9872d557134b6dde..12a3ad60e0e046f1881d322118d522da3f9b52b1 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/relays/westend/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/chains/relays/westend/Cargo.toml @@ -11,7 +11,6 @@ publish = false workspace = true [dependencies] - # Substrate sp-core = { path = "../../../../../../../substrate/primitives/core", default-features = false } sp-runtime = { path = "../../../../../../../substrate/primitives/runtime", default-features = false } @@ -27,5 +26,5 @@ westend-runtime-constants = { path = "../../../../../../../polkadot/runtime/west westend-runtime = { path = "../../../../../../../polkadot/runtime/westend" } # Cumulus -parachains-common = { path = "../../../../../../parachains/common" } +parachains-common = { path = "../../../../../common" } emulated-integration-tests-common = { path = "../../../common", default-features = false } diff --git a/cumulus/parachains/integration-tests/emulated/chains/relays/westend/src/genesis.rs b/cumulus/parachains/integration-tests/emulated/chains/relays/westend/src/genesis.rs index e2297100a4525e6d26cb469f6f1458023a12b82c..700b80e63f6cf68e6095b7e02d84bb285ce720f9 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/relays/westend/src/genesis.rs +++ b/cumulus/parachains/integration-tests/emulated/chains/relays/westend/src/genesis.rs @@ -26,7 +26,7 @@ use polkadot_primitives::{AssignmentId, ValidatorId}; // Cumulus use emulated_integration_tests_common::{ - accounts, build_genesis_storage, get_from_seed, get_host_config, validators, + accounts, build_genesis_storage, get_host_config, validators, }; use parachains_common::Balance; use westend_runtime_constants::currency::UNITS as WND; @@ -72,7 +72,7 @@ pub fn genesis() -> Storage { x.4.clone(), x.5.clone(), x.6.clone(), - get_from_seed::("Alice"), + x.7.clone(), ), ) }) @@ -94,7 +94,7 @@ pub fn genesis() -> Storage { }, babe: westend_runtime::BabeConfig { authorities: Default::default(), - epoch_config: Some(westend_runtime::BABE_GENESIS_EPOCH_CONFIG), + epoch_config: westend_runtime::BABE_GENESIS_EPOCH_CONFIG, ..Default::default() }, configuration: westend_runtime::ConfigurationConfig { config: get_host_config() }, diff --git a/cumulus/parachains/integration-tests/emulated/chains/relays/westend/src/lib.rs b/cumulus/parachains/integration-tests/emulated/chains/relays/westend/src/lib.rs index 4d29a8024d17699a66be1d1583aa763884a0a94e..83af58f61732d7c0e545c365ab2d049125f3777e 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/relays/westend/src/lib.rs +++ b/cumulus/parachains/integration-tests/emulated/chains/relays/westend/src/lib.rs @@ -24,7 +24,7 @@ use emulated_integration_tests_common::{ // Westend declaration decl_test_relay_chains! { - #[api_version(10)] + #[api_version(11)] pub struct Westend { genesis = genesis::genesis(), on_init = (), diff --git a/cumulus/parachains/integration-tests/emulated/common/Cargo.toml b/cumulus/parachains/integration-tests/emulated/common/Cargo.toml index 381e4110f908a5669b20acbaea44351169652ade..8c44cce7d922dff0a69a4273af7adb69819d2fce 100644 --- a/cumulus/parachains/integration-tests/emulated/common/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/common/Cargo.toml @@ -14,6 +14,7 @@ codec = { package = "parity-scale-codec", version = "3.4.0", default-features = paste = "1.0.14" # Substrate +beefy-primitives = { package = "sp-consensus-beefy", path = "../../../../../substrate/primitives/consensus/beefy" } grandpa = { package = "sc-consensus-grandpa", path = "../../../../../substrate/client/consensus/grandpa" } sp-authority-discovery = { path = "../../../../../substrate/primitives/authority-discovery" } sp-runtime = { path = "../../../../../substrate/primitives/runtime" } @@ -25,8 +26,8 @@ pallet-balances = { path = "../../../../../substrate/frame/balances" } pallet-message-queue = { path = "../../../../../substrate/frame/message-queue" } # Polkadot -polkadot-service = { path = "../../../../../polkadot/node/service", default-features = false, features = ["full-node"] } polkadot-primitives = { path = "../../../../../polkadot/primitives" } +polkadot-parachain-primitives = { path = "../../../../../polkadot/parachain" } polkadot-runtime-parachains = { path = "../../../../../polkadot/runtime/parachains" } xcm = { package = "staging-xcm", path = "../../../../../polkadot/xcm" } pallet-xcm = { path = "../../../../../polkadot/xcm/pallet-xcm" } diff --git a/cumulus/parachains/integration-tests/emulated/common/src/impls.rs b/cumulus/parachains/integration-tests/emulated/common/src/impls.rs index 4bbb4701e43918f5f34b250a23c4c483f2b2d4d1..618c3addc5d0c67c3954610425345d3ec8b2f36b 100644 --- a/cumulus/parachains/integration-tests/emulated/common/src/impls.rs +++ b/cumulus/parachains/integration-tests/emulated/common/src/impls.rs @@ -114,7 +114,7 @@ where .expect("Bridge message does not exist") .into(); let payload = Vec::::decode(&mut &encoded_payload[..]) - .expect("Decodign XCM message failed"); + .expect("Decoding XCM message failed"); let id: u32 = LaneIdWrapper(*lane).into(); let message = BridgeMessage { id, nonce, payload }; @@ -265,7 +265,7 @@ macro_rules! impl_assert_events_helpers_for_relay_chain { $crate::impls::assert_expected_events!( Self, vec![ - // XCM is succesfully received and proccessed + // XCM is successfully received and processed [<$chain RuntimeEvent>]::::MessageQueue($crate::impls::pallet_message_queue::Event::Processed { origin: $crate::impls::AggregateMessageOrigin::Ump($crate::impls::UmpQueueId::Para(id)), weight_used, @@ -343,7 +343,7 @@ macro_rules! impl_hrmp_channels_helpers_for_relay_chain { ::Runtime, >::contains_key(&channel_id); - // Check the HRMP channel has been successfully registrered + // Check the HRMP channel has been successfully registered assert!(hrmp_channel_exist) }); } @@ -362,7 +362,7 @@ macro_rules! impl_send_transact_helpers_for_relay_chain { recipient: $crate::impls::ParaId, call: $crate::impls::DoubleEncoded<()> ) { - use $crate::impls::{bx, Chain, RelayChain}; + use $crate::impls::{bx, Chain, RelayChain, Encode}; ::execute_with(|| { let root_origin = ::RuntimeOrigin::root(); @@ -370,10 +370,10 @@ macro_rules! impl_send_transact_helpers_for_relay_chain { let xcm = $crate::impls::xcm_transact_unpaid_execution(call, $crate::impls::OriginKind::Superuser); // Send XCM `Transact` - $crate::impls::assert_ok!(]>::XcmPallet::send( + $crate::impls::assert_ok!(]>::XcmPallet::send_blob( root_origin, bx!(destination.into()), - bx!(xcm), + xcm.encode().try_into().unwrap(), )); Self::assert_xcm_pallet_sent(); }); @@ -592,7 +592,7 @@ macro_rules! impl_assert_events_helpers_for_parachain { } #[macro_export] -macro_rules! impl_assets_helpers_for_parachain { +macro_rules! impl_assets_helpers_for_system_parachain { ( $chain:ident, $relay_chain:ident ) => { $crate::impls::paste::paste! { impl $chain { @@ -630,38 +630,6 @@ macro_rules! impl_assets_helpers_for_parachain { $crate::impls::xcm_transact_unpaid_execution(call, origin_kind) } - /// Mint assets making use of the assets pallet - pub fn mint_asset( - signed_origin: ::RuntimeOrigin, - id: u32, - beneficiary: $crate::impls::AccountId, - amount_to_mint: u128, - ) { - ::execute_with(|| { - $crate::impls::assert_ok!(]>::Assets::mint( - signed_origin, - id.clone().into(), - beneficiary.clone().into(), - amount_to_mint - )); - - type RuntimeEvent = <$chain as $crate::impls::Chain>::RuntimeEvent; - - $crate::impls::assert_expected_events!( - Self, - vec![ - RuntimeEvent::::Assets( - $crate::impls::pallet_assets::Event::Issued { asset_id, owner, amount } - ) => { - asset_id: *asset_id == id, - owner: *owner == beneficiary.clone().into(), - amount: *amount == amount_to_mint, - }, - ] - ); - }); - } - /// Force create and mint assets making use of the assets pallet pub fn force_create_and_mint_asset( id: u32, @@ -727,8 +695,8 @@ macro_rules! impl_assets_helpers_for_parachain { } #[macro_export] -macro_rules! impl_foreign_assets_helpers_for_parachain { - ( $chain:ident, $relay_chain:ident ) => { +macro_rules! impl_assets_helpers_for_parachain { + ( $chain:ident) => { $crate::impls::paste::paste! { impl $chain { /// Create foreign assets using sudo `ForeignAssets::force_create()` @@ -803,6 +771,118 @@ macro_rules! impl_foreign_assets_helpers_for_parachain { ); }); } + /// Create assets using sudo `Assets::force_create()` + pub fn force_create_asset( + id: u32, + owner: $crate::impls::AccountId, + is_sufficient: bool, + min_balance: u128, + prefund_accounts: Vec<($crate::impls::AccountId, u128)>, + ) { + use $crate::impls::Inspect; + let sudo_origin = <$chain as $crate::impls::Chain>::RuntimeOrigin::root(); + ::execute_with(|| { + $crate::impls::assert_ok!( + ]>::Assets::force_create( + sudo_origin, + id.clone().into(), + owner.clone().into(), + is_sufficient, + min_balance, + ) + ); + assert!(]>::Assets::asset_exists(id.clone())); + type RuntimeEvent = <$chain as $crate::impls::Chain>::RuntimeEvent; + $crate::impls::assert_expected_events!( + Self, + vec![ + RuntimeEvent::::Assets( + $crate::impls::pallet_assets::Event::ForceCreated { + asset_id, + .. + } + ) => { asset_id: *asset_id == id, }, + ] + ); + }); + for (beneficiary, amount) in prefund_accounts.into_iter() { + let signed_origin = + <$chain as $crate::impls::Chain>::RuntimeOrigin::signed(owner.clone()); + Self::mint_asset(signed_origin, id.clone(), beneficiary, amount); + } + } + + /// Mint assets making use of the assets pallet + pub fn mint_asset( + signed_origin: ::RuntimeOrigin, + id: u32, + beneficiary: $crate::impls::AccountId, + amount_to_mint: u128, + ) { + ::execute_with(|| { + $crate::impls::assert_ok!(]>::Assets::mint( + signed_origin, + id.clone().into(), + beneficiary.clone().into(), + amount_to_mint + )); + + type RuntimeEvent = <$chain as $crate::impls::Chain>::RuntimeEvent; + + $crate::impls::assert_expected_events!( + Self, + vec![ + RuntimeEvent::::Assets( + $crate::impls::pallet_assets::Event::Issued { asset_id, owner, amount } + ) => { + asset_id: *asset_id == id, + owner: *owner == beneficiary.clone().into(), + amount: *amount == amount_to_mint, + }, + ] + ); + }); + } + + /// Returns the encoded call for `create` from the assets pallet + pub fn create_asset_call( + asset_id: u32, + min_balance: $crate::impls::Balance, + admin: $crate::impls::AccountId, + ) -> $crate::impls::DoubleEncoded<()> { + use $crate::impls::{Chain, Encode}; + + ::RuntimeCall::Assets($crate::impls::pallet_assets::Call::< + ::Runtime, + $crate::impls::pallet_assets::Instance1, + >::create { + id: asset_id.into(), + min_balance, + admin: admin.into(), + }) + .encode() + .into() + } + + /// Returns the encoded call for `create` from the foreign assets pallet + pub fn create_foreign_asset_call( + asset_id: $crate::impls::v3::Location, + min_balance: $crate::impls::Balance, + admin: $crate::impls::AccountId, + ) -> $crate::impls::DoubleEncoded<()> { + use $crate::impls::{Chain, Encode}; + + ::RuntimeCall::ForeignAssets($crate::impls::pallet_assets::Call::< + ::Runtime, + $crate::impls::pallet_assets::Instance2, + >::create { + id: asset_id.into(), + min_balance, + admin: admin.into(), + }) + .encode() + .into() + } } } }; diff --git a/cumulus/parachains/integration-tests/emulated/common/src/lib.rs b/cumulus/parachains/integration-tests/emulated/common/src/lib.rs index 546f81ce8254e3565ad03987d4376da7971782cc..cbde0642f1a2965579196cda7e7ada4f291e9d98 100644 --- a/cumulus/parachains/integration-tests/emulated/common/src/lib.rs +++ b/cumulus/parachains/integration-tests/emulated/common/src/lib.rs @@ -20,23 +20,25 @@ pub mod xcm_helpers; pub use xcm_emulator; // Substrate +use beefy_primitives::ecdsa_crypto::AuthorityId as BeefyId; +use frame_support::parameter_types; use grandpa::AuthorityId as GrandpaId; use sp_authority_discovery::AuthorityId as AuthorityDiscoveryId; use sp_consensus_babe::AuthorityId as BabeId; use sp_core::{sr25519, storage::Storage, Pair, Public}; use sp_runtime::{ - traits::{IdentifyAccount, Verify}, + traits::{AccountIdConversion, IdentifyAccount, Verify}, BuildStorage, MultiSignature, }; // Polakdot use parachains_common::BlockNumber; +use polkadot_parachain_primitives::primitives::Sibling; use polkadot_runtime_parachains::configuration::HostConfiguration; // Cumulus use parachains_common::{AccountId, AuraId}; use polkadot_primitives::{AssignmentId, ValidatorId}; -use polkadot_service::chain_spec::get_authority_keys_from_seed_no_beefy; pub const XCM_V2: u32 = 2; pub const XCM_V3: u32 = 3; @@ -49,6 +51,25 @@ pub const SAFE_XCM_VERSION: u32 = xcm::prelude::XCM_VERSION; type AccountPublic = ::Signer; +// This asset is added to AH as Asset and reserved transfer between Parachain and AH +pub const RESERVABLE_ASSET_ID: u32 = 1; +// This asset is added to AH as ForeignAsset and teleported between Penpal and AH +pub const TELEPORTABLE_ASSET_ID: u32 = 2; + +pub const PENPAL_ID: u32 = 2000; +pub const ASSETS_PALLET_ID: u8 = 50; + +parameter_types! { + pub PenpalTeleportableAssetLocation: xcm::v3::Location + = xcm::v3::Location::new(1, [ + xcm::v3::Junction::Parachain(PENPAL_ID), + xcm::v3::Junction::PalletInstance(ASSETS_PALLET_ID), + xcm::v3::Junction::GeneralIndex(TELEPORTABLE_ASSET_ID.into()), + ] + ); + pub PenpalSiblingSovereignAccount: AccountId = Sibling::from(PENPAL_ID).into_account_truncating(); +} + /// Helper function to generate a crypto pair from seed pub fn get_from_seed(seed: &str) -> ::Public { TPublic::Pair::from_string(&format!("//{}", seed), None) @@ -152,7 +173,18 @@ pub mod validators { ValidatorId, AssignmentId, AuthorityDiscoveryId, + BeefyId, )> { - vec![get_authority_keys_from_seed_no_beefy("Alice")] + let seed = "Alice"; + vec![( + get_account_id_from_seed::(&format!("{}//stash", seed)), + get_account_id_from_seed::(seed), + get_from_seed::(seed), + get_from_seed::(seed), + get_from_seed::(seed), + get_from_seed::(seed), + get_from_seed::(seed), + get_from_seed::(seed), + )] } } diff --git a/cumulus/parachains/integration-tests/emulated/common/src/macros.rs b/cumulus/parachains/integration-tests/emulated/common/src/macros.rs index 01a376e4dbf8cb304b55951540613b167996d4c8..6f6bbe41e01bd208ee6d40a9f3b4ba8f98f7975b 100644 --- a/cumulus/parachains/integration-tests/emulated/common/src/macros.rs +++ b/cumulus/parachains/integration-tests/emulated/common/src/macros.rs @@ -16,16 +16,26 @@ pub use paste; // Substrate +pub use frame_support::{pallet_prelude::Weight, weights::WeightToFee}; +pub use pallet_assets; pub use pallet_balances; pub use pallet_message_queue; pub use pallet_xcm; // Polkadot -pub use xcm::prelude::{AccountId32, WeightLimit}; +pub use xcm::{ + prelude::{ + AccountId32, All, Asset, AssetId, BuyExecution, DepositAsset, ExpectTransactStatus, + Fungible, Here, Location, MaybeErrorCode, OriginKind, RefundSurplus, Transact, Unlimited, + VersionedXcm, WeightLimit, WithdrawAsset, Xcm, + }, + v3::Location as V3Location, +}; // Cumulus pub use asset_test_utils; pub use cumulus_pallet_xcmp_queue; +pub use parachains_common::AccountId; pub use xcm_emulator::Chain; #[macro_export] @@ -76,7 +86,7 @@ macro_rules! test_parachain_is_trusted_teleporter { $crate::macros::cumulus_pallet_xcmp_queue::Event::XcmpMessageSent { .. } ) => {}, RuntimeEvent::Balances( - $crate::macros::pallet_balances::Event::Withdraw { who: sender, amount } + $crate::macros::pallet_balances::Event::Burned { who: sender, amount } ) => {}, ] ); @@ -90,7 +100,7 @@ macro_rules! test_parachain_is_trusted_teleporter { $receiver_para, vec![ RuntimeEvent::Balances( - $crate::macros::pallet_balances::Event::Deposit { who: receiver, .. } + $crate::macros::pallet_balances::Event::Minted { who: receiver, .. } ) => {}, RuntimeEvent::MessageQueue( $crate::macros::pallet_message_queue::Event::Processed { success: true, .. } @@ -105,7 +115,7 @@ macro_rules! test_parachain_is_trusted_teleporter { let para_receiver_balance_after = <$receiver_para as $crate::macros::Chain>::account_data_of(receiver.clone()).free; let delivery_fees = <$sender_para>::execute_with(|| { - $crate::macros::asset_test_utils::xcm_helpers::transfer_assets_delivery_fees::< + $crate::macros::asset_test_utils::xcm_helpers::teleport_assets_delivery_fees::< <$sender_xcm_config as xcm_executor::Config>::XcmSender, >($assets.clone(), fee_asset_item, weight_limit.clone(), beneficiary, para_destination) }); @@ -120,102 +130,3 @@ macro_rules! test_parachain_is_trusted_teleporter { } }; } - -#[macro_export] -macro_rules! include_penpal_create_foreign_asset_on_asset_hub { - ( $penpal:ident, $asset_hub:ident, $relay_ed:expr, $weight_to_fee:expr) => { - $crate::impls::paste::paste! { - pub fn penpal_create_foreign_asset_on_asset_hub( - asset_id_on_penpal: u32, - foreign_asset_at_asset_hub: v3::Location, - ah_as_seen_by_penpal: Location, - is_sufficient: bool, - asset_owner: AccountId, - prefund_amount: u128, - ) { - use frame_support::weights::WeightToFee; - let ah_check_account = $asset_hub::execute_with(|| { - <$asset_hub as [<$asset_hub Pallet>]>::PolkadotXcm::check_account() - }); - let penpal_check_account = - $penpal::execute_with(|| <$penpal as [<$penpal Pallet>]>::PolkadotXcm::check_account()); - let penpal_as_seen_by_ah = $asset_hub::sibling_location_of($penpal::para_id()); - - // prefund SA of Penpal on AssetHub with enough native tokens to pay for creating - // new foreign asset, also prefund CheckingAccount with ED, because teleported asset - // itself might not be sufficient and CheckingAccount cannot be created otherwise - let sov_penpal_on_ah = $asset_hub::sovereign_account_id_of(penpal_as_seen_by_ah.clone()); - $asset_hub::fund_accounts(vec![ - (sov_penpal_on_ah.clone().into(), $relay_ed * 100_000_000_000), - (ah_check_account.clone().into(), $relay_ed * 1000), - ]); - - // prefund SA of AssetHub on Penpal with native asset - let sov_ah_on_penpal = $penpal::sovereign_account_id_of(ah_as_seen_by_penpal.clone()); - $penpal::fund_accounts(vec![ - (sov_ah_on_penpal.into(), $relay_ed * 1_000_000_000), - (penpal_check_account.clone().into(), $relay_ed * 1000), - ]); - - // Force create asset on $penpal and prefund [<$penpal Sender>] - $penpal::force_create_and_mint_asset( - asset_id_on_penpal, - ASSET_MIN_BALANCE, - is_sufficient, - asset_owner, - None, - prefund_amount, - ); - - let require_weight_at_most = Weight::from_parts(1_100_000_000_000, 30_000); - // `OriginKind::Xcm` required by ForeignCreators pallet-assets origin filter - let origin_kind = OriginKind::Xcm; - let call_create_foreign_assets = - <$asset_hub as Chain>::RuntimeCall::ForeignAssets(pallet_assets::Call::< - <$asset_hub as Chain>::Runtime, - pallet_assets::Instance2, - >::create { - id: foreign_asset_at_asset_hub, - min_balance: ASSET_MIN_BALANCE, - admin: sov_penpal_on_ah.into(), - }) - .encode(); - let buy_execution_fee_amount = $weight_to_fee::weight_to_fee( - &Weight::from_parts(10_100_000_000_000, 300_000), - ); - let buy_execution_fee = Asset { - id: AssetId(Location { parents: 1, interior: Here }), - fun: Fungible(buy_execution_fee_amount), - }; - let xcm = VersionedXcm::from(Xcm(vec![ - WithdrawAsset { 0: vec![buy_execution_fee.clone()].into() }, - BuyExecution { fees: buy_execution_fee.clone(), weight_limit: Unlimited }, - Transact { require_weight_at_most, origin_kind, call: call_create_foreign_assets.into() }, - ExpectTransactStatus(MaybeErrorCode::Success), - RefundSurplus, - DepositAsset { assets: All.into(), beneficiary: penpal_as_seen_by_ah }, - ])); - // Send XCM message from penpal => asset_hub - let sudo_penpal_origin = <$penpal as Chain>::RuntimeOrigin::root(); - $penpal::execute_with(|| { - assert_ok!(<$penpal as [<$penpal Pallet>]>::PolkadotXcm::send( - sudo_penpal_origin.clone(), - bx!(ah_as_seen_by_penpal.into()), - bx!(xcm), - )); - type RuntimeEvent = <$penpal as Chain>::RuntimeEvent; - assert_expected_events!( - $penpal, - vec![ - RuntimeEvent::PolkadotXcm(pallet_xcm::Event::Sent { .. }) => {}, - ] - ); - }); - $asset_hub::execute_with(|| { - type ForeignAssets = <$asset_hub as [<$asset_hub Pallet>]>::ForeignAssets; - assert!(ForeignAssets::asset_exists(foreign_asset_at_asset_hub)); - }); - } - } - }; -} diff --git a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/Cargo.toml b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/Cargo.toml index 0a397c2617b4bbb4c9a509b8ef32dbcadbc33228..c5a672234a0d21603c86b64af75adc57beffb81b 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/Cargo.toml @@ -30,9 +30,8 @@ rococo-runtime = { path = "../../../../../../../polkadot/runtime/rococo" } # Cumulus asset-test-utils = { path = "../../../../../runtimes/assets/test-utils" } -parachains-common = { path = "../../../../../../parachains/common" } -cumulus-pallet-parachain-system = { path = "../../../../../../pallets/parachain-system", default-features = false } -testnet-parachains-constants = { path = "../../../../../runtimes/constants", features = ["rococo"] } +parachains-common = { path = "../../../../../common" } asset-hub-rococo-runtime = { path = "../../../../../runtimes/assets/asset-hub-rococo" } +penpal-runtime = { path = "../../../../../runtimes/testing/penpal" } emulated-integration-tests-common = { path = "../../../common", default-features = false } rococo-system-emulated-network = { path = "../../../networks/rococo-system" } diff --git a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/lib.rs b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/lib.rs index 1cc25cb54a14bb757ae844899f2c64e55b8c80bb..a5a4914e21d826ea6c70af4ae31a0d4dee43ef64 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/lib.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/lib.rs @@ -13,59 +13,75 @@ // See the License for the specific language governing permissions and // limitations under the License. -pub use codec::Encode; +#[cfg(test)] +mod imports { + pub use codec::Encode; + + // Substrate + pub use frame_support::{ + assert_err, assert_ok, + pallet_prelude::Weight, + sp_runtime::{DispatchError, DispatchResult, ModuleError}, + traits::fungibles::Inspect, + }; -// Substrate -pub use frame_support::{ - assert_err, assert_ok, - pallet_prelude::Weight, - sp_runtime::{AccountId32, DispatchError, DispatchResult}, - traits::fungibles::Inspect, -}; + // Polkadot + pub use xcm::{ + prelude::{AccountId32 as AccountId32Junction, *}, + v3, + }; -// Polkadot -pub use xcm::{ - prelude::{AccountId32 as AccountId32Junction, *}, - v3::{self, Error, NetworkId::Rococo as RococoId}, -}; + // Cumulus + pub use asset_test_utils::xcm_helpers; + pub use emulated_integration_tests_common::{ + test_parachain_is_trusted_teleporter, + xcm_emulator::{ + assert_expected_events, bx, Chain, Parachain as Para, RelayChain as Relay, Test, + TestArgs, TestContext, TestExt, + }, + xcm_helpers::{non_fee_asset, xcm_transact_paid_execution}, + ASSETS_PALLET_ID, RESERVABLE_ASSET_ID, XCM_V3, + }; + pub use parachains_common::Balance; + pub use rococo_system_emulated_network::{ + asset_hub_rococo_emulated_chain::{ + genesis::{AssetHubRococoAssetOwner, ED as ASSET_HUB_ROCOCO_ED}, + AssetHubRococoParaPallet as AssetHubRococoPallet, + }, + penpal_emulated_chain::{ + PenpalAParaPallet as PenpalAPallet, PenpalAssetOwner, + PenpalBParaPallet as PenpalBPallet, ED as PENPAL_ED, + }, + rococo_emulated_chain::{genesis::ED as ROCOCO_ED, RococoRelayPallet as RococoPallet}, + AssetHubRococoPara as AssetHubRococo, AssetHubRococoParaReceiver as AssetHubRococoReceiver, + AssetHubRococoParaSender as AssetHubRococoSender, BridgeHubRococoPara as BridgeHubRococo, + BridgeHubRococoParaReceiver as BridgeHubRococoReceiver, PenpalAPara as PenpalA, + PenpalAParaReceiver as PenpalAReceiver, PenpalAParaSender as PenpalASender, + PenpalBPara as PenpalB, PenpalBParaReceiver as PenpalBReceiver, RococoRelay as Rococo, + RococoRelayReceiver as RococoReceiver, RococoRelaySender as RococoSender, + }; -// Cumulus -pub use asset_test_utils::xcm_helpers; -pub use emulated_integration_tests_common::{ - test_parachain_is_trusted_teleporter, - xcm_emulator::{ - assert_expected_events, bx, helpers::weight_within_threshold, Chain, Parachain as Para, - RelayChain as Relay, Test, TestArgs, TestContext, TestExt, - }, - xcm_helpers::{xcm_transact_paid_execution, xcm_transact_unpaid_execution}, - PROOF_SIZE_THRESHOLD, REF_TIME_THRESHOLD, XCM_V3, -}; -pub use parachains_common::{AccountId, Balance}; -pub use rococo_system_emulated_network::{ - asset_hub_rococo_emulated_chain::{ - genesis::ED as ASSET_HUB_ROCOCO_ED, AssetHubRococoParaPallet as AssetHubRococoPallet, - }, - penpal_emulated_chain::PenpalAParaPallet as PenpalAPallet, - rococo_emulated_chain::{genesis::ED as ROCOCO_ED, RococoRelayPallet as RococoPallet}, - AssetHubRococoPara as AssetHubRococo, AssetHubRococoParaReceiver as AssetHubRococoReceiver, - AssetHubRococoParaSender as AssetHubRococoSender, BridgeHubRococoPara as BridgeHubRococo, - BridgeHubRococoParaReceiver as BridgeHubRococoReceiver, PenpalAPara as PenpalA, - PenpalAParaReceiver as PenpalAReceiver, PenpalAParaSender as PenpalASender, - PenpalBPara as PenpalB, PenpalBParaReceiver as PenpalBReceiver, RococoRelay as Rococo, - RococoRelayReceiver as RococoReceiver, RococoRelaySender as RococoSender, -}; + // Runtimes + pub use asset_hub_rococo_runtime::xcm_config::{ + TokenLocation as RelayLocation, XcmConfig as AssetHubRococoXcmConfig, + }; + pub use penpal_runtime::xcm_config::{ + LocalReservableFromAssetHub as PenpalLocalReservableFromAssetHub, + LocalTeleportableToAssetHub as PenpalLocalTeleportableToAssetHub, + }; + pub use rococo_runtime::xcm_config::XcmConfig as RococoXcmConfig; -pub const ASSET_ID: u32 = 1; -pub const ASSET_MIN_BALANCE: u128 = 1000; -// `Assets` pallet index -pub const ASSETS_PALLET_ID: u8 = 50; + pub const ASSET_ID: u32 = 3; + pub const ASSET_MIN_BALANCE: u128 = 1000; -pub type RelayToSystemParaTest = Test; -pub type RelayToParaTest = Test; -pub type SystemParaToRelayTest = Test; -pub type SystemParaToParaTest = Test; -pub type ParaToSystemParaTest = Test; -pub type ParaToParaTest = Test; + pub type RelayToSystemParaTest = Test; + pub type RelayToParaTest = Test; + pub type ParaToRelayTest = Test; + pub type SystemParaToRelayTest = Test; + pub type SystemParaToParaTest = Test; + pub type ParaToSystemParaTest = Test; + pub type ParaToParaThroughRelayTest = Test; +} #[cfg(test)] mod tests; diff --git a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/mod.rs b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/mod.rs index 21bed234304e2fae3eb285253e528d02e5441854..b3841af0e6c38372b8fb621fac468b25bdec63a1 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/mod.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/mod.rs @@ -18,11 +18,3 @@ mod send; mod set_xcm_versions; mod swap; mod teleport; - -use crate::*; -emulated_integration_tests_common::include_penpal_create_foreign_asset_on_asset_hub!( - PenpalA, - AssetHubRococo, - ROCOCO_ED, - testnet_parachains_constants::rococo::fee::WeightToFee -); diff --git a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/reserve_transfer.rs b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/reserve_transfer.rs index 50f47ab970bad1de098bafe66f1adc998d64c93c..a0738839087a51e87df3187ac6f06d2889cce64e 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/reserve_transfer.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/reserve_transfer.rs @@ -13,14 +13,13 @@ // See the License for the specific language governing permissions and // limitations under the License. -use crate::*; -use asset_hub_rococo_runtime::xcm_config::XcmConfig as AssetHubRococoXcmConfig; -use rococo_runtime::xcm_config::XcmConfig as RococoXcmConfig; -use rococo_system_emulated_network::penpal_emulated_chain::XcmConfig as PenpalRococoXcmConfig; +use crate::imports::*; fn relay_to_para_sender_assertions(t: RelayToParaTest) { type RuntimeEvent = ::RuntimeEvent; + Rococo::assert_xcm_pallet_attempted_complete(Some(Weight::from_parts(864_610_000, 8_799))); + assert_expected_events!( Rococo, vec![ @@ -38,12 +37,32 @@ fn relay_to_para_sender_assertions(t: RelayToParaTest) { ); } +fn para_to_relay_sender_assertions(t: ParaToRelayTest) { + type RuntimeEvent = ::RuntimeEvent; + PenpalA::assert_xcm_pallet_attempted_complete(Some(Weight::from_parts(864_610_000, 8_799))); + assert_expected_events!( + PenpalA, + vec![ + // Amount to reserve transfer is transferred to Parachain's Sovereign account + RuntimeEvent::ForeignAssets( + pallet_assets::Event::Burned { asset_id, owner, balance, .. } + ) => { + asset_id: *asset_id == v3::Location::try_from(RelayLocation::get()).expect("conversion works"), + owner: *owner == t.sender.account_id, + balance: *balance == t.args.amount, + }, + ] + ); +} + fn system_para_to_para_sender_assertions(t: SystemParaToParaTest) { type RuntimeEvent = ::RuntimeEvent; + AssetHubRococo::assert_xcm_pallet_attempted_complete(Some(Weight::from_parts( 864_610_000, 8_799, ))); + assert_expected_events!( AssetHubRococo, vec![ @@ -57,19 +76,29 @@ fn system_para_to_para_sender_assertions(t: SystemParaToParaTest) { ), amount: *amount == t.args.amount, }, + // Transport fees are paid + RuntimeEvent::PolkadotXcm( + pallet_xcm::Event::FeesPaid { .. } + ) => {}, ] ); + AssetHubRococo::assert_xcm_pallet_sent(); } -fn para_receiver_assertions(_: Test) { +fn system_para_to_para_receiver_assertions(t: SystemParaToParaTest) { type RuntimeEvent = ::RuntimeEvent; + let system_para_native_asset_location = + v3::Location::try_from(RelayLocation::get()).expect("conversion works"); + + PenpalA::assert_xcmp_queue_success(None); + assert_expected_events!( PenpalA, vec![ - RuntimeEvent::Balances(pallet_balances::Event::Deposit { .. }) => {}, - RuntimeEvent::MessageQueue( - pallet_message_queue::Event::Processed { success: true, .. } - ) => {}, + RuntimeEvent::ForeignAssets(pallet_assets::Event::Issued { asset_id, owner, .. }) => { + asset_id: *asset_id == system_para_native_asset_location, + owner: *owner == t.receiver.account_id, + }, ] ); } @@ -81,12 +110,42 @@ fn para_to_system_para_sender_assertions(t: ParaToSystemParaTest) { PenpalA, vec![ // Amount to reserve transfer is transferred to Parachain's Sovereign account + RuntimeEvent::ForeignAssets( + pallet_assets::Event::Burned { asset_id, owner, balance, .. } + ) => { + asset_id: *asset_id == v3::Location::try_from(RelayLocation::get()).expect("conversion works"), + owner: *owner == t.sender.account_id, + balance: *balance == t.args.amount, + }, + ] + ); +} + +fn para_to_relay_receiver_assertions(t: ParaToRelayTest) { + type RuntimeEvent = ::RuntimeEvent; + let sov_penpal_on_relay = + Rococo::sovereign_account_id_of(Rococo::child_location_of(PenpalA::para_id())); + + Rococo::assert_ump_queue_processed( + true, + Some(PenpalA::para_id()), + Some(Weight::from_parts(306305000, 7_186)), + ); + + assert_expected_events!( + Rococo, + vec![ + // Amount to reserve transfer is withdrawn from Parachain's Sovereign account RuntimeEvent::Balances( - pallet_balances::Event::Withdraw { who, amount } + pallet_balances::Event::Burned { who, amount } ) => { - who: *who == t.sender.account_id, + who: *who == sov_penpal_on_relay.clone().into(), amount: *amount == t.args.amount, }, + RuntimeEvent::Balances(pallet_balances::Event::Minted { .. }) => {}, + RuntimeEvent::MessageQueue( + pallet_message_queue::Event::Processed { success: true, .. } + ) => {}, ] ); } @@ -96,17 +155,20 @@ fn para_to_system_para_receiver_assertions(t: ParaToSystemParaTest) { let sov_penpal_on_ahr = AssetHubRococo::sovereign_account_id_of( AssetHubRococo::sibling_location_of(PenpalA::para_id()), ); + + AssetHubRococo::assert_xcmp_queue_success(None); + assert_expected_events!( AssetHubRococo, vec![ // Amount to reserve transfer is withdrawn from Parachain's Sovereign account RuntimeEvent::Balances( - pallet_balances::Event::Withdraw { who, amount } + pallet_balances::Event::Burned { who, amount } ) => { who: *who == sov_penpal_on_ahr.clone().into(), amount: *amount == t.args.amount, }, - RuntimeEvent::Balances(pallet_balances::Event::Deposit { .. }) => {}, + RuntimeEvent::Balances(pallet_balances::Event::Minted { .. }) => {}, RuntimeEvent::MessageQueue( pallet_message_queue::Event::Processed { success: true, .. } ) => {}, @@ -127,24 +189,124 @@ fn system_para_to_para_assets_sender_assertions(t: SystemParaToParaTest) { RuntimeEvent::Assets( pallet_assets::Event::Transferred { asset_id, from, to, amount } ) => { - asset_id: *asset_id == ASSET_ID, + asset_id: *asset_id == RESERVABLE_ASSET_ID, from: *from == t.sender.account_id, to: *to == AssetHubRococo::sovereign_account_id_of( t.args.dest.clone() ), amount: *amount == t.args.amount, }, + // Native asset to pay for fees is transferred to Parachain's Sovereign account + RuntimeEvent::Balances(pallet_balances::Event::Minted { who, .. }) => { + who: *who == AssetHubRococo::sovereign_account_id_of( + t.args.dest.clone() + ), + }, + // Transport fees are paid + RuntimeEvent::PolkadotXcm( + pallet_xcm::Event::FeesPaid { .. } + ) => {}, + ] + ); +} + +fn para_to_system_para_assets_sender_assertions(t: ParaToSystemParaTest) { + type RuntimeEvent = ::RuntimeEvent; + let system_para_native_asset_location = + v3::Location::try_from(RelayLocation::get()).expect("conversion works"); + let reservable_asset_location = + v3::Location::try_from(PenpalLocalReservableFromAssetHub::get()).expect("conversion works"); + PenpalA::assert_xcm_pallet_attempted_complete(Some(Weight::from_parts(864_610_000, 8799))); + assert_expected_events!( + PenpalA, + vec![ + // Fees amount to reserve transfer is burned from Parachains's sender account + RuntimeEvent::ForeignAssets( + pallet_assets::Event::Burned { asset_id, owner, .. } + ) => { + asset_id: *asset_id == system_para_native_asset_location, + owner: *owner == t.sender.account_id, + }, + // Amount to reserve transfer is burned from Parachains's sender account + RuntimeEvent::ForeignAssets( + pallet_assets::Event::Burned { asset_id, owner, balance } + ) => { + asset_id: *asset_id == reservable_asset_location, + owner: *owner == t.sender.account_id, + balance: *balance == t.args.amount, + }, + // Transport fees are paid + RuntimeEvent::PolkadotXcm( + pallet_xcm::Event::FeesPaid { .. } + ) => {}, + ] + ); +} + +fn system_para_to_para_assets_receiver_assertions(t: SystemParaToParaTest) { + type RuntimeEvent = ::RuntimeEvent; + let system_para_asset_location = + v3::Location::try_from(PenpalLocalReservableFromAssetHub::get()).expect("conversion works"); + PenpalA::assert_xcmp_queue_success(None); + assert_expected_events!( + PenpalA, + vec![ + RuntimeEvent::ForeignAssets(pallet_assets::Event::Issued { asset_id, owner, .. }) => { + asset_id: *asset_id == v3::Location::try_from(RelayLocation::get()).expect("conversion works"), + owner: *owner == t.receiver.account_id, + }, + RuntimeEvent::ForeignAssets(pallet_assets::Event::Issued { asset_id, owner, amount }) => { + asset_id: *asset_id == system_para_asset_location, + owner: *owner == t.receiver.account_id, + amount: *amount == t.args.amount, + }, + ] + ); +} + +fn para_to_system_para_assets_receiver_assertions(t: ParaToSystemParaTest) { + type RuntimeEvent = ::RuntimeEvent; + let sov_penpal_on_ahr = AssetHubRococo::sovereign_account_id_of( + AssetHubRococo::sibling_location_of(PenpalA::para_id()), + ); + AssetHubRococo::assert_xcmp_queue_success(None); + assert_expected_events!( + AssetHubRococo, + vec![ + // Amount to reserve transfer is burned from Parachain's Sovereign account + RuntimeEvent::Assets(pallet_assets::Event::Burned { asset_id, owner, balance }) => { + asset_id: *asset_id == RESERVABLE_ASSET_ID, + owner: *owner == sov_penpal_on_ahr, + balance: *balance == t.args.amount, + }, + // Fee amount is burned from Parachain's Sovereign account + RuntimeEvent::Balances(pallet_balances::Event::Burned { who, .. }) => { + who: *who == sov_penpal_on_ahr, + }, + // Amount to reserve transfer is issued for beneficiary + RuntimeEvent::Assets(pallet_assets::Event::Issued { asset_id, owner, amount }) => { + asset_id: *asset_id == RESERVABLE_ASSET_ID, + owner: *owner == t.receiver.account_id, + amount: *amount == t.args.amount, + }, + // Remaining fee amount is minted for for beneficiary + RuntimeEvent::Balances(pallet_balances::Event::Minted { who, .. }) => { + who: *who == t.receiver.account_id, + }, ] ); } -fn system_para_to_para_assets_receiver_assertions(_: Test) { +fn relay_to_para_assets_receiver_assertions(t: RelayToParaTest) { type RuntimeEvent = ::RuntimeEvent; + assert_expected_events!( PenpalA, vec![ - RuntimeEvent::Balances(pallet_balances::Event::Deposit { .. }) => {}, - RuntimeEvent::Assets(pallet_assets::Event::Issued { .. }) => {}, + RuntimeEvent::ForeignAssets(pallet_assets::Event::Issued { asset_id, owner, .. }) => { + asset_id: *asset_id == v3::Location::try_from(RelayLocation::get()).expect("conversion works"), + owner: *owner == t.receiver.account_id, + }, RuntimeEvent::MessageQueue( pallet_message_queue::Event::Processed { success: true, .. } ) => {}, @@ -152,46 +314,51 @@ fn system_para_to_para_assets_receiver_assertions(_: Test) { ); } -fn para_to_para_sender_assertions(t: ParaToParaTest) { +fn para_to_para_through_relay_sender_assertions(t: ParaToParaThroughRelayTest) { type RuntimeEvent = ::RuntimeEvent; + + let relay_asset_location = + v3::Location::try_from(RelayLocation::get()).expect("conversion works"); + PenpalA::assert_xcm_pallet_attempted_complete(None); + // XCM sent to relay reserve + PenpalA::assert_parachain_system_ump_sent(); + assert_expected_events!( PenpalA, vec![ // Amount to reserve transfer is transferred to Parachain's Sovereign account - RuntimeEvent::Balances( - pallet_balances::Event::Withdraw { who, amount } + RuntimeEvent::ForeignAssets( + pallet_assets::Event::Burned { asset_id, owner, balance }, ) => { - who: *who == t.sender.account_id, - amount: *amount == t.args.amount, + asset_id: *asset_id == relay_asset_location, + owner: *owner == t.sender.account_id, + balance: *balance == t.args.amount, }, - // XCM sent to relay reserve - RuntimeEvent::ParachainSystem( - cumulus_pallet_parachain_system::Event::UpwardMessageSent { .. } - ) => {}, ] ); } -fn para_to_para_relay_hop_assertions(t: ParaToParaTest) { +fn para_to_para_relay_hop_assertions(t: ParaToParaThroughRelayTest) { type RuntimeEvent = ::RuntimeEvent; let sov_penpal_a_on_rococo = Rococo::sovereign_account_id_of(Rococo::child_location_of(PenpalA::para_id())); let sov_penpal_b_on_rococo = Rococo::sovereign_account_id_of(Rococo::child_location_of(PenpalB::para_id())); + assert_expected_events!( Rococo, vec![ // Withdrawn from sender parachain SA RuntimeEvent::Balances( - pallet_balances::Event::Withdraw { who, amount } + pallet_balances::Event::Burned { who, amount } ) => { who: *who == sov_penpal_a_on_rococo, amount: *amount == t.args.amount, }, // Deposited to receiver parachain SA RuntimeEvent::Balances( - pallet_balances::Event::Deposit { who, .. } + pallet_balances::Event::Minted { who, .. } ) => { who: *who == sov_penpal_b_on_rococo, }, @@ -202,15 +369,20 @@ fn para_to_para_relay_hop_assertions(t: ParaToParaTest) { ); } -fn para_to_para_receiver_assertions(_: ParaToParaTest) { +fn para_to_para_through_relay_receiver_assertions(t: ParaToParaThroughRelayTest) { type RuntimeEvent = ::RuntimeEvent; + let relay_asset_location = + v3::Location::try_from(RelayLocation::get()).expect("conversion works"); + + PenpalB::assert_xcmp_queue_success(None); + assert_expected_events!( PenpalB, vec![ - RuntimeEvent::Balances(pallet_balances::Event::Deposit { .. }) => {}, - RuntimeEvent::MessageQueue( - pallet_message_queue::Event::Processed { success: true, .. } - ) => {}, + RuntimeEvent::ForeignAssets(pallet_assets::Event::Issued { asset_id, owner, .. }) => { + asset_id: *asset_id == relay_asset_location, + owner: *owner == t.receiver.account_id, + }, ] ); } @@ -226,6 +398,17 @@ fn relay_to_para_reserve_transfer_assets(t: RelayToParaTest) -> DispatchResult { ) } +fn para_to_relay_reserve_transfer_assets(t: ParaToRelayTest) -> DispatchResult { + ::PolkadotXcm::limited_reserve_transfer_assets( + t.signed_origin, + bx!(t.args.dest.into()), + bx!(t.args.beneficiary.into()), + bx!(t.args.assets.into()), + t.args.fee_asset_item, + t.args.weight_limit, + ) +} + fn system_para_to_para_reserve_transfer_assets(t: SystemParaToParaTest) -> DispatchResult { ::PolkadotXcm::limited_reserve_transfer_assets( t.signed_origin, @@ -248,7 +431,9 @@ fn para_to_system_para_reserve_transfer_assets(t: ParaToSystemParaTest) -> Dispa ) } -fn para_to_para_limited_reserve_transfer_assets(t: ParaToParaTest) -> DispatchResult { +fn para_to_para_through_relay_limited_reserve_transfer_assets( + t: ParaToParaThroughRelayTest, +) -> DispatchResult { ::PolkadotXcm::limited_reserve_transfer_assets( t.signed_origin, bx!(t.args.dest.into()), @@ -262,6 +447,7 @@ fn para_to_para_limited_reserve_transfer_assets(t: ParaToParaTest) -> DispatchRe /// Reserve Transfers of native asset from Relay Chain to the System Parachain shouldn't work #[test] fn reserve_transfer_native_asset_from_relay_to_system_para_fails() { + // Init values for Relay Chain let signed_origin = ::RuntimeOrigin::signed(RococoSender::get().into()); let destination = Rococo::child_location_of(AssetHubRococo::para_id()); let beneficiary: Location = @@ -328,135 +514,260 @@ fn reserve_transfer_native_asset_from_system_para_to_relay_fails() { }); } +// ========================================================================= +// ========= Reserve Transfers - Native Asset - Relay<>Parachain =========== +// ========================================================================= /// Reserve Transfers of native asset from Relay to Parachain should work #[test] fn reserve_transfer_native_asset_from_relay_to_para() { // Init values for Relay let destination = Rococo::child_location_of(PenpalA::para_id()); - let beneficiary_id = PenpalAReceiver::get(); + let sender = RococoSender::get(); let amount_to_send: Balance = ROCOCO_ED * 1000; + // Init values fot Parachain + let relay_native_asset_location = + v3::Location::try_from(RelayLocation::get()).expect("conversion works"); + let receiver = PenpalAReceiver::get(); + + // Init Test let test_args = TestContext { - sender: RococoSender::get(), - receiver: PenpalAReceiver::get(), - args: TestArgs::new_relay(destination, beneficiary_id, amount_to_send), + sender, + receiver: receiver.clone(), + args: TestArgs::new_relay(destination.clone(), receiver.clone(), amount_to_send), }; - let mut test = RelayToParaTest::new(test_args); + // Query initial balances let sender_balance_before = test.sender.balance; - let receiver_balance_before = test.receiver.balance; + let receiver_assets_before = PenpalA::execute_with(|| { + type ForeignAssets = ::ForeignAssets; + >::balance(relay_native_asset_location.into(), &receiver) + }); + // Set assertions and dispatchables test.set_assertion::(relay_to_para_sender_assertions); - test.set_assertion::(para_receiver_assertions); + test.set_assertion::(relay_to_para_assets_receiver_assertions); test.set_dispatchable::(relay_to_para_reserve_transfer_assets); test.assert(); - let delivery_fees = Rococo::execute_with(|| { - xcm_helpers::transfer_assets_delivery_fees::< - ::XcmSender, - >(test.args.assets.clone(), 0, test.args.weight_limit, test.args.beneficiary, test.args.dest) + // Query final balances + let sender_balance_after = test.sender.balance; + let receiver_assets_after = PenpalA::execute_with(|| { + type ForeignAssets = ::ForeignAssets; + >::balance(relay_native_asset_location.into(), &receiver) }); - let sender_balance_after = test.sender.balance; + // Sender's balance is reduced by amount sent plus delivery fees + assert!(sender_balance_after < sender_balance_before - amount_to_send); + // Receiver's asset balance is increased + assert!(receiver_assets_after > receiver_assets_before); + // Receiver's asset balance increased by `amount_to_send - delivery_fees - bought_execution`; + // `delivery_fees` might be paid from transfer or JIT, also `bought_execution` is unknown but + // should be non-zero + assert!(receiver_assets_after < receiver_assets_before + amount_to_send); +} + +/// Reserve Transfers of native asset from Parachain to Relay should work +#[test] +fn reserve_transfer_native_asset_from_para_to_relay() { + // Init values for Parachain + let destination = PenpalA::parent_location(); + let sender = PenpalASender::get(); + let amount_to_send: Balance = ROCOCO_ED * 1000; + let assets: Assets = (Parent, amount_to_send).into(); + let asset_owner = PenpalAssetOwner::get(); + let relay_native_asset_location = + v3::Location::try_from(RelayLocation::get()).expect("conversion works"); + + // fund Parachain's sender account + PenpalA::mint_foreign_asset( + ::RuntimeOrigin::signed(asset_owner), + relay_native_asset_location, + sender.clone(), + amount_to_send * 2, + ); + + // Init values for Relay + let receiver = RococoReceiver::get(); + let penpal_location_as_seen_by_relay = Rococo::child_location_of(PenpalA::para_id()); + let sov_penpal_on_relay = Rococo::sovereign_account_id_of(penpal_location_as_seen_by_relay); + + // fund Parachain's SA on Relay with the native tokens held in reserve + Rococo::fund_accounts(vec![(sov_penpal_on_relay.into(), amount_to_send * 2)]); + + // Init Test + let test_args = TestContext { + sender: sender.clone(), + receiver: receiver.clone(), + args: TestArgs::new_para( + destination.clone(), + receiver, + amount_to_send, + assets.clone(), + None, + 0, + ), + }; + let mut test = ParaToRelayTest::new(test_args); + + // Query initial balances + let sender_assets_before = PenpalA::execute_with(|| { + type ForeignAssets = ::ForeignAssets; + >::balance(relay_native_asset_location.into(), &sender) + }); + let receiver_balance_before = test.receiver.balance; + + // Set assertions and dispatchables + test.set_assertion::(para_to_relay_sender_assertions); + test.set_assertion::(para_to_relay_receiver_assertions); + test.set_dispatchable::(para_to_relay_reserve_transfer_assets); + test.assert(); + + // Query final balances + let sender_assets_after = PenpalA::execute_with(|| { + type ForeignAssets = ::ForeignAssets; + >::balance(relay_native_asset_location.into(), &sender) + }); let receiver_balance_after = test.receiver.balance; - // Sender's balance is reduced - assert_eq!(sender_balance_before - amount_to_send - delivery_fees, sender_balance_after); - // Receiver's balance is increased + // Sender's balance is reduced by amount sent plus delivery fees + assert!(sender_assets_after < sender_assets_before - amount_to_send); + // Receiver's asset balance is increased assert!(receiver_balance_after > receiver_balance_before); - // Receiver's balance increased by `amount_to_send - delivery_fees - bought_execution`; + // Receiver's asset balance increased by `amount_to_send - delivery_fees - bought_execution`; // `delivery_fees` might be paid from transfer or JIT, also `bought_execution` is unknown but // should be non-zero assert!(receiver_balance_after < receiver_balance_before + amount_to_send); } +// ========================================================================= +// ======= Reserve Transfers - Native Asset - AssetHub<>Parachain ========== +// ========================================================================= /// Reserve Transfers of native asset from System Parachain to Parachain should work #[test] fn reserve_transfer_native_asset_from_system_para_to_para() { // Init values for System Parachain let destination = AssetHubRococo::sibling_location_of(PenpalA::para_id()); - let beneficiary_id = PenpalAReceiver::get(); - let amount_to_send: Balance = ASSET_HUB_ROCOCO_ED * 1000; - let assets = (Parent, amount_to_send).into(); + let sender = AssetHubRococoSender::get(); + let amount_to_send: Balance = ASSET_HUB_ROCOCO_ED * 10000; + let assets: Assets = (Parent, amount_to_send).into(); + // Init values for Parachain + let system_para_native_asset_location = + v3::Location::try_from(RelayLocation::get()).expect("conversion works"); + let receiver = PenpalAReceiver::get(); + + // Init Test let test_args = TestContext { - sender: AssetHubRococoSender::get(), - receiver: PenpalAReceiver::get(), - args: TestArgs::new_para(destination, beneficiary_id, amount_to_send, assets, None, 0), + sender, + receiver: receiver.clone(), + args: TestArgs::new_para( + destination.clone(), + receiver.clone(), + amount_to_send, + assets.clone(), + None, + 0, + ), }; - let mut test = SystemParaToParaTest::new(test_args); + // Query initial balances let sender_balance_before = test.sender.balance; - let receiver_balance_before = test.receiver.balance; + let receiver_assets_before = PenpalA::execute_with(|| { + type ForeignAssets = ::ForeignAssets; + >::balance(system_para_native_asset_location.into(), &receiver) + }); + // Set assertions and dispatchables test.set_assertion::(system_para_to_para_sender_assertions); - test.set_assertion::(para_receiver_assertions); + test.set_assertion::(system_para_to_para_receiver_assertions); test.set_dispatchable::(system_para_to_para_reserve_transfer_assets); test.assert(); + // Query final balances let sender_balance_after = test.sender.balance; - let receiver_balance_after = test.receiver.balance; - - let delivery_fees = AssetHubRococo::execute_with(|| { - xcm_helpers::transfer_assets_delivery_fees::< - ::XcmSender, - >(test.args.assets.clone(), 0, test.args.weight_limit, test.args.beneficiary, test.args.dest) + let receiver_assets_after = PenpalA::execute_with(|| { + type ForeignAssets = ::ForeignAssets; + >::balance(system_para_native_asset_location, &receiver) }); - // Sender's balance is reduced - assert_eq!(sender_balance_before - amount_to_send - delivery_fees, sender_balance_after); - // Receiver's balance is increased - assert!(receiver_balance_after > receiver_balance_before); - // Receiver's balance increased by `amount_to_send - delivery_fees - bought_execution`; + // Sender's balance is reduced by amount sent plus delivery fees + assert!(sender_balance_after < sender_balance_before - amount_to_send); + // Receiver's assets is increased + assert!(receiver_assets_after > receiver_assets_before); + // Receiver's assets increased by `amount_to_send - delivery_fees - bought_execution`; // `delivery_fees` might be paid from transfer or JIT, also `bought_execution` is unknown but // should be non-zero - assert!(receiver_balance_after < receiver_balance_before + amount_to_send); + assert!(receiver_assets_after < receiver_assets_before + amount_to_send); } /// Reserve Transfers of native asset from Parachain to System Parachain should work #[test] fn reserve_transfer_native_asset_from_para_to_system_para() { - // Init values for Penpal Parachain + // Init values for Parachain let destination = PenpalA::sibling_location_of(AssetHubRococo::para_id()); - let beneficiary_id = AssetHubRococoReceiver::get(); - let amount_to_send: Balance = ASSET_HUB_ROCOCO_ED * 1000; - let assets = (Parent, amount_to_send).into(); + let sender = PenpalASender::get(); + let amount_to_send: Balance = ASSET_HUB_ROCOCO_ED * 10000; + let assets: Assets = (Parent, amount_to_send).into(); + let system_para_native_asset_location = + v3::Location::try_from(RelayLocation::get()).expect("conversion works"); + let asset_owner = PenpalAssetOwner::get(); + + // fund Parachain's sender account + PenpalA::mint_foreign_asset( + ::RuntimeOrigin::signed(asset_owner), + system_para_native_asset_location, + sender.clone(), + amount_to_send * 2, + ); + + // Init values for System Parachain + let receiver = AssetHubRococoReceiver::get(); + let penpal_location_as_seen_by_ahr = AssetHubRococo::sibling_location_of(PenpalA::para_id()); + let sov_penpal_on_ahr = AssetHubRococo::sovereign_account_id_of(penpal_location_as_seen_by_ahr); + // fund Parachain's SA on System Parachain with the native tokens held in reserve + AssetHubRococo::fund_accounts(vec![(sov_penpal_on_ahr.into(), amount_to_send * 2)]); + + // Init Test let test_args = TestContext { - sender: PenpalASender::get(), - receiver: AssetHubRococoReceiver::get(), - args: TestArgs::new_para(destination, beneficiary_id, amount_to_send, assets, None, 0), + sender: sender.clone(), + receiver: receiver.clone(), + args: TestArgs::new_para( + destination.clone(), + receiver.clone(), + amount_to_send, + assets.clone(), + None, + 0, + ), }; - let mut test = ParaToSystemParaTest::new(test_args); - let sender_balance_before = test.sender.balance; + // Query initial balances + let sender_assets_before = PenpalA::execute_with(|| { + type ForeignAssets = ::ForeignAssets; + >::balance(system_para_native_asset_location, &sender) + }); let receiver_balance_before = test.receiver.balance; - let penpal_location_as_seen_by_ahr = AssetHubRococo::sibling_location_of(PenpalA::para_id()); - let sov_penpal_on_ahr = AssetHubRococo::sovereign_account_id_of(penpal_location_as_seen_by_ahr); - - // fund the Penpal's SA on AHR with the native tokens held in reserve - AssetHubRococo::fund_accounts(vec![(sov_penpal_on_ahr.into(), amount_to_send * 2)]); - + // Set assertions and dispatchables test.set_assertion::(para_to_system_para_sender_assertions); test.set_assertion::(para_to_system_para_receiver_assertions); test.set_dispatchable::(para_to_system_para_reserve_transfer_assets); test.assert(); - let sender_balance_after = test.sender.balance; - let receiver_balance_after = test.receiver.balance; - - let delivery_fees = PenpalA::execute_with(|| { - xcm_helpers::transfer_assets_delivery_fees::< - ::XcmSender, - >(test.args.assets.clone(), 0, test.args.weight_limit, test.args.beneficiary, test.args.dest) + // Query final balances + let sender_assets_after = PenpalA::execute_with(|| { + type ForeignAssets = ::ForeignAssets; + >::balance(system_para_native_asset_location, &sender) }); + let receiver_balance_after = test.receiver.balance; - // Sender's balance is reduced - assert_eq!(sender_balance_before - amount_to_send - delivery_fees, sender_balance_after); + // Sender's balance is reduced by amount sent plus delivery fees + assert!(sender_assets_after < sender_assets_before - amount_to_send); // Receiver's balance is increased assert!(receiver_balance_after > receiver_balance_before); // Receiver's balance increased by `amount_to_send - delivery_fees - bought_execution`; @@ -465,36 +776,27 @@ fn reserve_transfer_native_asset_from_para_to_system_para() { assert!(receiver_balance_after < receiver_balance_before + amount_to_send); } +// ========================================================================= +// ======= Reserve Transfers - Non-system Asset - AssetHub<>Parachain ====== +// ========================================================================= /// Reserve Transfers of a local asset and native asset from System Parachain to Parachain should /// work #[test] fn reserve_transfer_assets_from_system_para_to_para() { - // Force create asset on AssetHubRococo and PenpalA from Relay Chain - AssetHubRococo::force_create_and_mint_asset( - ASSET_ID, - ASSET_MIN_BALANCE, - false, - AssetHubRococoSender::get(), - Some(Weight::from_parts(1_019_445_000, 200_000)), - ASSET_MIN_BALANCE * 1_000_000, - ); - PenpalA::force_create_and_mint_asset( - ASSET_ID, - ASSET_MIN_BALANCE, - false, - PenpalASender::get(), - None, - 0, - ); - // Init values for System Parachain let destination = AssetHubRococo::sibling_location_of(PenpalA::para_id()); - let beneficiary_id = PenpalAReceiver::get(); - let fee_amount_to_send = ASSET_HUB_ROCOCO_ED * 1000; - let asset_amount_to_send = ASSET_MIN_BALANCE * 1000; + let sov_penpal_on_ahr = AssetHubRococo::sovereign_account_id_of(destination.clone()); + let sender = AssetHubRococoSender::get(); + let fee_amount_to_send = ASSET_HUB_ROCOCO_ED * 10000; + let asset_amount_to_send = PENPAL_ED * 10000; + let asset_owner = AssetHubRococoAssetOwner::get(); + let asset_owner_signer = ::RuntimeOrigin::signed(asset_owner.clone()); let assets: Assets = vec![ (Parent, fee_amount_to_send).into(), - ([PalletInstance(ASSETS_PALLET_ID), GeneralIndex(ASSET_ID.into())], asset_amount_to_send) + ( + [PalletInstance(ASSETS_PALLET_ID), GeneralIndex(RESERVABLE_ASSET_ID.into())], + asset_amount_to_send, + ) .into(), ] .into(); @@ -503,49 +805,211 @@ fn reserve_transfer_assets_from_system_para_to_para() { .iter() .position(|r| r == &(Parent, fee_amount_to_send).into()) .unwrap() as u32; + AssetHubRococo::mint_asset( + asset_owner_signer, + RESERVABLE_ASSET_ID, + asset_owner, + asset_amount_to_send * 2, + ); + // Create SA-of-Penpal-on-AHR with ED. + AssetHubRococo::fund_accounts(vec![(sov_penpal_on_ahr.into(), ASSET_HUB_ROCOCO_ED)]); + + // Init values for Parachain + let receiver = PenpalAReceiver::get(); + let system_para_native_asset_location = + v3::Location::try_from(RelayLocation::get()).expect("conversion works"); + let system_para_foreign_asset_location = + v3::Location::try_from(PenpalLocalReservableFromAssetHub::get()).expect("conversion works"); + + // Init Test let para_test_args = TestContext { - sender: AssetHubRococoSender::get(), - receiver: PenpalAReceiver::get(), + sender: sender.clone(), + receiver: receiver.clone(), args: TestArgs::new_para( destination, - beneficiary_id, + receiver.clone(), asset_amount_to_send, assets, None, fee_asset_index, ), }; - let mut test = SystemParaToParaTest::new(para_test_args); - // Create SA-of-Penpal-on-AHR with ED. - let penpal_location = AssetHubRococo::sibling_location_of(PenpalA::para_id()); - let sov_penpal_on_ahr = AssetHubRococo::sovereign_account_id_of(penpal_location); - AssetHubRococo::fund_accounts(vec![(sov_penpal_on_ahr.into(), ROCOCO_ED)]); - + // Query initial balances let sender_balance_before = test.sender.balance; - let receiver_balance_before = test.receiver.balance; - let sender_assets_before = AssetHubRococo::execute_with(|| { type Assets = ::Assets; - >::balance(ASSET_ID, &AssetHubRococoSender::get()) + >::balance(RESERVABLE_ASSET_ID, &sender) }); - let receiver_assets_before = PenpalA::execute_with(|| { - type Assets = ::Assets; - >::balance(ASSET_ID, &PenpalAReceiver::get()) + let receiver_system_native_assets_before = PenpalA::execute_with(|| { + type ForeignAssets = ::ForeignAssets; + >::balance(system_para_native_asset_location, &receiver) + }); + let receiver_foreign_assets_before = PenpalA::execute_with(|| { + type ForeignAssets = ::ForeignAssets; + >::balance(system_para_foreign_asset_location, &receiver) }); + // Set assertions and dispatchables test.set_assertion::(system_para_to_para_assets_sender_assertions); test.set_assertion::(system_para_to_para_assets_receiver_assertions); test.set_dispatchable::(system_para_to_para_reserve_transfer_assets); test.assert(); + // Query final balances let sender_balance_after = test.sender.balance; - let receiver_balance_after = test.receiver.balance; - + let sender_assets_after = AssetHubRococo::execute_with(|| { + type Assets = ::Assets; + >::balance(RESERVABLE_ASSET_ID, &sender) + }); + let receiver_system_native_assets_after = PenpalA::execute_with(|| { + type ForeignAssets = ::ForeignAssets; + >::balance(system_para_native_asset_location, &receiver) + }); + let receiver_foreign_assets_after = PenpalA::execute_with(|| { + type ForeignAssets = ::ForeignAssets; + >::balance(system_para_foreign_asset_location, &receiver) + }); // Sender's balance is reduced assert!(sender_balance_after < sender_balance_before); + // Receiver's foreign asset balance is increased + assert!(receiver_foreign_assets_after > receiver_foreign_assets_before); + // Receiver's system asset balance increased by `amount_to_send - delivery_fees - + // bought_execution`; `delivery_fees` might be paid from transfer or JIT, also + // `bought_execution` is unknown but should be non-zero + assert!( + receiver_system_native_assets_after < + receiver_system_native_assets_before + fee_amount_to_send + ); + + // Sender's asset balance is reduced by exact amount + assert_eq!(sender_assets_before - asset_amount_to_send, sender_assets_after); + // Receiver's foreign asset balance is increased by exact amount + assert_eq!( + receiver_foreign_assets_after, + receiver_foreign_assets_before + asset_amount_to_send + ); +} + +/// Reserve Transfers of a foreign asset and native asset from Parachain to System Para should +/// work +#[test] +fn reserve_transfer_assets_from_para_to_system_para() { + // Init values for Parachain + let destination = PenpalA::sibling_location_of(AssetHubRococo::para_id()); + let sender = PenpalASender::get(); + let fee_amount_to_send = ASSET_HUB_ROCOCO_ED * 10000; + let asset_amount_to_send = ASSET_HUB_ROCOCO_ED * 10000; + let penpal_asset_owner = PenpalAssetOwner::get(); + let penpal_asset_owner_signer = ::RuntimeOrigin::signed(penpal_asset_owner); + let asset_location_on_penpal = + v3::Location::try_from(PenpalLocalReservableFromAssetHub::get()).expect("conversion works"); + let asset_location_on_penpal_latest: Location = asset_location_on_penpal.try_into().unwrap(); + let system_asset_location_on_penpal = + v3::Location::try_from(RelayLocation::get()).expect("conversion works"); + let assets: Assets = vec![ + (Parent, fee_amount_to_send).into(), + (asset_location_on_penpal_latest, asset_amount_to_send).into(), + ] + .into(); + let fee_asset_index = assets + .inner() + .iter() + .position(|r| r == &(Parent, fee_amount_to_send).into()) + .unwrap() as u32; + // Fund Parachain's sender account with some foreign assets + PenpalA::mint_foreign_asset( + penpal_asset_owner_signer.clone(), + asset_location_on_penpal, + sender.clone(), + asset_amount_to_send * 2, + ); + // Fund Parachain's sender account with some system assets + PenpalA::mint_foreign_asset( + penpal_asset_owner_signer, + system_asset_location_on_penpal, + sender.clone(), + fee_amount_to_send * 2, + ); + + // Init values for System Parachain + let receiver = AssetHubRococoReceiver::get(); + let penpal_location_as_seen_by_ahr = AssetHubRococo::sibling_location_of(PenpalA::para_id()); + let sov_penpal_on_ahr = AssetHubRococo::sovereign_account_id_of(penpal_location_as_seen_by_ahr); + let system_para_native_asset_location = + v3::Location::try_from(RelayLocation::get()).expect("conversion works"); + let system_para_foreign_asset_location = + v3::Location::try_from(PenpalLocalReservableFromAssetHub::get()).expect("conversion works"); + let ah_asset_owner = AssetHubRococoAssetOwner::get(); + let ah_asset_owner_signer = ::RuntimeOrigin::signed(ah_asset_owner); + + // Fund SA-of-Penpal-on-AHR to be able to pay for the fees. + AssetHubRococo::fund_accounts(vec![( + sov_penpal_on_ahr.clone().into(), + ASSET_HUB_ROCOCO_ED * 10000000, + )]); + // Fund SA-of-Penpal-on-AHR to be able to pay for the sent amount. + AssetHubRococo::mint_asset( + ah_asset_owner_signer, + RESERVABLE_ASSET_ID, + sov_penpal_on_ahr, + asset_amount_to_send * 2, + ); + + // Init Test + let para_test_args = TestContext { + sender: sender.clone(), + receiver: receiver.clone(), + args: TestArgs::new_para( + destination, + receiver.clone(), + asset_amount_to_send, + assets, + None, + fee_asset_index, + ), + }; + let mut test = ParaToSystemParaTest::new(para_test_args); + + // Query initial balances + let sender_system_assets_before = PenpalA::execute_with(|| { + type ForeignAssets = ::ForeignAssets; + >::balance(system_para_native_asset_location, &sender) + }); + let sender_foreign_assets_before = PenpalA::execute_with(|| { + type ForeignAssets = ::ForeignAssets; + >::balance(system_para_foreign_asset_location, &sender) + }); + let receiver_balance_before = test.receiver.balance; + let receiver_assets_before = AssetHubRococo::execute_with(|| { + type Assets = ::Assets; + >::balance(RESERVABLE_ASSET_ID, &receiver) + }); + + // Set assertions and dispatchables + test.set_assertion::(para_to_system_para_assets_sender_assertions); + test.set_assertion::(para_to_system_para_assets_receiver_assertions); + test.set_dispatchable::(para_to_system_para_reserve_transfer_assets); + test.assert(); + + // Query final balances + let sender_system_assets_after = PenpalA::execute_with(|| { + type ForeignAssets = ::ForeignAssets; + >::balance(system_para_native_asset_location, &sender) + }); + let sender_foreign_assets_after = PenpalA::execute_with(|| { + type ForeignAssets = ::ForeignAssets; + >::balance(system_para_foreign_asset_location, &sender) + }); + let receiver_balance_after = test.receiver.balance; + let receiver_assets_after = AssetHubRococo::execute_with(|| { + type Assets = ::Assets; + >::balance(RESERVABLE_ASSET_ID, &receiver) + }); + // Sender's system asset balance is reduced + assert!(sender_system_assets_after < sender_system_assets_before); // Receiver's balance is increased assert!(receiver_balance_after > receiver_balance_before); // Receiver's balance increased by `amount_to_send - delivery_fees - bought_execution`; @@ -553,65 +1017,81 @@ fn reserve_transfer_assets_from_system_para_to_para() { // should be non-zero assert!(receiver_balance_after < receiver_balance_before + fee_amount_to_send); - let sender_assets_after = AssetHubRococo::execute_with(|| { - type Assets = ::Assets; - >::balance(ASSET_ID, &AssetHubRococoSender::get()) - }); - let receiver_assets_after = PenpalA::execute_with(|| { - type Assets = ::Assets; - >::balance(ASSET_ID, &PenpalAReceiver::get()) - }); - - // Sender's balance is reduced by exact amount - assert_eq!(sender_assets_before - asset_amount_to_send, sender_assets_after); - // Receiver's balance is increased by exact amount + // Sender's asset balance is reduced by exact amount + assert_eq!(sender_foreign_assets_before - asset_amount_to_send, sender_foreign_assets_after); + // Receiver's foreign asset balance is increased by exact amount assert_eq!(receiver_assets_after, receiver_assets_before + asset_amount_to_send); } +// ========================================================================= +// ===== Reserve Transfers - Native Asset - Parachain<>Relay<>Parachain ==== +// ========================================================================= /// Reserve Transfers of native asset from Parachain to Parachain (through Relay reserve) should /// work #[test] -fn reserve_transfer_native_asset_from_para_to_para() { - // Init values for Penpal Parachain +fn reserve_transfer_native_asset_from_para_to_para_trough_relay() { + // Init values for Parachain Origin let destination = PenpalA::sibling_location_of(PenpalB::para_id()); - let beneficiary_id = PenpalBReceiver::get(); - let amount_to_send: Balance = ASSET_HUB_ROCOCO_ED * 10000; + let sender = PenpalASender::get(); + let amount_to_send: Balance = ROCOCO_ED * 10000; + let asset_owner = PenpalAssetOwner::get(); let assets = (Parent, amount_to_send).into(); + let relay_native_asset_location = + v3::Location::try_from(RelayLocation::get()).expect("conversion works"); + let sender_as_seen_by_relay = Rococo::child_location_of(PenpalA::para_id()); + let sov_of_sender_on_relay = Rococo::sovereign_account_id_of(sender_as_seen_by_relay); - let test_args = TestContext { - sender: PenpalASender::get(), - receiver: PenpalBReceiver::get(), - args: TestArgs::new_para(destination, beneficiary_id, amount_to_send, assets, None, 0), - }; + // fund Parachain's sender account + PenpalA::mint_foreign_asset( + ::RuntimeOrigin::signed(asset_owner), + relay_native_asset_location, + sender.clone(), + amount_to_send * 2, + ); - let mut test = ParaToParaTest::new(test_args); + // fund the Parachain Origin's SA on Relay Chain with the native tokens held in reserve + Rococo::fund_accounts(vec![(sov_of_sender_on_relay.into(), amount_to_send * 2)]); - let sender_balance_before = test.sender.balance; - let receiver_balance_before = test.receiver.balance; + // Init values for Parachain Destination + let receiver = PenpalBReceiver::get(); - let sender_as_seen_by_relay = Rococo::child_location_of(PenpalA::para_id()); - let sov_of_sender_on_relay = Rococo::sovereign_account_id_of(sender_as_seen_by_relay); + // Init Test + let test_args = TestContext { + sender: sender.clone(), + receiver: receiver.clone(), + args: TestArgs::new_para(destination, receiver.clone(), amount_to_send, assets, None, 0), + }; + let mut test = ParaToParaThroughRelayTest::new(test_args); - // fund the PenpalA's SA on Rococo with the native tokens held in reserve - Rococo::fund_accounts(vec![(sov_of_sender_on_relay.into(), amount_to_send * 2)]); + // Query initial balances + let sender_assets_before = PenpalA::execute_with(|| { + type ForeignAssets = ::ForeignAssets; + >::balance(relay_native_asset_location, &sender) + }); + let receiver_assets_before = PenpalB::execute_with(|| { + type ForeignAssets = ::ForeignAssets; + >::balance(relay_native_asset_location, &receiver) + }); - test.set_assertion::(para_to_para_sender_assertions); + // Set assertions and dispatchables + test.set_assertion::(para_to_para_through_relay_sender_assertions); test.set_assertion::(para_to_para_relay_hop_assertions); - test.set_assertion::(para_to_para_receiver_assertions); - test.set_dispatchable::(para_to_para_limited_reserve_transfer_assets); + test.set_assertion::(para_to_para_through_relay_receiver_assertions); + test.set_dispatchable::(para_to_para_through_relay_limited_reserve_transfer_assets); test.assert(); - let sender_balance_after = test.sender.balance; - let receiver_balance_after = test.receiver.balance; - - let delivery_fees = PenpalA::execute_with(|| { - xcm_helpers::transfer_assets_delivery_fees::< - ::XcmSender, - >(test.args.assets.clone(), 0, test.args.weight_limit, test.args.beneficiary, test.args.dest) + // Query final balances + let sender_assets_after = PenpalA::execute_with(|| { + type ForeignAssets = ::ForeignAssets; + >::balance(relay_native_asset_location, &sender) + }); + let receiver_assets_after = PenpalB::execute_with(|| { + type ForeignAssets = ::ForeignAssets; + >::balance(relay_native_asset_location, &receiver) }); - // Sender's balance is reduced - assert_eq!(sender_balance_before - amount_to_send - delivery_fees, sender_balance_after); + // Sender's balance is reduced by amount sent plus delivery fees + assert!(sender_assets_after < sender_assets_before - amount_to_send); // Receiver's balance is increased - assert!(receiver_balance_after > receiver_balance_before); + assert!(receiver_assets_after > receiver_assets_before); } diff --git a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/send.rs b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/send.rs index 3c9e76a34e36a9e136e1df1421e0e152af71107b..1d120f1dc4c7ed4f923514e0692f3a4beb48103a 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/send.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/send.rs @@ -13,7 +13,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -use crate::*; +use crate::imports::*; /// Relay Chain should be able to execute `Transact` instructions in System Parachain /// when `OriginKind::Superuser`. @@ -28,8 +28,95 @@ fn send_transact_as_superuser_from_relay_to_system_para_works() { ) } -/// Parachain should be able to send XCM paying its fee with sufficient asset -/// in the System Parachain +/// We tests two things here: +/// - Parachain should be able to send XCM paying its fee with system asset in the System Parachain +/// - Parachain should be able to create a new Foreign Asset in the System Parachain +#[test] +fn send_xcm_from_para_to_system_para_paying_fee_with_system_assets_works() { + let para_sovereign_account = AssetHubRococo::sovereign_account_id_of( + AssetHubRococo::sibling_location_of(PenpalA::para_id()), + ); + let asset_location_on_penpal = v3::Location::new( + 0, + [ + v3::Junction::PalletInstance(ASSETS_PALLET_ID), + v3::Junction::GeneralIndex(ASSET_ID.into()), + ], + ); + let foreign_asset_at_asset_hub = + v3::Location::new(1, [v3::Junction::Parachain(PenpalA::para_id().into())]) + .appended_with(asset_location_on_penpal) + .unwrap(); + + // Encoded `create_asset` call to be executed in AssetHub + let call = AssetHubRococo::create_foreign_asset_call( + foreign_asset_at_asset_hub, + ASSET_MIN_BALANCE, + para_sovereign_account.clone(), + ); + + let origin_kind = OriginKind::Xcm; + let fee_amount = ASSET_HUB_ROCOCO_ED * 1000000; + let system_asset = (Parent, fee_amount).into(); + + let root_origin = ::RuntimeOrigin::root(); + let system_para_destination = PenpalA::sibling_location_of(AssetHubRococo::para_id()).into(); + let xcm = xcm_transact_paid_execution( + call, + origin_kind, + system_asset, + para_sovereign_account.clone(), + ); + + // SA-of-Penpal-on-AHR needs to have balance to pay for fees and asset creation deposit + AssetHubRococo::fund_accounts(vec![( + para_sovereign_account.clone().into(), + ASSET_HUB_ROCOCO_ED * 10000000000, + )]); + + PenpalA::execute_with(|| { + assert_ok!(::PolkadotXcm::send_blob( + root_origin, + bx!(system_para_destination), + xcm.encode().try_into().unwrap(), + )); + + PenpalA::assert_xcm_pallet_sent(); + }); + + AssetHubRococo::execute_with(|| { + type RuntimeEvent = ::RuntimeEvent; + + AssetHubRococo::assert_xcmp_queue_success(Some(Weight::from_parts( + 15_594_564_000, + 562_893, + ))); + + assert_expected_events!( + AssetHubRococo, + vec![ + // Burned the fee + RuntimeEvent::Balances(pallet_balances::Event::Burned { who, amount }) => { + who: *who == para_sovereign_account, + amount: *amount == fee_amount, + }, + // Foreign Asset created + RuntimeEvent::ForeignAssets(pallet_assets::Event::Created { asset_id, creator, owner }) => { + asset_id: *asset_id == foreign_asset_at_asset_hub, + creator: *creator == para_sovereign_account.clone(), + owner: *owner == para_sovereign_account, + }, + ] + ); + + type ForeignAssets = ::ForeignAssets; + assert!(ForeignAssets::asset_exists(foreign_asset_at_asset_hub)); + }); +} + +/// We tests two things here: +/// - Parachain should be able to send XCM paying its fee with system assets in the System Parachain +/// - Parachain should be able to create a new Asset in the System Parachain #[test] fn send_xcm_from_para_to_system_para_paying_fee_with_assets_works() { let para_sovereign_account = AssetHubRococo::sovereign_account_id_of( @@ -46,34 +133,36 @@ fn send_xcm_from_para_to_system_para_paying_fee_with_assets_works() { ASSET_MIN_BALANCE * 1000000000, ); - // We just need a call that can pass the `SafeCallFilter` - // Call values are not relevant - let call = AssetHubRococo::force_create_asset_call( - ASSET_ID, - para_sovereign_account.clone(), - true, + // Just a different `asset_id`` that does not exist yet + let new_asset_id = ASSET_ID + 1; + + // Encoded `create_asset` call to be executed in AssetHub + let call = AssetHubRococo::create_asset_call( + new_asset_id, ASSET_MIN_BALANCE, + para_sovereign_account.clone(), ); let origin_kind = OriginKind::SovereignAccount; let fee_amount = ASSET_MIN_BALANCE * 1000000; - let native_asset = + let asset = ([PalletInstance(ASSETS_PALLET_ID), GeneralIndex(ASSET_ID.into())], fee_amount).into(); let root_origin = ::RuntimeOrigin::root(); let system_para_destination = PenpalA::sibling_location_of(AssetHubRococo::para_id()).into(); - let xcm = xcm_transact_paid_execution( - call, - origin_kind, - native_asset, - para_sovereign_account.clone(), - ); + let xcm = xcm_transact_paid_execution(call, origin_kind, asset, para_sovereign_account.clone()); + + // SA-of-Penpal-on-AHR needs to have balance to pay for asset creation deposit + AssetHubRococo::fund_accounts(vec![( + para_sovereign_account.clone().into(), + ASSET_HUB_ROCOCO_ED * 10000000000, + )]); PenpalA::execute_with(|| { - assert_ok!(::PolkadotXcm::send( + assert_ok!(::PolkadotXcm::send_blob( root_origin, bx!(system_para_destination), - bx!(xcm), + xcm.encode().try_into().unwrap(), )); PenpalA::assert_xcm_pallet_sent(); @@ -90,13 +179,17 @@ fn send_xcm_from_para_to_system_para_paying_fee_with_assets_works() { assert_expected_events!( AssetHubRococo, vec![ + // Burned the fee RuntimeEvent::Assets(pallet_assets::Event::Burned { asset_id, owner, balance }) => { asset_id: *asset_id == ASSET_ID, owner: *owner == para_sovereign_account, balance: *balance == fee_amount, }, - RuntimeEvent::Assets(pallet_assets::Event::Issued { asset_id, .. }) => { - asset_id: *asset_id == ASSET_ID, + // Asset created + RuntimeEvent::Assets(pallet_assets::Event::Created { asset_id, creator, owner }) => { + asset_id: *asset_id == new_asset_id, + creator: *creator == para_sovereign_account.clone(), + owner: *owner == para_sovereign_account, }, ] ); diff --git a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/set_xcm_versions.rs b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/set_xcm_versions.rs index 7d630d368051d76bc0915277c44b733d894970ba..5662a78ab67f555c4a0a331fda79cbf984526cc1 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/set_xcm_versions.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/set_xcm_versions.rs @@ -13,7 +13,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -use crate::*; +use crate::imports::*; #[test] fn relay_sets_system_para_xcm_supported_version() { diff --git a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/swap.rs b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/swap.rs index c6a10b252901c03636caf2a6c8291781c28a8b09..e13300b7c11426416f543c2ee026702277b695b1 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/swap.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/swap.rs @@ -13,9 +13,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -use crate::*; -use rococo_system_emulated_network::penpal_emulated_chain::LocalTeleportableToAssetHubV3 as PenpalLocalTeleportableToAssetHubV3; -use sp_runtime::ModuleError; +use crate::imports::*; #[test] fn swap_locally_on_chain_using_local_assets() { @@ -114,49 +112,39 @@ fn swap_locally_on_chain_using_local_assets() { #[test] fn swap_locally_on_chain_using_foreign_assets() { - let asset_native = Box::new(asset_hub_rococo_runtime::xcm_config::TokenLocationV3::get()); - let ah_as_seen_by_penpal = PenpalA::sibling_location_of(AssetHubRococo::para_id()); - let asset_location_on_penpal = PenpalLocalTeleportableToAssetHubV3::get(); - let asset_id_on_penpal = match asset_location_on_penpal.last() { - Some(v3::Junction::GeneralIndex(id)) => *id as u32, - _ => unreachable!(), - }; - let asset_owner_on_penpal = PenpalASender::get(); + let asset_native = + Box::new(v3::Location::try_from(RelayLocation::get()).expect("conversion works")); + let asset_location_on_penpal = + v3::Location::try_from(PenpalLocalTeleportableToAssetHub::get()).expect("conversion works"); let foreign_asset_at_asset_hub_rococo = v3::Location::new(1, [v3::Junction::Parachain(PenpalA::para_id().into())]) .appended_with(asset_location_on_penpal) .unwrap(); - // 1. Create asset on penpal and, 2. Create foreign asset on asset_hub_rococo - super::penpal_create_foreign_asset_on_asset_hub( - asset_id_on_penpal, - foreign_asset_at_asset_hub_rococo, - ah_as_seen_by_penpal, - true, - asset_owner_on_penpal, - ASSET_MIN_BALANCE * 1_000_000, - ); - let penpal_as_seen_by_ah = AssetHubRococo::sibling_location_of(PenpalA::para_id()); let sov_penpal_on_ahr = AssetHubRococo::sovereign_account_id_of(penpal_as_seen_by_ah); AssetHubRococo::fund_accounts(vec![ - (AssetHubRococoSender::get().into(), 5_000_000 * ROCOCO_ED), /* An account to swap dot - * for something else. */ + // An account to swap dot for something else. + (AssetHubRococoSender::get().into(), 5_000_000 * ASSET_HUB_ROCOCO_ED), + // Penpal's sovereign account in AH should have some balance + (sov_penpal_on_ahr.clone().into(), 100_000_000 * ASSET_HUB_ROCOCO_ED), ]); AssetHubRococo::execute_with(|| { - // 3: Mint foreign asset on asset_hub_rococo: + // 0: No need to create foreign asset as it exists in genesis. + // + // 1: Mint foreign asset on asset_hub_rococo: // // (While it might be nice to use batch, // currently that's disabled due to safe call filters.) type RuntimeEvent = ::RuntimeEvent; - // 3. Mint foreign asset (in reality this should be a teleport or some such) + // 1. Mint foreign asset (in reality this should be a teleport or some such) assert_ok!(::ForeignAssets::mint( ::RuntimeOrigin::signed(sov_penpal_on_ahr.clone().into()), foreign_asset_at_asset_hub_rococo, sov_penpal_on_ahr.clone().into(), - 3_000_000_000_000, + ASSET_HUB_ROCOCO_ED * 3_000_000_000_000, )); assert_expected_events!( @@ -166,7 +154,7 @@ fn swap_locally_on_chain_using_foreign_assets() { ] ); - // 4. Create pool: + // 2. Create pool: assert_ok!(::AssetConversion::create_pool( ::RuntimeOrigin::signed(AssetHubRococoSender::get()), asset_native.clone(), @@ -180,7 +168,7 @@ fn swap_locally_on_chain_using_foreign_assets() { ] ); - // 5. Add liquidity: + // 3. Add liquidity: assert_ok!(::AssetConversion::add_liquidity( ::RuntimeOrigin::signed(sov_penpal_on_ahr.clone()), asset_native.clone(), @@ -201,15 +189,15 @@ fn swap_locally_on_chain_using_foreign_assets() { ] ); - // 6. Swap! + // 4. Swap! let path = vec![asset_native.clone(), Box::new(foreign_asset_at_asset_hub_rococo)]; assert_ok!( ::AssetConversion::swap_exact_tokens_for_tokens( ::RuntimeOrigin::signed(AssetHubRococoSender::get()), path, - 100000, - 1000, + 100000 * ASSET_HUB_ROCOCO_ED, + 1000 * ASSET_HUB_ROCOCO_ED, AssetHubRococoSender::get().into(), true ) @@ -219,18 +207,18 @@ fn swap_locally_on_chain_using_foreign_assets() { AssetHubRococo, vec![ RuntimeEvent::AssetConversion(pallet_asset_conversion::Event::SwapExecuted { amount_in, amount_out, .. },) => { - amount_in: *amount_in == 100000, - amount_out: *amount_out == 199399, + amount_in: *amount_in == 333333300000, + amount_out: *amount_out == 498874118173, }, ] ); - // 7. Remove liquidity + // 5. Remove liquidity assert_ok!(::AssetConversion::remove_liquidity( ::RuntimeOrigin::signed(sov_penpal_on_ahr.clone()), asset_native.clone(), Box::new(foreign_asset_at_asset_hub_rococo), - 1414213562273 - 2_000_000_000, // all but the 2 EDs can't be retrieved. + 1414213562273 - ASSET_HUB_ROCOCO_ED * 2, // all but the 2 EDs can't be retrieved. 0, 0, sov_penpal_on_ahr.clone().into(), @@ -382,10 +370,10 @@ fn pay_xcm_fee_with_some_asset_swapped_for_native() { penpal.clone(), ); - assert_ok!(::PolkadotXcm::send( + assert_ok!(::PolkadotXcm::send_blob( penpal_root, bx!(asset_hub_location), - bx!(xcm), + xcm.encode().try_into().unwrap(), )); PenpalA::assert_xcm_pallet_sent(); diff --git a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/teleport.rs b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/teleport.rs index 218234cc78eaab2801d08f4fa34b99eaaa5935b9..1cbb7fb8c193accc65ef160a3a09514bd51debf5 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/teleport.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/teleport.rs @@ -13,11 +13,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -use crate::*; -use asset_hub_rococo_runtime::xcm_config::XcmConfig as AssetHubRococoXcmConfig; -use emulated_integration_tests_common::xcm_helpers::non_fee_asset; -use rococo_runtime::xcm_config::XcmConfig as RococoXcmConfig; -use rococo_system_emulated_network::penpal_emulated_chain::LocalTeleportableToAssetHubV3 as PenpalLocalTeleportableToAssetHubV3; +use crate::imports::*; fn relay_origin_assertions(t: RelayToSystemParaTest) { type RuntimeEvent = ::RuntimeEvent; @@ -28,12 +24,12 @@ fn relay_origin_assertions(t: RelayToSystemParaTest) { Rococo, vec![ // Amount to teleport is withdrawn from Sender - RuntimeEvent::Balances(pallet_balances::Event::Withdraw { who, amount }) => { + RuntimeEvent::Balances(pallet_balances::Event::Burned { who, amount }) => { who: *who == t.sender.account_id, amount: *amount == t.args.amount, }, // Amount to teleport is deposited in Relay's `CheckAccount` - RuntimeEvent::Balances(pallet_balances::Event::Deposit { who, amount }) => { + RuntimeEvent::Balances(pallet_balances::Event::Minted { who, amount }) => { who: *who == ::XcmPallet::check_account(), amount: *amount == t.args.amount, }, @@ -54,12 +50,12 @@ fn relay_dest_assertions(t: SystemParaToRelayTest) { Rococo, vec![ // Amount is withdrawn from Relay Chain's `CheckAccount` - RuntimeEvent::Balances(pallet_balances::Event::Withdraw { who, amount }) => { + RuntimeEvent::Balances(pallet_balances::Event::Burned { who, amount }) => { who: *who == ::XcmPallet::check_account(), amount: *amount == t.args.amount, }, // Amount minus fees are deposited in Receiver's account - RuntimeEvent::Balances(pallet_balances::Event::Deposit { who, .. }) => { + RuntimeEvent::Balances(pallet_balances::Event::Minted { who, .. }) => { who: *who == t.receiver.account_id, }, ] @@ -88,7 +84,7 @@ fn para_origin_assertions(t: SystemParaToRelayTest) { AssetHubRococo, vec![ // Amount is withdrawn from Sender's account - RuntimeEvent::Balances(pallet_balances::Event::Withdraw { who, amount }) => { + RuntimeEvent::Balances(pallet_balances::Event::Burned { who, amount }) => { who: *who == t.sender.account_id, amount: *amount == t.args.amount, }, @@ -105,7 +101,7 @@ fn para_dest_assertions(t: RelayToSystemParaTest) { AssetHubRococo, vec![ // Amount minus fees are deposited in Receiver's account - RuntimeEvent::Balances(pallet_balances::Event::Deposit { who, .. }) => { + RuntimeEvent::Balances(pallet_balances::Event::Minted { who, .. }) => { who: *who == t.receiver.account_id, }, ] @@ -114,18 +110,21 @@ fn para_dest_assertions(t: RelayToSystemParaTest) { fn penpal_to_ah_foreign_assets_sender_assertions(t: ParaToSystemParaTest) { type RuntimeEvent = ::RuntimeEvent; - PenpalA::assert_xcm_pallet_attempted_complete(None); + let system_para_native_asset_location = + v3::Location::try_from(RelayLocation::get()).expect("conversion works"); let expected_asset_id = t.args.asset_id.unwrap(); let (_, expected_asset_amount) = non_fee_asset(&t.args.assets, t.args.fee_asset_item as usize).unwrap(); + + PenpalA::assert_xcm_pallet_attempted_complete(None); assert_expected_events!( PenpalA, vec![ - RuntimeEvent::Balances( - pallet_balances::Event::Withdraw { who, amount } + RuntimeEvent::ForeignAssets( + pallet_assets::Event::Burned { asset_id, owner, .. } ) => { - who: *who == t.sender.account_id, - amount: *amount == t.args.amount, + asset_id: *asset_id == system_para_native_asset_location, + owner: *owner == t.sender.account_id, }, RuntimeEvent::Assets(pallet_assets::Event::Burned { asset_id, owner, balance }) => { asset_id: *asset_id == expected_asset_id, @@ -144,17 +143,20 @@ fn penpal_to_ah_foreign_assets_receiver_assertions(t: ParaToSystemParaTest) { let (expected_foreign_asset_id, expected_foreign_asset_amount) = non_fee_asset(&t.args.assets, t.args.fee_asset_item as usize).unwrap(); let expected_foreign_asset_id_v3: v3::Location = expected_foreign_asset_id.try_into().unwrap(); + + AssetHubRococo::assert_xcmp_queue_success(None); + assert_expected_events!( AssetHubRococo, vec![ // native asset reserve transfer for paying fees, withdrawn from Penpal's sov account RuntimeEvent::Balances( - pallet_balances::Event::Withdraw { who, amount } + pallet_balances::Event::Burned { who, amount } ) => { who: *who == sov_penpal_on_ahr.clone().into(), amount: *amount == t.args.amount, }, - RuntimeEvent::Balances(pallet_balances::Event::Deposit { who, .. }) => { + RuntimeEvent::Balances(pallet_balances::Event::Minted { who, .. }) => { who: *who == t.receiver.account_id, }, RuntimeEvent::ForeignAssets(pallet_assets::Event::Issued { asset_id, owner, amount }) => { @@ -163,9 +165,6 @@ fn penpal_to_ah_foreign_assets_receiver_assertions(t: ParaToSystemParaTest) { amount: *amount == expected_foreign_asset_amount, }, RuntimeEvent::Balances(pallet_balances::Event::Deposit { .. }) => {}, - RuntimeEvent::MessageQueue( - pallet_message_queue::Event::Processed { success: true, .. } - ) => {}, ] ); } @@ -205,6 +204,11 @@ fn ah_to_penpal_foreign_assets_receiver_assertions(t: SystemParaToParaTest) { let (_, expected_asset_amount) = non_fee_asset(&t.args.assets, t.args.fee_asset_item as usize).unwrap(); let checking_account = ::PolkadotXcm::check_account(); + let system_para_native_asset_location = + v3::Location::try_from(RelayLocation::get()).expect("conversion works"); + + PenpalA::assert_xcmp_queue_success(None); + assert_expected_events!( PenpalA, vec![ @@ -221,12 +225,11 @@ fn ah_to_penpal_foreign_assets_receiver_assertions(t: SystemParaToParaTest) { amount: *amount == expected_asset_amount, }, // native asset for fee is deposited to receiver - RuntimeEvent::Balances(pallet_balances::Event::Deposit { who, .. }) => { - who: *who == t.receiver.account_id, + RuntimeEvent::ForeignAssets(pallet_assets::Event::Issued { asset_id, owner, amount }) => { + asset_id: *asset_id == system_para_native_asset_location, + owner: *owner == t.receiver.account_id, + amount: *amount == expected_asset_amount, }, - RuntimeEvent::MessageQueue( - pallet_message_queue::Event::Processed { success: true, .. } - ) => {}, ] ); } @@ -242,16 +245,6 @@ fn relay_limited_teleport_assets(t: RelayToSystemParaTest) -> DispatchResult { ) } -fn relay_teleport_assets(t: RelayToSystemParaTest) -> DispatchResult { - ::XcmPallet::teleport_assets( - t.signed_origin, - bx!(t.args.dest.into()), - bx!(t.args.beneficiary.into()), - bx!(t.args.assets.into()), - t.args.fee_asset_item, - ) -} - fn system_para_limited_teleport_assets(t: SystemParaToRelayTest) -> DispatchResult { ::PolkadotXcm::limited_teleport_assets( t.signed_origin, @@ -263,16 +256,6 @@ fn system_para_limited_teleport_assets(t: SystemParaToRelayTest) -> DispatchResu ) } -fn system_para_teleport_assets(t: SystemParaToRelayTest) -> DispatchResult { - ::PolkadotXcm::teleport_assets( - t.signed_origin, - bx!(t.args.dest.into()), - bx!(t.args.beneficiary.into()), - bx!(t.args.assets.into()), - t.args.fee_asset_item, - ) -} - fn para_to_system_para_transfer_assets(t: ParaToSystemParaTest) -> DispatchResult { ::PolkadotXcm::transfer_assets( t.signed_origin, @@ -319,7 +302,7 @@ fn limited_teleport_native_assets_from_relay_to_system_para_works() { test.assert(); let delivery_fees = Rococo::execute_with(|| { - xcm_helpers::transfer_assets_delivery_fees::< + xcm_helpers::teleport_assets_delivery_fees::< ::XcmSender, >(test.args.assets.clone(), 0, test.args.weight_limit, test.args.beneficiary, test.args.dest) }); @@ -366,7 +349,7 @@ fn limited_teleport_native_assets_back_from_system_para_to_relay_works() { let receiver_balance_after = test.receiver.balance; let delivery_fees = AssetHubRococo::execute_with(|| { - xcm_helpers::transfer_assets_delivery_fees::< + xcm_helpers::teleport_assets_delivery_fees::< ::XcmSender, >(test.args.assets.clone(), 0, test.args.weight_limit, test.args.beneficiary, test.args.dest) }); @@ -407,7 +390,7 @@ fn limited_teleport_native_assets_from_system_para_to_relay_fails() { let receiver_balance_after = test.receiver.balance; let delivery_fees = AssetHubRococo::execute_with(|| { - xcm_helpers::transfer_assets_delivery_fees::< + xcm_helpers::teleport_assets_delivery_fees::< ::XcmSender, >(test.args.assets.clone(), 0, test.args.weight_limit, test.args.beneficiary, test.args.dest) }); @@ -418,129 +401,6 @@ fn limited_teleport_native_assets_from_system_para_to_relay_fails() { assert_eq!(receiver_balance_after, receiver_balance_before); } -/// Teleport of native asset from Relay Chain to the System Parachain should work -#[test] -fn teleport_native_assets_from_relay_to_system_para_works() { - // Init values for Relay Chain - let amount_to_send: Balance = ROCOCO_ED * 1000; - let dest = Rococo::child_location_of(AssetHubRococo::para_id()); - let beneficiary_id = AssetHubRococoReceiver::get(); - let test_args = TestContext { - sender: RococoSender::get(), - receiver: AssetHubRococoReceiver::get(), - args: TestArgs::new_relay(dest, beneficiary_id, amount_to_send), - }; - - let mut test = RelayToSystemParaTest::new(test_args); - - let sender_balance_before = test.sender.balance; - let receiver_balance_before = test.receiver.balance; - - test.set_assertion::(relay_origin_assertions); - test.set_assertion::(para_dest_assertions); - test.set_dispatchable::(relay_teleport_assets); - test.assert(); - - let delivery_fees = Rococo::execute_with(|| { - xcm_helpers::transfer_assets_delivery_fees::< - ::XcmSender, - >(test.args.assets.clone(), 0, test.args.weight_limit, test.args.beneficiary, test.args.dest) - }); - - let sender_balance_after = test.sender.balance; - let receiver_balance_after = test.receiver.balance; - - // Sender's balance is reduced - assert_eq!(sender_balance_before - amount_to_send - delivery_fees, sender_balance_after); - // Receiver's balance is increased - assert!(receiver_balance_after > receiver_balance_before); -} - -/// Teleport of native asset from System Parachains to the Relay Chain -/// should work when there is enough balance in Relay Chain's `CheckAccount` -#[test] -fn teleport_native_assets_back_from_system_para_to_relay_works() { - // Dependency - Relay Chain's `CheckAccount` should have enough balance - teleport_native_assets_from_relay_to_system_para_works(); - - // Init values for Relay Chain - let amount_to_send: Balance = ASSET_HUB_ROCOCO_ED * 1000; - let destination = AssetHubRococo::parent_location(); - let beneficiary_id = RococoReceiver::get(); - let assets = (Parent, amount_to_send).into(); - - let test_args = TestContext { - sender: AssetHubRococoSender::get(), - receiver: RococoReceiver::get(), - args: TestArgs::new_para(destination, beneficiary_id, amount_to_send, assets, None, 0), - }; - - let mut test = SystemParaToRelayTest::new(test_args); - - let sender_balance_before = test.sender.balance; - let receiver_balance_before = test.receiver.balance; - - test.set_assertion::(para_origin_assertions); - test.set_assertion::(relay_dest_assertions); - test.set_dispatchable::(system_para_teleport_assets); - test.assert(); - - let sender_balance_after = test.sender.balance; - let receiver_balance_after = test.receiver.balance; - - let delivery_fees = AssetHubRococo::execute_with(|| { - xcm_helpers::transfer_assets_delivery_fees::< - ::XcmSender, - >(test.args.assets.clone(), 0, test.args.weight_limit, test.args.beneficiary, test.args.dest) - }); - - // Sender's balance is reduced - assert_eq!(sender_balance_before - amount_to_send - delivery_fees, sender_balance_after); - // Receiver's balance is increased - assert!(receiver_balance_after > receiver_balance_before); -} - -/// Teleport of native asset from System Parachain to Relay Chain -/// shouldn't work when there is not enough balance in Relay Chain's `CheckAccount` -#[test] -fn teleport_native_assets_from_system_para_to_relay_fails() { - // Init values for Relay Chain - let amount_to_send: Balance = ASSET_HUB_ROCOCO_ED * 1000; - let destination = AssetHubRococo::parent_location(); - let beneficiary_id = RococoReceiver::get(); - let assets = (Parent, amount_to_send).into(); - - let test_args = TestContext { - sender: AssetHubRococoSender::get(), - receiver: RococoReceiver::get(), - args: TestArgs::new_para(destination, beneficiary_id, amount_to_send, assets, None, 0), - }; - - let mut test = SystemParaToRelayTest::new(test_args); - - let sender_balance_before = test.sender.balance; - let receiver_balance_before = test.receiver.balance; - - test.set_assertion::(para_origin_assertions); - test.set_assertion::(relay_dest_assertions_fail); - test.set_dispatchable::(system_para_teleport_assets); - test.assert(); - - let delivery_fees = AssetHubRococo::execute_with(|| { - xcm_helpers::transfer_assets_delivery_fees::< - ::XcmSender, - >(test.args.assets.clone(), 0, test.args.weight_limit, test.args.beneficiary, test.args.dest) - }); - - let sender_balance_after = test.sender.balance; - let receiver_balance_after = test.receiver.balance; - - // Sender's balance is reduced - assert_eq!(sender_balance_before - amount_to_send - delivery_fees, sender_balance_after); - // Receiver's balance does not change - assert_eq!(receiver_balance_after, receiver_balance_before); -} - #[test] fn teleport_to_other_system_parachains_works() { let amount = ASSET_HUB_ROCOCO_ED * 100; @@ -558,30 +418,21 @@ fn teleport_to_other_system_parachains_works() { /// (using native reserve-based transfer for fees) #[test] fn bidirectional_teleport_foreign_assets_between_para_and_asset_hub() { - let ah_as_seen_by_penpal = PenpalA::sibling_location_of(AssetHubRococo::para_id()); - let asset_location_on_penpal = PenpalLocalTeleportableToAssetHubV3::get(); + // Init values for Parachain + let fee_amount_to_send: Balance = ASSET_HUB_ROCOCO_ED * 10000; + let asset_location_on_penpal = + v3::Location::try_from(PenpalLocalTeleportableToAssetHub::get()).expect("conversion works"); let asset_id_on_penpal = match asset_location_on_penpal.last() { Some(v3::Junction::GeneralIndex(id)) => *id as u32, _ => unreachable!(), }; - let asset_owner_on_penpal = PenpalASender::get(); - let foreign_asset_at_asset_hub_rococo = - v3::Location::new(1, [v3::Junction::Parachain(PenpalA::para_id().into())]) - .appended_with(asset_location_on_penpal) - .unwrap(); - super::penpal_create_foreign_asset_on_asset_hub( - asset_id_on_penpal, - foreign_asset_at_asset_hub_rococo, - ah_as_seen_by_penpal.clone(), - false, - asset_owner_on_penpal, - ASSET_MIN_BALANCE * 1_000_000, - ); - let penpal_to_ah_beneficiary_id = AssetHubRococoReceiver::get(); - - let fee_amount_to_send = ASSET_HUB_ROCOCO_ED * 10_000; - let asset_amount_to_send = ASSET_MIN_BALANCE * 1000; - + let asset_amount_to_send = ASSET_HUB_ROCOCO_ED * 1000; + let asset_owner = PenpalAssetOwner::get(); + let system_para_native_asset_location = + v3::Location::try_from(RelayLocation::get()).expect("conversion works"); + let sender = PenpalASender::get(); + let penpal_check_account = ::PolkadotXcm::check_account(); + let ah_as_seen_by_penpal = PenpalA::sibling_location_of(AssetHubRococo::para_id()); let asset_location_on_penpal_latest: Location = asset_location_on_penpal.try_into().unwrap(); let penpal_assets: Assets = vec![ (Parent, fee_amount_to_send).into(), @@ -594,6 +445,38 @@ fn bidirectional_teleport_foreign_assets_between_para_and_asset_hub() { .position(|r| r == &(Parent, fee_amount_to_send).into()) .unwrap() as u32; + // fund Parachain's sender account + PenpalA::mint_foreign_asset( + ::RuntimeOrigin::signed(asset_owner.clone()), + system_para_native_asset_location, + sender.clone(), + fee_amount_to_send * 2, + ); + // No need to create the asset (only mint) as it exists in genesis. + PenpalA::mint_asset( + ::RuntimeOrigin::signed(asset_owner.clone()), + asset_id_on_penpal, + sender.clone(), + asset_amount_to_send, + ); + // fund Parachain's check account to be able to teleport + PenpalA::fund_accounts(vec![(penpal_check_account.clone().into(), ASSET_HUB_ROCOCO_ED * 1000)]); + + // prefund SA of Penpal on AssetHub with enough native tokens to pay for fees + let penpal_as_seen_by_ah = AssetHubRococo::sibling_location_of(PenpalA::para_id()); + let sov_penpal_on_ah = AssetHubRococo::sovereign_account_id_of(penpal_as_seen_by_ah); + AssetHubRococo::fund_accounts(vec![( + sov_penpal_on_ah.clone().into(), + ASSET_HUB_ROCOCO_ED * 100_000_000_000, + )]); + + // Init values for System Parachain + let foreign_asset_at_asset_hub_rococo = + v3::Location::new(1, [v3::Junction::Parachain(PenpalA::para_id().into())]) + .appended_with(asset_location_on_penpal) + .unwrap(); + let penpal_to_ah_beneficiary_id = AssetHubRococoReceiver::get(); + // Penpal to AH test args let penpal_to_ah_test_args = TestContext { sender: PenpalASender::get(), @@ -608,8 +491,14 @@ fn bidirectional_teleport_foreign_assets_between_para_and_asset_hub() { ), }; let mut penpal_to_ah = ParaToSystemParaTest::new(penpal_to_ah_test_args); + let penpal_sender_balance_before = PenpalA::execute_with(|| { + type ForeignAssets = ::ForeignAssets; + >::balance( + system_para_native_asset_location, + &PenpalASender::get(), + ) + }); - let penpal_sender_balance_before = penpal_to_ah.sender.balance; let ah_receiver_balance_before = penpal_to_ah.receiver.balance; let penpal_sender_assets_before = PenpalA::execute_with(|| { @@ -629,7 +518,14 @@ fn bidirectional_teleport_foreign_assets_between_para_and_asset_hub() { penpal_to_ah.set_dispatchable::(para_to_system_para_transfer_assets); penpal_to_ah.assert(); - let penpal_sender_balance_after = penpal_to_ah.sender.balance; + let penpal_sender_balance_after = PenpalA::execute_with(|| { + type ForeignAssets = ::ForeignAssets; + >::balance( + system_para_native_asset_location, + &PenpalASender::get(), + ) + }); + let ah_receiver_balance_after = penpal_to_ah.receiver.balance; let penpal_sender_assets_after = PenpalA::execute_with(|| { @@ -704,7 +600,13 @@ fn bidirectional_teleport_foreign_assets_between_para_and_asset_hub() { let mut ah_to_penpal = SystemParaToParaTest::new(ah_to_penpal_test_args); let ah_sender_balance_before = ah_to_penpal.sender.balance; - let penpal_receiver_balance_before = ah_to_penpal.receiver.balance; + let penpal_receiver_balance_before = PenpalA::execute_with(|| { + type ForeignAssets = ::ForeignAssets; + >::balance( + system_para_native_asset_location, + &PenpalAReceiver::get(), + ) + }); let ah_sender_assets_before = AssetHubRococo::execute_with(|| { type ForeignAssets = ::ForeignAssets; @@ -724,7 +626,13 @@ fn bidirectional_teleport_foreign_assets_between_para_and_asset_hub() { ah_to_penpal.assert(); let ah_sender_balance_after = ah_to_penpal.sender.balance; - let penpal_receiver_balance_after = ah_to_penpal.receiver.balance; + let penpal_receiver_balance_after = PenpalA::execute_with(|| { + type ForeignAssets = ::ForeignAssets; + >::balance( + system_para_native_asset_location, + &PenpalAReceiver::get(), + ) + }); let ah_sender_assets_after = AssetHubRococo::execute_with(|| { type ForeignAssets = ::ForeignAssets; diff --git a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/Cargo.toml b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/Cargo.toml index 0c920730d0fe695e84c77560ae9755ec65d19d46..00f4308324a96734afac879cafd1e51300407a26 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/Cargo.toml @@ -31,11 +31,11 @@ pallet-xcm = { path = "../../../../../../../polkadot/xcm/pallet-xcm", default-fe westend-runtime = { path = "../../../../../../../polkadot/runtime/westend" } # Cumulus -parachains-common = { path = "../../../../../../parachains/common" } -testnet-parachains-constants = { path = "../../../../../runtimes/constants", features = ["westend"] } +parachains-common = { path = "../../../../../common" } +penpal-runtime = { path = "../../../../../runtimes/testing/penpal" } asset-hub-westend-runtime = { path = "../../../../../runtimes/assets/asset-hub-westend" } asset-test-utils = { path = "../../../../../runtimes/assets/test-utils" } -cumulus-pallet-xcmp-queue = { default-features = false, path = "../../../../../../pallets/xcmp-queue" } -cumulus-pallet-parachain-system = { default-features = false, path = "../../../../../../pallets/parachain-system" } +cumulus-pallet-xcmp-queue = { path = "../../../../../../pallets/xcmp-queue", default-features = false } +cumulus-pallet-parachain-system = { path = "../../../../../../pallets/parachain-system", default-features = false } emulated-integration-tests-common = { path = "../../../common", default-features = false } westend-system-emulated-network = { path = "../../../networks/westend-system" } diff --git a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/lib.rs b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/lib.rs index 409369df7bb0633a7137c025cb6d28f6f41f8f49..c9f5fe0647e12ba0121261505e27ff56c3f82f96 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/lib.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/lib.rs @@ -13,67 +13,79 @@ // See the License for the specific language governing permissions and // limitations under the License. -pub use codec::Encode; +#[cfg(test)] +mod imports { + pub use codec::Encode; + + // Substrate + pub use frame_support::{ + assert_err, assert_ok, + pallet_prelude::Weight, + sp_runtime::{DispatchError, DispatchResult, ModuleError}, + traits::fungibles::Inspect, + }; -// Substrate -pub use frame_support::{ - assert_err, assert_ok, - instances::Instance2, - pallet_prelude::Weight, - sp_runtime::{AccountId32, DispatchError, DispatchResult, ModuleError}, - traits::fungibles::Inspect, - BoundedVec, -}; + // Polkadot + pub use xcm::{ + prelude::{AccountId32 as AccountId32Junction, *}, + v3, + }; -// Polkadot -pub use xcm::{ - prelude::{AccountId32 as AccountId32Junction, *}, - v3::{self, Error, NetworkId::Westend as WestendId}, -}; + // Cumulus + pub use asset_test_utils::xcm_helpers; + pub use emulated_integration_tests_common::{ + test_parachain_is_trusted_teleporter, + xcm_emulator::{ + assert_expected_events, bx, Chain, Parachain as Para, RelayChain as Relay, Test, + TestArgs, TestContext, TestExt, + }, + xcm_helpers::{non_fee_asset, xcm_transact_paid_execution}, + ASSETS_PALLET_ID, RESERVABLE_ASSET_ID, XCM_V3, + }; + pub use parachains_common::{AccountId, Balance}; + pub use westend_system_emulated_network::{ + asset_hub_westend_emulated_chain::{ + genesis::{AssetHubWestendAssetOwner, ED as ASSET_HUB_WESTEND_ED}, + AssetHubWestendParaPallet as AssetHubWestendPallet, + }, + collectives_westend_emulated_chain::CollectivesWestendParaPallet as CollectivesWestendPallet, + penpal_emulated_chain::{ + PenpalAParaPallet as PenpalAPallet, PenpalAssetOwner, + PenpalBParaPallet as PenpalBPallet, + }, + westend_emulated_chain::{genesis::ED as WESTEND_ED, WestendRelayPallet as WestendPallet}, + AssetHubWestendPara as AssetHubWestend, + AssetHubWestendParaReceiver as AssetHubWestendReceiver, + AssetHubWestendParaSender as AssetHubWestendSender, + BridgeHubWestendPara as BridgeHubWestend, + BridgeHubWestendParaReceiver as BridgeHubWestendReceiver, + CollectivesWestendPara as CollectivesWestend, PenpalAPara as PenpalA, + PenpalAParaReceiver as PenpalAReceiver, PenpalAParaSender as PenpalASender, + PenpalBPara as PenpalB, PenpalBParaReceiver as PenpalBReceiver, WestendRelay as Westend, + WestendRelayReceiver as WestendReceiver, WestendRelaySender as WestendSender, + }; -// Cumulus -pub use asset_test_utils::xcm_helpers; -pub use emulated_integration_tests_common::{ - test_parachain_is_trusted_teleporter, - xcm_emulator::{ - assert_expected_events, bx, helpers::weight_within_threshold, Chain, Parachain as Para, - RelayChain as Relay, Test, TestArgs, TestContext, TestExt, - }, - xcm_helpers::{xcm_transact_paid_execution, xcm_transact_unpaid_execution}, - PROOF_SIZE_THRESHOLD, REF_TIME_THRESHOLD, XCM_V3, -}; -pub use parachains_common::{AccountId, Balance}; -pub use westend_system_emulated_network::{ - asset_hub_westend_emulated_chain::{ - genesis::ED as ASSET_HUB_WESTEND_ED, AssetHubWestendParaPallet as AssetHubWestendPallet, - }, - collectives_westend_emulated_chain::{ - genesis::ED as COLLECTIVES_WESTEND_ED, - CollectivesWestendParaPallet as CollectivesWestendPallet, - }, - penpal_emulated_chain::PenpalBParaPallet as PenpalBPallet, - westend_emulated_chain::{genesis::ED as WESTEND_ED, WestendRelayPallet as WestendPallet}, - AssetHubWestendPara as AssetHubWestend, AssetHubWestendParaReceiver as AssetHubWestendReceiver, - AssetHubWestendParaSender as AssetHubWestendSender, BridgeHubWestendPara as BridgeHubWestend, - BridgeHubWestendParaReceiver as BridgeHubWestendReceiver, - CollectivesWestendPara as CollectivesWestend, PenpalAPara as PenpalA, - PenpalAParaReceiver as PenpalAReceiver, PenpalBPara as PenpalB, - PenpalBParaReceiver as PenpalBReceiver, PenpalBParaSender as PenpalBSender, - WestendRelay as Westend, WestendRelayReceiver as WestendReceiver, - WestendRelaySender as WestendSender, -}; + // Runtimes + pub use asset_hub_westend_runtime::xcm_config::{ + WestendLocation as RelayLocation, XcmConfig as AssetHubWestendXcmConfig, + }; + pub use penpal_runtime::xcm_config::{ + LocalReservableFromAssetHub as PenpalLocalReservableFromAssetHub, + LocalTeleportableToAssetHub as PenpalLocalTeleportableToAssetHub, + }; + pub use westend_runtime::xcm_config::XcmConfig as WestendXcmConfig; -pub const ASSET_ID: u32 = 1; -pub const ASSET_MIN_BALANCE: u128 = 1000; -// `Assets` pallet index -pub const ASSETS_PALLET_ID: u8 = 50; + pub const ASSET_ID: u32 = 3; + pub const ASSET_MIN_BALANCE: u128 = 1000; -pub type RelayToSystemParaTest = Test; -pub type RelayToParaTest = Test; -pub type SystemParaToRelayTest = Test; -pub type SystemParaToParaTest = Test; -pub type ParaToSystemParaTest = Test; -pub type ParaToParaTest = Test; + pub type RelayToSystemParaTest = Test; + pub type RelayToParaTest = Test; + pub type ParaToRelayTest = Test; + pub type SystemParaToRelayTest = Test; + pub type SystemParaToParaTest = Test; + pub type ParaToSystemParaTest = Test; + pub type ParaToParaThroughRelayTest = Test; +} #[cfg(test)] mod tests; diff --git a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/fellowship_treasury.rs b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/fellowship_treasury.rs index 11e1e1762dbb4a62eccc5c92a60a89ee917716e5..2d02e90f47fb834326a7268394671f5ef03f84e7 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/fellowship_treasury.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/fellowship_treasury.rs @@ -13,7 +13,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -use crate::*; +use crate::imports::*; use emulated_integration_tests_common::accounts::{ALICE, BOB}; use frame_support::traits::fungibles::{Create, Inspect, Mutate}; use polkadot_runtime_common::impls::VersionedLocatableAsset; diff --git a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/mod.rs b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/mod.rs index a56cde8f2a2cb2263cd20c5fe4255459c94a084a..3cd7c9c46d69edd738f067724485824ef51d3259 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/mod.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/mod.rs @@ -20,11 +20,3 @@ mod set_xcm_versions; mod swap; mod teleport; mod treasury; - -use crate::*; -emulated_integration_tests_common::include_penpal_create_foreign_asset_on_asset_hub!( - PenpalB, - AssetHubWestend, - WESTEND_ED, - testnet_parachains_constants::westend::fee::WeightToFee -); diff --git a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/reserve_transfer.rs b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/reserve_transfer.rs index 851d7be6ec9a0af133c13d7fb0d6aab8ae3411fc..a26dfef8e8e702ee3f22870116adc03ee8ed1ca2 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/reserve_transfer.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/reserve_transfer.rs @@ -13,10 +13,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -use crate::*; -use asset_hub_westend_runtime::xcm_config::XcmConfig as AssetHubWestendXcmConfig; -use westend_runtime::xcm_config::XcmConfig as WestendXcmConfig; -use westend_system_emulated_network::penpal_emulated_chain::XcmConfig as PenpalWestendXcmConfig; +use crate::imports::*; fn relay_to_para_sender_assertions(t: RelayToParaTest) { type RuntimeEvent = ::RuntimeEvent; @@ -40,12 +37,30 @@ fn relay_to_para_sender_assertions(t: RelayToParaTest) { ); } +fn para_to_relay_sender_assertions(t: ParaToRelayTest) { + type RuntimeEvent = ::RuntimeEvent; + PenpalA::assert_xcm_pallet_attempted_complete(Some(Weight::from_parts(864_610_000, 8_799))); + assert_expected_events!( + PenpalA, + vec![ + // Amount to reserve transfer is transferred to Parachain's Sovereign account + RuntimeEvent::ForeignAssets( + pallet_assets::Event::Burned { asset_id, owner, balance, .. } + ) => { + asset_id: *asset_id == v3::Location::try_from(RelayLocation::get()).expect("conversion works"), + owner: *owner == t.sender.account_id, + balance: *balance == t.args.amount, + }, + ] + ); +} + fn system_para_to_para_sender_assertions(t: SystemParaToParaTest) { type RuntimeEvent = ::RuntimeEvent; AssetHubWestend::assert_xcm_pallet_attempted_complete(Some(Weight::from_parts( - 676_119_000, - 6196, + 864_610_000, + 8_799, ))); assert_expected_events!( @@ -61,60 +76,99 @@ fn system_para_to_para_sender_assertions(t: SystemParaToParaTest) { ), amount: *amount == t.args.amount, }, + // Transport fees are paid + RuntimeEvent::PolkadotXcm( + pallet_xcm::Event::FeesPaid { .. } + ) => {}, ] ); + AssetHubWestend::assert_xcm_pallet_sent(); } -fn para_receiver_assertions(_: Test) { - type RuntimeEvent = ::RuntimeEvent; +fn system_para_to_para_receiver_assertions(t: SystemParaToParaTest) { + type RuntimeEvent = ::RuntimeEvent; + let system_para_native_asset_location = + v3::Location::try_from(RelayLocation::get()).expect("conversion works"); + + PenpalA::assert_xcmp_queue_success(None); + assert_expected_events!( - PenpalB, + PenpalA, vec![ - RuntimeEvent::Balances(pallet_balances::Event::Deposit { .. }) => {}, - RuntimeEvent::MessageQueue( - pallet_message_queue::Event::Processed { success: true, .. } - ) => {}, + RuntimeEvent::ForeignAssets(pallet_assets::Event::Issued { asset_id, owner, .. }) => { + asset_id: *asset_id == system_para_native_asset_location, + owner: *owner == t.receiver.account_id, + }, ] ); } fn para_to_system_para_sender_assertions(t: ParaToSystemParaTest) { - type RuntimeEvent = ::RuntimeEvent; + type RuntimeEvent = ::RuntimeEvent; + PenpalA::assert_xcm_pallet_attempted_complete(Some(Weight::from_parts(864_610_000, 8_799))); + assert_expected_events!( + PenpalA, + vec![ + // Amount to reserve transfer is transferred to Parachain's Sovereign account + RuntimeEvent::ForeignAssets( + pallet_assets::Event::Burned { asset_id, owner, balance, .. } + ) => { + asset_id: *asset_id == v3::Location::try_from(RelayLocation::get()).expect("conversion works"), + owner: *owner == t.sender.account_id, + balance: *balance == t.args.amount, + }, + ] + ); +} - PenpalB::assert_xcm_pallet_attempted_complete(Some(Weight::from_parts(864_610_000, 8_799))); +fn para_to_relay_receiver_assertions(t: ParaToRelayTest) { + type RuntimeEvent = ::RuntimeEvent; + let sov_penpal_on_relay = + Westend::sovereign_account_id_of(Westend::child_location_of(PenpalA::para_id())); + + Westend::assert_ump_queue_processed( + true, + Some(PenpalA::para_id()), + Some(Weight::from_parts(306305000, 7_186)), + ); assert_expected_events!( - PenpalB, + Westend, vec![ - // Amount to reserve transfer is transferred to Parachain's Sovereign account + // Amount to reserve transfer is withdrawn from Parachain's Sovereign account RuntimeEvent::Balances( - pallet_balances::Event::Withdraw { who, amount } + pallet_balances::Event::Burned { who, amount } ) => { - who: *who == t.sender.account_id, + who: *who == sov_penpal_on_relay.clone().into(), amount: *amount == t.args.amount, }, + RuntimeEvent::Balances(pallet_balances::Event::Minted { .. }) => {}, + RuntimeEvent::MessageQueue( + pallet_message_queue::Event::Processed { success: true, .. } + ) => {}, ] ); } fn para_to_system_para_receiver_assertions(t: ParaToSystemParaTest) { type RuntimeEvent = ::RuntimeEvent; - - let sov_penpal_on_ahw = AssetHubWestend::sovereign_account_id_of( - AssetHubWestend::sibling_location_of(PenpalB::para_id()), + let sov_penpal_on_ahr = AssetHubWestend::sovereign_account_id_of( + AssetHubWestend::sibling_location_of(PenpalA::para_id()), ); + AssetHubWestend::assert_xcmp_queue_success(None); + assert_expected_events!( AssetHubWestend, vec![ - // Amount to reserve transfer is transferred to Parachain's Sovereign account + // Amount to reserve transfer is withdrawn from Parachain's Sovereign account RuntimeEvent::Balances( - pallet_balances::Event::Withdraw { who, amount } + pallet_balances::Event::Burned { who, amount } ) => { - who: *who == sov_penpal_on_ahw.clone().into(), + who: *who == sov_penpal_on_ahr.clone().into(), amount: *amount == t.args.amount, }, - RuntimeEvent::Balances(pallet_balances::Event::Deposit { .. }) => {}, + RuntimeEvent::Balances(pallet_balances::Event::Minted { .. }) => {}, RuntimeEvent::MessageQueue( pallet_message_queue::Event::Processed { success: true, .. } ) => {}, @@ -124,12 +178,10 @@ fn para_to_system_para_receiver_assertions(t: ParaToSystemParaTest) { fn system_para_to_para_assets_sender_assertions(t: SystemParaToParaTest) { type RuntimeEvent = ::RuntimeEvent; - AssetHubWestend::assert_xcm_pallet_attempted_complete(Some(Weight::from_parts( - 676_119_000, - 6196, + 864_610_000, + 8799, ))); - assert_expected_events!( AssetHubWestend, vec![ @@ -137,24 +189,124 @@ fn system_para_to_para_assets_sender_assertions(t: SystemParaToParaTest) { RuntimeEvent::Assets( pallet_assets::Event::Transferred { asset_id, from, to, amount } ) => { - asset_id: *asset_id == ASSET_ID, + asset_id: *asset_id == RESERVABLE_ASSET_ID, from: *from == t.sender.account_id, to: *to == AssetHubWestend::sovereign_account_id_of( t.args.dest.clone() ), amount: *amount == t.args.amount, }, + // Native asset to pay for fees is transferred to Parachain's Sovereign account + RuntimeEvent::Balances(pallet_balances::Event::Minted { who, .. }) => { + who: *who == AssetHubWestend::sovereign_account_id_of( + t.args.dest.clone() + ), + }, + // Transport fees are paid + RuntimeEvent::PolkadotXcm( + pallet_xcm::Event::FeesPaid { .. } + ) => {}, ] ); } -fn system_para_to_para_assets_receiver_assertions(_: Test) { - type RuntimeEvent = ::RuntimeEvent; +fn para_to_system_para_assets_sender_assertions(t: ParaToSystemParaTest) { + type RuntimeEvent = ::RuntimeEvent; + let system_para_native_asset_location = + v3::Location::try_from(RelayLocation::get()).expect("conversion works"); + let reservable_asset_location = + v3::Location::try_from(PenpalLocalReservableFromAssetHub::get()).expect("conversion works"); + PenpalA::assert_xcm_pallet_attempted_complete(Some(Weight::from_parts(864_610_000, 8799))); assert_expected_events!( - PenpalB, + PenpalA, vec![ - RuntimeEvent::Balances(pallet_balances::Event::Deposit { .. }) => {}, - RuntimeEvent::Assets(pallet_assets::Event::Issued { .. }) => {}, + // Fees amount to reserve transfer is burned from Parachains's sender account + RuntimeEvent::ForeignAssets( + pallet_assets::Event::Burned { asset_id, owner, .. } + ) => { + asset_id: *asset_id == system_para_native_asset_location, + owner: *owner == t.sender.account_id, + }, + // Amount to reserve transfer is burned from Parachains's sender account + RuntimeEvent::ForeignAssets( + pallet_assets::Event::Burned { asset_id, owner, balance } + ) => { + asset_id: *asset_id == reservable_asset_location, + owner: *owner == t.sender.account_id, + balance: *balance == t.args.amount, + }, + // Transport fees are paid + RuntimeEvent::PolkadotXcm( + pallet_xcm::Event::FeesPaid { .. } + ) => {}, + ] + ); +} + +fn system_para_to_para_assets_receiver_assertions(t: SystemParaToParaTest) { + type RuntimeEvent = ::RuntimeEvent; + let system_para_asset_location = + v3::Location::try_from(PenpalLocalReservableFromAssetHub::get()).expect("conversion works"); + PenpalA::assert_xcmp_queue_success(None); + assert_expected_events!( + PenpalA, + vec![ + RuntimeEvent::ForeignAssets(pallet_assets::Event::Issued { asset_id, owner, .. }) => { + asset_id: *asset_id == v3::Location::try_from(RelayLocation::get()).expect("conversion works"), + owner: *owner == t.receiver.account_id, + }, + RuntimeEvent::ForeignAssets(pallet_assets::Event::Issued { asset_id, owner, amount }) => { + asset_id: *asset_id == system_para_asset_location, + owner: *owner == t.receiver.account_id, + amount: *amount == t.args.amount, + }, + ] + ); +} + +fn para_to_system_para_assets_receiver_assertions(t: ParaToSystemParaTest) { + type RuntimeEvent = ::RuntimeEvent; + let sov_penpal_on_ahr = AssetHubWestend::sovereign_account_id_of( + AssetHubWestend::sibling_location_of(PenpalA::para_id()), + ); + AssetHubWestend::assert_xcmp_queue_success(None); + assert_expected_events!( + AssetHubWestend, + vec![ + // Amount to reserve transfer is burned from Parachain's Sovereign account + RuntimeEvent::Assets(pallet_assets::Event::Burned { asset_id, owner, balance }) => { + asset_id: *asset_id == RESERVABLE_ASSET_ID, + owner: *owner == sov_penpal_on_ahr, + balance: *balance == t.args.amount, + }, + // Fee amount is burned from Parachain's Sovereign account + RuntimeEvent::Balances(pallet_balances::Event::Burned { who, .. }) => { + who: *who == sov_penpal_on_ahr, + }, + // Amount to reserve transfer is issued for beneficiary + RuntimeEvent::Assets(pallet_assets::Event::Issued { asset_id, owner, amount }) => { + asset_id: *asset_id == RESERVABLE_ASSET_ID, + owner: *owner == t.receiver.account_id, + amount: *amount == t.args.amount, + }, + // Remaining fee amount is minted for for beneficiary + RuntimeEvent::Balances(pallet_balances::Event::Minted { who, .. }) => { + who: *who == t.receiver.account_id, + }, + ] + ); +} + +fn relay_to_para_assets_receiver_assertions(t: RelayToParaTest) { + type RuntimeEvent = ::RuntimeEvent; + + assert_expected_events!( + PenpalA, + vec![ + RuntimeEvent::ForeignAssets(pallet_assets::Event::Issued { asset_id, owner, .. }) => { + asset_id: *asset_id == v3::Location::try_from(RelayLocation::get()).expect("conversion works"), + owner: *owner == t.receiver.account_id, + }, RuntimeEvent::MessageQueue( pallet_message_queue::Event::Processed { success: true, .. } ) => {}, @@ -162,48 +314,53 @@ fn system_para_to_para_assets_receiver_assertions(_: Test) { ); } -fn para_to_para_sender_assertions(t: ParaToParaTest) { - type RuntimeEvent = ::RuntimeEvent; - PenpalB::assert_xcm_pallet_attempted_complete(None); +fn para_to_para_through_relay_sender_assertions(t: ParaToParaThroughRelayTest) { + type RuntimeEvent = ::RuntimeEvent; + + let relay_asset_location = + v3::Location::try_from(RelayLocation::get()).expect("conversion works"); + + PenpalA::assert_xcm_pallet_attempted_complete(None); + // XCM sent to relay reserve + PenpalA::assert_parachain_system_ump_sent(); + assert_expected_events!( - PenpalB, + PenpalA, vec![ // Amount to reserve transfer is transferred to Parachain's Sovereign account - RuntimeEvent::Balances( - pallet_balances::Event::Withdraw { who, amount } + RuntimeEvent::ForeignAssets( + pallet_assets::Event::Burned { asset_id, owner, balance }, ) => { - who: *who == t.sender.account_id, - amount: *amount == t.args.amount, + asset_id: *asset_id == relay_asset_location, + owner: *owner == t.sender.account_id, + balance: *balance == t.args.amount, }, - // XCM sent to relay reserve - RuntimeEvent::ParachainSystem( - cumulus_pallet_parachain_system::Event::UpwardMessageSent { .. } - ) => {}, ] ); } -fn para_to_para_relay_hop_assertions(t: ParaToParaTest) { +fn para_to_para_relay_hop_assertions(t: ParaToParaThroughRelayTest) { type RuntimeEvent = ::RuntimeEvent; - let sov_penpal_b_on_westend = - Westend::sovereign_account_id_of(Westend::child_location_of(PenpalB::para_id())); let sov_penpal_a_on_westend = Westend::sovereign_account_id_of(Westend::child_location_of(PenpalA::para_id())); + let sov_penpal_b_on_westend = + Westend::sovereign_account_id_of(Westend::child_location_of(PenpalB::para_id())); + assert_expected_events!( Westend, vec![ // Withdrawn from sender parachain SA RuntimeEvent::Balances( - pallet_balances::Event::Withdraw { who, amount } + pallet_balances::Event::Burned { who, amount } ) => { - who: *who == sov_penpal_b_on_westend, + who: *who == sov_penpal_a_on_westend, amount: *amount == t.args.amount, }, // Deposited to receiver parachain SA RuntimeEvent::Balances( - pallet_balances::Event::Deposit { who, .. } + pallet_balances::Event::Minted { who, .. } ) => { - who: *who == sov_penpal_a_on_westend, + who: *who == sov_penpal_b_on_westend, }, RuntimeEvent::MessageQueue( pallet_message_queue::Event::Processed { success: true, .. } @@ -212,15 +369,20 @@ fn para_to_para_relay_hop_assertions(t: ParaToParaTest) { ); } -fn para_to_para_receiver_assertions(_: ParaToParaTest) { - type RuntimeEvent = ::RuntimeEvent; +fn para_to_para_through_relay_receiver_assertions(t: ParaToParaThroughRelayTest) { + type RuntimeEvent = ::RuntimeEvent; + let relay_asset_location = + v3::Location::try_from(RelayLocation::get()).expect("conversion works"); + + PenpalB::assert_xcmp_queue_success(None); + assert_expected_events!( - PenpalA, + PenpalB, vec![ - RuntimeEvent::Balances(pallet_balances::Event::Deposit { .. }) => {}, - RuntimeEvent::MessageQueue( - pallet_message_queue::Event::Processed { success: true, .. } - ) => {}, + RuntimeEvent::ForeignAssets(pallet_assets::Event::Issued { asset_id, owner, .. }) => { + asset_id: *asset_id == relay_asset_location, + owner: *owner == t.receiver.account_id, + }, ] ); } @@ -236,6 +398,17 @@ fn relay_to_para_reserve_transfer_assets(t: RelayToParaTest) -> DispatchResult { ) } +fn para_to_relay_reserve_transfer_assets(t: ParaToRelayTest) -> DispatchResult { + ::PolkadotXcm::limited_reserve_transfer_assets( + t.signed_origin, + bx!(t.args.dest.into()), + bx!(t.args.beneficiary.into()), + bx!(t.args.assets.into()), + t.args.fee_asset_item, + t.args.weight_limit, + ) +} + fn system_para_to_para_reserve_transfer_assets(t: SystemParaToParaTest) -> DispatchResult { ::PolkadotXcm::limited_reserve_transfer_assets( t.signed_origin, @@ -248,7 +421,7 @@ fn system_para_to_para_reserve_transfer_assets(t: SystemParaToParaTest) -> Dispa } fn para_to_system_para_reserve_transfer_assets(t: ParaToSystemParaTest) -> DispatchResult { - ::PolkadotXcm::limited_reserve_transfer_assets( + ::PolkadotXcm::limited_reserve_transfer_assets( t.signed_origin, bx!(t.args.dest.into()), bx!(t.args.beneficiary.into()), @@ -258,8 +431,10 @@ fn para_to_system_para_reserve_transfer_assets(t: ParaToSystemParaTest) -> Dispa ) } -fn para_to_para_limited_reserve_transfer_assets(t: ParaToParaTest) -> DispatchResult { - ::PolkadotXcm::limited_reserve_transfer_assets( +fn para_to_para_through_relay_limited_reserve_transfer_assets( + t: ParaToParaThroughRelayTest, +) -> DispatchResult { + ::PolkadotXcm::limited_reserve_transfer_assets( t.signed_origin, bx!(t.args.dest.into()), bx!(t.args.beneficiary.into()), @@ -272,6 +447,7 @@ fn para_to_para_limited_reserve_transfer_assets(t: ParaToParaTest) -> DispatchRe /// Reserve Transfers of native asset from Relay Chain to the System Parachain shouldn't work #[test] fn reserve_transfer_native_asset_from_relay_to_system_para_fails() { + // Init values for Relay Chain let signed_origin = ::RuntimeOrigin::signed(WestendSender::get().into()); let destination = Westend::child_location_of(AssetHubWestend::para_id()); let beneficiary: Location = @@ -312,6 +488,7 @@ fn reserve_transfer_native_asset_from_system_para_to_relay_fails() { let beneficiary: Location = AccountId32Junction { network: None, id: beneficiary_id.into() }.into(); let amount_to_send: Balance = ASSET_HUB_WESTEND_ED * 1000; + let assets: Assets = (Parent, amount_to_send).into(); let fee_asset_item = 0; @@ -337,136 +514,261 @@ fn reserve_transfer_native_asset_from_system_para_to_relay_fails() { }); } +// ========================================================================= +// ========= Reserve Transfers - Native Asset - Relay<>Parachain =========== +// ========================================================================= /// Reserve Transfers of native asset from Relay to Parachain should work #[test] fn reserve_transfer_native_asset_from_relay_to_para() { // Init values for Relay - let destination = Westend::child_location_of(PenpalB::para_id()); - let beneficiary_id = PenpalBReceiver::get(); + let destination = Westend::child_location_of(PenpalA::para_id()); + let sender = WestendSender::get(); let amount_to_send: Balance = WESTEND_ED * 1000; + // Init values fot Parachain + let relay_native_asset_location = + v3::Location::try_from(RelayLocation::get()).expect("conversion works"); + let receiver = PenpalAReceiver::get(); + + // Init Test let test_args = TestContext { - sender: WestendSender::get(), - receiver: PenpalBReceiver::get(), - args: TestArgs::new_relay(destination, beneficiary_id, amount_to_send), + sender, + receiver: receiver.clone(), + args: TestArgs::new_relay(destination.clone(), receiver.clone(), amount_to_send), }; - let mut test = RelayToParaTest::new(test_args); + // Query initial balances let sender_balance_before = test.sender.balance; - let receiver_balance_before = test.receiver.balance; + let receiver_assets_before = PenpalA::execute_with(|| { + type ForeignAssets = ::ForeignAssets; + >::balance(relay_native_asset_location.into(), &receiver) + }); + // Set assertions and dispatchables test.set_assertion::(relay_to_para_sender_assertions); - test.set_assertion::(para_receiver_assertions); + test.set_assertion::(relay_to_para_assets_receiver_assertions); test.set_dispatchable::(relay_to_para_reserve_transfer_assets); test.assert(); - let delivery_fees = Westend::execute_with(|| { - xcm_helpers::transfer_assets_delivery_fees::< - ::XcmSender, - >(test.args.assets.clone(), 0, test.args.weight_limit, test.args.beneficiary, test.args.dest) + // Query final balances + let sender_balance_after = test.sender.balance; + let receiver_assets_after = PenpalA::execute_with(|| { + type ForeignAssets = ::ForeignAssets; + >::balance(relay_native_asset_location.into(), &receiver) }); - let sender_balance_after = test.sender.balance; + // Sender's balance is reduced by amount sent plus delivery fees + assert!(sender_balance_after < sender_balance_before - amount_to_send); + // Receiver's asset balance is increased + assert!(receiver_assets_after > receiver_assets_before); + // Receiver's asset balance increased by `amount_to_send - delivery_fees - bought_execution`; + // `delivery_fees` might be paid from transfer or JIT, also `bought_execution` is unknown but + // should be non-zero + assert!(receiver_assets_after < receiver_assets_before + amount_to_send); +} + +/// Reserve Transfers of native asset from Parachain to Relay should work +#[test] +fn reserve_transfer_native_asset_from_para_to_relay() { + // Init values for Parachain + let destination = PenpalA::parent_location(); + let sender = PenpalASender::get(); + let amount_to_send: Balance = WESTEND_ED * 1000; + let assets: Assets = (Parent, amount_to_send).into(); + let asset_owner = PenpalAssetOwner::get(); + let relay_native_asset_location = + v3::Location::try_from(RelayLocation::get()).expect("conversion works"); + + // fund Parachain's sender account + PenpalA::mint_foreign_asset( + ::RuntimeOrigin::signed(asset_owner), + relay_native_asset_location, + sender.clone(), + amount_to_send * 2, + ); + + // Init values for Relay + let receiver = WestendReceiver::get(); + let penpal_location_as_seen_by_relay = Westend::child_location_of(PenpalA::para_id()); + let sov_penpal_on_relay = Westend::sovereign_account_id_of(penpal_location_as_seen_by_relay); + + // fund Parachain's SA on Relay with the native tokens held in reserve + Westend::fund_accounts(vec![(sov_penpal_on_relay.into(), amount_to_send * 2)]); + + // Init Test + let test_args = TestContext { + sender: sender.clone(), + receiver: receiver.clone(), + args: TestArgs::new_para( + destination.clone(), + receiver, + amount_to_send, + assets.clone(), + None, + 0, + ), + }; + let mut test = ParaToRelayTest::new(test_args); + + // Query initial balances + let sender_assets_before = PenpalA::execute_with(|| { + type ForeignAssets = ::ForeignAssets; + >::balance(relay_native_asset_location.into(), &sender) + }); + let receiver_balance_before = test.receiver.balance; + + // Set assertions and dispatchables + test.set_assertion::(para_to_relay_sender_assertions); + test.set_assertion::(para_to_relay_receiver_assertions); + test.set_dispatchable::(para_to_relay_reserve_transfer_assets); + test.assert(); + + // Query final balances + let sender_assets_after = PenpalA::execute_with(|| { + type ForeignAssets = ::ForeignAssets; + >::balance(relay_native_asset_location.into(), &sender) + }); let receiver_balance_after = test.receiver.balance; - // Sender's balance is reduced - assert_eq!(sender_balance_before - amount_to_send - delivery_fees, sender_balance_after); - // Receiver's balance is increased + // Sender's balance is reduced by amount sent plus delivery fees + assert!(sender_assets_after < sender_assets_before - amount_to_send); + // Receiver's asset balance is increased assert!(receiver_balance_after > receiver_balance_before); - // Receiver's balance increased by `amount_to_send - delivery_fees - bought_execution`; + // Receiver's asset balance increased by `amount_to_send - delivery_fees - bought_execution`; // `delivery_fees` might be paid from transfer or JIT, also `bought_execution` is unknown but // should be non-zero assert!(receiver_balance_after < receiver_balance_before + amount_to_send); } +// ========================================================================= +// ======= Reserve Transfers - Native Asset - AssetHub<>Parachain ========== +// ========================================================================= /// Reserve Transfers of native asset from System Parachain to Parachain should work #[test] fn reserve_transfer_native_asset_from_system_para_to_para() { // Init values for System Parachain - let destination = AssetHubWestend::sibling_location_of(PenpalB::para_id()); - let beneficiary_id = PenpalBReceiver::get(); - let amount_to_send: Balance = ASSET_HUB_WESTEND_ED * 1000; - let assets = (Parent, amount_to_send).into(); + let destination = AssetHubWestend::sibling_location_of(PenpalA::para_id()); + let sender = AssetHubWestendSender::get(); + let amount_to_send: Balance = ASSET_HUB_WESTEND_ED * 2000; + let assets: Assets = (Parent, amount_to_send).into(); + + // Init values for Parachain + let system_para_native_asset_location = + v3::Location::try_from(RelayLocation::get()).expect("conversion works"); + let receiver = PenpalAReceiver::get(); + // Init Test let test_args = TestContext { - sender: AssetHubWestendSender::get(), - receiver: PenpalBReceiver::get(), - args: TestArgs::new_para(destination, beneficiary_id, amount_to_send, assets, None, 0), + sender, + receiver: receiver.clone(), + args: TestArgs::new_para( + destination.clone(), + receiver.clone(), + amount_to_send, + assets.clone(), + None, + 0, + ), }; - let mut test = SystemParaToParaTest::new(test_args); + // Query initial balances let sender_balance_before = test.sender.balance; - let receiver_balance_before = test.receiver.balance; + let receiver_assets_before = PenpalA::execute_with(|| { + type ForeignAssets = ::ForeignAssets; + >::balance(system_para_native_asset_location.into(), &receiver) + }); + // Set assertions and dispatchables test.set_assertion::(system_para_to_para_sender_assertions); - test.set_assertion::(para_receiver_assertions); + test.set_assertion::(system_para_to_para_receiver_assertions); test.set_dispatchable::(system_para_to_para_reserve_transfer_assets); test.assert(); + // Query final balances let sender_balance_after = test.sender.balance; - let receiver_balance_after = test.receiver.balance; - - let delivery_fees = AssetHubWestend::execute_with(|| { - xcm_helpers::transfer_assets_delivery_fees::< - ::XcmSender, - >(test.args.assets.clone(), 0, test.args.weight_limit, test.args.beneficiary, test.args.dest) + let receiver_assets_after = PenpalA::execute_with(|| { + type ForeignAssets = ::ForeignAssets; + >::balance(system_para_native_asset_location, &receiver) }); - // Sender's balance is reduced - assert_eq!(sender_balance_before - amount_to_send - delivery_fees, sender_balance_after); - // Receiver's balance is increased - assert!(receiver_balance_after > receiver_balance_before); - // Receiver's balance increased by `amount_to_send - delivery_fees - bought_execution`; + // Sender's balance is reduced by amount sent plus delivery fees + assert!(sender_balance_after < sender_balance_before - amount_to_send); + // Receiver's assets is increased + assert!(receiver_assets_after > receiver_assets_before); + // Receiver's assets increased by `amount_to_send - delivery_fees - bought_execution`; // `delivery_fees` might be paid from transfer or JIT, also `bought_execution` is unknown but // should be non-zero - assert!(receiver_balance_after < receiver_balance_before + amount_to_send); + assert!(receiver_assets_after < receiver_assets_before + amount_to_send); } /// Reserve Transfers of native asset from Parachain to System Parachain should work #[test] fn reserve_transfer_native_asset_from_para_to_system_para() { - // Init values for Penpal Parachain - let destination = PenpalB::sibling_location_of(AssetHubWestend::para_id()); - let beneficiary_id = AssetHubWestendReceiver::get(); + // Init values for Parachain + let destination = PenpalA::sibling_location_of(AssetHubWestend::para_id()); + let sender = PenpalASender::get(); let amount_to_send: Balance = ASSET_HUB_WESTEND_ED * 1000; - let assets = (Parent, amount_to_send).into(); + let assets: Assets = (Parent, amount_to_send).into(); + let system_para_native_asset_location = + v3::Location::try_from(RelayLocation::get()).expect("conversion works"); + let asset_owner = PenpalAssetOwner::get(); + + // fund Parachain's sender account + PenpalA::mint_foreign_asset( + ::RuntimeOrigin::signed(asset_owner), + system_para_native_asset_location, + sender.clone(), + amount_to_send * 2, + ); + // Init values for System Parachain + let receiver = AssetHubWestendReceiver::get(); + let penpal_location_as_seen_by_ahr = AssetHubWestend::sibling_location_of(PenpalA::para_id()); + let sov_penpal_on_ahr = + AssetHubWestend::sovereign_account_id_of(penpal_location_as_seen_by_ahr); + + // fund Parachain's SA on System Parachain with the native tokens held in reserve + AssetHubWestend::fund_accounts(vec![(sov_penpal_on_ahr.into(), amount_to_send * 2)]); + + // Init Test let test_args = TestContext { - sender: PenpalBSender::get(), - receiver: AssetHubWestendReceiver::get(), - args: TestArgs::new_para(destination, beneficiary_id, amount_to_send, assets, None, 0), + sender: sender.clone(), + receiver: receiver.clone(), + args: TestArgs::new_para( + destination.clone(), + receiver.clone(), + amount_to_send, + assets.clone(), + None, + 0, + ), }; - let mut test = ParaToSystemParaTest::new(test_args); - let sender_balance_before = test.sender.balance; + // Query initial balances + let sender_assets_before = PenpalA::execute_with(|| { + type ForeignAssets = ::ForeignAssets; + >::balance(system_para_native_asset_location, &sender) + }); let receiver_balance_before = test.receiver.balance; - let penpal_location_as_seen_by_ahw = AssetHubWestend::sibling_location_of(PenpalB::para_id()); - let sov_penpal_on_ahw = - AssetHubWestend::sovereign_account_id_of(penpal_location_as_seen_by_ahw); - - // fund the Penpal's SA on AHW with the native tokens held in reserve - AssetHubWestend::fund_accounts(vec![(sov_penpal_on_ahw.into(), amount_to_send * 2)]); - - test.set_assertion::(para_to_system_para_sender_assertions); + // Set assertions and dispatchables + test.set_assertion::(para_to_system_para_sender_assertions); test.set_assertion::(para_to_system_para_receiver_assertions); - test.set_dispatchable::(para_to_system_para_reserve_transfer_assets); + test.set_dispatchable::(para_to_system_para_reserve_transfer_assets); test.assert(); - let sender_balance_after = test.sender.balance; - let receiver_balance_after = test.receiver.balance; - - let delivery_fees = PenpalB::execute_with(|| { - xcm_helpers::transfer_assets_delivery_fees::< - ::XcmSender, - >(test.args.assets.clone(), 0, test.args.weight_limit, test.args.beneficiary, test.args.dest) + // Query final balances + let sender_assets_after = PenpalA::execute_with(|| { + type ForeignAssets = ::ForeignAssets; + >::balance(system_para_native_asset_location, &sender) }); + let receiver_balance_after = test.receiver.balance; - // Sender's balance is reduced - assert_eq!(sender_balance_before - amount_to_send - delivery_fees, sender_balance_after); + // Sender's balance is reduced by amount sent plus delivery fees + assert!(sender_assets_after < sender_assets_before - amount_to_send); // Receiver's balance is increased assert!(receiver_balance_after > receiver_balance_before); // Receiver's balance increased by `amount_to_send - delivery_fees - bought_execution`; @@ -475,36 +777,27 @@ fn reserve_transfer_native_asset_from_para_to_system_para() { assert!(receiver_balance_after < receiver_balance_before + amount_to_send); } +// ========================================================================= +// ======= Reserve Transfers - Non-system Asset - AssetHub<>Parachain ====== +// ========================================================================= /// Reserve Transfers of a local asset and native asset from System Parachain to Parachain should /// work #[test] fn reserve_transfer_assets_from_system_para_to_para() { - // Force create asset on AssetHubWestend and PenpalB from Relay Chain - AssetHubWestend::force_create_and_mint_asset( - ASSET_ID, - ASSET_MIN_BALANCE, - true, - AssetHubWestendSender::get(), - Some(Weight::from_parts(1_019_445_000, 200_000)), - ASSET_MIN_BALANCE * 1_000_000, - ); - PenpalB::force_create_and_mint_asset( - ASSET_ID, - ASSET_MIN_BALANCE, - false, - PenpalBSender::get(), - None, - 0, - ); - // Init values for System Parachain - let destination = AssetHubWestend::sibling_location_of(PenpalB::para_id()); - let beneficiary_id = PenpalBReceiver::get(); - let fee_amount_to_send = ASSET_HUB_WESTEND_ED * 1000; - let asset_amount_to_send = ASSET_MIN_BALANCE * 1000; + let destination = AssetHubWestend::sibling_location_of(PenpalA::para_id()); + let sov_penpal_on_ahr = AssetHubWestend::sovereign_account_id_of(destination.clone()); + let sender = AssetHubWestendSender::get(); + let fee_amount_to_send = ASSET_HUB_WESTEND_ED * 100; + let asset_amount_to_send = ASSET_HUB_WESTEND_ED * 100; + let asset_owner = AssetHubWestendAssetOwner::get(); + let asset_owner_signer = ::RuntimeOrigin::signed(asset_owner.clone()); let assets: Assets = vec![ (Parent, fee_amount_to_send).into(), - ([PalletInstance(ASSETS_PALLET_ID), GeneralIndex(ASSET_ID.into())], asset_amount_to_send) + ( + [PalletInstance(ASSETS_PALLET_ID), GeneralIndex(RESERVABLE_ASSET_ID.into())], + asset_amount_to_send, + ) .into(), ] .into(); @@ -513,49 +806,212 @@ fn reserve_transfer_assets_from_system_para_to_para() { .iter() .position(|r| r == &(Parent, fee_amount_to_send).into()) .unwrap() as u32; + AssetHubWestend::mint_asset( + asset_owner_signer, + RESERVABLE_ASSET_ID, + asset_owner, + asset_amount_to_send * 2, + ); + + // Create SA-of-Penpal-on-AHR with ED. + AssetHubWestend::fund_accounts(vec![(sov_penpal_on_ahr.into(), ASSET_HUB_WESTEND_ED)]); + + // Init values for Parachain + let receiver = PenpalAReceiver::get(); + let system_para_native_asset_location = + v3::Location::try_from(RelayLocation::get()).expect("conversion works"); + let system_para_foreign_asset_location = + v3::Location::try_from(PenpalLocalReservableFromAssetHub::get()).expect("conversion works"); + // Init Test let para_test_args = TestContext { - sender: AssetHubWestendSender::get(), - receiver: PenpalBReceiver::get(), + sender: sender.clone(), + receiver: receiver.clone(), args: TestArgs::new_para( destination, - beneficiary_id, + receiver.clone(), asset_amount_to_send, assets, None, fee_asset_index, ), }; - let mut test = SystemParaToParaTest::new(para_test_args); - // Create SA-of-Penpal-on-AHW with ED. - let penpal_location = AssetHubWestend::sibling_location_of(PenpalB::para_id()); - let sov_penpal_on_ahw = AssetHubWestend::sovereign_account_id_of(penpal_location); - AssetHubWestend::fund_accounts(vec![(sov_penpal_on_ahw.into(), WESTEND_ED)]); - + // Query initial balances let sender_balance_before = test.sender.balance; - let receiver_balance_before = test.receiver.balance; - let sender_assets_before = AssetHubWestend::execute_with(|| { type Assets = ::Assets; - >::balance(ASSET_ID, &AssetHubWestendSender::get()) + >::balance(RESERVABLE_ASSET_ID, &sender) }); - let receiver_assets_before = PenpalB::execute_with(|| { - type Assets = ::Assets; - >::balance(ASSET_ID, &PenpalBReceiver::get()) + let receiver_system_native_assets_before = PenpalA::execute_with(|| { + type ForeignAssets = ::ForeignAssets; + >::balance(system_para_native_asset_location, &receiver) + }); + let receiver_foreign_assets_before = PenpalA::execute_with(|| { + type ForeignAssets = ::ForeignAssets; + >::balance(system_para_foreign_asset_location, &receiver) }); + // Set assertions and dispatchables test.set_assertion::(system_para_to_para_assets_sender_assertions); - test.set_assertion::(system_para_to_para_assets_receiver_assertions); + test.set_assertion::(system_para_to_para_assets_receiver_assertions); test.set_dispatchable::(system_para_to_para_reserve_transfer_assets); test.assert(); + // Query final balances let sender_balance_after = test.sender.balance; - let receiver_balance_after = test.receiver.balance; - + let sender_assets_after = AssetHubWestend::execute_with(|| { + type Assets = ::Assets; + >::balance(RESERVABLE_ASSET_ID, &sender) + }); + let receiver_system_native_assets_after = PenpalA::execute_with(|| { + type ForeignAssets = ::ForeignAssets; + >::balance(system_para_native_asset_location, &receiver) + }); + let receiver_foreign_assets_after = PenpalA::execute_with(|| { + type ForeignAssets = ::ForeignAssets; + >::balance(system_para_foreign_asset_location, &receiver) + }); // Sender's balance is reduced assert!(sender_balance_after < sender_balance_before); + // Receiver's foreign asset balance is increased + assert!(receiver_foreign_assets_after > receiver_foreign_assets_before); + // Receiver's system asset balance increased by `amount_to_send - delivery_fees - + // bought_execution`; `delivery_fees` might be paid from transfer or JIT, also + // `bought_execution` is unknown but should be non-zero + assert!( + receiver_system_native_assets_after < + receiver_system_native_assets_before + fee_amount_to_send + ); + + // Sender's asset balance is reduced by exact amount + assert_eq!(sender_assets_before - asset_amount_to_send, sender_assets_after); + // Receiver's foreign asset balance is increased by exact amount + assert_eq!( + receiver_foreign_assets_after, + receiver_foreign_assets_before + asset_amount_to_send + ); +} + +/// Reserve Transfers of a foreign asset and native asset from Parachain to System Para should +/// work +#[test] +fn reserve_transfer_assets_from_para_to_system_para() { + // Init values for Parachain + let destination = PenpalA::sibling_location_of(AssetHubWestend::para_id()); + let sender = PenpalASender::get(); + let fee_amount_to_send = ASSET_HUB_WESTEND_ED * 100; + let asset_amount_to_send = ASSET_HUB_WESTEND_ED * 100; + let penpal_asset_owner = PenpalAssetOwner::get(); + let penpal_asset_owner_signer = ::RuntimeOrigin::signed(penpal_asset_owner); + let asset_location_on_penpal = + v3::Location::try_from(PenpalLocalReservableFromAssetHub::get()).expect("conversion works"); + let asset_location_on_penpal_latest: Location = asset_location_on_penpal.try_into().unwrap(); + let system_asset_location_on_penpal = + v3::Location::try_from(RelayLocation::get()).expect("conversion works"); + let assets: Assets = vec![ + (Parent, fee_amount_to_send).into(), + (asset_location_on_penpal_latest, asset_amount_to_send).into(), + ] + .into(); + let fee_asset_index = assets + .inner() + .iter() + .position(|r| r == &(Parent, fee_amount_to_send).into()) + .unwrap() as u32; + // Fund Parachain's sender account with some foreign assets + PenpalA::mint_foreign_asset( + penpal_asset_owner_signer.clone(), + asset_location_on_penpal, + sender.clone(), + asset_amount_to_send * 2, + ); + // Fund Parachain's sender account with some system assets + PenpalA::mint_foreign_asset( + penpal_asset_owner_signer, + system_asset_location_on_penpal, + sender.clone(), + fee_amount_to_send * 2, + ); + + // Init values for System Parachain + let receiver = AssetHubWestendReceiver::get(); + let penpal_location_as_seen_by_ahr = AssetHubWestend::sibling_location_of(PenpalA::para_id()); + let sov_penpal_on_ahr = + AssetHubWestend::sovereign_account_id_of(penpal_location_as_seen_by_ahr); + let system_para_native_asset_location = + v3::Location::try_from(RelayLocation::get()).expect("conversion works"); + let system_para_foreign_asset_location = + v3::Location::try_from(PenpalLocalReservableFromAssetHub::get()).expect("conversion works"); + let ah_asset_owner = AssetHubWestendAssetOwner::get(); + let ah_asset_owner_signer = ::RuntimeOrigin::signed(ah_asset_owner); + + // Fund SA-of-Penpal-on-AHR to be able to pay for the fees. + AssetHubWestend::fund_accounts(vec![( + sov_penpal_on_ahr.clone().into(), + ASSET_HUB_WESTEND_ED * 1000, + )]); + // Fund SA-of-Penpal-on-AHR to be able to pay for the sent amount. + AssetHubWestend::mint_asset( + ah_asset_owner_signer, + RESERVABLE_ASSET_ID, + sov_penpal_on_ahr, + asset_amount_to_send * 2, + ); + + // Init Test + let para_test_args = TestContext { + sender: sender.clone(), + receiver: receiver.clone(), + args: TestArgs::new_para( + destination, + receiver.clone(), + asset_amount_to_send, + assets, + None, + fee_asset_index, + ), + }; + let mut test = ParaToSystemParaTest::new(para_test_args); + + // Query initial balances + let sender_system_assets_before = PenpalA::execute_with(|| { + type ForeignAssets = ::ForeignAssets; + >::balance(system_para_native_asset_location, &sender) + }); + let sender_foreign_assets_before = PenpalA::execute_with(|| { + type ForeignAssets = ::ForeignAssets; + >::balance(system_para_foreign_asset_location, &sender) + }); + let receiver_balance_before = test.receiver.balance; + let receiver_assets_before = AssetHubWestend::execute_with(|| { + type Assets = ::Assets; + >::balance(RESERVABLE_ASSET_ID, &receiver) + }); + + // Set assertions and dispatchables + test.set_assertion::(para_to_system_para_assets_sender_assertions); + test.set_assertion::(para_to_system_para_assets_receiver_assertions); + test.set_dispatchable::(para_to_system_para_reserve_transfer_assets); + test.assert(); + + // Query final balances + let sender_system_assets_after = PenpalA::execute_with(|| { + type ForeignAssets = ::ForeignAssets; + >::balance(system_para_native_asset_location, &sender) + }); + let sender_foreign_assets_after = PenpalA::execute_with(|| { + type ForeignAssets = ::ForeignAssets; + >::balance(system_para_foreign_asset_location, &sender) + }); + let receiver_balance_after = test.receiver.balance; + let receiver_assets_after = AssetHubWestend::execute_with(|| { + type Assets = ::Assets; + >::balance(RESERVABLE_ASSET_ID, &receiver) + }); + // Sender's system asset balance is reduced + assert!(sender_system_assets_after < sender_system_assets_before); // Receiver's balance is increased assert!(receiver_balance_after > receiver_balance_before); // Receiver's balance increased by `amount_to_send - delivery_fees - bought_execution`; @@ -563,65 +1019,81 @@ fn reserve_transfer_assets_from_system_para_to_para() { // should be non-zero assert!(receiver_balance_after < receiver_balance_before + fee_amount_to_send); - let sender_assets_after = AssetHubWestend::execute_with(|| { - type Assets = ::Assets; - >::balance(ASSET_ID, &AssetHubWestendSender::get()) - }); - let receiver_assets_after = PenpalB::execute_with(|| { - type Assets = ::Assets; - >::balance(ASSET_ID, &PenpalBReceiver::get()) - }); - - // Sender's balance is reduced by exact amount - assert_eq!(sender_assets_before - asset_amount_to_send, sender_assets_after); - // Receiver's balance is increased by exact amount + // Sender's asset balance is reduced by exact amount + assert_eq!(sender_foreign_assets_before - asset_amount_to_send, sender_foreign_assets_after); + // Receiver's foreign asset balance is increased by exact amount assert_eq!(receiver_assets_after, receiver_assets_before + asset_amount_to_send); } +// ========================================================================= +// ===== Reserve Transfers - Native Asset - Parachain<>Relay<>Parachain ==== +// ========================================================================= /// Reserve Transfers of native asset from Parachain to Parachain (through Relay reserve) should /// work #[test] -fn reserve_transfer_native_asset_from_para_to_para() { - // Init values for Penpal Parachain - let destination = PenpalB::sibling_location_of(PenpalA::para_id()); - let beneficiary_id = PenpalAReceiver::get(); - let amount_to_send: Balance = ASSET_HUB_WESTEND_ED * 1000; +fn reserve_transfer_native_asset_from_para_to_para_trough_relay() { + // Init values for Parachain Origin + let destination = PenpalA::sibling_location_of(PenpalB::para_id()); + let sender = PenpalASender::get(); + let amount_to_send: Balance = WESTEND_ED * 10000; + let asset_owner = PenpalAssetOwner::get(); let assets = (Parent, amount_to_send).into(); + let relay_native_asset_location = + v3::Location::try_from(RelayLocation::get()).expect("conversion works"); + let sender_as_seen_by_relay = Westend::child_location_of(PenpalA::para_id()); + let sov_of_sender_on_relay = Westend::sovereign_account_id_of(sender_as_seen_by_relay); - let test_args = TestContext { - sender: PenpalBSender::get(), - receiver: PenpalAReceiver::get(), - args: TestArgs::new_para(destination, beneficiary_id, amount_to_send, assets, None, 0), - }; + // fund Parachain's sender account + PenpalA::mint_foreign_asset( + ::RuntimeOrigin::signed(asset_owner), + relay_native_asset_location, + sender.clone(), + amount_to_send * 2, + ); - let mut test = ParaToParaTest::new(test_args); + // fund the Parachain Origin's SA on Relay Chain with the native tokens held in reserve + Westend::fund_accounts(vec![(sov_of_sender_on_relay.into(), amount_to_send * 2)]); - let sender_balance_before = test.sender.balance; - let receiver_balance_before = test.receiver.balance; + // Init values for Parachain Destination + let receiver = PenpalBReceiver::get(); - let sender_as_seen_by_relay = Westend::child_location_of(PenpalB::para_id()); - let sov_of_sender_on_relay = Westend::sovereign_account_id_of(sender_as_seen_by_relay); + // Init Test + let test_args = TestContext { + sender: sender.clone(), + receiver: receiver.clone(), + args: TestArgs::new_para(destination, receiver.clone(), amount_to_send, assets, None, 0), + }; + let mut test = ParaToParaThroughRelayTest::new(test_args); - // fund the PenpalB's SA on Westend with the native tokens held in reserve - Westend::fund_accounts(vec![(sov_of_sender_on_relay.into(), amount_to_send * 2)]); + // Query initial balances + let sender_assets_before = PenpalA::execute_with(|| { + type ForeignAssets = ::ForeignAssets; + >::balance(relay_native_asset_location, &sender) + }); + let receiver_assets_before = PenpalB::execute_with(|| { + type ForeignAssets = ::ForeignAssets; + >::balance(relay_native_asset_location, &receiver) + }); - test.set_assertion::(para_to_para_sender_assertions); + // Set assertions and dispatchables + test.set_assertion::(para_to_para_through_relay_sender_assertions); test.set_assertion::(para_to_para_relay_hop_assertions); - test.set_assertion::(para_to_para_receiver_assertions); - test.set_dispatchable::(para_to_para_limited_reserve_transfer_assets); + test.set_assertion::(para_to_para_through_relay_receiver_assertions); + test.set_dispatchable::(para_to_para_through_relay_limited_reserve_transfer_assets); test.assert(); - let sender_balance_after = test.sender.balance; - let receiver_balance_after = test.receiver.balance; - - let delivery_fees = PenpalB::execute_with(|| { - xcm_helpers::transfer_assets_delivery_fees::< - ::XcmSender, - >(test.args.assets.clone(), 0, test.args.weight_limit, test.args.beneficiary, test.args.dest) + // Query final balances + let sender_assets_after = PenpalA::execute_with(|| { + type ForeignAssets = ::ForeignAssets; + >::balance(relay_native_asset_location, &sender) + }); + let receiver_assets_after = PenpalB::execute_with(|| { + type ForeignAssets = ::ForeignAssets; + >::balance(relay_native_asset_location, &receiver) }); - // Sender's balance is reduced - assert_eq!(sender_balance_before - amount_to_send - delivery_fees, sender_balance_after); + // Sender's balance is reduced by amount sent plus delivery fees + assert!(sender_assets_after < sender_assets_before - amount_to_send); // Receiver's balance is increased - assert!(receiver_balance_after > receiver_balance_before); + assert!(receiver_assets_after > receiver_assets_before); } diff --git a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/send.rs b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/send.rs index a3cd5c5803eef3937e2a8e5c33894b369cb5cc31..f218b539c387988f70314eff41c2e1ce4e97092b 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/send.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/send.rs @@ -13,7 +13,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -use crate::*; +use crate::imports::*; /// Relay Chain should be able to execute `Transact` instructions in System Parachain /// when `OriginKind::Superuser`. @@ -28,12 +28,99 @@ fn send_transact_as_superuser_from_relay_to_system_para_works() { ) } -/// Parachain should be able to send XCM paying its fee with sufficient asset -/// in the System Parachain +/// We tests two things here: +/// - Parachain should be able to send XCM paying its fee with system asset in the System Parachain +/// - Parachain should be able to create a new Foreign Asset in the System Parachain +#[test] +fn send_xcm_from_para_to_system_para_paying_fee_with_system_assets_works() { + let para_sovereign_account = AssetHubWestend::sovereign_account_id_of( + AssetHubWestend::sibling_location_of(PenpalA::para_id()), + ); + let asset_location_on_penpal = v3::Location::new( + 0, + [ + v3::Junction::PalletInstance(ASSETS_PALLET_ID), + v3::Junction::GeneralIndex(ASSET_ID.into()), + ], + ); + let foreign_asset_at_asset_hub = + v3::Location::new(1, [v3::Junction::Parachain(PenpalA::para_id().into())]) + .appended_with(asset_location_on_penpal) + .unwrap(); + + // Encoded `create_asset` call to be executed in AssetHub + let call = AssetHubWestend::create_foreign_asset_call( + foreign_asset_at_asset_hub, + ASSET_MIN_BALANCE, + para_sovereign_account.clone(), + ); + + let origin_kind = OriginKind::Xcm; + let fee_amount = ASSET_HUB_WESTEND_ED * 1000000; + let system_asset = (Parent, fee_amount).into(); + + let root_origin = ::RuntimeOrigin::root(); + let system_para_destination = PenpalA::sibling_location_of(AssetHubWestend::para_id()).into(); + let xcm = xcm_transact_paid_execution( + call, + origin_kind, + system_asset, + para_sovereign_account.clone(), + ); + + // SA-of-Penpal-on-AHR needs to have balance to pay for fees and asset creation deposit + AssetHubWestend::fund_accounts(vec![( + para_sovereign_account.clone().into(), + ASSET_HUB_WESTEND_ED * 10000000000, + )]); + + PenpalA::execute_with(|| { + assert_ok!(::PolkadotXcm::send_blob( + root_origin, + bx!(system_para_destination), + xcm.encode().try_into().unwrap(), + )); + + PenpalA::assert_xcm_pallet_sent(); + }); + + AssetHubWestend::execute_with(|| { + type RuntimeEvent = ::RuntimeEvent; + + AssetHubWestend::assert_xcmp_queue_success(Some(Weight::from_parts( + 15_594_564_000, + 562_893, + ))); + + assert_expected_events!( + AssetHubWestend, + vec![ + // Burned the fee + RuntimeEvent::Balances(pallet_balances::Event::Burned { who, amount }) => { + who: *who == para_sovereign_account, + amount: *amount == fee_amount, + }, + // Foreign Asset created + RuntimeEvent::ForeignAssets(pallet_assets::Event::Created { asset_id, creator, owner }) => { + asset_id: *asset_id == foreign_asset_at_asset_hub, + creator: *creator == para_sovereign_account.clone(), + owner: *owner == para_sovereign_account, + }, + ] + ); + + type ForeignAssets = ::ForeignAssets; + assert!(ForeignAssets::asset_exists(foreign_asset_at_asset_hub)); + }); +} + +/// We tests two things here: +/// - Parachain should be able to send XCM paying its fee with system assets in the System Parachain +/// - Parachain should be able to create a new Asset in the System Parachain #[test] fn send_xcm_from_para_to_system_para_paying_fee_with_assets_works() { let para_sovereign_account = AssetHubWestend::sovereign_account_id_of( - AssetHubWestend::sibling_location_of(PenpalB::para_id()), + AssetHubWestend::sibling_location_of(PenpalA::para_id()), ); // Force create and mint assets for Parachain's sovereign account @@ -46,57 +133,63 @@ fn send_xcm_from_para_to_system_para_paying_fee_with_assets_works() { ASSET_MIN_BALANCE * 1000000000, ); - // We just need a call that can pass the `SafeCallFilter` - // Call values are not relevant - let call = AssetHubWestend::force_create_asset_call( - ASSET_ID, - para_sovereign_account.clone(), - true, + // Just a different `asset_id`` that does not exist yet + let new_asset_id = ASSET_ID + 1; + + // Encoded `create_asset` call to be executed in AssetHub + let call = AssetHubWestend::create_asset_call( + new_asset_id, ASSET_MIN_BALANCE, + para_sovereign_account.clone(), ); let origin_kind = OriginKind::SovereignAccount; let fee_amount = ASSET_MIN_BALANCE * 1000000; - let native_asset = + let asset = ([PalletInstance(ASSETS_PALLET_ID), GeneralIndex(ASSET_ID.into())], fee_amount).into(); - let root_origin = ::RuntimeOrigin::root(); - let system_para_destination = PenpalB::sibling_location_of(AssetHubWestend::para_id()).into(); - let xcm = xcm_transact_paid_execution( - call, - origin_kind, - native_asset, - para_sovereign_account.clone(), - ); + let root_origin = ::RuntimeOrigin::root(); + let system_para_destination = PenpalA::sibling_location_of(AssetHubWestend::para_id()).into(); + let xcm = xcm_transact_paid_execution(call, origin_kind, asset, para_sovereign_account.clone()); - PenpalB::execute_with(|| { - assert_ok!(::PolkadotXcm::send( + // SA-of-Penpal-on-AHR needs to have balance to pay for asset creation deposit + AssetHubWestend::fund_accounts(vec![( + para_sovereign_account.clone().into(), + ASSET_HUB_WESTEND_ED * 10000000000, + )]); + + PenpalA::execute_with(|| { + assert_ok!(::PolkadotXcm::send_blob( root_origin, bx!(system_para_destination), - bx!(xcm), + xcm.encode().try_into().unwrap(), )); - PenpalB::assert_xcm_pallet_sent(); + PenpalA::assert_xcm_pallet_sent(); }); AssetHubWestend::execute_with(|| { type RuntimeEvent = ::RuntimeEvent; AssetHubWestend::assert_xcmp_queue_success(Some(Weight::from_parts( - 16_290_336_000, + 15_594_564_000, 562_893, ))); assert_expected_events!( AssetHubWestend, vec![ + // Burned the fee RuntimeEvent::Assets(pallet_assets::Event::Burned { asset_id, owner, balance }) => { asset_id: *asset_id == ASSET_ID, owner: *owner == para_sovereign_account, balance: *balance == fee_amount, }, - RuntimeEvent::Assets(pallet_assets::Event::Issued { asset_id, .. }) => { - asset_id: *asset_id == ASSET_ID, + // Asset created + RuntimeEvent::Assets(pallet_assets::Event::Created { asset_id, creator, owner }) => { + asset_id: *asset_id == new_asset_id, + creator: *creator == para_sovereign_account.clone(), + owner: *owner == para_sovereign_account, }, ] ); diff --git a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/set_xcm_versions.rs b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/set_xcm_versions.rs index 130454551d2cadc8866128f81cf3f5e6e33cc356..474e9a86ccc22777bc4f2ac574ef70ec39843a45 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/set_xcm_versions.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/set_xcm_versions.rs @@ -13,7 +13,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -use crate::*; +use crate::imports::*; #[test] fn relay_sets_system_para_xcm_supported_version() { diff --git a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/swap.rs b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/swap.rs index b39cc2159de8d407f8ef9b91c32549b2d43411a4..aa673c03483af13cae2ac146049399644b265b6b 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/swap.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/swap.rs @@ -13,8 +13,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -use crate::*; -use westend_system_emulated_network::penpal_emulated_chain::LocalTeleportableToAssetHubV3 as PenpalLocalTeleportableToAssetHubV3; +use crate::imports::*; #[test] fn swap_locally_on_chain_using_local_assets() { @@ -112,49 +111,39 @@ fn swap_locally_on_chain_using_local_assets() { #[test] fn swap_locally_on_chain_using_foreign_assets() { - let asset_native = Box::new(asset_hub_westend_runtime::xcm_config::WestendLocationV3::get()); - let ah_as_seen_by_penpal = PenpalB::sibling_location_of(AssetHubWestend::para_id()); - let asset_location_on_penpal = PenpalLocalTeleportableToAssetHubV3::get(); - let asset_id_on_penpal = match asset_location_on_penpal.last() { - Some(v3::Junction::GeneralIndex(id)) => *id as u32, - _ => unreachable!(), - }; - let asset_owner_on_penpal = PenpalBSender::get(); + let asset_native = + Box::new(v3::Location::try_from(RelayLocation::get()).expect("conversion works")); + let asset_location_on_penpal = + v3::Location::try_from(PenpalLocalTeleportableToAssetHub::get()).expect("conversion_works"); let foreign_asset_at_asset_hub_westend = - v3::Location::new(1, [v3::Junction::Parachain(PenpalB::para_id().into())]) + v3::Location::new(1, [v3::Junction::Parachain(PenpalA::para_id().into())]) .appended_with(asset_location_on_penpal) .unwrap(); - // 1. Create asset on penpal and, 2. Create foreign asset on asset_hub_westend - super::penpal_create_foreign_asset_on_asset_hub( - asset_id_on_penpal, - foreign_asset_at_asset_hub_westend, - ah_as_seen_by_penpal, - true, - asset_owner_on_penpal, - ASSET_MIN_BALANCE * 1_000_000, - ); - - let penpal_as_seen_by_ah = AssetHubWestend::sibling_location_of(PenpalB::para_id()); - let sov_penpal_on_ahw = AssetHubWestend::sovereign_account_id_of(penpal_as_seen_by_ah); + let penpal_as_seen_by_ah = AssetHubWestend::sibling_location_of(PenpalA::para_id()); + let sov_penpal_on_ahr = AssetHubWestend::sovereign_account_id_of(penpal_as_seen_by_ah); AssetHubWestend::fund_accounts(vec![ - (AssetHubWestendSender::get().into(), 5_000_000 * WESTEND_ED), /* An account to swap dot - * for something else. */ + // An account to swap dot for something else. + (AssetHubWestendSender::get().into(), 5_000_000 * ASSET_HUB_WESTEND_ED), + // Penpal's sovereign account in AH should have some balance + (sov_penpal_on_ahr.clone().into(), 100_000_000 * ASSET_HUB_WESTEND_ED), ]); AssetHubWestend::execute_with(|| { - // 3: Mint foreign asset on asset_hub_westend: + // 0: No need to create foreign asset as it exists in genesis. + // + // 1: Mint foreign asset on asset_hub_westend: // // (While it might be nice to use batch, // currently that's disabled due to safe call filters.) type RuntimeEvent = ::RuntimeEvent; - // 3. Mint foreign asset (in reality this should be a teleport or some such) + // 1. Mint foreign asset (in reality this should be a teleport or some such) assert_ok!(::ForeignAssets::mint( - ::RuntimeOrigin::signed(sov_penpal_on_ahw.clone().into()), + ::RuntimeOrigin::signed(sov_penpal_on_ahr.clone().into()), foreign_asset_at_asset_hub_westend, - sov_penpal_on_ahw.clone().into(), - 3_000_000_000_000, + sov_penpal_on_ahr.clone().into(), + ASSET_HUB_WESTEND_ED * 3_000_000_000_000, )); assert_expected_events!( @@ -164,7 +153,7 @@ fn swap_locally_on_chain_using_foreign_assets() { ] ); - // 4. Create pool: + // 2. Create pool: assert_ok!(::AssetConversion::create_pool( ::RuntimeOrigin::signed(AssetHubWestendSender::get()), asset_native.clone(), @@ -178,58 +167,60 @@ fn swap_locally_on_chain_using_foreign_assets() { ] ); - // 5. Add liquidity: + // 3. Add liquidity: assert_ok!(::AssetConversion::add_liquidity( - ::RuntimeOrigin::signed(sov_penpal_on_ahw.clone()), + ::RuntimeOrigin::signed(sov_penpal_on_ahr.clone()), asset_native.clone(), Box::new(foreign_asset_at_asset_hub_westend), - 1_000_000_000_000, - 2_000_000_000_000, + 1_000_000_000_000_000, + 2_000_000_000_000_000, 0, 0, - sov_penpal_on_ahw.clone().into() + sov_penpal_on_ahr.clone().into() )); assert_expected_events!( AssetHubWestend, vec![ RuntimeEvent::AssetConversion(pallet_asset_conversion::Event::LiquidityAdded {lp_token_minted, .. }) => { - lp_token_minted: *lp_token_minted == 1414213562273, + lp_token_minted: *lp_token_minted == 1414213562372995, }, ] ); - // 6. Swap! + // 4. Swap! let path = vec![asset_native.clone(), Box::new(foreign_asset_at_asset_hub_westend)]; - assert_ok!(::AssetConversion::swap_exact_tokens_for_tokens( - ::RuntimeOrigin::signed(AssetHubWestendSender::get()), - path, - 100000, - 1000, - AssetHubWestendSender::get().into(), - true - )); + assert_ok!( + ::AssetConversion::swap_exact_tokens_for_tokens( + ::RuntimeOrigin::signed(AssetHubWestendSender::get()), + path, + 100000 * ASSET_HUB_WESTEND_ED, + 1000 * ASSET_HUB_WESTEND_ED, + AssetHubWestendSender::get().into(), + true + ) + ); assert_expected_events!( AssetHubWestend, vec![ RuntimeEvent::AssetConversion(pallet_asset_conversion::Event::SwapExecuted { amount_in, amount_out, .. },) => { - amount_in: *amount_in == 100000, - amount_out: *amount_out == 199399, + amount_in: *amount_in == 100000000000000, + amount_out: *amount_out == 181322178776029, }, ] ); - // 7. Remove liquidity + // 5. Remove liquidity assert_ok!(::AssetConversion::remove_liquidity( - ::RuntimeOrigin::signed(sov_penpal_on_ahw.clone()), + ::RuntimeOrigin::signed(sov_penpal_on_ahr.clone()), asset_native.clone(), Box::new(foreign_asset_at_asset_hub_westend), - 1414213562273 - 2_000_000_000, // all but the 2 EDs can't be retrieved. + 1414213562372995 - ASSET_HUB_WESTEND_ED * 2, // all but the 2 EDs can't be retrieved. 0, 0, - sov_penpal_on_ahw.into(), + sov_penpal_on_ahr.clone().into(), )); }); } @@ -283,7 +274,7 @@ fn pay_xcm_fee_with_some_asset_swapped_for_native() { .into(), }; let penpal = AssetHubWestend::sovereign_account_id_of(AssetHubWestend::sibling_location_of( - PenpalB::para_id(), + PenpalA::para_id(), )); AssetHubWestend::execute_with(|| { @@ -356,7 +347,7 @@ fn pay_xcm_fee_with_some_asset_swapped_for_native() { )); }); - PenpalB::execute_with(|| { + PenpalA::execute_with(|| { // send xcm transact from `penpal` account which as only `ASSET_ID` tokens on // `AssetHubWestend` let call = AssetHubWestend::force_create_asset_call( @@ -366,11 +357,11 @@ fn pay_xcm_fee_with_some_asset_swapped_for_native() { ASSET_MIN_BALANCE, ); - let penpal_root = ::RuntimeOrigin::root(); + let penpal_root = ::RuntimeOrigin::root(); let fee_amount = 4_000_000_000_000u128; let asset_one = ([PalletInstance(ASSETS_PALLET_ID), GeneralIndex(ASSET_ID.into())], fee_amount).into(); - let asset_hub_location = PenpalB::sibling_location_of(AssetHubWestend::para_id()).into(); + let asset_hub_location = PenpalA::sibling_location_of(AssetHubWestend::para_id()).into(); let xcm = xcm_transact_paid_execution( call, OriginKind::SovereignAccount, @@ -378,13 +369,13 @@ fn pay_xcm_fee_with_some_asset_swapped_for_native() { penpal.clone(), ); - assert_ok!(::PolkadotXcm::send( + assert_ok!(::PolkadotXcm::send_blob( penpal_root, bx!(asset_hub_location), - bx!(xcm), + xcm.encode().try_into().unwrap(), )); - PenpalB::assert_xcm_pallet_sent(); + PenpalA::assert_xcm_pallet_sent(); }); AssetHubWestend::execute_with(|| { diff --git a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/teleport.rs b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/teleport.rs index 01498f7bb4e3b525d5edff164a7fb18a035517e4..ac518d2ed4a445836364a23df313b319b8193e78 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/teleport.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/teleport.rs @@ -13,27 +13,23 @@ // See the License for the specific language governing permissions and // limitations under the License. -use crate::*; -use asset_hub_westend_runtime::xcm_config::XcmConfig as AssetHubWestendXcmConfig; -use emulated_integration_tests_common::xcm_helpers::non_fee_asset; -use westend_runtime::xcm_config::XcmConfig as WestendXcmConfig; -use westend_system_emulated_network::penpal_emulated_chain::LocalTeleportableToAssetHubV3 as PenpalLocalTeleportableToAssetHubV3; +use crate::imports::*; fn relay_origin_assertions(t: RelayToSystemParaTest) { type RuntimeEvent = ::RuntimeEvent; - Westend::assert_xcm_pallet_attempted_complete(Some(Weight::from_parts(632_207_000, 7_186))); + Westend::assert_xcm_pallet_attempted_complete(Some(Weight::from_parts(631_531_000, 7_186))); assert_expected_events!( Westend, vec![ // Amount to teleport is withdrawn from Sender - RuntimeEvent::Balances(pallet_balances::Event::Withdraw { who, amount }) => { + RuntimeEvent::Balances(pallet_balances::Event::Burned { who, amount }) => { who: *who == t.sender.account_id, amount: *amount == t.args.amount, }, // Amount to teleport is deposited in Relay's `CheckAccount` - RuntimeEvent::Balances(pallet_balances::Event::Deposit { who, amount }) => { + RuntimeEvent::Balances(pallet_balances::Event::Minted { who, amount }) => { who: *who == ::XcmPallet::check_account(), amount: *amount == t.args.amount, }, @@ -47,19 +43,19 @@ fn relay_dest_assertions(t: SystemParaToRelayTest) { Westend::assert_ump_queue_processed( true, Some(AssetHubWestend::para_id()), - Some(Weight::from_parts(308_222_000, 7_186)), + Some(Weight::from_parts(307_225_000, 7_186)), ); assert_expected_events!( Westend, vec![ // Amount is withdrawn from Relay Chain's `CheckAccount` - RuntimeEvent::Balances(pallet_balances::Event::Withdraw { who, amount }) => { + RuntimeEvent::Balances(pallet_balances::Event::Burned { who, amount }) => { who: *who == ::XcmPallet::check_account(), amount: *amount == t.args.amount, }, // Amount minus fees are deposited in Receiver's account - RuntimeEvent::Balances(pallet_balances::Event::Deposit { who, .. }) => { + RuntimeEvent::Balances(pallet_balances::Event::Minted { who, .. }) => { who: *who == t.receiver.account_id, }, ] @@ -70,7 +66,7 @@ fn relay_dest_assertions_fail(_t: SystemParaToRelayTest) { Westend::assert_ump_queue_processed( false, Some(AssetHubWestend::para_id()), - Some(Weight::from_parts(148_705_000, 3_593)), + Some(Weight::from_parts(157_718_000, 3_593)), ); } @@ -78,8 +74,8 @@ fn para_origin_assertions(t: SystemParaToRelayTest) { type RuntimeEvent = ::RuntimeEvent; AssetHubWestend::assert_xcm_pallet_attempted_complete(Some(Weight::from_parts( - 533_910_000, - 7167, + 720_053_000, + 7_203, ))); AssetHubWestend::assert_parachain_system_ump_sent(); @@ -88,7 +84,7 @@ fn para_origin_assertions(t: SystemParaToRelayTest) { AssetHubWestend, vec![ // Amount is withdrawn from Sender's account - RuntimeEvent::Balances(pallet_balances::Event::Withdraw { who, amount }) => { + RuntimeEvent::Balances(pallet_balances::Event::Burned { who, amount }) => { who: *who == t.sender.account_id, amount: *amount == t.args.amount, }, @@ -99,13 +95,13 @@ fn para_origin_assertions(t: SystemParaToRelayTest) { fn para_dest_assertions(t: RelayToSystemParaTest) { type RuntimeEvent = ::RuntimeEvent; - AssetHubWestend::assert_dmp_queue_complete(Some(Weight::from_parts(164_793_000, 3593))); + AssetHubWestend::assert_dmp_queue_complete(Some(Weight::from_parts(157_718_000, 3593))); assert_expected_events!( AssetHubWestend, vec![ // Amount minus fees are deposited in Receiver's account - RuntimeEvent::Balances(pallet_balances::Event::Deposit { who, .. }) => { + RuntimeEvent::Balances(pallet_balances::Event::Minted { who, .. }) => { who: *who == t.receiver.account_id, }, ] @@ -113,19 +109,22 @@ fn para_dest_assertions(t: RelayToSystemParaTest) { } fn penpal_to_ah_foreign_assets_sender_assertions(t: ParaToSystemParaTest) { - type RuntimeEvent = ::RuntimeEvent; - PenpalB::assert_xcm_pallet_attempted_complete(None); + type RuntimeEvent = ::RuntimeEvent; + let system_para_native_asset_location = + v3::Location::try_from(RelayLocation::get()).expect("conversion works"); let expected_asset_id = t.args.asset_id.unwrap(); let (_, expected_asset_amount) = non_fee_asset(&t.args.assets, t.args.fee_asset_item as usize).unwrap(); + + PenpalA::assert_xcm_pallet_attempted_complete(None); assert_expected_events!( - PenpalB, + PenpalA, vec![ - RuntimeEvent::Balances( - pallet_balances::Event::Withdraw { who, amount } + RuntimeEvent::ForeignAssets( + pallet_assets::Event::Burned { asset_id, owner, .. } ) => { - who: *who == t.sender.account_id, - amount: *amount == t.args.amount, + asset_id: *asset_id == system_para_native_asset_location, + owner: *owner == t.sender.account_id, }, RuntimeEvent::Assets(pallet_assets::Event::Burned { asset_id, owner, balance }) => { asset_id: *asset_id == expected_asset_id, @@ -139,22 +138,25 @@ fn penpal_to_ah_foreign_assets_sender_assertions(t: ParaToSystemParaTest) { fn penpal_to_ah_foreign_assets_receiver_assertions(t: ParaToSystemParaTest) { type RuntimeEvent = ::RuntimeEvent; let sov_penpal_on_ahr = AssetHubWestend::sovereign_account_id_of( - AssetHubWestend::sibling_location_of(PenpalB::para_id()), + AssetHubWestend::sibling_location_of(PenpalA::para_id()), ); let (expected_foreign_asset_id, expected_foreign_asset_amount) = non_fee_asset(&t.args.assets, t.args.fee_asset_item as usize).unwrap(); let expected_foreign_asset_id_v3: v3::Location = expected_foreign_asset_id.try_into().unwrap(); + + AssetHubWestend::assert_xcmp_queue_success(None); + assert_expected_events!( AssetHubWestend, vec![ // native asset reserve transfer for paying fees, withdrawn from Penpal's sov account RuntimeEvent::Balances( - pallet_balances::Event::Withdraw { who, amount } + pallet_balances::Event::Burned { who, amount } ) => { who: *who == sov_penpal_on_ahr.clone().into(), amount: *amount == t.args.amount, }, - RuntimeEvent::Balances(pallet_balances::Event::Deposit { who, .. }) => { + RuntimeEvent::Balances(pallet_balances::Event::Minted { who, .. }) => { who: *who == t.receiver.account_id, }, RuntimeEvent::ForeignAssets(pallet_assets::Event::Issued { asset_id, owner, amount }) => { @@ -163,9 +165,6 @@ fn penpal_to_ah_foreign_assets_receiver_assertions(t: ParaToSystemParaTest) { amount: *amount == expected_foreign_asset_amount, }, RuntimeEvent::Balances(pallet_balances::Event::Deposit { .. }) => {}, - RuntimeEvent::MessageQueue( - pallet_message_queue::Event::Processed { success: true, .. } - ) => {}, ] ); } @@ -200,13 +199,18 @@ fn ah_to_penpal_foreign_assets_sender_assertions(t: SystemParaToParaTest) { } fn ah_to_penpal_foreign_assets_receiver_assertions(t: SystemParaToParaTest) { - type RuntimeEvent = ::RuntimeEvent; + type RuntimeEvent = ::RuntimeEvent; let expected_asset_id = t.args.asset_id.unwrap(); let (_, expected_asset_amount) = non_fee_asset(&t.args.assets, t.args.fee_asset_item as usize).unwrap(); - let checking_account = ::PolkadotXcm::check_account(); + let checking_account = ::PolkadotXcm::check_account(); + let system_para_native_asset_location = + v3::Location::try_from(RelayLocation::get()).expect("conversion works"); + + PenpalA::assert_xcmp_queue_success(None); + assert_expected_events!( - PenpalB, + PenpalA, vec![ // checking account burns local asset as part of incoming teleport RuntimeEvent::Assets(pallet_assets::Event::Burned { asset_id, owner, balance }) => { @@ -221,12 +225,11 @@ fn ah_to_penpal_foreign_assets_receiver_assertions(t: SystemParaToParaTest) { amount: *amount == expected_asset_amount, }, // native asset for fee is deposited to receiver - RuntimeEvent::Balances(pallet_balances::Event::Deposit { who, .. }) => { - who: *who == t.receiver.account_id, + RuntimeEvent::ForeignAssets(pallet_assets::Event::Issued { asset_id, owner, amount }) => { + asset_id: *asset_id == system_para_native_asset_location, + owner: *owner == t.receiver.account_id, + amount: *amount == expected_asset_amount, }, - RuntimeEvent::MessageQueue( - pallet_message_queue::Event::Processed { success: true, .. } - ) => {}, ] ); } @@ -242,16 +245,6 @@ fn relay_limited_teleport_assets(t: RelayToSystemParaTest) -> DispatchResult { ) } -fn relay_teleport_assets(t: RelayToSystemParaTest) -> DispatchResult { - ::XcmPallet::teleport_assets( - t.signed_origin, - bx!(t.args.dest.into()), - bx!(t.args.beneficiary.into()), - bx!(t.args.assets.into()), - t.args.fee_asset_item, - ) -} - fn system_para_limited_teleport_assets(t: SystemParaToRelayTest) -> DispatchResult { ::PolkadotXcm::limited_teleport_assets( t.signed_origin, @@ -263,13 +256,14 @@ fn system_para_limited_teleport_assets(t: SystemParaToRelayTest) -> DispatchResu ) } -fn system_para_teleport_assets(t: SystemParaToRelayTest) -> DispatchResult { - ::PolkadotXcm::teleport_assets( +fn para_to_system_para_transfer_assets(t: ParaToSystemParaTest) -> DispatchResult { + ::PolkadotXcm::transfer_assets( t.signed_origin, bx!(t.args.dest.into()), bx!(t.args.beneficiary.into()), bx!(t.args.assets.into()), t.args.fee_asset_item, + t.args.weight_limit, ) } @@ -284,28 +278,17 @@ fn system_para_to_para_transfer_assets(t: SystemParaToParaTest) -> DispatchResul ) } -fn para_to_system_para_transfer_assets(t: ParaToSystemParaTest) -> DispatchResult { - ::PolkadotXcm::transfer_assets( - t.signed_origin, - bx!(t.args.dest.into()), - bx!(t.args.beneficiary.into()), - bx!(t.args.assets.into()), - t.args.fee_asset_item, - t.args.weight_limit, - ) -} - /// Limited Teleport of native asset from Relay Chain to the System Parachain should work #[test] fn limited_teleport_native_assets_from_relay_to_system_para_works() { // Init values for Relay Chain let amount_to_send: Balance = WESTEND_ED * 1000; let dest = Westend::child_location_of(AssetHubWestend::para_id()); - let beneficiary = AssetHubWestendReceiver::get(); + let beneficiary_id = AssetHubWestendReceiver::get(); let test_args = TestContext { sender: WestendSender::get(), - receiver: beneficiary.clone(), - args: TestArgs::new_relay(dest, beneficiary, amount_to_send), + receiver: AssetHubWestendReceiver::get(), + args: TestArgs::new_relay(dest, beneficiary_id, amount_to_send), }; let mut test = RelayToSystemParaTest::new(test_args); @@ -319,7 +302,7 @@ fn limited_teleport_native_assets_from_relay_to_system_para_works() { test.assert(); let delivery_fees = Westend::execute_with(|| { - xcm_helpers::transfer_assets_delivery_fees::< + xcm_helpers::teleport_assets_delivery_fees::< ::XcmSender, >(test.args.assets.clone(), 0, test.args.weight_limit, test.args.beneficiary, test.args.dest) }); @@ -366,7 +349,7 @@ fn limited_teleport_native_assets_back_from_system_para_to_relay_works() { let receiver_balance_after = test.receiver.balance; let delivery_fees = AssetHubWestend::execute_with(|| { - xcm_helpers::transfer_assets_delivery_fees::< + xcm_helpers::teleport_assets_delivery_fees::< ::XcmSender, >(test.args.assets.clone(), 0, test.args.weight_limit, test.args.beneficiary, test.args.dest) }); @@ -407,134 +390,11 @@ fn limited_teleport_native_assets_from_system_para_to_relay_fails() { let receiver_balance_after = test.receiver.balance; let delivery_fees = AssetHubWestend::execute_with(|| { - xcm_helpers::transfer_assets_delivery_fees::< - ::XcmSender, - >(test.args.assets.clone(), 0, test.args.weight_limit, test.args.beneficiary, test.args.dest) - }); - - // Sender's balance is reduced - assert_eq!(sender_balance_before - amount_to_send - delivery_fees, sender_balance_after); - // Receiver's balance does not change - assert_eq!(receiver_balance_after, receiver_balance_before); -} - -/// Teleport of native asset from Relay Chain to the System Parachain should work -#[test] -fn teleport_native_assets_from_relay_to_system_para_works() { - // Init values for Relay Chain - let amount_to_send: Balance = WESTEND_ED * 1000; - let dest = Westend::child_location_of(AssetHubWestend::para_id()); - let beneficiary = AssetHubWestendReceiver::get(); - let test_args = TestContext { - sender: WestendSender::get(), - receiver: beneficiary.clone(), - args: TestArgs::new_relay(dest, beneficiary, amount_to_send), - }; - - let mut test = RelayToSystemParaTest::new(test_args); - - let sender_balance_before = test.sender.balance; - let receiver_balance_before = test.receiver.balance; - - test.set_assertion::(relay_origin_assertions); - test.set_assertion::(para_dest_assertions); - test.set_dispatchable::(relay_teleport_assets); - test.assert(); - - let delivery_fees = Westend::execute_with(|| { - xcm_helpers::transfer_assets_delivery_fees::< - ::XcmSender, - >(test.args.assets.clone(), 0, test.args.weight_limit, test.args.beneficiary, test.args.dest) - }); - - let sender_balance_after = test.sender.balance; - let receiver_balance_after = test.receiver.balance; - - // Sender's balance is reduced - assert_eq!(sender_balance_before - amount_to_send - delivery_fees, sender_balance_after); - // Receiver's balance is increased - assert!(receiver_balance_after > receiver_balance_before); -} - -/// Teleport of native asset from System Parachains to the Relay Chain -/// should work when there is enough balance in Relay Chain's `CheckAccount` -#[test] -fn teleport_native_assets_back_from_system_para_to_relay_works() { - // Dependency - Relay Chain's `CheckAccount` should have enough balance - teleport_native_assets_from_relay_to_system_para_works(); - - // Init values for Relay Chain - let amount_to_send: Balance = ASSET_HUB_WESTEND_ED * 1000; - let destination = AssetHubWestend::parent_location(); - let beneficiary_id = WestendReceiver::get(); - let assets = (Parent, amount_to_send).into(); - - let test_args = TestContext { - sender: AssetHubWestendSender::get(), - receiver: WestendReceiver::get(), - args: TestArgs::new_para(destination, beneficiary_id, amount_to_send, assets, None, 0), - }; - - let mut test = SystemParaToRelayTest::new(test_args); - - let sender_balance_before = test.sender.balance; - let receiver_balance_before = test.receiver.balance; - - test.set_assertion::(para_origin_assertions); - test.set_assertion::(relay_dest_assertions); - test.set_dispatchable::(system_para_teleport_assets); - test.assert(); - - let delivery_fees = AssetHubWestend::execute_with(|| { - xcm_helpers::transfer_assets_delivery_fees::< - ::XcmSender, - >(test.args.assets.clone(), 0, test.args.weight_limit, test.args.beneficiary, test.args.dest) - }); - - let sender_balance_after = test.sender.balance; - let receiver_balance_after = test.receiver.balance; - - // Sender's balance is reduced - assert_eq!(sender_balance_before - amount_to_send - delivery_fees, sender_balance_after); - // Receiver's balance is increased - assert!(receiver_balance_after > receiver_balance_before); -} - -/// Teleport of native asset from System Parachain to Relay Chain -/// shouldn't work when there is not enough balance in Relay Chain's `CheckAccount` -#[test] -fn teleport_native_assets_from_system_para_to_relay_fails() { - // Init values for Relay Chain - let amount_to_send: Balance = ASSET_HUB_WESTEND_ED * 1000; - let destination = AssetHubWestend::parent_location(); - let beneficiary_id = WestendReceiver::get(); - let assets = (Parent, amount_to_send).into(); - - let test_args = TestContext { - sender: AssetHubWestendSender::get(), - receiver: WestendReceiver::get(), - args: TestArgs::new_para(destination, beneficiary_id, amount_to_send, assets, None, 0), - }; - - let mut test = SystemParaToRelayTest::new(test_args); - - let sender_balance_before = test.sender.balance; - let receiver_balance_before = test.receiver.balance; - - test.set_assertion::(para_origin_assertions); - test.set_assertion::(relay_dest_assertions_fail); - test.set_dispatchable::(system_para_teleport_assets); - test.assert(); - - let delivery_fees = AssetHubWestend::execute_with(|| { - xcm_helpers::transfer_assets_delivery_fees::< + xcm_helpers::teleport_assets_delivery_fees::< ::XcmSender, >(test.args.assets.clone(), 0, test.args.weight_limit, test.args.beneficiary, test.args.dest) }); - let sender_balance_after = test.sender.balance; - let receiver_balance_after = test.receiver.balance; - // Sender's balance is reduced assert_eq!(sender_balance_before - amount_to_send - delivery_fees, sender_balance_after); // Receiver's balance does not change @@ -558,30 +418,21 @@ fn teleport_to_other_system_parachains_works() { /// (using native reserve-based transfer for fees) #[test] fn bidirectional_teleport_foreign_assets_between_para_and_asset_hub() { - let ah_as_seen_by_penpal = PenpalB::sibling_location_of(AssetHubWestend::para_id()); - let asset_location_on_penpal = PenpalLocalTeleportableToAssetHubV3::get(); + // Init values for Parachain + let fee_amount_to_send: Balance = ASSET_HUB_WESTEND_ED * 100; + let asset_location_on_penpal = + v3::Location::try_from(PenpalLocalTeleportableToAssetHub::get()).expect("conversion works"); let asset_id_on_penpal = match asset_location_on_penpal.last() { Some(v3::Junction::GeneralIndex(id)) => *id as u32, _ => unreachable!(), }; - let asset_owner_on_penpal = PenpalBSender::get(); - let foreign_asset_at_asset_hub_westend = - v3::Location::new(1, [v3::Junction::Parachain(PenpalB::para_id().into())]) - .appended_with(asset_location_on_penpal) - .unwrap(); - super::penpal_create_foreign_asset_on_asset_hub( - asset_id_on_penpal, - foreign_asset_at_asset_hub_westend, - ah_as_seen_by_penpal.clone(), - false, - asset_owner_on_penpal, - ASSET_MIN_BALANCE * 1_000_000, - ); - let penpal_to_ah_beneficiary_id = AssetHubWestendReceiver::get(); - - let fee_amount_to_send = ASSET_HUB_WESTEND_ED * 1000; - let asset_amount_to_send = ASSET_MIN_BALANCE * 1000; - + let asset_amount_to_send = ASSET_HUB_WESTEND_ED * 100; + let asset_owner = PenpalAssetOwner::get(); + let system_para_native_asset_location = + v3::Location::try_from(RelayLocation::get()).expect("conversion works"); + let sender = PenpalASender::get(); + let penpal_check_account = ::PolkadotXcm::check_account(); + let ah_as_seen_by_penpal = PenpalA::sibling_location_of(AssetHubWestend::para_id()); let asset_location_on_penpal_latest: Location = asset_location_on_penpal.try_into().unwrap(); let penpal_assets: Assets = vec![ (Parent, fee_amount_to_send).into(), @@ -594,9 +445,44 @@ fn bidirectional_teleport_foreign_assets_between_para_and_asset_hub() { .position(|r| r == &(Parent, fee_amount_to_send).into()) .unwrap() as u32; + // fund Parachain's sender account + PenpalA::mint_foreign_asset( + ::RuntimeOrigin::signed(asset_owner.clone()), + system_para_native_asset_location, + sender.clone(), + fee_amount_to_send * 2, + ); + // No need to create the asset (only mint) as it exists in genesis. + PenpalA::mint_asset( + ::RuntimeOrigin::signed(asset_owner.clone()), + asset_id_on_penpal, + sender.clone(), + asset_amount_to_send, + ); + // fund Parachain's check account to be able to teleport + PenpalA::fund_accounts(vec![( + penpal_check_account.clone().into(), + ASSET_HUB_WESTEND_ED * 1000, + )]); + + // prefund SA of Penpal on AssetHub with enough native tokens to pay for fees + let penpal_as_seen_by_ah = AssetHubWestend::sibling_location_of(PenpalA::para_id()); + let sov_penpal_on_ah = AssetHubWestend::sovereign_account_id_of(penpal_as_seen_by_ah); + AssetHubWestend::fund_accounts(vec![( + sov_penpal_on_ah.clone().into(), + ASSET_HUB_WESTEND_ED * 100_000_000_000, + )]); + + // Init values for System Parachain + let foreign_asset_at_asset_hub_westend = + v3::Location::new(1, [v3::Junction::Parachain(PenpalA::para_id().into())]) + .appended_with(asset_location_on_penpal) + .unwrap(); + let penpal_to_ah_beneficiary_id = AssetHubWestendReceiver::get(); + // Penpal to AH test args let penpal_to_ah_test_args = TestContext { - sender: PenpalBSender::get(), + sender: PenpalASender::get(), receiver: AssetHubWestendReceiver::get(), args: TestArgs::new_para( ah_as_seen_by_penpal, @@ -608,13 +494,19 @@ fn bidirectional_teleport_foreign_assets_between_para_and_asset_hub() { ), }; let mut penpal_to_ah = ParaToSystemParaTest::new(penpal_to_ah_test_args); + let penpal_sender_balance_before = PenpalA::execute_with(|| { + type ForeignAssets = ::ForeignAssets; + >::balance( + system_para_native_asset_location, + &PenpalASender::get(), + ) + }); - let penpal_sender_balance_before = penpal_to_ah.sender.balance; let ah_receiver_balance_before = penpal_to_ah.receiver.balance; - let penpal_sender_assets_before = PenpalB::execute_with(|| { - type Assets = ::Assets; - >::balance(asset_id_on_penpal, &PenpalBSender::get()) + let penpal_sender_assets_before = PenpalA::execute_with(|| { + type Assets = ::Assets; + >::balance(asset_id_on_penpal, &PenpalASender::get()) }); let ah_receiver_assets_before = AssetHubWestend::execute_with(|| { type Assets = ::ForeignAssets; @@ -624,17 +516,24 @@ fn bidirectional_teleport_foreign_assets_between_para_and_asset_hub() { ) }); - penpal_to_ah.set_assertion::(penpal_to_ah_foreign_assets_sender_assertions); + penpal_to_ah.set_assertion::(penpal_to_ah_foreign_assets_sender_assertions); penpal_to_ah.set_assertion::(penpal_to_ah_foreign_assets_receiver_assertions); - penpal_to_ah.set_dispatchable::(para_to_system_para_transfer_assets); + penpal_to_ah.set_dispatchable::(para_to_system_para_transfer_assets); penpal_to_ah.assert(); - let penpal_sender_balance_after = penpal_to_ah.sender.balance; + let penpal_sender_balance_after = PenpalA::execute_with(|| { + type ForeignAssets = ::ForeignAssets; + >::balance( + system_para_native_asset_location, + &PenpalASender::get(), + ) + }); + let ah_receiver_balance_after = penpal_to_ah.receiver.balance; - let penpal_sender_assets_after = PenpalB::execute_with(|| { - type Assets = ::Assets; - >::balance(asset_id_on_penpal, &PenpalBSender::get()) + let penpal_sender_assets_after = PenpalA::execute_with(|| { + type Assets = ::Assets; + >::balance(asset_id_on_penpal, &PenpalASender::get()) }); let ah_receiver_assets_after = AssetHubWestend::execute_with(|| { type Assets = ::ForeignAssets; @@ -675,8 +574,8 @@ fn bidirectional_teleport_foreign_assets_between_para_and_asset_hub() { let foreign_asset_at_asset_hub_westend_latest: Location = foreign_asset_at_asset_hub_westend.try_into().unwrap(); - let ah_to_penpal_beneficiary_id = PenpalBReceiver::get(); - let penpal_as_seen_by_ah = AssetHubWestend::sibling_location_of(PenpalB::para_id()); + let ah_to_penpal_beneficiary_id = PenpalAReceiver::get(); + let penpal_as_seen_by_ah = AssetHubWestend::sibling_location_of(PenpalA::para_id()); let ah_assets: Assets = vec![ (Parent, fee_amount_to_send).into(), (foreign_asset_at_asset_hub_westend_latest, asset_amount_to_send).into(), @@ -691,7 +590,7 @@ fn bidirectional_teleport_foreign_assets_between_para_and_asset_hub() { // AH to Penpal test args let ah_to_penpal_test_args = TestContext { sender: AssetHubWestendSender::get(), - receiver: PenpalBReceiver::get(), + receiver: PenpalAReceiver::get(), args: TestArgs::new_para( penpal_as_seen_by_ah, ah_to_penpal_beneficiary_id, @@ -704,7 +603,13 @@ fn bidirectional_teleport_foreign_assets_between_para_and_asset_hub() { let mut ah_to_penpal = SystemParaToParaTest::new(ah_to_penpal_test_args); let ah_sender_balance_before = ah_to_penpal.sender.balance; - let penpal_receiver_balance_before = ah_to_penpal.receiver.balance; + let penpal_receiver_balance_before = PenpalA::execute_with(|| { + type ForeignAssets = ::ForeignAssets; + >::balance( + system_para_native_asset_location, + &PenpalAReceiver::get(), + ) + }); let ah_sender_assets_before = AssetHubWestend::execute_with(|| { type ForeignAssets = ::ForeignAssets; @@ -713,18 +618,24 @@ fn bidirectional_teleport_foreign_assets_between_para_and_asset_hub() { &AssetHubWestendSender::get(), ) }); - let penpal_receiver_assets_before = PenpalB::execute_with(|| { - type Assets = ::Assets; - >::balance(asset_id_on_penpal, &PenpalBReceiver::get()) + let penpal_receiver_assets_before = PenpalA::execute_with(|| { + type Assets = ::Assets; + >::balance(asset_id_on_penpal, &PenpalAReceiver::get()) }); ah_to_penpal.set_assertion::(ah_to_penpal_foreign_assets_sender_assertions); - ah_to_penpal.set_assertion::(ah_to_penpal_foreign_assets_receiver_assertions); + ah_to_penpal.set_assertion::(ah_to_penpal_foreign_assets_receiver_assertions); ah_to_penpal.set_dispatchable::(system_para_to_para_transfer_assets); ah_to_penpal.assert(); let ah_sender_balance_after = ah_to_penpal.sender.balance; - let penpal_receiver_balance_after = ah_to_penpal.receiver.balance; + let penpal_receiver_balance_after = PenpalA::execute_with(|| { + type ForeignAssets = ::ForeignAssets; + >::balance( + system_para_native_asset_location, + &PenpalAReceiver::get(), + ) + }); let ah_sender_assets_after = AssetHubWestend::execute_with(|| { type ForeignAssets = ::ForeignAssets; @@ -733,9 +644,9 @@ fn bidirectional_teleport_foreign_assets_between_para_and_asset_hub() { &AssetHubWestendSender::get(), ) }); - let penpal_receiver_assets_after = PenpalB::execute_with(|| { - type Assets = ::Assets; - >::balance(asset_id_on_penpal, &PenpalBReceiver::get()) + let penpal_receiver_assets_after = PenpalA::execute_with(|| { + type Assets = ::Assets; + >::balance(asset_id_on_penpal, &PenpalAReceiver::get()) }); // Sender's balance is reduced diff --git a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/treasury.rs b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/treasury.rs index 8e82059a32d17303e0d3470e70e017d6e9aa03d5..6d8c0f5e5de6ae70559f5d60545959db5e74f735 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/treasury.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/treasury.rs @@ -13,7 +13,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -use crate::*; +use crate::imports::*; use emulated_integration_tests_common::accounts::{ALICE, BOB}; use frame_support::traits::fungibles::{Create, Inspect, Mutate}; use polkadot_runtime_common::impls::VersionedLocatableAsset; diff --git a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/Cargo.toml b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/Cargo.toml index 89f0d2a9ca6dacae72e73d5b6e8c310347389070..bbe54c367baf41d183dd60f976a7951d20d8a6f2 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/Cargo.toml @@ -12,7 +12,7 @@ workspace = true [dependencies] codec = { package = "parity-scale-codec", version = "3.4.0", default-features = false } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } hex-literal = "0.4.1" # Substrate @@ -31,13 +31,12 @@ xcm-executor = { package = "staging-xcm-executor", path = "../../../../../../../ # Bridges pallet-bridge-messages = { path = "../../../../../../../bridges/modules/messages", default-features = false } -bp-messages = { path = "../../../../../../../bridges/primitives/messages", default-features = false } # Cumulus -parachains-common = { path = "../../../../../../parachains/common" } +parachains-common = { path = "../../../../../common" } testnet-parachains-constants = { path = "../../../../../runtimes/constants", features = ["rococo"] } cumulus-pallet-xcmp-queue = { path = "../../../../../../pallets/xcmp-queue", default-features = false } -bridge-hub-rococo-runtime = { path = "../../../../../../parachains/runtimes/bridge-hubs/bridge-hub-rococo", default-features = false } +bridge-hub-rococo-runtime = { path = "../../../../../runtimes/bridge-hubs/bridge-hub-rococo", default-features = false } emulated-integration-tests-common = { path = "../../../common", default-features = false } rococo-westend-system-emulated-network = { path = "../../../networks/rococo-westend-system" } rococo-system-emulated-network = { path = "../../../networks/rococo-system" } @@ -48,5 +47,4 @@ snowbridge-core = { path = "../../../../../../../bridges/snowbridge/primitives/c snowbridge-router-primitives = { path = "../../../../../../../bridges/snowbridge/primitives/router", default-features = false } snowbridge-pallet-system = { path = "../../../../../../../bridges/snowbridge/pallets/system", default-features = false } snowbridge-pallet-outbound-queue = { path = "../../../../../../../bridges/snowbridge/pallets/outbound-queue", default-features = false } -snowbridge-pallet-inbound-queue = { path = "../../../../../../../bridges/snowbridge/pallets/inbound-queue", default-features = false } snowbridge-pallet-inbound-queue-fixtures = { path = "../../../../../../../bridges/snowbridge/pallets/inbound-queue/fixtures" } diff --git a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/lib.rs b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/lib.rs index 9ce981b074c5b671f7a7a4005b1b1e4ae9b1d98f..b5e19cf3fa3a252abe28b31229c876d104b6a8e9 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/lib.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/lib.rs @@ -13,62 +13,53 @@ // See the License for the specific language governing permissions and // limitations under the License. -// Substrate -pub use frame_support::{assert_err, assert_ok, pallet_prelude::DispatchResult}; -pub use sp_runtime::DispatchError; - -// Polkadot -pub use xcm::{ - latest::ParentThen, - prelude::{AccountId32 as AccountId32Junction, *}, - v3::{ - self, Error, - NetworkId::{Rococo as RococoId, Westend as WestendId}, - }, -}; +#[cfg(test)] +mod imports { + // Substrate + pub use frame_support::{assert_err, assert_ok, pallet_prelude::DispatchResult}; + pub use sp_runtime::DispatchError; -// Bridges -pub use bp_messages::LaneId; + // Polkadot + pub use xcm::{ + latest::ParentThen, + prelude::{AccountId32 as AccountId32Junction, *}, + v3::{self, NetworkId::Westend as WestendId}, + }; -// Cumulus -pub use emulated_integration_tests_common::{ - accounts::ALICE, - impls::Inspect, - test_parachain_is_trusted_teleporter, - xcm_emulator::{ - assert_expected_events, bx, helpers::weight_within_threshold, Chain, Parachain as Para, - RelayChain as Relay, Test, TestArgs, TestContext, TestExt, - }, - xcm_helpers::{xcm_transact_paid_execution, xcm_transact_unpaid_execution}, - PROOF_SIZE_THRESHOLD, REF_TIME_THRESHOLD, XCM_V3, -}; -pub use parachains_common::{AccountId, Balance}; -pub use rococo_westend_system_emulated_network::{ - asset_hub_rococo_emulated_chain::{ - genesis::ED as ASSET_HUB_ROCOCO_ED, AssetHubRococoParaPallet as AssetHubRococoPallet, - }, - asset_hub_westend_emulated_chain::{ - genesis::ED as ASSET_HUB_WESTEND_ED, AssetHubWestendParaPallet as AssetHubWestendPallet, - }, - bridge_hub_rococo_emulated_chain::{ - genesis::ED as BRIDGE_HUB_ROCOCO_ED, BridgeHubRococoParaPallet as BridgeHubRococoPallet, - }, - penpal_emulated_chain::PenpalAParaPallet as PenpalAPallet, - rococo_emulated_chain::{genesis::ED as ROCOCO_ED, RococoRelayPallet as RococoPallet}, - AssetHubRococoPara as AssetHubRococo, AssetHubRococoParaReceiver as AssetHubRococoReceiver, - AssetHubRococoParaSender as AssetHubRococoSender, AssetHubWestendPara as AssetHubWestend, - AssetHubWestendParaReceiver as AssetHubWestendReceiver, - AssetHubWestendParaSender as AssetHubWestendSender, BridgeHubRococoPara as BridgeHubRococo, - BridgeHubRococoParaReceiver as BridgeHubRococoReceiver, - BridgeHubRococoParaSender as BridgeHubRococoSender, BridgeHubWestendPara as BridgeHubWestend, - PenpalAPara as PenpalA, PenpalAParaReceiver as PenpalAReceiver, - PenpalAParaSender as PenpalASender, RococoRelay as Rococo, - RococoRelayReceiver as RococoReceiver, RococoRelaySender as RococoSender, -}; + // Cumulus + pub use emulated_integration_tests_common::{ + accounts::ALICE, + impls::Inspect, + test_parachain_is_trusted_teleporter, + xcm_emulator::{ + assert_expected_events, bx, Chain, Parachain as Para, RelayChain as Relay, TestExt, + }, + }; + pub use parachains_common::AccountId; + pub use rococo_westend_system_emulated_network::{ + asset_hub_rococo_emulated_chain::{ + genesis::ED as ASSET_HUB_ROCOCO_ED, AssetHubRococoParaPallet as AssetHubRococoPallet, + }, + asset_hub_westend_emulated_chain::{ + genesis::ED as ASSET_HUB_WESTEND_ED, AssetHubWestendParaPallet as AssetHubWestendPallet, + }, + bridge_hub_rococo_emulated_chain::{ + genesis::ED as BRIDGE_HUB_ROCOCO_ED, BridgeHubRococoParaPallet as BridgeHubRococoPallet, + }, + penpal_emulated_chain::PenpalAParaPallet as PenpalAPallet, + rococo_emulated_chain::{genesis::ED as ROCOCO_ED, RococoRelayPallet as RococoPallet}, + AssetHubRococoPara as AssetHubRococo, AssetHubRococoParaReceiver as AssetHubRococoReceiver, + AssetHubRococoParaSender as AssetHubRococoSender, AssetHubWestendPara as AssetHubWestend, + AssetHubWestendParaReceiver as AssetHubWestendReceiver, + AssetHubWestendParaSender as AssetHubWestendSender, BridgeHubRococoPara as BridgeHubRococo, + BridgeHubRococoParaSender as BridgeHubRococoSender, + BridgeHubWestendPara as BridgeHubWestend, PenpalAPara as PenpalA, + PenpalAParaReceiver as PenpalAReceiver, PenpalAParaSender as PenpalASender, + RococoRelay as Rococo, + }; -pub const ASSET_ID: u32 = 1; -pub const ASSET_MIN_BALANCE: u128 = 1000; -pub const ASSETS_PALLET_ID: u8 = 50; + pub const ASSET_MIN_BALANCE: u128 = 1000; +} #[cfg(test)] mod tests; diff --git a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/asset_transfers.rs b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/asset_transfers.rs index a203de0f8c930a43c1848bfa9179e0cba40689a9..787a82ed32f7376f1c94c584711098c15d4da198 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/asset_transfers.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/asset_transfers.rs @@ -184,13 +184,13 @@ fn send_wnds_from_asset_hub_rococo_to_asset_hub_westend() { vec![ // WND is withdrawn from AHR's SA on AHW RuntimeEvent::Balances( - pallet_balances::Event::Withdraw { who, amount } + pallet_balances::Event::Burned { who, amount } ) => { who: *who == sov_ahr_on_ahw, amount: *amount == amount_to_send, }, // WNDs deposited to beneficiary - RuntimeEvent::Balances(pallet_balances::Event::Deposit { who, .. }) => { + RuntimeEvent::Balances(pallet_balances::Event::Minted { who, .. }) => { who: *who == AssetHubWestendReceiver::get(), }, // message processed successfully diff --git a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/mod.rs b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/mod.rs index a33d2fab7536cfffe46a57548a21fb5e7f0391e4..88dad06434b0d4a28295708c303907e02e70927b 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/mod.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/mod.rs @@ -13,7 +13,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -use crate::*; +use crate::imports::*; mod asset_transfers; mod send_xcm; @@ -68,7 +68,7 @@ pub(crate) fn assert_bridge_hub_rococo_message_accepted(expected_processed: bool BridgeHubRococo, vec![ // pay for bridge fees - RuntimeEvent::Balances(pallet_balances::Event::Withdraw { .. }) => {}, + RuntimeEvent::Balances(pallet_balances::Event::Burned { .. }) => {}, // message exported RuntimeEvent::BridgeWestendMessages( pallet_bridge_messages::Event::MessageAccepted { .. } diff --git a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/send_xcm.rs b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/send_xcm.rs index a1d871cdb618fdddfbbbc3e7812d0ec7f7ae7866..4bd041dc03f4216c9eddf811d325e8262873e473 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/send_xcm.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/send_xcm.rs @@ -14,6 +14,7 @@ // limitations under the License. use crate::tests::*; +use codec::Encode; #[test] fn send_xcm_from_rococo_relay_to_westend_asset_hub_should_fail_on_not_applicable() { @@ -26,7 +27,7 @@ fn send_xcm_from_rococo_relay_to_westend_asset_hub_should_fail_on_not_applicable let remote_xcm = Xcm(vec![ClearOrigin]); - let xcm = VersionedXcm::from(Xcm(vec![ + let xcm = VersionedXcm::from(Xcm::<()>(vec![ UnpaidExecution { weight_limit, check_origin }, ExportMessage { network: WestendId.into(), @@ -38,10 +39,10 @@ fn send_xcm_from_rococo_relay_to_westend_asset_hub_should_fail_on_not_applicable // Rococo Global Consensus // Send XCM message from Relay Chain to Bridge Hub source Parachain Rococo::execute_with(|| { - assert_ok!(::XcmPallet::send( + assert_ok!(::XcmPallet::send_blob( sudo_origin, bx!(destination), - bx!(xcm), + xcm.encode().try_into().unwrap(), )); type RuntimeEvent = ::RuntimeEvent; diff --git a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/snowbridge.rs b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/snowbridge.rs index 5e1a2af660b0c8ae56cf7f760785052918ecd6d3..780ba57f78a18c87c327db2acc5cd27442a0221b 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/snowbridge.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/snowbridge.rs @@ -12,24 +12,25 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. -use crate::*; +use crate::imports::*; use bridge_hub_rococo_runtime::{EthereumBeaconClient, EthereumInboundQueue, RuntimeOrigin}; use codec::{Decode, Encode}; use emulated_integration_tests_common::xcm_emulator::ConvertLocation; use frame_support::pallet_prelude::TypeInfo; use hex_literal::hex; +use rococo_system_emulated_network::penpal_emulated_chain::CustomizableAssetFromSystemAssetHub; use rococo_westend_system_emulated_network::BridgeHubRococoParaSender as BridgeHubRococoSender; -use snowbridge_core::outbound::OperatingMode; +use snowbridge_core::{inbound::InboundQueueFixture, outbound::OperatingMode}; use snowbridge_pallet_inbound_queue_fixtures::{ - register_token::make_register_token_message, - register_token_with_insufficient_fee::make_register_token_with_infufficient_fee_message, - send_token::make_send_token_message, send_token_to_penpal::make_send_token_to_penpal_message, - InboundQueueFixture, + register_token::make_register_token_message, send_token::make_send_token_message, + send_token_to_penpal::make_send_token_to_penpal_message, }; use snowbridge_pallet_system; -use snowbridge_router_primitives::inbound::GlobalConsensusEthereumConvertsFor; +use snowbridge_router_primitives::inbound::{ + Command, GlobalConsensusEthereumConvertsFor, MessageV1, VersionedMessage, +}; use sp_core::H256; -use sp_runtime::{ArithmeticError::Underflow, DispatchError::Arithmetic}; +use sp_runtime::{DispatchError::Token, TokenError::FundsUnavailable}; use testnet_parachains_constants::rococo::snowbridge::EthereumNetwork; const INITIAL_FUND: u128 = 5_000_000_000 * ROCOCO_ED; @@ -38,6 +39,7 @@ const TREASURY_ACCOUNT: [u8; 32] = hex!("6d6f646c70792f74727372790000000000000000000000000000000000000000"); const WETH: [u8; 20] = hex!("87d1f7fdfEe7f651FaBc8bFCB6E086C278b77A7d"); const ETHEREUM_DESTINATION_ADDRESS: [u8; 20] = hex!("44a57ee2f2FCcb85FDa2B0B18EBD0D8D2333700e"); +const INSUFFICIENT_XCM_FEE: u128 = 1000; #[derive(Encode, Decode, Debug, PartialEq, Eq, Clone, TypeInfo)] pub enum ControlCall { @@ -55,13 +57,11 @@ pub enum SnowbridgeControl { } pub fn send_inbound_message(fixture: InboundQueueFixture) -> DispatchResult { - EthereumBeaconClient::store_execution_header( - fixture.message.proof.block_hash, - fixture.execution_header, - 0, - H256::default(), - ); - + EthereumBeaconClient::store_finalized_header( + fixture.finalized_header, + fixture.block_roots_root, + ) + .unwrap(); EthereumInboundQueue::submit( RuntimeOrigin::signed(BridgeHubRococoSender::get()), fixture.message, @@ -82,7 +82,7 @@ fn create_agent() { let create_agent_call = SnowbridgeControl::Control(ControlCall::CreateAgent {}); // Construct XCM to create an agent for para 1001 - let remote_xcm = VersionedXcm::from(Xcm(vec![ + let remote_xcm = VersionedXcm::from(Xcm::<()>(vec![ UnpaidExecution { weight_limit: Unlimited, check_origin: None }, DescendOrigin(Parachain(origin_para).into()), Transact { @@ -95,10 +95,10 @@ fn create_agent() { // Rococo Global Consensus // Send XCM message from Relay Chain to Bridge Hub source Parachain Rococo::execute_with(|| { - assert_ok!(::XcmPallet::send( + assert_ok!(::XcmPallet::send_blob( sudo_origin, bx!(destination), - bx!(remote_xcm), + remote_xcm.encode().try_into().unwrap(), )); type RuntimeEvent = ::RuntimeEvent; @@ -140,7 +140,7 @@ fn create_channel() { let create_agent_call = SnowbridgeControl::Control(ControlCall::CreateAgent {}); // Construct XCM to create an agent for para 1001 - let create_agent_xcm = VersionedXcm::from(Xcm(vec![ + let create_agent_xcm = VersionedXcm::from(Xcm::<()>(vec![ UnpaidExecution { weight_limit: Unlimited, check_origin: None }, DescendOrigin(Parachain(origin_para).into()), Transact { @@ -153,7 +153,7 @@ fn create_channel() { let create_channel_call = SnowbridgeControl::Control(ControlCall::CreateChannel { mode: OperatingMode::Normal }); // Construct XCM to create a channel for para 1001 - let create_channel_xcm = VersionedXcm::from(Xcm(vec![ + let create_channel_xcm = VersionedXcm::from(Xcm::<()>(vec![ UnpaidExecution { weight_limit: Unlimited, check_origin: None }, DescendOrigin(Parachain(origin_para).into()), Transact { @@ -166,16 +166,16 @@ fn create_channel() { // Rococo Global Consensus // Send XCM message from Relay Chain to Bridge Hub source Parachain Rococo::execute_with(|| { - assert_ok!(::XcmPallet::send( + assert_ok!(::XcmPallet::send_blob( sudo_origin.clone(), bx!(destination.clone()), - bx!(create_agent_xcm), + create_agent_xcm.encode().try_into().unwrap(), )); - assert_ok!(::XcmPallet::send( + assert_ok!(::XcmPallet::send_blob( sudo_origin, bx!(destination), - bx!(create_channel_xcm), + create_channel_xcm.encode().try_into().unwrap(), )); type RuntimeEvent = ::RuntimeEvent; @@ -236,6 +236,46 @@ fn register_weth_token_from_ethereum_to_asset_hub() { }); } +/// Tests the registering of a token as an asset on AssetHub, and then subsequently sending +/// a token from Ethereum to AssetHub. +#[test] +fn send_token_from_ethereum_to_asset_hub() { + BridgeHubRococo::fund_para_sovereign(AssetHubRococo::para_id().into(), INITIAL_FUND); + + // Fund ethereum sovereign on AssetHub + AssetHubRococo::fund_accounts(vec![(AssetHubRococoReceiver::get(), INITIAL_FUND)]); + + BridgeHubRococo::execute_with(|| { + type RuntimeEvent = ::RuntimeEvent; + + // Construct RegisterToken message and sent to inbound queue + send_inbound_message(make_register_token_message()).unwrap(); + + // Construct SendToken message and sent to inbound queue + send_inbound_message(make_send_token_message()).unwrap(); + + // Check that the message was sent + assert_expected_events!( + BridgeHubRococo, + vec![ + RuntimeEvent::XcmpQueue(cumulus_pallet_xcmp_queue::Event::XcmpMessageSent { .. }) => {}, + ] + ); + }); + + AssetHubRococo::execute_with(|| { + type RuntimeEvent = ::RuntimeEvent; + + // Check that the token was received and issued as a foreign asset on AssetHub + assert_expected_events!( + AssetHubRococo, + vec![ + RuntimeEvent::ForeignAssets(pallet_assets::Event::Issued { .. }) => {}, + ] + ); + }); +} + /// Tests sending a token to a 3rd party parachain, called PenPal. The token reserve is /// still located on AssetHub. #[test] @@ -253,6 +293,16 @@ fn send_token_from_ethereum_to_penpal() { (PenpalASender::get(), INITIAL_FUND), ]); + PenpalA::execute_with(|| { + assert_ok!(::System::set_storage( + ::RuntimeOrigin::root(), + vec![( + CustomizableAssetFromSystemAssetHub::key().to_vec(), + Location::new(2, [GlobalConsensus(Ethereum { chain_id: CHAIN_ID })]).encode(), + )], + )); + }); + // The Weth asset location, identified by the contract address on Ethereum let weth_asset_location: Location = (Parent, Parent, EthereumNetwork::get(), AccountKey20 { network: None, key: WETH }).into(); @@ -285,6 +335,10 @@ fn send_token_from_ethereum_to_penpal() { // Construct RegisterToken message and sent to inbound queue send_inbound_message(make_register_token_message()).unwrap(); + // Construct SendToken message to AssetHub(only for increase the nonce as the same order in + // smoke test) + send_inbound_message(make_send_token_message()).unwrap(); + // Construct SendToken message and sent to inbound queue send_inbound_message(make_send_token_to_penpal_message()).unwrap(); @@ -320,46 +374,6 @@ fn send_token_from_ethereum_to_penpal() { }); } -/// Tests the registering of a token as an asset on AssetHub, and then subsequently sending -/// a token from Ethereum to AssetHub. -#[test] -fn send_token_from_ethereum_to_asset_hub() { - BridgeHubRococo::fund_para_sovereign(AssetHubRococo::para_id().into(), INITIAL_FUND); - - // Fund ethereum sovereign on AssetHub - AssetHubRococo::fund_accounts(vec![(AssetHubRococoReceiver::get(), INITIAL_FUND)]); - - BridgeHubRococo::execute_with(|| { - type RuntimeEvent = ::RuntimeEvent; - - // Construct RegisterToken message and sent to inbound queue - send_inbound_message(make_register_token_message()).unwrap(); - - // Construct SendToken message and sent to inbound queue - send_inbound_message(make_send_token_message()).unwrap(); - - // Check that the message was sent - assert_expected_events!( - BridgeHubRococo, - vec![ - RuntimeEvent::XcmpQueue(cumulus_pallet_xcmp_queue::Event::XcmpMessageSent { .. }) => {}, - ] - ); - }); - - AssetHubRococo::execute_with(|| { - type RuntimeEvent = ::RuntimeEvent; - - // Check that the token was received and issued as a foreign asset on AssetHub - assert_expected_events!( - AssetHubRococo, - vec![ - RuntimeEvent::ForeignAssets(pallet_assets::Event::Issued { .. }) => {}, - ] - ); - }); -} - /// Tests the full cycle of token transfers: /// - registering a token on AssetHub /// - sending a token to AssetHub @@ -447,12 +461,13 @@ fn send_weth_asset_from_asset_hub_to_ethereum() { AssetHubRococoReceiver::get(), ); // Send the Weth back to Ethereum - ::PolkadotXcm::reserve_transfer_assets( + ::PolkadotXcm::limited_reserve_transfer_assets( RuntimeOrigin::signed(AssetHubRococoReceiver::get()), Box::new(destination), Box::new(beneficiary), Box::new(multi_assets), 0, + Unlimited, ) .unwrap(); let free_balance_after = ::Balances::free_balance( @@ -478,7 +493,7 @@ fn send_weth_asset_from_asset_hub_to_ethereum() { assert!( events.iter().any(|event| matches!( event, - RuntimeEvent::Balances(pallet_balances::Event::Deposit{ who, amount }) + RuntimeEvent::Balances(pallet_balances::Event::Minted { who, amount }) if *who == TREASURY_ACCOUNT.into() && *amount == 16903333 )), "Snowbridge sovereign takes local fee." @@ -487,7 +502,7 @@ fn send_weth_asset_from_asset_hub_to_ethereum() { assert!( events.iter().any(|event| matches!( event, - RuntimeEvent::Balances(pallet_balances::Event::Deposit{ who, amount }) + RuntimeEvent::Balances(pallet_balances::Event::Minted { who, amount }) if *who == assethub_sovereign && *amount == 2680000000000, )), "AssetHub sovereign takes remote fee." @@ -495,16 +510,35 @@ fn send_weth_asset_from_asset_hub_to_ethereum() { }); } +#[test] +fn send_token_from_ethereum_to_asset_hub_fail_for_insufficient_fund() { + // Insufficient fund + BridgeHubRococo::fund_para_sovereign(AssetHubRococo::para_id().into(), 1_000); + + BridgeHubRococo::execute_with(|| { + assert_err!(send_inbound_message(make_register_token_message()), Token(FundsUnavailable)); + }); +} + #[test] fn register_weth_token_in_asset_hub_fail_for_insufficient_fee() { BridgeHubRococo::fund_para_sovereign(AssetHubRococo::para_id().into(), INITIAL_FUND); BridgeHubRococo::execute_with(|| { type RuntimeEvent = ::RuntimeEvent; - - // Construct RegisterToken message and sent to inbound queue - let message = make_register_token_with_infufficient_fee_message(); - send_inbound_message(message).unwrap(); + type EthereumInboundQueue = + ::EthereumInboundQueue; + let message_id: H256 = [0; 32].into(); + let message = VersionedMessage::V1(MessageV1 { + chain_id: CHAIN_ID, + command: Command::RegisterToken { + token: WETH.into(), + // Insufficient fee which should trigger the trap + fee: INSUFFICIENT_XCM_FEE, + }, + }); + let (xcm, _) = EthereumInboundQueue::do_convert(message_id, message).unwrap(); + let _ = EthereumInboundQueue::send_xcm(xcm, AssetHubRococo::para_id().into()).unwrap(); assert_expected_events!( BridgeHubRococo, @@ -525,13 +559,3 @@ fn register_weth_token_in_asset_hub_fail_for_insufficient_fee() { ); }); } - -#[test] -fn send_token_from_ethereum_to_asset_hub_fail_for_insufficient_fund() { - // Insufficient fund - BridgeHubRococo::fund_para_sovereign(AssetHubRococo::para_id().into(), 1_000); - - BridgeHubRococo::execute_with(|| { - assert_err!(send_inbound_message(make_register_token_message()), Arithmetic(Underflow)); - }); -} diff --git a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/teleport.rs b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/teleport.rs index 43f8af9244f5656e61d72c0352bb6e191dafb30b..8f51f5b180004d3f694cc68ba6d3c11ab46df95a 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/teleport.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/teleport.rs @@ -13,7 +13,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -use crate::*; +use crate::tests::*; use bridge_hub_rococo_runtime::xcm_config::XcmConfig; #[test] diff --git a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/Cargo.toml b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/Cargo.toml index 9d55903c858308b9382fda0fc03132d95b9f1028..3aa2e2bcbe063c21603e0763eb8e490911177478 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/Cargo.toml @@ -11,6 +11,7 @@ publish = false workspace = true [dependencies] +codec = { package = "parity-scale-codec", version = "3.6.0" } # Substrate frame-support = { path = "../../../../../../../substrate/frame/support", default-features = false } @@ -27,11 +28,10 @@ xcm-executor = { package = "staging-xcm-executor", path = "../../../../../../../ # Bridges pallet-bridge-messages = { path = "../../../../../../../bridges/modules/messages", default-features = false } -bp-messages = { path = "../../../../../../../bridges/primitives/messages", default-features = false } # Cumulus -parachains-common = { path = "../../../../../../parachains/common" } +parachains-common = { path = "../../../../../common" } cumulus-pallet-xcmp-queue = { path = "../../../../../../pallets/xcmp-queue", default-features = false } -bridge-hub-westend-runtime = { path = "../../../../../../parachains/runtimes/bridge-hubs/bridge-hub-westend", default-features = false } +bridge-hub-westend-runtime = { path = "../../../../../runtimes/bridge-hubs/bridge-hub-westend", default-features = false } emulated-integration-tests-common = { path = "../../../common", default-features = false } rococo-westend-system-emulated-network = { path = "../../../networks/rococo-westend-system" } diff --git a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/lib.rs b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/lib.rs index 223979cc9c9d3df097014f250e2e648a8d3f0bca..60c31ce5a4aefeb5852f87ddd6804ca267857801 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/lib.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/lib.rs @@ -13,59 +13,52 @@ // See the License for the specific language governing permissions and // limitations under the License. -// Substrate -pub use frame_support::{assert_err, assert_ok, pallet_prelude::DispatchResult}; -pub use sp_runtime::DispatchError; - -// Polkadot -pub use xcm::{ - latest::ParentThen, - prelude::{AccountId32 as AccountId32Junction, *}, - v3, - v4::{ - Error, - NetworkId::{Rococo as RococoId, Westend as WestendId}, - }, -}; +#[cfg(test)] +mod imports { + // Substrate + pub use frame_support::{assert_err, assert_ok, pallet_prelude::DispatchResult}; + pub use sp_runtime::DispatchError; -// Bridges -pub use bp_messages::LaneId; + // Polkadot + pub use xcm::{ + latest::ParentThen, + prelude::{AccountId32 as AccountId32Junction, *}, + v3, + v4::NetworkId::Rococo as RococoId, + }; -// Cumulus -pub use emulated_integration_tests_common::{ - accounts::ALICE, - impls::Inspect, - test_parachain_is_trusted_teleporter, - xcm_emulator::{ - assert_expected_events, bx, helpers::weight_within_threshold, Chain, Parachain as Para, - RelayChain as Relay, Test, TestArgs, TestContext, TestExt, - }, - xcm_helpers::{xcm_transact_paid_execution, xcm_transact_unpaid_execution}, - PROOF_SIZE_THRESHOLD, REF_TIME_THRESHOLD, XCM_V3, -}; -pub use parachains_common::{AccountId, Balance}; -pub use rococo_westend_system_emulated_network::{ - asset_hub_rococo_emulated_chain::{ - genesis::ED as ASSET_HUB_ROCOCO_ED, AssetHubRococoParaPallet as AssetHubRococoPallet, - }, - asset_hub_westend_emulated_chain::{ - genesis::ED as ASSET_HUB_WESTEND_ED, AssetHubWestendParaPallet as AssetHubWestendPallet, - }, - bridge_hub_westend_emulated_chain::{ - genesis::ED as BRIDGE_HUB_WESTEND_ED, BridgeHubWestendParaPallet as BridgeHubWestendPallet, - }, - westend_emulated_chain::WestendRelayPallet as WestendPallet, - AssetHubRococoPara as AssetHubRococo, AssetHubRococoParaReceiver as AssetHubRococoReceiver, - AssetHubRococoParaSender as AssetHubRococoSender, AssetHubWestendPara as AssetHubWestend, - AssetHubWestendParaReceiver as AssetHubWestendReceiver, - AssetHubWestendParaSender as AssetHubWestendSender, BridgeHubRococoPara as BridgeHubRococo, - BridgeHubWestendPara as BridgeHubWestend, BridgeHubWestendParaSender as BridgeHubWestendSender, - WestendRelay as Westend, -}; + // Cumulus + pub use emulated_integration_tests_common::{ + accounts::ALICE, + impls::Inspect, + test_parachain_is_trusted_teleporter, + xcm_emulator::{ + assert_expected_events, bx, Chain, Parachain as Para, RelayChain as Relay, TestExt, + }, + }; + pub use parachains_common::AccountId; + pub use rococo_westend_system_emulated_network::{ + asset_hub_rococo_emulated_chain::{ + genesis::ED as ASSET_HUB_ROCOCO_ED, AssetHubRococoParaPallet as AssetHubRococoPallet, + }, + asset_hub_westend_emulated_chain::{ + genesis::ED as ASSET_HUB_WESTEND_ED, AssetHubWestendParaPallet as AssetHubWestendPallet, + }, + bridge_hub_westend_emulated_chain::{ + genesis::ED as BRIDGE_HUB_WESTEND_ED, + BridgeHubWestendParaPallet as BridgeHubWestendPallet, + }, + westend_emulated_chain::WestendRelayPallet as WestendPallet, + AssetHubRococoPara as AssetHubRococo, AssetHubRococoParaReceiver as AssetHubRococoReceiver, + AssetHubRococoParaSender as AssetHubRococoSender, AssetHubWestendPara as AssetHubWestend, + AssetHubWestendParaReceiver as AssetHubWestendReceiver, + AssetHubWestendParaSender as AssetHubWestendSender, BridgeHubRococoPara as BridgeHubRococo, + BridgeHubWestendPara as BridgeHubWestend, + BridgeHubWestendParaSender as BridgeHubWestendSender, WestendRelay as Westend, + }; -pub const ASSET_ID: u32 = 1; -pub const ASSET_MIN_BALANCE: u128 = 1000; -pub const ASSETS_PALLET_ID: u8 = 50; + pub const ASSET_MIN_BALANCE: u128 = 1000; +} #[cfg(test)] mod tests; diff --git a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/tests/asset_transfers.rs b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/tests/asset_transfers.rs index c2a9c008902222f9d9a1206b59b3f510147ddbea..5b0990973d2103f7fa606c4abcccd41a893067d2 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/tests/asset_transfers.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/tests/asset_transfers.rs @@ -182,13 +182,13 @@ fn send_rocs_from_asset_hub_westend_to_asset_hub_rococo() { vec![ // ROC is withdrawn from AHW's SA on AHR RuntimeEvent::Balances( - pallet_balances::Event::Withdraw { who, amount } + pallet_balances::Event::Burned { who, amount } ) => { who: *who == sov_ahw_on_ahr, amount: *amount == amount_to_send, }, // ROCs deposited to beneficiary - RuntimeEvent::Balances(pallet_balances::Event::Deposit { who, .. }) => { + RuntimeEvent::Balances(pallet_balances::Event::Minted { who, .. }) => { who: *who == AssetHubRococoReceiver::get(), }, // message processed successfully diff --git a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/tests/mod.rs b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/tests/mod.rs index 186b96b3976926b6f75995cc47e8e4c9c63b6f48..b781d6e987ca1fc7f2a64710263f432c1cc8b3c6 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/tests/mod.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/tests/mod.rs @@ -13,7 +13,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -use crate::*; +use crate::imports::*; mod asset_transfers; mod send_xcm; @@ -67,7 +67,7 @@ pub(crate) fn assert_bridge_hub_westend_message_accepted(expected_processed: boo BridgeHubWestend, vec![ // pay for bridge fees - RuntimeEvent::Balances(pallet_balances::Event::Withdraw { .. }) => {}, + RuntimeEvent::Balances(pallet_balances::Event::Burned { .. }) => {}, // message exported RuntimeEvent::BridgeRococoMessages( pallet_bridge_messages::Event::MessageAccepted { .. } diff --git a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/tests/send_xcm.rs b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/tests/send_xcm.rs index b01be5e8dc84b4edf35651d0388baa1462b54c9b..f69747c17704cb47e11ec00e2d8a08a413fab0a4 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/tests/send_xcm.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/tests/send_xcm.rs @@ -14,6 +14,7 @@ // limitations under the License. use crate::tests::*; +use codec::Encode; #[test] fn send_xcm_from_westend_relay_to_rococo_asset_hub_should_fail_on_not_applicable() { @@ -26,7 +27,7 @@ fn send_xcm_from_westend_relay_to_rococo_asset_hub_should_fail_on_not_applicable let remote_xcm = Xcm(vec![ClearOrigin]); - let xcm = VersionedXcm::from(Xcm(vec![ + let xcm = VersionedXcm::from(Xcm::<()>(vec![ UnpaidExecution { weight_limit, check_origin }, ExportMessage { network: RococoId, @@ -38,10 +39,10 @@ fn send_xcm_from_westend_relay_to_rococo_asset_hub_should_fail_on_not_applicable // Westend Global Consensus // Send XCM message from Relay Chain to Bridge Hub source Parachain Westend::execute_with(|| { - assert_ok!(::XcmPallet::send( + assert_ok!(::XcmPallet::send_blob( sudo_origin, bx!(destination), - bx!(xcm), + xcm.encode().try_into().unwrap(), )); type RuntimeEvent = ::RuntimeEvent; diff --git a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/tests/teleport.rs b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/tests/teleport.rs index edffaf165960cc17f1703cd567019879b1de22e4..c960233c08b73df30b2f873f2ef5333ea15bf428 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/tests/teleport.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/tests/teleport.rs @@ -13,7 +13,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -use crate::*; +use crate::tests::*; use bridge_hub_westend_runtime::xcm_config::XcmConfig; #[test] diff --git a/cumulus/parachains/integration-tests/emulated/tests/people/people-rococo/Cargo.toml b/cumulus/parachains/integration-tests/emulated/tests/people/people-rococo/Cargo.toml index 609376c1fee606c6d3d284c0be8f5c30997acfb6..1570aa7662fcbbfe1b018251d2700ce2d653d165 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/people/people-rococo/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/tests/people/people-rococo/Cargo.toml @@ -26,7 +26,7 @@ polkadot-runtime-common = { path = "../../../../../../../polkadot/runtime/common # Cumulus asset-test-utils = { path = "../../../../../runtimes/assets/test-utils" } -parachains-common = { path = "../../../../../../parachains/common" } +parachains-common = { path = "../../../../../common" } people-rococo-runtime = { path = "../../../../../runtimes/people/people-rococo" } emulated-integration-tests-common = { path = "../../../common", default-features = false } rococo-system-emulated-network = { path = "../../../networks/rococo-system" } diff --git a/cumulus/parachains/integration-tests/emulated/tests/people/people-rococo/src/lib.rs b/cumulus/parachains/integration-tests/emulated/tests/people/people-rococo/src/lib.rs index 6f2f1409135df0136b991ede4caa0ffdc53ffd63..38ff08b486d4703513ab74d681ae5f07107931ec 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/people/people-rococo/src/lib.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/people/people-rococo/src/lib.rs @@ -13,52 +13,41 @@ // See the License for the specific language governing permissions and // limitations under the License. -pub use codec::Encode; +#[cfg(test)] +mod imports { + pub use codec::Encode; -// Substrate -pub use frame_support::{ - assert_err, assert_ok, - pallet_prelude::Weight, - sp_runtime::{AccountId32, DispatchError, DispatchResult}, - traits::fungibles::Inspect, -}; + // Substrate + pub use frame_support::{ + assert_ok, + pallet_prelude::Weight, + sp_runtime::{AccountId32, DispatchResult}, + traits::fungibles::Inspect, + }; -// Polkadot -pub use xcm::{ - prelude::{AccountId32 as AccountId32Junction, *}, - v3::{Error, NetworkId::Rococo as RococoId}, -}; + // Polkadot + pub use xcm::prelude::*; -// Cumulus -pub use asset_test_utils::xcm_helpers; -pub use emulated_integration_tests_common::{ - test_parachain_is_trusted_teleporter, - xcm_emulator::{ - assert_expected_events, bx, helpers::weight_within_threshold, Chain, Parachain as Para, - RelayChain as Relay, Test, TestArgs, TestContext, TestExt, - }, - xcm_helpers::{xcm_transact_paid_execution, xcm_transact_unpaid_execution}, - PROOF_SIZE_THRESHOLD, REF_TIME_THRESHOLD, XCM_V3, -}; -pub use parachains_common::{AccountId, Balance}; -pub use rococo_system_emulated_network::{ - people_rococo_emulated_chain::{ - genesis::ED as PEOPLE_ROCOCO_ED, PeopleRococoParaPallet as PeopleRococoPallet, - }, - rococo_emulated_chain::{genesis::ED as ROCOCO_ED, RococoRelayPallet as RococoPallet}, - PenpalAPara as PenpalA, PeopleRococoPara as PeopleRococo, - PeopleRococoParaReceiver as PeopleRococoReceiver, PeopleRococoParaSender as PeopleRococoSender, - RococoRelay as Rococo, RococoRelayReceiver as RococoReceiver, - RococoRelaySender as RococoSender, -}; + // Cumulus + pub use asset_test_utils::xcm_helpers; + pub use emulated_integration_tests_common::xcm_emulator::{ + assert_expected_events, bx, Chain, Parachain as Para, RelayChain as Relay, Test, TestArgs, + TestContext, TestExt, + }; + pub use parachains_common::Balance; + pub use rococo_system_emulated_network::{ + people_rococo_emulated_chain::{ + genesis::ED as PEOPLE_ROCOCO_ED, PeopleRococoParaPallet as PeopleRococoPallet, + }, + rococo_emulated_chain::{genesis::ED as ROCOCO_ED, RococoRelayPallet as RococoPallet}, + PeopleRococoPara as PeopleRococo, PeopleRococoParaReceiver as PeopleRococoReceiver, + PeopleRococoParaSender as PeopleRococoSender, RococoRelay as Rococo, + RococoRelayReceiver as RococoReceiver, RococoRelaySender as RococoSender, + }; -// pub const ASSET_ID: u32 = 1; -// pub const ASSET_MIN_BALANCE: u128 = 1000; -pub type RelayToSystemParaTest = Test; -pub type RelayToParaTest = Test; -pub type SystemParaToRelayTest = Test; -pub type SystemParaToParaTest = Test; -pub type ParaToSystemParaTest = Test; + pub type RelayToSystemParaTest = Test; + pub type SystemParaToRelayTest = Test; +} #[cfg(test)] mod tests; diff --git a/cumulus/parachains/integration-tests/emulated/tests/people/people-rococo/src/tests/reap_identity.rs b/cumulus/parachains/integration-tests/emulated/tests/people/people-rococo/src/tests/reap_identity.rs index 58bb9504dbd6bdaffc25c4f8b96424a96309d20a..3f1f8638d6fa1491288cd6bbd60f08c13af566dd 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/people/people-rococo/src/tests/reap_identity.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/people/people-rococo/src/tests/reap_identity.rs @@ -38,7 +38,7 @@ //! - The freed deposit from the Relay Chain is sufficient for the parachain deposit; and //! - The account will exist on the parachain. -use crate::*; +use crate::imports::*; use frame_support::BoundedVec; use pallet_balances::Event as BalancesEvent; use pallet_identity::{legacy::IdentityInfo, Data, Event as IdentityEvent}; @@ -366,7 +366,7 @@ fn assert_reap_events(id_deposit: Balance, id: &Identity) { PeopleRococo, vec![ // Deposit and Endowed from teleport - RuntimeEvent::Balances(BalancesEvent::Deposit { .. }) => {}, + RuntimeEvent::Balances(BalancesEvent::Minted { .. }) => {}, RuntimeEvent::Balances(BalancesEvent::Endowed { .. }) => {}, // Amount reserved for identity info RuntimeEvent::Balances(BalancesEvent::Reserved { who, amount }) => { @@ -392,7 +392,7 @@ fn assert_reap_events(id_deposit: Balance, id: &Identity) { PeopleRococo, vec![ // Deposit and Endowed from teleport - RuntimeEvent::Balances(BalancesEvent::Deposit { .. }) => {}, + RuntimeEvent::Balances(BalancesEvent::Minted { .. }) => {}, RuntimeEvent::Balances(BalancesEvent::Endowed { .. }) => {}, // Amount reserved for identity info RuntimeEvent::Balances(BalancesEvent::Reserved { who, amount }) => { diff --git a/cumulus/parachains/integration-tests/emulated/tests/people/people-rococo/src/tests/teleport.rs b/cumulus/parachains/integration-tests/emulated/tests/people/people-rococo/src/tests/teleport.rs index 42c7e310b2628eb97011ff36f6c8db2b3dbd130c..350d87d638ab25bd66a411a67fa3f109bdaffff9 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/people/people-rococo/src/tests/teleport.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/people/people-rococo/src/tests/teleport.rs @@ -13,7 +13,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -use crate::*; +use crate::imports::*; use people_rococo_runtime::xcm_config::XcmConfig as PeopleRococoXcmConfig; use rococo_runtime::xcm_config::XcmConfig as RococoXcmConfig; @@ -25,12 +25,12 @@ fn relay_origin_assertions(t: RelayToSystemParaTest) { Rococo, vec![ // Amount to teleport is withdrawn from Sender - RuntimeEvent::Balances(pallet_balances::Event::Withdraw { who, amount }) => { + RuntimeEvent::Balances(pallet_balances::Event::Burned { who, amount }) => { who: *who == t.sender.account_id, amount: *amount == t.args.amount, }, // Amount to teleport is deposited in Relay's `CheckAccount` - RuntimeEvent::Balances(pallet_balances::Event::Deposit { who, amount }) => { + RuntimeEvent::Balances(pallet_balances::Event::Minted { who, amount }) => { who: *who == ::XcmPallet::check_account(), amount: *amount == t.args.amount, }, @@ -51,12 +51,12 @@ fn relay_dest_assertions(t: SystemParaToRelayTest) { Rococo, vec![ // Amount is withdrawn from Relay Chain's `CheckAccount` - RuntimeEvent::Balances(pallet_balances::Event::Withdraw { who, amount }) => { + RuntimeEvent::Balances(pallet_balances::Event::Burned { who, amount }) => { who: *who == ::XcmPallet::check_account(), amount: *amount == t.args.amount, }, // Amount minus fees are deposited in Receiver's account - RuntimeEvent::Balances(pallet_balances::Event::Deposit { who, .. }) => { + RuntimeEvent::Balances(pallet_balances::Event::Minted { who, .. }) => { who: *who == t.receiver.account_id, }, ] @@ -85,7 +85,7 @@ fn para_origin_assertions(t: SystemParaToRelayTest) { PeopleRococo, vec![ // Amount is withdrawn from Sender's account - RuntimeEvent::Balances(pallet_balances::Event::Withdraw { who, amount }) => { + RuntimeEvent::Balances(pallet_balances::Event::Burned { who, amount }) => { who: *who == t.sender.account_id, amount: *amount == t.args.amount, }, @@ -102,7 +102,7 @@ fn para_dest_assertions(t: RelayToSystemParaTest) { PeopleRococo, vec![ // Amount minus fees are deposited in Receiver's account - RuntimeEvent::Balances(pallet_balances::Event::Deposit { who, .. }) => { + RuntimeEvent::Balances(pallet_balances::Event::Minted { who, .. }) => { who: *who == t.receiver.account_id, }, ] @@ -155,7 +155,7 @@ fn limited_teleport_native_assets_from_relay_to_system_para_works() { test.assert(); let delivery_fees = Rococo::execute_with(|| { - xcm_helpers::transfer_assets_delivery_fees::< + xcm_helpers::teleport_assets_delivery_fees::< ::XcmSender, >(test.args.assets.clone(), 0, test.args.weight_limit, test.args.beneficiary, test.args.dest) }); @@ -204,7 +204,7 @@ fn limited_teleport_native_assets_back_from_system_para_to_relay_works() { let receiver_balance_after = test.receiver.balance; let delivery_fees = PeopleRococo::execute_with(|| { - xcm_helpers::transfer_assets_delivery_fees::< + xcm_helpers::teleport_assets_delivery_fees::< ::XcmSender, >(test.args.assets.clone(), 0, test.args.weight_limit, test.args.beneficiary, test.args.dest) }); @@ -248,7 +248,7 @@ fn limited_teleport_native_assets_from_system_para_to_relay_fails() { let receiver_balance_after = test.receiver.balance; let delivery_fees = PeopleRococo::execute_with(|| { - xcm_helpers::transfer_assets_delivery_fees::< + xcm_helpers::teleport_assets_delivery_fees::< ::XcmSender, >(test.args.assets.clone(), 0, test.args.weight_limit, test.args.beneficiary, test.args.dest) }); diff --git a/cumulus/parachains/integration-tests/emulated/tests/people/people-westend/Cargo.toml b/cumulus/parachains/integration-tests/emulated/tests/people/people-westend/Cargo.toml index f2f3366798a0aacc77fe279efd1b47032c62c7dc..bc093dc0de6356d7cd98d20d12d63748ed248ff5 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/people/people-westend/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/tests/people/people-westend/Cargo.toml @@ -26,7 +26,7 @@ polkadot-runtime-common = { path = "../../../../../../../polkadot/runtime/common # Cumulus asset-test-utils = { path = "../../../../../runtimes/assets/test-utils" } -parachains-common = { path = "../../../../../../parachains/common" } +parachains-common = { path = "../../../../../common" } people-westend-runtime = { path = "../../../../../runtimes/people/people-westend" } emulated-integration-tests-common = { path = "../../../common", default-features = false } westend-system-emulated-network = { path = "../../../networks/westend-system" } diff --git a/cumulus/parachains/integration-tests/emulated/tests/people/people-westend/src/lib.rs b/cumulus/parachains/integration-tests/emulated/tests/people/people-westend/src/lib.rs index 59cec36030b236135af7898ed87f6548cc12cbd4..77ac7cfc78c78c6f51ea174b2436d05ee612e0b7 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/people/people-westend/src/lib.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/people/people-westend/src/lib.rs @@ -13,52 +13,40 @@ // See the License for the specific language governing permissions and // limitations under the License. -pub use codec::Encode; - -// Substrate -pub use frame_support::{ - assert_err, assert_ok, - pallet_prelude::Weight, - sp_runtime::{AccountId32, DispatchError, DispatchResult}, - traits::fungibles::Inspect, -}; +#[cfg(test)] +mod imports { + pub use codec::Encode; + // Substrate + pub use frame_support::{ + assert_ok, + pallet_prelude::Weight, + sp_runtime::{AccountId32, DispatchResult}, + traits::fungibles::Inspect, + }; -// Polkadot -pub use xcm::{ - prelude::{AccountId32 as AccountId32Junction, *}, - v3::{Error, NetworkId::Westend as WestendId}, -}; + // Polkadot + pub use xcm::prelude::*; -// Cumulus -pub use asset_test_utils::xcm_helpers; -pub use emulated_integration_tests_common::{ - test_parachain_is_trusted_teleporter, - xcm_emulator::{ - assert_expected_events, bx, helpers::weight_within_threshold, Chain, Parachain as Para, - RelayChain as Relay, Test, TestArgs, TestContext, TestExt, - }, - xcm_helpers::{xcm_transact_paid_execution, xcm_transact_unpaid_execution}, - PROOF_SIZE_THRESHOLD, REF_TIME_THRESHOLD, XCM_V3, -}; -pub use parachains_common::{AccountId, Balance}; -pub use westend_system_emulated_network::{ - people_westend_emulated_chain::{ - genesis::ED as PEOPLE_WESTEND_ED, PeopleWestendParaPallet as PeopleWestendPallet, - }, - westend_emulated_chain::{genesis::ED as WESTEND_ED, WestendRelayPallet as WestendPallet}, - PenpalAPara as PenpalA, PeopleWestendPara as PeopleWestend, - PeopleWestendParaReceiver as PeopleWestendReceiver, - PeopleWestendParaSender as PeopleWestendSender, WestendRelay as Westend, - WestendRelayReceiver as WestendReceiver, WestendRelaySender as WestendSender, -}; + // Cumulus + pub use asset_test_utils::xcm_helpers; + pub use emulated_integration_tests_common::xcm_emulator::{ + assert_expected_events, bx, Chain, Parachain as Para, RelayChain as Relay, Test, TestArgs, + TestContext, TestExt, + }; + pub use parachains_common::Balance; + pub use westend_system_emulated_network::{ + people_westend_emulated_chain::{ + genesis::ED as PEOPLE_WESTEND_ED, PeopleWestendParaPallet as PeopleWestendPallet, + }, + westend_emulated_chain::{genesis::ED as WESTEND_ED, WestendRelayPallet as WestendPallet}, + PeopleWestendPara as PeopleWestend, PeopleWestendParaReceiver as PeopleWestendReceiver, + PeopleWestendParaSender as PeopleWestendSender, WestendRelay as Westend, + WestendRelayReceiver as WestendReceiver, WestendRelaySender as WestendSender, + }; -// pub const ASSET_ID: u32 = 1; -// pub const ASSET_MIN_BALANCE: u128 = 1000; -pub type RelayToSystemParaTest = Test; -pub type RelayToParaTest = Test; -pub type SystemParaToRelayTest = Test; -pub type SystemParaToParaTest = Test; -pub type ParaToSystemParaTest = Test; + pub type RelayToSystemParaTest = Test; + pub type SystemParaToRelayTest = Test; +} #[cfg(test)] mod tests; diff --git a/cumulus/parachains/integration-tests/emulated/tests/people/people-westend/src/tests/reap_identity.rs b/cumulus/parachains/integration-tests/emulated/tests/people/people-westend/src/tests/reap_identity.rs index 246c612a6810c053c4912c9c15f12c8e051eb06c..3ed8592918d65b81737a4e8206a3bc23b3684b5f 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/people/people-westend/src/tests/reap_identity.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/people/people-westend/src/tests/reap_identity.rs @@ -38,7 +38,7 @@ //! - The freed deposit from the Relay Chain is sufficient for the parachain deposit; and //! - The account will exist on the parachain. -use crate::*; +use crate::imports::*; use frame_support::BoundedVec; use pallet_balances::Event as BalancesEvent; use pallet_identity::{legacy::IdentityInfo, Data, Event as IdentityEvent}; @@ -368,7 +368,7 @@ fn assert_reap_events(id_deposit: Balance, id: &Identity) { PeopleWestend, vec![ // Deposit and Endowed from teleport - RuntimeEvent::Balances(BalancesEvent::Deposit { .. }) => {}, + RuntimeEvent::Balances(BalancesEvent::Minted { .. }) => {}, RuntimeEvent::Balances(BalancesEvent::Endowed { .. }) => {}, // Amount reserved for identity info RuntimeEvent::Balances(BalancesEvent::Reserved { who, amount }) => { @@ -394,7 +394,7 @@ fn assert_reap_events(id_deposit: Balance, id: &Identity) { PeopleWestend, vec![ // Deposit and Endowed from teleport - RuntimeEvent::Balances(BalancesEvent::Deposit { .. }) => {}, + RuntimeEvent::Balances(BalancesEvent::Minted { .. }) => {}, RuntimeEvent::Balances(BalancesEvent::Endowed { .. }) => {}, // Amount reserved for identity info RuntimeEvent::Balances(BalancesEvent::Reserved { who, amount }) => { diff --git a/cumulus/parachains/integration-tests/emulated/tests/people/people-westend/src/tests/teleport.rs b/cumulus/parachains/integration-tests/emulated/tests/people/people-westend/src/tests/teleport.rs index e9f0158efbf5e7c344125463991072f3fe77c02f..8697477ba769329755b40a87132c62b213861cc4 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/people/people-westend/src/tests/teleport.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/people/people-westend/src/tests/teleport.rs @@ -13,7 +13,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -use crate::*; +use crate::imports::*; use people_westend_runtime::xcm_config::XcmConfig as PeopleWestendXcmConfig; use westend_runtime::xcm_config::XcmConfig as WestendXcmConfig; @@ -25,12 +25,12 @@ fn relay_origin_assertions(t: RelayToSystemParaTest) { Westend, vec![ // Amount to teleport is withdrawn from Sender - RuntimeEvent::Balances(pallet_balances::Event::Withdraw { who, amount }) => { + RuntimeEvent::Balances(pallet_balances::Event::Burned { who, amount }) => { who: *who == t.sender.account_id, amount: *amount == t.args.amount, }, // Amount to teleport is deposited in Relay's `CheckAccount` - RuntimeEvent::Balances(pallet_balances::Event::Deposit { who, amount }) => { + RuntimeEvent::Balances(pallet_balances::Event::Minted { who, amount }) => { who: *who == ::XcmPallet::check_account(), amount: *amount == t.args.amount, }, @@ -51,12 +51,12 @@ fn relay_dest_assertions(t: SystemParaToRelayTest) { Westend, vec![ // Amount is withdrawn from Relay Chain's `CheckAccount` - RuntimeEvent::Balances(pallet_balances::Event::Withdraw { who, amount }) => { + RuntimeEvent::Balances(pallet_balances::Event::Burned { who, amount }) => { who: *who == ::XcmPallet::check_account(), amount: *amount == t.args.amount, }, // Amount minus fees are deposited in Receiver's account - RuntimeEvent::Balances(pallet_balances::Event::Deposit { who, .. }) => { + RuntimeEvent::Balances(pallet_balances::Event::Minted { who, .. }) => { who: *who == t.receiver.account_id, }, ] @@ -85,7 +85,7 @@ fn para_origin_assertions(t: SystemParaToRelayTest) { PeopleWestend, vec![ // Amount is withdrawn from Sender's account - RuntimeEvent::Balances(pallet_balances::Event::Withdraw { who, amount }) => { + RuntimeEvent::Balances(pallet_balances::Event::Burned { who, amount }) => { who: *who == t.sender.account_id, amount: *amount == t.args.amount, }, @@ -102,7 +102,7 @@ fn para_dest_assertions(t: RelayToSystemParaTest) { PeopleWestend, vec![ // Amount minus fees are deposited in Receiver's account - RuntimeEvent::Balances(pallet_balances::Event::Deposit { who, .. }) => { + RuntimeEvent::Balances(pallet_balances::Event::Minted { who, .. }) => { who: *who == t.receiver.account_id, }, ] @@ -155,7 +155,7 @@ fn limited_teleport_native_assets_from_relay_to_system_para_works() { test.assert(); let delivery_fees = Westend::execute_with(|| { - xcm_helpers::transfer_assets_delivery_fees::< + xcm_helpers::teleport_assets_delivery_fees::< ::XcmSender, >(test.args.assets.clone(), 0, test.args.weight_limit, test.args.beneficiary, test.args.dest) }); @@ -204,7 +204,7 @@ fn limited_teleport_native_assets_back_from_system_para_to_relay_works() { let receiver_balance_after = test.receiver.balance; let delivery_fees = PeopleWestend::execute_with(|| { - xcm_helpers::transfer_assets_delivery_fees::< + xcm_helpers::teleport_assets_delivery_fees::< ::XcmSender, >(test.args.assets.clone(), 0, test.args.weight_limit, test.args.beneficiary, test.args.dest) }); @@ -248,7 +248,7 @@ fn limited_teleport_native_assets_from_system_para_to_relay_fails() { let receiver_balance_after = test.receiver.balance; let delivery_fees = PeopleWestend::execute_with(|| { - xcm_helpers::transfer_assets_delivery_fees::< + xcm_helpers::teleport_assets_delivery_fees::< ::XcmSender, >(test.args.assets.clone(), 0, test.args.weight_limit, test.args.beneficiary, test.args.dest) }); diff --git a/cumulus/parachains/pallets/collective-content/Cargo.toml b/cumulus/parachains/pallets/collective-content/Cargo.toml index 691be02f5b8e390bf150713bcf127af1e2ce44b0..b3fac47cb4ae2d78bdf7431d877a4a6edeb34ebb 100644 --- a/cumulus/parachains/pallets/collective-content/Cargo.toml +++ b/cumulus/parachains/pallets/collective-content/Cargo.toml @@ -11,9 +11,9 @@ workspace = true [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive", "max-encoded-len"] } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } -frame-benchmarking = { path = "../../../../substrate/frame/benchmarking", optional = true, default-features = false } +frame-benchmarking = { path = "../../../../substrate/frame/benchmarking", default-features = false, optional = true } frame-support = { path = "../../../../substrate/frame/support", default-features = false } frame-system = { path = "../../../../substrate/frame/system", default-features = false } diff --git a/cumulus/parachains/pallets/collective-content/src/benchmarking.rs b/cumulus/parachains/pallets/collective-content/src/benchmarking.rs index 943386a842766129c2b5d429dc3a9648249ea73f..3d6bf073778a294e39287285ddb8379d57d36c8f 100644 --- a/cumulus/parachains/pallets/collective-content/src/benchmarking.rs +++ b/cumulus/parachains/pallets/collective-content/src/benchmarking.rs @@ -16,7 +16,7 @@ //! The pallet benchmarks. use super::{Pallet as CollectiveContent, *}; -use frame_benchmarking::{impl_benchmark_test_suite, v2::*}; +use frame_benchmarking::v2::*; use frame_support::traits::EnsureOrigin; fn assert_last_event, I: 'static>(generic_event: >::RuntimeEvent) { diff --git a/cumulus/parachains/pallets/collective-content/src/lib.rs b/cumulus/parachains/pallets/collective-content/src/lib.rs index 7a685858accb67868837e734ba9808741a4f7ea1..b1c960ad6a0d337d6b84aaaba59f7fa0625a8124 100644 --- a/cumulus/parachains/pallets/collective-content/src/lib.rs +++ b/cumulus/parachains/pallets/collective-content/src/lib.rs @@ -59,7 +59,7 @@ pub mod pallet { use frame_system::pallet_prelude::*; use sp_runtime::{traits::BadOrigin, Saturating}; - /// The current storage version. + /// The in-code storage version. const STORAGE_VERSION: StorageVersion = StorageVersion::new(0); #[pallet::pallet] diff --git a/cumulus/parachains/pallets/collective-content/src/mock.rs b/cumulus/parachains/pallets/collective-content/src/mock.rs index 7a752da71fceff211679e4b87428198c52f87e5d..5cb0126425e59a67332d880cc8b925f50b1753c2 100644 --- a/cumulus/parachains/pallets/collective-content/src/mock.rs +++ b/cumulus/parachains/pallets/collective-content/src/mock.rs @@ -55,7 +55,7 @@ impl pallet_collective_content::Config for Test { type WeightInfo = CCWeightInfo; } -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { type BaseCallFilter = (); type BlockWeights = (); diff --git a/cumulus/parachains/pallets/parachain-info/Cargo.toml b/cumulus/parachains/pallets/parachain-info/Cargo.toml index 0e2f965e1cffb114729b16612b12b146ce61e0da..17981d238fd1880e81ce04ebbe5b2a045ba27e41 100644 --- a/cumulus/parachains/pallets/parachain-info/Cargo.toml +++ b/cumulus/parachains/pallets/parachain-info/Cargo.toml @@ -11,7 +11,7 @@ workspace = true [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } frame-support = { path = "../../../../substrate/frame/support", default-features = false } frame-system = { path = "../../../../substrate/frame/system", default-features = false } diff --git a/cumulus/parachains/pallets/parachain-info/src/lib.rs b/cumulus/parachains/pallets/parachain-info/src/lib.rs index c17a6d5e1460a2ef319109c0d867b6c73a6493e0..a4ef448a6b6b9b934e9e49a4a4797a590ad55d6b 100644 --- a/cumulus/parachains/pallets/parachain-info/src/lib.rs +++ b/cumulus/parachains/pallets/parachain-info/src/lib.rs @@ -54,7 +54,7 @@ pub mod pallet { #[pallet::genesis_build] impl BuildGenesisConfig for GenesisConfig { fn build(&self) { - >::put(self.parachain_id); + ParachainId::::put(self.parachain_id); } } @@ -64,13 +64,18 @@ pub mod pallet { } #[pallet::storage] - #[pallet::getter(fn parachain_id)] pub(super) type ParachainId = StorageValue<_, ParaId, ValueQuery, DefaultForParachainId>; impl Get for Pallet { fn get() -> ParaId { - Self::parachain_id() + ParachainId::::get() + } + } + + impl Pallet { + pub fn parachain_id() -> ParaId { + ParachainId::::get() } } } diff --git a/cumulus/parachains/pallets/ping/Cargo.toml b/cumulus/parachains/pallets/ping/Cargo.toml index 1afd55eb0b9273d37d025eb3520c9dd8be122048..15169b08b9108998d850f6333e458d73580d1b2a 100644 --- a/cumulus/parachains/pallets/ping/Cargo.toml +++ b/cumulus/parachains/pallets/ping/Cargo.toml @@ -11,7 +11,7 @@ workspace = true [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } sp-std = { path = "../../../../substrate/primitives/std", default-features = false } sp-runtime = { path = "../../../../substrate/primitives/runtime", default-features = false } diff --git a/cumulus/parachains/runtimes/assets/asset-hub-rococo/Cargo.toml b/cumulus/parachains/runtimes/assets/asset-hub-rococo/Cargo.toml index d1b302dc6d4f3bf3f51fa6d444c288f78bfefe7e..0733156716c11a6e1e50c9d921f059a2e2c1b193 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-rococo/Cargo.toml +++ b/cumulus/parachains/runtimes/assets/asset-hub-rococo/Cargo.toml @@ -12,8 +12,8 @@ workspace = true [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive", "max-encoded-len"] } hex-literal = { version = "0.4.1" } -log = { version = "0.4.20", default-features = false } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +log = { workspace = true } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } # Substrate frame-benchmarking = { path = "../../../../../substrate/frame/benchmarking", default-features = false, optional = true } @@ -78,6 +78,7 @@ cumulus-pallet-xcmp-queue = { path = "../../../../pallets/xcmp-queue", default-f cumulus-primitives-aura = { path = "../../../../primitives/aura", default-features = false } cumulus-primitives-core = { path = "../../../../primitives/core", default-features = false } cumulus-primitives-utility = { path = "../../../../primitives/utility", default-features = false } +cumulus-primitives-storage-weight-reclaim = { path = "../../../../primitives/storage-weight-reclaim", default-features = false } pallet-collator-selection = { path = "../../../../pallets/collator-selection", default-features = false } parachain-info = { package = "staging-parachain-info", path = "../../../pallets/parachain-info", default-features = false } parachains-common = { path = "../../../common", default-features = false } @@ -86,10 +87,10 @@ assets-common = { path = "../common", default-features = false } # Bridges pallet-xcm-bridge-hub-router = { path = "../../../../../bridges/modules/xcm-bridge-hub-router", default-features = false } -bp-asset-hub-rococo = { path = "../../../../../bridges/primitives/chain-asset-hub-rococo", default-features = false } -bp-asset-hub-westend = { path = "../../../../../bridges/primitives/chain-asset-hub-westend", default-features = false } -bp-bridge-hub-rococo = { path = "../../../../../bridges/primitives/chain-bridge-hub-rococo", default-features = false } -bp-bridge-hub-westend = { path = "../../../../../bridges/primitives/chain-bridge-hub-westend", default-features = false } +bp-asset-hub-rococo = { path = "../../../../../bridges/chains/chain-asset-hub-rococo", default-features = false } +bp-asset-hub-westend = { path = "../../../../../bridges/chains/chain-asset-hub-westend", default-features = false } +bp-bridge-hub-rococo = { path = "../../../../../bridges/chains/chain-bridge-hub-rococo", default-features = false } +bp-bridge-hub-westend = { path = "../../../../../bridges/chains/chain-bridge-hub-westend", default-features = false } snowbridge-router-primitives = { path = "../../../../../bridges/snowbridge/primitives/router", default-features = false } [dev-dependencies] @@ -190,6 +191,7 @@ std = [ "cumulus-pallet-xcmp-queue/std", "cumulus-primitives-aura/std", "cumulus-primitives-core/std", + "cumulus-primitives-storage-weight-reclaim/std", "cumulus-primitives-utility/std", "frame-benchmarking?/std", "frame-executive/std", @@ -251,8 +253,6 @@ std = [ "xcm/std", ] -experimental = ["pallet-aura/experimental"] - # A feature that should be enabled when the runtime should be built for on-chain # deployment. This will disable stuff that shouldn't be part of the on-chain wasm # to make it smaller, like logging for example. diff --git a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/lib.rs b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/lib.rs index cdae0424883270f530da5f6115054da72c907a28..3f51b209f2e09e5fef0fc8cd20d000670133f7b1 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/lib.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/lib.rs @@ -55,7 +55,7 @@ use cumulus_primitives_core::ParaId; use frame_support::{ construct_runtime, derive_impl, dispatch::DispatchClass, - genesis_builder_helper::{build_config, create_default_config}, + genesis_builder_helper::{build_state, get_preset}, ord_parameter_types, parameter_types, traits::{ fungible, fungibles, tokens::imbalance::ResolveAssetTo, AsEnsureOriginWithArg, ConstBool, @@ -113,7 +113,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("statemine"), impl_name: create_runtime_str!("statemine"), authoring_version: 1, - spec_version: 1_006_000, + spec_version: 1_010_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 14, @@ -126,7 +126,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("statemine"), impl_name: create_runtime_str!("statemine"), authoring_version: 1, - spec_version: 1_006_000, + spec_version: 1_010_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 14, @@ -165,7 +165,7 @@ parameter_types! { } // Configure FRAME pallets to include in runtime. -#[derive_impl(frame_system::config_preludes::ParaChainDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::ParaChainDefaultConfig)] impl frame_system::Config for Runtime { type BlockWeights = RuntimeBlockWeights; type BlockLength = RuntimeBlockLength; @@ -187,10 +187,7 @@ impl pallet_timestamp::Config for Runtime { /// A timestamp: milliseconds since the unix epoch. type Moment = u64; type OnTimestampSet = Aura; - #[cfg(feature = "experimental")] type MinimumPeriod = ConstU64<0>; - #[cfg(not(feature = "experimental"))] - type MinimumPeriod = ConstU64<{ SLOT_DURATION / 2 }>; type WeightInfo = weights::pallet_timestamp::WeightInfo; } @@ -229,7 +226,7 @@ parameter_types! { impl pallet_transaction_payment::Config for Runtime { type RuntimeEvent = RuntimeEvent; type OnChargeTransaction = - pallet_transaction_payment::CurrencyAdapter>; + pallet_transaction_payment::FungibleAdapter>; type WeightToFee = WeightToFee; type LengthToFee = ConstantMultiplier; type FeeMultiplierUpdate = SlowAdjustingFeeUpdate; @@ -383,8 +380,8 @@ pub type ForeignAssetsInstance = pallet_assets::Instance2; impl pallet_assets::Config for Runtime { type RuntimeEvent = RuntimeEvent; type Balance = Balance; - type AssetId = xcm::v3::MultiLocation; - type AssetIdParameter = xcm::v3::MultiLocation; + type AssetId = xcm::v3::Location; + type AssetIdParameter = xcm::v3::Location; type Currency = Balances; type CreateOrigin = ForeignCreators< ( @@ -663,6 +660,7 @@ impl pallet_message_queue::Config for Runtime { type HeapSize = sp_core::ConstU32<{ 64 * 1024 }>; type MaxStale = sp_core::ConstU32<8>; type ServiceWeight = MessageQueueServiceWeight; + type IdleMaxServiceWeight = MessageQueueServiceWeight; } impl parachain_info::Config for Runtime {} @@ -723,7 +721,6 @@ impl pallet_aura::Config for Runtime { type DisabledValidators = (); type MaxAuthorities = ConstU32<100_000>; type AllowMultipleBlocksPerSlot = ConstBool; - #[cfg(feature = "experimental")] type SlotDuration = ConstU64; } @@ -958,6 +955,7 @@ pub type SignedExtra = ( frame_system::CheckNonce, frame_system::CheckWeight, pallet_asset_conversion_tx_payment::ChargeAssetTxPayment, + cumulus_primitives_storage_weight_reclaim::StorageWeightReclaim, ); /// Unchecked extrinsic type as expected by this runtime. pub type UncheckedExtrinsic = @@ -968,6 +966,8 @@ pub type Migrations = ( InitStorageVersions, // unreleased cumulus_pallet_xcmp_queue::migration::v4::MigrationToV4, + // permanent + pallet_xcm::migration::MigrateToLatestXcmVersion, ); /// Migration to initialize storage versions for pallets added after genesis. @@ -984,37 +984,37 @@ impl frame_support::traits::OnRuntimeUpgrade for InitStorageVersions { let mut writes = 0; if PolkadotXcm::on_chain_storage_version() == StorageVersion::new(0) { - PolkadotXcm::current_storage_version().put::(); + PolkadotXcm::in_code_storage_version().put::(); writes.saturating_inc(); } if Multisig::on_chain_storage_version() == StorageVersion::new(0) { - Multisig::current_storage_version().put::(); + Multisig::in_code_storage_version().put::(); writes.saturating_inc(); } if Assets::on_chain_storage_version() == StorageVersion::new(0) { - Assets::current_storage_version().put::(); + Assets::in_code_storage_version().put::(); writes.saturating_inc(); } if Uniques::on_chain_storage_version() == StorageVersion::new(0) { - Uniques::current_storage_version().put::(); + Uniques::in_code_storage_version().put::(); writes.saturating_inc(); } if Nfts::on_chain_storage_version() == StorageVersion::new(0) { - Nfts::current_storage_version().put::(); + Nfts::in_code_storage_version().put::(); writes.saturating_inc(); } if ForeignAssets::on_chain_storage_version() == StorageVersion::new(0) { - ForeignAssets::current_storage_version().put::(); + ForeignAssets::in_code_storage_version().put::(); writes.saturating_inc(); } if PoolAssets::on_chain_storage_version() == StorageVersion::new(0) { - PoolAssets::current_storage_version().put::(); + PoolAssets::in_code_storage_version().put::(); writes.saturating_inc(); } @@ -1041,6 +1041,7 @@ mod benches { [pallet_assets, Pool] [pallet_asset_conversion, AssetConversion] [pallet_balances, Balances] + [pallet_message_queue, MessageQueue] [pallet_multisig, Multisig] [pallet_nft_fractionalization, NftFractionalization] [pallet_nfts, Nfts] @@ -1050,6 +1051,7 @@ mod benches { [pallet_utility, Utility] [pallet_timestamp, Timestamp] [pallet_collator_selection, CollatorSelection] + [cumulus_pallet_parachain_system, ParachainSystem] [cumulus_pallet_xcmp_queue, XcmpQueue] [pallet_xcm_bridge_hub_router, ToWestend] // XCM @@ -1067,7 +1069,7 @@ impl_runtime_apis! { } fn authorities() -> Vec { - Aura::authorities().into_inner() + pallet_aura::Authorities::::get().into_inner() } } @@ -1089,7 +1091,7 @@ impl_runtime_apis! { Executive::execute_block(block) } - fn initialize_block(header: &::Header) { + fn initialize_block(header: &::Header) -> sp_runtime::ExtrinsicInclusionMode { Executive::initialize_block(header) } } @@ -1350,8 +1352,31 @@ impl_runtime_apis! { Config as XcmBridgeHubRouterConfig, }; + parameter_types! { + pub ExistentialDepositAsset: Option = Some(( + TokenLocation::get(), + ExistentialDeposit::get() + ).into()); + pub const RandomParaId: ParaId = ParaId::new(43211234); + } + use pallet_xcm::benchmarking::Pallet as PalletXcmExtrinsicsBenchmark; impl pallet_xcm::benchmarking::Config for Runtime { + type DeliveryHelper = ( + cumulus_primitives_utility::ToParentDeliveryHelper< + xcm_config::XcmConfig, + ExistentialDepositAsset, + xcm_config::PriceForParentDelivery, + >, + polkadot_runtime_common::xcm_sender::ToParachainDeliveryHelper< + xcm_config::XcmConfig, + ExistentialDepositAsset, + PriceForSiblingParachainDelivery, + RandomParaId, + ParachainSystem, + > + ); + fn reachable_dest() -> Option { Some(Parent.into()) } @@ -1360,7 +1385,7 @@ impl_runtime_apis! { // Relay/native token can be teleported between AH and Relay. Some(( Asset { - fun: Fungible(EXISTENTIAL_DEPOSIT), + fun: Fungible(ExistentialDeposit::get()), id: AssetId(Parent.into()) }, Parent.into(), @@ -1368,17 +1393,13 @@ impl_runtime_apis! { } fn reserve_transferable_asset_and_dest() -> Option<(Asset, Location)> { - // AH can reserve transfer native token to some random parachain. - let random_para_id = 43211234; - ParachainSystem::open_outbound_hrmp_channel_for_benchmarks_or_tests( - random_para_id.into() - ); Some(( Asset { - fun: Fungible(EXISTENTIAL_DEPOSIT), + fun: Fungible(ExistentialDeposit::get()), id: AssetId(Parent.into()) }, - ParentThen(Parachain(random_para_id).into()).into(), + // AH can reserve transfer native token to some random parachain. + ParentThen(Parachain(RandomParaId::get().into()).into()).into(), )) } @@ -1430,6 +1451,13 @@ impl_runtime_apis! { }); Some((assets, fee_index as u32, dest, verify)) } + + fn get_asset() -> Asset { + Asset { + id: AssetId(Location::parent()), + fun: Fungible(ExistentialDeposit::get()), + } + } } impl XcmBridgeHubRouterConfig for Runtime { @@ -1464,13 +1492,6 @@ impl_runtime_apis! { use xcm_config::{TokenLocation, MaxAssetsIntoHolding}; use pallet_xcm_benchmarks::asset_instance_from; - parameter_types! { - pub ExistentialDepositAsset: Option = Some(( - TokenLocation::get(), - ExistentialDeposit::get() - ).into()); - } - impl pallet_xcm_benchmarks::Config for Runtime { type XcmConfig = xcm_config::XcmConfig; type AccountIdConverter = xcm_config::LocationToAccountId; @@ -1627,12 +1648,16 @@ impl_runtime_apis! { } impl sp_genesis_builder::GenesisBuilder for Runtime { - fn create_default_config() -> Vec { - create_default_config::() + fn build_state(config: Vec) -> sp_genesis_builder::Result { + build_state::(config) + } + + fn get_preset(id: &Option) -> Option> { + get_preset::(id, |_| None) } - fn build_config(config: Vec) -> sp_genesis_builder::Result { - build_config::(config) + fn preset_names() -> Vec { + vec![] } } } diff --git a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/weights/pallet_xcm.rs b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/weights/pallet_xcm.rs index f8820bbb58cb24afe1afe034e131414368089444..e0e231d7da279022293d42aa5e3b3fc1b8ad12d5 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/weights/pallet_xcm.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/weights/pallet_xcm.rs @@ -16,10 +16,10 @@ //! Autogenerated weights for `pallet_xcm` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-12-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-03-21, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-r43aesjn-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! HOSTNAME: `runner-h2rr8wx7-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("asset-hub-rococo-dev")`, DB CACHE: 1024 // Executed Command: @@ -64,8 +64,30 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `145` // Estimated: `3610` - // Minimum execution time: 25_003_000 picoseconds. - Weight::from_parts(25_800_000, 0) + // Minimum execution time: 21_224_000 picoseconds. + Weight::from_parts(21_821_000, 0) + .saturating_add(Weight::from_parts(0, 3610)) + .saturating_add(T::DbWeight::get().reads(6)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: `ParachainSystem::UpwardDeliveryFeeFactor` (r:1 w:0) + /// Proof: `ParachainSystem::UpwardDeliveryFeeFactor` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) + /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) + /// Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) + /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) + /// Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) + /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + fn send_blob() -> Weight { + // Proof Size summary in bytes: + // Measured: `145` + // Estimated: `3610` + // Minimum execution time: 21_474_000 picoseconds. + Weight::from_parts(22_072_000, 0) .saturating_add(Weight::from_parts(0, 3610)) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) @@ -90,8 +112,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `145` // Estimated: `3610` - // Minimum execution time: 88_832_000 picoseconds. - Weight::from_parts(90_491_000, 0) + // Minimum execution time: 90_677_000 picoseconds. + Weight::from_parts(93_658_000, 0) .saturating_add(Weight::from_parts(0, 3610)) .saturating_add(T::DbWeight::get().reads(8)) .saturating_add(T::DbWeight::get().writes(3)) @@ -118,8 +140,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `400` // Estimated: `6196` - // Minimum execution time: 138_911_000 picoseconds. - Weight::from_parts(142_483_000, 0) + // Minimum execution time: 116_767_000 picoseconds. + Weight::from_parts(118_843_000, 0) .saturating_add(Weight::from_parts(0, 6196)) .saturating_add(T::DbWeight::get().reads(9)) .saturating_add(T::DbWeight::get().writes(5)) @@ -148,8 +170,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `496` // Estimated: `6208` - // Minimum execution time: 146_932_000 picoseconds. - Weight::from_parts(153_200_000, 0) + // Minimum execution time: 137_983_000 picoseconds. + Weight::from_parts(141_396_000, 0) .saturating_add(Weight::from_parts(0, 6208)) .saturating_add(T::DbWeight::get().reads(12)) .saturating_add(T::DbWeight::get().writes(7)) @@ -164,14 +186,24 @@ impl pallet_xcm::WeightInfo for WeightInfo { Weight::from_parts(18_446_744_073_709_551_000, 0) .saturating_add(Weight::from_parts(0, 0)) } + /// Storage: `Benchmark::Override` (r:0 w:0) + /// Proof: `Benchmark::Override` (`max_values`: None, `max_size`: None, mode: `Measured`) + fn execute_blob() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 18_446_744_073_709_551_000 picoseconds. + Weight::from_parts(18_446_744_073_709_551_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + } /// Storage: `PolkadotXcm::SupportedVersion` (r:0 w:1) /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) fn force_xcm_version() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_081_000 picoseconds. - Weight::from_parts(7_397_000, 0) + // Minimum execution time: 6_232_000 picoseconds. + Weight::from_parts(6_507_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -181,8 +213,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_007_000 picoseconds. - Weight::from_parts(2_183_000, 0) + // Minimum execution time: 1_884_000 picoseconds. + Weight::from_parts(2_016_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -208,8 +240,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `145` // Estimated: `3610` - // Minimum execution time: 28_790_000 picoseconds. - Weight::from_parts(29_767_000, 0) + // Minimum execution time: 26_637_000 picoseconds. + Weight::from_parts(27_616_000, 0) .saturating_add(Weight::from_parts(0, 3610)) .saturating_add(T::DbWeight::get().reads(8)) .saturating_add(T::DbWeight::get().writes(5)) @@ -234,8 +266,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `363` // Estimated: `3828` - // Minimum execution time: 30_951_000 picoseconds. - Weight::from_parts(31_804_000, 0) + // Minimum execution time: 28_668_000 picoseconds. + Weight::from_parts(29_413_000, 0) .saturating_add(Weight::from_parts(0, 3828)) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(4)) @@ -246,45 +278,45 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_164_000 picoseconds. - Weight::from_parts(2_311_000, 0) + // Minimum execution time: 1_990_000 picoseconds. + Weight::from_parts(2_114_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } - /// Storage: `PolkadotXcm::SupportedVersion` (r:4 w:2) + /// Storage: `PolkadotXcm::SupportedVersion` (r:5 w:2) /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) fn migrate_supported_version() -> Weight { // Proof Size summary in bytes: - // Measured: `162` - // Estimated: `11052` - // Minimum execution time: 16_906_000 picoseconds. - Weight::from_parts(17_612_000, 0) - .saturating_add(Weight::from_parts(0, 11052)) - .saturating_add(T::DbWeight::get().reads(4)) + // Measured: `159` + // Estimated: `13524` + // Minimum execution time: 18_856_000 picoseconds. + Weight::from_parts(19_430_000, 0) + .saturating_add(Weight::from_parts(0, 13524)) + .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) } - /// Storage: `PolkadotXcm::VersionNotifiers` (r:4 w:2) + /// Storage: `PolkadotXcm::VersionNotifiers` (r:5 w:2) /// Proof: `PolkadotXcm::VersionNotifiers` (`max_values`: None, `max_size`: None, mode: `Measured`) fn migrate_version_notifiers() -> Weight { // Proof Size summary in bytes: - // Measured: `166` - // Estimated: `11056` - // Minimum execution time: 17_443_000 picoseconds. - Weight::from_parts(18_032_000, 0) - .saturating_add(Weight::from_parts(0, 11056)) - .saturating_add(T::DbWeight::get().reads(4)) + // Measured: `163` + // Estimated: `13528` + // Minimum execution time: 19_068_000 picoseconds. + Weight::from_parts(19_434_000, 0) + .saturating_add(Weight::from_parts(0, 13528)) + .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) } - /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:5 w:0) + /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:6 w:0) /// Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) fn already_notified_target() -> Weight { // Proof Size summary in bytes: // Measured: `173` - // Estimated: `13538` - // Minimum execution time: 18_992_000 picoseconds. - Weight::from_parts(19_464_000, 0) - .saturating_add(Weight::from_parts(0, 13538)) - .saturating_add(T::DbWeight::get().reads(5)) + // Estimated: `16013` + // Minimum execution time: 21_055_000 picoseconds. + Weight::from_parts(21_379_000, 0) + .saturating_add(Weight::from_parts(0, 16013)) + .saturating_add(T::DbWeight::get().reads(6)) } /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:2 w:1) /// Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) @@ -304,36 +336,36 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `212` // Estimated: `6152` - // Minimum execution time: 28_011_000 picoseconds. - Weight::from_parts(28_716_000, 0) + // Minimum execution time: 25_736_000 picoseconds. + Weight::from_parts(26_423_000, 0) .saturating_add(Weight::from_parts(0, 6152)) .saturating_add(T::DbWeight::get().reads(8)) .saturating_add(T::DbWeight::get().writes(3)) } - /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:3 w:0) + /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:4 w:0) /// Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) fn notify_target_migration_fail() -> Weight { // Proof Size summary in bytes: // Measured: `206` - // Estimated: `8621` - // Minimum execution time: 9_533_000 picoseconds. - Weight::from_parts(9_856_000, 0) - .saturating_add(Weight::from_parts(0, 8621)) - .saturating_add(T::DbWeight::get().reads(3)) + // Estimated: `11096` + // Minimum execution time: 11_853_000 picoseconds. + Weight::from_parts(12_215_000, 0) + .saturating_add(Weight::from_parts(0, 11096)) + .saturating_add(T::DbWeight::get().reads(4)) } - /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:4 w:2) + /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:5 w:2) /// Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) fn migrate_version_notify_targets() -> Weight { // Proof Size summary in bytes: - // Measured: `173` - // Estimated: `11063` - // Minimum execution time: 17_628_000 picoseconds. - Weight::from_parts(18_146_000, 0) - .saturating_add(Weight::from_parts(0, 11063)) - .saturating_add(T::DbWeight::get().reads(4)) + // Measured: `170` + // Estimated: `13535` + // Minimum execution time: 19_418_000 picoseconds. + Weight::from_parts(19_794_000, 0) + .saturating_add(Weight::from_parts(0, 13535)) + .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) } - /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:4 w:2) + /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:5 w:2) /// Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) /// Storage: `ParachainSystem::UpwardDeliveryFeeFactor` (r:1 w:0) /// Proof: `ParachainSystem::UpwardDeliveryFeeFactor` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) @@ -349,12 +381,12 @@ impl pallet_xcm::WeightInfo for WeightInfo { /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) fn migrate_and_notify_old_targets() -> Weight { // Proof Size summary in bytes: - // Measured: `215` - // Estimated: `11105` - // Minimum execution time: 34_877_000 picoseconds. - Weight::from_parts(35_607_000, 0) - .saturating_add(Weight::from_parts(0, 11105)) - .saturating_add(T::DbWeight::get().reads(10)) + // Measured: `212` + // Estimated: `13577` + // Minimum execution time: 34_719_000 picoseconds. + Weight::from_parts(35_260_000, 0) + .saturating_add(Weight::from_parts(0, 13577)) + .saturating_add(T::DbWeight::get().reads(11)) .saturating_add(T::DbWeight::get().writes(4)) } /// Storage: `PolkadotXcm::QueryCounter` (r:1 w:1) @@ -365,8 +397,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `103` // Estimated: `1588` - // Minimum execution time: 5_370_000 picoseconds. - Weight::from_parts(5_616_000, 0) + // Minimum execution time: 4_937_000 picoseconds. + Weight::from_parts(5_203_000, 0) .saturating_add(Weight::from_parts(0, 1588)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) @@ -377,10 +409,22 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `7740` // Estimated: `11205` - // Minimum execution time: 26_820_000 picoseconds. - Weight::from_parts(27_143_000, 0) + // Minimum execution time: 26_064_000 picoseconds. + Weight::from_parts(26_497_000, 0) .saturating_add(Weight::from_parts(0, 11205)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } + /// Storage: `PolkadotXcm::AssetTraps` (r:1 w:1) + /// Proof: `PolkadotXcm::AssetTraps` (`max_values`: None, `max_size`: None, mode: `Measured`) + fn claim_assets() -> Weight { + // Proof Size summary in bytes: + // Measured: `160` + // Estimated: `3625` + // Minimum execution time: 37_132_000 picoseconds. + Weight::from_parts(37_868_000, 0) + .saturating_add(Weight::from_parts(0, 3625)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } } diff --git a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/xcm_config.rs b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/xcm_config.rs index 693fd7c3fc78aaab44d468fe355090c6455b1404..1c58abcb379e6569ecf838a047259c2e3304064e 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/xcm_config.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/xcm_config.rs @@ -27,14 +27,13 @@ use assets_common::{ use frame_support::{ parameter_types, traits::{ - tokens::imbalance::ResolveAssetTo, ConstU32, Contains, Equals, Everything, Nothing, - PalletInfoAccess, + tokens::imbalance::{ResolveAssetTo, ResolveTo}, + ConstU32, Contains, Equals, Everything, Nothing, PalletInfoAccess, }, }; use frame_system::EnsureRoot; use pallet_xcm::XcmPassthrough; use parachains_common::{ - impls::ToStakingPot, xcm_config::{ AllSiblingSystemParachains, AssetFeeAsExistentialDepositMultiplier, ConcreteAssetFromSystem, ParentRelayOrSiblingParachains, RelayOrOtherSystemParachains, @@ -49,19 +48,18 @@ use testnet_parachains_constants::rococo::snowbridge::{ EthereumNetwork, INBOUND_QUEUE_PALLET_INDEX, }; use xcm::latest::prelude::*; -#[allow(deprecated)] -use xcm_builder::CurrencyAdapter; use xcm_builder::{ AccountId32Aliases, AllowExplicitUnpaidExecutionFrom, AllowKnownQueryResponses, AllowSubscriptionsFrom, AllowTopLevelPaidExecutionFrom, DenyReserveTransferToRelayChain, DenyThenTry, DescribeAllTerminal, DescribeFamily, EnsureXcmOrigin, FrameTransactionalProcessor, - FungiblesAdapter, GlobalConsensusParachainConvertsFor, HashedDescription, IsConcrete, - LocalMint, NetworkExportTableItem, NoChecking, NonFungiblesAdapter, ParentAsSuperuser, - ParentIsPreset, RelayChainAsNative, SiblingParachainAsNative, SiblingParachainConvertsVia, - SignedAccountId32AsNative, SignedToAccountId32, SovereignPaidRemoteExporter, - SovereignSignedViaLocation, StartsWith, StartsWithExplicitGlobalConsensus, TakeWeightCredit, - TrailingSetTopicAsId, UsingComponents, WeightInfoBounds, WithComputedOrigin, WithUniqueTopic, - XcmFeeManagerFromComponents, XcmFeeToAccount, + FungibleAdapter, FungiblesAdapter, GlobalConsensusParachainConvertsFor, HashedDescription, + IsConcrete, LocalMint, NetworkExportTableItem, NoChecking, NonFungiblesAdapter, + ParentAsSuperuser, ParentIsPreset, RelayChainAsNative, SiblingParachainAsNative, + SiblingParachainConvertsVia, SignedAccountId32AsNative, SignedToAccountId32, + SovereignPaidRemoteExporter, SovereignSignedViaLocation, StartsWith, + StartsWithExplicitGlobalConsensus, TakeWeightCredit, TrailingSetTopicAsId, UsingComponents, + WeightInfoBounds, WithComputedOrigin, WithUniqueTopic, XcmFeeManagerFromComponents, + XcmFeeToAccount, }; use xcm_executor::{traits::WithOriginFilter, XcmExecutor}; @@ -114,8 +112,7 @@ pub type LocationToAccountId = ( ); /// Means for transacting the native currency on this chain. -#[allow(deprecated)] -pub type CurrencyTransactor = CurrencyAdapter< +pub type FungibleTransactor = FungibleAdapter< // Use this currency: Balances, // Use this currency when it is a fungible asset matching the given location or name: @@ -194,7 +191,7 @@ pub type ForeignFungiblesTransactor = FungiblesAdapter< LocationToAccountId, // Our chain's account ID type (we can't get away without mentioning it explicitly): AccountId, - // We dont need to check teleports here. + // We don't need to check teleports here. NoChecking, // The account to use for tracking teleports. CheckingAccount, @@ -223,7 +220,7 @@ pub type PoolFungiblesTransactor = FungiblesAdapter< /// Means for transacting assets on this chain. pub type AssetTransactors = ( - CurrencyTransactor, + FungibleTransactor, FungiblesTransactor, ForeignFungiblesTransactor, PoolFungiblesTransactor, @@ -288,8 +285,8 @@ impl Contains for SafeCallFilter { match call { RuntimeCall::System(frame_system::Call::set_storage { items }) if items.iter().all(|(k, _)| { - k.eq(&bridging::XcmBridgeHubRouterByteFee::key()) | - k.eq(&bridging::XcmBridgeHubRouterBaseFee::key()) | + k.eq(&bridging::XcmBridgeHubRouterByteFee::key()) || + k.eq(&bridging::XcmBridgeHubRouterBaseFee::key()) || k.eq(&bridging::to_ethereum::BridgeHubEthereumBaseFee::key()) }) => return true, @@ -571,7 +568,13 @@ impl xcm_executor::Config for XcmConfig { MaxInstructions, >; type Trader = ( - UsingComponents>, + UsingComponents< + WeightToFee, + TokenLocation, + AccountId, + Balances, + ResolveTo, + >, cumulus_primitives_utility::SwapFirstAssetTrader< TokenLocationV3, crate::AssetConversion, @@ -630,6 +633,9 @@ impl xcm_executor::Config for XcmConfig { type SafeCallFilter = SafeCallFilter; type Aliasers = Nothing; type TransactionalProcessor = FrameTransactionalProcessor; + type HrmpNewChannelOpenRequestHandler = (); + type HrmpChannelAcceptedHandler = (); + type HrmpChannelClosingHandler = (); } /// Converts a local signed origin into an XCM location. @@ -664,11 +670,9 @@ impl pallet_xcm::Config for Runtime { // We want to disallow users sending (arbitrary) XCMs from this chain. type SendXcmOrigin = EnsureXcmOrigin; type XcmRouter = XcmRouter; - // We support local origins dispatching XCM executions in principle... + // We support local origins dispatching XCM executions. type ExecuteXcmOrigin = EnsureXcmOrigin; - // ... but disallow generic XCM execution. As a result only teleports and reserve transfers are - // allowed. - type XcmExecuteFilter = Nothing; + type XcmExecuteFilter = Everything; type XcmExecutor = XcmExecutor; type XcmTeleportFilter = Everything; type XcmReserveTransferFilter = Everything; diff --git a/cumulus/parachains/runtimes/assets/asset-hub-rococo/tests/tests.rs b/cumulus/parachains/runtimes/assets/asset-hub-rococo/tests/tests.rs index cff2290222c35a07034d28c731cbe552130c8f4c..5fa7455ad2a0b5620a6f6934b87acfe3b85d4f57 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-rococo/tests/tests.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-rococo/tests/tests.rs @@ -22,13 +22,13 @@ use asset_hub_rococo_runtime::{ xcm_config::{ bridging, AssetFeeAsExistentialDepositMultiplierFeeCharger, CheckingAccount, ForeignAssetFeeAsExistentialDepositMultiplierFeeCharger, ForeignCreatorsSovereignAccountOf, - LocationToAccountId, TokenLocation, TokenLocationV3, TrustBackedAssetsPalletLocation, - TrustBackedAssetsPalletLocationV3, XcmConfig, + LocationToAccountId, StakingPot, TokenLocation, TokenLocationV3, + TrustBackedAssetsPalletLocation, TrustBackedAssetsPalletLocationV3, XcmConfig, }, AllPalletsWithoutSystem, AssetConversion, AssetDeposit, Assets, Balances, CollatorSelection, ExistentialDeposit, ForeignAssets, ForeignAssetsInstance, MetadataDepositBase, - MetadataDepositPerByte, ParachainSystem, Runtime, RuntimeCall, RuntimeEvent, SessionKeys, - ToWestendXcmRouterInstance, TrustBackedAssetsInstance, XcmpQueue, + MetadataDepositPerByte, ParachainSystem, Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, + SessionKeys, ToWestendXcmRouterInstance, TrustBackedAssetsInstance, XcmpQueue, }; use asset_test_utils::{ test_cases_over_bridge::TestBridgingConfig, CollatorSessionKey, CollatorSessionKeys, @@ -49,6 +49,7 @@ use frame_support::{ use parachains_common::{AccountId, AssetIdForTrustBackedAssets, AuraId, Balance}; use sp_consensus_aura::SlotDuration; use sp_runtime::traits::MaybeEquivalence; +use sp_std::ops::Mul; use std::convert::Into; use testnet_parachains_constants::rococo::{consensus::*, currency::UNITS, fee::WeightToFee}; use xcm::latest::prelude::{Assets as XcmAssets, *}; @@ -85,6 +86,52 @@ fn slot_durations() -> SlotDurations { } } +fn setup_pool_for_paying_fees_with_foreign_assets( + (foreign_asset_owner, foreign_asset_id_location, foreign_asset_id_minimum_balance): ( + AccountId, + xcm::v3::Location, + Balance, + ), +) { + let existential_deposit = ExistentialDeposit::get(); + + // setup a pool to pay fees with `foreign_asset_id_location` tokens + let pool_owner: AccountId = [14u8; 32].into(); + let native_asset = xcm::v3::Location::parent(); + let pool_liquidity: Balance = + existential_deposit.max(foreign_asset_id_minimum_balance).mul(100_000); + + let _ = Balances::force_set_balance( + RuntimeOrigin::root(), + pool_owner.clone().into(), + (existential_deposit + pool_liquidity).mul(2).into(), + ); + + assert_ok!(ForeignAssets::mint( + RuntimeOrigin::signed(foreign_asset_owner), + foreign_asset_id_location.into(), + pool_owner.clone().into(), + (foreign_asset_id_minimum_balance + pool_liquidity).mul(2).into(), + )); + + assert_ok!(AssetConversion::create_pool( + RuntimeOrigin::signed(pool_owner.clone()), + Box::new(native_asset.into()), + Box::new(foreign_asset_id_location.into()) + )); + + assert_ok!(AssetConversion::add_liquidity( + RuntimeOrigin::signed(pool_owner.clone()), + Box::new(native_asset.into()), + Box::new(foreign_asset_id_location.into()), + pool_liquidity, + pool_liquidity, + 1, + 1, + pool_owner, + )); +} + #[test] fn test_buy_and_refund_weight_in_native() { ExtBuilder::::default() @@ -480,12 +527,12 @@ fn test_foreign_asset_xcm_take_first_trader() { let bought = Weight::from_parts(4_000_000_000u64, 0); // Lets calculate amount needed - let asset_amount_needed = - ForeignAssetFeeAsExistentialDepositMultiplierFeeCharger::charge_weight_in_fungibles( + let asset_amount_needed + = ForeignAssetFeeAsExistentialDepositMultiplierFeeCharger::charge_weight_in_fungibles( foreign_location, - bought, + bought ) - .expect("failed to compute"); + .expect("failed to compute"); // Lets pay with: asset_amount_needed + asset_amount_extra let asset_amount_extra = 100_u128; @@ -1056,7 +1103,8 @@ fn limited_reserve_transfer_assets_for_native_asset_over_bridge_works( mod asset_hub_rococo_tests { use super::*; - use asset_hub_rococo_runtime::{PolkadotXcm, RuntimeOrigin}; + use asset_hub_rococo_runtime::PolkadotXcm; + use xcm_executor::traits::ConvertLocation; fn bridging_to_asset_hub_westend() -> TestBridgingConfig { let _ = PolkadotXcm::force_xcm_version( @@ -1081,27 +1129,135 @@ mod asset_hub_rococo_tests { } #[test] - fn receive_reserve_asset_deposited_wnd_from_asset_hub_westend_works() { + fn receive_reserve_asset_deposited_wnd_from_asset_hub_westend_fees_paid_by_pool_swap_works() { const BLOCK_AUTHOR_ACCOUNT: [u8; 32] = [13; 32]; + let block_author_account = AccountId::from(BLOCK_AUTHOR_ACCOUNT); + let staking_pot = StakingPot::get(); + + let foreign_asset_id_location = xcm::v3::Location::new( + 2, + [xcm::v3::Junction::GlobalConsensus(xcm::v3::NetworkId::Westend)], + ); + let foreign_asset_id_minimum_balance = 1_000_000_000; + // sovereign account as foreign asset owner (can be whoever for this scenario) + let foreign_asset_owner = + LocationToAccountId::convert_location(&Location::parent()).unwrap(); + let foreign_asset_create_params = + (foreign_asset_owner, foreign_asset_id_location, foreign_asset_id_minimum_balance); + asset_test_utils::test_cases_over_bridge::receive_reserve_asset_deposited_from_different_consensus_works::< Runtime, AllPalletsWithoutSystem, XcmConfig, - LocationToAccountId, ForeignAssetsInstance, >( collator_session_keys().add(collator_session_key(BLOCK_AUTHOR_ACCOUNT)), ExistentialDeposit::get(), AccountId::from([73; 32]), - AccountId::from(BLOCK_AUTHOR_ACCOUNT), + block_author_account, // receiving WNDs - (xcm::v3::Location::new(2, [xcm::v3::Junction::GlobalConsensus(xcm::v3::NetworkId::Westend)]), 1000000000000, 1_000_000_000), + foreign_asset_create_params.clone(), + 1000000000000, + || { + // setup pool for paying fees to touch `SwapFirstAssetTrader` + setup_pool_for_paying_fees_with_foreign_assets(foreign_asset_create_params); + // staking pot account for collecting local native fees from `BuyExecution` + let _ = Balances::force_set_balance(RuntimeOrigin::root(), StakingPot::get().into(), ExistentialDeposit::get()); + // prepare bridge configuration + bridging_to_asset_hub_westend() + }, + ( + [PalletInstance(bp_bridge_hub_rococo::WITH_BRIDGE_ROCOCO_TO_WESTEND_MESSAGES_PALLET_INDEX)].into(), + GlobalConsensus(Westend), + [Parachain(1000)].into() + ), + || { + // check staking pot for ED + assert_eq!(Balances::free_balance(&staking_pot), ExistentialDeposit::get()); + // check now foreign asset for staking pot + assert_eq!( + ForeignAssets::balance( + foreign_asset_id_location.into(), + &staking_pot + ), + 0 + ); + }, + || { + // `SwapFirstAssetTrader` - staking pot receives xcm fees in ROCs + assert!( + Balances::free_balance(&staking_pot) > ExistentialDeposit::get() + ); + // staking pot receives no foreign assets + assert_eq!( + ForeignAssets::balance( + foreign_asset_id_location.into(), + &staking_pot + ), + 0 + ); + } + ) + } + + #[test] + fn receive_reserve_asset_deposited_wnd_from_asset_hub_westend_fees_paid_by_sufficient_asset_works( + ) { + const BLOCK_AUTHOR_ACCOUNT: [u8; 32] = [13; 32]; + let block_author_account = AccountId::from(BLOCK_AUTHOR_ACCOUNT); + let staking_pot = StakingPot::get(); + + let foreign_asset_id_location = xcm::v3::Location::new( + 2, + [xcm::v3::Junction::GlobalConsensus(xcm::v3::NetworkId::Westend)], + ); + let foreign_asset_id_minimum_balance = 1_000_000_000; + // sovereign account as foreign asset owner (can be whoever for this scenario) + let foreign_asset_owner = + LocationToAccountId::convert_location(&Location::parent()).unwrap(); + let foreign_asset_create_params = + (foreign_asset_owner, foreign_asset_id_location, foreign_asset_id_minimum_balance); + + asset_test_utils::test_cases_over_bridge::receive_reserve_asset_deposited_from_different_consensus_works::< + Runtime, + AllPalletsWithoutSystem, + XcmConfig, + ForeignAssetsInstance, + >( + collator_session_keys().add(collator_session_key(BLOCK_AUTHOR_ACCOUNT)), + ExistentialDeposit::get(), + AccountId::from([73; 32]), + block_author_account.clone(), + // receiving WNDs + foreign_asset_create_params, + 1000000000000, bridging_to_asset_hub_westend, ( [PalletInstance(bp_bridge_hub_rococo::WITH_BRIDGE_ROCOCO_TO_WESTEND_MESSAGES_PALLET_INDEX)].into(), GlobalConsensus(Westend), [Parachain(1000)].into() - ) + ), + || { + // check block author before + assert_eq!( + ForeignAssets::balance( + foreign_asset_id_location.into(), + &block_author_account + ), + 0 + ); + }, + || { + // `TakeFirstAssetTrader` puts fees to the block author + assert!( + ForeignAssets::balance( + foreign_asset_id_location.into(), + &block_author_account + ) > 0 + ); + // `SwapFirstAssetTrader` did not work + assert_eq!(Balances::free_balance(&staking_pot), 0); + } ) } diff --git a/cumulus/parachains/runtimes/assets/asset-hub-westend/Cargo.toml b/cumulus/parachains/runtimes/assets/asset-hub-westend/Cargo.toml index 415c8c1cb062b25e51c593f167ec13c011dc470f..e25554ec0a5f1af99b86bce2c3c1f60f256aa53c 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-westend/Cargo.toml +++ b/cumulus/parachains/runtimes/assets/asset-hub-westend/Cargo.toml @@ -12,8 +12,8 @@ workspace = true [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive", "max-encoded-len"] } hex-literal = { version = "0.4.1", optional = true } -log = { version = "0.4.20", default-features = false } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +log = { workspace = true } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } # Substrate frame-benchmarking = { path = "../../../../../substrate/frame/benchmarking", default-features = false, optional = true } @@ -76,6 +76,7 @@ cumulus-pallet-xcmp-queue = { path = "../../../../pallets/xcmp-queue", default-f cumulus-primitives-aura = { path = "../../../../primitives/aura", default-features = false } cumulus-primitives-core = { path = "../../../../primitives/core", default-features = false } cumulus-primitives-utility = { path = "../../../../primitives/utility", default-features = false } +cumulus-primitives-storage-weight-reclaim = { path = "../../../../primitives/storage-weight-reclaim", default-features = false } pallet-collator-selection = { path = "../../../../pallets/collator-selection", default-features = false } parachain-info = { package = "staging-parachain-info", path = "../../../pallets/parachain-info", default-features = false } parachains-common = { path = "../../../common", default-features = false } @@ -84,10 +85,10 @@ assets-common = { path = "../common", default-features = false } # Bridges pallet-xcm-bridge-hub-router = { path = "../../../../../bridges/modules/xcm-bridge-hub-router", default-features = false } -bp-asset-hub-rococo = { path = "../../../../../bridges/primitives/chain-asset-hub-rococo", default-features = false } -bp-asset-hub-westend = { path = "../../../../../bridges/primitives/chain-asset-hub-westend", default-features = false } -bp-bridge-hub-rococo = { path = "../../../../../bridges/primitives/chain-bridge-hub-rococo", default-features = false } -bp-bridge-hub-westend = { path = "../../../../../bridges/primitives/chain-bridge-hub-westend", default-features = false } +bp-asset-hub-rococo = { path = "../../../../../bridges/chains/chain-asset-hub-rococo", default-features = false } +bp-asset-hub-westend = { path = "../../../../../bridges/chains/chain-asset-hub-westend", default-features = false } +bp-bridge-hub-rococo = { path = "../../../../../bridges/chains/chain-bridge-hub-rococo", default-features = false } +bp-bridge-hub-westend = { path = "../../../../../bridges/chains/chain-bridge-hub-westend", default-features = false } [dev-dependencies] hex-literal = "0.4.1" @@ -178,6 +179,7 @@ std = [ "cumulus-pallet-xcmp-queue/std", "cumulus-primitives-aura/std", "cumulus-primitives-core/std", + "cumulus-primitives-storage-weight-reclaim/std", "cumulus-primitives-utility/std", "frame-benchmarking?/std", "frame-executive/std", @@ -236,8 +238,6 @@ std = [ "xcm/std", ] -experimental = ["pallet-aura/experimental"] - # A feature that should be enabled when the runtime should be built for on-chain # deployment. This will disable stuff that shouldn't be part of the on-chain wasm # to make it smaller, like logging for example. diff --git a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/lib.rs b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/lib.rs index 5a218eba9c5dc61f0237fe6bccff2b745aeaa775..e50df651cbc463d9e0529fcd9c7aea52a6b4bed0 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/lib.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/lib.rs @@ -37,7 +37,7 @@ use cumulus_primitives_core::{AggregateMessageOrigin, ParaId}; use frame_support::{ construct_runtime, derive_impl, dispatch::DispatchClass, - genesis_builder_helper::{build_config, create_default_config}, + genesis_builder_helper::{build_state, get_preset}, ord_parameter_types, parameter_types, traits::{ fungible, fungibles, @@ -110,7 +110,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("westmint"), impl_name: create_runtime_str!("westmint"), authoring_version: 1, - spec_version: 1_006_000, + spec_version: 1_010_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 14, @@ -149,7 +149,7 @@ parameter_types! { } // Configure FRAME pallets to include in runtime. -#[derive_impl(frame_system::config_preludes::ParaChainDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::ParaChainDefaultConfig)] impl frame_system::Config for Runtime { type BlockWeights = RuntimeBlockWeights; type BlockLength = RuntimeBlockLength; @@ -171,10 +171,7 @@ impl pallet_timestamp::Config for Runtime { /// A timestamp: milliseconds since the unix epoch. type Moment = u64; type OnTimestampSet = Aura; - #[cfg(feature = "experimental")] type MinimumPeriod = ConstU64<0>; - #[cfg(not(feature = "experimental"))] - type MinimumPeriod = ConstU64<{ SLOT_DURATION / 2 }>; type WeightInfo = weights::pallet_timestamp::WeightInfo; } @@ -213,7 +210,7 @@ parameter_types! { impl pallet_transaction_payment::Config for Runtime { type RuntimeEvent = RuntimeEvent; type OnChargeTransaction = - pallet_transaction_payment::CurrencyAdapter>; + pallet_transaction_payment::FungibleAdapter>; type WeightToFee = WeightToFee; type LengthToFee = ConstantMultiplier; type FeeMultiplierUpdate = SlowAdjustingFeeUpdate; @@ -644,6 +641,7 @@ impl pallet_message_queue::Config for Runtime { type HeapSize = sp_core::ConstU32<{ 64 * 1024 }>; type MaxStale = sp_core::ConstU32<8>; type ServiceWeight = MessageQueueServiceWeight; + type IdleMaxServiceWeight = MessageQueueServiceWeight; } impl cumulus_pallet_aura_ext::Config for Runtime {} @@ -703,7 +701,6 @@ impl pallet_aura::Config for Runtime { type DisabledValidators = (); type MaxAuthorities = ConstU32<100_000>; type AllowMultipleBlocksPerSlot = ConstBool; - #[cfg(feature = "experimental")] type SlotDuration = ConstU64; } @@ -930,6 +927,7 @@ pub type SignedExtra = ( frame_system::CheckNonce, frame_system::CheckWeight, pallet_asset_conversion_tx_payment::ChargeAssetTxPayment, + cumulus_primitives_storage_weight_reclaim::StorageWeightReclaim, ); /// Unchecked extrinsic type as expected by this runtime. pub type UncheckedExtrinsic = @@ -949,6 +947,8 @@ pub type Migrations = ( DeleteUndecodableStorage, // unreleased cumulus_pallet_xcmp_queue::migration::v4::MigrationToV4, + // permanent + pallet_xcm::migration::MigrateToLatestXcmVersion, ); /// Asset Hub Westend has some undecodable storage, delete it. @@ -1035,17 +1035,17 @@ impl frame_support::traits::OnRuntimeUpgrade for InitStorageVersions { let mut writes = 0; if PolkadotXcm::on_chain_storage_version() == StorageVersion::new(0) { - PolkadotXcm::current_storage_version().put::(); + PolkadotXcm::in_code_storage_version().put::(); writes.saturating_inc(); } if ForeignAssets::on_chain_storage_version() == StorageVersion::new(0) { - ForeignAssets::current_storage_version().put::(); + ForeignAssets::in_code_storage_version().put::(); writes.saturating_inc(); } if PoolAssets::on_chain_storage_version() == StorageVersion::new(0) { - PoolAssets::current_storage_version().put::(); + PoolAssets::in_code_storage_version().put::(); writes.saturating_inc(); } @@ -1082,6 +1082,7 @@ mod benches { [pallet_utility, Utility] [pallet_timestamp, Timestamp] [pallet_collator_selection, CollatorSelection] + [cumulus_pallet_parachain_system, ParachainSystem] [cumulus_pallet_xcmp_queue, XcmpQueue] [pallet_xcm_bridge_hub_router, ToRococo] // XCM @@ -1099,7 +1100,7 @@ impl_runtime_apis! { } fn authorities() -> Vec { - Aura::authorities().into_inner() + pallet_aura::Authorities::::get().into_inner() } } @@ -1121,7 +1122,7 @@ impl_runtime_apis! { Executive::execute_block(block) } - fn initialize_block(header: &::Header) { + fn initialize_block(header: &::Header) -> sp_runtime::ExtrinsicInclusionMode { Executive::initialize_block(header) } } @@ -1424,8 +1425,31 @@ impl_runtime_apis! { use cumulus_pallet_session_benchmarking::Pallet as SessionBench; impl cumulus_pallet_session_benchmarking::Config for Runtime {} + parameter_types! { + pub ExistentialDepositAsset: Option = Some(( + WestendLocation::get(), + ExistentialDeposit::get() + ).into()); + pub const RandomParaId: ParaId = ParaId::new(43211234); + } + use pallet_xcm::benchmarking::Pallet as PalletXcmExtrinsicsBenchmark; impl pallet_xcm::benchmarking::Config for Runtime { + type DeliveryHelper = ( + cumulus_primitives_utility::ToParentDeliveryHelper< + xcm_config::XcmConfig, + ExistentialDepositAsset, + xcm_config::PriceForParentDelivery, + >, + polkadot_runtime_common::xcm_sender::ToParachainDeliveryHelper< + xcm_config::XcmConfig, + ExistentialDepositAsset, + PriceForSiblingParachainDelivery, + RandomParaId, + ParachainSystem, + > + ); + fn reachable_dest() -> Option { Some(Parent.into()) } @@ -1434,7 +1458,7 @@ impl_runtime_apis! { // Relay/native token can be teleported between AH and Relay. Some(( Asset { - fun: Fungible(EXISTENTIAL_DEPOSIT), + fun: Fungible(ExistentialDeposit::get()), id: AssetId(Parent.into()) }, Parent.into(), @@ -1442,17 +1466,13 @@ impl_runtime_apis! { } fn reserve_transferable_asset_and_dest() -> Option<(Asset, Location)> { - // AH can reserve transfer native token to some random parachain. - let random_para_id = 43211234; - ParachainSystem::open_outbound_hrmp_channel_for_benchmarks_or_tests( - random_para_id.into() - ); Some(( Asset { - fun: Fungible(EXISTENTIAL_DEPOSIT), + fun: Fungible(ExistentialDeposit::get()), id: AssetId(Parent.into()) }, - ParentThen(Parachain(random_para_id).into()).into(), + // AH can reserve transfer native token to some random parachain. + ParentThen(Parachain(RandomParaId::get().into()).into()).into(), )) } @@ -1504,6 +1524,13 @@ impl_runtime_apis! { }); Some((assets, fee_index as u32, dest, verify)) } + + fn get_asset() -> Asset { + Asset { + id: AssetId(Location::parent()), + fun: Fungible(ExistentialDeposit::get()), + } + } } use pallet_xcm_bridge_hub_router::benchmarking::{ @@ -1543,13 +1570,6 @@ impl_runtime_apis! { use xcm_config::{MaxAssetsIntoHolding, WestendLocation}; use pallet_xcm_benchmarks::asset_instance_from; - parameter_types! { - pub ExistentialDepositAsset: Option = Some(( - WestendLocation::get(), - ExistentialDeposit::get() - ).into()); - } - impl pallet_xcm_benchmarks::Config for Runtime { type XcmConfig = xcm_config::XcmConfig; type AccountIdConverter = xcm_config::LocationToAccountId; @@ -1706,12 +1726,16 @@ impl_runtime_apis! { } impl sp_genesis_builder::GenesisBuilder for Runtime { - fn create_default_config() -> Vec { - create_default_config::() + fn build_state(config: Vec) -> sp_genesis_builder::Result { + build_state::(config) + } + + fn get_preset(id: &Option) -> Option> { + get_preset::(id, |_| None) } - fn build_config(config: Vec) -> sp_genesis_builder::Result { - build_config::(config) + fn preset_names() -> Vec { + vec![] } } } diff --git a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_xcm.rs b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_xcm.rs index 504731f4a9ef743e62090582901a63f7aee78829..a36c25f96043dd9d2b183ff45c3030315bd5bd19 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_xcm.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_xcm.rs @@ -16,10 +16,10 @@ //! Autogenerated weights for `pallet_xcm` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-12-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-04-01, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-r43aesjn-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! HOSTNAME: `runner-f3xfxtob-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("asset-hub-westend-dev")`, DB CACHE: 1024 // Executed Command: @@ -64,8 +64,30 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `145` // Estimated: `3610` - // Minimum execution time: 25_482_000 picoseconds. - Weight::from_parts(26_622_000, 0) + // Minimum execution time: 21_050_000 picoseconds. + Weight::from_parts(21_834_000, 0) + .saturating_add(Weight::from_parts(0, 3610)) + .saturating_add(T::DbWeight::get().reads(6)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: `ParachainSystem::UpwardDeliveryFeeFactor` (r:1 w:0) + /// Proof: `ParachainSystem::UpwardDeliveryFeeFactor` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) + /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) + /// Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) + /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) + /// Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) + /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + fn send_blob() -> Weight { + // Proof Size summary in bytes: + // Measured: `145` + // Estimated: `3610` + // Minimum execution time: 21_164_000 picoseconds. + Weight::from_parts(21_656_000, 0) .saturating_add(Weight::from_parts(0, 3610)) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) @@ -90,8 +112,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `145` // Estimated: `3610` - // Minimum execution time: 87_319_000 picoseconds. - Weight::from_parts(89_764_000, 0) + // Minimum execution time: 92_497_000 picoseconds. + Weight::from_parts(95_473_000, 0) .saturating_add(Weight::from_parts(0, 3610)) .saturating_add(T::DbWeight::get().reads(8)) .saturating_add(T::DbWeight::get().writes(3)) @@ -118,8 +140,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `367` // Estimated: `6196` - // Minimum execution time: 139_133_000 picoseconds. - Weight::from_parts(141_507_000, 0) + // Minimum execution time: 120_059_000 picoseconds. + Weight::from_parts(122_894_000, 0) .saturating_add(Weight::from_parts(0, 6196)) .saturating_add(T::DbWeight::get().reads(9)) .saturating_add(T::DbWeight::get().writes(5)) @@ -148,8 +170,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `496` // Estimated: `6208` - // Minimum execution time: 144_241_000 picoseconds. - Weight::from_parts(149_709_000, 0) + // Minimum execution time: 141_977_000 picoseconds. + Weight::from_parts(145_981_000, 0) .saturating_add(Weight::from_parts(0, 6208)) .saturating_add(T::DbWeight::get().reads(12)) .saturating_add(T::DbWeight::get().writes(7)) @@ -158,8 +180,16 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 10_392_000 picoseconds. - Weight::from_parts(10_779_000, 0) + // Minimum execution time: 7_426_000 picoseconds. + Weight::from_parts(7_791_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + } + fn execute_blob() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 7_585_000 picoseconds. + Weight::from_parts(7_897_000, 0) .saturating_add(Weight::from_parts(0, 0)) } /// Storage: `PolkadotXcm::SupportedVersion` (r:0 w:1) @@ -168,8 +198,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_088_000 picoseconds. - Weight::from_parts(7_257_000, 0) + // Minimum execution time: 6_224_000 picoseconds. + Weight::from_parts(6_793_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -179,8 +209,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_095_000 picoseconds. - Weight::from_parts(2_136_000, 0) + // Minimum execution time: 1_812_000 picoseconds. + Weight::from_parts(2_008_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -206,8 +236,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `145` // Estimated: `3610` - // Minimum execution time: 28_728_000 picoseconds. - Weight::from_parts(29_349_000, 0) + // Minimum execution time: 26_586_000 picoseconds. + Weight::from_parts(27_181_000, 0) .saturating_add(Weight::from_parts(0, 3610)) .saturating_add(T::DbWeight::get().reads(8)) .saturating_add(T::DbWeight::get().writes(5)) @@ -232,8 +262,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `363` // Estimated: `3828` - // Minimum execution time: 30_605_000 picoseconds. - Weight::from_parts(31_477_000, 0) + // Minimum execution time: 28_295_000 picoseconds. + Weight::from_parts(29_280_000, 0) .saturating_add(Weight::from_parts(0, 3828)) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(4)) @@ -244,45 +274,45 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_137_000 picoseconds. - Weight::from_parts(2_303_000, 0) + // Minimum execution time: 1_803_000 picoseconds. + Weight::from_parts(1_876_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } - /// Storage: `PolkadotXcm::SupportedVersion` (r:4 w:2) + /// Storage: `PolkadotXcm::SupportedVersion` (r:5 w:2) /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) fn migrate_supported_version() -> Weight { // Proof Size summary in bytes: - // Measured: `162` - // Estimated: `11052` - // Minimum execution time: 16_719_000 picoseconds. - Weight::from_parts(17_329_000, 0) - .saturating_add(Weight::from_parts(0, 11052)) - .saturating_add(T::DbWeight::get().reads(4)) + // Measured: `159` + // Estimated: `13524` + // Minimum execution time: 18_946_000 picoseconds. + Weight::from_parts(19_456_000, 0) + .saturating_add(Weight::from_parts(0, 13524)) + .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) } - /// Storage: `PolkadotXcm::VersionNotifiers` (r:4 w:2) + /// Storage: `PolkadotXcm::VersionNotifiers` (r:5 w:2) /// Proof: `PolkadotXcm::VersionNotifiers` (`max_values`: None, `max_size`: None, mode: `Measured`) fn migrate_version_notifiers() -> Weight { // Proof Size summary in bytes: - // Measured: `166` - // Estimated: `11056` - // Minimum execution time: 16_687_000 picoseconds. - Weight::from_parts(17_405_000, 0) - .saturating_add(Weight::from_parts(0, 11056)) - .saturating_add(T::DbWeight::get().reads(4)) + // Measured: `163` + // Estimated: `13528` + // Minimum execution time: 19_080_000 picoseconds. + Weight::from_parts(19_498_000, 0) + .saturating_add(Weight::from_parts(0, 13528)) + .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) } - /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:5 w:0) + /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:6 w:0) /// Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) fn already_notified_target() -> Weight { // Proof Size summary in bytes: // Measured: `173` - // Estimated: `13538` - // Minimum execution time: 18_751_000 picoseconds. - Weight::from_parts(19_130_000, 0) - .saturating_add(Weight::from_parts(0, 13538)) - .saturating_add(T::DbWeight::get().reads(5)) + // Estimated: `16013` + // Minimum execution time: 20_637_000 picoseconds. + Weight::from_parts(21_388_000, 0) + .saturating_add(Weight::from_parts(0, 16013)) + .saturating_add(T::DbWeight::get().reads(6)) } /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:2 w:1) /// Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) @@ -302,36 +332,36 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `212` // Estimated: `6152` - // Minimum execution time: 27_189_000 picoseconds. - Weight::from_parts(27_760_000, 0) + // Minimum execution time: 25_701_000 picoseconds. + Weight::from_parts(26_269_000, 0) .saturating_add(Weight::from_parts(0, 6152)) .saturating_add(T::DbWeight::get().reads(8)) .saturating_add(T::DbWeight::get().writes(3)) } - /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:3 w:0) + /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:4 w:0) /// Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) fn notify_target_migration_fail() -> Weight { // Proof Size summary in bytes: // Measured: `206` - // Estimated: `8621` - // Minimum execution time: 9_307_000 picoseconds. - Weight::from_parts(9_691_000, 0) - .saturating_add(Weight::from_parts(0, 8621)) - .saturating_add(T::DbWeight::get().reads(3)) + // Estimated: `11096` + // Minimum execution time: 11_949_000 picoseconds. + Weight::from_parts(12_249_000, 0) + .saturating_add(Weight::from_parts(0, 11096)) + .saturating_add(T::DbWeight::get().reads(4)) } - /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:4 w:2) + /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:5 w:2) /// Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) fn migrate_version_notify_targets() -> Weight { // Proof Size summary in bytes: - // Measured: `173` - // Estimated: `11063` - // Minimum execution time: 17_607_000 picoseconds. - Weight::from_parts(18_090_000, 0) - .saturating_add(Weight::from_parts(0, 11063)) - .saturating_add(T::DbWeight::get().reads(4)) + // Measured: `170` + // Estimated: `13535` + // Minimum execution time: 19_278_000 picoseconds. + Weight::from_parts(19_538_000, 0) + .saturating_add(Weight::from_parts(0, 13535)) + .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) } - /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:4 w:2) + /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:5 w:2) /// Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) /// Storage: `ParachainSystem::UpwardDeliveryFeeFactor` (r:1 w:0) /// Proof: `ParachainSystem::UpwardDeliveryFeeFactor` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) @@ -347,12 +377,12 @@ impl pallet_xcm::WeightInfo for WeightInfo { /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) fn migrate_and_notify_old_targets() -> Weight { // Proof Size summary in bytes: - // Measured: `215` - // Estimated: `11105` - // Minimum execution time: 34_322_000 picoseconds. - Weight::from_parts(35_754_000, 0) - .saturating_add(Weight::from_parts(0, 11105)) - .saturating_add(T::DbWeight::get().reads(10)) + // Measured: `212` + // Estimated: `13577` + // Minimum execution time: 35_098_000 picoseconds. + Weight::from_parts(35_871_000, 0) + .saturating_add(Weight::from_parts(0, 13577)) + .saturating_add(T::DbWeight::get().reads(11)) .saturating_add(T::DbWeight::get().writes(4)) } /// Storage: `PolkadotXcm::QueryCounter` (r:1 w:1) @@ -363,8 +393,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `103` // Estimated: `1588` - // Minimum execution time: 4_513_000 picoseconds. - Weight::from_parts(4_754_000, 0) + // Minimum execution time: 3_862_000 picoseconds. + Weight::from_parts(4_082_000, 0) .saturating_add(Weight::from_parts(0, 1588)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) @@ -375,10 +405,22 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `7740` // Estimated: `11205` - // Minimum execution time: 27_860_000 picoseconds. - Weight::from_parts(28_279_000, 0) + // Minimum execution time: 25_423_000 picoseconds. + Weight::from_parts(25_872_000, 0) .saturating_add(Weight::from_parts(0, 11205)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } + /// Storage: `PolkadotXcm::AssetTraps` (r:1 w:1) + /// Proof: `PolkadotXcm::AssetTraps` (`max_values`: None, `max_size`: None, mode: `Measured`) + fn claim_assets() -> Weight { + // Proof Size summary in bytes: + // Measured: `160` + // Estimated: `3625` + // Minimum execution time: 37_148_000 picoseconds. + Weight::from_parts(37_709_000, 0) + .saturating_add(Weight::from_parts(0, 3625)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } } diff --git a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/xcm_config.rs b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/xcm_config.rs index 01437534c1fde75439546a0c84275b83db796099..360b1a7055b70ab7448c6ca180207fc499fff9f8 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/xcm_config.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/xcm_config.rs @@ -27,14 +27,13 @@ use assets_common::{ use frame_support::{ parameter_types, traits::{ - tokens::imbalance::ResolveAssetTo, ConstU32, Contains, Equals, Everything, Nothing, - PalletInfoAccess, + tokens::imbalance::{ResolveAssetTo, ResolveTo}, + ConstU32, Contains, Equals, Everything, Nothing, PalletInfoAccess, }, }; use frame_system::EnsureRoot; use pallet_xcm::XcmPassthrough; use parachains_common::{ - impls::ToStakingPot, xcm_config::{ AllSiblingSystemParachains, AssetFeeAsExistentialDepositMultiplier, ConcreteAssetFromSystem, RelayOrOtherSystemParachains, @@ -45,19 +44,18 @@ use polkadot_parachain_primitives::primitives::Sibling; use polkadot_runtime_common::xcm_sender::ExponentialPrice; use sp_runtime::traits::{AccountIdConversion, ConvertInto}; use xcm::latest::prelude::*; -#[allow(deprecated)] -use xcm_builder::CurrencyAdapter; use xcm_builder::{ AccountId32Aliases, AllowExplicitUnpaidExecutionFrom, AllowKnownQueryResponses, AllowSubscriptionsFrom, AllowTopLevelPaidExecutionFrom, DenyReserveTransferToRelayChain, DenyThenTry, DescribeFamily, DescribePalletTerminal, EnsureXcmOrigin, - FrameTransactionalProcessor, FungiblesAdapter, GlobalConsensusParachainConvertsFor, - HashedDescription, IsConcrete, LocalMint, NetworkExportTableItem, NoChecking, - NonFungiblesAdapter, ParentAsSuperuser, ParentIsPreset, RelayChainAsNative, - SiblingParachainAsNative, SiblingParachainConvertsVia, SignedAccountId32AsNative, - SignedToAccountId32, SovereignSignedViaLocation, StartsWith, StartsWithExplicitGlobalConsensus, - TakeWeightCredit, TrailingSetTopicAsId, UsingComponents, WeightInfoBounds, WithComputedOrigin, - WithUniqueTopic, XcmFeeManagerFromComponents, XcmFeeToAccount, + FrameTransactionalProcessor, FungibleAdapter, FungiblesAdapter, + GlobalConsensusParachainConvertsFor, HashedDescription, IsConcrete, LocalMint, + NetworkExportTableItem, NoChecking, NonFungiblesAdapter, ParentAsSuperuser, ParentIsPreset, + RelayChainAsNative, SiblingParachainAsNative, SiblingParachainConvertsVia, + SignedAccountId32AsNative, SignedToAccountId32, SovereignSignedViaLocation, StartsWith, + StartsWithExplicitGlobalConsensus, TakeWeightCredit, TrailingSetTopicAsId, UsingComponents, + WeightInfoBounds, WithComputedOrigin, WithUniqueTopic, XcmFeeManagerFromComponents, + XcmFeeToAccount, }; use xcm_executor::{traits::WithOriginFilter, XcmExecutor}; @@ -107,8 +105,7 @@ pub type LocationToAccountId = ( ); /// Means for transacting the native currency on this chain. -#[allow(deprecated)] -pub type CurrencyTransactor = CurrencyAdapter< +pub type FungibleTransactor = FungibleAdapter< // Use this currency: Balances, // Use this currency when it is a fungible asset matching the given location or name: @@ -187,7 +184,7 @@ pub type ForeignFungiblesTransactor = FungiblesAdapter< LocationToAccountId, // Our chain's account ID type (we can't get away without mentioning it explicitly): AccountId, - // We dont need to check teleports here. + // We don't need to check teleports here. NoChecking, // The account to use for tracking teleports. CheckingAccount, @@ -216,7 +213,7 @@ pub type PoolFungiblesTransactor = FungiblesAdapter< /// Means for transacting assets on this chain. pub type AssetTransactors = ( - CurrencyTransactor, + FungibleTransactor, FungiblesTransactor, ForeignFungiblesTransactor, PoolFungiblesTransactor, @@ -593,7 +590,13 @@ impl xcm_executor::Config for XcmConfig { MaxInstructions, >; type Trader = ( - UsingComponents>, + UsingComponents< + WeightToFee, + WestendLocation, + AccountId, + Balances, + ResolveTo, + >, cumulus_primitives_utility::SwapFirstAssetTrader< WestendLocationV3, crate::AssetConversion, @@ -651,6 +654,9 @@ impl xcm_executor::Config for XcmConfig { type SafeCallFilter = SafeCallFilter; type Aliasers = Nothing; type TransactionalProcessor = FrameTransactionalProcessor; + type HrmpNewChannelOpenRequestHandler = (); + type HrmpChannelAcceptedHandler = (); + type HrmpChannelClosingHandler = (); } /// Local origins on this chain are allowed to dispatch XCM sends/executions. diff --git a/cumulus/parachains/runtimes/assets/asset-hub-westend/tests/tests.rs b/cumulus/parachains/runtimes/assets/asset-hub-westend/tests/tests.rs index 5f6e4c007cd9824f10d4b324513366a84ed1acf1..6696cb2322391c2dbad5f6c9a0afc4d5537de68c 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-westend/tests/tests.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-westend/tests/tests.rs @@ -22,8 +22,8 @@ use asset_hub_westend_runtime::{ xcm_config::{ bridging, AssetFeeAsExistentialDepositMultiplierFeeCharger, CheckingAccount, ForeignAssetFeeAsExistentialDepositMultiplierFeeCharger, ForeignCreatorsSovereignAccountOf, - LocationToAccountId, TrustBackedAssetsPalletLocation, TrustBackedAssetsPalletLocationV3, - WestendLocation, WestendLocationV3, XcmConfig, + LocationToAccountId, StakingPot, TrustBackedAssetsPalletLocation, + TrustBackedAssetsPalletLocationV3, WestendLocation, WestendLocationV3, XcmConfig, }, AllPalletsWithoutSystem, Assets, Balances, ExistentialDeposit, ForeignAssets, ForeignAssetsInstance, MetadataDepositBase, MetadataDepositPerByte, ParachainSystem, @@ -50,11 +50,11 @@ use frame_support::{ use parachains_common::{AccountId, AssetIdForTrustBackedAssets, AuraId, Balance}; use sp_consensus_aura::SlotDuration; use sp_runtime::traits::MaybeEquivalence; -use std::convert::Into; +use std::{convert::Into, ops::Mul}; use testnet_parachains_constants::westend::{consensus::*, currency::UNITS, fee::WeightToFee}; use xcm::latest::prelude::{Assets as XcmAssets, *}; use xcm_builder::V4V3LocationConverter; -use xcm_executor::traits::{JustTry, WeightTrader}; +use xcm_executor::traits::{ConvertLocation, JustTry, WeightTrader}; const ALICE: [u8; 32] = [1u8; 32]; const SOME_ASSET_ADMIN: [u8; 32] = [5u8; 32]; @@ -86,6 +86,52 @@ fn slot_durations() -> SlotDurations { } } +fn setup_pool_for_paying_fees_with_foreign_assets( + (foreign_asset_owner, foreign_asset_id_location, foreign_asset_id_minimum_balance): ( + AccountId, + xcm::v3::Location, + Balance, + ), +) { + let existential_deposit = ExistentialDeposit::get(); + + // setup a pool to pay fees with `foreign_asset_id_location` tokens + let pool_owner: AccountId = [14u8; 32].into(); + let native_asset = xcm::v3::Location::parent(); + let pool_liquidity: Balance = + existential_deposit.max(foreign_asset_id_minimum_balance).mul(100_000); + + let _ = Balances::force_set_balance( + RuntimeOrigin::root(), + pool_owner.clone().into(), + (existential_deposit + pool_liquidity).mul(2).into(), + ); + + assert_ok!(ForeignAssets::mint( + RuntimeOrigin::signed(foreign_asset_owner), + foreign_asset_id_location.into(), + pool_owner.clone().into(), + (foreign_asset_id_minimum_balance + pool_liquidity).mul(2).into(), + )); + + assert_ok!(AssetConversion::create_pool( + RuntimeOrigin::signed(pool_owner.clone()), + Box::new(native_asset.into()), + Box::new(foreign_asset_id_location.into()) + )); + + assert_ok!(AssetConversion::add_liquidity( + RuntimeOrigin::signed(pool_owner.clone()), + Box::new(native_asset.into()), + Box::new(foreign_asset_id_location.into()), + pool_liquidity, + pool_liquidity, + 1, + 1, + pool_owner, + )); +} + #[test] fn test_buy_and_refund_weight_in_native() { ExtBuilder::::default() @@ -481,12 +527,8 @@ fn test_foreign_asset_xcm_take_first_trader() { let bought = Weight::from_parts(4_000_000_000u64, 0); // Lets calculate amount needed - let asset_amount_needed = - ForeignAssetFeeAsExistentialDepositMultiplierFeeCharger::charge_weight_in_fungibles( - foreign_location, - bought, - ) - .expect("failed to compute"); + let asset_amount_needed = ForeignAssetFeeAsExistentialDepositMultiplierFeeCharger::charge_weight_in_fungibles(foreign_location, bought) + .expect("failed to compute"); // Lets pay with: asset_amount_needed + asset_amount_extra let asset_amount_extra = 100_u128; @@ -576,7 +618,7 @@ fn test_asset_xcm_take_first_trader_with_refund() { // We actually use half of the weight let weight_used = bought / 2; - // Make sure refurnd works. + // Make sure refund works. let amount_refunded = WeightToFee::weight_to_fee(&(bought - weight_used)); assert_eq!( @@ -703,7 +745,7 @@ fn test_that_buying_ed_refund_does_not_refund_for_take_first_trader() { // Buy weight should work assert_ok!(trader.buy_weight(bought, asset.into(), &ctx)); - // Should return None. We have a specific check making sure we dont go below ED for + // Should return None. We have a specific check making sure we don't go below ED for // drop payment assert_eq!(trader.refund_weight(bought, &ctx), None); @@ -1071,30 +1113,133 @@ fn limited_reserve_transfer_assets_for_native_asset_to_asset_hub_rococo_works() Some(xcm_config::TreasuryAccount::get()), ) } + #[test] -fn receive_reserve_asset_deposited_roc_from_asset_hub_rococo_works() { +fn receive_reserve_asset_deposited_roc_from_asset_hub_rococo_fees_paid_by_pool_swap_works() { const BLOCK_AUTHOR_ACCOUNT: [u8; 32] = [13; 32]; + let block_author_account = AccountId::from(BLOCK_AUTHOR_ACCOUNT); + let staking_pot = StakingPot::get(); + + let foreign_asset_id_location = + xcm::v3::Location::new(2, [xcm::v3::Junction::GlobalConsensus(xcm::v3::NetworkId::Rococo)]); + let foreign_asset_id_minimum_balance = 1_000_000_000; + // sovereign account as foreign asset owner (can be whoever for this scenario) + let foreign_asset_owner = LocationToAccountId::convert_location(&Location::parent()).unwrap(); + let foreign_asset_create_params = + (foreign_asset_owner, foreign_asset_id_location, foreign_asset_id_minimum_balance); + asset_test_utils::test_cases_over_bridge::receive_reserve_asset_deposited_from_different_consensus_works::< Runtime, AllPalletsWithoutSystem, XcmConfig, - LocationToAccountId, ForeignAssetsInstance, >( collator_session_keys().add(collator_session_key(BLOCK_AUTHOR_ACCOUNT)), ExistentialDeposit::get(), AccountId::from([73; 32]), - AccountId::from(BLOCK_AUTHOR_ACCOUNT), + block_author_account.clone(), // receiving ROCs - (xcm::v3::Location::new(2, [xcm::v3::Junction::GlobalConsensus(xcm::v3::NetworkId::Rococo)]), 1000000000000, 1_000_000_000), - bridging_to_asset_hub_rococo, + foreign_asset_create_params.clone(), + 1000000000000, + || { + // setup pool for paying fees to touch `SwapFirstAssetTrader` + setup_pool_for_paying_fees_with_foreign_assets(foreign_asset_create_params); + // staking pot account for collecting local native fees from `BuyExecution` + let _ = Balances::force_set_balance(RuntimeOrigin::root(), StakingPot::get().into(), ExistentialDeposit::get()); + // prepare bridge configuration + bridging_to_asset_hub_rococo() + }, ( [PalletInstance(bp_bridge_hub_westend::WITH_BRIDGE_WESTEND_TO_ROCOCO_MESSAGES_PALLET_INDEX)].into(), GlobalConsensus(Rococo), [Parachain(1000)].into() - ) + ), + || { + // check staking pot for ED + assert_eq!(Balances::free_balance(&staking_pot), ExistentialDeposit::get()); + // check now foreign asset for staking pot + assert_eq!( + ForeignAssets::balance( + foreign_asset_id_location.into(), + &staking_pot + ), + 0 + ); + }, + || { + // `SwapFirstAssetTrader` - staking pot receives xcm fees in ROCs + assert!( + Balances::free_balance(&staking_pot) > ExistentialDeposit::get() + ); + // staking pot receives no foreign assets + assert_eq!( + ForeignAssets::balance( + foreign_asset_id_location.into(), + &staking_pot + ), + 0 + ); + } ) } + +#[test] +fn receive_reserve_asset_deposited_roc_from_asset_hub_rococo_fees_paid_by_sufficient_asset_works() { + const BLOCK_AUTHOR_ACCOUNT: [u8; 32] = [13; 32]; + let block_author_account = AccountId::from(BLOCK_AUTHOR_ACCOUNT); + let staking_pot = StakingPot::get(); + + let foreign_asset_id_location = + xcm::v3::Location::new(2, [xcm::v3::Junction::GlobalConsensus(xcm::v3::NetworkId::Rococo)]); + let foreign_asset_id_minimum_balance = 1_000_000_000; + // sovereign account as foreign asset owner (can be whoever for this scenario) + let foreign_asset_owner = LocationToAccountId::convert_location(&Location::parent()).unwrap(); + let foreign_asset_create_params = + (foreign_asset_owner, foreign_asset_id_location, foreign_asset_id_minimum_balance); + + asset_test_utils::test_cases_over_bridge::receive_reserve_asset_deposited_from_different_consensus_works::< + Runtime, + AllPalletsWithoutSystem, + XcmConfig, + ForeignAssetsInstance, + >( + collator_session_keys().add(collator_session_key(BLOCK_AUTHOR_ACCOUNT)), + ExistentialDeposit::get(), + AccountId::from([73; 32]), + block_author_account.clone(), + // receiving ROCs + foreign_asset_create_params, + 1000000000000, + bridging_to_asset_hub_rococo, + ( + [PalletInstance(bp_bridge_hub_westend::WITH_BRIDGE_WESTEND_TO_ROCOCO_MESSAGES_PALLET_INDEX)].into(), + GlobalConsensus(Rococo), + [Parachain(1000)].into() + ), + || { + // check block author before + assert_eq!( + ForeignAssets::balance( + foreign_asset_id_location.into(), + &block_author_account + ), + 0 + ); + }, + || { + // `TakeFirstAssetTrader` puts fees to the block author + assert!( + ForeignAssets::balance( + foreign_asset_id_location.into(), + &block_author_account + ) > 0 + ); + // `SwapFirstAssetTrader` did not work + assert_eq!(Balances::free_balance(&staking_pot), 0); + } + ) +} + #[test] fn report_bridge_status_from_xcm_bridge_router_for_rococo_works() { asset_test_utils::test_cases_over_bridge::report_bridge_status_from_xcm_bridge_router_works::< diff --git a/cumulus/parachains/runtimes/assets/common/Cargo.toml b/cumulus/parachains/runtimes/assets/common/Cargo.toml index 74e5e44ce15581e8e4df7ad6c49417c2b0fdc756..12dfd9da1fffbc6d1be0edc40ab6de3ebcc78e20 100644 --- a/cumulus/parachains/runtimes/assets/common/Cargo.toml +++ b/cumulus/parachains/runtimes/assets/common/Cargo.toml @@ -11,8 +11,8 @@ workspace = true [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -log = { version = "0.4.20", default-features = false } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +log = { workspace = true } impl-trait-for-tuples = "0.2.2" # Substrate diff --git a/cumulus/parachains/runtimes/assets/common/src/lib.rs b/cumulus/parachains/runtimes/assets/common/src/lib.rs index a0c912b6f0fe3643f1f516b311fdfd5d401db4d0..fa2752179eb6fd238eb8596d8e3ebddf947680d3 100644 --- a/cumulus/parachains/runtimes/assets/common/src/lib.rs +++ b/cumulus/parachains/runtimes/assets/common/src/lib.rs @@ -371,7 +371,7 @@ mod tests { for (asset, expected_result) in test_data { assert_eq!( - >::matches_fungibles( + >::matches_fungibles( &asset.clone().try_into().unwrap() ), expected_result, diff --git a/cumulus/parachains/runtimes/assets/test-utils/Cargo.toml b/cumulus/parachains/runtimes/assets/test-utils/Cargo.toml index f1b3953ce473bf5dc27d63eb9a9404fb9086979d..883c93c97b4de6774e86ee83b84d246dc1427f7f 100644 --- a/cumulus/parachains/runtimes/assets/test-utils/Cargo.toml +++ b/cumulus/parachains/runtimes/assets/test-utils/Cargo.toml @@ -16,8 +16,8 @@ codec = { package = "parity-scale-codec", version = "3.0.0", default-features = frame-support = { path = "../../../../../substrate/frame/support", default-features = false } frame-system = { path = "../../../../../substrate/frame/system", default-features = false } pallet-assets = { path = "../../../../../substrate/frame/assets", default-features = false } -pallet-asset-conversion = { path = "../../../../../substrate/frame/asset-conversion", default-features = false } pallet-balances = { path = "../../../../../substrate/frame/balances", default-features = false } +pallet-timestamp = { path = "../../../../../substrate/frame/timestamp", default-features = false } pallet-session = { path = "../../../../../substrate/frame/session", default-features = false } sp-io = { path = "../../../../../substrate/primitives/io", default-features = false } sp-runtime = { path = "../../../../../substrate/primitives/runtime", default-features = false } @@ -56,11 +56,11 @@ std = [ "cumulus-primitives-core/std", "frame-support/std", "frame-system/std", - "pallet-asset-conversion/std", "pallet-assets/std", "pallet-balances/std", "pallet-collator-selection/std", "pallet-session/std", + "pallet-timestamp/std", "pallet-xcm-bridge-hub-router/std", "pallet-xcm/std", "parachain-info/std", diff --git a/cumulus/parachains/runtimes/assets/test-utils/src/test_cases.rs b/cumulus/parachains/runtimes/assets/test-utils/src/test_cases.rs index 4007d926983ed97a8cae705428c1d61184173cb7..884b71369e79ad9713ea3cc8e243820862c9c20d 100644 --- a/cumulus/parachains/runtimes/assets/test-utils/src/test_cases.rs +++ b/cumulus/parachains/runtimes/assets/test-utils/src/test_cases.rs @@ -70,7 +70,8 @@ pub fn teleports_for_native_asset_works< + parachain_info::Config + pallet_collator_selection::Config + cumulus_pallet_parachain_system::Config - + cumulus_pallet_xcmp_queue::Config, + + cumulus_pallet_xcmp_queue::Config + + pallet_timestamp::Config, AllPalletsWithoutSystem: OnInitialize> + OnFinalize>, AccountIdOf: Into<[u8; 32]>, @@ -185,7 +186,7 @@ pub fn teleports_for_native_asset_works< // Mint funds into account to ensure it has enough balance to pay delivery fees let delivery_fees = - xcm_helpers::transfer_assets_delivery_fees::( + xcm_helpers::teleport_assets_delivery_fees::( (native_asset_id.clone(), native_asset_to_teleport_away.into()).into(), 0, Unlimited, @@ -350,7 +351,8 @@ pub fn teleports_for_foreign_assets_works< + pallet_collator_selection::Config + cumulus_pallet_parachain_system::Config + cumulus_pallet_xcmp_queue::Config - + pallet_assets::Config, + + pallet_assets::Config + + pallet_timestamp::Config, AllPalletsWithoutSystem: OnInitialize> + OnFinalize>, AccountIdOf: Into<[u8; 32]>, @@ -577,7 +579,7 @@ pub fn teleports_for_foreign_assets_works< // Make sure the target account has enough native asset to pay for delivery fees let delivery_fees = - xcm_helpers::transfer_assets_delivery_fees::( + xcm_helpers::teleport_assets_delivery_fees::( (foreign_asset_id_location_latest.clone(), asset_to_teleport_away).into(), 0, Unlimited, @@ -701,7 +703,8 @@ pub fn asset_transactor_transfer_with_local_consensus_currency_works: Into<[u8; 32]>, ValidatorIdOf: From>, BalanceOf: From, @@ -826,7 +829,8 @@ pub fn asset_transactor_transfer_with_pallet_assets_instance_works< + parachain_info::Config + pallet_collator_selection::Config + cumulus_pallet_parachain_system::Config - + pallet_assets::Config, + + pallet_assets::Config + + pallet_timestamp::Config, AccountIdOf: Into<[u8; 32]>, ValidatorIdOf: From>, BalanceOf: From, @@ -1093,7 +1097,8 @@ pub fn create_and_manage_foreign_assets_for_local_consensus_parachain_assets_wor + parachain_info::Config + pallet_collator_selection::Config + cumulus_pallet_parachain_system::Config - + pallet_assets::Config, + + pallet_assets::Config + + pallet_timestamp::Config, AccountIdOf: Into<[u8; 32]>, ValidatorIdOf: From>, BalanceOf: From, @@ -1115,7 +1120,7 @@ pub fn create_and_manage_foreign_assets_for_local_consensus_parachain_assets_wor AssetId: Clone, AssetIdConverter: MaybeEquivalence, { - // foreign parachain with the same consenus currency as asset + // foreign parachain with the same consensus currency as asset let foreign_asset_id_location = Location::new(1, [Parachain(2222), GeneralIndex(1234567)]); let asset_id = AssetIdConverter::convert(&foreign_asset_id_location).unwrap(); @@ -1422,7 +1427,8 @@ pub fn reserve_transfer_native_asset_to_non_teleport_para_works< + parachain_info::Config + pallet_collator_selection::Config + cumulus_pallet_parachain_system::Config - + cumulus_pallet_xcmp_queue::Config, + + cumulus_pallet_xcmp_queue::Config + + pallet_timestamp::Config, AllPalletsWithoutSystem: OnInitialize> + OnFinalize>, AccountIdOf: Into<[u8; 32]>, diff --git a/cumulus/parachains/runtimes/assets/test-utils/src/test_cases_over_bridge.rs b/cumulus/parachains/runtimes/assets/test-utils/src/test_cases_over_bridge.rs index 4a0f31c449ea61d00b04110008d9984e5e87cbd7..0b2364dbb8bd858a95f6a109c800032cb286412b 100644 --- a/cumulus/parachains/runtimes/assets/test-utils/src/test_cases_over_bridge.rs +++ b/cumulus/parachains/runtimes/assets/test-utils/src/test_cases_over_bridge.rs @@ -30,7 +30,6 @@ use parachains_runtimes_test_utils::{ SlotDurations, ValidatorIdOf, XcmReceivedFrom, }; use sp_runtime::{traits::StaticLookup, Saturating}; -use sp_std::ops::Mul; use xcm::{latest::prelude::*, VersionedAssets}; use xcm_builder::{CreateMatcher, MatchXcm}; use xcm_executor::{traits::ConvertLocation, XcmExecutor}; @@ -71,7 +70,8 @@ pub fn limited_reserve_transfer_assets_for_native_asset_works< + parachain_info::Config + pallet_collator_selection::Config + cumulus_pallet_parachain_system::Config - + cumulus_pallet_xcmp_queue::Config, + + cumulus_pallet_xcmp_queue::Config + + pallet_timestamp::Config, AllPalletsWithoutSystem: OnInitialize> + OnFinalize>, AccountIdOf: Into<[u8; 32]>, @@ -323,20 +323,22 @@ pub fn receive_reserve_asset_deposited_from_different_consensus_works< Runtime, AllPalletsWithoutSystem, XcmConfig, - LocationToAccountId, ForeignAssetsPalletInstance, >( collator_session_keys: CollatorSessionKeys, existential_deposit: BalanceOf, target_account: AccountIdOf, block_author_account: AccountIdOf, - ( - foreign_asset_id_location, - transfered_foreign_asset_id_amount, - foreign_asset_id_minimum_balance, - ): (xcm::v3::Location, u128, u128), - prepare_configuration: fn() -> TestBridgingConfig, + (foreign_asset_owner, foreign_asset_id_location, foreign_asset_id_minimum_balance): ( + AccountIdOf, + xcm::v3::Location, + u128, + ), + foreign_asset_id_amount_to_transfer: u128, + prepare_configuration: impl FnOnce() -> TestBridgingConfig, (bridge_instance, universal_origin, descend_origin): (Junctions, Junction, Junctions), /* bridge adds origin manipulation on the way */ + additional_checks_before: impl FnOnce(), + additional_checks_after: impl FnOnce(), ) where Runtime: frame_system::Config + pallet_balances::Config @@ -347,14 +349,13 @@ pub fn receive_reserve_asset_deposited_from_different_consensus_works< + cumulus_pallet_parachain_system::Config + cumulus_pallet_xcmp_queue::Config + pallet_assets::Config - + pallet_asset_conversion::Config, + + pallet_timestamp::Config, AllPalletsWithoutSystem: OnInitialize> + OnFinalize>, AccountIdOf: Into<[u8; 32]> + From<[u8; 32]>, ValidatorIdOf: From>, BalanceOf: From + Into, XcmConfig: xcm_executor::Config, - LocationToAccountId: ConvertLocation>, >::AssetId: From + Into, >::AssetIdParameter: @@ -365,9 +366,6 @@ pub fn receive_reserve_asset_deposited_from_different_consensus_works< + Into, <::Lookup as StaticLookup>::Source: From<::AccountId>, - ::AssetKind: - From + Into, - ::Balance: From, ForeignAssetsPalletInstance: 'static, { ExtBuilder::::default() @@ -382,88 +380,31 @@ pub fn receive_reserve_asset_deposited_from_different_consensus_works< block_author_account.clone().into(), ); - // prepare bridge config - let TestBridgingConfig { local_bridge_hub_location, .. } = prepare_configuration(); - // drip 'ED' user target account let _ = >::deposit_creating( &target_account, existential_deposit, ); - // sovereign account as foreign asset owner (can be whoever for this scenario, doesnt - // matter) - let sovereign_account_as_owner_of_foreign_asset = - LocationToAccountId::convert_location(&Location::parent()).unwrap(); - - // staking pot account for collecting local native fees from `BuyExecution` - let staking_pot = >::account_id(); - let _ = >::deposit_creating( - &staking_pot, - existential_deposit, - ); - - // create foreign asset for wrapped/derivated representation + // create foreign asset for wrapped/derived representation assert_ok!( >::force_create( RuntimeHelper::::root_origin(), foreign_asset_id_location.into(), - sovereign_account_as_owner_of_foreign_asset.clone().into(), + foreign_asset_owner.into(), true, // is_sufficient=true foreign_asset_id_minimum_balance.into() ) ); - // setup a pool to pay fees with `foreign_asset_id_location` tokens - let pool_owner: AccountIdOf = [1u8; 32].into(); - let native_asset = xcm::v3::Location::parent(); - let pool_liquidity: u128 = - existential_deposit.into().max(foreign_asset_id_minimum_balance).mul(100_000); - - let _ = >::deposit_creating( - &pool_owner, - (existential_deposit.into() + pool_liquidity).mul(2).into(), - ); - - assert_ok!(>::mint( - RuntimeHelper::::origin_of( - sovereign_account_as_owner_of_foreign_asset - ), - foreign_asset_id_location.into(), - pool_owner.clone().into(), - (foreign_asset_id_minimum_balance + pool_liquidity).mul(2).into(), - )); - - assert_ok!(>::create_pool( - RuntimeHelper::::origin_of(pool_owner.clone()), - Box::new(native_asset.into()), - Box::new(foreign_asset_id_location.into()) - )); - - assert_ok!(>::add_liquidity( - RuntimeHelper::::origin_of(pool_owner.clone()), - Box::new(native_asset.into()), - Box::new(foreign_asset_id_location.into()), - pool_liquidity.into(), - pool_liquidity.into(), - 1.into(), - 1.into(), - pool_owner, - )); + // prepare bridge config + let TestBridgingConfig { local_bridge_hub_location, .. } = prepare_configuration(); // Balances before assert_eq!( >::free_balance(&target_account), existential_deposit.clone() ); - assert_eq!( - >::free_balance(&block_author_account), - 0.into() - ); - assert_eq!( - >::free_balance(&staking_pot), - existential_deposit.clone() - ); // ForeignAssets balances before assert_eq!( @@ -473,27 +414,16 @@ pub fn receive_reserve_asset_deposited_from_different_consensus_works< ), 0.into() ); - assert_eq!( - >::balance( - foreign_asset_id_location.into(), - &block_author_account - ), - 0.into() - ); - assert_eq!( - >::balance( - foreign_asset_id_location.into(), - &staking_pot - ), - 0.into() - ); + + // additional check before + additional_checks_before(); let foreign_asset_id_location_latest: Location = foreign_asset_id_location.try_into().unwrap(); let expected_assets = Assets::from(vec![Asset { id: AssetId(foreign_asset_id_location_latest.clone()), - fun: Fungible(transfered_foreign_asset_id_amount), + fun: Fungible(foreign_asset_id_amount_to_transfer), }]); let expected_beneficiary = Location::new( 0, @@ -510,7 +440,7 @@ pub fn receive_reserve_asset_deposited_from_different_consensus_works< BuyExecution { fees: Asset { id: AssetId(foreign_asset_id_location_latest.clone()), - fun: Fungible(transfered_foreign_asset_id_amount), + fun: Fungible(foreign_asset_id_amount_to_transfer), }, weight_limit: Unlimited, }, @@ -544,19 +474,10 @@ pub fn receive_reserve_asset_deposited_from_different_consensus_works< assert_ok!(outcome.ensure_complete()); // Balances after - // staking pot receives xcm fees in dot - assert!( - >::free_balance(&staking_pot) != - existential_deposit - ); assert_eq!( >::free_balance(&target_account), existential_deposit.clone() ); - assert_eq!( - >::free_balance(&block_author_account), - 0.into() - ); // ForeignAssets balances after assert!( @@ -565,20 +486,9 @@ pub fn receive_reserve_asset_deposited_from_different_consensus_works< &target_account ) > 0.into() ); - assert_eq!( - >::balance( - foreign_asset_id_location.into(), - &staking_pot - ), - 0.into() - ); - assert_eq!( - >::balance( - foreign_asset_id_location.into(), - &block_author_account - ), - 0.into() - ); + + // additional check after + additional_checks_after(); }) } @@ -602,7 +512,8 @@ pub fn report_bridge_status_from_xcm_bridge_router_works< + pallet_collator_selection::Config + cumulus_pallet_parachain_system::Config + cumulus_pallet_xcmp_queue::Config - + pallet_xcm_bridge_hub_router::Config, + + pallet_xcm_bridge_hub_router::Config + + pallet_timestamp::Config, AllPalletsWithoutSystem: OnInitialize> + OnFinalize>, AccountIdOf: Into<[u8; 32]>, diff --git a/cumulus/parachains/runtimes/assets/test-utils/src/xcm_helpers.rs b/cumulus/parachains/runtimes/assets/test-utils/src/xcm_helpers.rs index f509a3a8acaad9ea2f499c2fa48ca72e0b0882d9..ca0e81fae42eda216f93ed6265dd6dd87f6de538 100644 --- a/cumulus/parachains/runtimes/assets/test-utils/src/xcm_helpers.rs +++ b/cumulus/parachains/runtimes/assets/test-utils/src/xcm_helpers.rs @@ -18,11 +18,10 @@ use xcm::latest::prelude::*; -/// Returns the delivery fees amount for pallet xcm's `teleport_assets` and -/// `reserve_transfer_assets` extrinsics. +/// Returns the delivery fees amount for pallet xcm's `teleport_assets` extrinsics. /// Because it returns only a `u128`, it assumes delivery fees are only paid /// in one asset and that asset is known. -pub fn transfer_assets_delivery_fees( +pub fn teleport_assets_delivery_fees( assets: Assets, fee_asset_item: u32, weight_limit: WeightLimit, diff --git a/cumulus/parachains/runtimes/bridge-hubs/README.md b/cumulus/parachains/runtimes/bridge-hubs/README.md index cf617db730dd7faa19d932dbe6a0406b7a0c15f2..a9f1f98d142d70bff0cb15b0972c0c9baf022c0e 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/README.md +++ b/cumulus/parachains/runtimes/bridge-hubs/README.md @@ -38,7 +38,7 @@ mkdir -p ~/local_bridge_testing/logs --- # 1. Install zombienet Go to: https://github.com/paritytech/zombienet/releases -Copy the apropriate binary (zombienet-linux) from the latest release to ~/local_bridge_testing/bin +Copy the appropriate binary (zombienet-linux) from the latest release to ~/local_bridge_testing/bin --- @@ -89,20 +89,18 @@ cp target/release/polkadot-parachain ~/local_bridge_testing/bin/polkadot-paracha cd # Rococo + BridgeHubRococo + AssetHub for Rococo (mirroring Kusama) -POLKADOT_BINARY_PATH=~/local_bridge_testing/bin/polkadot \ -POLKADOT_PARACHAIN_BINARY_PATH=~/local_bridge_testing/bin/polkadot-parachain \ -POLKADOT_PARACHAIN_BINARY_PATH_FOR_ASSET_HUB_ROCOCO=~/local_bridge_testing/bin/polkadot-parachain-asset-hub \ - ~/local_bridge_testing/bin/zombienet-linux --provider native spawn ./cumulus/zombienet/bridge-hubs/bridge_hub_rococo_local_network.toml +POLKADOT_BINARY=~/local_bridge_testing/bin/polkadot \ +POLKADOT_PARACHAIN_BINARY=~/local_bridge_testing/bin/polkadot-parachain \ + ~/local_bridge_testing/bin/zombienet-linux --provider native spawn ./bridges/testing/environments/rococo-westend/bridge_hub_rococo_local_network.toml ``` ``` cd # Westend + BridgeHubWestend + AssetHub for Westend (mirroring Polkadot) -POLKADOT_BINARY_PATH=~/local_bridge_testing/bin/polkadot \ -POLKADOT_PARACHAIN_BINARY_PATH=~/local_bridge_testing/bin/polkadot-parachain \ -POLKADOT_PARACHAIN_BINARY_PATH_FOR_ASSET_HUB_WESTEND=~/local_bridge_testing/bin/polkadot-parachain-asset-hub \ - ~/local_bridge_testing/bin/zombienet-linux --provider native spawn ./cumulus/zombienet/bridge-hubs/bridge_hub_westend_local_network.toml +POLKADOT_BINARY=~/local_bridge_testing/bin/polkadot \ +POLKADOT_PARACHAIN_BINARY=~/local_bridge_testing/bin/polkadot-parachain \ + ~/local_bridge_testing/bin/zombienet-linux --provider native spawn ./bridges/testing/environments/rococo-westend/bridge_hub_westend_local_network.toml ``` ### Init bridge and run relayer between BridgeHubRococo and BridgeHubWestend @@ -114,7 +112,7 @@ POLKADOT_PARACHAIN_BINARY_PATH_FOR_ASSET_HUB_WESTEND=~/local_bridge_testing/bin/ ``` cd -./cumulus/scripts/bridges_rococo_westend.sh run-relay +./bridges/testing/environments/rococo-westend/bridges_rococo_westend.sh run-relay ``` **Check relay-chain headers relaying:** @@ -137,10 +135,10 @@ This initialization does several things: ``` cd -./cumulus/scripts/bridges_rococo_westend.sh init-asset-hub-rococo-local -./cumulus/scripts/bridges_rococo_westend.sh init-bridge-hub-rococo-local -./cumulus/scripts/bridges_rococo_westend.sh init-asset-hub-westend-local -./cumulus/scripts/bridges_rococo_westend.sh init-bridge-hub-westend-local +./bridges/testing/environments/rococo-westend/bridges_rococo_westend.sh init-asset-hub-rococo-local +./bridges/testing/environments/rococo-westend/bridges_rococo_westend.sh init-bridge-hub-rococo-local +./bridges/testing/environments/rococo-westend/bridges_rococo_westend.sh init-asset-hub-westend-local +./bridges/testing/environments/rococo-westend/bridges_rococo_westend.sh init-bridge-hub-westend-local ``` ### Send messages - transfer asset over bridge (ROCs/WNDs) @@ -150,13 +148,13 @@ Do reserve-backed transfers: cd # ROCs from Rococo's Asset Hub to Westend's. -./cumulus/scripts/bridges_rococo_westend.sh reserve-transfer-assets-from-asset-hub-rococo-local +./bridges/testing/environments/rococo-westend/bridges_rococo_westend.sh reserve-transfer-assets-from-asset-hub-rococo-local ``` ``` cd # WNDs from Westend's Asset Hub to Rococo's. -./cumulus/scripts/bridges_rococo_westend.sh reserve-transfer-assets-from-asset-hub-westend-local +./bridges/testing/environments/rococo-westend/bridges_rococo_westend.sh reserve-transfer-assets-from-asset-hub-westend-local ``` - open explorers: (see zombienets) @@ -171,13 +169,13 @@ Do reserve withdraw transfers: (when previous is finished) cd # wrappedWNDs from Rococo's Asset Hub to Westend's. -./cumulus/scripts/bridges_rococo_westend.sh withdraw-reserve-assets-from-asset-hub-rococo-local +./bridges/testing/environments/rococo-westend/bridges_rococo_westend.sh withdraw-reserve-assets-from-asset-hub-rococo-local ``` ``` cd # wrappedROCs from Westend's Asset Hub to Rococo's. -./cumulus/scripts/bridges_rococo_westend.sh withdraw-reserve-assets-from-asset-hub-westend-local +./bridges/testing/environments/rococo-westend/bridges_rococo_westend.sh withdraw-reserve-assets-from-asset-hub-westend-local ``` ### Claim relayer's rewards on BridgeHubRococo and BridgeHubWestend @@ -190,10 +188,10 @@ cd cd # Claim rewards on BridgeHubWestend: -./cumulus/scripts/bridges_rococo_westend.sh claim-rewards-bridge-hub-rococo-local +./bridges/testing/environments/rococo-westend/bridges_rococo_westend.sh claim-rewards-bridge-hub-rococo-local # Claim rewards on BridgeHubWestend: -./cumulus/scripts/bridges_rococo_westend.sh claim-rewards-bridge-hub-westend-local +./bridges/testing/environments/rococo-westend/bridges_rococo_westend.sh claim-rewards-bridge-hub-westend-local ``` - open explorers: (see zombienets) diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml index 920e7b1571c6f83ee241700ad30c57a10c76429e..f5a75aa03acd01381666a30439789387ae699ac9 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml @@ -17,11 +17,11 @@ codec = { package = "parity-scale-codec", version = "3.0.0", default-features = "derive", ] } hex-literal = { version = "0.4.1" } -log = { version = "0.4.20", default-features = false } -scale-info = { version = "2.10.0", default-features = false, features = [ +log = { workspace = true } +scale-info = { version = "2.11.1", default-features = false, features = [ "derive", ] } -serde = { version = "1.0.195", optional = true, features = ["derive"] } +serde = { optional = true, features = ["derive"], workspace = true, default-features = true } # Substrate frame-benchmarking = { path = "../../../../../substrate/frame/benchmarking", default-features = false, optional = true } @@ -78,6 +78,7 @@ cumulus-pallet-xcmp-queue = { path = "../../../../pallets/xcmp-queue", default-f ] } cumulus-primitives-aura = { path = "../../../../primitives/aura", default-features = false } cumulus-primitives-core = { path = "../../../../primitives/core", default-features = false } +cumulus-primitives-storage-weight-reclaim = { path = "../../../../primitives/storage-weight-reclaim", default-features = false } cumulus-primitives-utility = { path = "../../../../primitives/utility", default-features = false } pallet-collator-selection = { path = "../../../../pallets/collator-selection", default-features = false } parachain-info = { package = "staging-parachain-info", path = "../../../pallets/parachain-info", default-features = false } @@ -85,20 +86,20 @@ parachains-common = { path = "../../../common", default-features = false } testnet-parachains-constants = { path = "../../constants", default-features = false, features = ["rococo"] } # Bridges -bp-asset-hub-rococo = { path = "../../../../../bridges/primitives/chain-asset-hub-rococo", default-features = false } -bp-asset-hub-westend = { path = "../../../../../bridges/primitives/chain-asset-hub-westend", default-features = false } -bp-bridge-hub-polkadot = { path = "../../../../../bridges/primitives/chain-bridge-hub-polkadot", default-features = false } -bp-bridge-hub-rococo = { path = "../../../../../bridges/primitives/chain-bridge-hub-rococo", default-features = false } -bp-bridge-hub-westend = { path = "../../../../../bridges/primitives/chain-bridge-hub-westend", default-features = false } +bp-asset-hub-rococo = { path = "../../../../../bridges/chains/chain-asset-hub-rococo", default-features = false } +bp-asset-hub-westend = { path = "../../../../../bridges/chains/chain-asset-hub-westend", default-features = false } +bp-bridge-hub-polkadot = { path = "../../../../../bridges/chains/chain-bridge-hub-polkadot", default-features = false } +bp-bridge-hub-rococo = { path = "../../../../../bridges/chains/chain-bridge-hub-rococo", default-features = false } +bp-bridge-hub-westend = { path = "../../../../../bridges/chains/chain-bridge-hub-westend", default-features = false } bp-header-chain = { path = "../../../../../bridges/primitives/header-chain", default-features = false } bp-messages = { path = "../../../../../bridges/primitives/messages", default-features = false } bp-parachains = { path = "../../../../../bridges/primitives/parachains", default-features = false } -bp-polkadot-bulletin = { path = "../../../../../bridges/primitives/chain-polkadot-bulletin", default-features = false } +bp-polkadot-bulletin = { path = "../../../../../bridges/chains/chain-polkadot-bulletin", default-features = false } bp-polkadot-core = { path = "../../../../../bridges/primitives/polkadot-core", default-features = false } bp-relayers = { path = "../../../../../bridges/primitives/relayers", default-features = false } bp-runtime = { path = "../../../../../bridges/primitives/runtime", default-features = false } -bp-rococo = { path = "../../../../../bridges/primitives/chain-rococo", default-features = false } -bp-westend = { path = "../../../../../bridges/primitives/chain-westend", default-features = false } +bp-rococo = { path = "../../../../../bridges/chains/chain-rococo", default-features = false } +bp-westend = { path = "../../../../../bridges/chains/chain-westend", default-features = false } pallet-bridge-grandpa = { path = "../../../../../bridges/modules/grandpa", default-features = false } pallet-bridge-messages = { path = "../../../../../bridges/modules/messages", default-features = false } pallet-bridge-parachains = { path = "../../../../../bridges/modules/parachains", default-features = false } @@ -156,6 +157,7 @@ std = [ "cumulus-pallet-xcmp-queue/std", "cumulus-primitives-aura/std", "cumulus-primitives-core/std", + "cumulus-primitives-storage-weight-reclaim/std", "cumulus-primitives-utility/std", "frame-benchmarking/std", "frame-executive/std", @@ -296,7 +298,6 @@ try-runtime = [ "sp-runtime/try-runtime", ] -experimental = ["pallet-aura/experimental"] fast-runtime = [] # A feature that should be enabled when the runtime should be built for on-chain diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs index b4264cabd0027b93b37d59270d354e125f636f0c..7afa5f9fdc28b94f15a9074ba22b5860a0a1bd0a 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs @@ -38,7 +38,9 @@ pub mod xcm_config; use cumulus_pallet_parachain_system::RelayNumberMonotonicallyIncreases; use snowbridge_beacon_primitives::{Fork, ForkVersions}; use snowbridge_core::{ - gwei, meth, outbound::Message, AgentId, AllowSiblingsOnly, PricingParameters, Rewards, + gwei, meth, + outbound::{Command, Fee}, + AgentId, AllowSiblingsOnly, PricingParameters, Rewards, }; use snowbridge_router_primitives::inbound::MessageToXcm; use sp_api::impl_runtime_apis; @@ -59,7 +61,7 @@ use cumulus_primitives_core::ParaId; use frame_support::{ construct_runtime, derive_impl, dispatch::DispatchClass, - genesis_builder_helper::{build_config, create_default_config}, + genesis_builder_helper::{build_state, get_preset}, parameter_types, traits::{ConstBool, ConstU32, ConstU64, ConstU8, TransformOrigin}, weights::{ConstantMultiplier, Weight}, @@ -73,8 +75,6 @@ use testnet_parachains_constants::rococo::{ consensus::*, currency::*, fee::WeightToFee, snowbridge::INBOUND_QUEUE_PALLET_INDEX, time::*, }; -#[cfg(feature = "runtime-benchmarks")] -use bp_runtime::Chain; use bp_runtime::HeaderId; use bridge_hub_common::{ message_queue::{NarrowOriginToSibling, ParaIdToSibling}, @@ -100,12 +100,8 @@ use parachains_common::{ AVERAGE_ON_INITIALIZE_RATIO, NORMAL_DISPATCH_RATIO, }; -use polkadot_runtime_common::prod_or_fast; - #[cfg(feature = "runtime-benchmarks")] use benchmark_helpers::DoNothingRouter; -#[cfg(not(feature = "runtime-benchmarks"))] -use bridge_hub_common::BridgeHubMessageRouter; /// The address format for describing accounts. pub type Address = MultiAddress; @@ -134,6 +130,7 @@ pub type SignedExtra = ( bridge_to_westend_config::OnBridgeHubRococoRefundBridgeHubWestendMessages, bridge_to_bulletin_config::OnBridgeHubRococoRefundRococoBulletinMessages, ), + cumulus_primitives_storage_weight_reclaim::StorageWeightReclaim, ); /// Unchecked extrinsic type as expected by this runtime. @@ -152,6 +149,8 @@ pub type Migrations = ( ConstU32, ConstU32, >, + // permanent + pallet_xcm::migration::MigrateToLatestXcmVersion, ); /// Migration to initialize storage versions for pallets added after genesis. @@ -170,12 +169,12 @@ impl frame_support::traits::OnRuntimeUpgrade for InitStorageVersions { let mut writes = 0; if PolkadotXcm::on_chain_storage_version() == StorageVersion::new(0) { - PolkadotXcm::current_storage_version().put::(); + PolkadotXcm::in_code_storage_version().put::(); writes.saturating_inc(); } if Balances::on_chain_storage_version() == StorageVersion::new(0) { - Balances::current_storage_version().put::(); + Balances::in_code_storage_version().put::(); writes.saturating_inc(); } @@ -204,7 +203,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("bridge-hub-rococo"), impl_name: create_runtime_str!("bridge-hub-rococo"), authoring_version: 1, - spec_version: 1_006_001, + spec_version: 1_010_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 4, @@ -244,7 +243,7 @@ parameter_types! { // Configure FRAME pallets to include in runtime. -#[derive_impl(frame_system::config_preludes::ParaChainDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::ParaChainDefaultConfig)] impl frame_system::Config for Runtime { /// The identifier used to distinguish between accounts. type AccountId = AccountId; @@ -279,10 +278,7 @@ impl pallet_timestamp::Config for Runtime { /// A timestamp: milliseconds since the unix epoch. type Moment = u64; type OnTimestampSet = Aura; - #[cfg(feature = "experimental")] type MinimumPeriod = ConstU64<0>; - #[cfg(not(feature = "experimental"))] - type MinimumPeriod = ConstU64<{ SLOT_DURATION / 2 }>; type WeightInfo = weights::pallet_timestamp::WeightInfo; } @@ -321,7 +317,7 @@ parameter_types! { impl pallet_transaction_payment::Config for Runtime { type RuntimeEvent = RuntimeEvent; type OnChargeTransaction = - pallet_transaction_payment::CurrencyAdapter>; + pallet_transaction_payment::FungibleAdapter>; type OperationalFeeMultiplier = ConstU8<5>; type WeightToFee = WeightToFee; type LengthToFee = ConstantMultiplier; @@ -367,11 +363,15 @@ parameter_types! { impl pallet_message_queue::Config for Runtime { type RuntimeEvent = RuntimeEvent; type WeightInfo = weights::pallet_message_queue::WeightInfo; - #[cfg(feature = "runtime-benchmarks")] + // Use the NoopMessageProcessor exclusively for benchmarks, not for tests with the + // runtime-benchmarks feature as tests require the BridgeHubMessageRouter to process messages. + // The "test" feature flag doesn't work, hence the reliance on the "std" feature, which is + // enabled during tests. + #[cfg(all(not(feature = "std"), feature = "runtime-benchmarks"))] type MessageProcessor = pallet_message_queue::mock_helpers::NoopMessageProcessor; - #[cfg(not(feature = "runtime-benchmarks"))] - type MessageProcessor = BridgeHubMessageRouter< + #[cfg(not(all(not(feature = "std"), feature = "runtime-benchmarks")))] + type MessageProcessor = bridge_hub_common::BridgeHubMessageRouter< xcm_builder::ProcessXcmMessage< AggregateMessageOrigin, xcm_executor::XcmExecutor, @@ -386,6 +386,7 @@ impl pallet_message_queue::Config for Runtime { type HeapSize = sp_core::ConstU32<{ 64 * 1024 }>; type MaxStale = sp_core::ConstU32<8>; type ServiceWeight = MessageQueueServiceWeight; + type IdleMaxServiceWeight = MessageQueueServiceWeight; } impl cumulus_pallet_aura_ext::Config for Runtime {} @@ -443,7 +444,6 @@ impl pallet_aura::Config for Runtime { type DisabledValidators = (); type MaxAuthorities = ConstU32<100_000>; type AllowMultipleBlocksPerSlot = ConstBool; - #[cfg(feature = "experimental")] type SlotDuration = ConstU64; } @@ -505,7 +505,8 @@ parameter_types! { pub Parameters: PricingParameters = PricingParameters { exchange_rate: FixedU128::from_rational(1, 400), fee_per_gas: gwei(20), - rewards: Rewards { local: 1 * UNITS, remote: meth(1) } + rewards: Rewards { local: 1 * UNITS, remote: meth(1) }, + multiplier: FixedU128::from_rational(1, 1), }; } @@ -513,14 +514,14 @@ parameter_types! { pub mod benchmark_helpers { use crate::{EthereumBeaconClient, Runtime, RuntimeOrigin}; use codec::Encode; - use snowbridge_beacon_primitives::CompactExecutionHeader; + use snowbridge_beacon_primitives::BeaconHeader; use snowbridge_pallet_inbound_queue::BenchmarkHelper; use sp_core::H256; use xcm::latest::{Assets, Location, SendError, SendResult, SendXcm, Xcm, XcmHash}; impl BenchmarkHelper for Runtime { - fn initialize_storage(block_hash: H256, header: CompactExecutionHeader) { - EthereumBeaconClient::store_execution_header(block_hash, header, 0, H256::default()) + fn initialize_storage(beacon_header: BeaconHeader, block_roots_root: H256) { + EthereumBeaconClient::store_finalized_header(beacon_header, block_roots_root).unwrap(); } } @@ -641,14 +642,9 @@ parameter_types! { }; } -parameter_types! { - pub const MaxExecutionHeadersToKeep: u32 = prod_or_fast!(8192 * 2, 1000); -} - impl snowbridge_pallet_ethereum_client::Config for Runtime { type RuntimeEvent = RuntimeEvent; type ForkVersions = ChainForkVersions; - type MaxExecutionHeadersToKeep = MaxExecutionHeadersToKeep; type WeightInfo = weights::snowbridge_pallet_ethereum_client::WeightInfo; } @@ -730,7 +726,7 @@ construct_runtime!( // Message Queue. Importantly, is registered last so that messages are processed after // the `on_initialize` hooks of bridging pallets. - MessageQueue: pallet_message_queue = 250, + MessageQueue: pallet_message_queue = 175, } ); @@ -792,7 +788,7 @@ impl_runtime_apis! { } fn authorities() -> Vec { - Aura::authorities().into_inner() + pallet_aura::Authorities::::get().into_inner() } } @@ -814,7 +810,7 @@ impl_runtime_apis! { Executive::execute_block(block) } - fn initialize_block(header: &::Header) { + fn initialize_block(header: &::Header) -> sp_runtime::ExtrinsicInclusionMode { Executive::initialize_block(header) } } @@ -1024,8 +1020,8 @@ impl_runtime_apis! { snowbridge_pallet_outbound_queue::api::prove_message::(leaf_index) } - fn calculate_fee(message: Message) -> Option { - snowbridge_pallet_outbound_queue::api::calculate_fee::(message) + fn calculate_fee(command: Command, parameters: Option>) -> Fee { + snowbridge_pallet_outbound_queue::api::calculate_fee::(command, parameters) } } @@ -1108,6 +1104,12 @@ impl_runtime_apis! { use pallet_xcm::benchmarking::Pallet as PalletXcmExtrinsicsBenchmark; impl pallet_xcm::benchmarking::Config for Runtime { + type DeliveryHelper = cumulus_primitives_utility::ToParentDeliveryHelper< + xcm_config::XcmConfig, + ExistentialDepositAsset, + xcm_config::PriceForParentDelivery, + >; + fn reachable_dest() -> Option { Some(Parent.into()) } @@ -1116,7 +1118,7 @@ impl_runtime_apis! { // Relay/native token can be teleported between BH and Relay. Some(( Asset { - fun: Fungible(EXISTENTIAL_DEPOSIT), + fun: Fungible(ExistentialDeposit::get()), id: AssetId(Parent.into()) }, Parent.into(), @@ -1139,6 +1141,13 @@ impl_runtime_apis! { dest ) } + + fn get_asset() -> Asset { + Asset { + id: AssetId(Location::parent()), + fun: Fungible(ExistentialDeposit::get()), + } + } } use xcm::latest::prelude::*; @@ -1295,7 +1304,7 @@ impl_runtime_apis! { impl BridgeMessagesConfig for Runtime { fn is_relayer_rewarded(relayer: &Self::AccountId) -> bool { let bench_lane_id = >::bench_lane_id(); - let bridged_chain_id = bp_bridge_hub_westend::BridgeHubWestend::ID; + let bridged_chain_id = bridge_to_westend_config::BridgeHubWestendChainId::get(); pallet_bridge_relayers::Pallet::::relayer_reward( relayer, bp_relayers::RewardsAccountParams::new( @@ -1441,12 +1450,16 @@ impl_runtime_apis! { } impl sp_genesis_builder::GenesisBuilder for Runtime { - fn create_default_config() -> Vec { - create_default_config::() + fn build_state(config: Vec) -> sp_genesis_builder::Result { + build_state::(config) } - fn build_config(config: Vec) -> sp_genesis_builder::Result { - build_config::(config) + fn get_preset(id: &Option) -> Option> { + get_preset::(id, |_| None) + } + + fn preset_names() -> Vec { + vec![] } } } @@ -1484,7 +1497,8 @@ mod tests { ( bridge_to_westend_config::OnBridgeHubRococoRefundBridgeHubWestendMessages::default(), bridge_to_bulletin_config::OnBridgeHubRococoRefundRococoBulletinMessages::default(), - ) + ), + cumulus_primitives_storage_weight_reclaim::StorageWeightReclaim::new(), ); // for BridgeHubRococo diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_xcm.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_xcm.rs index 5faded42aa82df52f403b68de2a470ad4a5a17b7..adfaa9ea2028e4b8880e17a1ccc471beb64c9a3c 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_xcm.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_xcm.rs @@ -16,10 +16,10 @@ //! Autogenerated weights for `pallet_xcm` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-12-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-03-21, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-r43aesjn-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! HOSTNAME: `runner-h2rr8wx7-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("bridge-hub-rococo-dev")`, DB CACHE: 1024 // Executed Command: @@ -64,8 +64,30 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `38` // Estimated: `3503` - // Minimum execution time: 23_683_000 picoseconds. - Weight::from_parts(24_199_000, 0) + // Minimum execution time: 18_732_000 picoseconds. + Weight::from_parts(19_386_000, 0) + .saturating_add(Weight::from_parts(0, 3503)) + .saturating_add(T::DbWeight::get().reads(6)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: `ParachainSystem::UpwardDeliveryFeeFactor` (r:1 w:0) + /// Proof: `ParachainSystem::UpwardDeliveryFeeFactor` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) + /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) + /// Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) + /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) + /// Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) + /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + fn send_blob() -> Weight { + // Proof Size summary in bytes: + // Measured: `38` + // Estimated: `3503` + // Minimum execution time: 18_943_000 picoseconds. + Weight::from_parts(19_455_000, 0) .saturating_add(Weight::from_parts(0, 3503)) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) @@ -90,8 +112,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `70` // Estimated: `3593` - // Minimum execution time: 89_524_000 picoseconds. - Weight::from_parts(91_401_000, 0) + // Minimum execution time: 88_917_000 picoseconds. + Weight::from_parts(91_611_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(8)) .saturating_add(T::DbWeight::get().writes(3)) @@ -126,8 +148,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `70` // Estimated: `3593` - // Minimum execution time: 91_890_000 picoseconds. - Weight::from_parts(93_460_000, 0) + // Minimum execution time: 88_587_000 picoseconds. + Weight::from_parts(90_303_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(8)) .saturating_add(T::DbWeight::get().writes(3)) @@ -142,14 +164,24 @@ impl pallet_xcm::WeightInfo for WeightInfo { Weight::from_parts(18_446_744_073_709_551_000, 0) .saturating_add(Weight::from_parts(0, 0)) } + /// Storage: `Benchmark::Override` (r:0 w:0) + /// Proof: `Benchmark::Override` (`max_values`: None, `max_size`: None, mode: `Measured`) + fn execute_blob() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 18_446_744_073_709_551_000 picoseconds. + Weight::from_parts(18_446_744_073_709_551_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + } /// Storage: `PolkadotXcm::SupportedVersion` (r:0 w:1) /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) fn force_xcm_version() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_152_000 picoseconds. - Weight::from_parts(7_355_000, 0) + // Minimum execution time: 5_856_000 picoseconds. + Weight::from_parts(6_202_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -159,8 +191,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_081_000 picoseconds. - Weight::from_parts(2_258_000, 0) + // Minimum execution time: 1_797_000 picoseconds. + Weight::from_parts(1_970_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -186,8 +218,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `38` // Estimated: `3503` - // Minimum execution time: 28_067_000 picoseconds. - Weight::from_parts(28_693_000, 0) + // Minimum execution time: 24_479_000 picoseconds. + Weight::from_parts(25_058_000, 0) .saturating_add(Weight::from_parts(0, 3503)) .saturating_add(T::DbWeight::get().reads(8)) .saturating_add(T::DbWeight::get().writes(5)) @@ -212,8 +244,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `255` // Estimated: `3720` - // Minimum execution time: 30_420_000 picoseconds. - Weight::from_parts(31_373_000, 0) + // Minimum execution time: 27_282_000 picoseconds. + Weight::from_parts(27_924_000, 0) .saturating_add(Weight::from_parts(0, 3720)) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(4)) @@ -224,45 +256,45 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_087_000 picoseconds. - Weight::from_parts(2_243_000, 0) + // Minimum execution time: 1_801_000 picoseconds. + Weight::from_parts(1_988_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } - /// Storage: `PolkadotXcm::SupportedVersion` (r:4 w:2) + /// Storage: `PolkadotXcm::SupportedVersion` (r:5 w:2) /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) fn migrate_supported_version() -> Weight { // Proof Size summary in bytes: - // Measured: `95` - // Estimated: `10985` - // Minimum execution time: 15_142_000 picoseconds. - Weight::from_parts(15_598_000, 0) - .saturating_add(Weight::from_parts(0, 10985)) - .saturating_add(T::DbWeight::get().reads(4)) + // Measured: `89` + // Estimated: `13454` + // Minimum execution time: 16_509_000 picoseconds. + Weight::from_parts(16_939_000, 0) + .saturating_add(Weight::from_parts(0, 13454)) + .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) } - /// Storage: `PolkadotXcm::VersionNotifiers` (r:4 w:2) + /// Storage: `PolkadotXcm::VersionNotifiers` (r:5 w:2) /// Proof: `PolkadotXcm::VersionNotifiers` (`max_values`: None, `max_size`: None, mode: `Measured`) fn migrate_version_notifiers() -> Weight { // Proof Size summary in bytes: - // Measured: `99` - // Estimated: `10989` - // Minimum execution time: 15_041_000 picoseconds. - Weight::from_parts(15_493_000, 0) - .saturating_add(Weight::from_parts(0, 10989)) - .saturating_add(T::DbWeight::get().reads(4)) + // Measured: `93` + // Estimated: `13458` + // Minimum execution time: 16_140_000 picoseconds. + Weight::from_parts(16_843_000, 0) + .saturating_add(Weight::from_parts(0, 13458)) + .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) } - /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:5 w:0) + /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:6 w:0) /// Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) fn already_notified_target() -> Weight { // Proof Size summary in bytes: // Measured: `106` - // Estimated: `13471` - // Minimum execution time: 16_624_000 picoseconds. - Weight::from_parts(17_031_000, 0) - .saturating_add(Weight::from_parts(0, 13471)) - .saturating_add(T::DbWeight::get().reads(5)) + // Estimated: `15946` + // Minimum execution time: 18_160_000 picoseconds. + Weight::from_parts(18_948_000, 0) + .saturating_add(Weight::from_parts(0, 15946)) + .saturating_add(T::DbWeight::get().reads(6)) } /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:2 w:1) /// Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) @@ -282,36 +314,36 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `106` // Estimated: `6046` - // Minimum execution time: 26_398_000 picoseconds. - Weight::from_parts(26_847_000, 0) + // Minimum execution time: 24_409_000 picoseconds. + Weight::from_parts(25_261_000, 0) .saturating_add(Weight::from_parts(0, 6046)) .saturating_add(T::DbWeight::get().reads(8)) .saturating_add(T::DbWeight::get().writes(3)) } - /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:3 w:0) + /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:4 w:0) /// Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) fn notify_target_migration_fail() -> Weight { // Proof Size summary in bytes: // Measured: `136` - // Estimated: `8551` - // Minimum execution time: 8_741_000 picoseconds. - Weight::from_parts(8_954_000, 0) - .saturating_add(Weight::from_parts(0, 8551)) - .saturating_add(T::DbWeight::get().reads(3)) + // Estimated: `11026` + // Minimum execution time: 10_848_000 picoseconds. + Weight::from_parts(11_241_000, 0) + .saturating_add(Weight::from_parts(0, 11026)) + .saturating_add(T::DbWeight::get().reads(4)) } - /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:4 w:2) + /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:5 w:2) /// Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) fn migrate_version_notify_targets() -> Weight { // Proof Size summary in bytes: - // Measured: `106` - // Estimated: `10996` - // Minimum execution time: 15_306_000 picoseconds. - Weight::from_parts(15_760_000, 0) - .saturating_add(Weight::from_parts(0, 10996)) - .saturating_add(T::DbWeight::get().reads(4)) + // Measured: `100` + // Estimated: `13465` + // Minimum execution time: 16_609_000 picoseconds. + Weight::from_parts(17_044_000, 0) + .saturating_add(Weight::from_parts(0, 13465)) + .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) } - /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:4 w:2) + /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:5 w:2) /// Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) /// Storage: `ParachainSystem::UpwardDeliveryFeeFactor` (r:1 w:0) /// Proof: `ParachainSystem::UpwardDeliveryFeeFactor` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) @@ -327,12 +359,12 @@ impl pallet_xcm::WeightInfo for WeightInfo { /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) fn migrate_and_notify_old_targets() -> Weight { // Proof Size summary in bytes: - // Measured: `112` - // Estimated: `11002` - // Minimum execution time: 33_127_000 picoseconds. - Weight::from_parts(33_938_000, 0) - .saturating_add(Weight::from_parts(0, 11002)) - .saturating_add(T::DbWeight::get().reads(10)) + // Measured: `106` + // Estimated: `13471` + // Minimum execution time: 32_500_000 picoseconds. + Weight::from_parts(33_475_000, 0) + .saturating_add(Weight::from_parts(0, 13471)) + .saturating_add(T::DbWeight::get().reads(11)) .saturating_add(T::DbWeight::get().writes(4)) } /// Storage: `PolkadotXcm::QueryCounter` (r:1 w:1) @@ -343,8 +375,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `32` // Estimated: `1517` - // Minimum execution time: 4_290_000 picoseconds. - Weight::from_parts(4_450_000, 0) + // Minimum execution time: 3_484_000 picoseconds. + Weight::from_parts(3_673_000, 0) .saturating_add(Weight::from_parts(0, 1517)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) @@ -355,10 +387,22 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `7669` // Estimated: `11134` - // Minimum execution time: 26_408_000 picoseconds. - Weight::from_parts(26_900_000, 0) + // Minimum execution time: 25_225_000 picoseconds. + Weight::from_parts(25_731_000, 0) .saturating_add(Weight::from_parts(0, 11134)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } + /// Storage: `PolkadotXcm::AssetTraps` (r:1 w:1) + /// Proof: `PolkadotXcm::AssetTraps` (`max_values`: None, `max_size`: None, mode: `Measured`) + fn claim_assets() -> Weight { + // Proof Size summary in bytes: + // Measured: `90` + // Estimated: `3555` + // Minimum execution time: 33_961_000 picoseconds. + Weight::from_parts(34_818_000, 0) + .saturating_add(Weight::from_parts(0, 3555)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } } diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/snowbridge_pallet_ethereum_client.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/snowbridge_pallet_ethereum_client.rs index 0d5f29c6ff2f21165e45649848bd24664acd7e19..c8017939b627c7500694b6a88d052731b6cf715c 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/snowbridge_pallet_ethereum_client.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/snowbridge_pallet_ethereum_client.rs @@ -126,26 +126,4 @@ impl snowbridge_pallet_ethereum_client::WeightInfo for .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(1)) } - /// Storage: EthereumBeaconClient LatestFinalizedBlockRoot (r:1 w:0) - /// Proof: EthereumBeaconClient LatestFinalizedBlockRoot (max_values: Some(1), max_size: Some(32), added: 527, mode: MaxEncodedLen) - /// Storage: EthereumBeaconClient FinalizedBeaconState (r:1 w:0) - /// Proof: EthereumBeaconClient FinalizedBeaconState (max_values: None, max_size: Some(72), added: 2547, mode: MaxEncodedLen) - /// Storage: EthereumBeaconClient LatestExecutionState (r:1 w:1) - /// Proof: EthereumBeaconClient LatestExecutionState (max_values: Some(1), max_size: Some(80), added: 575, mode: MaxEncodedLen) - /// Storage: EthereumBeaconClient ExecutionHeaderIndex (r:1 w:1) - /// Proof: EthereumBeaconClient ExecutionHeaderIndex (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: EthereumBeaconClient ExecutionHeaderMapping (r:1 w:1) - /// Proof: EthereumBeaconClient ExecutionHeaderMapping (max_values: None, max_size: Some(36), added: 2511, mode: MaxEncodedLen) - /// Storage: EthereumBeaconClient ExecutionHeaders (r:0 w:1) - /// Proof: EthereumBeaconClient ExecutionHeaders (max_values: None, max_size: Some(136), added: 2611, mode: MaxEncodedLen) - fn submit_execution_header() -> Weight { - // Proof Size summary in bytes: - // Measured: `386` - // Estimated: `3537` - // Minimum execution time: 108_761_000 picoseconds. - Weight::from_parts(113_158_000, 0) - .saturating_add(Weight::from_parts(0, 3537)) - .saturating_add(T::DbWeight::get().reads(5)) - .saturating_add(T::DbWeight::get().writes(4)) - } } diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/snowbridge_pallet_inbound_queue.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/snowbridge_pallet_inbound_queue.rs index faf404f90cb34dd3825df585bb3221031147bb47..153c1d363be10888601dfa66bdcdf5e88af57001 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/snowbridge_pallet_inbound_queue.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/snowbridge_pallet_inbound_queue.rs @@ -58,12 +58,12 @@ impl snowbridge_pallet_inbound_queue::WeightInfo for We /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) fn submit() -> Weight { // Proof Size summary in bytes: - // Measured: `457` - // Estimated: `3601` - // Minimum execution time: 69_000_000 picoseconds. - Weight::from_parts(70_000_000, 0) - .saturating_add(Weight::from_parts(0, 3601)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(2)) + // Measured: `800` + // Estimated: `7200` + // Minimum execution time: 200_000_000 picoseconds. + Weight::from_parts(200_000_000, 0) + .saturating_add(Weight::from_parts(0, 7200)) + .saturating_add(T::DbWeight::get().reads(9)) + .saturating_add(T::DbWeight::get().writes(6)) } } diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs index b7d170707cfd42c66870fe249a10bcb3ecbb73d3..063c999aa7ad740fe225cc22ee62f685f1bb35aa 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs @@ -33,13 +33,13 @@ use bp_relayers::{PayRewardFromAccount, RewardsAccountOwner, RewardsAccountParam use bp_runtime::ChainId; use frame_support::{ parameter_types, - traits::{ConstU32, Contains, Equals, Everything, Nothing}, + traits::{tokens::imbalance::ResolveTo, ConstU32, Contains, Equals, Everything, Nothing}, StoragePrefixedMap, }; use frame_system::EnsureRoot; +use pallet_collator_selection::StakingPotAccountId; use pallet_xcm::XcmPassthrough; use parachains_common::{ - impls::ToStakingPot, xcm_config::{ AllSiblingSystemParachains, ConcreteAssetFromSystem, ParentRelayOrSiblingParachains, RelayOrOtherSystemParachains, @@ -54,16 +54,14 @@ use sp_runtime::traits::AccountIdConversion; use sp_std::marker::PhantomData; use testnet_parachains_constants::rococo::snowbridge::EthereumNetwork; use xcm::latest::prelude::*; -#[allow(deprecated)] use xcm_builder::{ deposit_or_burn_fee, AccountId32Aliases, AllowExplicitUnpaidExecutionFrom, AllowKnownQueryResponses, AllowSubscriptionsFrom, AllowTopLevelPaidExecutionFrom, - CurrencyAdapter, DenyReserveTransferToRelayChain, DenyThenTry, EnsureXcmOrigin, - FrameTransactionalProcessor, HandleFee, IsConcrete, ParentAsSuperuser, ParentIsPreset, - RelayChainAsNative, SiblingParachainAsNative, SiblingParachainConvertsVia, - SignedAccountId32AsNative, SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit, - TrailingSetTopicAsId, UsingComponents, WeightInfoBounds, WithComputedOrigin, WithUniqueTopic, - XcmFeeToAccount, + DenyReserveTransferToRelayChain, DenyThenTry, EnsureXcmOrigin, FrameTransactionalProcessor, + FungibleAdapter, HandleFee, IsConcrete, ParentAsSuperuser, ParentIsPreset, RelayChainAsNative, + SiblingParachainAsNative, SiblingParachainConvertsVia, SignedAccountId32AsNative, + SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit, TrailingSetTopicAsId, + UsingComponents, WeightInfoBounds, WithComputedOrigin, WithUniqueTopic, XcmFeeToAccount, }; use xcm_executor::{ traits::{FeeManager, FeeReason, FeeReason::Export, TransactAsset, WithOriginFilter}, @@ -96,8 +94,7 @@ pub type LocationToAccountId = ( ); /// Means for transacting the native currency on this chain. -#[allow(deprecated)] -pub type CurrencyTransactor = CurrencyAdapter< +pub type FungibleTransactor = FungibleAdapter< // Use this currency: Balances, // Use this currency when it is a fungible asset matching the given location or name: @@ -285,7 +282,7 @@ pub struct XcmConfig; impl xcm_executor::Config for XcmConfig { type RuntimeCall = RuntimeCall; type XcmSender = XcmRouter; - type AssetTransactor = CurrencyTransactor; + type AssetTransactor = FungibleTransactor; type OriginConverter = XcmOriginToTransactDispatchOrigin; // BridgeHub does not recognize a reserve location for any asset. Users must teleport Native // token where allowed (e.g. with the Relay Chain). @@ -298,8 +295,13 @@ impl xcm_executor::Config for XcmConfig { RuntimeCall, MaxInstructions, >; - type Trader = - UsingComponents>; + type Trader = UsingComponents< + WeightToFee, + TokenLocation, + AccountId, + Balances, + ResolveTo, Balances>, + >; type ResponseHandler = PolkadotXcm; type AssetTrap = PolkadotXcm; type AssetLocker = (); @@ -339,6 +341,9 @@ impl xcm_executor::Config for XcmConfig { type SafeCallFilter = SafeCallFilter; type Aliasers = Nothing; type TransactionalProcessor = FrameTransactionalProcessor; + type HrmpNewChannelOpenRequestHandler = (); + type HrmpChannelAcceptedHandler = (); + type HrmpChannelClosingHandler = (); } pub type PriceForParentDelivery = @@ -362,9 +367,9 @@ impl pallet_xcm::Config for Runtime { type XcmRouter = XcmRouter; // We want to disallow users sending (arbitrary) XCMs from this chain. type SendXcmOrigin = EnsureXcmOrigin; - // We support local origins dispatching XCM executions in principle... + // We support local origins dispatching XCM executions. type ExecuteXcmOrigin = EnsureXcmOrigin; - type XcmExecuteFilter = Nothing; + type XcmExecuteFilter = Everything; type XcmExecutor = XcmExecutor; type XcmTeleportFilter = Everything; type XcmReserveTransferFilter = Nothing; // This parachain is not meant as a reserve location. diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/tests/snowbridge.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/tests/snowbridge.rs index e14755c89d4d8ba2b103cf43d60ef4d96f2166a1..5960ab7b55054f228d1e946e5d6e5ff7dd9706ac 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/tests/snowbridge.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/tests/snowbridge.rs @@ -20,9 +20,9 @@ use bp_polkadot_core::Signature; use bridge_hub_rococo_runtime::{ bridge_to_bulletin_config::OnBridgeHubRococoRefundRococoBulletinMessages, bridge_to_westend_config::OnBridgeHubRococoRefundBridgeHubWestendMessages, - xcm_config::XcmConfig, BridgeRejectObsoleteHeadersAndMessages, Executive, - MessageQueueServiceWeight, Runtime, RuntimeCall, RuntimeEvent, SessionKeys, SignedExtra, - UncheckedExtrinsic, + xcm_config::XcmConfig, AllPalletsWithoutSystem, BridgeRejectObsoleteHeadersAndMessages, + Executive, MessageQueueServiceWeight, Runtime, RuntimeCall, RuntimeEvent, SessionKeys, + SignedExtra, UncheckedExtrinsic, }; use codec::{Decode, Encode}; use cumulus_primitives_core::XcmError::{FailedToTransactAsset, NotHoldingFees}; @@ -51,6 +51,7 @@ fn collator_session_keys() -> bridge_hub_test_utils::CollatorSessionKeys( + 11155111, collator_session_keys(), 1013, 1000, @@ -69,6 +70,7 @@ pub fn transfer_token_to_ethereum_works() { #[test] pub fn unpaid_transfer_token_to_ethereum_fails_with_barrier() { snowbridge_runtime_test_common::send_unpaid_transfer_token_message::( + 11155111, collator_session_keys(), 1013, 1000, @@ -80,6 +82,7 @@ pub fn unpaid_transfer_token_to_ethereum_fails_with_barrier() { #[test] pub fn transfer_token_to_ethereum_fee_not_enough() { snowbridge_runtime_test_common::send_transfer_token_message_failure::( + 11155111, collator_session_keys(), 1013, 1000, @@ -95,6 +98,7 @@ pub fn transfer_token_to_ethereum_fee_not_enough() { #[test] pub fn transfer_token_to_ethereum_insufficient_fund() { snowbridge_runtime_test_common::send_transfer_token_message_failure::( + 11155111, collator_session_keys(), 1013, 1000, @@ -102,7 +106,7 @@ pub fn transfer_token_to_ethereum_insufficient_fund() { H160::random(), H160::random(), DefaultBridgeHubEthereumBaseFee::get(), - FailedToTransactAsset("InsufficientBalance"), + FailedToTransactAsset("Funds are unavailable"), ) } @@ -135,6 +139,33 @@ fn ethereum_to_polkadot_message_extrinsics_work() { ); } +/// Tests that the digest items are as expected when a Ethereum Outbound message is received. +/// If the MessageQueue pallet is configured before (i.e. the MessageQueue pallet is listed before +/// the EthereumOutboundQueue in the construct_runtime macro) the EthereumOutboundQueue, this test +/// will fail. +#[test] +pub fn ethereum_outbound_queue_processes_messages_before_message_queue_works() { + snowbridge_runtime_test_common::ethereum_outbound_queue_processes_messages_before_message_queue_works::< + Runtime, + XcmConfig, + AllPalletsWithoutSystem, + >( + 11155111, + collator_session_keys(), + 1013, + 1000, + H160::random(), + H160::random(), + DefaultBridgeHubEthereumBaseFee::get(), + Box::new(|runtime_event_encoded: Vec| { + match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { + Ok(RuntimeEvent::EthereumOutboundQueue(event)) => Some(event), + _ => None, + } + }), + ) +} + fn construct_extrinsic( sender: sp_keyring::AccountKeyring, call: RuntimeCall, @@ -156,15 +187,11 @@ fn construct_extrinsic( OnBridgeHubRococoRefundBridgeHubWestendMessages::default(), OnBridgeHubRococoRefundRococoBulletinMessages::default(), ), + cumulus_primitives_storage_weight_reclaim::StorageWeightReclaim::new(), ); let payload = SignedPayload::new(call.clone(), extra.clone()).unwrap(); let signature = payload.using_encoded(|e| sender.sign(e)); - UncheckedExtrinsic::new_signed( - call, - account_id.into(), - Signature::Sr25519(signature.clone()), - extra, - ) + UncheckedExtrinsic::new_signed(call, account_id.into(), Signature::Sr25519(signature), extra) } fn construct_and_apply_extrinsic( diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/tests/tests.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/tests/tests.rs index f11954cf165fdae2ee36377456b2bc4b2d6755a6..776c505fa640fa956ae07e9928ccf2f9293e80dd 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/tests/tests.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/tests/tests.rs @@ -64,15 +64,11 @@ fn construct_extrinsic( bridge_to_westend_config::OnBridgeHubRococoRefundBridgeHubWestendMessages::default(), bridge_to_bulletin_config::OnBridgeHubRococoRefundRococoBulletinMessages::default(), ), + cumulus_primitives_storage_weight_reclaim::StorageWeightReclaim::new(), ); let payload = SignedPayload::new(call.clone(), extra.clone()).unwrap(); let signature = payload.using_encoded(|e| sender.sign(e)); - UncheckedExtrinsic::new_signed( - call, - account_id.into(), - Signature::Sr25519(signature.clone()), - extra, - ) + UncheckedExtrinsic::new_signed(call, account_id.into(), Signature::Sr25519(signature), extra) } fn construct_and_apply_extrinsic( diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/Cargo.toml b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/Cargo.toml index 4cbfde91d00b8911a833afca2457940fbe998e6f..86560caca99ca344065373330638c3232a417f21 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/Cargo.toml +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/Cargo.toml @@ -15,9 +15,9 @@ substrate-wasm-builder = { path = "../../../../../substrate/utils/wasm-builder", [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } hex-literal = { version = "0.4.1" } -log = { version = "0.4.20", default-features = false } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.195", optional = true, features = ["derive"] } +log = { workspace = true } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +serde = { optional = true, features = ["derive"], workspace = true, default-features = true } # Substrate frame-benchmarking = { path = "../../../../../substrate/frame/benchmarking", default-features = false, optional = true } @@ -71,31 +71,33 @@ cumulus-pallet-xcmp-queue = { path = "../../../../pallets/xcmp-queue", default-f cumulus-primitives-aura = { path = "../../../../primitives/aura", default-features = false } cumulus-primitives-core = { path = "../../../../primitives/core", default-features = false } cumulus-primitives-utility = { path = "../../../../primitives/utility", default-features = false } +cumulus-primitives-storage-weight-reclaim = { path = "../../../../primitives/storage-weight-reclaim", default-features = false } + pallet-collator-selection = { path = "../../../../pallets/collator-selection", default-features = false } parachain-info = { package = "staging-parachain-info", path = "../../../pallets/parachain-info", default-features = false } parachains-common = { path = "../../../common", default-features = false } testnet-parachains-constants = { path = "../../constants", default-features = false, features = ["westend"] } # Bridges -bp-asset-hub-rococo = { path = "../../../../../bridges/primitives/chain-asset-hub-rococo", default-features = false } -bp-asset-hub-westend = { path = "../../../../../bridges/primitives/chain-asset-hub-westend", default-features = false } -bp-bridge-hub-rococo = { path = "../../../../../bridges/primitives/chain-bridge-hub-rococo", default-features = false } -bp-bridge-hub-westend = { path = "../../../../../bridges/primitives/chain-bridge-hub-westend", default-features = false } +bp-asset-hub-rococo = { path = "../../../../../bridges/chains/chain-asset-hub-rococo", default-features = false } +bp-asset-hub-westend = { path = "../../../../../bridges/chains/chain-asset-hub-westend", default-features = false } +bp-bridge-hub-rococo = { path = "../../../../../bridges/chains/chain-bridge-hub-rococo", default-features = false } +bp-bridge-hub-westend = { path = "../../../../../bridges/chains/chain-bridge-hub-westend", default-features = false } bp-header-chain = { path = "../../../../../bridges/primitives/header-chain", default-features = false } bp-messages = { path = "../../../../../bridges/primitives/messages", default-features = false } bp-parachains = { path = "../../../../../bridges/primitives/parachains", default-features = false } bp-polkadot-core = { path = "../../../../../bridges/primitives/polkadot-core", default-features = false } bp-relayers = { path = "../../../../../bridges/primitives/relayers", default-features = false } bp-runtime = { path = "../../../../../bridges/primitives/runtime", default-features = false } -bp-rococo = { path = "../../../../../bridges/primitives/chain-rococo", default-features = false } -bp-westend = { path = "../../../../../bridges/primitives/chain-westend", default-features = false } +bp-rococo = { path = "../../../../../bridges/chains/chain-rococo", default-features = false } +bp-westend = { path = "../../../../../bridges/chains/chain-westend", default-features = false } pallet-bridge-grandpa = { path = "../../../../../bridges/modules/grandpa", default-features = false } pallet-bridge-messages = { path = "../../../../../bridges/modules/messages", default-features = false } pallet-bridge-parachains = { path = "../../../../../bridges/modules/parachains", default-features = false } pallet-bridge-relayers = { path = "../../../../../bridges/modules/relayers", default-features = false } pallet-xcm-bridge-hub = { path = "../../../../../bridges/modules/xcm-bridge-hub", default-features = false } bridge-runtime-common = { path = "../../../../../bridges/bin/runtime-common", default-features = false } -bridge-hub-common = { path = "../../bridge-hubs/common", default-features = false } +bridge-hub-common = { path = "../common", default-features = false } [dev-dependencies] static_assertions = "1.1" @@ -128,6 +130,7 @@ std = [ "cumulus-pallet-xcmp-queue/std", "cumulus-primitives-aura/std", "cumulus-primitives-core/std", + "cumulus-primitives-storage-weight-reclaim/std", "cumulus-primitives-utility/std", "frame-benchmarking/std", "frame-executive/std", @@ -246,8 +249,6 @@ try-runtime = [ "sp-runtime/try-runtime", ] -experimental = ["pallet-aura/experimental"] - # A feature that should be enabled when the runtime should be built for on-chain # deployment. This will disable stuff that shouldn't be part of the on-chain wasm # to make it smaller, like logging for example. diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/lib.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/lib.rs index dd11bbbf3724412c9c3ab2276d3235f9f1826d9c..4dc7207797a03d3bf2cbf4f8b64e91f6bcbb4b60 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/lib.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/lib.rs @@ -55,7 +55,7 @@ use bridge_hub_common::{ use frame_support::{ construct_runtime, derive_impl, dispatch::DispatchClass, - genesis_builder_helper::{build_config, create_default_config}, + genesis_builder_helper::{build_state, get_preset}, parameter_types, traits::{ConstBool, ConstU32, ConstU64, ConstU8, TransformOrigin}, weights::{ConstantMultiplier, Weight}, @@ -69,8 +69,6 @@ pub use sp_consensus_aura::sr25519::AuthorityId as AuraId; pub use sp_runtime::{MultiAddress, Perbill, Permill}; use xcm_config::{XcmOriginToTransactDispatchOrigin, XcmRouter}; -#[cfg(feature = "runtime-benchmarks")] -use bp_runtime::Chain; use bp_runtime::HeaderId; #[cfg(any(feature = "std", test))] @@ -111,6 +109,7 @@ pub type SignedExtra = ( pallet_transaction_payment::ChargeTransactionPayment, BridgeRejectObsoleteHeadersAndMessages, (bridge_to_rococo_config::OnBridgeHubWestendRefundBridgeHubRococoMessages,), + cumulus_primitives_storage_weight_reclaim::StorageWeightReclaim, ); /// Unchecked extrinsic type as expected by this runtime. @@ -124,6 +123,8 @@ pub type Migrations = ( InitStorageVersions, // unreleased cumulus_pallet_xcmp_queue::migration::v4::MigrationToV4, + // permanent + pallet_xcm::migration::MigrateToLatestXcmVersion, ); /// Migration to initialize storage versions for pallets added after genesis. @@ -142,12 +143,12 @@ impl frame_support::traits::OnRuntimeUpgrade for InitStorageVersions { let mut writes = 0; if PolkadotXcm::on_chain_storage_version() == StorageVersion::new(0) { - PolkadotXcm::current_storage_version().put::(); + PolkadotXcm::in_code_storage_version().put::(); writes.saturating_inc(); } if Balances::on_chain_storage_version() == StorageVersion::new(0) { - Balances::current_storage_version().put::(); + Balances::in_code_storage_version().put::(); writes.saturating_inc(); } @@ -176,7 +177,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("bridge-hub-westend"), impl_name: create_runtime_str!("bridge-hub-westend"), authoring_version: 1, - spec_version: 1_006_000, + spec_version: 1_010_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 4, @@ -216,7 +217,7 @@ parameter_types! { // Configure FRAME pallets to include in runtime. -#[derive_impl(frame_system::config_preludes::ParaChainDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::ParaChainDefaultConfig)] impl frame_system::Config for Runtime { /// The identifier used to distinguish between accounts. type AccountId = AccountId; @@ -251,10 +252,7 @@ impl pallet_timestamp::Config for Runtime { /// A timestamp: milliseconds since the unix epoch. type Moment = u64; type OnTimestampSet = Aura; - #[cfg(feature = "experimental")] type MinimumPeriod = ConstU64<0>; - #[cfg(not(feature = "experimental"))] - type MinimumPeriod = ConstU64<{ SLOT_DURATION / 2 }>; type WeightInfo = weights::pallet_timestamp::WeightInfo; } @@ -293,7 +291,7 @@ parameter_types! { impl pallet_transaction_payment::Config for Runtime { type RuntimeEvent = RuntimeEvent; type OnChargeTransaction = - pallet_transaction_payment::CurrencyAdapter>; + pallet_transaction_payment::FungibleAdapter>; type OperationalFeeMultiplier = ConstU8<5>; type WeightToFee = WeightToFee; type LengthToFee = ConstantMultiplier; @@ -351,6 +349,7 @@ impl pallet_message_queue::Config for Runtime { type HeapSize = sp_core::ConstU32<{ 64 * 1024 }>; type MaxStale = sp_core::ConstU32<8>; type ServiceWeight = MessageQueueServiceWeight; + type IdleMaxServiceWeight = MessageQueueServiceWeight; } impl cumulus_pallet_aura_ext::Config for Runtime {} @@ -407,7 +406,6 @@ impl pallet_aura::Config for Runtime { type DisabledValidators = (); type MaxAuthorities = ConstU32<100_000>; type AllowMultipleBlocksPerSlot = ConstBool; - #[cfg(feature = "experimental")] type SlotDuration = ConstU64; } @@ -522,6 +520,7 @@ mod benches { [pallet_utility, Utility] [pallet_timestamp, Timestamp] [pallet_collator_selection, CollatorSelection] + [cumulus_pallet_parachain_system, ParachainSystem] [cumulus_pallet_xcmp_queue, XcmpQueue] // XCM [pallet_xcm, PalletXcmExtrinsicsBenchmark::] @@ -543,7 +542,7 @@ impl_runtime_apis! { } fn authorities() -> Vec { - Aura::authorities().into_inner() + pallet_aura::Authorities::::get().into_inner() } } @@ -565,7 +564,7 @@ impl_runtime_apis! { Executive::execute_block(block) } - fn initialize_block(header: &::Header) { + fn initialize_block(header: &::Header) -> sp_runtime::ExtrinsicInclusionMode { Executive::initialize_block(header) } } @@ -805,6 +804,12 @@ impl_runtime_apis! { use pallet_xcm::benchmarking::Pallet as PalletXcmExtrinsicsBenchmark; impl pallet_xcm::benchmarking::Config for Runtime { + type DeliveryHelper = cumulus_primitives_utility::ToParentDeliveryHelper< + xcm_config::XcmConfig, + ExistentialDepositAsset, + xcm_config::PriceForParentDelivery, + >; + fn reachable_dest() -> Option { Some(Parent.into()) } @@ -813,7 +818,7 @@ impl_runtime_apis! { // Relay/native token can be teleported between BH and Relay. Some(( Asset { - fun: Fungible(EXISTENTIAL_DEPOSIT), + fun: Fungible(ExistentialDeposit::get()), id: AssetId(Parent.into()) }, Parent.into(), @@ -836,6 +841,13 @@ impl_runtime_apis! { dest ) } + + fn get_asset() -> Asset { + Asset { + id: AssetId(Location::parent()), + fun: Fungible(ExistentialDeposit::get()), + } + } } use xcm::latest::prelude::*; @@ -989,7 +1001,7 @@ impl_runtime_apis! { impl BridgeMessagesConfig for Runtime { fn is_relayer_rewarded(relayer: &Self::AccountId) -> bool { let bench_lane_id = >::bench_lane_id(); - let bridged_chain_id = bp_bridge_hub_rococo::BridgeHubRococo::ID; + let bridged_chain_id = bridge_to_rococo_config::BridgeHubRococoChainId::get(); pallet_bridge_relayers::Pallet::::relayer_reward( relayer, bp_relayers::RewardsAccountParams::new( @@ -1100,12 +1112,16 @@ impl_runtime_apis! { } impl sp_genesis_builder::GenesisBuilder for Runtime { - fn create_default_config() -> Vec { - create_default_config::() + fn build_state(config: Vec) -> sp_genesis_builder::Result { + build_state::(config) + } + + fn get_preset(id: &Option) -> Option> { + get_preset::(id, |_| None) } - fn build_config(config: Vec) -> sp_genesis_builder::Result { - build_config::(config) + fn preset_names() -> Vec { + vec![] } } } @@ -1143,6 +1159,7 @@ mod tests { ( bridge_to_rococo_config::OnBridgeHubWestendRefundBridgeHubRococoMessages::default(), ), + cumulus_primitives_storage_weight_reclaim::StorageWeightReclaim::new() ); { diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/pallet_xcm.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/pallet_xcm.rs index 83e4260e77198355d23ea0c38481d7b8e68267c7..9cf4c61466a1bd37ffea56681648b2c2e2ce4555 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/pallet_xcm.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/pallet_xcm.rs @@ -16,10 +16,10 @@ //! Autogenerated weights for `pallet_xcm` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-12-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-03-22, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-r43aesjn-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! HOSTNAME: `runner-h2rr8wx7-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("bridge-hub-westend-dev")`, DB CACHE: 1024 // Executed Command: @@ -64,8 +64,30 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `38` // Estimated: `3503` - // Minimum execution time: 23_219_000 picoseconds. - Weight::from_parts(23_818_000, 0) + // Minimum execution time: 19_702_000 picoseconds. + Weight::from_parts(20_410_000, 0) + .saturating_add(Weight::from_parts(0, 3503)) + .saturating_add(T::DbWeight::get().reads(6)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: `ParachainSystem::UpwardDeliveryFeeFactor` (r:1 w:0) + /// Proof: `ParachainSystem::UpwardDeliveryFeeFactor` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) + /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) + /// Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) + /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) + /// Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) + /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + fn send_blob() -> Weight { + // Proof Size summary in bytes: + // Measured: `38` + // Estimated: `3503` + // Minimum execution time: 19_525_000 picoseconds. + Weight::from_parts(20_071_000, 0) .saturating_add(Weight::from_parts(0, 3503)) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) @@ -88,10 +110,10 @@ impl pallet_xcm::WeightInfo for WeightInfo { /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) fn teleport_assets() -> Weight { // Proof Size summary in bytes: - // Measured: `70` + // Measured: `107` // Estimated: `3593` - // Minimum execution time: 90_120_000 picoseconds. - Weight::from_parts(92_545_000, 0) + // Minimum execution time: 91_793_000 picoseconds. + Weight::from_parts(93_761_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(8)) .saturating_add(T::DbWeight::get().writes(3)) @@ -124,10 +146,10 @@ impl pallet_xcm::WeightInfo for WeightInfo { /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) fn transfer_assets() -> Weight { // Proof Size summary in bytes: - // Measured: `70` + // Measured: `107` // Estimated: `3593` - // Minimum execution time: 91_339_000 picoseconds. - Weight::from_parts(93_204_000, 0) + // Minimum execution time: 91_819_000 picoseconds. + Weight::from_parts(93_198_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(8)) .saturating_add(T::DbWeight::get().writes(3)) @@ -142,14 +164,24 @@ impl pallet_xcm::WeightInfo for WeightInfo { Weight::from_parts(18_446_744_073_709_551_000, 0) .saturating_add(Weight::from_parts(0, 0)) } + /// Storage: `Benchmark::Override` (r:0 w:0) + /// Proof: `Benchmark::Override` (`max_values`: None, `max_size`: None, mode: `Measured`) + fn execute_blob() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 18_446_744_073_709_551_000 picoseconds. + Weight::from_parts(18_446_744_073_709_551_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + } /// Storage: `PolkadotXcm::SupportedVersion` (r:0 w:1) /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) fn force_xcm_version() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 6_976_000 picoseconds. - Weight::from_parts(7_284_000, 0) + // Minimum execution time: 6_183_000 picoseconds. + Weight::from_parts(6_598_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -159,8 +191,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_044_000 picoseconds. - Weight::from_parts(2_223_000, 0) + // Minimum execution time: 1_987_000 picoseconds. + Weight::from_parts(2_076_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -186,8 +218,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `38` // Estimated: `3503` - // Minimum execution time: 27_778_000 picoseconds. - Weight::from_parts(28_318_000, 0) + // Minimum execution time: 25_375_000 picoseconds. + Weight::from_parts(26_165_000, 0) .saturating_add(Weight::from_parts(0, 3503)) .saturating_add(T::DbWeight::get().reads(8)) .saturating_add(T::DbWeight::get().writes(5)) @@ -212,8 +244,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `255` // Estimated: `3720` - // Minimum execution time: 30_446_000 picoseconds. - Weight::from_parts(31_925_000, 0) + // Minimum execution time: 28_167_000 picoseconds. + Weight::from_parts(28_792_000, 0) .saturating_add(Weight::from_parts(0, 3720)) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(4)) @@ -224,45 +256,45 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_037_000 picoseconds. + // Minimum execution time: 2_039_000 picoseconds. Weight::from_parts(2_211_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } - /// Storage: `PolkadotXcm::SupportedVersion` (r:4 w:2) + /// Storage: `PolkadotXcm::SupportedVersion` (r:5 w:2) /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) fn migrate_supported_version() -> Weight { // Proof Size summary in bytes: - // Measured: `95` - // Estimated: `10985` - // Minimum execution time: 15_620_000 picoseconds. - Weight::from_parts(15_984_000, 0) - .saturating_add(Weight::from_parts(0, 10985)) - .saturating_add(T::DbWeight::get().reads(4)) + // Measured: `89` + // Estimated: `13454` + // Minimum execution time: 17_127_000 picoseconds. + Weight::from_parts(17_519_000, 0) + .saturating_add(Weight::from_parts(0, 13454)) + .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) } - /// Storage: `PolkadotXcm::VersionNotifiers` (r:4 w:2) + /// Storage: `PolkadotXcm::VersionNotifiers` (r:5 w:2) /// Proof: `PolkadotXcm::VersionNotifiers` (`max_values`: None, `max_size`: None, mode: `Measured`) fn migrate_version_notifiers() -> Weight { // Proof Size summary in bytes: - // Measured: `99` - // Estimated: `10989` - // Minimum execution time: 15_689_000 picoseconds. - Weight::from_parts(16_093_000, 0) - .saturating_add(Weight::from_parts(0, 10989)) - .saturating_add(T::DbWeight::get().reads(4)) + // Measured: `93` + // Estimated: `13458` + // Minimum execution time: 16_701_000 picoseconds. + Weight::from_parts(17_250_000, 0) + .saturating_add(Weight::from_parts(0, 13458)) + .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) } - /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:5 w:0) + /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:6 w:0) /// Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) fn already_notified_target() -> Weight { // Proof Size summary in bytes: // Measured: `106` - // Estimated: `13471` - // Minimum execution time: 16_946_000 picoseconds. - Weight::from_parts(17_192_000, 0) - .saturating_add(Weight::from_parts(0, 13471)) - .saturating_add(T::DbWeight::get().reads(5)) + // Estimated: `15946` + // Minimum execution time: 18_795_000 picoseconds. + Weight::from_parts(19_302_000, 0) + .saturating_add(Weight::from_parts(0, 15946)) + .saturating_add(T::DbWeight::get().reads(6)) } /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:2 w:1) /// Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) @@ -282,36 +314,36 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `106` // Estimated: `6046` - // Minimum execution time: 27_164_000 picoseconds. - Weight::from_parts(27_760_000, 0) + // Minimum execution time: 25_007_000 picoseconds. + Weight::from_parts(25_786_000, 0) .saturating_add(Weight::from_parts(0, 6046)) .saturating_add(T::DbWeight::get().reads(8)) .saturating_add(T::DbWeight::get().writes(3)) } - /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:3 w:0) + /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:4 w:0) /// Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) fn notify_target_migration_fail() -> Weight { // Proof Size summary in bytes: // Measured: `136` - // Estimated: `8551` - // Minimum execution time: 8_689_000 picoseconds. - Weight::from_parts(8_874_000, 0) - .saturating_add(Weight::from_parts(0, 8551)) - .saturating_add(T::DbWeight::get().reads(3)) + // Estimated: `11026` + // Minimum execution time: 11_534_000 picoseconds. + Weight::from_parts(11_798_000, 0) + .saturating_add(Weight::from_parts(0, 11026)) + .saturating_add(T::DbWeight::get().reads(4)) } - /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:4 w:2) + /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:5 w:2) /// Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) fn migrate_version_notify_targets() -> Weight { // Proof Size summary in bytes: - // Measured: `106` - // Estimated: `10996` - // Minimum execution time: 15_944_000 picoseconds. - Weight::from_parts(16_381_000, 0) - .saturating_add(Weight::from_parts(0, 10996)) - .saturating_add(T::DbWeight::get().reads(4)) + // Measured: `100` + // Estimated: `13465` + // Minimum execution time: 17_357_000 picoseconds. + Weight::from_parts(17_629_000, 0) + .saturating_add(Weight::from_parts(0, 13465)) + .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) } - /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:4 w:2) + /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:5 w:2) /// Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) /// Storage: `ParachainSystem::UpwardDeliveryFeeFactor` (r:1 w:0) /// Proof: `ParachainSystem::UpwardDeliveryFeeFactor` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) @@ -327,12 +359,12 @@ impl pallet_xcm::WeightInfo for WeightInfo { /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) fn migrate_and_notify_old_targets() -> Weight { // Proof Size summary in bytes: - // Measured: `112` - // Estimated: `11002` - // Minimum execution time: 33_826_000 picoseconds. - Weight::from_parts(34_784_000, 0) - .saturating_add(Weight::from_parts(0, 11002)) - .saturating_add(T::DbWeight::get().reads(10)) + // Measured: `106` + // Estimated: `13471` + // Minimum execution time: 33_487_000 picoseconds. + Weight::from_parts(34_033_000, 0) + .saturating_add(Weight::from_parts(0, 13471)) + .saturating_add(T::DbWeight::get().reads(11)) .saturating_add(T::DbWeight::get().writes(4)) } /// Storage: `PolkadotXcm::QueryCounter` (r:1 w:1) @@ -343,8 +375,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `32` // Estimated: `1517` - // Minimum execution time: 4_257_000 picoseconds. - Weight::from_parts(4_383_000, 0) + // Minimum execution time: 3_688_000 picoseconds. + Weight::from_parts(3_854_000, 0) .saturating_add(Weight::from_parts(0, 1517)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) @@ -355,10 +387,22 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `7669` // Estimated: `11134` - // Minimum execution time: 26_924_000 picoseconds. - Weight::from_parts(27_455_000, 0) + // Minimum execution time: 26_336_000 picoseconds. + Weight::from_parts(26_873_000, 0) .saturating_add(Weight::from_parts(0, 11134)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } + /// Storage: `PolkadotXcm::AssetTraps` (r:1 w:1) + /// Proof: `PolkadotXcm::AssetTraps` (`max_values`: None, `max_size`: None, mode: `Measured`) + fn claim_assets() -> Weight { + // Proof Size summary in bytes: + // Measured: `90` + // Estimated: `3555` + // Minimum execution time: 34_633_000 picoseconds. + Weight::from_parts(35_171_000, 0) + .saturating_add(Weight::from_parts(0, 3555)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } } diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/xcm_config.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/xcm_config.rs index d2f0f187a20dd60bcba1eedb626f870ab61302ff..4870b4a52d7afb1bc303467b370f3cdd50114590 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/xcm_config.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/xcm_config.rs @@ -22,12 +22,12 @@ use super::{ use crate::bridge_common_config::{DeliveryRewardInBalance, RequiredStakeForStakeAndSlash}; use frame_support::{ parameter_types, - traits::{ConstU32, Contains, Equals, Everything, Nothing}, + traits::{tokens::imbalance::ResolveTo, ConstU32, Contains, Equals, Everything, Nothing}, }; use frame_system::EnsureRoot; +use pallet_collator_selection::StakingPotAccountId; use pallet_xcm::XcmPassthrough; use parachains_common::{ - impls::ToStakingPot, xcm_config::{ AllSiblingSystemParachains, ConcreteAssetFromSystem, ParentRelayOrSiblingParachains, RelayOrOtherSystemParachains, @@ -38,16 +38,15 @@ use polkadot_parachain_primitives::primitives::Sibling; use polkadot_runtime_common::xcm_sender::ExponentialPrice; use sp_runtime::traits::AccountIdConversion; use xcm::latest::prelude::*; -#[allow(deprecated)] -use xcm_builder::CurrencyAdapter; use xcm_builder::{ AccountId32Aliases, AllowExplicitUnpaidExecutionFrom, AllowKnownQueryResponses, AllowSubscriptionsFrom, AllowTopLevelPaidExecutionFrom, DenyReserveTransferToRelayChain, - DenyThenTry, EnsureXcmOrigin, FrameTransactionalProcessor, IsConcrete, ParentAsSuperuser, - ParentIsPreset, RelayChainAsNative, SiblingParachainAsNative, SiblingParachainConvertsVia, - SignedAccountId32AsNative, SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit, - TrailingSetTopicAsId, UsingComponents, WeightInfoBounds, WithComputedOrigin, WithUniqueTopic, - XcmFeeManagerFromComponents, XcmFeeToAccount, + DenyThenTry, EnsureXcmOrigin, FrameTransactionalProcessor, FungibleAdapter, IsConcrete, + ParentAsSuperuser, ParentIsPreset, RelayChainAsNative, SiblingParachainAsNative, + SiblingParachainConvertsVia, SignedAccountId32AsNative, SignedToAccountId32, + SovereignSignedViaLocation, TakeWeightCredit, TrailingSetTopicAsId, UsingComponents, + WeightInfoBounds, WithComputedOrigin, WithUniqueTopic, XcmFeeManagerFromComponents, + XcmFeeToAccount, }; use xcm_executor::{traits::WithOriginFilter, XcmExecutor}; @@ -76,8 +75,7 @@ pub type LocationToAccountId = ( ); /// Means for transacting the native currency on this chain. -#[allow(deprecated)] -pub type CurrencyTransactor = CurrencyAdapter< +pub type FungibleTransactor = FungibleAdapter< // Use this currency: Balances, // Use this currency when it is a fungible asset matching the given location or name: @@ -233,7 +231,7 @@ pub struct XcmConfig; impl xcm_executor::Config for XcmConfig { type RuntimeCall = RuntimeCall; type XcmSender = XcmRouter; - type AssetTransactor = CurrencyTransactor; + type AssetTransactor = FungibleTransactor; type OriginConverter = XcmOriginToTransactDispatchOrigin; // BridgeHub does not recognize a reserve location for any asset. Users must teleport Native // token where allowed (e.g. with the Relay Chain). @@ -246,8 +244,13 @@ impl xcm_executor::Config for XcmConfig { RuntimeCall, MaxInstructions, >; - type Trader = - UsingComponents>; + type Trader = UsingComponents< + WeightToFee, + WestendLocation, + AccountId, + Balances, + ResolveTo, Balances>, + >; type ResponseHandler = PolkadotXcm; type AssetTrap = PolkadotXcm; type AssetLocker = (); @@ -266,6 +269,9 @@ impl xcm_executor::Config for XcmConfig { type SafeCallFilter = SafeCallFilter; type Aliasers = Nothing; type TransactionalProcessor = FrameTransactionalProcessor; + type HrmpNewChannelOpenRequestHandler = (); + type HrmpChannelAcceptedHandler = (); + type HrmpChannelClosingHandler = (); } pub type PriceForParentDelivery = @@ -289,9 +295,9 @@ impl pallet_xcm::Config for Runtime { type XcmRouter = XcmRouter; // We want to disallow users sending (arbitrary) XCMs from this chain. type SendXcmOrigin = EnsureXcmOrigin; - // We support local origins dispatching XCM executions in principle... + // We support local origins dispatching XCM executions. type ExecuteXcmOrigin = EnsureXcmOrigin; - type XcmExecuteFilter = Nothing; + type XcmExecuteFilter = Everything; type XcmExecutor = XcmExecutor; type XcmTeleportFilter = Everything; type XcmReserveTransferFilter = Nothing; // This parachain is not meant as a reserve location. diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/tests/tests.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/tests/tests.rs index 149a3bbeb75d82ba7c35641428c7677d18297f8c..988b10e1e2d8fac610c2feaec41d018012ec9fc3 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/tests/tests.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/tests/tests.rs @@ -78,15 +78,11 @@ fn construct_extrinsic( pallet_transaction_payment::ChargeTransactionPayment::::from(0), BridgeRejectObsoleteHeadersAndMessages::default(), (bridge_to_rococo_config::OnBridgeHubWestendRefundBridgeHubRococoMessages::default(),), + cumulus_primitives_storage_weight_reclaim::StorageWeightReclaim::new(), ); let payload = SignedPayload::new(call.clone(), extra.clone()).unwrap(); let signature = payload.using_encoded(|e| sender.sign(e)); - UncheckedExtrinsic::new_signed( - call, - account_id.into(), - Signature::Sr25519(signature.clone()), - extra, - ) + UncheckedExtrinsic::new_signed(call, account_id.into(), Signature::Sr25519(signature), extra) } fn construct_and_apply_extrinsic( diff --git a/cumulus/parachains/runtimes/bridge-hubs/common/Cargo.toml b/cumulus/parachains/runtimes/bridge-hubs/common/Cargo.toml index a4dcd19dc9e8675599eaad9c2d340eca5874e63b..2f5f783ce48fb19e1087e24e712fc4dc52b607da 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/common/Cargo.toml +++ b/cumulus/parachains/runtimes/bridge-hubs/common/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "bridge-hub-common" -version = "0.0.0" +version = "0.1.0" authors.workspace = true edition.workspace = true description = "Bridge hub common utilities" @@ -8,7 +8,7 @@ license = "Apache-2.0" [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } frame-support = { path = "../../../../../substrate/frame/support", default-features = false } sp-std = { path = "../../../../../substrate/primitives/std", default-features = false } sp-core = { path = "../../../../../substrate/primitives/core", default-features = false } diff --git a/cumulus/parachains/runtimes/bridge-hubs/test-utils/Cargo.toml b/cumulus/parachains/runtimes/bridge-hubs/test-utils/Cargo.toml index f2cf60354adc69e33f6cc19e86d2173f3e30c511..5f2a6e050d83c3db662f8ff4896d32dc8a28fde3 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/test-utils/Cargo.toml +++ b/cumulus/parachains/runtimes/bridge-hubs/test-utils/Cargo.toml @@ -12,7 +12,7 @@ workspace = true [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive", "max-encoded-len"] } impl-trait-for-tuples = "0.2" -log = { version = "0.4.20", default-features = false } +log = { workspace = true } # Substrate frame-support = { path = "../../../../../substrate/frame/support", default-features = false } @@ -25,6 +25,7 @@ sp-std = { path = "../../../../../substrate/primitives/std", default-features = sp-tracing = { path = "../../../../../substrate/primitives/tracing" } pallet-balances = { path = "../../../../../substrate/frame/balances", default-features = false } pallet-utility = { path = "../../../../../substrate/frame/utility", default-features = false } +pallet-timestamp = { path = "../../../../../substrate/frame/timestamp", default-features = false } # Cumulus asset-test-utils = { path = "../../assets/test-utils" } @@ -73,6 +74,7 @@ std = [ "pallet-bridge-messages/std", "pallet-bridge-parachains/std", "pallet-bridge-relayers/std", + "pallet-timestamp/std", "pallet-utility/std", "parachains-common/std", "parachains-runtimes-test-utils/std", diff --git a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/helpers.rs b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/helpers.rs index 4f634c184aa84faa6466102ef5fee30f254bad43..2b48f2e3d515f625532d9c5f50fabadb9a89517a 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/helpers.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/helpers.rs @@ -197,7 +197,9 @@ where pub(crate) fn initialize_bridge_grandpa_pallet( init_data: bp_header_chain::InitializationData>, ) where - Runtime: BridgeGrandpaConfig, + Runtime: BridgeGrandpaConfig + + cumulus_pallet_parachain_system::Config + + pallet_timestamp::Config, { pallet_bridge_grandpa::Pallet::::initialize( RuntimeHelper::::root_origin(), diff --git a/cumulus/parachains/runtimes/collectives/collectives-westend/Cargo.toml b/cumulus/parachains/runtimes/collectives/collectives-westend/Cargo.toml index c16cee4fedd82dad622d2c6ec4eaafe7d2434bb4..22821170a54c9ef0faf6fb3756b6d62234bf654a 100644 --- a/cumulus/parachains/runtimes/collectives/collectives-westend/Cargo.toml +++ b/cumulus/parachains/runtimes/collectives/collectives-westend/Cargo.toml @@ -12,8 +12,8 @@ workspace = true [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive", "max-encoded-len"] } hex-literal = { version = "0.4.1" } -log = { version = "0.4.20", default-features = false } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +log = { workspace = true } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } # Substrate frame-benchmarking = { path = "../../../../../substrate/frame/benchmarking", default-features = false, optional = true } @@ -77,6 +77,8 @@ cumulus-pallet-xcmp-queue = { path = "../../../../pallets/xcmp-queue", default-f cumulus-primitives-aura = { path = "../../../../primitives/aura", default-features = false } cumulus-primitives-core = { path = "../../../../primitives/core", default-features = false } cumulus-primitives-utility = { path = "../../../../primitives/utility", default-features = false } +cumulus-primitives-storage-weight-reclaim = { path = "../../../../primitives/storage-weight-reclaim", default-features = false } + pallet-collator-selection = { path = "../../../../pallets/collator-selection", default-features = false } pallet-collective-content = { path = "../../../pallets/collective-content", default-features = false } parachain-info = { package = "staging-parachain-info", path = "../../../pallets/parachain-info", default-features = false } @@ -172,6 +174,7 @@ std = [ "cumulus-pallet-xcmp-queue/std", "cumulus-primitives-aura/std", "cumulus-primitives-core/std", + "cumulus-primitives-storage-weight-reclaim/std", "cumulus-primitives-utility/std", "frame-benchmarking?/std", "frame-executive/std", @@ -232,8 +235,6 @@ std = [ "xcm/std", ] -experimental = ["pallet-aura/experimental"] - # A feature that should be enabled when the runtime should be built for on-chain # deployment. This will disable stuff that shouldn't be part of the on-chain wasm # to make it smaller, like logging for example. diff --git a/cumulus/parachains/runtimes/collectives/collectives-westend/src/ambassador/mod.rs b/cumulus/parachains/runtimes/collectives/collectives-westend/src/ambassador/mod.rs index d9042f2a5568d402146196c7fb5a745f7213cb6b..0c9f428c1396bede97a67002d0554d98d62dbc39 100644 --- a/cumulus/parachains/runtimes/collectives/collectives-westend/src/ambassador/mod.rs +++ b/cumulus/parachains/runtimes/collectives/collectives-westend/src/ambassador/mod.rs @@ -40,7 +40,7 @@ use origins::pallet_origins::{ EnsureAmbassadorsVoice, EnsureAmbassadorsVoiceFrom, EnsureHeadAmbassadorsVoice, Origin, }; use sp_core::ConstU128; -use sp_runtime::traits::{CheckedReduceBy, ConstU16, ConvertToValue, Replace}; +use sp_runtime::traits::{CheckedReduceBy, ConstU16, ConvertToValue, Replace, ReplaceWithDefault}; use xcm::prelude::*; use xcm_builder::{AliasesIntoAccountId32, PayOverXcm}; @@ -108,8 +108,10 @@ pub type ExchangeOrigin = EitherOf for Runtime { type WeightInfo = weights::pallet_ranked_collective_ambassador_collective::WeightInfo; type RuntimeEvent = RuntimeEvent; + type AddOrigin = MapSuccess>; type PromoteOrigin = PromoteOrigin; type DemoteOrigin = DemoteOrigin; + type RemoveOrigin = Self::DemoteOrigin; type ExchangeOrigin = ExchangeOrigin; type Polls = AmbassadorReferenda; type MinRankOfClass = sp_runtime::traits::Identity; diff --git a/cumulus/parachains/runtimes/collectives/collectives-westend/src/fellowship/mod.rs b/cumulus/parachains/runtimes/collectives/collectives-westend/src/fellowship/mod.rs index 6632d511f7c3cf42aab7e4e98085b6cddf15b717..3816d2ed848ed51740283ffea31e9f7e53c01f1a 100644 --- a/cumulus/parachains/runtimes/collectives/collectives-westend/src/fellowship/mod.rs +++ b/cumulus/parachains/runtimes/collectives/collectives-westend/src/fellowship/mod.rs @@ -113,12 +113,17 @@ impl pallet_ranked_collective::Config for Runtime type WeightInfo = weights::pallet_ranked_collective_fellowship_collective::WeightInfo; type RuntimeEvent = RuntimeEvent; - #[cfg(not(feature = "runtime-benchmarks"))] // Promotions and the induction of new members are serviced by `FellowshipCore` pallet instance. - type PromoteOrigin = frame_system::EnsureNever; + #[cfg(not(feature = "runtime-benchmarks"))] + type AddOrigin = frame_system::EnsureNever<()>; #[cfg(feature = "runtime-benchmarks")] + type AddOrigin = frame_system::EnsureRoot; + // The maximum value of `u16` set as a success value for the root to ensure the benchmarks will // pass. + #[cfg(not(feature = "runtime-benchmarks"))] + type PromoteOrigin = frame_system::EnsureNever; + #[cfg(feature = "runtime-benchmarks")] type PromoteOrigin = EnsureRootWithSuccess>; // Demotion is by any of: @@ -127,6 +132,7 @@ impl pallet_ranked_collective::Config for Runtime // // The maximum value of `u16` set as a success value for the root to ensure the benchmarks will // pass. + type RemoveOrigin = Self::DemoteOrigin; type DemoteOrigin = EitherOf< EnsureRootWithSuccess>, MapSuccess< diff --git a/cumulus/parachains/runtimes/collectives/collectives-westend/src/impls.rs b/cumulus/parachains/runtimes/collectives/collectives-westend/src/impls.rs index caf0cddec664a55ce080ed6052a9cdf42a5e2f28..e5b176fc77873805fb0e4ed6dba74d720ea3479a 100644 --- a/cumulus/parachains/runtimes/collectives/collectives-westend/src/impls.rs +++ b/cumulus/parachains/runtimes/collectives/collectives-westend/src/impls.rs @@ -81,7 +81,7 @@ where } fn proposal_of(proposal_hash: HashOf) -> Option> { - pallet_collective::Pallet::::proposal_of(proposal_hash) + pallet_collective::ProposalOf::::get(proposal_hash) } } diff --git a/cumulus/parachains/runtimes/collectives/collectives-westend/src/lib.rs b/cumulus/parachains/runtimes/collectives/collectives-westend/src/lib.rs index cde1b39a2053033c81ec06f46d67aedb42e31d91..be9f035c5eb4f579fc702362f25345fb3ada7216 100644 --- a/cumulus/parachains/runtimes/collectives/collectives-westend/src/lib.rs +++ b/cumulus/parachains/runtimes/collectives/collectives-westend/src/lib.rs @@ -66,7 +66,7 @@ use cumulus_primitives_core::{AggregateMessageOrigin, ParaId}; use frame_support::{ construct_runtime, derive_impl, dispatch::DispatchClass, - genesis_builder_helper::{build_config, create_default_config}, + genesis_builder_helper::{build_state, get_preset}, parameter_types, traits::{ fungible::HoldConsideration, ConstBool, ConstU16, ConstU32, ConstU64, ConstU8, @@ -117,7 +117,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("collectives-westend"), impl_name: create_runtime_str!("collectives-westend"), authoring_version: 1, - spec_version: 1_006_000, + spec_version: 1_010_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 5, @@ -161,7 +161,7 @@ parameter_types! { } // Configure FRAME pallets to include in runtime. -#[derive_impl(frame_system::config_preludes::ParaChainDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::ParaChainDefaultConfig)] impl frame_system::Config for Runtime { type BlockWeights = RuntimeBlockWeights; type BlockLength = RuntimeBlockLength; @@ -184,10 +184,7 @@ impl pallet_timestamp::Config for Runtime { /// A timestamp: milliseconds since the unix epoch. type Moment = u64; type OnTimestampSet = Aura; - #[cfg(feature = "experimental")] type MinimumPeriod = ConstU64<0>; - #[cfg(not(feature = "experimental"))] - type MinimumPeriod = ConstU64<{ SLOT_DURATION / 2 }>; type WeightInfo = weights::pallet_timestamp::WeightInfo; } @@ -226,7 +223,7 @@ parameter_types! { impl pallet_transaction_payment::Config for Runtime { type RuntimeEvent = RuntimeEvent; type OnChargeTransaction = - pallet_transaction_payment::CurrencyAdapter>; + pallet_transaction_payment::FungibleAdapter>; type WeightToFee = WeightToFee; type LengthToFee = ConstantMultiplier; type FeeMultiplierUpdate = SlowAdjustingFeeUpdate; @@ -426,6 +423,7 @@ impl pallet_message_queue::Config for Runtime { type HeapSize = sp_core::ConstU32<{ 64 * 1024 }>; type MaxStale = sp_core::ConstU32<8>; type ServiceWeight = MessageQueueServiceWeight; + type IdleMaxServiceWeight = MessageQueueServiceWeight; } impl cumulus_pallet_aura_ext::Config for Runtime {} @@ -483,7 +481,6 @@ impl pallet_aura::Config for Runtime { type DisabledValidators = (); type MaxAuthorities = ConstU32<100_000>; type AllowMultipleBlocksPerSlot = ConstBool; - #[cfg(feature = "experimental")] type SlotDuration = ConstU64; } @@ -716,6 +713,7 @@ pub type SignedExtra = ( frame_system::CheckEra, frame_system::CheckNonce, frame_system::CheckWeight, + cumulus_primitives_storage_weight_reclaim::StorageWeightReclaim, ); /// Unchecked extrinsic type as expected by this runtime. pub type UncheckedExtrinsic = @@ -727,6 +725,8 @@ type Migrations = ( pallet_collator_selection::migration::v1::MigrateToV1, // unreleased cumulus_pallet_xcmp_queue::migration::v4::MigrationToV4, + // permanent + pallet_xcm::migration::MigrateToLatestXcmVersion, ); /// Executive: handles dispatch to the various modules. @@ -779,7 +779,7 @@ impl_runtime_apis! { } fn authorities() -> Vec { - Aura::authorities().into_inner() + pallet_aura::Authorities::::get().into_inner() } } @@ -801,7 +801,7 @@ impl_runtime_apis! { Executive::execute_block(block) } - fn initialize_block(header: &::Header) { + fn initialize_block(header: &::Header) -> sp_runtime::ExtrinsicInclusionMode { Executive::initialize_block(header) } } @@ -983,8 +983,21 @@ impl_runtime_apis! { use cumulus_pallet_session_benchmarking::Pallet as SessionBench; impl cumulus_pallet_session_benchmarking::Config for Runtime {} + parameter_types! { + pub ExistentialDepositAsset: Option = Some(( + xcm_config::WndLocation::get(), + ExistentialDeposit::get() + ).into()); + } + use pallet_xcm::benchmarking::Pallet as PalletXcmExtrinsicsBenchmark; impl pallet_xcm::benchmarking::Config for Runtime { + type DeliveryHelper = cumulus_primitives_utility::ToParentDeliveryHelper< + xcm_config::XcmConfig, + ExistentialDepositAsset, + xcm_config::PriceForParentDelivery, + >; + fn reachable_dest() -> Option { Some(Parent.into()) } @@ -993,7 +1006,7 @@ impl_runtime_apis! { // Relay/native token can be teleported between Collectives and Relay. Some(( Asset { - fun: Fungible(EXISTENTIAL_DEPOSIT), + fun: Fungible(ExistentialDeposit::get()), id: AssetId(Parent.into()) }.into(), Parent.into(), @@ -1016,6 +1029,13 @@ impl_runtime_apis! { dest ) } + + fn get_asset() -> Asset { + Asset { + id: AssetId(Location::parent()), + fun: Fungible(ExistentialDeposit::get()), + } + } } let whitelist: Vec = vec![ @@ -1041,12 +1061,16 @@ impl_runtime_apis! { } impl sp_genesis_builder::GenesisBuilder for Runtime { - fn create_default_config() -> Vec { - create_default_config::() + fn build_state(config: Vec) -> sp_genesis_builder::Result { + build_state::(config) + } + + fn get_preset(id: &Option) -> Option> { + get_preset::(id, |_| None) } - fn build_config(config: Vec) -> sp_genesis_builder::Result { - build_config::(config) + fn preset_names() -> Vec { + vec![] } } } diff --git a/cumulus/parachains/runtimes/collectives/collectives-westend/src/weights/pallet_scheduler.rs b/cumulus/parachains/runtimes/collectives/collectives-westend/src/weights/pallet_scheduler.rs index cf5610df66574a38a388b7e36a56f87e41ff59c2..42e37b967e4c88acccd13c8cb71bd22b1bc2d3dd 100644 --- a/cumulus/parachains/runtimes/collectives/collectives-westend/src/weights/pallet_scheduler.rs +++ b/cumulus/parachains/runtimes/collectives/collectives-westend/src/weights/pallet_scheduler.rs @@ -1,42 +1,41 @@ // Copyright (C) Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 +// This file is part of Cumulus. -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// Cumulus is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Cumulus is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Cumulus. If not, see . //! Autogenerated weights for `pallet_scheduler` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2024-01-25, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("collectives-polkadot-dev")`, DB CACHE: 1024 +//! HOSTNAME: `runner-grjcggob-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("collectives-westend-dev")`, DB CACHE: 1024 // Executed Command: -// ./target/production/polkadot-parachain +// target/production/polkadot-parachain // benchmark // pallet -// --chain=collectives-polkadot-dev -// --wasm-execution=compiled -// --pallet=pallet_scheduler -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* // --steps=50 // --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/collectives/collectives-polkadot/src/weights/ +// --extrinsic=* +// --wasm-execution=compiled +// --heap-pages=4096 +// --json-file=/builds/parity/mirrors/polkadot-sdk/.git/.artifacts/bench.json +// --pallet=pallet_scheduler +// --chain=collectives-westend-dev +// --header=./cumulus/file_header.txt +// --output=./cumulus/parachains/runtimes/collectives/collectives-westend/src/weights/ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -55,8 +54,8 @@ impl pallet_scheduler::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `31` // Estimated: `1489` - // Minimum execution time: 3_441_000 picoseconds. - Weight::from_parts(3_604_000, 0) + // Minimum execution time: 2_475_000 picoseconds. + Weight::from_parts(2_644_000, 0) .saturating_add(Weight::from_parts(0, 1489)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -68,11 +67,11 @@ impl pallet_scheduler::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `77 + s * (177 ±0)` // Estimated: `159279` - // Minimum execution time: 2_879_000 picoseconds. - Weight::from_parts(2_963_000, 0) + // Minimum execution time: 2_898_000 picoseconds. + Weight::from_parts(1_532_342, 0) .saturating_add(Weight::from_parts(0, 159279)) - // Standard Error: 3_764 - .saturating_add(Weight::from_parts(909_557, 0).saturating_mul(s.into())) + // Standard Error: 4_736 + .saturating_add(Weight::from_parts(412_374, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -80,25 +79,27 @@ impl pallet_scheduler::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 5_172_000 picoseconds. - Weight::from_parts(5_294_000, 0) + // Minimum execution time: 3_171_000 picoseconds. + Weight::from_parts(3_349_000, 0) .saturating_add(Weight::from_parts(0, 0)) } /// Storage: `Preimage::PreimageFor` (r:1 w:1) /// Proof: `Preimage::PreimageFor` (`max_values`: None, `max_size`: Some(4194344), added: 4196819, mode: `Measured`) - /// Storage: `Preimage::StatusFor` (r:1 w:1) + /// Storage: `Preimage::StatusFor` (r:1 w:0) /// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) + /// Storage: `Preimage::RequestStatusFor` (r:1 w:1) + /// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) /// The range of component `s` is `[128, 4194304]`. fn service_task_fetched(s: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `213 + s * (1 ±0)` - // Estimated: `3678 + s * (1 ±0)` - // Minimum execution time: 19_704_000 picoseconds. - Weight::from_parts(19_903_000, 0) - .saturating_add(Weight::from_parts(0, 3678)) - // Standard Error: 5 - .saturating_add(Weight::from_parts(1_394, 0).saturating_mul(s.into())) - .saturating_add(T::DbWeight::get().reads(2)) + // Measured: `246 + s * (1 ±0)` + // Estimated: `3711 + s * (1 ±0)` + // Minimum execution time: 17_329_000 picoseconds. + Weight::from_parts(17_604_000, 0) + .saturating_add(Weight::from_parts(0, 3711)) + // Standard Error: 1 + .saturating_add(Weight::from_parts(1_256, 0).saturating_mul(s.into())) + .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(2)) .saturating_add(Weight::from_parts(0, 1).saturating_mul(s.into())) } @@ -108,8 +109,8 @@ impl pallet_scheduler::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 6_359_000 picoseconds. - Weight::from_parts(6_599_000, 0) + // Minimum execution time: 4_503_000 picoseconds. + Weight::from_parts(4_677_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -117,24 +118,24 @@ impl pallet_scheduler::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 5_217_000 picoseconds. - Weight::from_parts(5_333_000, 0) + // Minimum execution time: 3_145_000 picoseconds. + Weight::from_parts(3_252_000, 0) .saturating_add(Weight::from_parts(0, 0)) } fn execute_dispatch_signed() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_406_000 picoseconds. - Weight::from_parts(2_541_000, 0) + // Minimum execution time: 1_804_000 picoseconds. + Weight::from_parts(1_891_000, 0) .saturating_add(Weight::from_parts(0, 0)) } fn execute_dispatch_unsigned() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_370_000 picoseconds. - Weight::from_parts(2_561_000, 0) + // Minimum execution time: 1_706_000 picoseconds. + Weight::from_parts(1_776_000, 0) .saturating_add(Weight::from_parts(0, 0)) } /// Storage: `Scheduler::Agenda` (r:1 w:1) @@ -144,11 +145,11 @@ impl pallet_scheduler::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `77 + s * (177 ±0)` // Estimated: `159279` - // Minimum execution time: 11_784_000 picoseconds. - Weight::from_parts(5_574_404, 0) + // Minimum execution time: 8_629_000 picoseconds. + Weight::from_parts(6_707_232, 0) .saturating_add(Weight::from_parts(0, 159279)) - // Standard Error: 7_217 - .saturating_add(Weight::from_parts(1_035_248, 0).saturating_mul(s.into())) + // Standard Error: 5_580 + .saturating_add(Weight::from_parts(471_827, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -161,11 +162,11 @@ impl pallet_scheduler::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `77 + s * (177 ±0)` // Estimated: `159279` - // Minimum execution time: 16_373_000 picoseconds. - Weight::from_parts(3_088_135, 0) + // Minimum execution time: 12_675_000 picoseconds. + Weight::from_parts(7_791_682, 0) .saturating_add(Weight::from_parts(0, 159279)) - // Standard Error: 7_095 - .saturating_add(Weight::from_parts(1_745_270, 0).saturating_mul(s.into())) + // Standard Error: 5_381 + .saturating_add(Weight::from_parts(653_023, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -178,11 +179,11 @@ impl pallet_scheduler::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `468 + s * (179 ±0)` // Estimated: `159279` - // Minimum execution time: 14_822_000 picoseconds. - Weight::from_parts(9_591_402, 0) + // Minimum execution time: 11_908_000 picoseconds. + Weight::from_parts(11_833_059, 0) .saturating_add(Weight::from_parts(0, 159279)) - // Standard Error: 7_151 - .saturating_add(Weight::from_parts(1_058_408, 0).saturating_mul(s.into())) + // Standard Error: 5_662 + .saturating_add(Weight::from_parts(482_816, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -195,12 +196,91 @@ impl pallet_scheduler::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `509 + s * (179 ±0)` // Estimated: `159279` - // Minimum execution time: 18_541_000 picoseconds. - Weight::from_parts(6_522_239, 0) + // Minimum execution time: 15_506_000 picoseconds. + Weight::from_parts(11_372_975, 0) .saturating_add(Weight::from_parts(0, 159279)) - // Standard Error: 8_349 - .saturating_add(Weight::from_parts(1_760_431, 0).saturating_mul(s.into())) + // Standard Error: 5_765 + .saturating_add(Weight::from_parts(656_322, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } + /// Storage: `Scheduler::Retries` (r:1 w:2) + /// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Agenda` (r:1 w:1) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(155814), added: 158289, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Lookup` (r:0 w:1) + /// Proof: `Scheduler::Lookup` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) + /// The range of component `s` is `[1, 200]`. + fn schedule_retry(s: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `159` + // Estimated: `159279` + // Minimum execution time: 14_069_000 picoseconds. + Weight::from_parts(14_868_345, 0) + .saturating_add(Weight::from_parts(0, 159279)) + // Standard Error: 425 + .saturating_add(Weight::from_parts(33_468, 0).saturating_mul(s.into())) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(4)) + } + /// Storage: `Scheduler::Agenda` (r:1 w:0) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(155814), added: 158289, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Retries` (r:0 w:1) + /// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`) + fn set_retry() -> Weight { + // Proof Size summary in bytes: + // Measured: `77 + s * (177 ±0)` + // Estimated: `159279` + // Minimum execution time: 7_550_000 picoseconds. + Weight::from_parts(6_735_955, 0) + .saturating_add(Weight::from_parts(0, 159279)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `Scheduler::Lookup` (r:1 w:0) + /// Proof: `Scheduler::Lookup` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Agenda` (r:1 w:0) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(155814), added: 158289, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Retries` (r:0 w:1) + /// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`) + fn set_retry_named() -> Weight { + // Proof Size summary in bytes: + // Measured: `513 + s * (179 ±0)` + // Estimated: `159279` + // Minimum execution time: 11_017_000 picoseconds. + Weight::from_parts(11_749_385, 0) + .saturating_add(Weight::from_parts(0, 159279)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `Scheduler::Agenda` (r:1 w:0) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(155814), added: 158289, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Retries` (r:0 w:1) + /// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`) + fn cancel_retry() -> Weight { + // Proof Size summary in bytes: + // Measured: `77 + s * (177 ±0)` + // Estimated: `159279` + // Minimum execution time: 7_550_000 picoseconds. + Weight::from_parts(6_735_955, 0) + .saturating_add(Weight::from_parts(0, 159279)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `Scheduler::Lookup` (r:1 w:0) + /// Proof: `Scheduler::Lookup` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Agenda` (r:1 w:0) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(155814), added: 158289, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Retries` (r:0 w:1) + /// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`) + fn cancel_retry_named() -> Weight { + // Proof Size summary in bytes: + // Measured: `513 + s * (179 ±0)` + // Estimated: `159279` + // Minimum execution time: 11_017_000 picoseconds. + Weight::from_parts(11_749_385, 0) + .saturating_add(Weight::from_parts(0, 159279)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(1)) + } } diff --git a/cumulus/parachains/runtimes/collectives/collectives-westend/src/weights/pallet_xcm.rs b/cumulus/parachains/runtimes/collectives/collectives-westend/src/weights/pallet_xcm.rs index 50dfbffde01f21d1138f0fdaa27649f962e245e4..0edd5dfff2b8b714c6de0a34dcd095787673d39b 100644 --- a/cumulus/parachains/runtimes/collectives/collectives-westend/src/weights/pallet_xcm.rs +++ b/cumulus/parachains/runtimes/collectives/collectives-westend/src/weights/pallet_xcm.rs @@ -16,10 +16,10 @@ //! Autogenerated weights for `pallet_xcm` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-12-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-03-21, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-r43aesjn-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! HOSTNAME: `runner-h2rr8wx7-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("collectives-westend-dev")`, DB CACHE: 1024 // Executed Command: @@ -64,8 +64,30 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `145` // Estimated: `3610` - // Minimum execution time: 24_540_000 picoseconds. - Weight::from_parts(25_439_000, 0) + // Minimum execution time: 21_911_000 picoseconds. + Weight::from_parts(22_431_000, 0) + .saturating_add(Weight::from_parts(0, 3610)) + .saturating_add(T::DbWeight::get().reads(6)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: `ParachainSystem::UpwardDeliveryFeeFactor` (r:1 w:0) + /// Proof: `ParachainSystem::UpwardDeliveryFeeFactor` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) + /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) + /// Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) + /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) + /// Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) + /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + fn send_blob() -> Weight { + // Proof Size summary in bytes: + // Measured: `145` + // Estimated: `3610` + // Minimum execution time: 22_143_000 picoseconds. + Weight::from_parts(22_843_000, 0) .saturating_add(Weight::from_parts(0, 3610)) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) @@ -90,8 +112,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `214` // Estimated: `3679` - // Minimum execution time: 86_614_000 picoseconds. - Weight::from_parts(88_884_000, 0) + // Minimum execution time: 96_273_000 picoseconds. + Weight::from_parts(98_351_000, 0) .saturating_add(Weight::from_parts(0, 3679)) .saturating_add(T::DbWeight::get().reads(8)) .saturating_add(T::DbWeight::get().writes(3)) @@ -126,8 +148,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `214` // Estimated: `3679` - // Minimum execution time: 87_915_000 picoseconds. - Weight::from_parts(90_219_000, 0) + // Minimum execution time: 95_571_000 picoseconds. + Weight::from_parts(96_251_000, 0) .saturating_add(Weight::from_parts(0, 3679)) .saturating_add(T::DbWeight::get().reads(8)) .saturating_add(T::DbWeight::get().writes(3)) @@ -142,14 +164,24 @@ impl pallet_xcm::WeightInfo for WeightInfo { Weight::from_parts(18_446_744_073_709_551_000, 0) .saturating_add(Weight::from_parts(0, 0)) } + /// Storage: `Benchmark::Override` (r:0 w:0) + /// Proof: `Benchmark::Override` (`max_values`: None, `max_size`: None, mode: `Measured`) + fn execute_blob() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 18_446_744_073_709_551_000 picoseconds. + Weight::from_parts(18_446_744_073_709_551_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + } /// Storage: `PolkadotXcm::SupportedVersion` (r:0 w:1) /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) fn force_xcm_version() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 6_872_000 picoseconds. - Weight::from_parts(7_110_000, 0) + // Minimum execution time: 6_227_000 picoseconds. + Weight::from_parts(6_419_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -159,8 +191,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_009_000 picoseconds. - Weight::from_parts(2_163_000, 0) + // Minimum execution time: 1_851_000 picoseconds. + Weight::from_parts(1_940_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -186,8 +218,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `145` // Estimated: `3610` - // Minimum execution time: 28_858_000 picoseconds. - Weight::from_parts(29_355_000, 0) + // Minimum execution time: 27_449_000 picoseconds. + Weight::from_parts(28_513_000, 0) .saturating_add(Weight::from_parts(0, 3610)) .saturating_add(T::DbWeight::get().reads(8)) .saturating_add(T::DbWeight::get().writes(5)) @@ -212,8 +244,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `363` // Estimated: `3828` - // Minimum execution time: 30_598_000 picoseconds. - Weight::from_parts(31_168_000, 0) + // Minimum execution time: 29_477_000 picoseconds. + Weight::from_parts(30_251_000, 0) .saturating_add(Weight::from_parts(0, 3828)) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(4)) @@ -224,45 +256,45 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_090_000 picoseconds. - Weight::from_parts(2_253_000, 0) + // Minimum execution time: 1_894_000 picoseconds. + Weight::from_parts(2_009_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } - /// Storage: `PolkadotXcm::SupportedVersion` (r:4 w:2) + /// Storage: `PolkadotXcm::SupportedVersion` (r:5 w:2) /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) fn migrate_supported_version() -> Weight { // Proof Size summary in bytes: - // Measured: `162` - // Estimated: `11052` - // Minimum execution time: 16_133_000 picoseconds. - Weight::from_parts(16_433_000, 0) - .saturating_add(Weight::from_parts(0, 11052)) - .saturating_add(T::DbWeight::get().reads(4)) + // Measured: `159` + // Estimated: `13524` + // Minimum execution time: 17_991_000 picoseconds. + Weight::from_parts(18_651_000, 0) + .saturating_add(Weight::from_parts(0, 13524)) + .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) } - /// Storage: `PolkadotXcm::VersionNotifiers` (r:4 w:2) + /// Storage: `PolkadotXcm::VersionNotifiers` (r:5 w:2) /// Proof: `PolkadotXcm::VersionNotifiers` (`max_values`: None, `max_size`: None, mode: `Measured`) fn migrate_version_notifiers() -> Weight { // Proof Size summary in bytes: - // Measured: `166` - // Estimated: `11056` - // Minimum execution time: 16_012_000 picoseconds. - Weight::from_parts(16_449_000, 0) - .saturating_add(Weight::from_parts(0, 11056)) - .saturating_add(T::DbWeight::get().reads(4)) + // Measured: `163` + // Estimated: `13528` + // Minimum execution time: 18_321_000 picoseconds. + Weight::from_parts(18_701_000, 0) + .saturating_add(Weight::from_parts(0, 13528)) + .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) } - /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:5 w:0) + /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:6 w:0) /// Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) fn already_notified_target() -> Weight { // Proof Size summary in bytes: // Measured: `173` - // Estimated: `13538` - // Minimum execution time: 17_922_000 picoseconds. - Weight::from_parts(18_426_000, 0) - .saturating_add(Weight::from_parts(0, 13538)) - .saturating_add(T::DbWeight::get().reads(5)) + // Estimated: `16013` + // Minimum execution time: 19_762_000 picoseconds. + Weight::from_parts(20_529_000, 0) + .saturating_add(Weight::from_parts(0, 16013)) + .saturating_add(T::DbWeight::get().reads(6)) } /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:2 w:1) /// Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) @@ -282,36 +314,36 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `212` // Estimated: `6152` - // Minimum execution time: 27_280_000 picoseconds. - Weight::from_parts(28_026_000, 0) + // Minimum execution time: 26_927_000 picoseconds. + Weight::from_parts(27_629_000, 0) .saturating_add(Weight::from_parts(0, 6152)) .saturating_add(T::DbWeight::get().reads(8)) .saturating_add(T::DbWeight::get().writes(3)) } - /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:3 w:0) + /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:4 w:0) /// Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) fn notify_target_migration_fail() -> Weight { // Proof Size summary in bytes: // Measured: `206` - // Estimated: `8621` - // Minimum execution time: 9_387_000 picoseconds. - Weight::from_parts(9_644_000, 0) - .saturating_add(Weight::from_parts(0, 8621)) - .saturating_add(T::DbWeight::get().reads(3)) + // Estimated: `11096` + // Minimum execution time: 11_957_000 picoseconds. + Weight::from_parts(12_119_000, 0) + .saturating_add(Weight::from_parts(0, 11096)) + .saturating_add(T::DbWeight::get().reads(4)) } - /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:4 w:2) + /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:5 w:2) /// Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) fn migrate_version_notify_targets() -> Weight { // Proof Size summary in bytes: - // Measured: `173` - // Estimated: `11063` - // Minimum execution time: 16_649_000 picoseconds. - Weight::from_parts(17_025_000, 0) - .saturating_add(Weight::from_parts(0, 11063)) - .saturating_add(T::DbWeight::get().reads(4)) + // Measured: `170` + // Estimated: `13535` + // Minimum execution time: 17_942_000 picoseconds. + Weight::from_parts(18_878_000, 0) + .saturating_add(Weight::from_parts(0, 13535)) + .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) } - /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:4 w:2) + /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:5 w:2) /// Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) /// Storage: `ParachainSystem::UpwardDeliveryFeeFactor` (r:1 w:0) /// Proof: `ParachainSystem::UpwardDeliveryFeeFactor` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) @@ -327,12 +359,12 @@ impl pallet_xcm::WeightInfo for WeightInfo { /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) fn migrate_and_notify_old_targets() -> Weight { // Proof Size summary in bytes: - // Measured: `215` - // Estimated: `11105` - // Minimum execution time: 34_355_000 picoseconds. - Weight::from_parts(35_295_000, 0) - .saturating_add(Weight::from_parts(0, 11105)) - .saturating_add(T::DbWeight::get().reads(10)) + // Measured: `212` + // Estimated: `13577` + // Minimum execution time: 35_640_000 picoseconds. + Weight::from_parts(36_340_000, 0) + .saturating_add(Weight::from_parts(0, 13577)) + .saturating_add(T::DbWeight::get().reads(11)) .saturating_add(T::DbWeight::get().writes(4)) } /// Storage: `PolkadotXcm::QueryCounter` (r:1 w:1) @@ -343,8 +375,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `103` // Estimated: `1588` - // Minimum execution time: 4_527_000 picoseconds. - Weight::from_parts(4_699_000, 0) + // Minimum execution time: 4_044_000 picoseconds. + Weight::from_parts(4_229_000, 0) .saturating_add(Weight::from_parts(0, 1588)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) @@ -355,10 +387,22 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `7740` // Estimated: `11205` - // Minimum execution time: 27_011_000 picoseconds. - Weight::from_parts(27_398_000, 0) + // Minimum execution time: 26_262_000 picoseconds. + Weight::from_parts(26_842_000, 0) .saturating_add(Weight::from_parts(0, 11205)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } + /// Storage: `PolkadotXcm::AssetTraps` (r:1 w:1) + /// Proof: `PolkadotXcm::AssetTraps` (`max_values`: None, `max_size`: None, mode: `Measured`) + fn claim_assets() -> Weight { + // Proof Size summary in bytes: + // Measured: `160` + // Estimated: `3625` + // Minimum execution time: 36_775_000 picoseconds. + Weight::from_parts(37_265_000, 0) + .saturating_add(Weight::from_parts(0, 3625)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } } diff --git a/cumulus/parachains/runtimes/collectives/collectives-westend/src/xcm_config.rs b/cumulus/parachains/runtimes/collectives/collectives-westend/src/xcm_config.rs index ad19521898dd317b3d2df789a7553d062a1acffc..21ccd3b9cdb0b0474eb2023cc2509dbee66b1861 100644 --- a/cumulus/parachains/runtimes/collectives/collectives-westend/src/xcm_config.rs +++ b/cumulus/parachains/runtimes/collectives/collectives-westend/src/xcm_config.rs @@ -20,29 +20,25 @@ use super::{ }; use frame_support::{ parameter_types, - traits::{ConstU32, Contains, Equals, Everything, Nothing}, + traits::{tokens::imbalance::ResolveTo, ConstU32, Contains, Equals, Everything, Nothing}, weights::Weight, }; use frame_system::EnsureRoot; +use pallet_collator_selection::StakingPotAccountId; use pallet_xcm::XcmPassthrough; -use parachains_common::{ - impls::ToStakingPot, - xcm_config::{ - AllSiblingSystemParachains, ConcreteAssetFromSystem, ParentRelayOrSiblingParachains, - RelayOrOtherSystemParachains, - }, +use parachains_common::xcm_config::{ + AllSiblingSystemParachains, ConcreteAssetFromSystem, ParentRelayOrSiblingParachains, + RelayOrOtherSystemParachains, }; use polkadot_parachain_primitives::primitives::Sibling; use polkadot_runtime_common::xcm_sender::ExponentialPrice; use westend_runtime_constants::xcm as xcm_constants; use xcm::latest::prelude::*; -#[allow(deprecated)] -use xcm_builder::CurrencyAdapter; use xcm_builder::{ AccountId32Aliases, AllowExplicitUnpaidExecutionFrom, AllowKnownQueryResponses, AllowSubscriptionsFrom, AllowTopLevelPaidExecutionFrom, DenyReserveTransferToRelayChain, - DenyThenTry, EnsureXcmOrigin, FixedWeightBounds, FrameTransactionalProcessor, IsConcrete, - LocatableAssetId, OriginToPluralityVoice, ParentAsSuperuser, ParentIsPreset, + DenyThenTry, EnsureXcmOrigin, FixedWeightBounds, FrameTransactionalProcessor, FungibleAdapter, + IsConcrete, LocatableAssetId, OriginToPluralityVoice, ParentAsSuperuser, ParentIsPreset, RelayChainAsNative, SiblingParachainAsNative, SiblingParachainConvertsVia, SignedAccountId32AsNative, SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit, TrailingSetTopicAsId, UsingComponents, WithComputedOrigin, WithUniqueTopic, @@ -61,7 +57,7 @@ parameter_types! { pub const GovernanceLocation: Location = Location::parent(); pub const FellowshipAdminBodyId: BodyId = BodyId::Index(xcm_constants::body::FELLOWSHIP_ADMIN_INDEX); pub AssetHub: Location = (Parent, Parachain(1000)).into(); - pub const TreasurerBodyId: BodyId = BodyId::Index(xcm_constants::body::TREASURER_INDEX); + pub const TreasurerBodyId: BodyId = BodyId::Treasury; pub AssetHubUsdtId: AssetId = (PalletInstance(50), GeneralIndex(1984)).into(); pub UsdtAssetHub: LocatableAssetId = LocatableAssetId { location: AssetHub::get(), @@ -85,9 +81,8 @@ pub type LocationToAccountId = ( AccountId32Aliases, ); -/// Means for transacting the native currency on this chain. -#[allow(deprecated)] -pub type CurrencyTransactor = CurrencyAdapter< +/// Means for transacting the native currency on this chain.#[allow(deprecated)] +pub type FungibleTransactor = FungibleAdapter< // Use this currency: Balances, // Use this currency when it is a fungible asset matching the given location or name: @@ -262,7 +257,7 @@ pub struct XcmConfig; impl xcm_executor::Config for XcmConfig { type RuntimeCall = RuntimeCall; type XcmSender = XcmRouter; - type AssetTransactor = CurrencyTransactor; + type AssetTransactor = FungibleTransactor; type OriginConverter = XcmOriginToTransactDispatchOrigin; // Collectives does not recognize a reserve location for any asset. Users must teleport WND // where allowed (e.g. with the Relay Chain). @@ -271,8 +266,13 @@ impl xcm_executor::Config for XcmConfig { type UniversalLocation = UniversalLocation; type Barrier = Barrier; type Weigher = FixedWeightBounds; - type Trader = - UsingComponents>; + type Trader = UsingComponents< + WeightToFee, + WndLocation, + AccountId, + Balances, + ResolveTo, Balances>, + >; type ResponseHandler = PolkadotXcm; type AssetTrap = PolkadotXcm; type AssetClaims = PolkadotXcm; @@ -291,6 +291,9 @@ impl xcm_executor::Config for XcmConfig { type SafeCallFilter = SafeCallFilter; type Aliasers = Nothing; type TransactionalProcessor = FrameTransactionalProcessor; + type HrmpNewChannelOpenRequestHandler = (); + type HrmpChannelAcceptedHandler = (); + type HrmpChannelClosingHandler = (); } /// Converts a local signed origin into an XCM location. @@ -322,10 +325,9 @@ impl pallet_xcm::Config for Runtime { // We only allow the Fellows to send messages. type SendXcmOrigin = EnsureXcmOrigin; type XcmRouter = XcmRouter; - // We support local origins dispatching XCM executions in principle... + // We support local origins dispatching XCM executions. type ExecuteXcmOrigin = EnsureXcmOrigin; - // ... but disallow generic XCM execution. As a result only teleports are allowed. - type XcmExecuteFilter = Nothing; + type XcmExecuteFilter = Everything; type XcmExecutor = XcmExecutor; type XcmTeleportFilter = Everything; type XcmReserveTransferFilter = Nothing; // This parachain is not meant as a reserve location. diff --git a/cumulus/parachains/runtimes/contracts/contracts-rococo/Cargo.toml b/cumulus/parachains/runtimes/contracts/contracts-rococo/Cargo.toml index 9f719421b9d52f8607eb425062ac554b5725b8da..74c5b5f8115958d0894af621e6c7307e3f67b9b7 100644 --- a/cumulus/parachains/runtimes/contracts/contracts-rococo/Cargo.toml +++ b/cumulus/parachains/runtimes/contracts/contracts-rococo/Cargo.toml @@ -18,8 +18,8 @@ substrate-wasm-builder = { path = "../../../../../substrate/utils/wasm-builder", [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } hex-literal = { version = "0.4.1", optional = true } -log = { version = "0.4.20", default-features = false } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +log = { workspace = true } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } # Substrate sp-api = { path = "../../../../../substrate/primitives/api", default-features = false } @@ -74,6 +74,8 @@ cumulus-pallet-xcmp-queue = { path = "../../../../pallets/xcmp-queue", default-f cumulus-primitives-aura = { path = "../../../../primitives/aura", default-features = false } cumulus-primitives-core = { path = "../../../../primitives/core", default-features = false } cumulus-primitives-utility = { path = "../../../../primitives/utility", default-features = false } +cumulus-primitives-storage-weight-reclaim = { path = "../../../../primitives/storage-weight-reclaim", default-features = false } + pallet-collator-selection = { path = "../../../../pallets/collator-selection", default-features = false } parachain-info = { package = "staging-parachain-info", path = "../../../pallets/parachain-info", default-features = false } parachains-common = { path = "../../../common", default-features = false } @@ -90,6 +92,7 @@ std = [ "cumulus-pallet-xcmp-queue/std", "cumulus-primitives-aura/std", "cumulus-primitives-core/std", + "cumulus-primitives-storage-weight-reclaim/std", "cumulus-primitives-utility/std", "frame-benchmarking?/std", "frame-executive/std", @@ -196,8 +199,6 @@ try-runtime = [ "sp-runtime/try-runtime", ] -experimental = ["pallet-aura/experimental"] - # A feature that should be enabled when the runtime should be built for on-chain # deployment. This will disable stuff that shouldn't be part of the on-chain wasm # to make it smaller, like logging for example. diff --git a/cumulus/parachains/runtimes/contracts/contracts-rococo/src/contracts.rs b/cumulus/parachains/runtimes/contracts/contracts-rococo/src/contracts.rs index 7b89f2df807734086031797915bde30b2eff77e2..171ac6a9528f134d9c22548500805ef36e9504f9 100644 --- a/cumulus/parachains/runtimes/contracts/contracts-rococo/src/contracts.rs +++ b/cumulus/parachains/runtimes/contracts/contracts-rococo/src/contracts.rs @@ -21,6 +21,7 @@ use frame_support::{ parameter_types, traits::{ConstBool, ConstU32, Nothing}, }; +use frame_system::EnsureSigned; use pallet_contracts::{ weights::SubstrateWeight, Config, DebugInfo, DefaultAddressGenerator, Frame, Schedule, }; @@ -65,6 +66,8 @@ impl Config for Runtime { type MaxCodeLen = ConstU32<{ 123 * 1024 }>; type MaxStorageKeyLen = ConstU32<128>; type UnsafeUnstableInterface = ConstBool; + type UploadOrigin = EnsureSigned; + type InstantiateOrigin = EnsureSigned; type MaxDebugBufferLen = ConstU32<{ 2 * 1024 * 1024 }>; type MaxDelegateDependencies = ConstU32<32>; type CodeHashLockupDepositPercent = CodeHashLockupDepositPercent; @@ -72,5 +75,6 @@ impl Config for Runtime { type RuntimeHoldReason = RuntimeHoldReason; type Debug = (); type Environment = (); + type ApiVersion = (); type Xcm = pallet_xcm::Pallet; } diff --git a/cumulus/parachains/runtimes/contracts/contracts-rococo/src/lib.rs b/cumulus/parachains/runtimes/contracts/contracts-rococo/src/lib.rs index 32df37400b1df779d5d1089e70768bad5a413efc..41a28bfab84eb5263216f026fadf434640c600a5 100644 --- a/cumulus/parachains/runtimes/contracts/contracts-rococo/src/lib.rs +++ b/cumulus/parachains/runtimes/contracts/contracts-rococo/src/lib.rs @@ -48,9 +48,9 @@ use sp_version::RuntimeVersion; use frame_support::{ construct_runtime, derive_impl, dispatch::DispatchClass, - genesis_builder_helper::{build_config, create_default_config}, + genesis_builder_helper::{build_state, get_preset}, parameter_types, - traits::{ConstBool, ConstU128, ConstU16, ConstU32, ConstU64, ConstU8}, + traits::{ConstBool, ConstU16, ConstU32, ConstU64, ConstU8}, weights::{ConstantMultiplier, Weight}, PalletId, }; @@ -58,10 +58,10 @@ use frame_system::limits::{BlockLength, BlockWeights}; pub use parachains_common as common; use parachains_common::{ impls::DealWithFees, message_queue::*, AccountId, BlockNumber, Hash, Header, Nonce, Signature, - AVERAGE_ON_INITIALIZE_RATIO, MINUTES, NORMAL_DISPATCH_RATIO, + AVERAGE_ON_INITIALIZE_RATIO, NORMAL_DISPATCH_RATIO, }; pub use parachains_common::{AuraId, Balance}; -use testnet_parachains_constants::rococo::{consensus::*, currency::*, fee::WeightToFee}; +use testnet_parachains_constants::rococo::{consensus::*, currency::*, fee::WeightToFee, time::*}; use xcm_config::CollatorSelectionUpdateOrigin; #[cfg(any(feature = "std", test))] @@ -90,6 +90,7 @@ pub type SignedExtra = ( frame_system::CheckNonce, frame_system::CheckWeight, pallet_transaction_payment::ChargeTransactionPayment, + cumulus_primitives_storage_weight_reclaim::StorageWeightReclaim, ); /// Unchecked extrinsic type as expected by this runtime. pub type UncheckedExtrinsic = @@ -103,6 +104,8 @@ pub type Migrations = ( pallet_contracts::Migration, // unreleased cumulus_pallet_xcmp_queue::migration::v4::MigrationToV4, + // permanent + pallet_xcm::migration::MigrateToLatestXcmVersion, ); type EventRecord = frame_system::EventRecord< @@ -131,7 +134,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("contracts-rococo"), impl_name: create_runtime_str!("contracts-rococo"), authoring_version: 1, - spec_version: 1_006_000, + spec_version: 1_010_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 6, @@ -169,7 +172,7 @@ parameter_types! { } // Configure FRAME pallets to include in runtime. -#[derive_impl(frame_system::config_preludes::ParaChainDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::ParaChainDefaultConfig)] impl frame_system::Config for Runtime { type BlockWeights = RuntimeBlockWeights; type BlockLength = RuntimeBlockLength; @@ -191,10 +194,7 @@ impl pallet_timestamp::Config for Runtime { /// A timestamp: milliseconds since the unix epoch. type Moment = u64; type OnTimestampSet = Aura; - #[cfg(feature = "experimental")] type MinimumPeriod = ConstU64<0>; - #[cfg(not(feature = "experimental"))] - type MinimumPeriod = ConstU64<{ SLOT_DURATION / 2 }>; type WeightInfo = pallet_timestamp::weights::SubstrateWeight; } @@ -203,6 +203,10 @@ impl pallet_authorship::Config for Runtime { type EventHandler = (CollatorSelection,); } +parameter_types! { + pub const ExistentialDeposit: Balance = EXISTENTIAL_DEPOSIT; +} + impl pallet_balances::Config for Runtime { type MaxLocks = ConstU32<50>; /// The type for recording an account's balance. @@ -210,7 +214,7 @@ impl pallet_balances::Config for Runtime { /// The ubiquitous event type. type RuntimeEvent = RuntimeEvent; type DustRemoval = (); - type ExistentialDeposit = ConstU128; + type ExistentialDeposit = ExistentialDeposit; type AccountStore = System; type WeightInfo = pallet_balances::weights::SubstrateWeight; type MaxReserves = ConstU32<50>; @@ -228,7 +232,7 @@ parameter_types! { impl pallet_transaction_payment::Config for Runtime { type RuntimeEvent = RuntimeEvent; type OnChargeTransaction = - pallet_transaction_payment::CurrencyAdapter>; + pallet_transaction_payment::FungibleAdapter>; type WeightToFee = WeightToFee; /// Relay Chain `TransactionByteFee` / 10 type LengthToFee = ConstantMultiplier; @@ -315,6 +319,7 @@ impl pallet_message_queue::Config for Runtime { type HeapSize = sp_core::ConstU32<{ 64 * 1024 }>; type MaxStale = sp_core::ConstU32<8>; type ServiceWeight = MessageQueueServiceWeight; + type IdleMaxServiceWeight = MessageQueueServiceWeight; } impl cumulus_pallet_aura_ext::Config for Runtime {} @@ -343,7 +348,6 @@ impl pallet_aura::Config for Runtime { type DisabledValidators = (); type MaxAuthorities = ConstU32<100_000>; type AllowMultipleBlocksPerSlot = ConstBool; - #[cfg(feature = "experimental")] type SlotDuration = ConstU64; } @@ -425,6 +429,7 @@ mod benches { [pallet_sudo, Sudo] [pallet_timestamp, Timestamp] [pallet_collator_selection, CollatorSelection] + [cumulus_pallet_parachain_system, ParachainSystem] [pallet_contracts, Contracts] [pallet_xcm, PalletXcmExtrinsicsBenchmark::] ); @@ -437,7 +442,7 @@ impl_runtime_apis! { } fn authorities() -> Vec { - Aura::authorities().into_inner() + pallet_aura::Authorities::::get().into_inner() } } @@ -459,7 +464,7 @@ impl_runtime_apis! { Executive::execute_block(block) } - fn initialize_block(header: &::Header) { + fn initialize_block(header: &::Header) -> sp_runtime::ExtrinsicInclusionMode { Executive::initialize_block(header) } } @@ -709,9 +714,22 @@ impl_runtime_apis! { use cumulus_pallet_session_benchmarking::Pallet as SessionBench; impl cumulus_pallet_session_benchmarking::Config for Runtime {} + parameter_types! { + pub ExistentialDepositAsset: Option = Some(( + xcm_config::RelayLocation::get(), + ExistentialDeposit::get() + ).into()); + } + use xcm::latest::prelude::*; use pallet_xcm::benchmarking::Pallet as PalletXcmExtrinsicsBenchmark; impl pallet_xcm::benchmarking::Config for Runtime { + type DeliveryHelper = cumulus_primitives_utility::ToParentDeliveryHelper< + xcm_config::XcmConfig, + ExistentialDepositAsset, + xcm_config::PriceForParentDelivery, + >; + fn reachable_dest() -> Option { Some(Parent.into()) } @@ -720,7 +738,7 @@ impl_runtime_apis! { // Relay/native token can be teleported between Contracts-System-Para and Relay. Some(( Asset { - fun: Fungible(EXISTENTIAL_DEPOSIT), + fun: Fungible(ExistentialDeposit::get()), id: AssetId(Parent.into()) }, Parent.into(), @@ -743,6 +761,13 @@ impl_runtime_apis! { dest ) } + + fn get_asset() -> Asset { + Asset { + id: AssetId(Location::parent()), + fun: Fungible(EXISTENTIAL_DEPOSIT), + } + } } let whitelist: Vec = vec![ @@ -768,12 +793,16 @@ impl_runtime_apis! { } impl sp_genesis_builder::GenesisBuilder for Runtime { - fn create_default_config() -> Vec { - create_default_config::() + fn build_state(config: Vec) -> sp_genesis_builder::Result { + build_state::(config) + } + + fn get_preset(id: &Option) -> Option> { + get_preset::(id, |_| None) } - fn build_config(config: Vec) -> sp_genesis_builder::Result { - build_config::(config) + fn preset_names() -> Vec { + vec![] } } } diff --git a/cumulus/parachains/runtimes/contracts/contracts-rococo/src/xcm_config.rs b/cumulus/parachains/runtimes/contracts/contracts-rococo/src/xcm_config.rs index 7919faf400f46f124aaadf12191a9dd3d17896ba..3863ea5022f9142b230f5dba9a3840f858daa127 100644 --- a/cumulus/parachains/runtimes/contracts/contracts-rococo/src/xcm_config.rs +++ b/cumulus/parachains/runtimes/contracts/contracts-rococo/src/xcm_config.rs @@ -37,16 +37,15 @@ use polkadot_runtime_common::xcm_sender::ExponentialPrice; use sp_runtime::traits::AccountIdConversion; use testnet_parachains_constants::rococo::currency::CENTS; use xcm::latest::prelude::*; -#[allow(deprecated)] -use xcm_builder::CurrencyAdapter; use xcm_builder::{ AccountId32Aliases, AllowExplicitUnpaidExecutionFrom, AllowKnownQueryResponses, AllowSubscriptionsFrom, AllowTopLevelPaidExecutionFrom, DenyReserveTransferToRelayChain, - DenyThenTry, EnsureXcmOrigin, FixedWeightBounds, FrameTransactionalProcessor, IsConcrete, - NativeAsset, ParentAsSuperuser, ParentIsPreset, RelayChainAsNative, SiblingParachainAsNative, - SiblingParachainConvertsVia, SignedAccountId32AsNative, SignedToAccountId32, - SovereignSignedViaLocation, TakeWeightCredit, TrailingSetTopicAsId, UsingComponents, - WithComputedOrigin, WithUniqueTopic, XcmFeeManagerFromComponents, XcmFeeToAccount, + DenyThenTry, EnsureXcmOrigin, FixedWeightBounds, FrameTransactionalProcessor, FungibleAdapter, + IsConcrete, NativeAsset, ParentAsSuperuser, ParentIsPreset, RelayChainAsNative, + SiblingParachainAsNative, SiblingParachainConvertsVia, SignedAccountId32AsNative, + SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit, TrailingSetTopicAsId, + UsingComponents, WithComputedOrigin, WithUniqueTopic, XcmFeeManagerFromComponents, + XcmFeeToAccount, }; use xcm_executor::XcmExecutor; @@ -79,8 +78,7 @@ pub type LocationToAccountId = ( ); /// Means for transacting the native currency on this chain. -#[allow(deprecated)] -pub type CurrencyTransactor = CurrencyAdapter< +pub type CurrencyTransactor = FungibleAdapter< // Use this currency: Balances, // Use this currency when it is a fungible asset matching the given location or name: @@ -199,6 +197,9 @@ impl xcm_executor::Config for XcmConfig { type SafeCallFilter = Everything; type Aliasers = Nothing; type TransactionalProcessor = FrameTransactionalProcessor; + type HrmpNewChannelOpenRequestHandler = (); + type HrmpChannelAcceptedHandler = (); + type HrmpChannelClosingHandler = (); } /// Converts a local signed origin into an XCM location. @@ -222,11 +223,10 @@ impl pallet_xcm::Config for Runtime { // We want to disallow users sending (arbitrary) XCMs from this chain. type SendXcmOrigin = EnsureXcmOrigin; type XcmRouter = XcmRouter; - // We support local origins dispatching XCM executions in principle... + // We support local origins dispatching XCM executions. type ExecuteXcmOrigin = EnsureXcmOrigin; - // ... but disallow generic XCM execution. As a result only teleports and reserve transfers are // allowed. - type XcmExecuteFilter = Nothing; + type XcmExecuteFilter = Everything; type XcmExecutor = XcmExecutor; type XcmTeleportFilter = Everything; type XcmReserveTransferFilter = Everything; diff --git a/cumulus/parachains/runtimes/coretime/coretime-rococo/Cargo.toml b/cumulus/parachains/runtimes/coretime/coretime-rococo/Cargo.toml index ae604da87a98392b2a69b3732e05e1b7f38eaeb9..ee9f5e87ec876d73d80eb088806f5b36f12079db 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-rococo/Cargo.toml +++ b/cumulus/parachains/runtimes/coretime/coretime-rococo/Cargo.toml @@ -15,9 +15,9 @@ substrate-wasm-builder = { path = "../../../../../substrate/utils/wasm-builder", [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } hex-literal = "0.4.1" -log = { version = "0.4.20", default-features = false } +log = { workspace = true } scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.195", optional = true, features = ["derive"] } +serde = { optional = true, features = ["derive"], workspace = true, default-features = true } # Substrate frame-benchmarking = { path = "../../../../../substrate/frame/benchmarking", default-features = false, optional = true } @@ -56,7 +56,6 @@ sp-version = { path = "../../../../../substrate/primitives/version", default-fea # Polkadot pallet-xcm = { path = "../../../../../polkadot/xcm/pallet-xcm", default-features = false } pallet-xcm-benchmarks = { path = "../../../../../polkadot/xcm/pallet-xcm-benchmarks", default-features = false, optional = true } -polkadot-core-primitives = { path = "../../../../../polkadot/core-primitives", default-features = false } polkadot-parachain-primitives = { path = "../../../../../polkadot/parachain", default-features = false } polkadot-runtime-common = { path = "../../../../../polkadot/runtime/common", default-features = false } rococo-runtime-constants = { path = "../../../../../polkadot/runtime/rococo/constants", default-features = false } @@ -73,6 +72,7 @@ cumulus-pallet-xcmp-queue = { path = "../../../../pallets/xcmp-queue", default-f cumulus-primitives-aura = { path = "../../../../primitives/aura", default-features = false } cumulus-primitives-core = { path = "../../../../primitives/core", default-features = false } cumulus-primitives-utility = { path = "../../../../primitives/utility", default-features = false } +cumulus-primitives-storage-weight-reclaim = { path = "../../../../primitives/storage-weight-reclaim", default-features = false } pallet-collator-selection = { path = "../../../../pallets/collator-selection", default-features = false } parachain-info = { package = "staging-parachain-info", path = "../../../pallets/parachain-info", default-features = false } parachains-common = { path = "../../../common", default-features = false } @@ -89,6 +89,7 @@ std = [ "cumulus-pallet-xcmp-queue/std", "cumulus-primitives-aura/std", "cumulus-primitives-core/std", + "cumulus-primitives-storage-weight-reclaim/std", "cumulus-primitives-utility/std", "frame-benchmarking?/std", "frame-executive/std", @@ -115,7 +116,6 @@ std = [ "pallet-xcm/std", "parachain-info/std", "parachains-common/std", - "polkadot-core-primitives/std", "polkadot-parachain-primitives/std", "polkadot-runtime-common/std", "rococo-runtime-constants/std", @@ -196,6 +196,4 @@ try-runtime = [ "sp-runtime/try-runtime", ] -experimental = ["pallet-aura/experimental"] - fast-runtime = [] diff --git a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/coretime.rs b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/coretime.rs index 3e47b1bc4cba9cbe679d1a648c935baf6f20c9c7..742dd50f6fa1f421d6ce4abf221e05f6902cc2ae 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/coretime.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/coretime.rs @@ -29,10 +29,9 @@ use pallet_broker::{CoreAssignment, CoreIndex, CoretimeInterface, PartsOf57600, use parachains_common::{AccountId, Balance, BlockNumber}; use xcm::latest::prelude::*; -// TODO: check AccountId import pub struct CreditToCollatorPot; impl OnUnbalanced> for CreditToCollatorPot { - fn on_nonzero_unbalanced(credit: Credit) { + fn on_nonzero_unbalanced(credit: Credit) { let staking_pot = CollatorSelection::account_id(); let _ = >::resolve(&staking_pot, credit); } @@ -81,7 +80,7 @@ pub struct CoretimeAllocator; impl CoretimeInterface for CoretimeAllocator { type AccountId = AccountId; type Balance = Balance; - type RealyChainBlockNumberProvider = RelaychainDataProvider; + type RelayChainBlockNumberProvider = RelaychainDataProvider; fn request_core_count(count: CoreIndex) { use crate::coretime::CoretimeProviderCalls::RequestCoreCount; diff --git a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/lib.rs b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/lib.rs index 0bbdb878dd1f2226f8aa5c6c6fbbdaa104fb7630..96f2216384bcd6b2ff82c5177520cfbc781060c1 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/lib.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/lib.rs @@ -38,7 +38,7 @@ use cumulus_primitives_core::{AggregateMessageOrigin, ParaId}; use frame_support::{ construct_runtime, derive_impl, dispatch::DispatchClass, - genesis_builder_helper::{build_config, create_default_config}, + genesis_builder_helper::{build_state, get_preset}, parameter_types, traits::{ConstBool, ConstU32, ConstU64, ConstU8, EitherOfDiverse, TransformOrigin}, weights::{ConstantMultiplier, Weight}, @@ -64,7 +64,7 @@ use sp_runtime::{ create_runtime_str, generic, impl_opaque_keys, traits::Block as BlockT, transaction_validity::{TransactionSource, TransactionValidity}, - ApplyExtrinsicResult, MultiAddress, Perbill, + ApplyExtrinsicResult, DispatchError, MultiAddress, Perbill, }; use sp_std::prelude::*; #[cfg(feature = "std")] @@ -99,6 +99,7 @@ pub type SignedExtra = ( frame_system::CheckNonce, frame_system::CheckWeight, pallet_transaction_payment::ChargeTransactionPayment, + cumulus_primitives_storage_weight_reclaim::StorageWeightReclaim, ); /// Unchecked extrinsic type as expected by this runtime. @@ -106,7 +107,11 @@ pub type UncheckedExtrinsic = generic::UncheckedExtrinsic; /// Migrations to apply on runtime upgrade. -pub type Migrations = (cumulus_pallet_xcmp_queue::migration::v4::MigrationToV4,); +pub type Migrations = ( + cumulus_pallet_xcmp_queue::migration::v4::MigrationToV4, + // permanent + pallet_xcm::migration::MigrateToLatestXcmVersion, +); /// Executive: handles dispatch to the various modules. pub type Executive = frame_executive::Executive< @@ -129,7 +134,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("coretime-rococo"), impl_name: create_runtime_str!("coretime-rococo"), authoring_version: 1, - spec_version: 1_006_001, + spec_version: 1_010_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 0, @@ -168,7 +173,7 @@ parameter_types! { } // Configure FRAME pallets to include in runtime. -#[derive_impl(frame_system::config_preludes::ParaChainDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::ParaChainDefaultConfig)] impl frame_system::Config for Runtime { /// The identifier used to distinguish between accounts. type AccountId = AccountId; @@ -202,10 +207,7 @@ impl pallet_timestamp::Config for Runtime { /// A timestamp: milliseconds since the unix epoch. type Moment = u64; type OnTimestampSet = Aura; - #[cfg(feature = "experimental")] type MinimumPeriod = ConstU64<0>; - #[cfg(not(feature = "experimental"))] - type MinimumPeriod = ConstU64<{ SLOT_DURATION / 2 }>; type WeightInfo = weights::pallet_timestamp::WeightInfo; } @@ -242,7 +244,7 @@ parameter_types! { impl pallet_transaction_payment::Config for Runtime { type RuntimeEvent = RuntimeEvent; type OnChargeTransaction = - pallet_transaction_payment::CurrencyAdapter>; + pallet_transaction_payment::FungibleAdapter>; type OperationalFeeMultiplier = ConstU8<5>; type WeightToFee = WeightToFee; type LengthToFee = ConstantMultiplier; @@ -300,6 +302,7 @@ impl pallet_message_queue::Config for Runtime { type HeapSize = sp_core::ConstU32<{ 64 * 1024 }>; type MaxStale = sp_core::ConstU32<8>; type ServiceWeight = MessageQueueServiceWeight; + type IdleMaxServiceWeight = MessageQueueServiceWeight; } impl parachain_info::Config for Runtime {} @@ -365,7 +368,6 @@ impl pallet_aura::Config for Runtime { type DisabledValidators = (); type MaxAuthorities = ConstU32<100_000>; type AllowMultipleBlocksPerSlot = ConstBool; - #[cfg(feature = "experimental")] type SlotDuration = ConstU64; } @@ -495,7 +497,7 @@ impl_runtime_apis! { } fn authorities() -> Vec { - Aura::authorities().into_inner() + pallet_aura::Authorities::::get().into_inner() } } @@ -517,7 +519,7 @@ impl_runtime_apis! { Executive::execute_block(block) } - fn initialize_block(header: &::Header) { + fn initialize_block(header: &::Header) -> sp_runtime::ExtrinsicInclusionMode { Executive::initialize_block(header) } } @@ -591,6 +593,12 @@ impl_runtime_apis! { } } + impl pallet_broker::runtime_api::BrokerApi for Runtime { + fn sale_price() -> Result { + Broker::current_price() + } + } + impl pallet_transaction_payment_rpc_runtime_api::TransactionPaymentApi for Runtime { fn query_info( uxt: ::Extrinsic, @@ -711,6 +719,12 @@ impl_runtime_apis! { use pallet_xcm::benchmarking::Pallet as PalletXcmExtrinsicsBenchmark; impl pallet_xcm::benchmarking::Config for Runtime { + type DeliveryHelper = cumulus_primitives_utility::ToParentDeliveryHelper< + xcm_config::XcmConfig, + ExistentialDepositAsset, + xcm_config::PriceForParentDelivery, + >; + fn reachable_dest() -> Option { Some(Parent.into()) } @@ -719,7 +733,7 @@ impl_runtime_apis! { // Relay/native token can be teleported between AH and Relay. Some(( Asset { - fun: Fungible(EXISTENTIAL_DEPOSIT), + fun: Fungible(ExistentialDeposit::get()), id: AssetId(Parent.into()) }, Parent.into(), @@ -730,6 +744,13 @@ impl_runtime_apis! { // Reserve transfers are disabled None } + + fn get_asset() -> Asset { + Asset { + id: AssetId(Location::parent()), + fun: Fungible(ExistentialDeposit::get()), + } + } } parameter_types! { @@ -863,12 +884,16 @@ impl_runtime_apis! { } impl sp_genesis_builder::GenesisBuilder for Runtime { - fn create_default_config() -> Vec { - create_default_config::() + fn build_state(config: Vec) -> sp_genesis_builder::Result { + build_state::(config) + } + + fn get_preset(id: &Option) -> Option> { + get_preset::(id, |_| None) } - fn build_config(config: Vec) -> sp_genesis_builder::Result { - build_config::(config) + fn preset_names() -> Vec { + vec![] } } } diff --git a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_broker.rs b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_broker.rs index 2d30ddc612cb9544291b90ea9456e392ab3451d4..89b1c4c86632ff0d19ee4fe1428978303ef92082 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_broker.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_broker.rs @@ -16,26 +16,24 @@ //! Autogenerated weights for `pallet_broker` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2024-01-12, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-03-20, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-j8vvqcjr-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! HOSTNAME: `runner-h2rr8wx7-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("coretime-rococo-dev")`, DB CACHE: 1024 // Executed Command: -// ./target/production/polkadot-parachain +// target/production/polkadot-parachain // benchmark // pallet -// --chain=coretime-rococo-dev -// --wasm-execution=compiled -// --pallet=pallet_broker -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* // --steps=50 // --repeat=20 -// --json +// --extrinsic=* +// --wasm-execution=compiled +// --heap-pages=4096 +// --json-file=/builds/parity/mirrors/polkadot-sdk/.git/.artifacts/bench.json +// --pallet=pallet_broker +// --chain=coretime-rococo-dev // --header=./cumulus/file_header.txt // --output=./cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/ @@ -56,8 +54,8 @@ impl pallet_broker::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_462_000 picoseconds. - Weight::from_parts(2_552_000, 0) + // Minimum execution time: 1_918_000 picoseconds. + Weight::from_parts(2_092_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -67,8 +65,8 @@ impl pallet_broker::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `10888` // Estimated: `13506` - // Minimum execution time: 25_494_000 picoseconds. - Weight::from_parts(26_063_000, 0) + // Minimum execution time: 21_943_000 picoseconds. + Weight::from_parts(22_570_000, 0) .saturating_add(Weight::from_parts(0, 13506)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -79,8 +77,8 @@ impl pallet_broker::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `12090` // Estimated: `13506` - // Minimum execution time: 22_299_000 picoseconds. - Weight::from_parts(22_911_000, 0) + // Minimum execution time: 20_923_000 picoseconds. + Weight::from_parts(21_354_000, 0) .saturating_add(Weight::from_parts(0, 13506)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -95,8 +93,8 @@ impl pallet_broker::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `466` // Estimated: `1951` - // Minimum execution time: 11_590_000 picoseconds. - Weight::from_parts(12_007_000, 0) + // Minimum execution time: 10_687_000 picoseconds. + Weight::from_parts(11_409_000, 0) .saturating_add(Weight::from_parts(0, 1951)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(1)) @@ -124,11 +122,11 @@ impl pallet_broker::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `12567` // Estimated: `14052` - // Minimum execution time: 120_928_000 picoseconds. - Weight::from_parts(124_947_252, 0) + // Minimum execution time: 111_288_000 picoseconds. + Weight::from_parts(117_804_282, 0) .saturating_add(Weight::from_parts(0, 14052)) - // Standard Error: 435 - .saturating_add(Weight::from_parts(1_246, 0).saturating_mul(n.into())) + // Standard Error: 391 + .saturating_add(Weight::from_parts(1_243, 0).saturating_mul(n.into())) .saturating_add(T::DbWeight::get().reads(8)) .saturating_add(T::DbWeight::get().writes(66)) } @@ -144,8 +142,8 @@ impl pallet_broker::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `316` // Estimated: `3593` - // Minimum execution time: 32_826_000 picoseconds. - Weight::from_parts(33_889_000, 0) + // Minimum execution time: 33_006_000 picoseconds. + Weight::from_parts(34_256_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(2)) @@ -166,8 +164,8 @@ impl pallet_broker::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `434` // Estimated: `4698` - // Minimum execution time: 57_362_000 picoseconds. - Weight::from_parts(58_994_000, 0) + // Minimum execution time: 61_473_000 picoseconds. + Weight::from_parts(66_476_000, 0) .saturating_add(Weight::from_parts(0, 4698)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(4)) @@ -178,8 +176,8 @@ impl pallet_broker::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `357` // Estimated: `3550` - // Minimum execution time: 13_982_000 picoseconds. - Weight::from_parts(14_447_000, 0) + // Minimum execution time: 13_771_000 picoseconds. + Weight::from_parts(14_374_000, 0) .saturating_add(Weight::from_parts(0, 3550)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -190,8 +188,8 @@ impl pallet_broker::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `357` // Estimated: `3550` - // Minimum execution time: 15_070_000 picoseconds. - Weight::from_parts(15_735_000, 0) + // Minimum execution time: 15_162_000 picoseconds. + Weight::from_parts(15_742_000, 0) .saturating_add(Weight::from_parts(0, 3550)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) @@ -202,8 +200,8 @@ impl pallet_broker::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `357` // Estimated: `3550` - // Minimum execution time: 16_527_000 picoseconds. - Weight::from_parts(16_894_000, 0) + // Minimum execution time: 16_196_000 picoseconds. + Weight::from_parts(16_796_000, 0) .saturating_add(Weight::from_parts(0, 3550)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(3)) @@ -220,8 +218,8 @@ impl pallet_broker::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `936` // Estimated: `4681` - // Minimum execution time: 25_493_000 picoseconds. - Weight::from_parts(26_091_000, 0) + // Minimum execution time: 25_653_000 picoseconds. + Weight::from_parts(27_006_000, 0) .saturating_add(Weight::from_parts(0, 4681)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) @@ -240,8 +238,8 @@ impl pallet_broker::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `1002` // Estimated: `5996` - // Minimum execution time: 31_498_000 picoseconds. - Weight::from_parts(32_560_000, 0) + // Minimum execution time: 31_114_000 picoseconds. + Weight::from_parts(32_235_000, 0) .saturating_add(Weight::from_parts(0, 5996)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(5)) @@ -257,11 +255,11 @@ impl pallet_broker::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `652` // Estimated: `6196 + m * (2520 ±0)` - // Minimum execution time: 57_183_000 picoseconds. - Weight::from_parts(58_024_898, 0) + // Minimum execution time: 57_280_000 picoseconds. + Weight::from_parts(58_127_480, 0) .saturating_add(Weight::from_parts(0, 6196)) - // Standard Error: 35_831 - .saturating_add(Weight::from_parts(1_384_446, 0).saturating_mul(m.into())) + // Standard Error: 41_670 + .saturating_add(Weight::from_parts(1_203_066, 0).saturating_mul(m.into())) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(m.into()))) .saturating_add(T::DbWeight::get().writes(5)) @@ -283,8 +281,8 @@ impl pallet_broker::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `215` // Estimated: `3680` - // Minimum execution time: 59_762_000 picoseconds. - Weight::from_parts(61_114_000, 0) + // Minimum execution time: 59_968_000 picoseconds. + Weight::from_parts(62_315_000, 0) .saturating_add(Weight::from_parts(0, 3680)) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(3)) @@ -297,8 +295,8 @@ impl pallet_broker::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `465` // Estimated: `3550` - // Minimum execution time: 41_473_000 picoseconds. - Weight::from_parts(44_155_000, 0) + // Minimum execution time: 50_887_000 picoseconds. + Weight::from_parts(57_366_000, 0) .saturating_add(Weight::from_parts(0, 3550)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) @@ -313,8 +311,8 @@ impl pallet_broker::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `463` // Estimated: `3533` - // Minimum execution time: 56_672_000 picoseconds. - Weight::from_parts(58_086_000, 0) + // Minimum execution time: 84_472_000 picoseconds. + Weight::from_parts(96_536_000, 0) .saturating_add(Weight::from_parts(0, 3533)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(1)) @@ -331,8 +329,8 @@ impl pallet_broker::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `857` // Estimated: `3593` - // Minimum execution time: 64_460_000 picoseconds. - Weight::from_parts(65_894_000, 0) + // Minimum execution time: 96_371_000 picoseconds. + Weight::from_parts(104_659_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(1)) @@ -345,8 +343,8 @@ impl pallet_broker::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `957` // Estimated: `4698` - // Minimum execution time: 37_447_000 picoseconds. - Weight::from_parts(42_318_000, 0) + // Minimum execution time: 51_741_000 picoseconds. + Weight::from_parts(54_461_000, 0) .saturating_add(Weight::from_parts(0, 4698)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) @@ -366,8 +364,8 @@ impl pallet_broker::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `74` // Estimated: `3539` - // Minimum execution time: 21_219_000 picoseconds. - Weight::from_parts(22_084_648, 0) + // Minimum execution time: 19_901_000 picoseconds. + Weight::from_parts(21_028_116, 0) .saturating_add(Weight::from_parts(0, 3539)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) @@ -379,11 +377,11 @@ impl pallet_broker::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `266` // Estimated: `1487` - // Minimum execution time: 5_792_000 picoseconds. - Weight::from_parts(6_358_588, 0) + // Minimum execution time: 5_987_000 picoseconds. + Weight::from_parts(6_412_478, 0) .saturating_add(Weight::from_parts(0, 1487)) - // Standard Error: 20 - .saturating_add(Weight::from_parts(26, 0).saturating_mul(n.into())) + // Standard Error: 16 + .saturating_add(Weight::from_parts(47, 0).saturating_mul(n.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -397,8 +395,8 @@ impl pallet_broker::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `447` // Estimated: `6196` - // Minimum execution time: 38_690_000 picoseconds. - Weight::from_parts(39_706_000, 0) + // Minimum execution time: 38_623_000 picoseconds. + Weight::from_parts(39_773_000, 0) .saturating_add(Weight::from_parts(0, 6196)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(3)) @@ -414,15 +412,13 @@ impl pallet_broker::WeightInfo for WeightInfo { /// Storage: `Broker::Workplan` (r:0 w:60) /// Proof: `Broker::Workplan` (`max_values`: None, `max_size`: Some(1216), added: 3691, mode: `MaxEncodedLen`) /// The range of component `n` is `[0, 1000]`. - fn rotate_sale(n: u32, ) -> Weight { + fn rotate_sale(_n: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `12514` // Estimated: `13506` - // Minimum execution time: 93_531_000 picoseconds. - Weight::from_parts(95_836_318, 0) + // Minimum execution time: 97_074_000 picoseconds. + Weight::from_parts(101_247_740, 0) .saturating_add(Weight::from_parts(0, 13506)) - // Standard Error: 113 - .saturating_add(Weight::from_parts(329, 0).saturating_mul(n.into())) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(65)) } @@ -434,8 +430,8 @@ impl pallet_broker::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `42` // Estimated: `3493` - // Minimum execution time: 6_506_000 picoseconds. - Weight::from_parts(6_783_000, 0) + // Minimum execution time: 6_317_000 picoseconds. + Weight::from_parts(6_521_000, 0) .saturating_add(Weight::from_parts(0, 3493)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -458,8 +454,8 @@ impl pallet_broker::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `1321` // Estimated: `4786` - // Minimum execution time: 31_927_000 picoseconds. - Weight::from_parts(32_748_000, 0) + // Minimum execution time: 32_575_000 picoseconds. + Weight::from_parts(33_299_000, 0) .saturating_add(Weight::from_parts(0, 4786)) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(4)) @@ -478,8 +474,8 @@ impl pallet_broker::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `74` // Estimated: `3539` - // Minimum execution time: 15_682_000 picoseconds. - Weight::from_parts(16_012_000, 0) + // Minimum execution time: 15_256_000 picoseconds. + Weight::from_parts(15_927_000, 0) .saturating_add(Weight::from_parts(0, 3539)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) @@ -490,8 +486,8 @@ impl pallet_broker::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_147_000 picoseconds. - Weight::from_parts(2_281_000, 0) + // Minimum execution time: 1_783_000 picoseconds. + Weight::from_parts(1_904_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -509,10 +505,22 @@ impl pallet_broker::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `398` // Estimated: `3863` - // Minimum execution time: 12_015_000 picoseconds. - Weight::from_parts(12_619_000, 0) + // Minimum execution time: 12_307_000 picoseconds. + Weight::from_parts(12_967_000, 0) .saturating_add(Weight::from_parts(0, 3863)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) } + /// Storage: `Broker::Leases` (r:1 w:1) + /// Proof: `Broker::Leases` (`max_values`: Some(1), `max_size`: Some(401), added: 896, mode: `MaxEncodedLen`) + fn swap_leases() -> Weight { + // Proof Size summary in bytes: + // Measured: `470` + // Estimated: `1886` + // Minimum execution time: 6_597_000 picoseconds. + Weight::from_parts(6_969_000, 0) + .saturating_add(Weight::from_parts(0, 1886)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } } diff --git a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_xcm.rs b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_xcm.rs index 0e34cba4aaf5d9879dfecc97ffd736b985c98f23..df0044089c8f6fb558d368e2f006a6a4fbd9fb97 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_xcm.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_xcm.rs @@ -16,26 +16,24 @@ //! Autogenerated weights for `pallet_xcm` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2024-01-12, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-03-21, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-j8vvqcjr-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! HOSTNAME: `runner-h2rr8wx7-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("coretime-rococo-dev")`, DB CACHE: 1024 // Executed Command: -// ./target/production/polkadot-parachain +// target/production/polkadot-parachain // benchmark // pallet -// --chain=coretime-rococo-dev -// --wasm-execution=compiled -// --pallet=pallet_xcm -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --extrinsic=* // --steps=50 // --repeat=20 -// --json +// --extrinsic=* +// --wasm-execution=compiled +// --heap-pages=4096 +// --json-file=/builds/parity/mirrors/polkadot-sdk/.git/.artifacts/bench.json +// --pallet=pallet_xcm +// --chain=coretime-rococo-dev // --header=./cumulus/file_header.txt // --output=./cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/ @@ -64,8 +62,28 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `74` // Estimated: `3539` - // Minimum execution time: 22_669_000 picoseconds. - Weight::from_parts(23_227_000, 0) + // Minimum execution time: 18_767_000 picoseconds. + Weight::from_parts(19_420_000, 0) + .saturating_add(Weight::from_parts(0, 3539)) + .saturating_add(T::DbWeight::get().reads(5)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) + /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) + /// Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) + /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) + /// Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) + /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + fn send_blob() -> Weight { + // Proof Size summary in bytes: + // Measured: `74` + // Estimated: `3539` + // Minimum execution time: 19_184_000 picoseconds. + Weight::from_parts(19_695_000, 0) .saturating_add(Weight::from_parts(0, 3539)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) @@ -86,8 +104,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `106` // Estimated: `3571` - // Minimum execution time: 64_486_000 picoseconds. - Weight::from_parts(65_247_000, 0) + // Minimum execution time: 58_120_000 picoseconds. + Weight::from_parts(59_533_000, 0) .saturating_add(Weight::from_parts(0, 3571)) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) @@ -122,14 +140,24 @@ impl pallet_xcm::WeightInfo for WeightInfo { Weight::from_parts(18_446_744_073_709_551_000, 0) .saturating_add(Weight::from_parts(0, 0)) } + /// Storage: `Benchmark::Override` (r:0 w:0) + /// Proof: `Benchmark::Override` (`max_values`: None, `max_size`: None, mode: `Measured`) + fn execute_blob() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 18_446_744_073_709_551_000 picoseconds. + Weight::from_parts(18_446_744_073_709_551_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + } /// Storage: `PolkadotXcm::SupportedVersion` (r:0 w:1) /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) fn force_xcm_version() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_020_000 picoseconds. - Weight::from_parts(7_300_000, 0) + // Minimum execution time: 6_074_000 picoseconds. + Weight::from_parts(6_398_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -139,8 +167,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_022_000 picoseconds. - Weight::from_parts(2_141_000, 0) + // Minimum execution time: 2_036_000 picoseconds. + Weight::from_parts(2_180_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -164,8 +192,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `74` // Estimated: `3539` - // Minimum execution time: 26_893_000 picoseconds. - Weight::from_parts(27_497_000, 0) + // Minimum execution time: 25_014_000 picoseconds. + Weight::from_parts(25_374_000, 0) .saturating_add(Weight::from_parts(0, 3539)) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(5)) @@ -188,8 +216,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `292` // Estimated: `3757` - // Minimum execution time: 29_673_000 picoseconds. - Weight::from_parts(30_693_000, 0) + // Minimum execution time: 27_616_000 picoseconds. + Weight::from_parts(28_499_000, 0) .saturating_add(Weight::from_parts(0, 3757)) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(4)) @@ -200,45 +228,45 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_990_000 picoseconds. - Weight::from_parts(2_105_000, 0) + // Minimum execution time: 2_061_000 picoseconds. + Weight::from_parts(2_153_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } - /// Storage: `PolkadotXcm::SupportedVersion` (r:4 w:2) + /// Storage: `PolkadotXcm::SupportedVersion` (r:5 w:2) /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) fn migrate_supported_version() -> Weight { // Proof Size summary in bytes: - // Measured: `95` - // Estimated: `10985` - // Minimum execution time: 14_819_000 picoseconds. - Weight::from_parts(15_180_000, 0) - .saturating_add(Weight::from_parts(0, 10985)) - .saturating_add(T::DbWeight::get().reads(4)) + // Measured: `89` + // Estimated: `13454` + // Minimum execution time: 16_592_000 picoseconds. + Weight::from_parts(16_900_000, 0) + .saturating_add(Weight::from_parts(0, 13454)) + .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) } - /// Storage: `PolkadotXcm::VersionNotifiers` (r:4 w:2) + /// Storage: `PolkadotXcm::VersionNotifiers` (r:5 w:2) /// Proof: `PolkadotXcm::VersionNotifiers` (`max_values`: None, `max_size`: None, mode: `Measured`) fn migrate_version_notifiers() -> Weight { // Proof Size summary in bytes: - // Measured: `99` - // Estimated: `10989` - // Minimum execution time: 14_935_000 picoseconds. - Weight::from_parts(15_335_000, 0) - .saturating_add(Weight::from_parts(0, 10989)) - .saturating_add(T::DbWeight::get().reads(4)) + // Measured: `93` + // Estimated: `13458` + // Minimum execution time: 16_694_000 picoseconds. + Weight::from_parts(16_905_000, 0) + .saturating_add(Weight::from_parts(0, 13458)) + .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) } - /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:5 w:0) + /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:6 w:0) /// Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) fn already_notified_target() -> Weight { // Proof Size summary in bytes: // Measured: `106` - // Estimated: `13471` - // Minimum execution time: 16_278_000 picoseconds. - Weight::from_parts(16_553_000, 0) - .saturating_add(Weight::from_parts(0, 13471)) - .saturating_add(T::DbWeight::get().reads(5)) + // Estimated: `15946` + // Minimum execution time: 17_779_000 picoseconds. + Weight::from_parts(18_490_000, 0) + .saturating_add(Weight::from_parts(0, 15946)) + .saturating_add(T::DbWeight::get().reads(6)) } /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:2 w:1) /// Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) @@ -256,36 +284,36 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `142` // Estimated: `6082` - // Minimum execution time: 26_360_000 picoseconds. - Weight::from_parts(26_868_000, 0) + // Minimum execution time: 24_526_000 picoseconds. + Weight::from_parts(25_182_000, 0) .saturating_add(Weight::from_parts(0, 6082)) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(3)) } - /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:3 w:0) + /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:4 w:0) /// Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) fn notify_target_migration_fail() -> Weight { // Proof Size summary in bytes: // Measured: `136` - // Estimated: `8551` - // Minimum execution time: 8_615_000 picoseconds. - Weight::from_parts(8_903_000, 0) - .saturating_add(Weight::from_parts(0, 8551)) - .saturating_add(T::DbWeight::get().reads(3)) + // Estimated: `11026` + // Minimum execution time: 10_467_000 picoseconds. + Weight::from_parts(10_934_000, 0) + .saturating_add(Weight::from_parts(0, 11026)) + .saturating_add(T::DbWeight::get().reads(4)) } - /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:4 w:2) + /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:5 w:2) /// Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) fn migrate_version_notify_targets() -> Weight { // Proof Size summary in bytes: - // Measured: `106` - // Estimated: `10996` - // Minimum execution time: 15_284_000 picoseconds. - Weight::from_parts(15_504_000, 0) - .saturating_add(Weight::from_parts(0, 10996)) - .saturating_add(T::DbWeight::get().reads(4)) + // Measured: `100` + // Estimated: `13465` + // Minimum execution time: 16_377_000 picoseconds. + Weight::from_parts(17_114_000, 0) + .saturating_add(Weight::from_parts(0, 13465)) + .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) } - /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:4 w:2) + /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:5 w:2) /// Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) @@ -299,12 +327,12 @@ impl pallet_xcm::WeightInfo for WeightInfo { /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) fn migrate_and_notify_old_targets() -> Weight { // Proof Size summary in bytes: - // Measured: `148` - // Estimated: `11038` - // Minimum execution time: 32_675_000 picoseconds. - Weight::from_parts(33_816_000, 0) - .saturating_add(Weight::from_parts(0, 11038)) - .saturating_add(T::DbWeight::get().reads(9)) + // Measured: `142` + // Estimated: `13507` + // Minimum execution time: 32_575_000 picoseconds. + Weight::from_parts(33_483_000, 0) + .saturating_add(Weight::from_parts(0, 13507)) + .saturating_add(T::DbWeight::get().reads(10)) .saturating_add(T::DbWeight::get().writes(4)) } /// Storage: `PolkadotXcm::QueryCounter` (r:1 w:1) @@ -315,8 +343,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `32` // Estimated: `1517` - // Minimum execution time: 4_058_000 picoseconds. - Weight::from_parts(4_170_000, 0) + // Minimum execution time: 3_604_000 picoseconds. + Weight::from_parts(3_744_000, 0) .saturating_add(Weight::from_parts(0, 1517)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) @@ -327,10 +355,22 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `7669` // Estimated: `11134` - // Minimum execution time: 25_375_000 picoseconds. - Weight::from_parts(26_026_000, 0) + // Minimum execution time: 23_983_000 picoseconds. + Weight::from_parts(24_404_000, 0) .saturating_add(Weight::from_parts(0, 11134)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } + /// Storage: `PolkadotXcm::AssetTraps` (r:1 w:1) + /// Proof: `PolkadotXcm::AssetTraps` (`max_values`: None, `max_size`: None, mode: `Measured`) + fn claim_assets() -> Weight { + // Proof Size summary in bytes: + // Measured: `90` + // Estimated: `3555` + // Minimum execution time: 34_446_000 picoseconds. + Weight::from_parts(35_465_000, 0) + .saturating_add(Weight::from_parts(0, 3555)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } } diff --git a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/xcm/mod.rs b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/xcm/mod.rs index 8815312f3042801306b830a7a48ad659c12100a8..9f79cea831aed66a0d073109233731751cdf99ed 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/xcm/mod.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/xcm/mod.rs @@ -196,7 +196,7 @@ impl XcmWeightInfo for CoretimeRococoXcmWeight { XcmGeneric::::clear_transact_status() } fn universal_origin(_: &Junction) -> Weight { - XcmGeneric::::universal_origin() + Weight::MAX } fn export_message(_: &NetworkId, _: &Junctions, _: &Xcm<()>) -> Weight { Weight::MAX diff --git a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/xcm/pallet_xcm_benchmarks_generic.rs b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/xcm/pallet_xcm_benchmarks_generic.rs index a11d049a3fc5c6e66428063a9b6c0a3626f1f6ae..719e7543e8886a803f773126eafbc77f34749ddb 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/xcm/pallet_xcm_benchmarks_generic.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/xcm/pallet_xcm_benchmarks_generic.rs @@ -312,16 +312,6 @@ impl WeightInfo { // Minimum execution time: 2_082_000 picoseconds. Weight::from_parts(2_144_000, 0) } - // Storage: `ParachainInfo::ParachainId` (r:1 w:0) - // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - pub fn universal_origin() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `1489` - // Minimum execution time: 4_275_000 picoseconds. - Weight::from_parts(4_381_000, 1489) - .saturating_add(T::DbWeight::get().reads(1)) - } pub fn set_fees_mode() -> Weight { // Proof Size summary in bytes: // Measured: `0` diff --git a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/xcm_config.rs b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/xcm_config.rs index 13816f8ce711238433b62400f9e1004ab34b7f76..b0b276128272b66f5b5866f3e40bec957d717e42 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/xcm_config.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/xcm_config.rs @@ -22,12 +22,12 @@ use super::{ use frame_support::{ pallet_prelude::PalletInfoAccess, parameter_types, - traits::{ConstU32, Contains, Equals, Everything, Nothing}, + traits::{tokens::imbalance::ResolveTo, ConstU32, Contains, Equals, Everything, Nothing}, }; use frame_system::EnsureRoot; +use pallet_collator_selection::StakingPotAccountId; use pallet_xcm::XcmPassthrough; use parachains_common::{ - impls::ToStakingPot, xcm_config::{ AllSiblingSystemParachains, ConcreteAssetFromSystem, ParentRelayOrSiblingParachains, RelayOrOtherSystemParachains, @@ -38,17 +38,15 @@ use polkadot_parachain_primitives::primitives::Sibling; use polkadot_runtime_common::xcm_sender::ExponentialPrice; use sp_runtime::traits::AccountIdConversion; use xcm::latest::prelude::*; -#[allow(deprecated)] -use xcm_builder::CurrencyAdapter; use xcm_builder::{ AccountId32Aliases, AllowExplicitUnpaidExecutionFrom, AllowKnownQueryResponses, AllowSubscriptionsFrom, AllowTopLevelPaidExecutionFrom, DenyReserveTransferToRelayChain, - DenyThenTry, EnsureXcmOrigin, FrameTransactionalProcessor, IsConcrete, NonFungibleAdapter, - ParentAsSuperuser, ParentIsPreset, RelayChainAsNative, SiblingParachainAsNative, - SiblingParachainConvertsVia, SignedAccountId32AsNative, SignedToAccountId32, - SovereignSignedViaLocation, TakeWeightCredit, TrailingSetTopicAsId, UsingComponents, - WeightInfoBounds, WithComputedOrigin, WithUniqueTopic, XcmFeeManagerFromComponents, - XcmFeeToAccount, + DenyThenTry, EnsureXcmOrigin, FrameTransactionalProcessor, FungibleAdapter, IsConcrete, + NonFungibleAdapter, ParentAsSuperuser, ParentIsPreset, RelayChainAsNative, + SiblingParachainAsNative, SiblingParachainConvertsVia, SignedAccountId32AsNative, + SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit, TrailingSetTopicAsId, + UsingComponents, WeightInfoBounds, WithComputedOrigin, WithUniqueTopic, + XcmFeeManagerFromComponents, XcmFeeToAccount, }; use xcm_executor::{traits::WithOriginFilter, XcmExecutor}; @@ -79,8 +77,7 @@ pub type LocationToAccountId = ( ); /// Means for transacting the native currency on this chain. -#[allow(deprecated)] -pub type CurrencyTransactor = CurrencyAdapter< +pub type CurrencyTransactor = FungibleAdapter< // Use this currency: Balances, // Use this currency when it is a fungible asset matching the given location or name: @@ -195,7 +192,7 @@ pub type Barrier = TrailingSetTopicAsId< AllowKnownQueryResponses, WithComputedOrigin< ( - // If the message is one that immediately attemps to pay for execution, then + // If the message is one that immediately attempts to pay for execution, then // allow it. AllowTopLevelPaidExecutionFrom, // Parent and its pluralities (i.e. governance bodies) get free execution. @@ -240,8 +237,13 @@ impl xcm_executor::Config for XcmConfig { RuntimeCall, MaxInstructions, >; - type Trader = - UsingComponents>; + type Trader = UsingComponents< + WeightToFee, + RocRelayLocation, + AccountId, + Balances, + ResolveTo, Balances>, + >; type ResponseHandler = PolkadotXcm; type AssetTrap = PolkadotXcm; type AssetClaims = PolkadotXcm; @@ -260,6 +262,9 @@ impl xcm_executor::Config for XcmConfig { type SafeCallFilter = SafeCallFilter; type Aliasers = Nothing; type TransactionalProcessor = FrameTransactionalProcessor; + type HrmpNewChannelOpenRequestHandler = (); + type HrmpChannelAcceptedHandler = (); + type HrmpChannelClosingHandler = (); } /// Converts a local signed origin into an XCM location. Forms the basis for local origins @@ -283,10 +288,9 @@ impl pallet_xcm::Config for Runtime { // We want to disallow users sending (arbitrary) XCM programs from this chain. type SendXcmOrigin = EnsureXcmOrigin; type XcmRouter = XcmRouter; - // We support local origins dispatching XCM executions in principle... + // We support local origins dispatching XCM executions. type ExecuteXcmOrigin = EnsureXcmOrigin; - // ... but disallow generic XCM execution. As a result only teleports are allowed. - type XcmExecuteFilter = Nothing; + type XcmExecuteFilter = Everything; type XcmExecutor = XcmExecutor; type XcmTeleportFilter = Everything; type XcmReserveTransferFilter = Nothing; // This parachain is not meant as a reserve location. diff --git a/cumulus/parachains/runtimes/coretime/coretime-westend/Cargo.toml b/cumulus/parachains/runtimes/coretime/coretime-westend/Cargo.toml index f85f6896cbe8f683e7f8b81e2c918d4ed53381b7..60cc7e2f765477052332b4c422facb8b19e1f5a4 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-westend/Cargo.toml +++ b/cumulus/parachains/runtimes/coretime/coretime-westend/Cargo.toml @@ -15,9 +15,9 @@ substrate-wasm-builder = { path = "../../../../../substrate/utils/wasm-builder", [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } hex-literal = "0.4.1" -log = { version = "0.4.20", default-features = false } +log = { workspace = true } scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.195", optional = true, features = ["derive"] } +serde = { optional = true, features = ["derive"], workspace = true, default-features = true } # Substrate frame-benchmarking = { path = "../../../../../substrate/frame/benchmarking", default-features = false, optional = true } @@ -31,9 +31,9 @@ pallet-aura = { path = "../../../../../substrate/frame/aura", default-features = pallet-authorship = { path = "../../../../../substrate/frame/authorship", default-features = false } pallet-balances = { path = "../../../../../substrate/frame/balances", default-features = false } pallet-message-queue = { path = "../../../../../substrate/frame/message-queue", default-features = false } +pallet-broker = { path = "../../../../../substrate/frame/broker", default-features = false } pallet-multisig = { path = "../../../../../substrate/frame/multisig", default-features = false } pallet-session = { path = "../../../../../substrate/frame/session", default-features = false } -pallet-sudo = { path = "../../../../../substrate/frame/sudo", default-features = false } pallet-timestamp = { path = "../../../../../substrate/frame/timestamp", default-features = false } pallet-transaction-payment = { path = "../../../../../substrate/frame/transaction-payment", default-features = false } pallet-transaction-payment-rpc-runtime-api = { path = "../../../../../substrate/frame/transaction-payment/rpc/runtime-api", default-features = false } @@ -55,7 +55,6 @@ sp-version = { path = "../../../../../substrate/primitives/version", default-fea # Polkadot pallet-xcm = { path = "../../../../../polkadot/xcm/pallet-xcm", default-features = false } pallet-xcm-benchmarks = { path = "../../../../../polkadot/xcm/pallet-xcm-benchmarks", default-features = false, optional = true } -polkadot-core-primitives = { path = "../../../../../polkadot/core-primitives", default-features = false } polkadot-parachain-primitives = { path = "../../../../../polkadot/parachain", default-features = false } polkadot-runtime-common = { path = "../../../../../polkadot/runtime/common", default-features = false } westend-runtime-constants = { path = "../../../../../polkadot/runtime/westend/constants", default-features = false } @@ -72,6 +71,8 @@ cumulus-pallet-xcmp-queue = { path = "../../../../pallets/xcmp-queue", default-f cumulus-primitives-aura = { path = "../../../../primitives/aura", default-features = false } cumulus-primitives-core = { path = "../../../../primitives/core", default-features = false } cumulus-primitives-utility = { path = "../../../../primitives/utility", default-features = false } +cumulus-primitives-storage-weight-reclaim = { path = "../../../../primitives/storage-weight-reclaim", default-features = false } + pallet-collator-selection = { path = "../../../../pallets/collator-selection", default-features = false } parachain-info = { package = "staging-parachain-info", path = "../../../pallets/parachain-info", default-features = false } parachains-common = { path = "../../../common", default-features = false } @@ -88,6 +89,7 @@ std = [ "cumulus-pallet-xcmp-queue/std", "cumulus-primitives-aura/std", "cumulus-primitives-core/std", + "cumulus-primitives-storage-weight-reclaim/std", "cumulus-primitives-utility/std", "frame-benchmarking?/std", "frame-executive/std", @@ -100,11 +102,11 @@ std = [ "pallet-aura/std", "pallet-authorship/std", "pallet-balances/std", + "pallet-broker/std", "pallet-collator-selection/std", "pallet-message-queue/std", "pallet-multisig/std", "pallet-session/std", - "pallet-sudo/std", "pallet-timestamp/std", "pallet-transaction-payment-rpc-runtime-api/std", "pallet-transaction-payment/std", @@ -113,7 +115,6 @@ std = [ "pallet-xcm/std", "parachain-info/std", "parachains-common/std", - "polkadot-core-primitives/std", "polkadot-parachain-primitives/std", "polkadot-runtime-common/std", "scale-info/std", @@ -150,10 +151,10 @@ runtime-benchmarks = [ "frame-system-benchmarking/runtime-benchmarks", "frame-system/runtime-benchmarks", "pallet-balances/runtime-benchmarks", + "pallet-broker/runtime-benchmarks", "pallet-collator-selection/runtime-benchmarks", "pallet-message-queue/runtime-benchmarks", "pallet-multisig/runtime-benchmarks", - "pallet-sudo/runtime-benchmarks", "pallet-timestamp/runtime-benchmarks", "pallet-utility/runtime-benchmarks", "pallet-xcm-benchmarks/runtime-benchmarks", @@ -178,11 +179,11 @@ try-runtime = [ "pallet-aura/try-runtime", "pallet-authorship/try-runtime", "pallet-balances/try-runtime", + "pallet-broker/try-runtime", "pallet-collator-selection/try-runtime", "pallet-message-queue/try-runtime", "pallet-multisig/try-runtime", "pallet-session/try-runtime", - "pallet-sudo/try-runtime", "pallet-timestamp/try-runtime", "pallet-transaction-payment/try-runtime", "pallet-utility/try-runtime", @@ -192,4 +193,4 @@ try-runtime = [ "sp-runtime/try-runtime", ] -experimental = ["pallet-aura/experimental"] +fast-runtime = [] diff --git a/cumulus/parachains/runtimes/coretime/coretime-westend/build.rs b/cumulus/parachains/runtimes/coretime/coretime-westend/build.rs index 60f8a125129ff1344a1799246e931acdb1d139d5..28dacd20cf305ebdbc57eb2a30e3c98e4f8853d9 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-westend/build.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-westend/build.rs @@ -19,7 +19,15 @@ fn main() { .with_current_project() .export_heap_base() .import_memory() - .build() + .build(); + + substrate_wasm_builder::WasmBuilder::new() + .with_current_project() + .set_file_name("fast_runtime_binary.rs") + .enable_feature("fast-runtime") + .import_memory() + .export_heap_base() + .build(); } #[cfg(not(feature = "std"))] diff --git a/cumulus/parachains/runtimes/coretime/coretime-westend/src/coretime.rs b/cumulus/parachains/runtimes/coretime/coretime-westend/src/coretime.rs new file mode 100644 index 0000000000000000000000000000000000000000..41cbc62fa2115ff3828e6910b750622a91ff0251 --- /dev/null +++ b/cumulus/parachains/runtimes/coretime/coretime-westend/src/coretime.rs @@ -0,0 +1,249 @@ +// Copyright 2022 Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Cumulus is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Cumulus. If not, see . + +use crate::*; +use codec::{Decode, Encode}; +use cumulus_pallet_parachain_system::RelaychainDataProvider; +use cumulus_primitives_core::relay_chain; +use frame_support::{ + parameter_types, + traits::{ + fungible::{Balanced, Credit}, + OnUnbalanced, + }, +}; +use pallet_broker::{CoreAssignment, CoreIndex, CoretimeInterface, PartsOf57600, RCBlockNumberOf}; +use parachains_common::{AccountId, Balance, BlockNumber}; +use xcm::latest::prelude::*; + +pub struct CreditToCollatorPot; +impl OnUnbalanced> for CreditToCollatorPot { + fn on_nonzero_unbalanced(credit: Credit) { + let staking_pot = CollatorSelection::account_id(); + let _ = >::resolve(&staking_pot, credit); + } +} + +/// A type containing the encoding of the coretime pallet in the Relay chain runtime. Used to +/// construct any remote calls. The codec index must correspond to the index of `Coretime` in the +/// `construct_runtime` of the Relay chain. +#[derive(Encode, Decode)] +enum RelayRuntimePallets { + #[codec(index = 66)] + Coretime(CoretimeProviderCalls), +} + +/// Call encoding for the calls needed from the relay coretime pallet. +#[derive(Encode, Decode)] +enum CoretimeProviderCalls { + #[codec(index = 1)] + RequestCoreCount(CoreIndex), + #[codec(index = 2)] + RequestRevenueInfoAt(relay_chain::BlockNumber), + #[codec(index = 3)] + CreditAccount(AccountId, Balance), + #[codec(index = 4)] + AssignCore( + CoreIndex, + relay_chain::BlockNumber, + Vec<(CoreAssignment, PartsOf57600)>, + Option, + ), +} + +parameter_types! { + pub const BrokerPalletId: PalletId = PalletId(*b"py/broke"); +} + +parameter_types! { + pub storage CoreCount: Option = None; + pub storage CoretimeRevenue: Option<(BlockNumber, Balance)> = None; +} + +/// Type that implements the `CoretimeInterface` for the allocation of Coretime. Meant to operate +/// from the parachain context. That is, the parachain provides a market (broker) for the sale of +/// coretime, but assumes a `CoretimeProvider` (i.e. a Relay Chain) to actually provide cores. +pub struct CoretimeAllocator; +impl CoretimeInterface for CoretimeAllocator { + type AccountId = AccountId; + type Balance = Balance; + type RelayChainBlockNumberProvider = RelaychainDataProvider; + + fn request_core_count(count: CoreIndex) { + use crate::coretime::CoretimeProviderCalls::RequestCoreCount; + let request_core_count_call = RelayRuntimePallets::Coretime(RequestCoreCount(count)); + + // Weight for `request_core_count` from westend benchmarks: + // `ref_time` = 7889000 + (3 * 25000000) + (1 * 100000000) = 182889000 + // `proof_size` = 1636 + // Add 5% to each component and round to 2 significant figures. + let call_weight = Weight::from_parts(190_000_000, 1700); + + let message = Xcm(vec![ + Instruction::UnpaidExecution { + weight_limit: WeightLimit::Unlimited, + check_origin: None, + }, + Instruction::Transact { + origin_kind: OriginKind::Native, + require_weight_at_most: call_weight, + call: request_core_count_call.encode().into(), + }, + ]); + + match PolkadotXcm::send_xcm(Here, Location::parent(), message.clone()) { + Ok(_) => log::debug!( + target: "runtime::coretime", + "Request to update schedulable cores sent successfully." + ), + Err(e) => log::error!( + target: "runtime::coretime", + "Failed to send request to update schedulable cores: {:?}", + e + ), + } + } + + fn request_revenue_info_at(when: RCBlockNumberOf) { + use crate::coretime::CoretimeProviderCalls::RequestRevenueInfoAt; + let request_revenue_info_at_call = + RelayRuntimePallets::Coretime(RequestRevenueInfoAt(when)); + + let message = Xcm(vec![ + Instruction::UnpaidExecution { + weight_limit: WeightLimit::Unlimited, + check_origin: None, + }, + Instruction::Transact { + origin_kind: OriginKind::Native, + require_weight_at_most: Weight::from_parts(1000000000, 200000), + call: request_revenue_info_at_call.encode().into(), + }, + ]); + + match PolkadotXcm::send_xcm(Here, Location::parent(), message.clone()) { + Ok(_) => log::debug!( + target: "runtime::coretime", + "Request for revenue information sent successfully." + ), + Err(e) => log::error!( + target: "runtime::coretime", + "Request for revenue information failed to send: {:?}", + e + ), + } + } + + fn credit_account(who: Self::AccountId, amount: Self::Balance) { + use crate::coretime::CoretimeProviderCalls::CreditAccount; + let credit_account_call = RelayRuntimePallets::Coretime(CreditAccount(who, amount)); + + let message = Xcm(vec![ + Instruction::UnpaidExecution { + weight_limit: WeightLimit::Unlimited, + check_origin: None, + }, + Instruction::Transact { + origin_kind: OriginKind::Native, + require_weight_at_most: Weight::from_parts(1000000000, 200000), + call: credit_account_call.encode().into(), + }, + ]); + + match PolkadotXcm::send_xcm(Here, Location::parent(), message.clone()) { + Ok(_) => log::debug!( + target: "runtime::coretime", + "Instruction to credit account sent successfully." + ), + Err(e) => log::error!( + target: "runtime::coretime", + "Instruction to credit account failed to send: {:?}", + e + ), + } + } + + fn assign_core( + core: CoreIndex, + begin: RCBlockNumberOf, + assignment: Vec<(CoreAssignment, PartsOf57600)>, + end_hint: Option>, + ) { + use crate::coretime::CoretimeProviderCalls::AssignCore; + let assign_core_call = + RelayRuntimePallets::Coretime(AssignCore(core, begin, assignment, end_hint)); + + // Weight for `assign_core` from westend benchmarks: + // `ref_time` = 10177115 + (1 * 25000000) + (2 * 100000000) + (57600 * 13932) = 937660315 + // `proof_size` = 3612 + // Add 5% to each component and round to 2 significant figures. + let call_weight = Weight::from_parts(980_000_000, 3800); + + let message = Xcm(vec![ + Instruction::UnpaidExecution { + weight_limit: WeightLimit::Unlimited, + check_origin: None, + }, + Instruction::Transact { + origin_kind: OriginKind::Native, + require_weight_at_most: call_weight, + call: assign_core_call.encode().into(), + }, + ]); + + match PolkadotXcm::send_xcm(Here, Location::parent(), message.clone()) { + Ok(_) => log::debug!( + target: "runtime::coretime", + "Core assignment sent successfully." + ), + Err(e) => log::error!( + target: "runtime::coretime", + "Core assignment failed to send: {:?}", + e + ), + } + } + + fn check_notify_revenue_info() -> Option<(RCBlockNumberOf, Self::Balance)> { + let revenue = CoretimeRevenue::get(); + CoretimeRevenue::set(&None); + revenue + } + + #[cfg(feature = "runtime-benchmarks")] + fn ensure_notify_revenue_info(when: RCBlockNumberOf, revenue: Self::Balance) { + CoretimeRevenue::set(&Some((when, revenue))); + } +} + +impl pallet_broker::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type Currency = Balances; + type OnRevenue = CreditToCollatorPot; + #[cfg(feature = "fast-runtime")] + type TimeslicePeriod = ConstU32<10>; + #[cfg(not(feature = "fast-runtime"))] + type TimeslicePeriod = ConstU32<80>; + // We don't actually need any leases at launch but set to 10 in case we want to sudo some in. + type MaxLeasedCores = ConstU32<10>; + type MaxReservedCores = ConstU32<10>; + type Coretime = CoretimeAllocator; + type ConvertBalance = sp_runtime::traits::Identity; + type WeightInfo = weights::pallet_broker::WeightInfo; + type PalletId = BrokerPalletId; + type AdminOrigin = EnsureRoot; + type PriceAdapter = pallet_broker::Linear; +} diff --git a/cumulus/parachains/runtimes/coretime/coretime-westend/src/lib.rs b/cumulus/parachains/runtimes/coretime/coretime-westend/src/lib.rs index 1393f235b4097dc1fbdcba83eb62e4e88d943250..c9b665ee0c2517eef78bbecae7d2db5b22790a70 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-westend/src/lib.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-westend/src/lib.rs @@ -21,6 +21,15 @@ #[cfg(feature = "std")] include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs")); +/// Provides the `WASM_BINARY` build with `fast-runtime` feature enabled. +/// +/// This is for example useful for local test chains. +#[cfg(feature = "std")] +pub mod fast_runtime_binary { + include!(concat!(env!("OUT_DIR"), "/fast_runtime_binary.rs")); +} + +mod coretime; mod weights; pub mod xcm_config; @@ -29,7 +38,7 @@ use cumulus_primitives_core::{AggregateMessageOrigin, ParaId}; use frame_support::{ construct_runtime, derive_impl, dispatch::DispatchClass, - genesis_builder_helper::{build_config, create_default_config}, + genesis_builder_helper::{build_state, get_preset}, parameter_types, traits::{ConstBool, ConstU32, ConstU64, ConstU8, EitherOfDiverse, TransformOrigin}, weights::{ConstantMultiplier, Weight}, @@ -55,7 +64,7 @@ use sp_runtime::{ create_runtime_str, generic, impl_opaque_keys, traits::Block as BlockT, transaction_validity::{TransactionSource, TransactionValidity}, - ApplyExtrinsicResult, MultiAddress, Perbill, + ApplyExtrinsicResult, DispatchError, MultiAddress, Perbill, }; use sp_std::prelude::*; #[cfg(feature = "std")] @@ -65,7 +74,7 @@ use testnet_parachains_constants::westend::{consensus::*, currency::*, fee::Weig use weights::{BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight}; use xcm::latest::prelude::*; use xcm_config::{ - FellowshipLocation, GovernanceLocation, WndRelayLocation, XcmOriginToTransactDispatchOrigin, + FellowshipLocation, GovernanceLocation, TokenRelayLocation, XcmOriginToTransactDispatchOrigin, }; /// The address format for describing accounts. @@ -90,6 +99,7 @@ pub type SignedExtra = ( frame_system::CheckNonce, frame_system::CheckWeight, pallet_transaction_payment::ChargeTransactionPayment, + cumulus_primitives_storage_weight_reclaim::StorageWeightReclaim, ); /// Unchecked extrinsic type as expected by this runtime. @@ -97,7 +107,11 @@ pub type UncheckedExtrinsic = generic::UncheckedExtrinsic; /// Migrations to apply on runtime upgrade. -pub type Migrations = (); +pub type Migrations = ( + cumulus_pallet_xcmp_queue::migration::v4::MigrationToV4, + // permanent + pallet_xcm::migration::MigrateToLatestXcmVersion, +); /// Executive: handles dispatch to the various modules. pub type Executive = frame_executive::Executive< @@ -120,7 +134,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("coretime-westend"), impl_name: create_runtime_str!("coretime-westend"), authoring_version: 1, - spec_version: 1_006_000, + spec_version: 1_010_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 0, @@ -159,7 +173,7 @@ parameter_types! { } // Configure FRAME pallets to include in runtime. -#[derive_impl(frame_system::config_preludes::ParaChainDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::ParaChainDefaultConfig)] impl frame_system::Config for Runtime { /// The identifier used to distinguish between accounts. type AccountId = AccountId; @@ -193,10 +207,7 @@ impl pallet_timestamp::Config for Runtime { /// A timestamp: milliseconds since the unix epoch. type Moment = u64; type OnTimestampSet = Aura; - #[cfg(feature = "experimental")] type MinimumPeriod = ConstU64<0>; - #[cfg(not(feature = "experimental"))] - type MinimumPeriod = ConstU64<{ SLOT_DURATION / 2 }>; type WeightInfo = weights::pallet_timestamp::WeightInfo; } @@ -233,7 +244,7 @@ parameter_types! { impl pallet_transaction_payment::Config for Runtime { type RuntimeEvent = RuntimeEvent; type OnChargeTransaction = - pallet_transaction_payment::CurrencyAdapter>; + pallet_transaction_payment::FungibleAdapter>; type OperationalFeeMultiplier = ConstU8<5>; type WeightToFee = WeightToFee; type LengthToFee = ConstantMultiplier; @@ -267,8 +278,6 @@ type ConsensusHook = cumulus_pallet_aura_ext::FixedVelocityConsensusHook< UNINCLUDED_SEGMENT_CAPACITY, >; -impl parachain_info::Config for Runtime {} - parameter_types! { pub MessageQueueServiceWeight: Weight = Perbill::from_percent(35) * RuntimeBlockWeights::get().max_block; } @@ -293,8 +302,11 @@ impl pallet_message_queue::Config for Runtime { type HeapSize = sp_core::ConstU32<{ 64 * 1024 }>; type MaxStale = sp_core::ConstU32<8>; type ServiceWeight = MessageQueueServiceWeight; + type IdleMaxServiceWeight = MessageQueueServiceWeight; } +impl parachain_info::Config for Runtime {} + impl cumulus_pallet_aura_ext::Config for Runtime {} parameter_types! { @@ -310,7 +322,7 @@ pub type RootOrFellows = EitherOfDiverse< parameter_types! { /// The asset ID for the asset that we use to pay for message delivery fees. - pub FeeAssetId: AssetId = AssetId(WndRelayLocation::get()); + pub FeeAssetId: AssetId = AssetId(TokenRelayLocation::get()); /// The base fee for the message delivery fees. pub const BaseDeliveryFee: u128 = CENTS.saturating_mul(3); } @@ -356,7 +368,6 @@ impl pallet_aura::Config for Runtime { type DisabledValidators = (); type MaxAuthorities = ConstU32<100_000>; type AllowMultipleBlocksPerSlot = ConstBool; - #[cfg(feature = "experimental")] type SlotDuration = ConstU64; } @@ -413,12 +424,6 @@ impl pallet_utility::Config for Runtime { type WeightInfo = weights::pallet_utility::WeightInfo; } -impl pallet_sudo::Config for Runtime { - type RuntimeCall = RuntimeCall; - type RuntimeEvent = RuntimeEvent; - type WeightInfo = pallet_sudo::weights::SubstrateWeight; -} - // Create the runtime by composing the FRAME pallets that were previously configured. construct_runtime!( pub enum Runtime @@ -450,8 +455,8 @@ construct_runtime!( Utility: pallet_utility = 40, Multisig: pallet_multisig = 41, - // Sudo - Sudo: pallet_sudo = 100, + // The main stage. + Broker: pallet_broker = 50, } ); @@ -462,6 +467,7 @@ mod benches { [cumulus_pallet_parachain_system, ParachainSystem] [pallet_timestamp, Timestamp] [pallet_balances, Balances] + [pallet_broker, Broker] [pallet_collator_selection, CollatorSelection] [pallet_session, SessionBench::] [cumulus_pallet_xcmp_queue, XcmpQueue] @@ -482,7 +488,7 @@ impl_runtime_apis! { } fn authorities() -> Vec { - Aura::authorities().into_inner() + pallet_aura::Authorities::::get().into_inner() } } @@ -504,7 +510,7 @@ impl_runtime_apis! { Executive::execute_block(block) } - fn initialize_block(header: &::Header) { + fn initialize_block(header: &::Header) -> sp_runtime::ExtrinsicInclusionMode { Executive::initialize_block(header) } } @@ -578,6 +584,12 @@ impl_runtime_apis! { } } + impl pallet_broker::runtime_api::BrokerApi for Runtime { + fn sale_price() -> Result { + Broker::current_price() + } + } + impl pallet_transaction_payment_rpc_runtime_api::TransactionPaymentApi for Runtime { fn query_info( uxt: ::Extrinsic, @@ -693,10 +705,16 @@ impl_runtime_apis! { impl cumulus_pallet_session_benchmarking::Config for Runtime {} use xcm::latest::prelude::*; - use xcm_config::WndRelayLocation; + use xcm_config::TokenRelayLocation; use pallet_xcm::benchmarking::Pallet as PalletXcmExtrinsicsBenchmark; impl pallet_xcm::benchmarking::Config for Runtime { + type DeliveryHelper = cumulus_primitives_utility::ToParentDeliveryHelper< + xcm_config::XcmConfig, + ExistentialDepositAsset, + xcm_config::PriceForParentDelivery, + >; + fn reachable_dest() -> Option { Some(Parent.into()) } @@ -705,7 +723,7 @@ impl_runtime_apis! { // Relay/native token can be teleported between AH and Relay. Some(( Asset { - fun: Fungible(EXISTENTIAL_DEPOSIT), + fun: Fungible(ExistentialDeposit::get()), id: AssetId(Parent.into()) }, Parent.into(), @@ -716,11 +734,18 @@ impl_runtime_apis! { // Reserve transfers are disabled None } + + fn get_asset() -> Asset { + Asset { + id: AssetId(Location::parent()), + fun: Fungible(ExistentialDeposit::get()), + } + } } parameter_types! { pub ExistentialDepositAsset: Option = Some(( - WndRelayLocation::get(), + TokenRelayLocation::get(), ExistentialDeposit::get() ).into()); } @@ -734,13 +759,13 @@ impl_runtime_apis! { >; type AccountIdConverter = xcm_config::LocationToAccountId; fn valid_destination() -> Result { - Ok(WndRelayLocation::get()) + Ok(TokenRelayLocation::get()) } fn worst_case_holding(_depositable_count: u32) -> Assets { // just concrete assets according to relay chain. let assets: Vec = vec![ Asset { - id: AssetId(WndRelayLocation::get()), + id: AssetId(TokenRelayLocation::get()), fun: Fungible(1_000_000 * UNITS), } ]; @@ -750,8 +775,8 @@ impl_runtime_apis! { parameter_types! { pub const TrustedTeleporter: Option<(Location, Asset)> = Some(( - WndRelayLocation::get(), - Asset { fun: Fungible(UNITS), id: AssetId(WndRelayLocation::get()) }, + TokenRelayLocation::get(), + Asset { fun: Fungible(UNITS), id: AssetId(TokenRelayLocation::get()) }, )); pub const CheckedAccount: Option<(AccountId, xcm_builder::MintLocation)> = None; pub const TrustedReserve: Option<(Location, Asset)> = None; @@ -766,7 +791,7 @@ impl_runtime_apis! { fn get_asset() -> Asset { Asset { - id: AssetId(WndRelayLocation::get()), + id: AssetId(TokenRelayLocation::get()), fun: Fungible(UNITS), } } @@ -789,23 +814,23 @@ impl_runtime_apis! { } fn transact_origin_and_runtime_call() -> Result<(Location, RuntimeCall), BenchmarkError> { - Ok((WndRelayLocation::get(), frame_system::Call::remark_with_event { remark: vec![] }.into())) + Ok((TokenRelayLocation::get(), frame_system::Call::remark_with_event { remark: vec![] }.into())) } fn subscribe_origin() -> Result { - Ok(WndRelayLocation::get()) + Ok(TokenRelayLocation::get()) } fn claimable_asset() -> Result<(Location, Location, Assets), BenchmarkError> { - let origin = WndRelayLocation::get(); - let assets: Assets = (AssetId(WndRelayLocation::get()), 1_000 * UNITS).into(); + let origin = TokenRelayLocation::get(); + let assets: Assets = (AssetId(TokenRelayLocation::get()), 1_000 * UNITS).into(); let ticket = Location { parents: 0, interior: Here }; Ok((origin, ticket, assets)) } fn fee_asset() -> Result { Ok(Asset { - id: AssetId(WndRelayLocation::get()), + id: AssetId(TokenRelayLocation::get()), fun: Fungible(1_000_000 * UNITS), }) } @@ -849,12 +874,16 @@ impl_runtime_apis! { } impl sp_genesis_builder::GenesisBuilder for Runtime { - fn create_default_config() -> Vec { - create_default_config::() + fn build_state(config: Vec) -> sp_genesis_builder::Result { + build_state::(config) + } + + fn get_preset(id: &Option) -> Option> { + get_preset::(id, |_| None) } - fn build_config(config: Vec) -> sp_genesis_builder::Result { - build_config::(config) + fn preset_names() -> Vec { + vec![] } } } diff --git a/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/cumulus_pallet_parachain_system.rs b/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/cumulus_pallet_parachain_system.rs index 0303151d7f83dfc5957e7346b1c4ef2950b6dc01..1c9119361985cd541ca42dce6eb8d2f355a29c6c 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/cumulus_pallet_parachain_system.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/cumulus_pallet_parachain_system.rs @@ -1,4 +1,4 @@ -// Copyright Parity Technologies (UK) Ltd. +// Copyright (C) Parity Technologies (UK) Ltd. // This file is part of Cumulus. // Cumulus is free software: you can redistribute it and/or modify @@ -14,6 +14,31 @@ // You should have received a copy of the GNU General Public License // along with Cumulus. If not, see . +//! Autogenerated weights for `cumulus_pallet_parachain_system` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-02-08, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `runner-bn-ce5rx-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("coretime-westend-dev")`, DB CACHE: 1024 + +// Executed Command: +// ./target/production/polkadot-parachain +// benchmark +// pallet +// --chain=coretime-westend-dev +// --wasm-execution=compiled +// --pallet=cumulus_pallet_parachain_system +// --no-storage-info +// --no-median-slopes +// --no-min-squares +// --extrinsic=* +// --steps=50 +// --repeat=20 +// --json +// --header=./cumulus/file_header.txt +// --output=./cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/ + #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] #![allow(unused_imports)] @@ -22,32 +47,31 @@ use frame_support::{traits::Get, weights::Weight}; use core::marker::PhantomData; -/// Weight functions for `cumulus_pallet_xcmp_queue`. +/// Weight functions for `cumulus_pallet_parachain_system`. pub struct WeightInfo(PhantomData); impl cumulus_pallet_parachain_system::WeightInfo for WeightInfo { - /// Storage: ParachainSystem LastDmqMqcHead (r:1 w:1) - /// Proof Skipped: ParachainSystem LastDmqMqcHead (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ParachainSystem ReservedDmpWeightOverride (r:1 w:0) - /// Proof Skipped: ParachainSystem ReservedDmpWeightOverride (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: MessageQueue BookStateFor (r:1 w:1) - /// Proof: MessageQueue BookStateFor (max_values: None, max_size: Some(52), added: 2527, mode: MaxEncodedLen) - /// Storage: MessageQueue ServiceHead (r:1 w:1) - /// Proof: MessageQueue ServiceHead (max_values: Some(1), max_size: Some(5), added: 500, mode: MaxEncodedLen) - /// Storage: ParachainSystem ProcessedDownwardMessages (r:0 w:1) - /// Proof Skipped: ParachainSystem ProcessedDownwardMessages (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: MessageQueue Pages (r:0 w:16) - /// Proof: MessageQueue Pages (max_values: None, max_size: Some(65585), added: 68060, mode: MaxEncodedLen) + /// Storage: `ParachainSystem::LastDmqMqcHead` (r:1 w:1) + /// Proof: `ParachainSystem::LastDmqMqcHead` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `MessageQueue::BookStateFor` (r:1 w:1) + /// Proof: `MessageQueue::BookStateFor` (`max_values`: None, `max_size`: Some(52), added: 2527, mode: `MaxEncodedLen`) + /// Storage: `MessageQueue::ServiceHead` (r:1 w:1) + /// Proof: `MessageQueue::ServiceHead` (`max_values`: Some(1), `max_size`: Some(5), added: 500, mode: `MaxEncodedLen`) + /// Storage: `ParachainSystem::ProcessedDownwardMessages` (r:0 w:1) + /// Proof: `ParachainSystem::ProcessedDownwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `MessageQueue::Pages` (r:0 w:1000) + /// Proof: `MessageQueue::Pages` (`max_values`: None, `max_size`: Some(65585), added: 68060, mode: `MaxEncodedLen`) /// The range of component `n` is `[0, 1000]`. fn enqueue_inbound_downward_messages(n: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `12` - // Estimated: `8013` - // Minimum execution time: 1_645_000 picoseconds. - Weight::from_parts(1_717_000, 0) - .saturating_add(Weight::from_parts(0, 8013)) - // Standard Error: 12_258 - .saturating_add(Weight::from_parts(24_890_934, 0).saturating_mul(n.into())) - .saturating_add(T::DbWeight::get().reads(4)) + // Measured: `48` + // Estimated: `3517` + // Minimum execution time: 2_080_000 picoseconds. + Weight::from_parts(2_157_000, 0) + .saturating_add(Weight::from_parts(0, 3517)) + // Standard Error: 33_906 + .saturating_add(Weight::from_parts(196_603_239, 0).saturating_mul(n.into())) + .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(4)) + .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(n.into()))) } -} \ No newline at end of file +} diff --git a/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/cumulus_pallet_xcmp_queue.rs b/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/cumulus_pallet_xcmp_queue.rs index 124571118aa129e1489aaaf1ebeabbde41ed13c4..0b0524339aa761053a7c559a3a2ab725c0cb6c22 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/cumulus_pallet_xcmp_queue.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/cumulus_pallet_xcmp_queue.rs @@ -1,4 +1,4 @@ -// Copyright Parity Technologies (UK) Ltd. +// Copyright (C) Parity Technologies (UK) Ltd. // This file is part of Cumulus. // Cumulus is free software: you can redistribute it and/or modify @@ -16,26 +16,28 @@ //! Autogenerated weights for `cumulus_pallet_xcmp_queue` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-02-08, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("coretime-westend-dev"), DB CACHE: 1024 +//! HOSTNAME: `runner-bn-ce5rx-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("coretime-westend-dev")`, DB CACHE: 1024 // Executed Command: -// ./artifacts/westend-parachain +// ./target/production/polkadot-parachain // benchmark // pallet // --chain=coretime-westend-dev -// --execution=wasm // --wasm-execution=compiled // --pallet=cumulus_pallet_xcmp_queue +// --no-storage-info +// --no-median-slopes +// --no-min-squares // --extrinsic=* // --steps=50 // --repeat=20 // --json -// --header=./file_header.txt -// --output=./cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/cumulus_pallet_xcmp_queue.rs +// --header=./cumulus/file_header.txt +// --output=./cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -48,14 +50,14 @@ use core::marker::PhantomData; /// Weight functions for `cumulus_pallet_xcmp_queue`. pub struct WeightInfo(PhantomData); impl cumulus_pallet_xcmp_queue::WeightInfo for WeightInfo { - /// Storage: XcmpQueue QueueConfig (r:1 w:1) - /// Proof Skipped: XcmpQueue QueueConfig (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: `XcmpQueue::QueueConfig` (r:1 w:1) + /// Proof: `XcmpQueue::QueueConfig` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) fn set_config_with_u32() -> Weight { // Proof Size summary in bytes: // Measured: `76` // Estimated: `1561` - // Minimum execution time: 5_621_000 picoseconds. - Weight::from_parts(5_845_000, 0) + // Minimum execution time: 3_796_000 picoseconds. + Weight::from_parts(4_027_000, 0) .saturating_add(Weight::from_parts(0, 1561)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -74,8 +76,8 @@ impl cumulus_pallet_xcmp_queue::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `82` // Estimated: `3517` - // Minimum execution time: 14_000_000 picoseconds. - Weight::from_parts(15_000_000, 0) + // Minimum execution time: 9_990_000 picoseconds. + Weight::from_parts(10_439_000, 0) .saturating_add(Weight::from_parts(0, 3517)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(3)) @@ -86,8 +88,8 @@ impl cumulus_pallet_xcmp_queue::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `76` // Estimated: `1561` - // Minimum execution time: 3_000_000 picoseconds. - Weight::from_parts(3_000_000, 0) + // Minimum execution time: 2_394_000 picoseconds. + Weight::from_parts(2_493_000, 0) .saturating_add(Weight::from_parts(0, 1561)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -98,8 +100,8 @@ impl cumulus_pallet_xcmp_queue::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `111` // Estimated: `1596` - // Minimum execution time: 4_000_000 picoseconds. - Weight::from_parts(4_000_000, 0) + // Minimum execution time: 3_283_000 picoseconds. + Weight::from_parts(3_388_000, 0) .saturating_add(Weight::from_parts(0, 1596)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -108,14 +110,14 @@ impl cumulus_pallet_xcmp_queue::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 44_000_000 picoseconds. - Weight::from_parts(45_000_000, 0) + // Minimum execution time: 5_974_000 picoseconds. + Weight::from_parts(6_166_000, 0) .saturating_add(Weight::from_parts(0, 0)) } /// Storage: UNKNOWN KEY `0x7b3237373ffdfeb1cab4222e3b520d6b345d8e88afa015075c945637c07e8f20` (r:1 w:1) /// Proof: UNKNOWN KEY `0x7b3237373ffdfeb1cab4222e3b520d6b345d8e88afa015075c945637c07e8f20` (r:1 w:1) - /// Storage: `XcmpQueue::InboundXcmpMessages` (r:1 w:1) - /// Proof: `XcmpQueue::InboundXcmpMessages` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: UNKNOWN KEY `0x7b3237373ffdfeb1cab4222e3b520d6bedc49980ba3aa32b0a189290fd036649` (r:1 w:1) + /// Proof: UNKNOWN KEY `0x7b3237373ffdfeb1cab4222e3b520d6bedc49980ba3aa32b0a189290fd036649` (r:1 w:1) /// Storage: `MessageQueue::BookStateFor` (r:1 w:1) /// Proof: `MessageQueue::BookStateFor` (`max_values`: None, `max_size`: Some(52), added: 2527, mode: `MaxEncodedLen`) /// Storage: `MessageQueue::ServiceHead` (r:1 w:1) @@ -130,20 +132,22 @@ impl cumulus_pallet_xcmp_queue::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `65711` // Estimated: `69176` - // Minimum execution time: 67_000_000 picoseconds. - Weight::from_parts(73_000_000, 0) + // Minimum execution time: 117_856_000 picoseconds. + Weight::from_parts(119_808_000, 0) .saturating_add(Weight::from_parts(0, 69176)) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(5)) } /// Storage: UNKNOWN KEY `0x7b3237373ffdfeb1cab4222e3b520d6b345d8e88afa015075c945637c07e8f20` (r:1 w:1) /// Proof: UNKNOWN KEY `0x7b3237373ffdfeb1cab4222e3b520d6b345d8e88afa015075c945637c07e8f20` (r:1 w:1) - fn on_idle_large_msg() -> Weight { + /// Storage: UNKNOWN KEY `0x7b3237373ffdfeb1cab4222e3b520d6bedc49980ba3aa32b0a189290fd036649` (r:1 w:1) + /// Proof: UNKNOWN KEY `0x7b3237373ffdfeb1cab4222e3b520d6bedc49980ba3aa32b0a189290fd036649` (r:1 w:1) + fn on_idle_large_msg() -> Weight { // Proof Size summary in bytes: // Measured: `65710` // Estimated: `69175` - // Minimum execution time: 49_000_000 picoseconds. - Weight::from_parts(55_000_000, 0) + // Minimum execution time: 52_555_000 picoseconds. + Weight::from_parts(54_052_000, 0) .saturating_add(Weight::from_parts(0, 69175)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) diff --git a/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/frame_system.rs b/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/frame_system.rs index 46f8113939e4d4fa3f26ff03d665eec6b4120a6b..b4b7cbf05a5ec757bc3a60e08ef62678029b47f2 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/frame_system.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/frame_system.rs @@ -1,4 +1,4 @@ -// Copyright Parity Technologies (UK) Ltd. +// Copyright (C) Parity Technologies (UK) Ltd. // This file is part of Cumulus. // Cumulus is free software: you can redistribute it and/or modify @@ -16,26 +16,28 @@ //! Autogenerated weights for `frame_system` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-02-08, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("coretime-westend-dev"), DB CACHE: 1024 +//! HOSTNAME: `runner-bn-ce5rx-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("coretime-westend-dev")`, DB CACHE: 1024 // Executed Command: -// ./artifacts/westend-parachain +// ./target/production/polkadot-parachain // benchmark // pallet // --chain=coretime-westend-dev -// --execution=wasm // --wasm-execution=compiled // --pallet=frame_system +// --no-storage-info +// --no-median-slopes +// --no-min-squares // --extrinsic=* // --steps=50 // --repeat=20 // --json -// --header=./file_header.txt -// --output=./cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/frame_system.rs +// --header=./cumulus/file_header.txt +// --output=./cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -53,80 +55,99 @@ impl frame_system::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_432_000 picoseconds. - Weight::from_parts(2_458_000, 0) + // Minimum execution time: 1_584_000 picoseconds. + Weight::from_parts(2_117_975, 0) .saturating_add(Weight::from_parts(0, 0)) // Standard Error: 0 - .saturating_add(Weight::from_parts(367, 0).saturating_mul(b.into())) + .saturating_add(Weight::from_parts(384, 0).saturating_mul(b.into())) } /// The range of component `b` is `[0, 3932160]`. fn remark_with_event(b: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_911_000 picoseconds. - Weight::from_parts(8_031_000, 0) + // Minimum execution time: 4_607_000 picoseconds. + Weight::from_parts(14_948_582, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 0 - .saturating_add(Weight::from_parts(1_405, 0).saturating_mul(b.into())) + // Standard Error: 3 + .saturating_add(Weight::from_parts(1_673, 0).saturating_mul(b.into())) } - /// Storage: System Digest (r:1 w:1) - /// Proof Skipped: System Digest (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: unknown `0x3a686561707061676573` (r:0 w:1) - /// Proof Skipped: unknown `0x3a686561707061676573` (r:0 w:1) + /// Storage: `System::Digest` (r:1 w:1) + /// Proof: `System::Digest` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: UNKNOWN KEY `0x3a686561707061676573` (r:0 w:1) + /// Proof: UNKNOWN KEY `0x3a686561707061676573` (r:0 w:1) fn set_heap_pages() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `1485` - // Minimum execution time: 4_304_000 picoseconds. - Weight::from_parts(4_553_000, 0) + // Minimum execution time: 2_681_000 picoseconds. + Weight::from_parts(2_877_000, 0) .saturating_add(Weight::from_parts(0, 1485)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) } + /// Storage: `ParachainSystem::ValidationData` (r:1 w:0) + /// Proof: `ParachainSystem::ValidationData` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::UpgradeRestrictionSignal` (r:1 w:0) + /// Proof: `ParachainSystem::UpgradeRestrictionSignal` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::PendingValidationCode` (r:1 w:1) + /// Proof: `ParachainSystem::PendingValidationCode` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) + /// Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::NewValidationCode` (r:0 w:1) + /// Proof: `ParachainSystem::NewValidationCode` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::DidSetValidationCode` (r:0 w:1) + /// Proof: `ParachainSystem::DidSetValidationCode` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) fn set_code() -> Weight { - Weight::from_parts(1_000_000, 0) + // Proof Size summary in bytes: + // Measured: `164` + // Estimated: `1649` + // Minimum execution time: 95_893_701_000 picoseconds. + Weight::from_parts(98_086_094_000, 0) + .saturating_add(Weight::from_parts(0, 1649)) + .saturating_add(T::DbWeight::get().reads(4)) + .saturating_add(T::DbWeight::get().writes(3)) } - /// Storage: Skipped Metadata (r:0 w:0) - /// Proof Skipped: Skipped Metadata (max_values: None, max_size: None, mode: Measured) + /// Storage: `Skipped::Metadata` (r:0 w:0) + /// Proof: `Skipped::Metadata` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `i` is `[0, 1000]`. fn set_storage(i: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_493_000 picoseconds. - Weight::from_parts(2_523_000, 0) + // Minimum execution time: 1_597_000 picoseconds. + Weight::from_parts(1_660_000, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 1_594 - .saturating_add(Weight::from_parts(663_439, 0).saturating_mul(i.into())) + // Standard Error: 1_871 + .saturating_add(Weight::from_parts(748_346, 0).saturating_mul(i.into())) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(i.into()))) } - /// Storage: Skipped Metadata (r:0 w:0) - /// Proof Skipped: Skipped Metadata (max_values: None, max_size: None, mode: Measured) + /// Storage: `Skipped::Metadata` (r:0 w:0) + /// Proof: `Skipped::Metadata` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `i` is `[0, 1000]`. fn kill_storage(i: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_492_000 picoseconds. - Weight::from_parts(2_526_000, 0) + // Minimum execution time: 1_625_000 picoseconds. + Weight::from_parts(1_669_000, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 784 - .saturating_add(Weight::from_parts(493_844, 0).saturating_mul(i.into())) + // Standard Error: 903 + .saturating_add(Weight::from_parts(561_709, 0).saturating_mul(i.into())) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(i.into()))) } - /// Storage: Skipped Metadata (r:0 w:0) - /// Proof Skipped: Skipped Metadata (max_values: None, max_size: None, mode: Measured) + /// Storage: `Skipped::Metadata` (r:0 w:0) + /// Proof: `Skipped::Metadata` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `p` is `[0, 1000]`. fn kill_prefix(p: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `68 + p * (69 ±0)` - // Estimated: `66 + p * (70 ±0)` - // Minimum execution time: 4_200_000 picoseconds. - Weight::from_parts(4_288_000, 0) - .saturating_add(Weight::from_parts(0, 66)) - // Standard Error: 1_195 - .saturating_add(Weight::from_parts(1_021_563, 0).saturating_mul(p.into())) + // Measured: `71 + p * (69 ±0)` + // Estimated: `72 + p * (70 ±0)` + // Minimum execution time: 3_306_000 picoseconds. + Weight::from_parts(3_412_000, 0) + .saturating_add(Weight::from_parts(0, 72)) + // Standard Error: 1_366 + .saturating_add(Weight::from_parts(1_138_953, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(p.into()))) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(p.into()))) .saturating_add(Weight::from_parts(0, 70).saturating_mul(p.into())) @@ -137,25 +158,33 @@ impl frame_system::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 33_027_000 picoseconds. - Weight::from_parts(33_027_000, 0) + // Minimum execution time: 7_834_000 picoseconds. + Weight::from_parts(8_344_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } /// Storage: `System::AuthorizedUpgrade` (r:1 w:1) /// Proof: `System::AuthorizedUpgrade` (`max_values`: Some(1), `max_size`: Some(33), added: 528, mode: `MaxEncodedLen`) - /// Storage: `System::Digest` (r:1 w:1) - /// Proof: `System::Digest` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: UNKNOWN KEY `0x3a636f6465` (r:0 w:1) - /// Proof: UNKNOWN KEY `0x3a636f6465` (r:0 w:1) + /// Storage: `ParachainSystem::ValidationData` (r:1 w:0) + /// Proof: `ParachainSystem::ValidationData` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::UpgradeRestrictionSignal` (r:1 w:0) + /// Proof: `ParachainSystem::UpgradeRestrictionSignal` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::PendingValidationCode` (r:1 w:1) + /// Proof: `ParachainSystem::PendingValidationCode` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) + /// Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::NewValidationCode` (r:0 w:1) + /// Proof: `ParachainSystem::NewValidationCode` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::DidSetValidationCode` (r:0 w:1) + /// Proof: `ParachainSystem::DidSetValidationCode` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) fn apply_authorized_upgrade() -> Weight { // Proof Size summary in bytes: - // Measured: `22` - // Estimated: `1518` - // Minimum execution time: 118_101_992_000 picoseconds. - Weight::from_parts(118_101_992_000, 0) - .saturating_add(Weight::from_parts(0, 1518)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(3)) + // Measured: `186` + // Estimated: `1671` + // Minimum execution time: 98_682_277_000 picoseconds. + Weight::from_parts(101_609_257_000, 0) + .saturating_add(Weight::from_parts(0, 1671)) + .saturating_add(T::DbWeight::get().reads(5)) + .saturating_add(T::DbWeight::get().writes(4)) } } diff --git a/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/mod.rs b/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/mod.rs index 28e708f0e2a33da7419fe821ab1fb72806c273b1..f1050b3ae636261ff21674c3bb34c05bf6d232c5 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/mod.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/mod.rs @@ -1,6 +1,6 @@ // This file is part of Substrate. -// Copyright (C) 2023 Parity Technologies (UK) Ltd. +// Copyright (C) 2022 Parity Technologies (UK) Ltd. // SPDX-License-Identifier: Apache-2.0 // Licensed under the Apache License, Version 2.0 (the "License"); @@ -23,6 +23,7 @@ pub mod cumulus_pallet_xcmp_queue; pub mod extrinsic_weights; pub mod frame_system; pub mod pallet_balances; +pub mod pallet_broker; pub mod pallet_collator_selection; pub mod pallet_message_queue; pub mod pallet_multisig; diff --git a/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_balances.rs b/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_balances.rs index 2fc1495c804fcc2a692925af8f53ac57b84863cd..c4770a7c94381cfca9404a6577c703164f215918 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_balances.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_balances.rs @@ -17,23 +17,25 @@ //! Autogenerated weights for `pallet_balances` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 -//! DATE: 2024-01-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2024-02-08, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-8idpd4bs-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! HOSTNAME: `runner-bn-ce5rx-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("coretime-westend-dev")`, DB CACHE: 1024 // Executed Command: -// target/production/polkadot-parachain +// ./target/production/polkadot-parachain // benchmark // pallet -// --steps=50 -// --repeat=20 -// --extrinsic=* +// --chain=coretime-westend-dev // --wasm-execution=compiled -// --heap-pages=4096 -// --json-file=/builds/parity/mirrors/polkadot-sdk/.git/.artifacts/bench.json // --pallet=pallet_balances -// --chain=coretime-westend-dev +// --no-storage-info +// --no-median-slopes +// --no-min-squares +// --extrinsic=* +// --steps=50 +// --repeat=20 +// --json // --header=./cumulus/file_header.txt // --output=./cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/ @@ -54,8 +56,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 41_147_000 picoseconds. - Weight::from_parts(41_829_000, 0) + // Minimum execution time: 42_773_000 picoseconds. + Weight::from_parts(43_292_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -66,8 +68,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 32_566_000 picoseconds. - Weight::from_parts(33_012_000, 0) + // Minimum execution time: 34_023_000 picoseconds. + Weight::from_parts(34_513_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -78,8 +80,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `103` // Estimated: `3593` - // Minimum execution time: 11_435_000 picoseconds. - Weight::from_parts(11_717_000, 0) + // Minimum execution time: 11_685_000 picoseconds. + Weight::from_parts(12_103_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -90,8 +92,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `103` // Estimated: `3593` - // Minimum execution time: 15_941_000 picoseconds. - Weight::from_parts(16_341_000, 0) + // Minimum execution time: 16_233_000 picoseconds. + Weight::from_parts(16_706_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -102,8 +104,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `103` // Estimated: `6196` - // Minimum execution time: 42_592_000 picoseconds. - Weight::from_parts(43_111_000, 0) + // Minimum execution time: 43_909_000 picoseconds. + Weight::from_parts(44_683_000, 0) .saturating_add(Weight::from_parts(0, 6196)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) @@ -114,8 +116,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 40_925_000 picoseconds. - Weight::from_parts(41_743_000, 0) + // Minimum execution time: 42_081_000 picoseconds. + Weight::from_parts(42_553_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -126,8 +128,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `103` // Estimated: `3593` - // Minimum execution time: 14_117_000 picoseconds. - Weight::from_parts(14_418_000, 0) + // Minimum execution time: 14_413_000 picoseconds. + Weight::from_parts(14_827_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -139,11 +141,11 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0 + u * (136 ±0)` // Estimated: `990 + u * (2603 ±0)` - // Minimum execution time: 13_855_000 picoseconds. - Weight::from_parts(14_108_000, 0) + // Minimum execution time: 14_189_000 picoseconds. + Weight::from_parts(14_587_000, 0) .saturating_add(Weight::from_parts(0, 990)) - // Standard Error: 11_673 - .saturating_add(Weight::from_parts(12_675_264, 0).saturating_mul(u.into())) + // Standard Error: 10_909 + .saturating_add(Weight::from_parts(13_040_864, 0).saturating_mul(u.into())) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(u.into()))) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(u.into()))) .saturating_add(Weight::from_parts(0, 2603).saturating_mul(u.into())) @@ -154,8 +156,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `1501` - // Minimum execution time: 4_820_000 picoseconds. - Weight::from_parts(5_152_000, 0) + // Minimum execution time: 5_218_000 picoseconds. + Weight::from_parts(5_562_000, 0) .saturating_add(Weight::from_parts(0, 1501)) .saturating_add(T::DbWeight::get().reads(1)) } diff --git a/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_broker.rs b/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_broker.rs new file mode 100644 index 0000000000000000000000000000000000000000..13d5fcf3898bcc07fce13c7ee2deeb8c2b9fa76f --- /dev/null +++ b/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_broker.rs @@ -0,0 +1,526 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Cumulus is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Cumulus. If not, see . + +//! Autogenerated weights for `pallet_broker` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-03-20, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `runner-h2rr8wx7-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("coretime-westend-dev")`, DB CACHE: 1024 + +// Executed Command: +// target/production/polkadot-parachain +// benchmark +// pallet +// --steps=50 +// --repeat=20 +// --extrinsic=* +// --wasm-execution=compiled +// --heap-pages=4096 +// --json-file=/builds/parity/mirrors/polkadot-sdk/.git/.artifacts/bench.json +// --pallet=pallet_broker +// --chain=coretime-westend-dev +// --header=./cumulus/file_header.txt +// --output=./cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/ + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] +#![allow(missing_docs)] + +use frame_support::{traits::Get, weights::Weight}; +use core::marker::PhantomData; + +/// Weight functions for `pallet_broker`. +pub struct WeightInfo(PhantomData); +impl pallet_broker::WeightInfo for WeightInfo { + /// Storage: `Broker::Configuration` (r:0 w:1) + /// Proof: `Broker::Configuration` (`max_values`: Some(1), `max_size`: Some(31), added: 526, mode: `MaxEncodedLen`) + fn configure() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 1_897_000 picoseconds. + Weight::from_parts(2_053_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `Broker::Reservations` (r:1 w:1) + /// Proof: `Broker::Reservations` (`max_values`: Some(1), `max_size`: Some(12021), added: 12516, mode: `MaxEncodedLen`) + fn reserve() -> Weight { + // Proof Size summary in bytes: + // Measured: `10888` + // Estimated: `13506` + // Minimum execution time: 22_550_000 picoseconds. + Weight::from_parts(22_871_000, 0) + .saturating_add(Weight::from_parts(0, 13506)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `Broker::Reservations` (r:1 w:1) + /// Proof: `Broker::Reservations` (`max_values`: Some(1), `max_size`: Some(12021), added: 12516, mode: `MaxEncodedLen`) + fn unreserve() -> Weight { + // Proof Size summary in bytes: + // Measured: `12090` + // Estimated: `13506` + // Minimum execution time: 21_170_000 picoseconds. + Weight::from_parts(21_645_000, 0) + .saturating_add(Weight::from_parts(0, 13506)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `Broker::Leases` (r:1 w:1) + /// Proof: `Broker::Leases` (`max_values`: Some(1), `max_size`: Some(81), added: 576, mode: `MaxEncodedLen`) + /// Storage: `ParachainSystem::ValidationData` (r:1 w:0) + /// Proof: `ParachainSystem::ValidationData` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::LastRelayChainBlockNumber` (r:1 w:0) + /// Proof: `ParachainSystem::LastRelayChainBlockNumber` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + fn set_lease() -> Weight { + // Proof Size summary in bytes: + // Measured: `146` + // Estimated: `1631` + // Minimum execution time: 10_494_000 picoseconds. + Weight::from_parts(10_942_000, 0) + .saturating_add(Weight::from_parts(0, 1631)) + .saturating_add(T::DbWeight::get().reads(3)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `Broker::Configuration` (r:1 w:0) + /// Proof: `Broker::Configuration` (`max_values`: Some(1), `max_size`: Some(31), added: 526, mode: `MaxEncodedLen`) + /// Storage: `ParachainSystem::ValidationData` (r:1 w:0) + /// Proof: `ParachainSystem::ValidationData` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::LastRelayChainBlockNumber` (r:1 w:0) + /// Proof: `ParachainSystem::LastRelayChainBlockNumber` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Broker::InstaPoolIo` (r:3 w:3) + /// Proof: `Broker::InstaPoolIo` (`max_values`: None, `max_size`: Some(28), added: 2503, mode: `MaxEncodedLen`) + /// Storage: `Broker::Reservations` (r:1 w:0) + /// Proof: `Broker::Reservations` (`max_values`: Some(1), `max_size`: Some(12021), added: 12516, mode: `MaxEncodedLen`) + /// Storage: `Broker::Leases` (r:1 w:1) + /// Proof: `Broker::Leases` (`max_values`: Some(1), `max_size`: Some(81), added: 576, mode: `MaxEncodedLen`) + /// Storage: `Broker::SaleInfo` (r:0 w:1) + /// Proof: `Broker::SaleInfo` (`max_values`: Some(1), `max_size`: Some(57), added: 552, mode: `MaxEncodedLen`) + /// Storage: `Broker::Status` (r:0 w:1) + /// Proof: `Broker::Status` (`max_values`: Some(1), `max_size`: Some(18), added: 513, mode: `MaxEncodedLen`) + /// Storage: `Broker::Workplan` (r:0 w:20) + /// Proof: `Broker::Workplan` (`max_values`: None, `max_size`: Some(1216), added: 3691, mode: `MaxEncodedLen`) + /// The range of component `n` is `[0, 1000]`. + fn start_sales(_n: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `12247` + // Estimated: `13732` + // Minimum execution time: 61_014_000 picoseconds. + Weight::from_parts(63_267_651, 0) + .saturating_add(Weight::from_parts(0, 13732)) + .saturating_add(T::DbWeight::get().reads(8)) + .saturating_add(T::DbWeight::get().writes(26)) + } + /// Storage: `Broker::Status` (r:1 w:0) + /// Proof: `Broker::Status` (`max_values`: Some(1), `max_size`: Some(18), added: 513, mode: `MaxEncodedLen`) + /// Storage: `Broker::SaleInfo` (r:1 w:1) + /// Proof: `Broker::SaleInfo` (`max_values`: Some(1), `max_size`: Some(57), added: 552, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:0) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `Broker::Regions` (r:0 w:1) + /// Proof: `Broker::Regions` (`max_values`: None, `max_size`: Some(85), added: 2560, mode: `MaxEncodedLen`) + fn purchase() -> Weight { + // Proof Size summary in bytes: + // Measured: `316` + // Estimated: `3593` + // Minimum execution time: 30_931_000 picoseconds. + Weight::from_parts(31_941_000, 0) + .saturating_add(Weight::from_parts(0, 3593)) + .saturating_add(T::DbWeight::get().reads(3)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: `Broker::Configuration` (r:1 w:0) + /// Proof: `Broker::Configuration` (`max_values`: Some(1), `max_size`: Some(31), added: 526, mode: `MaxEncodedLen`) + /// Storage: `Broker::Status` (r:1 w:0) + /// Proof: `Broker::Status` (`max_values`: Some(1), `max_size`: Some(18), added: 513, mode: `MaxEncodedLen`) + /// Storage: `Broker::SaleInfo` (r:1 w:1) + /// Proof: `Broker::SaleInfo` (`max_values`: Some(1), `max_size`: Some(57), added: 552, mode: `MaxEncodedLen`) + /// Storage: `Broker::AllowedRenewals` (r:1 w:2) + /// Proof: `Broker::AllowedRenewals` (`max_values`: None, `max_size`: Some(1233), added: 3708, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:0) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `Broker::Workplan` (r:0 w:1) + /// Proof: `Broker::Workplan` (`max_values`: None, `max_size`: Some(1216), added: 3691, mode: `MaxEncodedLen`) + fn renew() -> Weight { + // Proof Size summary in bytes: + // Measured: `434` + // Estimated: `4698` + // Minimum execution time: 57_466_000 picoseconds. + Weight::from_parts(65_042_000, 0) + .saturating_add(Weight::from_parts(0, 4698)) + .saturating_add(T::DbWeight::get().reads(5)) + .saturating_add(T::DbWeight::get().writes(4)) + } + /// Storage: `Broker::Regions` (r:1 w:1) + /// Proof: `Broker::Regions` (`max_values`: None, `max_size`: Some(85), added: 2560, mode: `MaxEncodedLen`) + fn transfer() -> Weight { + // Proof Size summary in bytes: + // Measured: `357` + // Estimated: `3550` + // Minimum execution time: 12_799_000 picoseconds. + Weight::from_parts(13_401_000, 0) + .saturating_add(Weight::from_parts(0, 3550)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `Broker::Regions` (r:1 w:2) + /// Proof: `Broker::Regions` (`max_values`: None, `max_size`: Some(85), added: 2560, mode: `MaxEncodedLen`) + fn partition() -> Weight { + // Proof Size summary in bytes: + // Measured: `357` + // Estimated: `3550` + // Minimum execution time: 14_107_000 picoseconds. + Weight::from_parts(14_630_000, 0) + .saturating_add(Weight::from_parts(0, 3550)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: `Broker::Regions` (r:1 w:3) + /// Proof: `Broker::Regions` (`max_values`: None, `max_size`: Some(85), added: 2560, mode: `MaxEncodedLen`) + fn interlace() -> Weight { + // Proof Size summary in bytes: + // Measured: `357` + // Estimated: `3550` + // Minimum execution time: 15_254_000 picoseconds. + Weight::from_parts(16_062_000, 0) + .saturating_add(Weight::from_parts(0, 3550)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(3)) + } + /// Storage: `Broker::Configuration` (r:1 w:0) + /// Proof: `Broker::Configuration` (`max_values`: Some(1), `max_size`: Some(31), added: 526, mode: `MaxEncodedLen`) + /// Storage: `Broker::Status` (r:1 w:0) + /// Proof: `Broker::Status` (`max_values`: Some(1), `max_size`: Some(18), added: 513, mode: `MaxEncodedLen`) + /// Storage: `Broker::Regions` (r:1 w:1) + /// Proof: `Broker::Regions` (`max_values`: None, `max_size`: Some(85), added: 2560, mode: `MaxEncodedLen`) + /// Storage: `Broker::Workplan` (r:1 w:1) + /// Proof: `Broker::Workplan` (`max_values`: None, `max_size`: Some(1216), added: 3691, mode: `MaxEncodedLen`) + fn assign() -> Weight { + // Proof Size summary in bytes: + // Measured: `735` + // Estimated: `4681` + // Minimum execution time: 23_557_000 picoseconds. + Weight::from_parts(24_382_000, 0) + .saturating_add(Weight::from_parts(0, 4681)) + .saturating_add(T::DbWeight::get().reads(4)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: `Broker::Status` (r:1 w:0) + /// Proof: `Broker::Status` (`max_values`: Some(1), `max_size`: Some(18), added: 513, mode: `MaxEncodedLen`) + /// Storage: `Broker::Regions` (r:1 w:1) + /// Proof: `Broker::Regions` (`max_values`: None, `max_size`: Some(85), added: 2560, mode: `MaxEncodedLen`) + /// Storage: `Broker::Workplan` (r:1 w:1) + /// Proof: `Broker::Workplan` (`max_values`: None, `max_size`: Some(1216), added: 3691, mode: `MaxEncodedLen`) + /// Storage: `Broker::InstaPoolIo` (r:2 w:2) + /// Proof: `Broker::InstaPoolIo` (`max_values`: None, `max_size`: Some(28), added: 2503, mode: `MaxEncodedLen`) + /// Storage: `Broker::InstaPoolContribution` (r:0 w:1) + /// Proof: `Broker::InstaPoolContribution` (`max_values`: None, `max_size`: Some(68), added: 2543, mode: `MaxEncodedLen`) + fn pool() -> Weight { + // Proof Size summary in bytes: + // Measured: `801` + // Estimated: `5996` + // Minimum execution time: 29_371_000 picoseconds. + Weight::from_parts(30_200_000, 0) + .saturating_add(Weight::from_parts(0, 5996)) + .saturating_add(T::DbWeight::get().reads(5)) + .saturating_add(T::DbWeight::get().writes(5)) + } + /// Storage: `Broker::InstaPoolContribution` (r:1 w:1) + /// Proof: `Broker::InstaPoolContribution` (`max_values`: None, `max_size`: Some(68), added: 2543, mode: `MaxEncodedLen`) + /// Storage: `Broker::InstaPoolHistory` (r:3 w:1) + /// Proof: `Broker::InstaPoolHistory` (`max_values`: None, `max_size`: Some(45), added: 2520, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:2 w:2) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// The range of component `m` is `[1, 3]`. + fn claim_revenue(m: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `652` + // Estimated: `6196 + m * (2520 ±0)` + // Minimum execution time: 54_331_000 picoseconds. + Weight::from_parts(55_322_165, 0) + .saturating_add(Weight::from_parts(0, 6196)) + // Standard Error: 35_225 + .saturating_add(Weight::from_parts(1_099_614, 0).saturating_mul(m.into())) + .saturating_add(T::DbWeight::get().reads(3)) + .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(m.into()))) + .saturating_add(T::DbWeight::get().writes(5)) + .saturating_add(Weight::from_parts(0, 2520).saturating_mul(m.into())) + } + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) + /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) + /// Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) + /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) + /// Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) + /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + fn purchase_credit() -> Weight { + // Proof Size summary in bytes: + // Measured: `215` + // Estimated: `3680` + // Minimum execution time: 53_789_000 picoseconds. + Weight::from_parts(55_439_000, 0) + .saturating_add(Weight::from_parts(0, 3680)) + .saturating_add(T::DbWeight::get().reads(6)) + .saturating_add(T::DbWeight::get().writes(3)) + } + /// Storage: `Broker::Status` (r:1 w:0) + /// Proof: `Broker::Status` (`max_values`: Some(1), `max_size`: Some(18), added: 513, mode: `MaxEncodedLen`) + /// Storage: `Broker::Regions` (r:1 w:1) + /// Proof: `Broker::Regions` (`max_values`: None, `max_size`: Some(85), added: 2560, mode: `MaxEncodedLen`) + fn drop_region() -> Weight { + // Proof Size summary in bytes: + // Measured: `465` + // Estimated: `3550` + // Minimum execution time: 43_941_000 picoseconds. + Weight::from_parts(49_776_000, 0) + .saturating_add(Weight::from_parts(0, 3550)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `Broker::Configuration` (r:1 w:0) + /// Proof: `Broker::Configuration` (`max_values`: Some(1), `max_size`: Some(31), added: 526, mode: `MaxEncodedLen`) + /// Storage: `Broker::Status` (r:1 w:0) + /// Proof: `Broker::Status` (`max_values`: Some(1), `max_size`: Some(18), added: 513, mode: `MaxEncodedLen`) + /// Storage: `Broker::InstaPoolContribution` (r:1 w:1) + /// Proof: `Broker::InstaPoolContribution` (`max_values`: None, `max_size`: Some(68), added: 2543, mode: `MaxEncodedLen`) + fn drop_contribution() -> Weight { + // Proof Size summary in bytes: + // Measured: `463` + // Estimated: `3533` + // Minimum execution time: 64_917_000 picoseconds. + Weight::from_parts(70_403_000, 0) + .saturating_add(Weight::from_parts(0, 3533)) + .saturating_add(T::DbWeight::get().reads(3)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `Broker::Configuration` (r:1 w:0) + /// Proof: `Broker::Configuration` (`max_values`: Some(1), `max_size`: Some(31), added: 526, mode: `MaxEncodedLen`) + /// Storage: `Broker::Status` (r:1 w:0) + /// Proof: `Broker::Status` (`max_values`: Some(1), `max_size`: Some(18), added: 513, mode: `MaxEncodedLen`) + /// Storage: `Broker::InstaPoolHistory` (r:1 w:1) + /// Proof: `Broker::InstaPoolHistory` (`max_values`: None, `max_size`: Some(45), added: 2520, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:0) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + fn drop_history() -> Weight { + // Proof Size summary in bytes: + // Measured: `857` + // Estimated: `3593` + // Minimum execution time: 72_633_000 picoseconds. + Weight::from_parts(79_305_000, 0) + .saturating_add(Weight::from_parts(0, 3593)) + .saturating_add(T::DbWeight::get().reads(4)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `Broker::Status` (r:1 w:0) + /// Proof: `Broker::Status` (`max_values`: Some(1), `max_size`: Some(18), added: 513, mode: `MaxEncodedLen`) + /// Storage: `Broker::AllowedRenewals` (r:1 w:1) + /// Proof: `Broker::AllowedRenewals` (`max_values`: None, `max_size`: Some(1233), added: 3708, mode: `MaxEncodedLen`) + fn drop_renewal() -> Weight { + // Proof Size summary in bytes: + // Measured: `556` + // Estimated: `4698` + // Minimum execution time: 36_643_000 picoseconds. + Weight::from_parts(48_218_000, 0) + .saturating_add(Weight::from_parts(0, 4698)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) + /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) + /// Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) + /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) + /// Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) + /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// The range of component `n` is `[0, 1000]`. + fn request_core_count(_n: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `74` + // Estimated: `3539` + // Minimum execution time: 17_617_000 picoseconds. + Weight::from_parts(18_904_788, 0) + .saturating_add(Weight::from_parts(0, 3539)) + .saturating_add(T::DbWeight::get().reads(5)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: `Broker::CoreCountInbox` (r:1 w:1) + /// Proof: `Broker::CoreCountInbox` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) + /// The range of component `n` is `[0, 1000]`. + fn process_core_count(n: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `266` + // Estimated: `1487` + // Minimum execution time: 5_575_000 picoseconds. + Weight::from_parts(5_887_598, 0) + .saturating_add(Weight::from_parts(0, 1487)) + // Standard Error: 16 + .saturating_add(Weight::from_parts(41, 0).saturating_mul(n.into())) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: UNKNOWN KEY `0xf308d869daf021a7724e69c557dd8dbe` (r:1 w:1) + /// Proof: UNKNOWN KEY `0xf308d869daf021a7724e69c557dd8dbe` (r:1 w:1) + /// Storage: `Broker::InstaPoolHistory` (r:1 w:1) + /// Proof: `Broker::InstaPoolHistory` (`max_values`: None, `max_size`: Some(45), added: 2520, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:2 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + fn process_revenue() -> Weight { + // Proof Size summary in bytes: + // Measured: `447` + // Estimated: `6196` + // Minimum execution time: 36_415_000 picoseconds. + Weight::from_parts(37_588_000, 0) + .saturating_add(Weight::from_parts(0, 6196)) + .saturating_add(T::DbWeight::get().reads(4)) + .saturating_add(T::DbWeight::get().writes(3)) + } + /// Storage: `Broker::InstaPoolIo` (r:3 w:3) + /// Proof: `Broker::InstaPoolIo` (`max_values`: None, `max_size`: Some(28), added: 2503, mode: `MaxEncodedLen`) + /// Storage: `Broker::Reservations` (r:1 w:0) + /// Proof: `Broker::Reservations` (`max_values`: Some(1), `max_size`: Some(12021), added: 12516, mode: `MaxEncodedLen`) + /// Storage: `Broker::Leases` (r:1 w:1) + /// Proof: `Broker::Leases` (`max_values`: Some(1), `max_size`: Some(81), added: 576, mode: `MaxEncodedLen`) + /// Storage: `Broker::SaleInfo` (r:0 w:1) + /// Proof: `Broker::SaleInfo` (`max_values`: Some(1), `max_size`: Some(57), added: 552, mode: `MaxEncodedLen`) + /// Storage: `Broker::Workplan` (r:0 w:20) + /// Proof: `Broker::Workplan` (`max_values`: None, `max_size`: Some(1216), added: 3691, mode: `MaxEncodedLen`) + /// The range of component `n` is `[0, 1000]`. + fn rotate_sale(n: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `12194` + // Estimated: `13506` + // Minimum execution time: 48_362_000 picoseconds. + Weight::from_parts(49_616_106, 0) + .saturating_add(Weight::from_parts(0, 13506)) + // Standard Error: 61 + .saturating_add(Weight::from_parts(59, 0).saturating_mul(n.into())) + .saturating_add(T::DbWeight::get().reads(5)) + .saturating_add(T::DbWeight::get().writes(25)) + } + /// Storage: `Broker::InstaPoolIo` (r:1 w:0) + /// Proof: `Broker::InstaPoolIo` (`max_values`: None, `max_size`: Some(28), added: 2503, mode: `MaxEncodedLen`) + /// Storage: `Broker::InstaPoolHistory` (r:0 w:1) + /// Proof: `Broker::InstaPoolHistory` (`max_values`: None, `max_size`: Some(45), added: 2520, mode: `MaxEncodedLen`) + fn process_pool() -> Weight { + // Proof Size summary in bytes: + // Measured: `42` + // Estimated: `3493` + // Minimum execution time: 6_148_000 picoseconds. + Weight::from_parts(6_374_000, 0) + .saturating_add(Weight::from_parts(0, 3493)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `Broker::Workplan` (r:1 w:1) + /// Proof: `Broker::Workplan` (`max_values`: None, `max_size`: Some(1216), added: 3691, mode: `MaxEncodedLen`) + /// Storage: `Broker::Workload` (r:1 w:1) + /// Proof: `Broker::Workload` (`max_values`: None, `max_size`: Some(1212), added: 3687, mode: `MaxEncodedLen`) + /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) + /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) + /// Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) + /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) + /// Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) + /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + fn process_core_schedule() -> Weight { + // Proof Size summary in bytes: + // Measured: `1321` + // Estimated: `4786` + // Minimum execution time: 30_267_000 picoseconds. + Weight::from_parts(30_825_000, 0) + .saturating_add(Weight::from_parts(0, 4786)) + .saturating_add(T::DbWeight::get().reads(7)) + .saturating_add(T::DbWeight::get().writes(4)) + } + /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) + /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) + /// Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) + /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) + /// Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) + /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + fn request_revenue_info_at() -> Weight { + // Proof Size summary in bytes: + // Measured: `74` + // Estimated: `3539` + // Minimum execution time: 13_491_000 picoseconds. + Weight::from_parts(13_949_000, 0) + .saturating_add(Weight::from_parts(0, 3539)) + .saturating_add(T::DbWeight::get().reads(5)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: `Broker::CoreCountInbox` (r:0 w:1) + /// Proof: `Broker::CoreCountInbox` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) + fn notify_core_count() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 1_711_000 picoseconds. + Weight::from_parts(1_913_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `Broker::Status` (r:1 w:1) + /// Proof: `Broker::Status` (`max_values`: Some(1), `max_size`: Some(18), added: 513, mode: `MaxEncodedLen`) + /// Storage: `Broker::Configuration` (r:1 w:0) + /// Proof: `Broker::Configuration` (`max_values`: Some(1), `max_size`: Some(31), added: 526, mode: `MaxEncodedLen`) + /// Storage: `Broker::CoreCountInbox` (r:1 w:0) + /// Proof: `Broker::CoreCountInbox` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) + /// Storage: UNKNOWN KEY `0xf308d869daf021a7724e69c557dd8dbe` (r:1 w:1) + /// Proof: UNKNOWN KEY `0xf308d869daf021a7724e69c557dd8dbe` (r:1 w:1) + /// Storage: `ParachainSystem::ValidationData` (r:1 w:0) + /// Proof: `ParachainSystem::ValidationData` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + fn do_tick_base() -> Weight { + // Proof Size summary in bytes: + // Measured: `398` + // Estimated: `3863` + // Minimum execution time: 12_035_000 picoseconds. + Weight::from_parts(12_383_000, 0) + .saturating_add(Weight::from_parts(0, 3863)) + .saturating_add(T::DbWeight::get().reads(5)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: `Broker::Leases` (r:1 w:1) + /// Proof: `Broker::Leases` (`max_values`: Some(1), `max_size`: Some(81), added: 576, mode: `MaxEncodedLen`) + fn swap_leases() -> Weight { + // Proof Size summary in bytes: + // Measured: `150` + // Estimated: `1566` + // Minimum execution time: 6_142_000 picoseconds. + Weight::from_parts(6_538_000, 0) + .saturating_add(Weight::from_parts(0, 1566)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } +} diff --git a/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_collator_selection.rs b/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_collator_selection.rs index 2adddecab264945884d8b4620b9dff9868bfc4f0..2341890c314ec422aebf30b27111502a01909c25 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_collator_selection.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_collator_selection.rs @@ -1,4 +1,4 @@ -// Copyright Parity Technologies (UK) Ltd. +// Copyright (C) Parity Technologies (UK) Ltd. // This file is part of Cumulus. // Cumulus is free software: you can redistribute it and/or modify @@ -16,26 +16,28 @@ //! Autogenerated weights for `pallet_collator_selection` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-02-08, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("coretime-westend-dev"), DB CACHE: 1024 +//! HOSTNAME: `runner-bn-ce5rx-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("coretime-westend-dev")`, DB CACHE: 1024 // Executed Command: -// ./artifacts/westend-parachain +// ./target/production/polkadot-parachain // benchmark // pallet // --chain=coretime-westend-dev -// --execution=wasm // --wasm-execution=compiled // --pallet=pallet_collator_selection +// --no-storage-info +// --no-median-slopes +// --no-min-squares // --extrinsic=* // --steps=50 // --repeat=20 // --json -// --header=./file_header.txt -// --output=./cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_collator_selection.rs +// --header=./cumulus/file_header.txt +// --output=./cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -48,196 +50,236 @@ use core::marker::PhantomData; /// Weight functions for `pallet_collator_selection`. pub struct WeightInfo(PhantomData); impl pallet_collator_selection::WeightInfo for WeightInfo { - /// Storage: Session NextKeys (r:100 w:0) - /// Proof Skipped: Session NextKeys (max_values: None, max_size: None, mode: Measured) - /// Storage: CollatorSelection Invulnerables (r:0 w:1) - /// Proof: CollatorSelection Invulnerables (max_values: Some(1), max_size: Some(3202), added: 3697, mode: MaxEncodedLen) - /// The range of component `b` is `[1, 100]`. + /// Storage: `Session::NextKeys` (r:20 w:0) + /// Proof: `Session::NextKeys` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `CollatorSelection::Invulnerables` (r:0 w:1) + /// Proof: `CollatorSelection::Invulnerables` (`max_values`: Some(1), `max_size`: Some(641), added: 1136, mode: `MaxEncodedLen`) + /// The range of component `b` is `[1, 20]`. fn set_invulnerables(b: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `214 + b * (78 ±0)` - // Estimated: `1203 + b * (2554 ±0)` - // Minimum execution time: 14_426_000 picoseconds. - Weight::from_parts(14_971_974, 0) - .saturating_add(Weight::from_parts(0, 1203)) - // Standard Error: 2_914 - .saturating_add(Weight::from_parts(2_604_699, 0).saturating_mul(b.into())) + // Measured: `164 + b * (79 ±0)` + // Estimated: `1155 + b * (2555 ±0)` + // Minimum execution time: 11_038_000 picoseconds. + Weight::from_parts(8_347_616, 0) + .saturating_add(Weight::from_parts(0, 1155)) + // Standard Error: 5_166 + .saturating_add(Weight::from_parts(3_025_311, 0).saturating_mul(b.into())) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(b.into()))) .saturating_add(T::DbWeight::get().writes(1)) - .saturating_add(Weight::from_parts(0, 2554).saturating_mul(b.into())) + .saturating_add(Weight::from_parts(0, 2555).saturating_mul(b.into())) } - /// Storage: CollatorSelection DesiredCandidates (r:0 w:1) - /// Proof: CollatorSelection DesiredCandidates (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - fn set_desired_candidates() -> Weight { + /// Storage: `Session::NextKeys` (r:1 w:0) + /// Proof: `Session::NextKeys` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `CollatorSelection::Invulnerables` (r:1 w:1) + /// Proof: `CollatorSelection::Invulnerables` (`max_values`: Some(1), `max_size`: Some(641), added: 1136, mode: `MaxEncodedLen`) + /// Storage: `CollatorSelection::CandidateList` (r:1 w:1) + /// Proof: `CollatorSelection::CandidateList` (`max_values`: Some(1), `max_size`: Some(4802), added: 5297, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// The range of component `b` is `[1, 19]`. + /// The range of component `c` is `[1, 99]`. + fn add_invulnerable(b: u32, c: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 6_977_000 picoseconds. - Weight::from_parts(7_246_000, 0) - .saturating_add(Weight::from_parts(0, 0)) + // Measured: `720 + b * (32 ±0) + c * (53 ±0)` + // Estimated: `6287 + b * (37 ±0) + c * (53 ±0)` + // Minimum execution time: 36_983_000 picoseconds. + Weight::from_parts(37_900_558, 0) + .saturating_add(Weight::from_parts(0, 6287)) + // Standard Error: 6_860 + .saturating_add(Weight::from_parts(94_160, 0).saturating_mul(b.into())) + // Standard Error: 1_300 + .saturating_add(Weight::from_parts(119_010, 0).saturating_mul(c.into())) + .saturating_add(T::DbWeight::get().reads(4)) + .saturating_add(T::DbWeight::get().writes(3)) + .saturating_add(Weight::from_parts(0, 37).saturating_mul(b.into())) + .saturating_add(Weight::from_parts(0, 53).saturating_mul(c.into())) + } + /// Storage: `CollatorSelection::CandidateList` (r:1 w:0) + /// Proof: `CollatorSelection::CandidateList` (`max_values`: Some(1), `max_size`: Some(4802), added: 5297, mode: `MaxEncodedLen`) + /// Storage: `CollatorSelection::Invulnerables` (r:1 w:1) + /// Proof: `CollatorSelection::Invulnerables` (`max_values`: Some(1), `max_size`: Some(641), added: 1136, mode: `MaxEncodedLen`) + /// The range of component `b` is `[5, 20]`. + fn remove_invulnerable(b: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `82 + b * (32 ±0)` + // Estimated: `6287` + // Minimum execution time: 10_432_000 picoseconds. + Weight::from_parts(10_460_489, 0) + .saturating_add(Weight::from_parts(0, 6287)) + // Standard Error: 2_803 + .saturating_add(Weight::from_parts(143_162, 0).saturating_mul(b.into())) + .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } - /// Storage: `CollatorSelection::CandidacyBond` (r:0 w:1) - /// Proof: `CollatorSelection::CandidacyBond` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) - fn set_candidacy_bond(_c: u32, _k: u32) -> Weight { + /// Storage: `CollatorSelection::DesiredCandidates` (r:0 w:1) + /// Proof: `CollatorSelection::DesiredCandidates` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + fn set_desired_candidates() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_937_000 picoseconds. - Weight::from_parts(8_161_000, 0) + // Minimum execution time: 4_302_000 picoseconds. + Weight::from_parts(4_508_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } - /// Storage: CollatorSelection Candidates (r:1 w:1) - /// Proof: CollatorSelection Candidates (max_values: Some(1), max_size: Some(48002), added: 48497, mode: MaxEncodedLen) - /// Storage: CollatorSelection DesiredCandidates (r:1 w:0) - /// Proof: CollatorSelection DesiredCandidates (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: CollatorSelection Invulnerables (r:1 w:0) - /// Proof: CollatorSelection Invulnerables (max_values: Some(1), max_size: Some(3202), added: 3697, mode: MaxEncodedLen) - /// Storage: Session NextKeys (r:1 w:0) - /// Proof Skipped: Session NextKeys (max_values: None, max_size: None, mode: Measured) - /// Storage: CollatorSelection CandidacyBond (r:1 w:0) - /// Proof: CollatorSelection CandidacyBond (max_values: Some(1), max_size: Some(16), added: 511, mode: MaxEncodedLen) - /// Storage: CollatorSelection LastAuthoredBlock (r:0 w:1) - /// Proof: CollatorSelection LastAuthoredBlock (max_values: None, max_size: Some(44), added: 2519, mode: MaxEncodedLen) - /// The range of component `c` is `[1, 999]`. - fn register_as_candidate(c: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `1104 + c * (48 ±0)` - // Estimated: `49487 + c * (49 ±0)` - // Minimum execution time: 42_275_000 picoseconds. - Weight::from_parts(33_742_215, 0) - .saturating_add(Weight::from_parts(0, 49487)) - // Standard Error: 1_291 - .saturating_add(Weight::from_parts(103_381, 0).saturating_mul(c.into())) - .saturating_add(T::DbWeight::get().reads(5)) - .saturating_add(T::DbWeight::get().writes(2)) - .saturating_add(Weight::from_parts(0, 49).saturating_mul(c.into())) - } - /// Storage: CollatorSelection Candidates (r:1 w:1) - /// Proof: CollatorSelection Candidates (max_values: Some(1), max_size: Some(48002), added: 48497, mode: MaxEncodedLen) - /// Storage: CollatorSelection LastAuthoredBlock (r:0 w:1) - /// Proof: CollatorSelection LastAuthoredBlock (max_values: None, max_size: Some(44), added: 2519, mode: MaxEncodedLen) - /// The range of component `c` is `[6, 1000]`. - fn leave_intent(c: u32, ) -> Weight { + /// Storage: `CollatorSelection::CandidacyBond` (r:1 w:1) + /// Proof: `CollatorSelection::CandidacyBond` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) + /// Storage: `CollatorSelection::CandidateList` (r:1 w:1) + /// Proof: `CollatorSelection::CandidateList` (`max_values`: Some(1), `max_size`: Some(4802), added: 5297, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:100 w:100) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `CollatorSelection::LastAuthoredBlock` (r:0 w:100) + /// Proof: `CollatorSelection::LastAuthoredBlock` (`max_values`: None, `max_size`: Some(44), added: 2519, mode: `MaxEncodedLen`) + /// The range of component `c` is `[0, 100]`. + /// The range of component `k` is `[0, 100]`. + fn set_candidacy_bond(c: u32, k: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `428 + c * (48 ±0)` - // Estimated: `49487` - // Minimum execution time: 33_404_000 picoseconds. - Weight::from_parts(22_612_617, 0) - .saturating_add(Weight::from_parts(0, 49487)) - // Standard Error: 1_341 - .saturating_add(Weight::from_parts(105_669, 0).saturating_mul(c.into())) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(2)) + // Measured: `0 + c * (180 ±0) + k * (112 ±0)` + // Estimated: `6287 + c * (901 ±29) + k * (901 ±29)` + // Minimum execution time: 7_712_000 picoseconds. + Weight::from_parts(7_935_000, 0) + .saturating_add(Weight::from_parts(0, 6287)) + // Standard Error: 153_204 + .saturating_add(Weight::from_parts(5_173_626, 0).saturating_mul(c.into())) + // Standard Error: 153_204 + .saturating_add(Weight::from_parts(4_883_030, 0).saturating_mul(k.into())) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(1)) + .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(c.into()))) + .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(k.into()))) + .saturating_add(Weight::from_parts(0, 901).saturating_mul(c.into())) + .saturating_add(Weight::from_parts(0, 901).saturating_mul(k.into())) } + /// Storage: `CollatorSelection::CandidacyBond` (r:1 w:0) + /// Proof: `CollatorSelection::CandidacyBond` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) + /// Storage: `CollatorSelection::CandidateList` (r:1 w:1) + /// Proof: `CollatorSelection::CandidateList` (`max_values`: Some(1), `max_size`: Some(4802), added: 5297, mode: `MaxEncodedLen`) + /// The range of component `c` is `[4, 100]`. fn update_bond(c: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `306 + c * (50 ±0)` + // Measured: `250 + c * (50 ±0)` // Estimated: `6287` - // Minimum execution time: 34_814_000 picoseconds. - Weight::from_parts(36_371_520, 0) + // Minimum execution time: 22_767_000 picoseconds. + Weight::from_parts(25_594_856, 0) .saturating_add(Weight::from_parts(0, 6287)) - // Standard Error: 2_391 - .saturating_add(Weight::from_parts(201_700, 0).saturating_mul(c.into())) + // Standard Error: 1_814 + .saturating_add(Weight::from_parts(110_451, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `CollatorSelection::CandidateList` (r:1 w:1) + /// Proof: `CollatorSelection::CandidateList` (`max_values`: Some(1), `max_size`: Some(4802), added: 5297, mode: `MaxEncodedLen`) + /// Storage: `CollatorSelection::Invulnerables` (r:1 w:0) + /// Proof: `CollatorSelection::Invulnerables` (`max_values`: Some(1), `max_size`: Some(641), added: 1136, mode: `MaxEncodedLen`) + /// Storage: `Session::NextKeys` (r:1 w:0) + /// Proof: `Session::NextKeys` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `CollatorSelection::CandidacyBond` (r:1 w:0) + /// Proof: `CollatorSelection::CandidacyBond` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) + /// Storage: `CollatorSelection::LastAuthoredBlock` (r:0 w:1) + /// Proof: `CollatorSelection::LastAuthoredBlock` (`max_values`: None, `max_size`: Some(44), added: 2519, mode: `MaxEncodedLen`) + /// The range of component `c` is `[1, 99]`. + fn register_as_candidate(c: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `687 + c * (52 ±0)` + // Estimated: `6287 + c * (54 ±0)` + // Minimum execution time: 30_792_000 picoseconds. + Weight::from_parts(34_485_582, 0) + .saturating_add(Weight::from_parts(0, 6287)) + // Standard Error: 2_421 + .saturating_add(Weight::from_parts(152_013, 0).saturating_mul(c.into())) + .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) + .saturating_add(Weight::from_parts(0, 54).saturating_mul(c.into())) } + /// Storage: `CollatorSelection::Invulnerables` (r:1 w:0) + /// Proof: `CollatorSelection::Invulnerables` (`max_values`: Some(1), `max_size`: Some(641), added: 1136, mode: `MaxEncodedLen`) + /// Storage: `CollatorSelection::CandidacyBond` (r:1 w:0) + /// Proof: `CollatorSelection::CandidacyBond` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) + /// Storage: `Session::NextKeys` (r:1 w:0) + /// Proof: `Session::NextKeys` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `CollatorSelection::CandidateList` (r:1 w:1) + /// Proof: `CollatorSelection::CandidateList` (`max_values`: Some(1), `max_size`: Some(4802), added: 5297, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `CollatorSelection::LastAuthoredBlock` (r:0 w:2) + /// Proof: `CollatorSelection::LastAuthoredBlock` (`max_values`: None, `max_size`: Some(44), added: 2519, mode: `MaxEncodedLen`) + /// The range of component `c` is `[4, 100]`. fn take_candidate_slot(c: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `306 + c * (50 ±0)` + // Measured: `855 + c * (52 ±0)` + // Estimated: `6287 + c * (55 ±0)` + // Minimum execution time: 45_538_000 picoseconds. + Weight::from_parts(50_758_223, 0) + .saturating_add(Weight::from_parts(0, 6287)) + // Standard Error: 2_779 + .saturating_add(Weight::from_parts(149_419, 0).saturating_mul(c.into())) + .saturating_add(T::DbWeight::get().reads(5)) + .saturating_add(T::DbWeight::get().writes(4)) + .saturating_add(Weight::from_parts(0, 55).saturating_mul(c.into())) + } + /// Storage: `CollatorSelection::CandidateList` (r:1 w:1) + /// Proof: `CollatorSelection::CandidateList` (`max_values`: Some(1), `max_size`: Some(4802), added: 5297, mode: `MaxEncodedLen`) + /// Storage: `CollatorSelection::Invulnerables` (r:1 w:0) + /// Proof: `CollatorSelection::Invulnerables` (`max_values`: Some(1), `max_size`: Some(641), added: 1136, mode: `MaxEncodedLen`) + /// Storage: `CollatorSelection::LastAuthoredBlock` (r:0 w:1) + /// Proof: `CollatorSelection::LastAuthoredBlock` (`max_values`: None, `max_size`: Some(44), added: 2519, mode: `MaxEncodedLen`) + /// The range of component `c` is `[4, 100]`. + fn leave_intent(c: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `277 + c * (48 ±0)` // Estimated: `6287` - // Minimum execution time: 34_814_000 picoseconds. - Weight::from_parts(36_371_520, 0) + // Minimum execution time: 26_356_000 picoseconds. + Weight::from_parts(29_910_328, 0) .saturating_add(Weight::from_parts(0, 6287)) - // Standard Error: 2_391 - .saturating_add(Weight::from_parts(201_700, 0).saturating_mul(c.into())) + // Standard Error: 2_159 + .saturating_add(Weight::from_parts(123_421, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } - /// Storage: System Account (r:2 w:2) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) - /// Storage: System BlockWeight (r:1 w:1) - /// Proof: System BlockWeight (max_values: Some(1), max_size: Some(48), added: 543, mode: MaxEncodedLen) - /// Storage: CollatorSelection LastAuthoredBlock (r:0 w:1) - /// Proof: CollatorSelection LastAuthoredBlock (max_values: None, max_size: Some(44), added: 2519, mode: MaxEncodedLen) + /// Storage: `System::Account` (r:2 w:2) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `System::BlockWeight` (r:1 w:1) + /// Proof: `System::BlockWeight` (`max_values`: Some(1), `max_size`: Some(48), added: 543, mode: `MaxEncodedLen`) + /// Storage: `CollatorSelection::LastAuthoredBlock` (r:0 w:1) + /// Proof: `CollatorSelection::LastAuthoredBlock` (`max_values`: None, `max_size`: Some(44), added: 2519, mode: `MaxEncodedLen`) fn note_author() -> Weight { // Proof Size summary in bytes: - // Measured: `155` + // Measured: `103` // Estimated: `6196` - // Minimum execution time: 44_415_000 picoseconds. - Weight::from_parts(44_732_000, 0) + // Minimum execution time: 36_377_000 picoseconds. + Weight::from_parts(37_121_000, 0) .saturating_add(Weight::from_parts(0, 6196)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(4)) } - /// Storage: Session NextKeys (r:1 w:0) - /// Proof Skipped: Session NextKeys (max_values: None, max_size: None, mode: Measured) - /// Storage: CollatorSelection Invulnerables (r:1 w:1) - /// Proof: CollatorSelection Invulnerables (max_values: Some(1), max_size: Some(641), added: 1136, mode: MaxEncodedLen) - /// Storage: CollatorSelection Candidates (r:1 w:1) - /// Proof: CollatorSelection Candidates (max_values: Some(1), max_size: Some(4802), added: 5297, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) - /// The range of component `b` is `[1, 19]`. - /// The range of component `c` is `[1, 99]`. - fn add_invulnerable(b: u32, c: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `757 + b * (32 ±0) + c * (53 ±0)` - // Estimated: `6287 + b * (37 ±0) + c * (53 ±0)` - // Minimum execution time: 52_720_000 picoseconds. - Weight::from_parts(56_102_459, 0) - .saturating_add(Weight::from_parts(0, 6287)) - // Standard Error: 12_957 - .saturating_add(Weight::from_parts(26_422, 0).saturating_mul(b.into())) - // Standard Error: 2_456 - .saturating_add(Weight::from_parts(128_528, 0).saturating_mul(c.into())) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(3)) - .saturating_add(Weight::from_parts(0, 37).saturating_mul(b.into())) - .saturating_add(Weight::from_parts(0, 53).saturating_mul(c.into())) - } - /// Storage: CollatorSelection Invulnerables (r:1 w:1) - /// Proof: CollatorSelection Invulnerables (max_values: Some(1), max_size: Some(3202), added: 3697, mode: MaxEncodedLen) - /// The range of component `b` is `[1, 100]`. - fn remove_invulnerable(b: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `119 + b * (32 ±0)` - // Estimated: `4687` - // Minimum execution time: 183_054_000 picoseconds. - Weight::from_parts(197_205_427, 0) - .saturating_add(Weight::from_parts(0, 4687)) - // Standard Error: 13_533 - .saturating_add(Weight::from_parts(376_231, 0).saturating_mul(b.into())) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) - } - /// Storage: CollatorSelection Candidates (r:1 w:0) - /// Proof: CollatorSelection Candidates (max_values: Some(1), max_size: Some(48002), added: 48497, mode: MaxEncodedLen) - /// Storage: CollatorSelection LastAuthoredBlock (r:999 w:0) - /// Proof: CollatorSelection LastAuthoredBlock (max_values: None, max_size: Some(44), added: 2519, mode: MaxEncodedLen) - /// Storage: CollatorSelection Invulnerables (r:1 w:0) - /// Proof: CollatorSelection Invulnerables (max_values: Some(1), max_size: Some(3202), added: 3697, mode: MaxEncodedLen) - /// Storage: System BlockWeight (r:1 w:1) - /// Proof: System BlockWeight (max_values: Some(1), max_size: Some(48), added: 543, mode: MaxEncodedLen) - /// Storage: System Account (r:995 w:995) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) - /// The range of component `r` is `[1, 1000]`. - /// The range of component `c` is `[1, 1000]`. + /// Storage: `CollatorSelection::CandidateList` (r:1 w:0) + /// Proof: `CollatorSelection::CandidateList` (`max_values`: Some(1), `max_size`: Some(4802), added: 5297, mode: `MaxEncodedLen`) + /// Storage: `CollatorSelection::LastAuthoredBlock` (r:100 w:0) + /// Proof: `CollatorSelection::LastAuthoredBlock` (`max_values`: None, `max_size`: Some(44), added: 2519, mode: `MaxEncodedLen`) + /// Storage: `CollatorSelection::Invulnerables` (r:1 w:0) + /// Proof: `CollatorSelection::Invulnerables` (`max_values`: Some(1), `max_size`: Some(641), added: 1136, mode: `MaxEncodedLen`) + /// Storage: `CollatorSelection::DesiredCandidates` (r:1 w:0) + /// Proof: `CollatorSelection::DesiredCandidates` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `System::BlockWeight` (r:1 w:1) + /// Proof: `System::BlockWeight` (`max_values`: Some(1), `max_size`: Some(48), added: 543, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:97 w:97) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// The range of component `r` is `[1, 100]`. + /// The range of component `c` is `[1, 100]`. fn new_session(r: u32, c: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `22815 + c * (97 ±0) + r * (116 ±0)` - // Estimated: `49487 + c * (2519 ±0) + r * (2602 ±0)` - // Minimum execution time: 16_765_000 picoseconds. - Weight::from_parts(16_997_000, 0) - .saturating_add(Weight::from_parts(0, 49487)) - // Standard Error: 860_677 - .saturating_add(Weight::from_parts(30_463_094, 0).saturating_mul(c.into())) - .saturating_add(T::DbWeight::get().reads(4)) + // Measured: `2143 + c * (97 ±0) + r * (112 ±0)` + // Estimated: `6287 + c * (2519 ±0) + r * (2603 ±0)` + // Minimum execution time: 15_761_000 picoseconds. + Weight::from_parts(16_078_000, 0) + .saturating_add(Weight::from_parts(0, 6287)) + // Standard Error: 270_522 + .saturating_add(Weight::from_parts(11_903_266, 0).saturating_mul(c.into())) + .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(c.into()))) .saturating_add(T::DbWeight::get().writes(1)) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(c.into()))) .saturating_add(Weight::from_parts(0, 2519).saturating_mul(c.into())) - .saturating_add(Weight::from_parts(0, 2602).saturating_mul(r.into())) + .saturating_add(Weight::from_parts(0, 2603).saturating_mul(r.into())) } } diff --git a/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_message_queue.rs b/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_message_queue.rs index 651f27e10e5c7b5d941d2bec5197fc06ed035fda..e9cdc2478766de88bfd3cc8765ba472bac61db30 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_message_queue.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_message_queue.rs @@ -1,4 +1,4 @@ -// Copyright Parity Technologies (UK) Ltd. +// Copyright (C) Parity Technologies (UK) Ltd. // This file is part of Cumulus. // Cumulus is free software: you can redistribute it and/or modify @@ -14,6 +14,31 @@ // You should have received a copy of the GNU General Public License // along with Cumulus. If not, see . +//! Autogenerated weights for `pallet_message_queue` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-02-08, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `runner-bn-ce5rx-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("coretime-westend-dev")`, DB CACHE: 1024 + +// Executed Command: +// ./target/production/polkadot-parachain +// benchmark +// pallet +// --chain=coretime-westend-dev +// --wasm-execution=compiled +// --pallet=pallet_message_queue +// --no-storage-info +// --no-median-slopes +// --no-min-squares +// --extrinsic=* +// --steps=50 +// --repeat=20 +// --json +// --header=./cumulus/file_header.txt +// --output=./cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/ + #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] #![allow(unused_imports)] @@ -22,134 +47,140 @@ use frame_support::{traits::Get, weights::Weight}; use core::marker::PhantomData; +/// Weight functions for `pallet_message_queue`. pub struct WeightInfo(PhantomData); impl pallet_message_queue::WeightInfo for WeightInfo { - /// Storage: MessageQueue ServiceHead (r:1 w:0) - /// Proof: MessageQueue ServiceHead (max_values: Some(1), max_size: Some(5), added: 500, mode: MaxEncodedLen) - /// Storage: MessageQueue BookStateFor (r:2 w:2) - /// Proof: MessageQueue BookStateFor (max_values: None, max_size: Some(52), added: 2527, mode: MaxEncodedLen) + /// Storage: `MessageQueue::ServiceHead` (r:1 w:0) + /// Proof: `MessageQueue::ServiceHead` (`max_values`: Some(1), `max_size`: Some(5), added: 500, mode: `MaxEncodedLen`) + /// Storage: `MessageQueue::BookStateFor` (r:2 w:2) + /// Proof: `MessageQueue::BookStateFor` (`max_values`: None, `max_size`: Some(52), added: 2527, mode: `MaxEncodedLen`) fn ready_ring_knit() -> Weight { // Proof Size summary in bytes: - // Measured: `189` - // Estimated: `7534` - // Minimum execution time: 11_446_000 picoseconds. - Weight::from_parts(11_446_000, 0) - .saturating_add(Weight::from_parts(0, 7534)) + // Measured: `223` + // Estimated: `6044` + // Minimum execution time: 10_918_000 picoseconds. + Weight::from_parts(11_224_000, 0) + .saturating_add(Weight::from_parts(0, 6044)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(2)) } - /// Storage: MessageQueue BookStateFor (r:2 w:2) - /// Proof: MessageQueue BookStateFor (max_values: None, max_size: Some(52), added: 2527, mode: MaxEncodedLen) - /// Storage: MessageQueue ServiceHead (r:1 w:1) - /// Proof: MessageQueue ServiceHead (max_values: Some(1), max_size: Some(5), added: 500, mode: MaxEncodedLen) + /// Storage: `MessageQueue::BookStateFor` (r:2 w:2) + /// Proof: `MessageQueue::BookStateFor` (`max_values`: None, `max_size`: Some(52), added: 2527, mode: `MaxEncodedLen`) + /// Storage: `MessageQueue::ServiceHead` (r:1 w:1) + /// Proof: `MessageQueue::ServiceHead` (`max_values`: Some(1), `max_size`: Some(5), added: 500, mode: `MaxEncodedLen`) fn ready_ring_unknit() -> Weight { // Proof Size summary in bytes: - // Measured: `184` - // Estimated: `7534` - // Minimum execution time: 10_613_000 picoseconds. - Weight::from_parts(10_613_000, 0) - .saturating_add(Weight::from_parts(0, 7534)) + // Measured: `218` + // Estimated: `6044` + // Minimum execution time: 9_649_000 picoseconds. + Weight::from_parts(10_056_000, 0) + .saturating_add(Weight::from_parts(0, 6044)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(3)) } - /// Storage: MessageQueue BookStateFor (r:1 w:1) - /// Proof: MessageQueue BookStateFor (max_values: None, max_size: Some(52), added: 2527, mode: MaxEncodedLen) + /// Storage: `MessageQueue::BookStateFor` (r:1 w:1) + /// Proof: `MessageQueue::BookStateFor` (`max_values`: None, `max_size`: Some(52), added: 2527, mode: `MaxEncodedLen`) fn service_queue_base() -> Weight { // Proof Size summary in bytes: // Measured: `6` // Estimated: `3517` - // Minimum execution time: 4_854_000 picoseconds. - Weight::from_parts(4_854_000, 0) + // Minimum execution time: 3_134_000 picoseconds. + Weight::from_parts(3_197_000, 0) .saturating_add(Weight::from_parts(0, 3517)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } - /// Storage: MessageQueue Pages (r:1 w:1) - /// Proof: MessageQueue Pages (max_values: None, max_size: Some(65585), added: 68060, mode: MaxEncodedLen) + /// Storage: `MessageQueue::Pages` (r:1 w:1) + /// Proof: `MessageQueue::Pages` (`max_values`: None, `max_size`: Some(65585), added: 68060, mode: `MaxEncodedLen`) fn service_page_base_completion() -> Weight { // Proof Size summary in bytes: // Measured: `72` // Estimated: `69050` - // Minimum execution time: 5_748_000 picoseconds. - Weight::from_parts(5_748_000, 0) + // Minimum execution time: 4_915_000 picoseconds. + Weight::from_parts(5_127_000, 0) .saturating_add(Weight::from_parts(0, 69050)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } - /// Storage: MessageQueue Pages (r:1 w:1) - /// Proof: MessageQueue Pages (max_values: None, max_size: Some(65585), added: 68060, mode: MaxEncodedLen) + /// Storage: `MessageQueue::Pages` (r:1 w:1) + /// Proof: `MessageQueue::Pages` (`max_values`: None, `max_size`: Some(65585), added: 68060, mode: `MaxEncodedLen`) fn service_page_base_no_completion() -> Weight { // Proof Size summary in bytes: // Measured: `72` // Estimated: `69050` - // Minimum execution time: 6_136_000 picoseconds. - Weight::from_parts(6_136_000, 0) + // Minimum execution time: 5_011_000 picoseconds. + Weight::from_parts(5_150_000, 0) .saturating_add(Weight::from_parts(0, 69050)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } + /// Storage: `MessageQueue::BookStateFor` (r:0 w:1) + /// Proof: `MessageQueue::BookStateFor` (`max_values`: None, `max_size`: Some(52), added: 2527, mode: `MaxEncodedLen`) + /// Storage: `MessageQueue::Pages` (r:0 w:1) + /// Proof: `MessageQueue::Pages` (`max_values`: None, `max_size`: Some(65585), added: 68060, mode: `MaxEncodedLen`) fn service_page_item() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 59_505_000 picoseconds. - Weight::from_parts(59_505_000, 0) + // Minimum execution time: 168_806_000 picoseconds. + Weight::from_parts(170_795_000, 0) .saturating_add(Weight::from_parts(0, 0)) + .saturating_add(T::DbWeight::get().writes(2)) } - /// Storage: MessageQueue ServiceHead (r:1 w:1) - /// Proof: MessageQueue ServiceHead (max_values: Some(1), max_size: Some(5), added: 500, mode: MaxEncodedLen) - /// Storage: MessageQueue BookStateFor (r:1 w:0) - /// Proof: MessageQueue BookStateFor (max_values: None, max_size: Some(52), added: 2527, mode: MaxEncodedLen) + /// Storage: `MessageQueue::ServiceHead` (r:1 w:1) + /// Proof: `MessageQueue::ServiceHead` (`max_values`: Some(1), `max_size`: Some(5), added: 500, mode: `MaxEncodedLen`) + /// Storage: `MessageQueue::BookStateFor` (r:1 w:0) + /// Proof: `MessageQueue::BookStateFor` (`max_values`: None, `max_size`: Some(52), added: 2527, mode: `MaxEncodedLen`) fn bump_service_head() -> Weight { // Proof Size summary in bytes: - // Measured: `99` - // Estimated: `5007` - // Minimum execution time: 6_506_000 picoseconds. - Weight::from_parts(6_506_000, 0) - .saturating_add(Weight::from_parts(0, 5007)) + // Measured: `171` + // Estimated: `3517` + // Minimum execution time: 6_413_000 picoseconds. + Weight::from_parts(6_797_000, 0) + .saturating_add(Weight::from_parts(0, 3517)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } - /// Storage: MessageQueue BookStateFor (r:1 w:1) - /// Proof: MessageQueue BookStateFor (max_values: None, max_size: Some(52), added: 2527, mode: MaxEncodedLen) - /// Storage: MessageQueue Pages (r:1 w:1) - /// Proof: MessageQueue Pages (max_values: None, max_size: Some(65585), added: 68060, mode: MaxEncodedLen) + /// Storage: `MessageQueue::BookStateFor` (r:1 w:1) + /// Proof: `MessageQueue::BookStateFor` (`max_values`: None, `max_size`: Some(52), added: 2527, mode: `MaxEncodedLen`) + /// Storage: `MessageQueue::Pages` (r:1 w:1) + /// Proof: `MessageQueue::Pages` (`max_values`: None, `max_size`: Some(65585), added: 68060, mode: `MaxEncodedLen`) fn reap_page() -> Weight { // Proof Size summary in bytes: // Measured: `65667` - // Estimated: `72567` - // Minimum execution time: 40_646_000 picoseconds. - Weight::from_parts(40_646_000, 0) - .saturating_add(Weight::from_parts(0, 72567)) + // Estimated: `69050` + // Minimum execution time: 52_734_000 picoseconds. + Weight::from_parts(54_106_000, 0) + .saturating_add(Weight::from_parts(0, 69050)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } - /// Storage: MessageQueue BookStateFor (r:1 w:1) - /// Proof: MessageQueue BookStateFor (max_values: None, max_size: Some(52), added: 2527, mode: MaxEncodedLen) - /// Storage: MessageQueue Pages (r:1 w:1) - /// Proof: MessageQueue Pages (max_values: None, max_size: Some(65585), added: 68060, mode: MaxEncodedLen) + /// Storage: `MessageQueue::BookStateFor` (r:1 w:1) + /// Proof: `MessageQueue::BookStateFor` (`max_values`: None, `max_size`: Some(52), added: 2527, mode: `MaxEncodedLen`) + /// Storage: `MessageQueue::Pages` (r:1 w:1) + /// Proof: `MessageQueue::Pages` (`max_values`: None, `max_size`: Some(65585), added: 68060, mode: `MaxEncodedLen`) fn execute_overweight_page_removed() -> Weight { // Proof Size summary in bytes: // Measured: `65667` - // Estimated: `72567` - // Minimum execution time: 51_424_000 picoseconds. - Weight::from_parts(51_424_000, 0) - .saturating_add(Weight::from_parts(0, 72567)) + // Estimated: `69050` + // Minimum execution time: 68_400_000 picoseconds. + Weight::from_parts(70_336_000, 0) + .saturating_add(Weight::from_parts(0, 69050)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } - /// Storage: MessageQueue BookStateFor (r:1 w:1) - /// Proof: MessageQueue BookStateFor (max_values: None, max_size: Some(52), added: 2527, mode: MaxEncodedLen) - /// Storage: MessageQueue Pages (r:1 w:1) - /// Proof: MessageQueue Pages (max_values: None, max_size: Some(65585), added: 68060, mode: MaxEncodedLen) + /// Storage: `MessageQueue::BookStateFor` (r:1 w:1) + /// Proof: `MessageQueue::BookStateFor` (`max_values`: None, `max_size`: Some(52), added: 2527, mode: `MaxEncodedLen`) + /// Storage: `MessageQueue::Pages` (r:1 w:1) + /// Proof: `MessageQueue::Pages` (`max_values`: None, `max_size`: Some(65585), added: 68060, mode: `MaxEncodedLen`) fn execute_overweight_page_updated() -> Weight { // Proof Size summary in bytes: // Measured: `65667` - // Estimated: `72567` - // Minimum execution time: 81_153_000 picoseconds. - Weight::from_parts(81_153_000, 0) - .saturating_add(Weight::from_parts(0, 72567)) + // Estimated: `69050` + // Minimum execution time: 109_496_000 picoseconds. + Weight::from_parts(111_632_000, 0) + .saturating_add(Weight::from_parts(0, 69050)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } -} \ No newline at end of file +} diff --git a/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_multisig.rs b/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_multisig.rs index 4130e05bf7c4233b5dfdd6fcf0df1295ce77db61..1aaf3f4a6fb9dd88f83042915080b08bb735e664 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_multisig.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_multisig.rs @@ -1,4 +1,4 @@ -// Copyright Parity Technologies (UK) Ltd. +// Copyright (C) Parity Technologies (UK) Ltd. // This file is part of Cumulus. // Cumulus is free software: you can redistribute it and/or modify @@ -16,26 +16,28 @@ //! Autogenerated weights for `pallet_multisig` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-02-08, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("coretime-westend-dev"), DB CACHE: 1024 +//! HOSTNAME: `runner-bn-ce5rx-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("coretime-westend-dev")`, DB CACHE: 1024 // Executed Command: -// ./artifacts/westend-parachain +// ./target/production/polkadot-parachain // benchmark // pallet // --chain=coretime-westend-dev -// --execution=wasm // --wasm-execution=compiled // --pallet=pallet_multisig +// --no-storage-info +// --no-median-slopes +// --no-min-squares // --extrinsic=* // --steps=50 // --repeat=20 // --json -// --header=./file_header.txt -// --output=./cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_multisig.rs +// --header=./cumulus/file_header.txt +// --output=./cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -53,110 +55,110 @@ impl pallet_multisig::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 11_337_000 picoseconds. - Weight::from_parts(11_960_522, 0) + // Minimum execution time: 11_938_000 picoseconds. + Weight::from_parts(13_021_007, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 9 - .saturating_add(Weight::from_parts(504, 0).saturating_mul(z.into())) + // Standard Error: 4 + .saturating_add(Weight::from_parts(482, 0).saturating_mul(z.into())) } - /// Storage: Multisig Multisigs (r:1 w:1) - /// Proof: Multisig Multisigs (max_values: None, max_size: Some(3346), added: 5821, mode: MaxEncodedLen) + /// Storage: `Multisig::Multisigs` (r:1 w:1) + /// Proof: `Multisig::Multisigs` (`max_values`: None, `max_size`: Some(3346), added: 5821, mode: `MaxEncodedLen`) /// The range of component `s` is `[2, 100]`. /// The range of component `z` is `[0, 10000]`. fn as_multi_create(s: u32, z: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `263 + s * (2 ±0)` + // Measured: `262 + s * (2 ±0)` // Estimated: `6811` - // Minimum execution time: 41_128_000 picoseconds. - Weight::from_parts(35_215_592, 0) + // Minimum execution time: 37_643_000 picoseconds. + Weight::from_parts(27_088_068, 0) .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 429 - .saturating_add(Weight::from_parts(65_959, 0).saturating_mul(s.into())) - // Standard Error: 4 - .saturating_add(Weight::from_parts(1_230, 0).saturating_mul(z.into())) + // Standard Error: 828 + .saturating_add(Weight::from_parts(123_693, 0).saturating_mul(s.into())) + // Standard Error: 8 + .saturating_add(Weight::from_parts(1_456, 0).saturating_mul(z.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } - /// Storage: Multisig Multisigs (r:1 w:1) - /// Proof: Multisig Multisigs (max_values: None, max_size: Some(3346), added: 5821, mode: MaxEncodedLen) + /// Storage: `Multisig::Multisigs` (r:1 w:1) + /// Proof: `Multisig::Multisigs` (`max_values`: None, `max_size`: Some(3346), added: 5821, mode: `MaxEncodedLen`) /// The range of component `s` is `[3, 100]`. /// The range of component `z` is `[0, 10000]`. fn as_multi_approve(s: u32, z: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `282` // Estimated: `6811` - // Minimum execution time: 26_878_000 picoseconds. - Weight::from_parts(21_448_577, 0) + // Minimum execution time: 25_825_000 picoseconds. + Weight::from_parts(15_698_835, 0) .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 354 - .saturating_add(Weight::from_parts(60_286, 0).saturating_mul(s.into())) - // Standard Error: 3 - .saturating_add(Weight::from_parts(1_236, 0).saturating_mul(z.into())) + // Standard Error: 568 + .saturating_add(Weight::from_parts(111_928, 0).saturating_mul(s.into())) + // Standard Error: 5 + .saturating_add(Weight::from_parts(1_421, 0).saturating_mul(z.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } - /// Storage: Multisig Multisigs (r:1 w:1) - /// Proof: Multisig Multisigs (max_values: None, max_size: Some(3346), added: 5821, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: `Multisig::Multisigs` (r:1 w:1) + /// Proof: `Multisig::Multisigs` (`max_values`: None, `max_size`: Some(3346), added: 5821, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) /// The range of component `s` is `[2, 100]`. /// The range of component `z` is `[0, 10000]`. fn as_multi_complete(s: u32, z: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `388 + s * (33 ±0)` + // Measured: `385 + s * (33 ±0)` // Estimated: `6811` - // Minimum execution time: 45_716_000 picoseconds. - Weight::from_parts(38_332_947, 0) + // Minimum execution time: 43_587_000 picoseconds. + Weight::from_parts(29_740_539, 0) .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 554 - .saturating_add(Weight::from_parts(81_026, 0).saturating_mul(s.into())) - // Standard Error: 5 - .saturating_add(Weight::from_parts(1_265, 0).saturating_mul(z.into())) + // Standard Error: 771 + .saturating_add(Weight::from_parts(154_861, 0).saturating_mul(s.into())) + // Standard Error: 7 + .saturating_add(Weight::from_parts(1_557, 0).saturating_mul(z.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } - /// Storage: Multisig Multisigs (r:1 w:1) - /// Proof: Multisig Multisigs (max_values: None, max_size: Some(3346), added: 5821, mode: MaxEncodedLen) + /// Storage: `Multisig::Multisigs` (r:1 w:1) + /// Proof: `Multisig::Multisigs` (`max_values`: None, `max_size`: Some(3346), added: 5821, mode: `MaxEncodedLen`) /// The range of component `s` is `[2, 100]`. fn approve_as_multi_create(s: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `263 + s * (2 ±0)` // Estimated: `6811` - // Minimum execution time: 32_089_000 picoseconds. - Weight::from_parts(33_664_508, 0) + // Minimum execution time: 24_966_000 picoseconds. + Weight::from_parts(25_879_458, 0) .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 487 - .saturating_add(Weight::from_parts(67_443, 0).saturating_mul(s.into())) + // Standard Error: 777 + .saturating_add(Weight::from_parts(122_823, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } - /// Storage: Multisig Multisigs (r:1 w:1) - /// Proof: Multisig Multisigs (max_values: None, max_size: Some(3346), added: 5821, mode: MaxEncodedLen) + /// Storage: `Multisig::Multisigs` (r:1 w:1) + /// Proof: `Multisig::Multisigs` (`max_values`: None, `max_size`: Some(3346), added: 5821, mode: `MaxEncodedLen`) /// The range of component `s` is `[2, 100]`. fn approve_as_multi_approve(s: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `282` // Estimated: `6811` - // Minimum execution time: 18_631_000 picoseconds. - Weight::from_parts(19_909_964, 0) + // Minimum execution time: 14_450_000 picoseconds. + Weight::from_parts(14_607_858, 0) .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 434 - .saturating_add(Weight::from_parts(62_989, 0).saturating_mul(s.into())) + // Standard Error: 471 + .saturating_add(Weight::from_parts(107_007, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } - /// Storage: Multisig Multisigs (r:1 w:1) - /// Proof: Multisig Multisigs (max_values: None, max_size: Some(3346), added: 5821, mode: MaxEncodedLen) + /// Storage: `Multisig::Multisigs` (r:1 w:1) + /// Proof: `Multisig::Multisigs` (`max_values`: None, `max_size`: Some(3346), added: 5821, mode: `MaxEncodedLen`) /// The range of component `s` is `[2, 100]`. fn cancel_as_multi(s: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `454 + s * (1 ±0)` // Estimated: `6811` - // Minimum execution time: 32_486_000 picoseconds. - Weight::from_parts(34_303_784, 0) + // Minimum execution time: 26_861_000 picoseconds. + Weight::from_parts(27_846_825, 0) .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 585 - .saturating_add(Weight::from_parts(69_979, 0).saturating_mul(s.into())) + // Standard Error: 714 + .saturating_add(Weight::from_parts(116_914, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } diff --git a/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_session.rs b/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_session.rs index d132ef17bbdb2295dcd4ee812ab62ae51fd6ff3a..b0d993d68a6a4e824c6050a3edef87870438e6b2 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_session.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_session.rs @@ -1,4 +1,4 @@ -// Copyright Parity Technologies (UK) Ltd. +// Copyright (C) Parity Technologies (UK) Ltd. // This file is part of Cumulus. // Cumulus is free software: you can redistribute it and/or modify @@ -16,26 +16,28 @@ //! Autogenerated weights for `pallet_session` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-02-08, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("coretime-westend-dev"), DB CACHE: 1024 +//! HOSTNAME: `runner-bn-ce5rx-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("coretime-westend-dev")`, DB CACHE: 1024 // Executed Command: -// ./artifacts/westend-parachain +// ./target/production/polkadot-parachain // benchmark // pallet // --chain=coretime-westend-dev -// --execution=wasm // --wasm-execution=compiled // --pallet=pallet_session +// --no-storage-info +// --no-median-slopes +// --no-min-squares // --extrinsic=* // --steps=50 // --repeat=20 // --json -// --header=./file_header.txt -// --output=./cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_session.rs +// --header=./cumulus/file_header.txt +// --output=./cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -48,31 +50,31 @@ use core::marker::PhantomData; /// Weight functions for `pallet_session`. pub struct WeightInfo(PhantomData); impl pallet_session::WeightInfo for WeightInfo { - /// Storage: Session NextKeys (r:1 w:1) - /// Proof Skipped: Session NextKeys (max_values: None, max_size: None, mode: Measured) - /// Storage: Session KeyOwner (r:1 w:1) - /// Proof Skipped: Session KeyOwner (max_values: None, max_size: None, mode: Measured) + /// Storage: `Session::NextKeys` (r:1 w:1) + /// Proof: `Session::NextKeys` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Session::KeyOwner` (r:1 w:1) + /// Proof: `Session::KeyOwner` (`max_values`: None, `max_size`: None, mode: `Measured`) fn set_keys() -> Weight { // Proof Size summary in bytes: - // Measured: `297` - // Estimated: `3762` - // Minimum execution time: 17_353_000 picoseconds. - Weight::from_parts(18_005_000, 0) - .saturating_add(Weight::from_parts(0, 3762)) + // Measured: `271` + // Estimated: `3736` + // Minimum execution time: 15_149_000 picoseconds. + Weight::from_parts(16_053_000, 0) + .saturating_add(Weight::from_parts(0, 3736)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } - /// Storage: Session NextKeys (r:1 w:1) - /// Proof Skipped: Session NextKeys (max_values: None, max_size: None, mode: Measured) - /// Storage: Session KeyOwner (r:0 w:1) - /// Proof Skipped: Session KeyOwner (max_values: None, max_size: None, mode: Measured) + /// Storage: `Session::NextKeys` (r:1 w:1) + /// Proof: `Session::NextKeys` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Session::KeyOwner` (r:0 w:1) + /// Proof: `Session::KeyOwner` (`max_values`: None, `max_size`: None, mode: `Measured`) fn purge_keys() -> Weight { // Proof Size summary in bytes: - // Measured: `279` - // Estimated: `3744` - // Minimum execution time: 13_039_000 picoseconds. - Weight::from_parts(13_341_000, 0) - .saturating_add(Weight::from_parts(0, 3744)) + // Measured: `243` + // Estimated: `3708` + // Minimum execution time: 11_159_000 picoseconds. + Weight::from_parts(11_504_000, 0) + .saturating_add(Weight::from_parts(0, 3708)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) } diff --git a/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_timestamp.rs b/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_timestamp.rs index 722858a3a4655881cdbedbe8e6cae419baefc190..ad8924d9ce7374c285ddc662c59d860707443bfc 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_timestamp.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_timestamp.rs @@ -1,4 +1,4 @@ -// Copyright Parity Technologies (UK) Ltd. +// Copyright (C) Parity Technologies (UK) Ltd. // This file is part of Cumulus. // Cumulus is free software: you can redistribute it and/or modify @@ -16,26 +16,28 @@ //! Autogenerated weights for `pallet_timestamp` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-02-08, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("coretime-westend-dev"), DB CACHE: 1024 +//! HOSTNAME: `runner-bn-ce5rx-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("coretime-westend-dev")`, DB CACHE: 1024 // Executed Command: -// ./artifacts/westend-parachain +// ./target/production/polkadot-parachain // benchmark // pallet // --chain=coretime-westend-dev -// --execution=wasm // --wasm-execution=compiled // --pallet=pallet_timestamp +// --no-storage-info +// --no-median-slopes +// --no-min-squares // --extrinsic=* // --steps=50 // --repeat=20 // --json -// --header=./file_header.txt -// --output=./cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_timestamp.rs +// --header=./cumulus/file_header.txt +// --output=./cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -48,16 +50,16 @@ use core::marker::PhantomData; /// Weight functions for `pallet_timestamp`. pub struct WeightInfo(PhantomData); impl pallet_timestamp::WeightInfo for WeightInfo { - /// Storage: Timestamp Now (r:1 w:1) - /// Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - /// Storage: Aura CurrentSlot (r:1 w:0) - /// Proof: Aura CurrentSlot (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) + /// Storage: `Timestamp::Now` (r:1 w:1) + /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `MaxEncodedLen`) + /// Storage: `Aura::CurrentSlot` (r:1 w:0) + /// Proof: `Aura::CurrentSlot` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `MaxEncodedLen`) fn set() -> Weight { // Proof Size summary in bytes: - // Measured: `49` + // Measured: `86` // Estimated: `1493` - // Minimum execution time: 7_986_000 picoseconds. - Weight::from_parts(8_134_000, 0) + // Minimum execution time: 5_552_000 picoseconds. + Weight::from_parts(5_821_000, 0) .saturating_add(Weight::from_parts(0, 1493)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) @@ -66,8 +68,8 @@ impl pallet_timestamp::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `57` // Estimated: `0` - // Minimum execution time: 3_257_000 picoseconds. - Weight::from_parts(3_366_000, 0) + // Minimum execution time: 2_848_000 picoseconds. + Weight::from_parts(2_953_000, 0) .saturating_add(Weight::from_parts(0, 0)) } } diff --git a/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_utility.rs b/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_utility.rs index dacd469ebb7ab62eb7fcd7740bf6bf230aace7ee..0f5340843bd6481da855cb403b2b7d6442ed0a52 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_utility.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_utility.rs @@ -1,4 +1,4 @@ -// Copyright Parity Technologies (UK) Ltd. +// Copyright (C) Parity Technologies (UK) Ltd. // This file is part of Cumulus. // Cumulus is free software: you can redistribute it and/or modify @@ -16,26 +16,28 @@ //! Autogenerated weights for `pallet_utility` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-02-08, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("coretime-westend-dev"), DB CACHE: 1024 +//! HOSTNAME: `runner-bn-ce5rx-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("coretime-westend-dev")`, DB CACHE: 1024 // Executed Command: -// ./artifacts/westend-parachain +// ./target/production/polkadot-parachain // benchmark // pallet // --chain=coretime-westend-dev -// --execution=wasm // --wasm-execution=compiled // --pallet=pallet_utility +// --no-storage-info +// --no-median-slopes +// --no-min-squares // --extrinsic=* // --steps=50 // --repeat=20 // --json -// --header=./file_header.txt -// --output=./cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_utility.rs +// --header=./cumulus/file_header.txt +// --output=./cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -53,18 +55,18 @@ impl pallet_utility::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 6_697_000 picoseconds. - Weight::from_parts(11_859_145, 0) + // Minimum execution time: 3_721_000 picoseconds. + Weight::from_parts(7_071_852, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 3_146 - .saturating_add(Weight::from_parts(4_300_555, 0).saturating_mul(c.into())) + // Standard Error: 746 + .saturating_add(Weight::from_parts(2_767_352, 0).saturating_mul(c.into())) } fn as_derivative() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_979_000 picoseconds. - Weight::from_parts(5_066_000, 0) + // Minimum execution time: 3_631_000 picoseconds. + Weight::from_parts(3_836_000, 0) .saturating_add(Weight::from_parts(0, 0)) } /// The range of component `c` is `[0, 1000]`. @@ -72,18 +74,18 @@ impl pallet_utility::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 6_741_000 picoseconds. - Weight::from_parts(15_928_547, 0) + // Minimum execution time: 3_817_000 picoseconds. + Weight::from_parts(2_683_003, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 3_310 - .saturating_add(Weight::from_parts(4_527_996, 0).saturating_mul(c.into())) + // Standard Error: 782 + .saturating_add(Weight::from_parts(3_059_987, 0).saturating_mul(c.into())) } fn dispatch_as() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 8_717_000 picoseconds. - Weight::from_parts(8_909_000, 0) + // Minimum execution time: 5_463_000 picoseconds. + Weight::from_parts(5_701_000, 0) .saturating_add(Weight::from_parts(0, 0)) } /// The range of component `c` is `[0, 1000]`. @@ -91,10 +93,10 @@ impl pallet_utility::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 6_814_000 picoseconds. - Weight::from_parts(13_920_831, 0) + // Minimum execution time: 3_771_000 picoseconds. + Weight::from_parts(5_714_929, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 7_605 - .saturating_add(Weight::from_parts(4_306_193, 0).saturating_mul(c.into())) + // Standard Error: 740 + .saturating_add(Weight::from_parts(2_800_888, 0).saturating_mul(c.into())) } } diff --git a/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_xcm.rs b/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_xcm.rs index d96ee43463a316d3b8a0c5c8351045d7c340cd13..a1701c5f1c2ced1bbdcac49863cc05ceb28a019f 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_xcm.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_xcm.rs @@ -1,4 +1,4 @@ -// Copyright Parity Technologies (UK) Ltd. +// Copyright (C) Parity Technologies (UK) Ltd. // This file is part of Cumulus. // Cumulus is free software: you can redistribute it and/or modify @@ -16,26 +16,26 @@ //! Autogenerated weights for `pallet_xcm` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-03-21, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("coretime-westend-dev"), DB CACHE: 1024 +//! HOSTNAME: `runner-h2rr8wx7-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("coretime-westend-dev")`, DB CACHE: 1024 // Executed Command: -// ./artifacts/westend-parachain +// target/production/polkadot-parachain // benchmark // pallet -// --chain=coretime-westend-dev -// --execution=wasm -// --wasm-execution=compiled -// --pallet=pallet_xcm -// --extrinsic=* // --steps=50 // --repeat=20 -// --json -// --header=./file_header.txt -// --output=./cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_xcm.rs +// --extrinsic=* +// --wasm-execution=compiled +// --heap-pages=4096 +// --json-file=/builds/parity/mirrors/polkadot-sdk/.git/.artifacts/bench.json +// --pallet=pallet_xcm +// --chain=coretime-westend-dev +// --header=./cumulus/file_header.txt +// --output=./cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -48,39 +48,70 @@ use core::marker::PhantomData; /// Weight functions for `pallet_xcm`. pub struct WeightInfo(PhantomData); impl pallet_xcm::WeightInfo for WeightInfo { - /// Storage: PolkadotXcm SupportedVersion (r:1 w:0) - /// Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) - /// Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) - /// Proof Skipped: PolkadotXcm VersionDiscoveryQueue (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: PolkadotXcm SafeXcmVersion (r:1 w:0) - /// Proof Skipped: PolkadotXcm SafeXcmVersion (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ParachainSystem HostConfiguration (r:1 w:0) - /// Proof Skipped: ParachainSystem HostConfiguration (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ParachainSystem PendingUpwardMessages (r:1 w:1) - /// Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) + /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) + /// Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) + /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) + /// Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) + /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) fn send() -> Weight { // Proof Size summary in bytes: - // Measured: `38` - // Estimated: `3503` - // Minimum execution time: 25_783_000 picoseconds. - Weight::from_parts(26_398_000, 0) - .saturating_add(Weight::from_parts(0, 3503)) + // Measured: `74` + // Estimated: `3539` + // Minimum execution time: 17_681_000 picoseconds. + Weight::from_parts(18_350_000, 0) + .saturating_add(Weight::from_parts(0, 3539)) + .saturating_add(T::DbWeight::get().reads(5)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) + /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) + /// Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) + /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) + /// Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) + /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + fn send_blob() -> Weight { + // Proof Size summary in bytes: + // Measured: `74` + // Estimated: `3539` + // Minimum execution time: 18_091_000 picoseconds. + Weight::from_parts(18_327_000, 0) + .saturating_add(Weight::from_parts(0, 3539)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) } - /// Storage: ParachainInfo ParachainId (r:1 w:0) - /// Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + /// Storage: `ParachainInfo::ParachainId` (r:1 w:0) + /// Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) + /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) + /// Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) + /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) + /// Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) + /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) fn teleport_assets() -> Weight { // Proof Size summary in bytes: - // Measured: `32` - // Estimated: `1489` - // Minimum execution time: 25_511_000 picoseconds. - Weight::from_parts(26_120_000, 0) - .saturating_add(Weight::from_parts(0, 1489)) - .saturating_add(T::DbWeight::get().reads(1)) + // Measured: `106` + // Estimated: `3571` + // Minimum execution time: 54_943_000 picoseconds. + Weight::from_parts(56_519_000, 0) + .saturating_add(Weight::from_parts(0, 3571)) + .saturating_add(T::DbWeight::get().reads(6)) + .saturating_add(T::DbWeight::get().writes(2)) } - /// Storage: Benchmark Override (r:0 w:0) - /// Proof Skipped: Benchmark Override (max_values: None, max_size: None, mode: Measured) + /// Storage: `Benchmark::Override` (r:0 w:0) + /// Proof: `Benchmark::Override` (`max_values`: None, `max_size`: None, mode: `Measured`) fn reserve_transfer_assets() -> Weight { // Proof Size summary in bytes: // Measured: `0` @@ -89,18 +120,18 @@ impl pallet_xcm::WeightInfo for WeightInfo { Weight::from_parts(18_446_744_073_709_551_000, 0) .saturating_add(Weight::from_parts(0, 0)) } + /// Storage: `Benchmark::Override` (r:0 w:0) + /// Proof: `Benchmark::Override` (`max_values`: None, `max_size`: None, mode: `Measured`) fn transfer_assets() -> Weight { // Proof Size summary in bytes: - // Measured: `496` - // Estimated: `6208` - // Minimum execution time: 146_932_000 picoseconds. - Weight::from_parts(153_200_000, 0) - .saturating_add(Weight::from_parts(0, 6208)) - .saturating_add(T::DbWeight::get().reads(12)) - .saturating_add(T::DbWeight::get().writes(7)) + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 18_446_744_073_709_551_000 picoseconds. + Weight::from_parts(18_446_744_073_709_551_000, 0) + .saturating_add(Weight::from_parts(0, 0)) } - /// Storage: Benchmark Override (r:0 w:0) - /// Proof Skipped: Benchmark Override (max_values: None, max_size: None, mode: Measured) + /// Storage: `Benchmark::Override` (r:0 w:0) + /// Proof: `Benchmark::Override` (`max_values`: None, `max_size`: None, mode: `Measured`) fn execute() -> Weight { // Proof Size summary in bytes: // Measured: `0` @@ -109,189 +140,199 @@ impl pallet_xcm::WeightInfo for WeightInfo { Weight::from_parts(18_446_744_073_709_551_000, 0) .saturating_add(Weight::from_parts(0, 0)) } - /// Storage: PolkadotXcm SupportedVersion (r:0 w:1) - /// Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) + /// Storage: `Benchmark::Override` (r:0 w:0) + /// Proof: `Benchmark::Override` (`max_values`: None, `max_size`: None, mode: `Measured`) + fn execute_blob() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 18_446_744_073_709_551_000 picoseconds. + Weight::from_parts(18_446_744_073_709_551_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + } + /// Storage: `PolkadotXcm::SupportedVersion` (r:0 w:1) + /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) fn force_xcm_version() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 9_707_000 picoseconds. - Weight::from_parts(9_874_000, 0) + // Minimum execution time: 5_887_000 picoseconds. + Weight::from_parts(6_101_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } - /// Storage: PolkadotXcm SafeXcmVersion (r:0 w:1) - /// Proof Skipped: PolkadotXcm SafeXcmVersion (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: `PolkadotXcm::SafeXcmVersion` (r:0 w:1) + /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) fn force_default_xcm_version() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_073_000 picoseconds. - Weight::from_parts(3_183_000, 0) + // Minimum execution time: 1_940_000 picoseconds. + Weight::from_parts(2_022_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } - /// Storage: PolkadotXcm VersionNotifiers (r:1 w:1) - /// Proof Skipped: PolkadotXcm VersionNotifiers (max_values: None, max_size: None, mode: Measured) - /// Storage: PolkadotXcm QueryCounter (r:1 w:1) - /// Proof Skipped: PolkadotXcm QueryCounter (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: PolkadotXcm SupportedVersion (r:1 w:0) - /// Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) - /// Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) - /// Proof Skipped: PolkadotXcm VersionDiscoveryQueue (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: PolkadotXcm SafeXcmVersion (r:1 w:0) - /// Proof Skipped: PolkadotXcm SafeXcmVersion (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ParachainSystem HostConfiguration (r:1 w:0) - /// Proof Skipped: ParachainSystem HostConfiguration (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ParachainSystem PendingUpwardMessages (r:1 w:1) - /// Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: PolkadotXcm Queries (r:0 w:1) - /// Proof Skipped: PolkadotXcm Queries (max_values: None, max_size: None, mode: Measured) + /// Storage: `PolkadotXcm::VersionNotifiers` (r:1 w:1) + /// Proof: `PolkadotXcm::VersionNotifiers` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::QueryCounter` (r:1 w:1) + /// Proof: `PolkadotXcm::QueryCounter` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) + /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) + /// Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) + /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) + /// Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) + /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::Queries` (r:0 w:1) + /// Proof: `PolkadotXcm::Queries` (`max_values`: None, `max_size`: None, mode: `Measured`) fn force_subscribe_version_notify() -> Weight { // Proof Size summary in bytes: - // Measured: `38` - // Estimated: `3503` - // Minimum execution time: 30_999_000 picoseconds. - Weight::from_parts(31_641_000, 0) - .saturating_add(Weight::from_parts(0, 3503)) + // Measured: `74` + // Estimated: `3539` + // Minimum execution time: 23_165_000 picoseconds. + Weight::from_parts(23_800_000, 0) + .saturating_add(Weight::from_parts(0, 3539)) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(5)) } - /// Storage: PolkadotXcm VersionNotifiers (r:1 w:1) - /// Proof Skipped: PolkadotXcm VersionNotifiers (max_values: None, max_size: None, mode: Measured) - /// Storage: PolkadotXcm SupportedVersion (r:1 w:0) - /// Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) - /// Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) - /// Proof Skipped: PolkadotXcm VersionDiscoveryQueue (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: PolkadotXcm SafeXcmVersion (r:1 w:0) - /// Proof Skipped: PolkadotXcm SafeXcmVersion (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ParachainSystem HostConfiguration (r:1 w:0) - /// Proof Skipped: ParachainSystem HostConfiguration (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ParachainSystem PendingUpwardMessages (r:1 w:1) - /// Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: PolkadotXcm Queries (r:0 w:1) - /// Proof Skipped: PolkadotXcm Queries (max_values: None, max_size: None, mode: Measured) + /// Storage: `PolkadotXcm::VersionNotifiers` (r:1 w:1) + /// Proof: `PolkadotXcm::VersionNotifiers` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) + /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) + /// Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) + /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) + /// Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) + /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::Queries` (r:0 w:1) + /// Proof: `PolkadotXcm::Queries` (`max_values`: None, `max_size`: None, mode: `Measured`) fn force_unsubscribe_version_notify() -> Weight { // Proof Size summary in bytes: - // Measured: `220` - // Estimated: `3685` - // Minimum execution time: 33_036_000 picoseconds. - Weight::from_parts(33_596_000, 0) - .saturating_add(Weight::from_parts(0, 3685)) + // Measured: `292` + // Estimated: `3757` + // Minimum execution time: 26_506_000 picoseconds. + Weight::from_parts(27_180_000, 0) + .saturating_add(Weight::from_parts(0, 3757)) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(4)) } - /// Storage: PolkadotXcm XcmExecutionSuspended (r:0 w:1) - /// Proof Skipped: PolkadotXcm XcmExecutionSuspended (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: `PolkadotXcm::XcmExecutionSuspended` (r:0 w:1) + /// Proof: `PolkadotXcm::XcmExecutionSuspended` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) fn force_suspension() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_035_000 picoseconds. - Weight::from_parts(3_154_000, 0) + // Minimum execution time: 1_868_000 picoseconds. + Weight::from_parts(2_002_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } - /// Storage: PolkadotXcm SupportedVersion (r:4 w:2) - /// Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) + /// Storage: `PolkadotXcm::SupportedVersion` (r:5 w:2) + /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) fn migrate_supported_version() -> Weight { // Proof Size summary in bytes: - // Measured: `95` - // Estimated: `10985` - // Minimum execution time: 14_805_000 picoseconds. - Weight::from_parts(15_120_000, 0) - .saturating_add(Weight::from_parts(0, 10985)) - .saturating_add(T::DbWeight::get().reads(4)) + // Measured: `89` + // Estimated: `13454` + // Minimum execution time: 16_138_000 picoseconds. + Weight::from_parts(16_447_000, 0) + .saturating_add(Weight::from_parts(0, 13454)) + .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) } - /// Storage: PolkadotXcm VersionNotifiers (r:4 w:2) - /// Proof Skipped: PolkadotXcm VersionNotifiers (max_values: None, max_size: None, mode: Measured) + /// Storage: `PolkadotXcm::VersionNotifiers` (r:5 w:2) + /// Proof: `PolkadotXcm::VersionNotifiers` (`max_values`: None, `max_size`: None, mode: `Measured`) fn migrate_version_notifiers() -> Weight { // Proof Size summary in bytes: - // Measured: `99` - // Estimated: `10989` - // Minimum execution time: 14_572_000 picoseconds. - Weight::from_parts(14_909_000, 0) - .saturating_add(Weight::from_parts(0, 10989)) - .saturating_add(T::DbWeight::get().reads(4)) + // Measured: `93` + // Estimated: `13458` + // Minimum execution time: 16_099_000 picoseconds. + Weight::from_parts(16_592_000, 0) + .saturating_add(Weight::from_parts(0, 13458)) + .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) } - /// Storage: PolkadotXcm VersionNotifyTargets (r:5 w:0) - /// Proof Skipped: PolkadotXcm VersionNotifyTargets (max_values: None, max_size: None, mode: Measured) + /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:6 w:0) + /// Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) fn already_notified_target() -> Weight { // Proof Size summary in bytes: // Measured: `106` - // Estimated: `13471` - // Minimum execution time: 15_341_000 picoseconds. - Weight::from_parts(15_708_000, 0) - .saturating_add(Weight::from_parts(0, 13471)) - .saturating_add(T::DbWeight::get().reads(5)) + // Estimated: `15946` + // Minimum execution time: 17_972_000 picoseconds. + Weight::from_parts(18_379_000, 0) + .saturating_add(Weight::from_parts(0, 15946)) + .saturating_add(T::DbWeight::get().reads(6)) } - /// Storage: PolkadotXcm VersionNotifyTargets (r:2 w:1) - /// Proof Skipped: PolkadotXcm VersionNotifyTargets (max_values: None, max_size: None, mode: Measured) - /// Storage: PolkadotXcm SupportedVersion (r:1 w:0) - /// Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) - /// Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) - /// Proof Skipped: PolkadotXcm VersionDiscoveryQueue (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: PolkadotXcm SafeXcmVersion (r:1 w:0) - /// Proof Skipped: PolkadotXcm SafeXcmVersion (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ParachainSystem HostConfiguration (r:1 w:0) - /// Proof Skipped: ParachainSystem HostConfiguration (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ParachainSystem PendingUpwardMessages (r:1 w:1) - /// Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:2 w:1) + /// Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) + /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) + /// Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) + /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) + /// Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) + /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) fn notify_current_targets() -> Weight { // Proof Size summary in bytes: - // Measured: `106` - // Estimated: `6046` - // Minimum execution time: 27_840_000 picoseconds. - Weight::from_parts(28_248_000, 0) - .saturating_add(Weight::from_parts(0, 6046)) + // Measured: `142` + // Estimated: `6082` + // Minimum execution time: 23_554_000 picoseconds. + Weight::from_parts(24_446_000, 0) + .saturating_add(Weight::from_parts(0, 6082)) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(3)) } - /// Storage: PolkadotXcm VersionNotifyTargets (r:3 w:0) - /// Proof Skipped: PolkadotXcm VersionNotifyTargets (max_values: None, max_size: None, mode: Measured) + /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:4 w:0) + /// Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) fn notify_target_migration_fail() -> Weight { // Proof Size summary in bytes: // Measured: `136` - // Estimated: `8551` - // Minimum execution time: 8_245_000 picoseconds. - Weight::from_parts(8_523_000, 0) - .saturating_add(Weight::from_parts(0, 8551)) - .saturating_add(T::DbWeight::get().reads(3)) + // Estimated: `11026` + // Minimum execution time: 10_541_000 picoseconds. + Weight::from_parts(10_894_000, 0) + .saturating_add(Weight::from_parts(0, 11026)) + .saturating_add(T::DbWeight::get().reads(4)) } - /// Storage: PolkadotXcm VersionNotifyTargets (r:4 w:2) - /// Proof Skipped: PolkadotXcm VersionNotifyTargets (max_values: None, max_size: None, mode: Measured) + /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:5 w:2) + /// Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) fn migrate_version_notify_targets() -> Weight { // Proof Size summary in bytes: - // Measured: `106` - // Estimated: `10996` - // Minimum execution time: 14_780_000 picoseconds. - Weight::from_parts(15_173_000, 0) - .saturating_add(Weight::from_parts(0, 10996)) - .saturating_add(T::DbWeight::get().reads(4)) + // Measured: `100` + // Estimated: `13465` + // Minimum execution time: 16_404_000 picoseconds. + Weight::from_parts(16_818_000, 0) + .saturating_add(Weight::from_parts(0, 13465)) + .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) } - /// Storage: PolkadotXcm VersionNotifyTargets (r:4 w:2) - /// Proof Skipped: PolkadotXcm VersionNotifyTargets (max_values: None, max_size: None, mode: Measured) - /// Storage: PolkadotXcm SupportedVersion (r:1 w:0) - /// Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) - /// Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) - /// Proof Skipped: PolkadotXcm VersionDiscoveryQueue (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: PolkadotXcm SafeXcmVersion (r:1 w:0) - /// Proof Skipped: PolkadotXcm SafeXcmVersion (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ParachainSystem HostConfiguration (r:1 w:0) - /// Proof Skipped: ParachainSystem HostConfiguration (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ParachainSystem PendingUpwardMessages (r:1 w:1) - /// Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:5 w:2) + /// Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) + /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) + /// Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) + /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) + /// Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) + /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) fn migrate_and_notify_old_targets() -> Weight { // Proof Size summary in bytes: - // Measured: `112` - // Estimated: `11002` - // Minimum execution time: 33_422_000 picoseconds. - Weight::from_parts(34_076_000, 0) - .saturating_add(Weight::from_parts(0, 11002)) - .saturating_add(T::DbWeight::get().reads(9)) + // Measured: `142` + // Estimated: `13507` + // Minimum execution time: 31_617_000 picoseconds. + Weight::from_parts(32_336_000, 0) + .saturating_add(Weight::from_parts(0, 13507)) + .saturating_add(T::DbWeight::get().reads(10)) .saturating_add(T::DbWeight::get().writes(4)) } /// Storage: `PolkadotXcm::QueryCounter` (r:1 w:1) @@ -300,11 +341,11 @@ impl pallet_xcm::WeightInfo for WeightInfo { /// Proof: `PolkadotXcm::Queries` (`max_values`: None, `max_size`: None, mode: `Measured`) fn new_query() -> Weight { // Proof Size summary in bytes: - // Measured: `69` - // Estimated: `1554` - // Minimum execution time: 4_512_000 picoseconds. - Weight::from_parts(4_671_000, 0) - .saturating_add(Weight::from_parts(0, 1554)) + // Measured: `32` + // Estimated: `1517` + // Minimum execution time: 3_328_000 picoseconds. + Weight::from_parts(3_501_000, 0) + .saturating_add(Weight::from_parts(0, 1517)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -312,11 +353,23 @@ impl pallet_xcm::WeightInfo for WeightInfo { /// Proof: `PolkadotXcm::Queries` (`max_values`: None, `max_size`: None, mode: `Measured`) fn take_response() -> Weight { // Proof Size summary in bytes: - // Measured: `7706` - // Estimated: `11171` - // Minimum execution time: 26_473_000 picoseconds. - Weight::from_parts(26_960_000, 0) - .saturating_add(Weight::from_parts(0, 11171)) + // Measured: `7669` + // Estimated: `11134` + // Minimum execution time: 23_571_000 picoseconds. + Weight::from_parts(24_312_000, 0) + .saturating_add(Weight::from_parts(0, 11134)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `PolkadotXcm::AssetTraps` (r:1 w:1) + /// Proof: `PolkadotXcm::AssetTraps` (`max_values`: None, `max_size`: None, mode: `Measured`) + fn claim_assets() -> Weight { + // Proof Size summary in bytes: + // Measured: `90` + // Estimated: `3555` + // Minimum execution time: 32_879_000 picoseconds. + Weight::from_parts(33_385_000, 0) + .saturating_add(Weight::from_parts(0, 3555)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } diff --git a/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/xcm/mod.rs b/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/xcm/mod.rs index a14da7c7a38a54938bb390d5d2109816162fecf7..99af88812da2be05bd9273585ea7d186be9f8b90 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/xcm/mod.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/xcm/mod.rs @@ -196,7 +196,7 @@ impl XcmWeightInfo for CoretimeWestendXcmWeight { XcmGeneric::::clear_transact_status() } fn universal_origin(_: &Junction) -> Weight { - XcmGeneric::::universal_origin() + Weight::MAX } fn export_message(_: &NetworkId, _: &Junctions, _: &Xcm<()>) -> Weight { Weight::MAX diff --git a/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs b/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs index eaf07aac52cefa88f524e6f3a2180ab9faf2b088..6f5a52de98c39fb7ff5de96c41652be063f56a74 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs @@ -1,41 +1,44 @@ // Copyright (C) Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 +// This file is part of Cumulus. -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// Cumulus is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Cumulus is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Cumulus. If not, see . //! Autogenerated weights for `pallet_xcm_benchmarks::fungible` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-10-26, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-02-08, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-vmdtonbz-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-westend-dev"), DB CACHE: 1024 +//! HOSTNAME: `runner-bn-ce5rx-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! WASM-EXECUTION: Compiled, CHAIN: Some("coretime-westend-dev"), DB CACHE: 1024 // Executed Command: -// target/production/polkadot-parachain +// ./target/production/polkadot-parachain // benchmark // pallet -// --steps=50 -// --repeat=20 -// --extrinsic=* +// --template=./cumulus/templates/xcm-bench-template.hbs +// --chain=coretime-westend-dev // --wasm-execution=compiled -// --heap-pages=4096 -// --json-file=/builds/parity/mirrors/polkadot-sdk/.git/.artifacts/bench.json // --pallet=pallet_xcm_benchmarks::fungible -// --chain=asset-hub-westend-dev +// --no-storage-info +// --no-median-slopes +// --no-min-squares +// --extrinsic=* +// --steps=50 +// --repeat=20 +// --json // --header=./cumulus/file_header.txt -// --template=./cumulus/templates/xcm-bench-template.hbs -// --output=./cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/xcm/ +// --output=./cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -53,8 +56,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `101` // Estimated: `3593` - // Minimum execution time: 20_295_000 picoseconds. - Weight::from_parts(21_142_000, 3593) + // Minimum execution time: 19_401_000 picoseconds. + Weight::from_parts(19_768_000, 3593) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -64,17 +67,15 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `101` // Estimated: `6196` - // Minimum execution time: 42_356_000 picoseconds. - Weight::from_parts(43_552_000, 6196) + // Minimum execution time: 42_452_000 picoseconds. + Weight::from_parts(43_126_000, 6196) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } - // Storage: `System::Account` (r:3 w:3) + // Storage: `System::Account` (r:2 w:2) // Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) // Storage: `ParachainInfo::ParachainId` (r:1 w:0) // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - // Storage: `ParachainSystem::UpwardDeliveryFeeFactor` (r:1 w:0) - // Proof: `ParachainSystem::UpwardDeliveryFeeFactor` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) // Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) // Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) // Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) @@ -87,54 +88,49 @@ impl WeightInfo { // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) pub fn transfer_reserve_asset() -> Weight { // Proof Size summary in bytes: - // Measured: `246` - // Estimated: `8799` - // Minimum execution time: 85_553_000 picoseconds. - Weight::from_parts(87_177_000, 8799) - .saturating_add(T::DbWeight::get().reads(10)) - .saturating_add(T::DbWeight::get().writes(5)) + // Measured: `207` + // Estimated: `6196` + // Minimum execution time: 58_090_000 picoseconds. + Weight::from_parts(59_502_000, 6196) + .saturating_add(T::DbWeight::get().reads(8)) + .saturating_add(T::DbWeight::get().writes(4)) } - // Storage: `ParachainInfo::ParachainId` (r:1 w:0) - // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + // Storage: `Benchmark::Override` (r:0 w:0) + // Proof: `Benchmark::Override` (`max_values`: None, `max_size`: None, mode: `Measured`) pub fn reserve_asset_deposited() -> Weight { // Proof Size summary in bytes: // Measured: `0` - // Estimated: `1489` - // Minimum execution time: 6_166_000 picoseconds. - Weight::from_parts(6_352_000, 1489) - .saturating_add(T::DbWeight::get().reads(1)) + // Estimated: `0` + // Minimum execution time: 18_446_744_073_709_551_000 picoseconds. + Weight::from_parts(18_446_744_073_709_551_000, 0) } // Storage: `ParachainInfo::ParachainId` (r:1 w:0) // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - // Storage: `ParachainSystem::UpwardDeliveryFeeFactor` (r:1 w:0) - // Proof: `ParachainSystem::UpwardDeliveryFeeFactor` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) // Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) // Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) // Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) // Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) // Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) // Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `System::Account` (r:2 w:2) - // Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) // Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) // Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) // Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) pub fn initiate_reserve_withdraw() -> Weight { // Proof Size summary in bytes: - // Measured: `246` - // Estimated: `6196` - // Minimum execution time: 184_462_000 picoseconds. - Weight::from_parts(189_593_000, 6196) - .saturating_add(T::DbWeight::get().reads(9)) - .saturating_add(T::DbWeight::get().writes(4)) + // Measured: `106` + // Estimated: `3571` + // Minimum execution time: 23_569_000 picoseconds. + Weight::from_parts(24_598_000, 3571) + .saturating_add(T::DbWeight::get().reads(6)) + .saturating_add(T::DbWeight::get().writes(2)) } pub fn receive_teleported_asset() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_018_000 picoseconds. - Weight::from_parts(3_098_000, 0) + // Minimum execution time: 2_546_000 picoseconds. + Weight::from_parts(2_674_000, 0) } // Storage: `System::Account` (r:1 w:1) // Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) @@ -142,59 +138,53 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 18_583_000 picoseconds. - Weight::from_parts(19_057_000, 3593) + // Minimum execution time: 16_889_000 picoseconds. + Weight::from_parts(17_350_000, 3593) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } - // Storage: `System::Account` (r:2 w:2) - // Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - // Storage: `ParachainInfo::ParachainId` (r:1 w:0) - // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - // Storage: `ParachainSystem::UpwardDeliveryFeeFactor` (r:1 w:0) - // Proof: `ParachainSystem::UpwardDeliveryFeeFactor` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) // Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) // Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) // Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) // Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) // Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) // Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + // Storage: `System::Account` (r:1 w:1) + // Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + // Storage: `ParachainInfo::ParachainId` (r:1 w:0) + // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) // Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) // Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) // Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) pub fn deposit_reserve_asset() -> Weight { // Proof Size summary in bytes: - // Measured: `145` - // Estimated: `6196` - // Minimum execution time: 56_666_000 picoseconds. - Weight::from_parts(58_152_000, 6196) - .saturating_add(T::DbWeight::get().reads(9)) - .saturating_add(T::DbWeight::get().writes(4)) + // Measured: `106` + // Estimated: `3593` + // Minimum execution time: 43_964_000 picoseconds. + Weight::from_parts(45_293_000, 3593) + .saturating_add(T::DbWeight::get().reads(7)) + .saturating_add(T::DbWeight::get().writes(3)) } // Storage: `ParachainInfo::ParachainId` (r:1 w:0) // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - // Storage: `ParachainSystem::UpwardDeliveryFeeFactor` (r:1 w:0) - // Proof: `ParachainSystem::UpwardDeliveryFeeFactor` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) // Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) // Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) // Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) // Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) // Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) // Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `System::Account` (r:1 w:1) - // Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) // Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) // Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) // Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) pub fn initiate_teleport() -> Weight { // Proof Size summary in bytes: - // Measured: `145` - // Estimated: `3610` - // Minimum execution time: 44_197_000 picoseconds. - Weight::from_parts(45_573_000, 3610) - .saturating_add(T::DbWeight::get().reads(8)) - .saturating_add(T::DbWeight::get().writes(3)) + // Measured: `106` + // Estimated: `3571` + // Minimum execution time: 20_704_000 picoseconds. + Weight::from_parts(21_266_000, 3571) + .saturating_add(T::DbWeight::get().reads(6)) + .saturating_add(T::DbWeight::get().writes(2)) } } diff --git a/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/xcm/pallet_xcm_benchmarks_generic.rs b/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/xcm/pallet_xcm_benchmarks_generic.rs index fc196abea0f5e61d746760e2b2bf5a7d8d0a476b..74254814bcafc7f67dd20d8fa5dcd8da4337f782 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/xcm/pallet_xcm_benchmarks_generic.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/xcm/pallet_xcm_benchmarks_generic.rs @@ -1,41 +1,44 @@ // Copyright (C) Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 +// This file is part of Cumulus. -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// Cumulus is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Cumulus is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Cumulus. If not, see . //! Autogenerated weights for `pallet_xcm_benchmarks::generic` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-10-26, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-02-08, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-vmdtonbz-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-westend-dev"), DB CACHE: 1024 +//! HOSTNAME: `runner-bn-ce5rx-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! WASM-EXECUTION: Compiled, CHAIN: Some("coretime-westend-dev"), DB CACHE: 1024 // Executed Command: -// target/production/polkadot-parachain +// ./target/production/polkadot-parachain // benchmark // pallet -// --steps=50 -// --repeat=20 -// --extrinsic=* +// --template=./cumulus/templates/xcm-bench-template.hbs +// --chain=coretime-westend-dev // --wasm-execution=compiled -// --heap-pages=4096 -// --json-file=/builds/parity/mirrors/polkadot-sdk/.git/.artifacts/bench.json // --pallet=pallet_xcm_benchmarks::generic -// --chain=asset-hub-westend-dev +// --no-storage-info +// --no-median-slopes +// --no-min-squares +// --extrinsic=* +// --steps=50 +// --repeat=20 +// --json // --header=./cumulus/file_header.txt -// --template=./cumulus/templates/xcm-bench-template.hbs -// --output=./cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/xcm/ +// --output=./cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/xcm/pallet_xcm_benchmarks_generic.rs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -49,128 +52,120 @@ pub struct WeightInfo(PhantomData); impl WeightInfo { // Storage: `ParachainInfo::ParachainId` (r:1 w:0) // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - // Storage: `ParachainSystem::UpwardDeliveryFeeFactor` (r:1 w:0) - // Proof: `ParachainSystem::UpwardDeliveryFeeFactor` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) // Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) // Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) // Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) // Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) // Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) // Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `System::Account` (r:2 w:2) - // Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) // Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) // Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) // Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) pub fn report_holding() -> Weight { // Proof Size summary in bytes: - // Measured: `246` - // Estimated: `6196` - // Minimum execution time: 415_033_000 picoseconds. - Weight::from_parts(429_573_000, 6196) - .saturating_add(T::DbWeight::get().reads(9)) - .saturating_add(T::DbWeight::get().writes(4)) + // Measured: `106` + // Estimated: `3571` + // Minimum execution time: 22_424_000 picoseconds. + Weight::from_parts(23_208_000, 3571) + .saturating_add(T::DbWeight::get().reads(6)) + .saturating_add(T::DbWeight::get().writes(2)) } pub fn buy_execution() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_193_000 picoseconds. - Weight::from_parts(3_620_000, 0) + // Minimum execution time: 1_194_000 picoseconds. + Weight::from_parts(1_306_000, 0) } // Storage: `PolkadotXcm::Queries` (r:1 w:0) // Proof: `PolkadotXcm::Queries` (`max_values`: None, `max_size`: None, mode: `Measured`) pub fn query_response() -> Weight { // Proof Size summary in bytes: - // Measured: `103` - // Estimated: `3568` - // Minimum execution time: 8_045_000 picoseconds. - Weight::from_parts(8_402_000, 3568) + // Measured: `32` + // Estimated: `3497` + // Minimum execution time: 6_359_000 picoseconds. + Weight::from_parts(6_585_000, 3497) .saturating_add(T::DbWeight::get().reads(1)) } pub fn transact() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 9_827_000 picoseconds. - Weight::from_parts(10_454_000, 0) + // Minimum execution time: 6_297_000 picoseconds. + Weight::from_parts(6_661_000, 0) } pub fn refund_surplus() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_330_000 picoseconds. - Weight::from_parts(3_677_000, 0) + // Minimum execution time: 1_778_000 picoseconds. + Weight::from_parts(1_923_000, 0) } pub fn set_error_handler() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_947_000 picoseconds. - Weight::from_parts(2_083_000, 0) + // Minimum execution time: 1_212_000 picoseconds. + Weight::from_parts(1_314_000, 0) } pub fn set_appendix() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_915_000 picoseconds. - Weight::from_parts(1_993_000, 0) + // Minimum execution time: 1_165_000 picoseconds. + Weight::from_parts(1_247_000, 0) } pub fn clear_error() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_918_000 picoseconds. - Weight::from_parts(2_048_000, 0) + // Minimum execution time: 1_173_000 picoseconds. + Weight::from_parts(1_275_000, 0) } pub fn descend_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_683_000 picoseconds. - Weight::from_parts(3_064_000, 0) + // Minimum execution time: 1_247_000 picoseconds. + Weight::from_parts(1_332_000, 0) } pub fn clear_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_893_000 picoseconds. - Weight::from_parts(2_159_000, 0) + // Minimum execution time: 1_170_000 picoseconds. + Weight::from_parts(1_237_000, 0) } // Storage: `ParachainInfo::ParachainId` (r:1 w:0) // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - // Storage: `ParachainSystem::UpwardDeliveryFeeFactor` (r:1 w:0) - // Proof: `ParachainSystem::UpwardDeliveryFeeFactor` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) // Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) // Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) // Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) // Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) // Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) // Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `System::Account` (r:2 w:2) - // Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) // Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) // Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) // Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) pub fn report_error() -> Weight { // Proof Size summary in bytes: - // Measured: `246` - // Estimated: `6196` - // Minimum execution time: 53_116_000 picoseconds. - Weight::from_parts(54_154_000, 6196) - .saturating_add(T::DbWeight::get().reads(9)) - .saturating_add(T::DbWeight::get().writes(4)) + // Measured: `106` + // Estimated: `3571` + // Minimum execution time: 19_872_000 picoseconds. + Weight::from_parts(20_453_000, 3571) + .saturating_add(T::DbWeight::get().reads(6)) + .saturating_add(T::DbWeight::get().writes(2)) } // Storage: `PolkadotXcm::AssetTraps` (r:1 w:1) // Proof: `PolkadotXcm::AssetTraps` (`max_values`: None, `max_size`: None, mode: `Measured`) pub fn claim_asset() -> Weight { // Proof Size summary in bytes: - // Measured: `160` - // Estimated: `3625` - // Minimum execution time: 12_381_000 picoseconds. - Weight::from_parts(12_693_000, 3625) + // Measured: `90` + // Estimated: `3555` + // Minimum execution time: 9_105_000 picoseconds. + Weight::from_parts(9_365_000, 3555) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -178,13 +173,11 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_933_000 picoseconds. - Weight::from_parts(1_983_000, 0) + // Minimum execution time: 1_228_000 picoseconds. + Weight::from_parts(1_293_000, 0) } // Storage: `PolkadotXcm::VersionNotifyTargets` (r:1 w:1) // Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::UpwardDeliveryFeeFactor` (r:1 w:0) - // Proof: `ParachainSystem::UpwardDeliveryFeeFactor` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) // Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) // Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) // Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) @@ -197,11 +190,11 @@ impl WeightInfo { // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) pub fn subscribe_version() -> Weight { // Proof Size summary in bytes: - // Measured: `145` - // Estimated: `3610` - // Minimum execution time: 24_251_000 picoseconds. - Weight::from_parts(24_890_000, 3610) - .saturating_add(T::DbWeight::get().reads(7)) + // Measured: `74` + // Estimated: `3539` + // Minimum execution time: 19_535_000 picoseconds. + Weight::from_parts(20_139_000, 3539) + .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(3)) } // Storage: `PolkadotXcm::VersionNotifyTargets` (r:0 w:1) @@ -210,145 +203,127 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_850_000 picoseconds. - Weight::from_parts(4_082_000, 0) + // Minimum execution time: 3_158_000 picoseconds. + Weight::from_parts(3_275_000, 0) .saturating_add(T::DbWeight::get().writes(1)) } pub fn burn_asset() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 112_248_000 picoseconds. - Weight::from_parts(124_454_000, 0) + // Minimum execution time: 1_539_000 picoseconds. + Weight::from_parts(1_607_000, 0) } pub fn expect_asset() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 11_457_000 picoseconds. - Weight::from_parts(12_060_000, 0) + // Minimum execution time: 1_317_000 picoseconds. + Weight::from_parts(1_427_000, 0) } pub fn expect_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_959_000 picoseconds. - Weight::from_parts(2_076_000, 0) + // Minimum execution time: 1_176_000 picoseconds. + Weight::from_parts(1_250_000, 0) } pub fn expect_error() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_920_000 picoseconds. - Weight::from_parts(1_994_000, 0) + // Minimum execution time: 1_202_000 picoseconds. + Weight::from_parts(1_279_000, 0) } pub fn expect_transact_status() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_149_000 picoseconds. - Weight::from_parts(2_394_000, 0) + // Minimum execution time: 1_411_000 picoseconds. + Weight::from_parts(1_463_000, 0) } // Storage: `ParachainInfo::ParachainId` (r:1 w:0) // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - // Storage: `ParachainSystem::UpwardDeliveryFeeFactor` (r:1 w:0) - // Proof: `ParachainSystem::UpwardDeliveryFeeFactor` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) // Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) // Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) // Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) // Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) // Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) // Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `System::Account` (r:2 w:2) - // Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) // Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) // Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) // Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) pub fn query_pallet() -> Weight { // Proof Size summary in bytes: - // Measured: `246` - // Estimated: `6196` - // Minimum execution time: 58_011_000 picoseconds. - Weight::from_parts(59_306_000, 6196) - .saturating_add(T::DbWeight::get().reads(9)) - .saturating_add(T::DbWeight::get().writes(4)) + // Measured: `106` + // Estimated: `3571` + // Minimum execution time: 22_991_000 picoseconds. + Weight::from_parts(23_820_000, 3571) + .saturating_add(T::DbWeight::get().reads(6)) + .saturating_add(T::DbWeight::get().writes(2)) } pub fn expect_pallet() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 5_031_000 picoseconds. - Weight::from_parts(5_243_000, 0) + // Minimum execution time: 3_534_000 picoseconds. + Weight::from_parts(3_708_000, 0) } // Storage: `ParachainInfo::ParachainId` (r:1 w:0) // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - // Storage: `ParachainSystem::UpwardDeliveryFeeFactor` (r:1 w:0) - // Proof: `ParachainSystem::UpwardDeliveryFeeFactor` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) // Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) // Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) // Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) // Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) // Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) // Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `System::Account` (r:2 w:2) - // Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) // Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) // Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) // Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) pub fn report_transact_status() -> Weight { // Proof Size summary in bytes: - // Measured: `246` - // Estimated: `6196` - // Minimum execution time: 53_078_000 picoseconds. - Weight::from_parts(54_345_000, 6196) - .saturating_add(T::DbWeight::get().reads(9)) - .saturating_add(T::DbWeight::get().writes(4)) + // Measured: `106` + // Estimated: `3571` + // Minimum execution time: 20_025_000 picoseconds. + Weight::from_parts(20_463_000, 3571) + .saturating_add(T::DbWeight::get().reads(6)) + .saturating_add(T::DbWeight::get().writes(2)) } pub fn clear_transact_status() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_936_000 picoseconds. - Weight::from_parts(2_002_000, 0) + // Minimum execution time: 1_213_000 picoseconds. + Weight::from_parts(1_290_000, 0) } pub fn set_topic() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_855_000 picoseconds. - Weight::from_parts(1_950_000, 0) + // Minimum execution time: 1_207_000 picoseconds. + Weight::from_parts(1_265_000, 0) } pub fn clear_topic() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_882_000 picoseconds. - Weight::from_parts(1_977_000, 0) - } - // Storage: `ParachainInfo::ParachainId` (r:1 w:0) - // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - pub fn universal_origin() -> Weight { - // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `1489` - // Minimum execution time: 3_912_000 picoseconds. - Weight::from_parts(4_167_000, 1489) - .saturating_add(T::DbWeight::get().reads(1)) + // Minimum execution time: 1_195_000 picoseconds. + Weight::from_parts(1_231_000, 0) } pub fn set_fees_mode() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_911_000 picoseconds. - Weight::from_parts(1_971_000, 0) + // Minimum execution time: 1_182_000 picoseconds. + Weight::from_parts(1_265_000, 0) } pub fn unpaid_execution() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_990_000 picoseconds. - Weight::from_parts(2_076_000, 0) + // Minimum execution time: 1_165_000 picoseconds. + Weight::from_parts(1_252_000, 0) } } diff --git a/cumulus/parachains/runtimes/coretime/coretime-westend/src/xcm_config.rs b/cumulus/parachains/runtimes/coretime/coretime-westend/src/xcm_config.rs index e57a46877764381b5156614af20488368be7845c..346bdfa4d8c9ea2bd75260a2c6eeccad9b276eeb 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-westend/src/xcm_config.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-westend/src/xcm_config.rs @@ -15,18 +15,19 @@ // along with Cumulus. If not, see . use super::{ - AccountId, AllPalletsWithSystem, Balances, BaseDeliveryFee, FeeAssetId, ParachainInfo, + AccountId, AllPalletsWithSystem, Balances, BaseDeliveryFee, Broker, FeeAssetId, ParachainInfo, ParachainSystem, PolkadotXcm, Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, TransactionByteFee, WeightToFee, XcmpQueue, }; use frame_support::{ + pallet_prelude::PalletInfoAccess, parameter_types, - traits::{ConstU32, Contains, Equals, Everything, Nothing}, + traits::{tokens::imbalance::ResolveTo, ConstU32, Contains, Equals, Everything, Nothing}, }; use frame_system::EnsureRoot; +use pallet_collator_selection::StakingPotAccountId; use pallet_xcm::XcmPassthrough; use parachains_common::{ - impls::ToStakingPot, xcm_config::{ AllSiblingSystemParachains, ConcreteAssetFromSystem, ParentRelayOrSiblingParachains, RelayOrOtherSystemParachains, @@ -37,25 +38,26 @@ use polkadot_parachain_primitives::primitives::Sibling; use polkadot_runtime_common::xcm_sender::ExponentialPrice; use sp_runtime::traits::AccountIdConversion; use xcm::latest::prelude::*; -#[allow(deprecated)] -use xcm_builder::CurrencyAdapter; use xcm_builder::{ AccountId32Aliases, AllowExplicitUnpaidExecutionFrom, AllowKnownQueryResponses, AllowSubscriptionsFrom, AllowTopLevelPaidExecutionFrom, DenyReserveTransferToRelayChain, - DenyThenTry, EnsureXcmOrigin, FrameTransactionalProcessor, IsConcrete, ParentAsSuperuser, - ParentIsPreset, RelayChainAsNative, SiblingParachainAsNative, SiblingParachainConvertsVia, - SignedAccountId32AsNative, SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit, - TrailingSetTopicAsId, UsingComponents, WeightInfoBounds, WithComputedOrigin, WithUniqueTopic, + DenyThenTry, EnsureXcmOrigin, FrameTransactionalProcessor, FungibleAdapter, IsConcrete, + NonFungibleAdapter, ParentAsSuperuser, ParentIsPreset, RelayChainAsNative, + SiblingParachainAsNative, SiblingParachainConvertsVia, SignedAccountId32AsNative, + SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit, TrailingSetTopicAsId, + UsingComponents, WeightInfoBounds, WithComputedOrigin, WithUniqueTopic, XcmFeeManagerFromComponents, XcmFeeToAccount, }; use xcm_executor::{traits::WithOriginFilter, XcmExecutor}; parameter_types! { - pub const WndRelayLocation: Location = Location::parent(); + pub const TokenRelayLocation: Location = Location::parent(); pub const RelayNetwork: Option = Some(NetworkId::Westend); pub RelayChainOrigin: RuntimeOrigin = cumulus_pallet_xcm::Origin::Relay.into(); pub UniversalLocation: InteriorLocation = [GlobalConsensus(RelayNetwork::get().unwrap()), Parachain(ParachainInfo::parachain_id().into())].into(); + pub BrokerPalletLocation: Location = + PalletInstance(::index() as u8).into(); pub const MaxInstructions: u32 = 100; pub const MaxAssetsIntoHolding: u32 = 64; pub FellowshipLocation: Location = Location::new(1, Parachain(1001)); @@ -75,12 +77,11 @@ pub type LocationToAccountId = ( ); /// Means for transacting the native currency on this chain. -#[allow(deprecated)] -pub type CurrencyTransactor = CurrencyAdapter< +pub type FungibleTransactor = FungibleAdapter< // Use this currency: Balances, // Use this currency when it is a fungible asset matching the given location or name: - IsConcrete, + IsConcrete, // Do a simple punn to convert an `AccountId32` `Location` into a native chain // `AccountId`: LocationToAccountId, @@ -90,6 +91,23 @@ pub type CurrencyTransactor = CurrencyAdapter< (), >; +/// Means for transacting coretime regions on this chain. +pub type RegionTransactor = NonFungibleAdapter< + // Use this non-fungible implementation: + Broker, + // This adapter will handle coretime regions from the broker pallet. + IsConcrete, + // Convert an XCM Location into a local account id: + LocationToAccountId, + // Our chain's account ID type (we can't get away without mentioning it explicitly): + AccountId, + // We don't track any teleports. + (), +>; + +/// Means for transacting assets on this chain. +pub type AssetTransactors = (FungibleTransactor, RegionTransactor); + /// This is the type we use to convert an (incoming) XCM origin into a local `Origin` instance, /// ready for dispatching a transaction with XCM's `Transact`. There is an `OriginKind` that can /// bias the kind of local `Origin` it will become. @@ -152,18 +170,20 @@ impl Contains for SafeCallFilter { pallet_xcm::Call::force_default_xcm_version { .. } ) | RuntimeCall::System( frame_system::Call::set_heap_pages { .. } | - frame_system::Call::set_code { .. } | - frame_system::Call::set_code_without_checks { .. } | - frame_system::Call::authorize_upgrade { .. } | - frame_system::Call::authorize_upgrade_without_checks { .. } | - frame_system::Call::kill_prefix { .. }, + frame_system::Call::set_code { .. } | + frame_system::Call::set_code_without_checks { .. } | + frame_system::Call::authorize_upgrade { .. } | + frame_system::Call::authorize_upgrade_without_checks { .. } | + frame_system::Call::kill_prefix { .. } | + // Should not be in Polkadot/Kusama. Here in order to speed up testing. + frame_system::Call::set_storage { .. }, ) | RuntimeCall::ParachainSystem(..) | RuntimeCall::Timestamp(..) | RuntimeCall::Balances(..) | RuntimeCall::CollatorSelection(..) | - RuntimeCall::Sudo(..) | RuntimeCall::Session(pallet_session::Call::purge_keys { .. }) | - RuntimeCall::XcmpQueue(..) + RuntimeCall::XcmpQueue(..) | + RuntimeCall::Broker(..) ) } } @@ -178,7 +198,7 @@ pub type Barrier = TrailingSetTopicAsId< AllowKnownQueryResponses, WithComputedOrigin< ( - // If the message is one that immediately attemps to pay for execution, then + // If the message is one that immediately attempts to pay for execution, then // allow it. AllowTopLevelPaidExecutionFrom, // Parent, its pluralities (i.e. governance bodies), and the Fellows plurality @@ -210,13 +230,13 @@ pub struct XcmConfig; impl xcm_executor::Config for XcmConfig { type RuntimeCall = RuntimeCall; type XcmSender = XcmRouter; - type AssetTransactor = CurrencyTransactor; + type AssetTransactor = AssetTransactors; type OriginConverter = XcmOriginToTransactDispatchOrigin; - // Coretime chain does not recognize a reserve location for any asset. Users must teleport WND + // Coretime chain does not recognize a reserve location for any asset. Users must teleport ROC // where allowed (e.g. with the Relay Chain). type IsReserve = (); /// Only allow teleportation of WND. - type IsTeleporter = ConcreteAssetFromSystem; + type IsTeleporter = ConcreteAssetFromSystem; type UniversalLocation = UniversalLocation; type Barrier = Barrier; type Weigher = WeightInfoBounds< @@ -224,8 +244,13 @@ impl xcm_executor::Config for XcmConfig { RuntimeCall, MaxInstructions, >; - type Trader = - UsingComponents>; + type Trader = UsingComponents< + WeightToFee, + TokenRelayLocation, + AccountId, + Balances, + ResolveTo, Balances>, + >; type ResponseHandler = PolkadotXcm; type AssetTrap = PolkadotXcm; type AssetClaims = PolkadotXcm; @@ -244,6 +269,9 @@ impl xcm_executor::Config for XcmConfig { type SafeCallFilter = SafeCallFilter; type Aliasers = Nothing; type TransactionalProcessor = FrameTransactionalProcessor; + type HrmpNewChannelOpenRequestHandler = (); + type HrmpChannelAcceptedHandler = (); + type HrmpChannelClosingHandler = (); } /// Converts a local signed origin into an XCM location. Forms the basis for local origins @@ -267,10 +295,9 @@ impl pallet_xcm::Config for Runtime { // We want to disallow users sending (arbitrary) XCM programs from this chain. type SendXcmOrigin = EnsureXcmOrigin; type XcmRouter = XcmRouter; - // We support local origins dispatching XCM executions in principle... + // We support local origins dispatching XCM executions. type ExecuteXcmOrigin = EnsureXcmOrigin; - // ... but disallow generic XCM execution. As a result only teleports are allowed. - type XcmExecuteFilter = Nothing; + type XcmExecuteFilter = Everything; type XcmExecutor = XcmExecutor; type XcmTeleportFilter = Everything; type XcmReserveTransferFilter = Nothing; // This parachain is not meant as a reserve location. diff --git a/cumulus/parachains/runtimes/glutton/glutton-westend/Cargo.toml b/cumulus/parachains/runtimes/glutton/glutton-westend/Cargo.toml index 23c5ce1c7f80d46ed193b37963b96d6fd55243c6..fe9cd25841bfc8c0b14278ed6ea167a46c3dd652 100644 --- a/cumulus/parachains/runtimes/glutton/glutton-westend/Cargo.toml +++ b/cumulus/parachains/runtimes/glutton/glutton-westend/Cargo.toml @@ -11,7 +11,7 @@ workspace = true [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } # Substrate frame-benchmarking = { path = "../../../../../substrate/frame/benchmarking", default-features = false, optional = true } @@ -135,8 +135,6 @@ try-runtime = [ "sp-runtime/try-runtime", ] -experimental = ["pallet-aura/experimental"] - # A feature that should be enabled when the runtime should be built for on-chain # deployment. This will disable stuff that shouldn't be part of the on-chain wasm # to make it smaller, like logging for example. diff --git a/cumulus/parachains/runtimes/glutton/glutton-westend/src/lib.rs b/cumulus/parachains/runtimes/glutton/glutton-westend/src/lib.rs index f1f02ea1903057f602c3eecc63fb128ea3616f58..b64e91243b074d4371ecca89dcba5ca3fcd55a89 100644 --- a/cumulus/parachains/runtimes/glutton/glutton-westend/src/lib.rs +++ b/cumulus/parachains/runtimes/glutton/glutton-westend/src/lib.rs @@ -66,7 +66,7 @@ use cumulus_primitives_core::AggregateMessageOrigin; pub use frame_support::{ construct_runtime, derive_impl, dispatch::DispatchClass, - genesis_builder_helper::{build_config, create_default_config}, + genesis_builder_helper::{build_state, get_preset}, parameter_types, traits::{ ConstBool, ConstU32, ConstU64, ConstU8, EitherOfDiverse, Everything, IsInVec, Randomness, @@ -100,7 +100,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("glutton-westend"), impl_name: create_runtime_str!("glutton-westend"), authoring_version: 1, - spec_version: 1_006_000, + spec_version: 1_010_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 1, @@ -146,7 +146,7 @@ parameter_types! { pub const SS58Prefix: u8 = 42; } -#[derive_impl(frame_system::config_preludes::ParaChainDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::ParaChainDefaultConfig)] impl frame_system::Config for Runtime { type AccountId = AccountId; type Nonce = Nonce; @@ -212,6 +212,7 @@ impl pallet_message_queue::Config for Runtime { type HeapSize = sp_core::ConstU32<{ 64 * 1024 }>; type MaxStale = sp_core::ConstU32<8>; type ServiceWeight = MessageQueueServiceWeight; + type IdleMaxServiceWeight = MessageQueueServiceWeight; } impl parachain_info::Config for Runtime {} @@ -221,10 +222,7 @@ impl cumulus_pallet_aura_ext::Config for Runtime {} impl pallet_timestamp::Config for Runtime { type Moment = u64; type OnTimestampSet = Aura; - #[cfg(feature = "experimental")] type MinimumPeriod = ConstU64<0>; - #[cfg(not(feature = "experimental"))] - type MinimumPeriod = ConstU64<{ SLOT_DURATION / 2 }>; type WeightInfo = weights::pallet_timestamp::WeightInfo; } @@ -233,7 +231,6 @@ impl pallet_aura::Config for Runtime { type DisabledValidators = (); type MaxAuthorities = ConstU32<100_000>; type AllowMultipleBlocksPerSlot = ConstBool; - #[cfg(feature = "experimental")] type SlotDuration = ConstU64; } @@ -332,7 +329,7 @@ impl_runtime_apis! { Executive::execute_block(block) } - fn initialize_block(header: &::Header) { + fn initialize_block(header: &::Header) -> sp_runtime::ExtrinsicInclusionMode { Executive::initialize_block(header) } } @@ -357,7 +354,7 @@ impl_runtime_apis! { } fn authorities() -> Vec { - Aura::authorities().into_inner() + pallet_aura::Authorities::::get().into_inner() } } @@ -476,12 +473,16 @@ impl_runtime_apis! { } impl sp_genesis_builder::GenesisBuilder for Runtime { - fn create_default_config() -> Vec { - create_default_config::() + fn build_state(config: Vec) -> sp_genesis_builder::Result { + build_state::(config) } - fn build_config(config: Vec) -> sp_genesis_builder::Result { - build_config::(config) + fn get_preset(id: &Option) -> Option> { + get_preset::(id, |_| None) + } + + fn preset_names() -> Vec { + vec![] } } } diff --git a/cumulus/parachains/runtimes/glutton/glutton-westend/src/xcm_config.rs b/cumulus/parachains/runtimes/glutton/glutton-westend/src/xcm_config.rs index ad61987c0e7048f2d94b29ff51906e197f5ad2fd..15bb519e115c5c2eaca25053a3d3e47c30fb21e0 100644 --- a/cumulus/parachains/runtimes/glutton/glutton-westend/src/xcm_config.rs +++ b/cumulus/parachains/runtimes/glutton/glutton-westend/src/xcm_config.rs @@ -88,6 +88,9 @@ impl xcm_executor::Config for XcmConfig { type SafeCallFilter = Everything; type Aliasers = Nothing; type TransactionalProcessor = FrameTransactionalProcessor; + type HrmpNewChannelOpenRequestHandler = (); + type HrmpChannelAcceptedHandler = (); + type HrmpChannelClosingHandler = (); } impl cumulus_pallet_xcm::Config for Runtime { diff --git a/cumulus/parachains/runtimes/people/people-rococo/Cargo.toml b/cumulus/parachains/runtimes/people/people-rococo/Cargo.toml index 5e5e1e01606f9739b8777c5e8e1643dd017945fe..7183be5fc82cc594c6ad2f3738dbfd5b67738a2c 100644 --- a/cumulus/parachains/runtimes/people/people-rococo/Cargo.toml +++ b/cumulus/parachains/runtimes/people/people-rococo/Cargo.toml @@ -13,9 +13,9 @@ substrate-wasm-builder = { path = "../../../../../substrate/utils/wasm-builder", codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } enumflags2 = { version = "0.7.7" } hex-literal = { version = "0.4.1" } -log = { version = "0.4.20", default-features = false } +log = { workspace = true } scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.195", optional = true, features = ["derive"] } +serde = { optional = true, features = ["derive"], workspace = true, default-features = true } # Substrate frame-benchmarking = { path = "../../../../../substrate/frame/benchmarking", default-features = false, optional = true } @@ -69,6 +69,7 @@ cumulus-pallet-xcmp-queue = { path = "../../../../pallets/xcmp-queue", default-f cumulus-primitives-aura = { path = "../../../../primitives/aura", default-features = false } cumulus-primitives-core = { path = "../../../../primitives/core", default-features = false } cumulus-primitives-utility = { path = "../../../../primitives/utility", default-features = false } +cumulus-primitives-storage-weight-reclaim = { path = "../../../../primitives/storage-weight-reclaim", default-features = false } pallet-collator-selection = { path = "../../../../pallets/collator-selection", default-features = false } parachain-info = { package = "staging-parachain-info", path = "../../../pallets/parachain-info", default-features = false } parachains-common = { path = "../../../common", default-features = false } @@ -85,6 +86,7 @@ std = [ "cumulus-pallet-xcmp-queue/std", "cumulus-primitives-aura/std", "cumulus-primitives-core/std", + "cumulus-primitives-storage-weight-reclaim/std", "cumulus-primitives-utility/std", "enumflags2/std", "frame-benchmarking?/std", @@ -188,5 +190,3 @@ try-runtime = [ "polkadot-runtime-common/try-runtime", "sp-runtime/try-runtime", ] - -experimental = ["pallet-aura/experimental"] diff --git a/cumulus/parachains/runtimes/people/people-rococo/src/lib.rs b/cumulus/parachains/runtimes/people/people-rococo/src/lib.rs index b48154c9ae5a17428574406441933a7be7ac835f..1cf9fab8932bd3b55f2e423bd8ad8f0aa198a590 100644 --- a/cumulus/parachains/runtimes/people/people-rococo/src/lib.rs +++ b/cumulus/parachains/runtimes/people/people-rococo/src/lib.rs @@ -27,7 +27,7 @@ use cumulus_primitives_core::{AggregateMessageOrigin, ParaId}; use frame_support::{ construct_runtime, derive_impl, dispatch::DispatchClass, - genesis_builder_helper::{build_config, create_default_config}, + genesis_builder_helper::{build_state, get_preset}, parameter_types, traits::{ ConstBool, ConstU32, ConstU64, ConstU8, EitherOfDiverse, Everything, TransformOrigin, @@ -44,7 +44,7 @@ use parachains_common::{ impls::DealWithFees, message_queue::{NarrowOriginToSibling, ParaIdToSibling}, AccountId, Balance, BlockNumber, Hash, Header, Nonce, Signature, AVERAGE_ON_INITIALIZE_RATIO, - HOURS, NORMAL_DISPATCH_RATIO, + NORMAL_DISPATCH_RATIO, }; use polkadot_runtime_common::{identity_migrator, BlockHashCount, SlowAdjustingFeeUpdate}; use sp_api::impl_runtime_apis; @@ -63,7 +63,7 @@ use sp_std::prelude::*; #[cfg(feature = "std")] use sp_version::NativeVersion; use sp_version::RuntimeVersion; -use testnet_parachains_constants::rococo::{consensus::*, currency::*, fee::WeightToFee}; +use testnet_parachains_constants::rococo::{consensus::*, currency::*, fee::WeightToFee, time::*}; use weights::{BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight}; use xcm::latest::prelude::BodyId; use xcm_config::{ @@ -93,6 +93,7 @@ pub type SignedExtra = ( frame_system::CheckNonce, frame_system::CheckWeight, pallet_transaction_payment::ChargeTransactionPayment, + cumulus_primitives_storage_weight_reclaim::StorageWeightReclaim, ); /// Unchecked extrinsic type as expected by this runtime. @@ -100,7 +101,10 @@ pub type UncheckedExtrinsic = generic::UncheckedExtrinsic; /// Migrations to apply on runtime upgrade. -pub type Migrations = (); +pub type Migrations = ( + // permanent + pallet_xcm::migration::MigrateToLatestXcmVersion, +); /// Executive: handles dispatch to the various modules. pub type Executive = frame_executive::Executive< @@ -123,7 +127,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("people-rococo"), impl_name: create_runtime_str!("people-rococo"), authoring_version: 1, - spec_version: 1_006_002, + spec_version: 1_010_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 0, @@ -161,7 +165,7 @@ parameter_types! { pub const SS58Prefix: u8 = 42; } -#[derive_impl(frame_system::config_preludes::ParaChainDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::ParaChainDefaultConfig)] impl frame_system::Config for Runtime { type BaseCallFilter = Everything; type BlockWeights = RuntimeBlockWeights; @@ -184,10 +188,7 @@ impl pallet_timestamp::Config for Runtime { /// A timestamp: milliseconds since the unix epoch. type Moment = u64; type OnTimestampSet = Aura; - #[cfg(feature = "experimental")] type MinimumPeriod = ConstU64<0>; - #[cfg(not(feature = "experimental"))] - type MinimumPeriod = ConstU64<{ SLOT_DURATION / 2 }>; type WeightInfo = weights::pallet_timestamp::WeightInfo; } @@ -224,7 +225,7 @@ parameter_types! { impl pallet_transaction_payment::Config for Runtime { type RuntimeEvent = RuntimeEvent; type OnChargeTransaction = - pallet_transaction_payment::CurrencyAdapter>; + pallet_transaction_payment::FungibleAdapter>; type OperationalFeeMultiplier = ConstU8<5>; type WeightToFee = WeightToFee; type LengthToFee = ConstantMultiplier; @@ -282,6 +283,7 @@ impl pallet_message_queue::Config for Runtime { type HeapSize = sp_core::ConstU32<{ 64 * 1024 }>; type MaxStale = sp_core::ConstU32<8>; type ServiceWeight = MessageQueueServiceWeight; + type IdleMaxServiceWeight = MessageQueueServiceWeight; type WeightInfo = weights::pallet_message_queue::WeightInfo; } @@ -334,7 +336,6 @@ impl pallet_aura::Config for Runtime { type DisabledValidators = (); type MaxAuthorities = ConstU32<100_000>; type AllowMultipleBlocksPerSlot = ConstBool; - #[cfg(feature = "experimental")] type SlotDuration = ConstU64; } @@ -445,6 +446,7 @@ mod benches { [frame_system, SystemBench::] [pallet_balances, Balances] [pallet_identity, Identity] + [pallet_message_queue, MessageQueue] [pallet_multisig, Multisig] [pallet_session, SessionBench::] [pallet_utility, Utility] @@ -452,10 +454,11 @@ mod benches { // Polkadot [polkadot_runtime_common::identity_migrator, IdentityMigrator] // Cumulus + [cumulus_pallet_parachain_system, ParachainSystem] [cumulus_pallet_xcmp_queue, XcmpQueue] [pallet_collator_selection, CollatorSelection] // XCM - [pallet_xcm, PalletXcmExtrinsiscsBenchmark::] + [pallet_xcm, PalletXcmExtrinsicsBenchmark::] [pallet_xcm_benchmarks::fungible, XcmBalances] [pallet_xcm_benchmarks::generic, XcmGeneric] ); @@ -468,7 +471,7 @@ impl_runtime_apis! { } fn authorities() -> Vec { - Aura::authorities().into_inner() + pallet_aura::Authorities::::get().into_inner() } } @@ -490,7 +493,7 @@ impl_runtime_apis! { Executive::execute_block(block) } - fn initialize_block(header: &::Header) { + fn initialize_block(header: &::Header) -> sp_runtime::ExtrinsicInclusionMode { Executive::initialize_block(header) } } @@ -640,7 +643,7 @@ impl_runtime_apis! { use frame_support::traits::StorageInfoTrait; use frame_system_benchmarking::Pallet as SystemBench; use cumulus_pallet_session_benchmarking::Pallet as SessionBench; - use pallet_xcm::benchmarking::Pallet as PalletXcmExtrinsiscsBenchmark; + use pallet_xcm::benchmarking::Pallet as PalletXcmExtrinsicsBenchmark; // This is defined once again in dispatch_benchmark, because list_benchmarks! // and add_benchmarks! are macros exported by define_benchmarks! macros and those types @@ -679,8 +682,14 @@ impl_runtime_apis! { use cumulus_pallet_session_benchmarking::Pallet as SessionBench; impl cumulus_pallet_session_benchmarking::Config for Runtime {} - use pallet_xcm::benchmarking::Pallet as PalletXcmExtrinsiscsBenchmark; + use pallet_xcm::benchmarking::Pallet as PalletXcmExtrinsicsBenchmark; impl pallet_xcm::benchmarking::Config for Runtime { + type DeliveryHelper = cumulus_primitives_utility::ToParentDeliveryHelper< + xcm_config::XcmConfig, + ExistentialDepositAsset, + xcm_config::PriceForParentDelivery, + >; + fn reachable_dest() -> Option { Some(Parent.into()) } @@ -689,7 +698,7 @@ impl_runtime_apis! { // Relay/native token can be teleported between People and Relay. Some(( Asset { - fun: Fungible(EXISTENTIAL_DEPOSIT), + fun: Fungible(ExistentialDeposit::get()), id: AssetId(Parent.into()) }, Parent.into(), @@ -699,6 +708,13 @@ impl_runtime_apis! { fn reserve_transferable_asset_and_dest() -> Option<(Asset, Location)> { None } + + fn get_asset() -> Asset { + Asset { + id: AssetId(Location::parent()), + fun: Fungible(ExistentialDeposit::get()), + } + } } use xcm::latest::prelude::*; @@ -835,12 +851,16 @@ impl_runtime_apis! { } impl sp_genesis_builder::GenesisBuilder for Runtime { - fn create_default_config() -> Vec { - create_default_config::() + fn build_state(config: Vec) -> sp_genesis_builder::Result { + build_state::(config) + } + + fn get_preset(id: &Option) -> Option> { + get_preset::(id, |_| None) } - fn build_config(config: Vec) -> sp_genesis_builder::Result { - build_config::(config) + fn preset_names() -> Vec { + vec![] } } } diff --git a/cumulus/parachains/runtimes/people/people-rococo/src/weights/pallet_xcm.rs b/cumulus/parachains/runtimes/people/people-rococo/src/weights/pallet_xcm.rs index 0f793524de9f5ef7da835090f9d81008ba756d59..ac494fdc719f4139a79b9f92525bde8322267af2 100644 --- a/cumulus/parachains/runtimes/people/people-rococo/src/weights/pallet_xcm.rs +++ b/cumulus/parachains/runtimes/people/people-rococo/src/weights/pallet_xcm.rs @@ -1,40 +1,41 @@ // Copyright (C) Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 +// This file is part of Cumulus. -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// Cumulus is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Cumulus is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Cumulus. If not, see . //! Autogenerated weights for `pallet_xcm` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-03-21, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("people-kusama-dev"), DB CACHE: 1024 +//! HOSTNAME: `runner-h2rr8wx7-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("people-rococo-dev")`, DB CACHE: 1024 // Executed Command: -// ./artifacts/polkadot-parachain +// target/production/polkadot-parachain // benchmark // pallet -// --chain=people-kusama-dev -// --execution=wasm -// --wasm-execution=compiled -// --pallet=pallet_xcm -// --extrinsic=* // --steps=50 // --repeat=20 -// --json -// --header=./file_header.txt -// --output=./cumulus/parachains/runtimes/people/people-kusama/src/weights/pallet_xcm.rs +// --extrinsic=* +// --wasm-execution=compiled +// --heap-pages=4096 +// --json-file=/builds/parity/mirrors/polkadot-sdk/.git/.artifacts/bench.json +// --pallet=pallet_xcm +// --chain=people-rococo-dev +// --header=./cumulus/file_header.txt +// --output=./cumulus/parachains/runtimes/people/people-rococo/src/weights/ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -47,57 +48,48 @@ use core::marker::PhantomData; /// Weight functions for `pallet_xcm`. pub struct WeightInfo(PhantomData); impl pallet_xcm::WeightInfo for WeightInfo { - /// Storage: PolkadotXcm SupportedVersion (r:1 w:0) - /// Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) - /// Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) - /// Proof Skipped: PolkadotXcm VersionDiscoveryQueue (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: PolkadotXcm SafeXcmVersion (r:1 w:0) - /// Proof Skipped: PolkadotXcm SafeXcmVersion (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ParachainSystem HostConfiguration (r:1 w:0) - /// Proof Skipped: ParachainSystem HostConfiguration (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ParachainSystem PendingUpwardMessages (r:1 w:1) - /// Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) + /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) + /// Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) + /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) + /// Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) + /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) fn send() -> Weight { // Proof Size summary in bytes: // Measured: `38` // Estimated: `3503` - // Minimum execution time: 25_931_000 picoseconds. - Weight::from_parts(26_340_000, 0) + // Minimum execution time: 17_935_000 picoseconds. + Weight::from_parts(18_482_000, 0) .saturating_add(Weight::from_parts(0, 3503)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) } - /// Storage: ParachainInfo ParachainId (r:1 w:0) - /// Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - fn teleport_assets() -> Weight { - // Proof Size summary in bytes: - // Measured: `32` - // Estimated: `1489` - // Minimum execution time: 25_691_000 picoseconds. - Weight::from_parts(25_971_000, 0) - .saturating_add(Weight::from_parts(0, 1489)) - .saturating_add(T::DbWeight::get().reads(1)) - } - /// Storage: Benchmark Override (r:0 w:0) - /// Proof Skipped: Benchmark Override (max_values: None, max_size: None, mode: Measured) - fn reserve_transfer_assets() -> Weight { + /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) + /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) + /// Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) + /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) + /// Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) + /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + fn send_blob() -> Weight { // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 18_446_744_073_709_551_000 picoseconds. - Weight::from_parts(18_446_744_073_709_551_000, 0) - .saturating_add(Weight::from_parts(0, 0)) + // Measured: `38` + // Estimated: `3503` + // Minimum execution time: 18_311_000 picoseconds. + Weight::from_parts(18_850_000, 0) + .saturating_add(Weight::from_parts(0, 3503)) + .saturating_add(T::DbWeight::get().reads(5)) + .saturating_add(T::DbWeight::get().writes(2)) } /// Storage: `ParachainInfo::ParachainId` (r:1 w:0) /// Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - /// Storage: `Assets::Asset` (r:1 w:1) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `Assets::Account` (r:2 w:2) - /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:2 w:2) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - /// Storage: `ParachainSystem::UpwardDeliveryFeeFactor` (r:1 w:0) - /// Proof: `ParachainSystem::UpwardDeliveryFeeFactor` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) @@ -108,18 +100,38 @@ impl pallet_xcm::WeightInfo for WeightInfo { /// Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) /// Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + fn teleport_assets() -> Weight { + // Proof Size summary in bytes: + // Measured: `70` + // Estimated: `3535` + // Minimum execution time: 56_182_000 picoseconds. + Weight::from_parts(58_136_000, 0) + .saturating_add(Weight::from_parts(0, 3535)) + .saturating_add(T::DbWeight::get().reads(6)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: `Benchmark::Override` (r:0 w:0) + /// Proof: `Benchmark::Override` (`max_values`: None, `max_size`: None, mode: `Measured`) + fn reserve_transfer_assets() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 18_446_744_073_709_551_000 picoseconds. + Weight::from_parts(18_446_744_073_709_551_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + } + /// Storage: `Benchmark::Override` (r:0 w:0) + /// Proof: `Benchmark::Override` (`max_values`: None, `max_size`: None, mode: `Measured`) fn transfer_assets() -> Weight { // Proof Size summary in bytes: - // Measured: `496` - // Estimated: `6208` - // Minimum execution time: 146_932_000 picoseconds. - Weight::from_parts(153_200_000, 0) - .saturating_add(Weight::from_parts(0, 6208)) - .saturating_add(T::DbWeight::get().reads(12)) - .saturating_add(T::DbWeight::get().writes(7)) + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 18_446_744_073_709_551_000 picoseconds. + Weight::from_parts(18_446_744_073_709_551_000, 0) + .saturating_add(Weight::from_parts(0, 0)) } - /// Storage: Benchmark Override (r:0 w:0) - /// Proof Skipped: Benchmark Override (max_values: None, max_size: None, mode: Measured) + /// Storage: `Benchmark::Override` (r:0 w:0) + /// Proof: `Benchmark::Override` (`max_values`: None, `max_size`: None, mode: `Measured`) fn execute() -> Weight { // Proof Size summary in bytes: // Measured: `0` @@ -128,189 +140,199 @@ impl pallet_xcm::WeightInfo for WeightInfo { Weight::from_parts(18_446_744_073_709_551_000, 0) .saturating_add(Weight::from_parts(0, 0)) } - /// Storage: PolkadotXcm SupportedVersion (r:0 w:1) - /// Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) + /// Storage: `Benchmark::Override` (r:0 w:0) + /// Proof: `Benchmark::Override` (`max_values`: None, `max_size`: None, mode: `Measured`) + fn execute_blob() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 18_446_744_073_709_551_000 picoseconds. + Weight::from_parts(18_446_744_073_709_551_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + } + /// Storage: `PolkadotXcm::SupportedVersion` (r:0 w:1) + /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) fn force_xcm_version() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 9_572_000 picoseconds. - Weight::from_parts(9_924_000, 0) + // Minimum execution time: 5_979_000 picoseconds. + Weight::from_parts(6_289_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } - /// Storage: PolkadotXcm SafeXcmVersion (r:0 w:1) - /// Proof Skipped: PolkadotXcm SafeXcmVersion (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: `PolkadotXcm::SafeXcmVersion` (r:0 w:1) + /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) fn force_default_xcm_version() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_997_000 picoseconds. - Weight::from_parts(3_136_000, 0) + // Minimum execution time: 1_853_000 picoseconds. + Weight::from_parts(2_045_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } - /// Storage: PolkadotXcm VersionNotifiers (r:1 w:1) - /// Proof Skipped: PolkadotXcm VersionNotifiers (max_values: None, max_size: None, mode: Measured) - /// Storage: PolkadotXcm QueryCounter (r:1 w:1) - /// Proof Skipped: PolkadotXcm QueryCounter (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: PolkadotXcm SupportedVersion (r:1 w:0) - /// Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) - /// Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) - /// Proof Skipped: PolkadotXcm VersionDiscoveryQueue (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: PolkadotXcm SafeXcmVersion (r:1 w:0) - /// Proof Skipped: PolkadotXcm SafeXcmVersion (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ParachainSystem HostConfiguration (r:1 w:0) - /// Proof Skipped: ParachainSystem HostConfiguration (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ParachainSystem PendingUpwardMessages (r:1 w:1) - /// Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: PolkadotXcm Queries (r:0 w:1) - /// Proof Skipped: PolkadotXcm Queries (max_values: None, max_size: None, mode: Measured) + /// Storage: `PolkadotXcm::VersionNotifiers` (r:1 w:1) + /// Proof: `PolkadotXcm::VersionNotifiers` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::QueryCounter` (r:1 w:1) + /// Proof: `PolkadotXcm::QueryCounter` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) + /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) + /// Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) + /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) + /// Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) + /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::Queries` (r:0 w:1) + /// Proof: `PolkadotXcm::Queries` (`max_values`: None, `max_size`: None, mode: `Measured`) fn force_subscribe_version_notify() -> Weight { // Proof Size summary in bytes: // Measured: `38` // Estimated: `3503` - // Minimum execution time: 30_271_000 picoseconds. - Weight::from_parts(30_819_000, 0) + // Minimum execution time: 23_827_000 picoseconds. + Weight::from_parts(24_493_000, 0) .saturating_add(Weight::from_parts(0, 3503)) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(5)) } - /// Storage: PolkadotXcm VersionNotifiers (r:1 w:1) - /// Proof Skipped: PolkadotXcm VersionNotifiers (max_values: None, max_size: None, mode: Measured) - /// Storage: PolkadotXcm SupportedVersion (r:1 w:0) - /// Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) - /// Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) - /// Proof Skipped: PolkadotXcm VersionDiscoveryQueue (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: PolkadotXcm SafeXcmVersion (r:1 w:0) - /// Proof Skipped: PolkadotXcm SafeXcmVersion (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ParachainSystem HostConfiguration (r:1 w:0) - /// Proof Skipped: ParachainSystem HostConfiguration (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ParachainSystem PendingUpwardMessages (r:1 w:1) - /// Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: PolkadotXcm Queries (r:0 w:1) - /// Proof Skipped: PolkadotXcm Queries (max_values: None, max_size: None, mode: Measured) + /// Storage: `PolkadotXcm::VersionNotifiers` (r:1 w:1) + /// Proof: `PolkadotXcm::VersionNotifiers` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) + /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) + /// Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) + /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) + /// Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) + /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::Queries` (r:0 w:1) + /// Proof: `PolkadotXcm::Queries` (`max_values`: None, `max_size`: None, mode: `Measured`) fn force_unsubscribe_version_notify() -> Weight { // Proof Size summary in bytes: - // Measured: `220` - // Estimated: `3685` - // Minimum execution time: 32_302_000 picoseconds. - Weight::from_parts(32_807_000, 0) - .saturating_add(Weight::from_parts(0, 3685)) + // Measured: `255` + // Estimated: `3720` + // Minimum execution time: 26_755_000 picoseconds. + Weight::from_parts(27_125_000, 0) + .saturating_add(Weight::from_parts(0, 3720)) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(4)) } - /// Storage: PolkadotXcm XcmExecutionSuspended (r:0 w:1) - /// Proof Skipped: PolkadotXcm XcmExecutionSuspended (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: `PolkadotXcm::XcmExecutionSuspended` (r:0 w:1) + /// Proof: `PolkadotXcm::XcmExecutionSuspended` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) fn force_suspension() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_960_000 picoseconds. - Weight::from_parts(3_094_000, 0) + // Minimum execution time: 1_898_000 picoseconds. + Weight::from_parts(2_028_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } - /// Storage: PolkadotXcm SupportedVersion (r:4 w:2) - /// Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) + /// Storage: `PolkadotXcm::SupportedVersion` (r:5 w:2) + /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) fn migrate_supported_version() -> Weight { // Proof Size summary in bytes: - // Measured: `95` - // Estimated: `10985` - // Minimum execution time: 14_877_000 picoseconds. - Weight::from_parts(15_296_000, 0) - .saturating_add(Weight::from_parts(0, 10985)) - .saturating_add(T::DbWeight::get().reads(4)) + // Measured: `89` + // Estimated: `13454` + // Minimum execution time: 16_300_000 picoseconds. + Weight::from_parts(16_995_000, 0) + .saturating_add(Weight::from_parts(0, 13454)) + .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) } - /// Storage: PolkadotXcm VersionNotifiers (r:4 w:2) - /// Proof Skipped: PolkadotXcm VersionNotifiers (max_values: None, max_size: None, mode: Measured) + /// Storage: `PolkadotXcm::VersionNotifiers` (r:5 w:2) + /// Proof: `PolkadotXcm::VersionNotifiers` (`max_values`: None, `max_size`: None, mode: `Measured`) fn migrate_version_notifiers() -> Weight { // Proof Size summary in bytes: - // Measured: `99` - // Estimated: `10989` - // Minimum execution time: 14_835_000 picoseconds. - Weight::from_parts(15_115_000, 0) - .saturating_add(Weight::from_parts(0, 10989)) - .saturating_add(T::DbWeight::get().reads(4)) + // Measured: `93` + // Estimated: `13458` + // Minimum execution time: 16_495_000 picoseconds. + Weight::from_parts(16_950_000, 0) + .saturating_add(Weight::from_parts(0, 13458)) + .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) } - /// Storage: PolkadotXcm VersionNotifyTargets (r:5 w:0) - /// Proof Skipped: PolkadotXcm VersionNotifyTargets (max_values: None, max_size: None, mode: Measured) + /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:6 w:0) + /// Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) fn already_notified_target() -> Weight { // Proof Size summary in bytes: // Measured: `106` - // Estimated: `13471` - // Minimum execution time: 15_368_000 picoseconds. - Weight::from_parts(15_596_000, 0) - .saturating_add(Weight::from_parts(0, 13471)) - .saturating_add(T::DbWeight::get().reads(5)) + // Estimated: `15946` + // Minimum execution time: 18_153_000 picoseconds. + Weight::from_parts(18_595_000, 0) + .saturating_add(Weight::from_parts(0, 15946)) + .saturating_add(T::DbWeight::get().reads(6)) } - /// Storage: PolkadotXcm VersionNotifyTargets (r:2 w:1) - /// Proof Skipped: PolkadotXcm VersionNotifyTargets (max_values: None, max_size: None, mode: Measured) - /// Storage: PolkadotXcm SupportedVersion (r:1 w:0) - /// Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) - /// Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) - /// Proof Skipped: PolkadotXcm VersionDiscoveryQueue (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: PolkadotXcm SafeXcmVersion (r:1 w:0) - /// Proof Skipped: PolkadotXcm SafeXcmVersion (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ParachainSystem HostConfiguration (r:1 w:0) - /// Proof Skipped: ParachainSystem HostConfiguration (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ParachainSystem PendingUpwardMessages (r:1 w:1) - /// Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:2 w:1) + /// Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) + /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) + /// Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) + /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) + /// Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) + /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) fn notify_current_targets() -> Weight { // Proof Size summary in bytes: // Measured: `106` // Estimated: `6046` - // Minimum execution time: 28_025_000 picoseconds. - Weight::from_parts(28_524_000, 0) + // Minimum execution time: 23_387_000 picoseconds. + Weight::from_parts(24_677_000, 0) .saturating_add(Weight::from_parts(0, 6046)) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(3)) } - /// Storage: PolkadotXcm VersionNotifyTargets (r:3 w:0) - /// Proof Skipped: PolkadotXcm VersionNotifyTargets (max_values: None, max_size: None, mode: Measured) + /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:4 w:0) + /// Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) fn notify_target_migration_fail() -> Weight { // Proof Size summary in bytes: // Measured: `136` - // Estimated: `8551` - // Minimum execution time: 8_166_000 picoseconds. - Weight::from_parts(8_314_000, 0) - .saturating_add(Weight::from_parts(0, 8551)) - .saturating_add(T::DbWeight::get().reads(3)) + // Estimated: `11026` + // Minimum execution time: 10_939_000 picoseconds. + Weight::from_parts(11_210_000, 0) + .saturating_add(Weight::from_parts(0, 11026)) + .saturating_add(T::DbWeight::get().reads(4)) } - /// Storage: PolkadotXcm VersionNotifyTargets (r:4 w:2) - /// Proof Skipped: PolkadotXcm VersionNotifyTargets (max_values: None, max_size: None, mode: Measured) + /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:5 w:2) + /// Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) fn migrate_version_notify_targets() -> Weight { // Proof Size summary in bytes: - // Measured: `106` - // Estimated: `10996` - // Minimum execution time: 14_871_000 picoseconds. - Weight::from_parts(15_374_000, 0) - .saturating_add(Weight::from_parts(0, 10996)) - .saturating_add(T::DbWeight::get().reads(4)) + // Measured: `100` + // Estimated: `13465` + // Minimum execution time: 16_850_000 picoseconds. + Weight::from_parts(17_195_000, 0) + .saturating_add(Weight::from_parts(0, 13465)) + .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) } - /// Storage: PolkadotXcm VersionNotifyTargets (r:4 w:2) - /// Proof Skipped: PolkadotXcm VersionNotifyTargets (max_values: None, max_size: None, mode: Measured) - /// Storage: PolkadotXcm SupportedVersion (r:1 w:0) - /// Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) - /// Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) - /// Proof Skipped: PolkadotXcm VersionDiscoveryQueue (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: PolkadotXcm SafeXcmVersion (r:1 w:0) - /// Proof Skipped: PolkadotXcm SafeXcmVersion (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ParachainSystem HostConfiguration (r:1 w:0) - /// Proof Skipped: ParachainSystem HostConfiguration (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ParachainSystem PendingUpwardMessages (r:1 w:1) - /// Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:5 w:2) + /// Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) + /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) + /// Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) + /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) + /// Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) + /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) fn migrate_and_notify_old_targets() -> Weight { // Proof Size summary in bytes: - // Measured: `112` - // Estimated: `11002` - // Minimum execution time: 33_611_000 picoseconds. - Weight::from_parts(34_008_000, 0) - .saturating_add(Weight::from_parts(0, 11002)) - .saturating_add(T::DbWeight::get().reads(9)) + // Measured: `106` + // Estimated: `13471` + // Minimum execution time: 31_931_000 picoseconds. + Weight::from_parts(32_494_000, 0) + .saturating_add(Weight::from_parts(0, 13471)) + .saturating_add(T::DbWeight::get().reads(10)) .saturating_add(T::DbWeight::get().writes(4)) } /// Storage: `PolkadotXcm::QueryCounter` (r:1 w:1) @@ -319,11 +341,11 @@ impl pallet_xcm::WeightInfo for WeightInfo { /// Proof: `PolkadotXcm::Queries` (`max_values`: None, `max_size`: None, mode: `Measured`) fn new_query() -> Weight { // Proof Size summary in bytes: - // Measured: `103` - // Estimated: `1588` - // Minimum execution time: 5_496_000 picoseconds. - Weight::from_parts(5_652_000, 0) - .saturating_add(Weight::from_parts(0, 1588)) + // Measured: `32` + // Estimated: `1517` + // Minimum execution time: 3_514_000 picoseconds. + Weight::from_parts(3_709_000, 0) + .saturating_add(Weight::from_parts(0, 1517)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -331,11 +353,23 @@ impl pallet_xcm::WeightInfo for WeightInfo { /// Proof: `PolkadotXcm::Queries` (`max_values`: None, `max_size`: None, mode: `Measured`) fn take_response() -> Weight { // Proof Size summary in bytes: - // Measured: `7740` - // Estimated: `11205` - // Minimum execution time: 26_140_000 picoseconds. - Weight::from_parts(26_824_000, 0) - .saturating_add(Weight::from_parts(0, 11205)) + // Measured: `7669` + // Estimated: `11134` + // Minimum execution time: 24_863_000 picoseconds. + Weight::from_parts(25_293_000, 0) + .saturating_add(Weight::from_parts(0, 11134)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `PolkadotXcm::AssetTraps` (r:1 w:1) + /// Proof: `PolkadotXcm::AssetTraps` (`max_values`: None, `max_size`: None, mode: `Measured`) + fn claim_assets() -> Weight { + // Proof Size summary in bytes: + // Measured: `90` + // Estimated: `3555` + // Minimum execution time: 33_799_000 picoseconds. + Weight::from_parts(34_665_000, 0) + .saturating_add(Weight::from_parts(0, 3555)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } diff --git a/cumulus/parachains/runtimes/people/people-rococo/src/xcm_config.rs b/cumulus/parachains/runtimes/people/people-rococo/src/xcm_config.rs index c7408b3fa84baed1bd03f8a7bb00077f98698be3..1a42adeafd1d863b33d677abf0e2d90bf6e9feb1 100644 --- a/cumulus/parachains/runtimes/people/people-rococo/src/xcm_config.rs +++ b/cumulus/parachains/runtimes/people/people-rococo/src/xcm_config.rs @@ -20,31 +20,30 @@ use super::{ use crate::{TransactionByteFee, CENTS}; use frame_support::{ parameter_types, - traits::{ConstU32, Contains, Equals, Everything, Nothing}, + traits::{tokens::imbalance::ResolveTo, ConstU32, Contains, Equals, Everything, Nothing}, }; use frame_system::EnsureRoot; +use pallet_collator_selection::StakingPotAccountId; use pallet_xcm::XcmPassthrough; use parachains_common::{ - impls::ToStakingPot, xcm_config::{ - AllSiblingSystemParachains, ConcreteAssetFromSystem, RelayOrOtherSystemParachains, + AllSiblingSystemParachains, ConcreteAssetFromSystem, ParentRelayOrSiblingParachains, + RelayOrOtherSystemParachains, }, TREASURY_PALLET_ID, }; use polkadot_parachain_primitives::primitives::Sibling; use sp_runtime::traits::AccountIdConversion; use xcm::latest::prelude::*; -#[allow(deprecated)] -use xcm_builder::CurrencyAdapter; use xcm_builder::{ AccountId32Aliases, AllowExplicitUnpaidExecutionFrom, AllowKnownQueryResponses, AllowSubscriptionsFrom, AllowTopLevelPaidExecutionFrom, DenyReserveTransferToRelayChain, - DenyThenTry, DescribeTerminus, EnsureXcmOrigin, FrameTransactionalProcessor, HashedDescription, - IsConcrete, ParentAsSuperuser, ParentIsPreset, RelayChainAsNative, SiblingParachainAsNative, - SiblingParachainConvertsVia, SignedAccountId32AsNative, SignedToAccountId32, - SovereignSignedViaLocation, TakeWeightCredit, TrailingSetTopicAsId, UsingComponents, - WeightInfoBounds, WithComputedOrigin, WithUniqueTopic, XcmFeeManagerFromComponents, - XcmFeeToAccount, + DenyThenTry, DescribeTerminus, EnsureXcmOrigin, FrameTransactionalProcessor, FungibleAdapter, + HashedDescription, IsConcrete, ParentAsSuperuser, ParentIsPreset, RelayChainAsNative, + SiblingParachainAsNative, SiblingParachainConvertsVia, SignedAccountId32AsNative, + SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit, TrailingSetTopicAsId, + UsingComponents, WeightInfoBounds, WithComputedOrigin, WithUniqueTopic, + XcmFeeManagerFromComponents, XcmFeeToAccount, }; use xcm_executor::{traits::WithOriginFilter, XcmExecutor}; @@ -97,8 +96,7 @@ pub type LocationToAccountId = ( ); /// Means for transacting the native currency on this chain. -#[allow(deprecated)] -pub type CurrencyTransactor = CurrencyAdapter< +pub type FungibleTransactor = FungibleAdapter< // Use this currency: Balances, // Use this currency when it is a fungible asset matching the given location or name: @@ -150,13 +148,6 @@ impl Contains for ParentOrParentsPlurality { } } -pub struct ParentOrSiblings; -impl Contains for ParentOrSiblings { - fn contains(location: &Location) -> bool { - matches!(location.unpack(), (1, []) | (1, [Parachain(_)])) - } -} - /// A call filter for the XCM Transact instruction. This is a temporary measure until we properly /// account for proof size weights. /// @@ -216,13 +207,13 @@ pub type Barrier = TrailingSetTopicAsId< AllowKnownQueryResponses, WithComputedOrigin< ( - // If the message is one that immediately attemps to pay for execution, then + // If the message is one that immediately attempts to pay for execution, then // allow it. AllowTopLevelPaidExecutionFrom, // Parent and its pluralities (i.e. governance bodies) get free execution. AllowExplicitUnpaidExecutionFrom, // Subscriptions for version tracking are OK. - AllowSubscriptionsFrom, + AllowSubscriptionsFrom, ), UniversalLocation, ConstU32<8>, @@ -244,7 +235,7 @@ pub struct XcmConfig; impl xcm_executor::Config for XcmConfig { type RuntimeCall = RuntimeCall; type XcmSender = XcmRouter; - type AssetTransactor = CurrencyTransactor; + type AssetTransactor = FungibleTransactor; type OriginConverter = XcmOriginToTransactDispatchOrigin; // People chain does not recognize a reserve location for any asset. Users must teleport ROC // where allowed (e.g. with the Relay Chain). @@ -258,8 +249,13 @@ impl xcm_executor::Config for XcmConfig { RuntimeCall, MaxInstructions, >; - type Trader = - UsingComponents>; + type Trader = UsingComponents< + WeightToFee, + RelayLocation, + AccountId, + Balances, + ResolveTo, Balances>, + >; type ResponseHandler = PolkadotXcm; type AssetTrap = PolkadotXcm; type AssetClaims = PolkadotXcm; @@ -278,6 +274,9 @@ impl xcm_executor::Config for XcmConfig { type SafeCallFilter = SafeCallFilter; type Aliasers = Nothing; type TransactionalProcessor = FrameTransactionalProcessor; + type HrmpNewChannelOpenRequestHandler = (); + type HrmpChannelAcceptedHandler = (); + type HrmpChannelClosingHandler = (); } /// Converts a local signed origin into an XCM location. Forms the basis for local origins @@ -298,10 +297,9 @@ impl pallet_xcm::Config for Runtime { // We want to disallow users sending (arbitrary) XCM programs from this chain. type SendXcmOrigin = EnsureXcmOrigin; type XcmRouter = XcmRouter; - // We support local origins dispatching XCM executions in principle... + // We support local origins dispatching XCM executions. type ExecuteXcmOrigin = EnsureXcmOrigin; - // ... but disallow generic XCM execution. As a result only teleports are allowed. - type XcmExecuteFilter = Nothing; + type XcmExecuteFilter = Everything; type XcmExecutor = XcmExecutor; type XcmTeleportFilter = Everything; type XcmReserveTransferFilter = Nothing; // This parachain is not meant as a reserve location. diff --git a/cumulus/parachains/runtimes/people/people-westend/Cargo.toml b/cumulus/parachains/runtimes/people/people-westend/Cargo.toml index c4c76074d75b93b9532ce2efc34988ebae5a0cb2..576c3b1aa4e3eaafafafd0af353580fef7a3c20c 100644 --- a/cumulus/parachains/runtimes/people/people-westend/Cargo.toml +++ b/cumulus/parachains/runtimes/people/people-westend/Cargo.toml @@ -13,9 +13,9 @@ substrate-wasm-builder = { path = "../../../../../substrate/utils/wasm-builder", codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } enumflags2 = { version = "0.7.7" } hex-literal = { version = "0.4.1" } -log = { version = "0.4.20", default-features = false } +log = { workspace = true } scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.195", optional = true, features = ["derive"] } +serde = { optional = true, features = ["derive"], workspace = true, default-features = true } # Substrate frame-benchmarking = { path = "../../../../../substrate/frame/benchmarking", default-features = false, optional = true } @@ -69,6 +69,7 @@ cumulus-pallet-xcmp-queue = { path = "../../../../pallets/xcmp-queue", default-f cumulus-primitives-aura = { path = "../../../../primitives/aura", default-features = false } cumulus-primitives-core = { path = "../../../../primitives/core", default-features = false } cumulus-primitives-utility = { path = "../../../../primitives/utility", default-features = false } +cumulus-primitives-storage-weight-reclaim = { path = "../../../../primitives/storage-weight-reclaim", default-features = false } pallet-collator-selection = { path = "../../../../pallets/collator-selection", default-features = false } parachain-info = { package = "staging-parachain-info", path = "../../../pallets/parachain-info", default-features = false } parachains-common = { path = "../../../common", default-features = false } @@ -85,6 +86,7 @@ std = [ "cumulus-pallet-xcmp-queue/std", "cumulus-primitives-aura/std", "cumulus-primitives-core/std", + "cumulus-primitives-storage-weight-reclaim/std", "cumulus-primitives-utility/std", "enumflags2/std", "frame-benchmarking?/std", @@ -188,5 +190,3 @@ try-runtime = [ "polkadot-runtime-common/try-runtime", "sp-runtime/try-runtime", ] - -experimental = ["pallet-aura/experimental"] diff --git a/cumulus/parachains/runtimes/people/people-westend/src/lib.rs b/cumulus/parachains/runtimes/people/people-westend/src/lib.rs index eee4bf5f5b73899f623c7b02b6cab68f3e682b94..d77d7b5e6521460d24db9cd185ec943aaeb95fa8 100644 --- a/cumulus/parachains/runtimes/people/people-westend/src/lib.rs +++ b/cumulus/parachains/runtimes/people/people-westend/src/lib.rs @@ -27,7 +27,7 @@ use cumulus_primitives_core::{AggregateMessageOrigin, ParaId}; use frame_support::{ construct_runtime, derive_impl, dispatch::DispatchClass, - genesis_builder_helper::{build_config, create_default_config}, + genesis_builder_helper::{build_state, get_preset}, parameter_types, traits::{ ConstBool, ConstU32, ConstU64, ConstU8, EitherOfDiverse, Everything, TransformOrigin, @@ -93,6 +93,7 @@ pub type SignedExtra = ( frame_system::CheckNonce, frame_system::CheckWeight, pallet_transaction_payment::ChargeTransactionPayment, + cumulus_primitives_storage_weight_reclaim::StorageWeightReclaim, ); /// Unchecked extrinsic type as expected by this runtime. @@ -100,7 +101,10 @@ pub type UncheckedExtrinsic = generic::UncheckedExtrinsic; /// Migrations to apply on runtime upgrade. -pub type Migrations = (); +pub type Migrations = ( + // permanent + pallet_xcm::migration::MigrateToLatestXcmVersion, +); /// Executive: handles dispatch to the various modules. pub type Executive = frame_executive::Executive< @@ -123,7 +127,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("people-westend"), impl_name: create_runtime_str!("people-westend"), authoring_version: 1, - spec_version: 1_006_001, + spec_version: 1_010_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 0, @@ -161,7 +165,7 @@ parameter_types! { pub const SS58Prefix: u8 = 42; } -#[derive_impl(frame_system::config_preludes::ParaChainDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::ParaChainDefaultConfig)] impl frame_system::Config for Runtime { type BaseCallFilter = Everything; type BlockWeights = RuntimeBlockWeights; @@ -184,10 +188,7 @@ impl pallet_timestamp::Config for Runtime { /// A timestamp: milliseconds since the unix epoch. type Moment = u64; type OnTimestampSet = Aura; - #[cfg(feature = "experimental")] type MinimumPeriod = ConstU64<0>; - #[cfg(not(feature = "experimental"))] - type MinimumPeriod = ConstU64<{ SLOT_DURATION / 2 }>; type WeightInfo = weights::pallet_timestamp::WeightInfo; } @@ -224,7 +225,7 @@ parameter_types! { impl pallet_transaction_payment::Config for Runtime { type RuntimeEvent = RuntimeEvent; type OnChargeTransaction = - pallet_transaction_payment::CurrencyAdapter>; + pallet_transaction_payment::FungibleAdapter>; type OperationalFeeMultiplier = ConstU8<5>; type WeightToFee = WeightToFee; type LengthToFee = ConstantMultiplier; @@ -282,6 +283,7 @@ impl pallet_message_queue::Config for Runtime { type HeapSize = sp_core::ConstU32<{ 64 * 1024 }>; type MaxStale = sp_core::ConstU32<8>; type ServiceWeight = MessageQueueServiceWeight; + type IdleMaxServiceWeight = MessageQueueServiceWeight; type WeightInfo = weights::pallet_message_queue::WeightInfo; } @@ -334,7 +336,6 @@ impl pallet_aura::Config for Runtime { type DisabledValidators = (); type MaxAuthorities = ConstU32<100_000>; type AllowMultipleBlocksPerSlot = ConstBool; - #[cfg(feature = "experimental")] type SlotDuration = ConstU64; } @@ -345,7 +346,7 @@ parameter_types! { pub const StakingAdminBodyId: BodyId = BodyId::Defense; } -/// We allow Root and the `StakingAdmi` to execute privileged collator selection operations. +/// We allow Root and the `StakingAdmin` to execute privileged collator selection operations. pub type CollatorSelectionUpdateOrigin = EitherOfDiverse< EnsureRoot, EnsureXcm>, @@ -445,6 +446,7 @@ mod benches { [frame_system, SystemBench::] [pallet_balances, Balances] [pallet_identity, Identity] + [pallet_message_queue, MessageQueue] [pallet_multisig, Multisig] [pallet_session, SessionBench::] [pallet_utility, Utility] @@ -452,10 +454,11 @@ mod benches { // Polkadot [polkadot_runtime_common::identity_migrator, IdentityMigrator] // Cumulus + [cumulus_pallet_parachain_system, ParachainSystem] [cumulus_pallet_xcmp_queue, XcmpQueue] [pallet_collator_selection, CollatorSelection] // XCM - [pallet_xcm, PalletXcmExtrinsiscsBenchmark::] + [pallet_xcm, PalletXcmExtrinsicsBenchmark::] [pallet_xcm_benchmarks::fungible, XcmBalances] [pallet_xcm_benchmarks::generic, XcmGeneric] ); @@ -468,7 +471,7 @@ impl_runtime_apis! { } fn authorities() -> Vec { - Aura::authorities().into_inner() + pallet_aura::Authorities::::get().into_inner() } } @@ -490,7 +493,7 @@ impl_runtime_apis! { Executive::execute_block(block) } - fn initialize_block(header: &::Header) { + fn initialize_block(header: &::Header) -> sp_runtime::ExtrinsicInclusionMode { Executive::initialize_block(header) } } @@ -640,7 +643,7 @@ impl_runtime_apis! { use frame_support::traits::StorageInfoTrait; use frame_system_benchmarking::Pallet as SystemBench; use cumulus_pallet_session_benchmarking::Pallet as SessionBench; - use pallet_xcm::benchmarking::Pallet as PalletXcmExtrinsiscsBenchmark; + use pallet_xcm::benchmarking::Pallet as PalletXcmExtrinsicsBenchmark; // This is defined once again in dispatch_benchmark, because list_benchmarks! // and add_benchmarks! are macros exported by define_benchmarks! macros and those types @@ -678,8 +681,14 @@ impl_runtime_apis! { use cumulus_pallet_session_benchmarking::Pallet as SessionBench; impl cumulus_pallet_session_benchmarking::Config for Runtime {} - use pallet_xcm::benchmarking::Pallet as PalletXcmExtrinsiscsBenchmark; + use pallet_xcm::benchmarking::Pallet as PalletXcmExtrinsicsBenchmark; impl pallet_xcm::benchmarking::Config for Runtime { + type DeliveryHelper = cumulus_primitives_utility::ToParentDeliveryHelper< + xcm_config::XcmConfig, + ExistentialDepositAsset, + xcm_config::PriceForParentDelivery, + >; + fn reachable_dest() -> Option { Some(Parent.into()) } @@ -688,7 +697,7 @@ impl_runtime_apis! { // Relay/native token can be teleported between People and Relay. Some(( Asset { - fun: Fungible(EXISTENTIAL_DEPOSIT), + fun: Fungible(ExistentialDeposit::get()), id: AssetId(Parent.into()) }, Parent.into(), @@ -698,6 +707,13 @@ impl_runtime_apis! { fn reserve_transferable_asset_and_dest() -> Option<(Asset, Location)> { None } + + fn get_asset() -> Asset { + Asset { + id: AssetId(Location::parent()), + fun: Fungible(ExistentialDeposit::get()), + } + } } use xcm::latest::prelude::*; @@ -834,12 +850,16 @@ impl_runtime_apis! { } impl sp_genesis_builder::GenesisBuilder for Runtime { - fn create_default_config() -> Vec { - create_default_config::() + fn build_state(config: Vec) -> sp_genesis_builder::Result { + build_state::(config) + } + + fn get_preset(id: &Option) -> Option> { + get_preset::(id, |_| None) } - fn build_config(config: Vec) -> sp_genesis_builder::Result { - build_config::(config) + fn preset_names() -> Vec { + vec![] } } } diff --git a/cumulus/parachains/runtimes/people/people-westend/src/weights/pallet_xcm.rs b/cumulus/parachains/runtimes/people/people-westend/src/weights/pallet_xcm.rs index d3b60471b850e0fffbad01915aaf461be3d48ae0..62a9c802808c0fdc2305f566f7b7f67b4d0a5748 100644 --- a/cumulus/parachains/runtimes/people/people-westend/src/weights/pallet_xcm.rs +++ b/cumulus/parachains/runtimes/people/people-westend/src/weights/pallet_xcm.rs @@ -1,40 +1,41 @@ // Copyright (C) Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 +// This file is part of Cumulus. -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// Cumulus is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Cumulus is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Cumulus. If not, see . //! Autogenerated weights for `pallet_xcm` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-03-21, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("people-polkadot-dev"), DB CACHE: 1024 +//! HOSTNAME: `runner-h2rr8wx7-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("people-westend-dev")`, DB CACHE: 1024 // Executed Command: -// ./artifacts/polkadot-parachain +// target/production/polkadot-parachain // benchmark // pallet -// --chain=people-polkadot-dev -// --execution=wasm -// --wasm-execution=compiled -// --pallet=pallet_xcm -// --extrinsic=* // --steps=50 // --repeat=20 -// --json -// --header=./file_header.txt -// --output=./cumulus/parachains/runtimes/people/people-polkadot/src/weights/pallet_xcm.rs +// --extrinsic=* +// --wasm-execution=compiled +// --heap-pages=4096 +// --json-file=/builds/parity/mirrors/polkadot-sdk/.git/.artifacts/bench.json +// --pallet=pallet_xcm +// --chain=people-westend-dev +// --header=./cumulus/file_header.txt +// --output=./cumulus/parachains/runtimes/people/people-westend/src/weights/ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -47,57 +48,48 @@ use core::marker::PhantomData; /// Weight functions for `pallet_xcm`. pub struct WeightInfo(PhantomData); impl pallet_xcm::WeightInfo for WeightInfo { - /// Storage: PolkadotXcm SupportedVersion (r:1 w:0) - /// Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) - /// Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) - /// Proof Skipped: PolkadotXcm VersionDiscoveryQueue (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: PolkadotXcm SafeXcmVersion (r:1 w:0) - /// Proof Skipped: PolkadotXcm SafeXcmVersion (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ParachainSystem HostConfiguration (r:1 w:0) - /// Proof Skipped: ParachainSystem HostConfiguration (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ParachainSystem PendingUpwardMessages (r:1 w:1) - /// Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) + /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) + /// Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) + /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) + /// Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) + /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) fn send() -> Weight { // Proof Size summary in bytes: // Measured: `38` // Estimated: `3503` - // Minimum execution time: 25_783_000 picoseconds. - Weight::from_parts(26_398_000, 0) + // Minimum execution time: 17_450_000 picoseconds. + Weight::from_parts(17_913_000, 0) .saturating_add(Weight::from_parts(0, 3503)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) } - /// Storage: ParachainInfo ParachainId (r:1 w:0) - /// Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - fn teleport_assets() -> Weight { - // Proof Size summary in bytes: - // Measured: `32` - // Estimated: `1489` - // Minimum execution time: 25_511_000 picoseconds. - Weight::from_parts(26_120_000, 0) - .saturating_add(Weight::from_parts(0, 1489)) - .saturating_add(T::DbWeight::get().reads(1)) - } - /// Storage: Benchmark Override (r:0 w:0) - /// Proof Skipped: Benchmark Override (max_values: None, max_size: None, mode: Measured) - fn reserve_transfer_assets() -> Weight { + /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) + /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) + /// Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) + /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) + /// Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) + /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + fn send_blob() -> Weight { // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 18_446_744_073_709_551_000 picoseconds. - Weight::from_parts(18_446_744_073_709_551_000, 0) - .saturating_add(Weight::from_parts(0, 0)) + // Measured: `38` + // Estimated: `3503` + // Minimum execution time: 18_082_000 picoseconds. + Weight::from_parts(18_293_000, 0) + .saturating_add(Weight::from_parts(0, 3503)) + .saturating_add(T::DbWeight::get().reads(5)) + .saturating_add(T::DbWeight::get().writes(2)) } /// Storage: `ParachainInfo::ParachainId` (r:1 w:0) /// Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - /// Storage: `Assets::Asset` (r:1 w:1) - /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `Assets::Account` (r:2 w:2) - /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:2 w:2) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - /// Storage: `ParachainSystem::UpwardDeliveryFeeFactor` (r:1 w:0) - /// Proof: `ParachainSystem::UpwardDeliveryFeeFactor` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) @@ -108,18 +100,38 @@ impl pallet_xcm::WeightInfo for WeightInfo { /// Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) /// Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + fn teleport_assets() -> Weight { + // Proof Size summary in bytes: + // Measured: `70` + // Estimated: `3535` + // Minimum execution time: 54_939_000 picoseconds. + Weight::from_parts(55_721_000, 0) + .saturating_add(Weight::from_parts(0, 3535)) + .saturating_add(T::DbWeight::get().reads(6)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: `Benchmark::Override` (r:0 w:0) + /// Proof: `Benchmark::Override` (`max_values`: None, `max_size`: None, mode: `Measured`) + fn reserve_transfer_assets() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 18_446_744_073_709_551_000 picoseconds. + Weight::from_parts(18_446_744_073_709_551_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + } + /// Storage: `Benchmark::Override` (r:0 w:0) + /// Proof: `Benchmark::Override` (`max_values`: None, `max_size`: None, mode: `Measured`) fn transfer_assets() -> Weight { // Proof Size summary in bytes: - // Measured: `496` - // Estimated: `6208` - // Minimum execution time: 146_932_000 picoseconds. - Weight::from_parts(153_200_000, 0) - .saturating_add(Weight::from_parts(0, 6208)) - .saturating_add(T::DbWeight::get().reads(12)) - .saturating_add(T::DbWeight::get().writes(7)) + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 18_446_744_073_709_551_000 picoseconds. + Weight::from_parts(18_446_744_073_709_551_000, 0) + .saturating_add(Weight::from_parts(0, 0)) } - /// Storage: Benchmark Override (r:0 w:0) - /// Proof Skipped: Benchmark Override (max_values: None, max_size: None, mode: Measured) + /// Storage: `Benchmark::Override` (r:0 w:0) + /// Proof: `Benchmark::Override` (`max_values`: None, `max_size`: None, mode: `Measured`) fn execute() -> Weight { // Proof Size summary in bytes: // Measured: `0` @@ -128,189 +140,199 @@ impl pallet_xcm::WeightInfo for WeightInfo { Weight::from_parts(18_446_744_073_709_551_000, 0) .saturating_add(Weight::from_parts(0, 0)) } - /// Storage: PolkadotXcm SupportedVersion (r:0 w:1) - /// Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) + /// Storage: `Benchmark::Override` (r:0 w:0) + /// Proof: `Benchmark::Override` (`max_values`: None, `max_size`: None, mode: `Measured`) + fn execute_blob() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 18_446_744_073_709_551_000 picoseconds. + Weight::from_parts(18_446_744_073_709_551_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + } + /// Storage: `PolkadotXcm::SupportedVersion` (r:0 w:1) + /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) fn force_xcm_version() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 9_707_000 picoseconds. - Weight::from_parts(9_874_000, 0) + // Minimum execution time: 5_789_000 picoseconds. + Weight::from_parts(5_995_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } - /// Storage: PolkadotXcm SafeXcmVersion (r:0 w:1) - /// Proof Skipped: PolkadotXcm SafeXcmVersion (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: `PolkadotXcm::SafeXcmVersion` (r:0 w:1) + /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) fn force_default_xcm_version() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_073_000 picoseconds. - Weight::from_parts(3_183_000, 0) + // Minimum execution time: 1_795_000 picoseconds. + Weight::from_parts(1_924_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } - /// Storage: PolkadotXcm VersionNotifiers (r:1 w:1) - /// Proof Skipped: PolkadotXcm VersionNotifiers (max_values: None, max_size: None, mode: Measured) - /// Storage: PolkadotXcm QueryCounter (r:1 w:1) - /// Proof Skipped: PolkadotXcm QueryCounter (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: PolkadotXcm SupportedVersion (r:1 w:0) - /// Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) - /// Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) - /// Proof Skipped: PolkadotXcm VersionDiscoveryQueue (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: PolkadotXcm SafeXcmVersion (r:1 w:0) - /// Proof Skipped: PolkadotXcm SafeXcmVersion (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ParachainSystem HostConfiguration (r:1 w:0) - /// Proof Skipped: ParachainSystem HostConfiguration (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ParachainSystem PendingUpwardMessages (r:1 w:1) - /// Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: PolkadotXcm Queries (r:0 w:1) - /// Proof Skipped: PolkadotXcm Queries (max_values: None, max_size: None, mode: Measured) + /// Storage: `PolkadotXcm::VersionNotifiers` (r:1 w:1) + /// Proof: `PolkadotXcm::VersionNotifiers` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::QueryCounter` (r:1 w:1) + /// Proof: `PolkadotXcm::QueryCounter` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) + /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) + /// Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) + /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) + /// Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) + /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::Queries` (r:0 w:1) + /// Proof: `PolkadotXcm::Queries` (`max_values`: None, `max_size`: None, mode: `Measured`) fn force_subscribe_version_notify() -> Weight { // Proof Size summary in bytes: // Measured: `38` // Estimated: `3503` - // Minimum execution time: 30_999_000 picoseconds. - Weight::from_parts(31_641_000, 0) + // Minimum execution time: 23_445_000 picoseconds. + Weight::from_parts(23_906_000, 0) .saturating_add(Weight::from_parts(0, 3503)) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(5)) } - /// Storage: PolkadotXcm VersionNotifiers (r:1 w:1) - /// Proof Skipped: PolkadotXcm VersionNotifiers (max_values: None, max_size: None, mode: Measured) - /// Storage: PolkadotXcm SupportedVersion (r:1 w:0) - /// Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) - /// Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) - /// Proof Skipped: PolkadotXcm VersionDiscoveryQueue (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: PolkadotXcm SafeXcmVersion (r:1 w:0) - /// Proof Skipped: PolkadotXcm SafeXcmVersion (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ParachainSystem HostConfiguration (r:1 w:0) - /// Proof Skipped: ParachainSystem HostConfiguration (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ParachainSystem PendingUpwardMessages (r:1 w:1) - /// Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: PolkadotXcm Queries (r:0 w:1) - /// Proof Skipped: PolkadotXcm Queries (max_values: None, max_size: None, mode: Measured) + /// Storage: `PolkadotXcm::VersionNotifiers` (r:1 w:1) + /// Proof: `PolkadotXcm::VersionNotifiers` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) + /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) + /// Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) + /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) + /// Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) + /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::Queries` (r:0 w:1) + /// Proof: `PolkadotXcm::Queries` (`max_values`: None, `max_size`: None, mode: `Measured`) fn force_unsubscribe_version_notify() -> Weight { // Proof Size summary in bytes: - // Measured: `220` - // Estimated: `3685` - // Minimum execution time: 33_036_000 picoseconds. - Weight::from_parts(33_596_000, 0) - .saturating_add(Weight::from_parts(0, 3685)) + // Measured: `255` + // Estimated: `3720` + // Minimum execution time: 26_590_000 picoseconds. + Weight::from_parts(27_056_000, 0) + .saturating_add(Weight::from_parts(0, 3720)) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(4)) } - /// Storage: PolkadotXcm XcmExecutionSuspended (r:0 w:1) - /// Proof Skipped: PolkadotXcm XcmExecutionSuspended (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: `PolkadotXcm::XcmExecutionSuspended` (r:0 w:1) + /// Proof: `PolkadotXcm::XcmExecutionSuspended` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) fn force_suspension() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_035_000 picoseconds. - Weight::from_parts(3_154_000, 0) + // Minimum execution time: 1_889_000 picoseconds. + Weight::from_parts(1_962_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } - /// Storage: PolkadotXcm SupportedVersion (r:4 w:2) - /// Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) + /// Storage: `PolkadotXcm::SupportedVersion` (r:5 w:2) + /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) fn migrate_supported_version() -> Weight { // Proof Size summary in bytes: - // Measured: `95` - // Estimated: `10985` - // Minimum execution time: 14_805_000 picoseconds. - Weight::from_parts(15_120_000, 0) - .saturating_add(Weight::from_parts(0, 10985)) - .saturating_add(T::DbWeight::get().reads(4)) + // Measured: `89` + // Estimated: `13454` + // Minimum execution time: 16_408_000 picoseconds. + Weight::from_parts(16_877_000, 0) + .saturating_add(Weight::from_parts(0, 13454)) + .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) } - /// Storage: PolkadotXcm VersionNotifiers (r:4 w:2) - /// Proof Skipped: PolkadotXcm VersionNotifiers (max_values: None, max_size: None, mode: Measured) + /// Storage: `PolkadotXcm::VersionNotifiers` (r:5 w:2) + /// Proof: `PolkadotXcm::VersionNotifiers` (`max_values`: None, `max_size`: None, mode: `Measured`) fn migrate_version_notifiers() -> Weight { // Proof Size summary in bytes: - // Measured: `99` - // Estimated: `10989` - // Minimum execution time: 14_572_000 picoseconds. - Weight::from_parts(14_909_000, 0) - .saturating_add(Weight::from_parts(0, 10989)) - .saturating_add(T::DbWeight::get().reads(4)) + // Measured: `93` + // Estimated: `13458` + // Minimum execution time: 16_791_000 picoseconds. + Weight::from_parts(17_111_000, 0) + .saturating_add(Weight::from_parts(0, 13458)) + .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) } - /// Storage: PolkadotXcm VersionNotifyTargets (r:5 w:0) - /// Proof Skipped: PolkadotXcm VersionNotifyTargets (max_values: None, max_size: None, mode: Measured) + /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:6 w:0) + /// Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) fn already_notified_target() -> Weight { // Proof Size summary in bytes: // Measured: `106` - // Estimated: `13471` - // Minimum execution time: 15_341_000 picoseconds. - Weight::from_parts(15_708_000, 0) - .saturating_add(Weight::from_parts(0, 13471)) - .saturating_add(T::DbWeight::get().reads(5)) + // Estimated: `15946` + // Minimum execution time: 18_355_000 picoseconds. + Weight::from_parts(19_110_000, 0) + .saturating_add(Weight::from_parts(0, 15946)) + .saturating_add(T::DbWeight::get().reads(6)) } - /// Storage: PolkadotXcm VersionNotifyTargets (r:2 w:1) - /// Proof Skipped: PolkadotXcm VersionNotifyTargets (max_values: None, max_size: None, mode: Measured) - /// Storage: PolkadotXcm SupportedVersion (r:1 w:0) - /// Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) - /// Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) - /// Proof Skipped: PolkadotXcm VersionDiscoveryQueue (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: PolkadotXcm SafeXcmVersion (r:1 w:0) - /// Proof Skipped: PolkadotXcm SafeXcmVersion (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ParachainSystem HostConfiguration (r:1 w:0) - /// Proof Skipped: ParachainSystem HostConfiguration (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ParachainSystem PendingUpwardMessages (r:1 w:1) - /// Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:2 w:1) + /// Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) + /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) + /// Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) + /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) + /// Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) + /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) fn notify_current_targets() -> Weight { // Proof Size summary in bytes: // Measured: `106` // Estimated: `6046` - // Minimum execution time: 27_840_000 picoseconds. - Weight::from_parts(28_248_000, 0) + // Minimum execution time: 23_354_000 picoseconds. + Weight::from_parts(23_999_000, 0) .saturating_add(Weight::from_parts(0, 6046)) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(3)) } - /// Storage: PolkadotXcm VersionNotifyTargets (r:3 w:0) - /// Proof Skipped: PolkadotXcm VersionNotifyTargets (max_values: None, max_size: None, mode: Measured) + /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:4 w:0) + /// Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) fn notify_target_migration_fail() -> Weight { // Proof Size summary in bytes: // Measured: `136` - // Estimated: `8551` - // Minimum execution time: 8_245_000 picoseconds. - Weight::from_parts(8_523_000, 0) - .saturating_add(Weight::from_parts(0, 8551)) - .saturating_add(T::DbWeight::get().reads(3)) + // Estimated: `11026` + // Minimum execution time: 11_065_000 picoseconds. + Weight::from_parts(11_302_000, 0) + .saturating_add(Weight::from_parts(0, 11026)) + .saturating_add(T::DbWeight::get().reads(4)) } - /// Storage: PolkadotXcm VersionNotifyTargets (r:4 w:2) - /// Proof Skipped: PolkadotXcm VersionNotifyTargets (max_values: None, max_size: None, mode: Measured) + /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:5 w:2) + /// Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) fn migrate_version_notify_targets() -> Weight { // Proof Size summary in bytes: - // Measured: `106` - // Estimated: `10996` - // Minimum execution time: 14_780_000 picoseconds. - Weight::from_parts(15_173_000, 0) - .saturating_add(Weight::from_parts(0, 10996)) - .saturating_add(T::DbWeight::get().reads(4)) + // Measured: `100` + // Estimated: `13465` + // Minimum execution time: 16_998_000 picoseconds. + Weight::from_parts(17_509_000, 0) + .saturating_add(Weight::from_parts(0, 13465)) + .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) } - /// Storage: PolkadotXcm VersionNotifyTargets (r:4 w:2) - /// Proof Skipped: PolkadotXcm VersionNotifyTargets (max_values: None, max_size: None, mode: Measured) - /// Storage: PolkadotXcm SupportedVersion (r:1 w:0) - /// Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) - /// Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) - /// Proof Skipped: PolkadotXcm VersionDiscoveryQueue (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: PolkadotXcm SafeXcmVersion (r:1 w:0) - /// Proof Skipped: PolkadotXcm SafeXcmVersion (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ParachainSystem HostConfiguration (r:1 w:0) - /// Proof Skipped: ParachainSystem HostConfiguration (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ParachainSystem PendingUpwardMessages (r:1 w:1) - /// Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:5 w:2) + /// Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) + /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) + /// Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) + /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) + /// Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) + /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) fn migrate_and_notify_old_targets() -> Weight { // Proof Size summary in bytes: - // Measured: `112` - // Estimated: `11002` - // Minimum execution time: 33_422_000 picoseconds. - Weight::from_parts(34_076_000, 0) - .saturating_add(Weight::from_parts(0, 11002)) - .saturating_add(T::DbWeight::get().reads(9)) + // Measured: `106` + // Estimated: `13471` + // Minimum execution time: 31_068_000 picoseconds. + Weight::from_parts(31_978_000, 0) + .saturating_add(Weight::from_parts(0, 13471)) + .saturating_add(T::DbWeight::get().reads(10)) .saturating_add(T::DbWeight::get().writes(4)) } /// Storage: `PolkadotXcm::QueryCounter` (r:1 w:1) @@ -319,11 +341,11 @@ impl pallet_xcm::WeightInfo for WeightInfo { /// Proof: `PolkadotXcm::Queries` (`max_values`: None, `max_size`: None, mode: `Measured`) fn new_query() -> Weight { // Proof Size summary in bytes: - // Measured: `103` - // Estimated: `1588` - // Minimum execution time: 5_496_000 picoseconds. - Weight::from_parts(5_652_000, 0) - .saturating_add(Weight::from_parts(0, 1588)) + // Measured: `32` + // Estimated: `1517` + // Minimum execution time: 3_478_000 picoseconds. + Weight::from_parts(3_595_000, 0) + .saturating_add(Weight::from_parts(0, 1517)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -331,11 +353,23 @@ impl pallet_xcm::WeightInfo for WeightInfo { /// Proof: `PolkadotXcm::Queries` (`max_values`: None, `max_size`: None, mode: `Measured`) fn take_response() -> Weight { // Proof Size summary in bytes: - // Measured: `7740` - // Estimated: `11205` - // Minimum execution time: 26_140_000 picoseconds. - Weight::from_parts(26_824_000, 0) - .saturating_add(Weight::from_parts(0, 11205)) + // Measured: `7669` + // Estimated: `11134` + // Minimum execution time: 24_962_000 picoseconds. + Weight::from_parts(25_404_000, 0) + .saturating_add(Weight::from_parts(0, 11134)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `PolkadotXcm::AssetTraps` (r:1 w:1) + /// Proof: `PolkadotXcm::AssetTraps` (`max_values`: None, `max_size`: None, mode: `Measured`) + fn claim_assets() -> Weight { + // Proof Size summary in bytes: + // Measured: `90` + // Estimated: `3555` + // Minimum execution time: 32_685_000 picoseconds. + Weight::from_parts(33_592_000, 0) + .saturating_add(Weight::from_parts(0, 3555)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } diff --git a/cumulus/parachains/runtimes/people/people-westend/src/xcm_config.rs b/cumulus/parachains/runtimes/people/people-westend/src/xcm_config.rs index baead5234191594906c9b416aade7e67b9bae081..114923270645589b0bb1b0d8d5a7abed4e315a8d 100644 --- a/cumulus/parachains/runtimes/people/people-westend/src/xcm_config.rs +++ b/cumulus/parachains/runtimes/people/people-westend/src/xcm_config.rs @@ -20,31 +20,30 @@ use super::{ use crate::{TransactionByteFee, CENTS}; use frame_support::{ parameter_types, - traits::{ConstU32, Contains, Equals, Everything, Nothing}, + traits::{tokens::imbalance::ResolveTo, ConstU32, Contains, Equals, Everything, Nothing}, }; use frame_system::EnsureRoot; +use pallet_collator_selection::StakingPotAccountId; use pallet_xcm::XcmPassthrough; use parachains_common::{ - impls::ToStakingPot, xcm_config::{ - AllSiblingSystemParachains, ConcreteAssetFromSystem, RelayOrOtherSystemParachains, + AllSiblingSystemParachains, ConcreteAssetFromSystem, ParentRelayOrSiblingParachains, + RelayOrOtherSystemParachains, }, TREASURY_PALLET_ID, }; use polkadot_parachain_primitives::primitives::Sibling; use sp_runtime::traits::AccountIdConversion; use xcm::latest::prelude::*; -#[allow(deprecated)] -use xcm_builder::CurrencyAdapter; use xcm_builder::{ AccountId32Aliases, AllowExplicitUnpaidExecutionFrom, AllowKnownQueryResponses, AllowSubscriptionsFrom, AllowTopLevelPaidExecutionFrom, DenyReserveTransferToRelayChain, - DenyThenTry, DescribeTerminus, EnsureXcmOrigin, FrameTransactionalProcessor, HashedDescription, - IsConcrete, ParentAsSuperuser, ParentIsPreset, RelayChainAsNative, SiblingParachainAsNative, - SiblingParachainConvertsVia, SignedAccountId32AsNative, SignedToAccountId32, - SovereignSignedViaLocation, TakeWeightCredit, TrailingSetTopicAsId, UsingComponents, - WeightInfoBounds, WithComputedOrigin, WithUniqueTopic, XcmFeeManagerFromComponents, - XcmFeeToAccount, + DenyThenTry, DescribeTerminus, EnsureXcmOrigin, FrameTransactionalProcessor, FungibleAdapter, + HashedDescription, IsConcrete, ParentAsSuperuser, ParentIsPreset, RelayChainAsNative, + SiblingParachainAsNative, SiblingParachainConvertsVia, SignedAccountId32AsNative, + SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit, TrailingSetTopicAsId, + UsingComponents, WeightInfoBounds, WithComputedOrigin, WithUniqueTopic, + XcmFeeManagerFromComponents, XcmFeeToAccount, }; use xcm_executor::{traits::WithOriginFilter, XcmExecutor}; @@ -97,8 +96,7 @@ pub type LocationToAccountId = ( ); /// Means for transacting the native currency on this chain. -#[allow(deprecated)] -pub type CurrencyTransactor = CurrencyAdapter< +pub type FungibleTransactor = FungibleAdapter< // Use this currency: Balances, // Use this currency when it is a fungible asset matching the given location or name: @@ -150,13 +148,6 @@ impl Contains for ParentOrParentsPlurality { } } -pub struct ParentOrSiblings; -impl Contains for ParentOrSiblings { - fn contains(location: &Location) -> bool { - matches!(location.unpack(), (1, []) | (1, [Parachain(_)])) - } -} - pub struct FellowsPlurality; impl Contains for FellowsPlurality { fn contains(location: &Location) -> bool { @@ -223,14 +214,14 @@ pub type Barrier = TrailingSetTopicAsId< AllowKnownQueryResponses, WithComputedOrigin< ( - // If the message is one that immediately attemps to pay for execution, then + // If the message is one that immediately attempts to pay for execution, then // allow it. AllowTopLevelPaidExecutionFrom, // Parent, its pluralities (i.e. governance bodies), and the Fellows plurality // get free execution. AllowExplicitUnpaidExecutionFrom<(ParentOrParentsPlurality, FellowsPlurality)>, // Subscriptions for version tracking are OK. - AllowSubscriptionsFrom, + AllowSubscriptionsFrom, ), UniversalLocation, ConstU32<8>, @@ -252,7 +243,7 @@ pub struct XcmConfig; impl xcm_executor::Config for XcmConfig { type RuntimeCall = RuntimeCall; type XcmSender = XcmRouter; - type AssetTransactor = CurrencyTransactor; + type AssetTransactor = FungibleTransactor; type OriginConverter = XcmOriginToTransactDispatchOrigin; // People does not recognize a reserve location for any asset. Users must teleport WND // where allowed (e.g. with the Relay Chain). @@ -266,8 +257,13 @@ impl xcm_executor::Config for XcmConfig { RuntimeCall, MaxInstructions, >; - type Trader = - UsingComponents>; + type Trader = UsingComponents< + WeightToFee, + RelayLocation, + AccountId, + Balances, + ResolveTo, Balances>, + >; type ResponseHandler = PolkadotXcm; type AssetTrap = PolkadotXcm; type AssetClaims = PolkadotXcm; @@ -286,6 +282,9 @@ impl xcm_executor::Config for XcmConfig { type SafeCallFilter = SafeCallFilter; type Aliasers = Nothing; type TransactionalProcessor = FrameTransactionalProcessor; + type HrmpNewChannelOpenRequestHandler = (); + type HrmpChannelAcceptedHandler = (); + type HrmpChannelClosingHandler = (); } /// Converts a local signed origin into an XCM location. Forms the basis for local origins @@ -306,10 +305,9 @@ impl pallet_xcm::Config for Runtime { // We want to disallow users sending (arbitrary) XCMs from this chain. type SendXcmOrigin = EnsureXcmOrigin; type XcmRouter = XcmRouter; - // We support local origins dispatching XCM executions in principle... + // We support local origins dispatching XCM executions. type ExecuteXcmOrigin = EnsureXcmOrigin; - // ... but disallow generic XCM execution. As a result only teleports are allowed. - type XcmExecuteFilter = Nothing; + type XcmExecuteFilter = Everything; type XcmExecutor = XcmExecutor; type XcmTeleportFilter = Everything; type XcmReserveTransferFilter = Nothing; // This parachain is not meant as a reserve location. diff --git a/cumulus/parachains/runtimes/starters/seedling/Cargo.toml b/cumulus/parachains/runtimes/starters/seedling/Cargo.toml index 1f5bee7784e989ab0e6ed76f3692f33d54b6304e..eb702c9f2cdf30844fbf4ea17534566c038c4880 100644 --- a/cumulus/parachains/runtimes/starters/seedling/Cargo.toml +++ b/cumulus/parachains/runtimes/starters/seedling/Cargo.toml @@ -11,7 +11,7 @@ workspace = true [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } # Substrate frame-executive = { path = "../../../../../substrate/frame/executive", default-features = false } @@ -79,5 +79,3 @@ std = [ "sp-version/std", "substrate-wasm-builder", ] - -experimental = ["pallet-aura/experimental"] diff --git a/cumulus/parachains/runtimes/starters/seedling/src/lib.rs b/cumulus/parachains/runtimes/starters/seedling/src/lib.rs index ba077ef887947f6f0f2b639f85c10fcb13a06fcb..461133f6cfc06ad8cea140ea19d6df6c8aebb520 100644 --- a/cumulus/parachains/runtimes/starters/seedling/src/lib.rs +++ b/cumulus/parachains/runtimes/starters/seedling/src/lib.rs @@ -46,7 +46,7 @@ use sp_version::RuntimeVersion; pub use frame_support::{ construct_runtime, derive_impl, dispatch::DispatchClass, - genesis_builder_helper::{build_config, create_default_config}, + genesis_builder_helper::{build_state, get_preset}, parameter_types, traits::{ConstBool, ConstU32, ConstU64, ConstU8, EitherOfDiverse, IsInVec, Randomness}, weights::{ @@ -135,7 +135,7 @@ parameter_types! { pub const SS58Prefix: u8 = 42; } -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Runtime { /// The identifier used to distinguish between accounts. type AccountId = AccountId; @@ -213,17 +213,13 @@ impl pallet_aura::Config for Runtime { type DisabledValidators = (); type MaxAuthorities = ConstU32<100_000>; type AllowMultipleBlocksPerSlot = ConstBool; - #[cfg(feature = "experimental")] type SlotDuration = pallet_aura::MinimumPeriodTimesTwo; } impl pallet_timestamp::Config for Runtime { type Moment = u64; type OnTimestampSet = Aura; - #[cfg(feature = "experimental")] type MinimumPeriod = ConstU64<0>; - #[cfg(not(feature = "experimental"))] - type MinimumPeriod = ConstU64<{ parachains_common::SLOT_DURATION / 2 }>; type WeightInfo = (); } @@ -287,7 +283,7 @@ impl_runtime_apis! { } fn authorities() -> Vec { - Aura::authorities().into_inner() + pallet_aura::Authorities::::get().into_inner() } } @@ -300,7 +296,7 @@ impl_runtime_apis! { Executive::execute_block(block) } - fn initialize_block(header: &::Header) { + fn initialize_block(header: &::Header) -> sp_runtime::ExtrinsicInclusionMode { Executive::initialize_block(header) } } @@ -374,12 +370,16 @@ impl_runtime_apis! { } impl sp_genesis_builder::GenesisBuilder for Runtime { - fn create_default_config() -> Vec { - create_default_config::() + fn build_state(config: Vec) -> sp_genesis_builder::Result { + build_state::(config) } - fn build_config(config: Vec) -> sp_genesis_builder::Result { - build_config::(config) + fn get_preset(id: &Option) -> Option> { + get_preset::(id, |_| None) + } + + fn preset_names() -> Vec { + vec![] } } } diff --git a/cumulus/parachains/runtimes/starters/shell/Cargo.toml b/cumulus/parachains/runtimes/starters/shell/Cargo.toml index 5a8f2a9d125369c91b9859186866cc62edc1795e..f66d04fec1fdd72eb30f183bb713e88d4fee00e7 100644 --- a/cumulus/parachains/runtimes/starters/shell/Cargo.toml +++ b/cumulus/parachains/runtimes/starters/shell/Cargo.toml @@ -11,7 +11,7 @@ workspace = true [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } # Substrate frame-executive = { path = "../../../../../substrate/frame/executive", default-features = false } @@ -99,5 +99,3 @@ try-runtime = [ "parachain-info/try-runtime", "sp-runtime/try-runtime", ] - -experimental = ["pallet-aura/experimental"] diff --git a/cumulus/parachains/runtimes/starters/shell/src/lib.rs b/cumulus/parachains/runtimes/starters/shell/src/lib.rs index 457394760d989db4dcd5ba335e1ff2dad46eaaba..a3d1629bbe5eb928f3f78998ed721968f140536d 100644 --- a/cumulus/parachains/runtimes/starters/shell/src/lib.rs +++ b/cumulus/parachains/runtimes/starters/shell/src/lib.rs @@ -54,7 +54,7 @@ use sp_version::RuntimeVersion; pub use frame_support::{ construct_runtime, derive_impl, dispatch::DispatchClass, - genesis_builder_helper::{build_config, create_default_config}, + genesis_builder_helper::{build_state, get_preset}, parameter_types, traits::{ConstBool, ConstU32, ConstU64, ConstU8, EitherOfDiverse, IsInVec, Randomness}, weights::{ @@ -143,7 +143,7 @@ parameter_types! { pub const SS58Prefix: u8 = 42; } -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Runtime { /// The identifier used to distinguish between accounts. type AccountId = AccountId; @@ -232,6 +232,7 @@ impl pallet_message_queue::Config for Runtime { type HeapSize = sp_core::ConstU32<{ 64 * 1024 }>; type MaxStale = sp_core::ConstU32<8>; type ServiceWeight = MessageQueueServiceWeight; + type IdleMaxServiceWeight = MessageQueueServiceWeight; } impl cumulus_pallet_aura_ext::Config for Runtime {} @@ -241,17 +242,13 @@ impl pallet_aura::Config for Runtime { type DisabledValidators = (); type MaxAuthorities = ConstU32<100_000>; type AllowMultipleBlocksPerSlot = ConstBool; - #[cfg(feature = "experimental")] type SlotDuration = pallet_aura::MinimumPeriodTimesTwo; } impl pallet_timestamp::Config for Runtime { type Moment = u64; type OnTimestampSet = Aura; - #[cfg(feature = "experimental")] type MinimumPeriod = ConstU64<0>; - #[cfg(not(feature = "experimental"))] - type MinimumPeriod = ConstU64<{ parachains_common::SLOT_DURATION / 2 }>; type WeightInfo = (); } @@ -344,7 +341,7 @@ impl_runtime_apis! { } fn authorities() -> Vec { - Aura::authorities().into_inner() + pallet_aura::Authorities::::get().into_inner() } } @@ -357,7 +354,7 @@ impl_runtime_apis! { Executive::execute_block(block) } - fn initialize_block(header: &::Header) { + fn initialize_block(header: &::Header) -> sp_runtime::ExtrinsicInclusionMode { Executive::initialize_block(header) } } @@ -431,12 +428,16 @@ impl_runtime_apis! { } impl sp_genesis_builder::GenesisBuilder for Runtime { - fn create_default_config() -> Vec { - create_default_config::() + fn build_state(config: Vec) -> sp_genesis_builder::Result { + build_state::(config) } - fn build_config(config: Vec) -> sp_genesis_builder::Result { - build_config::(config) + fn get_preset(id: &Option) -> Option> { + get_preset::(id, |_| None) + } + + fn preset_names() -> Vec { + vec![] } } } diff --git a/cumulus/parachains/runtimes/starters/shell/src/xcm_config.rs b/cumulus/parachains/runtimes/starters/shell/src/xcm_config.rs index f6af50f76d85bd06ca77fa6e6f8b06e41349dc3a..df89158729cd9935911df3a1bff76557c6d5c900 100644 --- a/cumulus/parachains/runtimes/starters/shell/src/xcm_config.rs +++ b/cumulus/parachains/runtimes/starters/shell/src/xcm_config.rs @@ -88,6 +88,9 @@ impl xcm_executor::Config for XcmConfig { type SafeCallFilter = Everything; type Aliasers = Nothing; type TransactionalProcessor = (); + type HrmpNewChannelOpenRequestHandler = (); + type HrmpChannelAcceptedHandler = (); + type HrmpChannelClosingHandler = (); } impl cumulus_pallet_xcm::Config for Runtime { diff --git a/cumulus/parachains/runtimes/test-utils/Cargo.toml b/cumulus/parachains/runtimes/test-utils/Cargo.toml index a61e05de13fa6dff6e54f583a00683d4a270e429..eda88beb7dabb41bd4075ec5ab6bf8ec2f42d3c8 100644 --- a/cumulus/parachains/runtimes/test-utils/Cargo.toml +++ b/cumulus/parachains/runtimes/test-utils/Cargo.toml @@ -17,6 +17,7 @@ frame-support = { path = "../../../../substrate/frame/support", default-features frame-system = { path = "../../../../substrate/frame/system", default-features = false } pallet-balances = { path = "../../../../substrate/frame/balances", default-features = false } pallet-session = { path = "../../../../substrate/frame/session", default-features = false } +pallet-timestamp = { path = "../../../../substrate/frame/timestamp", default-features = false } sp-consensus-aura = { path = "../../../../substrate/primitives/consensus/aura", default-features = false } sp-io = { path = "../../../../substrate/primitives/io", default-features = false } sp-runtime = { path = "../../../../substrate/primitives/runtime", default-features = false } @@ -59,6 +60,7 @@ std = [ "pallet-balances/std", "pallet-collator-selection/std", "pallet-session/std", + "pallet-timestamp/std", "pallet-xcm/std", "parachain-info/std", "polkadot-parachain-primitives/std", diff --git a/cumulus/parachains/runtimes/test-utils/src/lib.rs b/cumulus/parachains/runtimes/test-utils/src/lib.rs index b4eb57fcb66f412cd697cfd4d6efd1f551ef7eb6..3c84243306fbe518dd00ee78411d9ec032e90446 100644 --- a/cumulus/parachains/runtimes/test-utils/src/lib.rs +++ b/cumulus/parachains/runtimes/test-utils/src/lib.rs @@ -34,7 +34,7 @@ use polkadot_parachain_primitives::primitives::{ }; use sp_consensus_aura::{SlotDuration, AURA_ENGINE_ID}; use sp_core::{Encode, U256}; -use sp_runtime::{traits::Header, BuildStorage, Digest, DigestItem}; +use sp_runtime::{traits::Header, BuildStorage, Digest, DigestItem, SaturatedConversion}; use xcm::{ latest::{Asset, Location, XcmContext, XcmHash}, prelude::*, @@ -129,6 +129,7 @@ pub trait BasicParachainRuntime: + parachain_info::Config + pallet_collator_selection::Config + cumulus_pallet_parachain_system::Config + + pallet_timestamp::Config { } @@ -140,7 +141,8 @@ where + pallet_xcm::Config + parachain_info::Config + pallet_collator_selection::Config - + cumulus_pallet_parachain_system::Config, + + cumulus_pallet_parachain_system::Config + + pallet_timestamp::Config, ValidatorIdOf: From>, { } @@ -259,8 +261,10 @@ pub struct RuntimeHelper( ); /// Utility function that advances the chain to the desired block number. /// If an author is provided, that author information is injected to all the blocks in the meantime. -impl - RuntimeHelper +impl< + Runtime: frame_system::Config + cumulus_pallet_parachain_system::Config + pallet_timestamp::Config, + AllPalletsWithoutSystem, + > RuntimeHelper where AccountIdOf: Into<<::RuntimeOrigin as OriginTrait>::AccountId>, @@ -296,6 +300,65 @@ where last_header.expect("run_to_block empty block range") } + pub fn run_to_block_with_finalize(n: u32) -> HeaderFor { + let mut last_header = None; + loop { + let block_number = frame_system::Pallet::::block_number(); + if block_number >= n.into() { + break + } + // Set the new block number and author + let header = frame_system::Pallet::::finalize(); + + let pre_digest = Digest { + logs: vec![DigestItem::PreRuntime(AURA_ENGINE_ID, block_number.encode())], + }; + frame_system::Pallet::::reset_events(); + + let next_block_number = block_number + 1u32.into(); + frame_system::Pallet::::initialize( + &next_block_number, + &header.hash(), + &pre_digest, + ); + AllPalletsWithoutSystem::on_initialize(next_block_number); + + let parent_head = HeadData(header.encode()); + let sproof_builder = RelayStateSproofBuilder { + para_id: ::SelfParaId::get(), + included_para_head: parent_head.clone().into(), + ..Default::default() + }; + + let (relay_parent_storage_root, relay_chain_state) = + sproof_builder.into_state_root_and_proof(); + let inherent_data = ParachainInherentData { + validation_data: PersistedValidationData { + parent_head, + relay_parent_number: (block_number.saturated_into::() * 2 + 1).into(), + relay_parent_storage_root, + max_pov_size: 100_000_000, + }, + relay_chain_state, + downward_messages: Default::default(), + horizontal_messages: Default::default(), + }; + + let _ = cumulus_pallet_parachain_system::Pallet::::set_validation_data( + Runtime::RuntimeOrigin::none(), + inherent_data, + ); + let _ = pallet_timestamp::Pallet::::set( + Runtime::RuntimeOrigin::none(), + 300_u32.into(), + ); + AllPalletsWithoutSystem::on_finalize(next_block_number); + let header = frame_system::Pallet::::finalize(); + last_header = Some(header); + } + last_header.expect("run_to_block empty block range") + } + pub fn root_origin() -> ::RuntimeOrigin { ::RuntimeOrigin::root() } @@ -362,12 +425,13 @@ impl< } // do teleport - >::teleport_assets( + >::limited_teleport_assets( origin, Box::new(dest.into()), Box::new(beneficiary.into()), Box::new((AssetId(asset), amount).into()), 0, + Unlimited, ) } } diff --git a/cumulus/parachains/runtimes/test-utils/src/test_cases.rs b/cumulus/parachains/runtimes/test-utils/src/test_cases.rs index f78bf9877ec2443a9ce3d754a533f3ee6a3cf14a..1c58df189b673af60bc3e4a9ae7391294287e2aa 100644 --- a/cumulus/parachains/runtimes/test-utils/src/test_cases.rs +++ b/cumulus/parachains/runtimes/test-utils/src/test_cases.rs @@ -37,7 +37,8 @@ pub fn change_storage_constant_by_governance_works: From>, StorageConstant: Get, StorageConstantType: Encode + PartialEq + std::fmt::Debug, @@ -107,7 +108,8 @@ pub fn set_storage_keys_by_governance_works( + pallet_xcm::Config + parachain_info::Config + pallet_collator_selection::Config - + cumulus_pallet_parachain_system::Config, + + cumulus_pallet_parachain_system::Config + + pallet_timestamp::Config, ValidatorIdOf: From>, { let mut runtime = ExtBuilder::::default() diff --git a/cumulus/parachains/runtimes/testing/penpal/Cargo.toml b/cumulus/parachains/runtimes/testing/penpal/Cargo.toml index dab687c527786366ff1901156c0aec58879ccaf4..028aa002a91e508c858c7ba71c981d9c9cf8dc60 100644 --- a/cumulus/parachains/runtimes/testing/penpal/Cargo.toml +++ b/cumulus/parachains/runtimes/testing/penpal/Cargo.toml @@ -20,8 +20,8 @@ substrate-wasm-builder = { path = "../../../../../substrate/utils/wasm-builder", [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } hex-literal = { version = "0.4.1", optional = true } -log = { version = "0.4.20", default-features = false } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +log = { workspace = true } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } smallvec = "1.11.0" # Substrate @@ -77,7 +77,6 @@ cumulus-primitives-utility = { path = "../../../../primitives/utility", default- pallet-collator-selection = { path = "../../../../pallets/collator-selection", default-features = false } parachain-info = { package = "staging-parachain-info", path = "../../../pallets/parachain-info", default-features = false } parachains-common = { path = "../../../common", default-features = false } -testnet-parachains-constants = { path = "../../constants", default-features = false, features = ["rococo"] } assets-common = { path = "../../assets/common", default-features = false } [features] @@ -133,7 +132,6 @@ std = [ "sp-transaction-pool/std", "sp-version/std", "substrate-wasm-builder", - "testnet-parachains-constants/std", "xcm-builder/std", "xcm-executor/std", "xcm/std", @@ -193,5 +191,3 @@ try-runtime = [ "polkadot-runtime-common/try-runtime", "sp-runtime/try-runtime", ] - -experimental = ["pallet-aura/experimental"] diff --git a/cumulus/parachains/runtimes/testing/penpal/src/lib.rs b/cumulus/parachains/runtimes/testing/penpal/src/lib.rs index a13a4135ac1a96e46f3e750e50c249c3b20a3eb6..227c47cf71081709986d294e65efd7be6d994177 100644 --- a/cumulus/parachains/runtimes/testing/penpal/src/lib.rs +++ b/cumulus/parachains/runtimes/testing/penpal/src/lib.rs @@ -37,7 +37,7 @@ use cumulus_primitives_core::{AggregateMessageOrigin, ParaId}; use frame_support::{ construct_runtime, derive_impl, dispatch::DispatchClass, - genesis_builder_helper::{build_config, create_default_config}, + genesis_builder_helper::{build_state, get_preset}, pallet_prelude::Weight, parameter_types, traits::{ @@ -53,8 +53,10 @@ use frame_system::{ limits::{BlockLength, BlockWeights}, EnsureRoot, EnsureSigned, }; -use parachains_common::message_queue::{NarrowOriginToSibling, ParaIdToSibling}; -use polkadot_runtime_common::xcm_sender::NoPriceForMessageDelivery; +use parachains_common::{ + impls::{AssetsToBlockAuthor, NonZeroIssuance}, + message_queue::{NarrowOriginToSibling, ParaIdToSibling}, +}; use smallvec::smallvec; use sp_api::impl_runtime_apis; pub use sp_consensus_aura::sr25519::AuthorityId as AuraId; @@ -70,7 +72,7 @@ use sp_std::prelude::*; #[cfg(feature = "std")] use sp_version::NativeVersion; use sp_version::RuntimeVersion; -use xcm_config::{AssetsToBlockAuthor, XcmOriginToTransactDispatchOrigin}; +use xcm_config::XcmOriginToTransactDispatchOrigin; #[cfg(any(feature = "std", test))] pub use sp_runtime::BuildStorage; @@ -82,7 +84,7 @@ use weights::{BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight}; // XCM Imports use parachains_common::{AccountId, Signature}; -use xcm::latest::prelude::BodyId; +use xcm::latest::prelude::{AssetId as AssetLocationId, BodyId}; /// Balance of an account. pub type Balance = u128; @@ -323,7 +325,7 @@ parameter_types! { // Configure FRAME pallets to include in runtime. -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Runtime { /// The identifier used to distinguish between accounts. type AccountId = AccountId; @@ -414,7 +416,7 @@ parameter_types! { impl pallet_transaction_payment::Config for Runtime { type RuntimeEvent = RuntimeEvent; - type OnChargeTransaction = pallet_transaction_payment::CurrencyAdapter; + type OnChargeTransaction = pallet_transaction_payment::FungibleAdapter; type WeightToFee = WeightToFee; type LengthToFee = ConstantMultiplier; type FeeMultiplierUpdate = SlowAdjustingFeeUpdate; @@ -538,10 +540,25 @@ impl pallet_message_queue::Config for Runtime { type HeapSize = sp_core::ConstU32<{ 64 * 1024 }>; type MaxStale = sp_core::ConstU32<8>; type ServiceWeight = MessageQueueServiceWeight; + type IdleMaxServiceWeight = MessageQueueServiceWeight; } impl cumulus_pallet_aura_ext::Config for Runtime {} +parameter_types! { + /// The asset ID for the asset that we use to pay for message delivery fees. + pub FeeAssetId: AssetLocationId = AssetLocationId(xcm_config::RelayLocation::get()); + /// The base fee for the message delivery fees (3 CENTS). + pub const BaseDeliveryFee: u128 = (1_000_000_000_000u128 / 100).saturating_mul(3); +} + +pub type PriceForSiblingParachainDelivery = polkadot_runtime_common::xcm_sender::ExponentialPrice< + FeeAssetId, + BaseDeliveryFee, + TransactionByteFee, + XcmpQueue, +>; + impl cumulus_pallet_xcmp_queue::Config for Runtime { type RuntimeEvent = RuntimeEvent; type ChannelInfo = ParachainSystem; @@ -552,7 +569,7 @@ impl cumulus_pallet_xcmp_queue::Config for Runtime { type ControllerOrigin = EnsureRoot; type ControllerOriginConverter = XcmOriginToTransactDispatchOrigin; type WeightInfo = (); - type PriceForSiblingDelivery = NoPriceForMessageDelivery; + type PriceForSiblingDelivery = PriceForSiblingParachainDelivery; } parameter_types! { @@ -579,7 +596,6 @@ impl pallet_aura::Config for Runtime { type DisabledValidators = (); type MaxAuthorities = ConstU32<100_000>; type AllowMultipleBlocksPerSlot = ConstBool; - #[cfg(feature = "experimental")] type SlotDuration = pallet_aura::MinimumPeriodTimesTwo; } @@ -618,7 +634,7 @@ impl pallet_asset_tx_payment::Config for Runtime { ConvertInto, pallet_assets::Instance1, >, - AssetsToBlockAuthor, + AssetsToBlockAuthor, >; } @@ -686,7 +702,7 @@ impl_runtime_apis! { } fn authorities() -> Vec { - Aura::authorities().into_inner() + pallet_aura::Authorities::::get().into_inner() } } @@ -699,7 +715,7 @@ impl_runtime_apis! { Executive::execute_block(block) } - fn initialize_block(header: &::Header) { + fn initialize_block(header: &::Header) -> sp_runtime::ExtrinsicInclusionMode { Executive::initialize_block(header) } } @@ -894,12 +910,16 @@ impl_runtime_apis! { } impl sp_genesis_builder::GenesisBuilder for Runtime { - fn create_default_config() -> Vec { - create_default_config::() + fn build_state(config: Vec) -> sp_genesis_builder::Result { + build_state::(config) + } + + fn get_preset(id: &Option) -> Option> { + get_preset::(id, |_| None) } - fn build_config(config: Vec) -> sp_genesis_builder::Result { - build_config::(config) + fn preset_names() -> Vec { + vec![] } } } diff --git a/cumulus/parachains/runtimes/testing/penpal/src/xcm_config.rs b/cumulus/parachains/runtimes/testing/penpal/src/xcm_config.rs index 3fad47576fd6cc5a735e4f4be7546a1d8ce73872..c12372abbe90f273f46f25863ccf08353d64e125 100644 --- a/cumulus/parachains/runtimes/testing/penpal/src/xcm_config.rs +++ b/cumulus/parachains/runtimes/testing/penpal/src/xcm_config.rs @@ -23,46 +23,45 @@ //! `ReserveAssetTransferDeposited` message but that will but the intension will be to support this //! soon. use super::{ - AccountId, AllPalletsWithSystem, AssetId as AssetIdPalletAssets, Assets, Balance, Balances, - ForeignAssets, ParachainInfo, ParachainSystem, PolkadotXcm, Runtime, RuntimeCall, RuntimeEvent, - RuntimeOrigin, WeightToFee, XcmpQueue, + AccountId, AllPalletsWithSystem, AssetId as AssetIdPalletAssets, Assets, Authorship, Balance, + Balances, ForeignAssets, ForeignAssetsInstance, NonZeroIssuance, ParachainInfo, + ParachainSystem, PolkadotXcm, Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, WeightToFee, + XcmpQueue, }; +use crate::{BaseDeliveryFee, FeeAssetId, TransactionByteFee}; use core::marker::PhantomData; use frame_support::{ parameter_types, - traits::{ - fungibles::{self, Balanced, Credit}, - ConstU32, Contains, ContainsPair, Everything, Get, Nothing, - }, + traits::{ConstU32, Contains, ContainsPair, Everything, EverythingBut, Get, Nothing}, weights::Weight, }; use frame_system::EnsureRoot; -use pallet_asset_tx_payment::HandleCredit; -use pallet_assets::Instance1; use pallet_xcm::XcmPassthrough; +use parachains_common::{xcm_config::AssetFeeAsExistentialDepositMultiplier, TREASURY_PALLET_ID}; use polkadot_parachain_primitives::primitives::Sibling; -use polkadot_runtime_common::impls::ToAuthor; -use sp_runtime::traits::Zero; -use testnet_parachains_constants::rococo::snowbridge::EthereumNetwork; +use polkadot_runtime_common::{impls::ToAuthor, xcm_sender::ExponentialPrice}; +use sp_runtime::traits::{AccountIdConversion, ConvertInto}; use xcm::latest::prelude::*; -#[allow(deprecated)] use xcm_builder::{ - AccountId32Aliases, AllowExplicitUnpaidExecutionFrom, AllowKnownQueryResponses, - AllowSubscriptionsFrom, AllowTopLevelPaidExecutionFrom, AsPrefixedGeneralIndex, - ConvertedConcreteId, CurrencyAdapter, EnsureXcmOrigin, FixedWeightBounds, - FrameTransactionalProcessor, FungiblesAdapter, IsConcrete, LocalMint, NativeAsset, NoChecking, - ParentAsSuperuser, ParentIsPreset, RelayChainAsNative, SiblingParachainAsNative, - SiblingParachainConvertsVia, SignedAccountId32AsNative, SignedToAccountId32, - SovereignSignedViaLocation, StartsWith, TakeWeightCredit, TrailingSetTopicAsId, - UsingComponents, WithComputedOrigin, WithUniqueTopic, + AccountId32Aliases, AllowKnownQueryResponses, AllowSubscriptionsFrom, + AllowTopLevelPaidExecutionFrom, AsPrefixedGeneralIndex, ConvertedConcreteId, EnsureXcmOrigin, + FixedWeightBounds, FrameTransactionalProcessor, FungibleAdapter, FungiblesAdapter, IsConcrete, + LocalMint, NativeAsset, NoChecking, ParentAsSuperuser, ParentIsPreset, RelayChainAsNative, + SiblingParachainAsNative, SiblingParachainConvertsVia, SignedAccountId32AsNative, + SignedToAccountId32, SovereignSignedViaLocation, StartsWith, TakeWeightCredit, + TrailingSetTopicAsId, UsingComponents, WithComputedOrigin, WithUniqueTopic, + XcmFeeManagerFromComponents, XcmFeeToAccount, }; use xcm_executor::{traits::JustTry, XcmExecutor}; parameter_types! { pub const RelayLocation: Location = Location::parent(); + // Local native currency which is stored in `pallet_balances`` + pub const PenpalNativeCurrency: Location = Location::here(); pub const RelayNetwork: Option = None; pub RelayChainOrigin: RuntimeOrigin = cumulus_pallet_xcm::Origin::Relay.into(); pub UniversalLocation: InteriorLocation = [Parachain(ParachainInfo::parachain_id().into())].into(); + pub TreasuryAccount: AccountId = TREASURY_PALLET_ID.into_account_truncating(); } /// Type for specifying how a `Location` can be converted into an `AccountId`. This is used @@ -78,12 +77,11 @@ pub type LocationToAccountId = ( ); /// Means for transacting assets on this chain. -#[allow(deprecated)] -pub type CurrencyTransactor = CurrencyAdapter< +pub type CurrencyTransactor = FungibleAdapter< // Use this currency: Balances, // Use this currency when it is a fungible asset matching the given location or name: - IsConcrete, + IsConcrete, // Do a simple punn to convert an AccountId32 Location into a native chain account ID: LocationToAccountId, // Our chain's account ID type (we can't get away without mentioning it explicitly): @@ -126,9 +124,16 @@ pub type FungiblesTransactor = FungiblesAdapter< CheckingAccount, >; -/// `AssetId/Balance` converter for `TrustBackedAssets` -pub type ForeignAssetsConvertedConcreteId = - assets_common::ForeignAssetsConvertedConcreteId, Balance>; +pub type ForeignAssetsConvertedConcreteId = assets_common::LocationConvertedConcreteId< + EverythingBut<( + // Here we rely on fact that something like this works: + // assert!(Location::new(1, + // [Parachain(100)]).starts_with(&Location::parent())); + // assert!([Parachain(100)].into().starts_with(&Here)); + StartsWith, + )>, + Balance, +>; /// Means for transacting foreign assets from different global consensus. pub type ForeignFungiblesTransactor = FungiblesAdapter< @@ -136,11 +141,11 @@ pub type ForeignFungiblesTransactor = FungiblesAdapter< ForeignAssets, // Use this currency when it is a fungible asset matching the given location or name: ForeignAssetsConvertedConcreteId, - // Convert an XCM MultiLocation into a local account id: + // Convert an XCM Location into a local account id: LocationToAccountId, // Our chain's account ID type (we can't get away without mentioning it explicitly): AccountId, - // We dont need to check teleports here. + // We don't need to check teleports here. NoChecking, // The account to use for tracking teleports. CheckingAccount, @@ -178,6 +183,7 @@ parameter_types! { pub UnitWeightCost: Weight = Weight::from_parts(1_000_000_000, 64 * 1024); pub const MaxInstructions: u32 = 100; pub const MaxAssetsIntoHolding: u32 = 64; + pub XcmAssetFeesReceiver: Option = Authorship::author(); } pub struct ParentOrParentsExecutivePlurality; @@ -187,13 +193,6 @@ impl Contains for ParentOrParentsExecutivePlurality { } } -pub struct CommonGoodAssetsParachain; -impl Contains for CommonGoodAssetsParachain { - fn contains(location: &Location) -> bool { - matches!(location.unpack(), (1, [Parachain(1000)])) - } -} - pub type Barrier = TrailingSetTopicAsId<( TakeWeightCredit, // Expected responses are OK. @@ -204,12 +203,6 @@ pub type Barrier = TrailingSetTopicAsId<( // If the message is one that immediately attempts to pay for execution, then // allow it. AllowTopLevelPaidExecutionFrom, - // System Assets parachain, parent and its exec plurality get free - // execution - AllowExplicitUnpaidExecutionFrom<( - CommonGoodAssetsParachain, - ParentOrParentsExecutivePlurality, - )>, // Subscriptions for version tracking are OK. AllowSubscriptionsFrom, ), @@ -249,55 +242,38 @@ impl> ContainsPair for NativeAssetFrom { } } -/// Allow checking in assets that have issuance > 0. -pub struct NonZeroIssuance(PhantomData<(AccountId, Assets)>); -impl Contains<>::AssetId> - for NonZeroIssuance -where - Assets: fungibles::Inspect, -{ - fn contains(id: &>::AssetId) -> bool { - !Assets::total_issuance(id.clone()).is_zero() - } -} - -/// A `HandleCredit` implementation that naively transfers the fees to the block author. -/// Will drop and burn the assets in case the transfer fails. -pub struct AssetsToBlockAuthor(PhantomData); -impl HandleCredit, pallet_assets::Pallet> for AssetsToBlockAuthor -where - R: pallet_authorship::Config + pallet_assets::Config, - AccountIdOf: From + Into, -{ - fn handle_credit(credit: Credit, pallet_assets::Pallet>) { - if let Some(author) = pallet_authorship::Pallet::::author() { - // In case of error: Will drop the result triggering the `OnDrop` of the imbalance. - let _ = pallet_assets::Pallet::::resolve(&author, credit); - } - } -} - +// This asset can be added to AH as Asset and reserved transfer between Penpal and AH +pub const RESERVABLE_ASSET_ID: u32 = 1; // This asset can be added to AH as ForeignAsset and teleported between Penpal and AH pub const TELEPORTABLE_ASSET_ID: u32 = 2; + +pub const ASSETS_PALLET_ID: u8 = 50; +pub const ASSET_HUB_ID: u32 = 1000; + parameter_types! { /// The location that this chain recognizes as the Relay network's Asset Hub. - pub SystemAssetHubLocation: Location = Location::new(1, [Parachain(1000)]); - // ALWAYS ensure that the index in PalletInstance stays up-to-date with + pub SystemAssetHubLocation: Location = Location::new(1, [Parachain(ASSET_HUB_ID)]); // the Relay Chain's Asset Hub's Assets pallet index pub SystemAssetHubAssetsPalletLocation: Location = - Location::new(1, [Parachain(1000), PalletInstance(50)]); + Location::new(1, [Parachain(ASSET_HUB_ID), PalletInstance(ASSETS_PALLET_ID)]); pub AssetsPalletLocation: Location = - Location::new(0, [PalletInstance(50)]); + Location::new(0, [PalletInstance(ASSETS_PALLET_ID)]); pub CheckingAccount: AccountId = PolkadotXcm::check_account(); pub LocalTeleportableToAssetHub: Location = Location::new( 0, - [PalletInstance(50), GeneralIndex(TELEPORTABLE_ASSET_ID.into())] + [PalletInstance(ASSETS_PALLET_ID), GeneralIndex(TELEPORTABLE_ASSET_ID.into())] ); - pub LocalTeleportableToAssetHubV3: xcm::v3::Location = xcm::v3::Location::new( - 0, - [xcm::v3::Junction::PalletInstance(50), xcm::v3::Junction::GeneralIndex(TELEPORTABLE_ASSET_ID.into())] + pub LocalReservableFromAssetHub: Location = Location::new( + 1, + [Parachain(ASSET_HUB_ID), PalletInstance(ASSETS_PALLET_ID), GeneralIndex(RESERVABLE_ASSET_ID.into())] ); - pub EthereumLocation: Location = Location::new(2, [GlobalConsensus(EthereumNetwork::get())]); + + /// The Penpal runtime is utilized for testing with various environment setups. + /// This storage item provides the opportunity to customize testing scenarios + /// by configuring the trusted asset from the `SystemAssetHub`. + /// + /// By default, it is configured as a `SystemAssetHubLocation` and can be modified using `System::set_storage`. + pub storage CustomizableAssetFromSystemAssetHub: Location = SystemAssetHubLocation::get(); } /// Accepts asset with ID `AssetLocation` and is coming from `Origin` chain. @@ -312,11 +288,11 @@ impl, Origin: Get> ContainsPair, NativeAssetFrom, - AssetPrefixFrom, + AssetPrefixFrom, ); pub type TrustedTeleporters = (AssetFromChain,); @@ -328,14 +304,28 @@ impl xcm_executor::Config for XcmConfig { // How to withdraw and deposit an asset. type AssetTransactor = AssetTransactors; type OriginConverter = XcmOriginToTransactDispatchOrigin; - type IsReserve = Reserves; + type IsReserve = TrustedReserves; // no teleport trust established with other chains type IsTeleporter = TrustedTeleporters; type UniversalLocation = UniversalLocation; type Barrier = Barrier; type Weigher = FixedWeightBounds; - type Trader = - UsingComponents>; + type Trader = ( + UsingComponents>, + // This trader allows to pay with `is_sufficient=true` "Foreign" assets from dedicated + // `pallet_assets` instance - `ForeignAssets`. + cumulus_primitives_utility::TakeFirstAssetTrader< + AccountId, + ForeignAssetFeeAsExistentialDepositMultiplierFeeCharger, + ForeignAssetsConvertedConcreteId, + ForeignAssets, + cumulus_primitives_utility::XcmFeesTo32ByteAccount< + ForeignFungiblesTransactor, + AccountId, + XcmAssetFeesReceiver, + >, + >, + ); type ResponseHandler = PolkadotXcm; type AssetTrap = PolkadotXcm; type AssetClaims = PolkadotXcm; @@ -344,23 +334,41 @@ impl xcm_executor::Config for XcmConfig { type MaxAssetsIntoHolding = MaxAssetsIntoHolding; type AssetLocker = (); type AssetExchanger = (); - type FeeManager = (); + type FeeManager = XcmFeeManagerFromComponents< + (), + XcmFeeToAccount, + >; type MessageExporter = (); type UniversalAliases = Nothing; type CallDispatcher = RuntimeCall; type SafeCallFilter = Everything; type Aliasers = Nothing; type TransactionalProcessor = FrameTransactionalProcessor; + type HrmpNewChannelOpenRequestHandler = (); + type HrmpChannelAcceptedHandler = (); + type HrmpChannelClosingHandler = (); } +/// Multiplier used for dedicated `TakeFirstAssetTrader` with `ForeignAssets` instance. +pub type ForeignAssetFeeAsExistentialDepositMultiplierFeeCharger = + AssetFeeAsExistentialDepositMultiplier< + Runtime, + WeightToFee, + pallet_assets::BalanceToAssetBalance, + ForeignAssetsInstance, + >; + /// No local origins on this chain are allowed to dispatch XCM sends/executions. pub type LocalOriginToLocation = SignedToAccountId32; +pub type PriceForParentDelivery = + ExponentialPrice; + /// The means for routing XCM messages which are not for local execution into the right message /// queues. pub type XcmRouter = WithUniqueTopic<( // Two routers - use UMP to communicate with the relay chain: - cumulus_primitives_utility::ParentAsUmp, + cumulus_primitives_utility::ParentAsUmp, // ..and XCMP to communicate with the sibling chains. XcmpQueue, )>; @@ -370,9 +378,7 @@ impl pallet_xcm::Config for Runtime { type SendXcmOrigin = EnsureXcmOrigin; type XcmRouter = XcmRouter; type ExecuteXcmOrigin = EnsureXcmOrigin; - type XcmExecuteFilter = Nothing; - // ^ Disable dispatchable execute on the XCM pallet. - // Needs to be `Everything` for local testing. + type XcmExecuteFilter = Everything; type XcmExecutor = XcmExecutor; type XcmTeleportFilter = Everything; type XcmReserveTransferFilter = Everything; diff --git a/cumulus/parachains/runtimes/testing/rococo-parachain/Cargo.toml b/cumulus/parachains/runtimes/testing/rococo-parachain/Cargo.toml index 42169e8949f553e1920508e92a059e5b76818099..df3aaa92c79e78e5dfb9043db69778db051b3053 100644 --- a/cumulus/parachains/runtimes/testing/rococo-parachain/Cargo.toml +++ b/cumulus/parachains/runtimes/testing/rococo-parachain/Cargo.toml @@ -11,7 +11,7 @@ workspace = true [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } # Substrate frame-benchmarking = { path = "../../../../../substrate/frame/benchmarking", default-features = false, optional = true } @@ -56,6 +56,7 @@ cumulus-pallet-xcmp-queue = { path = "../../../../pallets/xcmp-queue", default-f cumulus-ping = { path = "../../../pallets/ping", default-features = false } cumulus-primitives-aura = { path = "../../../../primitives/aura", default-features = false } cumulus-primitives-core = { path = "../../../../primitives/core", default-features = false } +cumulus-primitives-storage-weight-reclaim = { path = "../../../../primitives/storage-weight-reclaim", default-features = false } cumulus-primitives-utility = { path = "../../../../primitives/utility", default-features = false } parachains-common = { path = "../../../common", default-features = false } testnet-parachains-constants = { path = "../../constants", default-features = false, features = ["rococo"] } @@ -75,6 +76,7 @@ std = [ "cumulus-ping/std", "cumulus-primitives-aura/std", "cumulus-primitives-core/std", + "cumulus-primitives-storage-weight-reclaim/std", "cumulus-primitives-utility/std", "frame-benchmarking?/std", "frame-executive/std", @@ -134,5 +136,3 @@ runtime-benchmarks = [ "xcm-builder/runtime-benchmarks", "xcm-executor/runtime-benchmarks", ] - -experimental = ["pallet-aura/experimental"] diff --git a/cumulus/parachains/runtimes/testing/rococo-parachain/src/lib.rs b/cumulus/parachains/runtimes/testing/rococo-parachain/src/lib.rs index c43d79271de717cbe0273edfdc6a7ba10a96aa01..154c2c4600043cc0ceb1b0cd61a84949dcdd9616 100644 --- a/cumulus/parachains/runtimes/testing/rococo-parachain/src/lib.rs +++ b/cumulus/parachains/runtimes/testing/rococo-parachain/src/lib.rs @@ -41,7 +41,7 @@ use sp_version::RuntimeVersion; pub use frame_support::{ construct_runtime, derive_impl, dispatch::DispatchClass, - genesis_builder_helper::{build_config, create_default_config}, + genesis_builder_helper::{build_state, get_preset}, parameter_types, traits::{ AsEnsureOriginWithArg, ConstBool, ConstU32, ConstU64, ConstU8, Contains, EitherOfDiverse, @@ -84,14 +84,12 @@ use xcm_executor::traits::JustTry; use pallet_xcm::{EnsureXcm, IsMajorityOfBody, XcmPassthrough}; use polkadot_parachain_primitives::primitives::Sibling; use xcm::latest::prelude::*; -#[allow(deprecated)] -use xcm_builder::CurrencyAdapter; use xcm_builder::{ AccountId32Aliases, AllowExplicitUnpaidExecutionFrom, AllowTopLevelPaidExecutionFrom, - EnsureXcmOrigin, FixedWeightBounds, IsConcrete, NativeAsset, ParentAsSuperuser, ParentIsPreset, - RelayChainAsNative, SiblingParachainAsNative, SiblingParachainConvertsVia, - SignedAccountId32AsNative, SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit, - UsingComponents, + EnsureXcmOrigin, FixedWeightBounds, FungibleAdapter, IsConcrete, NativeAsset, + ParentAsSuperuser, ParentIsPreset, RelayChainAsNative, SiblingParachainAsNative, + SiblingParachainConvertsVia, SignedAccountId32AsNative, SignedToAccountId32, + SovereignSignedViaLocation, TakeWeightCredit, UsingComponents, }; use xcm_executor::XcmExecutor; @@ -109,7 +107,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("test-parachain"), impl_name: create_runtime_str!("test-parachain"), authoring_version: 1, - spec_version: 1_006_000, + spec_version: 1_010_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 6, @@ -140,7 +138,7 @@ pub fn native_version() -> NativeVersion { NativeVersion { runtime_version: VERSION, can_author_with: Default::default() } } -/// We assume that ~10% of the block weight is consumed by `on_initalize` handlers. +/// We assume that ~10% of the block weight is consumed by `on_initialize` handlers. /// This is used to limit the maximal weight of a single extrinsic. const AVERAGE_ON_INITIALIZE_RATIO: Perbill = Perbill::from_percent(10); /// We allow `Normal` extrinsics to fill up the block up to 75%, the rest can be used @@ -187,7 +185,7 @@ parameter_types! { pub const SS58Prefix: u8 = 42; } -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Runtime { /// The identifier used to distinguish between accounts. type AccountId = AccountId; @@ -230,10 +228,7 @@ impl pallet_timestamp::Config for Runtime { /// A timestamp: milliseconds since the unix epoch. type Moment = u64; type OnTimestampSet = Aura; - #[cfg(feature = "experimental")] type MinimumPeriod = ConstU64<0>; - #[cfg(not(feature = "experimental"))] - type MinimumPeriod = ConstU64<{ SLOT_DURATION / 2 }>; type WeightInfo = (); } @@ -264,7 +259,7 @@ impl pallet_balances::Config for Runtime { impl pallet_transaction_payment::Config for Runtime { type RuntimeEvent = RuntimeEvent; - type OnChargeTransaction = pallet_transaction_payment::CurrencyAdapter; + type OnChargeTransaction = pallet_transaction_payment::FungibleAdapter; type WeightToFee = IdentityFee; type LengthToFee = ConstantMultiplier; type FeeMultiplierUpdate = (); @@ -325,6 +320,7 @@ impl pallet_message_queue::Config for Runtime { type HeapSize = sp_core::ConstU32<{ 64 * 1024 }>; type MaxStale = sp_core::ConstU32<8>; type ServiceWeight = MessageQueueServiceWeight; + type IdleMaxServiceWeight = (); } impl cumulus_pallet_aura_ext::Config for Runtime {} @@ -350,8 +346,7 @@ pub type LocationToAccountId = ( ); /// Means for transacting assets on this chain. -#[allow(deprecated)] -pub type CurrencyTransactor = CurrencyAdapter< +pub type CurrencyTransactor = FungibleAdapter< // Use this currency: Balances, // Use this currency when it is a fungible asset matching the given location or name: @@ -490,6 +485,9 @@ impl xcm_executor::Config for XcmConfig { type SafeCallFilter = Everything; type Aliasers = Nothing; type TransactionalProcessor = FrameTransactionalProcessor; + type HrmpNewChannelOpenRequestHandler = (); + type HrmpChannelAcceptedHandler = (); + type HrmpChannelClosingHandler = (); } /// Local origins on this chain are allowed to dispatch XCM sends/executions. @@ -597,7 +595,6 @@ impl pallet_aura::Config for Runtime { type DisabledValidators = (); type MaxAuthorities = ConstU32<100_000>; type AllowMultipleBlocksPerSlot = ConstBool; - #[cfg(feature = "experimental")] type SlotDuration = ConstU64; } @@ -657,6 +654,7 @@ pub type SignedExtra = ( frame_system::CheckNonce, frame_system::CheckWeight, pallet_transaction_payment::ChargeTransactionPayment, + cumulus_primitives_storage_weight_reclaim::StorageWeightReclaim, ); /// Unchecked extrinsic type as expected by this runtime. pub type UncheckedExtrinsic = @@ -692,7 +690,7 @@ impl_runtime_apis! { Executive::execute_block(block); } - fn initialize_block(header: &::Header) { + fn initialize_block(header: &::Header) -> sp_runtime::ExtrinsicInclusionMode { Executive::initialize_block(header) } } @@ -765,7 +763,7 @@ impl_runtime_apis! { } fn authorities() -> Vec { - Aura::authorities().into_inner() + pallet_aura::Authorities::::get().into_inner() } } @@ -826,12 +824,16 @@ impl_runtime_apis! { } impl sp_genesis_builder::GenesisBuilder for Runtime { - fn create_default_config() -> Vec { - create_default_config::() + fn build_state(config: Vec) -> sp_genesis_builder::Result { + build_state::(config) } - fn build_config(config: Vec) -> sp_genesis_builder::Result { - build_config::(config) + fn get_preset(id: &Option) -> Option> { + get_preset::(id, |_| None) + } + + fn preset_names() -> Vec { + vec![] } } diff --git a/cumulus/polkadot-parachain/Cargo.toml b/cumulus/polkadot-parachain/Cargo.toml index cc0bd47cc77337362926c712b26ab7f6ae3d407d..280ece30fb6834c2a5031f33cd316b5a137f65f5 100644 --- a/cumulus/polkadot-parachain/Cargo.toml +++ b/cumulus/polkadot-parachain/Cargo.toml @@ -15,14 +15,14 @@ name = "polkadot-parachain" path = "src/main.rs" [dependencies] -async-trait = "0.1.74" -clap = { version = "4.4.18", features = ["derive"] } +async-trait = "0.1.79" +clap = { version = "4.5.3", features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.0.0" } futures = "0.3.28" hex-literal = "0.4.1" -log = "0.4.20" -serde = { version = "1.0.195", features = ["derive"] } -serde_json = "1.0.111" +log = { workspace = true, default-features = true } +serde = { features = ["derive"], workspace = true, default-features = true } +serde_json = { workspace = true, default-features = true } # Local rococo-parachain-runtime = { path = "../parachains/runtimes/testing/rococo-parachain" } @@ -38,11 +38,14 @@ coretime-rococo-runtime = { path = "../parachains/runtimes/coretime/coretime-roc coretime-westend-runtime = { path = "../parachains/runtimes/coretime/coretime-westend" } bridge-hub-westend-runtime = { path = "../parachains/runtimes/bridge-hubs/bridge-hub-westend" } penpal-runtime = { path = "../parachains/runtimes/testing/penpal" } -jsonrpsee = { version = "0.20.3", features = ["server"] } +jsonrpsee = { version = "0.22", features = ["server"] } people-rococo-runtime = { path = "../parachains/runtimes/people/people-rococo" } people-westend-runtime = { path = "../parachains/runtimes/people/people-westend" } parachains-common = { path = "../parachains/common" } -testnet-parachains-constants = { path = "../parachains/runtimes/constants", default-features = false, features = ["rococo", "westend"] } +testnet-parachains-constants = { path = "../parachains/runtimes/constants", default-features = false, features = [ + "rococo", + "westend", +] } # Substrate frame-benchmarking = { path = "../../substrate/frame/benchmarking" } @@ -168,6 +171,5 @@ try-runtime = [ "shell-runtime/try-runtime", "sp-runtime/try-runtime", ] -fast-runtime = [ - "bridge-hub-rococo-runtime/fast-runtime", -] +fast-runtime = ["bridge-hub-rococo-runtime/fast-runtime"] +elastic-scaling-experimental = ["polkadot-service/elastic-scaling-experimental"] diff --git a/cumulus/polkadot-parachain/chain-specs/coretime-kusama.json b/cumulus/polkadot-parachain/chain-specs/coretime-kusama.json new file mode 120000 index 0000000000000000000000000000000000000000..9bf86d50955a0ccc61767fd2a6c4afe55786a218 --- /dev/null +++ b/cumulus/polkadot-parachain/chain-specs/coretime-kusama.json @@ -0,0 +1 @@ +../../parachains/chain-specs/coretime-kusama.json \ No newline at end of file diff --git a/cumulus/polkadot-parachain/chain-specs/coretime-rococo.json b/cumulus/polkadot-parachain/chain-specs/coretime-rococo.json new file mode 120000 index 0000000000000000000000000000000000000000..6e47a6ad08cc787e2a66f6426b1516769779e995 --- /dev/null +++ b/cumulus/polkadot-parachain/chain-specs/coretime-rococo.json @@ -0,0 +1 @@ +../../parachains/chain-specs/coretime-rococo.json \ No newline at end of file diff --git a/cumulus/polkadot-parachain/chain-specs/coretime-westend.json b/cumulus/polkadot-parachain/chain-specs/coretime-westend.json new file mode 120000 index 0000000000000000000000000000000000000000..80dd771db54fc6067f19fadd883dd2274fb21f9d --- /dev/null +++ b/cumulus/polkadot-parachain/chain-specs/coretime-westend.json @@ -0,0 +1 @@ +../../parachains/chain-specs/coretime-westend.json \ No newline at end of file diff --git a/cumulus/polkadot-parachain/chain-specs/people-kusama.json b/cumulus/polkadot-parachain/chain-specs/people-kusama.json new file mode 120000 index 0000000000000000000000000000000000000000..5bb0b3cecb5c73ebb1ff62248f3628f6c9f56e61 --- /dev/null +++ b/cumulus/polkadot-parachain/chain-specs/people-kusama.json @@ -0,0 +1 @@ +../../parachains/chain-specs/people-kusama.json \ No newline at end of file diff --git a/cumulus/polkadot-parachain/src/chain_spec/bridge_hubs.rs b/cumulus/polkadot-parachain/src/chain_spec/bridge_hubs.rs index 1db826ea7daf82e93c0099807bab7f44642084b3..15e8a1bf11a055e6c5b4950ad07d78cad72f81a8 100644 --- a/cumulus/polkadot-parachain/src/chain_spec/bridge_hubs.rs +++ b/cumulus/polkadot-parachain/src/chain_spec/bridge_hubs.rs @@ -25,7 +25,10 @@ use std::str::FromStr; #[derive(Debug, PartialEq)] pub enum BridgeHubRuntimeType { Kusama, + KusamaLocal, + Polkadot, + PolkadotLocal, Rococo, RococoLocal, @@ -44,7 +47,9 @@ impl FromStr for BridgeHubRuntimeType { fn from_str(value: &str) -> Result { match value { polkadot::BRIDGE_HUB_POLKADOT => Ok(BridgeHubRuntimeType::Polkadot), + polkadot::BRIDGE_HUB_POLKADOT_LOCAL => Ok(BridgeHubRuntimeType::PolkadotLocal), kusama::BRIDGE_HUB_KUSAMA => Ok(BridgeHubRuntimeType::Kusama), + kusama::BRIDGE_HUB_KUSAMA_LOCAL => Ok(BridgeHubRuntimeType::KusamaLocal), westend::BRIDGE_HUB_WESTEND => Ok(BridgeHubRuntimeType::Westend), westend::BRIDGE_HUB_WESTEND_LOCAL => Ok(BridgeHubRuntimeType::WestendLocal), westend::BRIDGE_HUB_WESTEND_DEVELOPMENT => Ok(BridgeHubRuntimeType::WestendDevelopment), @@ -103,6 +108,7 @@ impl BridgeHubRuntimeType { Some("Bob".to_string()), |_| (), ))), + other => Err(std::format!("No default config present for {:?}", other)), } } } @@ -242,6 +248,7 @@ pub mod rococo { /// Sub-module for Kusama setup pub mod kusama { pub(crate) const BRIDGE_HUB_KUSAMA: &str = "bridge-hub-kusama"; + pub(crate) const BRIDGE_HUB_KUSAMA_LOCAL: &str = "bridge-hub-kusama-local"; } /// Sub-module for Westend setup. @@ -358,4 +365,5 @@ pub mod westend { /// Sub-module for Polkadot setup pub mod polkadot { pub(crate) const BRIDGE_HUB_POLKADOT: &str = "bridge-hub-polkadot"; + pub(crate) const BRIDGE_HUB_POLKADOT_LOCAL: &str = "bridge-hub-polkadot-local"; } diff --git a/cumulus/polkadot-parachain/src/chain_spec/coretime.rs b/cumulus/polkadot-parachain/src/chain_spec/coretime.rs index f7c362cbd457639e3409eb1f24d3358186914269..fe60b09fd8b21715286f5fd40018be06ba978c06 100644 --- a/cumulus/polkadot-parachain/src/chain_spec/coretime.rs +++ b/cumulus/polkadot-parachain/src/chain_spec/coretime.rs @@ -22,6 +22,12 @@ use std::{borrow::Cow, str::FromStr}; /// Collects all supported Coretime configurations. #[derive(Debug, PartialEq, Clone, Copy)] pub enum CoretimeRuntimeType { + Kusama, + KusamaLocal, + + Polkadot, + PolkadotLocal, + // Live Rococo, // Local @@ -29,6 +35,8 @@ pub enum CoretimeRuntimeType { // Benchmarks RococoDevelopment, + // Live + Westend, // Local WestendLocal, // Benchmarks @@ -40,9 +48,14 @@ impl FromStr for CoretimeRuntimeType { fn from_str(value: &str) -> Result { match value { + kusama::CORETIME_KUSAMA => Ok(CoretimeRuntimeType::Kusama), + kusama::CORETIME_KUSAMA_LOCAL => Ok(CoretimeRuntimeType::KusamaLocal), + polkadot::CORETIME_POLKADOT => Ok(CoretimeRuntimeType::Polkadot), + polkadot::CORETIME_POLKADOT_LOCAL => Ok(CoretimeRuntimeType::PolkadotLocal), rococo::CORETIME_ROCOCO => Ok(CoretimeRuntimeType::Rococo), rococo::CORETIME_ROCOCO_LOCAL => Ok(CoretimeRuntimeType::RococoLocal), rococo::CORETIME_ROCOCO_DEVELOPMENT => Ok(CoretimeRuntimeType::RococoDevelopment), + westend::CORETIME_WESTEND => Ok(CoretimeRuntimeType::Westend), westend::CORETIME_WESTEND_LOCAL => Ok(CoretimeRuntimeType::WestendLocal), westend::CORETIME_WESTEND_DEVELOPMENT => Ok(CoretimeRuntimeType::WestendDevelopment), _ => Err(format!("Value '{}' is not configured yet", value)), @@ -53,9 +66,14 @@ impl FromStr for CoretimeRuntimeType { impl From for &str { fn from(runtime_type: CoretimeRuntimeType) -> Self { match runtime_type { + CoretimeRuntimeType::Kusama => kusama::CORETIME_KUSAMA, + CoretimeRuntimeType::KusamaLocal => kusama::CORETIME_KUSAMA_LOCAL, + CoretimeRuntimeType::Polkadot => polkadot::CORETIME_POLKADOT, + CoretimeRuntimeType::PolkadotLocal => polkadot::CORETIME_POLKADOT_LOCAL, CoretimeRuntimeType::Rococo => rococo::CORETIME_ROCOCO, CoretimeRuntimeType::RococoLocal => rococo::CORETIME_ROCOCO_LOCAL, CoretimeRuntimeType::RococoDevelopment => rococo::CORETIME_ROCOCO_DEVELOPMENT, + CoretimeRuntimeType::Westend => westend::CORETIME_WESTEND, CoretimeRuntimeType::WestendLocal => westend::CORETIME_WESTEND_LOCAL, CoretimeRuntimeType::WestendDevelopment => westend::CORETIME_WESTEND_DEVELOPMENT, } @@ -65,9 +83,14 @@ impl From for &str { impl From for ChainType { fn from(runtime_type: CoretimeRuntimeType) -> Self { match runtime_type { - CoretimeRuntimeType::Rococo => ChainType::Live, - CoretimeRuntimeType::RococoLocal | CoretimeRuntimeType::WestendLocal => - ChainType::Local, + CoretimeRuntimeType::Kusama | + CoretimeRuntimeType::Polkadot | + CoretimeRuntimeType::Rococo | + CoretimeRuntimeType::Westend => ChainType::Live, + CoretimeRuntimeType::KusamaLocal | + CoretimeRuntimeType::PolkadotLocal | + CoretimeRuntimeType::RococoLocal | + CoretimeRuntimeType::WestendLocal => ChainType::Local, CoretimeRuntimeType::RococoDevelopment | CoretimeRuntimeType::WestendDevelopment => ChainType::Development, } @@ -81,17 +104,29 @@ impl CoretimeRuntimeType { pub fn load_config(&self) -> Result, String> { match self { + CoretimeRuntimeType::Kusama => Ok(Box::new(GenericChainSpec::from_json_bytes( + &include_bytes!("../../chain-specs/coretime-kusama.json")[..], + )?)), + CoretimeRuntimeType::Polkadot => + todo!("Generate chain-spec: ../../chain-specs/coretime-polkadot.json"), CoretimeRuntimeType::Rococo => Ok(Box::new(GenericChainSpec::from_json_bytes( - &include_bytes!("../../../parachains/chain-specs/coretime-rococo.json")[..], + &include_bytes!("../../chain-specs/coretime-rococo.json")[..], )?)), CoretimeRuntimeType::RococoLocal => Ok(Box::new(rococo::local_config(*self, "rococo-local"))), CoretimeRuntimeType::RococoDevelopment => Ok(Box::new(rococo::local_config(*self, "rococo-dev"))), + CoretimeRuntimeType::Westend => Ok(Box::new(GenericChainSpec::from_json_bytes( + &include_bytes!("../../../parachains/chain-specs/coretime-westend.json")[..], + )?)), CoretimeRuntimeType::WestendLocal => Ok(Box::new(westend::local_config(*self, "westend-local"))), CoretimeRuntimeType::WestendDevelopment => Ok(Box::new(westend::local_config(*self, "westend-dev"))), + other => Err(std::format!( + "No default config present for {:?}, you should provide a chain-spec as json file!", + other + )), } } } @@ -213,6 +248,7 @@ pub mod westend { use parachains_common::{AccountId, AuraId, Balance}; use sp_core::sr25519; + pub(crate) const CORETIME_WESTEND: &str = "coretime-westend"; pub(crate) const CORETIME_WESTEND_LOCAL: &str = "coretime-westend-local"; pub(crate) const CORETIME_WESTEND_DEVELOPMENT: &str = "coretime-westend-dev"; const CORETIME_WESTEND_ED: Balance = coretime_westend_runtime::ExistentialDeposit::get(); @@ -288,3 +324,13 @@ pub mod westend { }) } } + +pub mod kusama { + pub(crate) const CORETIME_KUSAMA: &str = "coretime-kusama"; + pub(crate) const CORETIME_KUSAMA_LOCAL: &str = "coretime-kusama-local"; +} + +pub mod polkadot { + pub(crate) const CORETIME_POLKADOT: &str = "coretime-polkadot"; + pub(crate) const CORETIME_POLKADOT_LOCAL: &str = "coretime-polkadot-local"; +} diff --git a/cumulus/polkadot-parachain/src/chain_spec/people.rs b/cumulus/polkadot-parachain/src/chain_spec/people.rs index 67786e17205d86e5108721c6a6ef7209fe9297f2..1408ef0aff67adf4942b8dcd8d4198c8cd60910b 100644 --- a/cumulus/polkadot-parachain/src/chain_spec/people.rs +++ b/cumulus/polkadot-parachain/src/chain_spec/people.rs @@ -23,6 +23,10 @@ use std::str::FromStr; /// Collects all supported People configurations. #[derive(Debug, PartialEq)] pub enum PeopleRuntimeType { + Kusama, + KusamaLocal, + Polkadot, + PolkadotLocal, Rococo, RococoLocal, RococoDevelopment, @@ -36,6 +40,10 @@ impl FromStr for PeopleRuntimeType { fn from_str(value: &str) -> Result { match value { + kusama::PEOPLE_KUSAMA => Ok(PeopleRuntimeType::Kusama), + kusama::PEOPLE_KUSAMA_LOCAL => Ok(PeopleRuntimeType::KusamaLocal), + polkadot::PEOPLE_POLKADOT => Ok(PeopleRuntimeType::Polkadot), + polkadot::PEOPLE_POLKADOT_LOCAL => Ok(PeopleRuntimeType::PolkadotLocal), rococo::PEOPLE_ROCOCO => Ok(PeopleRuntimeType::Rococo), rococo::PEOPLE_ROCOCO_LOCAL => Ok(PeopleRuntimeType::RococoLocal), rococo::PEOPLE_ROCOCO_DEVELOPMENT => Ok(PeopleRuntimeType::RococoDevelopment), @@ -52,6 +60,10 @@ impl PeopleRuntimeType { pub fn load_config(&self) -> Result, String> { match self { + PeopleRuntimeType::Kusama => + todo!("Update chain-spec: ../../chain-specs/people-kusama.json - https://github.com/paritytech/polkadot-sdk/pull/3961#issuecomment-2037438431"), + PeopleRuntimeType::Polkadot => + todo!("Generate chain-spec: ../../chain-specs/people-polkadot.json"), PeopleRuntimeType::Rococo => Ok(Box::new(GenericChainSpec::from_json_bytes( &include_bytes!("../../chain-specs/people-rococo.json")[..], )?)), @@ -82,6 +94,10 @@ impl PeopleRuntimeType { "westend-development", ParaId::new(1004), ))), + other => Err(std::format!( + "No default config present for {:?}, you should provide a chain-spec as json file!", + other + )), } } } @@ -318,3 +334,13 @@ pub mod westend { }) } } + +pub mod kusama { + pub(crate) const PEOPLE_KUSAMA: &str = "people-kusama"; + pub(crate) const PEOPLE_KUSAMA_LOCAL: &str = "people-kusama-local"; +} + +pub mod polkadot { + pub(crate) const PEOPLE_POLKADOT: &str = "people-polkadot"; + pub(crate) const PEOPLE_POLKADOT_LOCAL: &str = "people-polkadot-local"; +} diff --git a/cumulus/polkadot-parachain/src/cli.rs b/cumulus/polkadot-parachain/src/cli.rs index fec6e144e40f16a0f82ad06a0cb4d870d27948cb..f7d2fd0f0be3c938ac5a9376d6896a0b073fa364 100644 --- a/cumulus/polkadot-parachain/src/cli.rs +++ b/cumulus/polkadot-parachain/src/cli.rs @@ -55,11 +55,6 @@ pub enum Subcommand { /// The pallet benchmarking moved to the `pallet` sub-command. #[command(subcommand)] Benchmark(frame_benchmarking_cli::BenchmarkCmd), - - /// Try-runtime has migrated to a standalone - /// [CLI](). The subcommand exists as a stub and - /// deprecation notice. It will be removed entirely some time after January 2024. - TryRuntime, } const AFTER_HELP_EXAMPLE: &str = color_print::cstr!( diff --git a/cumulus/polkadot-parachain/src/command.rs b/cumulus/polkadot-parachain/src/command.rs index 19d067068f48f2b1573b4d6c9b2cfef60a1b9333..041187de488f33c2c0fe65e4464d165a46c0333e 100644 --- a/cumulus/polkadot-parachain/src/command.rs +++ b/cumulus/polkadot-parachain/src/command.rs @@ -21,8 +21,9 @@ use crate::{ fake_runtime_api::{ asset_hub_polkadot_aura::RuntimeApi as AssetHubPolkadotRuntimeApi, aura::RuntimeApi, }, - service::{new_partial, Block}, + service::{new_partial, Block, Hash}, }; +use cumulus_client_service::storage_proof_size::HostFunctions as ReclaimHostFunctions; use cumulus_primitives_core::ParaId; use frame_benchmarking_cli::{BenchmarkCmd, SUBSTRATE_REFERENCE_HARDWARE}; use log::info; @@ -134,7 +135,7 @@ fn runtime(id: &str) -> Runtime { fn load_spec(id: &str) -> std::result::Result, String> { let (id, _, para_id) = extract_parachain_id(id); Ok(match id { - // - Defaul-like + // - Default-like "staging" => Box::new(chain_spec::rococo_parachain::staging_rococo_parachain_local_config()), "tick" => Box::new(GenericChainSpec::from_json_bytes( @@ -398,7 +399,7 @@ macro_rules! construct_partials { Runtime::AssetHubPolkadot => { let $partials = new_partial::( &$config, - crate::service::aura_build_import_queue::<_, AssetHubPolkadotAuraId>, + crate::service::build_relay_to_aura_import_queue::<_, AssetHubPolkadotAuraId>, )?; $code }, @@ -412,28 +413,21 @@ macro_rules! construct_partials { Runtime::People(_) => { let $partials = new_partial::( &$config, - crate::service::aura_build_import_queue::<_, AuraId>, + crate::service::build_relay_to_aura_import_queue::<_, AuraId>, )?; $code }, Runtime::GluttonWestend | Runtime::Glutton | Runtime::Shell | Runtime::Seedling => { let $partials = new_partial::( &$config, - crate::service::shell_build_import_queue, + crate::service::build_shell_import_queue, )?; $code }, - Runtime::ContractsRococo => { + Runtime::ContractsRococo | Runtime::Penpal(_) | Runtime::Default => { let $partials = new_partial::( &$config, - crate::service::contracts_rococo_build_import_queue, - )?; - $code - }, - Runtime::Penpal(_) | Runtime::Default => { - let $partials = new_partial::( - &$config, - crate::service::rococo_parachain_build_import_queue, + crate::service::build_aura_import_queue, )?; $code }, @@ -449,7 +443,7 @@ macro_rules! construct_async_run { runner.async_run(|$config| { let $components = new_partial::( &$config, - crate::service::aura_build_import_queue::<_, AssetHubPolkadotAuraId>, + crate::service::build_relay_to_aura_import_queue::<_, AssetHubPolkadotAuraId>, )?; let task_manager = $components.task_manager; { $( $code )* }.map(|v| (v, task_manager)) @@ -466,7 +460,7 @@ macro_rules! construct_async_run { runner.async_run(|$config| { let $components = new_partial::( &$config, - crate::service::aura_build_import_queue::<_, AuraId>, + crate::service::build_relay_to_aura_import_queue::<_, AuraId>, )?; let task_manager = $components.task_manager; { $( $code )* }.map(|v| (v, task_manager)) @@ -479,30 +473,20 @@ macro_rules! construct_async_run { runner.async_run(|$config| { let $components = new_partial::( &$config, - crate::service::shell_build_import_queue, + crate::service::build_shell_import_queue, )?; let task_manager = $components.task_manager; { $( $code )* }.map(|v| (v, task_manager)) }) } - Runtime::ContractsRococo => { - runner.async_run(|$config| { - let $components = new_partial::( - &$config, - crate::service::contracts_rococo_build_import_queue, - )?; - let task_manager = $components.task_manager; - { $( $code )* }.map(|v| (v, task_manager)) - }) - }, - Runtime::Penpal(_) | Runtime::Default => { + Runtime::ContractsRococo | Runtime::Penpal(_) | Runtime::Default => { runner.async_run(|$config| { let $components = new_partial::< RuntimeApi, _, >( &$config, - crate::service::rococo_parachain_build_import_queue, + crate::service::build_aura_import_queue, )?; let task_manager = $components.task_manager; { $( $code )* }.map(|v| (v, task_manager)) @@ -514,7 +498,6 @@ macro_rules! construct_async_run { /// Parse command line arguments into service configuration. pub fn run() -> Result<()> { - use Runtime::*; let cli = Cli::from_args(); match &cli.subcommand { @@ -566,9 +549,8 @@ pub fn run() -> Result<()> { }, Some(Subcommand::ExportGenesisHead(cmd)) => { let runner = cli.create_runner(cmd)?; - runner.sync_run(|config| { - construct_partials!(config, |partials| cmd.run(partials.client)) - }) + runner + .sync_run(|config| construct_partials!(config, |partials| cmd.run(partials.client))) }, Some(Subcommand::ExportGenesisWasm(cmd)) => { let runner = cli.create_runner(cmd)?; @@ -584,7 +566,7 @@ pub fn run() -> Result<()> { match cmd { BenchmarkCmd::Pallet(cmd) => if cfg!(feature = "runtime-benchmarks") { - runner.sync_run(|config| cmd.run::(config)) + runner.sync_run(|config| cmd.run_with_spec::, ReclaimHostFunctions>(Some(config.chain_spec))) } else { Err("Benchmarking wasn't enabled when building the node. \ You can enable it with `--features runtime-benchmarks`." @@ -618,7 +600,6 @@ pub fn run() -> Result<()> { _ => Err("Benchmarking sub-command unsupported".into()), } }, - Some(Subcommand::TryRuntime) => Err("The `try-runtime` subcommand has been migrated to a standalone CLI (https://github.com/paritytech/try-runtime-cli). It is no longer being maintained here and will be removed entirely some time after January 2024. Please remove this subcommand from your runtime and use the standalone CLI.".into()), Some(Subcommand::Key(cmd)) => Ok(cmd.run(&cli)?), None => { let runner = cli.create_runner(&cli.run.normalize())?; @@ -686,167 +667,189 @@ pub fn run() -> Result<()> { info!("Parachain Account: {}", parachain_account); info!("Is collating: {}", if config.role.is_authority() { "yes" } else { "no" }); - match config.chain_spec.runtime()? { - AssetHubPolkadot => crate::service::start_asset_hub_node::< - AssetHubPolkadotRuntimeApi, - AssetHubPolkadotAuraId, - >(config, polkadot_config, collator_options, id, hwbench) - .await - .map(|r| r.0) - .map_err(Into::into), - - AssetHubKusama => - crate::service::start_asset_hub_node::< - RuntimeApi, - AuraId, - >(config, polkadot_config, collator_options, id, hwbench) - .await - .map(|r| r.0) - .map_err(Into::into), - - AssetHubRococo | AssetHubWestend => - crate::service::start_asset_hub_lookahead_node::< - RuntimeApi, - AuraId, - >(config, polkadot_config, collator_options, id, hwbench) - .await - .map(|r| r.0) - .map_err(Into::into), - - CollectivesPolkadot => - crate::service::start_generic_aura_node::< - RuntimeApi, - AuraId, - >(config, polkadot_config, collator_options, id, hwbench) - .await - .map(|r| r.0) - .map_err(Into::into), - - CollectivesWestend => - crate::service::start_generic_aura_lookahead_node::< - RuntimeApi, - AuraId, - >(config, polkadot_config, collator_options, id, hwbench) - .await - .map(|r| r.0) - .map_err(Into::into), - - Seedling | Shell => - crate::service::start_shell_node::( + match polkadot_config.network.network_backend { + sc_network::config::NetworkBackendType::Libp2p => + start_node::>( config, polkadot_config, collator_options, id, hwbench, ) - .await - .map(|r| r.0) - .map_err(Into::into), - - ContractsRococo => crate::service::start_contracts_rococo_node( - config, - polkadot_config, - collator_options, - id, - hwbench, - ) - .await - .map(|r| r.0) - .map_err(Into::into), - - BridgeHub(bridge_hub_runtime_type) => match bridge_hub_runtime_type { - chain_spec::bridge_hubs::BridgeHubRuntimeType::Polkadot => - crate::service::start_generic_aura_node::< - RuntimeApi, - AuraId, - >(config, polkadot_config, collator_options, id, hwbench) - .await - .map(|r| r.0), - chain_spec::bridge_hubs::BridgeHubRuntimeType::Kusama => - crate::service::start_generic_aura_node::< - RuntimeApi, - AuraId, - >(config, polkadot_config, collator_options, id, hwbench) - .await - .map(|r| r.0), - chain_spec::bridge_hubs::BridgeHubRuntimeType::Westend | - chain_spec::bridge_hubs::BridgeHubRuntimeType::WestendLocal | - chain_spec::bridge_hubs::BridgeHubRuntimeType::WestendDevelopment => - crate::service::start_generic_aura_lookahead_node::< - RuntimeApi, - AuraId, - >(config, polkadot_config, collator_options, id, hwbench) - .await - .map(|r| r.0), - chain_spec::bridge_hubs::BridgeHubRuntimeType::Rococo | - chain_spec::bridge_hubs::BridgeHubRuntimeType::RococoLocal | - chain_spec::bridge_hubs::BridgeHubRuntimeType::RococoDevelopment => - crate::service::start_generic_aura_lookahead_node::< - RuntimeApi, - AuraId, - >(config, polkadot_config, collator_options, id, hwbench) - .await - .map(|r| r.0), - } - .map_err(Into::into), - - Coretime(coretime_runtime_type) => match coretime_runtime_type { - chain_spec::coretime::CoretimeRuntimeType::Rococo | - chain_spec::coretime::CoretimeRuntimeType::RococoLocal | - chain_spec::coretime::CoretimeRuntimeType::RococoDevelopment | - chain_spec::coretime::CoretimeRuntimeType::WestendLocal | - chain_spec::coretime::CoretimeRuntimeType::WestendDevelopment => - crate::service::start_generic_aura_lookahead_node::< - RuntimeApi, - AuraId, - >(config, polkadot_config, collator_options, id, hwbench) - .await - .map(|r| r.0), - } - .map_err(Into::into), - - Penpal(_) | Default => - crate::service::start_rococo_parachain_node( + .await, + sc_network::config::NetworkBackendType::Litep2p => + start_node::( config, polkadot_config, collator_options, id, hwbench, ) - .await - .map(|r| r.0) - .map_err(Into::into), - - Glutton | GluttonWestend => - crate::service::start_basic_lookahead_node::< - RuntimeApi, - AuraId, - >(config, polkadot_config, collator_options, id, hwbench) - .await - .map(|r| r.0) - .map_err(Into::into), - - People(people_runtime_type) => match people_runtime_type { - chain_spec::people::PeopleRuntimeType::Rococo | - chain_spec::people::PeopleRuntimeType::RococoLocal | - chain_spec::people::PeopleRuntimeType::RococoDevelopment | - chain_spec::people::PeopleRuntimeType::Westend | - chain_spec::people::PeopleRuntimeType::WestendLocal | - chain_spec::people::PeopleRuntimeType::WestendDevelopment => - crate::service::start_generic_aura_lookahead_node::< - RuntimeApi, - AuraId, - >(config, polkadot_config, collator_options, id, hwbench) - .await - .map(|r| r.0), - } - .map_err(Into::into), + .await, } }) }, } } +async fn start_node>( + config: sc_service::Configuration, + polkadot_config: sc_service::Configuration, + collator_options: cumulus_client_cli::CollatorOptions, + id: ParaId, + hwbench: Option, +) -> Result { + match config.chain_spec.runtime()? { + Runtime::AssetHubPolkadot => crate::service::start_asset_hub_lookahead_node::< + AssetHubPolkadotRuntimeApi, + AssetHubPolkadotAuraId, + Network, + >(config, polkadot_config, collator_options, id, hwbench) + .await + .map(|r| r.0) + .map_err(Into::into), + + Runtime::AssetHubRococo | Runtime::AssetHubWestend | Runtime::AssetHubKusama => + crate::service::start_asset_hub_lookahead_node::( + config, + polkadot_config, + collator_options, + id, + hwbench, + ) + .await + .map(|r| r.0) + .map_err(Into::into), + + Runtime::CollectivesWestend | Runtime::CollectivesPolkadot => + crate::service::start_generic_aura_lookahead_node::( + config, + polkadot_config, + collator_options, + id, + hwbench, + ) + .await + .map(|r| r.0) + .map_err(Into::into), + + Runtime::Seedling | Runtime::Shell => crate::service::start_shell_node::( + config, + polkadot_config, + collator_options, + id, + hwbench, + ) + .await + .map(|r| r.0) + .map_err(Into::into), + + Runtime::ContractsRococo => crate::service::start_contracts_rococo_node::( + config, + polkadot_config, + collator_options, + id, + hwbench, + ) + .await + .map(|r| r.0) + .map_err(Into::into), + + Runtime::BridgeHub(bridge_hub_runtime_type) => match bridge_hub_runtime_type { + chain_spec::bridge_hubs::BridgeHubRuntimeType::Polkadot | + chain_spec::bridge_hubs::BridgeHubRuntimeType::PolkadotLocal | + chain_spec::bridge_hubs::BridgeHubRuntimeType::Kusama | + chain_spec::bridge_hubs::BridgeHubRuntimeType::KusamaLocal | + chain_spec::bridge_hubs::BridgeHubRuntimeType::Westend | + chain_spec::bridge_hubs::BridgeHubRuntimeType::WestendLocal | + chain_spec::bridge_hubs::BridgeHubRuntimeType::WestendDevelopment | + chain_spec::bridge_hubs::BridgeHubRuntimeType::Rococo | + chain_spec::bridge_hubs::BridgeHubRuntimeType::RococoLocal | + chain_spec::bridge_hubs::BridgeHubRuntimeType::RococoDevelopment => + crate::service::start_generic_aura_lookahead_node::( + config, + polkadot_config, + collator_options, + id, + hwbench, + ) + .await + .map(|r| r.0), + } + .map_err(Into::into), + + Runtime::Coretime(coretime_runtime_type) => match coretime_runtime_type { + chain_spec::coretime::CoretimeRuntimeType::Kusama | + chain_spec::coretime::CoretimeRuntimeType::KusamaLocal | + chain_spec::coretime::CoretimeRuntimeType::Polkadot | + chain_spec::coretime::CoretimeRuntimeType::PolkadotLocal | + chain_spec::coretime::CoretimeRuntimeType::Rococo | + chain_spec::coretime::CoretimeRuntimeType::RococoLocal | + chain_spec::coretime::CoretimeRuntimeType::RococoDevelopment | + chain_spec::coretime::CoretimeRuntimeType::Westend | + chain_spec::coretime::CoretimeRuntimeType::WestendLocal | + chain_spec::coretime::CoretimeRuntimeType::WestendDevelopment => + crate::service::start_generic_aura_lookahead_node::( + config, + polkadot_config, + collator_options, + id, + hwbench, + ) + .await + .map(|r| r.0), + } + .map_err(Into::into), + + Runtime::Penpal(_) | Runtime::Default => + crate::service::start_rococo_parachain_node::( + config, + polkadot_config, + collator_options, + id, + hwbench, + ) + .await + .map(|r| r.0) + .map_err(Into::into), + + Runtime::Glutton | Runtime::GluttonWestend => + crate::service::start_basic_lookahead_node::( + config, + polkadot_config, + collator_options, + id, + hwbench, + ) + .await + .map(|r| r.0) + .map_err(Into::into), + + Runtime::People(people_runtime_type) => match people_runtime_type { + chain_spec::people::PeopleRuntimeType::Kusama | + chain_spec::people::PeopleRuntimeType::KusamaLocal | + chain_spec::people::PeopleRuntimeType::Polkadot | + chain_spec::people::PeopleRuntimeType::PolkadotLocal | + chain_spec::people::PeopleRuntimeType::Rococo | + chain_spec::people::PeopleRuntimeType::RococoLocal | + chain_spec::people::PeopleRuntimeType::RococoDevelopment | + chain_spec::people::PeopleRuntimeType::Westend | + chain_spec::people::PeopleRuntimeType::WestendLocal | + chain_spec::people::PeopleRuntimeType::WestendDevelopment => + crate::service::start_generic_aura_lookahead_node::( + config, + polkadot_config, + collator_options, + id, + hwbench, + ) + .await + .map(|r| r.0), + } + .map_err(Into::into), + } +} + impl DefaultConfigurationValues for RelayChainCli { fn p2p_listen_port() -> u16 { 30334 diff --git a/cumulus/polkadot-parachain/src/fake_runtime_api/asset_hub_polkadot_aura.rs b/cumulus/polkadot-parachain/src/fake_runtime_api/asset_hub_polkadot_aura.rs index 52cb79f16873f880c6dfef14543b633fca2a645b..a1bd49abd06583b5b56f63ce6b3920498542397d 100644 --- a/cumulus/polkadot-parachain/src/fake_runtime_api/asset_hub_polkadot_aura.rs +++ b/cumulus/polkadot-parachain/src/fake_runtime_api/asset_hub_polkadot_aura.rs @@ -39,7 +39,7 @@ sp_api::impl_runtime_apis! { unimplemented!() } - fn initialize_block(_: &::Header) { + fn initialize_block(_: &::Header) -> sp_runtime::ExtrinsicInclusionMode { unimplemented!() } } @@ -186,11 +186,15 @@ sp_api::impl_runtime_apis! { } impl sp_genesis_builder::GenesisBuilder for Runtime { - fn create_default_config() -> Vec { + fn build_state(_: Vec) -> sp_genesis_builder::Result { unimplemented!() } - fn build_config(_: Vec) -> sp_genesis_builder::Result { + fn get_preset(_id: &Option) -> Option> { + unimplemented!() + } + + fn preset_names() -> Vec { unimplemented!() } } diff --git a/cumulus/polkadot-parachain/src/fake_runtime_api/aura.rs b/cumulus/polkadot-parachain/src/fake_runtime_api/aura.rs index 30a90af5038ea38c2070edda3db65fcb79e3021d..5b833254c0f7366a869ccfcb7dc7789c678a240b 100644 --- a/cumulus/polkadot-parachain/src/fake_runtime_api/aura.rs +++ b/cumulus/polkadot-parachain/src/fake_runtime_api/aura.rs @@ -39,7 +39,7 @@ sp_api::impl_runtime_apis! { unimplemented!() } - fn initialize_block(_: &::Header) { + fn initialize_block(_: &::Header) -> sp_runtime::ExtrinsicInclusionMode { unimplemented!() } } @@ -186,11 +186,15 @@ sp_api::impl_runtime_apis! { } impl sp_genesis_builder::GenesisBuilder for Runtime { - fn create_default_config() -> Vec { + fn build_state(_: Vec) -> sp_genesis_builder::Result { unimplemented!() } - fn build_config(_: Vec) -> sp_genesis_builder::Result { + fn get_preset(_id: &Option) -> Option> { + unimplemented!() + } + + fn preset_names() -> Vec { unimplemented!() } } diff --git a/cumulus/polkadot-parachain/src/service.rs b/cumulus/polkadot-parachain/src/service.rs index daeeadd5ecee6986b73c540415e8c67d83fc97dd..12eda3e8a9cbe21f528398125e50ed57a4bc1933 100644 --- a/cumulus/polkadot-parachain/src/service.rs +++ b/cumulus/polkadot-parachain/src/service.rs @@ -17,10 +17,7 @@ use codec::{Codec, Decode}; use cumulus_client_cli::CollatorOptions; use cumulus_client_collator::service::CollatorService; -use cumulus_client_consensus_aura::collators::{ - basic::{self as basic_aura, Params as BasicAuraParams}, - lookahead::{self as aura, Params as AuraParams}, -}; +use cumulus_client_consensus_aura::collators::lookahead::{self as aura, Params as AuraParams}; use cumulus_client_consensus_common::{ ParachainBlockImport as TParachainBlockImport, ParachainCandidate, ParachainConsensus, }; @@ -36,12 +33,13 @@ use cumulus_primitives_core::{ ParaId, }; use cumulus_relay_chain_interface::{OverseerHandle, RelayChainInterface}; +use sc_rpc::DenyUnsafe; use sp_core::Pair; use jsonrpsee::RpcModule; -use crate::{fake_runtime_api::aura::RuntimeApi, rpc}; -pub use parachains_common::{AccountId, Balance, Block, Hash, Header, Nonce}; +use crate::{fake_runtime_api::aura::RuntimeApi as FakeRuntimeApi, rpc}; +pub use parachains_common::{AccountId, AuraId, Balance, Block, Hash, Header, Nonce}; use cumulus_client_consensus_relay_chain::Verifier as RelayChainVerifier; use futures::{lock::Mutex, prelude::*}; @@ -50,7 +48,7 @@ use sc_consensus::{ BlockImportParams, ImportQueue, }; use sc_executor::{HeapAllocStrategy, WasmExecutor, DEFAULT_HEAP_ALLOC_STRATEGY}; -use sc_network::{config::FullNetworkConfiguration, NetworkBlock}; +use sc_network::{config::FullNetworkConfiguration, service::traits::NetworkBackend, NetworkBlock}; use sc_network_sync::SyncingService; use sc_service::{Configuration, PartialComponents, TFullBackend, TFullClient, TaskManager}; use sc_telemetry::{Telemetry, TelemetryHandle, TelemetryWorker, TelemetryWorkerHandle}; @@ -68,11 +66,13 @@ use substrate_prometheus_endpoint::Registry; use polkadot_primitives::CollatorPair; #[cfg(not(feature = "runtime-benchmarks"))] -type HostFunctions = sp_io::SubstrateHostFunctions; +type HostFunctions = cumulus_client_service::ParachainHostFunctions; #[cfg(feature = "runtime-benchmarks")] -type HostFunctions = - (sp_io::SubstrateHostFunctions, frame_benchmarking::benchmarking::HostFunctions); +type HostFunctions = ( + cumulus_client_service::ParachainHostFunctions, + frame_benchmarking::benchmarking::HostFunctions, +); type ParachainClient = TFullClient>; @@ -81,141 +81,6 @@ type ParachainBackend = TFullBackend; type ParachainBlockImport = TParachainBlockImport>, ParachainBackend>; -/// Native executor instance. -pub struct ShellRuntimeExecutor; - -impl sc_executor::NativeExecutionDispatch for ShellRuntimeExecutor { - type ExtendHostFunctions = (); - - fn dispatch(method: &str, data: &[u8]) -> Option> { - shell_runtime::api::dispatch(method, data) - } - - fn native_version() -> sc_executor::NativeVersion { - shell_runtime::native_version() - } -} - -/// Native Asset Hub Westend (Westmint) executor instance. -pub struct AssetHubWestendExecutor; -impl sc_executor::NativeExecutionDispatch for AssetHubWestendExecutor { - type ExtendHostFunctions = frame_benchmarking::benchmarking::HostFunctions; - - fn dispatch(method: &str, data: &[u8]) -> Option> { - asset_hub_westend_runtime::api::dispatch(method, data) - } - - fn native_version() -> sc_executor::NativeVersion { - asset_hub_westend_runtime::native_version() - } -} - -/// Native Westend Collectives executor instance. -pub struct CollectivesWestendRuntimeExecutor; - -impl sc_executor::NativeExecutionDispatch for CollectivesWestendRuntimeExecutor { - type ExtendHostFunctions = frame_benchmarking::benchmarking::HostFunctions; - - fn dispatch(method: &str, data: &[u8]) -> Option> { - collectives_westend_runtime::api::dispatch(method, data) - } - - fn native_version() -> sc_executor::NativeVersion { - collectives_westend_runtime::native_version() - } -} - -/// Native BridgeHubRococo executor instance. -pub struct BridgeHubRococoRuntimeExecutor; -impl sc_executor::NativeExecutionDispatch for BridgeHubRococoRuntimeExecutor { - type ExtendHostFunctions = frame_benchmarking::benchmarking::HostFunctions; - - fn dispatch(method: &str, data: &[u8]) -> Option> { - bridge_hub_rococo_runtime::api::dispatch(method, data) - } - - fn native_version() -> sc_executor::NativeVersion { - bridge_hub_rococo_runtime::native_version() - } -} - -/// Native `CoretimeRococo` executor instance. -pub struct CoretimeRococoRuntimeExecutor; -impl sc_executor::NativeExecutionDispatch for CoretimeRococoRuntimeExecutor { - type ExtendHostFunctions = frame_benchmarking::benchmarking::HostFunctions; - fn dispatch(method: &str, data: &[u8]) -> Option> { - coretime_rococo_runtime::api::dispatch(method, data) - } - fn native_version() -> sc_executor::NativeVersion { - coretime_rococo_runtime::native_version() - } -} - -/// Native `CoretimeWestend` executor instance. -pub struct CoretimeWestendRuntimeExecutor; -impl sc_executor::NativeExecutionDispatch for CoretimeWestendRuntimeExecutor { - type ExtendHostFunctions = frame_benchmarking::benchmarking::HostFunctions; - fn dispatch(method: &str, data: &[u8]) -> Option> { - coretime_westend_runtime::api::dispatch(method, data) - } - fn native_version() -> sc_executor::NativeVersion { - coretime_westend_runtime::native_version() - } -} - -/// Native contracts executor instance. -pub struct ContractsRococoRuntimeExecutor; -impl sc_executor::NativeExecutionDispatch for ContractsRococoRuntimeExecutor { - type ExtendHostFunctions = frame_benchmarking::benchmarking::HostFunctions; - - fn dispatch(method: &str, data: &[u8]) -> Option> { - contracts_rococo_runtime::api::dispatch(method, data) - } - - fn native_version() -> sc_executor::NativeVersion { - contracts_rococo_runtime::native_version() - } -} - -/// Native Westend Glutton executor instance. -pub struct GluttonWestendRuntimeExecutor; - -impl sc_executor::NativeExecutionDispatch for GluttonWestendRuntimeExecutor { - type ExtendHostFunctions = frame_benchmarking::benchmarking::HostFunctions; - - fn dispatch(method: &str, data: &[u8]) -> Option> { - glutton_westend_runtime::api::dispatch(method, data) - } - - fn native_version() -> sc_executor::NativeVersion { - glutton_westend_runtime::native_version() - } -} - -/// Native `PeopleWestend` executor instance. -pub struct PeopleWestendRuntimeExecutor; -impl sc_executor::NativeExecutionDispatch for PeopleWestendRuntimeExecutor { - type ExtendHostFunctions = frame_benchmarking::benchmarking::HostFunctions; - fn dispatch(method: &str, data: &[u8]) -> Option> { - people_westend_runtime::api::dispatch(method, data) - } - fn native_version() -> sc_executor::NativeVersion { - people_westend_runtime::native_version() - } -} - -/// Native `PeopleRococo` executor instance. -pub struct PeopleRococoRuntimeExecutor; -impl sc_executor::NativeExecutionDispatch for PeopleRococoRuntimeExecutor { - type ExtendHostFunctions = frame_benchmarking::benchmarking::HostFunctions; - fn dispatch(method: &str, data: &[u8]) -> Option> { - people_rococo_runtime::api::dispatch(method, data) - } - fn native_version() -> sc_executor::NativeVersion { - people_rococo_runtime::native_version() - } -} - /// Assembly of PartialComponents (enough to run chain ops subcommands) pub type Service = PartialComponents< ParachainClient, @@ -274,10 +139,11 @@ where .build(); let (client, backend, keystore_container, task_manager) = - sc_service::new_full_parts::( + sc_service::new_full_parts_record_import::( config, telemetry.as_ref().map(|(_, telemetry)| telemetry.handle()), executor, + true, )?; let client = Arc::new(client); @@ -318,12 +184,11 @@ where }) } -/// Start a shell node with the given parachain `Configuration` and relay chain `Configuration`. +/// Start a node with the given parachain `Configuration` and relay chain `Configuration`. /// -/// This is the actual implementation that is abstract over the executor and the runtime api for -/// shell nodes. +/// This is the actual implementation that is abstract over the executor and the runtime api. #[sc_tracing::logging::prefix_logs_with("Parachain")] -async fn start_shell_node_impl( +async fn start_node_impl( parachain_config: Configuration, polkadot_config: Configuration, collator_options: CollatorOptions, @@ -342,8 +207,15 @@ where + sp_api::ApiExt + sp_offchain::OffchainWorkerApi + sp_block_builder::BlockBuilder - + cumulus_primitives_core::CollectCollationInfo, - RB: Fn(Arc>) -> Result, sc_service::Error> + + cumulus_primitives_core::CollectCollationInfo + + pallet_transaction_payment_rpc::TransactionPaymentRuntimeApi + + frame_rpc_system::AccountNonceApi, + RB: Fn( + DenyUnsafe, + Arc>, + Arc, + Arc>>, + ) -> Result, sc_service::Error> + 'static, BIQ: FnOnce( Arc>, @@ -367,7 +239,9 @@ where CollatorPair, OverseerHandle, Arc>) + Send + Sync>, + Arc, ) -> Result<(), sc_service::Error>, + Net: NetworkBackend, { let parachain_config = prepare_node_config(parachain_config); @@ -378,7 +252,6 @@ where let backend = params.backend.clone(); let mut task_manager = params.task_manager; - let (relay_chain_interface, collator_key) = build_relay_chain_interface( polkadot_config, ¶chain_config, @@ -394,7 +267,7 @@ where let prometheus_registry = parachain_config.prometheus_registry().cloned(); let transaction_pool = params.transaction_pool.clone(); let import_queue_service = params.import_queue.service(); - let net_config = FullNetworkConfiguration::new(¶chain_config.network); + let net_config = FullNetworkConfiguration::<_, _, Net>::new(¶chain_config.network); let (network, system_rpc_tx, tx_handler_controller, start_network, sync_service) = build_network(BuildNetworkParams { @@ -410,8 +283,20 @@ where }) .await?; - let rpc_client = client.clone(); - let rpc_builder = Box::new(move |_, _| rpc_ext_builder(rpc_client.clone())); + let rpc_builder = { + let client = client.clone(); + let transaction_pool = transaction_pool.clone(); + let backend_for_rpc = backend.clone(); + + Box::new(move |deny_unsafe, _| { + rpc_ext_builder( + deny_unsafe, + client.clone(), + backend_for_rpc.clone(), + transaction_pool.clone(), + ) + }) + }; sc_service::spawn_tasks(sc_service::SpawnTasksParams { rpc_builder, @@ -488,6 +373,7 @@ where collator_key.expect("Command line arguments do not allow this. qed"), overseer_handle, announce_block, + backend.clone(), )?; } @@ -496,216 +382,248 @@ where Ok((task_manager, client)) } -/// Start a node with the given parachain `Configuration` and relay chain `Configuration`. -/// -/// This is the actual implementation that is abstract over the executor and the runtime api. -#[sc_tracing::logging::prefix_logs_with("Parachain")] -async fn start_node_impl( +/// Build the import queue for Aura-based runtimes. +pub fn build_aura_import_queue( + client: Arc>, + block_import: ParachainBlockImport, + config: &Configuration, + telemetry: Option, + task_manager: &TaskManager, +) -> Result, sc_service::Error> { + let slot_duration = cumulus_client_consensus_aura::slot_duration(&*client)?; + + cumulus_client_consensus_aura::import_queue::< + sp_consensus_aura::sr25519::AuthorityPair, + _, + _, + _, + _, + _, + >(cumulus_client_consensus_aura::ImportQueueParams { + block_import, + client, + create_inherent_data_providers: move |_, _| async move { + let timestamp = sp_timestamp::InherentDataProvider::from_system_time(); + + let slot = + sp_consensus_aura::inherents::InherentDataProvider::from_timestamp_and_slot_duration( + *timestamp, + slot_duration, + ); + + Ok((slot, timestamp)) + }, + registry: config.prometheus_registry(), + spawner: &task_manager.spawn_essential_handle(), + telemetry, + }) + .map_err(Into::into) +} + +/// Start a rococo parachain node. +pub async fn start_rococo_parachain_node>( parachain_config: Configuration, polkadot_config: Configuration, collator_options: CollatorOptions, - sybil_resistance_level: CollatorSybilResistance, para_id: ParaId, - _rpc_ext_builder: RB, - build_import_queue: BIQ, - start_consensus: SC, hwbench: Option, -) -> sc_service::error::Result<(TaskManager, Arc>)> +) -> sc_service::error::Result<(TaskManager, Arc>)> { + start_node_impl::( + parachain_config, + polkadot_config, + collator_options, + CollatorSybilResistance::Resistant, // Aura + para_id, + build_parachain_rpc_extensions::, + build_aura_import_queue, + start_lookahead_aura_consensus, + hwbench, + ) + .await +} + +/// Build the import queue for the shell runtime. +pub fn build_shell_import_queue( + client: Arc>, + block_import: ParachainBlockImport, + config: &Configuration, + _: Option, + task_manager: &TaskManager, +) -> Result, sc_service::Error> { + cumulus_client_consensus_relay_chain::import_queue( + client, + block_import, + |_, _| async { Ok(()) }, + &task_manager.spawn_essential_handle(), + config.prometheus_registry(), + ) + .map_err(Into::into) +} + +fn build_parachain_rpc_extensions( + deny_unsafe: sc_rpc::DenyUnsafe, + client: Arc>, + backend: Arc, + pool: Arc>>, +) -> Result, sc_service::Error> where RuntimeApi: ConstructRuntimeApi> + Send + Sync + 'static, RuntimeApi::RuntimeApi: sp_transaction_pool::runtime_api::TaggedTransactionQueue - + sp_api::Metadata - + sp_session::SessionKeys - + sp_api::ApiExt - + sp_offchain::OffchainWorkerApi + sp_block_builder::BlockBuilder - + cumulus_primitives_core::CollectCollationInfo + pallet_transaction_payment_rpc::TransactionPaymentRuntimeApi + frame_rpc_system::AccountNonceApi, - RB: Fn(Arc>) -> Result, sc_service::Error>, - BIQ: FnOnce( - Arc>, - ParachainBlockImport, - &Configuration, - Option, - &TaskManager, - ) -> Result, sc_service::Error>, - SC: FnOnce( - Arc>, - ParachainBlockImport, - Option<&Registry>, - Option, - &TaskManager, - Arc, - Arc>>, - Arc>, - KeystorePtr, - Duration, - ParaId, - CollatorPair, - OverseerHandle, - Arc>) + Send + Sync>, - Arc, - ) -> Result<(), sc_service::Error>, { - let parachain_config = prepare_node_config(parachain_config); + let deps = rpc::FullDeps { client, pool, deny_unsafe }; - let params = new_partial::(¶chain_config, build_import_queue)?; - let (block_import, mut telemetry, telemetry_worker_handle) = params.other; + rpc::create_full(deps, backend).map_err(Into::into) +} - let client = params.client.clone(); - let backend = params.backend.clone(); +fn build_contracts_rpc_extensions( + deny_unsafe: sc_rpc::DenyUnsafe, + client: Arc>, + _backend: Arc, + pool: Arc>>, +) -> Result, sc_service::Error> { + let deps = crate::rpc::FullDeps { client: client.clone(), pool: pool.clone(), deny_unsafe }; - let mut task_manager = params.task_manager; - let (relay_chain_interface, collator_key) = build_relay_chain_interface( + crate::rpc::create_contracts_rococo(deps).map_err(Into::into) +} + +/// Start a polkadot-shell parachain node. +pub async fn start_shell_node>( + parachain_config: Configuration, + polkadot_config: Configuration, + collator_options: CollatorOptions, + para_id: ParaId, + hwbench: Option, +) -> sc_service::error::Result<(TaskManager, Arc>)> { + start_node_impl::( + parachain_config, polkadot_config, - ¶chain_config, - telemetry_worker_handle, - &mut task_manager, - collator_options.clone(), - hwbench.clone(), + collator_options, + CollatorSybilResistance::Unresistant, // free-for-all consensus + para_id, + |_, _, _, _| Ok(RpcModule::new(())), + build_shell_import_queue, + start_relay_chain_consensus, + hwbench, ) .await - .map_err(|e| sc_service::Error::Application(Box::new(e) as Box<_>))?; - - let validator = parachain_config.role.is_authority(); - let prometheus_registry = parachain_config.prometheus_registry().cloned(); - let transaction_pool = params.transaction_pool.clone(); - let import_queue_service = params.import_queue.service(); - let net_config = FullNetworkConfiguration::new(¶chain_config.network); - - let (network, system_rpc_tx, tx_handler_controller, start_network, sync_service) = - build_network(BuildNetworkParams { - parachain_config: ¶chain_config, - net_config, - client: client.clone(), - transaction_pool: transaction_pool.clone(), - para_id, - spawn_handle: task_manager.spawn_handle(), - relay_chain_interface: relay_chain_interface.clone(), - import_queue: params.import_queue, - sybil_resistance_level, - }) - .await?; +} - let rpc_builder = { - let client = client.clone(); - let transaction_pool = transaction_pool.clone(); +enum BuildOnAccess { + Uninitialized(Option R + Send + Sync>>), + Initialized(R), +} - let backend_for_rpc = backend.clone(); - Box::new(move |deny_unsafe, _| { - let deps = rpc::FullDeps { - client: client.clone(), - pool: transaction_pool.clone(), - deny_unsafe, - }; +impl BuildOnAccess { + fn get_mut(&mut self) -> &mut R { + loop { + match self { + Self::Uninitialized(f) => { + *self = Self::Initialized((f.take().unwrap())()); + }, + Self::Initialized(ref mut r) => return r, + } + } + } +} - rpc::create_full(deps, backend_for_rpc.clone()).map_err(Into::into) - }) - }; +/// Special [`ParachainConsensus`] implementation that waits for the upgrade from +/// shell to a parachain runtime that implements Aura. +struct WaitForAuraConsensus { + client: Arc, + aura_consensus: Arc>>>>, + relay_chain_consensus: Arc>>>, + _phantom: PhantomData, +} - sc_service::spawn_tasks(sc_service::SpawnTasksParams { - rpc_builder, - client: client.clone(), - transaction_pool: transaction_pool.clone(), - task_manager: &mut task_manager, - config: parachain_config, - keystore: params.keystore_container.keystore(), - backend: backend.clone(), - network: network.clone(), - sync_service: sync_service.clone(), - system_rpc_tx, - tx_handler_controller, - telemetry: telemetry.as_mut(), - })?; - - if let Some(hwbench) = hwbench { - sc_sysinfo::print_hwbench(&hwbench); - if validator { - warn_if_slow_hardware(&hwbench); +impl Clone for WaitForAuraConsensus { + fn clone(&self) -> Self { + Self { + client: self.client.clone(), + aura_consensus: self.aura_consensus.clone(), + relay_chain_consensus: self.relay_chain_consensus.clone(), + _phantom: PhantomData, } + } +} - if let Some(ref mut telemetry) = telemetry { - let telemetry_handle = telemetry.handle(); - task_manager.spawn_handle().spawn( - "telemetry_hwbench", - None, - sc_sysinfo::initialize_hwbench_telemetry(telemetry_handle, hwbench), - ); +#[async_trait::async_trait] +impl ParachainConsensus for WaitForAuraConsensus +where + Client: sp_api::ProvideRuntimeApi + Send + Sync, + Client::Api: AuraApi, + AuraId: Send + Codec + Sync, +{ + async fn produce_candidate( + &mut self, + parent: &Header, + relay_parent: PHash, + validation_data: &PersistedValidationData, + ) -> Option> { + if self + .client + .runtime_api() + .has_api::>(parent.hash()) + .unwrap_or(false) + { + self.aura_consensus + .lock() + .await + .get_mut() + .produce_candidate(parent, relay_parent, validation_data) + .await + } else { + self.relay_chain_consensus + .lock() + .await + .produce_candidate(parent, relay_parent, validation_data) + .await } } +} - let announce_block = { - let sync_service = sync_service.clone(); - Arc::new(move |hash, data| sync_service.announce_block(hash, data)) - }; - - let relay_chain_slot_duration = Duration::from_secs(6); - - let overseer_handle = relay_chain_interface - .overseer_handle() - .map_err(|e| sc_service::Error::Application(Box::new(e)))?; +struct Verifier { + client: Arc, + aura_verifier: BuildOnAccess>>, + relay_chain_verifier: Box>, + _phantom: PhantomData, +} - start_relay_chain_tasks(StartRelayChainTasksParams { - client: client.clone(), - announce_block: announce_block.clone(), - para_id, - relay_chain_interface: relay_chain_interface.clone(), - task_manager: &mut task_manager, - da_recovery_profile: if validator { - DARecoveryProfile::Collator +#[async_trait::async_trait] +impl VerifierT for Verifier +where + Client: sp_api::ProvideRuntimeApi + Send + Sync, + Client::Api: AuraApi, + AuraId: Send + Sync + Codec, +{ + async fn verify( + &mut self, + block_import: BlockImportParams, + ) -> Result, String> { + if self + .client + .runtime_api() + .has_api::>(*block_import.header.parent_hash()) + .unwrap_or(false) + { + self.aura_verifier.get_mut().verify(block_import).await } else { - DARecoveryProfile::FullNode - }, - import_queue: import_queue_service, - relay_chain_slot_duration, - recovery_handle: Box::new(overseer_handle.clone()), - sync_service: sync_service.clone(), - })?; - - if validator { - start_consensus( - client.clone(), - block_import, - prometheus_registry.as_ref(), - telemetry.as_ref().map(|t| t.handle()), - &task_manager, - relay_chain_interface.clone(), - transaction_pool, - sync_service.clone(), - params.keystore_container.keystore(), - relay_chain_slot_duration, - para_id, - collator_key.expect("Command line arguments do not allow this. qed"), - overseer_handle, - announce_block, - backend.clone(), - )?; + self.relay_chain_verifier.verify(block_import).await + } } - - start_network.start_network(); - - Ok((task_manager, client)) } -/// Start a node with the given parachain `Configuration` and relay chain `Configuration`. -/// -/// This is the actual implementation that is abstract over the executor and the runtime api. -/// -/// This node is basic in the sense that it doesn't support functionality like transaction -/// payment. Intended to replace start_shell_node in use for glutton, shell, and seedling. -#[sc_tracing::logging::prefix_logs_with("Parachain")] -async fn start_basic_lookahead_node_impl( - parachain_config: Configuration, - polkadot_config: Configuration, - collator_options: CollatorOptions, - sybil_resistance_level: CollatorSybilResistance, - para_id: ParaId, - rpc_ext_builder: RB, - build_import_queue: BIQ, - start_consensus: SC, - hwbench: Option, -) -> sc_service::error::Result<(TaskManager, Arc>)> +/// Build the import queue for parachain runtimes that started with relay chain consensus and +/// switched to aura. +pub fn build_relay_to_aura_import_queue( + client: Arc>, + block_import: ParachainBlockImport, + config: &Configuration, + telemetry_handle: Option, + task_manager: &TaskManager, +) -> Result, sc_service::Error> where RuntimeApi: ConstructRuntimeApi> + Send + Sync + 'static, RuntimeApi::RuntimeApi: sp_transaction_pool::runtime_api::TaggedTransactionQueue @@ -714,1418 +632,124 @@ where + sp_api::ApiExt + sp_offchain::OffchainWorkerApi + sp_block_builder::BlockBuilder - + cumulus_primitives_core::CollectCollationInfo - + frame_rpc_system::AccountNonceApi, - RB: Fn(Arc>) -> Result, sc_service::Error> - + 'static, - BIQ: FnOnce( - Arc>, - ParachainBlockImport, - &Configuration, - Option, - &TaskManager, - ) -> Result, sc_service::Error>, - SC: FnOnce( - Arc>, - ParachainBlockImport, - Option<&Registry>, - Option, - &TaskManager, - Arc, - Arc>>, - Arc>, - KeystorePtr, - Duration, - ParaId, - CollatorPair, - OverseerHandle, - Arc>) + Send + Sync>, - Arc, - ) -> Result<(), sc_service::Error>, + + sp_consensus_aura::AuraApi::Pair as Pair>::Public>, + <::Pair as Pair>::Signature: + TryFrom> + std::hash::Hash + sp_runtime::traits::Member + Codec, { - let parachain_config = prepare_node_config(parachain_config); - - let params = new_partial::(¶chain_config, build_import_queue)?; - let (block_import, mut telemetry, telemetry_worker_handle) = params.other; + let verifier_client = client.clone(); - let client = params.client.clone(); - let backend = params.backend.clone(); - - let mut task_manager = params.task_manager; - let (relay_chain_interface, collator_key) = build_relay_chain_interface( - polkadot_config, - ¶chain_config, - telemetry_worker_handle, - &mut task_manager, - collator_options.clone(), - hwbench.clone(), - ) - .await - .map_err(|e| sc_service::Error::Application(Box::new(e) as Box<_>))?; - - let validator = parachain_config.role.is_authority(); - let prometheus_registry = parachain_config.prometheus_registry().cloned(); - let transaction_pool = params.transaction_pool.clone(); - let import_queue_service = params.import_queue.service(); - let net_config = FullNetworkConfiguration::new(¶chain_config.network); - - let (network, system_rpc_tx, tx_handler_controller, start_network, sync_service) = - build_network(BuildNetworkParams { - parachain_config: ¶chain_config, - net_config, - client: client.clone(), - transaction_pool: transaction_pool.clone(), - para_id, - spawn_handle: task_manager.spawn_handle(), - relay_chain_interface: relay_chain_interface.clone(), - import_queue: params.import_queue, - sybil_resistance_level, - }) - .await?; - - let rpc_client = client.clone(); - let rpc_builder = Box::new(move |_, _| rpc_ext_builder(rpc_client.clone())); - - sc_service::spawn_tasks(sc_service::SpawnTasksParams { - rpc_builder, - client: client.clone(), - transaction_pool: transaction_pool.clone(), - task_manager: &mut task_manager, - config: parachain_config, - keystore: params.keystore_container.keystore(), - backend: backend.clone(), - network: network.clone(), - sync_service: sync_service.clone(), - system_rpc_tx, - tx_handler_controller, - telemetry: telemetry.as_mut(), - })?; - - if let Some(hwbench) = hwbench { - sc_sysinfo::print_hwbench(&hwbench); - if validator { - warn_if_slow_hardware(&hwbench); - } - - if let Some(ref mut telemetry) = telemetry { - let telemetry_handle = telemetry.handle(); - task_manager.spawn_handle().spawn( - "telemetry_hwbench", - None, - sc_sysinfo::initialize_hwbench_telemetry(telemetry_handle, hwbench), - ); - } - } - - let announce_block = { - let sync_service = sync_service.clone(); - Arc::new(move |hash, data| sync_service.announce_block(hash, data)) - }; - - let relay_chain_slot_duration = Duration::from_secs(6); - - let overseer_handle = relay_chain_interface - .overseer_handle() - .map_err(|e| sc_service::Error::Application(Box::new(e)))?; - - start_relay_chain_tasks(StartRelayChainTasksParams { - client: client.clone(), - announce_block: announce_block.clone(), - para_id, - relay_chain_interface: relay_chain_interface.clone(), - task_manager: &mut task_manager, - da_recovery_profile: if validator { - DARecoveryProfile::Collator - } else { - DARecoveryProfile::FullNode - }, - import_queue: import_queue_service, - relay_chain_slot_duration, - recovery_handle: Box::new(overseer_handle.clone()), - sync_service: sync_service.clone(), - })?; - - if validator { - start_consensus( - client.clone(), - block_import, - prometheus_registry.as_ref(), - telemetry.as_ref().map(|t| t.handle()), - &task_manager, - relay_chain_interface.clone(), - transaction_pool, - sync_service.clone(), - params.keystore_container.keystore(), - relay_chain_slot_duration, - para_id, - collator_key.expect("Command line arguments do not allow this. qed"), - overseer_handle, - announce_block, - backend.clone(), - )?; - } - - start_network.start_network(); - - Ok((task_manager, client)) -} - -/// Build the import queue for the rococo parachain runtime. -pub fn rococo_parachain_build_import_queue( - client: Arc>, - block_import: ParachainBlockImport, - config: &Configuration, - telemetry: Option, - task_manager: &TaskManager, -) -> Result, sc_service::Error> { - let slot_duration = cumulus_client_consensus_aura::slot_duration(&*client)?; - - cumulus_client_consensus_aura::import_queue::< - sp_consensus_aura::sr25519::AuthorityPair, - _, - _, - _, - _, - _, - >(cumulus_client_consensus_aura::ImportQueueParams { - block_import, - client, - create_inherent_data_providers: move |_, _| async move { - let timestamp = sp_timestamp::InherentDataProvider::from_system_time(); - - let slot = - sp_consensus_aura::inherents::InherentDataProvider::from_timestamp_and_slot_duration( - *timestamp, - slot_duration, - ); - - Ok((slot, timestamp)) - }, - registry: config.prometheus_registry(), - spawner: &task_manager.spawn_essential_handle(), - telemetry, - }) - .map_err(Into::into) -} - -/// Start a rococo parachain node. -pub async fn start_rococo_parachain_node( - parachain_config: Configuration, - polkadot_config: Configuration, - collator_options: CollatorOptions, - para_id: ParaId, - hwbench: Option, -) -> sc_service::error::Result<(TaskManager, Arc>)> { - start_node_impl::( - parachain_config, - polkadot_config, - collator_options, - CollatorSybilResistance::Resistant, // Aura - para_id, - |_| Ok(RpcModule::new(())), - rococo_parachain_build_import_queue, - |client, - block_import, - prometheus_registry, - telemetry, - task_manager, - relay_chain_interface, - transaction_pool, - sync_oracle, - keystore, - relay_chain_slot_duration, - para_id, - collator_key, - overseer_handle, - announce_block, - backend| { - let slot_duration = cumulus_client_consensus_aura::slot_duration(&*client)?; - - let proposer_factory = sc_basic_authorship::ProposerFactory::with_proof_recording( - task_manager.spawn_handle(), - client.clone(), - transaction_pool, - prometheus_registry, - telemetry.clone(), - ); - let proposer = Proposer::new(proposer_factory); - - let collator_service = CollatorService::new( - client.clone(), - Arc::new(task_manager.spawn_handle()), - announce_block, - client.clone(), - ); - - let params = AuraParams { - create_inherent_data_providers: move |_, ()| async move { Ok(()) }, - block_import, - para_client: client.clone(), - para_backend: backend.clone(), - relay_client: relay_chain_interface, - code_hash_provider: move |block_hash| { - client.code_at(block_hash).ok().map(|c| ValidationCode::from(c).hash()) - }, - sync_oracle, - keystore, - collator_key, - para_id, - overseer_handle, - slot_duration, - relay_chain_slot_duration, - proposer, - collator_service, - authoring_duration: Duration::from_millis(1500), - reinitialize: false, - }; - - let fut = aura::run::< - Block, - sp_consensus_aura::sr25519::AuthorityPair, - _, - _, - _, - _, - _, - _, - _, - _, - _, - >(params); - task_manager.spawn_essential_handle().spawn("aura", None, fut); - - Ok(()) - }, - hwbench, - ) - .await -} - -/// Build the import queue for the shell runtime. -pub fn shell_build_import_queue( - client: Arc>, - block_import: ParachainBlockImport, - config: &Configuration, - _: Option, - task_manager: &TaskManager, -) -> Result, sc_service::Error> -where - RuntimeApi: ConstructRuntimeApi> + Send + Sync + 'static, - RuntimeApi::RuntimeApi: sp_transaction_pool::runtime_api::TaggedTransactionQueue - + sp_api::Metadata - + sp_session::SessionKeys - + sp_api::ApiExt - + sp_offchain::OffchainWorkerApi - + sp_block_builder::BlockBuilder, -{ - cumulus_client_consensus_relay_chain::import_queue( - client, - block_import, - |_, _| async { Ok(()) }, - &task_manager.spawn_essential_handle(), - config.prometheus_registry(), - ) - .map_err(Into::into) -} - -/// Start a polkadot-shell parachain node. -pub async fn start_shell_node( - parachain_config: Configuration, - polkadot_config: Configuration, - collator_options: CollatorOptions, - para_id: ParaId, - hwbench: Option, -) -> sc_service::error::Result<(TaskManager, Arc>)> -where - RuntimeApi: ConstructRuntimeApi> + Send + Sync + 'static, - RuntimeApi::RuntimeApi: sp_transaction_pool::runtime_api::TaggedTransactionQueue - + sp_api::Metadata - + sp_session::SessionKeys - + sp_api::ApiExt - + sp_offchain::OffchainWorkerApi - + sp_block_builder::BlockBuilder - + cumulus_primitives_core::CollectCollationInfo, -{ - start_shell_node_impl::( - parachain_config, - polkadot_config, - collator_options, - CollatorSybilResistance::Unresistant, // free-for-all consensus - para_id, - |_| Ok(RpcModule::new(())), - shell_build_import_queue, - |client, - block_import, - prometheus_registry, - telemetry, - task_manager, - relay_chain_interface, - transaction_pool, - _sync_oracle, - _keystore, - _relay_chain_slot_duration, - para_id, - collator_key, - overseer_handle, - announce_block| { - let proposer_factory = sc_basic_authorship::ProposerFactory::with_proof_recording( - task_manager.spawn_handle(), - client.clone(), - transaction_pool, - prometheus_registry, - telemetry, - ); - - let free_for_all = cumulus_client_consensus_relay_chain::build_relay_chain_consensus( - cumulus_client_consensus_relay_chain::BuildRelayChainConsensusParams { - para_id, - proposer_factory, - block_import, - relay_chain_interface: relay_chain_interface.clone(), - create_inherent_data_providers: move |_, (relay_parent, validation_data)| { - let relay_chain_interface = relay_chain_interface.clone(); - async move { - let parachain_inherent = - cumulus_client_parachain_inherent::ParachainInherentDataProvider::create_at( - relay_parent, - &relay_chain_interface, - &validation_data, - para_id, - ).await; - let parachain_inherent = parachain_inherent.ok_or_else(|| { - Box::::from( - "Failed to create parachain inherent", - ) - })?; - Ok(parachain_inherent) - } - }, - }, - ); - - let spawner = task_manager.spawn_handle(); - - // Required for free-for-all consensus - #[allow(deprecated)] - old_consensus::start_collator_sync(old_consensus::StartCollatorParams { - para_id, - block_status: client.clone(), - announce_block, - overseer_handle, - spawner, - key: collator_key, - parachain_consensus: free_for_all, - runtime_api: client.clone(), - }); - - Ok(()) - }, - hwbench, - ) - .await -} - -enum BuildOnAccess { - Uninitialized(Option R + Send + Sync>>), - Initialized(R), -} - -impl BuildOnAccess { - fn get_mut(&mut self) -> &mut R { - loop { - match self { - Self::Uninitialized(f) => { - *self = Self::Initialized((f.take().unwrap())()); - }, - Self::Initialized(ref mut r) => return r, - } - } - } -} - -/// Special [`ParachainConsensus`] implementation that waits for the upgrade from -/// shell to a parachain runtime that implements Aura. -struct WaitForAuraConsensus { - client: Arc, - aura_consensus: Arc>>>>, - relay_chain_consensus: Arc>>>, - _phantom: PhantomData, -} - -impl Clone for WaitForAuraConsensus { - fn clone(&self) -> Self { - Self { - client: self.client.clone(), - aura_consensus: self.aura_consensus.clone(), - relay_chain_consensus: self.relay_chain_consensus.clone(), - _phantom: PhantomData, - } - } -} - -#[async_trait::async_trait] -impl ParachainConsensus for WaitForAuraConsensus -where - Client: sp_api::ProvideRuntimeApi + Send + Sync, - Client::Api: AuraApi, - AuraId: Send + Codec + Sync, -{ - async fn produce_candidate( - &mut self, - parent: &Header, - relay_parent: PHash, - validation_data: &PersistedValidationData, - ) -> Option> { - if self - .client - .runtime_api() - .has_api::>(parent.hash()) - .unwrap_or(false) - { - self.aura_consensus - .lock() - .await - .get_mut() - .produce_candidate(parent, relay_parent, validation_data) - .await - } else { - self.relay_chain_consensus - .lock() - .await - .produce_candidate(parent, relay_parent, validation_data) - .await - } - } -} - -struct Verifier { - client: Arc, - aura_verifier: BuildOnAccess>>, - relay_chain_verifier: Box>, - _phantom: PhantomData, -} - -#[async_trait::async_trait] -impl VerifierT for Verifier -where - Client: sp_api::ProvideRuntimeApi + Send + Sync, - Client::Api: AuraApi, - AuraId: Send + Sync + Codec, -{ - async fn verify( - &mut self, - block_import: BlockImportParams, - ) -> Result, String> { - if self - .client - .runtime_api() - .has_api::>(*block_import.header.parent_hash()) - .unwrap_or(false) - { - self.aura_verifier.get_mut().verify(block_import).await - } else { - self.relay_chain_verifier.verify(block_import).await - } - } -} - -/// Build the import queue for Aura-based runtimes. -pub fn aura_build_import_queue( - client: Arc>, - block_import: ParachainBlockImport, - config: &Configuration, - telemetry_handle: Option, - task_manager: &TaskManager, -) -> Result, sc_service::Error> -where - RuntimeApi: ConstructRuntimeApi> + Send + Sync + 'static, - RuntimeApi::RuntimeApi: sp_transaction_pool::runtime_api::TaggedTransactionQueue - + sp_api::Metadata - + sp_session::SessionKeys - + sp_api::ApiExt - + sp_offchain::OffchainWorkerApi - + sp_block_builder::BlockBuilder - + sp_consensus_aura::AuraApi::Pair as Pair>::Public>, - <::Pair as Pair>::Signature: - TryFrom> + std::hash::Hash + sp_runtime::traits::Member + Codec, -{ - let client2 = client.clone(); - - let aura_verifier = move || { - let slot_duration = cumulus_client_consensus_aura::slot_duration(&*client2).unwrap(); - - Box::new(cumulus_client_consensus_aura::build_verifier::< - ::Pair, - _, - _, - _, - >(cumulus_client_consensus_aura::BuildVerifierParams { - client: client2.clone(), - create_inherent_data_providers: move |_, _| async move { - let timestamp = sp_timestamp::InherentDataProvider::from_system_time(); - - let slot = - sp_consensus_aura::inherents::InherentDataProvider::from_timestamp_and_slot_duration( - *timestamp, - slot_duration, - ); - - Ok((slot, timestamp)) - }, - telemetry: telemetry_handle, - })) as Box<_> - }; - - let relay_chain_verifier = - Box::new(RelayChainVerifier::new(client.clone(), |_, _| async { Ok(()) })) as Box<_>; - - let verifier = Verifier { - client, - relay_chain_verifier, - aura_verifier: BuildOnAccess::Uninitialized(Some(Box::new(aura_verifier))), - _phantom: PhantomData, - }; - - let registry = config.prometheus_registry(); - let spawner = task_manager.spawn_essential_handle(); - - Ok(BasicQueue::new(verifier, Box::new(block_import), None, &spawner, registry)) -} - -/// Start an aura powered parachain node. Some system chains use this. -pub async fn start_generic_aura_node( - parachain_config: Configuration, - polkadot_config: Configuration, - collator_options: CollatorOptions, - para_id: ParaId, - hwbench: Option, -) -> sc_service::error::Result<(TaskManager, Arc>)> -where - RuntimeApi: ConstructRuntimeApi> + Send + Sync + 'static, - RuntimeApi::RuntimeApi: sp_transaction_pool::runtime_api::TaggedTransactionQueue - + sp_api::Metadata - + sp_session::SessionKeys - + sp_api::ApiExt - + sp_offchain::OffchainWorkerApi - + sp_block_builder::BlockBuilder - + cumulus_primitives_core::CollectCollationInfo - + sp_consensus_aura::AuraApi::Pair as Pair>::Public> - + pallet_transaction_payment_rpc::TransactionPaymentRuntimeApi - + frame_rpc_system::AccountNonceApi, - <::Pair as Pair>::Signature: - TryFrom> + std::hash::Hash + sp_runtime::traits::Member + Codec, -{ - start_node_impl::( - parachain_config, - polkadot_config, - collator_options, - CollatorSybilResistance::Resistant, // Aura - para_id, - |_| Ok(RpcModule::new(())), - aura_build_import_queue::<_, AuraId>, - |client, - block_import, - prometheus_registry, - telemetry, - task_manager, - relay_chain_interface, - transaction_pool, - sync_oracle, - keystore, - relay_chain_slot_duration, - para_id, - collator_key, - overseer_handle, - announce_block, - _backend| { - let slot_duration = cumulus_client_consensus_aura::slot_duration(&*client)?; - - let proposer_factory = sc_basic_authorship::ProposerFactory::with_proof_recording( - task_manager.spawn_handle(), - client.clone(), - transaction_pool, - prometheus_registry, - telemetry.clone(), - ); - let proposer = Proposer::new(proposer_factory); - - let collator_service = CollatorService::new( - client.clone(), - Arc::new(task_manager.spawn_handle()), - announce_block, - client.clone(), - ); - - let params = BasicAuraParams { - create_inherent_data_providers: move |_, ()| async move { Ok(()) }, - block_import, - para_client: client, - relay_client: relay_chain_interface, - sync_oracle, - keystore, - collator_key, - para_id, - overseer_handle, - slot_duration, - relay_chain_slot_duration, - proposer, - collator_service, - // Very limited proposal time. - authoring_duration: Duration::from_millis(500), - collation_request_receiver: None, - }; - - let fut = - basic_aura::run::::Pair, _, _, _, _, _, _, _>(params); - task_manager.spawn_essential_handle().spawn("aura", None, fut); - - Ok(()) - }, - hwbench, - ) - .await -} - -/// Uses the lookahead collator to support async backing. -/// -/// Start an aura powered parachain node. Some system chains use this. -pub async fn start_generic_aura_lookahead_node( - parachain_config: Configuration, - polkadot_config: Configuration, - collator_options: CollatorOptions, - para_id: ParaId, - hwbench: Option, -) -> sc_service::error::Result<(TaskManager, Arc>)> -where - RuntimeApi: ConstructRuntimeApi> + Send + Sync + 'static, - RuntimeApi::RuntimeApi: sp_transaction_pool::runtime_api::TaggedTransactionQueue - + sp_api::Metadata - + sp_session::SessionKeys - + sp_api::ApiExt - + sp_offchain::OffchainWorkerApi - + sp_block_builder::BlockBuilder - + cumulus_primitives_core::CollectCollationInfo - + sp_consensus_aura::AuraApi::Pair as Pair>::Public> - + pallet_transaction_payment_rpc::TransactionPaymentRuntimeApi - + frame_rpc_system::AccountNonceApi - + cumulus_primitives_aura::AuraUnincludedSegmentApi, - <::Pair as Pair>::Signature: - TryFrom> + std::hash::Hash + sp_runtime::traits::Member + Codec, -{ - start_node_impl::( - parachain_config, - polkadot_config, - collator_options, - CollatorSybilResistance::Resistant, // Aura - para_id, - |_| Ok(RpcModule::new(())), - aura_build_import_queue::<_, AuraId>, - |client, - block_import, - prometheus_registry, - telemetry, - task_manager, - relay_chain_interface, - transaction_pool, - sync_oracle, - keystore, - relay_chain_slot_duration, - para_id, - collator_key, - overseer_handle, - announce_block, - backend| { - let slot_duration = cumulus_client_consensus_aura::slot_duration(&*client)?; - - let proposer_factory = sc_basic_authorship::ProposerFactory::with_proof_recording( - task_manager.spawn_handle(), - client.clone(), - transaction_pool, - prometheus_registry, - telemetry.clone(), - ); - let proposer = Proposer::new(proposer_factory); - - let collator_service = CollatorService::new( - client.clone(), - Arc::new(task_manager.spawn_handle()), - announce_block, - client.clone(), - ); - - let params = AuraParams { - create_inherent_data_providers: move |_, ()| async move { Ok(()) }, - block_import, - para_client: client.clone(), - para_backend: backend, - relay_client: relay_chain_interface, - code_hash_provider: move |block_hash| { - client.code_at(block_hash).ok().map(|c| ValidationCode::from(c).hash()) - }, - sync_oracle, - keystore, - collator_key, - para_id, - overseer_handle, - slot_duration, - relay_chain_slot_duration, - proposer, - collator_service, - authoring_duration: Duration::from_millis(1500), - reinitialize: false, - }; - - let fut = - aura::run::::Pair, _, _, _, _, _, _, _, _, _>(params); - task_manager.spawn_essential_handle().spawn("aura", None, fut); - - Ok(()) - }, - hwbench, - ) - .await -} - -/// Start a shell node which should later transition into an Aura powered parachain node. Asset Hub -/// uses this because at genesis, Asset Hub was on the `shell` runtime which didn't have Aura and -/// needs to sync and upgrade before it can run `AuraApi` functions. -pub async fn start_asset_hub_node( - parachain_config: Configuration, - polkadot_config: Configuration, - collator_options: CollatorOptions, - para_id: ParaId, - hwbench: Option, -) -> sc_service::error::Result<(TaskManager, Arc>)> -where - RuntimeApi: ConstructRuntimeApi> + Send + Sync + 'static, - RuntimeApi::RuntimeApi: sp_transaction_pool::runtime_api::TaggedTransactionQueue - + sp_api::Metadata - + sp_session::SessionKeys - + sp_api::ApiExt - + sp_offchain::OffchainWorkerApi - + sp_block_builder::BlockBuilder - + cumulus_primitives_core::CollectCollationInfo - + sp_consensus_aura::AuraApi::Pair as Pair>::Public> - + pallet_transaction_payment_rpc::TransactionPaymentRuntimeApi - + frame_rpc_system::AccountNonceApi, - <::Pair as Pair>::Signature: - TryFrom> + std::hash::Hash + sp_runtime::traits::Member + Codec, -{ - start_node_impl::( - parachain_config, - polkadot_config, - collator_options, - CollatorSybilResistance::Resistant, // Aura - para_id, - |_| Ok(RpcModule::new(())), - aura_build_import_queue::<_, AuraId>, - |client, - block_import, - prometheus_registry, - telemetry, - task_manager, - relay_chain_interface, - transaction_pool, - sync_oracle, - keystore, - relay_chain_slot_duration, - para_id, - collator_key, - overseer_handle, - announce_block, - _backend| { - let relay_chain_interface2 = relay_chain_interface.clone(); - - let collator_service = CollatorService::new( - client.clone(), - Arc::new(task_manager.spawn_handle()), - announce_block, - client.clone(), - ); - - let spawner = task_manager.spawn_handle(); - - let proposer_factory = sc_basic_authorship::ProposerFactory::with_proof_recording( - spawner, - client.clone(), - transaction_pool, - prometheus_registry, - telemetry.clone(), - ); - - let collation_future = Box::pin(async move { - // Start collating with the `shell` runtime while waiting for an upgrade to an Aura - // compatible runtime. - let mut request_stream = cumulus_client_collator::relay_chain_driven::init( - collator_key.clone(), - para_id, - overseer_handle.clone(), - ) - .await; - while let Some(request) = request_stream.next().await { - let pvd = request.persisted_validation_data().clone(); - let last_head_hash = - match ::Header::decode(&mut &pvd.parent_head.0[..]) { - Ok(header) => header.hash(), - Err(e) => { - log::error!("Could not decode the head data: {e}"); - request.complete(None); - continue - }, - }; - - // Check if we have upgraded to an Aura compatible runtime and transition if - // necessary. - if client - .runtime_api() - .has_api::>(last_head_hash) - .unwrap_or(false) - { - // Respond to this request before transitioning to Aura. - request.complete(None); - break - } - } - - // Move to Aura consensus. - let slot_duration = match cumulus_client_consensus_aura::slot_duration(&*client) { - Ok(d) => d, - Err(e) => { - log::error!("Could not get Aura slot duration: {e}"); - return - }, - }; - - let proposer = Proposer::new(proposer_factory); - - let params = BasicAuraParams { - create_inherent_data_providers: move |_, ()| async move { Ok(()) }, - block_import, - para_client: client, - relay_client: relay_chain_interface2, - sync_oracle, - keystore, - collator_key, - para_id, - overseer_handle, - slot_duration, - relay_chain_slot_duration, - proposer, - collator_service, - // Very limited proposal time. - authoring_duration: Duration::from_millis(500), - collation_request_receiver: Some(request_stream), - }; - - basic_aura::run::::Pair, _, _, _, _, _, _, _>(params) - .await - }); - - let spawner = task_manager.spawn_essential_handle(); - spawner.spawn_essential("cumulus-asset-hub-collator", None, collation_future); - - Ok(()) - }, - hwbench, - ) - .await -} - -/// Start a shell node which should later transition into an Aura powered parachain node. Asset Hub -/// uses this because at genesis, Asset Hub was on the `shell` runtime which didn't have Aura and -/// needs to sync and upgrade before it can run `AuraApi` functions. -/// -/// Uses the lookahead collator to support async backing. -#[sc_tracing::logging::prefix_logs_with("Parachain")] -pub async fn start_asset_hub_lookahead_node( - parachain_config: Configuration, - polkadot_config: Configuration, - collator_options: CollatorOptions, - para_id: ParaId, - hwbench: Option, -) -> sc_service::error::Result<(TaskManager, Arc>)> -where - RuntimeApi: ConstructRuntimeApi> + Send + Sync + 'static, - RuntimeApi::RuntimeApi: sp_transaction_pool::runtime_api::TaggedTransactionQueue - + sp_api::Metadata - + sp_session::SessionKeys - + sp_api::ApiExt - + sp_offchain::OffchainWorkerApi - + sp_block_builder::BlockBuilder - + cumulus_primitives_core::CollectCollationInfo - + sp_consensus_aura::AuraApi::Pair as Pair>::Public> - + pallet_transaction_payment_rpc::TransactionPaymentRuntimeApi - + frame_rpc_system::AccountNonceApi - + cumulus_primitives_aura::AuraUnincludedSegmentApi, - <::Pair as Pair>::Signature: - TryFrom> + std::hash::Hash + sp_runtime::traits::Member + Codec, -{ - start_node_impl::( - parachain_config, - polkadot_config, - collator_options, - CollatorSybilResistance::Resistant, // Aura - para_id, - |_| Ok(RpcModule::new(())), - aura_build_import_queue::<_, AuraId>, - |client, - block_import, - prometheus_registry, - telemetry, - task_manager, - relay_chain_interface, - transaction_pool, - sync_oracle, - keystore, - relay_chain_slot_duration, - para_id, - collator_key, - overseer_handle, - announce_block, - backend| { - let relay_chain_interface2 = relay_chain_interface.clone(); - - let collator_service = CollatorService::new( - client.clone(), - Arc::new(task_manager.spawn_handle()), - announce_block, - client.clone(), - ); - - let spawner = task_manager.spawn_handle(); - - let proposer_factory = sc_basic_authorship::ProposerFactory::with_proof_recording( - spawner, - client.clone(), - transaction_pool, - prometheus_registry, - telemetry.clone(), - ); - - let collation_future = Box::pin(async move { - // Start collating with the `shell` runtime while waiting for an upgrade to an Aura - // compatible runtime. - let mut request_stream = cumulus_client_collator::relay_chain_driven::init( - collator_key.clone(), - para_id, - overseer_handle.clone(), - ) - .await; - while let Some(request) = request_stream.next().await { - let pvd = request.persisted_validation_data().clone(); - let last_head_hash = - match ::Header::decode(&mut &pvd.parent_head.0[..]) { - Ok(header) => header.hash(), - Err(e) => { - log::error!("Could not decode the head data: {e}"); - request.complete(None); - continue - }, - }; - - // Check if we have upgraded to an Aura compatible runtime and transition if - // necessary. - if client - .runtime_api() - .has_api::>(last_head_hash) - .unwrap_or(false) - { - // Respond to this request before transitioning to Aura. - request.complete(None); - break - } - } - - // Move to Aura consensus. - let slot_duration = match cumulus_client_consensus_aura::slot_duration(&*client) { - Ok(d) => d, - Err(e) => { - log::error!("Could not get Aura slot duration: {e}"); - return - }, - }; - - let proposer = Proposer::new(proposer_factory); - - let params = AuraParams { - create_inherent_data_providers: move |_, ()| async move { Ok(()) }, - block_import, - para_client: client.clone(), - para_backend: backend, - relay_client: relay_chain_interface2, - code_hash_provider: move |block_hash| { - client.code_at(block_hash).ok().map(|c| ValidationCode::from(c).hash()) - }, - sync_oracle, - keystore, - collator_key, - para_id, - overseer_handle, - slot_duration, - relay_chain_slot_duration, - proposer, - collator_service, - authoring_duration: Duration::from_millis(1500), - reinitialize: true, /* we need to always re-initialize for asset-hub moving - * to aura */ - }; - - aura::run::::Pair, _, _, _, _, _, _, _, _, _>(params) - .await - }); - - let spawner = task_manager.spawn_essential_handle(); - spawner.spawn_essential("cumulus-asset-hub-collator", None, collation_future); - - Ok(()) - }, - hwbench, - ) - .await -} - -/// Start an aura powered parachain node which uses the lookahead collator to support async backing. -/// This node is basic in the sense that its runtime api doesn't include common contents such as -/// transaction payment. Used for aura glutton. -pub async fn start_basic_lookahead_node( - parachain_config: Configuration, - polkadot_config: Configuration, - collator_options: CollatorOptions, - para_id: ParaId, - hwbench: Option, -) -> sc_service::error::Result<(TaskManager, Arc>)> -where - RuntimeApi: ConstructRuntimeApi> + Send + Sync + 'static, - RuntimeApi::RuntimeApi: sp_transaction_pool::runtime_api::TaggedTransactionQueue - + sp_api::Metadata - + sp_session::SessionKeys - + sp_api::ApiExt - + sp_offchain::OffchainWorkerApi - + sp_block_builder::BlockBuilder - + cumulus_primitives_core::CollectCollationInfo - + sp_consensus_aura::AuraApi::Pair as Pair>::Public> - + frame_rpc_system::AccountNonceApi - + cumulus_primitives_aura::AuraUnincludedSegmentApi, - <::Pair as Pair>::Signature: - TryFrom> + std::hash::Hash + sp_runtime::traits::Member + Codec, -{ - start_basic_lookahead_node_impl::( - parachain_config, - polkadot_config, - collator_options, - CollatorSybilResistance::Resistant, // Aura - para_id, - |_| Ok(RpcModule::new(())), - aura_build_import_queue::<_, AuraId>, - |client, - block_import, - prometheus_registry, - telemetry, - task_manager, - relay_chain_interface, - transaction_pool, - sync_oracle, - keystore, - relay_chain_slot_duration, - para_id, - collator_key, - overseer_handle, - announce_block, - backend| { - let slot_duration = cumulus_client_consensus_aura::slot_duration(&*client)?; - - let proposer_factory = sc_basic_authorship::ProposerFactory::with_proof_recording( - task_manager.spawn_handle(), - client.clone(), - transaction_pool, - prometheus_registry, - telemetry.clone(), - ); - let proposer = Proposer::new(proposer_factory); - - let collator_service = CollatorService::new( - client.clone(), - Arc::new(task_manager.spawn_handle()), - announce_block, - client.clone(), - ); - - let params = AuraParams { - create_inherent_data_providers: move |_, ()| async move { Ok(()) }, - block_import, - para_client: client.clone(), - para_backend: backend.clone(), - relay_client: relay_chain_interface, - code_hash_provider: move |block_hash| { - client.code_at(block_hash).ok().map(|c| ValidationCode::from(c).hash()) - }, - sync_oracle, - keystore, - collator_key, - para_id, - overseer_handle, - slot_duration, - relay_chain_slot_duration, - proposer, - collator_service, - authoring_duration: Duration::from_millis(1500), - reinitialize: false, - }; - - let fut = - aura::run::::Pair, _, _, _, _, _, _, _, _, _>(params); - task_manager.spawn_essential_handle().spawn("aura", None, fut); - - Ok(()) - }, - hwbench, - ) - .await -} - -#[sc_tracing::logging::prefix_logs_with("Parachain")] -async fn start_contracts_rococo_node_impl( - parachain_config: Configuration, - polkadot_config: Configuration, - collator_options: CollatorOptions, - sybil_resistance_level: CollatorSybilResistance, - para_id: ParaId, - _rpc_ext_builder: RB, - build_import_queue: BIQ, - start_consensus: SC, - hwbench: Option, -) -> sc_service::error::Result<(TaskManager, Arc>)> -where - RuntimeApi: ConstructRuntimeApi> + Send + Sync + 'static, - RuntimeApi::RuntimeApi: sp_transaction_pool::runtime_api::TaggedTransactionQueue - + sp_api::Metadata - + sp_session::SessionKeys - + sp_api::ApiExt - + sp_offchain::OffchainWorkerApi - + sp_block_builder::BlockBuilder - + cumulus_primitives_core::CollectCollationInfo - + pallet_transaction_payment_rpc::TransactionPaymentRuntimeApi - + frame_rpc_system::AccountNonceApi - + cumulus_primitives_aura::AuraUnincludedSegmentApi, - RB: Fn(Arc>) -> Result, sc_service::Error>, - BIQ: FnOnce( - Arc>, - ParachainBlockImport, - &Configuration, - Option, - &TaskManager, - ) -> Result, sc_service::Error>, - SC: FnOnce( - Arc>, - ParachainBlockImport, - Option<&Registry>, - Option, - &TaskManager, - Arc, - Arc>>, - Arc>, - KeystorePtr, - Duration, - ParaId, - CollatorPair, - OverseerHandle, - Arc>) + Send + Sync>, - Arc, - ) -> Result<(), sc_service::Error>, -{ - let parachain_config = prepare_node_config(parachain_config); - - let params = new_partial::(¶chain_config, build_import_queue)?; - let (block_import, mut telemetry, telemetry_worker_handle) = params.other; - - let client = params.client.clone(); - let backend = params.backend.clone(); - let mut task_manager = params.task_manager; - - let (relay_chain_interface, collator_key) = build_relay_chain_interface( - polkadot_config, - ¶chain_config, - telemetry_worker_handle, - &mut task_manager, - collator_options.clone(), - hwbench.clone(), - ) - .await - .map_err(|e| sc_service::Error::Application(Box::new(e) as Box<_>))?; - - let validator = parachain_config.role.is_authority(); - let prometheus_registry = parachain_config.prometheus_registry().cloned(); - let transaction_pool = params.transaction_pool.clone(); - let import_queue_service = params.import_queue.service(); - let net_config = FullNetworkConfiguration::new(¶chain_config.network); - - let (network, system_rpc_tx, tx_handler_controller, start_network, sync_service) = - build_network(BuildNetworkParams { - parachain_config: ¶chain_config, - net_config, - client: client.clone(), - transaction_pool: transaction_pool.clone(), - para_id, - spawn_handle: task_manager.spawn_handle(), - relay_chain_interface: relay_chain_interface.clone(), - import_queue: params.import_queue, - sybil_resistance_level, - }) - .await?; - - let rpc_builder = { - let client = client.clone(); - let transaction_pool = transaction_pool.clone(); - - Box::new(move |deny_unsafe, _| { - let deps = crate::rpc::FullDeps { - client: client.clone(), - pool: transaction_pool.clone(), - deny_unsafe, - }; - - crate::rpc::create_contracts_rococo(deps).map_err(Into::into) - }) - }; - - sc_service::spawn_tasks(sc_service::SpawnTasksParams { - rpc_builder, - client: client.clone(), - transaction_pool: transaction_pool.clone(), - task_manager: &mut task_manager, - config: parachain_config, - keystore: params.keystore_container.keystore(), - backend: backend.clone(), - network: network.clone(), - sync_service: sync_service.clone(), - system_rpc_tx, - tx_handler_controller, - telemetry: telemetry.as_mut(), - })?; - - if let Some(hwbench) = hwbench { - sc_sysinfo::print_hwbench(&hwbench); - if validator { - warn_if_slow_hardware(&hwbench); - } - - if let Some(ref mut telemetry) = telemetry { - let telemetry_handle = telemetry.handle(); - task_manager.spawn_handle().spawn( - "telemetry_hwbench", - None, - sc_sysinfo::initialize_hwbench_telemetry(telemetry_handle, hwbench), - ); - } - } - - let announce_block = { - let sync_service = sync_service.clone(); - Arc::new(move |hash, data| sync_service.announce_block(hash, data)) - }; - - let relay_chain_slot_duration = Duration::from_secs(6); - - let overseer_handle = relay_chain_interface - .overseer_handle() - .map_err(|e| sc_service::Error::Application(Box::new(e)))?; - - start_relay_chain_tasks(StartRelayChainTasksParams { - client: client.clone(), - announce_block: announce_block.clone(), - para_id, - relay_chain_interface: relay_chain_interface.clone(), - task_manager: &mut task_manager, - da_recovery_profile: if validator { - DARecoveryProfile::Collator - } else { - DARecoveryProfile::FullNode - }, - import_queue: import_queue_service, - relay_chain_slot_duration, - recovery_handle: Box::new(overseer_handle.clone()), - sync_service: sync_service.clone(), - })?; - - if validator { - start_consensus( - client.clone(), - block_import, - prometheus_registry.as_ref(), - telemetry.as_ref().map(|t| t.handle()), - &task_manager, - relay_chain_interface.clone(), - transaction_pool, - sync_service.clone(), - params.keystore_container.keystore(), - relay_chain_slot_duration, - para_id, - collator_key.expect("Command line arguments do not allow this. qed"), - overseer_handle, - announce_block, - backend.clone(), - )?; - } - - start_network.start_network(); - - Ok((task_manager, client)) -} + let aura_verifier = move || { + Box::new(cumulus_client_consensus_aura::build_verifier::< + ::Pair, + _, + _, + _, + >(cumulus_client_consensus_aura::BuildVerifierParams { + client: verifier_client.clone(), + create_inherent_data_providers: move |parent_hash, _| { + let cidp_client = verifier_client.clone(); + async move { + let slot_duration = cumulus_client_consensus_aura::slot_duration_at( + &*cidp_client, + parent_hash, + )?; + let timestamp = sp_timestamp::InherentDataProvider::from_system_time(); + + let slot = + sp_consensus_aura::inherents::InherentDataProvider::from_timestamp_and_slot_duration( + *timestamp, + slot_duration, + ); + + Ok((slot, timestamp)) + } + }, + telemetry: telemetry_handle, + })) as Box<_> + }; -#[allow(clippy::type_complexity)] -pub fn contracts_rococo_build_import_queue( - client: Arc>, - block_import: ParachainBlockImport, - config: &Configuration, - telemetry: Option, - task_manager: &TaskManager, -) -> Result, sc_service::Error> { - let slot_duration = cumulus_client_consensus_aura::slot_duration(&*client)?; + let relay_chain_verifier = + Box::new(RelayChainVerifier::new(client.clone(), |_, _| async { Ok(()) })) as Box<_>; - cumulus_client_consensus_aura::import_queue::< - sp_consensus_aura::sr25519::AuthorityPair, - _, - _, - _, - _, - _, - >(cumulus_client_consensus_aura::ImportQueueParams { - block_import, + let verifier = Verifier { client, - create_inherent_data_providers: move |_, _| async move { - let timestamp = sp_timestamp::InherentDataProvider::from_system_time(); + relay_chain_verifier, + aura_verifier: BuildOnAccess::Uninitialized(Some(Box::new(aura_verifier))), + _phantom: PhantomData, + }; - let slot = - sp_consensus_aura::inherents::InherentDataProvider::from_timestamp_and_slot_duration( - *timestamp, - slot_duration, - ); + let registry = config.prometheus_registry(); + let spawner = task_manager.spawn_essential_handle(); - Ok((slot, timestamp)) - }, - registry: config.prometheus_registry(), - spawner: &task_manager.spawn_essential_handle(), - telemetry, - }) - .map_err(Into::into) + Ok(BasicQueue::new(verifier, Box::new(block_import), None, &spawner, registry)) +} + +/// Uses the lookahead collator to support async backing. +/// +/// Start an aura powered parachain node. Some system chains use this. +pub async fn start_generic_aura_lookahead_node>( + parachain_config: Configuration, + polkadot_config: Configuration, + collator_options: CollatorOptions, + para_id: ParaId, + hwbench: Option, +) -> sc_service::error::Result<(TaskManager, Arc>)> { + start_node_impl::( + parachain_config, + polkadot_config, + collator_options, + CollatorSybilResistance::Resistant, // Aura + para_id, + build_parachain_rpc_extensions::, + build_relay_to_aura_import_queue::<_, AuraId>, + start_lookahead_aura_consensus, + hwbench, + ) + .await } -/// Start a parachain node. -pub async fn start_contracts_rococo_node( +/// Start a shell node which should later transition into an Aura powered parachain node. Asset Hub +/// uses this because at genesis, Asset Hub was on the `shell` runtime which didn't have Aura and +/// needs to sync and upgrade before it can run `AuraApi` functions. +/// +/// Uses the lookahead collator to support async backing. +#[sc_tracing::logging::prefix_logs_with("Parachain")] +pub async fn start_asset_hub_lookahead_node< + RuntimeApi, + AuraId: AppCrypto + Send + Codec + Sync, + Net, +>( parachain_config: Configuration, polkadot_config: Configuration, collator_options: CollatorOptions, para_id: ParaId, hwbench: Option, -) -> sc_service::error::Result<(TaskManager, Arc>)> { - start_contracts_rococo_node_impl::( +) -> sc_service::error::Result<(TaskManager, Arc>)> +where + RuntimeApi: ConstructRuntimeApi> + Send + Sync + 'static, + RuntimeApi::RuntimeApi: sp_transaction_pool::runtime_api::TaggedTransactionQueue + + sp_api::Metadata + + sp_session::SessionKeys + + sp_api::ApiExt + + sp_offchain::OffchainWorkerApi + + sp_block_builder::BlockBuilder + + cumulus_primitives_core::CollectCollationInfo + + sp_consensus_aura::AuraApi::Pair as Pair>::Public> + + pallet_transaction_payment_rpc::TransactionPaymentRuntimeApi + + frame_rpc_system::AccountNonceApi + + cumulus_primitives_aura::AuraUnincludedSegmentApi, + <::Pair as Pair>::Signature: + TryFrom> + std::hash::Hash + sp_runtime::traits::Member + Codec, + Net: NetworkBackend, +{ + start_node_impl::( parachain_config, polkadot_config, collator_options, CollatorSybilResistance::Resistant, // Aura para_id, - |_| Ok(RpcModule::new(())), - contracts_rococo_build_import_queue, + build_parachain_rpc_extensions::, + build_relay_to_aura_import_queue::<_, AuraId>, |client, block_import, prometheus_registry, @@ -2141,61 +765,90 @@ pub async fn start_contracts_rococo_node( overseer_handle, announce_block, backend| { - let slot_duration = cumulus_client_consensus_aura::slot_duration(&*client)?; + let relay_chain_interface2 = relay_chain_interface.clone(); + + let collator_service = CollatorService::new( + client.clone(), + Arc::new(task_manager.spawn_handle()), + announce_block, + client.clone(), + ); + + let spawner = task_manager.spawn_handle(); let proposer_factory = sc_basic_authorship::ProposerFactory::with_proof_recording( - task_manager.spawn_handle(), + spawner, client.clone(), transaction_pool, prometheus_registry, telemetry.clone(), ); - let proposer = Proposer::new(proposer_factory); - let collator_service = CollatorService::new( - client.clone(), - Arc::new(task_manager.spawn_handle()), - announce_block, - client.clone(), - ); + let collation_future = Box::pin(async move { + // Start collating with the `shell` runtime while waiting for an upgrade to an Aura + // compatible runtime. + let mut request_stream = cumulus_client_collator::relay_chain_driven::init( + collator_key.clone(), + para_id, + overseer_handle.clone(), + ) + .await; + while let Some(request) = request_stream.next().await { + let pvd = request.persisted_validation_data().clone(); + let last_head_hash = + match ::Header::decode(&mut &pvd.parent_head.0[..]) { + Ok(header) => header.hash(), + Err(e) => { + log::error!("Could not decode the head data: {e}"); + request.complete(None); + continue + }, + }; - let params = AuraParams { - create_inherent_data_providers: move |_, ()| async move { Ok(()) }, - block_import, - para_client: client.clone(), - para_backend: backend.clone(), - relay_client: relay_chain_interface, - code_hash_provider: move |block_hash| { - client.code_at(block_hash).ok().map(|c| ValidationCode::from(c).hash()) - }, - sync_oracle, - keystore, - collator_key, - para_id, - overseer_handle, - slot_duration, - relay_chain_slot_duration, - proposer, - collator_service, - // Very limited proposal time. - authoring_duration: Duration::from_millis(1500), - reinitialize: false, - }; - - let fut = aura::run::< - Block, - sp_consensus_aura::sr25519::AuthorityPair, - _, - _, - _, - _, - _, - _, - _, - _, - _, - >(params); - task_manager.spawn_essential_handle().spawn("aura", None, fut); + // Check if we have upgraded to an Aura compatible runtime and transition if + // necessary. + if client + .runtime_api() + .has_api::>(last_head_hash) + .unwrap_or(false) + { + // Respond to this request before transitioning to Aura. + request.complete(None); + break + } + } + + // Move to Aura consensus. + let proposer = Proposer::new(proposer_factory); + + let params = AuraParams { + create_inherent_data_providers: move |_, ()| async move { Ok(()) }, + block_import, + para_client: client.clone(), + para_backend: backend, + relay_client: relay_chain_interface2, + code_hash_provider: move |block_hash| { + client.code_at(block_hash).ok().map(|c| ValidationCode::from(c).hash()) + }, + sync_oracle, + keystore, + collator_key, + para_id, + overseer_handle, + relay_chain_slot_duration, + proposer, + collator_service, + authoring_duration: Duration::from_millis(1500), + reinitialize: true, /* we need to always re-initialize for asset-hub moving + * to aura */ + }; + + aura::run::::Pair, _, _, _, _, _, _, _, _, _>(params) + .await + }); + + let spawner = task_manager.spawn_essential_handle(); + spawner.spawn_essential("cumulus-asset-hub-collator", None, collation_future); Ok(()) }, @@ -2204,6 +857,184 @@ pub async fn start_contracts_rococo_node( .await } +/// Start relay-chain consensus that is free for all. Everyone can submit a block, the relay-chain +/// decides what is backed and included. +fn start_relay_chain_consensus( + client: Arc>, + block_import: ParachainBlockImport, + prometheus_registry: Option<&Registry>, + telemetry: Option, + task_manager: &TaskManager, + relay_chain_interface: Arc, + transaction_pool: Arc>>, + _sync_oracle: Arc>, + _keystore: KeystorePtr, + _relay_chain_slot_duration: Duration, + para_id: ParaId, + collator_key: CollatorPair, + overseer_handle: OverseerHandle, + announce_block: Arc>) + Send + Sync>, + _backend: Arc, +) -> Result<(), sc_service::Error> { + let proposer_factory = sc_basic_authorship::ProposerFactory::with_proof_recording( + task_manager.spawn_handle(), + client.clone(), + transaction_pool, + prometheus_registry, + telemetry, + ); + + let free_for_all = cumulus_client_consensus_relay_chain::build_relay_chain_consensus( + cumulus_client_consensus_relay_chain::BuildRelayChainConsensusParams { + para_id, + proposer_factory, + block_import, + relay_chain_interface: relay_chain_interface.clone(), + create_inherent_data_providers: move |_, (relay_parent, validation_data)| { + let relay_chain_interface = relay_chain_interface.clone(); + async move { + let parachain_inherent = + cumulus_client_parachain_inherent::ParachainInherentDataProvider::create_at( + relay_parent, + &relay_chain_interface, + &validation_data, + para_id, + ).await; + let parachain_inherent = parachain_inherent.ok_or_else(|| { + Box::::from( + "Failed to create parachain inherent", + ) + })?; + Ok(parachain_inherent) + } + }, + }, + ); + + let spawner = task_manager.spawn_handle(); + + // Required for free-for-all consensus + #[allow(deprecated)] + old_consensus::start_collator_sync(old_consensus::StartCollatorParams { + para_id, + block_status: client.clone(), + announce_block, + overseer_handle, + spawner, + key: collator_key, + parachain_consensus: free_for_all, + runtime_api: client.clone(), + }); + + Ok(()) +} + +/// Start consensus using the lookahead aura collator. +fn start_lookahead_aura_consensus( + client: Arc>, + block_import: ParachainBlockImport, + prometheus_registry: Option<&Registry>, + telemetry: Option, + task_manager: &TaskManager, + relay_chain_interface: Arc, + transaction_pool: Arc>>, + sync_oracle: Arc>, + keystore: KeystorePtr, + relay_chain_slot_duration: Duration, + para_id: ParaId, + collator_key: CollatorPair, + overseer_handle: OverseerHandle, + announce_block: Arc>) + Send + Sync>, + backend: Arc, +) -> Result<(), sc_service::Error> { + let proposer_factory = sc_basic_authorship::ProposerFactory::with_proof_recording( + task_manager.spawn_handle(), + client.clone(), + transaction_pool, + prometheus_registry, + telemetry.clone(), + ); + + let collator_service = CollatorService::new( + client.clone(), + Arc::new(task_manager.spawn_handle()), + announce_block, + client.clone(), + ); + + let params = AuraParams { + create_inherent_data_providers: move |_, ()| async move { Ok(()) }, + block_import, + para_client: client.clone(), + para_backend: backend, + relay_client: relay_chain_interface, + code_hash_provider: move |block_hash| { + client.code_at(block_hash).ok().map(|c| ValidationCode::from(c).hash()) + }, + sync_oracle, + keystore, + collator_key, + para_id, + overseer_handle, + relay_chain_slot_duration, + proposer: Proposer::new(proposer_factory), + collator_service, + authoring_duration: Duration::from_millis(1500), + reinitialize: false, + }; + + let fut = aura::run::::Pair, _, _, _, _, _, _, _, _, _>(params); + task_manager.spawn_essential_handle().spawn("aura", None, fut); + + Ok(()) +} + +/// Start an aura powered parachain node which uses the lookahead collator to support async backing. +/// This node is basic in the sense that its runtime api doesn't include common contents such as +/// transaction payment. Used for aura glutton. +pub async fn start_basic_lookahead_node>( + parachain_config: Configuration, + polkadot_config: Configuration, + collator_options: CollatorOptions, + para_id: ParaId, + hwbench: Option, +) -> sc_service::error::Result<(TaskManager, Arc>)> { + start_node_impl::( + parachain_config, + polkadot_config, + collator_options, + CollatorSybilResistance::Resistant, // Aura + para_id, + |_, _, _, _| Ok(RpcModule::new(())), + build_relay_to_aura_import_queue::<_, AuraId>, + start_lookahead_aura_consensus, + hwbench, + ) + .await +} + +/// Start a parachain node for Rococo Contracts. +pub async fn start_contracts_rococo_node>( + parachain_config: Configuration, + polkadot_config: Configuration, + collator_options: CollatorOptions, + para_id: ParaId, + hwbench: Option, +) -> sc_service::error::Result<(TaskManager, Arc>)> { + start_node_impl::( + parachain_config, + polkadot_config, + collator_options, + CollatorSybilResistance::Resistant, // Aura + para_id, + build_contracts_rpc_extensions, + build_aura_import_queue, + start_lookahead_aura_consensus, + hwbench, + ) + .await +} + /// Checks that the hardware meets the requirements and print a warning otherwise. fn warn_if_slow_hardware(hwbench: &sc_sysinfo::HwBench) { // Polkadot para-chains should generally use these requirements to ensure that the relay-chain diff --git a/cumulus/primitives/core/Cargo.toml b/cumulus/primitives/core/Cargo.toml index 32c5054f359c4102a0c0a5ffdcb128bdc1ffd725..62c3f6751917ad4aaaaec6509c852a5cfd75d7f8 100644 --- a/cumulus/primitives/core/Cargo.toml +++ b/cumulus/primitives/core/Cargo.toml @@ -11,7 +11,7 @@ workspace = true [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } # Substrate sp-api = { path = "../../../substrate/primitives/api", default-features = false } diff --git a/cumulus/primitives/parachain-inherent/Cargo.toml b/cumulus/primitives/parachain-inherent/Cargo.toml index f434305a0ce013ae048087bf9a75413efacc1fff..fcf4c93bc2f01dc9e60f5ad2d74e302f5247b955 100644 --- a/cumulus/primitives/parachain-inherent/Cargo.toml +++ b/cumulus/primitives/parachain-inherent/Cargo.toml @@ -10,9 +10,9 @@ license = "Apache-2.0" workspace = true [dependencies] -async-trait = { version = "0.1.74", optional = true } +async-trait = { version = "0.1.79", optional = true } codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } # Substrate sp-core = { path = "../../../substrate/primitives/core", default-features = false } diff --git a/cumulus/primitives/proof-size-hostfunction/src/lib.rs b/cumulus/primitives/proof-size-hostfunction/src/lib.rs index 6da6235e585a343887f87931e375b21bec48c20d..8ebc58ea450d4aea023f2a3af218bbd9eb3546e9 100644 --- a/cumulus/primitives/proof-size-hostfunction/src/lib.rs +++ b/cumulus/primitives/proof-size-hostfunction/src/lib.rs @@ -18,6 +18,7 @@ #![cfg_attr(not(feature = "std"), no_std)] +#[cfg(feature = "std")] use sp_externalities::ExternalitiesExt; use sp_runtime_interface::runtime_interface; @@ -35,7 +36,8 @@ pub const PROOF_RECORDING_DISABLED: u64 = u64::MAX; pub trait StorageProofSize { /// Returns the current storage proof size. fn storage_proof_size(&mut self) -> u64 { - self.extension::().map_or(u64::MAX, |e| e.storage_proof_size()) + self.extension::() + .map_or(PROOF_RECORDING_DISABLED, |e| e.storage_proof_size()) } } diff --git a/cumulus/primitives/storage-weight-reclaim/Cargo.toml b/cumulus/primitives/storage-weight-reclaim/Cargo.toml new file mode 100644 index 0000000000000000000000000000000000000000..6dbf7904bf796e81415b967637d9770356142603 --- /dev/null +++ b/cumulus/primitives/storage-weight-reclaim/Cargo.toml @@ -0,0 +1,46 @@ +[package] +name = "cumulus-primitives-storage-weight-reclaim" +version = "1.0.0" +authors.workspace = true +edition.workspace = true +description = "Utilities to reclaim storage weight." +license = "Apache-2.0" + +[lints] +workspace = true + +[dependencies] +codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } +log = { workspace = true } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } + +frame-support = { path = "../../../substrate/frame/support", default-features = false } +frame-system = { path = "../../../substrate/frame/system", default-features = false } + +sp-runtime = { path = "../../../substrate/primitives/runtime", default-features = false } +sp-std = { path = "../../../substrate/primitives/std", default-features = false } + +cumulus-primitives-core = { path = "../core", default-features = false } +cumulus-primitives-proof-size-hostfunction = { path = "../proof-size-hostfunction", default-features = false } +docify = "0.2.8" + +[dev-dependencies] +sp-trie = { path = "../../../substrate/primitives/trie", default-features = false } +sp-io = { path = "../../../substrate/primitives/io", default-features = false } +cumulus-test-runtime = { path = "../../test/runtime" } + +[features] +default = ["std"] +std = [ + "codec/std", + "cumulus-primitives-core/std", + "cumulus-primitives-proof-size-hostfunction/std", + "frame-support/std", + "frame-system/std", + "log/std", + "scale-info/std", + "sp-io/std", + "sp-runtime/std", + "sp-std/std", + "sp-trie/std", +] diff --git a/cumulus/primitives/storage-weight-reclaim/src/lib.rs b/cumulus/primitives/storage-weight-reclaim/src/lib.rs new file mode 100644 index 0000000000000000000000000000000000000000..c09c12d7a0abf8ac3c64974390d47880af6ec6e9 --- /dev/null +++ b/cumulus/primitives/storage-weight-reclaim/src/lib.rs @@ -0,0 +1,663 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Mechanism to reclaim PoV proof size weight after an extrinsic has been applied. + +#![cfg_attr(not(feature = "std"), no_std)] + +use codec::{Decode, Encode}; +use cumulus_primitives_core::Weight; +use cumulus_primitives_proof_size_hostfunction::{ + storage_proof_size::storage_proof_size, PROOF_RECORDING_DISABLED, +}; +use frame_support::{ + dispatch::{DispatchInfo, PostDispatchInfo}, + weights::WeightMeter, +}; +use frame_system::Config; +use scale_info::TypeInfo; +use sp_runtime::{ + traits::{DispatchInfoOf, Dispatchable, PostDispatchInfoOf, SignedExtension}, + transaction_validity::TransactionValidityError, + DispatchResult, +}; +use sp_std::marker::PhantomData; + +const LOG_TARGET: &'static str = "runtime::storage_reclaim"; + +/// `StorageWeightReclaimer` is a mechanism for manually reclaiming storage weight. +/// +/// It internally keeps track of the proof size and storage weight at initialization time. At +/// reclaim it computes the real consumed storage weight and refunds excess weight. +/// +/// # Example +#[doc = docify::embed!("src/lib.rs", simple_reclaimer_example)] +pub struct StorageWeightReclaimer { + previous_remaining_proof_size: u64, + previous_reported_proof_size: Option, +} + +impl StorageWeightReclaimer { + /// Creates a new `StorageWeightReclaimer` instance and initializes it with the storage + /// size provided by `weight_meter` and reported proof size from the node. + #[must_use = "Must call `reclaim_with_meter` to reclaim the weight"] + pub fn new(weight_meter: &WeightMeter) -> StorageWeightReclaimer { + let previous_remaining_proof_size = weight_meter.remaining().proof_size(); + let previous_reported_proof_size = get_proof_size(); + Self { previous_remaining_proof_size, previous_reported_proof_size } + } + + /// Check the consumed storage weight and calculate the consumed excess weight. + fn reclaim(&mut self, remaining_weight: Weight) -> Option { + let current_remaining_weight = remaining_weight.proof_size(); + let current_storage_proof_size = get_proof_size()?; + let previous_storage_proof_size = self.previous_reported_proof_size?; + let used_weight = + self.previous_remaining_proof_size.saturating_sub(current_remaining_weight); + let reported_used_size = + current_storage_proof_size.saturating_sub(previous_storage_proof_size); + let reclaimable = used_weight.saturating_sub(reported_used_size); + log::trace!( + target: LOG_TARGET, + "Found reclaimable storage weight. benchmarked: {used_weight}, consumed: {reported_used_size}" + ); + + self.previous_remaining_proof_size = current_remaining_weight.saturating_add(reclaimable); + self.previous_reported_proof_size = Some(current_storage_proof_size); + Some(Weight::from_parts(0, reclaimable)) + } + + /// Check the consumed storage weight and add the reclaimed + /// weight budget back to `weight_meter`. + pub fn reclaim_with_meter(&mut self, weight_meter: &mut WeightMeter) -> Option { + let reclaimed = self.reclaim(weight_meter.remaining())?; + weight_meter.reclaim_proof_size(reclaimed.proof_size()); + Some(reclaimed) + } +} + +/// Returns the current storage proof size from the host side. +/// +/// Returns `None` if proof recording is disabled on the host. +pub fn get_proof_size() -> Option { + let proof_size = storage_proof_size(); + (proof_size != PROOF_RECORDING_DISABLED).then_some(proof_size) +} + +/// Storage weight reclaim mechanism. +/// +/// This extension checks the size of the node-side storage proof +/// before and after executing a given extrinsic. The difference between +/// benchmarked and spent weight can be reclaimed. +#[derive(Encode, Decode, Clone, Eq, PartialEq, Default, TypeInfo)] +#[scale_info(skip_type_params(T))] +pub struct StorageWeightReclaim(PhantomData); + +impl StorageWeightReclaim { + /// Create a new `StorageWeightReclaim` instance. + pub fn new() -> Self { + Self(Default::default()) + } +} + +impl core::fmt::Debug for StorageWeightReclaim { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> Result<(), core::fmt::Error> { + let _ = write!(f, "StorageWeightReclaim"); + Ok(()) + } +} + +impl SignedExtension for StorageWeightReclaim +where + T::RuntimeCall: Dispatchable, +{ + const IDENTIFIER: &'static str = "StorageWeightReclaim"; + + type AccountId = T::AccountId; + type Call = T::RuntimeCall; + type AdditionalSigned = (); + type Pre = Option; + + fn additional_signed( + &self, + ) -> Result + { + Ok(()) + } + + fn pre_dispatch( + self, + _who: &Self::AccountId, + _call: &Self::Call, + _info: &sp_runtime::traits::DispatchInfoOf, + _len: usize, + ) -> Result { + Ok(get_proof_size()) + } + + fn post_dispatch( + pre: Option, + info: &DispatchInfoOf, + post_info: &PostDispatchInfoOf, + _len: usize, + _result: &DispatchResult, + ) -> Result<(), TransactionValidityError> { + let Some(Some(pre_dispatch_proof_size)) = pre else { + return Ok(()); + }; + + let Some(post_dispatch_proof_size) = get_proof_size() else { + log::debug!( + target: LOG_TARGET, + "Proof recording enabled during pre-dispatch, now disabled. This should not happen." + ); + return Ok(()) + }; + let benchmarked_weight = info.weight.proof_size(); + let consumed_weight = post_dispatch_proof_size.saturating_sub(pre_dispatch_proof_size); + + // Unspent weight according to the `actual_weight` from `PostDispatchInfo` + // This unspent weight will be refunded by the `CheckWeight` extension, so we need to + // account for that. + let unspent = post_info.calc_unspent(info).proof_size(); + let storage_size_diff = + benchmarked_weight.saturating_sub(unspent).abs_diff(consumed_weight as u64); + + // This value will be reclaimed by [`frame_system::CheckWeight`], so we need to calculate + // that in. + frame_system::BlockWeight::::mutate(|current| { + if consumed_weight > benchmarked_weight { + log::error!( + target: LOG_TARGET, + "Benchmarked storage weight smaller than consumed storage weight. benchmarked: {benchmarked_weight} consumed: {consumed_weight} unspent: {unspent}" + ); + current.accrue(Weight::from_parts(0, storage_size_diff), info.class) + } else { + log::trace!( + target: LOG_TARGET, + "Reclaiming storage weight. benchmarked: {benchmarked_weight}, consumed: {consumed_weight} unspent: {unspent}" + ); + current.reduce(Weight::from_parts(0, storage_size_diff), info.class) + } + }); + Ok(()) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use frame_support::{ + assert_ok, + dispatch::DispatchClass, + weights::{Weight, WeightMeter}, + }; + use frame_system::{BlockWeight, CheckWeight}; + use sp_runtime::{AccountId32, BuildStorage}; + use sp_std::marker::PhantomData; + use sp_trie::proof_size_extension::ProofSizeExt; + + type Test = cumulus_test_runtime::Runtime; + const CALL: &::RuntimeCall = + &cumulus_test_runtime::RuntimeCall::System(frame_system::Call::set_heap_pages { + pages: 0u64, + }); + const ALICE: AccountId32 = AccountId32::new([1u8; 32]); + const LEN: usize = 0; + + pub fn new_test_ext() -> sp_io::TestExternalities { + let ext: sp_io::TestExternalities = cumulus_test_runtime::RuntimeGenesisConfig::default() + .build_storage() + .unwrap() + .into(); + ext + } + + struct TestRecorder { + return_values: Box<[usize]>, + counter: std::sync::atomic::AtomicUsize, + } + + impl TestRecorder { + fn new(values: &[usize]) -> Self { + TestRecorder { return_values: values.into(), counter: Default::default() } + } + } + + impl sp_trie::ProofSizeProvider for TestRecorder { + fn estimate_encoded_size(&self) -> usize { + let counter = self.counter.fetch_add(1, core::sync::atomic::Ordering::Relaxed); + self.return_values[counter] + } + } + + fn setup_test_externalities(proof_values: &[usize]) -> sp_io::TestExternalities { + let mut test_ext = new_test_ext(); + let test_recorder = TestRecorder::new(proof_values); + test_ext.register_extension(ProofSizeExt::new(test_recorder)); + test_ext + } + + fn set_current_storage_weight(new_weight: u64) { + BlockWeight::::mutate(|current_weight| { + current_weight.set(Weight::from_parts(0, new_weight), DispatchClass::Normal); + }); + } + + #[test] + fn basic_refund() { + // The real cost will be 100 bytes of storage size + let mut test_ext = setup_test_externalities(&[0, 100]); + + test_ext.execute_with(|| { + set_current_storage_weight(1000); + + // Benchmarked storage weight: 500 + let info = DispatchInfo { weight: Weight::from_parts(0, 500), ..Default::default() }; + let post_info = PostDispatchInfo::default(); + + let pre = StorageWeightReclaim::(PhantomData) + .pre_dispatch(&ALICE, CALL, &info, LEN) + .unwrap(); + assert_eq!(pre, Some(0)); + + assert_ok!(CheckWeight::::post_dispatch(None, &info, &post_info, 0, &Ok(()))); + // We expect a refund of 400 + assert_ok!(StorageWeightReclaim::::post_dispatch( + Some(pre), + &info, + &post_info, + LEN, + &Ok(()) + )); + + assert_eq!(BlockWeight::::get().total().proof_size(), 600); + }) + } + + #[test] + fn does_nothing_without_extension() { + let mut test_ext = new_test_ext(); + + // Proof size extension not registered + test_ext.execute_with(|| { + set_current_storage_weight(1000); + + // Benchmarked storage weight: 500 + let info = DispatchInfo { weight: Weight::from_parts(0, 500), ..Default::default() }; + let post_info = PostDispatchInfo::default(); + + let pre = StorageWeightReclaim::(PhantomData) + .pre_dispatch(&ALICE, CALL, &info, LEN) + .unwrap(); + assert_eq!(pre, None); + + assert_ok!(CheckWeight::::post_dispatch(None, &info, &post_info, 0, &Ok(()))); + assert_ok!(StorageWeightReclaim::::post_dispatch( + Some(pre), + &info, + &post_info, + LEN, + &Ok(()) + )); + + assert_eq!(BlockWeight::::get().total().proof_size(), 1000); + }) + } + + #[test] + fn negative_refund_is_added_to_weight() { + let mut test_ext = setup_test_externalities(&[100, 300]); + + test_ext.execute_with(|| { + set_current_storage_weight(1000); + // Benchmarked storage weight: 100 + let info = DispatchInfo { weight: Weight::from_parts(0, 100), ..Default::default() }; + let post_info = PostDispatchInfo::default(); + + let pre = StorageWeightReclaim::(PhantomData) + .pre_dispatch(&ALICE, CALL, &info, LEN) + .unwrap(); + assert_eq!(pre, Some(100)); + + // We expect no refund + assert_ok!(CheckWeight::::post_dispatch(None, &info, &post_info, 0, &Ok(()))); + assert_ok!(StorageWeightReclaim::::post_dispatch( + Some(pre), + &info, + &post_info, + LEN, + &Ok(()) + )); + + assert_eq!(BlockWeight::::get().total().proof_size(), 1100); + }) + } + + #[test] + fn test_zero_proof_size() { + let mut test_ext = setup_test_externalities(&[0, 0]); + + test_ext.execute_with(|| { + let info = DispatchInfo { weight: Weight::from_parts(0, 500), ..Default::default() }; + let post_info = PostDispatchInfo::default(); + + let pre = StorageWeightReclaim::(PhantomData) + .pre_dispatch(&ALICE, CALL, &info, LEN) + .unwrap(); + assert_eq!(pre, Some(0)); + + assert_ok!(CheckWeight::::post_dispatch(None, &info, &post_info, 0, &Ok(()))); + assert_ok!(StorageWeightReclaim::::post_dispatch( + Some(pre), + &info, + &post_info, + LEN, + &Ok(()) + )); + + assert_eq!(BlockWeight::::get().total().proof_size(), 0); + }); + } + + #[test] + fn test_larger_pre_dispatch_proof_size() { + let mut test_ext = setup_test_externalities(&[300, 100]); + + test_ext.execute_with(|| { + set_current_storage_weight(1300); + + let info = DispatchInfo { weight: Weight::from_parts(0, 500), ..Default::default() }; + let post_info = PostDispatchInfo::default(); + + let pre = StorageWeightReclaim::(PhantomData) + .pre_dispatch(&ALICE, CALL, &info, LEN) + .unwrap(); + assert_eq!(pre, Some(300)); + + assert_ok!(CheckWeight::::post_dispatch(None, &info, &post_info, 0, &Ok(()))); + assert_ok!(StorageWeightReclaim::::post_dispatch( + Some(pre), + &info, + &post_info, + LEN, + &Ok(()) + )); + + assert_eq!(BlockWeight::::get().total().proof_size(), 800); + }); + } + + #[test] + fn test_incorporates_check_weight_unspent_weight() { + let mut test_ext = setup_test_externalities(&[100, 300]); + + test_ext.execute_with(|| { + set_current_storage_weight(1000); + + // Benchmarked storage weight: 300 + let info = DispatchInfo { weight: Weight::from_parts(100, 300), ..Default::default() }; + + // Actual weight is 50 + let post_info = PostDispatchInfo { + actual_weight: Some(Weight::from_parts(50, 250)), + pays_fee: Default::default(), + }; + + let pre = StorageWeightReclaim::(PhantomData) + .pre_dispatch(&ALICE, CALL, &info, LEN) + .unwrap(); + assert_eq!(pre, Some(100)); + + // The `CheckWeight` extension will refund `actual_weight` from `PostDispatchInfo` + // we always need to call `post_dispatch` to verify that they interoperate correctly. + assert_ok!(CheckWeight::::post_dispatch(None, &info, &post_info, 0, &Ok(()))); + assert_ok!(StorageWeightReclaim::::post_dispatch( + Some(pre), + &info, + &post_info, + LEN, + &Ok(()) + )); + + assert_eq!(BlockWeight::::get().total().proof_size(), 900); + }) + } + + #[test] + fn test_incorporates_check_weight_unspent_weight_on_negative() { + let mut test_ext = setup_test_externalities(&[100, 300]); + + test_ext.execute_with(|| { + set_current_storage_weight(1000); + // Benchmarked storage weight: 50 + let info = DispatchInfo { weight: Weight::from_parts(100, 50), ..Default::default() }; + + // Actual weight is 25 + let post_info = PostDispatchInfo { + actual_weight: Some(Weight::from_parts(50, 25)), + pays_fee: Default::default(), + }; + + let pre = StorageWeightReclaim::(PhantomData) + .pre_dispatch(&ALICE, CALL, &info, LEN) + .unwrap(); + assert_eq!(pre, Some(100)); + + // The `CheckWeight` extension will refund `actual_weight` from `PostDispatchInfo` + // we always need to call `post_dispatch` to verify that they interoperate correctly. + assert_ok!(CheckWeight::::post_dispatch(None, &info, &post_info, 0, &Ok(()))); + assert_ok!(StorageWeightReclaim::::post_dispatch( + Some(pre), + &info, + &post_info, + LEN, + &Ok(()) + )); + + assert_eq!(BlockWeight::::get().total().proof_size(), 1150); + }) + } + + #[test] + fn test_incorporates_check_weight_unspent_weight_reverse_order() { + let mut test_ext = setup_test_externalities(&[100, 300]); + + test_ext.execute_with(|| { + set_current_storage_weight(1000); + + // Benchmarked storage weight: 300 + let info = DispatchInfo { weight: Weight::from_parts(100, 300), ..Default::default() }; + + // Actual weight is 50 + let post_info = PostDispatchInfo { + actual_weight: Some(Weight::from_parts(50, 250)), + pays_fee: Default::default(), + }; + + let pre = StorageWeightReclaim::(PhantomData) + .pre_dispatch(&ALICE, CALL, &info, LEN) + .unwrap(); + assert_eq!(pre, Some(100)); + + assert_ok!(StorageWeightReclaim::::post_dispatch( + Some(pre), + &info, + &post_info, + LEN, + &Ok(()) + )); + // `CheckWeight` gets called after `StorageWeightReclaim` this time. + // The `CheckWeight` extension will refund `actual_weight` from `PostDispatchInfo` + // we always need to call `post_dispatch` to verify that they interoperate correctly. + assert_ok!(CheckWeight::::post_dispatch(None, &info, &post_info, 0, &Ok(()))); + + assert_eq!(BlockWeight::::get().total().proof_size(), 900); + }) + } + + #[test] + fn test_incorporates_check_weight_unspent_weight_on_negative_reverse_order() { + let mut test_ext = setup_test_externalities(&[100, 300]); + + test_ext.execute_with(|| { + set_current_storage_weight(1000); + // Benchmarked storage weight: 50 + let info = DispatchInfo { weight: Weight::from_parts(100, 50), ..Default::default() }; + + // Actual weight is 25 + let post_info = PostDispatchInfo { + actual_weight: Some(Weight::from_parts(50, 25)), + pays_fee: Default::default(), + }; + + let pre = StorageWeightReclaim::(PhantomData) + .pre_dispatch(&ALICE, CALL, &info, LEN) + .unwrap(); + assert_eq!(pre, Some(100)); + + assert_ok!(StorageWeightReclaim::::post_dispatch( + Some(pre), + &info, + &post_info, + LEN, + &Ok(()) + )); + // `CheckWeight` gets called after `StorageWeightReclaim` this time. + // The `CheckWeight` extension will refund `actual_weight` from `PostDispatchInfo` + // we always need to call `post_dispatch` to verify that they interoperate correctly. + assert_ok!(CheckWeight::::post_dispatch(None, &info, &post_info, 0, &Ok(()))); + + assert_eq!(BlockWeight::::get().total().proof_size(), 1150); + }) + } + + #[test] + fn storage_size_reported_correctly() { + let mut test_ext = setup_test_externalities(&[1000]); + test_ext.execute_with(|| { + assert_eq!(get_proof_size(), Some(1000)); + }); + + let mut test_ext = new_test_ext(); + + let test_recorder = TestRecorder::new(&[0]); + + test_ext.register_extension(ProofSizeExt::new(test_recorder)); + + test_ext.execute_with(|| { + assert_eq!(get_proof_size(), Some(0)); + }); + } + + #[test] + fn storage_size_disabled_reported_correctly() { + let mut test_ext = setup_test_externalities(&[PROOF_RECORDING_DISABLED as usize]); + + test_ext.execute_with(|| { + assert_eq!(get_proof_size(), None); + }); + } + + #[test] + fn test_reclaim_helper() { + let mut test_ext = setup_test_externalities(&[1000, 1300, 1800]); + + test_ext.execute_with(|| { + let mut remaining_weight_meter = WeightMeter::with_limit(Weight::from_parts(0, 2000)); + let mut reclaim_helper = StorageWeightReclaimer::new(&remaining_weight_meter); + remaining_weight_meter.consume(Weight::from_parts(0, 500)); + let reclaimed = reclaim_helper.reclaim_with_meter(&mut remaining_weight_meter); + + assert_eq!(reclaimed, Some(Weight::from_parts(0, 200))); + + remaining_weight_meter.consume(Weight::from_parts(0, 800)); + let reclaimed = reclaim_helper.reclaim_with_meter(&mut remaining_weight_meter); + assert_eq!(reclaimed, Some(Weight::from_parts(0, 300))); + assert_eq!(remaining_weight_meter.remaining(), Weight::from_parts(0, 1200)); + }); + } + + #[test] + fn test_reclaim_helper_does_not_reclaim_negative() { + // Benchmarked weight does not change at all + let mut test_ext = setup_test_externalities(&[1000, 1300]); + + test_ext.execute_with(|| { + let mut remaining_weight_meter = WeightMeter::with_limit(Weight::from_parts(0, 1000)); + let mut reclaim_helper = StorageWeightReclaimer::new(&remaining_weight_meter); + let reclaimed = reclaim_helper.reclaim_with_meter(&mut remaining_weight_meter); + + assert_eq!(reclaimed, Some(Weight::from_parts(0, 0))); + assert_eq!(remaining_weight_meter.remaining(), Weight::from_parts(0, 1000)); + }); + + // Benchmarked weight increases less than storage proof consumes + let mut test_ext = setup_test_externalities(&[1000, 1300]); + + test_ext.execute_with(|| { + let mut remaining_weight_meter = WeightMeter::with_limit(Weight::from_parts(0, 1000)); + let mut reclaim_helper = StorageWeightReclaimer::new(&remaining_weight_meter); + remaining_weight_meter.consume(Weight::from_parts(0, 0)); + let reclaimed = reclaim_helper.reclaim_with_meter(&mut remaining_weight_meter); + + assert_eq!(reclaimed, Some(Weight::from_parts(0, 0))); + }); + } + + /// Just here for doc purposes + fn get_benched_weight() -> Weight { + Weight::from_parts(0, 5) + } + + /// Just here for doc purposes + fn do_work() {} + + #[docify::export_content(simple_reclaimer_example)] + fn reclaim_with_weight_meter() { + let mut remaining_weight_meter = WeightMeter::with_limit(Weight::from_parts(10, 10)); + + let benched_weight = get_benched_weight(); + + // It is important to instantiate the `StorageWeightReclaimer` before we consume the weight + // for a piece of work from the weight meter. + let mut reclaim_helper = StorageWeightReclaimer::new(&remaining_weight_meter); + + if remaining_weight_meter.try_consume(benched_weight).is_ok() { + // Perform some work that takes has `benched_weight` storage weight. + do_work(); + + // Reclaimer will detect that we only consumed 2 bytes, so 3 bytes are reclaimed. + let reclaimed = reclaim_helper.reclaim_with_meter(&mut remaining_weight_meter); + + // We reclaimed 3 bytes of storage size! + assert_eq!(reclaimed, Some(Weight::from_parts(0, 3))); + assert_eq!(BlockWeight::::get().total().proof_size(), 10); + assert_eq!(remaining_weight_meter.remaining(), Weight::from_parts(10, 8)); + } + } + + #[test] + fn test_reclaim_helper_works_with_meter() { + // The node will report 12 - 10 = 2 consumed storage size between the calls. + let mut test_ext = setup_test_externalities(&[10, 12]); + + test_ext.execute_with(|| { + // Initial storage size is 10. + set_current_storage_weight(10); + reclaim_with_weight_meter(); + }); + } +} diff --git a/cumulus/primitives/timestamp/src/lib.rs b/cumulus/primitives/timestamp/src/lib.rs index 535c4a2a7268b9df053021d824fd0fbb0599845b..e6aba6d0bb74043c134400387d84429cf0a712d1 100644 --- a/cumulus/primitives/timestamp/src/lib.rs +++ b/cumulus/primitives/timestamp/src/lib.rs @@ -22,7 +22,7 @@ //! access to any clock from the runtime the timestamp is always passed as an inherent into the //! runtime. To check this inherent when validating the block, we will use the relay chain slot. As //! the relay chain slot is derived from a timestamp, we can easily convert it back to a timestamp -//! by muliplying it with the slot duration. By comparing the relay chain slot derived timestamp +//! by multiplying it with the slot duration. By comparing the relay chain slot derived timestamp //! with the timestamp we can ensure that the parachain timestamp is reasonable. #![cfg_attr(not(feature = "std"), no_std)] diff --git a/cumulus/primitives/utility/Cargo.toml b/cumulus/primitives/utility/Cargo.toml index 27e9fbe3c7eb1157c4dbd2f631d4d63c4088e570..1e2c300b9ba257d2c8fb998689ae45847099dd63 100644 --- a/cumulus/primitives/utility/Cargo.toml +++ b/cumulus/primitives/utility/Cargo.toml @@ -11,7 +11,7 @@ workspace = true [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -log = { version = "0.4.20", default-features = false } +log = { workspace = true } # Substrate frame-support = { path = "../../../substrate/frame/support", default-features = false } @@ -26,7 +26,6 @@ polkadot-runtime-parachains = { path = "../../../polkadot/runtime/parachains", d xcm = { package = "staging-xcm", path = "../../../polkadot/xcm", default-features = false } xcm-executor = { package = "staging-xcm-executor", path = "../../../polkadot/xcm/xcm-executor", default-features = false } xcm-builder = { package = "staging-xcm-builder", path = "../../../polkadot/xcm/xcm-builder", default-features = false } -pallet-xcm-benchmarks = { path = "../../../polkadot/xcm/pallet-xcm-benchmarks", default-features = false } # Cumulus cumulus-primitives-core = { path = "../core", default-features = false } @@ -39,7 +38,6 @@ std = [ "frame-support/std", "log/std", "pallet-asset-conversion/std", - "pallet-xcm-benchmarks/std", "polkadot-runtime-common/std", "polkadot-runtime-parachains/std", "sp-io/std", @@ -54,7 +52,6 @@ runtime-benchmarks = [ "cumulus-primitives-core/runtime-benchmarks", "frame-support/runtime-benchmarks", "pallet-asset-conversion/runtime-benchmarks", - "pallet-xcm-benchmarks/runtime-benchmarks", "polkadot-runtime-common/runtime-benchmarks", "polkadot-runtime-parachains/runtime-benchmarks", "sp-runtime/runtime-benchmarks", diff --git a/cumulus/primitives/utility/src/lib.rs b/cumulus/primitives/utility/src/lib.rs index 0d8921227429c5c1e0f62a4f3c3f93db4ad73bcb..d5d411356dc385948f31730ba65dcd26074d0336 100644 --- a/cumulus/primitives/utility/src/lib.rs +++ b/cumulus/primitives/utility/src/lib.rs @@ -141,7 +141,7 @@ impl< ) -> Result { log::trace!(target: "xcm::weight", "TakeFirstAssetTrader::buy_weight weight: {:?}, payment: {:?}, context: {:?}", weight, payment, context); - // Make sure we dont enter twice + // Make sure we don't enter twice if self.0.is_some() { return Err(XcmError::NotWithdrawable) } @@ -176,7 +176,7 @@ impl< // Convert to the same kind of asset, with the required fungible balance let required = first.id.clone().into_asset(asset_balance.into()); - // Substract payment + // Subtract payment let unused = payment.checked_sub(required.clone()).map_err(|_| XcmError::TooExpensive)?; // record weight and asset @@ -203,7 +203,7 @@ impl< // Calculate asset_balance // This read should have already be cached in buy_weight - let (asset_balance, outstanding_minus_substracted) = + let (asset_balance, outstanding_minus_subtracted) = FeeCharger::charge_weight_in_fungibles(local_asset_id, weight).ok().map( |asset_balance| { // Require at least a drop of minimum_balance @@ -221,16 +221,15 @@ impl< )?; // Convert balances into u128 - let outstanding_minus_substracted: u128 = - outstanding_minus_substracted.saturated_into(); + let outstanding_minus_subtracted: u128 = outstanding_minus_subtracted.saturated_into(); let asset_balance: u128 = asset_balance.saturated_into(); - // Construct outstanding_concrete_asset with the same location id and substracted + // Construct outstanding_concrete_asset with the same location id and subtracted // balance let outstanding_concrete_asset: Asset = - (id.clone(), outstanding_minus_substracted).into(); + (id.clone(), outstanding_minus_subtracted).into(); - // Substract from existing weight and balance + // Subtract from existing weight and balance weight_outstanding = weight_outstanding.saturating_sub(weight); // Override AssetTraderRefunder @@ -263,9 +262,10 @@ impl< } } -/// XCM fee depositor to which we implement the TakeRevenue trait -/// It receives a Transact implemented argument, a 32 byte convertible acocuntId, and the fee -/// receiver account FungiblesMutateAdapter should be identical to that implemented by WithdrawAsset +/// XCM fee depositor to which we implement the `TakeRevenue` trait. +/// It receives a `Transact` implemented argument and a 32 byte convertible `AccountId`, and the fee +/// receiver account's `FungiblesMutateAdapter` should be identical to that implemented by +/// `WithdrawAsset`. pub struct XcmFeesTo32ByteAccount( PhantomData<(FungiblesMutateAdapter, AccountId, ReceiverAccount)>, ); @@ -760,10 +760,11 @@ mod test_trader { } } -/// Implementation of `pallet_xcm_benchmarks::EnsureDelivery` which helps to ensure delivery to the +/// Implementation of `xcm_builder::EnsureDelivery` which helps to ensure delivery to the /// parent relay chain. Deposits existential deposit for origin (if needed). /// Deposits estimated fee to the origin account (if needed). -/// Allows to trigger additional logic for specific `ParaId` (e.g. open HRMP channel) (if neeeded). +/// Allows triggering of additional logic for a specific `ParaId` (e.g. to open an HRMP channel) if +/// needed. #[cfg(feature = "runtime-benchmarks")] pub struct ToParentDeliveryHelper( sp_std::marker::PhantomData<(XcmConfig, ExistentialDeposit, PriceForDelivery)>, @@ -774,17 +775,22 @@ impl< XcmConfig: xcm_executor::Config, ExistentialDeposit: Get>, PriceForDelivery: PriceForMessageDelivery, - > pallet_xcm_benchmarks::EnsureDelivery + > xcm_builder::EnsureDelivery for ToParentDeliveryHelper { fn ensure_successful_delivery( origin_ref: &Location, - _dest: &Location, + dest: &Location, fee_reason: xcm_executor::traits::FeeReason, ) -> (Option, Option) { use xcm::latest::{MAX_INSTRUCTIONS_TO_DECODE, MAX_ITEMS_IN_ASSETS}; use xcm_executor::{traits::FeeManager, FeesMode}; + // check if the destination is relay/parent + if dest.ne(&Location::parent()) { + return (None, None); + } + let mut fees_mode = None; if !XcmConfig::FeeManager::is_waived(Some(origin_ref), fee_reason) { // if not waived, we need to set up accounts for paying and receiving fees diff --git a/cumulus/scripts/create_coretime_westend_spec.sh b/cumulus/scripts/create_coretime_westend_spec.sh index 90996f4a74f47f9783a29ff2ce358920be810641..516dc06ac6660c0c1f9d565d88a9ae7d132ade9e 100755 --- a/cumulus/scripts/create_coretime_westend_spec.sh +++ b/cumulus/scripts/create_coretime_westend_spec.sh @@ -39,13 +39,7 @@ cat chain-spec-plain.json | jq --rawfile code rt-hex.txt '.genesis.runtimeGenesi | jq '.chainType = "Live"' \ | jq '.bootNodes = [ "/dns/westend-coretime-collator-0.parity-testnet.parity.io/tcp/30333/p2p/12D3KooWP93Dzk8T7GWxyWw9jhLcz8Pksokk3R9vL2eEH337bNkT", - "/dns/westend-coretime-collator-1.parity-testnet.parity.io/tcp/30333/p2p/12D3KooWMh2imeAzsZKGQgm2cv6Uoep3GBYtwGfujt1bs5YfVzkH", - "/dns/westend-coretime-collator-2.parity-testnet.parity.io/tcp/30333/p2p/12D3KooWAys2hVpF7AN8hYGnu1T6XYFRGKeBFqD8q5LUcvWXRLg8", - "/dns/westend-coretime-collator-3.parity-testnet.parity.io/tcp/30333/p2p/12D3KooWSGgmiRryoi7A3qAmeYWgmVeGQkk66PrhDjJ6ZPP555as", - "/dns/westend-coretime-connect-0.polkadot.io/tcp/443/wss/p2p/12D3KooWP93Dzk8T7GWxyWw9jhLcz8Pksokk3R9vL2eEH337bNkT", - "/dns/westend-coretime-connect-1.polkadot.io/tcp/443/wss/p2p/12D3KooWMh2imeAzsZKGQgm2cv6Uoep3GBYtwGfujt1bs5YfVzkH", - "/dns/westend-coretime-connect-2.polkadot.io/tcp/443/wss/p2p/12D3KooWAys2hVpF7AN8hYGnu1T6XYFRGKeBFqD8q5LUcvWXRLg8", - "/dns/westend-coretime-connect-3.polkadot.io/tcp/443/wss/p2p/12D3KooWSGgmiRryoi7A3qAmeYWgmVeGQkk66PrhDjJ6ZPP555as", + "/dns/westend-coretime-collator-1.parity-testnet.parity.io/tcp/30333/p2p/12D3KooWMh2imeAzsZKGQgm2cv6Uoep3GBYtwGfujt1bs5YfVzkH" ]' \ | jq '.relay_chain = "westend"' \ | jq --argjson para_id $para_id '.para_id = $para_id' \ @@ -53,37 +47,21 @@ cat chain-spec-plain.json | jq --rawfile code rt-hex.txt '.genesis.runtimeGenesi | jq '.genesis.runtimeGenesis.patch.balances.balances = []' \ | jq '.genesis.runtimeGenesis.patch.collatorSelection.invulnerables = [ "5GKXTtB7RG3mLJ2kT4AkDXoxvKCFDVUdwyRmeMEbX3gBwcGi", - "5DknBCD1h49nc8eqnm6XtHz3bMQm5hfMuGYcLenRfCmpnBJG", - "5D52g9Mt9jQnZn6hwYhv649QYqGwhjygxkpb6rm3FYzYHEs3", - "5Egx2B41PYj8uvuhkNJeucA54h6Xmi7ZH9wqrZLwj3CuvQKA" + "5DknBCD1h49nc8eqnm6XtHz3bMQm5hfMuGYcLenRfCmpnBJG" ]' \ | jq '.genesis.runtimeGenesis.patch.session.keys = [ [ "5GKXTtB7RG3mLJ2kT4AkDXoxvKCFDVUdwyRmeMEbX3gBwcGi", "5GKXTtB7RG3mLJ2kT4AkDXoxvKCFDVUdwyRmeMEbX3gBwcGi", { - "aura": "0xbc3ea120d2991b75447b0b53cd8623970a0f6d98fa2701036c74d94e6b79252c" + "aura": "5GKXTtB7RG3mLJ2kT4AkDXoxvKCFDVUdwyRmeMEbX3gBwcGi" } ], [ "5DknBCD1h49nc8eqnm6XtHz3bMQm5hfMuGYcLenRfCmpnBJG", "5DknBCD1h49nc8eqnm6XtHz3bMQm5hfMuGYcLenRfCmpnBJG", { - "aura": "0x4acc970c28713ec93bf925352d3023418fdf89933227e1e2fdae8481103dfe28" - } - ], - [ - "5D52g9Mt9jQnZn6hwYhv649QYqGwhjygxkpb6rm3FYzYHEs3", - "5D52g9Mt9jQnZn6hwYhv649QYqGwhjygxkpb6rm3FYzYHEs3", - { - "aura": "0x2c7b95155708c10616b6f1a77a84f3d92c9a0272609ed24dbb7e6bdb81b53e76" - } - ], - [ - "5Egx2B41PYj8uvuhkNJeucA54h6Xmi7ZH9wqrZLwj3CuvQKA", - "5Egx2B41PYj8uvuhkNJeucA54h6Xmi7ZH9wqrZLwj3CuvQKA", - { - "aura": "0x741cfb39ec61bc76824ccec62d61670a80a890e0e21d58817f84040d3ec54474" + "aura": "5DknBCD1h49nc8eqnm6XtHz3bMQm5hfMuGYcLenRfCmpnBJG" } ] ]' \ diff --git a/cumulus/scripts/scale_encode_genesis/index.js b/cumulus/scripts/scale_encode_genesis/index.js index f612e6da79dd51452f46bcd0e626b5648b77f2e4..c6600e406361178524998b1a212e25fb97619957 100644 --- a/cumulus/scripts/scale_encode_genesis/index.js +++ b/cumulus/scripts/scale_encode_genesis/index.js @@ -19,14 +19,14 @@ async function connect(endpoint, types = {}) { } if (!process.argv[2] || !process.argv[3]) { - console.log("usage: node generate_keys [rpc enpoint]"); + console.log("usage: node generate_keys [rpc endpoint]"); exit(); } const input = process.argv[2]; const output = process.argv[3]; // default to localhost and the default Substrate port -const rpcEnpoint = process.argv[4] || "ws://localhost:9944"; +const rpcEndpoint = process.argv[4] || "ws://localhost:9944"; console.log("Processing", input, output); fs.readFile(input, "utf8", (err, data) => { @@ -38,8 +38,8 @@ fs.readFile(input, "utf8", (err, data) => { const genesis = JSON.parse(data); console.log("loaded genesis, length = ", genesis.length); - console.log(`Connecting to RPC endpoint: ${rpcEnpoint}`); - connect(rpcEnpoint) + console.log(`Connecting to RPC endpoint: ${rpcEndpoint}`); + connect(rpcEndpoint) .then((api) => { console.log('Connected'); const setStorage = api.tx.system.setStorage(genesis); diff --git a/cumulus/scripts/temp_parachain_types.json b/cumulus/scripts/temp_parachain_types.json index f550a6774450deb8abc9651d15a08b1b34b28c48..2509d32be9fd2cab453c5fd440b9879fca317c17 100644 --- a/cumulus/scripts/temp_parachain_types.json +++ b/cumulus/scripts/temp_parachain_types.json @@ -54,7 +54,7 @@ "validity_votes": "Vec", "validator_indices": "BitVec" }, - "CandidatePendingAvailablility": { + "CandidatePendingAvailability": { "core": "u32", "descriptor": "CandidateDescriptor", "availability_votes": "BitVec", diff --git a/cumulus/test/client/Cargo.toml b/cumulus/test/client/Cargo.toml index 7190172101cb509f7dd7c19ad25dc6d4d54036e7..254361e85420de982a984f76d76b96a5c7d3b4a4 100644 --- a/cumulus/test/client/Cargo.toml +++ b/cumulus/test/client/Cargo.toml @@ -14,14 +14,18 @@ codec = { package = "parity-scale-codec", version = "3.0.0", default-features = # Substrate sc-service = { path = "../../../substrate/client/service" } sc-consensus = { path = "../../../substrate/client/consensus/common" } +sc-consensus-aura = { path = "../../../substrate/client/consensus/aura" } sc-block-builder = { path = "../../../substrate/client/block-builder" } sc-executor = { path = "../../../substrate/client/executor" } sc-executor-common = { path = "../../../substrate/client/executor/common" } substrate-test-client = { path = "../../../substrate/test-utils/client" } +sp-application-crypto = { path = "../../../substrate/primitives/application-crypto" } sp-runtime = { path = "../../../substrate/primitives/runtime" } sp-core = { path = "../../../substrate/primitives/core" } sp-api = { path = "../../../substrate/primitives/api" } sp-keyring = { path = "../../../substrate/primitives/keyring" } +sp-keystore = { path = "../../../substrate/primitives/keystore" } +sp-consensus-aura = { path = "../../../substrate/primitives/consensus/aura" } sp-blockchain = { path = "../../../substrate/primitives/blockchain" } sp-inherents = { path = "../../../substrate/primitives/inherents" } sp-io = { path = "../../../substrate/primitives/io" } @@ -41,6 +45,7 @@ cumulus-test-relay-sproof-builder = { path = "../relay-sproof-builder" } cumulus-primitives-core = { path = "../../primitives/core" } cumulus-primitives-proof-size-hostfunction = { path = "../../primitives/proof-size-hostfunction" } cumulus-primitives-parachain-inherent = { path = "../../primitives/parachain-inherent" } +cumulus-primitives-storage-weight-reclaim = { path = "../../primitives/storage-weight-reclaim" } [features] runtime-benchmarks = [ diff --git a/cumulus/test/client/src/block_builder.rs b/cumulus/test/client/src/block_builder.rs index 929f9f5f48c4d8d97526f97d8ac59cea08797aa8..c2e5a69dd9b550c9af7eaf617dab017186982a0a 100644 --- a/cumulus/test/client/src/block_builder.rs +++ b/cumulus/test/client/src/block_builder.rs @@ -15,14 +15,26 @@ // along with Cumulus. If not, see . use crate::Client; +use codec::Encode; use cumulus_primitives_core::{ParachainBlockData, PersistedValidationData}; use cumulus_primitives_parachain_inherent::{ParachainInherentData, INHERENT_IDENTIFIER}; use cumulus_test_relay_sproof_builder::RelayStateSproofBuilder; use cumulus_test_runtime::{Block, GetLastTimestamp, Hash, Header}; use polkadot_primitives::{BlockNumber as PBlockNumber, Hash as PHash}; -use sc_block_builder::{BlockBuilder, BlockBuilderBuilder}; +use sc_block_builder::BlockBuilderBuilder; use sp_api::ProvideRuntimeApi; -use sp_runtime::traits::{Block as BlockT, Header as HeaderT}; +use sp_consensus_aura::Slot; +use sp_runtime::{ + traits::{Block as BlockT, Header as HeaderT}, + Digest, DigestItem, +}; + +/// A struct containing a block builder and support data required to build test scenarios. +pub struct BlockBuilderAndSupportData<'a> { + pub block_builder: sc_block_builder::BlockBuilder<'a, Block, Client>, + pub persisted_validation_data: PersistedValidationData, + pub slot: Slot, +} /// An extension for the Cumulus test client to init a block builder. pub trait InitBlockBuilder { @@ -32,12 +44,15 @@ pub trait InitBlockBuilder { /// valid for the test runtime. /// /// You can use the relay chain state sproof builder to arrange required relay chain state or - /// just use a default one. + /// just use a default one. The relay chain slot in the storage proof + /// will be adjusted to align with the parachain slot to pass validation. + /// + /// Returns the block builder and validation data for further usage. fn init_block_builder( &self, validation_data: Option>, relay_sproof_builder: RelayStateSproofBuilder, - ) -> sc_block_builder::BlockBuilder; + ) -> BlockBuilderAndSupportData; /// Init a specific block builder at a specific block that works for the test runtime. /// @@ -48,7 +63,7 @@ pub trait InitBlockBuilder { at: Hash, validation_data: Option>, relay_sproof_builder: RelayStateSproofBuilder, - ) -> sc_block_builder::BlockBuilder; + ) -> BlockBuilderAndSupportData; /// Init a specific block builder that works for the test runtime. /// @@ -61,21 +76,30 @@ pub trait InitBlockBuilder { validation_data: Option>, relay_sproof_builder: RelayStateSproofBuilder, timestamp: u64, - ) -> sc_block_builder::BlockBuilder; + ) -> BlockBuilderAndSupportData; } fn init_block_builder( client: &Client, at: Hash, validation_data: Option>, - relay_sproof_builder: RelayStateSproofBuilder, + mut relay_sproof_builder: RelayStateSproofBuilder, timestamp: u64, -) -> BlockBuilder<'_, Block, Client> { +) -> BlockBuilderAndSupportData<'_> { + // This slot will be used for both relay chain and parachain + let slot: Slot = (timestamp / cumulus_test_runtime::SLOT_DURATION).into(); + relay_sproof_builder.current_slot = slot; + + let aura_pre_digest = Digest { + logs: vec![DigestItem::PreRuntime(sp_consensus_aura::AURA_ENGINE_ID, slot.encode())], + }; + let mut block_builder = BlockBuilderBuilder::new(client) .on_parent_block(at) .fetch_parent_block_number(client) .unwrap() .enable_proof_recording() + .with_inherent_digests(aura_pre_digest) .build() .expect("Creates new block builder for test runtime"); @@ -89,18 +113,13 @@ fn init_block_builder( relay_sproof_builder.into_state_root_and_proof(); let mut validation_data = validation_data.unwrap_or_default(); - assert_eq!( - validation_data.relay_parent_storage_root, - Default::default(), - "Overriding the relay storage root is not implemented", - ); validation_data.relay_parent_storage_root = relay_parent_storage_root; inherent_data .put_data( INHERENT_IDENTIFIER, &ParachainInherentData { - validation_data, + validation_data: validation_data.clone(), relay_chain_state, downward_messages: Default::default(), horizontal_messages: Default::default(), @@ -114,7 +133,7 @@ fn init_block_builder( .into_iter() .for_each(|ext| block_builder.push(ext).expect("Pushes inherent")); - block_builder + BlockBuilderAndSupportData { block_builder, persisted_validation_data: validation_data, slot } } impl InitBlockBuilder for Client { @@ -122,7 +141,7 @@ impl InitBlockBuilder for Client { &self, validation_data: Option>, relay_sproof_builder: RelayStateSproofBuilder, - ) -> BlockBuilder { + ) -> BlockBuilderAndSupportData { let chain_info = self.chain_info(); self.init_block_builder_at(chain_info.best_hash, validation_data, relay_sproof_builder) } @@ -132,10 +151,17 @@ impl InitBlockBuilder for Client { at: Hash, validation_data: Option>, relay_sproof_builder: RelayStateSproofBuilder, - ) -> BlockBuilder { + ) -> BlockBuilderAndSupportData { let last_timestamp = self.runtime_api().get_last_timestamp(at).expect("Get last timestamp"); - let timestamp = last_timestamp + cumulus_test_runtime::MinimumPeriod::get(); + let timestamp = if last_timestamp == 0 { + std::time::SystemTime::now() + .duration_since(std::time::SystemTime::UNIX_EPOCH) + .expect("Time is always after UNIX_EPOCH; qed") + .as_millis() as u64 + } else { + last_timestamp + cumulus_test_runtime::SLOT_DURATION + }; init_block_builder(self, at, validation_data, relay_sproof_builder, timestamp) } @@ -146,7 +172,7 @@ impl InitBlockBuilder for Client { validation_data: Option>, relay_sproof_builder: RelayStateSproofBuilder, timestamp: u64, - ) -> sc_block_builder::BlockBuilder { + ) -> BlockBuilderAndSupportData { init_block_builder(self, at, validation_data, relay_sproof_builder, timestamp) } } diff --git a/cumulus/test/client/src/lib.rs b/cumulus/test/client/src/lib.rs index df63f683de6b4312a953bbbf9f03862eac7ce451..a39a662553b0853ec810a7b5091d521b3e3b40bb 100644 --- a/cumulus/test/client/src/lib.rs +++ b/cumulus/test/client/src/lib.rs @@ -17,24 +17,30 @@ //! A Cumulus test client. mod block_builder; +pub use block_builder::*; use codec::{Decode, Encode}; +pub use cumulus_test_runtime as runtime; +use cumulus_test_runtime::AuraId; +pub use polkadot_parachain_primitives::primitives::{ + BlockData, HeadData, ValidationParams, ValidationResult, +}; use runtime::{ Balance, Block, BlockHashCount, Runtime, RuntimeCall, Signature, SignedExtra, SignedPayload, UncheckedExtrinsic, VERSION, }; +use sc_consensus_aura::standalone::{seal, slot_author}; +pub use sc_executor::error::Result as ExecutorResult; use sc_executor::HeapAllocStrategy; use sc_executor_common::runtime_blob::RuntimeBlob; +use sp_api::ProvideRuntimeApi; +use sp_application_crypto::AppCrypto; use sp_blockchain::HeaderBackend; +use sp_consensus_aura::{AuraApi, Slot}; use sp_core::Pair; use sp_io::TestExternalities; -use sp_runtime::{generic::Era, BuildStorage, SaturatedConversion}; - -pub use block_builder::*; -pub use cumulus_test_runtime as runtime; -pub use polkadot_parachain_primitives::primitives::{ - BlockData, HeadData, ValidationParams, ValidationResult, -}; -pub use sc_executor::error::Result as ExecutorResult; +use sp_keystore::testing::MemoryKeystore; +use sp_runtime::{generic::Era, traits::Header, BuildStorage, SaturatedConversion}; +use std::sync::Arc; pub use substrate_test_client::*; pub type ParachainBlockData = cumulus_primitives_core::ParachainBlockData; @@ -151,6 +157,7 @@ pub fn generate_extrinsic_with_pair( frame_system::CheckNonce::::from(nonce), frame_system::CheckWeight::::new(), pallet_transaction_payment::ChargeTransactionPayment::::from(tip), + cumulus_primitives_storage_weight_reclaim::StorageWeightReclaim::::new(), ); let function = function.into(); @@ -158,7 +165,7 @@ pub fn generate_extrinsic_with_pair( let raw_payload = SignedPayload::from_raw( function.clone(), extra.clone(), - ((), VERSION.spec_version, genesis_block, current_block_hash, (), (), ()), + ((), VERSION.spec_version, genesis_block, current_block_hash, (), (), (), ()), ); let signature = raw_payload.using_encoded(|e| origin.sign(e)); @@ -203,13 +210,16 @@ pub fn validate_block( let mut ext_ext = ext.ext(); let heap_pages = HeapAllocStrategy::Static { extra_pages: 1024 }; - let executor = WasmExecutor::::builder() - .with_execution_method(WasmExecutionMethod::default()) - .with_max_runtime_instances(1) - .with_runtime_cache_size(2) - .with_onchain_heap_alloc_strategy(heap_pages) - .with_offchain_heap_alloc_strategy(heap_pages) - .build(); + let executor = WasmExecutor::<( + sp_io::SubstrateHostFunctions, + cumulus_primitives_proof_size_hostfunction::storage_proof_size::HostFunctions, + )>::builder() + .with_execution_method(WasmExecutionMethod::default()) + .with_max_runtime_instances(1) + .with_runtime_cache_size(2) + .with_onchain_heap_alloc_strategy(heap_pages) + .with_offchain_heap_alloc_strategy(heap_pages) + .build(); executor .uncached_call( @@ -221,3 +231,40 @@ pub fn validate_block( ) .map(|v| ValidationResult::decode(&mut &v[..]).expect("Decode `ValidationResult`.")) } + +fn get_keystore() -> sp_keystore::KeystorePtr { + let keystore = MemoryKeystore::new(); + sp_keyring::Sr25519Keyring::iter().for_each(|key| { + keystore + .sr25519_generate_new( + sp_consensus_aura::sr25519::AuthorityPair::ID, + Some(&key.to_seed()), + ) + .expect("Key should be created"); + }); + Arc::new(keystore) +} + +/// Given parachain block data and a slot, seal the block with an aura seal. Assumes that the +/// authorities of the test runtime are present in the keyring. +pub fn seal_block( + block: ParachainBlockData, + parachain_slot: Slot, + client: &Client, +) -> ParachainBlockData { + let parent_hash = block.header().parent_hash; + let authorities = client.runtime_api().authorities(parent_hash).unwrap(); + let expected_author = slot_author::<::Pair>(parachain_slot, &authorities) + .expect("Should be able to find author"); + + let (mut header, extrinsics, proof) = block.deconstruct(); + let keystore = get_keystore(); + let seal_digest = seal::<_, sp_consensus_aura::sr25519::AuthorityPair>( + &header.hash(), + expected_author, + &keystore, + ) + .expect("Should be able to create seal"); + header.digest_mut().push(seal_digest); + ParachainBlockData::new(header, extrinsics, proof) +} diff --git a/cumulus/test/runtime/Cargo.toml b/cumulus/test/runtime/Cargo.toml index 5902a62512bed772318145ccdb954ff2dfef4c92..1969045640ed1e8c95b828fb5f4073875c3e63b0 100644 --- a/cumulus/test/runtime/Cargo.toml +++ b/cumulus/test/runtime/Cargo.toml @@ -10,7 +10,7 @@ workspace = true [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } # Substrate frame-executive = { path = "../../../substrate/frame/executive", default-features = false } @@ -20,9 +20,12 @@ frame-system-rpc-runtime-api = { path = "../../../substrate/frame/system/rpc/run pallet-balances = { path = "../../../substrate/frame/balances", default-features = false } pallet-message-queue = { path = "../../../substrate/frame/message-queue", default-features = false } pallet-sudo = { path = "../../../substrate/frame/sudo", default-features = false } +pallet-aura = { path = "../../../substrate/frame/aura", default-features = false } +pallet-authorship = { path = "../../../substrate/frame/authorship", default-features = false } pallet-timestamp = { path = "../../../substrate/frame/timestamp", default-features = false } pallet-glutton = { path = "../../../substrate/frame/glutton", default-features = false } pallet-transaction-payment = { path = "../../../substrate/frame/transaction-payment", default-features = false } +pallet-session = { path = "../../../substrate/frame/session", default-features = false } sp-api = { path = "../../../substrate/primitives/api", default-features = false } sp-block-builder = { path = "../../../substrate/primitives/block-builder", default-features = false } sp-core = { path = "../../../substrate/primitives/core", default-features = false } @@ -32,13 +35,20 @@ sp-io = { path = "../../../substrate/primitives/io", default-features = false } sp-offchain = { path = "../../../substrate/primitives/offchain", default-features = false } sp-runtime = { path = "../../../substrate/primitives/runtime", default-features = false } sp-session = { path = "../../../substrate/primitives/session", default-features = false } +sp-consensus-aura = { path = "../../../substrate/primitives/consensus/aura", default-features = false } sp-std = { path = "../../../substrate/primitives/std", default-features = false } sp-transaction-pool = { path = "../../../substrate/primitives/transaction-pool", default-features = false } sp-version = { path = "../../../substrate/primitives/version", default-features = false } # Cumulus -cumulus-pallet-parachain-system = { path = "../../pallets/parachain-system", default-features = false, features = ["parameterized-consensus-hook"] } +cumulus-pallet-parachain-system = { path = "../../pallets/parachain-system", default-features = false, features = [ + "parameterized-consensus-hook", +] } +cumulus-primitives-aura = { path = "../../primitives/aura", default-features = false } +pallet-collator-selection = { path = "../../pallets/collator-selection", default-features = false } +cumulus-pallet-aura-ext = { path = "../../pallets/aura-ext", default-features = false } cumulus-primitives-core = { path = "../../primitives/core", default-features = false } +cumulus-primitives-storage-weight-reclaim = { path = "../../primitives/storage-weight-reclaim", default-features = false } [build-dependencies] substrate-wasm-builder = { path = "../../../substrate/utils/wasm-builder", optional = true } @@ -47,21 +57,29 @@ substrate-wasm-builder = { path = "../../../substrate/utils/wasm-builder", optio default = ["std"] std = [ "codec/std", + "cumulus-pallet-aura-ext/std", "cumulus-pallet-parachain-system/std", + "cumulus-primitives-aura/std", "cumulus-primitives-core/std", + "cumulus-primitives-storage-weight-reclaim/std", "frame-executive/std", "frame-support/std", "frame-system-rpc-runtime-api/std", "frame-system/std", + "pallet-aura/std", + "pallet-authorship/std", "pallet-balances/std", + "pallet-collator-selection/std", "pallet-glutton/std", "pallet-message-queue/std", + "pallet-session/std", "pallet-sudo/std", "pallet-timestamp/std", "pallet-transaction-payment/std", "scale-info/std", "sp-api/std", "sp-block-builder/std", + "sp-consensus-aura/std", "sp-core/std", "sp-genesis-builder/std", "sp-inherents/std", diff --git a/cumulus/test/runtime/src/lib.rs b/cumulus/test/runtime/src/lib.rs index 6068f895c83bf6adba5e2d7fa68b3aa2b8821204..22dc5d857b7c07a7285d3ad2b76f87b15dc5718d 100644 --- a/cumulus/test/runtime/src/lib.rs +++ b/cumulus/test/runtime/src/lib.rs @@ -28,10 +28,11 @@ pub mod wasm_spec_version_incremented { } mod test_pallet; - -use frame_support::{derive_impl, traits::OnRuntimeUpgrade}; +use frame_support::{derive_impl, traits::OnRuntimeUpgrade, PalletId}; use sp_api::{decl_runtime_apis, impl_runtime_apis}; -use sp_core::{ConstU32, OpaqueMetadata}; +pub use sp_consensus_aura::sr25519::AuthorityId as AuraId; +use sp_core::{ConstBool, ConstU32, ConstU64, OpaqueMetadata}; + use sp_runtime::{ create_runtime_str, generic, impl_opaque_keys, traits::{BlakeTwo256, Block as BlockT, IdentifyAccount, IdentityLookup, Verify}, @@ -47,7 +48,7 @@ use sp_version::RuntimeVersion; pub use frame_support::{ construct_runtime, dispatch::DispatchClass, - genesis_builder_helper::{build_config, create_default_config}, + genesis_builder_helper::{build_state, get_preset}, parameter_types, traits::{ConstU8, Randomness}, weights::{ @@ -74,12 +75,18 @@ pub use test_pallet::Call as TestPalletCall; pub type SessionHandlers = (); impl_opaque_keys! { - pub struct SessionKeys {} + pub struct SessionKeys { + pub aura: Aura, + } } /// The para-id used in this runtime. pub const PARACHAIN_ID: u32 = 100; +const UNINCLUDED_SEGMENT_CAPACITY: u32 = 3; +const BLOCK_PROCESSING_VELOCITY: u32 = 1; +const RELAY_CHAIN_SLOT_DURATION_MILLIS: u32 = 6000; + // The only difference between the two declarations below is the `spec_version`. With the // `increment-spec-version` feature enabled `spec_version` should be greater than the one of without // the `increment-spec-version` feature. @@ -119,7 +126,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { state_version: 1, }; -pub const MILLISECS_PER_BLOCK: u64 = 12000; +pub const MILLISECS_PER_BLOCK: u64 = 6000; pub const SLOT_DURATION: u64 = MILLISECS_PER_BLOCK; @@ -139,15 +146,15 @@ pub fn native_version() -> NativeVersion { NativeVersion { runtime_version: VERSION, can_author_with: Default::default() } } -/// We assume that ~10% of the block weight is consumed by `on_initalize` handlers. +/// We assume that ~10% of the block weight is consumed by `on_initialize` handlers. /// This is used to limit the maximal weight of a single extrinsic. const AVERAGE_ON_INITIALIZE_RATIO: Perbill = Perbill::from_percent(10); /// We allow `Normal` extrinsics to fill up the block up to 75%, the rest can be used /// by Operational extrinsics. const NORMAL_DISPATCH_RATIO: Perbill = Perbill::from_percent(75); -/// We allow for .5 seconds of compute with a 12 second average block time. +/// We allow for 1 second of compute with a 6 second average block time. const MAXIMUM_BLOCK_WEIGHT: Weight = Weight::from_parts( - WEIGHT_REF_TIME_PER_SECOND.saturating_div(2), + WEIGHT_REF_TIME_PER_SECOND, cumulus_primitives_core::relay_chain::MAX_POV_SIZE as u64, ); @@ -177,7 +184,7 @@ parameter_types! { pub const SS58Prefix: u8 = 42; } -#[derive_impl(frame_system::config_preludes::ParaChainDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::ParaChainDefaultConfig)] impl frame_system::Config for Runtime { /// The identifier used to distinguish between accounts. type AccountId = AccountId; @@ -203,12 +210,17 @@ impl frame_system::Config for Runtime { parameter_types! { pub const MinimumPeriod: u64 = SLOT_DURATION / 2; + pub const PotId: PalletId = PalletId(*b"PotStake"); + pub const SessionLength: BlockNumber = 10 * MINUTES; + pub const Offset: u32 = 0; } +impl cumulus_pallet_aura_ext::Config for Runtime {} + impl pallet_timestamp::Config for Runtime { /// A timestamp: milliseconds since the unix epoch. type Moment = u64; - type OnTimestampSet = (); + type OnTimestampSet = Aura; type MinimumPeriod = MinimumPeriod; type WeightInfo = (); } @@ -241,7 +253,7 @@ impl pallet_balances::Config for Runtime { impl pallet_transaction_payment::Config for Runtime { type RuntimeEvent = RuntimeEvent; - type OnChargeTransaction = pallet_transaction_payment::CurrencyAdapter; + type OnChargeTransaction = pallet_transaction_payment::FungibleAdapter; type WeightToFee = IdentityFee; type LengthToFee = ConstantMultiplier; type FeeMultiplierUpdate = (); @@ -260,6 +272,12 @@ impl pallet_glutton::Config for Runtime { type WeightInfo = pallet_glutton::weights::SubstrateWeight; } +type ConsensusHook = cumulus_pallet_aura_ext::FixedVelocityConsensusHook< + Runtime, + RELAY_CHAIN_SLOT_DURATION_MILLIS, + BLOCK_PROCESSING_VELOCITY, + UNINCLUDED_SEGMENT_CAPACITY, +>; impl cumulus_pallet_parachain_system::Config for Runtime { type WeightInfo = (); type SelfParaId = ParachainId; @@ -271,8 +289,17 @@ impl cumulus_pallet_parachain_system::Config for Runtime { type ReservedDmpWeight = (); type XcmpMessageHandler = (); type ReservedXcmpWeight = (); - type CheckAssociatedRelayNumber = cumulus_pallet_parachain_system::AnyRelayNumber; - type ConsensusHook = cumulus_pallet_parachain_system::consensus_hook::RequireParentIncluded; + type CheckAssociatedRelayNumber = + cumulus_pallet_parachain_system::RelayNumberMonotonicallyIncreases; + type ConsensusHook = ConsensusHook; +} + +impl pallet_aura::Config for Runtime { + type AuthorityId = AuraId; + type DisabledValidators = (); + type MaxAuthorities = ConstU32<32>; + type AllowMultipleBlocksPerSlot = ConstBool; + type SlotDuration = ConstU64; } parameter_types! { @@ -293,6 +320,8 @@ construct_runtime! { TransactionPayment: pallet_transaction_payment, TestPallet: test_pallet, Glutton: pallet_glutton, + Aura: pallet_aura, + AuraExt: cumulus_pallet_aura_ext, } } @@ -331,6 +360,7 @@ pub type SignedExtra = ( frame_system::CheckNonce, frame_system::CheckWeight, pallet_transaction_payment::ChargeTransactionPayment, + cumulus_primitives_storage_weight_reclaim::StorageWeightReclaim, ); /// Unchecked extrinsic type as expected by this runtime. pub type UncheckedExtrinsic = @@ -376,11 +406,31 @@ impl_runtime_apis! { Executive::execute_block(block) } - fn initialize_block(header: &::Header) { + fn initialize_block(header: &::Header) -> sp_runtime::ExtrinsicInclusionMode { Executive::initialize_block(header) } } + + impl cumulus_primitives_aura::AuraUnincludedSegmentApi for Runtime { + fn can_build_upon( + included_hash: ::Hash, + slot: cumulus_primitives_aura::Slot, + ) -> bool { + ConsensusHook::can_build_upon(included_hash, slot) + } + } + + impl sp_consensus_aura::AuraApi for Runtime { + fn slot_duration() -> sp_consensus_aura::SlotDuration { + sp_consensus_aura::SlotDuration::from_millis(SLOT_DURATION) + } + + fn authorities() -> Vec { + pallet_aura::Authorities::::get().into_inner() + } + } + impl sp_api::Metadata for Runtime { fn metadata() -> OpaqueMetadata { OpaqueMetadata::new(Runtime::metadata().into()) @@ -462,17 +512,21 @@ impl_runtime_apis! { } impl sp_genesis_builder::GenesisBuilder for Runtime { - fn create_default_config() -> Vec { - create_default_config::() + fn build_state(config: Vec) -> sp_genesis_builder::Result { + build_state::(config) + } + + fn get_preset(id: &Option) -> Option> { + get_preset::(id, |_| None) } - fn build_config(config: Vec) -> sp_genesis_builder::Result { - build_config::(config) + fn preset_names() -> Vec { + vec![] } } } cumulus_pallet_parachain_system::register_validate_block! { Runtime = Runtime, - BlockExecutor = Executive, + BlockExecutor = cumulus_pallet_aura_ext::BlockExecutor::, } diff --git a/cumulus/test/service/Cargo.toml b/cumulus/test/service/Cargo.toml index c17cdf35419a22b932b164d0e3a71cce2525ff61..18213b2f6326c4d755e07d66cb13ed4424226fc7 100644 --- a/cumulus/test/service/Cargo.toml +++ b/cumulus/test/service/Cargo.toml @@ -13,14 +13,14 @@ name = "test-parachain" path = "src/main.rs" [dependencies] -async-trait = "0.1.74" -clap = { version = "4.4.18", features = ["derive"] } +async-trait = "0.1.79" +clap = { version = "4.5.3", features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.0.0" } criterion = { version = "0.5.1", features = ["async_tokio"] } -jsonrpsee = { version = "0.20.3", features = ["server"] } +jsonrpsee = { version = "0.22", features = ["server"] } rand = "0.8.5" -serde = { version = "1.0.195", features = ["derive"] } -serde_json = "1.0.111" +serde = { features = ["derive"], workspace = true, default-features = true } +serde_json = { workspace = true, default-features = true } tokio = { version = "1.32.0", features = ["macros"] } tracing = "0.1.37" url = "2.4.0" @@ -34,6 +34,7 @@ sc-basic-authorship = { path = "../../../substrate/client/basic-authorship" } sc-chain-spec = { path = "../../../substrate/client/chain-spec" } sc-client-api = { path = "../../../substrate/client/api" } sc-consensus = { path = "../../../substrate/client/consensus/common" } +sc-consensus-aura = { path = "../../../substrate/client/consensus/aura" } sc-executor = { path = "../../../substrate/client/executor" } sc-network = { path = "../../../substrate/client/network" } sc-service = { path = "../../../substrate/client/service" } @@ -52,6 +53,7 @@ sp-state-machine = { path = "../../../substrate/primitives/state-machine" } sp-tracing = { path = "../../../substrate/primitives/tracing" } sp-timestamp = { path = "../../../substrate/primitives/timestamp" } sp-consensus = { path = "../../../substrate/primitives/consensus/common" } +sp-consensus-aura = { path = "../../../substrate/primitives/consensus/aura" } substrate-test-client = { path = "../../../substrate/test-utils/client" } sc-cli = { path = "../../../substrate/client/cli" } sc-block-builder = { path = "../../../substrate/client/block-builder" } @@ -70,9 +72,12 @@ polkadot-overseer = { path = "../../../polkadot/node/overseer" } cumulus-client-cli = { path = "../../client/cli" } parachains-common = { path = "../../parachains/common" } cumulus-client-consensus-common = { path = "../../client/consensus/common" } +cumulus-client-consensus-proposer = { path = "../../client/consensus/proposer" } +cumulus-client-consensus-aura = { path = "../../client/consensus/aura" } cumulus-client-consensus-relay-chain = { path = "../../client/consensus/relay-chain" } cumulus-client-parachain-inherent = { path = "../../client/parachain-inherent" } cumulus-client-service = { path = "../../client/service" } +cumulus-client-collator = { path = "../../client/collator" } cumulus-primitives-core = { path = "../../primitives/core" } cumulus-relay-chain-inprocess-interface = { path = "../../client/relay-chain-inprocess-interface" } cumulus-relay-chain-interface = { path = "../../client/relay-chain-interface" } @@ -81,13 +86,13 @@ cumulus-relay-chain-minimal-node = { path = "../../client/relay-chain-minimal-no cumulus-client-pov-recovery = { path = "../../client/pov-recovery" } cumulus-test-relay-sproof-builder = { path = "../relay-sproof-builder" } cumulus-pallet-parachain-system = { path = "../../pallets/parachain-system", default-features = false, features = ["parameterized-consensus-hook"] } +cumulus-primitives-storage-weight-reclaim = { path = "../../primitives/storage-weight-reclaim" } pallet-timestamp = { path = "../../../substrate/frame/timestamp" } [dev-dependencies] futures = "0.3.28" portpicker = "0.1.1" rococo-parachain-runtime = { path = "../../parachains/runtimes/testing/rococo-parachain" } -pallet-im-online = { path = "../../../substrate/frame/im-online" } sp-consensus-grandpa = { path = "../../../substrate/primitives/consensus/grandpa" } sp-authority-discovery = { path = "../../../substrate/primitives/authority-discovery" } cumulus-test-client = { path = "../client" } @@ -105,7 +110,6 @@ runtime-benchmarks = [ "cumulus-primitives-core/runtime-benchmarks", "cumulus-test-client/runtime-benchmarks", "frame-system/runtime-benchmarks", - "pallet-im-online/runtime-benchmarks", "pallet-timestamp/runtime-benchmarks", "parachains-common/runtime-benchmarks", "polkadot-cli/runtime-benchmarks", diff --git a/cumulus/test/service/benches/validate_block.rs b/cumulus/test/service/benches/validate_block.rs index a614863803e09e89ff9671dd6916ccbfeb657278..34b09d99ce9857f0bfb4190163202469aaf9746b 100644 --- a/cumulus/test/service/benches/validate_block.rs +++ b/cumulus/test/service/benches/validate_block.rs @@ -47,7 +47,7 @@ fn create_extrinsics( src_accounts: &[sr25519::Pair], dst_accounts: &[sr25519::Pair], ) -> (usize, Vec) { - // Add as many tranfer extrinsics as possible into a single block. + // Add as many transfer extrinsics as possible into a single block. let mut block_builder = BlockBuilderBuilder::new(client) .on_parent_block(client.chain_info().best_hash) .with_parent_block_number(client.chain_info().best_number) @@ -107,8 +107,9 @@ fn benchmark_block_validation(c: &mut Criterion) { ..Default::default() }; - let mut block_builder = + let cumulus_test_client::BlockBuilderAndSupportData { mut block_builder, .. } = client.init_block_builder(Some(validation_data), sproof_builder.clone()); + for extrinsic in extrinsics { block_builder.push(extrinsic).unwrap(); } diff --git a/cumulus/test/service/benches/validate_block_glutton.rs b/cumulus/test/service/benches/validate_block_glutton.rs index 0e049d8665dc4f26f39d25235cdc146650070489..6ec338c7f14280fc0de6f1067e94e3f5e77de77c 100644 --- a/cumulus/test/service/benches/validate_block_glutton.rs +++ b/cumulus/test/service/benches/validate_block_glutton.rs @@ -20,8 +20,8 @@ use core::time::Duration; use criterion::{criterion_group, criterion_main, BatchSize, Criterion}; use cumulus_primitives_core::{relay_chain::AccountId, PersistedValidationData, ValidationParams}; use cumulus_test_client::{ - generate_extrinsic_with_pair, BuildParachainBlockData, Client, InitBlockBuilder, - ParachainBlockData, TestClientBuilder, ValidationResult, + generate_extrinsic_with_pair, BlockBuilderAndSupportData, BuildParachainBlockData, Client, + InitBlockBuilder, ParachainBlockData, TestClientBuilder, ValidationResult, }; use cumulus_test_relay_sproof_builder::RelayStateSproofBuilder; use cumulus_test_runtime::{Block, GluttonCall, Header, SudoCall}; @@ -88,7 +88,8 @@ fn benchmark_block_validation(c: &mut Criterion) { parent_head: parent_header.encode().into(), ..Default::default() }; - let block_builder = client.init_block_builder(Some(validation_data), Default::default()); + let BlockBuilderAndSupportData { block_builder, .. } = + client.init_block_builder(Some(validation_data), Default::default()); let parachain_block = block_builder.build_parachain_block(*parent_header.state_root()); let proof_size_in_kb = parachain_block.storage_proof().encode().len() as f64 / 1024f64; @@ -197,7 +198,8 @@ fn set_glutton_parameters( ); extrinsics.push(set_storage); - let mut block_builder = client.init_block_builder(Some(validation_data), Default::default()); + let BlockBuilderAndSupportData { mut block_builder, .. } = + client.init_block_builder(Some(validation_data), Default::default()); for extrinsic in extrinsics { block_builder.push(extrinsic).unwrap(); diff --git a/cumulus/test/service/src/chain_spec.rs b/cumulus/test/service/src/chain_spec.rs index 61bbf755d890aab92c0c714663a7e24c1c286696..4db2513e2b6311675c8d3b565a817d1b7ce95f8b 100644 --- a/cumulus/test/service/src/chain_spec.rs +++ b/cumulus/test/service/src/chain_spec.rs @@ -18,6 +18,7 @@ use cumulus_primitives_core::ParaId; use cumulus_test_runtime::{AccountId, RuntimeGenesisConfig, Signature}; +use parachains_common::AuraId; use sc_chain_spec::{ChainSpecExtension, ChainSpecGroup}; use sc_service::ChainType; use serde::{Deserialize, Serialize}; @@ -34,7 +35,7 @@ pub fn get_from_seed(seed: &str) -> ::Pu .public() } -/// The extensions for the [`ChainSpec`](crate::ChainSpec). +/// The extensions for the [`ChainSpec`]. #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, ChainSpecGroup, ChainSpecExtension)] #[serde(deny_unknown_fields)] pub struct Extensions { @@ -105,21 +106,43 @@ pub fn testnet_genesis_with_default_endowed( get_account_id_from_seed::("Ferdie//stash"), ]; endowed.append(&mut extra_endowed_accounts); + let invulnerables = vec![ + get_collator_keys_from_seed::("Alice"), + get_collator_keys_from_seed::("Bob"), + get_collator_keys_from_seed::("Charlie"), + get_collator_keys_from_seed::("Dave"), + get_collator_keys_from_seed::("Eve"), + get_collator_keys_from_seed::("Ferdie"), + ]; + testnet_genesis( + get_account_id_from_seed::("Alice"), + invulnerables, + endowed, + self_para_id, + ) +} - testnet_genesis(get_account_id_from_seed::("Alice"), endowed, self_para_id) +/// Generate collator keys from seed. +/// +/// This function's return type must always match the session keys of the chain in tuple format. +pub fn get_collator_keys_from_seed(seed: &str) -> ::Public { + get_from_seed::(seed) } /// Creates a local testnet genesis with endowed accounts. pub fn testnet_genesis( root_key: AccountId, + invulnerables: Vec, endowed_accounts: Vec, self_para_id: Option, ) -> serde_json::Value { + let self_para_id = self_para_id.unwrap_or(cumulus_test_runtime::PARACHAIN_ID.into()); serde_json::json!({ "balances": cumulus_test_runtime::BalancesConfig { balances: endowed_accounts.iter().cloned().map(|k| (k, 1 << 60)).collect(), }, "sudo": cumulus_test_runtime::SudoConfig { key: Some(root_key) }, - "testPallet": cumulus_test_runtime::TestPalletConfig { self_para_id, ..Default::default() } + "testPallet": cumulus_test_runtime::TestPalletConfig { self_para_id: Some(self_para_id), ..Default::default() }, + "aura": cumulus_test_runtime::AuraConfig { authorities: invulnerables } }) } diff --git a/cumulus/test/service/src/lib.rs b/cumulus/test/service/src/lib.rs index aa2c4af97dfddd83e447bbf92f3b133daa30ce75..11aa2e5b9f35c353bb4602385a28e41f3caab261 100644 --- a/cumulus/test/service/src/lib.rs +++ b/cumulus/test/service/src/lib.rs @@ -23,8 +23,15 @@ pub mod bench_utils; pub mod chain_spec; +use cumulus_client_collator::service::CollatorService; +use cumulus_client_consensus_aura::{ + collators::lookahead::{self as aura, Params as AuraParams}, + ImportQueueParams, +}; +use cumulus_client_consensus_proposer::Proposer; use runtime::AccountId; use sc_executor::{HeapAllocStrategy, WasmExecutor, DEFAULT_HEAP_ALLOC_STRATEGY}; +use sp_consensus_aura::sr25519::AuthorityPair; use std::{ collections::HashSet, future::Future, @@ -45,7 +52,7 @@ use cumulus_client_service::{ build_network, prepare_node_config, start_relay_chain_tasks, BuildNetworkParams, CollatorSybilResistance, DARecoveryProfile, StartRelayChainTasksParams, }; -use cumulus_primitives_core::ParaId; +use cumulus_primitives_core::{relay_chain::ValidationCode, ParaId}; use cumulus_relay_chain_inprocess_interface::RelayChainInProcessInterface; use cumulus_relay_chain_interface::{RelayChainError, RelayChainInterface, RelayChainResult}; use cumulus_relay_chain_minimal_node::{ @@ -62,19 +69,21 @@ use polkadot_service::ProvideRuntimeApi; use sc_consensus::ImportQueue; use sc_network::{ config::{FullNetworkConfiguration, TransportConfig}, - multiaddr, NetworkBlock, NetworkService, NetworkStateInfo, + multiaddr, + service::traits::NetworkService, + NetworkBackend, NetworkBlock, NetworkStateInfo, }; use sc_service::{ config::{ BlocksPruning, DatabaseSource, KeystoreConfig, MultiaddrWithPeerId, NetworkConfiguration, - OffchainWorkerConfig, PruningMode, WasmExecutionMethod, + OffchainWorkerConfig, PruningMode, RpcBatchRequestConfig, WasmExecutionMethod, }, BasePath, ChainSpec as ChainSpecService, Configuration, Error as ServiceError, PartialComponents, Role, RpcHandlers, TFullBackend, TFullClient, TaskManager, }; use sp_arithmetic::traits::SaturatedConversion; use sp_blockchain::HeaderBackend; -use sp_core::{Pair, H256}; +use sp_core::Pair; use sp_keyring::Sr25519Keyring; use sp_runtime::{codec::Encode, generic}; use sp_state_machine::BasicExternalities; @@ -108,27 +117,10 @@ impl ParachainConsensus for NullConsensus { /// The signature of the announce block fn. pub type AnnounceBlockFn = Arc>) + Send + Sync>; -/// Native executor instance. -pub struct RuntimeExecutor; - -impl sc_executor::NativeExecutionDispatch for RuntimeExecutor { - type ExtendHostFunctions = (); - - fn dispatch(method: &str, data: &[u8]) -> Option> { - cumulus_test_runtime::api::dispatch(method, data) - } - - fn native_version() -> sc_executor::NativeVersion { - cumulus_test_runtime::native_version() - } -} - +type HostFunctions = + (sp_io::SubstrateHostFunctions, cumulus_client_service::storage_proof_size::HostFunctions); /// The client type being used by the test service. -pub type Client = TFullClient< - runtime::NodeBlock, - runtime::RuntimeApi, - sc_executor::NativeElseWasmExecutor, ->; +pub type Client = TFullClient>; /// The backend type being used by the test service. pub type Backend = TFullBackend; @@ -201,7 +193,7 @@ pub fn new_partial( .default_heap_pages .map_or(DEFAULT_HEAP_ALLOC_STRATEGY, |h| HeapAllocStrategy::Static { extra_pages: h as _ }); - let wasm = WasmExecutor::builder() + let executor = WasmExecutor::builder() .with_execution_method(config.wasm_method) .with_onchain_heap_alloc_strategy(heap_pages) .with_offchain_heap_alloc_strategy(heap_pages) @@ -209,9 +201,6 @@ pub fn new_partial( .with_runtime_cache_size(config.runtime_cache_size) .build(); - let executor = - sc_executor::NativeElseWasmExecutor::::new_with_wasm_executor(wasm); - let (client, backend, keystore_container, task_manager) = sc_service::new_full_parts_record_import::( config, @@ -221,10 +210,7 @@ pub fn new_partial( )?; let client = Arc::new(client); - let block_import = - ParachainBlockImport::new_with_delayed_best_block(client.clone(), backend.clone()); - - let registry = config.prometheus_registry(); + let block_import = ParachainBlockImport::new(client.clone(), backend.clone()); let transaction_pool = sc_transaction_pool::BasicPool::new_full( config.transaction_pool.clone(), @@ -234,12 +220,26 @@ pub fn new_partial( client.clone(), ); - let import_queue = cumulus_client_consensus_relay_chain::import_queue( - client.clone(), - block_import.clone(), - |_, _| async { Ok(sp_timestamp::InherentDataProvider::from_system_time()) }, - &task_manager.spawn_essential_handle(), - registry, + let slot_duration = sc_consensus_aura::slot_duration(&*client)?; + let import_queue = cumulus_client_consensus_aura::import_queue::( + ImportQueueParams { + block_import: block_import.clone(), + client: client.clone(), + create_inherent_data_providers: move |_, ()| async move { + let timestamp = sp_timestamp::InherentDataProvider::from_system_time(); + + let slot = + sp_consensus_aura::inherents::InherentDataProvider::from_timestamp_and_slot_duration( + *timestamp, + slot_duration, + ); + + Ok((slot, timestamp)) + }, + spawner: &task_manager.spawn_essential_handle(), + registry: None, + telemetry: None, + }, )?; let params = PartialComponents { @@ -304,7 +304,7 @@ async fn build_relay_chain_interface( /// /// This is the actual implementation that is abstract over the executor and the runtime api. #[sc_tracing::logging::prefix_logs_with(parachain_config.network.node_name.as_str())] -pub async fn start_node_impl( +pub async fn start_node_impl>( parachain_config: Configuration, collator_key: Option, relay_chain_config: Configuration, @@ -318,7 +318,7 @@ pub async fn start_node_impl( ) -> sc_service::error::Result<( TaskManager, Arc, - Arc>, + Arc, RpcHandlers, TransactionPool, Arc, @@ -348,7 +348,7 @@ where .map_err(|e| sc_service::Error::Application(Box::new(e) as Box<_>))?; let import_queue_service = params.import_queue.service(); - let net_config = FullNetworkConfiguration::new(¶chain_config.network); + let net_config = FullNetworkConfiguration::::new(¶chain_config.network); let (network, system_rpc_tx, tx_handler_controller, start_network, sync_service) = build_network(BuildNetworkParams { @@ -360,12 +360,16 @@ where spawn_handle: task_manager.spawn_handle(), relay_chain_interface: relay_chain_interface.clone(), import_queue: params.import_queue, - sybil_resistance_level: CollatorSybilResistance::Unresistant, // no consensus + sybil_resistance_level: CollatorSybilResistance::Resistant, /* Either Aura that is + * resistant or null that + * is not producing any + * blocks at all. */ }) .await?; let prometheus_registry = parachain_config.prometheus_registry().cloned(); + let keystore = params.keystore_container.keystore(); let rpc_builder = { let client = client.clone(); Box::new(move |_, _| rpc_ext_builder(client.clone())) @@ -377,7 +381,7 @@ where transaction_pool: transaction_pool.clone(), task_manager: &mut task_manager, config: parachain_config, - keystore: params.keystore_container.keystore(), + keystore: keystore.clone(), backend: backend.clone(), network: network.clone(), sync_service: sync_service.clone(), @@ -395,8 +399,6 @@ where .map(|w| (w)(announce_block.clone())) .unwrap_or_else(|| announce_block); - let relay_chain_interface_for_closure = relay_chain_interface.clone(); - let overseer_handle = relay_chain_interface .overseer_handle() .map_err(|e| sc_service::Error::Application(Box::new(e)))?; @@ -427,59 +429,61 @@ where })?; if let Some(collator_key) = collator_key { - let parachain_consensus: Box> = match consensus { - Consensus::RelayChain => { - let proposer_factory = sc_basic_authorship::ProposerFactory::with_proof_recording( - task_manager.spawn_handle(), - client.clone(), - transaction_pool.clone(), - prometheus_registry.as_ref(), - None, - ); - let relay_chain_interface2 = relay_chain_interface_for_closure.clone(); - Box::new(cumulus_client_consensus_relay_chain::RelayChainConsensus::new( - para_id, - proposer_factory, - move |_, (relay_parent, validation_data)| { - let relay_chain_interface = relay_chain_interface_for_closure.clone(); - async move { - let parachain_inherent = - cumulus_client_parachain_inherent::ParachainInherentDataProvider::create_at( - relay_parent, - &relay_chain_interface, - &validation_data, - para_id, - ).await; - - let time = sp_timestamp::InherentDataProvider::from_system_time(); - - let parachain_inherent = parachain_inherent.ok_or_else(|| { - Box::::from(String::from( - "error", - )) - })?; - Ok((time, parachain_inherent)) - } - }, - block_import, - relay_chain_interface2, - )) - }, - Consensus::Null => Box::new(NullConsensus), - }; - - #[allow(deprecated)] - old_consensus::start_collator(old_consensus::StartCollatorParams { - block_status: client.clone(), - announce_block, - runtime_api: client.clone(), - spawner: task_manager.spawn_handle(), - para_id, - parachain_consensus, - key: collator_key, - overseer_handle, - }) - .await; + if let Consensus::Null = consensus { + #[allow(deprecated)] + old_consensus::start_collator(old_consensus::StartCollatorParams { + block_status: client.clone(), + announce_block, + runtime_api: client.clone(), + spawner: task_manager.spawn_handle(), + para_id, + parachain_consensus: Box::new(NullConsensus) as Box<_>, + key: collator_key, + overseer_handle, + }) + .await; + } else { + let proposer_factory = sc_basic_authorship::ProposerFactory::with_proof_recording( + task_manager.spawn_handle(), + client.clone(), + transaction_pool.clone(), + prometheus_registry.as_ref(), + None, + ); + let proposer = Proposer::new(proposer_factory); + + let collator_service = CollatorService::new( + client.clone(), + Arc::new(task_manager.spawn_handle()), + announce_block, + client.clone(), + ); + + let client_for_aura = client.clone(); + let params = AuraParams { + create_inherent_data_providers: move |_, ()| async move { Ok(()) }, + block_import, + para_client: client.clone(), + para_backend: backend.clone(), + relay_client: relay_chain_interface, + code_hash_provider: move |block_hash| { + client_for_aura.code_at(block_hash).ok().map(|c| ValidationCode::from(c).hash()) + }, + sync_oracle: sync_service, + keystore, + collator_key, + para_id, + overseer_handle, + relay_chain_slot_duration, + proposer, + collator_service, + authoring_duration: Duration::from_millis(2000), + reinitialize: false, + }; + + let fut = aura::run::(params); + task_manager.spawn_essential_handle().spawn("aura", None, fut); + } } start_network.start_network(); @@ -494,7 +498,7 @@ pub struct TestNode { /// Client's instance. pub client: Arc, /// Node's network. - pub network: Arc>, + pub network: Arc, /// The `MultiaddrWithPeerId` to this node. This is useful if you want to pass it as "boot /// node" to other nodes. pub addr: MultiaddrWithPeerId, @@ -508,8 +512,8 @@ pub struct TestNode { #[allow(missing_docs)] pub enum Consensus { - /// Use the relay-chain provided consensus. - RelayChain, + /// Use Aura consensus. + Aura, /// Use the null consensus that will never produce any block. Null, } @@ -551,7 +555,7 @@ impl TestNodeBuilder { wrap_announce_block: None, storage_update_func_parachain: None, storage_update_func_relay_chain: None, - consensus: Consensus::RelayChain, + consensus: Consensus::Aura, endowed_accounts: Default::default(), relay_chain_mode: RelayChainMode::Embedded, record_proof_during_import: true, @@ -702,21 +706,38 @@ impl TestNodeBuilder { let multiaddr = parachain_config.network.listen_addresses[0].clone(); let (task_manager, client, network, rpc_handlers, transaction_pool, backend) = - start_node_impl( - parachain_config, - self.collator_key, - relay_chain_config, - self.para_id, - self.wrap_announce_block, - false, - |_| Ok(jsonrpsee::RpcModule::new(())), - self.consensus, - collator_options, - self.record_proof_during_import, - ) - .await - .expect("could not create Cumulus test service"); - + match relay_chain_config.network.network_backend { + sc_network::config::NetworkBackendType::Libp2p => + start_node_impl::<_, sc_network::NetworkWorker<_, _>>( + parachain_config, + self.collator_key, + relay_chain_config, + self.para_id, + self.wrap_announce_block, + false, + |_| Ok(jsonrpsee::RpcModule::new(())), + self.consensus, + collator_options, + self.record_proof_during_import, + ) + .await + .expect("could not create Cumulus test service"), + sc_network::config::NetworkBackendType::Litep2p => + start_node_impl::<_, sc_network::Litep2pNetworkBackend>( + parachain_config, + self.collator_key, + relay_chain_config, + self.para_id, + self.wrap_announce_block, + false, + |_| Ok(jsonrpsee::RpcModule::new(())), + self.consensus, + collator_options, + self.record_proof_during_import, + ) + .await + .expect("could not create Cumulus test service"), + }; let peer_id = network.local_peer_id(); let addr = MultiaddrWithPeerId { multiaddr, peer_id }; @@ -735,7 +756,7 @@ pub fn node_config( tokio_handle: tokio::runtime::Handle, key: Sr25519Keyring, nodes: Vec, - nodes_exlusive: bool, + nodes_exclusive: bool, para_id: ParaId, is_collator: bool, endowed_accounts: Vec, @@ -759,7 +780,7 @@ pub fn node_config( None, ); - if nodes_exlusive { + if nodes_exclusive { network_config.default_peers_set.reserved_nodes = nodes; network_config.default_peers_set.non_reserved_mode = sc_network::config::NonReservedPeerMode::Deny; @@ -801,6 +822,8 @@ pub fn node_config( rpc_max_subs_per_conn: Default::default(), rpc_port: 9945, rpc_message_buffer_capacity: Default::default(), + rpc_batch_config: RpcBatchRequestConfig::Unlimited, + rpc_rate_limit: None, prometheus_config: None, telemetry_endpoints: None, default_heap_pages: None, @@ -892,11 +915,12 @@ pub fn construct_extrinsic( frame_system::CheckNonce::::from(nonce), frame_system::CheckWeight::::new(), pallet_transaction_payment::ChargeTransactionPayment::::from(tip), + cumulus_primitives_storage_weight_reclaim::StorageWeightReclaim::::new(), ); let raw_payload = runtime::SignedPayload::from_raw( function.clone(), extra.clone(), - ((), runtime::VERSION.spec_version, genesis_block, current_block_hash, (), (), ()), + ((), runtime::VERSION.spec_version, genesis_block, current_block_hash, (), (), (), ()), ); let signature = raw_payload.using_encoded(|e| caller.sign(e)); runtime::UncheckedExtrinsic::new_signed( diff --git a/cumulus/test/service/src/main.rs b/cumulus/test/service/src/main.rs index 69a71a15389a58002e3ad3ac26495a48a0a0cd40..90d37173dd5907ebf1f4a136a284ef50dda816e8 100644 --- a/cumulus/test/service/src/main.rs +++ b/cumulus/test/service/src/main.rs @@ -98,21 +98,47 @@ fn main() -> Result<(), sc_cli::Error> { tracing::info!("Using null consensus."); cumulus_test_service::Consensus::Null }) - .unwrap_or(cumulus_test_service::Consensus::RelayChain); + .unwrap_or(cumulus_test_service::Consensus::Aura); let (mut task_manager, _, _, _, _, _) = tokio_runtime - .block_on(cumulus_test_service::start_node_impl( - config, - collator_key, - polkadot_config, - parachain_id.into(), - cli.disable_block_announcements.then(wrap_announce_block), - cli.fail_pov_recovery, - |_| Ok(jsonrpsee::RpcModule::new(())), - consensus, - collator_options, - true, - )) + .block_on(async move { + match polkadot_config.network.network_backend { + sc_network::config::NetworkBackendType::Libp2p => + cumulus_test_service::start_node_impl::< + _, + sc_network::NetworkWorker<_, _>, + >( + config, + collator_key, + polkadot_config, + parachain_id.into(), + cli.disable_block_announcements.then(wrap_announce_block), + cli.fail_pov_recovery, + |_| Ok(jsonrpsee::RpcModule::new(())), + consensus, + collator_options, + true, + ) + .await, + sc_network::config::NetworkBackendType::Litep2p => + cumulus_test_service::start_node_impl::< + _, + sc_network::Litep2pNetworkBackend, + >( + config, + collator_key, + polkadot_config, + parachain_id.into(), + cli.disable_block_announcements.then(wrap_announce_block), + cli.fail_pov_recovery, + |_| Ok(jsonrpsee::RpcModule::new(())), + consensus, + collator_options, + true, + ) + .await, + } + }) .expect("could not create Cumulus test service"); tokio_runtime diff --git a/cumulus/xcm/xcm-emulator/Cargo.toml b/cumulus/xcm/xcm-emulator/Cargo.toml index fb37fd01765e1623b1e412262948e1baae14f8d0..6b45770a8e3df47cb083dba5a8a0eeed1759e338 100644 --- a/cumulus/xcm/xcm-emulator/Cargo.toml +++ b/cumulus/xcm/xcm-emulator/Cargo.toml @@ -12,7 +12,7 @@ workspace = true [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0" } paste = "1.0.14" -log = { version = "0.4.20", default-features = false } +log = { workspace = true } lazy_static = "1.4.0" impl-trait-for-tuples = "0.2.2" diff --git a/cumulus/zombienet/tests/0002-pov_recovery.toml b/cumulus/zombienet/tests/0002-pov_recovery.toml index fe42fd4b2f6681154e89d5e7274618a8f307dfab..15a61eba2a0342bce55f805473d2c3ba9b51c7f8 100644 --- a/cumulus/zombienet/tests/0002-pov_recovery.toml +++ b/cumulus/zombienet/tests/0002-pov_recovery.toml @@ -4,7 +4,7 @@ default_command = "polkadot" chain = "rococo-local" -[relaychain.genesis.runtimeGenesis.patch.configuration.config] +[relaychain.genesis.runtimeGenesis.patch.configuration.config.scheduler_params] # set parameters such that collators only connect to 1 validator as a backing group max_validators_per_core = 1 group_rotation_frequency = 100 # 10 mins diff --git a/cumulus/zombienet/tests/0007-full_node_warp_sync.toml b/cumulus/zombienet/tests/0007-full_node_warp_sync.toml index 524ce6643ce18bd1df4f402a844275198d39f645..95f1b51f129321ec8c207c6469ba4dd107626014 100644 --- a/cumulus/zombienet/tests/0007-full_node_warp_sync.toml +++ b/cumulus/zombienet/tests/0007-full_node_warp_sync.toml @@ -8,17 +8,17 @@ chain_spec_path = "0007-warp-sync-relaychain-spec.json" [[relaychain.nodes]] name = "alice" validator = true - db_snapshot = "https://storage.googleapis.com/zombienet-db-snaps/cumulus/0007-full_node_warp_sync/relaychain-1964f8b557f10085cdc18f4105ad0bbb3df4c4c6.tgz" + db_snapshot = "https://storage.googleapis.com/zombienet-db-snaps/cumulus/0007-full_node_warp_sync/relaychain-12523fe793bff9f6d68651816879a09eec2c1462.tgz" [[relaychain.nodes]] name = "bob" validator = true - db_snapshot = "https://storage.googleapis.com/zombienet-db-snaps/cumulus/0007-full_node_warp_sync/relaychain-1964f8b557f10085cdc18f4105ad0bbb3df4c4c6.tgz" + db_snapshot = "https://storage.googleapis.com/zombienet-db-snaps/cumulus/0007-full_node_warp_sync/relaychain-12523fe793bff9f6d68651816879a09eec2c1462.tgz" [[relaychain.nodes]] name = "charlie" validator = true - db_snapshot = "https://storage.googleapis.com/zombienet-db-snaps/cumulus/0007-full_node_warp_sync/relaychain-1964f8b557f10085cdc18f4105ad0bbb3df4c4c6.tgz" + db_snapshot = "https://storage.googleapis.com/zombienet-db-snaps/cumulus/0007-full_node_warp_sync/relaychain-12523fe793bff9f6d68651816879a09eec2c1462.tgz" [[relaychain.nodes]] name = "dave" @@ -38,7 +38,7 @@ add_to_genesis = false image = "{{COL_IMAGE}}" command = "test-parachain" args = ["-lparachain=debug"] - db_snapshot = "https://storage.googleapis.com/zombienet-db-snaps/cumulus/0007-full_node_warp_sync/parachain-587c1ed24ddd7de05c237cf7c158fff53b8f5b26.tgz" + db_snapshot = "https://storage.googleapis.com/zombienet-db-snaps/cumulus/0007-full_node_warp_sync/parachain-f9bb05af6bef7afa50368540f5033f62359e9e5d.tgz" # Run 'eve' as parachain collator. [[parachains.collators]] @@ -47,7 +47,7 @@ add_to_genesis = false image = "{{COL_IMAGE}}" command = "test-parachain" args = ["-lparachain=debug"] - db_snapshot = "https://storage.googleapis.com/zombienet-db-snaps/cumulus/0007-full_node_warp_sync/parachain-587c1ed24ddd7de05c237cf7c158fff53b8f5b26.tgz" + db_snapshot = "https://storage.googleapis.com/zombienet-db-snaps/cumulus/0007-full_node_warp_sync/parachain-f9bb05af6bef7afa50368540f5033f62359e9e5d.tgz" # Run 'ferdie' as parachain collator. [[parachains.collators]] @@ -56,7 +56,7 @@ add_to_genesis = false image = "{{COL_IMAGE}}" command = "test-parachain" args = ["-lparachain=debug"] - db_snapshot = "https://storage.googleapis.com/zombienet-db-snaps/cumulus/0007-full_node_warp_sync/parachain-587c1ed24ddd7de05c237cf7c158fff53b8f5b26.tgz" + db_snapshot = "https://storage.googleapis.com/zombienet-db-snaps/cumulus/0007-full_node_warp_sync/parachain-f9bb05af6bef7afa50368540f5033f62359e9e5d.tgz" # Run 'one' as parachain full node. Parachain and relay chain are warpsyncing. [[parachains.collators]] diff --git a/cumulus/zombienet/tests/0007-full_node_warp_sync.zndsl b/cumulus/zombienet/tests/0007-full_node_warp_sync.zndsl index 9f503b2ad631de2764b74c5afacff093f0b42d21..3c0c84dc91f52ae654ecb599bcec78bcffc34b04 100644 --- a/cumulus/zombienet/tests/0007-full_node_warp_sync.zndsl +++ b/cumulus/zombienet/tests/0007-full_node_warp_sync.zndsl @@ -3,7 +3,7 @@ Network: ./0007-full_node_warp_sync.toml Creds: config alice: parachain 2000 is registered within 225 seconds -one: reports block height is at least 770 within 225 seconds -two: reports block height is at least 770 within 225 seconds -three: reports block height is at least 770 within 225 seconds -four: reports block height is at least 770 within 225 seconds +one: reports block height is at least 930 within 225 seconds +two: reports block height is at least 930 within 225 seconds +three: reports block height is at least 930 within 225 seconds +four: reports block height is at least 930 within 225 seconds diff --git a/cumulus/zombienet/tests/0007-warp-sync-parachain-spec.json b/cumulus/zombienet/tests/0007-warp-sync-parachain-spec.json index 306e82e8d03d1dc04aff45e9fb5ac83c7483c25e..d287f491235c57faa24d63743dc5ee8a6ce2700f 100644 --- a/cumulus/zombienet/tests/0007-warp-sync-parachain-spec.json +++ b/cumulus/zombienet/tests/0007-warp-sync-parachain-spec.json @@ -2,9 +2,7 @@ "name": "Local Testnet", "id": "local_testnet", "chainType": "Local", - "bootNodes": [ - "/ip4/127.0.0.1/tcp/63048/ws/p2p/12D3KooWKM1HeSv61ryZwAiBTZnqmass5pYM48k9Z7obzhTbnphm" - ], + "bootNodes": [], "telemetryEndpoints": null, "protocolId": null, "properties": null, @@ -19,32 +17,40 @@ "0x26aa394eea5630e07c48ae0c9558cef78a42f33323cb5ced3b44dd825fda9fcc": "0x4545454545454545454545454545454545454545454545454545454545454545", "0x26aa394eea5630e07c48ae0c9558cef7a44704b568d21667356a5a050c118746b4def25cfda6ef3a00000000": "0x4545454545454545454545454545454545454545454545454545454545454545", "0x26aa394eea5630e07c48ae0c9558cef7a7fd6c28836b9a28522dc924110cf439": "0x01", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9007cbc1270b5b091758f9c42f5915b3e8ac59e11963af19174d0b94d5d78041c233f55d2e19324665bafdfb62925af2d": "0x0000000000000000010000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da923a05cabf6d3bde7ca3ef0d11596b5611cbd2d43530a44705ad088af313e18f80b53ef16b36177cd4b77b846f2a5f07c": "0x0000000000000000010000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da932a5935f6edc617ae178fef9eb1e211fbe5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f": "0x0000000000000000010000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da94f9aea1afa791265fae359272badc1cf8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48": "0x0000000000000000010000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da96f2e33376834a63c86a195bcf685aebbfe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e": "0x0000000000000000010000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da98578796c363c105114787203e4d93ca6101191192fc877c24d725b337120fa3edc63d227bbc92705db1e2cb65f56981a": "0x0000000000000000010000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9b0edae20838083f2cde1c4080db8cf8090b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22": "0x0000000000000000010000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9b321d16960ce1d9190b61e2421cc60131e07379407fecc4b89eb7dbd287c2c781cfb1907a96947a3eb18e4f8e7198625": "0x0000000000000000010000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9de1e86a9a8c739864cf3cc5ec2bea59fd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d": "0x0000000000000000010000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9e5e802737cce3a54b0bc9e3d3e6be26e306721211d5404bd9da88e0204360a1a9ab8b87c66c1bc2fcdd37f3c2222cc20": "0x0000000000000000010000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9edeaa42c2163f68084a988529a0e2ec5e659a7a1628cdd93febc04a4e0646ea20e9f5f0ce097d9a05290d4a9e054df4e": "0x0000000000000000010000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9f3f619a1c2956443880db9cc9a13d058e860f1b1c7227f7c22602f53f15af80747814dffd839719731ee3bba6edc126c": "0x0000000000000000010000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9007cbc1270b5b091758f9c42f5915b3e8ac59e11963af19174d0b94d5d78041c233f55d2e19324665bafdfb62925af2d": "0x0000000000000000010000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da923a05cabf6d3bde7ca3ef0d11596b5611cbd2d43530a44705ad088af313e18f80b53ef16b36177cd4b77b846f2a5f07c": "0x0000000000000000010000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da932a5935f6edc617ae178fef9eb1e211fbe5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f": "0x0000000000000000010000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da94f9aea1afa791265fae359272badc1cf8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48": "0x0000000000000000010000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da96f2e33376834a63c86a195bcf685aebbfe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e": "0x0000000000000000010000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da98578796c363c105114787203e4d93ca6101191192fc877c24d725b337120fa3edc63d227bbc92705db1e2cb65f56981a": "0x0000000000000000010000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9b0edae20838083f2cde1c4080db8cf8090b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22": "0x0000000000000000010000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9b321d16960ce1d9190b61e2421cc60131e07379407fecc4b89eb7dbd287c2c781cfb1907a96947a3eb18e4f8e7198625": "0x0000000000000000010000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9de1e86a9a8c739864cf3cc5ec2bea59fd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d": "0x0000000000000000010000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9e5e802737cce3a54b0bc9e3d3e6be26e306721211d5404bd9da88e0204360a1a9ab8b87c66c1bc2fcdd37f3c2222cc20": "0x0000000000000000010000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9edeaa42c2163f68084a988529a0e2ec5e659a7a1628cdd93febc04a4e0646ea20e9f5f0ce097d9a05290d4a9e054df4e": "0x0000000000000000010000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9f3f619a1c2956443880db9cc9a13d058e860f1b1c7227f7c22602f53f15af80747814dffd839719731ee3bba6edc126c": "0x0000000000000000010000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080", "0x26aa394eea5630e07c48ae0c9558cef7f9cce9c888469bb1a0dceaa129672ef8": "0x045863756d756c75732d746573742d70617261636861696e", "0x2b746573745f72756e74696d655f757067726164655f6b65792b": "0x01020304", "0x3a63": "0x", - "0x3a636f6465": "0x52bc537646db8e0528b52ffd0058141105def98535124d107877930ef0565839f8f5c1e2f0077f0fad17c87323feddec14ff657b8b1316becd112e7e9b1869497315cfa9942f3bd3522e26b2907799a96820d709ac8778336b37217befbde59652a69452a31276112112514e4d04e913aaf0a8cf13fc73d5205479987a92e28907dacfe2848ae1a964908ae151e944fd89921adca00a50da080ae28932284a50108ffa74e22d271397c3e2a6eeb676ce2ec0031a6394e151d7ec02335bc8820ee2a082326578d46dbe1916e16ae7b6e7bb547ccfdbe3a6bd0719dbac8797d0d9f37d3d5139e3474c7aeeb6fdabb1750e9f73dbbe63c6827a5420bd1dbd2b6fe80dbdbd821e617b436fcabbfb829bfeebe128f80eb3435fe837cef7f96fdc14a03f0abe6ddf6d2eea0f65325cfadc2910e8ea4f81c0ed07263d57c2e730e9b9663d6312d15bc7f2e7a4d6b9fc390f2e3926457f0e840271fd11fdf9b5698c13ddda22e3c41cb175468c13bdf2e7aae5e70fff3c8702d97f0ea377971dd617bd9d8a95e7c1a4e8eceb9b45bfa1bc9fff86923f5be629d7139526bc9ea82ce1474c8a0e7fdc575299149ffe50d7cce90ff51d86dbfe13363dee1f5cca25aaddc9b9ef306adb7f9b73cd843c77ce6ffbd93241da9d4f31463308b43b8feee48cef28dfeca789284e4009fa9f598237c0a1cc4367627a28993c572651723ae7b72589519c80f23f5b6636c119912867139766429e3b775910e8aa3fe6a3b67db8fd6c995f7f3d4ede0c6977deeea40fbb933f4e7ef6f35b26e3a2fcdaace772cc9fc72d73552021877e85b620a69f985fae599018f289ae8e6d33fafab5af272aa77ffa03fa0e337bb645b7b6fdebd20c02ec55e5d956b9b5e9ba663d959c9563d5b67ff90e5fba617e6dfa97664254ce7d75cc2fc62e21d6abfe98ead7b5d885f90e2b766d71c398d47e44c3fc72eb671c121f933e95b36fb3f2f59dd68c087bb5d9cf9679cb777a87ad4dbfdaf4a33edcdee636c724c5b6af5cda01cdf91cfd8b4070e9e5fcf3e73f70e9e69f53b9f2cf79b00ef33c21feedf0cf352eb1bff79eab8f277df4f4e4525dd54de2d2378331c9d918c1a5e95f7afc5433def9732a3e7f0afa54304f39105c9aa31d2ecd380497a6a604972817824b374f7906d878ca3bc03a8ea7158c7679ca954b3c7edafc04e2a9e73bcce3e28d9ab2533ce51763bcf18f5cf0945fcaab1dfad932af94db70c9394539e5ea83923e3aa6b544910577405b1ff16041d0b3cdbb901e7d7bebea2c4fbbd6362fe452cb0c6d62639e5db31929907dedd2d0c544734c52e97a2322b9dad5c7d41397eebe7976c77e6acf3e3026ed9880b2814510c0acc10b18b8600c3c3a9a71bbee1c8828c2e8300fbb10bded633a9e1d5b89bd9ea2f8f24e8e98b47a72c3a51fd0d867c40270e90534f62bd485ebf50405981ff1b84c5966b0022a6499810bce1006cfb6af7fad63d23a2ec23189af4b3321504e7fe851df8c63929c40fd968fb874793b0f2e5117555572566e7945614cd2b84455de7e51dbfe553109f3cd848c1e931373cba94d1fdb80fa2bbf96753b446dfad7a66f55a35f8fad0385f328e3a8fe983c7ee584febcfdea5db8e933603d6e40ef17bb186be2a1eb366367fa66d6d5650a673026f960523be5ce24aa7573dbdc57871b50bffa6e1a93d837eb51f96464126befb1755c50505050104f3b4981f4b78fb7f6d1a0bd3723b4f5f83c42f1e5d9b1111441cfcee3b9cc086d5df79d894bf9ba1433f58e6b7d37324f4ed33fdf6d36b6dbfeb55376ca1a9df54ca9c2399eb5d115cfcec3b3f81d342ecdeb19c710d5c2ff6c999f463e0ba269bcfaf530e70562cf0c0a8353c25c0ddf320042ea970251a9fa637753263de998a412d0e6e8d9dbddfea88d67e74122f3ec3bb86dc4a4c9e3d7ed6bc2fa0ad4e0155879e627c6e82582ee9e5f3b42606837ced7db9f43efac07c27d4e0e59efb73bc6a51ed0f4f444987fafa727a2bccea8b1ce6940178fd62451ef0334cd1e607ae76494a65d077cd180226a80e95665674c9d33224cefa3f2e7c9ab4f766dc190a2c6eb498a979ff19d17e0f524e58a7717dcae7d1911a67742f6a14fd34319790b81f1fc7259cfeb8c08d3b766d06fa00cb20f1dcac8a475dd571f4efa68572e1ede2d24c6ae06b9f401eeb1bf44f0353bcb76f7a010f6f61d562edd04616f6f389ffbb43b87d02397f821f6a74b1fa05d22e5123b9742e6f557462639777e89767e9ebcfbd977120497728b2297dad99de3acc76d4684c96dfb9a75072ee51237a6dba53ea2b081e570690af1ed932404979cb7efc025eadb352ee9298a986fb7611de6f141fdfce1dbafc59475b4c651c7251ff6751b2eb1b72beb68e3b49b5126614c5a777e31b68ead2beb288f3a16e6d53763d72c08bbf321ec0ee312ebe90997f2a5ae3ee6063dab134d4f54d8f80dd2694c371fcda75d7f6e10bf9ea488f2fbeb9b15b1505ee5dc20e7ba3571afee3622a257ef4d15c8747e33c47a277f44afae687cce4f2df3b39df5755326e9b653b4f57d6504a86ff6e33fdab7dc205e820abefc8ccfeccccc5c9e9999d9d5072f7169073476e712894bd38db8d4ee430553be1d639de6e91df8278f6f6f775cf2d1d22727490e129a9e9cb8e2f504858d9fa4673fc0eb09cae935eb918036b51dd6348c4beafcfcd5afb7e9f7b67fa90fda3e6cec6dd037eb69e89a11617a786d36e43994f3f9f38bb321da3fd7cc31c9f9e5b0def6afc6e0f67c3365d2b4f9f5ebd20cca697ae8bdcdf8bc7b9beea1eff0d5db74c0b75f9a517236f194f736f5f4ed6f9bcaa4269850c24806be7d2a93a611df3edf10dfbed36fd3a7b69f2e53a60c997fdedb14e29d5f8bf5e6fc6dfa9a15413ddc7ea87f72eeb7fcd93265ca94f969fa76b72993563a26ade7bc02c004d741b9d43ac3ba94d4014d4f50b6fc8caf27285a5e1d639de5511f71494f41645e9dc7abab0f65c0a53f5c977249f7d7d52f9172491d97d8d5afbd1ca65cd29ff155671c50851626e9b7f376f6ce7a58eace38a08a2d4cd25fef4d9ddcac2732a95db32134eb61dfe16dc2a5cfeccb2c77d8b44bc4b5be9b04b45350989feed9e37a8cda3aca3853fbf5a9bddb45a2b779db7778bbbb7bbd7b993d3ecb1b22ecce799de5646fdefd72a98fe9cf7ee901b44b7dd0d4db35eb51df2c4813414141505ea53269c667bf18532ead734999c4bec3bd3926b1f7a0391f71495fe312bb0d97dad9475cda67d7aca7ddd6448767628abf1e7fe50d9175e7eb4e02edb7d4ac67e55c7f0580a9779f70e9ab8fa93dfb15b9347784c0d0d627f67cf566006dbd5d5db322d67d5a46264df7ea3b7cedd60fc37c132c742db69b7b4c812cd931ff437d139a26d8afb38714c8920dfa1f067c13f8ebec2205b26483fe8701bfceaed9101714f4eb3b7c31a60a647db62b93d42397e67ebbfad55b6492fa0fad5d5d33218e49ea2d2393d477f8626c377e4c812cd9d33781bfce9e2990251bf43f0cf875f6cd8ad0827e1de3923ebb664336e8d7777887777887755326a9ab0f963eda2b004cbccc854bf95a572e4df595ca247575d3ee8d4b4f41585ea94b11a0adab6b15c2e2002b30c10a7d110242e88a9095d095500c425484a4084d09419189216342e6253b4256459645f682cc0559956c8a2c0619958c05991459141610322cac1c6457322a322c5610321b585d584db098608db1b86075c1528295040b095617eb081619d618d6c912c3fa6241c17a82e504ab0ccb0c56192c32586b5863b0c46085c152c30283f505cb0b9618cb0a9616ac2c584bb0bc5855b0c058685854b0b060a5615dc11a82158645048b8b2504cb0bab07d6161617160d2c2b2c272c29aa32560b2a315463a8b05039a10a420584ea07d596ac0515964a07550eaa1b543ba86c50f1a0b2525151bda0aa52c1a092a26a017761304031b017380cf10a9512e00ee016d5140c835e4353a96440d1c04da1d8105510a34427a2940825ae203ed15f60151c0e1e1b54192832550cac18846410b241954595a5f2013503ea069916c8051cc3424165c179c15ae02c382add0316a3b9a0a2d02ca0aef416b18c2c0c991a5919b10ab00c1b0585a5ea810343d5c03d41d9c0ad20e2a0e202a4025a8941549987c6a30264c15bc263c253c22be321e13de1390152a990405dd1515461760ce481f301ec01f481bbc1c3f2821e0d1c1cde150fca93e2a4e0b8b82f9c10dc10f80b7b066a8b0bc302c381e1a8d04c8031e82a4022c02d108ca785078617c665f1e0f0cabc36a82d505fa0b8605909d1c0c520c34176036b061597d8047785b2c2ba6255615d414901d900e100dba0a85050282b140ca817502da0aa502ea0a68065281540375053e015a82720196a05140ba8200a0a180798059806c402b4027c03e5046c0315858a026a815ac02c1d6685b05fac17dbc5066181b03fd82deb83edc172b15b2c0f7607abc56ad92cab83cdc166b138582cf6069511ac2cdc15b21a505f2c1e341bad06aa8ae6018ba14a42ef80adb01a5c062603ab81cdc063780c1c0553612842537095ea0bb780a5e02916151c03a66289b061ac97adc182b1702000ceb6c192c1aab145d8306c12760d951728508105c396b14dd82fcb8475c21a61b9ac153b833d4225a6da4215859562a930b18492112449620211d8278c384111203882031ac8000450b02b183284909d0248901e0734e019b0000508918065010f3be4146003bdc5b5af0bbfa8b88f30390204459838e28812458a5cdb49283952a48845c9200475a04b844009922248145922044a8628590209d01149922cd10020248e2449b244030a0073a0404580981c918489111c01c4e4c80890540088c91144001d1102009805d0114b8e283922820de2409998e0884f1126458e24b10412479228c2c40447882859020913264728a003c4424b8084895f72c467c9121828628337d0234047248124c9114d8a1c21c1111248a002491c1181088ea84001201665e283c4112590b0813201527264c911259420715803254842700369a0482061a204c912a0268e14314112269838a2c8922349244142021e1f249648c2c3035ea1479050b2849222471441c2c41f4142c9121100524282259040e27b402b7404458e003a228923808e406006cee00448921c810408891224376015ea83c412494050e40810099038d2c4111a7845972cd1004cf74812101c01a4840421280284c4912548925082a448111d35ae0b6a4b172bb678355d7a0a0afa35b50ed85c3417cbc452eee6064208b71b08e1069f6355eeec712bbb6687ed3eb84bedae66cf35534edf83a2f7288ae26ec7ecdeebc7ce31e5a8d6eeeea7dcf03d65761c5d478bf945aa599f0eaf72f753d71d33aeb28a724d594ea3a80c73dcfa54b5f45eef788f9b52c7efbd4775333b8780a7af9595b9dd7b8f5d77436d6ed7caed28eda7aaaff5a973fa5455dbfda06a39cbb96676adad54f7019cba66ca418703070e1c9a166ad50e29a5aee3ebc8ccacec9859b51d845015f2636dbdac5675bb4ab55254e6b01bec1cd58e6137c54e536e657eafbbb97308cd74ab0f3b765cadd075373f4a5595626e0d398851146551cea90bf59013e281a17bdd0d9d638a72dbdc96a5da1445511453ce6198c330e7dab2ba9929ca3947313beab5aa62166635b363eea78e5b951bb6c8b5c5dcccdc90294a43aa8f5bb9bb356a37ecee7eccadddcddc1de26e6d758f2b664b64801f168b9455c7a39e0ed5d7cddabbdddadd4d59ed54d4d78e07e5b8bbdb717333f7beb7adfa9a454f7bd9396666c7ce3da7aadadcaacaedba55298ad276adcf2954854fbbdb51943e75eb1e3ff8203bb78f79f939ca6a8fdadd375e6bb376b3bed67694c332ca591a156364a6ba1f3bcbe95307ddd3c1dcddcceeedf09e0e14c5ef51bbb0003a40d17b0fbe97030170188a1ca4dec3b8b9df7bef31bf3782efe97b1dd9396739768ef53577776c071ff7d3dd0e610961d134ca2658b2c4088e8c00929238b2e448124b96285242800f47902c0122c000748c76f820710408922459820003d89123871c3a6822101247305172c412a0224048463082254835f246c91126983862b58711e4a0478e2c094191254b001d81c41249921c91437b38320224404a48b044da840088043d8e285104480992254c144182099211f0f8a1d4a389254a00944309013e388df600840f3d14f1e188cf1149405044044a9028c1e408253c022d390288c9007c58c2040097fa70840993234b9818c11248145972a4c912481c5952e40826492071a4480f3e2504f8c004124798e8544a20017404088a28c10489122421e81102244b8e342992801e1080001f923852640920264cb004090054dac3912647921469e28811e82000ed41044b2429220225484420822592e898719b268e24a104491125488e500289108460097980244990f8e40480c9007ca80f404b2c0180248e38b2846482233e45809a38a264871aa0232218000fed81091013244d1c2180541f9a401282234b98c869a2e448cf680f45942c8184c992234d8a2c39e24812248a1c11c1114b96006252248924489440a2085012121c1182234914016ae2084e1325471a278b01eb13131b51caf4c43241236a824f9e984c941135994cd1883e79f2e4491b3175371b79b2a6274f9eb8276d444d4f9e98dc65c4b4a6353d31b511933e79f2e4c9139333f2644d6be489c96419515365449fac9127fbe4091b31ed9335a24f9eb0291a31ad3e7962323923a63551469e4023a65523aaa667c4b42667444d2636a22693a98d98d6b446d4b44680682e565577044c8ed02f23e2bebb4021d39910d33b8f5ca2bce5e46f2a527e452a46f9d34f4987eb9a15f15c3308bc18c575ed4f9769630807adfee01de228b94a7a28786ec22b9740078abf0448eb7fbecac3734e9efbdb1fe69af043bf20d6d910d7bc1da29c923ffdf04975ce0497c5b8d4c77c55b60c2e511f1a822e717e5521ef1f58c7f2f62b6efb44fc2f8f9787b67d4b4e1e9d8d3623e2c0b47b6ccb22726bcb32c57944eeb69f27414f9d7e72d0b7f6d16d137bde5e84f85bee18ca69c91bcb9f849c593236f9117df4acbfa4a146b31144e54a165bc2f0624698351c9917854bbc45e10273de5e2e981181eee4947f859e3017641ef32a23d25de4b461523b26439b7e95694c6a5f32381bc2ffdc653d4b84e85b1edaf8abac2793aa3ccccbd73723c24452f097b7172e61de8ec9c944a0ec2e72c66db950e321b619044414ffacb575141ae3ac923fdb5e7475df0b39e7d4e61c6e6d06935210e4bd93fd457f3412b4d9a76f9ffde5dbfbd45db8e4854bfaaa601cb7b8e6f5acee54ba20a65f1944f47a841b6c51e5652888748a9882952368b1c51ae0d931272ee512558a3eb157eda7cde57384f9e4a14a7a3e7dbcba76c0f1c6c38d60db884712d7663352c2da349b24d586694cc42d62ff80be5d137053253dd7d7be2dddb5edc5a5acb333e71588d71f3f47bfafee743c2828c8091e75d20eeb389e0ed4e08c2c38a18630b0e004cf7ae4d20ebfaeb58e07c0dc600b54f882056c7802cffa6bb6fe57f80ccdc6df79e338df296853f4ce35d7dd22059243410a52942f1adaf4a7286d071f248d4bd029b719c10773da508526a8d36c98f4b220fc2cf50a9a663372ceb934d6b92d68537ba771c9b96b77eede7bce080b2393a06bd6833129eb5933b4397a38e212741e5c6287ee3eb8e41c3a894bcfa143c7342e6d2130286a975a0885e8d1594e41a71c3a257d288ab2a4f6a39cb461528c31468f31c618abaa8accec05f7d830ce738d49cf170bda74e7d2f3e73e486e0b81a141de1c2ea4f104783d6db1c50a5b60e1011bbfcadba120fdea05d36e908b0a5a0e97fa709a8605b4a0cdf8ad3eda036f734c7a0e8c36b57fcbed9c5cecea1a93b8a04dd1b348816c16e425447f85f0af0ca3ad6b8ecd37c638ed1a99d4623270a90fcdb60b9adb61e7ce45e0520b687ada4117efe3f5a44517cfb35043dc933ecfd9e79359a6380f2561eff07e41eb72a5cb43571f50fa68cbbb839938e396d1f4c4832c7ec6e9def1e08a8d83a6a71da8d13b0813a4e9890762fe7990c63ba74517ef9c07ab9c369990752c0b15417bae5299d45c5a672c97efc6abec5c1856be00af2730a6bcf3065db7f5eb867da9fc86f13b7cb94d9787b9535e2f8771d6ae9baa9c49b0770eb31e859059fe500fe793e75d2acf73df45b13ca8699b18423d54394d5454fe50bffeb3fbfc764084c6aeb7055cab34d0d82fe66e76ae5fe574221d93ba3ba4fa437f7039d77d1a68ebd72e636ebbddcd90f7bcffc9e9c431c9f93af706cd6998e7d2ba731e6cc3253df560ca3bcf691de5713cd3c73b20de87a3c2b77d5597f5a8c3b467d9a0add6cdbd7df2712910fd751d2d2828080a8f3a673d2bff62c738ced5f9b241d3da9d3bffc93edc0ee1f2c9f22487870be857e5d37dd6e3823c5fbf628c31c6aaf21f2bca263a3ee4d379555995e5d12b1772ce39b9ae8ff9c82daf86d07d6c9b46fca53e68f1a35f108b5cf269a7441edaa6111f72915faa409cc869341ea3a68d46fe343e494fe393f44ece24398f895c15c8e5be726beb8ffc91a19cbb9bea0f4b567eb9736b53fde1e4ac3ce43b7d6d338911d566c46b1664cba802b130e7aa402cd944c75b1ea39cce31df6c48fc9fe74c7c2a17b94fe530176b1cab89d13177ce63e5aea672ac923f96cc02c50edf51b3434231e29182c36b241491478a0e97a2e518fd8c8f66fc864b51c599f1677ce434db4c92f34c4c2f72cc673691eb6741affa439353249d636ed30f6d98ebd862e3ac8fb651e3ace7d8a4e0904e2c1bdcc08b2aa810a30958789e28182d709062869833e2c0058f36cefa0da935ce7ab64d231e83be232486061df3191f531d551ccca15f8ac56d5f5bc749142d238616ccc08637c0210e65786a5c05cb3385e29162e2a991da38d1a39cd131bfdc362be79cf554720874d75911d09d4739a977d1dda61f31c7a5cad5afcd31c9721b577f19749b2d0a173eed9673e74f380f17edd516328266f996f979c5e89d0da93cca6955324b8d7796658af3d4c827393c5cdcc4777f84199cc01ca18a309a88609a5e09f5a6d74c88f31ff74ede1089ee3c42a0c93e256f86c47f9e84fa26fdd03d89a619a689c1c51ea3a6cdd1477ff6e91f27e9a39c46fc4c92f33ed1f59d631893d487f2e833fe74fef37c36f1d1558140d944c7439fd19d5f71ebeeee963f70c756a1b5ab6b167ff629fd31a36c1ce78e92f2e7f9a4bc497f9613ac11cf29771eb7193fc62dbe6613509e952a30059db0549912c50928413caa3893923f5066597fd239f17a9e9cfbf36d1106da13f25449d0154ac7aeedf1653dd46643e83f0994115908e5cd10f6e7ec4f36e1e731babb7bbd7b99d95d6741082744929cd83fe4c60ecee041929c34b6ca7307c4ef1e07050505fdbadb80d8fdba5b2cb0cb5cbbf6b0f3cdda356320fe213353bae0a06512217e664a172cdc6bb65aae6c47c808daba7e7b27d1f39e77f746b16fb6ce59f3ee1ab450395179c243e1576a774fa63fd87778376c0b81a6a72c6d6459c38740d31316359eb3a0e155e1eb29cb1abf6c505f2771098a2e9a872397a68d6e4aa86fcffe3930b898f45e4f58c8348eba86b407e7361fcdc7f9007e3ed37bf2ce670501edc23f9925fa0ebb6ed1dfe6b6d73f18c31365903ea18af3597dfb4ebb6d007fad661b18c03f59d36396826a43f99673835e3322a277de5b13f7ae5db555557fa8af15971a8115e0fad9672aba78cc9ff3c6649f9db321f42be9b35ef192d51fcf81e2ff6899bf9cb320985bd62549307aa0d1af54fdf1b87ae21ca3228bc7bcf2eb7a185b5e7146c40da91cf31d1642f9e5bb5d5e6d98774624faee64b9fa63bdf26b9bfc5b3589ffd37108025a135c5e63d57901fe521368cea15b59e3a15346640006579ae7a6495cba81ee3e484694b0a2e5f1e890c31aff76e0d2844e52fea7d17b082c0346b8f4d40b115cda7f9e030333fef90fcfe5fc5333bcfc73e5d2cd4f15f32f32f194b33a10f4c1a5b784372352e4298f94b352527507955795116112035ad0d5e752ce5b94d406b7697ae803b32114e5949c2978767d28e73ef3d6cceced4c64a124b2cecf795c2f18f3707b0be567743d4111a45d365c82fedc6542a2cf1494f975ce86ac433919ca47bf94839e72b8456a9bd0d5771a42f9e51e13bf70398fac2372758d4b99abdb70c97255e7e13eb8145d9dc425e8a6b7b6cce366baaecb7718db6ea2579e5579e7995fba41d02f2c973ed1f4f4822deffc727e5da6c5bcaa2ebff6f29ffecb2f9f1b22943f478528225488ba3cfa5559ae5f593248f4caab30efdcf22fef7c9e5772ee538e79dcf6abce82589665499fe7d3391353114c4c8fb90f745784734a4ee898acf4ab783d4c334c4e278f39dca67be8a2adf909d51e96278ac89f50ed01faf2ec34b65d0f835bbb68539eb811a9a44fe6ce33d7ac2754042df38697433933bfe4cde5943f22ce3379734922d1a1c70b6e96533e31524422158738afe4847ef9756d13f39bcaf52f87db4d25833cbfa0ebbfe0f4ce2fbf18f3b1fc92737f42c7fc6accda309ffb186741ae219754fd312f6fafa4fe989517e1fc92d3726cbbf6e1fe3e9c3f08f1eada11db2018caab871488be7a0e104fd6643146054cbb60ca42c1cc3055e92205ebbbf98849cb44539fd8a5aa59c87d86859ad0bcaaaa6a4cdac824de72b1b3dfbcb7cf156e37cff7297f33ce07f0ed94f3f67c193264a8ce302aaf42df69b8bdbfdec67e6d131afbbec69ec3de2b81c67ebd2c88a601295288737e556a4c1ac0b789da86c2a51b458ac63e783d5d09c2b30d5e4f31b0f2a4d713155d8600a960cc4f5318f027095c90845717ad14adc9783d5d1187df2eaf272b88f03bbc9e66c085cd84584e08f33f467e4c0dfee749e8271017b230b2c14f202d36b8b8f01388055c783f9954c18b0210e1cb4f265cbebcc6a0a0572df3eaafce545c3ffbce2fb73d7f0f8d5f08b4b39c272ca2bc73e7eb7c43e4a1f1ce1f1a3f9998def973fd1f2d53a6cc343dfb8bf2eb9716d1f494258ddf7efb8b31de74f8b73d347e3321dee4c64a2026e2bd5dcc99902df33f5be6c99b21ebed42d65b025d7aba41d003f13f39d99becb79bbeb7ef6d7b06ba5eddf496db38fd8ae4feb5ecea2d86e36d2913687a9a62cb47a78440cbe3362df7a93cfa73cadb2fde30bf42db4dc8f5a7e9434e6d9359fe88be09107fc831d17613f27dcd2f87b15fbcdd5ceebeff72def839131272d1a639b5859cb7c6449bfbcb61d4a66a78d1d67f3d8cdaf40d2fdaf82fc7ab8f725073cca94de1f0227dcb2e94797f86791a8f6decda26f29d166d4f7d288fde4498c488ae316a90756ab32194c79b21fd98f763729ac2080a7ade2ebf366b42bb3cb45d0ee52fc642dbe55797e12f870665e3af87853626d437e117c192fdcb5dd65302edf2cb5d7ee9eb5dc7bb1100a1cbb54b90131fda72feb22ae72b73d51f56e698b5cdfecab10ab32abfb6255896b163d5c56e6d9a11a13b54eaba6fe6498d494eca6f39625268293155156355f96e22d0a2535e555555b9faa8d6b884e86f5000e1da6ccd6057d51ffa836276ddf679734ca2a2fea07c371168d09f8b807aca2b05d2c34e511e15c817aef6ab37d1104a48735641e7e85d7974d81d617551d17b6bb21fa353abdca16e6fe91fa54f74ca358340ace4347db5959387deb1bba3eff48f93e7f5c83ffd1cd977f84763df4ba4eadb4df376d3dedb103bafbac3a49cf2def429a7e212208c898faed910231f3d4ad51d8450db8ceed34ef91537b9e447c704053d10cd5bde0d84bde5d1352b8289af7c87e3b6e48701cffaa31d087ee46fafb625d181e05bae1991225fb90e5f79dc7e18f0ab3faaaa2ba9ba4367419ec7b8ad53735ffd6d937d5d3321fbdd9bc62475535caa0997c2997e7ebdf66b33769e8b62394dcfeb845255754a7fb71f274f2d6f3ffd9a8956ea365d8cab5bf70f55a64c99363ef2f6d31fe54f2b746a9b9437d13e890b82f293fd876a034a996f1267e5e33cbacaa9bd3a6f187b13ea674913ea99987e658ffa4eeb069d81f82d876ec99f6de35db501f13b973743f6f4ed9cf5b4c34de73af4de9a30e4095dce1f27ef7c9a9e5a2acae9e4a3f3b6ccccd19789e9d5d97f3a883a3bfce977efa44ffbba66441c91f5963eeaacd5c617300909385c49689cb5a00d37a225a140b2d6827e37e8750dd7fa25d2c75c5d73be52cb15c8629beb8f9c578743e2b6458fbdc3bbe96f665d56904ab47f69d6a36f466392e5955fbe59cfca69faad366b8b5b93fdb95ff96e4df6abcae3a6efaee6ed0eadfce9bf09d2bfbed2f587fa7edc2ae913fd7297fdc4877e497591c219cc9d57bed912ca2ba9be57dc66f4ca92d3f4d6f658979c4efef2ddaaad797587f5f9009318afbac37ae53bfde3e49bbd6a6bfbe96fd76afbd1b46fdf61def4a9edc7c32d6ed762719bcfd7a9ed66e5cf3e94da2528e80bf0d4421d5c5de59df7e6a3f93c1fc0cf27970a93f4f50445d0b554b8a4effc88025992f359d44dfa055f5795504679e2070ff429353c54b864f3ce77848ca0cd24bf5498e43cc70b464481bebec348b4b954def9542fbc7327ea5ae3a8e10a21d840085bc20405f140773cbb05391eb400074e6051049e284ffce0599f52c3a31ee509e6a17cca0278d6e13665013c4eb8a8c0ba13231ac7f97e79e7d09d705101caa174b2d338ce29e9848b0a405fe9c41bc73994397a3aad4ffda26b58c112b290c10a3bd88214fc9d874e9af298a828a30835a8c118608090061ee5519f39ef5cb30a785010cf52e1d200def956617635b85481cc1c93a864397fce3df97e5d7827df8494734a2a8172424fd23f18f34f429f2da793774d449f30c54399253e9f4f3e89e98a874a1410e5f4cfa793b3896f25fa842aff7c9ee01d944a54cc3ff9458b117840830cd782359ec7eba9054ff88bb1b76571a2fe4454a64c992b78aa2c4138b2f003158421c8f9fe7499329f25a8871439b082654900b0f8c04b1010132ae6b304f1800619414d1410da38359b739acd1b67673426415de9a463d273801558b874e3fcb9bee3929eb8a8f1cff5bd06bd7380155876b8b1bc02e00965d278460697f275c3ae3fdd88243fea93376e27a0e6936cc413cb63b9e53b4c6d2a70f2a40c0fe5524c3c949452b925557126cb1f75f6e9af4664a1bcda9ea840cbf04cd1c14349282897122345798c8da3eb52a848ad47a9358e5272d438ffc4991ebb165c117358f3db1d2130b46709c4ccf9cd582e198dcb5032c8783285328c218534c4a0418519806143958dff52c6165adc1417454c9853187d455f21c386195fb66cc154788a1a62ba9c16cb5ed10699573066fc0f39ebab3d2ad557dd617157b441068c195d6ce92a4d650d35bc74c982b170501b6980e1d2c55ad92a63926819436c1a34d2eaaa8f34684ea42a3bebc9d11fa2154373cc394cd218807fd88aa1a9bfcbb9761d5aef95509ba9b7ea336a5cd0d5c715f7d92f3634082184cefbafcbdd7639dca68fa7e6487b18f2191f663ef95583f0b13c98e0e10c8d6f1a3465128d9c4e9e086abcf6d12fe6e50ed1f86641fa7ffa69a4ea8f198fde3aa4c6696ff7b141386079684dce9126ea908c999c41fa9d631b114c6a2755deee800d429507cb7b346acb27f7b5ea38349ffc4fbf9343a840737e494bbdb4c38d49ea497cdc10d19e72ed29214f5b58e55a6707a38585b4dd0d0a20d860bb9140c3be20f3afa72fc6f0eb1abbdd5d6e1c579c73eec11c3d8818455154ac7020e1c22ccbb22eccba4208cbb22c0b89a01766304dd3b4191a9a31d8603535353536378400871c180e1c3870e4183916ecc074e8d0a163c7cdcc143d301e590f0fe7a12313b2f5c8ae1c4622d0f42484296fa343abb0b00ed86e98167a5955a4e073cdab58a866ccc41efadce1248476797527fdc03a91478bc0c6cfbc9e8a106595a0b90fd20ef3c9cd0793b820c2c2c92439ffde7bfb84c8011653c2304514ae58c016ed8485ea600a2eac205306383cb145016248a1430c1d44e1be917c3069bd75284a7ae3acef6aeb988410862b9000861b90a1020a1e21feb936e63123b4a1a7a0a02017f03cf7c1257de579cead68fad37f79d655ba0fc659b7823404bc9ebef8e271bc9ebec0f2d357fae4c0d38342f4e1dbd6a60040b822280b2fc8c00634a818c430060d7020832358b982e38e12e6d9299076ec9fdf40df7f5b10fe7efbdddbcdbafe4d90fde5dfd7ac021a257be3df4d486ffc9b3d19557300115cfa6167880cfcf0c3b34f207ed054a7cf68021a5308e2a20b4ee0611fa98ec9ca972c7879c1174120821478d85d754c56d4a00d7130e30927b4a8010f3b497528100514b6a092852b10c10d3c58344c9311f4bce3809036b33caec55c814457df3408cad501e043813c9f3c72b41f1301af0378b6619d9dc6e19c2b005ae3430c31c36367083d396088195e324ba60d2ef1a83cb4d3d5a68fd56c40fc22d7ac47e43a71082ebd40d317f98c573d99157297f5683d3f60bec36d13aaaeaf7959901939ddcf388d0301049374f80462e4b3871c3e71be71f8dc8cd0d1c3e7fb76dd2078f884dfa51d3eb1cfc1a776c329101b6f399308f1ed394c02820aad7de608f98149ec2d81e81e9b09f4073b8fed04cb03fb0dfb0ef61cb68dc238ececce75c8a9839ca31c726a38e40db954f407bbcdd684fe605f31d8ac190a849fdd66abd2608010b0f8e20337fc608c2f14109486296cc1c50cb8a0c1c3bee3801a9f716c66d3afd9a478769a1c2e75e533ae59e533ceb772beaf7aed427f7005620e97dcb3ff0004979cb689b6e512aaaa23b041a50a6b18c31734cee06158d0022a6548118517bd5d6ccb8549d818b47519308249395572c280e20b5d9ce185a0198841dbf841185208e2410bbe70d133c4608b2fa6d022a60c34502f5b4421a80d1e4021484a0598c4955f9baaabe49220ee7f9c7ce543dc5739486d9c96db85497b6252068cd893938dc2252a4d6cd04e613ded969d27d0c0862ac658d1c6186a30c1e0054d800286a02f58b654600a35ac51032cb48003372c600a34d2a0a58a2ba4618c4bd9678e3d55726a39bee5ccf153c9e89e5a477978e67e29e9cf45e3d9a9ed8249ec337b0542bd7e0e3d5972f0486dab3cb4c3ad7d4fadf378a071e3cb73f6ed73bd3ce7c0ccbe5c9cdc2dd5153466af0097e676804b534f497069e618c1a57dde304698abfccc79e61c2e9d54c754a50c53f4408b2e4128431778d8d78bea606400830d66a8a20d59a481877dbfa88e89065c10c31854b214210e4ee0615f30aa73a40638384309557810053178d87bc3c2413c98471a9c3b87be8fb9df533963f7aeebba75ee63b170691d5045d0eb498b0c7e1ad1a8c6b7ab36b70c81a1ed634cea25c3eed89fa6b11bb4a9618c04353b225c97d381ba52a344e71448bb7637c70dd31e9e53db139127ca13ce13e5098d47b58759738039f3cf3345c0f39581e646ca436dcad39bee18da02a6380f940f8bbecc6ab8d4c7d43140f887d18f19801e4db467bfa15aa24a5aaa5c5d531b05b2aebe1a043be7dc396fce577970be59107ee7da3a3714c7f90f3afc78e77314801eefae561b6d1dd21be93075f897256b121f3aa9758c689ce718e9227d21fdf3cb08e7da3b396f7c7f19e23f7ddef9c5ba1c5a69a33f3425757707b179f7d8f3b3fc7192c90a1871456498834bf9f2820b183f12711983498ae4521e8d4623f8ba30a697370d4dd3b4896951beb725fb1445e9494a95bf366e19110d4277da3a5ae338776e53e7da73940c60655d57b50ba18b9bba88b5d1a3f7c238e87ef03ede2fbc48c157c5667d4b6de9ee8642bc32e969f76be798b923f38c12cc1e9d730f6ab5458cda342daaa62d04d3fd1ac20c30c97544654440e71c84efb1fb766edabcea53ee82e45a0b10ba2efdcf3d312e4667c324e78a95f19447f71e840f468dca4e8bed8dc97ef3b2d1bd698c46eebd6ce695490f734e9d6ba7cd2e8eb4381aadb6f23b43fbe2229c413f8aa228bd61c62b93f45dec76fc988b58548883dded65a76b30fb63d7dccc6edabceeb29ccbd86b2c9df336ddf37bedda595b555537f24aa1bb9f9cee3dcacb53ceeede393bf75cdfc3d42993babbdde6b6e9de511445c9697240fbd66dfb0bf3dc09d1873e9d9be900932c6775ec6e0b81a1f945653dd81b455fd76c2ee876ffda9449d6d6eddd0bc40f2136b7da747311db3426e9b4d9e7ce01b1aa6a907ded6b292941181384305d90d1a2bd9ebcb8f25da8311d7433625e9924449ffd99308c498b71e9f9ea66d0c94f208c77dafc7a31e5f5e4c5977f3d79c1e5371b429529e362e3ecefb471f294bf6dba7f7eb918e5343d04e287fe4caf338e7ad2b9a7860bf3cf2fcd7a78f85541d7e3b4b40e6f715c5a2703d16921b90877f47898b26f4fdcaf1543f38d8b1eae2a7bf8fad559cff6e8e1bc854b95977a6ce5975ed5b50f53c7d169d9e86e735a766590f5e8d179e55555fa81ea683c84d81911b2f21e9bd63a6e8bf3f2cf293947cf69794e8bd332958c13263d6fc2a1825120aab38ad343ab307af8b4e11ebc05623a38ff20077f1c864bec7108da18ff72f0c94b78163319ccf7f0c969c0ac4707d2f7f06abb34ab7c37e7d52664ddf9ba7327a3c32a876deef788d207937ae8521d52fdd1c3613d980b6f61d2f36ae32ea2a0590e7d2a99299bf5900a219cd198f474701da650e1d295d6714d443264a69299a49f4a66e6585bc837e4eb704970f496af6bbcdfc3afbdf1cd7a7878063608e8cf37a0409c3fe780962cf719379fdad3a8ea508ab34ee3d6d64ae2613deaf0eb5b8e5f77d1f6d8426068d19f5b1be6024d3f7a05af886d2624fafaacb6b0b668d132790b7be12f0c86c3e032d80c3efdebf24618c1a4cb670ba8c569d112260b8974701d7829e7304e5d784b0e8e49965b0e371f1d7cc97e0f37824bcf89d8f2e543573049c31c967f571ae7b95e598286c347aec3b19f4e8b16a7854bd075367fee4e5eb8a4c39fbb2f5cbafcb9eb824b5997914f57c6877c3a2eff5c18ffa048735a9c16b785dbd2969c4930e73fa27732874fde12dd491f27a32482493a486592e53d24d0bea3224358682d864b3af8f356a375dc6bdc7129fa7337a575184b0fb7e4947fbe6d2ea8719e5f59080b6daa972b427c8c60d273a07d2298f41c4a1f77c595d6612c8df3dc957f7e85305df7cfb98bc95c7c30e971bbd517ba19e2de72f7969c2978a8c3d66398f4dcb76683719e96a7e2c65df8c46160691dded2382f0739e3f7602c3bb6b9bfc36116847a28bb8d93b67ee3371c87f31605620697f49f33182eddf8734e43a3e653f3397a1b57b571cd7a70f80ef3d89c6c1bc4a40733ded23a19689ce72ff216276f64134c7a3e721d3e95cc108a08f97a674442ce5bb894f973ee82b92810fde72f2312fa7172625ee9efd8f4756ca31c5b16771c9b32e9f21b9b32c9665bb235dbc4463f79cb3fa7d9965019a87c46cea849302205f3cf87681d97ca38ce43d98669af92d34951ce9cf57517e6860710c6a53e266f79e8178d8bdcb543bf2ee5e7285748089afa0eabd6adf96ecbe5a6659076cd35d994f7e6b870890a63b7a03a5ae3401f85c1cff010fadc363c7475fa14e5a219ad75721a076a399af6f0a2fea236c724265ae7468d63aead63e3978e6fb7fcc6b68ad36eb3a9e2cc996fafd93e0ca599a1f1c95a46ae8d68ae991fae00a1272cea458b7ed9f2d0ad992d8749945b5696add24a5cd7b555c67cbbe6174559cf89f1528633c3a5e1c488bc74398542ab69b2c9fe56d92a4c820e2939f7352084f9761abf62bc309a6dc36012f49cd6d953e340f7d128e73598f55072b94041c39c8a3e790a6fc1254d425f355a67aff094d6a971e86c85afe02cb844f98c4fcf5c64f986e192e6340e7d7295877c65329687d2b196875eb319d138d0a9bdd23a1be692572c99c92b2239b3571efaa5240de3da78caa3a84165cc3f2b4ff95c320f5d6bcd35a7d9c83ce59af5686c3c25e24c08bfea8f9633e767121f7ff3b33fe34ddcb7ff88be69dc886f56443b8d6cb23f23e7bae69a05d1e40e4ca2dc67a5124c829e0493b22ca4038df27d82768530f7d0570c97a2c355e361e8d2e5764fdbddf71826517e69cf40e7285ca23257cdbcb7961d1071466d183513723d6d19f373b93c74e7cb258d30c69cb834f54b972a5eb834d7ca86691d261a073a9cf1f2a98dac7049e4d0b36dc9fedc300f7dab70491f3a13ad33529c76e8daadad593ae6a11b09f3d03b506d713382b7bc02e0499b32ce018c6b316d8e62573e8402e1bf3c0997f42f6f824bed970f519d51e35c7eb9ea280aa42afc95f3974fddc25f6dfce51a7dea98bfd8d86dcbe9758dd7930fccf86bb3b8e963e3d73bebd9a6ebf2eec4a4dd66ceafbfac27ca1ce878a14218ba19023fbafb28e793a7a41b73614cba5ca9199b930f4e3f81f8cb2f21ae12fbe543b817f5e273f4a3d6718ab38ec989454a4e1b4d5b4e1e3ffa4b0c6daa97bf7e8760d2b5baba5175a2e2ac2b25a313c125289d0f41f9e5365cf271499f0d826000e1cb03c1cbeb015e7be0e55521e0637698e72262ccf8ca5d1728d8f84a75503e676edaddbff7b21eca679cbde5f91c4d9fa4ded238dc73dad23a0ba671d819ca199f9ca328a7937ef61698f550ce51b41018da82f9b960a8ef2c4e5a9c0bc66960ba927344c9a9b55b30eef95c30d0d9af0da34014c8cf8ea17cee16be88ca1d182e51cebe6970c939fb865120442a779593333289929149aec3402cae2d236763f7f48f6ecc0ec3b785b8682326d9308937d398c4d39fddb90e43ce5fba4e687af2c196b7dc2d1df3d575b905b31e8bf5cb573e75fcaa97af7ccefceae92b9fd5afafea00d13895afafc3ac27e781e8cc02e2e7e82fc6acf54b3b520e8402e1afbc034a70a9bdf204a84e6c9ccab531464bf8ca55fd2b9f1a85af748daf34cc572ae6ab1d9854f96e394cba248949959bc19804fdf9247de5407495c9197f02f195c7d651c5b9fc724cce78b925a7a67df9ca39fa19bff2ce84f85b965fbe96656d6e8b3eaab7cf099773a768bcd4b739fdc17e69d6ad84a6a730ba78a7401408157e7b8b9a127684c4e84d49cefbb4638d29e5d119baf39924e7a3577ec52d3289bdda34061ae5fa5c6df1b575220f7b8c4534d95f4a2ac979287d9c3fb9322eb320b6ce73d1043194d1810eb6f0f8f0465c37d01fc4548170c47483602816a61bc46219e6b8b4fdeabb61b18bb61e3dc32cd67410a2c347f9a3c387b4ffd931efffb3613e5e5973083e11a60ae4bdfa7559de9555c9b999f3b831e03523f23c664218f051fe30e0a35fdad5ebb85d88097f13d813a96a6115a0df1081fe5ca45c6a7d0701d853ab758ab322a0eff3b8891eca2844b46fa2768770e530e987766a5301e5d1a12bd043caf59f13130fe5bc519272b83939a3360e0cfae79c6aa73629261e6d9c76b7cdf82d7decf0ea4c5287cc555cd1b58b1353fe318c4c310f2ba7c3384a55d2740ebdb3229cb8e77cb3212908ed3bac8d4654a58dfa0917d0f973e8d4262f0a7b3b4246d09c7bbb6c88935233304497f5b03fcd66c4d83b26bd30de7b90ba288aa21e7cef3124b364f8f3286712cc6d2142c7b1899804d3337670c60e9460632e3d802684dd491e23dddd69f3f0ea55fdc1d07967fcb75d2fa4d3e619320637aa521b3028143d744a4ed14f2dc8fb27496d58b2d1b1cd3be78cc801aa28e30bcee6bd01baa0efee27539ed24273bed32e6e51d398d4539c2bd13a943b39932c99771eb535344c9bf24f8d6fe74c02cd43491ed338eded046d5bc7fce42911d3968cab42c694b8645c5012a012ffdc25193db579e746efc468ce5dd43a9272a0ad4fd2f7120765921111029cb18333def9cd1076a964f43e1adc2e03211c423fba10fd284345d0e2cfa5f2d1db4d4f6d333e453dd33bb95198de2e18deac3cfb6ebb3f97bc21e23cba10e7519abeb7e9e6be367dfbb03c98de6e15a0432e5f70f9e2cd787cae693372ee175c568d99992ebee032f305972ebee0b26a7c91f3f10bb8f0b9e5d5a6af515b15bde12bc379e92e7c8a617c17512e179e99531e27171adf79f98cba451369bc6308888feb3472e67c1479d42acda3ace44c82cd389304fb1927436e6d2130349d995c6bddfd8cf4b9e48c87e4ccc1a4db2f368899194a24a7e9923ebb72bf581e6015e3c3acb871638c6ffd51efbd27ddf6a3652cbf1aa3d96a1c6e21bf2e87dbe5345b8d535be5148d430881dc47a7284ab34c711e9ae821efaca79271d36b9bdac3ca2f87c1ad66732b44535dda5f97e5d7e59aba8879ebf0609cf5e8512ac5e50b11d36c5123a793aff1b7ad0eafa9893535339eb341dcf019572ecdf80d7feec30671431671434ed3dff0996d6626c6198fde594fd4e137361d729abe66c67dd820f4677cb39e999a999ce8435be1529c8935353e688c53888f51cef9dc880d8de63ec49ae8adb39343ce88434e6de46f824f8bcba2b1f015fbafaf3c74cd916d85493087af3f1cfe7c5afe5e1644757a380f9ff1c6a7f63be49cf11a572eddf0a9e9f490461aa79d878c377287d4918e5cb1ca48cb919c5ac61ca99c5ac929c43f19a3dfd89449f3068df698d3b88d9c23cca3d76c2130b41909f4be8646ce1fb22d0486a64920fe1a9f39a2cc6aa4cf8cacf1ca67bcc22181785a327b8f499f19af2152b337309fc19e0fcbc37b9488dad6d7b16d5f2b0b668e650e758cd4f44c9f3023dd7d4d1f8e71a063d1e661f3d0209943c75c14c24639a36fcb870dcac1352fb8f4d227468c18117c218f215944dc6084220f6da2d8132fe5d2be07e3f6de2b6533efbd674108c940c8068463205c03423520942b26e473c5c090d43cb39cc6e7e522d7a056e35926a7fb0cfb4cf30c27838c9345c571ae965589b61018da2581faadca1de5a2e85349cb35e4eaa2908be45c2a99f409b9e59445c9cc43d227c60c5210427f1be4f1b0b8cd24361f1d429b871146af3c6e4a6cde077a553945b9b74e8dd3c869f3d0b58dc6b38dca34df61974da0c667dc653dd06b369a0d631ce83b9d6d359b374e3bcda6354ec5381167dd726ada606ff966412ab72cefc12eabe2c124f7d6b1619cf596d4dbc4981e3a53c69a185c7e00afa732aa88791dafa732bcfcd5d8c3e2aee82b6c65dfc92a53e45261e86eba07e2c91248cea512647f3d4639a357216fcb439b328e25b14d1dc3de926068515e8e09f1a1dcc9e9955744a289a50fe5ef3b2be23d15dd48a3dc5da37fefb9eb6d137b9bf3dd2825d82b13c22cc1ca5f7a31e6e4ad69b77f97824e55a12da7711aca22725aa7922eeb81ef51e112f576bab39ee870a328dfac875aea51d9de0db9284c5927e42f24ddf5b82777d899e402adbd5bc28d627978efb98b4353082d95bf4417e5cace3977c5873187f157b1a173a8d055708ba377eddd28d7909393999d333be72b71f3c1fcc9bb8d1b1d46c7440b9dd35c24273fe69a9cbc543e249d931c1df3e98860379857fe3ca775dc72720e718ea950c932212177d2c7393b161239d1e5568b4255d65385f1577cf0b14d3f3ab7cfec287f9bbbb6ca77fa723ca02392cdf88cf4cc39e7e33c3ae5137b6ab3ac1d938df915310af3c6ae86549c73ceb9106b6b6c7797abadfc25621fbf71871c2e51ee5755551510fb8862555dd78daf775c1d7db9a8ad2872eb6a2b469e10968be65b973e978b7a9bda9b9c3cd19cc6f2133ab5f954dd391b443bd557b67550d1a7c877e56c2b0f9d57f68e2881f8aff52992edb6ddee0f70abc9f232d23a3ab25c3baeb79cfb97bf6ddec84a8a9c72e8219ff19aee9cadaa79e3d0675ba93cdbcd87e581b2a1d15efbec316f240f2c13d2eeb3377e654560df6ea47530b9b247943cfac6ca7aa8eef2d725ba2e51952304fa8e2d731d1be53bbddca31ac721e7a8ba6123e7a846ce118d9c919a0c55f1b2fcaaae28f2cb8a7e31e603f41f7e88dae59f6a196f2feab17b3844247d581eaa09c437d12987bed33a461ac7f968e4c30651397cef451ef2f9c353bee3125197fb88aacb8d885ce422919c40ef2b0fc9f9c3c36cab7cd820aeca2da75c5dd643b595dfaaaa2a1f9607b863736cc1e5b1a7712c8c32829ae0e59b708509639aa005a382a514f44d885c7dadec152e595ef1a8b6cca90db637d13a1c4433735d1533ebc55c55145f1846cde79a1581c990c4a83cf5de9333b24f200a887a8fa54fe5d19fcf24d8d5d883cf29cab1e71476e527746bf3617ff26f9bfd6b3936658358b72656e527a48a981815cb61e514252746e5a1c790534ec909444d8aa276ab3c45418a72b6a86ea2711a0291f2956faba86ee7a0d6e929364e2367fcf7fc3dca31668c0a46e52d2d134223a2b1badb6dfaddb0095192c633aa5ddb44f2465fa19c923635b29fd36061fc7bd5f3afb6f7f861539edae9d026726cd3fcda2c5fe8d956bd9dd244ebf494d15ec12f72de535aa7afac9cf2ced767b68d2cb32c663eb1bf18c31ea4be7a6ef94ade4afa3ca77c7729af2ec6b2e71925b1e7d936ddafbc896e399c5ce59df79576b3af500e29ea330f599647a794cccff899736d5326652eda1c93323981a8a73c2415c328bf2466590eb31e8bca570fbef7dc474a62512c0f50bae7b0bc02c044b338e090042fefaf2724b020095c3ee7f59484277e09519440e69dab8f483d9fee9be58c8f88f52d5f2604fa736d7d7d6da736e7c1a4e763c364a04d1210ada391a273545447631c75e7da1ba65f1c13b03cf633ce56d47804bc9e94b0e59510940430af842a7fad98bf44d71c65956b0a756ec02df3dd32d7d6d1447e758c3152568c0da3257dda294b9b4033ceae591194cff036574c0e534924730cf54f96d3ed36b5df6772f264e14cc1ce1df3f379b5f9447ff2bccdfe75dd6abd9aabc64f20fee99ffbbdaebd0a88bfd7219473c5fc73e8eb10b6f4e1091d841e7d37d839ada3160428e82be74ea0862e1ae20b7da76c10ec3386c0d080f87902f15c315f79b6cdfdcc4399901967e9c31e3d9ba9187a0d741a0cca19bfa03b5863491af6192beba9acfcc5edbd718499bf8d1d6ecfb5ad729bed86671bcc6cdcb9da48cf302992a1a57cba8f3252d2873df318c50631d707b37c49b08fec952f507f943eecd1afdd4ace9d40ad63e3d1371b92adb3c76d02f5f3ca1bca2bcf691c17fd254932dd5740fdeb13a83ff3cbe752f9ca612664dd27b3fc654560bf9e93b9cba26372babf01d41ffd921bc506b1d12d59b9baaca712f370d3079f9a2678e6d07bf7d490eba19436db49e39a2890a183d6620a1c6a187954081d131c780107438002860f82d068c3911164c56923cd46831a24830c2b141956b0e0ea2e62f8913692c2d39c9c4775cfb9cd8649ceb9768435de41c1e3dc07a9359b2e3e4002b3600043c8420b527061a30a1750e1085b6a8e70042dde7b8f7aef0c1888410a3f18830c7640e58c23443902155668186a904515a47041841f64c10c32b230438619a880a20530ccc00964a4a106169e370532b888c850820c02f07aea12c5df783d1d410d48f067668dbb72c6e83abc4f8cda68e5f4f11c5d29fa6c661999c4fc7c6a91925517cd5f9fb1df27a7f6cde35779f8355704e7eab6aa8be6d33c85d68e39e7f60b39230d3a08e5e683495b605c54f064929c8710c208237c100c1d66281967d4a80125baf8f4cb090a5c68000518dc20083c500a0fc708c3c3ebe1186c3c9cc203217427c938ed40889316548ed7d3e9059fe3f524c61b2831dab537f7976a897d7677f74f7555d752bb7e9f25fcad41b8f761b92dd907627ecd88689932cf0aa499b4c52e9a8c0c78966aeaed1540419360032bac180216c2c0814c14c6b8e2c4838f1e2957651668ebdafa88870d93f64121030d70d006315078c1f3befc736de4ade3789ed0f4b511145eddf093f42d461bbedd66d43aa61d8c210d4408030fc6b041059e4db381a2c5d7931867f8a979f3805730042060b1a50a64d290862d9e30e5095238431933647982194e3005bd8008713003175aacc08247cb780ab01496e263d25459cc9ddeb7bb2e0ca68c3066a8d1d51831dff2547d8951d346a31fd85dd3da5fcb20fccffd8d10e6dbbd4b0bb678372400efc230c98a42594130ebd9b168d066f5c5ad2031a7df100d4239087111f22214c6b387aec8da1082128222e482d09567cfc864676458c8bc90912163e3d93333b21f6443c8c6c896907d79f66c4b2645464546832c07d916cf9e51c1c2809d016b4306259bf2ec981a1812302760676058c0c43c3bd605bb01a605f6036c08d8e9d9312c171c302998141815d815cf7eb57155e1dac21586eb0c179967bfc05c5e5c45b8907039e132e3d9af2e2e175c555c37b8b4a86291c1528305874bca45658d255851b0aa606d410d2f39501d571c76e7c2bd28825b5d9eddcac28262052910c632aa4273c15b50600c459bfe7c551e8aae0d2d8afaabf2d597c661afbe844e1d63e824c6b5e1d860b7c6b3579910ff275d9830a3962c6f9e43d77f3208ffe9a7cf6a2b3314481b5cd296d5971dab06cd0ae2d20c9d7e8d597d792e4d4c4c19afc6172e69115427b446680d2484d67042688d33426ba41186ab427544534ce16e30851653fc608a677677450daa2302820808701001c1491101c149210282b3c246474175446788cee82a88cee82d88cee83088ce18f3ecfda5b9501d11191199f64244a68b2022d3481091e9329ebdb768285447b342b3a25da059d1556856f40d342b5acbb3f714f682ea6846d08c4006cd086ad08c0007cd081de5d9590c8fa13ada16b42df012b42d7014b42d7015b42d709867e713d3407566a244e11c44612ea2b017519ed9f98a36a8ce4c962c0c250b4391855d9085af903943756698c0042c30c10b4c200313d830e307aa33438619320c61860c63cc906109336478f6ddb252a84ee8143a2d15a1d3d22074da1c844e5b3cfb5241a23ad59733b461a1545f76cab32bd1a33a5690e2b0472768676081dd019beab830ea2ecc28015a0fcf38cf7e5558ce0f5c7aee354ce3b0c7a869a391158549ec5f54a03fd8e7015e1d08d6b1a6f4a04158509407766d6905e90f76568146b93062a858d887c0d0dc187f555ac75d98d6b1821a87ddb78cb46858e6bb12a3a68d461ec68579f6cb074f219e75fa0e42fc9b272936ce932d352ca48576d3c43de53fa2a724f469053d3b6cb27f43649ff4697f2ea315c4a528d6165c52cc8de112b7e314fc96c1a4759a2a900d90832bde65639ef7597954f845716dfcba6383759acb98e97eaff8e6d23a5917c661776d4439fb148592b3bd3cf38c5ffacbf3b3f2d6f825aec5ecc62fede297f8258689a38e5f9cb390f82db353fc12459b1be6cbb3efe035634fa425f9efe817d32e6e9fdeddb15b49adca43bb86c0d0fc5d96514bf940d9097642734c524a0b36c418d19ccf68c69fc2e812d5c753e252ce42a449b0752eba73d1514e5dcf5beaf200dd6d6fca3ad9329aa86521ac3184345e4f5cc0fc8c5c92f097487d50ae2b056deae95d74c0107e599bf9088899334936ef78bcf3cbda42dbf32ddb5cbc366c8bbec3d7ab944955e53ea6333d45dd40b95f7a8c7df771b13cfbda405b129376ec154d7dea182a64e5ca5ec1049734670752202277fe72e0f0e846b40e0e9943aae26412ca9703f34b0fa0699185962b7fbd97f5600eb1e70e73e7576f11d877db64e25b4ee819944972dee7c7f96c1c393615e47027269e1c8e633b410e9f91ed30eba1711acf9123874b31f1e490526a9c463a6fcf7ca767b42d4b0e17e5f0b74d233e93bd65b1f11a1b09050e974243838386c6a5e0701b975293c3a5d8d43813ad9343e6340e7b4d8c341a0e7985b67d98f55c1486857ce6643d99675ba8081ae6cf834089399314f376876192ca7adad02a67bf62eb2c8f93ddbd2d956da77fa89f126312894bd3c7046289fb1997bc9f3ac6d9310d4aa0fd9ef6e72ddddb148a1c2e05470e1c349ec3a1b07129353635355aeb4071c3a5d8dcb0b1f11cae3e6a1d28462ee5c62887dfc091838be7391c87e7f01baeee7a0223e8a78f57d5f9c32b11c8e4d8706cb1719cdf00e29ddb6c01a723a8242b34e6b920279d538866662408021273140030381c120bc6233299b2ab3e14800c9fb05058a289d328c96114c58831c620640000cc800c083098100484937ee9e8e8e9c503408dd52e8f6e846cf66189f7bdfd8a5befa000a137d6cb1686e1b08b5b9e3746194ef455bff91b43b7cd90820a46a5733795e4241e3dc60813226d31132d96a0f60e54914c0d84d10b1b1db337b7609a89562128edf8bc8e79edd41173f9719d2f71995e68e5a0e78888e3e8a02fe44056a49f2be8588eb1e6d821f743b8956ffd33b2aff2ade9c4664cc263c9d076c6ca812698c631e96ce3f3065c2eb19f2976735b510de9ed49e10ba0500347cfdfe0fbe5e0033c0f5154523f65e47fd2563a7235e110f59706ae8d89f6b96ab19806778645407f02df4f74cdfd991089278e4947cce41619366d355c4f2cc68029ce1922e842a85a520757f61a6cabda2f2039f9dffc36dcf7d5273dffe4c055dc14d10014884004c156edbd95a5832221f2b9afeea5c14a14474f2315abb068fd567afc92fcf08b0c0302d01ae863eb2b18d333ac0d460d607251e986c9b2ef5f140144e88bc1852b6dcda9bb76bdde729db826bc227f02a9cea7fee8273b0900deecb86c703eff38d78dcdcd97a1a2a4210bd94e61916c758e5324a712172ba58f038926b740dc3b2a17ebd60ef62d73f2fc1b651e363a973bad2692c814e9b21c31b6174f1a2a6735fdafb2fa3fa8ec51b6c7542c913046f4d2ceaf10fb4344c9d699189e1fc310878dd3996c5ff93744a2fceccb4e3bd8ba1952a6690c17e221cff32e0e05aaa1fe23f2adb0f55d1168ea02870e64cb0c20fd59f29b437f84401605012b2514b333ed4de1064126c11e145ab3ad50bab7e4c10869a4f9d9ca795b07228910ff89937c995f4b3dfe41ce9dbea957b0054581d169a178193793f90dcd2f51a4daba5280b83f8505dfc95ecf8360f502b24c47da91c8a293da49651428cdd589717b93df525b9ab4ca80391372a6c3f6d79d5b95daf14a94194d24b9d754362a866e1e55aff0925c5bfc5db0a592932b5634579eb86baad09b7f2fbab9771c3a22bf540f08db1d17d60983717135c4a05644ec7c8cbc483b15b5358b92b810d2ae0addaa6107e1f634fdfdda9e483cc25af90aa95eb048cc83b573290ff341e34858a00f2b6896caff98a423dbca5503ad9cfada4af4e1d9afdf8865195988003f182f96f96a2f03be0cb1cdfa3bf28133d3bca0a6bcaeccbf17dac8d1b641e50f589d5e9d58a50ff6082f2dd13796d4431366ab1d17fa41b0bf17496a8589ec4036bf9a5a70d53f4ea2da84467de4ecdf95d7d25dd6b258f19fc1e0d829c6898e707e1414a78c216bb4b1a06790a38b608302e0dcef96cda63668411ac54ff204385a94070b0f75c1d4254c308986f2ce2b6d24c35cc2ce2bc390e7517e1d9519df6a48b5f1bfa8b5249326be72ea35033a036a54657f09a0ca3b2bcae6399b21d56c691da7a8d18271fb4fad93d3860a85ec155b6bcaf4e32e08a3d3b037ab3bb1f83dffbd9115312a6ab56e272f4dbeeb8a6f527e85e97c2c1e3cc5cd802b0d372e5854335b17105c497eb343ff46915bc0835d4ad1ec72eee69fd476dba20f20ef84b15cb8893bb358ec4e93919c747490c07f75dff056e091c8f03dc4679c9c621855857d9f59e375aa22ca51b18410a39da0b35325848ca552fc119ddd22cef2876918a79b8d3578d25c552da135005a34e5ed25166b34197531636360464a7973f5b023986a609739154525ce650e3b5ebc80bfa014416b879bd40d5249574aa9bde9c3cb6945b5a321b1c3b72fca49fe4787f1b9c2dce2e9695e5ad0661a9692911803d37f0cf505782fdc4c96c1fbbe5efa32bcf01aa8204e0d8b6a9e00b95c583c949176e0e38d668b6a37702a5e3ae8d072413d8d4d89bc3eec6da8745153533356d4f54e2b7c4883b7f0c861bdaf295ce93e282e95a4e67e6e572cfa8819fc5e69a446852f48cfc157169e496a2c6061fc22b3b6fd9183c26dd9188a36c962f1c3dc121c969fd77b17b98c152b09d37d7a5393e5867b105eb018b939b5c8d44b0955a7774b4d69a6704c42566b526e6521eaefc0be43c7ca8607d522702ecaf235aebb1e82bf68d0d087d93ac72163addfeef7d4aa67c9e23c4780a315f71e25bc3baf846fdcd0f4b5e0b02155300aa03e1d1adde5f932ee4e9bb4019939855387311d7173cec1c4022c769aa80927eac98b644226bece51eeeccbbd508d083d36c4e8456820b0c03b2954c3e77c04d21c154542dcd894268a44b2a02ac82f3d61a14399ffaaaa5d55a0f660b2ece50453fb15a38daf9457a62444a1077909709d7b0ea036824418378ea580cf3bd8df491255b0869013a40a99900d0b118ed058bf17d0835e73ee519ede0aeff1654dc29c66ec70c949749c48af3ca8f9f5b0003a83dcc8bff5d63665ee97ca9041a5906be91663ba5bc36a6480614c0860242b060ec6c4abc20f210dea742323ab6db7e120ce8245d4d0c8a569a7dad696f0ca94d5b443590882784b856538e748f9db4cb31b4e825320252c55f7716f074b176be8abd328fa4c14e615a28354344d127a3bd4d820baa3e470118f7ae8bbae3b0af62c3c1c087648958338fb2e6b2e11cc7accd7e722546b072a9d0899d2111b82f8eea52db068062bead0d90b9338069d1917e111ea68eb97860b21dd1fb37ef104db5731b25b12bbbc92e976bec23e01839e74ade1b535060ed0121b9ddb6320b6aae54dbe516e9fb9d544c06f86572e13eb3fcac0c6733c84e5ce7063f5d52c3256bdd78781d3a03f523e064e0983155fa0017c9a8f1cf29eb30e1b71158d37fc2b954ea344ff27e271fafc1b03db63b7f0fdfa261bba5edfb63d29ec141993d0998e69cc24f637aae145c69e7583470a8346c0e258d84ef866c961726f97d0850561d8cb681a9f03e605a0c344b8a5cfba00a24cdb679690c49cafbd513afb7ac727de17eb7c9174c72e86be3ec40829fd79fa7f67cf595316faab15ef3f03262f5041bacc337013054312eff914e27187678196dc91e42ef418e37c1cc1698f2f24f96927d6c8f6ef1632153f13cf9b30665cbc105fee34acc4dd757b19c860bf4079e35fb51409573f31cf85348711d65936cac4ac028e5019de8e7b6aa1e2c3d46ced39d378f7549393bf60b11617a4a65157a8a024955fcbba91c4e40a2cfbfc06ef99da4820b1ea5465ff5c191596079af173a58fb3c73cb8773d271e9475327fd0657fb156f71c0689656df1c8dd135c74916fd18b89789b63f26dedb8d9e4aaaf869d01d57ef780200715b5760ea8daa898742c34a5dfd26fc7d5348eb22dd2f49ad4f9742dea876da9932b48bc54e91dea8f0a95b441148fbf081485ac3909ef9f72fc9800a9584764bc5323edd700046e87bba9cc995b0c5859a3f51294d34ceada42091f0fe9442d6a34e21da9623af54751d7b326af1c3fa6bd1c1928d85e9aef3d83ded0f5ac92b5c4d35c2917e0570c6e562bdc71a6faa2c6a8ae2975260c7b4f7e800252829a68c769870f2dc8df14083fe766fcb1fe2ef6d47524aa73c6ad5ed5b1170e6b9ce0e5416fbf434131bd7bb0172a523a3ce9e621b84d0dadac439a949650e1312ddee7853bb25125a961ba8fd6d2c36182746b25f6b6caff2bd7c523d1cd75a542282d3f50ec14f0f2a64cab9056289bca8957c106d2d2a2ec7e6d98f0661d3e7ac1d4027c11756e633c05ab04ae34fc88c183af237049bd45375be5ec13d4eafcfc7dc8603409856c6fec21c81f4a7c09c84c7ce7150097a51a5e5479cad275d096fa8a72393b98d283930be71c6f7d6869488c76397273f81f7eadd0ec46870002cd7b62f7e164f9fd220e8ca170ee5c3925bd3f22a48f62f977b5263581852c08fedeae4d26acf56c8c6ad45492c1f9d25ed1dc64aab486709e9017ba7b0a43718543a9702ed1aa686a031c6be2bd1d50570c979a52dc83a94033f82bd416869f998670316ae52d298a5af9aa68465c6b27f61422b4fa2434a0ebc5bf2e77c85ee6ecd9b012bf2db124d55f4bfe88f02fbde08b2c547872799c29adf7536998a9bae094c58d755b10494c5b0a7fafe5659d5bb92cbd8b7985bec57d5046913e84b77a8831aba8ba0f81d70999870c52f035594e9604c627fa8178d99036f30c4cf3a8b0828deb0331de1933d7b4b8626e1c607400a978242410f78232c1687d812470bd3f86f561206ce4cf67661e990dc4ddfe387f4211199fe8819a1b3e05dc65b82f5a032461eb32c3cb5e3dc1ac350387103f8df4b078597fc0573305ef954deec26345f8072d1f1dbd31a061bf020c2992b21e7be5b280ddd92da359fcf92819ec30e60f0a0b219afd5f1a77af5465baaaacbcb29d6c80fc7d3e10f020effca54e057dd8b22f42b3878759f0f8d247620bc9760242be2da3cc6a649d5c28a39c39bdfa4478255eaa08dc27c618313c414a4a65f892de275e243a5ce8950de20010b9d027a0bafdeb444e257158a027b4c33e509165142c206123570ad5c83f854c366111317459b22013e509e2715d0913fe298aada8571ae5a7b0a05484415d1914dacff9b2233648765c0eb545f843b422d9b0209263a5213b018c30a25b39976c104d4249a51dc6254c42b2105714f85cfd08ad150c27d49d465da0cf243b1f4e2296cd8e5e67e03fed9d3ef13cef4732aa2389a5adfe67d42f322c35d5735325e70c9aab7f4bc0619e7bd70cc63480fcf688e19ad22d0df0f3d470be1c5a27fe41d059ded841f055c42e8683cb8ed9280d3dc9e06bd1396c9a8e3e71952dc842e3a640edec1b12bb6c4d7ba0e184737445db6ec2f21a367268602d7a1c4d7862d81c9f214863ed8fdfc7a350dcfd1813d0c226994a12bf0f7d113f325be4dee87f2550431608526aa2d15746faaf84f42dcf34d189a9c192c6d13ad29566b4680d7c07c1ed95b2143168587b79fb57cd17067f06bf42b123d36170ab71923e96c9e872bc34af7121754146284138f2b8040ece9c70b34b0da2878e9ea5d89bb84fe0269a818d55d7538fc72eae3fd4f51a1b84afd9f88ff472c5b06718e11e85518325a1bb5743d7f590f82bb8dff57cd408c99e7e8632c728ca5b2236a91156f6086dda2212b90317a63adee9e27260b284a0ab4d12da485622100d26e90f8411577529836cc27aedc7b479dba12087f769bb4c9f874353b53c80dd229af0aab551a6c0519a272575f292bd3850e1416c08e05cd03de4714cb3cda3aa360ce9bd349fc4d217629a83d5f4a61016ebf286ef627cad972dc1059f71bff26831ba17480756c01b68e31fe9ab728a284b5fc6627a58ce45e5e71d67f0b2ebc49b47edba00707568f303a2b52bdd19e6465caf944a7e5631d9d3383db472f6bd9de0bc79120b14ccf0a8f77ff5eb79939b3d17cf0691a2784fa1e3ba3b604a3aef8984f0a5d849b37bd12d647e9d08f7cd6e49fe355e7d7a6195eaee193a330140dc40faf84e2dab9cfc6b55acf8d3f63495750680f5d5e269adb337750554b4ba77d233b3c00566625d388f8f966988ce5c8150cdbd6f60f067c6214addd6c54d2aae7b9c6b43898fef0c82d3331520c728ed1162bf422a3e46a56b6af7fab7beb2f5febd70d6b1bdb0646da84be40786ee803c1f9654a677fe1d4b736ee775bea828cdeb6571d0dc9745bd5712e278242c2ea654d3aab747133e6ccdb3667039d499fc940da6ddc8c6379ed01ffc14d35dc7a509135f28d9b73f7d026b059745560f14c70cb2ba73db37f574ee8428cdf262b679f0168af80a116d4b6530f6f75d72df633f0d0c08d1c082c7966ebfe81d18d3f82a6b765d18747183ebf6685a70499b92550e59bd83e4c7786ec3136c1d98e121ae90e6f17b225b91345da3804b85a7ef22341e3a5051b7482aa73d27d4998ec58274d3d0ebee053eae9b8ff089131dba75af0e1e69b947766bc930b8085357b10ab15c9d5c381aec2dc97a266bbbb2a978892a3ef0b4fd5f84ac6e4372d6d7bdf745924fd27ea875571942028cd8012b1aa3bf14c094866e3032b4d98fcd5dcdf89cebd52210055bb626a71ce455505d6a322aa2690ceecf274057d7769db8958fad7fe4de4d0cae2bcc447ab5301c127869cd382ca621977fa06328b04b6e8ff2991e2f04b00d055b3d8fb871ba69da61f84e76fafcbd66018e1735ab44b3cff54881d4eda13c41d185662cb2e5c6901b831e7ee18792d008585d55e3a4996fd53437e69e3defb46c95a97a6a8938f8736ad651d65d27423f15c2277c4c069abe972c57dd36f35c0ed30440ddc92f767d9df199899c929a0972ee62608c75c9f93bf075e712ac0e98fec3d601f6c39417601ae7a8dae449b37753c5596c9e9cef6999291c19329087051350f5a723ca342d5636acaaacd27b1c3ce0d770ae0cb3141b2b2db86b3d7938a302e7b2e1f4d2412d665f4bc72238a1652cfc207e928bd4b30174a9452dc2b4607ecdc148f7593e5d9c566d0dd3f24e1ff992abb8839267be1282a3a711d12ba567b5c7b0003e0af2c7a85b2ada5b41449d7d6013c4aa35822a404dea0211446b1544b866051242946c981a5900dcfdd36b7109c4c5813cbab5990c822e94131f5ee60765ee6d8643c504e2f4801c5240c7fac22be288afef12ff991852c583c504b41d8935140bf951817054c6f5284c07dcf2a941637bc66baf839eca33034e747f55f950db4525220a5d54d54049fcf207b183fdb217ddcdb58345636dc84207131e6e03fa3318916421f577f69254a5617e601811a586c43d915dda548c9cb3ba9968f40bb6db87a89cf9a573605f13af6d0ee9ee086c879b9e79be3f9bf0545a8abd12b80a2b2836208a90c7616b787a046045ff439e13dd9a01e968a44db5cd9fd930cdf2f674d737c79f55ac84c6bea1086d3778426f7d1545a012de95be5bb5da5ef3b6430edcb741774a631eb42a4f225ccd03d9cfb66eb70f7543d6d28989e46b9305c60da87b40112defd8aa6b09f4fad51a973bd5ac10c65bee22b7e8c431543d0b72ece5a6a919007c2c5d8bcb04199664ac5c2c40b85eea56c8a0cb67d4e70c25d2eb01b698759ef1145137089eda019fed02d1f74f9646358c63d5fbd6457f9049d836e44ca3e53f870dc89939a90e1d461864d1e0b7b79df6a5ee4db768900b2840b5a7a9885fa994bd31a4d03577a53f47b801f48c3e4beb894fed1f88c732151c61dc9435c1fa2a4376ab3a93bdc655c56c9aa5d0db7fc6c7a1b34c6f98d02915de0cc65103c1bd0a987c6709c8f6cd91000296a0e8ed6a8582321b30f6be4b09705dcc71074236048180a809bb1a988403e97db598d3d6e2139cdd863a980da96494f0dea4721a0513f7d1bca588b717bfc0fb00216968296189e47ee47c912b4628c918f68eb7236c2ef93e8ea147f4683e0f0a930c1f35c13d763b5c101a11ff571729abfb26f544702df0301e9451b497dd71acf49750aebfa3022d838e8b00bae55f197c5f98992d50c66f3bbd57df7aaf45cfd4cf93adf3d489f5b7b25973eb2125cd4630ca5faaf009ead85ba15a25b58f759e1d25f3324df8aecd845afdde7fb4bdc6712f0ed6f26e1fa6de398510ae400a5f2ff0ca4d4e46270afe5de2a7859d9d21d40b4120bf5b5c29d43c24e1923c856544b34bb0247d10cfab4e4f6e4f53442e1219346ed7d54d6b6b88a481711a1880bfd2e79f7355670fe995707fe8af9181ec9596be81c0683f757f29772c1631f8f587c81b0eb8e189e47590a89b2fb8e5f2b5fd99266ddb9ddaef746999be48ae775b7ad175ebb0a5d3fc3115e5a35c3ed96462d2771badd7ad6fe5731199eca8067006186eabe0cc6268da9a9c8979927a73df47a57e11a0a839cade66066ee3691fb3677c06e5c09a13cd53962ab4a3632c833409f376f4da7c20123b01be59164edb41bcd816bfe872266c9fbc4cf4185bb58e64514a8e4c57f03004c25cfac399d1a627980305fc2b897bfb016a4bdfae059b6a684889acca2bb50b91958cdf4ffc1fb2a2d0162d240fcdeedeac5bff94829d94f99304048bcda230554e49703e8278ba0fbe26015e844b23fd31545a70323f1d23a2168fa7cf8ec3bda2faec99b7b57c5b0bb1ad649542b6a200dc64dd6e0059e40085a0be15360825bef7722d5938115fe5fc82d2220d6cc67277dd2a4c86ac0f8ab1f53d0f4a0a64b19389be2019a3340dcaae1ffd6d1eb3f1a703301199fd87057fca2307fe4554fa04e522a829a119f97101eef438753d23064a4d61d7373c74cc1ed067dd14417c04ca607a05f08da605e35eb6a18b192a818907848e9d88e598685399cb0a0be27ad50d6231b886a608b9f955f3534cda3744c8334ae7f6787b97553acc251666789adfc0cbc5411a9fa153f65555f2affe0b2847fdec1680053078546d5d65dc70fc5273608db19329584e57786c2190d169dea76eaeb1257180ab2521ea43d0a7a578d93a637e2d28258d251afa4d43e92713cc29d3c687a02adf629e091b6136c019ba6606fecee34e174cd039fbc4ce7735c9759b40216d2f96d0973873aa2a190bd05b8170434022144302ecea2cdb8e6812f4752d77e0dd46139b1edbc3334b2e7a25ce004ee02e09cac30fafad64c80bd2980fbaa0e885eff30a84fce56f0e9fd3a04a30a65e21fb377f155061262087444dfc92cb464427bc5ed4197a621860a93b16450db54d21606a30448fcbd8acc021b03ca2a7c7d7ee61d684c130ea5dd8c0b45ee07a0a901a18f29ed2e835bcc6446b190a534d05d49098815ef89546d8d673d4ad859a885121b7257ed0e00935decbd9a77c06c9986ce83426aeed32608596df8de679cd27718e6e694a67508c5a6046ddb89cc23faea26563b1d233f5dd4b0f1438c35963e159c94b3a5b291c9c9e15854ccb90b1d3cef403f8b5622cd8870adfce02f888a53086a06543a1753150870e64f18d6e84ddf5787c8f7a16dae9d4e772843543bc443d6d22eda39080dd81c911ac910a2bf076ce4590131504dbddae2a0b84379e0d83f7c87b0564bdd9d738a5dd9c12b9c55d4ee32cc34614a6adfdf5a1a7255c6605f5a1b43f482e85e236fcd65b3712326f7ba6419fd17afa7a2517eec53d82b7ff6c44d009d3a574edf537cebfc3c956c79ad508ac855e8bdb087adbfc46894a89de6bee8314d77bbdf50247f59a6271c1b958d026ac154a4f82c7ff86b5114894ecb00689e1ef434fde2d14c142781545012d751ecf2a2b205bf2bdf578037b60e69230b4278b70cfbb390463fd3d4f5ea25aa080119ef67835190828ee6a5dd6b30990e6b9fa06093e894df64ca01c9f953a103bd8d977fb3018cf5530a2f39d353374118fa51a0f84164fa44a413ca8c305cae312d38c5a0e09e41a6e2262707850a439c289a7e380bc268a4bfc8f0d1434dd2ce27d6010a7c9c013bf8383b0a60981381f0eb435c934e272c820a7e11213a3c38062cd114c3c1f0f6434d15cc47feca0a4e960136f07827834c30365ad019b9b1d46c3ec6257e171dfcd8475487a60d04b337894f67cb0f9858bd4fa0211600eb147c813b97de289a1101e15fa30b89f38392d6881336e3ff3121bcdf4b7c2948bcad64fadbd470c6bd7bce7ebaf4a192f1d9c793b5a18d62228655637737440a21e7951e74880cdbc1900143d035861ff9ed072bc47c44943d71a3e645016cc6689204357c3abebe41807601576740c67bc48197a22d140bbd0b2c5bcb59ed5087696b53b733235aae26179fec184c59d65eceb918c109e9eb23c9976881ccf52861f6c8caea2f773856c84195a35de8196a1da7d9f9a2699eb80a0237f7ffe905b056e143f5ed08da7a000e7c18e8cc7328de6405da6ab73819d2c179a0daa531dd2b9d3384928ead5c6daf7091c5cf9387cb7bb545eacd26e697dddb9f6ea4d36821e5684d90717e2f55875e47e7e78bb7c361a5aec92ed670f2701d4e3e4fcdc29a90552e708bfdbcf44a59d05683422affee8e06545476f142a7a22e9d18e932be74c40a5495dad98c4012a853d767cf9fb24384b820250deb6e1c1c105e939955afcb68d3e0edbeffb3a9ac35ce958a0b0ee2c9c824db4c4ef5b2d92e7161321a0f4a5420dc645f532739f32635f24ed58a734c00bb2beca6a5b011e5f9cbbc78aca714616760aab84c18aea32bd435ef17f2f3b327daaf9f146b4f080bf13c119de3175599d653308fe2329c1d1611e37b7061a01042c0df1cb961dc06e9746a1e20743d88141061ec1729ea05b0b6160c7b737437f6674b022b8f8ee3422ef5c11c6dfc634e794281cbb0f8d09676387ac3d1a499a3bdd33705cf8828bf335ca79c392ec4f71890d684edab3c1ff7bce290dfcb2e10b759a64e0fe4da93ae1a82312a9f5a6111e9e6c80a3cac2935dd2309f19d2d31f7c8d0f7b351744bb8c837956d30fe86a9c30c454a6b66e341135d0f05ba4ca7d59a8ba9cdb4ef2250e3c0a3597661c31debf1c11ba9446ee04c94d4bbafaa1cf1783676692976ad67281f711670d1594df0d97766e8e1cdd82f108f2c5a656233f091d7abc404911bfae8f97722f9e37ddc88e8bdd1a2a1f1d64308c404131560ec6a0bd98c6ad13a75716092d6fefaae0f8e00646a63568aaad24ce5f4b361db5453d3720e0025dad10f76e93d61446d710496048946e252b91cd795edce3b83879d3bde42b27b6f06c8a3f42c04c989c9770c818fbfaf3968b69bde3de60c3f28bd4ea5d3b4cbc925d19fee0e4fd852b931e49e61be216fe86ddd2654eb632242aaaf9493af0c5ea3eb2dda33b1e1c8368c6ddc699617b71423fcb4c56276e4c48abe286a49632cd8d439fc50fcd87367606b40324145f14a187ce2f03e498213454658174bdf4e4559ee39e496918c0dc720825040eba7d560981195d3e5b7a6042179f2e5960d1d9a74a10d8e8e6c3520712baf870c9020be8047cece68f88b86c76c208804dda4326b2becf7c2cb7043a72747b0dddff0fee138dfe50a31f6edc471afda9463fdcb84f34fe438d7fbc71f9c9db381f1a9dac7b8dd677434ce57b1d6b1a03adeef1838dbae72b41a13cfa2dfc2c62b627e6b2cf29a04b49d7d227a04d099f2059d13a2a3e9fd973f2747a15f4bb6bd4ac3d2faae4fec40bce6eb0bac8ae03e02846989a227834eefea05ff68cda0de61253ab726428efa8b4214259e09c004f67c6df3c0ee954835dc7db2ac34865eb472e691a65881dc8979d86cdae7fef13d0b75860bc4af2ffee803729782cc15eadef8f2505baa169ed049a16c9c84f8b1ab12f00b352df18631ffacf6e4c2a678792ed83f07ce9293da8ac496b539806c30a1558d7383d1a56002be7012a053fffbf2f60ee94dc3e1be46a29214e07a3f5b003c851e9bc019821085162f9ccd3906e6b6954bca057e64093ed799f7948d2577e555f8dfe7b551bfe3f47e7f47fd0a22257618e42edea2ef3fb433670b7020489ef3daf228794aee276254833638226e9a5a2e1531f929cb3243485b21c33996445c6a4c30a128e5fecd0d41fd3af3d4d55e4a0c96100182e299fabd628a241c709dd1c8bc11766368f5c95e8e2463671df28b187433eaa07cd0f9d580b29d1a1cc79d1907902e4edd24306dd368754e637b5132c374d2ebe23b7ac297834932cc4659900999d5db2da505764ea4b6873176db12d79cc0846454fad1dc2e99a596999b3bc00d7595efed53d41d579b8db11d307e2be6e24638bd1b67d4c60684b7043568c9c2f01cd6823510765c3382ef5b250f71c85eaf99769d76b131b5bb0be8b7c0aedd78a02966f2ba9eaf388566007d238c6037f7cf25a9d8dbc4156d9989352c17561fed63753807c930a9a5bf9399b3534a3574591e61185211a6d4e242b373dc76a0abb57923dd304597ac85a35974117be68e686ad7cc0eb1ce995d50d266032979b95fea6eec109b39fd9fd17fe04a2388ae686f02505491769deac282be5126e7ca1b9e8105d352bd056c520052ad45807c8a5172310d64d62209a973d54c5ed7555f11f9127b6a752f3acc4cdee208703b5e4a3034a186b2464d6518c00daf56a4a7b46631f644a1d3c4f30431c1c3606ddb66a3c4c28b5b6fdf77c6a2f7c0871e3eefb0d9c5fb4356960995ed2487dba021bf1601b27e9e623e939b116ac9a63415cbd5c17b6e7834e1eadc01c67b583d29a4d6752af3d815692362dd6f3789d9e5b4b7c1ee88cd15da3657f5ad39d2b050ad74f4da8105395eada91238b56a2e405949a0da656ddf2204bcf824dd137c3748a2161dae26e6a5046d2640a3c3c37b058230b66b7f42996fd8ddf8200cb8351e2357b9aaa6db76edba1756d60ee778f03d03ee58660c211b5cdfe5419ae09648b8732519c50f638a38d045f204d489bd14ce230a2ea6fd2c9e11935009bdd8e92faa000997990e95468b292580964b1b340143073a985c52494c59a4f8bd90673e676ce8edfffc3cdfa77b8a51f4d89ff68d09c27f1eca5e196db28afafae2cab3feb0fc140bcbb06189981696c104341cb0e3691dc381132ff017d78c2dc347132e383fb78e2b96d22dc3cb132f7c13f6a62b83dd165fe01f363811319f253c8d5ad862731e5df1ee427b71e00e20a848a2a19510139ff107936f53156b89f32b1df326d7f199b1bb18afdcbb47dcafc3ef57eb8b98eed2fb3f72d65e48ddb62b2fafef8fd1d6e7ce68683dddda9bc0ef4367a0486d65ce18d565d2add31e1824645192c9c04d5d9df14e3fb538d087a953d6004d9a749c7319072ea75c771c20687610fd944db4d610370f223340cec7e0f5cb44785c84ebdb9113e7024d37fe5f09d1dbe9691541e1516b62a769bf599ceb8c1fd785ed0ef272ab582707d4900eaea5e66c0d11f8dbb68318be465fafb6b060273a8ed2eb801227c35566210b0789e0eee211b555eba1fe60e80a55ad636e9dcbcf425a76ef5e58e3c0fd6b8501d16c733676f7727a1949661bcc69f817fe41e83d31086e13574b855bec1aa403eb69c8ceefd95f63ceb56c83ca74ac2347b5a8e45443a68333f4064d58ad01bb4ed1b0f84c6c07574d568a01a439a9281fc132584dc8675f0af91c4545bce76c29fe873de5e017bfa7590931fcd53c2242354ddb47865adec2b6d6559e957b69586157752f471679e8070fe929c8571993bd6b8daeb1e5b5db5968c07da4c27f2bf6dd67da307247ea63f58ae8e60c19062d7ac2309dfc76e57ec564ce92c9a34e2f04d06c9348d8bc9eb2eededba99f1a71a68d293c2b7cca7d1305e476ebfb76375618d9576acb92309f7652a4b7f580d395f777d1d8898cb289dae810a72dabd5d56077b7ce97b4d3a82c3791079a9247048e48515416e10cd49e01c59cd0a5cfa1d5b2508e2b024ee154e2a9d0e81381b7a688ab8dd1cdc468145c55ff27c1fe9d46e1de61329224161d631c33e462235b98abd8f4d1db1005435bb09a6486e4be6a312de7b4801933e3904f1727abfa06dd6caf46a08efb44fce949ed4c0fb05b481ce16326fba9893de8e198903c257a1d2bb32722e449db80d760e1ec1f8d7d37c6a43d0dcc27ebff45261fa216a21c8fb14b635fe490c9205e82a94da1c60b691421140d65ff3d83cad17ac2821d6dd9e346317421147141984174e8a3be05b44e739ca313a24a497b606d7f171334e9718dc700f37fc07480692eec173a858ce119fd889072fec6a399552005be0ab87dcc7e9ee8165ef2f085c062c623104dcb98e6559c847c08ff5bf8f9a29565a9d82c00c30c36f39fd01194151b77929fea2c7c3c564e29698ada3b7043c102266e692f96c18d5731c320a8d0250addf05cfb76f1f1a1380271f40ddcbf1089d9911790e040de80d5fe2cb1acbb8297a117739cd48406e5281f5fa0cd78338ceb17eac9a675c9a0b49fe1a4dbff4eda68c3e843886a3fe9e21eaaa275f61628bba88a2c7e16e09171d76f5011d94d09e937f2266455b985af0fe6e481b4e847754992cc93bf10e58f5f931993bd913fbc29617027356de7da477c543598a721f75992c85676f67f4c0b873672a8401a8131a1121fd5eb7a8b7da79b0af6fa0553bdda5d69cc738747228428f2a0eca89c5b27bf78c86abf3201d66ca761c9d622348860061034e2238b302b06e53a61a3174fb33bf9c7bd708f68bd2ee75d3da7e207affe1590bc2c6392021108aaafeab55f0649aaf0e9079c4c069bd90ef80b653051d3210b601fb7aea62ce3edf36ef3b26b764e995c53c42233c2fec6b2e325c8c51f12753011a4cb9536e468aa7999cac3fcc98e63e55d4647b4ea848ce18ffa6ff33ceb15aa723e95728b126f595e92c947924657c22511fbf63db593912435b2f34de30a37687d0f5811c53cc96cca6788429cbbbfad740ad9326968b6818a80d347b0c2b824a0efabc76afb97dc8dc6214d5261f2057df445fcb742d43cda43345bb3629148530eecd2a2306e1f2223a231255af854db352f0c28af9c9e0e2f0547b8a8ccf6d9a6b2ceaf1c86031d5931542628e8f03dfe406a1e093da3b819109171c2522e12b4c3a98931c0f1c3d7c1601c3f28a6eb267620e654f1438fa5133b60ec01cd8511c1c9b960e6741bdc627d7d3cc603474a0ed3bff736a914e02b3659b76094df19d079b34a636999500aad822bb997ebb3131b18ab33c9f00ee668dfbe19cc812df5c7e760e35c9eb025059539482a6aecfa97d5c2e59aaf5f8cfdb4210fb4da604d30218eda431cd38e520bb4f4374beb24cebca58033ab9f283ca9520773a53d95b0b232fed012ae3ec107e55de8aa545898e603c6015d8f9a0118f292d63788f0d68d5e9402d4b389534ea99480b272e29e5906447ef1a6a1eb61533292e782d7bcd78441a44b65e57f2fd673665b71b0049adc0922ec7fcdf0873dcbf1ac95c719c25d3a457de4587666ec922fdd1a48f2d9fcefa644a406243b1b16198a75e93ce0948b88b42854200cb249b2e117ef225ff608cf38231a5c0bbd13e61ad109dbd0479e9215967f96a69f98aa931c5280ba58283b1c191fd76fb31226bf01d8ea967fae985e74713a252639964fc1dedecf594a814b7175b6b1eeb47e504a155aff362aad2dc1babbfe3ba7036f082276c7a5d6a3e489a419387cfe7e562c9e844ff01921eb926b91e34113a5800361415cef61cd53321bddd3d703ed603f4703cd055e49de815cc55692fba15be07356384066e1069063184b1793e2c98651a5122b668e7532a7101d28d2120078b84b93be220714ff6e3cec9db70311e4c9110696e40161d76365fe96729210a993f25ec2bc04383ebed5bb581029cbef9e6e5385c933e19f30523e7ac9fe7bba00a54c79b688cd21be21b95df7c8ac89f495159db44fca91f21a2f1d631805e30b4b98e13567acaf3721736df7009aadca76dbf85bb5f0b6d8b8082a47c28019955f0a0cc3d240f82fb567d1b9798f28a46a4304ad60347d67f14cddb2a68a05b042c1d9156d30013f0803c0d8191e51dd83bc0619eb65d3d57b99b09155ea966988d27447a8e53f684ee1c26aad415615594a1d9984cc59ef67dc292e4e3aec1569fae5b772269c6838606c59975b295c1a9a58e70389d716a083e26528105e3de26efaa3f87be88797dc67e138bba5a5064706abe6c02b737ce6af7826e227a9dd172d554d4e65f7300969c88781a3e214660c35fa6fd8fb34c92eeb7837ff04c71dff09200a7f9f70d0164e3241e68292bb05d6e9d848bd714a39e5a77693a64aa666e605b04780a3f804fb0508f92f001420659a2c02cd74a0f6539557ec9a87d667ad3eb377b32237c88e1ae469b7d10375ad5fddf1c66208e5fb396b6c89455af68488721f1c35d9bc8b0db15de07dfb67ad6b639e08ba2f5eb3b55c57941ccf48bb04c0f271def9d6cf4f8fe91f1a25b636d6e3a347c86dde2940266ae40ae3959786f833343a02f218f897f658cb90dd2558e6459c9153f6711d3643276dfae7ef0b4287a5bbae8cc216fe8cd7c08398ee65062fdd6068571647d278f999e57602b6536121e9340dd8d515356061338e8f545f297541e66646a88b5ee138d820268309a22c77bca85c4d9a41565e59e8aaff187df40c1ec0f92d2d1afcfdf7e4c72295dcc134e59bbbef2e98f464e025ff38d345b7c4b082c0b062aac4a9104bf09d74c789cfb63a7134570ac1c890a93e91ec3b45685b5312e1bb76fac9087f64bd13ba15ee12f700542b71ea3ca4218692da002514aa0317f6a95921b78ab3bec99819839a8e081908e33dfc3d57633f97cc25d0abb4aedf1f541ba90569be3b8b15b61ba03039223b998f0ed983f0de032ac4e867c3a28dfeadbcf649f216fdc84de633ad183eb128c910d1bc2c874299cca328c5122e05370d9a7025bbda7865429da08f025d0e78e713d77143c35378031cc93df567049575c02df80f0c6c35cf646186fed0c7c16bfe772506e0baaaa0db2857c306416c6ddab88690fdf0c171ffae7ce3cb26dbc4e4f8be6f7b45707c047b4e752a10b2cddfda3395a5af0f6944f4b55428c7814ea688fa27af91fd1ba0e48e43c9e6bbf96968af2747d0ff77fa0e27ce1681fba674c7c1425019d14d3bf51e85ab5d1f820940d93d2ea406cb52c61b5687647204d4cd06222b12d82d1c9a89e70f9e787069b551f8fb2ea1d4d0aceca5ab27e618b8c9f859cb756e84c67a20fbc57c3fd9b4110c1857da8f19156fed0b9daaace41f24fefebb73b53e7e9ea044e843543f39323aca015f93e6bdfd0c67f6f1eaadc281ae3938b5961247427b5dcbbd67c96efa5a4b749b717d0de3afe02bae31408b20a64f296014375c72889b3fb863ec2cfbdb77a34f23f2d530a81b5087fef0f28925b28eea42458a232e3927508f831f7f90949add82b1775fc51567f946253fdd8673c59d1b171f116227b8a3d56c2866b1b866247d53359dda67f4f2b63396e1a99a3a5fa0bb75cf7e6863d0637e0c6be0428be760d6ea99c696fad88a890546cf65b8bedadd50f121b62345e6971c1b6afdfdc3e466ffc5df8d750ab3d4f8788c6574885c044feab570f1f3313616b4a1c0aaec529dfa7443ba34a10c53590e0ea1d3a9cc5c1570105fda12d4ee30eb40806616c0c46d9be7db33163deeca79ad3878aca02c3c3d7082bd3f69b878bf5cfcefb67bb4d2e1a34b25b3c85a803488e0bb980448646e47afbfbe92f5571a48015ed6e8e91c7b9690f5a3964f9ae7e84f7d17dcf6750070d30f21642425c518a8c174dd0e503751f3edeffe333ad0c7d0c87df00e6bb93dcadf6b89b4e63abb6ee082e2a1b9b3a9c423a0e8bfafe3ba504a7a0bc50776303f488aee2be36b7ecd1d879ed0cdd4a7326f295d2caff1453a1b563f16024a54263bb29f1a39d88e2894a513aa885369935e1adc720164f8ce984f4e90ab1612c2fd16bac860dfa4bd998611e721284debe2ba7f9f901d3387a339dd915544994aacda5cb2f6f588cdacaeeb442856cff06a934ab66696bd0c50eb0e2acd60da3e4d47759c2bd4828b3e7aa6397f107a7d59ef7a5bdcc97188f6847309c465ec90e01ab30b99597a9653fbfd4ec8e250407b0c1a085f433bc5566826ee9ff3896f9401cd6b865fa244e5dca87628fdeb4c63e2a3ed414593f4ad7ca24b5898ad1a8ca78e3159d3dd03d2a7ba6f758ba899ed6c6794149c744a71f07a69b66155998711367e6e35b82268ac7283d9b4ae825581b5f182a6c6247fa269aae86c8f31fe724f684d9e3c004f6547d38567794b84405287cb3bbb0f9bd27842aa13f2d0529df53d9f0384a133cc60a2d8f8ef8cf06833bf5c57817a06b8bf9a6d73a40e1be016778049e99367b1d7655264ac0e76221a46d597bba9c1daaab208293181c6c2cf0bc0fd41c3e7b066062ac49f3062e92511491733ee4221b96963eed3934e079a10bd71cf2fa1b026a41403b3569bf56264655bda8eb588678e31db391e97c00a14778281462b5a8b33624270cb34ee890342e4d367f29eb38fe7d45ad3ba57225713c822543ba925beb3b8b55f683e0e61579e61c391cde9960a3f5bd26dcbdbd34c5e4e9024b800807e42524f0d924ca62b504e91dd555284180ee0e44283caa81fc1c3e4671fa1e041485b970d8773f7219267e97d4cb9f24e228cb0e227f27de1d015135d4dc82707c43a952a2f3e16fefcbf57ccde5b3f8093e2c372dba1d3825b512efcf50a2f607cf3201820c65040a6ea9d738e65198d9bc6bb488aced702765da52236e2a1a86e4175c6021b886da3b6d01c4188b4971a2c71a59889ba65d99e78effb0580c424d938388c2372af4d8e5b6ba63a187d96b828a66119e29d8c5c2d3221c2ad29e1f2250d388238be06ab65d120e6038558d1c0b2f138f251cec1dd28492ce874d22db4d0a9860e6c1d717c0594e095516213cbd459e14f901974e0f043b969c4a3236c30e2b2f802e580dc4457b55eb751db2ee4ddb64c768b94bedf2f926945e76713c89ac27cffa4ab5e012c2462b9fb30f6775fdd72358ce3eba819247c59331f29405b49cf81fd5a05a3f285e8f21303e5ae83feb882bbf15ecacb1604c15ef3831f05ce6319723e4a1a51e7e70457f01a418a134c6df18822a200ebb6717ae6491c8fb9e87463f91c8e4656bcdf6c255ce440af59cba84db2565762012f1e9703c683fbdbe92a7dd3aca7fca4cf812b5bb219f58c6484f7c45ae029c3fd1ec4b3f18211803b2d529f4d8e106fa4652fa5f241d42a36abd863ec1b479e44e82bdeed12069e0a518c9ae52925e904fd8405d5847c8ac03014a3a109215546f3e876b338f80449f0d03161278b37b2c95a0ed0fb10c801ba2c0b453de3c28354aa8d545dd3f410a5fea2d728d5330ebb72a7ddd510c530c794879ac88d8182b1e370175d334b69106061e5534c579d994a0f57e98fc8362e4fff05fd09ff0909de0dbff07c8ee4ef80f601fc76c6a5d7b99d278fbbf4368d48089aec82fdfb75fa4a0030a5e1e7230c29c920310c5f22df954d37cdefdd11053ba4209973054e310a647e3b87a4e2b4ed49a39f7f7bba6626d4048732a0418e6142b088266a51b5909d247a45a4f14a746b199f47450c81933028f64f46a7c0f60b9d69bc08319042047d4bf5bf98745656722031ce71991db8f800c37c762061ffb5159e9edc73813cbe40476b1c1e2b47f80cced81f8dd44007aa07e0dae027e109f6162605d283017fc3dfc841e3a9124a92886f8b9f834b5f2c39d6f79cc40cf352db7097021d0f8f55c537756d4398c9ea97cdc4e10097d1f0a2781408c7ea322903b8058f552c4c4324d9855d5322df3959a048a4bd3e9141dce84d02c7020a62e8b4213f4d8edd1694e8d821428b707cce1327623df1ae0b8700e70464c210791d4eefbcdf276bb83c8b9cfe3a1c36e413ba9c1339b6721f46d16479b6f75d8b36f18f791511e383a7e46b6944e8d431eb100e628eec69e62577bdbd388e26fdfe0746a87a894599282db20f2993eb17c961489b2ccb0a8007af86fe487352235eeb6fe2d6abd95c87275eee50d03fdf4ab73073432f4cb8779a014df0a6ba9c457a3163a282336afae5b5f4e33d5b4a6d51d688246c785368204fbf42c8a5ff86443ddafacb9a70a86eccf44f35e4fa3bffafdb364027ca3aef083bb9a2d51f37cd1e01c803b382207d2eeb087529b18a225040a9e5bc599cafc5be2cd9896767c9780f6f841090b5c7ac419774a643b0d265ee1450868c1f94354df381ce221d51ab3e6b8561ba07125543a7793debb1b71564b96727e1b834a78ab1db042262d3ddb68047d294b7648bfe34d8cecee70b279b8b08bd3a24600ee04d02e635f7f6b8ae9090baf421c6d4658ed541607915f1d4387a8d29c5887154f8db8974211f074226b9b5261c5a03b432f3c9084415fc591916e0f476971b9ec3dce63aa7527de9c9669d9aac7eb7290d24772bf1b21a14095dd3e241a7161f4f9487eef8d66b5453794bd521b4dbb70baeda2ffa1fd63d5cf726752ab0ab0e8d7d67e8ffc359cbbf16d8d347c8df514fb6a9cb082b35dc2caea4d69d6d77215ccb445581091eb7398e0ff4d2bdecdd81e472ab02724d34a46a1f4d99f17c93635ae0514100c43ead92572e98ee4d2559ff988fdf7c08ab327f0ac40f0b0949ae32ad7a367207f055cc4619aabe67e402ddf2fb66fe9c72ca2d7f18e6e01fd14aa309d7badc4807698ba9cf70a21eacb2fb1b23c0429ce66b78afba839eccfb5b14f6109bbaf660c4ff86bff2d6fc9c1ff4a13645fbcad7be12c5a7260308ccf8352d5f1d8c9505605dcaf38e6f0f84d47bbac9c171b79666d8f893b0d2bd553b5fb47c3dc071e80e53b4812cfdcd7f4732e89be3850285f6677ef1cd3c8601a02f34f0a58c486a08248ed19383b5e464f68684b931146e919d9adef114276a17135c28a10e09bc3b658390e273e402e63f1c4305446773e0125249a4935191c10fca67e3a1ecedcd19da2f0074e0b1cad125ee34bc69fb769af0b95a4d01014b1a5df54962a5e6978524d2321771922ed9f3932f8d49e794456dc722fe78bf1873db9f7a1737b45d9928095e503692a68fb485055f4642053747c46888e5311b194c7cdfaccc7e1fa995a9ec434b4d7aa0d0d6c1ea20497019dc7b8b6030eec231175740ba7d6d937927ea5c503b441c9a4eb5b86300da6baed568344987776f19aea8d693f861cdb8a8f4ad204e8876e1ca1992f8ebebf4512f1d8c303e1eac1b5b2bdd843cc021ae00f78292310af980544102f4cdb8409a2ad05633a84af54767b6aa917822cd774ac37432509383d42378b5a9db67853d76c62011ebb3fa506a4c3f5b5658302ed3e388226a012f60995a4772dbbe951e93cc6dac6243815d7a72445788446dd1ef1a56226393d4074b11bf44d5cd096e08d48cb25d55006e9f24f620604b051910a2396a8e5872c0475493659fd8f3cbd4114bb3d8be26b089e4dd0bf7b1d6892af2682c18cb7bb410d15ce745a366f4c75a4128a648830059fdf567af061dc1b4ebfde087f0161ed5f3b20ea040050a21ad10577eabdd3f2c81d124bd8cc2d6323dfa14f2464b2d9c6a095a46a926648990ce64d29725e246c3e60e45b0976d03153b6caa6e643339170179bcb48368ac6a96facc5a00d936bfd5f3fecaa9782cb99210b13f72509f0a1b37974d9e1bdc00fcbec064976498727cedc2b8f62e74a7716f19d72e8628974cabdd2dc6b96dc2b47be5e298db3309c4b06c29d525bc06b60a7cf6d7879a81eb6de9366a3d9d61b0be7603af58ba43f5ac96b3b25b998ec5de1040b2626ff80407af4808484009d1ca427d4e2bee2055e758aa1b2c5fcfe90d92621d8084b60f5cfc2f86b2ae2679b44be6e8c1d4632b5633a6dea2edfe6f8c1497ee9212e958e9c5a592663724523c12aa6f814d216a73392b9dea74f22440f416ee58bd6df935f972afb745cdc082bee89b2931f889c4b9c4bdacc67f99ca5ec3f7df66c7f1b5fce8a34e594b76e0f69c47442a18f5570aa7d1e0630cfc43b51fccb138ecd2c59e60a743bc7f02b34c1251028b8510fd36ce0cbc38a87dbf20e23bec0cfc50bd9a09cf227347b8e135d746832c1ea20d73e792a66506b23a2cf7f7369633f2cd934b3ae5924dd558253728fc77d79b8ae2a4e61b4c8d075d461b732ea4f18bf7d80c387e911ef9d0ff86bf08ec93c087bdaa48dd8ac917104087c50de5bfe86357db8c3ed6866ac28b24ffa093663e89611c119233baa2b06a3ebaf3f2aeba8889349be0b10d2dd61fa5da6d494c734d16646f1657213ef01b0761fcac5a43395a37935bec97d275e8777cbe1ce82750c1f91e084040105f40381065b395929f9f9e6d2d7ada56282b581b1b8a626568d658a885110bf5d0c7567e1ab5341872512e0bb39e885a2ac287c695a1b8834d6f5959a05ecc327f85d6eab5ffc56ad38586a7a1ecb0dac9c36abb5b310ed3525f4b7c5c4405cc273e0053078a1068acb1894e10909cfd4d755421717a8a0f5375106959ff12f8db920a51c73fa6c7c5dd209d8056b9b68598aa4258a95f78d455ae74b5438d80b69a7af93bfde3a3e0459bbbb7434f860b7fe2134145509462e0c7207c7f01511e3688a9ddd0ff05b7e3617cd58388708afed95575b26e68acbb7f0c2fc53b3880f44c186ad8216f55704cc580ec22c6f1b4907e60c788b0302575703024bc5af615bb2c4f36708bd60d435e16e17702392281377b93ff2f2c866fb82b5a3f24c87388b762bf98e1dcf5ab5db836369233e157ae070b582c7958fe51735dc0355acf795ea5274c684ef94613b31268c1f7b6fa4b523f15328fc6365a7cfc77aee42341858e06b0cff9fd30b182d0b133a551ffeadfd44957f997941039bbb299783254872201cb973ff72aa5ac7484bcdde5988ba97394d3aaa71f21e73d585bba37d84fc5118f97d89f7a5a2fbf5f7ff808d2277ddaa04cbe6add8dde5261fb366766e22240a4b4dfb2b2944ec5509fdae15ce107c1fc6ffe90f76a33aa992274f3930fe4dab0a24ff9fa0c40f92e2fd54d658289031f9d80ecba4c87422899cd262cec06b83c4068d9b3343f847dc5f30e3875cdcd24ed052e55f68c187129369dd64f2cceebb405e007342b189a07710ded2158d5168287d66bde122bfc1582304c072f3651e3729f6cb306f95d73a31da73e5e3aa84da2886fbfa839a859fb3f10acb060593eaf0f85edc89aa477eeafbc22c43d5e2c92a29d0845b43e4b56ea8fe84260d3d62b2cb3d794a7b5714ef3ca5d05cb4d8d36437f338a674a46e944e5e0e682657af4dd92c904da8d589a68d8eca0af01facf7f6f33f7cf22567d9550ad6710924c60c24fb2618e28666036ffe7ab2917f1e86646391c1222ab279c244e5152d29859d3840de34ea3c556e7f14fb45109b44ed540d3e49311a5127985460859689e463564e8d3b52bb5dfb06e680da0f5d8585422fef4c684b9ba206f6a5b49825c1d709d31885a16b251a282e66ff522405a6247b884399c49c620f7128939853c99ec7d240af2b024d8e9fd6242c1c06100034c12bf8639058befd4bb57cc4e69ea641529517f705a4dba963658bdb89bc1a93ec54573f36cea4bfee32bc05982ff44def7e66605ff87d0cc8701fa28d374131b92b2904ab8e899376bc258db5ded2c0ae7786831a8d3288a65a3bd1819823f85500a0a619b8ec075ac7ed48e8c65c690fdc3ab8d552d0f59047eb725dec07a473a4fa071a11d78ae8b8e6a9e1b36055e4a6213814ec4b6d5d7418f3f0d1a581aa9bc742a9d099a788a9d663b77bc42d6d1316e84d6ec9deb37bb6b1635096310b06470f3f8364d9efbdcee1a72241ca9f3c303d7dc6794c812ad484bdd2e499a1be64c1410df92eab10cf40729f8ad57c0a1b0c124c4358d2518bd9decd13231e5ca4d241f948a4d478241b16d51ebb8f91879e6d65d3d8558bccf399079b1ee9c822fbb09eb65bed5a809d559bce3d53782b7eececf94e24001477db02bc288ac2dd7b92cd13228dba40a34910510230cc896108e453083de3b819f603307591bdf44aa1dbb373fe0a4fbd94c2b4c281e3cab81f9b1505e57cc10792765b3a12ced34213b81f88b5f3ff8bdd0ac2ac6a285547da66c90e13baede3374b7d851d7f74d44e04c0f8190488335c0c87f3800e236f02db9bb873074ecdc315b71ad3481b689a8ff8e6e9560dce1e4f257006a605ed1834de6d7ba88e804e740cf86eaeca9ba12ed3954c60f86eec85a9bd2be8a460c507a163cb250afc08933188d00adff2d70f9c747e2c7ff57ce54b5917f9ace1ee15f3838f872874c9aef9e6742b6ec8942f72b16b316fbb1b01f47e6709e22635f978a30c9e9012d1cb108e1cd98f5f507992c104ac15a7991f0f1fb46289519a4cde8ebed8101d98d894d237e68e9af543f7ea0ec536e6b74c147f97075eb710ef7d78aad5704de1950a0262f762bfcb8655e28d5394de16944daff839ba61f79d3cebbad9ae5fc3634373a97bdc193bb383c9c0854b025d39467554439ae9fdc33f1c7964f2c8722e16c4737477ae23233b905d1080dc23451c568dcf80c27bbe40c0bcb7fccfc3edf6361102c7e5f36c00d0a7aab8e4eb17f1d67c75aac6cfe774071b333cd986ea31668ef082ff79b71cd886e3374ffc45680371a7c61fa5f3c7c478331243b8b56d0fd18e833c979d4c2c0b3b4d86fd1a32bf55aa9d9e58209834a5dd93de811d09a2511a7d8a1c0fc8a84ccfd486622ceff0dc9aa5ca34dd0427e591d35de8d2d8831ad4c1a2c81dbe0abe13dea8df33011b43a23f43d89ec9f1c393dd7847e6d110cc94fd1d55ffaa8ffe394dbed99ba310a2d32808efbe14492f174977ac28c7d054fb531406108a9f832a28a2a3b05a8c42265094682f09555e1cec92339f4cb2fa916ca53214dc0f564bbdb0b686cdec824adffa49d0f5aad4da984e2a2710dd18332fe41659b765f2a8f6319fc2323e549cc4965f3f5def0f6eb314456119ec031c226f709291a7e9387d6a792d21f7b8bdc8c70fd83f408b4ae31f2d63c84c41cd7d1175e1f77d89a995555ade9572925cee1fa7df756cdf84c5b73ac5cda4fe4ec7e833a2f8b4626b06f2050a90fdc45f82f67fc2bc97e962f33301aebe9c7f33b43f257a8db2c5c875866533a626a86c89713234cd113bf6b57313e6ce6800f5f0d98a98e856bedaf671df79487b8228f19bc39bf5c8f449118a70e72e259f64a7d1fa92ca2658548a1040ba41305bb5d95c29542a16e9dfb670a9690274408bb375f2f5357a12c95af4d3510aaa45d870694e1f7607fab68c6dd914d97f85f2d177f36c0d30177928050bc510d96be9c37aa9cf29379b06a9fb2e021b6286ad62a295f92fb4dd551127c4074284d67d20d1221349eee9999250f2ff2749afb0ad9e5b762b0c56b364ecd096739a52cfd0f04d76eed678f976d80d6b900f93873f0471a82f10534affea3181cdc652ff01faee538678e61015f859eaa141c3d7e427fcd87f841c7642ef7babbdac3c035b9e90ff4e05f61a70e354fbbf8a49cb8e54153db66b2d848c38411e1af7a62f72578eccab80077cd15d9c06ef7eeae7ecfcd5d8a1c8a3a36f1a2e20852a1947883324a4fdd9c5dffac61b7b5c369310d2351d5e17b6cf1a73092ef10b0787ec9679b36ead2bfa277b8a249cec4caf9a19894e10259f0fd89a42943334c65a49db4a076a21ca818b931a6cba6ff704459417dd5a31ba62fe127c745bee43f43602d210ed7f228f9398dc69a35fcd220fc2c452216e89ebde70b1255fccde4d2e360c52cde067fe56f4c19d3c2b89d245530ce21d22f997bf7b54d9b726dd519c1f84e6591e8c35283c79a3acdcae8586906866b59004f566fb4c3311216c3689a638f76bc50b1aac78e2756c32bcc8a71fc6d9cbf8de253dc389b41cd6b2e64cd71dc2649885e7b8814bfa5f9c0536fc0684cfb0f29d3733743c6eac4185195fd00f5a60756366f9f98d7e050ca20099689b079ea950f785a0f9ec5df47000f82d3a8663508f324d73319b6edc2ac2a1d4440efa40cc76cdf05ec4faf1551be69cff3401c9e3691486c25f05c157d00093303a4451c99c4c3a6587920999dce929ff4097881726bc1ab658e4df1336d3b85bc86ca0f9380ccc8be1387402df81144fe5148712f80f976cc30f0c312c01bbcec8501d732ad18a2f56588727a27b033c0eaca7ce15c60decc50c5aeff6dcd810918cbe9f426013287ac67d4106c0f09f6cc258d3c4a85ca07416bdce127a300dac997599bd56a139a14a4d11d8e2a8ffb8fb40689eb52df449c3c89992166069cd580ea4166b1c6535795396185339c4965211485d12c2ab207e8594c3ca1cf66f08811e2ab77f7411d4a495cc33adb639c4543e48addaa5164a67e5b9908fc8ee7c22549ace7216cba1ea1435010d656dd14f9f388dd02a0816a88784d795b90ccb2c322f6bc48f0670f8695688376a4bac2f3b82b06c973a4a25cc0412ce9f4e62a6c356c920e3e444fe3b1083d0cee299efa3b0d0636fd183d9c81eac276d532bb10f9ea4a15a3fdee67ff52b0ba26688087ff19f00389aa5aadc2fb82bf8f876397cd2b2be2f24120c77f99a3939534c0897a708076acf29062271408b952bde78613e87d9ea0a20eaf8e8f04040226e13cabfcbe235f0c8f758ea53828628b2196730dc1e532cf12c875b6371558bb0490ad6a56d0d0137b34db6491ebf0c99a19515cb4f93f596636d0aaef0924f068f76162c5ebb1871dea9c50da1f276be011c32139edc5bc3ae3b56e9861f894274be3cc34392bd97a64f07efe2e3b25518c61c682ec40970a75d2027ea649a19c0f666a9d97cdd3bc44eec05f7cfc87fb16e9ab1f67f5c1ddab63978b769d405791645b565e350285c6a5541d747c5e469f7dd42b12d9e495889880d09e21740bc574d5267221bb2fbdef774c2a9d06e11074d221370da1c7561d7e3ee3c884be5620b99ce9c968f04ed726834108db649897b0968b02231c2ee138f0469b877f5e04e73ff415c84dc57578cc355367e0a07e4675865f6bb02fe14eca3c8fddad61b43abf114b12639bebaa770cbd53511f68f2e28c3b48f6d40f8a119691a6573c149a9fcf0a413b6a13b6b8b74a8e80b7af2033bf30822161fae4e250506b2a23f35b0a76586cfabf7bd94202f746bc90c5ba52571e9c5cd96d9a9cf411752d7da772b613042cbd5cdec1335d54a902c01d87fdb97632fa04a9b5d20ecd7ab81493a4fea5738a6a9f473fc8132741e60075e573621e892d9cb0a5d1888e45308a0a12b45655c3f7e335f412135ee622cd902e4ab752f6b584118a231ae7a7fc30c310c3f7df11f760feb076e229c3c94cbf8711507002bed6d35f606eae07674d5896f44766c9106d757f53854f1b8bf1e2510c10c239483ba6724b05142468696f234903d89dd72036969c5f389b067431abc0eb2aab92c2fbd33434e4931c4183abadd9aaee18542647905fefa1041b48fbb6a5e824359a8f1962396a426e968c0fccded0b9531c1e82c136d3589fe66f2f75d47d1860f973cf2532ed4cf6c282c081f7d1ef7c2023e22b822c85a5dad3f66603546ebb6168de2060991afa4023d7859035afb4d8b649cdc22167c677afaf8759c4b0beac747870009412314a966fc5146382dac6e93b4e70f8e2ce80f424c62051d0d71df33bd6967cfe134a33daf12f1586aec918582b41ab6a471db76b729cea861fdc09be29a1a658b4bfc03a2ba29138528e94c556787d67c9fd2937df0221ed6e234e36811d7691cfdb44c20db8fcaa5ce1a251662566ba5c4503522496e54592e8b00a71f39357bdbc25da3484e4aae72014cc20b262e4fa83795ece94f9930ed329ae5a0b202459c3f9fe559edac34255f8fbbf378e2f70edf103b8e9608d0f77aa71a86a0adab68589f00c2fda64c9dcd5a6e93a51cb357d9d892ff494daa8f5e7d667659da11c66d7cdb35e5205672b3ea9d1a85d0f9d73453f3ec648bbe739726859fe089052e04515ba3097f4a79b70ce08000a51e73dd751d3d54c85ae50b733c59d8cb3082eb84096da6211aa0ea5496c7144326343ab35208af7ac619bb52e724b4e57cbf089c82c64e84bdd4fbd6e981fcd13cd8a338390fa59230d734d6893ea42d8857eb446609ccdac1552de906da4e2d1c08e2086c9728d648ea899a52ed9b55ddbb63b92ebd66215a20e75afe03c96f5e635814834466378d5c955865bf5f42debbe9726766260ecd978c15ee8860b108d234d86e3f4b706d3630b875979074630e6a6d822e859009b8135cf15696807cbf279c7e92628eb61fdf7d8fe483a839bedaf85f67d6f2d377672a23c4323b00e09620f73503903d6e41945044f95803283c26a41bb67a25977d67cde86383446ccf1b777622d3961797016aa0a1f95371ef30d9353c06266008fe7e933b87a0cac92cf8024b4637419abe1f868d2856e5673db4f55f5aee6626781e45ed344b5254b42c464b838b921caae067ba2f27c64aa576c8b59b75eabc651b6020a831a68f84319fe14801fca106f48ae538a59f9daf6c8a959e1002657be47fccb022e5628dd2995925076b86ed1588232d729c72c94669153c5887c2f257f546ae1cee91f13caa894304d603b51e0c7561676a21ac95e0e93981704139b56bca0192e09847dd77290bc7d26ac345fd0c6fa31f85ad8140e39232d0858630c47a453bcea2f748c474c8f7986030be89503917871c8ac04b5aaa40fc28843d046d46f49f160f5f929c1735f76b185c3f1ef85b0c11535241cbb8a495f2227ffe2b0751a81664e38fca05c7c5ead503d420e6ad1c464e650d079dbba45bdb108ee5499b80574444d5e787e274dc434ed071946124f6508b624706784d3c2abbd0870492aeab23e90c07cb7190ad075d54abeee69b473685e8c2199c99277e48e550545b2748984ecb2be571ffbf3ff230941de53b21ba202c5abaefa0b27e8d576aec9082728cb4233b335419ef49dbe57f83886141cf25515c42b383417133502b2321b892b058a2b20d81fc5fa54df0bacd7442ee275a6336d0f2dab66b9c6f1028d3c60ff686d5e781ab598d20ce2f8bf214640fe76cf952500d8b380d6b6109e36b55594b77b4b035b5ca0387382bb46e608223d4ff8c0fbfb6e0b4c479c4b60500b8673db0dfb264996e82011705d18c9485276b3e06c5eb2b95594e9aa0c35f3ca63e6024f0a1df65f570cbeedfa856322f3099981b09ff72670f56dd95aeff5864d6b1d59e15167b81e25aee8e2060ecbc76f7e6e1163f7c062e9f7e4f2f4b7a3786104b605674c85100c078b876abbfd76a66e5692e5edc58b6d045976ef53e8293db0b3e829f6b30488317956b2152876856e528077211d9ebdd524fd0471382ace440278e0642fb62ab9cd81ca8e5b5bc861d554e9465abdb770b984aa20b7997c355babc8af0800ce153b243f8721c937c6e4b163c816435bb3ab66dd17856896e89f60c23ec69480da8925bd37bdfad5fbb655520c3fbb670946ee5cf0e218547d84ced70ee44a3007888492de88a03a6ad7420917fbee41ef6470edbb96128538391c6a1b7dd4042c9fb3249d2302a88e40bf4d0cd22e04d65944170304ac2a7e948adf6943d541de35fd1a2506ce3b9fdd0c668c64b5011335ba51c4662d945f1422e00099a09a7265b218722d83c3b39ba0869a29ea8cf2e5e9f036469263298fd1e1dee035ac41846006e2a40981cc0dd91ad785dce6088946ef1c6a1bc12ac04cc779e8c6efcc3c4cab7c3389265766fe74663ec2b371bfa585739db1f68ddb131de422974a5136148bd42c2223d69c8a61650d0d69e2b868c4d8bd37bf700730d7289e6630371f82c4aba7669c9d947210af7e86869eb65a927475e47239417f44dc73510a3f05815d6197f722ef086086bd1a77e458fdd8cbf5aeaa1a7ba54ce149e83968dbd6f935e09e6b528c010cf72ecd1dd4ea70f20ab969a207aacc95f3c25cba166d3442d44f219ad1c29e0f7295c053c203354b24787b51c97d5691e6c624d3dcd260a8ae075fff625f4f059c9d05d8001aaf490d674808d9c3e98a9d707ddd80f8bc619847092b9034b815a08ecb2f80b05ccade487ff00fda5d8b3255dc55e8536a5f56f22433aac68a970890046d8ad2444f9987103a2aa9bee1de9ab4d70b418b84d37c19c618d15d821229b334221791920fb539bf844a1ab87e179b6f1a4c2682e9d15a5060091f0fa10e3c5f9db353e350c67a703824e88ca4c8e616390f6cc5cda8dd425b47268ea34867f62cc3a621351f3732b26e04fbb5269b567f11c176c50a65d191fec1b445c789cbbed5d35d04c2d2eb214d13a72ab376d5dbc5bd23655f56946281429e624499bfe295d95e419259bada0325fa7982052d828ae3e6b830622821d6d3407fe1932a6b17d8fb11c32f368bdf1ed0bdfc0140716ee8bce441480dfb059cbbaae1d03245b4d11db75f401d65a4d95930c4c40797ca7620bad1a8639dc4c3fa880a62b4f467e3f77024d7b33dc99077c81094272a4a1f3c7f7ae7919da9c1b12270f017dc658dc305b21072741f0b831fac2fb15d27342dc27a93ee44d72594b9d5e26f87bedd62f4570098344740364944cab18555a33f18ba739c031bcdbc680ea17d9460e4982a5d6c098a7fd165dee77427a30c3c70ca97687048a483d0b9c56cbc1414203adc52fdc86baf260d4d4a3ff800baa0aa548f3e178616c04fbdd04269aee9a27c3a1e6ee78b998cf9c966ac60f209265319aae74a4276c0708ac3319501a1ae24a1c62341c707f147155f5e3d83d845266624c95e40ba4d5d3cb0d52cd00834a47cfd3dd0c56e7a6a9216402af4728bda76a14e96c6b59c10a8c45419ce8fdb9170ead6d91112a92819d258feefb083f3ef08d315c8447ff3f33c4ce6edc5ab84a5c074cf7210ea0bbe7076dd0180197f6cb15486baca3863951db8f45adc85d081a6fe86ff1c52cbea0576472dd8fe80ab50261861681fa25504691a148d7e87a8c6a96198e26d864137cc919d8a7d0cf3600f224bd5ec0e98ad21d3b110901ce1385b36e6ac842e128f3e5248dcff3834fe6d0013471afecd9bc342a42ae535104950fc2dcc000437fd4c74e2a87f88eb10899dac2121141ea5d695b53b07f21b1ebb2a9a08fa85452703fd77dce9744d8397b1112101b2e35d9e577209fbe390c47322646d331d167d3aabf750f9d80ea1f19d6f713c9eab356da0ec4544492f72830b44e75f4d67d873e0df8144e94071bb6889417a205398cb16f15b157924f8637813390f6b855434ed50e12d855d3383b529d0340c543c817ba638a43d23ee5d95b1acf4110be79169461ec8b1a06c38e3b02db5916f0cba888c1ad7965b3ddf0f6b71098f603c9213e110f5d2211fcfc322db32398ac4561d575c770b800570523df4311771107c9348a0bb28bdecc5d16abaafca7e9d03324df9f64e9fa3dbbb2b6d8106672e78b896ff0318295e682cffd87f8183ff48db05882c14ec4a11298a64568588cb2104a83e9d625ac727f6133725d6c892627aec543b3ebbfe55eb54f56904821fd410987304956191d852a7d0af2074d0a7b57c75b3e8c547acd69214a86a1ff36660e408758ad24105b7ffd62bed5cbe987a460317efd2034c80186e0f503adb8184e1642d33f1eedaa6a027d0a5e9a26756d271250c40ccbae2dc91452cdd9ab17b9ef899709dddc1586ee79b1f9e6acace0a312fb147bdb85a19ecac32775f5e8bc180f24194c956e43a03d9c946598dd16cd551e82717bc58bd337f61d9f96a90d1476bff8d693b630de1cdec14afb595e73e9619cf9ea0d54fa7517bd402c45d3226bbec4994049d9bbd3f38191745fefc00a012ff53c74158cc42dddb0168d044b6864c962fc7b720d75d254f097ac392a94b2be148cfeb9a9c799cb2fc5ea8cb0d1f0df14d698deff1cf086d51f6ff627a68fed779a5ba3d8e018f9c513fa06071e3fc26fa037bfc92d109d6b0046f77b690fd479eb78248f2703a8f0b9e44cb52095dc01cbc59df30152e8d8bd22f5c7c12027c8fea34ee877a85346c684c41320ccff1457a53eceed7bf7e64c7097547f85eaa522c8314e9c8b5f549142b81f56278680106fb4704acc02d59514403f9f069eb361e02af4de43a70fa36f7c78b8a446c82f7cf7300ea476fbc13ddcd790585d9c91af0e38d2f2f993ca17c9dfad480ca0c0715aad3a2f0160eaf42824a1928e9c19b33999b1437144bcd44c54ba5705928c5e7272afd7f636ec309681c2f697c1d939c933a7dfe0df33fac0c36c838c943f997ae402b309f06403cb4fcdd8cdeffdf3be74d78bbffc3529b1c1cca4ed8acf0646723de3b50e0132f8607075e4373cb4444647ffde7b24f51ff244027064ca07053f613c8efa10bf959d1b4de505b08b2c9970fa2df4cb2c6321fe69021414392c384f67469f932160b4e6487c317971fce42cd7ce2856187474a9198157f5222a8e3433a0a3a32063153f837eb9cb380edcd9254a3f5ff9f3b0662e95caf3076664043440ea7964dcad7c2a0db3f0d8b0b6a808f1b01f8c1994b0b5f2ef5d318ceab9f63693eef8b290ca7f7ef29d458549cca0241fc607b7524a9ecad51620d9d025bc85ace9ceac257056253bfd46626d4d07c38c8fda41a7a396e8e472a933c04d3f9bf10ef0536769c4cc8f16210ebf6ab573e589ded721a3792ed871f132950082464bf3018fb2e207a752fb7f270487508e4259cc5ca7f193c32a28d45fb69aab962fd4bec61ea3557eab3ebb47704efc3512b1d8cfb27793ec15bc5103eaca5e8957309e11a7035d0e7e686333db48c541f872f5cd42ce78a6657406a371d21bcdc698893d63e0b10fa21daeb5017a7dcfed9efb67e4deb51516a8cf9f74d6d9b3ba63c08a2c941bbe03de3dac1b2d697b77db724b29534a294e0899087e08eb3d6ba49f1215d205718912686a7351b72e03d1aa55ab70b700c53c3ec33df4bb533e0299a7671808de1efa4b90875bb5bb7e3de3fc84daee5cf3a2f8c6b9098b827dea6f29d48e14f6703752704e53ce5b65a1088a5bd4feeb9abdf00ef7e0811ad97f1de01be73acea23dff4bdb2c7abb713d7cbed9e11b6efe4635dea9db318831c6e745f54c8ced826da27a46996767f4703de3a8cd386e833e984fb78331e6e1a9fe578ef67278153e535e790679dd41df12b5438c25215b94efdaa853fd972852a48e442229648ed4d18764b2a8a30ffd1435756a33f668aaea3206ae16ea22926c3796ae0237da692fa7940327da8985e8178b6c0d08d1684444630ea8079c0b0fae8ea43d500f3817d1f3e01a7a51e73d8ea43d100fb8efab735d49a8e32a2a03276a2b70dfb7420f6b887e4ad408457ba159a4bd100d3dd79ed30f666e2c215acae1220f8dacf69c772e9ead2112755c2f2cfc8b108d4622d1c56a95d1fb834622d148b4001d2ef45f64556fd5ad21fa197338d28b3e226995d0fbc79ead31eab8c624a1e7debf0811d7c9cf58a335b65a857bff6dbb11fad1675ce7c918d16fcfe588d4c523edf9873a0e701dd105b427eab6d2b8dad06bb1335a3ba30adce7b135c58fba35f4d9a635d44abaaf2bf7f188fb96742fe2aa55a06815d2fbc71b47c178ff98d32a8b619f17ef7ffd80137d6c6d8dae7e72522a71fd632fd6b5d32aa2d167a26e6b49077178de4a70a039bc2afa4cd471351b69a1d80a95deaba1df46c5d067cedcee250f6b09fd94a8a417755c6174cee327cffc5f74fde385f642f4a14ee4456ac8756ae8575ad47dceaa213e5243216e55d18f8eb4c7ccaafca1eee396882937da8d459479edf9e720aaa1d487d5d08752a1bf3696de42b1e5a8fe21558eda94ff9823fa95987e2f8aad21ae4aa2bed39e3fc8089ce849efad5629f97c72eaf6da4eff70d4c5f293d7121a5b170b04fa116555ff9e0227a22ea1173d897ea11ffd175b37422ffa2cd42580ebee8c514824eae08fba5127ea42a1efef2d01906e7ba19f2bde6d0d752cb3db01b7ee2bd1baafa47edeed801f6f7db148f59ffda3fa5fb1b523d6f8285b63abff02fc4b57aba46120f162ab5cedb0087e493f5d7fec7823c2e4134ba5e636c245659861c1892c4a5851a0df94a931d5baf8fd89d4147f52eda3a5544f09c2460b12393ad063c6899a276e8aac405d8f2119f6e1cf37fd6895bf1581d25ec9d66de58de3e1bee7760cc11b8b26b3ef8d0825aafc7c46bfaef23f1445624106aed704d81917d5c15e7bdedece11045f763fa4ec0cd902ee513c6e6140b0821584ec0733d8699a8cfb12b5af2feb6236163f01f7e01fe336c410f0fd23dc7c03436c857488ad4ed708ccfc990cdc1b18216c085b6699d270d46c5a6a0fa509eea341c39bb2c625ebbe3a5538d1c2dcc75ed77f2bc517448df4fbc1872bc507f7313b1a57f78316042703ee5b1d1c3e2744c11f2a842bc50f0b7df08e6bf9200a3a51a0a93a505481486d56bc3eeec7472a3ffc6dd6a9fc9fb61052edd2606b9a4cabc0ab5b768269da6b7eef180813dcc73995ffe39acacf39ce36cc36959f6b5a4508136995928713c298466dca35dfcd4bed352b3211850e84ecaea8eee650f77951bbfcb051f3e1764d9685a4163838383838383838383838383838383838383838383838383838383838383838520ba9050e0e0e0e0e0e0e0e0e0e0e0e0e0e0e4e5cb8bd4bbfdddd081b854b0c9fe194a5a6eecdcc2bd9b7f0cf64ddf76a6b5eaa9bdaf7b606739e756f476cfc8f57d53f5655874522ec7677d8edce6822bd86aceba27c1c171cbf032e23b09f4a60ef28252eac33b54c8c5e9da9453ef6f231babe7e6aba7ea2d34fcc71330ab21d9aaac65f944fead4ae90074cc3345c33a7974affd0e916813d62fdf4b026883ef57f13fec7fd7e5e0da2519fbfe827237b493f94fad1f8483f93fad1a8dddf744d32ba7efa503e5446fd368bda9fe918c1291184bae8a28b2e86e0bae388483f8f7e25a83a02daf8a9ff87a9657bd083e80bdca8f7f8a91f2605933a628f581c9dd64d3fada34c2dda671a5d530be8359894a3b2873f1da5bd465fb407d1de5a409fd197ec4174fd04e18f98daffde538de0d4e7777300a736eaf96957fcb4af75a696391f269575a616ec3fffa12f9fc71e26957db21ea9aafd5fa48935b5618e9fdef3d3ee7b8fa33cc74ffd73725ca9f45f533fa6c97114e45ca794e339abda9f93e3a84de970ac1c58e3a72470df862a788ff7d47e5884e3cf78971de4a61bf2f9a9692b4c752570cfd5bde1228afa713175a3b80192fe880de1fa46a5aa6d85ce0f54524736080c4cd881144ca831022f1c708e62157b1584c000d4bda902096a56f7860a34defc06f8d07719bbe17677392774b233f661ead6dd00b0838949871c4a30707851421a89b81068d3b20f362f19a1f7c63b2388ff4a3bdd2518a6bb77dcdd5bfaedc77df85f8cfb71df25ba3b6c6f9144216410d3de56b8104208217c28639491210f94524a39a780f3e3f7bffc2f46fed8007e97e849b8667fb92af13fe6fed91e8f2e38bf3f8490e91e01f20c4f8edbfea35121012a3c55d8553873d81ad7af0461450915818d7e27f52b952a76d11c3bc31f0ee1f8bf5d41086119aa7f9430880a79069ac1a77429c824196f2cd90ec131468e4cb7e9742cf46751db8a80111ac13f4884bf8c31ba40c88cc306979cd6e1cc714ebe628c120b6845c78e31c2967072bdbc735e61a093eb929ffc4b9c0a8e17ce667e8394394a553edc28a50c026509062172259123f3c8b629a763638cf4e3016b8c61e0627cd82a33fe56086384d1b1e0384618210f48040260851506d92e71bd6c820d68aafcc8913fca182347c9cc45ae55e417ffe746c4f5f2afed46fcf8d9fc6b639972b64ba41cec31702525178e8910aaa3eb005202d7dfce3f32970f3bc91d476666cac5527b015c897bae0a59ae37759fe94f9ee93fabf2f05f335064710ff74416f744968e0e7cee813a702646057f88afec5004dce3285802a88235e81918838e812b68150c41cb99f8854541158c8958c099a805fc1193481f9f8ca95206fe0755a556f94ebed45ed4e80905dd80539d745c6746241d9d93139d93939393131daa7385134affa4eb48318b56ab4024279d43d15e7cdaf94d7b913ed33fe95cbaff52c9cd1654a492af0bc07f39c410c07f58e5ff62dd872a4709803aab540a00a78a415940f811ee21fed7d5d743796739eada130acac71e94ffbc15aa28287e6488af3c781bd68bdfc5fa1106827b62d0b382569780a74636ec8cf89f77a14620900804c1a2b8c74ff155268861418d3dc3447da2a2f0f01f14c2c3a3fcc73d25d90ba8822ad843bb2800fe8bacab54d2d17f3772f96895eee35f3f1c15e3617c64b5caf590c775fe29fd66fc189d43d1a7f8289de7b4179f87ce8b8c34ce59a512df7196a3982723c59dc85335fab052fa29514fbace6dda2bc9c4b417ffeaba477bb1e7e937e3635b02ae7a425d8af62254b5caf591e5a7f8a33ff96fd651c993de59f1847e339a3c00ba8b46d69bfc1759911559b2878c6915938f2f6572c8e17773803d600c2bfee4fc23cb8442557b11f41f54452c78302cb25ae5f3f1e34ee4c1e69b4c3bb8c43d353e8ceed370e8bed28b6ec755bfdf01bf92fa4556c908aa6afce717518e46e6405c09d6c10e5e37df433c71248b233b75572b1e0664dc5ac86876ee822bd5d92a5df9485dfed9947d55f76db4e7ee0e27079de0b25dd8eca00fa6c29db1ddee1ebba875d1a196c4e6284529af6b72185fa00fa66aeb1036471016846c1b5e4b136938128934912656011d0891d5138d8a33445a059b44be920824d2c41f0ea455aeda11489ffa85b0301a69dca6bda6f127224da4893491c689449acf89d4c41dd4fe0824d2449a0824d6c04b755191b519382c0b3a513461849750858c031c3fe45028f870df247f7bc4cc54cc4c5df3b18e0434525734498ae3faad2d5c6a4a497584765eddfaa9fb6243234c8142f1fe7e26bb9899921fbb9656a596a8cb0158e39b6e304d8db0854bc92f46aa2354210d2261585565b77e6230648b02e533e5655e5e66e9ebeeeeecdcf92fb6fbcc7fed80bb7ebb1cdc5327849a067874e0a555f8f759d5a8cf2fc7a34fcd030e2ed6f1981a00c269edb5e61838d6e163d58b06ba0eb4c7a3bdfe2170dccf8a42c8fce1e5ee94e17fee8bb205b7ef5370fbecf4c2a458972b07e4144e0e16077f73944008739454a6820b443c0341e2e7d89d1a64df0b33756fba30c3aa7be3051a964a54fbab70a20a2295b708b0045a955aaa827f0477918a5405a9e9084ec1e714a42f438cd894124bec4e0a3e3fe42318c74ee534648bf2b1f8af5397dd72c07d1ca795b84b1f7f26d09b3782ba9320a3ee0d153495e3a1a20602a87b83859eaad5bdc1c211362401814020100804e222c48946516b4ffb51c7b5a7c1f6b4adfb600d51d0a68d52703df37ffae3e789b894c8186587e4c1d533d8f967dd29fd2b3e272c9538aee3dc19f1611bb8ebb96a17d81a577f3c2995386eb14f69154e143fe33aadbded451dd7de06dbdb403f5bee0cf61d5c43f3c3ea46354d66177f5f2eadc3f51f733fc7bf3a18791d24bf99170cdc87bb4f73738380dba1af6c0daf7e61179cd8bcba739951c32636e763df0f27b6c240708d715e135e1f4c951b8bb8801042082184d07b4f060d94a9793945a8a802e503b17274562c9e558ea34aa59c524e29a7946352fa41064aa934a71199d50ae302ebd1e19242a984f5f0e41c59b172b01e276e3e3b31427432243fa0d0583d6a8ab4403eb6463b81fb4a2b1b1b1b1b1bac27a6e6e4ac725639ab9c55cecac65170b5b259d9ac6c5636475648b2d859ad38ae84f5e4e4144192a3c33505eec3726a633dadf2816cbe124fceea082ba71404123d6a8a70cb874d1f5101c9f12c66b6c6135ba357abd56ab5c2b8c0daa0c292603d46b09ed5ea488f558ca34a2b47613da59a124de9476906eb59613d2bac6785f5acb09e9549e987124ae917ebc17a5a05088885c310d82accd06f6ab3da6d5871b1e046e0d859bed32866b9b3b4fa392b67ea306bb29156b9a691234ea74e4f81634aa14e9411ce30645b002e7e314697f81046f992bac478c52bc6ef08b93bf237851fb963d9e908d56d67f0c7eeeb4c44f4c78fd445f2c5cc33bafba48bec973c5dc0eddc1a5da18cd2635f4296351e3da91b9148bfd223128934129148a2d188442291482412e947221824926844229148a4116934228d48224d6e43447f128944223dac24128944229144a4d1c8bf089168341a8948a39168441a9146a46efea8e447249188f42fdebf08d28b1722d10bd28b3e7b2112bd10959044a4118944fa4c23914824d2f3c642720d76a40f755fd7d0c7553cd22aa3ae149ffb95ce5c0b75301e76dcef46fa952e29897018bd8031eab6be80f1bcbd8031fa6c242291482212694422bd78585f94fca8e35ac281241a71c9e84b5e885ed0d86acf5f34a22ea41ba41f91442311fd340a5f348c28b2a5c013fb50ae5c29a174d010286b6c0d7781af2354e5c3ab0877d711413be078d5def276471b645b006e09d047286afcad487d568deb977e5bdc7efbec8a40c5bebb1dcd83ebf55176d767f2bf87533e6c807c173857e2d680ae4afa8ed5f8a14ffc39e7dcf75fe919a1ae737835d4a1ecb3d7fe03815a5cf6a0df770165204f0241f46208066edbb6997f6b788d32db87de20e0b86b2130454eb5a95bb76241480476358123ed8180705370f1bfaf2bad626a7f216cb4ca57ffa5c01358c69acc36cbb4ee6a60ff356c71bf33ae5ff1fe6c0900fd7cb8fd4a4b1770fb8f021bb42d00a67280ebe7b36b6783a6a675fd59f735f4791e0cfaeb65e702d211aad783ba8f8b883fe7c72efefc95c636aa83eb473352f9e3c74816cfed547f9446716a87eabfd22a7b6324a7fa0bd1284e456d65eb8f5d7c9456f9b09f2ed8c777195b03beff8cad71bd8ef9986f455c1f5f0a134851e35fd7ef76e3faf891035c25d566ab70e418ab93031f82a68d344ee36088540843448b2f1a7d5ed4b9681a0c91fe855c890ee94730fdd424bafe05aeffcbb13a0fe371f8fe92a35e7c7fa983d1e1d0715d0986c8c2c9414dc2885a63225b1f387fe9c292414ae0e67317f5bb1efbde583049bf79511d2efe37e47f9206f92c3104fe9018638c1f9d0619fc8ccb3e22c84151966dd9cb6cdbb29759c69ffe64d9e7977b17ecf3f97c324dd334ee3faf71bf35c451f89fcfe3d074b87cbe204b0c19a2fde7b74c4ab9659c652c7f2be84b9f6d12d45ba6759f4eeb4abaf89f0c7e3e9f4f0761a761b40408376b4a752e078e8398ea32ee3d73a99c0b9c94d84a9a8163a4d4643e6f901d6897d1a5e72855ffeb356f7f67f1470256f9beb2e14154bff921c5f3289f255649a5945f8ed2b5cd746735d886fbb2fb60490a285ba375002d815b9dfac110a95f8ed52989403ebf366117e937bdfb3ea0aaae510a9b7366c000e4a34148bf4faba0ff3c146d0dc8eab6b17c40bfd21fd08bba0faef40d8d7e5cb56f3ef7b0fb809e631808d183b0d06fbfd14c147f6e447ceab6fdf51908746d2c20102ded87b6078168fc70ddbacfaff8a77d3696c9cccf32e058867e30bc45186249452602f9d7aebca494bfbb527a53adbd8dcd5b64fc3ab414b87eed7b319620da73c710f6c6223f9fcf0fb1f5434dd9bb50501238d38dcfc7ffd0cdde1fa672f76995eb7e13a6ce2e87562fee5c83a7fe74533179ce79c19d9d13c49c6067e30ddc0a5c333333bba7f8c0d07d3033337312df0861844eab9889b33df8d2af60f2f1888e611f186cb7f5817b887fd1e51e30acfb52aa8c3146895d7c75f3bf59d23847a9907a6c4106179ba9ad75b74ccff44ced9b9e29833639194da66a50683262c85aa67e3cae122c719bcc36b3a9609bd966ea76b3cd6c335b6450ab3452e013363644b0b12143361b353f2efee9835968b6caf28ecc22dba9d14405db3123b55ff64308a574e952f63b738d73b74708fd61e7105bd54f4cdd58206cd861abf6a0435e07b9bc22c7ee602bcc084605b6c2562dc8e0166414dcfe5e2234d0e8d0b0610544b8020b76c10b2c19c86031515243136728430f5c108426582ce041cfb44caba0677a2687262373829813c8c87cb0f20521dbc0f6e7ae9f68feae8bbbecd0bb79b7ce44f9104e18618c127e77feb03f76bf7c9be59f5a6b321f0c73c32766fc636d23c4f7241c6f163932775f4af539b15d9b3977e7daec730ff3630717ee43b6d98d0b532faeeb4960186ea290df9d9451ca1d1965f34e6d1ff192dd52ee5c97bce4755d72e792573c4194513aefb4e7b25b76618706394a4eb063042378081c04d1db796369f7d6fc8a31f2d67defa2e97ab6a9cc53573a934f5cde1bbbbbfb252fe9d23bf9170da7fe59dc58fcbb9b6de215635f9208dc437675f00b35ac266ad6dac55573bf2264faedede409031d1a1e7099083649e0becd69820e77c17d5e85bfd56b95eeea55196dc21aaae4a7fe7e03f7791f0c4f460a8cadb113ba5fa113052aa88a2089eea3ba14b10335ca182384d007f711dd4784910cb9e86ad25e3f770db8cfe4f9bf1c28fd2926ad52e2c346d8452470dfae98f610b8efab1018e3c3d40cfb64da56ca3ebb71d864100cc218e0cbe7e646843ffc6b23e2033556e8120ac218384e32b6dd88917e710ba5e5d8e68a5d0fbeb8bbcd15d06152601559733bdc352995607309c7dd809a6bde9e5d1a5c943e350bd3df01077f2ef4de5dc640bb3360904b67070060add9aaf153ac297dcb145b262828b185d20d31892d13131313cca4634bfee8eeee1a21518b456920269120902630e95a038eea2eb57aba914015eca19adcd6581393ff221726b165f29f94e1e1a316ddc796345f4c02824f9a4002913f6a944ef0606262d299989898c49ed88a487a0ba85a9dd832e18107ca6a95c6315b263b00e07118f18055b9504a6294cc9292bfe48c8162f2c138aed4ea1a24ad72d5d67c93ee3379f959067b683006aaa04ac6c819f923722165a40fa9923d6cd8d84e2e095597cac64c88135114cacd171fb96895095b97e4e16d0891713d624c4e442d64d444baa66b3a0bcee4e473781d503168604dab649b13354220706645d9e8645e73ceffff626bce496d0821290f7127ee0d90abc651281fbf3591f4742f3f46e73d2193931b1b42b490ae7154fff8d1351c921e93f64e78785879a09f12f5a29df3b497459f60fcb72d286cda7ba27f38aa6bbafe715147d23532b2a28c3bfc772b26d3a4b1b5c39f7c6cf9f8d12a3b38512a957eb7f4b03369ef8496008043a7b5430eaf4392adc7c4a4db6aeab6ea9043a7d5b45a1729fee883434747077533e79c73ce4be7a44f2468245a6869a147165a528b9b1a3fcb46accb515ffac862287560edaa8cfe6bd37fb2eea72ea8eea82e0e3ad47d66aedbe32801c4f8d297f0935e001def49b43b833fa91a8261e2c6523232d1f8b147aa648f8c7bae8b7b988beb61c73d57c997947c2c3d736445d6d6e01a9394c4e87a0c89f159a91b7db6a693d569a711c4deac149bb345fc8794f6302c0884dee7c3c305997afde8334d8b3107ee5cb308d48146e00a1e81ac9923c5cdb6c1eb1a5d3f8297d49887c73bc2451dbde9e5e57263b946ddaee984762418a3db35c0177d54d80509c0c7e8623e1580cfa416dcb737cc2bcc1754197dfc68c5aa98fee4bf8805fd2f96a1fb2f6a41fa2faaa1c698a4a4a45252faf82393aaf29fd0188f14672a7f00ba8b724b4bbec474db63109f3c07601dbd8e501d99fedb8b3f7a13e500d713fac1bfa88cf6bc1145692f6a5a4403976d1a43b86d2c90e1c30af969f771a5f0daee773bae76bfdb3decb8f6e2d42e11007e6fb8e0c4c73dcefa98e79b25aed32a74a569b715005d497bff1df3704f89d6702a91d7bbded4c1f5f84fbab91e3fedb4f5f8bb8e5b8f9fd495acc71fa32b495ef93e6a0c1243d50d55500555188641132ac2933779de5876f867204e3e3edd1afcf1795815fa71d6175c7d51aa2f7ef7c5d3936eb707f85717802e46074f3a10124c1de402b7930b42304164a567caa78012ca20c0f777223e005d52580df137d2b79938d121dc485d9a0a1cbff7ee429a837bd4c06708d2bbddbbbb1d6c0f42da4050be097fbbee3b0f030169b4611fc3d6601a8fb033fcbd08e7a9a952e5dcd060c5c420e1ef282ca667b0ae91887114b79ce5ac5289e3660df771ab5b8ec21ee6744fa7b016ccf93cac933d7ef2bf5a8eba54df5fadeb6ae9f0459bea525c578d17e1a20d037169b13df8fbc7236c8d2b0d3bc3df5b3be30c9cec71947b89f9a3eca90ea93fb77c9950bfaf49c24fdca9c99a4f704ffc3ee6854c3d89b39b6ec0aaaacc5aabec8043034f850f51c0f57f5fdae8eeb03339a0fd254dc24fcc3da9e69e3a13e5bce4e7023dc698853967838260d85c438cf4ba8848c018a2112f82f2f94d128eba58fca3f26bc051dcf694549579a632dd229c8908ea02dbdb9b56f13f5277c0ba03caeab46bb43027c73f6affd5752a935a128ef214ffe8a7a1a9a92152bbdda67667b2658382ccd4a42f4ba42eea337eeaa951004c7529fd26de60593d76c650bf4f523f1958d48fc6156ea8f55b2978eab73a3c24a8dfaeaa17c006333c4d38210a417090f22bae40c3b55d5491831d2ce10636986295f24f71d40198800522ac1854710234a4fc6d380a035ac0420a6f48c285234a48f9b2bcba375744e10a9b19c44b07c9dd94827b17f89221847ec50e42b83b6085bde3402022447b372c242a30e3440e1d2e92701f11a8693972fdfcfd6e729e05676301add23488f63c8fc60f8f42840dcdc58f36703426b03fb6c6d69beeee1b1a2b6ea3bdb99a70065e819bb9bd3b8661b80e23f4aacd6cc1bbfb2bb73663c58523d2f5121a2364fcdd9f57bb467e538cb0bbbbbbbbbbfb23e4feeeefee8d8577066f3788e9a2b41744fe3b4a528e4d7e6aac0422a8960e7286b8f5ba2e79c98e736a4840798e2b95febddd1b1b2b7e7226384f46ab343569cf4be00c14c29cb01d093b9891e1a13893fef5187edc97cc5f0ed8cd3599fff0ae83a38555ad22338108788fea70e587105e04879ffc71f480d368e84cc782fb68300d723595d19ea32e5af28a5242c3868c48ddcfba8705b4b7fd485460773fc7ee27b1acaacb3eea368e56d99a96dd2375998820d7af38eaa2291d447bfb5346abbc1545a85fa96ea86e143760435deac244ae7632c8c80cb770a2eecd16327500756fd4e0853ab52d5a5be8d40c6ad716b518b3eb62c056783160ab8c733edc1a2ba194df3f3bfee49a3157d38daefd1cb0004cddbad20d907fdd8851635d148732d916375b0881f0e17ff167f4818b91b3abc37ea2d4ebf3b18b117f88f86909e0ffe05f0fb704347cf9572402a54a94ca907a113817fea6afb090e131c2d35a09a9020a4ea4cacf4c38b2354dfa6282ff9f7f99afbd119b2abd70fe30a94ff1d357f9da636fc4a630faa2a57c5ce8bf9498da94f6d2041f879fe40e233665437e466152ffd1a97252534bf6f333aaba3efb498764209a9a9a2430fff32dd86fdfbfd197214d5be67fe80ba7e6b737919a6ee0b8a809c7f5a696ec9f53beb1c0efcd019bca5e87671dc7f8493e2cc2394d95ff4ee32813fccc6b1cf579d01fb17d4695c89418d292fd067a25b6ff5053ffa63ebf2950974407b38eb70eb427b19fda87be7b64bf7d8fcf83de043ff43029add3b487af85e80b8832113fc9fffccb46d74f59d6d198e06b0f93aa31416a7240f69f6fc9fef33204d296cf6bf465a6caff5056f949fecbfa69539f0ef84932e576067cd1ce808fcdfd6f7b9c485d1e96c060b8b12e643b74701755d5cf57176f50d5ab0aeef3a69fb606a8c64f597114f632ce6f3a7538ed4d4e4d4e5f86b8a4dff2386dc990f0533f679d691fa463da076df62d9fcf7e3fcb1e445f52fc14ff65fdf4a131f3769476c67f3e5b3fb14633fae94c2dd97f3ea39f4eee97e6c7616b44a72e9ae2a79d30dd71c88c43f837fbac9f64cfd4f9d75758647ed699e4c3a4bac74d92e2e8d13c7e9a0f9352d5f91f1c709bfa7cc94ff387b4f4632dd87fe8cbf4d37cac69f3fca6e6836eb84d3535b560df8f7dffa64c927aedcddf5a43a83802126654aa548a9fe6e7b5410bf5e3eaa86e1438a041fd9aa77bfc349ba7ce38e367c8aecf3ab5af4dceb96d2cc551f3d371ead3615d3cc26d35e1e8d1cf2faa5c4df15fb4ff7ca42dd84be62c387af4f8bc466f6a0fec33bae2a7ebb1eed3a598e2670f937ab9fe434d919a1cf079ec5b3e8f7d7c8cbe0c89b405fb0ca39c9fae7fb9feda14c68263fae94ab910386e67c417ed8c38fd143fc270fb150c845499bc967d543effcdc7b2d969f3b5a9b1c6f49bda639af69af69fee83997163d11ac03f7fa5b1cfb40ed60cbbb0bfb05fe95ded319a5d0f7b63b976bb312bd09e34e1987e928fa33df95b9d08970445a23df9d10a5cffb7ac6d4517ec9752b7a555b4f5fab93df5afe7a8943df5afacdb58008e56991b3bb85edfd44f0395218454c74b6538866cc73e8f59f9a6c6e7ce44c4fef55dbdebca302c3bd1a8e9a7c8406a2cf929fe9c1c575a957655dad5ae56c6671a4731903ec54742c8e46689fb92f7295efd4a5f4afd4afca3c6ff68d4af5463c9bd141a3711f05374221cdb3091f6a215b8c837918acd22090b8ca40008415e502306213c21c60a16d44f136086b821890c7c9821045604b1220d3135caa4a21544b874a87bc363534b756fc2d0831e3b4c10c21590482c3026a0010d2128e121020f0d2aa9ee0d0f0a9ae005261c108434b05c5005153cc105613002c6bf25beffbed397214b5bfc217d81ffe20f2393390afbfd4c467bfe5eddd4dc54b62e2a69cf247f9b208323159a244d40139ad0a9f15784e0a2fa6be0a5517e7363c54ef594239efab84e7dcbaa3da04aa67ecbd36363a9542a556ac8de884148fd1689104d00e984f8014527c48f9bf6b6d268951f5a65c150fd0bf50ba27a132bcd29ac9b5d07b928e727f7d46e26ed39abbd9d81ed53641cffd7ef51a67df89be2b7e128d3529303e2cb3fc21f5225e0fb4baac49016f82e5f09ff484dfb9b8abfa919bb1aeeb7ba376f78426dfa7151e0a005157a77a7209b0f43249eeca8c48cd675492d19a211110000008315002028100a078422b1603c0f967e14800c8ba24e624c1688a3208751180431c618638c210001030c01326434330a002cdca3028ca454a5406ce9777760ab5ebedc30810a561a165ce384685c5fb13399262e87c91ca87e3c2c7df2f613344a82966d26bf6eebae4dfafbb736ad045abb960f1aa6197139419ab9999a0706bc0cdff94b70791574bbf614e759d1043f31885e58be9526becdcddce70d9aa767d1be9eb2fc3a1fb893db19b0cdcecc9ed6d38bfb1bf3eaa1f713d08693d69952dee28cd202efa4a9792c32b8e0b20bec960426c3d2a29fbfed7c59adb411e2a42e2c1ef3f1724b596d7fd3074623e739f4eff5da143e890c16d54f899b753c80036caa52e2a620dbc9349ea0223e7236ea603f5ff3185b737d5009410972a2bcd13b0215e4a4596c6acb628b23c3b10526c8644690190b2fe00b83f62d4a99d3d8c36e06b8bebfae572fae066eed786d3c27cd63ae68353bbc57e8aa8befb95d73d984aba37a6c31dc19ca94fb014704e6f774539cba653821427ea2d4ccc13ecafcc6f85e03c254c514612714499bf58b276e0d90a0e55c9db8329151af5b7c7b31959ed5f418c24daa8331ee2926abd20a43a424e87a65aeb1e13dd231d8d92489e1707723448007c2d2649d231f0cc16f84faa4bbf1a9c207b0ca50daf22a805527128685489e8709b9094f56e01b354514b6550f361c81d64b21fe2094bce6c83c7c4b21ee8726b909dc8d23c4281f191da64b04aeaee4b504ca5704b3fb5aeec214cae2d2e1bd1811942895ebcf9ec8a354fbf747efe81679abf85889c7200bb3505e636082aa8a6f773a1ff661c30c52b8db9dd9c9da991342db7a0eb2fb0ec9ae7ce96ef84cccf5ed65e51f15b2cccaa099ac801891e41520dc2dd65e7971aee3a40358607260dd8c0c8be7bf13e48743ead76c863d1d62cd3ce4c0064ddd31281874361ff48f880eda869fc439206ef314f578cd215620e9319ec85e84bd6c8e6d2437cc82f1702b16a1ae26a0dc4efcac66b66a475970412a7e144d5a7a632f7006bea8ee92611c19024634fc55214a1ebae2b21446fed34c9c908c2a23493150f675a73b31250af0a170e1225f4329a0f31bda78bf37fdd31bf5f475bfcae406970529f7c838c7692d9e16401f526627b5f6f84ab0c189aa3611d31fb0e61d4039171a0661cdd77489e31396f973b59f75f6e18699af11e573eb2d0d243d020d7c7b2256a3cbd94212429d96535018372bf65a1c423dde625de5e6f8d9ba483ef5f83b46a1ed9569e3f4112ccb3c56740e2cb388640027a44de504a34c8ca71786d47d6ab66450c669ba7952a2d503b18389704b90a51dee7b3cdea358f4d0597dc04f980be9389abaa4c5c7923c9e90770b918ace7df80020c5151caaa7d7add720a27f3647cb6ad9aa81bde715a49e2a85e80f146f364331f9818ea4e914fbc8d073d1bf2bbc11dcfb10f20f82438425cdfb07e4b7ea704967d1609ae7a63ae5df9ad1a0a6246f8c133b9d984016ef997d62b54841558889e9eacf87c1bc3bdc256045ca3288091363b3dd7b299ba3427bf1a21f3a7806724c2ebbd4206d40b7146d0463c11b481a1a629a8e968ca89a857ab055564c29160bd275623db0b72932c45c25c5eb0eb4b29800a97333d8b00061addd613a0a35b391973a3c2d27de2e72688cc260a4313e4c2f62293e5b6bdbf27dbffb960918c9d4248dbc234c108187c0c1c32e157ef6268ecf068f74493c0d7d30b1eec33b0a1448a75958b9765ed6ff156fdd8cd604ec06f2c00b6ec1f23cc7f2aef524c13ca3c9a69f9c0ed1a39137d91501163c703c99687dec070ae04fcc9f6df92a5f760a60a3754610afc559d094600b0b9027888e8067a98e8767a00d4a39726321d8f30482f7e5cf32a26cc3d0648e89a8ee7f30c4a5ef0355084ee724a1883611408d35daebd733a10b4a4ae21c47e5f8d1870e36968fa06cf128f674aaa3b3197991b38ffe840b5430e898d74170992b4bda4892288c4b2ccc10d10a411b56887e207d686902dfdfdcd0b84bf40fcf82df179d106cec0decb32f4816d2403b5848c6d99d1dca45ce35ecd505867e8ae9ac62d2ebfcdce70e9b4b9f3f8e631347759135a442eac3770056da4c2cb3a595a2ab81e8a44f6fbf5179c6fbe24d35dcb729c2714fd704caa8efab69c2a782d9a56287e7994b62fddf90b066ca4f81b722c493f9d2cf647ca0c9e364c601c7afe882bc3deb2b7841d51a62d12f8574a828038567fe2bd4e3c970d7804b270383960eed445a5191cce09c421612c685c3b2988803c368c795a2590d9c5541f4c3299ab5d5aa3123835c0117ee374121dca8cac9556eff0c77623abe68c9d5212e88eb252ba5f788568ca5f6658c53cf84820ea04ba88440ab841ca2d9e4a01ef1f8c4e305fd82ec6ad4c8dd4fe5ee938407eaf4943ec37a5d24eff552fdf65a1b7a072e3b8197e0935c8f14d8ba9d6ca077803e5d499ab0f39ff14174cd7a183d2da95092fc0cdd3e22b31870c3765340584dc5f0065a177cc75144b40591fc6fc0e0ea3de14b4c35e848df8d9cf9db41d7fbf3a4735117a554927f812a90ee6079cbdf49554825f9528160445dcd25e2abf5b1191bf0492785065ba2b6d25e8dd6dd060895f1ef536dbec55b7ab50585ea3f032ac4a0914608ba170a3d7715b33183a16c4f2985d40a7a911620fcad4a067d88b37a660d158f72aecf5d4f94619828af95b3ffde2d10ead3aa224ad5ee8f08613423e7fd6a7d7c0c3e232dffb7369f0ff24b7360b7279c8172c02a436e83c66443df3140e1095845f1e82740e388eaa851b7a8042fee8f46ce995119807b6adaa980b61753dc81f22b27f240153ed2b91a07bc14c32af15df46c034314b85685f3d18f86711a811074099f866a21ff40b496d36080a48cd38bf7146d9c2f1ab9381ca903e0c893052a13b21fd7e9adb2b09846472f992aba2ea28a017e060e64e4f9d4e006867ddd7303f1d93affddc03e441c77cc6165bb6ca0c1bf0f4e6730b96265178ae2a5c9a9921e8462fd6d54bf35108b8292b12a541216c4ac01aff24e6026fd8f8493be52acd4f46c81dfc0e914f1a76574b8180b41d667e6e68579859b9f23931b645430b1859fa10aa852e757729919132dd37ca9a108a8d5de92bda146e8d53c4f5d5e121b5e6a6a149b20c62027d8cd684ea0f185d4c6122bf9ecfc07df3d07c553997fe1485374f7e15e95a6f0f94f3307a287edc2365dd17ce187711f7894a41a1f2a9055e091a67231fd03c1861d8a8dee0507fd08c4dc6d9918572d7f251f9e4c44c173fbea547b96913c812b788a4d3d50048a5684ba7d0c50f423fa266a6de476a690665bc5fce28e3705d4ae35b387e6d18b614016188a355ba3d2f7fa3a42274810b6fc8938d0020b5b7e06435c4af2b65b63273f2692dc285f895d20c53e0ac1e568b07039a3ae5e1ef72079da3c9bc4b91ef7bb1c723736ae32e075fd7976282227b0e02e98c4363055e7a6c84db11af6ac7b741ba7387e0370ccf07bdadc347eb59d044e3d5d2215fd06969a29a4c39620270db8959f76e02f094fb7e0220d859b20aff12256fd549ead3288a68d5213470c1e9605f295d42b396a8eb6fecbebe16b6e79ed408d90530330fd526e422777196c4e4c739697a33bdd0afa088de108679ef90172baa65c7339d2bf6d7d9e4afdd14669942bb865018946b15c806f20f0028367a8662000e7dc22f1729167a68626a183027c939e7f355bb45a3435c11f8796aaabb59782c29c530b89a4037d2530b8416789fedec275612cd244b2a36c4b8f2efc02f61fab14c68123452c4fb5b208ad3875f34a2a7cc3ecc24987a8ecd30737a3af5fa387d1a91ef5198c68f7848736d30c2901fadd421ec7035ebe8866c8747a32ad2d696540d0926b7ad1bb7ee4580edc4c55d13e9bf9221a04192a8d6cada10db17d9eea029ca8d5ca57c058b926a9a5ff77f9778025785889ace213b75effcef162c0596f11db8f9e8bf71c2e1856c17d927f288ec8234767a937d66e0093e6f19028c21788396eb81d1889079b4ddcaca254614c85bc007ee888c47cbab5173ca3ea292716633c8ceb13832240c645cac81d341e177a538546c016d8ca1831d23fa78be6c251e78a2d68a96cf16c251e0a4fe7a26ec42e681c2f8b696b2b6fb7f4dae377bd6ce90c62e8d8a796357e9cb037dc0a87eb877be7399b034fac59ba9364ca2da065dc32dc4fea54e89642f3244366e89f1c1f4ba5b63472be3e710d1b6be3ab46cec50c0fe6621e5bbe705aa2c37e20cce8fdf2bc47c5a0d0728f21ee88cf34c9d80f86a18b83cdd4bf76416ba4c673bc0fdd5417add731d869ada93a5e4a527881b1f00473cbaf35867061bef61de38d762c028fc9ac5f3480be360000a36538dc9573c1f5a837501073b790c3b601e70e53ed661b2b44834daad3ff9d97c5a0fbad882ddb7ce44690e9edc2a510ff71700b59334cc816b4f7eb34c73eb26dd0258a0d4c4f0a341584e6eed8988d98b374b77b9f210e2a68b5454cb1b2073b36327059e6aa37a8eae1f29d1f857246e8ef862a12258b52c3e3790e504c324ee8465bd9928586f25a0f690b275b4ecf0fedf9139f4b507e3de3d71f4afb40f824a43aa6c779c08a0cf2eaf3078ce982c39477d29e86801603a4bd6b1c6d5db10edbf143acfe63267afa65829e4a4c0e71bbdd63276b41743efaa8ea3d92f1bfb42bf228f13209d334c848e08c26381c0442122f15272f3c6eaecc38205c0c5a3288ed98c15ba08c9dbb99a95df0953d574cb3ac183d96b0c8c34d5417214c1e512806f81a82f1970d6c761838a69c7a460e85609e3702e07c796e3a91eb40864c48f8b2cbb55a6542c05a697b9b6e42253c5d2d1f6264a89b84a60a02bb92cf7a17a0c661306015c373dd3be15bc3d031c4c53db153c4214269ca63d00810aa7f3f17fc063f00df07c9550b268925eb45722b7be3dcae5f051d34eac088c0f8c6e30c17c19ebc0b60f72e24625032e960e5c819482c3f969e07547bfb91df667eff84c5c4d71409f59f1a6cce3e6f3aec87c8f9eb313aa698858d0ea6049a1907ece15a6b272ebda91ff5da7f60e5faf91747d2aab3f933d449e40c07a0fe8a50d767103df46f16b964a93f5e6d84d540715c0b3a969c74ac4bbe31cd8b408914aa1a6a7eff44fd73b850de5aa1a75a7081294e9d9d0212a710c5b0c1896c717ad13f95989de893f682fdab997bbc1a79508239ee3fc022babdb6e7fc252930199e13fc5326ce73c4f554e0e82e1765c0a6880d275660162ae3df453617b28eb1ecaa059d825a0a7a769e785c043c8cb72083dbafdb8e4073093c528e5b24a0b93ec823ebf0abb4c25cebe910cc1c55b9a78c3ab5eb3b7593a077b436aee3e77de16361a4248a2e43128ae396659bef42127d2cd363dd18c33ad891a05e04b0656c9b97ec602cfcb861a5abb87c6cd765591399f9603bf88ab20438d610a0b3096cb82626c75dd6e35e96205d8d2ed16fb3b2321a367d2e84b045817b2c7f70d1b7caabd32661fed0e14cf307986838dfe6f8ed5ba6cbbf96ce0988870b7e2a8b806783a26bc955b11317c8e8e6930e13847e1a4e89ce5c34073c15ce3a57fdb04082cb30dafb177dc62c5390c9169f7735d731069030d587e28f0b97939935b93e7188775d9baebc21f5cc071345ba5aec80927e634d1588289fdd8503714bd3fd702e5ff2c7a7ab92b129f7168f8a289857dae9143e914e36173c730cb7bcbd20c826b1c88c9ce058a21247f75a3da7dc10b2176b673bddd0d2152b31b003b6e20f65d3ef2536cb54f33c79dc74d116374a0dfde884ccbbdbf6209e25c19dc5e9f1a210f2e1f49a99cbca4a3ab8ff9b960e89b3dc89c69c3977d921237caeb5c54b2e976199cb86c071d9d292e9f1971ee7d6f756e74cb2b5bc4d5fd0e89d22080b247a8cc74d68e71d9b06688a2fa5510377650143efe49ff7b7d6077eed54d10620d03f9582bc2db9d6c90b2a8591c05b1f7ef130ea0be13445c9c87c5f51066334ae281d99f13864d75b572f9744a61ba712087dca3764210d0ec7c7d4eb30d7f110a8e9b6d9afe12e0b5765dd8203dbda561d26c7d6509a304aa61a2ac8a1b4884849946336d1839dee4827cb9c90b7b1d7caf342bfe5576193484f47928e403398b3b31b07557b8c9a694647c740860a67f712d84bc451f8d562dce695ac17de699f2fbaf52d0e53bd9479b867b72411ec0a0d90fd1b92aefff39f181514e25770bc40707203e17a24d083a0cad0f6f8d5cf8d0bddca38fc1b7b547d43635e36f3280287c818bc984f0a9ad82cee04939fe973ac5bc62c6320ae4762c6d4bb067c15e97afc748d8e46ce889f662f1a1ccdcf5a4fc4955df8e92dbfc6f5b830820eaa0b24ad786770e88babee0ddaf0708d5020d488ea3e827f30518b1a6fc9356187eed9c107e2c2096ad7bf46f412f09c172f926480541bcd64458e9c00d21593b5ec624441cb7137f9a5e14a7e0e9b53efafbaddb65e7b47784170e3f20d9ad3702302b0af356b8790da6f21f1d8383aa7070675c342589671ac9cc631dbe859ca1167f90e7b82651cd703a0ea8b88fd7e62d3289b5b5780ed4651c4630a53dfb9559c011e852b25f98dd84250c8cda511922237868bf5baa4e4b9561f839ef34c9639289807749ff0e58c98d40f4a5a7c23a90a70dc6de53e56aac756834cf9578102017c035b64f23470be81a6829378c4de4d825cf3b07a1cdd0fc5243a22805e275c132296fd713dcdd8acaac205abb71eacc09ea70f26d4c9871e022a50f96964622209bc71a6bfb3c4a1cee6e509d24d881f37738080344aebfa71b68c01709d9200fd53070425afdadd2feba07661a923f49404e375f04e7c34c0829fde735864a47dbf2da18972ef250fabccad68f627bbc065422512d39af62e006edc34b53be112af6d75a7ac2f7a8dc712b7a0acdeee5d341730685515c8a9fc7099baecc8a7f25517a26f5f7d36492e860e7aeec8c72d2bd4a410c31cb0392ed1bcb6c528401bd402683b142c9c4a304503c6ab4fcd1a6f584c12c9ea28a360c968f817053406b4a27fbbb7584d0a04d0b49721c4fc2b60499e95634b65e11aaef0767aa33cd49db64ec3385e207e23b1fad0787cfa86e6f6f1655319de1874f8cb64a5c33ccecbf196f9c200fdf9e2f333bad10fa9c5033dd0a424c86703c5590fcc7c171316ef2bf37c427a341a3aa07b70864df8cbbb48355b5b122667f9bb40d2088d607b60a5c77908530bbf274d54815afad32beea24517319486abbfb1276a11f79c9d421b7b554ed2fd19e97cda213041a35ce22315284cb671d4b8df46844e59e532369b53d7bd1994a721d51850fa7899bbeffa186f2c03ce13096360bf6d09e5d12b96baca44e2726623cc5fbae355e310e8b6cca484e5dca84c454b81ac5a412fac7d0d1073ea6e88ab33c95365bf8240a10cd499bdd5024b7a9bd5b692692fd0a8ad448679feb66bcae0cbc2bed332b13a2600f183f7dde18882d46ec6329eee9494aed5e03c09ae99b03685fad1d3148344aef569cbcbb4986bb35871099d34949ff5252d6526a63d456ac32663585ffd68c4ed8878eacd7aea58d1452e6b836ab3ccaada419810c4e39a5dc67745c65172cbe1b43de449d7095bfb62a454a432e2804f2b41103698677b1203677d6abb1147ac6851d2df2867ca7aba65d5e4a1f93a0185984b35136b425106ce53a13e22954bd2632bd6a399940425e8191c4068be20682329f57329996d719c5ad4488dbdbc75c80d0b9028306ac624d3aade32e420e2e54efb8577b915806b407341eb53c53016310b7e3c415797d41302432b4bd41255a1ad901340c848dbe0fa22fb6bb871a15e052e87ced6c79443421cc836f690f634a20c0b7fd9eb779c5cba326efb597649eb8222e82e7b18a2dc28ede5afc36c9295540b2275a08d278572da90b059a0da7f6152a71226f92f4c01216b1cd3209d42cfe0c77b74c6209af79eb7b7a782e4cf1485277d18b1a09bd386799aa36a23ac3784cb1c25248a95a4d46650ad761d343402b6e0121768379390736f2992394ab3bc4e08fd258f27354749aac390ca23a37f1bd5618c498889b05a8b9862ba2949520ec3da248a93a04387e7f5781ea63bced47a34e3aaf73ae8d8299ca3f848293dccc358fa8f1f64c35a34bfbbfc0f26924b9544668e758feead2e28ba13c46432cb0e0bc37cf8a66efea3bfc91d87acf15884931926b4f7fc24c76470f10bd174cf44068f3475bb854caa92e05830a41fc3230750950031366a2fc5a21f557d2f35f9e95a16ff4433768cabcb649bf46cfa665e95338e08e5efd3294082f51f8bdc083938664ee328f326063234e9aac2a63e461aff39b6da5ee3908e56f234da357e9ae8d337aa98f742b9c8fcc6fe4044e37b66db95abb8f28a565570001b198c0b1fad40712c4a6a92dd3370da905bbb6be8e32f2d12ccde964543f4d3718fdfc09e68c35c2d02cd11ff581041f883de6bcfe795e226a6c3c4b91932955726514624e35ad4abb619fcf6dd66adee6ef09adfe2e53ac56d31481bf18b45506e894da283eb2d8ee8b0ff726c96aa183759a600cd245ec6d1de859cf4412cde9526f882e18771c70a1e62805bd198c4b90d7b02b893c94203a7e05fe1ac1486cc3e521ded8b84b7e5703818378ba9c36b14fb9ee848233eb862e69514e7398aec864ff49f0c446f1bf96cf138bbd64a515d1f568a9b94b21b24f9b963fd1c9234cf7ba7e23e745a11f5bc4012f989c6c963a7bd0f1beccc3369fdbd02c550e91b992c9a2515ff15a90b26ce83539a28ec272b8835311065a5be18b7e39db462725206716be9162b90caa31fec2261b24a6816d5d660579bdeb36be0fbbd22616831b482e920a900af11623f746dac6e4822ddd389704e4b7def0120d6f7721b2d675c5f2a003ca57839ee477e03ea96b25aa3909d3a35c24fe7c946bfdb5c36946572f4ca4b6a5e8d5bd0dfaef858c623782723299c01afb97ee7cf32d70b83ebb7b58a2b7b4b11545f14a5aa5d97d14012a3014c52f3f3ab2300d77e25f51cff578358df808d812c7316c280e8bd41b8cbf9878ec86f93ea81c588074544eb85d4014799593069272e99292a0b6223b80e8010acf9e14ef53f51f797cb672d83bc9fbecb34dd938d7d98efe0f1f52fae63f3af67970fa91fd0e5e2b20ea05ba40a9fd3f58563a02fe17ff7e5829fd242f838fe7a9fefcbb7266eb1da89261da5551fe67b787cfd89eb58ff35b98ccd8d5a264d698c968da2ee90a515199be8b2ba004a782bd0c38796d268a1fd0b08aa2adba3e1898008280b1efb356893185eb02c8b246c81315f27df0f66c63c02406ab07970e6e65d3fc6dbb510656ec41466892e4d2a74755280216ac9bbd6aa925161f04d0ce6ee0833c6646eddfb915eb62503894b1557ce59f0707cec48948b89665818c54606bca223564e828e0e1733e6c0dae8ce881cc4e2c05f3c61cf85381049d70ced12409e2ce96d99df9359000534ba43dcbcef3e36045072bddfd3e67d518ba83d969ba451fc1ce44df97e4f089617043115d571f95158beff378f211327631dbc342af31c6866d774e4d0d40a0cc011a94a00d2df605cf0d6b5fb0ccff2a90e229296043f977385a075422acca765b4a4b969d4158efec6b40fd8c46fc0635d1dfa091f6c1d4b839bdb83d4c135d5ed4bbc2c6a24938c42ffb7b643faf89eeedd62103a0b56087ed1c98856fa514b14963db925a524eb274dd6a353a91b3f31cbf8df278865943e3263bb5e9c982282078fdab58bd15cedc3baf681707219052b41ac81d6de1457d371bf8301b1cef537b0d8f9e29cffa325534a4b3d62d2a990da6c1e6bfa4b5107fd90d51fc1b03ccc83a4726ba40f6b29ebe5a22ff662d19a15e747f93dbe1a1802e458111e69aff42746839debcbc8b605132d39c1fd7fa069e3f53ede0b0be5ee3213a4f0c505b50016993923d5aa03c430d890ee62ce2bc67069ccecb31c2a9d767a52d589f04882032148b3fc603a520ec59cfc0f3114bf721798605d560ae56bd8b08fc140f56bc1824834fddbf799a3d7f51447b9bab0b530f90812127a09b7dfbf119032d3d125d237d54af119955e2fa04b393fb2ac4516a303cc2b75faaeb58b920c7e7e49eefb5123ab54c0c7c3316cc4b302678519683d237ebd1e1305690cbd8da9012533231d84a82c95c108f1686c3c045596882f780b2e048740ce0f508917c007e30f4865faeeb70661c87c2fafb396aeb6bccb76cd102e3e9ba5b2734977c188c25e87955edb7b4492e59d4702081809f5b508703a8225aa64919f479829521ba3b219bbb17ccbdb36830c0b632497a7b1f84c048487097c5e1d5009ae3c78269969249ce50a9af1e302def9c5236a9334e29cd3bf18b679e7f3e3b73bfe6d227ae74e458c28db991fe916a00bca721c449b7f7ffc85718d3ddda4a3370cdce28b2525aedc46057924cf8ba0d8311f9a75979050f0424c33f15c06c2e6b6643d196bda623fdac389540ef73e49b423eee3ab35b959c49f60fcf3fc5178167156d6adec47fb02296e5e90a37393a6ee7d70cfc94c2a8f2ad671b8c0c8879dac9b0c226e11c36b17851d12454b2c62a7ec9734413e645e51f14236ca1cfb8c9c41b579f8ffbcc9bc4d31817412db15cf5cf89eb8e6ea21053c1f01838849e6d0ea1afb82cfc65c93700ac5ccfc8de2d21de4e23260322fb74e7fd4e6545a9b22296125a35fdb1393d4dac7d3a4a7535d46435a9249ebbee02cfe9202cc1f9c75aeceda666b9047f69b6c97839054eff59dd43c216b9668157d48b77bb43a6b3758f3ebaf5441512dca3aeb7c819db526095154ac39f104223b751372bb92a308292bc560d28a4ec84f8578df0cbfc8e75884342f29045b70c6b7ce1b7306d4cb69cb5fac93c163b92d2727235d0a781b4ea155a7e38422a346e238b608b8b112fa50a54edd932951599ead7d365bc6a065e746ae39edd0f88290d701d296136b4f72ee6721eccef1b8122d5f0e50629b030bb8b5301d9c3e39978d0e0c85b49b21e35587c858e40883fc0cd96c72ef589c375383514962b7ec065a9b12010eddf332c07f238db246063fe87ea55e78dcac9f2b82d2bb52548ec4afcccd78bef8ab1590d095dbb9ac5d82204390c356017313e4aa8477806bbdcfe8ee83f6560b26031a624b4444071214e56d07b7eb8bdf49039e5ac112c27354b338d217885a4551b58935e1722e056588162fc7e45b80d2169b9328a3764336570db53677a9c2e9d013770590da6d0e92e984b51850f74917974352ae6a98455f3af2a4915da4822a6c512ca610eac28834fa9946c457a698a7a2ade6cfa764357189bfd6b13b67023e3ea124cadc17bba327eabd232e044c064802e7965062eeb05210f81864041b87b3b257e8dd30c12834874381c6daeb4f4f9dad96bdba04eb3849b62c4e090ada10b48cdf4ca2ec15ea4742fdf194c7463d6d5724164a255a437db65769947ec7438246596d8e0ccb242db5d5960c872f7b4535ae955258692497f01c5df0366e54cb5e098eaaf772d642a101113a237ecaf66b42895eafe8c29bb2cac7ad57282f4a8f46c82dce72f548614203d7eb15e13818c92c82573c67af572eaf16bb40f967754f0ded32ee74908471ba64747c011e588ae2e19052ba1ba0bd5418e5b87dfb7a8519fdff43e9450fafcc7824aa34c9ff8d38354cfaf07a854c752cae6c3541af576294afe9191666e7e9384d7deed1225e87a07cbdd2d42cc9852d108521a13734ae7bacd4a3993254d25c8d99547a41d9eb95712975cc4af25ecb959c6e28e12bbb91d91a72cdb402d1e30698d404069960e7613349409eec60a70a63214f0863f00232edd30a63f9b49bbb03fdd526ad4a780122587c36bcc978e6220ce066e0ae335e894958c0aa61519a2e0ae01ba7e604ef4e568a5373a6028958168578c62bd6f86603b12773d6a43a5cb48241f8267c3951e8f9acaff4f0e96abc77d616c42d0f5a745d679267f1ecd5abfc26be84358a9fcee018ad5fadae55b26bd20a7c0203283be7ea28e955a45f78e57678eb8eca936e3bac8e7d4028a2d62f129694598241e97d9ff893217bad91384519eb3a5704186d0f7f9829243843e9d7949047f33c35b56892ec75e303bb5078450c418b2fff07069c4aadde03530f2258cf17a29e32b900e6b9cc4696e831958e5744788ef6f731c72b14c47472dd1bda678b96288e57fc58f642d1d1d7088615a07e0805374d3b9b95545ca306d131c110bf2b2d67ce0d67b275568326586b088aff0de427034872f89bc33aa47e05718874c483a9c1bf5a22ad09d658cc4bbc98335ba107b8808dec46132c6db50db4d9b5136e97095903a322c9cd988439259b07accec0fd3c0f969fc55e4d8e6244d54b1a989949fd022725c44c9a779005ee134a11b987411d27ee0f04ea0eaeb44b1955235f185006b8e2a9ed887c41b912a0a1c169029367eec4782b85e002097edd0f70f1b01b2b553dc00122e019e6566a41ab4993c9ae059a8cfa4e23bfba855abf9ac26e5f5aea5a2bbd54ab34f7635265e63b68a9b617377c28cbaa7ac2cfcfaa1a8cfd3d2d12bd21ade97ae8564ad72a4a34d5081d114394e8f99d555101c5a8452f34a7062581ae549be4ef79a7b6bef7ecfd76b2c3ae977c91cd58601a2034905e1cee2b0daa7b23f395a4bcac1a7a1fdccdcc151704ea4e76ccaabad22a4ce3aa75afaac05da6f4d12ec11068954f45772afe2a61f08d9be0c27b7fc132e6e491d572be76198c87b4c8b07fb22b5859160474223415ce1293223f00efd9d0368c298e58fdb74362771f8dc040ebadf150003edc107176ea5644e36d7099195f33b0abbe8c6efc092c0b94550985ecc267f3ebbf89c1bd23b07f883581342ed6c2c9d416ddad039e6628485e8e4782e061424866e089802a42b37aeadd86936fec08acfe58ed871acc3c8d81967b35de87bcc1ca24bae4694e1211a404a0915b1e206b9b50c4662a1140da002327b5b24d6f275618ac177e10dbee1664903f6045baeb68604a0369505e368cce9519257346896078c58be75e1782b4d25351c8963cd140b80677976e25af872b085868e8a527ab330dcda8ff162fb749eac248b6ecdeaaa68da520dd138f2f055117f172e416f7ed2558c9df3177df737ccd5cf161561e31165de4dd8c05a64ca7114cb82046a23849a9cafa36aba7a70eba044a5dd38de351d84308dd279ab65e23dc60e305e5524803ac513a4e9ce783d93e4eb43d15524c8e7e76d1e1511a2433086931ed063812e9040a3024bcd5645e0aeb25a092418e98c22b471fa9a50c922bcc98dea458c1e38ca20cb2bf25cd99e9b1019d6a64e9ff622ec3842e47adca65d61d4019441ceb97ec1a0f0d636eb3cebec1319adb7560ea696590f3d067e7c6ed7b908715ecdc0f4c776e1443827bc89e66d087ec5ec7b6274819f593172c4e23387f4808e465b32fc93cbabb5e95e3adcf8fe72fbcacb6ff8cc25c9503d2a89aa393db0dec2b515a68fb7203f52244a96cc97b20962092355e76807c596102a3f57346cc510d23b1384c6f9530256842693882688fcbbdf74bfe442d01cd35d1635ae230a5f44d79e36f1b5663c0931c8387957118469e79242962b1764db22c6a9f814b90d8b15c53b9fc20c5d54442298df1324502ce73b446794a55447cbb2614b9ceff8e183438b9858959f213b92c1c127d7984b4aec2058a293c18b68f2446c1c425b191c42e193ca3096031ceacee1f386b78d70f5872b6d1ccb3940e676a900bb4c0dc68605cde966c391b2bb218b5d5310d3f0db359040588c1321f1098809a83756e110129a0fee2d5d23946b0203e35adccbfd4484736b85c8478edd053afc573cab7c84a12b32d42a6d2290b933ab22c0b0c05354159be845146550759f5550e55b1c182403176d240477e2994f41d6dde2e6db4c263187b8b2a5e4c26d599dec4559372d617a4e82c6980fc9084d21a519d3dcb2b77911c0ad3f82596ddb13fc37479e22f6c0c7e783a1bf3c6bcbfc6ce930ea656a8564a04187ef43d735e6d9c48d5fa08b1817e18c02524c4ae58f9b38a185d50f8da63309c3ebc3382d1166082d99348ff8de44e6d2d51727fd6b3504ffda229d3bc53bdc9a7a5e052592763fbdf841d44d2ea0f254cbf02502742b44a07da347e083ecc12344d156039a7be08aa18ac58501d91f372680e24c0c3c36d7e10bcd3ff672cd59cd5e8b20769c050e80abccbedd1a7a73ca54b50f2f562b862726cbf1777d86efb8f11b9a3fb3a60536af4ca510ca6ec26e05a44fecbd14b29d82681c521c02b03e120c7e002913250efbdb0a58a0d88b8ff32684df70aaad77e302594f18fb787029169812e0154a7c299e15ac84dcc250f7177f9072b9e80a7428e841b9c53208194a4d37465e7b182cfaefa11c00142a3ba94576b1a22443c4a2b910343699e371d32223880ae79acee51e9e0947318172cb0c6bae4e38963e2d87b8527efdbc1db5f18e9b207a649fbc0bd6946f42a8eaed612fc5dd016b8bc7a15268bda234d9cc4bc2c29071fc7ee3774bbb00f3e00d8f36ec726b10fe755e25acb8fd6206f57856449c532b4a0b40f26af5ba043d039c7951a24063ca0b2b077be36f7817596455cf43399bc57419c76fa436075f448a8929874c2e49ade302c9a41c7ff63d02942fe36d92776eacc168e91ddf61e903fbb725f775121ff38a3bc871634a01175bce9f0c5d154de4368d89b7e82f47542ad03fc068cb3b8780f05124da8a162285ec24f31f7a2ca1b7af0c29a58087ecef6d5c87de9f88479f7929d2a3a5c7775584a7940c82d3f5ee4f8b20721e93d9c837cd6910f8eb3b518042c97927a58af3d70a9fb732dc8b5d4c5ece84805e9753643ccd6206551a8d9359fbac02a05aec3013167126aa3baf0760460162d8275bb84b15ddfa9e7bc8da41af5e9c2bd247d18314d1fae9a32727fcacc081dc1b9c5d0ccc6cc1007422c408c5d5ba52ba189eb07178a4607e9424cfa499b4f418babfc1512547bdd4a41b8e36ab12f710618821f051757ed0934990ebbf492ab6412586dcbd0b6ca5b1b54ef5fababb4ac52b7de20d5f357a26b2901865d2704fa5d922718cd72042f1c5dad33c094a39b0348a3684b56bea06eb233ae8d4ed44ae0fb74dbe4591692661b2f945b50615420850555511e12ea36179a5f1cee00989eaeafd3d6d91b5266e5e2c22a8c7fea05d1db7ff573cd2787351c23f324292a6c48883c8ebcaea85f07fcb06c9470466e503d90f6257be8d836cc35a1163b03f2fe285ce1a4c2d1a8a9850d62e0bf913a9a251b1f1d54723c8a6e52ab34b21420997c685bb71be6506fb7751a00c23015815f5cfa3140626cd605c4c06abf5e647b8454c4967c4220ea9738d664839704e18dbb43d00853682335a67efba36ecac142078f7882bc3fcd528c9021d13d207186c164c516f7a1cf0753cf60919e1ee4891653022086296d605ca0cb9bc161587be9a67a2c8c7dd8aad36198130b9bd7d4bcb6e9998575a43756b0bd4c2baa0c0327cb4a8233f798eab063a87137652c880030c95890ca5a420a96a3083dc496c0589cfdf262914661ab624e588aae0fc568d99c6725b7a0bd633c1aa704fac46d6111ce230baea4252e4f643061973de37787ea51431a4d68a11cf2802617b85d338ecdb93a023a95d6027b9875c62bae838bebd904c3c2a5cc11ef818d8a3dc5f08151a5ae4e3ac62f334352587f51604a949a2c83f60ba9f0c26bed239abaab4a12cf06e9e37a331d7339d62b1e38dc4acd3626aef6c9e8f1c3fc04ac15f0ca3bdb37e246431d69df18c42171a6b29826d1e5427382aae5f95dc5b3867064ba4018b8b8c5b504413658788a9c5df942379319ef30a51729a3018dd9e6b1516b364c3ec175550e5a992f8501b51334933732fd66c1425c6aac812dfe14b9670e78f5a57cf0f9134ab8a6a4c3d0da53b68af5d9bb5d313d8f46b0476b3823a7a3f277660dae3a25b03e0cce34cfed15ee61a45dca0b29feb0733fa8871747f80b89734c9770b8dedcb0ace100d1fc807ebb213d5303e074385b28fa7c26d3f2a24db07244e173ceba69146df7620e8fcd3f0dd9638d4d6cceae47d8cdfbdf808059b0f17abefcb584bb573797eaa87ca630636b4e58430fc1518198feae902d218a3574f978951608e6432a220e06ae0dc31f8a85301b6ae4a722b5961d51e20debfc9025dd3636d123f99735a13b18dc5d558471c9c9ea1075a98c6b3a9ae783c2c715c6cc75e76e9685692f966413994613d4e90348095dfbb3e1442f33fdeba8a643de1945d1ade04b09d15de6d20282740e8b6a784eaae7abd9fdd2468e7ed1e9084cbf358ea92f4a8eacf970174d88d7ec0b1475ad924a8cf8dd467dcc214abe10a69ab0201d7dbf926d0194cbbfcb42149b3b0b8aca34a608a05d6ff40901732f3810bca47be61e4cf77d5af772ca958a7bd37e4d9441a4c1b87a8506316145891989ae21583f5f002e9d8c8f0d0abd736240a06008a0e20c9eb9f60613eee7dd88f2485ab3154ad0971d05a4236637ca85d80ddc2e30ee1aa5baa8d4aafe4d888ea529cb1e3ef6a97078a16d174c8aba24c67d834687b55cd6de80b3bce8ad4a702f6bd82741fb2d44f2e72e84acdf830e4e6fccbbfc5c8d447dea581259913e96b7218eb03b0d8122d820ab7f377ba55cc631be593408509bf400b5041edc1e431f8f5fbc0544b43b822edacef1219dfaeaff8c77f9c6b4e14a799178708a0ac2fc2f071dc573d4cb01c504896b78ccac6fc77d2356a923a98589e4b900fb049d4b9ad21bf3263dc4288592069f43cdf2752c6923863c9e9c6f2d483f26116a49fb6f427548155c3ac1748e0cb6e3f103e96bfe1a2868d15c5861a4fb9e0f273b98348019082ae0dc2ee66fff81db150820280e6cf0b58f1a25288e8ad22f3feef71c5e53f88cd4b3a804fad36cefb3e93d1816e6cfc9ea60b3241cf31d9c6c33e9feb72fc2f5702f8b5e1356b2f66a20f67f44da925f9ca40c82de0bbc3cd14abe5ef802f80726426a9fd91a85593ddc2c4ef38b4fc4d1adef5e2d88ddc21fb4405245fd009e26331245edde962546d167171778fa4ef4f81db3c80527830e904fe0d124e75f6975c57195a4a3b124518afa6c7cb532677c8e3818bde06d4abde9dcaa4e0d8961852f7633c6bebc39fe6f91e3d2277a634c37f46919e1a8be8077cc9ddd8a565635a92b2026ba15efd16b611fe2b860d3b3121edd8f6e664bb5315c70631b71a522c2478f790b7264310f6eccc287209a1b52dd71d1e1a30c723c7c78a7db7f5108910282ec77c2c71d57c158dcf80891ed650a23b0f497dd4ff151602cebaa3ec47e092beaa44aee96f8de11690900ded96ee66208886e8f9c46dc29fe13f52b660607d40d206528371361e30c349e7b843f626add1544d91c856d228125fc56286266ecfffdfd6bebf525addfd6b8fcd8f7ae455db24c2c70e0824ada68a24f2da5730a8663654451b25bd2955151760654d6de62b4989587b316195e9dc1ab4968ee82196767405df2889b87e87c5e327ab013f1422be4b33334df72d7b129b7287f46815eb42e394334cbd7d5174b1eed814e49eeea5c62666185b65f891ae37391d44311748b10c0b204bffae58f2b305b4261a9b5aef7786d793673438b49a1ea1fb8bcacf25c0269d5f025e0048cac4efe48187d80fd807309ce3809d3072a485714487c48074e87fee87d30b20204622d2c3fc6b8d15b37fbd03e856e2fc4e84ffbd81929d569741b62b10be43fbbfc6163f81333f98da6ece4e0d240b137bb52cba4752a468e67f051326d3164301c0301c5be26c7506d085c0be560427ec931f8fd4ea17908776c16501cf9189ae3fbf1fd5d4a965a41c355eb11c5081a0f05620f60a8d2ae1bba7002c3a8b59bd4a84c72ec0143cd3c830275c060810125c77051a60b7acf15c75025aef16a0eaeea720780080f49372d108e18cda3dee5a3a9a05c69984ca5751f1b622e847430661467eedd89668939abe93f6cef6907448e0bff4d3935186637c51e18bc9287fad1590663470cda26188cf5ed745789cdc8accd2ef1a9f6243eb561f5243c26f34d692296f00009ec324a1f2fee47cc88bd12025f3b1ed13d88e1e2f61fda2bd757281e3c9a840c32bda290e6df7f106fb1b1fc12144aadd7eae54c79c7f38a71cb5f62f18b869a8065dcba79191280ec2d3722a9973660b817df81294203988ef422425b52ed344c6c5cb5cdfbee7d2fdcced4d2fe7c41082292228f46cc4936d0af0275ad86f9086b7b4530b99249e555d14c77756b68a1189c6afe63f78b1b13343e34e97b5424ea69df48acc01039aa7e05f258ffd6bf4f0fdf2f9683a9b2f1e0ea3454aa14972fd691cacd11e9357b588039a73e287e8344c815f9dea9d857f107f19da1827a554f43f8d70ef65fc2887166782cd7ccb07e2bdb49c4e6980bce16f99b60ebf20d08fa6394783f6d9b6a59c8db0215276d97a7415fdf5c1e5b08ffe0c1018941fbe5ffc8f29671392ee49a14e5e2d4fbd826ffdfec15befe3264581dc89fbfb7d1ee637fa67762f21f5f2ceb6be508d02ad3b807f8d800e1d231a24d0e3a2896c3160ebd5c831ce41e8998c6256b2ccbaa6bfbd84cc027f0ddddab76bddcfb38d9ef9e421b4182b322f6ffb60919a3f16e2b0742683703d92b2d56b0c9762230bed2421cc96ead2658dae280a7b50ad6e6dadcd19ca999fe75f3b101a5f961956be019a386643cc8c6a48b03cb76629711c59590c61b7496c6fbd1a3bbc4738b421889b2063e9cb9d0c9db7b535d8c9bdb787785f5641d38d7e2ca4567943b0ac26df20ca10d3b8599b4035fb4a8b45015676c13fc472c66ebf0d3498d49f338ea90326f21e6f6a9c56ceecbb4fe67972096598e461bbd2972cd0662c56810e4418994aa63d17cb791e6178208677a6fcffaf8b0b6fb8afad80da2273078b5062c9d5a97b6f522d6e09cac5f5cc4f851817df0d91ae60574e2c1be2f68929c496975b61f57783fb3b1d4d255b8da0f0978e32cb0be04c3f3268f88f62cbe8235c1e98984c87781f03172cd5e7a2e273a243d5bf1c14701c1e7c148aa53b263ff7a43e7394ca8b2948bd5c436bbdc67e4c0246ec43366a5d7548ab7a9be568fba86ad04017177e00e1b27fd748c0ccfb6669646ef815ac447980c809daf8a88ff6cc88118734998a34af3f7af03e8358dd00e84fd0a6dc9057421b48a2ee093d389dbdf9afb058e831d6947f08ba32733341bbdde1e360d224433b82d005686e8a3fa36147d33f30cd68b4e689acde52eff501c03495a6d7963d93e185d5cb688f858934d8b213213c5a0177ae7f91642bf760c89265e9603e081db00f33fd2cfb17c2a6b9876c1dbac59d62cfed7c2c5868ec18d433711b9387c7f9439041a811faae4a61dd5b73c49accd1249dd972b31de6dbfb9de04447fd2dbbb511c87c1f46f86d2abdb5a14192b46f840835a542f356a87c8f42e22985c7a8aae904ccb45801f0c99780dd570beb6e10ec39ee5b8d28e62e48a0f8c61089806ca8cb3b94ff7900b0dbcf640edf627e5e8f2b8d43e138a2f85194f7ac0adeeab6b2b95a74b11670b9d62e33003d3d60664f9edffb2dfdade370a59c99497971b5a0373cc627366ddf78eef3678a3437ce3e18f29c0c5d42ea2a4747b68a242f1c60ff64e36911726646faccab078482e23caa6eec08a979d6684db3b971dfed64d75dc49e412896a54be7fe418bebdd257dd60a99be1d5efc36be1edcedbe5d0704ee1606db7b64d31c6519e2f6a879c809b308828a49b1a59c079c2c7fef98a99bb3189cc936dc76281152182cf7b53a8121ce9eb06271bcca734deb3747b5044f578927fe7bf1c70a6637369457231111bd7b408048c8663031422ef228d0c15656179ada4691e0c317d2cf995bc841e33c1745f83c1372d01cde630df690710d04c865a5071f92ae06086a0783460de518eb0b89601a27d67e2069fe11ea4dc24dddc7a4382589dfce905b60b9978c544529823a0f3d37b6a7afd0b12b072a84b1ec9d984b5afb707b15d60eb147f0563d63da7f84240dbab13af415bc08724c179726b462c2009f47f03fb7099de35ac9bb46f429343ab29ea0399cd1c159fb55103ef8ac1eb040462d114e75bcb1ca5a92c86527a649660802c8f8c0d8952dbba0d3dd66239caafbbf8d38700f3ae427a0c3e800abdb89b08850a8f4977e90f0c283b37c831d929c416cfe8e10f21c62150cc98f8255c82f307bceaf0627174e6160f8e6243b6700b4f9af9e16fb955116a24c2b6e26cd506cf9424586ac223007ac564911db5a07bba42458e2d5bd3e72e9aa92a95465a5ca6b13068465197ef83b3137aaa090f965a59ddedf8127b5e8d812294ac63d3d6ab04b5b578d11559a5f6eea9cf0c412d5e74c1823793510f0e853b46bd88ae0a98e611a0784c0e1bb09fdf0ffbb62dc0617985ef44c6f49563060e47451447b6a494c3f091ed8b9395773428eae1d970cdfc039a4df6fbc1c297a0ea461c71cf798ef916da4ca21daa26f6153baa2bdbabf4dadef5696a68a8408d7bd35d6775a6c407d4cff596fb4167c0fe32998240648726c2957ae8f9133933278e40a511e7be155355b2d31ee02aed1330b9186a66d1cb6c2a11de7ac42e77925d2dfa8032c309a825c4deb3f933730bc42806e4947853556cfb4890612d90fc0a5b62a226cd7f6a5b3d78594c87ca0f98edf8ffa4a9caa330112543cfffd70b120547fa2cb990b28b5a6cf1b34c3b44e68101be11567f293a9a4ef2acdfe87b4d71a512c665c8310c5bbfcd51667c731990a9d1f46f163cf956ba70b6ec015d3253dd1ce6243a2cf568a6cf3e946288458898026bc1dcce47b749633d1b6ec3fdc6d8e06e0ef115f7a070a20dd731bfbc8e22857d5e92986589c994ce24c46798a5d5c6613c9dfad6a2ae22c16a5c6bf7d7b4e53c44455b709e4f4e0ce2908610cc54446e23d0288a65b95a874a24e52a01258eb9b1802ceba81f98d91086c38831b0b4a8570aa2d53307782ce8ae6c37014081ec916429b257f464d8957d70a6511c8c2d9e8b141938d5426ed384d81ba15ff23c714a9eb12965e2cee987c04a2c82029d90f5a3ef42adaa64bd41aac94aa10f91797260a418ef1ceabd3216f3903e77ca96d63b6f4b296b6b357070673bf0ef4a31daf93448eeb60140e18a37b775eddf4c6a1fd9d4488eef2d8c8a622f4e64a8a0d49561fc77d9b42b0319032aab0cd158658b0cd6dfce2d4621b5a13cdf91e10be7ecfb9c40184d257fec25aed33e45adf64a80aa713720ba6124e56cbd7d7984f19796117a3d234bea3fc418535e2cbfde50ac13233ba61eee7629a4604289fc84c3ed02310cfe6dc3723152467c53190709e296eb7fac0a1e57a2346289a1c353d063a6ba4b0a10ceafc70255a85dd17ec6f6fbeef4d861368e255f573d191955d2ab8310ddf96e3d5eb3292eca59f439165fa020fb6a7c6135a67c7f01e2c9aad0b6599e6f6636a9f4fe0ac8a63ba3b8427f237ef06f7adf599561094caf790f534c051142b20e04bfa090ae40b9ebbaa93d0d8044cd39f34141ee5aabe4b035d681ddbbb4e2c9624b77d89a4e934e2c17017c48876bc73182acd2ada2af000b5d190da9a791402148810f71156c8932b045cd4bbc4ea6f21fd8c7048a0059a93ee44ef4bc9a3379b5f6167c8096e0202394af6f16a1b8fc0c0a4b681afccd43931a16398273046d417d6902658a08b8f3d9e3954da0d61bb6f902aec1d8f4afcde57dc497bfb61463b6436107e6cb62dde948c096869ec5ed10d8a6154b68ed6b63c26453f9fab545df74aa9e7c14d98a7e271a580698e8f838b05213e92e1ea9f47badf2c6db4acc3549e610da2bc7d7aaeafe46c15790d9c42f6400a2cf6918f042e153b382bc296e9264f2008ecf11d280fd1b3c412822f5b488a790d24d52c4ff1ad152c75aa22501dd93d560211623a9bd1c5bb03d68ca8b148f3e37b1ef1e0c88c3bb7db35c8ed235db191a58d696f7fb1a7581d53832b3557c8096b8ce89cf802c4575c4666cfea5caac81a02b60bafb151044f2bac7e4f158563a98a02428222d9fae56cce03a4dde61b2eb0b5e1717ac17aaa5bf72b4ebdef5320d59d12e712a3a2e116e7547cbe0ecf53f542f39320e83073172754cbd648c9211ea7e0df2cb04604878b86cad53c7a9b726f4f62957f403f08b6e09a8aaabec407459fb0ed8feaaf73e82ee8b67571327b18a393642060b1fcbddd2b6af132f843114a1c4c9607973c9cf5500e37bc1bde25cf747b1b5d51c80be0eda01b33e591726eb3d038ed2bb9cf34f8ecc7abefed449942644460ac4e6ba426d31533da20638a10fcd458d93bbee1746dac3d83111cd39c1b43409b71a6de205ba1899ef26ebb8226453218b90958b90a8494f31199638fd3802cc3ef072355fbf3042aba2c9a3bfe3f11ebaf9e3fa0e7ade88fecff4221589fa2f7b1175608989f22059400233c8fadf49ebb86ae3414085cb87d11fd57b7fabe4a335c8f03ac79b6b16e19663610d051af4b00d8c3f0c54897d34486633d4be33a80e9e7eb0138b4f83d043f863523c7d428f2f9e8970270a1581ba51b141b5c1b74f617a5384272966ce82ce2e49981829a8e525ea36a26a6ed3ce30edd78640ac96e1e2950dea91389651a97c792c30f0683c04a5cf5bf9b09c4ea5cf4626e797a723e49db8e2a4f37d8d30da413005ddf6c9787f3be196d59b5cf19d1c107a0b77a45f3d4f82edacdd2a4ad805f3048cf75a32cab6f32b4848f50891020b054937f1491a772601a3908207a945ebb2597542ef30051ecd8f0702d799882137172a756511d678ff53a5e628383c0d7c3fbd990c6e61ae8962ea206822f9a39878993282796e73bf11814fa1906895d9cb09eb1dc6b17bc9106b457404a6a3bf087f1f6260c7ce7d582232d54fc54d32e9cfc2ad32559fca4d67928f925b33d7ba05ca0f39fc1df07d40ec1a5fcb43fd93d7e0590fda9fbcc6cff2a0fea46f64960aed5fe3c455b1d6183f791bbff542fd89dbe0ad17ea4fde066fb9507cd236ecadf4b135ff0009a8dc5f594f3aa6731a046cb80eec0d14f4d14c182e23847ebaca0b1ad2120900c493dc1271d3a23a514ca20829f0b2ce6e91a00cd3665854ac7f24fbb714416ee078ce0f5a447398eeacece3dac90a86675048fa9d2d31e89ba37992bd5845281880a181360b33958cd581f681cc110c6611cd949488da1ad29a232227dcc15d11b665cef406c1cb8ccd4a874ff89736c1b10a03cc11c04b07b86c80a15aa34a35825969aa4e489d2d7003e816f0b5b950a130ba04312bb70a595646fd39e4396a0340a19ceba0fd9bad7fff9301259b5f3f627726b21f319dcec111d52eba4efe9d225e118b54b0d855d1e1065c50583b9ab48fa4b35fbfa8d2f003521a150f8418ba08ff5e54c4b441961749b1bd2ea4cee8c7912402fdad826328f89f2f3bcd6887f5a81d449152226e01760d60ea54275cc4cfc3330c007ad73671d1335f2cb358208ea126b3505753ce4de81fc3b046559cb30bbcbd535db8d459d15aae813bcc601b5ed13827b099ad70d9f9230317e96e7a60f3da1c21cd417c7bf026fea325090c8489e2041df0f56acbf508351115e0199b4a55318a4aadbea9f2c24c5caa17a8c09d6d2096c2e00ce255c2e1185b5ce10d182cbd9a066c214a9ae215eb6f24f3ec0fa0ebe7b6020897427a0e40e8b603c4c6376a385b617c3bff7e210e82f7b4f4e9f543d3f2cdca0e3f323ba5cc1d85465babd2f0269c9990f77443ad68947b486676d73a685975e1de16f7a0053b89efb98576ac375cf1f98130c359a9194cd046b8d2a5214e3117b4c910bbe2ce16edf6035aa045e35501a306da018b14f8d53686172537259e3486e1e52ed50c79e9eafa88b47cc46fa108a07e43d741c9f21e557a9fb3da93f5316748144ea732a50c565ee3f752fc993deb74c16bc456bcef9a79f070b8b5d4078102fd183f6a8607ebe20bc05ba2216f787da84cc02f3fdc52cab98e118d1b7cc5de555ca4dce9baa5bd63a4112bbe41071af2d1dc352ab72e78f4c69c24f92c89f965e052a9aca7a44e4f25e26a06d4b643326b9d477b7b1d50f0a8bb6bc4492e1b4475587f70f29d612389cdfcf2b79174fe0531baba2d938eb92b976823cc7d6fdadd25acebf3b60ce37317bb30ebf37f2c3c83f65f52f6586ae298379636761b4baba37a8aaf074bb4bb3ee551effed67fbdfb5b7ff0aa3bd61b1029cf98734b87f7914b56a01ee02b6070df33cecbc6f025e5577ef65a1de78dc2442fcb58e453f3bb2901b087de8f9948d69ae5b9335cf2e8ff1d1c8163f95750179c55030a7d3d6ee1760a6b006d2bae6c227b8ce70446bb4d44a721e36ec0c97e08ca00f71eadaedf42eadc807adf4316162b58d8094f3b3c8f5f250d2636dbe03acd031d3af68b9d89f6466eb998e571af3ef3f6329acd2096a29ad2b1a37cfb7a8d8921b7eb2ea44429b84611692e99f770d456eb55f6e77fdb5d8968e018e2df077cec1748b14a21174e14dd015917d47cebc000aa996f781b1d8233087e046c2407cd45578a1ab5eb91719176be1e4a578644a903a8e62ad50d7b867ff1ec1c120b0f1c89c642d56f28cb1697c4d4829a66dc1ab396b1d493006a718c38c436bd01f510d64a255a31c1d50123bbe9c71791f86ac25307299ad4c83ec275cbf64469da817f0442a5419b828e776a94d95195e87801787512ada2a7a5f0e0c374320e48074c44150f0a685feb8c3586ee8f603bbdc04ce114db9314ea6688f1bc2199ba51c0812307baeff38a42bf0546db4fcc24838f74f697db0b914c47850c8a018a86d8954a915a7a989a1b8ad482182a89626cdc6871e466f5dfabe3a623d2cbb57acdfaba66eccc93eca4614ec36b2d97220f04402d04ab8cc2676b5385033e4d14e9ec8d8223cdc921a1075c66d3f4a97d03497dec34635c9a3d82cfa46f533775fadae01f99b860d1ab196e3bf0815c559841f69c72fb0c29c5773359fed1b3a2269b686eaece59f6b455fccbe80130ecb1790763ee8b8b3623fc8ca6d08a5a92b7a7d7507c5ab04512e4ec44534b0be073974d61c4f740370d689d9dabe97ce0ab95293af8c55eb6babe32c8fa54f46fd27ba9f46cdf86e863e05748e583f0e769f1e2ee8c887794287338d191018aca48f74f356e8b06d51bd2e84301bef48b8a3a1c5bd8afaa8110115fb369bcce253704261d71d8eb4532b8d3d4c30d7747ce8a8c87d3c4d5ec683e139fb00c93ed0ed73b7cc5f89555455d2c3bbebc66d073fd5e7e0876034dc384f91ee1d8fbaf57231dd76117fc8738d96c2ab806f6330fc73ad383781b919a645b5be5dfde0841967a698e8ea880a4c88ea27d42e9aa9cd296ace77f4899532008eed69643c8a2f0fccc5daa2098230595bfa652331ecce24de2155a98ac51fbbcdfdb428632702983acb849cc2a4196192952d64d5b54c19dfd2865e1f16abbccfa5d1ca3bf6bac385e3b2fcab934380104472b45d304431bf153747bc4a30f35625e894f5019c9fe863ecfef2485704a06db6aaf782a88915e47cd787202bd24086783103d36d8057b890b564cbd148c29074c336d2f9210ea56969255498e572624c7258105254a48f183488df8da8cbb93cb1aed724a9f1a5e3483891c0588c19116d725d7caef25fe9a6d653778aee470e0a88003927e65215e2d43dcd09406ac9bdca6659346e3aa080176a9cfd9af4e3d41b442c087e64a8e6f1f0890fb1922af823af5975893f0bcb744e3f24358599037822b2c210b742210c74cf6780632863f06041a0425047a932bb5582018564d0789d1ec3da8683c75b36b974efbe766080a3a1d64b2fa8d8ae58fdc21ea1c80b6e0ee4452e86071aff5265f02ce03d60b8fcff91bffe5c9d9e9f5ba5f0c0ac18b98f7122f8a0d9d5693d69b96b4bda59432a5143f0b310b360be18ae4e143cd0b2b8bfcc2d2f36cd568b7c112b6400593efde300669b72a5971eb31b84d35461490d04114374447c020085c94936abe6d51fbc2ed4198988525d9e83fba0737e8b951c113c4c00213c6028d252b9d456ddf971fcda8bc051c2c90eb1d557ee0c0644c3bd81ed360bb7f2ca38631df0dc6441fad8a71c5929fe645fa31d1e44b4c4c8e5f9816b49802b72fce830f71b5ac057f58df751e5691b5bd7b9a93bfb06edc4222fa165349beb1d6eb49bebec56ddb3c7a45e26a2f084b5f838524715bf4c2d2e6d22379f446ce7935eb1c6d6f8b249fdf2435e91bb24ee23623fd41368c178461c54ba74b99709a15a65fd816825e73ee84907cb921d2b7763a2389e422641bb2df3ef55c82f4e722641be2719fcbe6cb929d6277d95c4658f52faac2f3561a550181112c0446b0fc024e7651fdc31d9242040626ae98b5d58a9247e611e9f3a3617965ef988ddd30db2e5932f106f9a541f667ef766f10f417107446e306535ebc9b3b06dcbeac051a64dfa02695a3a004085810ad0a97e8d9796744d8576815594c60feddb61ae537810699cc4f0719f3ca543f5ae5cff1175654828f2dc9f9d0b915b7604599c2083a526021258a2b1830a5064230620c27ccf082ada05ec0bc503ac01d41b20f5167f47cb8a174803b5c78a0bedf43b758236df36a94886151776dacd1e8db9cc62006f0db09d928fc7e4c5ca41f59180b04d441a049958ced1f0f9acbcf01cbd23ed9b30630337acce0d994501776c6cdc3cc909d6163464f0fdd6269be7145bd7dfda3ee2312f1724e6f88917ef90d117fddc66f276486df8f0908a44ac68e69a4d1bb9b461a2cea3e9a09f5ed209080b81209dcb64a3e738c31f6f62681915d4976a5e6197f91a1e4613144efb0a38b63547f91a19305e8bc65c953a9e475dfeec70195976eea82543e7541b66e875aa3243d970698bc731f4c5da97a359d6f4c712c535797550a514f525129952477b78d6048ad35e19b973cacdf252c568b25cedb4a9f0a07eae4e68c41b6520f92b70073f35c1ad079c97de8be92fb6072528b2cd1ce9e8645c36a39bf90b5925753f28d299229568b2cd12f8b4e5688e228bd500a19c06bda9c33bac72f7d8b34c618a3ec4ca36f88f6d174ca18473d615848e77a90051001f7eda63ef073f472c8f49ffb34bf6d1ca9c47125ee84c434d2909a8f38927f216fce79359ce6bb36d04e48f4ed0b99e6a773a5526469a11462e3352c86e8113393a669f46d9b4671e851cf2728e036aeb0d07c7b900590b2630fdc6ab55aa38f3725472f9d3ff0eddbc8c3424ac9524acdf3c1854591981f6224fee6e0d3b046ce15e1345e8ebc9a912b8145919837126de872a0f966c9b088ef84d8e08e01f1a36bb18bae8d3c2c86885a8c719ba6ed1ba2e96733e3943b25b74ac8f4e8f20bdba377fcead7f5ca78327227e128a5dd0e9cc6f357eae218b5798696386d961a1ca3ca0f4bfc3d5766f3495da33eb5ad3437e746259e5172344d9f9f16847af470cac087db7c5fc2fdc9115d50d74d5ad4f61a4e9d0b492bbed2606f1ebf8a1fa161a938d71d0e9bc9b7cbe1c90296079bbc7ac9b7cbe1e426e7ea69abdbe9f30637f7c01d0d72d77d1ebd88e621e72adbf1a0f2a9a87c49d8f015ee2ba2f9b63fa8e19a67a3c6c7848acab731c5f3f293e1d92313ea86a83fb5d4e136ae58c7cb8eba72f252369442148ee778f8d217923cdc7c88f84ca4ef8f90887e8486155d7a218821c7f9e651732dc6e849d0b0e2970475edf3119fe431994ee7c74474195d2611a527113d89f8d1cc22664f29688f361fd1582a69538bdd1442376d87d6c2e63b9a5d10fad3b9ad04c4a9c784f415816261d14e3b1cdab79e3e92db6cefa6f3ab0c3af9f6386d5c31213d8929a7c7d40656e9946e4cb54b22d7b20aab941a8c9fe4ee6e666fe72f8c00faf6652e42d2c49649e0b88dab1fb8f7b76bc36e2a246200368434bb0518b976e4c3916f42ea6f5f18c46f3ef2c2fa231f7512d1a52741fac220bebdbb202abf39fd766d187977392c8b7acbe24e08fff6db11eaf4c3620486326c9f4f297d72f42450497c49d0c422686f5470db51f0cca93eb76dd338ecf1ecda1eed218f2119421796e5997d4b5f4824e6b5312a9b6e50d9b5d2d76357831dfa10573131d5be6d354a8f52aa7942cc986ddb8df1e60c631ea6c159f4739f481f098bbcb32735b967baa24e2f72e38dec2787de4773a62a2a13d7c61a390f24f7d10468d58e06d90710044201451bd450fafaba0f13589965c239b772e5b72e678d9ce421c169b046df6a4d2a810f0d6e1425a8955283546c0d2eb715450d6eb77e7b5bce6e4f7e5cd435bf2e8513ee91827b78a6b862875f3a7cc349ef96ded751496d22a570a1fc0a991fbf8d54748ca5ad7d34b8ccce140b4f5c3edf2e91c81ba9e4db7d74fcc2c8c0c19731fb859101f4e108e8db6dfcc2ca80f2b12c00c5b2f013a342947d40ddd81492bcffc6a4b44641dfce4a74e29c715229a58c1f2bf18a44dee969d089f494f75d41bf262f5f0db6121d3a70765c5c8472e4988203c713142a074a4b4b1435376ef8b0b014adac48b16123274a8d1a505454708a6acd49723a4931999c741dce935229a786e37c48a428a3118ed0b6e520d17cff07ce94ff8133f4bb4fd470035a2fda8060301fd913cff1e2314a9d35d89a946f077d064f7948a49c06e6942f0dde111a568a4ba59cbdf8a538a666f0d40c1ebd70fb19424de8c14f9be1d3a23498a4861b6c83fdf8bc64dfbefdb42adc80a044f9f60da855e17c456955285d41ad0ab59e17e299fd762dcacdca2c4f0f4cf6131479566601f0859a1219be50d3f9f6172fa44fbe5d73d2ab65b56b3bbd92ac18be50f3f9be50bbc2fb42eae35f38a77cc3f08553ca0b5f487bbe5df842eae4db7fe0dcb48a91f87d1dde0f9c1b254a70745ac547fcbe8bf703470767076727a8556cc4efe7f07ee40409090db58a5bbf8fc3fb913334658aac559bc6efa3bc1f39b2274f727e5ab55bf8fd16ef47ce4f0e941c2851b45ab55af8fd1bde8f285a51d44451036bd516fd3e8bf72307e6e343d4aa45e3f757bc1f39444545b356ed19bf6fc3fb913393222507a8556bc6efd7f07ee400e544c989f2d3aa25fa7d15ef07ce0f14283844adda2cfc7ef57ee010e114e114e5d8b46ab1f0fb27ef478e4d4e929c24b356ed157edfe4fdc0994991d2d3aa9df2fb9df703a7c789131c59abd60abf5ff27ee0c8709ee03cc969b56acbf87dcefb91d3caa9c9a981b56ac9f87d92f70307e6e303d4aa1dfafd91f70307284a149ca0566d157e7ff37ee004e108e108e5b85ab554f87dcdfb91e3ca419283e407ce50ab760a8f33d4e0fe0f9c292bc33f70a62c8f7d1f1dbb01ecc33993be0d7d137db73ebeb618e7d4b4d734a7add34afaa6c1a0f802329f38a1ca2f64d90deb386fdcb6f9425921c9cf57ab16660524df3eaf983dd3c9f715ae781ebfb029453f893a1cf8c8b3039ab53115eaf07c4384895e9ebb870635e49b76c5d4d7af7eddc4150deded8aab54d7f48a868fee748a28ae521f8d5cc335f3154a5775d5215a03ad67865acff7bc422641e26aa11a4a972bae6aa76ea68f8266681b54c0314b593f962eebe9874cd7366edcc8f10ba737a777189dbae749feb66e2ac0a062d687abd476e6f645adf10b23e3c5ec20193a31b52fe5f70b133ae2e72f6ce88a16e3f5db32109ebd2679d4affaa7d56aa180c58ed251faa8e30fb060fc9c6a0c1f2e94282c1fae90cf872bc5860f77ca16714dc8488af0212701fa90957c347dc83b6228f9e832fa2646191fbda25c0a607c74700c9b8f0e3386133e7a8c0f1a7c741da478f1d17918c247f7e1072957f8e84090e0a30701848f4ec414d28049a1f5d1d94505243ec2a850848fce37ad5a581560f0d159a7550b1b52e2e3eb7765261079468d2d99a2868a3d26ae46498a30e5889b2629c881142d50e14d1c63c81f77abd56ad9b0c21b3e3ee9801274b0c41215fc60c808d6181f9b8795e105fa4d8cbadf2c56097247f2c826cf4e7f9e3d6ea1aeacfa87520786460e8f7e634b989857a8aba3b3324c844655f11acece442bd375b342758180ca086ab88a2fcb05022d23b0e12dbefd0daff1b9f450c3599ce53bb2e23554beb6e97cb0c1e22a9f4b0f2a2a2d5fbb5e3a329f30d9fc99b3163b494eda3ca8fa85738868b6628afd5451cedcc79387757a5e3a3c30595cedcdf3d4d179c9590b36816e78643cad1924933f724867cee6cfcbc6c5a978b2862779648f84c5143b8b2765f227a6a4ce0d6f592cdeb256bc65d9f09655c35b968ab72c266222fa436a82db9770fe7c3bc7d18b95894378dee274c9b8070956863feec1f268afad189768a2f95a1eb38a4db5f7ec59e25b06dfced3d5bd96841a7613c5951c92434dd45a1e4ddd356d78267afbf46242b12b0663278c67e2c73fdca3bd4924189800042086185c5c6cd8604d0a357a2887783e44bd9ca2ced6a2c6563b1875bd7062ba620afc9041de2abb1a1059f40b420da74cd61ec36dfe6c27187da102245fa4208d973f2bd32f67e796bfd83176ec187b44e2482412295c7929bf98229136a1faa381e4c3daaf88460dfba5e22a2a2e3dd438d23da8428755c369582a4ec35a719afab9f450dd86dbf88ed860711a167bbf9cc5eb15af5f0d685603c5d4921aca1f4a1457f30c229dd6c9e7505cb1490743e8814d2bae1ad66a45214019824f8bc54e6fe26a7f5a2d9d9862274dd142169eb458cc43ad166b932352470e923f401ff6ebf485548775e26af2c414f3ab96be10c57da1ff7e5f38839e5d9bb36720190f49221d76faea7153060f8bf4855336fac2f9f3ecf227aef80567c08858ec1228aef686670eb9a82c884806f1501ba2d6d4f9b9a1ade709d45f3861cfb3e719e843f963c3ab58a847a861ccb3e7d2830aca6958d573e9a17a0daff11df19862af4ec3d2c8a8d583892976150fa4a286e0330f0ba04cd021f2d02af61e5a75e39955e528877dd316f5c6bb441f79f48dadc0f5dbe570e3bba741be82bda8ceb033cef8fe4219f4fcf3ec5a94ca1179e9d1f3d1aa90dfc7ce4ceff6911359791f5d4d6d0f636ef87c3428c4e6458a683dc9a967d2a28e5c13c248fde9b447a3e5d183c8cab7c7181f5aebd455c9b236ae4214f8dbd60a7a0c0c8c0e514a8d4c7888a9765694f2c3cd4435c8194161c474d05fdc6be0e2a030629b354842a13082695aa0e38228435b08829425ac58831892245f7f63486aa6c0ad4a5d1eebb18ccd0917a3d4e894b163514091d206dcbeaccc3dea10755840abf64335e83aa40f2ad315fdc0988ae0cdf4762101c860fbee7a01303d3730d841143518c21456f41dbd5ad60acfe4e81ed4e6a286a81830dc74883ec455f47844d5c18756f54707a255bb319d9def567886b98fd430c42aa28621d66eaa6b186271b2bb01a42c58532709e937a6e37a1d56267ef4202bd31e9deb4e022eb7eb81590b68508706a3fb2fcc062dd910ed0247f61bbb8902c36fecc6c9f7f4fcc4b8bba506777d78f390d87c24e5e6fbdbb66d73dba67703cc1135e41e19f7b4aa670d3a69a19c9e0fb98767c5fde4bb87741a6cef711255a4bb4069954b8d36840394009eb54a4aaf6a389dd88d946fe729bdbad1629f566d2c67ca77b3a2ac5561f4f8a455dce4db23cf16238f8e09e250ab55f233c20fa4a734514d74d9b4ca457e2df43d6bb03ba8c1f6ca3dd149ab3686039480b85d4b591eed3e5aa2a06a51a4d4b0877c853e3699d2b214732a75023428fb864d49d7f1f272c74bdf4a5cd4fa21f770cfae8c98c0890c0c1b70f1840e6b73c0248a1d54810436316801abe3eeeec618639c5322c3be977b62aa57ca1865e49ef8538ba64879f623cc363076b5ca869110b5c7e836cf5c5a39d220b7be8eddb163b78c2ea99452ca70e54883ecc413277c4ce032418bf727dca2ca8f9bd9175e04fd7640e26702d8c74cd0f3ec47188994a21211574bab50853052bfd130637bec9684bab1269e7cd844539e3deca167df47121491cc6fc50924df44adda981335cfde45d1d5aa8db5a43c4724cfcef16e333790edeb2e870543ee8f9d698b4a3d87520ef129f51ce8d731a99b6b471ae456750fb56a7ee1a6058d547ee4e828a99b6b4ba81cd76444e96d80897e4873b154848b0807d337d1f260975154399a3520b2461f105152df82f08c6c2a3f727a1adc17627a07f8b54f08cd71d03cf91de90644a791dee7bd0d6e17c5150836c56e4465e2994ff0ec31a26247c4f260ffa2c6561335c83e8350431aa2679953d7a34d0d295ab8f98d15dd14b9569e04513ea629b54d83314983b1d4aad6d9e954f4b0baf4681dd52a97e9cb2af98b7cda79f3c495e98bbe0dbac82ff23458b49b278b84d0d12c1686c692adc445182f63934ef1c0a28c5a548f454a7809450d9b87ce6ac8366d53147942a1ce6fe5a7b79ea499b25d10ef1e1ea1df581453befec6a210fa1240f98d2951f221dbc494d4308ffcf61c38c2383238edc4ad698b3abdcb617afd64a74ab557bc22397b8c2826a3d1273b3571689fac03482d35c85e44d368dd2f26a4b486e4a5c776765e7e46fa3d80fa908856abe5ab45e74e3ac7254d6aaeb5fcc2f80d89debfaf695e289d7e520ed5e932fe10d97d834b89c842426361d181960b0956b8fd16b1f8c2074f1ec7ef173ee079ee34436afdab6c38bc6f1f6daa7dabccbeddc6f18b1a03d3604f951f38403308357e4c5c7a98de088e984efd88e6f4738100f5cdb76f041afdb0706171c7c3fce6c654e4a23aac488b0f51310c6e2b5037e6faf98d2d11f43ef88d2d8182afad8a5d52d1e80b46f9d423f5c2c845edefe8f3e321edf187c4ef6fdb261ada6f79979777698c31c6708506d1ab1a533d5badadd5a4969ca380845b0dbab8a6c1f626dc1a925bd8142dd9e28c2424f1e2084c031a040189d46fcc15f4a6dfd8124b44e91bfbd8c2a28c3132c33e72e4c89123f390ee6e9f37dd1ffbf097860b2f5ec658a30bdb95d965181bc094ca2fcb4e084d171bfb8535c7a7992ca770d1654acced3669578ee6b61e4a29378eda7753baabcd4deeaeaa5b70bbbb7b9747b76f37697db7d4994648c0a0e894534251e36f6c899a0d05b57f634b1cf13358c2082e3274464e4e129b2cb22083d8122d9b2aba40810b0b194c4182fec6943883044b299556d8803a911555576a8dc1926ec1092a5ba1c518b339e36374148c4d9015505dc4b2d0c20d747a96a0c33c3a2843d381194b4c07fdc5dd0a1b50274b4c2263dc600945693441050f38063a58d25ee840c809edad889da004a7df98cd18cffdc64e2085145a2b133f89222594242165e8b95169074cdbacff8660dba07810fb257d21e828fe6c4e9f0d7bf2e53f7d7b43831c24a5a396074f5cb50de88e42d9f09c9c3af5b669d59ebc93dce49c33c6cf45fa7e94a6ae76b576d544b952695d7affe685dc0931bdec829cda148ea03f1c41bf4b90f86111bff2fc5c8c4f04e665c943197e0bdb86f3ad576dd3a9f66dfb6483520a75f3eddb1aab15972e879e34228d46fe245f928f9440f22cc56face6c973b1cb41be6c507e9ce45e19823ff9e6b2472653f153e727d99fbc6e2eb7ceb7d76f7eda6248c0be7e75ce86ca0a8bcac9647ad9c1523a79db9baaa8fb9a739d497a91ce4f5ec82f4fdd0e529e3ce97b3a7dbe79dde6a52ec8698b6dc2a2866dd3495a1556afe1ed7dd3aa21d55556c686b7f70956e6e41539551b1e7fa7e227e7ba74f2f6ab77f2ed829c5cc57db40d6fbfd6af86175637b98a37a4fac9b94e48e727277541ea77fa3854c98ce7fce4b5924ed2a9f61a5edbcc2a4b9d6faf520cb903eae4e19041ad3a05f1503ab6ef869d56852737790f39499d51278453d0f3dd0e9d6f5b17e4e49bac3c9bb36c2e541ec9237978be4bcb63aba256d71cd5e1d08faad24fdef6b31372faea9c8a473f56e3e4778cdf18123fcfb9944c56d4905f47c9f482aa39e7c23668847f08a8bd304dda9bc211bcca47b5194d6111bff242f3be204db2c1cde99b3cf96d2c79a10ba4dd6074ea85f32302fef48f613e437cd3aa76de2176d9130411b2f0d30418536041095839f850ca80663cac504e9948927ccf1be68929ee86d5f804ca7704fa9e61a0e77584122b68d282265861f4714dd11fca2437b1e73bc25a7115811d247696fcc8a6b004d6171f46578d17495ee08492a124fc8015461b2fbe084bc801162478028c325861d4f9d887f1159b0421e5db87ba0554b9bd75e24a26f199421380308425a060c13eec970f36c0e9828b2c5c410612acb079bad8620848b280b2240b4d6c5861c39e8b0f5bf6c487fdf3fd61438940e3ac11947c23f96e9befbe71fdd02d9501166403bc1356122d58e2042a1c91451aac2d3e6419d06c68ca12269a8b3656c85734f96e988e8f98628fc0aa460bb2b77f387ae6246ce3e443763d210807453f50a28a2aa48015724b8b0f378ca2156c9104298a9c1063853b8483ff21ae7c708113a1a2a2239258c16a282b8f3eaccc7a4b5a60c511c480020523b0388b5f327ae0832eb65024042e9260710fcd0a9838d9c11831d002a70cd60dbe1d660afdf6085463112a75526713ea64420db9c537375b3dc2773ffd05ac614d47e998a515f0431d32f808c647df6a9220e1630c0533f8e8daaa8621d6ec804c180d8e0bced8420aa6d005175bd8008d9c910cf380a2e6a3475978c34fd99c3f3de607c8b2e93e2c93b2552f4f047d8c2c63d8dc42d5846a589f5d7342d5790eb2f1037bb6b159199e2d0f76ee9b9862b799f56c3c3d30d90fd00f4041331d9bd9c643b3206eb9746c5e37363a3c3d41339b9b9e562dcc356d6e5a1236c1382276c40e0a75722ec2c9b7e7d05c444f11ae27c2444724e1f11b33a2081f63801d797ba39173728993dfd81135fffdc6963cf99895698f6e80dd4aa8988a9d0c2bd339f8110686db7e77a5e2613bd8204c83b1db77c0f0c334d8394c831184f91173830f1d3893b71ff3edd26362cc0d3ebcf674b8c9eb80909c9bcccc614c9b382fd1943893fb88240fd5a0c9634c9e8ec951ee80c8b03ca26b9d0454ba0f0247580a3cacea2777a9618875a486219693ea9f86135e8be96e07edb74112c939ceb70e08d7b9d0101196bee4262ff44c5bd4981141f8ceb76b9347f3ed1989df7d2c495ef2386f739237fde48dda394af32cdd47f4d19bece6a052938cb0eccd2e1023035c7bef6a1a11185f29d476cd99e7e4e189c06c5c6ddab6d58a42357738c8e76f3a7f40bcd9d3923fbdaaeb75e58656edc66440f9cb77dc515f3a45f20e08d82b93771ec28431cfb5872b337d5cd4d57cbb2c3512eedb4e853ca4cd56f2d23a45afd33b9dead1d75734a8036b584b9e5635696d6bbddc7ae670ed73773776490075e4ec1e358faeda341fb91c79238e878fccdd2d69c8c3977e8e7cb4b9ec74d8e76f882402238465e30ed0bce6ed5a58e2469edc3a20be5d34d2134608cb0bc278c1b77bf2b71c683e7e1da0f976addb813a7b2197864cd3c73e228f8668df4b2ef5f2d041953e371b6e5f421af4d2b99eb35d9b4a8db9424f27673939cb0d675921ba516a29459fd167f439e70bdce22c2d2d8ee3c60d6f198d9ca970fd0ae137364592e766f00e07931b014b0bbedcf83ccf86e36061f1130c9d103e9d5ee882b0f8c9b77b6101a7df08408957865b1cd5e23772a0bc2587c70fc38d1bceb2ebb9bfe0820b39ea9c4e9a734e0f07aac3c1e4d5391a4aed8a2854ad4ba9a3a853faf3d4430a7bea2d1e4a1b23ac4c111e0242fdb40a4aab805a6cf810fc36be903fc4e1369cfa50d974ea14d6aa4e08ffcadc7c3a8bb7bfd20539dd6069f15627529db85ad656a9f3ab7438f4df0875a0fc06cac3e9397cc8f496957171eaf2042bc3e2d4391616cfe193c55d3c7e956e07166f697116e77a7a2cbe5d10166f711fede2edb37843f0e75284dfe443c8477991d3a39ec5519eb7733594b847894d55d4d393a48d69490d65eb599c8331b12036c5eca3a31cf50dc16f72ee70a8b365e6f8421c2ddf101cdee2d44f2d6eea82e068f958bcfd168fc5bb0bc2e2373c4711fe1667f186e06f317d210e37b1f8ec7218d2e246f86f380e2a5dad6af9505fd852d3aa1bdf9016bfe1d44d37bceb82b4dc104089570687212637c282518783e955432692372e6d38a72e93b48a7ad709d97ce4a52e087f1cd79197bbf1852b3f9de57399beff75bebbf27928830bbf2df5b03b7958fad969db4a874f1bdebec9dbafe1a97861c9089bf1d44753ef56ab885a55447566584314fdfa75f226914e5c4d333625fd04218a8997d4089d975c5fba0e4f26e994e43ea9c4a641299d4a6f575c290087a7530ac0919b3350aba494ec9c0efa55de7c7a21cccfd1684404a6f43408d55f12722efbb6c51433f38eef76662e383a7b9ba5941ff7cb19218c6cf233c242b0bbf0730eb3490d7dc7ca6c4e9d00ad2a52c4373fe7947a6a65484e9dc7ca8c9c7a4cab465e117e9a56172f0514ea4a829efa0b8c0b4f7d859ebaa4d4544ddf6ee26289f3866c3efa8420e0db85f0f1dbe7120401df8e80ef75fa04d2eeba8fb824ef8dbb59732959b26429a526bd352d88569134c93f0ca541a00689fc00840538e89fc0ed4bc81171a4d42ace973492434f6a2771de7e10a4204846886855c93bd2ee761e4f6930167d64d6aae0b98d98474c2291865a35dca0a1231d448331888578d66034d2606ca2fe600120ba358a82cba1f453cab8756ab790c8e7227d9631638c7524bf483dd2389adbd4e69c94c61829a51ee9fc9ef89191a6b4c555659fe717948edd180ba27c370cb893dc42e2a0863232cbc81188676f22a8676f9e7402815b18b86d6ee3d93d1b68ce9ff9a3c1954929657cc2ed6e1b99c0bf3246c54d3fd7b0de4682daa50f11f0ec8e009ee167da316a2a3f70640daed71756c61813889e7e617de1b976eca9302ca2f0690192165cc172ce10a57de1b6f10b51ab954dad4bc9cc5ce2b941d046bcd252487cfac91a495f885a3a3fff61e4ed8274a3a8067ba210634022b926a3e4483e7270c78b8e4a37b6a6f98834e28e0124a7c06b4ef2c217ff219a4f468d4a4568d3a97ceafdd54faed42a053985122fb8088293305e5a108109375ac46e7070b3247683845ea1d6d2169b3b883b965656a669a95475bc80ab6da356a80bae48199b61a292139d415dc9445d676796de7dcb2ececf257e3898be1b096e6b15334c8c839af6854bbfca73e9b6bfce34b288ee16e2628c1174540db75806f3808b31c65e8e4ebb904f88a5dd62a447b0d4c4a8ec3ff286bdbbf2cd762a3f72781a5c1ee28ff7e1121111570dd85474237cf4f578581e3167b963b7fe8bbaae9551a3aca2c61865d4c2e0765d076aa59636e9721b8c3b44a4577dc335bbf21153d3372435c987ace4d75f1c85aa15667d27a86d41ea26f5e806cb9a64a9c9d5b8a821f7704e60dc13fe61a0ed725039678f9d306c0a51a9f485bcf3ecec849b4e22797ba3cea786a50fb9c709c3b070b35f60c1a65fadda2facb0f37dc5cf293ff661f6965f2be9d5b24a3ea6c336d9b66db5a250eee0bcf96142df98418618db562b0a25fb2604e51782d35550f433bfb114c07ed6e094f2d3234e6de70eec89d22aea40403f3f32192c26060666db6afd7a7efa0fd2fb6179c49756ed4b0baaf4e83d2fadda97119b58c0ed4bd8363fc365c2af18cf4bc6f39af1ec3fac0c3f7f31927ca479c943a2e41d73c9b72bb9a6954ace1e2d711c2d71dec84bde68870319bdb88088a9e9dbacce3630aa742f55cea7ebe07c9f3493c2435aab5daddafcc66327693e58a3dc36bf31cc2a6e8e88f229e8f19798124d4041149e40e2244adcd84ed177607b2628229096a0567cb1c49c734e206c560449274b3c61c36dadda85897130766c975fd37011ddcd046e5f5aa554555ca2775f5f7e6f4ba81ba382e843105c706b507aab5ca20bc1ec2f0b4bc2e655f21d498d11df2d83625430f9705b988b0bab8682c9c5fe4009262d9e5159993d400d4c9b715d995ec99bab86db5253ebe7d999634aae7866214ffc7cab36f684ecd9034d34d144134e38e184134e38e184134e38e184134d34d144134dd830d1f9faed2554f43899a8dbe0d6200f30312e8c1472fa7699740edc6d3bbaa4e117e41e322e381d9c2ee79c207b30707d8cb3ca1e63dcf1f288ea82c3fc0d8970cd37770ce0af08cdef78c9ae065d35fa1c92527277ecda3369519dd33a201d71f08fdec5b68162e5693553bdfe6cb5a2500efe2a9ae2aba39c54db4624aed4994e5545c29eb3b1c272a3058523878b0e175e80c1bdcdfdb9184a31bc9464abf8a5145fdb566bef80e3e100509af11828a682d8c989613c3ba821e772b50a49af667cf6448e87e3a194520038a534d094534a29059dd218ea4e29a51406a774453fa79452ea39a52aaac329a594ba38a505a02f38a59452179c52025094534a296d714a07407338a594521c4ea900e88a534a29b5e194da406f38a5945216a71486d6704a29a524a7b407756e4229ad81524a29e541a974aae2b43aa594d21d94524a17d04e37a701a094d217fa423ba794fa4a0784c620c30c312b550108300001d800d3a3061e3b0200801700bcd0c0922a01380300647889c186c3c039070357e3eb3c124772120c244e4547c9854422e920b99048f505ce051289a483e442229d50a41612c94d3970cc50b39659b7b2d99009c964b2d20d8de5e5b3f2bdb81a94e4daa12e1297a0ce994692b09f3099902693c95446b55649b9adabd7cf6d9a696ab23bda6f32f998647125e3d369a724c9cd8c175d31357938973bbd8add4c3671f2dd8b772ea5d8195993f25052f19d4b252b037ae7b2d52be97249974bda14b56a06337646eea83c8c6810ad0c0c517a255f2fa19794d714a056bd10c6ce489f0278188b006565bc9e5e49990c2693751e9bb4cabdf328839d914204f030d2e03b8f3c2be3e29dc724bd92b35954328b3b577c97c33b8f4decccac198087d104df7944b2322e0cf56aba5c44aed87245979456e9106367e68e003cec31662bd3f2a457f3f582f28af21292b5ea460e7666fad8e061efc0676570bc7a3565321e594f87f2ce7b053b3385603cec25df79ebac8c0defbc6b7a35b76ed6493a4d0b3b436b7a78c86914ad0c4b50afa8cb35730d752b46d819ba5383878c84ef9c8156867ae7eca457f4f5629fd7931743f92e7ae75c839da13edc63f2f0906ff09d739395a9e19df34dafa84cc63ab257e7bcc34386e23be713ec0c1532d22b5a14000fb70adfb9067646ab619b9561efbc73222bb3cd6a90ab731e7aa5b9626ad2e0e1fae03b0fb233da0ef798be3eaf1b5e9defe895d6f9025a35f2ce755819e99d83ad3239003c9ce13bff6ebbfb3c8cdfb90c3ba3f9bcac4c7b278ba959bd73de194da8730074403ad84b570c2e195c3b3cc35da1daf9c9b9e4ebf5f2e119ee55009f9fa4d94c3693cda64b219ee16a0820f4932493c9994cce647256c33324a101d4fc24bd5eae97ebe5dae119928f00767e925cafd7cb8767483b36f8c8e26a349bc966b2998c6748353053e8a7cf595c8d64b23993cd996cce6a786624d4a3c61557a3d7cbf572bd5c3b3c33f2a961e715572397ebf57af9f0cc6887878f2caeb6d94c3693cd643f9d0af1cca8660715fae97416579b4c4667323a93d1590dcf6c4201a871c5d5f67ab95eae976b8767361f1a767e73b95eaed774cd8767b61d0680cf4fd76471a5c964b29ffee2714d847866abe11ef2fbc2fe50137a8f338fb3384b7db2e6a747f03403f75c01802fe4be9718be8fbbe2a7cb0083e905d78b7bfdf417aff3195703c30b33aee6a7c7e052ca21137291e590c9847efae702a783f4f271c9417af9fc74af857483e422edb4905c3748ae8ee422edfc74c73142cd48352d37ba19a9e6a7c36063d3644236649d4c9309fdf41758b495d1cbc7c617723fa8ee0b51f57bf9fc7417288da3d1cec835728d5c3b3f5d478da9b2cd4635dccf6cb6cd46353fdd85047593096932994ce8a7732497ad6bf2b3c9f6f2d1eaf7f2f9e9dc28878cb17b35e8f56fae9dcdb5b93697f6edfc73a6cad9e0e8f6f9859d92b8e25c5b0dcf90643cfa4214aad64f9bfd56f39d92ea714d7a48329ee164b03db81f14c74383e53149b29fa76f3251655c7536b3ef1f3950abc2cee68362945679d5a655235f19c0a7774a3a9d6ea7556029ba62c757c797cbd5dcc9e39a703daeb8e29c746afa939f9c8bf3e15c1ccff298de3f99a8a506a787a4198924a555edd34943adda7c7999e49d4d2320a64af16513575cad36db562b0ae52f2f2ed86ef2b405dbe9f6dda39de3892b6e53ed93dbc2c6d6e5e0bf79b2b3e9a99bb7cfcea6559d017cba89a7864c0ce0231f397f42c82e49abb6bbf9c905a0346967233b76360190b13900d354fa5c82c82fb9fcd2178ea0891a9c2ee37551a726e9e31e0378eca4533e0d4e6f8f654f1a9c9d4e5c6d671357dc837250fbf8c59a2c6a74ae49afe22ba6784a1ccf4f8fafce26f2fcac6995f65d924e4d9f9d929f4ebfcea6c1e99dcd9b08d0ec02836be74ecf409e3decdf9717904f404c5bd4d8e017b99b7908dc4ea0768c894b076e7b031c47c9a8dc5d0e2f0d5e80e34e5cda11b70691e14f31a64d04581e1b25a3e670c3ef46f96d137738c4e72f6679ac13a04a69da067710c65651bb5a737f91990999461af17b8f7841cdaf17bfb12a60cfc9346a18799e04fbf64d16c9a29a1a24483e9316550e6da1860cf43c9b4e11aa12924e5c512ffdc4574c3df99081beb8b322f16c3f25120f892736894ee41779368c3c24d8cd0aa658c114248f248f241654f6e85a8c1a893a6bde9aa6691ac7452e72f7e6e00e989521b9c67968c36bce452791485c9048e24824dfb180f8ad34c1e045fb86ec4f16dc5220ca73de9c37e71c0b2a0579472a38de64459d3ea9a821e89c837135fac26dabf4e348dee4cd575379697004ee80a1edd467b7c3ec82b4731fd82a0ed21c73df723e043ff791bc0578fd796b8241a5334a8c314a931652fa73e963dcd5aaa858886f2829b9630e4ab3b404982d82389e40a109f8b212638c31722f21b210641454548291c9417c1a6148b2e0044cf01013491b2f98208aa9b1c3032862644759204e0838b8592025708d165464c3354a581900ce9328ac24e1861b503484f10222a054468cc8201029cd521288bce8e82143e8251a89499051649432be2ae937b6844756654e0feaf6041575c404131cec1811058e274ae9ee0ee4400ec42d206e017101e4dc72206e013901a86e53a8cc342c62bab73cc6dd81dc81b8051405209e2f685e73edabab828ea598ef2a5f3eacafa3ae6c25144a46b788b2b472794c2139356f5b2ae040f3fd51a811542be958a99d6a9685a55558b76dfb640dce2a3bd5469a15eae42aa394dfa64575195417d46d05759b41f5e9bd94aef0a1c334185c3cc2a4b0cadebb0b85cadedd278a043fa1f21071c7b7b8edd59595df98ce94d77e634ba8f0616518b72f214b0f6d402d8fe840f00c7f38b6878b143e3ab8dab6eea53f4070db80bdc0b1ab6d4fbbd23c3accca4cf0371cc0afdbb03392faf488581ed1d98667e40782ed113d6a1f101f1a4ffcca2c10cb03668bfcc5d5f4d18650c36db601c1433201b745e596524a94b4a9f443ff0da3863b7320e26abb673d8bbcd2a00492032999a58cb15726326f5c313321b777b777e79cf29b506a589f06753dacda0c6a285f426d673afef04c7f71887b0c6165e217cb581ed2e516b56bb47ea5d4e8e1d4993c728ada5fd843f1a76171b5b90c51758b433f711587624afab655fa851525b74fdac49474ed66be8050771a9494d24935aa518d524abfa9335fda11aaf4a913579225875ae5222317d56595deadb8dd7aa9696270536473107257ae4f49279d74d23977bae46d8bd2bf6a0101172625ce491eb24e7f5b89ebba9b7af2a4ae4c3b7742b439638c518b9b6fc7ec1989bff98894398abc6996fce2b74929757febf28855deb69638f08da7ce073d43a10442e8c11458eb1b51e51dfc0e4b70c21018302dae90029603847acac8428a1c1c2188c53a78768eb232f23700fe90e8cdce3fad8abe429df301fca4d6a864cc9695494f324434330100001315002030100e8844229150345546790f14000e889e4e6c541b89a32888610831438c21c00011000000001099d10600c98d8bd01f88fe8cd27f7ce3ebd0fba7e772afffa6cbbd3f375ff4fedd78d1fb7bc3c5de72bd5a9c3ebce96f99be0f331f5604956441ea4f5320f62ad49951a361a0e0b1c459bd168162fcaceb06c89174c65447a199b4c390ea5de3fb0213fa1f1b01937ea64801ca0344d109f21999f05c24ae9ae09cbf5bcd07b081a865126c94082a3d48315839e68db57f0384c994192ebfbcc679bce696fc266668d96cba0cd923ac8ac402e55e5fa82895edd6d79e56a8a98a74726e63fb3856690a51b0054295690c05f9ef838d95b9bdfe2a0d91bff6e24efc6086c5a1abcfb1c1fa9f214cd7b1a499ef9881357006b27b01a61481289d351383d3725d76f333b9c1e57c15aeaedcbb6f338d979d22ca3db31b56fc0c392b58c4ce47a88dae8a3e3ad3d6716d0453dd056c379b9ebf9b47e7e4b690b8b5220767cdeb5dbb623cc8ec9687f5fd584fd768894de3c7f31f9ccd21d89672e9c6b62afdf21fa93257c4bd3159ab5db002660036319398683036bacd0d5c13c7291836173578890f5d580b03195feec10302e4139f9b042890102e2078bbb50dfa946f26eefa5460e7dd4d0fbacfa8d3b7ad230b7d42a49ba19859051eb0bdd63f3fc7cd2b2aaf9d57362f983022cdbe9b732506cb47ff24bd21217bfd761b114e5434529519a6888714fd0098910a76a16269d08e6a0daff333ce02ec0bd753564c7b6f47389b83d7c21d976f10fc3721015b44d937c7a51588919910a4ce11ca6f30733e626e84b4711ad398c63476a38dde88c635ae318d55a36ab2315ba6bdc11012da582337bab18d6f8cc61aafb1466cac37cabfb14c35ca7e4f72c69be3150c563a3130b9fa39c6668122cd5bf996e9a193cd0f57ce81db629af6dedfc9cea0e38cfefc389854803617fee9772e5e0e5fc5976d32dabeb7537b54d596c393862ce873eb61e229751575b68fae221dbfe2d9fea0eb9db4bc0a08eb62684801c1471ae68c8d81eb26140eb7c7459fd042a37fa59f7642366b8aab6bd16274198b75de1afb6bfa0c99f7c9804d2960716cf35951b7a8e558eba6e57f2f639c141119629ac372fdebf69e143621f7adb2d827cbdd01cb3c96eace6cb9e7f67919dec88a965268c2b8cdb2bccea39997f6cec97ebb4cd609b288a8ecb666c09a85c5d64365f9fe897abf3ed47c77e892bd932d97c8e193aef310acd57b084e54d2ef377d8bcade1751475ab5c6e95c7f7e0c69b84c5a5426dd29957c0cb093f2850e3e1f04f151f82cfaad37ac375837ec37da6fd837db6f5a6eb26eda6eb26e586fb8c6769751b9ac8eb0098c70bebf32e3d710a34528071360253068bb5181a454f894a787844ec65c71b4e529f3510f1dc2436eb349c928a0eb3af529aab248424aacadabb6b1834b9e6bc42c6fd076e3fa013b9de5950264760f6f1bac18891d3f94699664b18c6c14920783212a837221c17e04b36528e753bf2ce03de59b6a54c1b3f5da3cbb21703886e0538f5125a65b646465580ec665cc94a070cafae60f5ba0ea15884a40a419e13404a63a039f0a228eb972e0dd93d75bdefef0014b31422462c78e79868b5e9b5c3f2874d3207f1b4d9638dd6be664b207227c301a7f2ff84f26489e1c22b1be7aee7147273615e9f54a96f4114c3dc860d09ec4d3eac7879e86fa9d29677a094e3bf7cf158bdc978dc69df4a6743596e5d65b8dc74cdf3d06e2264b7a8036a877528f8a05622b39b93da5c91deb2023f420865a4413222653d9c934797d13f142983edc1fe827f4616ef5cc4607baaa08c62ded630bdd30d88a3e77895d272fbcf5730f5da2a46bc849bb78a11d13f35aaf33edc321901f60b9ba19977e73c135dd315082c38b852d79e0ce7ea719069512b1c142e10aa9d1fd86290ce85c8359d6d103300b0dfdea57b5fcf440225fb0221af805dd0a249e0747fcfbc11299f772d149663ead123b1717b1c698c0e717124bda6713db10f5a35612ed8f013ad98a4ac10af4f4b7dfae9da7020969c51a7ee014c47b610bcee2c69b9e254a6d33704685841fc8abc6e353f29f8bdf65af62dd850e25b80745f21b6872277cfcd7367c5f1c34320eb0c0378888e128eeecc37b32191268765999e60676eb3a7b744adfd5053b72faabb70e1f20786aefa69b1c34c09c0de720c7312126eae9d83d344d5c1704991a885fde74c8497193aae65643589c0eca931184e45cecfcbaedaacc1cf0129cd5565926895975e743c13334afa9cce718f7b942341504d483cac334d3e5271e25894f8d9b9f135cc98c584a4600d089c8ec5f9dfb88285f70d0a26c7e40f7db29bf6e25129eaeea3d1fb6e89c7b7c64249d74dafdce711f01975fe89ea641f748c60c198ae854d0533bf4f7b32fbe4554f3d966384682ab0b9d86553846fdeeac7f71128667df4ea1bdfe6623757c2c006e772e9ec88ca46178de22e00099527f006cc0c39e3ea0fbb37636bb624fb73e8aadc0703b01c2197d115ac28a8b5e002ef82b09b6aadec2df2e828fa00c8f420d847e985fb31fa390504660c6e4c720e33acf9739a83aa99acdaed8b741fa0f5362d05e380d46c48d2d0e0e7cb5095957abd8670fd147400647a13500eecf7b23b47b8e75fc2738ab63a2437f69a9c18332058e6a2805ae7a7c3aab1f5ebd2ef70126a3bf0414dd472fd1443580a1cecfd96afda9002ad40bb7cfadabf9182bc15136a7d30fe2e8f821b000bbb909f7d79bf70fafaa1035ad3d522f6697c03b7dafd01f11ef2b35d20745c7600b4e08b8fb4709680fbada6c79830cdd47950e8cae13c9d57fe316bc9ac39b14e0929837f9092c39d084d042add56437de8d1b1024480592100a52dd6fc1252548aaf1383e91cd271e637906523b9cd7af18d0fbca82652e5b96b2178fecff8e03bd2c05d7b8c6b02eaffd7724838838c690d023d5e9d1274cda674a8285a8e8f08418303e804e24a69a649401504973555165247b005c240a69ab579c92edbaa08781160a3042ef978ef42c06f975e499487b038880313aea7410fe1968ec56b0c44aa8301608b1e7e2f087aed1b2f02f944a024262bc68ee632430945235547864b26d7337ae0cf0ead79d093fcfb4673cd6ebb9aeb73f3f454ca1a7a2e436f7da27c8826177258f7286c294c7590ab9adc7be34cd3ef83f53dc563c3b43049ee7a8293c470e52f9ec3bb3fbca9d3cdbf8ac8e56923d8a754975d9d513cd2eea12238aebc76a4a40c60038488e06a6c97793a5c156247bfc366dde7b2e350aafc11940f265dd6e1fbf0fb7a5fc3a2782521eec78a5b0db3b339d5af0fed7b91d5af9c2855a9b6782a10435b0505677dc5ed2637517ad89e479b963698bed77553955ad85728c2603347af55c5549e33141c0898b5706be7fb44c9f060b4078af70f2290780c3db84e1ed395a855c9676287404458c5237b598aeffa21b85becddd0a82477e403a9196d725f812ee38c23a520b7ab0f53b4681f59c6c744151473fcc367f7f70bbe75daf0290439663870e972abff735b39efc58ca6ab7b5977c39fe5afd911db99abb6c4d5d88d66f540560d2918b44ba7bcfe4248b0c9451ec341ec2247ca0de7c941e17baca63e651efd2160d3ecb7b8a45dc638bf192da5270582573509fe5bc87a96ec68a99a54204a9fdc2ff0495b32b219319c1add1b5bf57b2d1e9b0c3296c3865b21c04d785dd643062b40f10435c7c612cc2532b1ef15cd53330391ee0463468b87af5ccf63275e932f124673319fdf21f93cc72c9e55685cfcceab375daa7a61de358b021137e01616c768ed962448b4c31c7e4b684a42352f72d632cd70fca1bbd13fc6407142756e6aeb2407ad97ba9ada09140af1fc0a61b733554c635e8bfd77c23aa9af3ae3c64f0fc1bd42c1fe726e650398025bc26c4f793a8766ccb67ace910e8d84e81c3b3ed4ee1be651f4c3ee182b022e1ff7bb6f0b258cff7b223963f015338e804a8c2770359d3867e64cf52bbab17f3a1a6514f3ba5f25da9fadc148abe966ada0fc208b41942d5c249d10be4096f390fafdd71334c45d8972cd78c519161e03303b97afd3674caf0e7107a268e48b7401782f84b9431b61090ad1a0dc61a6b2530b806a292f409dd585722a18d4ddaeeac083394d3197d23e02d88e8beda2c75499abc633245c697c9e3b82e1a965a46ab5539e18a1484345c780c8edf2e0a2d7b65f90e39e229df8aa48dee9be1ebf1d50d8409e86a0d0cdd23d1dee0c62389aa834bce8bc806cf7f39a98741e2c0df3f8009d11a6f8dcf8f5e5580eb46661e7a066d042b00099c1dd83fc47975da909b664c55716b71eb99c29577e0ae4707cf1017a8012c72fdd839362ba81ceba073af4d531a297840fc94c2d3cfa80547b8c9ad828db1fe0c2c05af5d0b0e3ea91466fae3cbed86c83ac3b56536e6c2313cb8de141c2349fdaefc8b9e724ae71b7a2baa6dfab82508843fc942f1c25965ada560c8912148599521fa33764404d9876bea6645ad4eeb1f69c0776d41ed320ce8415861c690efed8b49d57b03e6cba8dece39431f25e0fa7adfee48413e56d3b0879d24f624f63dd719065a4745ab2f9978bb6686b113e6b451317d4f002ae5e3312895c19103a95e4fe4a99f81105666315e16cc746b4ad119ca85a7408a86babe107d26b0608a1091c183b6d31ce2ce232b32391314b8181f9a2bec26a2fa820cebb4d5b7cf20ecee8e9edf1668ea97fb592fe520a280711ee9dedbdcb643ed03b857604f21d970923acec8831a9786e08fce52ffd9b64c1d5762638f842f80f89803eb73a415985e9c97331bebbd025c4d1451eec8bef82b91278ed790ac4202673d4806533b17a6ab141f42f772774c67aa2d0a58deef573e0ec98fcb6943a50c4d4287a4bdab130a524717772dc7f9af3456124a7a596ebe5678c2b3a5eb0530e50188472450a1583056db3f2347c51720a46df88d059f15fdce9f463b4c23cd1d13e873d04b5398c16dddb3ce66e0100ce077bdf5b8e3ca1ec34c940d2200fc1caedd9e96aa357558b4b0f36ff41a77e2e30eac5b5f51d94051be388b9b15abdba876acaa61abe85b1d300c3b21a45a048fe6444d21a56a8534c39cef2c2199db910cf414c48505071150bf4256ddec45c621ad5319aa71d8fae8976c840c5abb1ccc9814dae9ccf2762b18088dbd56e897147a8e81602da1a3a46f8f1c9ec22af127a835a490e62ef142e1a5ce3c71ff4bf6e9f4750f22ba5925bd1da4c0ab88b6915ae5594bad56227f161c8e1aa9e906df9409ccff2894da0b740443ab970560cfe57b96063dddf919f7a4928ef0e6e49df8ba9897f2380a25246a1060733ffdd51fde4b7b623124e8586407aecef9b1d21e8722163a069ae67ea9953e4280f4f469c315da2a2aee7d0b0f9ef0c5615ba2d45b939be6b17a275eb038abfeed37dc0b8fc541a45ab4a0ce4df8652503ad32c702a0fde9364d60d55cd21ad73134db76463809be2af2fb4d9652753c6e2028c489373a514f1f3e655747a3a75a1ae8f1772fa77eb76bf8c1383b7ad231a0c756fb38399e180ef450bfe87911c41327e852f4087de21e9ea05ebdcca715183d9d5e146619911f201b06a569a47cae0fe6c2fa29e5e8bf78acf8ed098dd07fffc6b99759dfa98973682fbb3a7a77aaba3a92536737744f4d2bd96853576635eef027cc03eba6b23ca67a36c138003b6368e9a7b861610eb102f45fdc4a1ebec7797ca19012f2cef0a5eeb99100face7a89ad797c437ddbbbee1d4de21edc603c6bf4c32aaf27e5ac4e404a12730a0213533d4ca85d48222c38ff1f5e03bb5f79ca9883f1a2c54bc48504d1e34f05e46fe4fd4f6ccf924157771abf97d0fca17088ffe82fd66043a7b737d2dbde08ff07a85c3eca0e9927ba2b05d9b4d26cf3927e9883dd8e99e95f444b9e48d0f7d8e4cffef7e7f2cf5bb3c72beb0cdb2092ed490d28cf3712a2786b38dc1b84aee8423b4c18a00c1796b38e7f4739f42f976eddbd1b97cfa4ada873a8559284082ba5a8accfb2852e3a34c5fcacff4c3d01427152de6721a821b79aedc93021c94e2de9fbd8409533025c012f6ffba531ae97216a273394fdd62e9af0858f19dc029a43adad5d67c69fcd946af25c86839ef2310381a78320affb632d7d793506c7a8eb97a8066f8489a3ff74564bdb6cc64a90ca67652f612651c1e1ff59de1c5f577bf1a8a7d480d09ac76519fb48af0e67337b9e60300ceeb3fe082c388558c7c65e191d6e10edfc808b88abc6cae77b5b6c90105a3b55abf9f51d698d7f0fef0aad91be9283281766d0e43793a83d212e7bf2ad8c87a9afed8094063fc82751fefd9478f86cb0b351dfac346fe81c8c48f9777e1f76844f41e59c1c1d453e2f70c9b937937366cffa06530b2782d9c4be10ed9e37e653a550bdd0c6d90a3da8702147a0b2f8358a4ef9e232fbae80472c99fa4a43ede289fd25b05bb2e052c0b413708c4eee42fdd22909977d7a68594fc800aea8f95764e30606dee6d10d5669f4721248f3cf7b171fa59d7f088df2d5bca8eda6fe26d9747720d9df704b60a54fa9f41305a1f994ea75b5e021b356b6c1142ac5565633fb2968a06434c848e37596ea03b08e202aee3703cfc5058e1c97d6a423c3181d2abf6d148822ba7fc3777817282e0808aa5c33c465816aeae9b725712212c5eddb6cc65568b87a467c8d06e0567d4ce2e1ce39ee2b30f2474bd9f052b86e18e24ceed6c4261a9a9579c47ca1859de51156d19988f1c634c0820fa3f130624c7a6737c8248ee7f1408c6a4b7f4366803b1de41b6ab8daf459649c68e0e348b2541bb6e2731886e686045f00645160ab27061a5de6a48df685faaab7b75d0da7f46ffe33077c4008339319b24db8a626558a14c7291b39a7ea4db52b314473bf3507e692941994c326a6b1b001bb26e728081dc8fc82e8eceb7be8c20f645ff3df247d9e49dabcb001255e779c6ece91558271a80c1e0cb60241ced4ad20e2bb5f2f541ff035e232897fb32807019fe0567b64576ed2f36fd3483f20cdf2f8d29ece30fd35f7c1a8c84a55645ece9ed60ec0e4d39ce91f3a0853f0608a156330af231a4061ec203cec532a8ae1ea3bbb5c5c6a3bd7ac109c60ce75d0100421c0969af8093ebc43538b13fe00696b5c471f8988c4e9ddcd54adcbc824f616e765e4ffd594ce32325f2905359d985cabd851416dc30aeb0658dc646f946e932476ae6f91136c5cd6370b0962908ca447d13656c8c3e2c101939e75e15929047df9e0e4e4c86a9abd2c44ca129f39ccfd90777d4eecee3edfd78d4c2912bd56ccdc643053d16ccb398cec9fc0ad26a3ecd556fba66f802b0685c93e28c6b2063f362934f9c64aa387391952f29ea8e8e9f7a1d14661a2720b3562eb4484f3f210a91cafca2edbbc0af6ba26645a229c4706855f5ff51588b29dec00879acf03755d10085ef3574a0192258a37b66c08aea7fd1be546bb5636103fb05cbad405a8d905466c6eb162752547c65aa162fbc506b6a31c955a695f9a3d9123af3a0f1ce92b068c7ac22ba9dc6832d8dcb38535e52f2a06c43d7e97288a417a70a921814bd0b148ef22ef5c51609b68e499cb2e6ea56e8912b39f79a35d7a2a8d9a5d8af35e63d15afa4a3bedb3cb97ce42656201512c194b4f81d6cf1c5cea26e16c3511e36d803a4dbf4f5a3d119afdb59721e9150b26ccce7e974b6c3ff6894c1743b9d1c6a61533532020febb3bde833ebed262ece110537a50d20c1c9da682719c6d5d7e862f465ba3d074ea28764390ff5277bf1b36c2b40a08e22292c80bf014d84126334048a4e9d294256e12f525da1dbb8b195f537f86bb2cc2b4a9dbc6b2e04f8de124868cb58dfcec6b78c4250a13695236e357499d9aeac34ab598c7fa2444bebe9e22602fc3905dc4a2d8102d50bb30c3106c92a15c427c622c7118f6c00f94ac2d43d2bdd6b2aeec5bfbd1dae73daf17bcc58e588376ac0ace3cb6e1d1f9b936b0230aeccbf979fed632210170c11feb4baa00196a7f1a7580faa7dbc8459a4c26164032f0fc5c7b2dc51157eaaefa0004cd6f841d0b6070ac4a6ae294a9ab38f959ac40aaa6d42392224f1fe099f8b048f9ebd020319ea33e229d47e1daa02b39eb6ddef0a00850b93fc0b1f8c26bc359f5e04568a76cb3e04f29a1d07cd28be53b395524201b4704931fcd52ac017366d4672097d20cc84d36ec8e1e6b21d87875b4813deda5700bfdfd6bb488c51fb088ba249137a59e33606a84a55233efc83c4be422c2bba2a03b424f6de40875a642b5e4466e2dfb8eabd24dc5e6a476a348f59865beb7addc32ce2152858713a325e57c8579fab8fe0a74d9b8c43a059bdd0e53f7adbe1b09182a85402c3f0deb5afe880a21572342b557f16b4ae24d34ed713fc331f1429dcfbd95b9831ad3aec3b14beeb6852e9073b0fcc8d4642e626f53340eac8507f802c10432c451ff7a2619a8204c76df00413b6f6ca17d7721275df76fbac12ea4efd31a116cab651839a99c7a7f6290f85c00cda5216ffa35de62076ee50047349c167fc6e469f3704de6c2b29e5ad2951e52cca27cf12ff73889083e1a5e2e7a8589a6c8d599396a318ebe68a8e39ce54486d1fd1bece27f413f666dd28b3ba00af059eec5f8726a4f9796326761db34b6b89e0d17cdd9c4f17f73ca1b0f04216a99ac7b7d0d0e09645108d63b23006cbb4098967cd439d9028014d655df082808fc0d3b1eb927a287dd2b4b4c7c99990d47de4ac142f3395b2fec14b4119efe0f281a00d0319ffc4da878b6e533fa7080e28461dab4a9c6192dbd1255dfd6142f00661ebb17cca0827c199cfea20fc85ea035ac1b443c4176f6d77b5967d8fb0b66c01a8e0ca5c40864ecd6780713089a568c0741d3bf296f431377442244763c0e7624e823ae4cd0df805e180cf01b722480c77d872a034dbeaad245e0cf2546ab366b78aecd27b76ced76031dcd9d81a7c04e20a40b8481b1ae407c81f50a8e8415363e5b057c2496c8746277d724b1dc74056a9410b5c2f562e6891a8170cf1488bb28430a09650afa98d303e5066a4fdf18963ceea5bbf5775022dbd88c68ae4c6de87f0955be3bfd41e4a04f55bba41d42351aea7da8e685a61d86e260f933d3438a6a4ccee04cfa0e27562a2dba8866eb1efa813701da51f5ef5432d447d5737c9590acb4c3e455a0d50a752b9ecbee0df44535e7dca026449f9329489cd6f3c1a21899856299a920b3d40f708d3ec70b27c91d3162487f892bb5a48a4e6809feb243a425b36d0acd149cb71cbe9051d02f40eea3038521991890f02d6b054bc8f5f544a64632ecb62c45422b454986b8512540c199f7e58203d7675fdfe4b3ac46719955f8b1b687b9c4a3fb03697b70059fea381da9674c7c34006f1de9b0f4356b2a7c51e23fab9741cc50c84c1340b6340bc859cfa2cd2d712a35c1092de28bed0beeaa65e2da3d1b805ddce327dd6abb8e71fcec3373e1da132969df1a8b39217d345881a42b89b8b55235f68ea68a9bb7349ed0e42019f6dd66cff4f9af69437af324563cc28438398edc289f243b3810711b81d1d8dc7700b1b533a6e6e7d6ed1802fd38236c5547df8ff5fc48ab0792601618d38bc6c1582936edeaec80450e90317ec1aa07e1deaba0e75bb6910248aa912804ef854f59399306f4da0ad3bd164a37f6477ad102f3ecd19bb8b530b4e12a522d5836533415abf01256f3647760cfafcbb83357ce8041bad8b803b6b0d938f3e9236893f39253922f07ad462b8754ee2148525e682ee2841450a40f04e0cbe47ce364c4de974127636e04557be49579963e92b69d7d4c93f19916ac7b3fe78b809436873fb54c0afe5523760ea1837ba97a9267651434d9fd59d5c46a09b0e26e520213457e67448828c7af74467c0d054fcd0d24d0c1bf964b485fa7930fad8e5058560606d8350b3684cc8568e7470a32239034e87637f6921951346ed539dd526cfbf009a055bc2011270f9d769af3138ec3e0371345e2c3d21b593912e69bf5013b86700235a352c383ee1289d32e3a935e99b6fbc0eec36b079ec3fa493712558f53b4b1a1adb2a620c6a83daa3e4614289e99032cb73dbe44cebe282f1de2305d699af65d2fe1c6294d48ade3363968c214bf626ef9a157240616dce4c9532587171082f5631e30ebe78c68c9c174a5f86356831415ef084bd0ec1519f14a9de70c048741c811f9fe485cfdcfef1a085b519e2b5ea0e7e567d030cb96cd89384b721f9d86d043cfebc29cc2e64f8927f2a075c6bb5f4b3dfb971ef296c7524eb51e6516ca8b2b2bd0485efe18225d35f5b19acbab73d1e88b8caf1ab91bbc2500cbeefdf7a16d54aa5899894c746ca2fe11c3624f064d161fecfac13b98e648c45a0cadd9959b07f9689e27b01f9fa0cb6f1c02b3f98a6c8091304801e1dce9ffe4b443f4eedcfa71c04e5db178cd8d82b3ecee8eb6b9847507fa71ee6a1a31e35e5c8e845b1f4722d05ee4c64a57eb8d93904aa1093cdc69dbda376c02ea13ba2f67072d179ea37210fc711a95e11bc0b4abfd083bc4ea585f2fefc19a9368f297c3a6ac1a18239328e8c7196dd4d86c80d0f327b5bc618e435542058ef342ea581b90798508eed255c93acfb643f6e2816bfc3ff9ded2f42ec9bd991a740952870b67b550dc18174a1d9f11ce3bd9c6e8ce0f698c5f0a26622b4e474843002c250dc6e1b2582936a538518a215434e728ebecdf51f39121952bc532de495cba1c87451fbc831536c4607d15c5edddaad63dd7d0fc0ceb6f946d6756a46b0fbd058de3557273db9ab1e00b56599905c9ce175f0d95f5aca56996d5002b92ea16e41a1652aa184ef49edc53754d71c0b0359bd5190fdc2927e84024d7e31461609e786a9839353c7220b3b2c76570bc6093c2e53363864a1f187f439a90701d670458e17dd9226207925b185544acc220e230e42e328cb60e9a8afd9176d596e5ad6d39d25f3c3618a7eaa1b55d82c967894254bc734795f86a32925577925bcb057c538d03603e53d8ebd6b5f4fe716dcce432a1aaadecb7f08b5af2855a6397bca59a00fcbfc03b1fcf531d8983124f6557c076281939f4cc639f77dc199a0b1e7f759f1c2212f21458592697c7b02299ffd7238d40e6cb57858727a18d06c896e8ffb034dfbfa689be0b73dc707a4e3bb839ec2f6b247bdff37a5bfb147a3f2f98bfecb9aafec0bfbaf1ba15b8e88de7e64d868a9ed4135e5acc39e08267287cbde5bc51a492d2c516439505d182ea37d2954f4505fd546804a56c3f33a6bab64b9e3ccad55beaea92bc73c27a518ef187ba41b1c005a3a9300551b87580bb7f793c3c56d601d46506007f329b22bbdd96ce44b67f31980f6c35b6c1986496d75d766cabd405ac9e6402a43c1151446d1312d14e93f55f8ebe9b44fa7e6472489f923efb7a21f0aed3d369a122968928922db3a6e3be18fea35e32fa2a23919a649ce145dba381c5b7c0993899388375de73f261a9cfc7ea32d198c53618cfe8ed3e4a166e3dedbee09aa39ef7292bdfb0059e0928ff88412d1dff323ffa6b3188440623e88667bd56f863d662a0772332cffc46648b707369a5246c3355aa1baac6c3af893f73125bc35077806fa4d70eddc02bc443b412058b4d07065acfff5822bb590210a776f44393edacde9df923dd70e92c303dac819d382a2d7cf43e242796a24e6eb892db01946f7d43946004f098a24721312baa1a9153b693125e8549630ef2ae316580793085d9ead09bfce017f77f48a45dfeb67609228d63e2de63450caf1f1321d67e3e0d1e39fd9038d10c44901e0d1b76bd91b22af860f908f9af42dd57851fbdd4094aa72d459e819a57dfc4a202f67331e82a4d02ab62b36a26533728672cb62ce94ffa58ec2652a06c66c74f2d4a77febeb1076a969d5ed5cf1e64c5292420ef0ecd5ef5a65a99fc248d617b23d303b68a03a854e937dc72d4a8117c4d25aa64737e613423ea5aa6228a20b6b22a02554126f5b068921b182d2974b520f8d2eba067ec160d40b1ae7212c427928aa5b0bee3fc2978bb3b5380417e14b63ea014731384640ad2dd774458afe0708c44443223e3432c0f8ba58ed593105d71db0ab7b830297ba571499c209ff3030f1165545cf1c46ecaf0e85442b160b0d82846dca8edadb54e8f939634b0b3a5b5b669ec20c95fa94600f6533966f3339e39e1d39b04a649f2e3abc483f0666f361e5ecaeda982ef6987aeb3ce6096ba127ddee6acdbab95ad043fdb38e5fc582999ae1416b12458fba602428f3601d407340e506cc867e7c08f7e2128e4b32ae560862d355d75a4979a380a3760824ef8a128238924742af8d4e6fba41989369a3ede5ce92ed2d15e4883eab88e6f99c7eda26a553bc2ecb4fb264ec3c2e58524f22b5e8caf50f990dfcc0e6135da4659ef55a3f63ea6297c848236ba174ea698d4b364f21bfd3e5d28b85745a43d756c9f842c8556e57cb48a5535508825a3f5ebc40cb4b2cf73878e5fe8eb47ab1f859a2c501ab897911bafe3b80d92f7cb57dd0b7f8f6b0ba445c7989f8346cb1ebd85dca5c8a79dc5b10284162953ec7113ae9c54ecb89006c00bfa70dee5f2c0cded1b2ea1a5fb1109a3f3b842043cf7c8b3b3233d761beb89cebeb150e0e28842ab488b24d245cfac00a458147cb43f9465a23c658f51bc18344faee41c02cc5784e52e00502c7d008b250ea11016acf16a08e7f1c2cf1d8f7c48ef2527005b890f04b28e0bb9224f8d294245809155364bda91a2839623bcb14dcd55d42cf028ce3ae741cbfad0e52d08015e3165d096f5db362ce1a647a341773884d0eea5001098f118a6c433111bc3b86c1e00390d613d2b37d93ff748000bd2f0ab609a298f5b70a3b464b7b32d7cfe7860abd809483ca54dee4e40a08f678d4110fd5aa627e447a49c62c60d3e7d5e5150d6a4993162a9d1b207876a9fbc651c6358651ebf9718cd63580069ddcb1591ea6dfd48e40fd0bdfddd18b8f41afad690e25cc9e14647b0445225f92222ec33ecd36032bc7ebbd9ad57a339afa79a36cf02fab0e898a1f22347300ba1f39f97eff45c6693a6978ba15db117af482e32758c26455a19e629865cc64c362b62499d53a3c8e1826c5806bedd6306171a489c8bfbe0315fd184f3db98fb98828d025ce93ab2f14004135c34322763dc8794cb226a4a1848095b625230177919ab68b71dfb215c99afe31ffe5cd10a1effc8e2e8382cfb1ff491ce1d4c8f01aff1f0f9b061a270a6ed45cf1e55aa8e47617d4a5c2e5cc1e1dd8869279bb2c7a72fab4942c666e818c0eb05584a52ecc18c19d0895e18bd216eb70663d8749d5cf9ee3a860f2720abcf2717af90802718af2f177eba4ea6a3a2c5d34bd6dbd10b2341e32ddda11420f8ba7903cb5eff8fba12ef356a072cecffb83316037e85232a31751a8ee09361a103b04f0443d50925ffdfb915d04274c33e20b0e598619b8606f6ea248e02c0606d58c8fea9a8fa0a01da650b66e7371e3352f18a02c42054259418e503634ac06956129b9d86ac0fed4eb1e1080fcf34593952d7062d624cc25db8f97881af5e95e8a54aed065689ff2c84d11d4bffe465459555a237f2b013e6c686c342ccbbb770a8f11a66fc37689c8bd789cb4210a7a9032044c507678a8b8e7ff1acc906b54dc0e8061ef0533d0d53c0e61349c9231d81a2df17f20084905c731d88212a23ef490441547045930e301fde1c2fdf1441027c6602fb8c95415dcf3bd4e4051629c752730b9ea83e079a20e7f62cea5a1959ed9b0860e956e1fccf9e57848326a3c3cf3e21ebc79480b61c045a9b89804a39f414efa77fdb1e2041a99a513afc2caa6dfb762ff64f68adcdc6a88036d57b2aa5cc90d563503b80066db05b8253faa81d54009fe0fb6993275ff04e23a3d6056a3a80ee904d93a501e95df23b287aae5d036bd1cdc6486b56808d784e147ec54898f2bf66ba90aa5b34d21f9b055629b1cf6a439746f7e308b20819798c9bb19ad3f005088865e20aba44ab31e30223d2416d63248fab9f62a8dcae08c5f8535b70a82e78d50ff6492c97e465ea51216f0a1339a5fd4070e1b0625ca5704cba308631165c04f00f09bf1e3706738c63c4ba47ba4832bbaea26f041e74d8d69c941d4b80f528a7340fe9801ff23eed80e556aa824f0f6af4b471c026418a6e88861be9c47da30646b9196d56d0a881c77546c4e28dbeec0216d203f28b684ebf6799a32d0bf52732f92c6551ab25cd080ba1cfa796a167cde24bc514a9a72519f5b68093ad074da546047893467c16c8b220d0fa3357388b75382fe96fb9d5fd6b12e6351f98107da9721e7cd7f30a2da737bb52e277afd3637b229aa34240f7324ba3488e64fbabc14665683a1b34762749db1473d8a519218c8ed82f095845c248229baebf0fa6858907342e36cf757601d48c91bc600768cb1328623b44c4841950598ecb85643a40c54173b0aca1332d36cca94dedfd6807e9345628a5e1102604d748c7241159ef0976086c1f71904c9db0300916659adc4286588b01d0e95958bf4185e14aa5cc03c2d0c6489a1ff2a3675f2280b8148dc4b27b653218cab0d093248e5868c2bc81edb583ea63ecd71cf78d9188fd6c42bfe5ac1c9911fba1bfc00c6a106c22b92d0755ab67a44c43c184c7975747dc77f7c20a14996cb7ce77b6e9d9fbe40a6bfa3e39c22d1f8a8b2082ec3e4a3c1fdc07ca8eece82092165e8384a8c72b151d5ff6d9c703bf40b887f74e8ae7ef54912f6ac7a7223fcecfcf5f2317ddeb31b77e09902a200e95f8b51e4121a61518b9456ac0e094f410cb82ac58bda31f6501a8562b70921db16ddaa5c3ac12fc1cc60d379ca5eba8307e2a7ab7d98118810aaf164b6a24ca72224843ac7d43622dc6569aa4a8b2519912eff31c55c6be7e7cd5372f60192c646cc856ec2f493858e9cbac73ee898c5d773bfc6679219edf20d1b1097076ad41cb3e5604e6e42e4c228f2563ac3589dd74b7ef94268ca969711c68a7a8a335164d5392fe24b1041883a92414c0138f31beb40f849ea575a15890285a40ae31f9b0b4a237e0588d93bbc13dfb3b811d3c021b37295c4a956c413c2966e73eeaed87b53150f920f050632f3c476853ec74c8ea03f63bd858abd034e711baeeafe7be43d778083cc6143b0abd4e5603c12f2aa78977a879bd0ed04e679807ba0d8ece02897534feb08816d34298049086b38f512d4aad5baccf7332b7eaa6df37ba9a9f9c0bbdff9dd55a6d0cf82bfe2c01b22bc37815a9ce65886e014a1e6f28b5d7b9cb6b695ad571beda7e6b00266f037dd687e0adfbbdd25174897e670692e61998ac3d1017c5709dfc4ee1f6c039d8ed8242148e3df4201ad11d4429407f334354068a2e934050d000640fedd00c23241b11460688fa53bceeba1fb66b2744d63314f2b0a5e5e63c17be190d1f8cf3776378ade468ad3047cce34d5ed7fa6e96a4cc7e2906fe9808ffe7ad1fdd43ffd03d740ffd5574c3d7fb20db809928ca5d4d048408614e25494576951a2682ea1049740e6838c3173b10dc5606be1390a008396c2f83eb6e25c230119c7c885a4937a298882cbb2ee8463792e953f89d080ccbb6f50843821c8d7e9098ad0ac33382597306003720a49816815c99d2ad19dd8b1e289b6490623fe1d970d4bcf9067c98616b3689fae8198baf84cd6cc1565f351888fbd548de390c2bc4c44ebbf403f71f7adbe44dcc1b8aff572fc5e4b15cf3a479cb564ffc4d6f407ebb7c94858b7257cfdcf9c5d9cead53cb9271796aa4c76601534750504fe6151148190585c48f0381c03d69649adee925ec0cb5698d473ed3b63030ee19252da07e096b831cd75affa8e6055782406be2bd45a655bdbeef4ee4cdfa305934ae7d4bf81c7a2c5a8072b62615d433a0b71ce471dbe6de0111c35a80d018128edcedac639fef87323d542df3f204cf4ef9c96d507203b3cd7256e0a8d07ae15e4b4b93e166df9dd1a98192c6b136ff910860586b61011fb3886076eeb185ef8aa9c56a930326fb7d3203cb562a57f515a5585c592f901f9e1dbbcacdf01f606705588acb789c279b85d686e957e0c269bdcd5af4a7e018255fdf14b15f0dad615ca603ac5172986a49e8ff799da028a06ce1b0dab81a51e8cd6e000a88cbf1cca76671f535a708126e98198980fc0519fa3d1eb9e0a073e381d06b9acd0eaded672218564615f2c1a3a780fd53410d85ef84f04c0ea7066d1cbdb39cd4b6a84db4b010810c70732f32d08c3943aadd3de0ac8c854217092b0341d7840e97ecd308632219b80ed633d09e247a931080697ab39f48a945610013fd6dd8934bb6de71245c3e8268571af640e1754241132b60892a88b1e5b26e32fa981b995e0b6ff2036e09aa8977be6423a26e34a95a8ec613777c82d728ccb422e07dbd6477a5a280f46ab3527052d9a282bd7957c17bf66977c9c3c60a5714a6f3f192c47eb84818f641ae77370da8de88059aeb1d4a2885246c00aa4ec1bc1a9724792bf9a358fa2e315ffd939250dac065ee3b9440f9eabebfb11847aa450d51e4803632ba199985d809a071fc4c3453058c53fd5966f1ffd3417f160b657756fbce5c4c9532f81e7dd70a2cf463880dea3a2a244e39fb23258ac4f6e48e2eefd174954ecbb85d195c5676376e90f47efb51f70fa082fab0af1fcf9dc5efa2ddae49e549305961353979fc0211ac244003c1d20a930dbb5d58f63557475358471d272de4dc86e4e69070db626fe924f01a999504a7dc86cb24b67357e9a72c9ed60377efd6014b88816cd640ccfb83e81dd803520dce0e2719c325d7f4e6e701444c042612b9f30aa744f17b6515ca5db78dc225fe97600ee32c8af199769908ccc0159aad6ebd3db3441d329cef3fce895d489deb2ca1294299746658ba35d9d6b9d3a404ff191e60640d5f10ebfe8591488a34ec009ab1b16c4307ca78e78bbb7f1fbbeb8b43a105db97a737137054a727ef46cee0a86288f6aa814482e9fdb093d7fc078a28b21c7a495cc27472dad0d9121c4a991cdea3d75504036d64faf7f0450b56850b82acda7fbbae32a7a2066535454663816c44aed10ef07a277866c90730f13bb03683c0783eba54cc263e8318100c467cba329f8a8060900f3be0e108a262413eddc6c42082ceadfa93bdcb129a4f536f5629850651fda1089c346c2be39f0fb04bec7e04081c1629fa00c514041e7d2157202a3ed8c0e5e9ae738c827bb05d6cabccafe3d23add0b2009054a48d69dc8ee3b81a5d88f511f8d2485503f196e7d0ca0f82613edc6b864d49ec140fa445b9574e53a8d17fe3ad3fa308e8098821e86ac0fab46a975f0bdad07847ff786dc58b297fb490f0ba02aa7e83afff44796a44c51285339c07d698b862b2912dfa603fda22e9039bc1a123030dd885625bb4d7371615b11d4ea9c91c20a01f200c9b8cbca09077d507d92687de6037ec990fd408ac87a1f9474d6082b68b07993acb585fcb3c7b80808fa21b6ff1dc1e28fef90ee5b1fd93d7a61f62df42f9e794997ad28ba7ee4861f8afdf444a97bc2a353294a064a0fab251741160754b38b6bd7afd5517509fa1c38c6eb89b6c6ecb85c14d1156d982710186ae370295d6f79ebe3743ed48b065b2c06978e0797311471cc891e87341de8c2aa7332739e4232743dda7dd85846867202601442824ea31b534b8b07dde6bb2feba838dabfd54539d4dd7e681f805831784b20bd9fa61500ffb2482cdf67a431cc3beb42a8cb6207aded5b8baf8ab9f3cdcd2934263fbc95fb0c3749854ee54fb70e47936d04fc8bac45bcb3f973fe99e22bccd41bf15f8d6fec89953a4c7e89d3d9d6cb27d4ad6c400ac8fcc0c3e11c9327cb99e5eb2a6a76a930ffc3b9bbb4f89f2e72b3c6a9eb31e197fc800ddde930799ea92eca5713a00b78de997c001e84ec5259e7700abab3fd45e81386728900c86a997f4bc3e95907e8a3b1bd9e8b1d88245bdc0fdce307729517f09a2a7481b719398d0d795caaa70be6fc59a93ee52aef05e8ed6681d8343284d1510eaa1c200bb4565b57981295029b8605b1f1730c78cafee0d128e7364d83253ad630c03849db23a1068f9a0a82dbcc8eee058e67fa39862bd651033f1745799bdfa88f058934ed0b123e8c71cd1931fd92850522021847776cba3832f15c426c1adb8cf5d71e34f334195e5bce4f5c15f2e70d07f7bbaf43680607c3f157a40f93dc4b1b5ac074260212a51f4593cb1d8013aeae1a22326bbae5e02037d8b9f2b23f5021fa0fed9741877f6478a690944eaf34d196a990c14cfb95829e091139cb362166a0a14e232b67e0eaedb4932df909111787ec54dd7dafb1f51aace7856595fee612a1260797b3c1432b29959cd6793aac3f0358b5c8fafed3d00c6be0d756863bdbdea72d6c9db81defe04801ed88094cca39be35ba59a1bfb31c493299e52ffc8d74b8944db2bfcce259dfb1c0bd08e4623ed827a3cbe676903a4dafeeb9e2c6747bec83b63f0f2fa5651ba2e393869bb40663f95670bd9c16d9873c4a2ed815bd928dda7638f65047322d06047cb55d01f1e5ed1160bb4d180dfc2ee76a369ae3453e649107438e25d14dff3ce95300b4af5ecac3cc2baf9fb34378bb6d4a7430c6939721ef50f135109e60adf1f21e69e52654516a53a3c970a65240a3a8b35bf28dc0f37680478c97df692ae4a4a42ba2dd36bdd24ffc2e2f5e74d9340ee1442a695f092f095a14efae1d26c3040685396bb84dd9dda191198c69b03521dbf734dd15530bc5b028b096e8b194908836666207afc5234dcf3412dc185ac4aac1863f116aa011cfc10f7c703cd614c4bdca0358821d318d40da730a7f8de058c34df8855328abfc5fe21db37bb992d8d26d1a208bb32cfc72243b9765983282df78089855031e529c2222d6de9e6d732fe6936a2621cc48bffa680a62977924c96ec3fbb2bf120007e154662afe8d32e56af9243cb62dabb0e5dad5b7318b3006ebd7b00988a9c0df02ef2a7e8b983c4897da931e0ac9455c3167277cb52cc53dcc6b964912043b6a42c552091229bca5b56b03618cb063eb98d1b30b735a349e4488c439051444c321e6f5820b76890a021fc0dec22fd123f9db80d8ac22fc68dfadae9dc19a0663454c7d626bcc9a646d0cefd1d292611d76e840ba4cb8189385200a1ccbe5ae09a7c782f9e7ed3fe83d548d78e1e3d02d55b144861389741f0b8d068b3798006bbb65c389327a9dd66eafe114c2e753fd7e1d7b5f969e9ea678d3e85cb079b41204281e2988a3cb4abf4b0a720113baefcda58e955ef70f63a680c55002f78e94d9c46c7db0b11861037190a017323640038efef97981855544236c43ca8cb4bb5e56e072827a31cf477c16ca2ada52db0e586eac0e20c8afbc4a7a54b82180e845b00192f50a49a0237ee2e0524348e4b94e083a48725a79e48da777f8a64e3d7c8684a77480beb2f3ec2e1604b2a92b6199ec9183b641e309f7814d2a47774abfe1e03ebb022b9d12eb71aacdd471ca78fb1f6d43ec1056281aa7ff7831f78f11fe13d847fc11392b28fe9a470359654acf1ebaacf0fed82a8e67931c198953313268dd676e15fc55122b1f63ba9662ee4d1ccfa48fd4b8bf815711d5cc526b4935e9beaf177b92f1226b1d442303ca938eb5d2d74344bfca156b35781f8ec898bc097b50bd56f6c44ca516ca31dda97268754dea5e25844ecaaf6bc1aea5889e96523735b1fb596492e06c1aef4e361bd6988948b622a28971b5e87b291e571c614d87b93441e0cdbed8dd30af49cf2cfa4825ac0e843fe3a04ae3e8cadfa2afc6d0728db3ca317cf68ca8955574a3cde7317ad269483d3ac32f7130c51f7e0e13516c0949c0ad9673df707e986f78f8bfbdbb0d3a6fd2cd62bc7084f813512d56e1ce82f525ad5c3a90dc265c8425405fc39b91369188e03b8cc948f55eb3e9818a13a004e0f600c421b3c4fd837a0c3c2a9f450b0e5951e84f054a854fc6466bacb1d161a47f279b01484c8b980f3b1ccd216dfe41369ffcc5ed314a004ca1052dfb3792a794b8ba4c612702923053302845ca7385e4574f978d1524295e6bdf8b77559a3b4ff8f2bbe9eae01e3a39042e0417846f37be98c2e40f48f8ad0b0f32ee1555e4b83b908e8397c847fd824879333459d328244a5a4f4b0c15d966cf0a3facc6626d58c78605f3089b1b83db5d9d06fb9c099c625b805cd1c0eaf14a5e7231b4f5c380430123ca5771f213ef750d55aa552c609ab0194db5632271e4311d97842025701acd1926811a68b9b66d86c9f7c36947b0b0d0eec7b9cc0632749860d5a2c3f8b4bcc1813bda70a0920356bebe1673d8239c40364e507b18fad7512f2156ae66b697996775a26efd07119ba6f44a535cac308394c8c96bd92b83bc36ce9dd2eabac31a9ffc3a523a5f42baa92110311b40c2020434261dbdf74f6cbe9a08ec0e7c437a372ff33630cba616ca5931c2ec321c5d2bb476c28cb97f419086bd0350d40c64052d6c107d64ed4890c3263d23398991ca3c1d09ec50209241d702dd6c506466e19df58205d1a7c9d9b27adf12596e050777d665b4fbb4bb9d7c9b7f0c58145675711a91fb822bd1e272288561a470deba3fa19f8c541fd482c7eab77d22f1d34b77b49bc84e5a2731914acbbb5c5c5e210bf0b84427e43fdb6587b0641fccb07331949a32a1b145132b90625489f9ce801586d0308889d742183e48f058afcfb2d1849a32310c0f6e39f63527056d82b2445d0983475d0597e2789be109a30eacf84299f8ff164490730c0481b1d1d077aa24ea6664ef273da61eb15ffeb1314602d1e1e4f12bd6435b4bb7149f9954b9cdba34f13bf6bb0ea80a9ca93004a2c137f43efe3f4df18a49320de1acc34f9d1fc8c22ced1bc8c5e52f7b495fb4617faadc187f186ab49beaf894c071c3a4e29a4c111087f95220e34839deb0463d6e2d35c6f39accc619727831e5d800cd52ee40fcc4288864067fd88462bf32b1590733399939b51496968d2a1326d857b9ca2d14a70bcf6958682bb473d325a3741c5c0529b8ab2de9a0c723c614f05058c777bd189bf1780c28e90e90c5d8012573fbc1ec041d1e33344469373c17491fb0bb631e38e34919e0ace929b539669f36a794b44e7da37ad0db0f0906387df34fe3810fe521441d37a51b813b911d09c2bf8ef1dab112e2646c361c030ab1a859bfd33dd69399602d51837616325bc2280e4c5ff102a73f1e0394244de73262b6fd334db66ad75b84b9141bae772f75051b7265b2f8e83f388b26b823cbe69fe472a7e89e2bedb30a492e292f519a824358e2c7b2b1496c5d8e3f85a067c276ebf2c6fa06ae3422092e45c7f89b6089ed297113ef0944b9d2d023c3e2dcb9299f3c69e76f5f8164302bd5bf3e10b2c96a29f52caf94b09c8f97d3fea43e3a38fbd332b0244eb4bfaaeb72b70287db83a4674d6a6f87e49597c208250e7164143f22214adb4f5b0d4a1e23a1e9f6354a37c94b6e070a4181cf921bc4eb104eabd6ef4905fda9be6d48c6744498850e577600251314b687ef2bd06adb0888745393f34d7e1e8512218cfd3884da035b85e7bd5b904a0be5a679d8af15f5abf051b68070fd42e7d2ba71daf4bec5ea4f5c09a64d6cca07740eddb61e261061837a9decf5a553f03b17b52f47c23713e9206517a63e5deb69e8833d4a1459b9e9ed00cc096fee57d1b09d6ec8803f93995efd68084353c1070998545dcf2dc1ed07d25cee4d94b47bf9eeb4a13bd3800acf5080842258e797aeda39a2dec918e92113a4c92785c94e5172f61553c03735bcdf5a885163e014361fc2a596e9822027550682e763cc5b4c586813fa9d2b86b680e422e533691686dd38c4bbe4f7dfca38ebc24222a14cb692a760b7c8ecd0cbf99c9363c097e5ef2b69eccd976b32bc84b7895a6c44e92c16e928b00c331bf56dea0ee98e4ea402ddd338beabbb6cfd19bb19575e282cefd63d399aa0029c97201e0e31b1afbb26e828fbea113d606f4c999db24d3b1eeb2285b903ec4473a5aa3b2866b827bcbdc3012f50beb9301d417940d8dc261ea71214f2e3a7e352ccb927663fe059a7cef89d17a1a2bd0346c991c7c2f0add082e39eb513fc21bdd6dbdbd9d062c1104582fae5c7623b03fa22821cb67996d86510aa2c9d51ffc128cdc1dff94648f03790db7e15e7c3733ae619e600862de22e34af569c36fce2c6c344be54c2dfa5c57c8a1bfa8e91fad9fcaf30e6bfb5c88155dce9103c0d6e525c1f6a59c1b61b4f6a83450034849608c0f0dc7a7e84e34e3f765da026d2ebf77d970fe9860589621cd2755e9b01c272d3b8663f8bfac51b1c3811da12c1eaed30beec59387ce64b0e0fea865f968b5da5a0374ee1ab97b63cc417f572d1a453a0b7589c01f1f488efd5399fad01f9aa8071a3ebe32ba3e3038ca7a5d67082a02200671b9d3442f84c586a0955c8f7f1f283542a95bd7f39ef5903ea42ba7da179e5d80021cebc2dba4bb355f848440d8d200a02507b9bd477bbfce5a443f238b5fb5fc8d89099f7a3bcdda5d5fa16c536b503a855e42105639dc10567796c9d20b9574d60501dd67298c2c294cab1bdc01e6158ce455625da88f9555fdb186c7a026af94ded48bfb04207a83f448cf0962024d2f543b14555135a240d8ed5e78f0415e3db74e3af9c96f7e5424699d79a390901cf095994f6f94a80b81956ca89e0a9533be8677fc53b579a005b5445131eddcc13cd85261fc50e59292a7eee096a631671e499bc6bade4107126a9bbe9bb31923fff6fd3cad39c6e4cb9962d7c671a5fb8d973f24bc602ceb14191f92f5123fdd56a6f621186ddd3fecdf95267c983d73b3774cdb3f4adc259847c932e900a2621ec546baf7d1128ec0965b24d29b66c576a3b2aae64f41daa7b8670fe53eae65e679e480b85f64efb32bfcee3fc66bef21064fd41e64b21b05a1eee43361f3d1c0aa4947f48928836a8c8527693199d1e2804a9edaf89ac75f7c7866f081d8444285ab4e8e4ea5ba960772ca17edab8a79e17dacb63f64b75fed35fc5c2314efbcd346f47626325a36c47e27d15805505c80ddf4f477b4de1edf70ff3244167d56c314d58044381c49a84c5cad16f3794686f14cdba541996f11730d84df003091018356af90212ee89501b3bed2f82502450cf1bc98a31cbefc57623fa6719e9975b5435106fab9ed45a24f4da39cce85972289bf75b26daa5fa54490cb551a22c10fcd3dbd3b652e828cbf541a1aa56d7fbfb54291cf3a06b2c03308bc79fb664b517a7308fd37ff5e55ad019abc74234833185592d566b66b040b4944d97e9798e42076d7a3068c7877a13df2993f47f31a779e5f112976e11af51d5bf73e74c139c1171d46b876bab2108972068182d9eef090efbc082ef886112bf6d202edbbed79c21b8f13cb1c84304b1483c541406a004624206e004fb6a99e5ed851317115040c9959e1d40ecfa02c0df04d32cc0692c34e461f2911f865b8d19934bd68418c1beba3d9fa4af77a777cb1e4ce6771542e57a874e996a1295ee05661f295b8f0e518262819d6d2e68b16ae527002dc0785b2ca2b49e3185a8373f78ed3548d818b68229f64cbda00b1b6440294aa9b628569fec066109049f58c1d35d0598a04c809d872cca9969b584e00d7ea88c84837963a206d6c6d6f186eb6eb9d6a77ef88927f646939e796ef8b844abfbfddbaf4711128f0ab135737636adea4de1e20b5b61625af9d2ef9fcd728386a312c29a6ccf3b28028e7be44170f6ff7c362050fd5ab1f9a486005564ba0800eab6feda8627b9aee8e3b676da9f332159701908930d998d1b002ad970880223084dc8691b2049f017afa6e2c3535cc166e9b17371810b0fa3aa41b80bccaf6cda4319ff8069df3da557aa989e3bd9abd867f1c76e962e5af6b18f0d0b68cdf0ea82c2fefd09467cdc6e49f601c19408ce380a03c89bb8eb70b5bac849e9124227705ff2e0258946ffa3c25d6d70b257e7e638027b522d34363f10a405129e5ff375929da856429bfd23ae25850e569ed5f939f23b0564d4f06ea9b85e1fe6688512bb144b4c24c9a5039df3fd070a270489d75e104fc71d9d74f637599b1af7cb2efa63ff9b2e1427bf16484e59e02d4001fb0faae074ffea8d301cc73c424373ef1e8f38243c43c1d31f0b09c757333f9e154079d57f52986639a5606fd79cb3332fd1eb57046b3bd441f28118ff8fc4bc7c000c8fccc19ab7d73ad924cafa94304ef920c56a4c5ab3fbdb8ef14ce0c1070057b4d11ef9ac8161f9c518aeae40d0e0c7a787e0aa0aad51e2aaad9f9a189964650d1f42e737c6aa1dd1d059ebf12c0e3ad08ae7add2009d0852e0cf4f77e1bfcff6833696570bc5df100bc3ea3d65e03c59caa75fa265a95e7f1f8b9f37708ef20e9a66dde79e53bec8e436599d65adee3b41edfbabcfe49ca0febf892152ba90bca8b4895d64b1fd7335e6557073ee64fc18a342fe484992ab265baa214811ed3f999cf19ffc393056e39997ea093c894ee4bd774b37ec85a1fe2979a76124cb374025809d54c53b967a5c55adb482e02881abe5df61015108852d3364b8515367936c85fcd109004d78096e0e5d4686b4a681e65771212560261115b0f4230eafe74e620ef8c19e3fe30dfc32d8ac12454aeaa13b6814a17cee156ca9999dfbc8426ae43c7e85ca63808bc667d5768761a0591dc6ff8491606768c1e93fa95bfbcf22de9f4f46b681c3265ede41b4f54eae8372852e3b16515283c83c676a81a8db3f47359de463e15979b87e10725ddb5a3065eb33b5751fcc2693e2b9aa1d075eab10fa8ddf8da5962266707bf70da59b07bcacc6d0b2017825bd5cc896b7625789271f1e8706fd860a0226f9f8c42185b732f05712719573111ada044cf947c94d3b297be0296824614be21d26a8a36e82781822da14cfa6cca0448b83e257ae5d27675c9f4a0389c77fdae21884857a01a352c5d05aa127b41917707dad1a32fd4b29b8d714798c4f692c3546a7637513a3002981d6d4a5ac8bfa3c51b5a228e0d1c1da913736c6b2005711580aaca14de6f9f7de856524a34b0ecc6c6fc9132279598c057a9b7b432d793509141be38e1371816504e8c5f1128705c67f17460237c948aa4382d45f3c5f03e9bddb174703c80ef302653828d9b0f9a308eabed6e184b8b8f442f0288100474aef6c5b364a3038e78a23ea0344bd2178910daddc3f8a6a3048378c57420b9a6ac548d739834662c0756d041a5f1094b9d9559cd8a033f76e5e768df4c8bf6352637a90ffa67aac1ef7a473a45f994eb695572d84e9a08892ad887e40dceb5ec809928043fa8bce220478338f8b80c07d358e0e2f3e65e365b30bf183458bda63e8402da9c59724bb0665f0d66667ebfaa0cd86c8b8585dc518332d7d8efe661edbe5a1832ef9592ea5cb51bab16e2951610fde931aade29b20831eae168a1624d7176d19cc3008f6c5001d49693e8f39f70078916116fb8bb4910c5f50c5adebd0e2d100b63a2de51514399cdbac56dc37f04126983c28f7521013bb4b847f853ec9e68082f39fe1fdff0cf38965f3043410155cafae4f162e2424a340ee2c86ce5682235a25269e50e7e8b74b9ccb1b430cd7fb328987811f89e5d05bb16323b6306a1a972ddba22cec6a084294a824fa3607ae48fd30e5c70bea508d0a7e489013035a7090ddd5eebd5cd603fa72f9008d18282d0042e93f43812dcd44b75998422642fe055f7abfdd6b04f5fb7953ff84e08f444b91cb5bf7aba7d51e13aee378d60e03cc59575c1ba0f67d40b04dab90a8176e5b260c3c0af7b55e246c001cb8aa0755204d6292e439f53eb3cb886420cf80a495d594475149cbdf26462ae45db60ed602c19ecc221aaf1c18a27148d40098811d9f5ec8ccd4824e311c6bca2f49dc90e5139c4c2e7f9432b91cdc0eec74abc879d78740cce92de9894f596a9b746776344e7eeff3495f386a21d260d901833fa5d4debd91512385ef1fe221754b2b13e71e0a2ad8635b3eb08d674aefa62eb0df1986415773d8419ac65b7929957cd3f06654a573e113677fac4e8a40a836c4f9f0f876f63eba339c14bbe54f4fed0f2655af47398de6118bc0b88eecab71514fd755efc140dc27df87ad707b191d57005cb476b2e7d8563420e1bf6c86722ac4acfaf0cbfb236a71652f432aa61fd493505bc8f0d3c303d03ad4535c3bcc4169d005d371dd182056a9108ad1f2a7ed94dabfc5ef140df441bef29a494ff3aa102ad6de36690e50bb24d3eaad79c2e389115bd98da93fde905f31138a4f12ea880f59b9cf6489c8fbaac4834b040c459f3fac43c6eb07933c3ede2f320e99f912715188342c3cf8db44e5be2c5a64cea9ce21136420bec10d9964272374fe8f0cef25b714624223bbc5c5e2401b03de1af270e49ab185c1da6e95041b666bd67031c69e47851587682ab091c85964d6f0180f957529de3c2f9b201215201ad64a2f0292562da7201c1753ebbb50ecf340efee467710bc1f990fcd4c4ba2a635d6ac436b34cc118340f8862f54762b3baa0228c15f857ee0c5a17974f09a420861d40ada1c90cdcb9001a37ad49abb59008afbd639d977027217e0e22c339748f4773528925c9f1c42e66851503f0932a31f4c8625705a8a8b8da670da789741cd929d03fef884e769880b3beb6a009bd0c674075ade4d6b4e29514e87718f8db8729189f98b9e237e19d58fc7120c3f19a241d2175e7b1e628f0b1ee8a6ab898cd1f1446c6b086adb874e5b1ae2d619f5160e15bead09f5e091f25060e3fce9c0aa154fb25a39c07a849fe0d4aa9779fe3ac7f3b1d1986368c8f92dbfa7a14e52baac4826a19b116e0e5e75a029632deef0a869ada7bd67a6a6b3e7a67f184f74a2e17f07cd790824b7f45344417f56eb697bd11a917a174aa2a317861b5e8b1378af40494784a4297540bb40308bd866090e113765fa00a88722ce0e7125447782a24a32c760afb5325e7314114ac7cc31dd9fb817eb2e53f87087087da3f5005a5d87ff61cfc882dc1590b242d61b190bab098b86f0fa075fac1cdf7d5336559183baed55327fc382080ec31bbdafa91384610869aa6e5b8eaf75a88405acf4c2f1a0e9f92c4def551ebfa2dfeb6c1656d615d9e273d790e9cf6310b50ab9fa01f904b72c249c3d552116eed8a2c40ba7bb0600c53a1206aba7e277858bd78602559568e1d6f60cd42493cd5d55f3f8eb34421d656912503cb4351968529efa526861d91f1a630ce0cae7e87c927637c1cfb27e0e46bc08556cd869bcd54b9cceb6ec012496d0e14ebbf305b2b3619a664f7b4fe80c769c0fafde5abec480c144e3220546dc06e454af0858a2829437470f870011782e62a38a5ba448eda2ad5afa3c5e2524594cb452d3997411e76f591915ff2a909ec48a13f3b69faf801cc76c95f306418aef5fcb08089477980a38f3dcec4e4d1fe0499668da648c9fa22c37b4f721594e2e277874810be500bab9aecca915f0dd72cb81b296b4b5383b829f239dfee168d22174f94e1d6df9f3b4c6e09c14c5a3f1da2de7367aa4f820d4395a35383a384b7070fe0ee8392658e9b7a3b59caf80111b4aead525f4ea4be5342cb0370b1f2e5b0b72c27c794ad3ec8cc14a04a10d5f16886192b36486f2091d2dfa7a5183c673bec0ddcfa0cf4f1c4883eb83c12fcf51a4bd078e977674cc686bac8ba86dd0b848cad149d3e9bb520be97d8e949f51c567e5b6b10340784ab4290feedb0f50b47fc22df6253c53b4c640dc49e3da457117a691042707e01cc9dd5ec369de91b92b2a43036ad8ef9ea22dd84307b09e4ddb8b2a5086eb34e31ff8a8af5f332c9b81e700bfa9a3f0980c259decb14ea3451f283ed13970a1c92dd005162a95a36980f4364e971edabf244ac243beef760a8b6fc2433b145fa0f2ef43dcdca80e046ad4fb72b7d793a2918a13ffed562b98a40dfbe5028501ef1b9f18946657991493f5a4dd806ce32e5e813933d53ba721133182284b9f580a0b92407b9d1ff00d4a0737813b9d17c13e720774891c20290078c435376a34238ca577dc86443af39c002c40cde37f9e12ad6f58d8f85f6726e34514333a806f08b544e47e887e309d7881dd5744fce52ab50f9678b3e27ab728b14ac6518ef66e92ccfb78156d2c409d3444ab87415133e0c1733551ba3e837c3330792b4f652bc602a7371a2b0c1c71c9254d603f2826119b9550f655ae3f09441646eeb1a641a2d99b976f9d7a4ad2ac871db94c2fabd8fde6c961e09098b5981df01363b6662a80c784d753baeb7fbb5a34f4a817b3b341f8a63694b18396defe1d804b74a0b819c1d5c145d4e98dfcccb4c7d8724dd201ce1d65cbdd0b2fe0183f97113be636a0ead56903177025415d9ecd691e74f112c21cfb4788e5b6960561aeeb8e8a44ee02614e946665aecc98422f6a1802c2dfb2615d807e2e52635d07cee01f179e8d105fbbb6fcc6c805ae6f537c638f987159b2baf5047e5fa5cec341cd8f8d251908135e602a38b0d16f190a6739a4236cd87e927f107728b7709ea83766fca9a7e7c53896cbc8bfa3ee3dc0ddf1c5b3a101a8828fa2b32e5f2b2865cab5bbf7d15b68d7808a0b4ec298982c9ba3e725f6dc02178b0ed7776e15d8c9742fdaa39cd8a931728b1439255a40bf7829a02f0f4448023d344880357a0f02932810c3c1f0e6500a61be2d4d707e8b12f39fa80f435617a0dec489d97bdee79b49dc443a9423904e5675849c89861079538b6ea7dbd8d2fc532793c836222238f8d59a4c6013df651b46fb830e6d09f2f1ee6bc096bdb049a7c5caf6d1d9ab3bd17a7cbde43cb87b5bea9aa0676ab8a8bf4f13c5faabdaf9576542dfc01a0e006ba04bf30195dd98c25940eaae111ba7a9fcd4f883efdbdcdf035f5f751199e3001a5501e69382f31a30e460e07306796391c9d39336dec55f23808b57d57fa1df220ab5e8b0236232139e47295afbb0bdf929f163e6c6ed9b0d93b19687ab369431e15dd06902b43e6cb7eaa4329960a4f5d46bed862aec5f2fdaa6d5781ca64a516b5f96f7f25e5453704230dc14576cba660fbac24fafd51019c26295772ed71cdf759e8aad5141dd8ee035e9f2f1bb5a98e8894775b34d4a47463dcac1e322926a46de5c36f91c9e371d0a7fdd7facbeaa5b8737601d660a350670bc18c64e6be4d21cfed52b6c6bc438c78071abecf5562f979d9aecb3f8df45877e7db516b44b4d2ff4a938260059b4a4ee9bfe2d4bb59df75724a75ebde4437596d9043f31a48ac220fd11c25ff47d1205150e14d868746700d034bdd053d04b000898fe9421925cef6c930f3862d0a44d21c39d9bd5f7ebc7673745e6dd1a184d3384fd0ba0b695709a5835ce7fc02a14bdd8f51ab4d6c12ce83f9ea03c98921872c64dfe57a6fee5f5a6f0320460b646ec8741db515a3cf34ea0ff1af3135e073b3488f307ff6a60d4d06b59e44ff82bad1e638aac6776aea5103f44b7bee03a651692ed0d115cde7f4245e879fc107bb729d7f2cb466917acfba7a2f04583105430e43596bde25091286bb3d5d1cd450862ba9870c3a6a1cc62e6c90f1df40d9e49f649df4013f2f31a213e9d230961b69edf145d2b59502c187fb8bbb32f0c9651028668b757ac13b14fdcbdf39078118d2e0bf84376725a4b45ec74a26a07eb7ddeabb9101af0abbbd8877b1d09ea789b506ce5d2b82896735f332e78f4dd3dd1aac7548a8e9de55a64dc5d7929faef9917918da72c62c19bdf52bab0d4571408dffe6b4ab8f831412734fd1eac291e7e9115b1f763ddc5f4df6a88052fc09a938cbf3c036c9de3d15a98386fc0cdd38be30a9e18a07a5a1086a8e4d283fb3d059749292139b2f5d6c9a42f05219986246b9f64085332c992d9975ccb64704d0e71f2ee9d5c3beb64ec476929ed0dcd26372fe135b54cebab0a4f56ea37db553e072e44fb8c74fe40ce64d873aca50762939b63931e080d6923ddd712d214ff638bad99b8a74c5302dfcac2a8fd6f594b13a6500395ae1a961d6c3ca232730bdb1103d6806e5cab638e77b8e51f4855d600c1ca6bc1df9e7db056fcc997ca5cede42860391aaef3056c2b81279a5705edd16968e0d521b773aadca604e8b65b271bd4d62d066be9b83181e0268a74b7ec75c720ae106eed70dca0b79a315857ca6d4a806ebb75b2416ddd62b0968e1b1308dda2f51c83ec7f1f064ab09239273a5b39e0acc657e6a1022e288159c84cf5d539052e470caf2adb45c4daf9c946e8258ce161366038fc1d6fbca1ea11f88fabf997b1415e1b7401259ce1f5ed51468ab8e903349a63d0e6cc3d075c8544689a0b9be9403eb01e283ff114929fb34e7d19bd0a7457f7e1e4785fb348dc69b108be7feaeb636d7a130fdb4de1228ce15e13d1b5b9d78c57d5f277e1a19ca848896e4ced12b65622ded7a697bc7acfe554786c672017330a6058da260ab0f8d934201596152a40341b5a057aa55153e98188fead6bf86194c48a7115d0a3b2e0972b0dcf4934aa366f87641fee9e95d6177d0854c1da5f9d8da7b7c77f9962617c311fb5072df16e4a9e2454a0599b90f16439fbbd585486bf012ae6c5158c7492daf4d327f4d7e8fb054cfa27ad97814678115aa4dc3c2d916eb88675bad1d08107e433ba306fcfee2b983fee6f6ad29d0de8f3ee46dfb4a00a1788d5c2b537314d539b6f28a032da18a82c044ad54598fab0a06d9b3651d38259fa4d9743a2d5d320dd5f229d1b06c608d4c33e18489062149a70767d63fd95bee21b6fb21f53762ce46a7aa8ab417f27b8969528d858d7d270d60ea83a141f48dc5cedb8690e4434ecb3336e2a7f6879862cc3de4a56ed87cf3cac7e85353766442f37673e58efc4ed1d3381f4234e77b5fa9533742b3c473441416a49da9199b88d0d153e6e7d0231316164039d7162c67e6be3b1d1dc08d19b0239b2c5d5c32c919e4d0b5287b913c72b4f34832c6c6fc26bb3ea7f46cecbd9eaeee5fa086bf1567b31b4b2c63c619b7253462c1365e4675822af0bac5d229473294e07a4712d4fd6d0df4d31f46e7345a4346f715db150235dd16571b66e1cd6b1c2e7bdc8545ee36f1a20a86a778e44faa587b702b5857f9ffd6c7cadf2be0a5286e49cced358da6fdc4a62dbb0895930190a9ec522243632229c99ca064739cef81ad5ee24de716443844b26704fadb92d86112560d0df215dad69c93f26f6a41f6a192583db7b97658c8912d737c7f568dea39f7a56201fe67764a35bfb99140fa95d2614c9248bb1f60e348a47d68177777a731ed5339de733ffb9659baa5e924fac1c7116e4241cf1adc8d80c61935d5672edf8602f28abc2bd2fb25773514e08ff6d158c1b5b609f23057cc002ea49f2705d5016196d3a8d46fc0fb25dd03a6037c7e73fe0b90dec29189732ee6d604f4401027cd45146b188fb80d484e059219cc815eb954f7b7f086ebe4b0365be56acba2f434b7c4bff4d84762f60db601adcae23f4bf9f9a88d052235bcabd032a07cc06ee062b1ec9927bb5527d977becea25efbd6a24ecd2a7d8d6a39fe827267c3778c5e13cc221ab2eabec9c33d1144b9cd32ef33a49e64c2db1f3de8fefb28a77544ce2234c8a2b8e1c39a79939e72d5da489b49016c2e10adb41389cfc4dce3be3dcc1e1ec557c994fc277a3ff83e49c9ef32d33cf3d4b98b4239ab0cff708a249fb766d03afb47cdee9663027e1709e795630e7777884b40fec64b0833412be2e5772255741fac85b442a27eec73cdf64d861308d44d939a724227b5449c361e7f4a983c49779d9d3a516c23ea48b4622b2e82337222af211b1b3c7ce1ec497f9cb31b0f39b77c4777b659974fbab688a4234f18ddea9393e57a7035f4aee06658f8bfbae7ab3b9491a9ef2089364e855f88b44df37e77b85249a22b3e4b979cc1ca5cca4b9c15200efb03cd281df39aec3b84ef06137725ce08d171cf227cdb7b089fed1127cd6ad8f5e144d6cafbfe8c1577390c1e16581312c194c8a2862acd125365663a704fb9c33ce307c73ce39af2136e8616f44d9ebbf2e8349d773a0f4fbae5853b0cfcbf964388c4f59605842124cbf6892ef83a229daf818639c39490099f165466969d71bd862df64d8f8c80c4e7064392b5f71c0d8ce000c78b573df647c1c9edce4f1d97988a6eb56e831ca83be8f175de4bb9f98b0e4e20bf7aeda431554bf7a45b6fba77ad5076903078a5470c0d8089e436b14f2c0e110be680a229a248d258358eb8e5a72ecbee2a78de0fd800d62c91d4c92008756f87f1f8d9733334c9271fb2dcbea9cc8c2fa7db1324a45b2fe0a2ab74020733814f2186fb5a45436a52daa0f56c8a135d325945b3cc333ec22afebbaaeebbaae4fae8bc17686a1ad9c2cafbe2eef7a4829871c3206cef8322fea9f0c31c2c6de30ec185531d6149632f663509125e69c734ecb9a36d3b22c6b5a73ce39e7ade9856fce39e79c96356d96e004b171080e1079f968673462c6c62146c858ee648ca5ab5919b232c5a85d64165dac5b35a2e28bf5d985cf7a6c01339280f5eb56bb2005353535353535353535353535353535353535353535353535353535353535353529a03da5e4d1c216a796b2fdcd22c1178714d163e3902278ecc69ce88891eb823bd951390d0dd1e48530c45004d1c542b16d022bbbcb41490f0f8745ecc90978278e9d3b6c4f2804de5e59541556aa9410fb7de06d1baba44b656167a5f23cf072cae2104127e704c4721c7879c6aab8c0b3b34262354dfab0d82a0c3d3c3b94e62c2185d2b9a2113bb2234da67f371bef824a16fd9b4923c4798418ca9984e8d273b585e9848cbbe69d282ba70e0c62092602bf730808fcce231ef03b91d88143e7f712b14423e67702e180df19840ebf13053998282196e40c0ebffd8406fcf61466fc361664f0a7835892a71b7edb07317e7b880dbf5d04061c747e9f2096a46a01bfad0205fc360cec6f0f01833d2bc412cb24e097b580805f5ea286df06e2057f928825c671f1cb4a987e590934fcf213607e19099168e2cee719c412a74abf6c04e9977530c32ffba0c5bb2fc412f71ce0974760805f3e41017e590523ed7cc98458ea9b76e9b3f8955120c0afb4c28b0cbc85bfd288cbaf544200bf328901fcca1f58be4422961ad52eddf22b4fd2082b6770650b2c5fa220969a879eb318e408ea6ffc42dc82e5632096a64dbbb4ca6fdc59894c60e1cf88a5a983239aaef3654413f694df48a40614bf33587eb127bfb78cf28bc232c87266f92b6269eeb44bcf52b6d3d9c0305da211002f8500cc036060329d18f0520780f7d32107f0b264363880973600bcdf0cf08a321bdb973173ea12e5b901bc3406783f1b4e3cb6cf00f0b2588a5a0078a902c0fb59b00f03bc2c4d6f12005e8a00f07e358057446f6cff850c4e97b01e17e0a526f07e34e0f4d83e0c7859fa9cea12962a819792c0fbcdc0a994edb7002f4b633807002f350078bf0270cf887b6c63322cc04b0900deefe50693b17d19505dba54edc2d3a5ebd42efd0180970a00bc9f0b78452adb0f513400e0a51f00c0fbad00af08bc2cf69ab1563180970504afa8daf46fc3025eaa02bcdfcad45101756c5b39edb2d3258ba65dfa29e06511a500afe84301de4f34e987025a34b67f025e962d14808bbee963fa30c974a0a04a65a89e1e93ca36f46536590fb2538693dd1831125f244f26443693c9f49c4ea0caf6435561a54a358fe6115fe84d10724e383b3bf1457a95edc6f55016501a3a4365980813e95259d859a9f8866fe28be42adb4dc321824ece69c992f82231194c06980d4683cda85495ada6e202cfce2a4890ec3a5d47b85097ce952369244d7c91b7d735731571dd5c36174d121cd82a0c3d3c3b32e28b647b55b6dbcc59420aa5735b6c4b7c91d94e7ce9cc0ada4c0e34207096b0ad05147c19db59d996b29d76e9df17944856b2f1dc49cbc845a62359748b68ba9399418aa43f79763113649a8fbf23b31d984ce716c0ca774a934175d4e1b17d002b7f33218cbc1d7c2daab4352411677891430b2befede093bfd3d25236c6008207c81e5627e021841042082184104208218410429c0015262aa354a6e1100b55f6f18371180887a7ca41388785b00e874c845fb948652392e78d4dcad51a1cf26aceec57ce1aa97663ea449475b6ced62f2d7cf33b31e2bbacda7815058b9d8f58ddc55867561d61125b67996e148c324f16fb262396be76c19eaad103974c1e532d5032606102ec8b68d21e0f23322092acb086e8821988c5ce3fe67505b1dbb9edddbdee3ef74f88af4dee1efd35cff33cbbb56f39d67a679dc3b1dafbdabb6bdb79e60700425ead2eaf64ba8b4c9cab6ea3687a468616959336d22107de100435b06505af32ed97af813c742d5b005cee37e6f844f7cc1bdea3fcda09908214058cecc2816064970ec43650467bc67167efdbb76d9bb7fdb379db26dab6c3f0b66ddb46b9b46ddbb6a28bd9ba6ddb3ef5a23eddaff78eabef4050b674311b9881577bdd42aea56d542a1489e4eb9453a638c43a96e119ab7631f32dc324eb33ef7098efbeb1fd0769b3534a29bd610f34daea1a75134dd9f62dab6cb77a9bc762ef22741226bdc8c075b589f01b27a761d03ffaa67dc417ecb4b60d873b32b058921e3c94acda9252d1d47645579436aa2d6d17ec94a2240bec3aa6f59ee363bd1a6d0672f7858d9706cb711fee21eef351c5147718ccfd0593b2732e2c771a22779868eace711cf7c8ad38ee1cc77d0e76311c1839fc701c17c23ebfa17f3e95a59bf181dcaa51f2a3fc0169303333333333735ce96c60afdea08715808d436cb063b717ae6398d2c03843c9d362ee623466f666f03192113799a48db26a436b52e7ce5b200f2cdd8c09d200bb88b6d32c8528649da800dc64241c62bcaa41a3e60e7a2cbbc8c7d7e34e1e167b7f613bf65e124ddd4b32c5b7c36031c67892889060210c3be5aefd7ad7b04b2321f0520eb1abe86678a00e693fe0e56be71ebb1837b47b07e07c98522ab1d8f9510987588ce001b21a652a95519a5da357b6d2cdb8a8ca6ae76f24ae6b5bfa7da8f02c2c18afb81b8c57d1c5cc73af7438cc5597644aa6642a45e9f7899a65644aa6e20b653b6138d5898a6cc17e656831a2a99e9429a551635087a45aaa4b943e1cd5d982c3dea29bb1c24a231c62d68e6f6bc17555ca70a0ceda43a5c1214681f8827d02910536bf2ed540a9e8f0ea46d58daa4f8272e64437a34149c332dda86ef0e218cd9dafdf3d7637b04ca3de034c345defd3108e1e7e225e757747d1c558ddcdabec6ee71d8bfdea4c7433365087b401ca96b8acafd5b61b86a25d67d94b83b42c8b0693a48d8ff700134dda65c9a4748262e204974497a721ba88d6859517d546b10bf61335b28b891a19a5463ea9915d4a9f85a28bb12ceb05cab3befd72df7e6717c1ded5185f4c7433385087b41e78bd6fb72eea62ac77973e38c4de5569c3abcb2becde0c3e0a5efe065ae0d4a48d0f4ac18ba3c5a6e898767b8e8fddde1d783ddbf96e40f22322235f911bed2fb8246fc2d143d165344da65db06b235080a67547e96234b0032387da0b26e5b820b0f78595524634d10451c92537447887c7c948f7b0ed873a1bba9e74311a2879803aa4e5686ee44d0eeff45ded7d1fa6bd2c8381ba191a783d182e6cece18fb286f82eafe419f4ef5bcd2171a2495aec571a61435dcc76f67ee0803a1cb6f3efaafbf37d22d1c350953c68bc1a2ba8b208e20bf6af32109105760bbb49e59b76c1de55c641a1360b94335e3783411d92ab92a64a1e56093e1ee20b162dcb54c6b1d81988688a3fb4cb33163bef60d23cf6824b3cb40b76223b45782c167b2c761918efe6bb7266c62e125fb0776dd48fef3aafa2b08a26edd88f020508d45d0cb6da6334f10b83db754ccbcff1b1da29e5109c3aa4ddba19da19bcc1819246f2603923793089378d358d79e8120cbbf07528ea4ba96e54b5e090b51bfcb0dc0cee0c761743bb77eef85af5ea0fd2725cb99baeb6882ffcac6ef5ce60f90577c3d52b8df8c1210673234f2a393268753ebb14eb225787c36f500eb1d3ee06066f64200d0eb1ff20ed06f600aa78e88149dab1d360924cd17a5b544d32c162d288bce9520b76e1bfa044be222223bf217699ead2c4380ade4f45d4f2d8298b7d2371b3366ade84657806ecb4fe202d0ed751c32e311276c18ef1b0d877586c89c57ea38e128bfdc2588c93588caffdca6ba00f939160bcb298d6cd90a00e69299632a3caa07a62f3c4310778607384052c5882052dd7e575c99797671bab715608be4d491697d8b9c3ce120e76998f5d8c8c3efee070c6f90cb35a20844bd2e688c84891ce61520fa229061689e8827d48169306e11eda810e60e74b906f3a279afaf3dd5956de6bdba7be2e50869a8304632cf529bacce7643a7636cadee0df467bf986c3c920e3443e0c66909bf0f5e4f40d937e70c963d29d3af67acb5c3ee930e9863ce7cc2d8968e2727c3af04a1da4bcd6cd90e74b1e4e32ef710fd6015b66c3bc20b07789b5de3213ec1b2e01c15a671e6b86589235c42442204cdaf41702afa841e0bd0d80bdd266eb38cb065fb4977998c752624613e8d6a50fcb5a49504cc1ba1258dab04523418fa01ae34b762aad256d346537b4fd707cc3377cc3375956bdac7659e5b2ba6555cb6a96559a552cab5756ad2cc39149bb85bcc71895606354e2aa8172df8948e533440675313613cec4648b2b19fec1e17574b8d43a2d4aa087b6d06523acc53f6e827cb72f67210bd1f4dd92d4faecc12511106eb1d6270f9a194474d142b2b0feb9d5dde24826b03c3c200fcf81ac6c68e3102039768b1ca39cde94293295983232375f4ac42a1d54e8f3334653ec92b4ac1ed6ba914574a40f76e90979be236da4cd0f0ae40b2212622d1e1326ce6383430b7450953e5ac7080fb596844a9e4484e4934774ac850ac35fc4635910286d6ef0813a065556c2a17523adf30dff609c68f26e9d8d88a610cc12c452df88209264a48b16d2393238b140081008bc38461cea701d7481b05f6941879199dc781139c4b22c05742c05f4f9d0b70d54adfb6085401888a500dcba0dc6114da0c79d157be30e8abd71a7b337ee481ff1c57aa84a1b19184417eb0040a1b9d2a6573cf04e1b6b3578a70c2ce8319a4c7e43f7beb514be931e7cd287ef26dfba9edcb30e02affc7162e383654f4069c3a1d5624d6a0e0dd8d09b071fe8d843757a555ad00fd37ec7013ae8f3598703e813a403e833f439ef8dcf7f9036058716dbbdbb465bc8bc25faac681262bfd3a37887b94ee905636f00ecf659410fd53b4f91581008a361f0b45ffd58397dc417fa8ffdaad7e3d9af76463afb55eec4d9af6ecd63b35fd57634fbd58c4866bf4af986daaf624b30fbd54b75d9af5a412cfbd52969beda38e20b3d0c96d1f6035be20bfd945f8d36822d60e20bbfdb68b07c518bcef22d51f8d18fe516d692734311af99aa00ce0c0d73f32dee18c93209b3125ec2bcc32ab901121b871051c41221c4d26b27ceb88168c671482f8388764e8a83c339999953f0ddd115449433d10444a2c04ed98219d87e473bd3a08d09529133d7bc9cb96a0e16182d9088c31d56ca644a2082081c914874855429d46894f5489354daed9af68ef3ba7fbeeeee5dccd9bb2cbb47df1ca594b668eb4cd2d168341a8d88c8b22ccbb28edb34da719b46374a411a9c36e7d699a4a3d168c48dba111126321a323941a126329493ce840b695bd7719aa6699aa6699aa6659a26d234ed309aa6699aa6699cc6699af6e1389086f6962e46036b74f436e8fc562d99c9ac51a3d168341a6597979acc64c669acd1f3dfe140cf574824ba3a9374a41a8d462322b22ccbb2ed59c63da359f7fbc2c64b83edba4ff7affb7c54311551dd5f30697be7c276a72176dcbbaeebbaaeebbaeeebbaaefb40dd47e3037599966599668386ac4c3b35ea6eab675b6dad664b1be6089552d15f790ad2c8a405daa831bb884cd3362ecb3222b22dcb328dd3beee947ee0a5342895b54759b63dd3b22d93b5ed68341a8d465aa665202d22cbb28cd22c033f8e66ab4ba669d4b061810ad091a84b385429d468b412ad44349a4d0f0e298c74112f4dbae8816a74d3ae12a75d0fd5a880ae6d616828c765302e3ab5c1c008b5499f344a9be813efee9f3081726212ea6cebacbb3fd9fbd77b730d52efc33dcb4629189a8f430ce4b237f70cbc385aba5fdcd65a77777777777737b7b5c675f7765dd7755dd7755dd7755dd775519a1e9d0d8dd56ab55a69f4a2b934186e341a8de40ddd388e528e7a34bad56ab5f2aaec61c3358a7e0f390e9434dde9b7ad4a1bd9634523be608fd1d258f1f4c8cc643445504a359a6d1bc851edfbb80d943614943d58d2d03089f6b0a194d258ad562bda7594d26aa3036b74dc56b38e661ddd328d01d05ddb39cbb22ccb6ad8608d72d17e1cdd401b35408f06d869d4b0916934d368a685ea11938e464a5029d5ed5f20ed8fabd2d28d7f48c1fca294dcc2a1dca14b18c8a26f31257d4817fdd9f55dda21ea8860bec961ef208168a2f4ab0c026b59a0bc51b2c596db3a16fba6f2c8724a59e835ca62834b92a75db0cb8e3c3d294f7114ff0913973f93502edfc2a4939b5c5e0626852ee57729bbcb338049dce5653069bb7c0e3b48800726cdd22f5f83494d1f29a5147cc1a1e4e9520c526aa04b31809206c42a8d8aa7a878ca113d5664e39023562caff5b316f1ac5edfde55ee5eedfea91ea87e0f55d04935394a3db9898af213d5c445f5c45154d1535414e79ae22995af52a38d5d8c4bd274499e567e45b656a9845db0cf2e0666592e4ffd63fd15f08a30152c05bc34a5b25cda144d852fd53f54fcf6102ac7b6952aad8a9a4303f62a9f5d8c8aa7bc553ce51b732b2a9e7218bc92527548bb723ec22599da51927218cc2295a4f830e76d603d2a55455da994c3956a59956a037d4a954a640f87d85354b98443ec282a8b2aefe010fb89ca3301a7138e8eb5bec524d68a53b217993b1bb818d24ee96346f6e2617004bfcd28d9bb1eb0df6789ac480a3dbe8758325982b57e5bbc8856c4bb12fb45174ba3cf415d951b73cdd12a2da87257dbce393dcf7b7f3eefcfa791f4116b882f65817e2512ece713c524d08ca688c3e7739b1b5781a7105d7cbd834b26399f6809cb500ea7d7c56ca19009a8279ae2e41a6d57d976d541adf71f44c9136424f1c5834234e9f86cdf7a3f21bae82f9abc7fa00df4b9b5e3f3564b68610320b09e0e5448b87cba7cba7c4269d4ead4aadeaad4810a094518e20323167b7f13d12a2d9fb81a2d9fdab6e77dba18ef8d83e7796db92a6d7c6a8d79b587dabaef2010c54357086b14aa511b08427de09555b0d6b91bbc62837ccaa10971b4c66d9bd604d71d1bd5a89e34393f8970b66ac3f6fe9446882f45882c90f87cbe4dcea4ca9d76e141c597adabd34a23c417ebb2089145114622521162adab7cb344f05d896aac67ebf9f47c7cf286f86ea35652a542a950a8f8623d05c7556943b5e7db07bb58ff012448b720b2b0eed5b6892fcd48765e60adb08420acd5402cc15e17c3b21dc8ab6849d444b56d1593a6b55473879584579677accf2f5bc17ec05017f379af90441c3ee0fc5095aadbe6946447b85569b91a1c4e10bd80a4914100216de28bd576c398b2773f60379091545e1dc1d69b091194d9dbaa68f20efabd45616fab2ef6c66474f93c047ede813d9f6f60cfe720f0320bbccfbdcfe7393ef6033ebeabd3ce2e0604ce3e9df179dfa01fb03fdd9f0f0741dd509cef24caf9e7146a07715d65fba97c0a125f2c14238142f111568212a224acf51fc4b8d1ab3e02b68a491b9f38b47c00bd3f1bfbc05a1c44a2244aa2248a4f9cfafa09d185bfd337058a856f0bd6ea2fcc1d4b50f591f8d2dda3c167ddd0819db47249e8d6076c1587b15db677f5e1d3751d05b08f7068c99c1f3efb399f7c582bc8e9d4e305d67ab720bea8ba5443896a896ac5c35a28dc32a2581e0d0eadb39544a249036364e00fd2b68ec73386d862cb64db6d446b20f5fac6e0c478d2584bc54aaba4a440213a6102e5c42404fa3e5ec76d5a46b17aa9a82ca795b35ac4af692a35e55d55be529b933374a65a6fa6e9d23b6ed2969662e7fa5bf7ec6e6ea5b2e058720bf3d825ca5aa9393460b72e66e5f3dacae7b5f2f9eb12080bcf1e4ca229562ef624b787fdb256aa04a252659014550a913a27aa345165110e531c5a3fa9d248952a0e8f70b892487692f028913d7209cbf00e76e1217170f0f529d3700f2ba1b1b4069f572133c714a314bb320ccb2876c9190e2d1e12e764e9c0e2300907883c8193328d452946297665189651ec6a19133e00820304c7921698637eb3e7e444764a69c416828fbfc949bd4728acce041112be22c00ca121966066b4ddf866725127321128f6f8ec081dcbc2c62140786ce81be528e5c1210cf768f278f298e231e5b1e551e591a4e29c17e4bb7c536710d206e49bbe30caa41ac34b2b6e5d980f2665dfad4e3b100e2d1b7cd25e91a808933e464c7ea5eae4571eb1964422776412fec140ac256d2a093c45514107eb652340d8452f914493895b97538826945b964c6156c8c683f00f1b9b2913026d44bfd2a68262b87506c2a51541729884dd3a0b21c2282ec224ed2d609814fa0d87737252c909812a9f53655e3455623d280610c5e755de127e9fdda7f639e761308049269f97c1a493cfe7c0a4149fdf41024c6af93c0f4c5af97c0f5c5af1f91a4cfae70c896e75313334e714d95ce52b2adfb44b55794a6d798a9af2939ae226f5e45c35f956b97fea76ad7ede55ed5fedeed5ef59f58ed50c45bd0e56148fa18207d51868ad2b446df946c5ad73112b8e62c56d34ddaeda3dd863a828eed5ec5ff5ded5ef5aedfea9dab7faa1357493caa5a827af953ea5a6784b4df98ada3ced62c15cd1c7527f5045711595e52b55c56b055da5aebca5aa3c8615a1db6097f918c04b791e04e72b7845f3a15a6b7038cf52697038afa2f6c0e1fc4ae581c379952a010ee753ea0e1ccea7a83970387f526570386f5219c0e13c5761bce070fe53615a8c64086bcb55401545e5389cdf0441971222a0199a3344af50e89a21fa63ca884e9830a1dcba748194c10b22c946f640e64016612dd0256886e60cd12b14ba668862a29a12faf5d04fd494d0435d24d43af44d249a42b7de49c412df74eb3089721090e43ce1d44a601c25ac75ef21efa1d02967a2de106df6cd66cacc1d7304f3c784c154c109284ae8f456a7830fd6cd8cd03df9c37be8b28ba1d403435e347da6d0466b8e8ff59ed5af4adb9d0ef4a1d029fd32e6a9979708e9983687e4b1994cb4d79c993192820ffd88d41127d02fd027901db6c5c621407ad88d72264242828044ce11d6fa10d4871c1f9b3d8706acf61bfaf7cd005fe8b4b3211402b91bbc876af78f76a75f07b6d8e6c117fa751355da1fa6cdde4442a15028145fb24fe6a10f99b8a8548c3795510e959a1108000010007315000030100a85c462c1782ccf73d90f1400117c925066501b4944519223290e11631020860000004000000060a46a0084f21e073d6ba8c765f94b0e9776fc489950b7730554d7f64e702b9e183a84b68321a56c48bf24685a3f25ce8db5bfbc16e342934c48d21741c0046659b953827c82ee9b0136a7931ff3b8102bafca6d992c24622171d800e916b09d1948bf106f3388320be8fd688d943cb9c34c701bb654b20ed2bcdccbe7405cf2c0a77470f22d30abeb616f9af3e41ae5aa797921c3c4d1ab9cee8e727a3ccb75ae7b697851e6d9846c9504f0d9c4c85cc556b59bee3af0e9fc65455cf7c897cd4e41e80e5d042c3e97ab071e0529315eb8fc3f7a39f4ea1ac702293097f2a02c4fd8a8bbb905b886c995cbe31c1ed71833620a60c1a796eae29eb9e9bc6230558c02bded869b438c4ce9d7d8f88b7b99650d6b144ed8762185e98b52c4ef0e7b62ad264ca180b463633e34314fded655dbbe715a4483f784a0fbabe803dd89e26fc2c90cfc2ce939aeb3a595b223619f0d780dc5637949e6b37d2297f099bc263d48879bb53262b9be967fda2fc1528ea5215c1aa70d27d5ae00e8fec907212939904df31de5d604daec0d07be1409b0dabe45d0842d5cfea2a6a0642782b46bba5049bf40610c997e2094db06813f3bad850efd8061e4438b099f75ee12b156675d6624fa40273403909ebf07457348767f48612f088d68ff7f0ffbf55625251120daa5e6f11dded7424c6c4533d58c2cc0ad3f212f0edd27112af89ff6cb9a148686f7c992eddbb544723f5d0ac90f5ba857dfce554830bba8b12d6edef0938ac2476bc44251cb9d5a1164eb3695d382ec0a15ab757222750279ef4a6c79051194d41a6b4cc9bbb8274761b79bf046a1be6a949a595cdbf548813453439f2a1316b67f4bedfdf228a94021f8b273c2a0c11022aa8642a7fa3a516d1447aa97798616197664f3778b7138f24ac8f27f6c9ba66a2b4fc45acebe70db60484dcb0ec9e49edcea7bce2e7555cae06212247716e6e42cba7d3fe7839a398b017b8e2bcb151fc5b8837ec31af9cbfab07e4600b7441b7d6b4df604353067ed06962591ad1c28f293c1ee3f7c72c50efc636ece424098eeebd9d191f0358b0ac4851e9264e6c026e0d22519e1a1006817481e712e82acb9990585442d69d14a5c004453bb53dec516d119de510ed498a06d5b3c01a021142b38de774857f71438edc1970b72d389e0f3b3877bbb7fd5dbb944391231e9896662779e5e440a50aa9a4e5818aa911a298af83d0f70638f2c8304c0adddd5a4991c9f1d5382a73319ba3856f35c06660bbd77f39cbc23cc4b205eae19600079fbca1420e4fc5467c2f8aba4b2a8cdd8528145662714c778f9eca71bb1764fff82a90a0dca8f885b103a7fb79ca92ec3159b28bcad76cb668088c9efe91283a447e009fd7d46fa4f6e5f050e24f9af8b44767d219eb0b800d145773a8018f727b043cb52acbbf08b809086e2f7b312c8ad5d380e823ebccaec190a43c9e699b2ee5df94f0f972dba9de4edb5beb7243161e98b9bf8341512a9cac8b3ac89c190eafa7e70520c505bb77c16a983925be78e7c6ab857964ef386d46d213e726762df4330cd44a91669dada0fcc2c28e635228ccd6fff57bd94be838068fa46c4502a2fc1aa94605aedd52e32222e6776f5ba4726996d651e16e3dc6e3fdea0336c1e2e60f94666d8ed1a89733bc51d76f96fdebf55b261782ee55d0312e5435d745e07182faba228a898002c965dc838307eb66bc6d31fc66c9c91a076b8dbda02b9527baeed65ffa0717b9abbc810709004236ec7f87df4203facc571e5a2ac45f941aadcd63fd6c03eb46a7916e4940ba5d8ba635047d2544e5df8b905607b2f84d6ad8cda4939003e0e546a4904f8689c5f4f5923681785afbc6b4639b1005321d89628bec9b31818a22139f855b1b7e3b1e05992b4fbca638bc630fcd336772352e3c6778ae63d21cfdf59aa65cef4eabcbe71975cca09d17285e275df9be2f507070aeb078c37600203f6317ac4ff7d04c8676163ca45df73f6ccc6ba3633a9d0edfe89f936b1f4f2d670742f21507b5c618fb9966ff6c00be107976289997f9031f2632622a902fbc2d1c0c66146a48ecb97d7d04d4541d5b04c8802d34bd94843b2301144897e64e62417884173620d03ebcc825d00fd60f480813e15555ec1a7b90c269191caa536868b3d8925adb9c0759c8ff76658c40ee5efce2167a8d5663a95cf26ee5ccb810b30cb997280c40b61418c61f6484444c7d14b16ef4ab269481e388a768209a254c2402196ca7195c74ab81a7f4705d0ebfab964505c2caf9215f0001f30c6b6a60d8d05d499a4bd57a777bdc2feb4e9a0bd611b2bcf0064ca096d95b9a32de9ad36d23c3c3bd3d3d5e7f30a51b838694e0a2a4accf069237d2f5a0fec9e393142878668009db353f625d956117e530a6d14a5c822ea5cbf7bcc81b7790e0ae0449cea9eff1847cc008b8b6d4d806f0a8336a3566671976525b4f93d5aba90a4bf614e718bc4947249b84804995405177788263b1e011f49d425341a901dd8437c8768d43fd4a24f79046a60b0718e8a636de5b9565cce708f3fca69e4cba288fabe798eb4936b794b8b39eb96033bfca3fd31f4a8774aeae8ccc843704538a0e33d86dd614ffb50ad2537b146f3c563eb20be85b98f9d9ea3fdac41930b5ddd7a120c3c209b03e37371f3c4f647d5b8c860cc56f9662416bee5a57c66f011f4d4e1998383259b03a9472798f11a0cba6def98ae7546dea7ed3dc71e8a400ffe8d820efd12f3c4cec1708d9555e463e9959d31a5c9576a23734c0ae1505de4638db3812919a01ba9d2b175347a4836e24ed4404125f61c7c139ea41954cd5c1b1fc2b5ce3507694c42161042ce1246e805fe8555ce8ce73aec3ad0fdf24f72a3d180c602b4e7e28cf1712361134434d4addf54f6fce756da3a564f4959a23b6791f16f211bcd93610d5d0f3589417bf06a25c6319481b273c131ab0c36309f1636acbb27452cc78bf59111c9b73eba6400a1e171fcfb43646eef6d9c6d82d99b67e36ef48ab4814d2792ec9e46f50e2e674f931a389247c830f04c251f0470c4d05aa5276b156b764b3c46f89b4bfc692a76025478a53e20a1cfb0b117f5dbee9fbaee798045ca6d844c33de31cd53bcbe5e1bfe77eeafc5c64b2ba32dca8ea0ced0a88b972decf5a3c02863ec3c55f5ec8a1906c88403ad2b1e996f014b13fe70944ff3a4052cfa0b10c83ac0af8596df715f5841575d05bb8bbd513e0165cfdc05fcc59fdc9fba63619d92cac49b6ab9e34ce57702946f777cef37f480c910b3caa007a422d4685ed208278aa2ea30e27f23f170b7e6285b34acd756a23570ac9de0fa752a829b407395d3fc792c205b2f6e3d8731ac9459ed7ff51a31ced4d63dc46d569de739afa7497d5b3404e465deb91c0a1988c87b56f9e0b56073dbbc34c6fd7d5df085fe4105604dbc257ccee6bdc2f43e0acbfb28c08af7439b6f99020a311aed1456db0065e8f76ceb4d4e861cf714b72a38be0348b7e480716b5b9e70c98e3e6e1e840676f58444f551f3d11f9f6caf10c9d039c788f378b3b7634421d21f83fac903a1f891cbfc6ab43b17e849d3700bf504778e27bc8c2a58027520d7f5d0517834a9588c922ef652b490d79cc05a518c79d82c1b05ea1d7698ab9150e7cd6399835324b1c1066503b45685dd8ebea8a66c3b09546af838f1d319ea8c2dcc0b673dcaa8d7f3f6acbb5289163beadcf496acfa55838d09b68c05651b8c7850bf669486d12aa9c051abdb138f524fda0a6ceb2c4057aa2b4ed0bc2a569be2d6c29354d7332837ef0b4420dc1922d00e8e72c7e044e18104cd8a6fffc8f613b9021dd720d690e7f39f4271adf2ef57eccf926a81ae5e863afc19a0a17efaa795d2fda2ebb6c761b3aa28afa623f00458e44ccbecdb136b6a9fd73863e4788d52ae25015d44e2408cebd94f10a521978912aebc137c4aee7cc252a4b67b4609ab996332cf904ba89a62b049f0ce49c9a674cf40d7a60ec16bce3ce1659423ad8991650c6e75b4a8c2c8228a064a02b9901ec14930293f45978a6ec964b79d20e6d0f09f6ab8d920ec73696989339c6dbb7a1f265d038b2597de4ea6fc96ba2741a5e2563740edf7c7ff9f7da64b825e456c8c8f3ac194c3d2a7b801753a008b33404c1c45ab5e3b2a3933351253ab188fdbba8c96060217eefb268b2b8e7cd557797ddbc3e3e79e7f53125400c09b80e9a5ac467535f1f398035c9c5fd034ca012e44bdc3d565d5d97b09ba2a857cce9085b2ec19bec5e7db8d2986833799895d11c6bae242e6474053b1c93f4950713c3bc54e8e1c2b6c9cfb0bd1dcdcabb7c64f5fd067eb9fb6a7c66c7d2e1d1f844a69d86d09f23c5bc5c0cdfa035e3b820b0e75d86b50f09674756bc2f3e07c35f9164f4da10a4e838052bff4acbc2b1801e3b94469f8f609df1cdf2e0c8c901429e979171223d20c3dcee7827fcf8339aee10fa39dff3a493e8118fffeee9daf68efa234e0c0a97a77149f03ba6ccc6ac6013c9a869b5b08cc2f4cf4f377ad013fb196866ad55f68e9ecacfb05f8d1240b10b09f4253c5d0f3b39379fb99ea9d2b5bc11bfc3bc0b82e020b74aba0dfc747931d5450581bf3686d0ec655d58ebbce511dfcbc0b337cfb9e0b72eeea9f45f56447379dc23c99e3ade11d564ef8a8f0c1e0f161f63d9d777dfbcfdce13e49c8c09ec8be1091c905ff90fc7979c9da048c4296ba47217995b25c0f42b3c424da13affd8a45ff6d08d5e56ff5bc8ad3069d3dc6591e24eb6f11c8507a3aa5530c4926eea2af26c60ee3889dc99766c676752e0e4823a4d5c5557b23653a09b77a1aaf6407565599caf46554ebdc195eb19488c211dc428e86cae3e1368e08933734ceb264423659d4b7a6d5d82a6b07e36459106de4e497c1f3ab3a478f7215e510503a407a853be693d9195def1e4c2d4c2e5fabbc2d6097b8ceef5103e97d4f67f3479d6668c66f22f2aa01d8a633bc77f29e1526024bee84436e672065827487e2f0b1da8fd0fd5b78548bad207adf5f50eb533317f7859c552019b46dcf084f71508088b82f52b768a212a886da2001f6ba84431f22114a33205af0c398067d7632ed6d1f224b3c0761e8c54163a2f7e341147fe2a7386b613930d1f15dbf41e57179b98a13aea419dbdd1223e8c66f99d3042a2c9ce6046969fc953bb33edf70cb65fdebfaa1954d6affa82f6a88da3f942821370ab827bec8226c185bcd8dd672d44b7a15c45d897ff612ae39986b1d3fd4d20dc5b8a1126acf8078acaa104ae53555d192735dad118e2644c21ab0aa54e70aa3350c2618337504c76e8e9bb41c02e5e1d00558b1cae2ebc30714c44e9d6fad0046841c2c185820a0d4de391a44060745d99d26145ca9569fd2e8e22d66ef17e28da95b8e75d625fd1d265c9017a1ce9d8759e8d88fcfc1b8605a5d0e2fa576995d73baa2c502407452acd121fac2065a619b5ac27b753910450222894568b2db53f8dd879a5f29c61b29b4eae163f698eae353a67d1812290147ce6c4c0fcfab52f06c50bec82f54734fc7cff6423b000ca550829aea281b9c63839b0b3980c7420b240be3b49c5bbe3a1273aa0d451fbc8af4a1314a349b7a0233bb133b2713d33b0ae8bc43d0a92f11b40e9169753d6b7f85f9a375411ed9284f52e8eab2ad73aff6e110cf77315a210e0f477796a3e5525c077d98c9164512c1f7ae2231395a113003f4c666eff268e56b49c1046e916b8ca97731e5cfa6842c586b4b98b125e1a815abeac48727135e46017c88275871b391f877277e7090ac3b60f012647423eef43ce468d4c63264292d65e8c0037b65c0db54113be52ba24b141e868bf09104488e9b5b8db45e817471075df1989ee4589bed6d23b7a97453977fad34fcefd75f6bc0546d8aca67b4b4e2dd0bdd0ea90aac06cd2c9d34af742407a44dbc57ee3d7a9de8aeee69083f498b3e5d32550cc2e0a6644f711c57c541726687d82998b583095be060c533eaa5734c52af9fb8d92924e8812a48159420e96a1f783bb24badfbbc61d619441e05812cfbb823882cc3af2b0c843acc1272703f06c42c37100e85a02084a6e7207e732421ce746521de947f432ca6ec21fee77e4418eaf244d834ff8a68dd53e65d8486c419514320a615c2a723603fc2e6b9b7eafac2847b984684f5945b51174973e262ca2099a4dd2685451884137959dadcb10f4a66fb0ace80f3dead530dac7b396cc003ebce6d1d9e6e84802bf9eff5eb64d5eb0fcc639edc03044158d69b5bcd0f9196fd9c059cae6663899edc8e006c624291d99a78bd359404841e5659a3dfb98944bae92597af0a466ea55ee00f7272da9802ce0c19d2dc444f5d8464b29f1b397b8c31829e8c395812e4b103a3c34a9f20dfc1f801c915c2b2332c086f2247745ecd56c4037a7b90c2a351d3ba8060a5dd5ef196c4edbe48e4c5ee21414d5000207c1e52785e481eb1394d7448aff0d1fb9a0d89fdf9bf84a1430fac4325753d74a348b75fdec898d791e609af0df8db51bbead44b2afeceb523387ba71b2e8d56524cb3f335e8c802cc215ad58a6053500a466682d7c7515eff1fb3282641a819dbf608f84c5c3cffbab5c98932b09422f8f5c8fe84f5aa26f6350c6b0a0b3d987822bbaf12b7ef2051e0ac354b9b5c82b0200066839598093f6994766df49901a4d54104027b545300a9450f21076fd8fe1383337ed912a35cda0e19124d8edccca4211afcd4ea0c8173ab871705598de88f5cb493d970ada862a0ba041e3d6c6e9bf41f0c457dfe0d90684b1b0c0054aa3521d04f50fa58561f0d65c1f9812cbf6154d0782e529a0aeaa34611b2de13bfba8c38906449fd5215a6b78bd91dc3e14ae5499e8e530b21bbadec718e163d5ce46bd81911b9801a82f6ffea2b1116647003f567c9526081dca3a2d0ea07c331d1c3121147f4e60a032a3b0c16e5b964bd444aebf813112706e36065acb34e5fc1e9bd72783c6add88c656bedb9627e816a3b5f841b602350834215cbd15c03f8158f13ba43a95bf94010673bea061d81e5be7946dbe2944ea510606c3ba5859d7a7583763ce33861a676e3865ef2120446c408c309a7ad171062d96737fa2524fc81c69faa14314bbdd368419d7d0299c2b4e253f669f14d6e836f2dbb30c0d74513907057b2c6475707790628993239a1f7911b39909eeafa41b78d610a04ded5b70e03cf5cae38e7b03ea3dd7407cd5d1a33a5413fb45cfdec3203b96d6160a106944a4e2e1e0c21a674ab57b27d89137a0f1b122f9dda0b4bd23126bcc4c5bc2712ac11ae75a4170ec9d4d77c9ce875b9781786d8ad696e95cb11e8d7120eaabf736835e9e58a061366bbd73fe6898e0886406ee268bab6f4026c98c46a827240558375b3686c1af0e4c3e7af68f93f96c62d40163e867dbfa7a7a826fbb46fac26f5e66ff1f79213193b5ba9ef7235ba5a11a8653cb00275fd4d8ef9d6ad9f4576adcc2cb28a1bd686ccf9953ea3d9320816c9ac606ae786911f0eec6ce832d45e8f2c02715d45fc644fbf683fa8ec270e59cb724b166701deea37f6d8730c284a1458d252c8fff40833ae613194dc8e81f3bb6be839a3641825dc689cc25e679a4051c4a219a5f8adb90539257cc9d2d63354835621a966601df84ef10201c20d4fa7f9a4355f0dd80d88102e62a917542b7909ed83d8be8ce548d00c2219f91addc2c0f45c7a75447622bc01dcd8c4a66a10e0f3ff60bf703b0f4ebd1c37a6169331d7d616591840236bfcd2a091a6f1b0f84cdd10733d88e0a44bc9e13ac08925da97c84c340a58fa7a9e86a64b0d758da4b7ee47532203973fe3a71d0567282dfb8b38a7541d232867c7dd6b74006854ae852203bda3527b18c089b97668f0b829fe80b1ff9526ebe085457876de0f6c5bf509bc2ed48ac93d28225b01be3655281035686be5fc0b0a63019266c43857ee3896cb58f8542644cb4e2ace04ad19d5d90950442a85b979c11b72c982e81c3a615440eb43a4bb6937fb87299d83bffe0f62074a8028ca69096ef0400f6a61c7353ffd0e3be66ab0e9310b89faf8e8a004650a70e89bbd021f791a0512d50d8a0255ed8219a4ee2a05c66e993cbf87e3e999a60adf1529069c426ba0a44cc3d12e08472d7b1d9ed66b833ccc1123e168d23540baaf01d50c3f0222e0487b5a97d75f147dc10b06b1cdd870c090ca6e0b76c006539923fd48255147f06247714f1691324c47d57126a50d2bcb5cdde14fc30f560abe7233d92ea01c0d14edb60e965b30ab44a074c646271286eeb8d1f34f411efd3a5f0d4407fecb487c3996688b11808613755346b5518d32672462d1f0e901f42bc4c0b3d7f58ffa9de11b0ef325a67ed5103a37bff6431d63af0e19071ea7941f6e1780c9351a631648430f1663019941e0e75b2314e681c7afbb3ad3019a4013066dc8194887bdce00237dcf4bf3b364edb3c954a4fd970f2a6e4df7ffeff3b5b39c8834a26ad317aad8257ffe1a8b0e3c4fa3f318159f6cb8c7e1ef59462c4b4f1935404ea599734ad421174ffe7af196cc9443fd7f870106e3b73a1cede053babfdecf9753bf1c7f1eb50809ea81ae4ec5779fda00cc79d1c783aa99e417ba70e689472c6a4b3069d346f3ba7dfac13a70fc82e2d921b6338c609e838a94b8d7a6b5ccec1331c78d9a2e1fe3d84f8184ad961386ccd98df105ce3fc6b13674076c492f4319f650702393ac000b8c8c0db0e0c277004114314bfe1f24b0ec34740b1931c56b1063662131e86c5d47ba58dd47150117d68dfa2bed028fc582517d8ea8c18a2ee68dceb34ea56a497931228e962386befdeaf200e4daed949577e2bbc2c09045470823395ac7b113ce95f532e5e01d9c37ec7255cd162d93b5dbe78a45c3b78d708ad06bf94268b98237c3ed6af4644179e92166f2f90028c7f2d35d068e5edf9bf197d8b61e9d4b206d3b9db50f5c11566b4e095ee1a74e7929cc1eb9ba23f2b88c8adc1f21504163ff1bdc1e4792fb9b8c5d53134c7b9980a128c031108d9b05ac2f3c327148a19616feb0fa8025494059179fe5541dc842b3450410edd68808f8f6bc7676ebe39b80446cb2948cabf890f1e3cf780f2eee727b7a2a59c4ca994af4ef80bc8c28fc4220eac14db072948939a0175eb8b7e39bac99ad7ae9e8114a4bf6ac24b28c526d8cc2cbc56294890db84cec3c8e31efa37029debd9a37ca1f33789cf0cd9fb8d77c0e7fec635ee70158724823ee4e83514fd4b12225653016a4f9616913079c1c52d38402e4c885e102a7e3c3e8a65cc177ed59166ad02062ba31dd0567e72757291168f6a2db4a5cc1d3c6a7d16c8d83669367c58bf46bb407cde18dcb404272ef23efb164dac8a0a5f3960bc717116e922c024a8465ca571245d1d14c54aaa157294748f8bab59477682e160915860bd61a9a6eb91326955471440c390f82703537ff6c7274242e6c18c3f54cc10643acf905410f24771f854755a3b1b6ae692b3bbd7c5bc9565312dce7c8adfdce7a086a89c86ac57371790b0c43831640330179048158be40b7bdb3a5e031ad3effa3de11f30349b3ac965c5a9b8be9539169b83e1f3472dd9c84818c87b48ea17fc9b4a700354aba533308fa70d7a6c93636f8782f01947635954e8b8b02556ba75c3e71556d6865a001d5ed7c6375cef10e0b00914ce4b368cb8a4a17d321246859da11fa6b39e36db89c95f70476bae4bc3dd7ae34cf203ac59ba5d524f683840fbfe2a2776b3c67246e2a354e45b356a8decd72b109bcd90a3fdf9dc47fe867d244502de2526c4cd49240f3029fa0377b804bf30b1c723b95752942961b8cf2b067ba60e4fbaa451114d950f7de2518bcec7c46df5df5694c781add91ecf89a4f789ed5807560abbb2c1e327ce464895b78930045ef0b7667c93ce2c391a3791f4bda6faaa6a6ff4eac96757892a89e157ed5b86acd2b7a270392a29fa8bff72d1d9e32ce7bf46e17a370069b38620f5448d77de9de773ce160fed4ce4769e02bf12a66291c67b10d5b1e8e1716377e8e4f3c48ba77e393138ca823cf1874ed7143304d4b7012193d32fe409bac66319c0ff2bab046675bb376002e799d0c8b529c088a01e7096ef85203620cd91e4e6a40ba0b0b45e1b8b628ac4ce25d4d2cafeb1aa804a679f2bd8b2a164e2d34cf39a5cc96fb288841028d2949b312c78b524690b2bd6e05c0b794443e98ce6db99457e40b975617393e4ba9d0110c8cad0496c4f72fbab93d49247ca751fe82a8e32e806384e50bc7753f910c9fd6bf79b15b534e39b42639bfee263f53fdf462406556a46079d082718df276477d5b17dc7a0174838b79ce273050a44561c212f511a8524de08517983c47a07561d0401154e8e911ec49d16fe82039d682c43fb11a5a85464c45935161394ba5f4978628d512feb58aeb41d78986c875763d11d5c243a38ed6ab2eb27b9d1eea0f5592252a4dc0b281b697159b7f44a1b9db1ccb866606175cebec72f9c458b2bb38c7bed9193e8d781c992ab1209ec4976147539759df238b40e6fde6a16c61f4c195698e67b04ee5590800bd92a5cc4be54de9b8c8476780976c69d523e58a57ab16d6e832b44f10ac9eefdf86e0059082f5cee23161d2160c3c1eb11f0d7dd2e5c7cb15514938eccbc8e2b253ca97cf9d4aab80287763686424426ab44291c110ac20f71c4cc374e9eed81612907ba02343c2f4acdf7667003b7e7d4893f6162d19fbecd026905448fe29fd75147c06f9720c3374259ece7f98028f2a4a19658090bcc3baacbcb5ffb84ef52a63a9b184ecffbd6cd0a0124e9ec0024b88ea03d3d857cb73c31a2b2ed0ff920e295f62b84c10d7dfb7979848f27b7139217036eb937fb040c066b4bb177995fd4881507f7992980ae4928ee5fa6546fcdb372188afc46a2708d808859f9d695867a4e6e8cdccaf4a5c4eef0528b288f6788441119e6187e861e1b25801fbbff0f5e00d2a2274055fd96bea35b2f34a88231a402bb498116fa82c3f761f66e4e2bbac72e0a8ae19315c5443a5e06141123b1b85d6c06a31d9048e884c1a0612d94d82d12d8c7b2f543af3164fe5e88fcc08d5baa6c2595a368b5ab99515aa4c6cca952cc1a6e992b035cd7696276c437ae4414c665fd68f389d1e906d176faa83615f55bb318a3ad000db641f1a92ecbe90d6e6e15913f207b62543047b94072fff21d4c946bcebfa3f55e98fe390f2c02d5dce6a034f7a320f3886c8725b4892e99e7230e520db7b8c6d56c2c4447a6255aeeccbb69acb5432def9854a56cf62865344e29f3a60544ea432d397f13931366589a1572d45a87ae33a6708002d7caf2563d409d6841e7044f0799042b63e1eb4953a4f09f0e50996c00bb93614dc7c303ebad0c345d8e71b262a4f0233b3c8c1f72e96f07dfd876fd9343dd05aca9e8eedddc772e246cdd70a37bfc95c73ede22714a3d742bd6ee5a67302ccd98da0e4f19ab36cb29a1a9387ae27a70aec382d32e08cba5786b213106c6821b502145cc3a15518f964b08d9239aa305f71e08f96950a87112ed71ddde913a91e67175c2767bc2cc27c067c34857dc88c2258694cdabb36bdb2f19b973bb3749c8b3575aba1954e112062992245aa37700a87cf1fa127b9b351a3fb6e546834700d2914018ca65de3d809fb6136ce100ff81f7e35e6f0dd53de0cc23f13698358172c581958a90e12bedf3e49b5c35e4707544f8125737ee054d32ffbaa5a9f07eaa2f31b9a0591756f4863293f66922f044e6ae52705f04d6f717868b3d419d88a5547e597912419bbc2416440045d25a9da626a4294435afc2662a60e1da57990933f311fdabecaf240a6c498ede89282ebd752f102a949f8a68d33038f4dd3298040105892e1325ee7101385da5a439739266ab2a560e0ffe44cd8fc63f233a8d23c44e94e4aa9a97122bcfc4aed4a6dcbaa0c44daadcd4e136ad0b4c045f0f4542e1296d93091a950b3c282ec5610f988791894b602a51e716c7164db8b810dc0a2174b68677ce272cae6c0955e0010c0f5506e3f16908e52bc822ca84241051cd6a1d637645a10d2456d7df651c4b7c72d6aa7d3115cb532b2a74ebe74846ea793861863ea177f49047683f6bbf9f0a526502f8de141d6c47dbcfe6e28f71a4788e70ae967e68576eac14278c858757a8617d5b1c4da3d246411440251ee8c13b9e313c7d9a255b578b6a7d0ee425c8ec1ec1e68dd006d85da362f354ec8654df11fb66357ca37ba3876add7ffff2c5de8caeca86cf85a44bae38c621812734d4a37138d4240c6a85768b1260866633be74ea7c6f25aa48b6ae1a40bc9784cb73a527c2e35c7af33dc951366597a3a8bd79d3fee728ece9519add3a4972f622786e1df2ee4885cc27bbe1b4bdfb6c066cb5bb78447763e8d911d0a85e006f2aa1e0ad2a179dcf1cd9c2f6b29d4468751542905e83d49000878cde34ba000d153785f40eae48e3d6f7771070c23890c5037259252a3907e8acd023a872db76c7860804f05354925dbd16c5805601e25163c034bebab8b6944ce6226fd7a4aba1db3509aa80c91ae31c447d13300708b3d840e83a1252ed20d76144c31cd03e67ba46b58fa716829112721fabe9feb68653b5b819573157b00693646167e56498e01e99db3dfaf3c46c0c524e5a097ca39f1f4b9e09286aa66824b8879b809d9d0ae4a1e3fa0c106e0f70392502de4086c3a59afd8d5588527eb46bdb3d936761420dc4004c173f599bd029a2eadae17376297f4112a1fb008f66ff0bec1273b2338b2b62d0452e8104eb76808427bf836a91bf0b786fe3428dbfef5e75455fe4a6815b2c4859386c749c3fbabda269770e5e07051dd41f4fc168fdb04ff167631d6743e28970aaee0ffa5ecc7ae232247d01aaadd4a7b68866bed582353e540dd4c38a4fd749b4f034692614131d7d063d012f20544a6fb98dea0f00596f0c068f4e6a3567a1164de66e8ea11f4501f8e59174d289793c25ff50f6d603a4323d686e590ed11a433524aab500a74165c5c2b90753508eaab2887bb7d83d8d29d7f3135539d22df750d864bd54a9068f6d352030467f0e557bafaa9d25f790c3d38671af860ad9fad0e666935bc2ea5de83b45429a90a274dc16447d49089456bec8eb2f5c6c7359f2c27a7436246d5310943f8530fde2d45ce543e4e970df9f4283c50a9b3c5357685a43f67e8a6ad185ac78d539a6ac6968a2c95aea20feacd0c3874c4953b3d306ff71199bb02d15f52705ce17e053f1134e6eb474692742cafe39b3a4f8b53d56b9323f770f2f1c670abb2dcc981a87cc7d24e08a0a6ee23e15dce2bb35c20ea779a57c618c641499503ea3e18ef3f6e492185ae8ab988ac4a5d28389a722ff0b63978f86c337117d4d293b74a2f623815c9713701c72befc10c7952f9a274990d6a69e2ac154b94693ed214328fa0c494edb8f56643945f9a657ba9c5913775042806d0f24453eb9e6d6e9f25c9da56326d4e4821573c18319bb99ea66bcde0f6450240d7566923dc6489b87f6c6bb4d8f3c4231e56911db3cca2f95fd2570cde5507da7581d487524635faedb50535f9c445b9713a57427e5da6a0bcd483f687bb16a2e6b73248bf64e4a9a98ad327518b293bcc7d4b262ff98603a914e496da23a2796f546343d09a4837f697d8b96c579884ba0de3d05bbcc1538a85e5b6c33215c7de0677bb6763016aab3be3c60b1a10f2d0029460294e55e8d72343f9ad4f7e10d41555ea5030bbef62435d1fa9dadd8272b4aa6312967d3a5950747bb86c9a941ab08379f75163e654b91f3a1f83c8ad0e3034c71f659f469b346ac1b7633e0e961154612b9af2278cce398cd522adcb63ee9072af468887efce70f8dedb416e1687c603c3d67291ff0c12b7cfd0f961f1b65f109484f0e42d9d35f9ba59ec9308b3d1a8390543f4ae43d66eac2f3db896d78550d39256f9900a6df49bdd38c167ec7466af6301ec0e42f741cffd71af51885ce653b078434ece9612168f5c15519c92ef6092d3e178b0a9da0286f93d733c5b024a3b2967fce038222c7f594ba5392d7d50143a9bb2ff86ffd80587d520c0f482e08dbea3ce9ca1f49f92615c2d20f0fd25a95b943facbbe8e8fced1b552c7c35fd7c0755b8e41f0bbfd0dbbdc81e44d3c509394f4eb5355f42af05d7b00e415b86ecd489b33bed24227f38d113b41316e4fec79804c21039357f1964028cf4185c0124563e3ca3d126b18f4366458a6797041135461613e9e820e50af6a3dbe942e94c2d6a782ece62d2e5b48f6c83622a8594bcd618176cb376d39da90f8955fd9182c31ab2657bc7f5538c0029d2922626267af44501dc71308a1b4c5f46f1053f24e6d8372e05c72ecd8aa8b8ec167abeb39b35b3c20bad5d3f3425c6cae3f1825b578ff45ea2b6771b3338be5e14e7a2cbd49dc6171f4f328eaf6eaf34a4320e204c80a029c63af345d4d9b1809223b1136c26882c45a9c4d8017f2026b0a0d32a842a4469a5927a4d08484631b20afa97976c06aa75ac093b4d7b4f5e869ed0bbbe9631bb8716d3985494ed298f785745bae2327a68d59fae2b9820b42c7706225b1938b2b42d4e286d06b1cb1fb000f486f00eba15d35a771184c87505b27c26b0139083c4ce0125f1f964716c9e4a90fc448d2bc7329f984084ca8d44ed5d7eca2e67d442c5e3e473a2b57e940d60682f572280bb1a828309f688f969bf35aa76b04e00233b4b3a59e2865a67cc41f8a2399b5f554657ed8f3cbc6de571be530f2cc74f79b5195db6b481b5fde40f4403cc83012f2b29b52639b1bffac61bc603e406406f667cb9842a06f660537007e726a3adab143c43442fbb881c7531971147e332912ba0b5e431fe58cafce49fc9b12d232b1a3d3506825d39a0151e907b51877c9a3ae73a54c4bd3a166ffb541328f1302ad9f96ceee8e956a1e41a0d561c2536da44a23a58350b6f8fe736b67b4620aac74ace525bfab17c1824a815142b14394d888dc1c8ce960bdd90f11de03f0a91b09e142887aeb757103d249bd3ecea880fabac23590292a98ae8ac3c9e77d4158c5e8d0c4f7e4784a9037f2117f4bf6965266e44e6d0eddf9a239b36a91a61c4f66cfe827a7bd0c4ff7599c9531157dba5759ef06541cf194dd51d241f778f2f01e377ae8b2d19dce12a7ba3c5c20277d736b22d4e327e517442db7d89c2728bff5b8d029a272fdaea0efb4ac13a30882f3f36ec00082b1a1b6dea372c7fcfb4944d73d82646ed79a714ad24109d97c4075564ff44b832a007ac94b6a0f884c0d180be596f2d16fd11fe3b0b35fb5391304425934747757f3d8cc4156af28ea4b53f455745a7b11c274767db9ee9e258d22892ed8ae1d6b86f7a008f87a8226ac664bb1be7629de4803e1820c2407c8f18063c0a34063ad545f4303f0e655f8c56b959c352403d6895ad0a53d07bc3e0088c61f05d6bae0e88f224357a53ddeec99a50546d1eb9d5990959d73885e0ba30fd431f8fdce98fdf4f0927282db48538385e6380923915c8890f224985e01bf20ff4c2997630931ce561a2a376806c848bf4cb320399cd370aa6b252ee3336eec39cba2ead0b9d85b1445bb6d2da0bb230168c289fdb311e28907e69ad814d94f0d28d26d697aef7f93ec47692594ce03fb02a802338e976ca021a2ca843d1d0f6d13e5688d2550d54c543094b603928ec5f241ad7a9e788a0810fafec986496472352f91efa21842af3290b3f5f73889013dee70e47b16430ac50f6d0a547ea6544af02038bceb25606eb279abaacd440cd0e6aa189424aed44c40829bcf04d722c7f992477d004724b435b760d5e2fc3e37fd407564926e19b231a4d929f71220be2da871eb5ef6140f22bd84ea17a6d71bc65f323d00f40e557d95f24f1cea5adf77fef82954d3a6c43a9b26b89655bbc4a4ef678985b02c8c19efcb045851159a291a24327abb31607a1352ca47f65f1db0adbb179842e81d18363a89b3f988435b0276360bc54928339a7bc01e1c3b05972efa733266712442f5056270411e2dd6daab02c6c4c29ce591029480081a13ad635c7b024ddb74b2d36110095248b2713f384572d5c2ca0ccec363af19c06c1a1711ce6dcb508541c641a3571a19fba868981a703a9126a8f1ebde3c2933d797530c10240938d89175914e374d08a2e630b53de47da48dc6a844198e16ffb7b06d323dd630918572a6b8de7c3832b1b01e960728e970c261cdc7fd76cf5b9035cd4888d637382fa5d0f3a88d3bc0bd80a8c7508ea28340d41b6e5a25e7beec4f3e146213bc8c1e60779a938defc32545d47eb3921d761a0e2769c76df5262b3419e3d10261dab11e94c22ff1024fff47278c8eb72a92562f2e620edca240d4ae8a995eb6698630f06654086a59673e55093adb2ac578a396e9e89b06fd815a975176a289537f39ee5efeb686d0589fe59de7be48895c42c39e5ab791a1cd4bf2469c812d2e62cbde8eda079b0f0d31c366927b30f3e15d26c88d8ef0a3eb64e175beac1c7f44476bb62ff410d14cc790bf05119a1bd1826954b7390954440ebf54270d62573b18292aadc1dd306553a46f771d0102483e94a6870f002734d287e2015af090dbeffb2e847441f3703c65ac14252362304f4f704190aad5631471ce46b5f4020376af84ad9694ee13aa7d5388f559ca85212bebd80d12647c831c8d407de52e70b71302019da0937a19888a934e943092a5b8210b49db2a1617d0d7c2f64f99169b8c72b2c4914d361e633471d0ad29bf9b12dc18fc089fa2c856b3184191a0557aa5664dc38c9304acd70d85e0222c0af7a6324fd0be7e9627b50e185116f50ebf15d9c980c326c08b389d95d02a2a1da4ef293caffb35dbf0410b7391b7ec9927e81eb4e52dd65598b6501ecb383d933731f43ae8d22bb33e34077b0a021c1dc9a1cd5a7585a1fb774de432abc6215f7f388b314204573805643b87082e6bdf1ed0956845c6a3e3b24d97db0db64dcf80d0d4684a94b563df9b1e8a4c7089c90945d01e1b8b581ba09aed0a66f5236bed0bd698f45d22a2ed0658ceddf042c7abb5522a39c7bc623aea0c86dd2f5b692404dae52963a9feba632362011f5d41a641adbac4ec7104e58d65c12219d7531183c38312977fb6219251ce614b1096d685297dc2d2d8d19d1374d5132fb98c5838709f80f406c61158a7ed0b76b4a3de57178dd3234598df7046b84048424438a1faa3ad350246b0506dc2bb13cabbb0ab936000762cd94ea5d6f8326e7558e1c1607cd2b2759f95928f26721679f98389225209a27bd404d085bbe76659d04d048b48e5646634be76388b6f8a7982bdfc2599e8c9b0c2ebde7dc1f435b34779032dfb23f0edae816aaf3b51949575a70afba2120e263ff1ee1a9a5aa147a398da7b01687d4abb5ee15f75c02f5e155e3fd84c85a1e6f5ac539d27a62eb3871eaf623e889039d50bf51036581320ff1822e23306970c50d06cdd6a606483b3900493a48ad3c7514631b2a8a1521692ba8dd322cf1430ae5a2044a04e6705f63783abb7ee7bebe1f37d3dd444ff0672443c493aad9a26a678ffd0af1ebd3e40819377b56861b7d0420881aa45f9e64450fe98d7e7aad23ed7e6b0b30feababd5d7930a164f644d1c42a177ecc9e8816edc61cd8219fca808091e5927879980dbc9daa9e79e831e7d8b8cfe4074a199e05083aa8308f24022d7958dc9914d1c3260e7641181a652dcd0e5f414978ddde10c194ade2413cdc818a8913573425cb5718e04e9d273d8ec37c0a70c609599d4c88e7a358bef8dd7096d9ec14d2b165b94d571ae9d5f39660f94fe6ed200be370c93383ca7677f1198fb83712f38a5f68393a71b85992e8c4210e748c495748a3d35370445f7a2b1dbe9717fe27c61fba77f42c0ed5a480ab78ac36413cd53cbeb02894170db6e47f21218cf61a0adfc90e1dc7dcd75e05c5de30b61e4a0515a5ab54e4f019f1bd16e0b9a22131421c79d3b343cf39238c5765602afdb8b47db75b69796ddddc1097836f1a7ba973bcb6263adbe897e91c593f854125d916f7bd571ec30893462b11336c218d504cd84efc3fcec6944a5fddc4a6ceb54315ba45b1a2da91af878cb946e8d9289076c9b78739d7d232bffc6761129bc0225a732f8d53c38a79a164044da136c05169c4d24042ce5c4518cf2570007760ee0a33a548a70fde98d436e9bc56b43a07863b435b5c4b639e704e4dcd71e12ab87b6d5bbbabdb46be1bd7af998c5310b918bd8304fd78ec71639f388b3b755f2793c4cb0450bae94b76c8df48c05d435978016e923a9ebf02f67305e386e745caac8aa6b28c0fb890bde448ce6f90f418205ce34163929e5177fd099501e5482fb485b83a59cba0a2014299352b175c8bc6f759532473efd95605078d91438c2d8626ac93da4d596599bb013dde6053963224336b06f5ab4c6a1bbc25905f1ce9dabf1c288fdfb84c27ba221f732a3f7f8d9606fc54598d5da4f6f6ea76b641a3f9b0e200fa8896c0fa4e3bae322d0221de2c019f175d3a1c7c6cf9baafbd319dd0f9d0104b9d875bd0f6440f6e2299e46d8409b04716cb500855cdf00e404451191b1c115626a3b0cea4fb850e3d2d7d1ec1dae3c6652814f9ab758971a435a1f2e1f0ce23664eb27facede6c8f38fb948f31baf3222d1f64a4112f16cd40647e63087112f4b15c7a72c933ee4109045195e673fe25901b618b31f0add332da0f9ac1948b615be78b6958e93f69d2db49d77254e23d5cd4770438bbd69dc00b637e555ee951dc576464555bf6e231219d0a04eeb98c4ef052b9df192ce0e27d3c62a00c23fa299e4eb9a696fcbac92fca25903ab4c5fc14de52834c009b94da775e44474682e250e95c8e3a0019cb590947cffb29ffe0c1701417b53b1a4a6833d6c730e4c0fe5d0bcb3c7511d5908eea19ffe8ef65640504331cb9cc38ebdcdb16d30a42eb4923fbfa643aa41de811a1d405ec54638640b913ab81d262a939ac79e7073b2709710219170614c9ae07efac8f243e0f1f3a7c1ee3aaafc8cc50010c7ff5613bbf6307f1f8eb80794c271a8e16380162f6f89b57d37def8778279cb8ff87a39d9fcf5cb59ad215e283b8bd5a9699a3113924760e837eb64a7bbfd500da7f37aafd8ada44b40bd70fd1d1e1d20168f062016871e20168f1630168716600c8e06201686063816863e6b7b73a1ffd1dfe83fb42bfa1fed82fe43bba3ffd06f683f743b9a8fbe86eeddeb8d88fd8c5244c30f289888f3fbe1ef01bd8ae5a2a6b132a21ba376666afde4a8a531103351ef446336a8e6f1e53668be5cbb661034250d385b6671054a2dec3546f9e3ed2797fe85ff908d79aff7d56d0bac558b85e27df870b78452394bef7292d7495577191a9d0ab8a5a6b6aeeecd97bfcd0bdc7d43653795e5d6d36a581f34558d6ae584b5d30c65cd39b9cb5b1502b44497bd4fcc3ad30c072827bd93535d817700325dcc3aa7720ccbd0232a448fc51dbb25d1c95d8ba75574029b74aaa5dd8a378f7817487ca9ecbdfd63a275a9dfe8c4400d8e964256fcd7d0274bcd04f6ba18887aa53a524f681e0f2bb23f4c6455ea391a1f9083474a392bfdc622eec7dbb55b41080742f2a4aa783ed2aa156bb11f26b226f51c4d0fc88192b246f040bbf6dfa2ff31d192d4d7e803b5cc5f46c318297865ffc989d060f0f2e93873182a340ebb1fe5a576e233f98ffabbe66ace304b3c9ccb51eae062a3ce65d481c597cd4c48d35563513381b39e3d8cd2ca2e3e84f5d1d832f449a37b344da9ae423c7bdbaab249c110ada07da898e5ba54d8077097bc9ca44440b5012eaf3b77ca02a95dd92538d51b97c6744c81d20b0dbd95977fc1b4c2150a46c78e9ae7bf3c91354672293e5704d0e7d27dbacce405d2104f0ea581ddafe06857560473ec0ac8593b83ab3d5aa4f5b1160ba51cf2bd5b17ff69ed58507e1606e5f48ded12c33fa0abd01809680be85a2ccbd53f5a6f8b80910b9eeabdc0d98bb679c75c14ea2eb6441b8bc992dfb48bd16f89def27d46fdeb630c0c9429cc62b314fdd3b2afa7e5d630f4f23ff7610f905d77d9c95d1e46ae1703ad72e8d77c0f27c75df1f297e6287e3df2f3215b79753b72165f02794b6d430cf1130d1418f0e48c0dbe135770a9884f5d7ee85674aa8701896e0d5612d1022038463819a6f743c1c48f33e163978eac7bd9a9405f0838fd6d7e67b1446d155625323f31372e01b91a0d017fb8580c3c16a606d7e24cfc67831705c087984c491985ed3dc5dcdfe8078b5e8bf4a7d7fd8881696fe3651507ee5e3756bdffcfbf1021aecd81fd531df008dec57c1d48590462f8c547c21e62a6ad8d8715002cfb9ae9e41b42133e54f230c848e50fca4d6fbbc17d0b55b646c9749cdaf56587164fb06d09106bed5c5903d350bd28b1a2bd9ca2115d26c891404b44c5ddfd0aa8ce219874663964a19cb6887ff2eb6f46bd981ab56023947eca66ddc2d18be14ff43934e6fd4aef9cac4bfd97dcbd434add8c2a1fe5e0296d62d03e9a6e983a510ba2abb6ec9bcee8e559611f225df3cf8a54bbdd75047427ae9e8b96fc5f817df16058bafb47b809d7f745358e3825688c8e922f42a4f4682d409195053bbd3883eb84f8ab0373170c25b11014599e0d2de51621fe8ab62e408f83dec8e76dbb3489c444a6330935522b68291a4112e2f965d5d2ed02d45cc74aac0f3bbbe6cdebedbd0fd65d43e3f907eddaa1ccfc1b67e51ce33f357bc95e4a0da0286a385020f84ae59efe1265164376abd2463b78b839c2f98bfd46ef9544183bd0aadd2e7cd690c38feda7d1eeff6a7aa93d4142cdf735dff1d6edeade2e0dc75d7f7b72248f6f69dd7b5ff5f1898c3490289fa898372e42c990320dc69cede9a01f68d7ae4ddffec3202bb9132fb6c5d1ac2f80b25519d3b148e6b7627fd5d39bc7ee2b6591bfa2c0c3edda650ab61d7412c808b90536f16d7ce27979470fdf6b95b7903ab9e16ba7514e41d160adab876f9c2ac1eedd283fb7105273e31d5f089b581423acbaabbf51ed764422367bd1d81b05360fbdc17d2af4d1b850c310fe9d353506a7b6edd8b964731f27a53d541047dcb9cb9a1cf37078adcd273851e668146da529d01fd5cb8e5e6007e0a21c8e45714d22632ace021a10cd7f4621447b09bf40d53ac8c19bc3a117643a5b1df7286e7244cb7753f126530cae50f179205b7754d2755b230a4768e1a1336f1c19a6c9aa70517cbc6b90fa2173bb4c6d8c47bfb29a0449187651126ccfaec693a17d28dfe99ebb3c108222122f0a777e38ad8badf5b4355b4d03293bd38775bb8b4c66357ffc8ce0288876032e642dd50f49d62760d7d29323181173c6c09bf0c0f82c0fa55d88536655aa764edfbccf667b2748fc520ff95909c46cc922d38f4b529916bc907ea37bdd3abe0096fbc558853111620a62458e29881929b62066e4d8c95807d2d3a0d7cb5a94fd03baed5e925720982a4a07522f6b71ff1780f1be6ba0888fb13a53638e2223dc335b72ea07d5ab2cfd6eea1979f1861ab46d7d82038f00440b80f83fcabe22f4e8e27f236b69995ee603796c4b41d84f082192ecbd37217b6f29534a29cc08ee085909b0fb526e9148249791ec4edcd4dca5c331a1966cce75276fe9a4fc52f322914cae9950be39cab5eee4b0e3dcd47d3b5f7254a7f9d6e170d354eabe1c4d924aa58dd433247975abfb76e0f2a00b1e78a13d097679d0050fbae0edc10cec03e530cbe0fc609ec33039c3c3f9716ef29a2602238c30c2882ac53895bd3837989616d529e53c5c5a3697be39f46ce3383fc592f42d069367be39ec3e98871ce4200739c8996636394775df96f2cc9b9b1c14523a744bc6f952f2e899cbee65db3ed5e7db7c29cd22339bdf0c1f9ddbfc2222bb4f3a6aa69c9b3829cf72609ef308f3a9133755c5f1706969912d92e332e95c8be4326e862ff9d066ba2c33fd08c2c2c32a62403911e9f124a1a76643efd1c12d06d484c981c9819133c0f873fed1c7471fcfa552f353a1be540bd7323f99ea24572a9d502dce75296fe98aa4befd66f8cd6367aa6953f79d660e4cdc6e4cce7533bc74535764e33c462fc51c9852b77d393040fc122a33d0c08106100c0d1c6858d1128354f7e97c2a85e93c9c5f6799cb29fde4ce9ef45297f229e149b2b76da96f076e0a3517971e1a0f93ab3097e825e7a1c12dceaf06f9247879112cf9cda33c9db6f992729c936f9e9a9b9f26945ed3b1db3cebbe93c953a6e85b74294fdda7f327df0d06e970bea4fc25e59b97529388669eca3ce559cab7eed381a7cd1437936f13c7e4a989c3c34b3bf04b7307be69421e3c7a68aa16176dbab86ca7cd653b913612c94ba793633c93827fd2e42714cae4a6c94921a77bc9b94ee33c85ee85731ce827e726f493c309a76eb224e526e5697e4be4ebfc8ba7c0f94ba7bc4a953c859a76f1d87d2d7e6d13474a1e9e8addc94d2e8e2a9d3cfac9a39336e7d1e19c26642fa52e27e7a50ee52ea8ee6b993b709327df4e2f29e73ce55b87f2d895fc24bb4fe7a5a7ba9247d4dc9ceb70a4c7939b4edf0e34bd941c27baf4d2e4a4902f45a24b8f72077a9aeb3e69928cbc22d1795883ceeff43a0f461191294c768226f8022c95e69753f2d865cef94614aae42753a9e4a52fa9bec6b5a4e27643922995632d0ea7dca4f370714ca6382f39e7a5926f2d9e691635d5622839470201649fd426e7d039871e3337759ff682749377a9fb38cf667401e570be78a97b31b9c671f3c5345df3cc39d732cdaf7de9358c823148cf268e74d3c4d9bce435ac75b0fbb899937a39e156649b73a74b3c5c522df3db4f798af39267a514572a6999735e4a69db0d899b502b615292cac89cd45b0ca58e94928fca502f48a014e3f44e5a0f6f94738e9a29f9499447efb14d600989e49993665672dd4a5ec359e62513d77d392989eae4739c2b47efd1a387f4cb4d1d094a9e659e3dca512557e7ba6fc997fe74539a9cc74ef35367327d72625df6652e82255f726da3803e17bdd4ed26811269e45af7a18008f67eb34dd28e8ed8c4b8f009cae65af7e5bce6242ed32dce2f678b81e3f9459ccd499c9693daba6fc9335c1e928f98bcce54f1d0534d3c74d4b5dd8c5cd8878ea5c051213f9ddfe9c741390f18527a721787f36b718d014e0cc7e42537b967b28b4536e73c765c6f3194dce4b2fb522fa5949ec194c9c44d93e9859373bed0a55beb3089280f9300e2a1a73c8b5af48c83dd97f3d264f24f9a1c7a66ea36e73653c7e92601cd4d5ec39a6996dce41791fd9397baafe4a4c941214b13e7e4dcc4c91cbaa9cb497d69e6a4fe34a10b5b249b3ce64e7fca5d266c993bfd288fa90f050f4b2e3d935da9dbad48bfa4e1b918e043183e93975c4ec8deb7d38f9a1f0e8f69dc763372d83174e9a6e7e6177da7771a2e84654888ed5684f49a9bba919fba2fe74f359ca11a4a40ce6fc94b3779eca02b735772ce6b98ebd89d5c7699cb9e51b994a80963d87c9b5b1cb9ba6e30ec6b1367e4a422a349f29a3e759f7a84616472dd4c389a93d6493f3e88e3496edae6b724f525e75ce5697ef2a58cd151a8f9612fe7c7b9fac9559df22aceafe4fae57ca9cb49bdc9b78e04fb9af756845f9b38262739c9752b62fa723e72ca5e2c790dd77411939f5cb72d76a8f9e5680b2597ce75bc15294de959d4b48ee4236d72a7cec41fbb2f2795297bd2752b224bdcfc5010e796b9bab6e4497334fa86bcfad57d39afae8db96e700d2684d002ce9cd49360750d2684284291965f6fe1140e908889daca70e7ea0afa111f2c44bc0df021841ea1d2a040209224a40ee9e4e004e003da001f9643286354483f748789ea0306e0617462bd200a8c0d50531be42ddf206c3964cfa58e216988f108f9c9f705c2721c1d43a7672ccff9803660864d804bcbf20ceb566886204b8c5fff14096fed3ab4a243972aa4dff28592c31332e800820e3aa03374f6e804c644754b23a481f58d3852d86c8b01aa42853af431ba49a0b0b78c85f34fe128410815baecb80ea81b085ba229c39ccc5306f6825868e70b7042d52e522062c868e990ae439f2a54881016835220947259b087bd29fe56cfa140966751739154b907a950893290545806a867b8d952762f0eec616fa1942e8252d68bb2ecd02f17454229700aec3982cb8267b8e9309dc6188b85bdcd82bdb5012e112d6c9102599c662a2c1305f461190b47e11b2a04f375a8041532f225f98834bfc53ef6a6d2be59d8dbf689c23fdac0ff75d11c2a848edda114c016fcbaee0f3c423d039fd0d5facfaf5f01897eb7c83648258b5c2a50683d326199afa9bc104c8388a126cb4e8565a260191f2c1dd45bb80093a5a8b360a0381c46e523c51a16be826d37307a0def07bb8d823d1e7c3c210f525df9f57586c23251340e759edf126e07124665f67d9e38d079f2dc21da3898882cc208152e84f0217456c8daded1ea89c31376471488fa5c2a2c03bffdb66753e0a69051b88173a5b0c7752598a35738d785b2e4e376c3dea4674a53059c2b5962c335bb116ec2ae4fc0f3cd79734e164a86997eb077157596209b8035c29e6a47df023cec754884edae77e7b1b7de404405e06c7e2ac676001fe78f1e42ae6f149e8142bc5adf1fcff9fa3ad92ffa4221aed3347886f375ede8ecf99c01e41dccebfce01b30bbf10f26b082a166341b0dc763ffc24886232a645f5f06534bd7c902c1c2abc7689f211592a06675cacafe8229494c9992c4942953928801d08f2051c2434ff2f304141efa0d4160c213450a9afce0e10f144f3cf47d02c5060f7da370c243df1e96d11f29b478f833c59387d0c78e1f646b15369e9d3196810a6582b0ccf6d069864008d990106b1bc8320478b6f22c2483e018a6a4cbc777cd1c98c77e6070a54134bae202cb8c214c8c2062d1058426b0003eb18050c70f8d46c45e1003962a1fa85064b0d7e59b0695d69e91d6a5fa8b8a137f39e4991e6c2e4fb90ad1bfa490d4ffa4cd1944bdd28f526545a6e2eb4f15a1ffa46f53b0152d2b16214baf3f3d3fa881d45e7f7a84f003897afde9d92209c9bdfef4a4d184cc5e7f7a9af0821e3baa04f5caabf0a03f555c50c34a04a1ca0afef3183732d57c7439c99774659c6f9adc54da54b2c4c6a1d72b08231624476658d292e516521cd833ef0e07246460cf260eedf121ccfc8ad685c5388a588c11ebbc57358c8de2c55977219930c1fc72264632f7c11e3c32ea747a0587ba7b649c2ab561eee638c5d2b20b1b599605dd1ab9655996052dcbd2dcb22c2bb3486e912ccb72ccbabc907b84652cb7506fb9757a249665598e3aa910e83d30884c61323903fb08ae6fa04096e596e69b6f4e23448c0f6f59fe6d8f95eb0b29039da9e915cffaa032d12de9966f0e3a03ddda224a96c5b9915ed5f48c8e0a935da9ab00db70737b16a85b2a96eb18b13222d2c81a527db6438d6143d734c22d1b2a44df829cc35bfca495b9234a5ec3b0bbd254b2c466797a653de995e5b153c29ee55bb7507a65b9d65d41f2dba1b79cad0f2362994f0071b0cca759764809cb406f973d03dd72cb05a042a2fb588c8191290c3f80fd4b654ef24fb3acc876cc41a033295dad7f4065a243cca1674067d8a11cafba524f6dae2f32c003212b73478c1c2eb151f52a2645d32b08fd0203fa91d40ca976e8cc2d476684e45521db4b052c6fbf40f417e7eea502ed597bf6720176cdd935cf9c3bed4502fb2f353cbffe8b4d776aa3752f36596397c7f4eaf2ed8c60d8751961d29e04966df3a502975fdb7c59df5c6d2ec7e165e78b11ce37ef386cb8898312242ed071d86c1387cb39e7e6cbfac897d8e02003e79bef4e19361f4d25996fae4473ce97d8a84d0d36dc586e645472b5c1ba179b6875321c61af7d2fbf00e7d7c40109192edf1c8797759263a589c385f9cbce0b901c7bb9c0c82f1fc5ceba5117d3d5f4aa9deb5a6db64e6db04e6dae4e82041b2d810c97902da47d5808351be0434e0ab94d32116c5b449286243db336cc1b85aabbb1fefa427e3a447a761d15d2bc39e8b2e0995fd697fc4e1bd4634605e8f563a79f84e31652dde70c22dd75f8027b96652561196b32e6593ae3e92a09928e061542c232eaac11090d49d80811242cf36950122c392cf3c93052c3f3545589b005c54c3eeb95d7d75e31e4abdb264d24d7af6b9bb0cc35d9af8ba73d468d499030731339b10184d9c559c6185bed85dbbb3d3df6d83da6fd49515f4bf84ffe2053986c7bf5eb0ba942482a047e7783f14412fa5251d1c0329737bf403b79396f373644bf3cb32c0bee40f483210b6ad4a0ab151a8c012147d1c477e9db77685be0a49d98f21dc4647dacfcb7421a8f1346f86fdff81628092cff2d966f879c352f7316363fbf3a1a92e4b0d72357f5a853f5483865dc423ab1be803f6a583175bd1c5345f2eb1cbbfffc77c6783c484f26c890178258a1c67faae78603084e5e5d5199faaf6bb73640d89eee90294c86c10b62ccda67b90e05f6d59a46d490f08296654d5622a14c612216f273a810c20ec2409e2c8536425e8ea4a6753e1d6ab76263bd6a25da6ac81a5d1f5d1f5d9f09bd0858059605161674b5ead189a450c33216b4d4bae1a490f072eb8525fbed23e1469b52330db3effa3601fd792dc9f53b158c5cc912138cb0f961adb9e6a3d1683475c85cdb9ac6f69a478c3c1b4d168c5c0712693472920e2392eb30721d48aa5eed8fb6d4235b54b2947c188720a107034b90298c4f4d504dbb6cdf1e2c24d013284b03288c6581f542d906f0ac8026a0e6086b448d17f2db9e9e9e9eede9d1427edbc351786679e027cc03cfecf0aabd8198a23e59befd6320b627480fd16ecff6c05feee16a30625e5e0cc360a0b3d716849e421b21d74deba3cd486fdf375866f3266973bedd3a6997a5eda637e8bcf9c8573ac9b351b7f324af619293e63a591e35e4b7fe2dcf23214dce078657eb5bf743052557b2c4a68484b3e6f919f992974abedd5562be4a0bc4b797f819e70814c4d820319dbd7518d867c89e181b2a238bc507fb16f0a9f0ea5ecd3680b189f56aab7cfb30064405152aa45320bb455bd1e96a7d1545855f06fc128141aa6479ba9fb45ee92633d8e5a38ea657de5e98b77a3d1323b159c336d615f20696695df500c2c4435b1d1b5edeedd715971dae3c63c1a02a9627fa0eec8a9dbd032aa49d97f0ec1ed01988c57fa611e88abdbb1d05b284d0eb105e7f9610e2b3dd76eac82181368bd63142eacf123e7cfb5e611c784326e4d51a0f0f0f141b98868dda40651bf61b6e3770b53ba8bf1e1a6442626f03fcf6cf2bb2d29909ac02a9c2f8bc5d7dcac57fde135120ed6d458914880e361ab6762fe4be25af0a849dcc71f96a0236c278c5183bfac5d6e5da5d9ea96297638aa952d1f391ea316e643f6e48f99d7e5520eb5209a0f359c9392ec6c84528a597a4eb1603a7a1a494aeb59c1cce8f8b21f3cdb968ca363f755f86929bd4d95c762f26cf5e4cb3c8dc32d4496e1307e5a689a3653bf05152933c5c522da91497e2322ec56526d3a9575d9a9fe44aee268f8e2ac91db803759e73e5623c39d77da454aa2b823ae99c487307eaec40243a2e2c8ba039aafb761ee559bf60d2be34bf9deff9717e22915cc55ec9b90ea56d25972592e3709ba9a469a7eecbd1b4f6ac47ddae1b0c99bb78f7fc52de029df32ebab46724eff9e5689c7fda974aa61794e3985c73d4d4dca475c984d266c963a9eb93efbcc97783a1e43d5f50de0e9deb5e50ae39e7d89be60b6a12d17fd950bea19c34a19b5cebbe9dfe4c6e69d04f9383426adac4918e9a382ecee568cf79771f9c39dacb597271e9cc61a7607bd6d2d2ad995a6b698723efd64cf3835d82ccdddd65c8f691738d72c8322d8e4279864299a6dc5cc51e3c759984ded29d1ca7dde4a7d96e72d3a6fd88a48d462492b6f3f00439efd1d5b4a923c17e8b07ae917eb0f78c3524371214536897cfaa9f90fe9f77cf2fc6611999c23021a1eb7b31bb58e428649c1f0d843f6e3cccc37af0fa47b67fcf8fc6e3892a6855b9057606d3950ac99eddc836807780f353b5d173358c67877db9d330cdd50d11820a12f2f39a1bc21cbe27c60ea4820281ac385455d78ad08ab0bb095f4c1322ec3eafbbbb1b4208bb1b3664558c65d4bfee8658b7aaeac5615f4008bb55a3ea052d18e172430817421de4f213b23135e43a5c024208ad27a525da804bb4110776318cc2424d77b74557ecaad2990502622a52598cff5a36e87a42d4606c5ec8a902810e61139885c1ebba9810eae98150103e9411051848d3125c96718421dc83f1ec209a42f678fd2923085e86114fdcefe88189b178c0a454a99c26666956f5de979899390b0e9e999999d51802127e200212c6f8765729331d6c98ac34968c34bedb058019d123005e90d1c3b703609db0038a1454888f45403b3686d0182cf8f6177947962e0516da31318af0ed1a461cdfde63bb69c95998d0128614d576d3980f6b1651ccd1841e70c10319729c71871033f314d8761c80c776d3aa8739ac33185898dd65bbe12c5b6c2d1e1853be3db5ddb4aa8b1e2b83820d50c077101c4154a8962881a5064210bd41451d465833eec081e42c3d031f3ca35f28810b1313f961aba57c7841c5333b26bdc8f2ecaa2fba7876e92e3918918411a8c8800c2a56888e205309b26352e55e17723c3bf742d11436e0c982c70e35ca90c345b753cac701c0e8028d67972af762b48b163cbb46a358ecc8525222a40df03fd5abb2ed06aa8e7080ff7e1c81478523288185072c653c3b69bbe198ee1e58f9c20a1334b8c062c5a691f0ddaaefeeee51d0cb1862a8fe0b42c69529b698c1164a70f182672e868c60060d13ad1285257a30335f6a851168f0edd60fee6022b57169b438e31b63e1d955315e329e999d66881166e629b1f84ffb4e7d102d5aa0451745f042c5a38322c1d4abb2d40800183058d8f145165934e1d9bd08583cfb7a2fa50a7d0a549346961e5a30a94955bbf6a5dcf8f9efc71529782ee3d9b12bccf81f226cf1ecce5844f1cc12032287b4420e1eeab80294830f735c01fa818739a000d5a0083aa4004141832227405dec9052d5e18457fab18e27bcd2ff3009240610597a80981083222156595125a1ea61092220a4e9f587892639604208284c289152fd3491450e641516d418f908aa353f19e70fd6211cc2330a5de59a461012fddced45a8b6b05d1005f223d53f98f756d5183feda5c698d545dd8a90eb1c84e495f107761582915c5de706dd5c9dfcb4b6b6b7694c680d643e9a2878b9c0da8c7c6d46b3896693791368c364e43b6036ab2ad8ec2603b4c9e60e2a28d98c9c6de268aaaa10975499e26311fdd9668d080d4d4c8ce7b92b10ebcf5f547c541f5e6d0e9baa402e87567b9eaa938baf353285f97893f48ce5b067305fefb90aaf4a25257b117661188cb7b145cd3cb949afdc90ebdba340d8610be4fab73d4e9c70337408258b518e81f393dc0f61376145cf5b21e5d77776af900f7f750aa93e7764f96e3b7658c606f85fcc0ddaf27c580c8649956a8962886e10827479f5a9438ec7d6970823c274d80b82f40ffa183b98f01d4c3cef5ea982ad018914c2e83146c89187bd1ba26accce5492599a6e595cf23cbfcd36254426c86f85469ac2e5ed8be562cea656c15eaf0f7bed6fc80cb3b2a91c1431c6b8b921bff5b9766e13ec75d7700dabba5147eac158203f255a1d7426a6392fb96a36dae11924bd62a242a2ebc4f4cceaa048ba34b9f9e917dbfc3607df57b2f96d11df402b836fc7e6bee0dbad985e260aa4db90ca9eb3c1ae3f496079e189bd0de629d8c1cdec50555555f52c3641cac0327a85652ebf9ce6f2cbbd1896817e5997757d3f82a85f7a69cf74baba7c85a97039bb02b93c0e49ffcbaf4623cb1dae426ed6b5d552ac2808ebb7665113257415fd099efdb962eda843c60de2220c93b237680acbc42656131b16aba14881443f32c6c73e437ede47cbba7490ddef7f184319c120fba102c68078c5c795aea2a740a24347922487069e3622c315af57d1a37a3dc301363c38a237910839815376d3b030e40e519fcf7aeb9820d1be83db28afc0a4bbbbbb2f8c0572b79ed81bb2bdc6f72daf2172866c61087b161196e9697147a4ab61cfd29a21d7767359db0b9fb6c22f90df01fc02e0b74508afeff4f99a9e5919e8ca7226bcb2dc62419b9f266185ff964785bee5d1a0b7bee5e1b916080562f9f200491f2c55969561f9ed2c87966ebd3e241e221bbbcc30ec45668b84812536a419ad0963640696a18a8fae13d3f858c3326bf97bf418d9f0b7a611051287244f1d428e61526e4f4f4fcf7c4057d021844049b26b0e3a24747dd823d403d749cf20d1d5fa10e604d2b01ebdcf90d05588f7b281f637d4d5c333643b4d0c0b3f43f079e8468254a84a6463083d0fdd9f0db9bbbb267565182c5e5ec390a663d8eb353e15fa9d519b2a47f47c3b122cdfd13d9e2cb021a6f8482c0a0ff22a6206f2f4fa230417f8400839f4cc51a50a265c91042baa28c30979bdfe541154c595182b42ff790c1419337333f362ccccccccaf402c182333337333b345e32399b9bbbbbb5b3e33331166666666c8707690bb1b5b9dd199e83bad289f999999392371aa26b2cbb5bbd5ad2e42e8dd9d025177014008216caf2354851d84104218d7a3692760ddfd75f7be7a9a0ed7755d17ea728b4a0fd32885da5c08810a0f714ea654cbbaec6973c1b44960c97c2850a0c8cb4b970b84a233c423c910e4c100155444570a30c4eed39f873c3c3ca5adc8e5eddca52a1e443cb6236888689a34e2b115f11e3005a2a8eab981ef1ea6607a225318c57a9846af52e7d7bb5d28fd252526a47df977d723ec084567c84a32a444540c80a2c28aa7e339d29791e5e1e1e18117d3f44ce6aa3e52463d59e791dcbde6081a1a7624d656c4316fc4ae3eea64af9809164b08057a8f2cce628e0e08d7c967a5181e1e1e15d8e89ebe63689478a02c7eb120d1a12cff9fc6a1597e7f9ef8cbcacd25a3008b6566fed3de011f1da3e3a3145106b2cc0a3e4dbae3904e1e8cf591f2070c7ed81b5131a020470eb020638c1e243186cfc3382f1fc8b5d1111565ac9e1d9310420821953b7ac841910e5b8cf1c4068a61c511e275c57fda14430878fea1620658f3f0f0f03cb1f9146888111aa949f8c11641684144c5951cc00843863d0833f7407ef2576db0dd5d2df510e6c7eef05f10161e56918510fe49ff691a0fdf78f8323f1e4611e3bf9d4284df281ebaf6e0a143c7a4cabd989e874e5343c40814527c1133297bb149474065b80ef5ba88bd3ec2715df4cb7564f9f64ec1ce31c44e66c02d6842c4a3423ace4181142990f6236a238bd0996da22b226646fe6dba5a2952a89cf86e6f28c86f9b24e9553b86a954b18647af2c133be611ea2215d2836cd2a4c993264d9ab4b050fb5d8d305ea34e6db61b7d663d212d2af2830f8120215c6666d883fc568a1415c25ad42a84b8f22bd433cb83b5b251bebd6fa05ed15259c2ef124fd8a67d9d48f9f62582e4dbf746e7a29e214d7ef2f193128f02e91cd8c9112c58a15e6d3fead80676213f2e8253482e5221fa4f382958881b603bf8f655e289d0ce4ffeb7425dc35ad6ae6539614f9f9fb0cc1d6fcd910f12f56ac549d1c38632e4085d5ab6462325da6818a26fe0db2706c362b018ec8ab9608c61d4dde7704ed846f310205bae1a9242ea467446a51ec33bbcd2e11cc824b04ac531313131b1d3a4940c218c551c6b6708590579d381ecd4efce20a121230cbb31669e180de613b30d876cffa427db9a236b61979997f4596b3cc23e8b1a5420ea57b43ebb342b7e86699786f567246dc412e04cd332d208cbb8874199c2b8a740208410eb95f684d9dd6eed15152c2af60310800007122d90f1f5070e29ff49a982038a4ac62ea58430887a88f0021267c8f1860b9cb841154555e480831a400172038c1d406122e1b92b3242cb9a40d0a2071e389ea0c50efb842666f031c6a8761861350b2000b520a8892eba1862e5500880d71f3b9678d2eb8f1d52e40e3116dc30b8805eb8a0091db219b3348931c6c8841b2326e2685285093322136be8a09fc341c68f2a70047d7fbbea82230b387e30278c08411049200219544011c4137108a10350bcb8c10e3e0421c5ca3a41c51e268584af3f4bf022aa96c0c5c714cb4098178272095bbc4aa6968005d791a9491dc85ece027becb1e7c3b717db8110939a922a9d1bd0909fb476909f12b911854873e2dd60b23c7d4474b5811e3b0c7692e6d9bbc2700c952e2464a65eccfa4228bdcf7ba8ecfd2892bc023b0741ce21531c5fb7fd1a8e71af0da067ff11e4f987f749f5e937b668630a91b601c4b3431a16b2b09cd9f311b97777555593ddaa2b1cc42bb067d612ab84fcf84a10cbec152c5724f7609f8444f00a06e3d97542339ebd996980144853b19a20bf9898204e78a0faa42c7a0eda284d006552a4f01496d1b950a260eee115a40421b76779ca22d1d323853d96324581b0b31423ac93ee612278c5ce519e7d274b9952457ed8b39467c7b41847c6040918bbbd182c7227d629d8eeeded6d1f5a481feebd4a25f4de0f166052b0ddebfd6019bd496d108f477e2ae943a69a63144537b051c5b32bc1341fcb047385d95debb22eebb2acb63a6b6af106f6aca14b487e987c51565d6548ddd69d442b19931ddc06e68b445dd4411e5e811d4e911ff3c021a4f47d92024f37f9988779a63c077516c8037bd65948c8d3456d032714c242ca9416a10f4547d800e2d967c0341f69a8cf6e7744b890412fcb3e60ce329ae5d9a14cc168ace215d8bb934ac83b6011e4279508d9da30f3eeeeeeae2ad4a851a3aace1d25ecb1cece0d4aa24acaa1379e3da5b3b34c7cc4ee55d58d6badb5d6eeae478e5389ce0d3becb17f2b24b469f08cb3631ac6836c6d600ce4930f7b7ea2fa19c2f2eccb03a6f958209608f6ac4876e6f96f9fbcacab7331d484027d343445cf4149107ab6e145e3b312f4cd96696a7805f648c303af14088c08194535c59be095be1151f06ac81052dc10fa1d7e11401d99860cf1241b324494ce561b32441496e1285846ad5879f2fa439ef8b08c5aa992e5b9214344d9ef39648828da6858d612ae0aa4e3d88b2dcbfa910278fd59830ad51a48b06020d7e3102473fb122a1a762fd16da8d1ed264e171e80d3de01f0003c7b002000550031c6c8cfdd6d149ebb0f05393cbbea6a73d095bb97767d1c7d69f5799d300a9f410d6319d588d1c0727273796f37268718cb44685da38d9332415e31d7cc6b18c360e8cf2666812543f4e4e084190c01892ecab0c93ad4cc1cebbe9dc7f66b5ac9bf48374d395339da972411e43aa65ee69af9ee6c1decec06ad53f532875b11f8a48c343f25a34eb515818f4dd8a5b61b6bca1d4836fcb4d60bd4b59b803ef40877bbcfb27c75670deaeb1d975b076cca5ea9eb7029d62c3064428c266bcb612f461f8d4ccd002d752f9b63b2e40c50199473aa0f90fea99ef385c22bd658632de4a743afb37303b7909384bdb8c35ee4385291301a1a1bb6db8931ec79497460203fec2316860c43c268ed171ff78aee11d43f15f65be49878c96b7aecc52c41fe8861ef4ae4b2ed91d2047bfe5764f66ef8ca156c5eb9a67b527a560a7b91c7b7eb5684c7ef14f6e246d9a07cb2a18c21a17f0b35ec8d35a43c74b8c243200f07f010000f5b7466a144573160a5bbc185d233ab86aea22f162b568857ae5c71d350205780648dcdcf1a407cf423f1a3f13a066ad8034efec198fc4b350a3bb9ca34e5642e64f4759271ca096b30f903bcfea8e105b4bc27ce84214ed8c2ce3e2f2b1c43b66fcf8f194ba68cf5a4410479e066f99db9a09c11c7af94bf4c220fcf0413422308ff05f985cdda5158ef343285899a77a7757fde37d624cd499a36729216a3bf700eddc5238f2cb265c083a667bc1efad5eb8f19517c0b3d7cb32371bdc5b579b8f6afaad2284d0b0f550b0f5589d79272f5077bd15b3a1faa2f878567dfc863622a1f752ae71fe4a74147a494ce3e4893bb742f3cdcc55b9ceb5e7838e7fb99d675c757c8234152281ad88b7e24853a720339f276950ff688d0b05033c42265ad695d8b7787d36eb9e518966df3a5c8e699b7b0f992d7ba0fbee6dd7d48be9fe45b0fd7ad859cffdaaf5ef2dde5fcd5edc4efe19af7e34bfdc8797436dc70ee828bb7cc9a4e751ff61da7593ebad4a09cd4b78fcc98f28ae5f54728e833d6b8f61f99aa675888ee83379a2148a7f9f8492ab2a79c1815f2d32025db2eb46b9e7538dd71e65b365f5cc89ce42d642cfc36bf7612ec674b9ebd77bbe915c84f8346a31990e4c4385fae09312b2e69595311636648fd1102faf67dd8eede31ced5927cec8ed15d9b1f866573c6d8913cbb2175f1ab41e735df4899ca6b904f9a9fcee3906247f24fe7b5b9031fb6409a96c6790df30ff2db62641fe4114ddc86bbb259d39146c7d8b142fa5f5fc89a21d9b7aa6718a0abee2bbe3d6e116954717e1e74f2c5073fe879980a598d74c6009e4a08a6801b4f81b47b57ac5c0eff7ab95c6d34d7a491a894adf694410a19cd00000010003314002028100c088482e1602ca228baf40314800b8b984a78589acaa324c7614a19430c21000404000000406064b40900da5d98fb1e517efa1e2bb16b999762b0de4170ad222e917f9e3fa811099ca1ff3776e036b9a26b1679ad329f138a99736019efdedb0e6db7cc4a01601eed510f2879103d2a9a1ced50a655b0b37dc985b6998060d4ec58927a6b30eb424a26a7177387a1e7707f923aa3f26c088a8a9e716d8ea23d0745cf121d1dc4b3cae6813f14c7e036a4c6f79355e1dfb4ed88c3cb019f5e49dc5bbe47565f3834300b0754a8bcd5089a382950ea046f327156026a4843f6b0491fe18a509c707c332cb45dba90f8a741e2a8094e0e65b3a4a3adff4ae26223e9ac913c197d6e6561888a0f51a72c949b97503180488c82d694f5e334a7dfbf8accc28b788378307c96ce39d2bf1ecc89dc002ed84c9f5d22f14e259d59463acc9513294a785026479420100c5143b45cae88f0616c27ccdc36011a37d81100a772008b26c85c295a2af6c3daa0ef4e5ad78ca25e55f04adbd1332abc7583f867190ce244274e7a4de1e03880c808246aab64d3d88bd1d3b9813033884a17298e5ca05c289d69398dd097a03ad775679134f720eb5678960cfd277b537a1591fc940e7d6a66163e2e97b40047850627ea1103ca785c165c5520d4fbd48e86314cce5b40910b8353c555dc91b9f7236fca116e9e18e62d50ecdb0b5154a04a08c4c11aa13f7eb00e94c69ecf3b7e4a2054fe2b0fdf66b4f04a42cc810f6c0b2dbc8dd784391e9e318d4c02be0698218d57af59904d9238dda956f4fc7e6dd00209c9ccd6242fd271665e2824daec7f436886043dd8fcc9d8ad241d94cbc82a8342f7b91454c166fa6c394281a6cc14cc3362af39a64c8f87a54c570abedb3ca5d89f4c8c3e63b32ea54d5767fadbb5c65085ce6dfb33501994869e375cf07ed4ae76ae1ec87edc810ce1534c6124ad6b3d5f69c17a8f50c168489b01c41ee7e547be4c80c308431fd232a83f05a58966c65ab403546e3a60accaf02756db442adb172fe9a3de05fd3b9893ffd18ad5964ffa2ac0f5415b0d2f3d053e1ecd6bbfdccbd4000b8fd0853893acaeb7f7e2bc92076ebbb3a4cd90685ca0a821a50b839bc0e8b0ea3a7f25a9c36296c89fd7b6c1e2b9fc9cf1d40d3e3760273021ff3339608e038179be86e656983a71c7b259159e7d8abd19eca19ff986e4fe2f44ae40ea1ef347a6dd35586f8759de845f67fe336ad5675f3b6642bc5da711fb05ff81732aa9b08cd3a21c80586fb124e60926d3a0646a5511f9ebd06cc1f6640448629ca5c3fae067d733aa85a30ed3b0c94fabbb950d6ae0c710e8eda7b947ffa14dfbc61922ab62a97460e33756da8fcbbcce6605e4bcf4296eb62991ef5fc427507e9ae60f8d2c585af523af88f46c049c9e723909e9d87a982c4ce7693c3c861b5132adaa9142a7084aacb1cde1a889d1e35dc319dd448a7d311a796a3d8b4dbab744e67e6d1e9935e769995c4d24e0da18e3adc1d8adbf6854e911352c6867235e6676727db86ed3aad3580f954e6b6bf91c3b36375c28c3350fcae1a8e556503a3b450d8f9e5f0bb82612c3373af07a3ccdda0ea990d01c3153a1b264f100b4702b3b40300953e9d7de507e31ce86a57ef5605d25e4a743e1754292fc552900eae33c36e776a41c278061052fbcec15e16cf0f54ec7abdbe25abd1138206b12405ce86400d4c387c1bc4c40bd7191ca047ad57b0bd86675176a8a28ed4b3b96536cdb04a2d8652bc978a5df322ff9d0bd8a1e1b921999a6f352aade9045870734ce1d9b4112c5cac75590899c73c777a8f5ceb1c576e1f8dc2d55c71ec4376ede16985728cc7a4f2b63bece51c1d7eb7d6ebb9e3f5eb7fae9622a27eac61a277596fb299ef368a944b2b721f0637e9dc7b7b2343b7a591ae4cc36423eb61dae1c8b52d6215d8e51af72bcb995de38ecb0bacab154f8ac70382fa43f6335dd1d2c68ce19d7d3ddcec196f148712ecdd9f3e77362397a31ea6e1b8b2054c415b2f1cfcc826b482c36cc3e33d0cd0eedbba78391cd4817dad788e46194eb551c60f4ff83262c78e2beb06cfa10e1e116a9836e3c91be4ade9cc966a0c45a24d0d1b72a478be2b76f351226a33506e197787ac86ea2e60084c0de9c0a5169e7c03a082e51a08a1c2fd6890c9495c9acc00dafed7695d2a459666755caf45f8e151b59c9137a0259462fd7a99d448adb4cdcab772eb52cf8831545773ca822c2205403c7023368fd6e25dc245eadaaacdd6c4540b51f5a9f1cd809791a38dd70f02457a4b49e547f12730d02a8ae48e201b218871aa7754fe8eacc6a3a1b9a018bdb31194191741cac8b7c0abb74f89a68c7dc216eadf7c16374c1049bbfbb17a9e37ed7ddaf4eb03de0874be8a390f071614f6f964a1b0bc8a10330991e0e47ddbccb8071456e45d718c8485c50bb4209b45b4a18a8d83230054f6aecaa024eebc79ae0ab6f15c33b0191f720f874a60139bba6532203603bec24a5d5b9edbc7c529de672f0084e5ebc07b4576b087583873c505997110fdc7c56c4f20f86943c804104180014e93352037a0485b2666e04ea468540fb5036bbca96dbb7d84b72437d97d5b31fc382a04ef7bde0a43fccd4fa59cbb050825bb73811f7f99f1df5844b11b48f3eea2687477b7a91483a105bbc424d73034b5364a24aa544a1eb46e2a7975e08afe48d2f966e253436703ea57a3630598235f075fc1a536212e140237843fafad10442a081955230fc078d24311d30fa081ad9fd9f985c8663b6c1b39dcaa0316cd2f31cfa73e1b2ff8300fd152d3379c1ad5d77e2d2a14122a6571ddc8a9212cacae2dc0e9a9de715bca5d61d7a7a5f42d3794a78a8a0265d108d4fbc3c646d89da1b936a28c2e949adf835dc4893938465e2d5f6067698a730a2336e5bbde0bb9ab8d63408ac48a71851fc26011151e90d4505265ecfb365cd56498050d916e085797816f9b9d42d997cdfb070cbcad13dbd4fede7a0b35083f1af09af805ec6053cce6517abe825486ece312e1843bc612784169737d14287c4806f7bc1ac3a8993447e55db22e863e0916dd8785805c2fa06af18371a127b2ab1d43d6c6cc860144de4d607e9d0e42f503d27d1d34e359f0e93e571fd3b2f613c61c912a4bfdf8e99a80e1cd4d4332cc9a0eb75f6373f60ed24d300652d21a6d85fe2b2062df4be1c0330eaea1ab946fed396b1756f4ba5700620a748fb24c38d00ca894fb32eeb9c5602dd49390e6fe4105533748824c219d5915c79c9892c2f758a4b00fe9aa9c64d71a35aa616b8c7bfd43d2a38109b7b5ca2667ac2a27c4a08830ce91c2845be9f63bc9fbe106855484b96e876ba6d2d8700d886934baa24ae08e0eb327bdfae73d9d466d52f6832b7dbd511ace9082ecf1d4b9e320c788643ecc1feb9e0b57fe495f7ebf93eed3dfb54f2f5327ed3204d25aa6176e86464202d83ab8263f1fd464d98d48e826cd343b343e90209a6e4da07b026e93732f7f79f18179de36c683e014fc714594329d298b3ac8817de150b17e449a0e93048fa55e4c58317c798495c88a9785bb82aa7feba9d043fbc5962ad805288bdeba21768eabf82d044aa6f52add490e584fe8598b30693dec9ae73774b3cdd211726ec59873d116318922a9e5ed90bc0eef1b18702af29602b80fc4f11fedbad51f09c1de767db71f7101bcb7e5c0c4d03df2cbe5702df1e2bde1dec02c0c6e440764d14ccab19b201e1ba3212038d42bbb2107c0c493634dfaf39362ad4aed4a31a65d5d435b8f9ba50c32e556866dd6ddc3b30f3099349f563fc0206c613325aafe925e9379d8d4be50623d97ed7f0a2d66d829efef8cfc6d1dfcf3f5318411cc3778865174092d6b4968dcbc307f69cdf48d4bf8f2e7345d090fadd7c6629add4ef96e0e79c8eef5443b491986039dd8380508a31ca7951577718a72efc5d112682fb2d2c5cc416efe23c24df5d6650f78522e9e394f6debadbe978dcad4d7c9a0858dd028cc0829279f601e3f6af99217d6fe4af0c468f72f2d9d83502ac04c3e59f91edb0ba48f6dc29bec8b6b270e792001163b968b6da17491a31cd5502ffbe32e42a6fd158c5231a595972d9834f90dbd7cd825b45e9721e27907b88ce2f6a19be9a1ee7b895cc3d0b1acfbe19e9676662317ad0f670bd204e31874506442f166f98f9ab24e82ae3011b9f4f06e1ac7f56c683ff796c216e2dfe648569de502ecddc29cc583648a0bb229304c9b0517a772366c59629da65fd9a03c68865668363dcea89001caf0b10d5037c299d97d4255c38ddc7a76075132558f752e7ccb6d9fa94a67af54b344abc0c17c9db68bff5b0a05562e981d30ca7396bfe8e7e0ab85d74b9acba8b09437d6673bba14db88ebc20560cb655b6c43143f261edd30ff5b3836ec5c0d932633cd17407bf5dd787f61a3bde3c5fa96116ab6a874063f09aa88d38b37f65549d8724b2435eae9791db34f1d548543cc7cdee3efbdbabc3bd63c43d375df7764ba2ed508e4c9cddc7533ee0929a3afd4e7bbb670720041fb58716c441047a9814ab72eff174711436c6db6ffec99bccc6135ff48d46040443b03ff40b0fab0507d0ca0d725bca5c42ada12ba0aaca5d077ab4a56d22c7cfd40238d92852880f9220ba65386e098d99d2e96b25728c7b831ea5c43ad3d86fed86a4ed2705261457d339e98e22124ed0909576230be3727f4a04f71a08c07cc4efc193e0f3dcd96d51546dadbd401e8f218328c29d18eb264322586f2868f9b911370a2b2e986dcd89500d396778d5837bb6a525fd7f3c75373ee8d3564c9cedb2bce81ef9a3af262cdd9915c5fe37d666cb403c2e0aad754a07a8d3bd5127e35c0662df536b9dbe85e54aa8f175522b121d699fc1895789dac2505cdf12c89ed75d90579c44e2676ba387649684c1a0b403df6bf4b1d1d35e53f45d194ebb1556ea75a3587f450b304f9f9ebc7157c885ba2be6142b99bd249a1473fc613edbc7dd0e61860b1cceab4a031aec3f5d130e662e3180bc9e3ec29eb327b344c755dc55d64c7b482490ac0c59fd766c09e9ded6405f1ef07c24023f22ba5f2c66adec6e7d84730c0131f760e45e0be7003084e9951e8abe192d713c6de82752533d6390531870cd53789333490fa8d2a933817493f4e0ac4416c6836ff5518152f15ee3aa96d724d5433164c476820f5984344f9f46ce640413478fff165b263eafbf93a0c2fa26bedcaf468f9a90ab89c1e0882b7a1672423ed10eb76956fc33c4813ca86b16d1d1ecbd24bd5baed825b76c49fb82198e380966d188ce2ce9a654c18139e0892f1bb63e125c6037b7a0de78360772a3be00e70fd7d8f1acb5007d15017b4d51cd299c43492569d53f5c9f30fb66223c9d5fadc6f50d4f8e5f6fae2116faf810ad6ca3ef1a531e1d4a3ee41a162f4b4634849210128f077e38c3d19ba7ed7e34448e4a6ad570a3a4b90f6767876a0868f4391458f8580f65beebb0a1251615caee21099413c1abfa680faaa560ca06a7ca7c893000f81cd8178fcb444c6d0dad96466e7b03832a38e17217307b1369f4dddc7923f0ff932f0e9dd1deb7a35a435be53460a90eb84e704ac53c28bc2376529dbca82c02bddb51b53c23be15c8ca0f9e2dbdf29c633fa7d8a70ce8e2a697c7ba55faf9d91242da72caeeef544dc734e1c0214f9a6304883e42a01875faa9eaf2c208a41a8e3eb9fe7688e0895320bdbba80ad07b2f21eb3fb22125274e41d9604dae03594dcb08ff2c26c4e2ef12ea0cd34a7ec56192968249460e7017f7ccb2437b6c6cfa4287dcef5ab6ce52b7e704fa2291ddd07303d6020cfb85a5b94bd832ab4671953b952065ba27cb6a54e74177b476b4ab815ee54069f03ef042fdb60e3486db6858be2aee5d5c6d1f205804abf020896d92fc6e2f239b505eb40bbf7a46333b79046bc1aa0479b89991a238f1968b2cfd44bb4ba7f415113940794967dc49733595c5e96560ca13d7ffb2397a2e77771687250424f81dc4814b4a63a3bcc8c1d5358b6660f027ca15654267a08361db038e0d80ae623d069703a73e790c6be0055ba4661c03834dc0cfadca40504cc773c82442646643dd0a32b951d23bf9185a2ccdd1df4358c51e8dd300143a947f91f3a02eb812ff18de11c90b527c8390ad1ce1c684ee139eb852d04debb6fce897e2f61c9fed1adee0549b888bc00581632837ddd9dbd2933727278f1b29cda149c94e8b599123f4c933e99a5788b2c3e4abe3404739df882c3121045b03cda11e804d804909551237a077d9461b16a22842074f6358cd588720a3c993bf580933b17af30a078ffbf9cb0262ae3c65696c600bc060e53877286185d464bc50d2aac3c70a686954914627d71048a318ee9b09c0f556f454dbc1baceb933b3ce156cf358483f2762291577efcfe92f044e7a8740a649e041cbf46cab0888f148e13f033071e0a682bbcb155c40629a4680dd51f6161c547ea124b9450f0c6f4a48b5191647442a089481fa9a0b315230878ba060460e28dcf4d3a39748f37ad01aae0438a0db54589bcb23e34a8e339ef349343a8163247af13d0b9d52a8c32ca6c5a9c616d746e0ce016f3a1a5a06db69c71afb2f23097ad187990830cd44515bd4951ef6fa4f5ae35f922869b0c373a67b6b9a8ccb496a44aacaf5a341fa68c55f80da3e072e4ac65b27c676fb01d64b8aaa0d840721d9346bd815a80e1622771c28be690d5466731b227aef6a6668a042aa172d063a4420fb1a8fc9b4a6a365ff42642be0586a938ac136bc3e52a9a5824a83aaed55b2e7aac2556aa7964115a6a0b454ea8e30ccd98faa4a8dc87e94cd898c640385423c8bde5a990b116f107d7ced666516e209a8d8ac105ff617c33b14869547c3e2015b46d5041703b87935a45a460895c301f541e0fb44f524c314f1fc3dff31e0d2bd7da2d9ae5909d0ba900939ef4f5681b088ccf2f4627452ae290edc4f2c2684c6bd9d83a59c5d251c2d0d47808cf9d15fa5ec965a2aebe058bf59737b374321c3f406c63d96c2d4d3aea44e58032c2b80f19d2f4d47b62dee57eb1c04fb4680adbc6074ae9a15ee29dda1407cc557014cec0ab4491a803191d74b8b45d5fb538e4edb5a0db4741bc3604eaccea0d8f26b19f6e1a7dff1d9222ab7e7488e36387e9c0114511e2f55e25f8b705518f40865024137d0719bc1785837036de967f222c524e3a7904646933caecba1439c0e199bb243b040e97830534dcef9cda3583861a0a75e7430c03c3fea8fec12ed91fb93b008a616e98cd64824d3bb0aad727825751f6c552be768d0f86844ce17f4b6c5457468f89d85040b012349119f1eb7b29cd7a01f59dbcb5ebc73319e17db9fcad5eef2fe5b835b1e0e1e4c54b7b838770904ad9e4c15a107c60f4b90f5e41f185c72cf34fec3402cf95b90f3902cec3bf81a842681774a6a0177d3c14065edf2b4cadda20b635208f91b050120eebe65046c60ee156456771f7ad52627737f1f24a0ac031305d1afd57532b868a9db88d86ddc48e6d7b618cb901ce4db2cf0d04750ea392a28877ee3b8d9bc8a0a9a51efeefc1697a12e19fd3afb342d71df33eea7578d222f6565caffa971c267bce264c90bd1cae2db3075d51e30b6175fb23deb7f55ae73c5fa5a71f943812c3a42ab22f5df5a824a32be7c1f1421e08b2bb7503e1d318e2ac2f0fe3d68071fbecff2213d1cc5dca587083425c7ef4384772cb54336b289ac838418a01abc008a7c6c3551df5fab551381f2e89a774c771d07610e00252f82ca18d3501a40e66516717c3bc68b524fba9e634022300cffdc291842c8d27939d8a8262d6fe13eafcb2203252fb82728c1a08a85c6a47ba680b07ad46b2e01eb45170d15d4cd6d96fd18cfa68d73dd7cd274e238081ec6ea653af45e94d34e4644c2f654225acfe879bc6c9273cfa395316790a76d1f0379a4e3beed58ce0ea93ab08bcfedc331832d158d5de18a7ce1be312b85274a7f7411086d65174c90113042169f233bf51915eb58c9f76425f2ab9509540d7e02e2d861b7eb16c7f3d59d43e3692adf614b0c8e3a84d8e9221e71cce246614cbed15b5aa3e44bedc488982af616563850c725d7abbda13fd1022bf32a14700979ffe382795c53362515fbe97d73fcfc1b8a0222e83185e42560f0b8d6772d4ef90e6ada91e8443bc6bc9b0349da6aa78283009a0ebd301b6c5a91e3521f854632061157ab3c7738349e65d4625c7522c2c7c12b778baa6a71d0c5ef77c0b455d54c240a7ff797f8d9a6f631297cf56b66b447de0ac9c3bbac3421ccea76e9d886f3ecbbfa021eab6e117145e7a52f381f8d00374bc9edec3c3b12a27767c86e4e12a451263485ff0a1118ca87dfaa352c8b8eece52d801c74043732e66934eaad204e40f8f7e39861721faebe0a7f3e8c192c05ee610a0681897911eed1a5babc6f3275fcd4606740851ccdbb2261ac3525fa5b6279d783f04139026537bb19caa9f3f8fd2153c4a68270229de89c6f357db22a72e45d4dc76e8ebb60a2aa38b496f142533eab0f8821042c0a313a5a640eae2cb82c7185d195895490837d10b5f8fc246a09ed33893092064224c827fc368319337363055928653cf8650e55a8d3805c28cb176134a40190f2d36c52a4decd79768c3dd29cf9619b190c6bf0313128f79a13d4e821150a43e4da4095e366abea567fdfe7cc8ddc320cfa2dd0f0a0838a49cafb83fbb0343f7782d15eab205ef0b3b0361cb2e4950bab69b72a425d6d53d60c0753f7bc90c9dc0977eeb2f285cc6f76a42fc7a165fa9116b5909e1aa9f117b7a514c578a3884036ac1d697b1d8798b0291bdd7abc0efdab03722adc38a17d2a0813b7be99cc4f18e89cc99c46342fdfec67de88055347ced5134e2a6883d07d64fdee1585270f952ebe18357660c3222ac4b6dbe193f87209c0dd9bf9c0675096b9f00e77a321230736068fcbda3ef0fc3420c89c98009d1ab2403897c1f371310520be0e99b18d28e1b714466f284530e0e70f04ca819d52b8c10ca8371c6deb847945ce7c577ee665504f161203fbb67c76eb94c9636f8050b7652485d98a0a39cb96ee3001e8905f4d8446d8fa9dd8f154fc0c01ea9a81ba87c30400788077caf399fe1fe66b061a264d5b7f5b030eca06de2abd1fa830fddde0e46ce9ea7a21131a000b69e7e463f4cfe91fa1d0cb4123e34fa4f8311f0b03a8c617458c406e9c72cabd0dce8667879b8f52104d06e3434e772d1ce58ae7e0dfd2ed47430c19dcf858c06d6693cad417a83862b6fd3ca47575349ec98c9cebff2321a6cc2edb00d3682bc8c2175471f5259fae8b43e0f87940059e40ad724caa4ac9d2885a43326efe2fc334735c8b7d64b07b1197f46d9497b61c3350de245a1264047ff8ebde6d0ea6878cdd67173ea05c1f280aa8bb1135ece590960ddda5ec0ab63fb8b864c680da29a622fb85f647d47b89d1c07a890d6bf31c2f8ce9b838a9a0c205d111abde73d20874414823a2e247d51a0d11bdf084f9f0bb1a3905ae85e4a1c01399a913d25e0b7cbd22f27c36b20d34c000e82e6f52d78c3e2f04b159bea1689cdbe831b84035f13da25ca86946f5ebe9b53c5ecbd469ae54235e070de7168d909552e6b0d8006b0cd63d7bcaae1484510661f54219d1d17409f638ea5e5a74f417636e899209d2f7b21d19767c1983336c8d4cc743fe3e1991e86b19d602815def0b0e245f561b0f0ae0244d2f2f95688fa413a03f5f85826863464dbd2f4cfc85e49eae2ef717019ee1056d8e439a388b1da3ad38e6a94112ed0641d472da108a01e5b90b67bbd193f5b44c02707214c334543de0c8a1756d086a1fe480ff2c6770279d94945650b0af43d6fa3efc63524c15f68002fe8e5d931cb21f686e26e89a8cbf908b833b1293b38873a1408ddc2c879b800ecb4d26ffb7dc9cd3634265c09d90be8ffc611421c699dea6cd7fe61306e08cd42d4e476d66c4b8bbba1c204232c9344aa248e17a8ceda3a76318e37c2ea54073647865684b7c7dcd47aa218a506fb4f02f19b234c53e62aa627051b21f0a777ce0f1abacd3da0e69783402d27138e8963a6107faa5ace5d9887e3887a99b0d31f2be08720524323c1b057939f9ecb2be6a8908604bdeaf5f4fb7b0402fcb16b2c34a1150b909cd7a1a5d8a1564a1ff0efd82630530cf5b0057d0f4ba29e00a4872083a0f26003ae043981616b815eeeada68d0a9f8b795f7fda257186820423daf67521a58fc99814878c17e881c01727957502602cc40b72ed62ff3024e1ce656a33197fbc067c3f707af22cddb334bd75765abcdc0624a26e3e234ff8553df4c8d6ec6471e844cc24b5f7921238c700b8dba9a04f7469fd8431e72d06296f2caec7b6429e610eec8f6ec99dab250446e55d13d42b12137aacf3e0b8f3a66704db774cb46f49fc2e5df50d240728c707a1693241e9b715fc1abc0f7bd6584f5cc0c07dac263e6155cc7b49f6a61c2902efd3dbd19019905dddda33f0d21f446945640bec5823c6450bc23e2d40633b9a15f65e12b2a7de876b7387b79947c04554e49b9cf89cff1c978c80f37a50eb0335ed0a4ae300cc6d85d9eba14dd12f0e284110cfc76b092378ab8e70155f492445ce91aaa7b359dbbec1a7de910881bbec48d7a50f8dfda9c0a88907fbc2c365acf06e3d7af678ad381fbedf212e0acbac38ae557c46814081f8f5ac26c9c03f40bea236282f50438303fd1631fc46d25bc7d035d2d692ad38499dd047df3d534fb105ee6d6cc243e56335f20e400cd0830130f9916fd4961a105734f5772a0ae2ab78b30ca4b22b7234fcaf150e8b2d9c8866e6e836f8ebabf05ac3ff4c5268583f64ed726df95c8c813449ca43edd87cbf9829f4436ad864f53e9de0984120d99190e5bb2ec0f5999a832ebac279acc85860989ea878a2c230eb19a321b8dd387e7a75915baa0400d7502a50e79d14aafb5b0e17fe3bc4ccb72025881f14e25ffb927f2d8eec89a573eee0be9f959fcebf2db4f5a7ac8d081a8c412434bc83541545348e045223da477b07b456a8a56441c4978fdae41d3cba0efcf2dbfabea45506f08c2d14c82eabbaa158313865d5b44d8bd050910c812de8a6022dead0506b33773ac9d565bcc0a354c64cd322dad300d4198ab2d7750e687e57d5fb8f5d1f22296bcce2dc4d83445c55d5db73a010f5c996c6bc03e69fb8fd1505fb1d186c6c41ad629f903e4459ac321dd144a4006a67de56fe265c5a823973525cb79854521c33c3de9c5a1a5f4e62f645e3ab8180085ee015001da9705b09480cb37e0495bcc22bd3ebb502212f7c085803fe539b552adea3fecd1c0e23ba06a508731dbd0e3d83aca89912f377e78e2591de12511dc82f5a1c771fa2d05428a9232ef72da9d0ac261fda1e4e71bb5a46a10989854df1aefcbff7ed27c3c9edecfd893d83a90ccb5bca1d632b22ea951d633d6cade24e81d879f2853bc4a5181d3a07b083b73ae421db9f82b57407b27cbe647437f337173aba85fedafd36bff038ea762a37c140eae0c9d9e0e66dd54d64b69e05233845e222f75aaa53676502b885ea133f52ca5b6aa5454e07be5e0ab05cef32ecee6b4addd47d10537e33e4a47402bddb67245846aa376fb5706fbb70f0ba63b1d69cf7ad5bddbadd5ca6406234649dd73b3ebe55131c1ecdab0edcda79de386d357ab6d892d5bf22173783ebb2733abb54d6363b4ad1eeaffa46dcf2b012ca483984537b1bb52719d94b3537ef998b491c0e9cc69b037b34b6f13e4b6901025627330070afd9c9848e6c4b6fda8a33bac86491ba2a4444e68df46f901decd8849cb43d066a560a182dcb73a5f190820a1ef0fc9dc3c7b190e5220f236bb0258ddb798f3a993e490b7a98d77b9ea875166a4fd9963eed580e6c4ad767a6830fb87a66f7133ff083a2d9f79f828b612e0e509960d0e1279f3167a9a7374b47e54f28ae20115a13f3e18f8ba7ad9ff858c5759906989bfefbad4c6416c1b5aac98318e402288f58dcdc6b80565218e3803fb3221d31bf04683fb747183ef0a3b1f162440d5f3649f0c14473aa6f7853d65b7c7764e277c6ad1f811b50706d82700ca28162e6e71927420f374f4a2a71595f4e950f7b0ab0a65d797d82cfbd05c4d133ce73ac02f37b5ae4feb5bd0e1a72cdf60c5d77d0c30890237110b0fb04e7c00e6af79757d155f2c52b5557ab3fcb913ef6520c80d8fe884270b421eb0500e837089e06c551fb01fb01fbff3e96a9e5cde0f5f88d8ca6499b8150daec749497f26d279d50a257b2e169c1123ce32bf8a50c354f5970ed8da68bae843ea3958cf92f3d7a792a28c86491c274b33c1fe40325b28b31eccf450cfc487dbd77c7176cc6a9a5792ab545d6a3c5f5afe0f871d193454e847e458affbb2253e61517558d411b15bcb5ef2ee4c57e42e103e4c8cdf3e033f9d8cbacf7f7cbf151ab18831b692233009a75ca902c965526d13a20a6a38c22164efd850714e958e43a34405f13fddd8b2058a044e8009f92798b689c7223c089dbea170c0f4d57764f5b79b6a7ce3b2f665f6c91af046eda723f088095daf00b36955cce904d0c28d9ba700c98848198d642c108330f7c4b7e835de4f5ca0aa1df7c4866b1c1c75693a4c2281bed883a4211e8281952ac2856a8e578d582124a8cec7d14a3bf3eb1e88767072908cc5433ebc86261b7120fcfb674f1438f565efc16abe09a8b2c471efc422186e2223ee759d9ea011d7177692d088de3aef4edabb22505608c56fbf3b991984fb30f768952fd1bb7835dec9602e1de46af3bf5c5347af6ec4cf9576e2c24544091e952c4d36b5a8489b829eb0020b0cf1351ab7419e8d37c5648ebe49612b1f455d9e3f42d11f533b28497f3bf405042efe9d4644ff039c84a5ad9e9ca5494783d91f66162bd56ff75172517b54b14d9e0cd00247a670e49282d4975f5c146e85547330b749764b3a3e5737ac7bc25017c3cfad3cf082a06cb4689ee22d8c10f4fe334dcc4f94c805e4c7864ad48251db2a9844e05a7878eaa2401cd8072b9785432529e1feff843f79555cd35fc2ab6fb2bb5641d4c086086817c6161549d9e801f98856fc0bd6b378a548552dbcafffe51907fb54a07094f8b2fc74445e3b9c2f2476d68eb8a98452587fa665bd19d83a28acfbe312c38ddc15b9bd56c38fbfbf193231f3672108ef5da813d7d95ec3b27a2213469487c8c2fc4a24bd87671464ea1fdd22cc84cb5f3a597d1631c3f5f41133ad213f1ff0e078dd9d76c4b4714e7fe3e44c35b29e62215947b566c9c3a4153981864fb3713b7498ede26743291b823d9c55516580fdf8316d8980440874acffdb1107e85c1791677452ceced01cc192aca00009e7474a6c44cc1e154a33a29e7b53a760295b351467513e581968df53465f13aac389ea318143edd24625a510df01b170cbb64020a879f347171647a3e2b2565d15351c06e4bcf743b800b753eafc0a0e506f09758d6d0155744f82fae93cb89e892c23973380a5b58ce8a4cfa66fb6c16235329317db68f14b0c941cf230f1ecaa6c03fa1d89bfbc7cbce9047f4a411e12322307071bfadd38b94ed97829ae8eb89b46d05ed35a7e7e60869eb43ae4c3cfaa94d7ccd007f2807056ebd95d11daba10b513316a0381c34d7e6795138e0f8ac658945b96b287991bd8e176523f1c05332110c8242aa2c170ed8c4262894e3b8d028f307a30d7156306823cb6362a160742ce051964247b4cf6d5c04548f855a5d5951aac2584602829bb2de908dbdd1dabbc029885ca4d9bd23f0a4ce577c78d114d95bf421e4849e22248dec6b4b4f727e954b1c208a2803291e1cf721d888c00adb3f4385d6fd3d70342874b7786f637658b34d7b582053783d01fe2055c225990c7697718cb947c7aa7e315843a12ca390594201de987813b5c96a247700cde002bab7331bd75be0d5a3d089b6b233d9164b314a2c08d240cf39b5ca26cf5ba3461d60681b8c993dc6901d917a24052dd8f0174ad2f511e2b0123d539f72df7f065b0babd00f3066e4a766fb278ba30bd1c563ff72503c6a56df325a8e5740f9b7fe0c59736a2aa0a29f98a6f491b9bf73111b9862b2a67ca8e11b649924373928d4aabc244fa0b4fe4cf434aa737842de1f74bfc5839f5cee71dd165c808e06d81ae977b31e5e24affd4e44c8ff31d4b24924a1cb5a6e236cef19eecaef9080bb51fe1c92988d25064776cd57c6f4176945f7b87410956c97580f2fd2e4e06ae781f5f41f5eef9ef1dd33595307cd4d0e7380707932265c0e76c5ead8499c2cd936984ec50bc8ee4595525795c3f6e84310f38c5b44cfe46a04bb085b08698bb5dc994d55dcab0b90060dd75486612546ed557b55487dda0f9f9bdd7ac984a4c750eeb5f21f2a51c603a1d0b724f1e8f35ef745bcd793ce0091e364deb3bc8c5183185881f7e009daf101bb5acb592e79b7f61ef9dff89abe579b62873376e75e5ae06fa5fb9cdb7124129ed47049469330ec870158cdc8a68b4a434bbbb1e792b1051e113d7fc4e0ddd0b85c3816db7fa27299e7aeeee96584aa7df0f67bf75fcdcf21493ae2ca1156b24fcb0efb6b123e5a92fcddece95faff0162332a2391716c79bdf855c2f91c9f1077ff691ff76b56e92fbd094185a2f9180e9247346d3ace6a341d6cd779cc56b01fc318ca9e7c45fa6f25aac78f65b50e272f413274096c4075533914f4ef609eff6b2760c2debf7bfea7add6cbed388531ca18bf28d2a7d323a9b104aa72fc688c6c542f80c2cdf323ccbda2a4d77dd1637fa3533b80065b0d42d3f51a36935bd98787a40f53b1f6c2f5cd4f6a84fe8f669c15da7c2e54991b31763ff079075ef2862736d31c23b6d26f983d45444e9eea07c6326462170a18e7104f5802994607c38680fad400966e61047279f1ff631974a087ed766135756da42107cee1511d4a199004ca0a0495d9d06cd195af3250f50bb8ad1abc03e510b339e7517041bd8b08791bf772d5b70e6a4e6ef88f3b09c4863310b101922cf4096ad25bad4941bcc4486f4aef02dda045cc1d0f633f1685ba8538fcc4e906b41e4b65b83096835975d9e96b8f9f20087a82a0bc62380e4d62bec97482f61f544cec8fab364a7bf46262edb4ef3dc30d733b4b418b9d426db004f17893184a4940c4081b3a2dbf0a9e8be4c241c5c28e69b8370e7092e0469cc42521c239772d1751833ae185a4f54e82671644d1e4f276ee27e0e4f7e3f1ff25023c215e0d58c1d995195c19913ab07762727df06d484f47c93583a2b7216694124f397b38d47b986f734e464b11129daf79bd4ad41c63001ae1929843328c4ebd0bfddb9e1455780d10a8b67ccf57781c9be332971ccf887281cf39a5ccac69cb77d84ab61de9224856c66c0e715c5a0052822739bae87c8ff5d57bbdde1ed87c41cbbb16953ee5698a457c71a5fde86063494c78a8626bfb020dd34358ae36ce77bc904bf110ec797c22c96fe186d699e8cae68366d9fe73c45262dafe9d08ab3f8dfcd58559b26a09cf41f7947c4c9d4aa85a32bb8b97c03d6730d40c89e606385360e53daf30b73f23953c3cd62091377ffd80515facef9c446bfad88107ab288d418c711730ab64edd044da4ade31e7e0efaa2dd607fe11173ebe1a7ce4a1e55e818f0a82bb7afb349795cb47432f41e5c08e34f3e835f1df8b7854ec3bcc3dae52e0d40298382ce3f03259027d0a83be7c24f824778789aafdfd453ae271d099d2edd112a30bbae6e64a0c0b5b6268b8e94abbcf5354c68eee9a4cc91ef1cda9213282b9d04538a481ebb34b7ab09a41bb6526a82f5da39da7792c7176863ce25ec254cd7ce7c149389b2a4c96897f7751db58156f21d5b4f85871bcb5a5a76201f2f207414b35c6e1486b22f9a70e036f4857fd4833663020a2eb843db905dbfa2c3e58467d44d2468a1fa3f13693baad39d64eed56760eda458887afe5c8f27345208b17d45f772be89786b203a020ce73f29aa54a3b840b90665d94a19bfb04f5af2c64499ce77477f3f41bc11f46dd3dbb9e93f8798488642945ccf9c9c8370766f871c4bcc07841f712b3048909fdfbc122961bad57b3d81bfa30f526bc0fff9fe885f72f4bfbcb9de1ff7558709bc3b5d1b2286fd05e25275ba429b4279fd989ee23efe580e28241252cc4a4600f3da16b5c09416cc8a5f91ba8dfe0889dc97c4dda09b4cc70ac9570d0f935034556c8114bfe8e8a4520c2e6c85e63ec5baf12f6d9c4eb4b813bde2076db3575a7fe460e515f9cef2709b208dfba2f7a5a786c310da6f2664b288e602175d78f64ea99d5929f6e255ffe91bcc5ed8374c16d84beef771213dc7203bcc3834a0f6270247b13706ad840405df8307381b812c1bbd167e1bd28d2c008cd1994f2a1bda890a9f3d8366c01e878fc3705dc37e44355e7f5d130725fa773b888ae80b956686ff977ec8dcad0a2600a4409e50e2431fa1a620abae0dba5d5a7d0ad969370a171c18dd0bc57cf32a72c130edf0ee528343b001664eacd8c0b087d766258d133144833fb3e4dba03d6cfda6be677650259c5e430a6ac206b77a309afc0340cb0f5b102a42953020b0af98bef8ef21fab1614ae2a00057685195c8eede4a6648f1818c2da270b9c7d9117fa94ff2f9259f9017347d166832560f30a0e646b28e0966ba4616a6600073f6824cdad44fd4573716cf1675ea525ad728b1ff026c3c5d56917a66f93c8bed4f4721de971bbd1f0e1430748e06ba9f76d73c99f84563b0d62d9a1830dc322278fcb09c6b3a563e5092050ee9adbf79a6aad65462e23b99da99f356462e0e1c0494756e3dea1194646fdb1df5424ace9ac4a5f6da3576b1df8d3604832721b9677a42215d1347f1a11f0282240ced4d94626c19db0ba08bc1af3509ab87a19c6e862fa40ba8e4c059e3043f0b9aaaaf1fc270ac370b05314df24d6e5a777a25723553637f854ad66ad838c627338aeb678078065986ad4a5bc469ae1327f081cdb93386fa933e74a47535735c005b2deeb6417a7fcd1824ef9bf9f1ff6f78785c42e23038742df132e143b014212d11f36a92195fd1a8240769106c615805be5e6424dbf9ecfd0c21d4ec9073b5f2172e7251062421ffc105e4aa19f8c40218a8fc09232cced6de0f9f46601b70427bd1c041cb603e73ca214506aff7dca78584bb4ae6b3e9661a49560e5c1e582adf440b9d0aa8c4474ebc9fdef00bff47388b842f8ef2989581eb2a6b72ab3a9980c25d6ef2856cba2cd67f64eef7e4852289d7a88b9d06c28339201190a0a0d8aa5404b7ff8c47179af166fd3d65d29b678a0d545c0c4fac17a2428e77348da0d01f759a69d32563591a93e03be8efa64f972a970ce27d6e7fe3d05ba43c1e9668ab881b3106bee662cb5adde3c18383434837bf8338765ecdaa18bf78490985d88ce4356e132d4702c37c421e220e560c57e5e310980d219a74956c3a0cef502647f4df36a04762ec397da62ec0bb80e5c1b12f09b6e7497303268dce99a1c8c4450c89ce0b6721b65905ccbfa4c348c54ccf4f2f3714730339d69c4fc993b73eb9a614e95c220871d20dc2048a1bde95bac6390b20e59943b7406d66133493c57ad01054be84daf89f9a8458fff858c36c34663ea246189e87c6bafa46ccd256c74e26ffb225f5506829c0bd0be43ac4be674f813b49d05f31f92ac3a1538d4a2371033d2805b17d75c9c3dbe640d00b24bffbf8f9ee31aad0ffa1e234805d18361cc368f0f82142c0d18f9e9ab3d5ddd58f748a69d4affd73a3dd1b0085cdf7f680caa09ca3e34765ed0c2fd860f131bb4b5d9611d6983c34765843a34c33a3e6821e3c32b5efa25fc302b566e8a31cd57e5f42eb69936d805ae508067f50d6d3558305b606962ca4142d2409c350b280efa862b822bc1ff8713f1775d24dfb2f4e5ea9b3790a784378dcb46a32891229cb4f5accbd5d435699f083f3c07c004c62a4a6aaff8d0112d6574c74d67ef12326005e17226819d7678542b163fed3ec9d3c13a4cbfab8f2d09af9a1cc3e5e849c4474bd4f2dc4609b12969bf9e3d35f19904b6bd7c38ca011df44e162caf7fc541b4643b5ecb0827a2ed59024243028ffa010a04f48d1a9cd6bb52e09b78f337871a683e823471a7b5710a04c2dc504cd7e955a743ab70702a64af17b09621706c12568ea52a1329b85424ed7ec12fa57a3e3f390318beb3e960ae5d8c46f86a41c21763e69001614fcc97acacefe6b9e9347972906d432f570de407579153b003ae2e3e51420e059c67d9a97aea5f55c29354d1eba4181c299e1cf16518a4f8cab6bc67af1ce0a7ab2f332b6e4a66dc3d430b2d60aa17e2851b5c7fbb62f02897dbbf8ed2a69c560d6d4ba75a7b90d54c1447f26c7b0cf4204af34590be4f73d900b726c84e9d71787d8617406e0d15f4b173269ad9bfbd178673dd9868add29d0d4f0e86750546eef24ccd8e2c91a3335954d47fc40f61502a847ff0796fb43e1e7c3ae8006b69a450b8180ff51fb41dd9b926cd8e3b65457f45fae5557447b82e1d7d8aa8225e2f6dbc8a51115f91d669fb97131b7ed7d2375fad6bc5991b959ff95a74635c4c817cebb896375d79ef29ff4dbecd1aaf4608410bbc3006b20d484dcfaa5baca0572c9bbbcf9361b103a57c2e9801bb77c517011043a9686f9a89d8d7749845cca8c322bf6ee1cdfa82747be339b5990efaa2e6e9ae48d6d5390f00c4ddd7accf3089f9ff1cbe1623b124f8a8b4614a138efe62750e9b69e88f76a5c30d952a10ed45f813db913bd1ef74e5e52edf1368f2fb8a7958f5deb10036249f02387aa66a0d70938f4aa2d46f03e162abd7f0b8046f18ea63e8558f57b8022204a54aec2f27636beda00f6444c77db1e95c0e818463e169c2cd3f4544c848891282b03d7736644ab7dc7ec1899dbf5ab75686624761101523cdc42ab005319aa8c18588a14d8a566fd5127558e3c517940d8f0136174732f8427a8a50a654f5f5b112096649220bbd8e6269692deae5d11089706a16fe884c3d0958e19b4dc7b73c9a3f9d12bf2f505d3e5fc249efe535da546f8d3bad7bace15382bd51d83832ab4b343b42ae35b0ac5f92f9eafd791ba340a83b44d581d00beb7c7e0d540f80bd3bf870faa13f15b052df4800d3ef81686f4adea6de9fb5cceada56114292e28f64e1c2e7b661209b8ea785275acd773243debdea06378c3a2a03fc28d3484f734c0454757d07ecd0e5145164640a14d03bacee2cd1afb9722dd3819752482f990882dcefacd0e906dd0227d8bb7065b4f71cbcdd452c35fba5a0be6105daf9a0341dd3472a43c3bd7013081ab0b1ccd0c7d2beb7800066f4d63f4bfa0277a39fdacd4a1f1f4fa37d163611680c1dde2195a7915a763042476b18096080d34233a00959e6cbfdc51ffd214410bc60da2fc9400868d08d40b1e54366f5ec4ed536f48a33216cdde5e09acb4f1d289916eeb7127ab20652026969abb7f30792c2dc238f71e22c034278d088515872e6ebafb3a48b03859b1f0f395e0081d7053c0df78aca27dcfc7506245ab91e7e3628cc7e722db844f9761537353f8755030beb73da5f024a76864c923e7abc9a209fdb1edc3b81caee4218022d49d18d397cea254814471f55b8e85363a050ed6da42a48a883eecf795c84387cebe59eb0ec2404225c0680aca01dddfe5a4fed97d57a3801b47d41ee858673d1a383f490400f39746bfe08685ec568c1d4fd3601451ff58a50d4ec735c2f3c5d65ef1f2bbae8dc355d136ccb06c4ddf82de0fa8e571138a79352796c3d0b50a1a63f596270f51d55f9c0034841ed1e2daf0abde10b956b47a806364ce66b08c749e98c6d39a39900d5e05f6bc591de848bd3c66234ec83e7c946ac7d8d6a68cd6b0eebf790309568fdb4e4db5f2a46a066fe219c389395d1cfcbb9855d55a446306e1148c77de52f0598b903bd56ab5c2cbc68e7c0da7102f70b313701e5ee907923dc9fdd24ac8d5ba6a7bfd068c91b0f7dcb88835c912fad01c94bc0070c1c0f2e8458092458efd5642a6a38524802157c25e47f8f7b6fe739327c9dfcd3548b22ce00af29bc0b18a6d01450308d10c33b0218e92b9e0ca9d5d5347cdb158e4d41030c22cece938a0a583d41cccc4569500e765aacda1a4c302a3108253217a13021002eaa291b2f46e733ba4b5fff203377bf534c85af6b4ee484f606a54bc39a7e57d9da917dcd0b4e02e31338b0b01f5720fabb3c258125bde3c37e7d6e63f347b3b2e02102fe86989ec7d828a0726fa9c6d2a5afe0910053faa3942e8e2471850d1e4dffc92319368aea07c5551e920e9712697d577523595007bc3e9036e0b231921a0c2ae7a77b8235353f3a6e92d942c6856c591866ca1e1201cf44430cb57b6ca86e7b40a8c0dba25ed61655d67ad4caaf368fd83d2caf536be8bcf5b93d5180b3dac48423720397318655d14e37da973dd2647a4cb8bea8d360a3523e83ce232474ef7b4b954b50a101728b09d49b7b6402486ec7a5f1c86e4a518456a87cfeb2f300baa1d8cb703fdfdf85d5041e6ffda4190a5f6ec9663ad1e8f9ddc53849445bc2ca5b02df7ae7d8e31c7c1f3eae67ad43287b393d86a7c9ca3ec2a03541c00440ea754336d0bf14e1cae47109fd71fc24a9859540a5844b6b55af368137a6829aa71b6f7fd95a8eb763ecefff0cdbbd2d1f352653af11795aa25137fc1148d6060ef85bdd6de1129603bc87c06bcd5f21f4706a1859bdfe1f2ee2e33359bf5249f25e1563e51441eaaad72d862c4e6451b04507c9ca23be8914f4ed01239086d01b1813efa545ab1ff1d185b753f86f5f9c79923b3ea1e242b431fe5b56ac6b442614f54ba55ff4e46bd60dfae7f36390534ef666a4977dd25cf20445e15e2086e979431b0208bfb919c7157b2e59e1920deee698ef11ffde7b78a0680a09a911c84b375a506c2506fc32ea2ea705a9e26485ab194ad09b42c18b013419b371b8887c1d8435b9f24ddfa0ec07b63408bb0d7fd909c3c0aadb1c43fd5537111bf126d912ec789cdc6c1668d4649ee99731b3bba02000be9b337960500b18ac1418b2248f55d1a7f8837f3cbac0b8be430263cb16fd0a2ab728f399087472571d8653806dfddb1323912486a38885fb6c4d23e874a17f6754f1bb765c339be812858004ff5110410c05295e232b50f33372bf4875faed8f8fc40685e48cd92b5cfcd6981a9b43c676500e7fc8b99531f98bce0eff43eea41ad1fa35da502e3714db95c994239b548c167c2498b6ad12a41bd258c465ed705467010bf3a6d8589437d430bbb06a828882ffdf0f3a1200e7a7d02085761f89df68891a390d1d42309efa6cf73c3345fa29cc68b4b35343f1045c98daf7d88a443e1002a78a5bf5ed39973ebd4be8d84f5408503b8eedd0c66210ad4ee34d6cf8698e159b1452e55ce67611dc853ce27fe91e59283092bb60e791e6f1de5ca0b0cc15728ca045262c9b5317ac4e0b191c75f6bc1eed5459bf77c98e51d1eddd1f36e6a8b8f679d2510aa9dd012079464ac082503304f735f039128122b3010d96311b6090863e4845cc55afb884917f313400c924b81332c6c1581d64cc316a4a7b8d3590ff9b62600d7d76a4dabd1a42910ddb32caf5d964bd382cfe497c9651850ea5af87404df1d0d9d0f02c3f0b5d10ac2258f932166a9b20aca0a2a9f7c2a6b41c74047c0f54bd1175de32d9fb8eac74863a7552102c7b6afbf9ae5088ae654d085eb7ffe9d329cb4f527b759a587dfb3ebfb5fb0491b4a04b57b2a5bc18fb1e62b65a899ea8219f50ed814eb106864f1016e9362d87b93164c70575eb6eefd63723ff4fe99ea82292f7b9594cad5883c682d7de66f8c6175330e65a509c10a9fb7c067d818c8fc0b1aba2c423ebea40501a35c8ab99cbc984952d73ebef8478913de75a94b7f1f256201f50fca57a0b01763c885ca3b948c62d06c2b9347706e10e6a1b5073885982234aa82a5bb535635a88508bf57939814bf3223fe38c1a9774094a911fb8975e848a231ce4d66fcecf31081e4606c128e439403eef6a70573f22125822c580b41ea1a2f005bbb05d329b472a6f8261cf43e1a22074931e72fc5919e53b12eb404162da45bd2f0d6c2c10d485754017080eadbd1032721e53ad4dae9852fe82ba1cb0421bd9e6bebc2eff489ac9a4cc1cd3479ddea2e0b6b778a5b0cc6ca24248e7561d0eba88f9c8047a5e0bbb943e120a07d308837b10cee30668064cac7fac9a96e68f2c550e5573dfd4c068cd1d41dfc986be343f75e22b2bdea9ccedf7c6a0dc9d056888519a2eb096ea28b82b89170b8c76f9cc51474c66130956e8e2e323f9000615a2d3fb9f8692cf620c58311a04f12043428db93d8306c1489c2a5280ffdd41f52dc01c2398e656a2491e181e98a48e38bdeaf1719b35a226ea05ee16271f541362e466d7bf0b301e9d55707c9e7432019ad3fe7047dcff797d3a4178d2a1ba1f3ebd14c150371d8b5ee4247e4571ced0ba4e7793e0aaddef9859c11f8ca7ad8963ef5f60b66a9e3d2a6e8cc5a2e1f4b821174defd0ee860d498fb854a99237e2c640301497218606d2f47aa3cd9e2a618ad4f7cc8253d7c5d10aca82e4a6cbdf33c4e9ab7c8e3bdc3364d743cc123104be2027344c8c4d66404499c1880dec9ac3011c24a6bb41aa7add009db8deece425e70d5d391d11867ab375c5cd1e10753baa8887a75ed46fb67126832159a1f3a7b332bcbf66232244bc1fafaf9944964bd7568b551066ba47d3ec3cb251d3a2b070dc79fc39491ec8c35866c5eb80be8aba78cbf57ec4c201bc883cc14abff693048a3f5b611647bdb959dd0892c12db09730da8dc0d266b3bbaf13ed9051ae0119428a7a1c20a0ebf0dc71f5d02a22e6a5b1fb1e4c6238d20b8840b04901fe6ffd15577f31b8bfd18024025611d92c3cc1e1b7fdc8480628ad877d45304761c70e6ae3e48bdc8bb3c823efe729312bca0b92c0ce8a528a74d5057da9f974c5f1ce99d3b1c2b1a7ab3e12da8c3e0deb445d36a4ad4deacb31d97aa9c0f777590d021b228102245426a9f0aa66d100abbd4b6c7948319006458ae9612726258959044b84f5b85ada554206c0d9c00c40b5bfe15cc4fdafdb1c46aa72f5c47be01ff93c80c29ebea970a6b4960c10896722e799016195e50e26997dca2ceee03db898edf8081545ffcbcc7f34e5958cf88f895f2288b3b237f32cc52da4b687a8d9321ef0043699aa067ac730500c4a77fd4deb18d763755c9ea68b3438d3681fd47e1eaa829bdbda8ba9ce4cea6c40cb4879ce638e6a1a032fe59250ad2315668520bc24d7a15a19f1672b9d7c65cf5ed76988b5a64856865e066d173d5328d8eedc775d71f14001645aed3c56a7dbe7403ecac52cfffe47ae227c27e0744574ad30445759899a52bc40babc9b77ce930f8b18bde4feeb5cc0929d2bed4d33e60c53e2769c6df93097359551c146e340cd99d548fd55b5298014ee42d85c6503d799ba06b0afe5a00e0959c99a237e6081464979aed549bb894e4fdcf08a2702f97db391bcb37787307e818c6c0204ed459a28b81544be175ac5dbc6fd6b0c0afaa7a5180f5d25a182d2e6697728b4977c33a0abd6c5bfb0aaca3ec875aaf7e415024e3f109f3a53bc7cba74e88eae2ac1cad7efbb560b66b2800c2258a476b11a70f5a3cce93e36eb77c5c75a09dfe97c633a5d9e1dd43f4687d3a3d6c60b7925d6e545a3ed43187579a345644074738ea8a15c815a5e80bda7f31284bfc7439c06f4bfe504e5118ca3bc362ecc063a45d1a15f7f1d090363e25ae9e3a27ac26f196413adbf731aad50d40960d69207ddbe62e59a1b97811b6ae5349ce9c41aad34e56298d8cdd712b00cb58ca0a3fd577da15af828d5d347a1ce13be25b8a97d0eca283d2b0e7ce63295b1883d5b017befa5b3a61c7cef2783def8c0f65d80bb02664629562c1742fcf61437ac406267a12b9be0b32ceea4f0bd9d0b71113a90be08c3696b66e0c21fdf180b5cc32f8326c4474d00ad708f8216b5735af3c86e328921bda3ef10dc39119d900d879268c4a5204c6e8c3af35e9a57cbdbec908b74c7315600323569f20c4f04d938e297eed83631b2e2332208d791bf4ff4bb6758259daec6edb46d1e13ea32de78adf5fd34778b229bdfae8c8904e708031fd5fc88a0ec15d0e0834fd20ed44b9b9db1859e6fcab29d9100e0709fd58ece43063c8a1890f233b4c7c4bc239df6ac2f23a0e2d230a33fd9eefe616ca5d2c928730b16001efa7ab0028db836b90b2a8d1ee607028dbf321f771532cf8263ff48f84e5c8ecd4eae90562ec6f23fcfd82b9063d379ab467b3f17929fabbc8a1553683d57a64a64faa2585ead53184bd5afa1767b3563a0e2bb7bc3917f50fc4a685a7db407558ca683c9c769027b83b59bd8b0fc7f36569ee2ddd9cddc638024fe57c59b2fc87eebab9860d8b49bb51b27a7722c42b4579f3e6433748ccc222e021b1531a82ffb7accff71860144e746476616ce53b36bf6c5d3fe44ca2d84b31f21cd01cb87af09ff5561c657ae1b6c8c9bdced7b54590dd2c802caf9b7a3b26a77550fc19339094475c2fc9bcc784b4ed497158ab9ff2b0c7fbe80fd098730779614c50796a00a03f7cec317a9e8bbb33881d686a9830c5f6dfba5bc7d419a6e66d9e6d9a059751818621b838be7b3cf247bb404fc99215e39776a909cdddaf3c91d4800273f8009d2259292db2f4ed2c9a6940a93812cbdb5e15c72865d088f990d51a364bbbe15b1a0d9d4ba416d810d29587ea1d4a3b1f0016ad6668509f93527aa8e2b5c1be97fe8550e05052f43b6901100ac4caf7692706e666027c971917d6cffce11d165ae1c1520cae64f62fd09c4141bb9d7e70db6bead9d6f73f6cc800653c5a18c0a4e930f8dca8bb7b9ca13482281884e7862a76560dbbf9ce4fce0cd1347ad9f460be300ce08470303b48484be751b9dc90408c224735cccaf0161dda2090e0ceb56383019a795ae0992e49864b18529289ae5dabd9415b13a17c0a8717fb84b83f9cc658c496ce633fddb9dded7d6f05f69d624089d9f86cc100b565991aeef9894b28addad7035fb948208354f57fc2cede383f0e9d30863c941e8f7696ad89839cb42abfdcb6164aa1311d5809f15e6f4217c7890a58e41d144dcfeef26c148067b79003870989cb1c75b65fda717244563285c1ba789b8074989cbd8dadbb01a56951b93e36d692f181c53c8282243e76d724939936889e978a7854aa433eafe49470d8649d563d8504318b4808d83805cbb5b08dda8c341e8adae03d1d18c6cb216cb8d517b4932545b4496f71f38f91710145ebbf57c8aa836408df887bd8b45e1198329b38e091a7fb6a92cc60e71a2ed9c6b4cf00cca65b0e815111512e8d27bc8e5b0401161624fe306b9fd15d2290e3c24a690d85b244502d807ad062bab51df6ec1c1f5da14d6aa9e37da4567832f718bbc88e6b5609d921ef48f73579f77cbbf1d3e2f0178def5129c8b0ec602d1e670ee1b57afd40d202466996c3e5ff460b72ea43d37d8bdf407dbcd08a714baad19a93057b60a24603c1091e6855a6411de40086ae1bfb066d0847257c5fc423b77ee3f07deb6b6283a76ae468a7cb68d5a21ffe958f7680160f6ce33ab5cb3b24efe7221c5e079934af8f4c999d3d6db4ea304d6d5cf1bb04e8fb7dd5580c3c073fbfceb73e12137933fbec510f24674e9ce6d134988e92dccce8d861fe87a373e2301b71a9ecdc2f7874021db83ed48256da7e0533deb1d6c5787f7e8eb0f799f04224219120fbe042429c3018bcb1e41ca371ab4d4029b7c451e544219ae7e0883df4f680c11222e7c1d2819b447f55bf4b9538bb70812aa17c69ca3501ddde7772379ee97bb3ec911bbaf21d7e2776c6d3b2d9745a6d064b65de93a9d6ed7527ffc695b0f1db675c24da2fe735b81e7a7037612894df36291fb3c7819b1ae2fcad6ddc10f19e6181e4f0792a0597162920020f3fc1f19baa304189351fc75c938d152528042d63b2bcd0aeb0aae0de3f870c67988493fed88db098360a23131a98fd379c58753c7f9835e9b1c38d37e261a4e680cb1f16b7e10b64946210e6035302c4390ef4bfcb728e8db9055e7083b85f470018f9de07337d043a9d910c7d17b5a2c579d5659e0188b1250c035980832056ef8630ac8a21d2f6421b42126aca6cce8eb2f9c359c823c57349e3b15aeea8a019f8ffea47628d565360051a55ec45448f5765565290edcaf5edce5542eb8875dee421cea423ed6b2db589f8e803970ed29f2dbb09ebfe2b3f561d0901de014ea3be093b161461651f3b28eb7875fa4e95de7c66a5e3c187898161356e2863a47bb9707c89b6ed9997a6f04e2fe6214fa1c8029d5c8e36c7fb3ae1533a2fb462b8652f19d6e7d1f40a0bd5cc0aa8b922e42422b6ea1dab0b7910ed684efb06bfe32724cda31327279ceacb7759994f10d8046e0a32355995a567b322d14866fca65c085af484eaddfb7078ca67df5299e5dcbf4d10120b3807d9bc8bb64fbeb8a06fe62118110d76c458c200496a19d0c62c3226e2c67f3eca15684ee3c87a70c304c46f21c7b6f6396a8448d7429ae74dc564f50880c7b63f0512881301459b0e975bb5859958ed6f23d177743205470095fde6680c5717d0cfde70d4f69da4ae063252f36e3e13f6616d02f1e6c7402b66d3b8cb257b4f21804507fe8887f4fda5e26c11476aac11a8aa1ef1e629d739a549dd2c3077e29276e6825fa33528487b9504eb560dc17a1464db76767b509ac99ebdc30ff2a97ef6b75998f072183df7f93ebe8c43e2696f597808a8cb18ec6ad164b3e38e39202757d170b524d8f53cc88e4992ac87a5c5d169b70ed852a4c957fd0955ad1857e82b5551211bd14d05864b2718034dd0cf3fccce12b34141d961c6386b8fae306e3f1032ace9475769c2999b167c302c4572c3fc39fd703c4d746d8888187d18774b20c12c0102fb6594abac35023cb482abe2d8cf6612cf0c07536a77c450acd32381a573145414f433c9160a4b78f6fc0cfee4392aad2c031fe4a101988d3307a3160551ab48ebf7a3c80d55ff6c9f784c6e3b71b03138392c2bed2f0334d05d02e5a1a2b3f2ed06549f995067a15efb7d87eabb5f9ed97a4a2119edec44d8cf31bd9e1fbc26a1cf941c9c92cfa4102b51f6b3564875d4352bc559d39c81978aa99b3b34f231eca6e819b76025f367e095c60ed90ee85d743a03ad9419502cd2b98318aa42615398d702f4bcc1f0e66e8e19e344cc9373bf80d30c594853c5b82616ad21867db695d46cc631767b2e2237e5631c4813b60d9e5c7fcdcd33511141501642f8c6492ab1927293a785600d7829ea78821f72abadefe229826de5e22efdcf523a71fa159f0c176ddb61359e113b8fa8a98e635158d5b2127e139b82fceb87b46f11c1646148c3b28993f30a9a3ea2115bddc1b0bb85e8c3456a6f827bca6275e64d4fbcff08769c13d99d307b02e188b1028d90aba53c4d6283872a4df1511499a896c853b79d9bd3c4da6a850f4f2ee927e3dcd3e3c3b954e2321c99a0ea02e2b7d8a44d3362fabd5f3c67a4a45037ab542038bfe8ec6b9a75cf157c0e5ef96af31cb92193ee6744699a7fb9964a0f01074405feb0c38d000672c4903ca088d7d4845ebf068cf8861f5c5311a930e552258a5297a465958cc257d5ca4c1740ed6c4551e15143837b8eaa538e91007072588d6a0db06b63bcfc8358a9cf4261ec0f9db96639349d6ad48d8c3454df4cfe814b6dadcfedaca7187a69c40b7ad145a636c867a39a2b50582cac3e44ceea852e67fb94e4a0f5cecb51528a96daff8fc82616e4b0e79565c10e670341f98e4ae4737ce83ae56ca78e77213050d66c64792de48529324ab9ca64f0473f3a6216f277c21f9711fdab2e814fb1aa39802d217055de4a1ed47ebbb4e04d20d4fd1b9256a726c1b45cc12fe377509143dd139a611bf871b470531b501e2ca4487e383d828290618b879e4363f03e7e908863527102d48bbcb7b9f502c282bcdfd043767d0e4d9be316c71106ed111913c6b1c8a318a898ef3de5867ae7166eb495061747ab0067739a732c66944a6f4d1b59cd56d4c209f356ba79b985be8be30c6b61cb91cf7fef1bd794844e744c0148e30a55ee91dc303076f4247be893f725ac75990715f1f1be263a5e65780e4902e4dd7d99c5532486615bf470963407a51897b5cc9c9a9b11dfc8ec398660d0678aaacc605144640de978344524c0e0ef2e5d075002f5948a4e25eed61f438c7fc3915bbf13f674a54ae932dc514500273dfe8466639a10bc6f9e2d1fbcca35a653a3e27c72ded823af65076a83495ca27723ce905f830d15c897ccb1429ebba36c08c4e40f5e94fb67663bce3e3cfe27bafd608497cffe2adbfcc9739fd034ffe8abcea66d9ae9812bdfdb42f1a42b08da30c06db85673b3ddb218494b421cc40eb27dab12687118322d3d4df4a0c8847e27d22374410a1f1925a58699ffaa9246225df4591c7b364caf17c6c49ff6887f31a162fec9b66417c23999e0bdbc707b574bf3b666e310112b480d64ccced5ca1aafd63288d3592bb8356be466ba72aa507b12af6b643a0a86fc480f79188e201a3d4bc646017546e6acc52cddb2f246a63e4a3e7084c8ad21f57c840cad1b0db09466d026edce01b270685f607459507a237e18f2484028275d3cdbe9b4735458b7d1b79388e3d47def524ca0ef8b8f5a4dcad6c00e897b46b1e1360802ac57a1df5960f6dd6df900fe3b4cb4a58913534a4cf02700adddfe8012afbd329d867c8c5afd3f7e961465ec86b2482c6b9c09eeeb442fff64fd98c56d980d5888bde8fae3cbed1aaecf017b5307b998aa44beeb0445a7e668b4c9ac03e0769d5425c18e3a0f4ac61fcbf2df2a34c24ca9438986617aa951806c91cfaa09e00ee19ca12426e127ec70b33e6032a63a32a6f39b9684626d7d33805040e3af1f5f22919b0e8ed1bd414b8577a7b318b084f18f7462277b1445c46d22a2ffe314a0731a098a97f0673c48429bd485fa6917c1db62202d0a503e5640f4c8071fe2037e73847df046e5a3bb97001c8319898c0435ed17d8d1a4cac21030abaea29ff12c13f15cb9968c0080e28b47c1b5a72be09efc83e011487fae524a6cc51c3fb66c678e30045d1591119d37f931415e7db8b6246d1129cbc45af4fb50740a3dc16a87f33b4d0aab2797a55b703d370c84e39ae2d2e10c098be5e6621572d8e0c409c3f28f364c382ee17fbe20d955cf261f8e49f6bd8fe6c17685936c8238c5f2a155f6438f90faa755be46a9a912687b5c01371ad0a33332b792df49ba9b3422ba5e2202573cb278aced7cd15ae9f35abffb3fbaa6f37b44cb5ce973f4f8d2fbde99c657123facbf7d9d0cd13a794fe066c55e7b47474f20a04a28e1bda4e54149e1d72701ae0efc686e26e4834e8f6fac0a26433be276b8e2afe0144ef63bbfd36e1b8295c0a74769526715b3fe8e7f9da0ccfdb7a73d504eef157d40c90c7931f74504d3d38b4ebc9fa17b46933ca5a7097cc6de1c17c63c8fda0a8f67938d9d7e2dc3e2491330caf3712a204a1017026bdf648b4eee39a74cae5351c846308234e89c125ea79e5c893d51e088e6fca5ae89cb190b90d5b17467ce87f0d0962afb62e3de4f6b59c17466b79f6c5d2e45f100fcdc2f79c3e9c3c03d6ed3eed96f2273a01aa90fb3c357d392842725789a56395dcb252ab8f3e98cc9a1009723f13e76b78357980237d015b5b06b657715c6088b72e42b7b7e5d3731d534b6ea916e597b7fe11122c2d4e4e45399bf4749569eeb7d2c4559a8e3e65d82e49ea4137e23be387e198145d3c7fa097c87d787f7ed6f4a8e80a34e200e0fba6132ee2b2aa975744ce518033873f789583a32f02db9cadab4d25768ea0ffc6148a4e7dffa28e28d3807b8d33f43c2c62ed0151d37e08489bd894797f4c0163b29873a36b17c3316dc87e96bf92f0961317b848a2a6828faffcb49faa67eebd76f27627efa2a3b0eda6fc25a504e14ad2cd5c1b00796b71a15d0d4d96ecbaaa914f337ef5e249fc1ac6ab41258b86069b0dde8ee70b335a2318533e0641363f3fbd0a4afcca664092052071253053be45fc99706434c52678398939cbae04bce39ebb8a8c13df39f18c11ade48b523535c6fafc26ee53eeaca426c8ddcc573faa5b5901ae002d6c04fefd06929c2bc227ef7a648c874ee4646a49904079bdaffe6ce13b30af674adcf38b703ef2f48abe976537f8adf37f099d4990809b8f525c03302c53bcd3a6a7bd641ca415260e4c06b5cfa6e918dd68b5898f840509bb566b4b46f9e28f55d1adc0ad5b59a2ae471f7b5693c12fb4315399c480626acd7c0c8aecbd94c1710ec3218e10f200e30d1c42bd4c780f1f44f61f70efa52b12603301d6cccc6cd615256ab9ad4a95873e390b61b7eca8fbd1f684d0af17962359a909cd248ac9a98efaf825d3c733f72665e1d6bd7691a178d1018416a0723f463e56378996194e90496c8090d6796e8957468e04e77eaa38c83f32810a08f249b8c4403f8a22d2107ce751a6885d52206650bf4662400b6188e2003665be9b4aec40e8264c9552f83f5e8f76c571206dff70c51e44d14bb9fd78e6cd488aac2704181421ed758828c84cd8163e8a3e276d2780a428e3f9a2b8016ac77e9945971069d5003422f3f7f24018e88f74ca9f73a8ac4030290084e87100e2a0796b7f084bc97292d82d52dd49b5abb3ee36b01f932ee1b710b59ae7d820d593015775e7843948170bbd29020ba16053818eb8ed96e0b9fbb97e13d601a2d7a96a241a1b6a479c227c6acab532c39f09b31418b9949ae660ea93243018ea75eb6374f0af7e43448d64e76d0214a62f7234e4608d015f47433ca5fe97029034b1098219a87d54a6ae4669f11d644ec82064eeaf0f79b0bdb0686888eeeb6c1c90447ff9c16b027019fc36147c6d12e9550c44380b18c3414c8694ed43521ecef510531f4e3247000630eb7f5bf1cb02250bd91b14c75a024934947db9b819076ae682b60367ba7d55a4f32e5472c3f7c9f79350cb0880583525e7a8c5067bf9128ae38ad8ec2947ae684000d88df60b28c9c6ecb5a5f9db56034c91c2e0ae4e4edb6d19e6ba31bc125589da11eb7ba671b5c5cba03ef8b86237a98037f11a4879ab7bb5ec534dbf5b2a717e7e9a95c9d61b0dad6cf2ec47c32f88b229ec23407872076dcbc53da95a30d5dc8bd53a8df394a5fb1d2286039723c0fbce26f0685974459ed516d324b47eb472001dc968c5e65e45ef8a3c27bcc9efdba700edd9b2398c07b791ba2940684dad9928e35f6a4147d73ff8fdf7a2e4ce2fe94cd8281f34fbcb19ec83d18d50667390fdd16223f24e8a5d8202291499c9c8bc17b743d06a3c4ed27a0093f2e6a4a8e46370d576f37c6a54153f8c8c35421a56a3cc4546745cf7b2c327a7385dafc2a2c92d85991ab8434c02de2b493a368b460f51c408d53406641d0a1555108055c716c55025504c286a92308766487c14781630d7855c3531f9c7cbe8afe95dad1ae59dfc07721db631e59818e51ff669babad6f9ca9dfcbd94e1fdd1b19470a5071bc0258a1e0b3e84a7ddd88cf8732ef70850aac4c3aafe09e6dc32c1df64737cfbff115539b3812c8312fcf5e93cdc1985791fbce0d8cf8474ce63a181a22eac7dabb0e6a7b0454f2f56d2db18471f6aa82e838814d86cd82c2ea928dc71d33592d0156da1d5a9b35cf4bbaa6e1d2382a9ba7b5c49f1a86abaebaea74001f84023c4d278f97cecc664822a304c6b350617b4afb08b4635394c0f3df9734b13d06519e1a3c54bc75fdbaa02b7d6ee664d22f2f9b970340cfec6ded1282f60f95f29436649db2d6d2b149618a081ce7d7d28304e97952986ee42c51862245aa20c11d751b5cd05c58c6043ffd1ccf3013ea8c9c9081a0980fb5713823883f67af280b6149b3f216e3be96bd5d5109d969d437fb5dbd8e91af1349a6319b76714d382d6a78c8c8415e1739b4e60d6158978170f9266dd0cd2bbf9d7e2226f318fe81472b66ad11ae0ab732a350b7f3770076c3c36432e46a4b1471b281c5c7eafc30e6a98bd8a4bcb0c3939998259a4f27049694cb614d364b6d5f581c68762243ec10f3909ac80124e6b5b920cb91b868958c56040a1e2b932e72d0fbb7be7ceadb1a2995c505a1f18662e57d176a6e69295363b1bdb7b75225b7c18cca49e5ba1cdf4ff60b203a7e541661f4149e70d4456bb1bbbac028f5f27a57a4bad364dda954c6eb7b8184a923a924c0c9d9d498e60d83fff7e00d36e31d42e52e8d8f46ffba8aef637ab4cfc5a2c9f4eeea05c6599c882a524ff7ef80eb7a5b84d6ddc4adf5571dfdadeece0db13c6e0462c2cfeac2fa10288300894ee4d40c246a87fb87856d99136a1e7adcc4a80b328efc96e268b259383936df0bfc1dbedae43ae9c14aea3641f9327af9cede1e77810a1c20c07c8079666ea233ec6dcf406a625a7edaf99ec41381f2394c8b1972a38614fbf013917facaf52c390492b9442a345362012e4fc0d718f11cded67c4f1714e79a494095c6d67f26031be781d16959220194255b1cd2d8f8602a5d112aacfab43f109e6fe6c912f84e768aca857ee7d3be99ffef08113a3763891b6a67b9a8061cc9258a948432b1783788af9c39ba04e8e0c16dadea58e72365b863835464df20bb2b82d91142a67f14241f8e2cb7cc91a7e457a27a5379279c9d12db0686fc7cf692d2f3a761bea5f65ad9f9beb5fcb0986fc3f33722bf5d765449049a02eb9558301a16a503ea8fd9524bb157ee2630ef64a645fbe13f26850b32271dadd90525566a696dbfb056378bb902c80867dc401060657f824c0d3a80e98253a376d8e2d9904cbddb2e8f3332892163b39290bdf7de524a29654a291d09f60842095877373ffc1829d468b8e922742290acbfb5d23c48ef6f5e3b11604f7d4f030d0cbe048c9987f3d61772576ea9005bd37b0f5ea6dafbfee208c97988e96da4293df4a486857ac4e48089b9edc2bc79d3e6ecb5dfbc8e519a4441ea84dcce922316d678a86f597c296b51a824193a4b7a19a77686f4914449b02fc68ea29f790aaaa8ed86986eadafcdd0676ae18b22bf8e522c4f2b7dd66628e987986e7dfa24329a5ca67299c99423b73552bc2b1b5637beaed18f5a05e4a58fb16c392c1fc4ab58ac12fa2fd41f3da66933a36c34aa56c8edea0f31ddd1cb78152d2e3349038a0b7399491a3817b3b2baf18d5ab5da0cf2d2778df4741b6d27fa7de9b36c276a339514a3661969eb5b4958dd469b45796a0fb71b3d954fd2462ddc72e3a536738e7d553b7ae563f2b37abd6b33f469e6a8eca56c31390a7bd2635867d8675bfd5a5f06bed5d6a7f5e957fa2bd6d66597b452b5676df4327e7347db90ec6ad85bec9cc9517c2576cdb7ac87d4a256669e09c183cc89b9470cf32db31d2d9259af651636af69d1e9de4a3076d1bea85f336dfb41fb51966923ad46b3da67db65b52cd334984382b0fd46f3020689715a105a16dc2e08aff9998cbf7371c6e5c62631155b60e2b23603c9f287058c5d6416b5abf76b6340d6388a00f7070d52a84091cd34cc170f110ce0f25308f426027aa5a5c139679e618797badefdb188795c117a613146ec2f8afdf5fe4eafc7bee95b7f03bde17accc63c1a14c1ded23e7b7fa276bc2aa2e447f6da17b1685eaa48f6daa9ff07f6d6ffd04e6d6bc0defa1b6ed06c8da58942ed629c551cccebecdae806f352d8fba9c646c90ffad7db602f6d3bfae34d515dd6c6b2d452981929a5942b9a3965cc211dfb829921430821cce1f2a425f26e7c2fc6156c08199a4c52ca9cdad1f872f3db26d3504c4388bb297dd97bfd7cc4d63aa2720f7d7df4edd3fb205aa5e4d919fc36a414c27e4b383237778c3142a19a4c26bfda8c8993447477ecc81cc74c1bc6995c7fc0f56713167c092fc618a3aae3e6b7350e672e61323dcd0f171c314eb81d26eda7e48841450336092052c9270613b7335d266140c131e6f4bd2ca9dfa6dbb6e3fc9a4c5428c6d8b18130b3a68490737c1bcec02a37c22060a4d46512308f388e3202b580459028e6c021d8c5f587afdbf41e3ea351844693ab451429f5b68ac9aaa5e096cda6c69bbeb4d9d8f81b42cef983f2b498a5ed87d2b7949e5b4a1f63a9f4bdc1d27bb034bfb4c10d8d281c7099c91954aebc7373f2a2903e328969a337b63a44752d9cebc7f370933e36b61a52a73e1da17ea24226742abe3f5c02f3b83e0c13174530163de1fa478150aca87fbbd9337b66cf4b95be9234abf45d4b277350573e2b6db2e7bdb41d82b68ba1514854641429c5514072c851b287c5aef4b8c9f44fb21d37b21d0785606e4ccced640f142f6a2c7a2959ad2fbafe183f611dfed7069d30f452d08aee20195ab87e855b6114ded642ce49513bd973fd658f44e211d07955c93a7ce29c4321e7783074cfa8720aace38c2eec652667ac62f802c9f3299a729fcf4b4121a1337ece80e289d26be1a8f74fe8bcaaf4fdf132932126172b6d328abf94dacaa1b65754e6815d1e7edd8c2797999871e47650c88c282e147a29390485a0bb9c02ebf02b8758876ba17650084e9143a7f91ce5f67750a828caeda010932226ae3f7ce270288a8c82c196ad55a58d5533f32a150a751224edd33d7d248873eef089a35e13e7a094ebdfbebabe04c208638cf18789da7992eb5fe46f093974fd9f0fa5e2c3412108c5ff7d1cf53e08de5af0bc94377127d7ffe9bc940325e95a48c885a84edd31f10809bdf758478c73ee50080abd8733810c4084261cc730f6cca2be8f7ea30cbdf71e377d6f5e515798ba6fd757dedae6d6ba0aa543b305dccdf5ed26f1db72b00e1dfce2dfc3012f0ba031a467b99642d4f71c47a50db0981819213dc00085bb583d898979598cb1371ee095f479aff4732f6552e2c789eadf99e465a0349edc8e57fe3fe5764c4c539c1863c78602e5ff91c0d885a5300bd98107490f435a8789226e2942bab5dbdddd0d01ab9a6ac0c22464809a19661d4f88fbcb411f94dac1c0c0c4db5284741918bbf4a99b00b78fe0c081a236c2523a3210e68e1c638cb16fbcd475daddb87ea395c9a2f6e507849d40b15d8edb30c6182310292311c7c100c161470ed622e63a37e1388e5b472f7feafae63029edfa4b206a8473cec97173c68ddb6088261218012e0c9ea2432d9e35e46ebfd0bb99f23704f8a5dcc46d3b98876fbad13922d132918e3146ea28d6c14d2880c89f7f437c688bc08f30be64954976b777c3f4037929485f7bf7fc93bffc1b15b427b635b4caf44e6e4f35c097ff03beb4364adedb4c7bf267d50ff8f2a5b589f6e4b6865631b4ff5ef86f54323e0459d5cfb6087ff3b73dc186a68fa69a3ec16715d3f7f25e7ceafbb35dcde9e77f40685e3133cbc4c070d8737d2f50e02cd420083bb0c1098a500534a2d809c28c289c8851d8c00408f8210b58f000882ca081c619513011a38801103d6e8af04111bc300285152019a3cd10a3a56801c39c99d92f534771b30e6e3844f33f19b4e7310a980b841042af0d6950fb990afe625cb05e688df95f2abe3ff30b7c18e57befc9f7e083efcd28a517d10b18df9b59f6de834fa8ed833e8a038c5de28565fd3fd30cff3fd3469795912ad5c2d442edefea0ca4a49a719399e6017a8f7358f4406f86de3814495da2f216548878ef6d715dc63d89a94eda444a29a5651de050221f28c4f3315529887076be308305b5c665265f44515287be80f2854e16edef41d8fe208c113affd4ce07354ae91d472ecef1bb40efe74770ef6e0861430bdd1fedeeee6608639432eb4969cfd1eba2e7bec7fa4199f69309088432ed279373efc4281fccbda7716e12279c534e0921843e68a0b7f48143d82f8e389a68500998ef3c4c06c7291dfae53db74e57a18784385705466d0088738f1b32f436c0a8a682b9d74045432ca5a8c88775bcb76e8cefc1ad69d0c33ade77741e87b25b423805ee21abeb21eeae87a4a81dbdf1a76652768c23762eeaf460fdb4191e9ea1211f1a72776738e79c306e2e0d016e05c4ef0a70f96da3a8733c20aac4dcfb0e07aa3af7509c97183501e6decb38f7feb23496a5395a01ef258d274ae7fb23c07def2b473df1141d722452843a077214537104d1f59f11145420a182dbb913f7e93c8afb9ece780374ce09e78c3f658c32c6e7839efddd866915e82dc68edd36a32ff4d600e31258d6cf7ff023c358dff3cf6e6a3ee45b4fb519a83643217d164e5b2d642ee44bcdc7fbf9d37631c619a2cd9e125c5cc480d00592413b457a9acaa9ee8049a9bfd067f911fbfe1dda68a45108238411ce8cb451a7f329fd69a973d43e3b63d9180d5ab853fb9d373ae79c1db5a865bb1dee6573a06f5918b410351fec726c2e1489105461280645ac808a0d7e70206c601bc6e8322cd0e23345951554910413aec8b1816d60a203269c10c20d8c18e3073f01e5af16885287c0b91ca4b3a4009783748edc2144eeb40708691dc253dafddfeb320ed2dd383aee807e4b09b5ebef268e7a59d4ae71baed15d5ff21dc78e82793c04ad0bff2424471577e345de361061b3dc3e781279705c9ed9f41421cb9994de520219adcd2fb6356c69a0c0c7449b68397f4d8685b793884fa5e463ecb5c418ddff759b2d84cf3d133947ec576a32f3d6b3325d24b127c6d834daafc97814176ece42fddfe96bea32ba4d1e8a93633a27565926c67ba5366fed466a65681f896965919b2d764a87744922bb61b72575a6420d2556ee9a7560116ed651e69f4fc2b5b0e235be743cd47fffcd2367a9957e9769a3686ecb5e77b4929e5d6f963dfb23dcd47f6da635a363252e5e7e05fface79f4f259beb4b2fda594447ae6a7cd9046dbdf95af40fc1175d46834caa9a3917f8b0f7fed4732d0d30cdaafbc561fd3664abfb275251b03b30ed233eb18fd0acb561feb6ce53403e9b31fb5dc919d4ce964a24c052ece357cefa5ded715937bbb23111486914bba1c44e4e487293f5484c1731170990a222a39393faeed98f6c91946ee19512e5351d4c5edfae7f6c75ca6a22807b7b5192d4ae50b6132e7a80654e5d7976a158e6b9b17b3d765612dceb58936bf5185a9fd7f7d5fd6659ba747b342e51be38604c88a1fa25c0efae1090fe172d00f46ee09a89ca08bcb4127d0a2df53703908c7c9c5589bd1c4a8fe18491ba33a851056cbb2ea97eab3544b73b930d6f7b8d6b7b1d88e324ba9446f5c7919b738f8a9cb95efaded599665591df6cc2cdaf336c4d4bfe580d9b105c1611bb2430f3ed8348e73ede244ed0bf9baf51b16bf84d0104208a7c03431bcbbe345a9f57cad8fd1b29e6ed25adb9cd29adb7bebc586fdbca93b149836450ba3f2e53939f735157e4d0a951d273675027d52a1735a76a40175c9ca6b9b2f71a0cd9b6cfee3cfe34b9c47b31dbd6c57472b735a3fa7c6f3bae6949a0c7ea9f51fd611ffb5873dfa34fa395cdff09b25d336f8d9b6f29260ecd86a5aea4eaad52be7b1ea77126a6b6df611c5e8d6b7a538d7c54c27712e4689da67353ae9cb595810181cc535e75cd4a6ed9d22d4ce7f60c0ae0cb2b03c3f337d94459bb1a87d42e755f46d1cd5b6eb9c1bdfc5b9f8496cb020260ceb6cda77521b064775ff38173b0efacfdb78802beef2cde1a9dec9eccfce92187ba777781c05513e6def38a72da93cdd47e885c51d2faaf49f1a8f702fd547b41237fed531b8f1ada601d73b7248f31628601a19153eb33001a116ea7b08df0b3149a3276555cb36977fa96a396dce49d26898a49f73e2d034a2ea4fb228a575fba1fe0a89549f6ffd2cabb63e69abdb68a4fd5f5fb52ba318bd2c3a9160ec92d595d133ff685bd9de39ebe94bb158eebd586fd90846ed62e6935cb8161aaca771d4ca5bcfb97c8ba3fc2deb71384a6a60acb06c3fb07c696585a5c4f2a3110bcbaf6c24cbb2b2c2c2e262d91c58c8477e7cf321776194507eb4ac8c730f861554ffbed3c6c0d0cc26b5e2206488f7f0deece057e78890ae7c93a9a342854f04f0ca3727f7b0a7ff9ec6a2d6654f16dd38ceb937af50f99f36f3cf5a943ea2c38f1afcf786a8a8391f0c8e8af383384abe23f56acb8aa09c231042284685efbde7f00c8c5d227c6cfb01fb8c197bceb08f11c39eb7b68cd9fe89b1a3e645e5cbc3c3c313797ac5c3c3d3ab15d0921f0cf67d5adb965bfff0b8261f08be182ddb403fcec1ae7fe6ab4f6a33dd403f2fd52af82d2d0c517dbf7222341f7e6be1a86841ea6c6a2a57beead5ebea3dcd847370e654fa7e2de81c43b9d1c217ead5921a5f720ead5b0ec23a46383512919c10846324c6071d4218fdc518638c11c6f831c618638c1fb550e14718391e7a9409d5c53166005fa032156320b94ce56233a33d3c957d10afca463fa8167c6c5a96659fc8a85cd85fda8c5bda8cd518d6dacc35733dbddef5b0b7361c840cd1827851fbe9f3957f6933d65bd6b3de48a3799f43fffcd7f329106be3803643bbc6d4388a6b9e25f362b02b8b8989994a1072bbf9434cd7b2e6b4ec133aafca2c5bcfe5a85d70d1859e39fdd6da522743180e8e6221d42ea6fb5ef8dd636ef0bda84330a671ae2a30ad8adad59b61520a153690a6857afdc36a8b37865d11424831eca214db2cdb6d96fccc9214baf0c31d3891c156d6f13e72b1c9c0173ad00f18f6bdc16e53c36e26d4251d63eca2c27f1036675d741ad01b3e08e10c20841062e14230cc08c23aa07d424948fd98395a88614d5fea0110c6e0f02317f53de7700e6a59a89c0e465bb06a51ce39fa75cbe11c85792ff4e9c52ccbb22cebdd6ad197711c7ca01fc451d6d317e2287ffa3b384a7e0e2a3038382efd36d2f1944be9cb584fadef28b5a8451f260787e35dac4dbb42cd9ca3ffbebea6855a2dc5aeebca56b61f569ec5b27260d96c6e542ba3c7b095b73692b5bed69779d6465aa95bf62b1b69ebe8cdae7fe72ecc762ef7f21110eaf3d73b930518d325d413333fe7bcbd7077f776772d307694dfee6efbde63776f6623524ade6ef400c7f77b13bb6b80b14b479bc739e83d50c84bc9876630857ec485d076b027eabc972779a214352e8940302eb9ef6104ba2ffe385781bf7047f240c679df49f71d471d711437dd814d628082412953763a0e1a62c975db833b0f18fb833ee5f6ed1ba49373a5b416060911e5b6b38f70d03e0309bb601c1f7ace7ddf5dd405515194a12750869cac9600adee8b028a18903414ce44f3f073e5cc396865dc78e283b677b23672fd85604cfd5c1320804c54a8dcaee5ba09b066e626d2551e132a3e563021732730d84383bb3b8dbbbbc3e0ceccdf7fe3ed464066a6ccccccccccccccccccec128899fbd99fdd2dbb07b9f1db7aaed0769665d196dc4364bfe23233101804f40f27b73f4aa7c8f2d89f7eb03cf62c961fb3a7686d60d58acdc9a9d747f83134a44d48067f042184356ea26b47e8892e6d04d55100fc7bab003c8eef586828c614808d3e0036eb716c36feb4d57817b6176e6c276822612fe301d8587563e7a57c782faf777860a4e5fe7b077b1efad7df603d668bd8224a7e606fd91317b99eda13ff561f7c37e402606018b0006961606ed0abf41dafaa857d4b8ae5c264bc617372e8dbf81ceb6b5c97c42cfdeb7fd0f93636ecac61e18d4a494dfd166a3dcbf52bd5e6e4606f7dcee873b2cfb9fec8fb6ba3016269ef491bbfa782792f8fa777606edc44c79c502271384754634783bc148e7f3e30dd0380efea0bdf31d1e9064371e101b0618f63d3feb4b5fc0b5b8dbf417a17ea9b56beb4b1fce8651c001bab706cac3a6dac7a6163950b1bab6e9836566130ef3dcc8bf6db9a6046cfaaf7312f75623b7aed335b44c98fd16b9a3d31ab36a69bed2a941ad36780753c96172e5fb7634969a05f5e0658c78b1608eb107a292536bc54a68d7838f90d4f0cd5e8e46f03ab4c3627a7e5b1cfa9f15a7442edef3fb9adc96cb43ff8dad894d4941eebac9a4c0d01d7b9cf643ad564f686270606b3c6b096c7b41aafc50b35223efaca87da8c3fd46ab2df01e4bd20d9dac7b917036369178675bc8fa71ab0cffe06ed6d3c6b35a37f406c643534574dce8b3cd59c7cf4d92bf1b7e1e7f6c78dcfe8dff81b55dce0a52f357a4a5fdb8ad878edb1ad8892f945b2c7fedae8969d6a30fde87f987e64b2f4a3fd31fa1bd6c6c68f2cbf971ab2c7fe4766b1eca7fd61c3f27b91962df66e8d4dfb96ed54b239392c9f533f67f4d9e7ac7c0ee973b4c79e55a3dfb105792fefb56d876d65ab3a2ad2c6aad1c62a20a51beaa420ac09ad0477f78e6e639c7bafaf783d86602111a28c504688041a5ead566c84989899ad7ce52ba771e668de7bbf62e98497a2b4d615643a6a1c001c11948227147039a888a2cb7239a8882ba441743152e6a87983bc977e2932ef8581b41a56824043078b9c25470ca18216e6bd340a2e8c91db9988b81d8782dbc50c713b5ee9dcce85b8411c816787094553e0c114aa204060850b564350b822491154fdff52374f8c3144182f587284243aaa0e306101175328e184890c544a48020b413899228612a6a866825a1046195e00410a3d50f50779a91b248400021333b230c51164a89ae8caf80b1c66525a25f167fa61313e77203cc5a3e10b7cd741d52c95cff3a4c993698459c5ac428221c19846985504f94461452a675a2552fed6f18798aefc28a3935aab44210abc49a1c21c253c74f4c91bb59dcb5fc689e1e4a3def75b57029cdb03bd2ef76d5d9077a4856862506b789a87260c7b9a21be8cb673ac0f3438e7cf031d155f7bff5ee2a899b5131bcbda7ce358efaf652e61b46ce3748e731dc5920672aee5625bd747ae7f331428cfc1d098cb2fffbeae3ecdf0beffd9d30c37076877c0b48d81f4a2760ca509100e0cd9a1871cafbbb1b620f259760ee0200448120ce59fe3626e47eff502ea3ba094d209e7a43bd862ca69b90acdacadc55f9eb4d856e7deb4b46b42ed7f1d85f0c2c7e08493d2f09df6c9f73ff9f01caecb732be84b09e79cb693605cd3a51286978febe13bbce49452091753f3217d90a08377422a58d5872b2f0c8c16ed82d2742dca90520a347d50b33706466a267a90f0e848d9466c4ec743405e18edc4b9166a2738ce9d3ac7c8a979bac739ee87b7743cf442cd0f20fd3ebe08a343e15cf79f5c4e315704f0e610639cebf8bec5e8eefc317a649b43f4ad4a6d28c4b99641158a9d65f1822447ecc474373cc1ec78f3b2a8cbbd360692b1d15a96f2425c70fc805105ee05b5a357c850ed1e90e9015ddfa13cb7eb1d9f2447ec40a0b98ae941e3a40c1d6652068eeb9038aea776312f0515263ef70510e7b81c32c8352df8e0f3014a2d9bd9c3aee94391e95a5bc75d7431f7b93ff7e74e51fdedaecdd027bfa7fac3e983dab54efcc844f7b48fa38afc7d3a8973d3768f7426ba8bd6419282eadfb5ef5c263099629cf36e9b2bdf54860987f770ae599bd941a909476acead47cc4c426de195d043823da5105a6d3be85af6ef5f66f9b19859efb2e616f4faf7d7cfcb32d6adcd58d2ca788b4804b6c968c90c484686adb76cc73b38677d0f9a0c303837690c3e38d78dd54cfa43209d91c66921431cf7da3a9e4269ad26d3734e06069a8c2173cc69867e1d4c3707f8da0cf4af3be69b1b0a62d551effa3f08b519f82cad98adf5ebd58410ad5d0f17da600fc3a89dbd734e54f99de92fa5594ae8629b8bbff85f9be9bdbc135552e115cd7ba1d90ba2a6f3e1f643c9a701a3fa408373fefa87986e7777cb0dc7edffff775466bdf56d41ea3d400954a95245466ab1e10f31cd3484b0ad2988faff3f8120a560601e0c6a4b11f2dec32fea09fecd0d22444adfb7992e03f9472b031d3e18542ad345ed7c87bee048d48ebafbeb89649060863ddc4ccfe6f6f5119651fbbe185a9cdbe84b3a217df562d7fbb74049e963b4e99496c22a60f6d6d6b95ceb3d9bfb6c673d7d8cbef7665f6f5e7dad8dbbd996c37bd8b553fab45aef268ba9fce6a80f01dc39bf1bebd804d64f544ff46f2eb55df31391e4ba70398808a07b9a81bef69abdb998b603fcf83ac08f74c3fa75377dedbdb669f63291ae22035feda1ed64e09bc310f8f4e353ab037cf9e8633293df03bccc3ae4c72d87fef853ae0ba25c6e2be3333173d4e33722d2552e9d8f5d18ccaeae72d9515d094ce038a77ebe1dcd88f4bd6cffb5947558ac439a9c6b9bf53c018675e6391e53d6d1ef4f93a1b518babbbbbb5ff77bdd70748a215eb60d84bf5f8b0196767d777df76eb7edb4775f18fda05a98a5cd8ca8656ded160fa4ec7aecea4bcab07b6dda531eb22752029c3bd22e4ca3e1e66acf3a5801567ff71e5eaacdcc97435aaec76f7fea37a39650a0c0c953b8753d2e5cc0ed97d277dbedd63a6baceb973a53ddfad65aabede0d38d6f0b7cf9adc5007fbe879d0b437adcf7bae1832aa095cc8bf105bd78a333d5d84c9b8d0debe0bb300afbabd45769ba609eb5b49d0f5702390fd1aa7b8a5888880f577e5782db44e695b6bbb9914a2a65dc78c54c1eb0801bbf7be14a4f7aedb1920b377eb772e3c79f5fb29d006ad0fb58ec8d37d96a3b4a6d58e69791666b5893e9da8894e0d226d297ce1c3d84bb70ca63f14b0821f54a8b3edb4efefcb77526ea9c942f21f3736fa189d0b2e33f96dd100ec1cc90991942c8ccec5586eccdf7de7bb393cfdf6570423b24f3234c1ac0c81fd909b403f0c117fd6df4f27bb3638c0f4be2c5d60117fd1e6794c6b9f9f32f08250c3b601e9435a839382e36515dfe210e1317a6d752b9a8f4bdcc341fcfc7082c4a2d1d706165182d82f97bc4c464afc247d3fe3b6060943e3507c745199354979713e2304dfa5ab6b032fab8fb5fcb3c19207a5953d27984893e21cc000b4a54ed72d00cb45852afcb413360c20c9a4111a49452724d78685049978366f09364063e979b418f4b511718f376d9dddddf7bf0ddddadbb3f771f82999905b5df5dce34a8f738d1504771212e8802c70a547882136589db7551135fdcce71ae5fee46ae1fb9ee3cd7a144f1739d1a815286185950b10523b812b7eb950c746ed742f376fd44a87ddcdd081fb9fb8d0eb018e308549a28a18327f0dcae79622085db754f23e9778328c0a00931c4206282ca5970bb981e1c5c8c3e274ed400ca921f18a1c51554be82eb5fcdb8ee9f0427386ee772a10c8cb8500652342144134d6086c001eef5539bb9aec9b4c5b566ac1ed005c26846ed4ca686fd522693500c5c70e9bfa3e09b9c7b1c7f3bd31477fe7cd8675ce9402fe5433d40dc03dc6825a99d0b0d713838382700c2c151f5c38d3e1f1ac27d0f1db5438a0c82e17cc885bc8768d4035a9bc640da4d248329129e01848691d11615064d5cf73fd12a4730f50b190c8e78c114d7df850aabb8a0469b9ab0c58c53282491c5cf124de0000b5770159c71068b0d27b80089eb5fa37b70707050f03d66b88115647c818225b650861f5961dea2cd78499b794d001c4bb89dcb036e9763478f26c0dbb1139ea12a6810a444126410b4841849825a50258809265cf82cda0c4c83886b25013c3ab8feb506e56c85a12ba0c08c1c40c104553c89349e209da4cdf8ed5a76dc0e87042e0371217c5a955cf8a6154cb9f03f053f173ee713c402312efc91360363380eda02074d68c11956109de1483c915a1295a10aaaa08a1ed73ffb41054a7040fa03d9a80b061dc9c2194798b85009174634c828c0853fa930a92d948413d73fc213249173ed854169a860f4acb8febe821542082144c2085a50e1a20823644851413fe2c20925162a133cae532602000d4cb59aa88f1126ab288ca002878a24a85859e1821613101526394c8c5453d011622c11d413e453839028c2082174218429fec2b79a88e2e5202442b7ab7f6d8189ba723988082c7e88e00249cd2e071131061115bb1c64c404b7fb26f5c6e52023468850e9e520234d2c514797838cd8a006555e0e3222850ac92ac84818414d9831c6113c97838ed0b9ddf573fb735c0edad1e282a7d951131743a10c75110ca720cf8696c6d638d72b302c8173a713e75ac8ce95735d0220ae7c2a57be3f5b447305430b7482aa3fc7e76869168428fe322404b7dd84729acf452f35abe097fe256071fbe71476bac8717a67ae58071570a845fe000a50c89394169135a549b7ffeab99278aa7d762c2a8ee22023a6dc7eee7064aaee2f9edb3b545dbd9d359d26490d1440fabba5b8fd3d45ffa0eb255d064472fb1b4ae1f63472bb9b459845a0a15b8b55173c65c7ed789563e4c8ce35e2768dc4b2e68a681a71d4dc993c7367eecc9dc93377a6cfdc993f52903852070e0d217114f48150f8401f1f282a900f142a8379f814eaa9ff46d57faaa1dd457473bb44e8bdf4f75c75cfd5cf220ea8bba5ccd57b6938f403e6e13ea73dc928576e26d314cc23be0e5c85abc35302096e4ff3f9ceed5d5e0ae621371dde5ce1dcfee9a429301de73eab83fc0bad0ed29efa4acb51aefcf9d2eac051eefcf9cf9e5e941b378e72e196c339ee04b3a3a930b97e8ae911734f3230381784d55c51e05d185a700101000718f37b155cd664e82c307eeed7b00acc5f52a1be894d8e6a7ba2b7eb7b45350139904379a90b2082c2c481de8bbf43e117c7bef02c38f5fcc25fe59671bd0ad761b2f0d884430aa99b08a500ca75dfd1a5a08c2282b8113e87e228ef9e91ebefa7da9282eb45dccea35c3651005e235260ea5bf817d7e5330ff82b2f355f4f7aa36a295def54d6d1d049a5f42d4be7d309bb1ede7d7f7a96df0bbf1d1a54ebcded5b845533c338c6bc53dfe5f7a88cc39dea9a8fbed2c63dbd759fe98897511e22ca83e75bdd4c4aa8ddcd650821846864c19f3c5825152a74984804d06c32b71ebecdcb03a47f23e5536b33b2a93fed896f689d94c65832f2e9df30dfb245587e3eb5b3c87c29b7e77868e5033cc44320782939eb0a8965f4e33d17de54e36d0cbdb0c97761233d7d1b1bf635b6eb5b36ed4b5bf6328ec5bc54fbc400050152f3010fc23adeaf6c3939d6cbcfa14f7a686be69c2cf6e43fe44febe5bbfd41faf9d3dad027cd2beacac6aa0fbc0fc23ce67d2330b0b0d3a321e03a3fe6cb1aed0ff9246ba3d5e4689f617f594fe74b28c487d6691e0bd382c8c40cc5003dd78a5842bbf39d95e3741127a5d85ebd602975a1c59a36eb6f6cd7dbd85a4c2bd32ac52aa1a113cd6ce8f014f54eaf1aa87f22606554d4d1931e0a0f0b46c5277de99f15ba88e5bb5ec27c8c267b56bdbfe1facc16c92e7be222acbaacee55af6c54d1ab5eb511ba8a5e8d2c8c9f064fc5bc548d95e7a771547cd2953dc31a9b121b5865c3e6e4582def1a0ff0e5d7d85815e344267ba2b606cbec09da530dd663ffc3826fa3d91f974d8b056269decbeb9f475571abccf99736e6167e71c771fdd5582fe35d05f3e09bfd9bc27daf772e9dee19cd263c9d6e72570effb98aa6e6a52eecdf0b79298df48f8764ab84a014797dd2b3365393337a2d7b8c86161a22729ceed7ab1a9a5eadbc477acb0f96e31c7fd740bdc3f20ab5fb27dcaefae0a8530cefde7e1b9cd78f8a7fa2ce05e1ba0c940611d7df6b52dfd430b7a10a4c9786761cfafd7d3b21dac107209a9f6a7a96efb85217733117b2bfb1d5f895cdc6b36c2758da4ef0da4e10db4e3062342fd53fef698476b042827494417d9787f744858fbd276ac7bd132122e2016e4458c77befc5408d875324e2cf833f7c2236b02a27a7c6b77c8e8dcfdeed29da9aebbd8b3db9929a95b7feb5b4fc8daa83b9afde97ca80e61595c8fb1d9807cf4b593d449be03efa68601efeef29c029221abf18b4eb76072c6acb67cfac63fef5a5a7369ee56dacafc1626d58de0686dd78e89cdb2891f647664f30b3454acff236355a6c1125f28b5c6f3ddd68769d6029b2d813b47cf0196d6f87eadceb984868e546fa480a9c10421c0f21840fb998ec4f9b8d7f616b79d3768a2e6ca7b8b29de28dadae4008219c10420861e95905b167f91bb22fd922d667cf628b28f9617191126f148310460857268410c209574a315766b194ac8fd1c6639fd3f2592c95a6654b251b994dcb67d7a6c41fcbb69394f6e58d4ac2ec4872e7851f6488a76c0071500e1227390f8a1dc01d251c0444122e94414020b9f0fb083cd5507aec7f941eb3364ae45fd6a6c697ec294afbc3faccdab0bc65d5acbc8dad88922235ecc9bff4d967dfb21561b1a71a4a9f7da7eca834eef564412a11cd080000005314002020100c078482b16838202aabec0314800b839a4476541b0ab42489611885943106192004000644446646830600c067bf96ca0d8fc028f62106b75abd41c8c2bb7e2135920f94444112d4e2a24732143dc68de862647a9a2679d64be33b9c010ba20180a31879de180212132f6c0a4484a43d5f14ad91590689fb9a84f64f5207698afadae0906b659c40154c6e7d827f605e3b95548af012ef981e6df2faf4da8a64fb27c73870cd56bf7d2230fd4f6644c4f52060310e910d951105268e55a5c1c3bd7306c94b0535343f2a5581038a1c4f07ba218cd387c1b47ed54e60b2d56c6da44a6a326cd1cdd2dbd8a0fec3632a6337d31acae91335d58e771aa47d6ca7ba8e7a199db1ac9d5b19477f90d80e53bf2c9a9cf78a9afdfd1f6376219a66725443aba75e76c72dd057a4c2aeef7a9aed43a56a3891f8ee1401e611c8b66d6376e124f198abf34fe9d1d9dfd43889aa8bb5913be145e918aacf1c6b41ad40d1975635d51da4cf033ad158b287d5f254521d864fab99b74c0cb4eab7245759e1047867b19ad82a19693abd08f0b4b7e169745e0ee2348dbbb8898dfe57df890be4165f2dbf44271e085bc44b446e2aa07ea45d349b9aa1ddba2342c45bac51ad8312e596fdffabf8c38596414570435dfb0975dba80f731eea6fd3e2372a4e5271aacc6a167081fec8bb5543fae01c947811c7c0ce818f5e8b8dc1ca1c13b201645d47f5b126da07ea7386150e061e7b557ed3ffdd21f8e02e9223b758bf3ed6006cbdf15ebe1a65aff21086161cdf432ccf162ab2f32065614a9cc865ecc8fa75e1e24cb5f97fd6a3540a23ff8f335950427af81a7e1725087b0e42c3b79f0ddd2b3916f29240c222f4a73fa4130098d31771ecc9f19474e2597b1d045237f5902f26ecd945c56b988521753359b8e926ae9fc16cbb46d277799a5b799b75830b9b399dd0cfcb1c6380728856a65470fccad2607bdbbd527a7addd65148751788cbc1e28e5f82480e611c880cd80a589a939562a8323861b31a49b2aa49b0192255ff352f262c932da7aeeda9c93aa79deb30804d486dfa4eeade47a79f72750327d265106eb2b33b2c8f7224f4801cf958f5cfc233ad6872ff70d3c80cdeb0d4d874b9ea5f5b02340b186f7bf2b2aa10052b4740eed2762c4513f668c191cb08848b58398878b591f2e86a566304ec0009b93b6d7acec721665bbb3696a8f8bd456b605bea5ea4922a6ce21ac01441fcb800fdc4c72b9251074234e21f097215cdf46ebb798a601ab34d03393da407134789c0b96a05dd449c20335aa95561f567832c3433264293ff7f7a06693d0c42a8b595d2eb91474b93fedcdcb60c8dcbc85994e4d1e1e6cc45f2e81c8e1d4b63944d619d940f8f73ac4d3a59a82727b2ff9c212859de58eb08cd22d18313d830d638b7a7b594dc98917a370ad4756c51a1b75bd28e8e571ad2739e01bf252f98bb44f37dbcd99e0b781455f2420d7e06adf08e54e51a1af6000e78bebe5a837f2dba99878c4e856eab6e13a84d2adfbc6a8932eefa9590dd429170b91047ec07e052e2a6fabd1fb8b225d35b94f6df6bb6299ab580a94c77fe2a6daf9abe41a89dcebd04c6e42b61e0b7c7499ae68ca444e0f6ef5651ff540bc040ce16142586a933c59469bf92bf87176bb7bdefadc39a4b7d7afc60277ffa5a26087f68e00b10947dfa3178a8b52a7507c8c8e4153e16a5c42d68236d71adaf3ee6244251ead1027a236d210dc576b0b42a271c22a7f25f45aa5f29022e5f7aad9741861c75bdb8102573a5f1d91c5feb625793c0963f8bd04ca2d0c1698a90d75b115aec9fef601e8768e5b33b5a13e6635e1db0e0da26d960330d91b930df6acd3d7569f4b2e105e9b7f7be2472f408ab35e9689b3e5f15305acff0da8cd8e7b4b313c7fc26968ddf66c42fa4c9bad99091654944fa15c1dd17973926287d8cf65cc9f13c77377a3ac06077e0288c57cfdc4eef433d21196b28ed8a1a6e671d7078e67c2fe58933eb691c04c2ed65e0446ffff614328797ba6daa31222dc7d29e33f6f4169a588a142b64d4d6b3db23c2eaf64f3c05502e7e70d8b14cf3059d1b49404fa3d5909f0f61cbdda69697c95b15b34430dea981e7b06c7442020bbcdbb17353d14a30a323855b33d24917702df534ac997446ed794b5ce62769fc70aaa82af6ff614695f317990a0aa282a019e3913f98cae74144c6b5beaeb556b3d810cf85efec1302252aa2506f7069016cfbf99c8168b7533536aaff04ea1ee58357f7a979ebdfc0d0faa8f0d1b7d39548ad8607293c56cef25d4a3732f408fc968cf49d387149eb364528f7b7a2b81b437b4eb73b5ec3a3660f9c3d363dbfe3140c5e0d534857044aa30e4ebd35aac61d621a26d981c26e0225f9531fda14970907d121e04be3f43e481b757d1f67206ff8c5b9152cbd2d508a95b09ee4e854e566ae152a952213d0671775f26624556e65bf1eab1a6f3bcb841cb43c7d227a409e678c50fc67dc8632bf1f3f58f70c62be74d71b0c3a8082cada92bb9cb5c081bd8c9cf1af81882855b2760e05552b0e3e70ae10908462c025e07227aaf07a8878d237903c968bc4cea3d2895233b9c7877806d0af5dcf1c771f7ae499933bb0f24597f867458c21734238fb73f0b7d5045162022feeb98682a9aeaabe7a2b93145bb235ddf037883d2acbd7975e29ab30e21d8fbacd79d417f0f9cc2b397ef98b6a838e69bb07f6853ec67150fa2f376963f74c6aa073f2957aa784f1f9e6d0986b5e18717f84e5ff0074d2967f8b44196e0587459fd0ce73d944feb30b540624762813337de8c1d34edbd9b875f01ea193b0c9f4a1586823f6b2cefb6d2e3e876f22576c110f7cd409940f0b8c61c0bd19161ec9002f97ee9a92721242a77a4327970e2bcbaf9e7465abb488fa7b9f95c7baff979fc9d0d8c31475454d14e4e417954897e45019be3f3baa3d0a4c72bb6f3b5251162f21fde19c1f2f03d066982798f65f575d61832e4eebde16a5d011019e17cdfd18f23d933ce57afcf0c9d83250e7a216791358a7ff12600ab307d0d1d1edc1232e66c4f9d28c443b065bded5792f4a7cc3e8d0c5a278733ccd9348273483d2077b89bbe8c6a364c643fbb32c5766a46b5e1679c1ec15d153d51d4f9d022c5eeea5a18d44b8bd912e46cb90e5676fc360585157972b6a249e88080cbeadcb8e3a5b44a3b32d468a81ed9c6bc72416878b767bcd7dbf9d83290de478d68b2864e160955a1d83cf6ad122aeb2fab7d25a172092b53632d5b73a92fa111e26d6bfb78ae2689fd8b37cd11f34aa8292adf6429832891bf4b66b2ea97839b16ebd3855c728dbfa3be58b03f94dc6f886919205d6d011a331e1cc9fc79a61176c04a6b65c8310e4027109357516e55ef9f40134a0c1f549df5ccc3b46fbf9610c433d394bbf3403fd40236bc4ed0b21011b39c539546a534b6dc1b3def9833b1e1ee4a296ba5e61bc19eda216be94564ee1288fafa8b68d065b5f12f1e16e13f79c629b9419cc94c0ae06421974957695e84d198449a7c53ee46b9f5ec1bc53f1983742937f5a42226962b7da3da743b97e67df001e63cc6f2dba4c07e1bc18b6ed58cee853bb842e5a62ede1810a66330fe21323c99c365ce737fee1b21cffb8e8e6ac8d7f94ea9d39e842c064fc03a35dcf447bad5c64bed4ae2fa08209461c7a1f6095fb5551f8d23acb9c02cec4ad567fb92fd6ad14d706dd338ec6852feb8d185866641eb0f4fc1147b454a8ecd437af221898d36ae146ef35e2bd708f5c4a1ca60e10d7ad56358d01cad9c891c191fbe7ba4eda2df0d4f4a0ed9e43332a4bfc2dc6e7792126b7a6075fe6261cfd328794a8c58f1303f596cf880854998e3a7e108192465d29ae69c7ef346b9b0515243c1b83e7eb1a675967d5b0320f08e9bf7f62e8c1df4121c7ea51d054e952807f482e828b4d66c46398c6c2df300e975926ffa88f4ef480e3a79cf584501d64fb256569cd86f278c51c8b3a74db140ebcc02c94943d2ea45d2dadfde01716a5cc506eef71fff0f79127a5ad46666ba188074d100335ff0d2a515a9295b2261af82ee06e82d0cd5900c1b114c708b8a5060bd74b2555a3fbbc7a72aec5f203011f540d3c108ca5d33da29f2f2da3595be87c671e8f841c8f2e33906d503e66cc7b0f1d3eab0157804adadce15703aa68b08161427b4ac3a7cc60dca6ae940c1b5686ce0e76435ec3f227379e846d2e2106421745d979f751804c301c67f64f90106942694c94f37498630cbc464045dbc0e282ab16fc0f99345ad043b668651008605f1c6afe399a1b8d5fd2ffb7d2823b7d6d2e787262fca0b4112645ad9c0eedeceb90ee20f20538d4611fe38b5fb7976724c4806470c7ca3afa7ca0a5456390ff3187770064e3122806759f4ff8a583e22cc40a116d7d6bf8758a6cd37400145526e569bc1139862c46eb73df4c5f8ed0fb02350dbf4013bf922fbea02b9ea8e2253486fef010dec958f74c654b7308371ec4a8f6968e268b9a0e61ee59350c28cc146a4783c85052e240fa4c4065efd24362da28c6e252aac4594294299f7baa64bbce899d34d35809bc5063b7587bf84d5287f4fbf14b37bd5f3a101844930c10890edbcd8137358d55ac8046b9f0e20b4aa50548d8350567c877fc2eeb2222da9a32f8eb695aa85b361a4b89d68aab764e8f8483104197214eb4dc1ca2238b1af7c58c688d2fba87ffd4ae23632061f93763b556206b229b32ddabbfa8ef863ce14690871d3d582b63ae29047d7bbe6eb7ef3d8eb18307919ff92b7003f26c4150fd21b5d6020fb062f7430f4a0f400b2077f9bfc49727ea8ce16a20f58261f9516e9dbb9cc8550975dff56663f8b373edd0bf64f24c8b46ca150f2691b322ab6df403f22690f4b9dab01ffb28a5d7e790e797ef2424c0edf17e14935476316e2482332e3308a193cdb752bf7b650ec640fcddd67cc6d127a78cd1cc40806dc51654d2a3fb9286fd22607987a9652662f3556cc8c8c6418da8ca46a1ba550708c056f3576839d4262a1b362d266161d7e8250a254491e40c32e0c53988aee903f67493d36a7682649dd3281a0b40666a38a91a28f53e2ec4b9c6e7e2fce0913768af4c2673b1042a69f402b26200c04e4769c7bc850a72d8e2c846be9c27bf4c8763f8a315bf6a7bfa50fa828aed59410c60e830e304f93139fad88500515fcfa350795a079d5137c980cecc8671d2a020185292a387a42e0cab016b6c90cc80c2e659435722154ee491225546984b52280e3da23ef945c90397b58761c52fb8005020f9001ae13af42310b8d72cb631c0508bc8b0f8e33859bd8014e8b5636f28faa12d44c4ca13e0ffa434b049d176c31abf06a677f0e13f89c754377c2c7fd2fb59eb8d291be9a2dde451883fd06c7b2730754164f2d387dae65dd26f2bc0db3eb978d88501409f1d8db104ce4039f343e0f681c460bbd57774b4a84782e0dc1545a543e1f1abbb7df4fa07ca215181c17fc73c28c1944e1f5a38c5072b7293f7ad1258163fa0f76284dfa9a4d725d94ff3d0ccdc1cef842d4b6abf929a0f5d9e4924b4f830bf7060c1e2b679d87ab1a7f03b5c9f5e03f28de95231cdda7725da220bc5ae8110a262481d80ec65402bd92839de81924dc57da8e28734875af126bb30e23d7c91017a41cf16ce40973734cba92f5d3b2bb6adbad7cd4bf0b8ee3a3076a6af58f4331bb6190926c1d6c35cae34f176c5e13944784889b3de0573056d0a07ce0384c349cddb13c4f1055bc71389f9bf73fc23c0c38264c36cef4cfd8d9ba8dd5bc2ff7ed08762e6bc3c07e2622a74bc46cf1326a813b8a340444dd7868a60d5ca0ce9461d2605941b3a0be6657e6341f422f2eed4759507ec183550db4128af60078db358b014f3eb82ca9719404d8d9ccab3a9e1b11e6ffee48dbbaf02ef0e37060f940a8603fe4c2d6410082bea88fce542ee48fd54f862e3037568c0988df853ba9070b39c5f8bca6f52fa52b584fbf329f6ed9da615ed98c3ddbe5e5fa4d6a7fe568616f296d1c6c50a8bd047e259889ffe1584f5738897606dc8c7b31b6b06d40e808374f007ff2c0052b85a9b077f3d8d322fd2e16e2ed88862fcff60fa4139fce26f920774d2346783e661e8f4296f929af379f829ec61f2f18b0d565f5bc3bdbabe816f14f25bd364bef471ee969f1e0b96948fba831abb7a7eba0d7c9d0e68430b1a2a4c69e59b45a9729e3afcd6e6e22db42a0cdba0b60837c09f98fdd12ca9bb3aaea0e860a0ea63d567cded198a4a13626ca213c2d24cd2c9c9bf8ca8a38940162db0776de0679fe3a7896d978e331b225a5af71d49bf0372364e94bcbc985fccdfd2d7a8f568e053338252ae0a334e058c51fa2ed9278492aba0c21dadfe327cb41079d6b84571980947858c611024f6550d8a683b25bc134b360a4458337e8f297221bfdabc6304e46aeaed0c824b2cb8481f666d4da99b9f6633722f1b94bf2816d96469a77a1c0b37d3a6a49674e9ff8999cf215d2f8287fac9b738f922671f1104fe4d72b1af831153d9fd40c7b7979acbb8422299df2d3d66ae37d6af0a455e477c50d694b910c25a42004b1750980820d2a1708b6942e4776792d4960ce286620e00dd071d7de9684119c1bc54e94c0c16387aee3e9d8b6fb7e0d43d59fd9ecd34c57fae76a6a81a8f6ef2114d451b336c5d95d61625828a8001c47a78852d755ce11fdce1f1e2576dbf178d191382aea153ac688866e4f352dc3cccda6dbcd529955117fb2418c6d98419cedec635415ce8cdc5a8d7590be4e64a10661b04e812021e40858dbdab0e75b5e5b660d1198ccdbc2c71313feb80e527a13f4df68f31a8642df00a9d8212b358683239b52106658a7d45111f84196ee6cff3986513f53480505d8fa6e825f06be3f6a04198e1996ef57ce44b09305b4555a23a72bc44934be9e6dd5472f7069a60e018a0cf328c2c795d70725af0ea66f88669941cfd3dcc32f870082dca05314a16e46815d67021a40051c993108efb61220ffc12679b81bc561c4dccde80f37576d664976f38533f85c478cabf1c78837c2db25656c9d70763896a8957245aa47ccdbbb699c940e4619d3270137eee9725383f8beeb9c4d66cfa43204c2416ec01ad0c872d7151011a3586d1a71823eb2d9a2be55fe0864a9a9968304b374b8f8b840e879d4fa8793611b676e571def642039145151d10da627f81aed3436cab31881f2df4b54ff6eb99078c919c86a884d16ec09351b4b9cf5fa655f9a719ceb2d7599ae86ec7d92dd4f9cc16dcb8f01828a6fa4554c4637e4282d1b907869a7ea217637ab6311517575efd29a3234784938858aeb485142641854fec5b6c4ff052c434eee1ef20d619ac84accb58fd3ad1ee7a6542dd72fda55078a42b85673575e9f729aca8965a0ea0c0d79680727140046071bc9d6e185db356e3f0bc138106126c2583072092c699d282e39293671bbedc6a23b0d14b5de1f77a8b2c37af268afaf49d8081b096c00a3c6902c68a1e88bf0714de76d95fd2132618873749fa4524661bab66fd0d3e8c5ec6bd9f3c02a5c145070ddedeaf19f352f004bb645e629c46f30964ad64ceeb3b91e9201a98c9a49c90c29ed3cf2770c3a21ff2b4b4103e9dc7fccbf633d7281265d5187666cf03d4f3d2c0d485a5f85517080cbab200f43ecffd05890aa84200752bc576e85651751ab9360cd5bf4c78b15f3b8833edd314006235d9ad9beacd17787ed722857d15ea8da1a68fd8043359ad8a59f349a11f3daf3ea6f0b10bef95604f2edc28b04573245aad4ecf8cd38985189970fa59997ef344266024c7b83778c130ae598a69121d3d3eb14f9b30d48b177c4c87445141c904077c7e1b569c6c3542fbc6c20b7b0cb9272b464dfb9a368f48d560fee52fa50ff3858c85ed9e9c6ce99c34b1fc0accfa30ea81e5948061d9bdaf8ac0ae398e7dd8d68701e691badc7a0286251eb81bc4987a1b84db1a7352b34887de7935466559eb08f93251cad09b87e42f76022685ceda715f2ad02f67a07fa93ecbd7235ca95c416500847685c7b1e5acdcf684ad2d52b59bdbef31ed923019d5d5a2b6762cbfd2a929768dcd77f5be95213198e778ac2b797b1c46f064f7d675d57bc4d4fdcb9f1de4dc5fcce321b5a7c220069dd4bd798f42278fbf2f653015263bb689e5b926e5621ac2c503483764be3d5b38a87b576b6bffcfe2cdc46ef16c1305a2ccc84013bb733c66c965e4434e3bee5473f1dfa339f44eb72146e1cb113858e971e2ead2fc603a8bceaf19d0fd044553134f88cd55f5d7d77797d233afee60896b6c52fa488ac5ca2c8643e757f5d893f88468c2d5d645b0dc5bd58191cdd80e4fdd433da3b83f32163d0727bd08323f18263482f01292ea0b4b5f7bc7752090a5c22f20a24daca5e416dd61c32e0009cf2d0c9e0c8238440f9dcfac23f6b405aa229d72bccb2d106f234d84e9a36bbd119b4bd0f9b11ee6217a22c9977d855e147c2f7d0d20857d6a3a599d26292c1a4814ace7befbe27871ee65597025e6af88c51d9f2bfef69c451b2f41bf976f5ced329ed20b40d649fab4cabed41d2db254b4a5b4ac1a6f562befd5b7387b4821daffa3b35c53c6ff6f39f87550774f051be557bec4393bbd0f73bba4ae43b702c422b2a62642b8432e4dc56c972e68eb6f2554cba5780239a0eec73df013b13657e6e5e7bf15b725f4599bf742a2a313a9ecbdb4e96920d973c9eb58a1c2317ef013607c01e1c6be94c631e0929955f266d3cdffd9628297c012344f040e9f02fed933603d1aea737914f119ae258dc272f6b33a271df64d574e6b57e23c18c848d357a57dc9f9a44d40021f584554b1577a4db038662304cba7f7e7743f0c171670927726ea413d0ddcec9ebdd7c4403d8064ae485e28db5df7f4b0f63bded1b842170bf5d14acdc6d52e8209a2bd76f9cd64a16e713a0b657149df2771fa0ef46ae7e0885d618be86322e86a28ef0057c46dd455d6d6dccec233177a691eebcfba63ffac9aec6386b7fe553dc2b4a355cfe5586b4cfe3fb9936a9511825caaf9adf08b5a357c2cff0c81c20180fb29276049396e1a94c34db3667cc12d4cc36043bb47d9af15534d35035e96487dbc6224b18199f3d7291e830199ea75672d92e50bcfeccf3507ea28b8c1c091786821607d88a4f0c8a25a04fe9a17fd38e493f669ffed899cde0bf4c2b9a62b87e657612f0641e7a4d3e64bb2d19605885d918d5b2123660af27b3f42bcf54648b3522365285d8496a74ed245317025f67ddc7025d922fe835896acc177013f4455d42393126a917b77f4ca14d7532d02e6ee6df91f47f2267659fcd39ef22b8d17ec423fa223cb0af74f90b477538c42d6546a16ec40e68eecc2cd5378a7f7eacacbf2b1bc8cb8d1ac3584d3f5ebfe9bddf697e6bcf2875dc26aed932d230141bd195b4c1ff7fd96173ec9d888deaf6d0d4aaa4e3d67f5895ddd286d0dc827d7bd8062e975547a491cb81480754463b556a4c822e17f89493e1b1b98f0b4bd697715073fa66ec761f87dcd917c8151daa1058d4636cbac004221232f38811a361d977109c23b83e8a093153f9aa57d45ac96f58ea1ecf1a8195c7a0ac041ce69f054cb94b9fd44613a5ad6ec8bbc03e5efc1db44bd919342ef2544f5057eeb4e12f49388d8122f3851da158248f9426a6096e75000ac821d093fca397abdd3fbdf94265504b0627cd2dc1b699889811b7610f1c6793c46ab7a0976a83df870de5c299d032b021e3ca574aa3de35c54fad70e21c8874afd941316b6dd640e2f6d2966abf3814c711b4f7fd06b443432089d4e7fe5e410fa86e7bc852540fdc03ec27e08a2beaabbdd4ba0c0afa8b85e51243fbac447f949c9d2fc59e46b2cbd872f599550f68a3b8b27502713ae832654a7265a27275c274c50a72754872656474eb00e4fa00e265c474da84e4db44ec644c13aa9df88bf512b1c10f417e36c1bed83467cde483e6a9c0f1be9f346f1a1d13e6a948f1ad5878df78935f6fb74237d7cf9f503b9a387813cd393a6019d45ac4fd20b0ce6d790b3bcfc0a7c139d8f0cd3a450903f348975b6a1eb50e78cc2e9a3788ee2e7b1af707d0ab10f038773ab6039c0a38e02c6546e4e29fb268bf0d5152e65aef90c62f7488d7293d4eb940d8ad04417f8c8c12773561eefb89f727b2cfcdb3d736bcc10d53849be115424a2d223b6522e077fa3bc08c9f2335490127a294b165d1b7070988ac8f235dd4af61c9b10ab9b2479e91387ed03d7b3980abb4bd1360402d0aef14dff7410ac694a64e00e081817ff27c4334a0f6b0c8b13af93d9ef8d581f85e5d06e7405eca5ecb58235bc0d464b3b367effb7c9712af45271e694d542b21361d7333ad4045e2a996a25c2e9525ff5eaefe57cc812a8b8b3d8a5f3c55b9ebaf85ef6d3339d9132f099bcb92fe6a6aa37b05f7d9124ec756e276dd4a40f8b0f91c77e67e750622b0d74f9eb2ba53c5b914ce02beb758eb7b007ce2465528bcb00124c81748a5049a1df1544fa346ef95e1dec14ea0a764c36225261a78c3ef12edd831905e4ed96a4289f50e92f325f05727a1320428014786154c2a11c68001a11d18a01a9a6a159f967707a9469df7c99d29b8135856b12661156206e892dbfa31b0a1acf3cf4a226581760d4dc6849c9b1f14d9c9f737cc691fbd70656bd2244d22c2941b904f346c249a62ef253aaae416dc95ee8389a02307ff122b417b9b6988bfd0739563a6a00b9470b52fa4662cb749c7c30b438844b444ead13785ceed678b861a5080ec0effab6fe638f7e441a8571ad0a379ea363f8471e0d381d5c4fc164ac38e2397c16b55730bd02d664546bb76a2e3ad34e02c2dbf4a91549a4e9df4de22ec794a9b96f207ae3be387a7098b72d50f09f980186f49a3d798152c4122d823ef2f57b504255bb24c73ae8ff408bbc38dac9f3e36280d0ad90edea8abbabd3baee0a76c106b4cd7e6581f627f530d39d56a688a8d4ca2dcca07161b4005330805b0fe2b917e14b0c390bff05585ee2b5c1cd381c8283d4a789d89b1aeb055c02f0946d8a42842a01ed2035440f1c7af52b2cfd2d9314f4e8645acc85547ac9ab09192660acaa88f55308a204372a36e3a1dcb9269a71f08ccf85c45a4d3cf1cc64aedf9a007d64d0e6b7740e3ce190789703f612d4b19252c7464b9869c725bd9da5ca04d94c739b3fd014e8cb5ce3858498046ba06f8b4e81765892098a70b2d8fb295c229bb2e94126824d38f9007ad6f3abdd87a9c82558460d64c97189ecae89bb92450d3145e650b9ec21233548a7b1ccd265ece006030eeb457067c830b4d66e9d7044540874e5a4ea556d614b981414e2eb9fe94503fc604e6288f803900c1aea62da5c99d7a21f1256e96d64d06162f46dd0f381b70efc016867db775504f5811c674f2e9ec3110f909f03ab77f2ff5f6cee8b4c972469b0540ba00cc73cd016f39de5099e6516e289838a74b9440447e66575010bc74bd49224ef56bc54d3d43aeb05e55a8407cc18d2b0e5a1e0be19b6360e0cabcf465b1b36b98ae91409526a8c9bdcf482d03fedc362761595cc3ede80493b1f04651f32d9bdf2e6da83e616e7750845c67e8d2a085f41e020d831fa550b57c144f986bda2347dd4b5045f4b95dd2b7047acb7306cdc15a4c4c85abe864aca2a916bcb314032c96394514330561394d8fab2348bf83e40cb474d6b27305c948514754feb746dfd80eb1bfe4cf1d3213b35a5dfd23f61c2c4e421a757c53695e745c489f1e2addfc1e85684c0924d6c1b61efa97b5f1157c22bbde0cc3d4ce722a2e71266f9de3f6d9ac28da934895be24393609aace5f0083d29f6ab4dc29e22a0e584b6d212c225748ab20b541e5fb1899249ec25ce6d5837668104c7214721258e60fdae901370b9c0cc2c93006bd6a9c80be1e66323805139d09f5c513a9e28007654be3f46bf5cfe8a0607b82b8c483901d966b840f72c80b50dd51b595aebc4ade45597109c7e3403ab262306d0799176629b89976e5a1b2f987c37dd2b55cddc0516ee84f8f540f429c42c59aa39e21b12ca597a5946c0f1c18a9e608a531a052b59750882dcbe67884ac09c08992d1b15835a1871929317d79d9e64ec4a0ab449901025bf73c527b0bb03d17557e64cfe8926fe297352407f117b61d6c1a7be0a9eea88991aee65185f00c8a8987f1c4186544f34a391149549ac5ab97fea2da08cf709f43c31da7624a0281eae284092fb333c06374e3f03c0e80a048e2425fac0f548d044999c6672b29772027c6963ee31b98e767c7d2defc3704aaefbf7ba5dd91501291a8902f843af97744232d732b4c2b2f8beb18773267bf0fd11788bc0e4948dea3a3084a071bc0084ca4f47f7f00bc3211208c2a4fe3808ec5b466dedc22fabb800203272da17528ae82eb5cc834f8c6119eb8f2b885e6763fe30a6794554beff31ffaab6896dcabde4fdde8a90d22a58e9e745f722626f1123a0de5cfea75bf8de66055541268f7134a711a6c15e3f7b364e4ed14c167847cbd19c48f6acdf62273630b0b004525d018a6a127bf5df9b42af8694a73131869ed43121c659acdc02caf2baec9c4e638264518eb039ea1050959773932f349b8211cb810ef0b8cbe53809dd1d688c68b4cc49dc149cbe39c2a8f5af4da8f8201892c543905ec3b5f86a76de3fac4dae9a7da073faa09317d6e56021cb939788e06fea5a2ec981ef2ee5ccbcbe1117379790d910d20959bc5115fa8d5b54529ac15037cdbc793f1b40358fe9e72bd9f71e92dbd0247df990dcf82592de2277822057dc727d048f61695118048132379342230413f1c65ecfd6608b58bbdaa83c382a0d02fd69d227f84de2c96c05cbdc4c20f9e4ea5d1537e299cf479136679aa7946050362a2073508206fba78470eec51e0ec825a61b56520716a01a2d9664e2be6beccef9703ff06c7727b107b24e45724db398ca5ac0071c2ea187fabf59656c8acda3a155488966e6cbc92d2542ab41164a63de3191c3d13924813036a8740f5f26cd435a011903f456c996dc2888906fd7ae85110a7102f9916d8e4e3db68dee6311b6c76da00c2a8b92785eeaad3f511cb16a7f515b03f977282f8add584bf15f50fef008ae9f662934c9cfd24cb280665f4b9ae92462fafacae10acbc46196e30a0927476b5f8b592499a895fef0418738df2739090ad78c00d5afe08b31c37ab56bf9e927cfd73add00a59a2abd9e6bfde24d47b8d469a2996cf3e5ae9f532166b3a28c090c07248cc32286a43aad6e17180765c8c013b50f0867d8f4b1694c61cc95de5895311c2c6635a0c8c0732f7318d374f8c0395e94d79345ec6f6353117427caed55d8066fa5137febc10b01ae6dc756b2c015f83dd0dd55870ff3940caa4e965a8865a975b024339fc3c4fe2a20ced138d359240d8a01aa32c417850ef5fc2e55080a85b4af6e86259597528479924c4ce93bb8240aa553858e9022d93b6ba014f35fd1832b82c4a53e9bec334c11098325f609f41b431b8f2fae664f49248b30124b76ff458c7ba9144f126c657f3741d61741a609c355de26df8b96bf78e11c1f55fbb5e826e12de104c8e1cb6797073f249c233df92115dd9e743024008057fabe90fd941f3463eac4de5f3c42c89ce1c4e3ca145edf322660bcaec2106bb8f1f2d99bd81c9d88f7f365d6479f6ca7f301ce5c81d83a64ee3f45b10bbc160e8683481cd04764e559dc58f2a51579482ffe85c90de5c3839a97e89a6e83b4f90d57419374138d5cafa0adb098891b00c723b2cda86e126254f7f5b5472d715444e6ef8e493783cf84d7abc31607c7c165f989b8ae719c17aac75b434e36a9e1d76e098c7c3e78990f626ecdd07f6de283dd23c34297b34e1613501345413775b5aae0608df3a9bfdb5c5f3afaa184ca3643f8fb863f43511add1bba34fcaaa7e8f68e1ae28e3a97f02e3ce24b0ba5c4b73a331b6a37897d2a5e1f55daa2d8ab5f682b06610ac143576331255b953ba4c038f545729c0d4299e680e5e91faf836ee7bad23847567458b4a1a30ae6089235691769f488131c1cc64bc9ae096cf927611bc37c4372f3685e65caa7030b1668544656b5f30aa7be997da135f43a004f75f0e8b4add92344d6b1e6001ad1c81c541549f9745c6402c1afb6fa94b54eee19383ffbb8d8402425071719437a421fa51e66b4a3b125b0e503268680958510e42392703fd4dc53f52365904e25f93407dc590e9a99bb9edee380d97448dc722af762fa84c8da91c624bd696c11f283b1f01c6b73381e7526bcf96510ce3bb8a2aa3c60891da14fa0d43585fa8c991289e03b3690f37e06d6575a239327c33943acf7ca98ef9d348a57bee2c003c18ef5ec4c92b7796858ccbb9cd001138ef82e896b1c6047150fcb0ec7667f45b1fe4fb518caa8d68e0fbe0c07050d79642507a7687a4b60ffbd782fb118fd651f732b33bd85ca90f227053f842aecb73eb02c2ce1c509a61a8a9d7f151176826c420195224908b41cc5f8096d8f8caa8d0db53e3e50d87379f2ee424ac4277b2c8dfc55b7e1ff4cc4596ab4da22baf6521159a04cd9bc15b2622096a578f828794fcb2815fdf679936d1951f44a734db5ded95f0a44ef9b9287adc1fbe707357e4999a3e05734f526f93f2eb42f6c93ed6f38aae4cd7a9e0016757e5dde38b6fc17f15b795b538c6095e48088f0486323028856b27549ef61635cb7f499bfa22601dba90834c14c17cc0310483d7353ac77a9e3d73d55ac49251e300dcd30ffe5a1a4294abe024903a4ed71c8179631356cfd646a8b208b07aa068bfc4174f6be6d197b3e0fb88e24d5a872f7d6beb3c563d2131dd863f56fe23a95d4a5d0834eb777615912f85569286568476fbda986a73704080e18d592b50616847a27eb6a3db0fba9fc95e367665ecb2f2a74ed3abbea644055f7a09c289b08605ff05f53193e5f7c761558dc559f8816d8fd4db87a9ad8c0641fe51ccbbd3a851922bbf7eaa4ed9060e0e3cb2326b7986fc669f75cb234e15f1c267fd88a80ebacb10958e85da8753fef58b88287244ed3b6a271f3d6aa01bea92a92be12209e59f712dbe425b3341b280085d8a0534552632c181d3eb52e13c1059690e715c50c16653040270e3e93ad24a181834916c3515613ed16950b52e8c153675d63c20b235bd1583fb81ba5e31a2a88e00b4930e12a2c4f445dff38b59048bd1698164f936df9a712406076dd9839770a58f213d5d630b56366830cf5c1620e4b099c33bd6b5cb3532c3e5b89cc869e38a975df3364b07c1bf1dc7246aa2f0cec72183dcd36ea672ba06416cd3cce43870405e869e696f793e29939afb7af92d5c525da184eb4357cbf0d10f88bff31878f98e2c77c0b1739c1c9e735412e47656f2ec66f8192ede166fa87ee718e5d268eea90752c2717ed368a1521de739ef25660cc8ed8c1bf30ec4f1e892a009a965a31c63491438bd8209a29214f3eba11d3ffc70126e75c151084457978877ab9000b172279789bd1a7b076801defb2ad8e225685571fcbcbfde93d5409cc3f5d9eef0ceaba054e6186c986474db8a5489c37b5a585543c30ec32abb4f68de9029facfc0d4c1ce8b6b80c262d7c9e9acebbe0957ced8ffe6a91b49bd37d36b0c0fee3165192468d89560250a5d784f3929cfd7cd271d6bc6c4e252f772066378e4b53f3e6483d57a6f69093283f433b4a559004945f980ec8bb0a43930abbb04d14343a5112ec4e756a4e2e749be20220a526d41a2716ac51e482d351334fa38d30cd8b8575890a3b171bfe8bcd73d6620e4d8c349600835c554ebf7a5d3a42b0f8b94cecf686d46e7d81523b1e2f5b383c26a172479388be23a65cff7edfebf76333738b9cb966d368b430fa73977f841856c1e46dda181652581caa2dbb53c2258d910e487b00851b5d3b41c3b12da081ac680880f513fa0554ae3bb9005aa05c460e935ec2c9fb45c78513e5c209597e92ed334d4f4a05d7494154e71ca68582a3739a7f3ab44dbdb8f7fb07fdfd550c150fe3cdd64a8269f272b4463b81e70ab21f660a0ad2f92a8714107784c7303428633cf61d0fa304678ac9833392d9bb3687f6f297778aa41d89dd3bbb68495871325b3de8c089438443a4a36a2da745ab4bcd06cbfa35bd99badcd5c105106eb8aabe26c3cf9c8684167634e0701b9e56aa16f0d0a4998771447a54c42710f2c31cd4bf507065a11e19c3fa22b7601a7b08c76ce1ee820961fa8ff53a1c09872ce16fec4c9fe61fb17d95d44dca498ae84315c732381374d68438fd9cbf34f4430f9e132604374916d72fd84d4ee1f45815211ca6f2f01f54c18022eccc431e33a5bc77dc032797884cc6eeb68de3948a169163c97834e3c5e96a7e2365d60c761c7a5646b2aec95d4abf4bb49a450dddb5f4d445a4f47e9a4a81a3dae6aee859ac12419a2bd2b20532d7379781160161481ba31eb89410ccefb35041cdb70b1dc83024393ac0a383fe3b3a61791c76071e2cb2acb90ef8f56fb3d4c310e6e6b713d020c28df6342e5871b24f70ec93151ba106c28166f0704ae2c110cdff20cdd159429aefd4e502f819bcd23c5254db82c474a1da4893eef0b8d4c1bd678e762e71bbc4261d06665bb234b4a5155d3c98dd19f8046566e0e0c20db8d0cbe4253bbf34e4ca22e693ff2ab53a2eeb072b50fa71a466149e38aa913d4fde7398e2af14b54b7e42c646cacd5dfd9d547e656f9ad2684f6bd992506180a02d1f1e21ffaccd506c6bc7ed93bfc30d5bda912aca9ac7538bacb7e4af07d572447aafc51702f9307b9ba408fda7300008d399aabb17ca570b72af2e3d93dd2351bdf647b14602e897d9fa98498671b84157b8572800919caf606784babd981572fa1264a3499893e7c02c746710f7c23a8ff03ca96e419b7b4349fa32d825e92faf6bab236f07b70e39aa64159a7580710289360168214acb5336f5065e2c77f3ba278fd020d82012a5bd0eeca4502a22f1ba597d3e9cf650c0c102a4b2b0a525decc55ec13238f9556deb677d040966637940fcfe01f03eb3006f9206099e1a878c66b2ad49b1428dd2532dfab357456ecc61c81dcb64c3dd0036f018cd2bf76df596040e5b33957bcd5b5864b978e657814e36cf38696cbcee8a8022482124a5c2f654f054d424f5babe0c7f519033f65f96f579af0ecad97c6ec8b1f0f227292e01a4f0722ee46290859a1e1e9fb7fcb788a6c066b89426b0d6687d67531520cdccb350272190ece7246728ff97adaecdf3accf90de88f37a698103f6623fbe38b10d2e364c01ae82b64a338752dab22921766c7279f0aad4afe90b251ba92765887485f3c8c298813d327cedd8034bc7414c4428943b367a35bca4ac54476b207d63dda87dad40f7315c27d54aa01fdeb9053c1ef956becafccfd04f6ff10a2e712f5fa840673bbef8c5e0c0a62af73f2c86d7d854572f2241f2020db7f907c6d247132076f1ec6b2e63f8b50fd1b604f78e3fc4a2e5096374f5d12b67131736e003aa858b9bb7771e9626d60cef3d86f1261b372dc0d6de7b757ebcd9cb9283d0a3c12d4f35074d831c445dce536c0ad4c41a3816574be9b6c1b7baab8e4ce81e15bf8f54b0559482f1230385b57bb4a93d11bcc3c3070eda6376e53ba9e97a7f421b6418f0b81fd7b0e145ae622df448758fcee11289980aa211d237d21933a164202abffa1e00c098105212eadbef3e7e10c993812c491d0fe8eb5dbc8d859a3eb364b3ae7116584741a4e97660e3dd87f232f9fdd14e8f0e4663f70d71ba802934f2575a9ecfa05955c0992d321f2f5ffbc482bb462af3a1721e7cd31bf71a496fa5cb3e3f7239ab81aac569f0393452f08fbdce1345187bc97735d31de4df1805134e7101abfc95261aef22b06e62243cc2cf2363f984635076975adea8bea7b11739c4389173dba34a1256049ba38730eb68891cf3229d95b3fe7c7eba44bd29be224d09f6b49e883e9d33a0685b31ec98c6ead3954cc24c49675c7e9b4e47542e99489a1d9f807fdbdf12b6a65ac25271d0d7bdbbcc9bf891135ad037dcb5638ef48a95b6a084d7180c4bedc35faea1b8b48b70ea71c416d0fec525543da0f3cba433a2abd61eefc6e71783c963403b9fd20fcf80512bbe2bce7f346cd5a78bd164aebd5f98f08af6dabb67a01749f08169257e92a8dc58ee8167d046bcea0a487b464871df07701c3f8101384cc5853c7d925900e1d8e42278149c9cb1ea7c909113dc0d00d8d94e0e48f36667f46ded9d0b5d67c3c690a412f3ed1ce0b16bdaa3e8f21080abd584d0ef69da3321d29e7102147db8b434492560291bbd2efed6123c23e2b86a76a0e39c03113a5e9e013a7330f9c1a071d492dd35334307357a413fdf478a2b86e69f81027536ae70aa9813030d805a17216f0f46a4f877bbf66f19d5f2771ecf16082e06670d9402986a0dc42ff5d395aa6d019ffa9a7a3ad669ac48615eae83ac6f2228e3b4e0a7707c57f10fba481e8d49cb4894d066da43f6c3c34689d4727edfdfb1c0aa118183092ec5950704f13173c1c0377ce209006d74edf09980654aec591b39538ba5244dd130ec491cbf791855b4a5546f8c0e917fe538460f8545cafcc9f9acb48f7caca4843391075a2d0b8ba3630cf232256af33229f839cd10d3bb1d167f04ad463d33fd88cecccf0d53d54b01da9c244c6a217013a005af5bf7c67fb0adfc193434fa2c598fcd4c709e5338cd6717ce249c332079d02f8318228f6a2d366801dccc1c33b50579bc616078b5688717a41f4e84439a99325f4f894b2557bef32c2c6d9cbe0ee9d7de50134a6efff54d8f79da847f32fe696bf1eaa57e562db87c5d09061e5562ff41c5d217609221022ed07a86c0fc6aa1003cc2f76cbd0ca69f18194eaaa0eac946402efd0859904a1b33cb4ebca437107746d9b975b5c591c7591bd85480b9702e82da18e301e3bccba5e62d61823582d2c442bf28e9b8d34c533192a548457a4ea3f7fdbcc363c37a31bcca673fee82621eb6542a82e25298376938ab35bf1dc1a6914a34c5609703d001fb1a54c01b8194217d40962934168ce333787a05b4ac962e31cbfc9506c13a50ab18c1d1a983ebad2e55203ceef66591383e90e429dc4778d5cfafae7c53aaffe1421ecbe69483f346ddfaec85e00b636537e7e3c47c2a9501147e67c201423d1d8d4cb793a2f3e9ddd367010d12178c0cd69cffd744f41f1ecc889df22323a59c3ca2f811977ddd01d5e1d2cc797685a497b66d2c40479d97f5dd8748e71ae908cf846c0004a57a523e0004798c0ede58cf931ec49a2855eaf6196903d4eb71008eafe353bc01a458c9eb59302891ef24246f88c87b110ed9c467815908b08f4c7d1e06100ad6b0688be11fe4679742992070284bc1eaf64d7739113194d3a94ea9d0434de9604f127ed4ff8263177554e8ba709053d58240063f129a2cc8847d23e27299c3977b30a1917639fe0ace6bddd55550ac3b46b86f8143c8e574f90a04bd5f4e1f4809476a8695d6728f8a2785a5ddf8434beee06292cc0d41376eb07bb7ce4b7fecb6d97cbdd037d987f2007404958b2e68335383002dab12ae66665f23bbec258f773a890ac024ebe7cce0378ff98fc65932fe920b048b64cde238e8cf2edc933ef83099b875dadf5dafb57662b34684e3ec24c00741402bb9800f96db88e3defa852dd4769b809c01933119f5850ce3bf2fd5392dfc3edc06e8418ed24975284f818bd370618d27eb25d2d5651ee14e4b641aadbea1466c7cc897cd8ab5b040921d47c81ddcdd40eab60b627d98fb901a4330f08f1ee48f4fd00dfed0ec6701a62630ba9f76e1fc70c819ef87f0d37e449d1ecafba0032e8edc3a7fd074819f1d2035eafcb04ff5fc1626370d304129ae43ad8c28e28f5290388eb202a99d4513019a8c0a5d98ec4722f16fa11597e8c92d42409c0e307307ed34c372092663226a7d713cc0769cdfe99c8d68fd04dd238537e552729f9eca6dbe51dc7cafd7991a32406a0ab83eb148c0f6af968e0ff5d0c309ee914b7209eb7cd097d6e58770c1090b36cea5aa82887b510382d4ef90dc07af43772bd554d6530581e5a61a39c373d23dfec09908586bb17d7a9bf927a881fb7683910025238a510bc1aadbe65a4c7d3d4e536e65fd4471807d92693f1d2ac4df5098a0a676c9122b693449c4b857f11a731ecc0955a3039c9c99adfcbeb5de80c1c32e1db47f3849abae95b0e9a0e828d22347313a5a05802b80c4aca044a23283783f474de30497df2aa6eb0a8b47583ea51503a7aa850b29ce480298574328faf61d9b73c8e941c83290b34119cd049945d20a894cede4f30847d0a7e398f4f5c2dfcc421b4f8703be05ee5d907cbc5b6bb643bbdf2df5211a237216daa53d5df69b9db0a66b44d52a2e9b77fb2da11f73895145b9882cc4d8e1ec296cc8c190064e5a845a7f04b124d5e239aea221a827e623a0647d684b63e4903d6a301124035c637ad667963b6970a34fdb9aa9171adf398f7bce92044388d9b4d45bf7a848f58f4a62be5a1d628f3f65db1bbc612ba109f116ab21d212ae76e34d8a939355d62fb512cca78e0e8896df1b912fa80f95681318baac1b83a29fc12b8e6a53abcbff92c52b86d06752aa16b925090744d649c007255af9de3757195f13cae08f40247f26bef558164a89b049d7362538c417e27521e51a8638d9e25a1d11e20efe33b82f0f41aefa25f8b4b1373589e578e2fc90eeda38e32ad918e09838fb683ca2dee0d46d91d66f5c4f1eb0e746b5ab2d85d4882871ff59ff8f2c48ad55a8262cae81305977b2a5b1dd92d4ce5d6e4d11ba94ab3940fe88768e6f0a7818e6abec6781033933daede204d1c0ce0967a2523093f7df8c90c620c82ef489f4d4c0c5c4f83454296b3b2ea0d63cf7c1760cdf898d690bd52c058d6d580e30ac32833bbe934e570d969af8a0adaa898f8a91d4f77d05dcdf8b4999e77b888ff51bace4da53d360d9e3724d48d9d4da29a52fcf15de7bc23083fe4d987d8ebda29ba744d44248c7bb27d66cf52247059bffd8ba5a1770a90ea3be94d3bfd94876be2145152d565d3c245aacbb7fd51a3216297b2ba65b67e58a3b8c247532ea5801108dffba0fc18983986ce024919394798af2ee7d9c4386d76d1fd6ecbe58db5914fc1ec484337f61ba8ca697151974627d5b9779052f47321b49b40f78dc73198cc8f520f8b2b98d3efd5d90fc2c4160048186668d8ff0f771815c15aa41c5864310b536e50713920f56d100fc5b01f38e2663388ac9c319f7849cd521c66ac75aa5e309e15fdd9660cf5c048a9987cc9900b8aa46c7638b3b477ea41c781ab40d1513abf77565426e5eb90c24b94a118843cc6ed46b77820f5f4c95895b8ee4ee78719dbac40df8ebaa95099ae218c95e8964aa4301e09c54498dfe550c3128cadb095abdcf755c51457087994e240f60e4d89e4c9b9fd0c831241269d44fa198e25f7ffbdae886694b98b4dbcdba1115ff53c898ac91eb82bfb7d8be8bf81aef762a00375c77e8f4a0d59314e2b9ca2d28220d782fb846545b65eeb866e5b381ce11041e8d33cb12e7d75a2a2e61903a73311d899a4245dbaacfcda5985bb081be3591445171d34d166a2334b6ce17046570d7bfd86bcbe5bae561cf5a16b1befa109456d6b58c015751eb93ed0fd3fca93df195bc9fb69a5489faa4d841a9d9fa9b47cfb8a83bfc279df90733377e5d8b71214b340ecf7e44ad8647eae1bb5ad3690dc14eaa4244c587f2e6872c19e98f35532a1ead034a9538558e98a267ed4e846fd143588287a0a6f09d6297d9c48a3ea19031c8e0afa41b3d503f00a4d8a14f756c85c8a342cf04f5945a42a8034927306e2f0bb2402afa17fdd9ff873021a532317c74a12742eeedcde98068c9dff1d74dc93c81efdc141794d1e2d2097bd3da9c07be8e5ed5667ba72fd318ecce7ce29f8acce02a28652ef113f4366ad3fe2e3f8a533feeb41c277b78a918b55ac9d10beced8aaef995a2007590b64e898e14a4b2e22e814499cc94ec64e2d60a3018959c743db0f480459776364431eeb29d33088437f4a58b03e0422965d09b6f3960cc1b0fc14049c5c6aa456dc735b81dde12f560dc6b10e7b101bd3d6c0709764db8641e8f231841a44955a3d9fe1d6ee769c2718ada22ac9e4dca6bf7cf5c372a899e6e94bd24e8d77b9bba6d919ad5c40773f9c29a8d5c06f13db96579cbcb875c1849b648e95afe70b10589284a18d7a45e1e0c831dcef96148e11014bcf9cf2eab58748f43322c34231e322da3fb779dcb985b1b5c037868b678b52ae14e97f55444f1153d5494c33f98373d28b0b76c5212bf08d86188b60b198b855f1c131f0afd29d4a56c070365d6615f247fb538e02c9501b6cae5d242726dd70a2ac0936ae2cfbe3a4e1d513cd9a3413d34fac8231e7008cd3906c5c005bcb8e302084325199a8160928e0fbbe707e50a816ae7870ad26349a7261a2b7c83b9b794676a414a791e83aa3bd11c50a55a2a922db0f7d1ced6a2dc73d03078c908dce150002fcb523c842eba931dfe81522660752ca9954ec869355e25899c29b88e8fe9af346b045ab4c8722af5d967c9deb274d303f0a58043ccbd01ef6df51780025138530989aa776da31e9e3656e0eaa509f758cb0b95405bb9f6bd38b8a6c204f77e85b6acb3d7dd7f3cbe657269f628159a87c040ab84d5f73bbaced9c6c760b25e1b4ac127fa45eff4398c0d3beb2a458602675a9f1e85ca2f80bc9717ff5b0e31a2a5d72bddba01cf76118bc201ab2399949684245a78bd5d034a2f32a8dffe15182ce14d5289605b78134c1e14318a3860a9b2925a2ae2182ef76d7f8edd52620238699e655362997ee3e0c25605a8c66e56d0063ec71b4c95c058f748fc067bbe2d51de738a9a44c3ae29636eaf6d544873ead3233fad47c56e003bcc5ac165c0a596c7c9cd5bfef070e380c83caa3c302396b6e492a56cf32d574bed681abd9541482529cba8d3b18c6728d70a7ce85d988b5237a58406ad11e59b3849a99bbaf2c8ca8e76a6d07ada48e10e28f54da62a494be2b0a735e46f0e746810c736758c29e7c541e5f6e25ad81942798bb4e86b4337eba807c2b350338074577540d00db51084eff2b2191594d5f07283d7ceb9d44f28c5dbdf9ad62fd8719209ee5f92d73edd626cbf41329c494b6cd9186b11821fd578a210ac73d1baeeff1385bc168654ddb44686a7e9269d79fe7e893576044228262874aeb2f41b3dda05969414afdff55124c8c928fc7ca8efd9df5d743c398a3fd809223637c32e44e64c6720a520f757045160000e1d2f7110953f046ce3d8b07951e1371a0201990ade73b127def5a3d28989ab6099f99f878e77a1270ab0e1eb4d31e3814d8cbbf27faee817c382d84ad9bd15a047ea007757dfa149e6a3bf3a0815610c6d1c6dbe55eaff878139fb61ee62669bc3b16499d0e03c81c9489534e8f1ec66ac4e87de06254806bcd8c4f3a9fad53431bacbf810f48307f3c03bb170f4401997bbc784454951d0791c1b031a84ccd02c402ec58a403f41f8081917dc7dcd2011f5c741781db8621f08a4e6938c54721e86cef219960610cd140a711c63889e27d11eac0096ff2856e4cc60e90d6abc7c7d8fb6f346919c00935a1c965708bb5a268853f2ae3d736ace597da1739ad7dcbecdc6cdaad84f7b21d38742092ee98c2b98e10a92f909ac3671a428b9a4ef035119414c6f33760e38b7f29bc40d89f0da6804de14c952c81e1854cb8236de76a358e00850ffa8007276f20c3e4a9ab9a3b52956a3046f6307733600807ad049b120561a27b1ad046158252b313a5e3e96415ca9f7b7074295bd9b5ecc6984ceedc2e33cedb721a3231e0fcd5cc2ce4c16601e4bab640f524db96ef7f59fd7422dcaa62a837a87ae55044309696f2104290389635914df028b162a54e011513a0c7699869bf8fba4bb8aa984afbf10e11d9771e0183a7113a68d5696b15c4a1daf776423cc81155ac726e7438cc09c76b4f4acab14cc4ead34b4e00f834a61c025b2a3491d4ada851e9eef188d6491b8510137fab8c0ae80af76c916a77d97751d153cc77f2dfb4350f005536b4cbf80e3cb957faf62c5347ca64dd56e550fa443f2eb09ad1b7509cf454e4775abd09b27729bfee68dfd22f747be4180204f7874bb86aa653956654025c42aa765d2630141f93bec5358e02ce36a392234f4ceacffb711fe643c8b102d9912d5363281fbd5b6d9f954b372e6b4b823abdff39c14cd3c548b2da5bfde879c5527df6965bde574a8433ab253c6b247ee26eb878f8ce7104b23d1cc4c3a9c048b78791f4cc1794f78017c7fb0ec6f32e7eb773297717637ddc5527bd890973326702b91db6d470f28d2f4c15a2e52738b8b8fd5d07bd7ad632b1d57495b53ea3a3e0987c0013a214edd1b6caf89340a24faaa77a0ae2e14fe26b87cb108c1fbc029e6ef05ba5f225d5a0e81cb2bd263ab413df501b545c752b2ac1277706566176d4e2da8464225c792fe5d0fd9bd7ca76e21541d904b6a6d68d1aefe6aecf30be9d4a1ac19a844e58a045d0b0d72f89e63f446a9e5285ccaba0369f21980224a388323a773e6f8e354559a310d018fb083e3344e688c669ca66d0a2f73773bd9851c31b89a9fdd6b58f26d3d4d69ec0c1b3eb85c3bf5072f4f43d4f24841538efa8495b074852f8d0d08d04ead506544c26ea8eb3f11b458764e94e4cd3413dd01fad15ef124d09ff2c05112c6d241b23dbade6ac78270297e4233da364ccdcd935bd741d5c0c4f33d353ecdf5f27fa139943b66cef983f3b0eb52524d48f36068598df849f621979e142ae6ce5db7bc625f8d50c76c5210bbc8c9a760be299d5bc415dbdaa18d8a999752abba3a7c03e2e9ae5c18a2c07b0ec6a87cc453528b0d3db43d284c1c34ac7ae09892f1eff0760bfa7a9aeeda646bd513200c3e838edb03d9d1f5ada3bef55445d08330a1328a74146c65c7aaef016a487de0b0411a6ab10fad11ee190924c377cf814bf7df15fdb28187b124e496551b0318c461d4c066b17caa4898057e4b101f6a2535c131e93f2656844af4f74b11d6194b81728b12cf7257e266ec0788eab326e423314336a8290c37eb2387243c74a2624b029dac32105e92df6933c20d49d223c48806d139f0bd4bf3ee32bdeb9b56194bbf56521c2b1f9f541f2a3184febd59b8df98b82f5d41fa5fc46638993c9a252581016133f44f012494825cf94b5c4a25b15bf93d241df0e15ce74b5b23832294991bd47d82dfb33fba89b1536899b1d548622575234d99d7e40bd4511a48d33ce605a0288f78aa24bfb8add76a6900feed2556bc1dd53fe809f4de69406dd6a53383cb30830e6c4364bb2b544e83d506b200c0f0e4e72bd8cacc455714f72a1b1780c742fc7208d1fc461679df74d4338f4a72e53c91ed2f39a6b99224dd80adf59b57cad47fe3b782757d81aa75eb2a259f7bc3409c97e88baadfb2c5516f2055a254b7458379ec1bf3d99cbe2487c1eabcb02591f221a117a21f27faf46c41f54a58fd2b75b6c8512492cad1407a28fbdbedad2dd1f272480fa1a8a137a609b17a9840a8ef7e0262109e738c3878d25ca3ae0f3bb12384f383ea126d1d38b0eeaa30549cb98ba4e934a38425d1494c0ee07a3c532935f6ca206d39e31e628bd85024312f41d3f2e43a54bebd7c12a79b4a25cbd3f1208f45ec814151a140452214157db8f2203281c667606c9bc04cd808536d0af631c6bba8dcc8fba90d03445351425399b782cf1bcc9a0d1a681cc7460f2e2ebed7ff427b53f50f0d7792ac81084c747eb09bb11418a0d7826d09820d92a88506162e8d3ca361ff2bb5e690f29e38b686a7cdcb8ca096e18d79433308005379affc42d2c0000c7f7a294479ec01bbd6504d9f1b138989bed35b7f2c5a0a9ea4a38ed6e6fff4330dbe0dabe0e9c54fd00f12f4972929aef3804af6f01ed9b2e23dd74d5848411a5e510f383f0c50cfd2f1f3f34ecc478c85ee7024405d5c3b2112382541a78e83c7d28d11ecf1f3041ee89474982ee353bd5e083bbd39a6b1dd2a49c3014ba8e13a1556f67af1d4ea80e93d79f45b2d56435af340d9891559cd9a1e004064e2819f422ad00f22286f731753bae2e2516bb95a3d3e4dbae7270d9ffb24038dadf655f359a504641706d6a4ce2911e3cf875601b10f4c9bd3c0afd63385e9b8ded67155a81dd4bc12915f8f1a89f5653d1ae5e582320d37d2d1152795225c002609e7f4ce3bdc1ae828a211348e2f2d31bf56d6a83dc575758a4691ce3b93a019c4fdf6482cec52997b840ffcc2ce9cb8f09ef390f414c31e8df0354e4835f7909c4ff0937e721ca3603655a0740da005fe50d0e3cf8ea19a6b908394f335bb32e4ce488b7cbf6bfed5b72b716d6142212d5b84335def5fc6c67441e019b66efc971012e759d63e191712b015f74b17fd74f73df20080f085114e40a299102f443c4a9f7b80b5b04bb6d10fdce8ae4f43d125e9068962bbfc7f9e86707a1435d708052d7d194481b16981a0b0e6e046ee5ef86df8da8377314e10c7a43fa89ba59ef28138d62198a456e6ad043fb1ed1a6948f5930f9e2d15f6117a8bd30797bc4625a32ebef4cf7ad0e6fb96cdd6a4a68e0705f9ae9425a78c34001d3606757387d198d5c9b9dd8a350ca6a13b79419a9206415cf193ed878f093bcbbce6a3cf4543c2bdc26d6671c0c8c561e24acca0d62a619ab8a3f6714cd5a5de3907631311795fae3a41bd1dd00e00b1a04cff09a0e1d52143a93c39750e3ee1b939115c7f2bad35e693b374d474311fb216f76e798574ddcecc44abf3636370d09aeb289745d09459acdf8e7e7e804ee2e0162edf50f54d9dcc06ca3788d108c742cfe24b15d84a054a26a0ed7c9f18150af2b19e456ec322b45ddf5d1680f1b26c83c43985626e87cf71a9ee4eb7854715b645806d2101481f7b802c0de1ff3c4eb23c6862635634928c2c88e79f8b8f702e9a0d75250db47e673d11bbe0f6f11d8f41c269f9d4a3e5e009237270c8110e193bf4598f80b3e903b2be9c7abfa1c23cb9283a65126bfd43871730542204b8de637757d1119e728961f8af36b766e497e69b0f400f49e58afc8a8ea82408cacd0ca7c20a64beb8fe5cfa5159c93408e5625d62a2a17c5314aad9046dc28109f8b3f6eccd0b4c4fd7387fae29d9504686ee0067ac89abacef16d135e42931503bc62121d3edd0ec70016708d3cd00171071f24fe757121abb1f3303d153283ff40400a727f6e513182b0a53f5ee6aa70b36c5409c15af572484aec88cba97a4ddcaf8ed73acc07250a6b32bebef0741ac4cc17c23fbdcddd600716e9ef4828fc5ffab48f99b86149d8d3ef20ef979a377ed5c4279f238583419e27e23b1d135efd5a6718a3cc80da0d72b799322bf08b2d6861a832c6c7a7e64057834b2864c47dac012c8377c9dd84575233a1199ae4d808e06d4deadc5c3b63af517fbbacb5027e3abec698f343586525a7b78f7d706fa97853a029e920f5d4b9a3982aa251e9f1ce85bc9a0f523790c954ccfdf6f6575b7ec3096b959b734423a18b50e5301b75d02d00581f07170be7accebb8011db0de7c150421cce33d321e19f8362b30b5caa0cd1e96eeaaa8b810ebce1eafce8a05d293f25ca819a7006e590a18f18be0240cd5a2e0864de2c240af1828c3cd4660734b6f77e948b49695b8210577175b00c795fea9035a881712dcf893a49a3327ff80907087cfe28ae52da1a32f74c27b76447cb8c252ddee30013dc51685462994d10df0a78d981604ea8931b3dbbfba5ac7bdccd11989966951b9851bc7f945295c3bffe895503a23c656ab7055772fee99520f289404e85fdf5d0fbc44b38ea564315aac69c29eef10b68643c9a898880a1e06b3de2084cf75ec608902f8e8e5f372ac5d70acdc3c080678ebe8f2bb57bb5a8c0dc89537f5c640f485c0481cbe7cd50eb70ee84b92debb850255b38a960a882a40dd705e2ed73c271bd3a9e6dad38f027103277370f26d1a830433a7ea18183181466ebb7c02559d6a9cd5795e9f8f3af29f6bafad11c00e96dd59bde573ef056fd9f2ec3e1fb1e55cc3bb09293641e8dda3faf28eda68178bf79bb7197c66933dd157da3e177c657650299111ebe3e1d589d581e9bdd958b6215aae608d7f4a5230930953d938a9e1390e4c36d25bafe553631cf6213e8372a7c9325ec1f625d5123734f24412cd8a3a81b08dd0e3e8c9918a788daa36567058f8633d2e036b5ada9f85462b82d72115f02989abfd778acd90269019650f5f43a9dcf68905635c0dc5406de1f412b2a7b68111f52d873fd690148b534e3ad91e7864c4254590572c566de132a633cfc3099b4253969564c34643931fbe946a528e33cb3558000119f8c9ff9466617e9b3478f7e1f180634de89f047f587cd480432505838cddc2381d43cad2cc1d794252aafe1ac1e45d0e87abb81989c3cd30308fd11ecab6b294218aa8ae32f23c22df43f1c107ec562057e6cc9cba9868887f126047613912adadea09b76d7142bb480e22162493a7e76bbcfdddc9649342613c559676e21b02ac1151017104864b6e63861f6e0138c22c2e529a678ff74b24784560b736b9f7e5491e60ed42f6984f825a9806ec7aa1088027ae55c54f27cec722fdec57f669673b09969f9776661373251a21b07a7420c331890f2b8cbf4b49eccef1afaf533fb014d5703cff7c3838b03df15d037f93d162027c9a7eb30681168fab5c98659f4e619bcaf50f1f3b342a2932d538eb54e4ff129f40164cf4e6cdab4c682e0f43a16db298ee74d1d6bb639ea366e55eb8ffc559968476279eb9bc974ca388320c31d88b3a3d9e0a6aa694c7e91d9b22c60ed2ee6b74f403ad73e27c0266b9d2686a4c02ea7de6a6b92585761cf071b9e8aaa77aa39563ca15ad24dbbeedb79668a6268f8517ac4d70b19f939d322cf6e662222817217b11bef96b96e0b500592b0456da18da282c9ade50aac134105fdf720c62afc10606c1720d4c5677e19324b079448da3a819dbaaf1ccd8914faa1aabc33dcb789f8add8ffca19cb985a62ab5fb26ca31e664f4065ca0e16188447321d0510416dabc777b75488f979f38d3e3a1bf1b94aff08fdf5ad2f8895e33829a02e0f1d3dc1f38c3d2c54f8936593289168888c62717da49eef0c0b2e316431fa5761b32602081e99c4ca92bd244ba404947d6b36eac49004b1e96f9aab64c2a18bb505462a04d56b356cf17aecec5e840185c9c265ba33244c27f107eb5b39d71deea98736cf8b8e862239ac07e9b0ad52fae1190af7621126b7153d7c7969aaf1ca8db0a08b58281af4fe2e5dda836e74d986cc040cd879fdf031a484aaa21b5a4426ccc1e2d5bb2869468f2cea1f6fae5c2de37955ba3b93a8401e3822c708f5f0f6092340fafdda6820ef8c8cbeba05d12bfde54868b6e97fd6bad73d0443957285bed36ce0949ed301c620cdcf2375010cb6543579c97cea73a8a62deff8dbe1c2fcb19fd67a1af8fe87ca6a89b5f26ee612925f66fac2fc2bc4ab6e767616f0eb40d639ad034940929ff0f0e12d47cb4f10169f9da92322ac7abf85f02ff41f49b9719377613ef4fee0faeca0ebdf8f3189cbf672b8eb56bac98a000bc8dac7f28951fb5cedfc13c85126d4bce49c40a2874f0ad203d53595a170c26e4b3a157c89afa896ea56bfdee8898c8dad7a4f507f4ecb17b5f3b6067cd93edc69a332eed3be83e8ae23947f34f7753550bf2233e9d5395f013da7d1eb8078288f86a717b095dee5cf4facf380c312ade650b6d33287cb7fda821bb592e335908d98cd7fe193824bd38df3456339adfb20fb0cf40a00a952bd4396769aa0816b2203b85a7d84e78d2f86a630653667a1ec0b6111714510e1aa035cfddf07270f650cdb7e0b2a88bf541d60c8f2bc5c949e6c306e8a658ed900f412e4893432945ac56a631c28517c5caf353c61e0e49477205407a5d6a24a9cffec4a2659dc2d08897bf17a2d2c07d716726a0703c1ca7ecef30e83dd8ee4f5638a6240c12778a0c79cd3fac560a098e2575f85acab17f4c22bea20605d29a75898108053102e99e20fb2269f07f03f50b9b437f40db465c2809bde731d08119f7eeae05405ee0b2c762d7c91968be118cbda1fd270a153a1dc43bce4b311f04afcf59450bba132ccb9624acac6ca532abc91ee152fae2f3bfdffe91dc3de8ecd21955632a92880a288a5e81f818e0194fc28b5230ec824483cbe87bb7a57322696e1363cfb726e4ac1c7ac2ae101865982bf3b12f2329d330fb759e229b6763586d6a914f5ac2c538d3f3f99f5610c85c6390b8eeccdebb1f40ca4bcdc7b1e70d234f1b1726a63a7a310e6d75ac3175926fb81188e36115929a60f7e11776487723312de6332c86843eb926bb4789a3e050841c469de0db67a5ef1d820fd1b53e4c4ced48592631a924a458bb8229e1652c29df9df4d4197a23c3b0956ff205c87a7989c96c08e1e82b487eff48cf1d19f1bc9bd731a30e91e35f7145a91b302dc6b277aff48a4c1bf49c9ae1d8a4b52be7a84a710034f53adc1bbd5e9fa1e9acc818bd90806fee41064e96acaf3dabfe6ed48c31f7afd42ffa1998db24214e5fce753ae6bfbcfcaeb8cf741d0c08639a9a1ddbd823804e307e686b441a258896696720e66e2b6e3adcc8037244ff79ddd8d66dc45ec72ec5250f4a46208a587ff81df4107a341eade2948efed592d635a6ab4086e52aa6b11e1507baa8e74395b4178a234a7787309ad386f064d36a5ac65b27dadc71e69ca7caf7e9bd4c65527853e9e9ce350aee291a4bed75a7c19b19d6e9b54dfbf3a118f76374dc4451f34976c3e41441c6c5fe83b3209aa79b510867878be1da9a11ba87047e95b682747a9a224ae0053f65d2bc447b7700dbfdd666d8f47408a733b0b0d429925e39d699d5d502c444aadecad08659039a04f267b6a32bddaa84975386056fea8e05941596f14126d4b070514f30f4c3856ad82b54305054c16da81ee67f380aff2e4b3a536bc93b7a7d6f7c3e041e591e3a3c38929c1e6d347c9146ac24049da7e8e14a4927698783745f00568f32f9f9e0d2b40e66ae426548e2edabf1ad1cec0443b042ab87a73dbf7109a35f928dbf6dc4896804e01487ce442dae88a8a5a82d74da49644ba822e5e5926e42e8d08ef491621d319d2aec5f3108af8e2845d7957627cd6814a6662a3f655238c6f84cf45c39f14e64dd7f2914ba6e7762bf27a37faea88e44cb91cf13568e5be88c812545ac2272dd9522c3bd1a88f2c7ba35422f63d0c8dfa5e1323d02407733c17a0d7d42ec4dfed80d4d614b94a4a0411a39c315c15db7bb401549071a1a292b5ee6857bf0e44adf548f02db2bda095bb216eebdccf6834a9c67d6b5f396d3050435801c56d15b10621b7cfbb0165a5576b5e127d9dfa98abb99d695da0aecceb30d18f1a2a7b96b393b1dda3b0ebe73c082ada712c92062c33e57beade98c76e342b1ee48d14f55bb96b01545dc5dd640193ed6491f511d94beac3adf39b2dc71a3f0367658e5ba51938ba6056cc327009211a7b237fcff4dcddd958b0488e43985d2152da5097251847c0d0c3ceb16f213555a4e9e52c5c2a5f8f7aab22f10bdd4498ecececfd475c889a151d3774c793af28d118d1df475d582b3f3c48c3bd9e2602d579f4189c4d9cfbde25a642331b6cccb0103bf7b1bc0cad432cfbde653eb8b12f30967434bf81783cb04d290852afa0ca9f4898346bc50e962e198d76f4b03bc7dea85551626a4783b40a6bf28b3ba6a300380de5ef351af3acf1b02001e337811c2b789a0aae6504e4f0eedcaeb313ab722360ba281a140b8ca35ffc7dd7cca01b5ba140942456db4c99ae2c1a81e82295cd7dae75129849a6b69f483a0382f094dcf98d9af921983d97054b78b48ca4fb4478315334d7230482e2f22d667da8bc145fdda2ffb3fb6439cefe2a04ee2b3c86d57cb11665709b1b313bc097e86712672bace5f7e19ef2958600f954070bd4d3230242f06d397ce8075b267600ebc181b850019b0bd78152a6b11de4d2b461dd7fac296be19e8115b87374b5ae1ef0bf9595aa54088a9e0e773182b3e8fbef33d8811901ecd0744ac4609ad123f303f84b583524159624d8b1d141b21d168b2885aec512224aea4a5507fda2a138643e428e5694d88070cb5424714844d4f42c9ccf23c1e3b33ccab7b7d0e22bd0cea3e422a84aad2b06419c331b59c9a3cf015fa1e75643a5b60d51426853a51788301f54398c5b0525c7b6d5303497704b594ec558501e9efb8c6fc0f917b5106faf4c9612546904490d6832a9b62bf4c022ad3a176a1cd0b11165e9b179a0f84ab0f968b98c2b0a2b5dd65b0ca24d6f470fdcfb6d020d141c650a566be902d4ac81b15026f19d95f11a14fc5817e786bab09b6bbb1622e357f94ada0d9fe575c1abe9f921740d764ee715ec996ba33ff211e7c500d2c2aaec31b6c3bb71cf52b7438260ead0811936c1b855f80a42c90b7b5dd455d7705f754093ca08b643685c9eae565925ed516e618b32cce0b4a8d462d0e60d0a5d9b977b71202196333ca41ea22adf2ae594a0a84fe2aedcae26ab99b40b3eaacd4a1a717826fe4662d2a0045ee14b568296ec3b0c6dddbc6bef659ad3ad64db3b9a69086a4bab8a83a567d4c955d9ac0b78673441a89d4e296f3b4d11ff8125d9b9ebe72b9ac4487217bd0a8f9a9d0cc992f37df8ad261b9615b1ed1974a8f51e47abece1673211439ed6acfb4b6addf9216a3a38f605e22237a3171f439d47a1b04d5db080832c166d2d521fdf940e227a6b4f92e7f6f65e05ed26e8de7a27a5ac185867c722dfc69fc722e3c3eb5bc8ca1efbbe54b4ca6feb7786797f5bdbae6549429e89803c6fdd9012e9f8cf9ef588d81af82bbe89807b24277547b26fe6d62b4d77889c7314cc361cb217d4b6c0587bdcaaff5bb2887f726092eba30460e0cd192968296930d7d05fb24bfcaa25b74ff71713c8995386006f04409770f66c73d2d52e3eda71b2db3f56797f1268eb665809d0cea11db8ebb4d3a70016d77fa04156e333d0a599116b88d3eb2cdb31ee0a355942a13ae7532da168f548744bf82e26a5a6346fa09893d10c9e21f191faaf9b8b9717fc75a01a07ac13a42c8900e3c6d9520bd2dddc98a94708d27094bbaf4f12528f8fd6e1f5674c55f7e2a23363983faa892aa6a90e8abb322a16428d06ec5eef865283eb50e1cc7cf44b791ebecf8def7691422c7814d52ffc4ae249c4546157d90b03db6e05f093a3eb807033449d35f94a6d16b4202a0395a10bc72bd02ceaaae858f322a7238eda83dd31eb3e0ddeecf106383096d385dbd73e31a8f931a2b6db13110c1c99c1f6d91c6982b5195235b1a6d50f260e4aab70a0ddfb2f820370220ce7fc6509c8f4644ed289ed2c902502bce9e2cbb1b764e0ca62f5b7e0b216e1bc64e245727d6a1b362ff4d7d312f42311733c03adbd7905b34269a01190e32180e00e215e9089402679fd7044f0bb3b6985a41e4e9910d038865d4d2f7719921b18c742ab133dbda419201e8d7d2eb68d663e55785787ea0b51a6d7b23f6373c8389e6bc92acedb6854d30ecbbba0532f242529203ce5194fe4d444ffc88af8c9454019fed19f225757d34afbd245254a8e0f8f90ce8423c4e771919422dff30630249bc7e07a046c307082ac5282339d9a3af49622c13a23e5f9776e43ea1106baa9e0e3e6158878be9e8ba146098af587757b2d6555892adb667e3a35773a122ada2f8c3aa068ac60c899f551cffa1306235b0d16432f75a039316fb7e911c4441c7e738f43eff95e23b76314f27f5f9416c7c2e39f80dfc9a85a136038da1d497db97a0ea585d51f3fe19c150769d7cdc7dc231afc9ebca3e3d85b14ec4d32bc708565824f020f10046ce718414270de98bc5145c27a70a9df39f161a2938f19c0220bb43ad0e3a1190acdf12ec7992f08dbe000d5a9393066cb101dc3631678e636f8b567ed8f660728a07bea9e015cf6d184a8e46656c0b110f1cf0cb8bd91db98372b3f65b695867532643f46cccf3905003916e6b9ec342ecfa077c419b4ae3a2c2acd98935c52949af28dc165cc6a6d3e7bddaaa7189f14a2abbe71ff836aa5aa239c14598ef600f2d17d6341c973362165ef16bcc4724fda50d57c70f882a1793225115b2ae14e64801910bf9588acf75130787415e0f0639300f84e99216300ebec002e776017e749e22e469c2e9fb471df79fb2a1f9a221f6872a7211de687fe308666ae626e543234728438b71e8a1b63d0a0146d670ad17c4a1aaf58b219da611524f0bec9c1aa851a93ec5630be95ef2bf2fae5d646fe8215d7845a2a2e75bd7c7112cc8a6af1700c76b367b4517efb2402f41d69734b8961c5fdd476cb58bebd1fb9fc1551880c1adb89793783d7a6fe3ba3ce0fc93049cd687572f0dba81b7611e6031012a0ca8c3d238cde4115bbc741e6d6de44a053375e8f9a1b2c428632215c1fc5f7307adbb171ff05aaf5df31d403c22b0eb1d7a34804e8b9f78f1f24ae012f879c23de9bd1422a04d721fd2e2d1229ec467c293dbb6ddea7fc20430948a70af1b799702f6f4abfa2b09cd9702abf8f781c7316c3f183a0855c8ac780482d69627b9b1cccd2b587c2e0d493c4466f306ca5ddba0db6b3e4e6b9c2ddaa3abd8be2916a20ca05bddb1e30085ffad0e2e0b745de6dc375fc654a3d6eac16e229e587e4cb60286fc610500218ec604694517e5ad482a9acc0bab3422c2ce459b40c4ee4d642eea8b497067a5336442f12e782bf5cc4f3174c191391414ca14f488596c1b94faf5312ba5fc5ab2a39517a59379b912c04b66ac4ee9921db0f0bd116950196454137e2e4e5c4a5388bc1d9b681d1381092b7cf66e20569b7a60a0b285581562b83e12cc8a98f5db2d0e9d06a8d5ec1f55bd68bd7c8657c5f6d2a1f4af1ad6a001c2468a4974506fd090b55ae1c82cc14f2f3e08f2f5418f2b8ab81c5c89bd95a1cf0d6d1556ef79b4b25ed433dd4fbb0a85c996a4ccad17f68ae145e918f72effedb82920fc2d0d7a1364f1bee126dcc636464f63e5616ed1b04d4c9538ba64a35139a7c83ae5b695887cb0a589395b4ed67fd4a790efa089d3a39aa4f20fc14b6acb5da71f1c9b63d9bf7d433839c896dae2cf9591abfc769e7ce804adb31e74d5353df20f7fa7c4f04d19abb3d8e7802278e563e86aa6af4915fa72a144a4285ef6f0a32821478a5143bc21ac97988d2a1a0a7ab2a5e33f5c8ef8499ee053fe9d2107382035b3714f3a6093c60e5678489be22d6e0f08a96a61842a561c25f3108d121eff5ca7272667e061c2f6103dee1ca6c0af23240a45fac68d63f78ee3ad0a761a2b6bc74d797802158580febb9120034ed3b983d70b8d5bf4b229fc1dd3ca21b9f2e27dce0e4598e3bdbce566c66c2d5d40e4c5c0ae61dc613dc09f77ba2f430f64253bb0bd10475f57e86a915e912745a6ea26d8710381b68671f997f96540f18c5905616cc8eb784116957d891607ea2a0a21f73b5152a2ade09c8121a9e94edf72469da5e2ae45979429e76b128cd1a6e53f49f08b861b12873446d88a8dbeaa66c709f4bd74c5dce33d48268443a5bf1778d775e20458d887d7753a225eb5093b2473dc74d4bed4ee1e46bc1aad5927d9a3a44fa134839f5c43a21a9d5d0c6a1f54acd1a170b5ca16e9d0aa54d4aefccbbc857145b403b5297b84c2ea89735bcb2af46380df09aec342521a1794510e70f4d5a3ca4fc6c5dc6b2d884b3e32bf85d432e464834d510d38afb74cbe7805e2d72a0e5658ef367ce804fd6749ab54f2792860cc59c51acd8a0b621e1e35358014c3203ba20ea6d5c408c424e07f96c364ca480375499ad660073834648641fa4afe35f38fd5a90b24ec3558fe7f8134202bacde290ff668c7e987dc1ad1b579cbbff2c086fa6a03455eb820800fc19b45b2b7243731ce67f648288ecbdb79452ca24650aa20615079306feadb8711cb7e18eb18cd5a6d4a6acf56dfdf9b65a6ba58cc5d9c9f9dac77dc7755dc76d954ec8a665e37fc5e2d9704b8bf8da6feff3fd69f48ffc8abb06fd4fd322ea87f631feb6e14fb3585a6de55194d026fb6fefdfcd772745a37fe6cf1adfb6bd7dee23aa0707372b6d5b4f6b1cfe66b66ce1e245071dbaeca094b7e7b6edbf9cbc5de7691e31729d9d37df280cdb44d6e67316999e8c38d1738278fb6dce97f127de7edbb6b9e57210c2874ffd037fa33812412eb77b19659451c60a717c358eeda7974b1ffaf4b8afde1078e30d91db7b7c7db04ddede7addf6b387ed27864d91b53d872153646d5f9320936f718b53cbf65f2b6f1f5fb107167bb68f44b1a7976840cadbc7a26814a3c42ab1a75a7baf6fbedab05054ba59b2650b172ff6392d87c647ad8fdc56e2e20ca701f75e9f83280d3c140e176fbe7addf70d86646a2774e548370165a9eeb5faf43e0fb8f2a47f6ded01ed446de0cf059b2c80dc4a5af89021aa03f96edfdabae54e1dae7dcdbd7873d43ff5ed0d86669e835d6ef7f4bf98a1a419c85c317cdae1de7c7dfb1f7cc2c19e8c2cd71e7a43e091b54fbd213077f6397f0d46892cfbb387fbc557b6eff6350c8d7ab80f9fee4da5fea796fbc1a7b70fcdb8b27d288b3d50c033100d9cf5ca62a10843c1309b88ccf4e7ec4987d608f1e2d22ed688d9944ea1a5824162713a34fb2daf8ee8c3c6d38d3c0266f519cdbea6699ad5ac85462ff88244780418a54a1157c275910523d270b83b778466933970c4fde0abe76b2e72d438d03f6d23b252ab66d9f7f1a5322b28cf871b78ae0f5f28dce117ae4fa32482af151548b231a01556b136be0e1d298f7227847036a4df9e083d8290d813a3108b2152b7812ec8c593d80e6188622139dc9e4642aa8294610e8d23be2de27e7da6e78339e4f84321e4d03f9ddd27042316eb3f1591ae198efb649edb774038eb3cb26f725419f4120d3055100752058946b68fff1c919869a43f7fa87ed43cbf6621eda77dea7daa1f730371890658a63553af97665893a71742bd8e84c618f32cb0b8f04bb9fb1022325f71a98240a0f91068e25707345fe50fb3ea074ef6c7c98e3f24f94a0766f6222a4d9818299aa84a62a66002259a151214b04a09a8262528acc034636e64697c40e26462d2a481d2051a5aa2c499961eaae4e0b4825d4206c72566c918778959720224312e341072b92e468b951c98182e37b89c89e142c68ad122027900b8237e37327c78801b7047fcf842fe569e741bf5c3bbc0c93a30302323c3946c89c8297e2df3f8b576602bf640f84baccce1504a29b5d65a264fd8605f4654e132fcd9046a517a22b665f8d209939b0cdf2d8466ba0c3fb675eb5cf43c0ba1b543acacc5845ab2e32752e488bfd7b11d149c3bfed11b348ef85f017c389faebd3b8c25f52153b8f0592927c2729f1fde4031fa681c718410e611b74689828db7b19252c2e8d2737c69a02cb883621d05e81f887f1ac77c190fdd139f2213cd9a0fe3252ce9a68b77167becb3d17e434998f3308175f02b07bf2e7ee160994ce61ad4bead85f67b93c11ddb0934984af76b270f22eb030fbc20201e073e226b7eca021b06a171e8903d3dd5df9e24ad564b4a4a4a923f3ae08e24ef214b2c93649aad74d36ca59b662bdd345be956d3e8f8a1375889ace951f2a45d29845e9d4ee313dc41b184410b96e81f88e50a8da3760da14cea72e5fbd3a766c888419f68e8c0f94fc7a481655cbaf23dda3be325e315e3158f5e2ea35fa347f2d0ac27f7a981256c077f0f037f291dfcddcfc19fc5df0d1cfcddc0ed36f055e154eae7b74c722d18bebfacbd37957ab1c95315a4c6ab5e858da8bec637500dcf480935dec617b1815541b0111baffa062a52e36d60940735304be565991336614c4c4c4c4c4c4cd068bbf659d0c8a6527f8695514577be84492359451e2125f58e1d57ee8ffdd3af33ee8304687e0d0f0990cf9ccd7ce992af974a31228b8a6a85b5f7a652ffacd60e8711c89560bc67e05c94200b100655804c10066110066110d6104731f78b4a7906338fe849ee03e3e5fb09ed1361fdd3a477d097ef4aeeb3f3b10b2b2209201ea96215185d3f2efb2b2a755cc0eb2a05d99b52ea1f144be7b9d71ef60d00ceae0d721ee9743f7fc924ee17612ac0faa7be8c58b28c30c41658f2ad0efeecc55fca5ffe1a40fe5859c2ec6737fc5d59adb85f37f50ecaedd880cdd333983fdcaf9d60f62002ed78329ab2949085e6919f4ac19e22ec052bc3b5e1e55b8eb2844950c979e44f0fc21a870a6d817cd721c67b54ba9e03c5280834100c29e596678f08e6f288fd2423060cb2564a18d89b7298f02ab35f77ea564208218491faac47df2eb5399fcf5a4ee9cc51e059b473d13e388ffa0f67067d1caf368fb516d8bf9961df3dfbdcd659fb9a263577cf7d4654069f35b7b3099502d7ab2444a9587da430e0c912013d0642fbdda5686438b14da5a42c024d1b2ea243086d4eb12ccc82daeeda7be9dbc8ba94e2cedb5ff74ba56cfc8dd843dfdf1bcb3c3d0537c50192a16ee55e023765b7ad2f65ad10c60abdf935ce49572c170f0214005d507646014e208004b9797ac27810d33cee72b90f0830348f16ff2f9521a6435dfea51a92b29fe0d22b64622598c91d73b189b9a48859303125251d1d1919c548780971693f4549d6feb3b66d5b0f9c528b1f6553dcd9ec9f975b6b511a7cd6b4b72f9fe3503de4869a0012a0ee4af79af75c735df76cdddcf7b0bf691a7d1e51e3b4e76e341c4dd3344db394ced6b09961f1e43c914ce499ad6133c34227baba2fb88edc8510c238d4caf063078be038e87a016eed8efbfc751f1e573ac0877bb99d9dd3bf59737e2053a99e1227e130882cda359a5895231825c72d312a3e6cc971f6a730c8c1b4f2f11dad8094dd433607edb8fef0fd2fc451628f7431173aed481cb2a6691a06597ba9617fcddda5fbb35afd53be94334c1b34734e21d9e5502a47d6ec9f565cf99faf893d6eed4d81c0091112595d54729cb881e00981e25e80ccfd99cad5368664228b35b5efbee172b0938163a20f049a51699bb17be3ba3eed935152ea8a2bff8b4db99f629353eca15146e38c4379db77def6b96e767ad29fdcaf6721cc66200869cdf95d914e30830599cee186441787c43e10ed6d912c1c0662bfe222fe16abba22b64302d46daf795c7b9de998abc37ffb960ff78140fe46eadbe754ad02327f53350642edf69c6d20ce1f04f751716f85b84f7dff20da5b6cc4bef68e8d6401625fc32ace88c63510e7a5226b7bf7de79b6afde96ca5be7a80840a0faed11fa8daa9f08cc2ad403a9affd8daadf4896ee8d685fdf48961b0c44be7d23f5b5774fd55885c24034e701ea3010fbf28d48ac6aacc379b6b9c455712aae7e10cddfbe11f9da073102d457eaf78c062f5f806c4819ea9c4c1fae0f2a2c2d59576a92269e519232f6da828a87559ca962762b4c167b29494996850adec38c49af51b286e84e71a235455b162f222d2daff22b23ac9367fdea5f2689660cdd80246c94b85045968a1975e2b5d6fa729eb615882d98008144a117494b5fb089f1048a8f91515abdcc3126ac50030f99c64cf0c10a19fac9e5729de04fb9976c38d34fb5d64a450827a2e8f55f6bad609c261833130c14130c9a39bf86614a02459812d0304f24c9016e7931e1caa14926822bda68a103966d4bd1db49a7ddf939e7744a72527262726a727a72921519d167acf84057a16c8c8c8ccc4966262583e2656858b2352d591b1dafcebe75628a75f22d0aa35f1c2129810a0c4ae810046c0545442d3164eac22185a42751acc8252e5e906c9ca72d1109add6b45a8d4830459e6eb24f57963a13791a8959e4e9da5a4d6badb556892ce281165d31a348ca02a394522a1d634329a5447305b35a842da3c212b7844b53e4e9272bbb67228fc6652605558289b300c7d040c2042a2cccb0c310502212104ba8236eeaeedcbe50072098b8a1e2490914882626b802f6b0e4ca1affe1894a152ebc54304f6a98618ce009c2a09161662f8f4f81352ac02f3125587280a19920cce57235a194d2a52d9a32a54c7904580c21a8c28936302c3107c9050c50c0c498bca0a6ca2baa205fb9979858f3825e68d890941051f44afd94b604634a40a6044ea9222af5cb1929a8124cb4335560972478431836338c17499400e288d22048c8b4664ae4ca1c0ea594524a29a5bd748552a6d49571d8c2499532201083864ac461a6e4b3589312c01c88ba68f9a245cc9298458b51142a4d6e8be65a6bad539099c229f274feecfd550c11c492bc284a12c515f1862a56a063056cc9b37ef5cffad57f156d22d1b37ef5f7ab6023ff5b4f1c955a8a22a46fe95fba42446104f28bd952cc05661e910487524a29a574098929534ab53491a9675a6486524adb3c691a17461a105d305182f39140de50844142865182490d4cd3612e97ab855a6badb5d6da4b4720e5ca94657582cb744289d44244d1ab625b69ad55fb5a6b9522694ecdbbb256ea449193bf292a7ffb5bdf562d42e4fa3b4078c995456f9320c32839a93153c50d49614270840d3fb8e60f263ca14de56bdd565a1d909ca7b3a6a960092ab4a0b0450a4078116bd802e3b6bc40e9945202c51170bde2c8ccae0097da55293bf68fd6434a132efc01d45ae17c0933a73d8043fd981deac77c8aa7074210c4b3ca3e21fb5a74a27fe8c34cadf6946a301c8f13ca9b0f4956c94cf167243b8e373cdcfa35e883f91f01f2ecea0189ac3864e6284dd84e409a3945ea94135e404738589168021324011d6945a182035096eb2958818d15268ac02e5268023a6281175c9ea49cc7bd227d041432a023d10aa08e177cdd8c86218e80248c483544ed7fc5e2694fdbb64db32d27212a85e05b01464e32973b06822f8ee07aa5c5708f64ee43cfc019854dce6384ba9e289b17848d70f46a4520e9bdf3d0a6e9a9824823f62510042010ad3fe5577c84be9c45b204816aba10e102b22fbfc811faf52d3e42dfc8918a5d6ec68a2217907cf917f8c7a3235510aa0a221fdf7cb9f128c62aa5053d687beda34ea3828a581e310228233aced9e71cf7903a3607be9c798c97325ee6549d47d9e738148755f1350c9b9e54f106c72af0a737643e8ab339281d23f57522ee11771e46ceef7ca382eaefec3c37bd21f183705e7bff2141dbdfbcbf08418a70df3dce072982fa8b0aca09aaaff31e28b1afd3bd7d194723c81878c753519834af97721ea80198451061480422f0220c095205d91ee771b011eee30f095205c141e97cc43de6cbcff9fa5cce372a08f5f5b38e67733c557c2440f639b905e182508ff33228e8621cacf2bfc1df6d9ecab1071d2f78b29e2ae2961db94866b449701d9b05362cbcaa76747f3ed4a65c993bf601269f44c63e50420c4a9b1fba682d40494aa2b920c3caa865d4325ac1d4bc6055281140ee184c08580f1e834589c16e4001d7d1dfbf8016c00494893d81b9d7cd824f25a5b329f62429f6441643c145a78c3e347cd816ae638b002f80f6b96d00aa2149fa00095e312724c890f90243c17e4049c3d90e59a434d9702589d8439b0923e149c52f278da5b0c512cd84ff55973bf62449febe35bfd09bdae9a249bc29d87ec5094dc5128a322397e0e06d185695e11c937d2c50c75290e59cdc3114d464cd8974297d2801484ae952ca1851982ca5d496c418111059e68e1189f1264e6022bac189ccc99929a594524a296553fa52ca87eeaf012459725bed9f4afb87cefe99de3f1efb27c2fea170c3df7c0d20c9f45f6bed75b7ef0eb6df3621f91acc9c44fd101292ef50885a8aa90fad56136b5b1a13777777189bd094b8bb3b7c77189b58ad3425d6cd38dca2bb6115fdb5d65a6bad431503fd9485eadbea7dfd541bd53df7bdca32bebfa5cd59c0eb8162ec3c97e35d89f130763ea707c6c74fd58fafe3491832bc8facc8aa39e7df7d627cce16c3b391a77e8e7723abfef55a391c1059f5519e0f0e3c681cf5bb7e7cd816469c3470bdfa601614c39b2fb7c7d8145cfb5fcbccb09c9eccac3347e4992e6bdc2ac23b57b4e711e367b3e08f95af6d7351f6c68b7fbbfab03e87ea81f276726c452c1c0a7f2d27fca172e70db532065a59a8fbed3beeeb705dede43c8cef1c0f83c88abfe3e5883cdcd5f1de7970bee30deaaffbe8dc779ecbc371bcef6f46e1afeb3e0fb2d6dd285fe0208cd15dca49bd6fd5238582dbd862711b7f96da2e6effbc698b8a9d73729b5a77b71adbdddddf0872e36c1a4a63ca222e6d1a1bee9e26d60f565750683b107e26df4664a51a477f08b70d11396bad523a57d4d189e5e2c2ef1b5a5cf88dc407bbc585ef433d264be9d68b0b75c4252e47c420f7f3e89fa0c601ff46f461d958c968dfe22fee77b596f671b54107cad4500696875a4e1c44d6cd751ef81a8619e5696d2ecefbf3c0719f9d12eec7dab8772559ec2f79201c1e71ebf06783c3dfe78dc3433a362832c40a5690f2503f654de2540c74b4ba89eed04fa9b9ad70e56f2adcadc98d51624fad52f1152455c44499563cd3da5c1fb1a7ca9fafb9ee07c20584b8e237c4ca70040eeca49888e4d238e6c70bbe1d4f6b733f68e4ee24dcaf677604fff90df54f097fbe0e1e13f698ec8119903823cb432dcbd493597a7d01fc9d6823fa58a0796fe4f933857677af3d5b2c9b867e299865e370b893bb73348e9e5af0681c18e8f860b5666895670ed6ea7b1b9c5501ec892916de9d4d7323a5efde3036cd3967777f6a054e725084957960f8c41431d0b22c1431c4d079b811593de6830cbf8bf467230fad72ef403c9f75c3067c0987bcd863ac3fe1628c5cfd39edfdd9dd3d337cba1359f4296e111810bf97d2ce11c029fbbddbd35cf85a920bdf04d37f7e0bb59c36e4ce7fe3e8d9bc52aab9d08f6224127364127d3ce2501490fa943e04a295fe120bd48d80afd28f403ce2a5a80de27bccfed1038abb11f0f9c457c24029a5744e2927a594524a29a542d0fa94524a29a594524a69a574494ae8b585dd45968c9db5f7a652ff2c56b71c62a77fe64b09348f740006175c8003c70000f0755902691cf279305d1986ebd537dd7e3f3c437f76d9b8687f77922870b5aafff9cc67fde37558584f41a69204d9847563b5fa8fa82adba4129745faee9af9abeacb67bdb4f8721f5fd326d3df72877d1659b1886b5f7bad7de28bfee765ea4694ced6be1cfa1f0dffda49ebddc8a21f5ff453a91b3d7a746921aa876d1cf21ba5612b03d76608cb1c0e540ab2d64cdb76ea41eef28360b1c7df7a579392b583e6c26fe769db661a3a716fa7d9dcc0257fee580d6cace456ee980d59642d51b20172c7906079be4403dddda5fc5a39b65c511a7496df19a27a40eb71e023b264bed138a20737cd7d1272a6cf047d2d2b633dc5f82de9559eb85ec58f4be1fc5cc59e9c68ffeebc0efebec35f4adbe2129979e765ecfc7c203abfa47b9d9fcfc347ecd9bcd46b71bb8f21035b1bb12706ee224bbbe276ee70f7afe3cdf03a5e90e37538dddf7ceeac673bfc713c9cf33a6f1a54dcc9a40937b6850d77d81e7a0d61d3c6bd7378f330d0ca9f0759687ba1fa76c35fcb71dae7fae4b072bceba53cadcd8db7bb8bf171f097ca1c87bf2e47685b1287f9b309777737811a8729353aac974053e3d0dfe572652233c32fbef8e20856e96670d53f395167c7766f9b173f7ed08c2c3ffb5de7b84ed334adf384b6b69ad675341e6a429d851f91e896c35f845fcb3877f76efbfcbfa11cfe9fe6f893932229e293fa7c1e3e3ffa44a2908c3f92ddfb3c4faff33fb9267f146a58a83efd88c4979165cc321d81ec92400431de278416c45446fd6f2847850f9594e0cbf80a9542709f977fbf9d4339fe208d6efbfa1446e355f89b51037f770696811ff063bec31dfe106b7ef3e5ab31cb1ac097f138a80e68e06f060e7e149e91c230879faa8171e00b6918f5283869e019d81f07d5a17a54aef33abb77eeefee32b054032d4033fd79780c2fe7773c18decd438f7efc66e40f2a35d5f1f0bf1976d53f36f7fbb039af43bed5f08c0ceb268647f06b654dc3170bcdef5efb4f4a3570870efe5a4c2dd9508ea11cadae9b5d4b359af71189192a1df98c19f7ca23f952cd508edcfd379423dfc7e9509fe3a5501a742f74f1072baa832e770f95dc8746f3c0977204594a6f2847d61e077f2d9454037774f8d30012a986ca59dea49a2953f067c84294bb4c1f2a6571ca17e48e6589926f409359b963378cc9b11bda642ec3e76e6ce4761f9def9d208e83f843522408bec551b2d0f64732f43ecff4b9b73688be63782d47e5f6f88b79e32efe8844fb1191dc6fff49fcc9a0a0a0a028422e6b5051ede08b1d7b70b8ffb4a7147f10966bdcfc70394c24e68a89c42c31a5143a850fd828fe205605c117dc219f62975fcecf1b21d98195f85a2a3b6a7b681cb76d5e678ee336a73ad49b3cbc83b88770b3f52db41b16aa3b4ee08e9b8f48841c16920f39a9aa8fb23fe16f283cbd6d72413029a594720b9cf267a46849d1aa41866546856ccab286d96b0a2c51b0a0e1f00765518e6fe3c9e498733c22c7effc23042ecc29a2189657c7245c479ce859bcd9ffd1f6370d0bd9fffa35802483c6d1e374771792f661a5744e29dd63ff405aaddddecaef3a3548632470f7a3156477279ddcb123347169892ca8d04206cc182f4da230e208ca9114a232751e9db01d95a05d41c1bd02c5cd95a7ee88049a9325945227cc39e7bce282ea4a9713d860a7159819473192945941469232f2250d2e9d2465e60c59a066982529639d1e613952ea664e5a99ce5e07eede4f947ff4543fe6432c145fe5583e928c247bf454f09164f73a882e855c487edc892b984166e50a1298c08a1556a670923b56a4b0220ba33171bfbfc1fa87ef0ff185f67691e5f75a19d05869ca3c94e4f80e88c940e4a43d71bf9681e0ffeff2e9528a1dd0c4fd3e7ff477e8abc88a5a13377e8c5122b55a4a58db5aad4620e52a8924de93682591c44a5e91244611c3130c531821a794531691650c67980c1180dc31188480e10720668ec8f2d90ac1ed1b5d8652b69c0f5f2373fb2184106235ad1611d6b6621a0d89cbd4626a4d18973b46c584588cd3230a3e443df183f683f683162efe8413778fec8e3b86c0fcf5777794307631a7304979024325c997295d34f95223776c8a2cdbdcb1294f637ce8a187d56a07295754ca5194241ea49449e2458a089478916244122f31293fe49a3b262549a94b972847b9cbe48ebdd01455b1d2df81f6bb6de4e9bbca93e9469e58a937798469724baee39473ca0c28b5b1a18b165070346382b28406e58916fca65cb83bf70af1a513820517ac8cdcb1165c7036f1c8a5bb2442e1a61cbac75a7065f7df89ef2ee5dee48e19a1207f2f459eb963464e48c17d57a4e32359fab3080d0df5478c810c3f03cec61e08218c104208216c488486e5a54d4a29a5740512eca4b4484aa6452a90e0c2f3187d89a2280d132829884118c972ca68887c73c78c78a0a2d57ac1dad66a1545ca95d21769d4342152a2c6881814143428208061ce39271413b42196a86033ca32a595ba58b2b028cc39e1ac4293523e91e64a13172f3c4971c552d111a8223328b850f4e5a66808177072c78ca6d0206220986958827008a28b9228b0e02208202926cbbf3264192ba2018a0bb7732c9edca804ee7655b564684800008000331500002810080884029148240a8571f00314800a839646744e99ca624992c33008628c01861000083000104380310841735d00a6f39d382ad4cea9167b95b6cfe2acb28ab1a98b21de486f4e8a117697d1d2e477b3280a9880d49238a2ba69e70df89f82b1160892a124c36bd5abc5d6e3cd9184e0f96ba2bf4d1355896f0de98586539692f0f31135d6f79e427d9e8644926907625bed5770736f9a3fe46ddab2712405cdfb77c8ccc546c7fc7a48a72fffed6bebb2d3850de8879e6b1f46d5856b0bb4c1352aedddce8682b238868efb1a08e0b2dccaf5a89523b3b2968f7d58a02bbf2bba343c3ca793cb7a711e7595fd88d1efbb008a59ac55388229c9badacc8b70d90ef39d4a4ee50482a85b8288efe08f6163bf9e53d478e18c12602894efc3845391b9c20211ace539b14548bc9711bca60095642b966f2abc61c8c8a661eb96995aba58c1a5857e8562729272a6cce0763f6952c86381ebc1dfa792cfb6fc1392ae0025eb73eb431ce8a93f2a4aebcb87f5a875258515e67c0d27bfaac000d7481299c279daac61b69ba69a00f48a942b73f3dd638d468a1491d839de69c57da6665a7bdc8fc78d13cc67aaa9b109a47e9d7f1f97688426b6feb6fd69b13a3c59353bf331f687c2065c8af51e82b3245caef135cfac321f81e997ab7ad53c44f7d6e782a521bbc5e2f3e766c498d9876a909aec9432911690bbf2ad9858d01a220b3522d9357a5e94160da4d6ddbabc85618f97ffaa637cc1758dbc432c6a34dfa9c40ecdaafea26d85456801a31dde6494c6367ddd6075dabb90c26d46c7737b77752bcd77384c1f4d2eaae7d5cafa071e041b650d7252c5c205936ccb73f793a119398a1a14c474882df1b20a082e4a78047bb52cc4accc32aa641ba1640e13a888d63bff823838c3ce975e31cf658a5080f5c43506edf97ae90c08e2fe6d4f9ddcddb88a8aa651e326cceb22c076cf9a9b72abe31a1b4231f9a10caac44be376d68095354f9cf76dd6416eae11a61eafa9115d0d2c8bcd3f49bc92d4a577318f89463ef0265a8b9a8dbe0db408d6fb051ba0c50077ad0447b8bdafaaa75d8f0fab1b13b97062915e900fed21b58a5a37b9161b7862d92fdef36fa009fda20b79f65298d4c61aad5e46823a249c3492f9888a5a6ab819b7bdf2de3f59350aa4a318875691860cce94843f088328261e87cb7b006227c4a15a929b0fa3690ecb3afec7fd9c46f0d48576b33304886b7feae1ecca495cac22c1513fa82e5a36512a152c6ae7d11f81b7559c526768902efd2d18ab2b1835eccd64f694afded1b861d9d7efda86f82a50814a7fba74a5961eee4c5b5f7294939ad5ca188fd05c535c82412caaffc161cba2fa0c93440df571488508ea210052406da21d9898a938ab9e34734c677f4a74b54a8cf7c45a336e40b99d0b10cb7ed8db0d10f104abdc45c9f055689fe5087c83409ba203eeb4486c7a0b2361dbafca772f7fe8360e31ccac877abdfcc08df23665ea8317e84dd1014a904df308aae270f7b4af2816dfbecca69c8cdd9b8cd8f32a01cd219fbc00fce2afcfb7d95b3da3c93f7c5b86b817e7a604534a61eaeb6746d28687877fe8e4c530ba4eba91b7e42cb608fda879b6a8ef95073f5f9f9bd5142788a86426a99709e626e1105d475eaac5ce4ab43b17e3bd5c40c510282ec0dd883ec5d0f31b89531d00a9d91f43a38a313e7599cfc507a2679a84fbdc587cd54a7283680195c400c1f32041342008bb8effb26550f2520249a5b7ccb795ef757605f1096df867e2cc7a17f7fd64ab48de5203ea00f96c06e027a3a1056aa2074e6f2beea64f6de34897bb6657501aac1509e5c21831b11d38db6af25f700fd77ccd17586d48cd63202b084826ecf1170fd8df227a7e5ac3b090cc498e78112192592182fecb44faf1f1010a825a61843fc319fa747d92f3025da0b40a17ec84a79749a0cd94e82c19beaa4d6930dfc11bd2d6c2b1a403289171dc8ba9073cff854b5e7d1c415fc10217946c53384765a7f86c6370d47d5950f8d236ece646ecf0ec265806a07aa4d87d91f865a97b96ad0aa978b2ab3e9edfa70b477411f4bb4e34ac1438f403b3c04f2934855e4e6b7cdb4a70df93d5f6dc3cfc3615460ed57337c6135c67a85a83f9e5db9e9fdeecbfaeccb8fb31af00bdea41505ca8b7129480939cd6f4f2f553e669c54922b04a0ae52721345230908a74b028b35627d4370f0a950854513719b01b58a801525f1d8bc3495caf2a29db498a90b81248407a9950910c84e430f4c954f4bbb61511e2930ced03e87587e2b131142d2729f5d34cb261144cf963abd416e858b014b8b7158b650d406f7635d5e3833974a0d0c689d00f5d99829caa791ea198a3e3bbdd14e6fb7c2c85ecdc479cc3aa712c5822a03f190410250482f9e372ba233aa910d78226dd7939db1947062a08cadc9d932b38ab1659eb3402c75bff0bcd3f12cc7a88dd0d1aba26faf3dd6eeb5835c9445fa291cf311be3b05dcfb7fd22e63bd3135c716c2854fcef3a8521f14867d2f8e14946b5a5f855e4624aa08da523ec51ad4dea61b84e6204027f4a2d9462f128fa053f0174604b22b5a2ef03ecd8c8854708926293c1a6b0252cf86636a8a23449a5b45307f8f8c885918aa11cb2d7fa4cad7a62563fd893d1fb713a101e5229796423d617405dcc933a4c4010d3c850cdc4ae84c9952266083e386c17c45fefe58a37c6c3bb64d781c705a1d4a53834695388228de1580db447f0d01b3ad13cc539c5df2c94540c72dc73a8dd3bb1b5e2ad5e0a201ac2c826d10e6fe1b6e02d14057d5f1dd0b51109ef0a5440b7342c27e72c25ea5780988c7dafd8c6f7ea4bd673f50ee8cec82387d2be4d22bd7015f9500706e80ebfd01065a28c416ed0993e9f7b6c28efa3fa76c727158422c1db5a06038d8fec524629504447413283d0629a36f601ed0580e50872eb57ad15327482063aae7bedb238c4ee07f6d59a4f398af748b8deae5c00645a4bef9067c3eb73e4c24f840b4a736195bac20ebe07904669af42da15a59b2859db4a3c87aa8ef35151bb1c220de416bc7ef52098829823c40ae2c1d3946518ac116ee3928f7243dcfd29c95eb42263c9fa9d68c27383880ab4bfe0d618c0fa765017afb7728518def28e3e4007d481f98a4aeb50695c8e0ce4cb02115db175c884b45b2049b3b453c57b09480716c83eb7354bd34c9336f30b4a8ce1e27ad5abb5b33097fe5da6519dc8a0d49406943b8a9ffabea57a0d6acff09d418c8461e80e4cef119e8a9ae6f594f8317afea57b62e846f0179b63d26c3c133b9ce6ff79e8ee392a64f9eacb07513f436d37c62527318b02aa6fc93d9bdccf1a29f735579ba7b83cae0f59406397fa0c42c000011400d6a05ffbef19dc8a2b430840cea21b96ea91eb1726d938b19aedf4789111815bc70503866352342dad0d1c57b05a2de3b8e2f9fc7949b8e73149881e2a39a9e3b0989b4aff633cfc1f0505a750faef5e9b81bf01ebba4402a6f00b8d25b6b621db44ca505cb2092ede79882001b94af7e8cff8274534797d3b2090e3dc440f65bd9f424037a64035f8eeb3229ee4b2c7bb99a0a0ec9e8712009f99ad6732932e2ca5e961be8d7c3ddfb7b49b7b7e06d12f027d5bed30217837579e14b986e6d0a64d684ca6bb9a86e61f84485edc376391dac7e51dc0a62f8cb78a0769ed9a69a0577cb10d1c1a1d7d5f59a97ecb6d73066db37e81ca92718aee97573a9fe7123157245d0a218a001fcee0667db8275490a79c174d9f2d5a015ff705b8d128cb198b2e173e46b849021204f43bbc952cde283b5c0a283d5baf95ce62c0b8f1bbeba2388347ee095b57731ba0341ccaf50c0d15ec087f6cebf753eff94107bc8ad72cff0eee494dda2ecce86e0f62bdfad4691a298b280a9a7418c36c1f1a88e07b44523ef4c3d441eafc1ca19a16060945e54f3f043a93b16b6be7e27d501b9dc362be21bcc016d76c540590232c1d3702cdf254f31ad30edbedfccc4d51e8413276d9c925c1a282d8248516f21a7957df04355dce1330f88657bd8540725a4ef247b66fe1c0141a18e88a4dc87db94729367d512214ab11fdd894306b093b055b27ca9653dcf4e532b2964e7586764614f71d37e13a2ea2b130395b82cfc0a1a0ddcecceaf2d6b91d79524a71d49daebbf3e4dbc8ca8b2819af3b83b371f066f7be1be99e17233b07bcf17da9a9f0c857081d5427e791dbfc4223742bb488367d152d09791ee26187f9fc22f924728477f22f20b1965c9196c955e736b77194571d664b2b983e4a19c3f7a69c18c5983493430f37656829556050fab8a788cc85897fa9474493a9f407f049ac7692205db4849c70bf1385f23f58276499014da3c1109ed24257cb036d3224293c695be3cc3f7d3dc5c3f625a7d61e6aa4440bcf4ef355aa83dd0c60b063f7d3bd95478d84718540477a9f76a50dd7a7d2c2ff3ecd8da91dd075f038c01640384fbd5973a4c2e165819897907c93fc48a17e8508aa6170b5a89f2e1e564fc68be5ffd0888e4ff0519034ac22d61ab53114774d476049cab03d389a857010eaa8e37ee5cd3e8aa5db2679fce776e54bb27092bbdac7d621de20c65b9793b46df3d16361f4c8ed46e767c49c5c1aab29ff9752191aaf3670245c2e7b83e44be4fb146f3b2f3ee42fd56da5b628228e3cc46ab16a184986bdec48a14917656d37cc51ca1d7e482adf753f13510b0b9c26a3dcb627703f2019233fbb855ced38ccf0aaad7713a347e273caa4d48a90253ac58a44dfa6e0f1fcab832dace27bdca11bb328ad2b436751fd67b83ccae4608791f1f42a075f2d5a8eea95ebc149668c919dee4b2ac17920c31e9a22b744ea28d47ade24d81deec11dec56a130c31cd67d67cd058dc96272ca3606db764869d15e11c09bd65f4d22bc7bf20f57951d13e972e5102ba87a17616a084c99545f35d6872a4586d02ba77d4500be57c95c8b957007de5310b1e100111e76f3d5d78206b31b581878a3acfe6e294848f54c1478c74ce608760675977a399d5d5fc43c4b7d28e7e010cb18b59b583354873e1cef45e42ec093c7da52506449fda20b3f50a638b30b39ff08fd7d342446415d1d31b874c6f136390052ab067edeaba1ad831e5157f25d020d2912ee8d3c286d0fdf7bcdf91faa255b45b6523a77f3ad33daaefeeda95e4cccd562f1400e5995355d775adc278591a23383d0777e1231a1cc9bc1b51f998db7460a7e1fdf833583ab2404c786ffaa96e8271f35811027634976ee28feb0e139aa413a4d04cb074b26ef5d0382a122682eea63d4f0ee6a52ad085e8be0338de7fc29740bc21c52ccb4f9171344c0803ff690af8187630300ebf072a0cc3f8e2e30de524f2197847ee4362d3cadf25ab93b52fa4b0f7ec953664cdbd5ac671d9154a30359071ae12ea68a39466d428a3dbd4479300cb18837d53c797a91cac5d3fd5d0d90a9326c4d30f7809ebdb1a5f19a5aa37e66a21cbf888118fba2bd97c0158acf163c864ecd01bbafb53d84b8e24b6bf96ff1968a9b40df9dbce9374f72d1a959562e7e0a48f49a2ad293018f770965ae3eaffbd4e191035a7e7815d4f468bbe21b49b25cf4cc8d529997d92b8b7f0523b06de0f52459e94685a71a400b8a7442ce8aec0208bf307aead5a4d1a9ee8a72d13bc51910153e73fc736b471fa41490386f2bc6decec8699ac2b40dacfd585e7614b994724261ab8e4ee569966c28cf6b67f2ca7b0f39eb9c59f528346955b1374e53aee0621dc29b38d4ca7ae965648a952cd2902e6676ea1dbc074620ac6fbe26dd15474baa7606935c9df12b2f20b7c50e4410bd53bf116796e250a2c3a1a34ceaf2c89fb50744c89633e7a8c3209ac49d3ca22414d980495a8920b4bed539af138b1a22bd63a581f3a5a2d3b74994b1858a7544fb521fe54345be2e181094237aacfb7940059321f60b60ffadaad2c28ba2994b62eb009e156defae91166d5aabcbbfae73671508b2afd612c146558298ef9b0ab70e830d7ad397a2157ba7460e0e4bd79f50f745096d47c8edd2e8ebe23af93c8b0b3303ecf2445bfd80928fb09778c67d1fba2526d07937d799e66ce688d8ba25113a965a043456474ebcc179202facb51aa0a1bbde31c2bc90aa438a7f122f4b8dff660db778796e678c9c1ac62cd05ab60793a23e399f2132dad75c4c148eefb52435c181c99d48b9106f5117d041c5ee55dfda16e4d73a50e2f422ccb4828552f06f3aefd5e249cdc918b4fcf18dc48a542c6db63c1c9e9be7b6fc35010710f089fcce59e10636acf0154e90a984a27bba3669851baec6e88dce6df0f449f125facd8e346713339f35ff35ee5a66005ab865295799d17b2924eb6890bde09b33baada3b8144847ff930a56edcd2ef8f457d4f6931c1e987ebc120fb149caa5613c7cf7a851f06f0ff024e5c28853ea6a440d5b38a8c0bc530549372c8dd67067dd26c60c8ba16f87432873d62f62cfa61c9a7378d44a466d21c9925d4731cf519e392a21a756714b66d00f9035c710d0e2752d454d672aa019c48db5f7a07dba6b2af6320be032599341cbecf322b6928240533c13aae0e0a2231ee95f4e76a2be9098b9491265ca51a292d2e5aa5bd1d499508271dcf34b71b6d582727e081c5166281aa6d540d0d709ac431db35f59532159cc7b59ca28d9027d1b46464714a7e2113048d0e550704e657ee8b6754e70261b8e08f4cef81f2cd644d81ae6cc534903710e85d3a4c9ed90a452cd44fa1b3390c1f5884c8d5f4f31f00fb84c55dd7e170d815ed73dd14eea26a691695a1e4a8a948c6294f0713286d91121c9e8787c189c2cf8bff2384d36099e46dd48966a163d3a575c1a81c34b8871af8a8157ee732b15e39062720a5cdbb91261c78249f3e0b497368d5234f113c99a797a07d2fffc18373a49b36aeaa2fa21bd2027dd7a54f340104909843b48c59552e4652a438557b1923f8b71ceca29617db2a242c34b9be001bab5725f109b0208c16593e91e7320807063ddb41b92f5ed94ecba10fb3d5dc0e831131e125a9e80f8755f0952e66e4d10aedb6083b1cf1d41cc097f6d68f51c25da1de193177bc47c0e423ac4bda05f82abfd4f45be632f261f41af2a7ba457ad9641a33845aa6aa06de2addc3b4691a9472a160f16bd90403f8ad35521ac98dd205b71a18c33ab725057e089d2c6ab47058275313a4c8f0e83a06941ee1cd93efdc3338d973715daf5c358699b8feb7620fcb5c8b5967a332e33da08f7fab130a480fbe605e589265572abd41ad4c0c07bd3193b69b5464c9a90acc46c12c24fb1c9125b9fd71974c61948f0508c0a0428db27061f6faa35e6808068fdfa6e8daafa5289a51b92364ab5796df5b249f153d9d1a775acb90ec8385c7d1ff9d07e7e785f7f4f61e9a6561f3417350e624bbdbdfe579342e4c222ce7fe7cd112d0c3cfa32fb030af6ec3def7527472712396fd3ce58b370535eec413936fe0ac5b3403d4e3c1c5f0767354b270b81754433f99a1f7c3e2953545b14865f47f68d231e535380991c036f05671e63e580d2dc07fa09833257452b5ebeb2cda4277ec604c121afe973699888b31850dc76efee9b5a203f567db2f9f05e19551f319fc5e0204f64739016635f24da928bb8109033efa77d0ed96cb1b478efc2a7d865f435fc275d16a07e43dc7e145c1659fcbd28f7ad74c8e916d776bcd6129bf1fd161044bd7fdf8e910d8538fafb5e49f10d4b92399637408a25bc0c2932090eb4e938f6e91625cbc83ef16faab94cf5fda21ccabc84d9716b36ce068218d57bea1557b0383fa45e4ec0e165bba8f6cdb50def45e4d0771c2c4a850fe44408d8a596bc07d35d3f3fa2f2f789f4d7e32f6ea5e973945adced4f09e46d635080bc402119a84bb9b5111ff904ca36abaf881a1a943e3a057329ea76a86fcc595cb5d2a67c2d273426ba3c7ab67d5fca60b937c606122a11cff2294a788aa38860fb2501f5e567e2f6c8202c7591769024bf59852e9713b324324e8d67f059784b0bc3fd671a93b613446c885b18c34dfaa648e808fe6da4c57254d602d157e49dca68b7275bf43c1a03fe1062237d3abca4e86c277a1ec3761b4c7b4acfdbbbaf66a0577f3c97dc878d219a6bec340c0066b04dc689142d165eb9b40cc9124ccb3fc0a2d8add3f09f4244756ebf9c68519076509a5ec43c72ab00fc63bfb0c68f71b3fd820bc1bc812af47527a11cdbae4e1faf034ba1e9ef6cbe0dec4f37b071fec7044b322cbfc503695267c4350c236025c313e708f845ac8c29f24257127298d0c9ff31d4c12cf6f92a082450af67b43c40d1c01e1f94ee4b063d164935e003517a6a3d725e34c0694bcd5ab2fba2a71a1146b15a4e18e6ff50a08abfc96be249bf51a64685217e85e1b27061605d0d6476ebff905c0511ef0373c7cf11190a7368cdcbae21801a324e763b80f21f0bc054ea1d7bb9895a861d14d774abfc255de44c0c868f04afc5504e852812d96a48a8c186bef12d768ca73b9ca9d96defd45dcaba6b148a70ac36c6e1d62582c9a0542c612f538e52237ebeef98405d4c8632637186e90d139350196526c81bf9c0ed8d0a00512f5c145f3583ab286af6dfa0acbfc0b960d03a723321d771c97803058a8d414c4f7560262181021dbe541a2303c71c48f91ca341d8e1b3f31e0e878138386051f050d840cd677323811621728f2589b9f5f7bfa20f47c18717baab82223f5d2000dd9bc437efeb01cc2a1c2a3a3ec4b25e4273274e029ab3ede4d2434216b3f0e20e63c4a03babdda959c98f92dfdf7b177f5bacb45d88500c6e571c837122505f1c1edf5381e056067d3825d5b8769b01e5758d6e8e59b93ee7ab190a8f0fbe43af727af008e2b42d0682b9a78f88da31b57613b469619aaa1e8754f71ffede85c9969d5137821658da67a46ca73b5f0d13875d8a203d142c81e315a6adc014fc20da3a8ac40fe26a951c931522b0a16ebcd24128bd9f36b4724c341653f89b0f3adf939d363a23ae4acc30d0b99238ab9250e0903300ab26174edb091571332750a0b247d2f133e0b643ceb074e6e43a48e28ac806755a95a61219685bc3f8a9b7cb6ec4a84962dbfe97e0338bb597344ede5f2060c62fd1df807480a326231e29a378a4f2fc7420687d02452230fa4f7c24d5ddb2749975a7114cb5f3c63ddf5bc98ed594dc464a8581a3c902d3d04fab3f157a26a8d4265d338184e2d07eb731e12e0febb708f6bab4b082b630813d6862189a2701c8e220cb2f5ac11ef5c95f9923dadd465c7410377ae6c16059f9c45f34031675568ab6b4a477450a2b08b4f5cf38f983840922c39a7709beba13c52277462ad021135284056c616b81aaeddd10e331a44dd58f9e1f1dc663b04469ba8ba4da897f738c6acc23f9ed823c18434e0c8c1a5390e9f931c643513ba47c2b136eb605d3b0b238bc0a431e578d6fb7d4812ae417be670f0f255f0b4e03e10de4e0aa9ef9f6a36880d71ba7a36b9cb91b078bc6509253a70f9d6741111a5dbc7418665f097bd1dc556cb98cf7534e6a1b7c111f8047d2f08dbbc14ce58153ca4308abc5987f901c0ca5080652491c40c7784170f093072bd90b0aa98b81787e64ab9258bcb85621d38d30edeb07704452b42caa455ee172b20830ff129e4e0fb010236dbbafbc98844fb40a35159040ac144f82171f543481b800047a40ac8ffaf39b5d28f1db636ce827a021a1236afac9178cf3c4c8354cef0f0a99ab9f28995707ceff19471b6b3c6592b56d6f7662b75c65a0c58a0976a8969b8239dacdabf7963dedd9e770962972e3e3e85020be0ddf169aa77e0a5408bb48bc5c23c4625cda9618afae6cbc4b042d89693a05b46defed256e0e697ef97ea8a2bc693e1485f19328f4d959bead44c2c15dcd2a16a0093dc4921fa6cb842dea4e7ac5b919cf5c88d88080950a4868a906099522505096fad19d2c17d98008ca047f4247243b9108d31c9b3030b8a709d2a95319ce2f296c421654c7ee0742ff12df2c26f679ec11cdfa611cd47eee0d3265515bfe4452553c8dc414c61a486776c635d971159cfce3cf895b09002f8fba2d10e86cdb426cac7cab6d760625ea610bb50145c0bf6daefefca75c39d9bc3f862b8b06de06f62920c66c65ce58ab5150dbad27f207e42997fa0ad47848bc844df801231c10fd7b66b1220b0a84fa683a449024b8a0fadbf2a4d5cf689051b96242740f24b1a530af714c5b0000a86f778cb5847a2e9d197eb46e874aaa4b3be8051f22e45251222dcea505b529f7990d81525937b4815608b2add533c5dc95e0a69d8a0798dc6cc018b4e9380172ee8dc2b54e5b07bef085274235ef178d74280153eb590f539dc3f17829704fc1457f27aeb18a40c4ab42ab124e92da1db8f84bc9151f61a0010aea7a1ef96765abdd5cf927a669ad08bbe864cf1613b010b1400781f45507ab1e32cb0e1c2ec142495cb4271ab4bf2886858644741974a99613d866817188ce4a88449de3589056c6eab7911e1a638f6540c991fb3216d6238ac0f5e4d128bffeca3e130545f753f88266f10baa3ebcc5377cc270beb1e9a11b86e158a637f3f28b3d84024cb8ee1e6b91d73253e90452aeb8f85bde0183d1505e3a86eebf276a769c996e3195e9c84c19df4e3d2a954e25012abc713c74a860c5de9252a3afa6c5e468180a2a9fad3abff6dc73847063454d60f03a463708c799458430da0f5f5dd04ce0fea0c94708ed2008dad0fa5a8cd5b1f1c7440412ab010db1beab2f57ac73d66f499523d0cb6870184c97b0a690d44e162f26c820cc83a3c1af27c1f8609c37e78cac816cdabbd701c7d39b73f4793e3eec3bd2ff69f07bd9256d8e3b1a5d42a564ef647382fac0a7373132340af07446545933b119ab9beb2b4751f49ca8d642280cb7b9a2ddd1f4b0fbcdcd9b910e2d19a7fa4970f103088a84d5a6856cc170a320c755a02fb91cb18ec9200074f25d3f160c0d971286aef7a874c8227479dd62864cb51fb53865f269dc6d83a5eb1b048f584ad792324a818c60269af13eea2ac3b61504d2fcf7e53f6faa3f8e80325fe682b555a00a9506126c3ec22b926f29ce382a78bc66d60188a01c4be18062ee681dddece21be00c03f9475ea743a30e41020788114bc79a12b0a562435b4ff37ded903985e380dfc3d4b21bfc8f8c964059bc8afac90014064a80571ba865c9670b3748ed6e70492e7d83e2ef1a97710963607a8b4cd4b8968ced41ba282e27610af11d36c3a4092b93fccf2bdab2514a80b9062da3191612b4533b433a6d0b04c045a0aebc4434a096e7615ae51d6721fa0c284cc70a7c468064c4105efc9e82cc75fee003efdbcc42aeaa00241ff23a9f341dae3141c0ae32e0fae06600121b1a33c198fa5b7c52395d2d6793cbfa21299657d55a637c6d63a7d088f8eb0f0c8430cc66602232d2918ad52e5fda7350c22bb87338745b5d6330e4ea78822e5b30f2a6619f90658476c0d2321d578b93743938e27adda1c4a8e7e3a03232ca797f53dc99b2dd2f368115d14682ec3902ab5d384ab366723c436883b3a3316cf77e8fa5f3e7bb6e298486f8f82a668de8e69642c371c0382ff61c2aca0ef50fe19a430d91ae035be9ce50acf11343d2e8c6427c2f7ca73ebe6b3e5d42baf765f0c3b8a83ac40b1686e1b4dc2ce4ae59d661e68db6fb07fc331c2de98037c717bbb9d5c91f46a45514bc1ee3c302fa07011613a154e652984421e91586349c8c0a2b423160153df715dec4bc80280798b6d87490619314067d8d3059997370b9de848363d67fd5e0ebee0a1ef14df87696e200499245c6a1129d1baa8ad496a1c0e7eeeb45858ac5b816071405c26a8282f3633dfaf362c7ab866951cd560a7bdc60c93ed81e9ceac2a0df55ad851f188c798533baa3265dbf52a5c92b90b0047af258ac0accd1c10399dfedfcba72bb972c766ed3b744fa368a5535b3e09f894e6da6556c6b2947827a6eeff743bb5e64be1013c62000e0950a8559ee5e0fd0b264a25bbe5556be654fd12e25781fdfb87d9630b85c4e9bc828761358da3c07816ece6f9b207ab8d039d0e964fd23766235d869e2b3e08edbf0f60c9270517f36ff65d30d8406d964aaa152ce1ca6dc517659db5ea4faa8b7ac7e3788831bfbbab57313d358bdf271b284629b893412a3fe1f8a6ab60a930cc38b4cf12a7d09f0674f4c9fce30c155403ad0b0b99490b810a9969517fec7c6952f3b00fdbb81ed1c4c0df6d1534aaa54e20d3b3d22d389f56d94245cccf85154389730aee9f31950111dba9abeaf17dd201439064f40518a7a0513e3ecbc67075f1562092b4b452f2647f5434d6acfe7794fb51a751b89072001e4a666138c059a7c76ba0491bbc705e672a1ddcd5c6a391068784d94d55aae403e00a8a732331c6cdb85a62c664c2ae2b5aa8176380a436e95cf2dcd1934c8c08e40e47b8cd7173855b2b9410ae19014b4ddc8e57867688fb5829ca313fe99ed311fa3eac798b46711b78c4afd1f681464bc04b20a87ec35aa147442261a2502b6d518780c1bd043221679fb896691b490ac0607d347030ac1b1f103eca38c6d758971cea912bd9f47ff311ed0470a291b31802460d939c51434e001430dc12456cf43f77fac9310b83ced488ec46ebb2b08997be76382b82a8194c29a7b84b7c8fa4ada91fa0c3812c2912951501e3cc38290cb5431881b951516c25d3c9cf3e740ac253a12663473c4e42e6e77ea4edb77a71e9978768b44667bd68d27440ca020f2fe4ac04cbe307bda9ff2a59b52db99da38e0e9766a7bb6dac5db4c4d238e32c9d16980a31488f0e9ce9d654aa410f97fc4e03c47af56a1364200b6e0e7d1ca4346deb47f391c28fe38eb335084349bfece453db4d37be813147bddde0c4e6eb939e3ccb33f42e5ee106c1d18662bffde96b8d4cfbc2a07a0e2837b7e35ebc0859740715660c9e210179828310b4cc5891502b75a1b890b6571de83bdbe988525b5bf8e2bea14b0b08841ef9d2517633f6a9190c5d6ac80308faed2dca6b81994efcfa9bf0ab21c58b1dc89a1d02436ceb8c66287fef5991ab1db37ec0de445725f1099851f17ebaefc08efaa144f27dffcc56c56b27d28467df7a30108371d97a8f9970ca5686515de83559d1eb6be9e745339aa4f334b0801149004458e67ec1edb88e002a169e14545c208c4d759c7f9aa974a44cf151f384a80e01420639949545cf6cd412f5031ef84bb7beb7ec27af457081aae5f17290cd080895025b5277fa1f09f07caecfbdbf02682c21eeac6bed6a6d48661e5f1c85c50a0a795fac11a178aae1106e6c301000a384d5a55c4996006c222a2b45c87182c1d96abeb9fe8205a6d6dec827949ca93cd85842b66e60b482976ebb63f4493408e4af1bbdc85d0e96da092a38bd92bab603ed90f207f42700f951762f40fef7c442c3195d6fb1d0b50c9334e61280dd21f4082dff8ca15b666f5adc3ed7125f86afb6ea50f9948d46e5f3ef3efa940afba7d0b946984e238934dc0ec720e9a3538688aca05180cf565b4c80cb4f57c2818582704097111fbaeca6d461998857e7b25c317fed5891b61c5ae1fd8609e7115325c961f4f21e224e76b49ef0b89a51c00d2925ded5ed8b722f935ff0fb51adc1714f16f441590e7f937c47fa751a948254e8c44bbdbcf277c9e95e3d26d25907718b0e5c7698c6f4c23e0e149fa7a195271ec86b4542148f53ef67dab8214d773842454bd15a600b582b28dc27c2fea8876a09f3dc098000c2df90c75d8d2c56a8a40e8d28fed4982bdb21b458e957acf1fd59b9854f7c964c11b71e0ef8ae456a7b38a25571cfb40aebd320d7ab5e88e00dc95a3db046ae9460c72bb8e5fa99f76afd4f13e898037c7e286ef1ab3c77d50a52d2658335e33f216750badef7058e656dd51fedaad0b4a5034f4354947d685b9d488aa7ab6dfd4b4dd4d885d7565bc0d1e38a556a8bc4f188ae620376a2d7716bdf41205cdf889603ef8a4dd83dcbaa81b778546479ff6eedd702b6950c428710f7fe3ce5b2420506388a40aab633f0846e407ea43a4a38c6e3022e8e9c7419983839c168dc99a9d6920f751724ef3263b91d92a63277f9c5bbc053b10877ca1d0f5aa3fcb6952101d429122f12bb44b51d1e33849a0f727704882a2110037121d441ffca71373703c693ec15d192198f0fac4cb178944ca79cfd5dc8e4221cbe75e6d60a40c4bca9f292cfd995a915c7dcb5e57fc10ca726f8b5e4f87e545373f33b0149d1dccdd1f992ddbb87f0f5d59edcb7af31679cadc80d3ff2872e716a158686bcac8048e2d197a91965ec880d5252e99efcb4d3fcd139c6c9e2015fd17ef7d4717007cdcddf7a88955fc10e36448b23f5f89bbc40c31de8944493ae52380feb73645a96ed2506a8ac123daa1834a68484cc2f32a9ed6dd64e0f996b17611dd14703b9adf3bae4642f16103c5ac0b790a0171e084650ec586a630710d1d83b44b062dde63b731b22af03dd4134047152aa6d3fc231dacac74e6d9ae374517a1d780bc3f8fd68594c41af0d39d62e09c8623f53e56c836b85ab1ea6ba6cc13f2e29c882509198f35627b8dc9866dcde5fc148171f1e26ab8c3ad5a3874cb59033a2cb108333ef1d5ea115c784c26b0980c66e7b966514c543519f8704c6030b46602fc4f0ad1aae0018d95e6cf2db8abe1b7a00c56b022c50243100ea7ac6473c6670d33812f6d94605b74af26eb7dba8c205d9c1d95690d3012686c424ab53bcdd5034bc74eaa9061e530bb7a2e8a2d67fa9dc76f47c796bef45235d49f11709de2590cde5450f60aeb2a7b456c40db76f3c09ff09d50e08eaa8b9f0ab4ad150e168f849e088e6f3bb44240941ad187c3a2836d512cc4a528b235efbb2fcd9da3467b53a805b8b44a8515e6ffc02cea3eeee494ba231f1460db6a14d7940aebc9babd639ea98032fa36e3acdb17a7e7413fce0ae72a16dc9dfaabdd3b02fcd32c248c9fc7dd059310026cb837cd3c5cfe004428ac64c1ac2160e4aa6d10fe6e717bfa644d84022ca4e026b097f4d0d7314ae383a64b09dbbd3d4c267c05e131304a4603a107aeb44f011ac3f49c02423748f0ab7741f2dc1dfb079adc470e0ae5329301af783fb82083ee1b5aa551452095c134710e00dfbc901e0df5df4284099a8dae5f6b0ef7063cfea66c1efcce0c7f50dcdda36db3fbd413c4660fd1651802dd3997b6aec6d0437c2d9e09fde29ce2ec0b934865009f646ac56d6abdb102090169aa82d8500e334e307a965c4bcf3ee2836b36cbefe0bd73894a93d74b976918475e41dc4911fb031bace1075bc493fe79155e730432a8b9e9521afbcae85c2f636b7c71c0c96a9be33ffdaea87902a6f0f550b7be455df53e3e00a291c000c024ba10a2ce708b92e0c57638798e01161766999409e62211d6b0276bc5b63c96ca400dca3340d8c738f00c7bd0d40774eb3e08636436bff89ec2009ddb4134fe069b29199de21b02d26dffe3865c9c6d4fc1415d095f3a3a77c5c095d9d53ecf5e6f34a71d98022ee670b411a4fcc08ed8baa080db367fe16ce1ef888e835588754e5d6872cd77cdd2264bf796f2e7e1e63d60ef84ab46a00ee6a0062d40b79794c6571231e2da34c5a8f7fa22d2faeddb4b299f39c1d50370dfaebdc0fbade8fb68edfc2bdffc2cb8279a2f7bfe04934266fcf79ef947994ba3d3a4d0bc2a158a1221c966c47e1c16c837a7c2408abe29a5e64de4c4da8d1b20eb82eabc7733064793637a4d50f6b4366cf2cccc7f342c3a4a81e86f29b61db25f25f64145cf44d18fd0d78b9111beea3e76c69fd5902ca9502a5e24861a99017f7e750a8af09a4ed29f102811ce7e70e638819de114e8e7ec5f19431a9fff7e51ae424bb4743db7ab355783e1902d23a6603180e6bf134403fe8214a9712181429820e55bc5cd3b100854fce6fe01402d62f707b318f1b4b8b0f7fbc1d6fb4f2bc254bb0436bcc17e475350bcea4785533b6d9da28bf1b58e47d183a1e13f1eae0cf94bb3bb93bcedfdb41c87f0c0d2074448c732e96e9e9136f4644da8328f4d1b20a5b6833f18a1c56dbd65ee2cffed7d4b00e1c8ce26b5d72657501f6a891baf119b1bda0661030080788e7923a81f6b3ae14849178f3251c0c5e2fa32e338e17274d547136877750cc8d2790d8908c7068818b0a755afa7569908f9d32834e111f30cd7388f14f694f526e57873646ea125726a09cb55212fd37b07f42840ef1b416526b766e43bf86b910bb0df338ac2f494cb5ade53c96876cc2b983961eb8cfcb496d75b0144244ceb59263404fa1c323a39e9d49050accf00fc0aac0fc27c0a613e60f4cfe07f71613d487367e5b71af79b2d92ad18ad742902878f93285068b59a75a3708ac163566d1824fbebbd2080ba096615f16024274b2aa23fd405b380492df64585cd1e7e3a9433844d825f80d1eb16a09fd1fe0962afa42a128e476c45461ea1901e784d1469e955012c7aa4954af27090b1d5b7eaf782beb73e6e90bfacaedf430c87866f7b98b9ae86eec7ba0de7068f6019488276680ec4d15d91a6c11c48c360ffa07220d6ca28304cd5c4755f66fab71f6806b05a98d23f56c8c4862723ba7fe175c0a2bec9283411b505d19e5fd894ef72c9976c8a4db8fdbaf70c68974b3b24477c3d7a5bca8ff7d249841e96a420bb1a9feb52b1acdf1041a818039ba5ff2301258b14e6058150d9cfdae31d655b111393bc9ae9d1ad2a041101b474b68bc84026e7c782075df1a5f7d6b06f304769282e76d9575cf4e5bfc551ec5315cca1aca1e318c6ebd94950b335c0a408080153034ee2d019332c34d66fb4e011004cc338b7fc82723425042fb82785d3904d79c30963392d9579c1fefbf451413a557e0902159c7fee2b278293c2556e6ec4ca58fcba59255d3541386bd39dc1f64dde6a69e17455191384db188201843f290c21a03f72dd995ee220a59fc180c1959d8ed62ac4dc4d629e587170dd1afb21eb8d051707baa85448013091cdbcc13b5d09f7a5c4d21375b7031a2c8fce9cdfb88e840daf4fec321d0431da2ec444d6c636e15ab152033c867c23838a98442ef99cab90ae1e6287b7c1a1cd27e516ab3a81e1b10b8fe41374f4bf34a446aed089921ed245d15aa502cc86e9ccd09b9964f815e2e5ccca4e9246f2962a25dc7625ef841d846cf1d6e74dc2c11a6a2c7a5636caab41676caae31d076126f9572627e8e7b855df6f793618a9b3883121a87b42112567268d3c9942b32c25a96ce5910c899284d75c2e8684fb14771dec52f87e7b33ad48fe1f27bda72616b8239623c0640a3b270f8a1493d1b0b193fa0fa0614d868c878f53f9a10c57d9aa5c125f60119649da0fbcb1453c3a1f18d494f4f01a0a8b163140befdb3e5cecc2d1903bde1f9159234d7102ebec07d6be28dea3c463042ff566a1ff16305a631829eecc16ca4f970f350d36f2824af7cb8f2a8e3deb3668719280917a369f4247bd470e1f11f90834a425e27426a282296dec151971cc4a6dd7127ae6e4c25882fac02209ab368357c9a548682a46f900b47c6be8b65e54916095d3ee699a9826713724c853d4ba833118cea59dceb2f98b454fbd5c678560ebff8241fabc9ef58d66972b1959f1db61bab6670bd6da724e250b376a8e7ce5813d04e48e4f475df6f47309e357bc3df256e1a2a70029a410223cf85d137df3bf227e426c145c3361fb8a4616f056c64aa9eb74ae91bfaf1766dc000bd94672798a00ce741abed3144175bd2b820afde4ae29aba0b8e89be0db9f02289f305c266ad8dacb389fee6c6998afc395d1313df391efe416e6edd53f1fd9b03380c94cce1cedc3516c14faea3fb2eed8508bfc066661314e59411c1f5574a97f486e0e140d8d842e94c16a738f8d8d95775d7b348e4db70c171fc7ee3f181d624a17c1d35e6aeb8c7bb979acaf1338a824dd5d65ed48da65adaa39f78592ab2afbbda75d9cce718709677c8e7e0904ec62e32c7b6301a93aa250fc5914b8e4531891ab7dd819642b22ec99221d087dc65b0c3a24982322420fb79d5567898c6295b51dfebf327cda4d0dd1e1abacfae9ced1eb50e5fc43744621ba095deb3ea95d2008f414fd41f8e0ff340e3ce8f559cbf7ab48fda143d084211dc89d939b33a0bd3d2fd3473a1b1e59cfded82be673de35e00e1fb640adcf5cff0fa4c0ca78b8f53602a61400174cd04630a67c4993e5a1e76f3dee5c7a7e3e6cd2a7c1af62a0931928a2feda0d8541d6df79b3c755fdb96c5303a55170a4d8d189df7677b6a17bfc2c47017ecb5e0161edc6986a2c4414bb950c0e234da864d898cbaa7bd0c16c4b7c63ebc21fc3ad3a7966af7a3fd29845b575a67a5c1df45c1ef26068c812a7a552307bbddcc74ddebc9318f959aadb3582ce82762565b566c4bda0f937c6d728f9032c3da7007d44eae1d54493ee8e43149e0b4babc81cf65c8f92d92a0134e7bbbd98d617a917a1995eb2816db8d56b020cc37a1a999e9928d993d47ea357a10280752b3f2d419ee7a2153647916f1623009268187bcb95a9946da8cca2e17e34a6e80d72873570e790b03c3c192cb50393d4f4476e6fb639d5bc76af0e958758c1e16f086570e7a6ebfb0726a3b7d7ab16dd29838dac9151279d89b7ac5f21446f0102d6fda695c2ae8481976fee77066d4000bf2c0bda2f18f7dffa26e096d8cd98bd75736cfe9c1531e0b0f0bf817d3422daa67862b2f6e4c0577425535a65daddddfd6ab4f6f03e0517fd50fb33b7220fe081ea842c45ead382a2081bb67ab53699e45e3ea76425d4d50bb25e04245732959f30f772ebfd688751c5c518c3bd4f2c6d57726cea07f1f6e2f2d0ae57ee1aa0241c222c64961b5a7619aaed463cf5a2873de9b4afe0ed71967cb21bbbcab85ce995f972e8c69f760634edd19f5d6db307351cd0a8afd6ad2fab5b38384e82e401ed5a143600ebce4db724b538e9d567de5d63fe4a730715260581ee0503c0770897c976f7b6d6ef544587a574f3404ff8e1b8381fa52d958e782ff260aac0362a14079e06f8f5c09828d2e545e35093b31df05a60eaf2c743bd6549ef2867207ab648afb3646dde3ad9c323efb1b4ec8d221d8c4b57d0e39ad2c52f5037292ac4692655f7eaa4ce52f242d99152e54ba88e2a9e4efb3af2bc2bc885a580b65c7608b814dc68918aa1d12efd4b18a85ad42430e5d4df300f5ead20c647674ec7c42382378d6b754c70f1e53f04e03b6ebd8b668215463dce4b780e7347ce1dc860fc36b24defe94316c0379aeceedd4895fa06252fb9286e14901b642d2cffa35b0539bcd8113fa8b59878c4953db36bf5a8b22900a58ea4dd87fd28e4257214436a11881797493ac5ba5d6acba6b4c602da827d76f6b83396f128481b7d1ff489b796b72432d94c858f82f1c2527ad305a96b6c52d405b4a06d727413bc214c8afbfe6889b55be5aaddba562cf4f8dda95dc342d863041e0bc0905171221c613ae6d5db1a24e7b09fc64a190bed5cab02857590841c4acf7ff85759336ef166676778a1db6c13eff4df632da8b221af39c31da96c221b477a637b1bb4e8256e350502594376c046a922966f81fff07326ff4238c41952edc6b9d9eba55eaff6a64a829073cee3df1b19b00ae0054e840cbad0d9233234242829542296c360f83e7f265da7ad9769a1a6e9314b8cdab8d120cf1a54a9468b4fce2bb87f825e127e8db0ed04cf0e05715ba3aa92314257c36fc75305a51ff04af30eb061123901b8de7f65cea1de2314298bb72dc88fce80dd7e1df230cce17aec18b611141c569c5446d95f858f4ca343e6d911880b9edcc31c9b0a5b02f84d6880013cec671d34adcfaa109985fcc608a10ef98f648511de68a3351f0af91f5f61048df4509db72f8d9ddefacda365942edaae2cf0d0604fcfc79609324ab1b44b56153923d7d3cb8bee012fc3a71e64f3492e021c36d32580e57d71c2142dcf4f4de7469488b23863864eb7717e571c2e8947c335401b26cc59149c8298d8044b5001e6ec0b5586a1bc629c3edc50bbea87f6ee06b6665789abb130b4590bd099d8ecc71c5ebb19c3a30e8c745b801084e561cad9e0a958bbba5f61af8dd6ce126c422f5639d825fae06f724ea22a3c4f02b983b6902b9aa4a799e232c322421556a130ec29b852c1d7259e1c9a584b0798c03bdbd64d00afcad065f1c398840b94e1adb23759ccc45a56a652902cd23eef567a0f3b9562efcdd24d5ee9633c5b0731b20a90bc04fee9d76dac786806c431fa9ab54f5fde6ef56a0f07f4b8801e155b59bba9c87b4af4d5703f75cba5a045accff6ac9f8f26f103546c6449a4fd505f537c610781cd1f568b6d02cbb0894b352f148d6faf9866763c3f39f0eb90bb7f3defbf4b4d2c976d109c85ed3617f65d74da8d653841deebd05cf18dc98ccedf2eb3e12cb8695e348e0429767b1d1ef293c97b337492d231f60b36124d113fbdf849cbbc53f68689079ec8a94f4ccb58c835d93f4f185a343ae8c9aeea6ddce1c1cc3cdfd9b60c8bb5a9dade58525d551259fdc09ed48dae46f711b922010df8c5c9ce45f037b50608e3cf0115334baabf7bbfe51ea274b7ce0d2a175df096ddbe26b63c73e81f0b6d24b70931038b71e78899c4a35f9bea9aa87f39b7572628a52c01aaee1fc6b59121ca4331f7bc3d3ffb68ad98ce3cefffc64539ba6d857d3ac046bb8bea5ba15661ba542f14563934faa642c44c9540c32a6c04d35504acf20a898902d59430ebb64c2b00d78f313234d48f0fea36e11704fd314201172ea76e5340224f29c684b71c3db731d2fbc87d36c14bc57c6eee4bc3bd962046389f2c276e22c2120935ba0c5d6199e94ae6bcc069c43e4ee902262f4dfce6c7b6ff622e3af847d7e27ac8369a5a42bcf705e9c0d4aa52a13c6b54cdb5f99de55d5815eac050460dde085ef60c734c76eaed9646160ff1da8e3d9d566bf05c045e7492d56cf32affec42c874e64bcfcdd4aa5108a84d1863ba856259c356bd0358e63ab125c4f0a937996d24def3f7a8bd225b86956dfff477f317dc2b9595eb8e8f34f535c3b8a0cd609b15aed5a19cc5ed1213cd522adcd4a00dffe5f04cadefed0c0252efceef8436469ef3c8d916ccac4ffdeb653f8d3c80d90f6db6e58eccebd4d5e69fb4ac78c3e9cd62d89fdca185069279e7dad94fd1de6cb56bfc30cb2b565cbb72e304845aa92c2704b1b5f50a4486cdd1219ec5f97a91c6ec43f16b6512fb16b9ea54e9628952e6a43996fed06eaf1ea5db46dca12dd31ed22da1fc35e95fe49376964ec2e2dab793f3d68f52bdd22e2aec295ff19398002787ee90934a2b494b3e77d3dc4d41279a390cb80fcd17ec16d027253fb9dd5ce701b36b3b00f16efe46b99742d6898df150d36b31de948321d8c1fb46482e0f66473406d5da3f1ca845dbda34e67673b2975db2eb4405af6d5ea342b2f054aaeb26ba06bcb385384a47711fe6610be8eb82111e50790a848a2775677c99aebe0bc284805070aa46f9a7d02d35f3ba2f47ffb0d09ba4b73c245c20bf89e77aa76cd99a653229a7a8ffade8c311e915bfb7220a6e20d751c171f08aefefa2905305fabc73efd42f486ed76cf54aea73e83edce58a9b44c4a4b714ab1430745e4976daefccf260e3269c3686aaadfeabf888ee3b6bc1acdde77b6e3d58a265f7ef1f261b53da8131baac4976549aa2a38202d25a884726362a29d721d4e08dad5b6b86bd72d12b46a2770cc416d73ab5e837e3cf2deba044a26888c3feb72af6d8dc32932bef17a67cd5044a349e604c453b6753d559a38c9b62878b94e28e68bbf27c29e53442dbcfed9fe5a01eb95e3d8e1c8a8c370fafae9e1ea520e11ad306bb49add65bd145484a2e6a6ca741e5bcfeaf9a91690dcb6c18553631deb0cf9fbc6a50f1c520d149a58a4b8b0f9f7babe6f190bbb70ef0e354b7b07b3f20a82d6efc0301fb9d863db6bf1c88b3d0abae8b92674f60f2bd61e86eb2af134d53215ff69f14d6a97a461d0cd85f597d7e3a598dc2c6450c9819228f516900f3660a69b703822166b0489937f0c3d169522027d838b7d564c1e0aad2cf3aa97e0095ffbcfbdf64c70c7e91d0c6362c5225c6083a996ab6774117edf6aea75aea7c1a29efdd88c9e3df6d5d57d25c3da01b9348e53240182f7f5da83ffb0b55dacc4667dfe3f6db350f254ac55401003d289eb1425a30919321d06ca756129927551ca38e8078e0cc095e10e740e535b7e9b5e4b24448e9f40707b85cbbe895ba62a29f7d38a075132fd5a4eb00cfd9f6cf1a9b5b096d9ce92e9abe99e28b0a23ac60bd9dba20f96059d417bdad9b2bd2096f5218b404ad4b88276a000be3a87a3f932db6cf02c6537aa4dfa88e7ada2e9a73445ec6e06289250c5cc7a928d54fb4a267069e83bfff7d83c10093760b2c12be14e9cafd960055f16c8e3ded4a14be15c32c895a3d17912388b890100568fecb947b1409f27e3236075438a0247ffa5f94235e9d5f0f7e227054afe05beb77f28c4bd54a2a4ce17b5b96cc5f2bc92715984bab23e4da16ee646f34b2b1ef2a5c84d695368ff080076b989ecc602a4e14416bd41157ee125225e41e0fbbbc4d8c88b1b490b855fba06dc2077bb44beea37fa3962c69473da0a26e4bdaf0e9992c95365c34ebe9ff860c601f8e2f451e3b14a6985ee17a9f7e73c1fd8f4c46526770bddd0668d5aad8fe12818e10801662026842e0ae4acb426d453bedc953ed9086892165d6545628929a968d96a506887c9698c953eab3879b7534347a632e15a3418a32aac7a619ebc09f78cc913d043ea0f447a880b65bbdae46931c5df7867730fe76c0a46c27b9407ea3dc35bd63cd1707fd0db4cc91409923d5387b98e60b2fc5accf0062c9448e62581b8ab377592d127366e6bf6ff894cf41b014ffaef2af16f349118b7008120ff2633948c545e1ff94a8c5e7a6bb26f6410b2bbdfadd86d707e46e1aac256f88c289ef83037b5dad7b2f50614073ffedd774800147652676e2c1016377cf73ae0ca11f8ec5c3f70df0d301b155432762fa48e7b318abb42f03d7853beefe26172d0cafd650a79d12e427f5832eacb00dc15b651e6e4ab4fbdbfaeefc28e43eca0397224ac4fd22232ba46d7934ddadb18a5f575c2b62636ac390c8126d8243976e362470bb154f8836d8f0f966a087bb89fe87865cd491743ce0ab3e74d4f27f588961fc6a7c7ed762c8cbc06ae6af33fb5c8fb8201c64a3bd82cd8d500771baa35d4aa3c8fa58d262ab283773be243e126d57df275e76136593501e7e060fb4256486f436573e1c855cb50e2e8ce542102275781007b7e139428c48005bfe030de4b181a8ffc207716ac4a8e9c877f37a68026ebb57662470c9942c03d3147e041be78e9511ae51e923ac05ecf7f7a0a06bee3a7e3f934cb50f69e50d5da1017945828e7f1b0305baedbea925a7f2b94389d367adfb9d660af9a14f4bde39d35444efffba9c6a3060096994051c4a98bceed94f05c3bc23757c30414072ca93c5c85efec042b4d0395a9b54e9c691b568980bdac82dae2908e6d25a30fe8936229ef21ca5edeca163a6779d83923d2dcb4aa585c52b2063d64a469261ed12a632eceeb8d987a94c9315523634bd821dfecfba4c05c35d44009767c4f444d50254807f6fd2a30e0bff7968be59f0a2ad94872d0520f8b9e6201cadfeda5f2c0165e75b93f7e4d1335af4febb92d97f22273336981845df25d04e8c51bdf033899aa5cf47295c7dec2ee2b82fa35f3dcc9c8e3fad8e8c2fcf5996766fc7b412d76eb9489968c2e1a8cbd0484861393a771ab7cfa73f85f17aa697e1ebe82c5568181d384c93862d0fad4166fdeab4ea8a70224098238e18ba1682da0b989923e1182c511dfadd8ec8c974501b07960ebc18461a2c3d7d02bba702e8e79151b5b1b36f0861d55bafbd5112aa2ce0f35be4bb8d3267a077803009dac41905dae489ca8f5a34cc9e16a34cb4223a75093d52e8187727f859634c12622168aee678c0c0778458b6c44c55263b74713b058dc45726fc5f5cb6536ac0d65abb1ed42c2825ca227a3b10c540d1d91ba5a3de25e3182238e64cc0881e97c267299035a283c34bd59d0ee2529cda7710a9ca136795c6be6a032ad61cbd7c5189149e202a41ee841576cd1187705160bbfab55136714c5ae4641a1baebd38974243da0f30d9487d4d6fcf2411a2044a585753b0f4d0c01359979200eca4c5c6dbb64e0baa0564170ee5959ba6dfd83bb2bda45b8b33c143c78108e5600cd866fe5d3045de239e5cda56a8b20debad5390bba5afe21dccab9f70cc87940d0862cabfc5bc6d52fa397af112d5f151b9c92b36e9ae197f3c518acb3e7bb3b3cb16146317d700a4f8937a9d7ba83181915681a8cf5840f91202d93eb5e961e37b16980de8c0135baf6cb141b50a3640fe41e0ec19eed0cbb618fac86f8d03adcb96aacb1a35e84aef151b9be6c21a15ee463fbb491d3cfe3a4967182284ee96850a150eab1086c5818ed01c6f3c90adec55d78cba5d3c3a9e2c9ed0f4a11f149c15885f14c815bcc13f7d4c7d6c04c8e2e8cf45fda1f8225b20b14c2dacc7f01ec0ff9f7b7d6c53c6befe75773fceb4d4dbc875b862cc534a88595651b98e78db042c6166b0c082f2c0571e4a477cb8ca0d90832b7ab2c26e77bda2cb321c3ab7195f1a9d450a23eb9be856a1cd4d7d76c7691d0fec33340a30c17d6c4fa58f30815bae406fa78256adfc5545468abc884efd0efc3e8bd1d287ede4e8042ff8cff42a7a4340be0ea4d518f186ccb0ad3bf14c55e5c9aef0a53065c3a7c68c0238c1a227f484f2cb0316e591c428e22f143173b5aa7cf3d7316f5fdb108db468192efc47f2f61435fbc27cdc435cf7eefc86ffcacb62c9dd4056de00850d8877577cb3d3a5d8ea024e40c28e7f272769b33047bce351c4d9ee71cdcd0e59d33924aa3e89c71b608e76bc3b00b5f8f7130ad11a65748b828825cdb5d9f18a90522681888ffd340fc9f03f17f0ff4f1af80e05694ebe2c3b14814ec48a42749d4ad24de9349a4c9490c2118eb9823ddf7d2eb8dc4a6a1ef0eba909b8b2ab2a2b2f0a7a38905a42b30900417330ab7e9a8de4e88dc1877ffad341988907a8cbc09ecd3fbdc8ade79216e2dbd1a14c8509f4e8d04e6f30ca389618dacd6920595682f61e00280505af5dbb5704cfb469c3b39a7f78cc79634e2e15289fe2602d37d5623147e0f887af07ca5e452e55c3da7695e38574b9bb748732edbdc756a2f38bfc2a7793c58886f79632c689b3c5a16383f1e8316fca796b910e14e631a24f4d38c5f50763b0eacb088eb0771db745a0a5fcc6a41b13127665a9b9b2bf9172bc9301cd59e3457ba7486f039ca478b085433239f266c9a27dadfc2912dcf7cda0b589678ca6db989e832389429819817261f346e267ffc06706847efd290bde62728151c495b62922822271b39120a4770cb6c89a494928a22c43e811c46d4542c77324a220da0e7f52b79e0e3b1c8a0b80bc88b090356e01748eb21d84a7e24803844e2391055443514cae9d7e25221f8b12614ef2bb9554e27e35b10cb5aa154be3345f0b1b17bb02c1e7dd31a6c267045b5895a1d3f6a81d9b4772c1f670e9a7679ab915ded512525e7318f794e5dfe78b8d7f2c48fe805f5b75148d447e6bd4551e9775f4fc8848debd856b7f8b812531e3fe16fc0730b14d4410cbb9f16ddbb9c7de21afc16b895852c07de1429dc62b1e0e2a1782e6a08cb6ad590312003d2de19aa4046f4859b2afc79fa34c6f147d7cbd3a1f385f3fba99b866eda0c8624025527e8a371c41c85114a5f5bed61201193263f6770b21c5c1d5fc2e08ee3f06a5035223269c53ab6319fcdc3ad2a59726a70dbd8b011ccf39deee7ace7bfd2fd197b0d862c4611aeb684b2ce98301db582b44affbc50fe40127e9f4925d3a318ee6c819cfb0802053bbe81c47195bbc4870de81a4a632b334a6220273c28b6e8d51d626d7617f6830fdcb1c75980bd8f0c5e5c310f7ef76657b336bdc8fa4437c3258b8794ed1848fbc3a8814f6b273f3838c7dca3aec7a62f415bd9a45a6af9bfb083912a35791a32f155f15ba1b07badf804b5c042413ad3da04155e7d8b3ad3db432bf06c6996d5fbd0aa843db6fb4c6fd34c6a026de92b5764d92c5aafe9f93e1febdf7c247c4a1ecb2c34148ead53569d55c332e93b5aeef02a5500570a0e7e14c5fac0d0365d7c3f8b414099e17d4d94869de3576c6e0e1820218dd27368c2edda1413e776820f28f1dda91a53f656deb3308f6d5f37555790efa587df19b26e8a6be29785d126b9a5ac06ca1498bf188cc6582a60fa150ae7ccac7fe4c6a113b5f56cfc88c7f11f63e1b5a0ef5f0c952c404a0dcca56f77f6080244e3ce067d1412082ac1ebef61ccc9139a0bf064eb9c0fc12fb56dfd42bd06a89237075097086df303b1def7f67b1cbd6da182c956e5097b2228b1c2a42ef1ff0834a7c0106d02f021c1ccda9841156fbd9769b1cb9500baac77efc0da2a211ee3c58b4838d6d6d2d72ce930743e3a6aa4094ebd1233fcfa9c186149b1beaa63c86e331dffdd19e633423d7a8fd32f6313c5c02acf3d663eb38a2b6879b4304e7494b6011deb369a9978dcc224d9cafd6f28ae639c61dd89db562f9d0049d0e69c08c7bce70e670a05ec9e9d04f9140df76573116c95178b4f75a5353270f768ac306f48c500a2f703227578e38108184b153de00d5237768f91c117ad96453cf45c29ac2249ae5b05ad156222d5ac6ff6cc799cbb3d2083fc54232d556b467b9799063460d69429007e4ae4241a47e10c8dd25394e3185ed67db2091d643d6b750206bb8cf3fe9104c874ad963efeb2d21f67dc26c2080b906d2150e3698e52a699907f648c1f7408ccd301ba51c14759404a69261d4481c318e1f06ee85cfb0014560a0c71502492f1ea9cb9b3883f63f3cdabd54a7c58bcb72b1cc00b3b06ec3be67d33ac5b2a3ad6a5ee27845b158e222eaad93c5948f85e28289b1db112912de5de726f29a5943200043704c404ff345aadd7c7984410102d1bc5c12794e2611872649664f5fb3fb5fb0cb80b8e6493823d29a064a7d48947f4f173af37883988a81a71513afe2114f9b9177a0b063d2792f949ee65dd7d0e647e4ec9998ebf53b2a5ebcf419f45fe44d5881be904398f24d39e55a399c4d4819ea81add0c06fd862cf41c44927b2bf4fa85c6a1a01f42b1017c30bffd0e0ff441621253efc045a59ff165a29248a2d2e8c85d91fb3d29e880768ee69c73eef2063d77d9033de7eef3386708fb49f7b9d71ef96d0a26717ffffedd263218016512aa5d9ffbd9d35b7ff7de1677625d0b34ad57ea57fe3f9f3b6b3f1bce91ec1effcff39fe00fbf3ff7fedcbcadf7348bf53b4ceb0fb56896389109e17bbf1f65a2ec8acb7effeccaae0ccb464cf47302fa5bcc1de715338aedd36a65d4bec939e79cbb9cf37b469f7eef3bd19b799ee7719e48d630376616b30fc69d16b9ff4410cc3a164130eb4a75c445da9556ef705a230c3db1f08604ab777ddeacc6dcacae589d99564a7aae5fbab502d2ed13d51115c9d27aab38bbe5df132743272a5a5d20cd32099d3e6f499cfa02fabc2101d3e918eff6bb7c2d0ee3f76b70727ea9c8002d413be6eaf7c1e8597f3eeb0510f52725f034570b3bc93be65d96dd9f1f6b2d4deb2d765cf770073f74cb3d884eff04b3e6decbdeed599cb777f6f7166bf7c42d5218d9d35f0c4e12756bff93c1c9ddc5cefb09660f83d9f3d8c2f6fab6ab59ba3b3f50ebdf6c5ff696cb95c609551a37f24af3681657849dab948a97572ddabe06e1e1e13c77dc4f6bab4c7f3501be96e99f9f0f0404040404c439df9c733ee64a03fa2db2b000485c31eb402fd39c03bd8cca64b2c9c2823faaf47152ee94266a7112f1a7a2d08f387f24f96f202e92223a7f5df7be611b7c0b9a001f68ffcf1fd5ce5bd42edb7f64f5164948f5fa1f149f4f521d188c94f3307c6f0f51af4bb5a852275eeb407382fad9e058fa49e39f3311f07943a242f79c9e15c4e0a84f5083b1038a4516f7c4c841065f8a8e9f0316544dc76f9fa42ca8a5d24174a6133afe2e69aae9789c73823b92b923e977c0443fdbdfaf3d88f83b8856dcf0d5bb1f4261bffb0fdf99081f8bf385f0cf39c1b5ef3d16499bab5cf4ee7624ac6b0e3411be15393c1665734ef09d7e2ddb1a3cd1fd86cfe28607129534a9ffe783c4a1f067eff097ff1587c2f7f01ffe138750e8fff0fa3f8c43e198c4d4837e088587e7efe1f9f39f608a268a3403c409fb39bf0731e83b90e0e7171295807ef69164ea1b46527ffe230b420c12674af9f9486612a21238325530a91387bcef80b2a07d6c8bb09ebf05d73d0ebc6fc1f5ef8b45005858d0272801262add8e7386c8df811adcef2ac882763bdeb7b25e4911b5265efbbc2189d2e9cfaf126022e99c213069c7fb33697e3faa754edabcf6bf5b443fa3853c8ff6d001039ac32c67211161b84145101731f67993d2a44f09f49c1dd0053ba42a6d4aa9eab47f6138f99d7e6038f9bb568dc0e8cf9eeab4d68893b9e76a64ed4dca903efb156fe540578d6a07a2a0748ea0ebbeab276a67e268154103f1797968437c7478083cb1c801ad95d27a7fb06a109d44bb8ccf4e27d10e72cb01479fb729525d449f372965fa0433e0369f16687d9332a3b7a89d45d73bb87dfe0ca13f8fcb38c516f3b76f472115481e3377a2eadefbec754fa7d1e54e54b476dc3864bf62e98e3b515dfca39eb5823b82de91e3964640e74acbdf1a8e79f74e5498fb0bdc394340c7b34ac34f5469f8bf3afc67347c8faa94bd951b2daf55279d447b1da2e2a6cf1b153108e8f346054827d22c85939c771f569103daf1e351c8bc51b9d3eb8d0a903e414bb91395f7936b1a71eff149c1fcc43b849f76dc8fead72e7a7227aa6adf896a7e8c0f31ae4a2f5469f50b2773aff995a8a8a4c52d8a988ea5d3e7732469add5de5b1437417ddea2d0a1d382e959f5c764d65b142075fe0c99467061c996269b90315eca6445a9a1434e14102ebe17cf2d1b980f185a365200e2c5c5fbbc5d795dc1c1f21da1e3dcaad58ae45caba2015b37705505a5ca5745e60aeb2302250914214386d466b3cfc7bdb35aed4321e7da27e4499ca8277966407941e33b01ecf306a504284f4e703401f2a5709d0071faa69e6875afcfdb9336ddcf90dafff4ace212958aad757dfddea842f6765ca22ffbfd601d399765b9ff8dd5c377e0f01e9ec32f51a910fafa94fe7d15f4ef7dfadea8220cc714e312958a0e4fc7a59a2deabec37b183b8c4b47745caae3d2dba2ee85460d8a7b5ca21aa2c0f779bfb4ff7b6f54f1f3b271894ad9a2ee7f9e3e1df7b8b4812dd2631d97a81ea5ead371a9fe12950afa755c5aa252b19f8e4b1eb045ddef5f7a5e03fa8934bfea93d4c50619169f484147f667894a85fea0718922e9ff7920918b1f50a9d8239db21f4cc9b038376dd148ab6c912ccb1e3f58a2aac044c2cffd44fac60ff04f24925675a4273c9e54f5a114dc5f802261a439eb7e986ced88d4be1eb5afc7ecce6814df4d9cb83e6f4cf4f4796342a78795d604c785d2b3de8c343390ed2f73301ea04be0125affe538ae130abfe65bef51adf75e5b9f5e1616d44a670993bb611d4fcde7e657f21b269501a915c2b054a7583803a0092a725218e32b75af075226ec98efe573c405959b8eed631137ce9de1c6c4cd6d89d70dbb61565a68da11757ba2901c9e87df0a663c52ada0bef5bec7527ad3bec7a10bd407bf02f541a6ee89641649dabdc7dd33f54f9c5ed8d230ef8b1f528efe9c765adc91dcbd02efdf724f0ff73c3173fb73e2e4774ac5ceabc38f320617bcf7f6be0ded982d1d1bc0d5b9e89ee31ee359a9c84d90eb680bab74c7bc655c1ab6c1378393d445f71bd0e1b49f68d1b9dfa0059dc1c907e1b5abcd347c5aa7350f8ee6f00b92f6d3bf43a2efc915661e3ece99f3307aac7410233a7e4cd9a167945a5e9e769797261f6351c4b2c074589b7d65464c183b5b1bcc4d9f70a599583d31b2bd7e3cedd029947b4c97a78da54b93fe3276436c3b8169ad361a8f191d6160d8da696e2b5c6db1da3f8ce8f9a1ab765c29dd7079d269b834ddc6760e3136601f9f3648cce83c61b66d6b8fdd5eb8d2345869279e8d4cf1fca30e8fcd428e5d26cacc1619bac716177a053cfb84ad399dac45817513b6dc74b256ab5b67bab5b656b3236e1db10ca0472b0ea7652706d6da0375b5d080b25a724069f131430b11195f9f372d55390a97f5e66967c9a9a1b3c6687c5ab49c760fad1b9b8be31d5352dca85585af6e5c1edad0da82b5c0689981d27a0146163e323ecfac2a32b2b2a09a6e9698cfdc9c3baec55598602be50f5ce508aea2e40508236731c1530b31c7a283e5d427c8e3da7bedd787e33e6f5948b48f22fb0ceffabc65fdf8fabc6591d0657ddeb29e3af9b5215866b318f7ce6ab519b53004698421bc828cc1991a224605c9840a546b81db1d02c7250dbeecc197cd3a51f54e4cfad916d9a2ef8866df48ce886c17562312730fcab8b3d2ba51891b67aef64bad9b83a0002769b3fab4fa21c84cbe91a5485334bd30465ca4af89533b6794037a760d6e56b26627ad05fb70fad62ed1b386350eb534e08b594de80a812f665a73ccd49245ac7c80cc06c40216ca3b36b1925b52868a0d3d34cf0957ca3d2e9401b0e5d8521e29ab941e6c71ca0db6362575514309005b8df26a5d1193a4061a3a8e946a6c3fa84a3e6567802fa551016a36242502388efbd12dc16264acc80f2a61362c357cbc30c158f0526e296918c1802e25016c5e25079b958966cae92a1d60b395784a05d8b80e60a350a80b70a81ca921f30684654830c9d03a15d86809b38517e88cf905553229876c45ca06d83e9bcd28708d658181cd141c6c6e54e1b2e183564d2c694a27e5d4f3b67966b611a2b73ae58fcd4709011b9d9ac4a92cb2dde051d229585f614a01d8e64c3a251d414cc9a7245282b0bd29b94ddc9300db84214896d20c1a37e502b62d0a9d010ccc56530d2568c391029b12061d60ca382a941d6c67a80c9c8dae40ade6581f6ac2fc426374116100b7cb572a870ccf63ca6142982815a682147182d4d9e85de77483bf95b9664e49a624b2d11f1e081a37aa60f882254a9a282b4ca646352da010a60c6d5cdc944fd34c9f3463a5089b1d252188a15742d8289b69470b96b24af9c1d6c346417833f3d020a4ab9452d26c256cb4c98e72e2a121c80282112871b05ee408418e6d4aab9cc0b695a566665160a36131d028e91a2e655439b3c1b0b51170404912c78431355055ae9ea6bc9429279cc915c315091b25c16b8669dbbc33add029faa4ac494ac078c993450e1822f6c94a93d454906d0cd60b6a64862903d8c475016194b5101c98404dc4bcc2b931b4457516de107552cbe1adfb4de19f1c4e9f572314dcabd6aedaaf6febac62adbd8ef46b5217b4e33440d1817edf8ae49881d895eed79f59651d98818dfae67c732eb9f1db302c00cfdc16d90fbf2f8ec13401f8bc7a003cac94d671c6a903b400f8bcdce5f61a3e723c01f14e3bfcede824da0300a401c0e7958068883b51e90e78edf346854ebdbcd2760d9ce4dce438fa958269a7591b6077bd95abf513e3d656fb1cfd4fcc5a5b2d140de2039f3f396badb5f689685f9ddf0ccfcb7ab0548dbea7851e08a286dc7a9ee729e5b93dcfdacecabe8b96f0becb2daa6c141ac9da3b8c71873b6c3dcf0dad947a626809fa9f77a6abf5bfe7f07fed9e57e7baeecb167d4971de47bfdbfdeb3e05ed4472c5e6aa5ad714b6a87a5de4ed1d16870d35a8524a3d319de7d5795efd0bf2ba68023efa55b9667d20dc7d87ee7fea57c761ac5d5ed737a36b6badf5ba4472772091dca038fbc5ea9e62fa1556158a343f8dd3abd785a71bafabdeaa7e49fa352245fdbab95b31dd0875f0c91ad6efffa4003f4f37f5ebbed7e5757ddfe77975afebbaceebb24369649446991c541c277df7a0af6c5cacc9ea6b747c85ad19024af5290a840e99a18b9f814fa566cc867c9ee7799fa894a7f6bcefa3de1755bf0a4a758a31fe32c623c6d81b95becf8ff148de8a31aeb892208feafd083aae168350b444fd8e0471607b54abf7158ccaa054bf947b95528ed26ab9ade3f7dea8630c1a6b05a148500a94ea1d074f043dfe0912c1289a80cefe86e7307278a191cc1657fa1d84ea2bd14aedf39f0eb68acc3c242fb7158ceaba0ec4eafac318e3ec8d60547df0c876f4f3e0be0e3bc256d9a2fb9cebf02a94850279e8852118c57d4fb6e83afefa95ae08fb475780e048aef046300a146dadf22a54efc2b0f3b22ce8fd06a368090a46815260d406fa41ca8d2c74d010e1029362c1f6a8c2a3df2a5336b83e6f68ee705d4a29a594524ae9fda33abfc6c9a2ebf6e9ee6c3e41ad58bd9cc749a34f276d76db8ab64f0b74810e3837346ebafe40133229dc034fd86e5f7f93567b65f6ed3839313008bf3453eaa57327e94867aed8dea798a4239705cd1609f90bc758aaf8b5a2b9d03ca1c38ff4a13e6f6870a0a941c2a560099cacf51a891741e20161a5d544dccecce9b6cfdb191abaa6f286b780668389a1614b4bb132c3931da5ca8e90ab1e2ae4d070ce406d1b679af6e4e922672f8133829a225d32703973e5eb2a4e122d0211dd666a3319618899a83133309ae8b122b6d7c4a097acc1e1b56378c9c23245ca1c25688c683114b290b0e7b42015a305199a0b9f21357c7be2386903a3050df6854cd68642656f61a2c350dd80ecad1d9a87cdaa0c0d1084322e76d8e133431217b89cd14dc26c1c5ab6952a1a89934fcf912d27853dc3042138f40c5e4f34bc5e38c1e322ac84173490341bc8982db64543b9e9325042401266c836e1843722b44026846d868c935633f6e59983020c7bbeb61519225db40b2cd41065e7b1d25b45b0f8b8a103842e1b5b86ae18fac89e2e3a34c07eb0d945ca68195c6cb2b8980266091c15f49b1f20942065cc8d1a63666c257d76581d6d93e1899b2066aa8041a3a573606d214df69115b49820523c36540983981adf981810a8eeec2f1ac8bcd17cd0dc11b349d8f2b262e4090a55ba498856d2a3cca1260cd48b304d35e4d94d72b0e068186ab696ae0f0f97efce95dde66a7749528388ae330535821730512a80811103f7f4c8e19ed816014cbb69e3c54c0a6174095b3b6ebbcad50856584688fcd021ecb8526eaa2f4f9bca9726d0c5581f3116c0d6b41963463f8589daca722baf5eb08ac1c8eef3636a8726a1d474b89e787035dd19db71c49280e9176d5c3023230c9e2d23b72d75b5039154a814ac192f6ac768480200140583160000181008860402712848c2589bfb1480086faa32623e24208ec23808822008621006601000400006001004011886a13046f43a002d76b00c9f3c245f144519f9fb7ba8e54e4bcab83bcf094d8bb6b25e2fc7f5c23ac17454cec19107521f081e993f948a28128cac923b995ce80e8e3b258e06eb01fc9c0989530d9e2ae354b65f18646c8e354cd25ee13700c2c4bcd14a35b494639332303c480900269b03d794595a5b00a35ebd4b1872301f4e3fe118c6ae74f116e96a2e6156765f072c807226c9b14ac7bb811e905387d8491110671e2061d75c24914f91e99cdd1b6268ad4c23e43d028391a19cf6ac7dd8370e3ebbdf5fcc2ef9e311c4e6bdc94bbbbf84e36ef87164bbb5aba433c6f91093dd8db0d77aca834305c161add1d64c1a10389aed08831b2f4b359ee47ccdbdfafc37c8c611937b42d1b098d973b38ad1bb9d97c7e0e41a84dc42298dbd6e9f57da4f9141506890ab3624e69abdd3412a57922960321426d2138f8866d8a01eaf760ef49501f0e6e8297b526d1f3bb5ccd221636bfaa89910b02ac547b84a4d5c398868cb558a7f7791df0f2ca12f7b14a31a1c89ebb64be67d2e0c082bd22b54133518697bf3241a8bec39cc8cb201d76c7f0f08e19f6b9c31ed28d466608a33caefa28203f071e6e250f7e4f8c5e093cf0a03e3c1e16a429217054f19b391a7532be82de2d9e861dc1bcf1d6a4b2ed98c634318a92f8fb664a3986597c508d1493ce88a53363503473bcb8600209690250ea5bc1f1675e62aa9a625c733593008a00c314f4f6e33f800a78015b34fd6bf78fdd368f49a96ec0a2f6ac9adef88ce7f341f7dc9ef7738e6bf4219c15225bd02145884cde855dfe0b0cb2b69aa95ad3281e87921874ac5fd6ab54b573d8b99a3144896a38fd619c9340a156b4fe8009c5819a0bd3b52d7b6208785a388a3a61bc0c627985fa085babdcd9b7640d205491b6549bf407125e3603f0841318adc424824212a6126428473c08ee24395d0f68170cc5bc9fd142d8e51f6c44cd782417b3a163ce507c0bb38b7a8146212cd9793a94054cb21bc955aafe2141d3a60cb6640265f08040233d910829b2e00ebd4c90a76f1946c675d10a0159e19abcbd4a2a9ae348855619a92eb4322780babfff8be944c6488600dbb1d7f5429caea2b8c2b5fd1327b073adea06f618a28a3d453238a83c7be07289b3203abb8fc10d950a5607cd30b911236046e3491e881d4107ca3a36fa632046a18d89a0d0fe583c42b110c7b70401b07ff93f74e129643418f4dc8260cf35d4e59179088ca038e2845cd28c0600737c4fd385d1a1ce4f887f8ef6bd998d7940cb367882bc4a465635b6f6e5790c88256d647330f26d9f8c050ead24678bb72f0f6961de40aabc798739e98c8f1ec45ef5d037fb1c0fd911e03a6934a926ccccdac68b7f8eb3f784d4ab2b15af8015279566485856432fae7689c45401f3f10511e3b2a0b6269c1398054aa9e14ed0eeb41c3ebe31bf92d87e23ac3f076246569d039212e6749b41bf935d115aa33b87a349e8d7c490bfd0dbdea1254538db48a64e318701bf96e3b323ac803188be3548140e0e32ea4c8af806b1fb46bcf1676b3739a40ef1bbe036a310f52febc0d05cb1a5d13256f5cc7a4a775bc3aa6a361032ccd43993112cb903e94986271a33f3e7fb4644c698a4af1b1e1e004260e59ca4e16be4a0fa9f8b49be25dfcad3e1daa591b6c6cdf750fe3fd7a6628b90e38dc9186ef3673c614698051802e5651fa27216f8d740b91e751e461869e7e6e9ae2b7c97614ed3aa3e2ac3365345f6c505eb6c080798d13db12b3d501a4615ba81862e370929bcde6f3a26f2340bbe5b092086c20901a4d81c9320c88717da7f1791923410dc713331eacd26dac09addf938318e6fe6628135fd8a00f7cbac6aab1048b21580ffd10d7039094fa0f47c55a186421aa01d5dc31ebff220ad7def4292787a5cb2668f35ea6f67a6bac46d944ac9990f5cb61436f5c68c398ca5c6b69d6d8f92eda8cac4f6a7c0162aa5dec4b36830a6c6f8ded916b8f86ea650b4a15ccdebb25041fe2984e04797d82dee679f65517f712e0ea40575b477bcdcc2db17fa5c6672efebf04042415461fe947db18de00aa4bd618ed873994f34fc67ac3bfc473d9965546c65db0c6dca7edab00ad94179787025da6744b578b6a84148e07e653ac77d139edcc0d13f12199b4556c68dce758087a7fa8177da2c8247eca70c658f4251b60dccf694a6c3f66b47d36d1581c779c104fb07af2aff4702a69d9f29c49406efaef456742b359935e503291ee7cf5a9f1c1748a3da74da81c42416e9ed175c89be781755f281556fb0871fb8584cdf9fb35a4d6fb60f5ac12b580932b28cf4f3d0c8dd1de2e837a5770e4764234cc84d5dab6c9819f237af72b0ebe08d75c53e7d0bf737109478f4983f298723b5612de31bcb4b31ed9f1ba7b0bd74475906e194ba317205bc6a4a2b1c8d56e12ae37f7b7d45be42110c9e07bc0efd91950792310e5f514778fdd66b784bcca16411424e86b3ee07cc4eae63f99a7fc7ad49766204d2656a210bba98290b2e6d71117767d1b54d67fad63ea860f98de3e8a413787fcb64dd9e281afa4f5fe77c09a97b24a45029ea1edc8b4228868cf795ebfa4358e377a25877c9b2f422cf24737a6870037ec43bc1f7245c7159a77734f90d2a74e293b2db3ed03ef133234c22b536402d524e4744e951371e0256e2eab89249e3181fa7aa8588f9635ceb091ea4e4721e06bcabd946a9d662e19ce4e9e84e324ffd95f39db1a20cd611625ad9ac5fc96a68afda1e02a60ad36ce6aed6b211fb2ecd0c06c1f2e2e8c150f3fa1a70d4ff0ee192afa42476143b0a94acedffc601c8283a8d13a781729783d77f40f3763a8a2415ca073449845e292a1e59c098be60f79289b7d205c353922a2120f38fc7572aeab366750f35031b5e43c58f96801ae7fe3892f95bb3ff1ba3311e7aecbf3b1897550338454e88f95959c1c4b1d2371d110189ac5d6cffe4f6086e097ec0c5a620ca36c682fa4322e4951b02c2aaaab1d56d92d6f4006494fe52e93b908eb4e55141ebceb2e0c3f37ac76039704e5c732503406e3f61f04294efe5a5c586554b6a6cb6d1083fe5acf8103cbcb42c9c17470ec1f801262258bd584c0dca6291de3f302c1a00d101c9fe8130917f73e432e84d0a73a2bc3783e48b8381486ef42192172086f6b578c998e4f573bb90b4087799b2d06fd558e536eac93a24706c51ccd7ac32080cc125d97f3907c705add857b4ccd8430e0c5413b6b08c42ce9bd3e12038ee6a6298fc66973232718e826dca72ee5cd8cabed7679329e54cf101f93af5180d174fde69f051aa2dea2697044c521eaaebab8f48d025068229d3ed11191f4a87abb795e9d537f8a8143512541491afa571e92996559bea92042230ef58c9130f7e03a76059b2688bb08ce0ba4c136c1f87973b223eaa759dad9a988387d204509068274df5722ccda57ff9b581ccc3055bd0a3b9dda23e3067348d76ba300d2fdab575f2b3109553f530381b56fbc56a2e798abdbe198e1b99094a4ce84b31843f1de46f7b6e04430ed547844c5ca057c9f73269891ac6a0298b5ad646acf7dbb95127ebd6863e16302393f8bdef7ef1daeb5b61a0475054170eed580f1790ed50033636c2325b51a563b88b59d1e02384a622c1c906e82ff0f1b1b8e595640acaec0cda691fa5b187d7914afb21c3131c565fe1ff6d868d671a1f705c9174231f73fd1a5a58f4b9d41706db44ca0847b7e0038b84aa5538893a30e0a9ce079603d86a3271520d24cd98676c218467809648cc4860c2a31e603095eb3dd63460051f612ba63abd58cb21df6fccce08be6abcb7c778929f32bcd8b4b56f2a887dd472ebda7b32fb5b41e6232e2062b5a38e62bccbcb569f1679982707d7ff70cff3d07f272fda3d0ccfb8c23e9b5e01f88914342b18e0cf585160f124485a5d5eb6fdf38f41381909eed5cec57fd75f01ffa304f6113a1848eedd4f271760cdf873e6c4be7652b5f5d7010ad8272eb6ad6b1bb3babe773010ced26c01b5bc895503bfe5a309e73046ae9bc8be6bb3833714c695872ed625ede2aa8a6bab5e55dbd5534cfc42132dd8ced2d092c99fc560b65d28a7551b7469597d7bb272957f1dbf8728e0860b7953658394964780a661ca90f96484eb0ddf1c8bc1b6b61c3fe30b36e371fcc491d4bc2719d29c501d27183331fd9467d151be85805f43e8e3eae47b554a2f3a3bc0205d47135cee1a74cf0140f1b4ccd1714016ef03635576277a70a2d724364cbdecf861ca6423b2a4a779323abd9703e3ec21adbd104f584c453c735414af2803116623ab5a180f3c2642867847d6cbf1c328f4f5340f592352f93d91a2f49060fee45d9b8ca04eecf189a53f7544ae153528238993004c61c229343fff5958dc82dc35f7945d0cd6c508a6fa3e513fe5c9955cad1dad009acfe5c1027c69c8b089cb2c0ac28fab4bde721776d12596afbea31da7f5f1d4eb99fcb9962442338a139d3a342a2f4d487fc616047504adc613eef23aaefdb782e566b7e3849b988835bccc42b9af24371f78d54983fdc2e50dab006621f1e383fccc39f851befe97067808c6c7a0c8bcaddf8ff839640645aef4a9c333e5ef7101608f53c869394a98bde56509fc94ccdad7b591a49ca49b7ccc7b3b67f6aa2b42ace4d64fc8172173555f12c83529f9c246d33117b7d2a6aacba7a29c02e52fda753e1483fc9046b0a03cc239c52b9a9aa400571f036fcbd787dcd99359c51dadd4e087710bf884547a483f18fa3610fe202f493e11420ce1511f4ffc1eba288e0e1797d72cdbd09ff9168680d15a62c9c29422b4237821df112c22f6223112dc43e0eae721141433fc2dc2e949f188766112db41f3e3ab5083e71ea58447cc4b95d703fdd775654fc48a65d983e62ef30904882aa0152ed2d231e45f9e95bbb4042523f35e025d7c3ea43266105a2072ad32f5d24cc618c3e03ef80f2fb381a17628223a890fd3cb60ea2411017647cfce166df2e99a51ca354ed2b75bf5cbb9d929a793ee0aa7b6dc3b5744f8662d85072428c3162d53a6c067dfae0b602d350be6ceb61e572438046fc3c02a3f0195f6ee4ed9fa65b80e886802f0228f4cf66e36544b67afff4da0595ff6042bbb87e486e3e44f410b01711e1cde70eed22d107a70e23e2830eae8aeea7fbedc2f207ebee041154f3f3502308918fb018623b821bc11e820bc203f111a84474e4fa42d081b002a12988a0763eb65b21085cc4a5109a21ae3b0283f5e98c63c1e423f7762102f9d2ac114576775d3e5cd22ee49f1e36bc02ff381b07b4b72df6c88caa6ab66b21f000d88c6685b62f72730bf2ed25885346b4d0fcf0d1fd49fc94a64504422dc287c7c61a421c8216045d23c604ea5314ed62f4419853ebffa79fed42f7c3ef9610ee08ea8d081af51146bb50f8c4383447606c7f8cb442445c042c44aca5fd90a15d28f8485c740862046b21381d81b1fba08d3bc5e207a78e05c40f3fdb05e7d37b8ee40b9fc4b615a70ffb568cb83c040b8b1f5bad1841b911422b3e76478c583911115e7cee2d8a212e721f25272f443ac23e623b821ba1ad88df787d7cad5de43e487711d1961142371f63871041b808df287edc1d122382e27eb8d42e649f020e20c4d121acb87e0ad78041d483b046b474508b6a4d24043b818830a9454614235a20202da4a194445001a89e12b8c704c5634fe9115cdd010431ee46ae997af78433b994952385047c621ae1bc591988b3cf0bc712443fe8ab9fd1c572d16bdf094329d00149c4d287f79a59b92f6dfd1118f5cf783b16d83ed26862287e606966088d12da74cb17cad8a0b8b5e8088e887684ba22d6eaff915ebb507c301d9b23d8aafd183ac2107311cb08df8c00b4fbe944bb70f121bb59044a041dc8ee8a80503c44508a8fcd4614626ec42e2230361f347455143f3d6d17227e1cee3aa0cac5e76c9a979feccd24c226084e443b42de2330fa3fd87340153f9c6917e64fdf3516881f290d23112d147c3cb536841806c7c90624170ef4281837f9f8036bf517745187c38ae67cf0b965c42bc213111ac4a4dd32040bef8f9a968f608b781731368ab04a7b2ea2d1904f6f76f55b7e12db2e4e3f6fae00913bc3fb6e2f8fbd82106eae522230723f88db0508a5885b90c15d11040bb90fe9368b4005e2ed21d6d27c0eb6a21071835006711bfd164e16fef31480aa95140e078eae57f16e38065c08796f17513f465788c089b8084213711d100692689ad096c7291917e81dc4ae98b07005baf1a31bdc623d94a6a04dbd40c4fae2d998e06fb09c89a34ceadcc9b29ed00751387b539006184a82ee1369b7c3b08a86d8c925a50e0aa3ee3244919e5981aa99fb7818856be0f6e3eb88f30dd7f7ae6f07ebad9f4b1dbf17c970236649dc46aad1146d59d9d1ab02c423e7f83c3671e172859c5c46fbfb848988d6dad90fc5e277b63746df4a396c2e12a073518429c049862367da0c91f75e2f019b01dd59e3469874014b05b07ed9b44751c933d89c6c2d524e3f4a5ad39ce044772f64c40eb96e12a3f1170e8ae0ec901e82023a70ef30f0286c21102351cc5b94f2ad6f4129d4e1eb56cacdcc95f2a85de98e253bb59e5c1d75a8758af1c916cddc924cff87b8184bd066dfbbc4ae6b644009db26c3529816fe788c5566d4db7dd37db21e258f004e7dca951ac7cfc2a1aaa922fa243bc8d0091763e7bbba425545b28e5fe8982bb0916ff8364f53faa6a668584026ee7bce4b046aa83dbc994891723ef1a7f6dc9337b76d02a34e8f52b6aace8697ec30fba12a9395e1d89da4e8ba039b731be39a1e796eec821103f7128811b92b003bec8a2765a385152cf08acb19bbcc3f264cc57055dc8304f08c4b0c2d0f851907ae0383009dd8e80f901086b22b755536630ae6f0026da85abee48d6ae295ee0634647dbb91dfea3ed5c3ee19477f740a8f27fddd5a2b3b58290f2f22a119b2d8008d4c076396a14528cdd9d9cbcd621f855c57e5e59e3c505864cf088f031c8a863001d6db07341d3952b00c1ddfacf7b0f09dd13465b46201b35c1cbe0b328fdc28ee8deaa7e37a1acb8ede90451622ea1dea25d097214c3b51e648aae24535d06e407faa13ec15d4f41afb596f84357e0f257ca4967d715cd5c7783e9f1448d7474d5bad25a40b4bdf4b71acb7a0fadde58f92b1a599b35ae2a1945eda4d209c185177fad90db1c3554837733fbbc7509ca03167fb9af8149794b99e6b1774171e7d3dce3b4583509657c813178b93e84bdace55ea7d516f1b3533b26a4d396158afc52b61f5da132fff957a698b6c7cc148bb49e1e0238fda8a2b1cefc9a360bb843d03139c534b0809e294235121e3fe8d43a9611889e38d701ffc2a4576161de1a45c20b1c745539116fbae63e30421aadf674f4a2b670fc9f7099d104a0237c5d3b8757ffe685086e0daaeb1f0ddb932fab522a1061e55df3fcb4f73298e4f6112e9077f79b10da1ee63d0b5ecfd2b6916c14066ec2cf562ceba75ae0de19d5b5055b2c13c06bbf52dadaaee03de4082c9742f67e851759b291b5c11b2975de08269e4b804bcdd78a074762b4c91646a976924adb26a6ecaff0b2ed3a76510aa1b33a3a7658a24b409b05b28066fd41cbc0a214dcc0af13ed8176c969aa6f9504f64e158fb30b27aa0fc0191d65821796e17bd6b428d7dc9a880fa1290d570e08bfa01b97eedf748a9df2a7609aa144585cc517a58d2c7caa030b5c47da8251c404b1cdc2048bf27d6c1cfa3b31d4b7f67495c66471e4ea8645c700f6609fd2edcc0d8d8ff541005267b84a7862dd9bcc22b87655bf6e8eb96de632aa9e0d7a1a17c0ec90e0c6bb49f394275b4c7d10493e84a1e7fc02b2edbb299b8553b83298575d4b3962be04eb1df3a936e2603030c8236e1b8cb102c1423b0274ee55c736e082b24f04743294e1caaff490abeba05160590491874249ecd517560479d1ea8b57b25077c9bf51c0865813dc73c361b1ba027b062b54e81ef9c0f8831b50fe5f27114f305e00b19e8597fe87189e5de8fa82baeed2aae2e5c180dc29d3f15b414f48464d7014e8859366f4969e62632504c316066c6d1e3ae3ed7b5a415346d776e235425bd77198424a67ce4f75f22a338c99373ebfa0d93d00740b8d1c4b74d8e5b3075dde69b68f680fa04ecefeab634ac7c4bc5d509f344d7d48dc2d9ca4c064942692bc19b10dd72a554bc10d4b2b0ed63fe2d8a5f35550014f31ea077ff113ab4580c1746fcb856e962751d3dabc8b3bdb85236a5efd423de811f005b5cad40f9806c7d504c4bdcbcd3960f52e10119235ce873164e28815c50f1727252c53d2bbaa7c54721773f5158ec759bd048b317bedda360910d37c083e361dabf8633c4f6ce493b5c31226d595cf5a6a769c4187da57971563dec64599138d5ce7d8bbe7d983eafa22b662a12cbb12f58008df787d2bcc866df69786b5be30f333cb7db5f82f5749be970c800524962cf560f5ca75a370c9d09ecf5880dc8014a8064cc48c80a9c170e0f599d732424078e5b20217eaa9ffc2982f116907267d3db32d30c85e9dde822ab45d298b9632af7ad95863c773ef991a18d2a7e2ad0d3a54c56d1a0e5cc5a45e3fb044e08e123458a06f072e36691467a446ee3256e82c1697766a85ccfe109442e622426e48032c3e104702b4ab09d0437c7b59c4bcdb3cfd2a525400b4dbd4ee6edad82f5aafbb54f3d310d83386eb59ca6cbfb72ab9d26876bf7ec523afdd83edd7b8bd4d6c3cd81b2a4bc88030854e3cfa99b84f05c68e9295c1cf0402e6463bc8c577632eb0135c5157b3eac9048e8892470ed5125a68b617907a1079259efe7d322f340a46c713002184ef807eb1bf9d0ec9a8374d168aa62a348ed32359f0959541eefcdf53af03e13f763ab6ecf1454f0c130df108828d6e10f1fe3a3cf570268460429230b3c1655268a96470da1948c89ebdb6cc584a7292d8a875b2ef65b46ec4d6b0bcd61e82072373d2995e114d31b86897cd71632e57ca5e17add1a39071e1eee7c088ece6c79c38914bd63991d5ef53e2a55545533b04834ef9e5e286eccb4d74a1fa50819b337037c16900fec0471c8148bc26e5f480481d7d31cc5976a39e116982e91e1e435b823ae880174900707e078a4a31c0c12c26f29cc4aa85a06df3ab2b5139ec4cc8a4758e3bb46837ef14d37428e8ffd6391220bfb55c7951aef49f90d2ca813f063a2f9b5f629d360f18e8dd58450351dd71928667507484c13095901b01fae5a2cf322c4edfb904d58c82a61a583b19f66847f9fb22a52e5708fb17c5cf5a693a46992d07f354a8f1d0883e14b719e52a1e1d277327122df21595c5f59848397cbce9f58446145fe105499179f3d8fe69e142b8c1332741eef9de7c281463cbd7445fc88a0a550810be8af5afbba73236e64db6c8073b3bfb593f5da364d292ee107f2cb6f4c30dfd68e4b6192646bfe9894c4fbcee1e66360dbf8402d01328db4d9b973cea16977ebad6cafddcb2c8216ae7077b059faff404e3768c75983b959ab29c93fb12f48a8011b947830f3f35cd419b3e5315aac6802e2bc43e0a4bfd7f867de0fcf814b4138fa2a5d68045b67ec7929fe6389e7f02f67762cf63b72603745c025c3b52ca10e99c9552fe91dc8d38c304db943072b8658b1b6771341b0b73b3d2215446a94760ef88fdd4ada359086540468ffe3f92c65a4844840c988b04472d761f84dca946b2bf64db90603b2cf4a8764bada984f23010fca5e97ea5642ddfbabe1a59db5d9366ed43723614500d06b1e0f3fc56de736d56bb8fffff432b62d44ab4d456badadb7f452659fd1ffac8543be07ea30d3946cf93223a3b51ea5bdb3f5a5ee88d84f539d640d94422045f54ce5e2f364cc959da3f166a1cb008748621a02ca275fc217ee4a099aa1eb01d5fb9f8a81715c6ca1f553c45b2eaced390430c6da11b39e75ef06149259498a56cb43d563072424ed388337b98dacd337019e666650286c003718af6f510c54607ca72681583523674507bbe4490d08bf7fc03a1df3084679aa074bbaef4b0173b8e941f0cf125103920b95a533d7240e5e1e56510d1dff7df524ff3aef87cc144fc7e699bc88c4631ca8c983d165244a28365786b69b35379cb2b0561697e61bc60e4721c8763344f259a81b1f1dbc300326be32f14d4f8474627d5c9610f7a0843f2cf56d04b1afc88cf9e20c1b705a457486757aafe3d0a7f3aded4e122ebf4759e5297ddb2787476781c4dca3b1f21a51cf98828832ab05c79bd29d5abc0dc1961d0a028931935c2a2e6ddffa5fa8daf340a5647f620cce94dc4faac427d86428f7bb620ab354718d44105ca1042569bd4137aeffe04cd7fb45b67ddd390479e71440a6f7ca2ebd8d0711abcf02cfab741490d8fb73d67fbdfa81231f632c4b066cffb281358b13c96c8aa9b1b9dc8eb8c8692c1f2107f69f8d7246f6bf3121ca022e5e30c66713a7c9434f26576dd1e5063e6d8f8afaa20923f5a0d6c5faf0bd55101e3f53f65e4e7c99333c2a40b66c12d6836d07191df628e96cff655581d057f3b71a9ac10a0217ba01c309105b66671ce86f31f3426a0a75bfbd0c44d4e01b3e99c2838ad039cf6dc9da5442f3eda17dff743df5d46488316af848b68528a4c493cae0f817c23fd701852be3683306ed428592a18502634176f3468295cfe1ec05dc48039a1cd130be9a3507bbaea0a4b3d6aaf8edbefde537a78d5543fd22aac1a062d8c21839945cbc9c9a1757620a83febbb454832ec6923158b796e8d621f035f062ee84e227071b4454ed4f1e04ee314c80b35c085d713893eaabe9dbcf18c762316c0f544e80daf0eab90b047edbfc28eba72973df526f218d5977379bae1e178e2cc04f5edfe762bf9035e79b80ec678067603acd586c641caa5cb6e72ca189f35e531a7d9e69639efd8955c799b6451a3d98b3a7b9243ac3af02ca9969fbb8193fd8a4e135aa6a53ce7030e4146d74c2fbfd1d2cd3d0ad7ddf791cf34e3c715c73ca409c6e1543c70688ee40614ab33319053059df05dd1096bd78561f0284501b79c97a6710e19e15f808c810c169e1ea68ab7a570115a773709afacd3fc6c1bdd420831ba9d9ec4deb757714d6e3d3a8ba74369c4a44fcd028794cd6f08c5e130373e1a846b6878ecc27d2e778e2bf15d98509f5349e83fb372148ad24af1610f58068a7b2ce2ea28b192129cff73bafd2796fe29f4af39b58b346b525c60bdd78d8d62205bf632d430c6825bce8afab28ce786596bd903268a20f9a4570cbbfb4150ded6d41cd384faece5c6d0bcf9f7a2dd175262071aa89668b1e0e2801a568fb3caf38be06f5efc75de483d9627b472af5dab2aec8a8e268114d9c2993a466be9b5efbb00e36f740539295d3ad8cfdf0784fdc69cdcdd616f2d9a86ebeb67e749150ec643b8f6bafba89b1c91e9fc6ebf5a7089d956f13baafaa880117a897971cf3c0ee7c8ca1d7f643cf71f67bb4e86d1d287f85329af92692a07ddede1b6ebb81932c2aeeb013f1dc6904ed2834028cdc9298fe8d16bc5d25477b182ba79d68f14bf4970cfd9141c5373d2153134172e72c55d81059f0b5ef173dca344abebcc5d3f2d152e8c211d7117c4b7ec9b00123dc4d0a542e9764d1a413180ce16ff3dc9cc5ddcad0c5a333568c99e6111974b8198fc6c2de1a1e875bdc16ddcc80f4832ddfcd80d206408f893046e7d613da802ba86cc363abe7fce2f168c35815931eb0388314475b0012e853e79a5904a80e582d7e785290d02a6ddbdd3ffa147eb811dafc554cd038afcdb3bf465d8c92caf2e4795d395bbdddc1e3309a6eac55b04a0f1830ec915f7873e2a69531ba37a02d0998930866ba749266333859abd30bf888b083470931a48730f98a790adc3f324902244b57165f922b2e2d6588a3a46ed92adf43325f89df7583d0a54509b6d172bc338fe4d0f57502729feb785e0b4f8330887839194f21b993750d9e2b9610ec320e18e58c05688da42be885812226134f40f7abf62ea079e250a386a078500393e1ee30363052c6a8bfb96af4662209a1106b35a0673f4b9984fe7c38c6b94b9404dfc7eb2c44b3bf6dc88094ecda575543dbdc157c19c8d65a71a41bc56d7abac5311f8f69cee159cd6a650ecedeb1c6652fe69c2104be537b4cfdf3cc82aebe6c9df880800b8e2eb133f4b27a952050348176939471597022164822209aa165f506f8334cdd55649c75af1985e3826bfe8d9ef4bc61fd3dcfab58b8c04e84b4ecf3f1628fe4eb2c5ed5616002f9a114dcb92971e4cf4d2bcc261a1aa93c5089231bddf23ea11e2f3d6a656ede19d9012c0dd52a5e9c9d415c84227c03481d9442be6a4d5ce00a44ae7568ef96717943821b1344174e7173da46fc14b6425c39adf3db1db5fef52b31716ada392d7e83105299b43adb91fee2e63be1b0a16da393576a23011f585f08eecf630ac9c426de82b135254e071f01e4f542c08c57041d4cf8ab1187efeafca610999de427c92628da94ccd648e012804767e7dbc9ab5241613c1b5f45702632473b4420a6d101ae0c3603197c4793b10f515dcef025609a41e455a1f923136401ef73d3e73aae6d78b36b0f1c41956ede7b3fc86f9da3c95e5771ee90a62054db2b706d261fab6a9029b321f93ad12e5662c45cc424f5d548cd7a4e5098b25c01eafee1a91c2d823424a176835ff391e1d74d3c346bce1f9b36d01104e952bd651c002d2301195b97d52e95143abaedb6d0ca668a69b56c67f9ba6e814967ec5693bfbed7dd2bc8a9fb638c9f2b7c4ded2b3e992bd7146a48e99501920dda673a13ae7bdb563f731c69c175856c4c9ca230adcf1e748a7a4c4ffe03d6d5ccbf39689936a59d7ea56cbe970478325ffb7ee35b5f92eb092906b98b71beab3be010e6419c7af3923bbfa99accc1297c09ab250a3fd536fbcbb2f5652bb875f3cab21be02c34adee685257b05a21b3e59234cb8bc5ccc1bfa3902c10e6dd201c2bae5b709eab5e338b40a4ae656b43ce5699c4ff7c5f39609cb311fbfaa139a55544bb5693d1a8d1842d6892ae5833db5b9e78d1b38ab6de7b47cf7a4cf7db8a526a10baf23dfbe2507b25a921d5fc541247a1a636b863afce288bd7ad0aac7aac81b5a27e95e485b9cb2c3a2e09346c74f90ddde964e8e3bf96babae77e82bb810f4c61622c780ed87abfc9a003f479acf653c947b2c4d9b7652d6557566ac2e54fea6530b1354c83548e527e430ee308e756c4c43817226922fa24f76564321bd93ed83fc02487c7cc1f2b393b74673a02a7370b52e18d6d1bc0600e6d7b3c3a6efbd0e02e78a33dae8e79a8fe2da281714d7d6a8a31628eb4cfd6214b5ba649d6bb15deea9643a5fc01ba19c9eb51ff7ccea741eb8902f71b6e0c51ce87d72e26d3fc11bc208bc9d743dc44d06014a8991a43c6ac03192159f69f1420ee8a009b88352eded873763989d56491747679f25eec530d45915f23759f858b9cae591d46d3163cf9b1a16f446131a9fee10955d272867159ea2c3ff9054ea56b5b698f1bf599491b1feefb701ab9d55b56fd5a0a477a28914a2259bdc820419835636bb069a638c1536c821378f246dab56fa30c41ae57bb0021b0ca56de42f78eb986bb0a1e4d5361e89e24b69176e1f7c9e22a6bc17d36aeaa577bae837c08d637c11d669c481f9ce10a61e17ab2fbedb7cf2d8688710d66eec7d81e100ca5d128f5f0fa5713685e09073a731786ad1ddd0496e77ae7b3ef4ac1699493bdcb666709dc106d5d2894bb16c92bb8d07947727935047b5be6f42e41a9bd86f0cfb14e3e68d9d731face07d720af5ec5490eb367c8e545b43471fd26e1134d082a9378b45302c14b10507b46d4bc80edc77286c2d6f076c41139dacdabb702c854afe38358910fca5a7ded8cceed771488f328e1496996218cce249e5251ce76149b6de964cc501ecb4a389f89e544918178bcdc2788f5ec8c3c7a6d1b6e5006b0bc85083add66f071370456f05c0047c27bcd2ce20fe14e0a35ab9ed1bb22f40eedeee9960281682ac01c3923d43bf92c4429e34f48000040a7db901b9dbaffcf34052b29978b65891a8347ef82e796f9e32985eafa7f5b17f53583cda3f550abbdcbfc180473d1ff19411620ac1b0170b06da63510d09562f7abf8cfd010c3bfb479766da146e5afbe5598a35a15e71901c3ff1d89b10146e9806132803d9d2d7a3d6e2c6a7c47e7c3e92c6cdc9898175625e9abefff3ba4d7b90104d8d6d84e522b212da215159862d853353b5b7eaa64da61915583684820caf24e745084b1c9e5912f44d10f0aaee08b2d88b0444c2b4d35295328cfd2ba68b8a2e6a096e5bd8a6d06c3bb84930e9b965b2edaba2f752c6e49744aa26ecf2e3863a9a80d99432d5490da057ec1e594818e6e0f17b8474835024071987a6a33298126e7b6859c7f74670b7be4e759e229a456218c9b18e58a27710f082233b794ef078458acc68e4f399f16d6dcfe60680d022c1d054eba04e40f571048eab839d4804c086240465535b8efde330950bb95499c413f9ad8bfef5264c0e18a8687c320fe26da31daeedb1a32598b126ae0ef73ed69914ef5a13fea0fd2510f1b3472156cad05b057738a5eb25e5a5ab2a54c01ef0f6c10540f2b0aa555fd988294ed58b1db975002b22bb7ad0b526ecfe1949bb52587e33d282abcdf3a87f2a964a1588a1d77c7a03b02715675e43dc86de3a7f25248d6c9ddd613c1c96f8f15ee1da4c2c30f5dc78301381e84286b4a3fc303123c38e2cc0e619cd12107a805a431e5d091dd16811dce00cfeca0460ea8048050fa191d5a507aa59fd1810b042060082682c838ccc00409d8c2031d8cc10403b6d2cfe880c41a677250e34c0e5c5043e8603ca3030e38745fe0209343960988c08b059ee00107c230635b0205dc0a78108106c4266c9069c00f5cc2335a8af80115c43f8f333a0851a24a3fa3839652f63b2713809b1254b000c28c263ef0021b6800024278f182eaa1080b4af045053808a3022db60798613ab3e483204228dd4c9a14a419c199252fcca4b1810daa872d0c4a87ed413369ae286dd29cf981e779ded1fdad43edd0e5513e90dcbb27e600436f81cffd68c3fde9f3bc6fa1d4f1a5747c9ea73902b583991f7831f3033069a43093260c8a072107a07228012a878b05ea06aedbec77dd8b50767f29004ee1375eca6a90acd184df78e9a950389022943e069da5e5bc3b36c952722a9908a56de2073636b707052318e4e77d2f7e3b5054906018da92c7d7803102db45c1bd978bcb382b72d8dc2eb7cbe572bb5c2f5f8ac7f3b8965b3d41cabccc55d9b8b51d1197dbbcdf9c4c79ff93b9a79275a30ba6d2fa7b1f6661c32d42df5258ae00d9b109526697f872afdde29c73516e299b3452a30f48d95fb93ddb734edb24e00c798e7d4f45b92bfb3ceeb8015266d1f874b19ddcba5b2f6a303ab1069734d294dbd2c8c539590e32389bb1cbd865f4b2841360bcc011c30429b35ed8b7566c5658320fca726c7fb994db8ebbf2df964630ae417269a0513a1864078add5b8e43c357de83248d347ce5a56c2bb7d2471ba6ec7ec0451a56946e268d31e5064a37e38333ca53cd122fcfb064d0f09645a3f428369c4a1cf2961df21ca06de3366edbb88d886b8928fdef87f133028d6290321b06c482e4362f63d003354e35f7c730485bca6c98d27fec82b4494a40da33178dce8c33eeca7ef6cbaa8b3324f8630ac8eb450b920cfbe59271cbb866709d4c2cc1a5d2be5702d23e487e97b248a8463148bb39c0394bc68eb1624091bcabef53e5c8e17d29eec1545776a2b7e3ae6cb020573f383bd67a09a6f4ff7257a74f71597caaedbdaeec7670ea3e35c280fcfbe0b6755dd775dbc91482600882220f4edb38c6053d202fc7dd51bee9c71fafe7795fb36de388dac6ef0bb7d83e04b76b777270721ee31764f7dbb6f3a5c61e90396cc480e94432874db943f63b6e8f8b3d352f8ee3970ac3ef43bd8f6128fe2776e2493cf9739bbdf1607763bb31d6a04373efbd594acff3b88ee3eec671dcc6dd3b451a6494dbddec16cfb17f033160c62fc8b106a46fdbb675ff53fa8eeabf3bf243d7755d77af78efc542be48ea10dfcb2b5ef18a27f18aa278c5ae9b427cd397e37b8e42a150dfa350ff7dcd83e29b5235a831757a1fc53195a5144fabd2b35ffc9266bc2c79a9c152e96668b054726598517a1d96cf927785c51e01b71b0b44c7f61e2bbbaedb7c0a92234970f24b26818617af86fb134782f105b21fee4f1f932651bcffbeef5389e09f52e17f9fe759532a0cc350247f78396c78ac3c8e872e0c9923d5e4aeac297c9769c3255e9afe145a141561b8dd1b86201882a00a1c494076a82a8242d556763624209bdc1ed9af7eae8e5bde8ecbc1a95bc1ce0fcb3191628c134b90488021c28b0d2d5bb05c019f66ba8606d0848991245b901b8ab3dbc6a150dd73282c254ae450a817455144dd32ee858d25d094f981aae9c44771dcc6a964b19253e206dadde038aec688aadbc87bb3a9441b144a25034b91fb6edbb88d3b01b9bd91cd676705da1ea87b2ca5f8a7ad03c3b01b814e3a6afe88fbafd965b7548a355df85b4a34a594b8f15ceab711e8f3b9a14a726f2e68044d991b55582fcca0b1545a2d4a37b38325ca33a30ac853936ddb36196aa342efeac6ee2a8bbbba5cdcd515568864ca4821e614660924be7cabebc56ab14b26d9f6dea331d4a6345140cadc8aae0347b003eabe0bc34e75b994dbd6711c676d672df7454c0dddd51541d38f5e90e0914d293196a8cdbe25f8529cd9c66ddbb66d034110dc3670dbfcaac614796fac7857a6b7e0e6c496dbb665415ad7e6c36405b20f04ca2e17704bc9f657c6a820b71f7d50dffd0eb9729fcb04e4b6753bbe47c7b6713e3a89c2a56c86ac17a76bc3079db5fed6ba7bd78d40360c6d2882a0f5d4fb5d59abe2fc033d7c9bb2f6c1fb81ee6e1f4cdd0b82aa7bc1d307de0b7a68df536316a40c2c1dec4c2727dd471e9032b0ecbaee8778bb6e15762b578e5490b29dd2ad003b2e4729db2987dc9eef813ed3cfce0f1b96a7148c2f20657f0253da96e30948d9f7de79350f7e35df8706d9fdc94120b124bbb7f111e8545353f34bbcac51e920ffa8e6bfaf517d4f7ef859ca8d7a32e5e236a6c0930904c14eb4dc0eb2f0dc7be7f62d3d95cc5dec501b501c3d40dad2df4b752314aff43cefad67bdd34d796f5352d8d1aabc3f7de4a6f2befb6164c1bdd7c66664c1beddbe2cf0c633e49802d253a93e046c9be562b9b460db36cf4b63fdbabb735ff78137f5bda7ac5fbfd6ddaf5fbfeeeed7ddfdae94d8f28ab703c311c8bf0f14bf0ffc3cd1f39efb442e9fc7855fb4400d175c61a6054b665c40c68c0bb8e440cbc845992f36a5c4e9f45f3a9349357ae94e18739db837db876190f882015276c27f39c15b5e5241de2fb3f9e0851765aa74335e90294f3563ea9637cb38aa442e40a0e76cd622f1c572b15bc6905b68531386e1388ebfc4cb71fc6efceec7ee51efedf2841ac55396f2f41754719c102409a30f48d9aae456650e9bd373f7aa4eafc4963f529342fde96b52de1d814051147fc9f847e27f2faabe1fbffb2ce54dc9f698f29309152fc78333dd2d89310d5206fa3cb1fdbddedbd4fc7d50165efb630a45a6967849fe1d996cdb93aa8d44798ff29e54d5a44e2fa2de4b9bf214be4d19d94ca12792397636158c6adc2d4e36e4f5d2822d52705cb8745b366b2d09c22cba908b0ab8bbbbbbbb7b0fc76d57885b776f5db7eed6ae61c6065ed8004df9bd67c60665cacf0662be073b1188dcbe97dd07c56f33814b3ed591e9080c32fdf73de875a5cd08fe7d29aeb4b9365f58da780b1449f1fb6ce9a9649e1933ca30a38bd3764de09b4c5f82a1f7847f7bd65bda12f496abbc3f633dbf6ead90d596dbb6c4f4a04a47900d6f790a026ff9897f82e265caf04f26d08e417669c9cb946010f8a08a0b39407ade63e0e457dc44ce5dc56ddc074870140179bf7bb0245d658fdc6c7ec5725be3e4b70c2f4a37330332ca104a3733033425c771df719ceae8baf5c61190f71d071b1b1b1b1b15a8c0bb4d35ae809481a5152f2a96f7da3bc6c9af19199451ba191974614606509431330330a2288aa217e0268e5c6c3d61ca79c810280c55e1f762d89560cac394a934a964a00dbf1590ab1f9b197891811ae5e98a363607446ca2c91b958c5c904b42d5077a0ffe6f3e7e04b481f27df8a72ff561caf34a4f958303a455bd9701bd301383336662c0439845b805074ece833b59d0cb304c9122580509fa88f74da9fb76b4e0db147852819d9801727bd35805b971647c21c30b136bc53b3609c0d8c4cbeec1f7ac5f54b7dd8bfa7e8c2bca31ce94dc8bdcdbdc115545f8775cd2ddd3078a39763c2f4edbf65b16209b9289a52d3d5076d4a950b1e4361a9c3e9fe7c23f7af193815f96d24bf9a645c845b805088e22ea644ac9accca25e7c940aa5929d502814ea3dd47b7f57e5e943239b919ba50c5363972d95ca72b2b707200886a14a07132fc35fe265a8d261faa3f0b90f55dc9bba944cdce567ca527e29542cbd9bc5b3b60765be2001e64bf78d5ebe325d77b99409ffe354a7d3c8450a3177d5a9be5880bc3f76b140190f035c2c7739d5f76d62b6e7b84d069eacce96927b8fdb549b13e516e6aeb6b75fc60b90579665c3a232b275f6b9ad9365b90079bf800139319df51480868b17224aabca4192121843a6cc192bae4033013b668ccd189b313662c690f1ec66c566c57685d8831436363b9ec70a67679440d8496163b3e379ac7076c490b6dcf13c56383b620fa297313656d8ec588d21633346ec41dcc2e58eb1918977cce66397d8b6177b38a964d664da32460c4550ec01cd105e589555892014e29fac5571774501727b102439711bbdb4292fc728c8a3f0bb93fd6ecf15763b7dbffdc6c5c6c5d6c57732a5dc05ae34b2792aeb845dc28ab1626e0f68c58c50d80fbb2c56b63469c60a90e047415aafe34a992d6563979188d27b2f9c28654ba021c394dbe768c152b99550ba192fb694db365ad9d2a4b9b64c99cd67ebec4905962937bba3b46f32a9542ad04b8d5dac4ea7dabc102f0006c788040e1c23111d0e1c5c708c48e0c03172c18103c7e8e572791c97cbdbdcb041aa6ee0d851927fe3c11be4dbe0c8b1cbd865ecc28147881146698328dd4c18684e3faa6ebc4dc948727c927c71cbf8e4972399f72349cab872fcc6f0c70f24bd37799d38fe48deb841deb841be918d1c7fdf23d43bf936fe44be4dd5905f33deb8f146ae0dd493376a6a46afa6e6bbf12a99b561a366e4baf0c9f76b83fc6ea0c8b7f11c397e0d67faef51a38a3b952695ccfb50c77df023452f3b0043764f8e5d4892fc910b499223179224472f970bf93635a338d6903bc01a94cdd865ec327619bb7c5cc0004cb942e966c438a33cd5dc23d9f7dcdb50da6e54c9ba9a176b4619576e620f6fdac69a9ab1a6667c23db68fad4d1e9bdb463cd388ae38ba6af5159d9ca1a1bca2328a71fdfc8ad195f34d5bc4a7c144a259a3e144aa6b3c848df7c4c3725f660754095acfc282066e4327219b98c448c5e6c6c6c88b95caeca86881245717cf1de7b6dd87810ae0d9b1b7714c72e366488816ddbb6f06e7fef0def66652b2ff8272e0ced87a1f8e5a87b2fade95eee3eb7592efc100c344a9ed2cd8071268c32611862c2d812861a006b9e84fbe29380a242363e372e39ba2a99358957368e228effc61b62393eea6fa450b134e1408de249b5bfd2a40aafd8830d69e382658819bd8c5c462fa3173128315f3e242f1752cc171c1f862a598e32fcc03047caef0d8e944d18862ad9e582b2b1b95c6c6cc62e6397b18b18f27e664edf732edb2c7745d03e08beb8c50ab14756b094e06fd6ca5682ce7129b73f53fa28ddcc175e4a30a42857a59b01834b79da46f00b354a154a37f34516628e9a1f3ff4a292895b507fbf1bff81e0936269e3c5d48d0d958c2b49948adb5f099a54fb2bbfd3a842c5f23b8d4b64598e4e2a99e5de64da2ca872e154762a15186f0735f7963179294f35e2fbaf406bad3d023f6bed078a29aef4525e76b95e4a8e7bd06e0e3e68e2516e60e729f16f4aacf9d3c9f41704c1bf5cc0fba140f05e10a53a32fd67c372379eb3714325bbd70ba9327da88d0c75e1535dcbe414063d77b958101453e3b8a4e6399558e3d920b9ef6adec484bb3540de2d539e4c269309b43a60f7a894f746b67bbbacac055d10b91caa9ded66fbf7cd27870a0787da98fe53c9c0f1391ddf7bcfc424fee9c17189e98f4455687a269bcded62859854b25075bb581def7a29eded72638b1b5a40348c40dd5367c4c617847321531183038e6e6552624ac1abc2adf005c10103492cc12102408440ee68195f4d7a38b374aac18ec861e4a9b130ecd8847c23f4dc60fa82782610b5f9042dd94a3029d9c192e90b1a8540263a8094984226a2903904034b2270383d26af8563f44c2720150120b06402999850e4c352b7919df504e0993a21de0a458e9c6aa10a2013cff48d30260979704f421172ec4881841056005970414a0a379840d6e763f4e11314e513b98f84aeb5f58422a7c21bf9c2cfc4e9742e703f466ca7634b7521ec84e06b0b0224c406348510fadc80e4c9e907b8e278703cbc082cad80e292742c7426843cb81d353db612705862e9d80db6e5705b5700150186c8809a4221013465c4401181303d64a9e18a3e82e5978b00556418000c2f084569120026ad1f1fab145000c0731ee8401a1b9431460b4550509130c2076604572801010100b5d02a0104f1e49d2133c5134b2811c601498051c00b2b15745847246048288d1a6714c960831a688048b521041027ac8810d3b744105e7cc21470c1c412ad203d22e43899c06f878e0b58a04a36a13c09409012a0057431000f37bc00520514128840962930f8f4d8e4e04a802607301421d2137e5e143b4c3181061c60081f0ac080052c0008284f8a085141b4696c3eb86870667c0d2e19dc18f7059d1756051705778b500b318b5b828bc52573a3d8a0b8479cccf2b0278025743bc611ae0817049bc3068eeec6b561490e754f9de9862078bfafbb9cddacf57cacd9746c1958e27e58e29a782bbcfd7470030981a5ae13bf1454700397440f4e04314c135e0f4b5c933004d30e9b1c96c218381936134edb134125e08f67da84d8983a112c8163967254b921f4d9148003d1054b5d9aa54e24618b2571ab32b014daa0ee27a4d3e988d802c269042370e0b82cd5a46a525b8e0d1dd0c6461a1c3a16c09f6fc856b30d01c32c6d4e7ae87826cf89a5ede491c0e19c7a6c9613391c93928e852f068f04cfe4c9c41c628ed0260ce18b615b03078f844d0c0e9d154b28c8b8d913a15002d7126b3c1b9cdd7236245c145104ef7e533e1ddf930e0494f54e5bc789dbb6ddeddbc02d34ede0b6ef85ef464d14938dcffbecf6713f381dce82236c3a6e084fe89a58423971830d8fd30126c18173010e2aa2f7343f1823055c94000d08aca8190905e105e8480b447cd4d40635d05181ac013f2a3240799286045998e0042076be186124012e4001161fd0c005a050428795c2016a1b08bdeae0066674a145161da840161b08504586014079b244c90926881002192ab24021011b6a202a61879a9e8072410baccc96d2fc80073ba8424584106ca0e0031ed880062e60812880e862002202c43005ca93202c48e0811154f185c90a5480c5073aa0810c40208c0f3ae470033350a08506324066025a96b21904646334438c305c00820e503185144c04f1433689085085ca94202021ad1b1b2316240081028e08424b36091080202540425aa8917331c2c0820421f0001553481105134274d132430082880869f9fce87173c306e769c408a305210081073a40c51451302144105d7ed0f205d10c555ad061a9914613176a502cd8e1858b0f0398b2d3801f7c50baf2449866fbc15da34be3fa006c828bc065e22a61796e8f6dc7b24e391b0bdb8770c2dd61757c246c23581b4e041b4288e3c68d8de46a44143992208e70da61b2117ea0f75dcfebbacd3a09ee26d284c5ddf5caca6811d6c9a6fa3ad35a09eef63345f19c34a94813096478c6cdaffeb379eaf47c7dfe3e5f88d28a571c7b3d3e3fe44098013214e3ee7aa3f4ccb1a4bf7922437e4564c8a7a7512e0a97c8b0e6ee7a98fafafcad5434038bc5a212c4c42361c7bd13a2ea5470f7139c04cd70bdb2d235ef8d693aeb66c149f009f04b7a6e9dcdffada6afb36afecd2abfd69aaa499006d07433cd1bbf26c124669a49f006e81fdb4669461fa6feaf2a6cc55b7f364af11afbd0e895b5c65eb33cd3c9af13d51ee2e06e827b58808f08bf71f795bbaba0b26278901e5fe4d7b5f65a2148909f203e417a820009f223888f203c417a04d90912e4e7e7c7e7a7e707c8cf8f1f1f3f3c3f3d7e767e82f8fcf8f8f8f4f800f1f9e1e3c387c7a787cf8e4f909e9f1e9f9e9e1e203d3f7a7cf4f0f4f4e8d9e90902e407880f901e204080fc00e203080f901e40768004f9f1f3c3e747cf0f203f7efcf0f183e7478f1f3b3f82f8f8f1e1e3a3c707101f3f7cf8f0c1e3a3878f1d1f41787e787c787a7880f0fce0f1c1c3c3d383678727488f9f1e3e3d7a7a00e9f1a3878f1e3c3d7af4d8e91164e767c767a76707c8ce8f1d1f3b3c3b3d767676aeec6477d7e1a43700d72b6b564b75f60c9657f535031513cecab4aae16bf802fce398704c05f8ff7f774fc1dd5170771ea297e35b66b84240761970c2dd4770b21bc2e5fa9609c7e5fad68665f4dfe4bad931a373fddfb08cae5cdf32337a62d89ab5c644881049e91c7b6d3c03808aec66a8f2382aa8f01bbf998f5e678a69dd0ff7566783e46ee0afcf5d2bfad7678eed5d73b2aaeb0a94a4aeab7ae40a77166b02eefe39c935c12df9cd0f19f23d569f53f589eb53f5dc3428dbdd5531f7b48afb1ac57d5749e2be53c5ddfd49cec6fd4a15724383e3dcbd0ab9a1e1ae2a8a80bb377172434227eff414f100e9f9d10303b28383983e767c80fcfcf0619a3c6651d18f1f453e3e3c3ed807061244e7b5756dd52137daafd968c5e8e357f71fa5e71ad3afee37f3b90eadee3ec5c92dd42babe844f7aa1661f71cee8ec3dd79b86f3ad8c6b8916b28467ad7ba02b93ec59faaefba59d1f09a94d65aad8dd67496e27a33a3287eb93be9ee35ee8e72d1dd4f1609778fc1496b0669cbb841eefe2d6da635b5e861eaef9afaea26d22b6b87e583d52347e7ad54a4e383e7e7958314994182f0f4bc5eb947ce4c7db18a6ab17d1a29ad5b9f4679d5518d56fc62e9a4e70ca37986b58e5eb37e41e7890c79773739e8eea33bf8639188e0a4257277109cb460dc7d9f284dbf6b6317698fb87b084e5a1c77bfe1a445ba92cdf47c1423a9b3bc12d12bcb54673aaf8c74f3fa5c7d9ad11ff2b9e84db4a6c6f4dfb87be87e4d77b771d2727a65ed19cc7377ebabbaaef953fc664ed7daceeba7eab9f14ef32ca3b4d9f9fbc4eb7ea3f4dc1bcf5615f6f87aeebec349bfe2ee369c7422dc3d4945616b46525f699f2f4cc32fbdb25e19892809af3aaf55ebbc5414c53a4a2b5e8b4ed4ddbb8d73f7db82162d2a508125a108659cb8b90008b044614106866058fc88818802ad5230f84183230964f9e04b194f500384097f54370ce88106c7083db0369a4ec2a305d9161d1c009e80fb42e6e46596964adfb823ac38756087f2c090d3f8321b72f31953f794b247c61a6cb80faa968e88e2879f897bd3e5525ab817dfa66a08dfde30cb526a87168e6c6f4a69d9628f6cbf430b47b8f7713472c53fa5fcc829358e6f3afd167bc4a445d422fef8365583e96da8aae18921d3dbafe1f457247528f9de3bfa544a28ddf7544a286ddf828c04554bdb8f293fb2e58f981e4c69197f873f627a3baa96545a6ab0617b936a69d3b2e58f8cbf8d328ca91a6cd8fea45a7a6e14c0d0f6d794da628f983e4c6db147c23fa5b4ecd0c211d36fb1474e7fd22100eec797617bf1c19496704a9623a3aa86afc1f4b78693f7f6086a03a4154f537aaa232594ee2ba1c43df79b0e01707f7f688b721f4c45e1dec728db6fd7c3c069fbd3963aea9e53a98c6c37cb665d38f96665bb7f395b8193cbbab7d6da232b03fffbd3098bcc7e00b2782bd2dddb63e9362ca5e9412b5bf9a98ebaa34e65054b19aa8e3c239becfe11c871dbb6711bc771dcb6bde5dedaf78e89936ff7b7f2fbd3a9f3a06ddd48292b36e5d155edd2aac00f5532ee2da8b282a5fc549df5b6a3bf55d81dec0e9c962d3b809b0f162c36dcdfde06fbdc63d1b2e58f7443e1776f03f8a6772c3bfc914e85c506ef4daa2d7f64fb506503a8daf2476cf0ec77aaedfd6df06c7a42993983ea00b8f9dc3f62535bee164ecb164ef58495167678c24a0ba5979972427180e3f6172ea57d37420d23ca28dd882ebe3851da2f4894f66516c9ca57eef01c0fdd3aaa02a4ec6df9b74796a3bceedf12ef3f93e829d9f729cfc9f76eddbea7b6cd95dc7761c97d77f246271ca7ca91b2b67bcbc938ae1c4728f6b7cf717b7ca70a93e94393e9c3cf8a3257846ef22741268221f875a6d437bab005852a6e0c5f54724bef9677742108fc40f03f7ba6fcbef253a1a820bfb71d77f43d18f4a9381d25d077cbedbb6e4cf7e0124b8cd9fee3a2fc1efc1edcbe3b000e2ff4c21c38421c37641c098268afb83d5be91fc2a8c496293f0efc7bc3c611f841a08abb2bf0c107bd34ddd5c9c8f6a5dc451b1e3b43980cb9d02b5abc582944e846718c188236a2dfefbbd05e61cf1c800c5310488adf16e4a938d5e5ac6f1daa4c8d014032453851fa1922d01011a6ec7ce44ee5fd2f4d9a346794f752e09e51de9765298920424b795df0b76fe52bef6f2b5c96d2899585e5f75bf7a575e2fdfdbceb6f2d0f84306388a593355dcf01bf4b89e45df128b794e9bb5428db9ee364e1b7d972fb4d25f3be7bdba56461e91db871be8500070d0f2b76fc7809a6c2ed646df8de6f3fe05bd90e8fd21bc1068d2bdbfd56ca73eecbec77f75150901bd7eddcd55de17829db71996568defad1719d173227bf6780c8a2f4335dc838d3850c1767bc8c094016cbbde79c8f9e13bec7a3ec4ccfa5be4fe5b26fccc9bd65392196bc28b9bf684aee4c1066945e7a79ea44ebe4aedbca57829e637f7b242b5f297a4ed739e94627dda736bb393842e1fe06757fb9b7afd2c0671fc5c451f74f90d65be173272f65fad0a4da4627de7b6941ceeea00b12e5f65dd428ed7b65945e66f1b2446942e967bc6c29b72db7b7d6b3d6da2f253ee80e7ea10d7ffccd95a2e79d4620cff3dc73c6ff52268f47f99dde4b81a04a667f3385485c69559db5e0cb3c279eccf364db7b47f6b76e0cb263907d4fe579db6701c2b1aa94959ad27a4ef9a01064cad3cbb294e10f4e945e9eae40824be92517354ad3873f74519e706e8f0cf52752cc7132a5c41f4fa3c8a344a5c211280c4b99b7b9b2b31177d8745d8da892853f7e88fa310582a313d39f5459408f567aa76e0432fd0965adf7283b3a194f3ffae95140a7d33d9d4ca9ef51fea871343d373a31a5c093cac34ee53877e5261cc894f6ef192e4ed4c8bcab39e158d5b523d066fde8befdcf7b0e3c92e92ce57559a7ba2a9c2d06276f2df1727b2e4894aad2cff88046c959a92939db590f7c31741e25ceedf1ba5367372d3e9051b64a3fe3831367804003883070705aab7dd9f7dfd7f1f0960c444541dad27f7b8f13dd7994389ee3178b1ec294dd3b11e57dbbe47bcea66c9ad253e908f2b7bfc4553a9038d596a5e446289df79b0a69d301aa82be236fdbbbe46d5b7eef5d224aee3dbc971b75a04c26d4dd4617bc1797e0a8b63394ec069017f40189f27b530f5a4aeeb9f073c1724a748c8fc459b15253baea4f56ac13930ac9de110af7ae42b29b4a897513f8819efb26c6bdd7da72b3def2d255dcb5560c287acb5b5d141bd7eabcef9c6ccf9517c996374b67ed13a72d0c1165f7564bb96139a3bc1f86516e67b66451de0fff5403be4a66bf7149687a1d566ce98fc495f6add48c50bcff54b2114af7ae926d7fbdac9175bf0691a5be1ffe17fecdb9e517fee6543a82b60f7f0b5547a10da5a764e13b1714a66456068e566a4aed9e230b7f84b2a9b8b0e3902c528deb08fa7efb4f75e41ddddfb6ecacd8123459ee01271bb8ffa428bfb736700f6e395382ef71220892a4cdb6b3d3d96e4300428d0676d002076a7077ebc30c4eb859bb214db8fb6d02d482183ea8e0030fdc7d030108343530e20b1913b8bb978022d0b059b47e60c4dd6d0b425081e2c5000a20e3ee360c1d0481450d23c038c2f521202602990bdc7372ec0966ea0afbada238af46a9ba26d5d418ec08b68aead726ce5248281b709dadf36641291f11d588b6ce9b852266a6d1ce75ebd64ce3a4214264208ccf49d1b316db2f2455bf68565b5faf6b342275a7279199e697ce2692932548ee7ee4e49398eb95453ef991cf75a7bfaab019ceebd646502bac1881156438d1e2e48874c2c45dae3fa570228299b5517ab65a619aa05758e1ffb7c6dd6d70d28502b8eb6c6466258cae19499de5e8b85c2ba6bdc66f7e2e7a8d93c800ccc0dd9da554f46ba6fd4ef1b962a4cfa9fa3a3df14e5524288a914471c2d259ff466b1896cd4fd58c16d554f373d1a3e88983d75ac93262e567e5d9b9d3ac1f7f4ecfd99a7736cfa3554d7a25147d143d93fe754da739cd5a8dbd7eada9313c4bebdac62ba6d1f0d74c75a5fd0a66deaf4cbb9257d0e7c649f9c8b374ce493b17bda99e6ba6a5e7ec736ce85bd0a7792679d6eb736ce7d9b9d71a92a740d00e57dfacd51439c964093f7aa94df0c6495ee591359fb073a7d90cd2f995621417f1c0968064c2b93bfe53ab340b822568621a8f412ef9e2cec2af1376ae19e9ab2ca9c23ad7fd5786253b8486947491a489925846ca3c4e2a61c1f52ceff3cd87a9af318a64cd518050f75a12352e98c4003eb3202031c35d356b5a470421a0e1d4b3daecbc826756f2e7a257775e5f9fafb44f14ef5575b2ae404750808690e0b83522cc1462dccc5684ccced738e9f7799af9849da63afb34e7a29710a54d9be5cf6b4e7a149feb7ed809539fa6ee7d5ec949b68bce1b2d3ab5566939b6f56cc59f91d422fc39b655fd660ecaa6fae448927cae43eb2b3d5bada2596d45626f28895675e335ef53c3c0cce689a4aeb4cf45bf756da686bbbf9c3482ba3b08dcdd5a6166537da5f995d0fdcaebaabe86766878ebd9b98dfcf0806c0106ee49ea938cd2ce750896a5f0f878411d32cd1423597394575a53d3b4dc1a37d15b67a333098ab73a944d15c9ce42e699446bdc64a7351589ce5ae797ba46790dc03cd7352341a1cd92981969cd3a4bc9af14d7b40eca48e77ee134086f9c44d35ec8a68a24293f395af16ccd1b4fa1cd5626696e82a2e54cddba86249b2a12a3f434d31c4529bb8091329aa5c43466b2afe427a8a6cd5626796393f6827926c91ac7a2a4eab96baf7c0548cad6b8899969385735b66b656d6b95490f3910801c82c6ddd535d390511367f4d5fd7a9f45bfd37cbe4e18ac063b637aca10d2dd7b9c1c72c57dc70701783ed519cdb315eb9a7a22e5358a5e593c2c1e968f9c1ca57dae98e6007094c39c14b2a4898cd273d5c9352bd9247a65a44d4b91a7e11751524e2d10aba44714778f0068b2e05d443b6bd79be909fbada648dc9d09775fc2dd957880bb87717707b87b03dc3d0906b8fb029070f723dc3d01ee8e0077ffe2ee46b8fb0186707721dc3d0877f7e2ee40b87b1777ffc1ddb9b8bb0feede83bb1bc0ddb7ece0ee3ab83ba7650d12c65979ada12786a9af6c3e4c55579a8ac40c72c5631a1351f921036b71ff4f83cc1347c95909f9d3230c4313eb8bc23034e5bfd1d1395a47bf5433273df14c473d592cfd524d1d9d96a6ed1d5bcd40e5736c280c43d34e3312104b6bdab95f98363b3f9f286d8673128ecba5be99352e7adaac56f4f877367a1c55e85939b67fa759bf8b766e75bfaa51fc3a9f288d867fcd678ee9dae7a4cfaff4d479ab4fdee572bd901b165ec89a4f27392bf9159e85cf194694aaa75e3d91a79d9b686754c80deddcab178a5f4444fe77465755c9ebe87c5ed5d4e8c4d9bab6ba5cae677d8eed4f5723dab96be82b3d5fa9e8716e68e7fe3369f566a6e1d4394ae88ad17376eac79fd6d69c9daa2bec53fc72a178b6ea14e7d9efa06769b4f642f1eb315a33caeba7e7ef34a72aeddc8f4d13ff9a3746710c7f7ae25da4bebadf95338c08c5e909737d8e6d94766eb4367badcfd8d0bbbb4b699fab7aae34d7afa756d5a257f7ab68e77e14d7f67a22a93eef1a6da6bede85e24c83e25af389d2f689d6669f33eccbd7c26f16ee3e73928787bb19b46b50f0baaf00e5b5b6716a740aa12836cdb2d66abdce35a7d98888a65fa74ecf755f013273fa42eaa40f1c1f228f1a3a318d6369add5e2f982c70b92e70a777dcbf51bff9b79d36aebaa226911113d8112242405080622a025a5142843424444ada1fc4ad53447a7d5a21111ed55a5d16a3aa7d5cab373a7b5b5c708dc7f5561abd1397b357d1d90f862a779a684a30c65a315c790ecf460f5c879652414c533edd6045fed5881673ec58e1287c185bd66a4547dbdba5f098de6fa82dc9de6a4ceeb95a58dd233b689d64c7b9d3bcfdcb9189460fadc589b79e3bcbede283d73d1679ad2d63bcd4879a5bdbabef0ec85b8aee0198f1ff23757f08c878e95157ae6d7ebbc15977b951872c0b8cb10431538349c215e8564410cbdb268b3d7153c9ba96ba6e1958a3e9b27d269beba7fd366796feceeee960c7777e2240b4d62fb5cb18ea6a94844af4cd3434630bc324d489f3aa77989e5ec498b2e5657902b4471d6ebd5272b94a0020b4e6448d5739f66aabef24a7b538ded3c5bcf9a95bc5a23fc6e6e51e0eed8c99b9e2026ab262aac602889a8d5d2a97aea34ef2b39cff00a9b72f4ca31242930c016ed7ca7e58914f934a3441b96512213557de081061e52b8db9abbbb9ce4018075a7598786679b1307e060f0b2d8da7c2244fe66956694f55ab50f3ca89a70eff1393034eb2742e477cce8cc31563632730c434148ca2825921ff257cc33afea2b3d710cc989374e121425a63193224568b395c91014ef54a5e15cd558913428cf884ca1562b9feb26a269a46cae38294d529318e9d993a3978a1ed99868a75917f9a90d7965185aad57466ab5ccad89681a2731716662e21c7bc264abeacae3a386a4d288aee0d90ff1274c78905a2da2ad9af808556978e324a97ac260e6ad4fbde62830b840c34e725e878ee42237663632cfb5a87c1c3308af38ca6ac82bc3a05f44e70d8f8fdae3f0f8a8ad320da726cab55cb34264c63466d26a9938c7885e5666445666260f27701b70770238694211e8592beac1f2c1e2c95161e9999351fcd2664e8d4ead63db8500043159a2e49a6e93122890268d0ac870772a4eee50c3545322ee6e831aecc05264e673dd40ee9ec45b48dc61aaba46c9a6faca49769a7551197b6d3cd3a793adaa26ce5294d69d02a1d8c459ca56512113e758a92e49d573bfce75eb2c259b7835a2bd6074c2521589893393971527566649320da750aee59a0062af8d69fa4c9206d1662b932bd94c83b4ceab11106db63271f7d28db4e08ee634c53124b4d9ca446f4da484d1bcb65a4444445b8d691a4e85f2c65bc8283d8db0d6d9090d1e80a30b2d5a68400cc400c11229184205042f0b5801938d0a6011c45341c34d7360811d3a803106851a1d9a2020e565e429420152489183039b03d890400b2692d86082a11e88b4c07377216811deb5592b88998b5ec9c47945b1bbdbb8fbca01e09e224970a57c4484e297da8443608425ffc1eac1ea9193c5e4b8db2ddccac08c93365a5c29c59fe2d8fe98c619063bcdc79f9170ecd5fddacc39fdd8eb8c253d8ed2aacef2ecd59d9e26565133ef576ddd3a555faf84a6eaeb93851fa6c674ed958adecc9f8b52fc72f71f77ee07016e0e7e64662b2f646ffc7863f3b5124e42f19b599fb1fd668a3fa671ecb3a9a6d8956b2886a1d532739a04259b46e9197be1d7e7157f9ee20ee4871b71f7199c14218ad36a47aa8afee061ede4149939f95c3729c20ef76f65537d7d468b70ec85f39ad6decc6bde69fe567aba7b0f77df01e3ee3aeece72771aacf80f775780bbcb9c0c017537d5175136d5f45cb78ece48e73e67e74ad3c12f9f9d1dd88e8ecf4e109c7df4c82f9e203c3f80f414e5e48dd7ad8b6a5a47ef9a7af4cab197ce3e8dec119699f73e6733f56589b08e5eb8485d3f177d8a5fbf716cffa799a6befaa4072408526c555d5f07292741b8b2e6a2592da5bd1246b394334048e2ee2aa43aabe69b38c77ea779c551dc71dc5d06277370e1ae5796ced14b458b66796b259d939e38f6c22ba6e9e89d5114d374740dadcd6a2f9dd7aa593beb739f284ed7bcafe447f14ef32c55d7132905f222dc9dc8c91c4836363a9170aa93f3ba8b7474aa9e2f163c353a519c6938f5aea94ab8490b2469c4dd8c25977fb3cf39e78858ffc058b3b3613fafb15d081665411ecec737223813be0b821db759eb225c965fb702e05ab0fe09e9bcc6b36eadedba1ff774dd5abb5d26d67ef65abb79345c7bed77439062ad673fbf76646dd7f356a6b7dcbd9c17cb597b4d5607d786de59ee6ed95ad9b5f6822f5c1dd75e8fbb7606d75aef5a015811acdd2e68a6db3e940dc15a6b6f900b02b85905d86bbd6beddd88ece54ce18f2bda22a0ed786c44ec772fd76333dd6b6f6a7a6c01b81e27255b94eb9cdf07586e5b71ddb59b7745d82fac5f2749d2ad5bce5e5b030bde15acbdddbd9bb53eac8e05ad78efbd1e12abc2bddcb53b1beb340298821d6f90708db0dd1dc17276b37ea3dc3759ceefe9f9bbec0f9ba7cc5837e281bb59cf729f1dedf6e55eb0b5d99fcddecbfd15c395edacfd76b81e27ecd86bf2c06badb59fb52d7bef0a36cf8697db90acead6acdd726c78ba16fcec35724db826dc1236dfdcd658ef5e3b72e4c6dd11eebdd6b31ccc863ceca9bbb6b3281f6badb53a6ed0770aaf2d02c5ef5a0158d0daed5ace32b125dc2077c73dddef7676b3d75edbb225dcd3fd38bb759bb53e76b32b1b5ad15a2bc49a704ddb6741ce5e6b5bd67a21dc1c96bbb6e36c907bb2db35c16edbbddce56c907b2d09d764430b72d75adbb2255cd3b7590ee4acb53e6f6d5600876c2c7476b3a1e56c6c18b64e5474986001c0d97bbdfb654b82b0736262edb5d75a9be39fd35c862cd68c186ae01f431264a0892115461953f0171278e1055ef8504a052e944409b210c6c2a52441460152522a1401242133230afe61a4491226e48009deb11324091b9d2018d584cf0b461e3e2993ed79815da3c79566013dff0367b9d23021c7b5c4c5f102022aceefacc002181c1b9ce07af18417e18683c13183bbba20fcb91cdcdd57d02b0b6f6c12795a4c288860e90bbf9043813d5fb895200eddf04405ae3c13f8c3893596133d222e691b371b1c17392460c943dd2fe470c6127e24b064824134391cd40df7878eee05ce7a4338b044a449121b395ccec435b9e1c1120c705801cd0db66bd938c1c80d972361cba1d954918e052d963cef84285a40a839a2c3b6e4061e964608a78839c41c34280181066ad30e9686ec70894b08f20bb7b13be20cc0e50690437925d81a1f378cd18070852d0237b8bb009cac62c7cf247d7e118d0c174e6609f50999983bcb54424ff509191b77374a4ff48c257d4945086a6b8e51a1434e31c6141498628a728a142bcfd457d6fb9561b0fcd9d4e54ea29d9bc4800c304084bbb35c6a2cc975621a4eceb0c749b1d78953db2fecfad20c62e235b026343c07dd182aae57969aee34cf5427add650929a5ea0870bd070019505b648c2024158a0b48058810b54a001ce72f22cd7ce9a68cda899e2d8df7c7abe2b1fe1dd6ab91ea6aebec7ec2617b976164aa1b81ea6aedee572b9948a3ea72ac6b14751fcca6f0ee5bcc284744ddd3375855560891468b83b4b6b15fd5d533fc58fb36b455a8d2549b184144baabae2a4520a26ee2c295666a64017beaa27128ee5227dce86a080119ad246717a2a61690ae89c61bf9a4019d68d0a9bc015f71b75ffeacdd73849680246deccf975254f00c53a8a3227d297641457bc6646c1c43d6674c65e557714efce525f55b7183374c468c03d27af34a5159faf1396d37c0455d5a29c571851524e5bad21a2a49c6e9d4d312240c105144340b1040a974017ce726d555d5d37aefc4ad527abc759d5a49c2aa13475a5d1f0dfb85cab3f596bde2896c01212c0e2ac212850a42061bd52117e02064f7c7902f604e944154e1839d18213354da46942024d4c89401a7787c1c908301181983b00fe595bafa70a6bd6ebd189fe4daead7bf519e94471ae19dd648d62d80a47e3d8a328264a714655b5e8cb6fe5b068e72baf2dd7d6d9747d0e8bc57aedfc383a1be1352ba558a98896575a4e6baa128e99f1ab43cf5a7311ce8d2bd74ed7a779551fc7c431738a89325a84899eb59e3bcd1100995001134c5c6101009ded188bf52dd64e71d2d754a5cfb373a31024089ec1c5c44a8b2544b0c41567cd6a5ae3dfb5a23cc3429fc332f3a6e5d7958caf00292153228854e20615103021d0e301633c808807e0f080fd80d50336771f8093619a0072320c2c4ccb013b7040051cb0e4ce9ae93f92e4d5f4559d9e503e0745cfa3df6a8a6213c7347e259ca48f5635e95d2e33ada178eb5a12d8c78c6a6a9aa5b88892724a94aaad560aa5d51a72fdbf799afa73fe594afb3433ae1525e1d54cf18b28af359d66d7e7fcb7a4b06aafa6284c3533ce6169bd669a8a83e2d7b9cff5b56b45493e87b5aa2e174e4e52d15cf4fa7cad42106b5d735e95b85c2e56aa755e6139c3320dea0a237ae973760ea138a6714c85a5410df042c3792d1b1073774fa134c088e3a4f7067812689450b406cb684926b1c5592f1c33cfd759134a62c78dd65a7ee5f5d535d39093aae9e3284e824103860896998f3809c68764801aeece72adeabb5c275066c0160c10c29df5ca343dc3457ef4d48a28651794f2915276219bea8bc7478d01bfb310b98033dca138b9001c16f02389930a30c3dd595909cd1bafb5d70b2769a57c5454d3eadeaa2a4569caafb0c20a2bb0308a9e2e900a18e3fb9c650510c0dd5f705201211230209100f32cad94aa2689848d233270841447843922872390dc5d004e1e81420252908032ce42519cd73de5594a6b467a7dee349f2cd70d921514578fcf61dd64a453a7af5dad967a12d1b4eb358ae2d7ea5d37422b28ae6ff5f81c17518a5fae875dc9286da6bede25e4723d4c752171b96e849e8547924df595948b3899802bee2c1aceb1d72a14cdb2d665519e2294002509c07177ddf45841717d0e4bfd23ec04286b1c8b5264486bbde6594da7ea6b056ab5868a98414343884c5445c04f4e6bfaf5f94af9e84d5415a2b4cd1c7bed3349cf5065cdaa59d354aa7c8e0d21009ca10a952acffa23552dbfbc2029a7458686c0a034516349455aad221affd0902157d423288a5f5f7cbef830a20b6729e5a3a49cdeb89272ea5abd1954eeac8d9862040b07f082b56614c5aff48465f3f599c3d2b5d83671de3a3d7150141fc088bbb3b6aa4a29a28b229a28820877b771b2082c45d4c8228e8af829e2a70815dc5dc84922b2709d210f00d6cece0ece4e8f67e151fc727d463a37463ad76c4ef91cd6cdea8f24f99c42f91cd6ec6cf239ac9b1e2b289f5364c8038045449463438e67a7d1b9aaef12723d8a5f3bcdb15d2b89c8640cc185bd19021dc205aedcad0a160577cbc3c921c821480b0077abb23b52eef64fb02548c9287aba90949f98d9549108095183bb0bf142106b44f9012224847f1fe199b9aa9f9e592dc29fa4a647fa94f22ca5bd669abad25ea5e40788d6aaff1f2042426fe69d4d960a4ba6142561e52315293db50a53631a33d97a3d6b2bedb7ce26aaae66efe49bb0f43e6727aa5b3a8567c5689faa678eb9f2bad5f461e7dfac3e6b142b79968bc747cde5aaad5be3194e5dacad55f473d17faaee547dc1cecfba865fb9e85d3738add6d0ca15d319a6e60c83a9337da638f6cab3175eb7115e3352467376cce8445fbf54f45fe7d6278a9643f27e65a4c73743795dfdeba4a9fbb193676d7da2ef2a3234c435cbb1bda66a9ea95ad7643035c7e8b79a5e518f3c2b273d1f06350a46f59994aabb161b325f3f6bcd26ce319c67317996cb25f4ac9b7dbebab50a9a8667ab7f96c64e70d61cdbd948ddbf6b3414df7c7afed0b39204bd4e8ca235d80c3f79659a50d638afaf34481dd266ce4f5eea509ea94892a4665ef3464f25288a91745a76d8c1ddb1dd119b61fdb966aa4fcce041052310010f6378688287303c1cc1c30e3c68e12107779afa3728acbef53a7f83c22badeac6668a678f83c2b768eae3a0f0e9eabf85a37f062a3c482179f8b959b586d6bc661a8852351552d72cc30e2d10d1708e69a25d53b3a9eeac51f43c228aed3389e868c5b3bc7658e850e5071dbc04630627c1c0e2241855b8bb087e420a2e4290178071f2051770f2056b38f9c58f935f4c71f28b1b9cfc420927bff080935fb0c049303827c120f2859626ea9ed58c566c02ce1176498e294a6c0a640e3eeed383b593b35575d5e74ce7a5cf59aba5af3889038ed689bdf2fe8df7aad2f2fa59e38cd25e8899d76c6474c63eafb58c74ea34c3b2f938a94a15b70a2a266073525ea730a184757756d62afafa2bbba6736da778c546ff34559d129a582f6d66f4f5a9aa715e7f6325a189a5d34ca3e1d86b5c8493563c8bbdd25c94c21ec5e72bd3f4632402a460dd890d82c22103777fd4c92c46f4cada57721a7503111de19c7484f314a157462232f32bc3606633ada947fc65c3cf0fd658c37eb14578a9c10527b184e18f939e30f589bdf2aa914dd7b054b0f0f0e16401c8f02456c8027c71f794995f18a5e5f555a575c8e228c0104b27a9289a9e784d1205cadda9b08003481abce895b5b3ce48ea2c34a5aaaa69347535df4c71aa2a7d5a9ac0fd89934a4eb86b149f4586fcd638a3bff12b15a151fa21affcc095509d8d308d8673ac0564aeea2b4b5161694ed524ba54cd9a90894429bb609e664de80a902ba2bb6b4ca49ab59db56ad674121796523e7ad5ac69974b356b4252dcf34c15caa9fa6448356b1a298cbb034122bdbbc6492f0ccba1a96b9a8ff0b61cf88513b190071c70258cc4b8bbdb30c303ca408228eeeea62a28fcd4b8b8abb093a846f35a14f7da0fd74af9884813d576d49c0cd744fb0ad75b8a8d841677df3bcf76959dc4ddd3edda0cd72dd066bef5eafe1a2d3ddfc447f4ca6ab55a267ac65e2d77c781bbdfc0ddddcb00c158afb83bcfaf60a22a0dbf542757d72b8b07a9d5b2b2390fd2abbb66ae2a6ccdb45cdb1a373180ef6cb4e2fd4488fc5a7b6d01b8591da944fa64dde8c77243f4387a950296c759b39966bd52ca47444a4544b1d78ab326525a717a16b174769a8590cefcca52cc15bff499a454c24ad5333d3fafea6c069789738c6867dd6ab9a87cce42cf72b9d01a7e7df9ac3c94e4736cab480690a6a751fe9ce4ca349c668a612a0cc76a49669af5efacf45b4d698fa2e7d69f57bc933e8a13294c9ef5b467cdd4577abe5ef1ebf5696624acdf4c315651b348cd49b9966b56fecdac71d2ebb756631aaf3f43f30a531feb13c55b09cf708cd21367d5e79a61f877d667ec44f19a67394653693a9fb3c7afcf9fe57d9eaf37f3ab66a639b66770b9a8b8f24c1572bd3e5f9f38da5cd5a434e859a85e5f9be9a97e5a3e6b6b8cbe54adf156d357f39467e573dd5a857dae99b6b366cde07251c97acdb1adbe9a26e1fc30f55de73ed39328555d2bcee8eb73518e12bad35cb39275aabe567563147d9d696d67fd34fdad67d13eab2f5692ceaf7d25a7eb0c4049a02069b592d4f4880845731295195cd9545f2d1795cfe79ab4662435273d0e8a53a353e31cd5e875463a8d34fe5455f5ebf259a689e61386f33a0d7a9d9e341a94284a47ccbccfa233a6ae518cce23aa3a84374e92d1228c9e18a9dcea1373ab4fd42766fa424c6326472f15d5af93a60e6de0154b29ad19297f7a667737230c1a94b1c3dd6b70b288027a65e5579ab5ce44669a8f5eb808154ac2ab19dbe714336f7cae1bd3b214f3859d8586b6569b6c5d4b62e624d54c81b01838c3d4300c4d9aca8761685ad57505c263d0108a622457b093b4c915ec84353bb7ceffab0a337fab4f744acbf9e8d5fd3bada933fc669ee127cfc27985bd6994e2d8eb715e5868a6ea4fd5d7472f157df495d2f259fa7c8d5fbad6021a82f2e4594a68aaba5c8f5f675d7329ad78dda9fa324f6d94aa287e97ebb5c6d130989a4dbc6e9d67eaab76e45d2e5d5363a8e1bf48912178e3248f6306ad515aadc72932a4d582a15968c8ec8c09d1b09327f27955b7d0ff17e05b2dfd193d6933f5a5a62e970be801f02cfc297e98baaa5ba3b419be923f9b8fb7de35f5612acbcc35adcfd7fb4c6b8fe2ad6eadb44ff3ac5939d3a09c04c5e74e73463ad19296b30b19ad9939f612328201c8c43989564ab113551d72779f81bbcbc0dd6330869354b090546862844145c7dd4c6b9fbea043caa07dad9979c5d9fcd769a4369161051944320611c470c65daed748ef727d4e0ae55937f957d831a373b6c2eaf5ebbc62f495cd7f20c6d8004c02bea8119969d644aa59d39868bf709a11400ea0042e4bcff7f1e1a3c7a995f40074d019e94431112de72314c5446b86e914af7b4d6b44f9b5aa300e0977841bc2fde8a4c829ab9be2ad0a96ce3ba3d94c833c08a890e34d6119a5ea9af479a60a3d4b17d5f4c75e295e8f785e4e5aedf5521f76fece9ac8ccbae6513161bbd199dd11ce7d3983cbc1cd8a489f46e9b9f57925a7b63427b8732f3807c4f9a4c0ddb900bf26bba6e67dbeaa1f279b6afa39b6b7ae05c0dd51e0ee5b68e1ee599cc089204e0e2571f76caa695e55582e4aca4f183004a6279a9e9f8b7ecd4819862984c4b04ab75584aa78eb044652aed02b6bd766a247be74e0a4699d346f38699ae0a429c449f305274d2a4e9aaa7b8d08374020a96cc0492a689ca4b20227a9e0c0492a6938596574b2ca3b590588bb8b8e830472cb124e6e91c2c92d669cdcb285935b72e0a4014614c54836867d4ed5bce6d8d00851b6ce43aa5913d2422670f712a071772cdc9d04641430eeee36ca96a293887a03308690817ba765a8e44e30b6454c32a5d0cc08080000000033130020381c128945e311a95c28a558b3071480088ab260824817894190c39442c61863080102002200000030336d14a5dc02a3fe92c85aa90160a3e762a940c1c759bd9a62032aafba953cbe317e705c752922bf5080cfdd67698df8ec91124aac5937d944739edea71dca702d116d56c8ca7557ba4c0a0c22510afa9f55c45354946ca7c3b3530212aab1c1ea01ca516793315975bd94d0d1052a976a7282b2e8b02aeccb84a104b978b67797f135c359ac0466a6dfdb12aaf459fde70d4af6f6d29d1ce94d4bf344acc94e463bcc4716300abb7df003d7699823bd5c0a59167f520ac84515d4eb89fc5164489da774908748e109fbd37f68e4d487dc7c951c5982040f977fa97bc2ea0e84e98bd57a0d4111c885c0cbdf982ad04a0b771324ea2b195791f0c9ea347281f1350c49b9c348fda8480287516abc5d44c7d2ac30a39ac3f48e9fd5f0434023f6a81bf5d6a1615a55cae2dc8bee49cb5836ff3640d98bbe90a2dfaf778d6a96ffe2398d962d64ac00bd2b6aedea0c7e5f3448b10957d0abc11b87656ff8878489c582cecf71e5d951e32ef57278ae71ceb192a2eb6f6b8e3f4f740e387cd5c95741eaf3fd2b38c9ea4453a04bac8ed0e8e9d730f7eaed5c02516f78a8fbcf68d80820af9143bb2c2d1aca30a52539199c514d69909ce3669f5f4deb717f0a74b88f7253188213394f1db25667785eadb32714d1db3b53ee96a8e5bfdd952cee306210c0d88c504c3e8659486728dbfc99140dfb4adfa8388bc8109e0cd620f1287dc2c736657acccdd9964fdac0db0004ac12bdc99a639484280dc46a094bcdefbcf6e69ed3624d65b8227eae21e45644b1e834da0d851fcc6cf2f834c998e1846f583b7fa5bde23e10cc485c90adc2e1bb593e94ee654992c4bd19ac5e65ed53149f5d92b7b8694dc6d5c4c487d1a3d124d94903acd4f24b61c4bc130c8ed317751c744e21bb416085e86403e4aff097be60e8d91326cea5a6bb11c2e4fd74352e2c7a0016032f8e08eb02b101d74860af86d232bebe5b2b69c4562a3a8b7edf17610e184b1658cf4adcc990ebf8e2d15edacb53c20d5e4bbb7c7d681bbd62401afca152ac434f93a178359e33cf5544368adabdc37ec8209d9b3f83bf872a1f3a012044af22adb3a860e1e0525205ce262cc9d1bb73ea7693d338b5957cb2a38b75d339f7e786c7fbdd73269a9762316ac0f1c0ea91d46f6d30dc2a3fe0dd1bec208de96ee9e5f253b73904bbaec0df0ac1d48454c59387cbf86726e90c7a015b9c4c6e21461785f9a873f6e4b0cd940539eb809921439e28c9c04d826e2dee199d2d062ed74455a9a817c3e711d37955314218c16c922ac948565cc378ef960e90fb301a3048c45acc59bbf6b700643e08f919cb987a6f119ae319a06b1f379cdc6d87e1021600e3c17fe1d5250afde2c37c809e33d9baa7bd258981332cf7f5f3b8c132ff063acf6d4b2ed43e6d4537da988520c35207bd77e40d442f60b80002e11ef36c1c83c104611a16487d41d15df0ee99a238b31516567616ce194122295a2fe96b520149ce82c93137efc22f48ac7c722d4de57720250e8bb49a9710e728f722b983eb6360acc60d597a9ba4477373ae06b50711c9cdc9ab50cf47bb47ab429ca73eb6fd946d83f6b5ad43ac63bb1e6481b729a18c0a5c4605283175a8a91a383a744c571181378e6e430c855dbd81908d53279e95754bd5674302ffed84e72dfc7937ba47516336009bdc9e9b7b5c5291d56397dc893c7da6d56e05b0194d95adf5a5e87b5f48bfeff700d1181372a22d6fb6f7e53f82751dab00b968263a33e2868b3a42cf45adcdbc9614e2c0cf77afbe619a485dc35675c96aae2c3903f706a56bb1d2f2ae32005c64b4c1592558cdcc8a2887b47fe0d11a1cfcf2ee5bf834877f238bf4b4ec3b976f0c38ed008dc1c90d354e363cd869653fadee0d43714dbbb0aeffb59d77d705bb1090dc36d49f308df7542fc6f86af3b9e129bebdde19459996a9ef16866bd61a803843c2b15b089ed50998d4e7f4691cea693a37bbbde4a94360517a37709cef659b16a43713f4f8a257524def4af09bd0a1e6255d8a6eeeab9183e2f3659f525d9bbbc81d8cc25df7744079b26c918c32e98b5d8ac7cc0bf97c6a6468be999c03bb61dfdaa0f1c84007c33ba71f5650481534cb385954b9bc73b05d5f0fd8a1e8a10008bb4d95cb36574aa83efd6d2adb02928e1aedfffe00a7987d37a3d1493d6c37269587a2dec0988257cff11f237ce3822ba6099b483e6f5a57b561e243939c894fad6c272e1c72aed46cf97d4ac56a9554a847883bb8d99962a452cedbb457b606531f5e4ee6cec48839c9b6a124cf8dac287bdf1c0a9a9aa791801c39406a9617187339c399f7152dbc854977709f1781a2aa0ec0a62315378220ba8654c349f1525fc568f82c6b089be746668c28c96cca880bb07a916769d5f164c17bc9ad8f491890870709918b46264790d03fd0c2c2e83ff261edee1702c119680f0da0ca541c57cd752700f3d917d2da684ec23fee453a3b7c8282fe64479fc93937f9c2b41f04a6fc035372a99ca937b11443839d1515d68f31e810d27030ca486a892427c86cca5343ff86c37c797e9ae984b6310261e2ef762d9a3b7f6e54dedc49ce538b7f7048c78ab78fae0c3222c0ba639eba851c96a41d78ab2d82b79d65d5797da6fe10eed6c934bf8182c479c9501e3afd126d200858674f78f546c83755fa249afe390e2df64e16334b6fe788902c152f71af841bc0e0a5691cb0e3aefd51b6da187f0df270bc3b2d98214cd60e780d28d5540aeda5439fecd3e75f270d793b7e067f71b5a407af5ce7ff57cdb8a2ed363095d396227d91b799cac255cd6b5cc657302e2f53889d6e88d8747185002c5be168f160a7abd3aa6433636f33f9b059cfcc837316a826dcf2bb93ce333c3166dd8a17b0940020be4f220f8cfad539c9d933e67f4dbcfdf42be977c0480fe9d884361bda4cd0720640eefbc9f2db8d8a3620024cd374876bdebd30b840de8af213a288aa153386d35c952a3f6e90affb3a03a821359b1fc074f1c126e2a839178f19c017d4bf4620be8026cb4c6f97c81719c75334594c81fde9c46231881e820b3a2234a822627bd7454c699ce8c3718d7fcb8ace9c2c801bd58b11519eef886b436c7ba2afcf618cebbc251b04adf799b8593d4c92ea044eca2ca716ca95a21182b665a7883a55dbebdec10c689cacfca20ad9553f11096735d7f595456b7c08952b15ce8b68227676195e82c444d3ff85cb5c6a1dc34f615c3d0d4ac1592b57aa3296a40a39fdf79688fac4e4730be02dac963cb4134a862cfaa0d0ba9b4cd238e4ef85770a3b0312ae7df927d01037c0a5cc780a0b81daa69010bfe3e778f93d92ebbba776cafcecccf9991fa4e82a3420bf0cc7f8f59a600b799ac5c2b99cf4ecf764d8e87b489629ad4ccc961a403ad3249d9caf0b5cb6d15ed36b48ae49214f9eee6afba08b0df7daf9f984686edc0de2d1b30c970fee3201e9b1bb1e1f550f8cc51a834028cad7cfd14dfd6322b96f18bf7318db750a7e5fd1afa921f169d0331301cc2d6d589936be1ea8cdb7d2f269e30bccc107463e78c699da59fdf1ec5357ad6124d268745f2b1f431ced3b965bbbbcb05a7eeb18205a48e1538ec6494aeee1eb864afbe77ce89de2681d1df99e1cfe5ea5946d2d77df1037c16068bf29fcd72858397024d716c927d979ee7b3d66e46160b7b21e02c2d06d8650ef9f3edc299bbe3c6810cc080d9636c994416316546a99e5c9034be5a865877547e1084c7d5f60bc62fb9c45b4b17daf6f0d18a5b0cdc21920684eadd197cbaf4d6741718576758d85e6db345fcfb68bc835cda045fe360f29e4a974e99d7310e390effcdd2ed7d9be83e57dede553e1d8fd0fdbdfc92eef45fb3386c95bc359fb1b322f40d7130d59c4bd177c1d2aa60ab947ec492b170b1c91a2b70a8a762c87b5e96d3fc1d20ea193feab035a31931ad43ce4974ca7e454eaf0f38962a7f688371c3f72c186d973056d16c736529cbf50a251eb7027e9a833bc4b6256e0c150f16fe65d899210f0416963d54c59f17f7bae07ceb66be7bdcef601c7895e4bdd1edc2ddf11e5bf8cc896e45b51f83e2ba60207543ffcbe84d8b63b74318f3c44ac043cc10d4f3d15d072948895f244ccffdc48b13eeb9cb3993f24a299dea71704d722f904d2cc71940703b3e4a728e807c1c1d14a99120cb3accdd6587d36bd75ba35142ced62adaacbd3da4b2acbaa64bf19a1c6e44a584e90fc8cba1f5118d5f382d26db897f214fcdf1b63076a3d5f7b6c09bac9e827b32b62e3e95773c5291e5b5266eae3337fb784b7efc1f9d648d5daf0348e9c048744f386e7dd8f10fd78d525aac7e27ea98db2de146c0c442d2fdd1636a83fa69ddb0c0e4cee2d961ac567625cc87f123d7bfef65a7e3774d01e4de007f385b1294f3e24c8be101c9212a975845fc6d809132ccc14bbcd130e59c576f8e5f841b96264fe7ea838c1361a9484018c46c4e6820df0351adbc268e982f4a835a53168196781a1e88e4259944423feb8a8ba6ed42aaf75c19eb89865db12be1bee48815bacb27b8e59b104bb81a1565d26004fa3e7c312d125757357fe5f831091487893bba5a0e290447cfc62660252bf4967628d23daf3aab608d05c76cc93ae3155c8c22b82ec3778fc9ff18996e64a2359984297660aef9c8608ea4a9c3f7e873e1093359f40b43e7e00ed84ec7d118c89b687d465e81f24ae32ee28dd782b7021171be0bb4900fdc60746f64afe4a000dee58be069df1d042a0bce6bfd94a10963c6c9e988a3c3ad1c1b0b74695169fffa78580fcc950d1df1cae72c05e2c3ad5d5095fe125e7972dcc128d2e3a613df18d7767255cddccd0409aca899b85ede367c609deb07ee2516d41dea6f4b3b149688c6d003edf3852ca92d9f07d0fbea351436edda9ab4a8444f2a474e2d6f46ae659e9316b1d332a93078db6a8a9d86f195a1e1b3e08d96d6bd16c62171453b3ade0cc90ba2dd3ebe68452bf032fc7b2fb47b9c5fb5b0b8c13dc5b76effd40b53e837b3120cb997c4ee437143136e23ba233aec406376c0cea3ee05b2ce3099d2cb36993ea250021112bce532cb5a46b364f563d4f777cae4f6b3ca4c9d6f8fbb087d4049f2d9c9f643f5b3d628343cde96b1cd2090d8e0d28ceecea1d473b3f7c362ee484e60cf41b69325368cded366c939cfd55884fb3e0492d86be1b17ef61c5655e9d521751606d4f20fb002820035f77b600774d63399cf6f454c16bca6598d7beed09cc7eb33cde558041792f20f39e07344cb98b2c5df3946b2beb112aec11685aea73a54f67b837bbab0561ea21278af2666bff9c3419f651c0e2770c6db2010a710f5cac64ebde4966c8d62ef7d6d4f048c0fd693163e431b6fb3c63c8e23d7dc5430e7bca63a29197cc9a927180ca6533eecaefb12aa2d16ac260219dd1863e993f672a39bdd0521d469aa1fc692d65ee74693bf8d26c2457829083593903c189e7ed78dec0cacf0288919bd9ec07a101159eb9840f63dc44b9635058c6550d7754edb050ab0b62d49a110f3ca40726a437205397df6c07be937af400cd32db5f2300b0b304a47bb342a021a5f7d59a3fcbfaefdba9f55fc0ffc644b8b886e386d91885367204a9f9c5e8b25c7cd766dab00a77d3376a1f3cefdafc27237f7b5b54ef85914e26f0ed4e6065e90cd92c271c8913249d33a3f19834ef0d056d794d56dc5903440b922c070591e92e0df4523b7d272dc45432a97fd22b51171294214e7e0dd401418445b40e8a2918d523c56b763adc3f2867aca5f744b21657792d9d86a2031f3bd06c86dd69ce206bd5a6bcffdead10b95b9107b61137f8eafa30187a051b8e42120b2466ddf5e5191723141f802b7272d9a9387f33d29643af4457eafc6fb49839f1aa00c154bf4543ec0130206d1b301e9910fcd8bf6dc1ea1661845b3742e5cb1f34c15a698397ec080b05d9125f12425acef220fa1086b45ac8016f56f3ff6e47392f7dc0deadfb2ee5f34b17b106f74fb05d6a0ad7ffbc8a3959b49d643922ce62d59f59cb5f3ec7788772d7d4092264bac2b6963209aea01532a3917e6dca62bdafaa76b275d184363e988aaa85ac570e7a261a081d39b94e83c6096a93b2704b4e059ed836c4853574e296cfc300666c620867299456a1b3110ffd224e66c7e6d6ea5753f0a9e869825439b5e165813154158da8655e6eb6fb8161bf31cad6832f1b6e84d9c634c28a49f7432f09b5ed244f3763b5bba75a884f3dd368e43337eea00ca09e81d540dd338d720ae065804590340dd56604b70abac7dbf0f5e9a768638267ee8884ef40d93a80fd268ad06db8fe3c8af0ae64d3d00543a677d05941c4074e5c7f936fd3009a6709dd97395ebf693ec49302b2274c7f48aec92a2cce8fed39f9d2e9d63fc03066d82b91f208a1a7f825643a7918a5d0e92e32b086f88a24dac557f5c4fe7af23844835c4df2bde28ef730b8d8adf377798923f85816f8f60472b9a1e1ee5b556783034af2ed9e95fcad5f39f7750b80454a19c78e774feea647fab8f7d039f7275c0add15cf038ede5da9e2145591414d99ff246db0a128a625dda42af6013c6041333f0215950beb4558e9c77ab441c8bfa8fa0fee94d818729a702f448ef39af683407493b3456c72d330aa2afa21b0094a127f81dfd6f493c40a1787dfa1b675ee43bb93a48b46f29f6663b3dd1ca57862e41c252edba5fbbe655b92ac449db3a03cd791698b9f679f7ed9cc7dbb7a8886a7d5da6a64ec3efa624018def510ba0a22e4db16015a70a085ea328531e8c73e96566ccde65a9ce2ee07228eb382d615a4f935ce45230066198e1f7d527ad94a41e54f884895ab021c4e41d89d35afa555e61ee39090a082d8aa32fd53fc8ab90f2e2836ddd6d9f3c2e577ab6d91a18d8018215792642a6d04e95cd7af389902a9c91d15d182393225018965bfd4619b36b7acd812ad48e861184a41e689a81e238ef143d1002a4b4884b211698c70f0c7c0aa5333fc63a8db6e8ff25010c0cc9ce578b096abc14a38daeedc67f4d8120133de8e307202711569c0f7b2accdc894be3a77348d816d845094ddda5c259c4202b4a6e8b6a517ca1a0ebb929925e5a3466c287bccecb1232fcfa50dc8b64fdd89720039305529ba3905e1639a3dddf884a8015bbfe60710894c0ad61831a8e50c5aa14458fd897d313f1f62c72527afa1a093643d0a7585a46acf9097ef14ca021a45ea034e676f95b67fa8c29a69fd00da13c24297df4d38d4a973523280092b72687016f9699945c0176018eb8b56ce0f99e272879f184b009d2aa4fca3cc6f2e3048193c83eafc714b18d4ba84e42fb6ec4072fae71c1fca720ba8122a02c2f0066af042ccc042575d8c4ea60b3682f0249e5c2e811425286a57a5a59ffaec9deaa613b5ecbbdcd06ce0ff795d4b33c8a0002b0752160372b9a7b2d2bff7bcf8ed6e78e9bd196e90545c4d998cbde49a3fb5f23905a3c0f635961dfedf56f8a80c393ac84629d1133334aed6d3233c75793fe1780d37ddfb62196613b9fe3c81d7db448a1eab930491d232acf5c92ee392a7f9762cb7163820c8193c8b9bcd15b6f8cc45df669f7b1932f8f3d7d3ef7c6b59b51aaff8c0aa792c6266c5ddd132d4fe89f37b653584f13380fd560ed36089306da150821f69962f709faeea9c9db6104b5299c9ed41a7897da6f412f3517db224928b4418c55884137c3f7917145f4a3699e0025b450d69788d899c22db304b9656c098dc72914eebc8c4cc7f13e99466b0a401c448cf1fd641899b72caf42f4ba2f58d64a667dfb8df0c4dec308505fe8ffd15f9cece05e844f4bbafe24b5baaa9e2251849c80e1e5ea2addc2b11de85e2e5ed3611f5b03524e2497100889297e013e18caf258d28472cc7512c315ae90445162aa3abbace31d61f2402d514e7308c1fc7b7d59c512c051dc78fda152443be9adbc1dd25a4e80622181c4844750899e23a9948b98f723aeb5f590ab5aca1b4360f56c76d96200f17c1d52eb09354d9383a1b4483affab08c06022ec26bca036ea8b7bbebf248131edfc88a36d9c857f53211a29ce346c633dc4f8327563faa0b7162fc46dc13e7f2cdd984734667490e4b5c84a92148682f55c14206e002cca0675086a07e37fedd37c48842fc2541a9ef7065708e40a34c5300c892f038968be631d9eca3d71075000bc4a37fab99c41f5023687e95666090d051ea5f6c011a4064393629c39c82d3e127fb04fa8a8768580677ea1a2bda5674778410a4a1540f17621db281a0e8bede139b1dfa6d942b1c2395485101c58d0c6ea5c8353756608c3a40f5df105de7adb3fd60373248512648633ec1aed065a2e6d54ff96ebb997b2f7634ed7ad39d81d2ee7a1bec7d9f9749b96af61a4523fd2eedd90219635e55a37e0458aa998dc341a1ba21c68c602196ad54438aa31a547f9a6e7ca8fed580ccc9fa5d1f6ce7afa9f37e283f3bf55d7aae827d3bfd2de262f784561b6a0a8e6858d80de03620ed7f820e20ca7f97bf4d02b376211e4ae639183004b3d87d01ba5359e5ff0deb604883040c7cf482e00861dcef067a877c311abb19bd01b581c73fa8ef444c1c40a95611357f0a6bab5c1f5705645d0e20635c2e887a557ac3fd99b1e95e0e2b162269951537ef5e4abe56cf240f7d12fa17c3f3cb78c9851cbf2d19e472cfafae2d47485effef921620dbbdc31a03f67abc2bdb3dacea5e919976f2d67db0f7f34544e1f0be49a35b04955e41f0db850396b1ec41668ba9b617d7ed07654f86f5c377364afce1e4a0d512f2f7d76f445f1472f50399710da2ecaad9d0f6dd1a69fa2e0574ba0cf63a7acf28b3e4c427c7e77fbae88ac884721802e5a49a55632128eaff3f104f7cd938b6d1e9260ed7152647ba54508a78c20d8fc9305f7d19897f85f12f5fc72b5f3ddef73566686de0d5af6ef0d68d173f781d12cb5e6d133abc04c36ce11327a309e34b32f8dca98b33b99153d12d949265be6af2adf7e17f9943764fd972830b63b56f68d639e48e64d88874e2c1fbed2379ee19f4f1ef6f33eaa115ce42db47e49fb6664efe94539b8e4f5f71866f2995c095d9390a63145685359ddfc78d232686ab7db8c625fc6f44619ec6077e3820977fc4675d4fc965ff67c4727e65cbbc68060463ff9337f0dcc192b36d33d77e069fb63eec423a215dc93e6bfed7f036496a4d0c9f5914036c40574d855bef67b0bf83a319fcbf5c26cf1f6fdab82bb219fc3040606d70256e9ea55bc6b7d2d225962670fa28a6f8a30bd2742f56f431c8477ae5d008b8c99de2de81dc1a86ab8b0dde44bc73c31a06cea7084ae45328fedf0b113975dd93163f3b7d25af1408109b0857c37c849f1d6d2f9955b6f034b72b9fcc05be4c53a38fdabb80ff2c8c37c02936ec9ec1fe8f861e3d6e498678e16c9377816924ebd3cd4e9fbe2372c3b284984d26c3d645218688d6782f8dd6d18a8cbf81a9bd9777f79748ee77993f14b68a6840d3d5da0e2b14ac9e958d3a850764b5647f9c9647062a6ec3483eaabe7f5a7766f92c4527660d0eda832155415370d2390ef9a2edf3836f4f105838e347290b0296196a8a7a52d8464ec5efce9cbcb5074574021e1897bcdf1b1a5b24b9b3906c41df5ac674c4608020f742f5ee35bd3f8b1cbd77e0df8a73584c09b0b6572cf288516398587e97f3eea82388f586dfb1a1f3fa1afe17888c6a0024ad048b61c7a40cd36695704c1b330728620d28b150e2cba944b94db7c3b7ff2633d781119210712239c4c4d04f4d77119689ed1e2e876e019866712142d4007bb2771e4fb3c8032a27910826c057d9b881210bef32e1a35dc41f7d18676f19f919e21ee5460b43b37d780a2d34550820cf39f9e487f83e9cda199e63293d8db6b79ef67dc8307cbe36d7afc4fc7a4587fb88f420c04a34efa4bc5775f81ba6198c380674cd25d99ce2f083f1c719c002692814e23b39ce90901c24376e7ec0a4b95b186c341c3980d49f085630e080eddb7221ddecd6f39ed33bffd6f20fb4be6f03d1278459d631c606ea672f080288d972e83d82221d1a2f07e8dd0e19a660384c38d41eb6126b61219bb7c239150197447db6a34797f6b6f3d8aed71eeb3c376dd671cc5822242b5a9118ea3816d42f169e3c9d70e7308e282348445ed2a9c140d5ddc55ef81ba6c46d2d8fe9f403e28d28d96bbefa754ee8acfad02f3d89437bd33d1467305bf7dfd3327a0a3411d1505bbd6082de2c21517470ffdd3a156107c1c76315c442a4eded4cc74b382d12e0f7f5398fa31834b44d4142edbb8f66bd97cb37c2a9dcc0d69078fbcf20c87fc71b175d82434d6cabfffdcf984bd3c22a21f919361730dd672f8d73741df1e0ac0e0f3647cf172bb9953e3f0c9551777e9ffde05e7394bcb6f7948c4db5d316ee0cd498e57714463649a58b6b546c7d7b9c271ae70149cfeb0a6341fd3aed225516129b4ba2c69139b5102625c7e7a6f4864a7bb4bd50637fbc1a310acf041736327afdaaa8f82a5cb9ac49a16de739cbfa1cc8069781f3cf645e6951b9af465ef80e8b99f502dcba6389a39b9953ad3e02eb07a03200872d90bbb65f4169ca8d74818aab4f070617dc608d43cb0309cbd19b96b7807aadb29967bdd96848f79d2cd8a8b0d5a70d0b17534254933ec76efb09c19ac54c85775766e748d1f42a027ac55e68f937dc1fb5b8a9bf9e697226e26f34332e37c2268f35bc9d3ff6f2eb507b7771a3ac63e2fa9048e1adf4f5a07245ef21b8eb4b8379bdb5e1fc574811fdcb2d7e511d2ddd76e3f6d63d6f4f61109db6fb9381c708618f66af3c78a3bf06d8616c105475829ebd42178013c4dd584e6aceb8ed143069876d54fb838737b8be457a85366203d82ceaba3027c722bc1cde982929e8cbda1bbf81fdaf162412fbe95ae424529ad0955f79edaeda5d0efe1a803a59852bbf8763e22b6973f3c00d66db0819ea168a47dcdf5f731a076937af5a93af7fe867aaffbf22274034413cfc03f2db32a41d711d5e1c0a572b58a80263b14bb4b61d6665b7c8228a8f436ec03cc935f0a648f4fcc7655dbc7fc28a1efbf36fdbfab31aad68d34a0cb1ff31d4e57934f459c4e37d29da2fed9e3903cbfe69bfa3ece212da6513176d719a8a4c6d12621839d03e0b678c43440e9d98c7e708ba16f25ae7b2e8b9a86b62a98176d0a20f1213b7ebd26e6212002977d477f4278b1d8b72e11f229a74cce4d710e1431eb5ea13a717d2361fce025c027253be6b7dd18db3b437e0b7837d76f7a0ae7f0db4e712e72504e7d9102d1eb0adac0fc93cb848317290850a7b3b8b88bb88e793a711683baa037b6f86299687f2b489e9a62d439b192fa50122171c8494bae6d05fb0c2f9ffdd647f3f809850cdd43dca633395420b49cf0f0bde37f84d209aa725b972976e4fb113787080f393ca00df3428995b007644fd67b4a4781bfd177bbc3254d31cfe563137d747510f379935b8aac1019bd037f5f0d98a664a9973243299ab103e462ad08b88348fb079e7bb04cd9c178b1829b30823f4370b197d13cdeb83c4d881e9e8320e5d3a6897695d678ed8597415bdcdeff3b780143bdcdb20ef385a833b1d5907cdc3697839d63d771890217361b41b1809248269bb5f35fa0aef4fb9c1cfe872d351a1f65502fdcef4dd803a0c73eeef402c466e28e9914ab5d3e8c784dc90667bf0c0a7c6252fff3935b05694a08b19c8bbf5a03193623333487b514a40f0801b71ee8068d6a00a4c05ff39b353f18e05347d090fe67f5c7bd34183fcf0a62710b292159445ac9038fd6fa169595253031fbcb5ef86e8fb857930b1ea03c0dd0aacb9afe3b2001aacdf8681be3987936baf5721c25b7c4e9340cece4676a23dbc5ba76ed38f407a6bfb61f959c13ba26350502bfdc141f621da8ae94e89955fd4cfca26649dc89a29066831e8df1d48fd83228343ccbb0e0515f999d63f1263846c7b82fedfbef60984a7a2e3672d43c56d510b86008a82c36a3840e3aad6b9984016f6343877ef8105a53e999d43884739e4f0c497c37a6e206b298cd0c773a3f2bfa6a2fbeb0e36ee0bcdf9455bd16db4088ac1a68ad9e1553bdd9b2a5013d242f7522fbaea74cf1a6db899892e9500e4c2dc9d123ea1fc1b2848387b68e402dd7cbb4a63d950fa28cc8b6487aba270ea1913c894d432940fc3b7dca26d64fe4bed99053b855c6e426c4acc652952f63271326de362c605f570d300cb61e48d25ebc8a3945e422eb00d0c3999df258006b1c2d3a785def182ff9faa86127f4234df4aeb8e3a1cb4fcfd50fca2367fb56417e881c62496b457e41f24be53d594cb050e7c650ad36216539d1f01b26b8c748308de44cd3c3422a9fcc92a68d28f630c42a4ba3cc3dadf65ea07465c1ce9a1518cc2640db0c706fa38041822d762cb7b9ae5503285190b9ce9a7866fff38effb4c4499038dd5f72a1a0e62247893e2ba9f7042b82eb8d7e677f6356ecd927efbf9ffa4b17fede1ba3603fb3900f2555bc89855816dacf07de7d543b6eda563a3a8cb58e9b948ee8f0b537a45966bf46320ff8fdafd721130835db37ff2fc8b83fff2f84f1e45ce1e7f6ee775f02852db072a541a097ffcf22f8dfb708c4b1a934f2136ca5cfd8d94a2073d8a1a58d6287aa3898e9aa523d47b1f84f69f83fd0181729a57146dd255a1d163f36b9dcd311c66e3b27bf757633192ecfeb0eaecd72ae82700fd5b375ceb3b18bed667494d88b88ac76de07dc7c29885e33498a3c97c18f30b415a9bcf09c46eae768afbcfa638078e5bd751b4ff79b524f5afce66ec6ffe59714284f6af9d28555119f35ed6efaf7fc4e1186af2b773fff2a5bd25814f2c27e6f38d36a0f0c6f13543141df23eb18a4709a427a7d2a70b99bf2f97cefa233cc4091d1d5916b85d5fdf0b9c19f3fe16fb8fb76b7cf78503902d5b80b627347b3030141aae356e826f117c5c681646aef17eb312f70d90e9eb3d91fa9946dd2b7e474bfd53d1cff894fbf0d3b0f6ece349fe1a3c6cefbe954a5fd1fa0e1f7d85bb773ed26b386d763b11367bbd48328e7b0738f2f58af0f2eddb7e26c43f3f5fa66879d42acf06f204f470e7d9be53841ea83badbf0ca4befbd4fed950a834dabd4ee4d96c6be80fb67c40b84fc91a40fe758ebece429f0cf2ecd6a3b74c8feb895e83c613f8f9250d2f99f7392bf321307097f5abb7b00e8c96f7a4b6867d00fd8b39f9778ee2b2a34ffc08d539f2fa87761f7af78ce4fd43fc008d22968afb443c3f97fea8fc7084e1fff03e52f033d3953db8167b54f927ddb87a475b67145b2706c51f41bc1fc49cd0ba6f2ca977d627beff73f27f1c263eaa9ba6a0c665ae01f2df7f95a5114520a27604078c5af5aa03135a5e099dabb1d6fe9769d9bc434fc7259bc25b9e83443af8b254f473054b2781837b38324ce078352be6b30fa1270e7d5c41f609579f82326981b9f444c7cf4bd71e0d802317a5939118101639278842290b98ad8cf7fc53db0c8ac23d032fbe0b87ae3330f6ef20e1a4a1d9f3efc702af0fc25d627f5d65283d9151d2b490ffe571fa316a7a965be0273444a3b7906c224f34c5995abe6d1750bb04cf9cf84f7577dabaa7d10b5fa39a6bff3026cb83083740177098f762aa26fedfd6a6a30464549827ca283fc8fc5268f061bda5d7dc1196c260bd453cafd871a0c3e8310071670e735b670bca81fe70875242e5585c854d27b71015c27392d6c2a3f25f2629a21685bccd7a957ee96694f8cd3d3acb6782100ddb5d36f9fa3edaf2dd2c6f8ba6671b6a0f98b627c39d703285521237e0c433aaa9751e9c9b1931dffeb85440c9bbb07b7a97500b7e39128000183a9db974b23abc86b603a6156037445152b1e9c7d8666dd489556560b0deba667acbadbe8c62140c3a661e4d8c9479c1abf889f2faefcc0f68383f046273143a6143de7745a02eec26d9b813f4998ff20ecad1ea1ddf73ed4d06945eade3a916a1dd7e89feddb232c9e03ec92d1905c6a5225fe91cf8b80acdad48fc525a0c34d33d9576f5b0f86a937c22bf37eaf1d719ff974b2b88b4cd3c588dac2168633f4c23bf339058c89667c6586482bccec8749c13e7a6019853e9b9f28a14d50cd0013a99b25fae773d5cc682472832d556639faf5355a820b2b5fece349fa734d06821992040644d2be5848e04783905c81627659679eede049859fa71ed3c97ed9fe9327f58d3e0b81817777207abcfd0079598575bf6caead377b93600414cb6d8c49ef27c0dda5b204f18fc7b7a4f47fc96a5274e4a7f8cc380923c74b2113dd2875c50618fc0ddb98dd84cf82e9d35b552b87fb541491ab3d0a8c4680d56ab888e2494feb919e27046d80ecf5cd6ccf5b4223294b021a1742547ff1422663121938dc04cdc28ea928f61281c16840f42e7a957576e1fb08b1680d189f082c096e6138ef8637925341257af8d41cc97774510158e14871f3a107f2d25bec24607221355c2c66111dc1514d6156a689e43f742e8340689c0f6d264dbb9900046c97c97a4cc47d7fd121c9b967674d68f6ad728b4c4545fcd903317fd8f664380cb05aa05ac5274f3beebc297ab2e2ba52503449ea06561aaf3e574768b946fd435b5392c273fb74757b81c87fa0c9377c73e4722493acb8f910ecad25ff01747439484a9d541955143d553eafcc669026dc21d274946065e02f16e057790e8717aa61637564dee628a6909ca912fe854ff913a43819b69d5550115debd426ca39df2e09cea5e3ef8127e6a9b90fc8b3978af1b910c68943a5aa55309fe469b1a21adb37de6fb60c1aa976d32ed6e97240323caaea0cbc7aa01c883fef282e1c6f6c71a461b0b9146cfdf4080e943d090565f34802d9ffd00f781f67f88bd107b63734bc640a48c502c83abcb56dc803d3375e2c4fff8c1c1ad31d45d1cbbfcf3e2635bd4079218481f60459e0f502adecc7d03443dd7d0c817ea3887ee36ce5ba5b628e5cd98fb67e472be53bee460140febd26abe2f4e33f8d56d36dac498e6751e88833f2b31b7950dc8704c4c1750eb875bf52a2b10d6a13a0f970e8ee53eaf694419f97b8c670a7df6db1272cabb790d23e4eaf1b9f8604daac59150eef121707b98331671688824be08ace16b075e6e2bd8227c0dedc6323f9e7f0f046c6b178c79adf77069e7f497304e6997b28bc29299d437737c562666b4d413de46ec0f0c6542919297d840c75d92299bd556826441ce57d8a6c8e5f4574103cb77cbc7388fa5074ae2a46d630c6501179cf99bc66a738e31ee2369b518e40fb005470b59881345ec59c656741a5e8968b674cd2fce59ab63166a617a868564c4c94331e0ff880c9175fda6081169438436fa2edf473f433f3bfe1dac1fd5bded691d9c19aeb07d4f7a11f0618c8bb6b9b22e15b98b53522945d5371337a7685075cce0283e13894df04c670c4d9d04640fddf5992966d8af1350164120e056e689df189a849185b1409d2a399f42e34afec9b09462a44abd82a9abb2e6dbda0e508de9a3f72112d7e2be9c445dea77f0d67fb4c5b6b08b78ff35b43f184d906ac6d8261a21bab0e2d05753279778fb3a04e05dfaa69412a7975da7ce4891cb856d546513f32583eb2398d815f4f00a9af06166aa54d82bce8358bf2495ff1d0d78507493f46e58e2c921e08093c84547a8ce4a981c231cd24c2d4d29255ea752cf23c66d24355da842c2b508501d5e83d2cbfddc5e45563b4138106aa4b163d48d537311793edf8ca65bd729c4446fb1b4266def8d6a2e006f215d35a96312cd4b0088d859b12c07af57ed0a39dc1ccf19e8f15264262886ab908ed5207e3b181d45686d689aee34bc4beaf0acd38874f3023008f844614d3e5b5a42f5a292bf7d93be9490e0aeb0aa6dcff3ff661f49730255907500b9107244f426c3e3b4de309a6c6837394865ef944086c1f3dc29211ca928e1ff3ceb4433ef5219557b91f1351004e5ba704358328c401e19ab6b02d412d3c8a102291721d4ce9b6f165f16ff1931db1e1b9279fd3d359efeecfccaeaa9a871736fc572d26c87c06edaa48ad5a5b9fd82f846f9e4b080151fbb21123a55f7e838f148218a2b8e7654a3e4920b8dd4a5ac7c0c22b77fce8e5c6457a9f3238d51eb60cac005c5369a62f03dabd87789a9118bf5e4abce551fda14116db22060e43dafadc28264b13a114ec7745dd5def922ca96fae2adeb7ed1c1048e3e40b62bb1c56f78657f663fc60299b02a68b956438b598c8fb4ba22161942b3f4e76ac66e717c8d214941622475ac704597b4fe2bc34d424c54aa2897e43c161c9e4b0519e0baaa61ad14bb8645751ceb8d2c771588b4bab29cda0dd3d439d50f7d903af79f644d8db35cd376c4e7bfc79651501304eb3fb7890d9528f88a867a535b35fb33bf8416bf0fce1c307819c5c6893b0662e7046f8af0c3ed0f5ba1b7e4169466743ec7de0a453567d4154b8b7dd98ea15193f22838084cbd168d45a1ddd7fd61b87a59f3c722a2be45a84af9a67f433ce58e6b293305ed29a6595a68af717ca3ff6c56173fdf7243439c2979cc081ac5f83fe14c41226a81d71683d6b446be56e8cce0c90032b4aa98f3a72f9faeb4c0cab7d57aa2ac70b60c756099ab28273de4fd2d9b0abfc900f396fa6c5a963878f31d3c00a9ff266ce26d10e1196f3c5cfbecdf2de3409d4305a13b1de48f13f7eb162bc5dcdff13be351f7fd8b05b1cc9550f0686f3257757fb45d852920fdf7c3432846f1d7b97bd85c95accf2fe8c51db3902a8d33353006ea86ac4c540046e5963d47a318292e974716e0829c2813274c18e8daf7982a36a2f48a92cc34983ba711b61bc4ce0fcc645ae77cc85b17eb37f57287705645136830268b4800177e043cd9672e36e8a839311d9cc7d737ef1b9a856c6d188a8c9c0e839cc977200673cd6d683630f291ed8882c3797caded9a2b0c55dfd1542dc41fb0e5318921849a01fe68475c8857108fcd9038ec153ed0e131c74422ffe31ee131c90499b5ae8b3c2aa97b2d8928fc2958583c0b1d998e3e311a9ff3e493f888a799781df643973cc038c8ff51315957d91211e8093b22049dd94c3d38550a0da243dc674d915378f8aafa01bf084fe3e6e7ffd8a100798fd4289eee27959b137ac8b18bc6acc4b7c86bdfe4fdfea2729848d95fa384dbb343db89808656e9ff4c3db443d4261fcbf461365570025c096011d4dd4e35c36422c00373b21046e80d1c84657ba06f84f2d2bfe78ab4f2516c4b71f73303651cc244fa4d8f9f70f808d719aa5218a11d1a4cf213b5d8fc150168b6a09c456b39f15bef505739206dd9525901043a2c2ed10fe4317c626f8eecc4ceada15b70f678f990c7ea241b9be3667170111f7eb1a02326458f3d017ac82fe0e5cf693c422f6acc052a18eee3eded41ca2e193ac003904fef7446141810c77438d90278da7425a6a62c4fc1516a04962952472839671fabac114e80dcb9adeb4bce7c77d2fa0e7a4d7f1e8b844c9978a5213b6434206b4e0c7411263066b864397b79ee8cd96471800462da3cce27a9c97e25cdc235529d812bd7bca8b4c0ad7d6df2619c4cea7e18a78ba8468c61463b9419f49f80f18b6c38b189dfab7ea49775e430f112bc8712e393659f7d71c69eba1e01203821c5a9021b5888abaa627519758280263430f8466a093e2783c3d7c59ae8c5b4b1f933177246a19005e049897b620cfc3e205057dece084331bb5ba8b68effaf202482cdd1288f5c41984414b1b66ed725790241d13f35923b24caee9adc388f731d471010780319d81640ebaffc95e8e8532285f8447ab47ffb618d8f29cf28c870f0e265ba813db490e473f530f628f03a00bcb0dc13eaf577109c6a5fd039116d79aa54b30af8999afb5f21b5d4732dfa56f59cd7d26939c3a0d7726aed726624cacc651f1bddfa60c05c58e27a7b4d46ed58bc4d9e7028cb017af773645ef6eaac0fd657655c0b6a17f4394630832feb89594fdaad8660537a65fddd35285c87bfec0effeccbed9f71fe7bf87ac96def8d42312206e6a007fc8b5177260b660049f31b06a03550e6f9667034666903ef0678407e01fc5f54ad4e08c88346994fd131bec70b47725f4a000fec1cc6f1a44125cebed969210603f03cd82034424480f4b5ca91ed1dc4d6983e14d4bfa7208cd5d367a4bd37d090af982a4bcd1c09e1305703bb2841ea178c06843dcf8f0c21d6ef7121c859750b8127828e1bf921d8c2b306f1e4fe629972c4f47e23be68aa3fd934fd9ad3836766bc784c41c11f302fc49f64a6280b1dc875ceaed1b049797202840be2d32791e01724f6c653e28d04dddfe4f8d116c741252c32be3b17c81926721ed32a15670d1bfa877289ebd8fdc8103c7b988b5e1ace82d523ff783a50a38b12fee72d707b5c3d63e02ac45279a2ceac5035eab907acdcfd702343e995a3c92461db25fa2112006e7190bca416cac8556b1a4e741e31584407a2eb398261800e4c96ab30f5cdf4093cc0f334f6386b12c214b68fe155eef9d3b45e1854decc7411b9ac6020f68b08355d454c3183de1c02977906ac806ae9a143e7a63476bbe7c87c976dee67420323fb2932b9db731f61c8048957da3f712076f9f79886055a7e1975130f23b923275536427ae37b3dc6e0b1225ff374cab71b9cf4177350e997d16c0db5af55767040ee53a87c9495ae8ba8e3ac4fd65b5c979209e69539d49ab9c806261cbda9bbbdfd5a32b00c16d8137f46e9e97a6954fa2c1b77245aa57f605ade1562b950377789f0c0ee6d58023b18cc54bc177b47f792e7a9006e156f6708ad8edc2c4c15f3dccd0a95b00f7a618aa1e9143c4779543a63d833ca7cdf1b95230d9222d4fc1b8e17eb6fa1d1ba32d0ac03c9cc9900ac720974818a8500a3c01ca0a74d079c565c6a612acd510e2e09172c7bc8b1509c47f90a00c98d5bde120fd0b4d484998e76fc2aebc5498dded25b13064e510ea9264ce2bbd707c704397c14f38c3f5fb3a0e3c828f7d6fea96f9e1884236abc00b5d262ce4e10e703b6b479166ba818d1d83cf22b76bd37edc166bdd7b9411e57a1ac898b5d94c0b3d0e8f626dc85a2b061042ac3243202d7940036d8015ee78b866e927e65234b1ae39acec5ff27891ae5eba2587ab6895bfe31ab67a4c02344d29da71e4d462678c5ad8bcedc1a29934831e7b59e994a0f98ffda626ec93a0b8080d5a1cef1049ad1c8adf4a112a1ae99e384ce3f29e909021445e323a799b5e63cd302bb6d943308b47e01857f7c0881314a3c4687299212a65ea38d03a47115468fd8aa46f141b97de3eeace2d742e28601bd2ed6d3bb4ddca9043d0b9c0a6ca48cd35f30895487a3bbb40e96ebd0feb40e1e6acca5063666d13bd1abc7a3036e0b00f503a742a0fea2f2d0594d563cb7b8dc4be0180b7d777cbbbea19e970f0a1246babed474e2ef24c461e1bd3e17b774b15517bdacace97ce46cda5f8f48553470f44f55212d6576da2234e845ac24372e4d437087a2cd87b778af1021f2c194fd7296f2cb2b339920d4ca23d6c698292c4b4d02129c878e0f5043cd77769a16abce247ddd3230429b69654d714b4fb3fd139f353c952aab71075f2fe0d2350e03adcb2cf66f754952d3d3e34601c5b406625be1883a08d28f01ea1bb8a0d87af37dcceb75419d5e0fb70bf4d2abbb9bc4aeab779df1ee15668ca0f8809d9d08a43a11ece71ac24f9bb622cbeb5feee3218d4417f4c1907c893c4650aaa7d567ff3469f1e8a477f6132d1891e38ddb28e83dae9120a0cd3c8ef8867c76426d147719b81d6d289f9e5dfcef29e4a07f6749fe6317ae5a0e827be2fb66ca5dd7c89a64c11d8fe21dc0d2000abc33f9a1e1f628ca12d16ea162decfa4b02e4aac9377445fca8b36e3878c197ac0aaddf70c2078ec196cef86ba880ab077063735437075c939d07e5f0cb677879a7b1dc615fa631042b489a87b2d52103dca958316c880697a49ce763ae0380374b0159fff722794772c7c58107a96f34446ca2414dce9ed02eb759c3d017df3fbf8d296ba14b05d062b9f852a1ff2eec7d8cac5e0d1f4a8678b79d60841269c678deb418a5180e68cfd615c915045057ad514d06f650461868e52bbe3e2aa4c67434f08ade7726f9bdc30c6e073f67b7bf2c0b1422fbc2ad0a38ba89f940344f6bafca6e40395dd09307ccd800ec7543c42f67ac74da86a1ea5f13656f1de524f374d9dd27895bea67bd30f6dc705b9167d1d6286f216cf88e17cff93ff6a57e95337aa41face3a0059d80b9588831a439346626fea81a6f17258d1356811973c499cad4a10b2f362d59518974ce31436d0af86209b40d9f75aded6b19b50ca9531b039d20daddb070c73eaaaaf9c78361b6cac2926fa827fcd3c2e74b2bf2198715e1ea8f5306a0f4f6192a3627c283896e860283c900ba1e0f0c31529290ebb640d4bd3eb033d4a88119ef230a470f94e9067cbf024f4127f9086369be5ef9db74592a3447d067e59f35f0d49352e9c2674e138f9a4900993fe996779d71f5e2081e941214fdd4a6ca91b987e4769d612514d69a2ef92ad6c0df54729be2cda232d1cedebd3d820b2544b3de0635c64903f2b83d9bfab4b7fa785293d40037b6589f88242de87c3f305830994f09b7d192cd5249f963e4115cae0963b52b39823aa10e98ab5aac73a07d013433249de024bd4a4503d1f34aef6a0442d53ac5e6a26e1ca62c9a8dbd25ff8a45aa0d19fc02752f62116b5b72ccbbd9cbcd8069f5451a62b6699c242e57300176ba716262b985b5806ca4ab4ddea4d8d8f1a5f1e2941d119dd40e3c1aac98643767cd9f6b7af5c27167cbb6d94d39a48095a7f5c0f16223ca835d9e68567f0c4836c31585bf5601c98c7964822d99da8b6cef878b9684a33f1ec585cdf8818faab24e825f7177ae85451fbba0fcb2d8a45396b03422f7daa678928ec3329c50ef49621be1296bcb2c6d9c2794b0b9c71d3643b2b31b766666bdc1a5be9b1b68277d4e26fa7bae797aa2db4c31c8a864fbe91013af7e52eda741d661a12f8ab873583ceed75b6da3092e02f935eee04c40748938267be08845757ddfd8b7bc42941205e0a43119b63a83c5c421ab536427144ed31acddbb5af7e32b6ae98a160483f6e4ccbbfd046fb7cbc938ac7340e00870e58c8e4c982990abac5264f24ccd7a0a0587154a884c8aafe91d3935309afd84a72dd3b1a48fc77774ea4df4b8ec9086fbafd5617d255d6545fa737557c6ee6234ef5c365dba4bdc693144cf709660722ec218f79f6045436c01fc04c1dad910dbbd004302fdb673895a01c90297879ba8801dab6f4c5b9d5f62ecaa35319a94b5c2bb1d6475d21e765e2c42476b505f3b4a6c28ec6d38754c9734f6645f3b3f821c5f868719a74f2b083c9194272cecdef655af304198b2b62492cf80870c0a16a98d44daeeead24f52713d402aac27e75d7db683763450634a770e5a94eb32940ee8641430481d4a92a049e31dd037b12e5bf385062a2eee15f30593b208f82a56b32c89434612f87cf9b984a99d3686f986b32a3b9619df84a8c9ec596b11cf8b4013cd08575aa7d945737593bc3a0fafb96fe0364181319f6b8c6ea9d6771387c378830c22e4468b7bc0f3af34f4c00c6ba5e8de6ca1fa66c3dc3b1204c3f571681a94fbf24289e050dbe707692eb58a7a59466016241b1e8a1a8efd8a5e4676070fda23fe5800433510cc692e0416051f2373d9c5c69134be5893e30c855dc79ba775bf64196c4f373dd559c8aef5b3f03b076452ebeaf64956da5f57c72b2cc9c5d3af2a5e1d2ace0b6da4e4b73cbb71c4b0c5d37e77444a70d7a7edb0963bdc2c8f4fa62b71b23bdc612248303401376fc9e61ecc429c5ae495ea0a4822134fa2aad00681c992802e6e8a2c7b293075f137e63bbb798e672408125dd976995137592bb5718530e18fc96d464521a12c60c5d8c7cc082ddb48bb80f9b9786ffab9844444c2df07792a8e5a98dea659a85b6d59b45648033981d5ff2572435a4bfd4b48a23a2b2ada22c18ea50e50fc72909c834fc715182af3f81a9717a2cfd0d2c7b95d93b4b145059c39b063b3e4e2260cec4165bc121ec62d1b25e57201ce8e391815baecfc6bdb9a562db063b8c741016364303a591b44fd9da4565d4e4dd9761f00f8a403df39afe0f6a7feb9215a401c121b7150be92ee00e49b8caa9e31281bf064f93da327e56d88acdb8d93cb2fb5c07bba3e9d2cc5fa682cf672d05ef550c70a0ca403eb2bb00504ad99efdc0edb37a394573182277ec5d6b86d50dfd6e2aa44b2c6c3566ad67be443c6d1af4823bfc0194c54392e60fbda1ef5665f9da6aec8dd5b08e4ba77cf36e33ac73abc6d8b651669658d78be1d2f863816ea21d4e92682dba41f31ce8a1e5001af31543c4403e9b334c35dee967e7c23c83135e0acf5d54a22329c312d6985457d1cbaeda1511cf502a819035bfd92b87046072110d074e1a3b26efa0fc19674899a0cc74472f8293079e07df8fa2865abd2a39866864bbc23e9149af1dbecdf962a8b5b7c929dda512f74e739e83c8429b51851e30ccc214ffba70eefcd6fb5380bbfb353be924bfe8ec2a1492a614c24e30168943dc0a596d2ee3a44f57ac84e2bb947f3c1386b83802386c0764a13eac4c9d24c322ed1ef1d4ce7c99819a787de51673d95d6fd4d2c899e2af36c329a14cb23d66bf154c840b41b00f98f90b5370f949c383ff1687522c91f2b06287f469dcab0d4f69e1032b38b59ec34318c25d518085e9d94174830457ed83a9a3ae1309c1c77e246218e9a09e3e0f43c35613c5e9a6795c3bf370d00b669034af24003cf76c65babd8005155ac67ef16316fad623dd90d32c9915c2dac9d22f6704d729e8530ed154a5a9d2789d1d323a1ec626515818c385ce35e23cbe191c6797b0436d941bfc88d8d03fec2b80a9de7e86a433c3430094d21a356938e469aadd0bc797dca67f4a95c37040f4a7b30ad082d4997aea830c6693c78aedb75237eaa578a01795429e170d05d3b21378fa7b14908e66815273af833375f7b69132a1b01241e21d038e4cb5d6bf81de7da45f74489118e7d3efba137be5113f3d7d85f156f1bd56fb8e7cdd9bd396088c93cd84d04a31d5c78c52b317aeccfa93acf787e3e989736527f81cd20a34a86ae08f2aa97a65f0fc305e43ab8707ccd25db8123984920fb856c04250829c68a3879dc7441878c282b75a5772b8311cf26fb341ff1f199c990db0b43cc87ac77f7c6f898d76ec008e7120a7dbca5aa7b5ae5f8a00804994d45da3f04a6b8aa9e1451554f1f90ad32e3ec9f47e51db2cf006a3ab54782ebbf24bce3e39f660a79aded91213d7c991d71f8dc931b7e5933bef65ac3e0041c467528ec0e5b73bec0f9f1df1b36773e044c24f1e2ccad8f2c52449984ab70af0ae4eb9eb0254bb724fcc51711e1e0a3f129de77d01a03f91581e519b4fa510835a818ae22267a0a60b57c9f2b88c1325a5b7d92a9fd82e214928b393b052fcf0ce442220cf0bf82a473eff7f5a6686f3560e7d360bb157646083bc7abcc4966599425e8e0db43c553dffeb9a9d7dd16f6441e85f19d3d3dc934b3602e41f87fe01c5b4477af660aca3801b1928e6b0eb8985948811b44afe3c017927621f163462b62357aca4a1fe83d046fd182c12d99416d951803f516095e017e32653fd5529ae4c50f00c39c83b75acc1014aa510f32efd016493889c7cd75657fa2e8a179ba78c3ca2fc80786213865d551d702df5cb83b9d40ec6fcf389b26af21a9285ab378946e2ac5b27de93fa4e3d91142386624d0f2fb7d601c5145c12853f37279d8396c9fa613d5874cce783fc89d0e0d3f506f021a5085dcde7e5f18a99c48da24657cd4b44debf0512847ae7cce88a883c94decf7642a84df8b0ab5f8da6108e390fc28466a28eb2f89eb65901b8c58d8d445b1be18858d1439cc53f9d3b6e02129412b8682c9427e5133da2838b5c9dc307840a0550881500c652fabf7a24f199b7a169ea2d2b6e65e80ed102903c7f25edb94246033a4744cb058924dd1c12428ccb96e371e69b5f2d33252714583ba8a76a2f43936c3bdabde901c5d2fda9b5e59ef02117c9c846b620e1f631f360fb11842b3da9be45d5965c1d734a1fd67eebba9dc9a4a5cc7a4bd0ea17811025177f7066e969a50ce15bea92e626e07da5c12eef91957fc21b7253f9a13b2e463e555bbe78ac308c831ea7b40023e8aa6014a5864a7571c0fbf44e5d06e6a90570d0660c56df59fec9055c452786823041704abac2979f09919c50d1513bb3717094c710d702de1df64b33678b6df0845793b126c54776f066d13017becd4892e4fe830b36ff3c6a998849dba2740686b3772006201e0ddb002ec326944f088a38ebe08fc048f12ac00d319f3a4c7138d9405caaf9e36f1e80fa882509c6450860c4d420081c98fb00fb0214deaf2608ed0585d60921253282b8d68389136c2e4c53c31f460060521f06b5188c6de68d174ddb93092692afbc7bdebd6943d740f11540b33048220e07bd7c68314f46eba023da98937365859d1194b211f744bbd05d6228cd9316bf7fb204b90e4b826e69ad49018190a114c6484a7fa84c782419b9fa514429b47bf6112fb4e7e8b50e6a0b6184c3e8248055bdf933ed5802f8f2f10a094b3659607227e97eaed61a43188e43046cb5bc1e191229c82ad1db8eaf425dbca1e129f001fe3818ab8ef88f700aee64fbd49accaa188225cc76485f8a17f88f81c966a5fc5e44f8ab355acbd32ad0a54647443ac4dca9a6144fa2d16fd8faa9f519ab8b0a4f78c6a1c5ef824118de173bd806594b2188d610a029e63ea2ac0216692e6befe5cad1ed6799e6f319b038917ef0693929dbc3912411fac6b7a7f61a3269551244736c5fbe31520f8bcad70456ac89dffe6dc4664bfd92a167f6c5092023e30ea66d85cd1c605dc7956f3967912250ce8bec6fbcc5babc72dc29ba90283a7723fd76468622cd66b0bca5f2fb7193d14924883028e95b4f539c9acf7b11679cec22e4712c155b3eda1594eae064d08c3946075fbad39917b9ba32ca6f253fe2a51e7fd121d68bea23b83c5c89a29368a2282d8eb4203f3de504b0a7b1daa67adcc80c05641cbb360ff855891598d4043d79596bbff763fcf6f5e678744a06e3c1388041e5f33cda477fba281cfaabb860ad59f90e6f4edaced3b03d7dd1c75b551abfc317410d1dead86eee8a25d30a770e8d08830ad84041450ea3b6261cdd209f949d77749e5830eae6147c7f9884f4d6bd8380248ea662d0c13c85ee17c6cdf06ab66cb9ec624ba054bbce9830906ae34065e4cf53dee35bac835d1cb1867d48511607e9d9d150ed502499431552bccf6db3b9810403a6a80e5a1356c9ddb0b6ea758b04fad443fa087eda05da5d7441bfa7ad6944778a94bce7eb0ac7f4a83f53645457525b7ffb62fe3fa37c70fc19f21d3eb012d696385ba67131116e22ecccd668da47029c2253297c1efaeb5850911f899cc095b2daeab513244c289c375b8ed960f360ede00b811d64b66b94b6dfd0393950f1203a098f3e91e4f8d5752c4b9db5998e773a1b63f84aa1bc3a9c555c2f0736835a7dd4a13eeb0827fc4ce7396d8eadfc63a2a4b1a19dcb27f93d4c494511e9b37b8fadbd26dd06ce53a1fd62f566370b95249f8fc853fd9a3a803db6fb3c694cf0cbdf6484852fe79868a7152a2d104dc81b263bd37f0a515baf9ac34f6faa343c561759b71db5b950da7f45c1c18e61bc92cfd1084630d1d9ac28c5166bdfd33bd805e9d17c0e420881355f2ef17de81948297ccc4a5271ef94b4110c23dca4022c4b555d66a12f36b3a4ba7f33b0356102ef7b8565792549f2fc64df9025ba9c416c2b2309b41846eb65064397b7825948a0c2c56c392a1db86c1c907f07f378c8504cc1142ee28ea6ed49012327ee1461dc0d92a4178b0828f38372efff270f12604f895b05ae9e37befc44c1d47f1cd9a01328f091ccb858c09c0c771323b521175b33870eba16bd4b992ba7e3944f1fd5d8319a388c3dd6901b37cc198473dde5aacc18fa5c016df313d0d95c03e7c190c0dc4ff76f418586164cb110958c8d568b1a047cac68eba0ad7235ef26a7f72111c0216f83e2f59fe3a0cd10a75c265a981b0b3c405f012c314e65eabf9ac5b452e4a62b2b06715cb53e658c0e377ad3067b675979dcc0a9f9c0c3bbb4af3af6da29f0610c43c9aad54c32cec037dc9c5fd0ae5ae8c34a0d8f15052f223875f975d263c489ad1e81979300e3250267117f9be29dcb36819b20fad28802e0c81bd332f59c861ae33de5f47efb550bcfa950dc83860d0e4a2f9d70e90778b9fe26f673c0761451775b448d9fa174f87545b7a69d1c14a2ffcd8fd42b56096247d0987671a0d1f2c232034a4195939ef4a7c344a46866f22de82dd1744d6b6582af224da5c29290896c24eb33951db6966fa66b31d8cc5f9c30246d6fe8d99ca54197866ff5d3499ae87367eb0bf8094b3906cae7213cb1fd65022beb5d801e49cc0477a7efd709cb075474d74e50018a94412c80182b77a241e9c8a88e8b9ba7aa15955a0074811940f4d57a8e5d4a16e6648968703c0fd9dc02167cec625935d6a15f2292f61b76f2acf7357e580974d4728b50c99433ef108eec9bd6a09b47a8f364627b6c6fede1c3842ce800853dcaeee928ae8e2794264881a7011919085bdcc3f26d12341c62498c42b457add01defc3002a21650853cc8a4aa53106f954c8c9ebeff4135eacc6de0c09792ef70fd7aa0256383733736c5b8338baced430f1cac63926f11a7ef663162c723a2d0a02b7dfe06a4233676b917422c0a381ebd369eee7d505c454b6e832e5cc0c6ddd70c81a3ef3fb4ce375d0464be45b67123f2577fa44f10d945eda0f4877313f275f42d16ca586fdcebb7b669322e09b6e5a2105aee315ba9fa17bef67a541494de709f86a03437696c7e639e75bea93512c5074f44c9f72719eafb550d4444887e4cbda44ed0e92fb06735bee941eff7038a8bbce7041a129d6e4f97c62e4f970f1b1c7439889ff11756e99db0433a3dc1a6b6ced8c731fc95130f0853cf73f4fb9b710a539fc69aa6b9e3377c8b670a4d12baf276d7bbb52e8a3b539fa2de15019006f7632ea84c104f19aba7517d6835fa45f9b99bd24aeead818669981c2bab20c1b4ff6bd0ba3601d15e0ae1fae27b757d792b1ae4def8f4b430fa89bc38c898c187abbc0aad1650b66c88a28362a96bc0188bfa885ac302aa18282c3fe542540801b19f789acb46c409584385b90fd48ed18f22f4e41040b689331de883ffc218d79d463fb6de60579ff8d07206cdc3f91e0c5789bfcc8eb04806b76d23c5a7adbfb841ac51155ecb305bbbbd7c4df903916004c5fc8f4232e299eb04609a0210b7519a6bd5b1bcffff6eafb9f2a7cbada0260a6c01c1f0cfa5d8a6103c00b9287848018a8a226286e68b4a96cc04f07129336d29f4bfa5f42d55db5708f2ae2ce37a863a63b2f1389cc0c36a07490064c17881d56316f6ea7ad6e9f51215aad80d6c091948434aec7c4f0399c107615c288bf13c336c8be0cf76c6ade0090740c1c9c505806ded1b8103e896d6673cd1bb318b860a98e627c07087fa85d5b1c8afa92783996d69cdbbf53e57d18adb8540f58fdec33ea8946f17a97cf31a64deeae30f361bb96c1a91c5b51f1b38201826079180ebf9e3d2a05f3177f7d0288aad528ccc5667ea5a0eeb2cd020475cc663030e2fb7cd232cc3ffa2a54143ded946f7442f2a4e38baae643b93d642d5d9af65058a37ec328b877ae4301033caab166268f4a9c25a060d97cc46c167c94e8f23eee416ffc907755e6b5d03d2e6f3128345a47f02e828757f2e5d9d960b5b786146c91405b22d4151f74917ee46ba97fcb316c11ef9de9af215290db682a5acfe31aec7c91ec176f28a5dd1a15f57671045e590561f07852c8f341cf7ccc3f934e6fbca95b977bdd7619fc10564e10e996487fc77a182d9c06371aa3b61e7043ff4639ba5523dc32b5662d0f4860f7c0305c70ca1ee1aa083f20b4f6fdf44908e90ccfe1f5e69df1fcdf6d6a4e56eb55a2d2813c1ac9f9de9ba26633d7f8b1e03d5f8a225d5e944a82001dd1fa814754e4ac7bd355f573cd51f7aca73565de3a503d22f38363b1a20c9d0a0f2b28c8d7a8efe4e5c031a2f4f6e641bcd95eb91b92362bc32944bd01d604ad4c4980b2792002c2d373ace10cb34ce0c4dd5a4c496ee8a576aad0a3e33d3f4a6c80bcec22d759855845ff0967d34c2d46629c37aaa8e46a56b156070f2f95c3ce135dd5c28529592cb56719a571614bebbe5dc8a910515754d1841434598592576008aa453d9af2ca636dfdacf073d78f83f7e81a1e90d3faa73566dcdab8fdb2deac5443dc19d19c2d52f809ce1872c120acd5d21b6dc94709b2a1377a67ff366eb8dae7146397da9825e7f0480c8ee622141a23149932561b27e9e2f4cf45c6367d1f4c46f092408f5a345eb219e89e3bf8e952f4c94e7ed2c7a3c9d27c2ec1f7b8d34eac367e750050db417e8f69f44ca21fd092646febf158ffe4917a188aec3bfe979741a196bc09cfb86e365f54bced26524309563d916d2e062d0d06b518e8973abd644b37d41c1d7c236af6f7ded219f483dc192e7311a05fe779fa72f94cbf8588b3c9a01ea234cc6123814758248f10231804c40f3782f11ea0593e2e61a3f129ccd0cd8628ff8e01bc6cab7befc1f1bad056b5de4c9471c678d5652f54e0d8fa00ac4bf6421d154515d7de83fb62a800c96800dd50df4d6389800113f5006618c9f69a99b46acedaaa6860cdd9e45245fe730041de72acd8614fbbb21ef02dad2d8bb67d75bf2f548eb51b9122f892afd3fa0efa59004d1654b7735aadb4f80d0b9f07b721b00a276f0d7aef39339fe8bd179131aaeb727dfc11d58c9ff50b9c7dd804e5f91cc668e6004c1c2e52a1f237f9074d4924fba2630cab1bd4a28193b257db6b40652a8f4ef8a0cb422a6b3b193d5a820d319deb6dc7c464fc67f8c36a6d919d3944276ed0ee7db925feb73454cd4ff510399fba8c05c6a8d81f7a1581c01e57d9768a745e020c842076be6bae82901c887014a2678031f1679c6872113f9ec5c0ae1761913725c6847473da15ce4505cac3a75dbffdc2bbcc403c1a3ec7dea843bd602469b6796ac0e47a3a8beac4448caeeb72cbe3dafd45603ce40cf0b58d0ddc561c382f0ca6e4cba694f4cfc0e6e7cdef4f075df2f317d888150625a5fe7b0553b504f87cf73de9dd1b63b39d219d8c8c8f78aefcee33c325f238613ad8927277c73459db85fcf41bbe9241bc114235712fec3625c3cfc6807b82f1894a83ae3dba5a50aa725933f8c921b10a47567790da308a009af25500d00cdc7d454cb78353e4ef0dca06a6f9e7e98dff4d68a715e84ca5ffa9d8c88bd916a5774bdc1cd7de83c426d672f638388f2166ba93e5d4baf3368c2af34b2e487c46141b7c30300cd7bc647140db723b354293a5600ad2b91effe2f4dccb2e61e6a4c7fb51c7011520a0958608ed332099f6422052063e30bec64976a0f62da0af1608b36897c1b6ee5d8feffbb504ebde8830e51fdd145abae55d14f0e365659c573bdd5103072da5522b1b135b3ba9780314c75dcbf12824d57c2451e33964470f6823fe242f7deb865751f71bfbdaf4ed53bdc844c2f101bfa3d86c721a7669657143ef3592f4921799979eb09d0e1995c32b010447641af4ce29fc4f455ad1e76a29cd608f270e856a83c9a99db8ac6ff578eba0d938ac3e1a5681d8d7d49174dc67a04883369d54568bb21ce42c3d4bff14938cc770dc63ce36255a8ba5fd1b68222feed551741788a95185532cc861061dc42aba0bf6a1c6a78c9e50ba7636d0c2a7bc2e20b5864959fdbf6ff4e1c056343e51b77da731cbaba5762e3f6cafe54b7c5eec7fdd2defd95829851e15adfabb77d904a17c893af1793d6af7e58e204e85f48156bec29ec5ecd04de7a4bea7f7f11381a196567caec15640227676f753b91f03eb413d17c0204eeb72658599abb66181ceba2627053090c61021b274c00d50a06afb92e69302660ba6619df8c66a8151a690fdd0b3e14d4f43ad5740570d905d866452ae6c4d4d5e3621719cb9cf7c2d6a56a9b763ba598ee8cc18db0ebd03a4b1d9b9966fd4d80b91e0d437f2e812ae266f57a54634368fd58069ad5f4e3fb3379952797fc9b210e31698fc16601fdf6e0a32057c6f5dffa6e8507155815fa8ceeda2eabeea0cd20c17de436158a87bf681c457ce70e48575cef776703f57677b03c8cd669dae454f94ed1a99ae9649db2ca6f8a2bf94f245e9f2c022db61b0b42fe0a77e99f1925e5fbe83e651951f2475b3b9c2d2aef097c42f8ff8e691be4b753a1ffccea4790d9fd8d742f21706c7b7e0af1bb45bdd2ae704b37337946be2341f698d2c7a44d0dddc00381b44a7e76bad673a6fe6f7345f4246f94083ae0c14af3cc11bf4fa51917c461752c72d4dc163c795b4198ebc5c6ec06b0f76ebda0998ca57bb6951dd9e83eb3b470ee2cb8e5dd51ffe78d4cf1d4510ed5bf10b71a1f58a77747c908bab6d063917d08d29a58edc237579ef47eff4988ce696556bd7462908f8df67d6d05aada7a68685b90885028a987b58cf7fb29bd1753fef9ef8461232a332d72c3e9931af4f3414a76dfc1495bd61356603f8239509891f700a6c801727c34e5735ca3626ddbfce490f9633d220efe22600805b0a6313dfec0f3d2d94688dc89293a85c0f4abff80d212576cc53676db22d18686b5099c49331ebdc7dffcf7f098200337c1442c7f28fd15f43590f1cdc9be55456bdbc07d73c1e170c230b4a71c3463eeed0728a765c36e8d6913c15140b7ace5b21290dba2ddcbdc6b7abf43672618c3b9dc3a7657aff6793094873d491d17c6b695232528fcfe313feafca750af8acd65960fb8f3cadcdc18c3558f5079dd61b8a9430aba235489e72b15a98ef112e105811b5b188ac9d4921c03eeb27e2b48b2e2773c973a0ecc9b5d57d4cb9395fb381915265366956f6028e03e93da4d339fe1fede9555526b95431cc78900f4bf5fe5ed50fa9a0932b5af1414bb74d1232e1e5a8ffe36e163914de2f41c1e1dfae2777bdca9e184ed681ddf7632850e40c72442ecea639944c416202195f1a9137fa5cc4ad561e660c43061dd77b8edf0de1d3aae2a5eb81f77234c8da132f3e0bd0795e3c27df5d2207ea897b02f658aac1afee9908cfd1b357726ce1631163982b9ff9800a4c5ade4a238318dea3f3ae1ed70b8bb7534058dca8370e930661c6a0d19840635de58ea7363756fda7671d7f37de993487c2204f6591c59c40cd5f64203b622d9cf225d842fad11e69dcc8881ffd40e7f92b070712f532fcfa1092aeffcc8e12ccad9d1a95a811a139c37c7891254ccec75045aced86a5ceeb9b92358b77eecf687b32c242166a86ee4526c20f49158c3f0e1603e5607802c1afcca40cce35cba2039f6832edd0c9f5cc22d9e0e0ee1f52657dd909704e450b58ceb84b1fb024c9e4b2c4d497075c1271404250bfb46b117059ded8d63aa6a8a2c99eb537c42fe1375a5b5ff8ff1c0345d1aa94c18829552137fa4f8c41815450c48b8bb85ee22beac01cba0c1be74a1f23b33aae23555d98732d29a17dade49ddc0a216231ef39fb17a092563a69f03d33db11c640bd3d86a00f3309ee87bc718bd8298a6aa423f5b95522ee749daedcdc34d3d5ae56b6de231a568461494c055531234f13ebf442d7f8c79fd8ca897a9b063e2904d92658569ffdd906c659283b7ccaea57e22cb54107c212b7c705d648e5aafd8008db3e389cb0e601bc25bcbbd095aed22e6faea969c6e3128b9a6c7782e1896ed67bb0b43017f93d69a08066d4ff77f4d97c3866b7c416d846177b8248818b298cc48bf781d3f9c6457e1345bae62cd0c9ea850e4d796391a6f3d6ac584848dbf854cced409f4a6d4e1e1079b68d5cbb40bef16ab70e0d0c01d8ca80afaca388b9a2d75cb6880bf3322de1bb473dfa970bedbf2b68891f5cbf2aec685ff90d77b1323b77342fbc4d2e026a9f0cdeac29127065208a8bd15be35c048c305f2c4804a406939a966269bd8a6271a4eefa2ebeb19995003f22c131548f0426cc9fa669e470783996acd4cac5b1dc72e0742d8065432eeddc6d5df833e21b28922886e3f312977e0f757bded2a814000e1b703c34dfb31fc845beaa51f6dfc67313ec39064cf6087a93c0cd960fd4a8da1c0860fa4aca399e5cd6ad3901e8feb9c51b708bbc7cbb706f29f666a45c8dfdc382464cdf898c1ccf9027f0b497916f3302157e0eb7d90c95183531818ee0044ff93165f106ce6ed6bb6528cafcbc0fb8e08164e6f0f128e2267d3f3cd2edb336d3ce4929e5dc08c0426ce40f7d52986162117271266efdba4f0a81b480dfcaef92500569875f6709a015320d50902e7ad8b56e520cb4741803e760e268fdace9cfde91ac4f6f4f43201bd94ddc3398328c27a41f6f376bfcfd34d800caa5c1c7fae47cb4807fad7cb7e50a4e247cdf641973c006c4c2615170cbd388c0da659a3cf0e179503552279d8cc64d172eb7310ac05829f5aa63db9a3b723bd3f16cdd6ed701a6d3eea6ac72b8ee2a1cc4890b048e099abdda114b67f05ab8263fc6b04fd447ad74b832f01a9ec500f2dbe523f25e594156788bcce8dbca7cc03df3cdb84cebf113e3eabdce4db2a18c5992a1d9842a77ed6a6a8c822bcfe8e22cc858b10c7d26fa0db278ef0850841971a06176cad2be66d744ec5f7c8f644c049608b433155011efeddf5ec8b5b7078bb94fcb146b1ea0a9440f479a8b3bbc3e7ee0fd93da8c713f5ef38bbf2128f146a5bbc3f2e026146a0346f6bd63905e8c71461ce06bac4836cc1af63905127e8819320e470f46f87df300e2db89e6d5d46de4fc5ad6b1629b8b6fa50b678fc239e1a8c726c785daa6fd6653833bbf323840894d58032435fa717db00f388b7c9d741d3ce334137362ad74f51be7fc28afbd1dadde0b58f1e2ca8b123e98b17016d5b7f6d75c2aae10bcb3bee5f13fbfc40fb03b42e1c12e25a3e144b4342ae6b55d5ff658e410c591054edcbbdf579db07c5c1afd6bba916bcb673276b13f884364d46e7ec76d9b82d944d3901140574ad83886166e1df2e9c0fd7baa98668ee80b27f9fd1ec71dc7f31c1d61f3640dcf8ff320f222c5b77286ea1cdc41faacb1183aa998b0cbd9fdf4919b5bf0aa8ff9dd56af6eb0dbaad6f3774caf4c0f5daa567afdb578bb79ed03dc83d3e034cbf60d652dcd026893b95643eccfbdc08e6439360c22ec27f761f679c2b56005b3530a1484354c582b10edc01011a92068477d56a43002188a1b233dc28fc5ee6395d3d91bf8243adec7e86ba71eaf3dec8e334e8f2db91ba47ad3f86924bf9f2fb8af20ab2e1fbf192a26de8ceccbcb1fa429fa430292af373649ebea3ebbbe367ceaa446eeb445b71b774afd011cf2c23a1f688b99ed674737a1088fcc54f9b7e77172b0a760fff7b58978677a2c0370c42706600695d0c3be8db024edeef4b685f9c8c0f4d2740d1f685193b5a591d90b7fea59c0c9e415a34ce29cbc0dfcbe982ce16b19a0cfef48ca1e758f06be3990e02eb378727861702378fe34d499356d8ede7ab17a7086e79380e020b632efed0a0386f899664f7c52de88856cf34934c660a10d1ac316cc5275d208042ca9351b3d3c0e2c86e1075a40c005f4cf227283804cdb5f988a75f1b974a29f2d9abcdc242f57306b14a0abe079a50b3c082bc43f541e8205366f5515c5cef34bc712e0656da80ba85d2f5dac696c5d30d02a0801f9770d3f202822c5189292e12d70bfa532d208b3d3e4b9476f7c622b6135761ca9ad927f8e87297c0038c56346c10eaf739f42a4907830f843322dc2c001868857fac8138315f9408734a805b44a341e8d5bdbba70ef01045507ba48c76db6bd2fdb704004caa2c2463091cedfc166ff47fb307a3c679458ec8c4d138bb1a9f45b3bee2ac38905390ec405ffe6d50397d862b87f6fc40b581c1caa6c01703160847c00ce468b3f57bb4c57868a423b5758450f6610dc047833dd8bd3e15c606f9d9e9651af43b625417e6ac167350199f5fb700dff9d31d1834e5067ae2d2768ae3b887f971d82d0db0121d02fc224b0b7ce50153c505e9498582f95176dc9bb7ad8332ffc5e66e30fe9c0830a9a5b9fc718e76b79c83dedf8b6fae77e9a0d525ead4e1f6f9d766096f2b71fb5cda34b8071f16557a5080be461f0d28d5f4b0b967b20060e2f06cbd238148385da7207c24e1383970c3c8cb37a1818cdfe26d667f1ebab0f590e01363db9f30923edc7d8138236eb2126c4d42d27bade1462661a9c9a37d45c401b89d176989dd66e03884bf018db670832e8f570ee6def8c6b6223ea4add1fb1a4a3dfa10a3839c3bc17fffbff9d9d7e279f66b9d1146ef6efb82a9c98bda813cd317754a6bcfa218d40d1a3ef1f99d18d713df44e4a74932425326f5a0a9e5634f440bbfc3e6e0cca8271df6763cfa2596c7cdbc8f196fc96229f3885b809e0c13affdd97bfb0f64a830e494127601a3deb5ed551689cb6c44ebcca60f3f4603efb14638cfe90de33959d3cf88b4e521c29228a7e8aa1b1d03a1be16b29b5bbe58462c4f39a910e2f0fb255f903c06154a9191eebeea8f0b0545c7274eb72b54b387ed05a062999bfccada7c4d7cb8eefabfbc033342c877c5822ae5b679c514f63776a922a53a70e9be1b6883a0649590ce7eeeb93f8ff1d70487dad73485547b1db3259b5c933ac118db6a40f5927533b664c8c0851014011642c326c4d266d828c4e051a58839674d54e4046f5cc24bc6f1a09bac79bd888f063a348720d5fe53a044801dec82a766103837659b8b7c5f8d6451f8d5fc0e9d9d45ceb5fb6cbef1c3cf269cd33a4971df965c63934bb3adda1558fc11a09bb7f872dd8766e4d7a1797159cef4ad513968b4398e67b789969f7baa3b1e376e89c2f355f2b3096b656278c0fe8bf7294d9bda11e5cd9252ad50826114f68f2541a600c015c0fb043b0c496f3b76c30961057ce201f66401618d6d1f089c7b10d63ebfa84f760899b0f1aec98c15e335fd8bc18dd78ac6043a3ef2fb61bc371a681a13478d7ae5f1f6fab07ddda471808d63b838851ce95195d2de8fdb3bba1aff8fca65716a7f576637a9e22646c4e998db60ee26b88000d7c85cb7588a465d2dbbfa535d88aeac4337068ff874bcd0cac6a49022371d2b096746eb09ae56d3932d93906f359ce5d6b404e49525cfcaeab1e9c42c72f41c335d21c199612f3669b141bbbd1130cf492a8964bebc82cccd3a8283612424c784acaccde2cbf3d97e753a314c8a15d102dfa874d4a1f46898cc5c0c0d955287691e28ba8b3abff4f059329cb8b47b8e21ba8ab7c9b80b5ba6cfa89c98e7d6eee094688b6d95f2934adc1b604533047b04eb2662ccb57ad1dd54f0038ebfb9fcf27e7f230cdb54715b0ab88fce63ca9a137afc2d928c67aee4800b2a68c6b3a4a5ccba40c5f823c4d99b590611a491d29731d003f49a056a30e3a259c0c28f07d93f742ef5e8f0e0aae1caee6830980103b5bb3f8d0e17ab61a116fcd13d063bdb8aa2e4e39800784269270b49cec86b1a29d13473f7d8509bffc619a853b7fb2cc091334819363984314d52d90a02c47c8556ef2ba6c7be23cb0ceff66960a467b2ac7e4119e84e342e867041fa549f0d0de76755adb1b7c12ddbf409373142d7b2c78134ac38bc1f752e4d0510ab99d820eb6796149fbae1970ad670a9513543e6c74f0ba78e5aa669205e6c5543a2dc2e63657852d4a346a94af1529f1f0b15058538a1847b2045dd948097a6de4de9c84487a1aa9e8bb14b17502dc05cf64718d7392c3b7bae54866d8cdecf42bf65c2270022078c509968bd2b38f11f8ef9618b029c7e032e4d05d10e3710c0d3a4033330033330033300d87f84b5341b51a36fe4cb2493347801e107c6f8433c46dcf82910934c524a99d2037e0ceef09bbd591bbb10220e2c0e8c8b6d4b4c9ba59da64c99c807100c67c40bcf6a36a60c97bda68ce9e44719272b1bce1897cbca86e3dc38e171c282931f679c5c2e2bad72b95c2efc83912e3c2c3139429cd6620c9b72215529ab44992b9952cccbde4f1ff6b24c8f7566732935e37239f971c6e5920b84912d3c0895e6f64aecb175ab10ea4a1f403029235a78f235e75a4fee1f315a994d8687912c3c689572edd95a73e41acb6cb27c1074b9f8c371b9fc38e3e4fd1a628c91e9b419974b73984ca7333c4e789c9871c2e3848d931f679c3c623c0ae7c7e572c1ac74d20710ccc81c46b0f0acfe7cbfd6a3b7f89b76e639e90acfbf6ef33ae5a9f121c5a0e8a7b4fe1147af911a4773105be171e9495b4af4ee925a98d9d47c0ac61f0e4e85c1b0f4010443c648151e6e9f2aa96e8ae89d210c46a8f0f437ed5e56a929e798a7f03c43942f69726aabb14ae159548ea16a8e9c12521985e7bb35868cd952eeeb1a0a8f5bf46466e49079d3a0609ea5b38c91277062b54a35e932a4a98cc8b1f7a4162e468df98e38e1e9d61c3f7566bf5a6aab090fa34eecb1df7eaeaa3f2d1f40303318610222efd42ffdb972857209ab3d5bce7d1fbb450a4794f0a88418be4bf9f4d5423b9284a775235bb9da2936c730ad11243ce9fab1a6b94ad33a7baa1e39c2eeaa7ce4e9b2317f99d94c6b478cf0a07bea09992d3e949a622842de0ccec7b1394369305284679f2a6662ec75d1d2362e970de771a0d9682e179516cdf20104d34688f024762d5b76b2e37aef2a8d0ce17177a9de7bd69ee2e78f4784f03452574b5d5aef2b8ed720ceb3c161612373392c1dc42341781443b67ad7bfa79eb20a46f3299b435636ae9c6a39f971d254cb09eb8f00e1497dbfebf6a932fa7fc563e4070f63b65dcdbb3d574aaa2a18f1c1d3ee10663fb65ac2b46a9f1e3cc8b1860e2d3f6fc892183c789075352fb7de5b3a0b07c365ece061ada9a34e8a4a196ad47c0a4685bcd3a0a83174f0ec4a4cc88cead153eac88c1c3c28f719724ab1bf23679dc1c1931e7aabb9f5365173ef65365772583a439e4497dbd63a5e86ff3eb3980e8a260b79d8dba6f45a316fd489329bab3941546aee0ae278587375534ee9d143ee583a703c0955da546817a194bad1d3f2a8ef7b6faeb1f19f623e65a58505a30fcb93bddaef8ed0b142ae339bae57d0a5f3b0c5d25396ef8b5dad6636950cceb36ba9562badfbf37b9fd9ec6c5c4ac561e9a075836799156ad4781d7b8dfdcab31c636fe98929a72e72c1e641689bae5dcdf15b9992e659ddcef79b72f3c576559ed58c6917e22e6ab6ce05298f274f8af19d9d797bca6ca63427c8f78a26e75998bde12b25f5f0255b8ad373669369b66058541e2bc30689d3c34d46e4de4b6536372c1a144c5a2d98ef707a25a54a8b06f9407997742db7ed8c12a2cf6c2ace6b343ddac83ca8fd34136a8eb944ff3e65a5e50706795e7b4839e58bdd63a858bc85c3c24626635179c804efe1e5fad862097d42ec2db3e91e937229fe87db27c6d2bfe4a8dd300cd76ab0e5030826887b18d3d4cd9f68513227caf59c8dab3f6cf9bae654ba3672a23058f900827941e396b89e2ec6d446ad35f90082e97e5ae5667baddf18e37f5c821a3cb8ec392a468cf031c7cc668725e6c1a79ee9b7dba7dc87740a4a4583873f71c3cd65e992a5cd6c2a11cce0795f686977faf48eb2c9209fcbc666f99e6ae17b0c1e64c8b2656bb386beb1151514d4803c4d3fd371b6f5de22863078fc21b49e5a6cfddebd4a3d5ef0a42ebbd57dd652f3d2219db2d241d93c4d0f47d1b41a97cbfa0082792e78d0bdfc47d4d6aa4faf05d1a0bcc1e8c6b3ef37b9a5b4349d3542b9b48d476deba2a6faf49c3d45ebc7a38f2d2b74ac21b5fcf772494979c7e5030806066c3c4835ff4a477e94544a994d8782f995212c7bf2a38c93219a302e97219afeb1900f2098678dc719526dcc91a7abd738b3a958541e075af0f45af95cb5a51e36c48a50066a3ccadf776b5c2ed9e762425c8f209a5ee372f9209d950d26d707108c4b4313e2ae5dc6ba6b9326b2b48d311fbf4f6b95cb6cfe38e384f32c3d785c2eee5156367eb97438cfb2d2ae2f17ceb3a090b1c6896272585646c2e0e3616c61dbc716c2de953eb3f9aed9605252daf95d9386868cc53a2b1b30d078fabd5ef8b99042fb29dfafb12b484b7ba758541e5a39e349e9b8546a96cf28bdca6cb2a03ccc86058358f028f50ca147e4b6d927cf6c6a60050f6b4bb94f65c6a6bcb4c7b3cb39b48f0b3d7dce5866d38cc7bd2e6b4a21f7d41e976696b15eaefe6649b17274c9d9023254b1bb5a9a9e63df96339b6ec3c693d0a1f78979b5bea73bb759638cc418224d4c5d26b4eb700d1e4f7367ae75274da592b9cc66ca8a0a0ac63da7331db662b4c7e592bdf7547f84f1b04cbcd2fa871a636594e96c2e15f463863859c355ac21b751d9705652d948c1a3de356286eb2de6ae2cb3b9b2e1b844143c4b256affdb1af347c4cc6e58509ee0614fbd21e592b7c5ad2db3f99a4d8a631c85a5593a9a698267a1ef7b6cafa162e95b669389510264a66e5963a61025c499bd5c2e17a4382c2b2b60ec4a09a144949a9c9918f3a202474acae5f1c67d859eb9d5cb0de100a5d3c2d9bc202dedc74859514151a5d2a2412c2a2f0e7efcedb3c4f49cf6b745ef6d983da93aa1b67c8b6163ab329b18946ba53f1c3df661c7102b8792ca86d17c8b45e5a1b554361b4c100e060300f5ac5abd4b9b7a3bc6a6329b2c1ca682f4bc76ec986a6e6fad7d2eb38959869ec79c2d54e91a15d1666693e5eac3f2a16f8e14ed7a6228b319c7861324359f67efb7b937ff5fe85d6693c3d269031f96bd9e4aacdd51531695c76d90e069687fb595d35fec7e65369da6310f07e753170697c729d5cb0c5fa1e24f2fb399e9b4ac60389b8759619cf038f971f2e38c137f37e2e8353857f900823963040fdbdc448fd5d5bed42bb3c9e98c63f05950382eb85c5854dee5f29c8dbb80a5450583ca07108c0b44f0b0d58c9daf73a1a6b799652d2764ac7172f2e38c138c0605b3b2e1b8550ecb0a7acec6930f20981384e05945951eb3faaaa7b5329b9cd780e0610f5bae7dc8d07e439ed9ecb8ff0e86e583a83cf95146a74f505b4ed858e37279958dd334e772c9743ad3273fce38c124f601043362840f603a2d1c0c46021e0041073ac081ce062470f286774b49d980400312c880053010811d14b8008a8acac60316c8400526408109584002148840062050810708f90c051c5081065880010bd8a1800e24401170000368a000425ae5020448cc26051344831224c826250203d821800c0400615250de4000743af085b26c363a3c60228212960fd2811cd90101898e2486d39fe2180c8645c87f40c40086208021ca30f22aad29218021364180018808220b5e084304094730c21084100420fcc0073de0c10e7490031c0c1112071c2d2c1dce0d56361a95141ba06482bc773ed246ba060858840c4410b00847908862002282b0821ec210111111e180183c3042017a30002123ab1861c5082646f430b207012842a4041325474880006a2022a219a200355c2005454840009c201200008c918000206084e416691700c80422015f081149c38801bac0052d68410922224528c211843084217050c052001111143452f09cd76850769440776c6087e65370c70930b043f3292a0126098e3046c21849802c4e408b36ac21035c10e30a4e105143c48d1488888848400445240139d2f029ada1685c3f27ad961c25220a07060ccc4a2701247d4800c91b1240e2850fec0043043bc078cff1c08f38363c563aacc5df8d0eca4a181d94950ea24959514119d9c2081d123002019132509000912488a0c0049d771b0da6f383e5d9e805f30210bc00810816a83032124483620421dce03970e8420722605879160dcaaf6c7e687a84a1f99534363e46fec2e91d9ccd134100021080000840d362ecb8b07c67080b07c539cec69fd312062e44c1055cecb88507be608b3288886c2007aa10111139514fa8850a30223ff081880e72400b278888344b078c2f146216b6f082884847169218e9c2892c3c20222224169a1011e9a06c6281b158828810a7e90ee792714e7f070071bcc6a48d1d68642002119c000527d8f101210ec5032cefcf00630d4e1a2cefcfd8b163c70e8d0c72b0438843c17c10f79858040210267108c2094c1002344a20e10a04ec688526be153b4452fad9788e1acdf9e63c4a29a5944a29a594524a0921841042082155555555d5cccccccc4c545454545454545454546666666666c618638c31c67677777777d75a6badb5d6524a29a594522aa594524a2925841042082184545555555533333333111111111193999999999931c618638cb1ddddddddddb5d65a6badb594524a29a5944a29a594524a0921841042082155555555d5ccccccccc464b64b25a489864a0f188c020c111191e63c093a4ed342c6c6c7a38ce1525a362e886393f262f060f94e270ccde360c321c3bda60dce675878b816638dcec6078f47b341694d1b6b707e489fb1f1d11de7cf93f2194dcb0e4d6bdaf840e77f48afb0a0a4a0b4d6f4784e0b4bcb6369e1b4b0b41d19160e4adb71d9a1e91d292d9dfed629615cdc97a083a0743e6185912c88888c604104019f58b98288484ab7dce077b06c34235410111999821466f000e9c106668c678c3478f878306ba4b1c61a0fe639a38d31d24003f38230d000030ccdbfb1f9f1292d6e83066b4181cab3f43081bf1b9d209b14d7e3352841340f0f4f3440e4031e10111111e921292366e8c48e0ee732a4613a9d5e29c208115834ad415141e17807c5ed5069d1fc8e8e4aa7e3d8b1312388068585b36961ec68e98c90dfc1e184193acdd26388888c60444446683083201a14f76ba4344b932122322283ee387f4e875329753f83a4d626d6d8b0ac0ce1b8a230dad8701ec81031341b940e0a1c286330cd36dc0b4121834583b259c1b81782f2c00003b3d2111161114180263cd0e15c58501ad3c47438bf92f219a6d9928939a4c1434464c48d36444452389cc73729296164220726522e910a11368268503a1d14348470092158c20f227f0906f40a0986b0fc58a3b3c60e9520dfd9916109030c30444446d858434444039c120a58a204222656305142259c508903884cc20a223350b4a304ac25069318594acd0000461246908411444484a08888881a0a0718609820486748a7bcd3c4b171299b8d6384b40a66458593c1a8b46884b48a905651d402091f3c42178f50c22338228a5a1c610b11d7030c30c0e00846b2814628424444a4117468c4144444769cc0043b76805183201a140d4aab3ca7063b583abd0287d3b43f0f75431346bad139454a4a18de4141e39f0c46f4d0c11621444444e4392d2cfd6f470d3a9a160c1c6fd420a5b5e69da651382c9ccd0886fc1b229b9774c11104d9a49c212232c20211919115882060116af400a2084fa08be60547a08963c369994e6714a107110428c20d9ba7e9d16348caca4a183fe490080a8874504a50030c6783a9c10ecebb149416313a9c9167648c201a140e0b1b6080a1a805059d4ea76038bf22a45530425a0505425ae53bdd50a0a8c5044252fac721ae90d2864882c8e57261d97c4a27e5e1f0ceb0a08091f2707c0a182222ff1c3234ffc6866544059d21adc6ffc37486f44aa7d3295e881e888810820e84900321bc2022328282cdd3f4406348abd179186c7c88888814e08708020661890ee7e24a30888cc8b3745e83e13c0b0a4665c37924f087030183f0b1712d6cec108109389b94e60106180200030c4ce71d46f3cea16430282b8d59e974fea0061111110d4aefe06c1e4be7597684e10643886862137e5005b35d236a248d2411911ba838f79d160c0a329d3643c55fa0d2a2c1f4c10d17d7072122222d3b3461f4815df8608b95153e6436ad47c0871afc0f3eb0354410b0074b8874583a2b08d883177eec214f2e677f7a6c190a4fdab4df9aa3d7e50ed1139e7c0dd7ef520fbdf5d8098fa3ba2ad78c79a995d984a72d5a68ed7bfe0e99cb28e460c2b3aed495432be17b5bc65c428e253ceda95532d46c51a37e253ceaa5ba6f7ab76dc992908d18978b7b219bb640c8918427df52f48e70a54f9c1c177220e1d995546ae9352a574d7784e75b29d7d22744a8d2b1111eb61c71aff4774ed5a1ce906741111ee41e72c4d42f7a2b29663619262107111ec5f4c969d55269ed7b13720ce141ab8b94635acf35955408cf23649a4ab5d628d373417892ddb6c79f966363efe500c293dd289132afee578973fce069cfc9ca3f7fa1ce97c3074fa3d50c59d5af22f2f6e2e94db5ad71aed6947a79f1f8e2e49f095b256aa7500924bb78d45b8ceea542d4dcdb4974f120a58a739f3e55ace5ff38430d24b9787adfb9e4fca97ff46eb8781452eca9e4fccaeeed2d9e5ceae9e255ce1761f6e572b9205b3c692d73cc88d29152dc24b5789a3a9476b542ca1e2646428b67f1397708b5d48ba93ec92c1eb5be19ea3666aa3f2591c5832d39f4725733f4b23563f1603e56a4d0a22f01092c9c52add5636c88574a5f2e49ad90bca2a1e6b4258698ddda26638d13a61c961537485cf1b85aee1652abea75c2d78a47ad94eecd7721d4bb4ac28a47dba5efecc4be3db44bb28a87536b49757aee63ac8d44150fb7c5d5b02542bb9639492a1eb5eefb7c7d29879e0e150f62b44921d48f35b1f929d8da5d6c31e74ae55d55b6d8bded865ea1e55633c5a3cab142a65cf236af2dc5c31835d69a6bf3adf516299ecd47eaccdcdd3a761dc583e850beb6f634adb72406269fb371a46e2011c5d3d672efed54a743da2c0524a178965aceab1f9523961603c5d34d13ea5ae833a145c9a279e7bc1a8bd983e4130f629ba87c9393edaa1583c4134feac5a9f8e52343bd4a13938c11249d785c136d2e47f8323189fc40c289e71563d9d673d9b576dec4b30e254267c5eb1fdb6ae251e6befe98f22bd750cac483dacab7da6e7a27a628b3e9306c04124c3cc89573b7db2762364e4120b9c483cd6ad1aaf4de420da166890719d752dcb421e61e739578ba37a12f7e438eea4d896719b5660a31bf6ba4d4249e56e6f69e947a365e96c48350b77bc558a54d6df7fa537807249178d43fa7d284ab319f3d249eb694c3cd7d4eab4b37b32904e5b160329d9695f488e77fb16dcfc5e6d27be50f12473cbd74f93746c7b7af546693f30d6f163638632c199034e2c17fec922ea787381bc324c57c4818a190a53e65a7f4bda4329b9a4e5939f9518619880592453cc83d6feadaaa3a7162d4931f65bcfe3314622151c4b30e357a7d8c25e4ed56221e4eb9f62d7aedad970b21a2ad6ef7bebbea2c7308c9211e6f6c512bfe5ceb116783a9342031c4c34e21439e983dd616b9d4c68645d3430d92423cf9d8b5f728ad8496b2a79010e24989ed7255ead0a5b31dc4f39ea9520d7fe54bd52611c4f3bb181177255c2e9fe31a273c4eb005273c4e508d131e2798c6098f13f471c2e304d138e17182679ca871c609e7351a941588f5b8dd8fd15bfc8d4b1d9000e251895933b68b1ab72ac5d2d9aca027b740f287a4ca0b2d444c0c2d62ab88dd7356ce2d77987196e6ac60364e25aa1f9e4688ae13ada76cc6e872b95c2e174d4cdd03491f9e44e70dfd5b4ff5e97201091f9ed59823c3d5e9ed2b4e7b781ac394a8315add341bbd400fcffbb5edc833537579cbc393ef293bc42bf5f95b0e0f8f5a8d5e3976dc891fdb68307778f4b1d50d6dc2e55e6a3b3ced543ba79afdf2c4a80ecf635a8a174a8f98a27c74785e3ae5563bbfb5739fc393cb7d5a28a1dcd794e5f02895ad7e5fae86afd0c7e179d9d4b2f3b2d6181d0e8ff272f6124beace53726f781caf2b85aa9b63e9dc0dcf2b64dfa7f8fa39c7de86079bbf6676a8fe7b1d1b9ed5cda12a73c92f795bc3839657c3a59edaaec79a1a1ecf6456f5b86173ec751a9efe9428b95d47eff9d0f0bca668154ac8356ccbb1333c292145cf1d53caa9b496199ee77625fa4b0fa9b6afcaf0209790bfc767ebb967647894e25cd5fc5c39663b866713b673fd96fb9948c5f0b4aac61e66d34f9f491286c7f13db7a99cba39cd0486e75b6abd6be13aa75aa1cce63f870593f92b437ea49c04c9171ea6505527c7b874edbb179ef68ca942ba7c3913bb0b4fe3e72d551b2e171eb69eff9b5b5aeb315b6fa4b4b41e9c34d6082d48b6f0ec2feb5afdd7d829bd161eb64f25b61c6b8e1bf366e1696b3544df9827ddc5c4c2d3b0d92b72e2ab767d85079d6a3ba494d537164d7bbbc174a5551086c40a8f4a9b88d2aa74f50fa241e9705afc392bd1c0542d9054e169effd329311371511a30309159ed69fccad2d43cdb1f5c98f334e2e97a4702099c2c3e8161f7b0d2d237c5fb40389141e86ed5e1babe4dab45d2e99985c3d9044e1c1ee7cf7eb35b41225048527132eb36f94b4693b0cca5506c9131e6dcc9e7a4cbcda95731f978bc2a16c2071c283d6ffbf4a457eb60fb1e6f9410492263cb878ad969c632de9bb2261c29376a9274a2add2ef572754896f0ec62eedae3c697ba0c930b244a78b46d62ccd6534839d4740d244978f635b3f70cf11d62dc487818293f3b7d4ed5d5d8111e6cd64eb1e51af5ee2e89111ee7489763bff996e36724457852e6b7f69435c3d5f6498890a992173757952a9569b3d7bb77a8dbfd59f70a4886f02ca7985cabfa6677d89945f96ee3233112213cb92b1bbde74d9b3c73c3a212f3dd4613064910f2a22101c2e3edb9a55dad59375c9ad9950db59c5c2e4db520ca3190fce0695f6a1b628e3039738ec4070f4ac5b8ac30654bcbbb170f5b4c6532c45e5e2062962b331517114bab6a3194b4b567bbb49adc0523bb78d4a633e4d67abf7dca0fe29ed77f068f13961615953738ad62863295491289115d3c88cbf639fd617bd5fe51383f92074672f13c26556c351f7d176a665365c379e9e44719978bca8643c6e5c2128da06204176e9d99f55be9cda16fba45a2546c53e2629b1231654b99b1bab7dab75b6c643a6d06d39556b1c5c3dea26a5cef36ff519ac106192c38e17162468ac3482d9eb4bd1eb96e8ea835a5c5e3ca8fd366c3d6fa91ce22514664f1f86a8ac8984e394c8e2e6963f1a847750b21d3e41672299b8719c26161273fca38b99071c2e3a447a3a1471881c5e318abe74d13dbd36a651f40303c1879c5c3e935abc67eadd2e51c1b97cbe5c23431b98911573cda122df4ba9f199565a2218cb4e25908e1fad37f9709b1653631984d10c68a8791e77ad489536613c31a8491553c88fa35d5efed33d5faa89911553ce89c63082de74dd52e4fc5e3502af6a69eb98652364c54543ccfee1053e65ea55ddb5c8fcbe57221638d13561c9695533caea9f6d843c7ba5dda34c5e31035d6d6bfcde52a534a1c969591523ceabdd5dea14c4548e993e27967eb3c1d5d1362bb513ccc35bbbd95696d5b2f8ac7ade6dabeaad6b0b90bc5d3f4e1b74de99bbae40e8a87df526cb60c37d151fbc4c3c8d7fbb4c95aaaf63cf138e629bf5f366e26efc493b8b497cb576df6654e3c4d25e72f2157b7eea5ddc4d34b1f3abae7ed31759a789653cd4cc89ac961ae4c3c885d32b44f5b39b78789a7574aeef2359715fb124fa2a51c25b7845842a62cf1ec6e2ad5d65c27d7952af1b054456e2d84ab772944896725b71ca5a4a9e953aa9378f2b9e55ccbf5846d3725f1ece3538f5039d7d78499cd0c0b4a1c6993531aa50f2018334622f1284fabc855fffa5fcd653621f1a44aaaa5464df9db5bcc1ef12ce37a459ac992bd37473c8af5db638b15f6ee4a34461af138a64b3152ef5eeb2de6128c30e2f1865697e1be5fcca9339b18f79a383618d79b94cb85e5835c2e273fca40e1fc38e1916e5c2e974b736bb330b28887bfb7bd952a73317ffb9c96ce26c5314c319ff1f69516cc1b9b4dcaeac98f324e5a70c2e3e48c931f679cb0221eb5a89ac9df3c114f6672efe9bea9a41c3bb379e2b6e5440525d3b9c071d2b6e504139011443cef3573f8db1a6acf93db93860ccd91433ce9696d7289f4b5b33f433cac89d635a58d355e76994ddeb0687afc50d970c8f05f61e3724185781eab7329f1bd67fe543fd4fa608410cfd2940bdd35c7b59dd8f59bf16ee3e372b92ce60308068e91413ccb7b13a366e45eeae3002533730581bb10c395d65aa690a5d4f4565bbd3811b2e49c3fe3cde351383f52da37675c2e3c4e7e9431e45990e9b4193c4e96d24d1c3ffe8d4e11e372b95cc418630867a3f268288572786124104faa54cf579d3bfda605c4c314abb5cef5739a89f47241228cfce1f14c66eed632d6c9b17ab7f1c198cdad0f2018138cf8e141676cba4c6142d79ea574f8e44719273f386168ba6648278131d287a7fba57d664d71be732df518e1c3e37a354aa9506b874bf91e9e96bc5fdbc7d037c6b7f4f0ac4345b7eb52ea56a9f2f0744af4b7b6db57f7437878b27119bfa78c8eb96499cd75f2a38c93cb45e1b85cc6b85c2e974c4c2a1cca6b18b9c3c3eacfed98116636374fc36aac7122c6098f93304ed438e3e45786fcb85c3a292b2a280a83e90308a665c40ecf6b6911624a576bd8aaeaf0a86abff6356defa17b2cb389f40623747876d332629cfc39956b680723737856fade866811fb7be5e4f068ebcba6fa973db6ebe2f0a852df96b97fae4bb187c3f3e9bd54941cd25f999282f206a3373c8c351b62c47da53e537130e286a7a5b2fede44e5e5a43a6d78dc636c1d426cf369e6b2e141c9126b8b2197cf30a5353cefed95d3a6986642ab653673c8881a9edc9578394df6758fbdcc26cac1481a9ea51a622c9133b79bcf329b88848ca0e151c6745f629f5c32b79dd94cdd8c9ce15988362147f64cd3f2cf6c9ae1499e4c93bb37ca570c339b4a3b2365785a229730dfb353d5bdd990e1e967d89bf99ca16d2cc7f0bc52fafe3574d8cbad97d9ecb07450843cab8c88e141c42ba9b6e8edafa60c1286a71723be4bac58bd31ee2c1b8c80e141f6dabf0ca9e6add77f6793d97c63e40b4faeff15c95ebb7262c2f3aa4dbd5a6f5f73f5b884e755e2545e2f5b775b4b090fcab5fe9aef91e96396842739ba2af5df1476dae74c90f0a4d49e539b1e63fafbcfd9609219264778f0fdea27d6d062acad34111926467890b6d6e9d935457c9999cd1bfc0d9e944661e1b41a97cb8a8aaf0f2098202645c88b09119e75f6ae6d7ec2a47db9f0c16408cf4bcb5afdb2e7fc1131b40613213c4b2df5d0b77ae8eff1c27c8249109ec6e8fc10363f32a6898c4e3001c2839edf72dfded55afd3f7858b6778d2166ac2162131f3cac57aff6d6d94a8f484b7af1a074c48fb12fa6f63d0ae747f2e271468ba9951edda55bb88b57a921f6b67a76ba7098ac6a1f37b65e6a2e178f7f15a13e84f9d0d241092e106288ab0931534d2a2d23a78e6d53f75bb49f34cf60c925b778185a877097d33584f3238d355c0a4a86c705d5164f4bee0d35c46835337f2d1e8789df6a45e49a5ac9d1e251c7a798b7d37bad8c67f1b8c5c66fee1927fe95c5b3b8102ffba62d69d3158be77d1dbd52c89e7a94142c1ec6ec74d4b0d3a1d7e9158f734a1bf15bfe8d1642ae78fa315d2ab5549cf41d0c4a5af1bc46999ecfda6d21f658f1b43bd7a98e2eb32df6ab785823a767be967142a78a47257588214bce8d9872a978debbffe470d39b7762543c9cae19bfeffed6aab1533c08a9ba62aedfa4ef96299eecb64d954b855ca52ec5e310a1544d6ba952be14291e6eb99cd03b72331ec5a31eaf65ac341d777112c5d3c85a6ad265875a72a178b46d2a4bda4e9f3944a078146bdb101f6a67d8ff89e7b56edda6946b7dc5b4c4138ff3b7eeb16c8d515397259d78341f2fa79e61b66ac2124e3ca81e6384d253fcef392cd9c42ac5d04a46b6186752b88bc92ca1c66df9b3e36be241d9127a448cbc156e6b4249261ed7c6a754ab7cdcfc987856a9e25eceb565dafe5728b9c4f31a7d6943bbda4a8b9b724289259e7d97f9c8eaee9c9362bc85924a3c4c13f2e6f5dd4aa13a4a3c4f57b15dad989f4aef99cd210da3ea5ed3c6e5d28592493c8cb1e3422c7d438c5e67f6e447194c120f2784967aaed497a33b26454924d43666ea91ff623b75459440e2f1850b93ad73c5d5b8994dcebfc1d9c48151a96e5c2e4c14258f78f4df264d4bd71d59ebcc262a72e3724159e994cd660509c008258e78dc5acfbd3dfd3a46bb961b62a4f8bbcb85f31884da8992463c8f6d3f94fad5ddfa4e99cd8e6f09239ec5de29d3a6166ae9bc33bb282859c493743de5c8586a8b1e22e6cbb85c92229e447776ea3d256aaab352c873b9301f40303d2849c4935c3d3db4987be5ab791c1b1e974b1c1b0e2719221e74fa9443acd4a6b4abd61925877818156bfbd61e2b31c4836bb9d5d52ae6effccce61bff1d8ce6332c98e5829242346c8e5363fec67f277395a59410e269af4eb16f665a08a9f4635a4a06f128757c0d15529ed9c4689efc288365b3e1a8f47358d848eb0308e6062582781262e8def67d592e76209e4fab2d7cc765cf544a4a6396054505250593615979b77c00c1082901c4e3fc8c1633efe6ea5b3290923f3c4d71a7c48d3e7d2df6123f3cfe1833d71e63cef93d8529e9c383ff4de95bac8fd9d496f08153b207d69a26b4a879522c7158566c50a287d5d6a7d747fc9431a6b2e1bccb252545f7142579d86c5cb6c858eae41489a1040fcc9f594b8add56e23b2cf51832ef578a5b95a5c40e9fb635317f4ac8ad354aea90383d66ce146a552c28a1c3832a173dbf76ab9aa92a99c3932d3954b4c9bbb739c66e94c8e141478fbde9f3878ca9861e51128767394eba8993fa9692631e4ae0f03c668a8fa99faadaf51b9e7e4ca5f4bd7c6ca792523b94b8e161eb56b7cf968c98266343491b9e87ea9095430ebd6afe682861c3f39e9f9f9afde31a9e54cf0fad7d0dd5a5b56a785ed1379488d4aa7db74ad2f0389792b3d6f0197b8f391a1e64a7b9f6b127d470396312b5507286c79b26640cbfa9734eb1191e87ec3162f2639e6ca592323cee9c7b64d64d297dbb329b1a94e6b8d42f21c393aa98ac5de123c2b634576ecaa0640c4f722f5d732b6f2ebdd7ac50228687a9c4c8ca5e7baa555a0b112561787c5d5aff0edf4bcad52f9d4309189e5e4c9d3b5f11f9b92f3c6cf1b14b9572c150e28567b95b4ba54bd4d71a72994dcd86e5c98f32583aff230b255d78144247c8d353ceddb1fe209b2c5f06171ed4b8b1666dbd4ab72d4bb6f06a53bbb374e5cdb5d964521c8aea204ab4e0da2be962adecf66536151f4ab2d070a9f24a2d97db638db2fa50828587595ad794ef73aa09d51a4aaef03ce6c2a4525ae96c13adf0282fd789174a74adb1cdd3f4b85c5849151eb5da2355aebaf918d21c4eab122a3c4f7143a589ddac1ebbcc6687078f93210f85f36e5c2e994e0680122553789c557a6c1d7a26677b5270991cad6ccc994d94068f0c0b8a0b3a2929619cf03871a38d131e272c429e45b3e171c2e384c789cab374863c09536549141ef756d3578ffb2b9b6a09149ef71c39ddc78aa57668b1b1d2e27e8c0e66a5c5bd3343c9139ed62a1fdb17e2349438e141ece4146a4ac612bf2d69c2e354cb7c0f5721476c9c1bd7d24926a4b5c8c99c70ed5a4c15caf495e9705ddfb5ead6c4a88544c9121e5c2d9532af37fefe625211a244098f23d63c25566d4eaa3b0925497892e73a95c9eace71538c49243cfecd9b27665e5f4e8b611209254778566b4cee39e6905d5beeb95c123b4289111ed5c494ef29dd46941e8f93339414e171dcb2db438a94ba85e90ddf5c2e8c49299410e17985dc4b8e51e2ee47cd082543787655f2b6f2f77fb59d101ec4ffea717dbaa516a1203c0f15ad7ff91a080fb695ec98525eeb536942e372b95c2a51f283a77179674b994a177b55e28327952d5fbb7e35665799d97ceec5e392b7764e295c5e3cfb104af4482d85ee9edac5c3ae2d6fdced1fba65a48be79b52c43a1b439cee31b3f92b073972f12c575d7d9d54b56b6bb8781673a5d0ca76df2fa1e6b8c5f32a75b6b410538d5e55cb8a2d9e762c257c95bedd6ab1aca83c9a344e789c380d0a0b8670bea505273c4e789cb4a4f4524ad5e249b51eb3ae3eb66eecb47816525f99c8522532d566f120566ff5b9ce5e6a2ab12c9ea556e26bddd01329660a63f1b4668f547a7c0a8b679f975a6d13bdcbf4c7e9150f5a468c9ab67789adb72b1ed7ee983397ed1d9b62a6a945c8d18ac7d5ab6db7d62263be1e2b1e9690a63bf52f3d5fd9ab783ca9969eb229459aaeaa78fe3561424c575f2aad74f2a38c1f2b9a1e3a841ca9789cb2b75caba5ada96d8f8ae7f9576a7c29a964d74ef120a55c7a8a76f5435e394cf1b8728da9f4387da1428a08394af13c5e0fb1a5d81b3f538d140f73841ae92a85fea97c3d728ce25155b4ca14630ff152288aa753aad3f7bca9d26bd7505252fa695050043942f1383e2e67ea534af5a4cb7c00c108c9010ae5e9914b7caa35666736c550e38c4ca7cd58994e67d227dea653ed7425a2c628f1604f3cdf3cb15ba4ccd36eba4e3caafd7aeed5b9edd4be45059392d2ce585ad0d09071b91c2107271ed76b1323d6d632de8559d9c6b7218d062a0b8a0645d382f936a45534555e25c7261e45d4d412dbb994ce5fe772c9a189271fa2e4cdbb2df552c3cc668e4c3ca899dd29e25ecdd0551e7260e2594ebda52e77a4fd1461920d392ef1ecb73773469e5426b30e8ba695be1c9678581729d3d58b15b5cbccae5439831c9578564be456dc646fad7e9478d26b776f546d9543e856f59063128fbef65fcdd2a2e7b2a9249e4f8a757d9b76aea5b87c00c1b81c917810bf64a869fabe85df9078da62f7e91e7bc8f563dc827dc4f3f88e77f73dbaee96329b9fe250309acdba1e9a342e97ce1b9b4d4612391cf1f8728958bb612b2fe222448e463cda787321b7b09d628b329b8b114f53ef5ffdf9c8febd2f829343118fabd64fac5d35969aabda438e443c2c357676d518db42ea4f789c9cf038e171d2c6e582413910f134e70bff73f56d7b840ef1ec522dad4ce6c5d8d2108f52559f58aa7ffa125f211e95ae142bf59fda2d72423c6c97b3fff2a410626f108f424688ed13f3a4dd82789aea4f2ab1b72b99ab1688673d3ea2ecc616a6f500f1306a8814e9ea777dff87e7a5aa6cee2d77ef76fbe1614e8913d2f5e45039d687e72d6d28a5e4d85d3a5a3e3caf49e57b8f1d43476dede161fee49ece99d3478df4f02c5fe68550f26e6c9687a7b9e5a856a575cfc6c3838dd56a8db9464925d43b3ced533d879a95d3ffe652b265874793f732f26b2e7b0de1b0646e321f40302ac8518727536b4dd57b88addcb554389c30c248496915362e1784c890830ecf429830b55a895921c71c1ece6cfcd62187edad9d1cd44a88897142c98ba95a2bb9efe4bcd13ab71a6d66338ee660fe1f46e5658d21471c1ed48dcf37195b63b4b939e0f0bcc79bd6bed7a6ebaed81472bce149cc4fa9f45632a40aa11b9e86902265affd72c9d92b1672b4e1d1e5d0b564a8d9ccb1312626df351b4de221071b1eec6fcfd4f425e7fdbe5c568e353cb8cfddd06b8918a3eb8568c8a186a7393a6f6f485def739d230dcffb84ad5efa6bbe146b27071a9ed59ab58598ee6ace13a5b351e30c8f7aa7edf83fd725c6ac0439ccf03cbf47de9c5ac9afd17bf408f23e2e171594cb450839caf07cfa44d6e41c73cdab92470e323ccbbb14625acc9829f7313cab39c608713f5c564cd2687a281a39c4f02c8752d246a8b1a9e73647189e969e4b2cdb3ef27cd939c0f0247e8bd872652b11bdbff0a8758bf52df770a5a6ee85a761dac5deea3b5d5a5d78dac264e9f51b71e15908fda64a6a294d74ddc2d38c98266d64cfbc296ae1594ff6da8fd739d77c3528cd19830739b2c050f15a687119a5b295dc48f1734ca5e756aeca6cb674308e526936293c2e9755861c5878da31c492ae944ab9aeba5ce268cee5b23e806054725ce1e9fcf7868afcb721944addc86185e7136bcfc85663f4e5407254e1799ede23d73cbb5b2fca418507f142fd5a620c6d36de1c5378102572f7df9e65b25b52783c95fdb9a65e7a4ee6280465785243c81c3b57beac2125c393d89051f2e77ffa0c5b90852fc6f0a0e6eec9b9c752537c2786e7b799276708a1357c1186a753115aac98efbb4cda064ba79071b9689e85a5535e3ee10b303cad39e5d790b3d4be9a7fe14156f8b4b3dd4b5cddbcf03086505fa27c6a13caeec2835e5773c5fdccadb6980b8faf6cdd54bec5dabf690b8f42a8baee305933f5b4f074429eafb123a6afb5ccc2d3ff1ef66a9b5abb35c4c2e3ccdd522831771f7c7185679d6ab67e316ce952435f58c1005f54e151a4ccebe87cf13de608bea0c2b392e2766347fd9242c65f4ce15108b1bd45a8bd2a13ca6cae1c7c2185871f3ac592f27fbe49ada0c491867c118587a937e4eaed5baff85fa2297c0185e71fd2d6ca8a2de5123f83c2174f78fa61a696af395f5fb6cb095f38e179f58b21629fab098f4b9fd0339bebb48f094ff2e566cfe9adced62cb3a979164d6b13be58c2e3abee0f3da133b66e6158bef31c253ced6c9f27f454257c9184e753f6363fef6be3f67790f038f5eeb17ceb38a537858a842f8ef0607bbb6d117623e6533ec217467894a2427f564ad353becc66111ee4ca186a9f78a17b4c44785c4afbecb9a786dc99329b1b0d46957d00c1f01743785e539e18e26bbbf62dcfac0ebe10c28314f3b5b345c9deb2203ccab56e7e2d25526bd18df005109ed41cebc365df45e42eb3f98307d9264afcfaaf5bf3cc6c12e10b1f3c9f723da536951eae5c995e3c8e214a4aa1c65c12820e5e3cbaad5a214fa8b5e6c5ce2e1e84b0a95bdcdd564d7550529e0525130786e583e8e2d166e48ba5e51a29d438178f6bc4ddd2d5223a23848b6795a56c4fd17357a7b77854beea5b09b55376cc0a041db678d8437f6ef12957a9d0073a6af1a05eb5892d55afbd74478b0731458d553ac456a3e668164f265da859773af24d8564f1b45ad9b8bd86cb0b2187980f20988e8e583cbdb0712655efb5ed4a1db07812e2d464dcbb38356b3074bce251efdd4eed316c98cf3a5cf1bc648b29e58da5978d5b472bd2da646c1959e24594cc6fbd63e5fe38d32e5d1dac78d81d7a2cbfb985c9ed5ac5b3103ad4dd94c2f5d8298791461274a8e2597c2955af840b2d23eba123154f226dea3196f4b9d572e940c5c32ba5e790b1f6972cfd291e5fb6fc21720d39f6e44cf1344599d2b1569b88de96e279744c2de4c99b737d22c5839c35d45ccd21d5e8d0289e94dadbfb76265b679a021da2783c91a7d5eb6fa1f69443f13496f8fb8d5095f257a078385b637cd5bf1ea14e9f78942d6adcd4bd12f14337907ae2e9d54f15bed5cf7d0fe191983c071d9d781a5bf7da7a2da184525b994de6c493f89df46da62adc65818e4d3cebee997b886b512ea2a5894737b9d48a1252fa127b4847261e757da825746cad3ac4cc663e281f1d98789ed12b87aaddf1afe72b2ff1aca6e9d07aa839c46c9f251e4decddcd2f1d91fe57e249282d3aff562af9394789a717157bb76e2186d8fb241ec79a3363a4ff56266a92785e42c54ffb9453e246e2d9a6a9a17fab7625550d89079b376172b79252ef8f7878196b6c8c3965d6881df17cf7faa51ea3a6f4166bc4f389aaadeef7112ec78867bda164aea9f7de2ddb453c8c8b68b9979c9afa2a453cabb5a39752a3266a4a897898f3e70831a5dece878807b577bed7fe7c5f4ae8104ffaa4d4666e37978d0df1ac95dc5653e8696a4c5988675726b3d6b639eeb608f1b8ea4e6f3175ce5e251cd22999d2a8053a06f12887b4ad878b29a51aaacc6627bda14310cfdac69e7e7552d718caccb6a1494393970d7404e241f5c54cf55b56e752bb5c2e97ce02c4f3b0dddf2aa6e3f23e273fce38b95c94a0e30fcf3ec6d93c315ba81d62f6c3e30e912b57fdfade43ac0f8f5bdef7470c3d1f4be6c3c316f266ca212a4fee760f8ffaf34497cfadd9fb7de8d0c3932c576be48668b1569487c717f16a4e7555315a544cd08187e713f53e72af5132a69ab5e8b8031274d8e1c9c5f44f885e62757898314fe4904ae6f57c5ed0418787e173497d27d6dc3aec393c681f4248994afa2e752e3ae890c3f3ce5e57eafdb4105fd3118767a5a5ad8a9cfa26a478080b8a2a2074c0e171fbfab73d5d98ee7f0d6141417d432fc5a61242cc669826e870c383aa256c2e1972870cf5e5b2f0a0a30d0ff3cd85d45becdb5a45362e99ee77d5a0830d4f4b8cef7ebd6a9e1cea131e274f8359c383bcbeb556a935564c991a1ed67c1f6bceb5bbdb4dc3d398732e1b21634d292a1b820e343c28e15bea5fb5e5a9dccef06c66ebd5de2c11b16b0ce7df250a830e333c9afe21fb5c2e973a236648c33c66a523068b90e7726111f2a8a30c641803067488210c18d0018610e8f8821776e8e8c20474700143011d5b405909a3023ab490001d59c0c21508a0c30a4fa26cddfca1e55a7a6c69151ef596538a8cf891d1bfcc830e2a3c8a962257df1431e416ca818e293c2e3de5b2ed7377e99ca5f0a0f712b3e55c626c6bf5101d517892a1bbd7be15d9f7a20e283caf55f9baeed7dfe99b1bb8a2e3094f6b62cc33a54e989e920e273ce89836fc566c9f092d1d4d78da53cd3513377be52c810e26347f466c15dae754f2d472831fc3df8d5446d1b184f7dd88dd4bf7ccc4dc7bafb031e459b09936a143098eb8a57cded47cb1f6baa023098fb357bf1e52fb4c5d39b3f9ab70281a3a90f0f4c2f5b0e1fe33d77c6536153a838e233c8b9662fb86edb963180c06a132e830c2b36f1bbb1353b9ff9cc2fc177414e1412f31f48ba8faed2b96d9542de820c2839ab372082572fea5586a16740ce1c9a48f3fdff6fbbafecc26ef157408e1790eb14b9ff47dbbc739081d41785635cf4d462d35ffb5207400e1496fa4f6f562f733543f78544acd2dad96ca7169fe41870f9e7edccc392f5589dfbd5e3c281573b7da0a5b6f42cd84174f6ea3e60ba54f8b39fa65b28b27e53f6b97da534c1d4c74f130b456632a75ce172dcac5c3dc73caebc87931192b4c70f16c7bc9ce9d72d5b5874c6ef13cb769db21b257ecd6dbe2d1e67adba95c5c2a39a7462d1ea6d8ce5e592b36769ed944cc8416cfc34fc98a6962e9ad4c060a93593ccd917fb3faa756f57abb0813593cc8dc2d5c299f339b2926b1604d6d9c49a1bb5b4f3798c0e241eb92ae63e674eccb6536311b161e62f28a47f9fb2a674bcfd9f1bae269fedce1f2326bf950b5e2698d891a7a2a7afd5463acc8b6fae94af9c921d5ff8666e9154c56f128d4de5aab14a74c883a26aa785223d67e4d55192387a9789c97a3b64aa997e97f3926a80082c92974fdae64ffb0d56f629a98e2e1a78ffdda87544b9cb0140f63aaad74ee6a937bfb9a90e259ce9025f5989ad37914cf6be5ac8bf132513cbfd859ea5dcfbbb4a1503cef1f396eec29a51423c49880e259fc9dec13a5854c91dd30f9c493aa2f9342e873a9c49405134f3ca9faa5baaa44560c3963b060d28967e1e7ab6a8aa9bcda329b6971e2d1e72bf97a9eda62fe94d64a9204934d3cfcb9ceb6bddc87af89e7b1f5081f91b3e7632a0b934c3ca97bbfbd562d215c4c2a104c30f138e67261ea7f9dd9e4217eb90c7125f181c9251e5f4eee2f615a8929a5a1788b7bce8f1e97cba73494209a9677b9f02e4c2cf1a073e8daa154269578907e6762fbbfc969a509259e4eabbd6df2e62a31fe241e54e467c8bdd4502346289848a2317e4d533ae49c364b91787ee937629a52e95ba909269050489d21bf4466ad8f78d4dbd78e9fbf4d081fc20ce1b00869344e780c79169cf038e17ca6d366245b6915e408df450df9c25f2ba9cb6c0ef937302bad928ab9d22a88b36193463c4a99e2445dcbb6b7558a8309239e4eaff317f3a3db6c0ed369cc4e186d3059c4d35cb191b14e6db33d438389225aad6367cbd67be24dc4a31a72af54bac4fc96caef194c10f17c5b4d9a1636e75cab3fc4e39825e723768ee8e15a709818e279c95db5d67c1153c9b1106a19e54abb92624ca5558bbd435cc7b7569d333721c4938a612a449d5a1527f52894268378f89dafda97aa88e4602288a71b25e6c83d554feeb9e968363c2e5d3009c4b3fc1c7bb945ac11314e13403cbb36dfd3b6c61a61dacca652e372f182c91f1ec5f5da8df1bdd3f69fd99634f1c3e3e9d5e6425eadecf9fdca3e3cbf2921739498d25f65267c78b0bba94c0c714aadbd7b781a722ff7bead386d2f3d3cec1b7b52e97db11b537978d81fee426f7943ec351e1ed7a9bcbc354d9934e91d1ec53e19ee6b8a58256366f383705e059304267678b49327a6fe3b17fbe73a3c8c1d7a0f2965b856d3e149bd6ab5cf848829b59fc383dca9e48cfab9f5f5f5289c1f89c5440e0f36a65a6ae4949fce1c8787d1bdb70b79ae754fcb7c00c1684ce0f0f43694ae1432a78b95d21598bce1712e9dd3bb2b76285373c3e3da73eb942533b6b85866b30d4fafea44f7be4b5d6ac986a7d36bae2d4df4dd4bad353c0a61fa638f506397d8a9e151bed6d94a9534ad86506673c886c3d279b767bcdbf8404dc393de89fb93fa324de642501ea3e1c9c4cbd743f54dc9ea6778b4d16228314cecd4b996d9543c4cccd0ba7de7a3a7f264c665787a591f13aed4c9b1b7c8f038ae7fe364cde9bbd3cce606b36a988c013df3665ffe2fa16d6e13313c6e2dd674993677ddaa994dce86c57fa5a34149c3240c8cb1f5d5ba4bb5861283413db5c79e93e25e29b3f9265f785a9552cf0eadce987881b5a9a7ceda2ee58bb80bca75538a5031420a576633b9f0b46cdf9dd0a9b614b5dbc2939872dfa92ce15bafaa85873d54ca892d462d2df7b2f0b8ff4546d5f09733f799cd0e9b8109169ef67656d54de6e6efaff0b45b8d68217e2f25659ad9442b3cb90dbdbd337f55785227ca84ea29d59cfe547876a1b70a9f7bfb66e753789ca642e7d452ebb95fa90c13293cb9382957cd1fa56c755178145afdecd37533f6ab41e169878a0b79b7f6c68f507d983c21b1ab44b4d4b26636550f13273cad99e25fbce9255d889af0603a94545b9414a8848fea34692047411003200802c198d72a0083130020281c1c91468301a964dcd6d61480044c5c5e7e3e2e2014c6c2914020128682511044711003300cc530100381144e5a8799001e4c5388a0e5b9ced0bbff383cb1dbf010399be84f6acea1a1faf999482be95389b5fbcf92ef957b455d23dcab02b19b913c1ab1259e7b66e7a58817ba9e5cf9fc0f3aa99776bc03549253229b0e6c0d03e3e5712480c51b9337b2dad549952477847979ba23adedaa24f4c608941a51dbd25b7ec7c32346a6c8d86b35b3a6f1e150ebecbfb6d306a6476fb8174bb16dca199d09901c14c83348444ec76f15f39775203d67e0f7a8b7387fe4b898c1a12be65196b6160ae876180070b2cafc61bab0d8726d81b124578b043181f3d4f269d8dbea166292087325b9eddfd73ad660621acadbee0586358f22861339ef6745220f3f0471cb84d8fc8708382365d72910c46377bb88d64c20481d4a284ea0641db80c7288443b295dd9d630b549ea2af8900fc731edd46ffc5b850c5fc09ba0a8dda4686c4a6ad424fe021a3c0d479694148845ce8f33965ddd04d430b9f125c8512e143707da13e308854f4397751289cc7109334755026e103b18359e8348e0a2728cd2e50ff417d9e62d424b183fa70240461979f53dcc2770162ff2c77136f13bfbcc0d6669266a92dfa5cd811b3f16970d7f7cdb12529f6915a8fcb47585f39860330d1bb48869c9acccc0939125a8384b858760e9342211d4f3f4938e9b2fd0f28c223ce4735cb2102c63ce2d0f3fd7ded05e95ded6f75a85bd562dc24905abc9d4c6b6bd17247a29aa065f82754b4a187ddd4fd87d4f8f09351d3d0e8c5040481615db1e01972e7a8c930b9792c83dcf7290428fd9c7937d82d10db14ef627c5b7dbe937020ea88011f1da751768e7ffb3caa38df1fe568494329ebb640a414e544470e1c07b3c43424991926eef8e626431c97379554c3f27e8290b9ea8c82d9654696c54e218c75da13564e7bd96dcc2698f2381a39848af468dd3a1ef98e380ef48af23303d3f918046ba8bfd2e09acd9d3d5ebfeb70b10672ff220bbfab9105cece1bf8b0533be8ecaa5b961aa4c4c6c5862ff179e152ceda0d37cec36568f7b47feb57ef322e85f38463b96fc676539271f3d71d93031ae271a3b7c8e3f6ab9525c7d22be8e1a4497553b948f89cdbe0bba09f6e5d8362b5b2aab9fa7c9479ba98aa16983814c5e6e9a501fcf8db91b739947e900e91a076c253575f8f895a7434374c13471f5756ff204b9af91ce4b2f03ed2bd58f28e20442f6fdff076834b858a3daba9c20d0fde00f2e6902b80a76ff078b0461567723c009695aa0b2ca98a61de7baa8bd5740eaef8a47b14e31b195ad8cba1f340f42c7c1282ac6ff65e97418db2e33b2959c3cfb9a524fcfa22a0209fe9885555bf3a72bffbdb69c7b51ada5783de748ad273ac4e686439ba477ed457088c2babc286cf55070541de3cf3c0588b398f51bb8d768037e924fdead4910e3bd4f05edc66ec96091e881f1a8125a970c0d6b93119f182e232e048f1f52caab0ce46d6072c18f1f3a0e687e663e1c9cec90b44e571ad0dd4c0a49f2e359a642cf6142bf0ce8262821ddc48aa5219b0e4c3e918773f0023a1ac0340eddb13546da63fbeb00ee5437c1c6bf530e656c38f0f1a7fcfd03fc49dfaedda821694ea2326a311f2aa254c354f2e608b3a12b69dc50f5966d8d5845439a340a4f903f6f28190b8615a830eebc8f9c8d7d781188303b5cffa9c0f3199a22e84ced7759a86c09d41d408fd41986536dd85b1b1df8d572262414a7e9153b5d09f2153b5d6bdf0af490a5c3a2b0d8e972961f76843b95cad3b3cad9b0faef2b31a9ee158c883318bf08d081963ccf31b46b664019c6bdb9a8943723a04f6646a691096a92ed3ec2f32d6568faa6a1db7b6ab1d3956b2d769ab53c6f343a9d497c621cb60234f1c43295db05655c581871afbfe1134a3c89fd3e17da878a223d1d524338150201eb6b1d9f09f408187692783a4397573e9971e18b8e7d2311a88822e2c1b791c90432e3bcbd5e3686c24b61f7f410afaaffb78858c472962cc16dc6e193d3314f77f0b08ce4fb89218d6908ac20d6a1cd9452c72118b827b3ef5d868db92e2fdc0ddff748fdaa117d120df98b2e96ad7941918b986c40f754325c21c6ee04794c09e3894b5d0ed5258c8858be358a5f12dffa13f5f2fa8354a857ca37561f678a67283d96ee4aebb86c2f3dbc44fc2a47f33b51842986389f62929f7d94e51dad695bd6ea4cf865f3559ea234bb04716e0a5e554d9864c889045a229bd6d7385f9006d6976dd1066cd048fb090174eefd7256d1aa43d0e4f0e8f82507b5170bcfb29c20074567af752d280605a35e021c6bcc81b3bd8733d258342b7389c78c88f2c72cf5551525e109e41219363a24d1c4cc05838dd0dfc9916048d455043354faf20804479000fe882176fcc246ec6c6c730992d0d32d6939e573e6af19d9f0a80a7fbeaf8d7ea1cdaac411c7c53c8f4fa5b20dd79560fb016208e39a7db3de4887e96ebd3d2c1b9027acfa1d6239bb9ec67366ff6ba8b32f6bea6c50d5383d2f6dcee3046f02090b914c5df2131fbc7ed26f480ef490344771f15e4f7d22e39a95d26e5963b8237eb0c200bf63341954c4b910588fd169345d59d328f86fd54b4bba3f256bf4a7d6ed8301372631a4976e77ac852020e461726f382a09a305e4885c631fa85393fb00d93d8636589db81ba9494d310593703045f94e9ff54e2e17dd1b095d44153532bb955df2b9736292f16d4b98cdded7f685016411465782c6590010e44cc3b4bec7a16a62d9934fe58cdb69cc5952272faa3dc6710c199131894fb326c193a3298c57f83b81da48b03c4ecaa5c8c89b61440c04b0c2394d27f4e9a50f04d0ac4ad9dcfb9e0413457f0e84c03d184dd36a88af68b097c68774806101abc70c0e9bff0652004293aa1e146468fe226f9e28ac6896bdda1290ed95881a478d3de884fdc7c4a804bba22d165f2e060b656afc93fdf7387a0f50f0994d30e890c945ff6d0e8b5543483b007a90a4073e022417057fcc2da6c209abd77ad9dae7b5e9f4bc50c60e6dfeeed7438a95c01e86141714a09822fce995e0279183c1539a648609f6d9b790623bd13e47e2debc57e5cf88ada20a62df07bbe1af4346a435c0b0fb52d3d3ff1dd57b8034f8b670600ef51adcd090ac69a006b354dab2376a553d68833c0e4a64b0252d548d037f014ebe08067a2195bd4d6734c198a49e72b1da676c98a2fca0b8c38f930fce697431552b9e6dfd99fda5164dc2b84200a3ed1f12321ef7595bb00bf0d5bba69d2e9351b697478d1dbd72f8ed82335324fa992b99e4a86f4788dec26742cd6de08be387c7a141bca176706cdbfa5d4f88cd8b49d4f9a0b7c9c85b936777577963b6eebdeb2228b714a49aff10b9f86d17200b4e76023eda0f1da024ceac650a065bfb3c0edbac6fbcb85cda2279fc09c2080381e007efbdb75b5609eaea160831d092586d0b126ee1681565f86968de574115312744f5cb4390c9b15f0c2d5ea7d72025e14019347f9dfb98d116a956510b069e576e68cbcd2e38737d01d3e83d12ca2b95190d40b433d5c6b45692c30fda4e98357b6bb334b1b7e1ec9e26ae067e2f08a70047c9eaae510671e7051da98cbc188e1e1787fd4e8c028e1dfb2d78876284a25a6566ee06831d3d6db8f446b0f3a5495f403394728a66e3c267b773214f8e17b96ce0d5675800f56e24e89e3542cae4c0f926a7b3b30d7704735929a9864d6a399cddf7408680681a1cc78744e146ba74ce002dd9fe643307c3fc7ac190ac201d9fda6f43996fdff48938e770e7a44121ae907ddc39ebf3946bbe0880a3ef0e3e2bc0990dc55f7f39da505574284651ac03512b7c3fb3cd59586ced06b8a7be83947112831ca640af21f104a16b50cbf51186dc983628a1b02c1922c038a67b68eac080831eddab34ece28319b37f3214f5bae88cf8277816c744ff3e0ca726e87a40e88f0fae40d36001e15da0b6cfda2676dd404ac8bf7085f2b0a447cd79ef75fd5f22a0869fe067e43b3d236c1062122ca50affa4bb36a9a93dcbf06625ba10596deeda2d44c448fa5c25a91662a849614fa1772acf0c18d307c94c568fe299a89a0022f306905adfaa53c33a1732b5c183cce40ba8a7217217c182a4c8dca93880415a4241558b7de16bda5cb3eeea033bb696d3f8597dd7e952a6e6f8c7f3401edf96b0aa430655030d6aaf26aa23fa36fdf0a33526026819bdea41f391af73d0538a2557d610da58085d129288cd4f76ac0981cde525fa44d2ca191ccbda1e440d3ea0c7f4c5711294be81d36b6845e7bd93088305f99192c065b40cd14a09f329eca577b9d2ce18dddfe1c83966340780341b292f0732a112dc886495e3bad52099f269eab49087e0f18f46064f8a2d978234581b44ccd6d564d8929f4e53bc7d8c10507474a5dca297721930ca889c6063189df7737163d2890615cd27811c8acbf69aa09b8c8505f1f61705d5dab9e062f12e449df37d77b2c1811eeca6b6b1bd1e672112d170aca452a0a053d45b24795a3e915f12d3e69d86e4d25fb5a14d94e6624287451d67d18d0a0c80b85e955865805efd80f01cb7f3b2c7a858f9a8af28feab797f4c90b0b973462edc7b6e66e725329f11f2466db24da962e8442cf73736e751d9d112a24e8edf92a92007d7c91eeea25c37e44aeb1e9f6715f8970ed91c2cb833c2fb04dab7bc5fe76b905d52766376a67448754976bbecdaec004ab75857cb0ecc6e96e9ca243b9c3b1dbb1977ca46f7550613db1d5dc705d3d1007f17e42f46889621fccd3c9bafb54a804adf073a68d484788fc7e2230a2daf21d1775978caba3183dd155ec4a9407c1af312acd9cf6d8d32932d24150a92861b48673d50cef85bdc04f185ece511d1bbd9e1760fa83d853081904bcee8c657228b5d79811ff0545b10ed6f109dd1586b9c6416eae550568a9cb841ab845974f6b4dddcd9712cd9e5caebbcf60f4201952fcd1043bff4fd4f0e6b401af79f7a2763e5f1b4becb59ccce65a9fea4c8037997072a60db4390d0a31999f11f021eb79f869a693b9a86ea43b826dd326ba3f2c1182d3bf5b024030ca110dd9f753f2b159ad6f6d05ac1219b0ec85ddfdd9b13676e710b4ea83a2983eef04e31f4c42d279b4df7f07f1957b85110b9f5d79cbdaf8c2eff3c07dd2862ce8030ff15af6350078efdcbd0242f38483b43599cb434003d3c56b3b10a46a9d4c011b1430d09534dca4e2af9cc7c4a9d043f7e4d705dbe3b23868a58d1007851e8b908a23618be33bb7d26d327801ad9b6a6c0b10f7485f075ac604e7e8dae920d3ce9d80953c22de19f693e815f4cb40b870dfe4cae63108bdb8ef2471f97798bbc4f0099650f37dfecf3dea9403ff8a3c7e57dbc06f910ae87f479b44039cb7edfa6fcb196bc5a6798a1320b000930439de541adc1419c0e5776d3dfd756a3199f2950abc4ee4ce7524607a81a3ed04424081247aa70c8584588328b72c56d1d23209dbfbb4882b5f247dbe94b072710e68614ac53f866cb2cc05ba7c83605e9f6e0db1662973ea0fb1a7487ae44a94daad3f23cd3a3d4c4e6b7bc090f4dd0f2a83d7c73aab0daea7e3791c2e517257d8608259c9420cac69b51f8634aa7ab837eabdb6707f5033d317214899844d6e4031f8606f34eab06c8aa75dd8a769a1da2ce9e40a3e32c4fa466fdb9d489bf4a51e7281572944ce375c5c199647ba71122072366fa9c223477d27933ddb44ab21bb31a6bdb00713066a71f9d5302cc84935ccd82932651ea9e3121a258328e4668231fa5926b2d38ac20e4888d6f57ba3c17e2c387b418d0ffc509f036369ce272bd2d7a141215aa22371e2f1a3bb4fd2135517d47f7bfacfa1a06448dd5e0e464cdd106e70ccdb353ef3e57c8fd1d015cb46cb3c5d2824065016136421d67d084218f68c202ae785823eba61fa492fe2ee22e2f390ce0aadf50661c301d042677afab72dd155d70269709a9cc742554f54b2d9d0b2153c283b9b5236ec930b1162a0b8ade9a7899b55189778258f86a361e3431991cf63bc2738aed09c7b450cc5f1b356c8f5d5c7300306436492491fce2b4368424784e39a04e3a09f99f02e41be94c25f399f7d296bd5ca42c30aaa20a9f34e35e6c59b15741583be6e63b74e886247ef7ff244e3591c3e83a95c7fc3cbfc232a9ab4df4e24c39029d35b8168771df9ae935f2e8480b968e0eba264a44a5af60ee4a3da0acc0cd1d8cb2953b995d5e89a3ae410bbde14efdc8edd1f9459053e2effe6d5587a1b8142197aa6eeaadd953729d5451dfe04cb7e7d5b86cb317d1506f7e6e822c59e72c2f3e322fe62e693f1dab3746bf71fda29d436e128fcb813890f0ae0085cd24293f66755aaac5454e4e8f22e1b53a072b6c700449be7413a4c99087f605d8f1620e9c4ac3753dfd586e99dd25415c6d53a5f7e3905504e62165a5447682bdc91cb4b443eb10fc09999736209f8243952acfcb814de92c19e550b03422f2a9643086509db1d828f37f8b68264071a0747ad1972fbe31974ea59e75fa34419740a2e8a192ed68c721a21321b4d0ed348bc8797cd1e750871f0de827d6e63098339be98f1214328376cea7eba816b1b0c3cc0e100efe16b309c11aae935bb77ac9c1679a34458b0d6d8d1fc0e41ec16bbd82bc8bc00abc6009ff329c39bbbfaa872815bb89f69be8941d95c42cc09d8448d60ba0610f28347f0e05ff9bb05af28530df87402f3f26e864d7cbc6d90b119758d1db82f82b488f1a0776f0e159e7f8f02ec04977c6690201e4c7072cc9a67ad6ca50d9c13d79d820c8eeaa1b1fdcd46f290d44bedfe3dd4ceb8fe3fe8c813051434e566854f0d2073cacbfe058626fc1bbbbd910e62e6bc28bd7c75e38fcfbc0b1ac12b4aa464996f6e8db2095337793096561ef508726ef48809838e40a019d3d8cfe441b9abbab8d58aeee09f97f51d68f1ebf987bc00bfbff01f094532f92c97a4c960726bc531a9fdf0aeee74b7c10edfeca95778fa6307fccedfbf34a64947ecdf379302e1ed83158efe66a7a05ab008c69e419b67c8c3e2a3c299489350e8478a781b70960301ccc52915ea98cb3c7c013de53306b3ea6fb414bdc8a5e90ae1ef00486706423cfe8d0b0e202926d3f261e7a72ec4e24cdcbd32fcedba05d4680f57565c5c8b1d6e83d11e244fce4e8e5189ea8c3de1299a1533c2235d534fd4e569846ba2d7a35e30cdeea5b5fa028022238d54382814fdd8e16543cb5bf0834ceab9daedabf5dce8b610a430d9674285da69602bc7a8b98deb5cf8d1904424c6b5f72b6d512f87ceebc09ad3d35a8a8cbce5a45945d9cdb1313e9c519787a1687bdd998d4b46710e26e044ee9fccc48949caae78a904264e330bc4dc89b27c572f3b0d24642e2a404e4a97e9578d726b07bc027ada43574af0419c8d79a3df7486a52ca51da8f661d27226214f5195b86ca6837be0827c1e51b7ad723283ad824c9c665b980c26c9bb10d02fa7169f33ae056b6bc6d2cc27af77910ea7e97e4630c482253515b9ec7d3e579a22ba86d9fbf3f5d503bb7249b372533d5303513477028c2b666c87342368b732b92ad48dfb4025e69a434b6ae1f24300b088ce73820d64420fac989acc84d30ccf6b85a98a53b8c53cb0b0dca86393e12d7c567fd0c22db9ae4d9768840c0d4628881121c810bc17478da5a121d46c1b84a1b6ba596fd6d4ab664eac15af8dffc9061205e52bc49b6ecf3438ec4f72783d05a9042729eee7d485932ea397474f3b8a1acc4ab34f1eb1d896d607d233cc278e45f1cde2c0a8d574e01f12a6c52932480124d0efd855f77060533585d34218c0ca2c867455d22e8a7a8382ac1da6689262db031cf7f89a3d81f85b1252ae1a027b7fec5daf2f14856436a3514ed6868c7d42d45aad032e43d4e04e72a4b3315bbe095d8210b25f37aab625dd18b4d213ed5289dae0ae07fab6e00711489ec835afe4687f006a43c64bb9dd92e6bf77aa2f9bbbb79ab55587313528cd7d0ce9db5e7c32ac0f896b155b67d60d06c9854c1186ecb846c186687b2b34f154d02798ad5309e48169159e0c23044aa3f2b277b2451e91f541381a6648d2cf21bd55df96d28f6b33532426ee7365b8eb79dac920ddcaadb5c8e753b3f162db9df5da9cac1c99c92e14ea14140fe6e2f8aa9db23b203a70d7797ada7ec4f32aaa53180a61b93327c4a5603083352322625908028c6bd988626a50309b038192b8d91019727c8d1e81a2e61380c0fc6acf20adaf7f2a4ae312e97b4b9fc04bd712f443db7e774738c49a2bfa16ef4257dbaa6f8edefa3fced348b4d7286f36487787b623fa7eabe00d517e9107209d6eeda96dab4a72c4ae3532660feaf83fc8422bb2587e23e3220a95432a5188de1087b635c522242de678d25e9f118671de27726a98eee885cf5d4313726ba6038335cdfefb89a420e72e12df0b413099d7b4b301c0f5078081119ff2d48d4601c08ad3c0d1e7244a70096b6065376511d041725e5ec331c8e2a7a2648a20bb5630cb30cc683be6350c26ed8caf8d6dbb057175bb9fafa49d2a23bf542eb77abdaef202fc702330895cd2715ddeea1d1bd5eb40182e32eb605f6b48b2fe4e0542d7c7481cd936f3f5632125509d33d23b55dc1a4607cb639b5818e0a03902e6baefb9dfbfe072f79686842b47c6ce0c7b0d4053186040dc14816446c81372ffb003ab8322314e96c103c20d596f1fa0bf0455ce81baca7dd1256aabe876d2baefa820e459c79e59bcda811112a826bb2ba3d9fd0fc7de036ce4738c0e465fec2dc1aaa0c8d23459e938e47eae51e1a1f364bd9984ef0c5340303fd87e0185c207d0decae051aae0c59e9b98a3ece765178f1400c338f443cc1228b54a12d805821a81613e5a6d91d13e72cd940b1601d363f5c6d78d165368ac9dc8522d17ca2992a1efb2e698e01bdb031b48a58210eec418a68697fbdc80854097837091c04daa9b7886c3343fdd9e0d8e303ad34a2e7fe3b3927090bd806b541ce5b90513f9c2e356bc179fb0f73eccf1f130fd972ec8abd8c1f18dbc0e2d7bcdd60ce7987207e9027db6098f9922ebadfba33dc09985e0c2d36002ea3040f2a6e3e344af953d9525655833b1bb7881888099dab3b225d27303a489247085545295aceafb45815e20c2ca5cf585a4d91e7802ab645602fe0fd0cc755e5e3091d3ba196c038a29e2d0ab0c0c8e3281e42cbbc365064dd4047262800327b986d8a074792d357ef9997a461873b135312b0f97d090bd08103181c99ae0cdab82dea62922226ff1d4564916c79b9457564d066db8c13bd25ce188f4249dcf995c209a8c86e025d8a4d7eb2de05bbdc7ab6e6bafcbe8c33081f869412ad629b6a31d1070f427340916abedc0f2a44db8df23193aec915f7cc1633a68f5f6f6551fef3eb4d4da6cc5abdc0f4e133594f070f8d5806e8b947295132dc93faa29874b7e1a648711f60ed03f3eac02bf075050c69c43ae007e442f3766cec747f1f873dd51f4c130b5459a2ab178fcd5b325cc1404451b22d9f5ef8a59d4329c05aa2c3c439e8d44bfbd55a568ed873cea159ef7c30e83631d4dfc81f13043e4bd1563caf6ea653c2b8e0fa15409d147f35e02e29771f6676ee4855269cfdf4e03f48ba08e1b46c488ba0ffc32cec910b6d483775ce8b979e74f1c00fa0a6caa49bc8c7e122f8ead2959643fd1e55baa160c904f6e7f100d9406abb30c7e1d1c7b35279c146ca3ec4eeb7cb37101a816ce3551ce9d46c3b210dee481432417a64927b93d9c055dc05c48d004e0f9ba8799654d99a20c5c14ced79cccf8c70389023e9b9ee4131e89c7355141e77e2bc017461df17cf45aa230d45711d5d516f66941e4b47af018d29f71e879295645e6dc3e4eb797e56092a5645542fa52c0c086babdf720e7d7d41fb09cafa69e77b984db4ed0b7d64adfa7c7e6a3f1781c4dfc98e78042ba8a52e859d65e3405d3b19afe194f5fba2886fd9e70a8defd4d692990c56b54966906d715a49fab02a3a9b93ef0a9473e6a55c55aa27cf14d394969ea316972a68738e568c2a243d452dc428c34e382d6b55a6e6d4927199342942ed90c8ed9fd3a0e3bd4e8d8e95f435f8d6df7325ce1d110cd5f00f65a3a772bfdf02152d44e53e4933bee273c7353c824f4a498552b4345351a2723e5cd6b075dc5e02a0b56d61ff6ec1f80f2f8c80ff2943a19d62d1e2fdd9c3b5a2ed5258a62da21311717f15669e40e8b2bca0ea4af0506315fa39c8aee6772f3f351491ab74fb7b901359c9e40d484606f4a764e21f1696e329140ae0406971efd12260f83b25f7a4641868e24324b521567946c5b74f6b954bf906948135d078dc8818ecc30688a37f0c6e118639a60dd1a21d00011f79a342e3574d05abf3c9e0766d290afc68219c8e01fce565d27e699ec26626973116ffb5e07b3ade0bf512c4565e18ab300c1a31c084a0857ee64c7ca0a2ea826bf2e17789825d1aa36956cbf0bea487097686833fccadea2f7435cbd5065e14afcf555e182abf789fad779842ddc98eb6457e1210a3cd5e6b244137fa8a5b8111d8e43ac2193843fd58c83435c2867eb884967e1feee461b5e5d2352ed87ee9079e5b2c09592522135fcc1569ad49737b30d4abcf0b1c144aa50b354daea5dd82539d6fe304dab47108426893d38cd3a033295071d7b4679a9cbf038f39b3e0a5e03055cd643e9cc72348dc955fd3a9a53d5a51b5b9338da00272fd60668815c9575a878acc56f32df3bf64eef4be0e21891df285276a9892ba997f0870d308564563e25d6c7654c30772ef9b60d4efe26f7081c38064a4fe7a6964ea7fc6795347ec489876f14a1a2b3385f12e8fe8515c36a63fae36fa32c4b20510369a9ccf3c24f14c312cd31181adc711c9433d87197d1556cc466efc7acf74a6f82788eb3fc8e81d97a3432b79b4daba5d64ac6d90d4d40ebc96ac714ae393d733cf8c6cf29989094b0808d6905e0b2f55680ded01a4d09e927c06cf66885f9e61a11af0d5f4b461b45371b47969a32eb7f936bd22c83405ab4af8e78f39015aef5ab5cabd17440e673698f68a60cf2653407f22bfde0210cd804d7ad25433829eb8934f362e7db0702f4fc5fa098b0b328752e7d7fce1d4c3b0b15a4befa75bdf709e02d5e0e40ea5a932231908bf01133ff73921982e2b226f12b7bbf91d7c22b8c104ec6db4c6a80b6228d0420159ef01d3105f216595d913e88d238675da1301aadbcca9a6afe54c883af6fa88b942d97fb6a5fca8f44e664b6b15baa7ee94f253e99ecc96b2ea39677296a57658146c7c408dee8dce6c2af8a3e1b5b669985de72f62d8f79ca05c8cd562daf98e457afae9143e4d25b968e8ed4f9d19d9c91a59ccad5930b5ebbdc6578afda138c00a855addc627f245ac5572eea5a6c38eb12a0b65ac0e23f732c472b1415e0ec217770f9b2f0127424551d8a4d04cb1ab00dde198a675848a0fcafaeeddb234b3b516513890ede974210039bc70a6136629ea6a465075dc68b01bad6ad086dc668edb94ea921d074a8192b9266c4ea924fc587dbb2402272dcf58344a4d4db288fabe7bb1392a83580a94c2561939e6e9b8fbbd66746b67e512b3d2621fc33661d2102452b44f353b20e93137353492d44491d824e6c57d8446f9f0d31195c7769886bea98324ff7af740cc691d9c4fda793c75ec9f2319b00089aebd4c08fa0dfc0bcea14511fd33a307517cba534ab8784904adb403ba702ce6420ea236a8dd47655e70da8366b6e32b624541b2128824f9d079062215e73885148ff3b028e036178fc5e04126667af8dee4cd7b6a4b8814eeb27a4ad55a71c1e02a3f4d22b4f15ff7a5ec9b081ee703a7b012f83f9af6e28a1babf4ffa4fcdbfa2be485f237c18bf14c75e537fe1ea5587ed63d59050f967862ec8cacf086965cc4a607a48ac63de95666adb7cbc436c5319ac874bd5f769c66c179d84b25fcd34c74e09e6090e253f038ccb3a271b5823dc0da14857719b7dcd92e39a1594b242538848af102fa1feeddcbff16a81e4e4c406185a2ed8af711f2a2441f490900c8aaea89dfb7f8986e4e2a268c6fd45afa2954128263de6252b91cc5f8ad69c345db3062e7f99c82d9a838cf84cc6d54c37707c930649ae90f9e7a088be3233013d5cb2ce993d8c7e5339243a6c61438dafc5bea3a090c0788013b4d21c074c1fdc749a9f41e1c1ba217e33e958c6757f594a710bffa07fdf0884b7f5ed1119f58732104236ed6ec39c3a189515d29ae231593eea5ee668177ba03eb5cdc7cba687a05954390e556df7f2c0073f33245d6d279c3f3cd6f264be1cea6510ddd5499b3cc6b1da916ef48df5126d26dc3d2abdd026e65b061e3bd3744ee5fa1803489079a757aee860401f3cca09d9ea4e09a4fd8a1ebc9efb1c6f4aefd0002e67b68c7c96e299bd245927cc5d9792e9e3123beb569d6d532f819c10b952188f4debdf789d87af05278cc9e2f9ef255a4d47025eeac20b68427d86d62a33d9d01624e9eb1b64013920b8b7f1daf74379f922a668116c3f248c39e48cbde5b1ce645d81e220646422449f8504df33d34c1088eda0248a65472bd9e9ad71a022de7c8a5afe32d991c643a3ccaa97b87294bff65d166c460943b2db91828088f56a0be9214b535c60b60156185e98081cf7ad854df427b3937d40cea827360ac6b088d65368c7ac81f0781bc968322c74b115b0b436a5dba949696e8629277a4324e9598d5c7dedab4a573e86245112c91c5b37134a7e1654bbe6427b8b320e6ea40e31ff4b669496495e1fe8a908de54f80c47d0ea43948688d7151a4ea1005e718818641f733968f1d9c72e021b7d11a9fce441355aa13ce27e019ae4aa638665c03e16b4a9e73d4dba2cde088c3fa2171b6ce7408d37928d7546added9a74211672208614553683dfb06d4d94981c2ddcbd235e207bd848954574d4490131b10f2cbbdb9577160b0a8c813d957ffc3a29969423bfe87e1f904bd601bea8ad08987b4f406d9ac0480ffa19846754e21bfe6914e2c10e8d28ba5bb1a11d1489bbb89a765d763c12e855ce65a0b5d8a9a9c7cca12a117afbeb2d48848b7abebc5524450ea4fbf720a65aad27d417bb019e17cd33789e8d88c7a7834f83df4cb5935f263d404dd524ab53657324f705fb810cb8083b5b349cbb593bdf4420f1fb8ec5c126e9937760ccb3433bb045f25ab0e3513bf9615f32e9f88b0eb678d8a8ae6cd610277b7cfe139c3edb35fd4eaf323ecb7eaca1a9400f6da2ab02f0852b0f77f7ec560d72a94f49f709cb6f37f2323d79f692151f3bf30e7a599c6d2cbce036f92ab6bac86f9cfe985cc27e6a139ba06e4db35d92cb299a36289e464cac47950435aee8cdda436f197f9fadc3be1cba542b4ce62a41abdc5a20d19f352a1200b21f1341714a6814a1661061080742a12acc84b9a352b91a68d8320028f0e8e4fa2563f33cb80cc61de244c8815f7405428b3b7d184b0610efe56f02809c89b2f6c35eed638e30a5eeb29c7c5cfabbee01e9a3c5db1510fef8d0212910ff8d683b371765fe8d0152d5a884dc509c976b6ca5514d0953a52519858db230f782ad5086c2de71ed63c9ed103fa6aad5efb6d672b1beaf48db55122aab8d506d4c1b4c5b1420c0b3ff0a63b03f107b0127cf7855f5138d0cff212b38c4a5e836e0bd710fc27fd2f64c3af2927fc5121c3c7b6852bdebf409d2a6a198a9ce0f17f94da158f11b3cc375ea3003ed023c72bebce2d8b529badde3df62a7e3b7611ce8b4f266f547bfee2a108eb51696163fb7404dd1e00206717680bd0450b358e0443f323a231e3648b4843dfaf561d1f40b316853985e0e7e6b6b183a883e78b6fe052f7353de78497cfcdd1bfdc80dbd680b8dc34cf7b95c0376f23b268d2a8dd520c64862df0de08ee7f381d3900bc3b8faac11b44dd287220a7ce16d62389a83453f90d3255a3d889a24411fc049137c50571500d08f473d0f0780775c500607188b44a8840a480fe9da92679fd00ea08f8a03800f84cc81945a0f813dfbc90dd2d94ce40d0e74f54dd2150cc349ba66fa4dd28d3081d3da604162b707f01e237092d01c97a1e36af326e9ba0e4ed2ef368033134ed29115601bc3493af9022cd1e124e1ed558af9243ac1f677842f00161fc3b23849d76f8c93942d12dfa2065ffa4ed8384967552e15519195301db5408e5d1558671586bde885c07c9afa957a717bbc214ed2b40baa65f688cc942ee9b8d6bc9a6d4c824e92860fce896acc498a99a3c102afd37dd003d2c6297b55fd759b7034eed4d1249d846bfa1df3c0b5f15741c3c0298ea59388a8d732495facadc21279968bbf7aec041ef75a19fae5b52572c48b92980f4f6d64ace44bcff9917e3d14977880686307eae0d475251dfe3ee8fee6d00db15eddf262f85e5e1dcc3738afff3a0d1fea23493ad1fa622a4f7b2441c3c60f567dd5020f2034b3cf57be73f7237f7793fb9737868e3c614c8f0d7a5d7e57e310da3d3b5e0a30ec8028f4a910bd950f401b9b138f839a3fe996f2c8869c95dc4c3fc4cce3a6833cdbae2bbbf666e6094c1d3a4f243dc7ac3351b5a35a6b5e886bd0733b87b17418476b62cda792293ea20b0f126f42c80a5002f9f3f6913b38847a18d5922a386047c0cc305960c52d9993edc3ef76bd7d1667461e61340038795340180658e1bcdfca6cef83e3fb8ef7e1c46237ef45347db9f3f213b1ed71000cb1100a84d1165444d170035b142c2fecf4cac5df645021bb89e58cada71090b1fdca50bbe65a8fc5e081f1c6abec82f2fdc7fbcef49f026ed3e37cd6f3dc5c6afb1f62373ddc401d72ad4e567109a33d7dd8a132decfdeae094b9bc7ab727118d1a5eda41dc9782ca76d3876639d664095273d94f2632d1b6d6a4697dc105d9895df8a6f48563c1e76fa5b7fbfeabec5922983c3f2c085167af7a42e113b0654a869e7ea2ecd3ae5b8d038ebe2f0f29eb75aa811ca3437df9472e5d7dc5ff759050b34b525b610c605a7febc4045bce3bd1043348e1678d11e510f17513fca5a853ffe8f682e4aab33d1fbdb0dbb2c9afbbb7b7c2935b679cf292c6f0f03c7856ff2e530acf9a861f30f2bd232d42b3c27baee2cb7d9b45ca0768a61b8902712e06ed1e65cd00e912f43a61ee76e1ac3452a8b61dbaa37efbed3e527c4068f85ab7d90b21a79f54cd9eabb9677152fbc7b62c0dbfeb5b63b105310c48efb1ea855ef1d476bd9e657ab59e0389bdc9101c21963570772d8aa46684cac41a76de25279bf181eb35f5b6eb2904c783e2be599a9fb29eb2c8caa252ee494ea5f4caba60b866ab0651a4b0a29e38398d08fcbc4e941e3cd58e1a529559233d53de7231c7f91cb0ee262afe4040407ccae06328722d736f99f78dae8ef6ae6fe6e060507700833ed4ffe70e983e96a63c846ece7ae3635a39e21f818122082a8fdbf01591c6c873c8da5b6d79738c9b8e3bd506667c98bf5f008b21edbb154b62703d725dffbcdb89e4d237540a3f90a113bf946af8dfa2652447001093ed94fe62e2a69b2e9abc1d2db3014d95bc3852e0ddfeaf51ac366dfc8fdbc26612453bff09e38e7813e7172b0b3fbd794ee7195c5874376e6eb2c6de7018e5a2b382bbaa3f60cd98c87a3f738f63998e73ddb0e7435446fd7385d65bf2711dcfc207f4ebedafcafb60ecd1e634271f8bc46f42f68f621c4793a3609b96686f74ed8059cfbc7b837eedf8777f99d3361fb23ce21a03917c3c0792afa6a8ac9523da2393fc2aae5508e859574bf879df37b73dff02f59d9ab3d6cb7dada8a316be5174e5a7b44cfee200f08bc8ff66849580fcb71cb62bee95cf7fc79112c6dcffbdde52d262b4f0c9c528acdd4c012f39b5a9e7ba9ff49842acde3ecb5a67ba4e8f90e95bae9f055be881a6f243e8ca56612df6f151b1045a5e8043287cb786f4a72ca627a72d517c8856a2cb43b6b0517880bbe6473cc69f1b0e0b829034b91603a3e4a6f4a2fc5559da83197a0144680e342e160750d1f6bfaaab59d3d448bd2b8317298d9c02431df2b6c17df6163b54fadb6933b442934572a90d5dcce7dca147bbc9792c26812c546ca8041626191e02aada7557ab58ddd2ab451c9d8384ad8c8689828ef2d628fd5b5b4b2a7aeb14b392316322b8b2417190db5f2836df45ea9955676eb347127a5c14469611373a2a2a69738758edfca9a32abe3ce65e35a46e0f6f9b6e968cb97cd22d8b4bb06ce1a79aa4989dac50e76ec071ef9b122dee5a24394c8abd2245f37aca1923e91c6bd3fea0c057f5731cdfdb23542ba4b89c8278f56a1319faa405fdd3a828c7b2f95f8c9de2e349977c9e8cb738e10913715925e6fda2241be2a2b53904be7a35a437b3c4171ce6f4ac4ec59c2fe307d6663f09d0feb8fdda6beb310116121953fa1b76e44d6f507b2bc00d0791cb3d4b5d293a8c806e6366ac4a283e277cd72c64be12836bdf6c423185a936aced8fabb0c3447c5fee115e740fcabbc8b2302600f9af8a7e755c62d3675d72407201f72a4793c5d97d3b0d93953f3ab34237815399b93ff24942fb5c4afc50138cd6867615ea5f6b8060ff276688aef158508eab6b74e772084f7a9de2035fc088a4d03a921a789ca51525aed16f14b4dc942ef0d8c99b3a3018424da70c72ed7b6272710b4eed45f46483326dc359d0ea3529a683350f5cc0a7e8cd88ca725934fc41440186ccca6722b57a39999e9122064d3ed13200ad825657173029d5b94d99460792fe70874377af1101250f384243b55c9219786bc5137b971845eca1727810b4f001f09e5835b78129c651fbb6bcd238e6d7c57f017b5fe697a4afeb3e311e773f3360c01e5e623a953e59fdd79ad5e88f445ccb4770167893c8770ebb645d05ca25221a8f47c77f51cc11c92204b917fec5a668cd1ddf0c2f4cf29e37171904befc3ae676da8c5b6f979b533166472fb143d908a3afb9af383024cdb4f5798b3ad148dc043a64f85f087a4cbb95a51cc5889833caf28ffad477e7887fe94c66ff59c869c559a3054e5d17610ae35df981f27c005bbdb0d41ae138609388fa2a72c30975a9daf640bfdda145ac918a83706bdb271fa1a14fb440758f0304709d31886e8a75d1a42c14c90288ddbbeea42cb2f59e7a05bcf2f04c7df6ed5f5d96277772ae7b1846ef2987b55fd101b89fba71ff8bcd7b7aaa4a6a3c13707c57a09c118b543cddaf94bfbdb4bc077c1b94fc5cce6e842d0fd28d4063caf56189c683423df5a0c40e358bc069072c3d9f66ea543507748c5e7b877582851d6f10e3402319d0ef5bd69aab82fe602f13a051caf5a53afc7387f0ca69efd92dde33cd60ec5c003810f8af33d51b7696778bf91369bcdde3007836fec2280debcc6089cbff562b58b64f2c02a6d36026db2cf6b58f3630d9b7f5f913987f53a542ac2ba057a313542faab50d3e58fc69fbb03a916a1973f462bd4de485f18e207e1fc91628a915a80bc846b31ec91d61e9ea705ee223b9aaf5a932b6bc2fb4c00cf21a5ad6d8ba0493c73255685eb1a6fd5174318c70eb453250054efc5c642bfc6b04aa168b0f1936d357f80634fd5cd94718f1bd919932efb84b330cfa142e512c3b1b024ebe0b5d40695d62d02ea6cdf0fde9ffe8e13d29aaef8ac90518c0987a849e04955517254274f098147c9610c03f45d32da2ea5b49c5bce15ca25f0abf11c6f9ba3fcdd7c08bfd376778b05be5013cab14f4b9dd11f5edae4e73a904a9c8495cd1aa1d9baa79b3692528dbe84962e45becdb2e24f45753ba155306b1108eb121b51db36930bbe34f200f2b123ad96e7a38c081b4857fc9203bcfab7d9e551a8dc2a7169d314bb57e674393f28dae320a654791ba60f9fe4be229c8e10b8f7422579e4e1425524004c5b066daf13ce42f96c8724c5af3c916b384b7ddef0ece6dd5338150074fcf4467a8bfff45ccc7d24c5a32b8e11ae08da7ee26247de9354f9db087b3dfb5abbaeac8c0ab48fa6d404691eee0d2c0dc3da79f40bd386e95dcfa591b4d3196b84e0b84cadf03191b45b22d3dfc09cfee0df904502821de90b6482aaca9a3f35870ee259868dcdfa468a9191d69c17e3e1b85b65ca12820118ce83717d3ade54861b08023bc874e6b15750ae640891f5023e928ce92aeb2c83b82a00fd5d8857864641b6432797e3840229fec07079bc74813fed1d64354e2d9055dc28a3e32d9c533ea99f450a2f8bf7b4e2732e132e77a72602eb8f5e353b34c8a88827b010ce03aa3ea60bad63eaab10caceec88af27af2baa815883cd5187c686432f472804728f0568d98df599d3007ced9e81837cb1668fd94425380e221eda9f4c49dceaa314179a1e802d4b145bc8618d33877bc1ba2560ca65d97c113f9f4f96c55dc8820c2f74032f00071fa1544dbfecb5978b9bffba986ece0c2efaa973db7b9c8356ce441b9e8460609023d59d802e4a53c803553613c962f013eeec30f52467a1cfad166263b8bd94d23067a17488b7f7515ec9caec6dd9fa20c0f900c0797723bc286f67a3a4ac7690c46e7cac866562c7488ddf5ce64841ef11daa2188f134cd1464814b1214c78b43484396e5075ee133837829f290bc9dc1b9e47b4004463ed3b3dc033bd729aa08a9bf917c69e6f3b4a9f33fff4b230a03fb31bd5480352e95431630e284d758f3c03e38f302cafa62cc7f45b26e9ba412f9267b0ef8eb0d30725992d227d5bc0f0c6b53b27ee3370261be0f9fb7509efe28772c9e1138037d8512d274e57b22459a2a03298cafc08c5079770fc6381345b374fc81a47b8b2c677147e9357ee62189c8e298a6a60f26ac3a93e9941d362a634e58936afc1c0486911023e057c56162bd7bd85ad41028e5cc41d0b3750b0a6d001f3ffffffffffffffffffe305ff8da9350bd4b62fa54c2539c4ea4901d9814b29a594524a625091dda9510081d357818906f52a0b1c0b850aacfac18492247568d4d8fa2d421ee981be48cbc0c712b0afd5aaabcebdd7abd5acce3463a2a7d0bdf94309e5d869553b08b30eeff7133e9250d660a7a3d3c88d498da0f08184d28ba636797a4c1ed5f218c378d147f83842b9245162f6f84128f9361f4628aec9370de2c4c6d4a322944f8d1a1199f12628f90711ca2df64187feb0e76a7f0ca1a073ec596e2741c6b91f4228ff2725749efe4927a60a3e825012d4d5892d624fbc8b3e8050fc90aeaa31985615d9031f3f606bb3edb4f632dd5d4d7cb4a6cf8fbebb37f9f041b9b4983a31f1ae49591f3d2827ed419430ade141d9e2e3cbbd87bc09f90e8ab93e43bd0839f7ec4307e5d4df2565509fd65e2e0a3af3c8d89d4109f2640ff262062e4a1f7783a79defe7a08ed16309336e51fca83da65f5cb38e0e211d6394a00a336c51ee127d4e5c8e95e6b0da1966d4a2d46bda1da446392f8f16e52e79a74b98a424317a35d874a0f5d891c38b3176f060c62c4ad76eb2e896922f99a69da08b19b228289df73d87fc3f494b6698118bc29afdb59e6d8e9ede8245594f5242d5bd9e7cda7b45514d9ad9106ac36b9a5da4892122922606a6a161862bca3b763a87d2bc5e92588f19ad28998c3974e8f5d24f25ac28782859cdadfa648c76c62aca9e2d4e9f6879faeb9d1bc8060644446eb9304315a5caa0a367ba4e8f494a444444648c1e222263f4b85494c460f623b4c467293120cc404571b6bc3fc961e2c71234e314e7139d9932b38b5de9801264c0c68e12cc30453978277dd51427cbf93b8a8888d9816694a2ec26a3aba48adc4ffdad600629ca967aa55fcdc4d31d9d01c271b6b73346518c634a8fcaab8c2739b223c7c80ccc8e911ee80bde19a228e6d0385fd2d34f10322899a96d28ca49ce9bf1bb1c312dcd004549ead17a35a95f4ad26d61c6278a5f23f36f55ec7b8e01c30c4f147ff3e44e67f3cc8ce4e8719672e4d8e1c5716046274a7eb259654ede896bea81be680f80318313a5be18a1d4c8e456f2dd44490751be7d3afb2faa26ca312f940c3297fd9e3013856b378f9dc4cc5bbf61a21862d276899f4ac97acdb8c42a7a9492492a1527a7c20c4b74b2c4a634a5496fb93da31206f1b650d27b435d66b6a3870e35cca044e94d76b8768eb1bb4fa2f0a763bf8c2a6dc442314312a58d97dd9893772ca1f502470e1b35b001868d1e3a429036e289199128bc9b24474936ce80444195207fdb275682198f2896ffc63aa97711cc7044f97a55e39b6c4c92e48591d803331a51f03325c8584a8cb915ef0c4614e4d5933c23a4ee891af38c4514f4fe46a88c159e7f4e780e2841067084c00421288107b410331451be0fd24d7d4753f1a24494b554ec89a97ed9a84144498e2a2689692be93b93a007e261851987b8f5b6732a39e885091266182299c48f59db1935f62e44f9f3c924de7db052a2448852aba8aecff1e4d47d1a4459dc936849bb20ca19fb6de4a98f1c88627dac0b114da72603a22484879bad76bb7ee90fe53a0f9dbfa9f359c70fc5b5132adbe5e39d491f8af7da252839c56a7d880f65ff24ac9e3c4ac973da433168dcde6c7fb5ac87927f701393d89edf9e3c9474f99f8e6c97b8f7e0a1a4b1a34a5a4f579f3b1446de85dfe772bf8e1dca37aa4a49924ed7a1289a367f4ff0e95092447d934b75959caa9f437174149d7a82d424a7891cca3ddad44db40dbf328943d1bdf3993cede1505c8f9abf9d94db66c91b0ab24d2c31ed1cb356e386923ca6c4c98c76bacbb4a1a4f79625462b3399c386e2f9e97b77a59ea4c4d7500eefa1aa368dd7dcae86624ebfa374c790fd6aa7a1a827497fb27d7f4e66a3a17c625d8dd8f24c26c919cabb49dcce2746654dcc50b6934b0ed1eb13ddcb508e150d25952428f32c93a1a02733c7111e1762e5319446e3bdc84df1bd273194c4dbfaf4ed398ceec3504e26e63841698db272c150142508db12e37ea1a0ef63671c0b31a2a35e706e2bad3cc4553cd6f3e30435259358d25f06a330a30bc59324b9944d3d5d3d17caa54a2e4f689dfe5db750d269d46375bffc66550be5bcaa11bb0feb13d52c1476f48a27e1a2b33dc542c9d7bbd7e45aa8bbf40aa5cc645792dc2763a7b442397dcc68582735b9ce2a14b5378a3639c9cb9a910ac518ee277b69ac3e1d4ea1bc319d3efb543fc9432994d396db8dc9feb9e18b42f1c46aff097192b0e541a1a0a91b4c959e7a8ef78452f57638257e1efb3a27944a899f3bc4f327555d138a63d2679334d3d549624239cbb47b9edc2643b48462879a5135624a68df94d00953124ab2f17c7b3b644d24944a7ad437b9eb25b423147406913b49c6eb5099114ae669329328e755b245282941e9eccb3ba924b56ab089c125f08003789c80ed0233885012e3f2c1841b8d813a306308c59cb762d38c8c304308c53a498e25868f86d63077302308a5766d4f9ad7e48778fa0633805052257a8cd3a394b4ebfca0a03566aa93a3c9a1323683193e2889e84d6392346b19790fcaa3614c06edf82d629dc183820acf7136b3a4e6ba25f8c08c1d143b8a92d3897fd11d634b83193a2869f79234ddcc09a6b5c00578c8c845b9ee3f08751e279a88b828a66c1575627ff4936e519257e43d557cd8dcdba2a0ff4f50fba3f309f5ec56462dca37dbb272a2c4b38368511657cbb0e9417437627adc40474bc62c30214316326251f23bd72d1d4cee6b0916c59874c9a5635e514ed7932aba4af2f8619e2bca266e84f024786550d93b21a3158571138ffb8c7b400e3258511e351ee29d7fb22504858c555842b7688ebfc91a6cad0819aa2885e66c93eb93ca4f5d4d3cebc20155d00d1d615042462a92a94bac0d625a03840c54ec39c94176d0cb384571d5fbfd4f94d43b5a9b424b513ed3513c3b7d7cc8510db62e5a06298a556a1ac3693695165f41c6284a7a4c9c7dc7f4321a248ad29fe8e8e9242944c98f0a324251be4f2793123bc99724074539063731068d955e57956541c6274a23b75e64903717f3a64086278a9661d4a787072bed844046278afbeb5d32a852f95633270a52b32849e8964e3ac9d94451b497d97e283168d835d8fa0b199a286df41876c42741ce23692023132652323051cc25271944b3b6046da01e3970dc8921e312a5cc37417814ed3931aec1c6c312254dd36592be7bea6ec8a844e9fefcc22e4c6ab095c14006250a72a64c906bf2c9266912c5327964e8b73d2ffb48226bd9758fb3b73439799372b7d1c48369b3070e2406d2489447aaa9f424892766fe2151ccd13f6bd276f288926fbe8f25694eeb1376043a08791af39a67244f006a90d18872eb5d998a12ada14d198c28b8aca9c7c320216311a53dfdfbbfcd1cfdda0c38a00b0760a00b075ca00b45944cc73254575db89f12511294b0c17653eba90c21a23c9ad25427fd10a50f7f3d2274c72eb93644394bcedd93319b46890b6132086122320651dcfba47f83d092e346100551bee14ecea08c409473f5e43ffd5aff7f02a2a8361e94609db294ace51fcad6ee6fa33df38d34f9a11c3b0927c9ec8f6998fa5090d7e92bb497d49cf47c28f968debc50929acffe1e8a318752a2995dc7445d0f05d99525981cf485a79d8772ec29394f92649eb8160fe50b99547ed76e268ddea1b4224be98d63dd36423b94b4899d316e92b89a5887f27a582f75191e3f3a3a14f4a7aa5f076b0ec5ac41f6ed93a88949e450ccfb3a31a77ff42cc6a1245789dbb9a309131e1c8a2d3af6e8306a94b6ac069bcb7843614e26fb9c64e632dc507e1374d09a8427a30dc5702aacabe41995ed6143c1b3e9d47b6238151fabc1bc2058c14822630de5d04912b306e93e164217c850437a4cd298af3a6632d2505ecfabbad59a7e73d25720030da59247c6c3261d11dae40c05efa4d5b38b798aba6598a11863ea9aa05b4735c9915186620ca64afe317d52cf4b818ec82083a3ebb9def5edaa6b1dca1843e9ec2e2de365f40c722cc8104369e457d7ffe80ed62714a128c7b1b9b971d1a5e4041405ffccf598f53269367da2641bdf49c67d9253e9ac27feb897c95e83e7b4d560f303e944df16e39a7395da159abba2ba6537a98f9906e144b93386afd050fa93fda6038c0d8c61011e3c8c1725101111c102c826ca6da228bdeeb44955b691d2c8063080013078981988885c8f1c88264a42ecd68d66f18bc1d84c945ad38919226312c48b291d13651363e83869bd44517c4f38c1df3e9490d560b344f93688081d6495f4c9adc1e61a00a944c133ebe636fbf0714c104a14e7c4132afff993a559832d9737003289e2ac6afc977635d85a12e5f21c4288e83a313d58836df5225130bd31c466db491dcbb21a3c4c0d8604183972cc0079c4c161630638c25000882350d3a94bd384de3c6ea0911d3946741830cc14a411a699e9d9e8b7566a5d6b90f939c631419e98f230eb208c28a7964d25c7a04b3c89376ed8e88088480e1b233a4016514a93a69dc4e4c7cfb9065b2ba2a4c49dc8b3ab39c94414b48326b1d3c4d58ab206db88c560f5743ce29178401051f64d4254fbf728213f4431f6e7832ecd0b104394c6ba4d6e5027bdec852869feb41e74793ef14a35b88010a2244a689a47d5dd9ce47c00641085fd92bf56c4e7d4f1d342002288c2dfa69a7daf02510c729497e850cfa4551e8028a9892563a639d51ef11f4af1418792ebf643f94cf89c4fc3428d5abb0fc5a46b4c2e4fe21280f0a15cf25a94e841a88c27dd3d9475fd3d6ede0a2d1fba00440fa51e7515ef94c7480f1e396a8ce0d871769a87928fe79869885b2825207828c818649a5321b4f6976ab0d90540ee50f0cce96c7392df33c8d8a1b4252659ecede7949c04528772f82ef151f4c692ee0e2347004287d2a83817a5c6442ebd3914d4b5e6868e793849930377aa67f9ee6e39a3bb75d52644ab66f0310ee5b4794e1ee52aa7a60403040ec5fb371bed41e6503257836d643d50010b84c00319d811a423c7f3c000c81b0aa6faea42fc479892c423a6390071433973ee74a5e2c3bb3d6d288ae91d8dad13af3af288311bcae94c8e25f3998a5e07b28692bad10dcfd2aaa1f8b9c35e68aa1619769034144ba8f5b096a7c4eb183494fe3d6f7be4894ce19ea1ac9599fcb6fe37a88803103314f75bfd73dcd2e6a51cb11e8094a174b3594efc6df851a2642858ac68f5ab2063e832c6db72f533e5ebcc35ec6d0655259da0e488a1b43968a9cf69e35b99c250506ec243f399688c6930949468eacc2c9374895344a447be50aa758d6bb2a46a985e444444c4023005102f945f64cdc462d8387801ef334fc32e14cd7e4cde64c993c1c385d29a10f7b2398ff818826ca1287373eda3e35a28cbfbb79c2475de2df5004816763755ab7333abd431eda4f3bd64fa8d261b040ba51dd53aaba1329aa357286b27f957692687f512102b98cec47a28597bddd14347154a72f2898554b3ca97bdf080035c0708158aeb36ea393b4bf05c4da15ca3de84b92b293f9614cac142a95413bec9548d4241a5eb7f956062cef9650c40a050dedff799bd8da925863000794249c99d8431f94493f24939722437409c5076dfbc96fd23d4ef046942c1c415b9a9ed44c998634249127f4d4e2b7b07204b28e658374aa6302d994a1025147d3d294937c6d292e477e418c1b103b1ed40361a042049286fb5d6c9e2792414773b09a62656cc9d06e408250b93e47ffd33a10b201d639400c408a52a99c4b4f93656b72f42c1772f37094a3f491f118a79c3aee4a44f968f15c8105817efb09dd3789b3bf1e47b2ae76a64d6eb858d1b3a48b0a3070f268008a1249a4af8ac92fea64a4128f79cfcf5593f296172805010a24a89d1318934dd82fca024674f2ed70fba4d388d9801c407452d39aec4b7ba64cf9c01a407a53f61a6bf33c8ec69abd1c37821624078505a51e7969fe4e8f59e306ea01d3ab8417650509db385123e66daf76bf4305e648d1e46478ed1e312440705e17967629256d3838111ece8a1033f725192c4f3d32ab93fe8a415e10317855192cc98459bb2b17c448701836f51727fb33b9d2461c26dc6e88136826e5b94574c882ecd74aa416fc3060f1b6d3c6ed8e811c6043e6a51fc601f94ef8d6713215a9474dc6492e44ef2f7fa6316c59c2479277912379d541fb228e8269997f9672135ff118b922c2dbaac4b89694c0d8b62123f944e71623ca54baf289caef1d54baf39c9e38a92f4b5d9c39fbe15e5305d1b3fb6748ff25951bcf4dbcb20b6ce04d12a4aa3748ad9ce1faa289ebad04fea93a404db3f52b1ea87e767d5e57dde2c31d58e8a82693e2b496b0e42cfe91405b7d161f4c5cf6ed60f5394f2a49720abdb5214dfce3a56a8dc9157c2a4289fad798a5e358aa28666c9f9197b4e7c5194c4a7bd1216c284f17028b06b79f30eb76dcda0d4e68787133f061405cf8e9f4cf6f4fae9e211e3a138f8f8843b77d9197a1976f6d6b5e349f35629d34e41b08291fff044a98376969c3ad7e84264081f9d28471ba13f2c838bc529abf0c189f2c9ef13199452baf5772b7c6ca21864124d45b54acd896ba270820951929edfbddf9928e6cb2cef7d52a9f7e0b0516304d5c0060fdfc031c20726caa9abdfb6545ba8e72f51ce2ea36ab724f9b044d12e741c9131e8119e57a2e0ddb3b9fa46664d6228510ce6211e476fced99f447964f239a5b49bc68e240a7a469898ff04e541e644a2643a6d6c51564a7cfc2051b292b5d43bfc3c6c924794adcd72dbdebf6b5347b0ba6b15737b5a333bee495a77688c1e9d3dd78862f61ad5b129459b9e8c28761e1d5c464ca8f0b188726c7e2ba542dced7c468c47d98722cafa26d49e52c2665161224afda7a949cfe62b1d4444b1b693a41a4fce25d7fd384459b34f858e312f49bf86287e7febc83a9d6936fc2844c13c4385e91875378608513e61772adf8396e83a085dd7cbd63d65b6bb544cc409a521ff10c469322b6a77a26f1ae7cee0231085eb9c35c63971d4bdfa0188d2998e67bafad424361f7f288ca9ee074e44b5c45e2df6eeee6efdd7fad63c4686b00fe590db645e995f691f3e944dc78611d23bbc89e7c71ecaa79ba5aade41f3a71f7a28ec76724f8d6d755e9287f208557a27da6d8ce14444e43ef050dadc75dae4e9fccea13b147b736a47b17cfbd0dba15432ad6ed0df3f22af03b6fbb519d6e2eab19a693baa5a847a65ea381d8a79319aa7ff842a25660ee54f428cc98cd5f5ba466c071f7228995ce269d8fca2aac238149330ad1a2d933afd1f0eb799ab5ae795e6cb6be97f5f8f8db2ead4ce1bca499c124f857652b29548c7c80808563022f2e186f249371d9b492b4d6e379272e0a30d2535a165a2e98b1c37f0830d6553fa83feed18a9395c838d7378600d6a99c9a859b8ced9e76ab9baf667f6a8c96ea32fbec8e1011d39402022f2458e1b8a231f6a2829f9546463d488f0918662f468ca35a80d2d51c4c3d4f082476c8c0f3494e3652ed1a0f7ebb530c0c0303e202252a3878d1d464484878d4444a441b082911d1f672879f0d4951b1d32c2fc3043f1b46a9fd84b6dd1a532143bdf4eac4296a41eeec207194a8278fe8fb1fdecd63486b2a868c6e8f32c5b6231943e9695eaf2bbd0a7ea8f3094f4a9b9882a3bdf24db4cf80043498f99c6a6ca33a1a11a1f5f38c711ab1a6ffd46c287174aff6d25d867ccd117f22e944a4cc2e4937e3eebe2830b6d6ca8bb6bc6b69b8ac9373a275389b5f2630b65cb4da3935ea893311f5a28e7dfc792eb5ab1b267a1207a564669f0749a3e168a293383babb3019f2fab842b9e4c6be0fe739797bac50beb41d137fbd1bc7ab4249d027474da2f1fbe1f44185b28765ce134f0c99229a422aa7359a769fed31e698f999617a238582fe2c72a2e63a49cd298c1ea607099e870d30320a05a162bb5b644e236ff30185d2d8c9afe9f166827bd6c2a0c0c7130a667aff83a879cf7e72426193a4dc5cd3f69a29694241953071ec3e7a3a7b858c95b9f486d5ac2856e5793631588887575150bef3276891d93cab8a72899b1fa127fe7816a5a21473623eadae938e225494366e8d2e3d41f54f748ab29b0c2f21b39e9c49a628e6933e953695a254920c7ac3d897ac0f290af24689b26daae44e328a92da50a6346e8e284aee25a6acc985a2e095de25758995125094ccf3fb7cccda95fe89e2dce5a60c7d25acf5444149566de7514df6b21325f9e3942489fdb92572a224ba9c248cd62731da4469d6554d8e0f9f369a2867ca16edeb17595d260a9a1ba672a5ef3d4c9493e7d3b06174d09b5da26827768b1225dddc752c51d2d6b8eaf93696872a518e1d3f9a49ff2b27871285510f3e5a367799499484b490c14d4e92d79228e7909f2ff4689df2235132359eccc594a50912e55c25fb7d6c0eda4e1e5110934fbe986afadb11c58f399747cf34a2ac31c77785ce8892ca0d31e14fcb997811253d26897ae762d2ce8a28c60cd576d35baf73220ef51c3f220a9e7af46c7f7eebf80f51f8cdbff119e4dfab6f887292e489d9b1d91dea17a2a4fc64f8f150b2593e210a9a7a5496540ea27c728a09599739882888a209eafb944cff655f20cae96f3fee49920a88c2dedfe547cb2f49f57f289ae8d759c47cda3cf9a1307ac6f39b4eaa7a1f0ada5afda924a9fc3a7c28fc09a125ef3cf5670fc5aca9eb4b7fc8cebc1e0aea6bc4e44f82f76ef25036f17cd6bb31f78f8782feca4e7692c5ec77289975a64fafd359b71dcae1c44a936468ec88eb50d0969e4bbb7583bf7428890ca1fbab574cce1c0a3afa4f0e4ff9e145391494ecfecdc9257140b7893ff14b2a8143614498faa44bf3a92b794371f524f17513f49a927143d94428ddaa3ea73dc8b4a1247d65f39d24069939860d25db1ca5fda21bce63d6503649552ddb94dc496fd450f0244982da9c1354ff260dc58d969ab663d050f0f6d5f8f4934cce983394cd6dd48d4979f2e7c60ce5cb5152d4c93ea2644d194a5a47de8355ff556bc8501c4f826c8ca54a4d3563288838d1d444b51f4d8d18ca256f6e726fc599ce84a118449e6e8a8ea56e33602866bf8dd3cde37196f942c174ed447369905a192f9404ef942668ac93a9d485d2e9c7c99a6469349173a124691719db4aceb069df42f9c492938e9f3b97c8ae856289497aebead194ab67a12474a86d6a6ab73f1d0bc592b3c9399f903143e75728e6ceb1ba634229d1732b947ff4f6ebe309c23caf42b9243177c29e4e85b2858ee177d6d1f7f229945773b6f827eb303a52285f4659d5a4f56a3e51286fa898933aee95ea40a128ea663e64c93ca5e409e53863e3492e8fb927ed849264baef43ca26a14cba09257fcfb1d48427e1c43413cad9329b66bab5ebbc97507c13f4d99c5809452d51d2cb730ca96527a1fc69a3d3efef3d093612cad916fa6fa56f37d84728cc8cca8b9ac919c5364269c43cdcc7d0f6f87511ca3ee25d25c91dfb4144285b9e384194203b4d348482f8b095f27532e9470845afcd3db13e3f674f100a4a368bc9d4014271cdf3e6ecedb531f94141c488766d11b2e4f8a024c23abaf5694ea3e9413163708d2346e5089d0725b13b268941cd08d841f9536398195926879911a08372c8d3b1445b75f9967351b453a2c88ee9d526cab8288c9b341ddfcfcc55be45494ee7b07db2899224d916c50fa77e52c9b5282799348851378d1f322d4a26db1994b693a3733c8b927750dfa9be47c8c6b228cd899d474bdcb3671c8ba25ce82fd59e345bc6b02887ce8aaef92494a9f815e5389ff24cf6db66932b8a6b2645d5c97e133ead28c6111fcb4f8e1d9a6745b94e4bf8e81275f5afa2b8993689e6a6cc645f15c58d35b24b50fa75946c2a8af1f92676972c2a8ab9bfd16374955fc99ea2b8257a3cbdf9e7f4664d51f0134ba8570ba5b3d952144fe69a773613d3334b8ae2de5c6fec51255fed280aa6bfa3e7d920ab8444512a71a34289494251fa3c2ffb41e4aa7b4051d05cf1d19de236fe9f28662c294afecac3f99e28a5f629d9b4e40d53d28992a022e7df6cebf4841305d9951bcb924d14eeb3e7a0a4c66ecd68a2b0de1a42c9daf8419d8972766f965153a25ead9828968939269d7b89925675fa68354d266a89f2c5ac5507d113ebac44f1430773313532fc48895229318358e8123d8b9328c6894c133beb9dcca9244aa1047526079947b6d34894cf6f93bc322a6d94206152324d8eb7a54714f4e89bab9cb499458e28f528b1aebf11c5116a72b264da0d278c2897f02693d825f4a4c9224a3a42ed84ce33aa4a1451ea30debf493c112535361a633e349e3822ca1a4a8f77783da9f3214aa2e724c6cfd431969b862868f934de692ccbd72c44d13508f15222444990ba7f5ed2ad8d832895983d99f6b5e42d0551bcd31c84d0e2222f0c44498ad15b82d83cee5f02a238a769e3f866924efe50d824d3a62cd946dfe487c29698c40f22d487a26a5dc9569f0f25ad1dc4881e65e59a3d9444aa78d4580fc5db934c8c2668d4681e0a566292c4a084c99e7828e6af9027c62426e13b9443c9b95d6b3b144d6cb80e0531c24f907d9252e24c875259495692245a49329e43f1d4c878b1b9abff4539945debb64c8e273b22c601f70ef3194b877028698a911aaece44eff00de56c92982488d6144a0add50ce1b731abc36ed2d6c4349747e98ce7b8a1ab1a1dcd1ca5cb7449317ada1e4513d6c3a995343319b20eae41b37b1a14b43b92ee663ac57367d0e0dc524644b2e71943c267f672889398eddfb09ba993f3314ed5ef4577eb8ccfc95a164d2959c6c0c3bef1f190a3a94649224fb1b4341f36ecc5e94eb29393194a430cd2787e50976726128767ab97d0c4a6d4e0e0ce5f3a083d666fc9225f785a249ad79ed6ed36dcc79a120dfdceca4c80fb2b92e143f3bea78d2fd30f671a130abaf49062ff9efbc2d94c44c09ba3acc3e97a78592922b971eb56b4d765928f52941544f899975c2424988df39733bd71f5da11ce5326f9ccbb81e59a19c4f9263ebb1e4309f2a14c3acc4097ac54b75a8507aff113bd9e451ea9f42a9a348d592c9c37e2f8582eb98c90d9928144ef49854bf29e9631c0aa5eb78214bcce0b6e927146db40455ea259b64cd09a5cd4e6265975a4fa735a1b8396b996019725734261453e9eb58d2b33e88b684d2e90fd7f63c3298cc9450ecf10b254644e78959128a75231a93c96c599921a17caa6badfb2234a7ec08e51c4bfc9a654628084bd1a23fe6fb7d8a504c92fa78e79d45280f114ae2a34a8dee3dfbce104a4a49f326bb6e09a617424970934da9d33362324128fd5cd606371ba1314028a6fc683a96499356ff4131bb279deb74bec6f601dea635ee9df4a058923659e6266b19f3a09cc104fb78936b4fbb8333c975bd3e0fa08392a8956a32c1d48b72510ca23786f71bb517e2a2f07a9294d9e1f9d7dda2e4a2b724c94743946c5190e9a251dc939096d5a2ac217346d3c9617b5a1434bc7437e80ea7cfa2acdadbd9a40b441605a14bd2495989314b8c4561c564b55f8f9ded1e16c5183265d3b7cc6d4b90579444cd249d92e14ec90fcf00c415c55872af66a79972cd405a511267926eab779b750d8415a59313d74a4e69cfa6045945d93607f5d920a7846c6bb0e1d9d8d12355519026aefac9e527b9a36ca928c8b5d5d1291e77b3e5818a82aa0e4a7ed0f9298a39e7dd4b36379337eb4c51129d63e4ed9aaa65598aa289f341582871c4bf4f8a82cfeae8f3b4e1791a4551b6d475099a49ae154551cca044b9b8fc1d113094409904eeea1a0081068c71a3478d2f6ce0904089f08ad803be078f307614200063241238080100e8c1238c11102000e80b13c61738cc8d1902e0b1037d1827c70e1d1f26484102bce061438741c01800e0c123112180004c0f73440a1000d3c39c1c3b44640060000cf8d88162f0a6078f9191040020000b9081367a8861e3843132f2412310c53bdb7c721ef59175d6e03e0be30c0cb463440c1b67e4a01ad870eb81c386086800a2a05d3ba9faf87f35fea1a4bb64ea48198f73bb1f8af325de736ace8fb90fe5ddd4ce9ca3bed39e6ab02d18080ce481c3468f1d4a830f68a3c78d1a3cccc8c8078d3da08d1e37c200636464060d3d2031728001060243068d3cf4403cf0a0038c3ba08d1e3b6af0b83132f241c30e63e87830101806a05187927f7cf6e9a957ddde79e8c8315234e850aa15a544479cbac8550387b9e1053a3940d048630ee5689fa4d3ccdb3ca6af717228da892da54469d9ba48230e6568ac88e6e69d9c58ee69170d389452338a524a3489814620222206dae16f28cc7c4e52e78b4c4a29b1a5e186e2c61cf4f7c49862736ab10b2f3ce0000c8cc0016a8ca0d1063f45e642decbdc55dfb5d484fecc5f1efa3e1b4a3aa97d3741e6da4c138d351437b3062bff4d4a0e131868a8a19c314abad349b4a70ee1c0008e34c2230da51825f719e7e4b41e1ce686393494373d9c5232499ee1a61a6c3ad270d03843f1839d4e9eac3d682b211a66286ac93bb2840926a56c6ec08046194ae2e4a45c3d7577cce6d081090d3294b34f3a1d32c73be47c24863f8d3114d36e9247732739abb335d87480f1787684800734c450b43c61ae4419a0432720038d30944c7cfa7a5091feb9f3004341a869fcd35ed2f842e14cb20ad5a5be7465396878a114ab9ed27e55b541a30b659383cc6d7ef5d873e1c8010618391e6d070d2e147475ec97caf51c255c83ad078d2d944c575fc8606659f5c9f1366e90000422226946430b45df98d2dbe458af399b5c200734b2506e3761ce662c554fc74251a4c82869ebe4244d8e88881781c6154a7ff25193ea2621b7e3f5041a562827e93bad7ac74cd26eaa5058ff9349ca14a2c2725fd66db5693aa73756a133b7a7bceb0be9148ae984d1317d51ab67f58086148af149e9a73db17e9945a11c8490f3a984126a4e9c0614ca257d57bf9f6425eba5f184d2272f59468941b6e4db09e59837ca6952aeef69d484723aa549b3da8ba57d6830a17cba22b44d6d28391f1a4b70abe4dd34e4b2e4be66ec3ce638dfb99f1d57423135748550257bfef1348146124a36eba7fa47db6fcca18184929a243ee7742a636aa840e308a5f8905f9a7489d598a4065b32e886e9a06184d2a6f712279b4d94d9048146114a1a5b3242bd043113d2204231289bbfedfc2daed31842b9ba7a53c91099c3ad3c6808a138429b1215930f42c1c4cf2aba31ab647d4028bb6bce971f73d02429fda054255b952453e89ba0a6e1835bbdc2b4f3bce374e6279127631a0da61e94d4a5c931f26368f0a0d45d9db7caee6abbfbfabc99c60e4a92e7e73731efe8f8785d8e846303e7868d1a5d7817347450d097d3723aadb9e0b452ee6b3c634cac5e7dcc94da7c770e2e0af7f5d9f4d7cb6751e5f52d0afb414eecccaa318ac91625cf574a37b8966461528bd2f79fd4fa1dcd93f1105a14746ee8d6eeccf4981ad9912367518e31291f696ee2c493248b926a0f224f4ea56abf21b12847353929b5d6a4c4a4c2a29c9963e9d5faec6c7d0db61da8070ef48ad2b5df9d5a955c51ba2d1943acc427a415c5dc9ae424a47629a9b4ac286fbafa187dbd63164d2721ab28c9a5840f8d994397f45451365d4a49a239fb67f3262415c55371ba9fe9d1d62c1d094145c9b5b6d2947f8a62c7e073b3ee97736d0b424c518c27ad99564bd167b5cbee89ba85ac6ce9f9cf3f415f9c4c57879002b9f224546c10560f42465152fd5f529fa6ba865644a47c10228a92992939e6aa0c52ad148ae2c6e88961234e1ad30e54630666750801c51d9625094feef2567e026127e9d9f6d829251e396e3c9b7aa21ce797fa274b26213f9d28e7edaaecbf1c25f6a817c209d76e465cac3267c553b563be8fdd68725aa54d9463fe83903f32a749d44449b74473aae9433251f46c6e926d892749c42198f0c443c5de3e2f6f365f7457b47e4e9bede2147289c2e7c674155ad6fb7288254a4a69cc316a6693b4145289825f2729633f23c79450a2a057ebcc45fac9596321932867d3bb54f5caccbedb36ab7b50d2ba799d1e2289728d98ceebea72f2e42351b89d4d5a52a6205112f426d512647dfc983fa260a124ed9be7ab1b5b4714fcf5641859615dc21ad2888227f9353b7dc488923c1d3cf389a24ace7c11651bfd3ef32345261dde268428a21c8397246e335567d744946c4c5d7777d2a2a685f101248420a2204bdcac8c61cf37af38d00d3b0d841ca2fc7126bba89d1e53df0b420c512e0d666627a8cf2f18a8878d9131709819201c233b728c18a2b120a41067a655e8ce6ce6c7abcbf9c7a03b4688c265952ecf2eba6dd31540eb4103845d840cc2d1dbb46dcfb7d6aecbea10dff9cbc43b498b2182289fcf56a6796bf59a2181288ac941ada8bab0ee0f208a6e7a72cc1874186fd31f8a3a3aba6958eb8792f031976c62361d0f3d4910d28782ee94773afe53d477217c28c9eba52f676bb429d1903d149314e16eaea7b63173c39ce01c11a28782da378da1a49d6cf2a9c123e80b1c66c7992d42f25092cf7aa21e6b57b447878e30f0504c3a7375d64e5a739677a019e4b8317270d848770ee8c20c217728096a37afe6b5e6f8db0e25cb6c7296bf35a40e25d9d253bc3a86f03303f088103a943649728f8c99f3772a9943b1049d27299f93e4ab56834d8c18f45622440e859d9b8d5f62cc244c3e0e25cfdc6c26ee630cbfd76013230623c9a01b23691dd03b44081c4a4ac9399a12934c52e1bfa1602688fa9841c499ec20cd11e286e26aac5262df099becd3869290419574bafb3cf4afc136621783103694caa48c7582fcee60ea35144d6e3bc91ee5e34d216a28c963751dc264eb7c280dc51cddf3c46c8baa6f18d483c7480c6e8491a87d81c3861f3a3970241a0aaa84f794b14776687f86f2a68d4dc2f68919cae326650cfaa40c057b997591a574b9ee6428edefdec97f253dd718328672d81ffd23b44f36c74021440ce5aaf07472893aeda60f4306c884218312128682fe57676ad390ed7108184a1d3bc746d59c9c73ce08fc0b25ad592d6f4b30494dce23c40ba5def88fd1fbb511d28562e9eae97e53213abc5883102e144f6e4b991825ba97921b846ca174c2aaab070f2ab745374c097810a285b279464d626adb707250da20240ba5f1a4e47e10e58861a1a09387b330d9903fda2b94e4cfb1e4124a74500f59a1686352c8ee95130f9e2a9445e76cea923ccd9a9c21840a0525bc7d3013fc7d747e0a05558d7a7e3283ead743a4505e8f19d3b6c57bd0180a42a250f8f4197e6fa659b68740a17c92f81a1c843ca120a2ae2753db08878d649d502ed14ae56f67439a5090ff7a1e6646288409a51efd6127cfc674721fb28462ace8d29d64b4ce647d11a2044ecf45be5e46774d3d344dd84ef2aae770926edc8e119284829a06ed395a8cfa09938007085630124608125acf56790d4a4578048352ba5ecd7c2e4f1c214648ff0757ed2842561d2145d0da72e534df5bbceb653663a91953a2cb5d7560104284f27f2639e78efb108a63eba3ece315423954493a223e56b99c4128e86e6f93538692326f21402865a9e9cca6b33f288a6a92f1bc561f14847cfae814eed66ef6e054734d5bbb8fafcdf2aa0f258fff2809e141797348d58cf77b2794427650ea3aa573497527aa93427450f2dbd2b1aaf3e6dda45c14e6ae4d849a8f703de1a29874927a93f5a5989e6e518e9ae7bb83acefb7932dca1e73d0595aa6c4b5532d8a314df692e25f4fdf448ba27a1091bf13937b4db32849b531a6979ce4d134c9a218175af5658a453946935a4388127f618245d13b08572b75535d7a45317b5a8fb1d13b4f125794b73b4686d11e346b5a510289d3a8840dc502b240180e07438170200c0ca5ec5701d3130000100c208d8562a15040260eed04140003403c2e4832221c241e12161216108a040161180c060502613018100806038150385c17e9503e35be50f85f69ef730cf471c3438f2bc53b110f2113c1e17eb6a920c3571fd71873fddf48d5dca8a08abb624327ba6f7985eb70fbd43ad53127da3a7b38d3efce7eebdf59bf4a26e77112a8fb4e1f9c7c3149cb3efdbbc0919afaa1cf6f3ec6edeb01c7404e7724be93a09807cbd1578d6802fba2b0bde0a970542367fe818adde8b4ee80c46162c9519fed55cc46ee47c089519c1a37530dae628c11ae86bb15a34b296b092dceaf0c0bf8381ed246c47d20071622f908317e51f36960e500c2814f2f4ee1dda8aca4519abed106afd600db410b523a411a9af14df15e51093c75d87347da1a18ea7716704cc8e9a6444a5302f7cbc3c24693ec558bf81d0445d46fbde5d9f516331b9116f3ab24ed849822578d3a86146ac4bef9d55c076f5f29825de658ee383ebda45e459a5bbded60057ab09b77be532ea88f640f952ab66cc4a60cac7b6dab130b4223f7ea5fcecc2855f06d517e9e0839c2730b8361c21cc9c5131da3980be2d34e67b92f59a82d26ea2a29c4397346e6281670fcfa5fb507d4134cdb32cb101dfc40ff332cabe11937687cfd01c78281c7d704bc5a05d18cd527d909d2a0f017ec2f305e89dfaf88dd33e00e59ec635c9c72b203a14756af03afc7c42808bf60558699358ed60d034e6a5dfc9091df434697f0680f32bce6cf5c682a4874d12ded363968278418f76393caa6803d600c25e6e55e5f5d1b0e535066e7a2d137b9ba444ff9918669bef70080a46ffaf8e960949ace8c8807abb72502175e374bac3929ff5ee705c01babe519dc23212351c656aa5a09448ceebf020c8a1756905c25c8fc30b3ba5a9343424b8997f4ebc84af78bd08f17d9e0d3c2498d3c040b9b35ce1a38348a8e571aca7a851872bdb9c9ac0701bde4950f01a176114da18c4202978858dbae87d8dfbbfb80bb6a6bd14092b3b771f743d55c13acc1df2b654543365cf85c76b9e8b0fb0b2ee8635ee99b00db9d9dfc3d1e27dc477adc12b448f2730a68806520ec6d78f6a6f591358da1d1e65425515efbf6880bae8f6fcf9b359d85be20b0a72eff728308d96a043d717ef261ef2a7b3661719a4b675c960374e3913048ae5226a5a69c57893268e4d625cb7267ce2af3e61b1fe9e7894ffcc960b2b1abc5089a75c82c97f7e2b520d87cb80946e2d61773bf345a6a3983a9667cf7e468c1443f43e227f44594a9c2231b4c520be9d409d53d3738707673e7be84cf000df058ea200828b76c3c05d28c119f4148938242af0aeb00c683400bf090065aa6704ef6b87d636a5c10d11ddaf35fe17864d6e4f2f33813090030e9c1a3f395fa95fafca078139b5a855045f1719688e2c9e21b3e35f786dab2b3d6ff952aad166284fbf2e57d901246b30e0d4ddad2cb2ae1cafa2914a9e91054e97e4b0787099b8c0aaf2b036e24e4ecb133fd32a9b3953a546e9b5b74c7ac952ce8705b55e560dac8426f6bbf8a228490b7f7e22704da60d9905a40dab672876abd88180f2a2c336c0ee9b837df05f068f56a0d8b98992b4519117bfa5983d46c86dc178bc239e9b7399c9beef0b504629dec12912de2fec151be2200b1f2e94500e2049a4a67a1515d45c34f4129b1fe2e264eaf78dfab04bd0a5498139a2a67e13c6b3339d7b97d9a33cf62f5163f5848ffc8ce8e28b365e500c4897695d0e21a83f85a63aa220235c7fbc0aca756d922cdb1d2c959070d84d7a6d8a64f6ddc7a46ad7eda16d68d428f3a8520ea1d132b80e9219ccbce4691d05f1a8a769d5b8417239eacb9c21ede8c3e25df2b06251af858a4867cb95021d179e0da8470418cb24441191c143692e0149cf04cc5439448d0e293c212444a05cc54c84053d224ff30ca64e7167e2330a021734d1e49cfe20804a2c204e46028d45d178e5aeeea65328719bf3bd1b7a387da014597adbfaae0c237d4a70eeac73f180e2676158cc211b9caa34cfcbd43a0916efa40e70b7b2a89e5e9ae6433ec5775b82391ae9374e8041f2152fd91b19ef53fee2a1ced261eaab98fcb8f802da2d0917ca00642e6d1e1ec2703c065402fd53de5268580f4bb9ecdf02968067f79b382fb31330e565e9a8c58c17a48b7aae0aa6e35b1058ed18fd0f485f347792a9bf5e75ab5312796afc6b211fdf53460e5fcb71f8e5ef443550e093b0ed826a28a2e0b23ad225d2ce0e5c210d6e66a52b716d60d1646d2bb027ce4eb1f0c55695d6e5ce81da8b3afd603ca75f18ebeb699c170501800784480c602d7d658ee80f0209037b290fb00f0345425d40cb600c4127ebd6c67909f209574b7ab43d6cddd0058a654dee8ae4a607b9fc4be39f918fd141b83ae399128485f926abc01290c3173f8eb2ef6865518b489e274a292f07276888439851de48b0cfaf028ec3bef77f1bc91e15da264bf81b2271681dde3f19474179b584f304e4dabaef22801572d7c628b155e3be03c573934b85ab4021b64cc3bacb9cbc68878007a75c523d5c8d09ee86262077ad876509cf2264ac7f8d96e1911461b50b150752e4e35408554fc790d67644da911494fd56eee66c444219a8ba928ea8f77c196140ea159b8bf77b5c905da67a447440f1a7ca21c045308a67e78f4f0cbb559c99f6afbe9e21921efe7e6c69cc33f8dc3fa705bf75ce585ef34ea126d1541cde6ce1e9606c518424212c4ca853b6d47439c9c39135f589c3644968a1bfef65bf540095258887a0f40fb9bc887f1b4e33551e61ccb93e3ed343ef344fb6ef5dcc78b60afa7399d33e50596147d6c2b308ea461e97c30e690624d1270a5b3119368c4693ee3a1133dc508860a8aa132d56d5ddd583d0b4f5b05f7701fbb0b7f9ccbb13aa52960d5cfb075850ef9eead3f1a9af20cbff1cd593d768c97f05ac5d45ccee37bd4860fc9678c51669c15aa860bb11ccc9c51962c3b5a19a9dcf88b94f3b18fc004fe0417e2f51c9133a3efab3929a90576c25204c144892aa0234bdf827d26a7f71661284567309389f524e0cbb70c189929d7e7922d7f56802967e9a24649b5c303de2568d185c4e8431aca509cc85b3d06ee21201a33938d72a8211802139568294e30aab0582aa29e8228a76c0aa9d451b2bd65da795a28ecc7fe620e63f194a702153425db61237665f3c42172ca137ec5baf88b70856466cc80ffa174200d93788e60a75cd919fbf428999078a9a3f2499e373781a3002a29973882232062aa2c077bb1afeee256b1889eb3b8608c842502c108412457185f2ba5d308ccdb7efa17e17a8e30dc876d68baeb9ff6495ba5d28e1375809ee4fc9fc1e5bcc820885894b988e5a657f87d39dac7e0c28aedbcad837fd4809939a56b69ff361dd648295e153de98683149174d21dded888e40c3ca71cb2cf5c1c166960ed84ed45937d445a35bc10ad1159c900aab8fc5b729199592799444219ccc5193fdf82a9296abd656fb62cb564435c0a73d493d13ba6dac19303599440006213f5ac804e358c8e11ed089d1e74203b6dc84f710a27dac2709023e78a0fd615bb1a1dc44107f3ddb3baf1961204e5a840016a531e5584044d374a52af25ecf65dcea35c9a0b7cfd5786612bcd366f9e5b8fc453dee29ceea9f427c391b130496cb9b03051995e19acfac84fb02064ded207644844ad90b7edb3b3b704174547e475b02f9a1154fba098f1f3890ca7e7467cb79e5426c029a1a66969d3e9c778869e1ce752033aab3c547be98a90cceceab561c17f4a83e81d215c1a5e1260280599a606f2786a281959606244063354433f2b01774ca0a9d16e254c109031ade29e6915c4e8627722ad2a21c442f0a782b5a510ac620e4aa12ba5dc794c110cf08bb4546a4ea15966aab3d5b2af0d7097e48530847026c678a00458f804daa883c06b3e5b26baf8b1872876c59af5ca32e84ae4be674edca58ab8cc7c5298489bdfa9cfa23844124ebcb2a11dd1759ef05b84ede1aec62b5c0e160750bd0d2cfb00ba7d5986c8f87fc72ceccd107dbf8803063776afeb62a7eedab2bb4e9d40caf11df766d5d8065f350db0dc239b81bdd91868e4334c459937197bb493705ebb337d8c157a89bf14365b4be56b23c98c8bc1a915a814ea4ffc2512ece5a6de8bc060cb56a747f12b9aadb5c6d5db4487d0ca0f49f0980fee2479ae466360fa7ca40f45fec6e9d324ba84dac055a78b976a3e89a6ab59c5d5e592c3a22cbbf9d68989c4e5b3ae4d3f025d6867bf9147e0b9fc226d95e21ef23bc0327462ae09914d2cac30cbc0fa500d83512d3673f25580f857e91267f58aca521b60b9e602f75fb3ddd658264f4f9d5b9740c09d1243afd1ca98670e9376220b154b9944d74ca4cbae2aeff81e03b503eeb853bf596bceb180c18857f1adedb4920c371918fa25481bc9dfd4b3c6b03912c427b594e271f9bcd0ecaaadf5e5acdb1fedeb2ab4a7a87e618e1ff39a64a350daf29c89de52845c4bf65e452b1de8462877da7b04ea9a37956ad20fe757e9705556fc0ceb97f9d241721b16e675b608b2c1f4ec6d96bb23905121a430312f45c2b1787bccdaf481cb1837aa34a83e6f95919031b0dd07e36113caa53706ab94db504d5bfc06ea93c4210ba04d7d6801dffdb90763d730619e61c64cc3b2504cadfd343de8c2bed2ed4cad815a1c1a2baf7ea123c16457e4c0fa29e7fc498a8d78e5c4638c9b384e518c8f2826bd68470248257a87e5183d964b8502c64f5d14d3f0121d3f2217b6c5bbb4c4114788a449af12132c2530c252ae57c69460a00ad0fa6b8814c126a5c3cf303493515980b31775f449b6dc52d6957fd623b41d33decc329894cd759df1a41e8766bfe3ec7cbf085e59c8921beaa1c90e9bae328b0889daf06b60b1b587a24d3b5a9020898b10c2027395d0513edc55508fbd54c2788771ac93cd4052e4fe1c3554c3b92efb6785fb2c2e2b12eb78d70e6448820d3f7847c3a30f958f8e112ae5ab4f218653f5439eba8922c83db91e84b3274e8768d07f92bd5bac2c3a42f6719b686df38a0c1e42b5ec425207aa14e44868546e59364bb5e66c065c4ccf39f7fb2078706a580ad071dd435cc0c968ce3411108626e02d35753cb1ecda381219e9f5fc678a888208105d01c4a9071629df46bb926d8f93ca035cb4a59208441ec6503a583667f52c20ba8f27c1a92676b3afb4a9bb52c83298c51162c785b8c0852e462f05a804324a59d60fb48b99ab74a75406977aca93a8316ad16196e8295e408003d982795d16c934d043bf00a404c002d083fc5c8ec393a6e37d46f62824b813e2748a8fcf30ddd11058827a89334992af131d9c285e0e11668551a431d440dd07d0f21be4f758f0fb921612dfe030f4576131e87b5cc86e53805486b5df918ba93ba1cb1733edc5cde2f0801a41566641caf9ea2bb9bbf8efc0f003384915a70a4e25a7a15accd3d34a63890686acdefdee8d9069074c449ed2f636e71a1dd1e4d2c055e932c86c245dec7be85c3ca36400808304771223b72b793b0493bb157399a50b21c9d42846e59a44084dd35fe0aaf755913ac4ea2e3616626996b630a2db56011afc6add520fb3c8243400181ea9bb225c8929ae33b3b28e79c08b90ed59e871383bebec4c11521c6b97525c02842aa569acdb3ca28b2a68cc427682193256841b1cc71c1769d50f963be22410d881fd01e8c3d57b57cbab6785a059998b636b335eda177722160f0897045f007514a3edf9f6620a3753b328c67b729000578beb297f3d0b9c1ca936680aac330a4a5082860ff64cad4aa7bea9ac0e6c4c70a5e96eef53d4bf567349518f2d010a4c0cdba6e19265ebec3ce49f8741613a8b0c472be98f5c8b17e6ba3a7b4659b149822367424f2e4a2c605039b48f6b679ba2d021dd17f25d5a27706244843b85d89768e36769e9ad657e72550e842cd309465544472a786754273de6f99c06f0460718a8af333dec7b006aa49aa4e70ae7c0c645ce3a1c32eee4b5d14693c42ecfed6b256dc403a774393b8fc56d47d07eec028849ea8248fb2aea99d88dbb791f74aa3e30216bbd3d57041544792a3d6a3c216702990d235521b60d02b7ebfb23744ee3a7c38c188519492333de15417c61180892f2cce94290057e0c1cadac36debd5c9fceee98dab6f370cc3084b46e0b246c9993a19e0d257759b3b7d2b7ee586f3a29683ce693a8342ed3907dfb6ab4fad45e4ae1b4ea584f06709952d0c6441d5ec6a1368bf845156893d6cb2a3046f9020244835b82ee7b68402c728d22111dec0b23205bc23b2c9848ca42dbad52bde28123399552339faee231ac954801a01ca00cc1359333aad3f22657cd49860ce3f34a616a35c5892b14757549aa77bfb04f0b45e030d81ceaa9ecaa6fde7e7de1df5ba0099914629c9397c74e81097eee95539bc5d1c2bbe58b32b2f16c20399bf70fd685690787f14df7f6d02651e182b7120b55742b05bcf9f93f5229396525236b04c7c3391cda3ebc393d8d28927e222b2bbc71dbe03cfdcb867a2017cb7e167484cb8c1864d9c680dc48db514422410203c00fb91250f0169e3ad1491383e4a551ae0304fe78c1e6d129d44cce1c47f833539e20ee4f61bf5d08fd33c4e80881a6cee313c2c75127382953c1e9418cd03a1b446ebd19fe84732230e4e8cb3b06b92192136fdd65354846f885d12d107a81d0696b49d2a483097559b588c81628b4e412164b21056d988cf5719f65dcf80a186ffad9c7344be22de203e9b87560317f867147ff9ace1ef8a33249e0a92a43946dfd98fdf57581558840b9455c27e79df60d4db38cc129ab6ed71bf563bff53c6e83604c7afd769c8f4b8920a594162cb18043b24753fd6b336c4eaad23d9954664b1e5ff7df9f8f04de71531ace26e07c06cac6f1c88a1823326d4359df5598a4c333f8a5216ced16a5c0f56f5ce00c4aaaea781f62822c924d3d53330c81f205649c97c28e67e911d909d7459c38b4c7bf795f116f4334e6e0fb6bb7451b874ee54ff1201067f88c60967d68045ac416008b32c229830d8a8945b7b0317bb51008c6890e271f98c4923fda27c299820f7c58899142770c20108b249d84df246aba36b0cfe42142566bce7c56fd122b5edef56ba34889bac8f10dc87ae1b80a2e9c4fbbb841f3e212410e6a39b29d7abe701cf8032533dea13d48aae117bc4da8164a0446c8d589d1c1bf71846faf7128dcd240a7bd86c8cd6fc6cfabdc101caab3c012897aca2b064d88617158e74d86eb89a94b3a530210fa131d705a6a400aed3e6ea51f9d85e3c2c4cebca3ae6816acfee8d39d682951091b1ab77e9673a566c1f3178a54fa68b180303f062aa79987b34313df969a4ed124aacd8f640c8f6ba9561a57b2369e16c709b4e2f0d2b2165f08210e8c2e1bf48284cc165bc92ab2cb4ce9ae3d9fe2920245245790d53b47857888d7d436423ed7a384556c9492f8b9cb73f3a20c81d145a41b370f5556b4ee3a90adbab00fef7dc28d8766ede2ae26a82693a89ceb16ec484eed0ce646089c07b99e35621bfcbfa10f1a43a3f4a846d0eb1038318dad5753be77cd56011b0874696891e2c96a8d6c50ec6b55ccfdb5a3b59d219dd88119309466a88f9877edbfafaecd04b66651965d9340abc4402c2eb39b6afaa87ff445812b4917b2d1dabd3241e3f28661fb75b39baa6a8f2dbe91f719b151e893769e317092bb237d260e785a582226263ee5c82e4888e21665c5fe015ef32389212177ec30a5b9a9086f160ca8f62bc33527c99d5a508a9445d0b949cd601154d7d95c1b4e35871028163a525f906785c86591f9532ede8c51dff902c25d8f6e0bee1628da7a4cbaa4c3c879e3f878adc213fdf6ed5beae8345332fe512c0eb3ad381b6e02118b0cb1b33f9a9f7c894b3862a0566250e46181224d3e43e4208206b25d53991e6155af2b8f57bf629135cbdc73e3910e21cc05981344232aa3a53ce4d568cbf82f661ad1a3553ac1de77fb626760061d459f0572531e22a4f91b1d4b282bc88941d4eb6f0fdf88307a9092ebc6eb859ae7c3a56e2dfc6eb92c430fe98ae5a8a72f0ba6b118918a00fceae5d2d1f937415b8346364f8ac7abbb7f1b30bb60c01f4069b4132199258d81171e4c97e8696f4b20a724cf4466169ad8295da61dadcbe9d96349b090591946024b227aca47ad2e5fe8c35b71b3da498b4caab0912e9ae16e92e6894fb3b5691acd928ca22ac8111db681445a951ddc2a5c91cecc1fbad037d0781063daa2161f0b28bc077401071d41460d897c22229ab0894bb104a21a655148d154512c15ac860b59e932a3713f22aa95bf30f15b4e2c7f5175ca018b22a2e6734e3d621522274482de06522200ecd73d0b2809b71a120059890563ce95d3e603802cd47993ca6c536be99252d9f0751866a007c57a188a86c1a8c35d7b84882119c1d9ea5142ca3925edf490d0bb9db176525a0ca7074f7acea50bb0e67aa3ea03c687fa694f813c0298a8336d79278a211b2a1f959e9b6adff11ca89049e6c838af7b1d932181edf425f1eaf92a172edd6669eb6eb0576f52f32654a4538cd77abbe39551846eeed1afd57a8d650e2872edbe8b723da855e110b3da98e3e7817082ce61d7bd280f73bbfc36baead4804496ececdb2d9f4ea674fb42adb932c03862a1d684889d94a06c80f2a4a1ecb030411ab4227111a30eff1feafe0d0343221862625b2992db52dda9843ef88c50d37a55762a75b27c2f700d8c7c75740982fc157532759ac20b00cef8f9381e7460f94caabeb6e7c0cc7570be87e5061ced162bac4fe36900f80ca29fd7bcaf2359d824f5c6e1da4a0785022187cf2b82eb93326a34135c08f5df4f57f2b119071d1013f3c8b79bef88fb7c227a688dd4f1c263f7b72ca9a2f02ec856818dddb686ac54a731b88c899b54243b24568b9ac6400edbc60843cab0d432ea1f82ae64fc49ec483dee824b9ac0f5b9b1fa91e28b3b5cf89cfd3fa23d2cbe28a0b631e0c845de875a4e5d14fb846030d9b901e412a18ced8ad5f548423a965d9f480b0aa9df0ca3a16b30cf21d0c72a6f6893e7d75df5cb030f0f2c101e568668913b5dcd7580dea5328b2b097b2bbd0e4bf014211b5e12eec23c7a22be52496b9751f8c457973054a984c887e0a94d68a1c4ef6d8be7b382be9a3aef6d96040b3b4ed87d59dd3b4fce8d81e540185ee2163d7aebb92e6896e071d8c1b732770ed671f2f1f53d0dcd42f0caceec8b7a150f642e14e1b1b4c8fae51a6a6af7abdb9982300ce4066eea4359bbc679eb0e397e4fe01621be01ca810274d637bf204d4af8b93cd3cef6b1065f57bde8ee23f6f4e3e64ac7244d189c4037c7dbd77d967993d7774fc4111432e55b852ec4d01e681f0aea0f52f6c373234cdb29b289a010cb018bf34a94eaad43864ab81d390d8d6da85d0aec319e8bc2b30035345128daeaebfe2ba43481ae7b4b3024b6e6d7118d5061990c041998926cb3ee05195c9614e6718e5e5d897e0b8981417267ae50aa2f603376ffc0f13e85974665758429010c17acc61d0ea0a40d2dc70186288ff09b5b17beb5d4c4b7ed879086b924552b436608cd61ff65df19b85a8f32de5008370313e10487b56a605ba3cac4b7c81f2d80828d020de501cd1fc582568fd64623476b6fe8895d0cd25dd3e4aeaa5e37dcca58e1ec0c7964ee9f781e2e2827a8a0f07b35a076b4d05ebbcb213871f44bf897665f2a0c15367ddac79e6811c42af0d8ec6b375a6fd5a529b8c622fabd679bf3ae0993073a309703b48ce2dc39ba6cdc802101caf1c58a289b04bb7b0815b96f505a1e31946278f55ebe1237d2f693bf4003e7bee169504fb30f808a59d4b5174cfda7aa2b5e448477aaab3bddc87320f451bc0833b0b30d569028c3e13b49e7a6c70324a931efee219babb04b13", + "0x3a636f6465": "0x52bc537646db8e0528b52ffd00582c9005ce14879a15501080669374987f57ddf6afeed755b7fd3de7df9546ec1ed4dcc2a03fbff9055aff6cd5677a1a76681e52bad49401ce40146ee08539d70cf679bf0e0bf7c2192eee209bfd4f5a2364134208d97bcb2d031717e01465143ffc3621382d2febb332b302ee59e96df8acf4f200c4298d2b212d826cf085477bd2192cea1db2028cde20ab77c80a2cbd3b14a9fc860438ee1db2424aefb9c9d69976d1a2423f599a65559475201e584042d0c9b2b67dae0894acfc70c3203e34fc95eb3acc74b71df945972e3544753cd38b0afd746997d04fd5abda45045c15751dc8fa7201389ed1f19335a6fb8bee693721b0f9b1fac03061c284e92ed5f0165d2e40b7435994d13fdc56362804a7617d56b8fa58409c925ca5612ecfe539574bc11b137e6fbaddd2fc09e915b176a98e8774420d82f134eec10dc1a67dcd1b036e3baf04dc3b9bba1e3d86e09c070505059df83a9cf313df08365dcd3f627dc0e6918d5097e6d3dc00c1a61dd60bedf3c27467a477fbb15d7a3fa116b7444d7a21b56adbd9c2d2aa2238674f5666ac9e94cb524ac883683f5a1f5b7777c073ac71b75702aeeba1c3433c697e0f36ed909050f38580f47511bd5be4187329c0ed101565b4ec1da2e28ade18335eac57dd1be881f983e3d268be0670bb3120d531d67d6f0141504011f86597cfda9eb72352ddb3d507a8f71dff2df78a00c58cde21285c22942d1a4636c1f9e27644aa974b5dec54bf09b71dc9da4c16f27b1a81bcaeaec3179b483f5e57afead5ef92bede9b587b38b6327f70f0dcc37f8fce64f1defed82038ad63cfd16e0c902c82f85c2f2ec1c34759f1e17578d944fac18787d5df239b3af91e58fd621377a5b50eeb70ea35809b232ae211a9572f2ec5c7cfd1027c803aeeeb583530972184f0fc18218cf048e6b26987a00835fc5e5b3a5f146ef60e4d61a5df573437a8e3ab9c052328e8b40feaf9fd1c453655df8fa0f773d787e873a6b48be8ee0ead7673c7871bc8ac1df7fcbb463ba0d65e8bba26403d1f9f7dd70776d1ee10d56e1e7e3b4677776cb5d30eb71ff5b1c2840953878ed76897faf13a5e8727ddce684fac4e5e57e7e1ae0eb720f15cbb54f3b7e71fed5ebfc3ed4775d12725f1f4db8068dfddf1ae037558a33e2f4c5f1751d206c43a56bbd7d833dabdce3e2bdabdaebe3d6e42e2b5ebf0dc21dc0e4d21a5e3abcf9daced0664fbac5dec09d9c9d5a28beadb7862579f733751ed522dba469d5cad7dd2eef5fcae0fad76da95f8e8dd1df3f33a7052f8f9b449e17713551fd8d577aa6fb4ab82c45773b46c5a308244d033fbfe6d405e98d6eaee8e6e569f17a6e7e57733627bd65d20b0c38c6e63f43d6877c85bb4e33f1d4e61af12c13ccc9962f47fad4f51e3d577f0a7b071d105003f4515ef35e7f1853953d8a82899c31b9f42c7e7f717cc99a2c7143bdcc6f73530678a1a1555e3a3d16dc47c445fe3a81a151573731b47d5b8f6d1a78015755de72a8abb058f821575d52ade51d7733ce6dbf71ccc9922aba8eccc9f362aaadee2e13e9caddb388a6fa3a2a43c5751d9b9a36c7c7e8af81b15454373998a82c72a0a3b9d47d1cf8a82f0a879d26738ee5a4549f9aca26045e178760e9e3b4a3b575172e628799cf77014f71e2a8a86e6342a8ac62deb392a8a26c7695834dec351d67ba8a81c18cc71147653ab28cd54d4cc69d0386986068d7a1eb2ec397064d9cc304ac3468d18c8598c6535e03569c811951a5f3662467c518b835c66d19852ab61a3c645473132c33038398b468cc6d5c0341b31165f9c8da8a401250d1bf0f22100dce4119dff21a687cc071f666c4c88e1e01cc5c7c1c16ad4a82f71d74b5a00027054f60004805ad6e8f5385a761c592a1d455ff2a1748d6870af0f808d9807e03f1c55e33fe0e01c358fd303ce7f380a933ef830e9eb4b92c64bec830f3e04e028eb01a8281f7c8881ffa1871e701ca51d07f67a9c1cc7c1438d1f8e73948de3944a00780f15553a0f3d1ce7a8ec3c1cc5d59bcfccb08dd7fb8003c779c891e3a4e3e0e1388e8a398eeb3e1c88a34607e2f5b0f90f478dfec3bb390f3f1c88a36a9c87a3aee3946c6cea6d706e7314bdcd3b6adee63d9048e7214745e1a8281ce7e1a41c271da59df48e92efe1a5a3b8971e007c38caba0f1505001f5e2b0a00cf91e3a5a3e0eb51d881a8a80004e0371545aa28d267666e5351376e9c5451369f9939e9281a2755d40dd26f1ca5559dc579bff90f3c6832c75151372aeac6715cd35e8fca5e2b4a8687d7a366756271de65fec35159856271de7fa8a800d42a1ece7c0f159565a7a9289acf1e3e8fc22a915951d9bc4d4565d7b06b47d19ac4e2bcdb1c45a31ab138efa58af281c6015051b5a2ea7ba0bfa9281efe5a516b86277108234c166d4081d0894e818a2ba4200735b8608a299ca6a0d7b151afc579a715f5fa1a7517e75d475d88b3cf81c3c66d2a8a54f31b15951a420fceb0854b0d6e1085219c6ca4b0108116a620210b71e00283938da3626acde2bcdba8a89aba108747ed4abd478d2ab738ef3bd40be2ec6b1c052b138bf35ea3a268d42ade698a98d354d4e833b58a1ea729e0652a2a46f45145a56870850e57686046196858c309ee16c0f4600653b030030971384d013f3a8aab432ccefba8a24475218e006a3744ef5156edb138ef5bad81387b1457238bf3ae55d4ac55944e5354cf2aaa08207c91061d94510530383861b58a9fa6d0718437f8c0085a802287339ca6e05b475db5b438ef5645557521ce8edaf5e83d4ad62fce7bac1cc4d9ef53100887778499ab018e7f36c1c3c8b109fe864dafe113a186d7d8041bfe397ceab4eeae86bf814cb4f4deccd769cdefcd477968636dd747f71a9e001c1058afc9daa3b1b5f5c1e481691fab9dc88c26d41e85bd39a9342fed4413ad0f262fa87d12d0effcdd84c4a0a0b7f17041fdae05353397b97db1a9bb318305c77fefe027a41797f63c383e14c2ef81f5e2d25e8753ef2de08d36b289bfbf98ce60c1bdf3217ceff36990bedeedd58b698a9fcf08aaf40e89a08cee460dff43ef9008b4f41cc14736a5bae3bf203daf9282c47e8ffd0e4550505050738cdf8da783a2e363f5e979dfeeac7ee79eccbde9b8e55277310e7f3f3708aefaebb903e0e642c1ed9008bce81d128194ee46cd2740ef90145d9ab79d0d70ef3b1424c5549d1fd9749d7f4dde76aeea6d47a4bafa7cdaebf9b6eab3a23fcf672772299e87ebea6f3362bbfa6e3bcba54eeb276b976a795dd78117ed6277f13fb0adefb623afc373ee066b876af88b76efeb15ed964b50f4f56eb9d439d1d7bbeacba58e89beae0321b5aa0faae12bba7dd1cea6e3e7d32cba5dd1eddd84c48692fac0868f74b9f46ae4d23b673d480229c2f8e176488a2f7abbc4a64eab6153576a3e1f0829b6683e0d9bb8f9cb39efd4d900c92206bb635b873536edf97bc3b5a7472f0f58980f21848fafc390f98f99e199bf1b7cef57bf4a0af21eff60dd57bbd70cdfd3325703dc0e0579698e4dfb8b4d3b14c4a5f7da72ce9e3a9adeefcdd69ef7f2907a2f017371b8fdfb6233b2697b3f47cba6d7fb6513bfbb7a1fd9b4bd9fa365d3ebfdb289df5dbd8f6c7abd9fa365d3f67ed9c4efaede4736bdefe7db765edd1703240b212e6df36f00c9c2caeed89e4f7bf4f56efcc9da6e0c902c82b8b40d7f63060b2e1efe1d6e3bafee8b0192851097b6f9902e97e027d41e7dcd1b7fb758974bddd5f03abcdb4ee412bc0eebb00eebf0db8e48357fb79d771dd6e1d47b4f0d736fba37fcdc01707383e0964b1dd7f0efbbedbcbfed071441414152f4fb642db2e97dbf6ce2ef77bbb804afc38f6a5c82efc175340dcf8fefae869f346c8a5cdac3d7b0e935bc0d9bdee1e7d36ad8b40dbfdbbb0eeb70a44e74749354732505b99a7f355752107e3c3fd69fd7af2e97f6bbf1bc73edf8ef3aacc37b036bcf7b7948f17b4e985bc5685c5a2e7535fd3e7b8782a6681a2ebdafcddc2a46e3d272a9abe977d93b1414d4345c7a5f9b397763806411c4a5edc8a5fd6e3bcba5bd0eafcd5c9e1be0de7728484aef779b2b04f7be5f4ce60d19b8810fb2192933229839c18c14334f66a698b16206cacc0864e82073860c1964c220e345060c325f901143c60a32599051824c12648a20630499219921c81041460832269089818c151918c8549171814c0b64a02083850c159912c8a440e68a4c16325cc8d440e605a233c86c21c3029928323a185d616485d116465a1885317ac2c809a3268cb48c98305ac2e8cb880ca3318cc4301a6314861118465f1879197961d4851117465d4653186d1949611485911246608c923042c2e808a3a191114645181161f4c5680823218cbc18fd600484510f465d8c7830bac1e8cac806231c8cb08c6a30b232ca628482d10b465a8caa8c62302ac148cae88a910a462c18ad604482d194910946271851194511d14154069119445f4450103d4144069114445b446188ba88b888b6208a82880a2224889a20d2224a826848748467039111444a7840782c1005415404911044534428105521b26283c346868dcb8685ed0a9b15b6266c4ad88636226c46d88ab03d61eb62f3c1d6832dcbb603ed099a13342f684dd0a2007730bf8089e0f281050349c5f4c2c88aaa8bac0a700d160db0126052b02933095307560d66966983b983c983c98568091307538a19849d4024c6ccc1dce23dc9c0206282a80ad91bb232b2386472c8ccc8e690c121a34376461626ab4356864c0cd9196419b029646364669049c8be646bc8d020a120a390912122211a210ec5236463c8dc90b521cb92e9209b42a6826c05590a32166428c85a9051d1a0646440376469e0196452c8a2c03d601ef00e380beb8073c05cf0168c03be01db80b1f015ae01d380b56019700cd80ac3805f30d130cf30cdf0bcc0cec0648051c1aa8045012b032606b6052c0bd817cc0b18184c0d581a303360646068c0ce807101fb0286056c0c4c0b1818302b6061c0c88075011303d605430236841d013302c605f3825d015b0336064c0b8c06d80c30366052d084b02dda141814649080a900330176c53606d8038b8aac027e31c3209560adc06281a5828b8cca071710361d4829f18bcd0b92045717130c5761e3c124834685a5832c0b9610ac1b585c48324c395838806cc8bc645ce4173986ea07730eb00c0c05d61616106017ac175843b072205320a77011ac2aa2384c31c825cc354826cc32c826887ab0699131c3060558840d09f34be582ec0bcf071916a40864be6461a8d6508191b9426605510855152a2faa206c6ea8805019a11242f5846a081597ea0a928a0c0e2a2bc82ba61a24140643469128902a90b1816441e5659231e262b4c515066982990651983906993164b2545ea8ca009db079814fb0b460429710ae2fae215c6eb8e070bd418601c300c500c7b09e5850ac29aa22c036645c9871c8b49075211323db42d64592915d419a41a2419e614343a5858d0b5268eb82750469250ea1fa4205862a0c9518aa312416d205b2057205323990c1227303111046556c678c5ab0cd618e21ad909181c422afc433442df14b6c4224430c2352016b83c807a21f442899172c2cd695cc0a4c04f88648854c194468986cd0bcd8e2f0e0204f204b00b94c2f96151119a21d4c306c47a8b020c1c0e80083008120aa038b0179c05d980a3c057e025f41a60abc85b1c050e030d80a5b1bb8098c043e023b8187443cd8ca78666c72602f380aff404402eee28dc127601f300998056c0557c1261079c140e0206c6f785f786f10451175f1be3c323c325e199e19b8042c844705083ef082e000261ef0b0e080079c3049d22581648957e5dd008923822400010ce03102c88e024ead23801d3f04c000430071448e60bede8795016388a4c9110d1471e20812268a14990f2eb104499122592545549d609b20e9c0912545489509f6074913244c9c28f283840336aa122c929f233f4d9a2469826409122037aa28dbc406962429a244912636b0844789922614f0a30412254a9a50c00f1509f6a7c84f93234a9ce8c0919f26483a9064c84f932347fc2001c2436505adaad8261f40d253a44911244b34a10492258a34f90092204b9a48d2a4091208e8a884d603499c6826487a9834310121b4a26291fc1c59228992234e8a207902c9130e18b204120e70e0c8901f2a28dba44709244c2831c536f9598284091226962479f56449920d90aa11ac12499a2c49c2e4070a24453ea0c409278e146182640925499e38f528d18492934d258245a2c49226961439522489138d4489254d34e067c9134d28a144e3a8a4d82637aaa03d52c44686d90e1439f2736489233f4890889175d8264892fc2461d204133f4f1c999174d8254d24f939c2e489258afc34a1a44991244ef411264f340d79c62e69c289278a2ca124c9131a28b2e48812459238d13f4b907480034820b00492259e50a2c492244b227084c913ed839c030892283992e427c9922434a41cb64789269468a008929f27944002051219198765d28402b47d489468e0c8cf92273650e44709244c922cb1244991223648d5152b0b13b2d8a23735772828a85f0adaa8e413f9e439f1ac482b5a55376edca8aaaaaa58eec608e5b5d7ae64b99c31334b291932dc65e608ab08655cb9ed4a6b2384d1821c2d0cca5856b6c1b7cc3c2dae388b3163c817e40b8b515e16c79530f24ac9ccd092cc2badc5e4ca5d192384cb08a8e44a961c9923c3ea3d29e5aca494bb95ac76b3462b6584d62e5ce668c33a401172e52eafdc2571642863c511ca65c80c21b62c17c2f8f6c9656ba79490995f8c9188f7686131636861acc3b264388e39c65de6b576374c24c2308c9921b430cbb23008618c5232cb67612c62c98cb1acb2272b29a1085a4fbe0c5a0bb167551163b6de7bb28a968f58a3468d1ab192154b5941cb9271195abc9077afe5b75bc1c8174703ccddbd96ab60841664b816b4ac08a3b570e5eeae947017beb716af656570cb012d86b1e2c85684322ca51cc2929271549688996d8c46b2825525793727c6c8cc32eeee1b312f9b76f7f1473676f7f1635e96122eb37c92658ccc51ca18a5652d365ab97b2d338c71f75dcc7bbd28a54862cbbc1cdf2ebf2857324b667ebc2b5fc56cc585719935c85894bb2ba5948b2d14615cedee3e29a55c2e405cb99910504a08316cd7b22ccb8a1684db06b70d42c63066cbb22c68c5082db9d8b6612c2b6855cc55f51eef6671adf822f38e22c718997799f76de48d71e5ca7dd9ee4208216466b62c68410b62986559d64c64c81b99e1f2eec2950c57ae05b7cc82988c755d578c16cfb08c1083bc31c665189977e54a292b08777739728cbb1b23ef2e3347685916c63a96996558326f84f2717cb1aae483504219258c3146668e11c2181932639624808c31c61acb8a31462865655552f2006a4430881e35b2aa2a919438784801ec9040bcea55225959526e51cab8efc55d295956524a9670fbc18ad08a125631ca5d29af082106238472b1518cb2e2c8cc17c328e5ae649937c8980165963fc0a4890e20e940d581243f4b9e60526936f0f3040e244c14f9599284891345946892a403360158020913244b3069a288a90003409284c94f0008a024494f0f1c1f4a251f4a3480a0e1030002d0430f6e0925499850a2c88f92278e6c00c91238af03391609930d1461d2c4cf11259a50a2e488cd5482c409122545a038d2011d371c684249110e2c49c2010e34a1c4c60078e0e1e70813244b907080490fda0e00499326489838d181269428c2048993269440c2a4c891264b2881a448103da6020cc009259034c9b1d9401226489c143140100528c000964052a4891f273ec044091e0e059225962429b224c9112694d8c0069aa8429870e480a2090ffce4301560008f19620041141900929e234a345084034b9230d1e408136772e4a7890f5c131ba41d40134d30b9d1a3c4110d2851d2049300d4234898dcf800929e223f5020599263871f241cb011d3e4a749122890d85c1bc4922692fc2871a4c992234c7e8afc24e940079a28d1d801409164034898385169981c41a2440912b7c412244e3871c4c6c9122470668328b2a489244d982071820404499a14d940134d3071a208120e1c61d2c44f93223f50202180932548600036307881802c36b2292036b2a9054aa55211020165463605043432927a4040119582a854c41802452329a0070404048d2c1010508a8d00bd1410108c4636554d239bc28052d008d04b0101a5a4914da5808052a9ca48eaa58080de3302f4367519493da067648180d8c80201a552d148eaa564ca3202f4d648ea55467653d248eaa55e2ac5d0c8a652a95434b2a9141b49bdd433b2a9672401900d6f775f079a1cd935c6da69d98b674cf9bde92e305270dd3534c426ebf117186ce2c75f5ad8743dbebbc2e8f8a9a57be81db262a527848194b408171bfefa05c61097e2bbeb08f9ab5e5a9e00ae21987349619cf8f895d2dd3554014efe1abaa470291e039cac241e0e0a6a78a0a0a0eea91d8d7612b74811b274186a5995c8938cd896d765ffb40aaa3c22b6e3b5edc0734fa855899a45bb4b4ac74bca23823bfebaa2051d7f516113ecf8f9203f28624ae25f114ac009fb6b495f5b9404813d6127f177c80a95de212b2c681ed8f2b0650532c3fa908fbfb6c09cf9f88b0bcc79a7f8cb0bcc113dfefaf288b81e3fab93e43d10467be0092da224f977e2d3a424591d701dca3bcdff9d244d42fb453b0f40a1abd813f25b18455daa49496427598f0d9be480ed24ab26b1d5116c1833b0c7e67eadc3b0353a82779a9554559f5198be2224c409fb084661ea7082f24ed89f5c591d8115264c18eedd8ebc3f22bc0b4c2f0f40554ab26585b96c681a2ea5de2b008c91cabf67496949296dde1ae2b6c3f291be8eafaa4d8cf47564b6c27cbfd6c7ab319002fcb53ee0778806609a864bef6d3eb16d76c7ee7810c8b6cf0bc329f81e0de0bbd687fc7e4af8e075581d5687d6e1af0a1e5687104e8bda70a9e234444957567fd549f1afb949110dd5a5556db8545dbb635f47ca54982b1fd747f5bd5c1f8f0ac125f92fdd834bf2bbc14efb80a6d9704e76f922d6c777c7757920d8c471e9bafc1038d76f38e7629cab23699c43c338d7e5178cee846879d2fa782d8f511b2e5d8762d0e15f87a74196aee1d2759d64912ceb3b44032fbd43340843d370e97ae5131bab365cbaea5a54ee8eddb1aff7a524432ee6ca98f71f59bff76e3b0c17323f21f3f59c6fdbc92cba5d7e4efa23d59df6ccfa5adf6bb4b37a8768d0a5e3eed87e50fe46ad63f435fffa84dad2ebdbf6dbda5dbf286fed5eefe7276b1acdfad984f38bc4f6adddd5503c11811441cd44d37c9aa41a7be78139d0214c37d92d58aeb0a2b1aad56ee74ea95d94e7e3acb48b06d96a07454fadeee5f623ebdd1d9df66cbb27fb6ef54175073bfb6e3c57cfda739dbbeb2f08ffbacf0bd3d875a00e474a53f3c521ccd50017dfd5b4e4ce267921d894a3e56b68d045cbdbf46829cfd148f91d7a3237c0edcecc95311a9722cd8d48820652e2c58897b7e4db92d700577d08cbd45d9c1136592f824d39da3a912e6dfd026c826d2d97b6740cd1d6974d3abadb30964bf23a6c33995a5a3c19b4c55dc3a61dd2c20abf85229f17a6976313bc751a36c55bd6adef8d557b160cc47263c3df86dfb13ef670f71dd74e0c452e25f1648a28ba30c516295330a10b639c16e24cd153e0410ac2f81207381ce1b41087bf1c132b974aefdd057396713aaeb7ad62aa1978d1f1da00271ff93d1e37832b9a4fc3a5e622e0a9d39a6a5bc55455e392ac5aefd00cb6e85869b8f476a89787947c3c87f9ace0620cd7f0ea4a40b029474319746908e12fcd02ffa177480663e815cda705c73ae81d0a820a9a61d03bf4833774a977e80735e0f9190198ee525f54dd3d316509bd73f4b4e020127a877830463f307a877660a581e81dcaa2e56d40322878691f23bd0792817941fb0089bafb0143176a60d0dd0f16184c3074f7430230c8ee9a64c1073f08614b774dbcd8d2fb2b28280605f586e91dbd975570464b2c34fc1cf9bc966f0b520430ba258594144462a1dfbb26299f0d1326cc94600c818ca6924a2c34531dfd3620774203d61f7ef33908ede14ae27997e7c74a0af22e1f0f65fd994d84a1fe6127afe175206d4869f3cfec7d4a3e06c3f4f1827ab296ad0f1f59ef7789d8c7237eb43e960e39d5c381dfef7bacddd55da5f30596dd11bfc55e2274bea8c1f2d88eb5e3da01b5136e0e3079fd8ed164dcd4b41d8a4119ed336a2757f588d8861d775735fcdb9ae0dee7db96706fbe282c183b3e312868bd442f64976a8c7d44bc2f5d7acf2f674ffbec1111837a7f6c17ebbaaeabe2eb82efba6449f45e8981438cdfb0a9e341c3a6eea6df6dfa5d9341967ee7d8f4faedcd4342d43b248313ccde21193c5998432a63042ed0e2074f98e08553ca0460e8c2086640a506567c39c1c3b8018ebb624046f3359a2574187213f31d6ee4d28b3f97e267edded631aedd0fecf7ec346cd22eedaaaada55cf5e5d5775f859d1e5d2db80903a7269abddf6ecd70fe47d50f4b6b5129be081e86cfafdd5ceba3cfc84ef65f44a00467f643f9ae6ea8f76572fdc56c6c0cfb86d15a371e9864bf0d7cfa5ab5afc48bbd73e6f5fd1ee07f6fed5b7ed6c9595d31afe6dc3a6373c10ebe3dd4dcf278530f77409eefd877d2fe076a80652fa05f5ee4df7829a3f739eb6f441e17a6010f70ed5c04a077941bdb57b410d77e2973a89bd8f9487eb3da45daa613c8927eb587d46bd5f2c748fee364c77f0bcf46d3ef7e11a569b171485f9be3774031c7f4fc325209a5fb374b9d4d5f43b106c6262cfb761d38de6ef96e6ae36bad3baab7926983b0a02a7cde08b3edfe611f15e17dcfbebe502ec4db75e3a7ed7c75b1faff78fbe9e7cc11c0c4a29e5dcc9a80cc2b73eb8f7f3ba0e81771dfb949f92f26416e5e80571e225cdae1dc6e89e2cca331b9e6b86e7027eee70ed5251db4d4aae9899a5d4301a0517f240d7b1eaad0fd8fb39e1b14f124f978241cb5736685999bcaba7baaa183dc489cf680dc48955130864c76a14d8b347604f58e5423e6e0fa02201a7ac96204e7c0f88137f6d42e065ed92986101b7a7eb5424e0841d7b57dae113d32e158427a6392ee05b7e50d445a039065e74b7431d4f844d5d1146b0a95b2e1760936987627045c72f60c3e8b83eb6f76fe3a13ba022d8041fbf5e225f59ac3ce9ea654bebe81d824196868115791a7bd914df955afec6e6dcbbc51e3e7cc7bdabcee7cab0f67051052d97f6f0e3e18604c3b67245775c4b9acea665ed81e7776f29afd5bcfae01f11dc10891ebdbbe3412e60fc766946228ce6c31790d17c388adafac88e3d6e47c8c7c74d081f3ed2d8a333f8ec3d882935b90981d9a1760d3ecb0e277dcf3af8f76a93c0f528ae1ac5f5ead667a5c12d081f7e5edadb24705500ca3b5d8f02ca3b55d5a3a86e5d87895c8fe22272dd8a0fb6607ed1f0a86a7bc1160d0fe5b357317f35e6151dc1f5ea92026527f95d1fd6ab0a949daa779b90d12621845d4afa4e18e5c22701a30c70d9a158e7623e283bc9c78fbefd822a7449d6f31ae5c9448fdb8f7719ed1ded5132af7d3bd4e892f9ed3af0d16d19daa53ae67d343a47b5ef76c4aba3fa04d75d0c0a7a177d52d2dcb218a369ef509533b210a36f7a87b2c8928515a94d4a126ddbb659daa4a429a2a4b96dd761b9595b90ed5980e91f0e923d604f551dc15551a95356a1587f277945c8d2eabc4ecb8aaae4ad63550592f2d55140d7ab2af45375a19fb00a7455a19f6485229480d314a993bcbc55c1597b22909227cd08c45d280e0a5949f352febd4a9ab2a6ac346f3bf04fcaba10e702aaf8f2c2dc27b81daa824bf39016527afbd288987bd3f5886c62ee40444e3112d80e44c33b6cdf61879a6fd57723b27d07aa7db2161ff63d115414a73a844f3151dbf9b62151dcb8f628627ee3bb0db971ada2448f91df8d484c95301abeca17721b52f3d135ba5d44a3a8b9e872ab808d6fafe8909a8f2a4a749aeffaf894da711c25b2f1ada26aae89e89e646814da6d1c078dc2c66b4e43a34069afb945bb544b691bbd4355acf4dc6dc7baa44bb296b7284fd6f2349ff36d15109de61c8d4274ee238a127df4188a123de6bb55a0e636aec33414c51dc7359aeaf9ecd3d2e46e15408dbe1dc55de6bb0da9b98d8a8af986834681a2e7930c8d0285d2bebdc6f7c45194cd513a8efa737c44a3d0f128fe28721c051405e932a7396a87a3681c35f318b90d117d74b91189794d45a54edc6f50d43b7155d22122f9518d22e6a34f4b839b04b4dba8516c17dddaaa3aa4e65168e7be03456d1755a0286a1c0711ad8ec0c6b57315283b8dbe51a0ec14b3eb43d6ae475f11125dab40d9497bf511e51e43b77702f27e7d3709c45494f6ad42119d8baaf62891b75e7d741d9eb5ebd1d6b3cadb8f77788b2e91afae034760e3a38a7aa75aa3a01575e328eea8ed31c7718c5ed7e8086c1cc76b50d40eaff15995c04a6f14a45425b0d2d565c7c622a8770afd2ec07535b10a2d55505125088b2d580c55e952850c2cb26061050b299a2629e9aa41b0aefe3a6beb4bef18d697ae0e9b7b379e1da3ab033c198a60e022a8ab5b5df514699292e42f4a9295a7ab637df56e3c3cb08084206de339c093a1aea22045741c15f54e281d55c708c751af423fe9a840a3d1698eca51857ec2518148d76e53814855e8a75185c285f5d1699cd0ef3154e8a7988d026da7f98d0ac49d86e32ad056b5dba0a8d4a9c62701ddd3ede3d1ed90142dfd2ebffd4e3b50a19f5017ea28a19f8044d71ef31a1445a3028944a7390a48e63455e8a7ed3355e8a7980a2453857e125dab231885091326cc69ab0b71ba1d9232d4affe6c42760afd6a07b8287427af646925bba59fb2d2d8f600eddb3998b355a1eda20a65ab2348c049b430e7f1d7f680ed31e7604e4c15129dab5044958beadbe3ad2a6b8f5523903a8df8247a04e22ed40b0ae2a0d8a14a92171dca4fa257ef9ce8aa92641dc2bd7746fafd7d61ce56a3d8ae3dfe7a44bcfa6aab80681ba25d5451a26ba24d03da217531e7c509c0347c560db5ccb62027f0d23be441adba76b80981cf4eb0a5e1dfa7d4ded68027b87e8ffe706d7d66bcfd783d3a88de2d7bd5a5fa5daf3621d9bbd73defd995f15f979d1fb720d5b6e3f33621f0af56db8ecfcefbfcb4b4b7fd78d5e7db8e7d3b6f910f932ca59487d823506993be9ebb01c96ee39b14290d9f9db449096af84bd3ae5dd88d1fdb26d2dec3311a91729c8723e5c0b1bd2cdb8663db280e91dc701cc3211acd904838580c124926925ee3a411a7bd47a3039aa18344a25b0c246ddfe1dbe746495bb08974f9c9cdf4dc78f61e3db3fdb8f1ec720b029f7dca68cc1a0e9b6d63c2a3e5b8c69d67f4eb5a0eed1a573b9fd14671541fa026fdd14ed3e86b1b12e93a8ce3356f3ba4c34d0877751bbaadb59ca44bd2f69a6f9fb1dfdb7ebc5fd7813668f7fac6f61bd4860dba5db3039554b8245f83c232b8b451daa13a86762819daa144b4433d49854d0f9ad1f20f96c162b4fcacb48c6ecf2dab241ef89ec75bdfcd886a0b366d979fdbb69db73f3a84d43b44841948b12225cb09864e90e5045638a19faefdd92bea5acb6dbb0ecf4ddb82bcbeb08b8e5d24bafc14b528cb46e7348d094f96cd5fcfb2ec57eda646479dac92d16d4e24cae8f64824c2b620a5edef5b7d5b7049fea719145100fdf5b506fd9452baa77765f4948beaef9b10b9edec50155ffa873bc3e957ab2fb824cf1b125867b5f30023e0f46d3bda81a0e8f7d377283fa17e20d40cae2023e8441f04bb9ce18aa0d3eb13283ffd57ede27cd5bd5fef6495071fc59e51f8493b281afb6e48941afbc69335bc0e6714befa824dd86527abb43c46790b9764a7b57c595a1291e72d2f8b7c5db4a46979eedf967f5b5c5e6304fc326e43e87fb80df951f5aff4b2f65443bd3c00c114897d28a3aba9b1b9c868f8a83590545bff8987b5fbe1e9504c9c5cafea4f7c75de8494ba036ad941e1a3a3afef264472048800a56104a4e643cbeb70dc76607572558bcac3395a19afc39276fc1f6e5290d77c9e47eaa3a3df532d5fd10ed5957cd5c14aee29dc82949cc87edf4d4816d4cf7af00b056ef40e7d41469b2028b362e21bdf5f8f080b4cc3dfa01d37e9bb3e7af4e8376656c091dea3bbb743ba0eeffa08a27966055cf51edd715f7f5b10d23beeed357feef6c300bdbbe34af12bdafd48f5ab68aa1f257d44bb1be78d800d121fddc6c6c606dae4b0f9849a8dcd7598e372e4c8f1f9348ee6c871de76728c462291e8f369232a2a819786874f741cafa1d1b80ea4aa574df5a317eddedfb78f20195625a3d467854b1daf37b71dd147749ba3db7307ed6def35f36d0d90afbedbab46c8cfeb0c89e33870e0c02171e8b80e1cc78143070e1c3617dd46249af369718376af4987392e7a8eae47dbbc239d5f6d3fe049af6d2eb271634e112443249a2211c5c1a24a0ab2c3717c87e3e818c70dd2cc144d1c528a08078e8903079d1a8ee3a8a420359faff9fcb4a14c62db9c6443537531fa6e48bcaeb2dd84e0d8f8e8363e3a9db7a1573f2b1a0dd1713449b5c8e2f21a87886e6f3b33880ddd7ec748f4c675e00dba6d835a627029be865659b814bf0395516887caaa2e50bd353e7a8d7a99c1a5f851a5418970b03b8b4bc75f66585c6828118edb12834dafeaa2e31f9da144b8d79dccc2a65127a574fc845fd814139365df82f8d0d91736658f9399b564e76d273b83c1a6f7f8c971dce7d31ee5be9b0e739f1b010c42ad7b5a3477b8ed707f743b866e7395c1e052fcb33231ec618f18fd4c75f5a80ecfcf1d52822dbda377a804564ca0a573a49c404a9b7a874cc0a50452daa68c311a47ef5014303a4a176dd33b1485053d6534eb73e7d476bb6a87eaeb8f765cbf532af413d51ead287aa0ecb45c80ebfa9c1aa57b7a34beba1ef6a9691866849c1525bd6fa79a14e47a752057ed20191dffba573b54bfa7fa6d3bef3a90fe70bf5b9b109cf9d1e7475546e1529c8f9fd616c4879edb276b6fe379bffe369eea6ffbabea72e9d51f6eeddd75c6b623fadc6d543ba01ebda2ddd5d51fedae7edf28139eedd77964be7dd974d58e09cff598f370bfbed5aeba4c5d2e6ddf964d31b5f379bdfdaadd72a93a37a25af501aae846b745d4e7f59cdfe8b646b7e7d3e6fc16a4d4b3928264c79e55f8854bf1d8b32a6cc21ebbeb8c8ec7e8b3c2a5f87903025c7508400002dceb1eebdbf1d60d225ccff5ed0e92c15a6e10e1dee3559f459fe0fa87ebaa5e11fa09c55d5881420c824e40f1cb115c808453141f40a54e37a7a2c7094a8f1317ef320a9b20196c7a5da5b73b08a6594bc773183cc02f3cb01646000fddd3a2e31f96ca60d4a70523a03efec6cc0ab847a5b7bbabe3239b48d5af08fd44bfa4aa0ee1e8b95fc72f23803efed19ac7e35dd21b0bc4bbdc90d886d4d3c36dc8e97973c09e78a81cc4797f9b03f654eb0571de7773c09e685d88f39ec5140ee631e5596113765867b0e09e958e1180d9e77c5a46a526ca245fcbb8aa7e5dcfb24b48a9b38bbe67547b45adaa7a4665adb24fed97dc7e6ccf0ee9758dceebc06bee27dddee4f722dabd1f6e7e9f1b81eb1dfbabd877dbc9fee895593a106ecf9dab3dba1da3a420f0d821f609a9f5e2e126a4d4b076f2f30a771d86547eeea6d50ed55ac651a19fb82f2380ab28a0d1970b901db55c0078eef0711352eaf73f3aaf513e47f734a25c689f8f6eb58bfdaed12ba3d8f6a3fa3ba4d927bdae03b3ebf13a10db66fac3fd5a56b40b23c9c5dac51825dd2ca6b9d27b2cebb5d78a600c5955747707ac648c514612cc95118a209a1a9b8ace60514929658c75582d359ad0dcb94170f22f569fdd26e5b530e6025cba307e949fd73ead6d479392864d319eff68f66d8b723b22d5f149ca695c8a0b21acb61d29772184bb3bb7ba0e43b871a1d6bc9171787777bbd8bcb05e7b1516a264cb8260b494d2b2a4654929a58c51d2b96cba6a17af0bca4ac618658c74088a315e806cef0eae62ee962dbad4d4764b959eacf15655d7c5252b26fee2123fa5695c7a558ddd4f8dc6a6ee61895ca49d55bb6829e176680a5a7af2bbd8f42e36a57ab81d9a8217fd62964b4f52c110febdf7184208217c0f0a0afa91cdfc08b928292246088c192829e20a3f1cb97938282828e887b1908449c3a6c825254334bcfa07368f8c164d4841bf47aa64888eef5de1bdc7cf097c84f0db0cab9222fafd6d416284c09041bfc747c55c3669a3f9a43c845ce2123c3f8622b3571814565fa91745075a402d25268408cf0d97e22d20ba864bf117b5e1523cd3e5d23b0277bdd33a729c837202ca4fcf8a4780f7780d55e563a0b6beef3a02b75ce268d558bd1ed28a962d5ab600c38c9e23aeb7a3b9be69f1d5f8765e8d3c5fddc8447813fb93f4198183dbf6a3dbef0baec7baecee3d6f5d87cf262c1b4df9e808fb6ef355225c7a8f3a505611ade1127c456db8043f696a6c78a3244294af085cf58ec6864dd8e1df17dc6b991dbe87e8b07bdd3d2b1e8f772d55ba7b11d77245c3df00b15b569fd0e3118970290a91a228bf518d462ec92cb8ac7bd62fdafdb0acdd76d91bb83d2c07f369cbf2d511acaca8aaaa92af1eb79dea0b1d18b79d674594c8a6582b0877602585cc4a844b5b557a25e6227a45e8a7984fcdfa1c5551f0220a557a424d5a89552015bee2b58427f284ea8bc22598fd5dca77da65ed5e94d711bbe8ddde928fa99dfc36ff2eda44978774060b0eabdd7bf5add9e8dd828fbdd51eac6e9566c9ae7ab06f3c58ed8197bd7529b809910db17a99e9f08f89551c8d7955691cd7d5b446b763a8cc31ab3a4765bedb8f59b7d732d5648dfb46e727463badb17374fe6df3ed6328d21ee9c538ef19e5686a6c20ad8787af6897ea2a461fd81108a636dee2807da3d09bf1f3cd573b4dabe2a736927c61c7340d7b1af634ec69d8c32e8aad61dfb6aa0335ec3a2cd29e6531a26fefb88b24cb4c1991766c54bb918863b2779c68ab17c6cfb01aadda55b21fc71511a210a503d03b0405286ce96782dea130863a92787f5d54896a57c52a56b51b3d621f8da2146e39c2ac2eb6cc155bab4622914834ba0e1cc58844a31137ea9e941d51f58131b403ea9ed1b7ef26643b4dccb977338fb91ebf9c43e3dd0f8c390dba8c13532b99fac38d5d8f91918f8934a36fef66ea0ff7abdd8bb90c5d2ec5d48e1355d9e337aa75563bec92d5b3e2f1a0e112cb0af452316c9d208c2cbb5156fb595561587982194ff8d203e81d7a4217b4e37adb587eabbef17560b57d9ba5f5ca07f626b71fa9b63e27fc463baeb78575a9f01552a2f4fe7057efdbf6aa82d5a194adfac01b335970ddf6fd6e72dbb6992ce4acdb37edf21d8bbef554b57bb383a357e72a51fdc13ed2ea0fec59bb54865df5a2d136b6ac3c410b279cd17314f93fdc4e20a37de81d728213ba6802f40e3921a8e7ced8ddab1dedb84ea180faed8944d1efd6c286b4c707d5d6b7971fb767d5ee75dc2e36f67df7eaf2ab6dc7dab1bedbc6bc9bbfbe9cc3ddc2d9ae7dd9945d84233fa2cb259156d51fd815bce80c16dcac5d265fd51e58bbc78cd5eb62ee79af2e5fc9aa7149ebc855c4b20722eb7df1a268d8cce6b317e5d6239b626ed5ee6d9737eb459b90f76d0322b2dee7f6fcbe286cda769ef5b9edcc3a27157d4ecbba88c01ab7ee036bcf65c523e28aef621dd5286d3dc60ae13bebd661edb93e1f1fadbf1a155a95c4e7b1feacc7f7596157e3d545da0644f417dfab472bd6a8a227ca3620d67b62155955747d71c9e6ea7acfb2ce90517352e9aeb22c2bfe093d22ac4729dd5593adee45b1a2e8ddf5396bf7a274f5ece7cf6a89ea0f37d79e7757fde1b6d834f3f9c8269acf3afafc6e3c31abfcceb03e2b841e0febd60644f44e8366a7a1319fa1dc47d575a088888c364532a3cb3cd11b89ac6053fcfbc36067ef7e60f5acf660b73edf659ff096cc1f1559f188b05efd51085bf4ead9283b47974bdc6368e41257bb1fb88d2c51dd5e3d2bb6faac783caa672792fd59915d6e3bd98b3231ba6d557d7da0b1f3e7a1466b56bbedd218663d2b629e8c13980046bf7748096630a18beed13bc48427ad842f585aeb1dce5a3a82e902f40e35c18b6e8250977a87b478e92650e9d92f52e9d86fa8a5cc866d5875e677ec65995907e254f5a24dc86cde80cc1c7b6413577fdbef5c558fd5b56da7c268dc765edda99d068d7945b55b74e634147b0f791a8fabf3f66339ab76d7e3aa763555bdfeaa5b9665f169acdaa5da7a453b293af0b145537be02d21575cc1236287eea746c8553b6eeb35910a8d6a5d87155fb507c273255dc7ae198138d209d26bd47c64e3dc8d8b5ed58e875fbdc22a6b060bee87bbd2b0cf506d03b2c3abb903ed5e3356e324d16fd4ae86bb8dda71a3d7d4eada0e589dc182ebb40d08bfe7d598639b10adf92f0b26b976311ab6438d5abb9aee9e14aebe3aaa9796aaa2555f1fe8aaaa8070ed62f3ad57b4e31a320a8af77e5a8beeb4c78d07364c55dab1c72b1e117cac8b55bad37c6077afa110ab76dc33a77917a9b4a67d725bef5eed2295d6fec35d3dbe5b7fe73f8de3acda537de67cedf3693dc8e80171e43b1ea369bceada75715c4d8e0ec49133afaa6b9f39c786b4fadb84c8ae3ea33d5ef17854b7362033b7ae51be0ea441634e43479f99e11aa570a907cc3192c3411cf9ee1aea6a6626f3b70189b91198f3b27030c70988232fa3552f35351cd71dc7b5bb28e9fab6c56932efbdc7d59eecd8653e9ff6de7bc764defdc8ce2e5349d747affeb2c01c1d2760ce930271e465969a1a8e8338dd85bdea44a33a8305f723fb69afbe3d862e9746971b90f71ead728f9b102d2732cee8f24f8a76f96ad724d5d8b951c52eaaa9d1de710bb5dafdc8c65e5d4acb47296cdade1e57f088d8de0eb79d2d52698bc64c567d751fe86c058f880abe632fcd1d7f69aedd4f8cadbdfb89dd4fec77ae1d7be9eac64c16dc8f6cadf664b78ebdfb91fdae8be3ba9ac6be9bb38bc3b79e452efd3064511782ce8ed1ec70e3919dd58bc6be78665b35aee0f1a8de0e4f47140877e32e97f809a208a44efc28e0a780958a049cf85c81f8fd1160bfa20d62bfa219a30fddbd73d723252fa0de30d0eb924a8007168e10e6b48f54c21d80395d3568a32025bec31afab0dfad023ef4ab424e8e09e223a9fab6fc459f085d1615ba4ed69776404338e8741da350863859249e67a5a5ac6a12d6b78770a7abaaaacfa865bd7205f565d18538ddd592594ace0b22158aa778488770a7f85d08abcfa8af44e607032c2044a24a168fc70b72aaccdda086b57b41bd9b10aee32175123bc2efc2dd1dfb97c57c2208e21e97dec21ff64c7d5ea35eeaf1017a2cccb1de7195b510275aaf0ecfa40a60af3ee4ba755dd621d8ab8ae2421eab6732a4fa55511cc481f10fd8530dc48187b27af786d69e2abaa748bb52d31e90a10ca69414c5453c5076923356a0baac282ee2e19e2e8873da933c943c31cd5cccd829c91a3e1ed62e5ed62b1590ed2b423f71010fb720584786106bde65c87cc534c265ad4d9f26afb1daf38eed50162cdd3193b73be47faef6d930dab36cca3feeaacb63743f7748bc96c58bd626c6b44bf16edc6141e2b5bf2d88766c03627d62547bdc825c7f7f7577c7ebb8629fb463ccc9d53eb00e41ddcf4b558fc3109f135cd40198ae0e2f8d88912ab1e5cb9104111d7c01737481a4ea3d5a3e09795932c2049bba9ad572440ece6859570bed6ebb8cd1b2bb2523479e3a586213bc841cf77bd5db577ddf7faaded7376c924cf63f559022cdaff8fbb8ee02f1767ae08ff8c2bf1782ae8e8a220aa00b886b97828bd5ab76f0fbaefa511d06a96a57a3a0ef67137310f8aa0679e7d7b0c9babc0d4733c445195d51d91c9bb6baa4431dead0bb855920f6157d617ab7a00562afc315e52029fa9d21186c0673f4ed7b9a1a9bdf94d8543dd519dd6ed1d49cd9e1354ab28e7d1ba3e333313a1efbdc21f1c180db212ebae8ea5a74fcc605181d3f3f33ada2f173a61e3c8651399f26e72d1fd8737b34df430a725dfebab0ba21915d98e8b23eb1ecdb58567f58c78e697f3f32792ccb84c467b547be8bb736213dd5e3afda55d72af6ea7535a290a1ec06f14e4f4687b21b44f577d2811acdaa0f0a7e44f734a736a27bcae876976a8b06c16acff6b833e3026e7b370f23dc78e6abda6d9f95347f5d9e379ead92660d62bdca7e59578f8504b42eac769376da49d89784d51ff2f3b3b6368ff5649fb57bdd554266dddd517d5e18ec705ea3737bd2d719465f0bd1fbae88de2fbcb447044bd17b518f21d804815e2a63ad8a0981c0cabb4040fa729e647fc2059c13a33bc43c59831a46d7cb7644dc84c03df1724306a44ed097901e0ba6013a7d1d6e4178d4d6e793a20e488a113a7d9d37204bda0788476b1d6df1c680140cfafa91b2d23e46fafa6491a803b2d2d502d15d7f0c4819a1fabb7569d955312da37bda78f855cd3aa0c6c193aece1c3dac70b95441de84441fd83dd0aa4fd4f44f4d57f00ff6bcbf474a0ad27da0f95cb134e30664c01b54d1c2264bc2582dfa3a9ead18abaab2acda44be765152253342d130c81565edde8feabb3b3a797e5754eec44ae281f1912f1f6b319f8c795670fb4e9b4b636f4e64465b6beb637745bc09896fbf3b4cae65c6e24347dedd5159aff6d9fab0ea65fdddaaef593ff9e58a7b9f099935db1dfc829abfbb83598a9695f3818f309f15dcfb9cfb66c0450e4b19fde2f766465a5bbef9783b423bd3778df66c40f8efeffb5ac0ed900d9e74f6c5169db5f639a1f63620d7b1f7f0644ada763bd317c45adcdd31ba3c53d147b4e3773ff8a2da3dde7ef0b9eb408e9282f045e78b2a2505c99a9f35d71bbbc33ac39c3dc133a5e112fce8226b1392b5f61beb035e6e4248bb035eab3744d7e117d4bb0179415762aec31ccc89a97154bbababf7f0b377fc3d2265842cd3e119f9bcf1f0b36f8f6877c08f76070ceab83b6007b81824456f139b5b1d7d7707b68d2ed23ad8f3a2f99faa451b65221a69d7e19176d1bccf0bd3da31dabd9e40ccdabb32c6aa1c97aa5a5b561a115b58cc670516343c2b38d93b84e5cbee8e1e7698eb83a90cc4d03405c0300cbb6e1dc3300cfbde606db02c6b29cab22c0b0d94f9f36dccdf6d7748a61797e49ffc5214175bca6feb6387d70719b0f5b103bffc1562341a89be5dfbfc68341a8dbacc39b363bf6e7dce392715a6199a66cfd0343ef1f5b63b2c6d77587f34045c75d95d6d59d7d607dffab63eb6ad33bdb1b4ccac8d295f7dc2659a7df223fdd15d4de5bc1359cfba24e38eafe4bda1655d92f163edb25f5963e1d2b2b3cfa871d5595d2e49dac5ae24cce893b24ac6ce941f8fea33bec8a58af973879a6ba7d3fc896992caef50ef10162abd4768ae914b55855d56c35bb453a2b57cc5c79eb462f2588f9f915af11676ecbced54d7b4a893d756a4d627f3b6457b2e24ae57c76abc62a45dfcc33eaff75efcf5de7bbf22ff7aeffd621fd8fc84368e9892e2dfe39992e2233542c7fa9bacbdc83e2f0c931fcd091e230c58206ed1eefa8c875865e2b3608282fa47a6af43f8a3f5f5ecbb0971a231263e0968de1df13f55671d33c9fe530529d2d875f824a0dfee8811abbb40c4ed877c5523bd7abfc324d6eb7a5619507e4afac0384df839537dd18ebf9042b60eb9faa0f6906e431ff8acfbd8589f1797aeeff6c38a5cb2acba5cba2aa41dbc13ae95c42029babbee639d2145987672613df1fc79ab5e54b3de5dd6bbeb3ed7131148d14c9c54fdeec4ea26a9b6ae032d5a6d7665d5e79dd1f1873b9ec4f3869a5fd1d759afced4095fe796bf7c3af82c7a6bff68cfab16857cd5ee7d6f9d0776d724d53fb663ed81b567cf6fc3dc00f7ce53bd7a85ed17fb62cfbe4b33ca614e5e57d5abdf1d3b9f6669d9eb99bd47637faffaccae595690eab3462e8db0bfed55717d6b0d97f658a5e1d256c79ed52ed5d93b761df8e6ccb0ebea778c5ad502c1977181e01fb15ff541353c46212f10fc8e012923f45b20f80c4819a17781602c5b8c3e210e9e87d3986e27ff7e51d2ab3eafadfa43cfa75d7447efab94f5aa224c29a5e3a5bc0fddc9ed6d24eb83498fbeb24fed18febe5babfa04ca8e5375a199531436d174bc9296efd11d4d3fa9fe46c0752f4ac7772b868e47ed3988e3862a40800110b278090a3a557fb30a8a3830c10c442003229c9e40d9717a179a39ed9f40e1937521049cde2b2a8480138a8b21efa824204efcdb82e26288f5aaa274204ebc55515c0ca9fe2aaaaa3d16e20c0dbd77bb65df404513aea0410b37f80215de31a5823088f082171c810b0fda70dad3beeb31e44141a717854d3e747c5298630ce69b82835b038bd01533b48f8e278b8f11a8e19f1ca363955d156fd5254ae00ec0b4ac4bdec1daa1aa431a05295dc97740ddbd437925a92a6d2dd9284869f90e045d5975c98ed1b25a728027432deb162c45e0810524d40e8a867ffb58011dbe82da038dc2840953e5845d09c251021a5c6185490f5674a025e8c7891da3af04f1c00212829c1ce0c91014411b0529a77d07829622d8314e580dda314efb0ed5b276ef7079743b540319f4cfeb2b4135bab08311942128e8b415b5075af2821864418a3382824e570deae25fe744c321315fe8420deaf02428e884c44c730e66fcdec4dd92c41022dba5e16795075fa2914bf0441e0ff8215c824f824b49c09c330e3c84bba527b05bce2568012ea65b2f0ddf5dabe81f11dcf0376fe1f5d7912f4406295608ece97a3cec180f82f5110f6f04e664876702e6bc13bc1330673b3c148f08ebf0539e14374a8a1925c52c7ba7489398b764c44eaab493aa9a8476c19e5925c9ebc2ae48841724bd98f29263d3f5fdd787c513e77703221f75583ede79c75e9db71d1a2a67a44e5e77cfc9eb183f79df7214c9ec3deff0f03f1d3b8d9278768c9e87cd933477e3b1bef4acfb7874dcb2baaac70b45fb784818a912ad232505813dd5e1b7b79963538fde63b4473fab4a923e1270ef355cda57cfaebfcde76a9bddb1bf28c7a5bd45bf3bb60ad7611d969903d7492911f23e29caaccc44997bd36d609a5f25466dd7479757e5c60c169cbca2bbebea02c1905584129e34c6e1334db3ac5d09c6dad5540cc1d8805c1d2b1c4a01d7bd31869ac7b8b8f44aef57d30fe6ec697dc0775f082ff82dc17d3fde713730f25556a64c993265ca942953a64c993265ca942953a64c993265ca942953a64c993265ca942953a6ec462bb1ca19667011a38b2c500a8c42c6172d6068c15638e88c2e5cbce8e28a27058c92dd31250c236e76c7144e0e4108f77e0960d681ebb47e2ee0de3766be1be0c0072f079c0eb823dcfbb9a6def341e1525107a160152c5ce845bff9de6b8e2ae8964bfba00b2f80d1a3dea12e80d17314df7bef3d78d870f72f0d5cb760748c5f801147d070ce108cf31e2f44f402972d4074371d77a8e307a0d81defbb25288c39da0d430b162d9e0479e9f2851754ae2803cc9630b6c022f4640c2f435f54a1624619626ce91e40ec8e25435ef1fedece9630b6c01285e29331bc0c7d01ab402a669421c6962c5b701416fa32061843afca19662c97b70f8ac4e83d14ee5528dcd6dd51622cb84e88de4721b8b4c7e9d5180b4e4618a1a8c7eed8cf572d644b8a8430a7e0f69319c28df1410845249ed87c6eae4d5e96b937f0d99966b76877d356f71a8bdf412320ce8b4430f178bc7367281c57af2938ebf33d865144e291cd87cdb5b3c2840973465b5eba34071942d16e3fd808987331f188b8a9a9e1b6da715af87d4e3afa05734a378f88053c1eafabb96efa01f5a82ad91dcf092ebd053c227679605bed6aae7771770b46bf4fcacd28e0f8dccba6ac764c9e929b96d7282908d7f25ccbfa03d6f8a470af2202a98abb3ee2c522e0deaf7718cc74e8d09171edf3c0f4dbe779e90bd3f611c1524ced7af6b9555224e34893cf0e6356b74d887c027ab720f21d379004f4557d12d0d727f7328651d484db49b573595b83709585eaa420d5e5abcb77d73124aa63efa2dd0bd35798c6aceaf2171d55357249d60bc8a853d67b41604210979657a98b42502b1b9e2706edf278f1150f0739e17e164f149109415a1a3ed5bc0149750cc217e4d71d22216b4c598fdb50460ba077a80b183d474fabaceaa7ab4b788b3e8ee752256ba744eb7ebadb2bd19adfa59a253f305c7a8e38887bfd9078fdb474972eb6f04506793dd335497557d7bce6c677788d4736d9788d1eeedab9679f1c9dcfe8e85df3a2b5dbc0b2052a9c170d7f69214bc36b1bcff651ed9468d526443bc73da39dd699ccbbab33d2ac3c315554b98f9e89bed12ee67b06dcb80c4745dfad01af6fcc60c171cf1e5f6d48cc6be768f7d3dcab0d89ec23eecb3924996bb5230989b9882453796244db3f3dea625e19f1fac6679dc182d3aa122d7e3721372eaa3d372e537b6c5c53a2b55695687da3663682bc6be78dc7468d5caaa9dfa1462ed5182131aadd6b1aa7f96e48d038cd69d00ea86946d73e35faa496519abf0d898ebb66a44510f6db90e846e7ae55d8346a1745d320c14df30c89d139275a543bf91fd8345de452f6515d2e6533b54b354d9db93c9cb90e6774a676af334dcba8368385bcf68bfebcce805ccf1ec49182bce6fe9afba8f6cc4ae2791ffd7d54bbac67cf3cf6c975d1a281e81dda82193ddf86c43c86d16e9efbe4a8e81ddb8250639f23ba9c43ba8c4ced628f1e73125dc689197dd9a43d866e1fd14e8926a24e5e738f1b0f3777ec58ed2647456f13b2ccdb0fae8a3ea231d768a7b576b8f18c1ec3add14ebb253a474755e3d2766e51ed997f9d5695683d2bf6e5daa25d4ddc76649012ad9dbcdd7868f47b0d6b588852ba9f18a9c415c42ba294b882482552914224c6f89e7c4f3e6626c21cc798bbdd775b2960e9aa765074b5565b5f2b2e7f2fffe8ee5ecdd4c7e2b87f4bb765096616cee8f934c82da10c6b1322aa1595c1ced8b5f858e50f3f2b648c1b1022cf8ab8ed700d8d0cb5b915c3d111ad28c725f86ebb58da4584a59473dbe13a072ecbb4f958675e6133f03d76dba50b7f06fc8b5e435c77b512ad6fd8140fa17c7cef85e162c7a3d3ba887e34a420b56799cabfca5f5244f7bcf3a7ccbdd9d7cb263e6424701d8fe6ff864d95c531cebb46735d8fb18af445b9acbeaec35587ed30592e2d97aeeb9645adec4a761d9851583bad2f8650981b04b7437df55c0d70bb842ab8f460d33bf786e8b7842ab4f41b1a5d8bf372fe84e382672e8d867b61e08a807f17824d3d8660d305b3b8418b2bb861087590c109fe82391d40811844288210983a8ce194d3f0352fc11e1cd7834b420cc1a58bfbdd98ba1b82b4023788a00d549ca0092638755c33b1e50c61708213c05045164e5da9611dea2024852a67d88109ca382d971c14a0e1af83867520c30dba84610b2e6da0e2b443bd23cac25dbd6cba9ab9d4e0ea27cbf0a2a366715e8ece85f150736353f30b0c4922892144b8a484514da2269545962c36708318dc508735f0400b4b5042183628c10a0d8430430a3833cca0dabc26ab49c02be5c5162dc0a00556a0810ec4f000178001032478c10a2d4001019ae04319c0f03084c8962c099893d59a2d0c38011729a8c0862e70e0c1c92a82184154a0e00a5acc3034802db432781163535323448fdbd4c09c1bc6797f279244cd4b357a87b848e9ae87978b2f2ab67433bd39da8e36a7c77e887745ecf0233b9ea3f912a5637a87c840a5370c47744a86e86a016cb24cd6df8d6093ce2dba0023b8f40291f50558d408eb0a762b07ab1a02b6c002291ce1044f6802164ed62f9833f3450ec230b445e8c99793758e4d41b4558613b4751b368ddafae283b67ec339f0641d08ce8927ab764a86e82570ab69257a436938edfd8181eb76a8df8dd0d16838674fef242202b758d842f3d03b84052fbabbd92d16cb26c828816cefee88518bd40642369062032a56a016737dc4debff511bf97dfacea07b7ac24f96dd28ff77ac7aaacfa4a62f982050c16336c100485c01a97586a2d237dd6df132e7c5e988e87729d301c4b003e941e271d1b04dfc616205ad6af4bcbe2b15e3150c74beba12ceb6c4979ee42d0f117ed64d7b7251904b6e584fbb53c979889cdee603e8ee5c1dc5b6bb8c4875514c4e9b029892216c0a66e8823d834844d1d0fd10c7376ae042dce0a5d57f84ae4275e2caea24869f88bb71d2e83db8ecc02746238abd316b0ede87029092ec1d96be31181e35dd5fb9ec47ac3d81df09dacb1b144ccef49eb23fbde667d60df0f51049b44df9bc38e7baf0ae71cc13c1a763b7ab8a93a8c63736ab4684823b3c3870c49624818470c812c54a386852c8b2626a6460d0b35fc0e3333d7e12338e71a3213f3dd76b8eb70a5712374bc1b22089c8e76bc8d8d361e2fd7478ec7578f081c8fbfd86443facde36bd6c78dc7da2929a2e317c02523b470f1dd0e01d131e249a90e4757751db5d3d139280576073c0e5a81c703de865e804bf0246a844bf0377409c6e91b55c9ee80b74189ec0ef8a706cec6e3df9f16eb831bde067d5b9e16296584b1438d18af304c361ebf6bb27662ed2705e6f0f0fa51a5bfbe30e7e73fa6669b07ba73e5cbe26c57ba7305cce26c53ba73c58cc5d9bee8e90e96a0c5d966dad5740dedf849b76868f81d680dda5d4d83e670463c30b8ed8a6606ca60c9e20596a1f8c2a06f0b97b8fab470091e0c17eb234308ced9a122d8b4434e082dce4ab9a858c1620588e6b85d8f9513515290182b4dbf2f5c82df196917dd2d69af68dc9236aa3ea307813dd21e98fac8582e0d7f8125d8a4844ddd8641c408134e8411c61157ac5cc17225cb152f6275f556536af29decfd5acd714bd60624b60faaaf6fc9dad870fbf1aafaa4b0100744c7a1c5592dd7168ecbe26cefe6ec5c29ada9da8940ec1c5103739e1688035f53a345cb72e9a705e6eca9bbe7856e2e0ddf96d60273de172df1dd0ecd1bcffbfafb027f49d9a1bbf7a5a1f549dff2b09e51b83bac6334ee0e4b2e8e75687385465b70eb77d547854b90c9bb6277c0c782867f2a581ef0bbfd88b13e295c821f5293100571ddfb12061952ca60131836752fcb33834d5a38087ee96e874cf170078b96c5d92d1797c55998b383c5cbe26c770f4b7cd2ef2c45a670300f62c44f2850f0fca4ae1940aa6ce91df28218ddb1948e7f60aec8411d9f191d2fc9715dcd5f2a75576b571db88ea6e3e3fad88d01db733ecda2d2a99debf37d569211dbdb816c6f4fb546bb4f0a6967a4e137aa7dd24ca3d6274d35a43fb233eb18edb84b5b34efaa7635cd677095f8bc80b2721637bc85d797c913ec50aed3f5368827507eda254047a3e5a1f438ed06d1ed5000de80685e38a64e361e0e6aae4cacef60f9b62443d02cbbad4fe6cac43a939fabdff278ffa9e9dd1db14341270c378a76773c9a479970332d1fb33c70e2a3a61db29462ee4db7606856886e47efbb1e3a1c4eb8e677b0f74bb33edef73456e3de1211b914633cd3e5117b71e285d0b1a3a687c641b330a70471e4d5b24647a7a3e5d5d54b30270988237f69a59eb5abe999045cdeb2bca576343abeaba1cda257697647fc6a5bda52bc45e39662297e9570fdfa3157225ca24c8630f9e1b0d0f211581eb226c125ae8690c52d6dca726ebe9f37f409175c649f8c05d7319754f6b7ed60db11296db7eb3b5305372f2d4ec95c326d3297f571060c6ac9b5c430ac729426fe51ec910279c7a215399a2c2c7fa1e577b90c5ddff11a5a3ebe97511a2a30a78671e42bc7452b2d392e9d814371491e8a574438c7c8fad8ce798b532f171ba356ca5cd8d4859ec9e02ecf5ce4b98b17366597e731d8c4bfcae0f80cee1d7cd2cc855e87ad8d090fedac96b8544fe3934defe268f7ba5ef5864bf5136ada630d8a7677d46714d332f6c25cb80b1ab8f9eadd9af18eb9d43a0f4f836e57311c97b6684969bd72731af4758c22058aebe2b83563cdb8a95d0ffa6a7ed5fc7ad42e2c071455b5ede8b8b098411c2a110bacc96a57e222952b52b9eabc828bbfa4b6bb5c4a5f7abd709b43e4fabb26d4d8df57872f7a5dbb94c0adf6c76d47c7893c22b2cb57607d6097b7c09aeae5cdbb2ba787779c0f99efe6588b735de695c22d5dcfe82e8feb51475fef6187be7e33eaeb18037947dacd67af2c1e7ae0a1d66f8d188661d5c9eb58bb9e772ea3bf780bce424369c603652d5c92ef8172188c233fdff5482f2e5d1ffdfab42e2958942851a2162da3b47ca4c2a6fa9c9bcb472d6296e8451c8a58e216b18bf845cbfa4825528955a2154c89f6ee24f6759f515f7587776bc6e85775f2fadc67b0787928604e0ca2efae24d8f46a97fdf5d0ffbcaecfaa8c1ab86eb5505a697c62695aa4c238f2fb7d63e0acdb1cc7e15962d1069ba8b009c765cdbb27d4f245e92b6cdebd2a2dffd4c0f5bc73ef89425c92ff791d9f7049ce4b9347bda09611f25b29ca2ae51bca438c23b1348d77cce5497951b8248fd12714545d56a735a8e575608eac42c12579fdbf71d2a1e09c545050509050505090084ef22f884dbffc7b52637bc7758d9aaef1dd1aa7b10a97e42f1aad7049c6ed41017388401cf92bd6eec26ac75d55478d36c7f12e5291e23a146cb221372135bf5e6d416a0e059b6c5c1ef582d6c7d6fcc29cbcc66a1793836ee3b021d11b54de06dd78e5e63568c7d1a0ddbba2e56968a7cd5026d63c477f5e8fea115c922722aaddb5552e5aed6ae48d8039377519275eceda5dcd65dc55bb77a51e5d8f129bb6c4a5f7b84507f75087b9371d67e96aae06697402e6d4a0b9f68539343e6dd4a06f71e069c4343c0dddc5e9b08670860a6eeeacb42b86abe29f97f5c1949b9fb0099ee78c10f7bad4abcf0b8bc6f757637c5eb0095ef4eaef0b9bc3419cea3565f81aba2ac5a1abf78038d5af8be3aa571b7f72cbfc0b28df453364a3a56fb67475ec8a0bcf312e1033323232a2cb5427af676ac797541abe876fc14806a63d296280d1a2bf5f222e5a561210a78add59c80bae765c1551f5c28be945a9e1f342db12f4e20d79a159d6ac2ade8070efee80b5ebd19d929b26f9bce63b89fdee33eaf7447fd5c96bbe9569903e295caa986013d7eed5ea53ca36705dc9d244f47dc1a5ea3d60ce1b629ceaafa9e1aae7c51938ebef7979e2450ecdabea91f1ca3883b76053d7839fb0895fbdbbe7a5460b8eab74d509d1ddf34285a374c5425d9d86260171aa5b34d215d121b6045fea568c2c54c0b012069615a361f5f94474082ec10bc12558ed26530677852f5fd8b44357f0d23f74f5e7854d3b64852baa4746579f960619caf5eaddfbd295b5ed70edc125582fb04f46c85b3ba0b92cf3e7a5daeeda1dfd09d132b507975ebdc0db2eaa593131df2131c4e8ee79d1d5bbe7c58b2e5f80196253b75bc090a2854dd59f97eada47f31d57f3ae60d3f62a8672f40acd47f4e7b5a82e21c50998732d0e7cf5850be76baa1b813934b5aa7e018c5e3489ea7b53d51ece22621c5ee6e7cea7ed9eaba979ef116c9a37623e892117e09c1a88337f8dd1b3868c9e3d7abedb329a5bcb7ad487dba12a84d14b46ef1015bcf47cdbb5c5a85d357249889dab0a21e163b9b2129178aabe1efbaa1d50cfcfaf154333448530ba2ba2e76511d334bf0023b4d4c09cb838ef5aedb4cbaa1d0db757ed6cfad5f4c482eb6a80ecace9defbeb7a8bd5cfe56eb518317f049be0e735ad1a5f637d9e864dd7e70ba2c375eb4c98f2a4970952b0fcd0cb84139cc1d0a6210dc3431c3ebc683a9beea6f7da6eef8d8a0b0a0a92e2f47ef9e0e25f77574db5e112ff6df0d5fbfb2fd6b8c5dc086c196242942c104cf3271cbaded5bcd46f680b1c82396f0cc6e1aa76a5eee0d0bb8343358f8ce66370e8a5a08bece785afe0acda3d2f3656a73509fe798138db0ef402cfb0761c94ef9e97fefbb23e5efb3c306dbd7b6568ecd10b9bacf3df186cfab23eb6395eb7342e59f59210cc12e6fbc261d8b3c2ed1015be68ecef39ba3ee30bb231a32f2620cef5374563d82d2b6e47a47a746cde5e8f660266d87bd8df2d0b8b707b41d8af3bc1a6f7eb3f28ce1902e25c5f869e705bfa7af7ae30c2a5eb8f2e710118a371e9ba1ce2ba386c88be6e6d406e619fcb311a97ac77fba5aff39978d2d79580e9ebd672c9ba327f9de6baaef76093f5eb17cc99f5b2e9e5d2d5d74d5f40f4f5bdb96acfb302d9a262ae929ae62535dd031f854eef73cadad53cfe82391897c493298468c10c60b4000e6774210727ac2e9c62ad50832550210a1bb270821c9cae0aab56f769997b9ae2bad87c0388dba12f55bad39a5500293b59328492219cb06488ad2e27b27be0357859bfced5e3758c5e4de062f3e5d591735e90763979fdaa559dc8ae6a4fbcacda0fc8b194e5d2edd075ea560b8f179e9080086ee8328730a71a3605a0f7490c01737668d9b0862c48781226085588e1b4df9e78adec2e2670924b90b7eaf3a2d8abdd1256dfe3eb78699694f587bb0a13264c98d8bb5595c4c3b23ae18e35aa215a9594d665ed16868c525a96b4ae4ac64ac6f82b109913bba63d79cd5745612e332403c6c8bc0619ab4a7bfbde7befbdf7de7befbdf7de7b4f66cb16ca88150562695c823639c4e8c8257e558c314619218cd20b57151163acaaaa8a558c50460861846f98cb504a225cbade454853c37f979239465955312e84324208ab27cb20238ddbce0e8c314c70e9ba855d16a7c5eb5529882f46dae4757c97e27d609a9963e4c8cccc4ce74a09f9bdc72fca418a33e65a7d51f82bdaa24c5e432bcdf482435408b5f5685d351e569b182d4bca275facc6d819a7bba8542a5415ca44cf9290318466684682000a331400304020140c070412a12aed3e14800dafb4504e9d4ad3204752c818630c2286800103002000404302024f0c1f0620caf013372f849414a1631ed97144392e8ce47dd608d40f7155b85d7cffdc7ea86f17d30c16df0767821cbbf36df4b1195e99556fb0f911bade5d3270d03cc1e13a6d2d53726b6965350f0238b8ad61ad3b1c510af8f3834b5ac2e5f83da1800c02a6cd240307c73080ab4fa633fdfa8b5c3f4a99e47f68a7dbe73db6a693283dab53bd1eea820642d1f9a7247e70e54d2ca95bcb2167f6412cd52ec703f4b7b055b4962416e74d7dd08bd40e1bebc1dc0763624db1ad10270e2d4d4ab4251ff620142237db7034e1de82826e4535eb7b6edfe1b8755ed71fe55758418c9e2dbde87cc9a0b3a516dd9718f45ee2d05fc945774b1e9d29f5b667d1fb9283eea50f9d2b5974b6e4a39f528bce963efa53f2e83774b90b311d1ace2e0bbf1745efa5887a558c7cdf113d156dcf8ad0f14597698af6aac83d289618d955eb29213bd80bfb02fc9895cc226981858ae54d8d01ca55bfd0bd1a455d2e68a48749ac9e11806d550b2fcf1030b4a5862000f5eb57562d5ceabc134bf79fabaa1bd300db26e3e7b76f5bd64b4e9b092fd9ceb0988e97c12d1872af3477a2218b7b20d44a9e1e59ba7ba5ac050800a2ad2ec876c896bf376ecc6f6d4557bc503e55b639fbcbcb25044f2aa654054fb49924bc27b21111a6ae7fc7b343764f1db49d2eb1318d84df9323e4298be8ea30fa2783959c1531b5fb005460e2eb12bcfa8858df68c9c8d37c3369a21b840d79124e65368c5af5ce4635d35b51b1d58075393eb73bcd145b713fb913548d0b05a50746213cca05df148b6f574166db8c9815ea4935d6fba37d326321f299ed553776dac4f7856e78a8df73eee23989e1af42cb38c9b406148324fd5390cdc9f90b006623bad525268db7f505a3de2bf5e357d9216e56c4ce029159227e06c46785a82c11373be2648ad8cc11231b91b24364a6887ef6a117b680b8e0b7560c6f9518a059c73755c565ac3f5dd04c55adc5b76803f91e1228c08c112b7e243bce049a2562d80fc89653816781c86c882f7f4956ce0526236274c59506710b71188196d0d902d178f2474e06c94bb8a48a45781cf922525d6b455d108d18818b1289bfd235bea77d39ea048396a1408229523bedad6643a456c24533f117d8ec5251879aa3ae83b87f27f228498f32e8dfad19cc434ce1f69a48148f7a1aa849f51e3c911c410364dab60ec881d25c21a31172a65104d067b822f9ae3c0f199d35a8c5d9f42782a9cff7c07d9b91abf975da0ce1936692d5b4aeee2851dcda99c32fc207bf081409718a914408565631162d1a4092acd68537d4be8e0d362306404003ae74d0eec6a4606cf337901b90e0d98de06846f006e157e9ab38bed7b797ce99ad616b0f406c7d426a936ebc6331cedc634c397711b244c7366db9da2d8a1c5dd834ebaf59febbd4619746ceb8c41cb9b535ae73646918baf841a05c6ea157b431fdcf0d213575165e24a2ac95e716f628437c7525061e67e0da6b5f23061a1f89e27ee28c4e2a333d143908fae35be56299d7ef71491b5006dfc007f849bdd3e2a853b6a21f673de7c4155bf0d98e8e5f090e7238f0d8bc92341f37a28228cd6b34172e9795d23cacf41241867715a5ac283ff587ea021320e522d8f721fe4a8dd042fc07064db840d9e3dcec216e137b428044a7859626c3c81e1090ad18827df4bc7d760ae5f9b38d96bb654c3c92587ca4a24360e9061781fa774ae222f97e6045a7a046aec58895fbdf95f9124618e6f190e26c098b9250759b5fd51e2bf7ccbac5798c784fb5b1a981cecb348db72739443e8d299daa5ac2d4ea24691e6df0439ce64ac95c0811752075e4a9a1310c2aec1894494f727c3fc761841a48467808c3a52e7c8a10f7ea345267f0277a4ab3e2766ad8a6815510aac7e1d4548bf4c24fd0bc239bc533244a2709e49598247127b5fe91eccd8698dd720b51bc44cef74d5055c9d6400d3783495f9cef1e5ecfc8cbac772986479ef03a2ef06fa97edef830b2ac416d62bdd21d6d8665386a949d615ab8ded0a08330752435d61a2f72c09d05e651f9665de880294bd93b51eb68e7c3ea6c1707c90845fd0eb13ec6445215be725618cad52fabce95e969557be9ed46dbc03c96f452f74af522da54562e3e831844cb87bf130c5dc7309634c83fbbc0728c46a72f339ac9e2bd12ee54da1c14e85f4f0db9ebaecff23f3bb8e40390894d3a49998672c414160d79e3a1b9fe021a62dbec7246ec895cda5970d4cef53ecccb78e8bf1a7d1d909fbd65c88a9ee72aeca4959967337a1a2418276717e1ba2e98a9210aaa3453a545be2dc306b18632a27634ef60eb22602c136e971085ee64717113ab021a56abb418983ce487fc314a3523f8e61a2fd0d8b20db72ec9aa1101e00546452fd48956436cd44e3cb37554d835f3a34644f2ccba9c01a400df41a7219003810eae165763a60baed1c1c919d8c37c13296c378b7392bde328a7d387d7b5507aa0c78e25140e9042a56f006f6916a032cfa0a3016b44f67fb7679beb934407d5650c36b1a1473ff012c77c539ba3d2dad04f628db333ece3814168a7489379f8711abe6fef5f3f3ddac1e2bc414846d116f8d0146320ea8a55b3a254be2b8d7b94109ffeccaf3e8cf635d095ae756f30a1caf71fea49b3cf3fc6419f39c33ee55711a6d31fc87815926fcd0989b19fe869a71a4ad1604407dba7eac8e8105c37f7b9e1294d657f14078c02f4595b907d03e5e39dfb74ce0e7a871e5d24304e55f2533eddedc6143021e0ce5b11055d840fbd36faebc080e34f1aee672e7c97029351ed456228408e9ea89fd36dfa0fab23ee05491454f5e522a3119d31d6db5a1137840a262696e68b9dc0db7ff7521a5a6fe2325520c55203e76ce3c6181f56d52a8b8f05ca0e28aee7070d19371b436d5001b1298bb231c0611416144fa01961028e3c1f81cc94fbe400a2a6dc4192da8e0f6e045b5d06624ad8c0b38b5b65c227f196883c070ef214855fc670077e1a5d35a5ecf4384bd0347cdeb0329716289e41238934698ad6e2696de42ec6c5631ea8e104325b1cf3b4974141115216bb44830bcbab817e9173a82e6ddba3926a161c593920989b7888cd86044302d2268684cdd5fe155e3b0aaf462a298264eec4964a83f59bf2059289cb95903fb8bfec0ffbf05496c33306b9d705be89af0cf06ca066e52e5956333ed7eebbb26d078e1633686d4788bb4564708ad08eb9dcc5f5f6b32fa50de19685e852f5dee46d6ce23d176919bb3358adb8df0bc5a1e0d03022084ac5bc59771e8560fdad6c1dd2cd47555f1cfd77608648e4d692e59189e1aa42dad6acdd49148b45e1ea0d0fbd2f1545e01666efa8af422be83c38bdf1999cd49f90a6f7176cc39193d32d2c1b4b7e7e212018a3b1786283f6121af7b29edd801da236ea2c3de1f4a5fdda1d49109a948462ca95fb61e6669c8fc6ba42311213c5fe8416160c859668ddcad13a6529cb5b4f8dc463266a5e33b00c06adfdac8c882dea2166b0054f8f4a33e820601251941cfe13525aba5b91879e8b1a8df4f8a4ab274a37f8da301f254a0305c7100309ab6411c57110e7d73ad90269f537b2bada273de885b1cb4154035bf721e4903717839974d6af3ed78ca6750788c06ce475063ba6382e9c38a3b7262a405097afa4fc77863508e39583c962477fa3e731eca0d3d9b4006ca909e82a26a273344e8c4e49b117a4d81a83c8e6b489b4aa9abcc05405027da17738a02ad47b080825c8d34d16b6c89c9304802d8ba15ce8614497450d02896334205cf4637bf0d7df57f110ecad5640b983b2541580b1e20900f3962140f3f9e65d433ed41ca03c4eac886b8e0208232ab98583a4fc4e762476276208c10d462a16072e4c71bde384104f5d1ae1635728f4ac2fce591fdcd07f67376e4eca04159117bc1b24031e13aa7fccf80e4892a5beb407a9f8a0baadbfcb0bb6039154e31b408da7f3174b11cf4d04c40cb9a4cff1ac349303894500ecfe15fdbfe406c149d74ec3b91fabc786aee8fd433c57d064c1f591ae7f5f745f99b83a16e5f859f16ec23e306ff60158d3f36b4dfbba0dcb72b16f46738baf4a70e3ba7ddee3a5b0314bdfc7842a08eb45f18df885962ee92b078768eeb775213f97ab9d6c88c3056f4e905d7f1ae01bbdc42a294bfeb1a8be791f4df5fc38266d250d996ab258dec74a110556938e01d1244e0f069cf7d4b4043237f80177c43d706a438400a76b22043872de20803e07b00f8878da618cea202934e45b8961d138bbc196619ceccbf0ad3104f382f1ec943155de5a9dc0c6ec142561c492de3b90d2f7531c932651db57b6fcd5b0d7e1eb4c54d2047f3dc5b160d22406aa7debb878345a90aee41853d1345b859e5d1308284596af92b36cef197cd948dd6c164ea3e0f17546a1ea003241a2c49b5843063a6afef6d12603ef84e64b70bb7ec38ca625d9d2be00b50594f8e08d1338d4b51591aec591e78490a95ca929448265278d001ffd895b6e515ce9a49b9fe7441f87ec9fabdffb029a129567040614da6d5e071dd6b25c83dc9ba03e4b8309d11112478538cec9016a1081fa7bbb1bc5c7dd8e47e535f438d53047b181148c09a0ec44f906d0ea3096fe75e205479b2601eacf2b3b438c85ab6a8c0b391d45fe1c6d67061a05728811d8d11da139aee217f7eef8d4b6a47343ed2ff7991ca9a0eebed29591f1ba13c0cfc8e55fc4504f3a590e1f171e7c9145a6fbc52cad6b7fb1e5879c9ac4e068de745b9d8280dea5be67e09ed78efc93bda379d4ef08549aa832ba093e121338f6870f134670435e7ecc86a68d48b4bbdc6528650fa370d7eb77efb4baa0e8197a410a9f4e6831951551320be2eae72a10d6352e323d8a3ab7520c24a539fbb4ef543a928ad30eb277c9fb4100ecc781dd7ab77401cf3a56474baa3c0e7e199355e62dd62a86be5ac7f742473dc1f31b7375fdafdd545a483890b2ea697446f2a6d47db8235bc2381ebfcc11f9728d24d2dd7735b254b36414f65e83bbc1204e2c91666d9140026c69440cb2b546e586aa1bbac0dce8889d0b88c341885ecd2433093720cbf5ad381bd32e787008d71d9b28e15ade5b7484df932d3ef8c1eaec86b62b97147e2b0376c3afa82b5f2f9807c2e5c060ae9cdf8e325e1aa487065955906487899fe79d5e56ff65ac8b666c8ad31ee4bc83b651851b57f06fa9769445ea59ad44df1c77da82d951cf62224c5f0922c4eec24fe66f20749a9fcd956bf7ed42e26158058a6036dd7d340604b0955c6cc3d708221c0e84406c19908b6a650616c4e0553197487c41b8bbdb7abcd200f38309b000d9af33e17b7f9e4d0d205b278b397768186ab3ea7ba54fdf040a192aee471192390b8056278fd0c0907ea37a7614f94c2b1cf298e3e45dc3ea0d590eb321ea723ece321cebba66375de69e9406669f95a54082361c68532e17de6b79fb1692644fac656678d1c8f78a3f95df2cba9a8d058e094cc87982f8c6bdcf6c5b89353424ca2cb76a0e5fa656c0aa0c4af7382eab54d06240d22242b51725b8762347e943c16db702e72ad08d009f11962f08d06a407b8dd5c35c5d7399dc2e65e3519303a826b8834ecc1399ad6b3a2f51c5a1fe529777459a0e0eee6d6a4befbf5998d9befa9944371bc0617ad58cde450264f216fcea8692e0c8989a0d594a11d26497fe1b404bf13683a8fdcf33f104a819546c9db5925effdd2c53a0897555b1ed4cfc3a582fdbb73184fff8e17f1a28fc23ec7b7cc5797b3b665156ebffca9a7b69a4ade04ef3cf1c3f67fb6894d3471abc3720dcce1bad83e9666fd308298a167e9989c73bf8c49ff21a581b785e952338cc8022de2d9eca805e3d5deaaba94057b8f0a530f5c2152d3130a78f5b6630b5a43baa8e013ed5c5dcc5185176dd9e895346e0754c778c549d4d4d42e69c9113d98f54b0adda9d05d471982dc296288986ffe0842ee75d2987b426d2ebda136dc5125c746fcda49c618f579a14ecb8fd4321aef8773cd84a8b5b62299671e5cf6667d1695ba1d3cc1cc2b0606086e94e65a07fa8ea75ffce7fb0902c26fe45d139a110fb9aed245cce00a47439313318f298b89947b7211bc04f65c206f1270b0966eb2cc2d0c29e4bf6ed9d2c0093c7e6a88becac00fa5f2714b121d73b3c81b1f99bfe944bfc301e98a7526c9cae9b21cc9ef099ed1c82a2ccdd0149857570890cbe1c463e7a41205be345886809bfe34598796409fa50487a3566ae57b3471e66dc3f8d9ca50560fd0ac9d5518d85a2309f5ef372c055005c270808ec170232f2fe0d43084e2b159ebdbccfa4ce4a591fabfcc10d3b54f9907d564d10c3142612a834779fc2e41a942fca86a7b3138a0742fe819867ae523e60282ce186b79d04c296b537a45090515979b9fae91dccb0146ba5eed6581eeb56c0a8c4c4f97b55207c4bc0117618a854491d19599a8550a8876ca0dcd0f6b83ef9d5c1d9145a792f55f21809a9ec4e2753d37859867a312ce6c58a224c82d708082834ae1b1c104558a9c18695adfb927f6e54a6298a26a550967a82529e688b48751025a5ab60d2713264ca6134115afdeaaa4ce0dd00e0465d43a4d01733764bb42fe454c8a4f93ce49fa4994ffc278d57c5451d3c79fada3e52f7cbc092771f47baf5453d5ce6e22f8afd14fb2cc2e43a9c6151295a56ddb757da0c9a138088ad2864938b64ffeb61710987ffb42e19e0015fe0bce8876dafcb8191d33d25bf4efa3fc73e46ecc6ec08799247ae663c5630fe335e138e9b4cd83210cf5248f444aa0240a9bb137ea84130f8555c1a1417d11945bc82e318e7b742e9ac1391eac428efeefb1013ba3845b701953068d604b2479ad57a99d2de1e00b29076c017c4898d3732b09aac98934a1cc6c99f6f5762d6fa97780d427b710c6a613bd70f4989c548cf821410280c1ce6b9912251cfb7a01de164d78662fe8965a21460a506678da7bd3ca7c46f86a3379b79e60ed19c07e3ed4ac0c54da809ca71880ab34fe55b289e9cf55cf12d5c1a5d20433586e399b791f75f3b488b803191314c8d4beacbbed92f73214ebd93f33925d8c3cb105688365506555c408ffc0f16b6f7e411c2b644519cd010a5202fe4d4d0bc3bb6c1c909d534de9e3706479cc6f601355dfec7f9387cbc682716677c9508745fad5ebe1f38ee0b2dc3a6f3edba8c7550a630b5d0d07bc1cacc6692d5beac0346d7706353c6abe4bf20e70fca0ef4f54215e3dc92d9ffd5f7fad1fe2842a6691194c84072afd4f3f7995f65712d5ddaf60dea1f655a39845675508788eb846f4c92dacb80b762353e20616711bb511e3449be4d13f36201e9b45582b82225ca4afd240d890ffeb0cc09929d4bcf7dcaa31f579ad45a91b4f612e59e17a7efbdbff6ac4b1771766ac9256d2554c72b9477299685afba256c9b24eec26f9993726b7f86a268549bc1a40cdc1f8007716aed5b84ee3d6bc32266e343c21b038a46887de107c28c17641e14590be68b1f8496ed05ff29da441399a804f5bcf9b9ff3e8d4c891f116e80de3a0f65a4eeb4e1b852033770da4ace9bb74422b19e19efffcc5e011c7211b01a01a61604f9b000756432d2b1a98000675000d1588c355e609d295c9e7c543adb277d56f2bb410144d07827144f3754f9bcfde4d6cafd4e6abaea6562f1ae0059714e16a22bfeb77f1ba2feada267e559838fdc6875e0979e5c56c7dbbb4d635d1547b4fe8ad4ef218eda6d5d6f870cd23431abc55c011c8d3bb27c3fcaa972cb521e0f835d5b03f4f1878d657f23e1897ae920758e4339c89c2152f8e963989ff861fab23324068e8dcfb1c788bec28a8b9394244a75764b422ce19de259ab9df482d02a60a42346e182c560f29df1ba2e0d3e2091cadc4075464fd5e43f84a012866201c7d061573dd17d7d972eb90ce37ba0d4201e379ffdc94be9d0fcd79e7db9db86195be498995ef0d3398d400e3cc9687f0e884ad769d0e202a757f8c799adebc3560c0bb775419b29285dd42451e3ba7b9074fcf212d0ec40c377fa9b146bd1b50963dadcec0b5f914d40f6d7de3af9dc13651f3829f51d0b5394ec8e2033868cc97c1ab39495406d7944c422bf88f25dfc8047ad2b402b5c1b05c71ed335a804122f5d3138a513c6dde1a1e262664659168bb3e70559d23dd080dcc8844179cebf0e348e3877c682b43a3b660f661fdadc9b99f0aaa530acdbdd4a58d3570a40e24242650e5a78a830cfd568fc9c1b76f2d0e489f1bc61f181d8a69657f09b50fbce833cb76e34c07597dd8c01120fb646e4b48c6cc55ec9c592eed0d30d0df4d73fd54d103917d109481b839fc205a4f619958fbb1ce45892cd0c7c37d7694909b3d48f8730829340082ee49ed60d4b9637b7a40fa324237e4e1026dd4f045147152a8a76336eb316f744cbe1d6b18da51c0b9b9a82e5658894c7476a00ac09bb022326d68f316bc58484fab01f5a484446255ff339114147655ba2b51f8dd6eb44eb94a507287f942467dbaa639c5481b561b91f7334c82d96a1c4d3d1615bd743c6143fe8a41bfd15af1ad8417fe1cdabf100634f5c379cc9682e9a8cb601e86be31ddb5ec926297c701951e6973f5e99c1dfe22ab06026111f876ff2aa12d7166478f28086d55b2c7eea76471597bd0a566ee345d56cc5edad64b938b5a3d068b6409178cf0e6c25edf923b3045a47f3f736135a7fc56a7a1632ee85cfe582515697d2e21290200244c9b52a5da29c577c86125b9f1606bafcfaa979fbeedc6ab241f69c06e6482d5b98b09cc8e0ab604dd821c91285ea1cb67360ffd6fc2fddff88d4b35d4d82a0900a1cb79ee3605b0b2942b820cc4d53ed078ab8b7be304f26b1abbd96cc189fa959fe91da4c370c85c31a12ab12e567ea699f0343908ae6dc2fcada7ef9c03784a97a05a643d40c75247f60e31d20ae94c302825c45b936c242fd788845b56fc4eee66b45f0f89d5575e2426076062c22ae50d295245a00559ef740e4adeafa9ce8227071fe353492837f479d0c97b4aa2e8b5c13a3a3abddcbb518e6c125d2c4677a49ce8c9153898e215408d10c4583efcfcc542e7c50e88bd15492fa73234256f72bd391109677bb4982cd20ace26c1efdeb0e480b54d136b05289a0cae874afc02f000a1e3b37bab7b73d33feb4fc1485afc4dc5ffeccc285e8b61650112905e5924383711b55cde088d76db36c32d9af86ea5167b63cd745571d6b2c44a45b6fa0308bf7da0a0298463cbd34753f7a5f7f248ae8dc4fef72884c484e6801f6500f15eec74aa951a552bd9228a7a2f8703b915e01379df093891fa1e695af9685ffe65ce1c7344c9ec41a2ec2071589b757b9dbc8dc380bc9c9b295ed8a547a2fb12a7b4fa5e74f35322b3f00048fa7ef13623126f0b1b8b3ea0e9048950a8c0b258c0637ead0e48144b997c3d6c82b6e1f517bba1d65e042d7a694b48c269183fb6ff1bb898ebb7539d47c034a0bc85e08440300d3be2e5fbcec0e7579400b565c5b99963a58a40bfc6eebd44cf1c2bfbeaa6bc93981f47dc554e588e86edaca52244b1856b59716cbc363aaabadaf5c0167bec7c82482c679de08b196d4b841f2bb134024e1eb003277e89fe781fe217b0c7c6139d0009cc74b5e401c48e57dd525c03872465308280baf775031eb3694ce88d304dfe046144dc570da2b46449102eed727d508b02463557dc815d6b45396d852fc50778b0ae05c1fade4c6d4fdfcac9d3fe8d5f4f537dcefaeefdeac8c028dffcea39df69f3888451174ab1faf4b36770ce3209391abc135b2986db2131fef6f9354e314133d7978d52c07519057bcd809708e5dc94f3ff60ba35abffd804ed2517bb83f57edc8cb22457e66b4acb1138d814a4592736f8226feccf0769ea6e3722474f20ee5c961ad7eb3991fa2810da0ac785046fb418ec06dd64db753430527db42a6457a1e7a2d1d8ce996685a29c888691eaf8185eabedd62da5f15bd3817308f5265c2431693cf6911400bf226fac910ad141dc86882dfb73e56becddf52e8ab061d2f1749f0b913d8433014fa783e51b532dd0ed9f5c07e8fc25f07f39bdceb89e28e557c1fa70257ba74ba60aa125b610bcf89c5495833b5644995187b42432c175c9058ce04985a9cdb525aa1cb160a6bdc825cc60559a0cb21ede0dbc32d4fe3ad573b1a550d2892bb7aba8b31b031ee85399eabc6dff5f402eaf0fec0431e6aa32cf05aa09f3fca2082d2ad3efdd7e9cdef814f72eec597d5652200e3dc5ceef45b44ee0b3a933f3a2bc4600bc3db8e5e3ceee771b0d4c2eaeb378fb4e2f24cdf84d81a3b7f171b81c3a061fc5f2c04a334757152c460ba0d9f540d402ab69522fa741def45eba5182f52db013bf03eab4e2173610538b387d366a950f4b3de00c07c7ab08466973946554619e2097cec37e70ac0364cd9580721f76a8ce37f4e3ac3ee2c8ea976c610619ca8d5de8d669d43a912d6a7ffd2ad6ac42427b549b0616da8761c13d4ccf0f5a39d0a27ef0567b748606fa8767395f82f1bec5f6209a052ec65d3005a4b0962051a6d298964db91e34cfe0a2e12a20929de5cc78dd6a13201fb429964412301564b6ef972421a9c77d0b9979ce5942c9b31aa5ecd9b950965bbac3f69f573ec929c0a77be9f6923b440e9bc9b5562dad163cd227d0d5d7a5f968858455ba120ca11b1e2927ffd3faa0489b5404b6c08cb0907c3b2cd7f44c72cb11a2e1c0c82a4656261ae7d4eb58eaff7e6f04e7431dba6a1e173b12209aa6c1519966f302721b6c35f2e94185380eab501e9e1a47ce82c8029d8355590baee47b3503df77efbe54774ab409f5cad8706271e4ad80731894028f95548098e4812767ebc67a6ba907317880acf2c13c291a7db205dc95d070001f005f65e6575097a2554541562cd6a3c16384906d7aabd6895871c498352d06bbfe7e334686a3719a08ae8c7805682d2cb8dc8c5bee88889d30271708f8509600d67a973e451ef72ba744e3f60daafb425613e0f9f39be0407e8b90509de5b070fbc9c2f6bbf44b4fb1ace66c61b10f95616df1d8a9aa188880846792a6e6cd4f444bcd88b924a5c81daf006150c5093234a53b48deeb0cc6337ee1d85655c8274729603659cc02b06d3c83c36617aeee510dfc217c44f494a858f355785eaf673318925af7415087ae8ed47a6a9f4aa029fe1724e16e88f080063aa4d90cbd782c02dca20684081a09ecae37e8439c5217097653ad460d341f50156f95a6634f16b3a0edfcf27a3bf90e237b59b702388a893bffb6b9da047e594d527c3415e83a66548641bc8e601d4ef402c213b6b0964de63c40c1500d7c5330e061ea302f89718f5a55e893bdebe8b523209d83641cc42c0eab219b933e7a2df62f05c205a7811311142c922fb2f4ce762585c02e52dbb2b48e7a72fc36d9a6c7aa4776217524caf8ca92a8b1d7c77051d94bc3f95c0c5aac08cc47da0f4e9785300015404597d29042d288aa58c8722cb2123738d07a8ba6e40b488167bc0782492279ecc35c919eacd0cfe06acbc087b603210a0993f4a73665c90132a2022da83a7bc95abcd125e3d41480412064037cde76a4f02693fb303346511212d50f2f7ad17ed3853972bf8c5bc5c1742dfa02b80ab73c85ee36bf4e22f2bfc3e679c8743b418e9affa1685453d82e4272c3a36f7006673167d2743a05a7f92112f4aa869b8ac1a2e3af079d6d265aaad7dd00a2e4510455a2c6e68c8b3ec9c24181a3af680ab26631ed66e615ab225f8cc6516aaebebb872971c1380df8c1a5bfdb6b8347c5c3ba082ebf3016f2571e369c25a9deec50b11c3590fdeea14c5bd9dd65d7a84f754f3d5dcebb882e3155718780661211f3bbdfe6737e694e370ab06ef183541e6b79adf0cb3b30507ed1688c76f074b0d397f7364548ce32086cebab00d5b8dda55dd5016b29942e11a31480c6abc7c1bbafc8ce7835ec967fe8f1e1ad4ebe707d9467369f21d270e27a199d2a212ea49ecff20f9a116d1e3f77a9ee22a5b295aded0303ea42c47f0c5cd8d056ec39e08455584edf9bbf7002508c375b2d5d439293718fd572fb03df20fdef7fca3b3533e751b44c77efd7b79d4457b9d7d5ce315a9dc7953d63ff187605e6c90354d656a752617356e909b678741427bfd70216537aa81a3a62400896d1f6f703436c2d8571565ed9aa4cc90f21fa39632820cd7b141285536fa19711306ba716698f1de0866d7ed0f492058a788820ebfdbbcc196811905030f6812106503271d16a3a31b06df275c3ddbc87e4b8076383ff099c840769425dabead60ce36d83aeb7d06ba10811ef5897f3fe189f9dbf241971c07fa1ba9acc66b832c54774ac501ee2fe75c377f3a10bbcf3ece6e0ce28be1e26d7778ac248600031ff6b6e2d9ec8769503e0449c6568cdb13d1ac410efb2fa2ab1939e543d5ae418f394d1ab1b6f808f6402cd88338b9c34204719805fd20db4874f481965172ed2fb777d077f4105d7edd148b67aad8bb01d690f5ac2f0d77ee611350012d6555387759cbf159217eb176dc3ee80445fac3f35e2161bf19daa30db53df2833c94710ad8da564cc4fe9f246a088358e505111d732dd55b1a01db8ed4b4bb7c1dcc3bc5042bd137474dbc7497eeb50bfa7d0b18e46bc2bc0b18c769a59945eb0ab778f078599e67ac98b1a8f936143d29d71750c0a138025c887352abb9208b6637254dcd1c3d0d969e3cb26c274d6260aad8ad44fd0938ce4ebd8d0a12a4155cbbed7ee91d43e59238480276afc91b8ed4a1a82a7d2b36dc8ccd652171f1e75c513237daa79c7c23bd536cc35e51cb360d51073c72d7bc51f61c6b4cd0454466079509f909f3827bc7034d319abd4c3821535f235d2aa54bbb62bd21536726afde9fcc3cce555b750e025e443ff42eb2971862edabc233438f97bc9e2e054c253e0a72c5e8348130f46e5e46074e873e655f967d3f82f8664b915381c0ae3251d6b7973d1a0e98f0ced49016bfe43cb27c22bf242cd085a0eb9b4a0eabb737c5fe94d78900945ebd6124c584bfe0815f4344dca95bbe04550d3db491c9c76d1bc85f0048c2d52f07927d7a35a0c266f379c5d3151de0abf2b2536de6f7e3e625b327799bf664feec9331f23a62cca0758445aeb591facf24a4d18f88817605848fff54757d61359e50ab9851e622e83dc32cdffc8f02a567af46a48dc2c4781947430181c0250a4e65ac0d6ed2d0db05d115096ae5af8e6b7850d679c2761aee67a79878a6693c9b4c5960af25aa8b0aef5aa154981688f6526c9b6b76670ded7a32e34562f6a36bb196da77f219b9dcb85156cf57317623e168d9ab887ca38acb61bf6426a5817ebf81c063d497fe70a97083a7d1f8195cf9b9e64803cd742a7ff10c305cbf01273961009621fae903bbaa21ae84365f7887a012e57b94d25e717d80d9ceeac365975245a0ff36e095dd38a5c2a0c0c4a35b01544f264e6b9e0f0383c4f0bee233a0604b7a4c20a4c594682f983eee98847afc8552a8256e4f0cfc33950ca981a5be62dfa53d06dc8a1dcfe4417cfae05a6c5faaed0be0318f1734f9763fe4d11ccd682faec3dc2cc977066e663e7f28c85db917f0a654c13aa65fdb8d0b02301e72b1d77da5783779d3e0d2eb81c5dba9a561618e4a36684b83ec2ed031769108298de96dff6888e768f4408f389643675447b185e52feb135610081e5e77d9cf40243da117de365994f5faa1f91f2df7dff3c896ea4d820a2bc73d0d5450e882da14f6331e978a2e4eb8607e0af75238126eab7670db8a4ee1595f24eada33b812e72d6af5f54f4433784e6b698b1c60e4028181675d66841306503ac5e984572dbb1130b9e801ffa6eabd73b58361826cdd4606c5a5ed5ba78b0a8fc361bcc11d47f7c6a740cf3d22440970949d3143d6b43c2de20473053acc3b1f7a4b3d14cd9a7023595a9faeacd7a789b2ba3e2b93548080c3420f5ce61d25b2a272dec42a44b31c283ffbf54df14dc4b5915f280affbcda6a316eb2841242bfc58b5cf08a7a2098027cb26880f8990a90240a227a147aea834e835f8d33be087a089720dc279ecbb42e45f676886b8622a63c73ba77542f88570076d502970f91cedbcb6b4492e122aa72f100568bb45c6d6a55271f475d94d8b0f29abcc1027c66d5a3c56ccca32b2a4a3e01d240e6850cdfb079451100183fd1f6ff45b2d21e4094417750129d0fba125b545fd700a001e3f712c72d8a60e043ad1d813ea19cfebcf1001d51fbde352c0bb43e87d6cb05a12ea0c6599d0fd32f4e90246a49bfd2167ade7b93e948b1e901eb994cd3103bfe391c2f12f90d7b2c7e9b66a31817d6b91a7329a498528c8f9f96095ab5f9730d7faba79d51db37528df5e877d24ca05e731bcc7380a432cf8089df28193007fd6a25bc990a9a90f9e93d3218c28bf10b5e58333f05fe9ce2297335d62898c9457450d0cb9d106b596c7e00915c62a7c992b63097eaca5c800474f9d514a80736caf79c6ff3277d8256d93ae5e4df250fa19a4d0e95f082110006f1d647f5e7968f4a1fc1c2dee2e1b6a2c7e366732cc97ee440d8a72904d57a37229c4b1d071efe68e5517cd8ba766207a7e440622161cd1bd1a8692dfbe589779181f82e5de1bf18f40890a0896b14540adceb0aaa04e2d27bd21af60f5099d52c690e221fb4db1fb2ba4ead2a90729e244c1ae5ceda6805b85bf06f2f9edf486f0aa3afaf8899a4c9e2b098105fdef7ad02c3dc5a84a78b64fc01cf609a2668ed371be7d6fc80e43fb8895a745b6e4a82cf0cd002616d81a0c65613916aa3c61d471c413656413285d9990b885b051dfc85630a5d9f3c8bbe5cce873ddec3f7ddc80a9418ee43d0c5bebc6cb861cdafd061001dbdf6c0cba3dc9b25e19892ce887a66e1ac2610ec1c06f68c30cb9c081fdf3cd6f3ff5ee4b8893cecdc0d70a716e123de738b5505925752235f11797de5b7d1ddf35c2250be76913c73651cc87a6510c313ec5be214c9048e41ededb0ae6a6521ed9dfb5bb2377b6e859d2da96a412340b5f6fd07038482a46ba3a7048cf90a9b3fe1b761b9ac4f8e9440c762078ef79c0a4bde5a577a557e592655d6f6b87a90262c0c20532dd50613df27e186b05635bdf8d8164b33120f4d84f726fb02ec33a81354169a60ebf377c3b67a9350cab4a886d165672c8b55e45a2daeaf827fff09de393f0884f6746ac708b8f4290ba588859bb36c0b8d6b2aa6d8bd9462272a4d4454fd3d00b0eb07a8ddbc37441ac124f603a4d5e194818496d4dc363f6bd2c8422047abb54750b824432ca8db10de4ea4abcc3732c1f4de080ce21513020cd6e34eed2c71d895a80487cd2c239b0bf044acdac1792c785c458a3c56e8d8905082d5c84046aaa677c41c7b971ecadd6e9e08740de90f9e84da0f859966d99b8d7365e99e22553dd94d574b077904127157eb6b7ad31fc48e472d3ee588b1d64fb5b278e46f6fd1325f5820269fca5d53482ad8eddf90ebd3b0e0a9e8965aab7256db431835cef82188aadfe0bafdf7271f4b1f6b965226b228ac09667c770e28ab1112c4d821cb022963ee4380c3030369bc26aff51042845f630cbd3628d300f76d60893ef6a740e10288ac73e966d89a47b874e6787782732f6b193a7636c6eb54d41c6c26bbe0ce4893022fd51a8bd9fdd989a4037f944eee52ea9432bdd69d73a22218a536624e83075eb1bde137287f91ac0bd148c8613650d44ac345b9b0ece71e78a8a8f68b62cea5a8aa3cd4dce0469d34e884d1ae549e5a5b548488fb4160fb2d7422d92181b53d946f9f155aff94c2df9e8b9f22f2a5d9970cb422520be7886b5ee423206493d091d01fdbbcaabaf4238ee8637843f2bf6b2997906c79806d76d49b137b175c9a0e0f395725074e40c1315149f2c168bbfcf8c87c31843df2963fb2f4d9e7d22cff84466ee6fa494b8e026331213e97106709f9a6c1e22efb97fccfcc848a53b3121b90274edd85e26caf49e343b86a5e493c2e44169184049e475dae8601ccf3f46dcb817b4b352adfc7cb43595d825590bcc033483052785e9a6ea285312678509c60e6441ec403ffe2f845a560c00fbec9b990a45d9bbc5ab0c6a7d2b944c61deff734913bcf3259210830e7ab8a0e19d81fb82ce2e1f3f318daed7afcb69ddf8e7c5ff5d777f402baf33201ae857089e7d8e4f2bc578dbe71261fe789062452eeef1a2a720b7edb47d8f469de5d66b832bc760a8390268408f9994fbb3310fdc3b3d98f3db6eee8e60f32fb7bc6c0e4860ffff15a453e1c4e5540d648498f201da2bc32985c3756328c1819c03e9f721439c90a0e57aac80fe2e072a9792324411537d7bb10b02044179bda1d51c9b67e1b8ad128cac0b81ad2ca70353966c91919b6046744a8d8a4d0e8519bc0af51c0c9538cf9c9f226f8b2b92ceb94b7ddbc156f4e01e645a40f965b12659ecbcfa43015f07b954dd62cd3f84fb8505327c6d0fb9eb099fff396fb9a451ce92d220823d78f028bb2b28553ddffe09cd702d18e347681e8c73071ca1268bbccb2919ec9c873db5c54f1c264a70e3e724ad253aaa882f5160d8ebf7d250a3f6a9698a9981b338970c1425864a008280a78182f60d696e4ed88879f40c57e68534d6e463601db6c45a2e622373fc3e69a39d1767412425a934f032267b9890869e2ca8737e1f15674408494ebacbe261e3f765d8bd93228672a4e50b9ec845b88ed78f4e9658c1fdaa2160125f3990f3b73eae22e7c08a753ce68f4c3854bd47f02d3f74c9dd02676fdbb85151251fb1699e35facef54f76c472cfba3b05a98f6ae2ce7f42ecc89f210d4837bd99e3aa43ff4863695d79bf16346ab01d254f29feda8ae28c25910214bf957f739a6a48ab572be0bd1d9ee7622cc19e1a7e6c5e5e35d5c8637880e567f8f079f42c25221248bd5b8fd60f88eb574ae7ccbef39808e80c513d9a315bdc04aa149758afacebc5a1764419665b3e2f473293c6dbbac32f83736be7c2eb59e584b6786b10ad741df8a5dd9a2c77881eba5407d499c7dbee89ffcf4c66b6ecf0e86093c1ade0b526495f008b19dc49008705074e3209e688a4d7e79a56b34c4b14b2d578ecc6f58d7a1729b2a40b2a7ef97a753729086fdbaf1c04e297ee3259397feeb23cbb78a8f2cd2dfac515b167f2d3be8feee118d4ff5e0c19d635d72ba68ef7a5ee0b582e873f1f62adabf753de8b4ea70373f3723775072ad0f08ef3950753c2526133641e4c60af8544d0d4bf6f3d62134de49bf247232888f37615b23404805d7c5ae13cf22aa0213bbc59cf98d46d0729eae21b97c23546295dbec6dc0e5e0665f6323a5a1ce6060441e04558225896131980c4a9a8b9d3318780f58cde00c133c8d60848e595ce8fd0462c9dd7e1e7c414d010b4875ce31faa1b082137d18b08a5134fcbaafda8a0dc2164f120f77e8c6f6a1ea60ae145c769588e88ca79ed0640424b7533f24c361cfa5f02c1814ce00c95716f9761e0c74a65935b9cac26408899cab49061c660eb232c76f24616e1832c30758b96b736429c8a24ec76d41830f2933c27b8a690d7be5e6af452728b8114d01ed7c966ed3e30dc14a342311be297abfa6c7ee5ab6635708c2d615619c34771dbd635886d4f606756d9c0e901dceb00e0b5b51df1298fda1373ffd1ddabec7d1a3a1e00809b0aa3d822b85253bbea916005847e51b1ebcd2af9bdac5f71f6fdd3f44d318932ab373c72c10faa5294d20d245a1a93699e60eafe3e60aca4397c49cd2857866432b169294b7ad5d3399fe93cfa8cea2197de48952ded25781226647b4286c5fc7086259feba94d7e0680cc1d02d379c7eafe385ac3868f4b32116299c48a707c2c33576d4e866ea99bd954191fc2e9f29649b9c3cba600d3d2848c1919429d5c7ba749056359f4cbfd5917ad54cf5111fa8fcfe92771a67d5a7d246d65e30610fe2511056aa0939ba21f0fbf1d97245b7ebb5b718c9546bc4b8b7e459672933a3277512f6a2289f4a1c6de82ce97a9c6f0f484d282f53facaf0fb9e3652006483c726e95f914602803ee2a165e74ff051b755afb09e6004975f63d972c96a1976bc7a275cd11b611c34facae3272b3ee8fdc98b891cf6431db1443299ba27e1955b83afdb7ed0f69a3f87139c3596c1f5f9f85c4b14c63c9f02dfe4c9e1dec2a275d61eb35115eaacef44155caae9204bb7c57be5bdd7f0c231c6dc6c8dc6dc2cad99e705ebaa5a28efa7619923e762011f2eebab7744dd16914a80eba33f7d60463ab7077a36eb1d6519b74c90479dca41d3a40f1a6318248972b3735e36df664ba790b5f8e0504a8c8a8fd29c98217e587d75ce4e2fc8b0220c41fd1cdb6e1d773433796c904f3b53ba82a04458691b13f0aab13ca09fc714ecf82408799009932ecba34d828c08c5e609d306f69cba6446bf41b8d4d9915e93c65e5cbb4314f54d6fcc1ef1453e1979f66810af580c2dc9d0906a8eaf032544f8690f9ccb13c643f519d0a369204f9605600a300958e5a9439a868524902d94236d465704f9e9ffcda1c9363dc4e397742be4846258d0e40ac4d331908716fe8468b3b9d8b794bd351f1a3f42c740e5166660d03f50a9acfac4c4d13f14442fa9887dcfda7573dc5e3f61e11759cb4c3a886e356389567e76bdaee05ff62e4e4401faa72741c1f962c9cc6757b6f30e9d62798144acce5ddb894a9256d6d088845dc71447a28393b1910f6054478e742f91fe7ee31d9919560baf95929906cb3b484a7acacac96f36c9e82b1e14e8f6e5c36ca9d0018bb2b5f4fb5978d7db0a934ebaf65a2a6cfbe5107eb5c946c913511ffa33c2b73a1041dbe6675d0f2477acef1d2043d76b4483a7abbe1665ab57a9dea95ac0437e94933c95fb4038258d5dc5b9fab8c84b5517034b9b5fc4f6be1d8703e562c4061cb9b091aca9ade8a7a4d3e082a1d6e9f2a44acc613733f88231648e47a74d1b4bf5f3f7032d417dbc07e8ddc3a4b6e594011e561abbfb4040681050fd4ded40159463c265b7898753902af7918c55445cfa2c400a092a2126065c3f358748e5d414d2ef0ba823cea8475ad9d707aeaa315e6d7c49c9a156a745a4d0e53e141154fcf23a121c3ca30b3375069c742af5504f11c1910f9fecd8523c9d0e4f6c4d4c2abe6b335e8bf3e7a26e0e2e1aeae1379e0fa9330bdb9bad19346b63dc92f919ec06cd5546ef3185fa6c52c87dd3e7680d90a4d072abcf67ebae374a983d1b64aee8dcfd80040a05646a58d42a9f47dbf09799bb8f68a1bc39e43537c5cd530eccab534ef5c8c003affbd8c9cb71909289e145ecf4fcafe430cf96d4c9c849b8893b7cd189dc1f4a07d760a1e92e0826327285e5ce8e1232bded13d0352a9450904464a0dacaac41e601f9d9bc60341e2b82768f093a90889e03270040974c99178453005513699214c32acbd76357f0d5d8533781f8a3454088b5319f84e32965fefcde53d03d76af855db752791908b8efcdc7fb7434a476089dc67009fb80b4baa221e9e019cfae9fb2837eca17df90b84b0b4a41c8d27c031f6137897769ba96e50852834a580442b5793737720b95ba456fd2c406ddc19a8ec1b78c2da0ae24729000d040324aa4d25b0e0c2152e949630d875f82b9259343309123dc9651c43b23989b42be51ef849aef027c5f19444fce3686c118d054ac9feee27d50d1138ba962870c28c2ac120d3fed3aa609ac4d78ac18d065c97b384b29274f829530016a9f22d7e9357d3a05c3576f964c2bc8c1651c2b55822d7a2e752aa599197c41ed7fed9f88dac17960592a6f2015fcf3330d89a7f918b8a4c033b712d451e4b33c3a5cd40fd859fb647004fcb8a089a401403928d045794af7438768dd7b0eb2098d3560040a08d0b96b7960e3077484c238d490ae2823a28346f9a9cea77903b2c49bf92fa691d40ed068b44aa943df50fb27928333ce167a4e6374fb4a435012f94b5eb7294a2f0dd2d89213030630342c292149e3c829f4f7d37fe8bfde385f28893622df94162372b1c647c00aa7ce1f1099df07d0206fa831c85251fc6cbba7bcbd6a7a2d4423ae0154a4d5c57c37d03f75754b3f3a881376be7adab234cde36f4801d7c6b562457cc73df5ee550d94b95bfe4d4453d3c76af39a71f67c1c8e5205696825d033d5844f65f98926f52cd46577514167a8af4f8e9ba3a86e36a0669381709fec49c5ac7eabd4fac1c9ac1ec3cbb18dfbfa5f260c5b1d094e000e2268f01690d176898e5b632e2db53d160ca7009874933a0b9c767e901160e05a04a070c565a87223b00b197ec190f9e19c1fc4ecd60a3f1b215845ba5f9883e248316bb3b9831ae9ca75bd50526306e8b897777b866d4028a72e535ec9dfc838dca5f5666ee0bca9bdca0b93faf35d48b201821c81a48bff45f87b1388d106813d9b48160630eecad67c7dd2698428b0761f4d420e01ed6a265d593cb455031e566713863f04f02585155a51f095dc23575f44bc4a05be0d625952c68225a337225103ae482ea591142a02608a8368546a3b1c525d44f8f94e2fb62b07dac711225782fa409c41205bc6573e95fb03f6fe14e0f48c402d7254ae5fb3f0de0640325e57f1b20a9def0e7dda000ba7ab72e9ebb8e86d1780426357356dfcd124a1dbc9ede2d3d7bbd7097dfc85c521519da2439dff161283c60f5a81f721ec4f0424b2bf9a08896d632b07b8ed5bd19a0b12639239f42aa8970daf5a2e0dbcf179c8d1d5775ce44cb79f9b2fa88057dd68baeaca8f43734d29ebb0ce43a42b0f72de25da7cf11a5f445365c4341fbdbd284654665d8ac6f7902957056d12141ece19e11672241488aff930b7326052a28c85f88667af6b62ee39d3b13305512b0b9730f013e868b2833e8a64a32ae7a5208cad79ffdafbaad28af08b83ffd3285c355cf99cff20f7db8bc6578ff0f89f88230ea62070fc39b1c462859b90578d47be6a2ebd1a8bc9f866aee1885e12867c8367fc54c0b35996a069ebc77d2321288962a1d81f81dc5f224e9bc076f2f6456446b264d7a9a3f6f7988ca98f8923c08f5f27f88f2c6581f4e892c43c0ce33869ce761aaf4336ff235c6552eb59632b9829dd538c9d52e2df49cdb944be84bfbea6db7bda7005922584664f48d1a5395037c28fa935720a491d92da105989ce518ce82e2e7c3ec22ce5b96487979edc34a0590a700ddbc83eec38d6656816bde799e56a3817d775b4e750bec0b3841c8dbb6c6954868560310ca1120763376ad55dd93428467dff5347d76eae4959738993860bc2244f032bdcd821632ac0bf8325a300e2b3276b4e0d4885ea0d781e15080f724e56af0ee8386a7a3e500d0050f3976dc66bfdaee01f6fdf2e1d01ebdeefc9f9801efd44b9d104ec809edc879d3b04da9916720faa307735b1e01eddab2d039018fc82b74316f13bdaf2037b8647eb4b5c80a1a7456cd011c5f0b6580e23eab18cb3b321f56745c034d2a881a7dac3007c5024f462128e0332e216e9bc247dc45ea3573906f6ce9cc2de4c124f92afa256cf9af80ccb8316ae167cb803602091081c6e1e0fbac79d586532cb27b4ab23ba8195bcbd9fba8087549b4417e3fe936130b32669b9f76cdc8852d1d50e041c45ff7f00baefcccfc6243806b2010f895eba30e0126cd89fcab948b92501370e107efd71fae53e7a4025db08060f184d06555759008399a8474b014d373b45840436beb7a6a780e551acf5c55b0ee4292b1a72d46bde0a01ec9fc8e194a936b5871244b54debc114b6b99286d33c2a75947227997196a5717538f1b704a240faa6628d005cbacf186c86f81db4ff4e84cc2b8c102a523ce2f4da23ab643155e947d4c5c70ac5cac69908f014f495b5e825d4ad579b25dc77922bf30d7f6d1124649ecc9081f1b9a991ee8a41b520595da9067266772fb71fd26985a29df2aeb2c9fbf61b0c194117b1295fb35c6e0e8719e6ee29620e4444eb1c5cbcfea20b1d9c8fb7957eb76d1b3310a2f9f3e58fdb5f13b6ab9f264312d6eb043daa78416db7505c910e468e717ce633f22e9d3d6a2d90b92e9462030e003d5192ebd91a304303b1c34b7c446067184120ffdf19a0ecf47696c70c1e2326b1004686a7cd934016fa618e42c29ee78b5ea0b9692045188a88889e3c84a09b2bbcfc309c7649b9bf84de0c4e5dd0aff0e6fb1ec4eaa40f20458223f69edef41d39181306a052962405dc0823b28665fdd1959373ebc80eab75e4930298909c15ba93769f34cab71258b6a51d605373f20198ca5694d4ea6f60c8ba81dc957c770614ac422985a51bf0fa548442194554425d14494fd4bfe7e2195b173804ba5af35ca6c39aa4a88d0ba8b2dd71b8e45997b360846e2f7a60c8e709a0aa3cb3c40395786212126a7842eb373702f457e8d146c420e04609ba418e13a092af573154de66a85503e3e73e7d139191ae1dec52257f8b5875a77ef93ffa5c6a5d381873fa02f908b865fb20c19c93493e1072ae6143fa0694b2433747020a7cbf79dc4352c07202ecad1fbe46cfc9b6058933904762469aa2e3b332640de2e3ef9c93e3e5e7ad3f80b7800d2c689e90c7e474dacb195165e0971bc61d2a6abac0abff1c5aefcd30f1db66cdd0f9c7ebf3b7c2279df7ec1ff0bfe2f9db5b976e80b1c7402cdf141f38fecd0d82380be6b35cd72447b142558c249b694591c8ce125d0cb11def9983e01d6231aaec47d8e0e689c655ec0311dc97c0d137307f2104f20d7a9a737a1914cd01b53cc2d204aed63ca56d298c0314dc211bdf55f26ce726c469c89cd2ca4c41447a9aaca43e0c8ce519cf4568306f6d898d93d0e8ebf185f43da0fc5c6610a222976e3125930f6bc63954a047e97fb667059ebb3e6c673930e817b0801139f5a32132d448495c8f4843255908f4720c2bbbf9d9754ef7120043af13176ee751dcbe15a97e095bcec9ae786fde03771d80162196c9cbb6b22897d9f7c93c3f9745db26a91afb92d79a973f88da898bd8cbddac11175267393f13fabd706e72a67e0c10190263210b0fcb2402d8e81f6a22d147eb9577048e5aeee60f40f0c5b02c81e61c92fc7e09dc2ed1f5ec13db316984bdb718d7289bb03e53819237f08ec8cc3e5999b9573647b9f580310c2621fc8cbd93dea3a9790dd215c191da2c9cf5a7231f2ea64ef5978f43ac9b7a7a574da85ab4fb4d595bdc80ef9d0297e6768cb522f3014976e275cb55cd25d78c1567c84063e40adba2184abc7f83bd60eb617a356781fd7b1c0b27e331e6fd8205ce50bbd025a7b36554adc8f63237811dd48c29d8bf25c9097cbe111715986c8c86c9a7222714d5ab5b3ea9bad9eccab4eab59e5f86e42ad924f6460a41bb80bbf531c18d950af57a755859ce47cb2ad1540998cef3a4f26b004b3bfdeb2612c99161c976ccc87523f222e22e03707f1db9fa4bced9bc2a24c793e3e70c34baa70af9afe231002b0a1b3e05e45b04d661b963c4a1fdc06bb9ef9e2dcdf46198604968148452c1bc73de45cdcb50e3a0608066d9cbfb02d368724c6cfd795fd80d17039c987ec113d4c3ec362681ea8af37a53de66ae5f1df0ef0cde5e0a16aa1683debcd3349a8f7833476f492863379630ab9b84b8b4d8fe358d23a16383fb9b286ee69aed1bc8530d909524bddb53122a7a859b11aa893cc86017ac6b0ea8f4cdea2a11a04ec8e4cad906a5f54f26b9bcca147cd6f6395fa19775dc76cb73f468744743255e31a56f21be6ee3c37c13961960b0aae18a9ba39bb7fb92e3d768ef0c3afc163084f261631e5b90a957ce2562c69c43feb872f894664185c004397569a7b02c229249c33737043fe67f9f4bd6c2380c4a54e6d02308d0d415fe2f10e853e10031d63bd98a1247a8de391c429a9665c5567a1ed965c2c83820af675cb6a8b537347e2a3f2f566ff65f986fc2ad5783f92c79d55975882eab53d301f199c587d7cfbcb951d4e47c90b98c7be7dcebc0a67f2ec611b613e50b7be60c3f4c59066ed90cb107a026d413fa0185b45e81dd1fac1b76f37c4fd7f259db319227b884671a3730171f6aec09abf9023dc079df8307f21b946cf67fccea42a2f3b9f38a4c7f97efc580a840852e5b5e5d2db103307926977ded02f62faf3cc31265a91217a68b50d5dee01d8e7146ac9bde209b483a482a163dd9d240331cd65a2d49e28d2f2bf74f9841c57e35014164364f049fe219bfad5267ccd03f383cfd960c40aeae5ec60e23e50118c25a08ec9d33a0dab176d126622c2d572e65f6ecd90ec84e350cbe5153c940d9c11113f7309d32a14b8652b91a734225dde40dec091a828584f60d191e7214b28bb446e535286c1b0df441f9438b0d82884b5d19063ca020b8f52780bb9de65c8882d62fbd0267533d684607f81202693d7f5ab2a21d308f031978c5f4e45aa4f29904d8f9e7f381a8bff90e0439f6d86fd0dc4f786cdefdc9b48676626eceb15f7c2770cc4aad5941ae81509c7d2a850b4f613a2062782ead4478362e370f8734ae8bd6feb019375b8ac2e62bfd55801de49912387ef5631f4fd717f711041814d720a93411f5eb630bc2af02175f80d957b22fd67c666527d898cf0bc13c2292a592ed375df2aa9b1c79ac2a586230f2a53ecb46b751a28de0b86ae0caf646f4c5bb6ebb712774cd26361d62e80dee904d82f8198a721cc8172f8db2c51195db34f4cac41c9421e5acc51fcc080579fa6659c79dae7dc63344b309e3096118a4c38076ab17d438216b6034e78e7ebe3ec305d50445e9d965b3730910f68544179b097004d92141b555ae1732a97a2bdaf4ec39e9225fbc2c7d23d6de71413ff9b8d8b525c08f6a4efea45ef69da2abf03da97078055377f8f28713077d673724cfea576778618743abc704928b27766720bfab1b80b372e518b4ab3504f5c75eb493e9756586cfef0c99cb238d3177454a382a30d101e61c43076306fe7a8379cef9208a1a3486c6ca5d5b42cdd2414c91fc88e0153d8625838bb36c722132ffd07836d69ad15a3e40ee05349393d80318323839f5eb4ebab8ca0c06e909e03d0f91eb79ab1a006583311cdde152a6d3a95840254d0a5e3bd1f97c792ed3b77be8e59e39d4e429c2b4f3be02dc432278a37de2e7790589e49191e1750767525d0b9fc51020636afeeeffa0ee1164d89e35adae115dbbc6a99fa23cac143804a381afa4dcda69f3e96bda101ab3401b14b9c9bc37dda6d904009e07d7267164e4df10453f720339a7b9642f6f3970bcf1bedf7fb7592b3629770509a4b263d4f7edd754dd248dd0671222dc58aee125781acfabdc88a61bf91bb109f096ddc773f43c81638f06e8563a02d3dd7e03baaca2d83f6b1de43049968498d1a1a29d6334049a33ad3f432b1efca4e331a12c05121fb77384b0cb3f685d3459efa155be45d218cefc6396e9e1b0892b92c81905801ffe6c32ead6955b8d016ac930e77c1e864d9ee6cdca0650763c20611ad2a13b55bda9b25a54d3741fdaec9fd6ca3c7148ee83039fc6d41e177acbe1d5bc3fd1144751ddfb7f6ec97b435eca9d434dc80371c00484b142a2f909903a0640355aff915ec4182372a506610167ad865267723c6455d5e7ab7cb1726153a6f4f70191c6a0c158eaed20e1dea95594f111b8289989a373c93db916063d5ee16fe1b97e3067b6a27460614311853af11beea4653c71c87b23afd591411325331a47c24cfd3612b568bb0c168c65d1d2a9fcc059cf9556e5f0f059f55801f19e6ec0da111d855109a7e75d18ffb75a2c92578245f1a7403b7c9989c7407903e7b2ce94e42f2344cc0ffa628a2912fd1f1d1de082457af3a886a658b7a870632c53795156acf93697a9448f2e56ac85aa844a2c142d62a1351dde29f17f8c0a3faf872330eddd08a782cfc7c2f0317eefb4e2b89bab6d4c483bb3f7ee659119ab99bca915e56d0c51ac4a531c30a33972fa25984c702014d23aa70d1d7d08e9458b053620d5134eebe945ae671ab9e5d2d6630c398445678dba7a28495d6d2652ff0ff2018d1a420e0fc966046b962bf20b013a106c05da7a224854ea2bb5e0c6591b4a4477cb239abd5c774f2e7c7f7514b42abe452ac177e75b839012e10e9c68bbe5f0d3304f71ce5e3eca671805015c739c9952fe250307e173b560e32d9be2cb5a82dc09de9a2c05a172f5ea58316446505ecef6dcc3fb22d2f08e6f110ce2b42ab9ab959b1e0af929b185915a14fd8e9d1bb50f8ea195d0174ded7e371e17be36b0398180c2536a5c29b65b555927ba67a647a0a8d2dc53a371775664c481b63b09fb8abe5f238eaf10e3c5eb178366226f5db25d10b9643acbb84fac0fdae92521d5c1e8cbf2cebc6b18742f64cef41ab0d5d34b0b7e1b34b6098a974e7562c84fa53aa30a5d751d1ab6791f7cba7bbc3869301c86593347ccaa63c35fe78e64f2584cf050a9602aa8333590c554827b35458aa2974857d3b292f5ce784b698057893409adbab34880fe565c9e0d7f9f06407dd31c590bb6109bc5ea605096727e5a2aa742b716dd63681a91d2176e4be7213b5b9dccc284786874f9a2e9d9d6bc6a668efb8be5dc3d709a6a033d476ae7ab1073edb651ecbd2912de0d1e637579caf303a4f290670be2d04505a46286bd83f6386f31c7372548c00ddb8b0ce8426055e9a5b6cda80f6c53af6466b020371f8cc9fc7ac0f17e90c2c16f24defa05d8e7777e066cd6e6de953b619e09ac01f2fc82c60d1c408d81ae8eb63875e17267ecfbd0e28175b4b313ecda8bd7657d0e8279704f39a50eba2d7cdbd3894e808da42266cdc4bb07fc2ae865b29218c77401fb3a0a6742184dedef5e4ddd9b10f8e8fa4f02656c94ba21c45041d553638f8e7a5fbd57038d3b5dcf2940a88926f5ff230b9770f0d6cda6e1181f474dd041dcde0fc724cab7315206e659b66e5c6b4b157b03b22570461962a1487d69baf2605c9492777b9ea3a9a2cd482314b4d2550a9b9900e8bd4f0989133d332439629ae50ec685e28ca779928e916505cafc5cbcff792b1f6964e9a037f8a04f9864c39299bcdd6029d52f22de8b0df77e4e6bfe6c706b77877f9b1300009d4ca00f42b10c288141f1bb01d34e68d50d27a40548c26b3d880d41a34d0092e2c77dc8e81307f536fbb8f090128ceced9af560aa111d701a90569c464261ff6b5646ace50dd080b03989ed99efa0ddd908dc9988b9b9065c36b9431bda05f93234983b89a1eac2e40b2341dea75e5721a24ce830dbdea9e471bf70399079fdcc5121d1a5baa5eb04ab74b43cab3ea32dfc0791797477fc8c17d3ad7cd113d29cc947d58ee00dffeeab8bc143f8fe46e4da4b579b92038ac36b40c23d463ad665e004cc8ebabec0fa41b2ed988090b82363bfa4f91205b885d26d035792a065cff1b206f563a1be09d12e90f369f7b7b8558cfba590a812948b6c4d941eddabf775b98e20e4c9f1d44e0ce5d1645a030b4da85102860c886c2f68d7e8ea819befd6996d0c4e363928bd4b6e6756ebfcb8839ed621e485e8b191e372b97a136808cf2fca45ea2a13e2960d57f78c2a41e84aeda15a4540980e27669a458b60106dd79437222fb770a241f33035a87790a7101ccbca1bf8d02cfb74509195fe3d1284004b69d4e77ebc97090a5570b3af65091e30a2f8467fce7612dc7b520e15329a79329a61828fb608bfbea248a2cd34db13178df59220801c86584d2d354a941a38d39f7819f637bc7b94bae826ac0c6f1b1c0d97cc1b4d1d544c9f21abc1966b6b9da051624b320279b81c4149e2a504813441e74cc48b69a295c0ea21949efdc64dae6bc6e41ff53c023185ff786f577c4c95b48bd9eea62a94704873961c6e5525bb7f78ddf220192ebc23716869bb2a6be77d6cdbcf188f334fdc87b464ba1fde95df338109b6066c43f4f6fdb4bcce38975e13066c226d12222a581e1572beded462ad209f778292207bf20e3ace5ca2e5089fc3cfdac0692fad289422cc783b9321c4baac0843ef97af3a68ad192795e4de995e17e54c03c276b67675612ab76da6007796c7c96e66920893cc0d26c32dc2ef9508c8d77932184269fa8eac46a7d6a85c6c4f03fa079f89cb9ca474e14b9e92dd27e9e48da5d0af79f19cad29fce026656c1e79a27fc349b8080cb56bea3393436882234ff4142fdec0c67233ac1087a2b9b4c71abfa4539c2ec90eed5cfcf227a65f9cc9bc4b9e35b19bb03e8f00c9eebab4364cc741163cd7f08c04696438d2422f23b1d5d7050dd90de95812e2cce961b3e40af101fce6751c5c934a425ed63769b11a7216b1884b1aee9e2a3d895bc26e2a4d00a808b4608f67907817ae0c2f1b1a638c40b060028e039381c4597d632fbdd2d5f9aa9b162a2eedaad26a82e95bfd0739ca98911b88a98b4d5a35fdac0e1af7b1ee263568fc24f8be6fe48db5df16c3e0ce49454dced0c05aa7fdf0fcd039de1a5ac67abd2a80701dac334a6efdb9693cee0754cccc7111bc30ae6220e23d3da49a7e3865c2ecb38e4938ffb7f497eebbff9eea838a11e57e44fc8fabd441e85e62c4bf8f49ef53332153450b28a08b9a9b7fb9003e39243e60cb1f0c9b68787fd655a88a2ad71c1140f7c0ceb4294a901680802548c553887536a7abd95239efee0b887c4fa7ff96a69e6e806fa9fe6e0fec89e98d93becba053f5c5b576e1e31e2a5e0a61d5b8af6b3c1d3a24a9dea6eb354049e9949bb5030dafd25a40abcfefd4bbaa51fdde97bc9282eaba7612b2ab575870e33d2c6513cb834534736b5f575b08ffb8390365819b53e05b49253d5ee9067f238d63b19941f0a1c34ceee508c73ad25ea1b8d9bf5cacca430ca75b666a89de57c70914b50d965e6f29d15a513540d9cea51b87cdc6a1972493fa055294602f22a6b2bae6a399c34113156b965937894a47942f848d1a9050ded0fe613ac0831e728b2f7bdf8de7e5a4b221488c8378bcf1a238903e15f2861976bf16ad6fbb81901ff2a43e6d9def62686226de9bd7f4240eeb66a88e1702f8309aa23f25300e8362ae100eb77a9c71699cc8fbb0b22d02c58b19a7d90cf250d80ed69c4e4e73ae4bdd2b6c731f639cb9745c937833677ba6a4e6b1f8913c4bfbed36d326cd4d5aab70fa1dfbdf766e089913ef53a6a93c8254db846dce6f86e0f086b2597d7b12a9c10219995507d7f8840a45c81cb094a68781895042728ce2c27ccafb7259e47d7d634ca24dcd983a2bc62bd3c1224ab843d6d84bdd2717bc84159f265f7838adf67e02ae5eac688ff27c8fb92453de72fc41829b6d1db7d314a17388c4bbebb0fda45d22636d286b73c08f5329aa12ee61006e997387f7d7e733beb91d7a7d633810e9c280526c5cd0da2bcb7970a74f8567af2aa80bf207203b42e69e09a566f4d96f2622f1a4d2bc5aec4b7fc232c49ff62c454a8742b222cb7ee4fe9f04478fab02f2702e5fc9e25596a53da0cc0e94767ffa79196980c48b7f313c554464d44f1fd4723f147b9743e5659ca8167cf0c66520d25d17365eb71ade5b8814a1c9141e826ec09a88d7309d2a78d7f0e9bda81f030cafb7a4296eee447e042762f808b3a868eb34f76f3aaf89c24cc49ec71d8daf4bfacbd52fff1680f64f43a1bb375cc3ea6bc4f0c0fa1d223e7cecad28d6dc1852e63137aa6239a37eba3c02028d04613762721a0c2415ef9f40b91c182481d9b47c760d679eec3e787c0e32014abe3356cbd464c90d1686a9166091069276fce0d8054201ede1f12ffb02fdbc7b93dffb2102b7f786a11df209241413e47450db0eec0a5ff0b418c3f1dc0bb42677ed2d31b912ff1129e11f30f1bc200f3cc3a30b11b4c8261e87df36ca373b048bd3afe3c09d73cc2c8e3805bffe72c061b1058dea82489afa58b8eb4e049490e62c30d44fbc2df085e50867842eaaedf5f35ab98616f8869f9b93f63f82bbe84da68eb65aa8e09221fa9b0f04f0ce8ded2f4a383f498eabdec58c957efc270166c4380e97fd4afa605fcf8d29101077b4c0b362cb0d8a49634f05e59513fde24f60df43b65afb7f7c2ad74614fa6cc367f655bb4abcc6408bb54cbab2068ff05ca174ea795320ed444c78335a818ec037fb662983e77c78f6434864ff7562e7c0b30c9153f498399e5fe3d4a3ed1f406befecfc4ce6b5c44bfc786a9672857e164ceae37ab0791faad48dfbf87174a01037e6fe2dc1b3185d4ef4456b9d4c151a0338cee92130391a31b4e65ebc5cc870440f30b52523ac5093704fe2d5ab393eec32654812d73b408852bd822e18aa9ff8721f6a36e1c6587a648281c72116f439f3fb4b04dadc1a46011ab18af6651dbad186653f284e3db70ef24673370f832fc141f2dc0c3800f296385a5491702a653c58bad0a07bed8c8cfa28021a4f73dff0e078895623c5a9fe63be990b5a73b02bc07bb65b5b104821e8c12f07b760281e77b10cc88369fc0fef549755b708c9270532b2008e284e2a48553c67951a81e8e6e9474537044508371728ba1952fc128986320f7f9eff905d30438b4019816762f410c829274f735cedce31514a91af3a3338e941d983d302343b0ac5e783b09140890d01e9a7cdb2ac7278216439ae543f3adda6f35f50b33be6cdb7688340c175aab5916cdd24413f9a06152d601af0ab25bae78f47528c5f13b7a052e4c5eda18855eb34b1bc40d6f07693d2d24286ab01f568c92a28ebb1cd195f7ecc97e904de4f2b5a7b4e69e88c5c152ff53cc0f51f8b13f7c6291d5ca163ef971d0dd43eeb2cf2702ea93b65d3ebc23831933a2c6ccc0fb5e765f25a13f7c11df4f47df9025d6e99b52c1338090a43862eba7e9421d3e2ef6cf1738d8315e87360463a19cdd665078a627c1d65e11b3034f60acd6f257f2be8573fae510d6c5fcc0810cd0e2f7ad086bedfe117b11aa5f8a11a63755e18b95f94399deb997c13b655347ec46435153dd1d7b62a8f83a8ae994709f4375565b122d69533d1913ecdab496c446c55305aa47f4b551a2b225f218f4af4655a45e347445606a366fa58abb07888ebaa79d4409fd62a3c1e445e8da19d22fd5baad35811fb2a6974a2241699fc29a12b80ba3e5732cdf3f511f9dc63fa810aca5a633257b6c8c56642856de2b35d1e93bc52e7a3a25a55f07e5bf4fb7a2dc3e9d02b0d7c5e56539ddecc622e16b018d84807d496ddb5a7b11691973a661848f49f02e0930791a2154e2f95d1419ec60b123fa396cead0efac24eab577924c94d90c5ad345b19171e78207cda6be90e9d605a9696c2b4500cb0b1e7b587d937cb14499b7b05a9cc4d0d329d6b5dc3697e9d25569f4deb965b8e4f087043cc661aae312eb3df2c0089d1635fc93a0770e4f4b124ec3a5191ca895d6a2615be6c3e4a6673e20929d7c61327195b67b1ad5e0ff6f6133dc88b43d2a4221e90faf95592eed0b1d4ccc21bd3efea208c8ba5b2dbca1f44a5409f68871862614cd38c8220fec90c3522488062a866348da9215649c240eb9abae3c8dcaf8a26d64b773a59291b3e25058830d4fe5736a513f3c47ae7ff645b7cf75442431a59db092d58794fa18800e9f045457b219a40192483ef81e1fb40e7e3a17cc31926e5dfacaf997887ad1918fe31836d4820ce353ff80200801c37c075911c1194a9af06e0971ea900c6427e15b10802217a156fbfee746bb2123c012a4b73310f14e74ff2ae30b9a059a9ff33d9bfa9dabaef6b6e2d14dd85704ee8863116726ce2ea7e6e515b5908166567688095f41a5b49f10b93b5b6f549cd1804f53e4e0f0ae8efc47af6c20353ab463aedf76279b8b61269162a028738ec850bd00a2b0ce770dda3a7326b9d99c2c2845ee51bcab4b6a0011de3708761d3a3426bec0cb50fc6c0533b7202a3cc51c0e5b47bc814422ab8e6426d895077068d76ff6663a02cde8011deee1e819e6a8950efe1329ffdeeac8b6113d233c62d7bf2234434ab7f1b7e07ea900b6e9700033f6d0170232371fe4af17bf0b9afd38b9480728bb4ce17d75628f4af287ffaf676223abd3484abebcc1687d1ed85dd2746570ac8e757aa7ef409c4b9ba3916e35c1d0034b6b8ae7f1295a938265e78ebdc944e19c3c7010c2e520e9876793d72d614d0cf0ea21c2f0e657f48e09734421bec10532ac612c7f3e14cf12cbdcfc28b2fa4d8abdc1354915fa7107e3f2e5c5ff3bf2ca52717b4f9651331f7ff24adc6e243900ee466818f69e68f15b553f6fdde56808a95567f16cbff7972193497649f05dda21a77c36484fa48a63c56a699eade880ea73ceb077ef1208be3b741da3caaa80069d321a966b6bce0e4c1002cd5bf30a51bd57ac2a0a1b2e1e0fce6270771d0fb582f199753aa488fbde18c4d9fee2507a9470ff8bfee40fb288426330aed59fda6147ed0ca5cfcec0ff018cc48f02cf7c45c72780b4dbbbc81bcbd0716a2a68f8c917de80f6e078a1cffe76ffff48c81cddae923785846c6241af2deccd3600f4d361c8e41f78733604cc1c3a391011f281232608bb81b334ccd16df96081680a6561602b5fd086496655b36302b9026c7d764813f20a8435b4b1e66feab41871bbd130ddeb593a1d03f3555e75a51bcaf4be8109bd094c077c8b620cb45d84e4a0f526dcf504dc4378dcb80f0228565d1b4d4ae0b04e15bcc38970b3a6a9cfd216be947a8ed9ecd8cad9df3519a1748145314a36b6381005d34f0cceeaa36a242c5aa2983f10d80cf821f09f2eec0608b9a6c12078ad56b0ab52c18e07e030b41fb36310cc28df32903d404d3002506e39fe019613fcea516a6b19944435482aeee4ac9def3a71cea41cc511a603f816b0bd981e7ec7c9667a088d86d5312702f326dac7011810288317db862f5eea82ed1d8e68da61a0f99530cc81cb348a5ba286426346ccc261ecb9f03d58c520a8dbd8978ab08007ecb51da85799717b2100f89cdb5d7cc1b98b26431e815b46104eaa6c3b356309ad9a4394949086b64a91b2758d702bf83b1bfec7ae9c0d7284e22bdb71205fa4c06ee8da9e0db1c027b217c8110f8f9fdeedc89ab0b322f7e68973bec5d9a62dc7fbb51128fc2fe7f6badedd64d4837a126424276070c8e0ad10ad5559b49c3721d96934ecdcb9a53912a8775ea3373b7f140993d4bb6f24f767d12c9d4558addd95799dbc1a8eace5dccb9aa4e97d8b10ce484ab770139616d6c6a9e4fe0fa78659bc6939b086c99eb92b7262826289c0ce9f59348cf345c3f41e168341c7532424d50f0e067d378f0b4693cd85db2a97852cf36153b8a3ab5a9f389494e50bc1db6579e40a5c91a7c50c182ca9035ec68c38e1b72dac0a40d44d840a50d476c83bd852df8d05db0d1a18b35ec0cb101144800630bce056900e30b5192d4000a6d60c2041182b08626aed0a2758108573899620639b82267096e403f2c20841042350099443d72a31ef55502ce23260f08b425082174408f8a6085118688010c3308030d36a0448a2228e1891d43788116d2a0451aca80a1cc0d08218412f6600d5800c3083088b224094ea600a20628205902852ca4c108960625bc84445cb096450b426872832144a164ca0d58050c3dc6c0022cd4600a5848830ab034d060850bf6860b320429020fba90020d708a50852c9e3c498111d4f0248b293c53ced06277184d3404c12bb8eda061099c47b28929bc2a5c2c66909cbbc29427e094222129a72091539a4025fb841a00f7a71750c01fdc76bcd0c1b1c9174ad03005ec9a153618d0687ae81ea2805d37c0f680dd619e6d4074439db282f776dee701a6f0883165072e24e2829d2fbef7c518405fb4c135c001efb9edd8b0d27def8b2ce8175f9821bbc308c6002d5bdcedc514b80f80fb3f02ee4f98981c1c789183f388c99cc2b1c3f46ae9a64be7a6cbebb0430f35621ab636f39ea7acf6d4d3e19b6ec7679be7bb1519ec71c319b667f113bd9e81b83f1f8459a030f7a5281dded9a3da35129ce9432c05f1708d747809562983b8b5191034ac5256b35991c13adc30a40102876f5aca1abb2a88465ffbe1a6f102701f3e24d4093877919342a30245952240d270022fb0c10a385350210831884212298e10b9d1de3c506342d58a686620a0d1c474a681dd1bd096746b6145d166b6475e50431498a881127ae005161c610c298882085f80811a8cdc8055c0f0a2063f23c405db70ae9809b6630a1a8ab04419bef0c102c22082132278e10832e8821729f0420552c00023060c3c7774d0a2f427eb473ef4a8bdcf070522f089500f990fef79c6fcfbbcb55f9befb60b1dfc5e12fcfac67b37dbf860e3288b71378bb07303ee43d114e58b70db9112060cc26d470a139c4538571bd06600fb1116c18c76e8417a7bed26d83cc23bf4cccbc72317ea51658285b8ed488902ce22d1a319758b37e26dd3c01bf1222956e07898efd0460db395f284b6e4126e3b5276a4ba831d8652b4137c6827c4c0e878d11363a5e71a188bf97c6840d3b81d316b800d07f4a80b1f6618f26866aca0055de0c1022e1c414807a8d04514dec00418c8c00b5490c28249ca8f1906cb0b11846770c2cb19789e0dd1c3d90117a4e0c30748aa84410637282878c1841c7c51851f5b98c2195e70061d0000e622796d3c1977071f6c820c3ac842167070052ee0fca00a307818f1820f94d4400a3da035887c70501eca2b6a98739658421650f828821737601996ace10b51207922851bdc805860d8451330845d5801c3cf0d085f5bf17ad869c16d47ca102945c07946ec89865e42802c74918316fc800659fc8882159ccc608913dab073c51518a04219a208d2630a18e840c109291862862f6040e4c8186214a280011628708119b6b8420a41b8010caac0020cb4d0851bedcd4692664804f3f6838bc1d2a194cd2758e96df648ca097ab8a00b40008393296e483ca4200c67608314329ca00b37a425589224498ab7adb00db786e23d72531842189400018347ce1612c8c20b6040650a0a5e80c50d6905942f5450a20080c9f598406942f52adc76ccf002490cd4f5b0176e3b519060f76655306cb0361eec992c8376abb8abc51384d32724249ea617f8861faca71ec5089e81db4e19aa604ae99ccf511de689a979bd5570ca7030cc5c965b932430adb226b8cee3e0d8a4a4a49c4c00e1a5390f33f7396fa321940e27499a53c352ebd1cd13d7c01eb99ad623cbc92d50306c6ca9a5571d177a602ad5d6200894c9bf08f495f74587e8fdbe99e5a2e3601b5d8628b8073aeb8b405fe9bee85879cb578e83af9771b07552cae7702ff4564938580a5defeb33cb49e0eb36a346a08b32d823d05b32962ce3e0e993cd6359041d741006814ebb62d93ca8468fe07be811bc49b03984dd47d56175f87fb28663ecbc7d28cb383844ef4b0ef7771c2c335096270675f6568eb362ed41594e02dbdb78a1ac0728248279cf7c0e1fd33398bdb347d0b2a465496765d2a5b7aae9755d92ac705c92447b384a2feb9d49bfb2495d28c120e475f745877c3b0e866eb0f3d1c62c4fbce22a11da13708620c9c216b64841146ce08256062ebe5002133c9ab0c4144b28ce158a0e856264e2220b8c00dc76a2348912052c5a2ca8d1c0176cb1c83a31d86cb113c1f4cc710270bff5675f3471ab7a86eb27d0e604dc7ca041861c2a0ce104528e7c71a30151720517ccb084139d33dc704fec6c33f84c63e8841f206955c0e0764d036fe4d90d44050861a80a36cb59ed7befc9f60317529292745bb0f958cad00ef2f231a3900846922449cee8135c67052e88427ddb176c4804d3fd6a5dcf6462b3c5d0f60c7c48d4330fbec218a3bbc2493d92241c6e0a368bb024ea19e9308f19d54b0f35e99c749216e87cb31bfe49efd6bcfbd2f23ea0aea865e6e3eb508fe69c73ce39e734cd5b33830a0ed318ea50146c3e8e87eda44bddfd196a18430e1e40132e60b105118c051ad40b360729d8becb4016e69b46d0d81ebccd75215ed462a212b04758d8fc70bff683cb340ab7850ffc82db8e18a6e056cd26b65951032a384fdc1a40b570698e865d8ec6ee6a61dddb0c6aeb1586a0ad724e2cac12a02da6c1d62345187280a9ab31732f3a60bc35f1fa20de07f34a872e0b2b8428c1195a24b4750dba49109b2786621822c4f6f040f8d9a3d6a3d755bbfd0a1262e3737a07ee39457f1ecdb82e870a9b5d8e0ecf922c70dff1bc39a9a6fa6e499eb5671e8dedf7e6691aa7d3323e589e67cbb3153d8bf0a3fe2ecaa8b764d459b2d6646085e35db7d14e077bdbf79d92241e0dcbfbce48cf5cefbb2352f4cc4acf48a719e239204d63c493e9b73c4f3cbd3d9a964b596e6b19fae9d607a6105638ec5bac49e0569dbeec06d70734fcde55fdfae754d695ac7aab3e96653d47c3d6b58e83ad2cbf5fa75dab0cf4d0c3c121d0f59ae56ef2c96c8faeebd6211e8d0f4da63f2dcd3e58b77fd86385037bcf3e5438ae838458fbcabab6aad9c332871b7ecf3ee0feb477d855d54ad6561bcbba7397655d593601ae5e55ff32f7fa5edff07bf2bd3b5735ec5e65ef3593543604b711dc97199c8fc6dde8877087810886d746f78e505b46a03453dc6f10028103440f9430f808c38e1e2952c4f004ee273cdd33a3368ad214cdd411de01b71db205f08b69a3f8361a02bfc71051653037023f118c066816127180ca6cc866caaa9df5c1a823bebb772b075d70b9965202ce411787a928514a9fa3617a1c4c65f998bacca6cc65949ab2f956392a8b9f321cec66bcac50e45e14b4c5e4b803bf53500bda77681a26a2a8f26fd2a9facb3d405c331f5c97d777707e6e0a7e988219cd715ceb850f498f4640dd7a3b5868d123e555c90142c4888e12264da0f4cc147a654c441161b3403feee0781a01eaf0e61b6b8cd59c2090cfe11ac30a87755b9391e9fbf1ad0aa204981e490c225ede7c4c21a5b05659c33088a7d3a3d07d48b2aeec096c7e52f443d2333488789fcecd2370783271edc911dc9f950e8bdde7a78b847b485e92c6c33b8daeb916a3055f82a7a447aff1f0be84cd4f0afc9e9f144fa76790f44c8b3b6a4f16d03e18b0c0ef9f9854262126304c627698532cac2262e2b107ce0182db619466f268262a1315264c983099aa5040a81e59504c683155a176c088b4c842e498f4c8411eb8029b1d9348335179327d6a877df481272a8f06f2b44cdffd1789ec4405f2e09ea8e0863db00a9c02a3e4387e3d505c06da612116d82d793b38fa681f361f3f266c1cd233f9447a26439ee8a3673204a204bbf76310c8d3336f00077a1cc9c25119b2d33d394698bc2941da0f48da0f8d7d543a6470d4e9514c8f464166581f443b6f4c627a1403030049336a191a5993d16f3f6cb6126e3df3b2c0e24a7a689a3feaecf018114cf4117dc4344d6b322ed7c8219cdf8f558ec7b84019e8e066850c805491a4f8e0bbb6472ed065f5945aaf95a0bab950d4733cd3416917eb89a331df2eef3a15f3473da607f7a3976b1701aa7ff57db14e5d526fce1eea35ab558e774729970340bdd9dddddded3a00ef35b3dfdd9310545503b9ae6bbee7789e149ca5e51c8fa3d1502c1b0d635cf2cd6f763df8fdfdbdbbc7fcf50f2fcf123f09e370d87ec801005387e7f6c3ffeeda0fd97dccdda998f765c5f0e090571e0099bd59e85906fab3cf75c844cf21c38e43d672988ce52fd9ca5db2ca46c7a0593d6d506238cac58821fb325f59beba286bc9b03b8b84dd5732d77870ff64dd7870c732d878b032ee5eee897bf221dc1347a3e1a85c4fed9edc937e574e4abe4fc5533d516a9aa6ce209e4f70743041370b1576daf58ef341db4eb3e39d73eee68e4d5439563ac747cff4a3d4f2a2eca2a41f3b7d36f4f9ad3d62ec11a99b1831f6ab0a48f58e716baabbd884a311e3dd12ab582b1fb8431445dd18d55df57edf9718972e1da0438aef187d48e92bfd582b21aa93ee522f8ae5ed5debdd84247ba78a11236bb88a31c62c5bfc5a89eed1437096dd393d237be406127ba5e5b97d741337b70f2c2f5a118572a5113d19f8ee95471b118eaeca627c8c15d93d9c8cb872ea52547d256b9825cb563aa7812ebc9868dadb6aa7ec45be61cadafb225f3d3ac09a015faf0472c2da88b0abaa031e0d0c6951dd6c23ea266a4e37e1836a225a1bd1b41161e766134e4614b915210cd1010e89e2885494f5dae5ece86e2e5cfedef4b8989e11f9cd93b95cc4b2027aadc47b541ae64da983918f0b4783dec14c42481d6eee28d8fdd676f5efd39d688ac073d5dd173923464bf6eb0365a2344bef2e5407171dde8dc0e179e297b7a679c9ee6f0e37cfcec1d2e153fc8c49871c70b8574b0ccb8243aaac954e1394294b729a1e94f7a4b474b97b51b8a051b0347dbad9a6669b175f7cb1ef029a40d3cdd2e4323d972a5d1e1427c3b9f46132eb2e93aabb640dbf64f9528c2bba795a96eb8a8e3f33465c3c778f14dcd42d7d5c745b759aa6497e728e0bf9fb7823b408c0f3efb30800cf36e601b8ce47cc9c00b8f13e2ee4b5a80ffaf8c705174e8674eba2b7791e179615a5aa8e72e160de10449282500d055af29f3cd2abd4735aeb5aea86d233d2bb8350126d61c1ba5f2be128eaa62d45754f47f95ca2ecadf9dc6d61fbd3a24af481d272f3c4d062485d8abad3e7ee7349ba2fd8a9c7cf6db40d9696875674507da9414e64ea5756e590de1275d1cda216965352455539a4d75437bb495ab9a10bba529f0af2891893309635fce9eee9b512d925d13dd2149c63d53cd4bb87ea2851baa686b2c5341b0a8ebf69dc50821294a65bd3bf2449ca31f727eb3ed63dd7a7c7ac6fb37a9745faebea08ade59c9b97eeae75ebbec8bb3f1ad104a92b51afca41bdc6510eb6dec2d1a06e0ec1eb9b678b8632e5dcc2d188144551b7c645e9949b1362d95b3819916765c9e49e9207249e5ad59f8fd7e2eb9ef7dcfbd4f0f4f6e301a9158e276985636a795b0161a7f4b512521279f4413cb9775f1b6fc2e14ed2e987a3d1a2cbe9a20704bb95e7097ab652deee2b2f8ac0e4fe70b8f7be541b7779398c0ef93ebd8cc325f9965ae598fee8247f987f5e1e62f9fb21271ce474a7e930f7e5badc7759554fc97befbd374dd39f8f8908ce527d3e5e1069aab7e6b57b40e474f30382a5d7175f7cb15dcba7e7eabef8e28bd395a6d752ef7beff5f970325cc7c8aa8bb2eb2e93ac779ba7472c77e5e6892fe8668b3fd7d25beb64cb1fcf55ad454c4fdbde65f9a6bbc7d9f8ce549fbb0757d2469452be1ff5be1f6f9ef7233e20d64451b566dd83a9e9fd7032249e184e84022493757ac55f979b7dab5fb55ae1e80c5638a6cba8535a5f2b21359723058959f411a5aed8a3646f6e49ba187dd31a047da99f873da324b91e0ecb1c0f0c8bb7ea6ace49aba3af9588fd2875bb1c18ef78c05be3e261d3802e395a25d8d45d85035e789b5507659f5fd96cd69451f4b962ea6edd465bf745fa3c3cacb2ea669bdab7cdd970cca2842512381e8e06bcb4463e4e3765306652de09b164a3e0e014aa4462b10e776e5ac9e7104208e10d813e6fbe71d7aaaa1c2d9f873d0365ab022aa9150e39a1837d98ec73d9320fe3f282c35b9bc9e15d01f16e9e54246f160096a09352c21dc86485d21dba726b5e05ab703456a80e773a28c130878bc3cd07e3e566511a5c6eb638cf80b990bed3bb0aab58713e70f894c3311d7e9b5d042f6fd6012f2fa7bcbb9866b9e75b6a95c35dd2bb297a76b3007ef375b859843d878bc3ada271b820276c6ed0fd6414bdd94d0e8a2cfc058f411ca6c32a665bd694951529e56b2576a0638273430887803b8e06fc844b70be71125642b41c3e43254da112dc1f6531b009bb3b7707ef5e5ce45bee9a161c134cc05892861d3360e703969e9b1872f302cc736b22df2f772d97b3e5504a29bfd2d2873b2dafde19bc8d07937dfe9285ee92811e235b798bcd7c60590bbc43f4484e3b03f7b300709e81255965c67257e5789f37e9d259b200fe6e3e962449aa59d52487c5393a59ce725fa6af5cde8827094000bf48c4332fef02728262b72b17e4047679eba10cf4c9629583be06bba86b32eed2e808d99118453022eece5b5885a341e7af5b1fc23aacc2b2945451c253158e4693d963a388a66057054377e5e90eb8a276c0f2d5ada13e4fe17c72e2695e588593211d8cd3c1052cd20d695140a7f544381af0b59277b94579af084703be21888045d8f40c1cf22005df10443c2ad729a57293f22e5884a3413df81e6c51b0fcbc3c453d4ff9de1f75f5c15bc423c23927bd5ae560b9bb9425cb0e3f97e1599e84ef39969b1bcf54c4ab7508f55a0949046c54a424e23529d0c17709dedca260e9501ede9aff107abe045f2689a0ea4359f54f86fdca2c087439d0af22f27c9efe5e849301bacb40f765fe73e94558bf3eb7f21451c41045d4daa2501475f38ad8b1d2511a0986ee48eb58c9fdbda602fb3b94dc91a6a2913cec9fecddc695d36725ab757a893bd23abdd35653613592954b51d76ab16e4d5b2dce72f7c5fafbfc8c47f3d05f2379c756b09517baafbe47c9eabed951dab2b286bb5b274f77a4755eef34863592a6c2d1788d04cf5313d482c92773036ac11e362dec3615ad835d6fc958fec9ac63983b621fb5bf9a0afbf662b4d52d76eb5c85ddaaa97032ec64efcbbc75e97f34336e41589d142c196c992ace88d6cd37b0a9682adc91a6a29150729a9a0a77039d144d05d62c6060d507e5c110ef90e8a75209628a3aa9b0679c4479282abb3e15be56823a6d124556927c4b6f5951278e867559517d4761a7b09b1bf7290f96b7669f3a25adbe9b96ecf928e5a1bfb00ba32110157aa0f7a60a07ad3ebafbb5128d36a151707edd68134a7b5e5f17e5c1f48ff2e057a54a96cfbaa43feba2d7eb793ddae43af5675d57833b7a077539773fd707e2cf7d793b9c381ad7314aabc89c1d4ea893377aea8452ca439d54c14faa82a96cd3aa60978329a52845a94d85d4099412725393c908aef2954ab73d8be0be59aa2a212876fd496432422b1c528543de46e7a56c9ecaac7fb2be84495925a55314259dfa4c2253913c1d71d4e79aa0703440771f2adf5ca1c90876d9c6b95fb7e65da7ae52947bbfdc7db9de9fceb9b7a4a8e7c94855e5085daaa1aeaa19a2f2664755f2360bcd395538ead4e4ba5e2b919dfc5444eae03cfb4939894c451c0df79e8ee03c25757363eb6e3282fbf3f4f2e6c9089e97a72eaf936e5d3edb0421118ceb8633a053de2cb1cc526e3f54f5f961692fefda0fd7e5bbfd605d5627ac7c1b49d06657e61a0ff156d68d87f82a838d87f89ad1782a7e8a8773620867ad0d0b5060018a0a7b483e60f85a043bb10dd55a79c0300018e280a15c69341308b51f241bba8185cfb58692a88d4964122729dd1d1a0fef3207d6f1809f0d451b1f3e4f5cf103c3bfe838bc1ff0013b1f500d52ca60431c765a78a52056926c16514aba2d1b81a54fc7d2ed20a084375187302edd1144dc66bc37483362c7185b930e33244c8023126ef628be4319dcfabfc396a6252c8efae0bd81412c208c30c2c011e21a8867140162da0e60dfabd586423d9acf3e1800c7b726836386e363341ad1937991d6ea7abca8fd803dde6c5303cb5b097360e5fcdc3c2d18a5273505e4c0504786ad53d85c5bd815c5d80086211c96c8ba990318da903d02c35993985a923ad33419a3143f5003c3c62325c90e26793e81b34db5693c3389c9488f609468fc3bcce25f36157132e024425d8d13140f4ad752d427b4d5e9e85f9f4e67655496452fb3b21c0d5b1280f0d6b50e6fdd17fa1aebd2e90509b12f3aac4bb7ee9b5ee160ca4684a783ef38d4f51776727af8c8a13c946707bf4f3b2e6787faeb23d4cdb54e27b449a34e88147902bf2aba791ea1429d5027549e704060432049d49e1ec9dad32389618c9db940f8dc4cf0bbe8d1d4f7a379ad65603f6659dfec789c0c78e732f8c4c9804f0a7c043fd113cd371b6cbf579f3804b8ecbefa044209669cc806db7f6f11baf6984c2d65b1034406c1720896d7cadb601449a3bcd365d50b9bbbc8945cc4893a171f2bcf64e3b9ce2962e448112347ba28b213054a29bb2822850e929d235c58e71e2fa5d041b2539f381953ca224790143122457d527962e748203877115b444e29a7a88b485944de6c23aa4f76a4d07797734578ce6a0647ddb52129363711db65b035f391caa9d2e8eacd3892367132b29bd711714f1471447ae689220dc63643c330c63e83959e5d919ec9aecb60dd135da48d1c69295aa76728eac4c9c8806d3b6c90a28bf44c7e4688f44cdb618311fcde4fb411fcee2aeac4c970b409d55c0e95eb93f3d334e19344e6931275f28e4c4e602c029f78447ac80342ab4c1f1067459f30cb8827f32e896e93a16e9e3b8cb0d8dbb597b0872e76d04dfccc7b13f1bcd5153f1de2796bb079acde9bc6588f756bb04fecd6c8473ceffb61290c935c856118863d200f813e34369eccbb94dcfbf17cbc1f0f8812ecfdc0de8f0744c9fb8161ed8f66e51a81dd2c62b9745b26cb6d4f46ba9fd3f668dc8e9679077dc24ec59b637033424a391c6e73a26edd8877d0cd735a7b258d99db11ff6284c131d2c7eb36b3ee76bc3cdff52bb33238da61460f3d6af7ec03f27e7c3a4485ce14209d29402010488ad04321a7e3a0c01958ea014bf7014b534831850e14d0143a2029a6d0810272207808231670c953d23b48b07452389d1ec9dc8f4d07b238eb17bd95ee7cc0923b4bd6667c56ee5e1d04baf495aa56d8eb655df556b7f7e6da0bfb55dd3cc306b65d7b337453381ad8adb1ae08ba378d3fd6144e86b4ee14909a2c8cd8053128e59521e1b03c166fbe812380b8c6b9cf3f9694f273c904183b761b2d21e1b0db68eb578c9fcc072b5f7996c1d932f12ede7259bcacaff408ce2a82912ee94ca133c5a73f3be893b10aa4f2a6b4140c21bc0d653e3714e97ebe220acdafd895cfb36422e92b59280365adc97cb2d664a49b6fa2a4ae8bbdc5bc35f6f0938513741242d9e24167453e3c99177b8be6e92d1a4a6fd13dcdd35b3494dea2797a0b1f1e4d124fe67dd653375b7bdfa91589ac0bf2646cfbc1c95701414d365677ed523e89f7ea6dbac4aebd597459d3f496c4ac54e8939e040475e9724e6b5b9b97d7361e2a1604bfe7de6b28bd858b38577fa05029a594f0edca786f1ac7cb5801e1b0bb6c9ff294a44e65a8ac9f3615b7d743dc6ecd74637bbc35d2236e129451ca9ac48e1d3b5080e19d4f5a089170d28d94ee072a86b7c61dc2db72f4e0d183470f1e3d78f4e0f12649b0659e1034558d6919c9c3391e92d423e6341e3d90483c629431f1093b9febc1a3078f1e3c7af0e8c1836acb07d6396bdf2a3bc475e7e02f21609537432979dc13d7032b1cf27ae25c8fbdf943381ed7239d1d226b18e8f482613009430a4c5f8d54e09427a5a3382cc9eb7a7a24af67275d577aede67afad66842cfedb2f560c95ae94acf3e5ea63ff79dd5bef4e11a73d4b8435c6f8d25e9751a31b4b7e6bafc756bdc2396f1de284952356d4258ba0d861c706f380ee16c83e16db4e4b0bb1f0861786be443d63f5948fe5515f83c740aeb9d52ca4b198555923e00bd5540d0907450565b2684a57705c40c659f4750465bcbcc6a43a2a9c4754f9c0c7818917838c65f6d65705dee45b9ba65f7bb2a94965e2b71559e8b6ad67551af5e79aa0ae5aa3ddda37bbc9cee21bdb66a5b2daa4fea93faa43e81a252edfae6762fc6f8e2839594de4455dddd54b320aeaeebda781555f5751b6d55a7f4eaaa29f978e79a899a5dea6d55cbe5105856dfbfd38c3a7132a869de8c5b4c37016574323a199db5d646487b2ce5a13cd489b51246c120b45986d8bed1261fda03298fcb7139cd84cb7118566d7b34ae56ea843aa14ea813ea84278c27de40e50d50c0d002d3ebaaf3edff38f97197ee1f19250561ac50a8bb809ca0a6e71aeb932aadd74a7c3eaf3c9f2a05fb7cec2b8f95f6f3b1b7fe79be91d4f4ec2e173fcf2fe7ca307727ecfadc1c029c2cc210b3177dbc25ab3a4d49caac3e713242d2ad4f2e27ab40ca23a594124789a9d126f2939c6814393578a33414dcde68931eca334d729a5a467ba66992d3347d7aa59faed74b4a5ad6655996fd25e5b18ab1b7fe1cf4c1ec755b46b950ea3a09d539058c25b43528753bed0643070c1f60eca882058e12b2734a80fbf23d0c9f74d8329e52d8e06d523a0a941edc6ebe69d70d5f618582f383524ae9b9f648296d60b38d48a22e2feb52d7f474978bbe9f27ac949e5a5ad1574a6bad5e29760a7adf6c3f7dd1eba1acb5cc75f3bcde9fecbad9ba36223c5dea9b6d44d4743b54af9e7488e0869407e228d1681348a3501e4a79e4291f4fa63fe7f4f6f1685cce93e9cf4aa4d66bf55dcea3f9bc7370cfdbac628bfd63addbb27973a524cd992a96cff54e143a18a913ea8488cca982a40a107c044b389f5485092c00dc76dcd0040b37046959b6184789d93995674eb34ac1ef108987670f6e378d61edc16f4e97ea569027233fe7ec208fc6ed7832f2b2de2059d47d73f7c87d04cbbb1d8fe6bab49f8ed98f9cffdce95866334966ba77d6f7ad2c571b1196d4a51c19a786ea811ffc8b7faf4f1c8d292f4929defac4c97837f48e542d9fd0d235b0a83164a579a65797de3d2d1275f7471252630895d94b9f83b2e99214833c19e99294a496b21844de207db3085bcd5323488d2220a946901a445a826e4db56a0871345ade20579db3ea6b0cc1fd7e8b756b0d21b54e9f4556582627e5f44f55a7f75856de6b08e99e99a3a976afa5f57c25b2b6bdebe6f9aa1a58d45a9f6b259aa746901a45709eddf3d36b04a941c47d64e71a43f09c3e65d71882e7a1bbbcebbbf971d227c5e4c9bccfa538655dadcfad21a446904fdb8332eb9f4f8e3af89d62f2686cce93797f13c5043fccfe6594949c47638b3c99789b93532407c76372eec07db15a430896292938de16793451e7c9c4db22b6882d82e36b0871cf971583e00c97e0586fb68943a24e0d213584449da853756a08a931a486903804bf3804572a0ee9a16a087132a4151687431b80bcd74028d743a718a72ed45d9e73ce39e7de73ed09351ff5023dea539923d2a376457ac6a3b169997e7ffa14dcad0a6e2670f7c0ed80e03ecc33709f031210db92b060497f27e42c2ad0f6c3b6244b8082336e4996a005764f40bbd14efb10f8e8d140a0c9b8bbd1cb76053725644082dfcd560b9c1b16590e8dd91ebd3c81fb2ff002d118be39e10712fc0e81a691a458c008ec9e44cfb4242c3882dd6847f32cf1069c2b9e88b4244c00c1b9f52459020a0bce6d0a76f846764ce4b0c113590e213a590e21487ad4f0a867f273c0eead8a21bc003bec78f0174638870b03bf04f1f07b8e87dfcd6183223839c05321d6022f9b408f2000b11c4ef8e851c3363e81801dd89d0455ba4852862ad0f00219e04411062158684111d2c023c80aa0ac8067053a5260e76405465c4e9099d3332dc90aa060f7b9a3675a921c1fd87d32d1336ef6c02e0c8c840b634ed994fc208a28a4782105175cd1b008c2128478d1a385334441c2858121bc2f167805024044084b76dc901707bb7ffa78342d507ee4a0063f8842831edc709f411e8d8d1f5920429532c4a08a17dc709f3b1e4d93020ca4b4a1c90d7680852a6eb8cf9c47d39424b9620b55bcc0a3093bfd37bf60414ed8b903c70827b43c6d265e8a2ea019d8b903379ce70eec84786e2003ee6bed0ea9a51ddade626e1c7e40d618ce5ec1c1550d47e32a8dc1b61ea1c0f50c549083330e7e495200058f704bc284134c2bdade0ed7007795e3e200d3ce01a66f0798421e602ad5986509c71324e1a2096e87b1fd40dfae848388b88e0006c1485cb89e4ad50638490aa8e0f789ca7e14a4282a52944451949b2e56c67902d3b7ac2551811398ca723b95dbe3619ede965563b5e7e95295e52bcbaa1c60835ed555404c41e0986e6e9f3eb527182982eb6d597638c648dfe35f7c8f8735314faf99fe0ea7f7611581e9afe9cd1aeebf10e0e0dc0e5bf6034b9de40503342f5020c812aa68c1c98e2259dc683068410a4e98820227ba70c18dbee808958926f808230441083c94f04515bcc039c1133380a14427a78b14e8d06089231c810a3538030ba27421ab6109212421054258b0c5a56913a23e7bdad88486b0094939d252633c06bde820d03459d6ab11e860fd0ae169ba6eb1af643974d17faeebb2c157e8a16c83edb30db66ee550b6feb921ecd6d07f6e4d75cb26842d1ae353655531442050adb5d6696a6969693912b26f3d63dddec565e52e36a1199aa1100e85aa1e50182c4358522a4f049697a4a812611343844d8c154198313e55a2bbbc865ead9f5ad9caaf0c0bb11c5b3976a912c2de1202f4cf63aeebf8ba2f2b5707e85ed359b26c59a27f2c9b65fbe95e2bb7445cd68f27d0ed878817d0d5f1b9d6b56f98088c59a2db956b1323fa746b44ffdc9ad0279b183c5d9b182cbaad47550c0e852aea526b0b7d0b6db9684b4b0b366174b2b05f588c18316260188661d80b02e893e518fcb9956522b0b5f295ecf88281c1d85bae1e61217c892ed16561b92b19c6c212baf595ebe6facfad4c8ac1f6f5a00f867d8e653906631f0c8be951cc1222629edc4cd3ac724656ea93fa3cc5011cca35148c8c40877963536deabcee8d4db5a936d5a61aa937f0b2a9b5ce69dba3a0d34469b699268abad4e76df01098ba59be5139bde9530e6a71fcec379bd0930114d36b9d93e8547d8bcb5d6258d743f4ca3ed8c5de9510a15f21c8a16c3195610751d905c4caa94b5d19f54f96afb783ae8ca26e0f29ea56e854966d22608f51d9628a3abd32ec5716ba21c0a16335a08b848ed62320560e7ac3d8a9ab98102bb7f5c80663a15359bea8509643a12b4475ead65407dd1aebd4afcc2684a96b13c22eb756a5c3bab0472e37c7c0b09b5dab22506b0bb5b5a5a525747bb5600fddd69616eca1abc58a5aae48741b4d65a29b1da6acb5d69e6637ce521414f625080c3a766beaa75bd8295c5f5341b1d251bf72330e5ef995e510be1ecab20d0e61d7da97167b33cb43fffc25ab7eb58732e92ca0575fc946e030e85d05e174803eddae84683dca44e06e361a9435a6ae824e41d9050afd93ad1ccb720863a7afd2f1f9ca5b95c33e741bbd9275a5c33e6441d5e71dc8ca817db2508fac77a5c3c660ebedd6d4bb5c5d9b10ae7684db65967db009595f5049f466360247097ed6365b9cee938946e0f868233e1e1499f493e82c2f2daf8f1163fa45a7ec736b9aeeb2723c0217fcb9bd34ddcaf2b1655956e83e00077faeb5a6afb43c346553cb6df474adcfaf4f5936024fb70d6b58c3b0dbd0edaf10e0e0d015810e18bb4660fb6c04be7e1d9b5a7e65f9fae7829cb0d76df9746b5a1eba352e9f62beee4dc42fb75c74b85cd8a397fb1a2386e82ca2b38858ac534bc4c2c2720b63b96e8958582e8cc5b228cba5945a9665595691eb0e5f17bd42593e0e1dcbb211185bd1015bb75fb137eb90430e38e00003f3f2e2e212238648d4d2c2c2b2b2120a81409f0f86597b5d965555b5524a51d3d4627d65e5e6c9f22cb1cb5fdeda0f2bcf11dbb7f643cb452f374bd87a8cbb64adf110e36609dbb358d16561b91962eb2bd65b9b59b965dd0c3a36b237d787dab14c3ae87afde7baaeebba2eeccf1ebbf9d836b657f57c1c8de0c1373044c44a1a7a8fb844bd4caf999797f708237a490fe60c7d0255d83f14cbac4f99c530242c1ec10ba6b7972a213ec72e76dd977a1f808329d67a646f8f7dc26e65b9befd01d5afdb682a552cc35edd46631feb9f63589ef5be3c00075fb7ff8400075f57043ae07abd5eaff547e0cf3fcff51256fd93e5cfad0be1b15b53fdba35316a76033f1586590b0281ecb1530c04027d8e55d0e7180864ffa9201b02dd502884611886613df8dce1cfadbdbbb51ffab15c5c6e8fdd25b3f1b0acbaad9fcfe7f366fa8fe5aa07e07c3ed7fa9581b0ec5dbf2af6eba08b35c63e0e68f8e5f31aecf61fecf6f6c6b4b4a58327a6f7841696d0c105c02dc9123954cae96697c5780496973e511d4fc52370bc74c40dec1f0c793ae891040554f04c820223739aa6ecaa52254a921334a99264c7941b2804762bdb699a8e988e38e288236ee00dbc81d3cd37709aa6699aa669a2a6697a3a9873ce24288092040548e69cee33c909b0c0d31e3127ae57bd8178ce69adbd8198de69db8f90826f5e171e6cb01db6d65aab204618237c84af89ef3df8c000e17385efbdd77f7f11c208fb3589580e278ef4a8e1ec1eff96d51c6f635691c1bac79a784323982b8630b0da109462866d982e7d369a79492d7617ae7153363377e595806033c4cfba30628e3146175d96a79406716b6fb95d6a92d42ebd5f23c123d8173398dd4031b42c57dca27477c9dd19b3f969811d5551acbbebc284104208218c31aec186608c50e402983f1981255aab69aaeacdb70a020671011cdf704ed39c13de0997681a26a28057c16f44f1207e1442e8eebb0de73967859cd29426354d5914391e7e56950e38e7ac89d7ce20441fd050a86bc7d8127c8c31c688a5ce44943a8410429a45314f6551c43778f979e769ac13c77c1336388458e108896060ac4c44b646181ad9888434b4340d21281a0016a0c082c809d039581b4226e0ac678038a4c70c091360e8208cd355f01bf3f18a609c0885607af4a2889f5914f0f0125eba7b849711bee118218c104a332482e91a1b7e21e7d4a81604427b38ab1463c4f0c2f704086384f0560be78c31c6186384104201c218e26209112cf09c600325583aecebb2f0191ef6a80aa2d201fb0d477cd7c06bdd156280564c5ac5425b2b4e765230848e0743a70586774cde9247431dded6715486b48fe7c31e2fc159a443817783ba8ee7c9bccf31d858454082113a2a18faa822673a2ab8b51e39b8232e41bbf6cb21dc19ba3cdbb906add67808e1186fb56f4e6b270cdf5ca319554b8339ede85df8c27914b174438d8777e90aeb9e43f881c0e11c9ad5ba0e21a006586c11da81462e0a39173b3ae79c736f30a1100c0c849f155e042383500826c7cfbbf819dfe0a5a8235e1885755702c7bb17aa4fa824cc97c5490b19a21900008020005315002030100c880383f17820899a1f14800f8dac566c4896c85914a41052c618400801030020200230330900017317506ddc5ad26d10ee45a77708e95902b3461f4f96143c0a0a29b81ab0989c38fc8eba24aa2a3baa712a3404ee2d27fbf60d7c3bec088617902ff8d44be80ddc4abe48577c7cbe5c4b310db51427c2bfa5b75e02b36151c504dca05c8ace15652c77856030f1acd7b173fe0793765808e14fd34dae60b6e30de990fbe7ff5083ddc7a2aa5a6a0679e7293d8fe8dbe2e1ffb77214597ff9453e89557ce993749e6635a6212ef6b4571d69a1c6d1814de3d013e9d7e42081a422fa2177558a5a12e5cec755bd366622e32daa1b9a7c0e2d8180fb483da21b7ad46a1fb9036872dc0591e97ead986d0bec5ae2d756c7d7d258aa65bec1cb40e8e2b46d9b19c0fbbcd851d1a3d51513cd6911d9cf0dacefb8285cecd3515a671e6d42a8fb5557f2868ba52e30e98b023af6746327aaeae37434fd8a9a1227023c38084df164c3486fd22b88fe32e95861af131c60d8d4ac4f8a365fcf5e837e077962591671de7de60054827d686a1f206f6e1e86448e6afaa6f6af61e82b2b227f62e9b46104a526aafe0d72ed77f51457ab472c99c040baa9b65bdeadd90c625692759e7c7a71ab8b477cad1f59c2ef36896603527b6658b9c0d03ed0c80b1e9691b99d03960d5a93b9a17bcba5e252f74ad6a028b9788b2996e3486e1e8108ddc7048ab95cb9576acd817b5f64b27e8869cd586538026e95b2e920de3458d19ca6a0b36911dfbca008ac6b39029c4044456d221cea529df649a54c61baa6f79f2e8781b02da0693c1dd95a01e089e7d509d7c6c3463e2a9cef012c1ab768e65b0fdff61bbbfae996ef01d45ffcf0c31493a02e65d7ea82a9ee6c7190d745c34de188551e4a1cf6bc48fb688a9e43d837345ce61ef48337edeeb6f5404440b72fa1c427e637cbfc6565fa5d8fa6773ad75d4d30a28e7e69047cb986b9d274b28205d1130c958e70063a68aef8dae5545471fcefaabe46d7f0d50015aec0088f6736d24dcb0602822557a8a33e53971fd08d7d314498417d5b3be91040e6e959d83b20f2ed93ac82a6b19821a86128e1931d623c627dc8375273f33d98c0a2eaddbc03cef2d8ab19582f81ab5de67f9808f44e0588aac07051ffa7477675f6c255fc87153e64c3f0c4115fdf7814e9790eb7737849e5e43623aa9709d2496acd55eb1ec7162625ab861c89c5b19188d740c558557ce7d16e30f641c58b9d7fe6582983eeeb37921d1b6156c41467271f6b42dd6d918de6ca5b908fc50567eab834bd8502a6a9ee82e45931d25917053aba829769c4a5ee23c1a2cfbfc217843d9ce399f3bd2de00a8d36b775829c4fa14a857d0af1a7a3f68c31f826636c5d4f8d8c198c4bc1cc0ece0e1d0b75c3ac526da45c8d518351056ba6a563012f64b06d44b9c518d418bffe9e806a61d8ea2d4bc9169f3694f29384c22366ee7f3438d1ca772e990c932d7792f36d322c9aac2d9569703475df561ab21993956feafc8cab4fb15303a14c06ee21c0e863930f2a67a1455b008801a52e83fef544d4bcfd5fc551d55764328ae65e86ea88d751ead1adb297add1a0c357257411a3a1376cce060d963171b8f858aa0cef25d3fccc553bdc0f41665ed28ae2c6aec65fb95bf51ff42db6ee0452f8e2962b54f263bd227c58fa46fb60434e254c6004eddff95eaf448328a46a66b7919c8e682d8ca296386bc64972627c5e20feada79740f4395b4bf441b5947a3f7e50c652a5156d5626b35810950a7e263603ccc8c440c6b2c1f0a9784a23c25524acf5f24bc94a238e344fd554a96ba55980198a97df053d58c3182d8d9b2d9eb1e3d6336655eaf66cc1aa4554b744b34a8966ebd49cedffc5d6c59c84dab6c467fb822656228f5041398ccbac411c8edc4430b689693e4ea82a39857037da34b8df79e110ee4461c8a929bfcae9b56dadd4bb5e53c903fbee497f26e209dae9f0be5b715f4ee9a947b569c08f51720006f7a47ce1e992939cee61ddd121029b06abfa470728360dd03104de02a2c37242caa2e7a61393fd7c4a302dddab53ac76c09c4d0337959c5294333e951e3fc6b9ada13273868d342694585a0c552a62218763edd35a646eed9b01f4ce9186a24c519275c4a929ad98af9d623a4716e47ef8d052ed0c255855c40e8e59d7c07979e7094da65c291449de71e79b6a3a8c1749fb2b99fee063970b65816dc589a618ed00a00232949ecb1c25fa4be8fb905380522c427be86dddaa3fd0d0a00df4d0e54870de510dc60ea2c09a8e44137590266e8d06c01d864317120269e0379402e4eb730274ee730b2127106936ed003dc6c600cfd25d26660ea2ba3b544cd83709e14e54879981929f76eed1aea10d92ccb70e9f32965e6abf0e64ab49706144e0260d9d58c3f76d623776b0c7fc22d4fbdfa226c9b291267938b4a100c3039338589ee875acef08f5a2f674301e857ab3a98eabeabb37316a59e948b26dbf15260a7721e7173d701ba322e1583c14c77a29126e3b4ae99c9bfbbdaa3b4d501e77a4fd5d66a9378ebbb2e35c91a42466454feff2b27235a1888715a2e432196e0eb5da2046e46821dcc23c297c82baaa8cb0c5a4cb24a8eb912ffd3fd52f006ae9be60254006c5be813a244d72670419a7b047a99465dc2c21f92716e460e843fe7f0cf2ce0ac2d8d751f3d95339376af38bb6363c2814833c5c0650916236be8c4bdaf537fa0d3685bc816ff3f7616d4c43ce2b001124e3100f191435a58a01e7857859726793e1ee065f04de17c414c776f620fd123fad6e88fc257a18ac16bb4c7e85bea1fdb73ee15819a1d093f5b420a79fb4f2f7c35240411a46f4f8229e7765b40a0415f7e78828f960bf40277e3c47ec5d5fbebf6452f28e847893422d8f26b8c1a2cb266734db8b018381d5f6952e1d8f00729538f5e82e1a1362b305084d2a85e225c8c6d0653b8c12300fc021d475e96e20b7194003cf99ec018ab68fdfeb041895bb4ed71aa0ed07b87301d0d4360ac4883cdee2b9ace868f29b4b6d7f277e23491ea09437b57d26493ac66438d0fa7ba9adfa20f6a921e7c757ffd57afd449fb419492639b697434811db677447161b6ead18489c38c5891a03a103f4b5d6f24f43ab21777b7acad040404f4266e6c5afd6637f82011e1569d720f358ccf5aea7de7ef9eb07f239337bf1a73ed7eae9ff7de941925c6af64107432ee6a72ed686d0bdc3e65b31f9645e35ab03e208cdc4be6d3aeebdffa7006a3e041e2579a5162e42c7bcbe128671c0810d3daca3b70c55c082b6f4b766022286d23def8d21754551a74dbd84d8c8d0e18f2b61872dc986fdbed398a83116eb357d0bada1700712a50810491b4729c3512a2dfb643241421ca7b94b1404213db544b96166d96f94baaac93d04b8b01ca1084126f4568f76453b4dd0c557c8b6a3cd9bb0d12732da25ab2c2616df36e2cef812ccbbd2cbeb1320f40724a6fb36c29b2079de5fc22a99b76949754498c667793922f8652a586f8555a0260c71bce5f2e6a675295d72b7a3be227d11db4fb9bc69da080857edbb59a0e8cf1355f45c6d8aacbc753b70b3d1db1d74ef6370b41ebe4d2eb4a7b3cc1a8d156419a29797a8611f0727f59b02885c2700c347dcf98e9171a26583cbab8cd499d5252e8fb4b3847978a3dab9cbca523d3e0ade19c03da5229855edba89396550030d4e652b658cfb8798c462fcc15eeb457c69ee3253c31b4ed2f7625aeb4d7c29ee33a3c21b5ed277625ed34b7c69ee33a1c61b5cd2f7625ed15bbc52ee33a3069d128f18ce05f1de3f3e5983c89f71f0ced2971f8a61ec08a87f447e4ce89334b618dd180b52362657e2a40d7d41ca3d7d276bfa291403ecdf09cc00dbf2c2668840f0fc95bea18c2b9a28cea9475809f2172136e40dc0cb3c7f60850e6e72de8d7f9afea548b0581c140011fefc112a1922a49f43e3282d29903f45fed4b2a61196f93974e05a2449288cf69433a48b8f6051377c0eaf5390ba743a565c83bae7f739619c4b5624ec5b1cfb940ae5a5251a2a7ab04d98e70994ff0b84fffbcb85d8f99b8189d31abc645d98e7ecc708c3a03b5a3250f6609e53144afff07d96919edf79c97762328b49664cba1bb2648aef63448f3e8d3db84fc4dad871923383dcee3b59967a4cbc69d2c5a8e9756322757bed4e2f8a12340375f2e71c63ea22f89a0044f4316dc65a5b8405e85c496eab879dc6a8f98aefaee14ec68ff9432672df033237396c8e7799f7d022b39c87ca9514b2071675088b26c22e3febc4c99e3aa515517f2a69d9e52dd51b80e9d13de398c80e0c8d99371e069460c8a1c4b502d7038b3570b5d1a466ad713a4f66ba85291c9df35e63fc0603146141097cc6a1a78a95139173074a05edceca510c5ce0219015f1464405449c70b5082c58ab0588fde6294d2839ec7b4e8ca9f99de89cd6a905509b4bea644af36e8cb5d33b335ea777109c1ec6f63f0100fbdafa9a2ef95faf4aa85430dbe1cab351f09be661f18e6d6181f6942c15061b5eb1e6ac8269adb0fcfe8e1241bbafc9b340b01fc00b303eaffbbf83f001aea1c15d72bd6471c107c1d6d07db38abcb5f265ac963faa051ad861ed85a07493eb589c69bc20105b3516007080cdcf64445b3a3d0682959549d1fbd8ebe196577dfdaf01bf1eb2f93a03dcdf60fbafcf0c2e8d30f39fff354e03e9d97ab2f15a6943cfbea3d7f7bf3e48209fa2e7f98dccf165ba8e72e2adaf1523362444a422b43fd8b4799b0bd384c4f2f10a2167b7e40852dc8d24ee2ea85c06a6fff5e44d4801ee6bc5db4141f835c7f5937a27c5e27a25f64d67b6ed68e87f5d7ef9eaed46b21d8dfeb5e8e0d2a89b5989ac5bf6611c72f1b8637b7f6a57d5f3f25ac4f6aaf7afacb60d3e9ad049ae092843d1ec7b1cb991f8a5d95abd5b1a944646734296100cc8d6b987e4eac3cf560685d5b98e75253129ac3a964547e88ff1580c65cdccc2db2ef4304fac20f9b705c353701627440096f8e27c97edae66d71b42d815dac05b19776d39a465e0404e8afaa49526868b4a26dd8fe3e452fa37edc676d81d400abeae0cd6e05a3e862da5f25127c2b90d5b7074f3e1bdf38340b68a6928aa4e1c0801b1cd8953f2054d43294015df5272295585f1427fec4e56d345f94bde1eb008858296a87597c3d013b20fa8f3a824ddb92346086488748b975882a3a54d142a705a34deaa249e0ab14e52b22f7ad4633f518bd11b04d3e373bba9df07ff7319f42ed05b432be0aac5671529f52d528913178389996213a2c8a745d9c15719c76b3851331c23f52382d511c1760659651901c87414f0723c1838df7ea1157bb31e5286d1d437075634f1ac8dbfef0724f8a6c4f5d4ac6994f0ef224aee0d9902d534239428ada9f5c409ffeac1cbf8a6d85cfd06f08c089ca8282ab1b4d218cfea9182978ff49b8a90652620366e381766233d98e5f334750188c6afc861a5391f311e3002f029ef0e81b63989e45134ba1958cb2e60b0116a196d261f78070427e81cb79f1365f108d07ec96742d9a55f27470968811f25ab64ad1a50ca6dfb4e3850237c34190faa87b4d9f599b2e4c2aac53efb44a7d9b347462e88b47fed0627977f016ebf248a6fdcff5677e5f7d4bbc878c8503641f94398edfc2699f30a0c2b7df8e38dfb0f45d21d6026fc60024d080916d36df00d8dff30d9e07fcd56dc5075d719ff3f6cd35b56f1ad0acd88dcd86809d378ca708d19086d4780ec9f43d05821c21b7a788a9c56154e3885491411993e543b0ca699f569104fbeff44a162ac1a1089ea31a8d6ded5c3ea2f234778475724d807bea6eee6507b1a44a8e59412acb63d9fd35908371d82195d270e2dd6ea9eee00b2a90704de929b7571d7f216bd14f868e5604f5b298bf18ea80e9737ffbe68ea927d22b640928612892e199cd18669b89c7bb9489c4177600f74efed69461d9f4cd0ab6d4ff33062762b0cc1295664ce2acba573130057e58ff74dbdbe6f92ad99d482b76c44ac4e4f8f65f27bf9428658b6c004836c8f0025eb91fbefe6eea3563053fa07e61b42d6c4b2873061ed035a754048dcf0f78eecf78b31759d6e60fe1da1347c3cb23bbbde9e90efaa9dd06d3d2bc47b626f8e70245540a814a7a892800ec2f4198732c1a12c79b3c24affe8a02c085bab6711cc800a669760e43d184d145becc41bdc9eded13147ea1e8cd2a312b89a2084cd1af5f28d2e8343d56d6972160356a1f4b60651e83a3df2c9e9933f2c2da161e2bbf5a290a554729782ea3b8baa53404e8cac2f0876941ecc2a99158cdf77ddd1772d8b599adcac3fdb927a96f542e49dcfc5a1373eaeb7e5d92f932ea8bdff6b4505913be0b7633c422bb1f1e865be744f3297a98212520d9ed0927fbc0427efb396b10a4572ac0b03202b8f336fa04891a076df94c82826f1415b2745e6d677ad73a66db707eb65e6b567700c23f2bc1c95e042f248f82090a274076e3647a51c00be9a6ec281bc90e07069c0637112bdc94d71c2a043ce4f93132e18bcaa3b03136ea06f40b14a5af136a1c088b8af347a49d32a69357b8b31c1266693fa248e93c5d7bcc1ac92309fede456e49b32976c6ec8a82d96ef9298540d7c655ca9b6850a53a4476d22ed407617179670693e7a1e936b6e4e2018d0b12a374dc7668272e85349ae06af0cb8e2a45d43ba0655f5dd9b7883fcde0d024cac5152ca5622acec11f36ef94adfe9df835280bf341161bcb2623c2cc49570032029f34155c61ab20b400b7070aad3d14ee6299ff40ed0a2a7e8bafe87226afe54dded75d4a18ed75271fcdac5e8b5d08766ba1911be7c0689c6047ca58101cba30067c29e7243a2fee091c491826426db9175151edfd168c5087712bc1d8386abe4ad074c1eb53d83db18aa278a116a29dc5c3b5bcfc13a82b7ea250b51c101d28552ca13171765a54acfe078836a1cff35e1c428d16d458142e3c8720f302c86d0897fe16c433cfd5cb51c026e686615a49e46daf2e847168717a1a527c51a978a319e00ba01632e4e469006e619835d7e904fc7b04a4168cb007375c52af8260bfbabab2b06eb8024487224210f3e67a6bfb58a2039d43341d3aa1d09d6083303475636551ba138721f9a408e6c6282c7b3905c918cd5b0c59463bcfff6a5ebc960af733340ef42a53f19418d52e2be4ba77ba483220a223f397ccd317619a9cc018fe287a84f4b48ac929f7331db6abd91c7bcedd33754574608ed1ec27d13710859d0697f0f073c1fb22e9319f1a06e2494e06a3a2a91a4c8c785402912800645b951a8b0405683965c4323c3720ae60efb1e1b93b6f1701ebc9bd7c5f145c3e20b54abd6ad1bed638b0361b3fc49125be29bc7c441f6483452654c5306d6d9a1ac395d6fca6e4e3509cab99484a6c2f29e793312cf63889adf318b304325990445b4b8ec3db0188337ed8e2c52ef73172759bcfbeab658ea781491260556f1894a90cb1c4511afdf4fdda873fa4dc2cfdc4610d1a118e54c44d86a151ddb258a6ca792b3c1819670a513e9d982357d07089248cef0e0c510d7b2f4617a3359ba459f5ca146a93bee5d2569ed1a46533289e8dddb86b2eb3134434515415fcab9f8c013abcf57ca349e181208a1adebd0222339f57755d52d27c5bd2b837ae2502028e57e53a8efb013351aa243541a2a62c0fffab652e437f42e5ba3a72c3ea42071323d8cbae2259148a7f7215310eacb48df60e64044a5ccc1e0ba2416acce71e8aad3ff00b0193d4d35b7c1f8ad96a6e012cee30c8495e4bd8669760a455b2dcf12271374634aea35bff9b029ae3ebf7c92379ee4a5a147b53cc441fc00e18b6f9bc85b2d0c6d61ca4a3848bcdce38ed491fbf525b3d26274e30ed835e5532c4e962c3bee6f117d932c2070418067d5dd7b89c9d3adc6d46ca45edd413dbc8c39a6aab5641bf2e8b49b3f554aedf079a2d1bb9426208b1f24267029158e70404d2643525710354f600963f104b36ce324109f84961ab7a72ca51121c3a09b388d1394e09ea267a58c525ca3c1e1022be123b8b03102f47d7a0eb77a007eaa0f6ce0ded537025f4bd5f93daaf3af420ee776c19cb4893e4cd12eba1e3e63abebfb50f4bf8e19d088e21483d17432174f4b2358f0e8befe708e20929d508a4506baa95e72d603c7836c658ca4e279c9a4e9a055b649731f24d500e50493814134bb02d723a9abfb4cc9515b103bb38ca52662e7473b95e3614750a8c30e470885bcb7650b4b4331b72c9e12ed362a69fcbe12427db11697b203c4b571e9a4f5308a83d1c61b7fe0b46ef4c804bf4acffef77e95cf7d09129f6fa73ffddf3593ae952bc38129edac255798285ae7d2da91de1bbe95d1fb1f028c51d97628396bde696488411c0891658b3719b9856763c5d4da3fa858a089eb22582b9062e0fa3e10edf1a58aad5668ec469be9d6d6f8617bca5dcd9d465a869dd5a9722dbeca2011d09c38c11520ad09e2c06c5ce8fc198f9fea32b8b1dac5039769acd317de2f6bc26de0da643abb6e7e3fdd7fbf9f0bb8818dc359119dbf0ef21e29247d7dc295bc6cd54abe24ba77eef0808ceae33d7b9bb589c0765d853cec6fe06c02065901c510db3db55890ba22916bbe439690dff4c20a36564d849f2192ce6920e1954776ee5c90f8ac9fdac59154a14bceaa1890ff93721165d23b770935b7df42095f4d0b75569342ef8a4a4090e4f333714b9c416cbc8adaea6b7eeb51d24c1adcc34505e74735a35b709cfa58a9919e211eec21300119c09a107b3dfcbe314e6561b39b549a426b9a1ec4739356ad87fce84cbdf347023c25983e8ab5aaa813ed171bde02ae2f4617732c6daa5f80c7af27a4606b8aaf4fe3a7c4fb2b88316a6dc38983624b1c6eaa4c3e2f920b2b25abb0a6603036110d90c578f41cd2569686ac7b69c2d6992bb584c0422921191fdd35f94fc3fa762b4105e2f0d7943ee95d31b2149af210f90f448e514bd295a15248c370100b1bb1feaa21c20c4c1a2b0bbb9c009fbab47a73ea0ce2868d501e7209c9bf94525ec3a225cb96d623370d19dc70dc702c000e34b4974c9eef277c2c96dca965aacaa557df4dfa0c73e2f223d491a3dde916a13ba0c81e253f9da0fb74bd2f026e72557a5254b2da5d1dfbcab322c560076e256fc335a9ab3e56e0fe832bbc43d64e2e62ca8b943d681e75431a1e8da8fdb65e4d78cb24f8d0e78f80b15061966652f6f0e5b0719bb010414b0235c1dd2eae850d66b5d5680318b44a3802d5019d397632921c9586d20707f7ac1cf5447c3f47713d5d638340170fe4a73d029ff493fcfd40a4ebbcc959e133a4d1d4d91c070ca45e6b2d6e20a62e383b3e212ade981e9f9c5cbc316e827488484a5b7543dd91e99e1471afc893bfc3f475ef4a65925fdb9e798b1c8d86b48ab86101486d8e193e8f463d9f8e5fc14cd9a3d5d6a1167817cc33499a3b0dc8c81eaef4ec931a926a9b7c10386ed6a8da13c2a1be0d793d99c732c47daa3850367560b3bf886b53ebf126e0fefeec71d733506fb3e0e177c1e1f7c771df1920ebb1a56070eccc0ae3cc43da127483e7c6e46e4e4472fc95a47724bf378d9dc47e12d074ff71f4d43b316ca8a263cfc419baa63234603179fbee293c7e42d5284076b0fc7de7521e4727635eab1a9f4a5282422e3c8c3fe41bc3215e67919443353a6b4c05390e1e316129f0a9979a1c07cb8119732d760e7aeaa0e27eddc9eec0b5254e4523c5f5745aa3370eba9af79eec75f7c38507305958551b2aaa618246d942da8c6389d42e02a054aab0a507dc50687715b46d05112148a96210ae342d42f0741ebfef31eec0c5817d6a96bcc8e94f909e0570f006dd30f4eb37717576c0ff591cf1df408078935d1647c31fc9e52b1116a25c25440c5344721fdda06dda17a20a3d8ab3b94a626e95ccf367504c9459fe921185990122df0bf04e79e3902c43abe7f47c01ff758f981d1550daaa5c7e593655079f5502f175f26b0716fbfc7938d633b1ee54b463b439a817e2f2d77f91aeca215e0bb4a01a196d576c0f08a85a45f70ee8da13bb9e9f54a3eeb51192ca6e66ac2608a1b9b44712b5c9515ac325fe092cb045c194580708311c40a0618336dcd013c23f306472161dd7c26cd45884e2cd618ecf7c5c076d89eabe2575f6a1e38e8bc316efe42f14c1ae48260a83908228c2c3497c8fa6036de62a2391b701ebef461559be33afa54253ecbf5e4d0e95d82e0c50518d2029ec2483947471f2d742e520f4b5dc6fbcd30d15f70d38603d0204eab9e536162237d8a5eb19edc0309a7335a3c16051401a67148915861e32f380e4f2a6e32d63a27fd461005536140ba26e84c305fcc535609e21960475c1c84905308996bc48765714e2ad4e746f1ef590e2d49d2ec2e29569bcd8b54bde23d61bea9f81af268048a3e783fb21138c9967cbc81efe5efc15c6864b0e6099d16602363982cfc71c669e998dfd4eaaebf3c5aff0bb50de9d588b7d047044d53cf1e6de1849cdc4a47319d7acda942d380762a5645720abde6e066ee2eb132569f05147e945b679dea80ddbe4100cc2282dc6e9652280d5c08d51f6c95ecce7bb68faea0351acc92b6f293a101749a1c0465b6ffd00380cc3772d478895080939c1190c51e212bcc4f980ff714803d981fbd8a72fcd8997182f009212ee94177183f6ce773efc0ee999c4cc6d1e885d495a4b990bf044c685b1851143bba903dfd2acc106ef5ce531ab32d80b08c004aacc3bf0ac609762643605fd2a176686decb7447929c5ed1753c70031c1c38e63e608884de628021630e264768959f82c1d9ef623e5509ed102b4d9359cb29c8fd26942be966cfe34bfc58d5488b093bd5e611d1ad6983db5b1ba8a06b9f02af7466515bd16330216c2a4dd17e4eec29ef69e66040f3c5aed5dae3d7657b9604cd8b16fee28504c8e30f672ba820e9906ccba798606428490ee58c45bd9abb692ecc897a04bb9a0f27a81ddd57e6ab5a93b9ae0ae6dda6f303f39034b7df702b4a505f4dadb9d1e56a5e634377b5a1fa251a0ad0a906fa3497cd27a66b76ad4c3165bb618bc338e61832c8be3a2731044438c3bddcff81766726e1ce5d8fbe9c76eeec1c58e87ac457418e70d1a57b1d3bcb8dacdbb9c238f1b1b68167a450d91815ab0589e2fca67dbf17a21710a9cfe52bae8795a0f1e92192861a57260c546a58ad77122336e138bd299bc5e73219245dd9ea0fd6ebc6c187d59bc68001131f9c5173e82b4f47aa0552c46fe402bd08f31d78d698bbbf0d995204e2b9bcd68f5e9433d5b3c9333d49131150b1be3ececdbcba66576719f05a6c2da6b10e28b6538b55933dacc2686e7fb9cd72dc356a21faef7de4a03191b28fdda181c9db8a2ae04a4c815ca416b8e940657544da02e51c7c49470f0dbc5cecaa5661c3f671242b5c2f0df00ec0bc6729872f166c28172fd6d6596872e56ad9811750182b178df4334d6935d06d267b79efcd888401949edaf1c398c9ec6f81cc362f786e36708af3581f944b4799e95196c07eb12bfe75bff72454dc54ecf867055581801c0672f648cd6b6e924fea6b1fe28aa319e016253d5cda20a827b75a4817b212bad56513c559f9d389470c7d98a6153a8cdca90212bc0f8695307f30329b2097b76402173d7be9f45b8b142c7e98a0312e88a287b6c0cd6b3c432161a24a1b505116c2f834555bd4cbcb515a0770d7ba625355a5b1bc1b1021e346169198de4a097517fc48e601da08042c2a35c9c2bf1940ea55f9bdd6129e3422eeaf7793a14b737fce3f75898ffec8cff74115fdf5e90ef44aec8f0767c4429e6624a7096effc1f79b26dffb79cbc315ff8e40d449652940b0980fdb291fd64c823543f56d4567e24eac5364c3685f1ac61daf149f5f7f17394907f61785227eaa34421a9468926c33967a4a661559b395ff516de9371461ace32170405befb432d3c1020d8cbeb1498d3162d823da26dd343b54e766e80076d801c7f030fb5d968ff0e6524d99af97c9b949756bca2a8761884189bf2720f6235fee0a86034ac7ba4eac994b61abdfcca4861210d8c170de34ac98a23176864ba865d168a9d5191189a415f19cf5ac54bcd79c021d941564959033c97e7bc51211804d418423f4d49d58627762b0a9c7de9d8ec9eb612925671e0bffca98a658bedd6a12d3db36dff9b3673487e41e534974d3f6f5e30542007c40453389fde305c5b6505aaba7dc25fd48887cebc32326af0c10be5afcc1e7c45629b46d0f18cc2f3e1c8d0918398b90e9b90d7009be82fd814ab0480ee6e5c4824aaf11a0c6c3bc7055a480e6871bb57bc42adfb50e09b0f1881612df932d8d5d26b8b8bd63ca295536919f1b9cb8a96e8148143fcda0901683d0ae56d65e3807f80cfcb1f2f5dce0b2edf18175ddbb229fed134a239c1a49200885a40f348e4450dae7511166e67043c2882ab8621d67d2463f59a159ba2191fb7a7a650f1af59a0a21cf8b77b41f6591eb317b103cd05d02b7593adf005da0c46b56de1131cc4fcf23a48ade95c9e130a1af81834e4ec4088eb3f7044135301b23ac02697c3a33d362caa66ac7c8b445f2a70b95e14d93d2441761fe620c76383a15e07e1d235c7b87b0bf69014282a8d3b890f0ae2c23bd04402fb59ebf1c4a100216ab2c4cdd352a1bde9a8dbe0474531cac1b0400ee6c689a86f3d058fef3fb180476a49d1ce0fd18f0b97b5d6a6143a5b5642ba24ad903fe44bcc13921d886d3d2c0c29b6e82214d28d1be422108b067266b03a0c53419223768014dd3c7966680f655987cf39959dd2c43465d464f7646d2aea7b356e792c959b95bed010735b57d71b32cfe70eec449b895554d61e75f62dd1cda4f536395731140fc78e9adfb4e6ae8493d1006ec075123fa63838cba5c10c35cf7869f7350e948d9ba1a6a520843323e36e0ab8ccd2d6c4e1460623f36c04f2772279a805c780ea883a19773c82ac3a11179da1cbc35d20c02dbc8ceedb1c1258b1601b5b3668dbeccbf8f84d9d4773e9601cec85fe083e324a6e1ad751aeab46d01f5f55b36a83a98b9e90e75eeace76ef2835ccaf051d6f4b7944b858d10c7d6180af2e1416814c939ef7b9175fc0fc373bd8127e2a1803ace34542f645299dcb542c35e3facf4232674ac3e95728895ee62f344034f6453774bb1385e095c5a7eadeb70f5c9f8e7f62399cb601735a068dbe4da70e95b29759327c0a02097fb2b322c4ca2beb63963b390987e5a15cf9901fdec9d072c495f2ef756237e74c32a0def24f10d585907f599a906b4fed7b4d182c08e09916f652f04c0ae14a1f07f8d83cd62f7bf30d380efc53a29bcbd9e9a452aacd7936c4a83dc9cd83727ecad15e938e25b88f942925e8a06b19711e03793832e150cb56ead2dfb65038c01ed5669f9b8164f3ff5439978930270d11154481f9951f762ce1185198b5abd80084aa8de873695130d1df86988183b35b0b9e9ad494e31776108f050aad27ab03702a896a6e692f7a9cf750b35889cef62313761e977de65e1c8ec229afc0df82dfb06d8ef395b6f0cff466d506a0b90e1e488d65d766c8e5898163fa9968c80e5c26ba84c684cfe75f46383ae8183c6493ec35f1caf995db24e2198cab1a059d2f56af096edc7bd57aec6499466d78ef51f5d24ad9fea4758521e0d7147502ad9c38aa7ff5820681fce679034cfa416a5322c6022145b528272ada26b75750fb9021a4b2fa43067b4ee293fe2fdefa08e0d3a4fae9634921609e15ad07ff0a5d5bfcbc96da26e4586dbf176b78cac9ce9545c979d244bc8b60e8ee6ce1d2bc88f5f3c52fc70bea124546d9a5578d2e1ec287c6008b3850906e84662cec6519ab07acfd94210ea7cc43a989a91ddbbf08f25911af804b4d90e729cd8b47e6df629c624d231846d115408934ea7199df2c834f470170c535655b8d7cec893860722afe0ebdc5de04f8fca28f6318e42e1696e7b7b6e8491123c0e88651a0c2bbf065f7f20b58400656db227cb440c3835b891b9d394e231f8bd7a2b4b9976c32f48d00e70c00b048a3398e444d0d988e8395da1b025aea1a7b704b8d0166f583e9b144f5ee71b9b9baf9016426f3157a1dbc31a514707b622a4a7014c58c24d215b632d0a8242acda9c7a7d7cabf39c419b6f8c6d95509c219d6047e9b8715f9669fb49fb90c969e1370fa1d066d65ce85e9dda690e9ce63d8edb36d46679c48246d80b1cbee781c8e327b44598fe1f052f1001036c701cdeb1f872de2cb12dbf9e55017063133c2e5902ce600c6d5523ed5a5625d0f9a7aa242ab6a1cde55357fb5ae66b9b3edbe36ff9ac00c263541578df326aa1a1cb4b572a013dc5e2e2e10eb3e42a6023c75697d50af13675851d588beb07f7060787141a4257184b3fcd9bcb608c271e816dd9a8be1acef675f66fbf452379990c3f92474b69611adb70a365ee9c9318db3b3a51660720b62d52a023a7bfaa9380b6ec4379f472e07365143ed946a78324885e04a1fd22713a95b2e7b97f2a04fd2265a109864bf0d6681149c3be678c3ead930187ea9c74a897af2e450cd44150ebc57081d05e50e58639dc050e4412ceacf7d2fb01741fd4a1c5c3d0d0288373637908fae88e297c9f84e5049a08b880f6624930e0484d049c6798a715bb46a5c6ec3f05ed96e355c50d9a3bc59988cf836e8440ac43d5bff12be0ea49d44be96160af7c4a3dfde2d6b0c197dc47da40f7080a8e2ec2921d7ec04ddbd5267dd94d4003fd9290529f7b802a1060dfcf49fe3e6d413641ce56a2e7a8d40927beb8bde013ea44596610c6a3b0d291c0b1c301121e8439f2baa80ca8b4cee0cca01347e2b47f075c771b812b2154d37e9209614665b3e31b28b894e326f26443141fe08edd961057d89c3a506dcf1d0560ea81d2f6b40c966fe96cc228aa6f7cd1d6dd7e40bd8bab3ead812e40d0ee0e4c483d1f15490334304c5abd0cab837fa7ae44e5f3bf13a43fc2c62080166d5501c8d97aa24d280cc3425c5c68e37f564718b162355139a617232c2ce11a5d3e9fcbc6de0adf8bcbfa0df2a494fc0477b74c36e0d211a44a0e280affc3ec5153a377f6421e7462f21e5531737284881919f0299a47a23994570ee3d58372b484ae229240e14f94cbb5b01f2c78bc55e8d0c10f68f1ed0cf4fe8b9c7e0eddff9708d8916848680f3da79a94e4a0e6bc013863884c315c0d9d39a493b5c1e80d9397d8211342131142020753c7a83aa12ef1328183d1361b5bba81641f80eb6b7637ebd55e7557186345c9e8f81bb92f9a2464b9cb9c38d250943b2b41171742c9b9cb631285ac7aa7be600a1584434a36af8aafcb0388a248804aed88b69c19ef9b12ebfec2a2e1bbbe85f49e5b66235575fb2a946e9c43ceff5769bc801c2fd14889c7c2a1a46c2c177927cdff73cd11cf177f1a1cc3eb935c031414964d8aeb2cd05490d46cc930803f2a4600b2416400088bb3b5166dc2be700b080a429cec7e6cb4803f49ff190bf4c27aa168257d7d7bc68cc5f59dbec3f02f61d3f66b383e371264090130376a77bc7acaef8c06f263f86dc37a4d1c925618083d07802de7630d29d18ab1635953e1313105525a5a576296af55dd47aa1a18e4653d4b14cbeaa7520228525e0bcc3349f68766ff1182251b48d90302c3d50db8e0bd2e36e26d0cd1dd85c5aae1ed9e42f6cb7a36279a096982ece3b98c232f09aa1746eeed03397fc1249b4f6027a4220448c7fe104a99600057bf0e1871b9b8d0cfd2010f55448d25996edb65d9ac50978f259ed5c3fe70d3cf2d6ecd3120cbf2734faae5f184d59cc5bc069056c9c19d17f592e31e5ebdcfbcc6a91834919b9869f8b1a670c189fec209ccd6a8b3f8f0eca00324a2c84792a7c75e3a44fdfb8f55476260f60ad34d1fb8e9f5efb23d9d06ffe90a4852661f2d2c1efabd967a3fed31821cfe3a4509f98df0ffa1f5ef08f4c9ba85c466f88c4d4c303b6ab724fa6c2a2b897ef18b4157f29f3d69dbc1cf054e5138e4c35ee2aff7d381285df216be014b6aed2065e9de284f7e31a3c00ab30ab98324bd59b52d07865b012ca5d15e17b847f0181562e351632d2eee39341ad15759607b7cece806c45f1b473c93f810c6a69bedc496c1484937e06aabfc9d6fd9840b1e926c6a338d430373c123c6256301604a2b5f890cbc6b0b302d2762dc057ef9292a18c6cd746da84c105c22c1945f6b5da7f62f2e519074debf4aabe43b8b36a09210bf7427b82116152085f615eec918d6538482a4c21f080ed847bea57b7a624cbef967c0dc203c7110e2814cdfebe4219983696d4de97584e806acae99613e921088bd5ec47303444dae1e2e5801b9ac44acbdbc6288bb36dc4a37c04f8a90a87ada3aaaaf7e6eaf8530ae260133da02dd80beb5804a8a80103312854550e19968aff80da05db221b2a9f6382632b440b67c036e7b2da26084257729338e466f016c63f65cf94c957ad831164b34fde79a12ffb60fedcb8ae4c56a38c45ce157b45d69df052b6325ef4b3d5e78294ad209a138a0485dd413e31d08a4c917495bf078a9901f5a944a54e38a03784621aafb2178d5915aa53ff42277207b1a7f2fa9d3a701148692b179357a51ad478c4628d50103dabe765840f720d30e0cb8b159e480da9c60fa3b8efc1bb2f8c02a46dfcf107b028c3671c3d53a059f31c4e70019887330e0cd66abe6dcd6548cefda8ba1d8cc8bf1237cb7d7a994dcb39f44ea397e17b9b81d64dec106a95a6ef8d2014c92b24f2999c36f8d5b521217989dac08d05b00c6039e779710aa2e1e40cabfb57016cd2b7392641004c96312e2a198c23deb46087348911e10f5e3d3dc260ac5d01966b244c0f56fc5881d967863ffafc55585367c00478d88f1135ee214bf07a06c3e80c74b2fd1e6982fe703dcc67968002a27803ce030284fcfefe2b09e29531ff0652d48f96e0a3a1ce56579c381d40748d935136f4eef9b3da68de19d577ebbc4a093f1db046e5a20fc01d1730dfa8fe0dbdc4162b802a3c3508d52c1f7f00f873c4f6f870ed9ba4108e643480194ff82f7c1efd864b0469dc6519146257f0078a3dd467dc356289ed7a1897f9102156cf956374b9407dae8a41ac813840c024bdbe81d240bee20365ceb0ea1600762500d981d9a447dd79c888db56abdd1a4dfb800d843b38c43ef3c9cba336cfcf9d1cc39599184a60ed2a4b64288baf40926777fcc5c4341c18e352ced74ac1cf7963fd50d0a52498ca4e43d59641447d1e1a9df835f24b33a2e86977ebe51c655d22a92f574b220f6c2cf899319976c596f2c9a7dbfb9947e3940ff6fa5a7a7d46521a2070e29081fe675e1ebaa0939538e7140bc0d99e3c6b12632a96f7aac555e7dd38c891cd0a562087d0f341e48be3178168695b219322f4faa29c8c88a3d389e49e4bba88672bd87febb15ddf6dab97764db4bb1775a219fc97f60ef64f271826b1e3ab323288bab3bb14e2131b71b8c8127b5c867c0c02df0619dcf6ab554db7d2bc2346fb33e9dad2dde763379efa56975deb2226a19934281555ef36bf6b9a34bce0c962dd053e4738be00983abe5089d9b0d2e112328ab4b2ecceba3213646881c64db8a13f09eff938382035de5a2a7ee8a25af6bf8e4f4942ba8b4b04e1a2d061ab31e79230836bd7bbc7b76541105306907697cd306ac296fd30c2d40e1561243d60780f874c667a405087cd913f15cab3b97d2bed79e3d6a68050fdbb4672d6292e48286ac20374d20a312b075f044e925a2a895a2bd430abc555754d03ffdb51dcc53bd7821e2a9edf0998074f8cd871eb4c9c9ad167ec02d02ee369d73c3313f71f119d27bb01f1ec84af45cedd06bf13d1696a4a55b53c071c98f112697202ac192d63d2d9129461398d7354382f8ca3ec4dded5b11cf76c5309a020e598af899fe7cb8289a94f83bae8211f3e232719519bedb1a9c67f879b46f6413965687004c0b070a7f7e00d1c16362d0ef59c3774494e519d5f427f5532c004c42d81466a633d387b2461de8deb1c9f70253eda751d7547904dd11a9c249cbd0719a4cec29ca2f08b3a978f90199d662df927229e2e9d5fc1f915ffa12dcf87f749efa5c34d90405743f489d8383d0d37eaf07da1bad2eaf20ee4afe515ec21cf06753b32878b43bb588ff459166398da9f15e1af8127840bdf2c665cb4379f584eb4f755377ea063db2309f90fcd79d79e4f229860211863c079e0f46878e585a8c10d5291001e0d0d9d1ec27f409f343d55d5a115e74de3d364486fa76415b870a7fb2b284a4ca5294615dacd1f95a06b6bb65098858abd861b385d42e29a3df350e189846a59b23e290e53e5179c5e2b35428eaecfdb4d5ee768fbc08928ce5015b8ebfc9809e72166195a804bcd7b7a38368341fdb014a484f3501caacfe3b86f2f8be19f78695504abfed403b7920ff067caf52b69ae1ed518f928696560017286a1f98371b8312f82d98372400ef36dd13c82cc069ca1ea2c8b703f97cc7d29972f71a5b0b4f5885b1f9e240380e957b4cdab276e380f16c087c220e88a37300d806cdc1120d5015c20b43417f33c8f9c67e4c3a2386d51d947c01a893fed9a8b7c48a453f936918d85981fa83e1a9574a29f4aba0a1c6f550e33386076e7026c86508c9b1a786455305907c7ff2c5cd321e92ce473bf2f3352623b70cecd7d977ca6120fb08b7477871e7a0622b4d19191fb6458c7f576e3403e152101c554896b549affa09fc0061c6955f72d99c4fa4e23aa2502e96d4f376df343c2c186d2f3f138f2e958f7194fb3b701d2dfba284c7a372a94d65549aa64437f36c9562fc239fa27e425302c31cf45eb61bcc468b57942ea21f003d71736225e764dee1754aa4ea1d16e54efe0a29d5c54a4d8ad41056ca85b6de2ddc8d106a994cf631992f35291f62f89d81f6d9d809457bf16d545c7e3639a56facd26cfcfde491b26ce0d5f2929df31a42d3b71eabb6b54d93c02cf6bced1e67d4b88d330823b9d0771ab1f279b558c064cc6ed9ec21134651b72777a8114621fd56268c9c6f38a2c6e5e2c2dfd0403424a8f1798fdae566f762b915da1605887062b3f5804504a239e3a46604c79251cf40894cb4d488d63b310858e84f7645b4c71cda44c05daaf6e1e62da046d54306c01f8f0d023ac3c94a7b72e772787bcbc76f1405dcf42238e4ee9d3b368e701a445a426c84e9b0aaf57cefc38dd44018d287752b91ca399c371940231c9966d591f52d4d71c35a9358725d63ffee0998f01a8932cd389cc2a268cb77a11a5211225a57f7e873a643f9700d30aff3cae2d2be2a0cf86519e300206f09b82809d4d592788775fadc56679dc5370004e31009be0b7dff1713a9ad39eff868fc085b4bd892610e56ab0ad9ac0b51bba37b0563d0118a737e45e7224801c46044829d48fdb4828d8e2a1552bd09c61aa6b90e35dab060bb2a91d6fc25bc5e2a3e5498ca66b82f1cb9da8f888dc3948f4bfd1860ecdc3b12079e5ed08d188c418ac12946716697754aa3ff5deeb80097b48ebd6d964937f0783cf383253cb2fb9123eddd641c7acc4e7e166961e2bfb644345709dff938c35c19c760675c2f46267945ceb7bea72b957e8f9f0930a5034a41c5885baadf3a4dc8a61e69f444164aa95f0b381ef031ce62916e2e3c0a3abcd327942edc063a38f1aa4aab69b089000421f49186fbdbf1decf1b5969c4cc658120dd2c4a4dbbb5cefd551c984347758b91863b11f5c917ab6854e9c6af11200b97307fb371872d1bd9ab4cb106c8e1bf99464a3a53ef38df8a35cd30562a1ae4f6d6ae2ec142a3b7ffb2849cca2591f2ceb73f16001aada377f382a29cc448f05d315dc2f7fde6dbb5168f4fc1a2d58ab6aa88880c37d493724387ccce83da9a008702a841eda1e55b7ede5bedfe9c81f267f9becbd00b25199d4fdba5c009e29696027c63ae7ef81b29364bb7c771a0c97914ac04a247355867bd3342533b643c4b8ea42fe0a29c671190bf002951186af4ba3158ea261ecc376f9d449a4b09b84a9e48596f29303856b93d280e36fa610e4b92c7564335e5f513f14f64ff6ebe376dd2fabb103d001cb9de1b6a875f68354a0be6e16df3f220e5d28ef851ac76a0f4843e1fe74f75f824dcb3113be02b7d4a430313c1f8657871c0ae2bc4c97f892b5a41322f57d876fbbf2d5677633c8511b3d531228b67ce892586bc9a13dc85f58f3ab3683b830982d5594feb84c090bbd7604db76d9277753ffca3b4e3333eaea01e180c5c13fa34240c6c129d403f8163a0bf6e15d24045a18b25a5fa81ab31a137311ced807023cce0c1ddb58c68e6774e259808f5dd6df18f2ed5541e93f902c270de169091f3f7a6d50a376336ba3f8ad5c5348b00022e8678952d6672dd43f86a052fe75325fad2a55de93eac2dd2fe8bc1b1e78a329ff0eb24e839a81d500be24f9ad06f4f0e9c620cb8b0da5d73698fbe485d6d8e9039dfd0a29c12dd6b4308aec59a650034e4b0375ba6d507c415dc0dc5cc4a923f7538b18265b8ddf55fb0370c2eca08225ed5092fbc8413f9bc5c5352d4282612033cefbb2a70ab472c6de69521b80f7d5addb3bc01b7cc576eed0dfbb446b9c9aec9f4777e4994d7f0ff4dadbefbd00c518185fcf580ee0971626044f108b1ad6b6af604fcb50211a5d47dbfd41a881f2a18d4599db206d4d22d017ac0383b1eb500281a588ff2089bc64e4c89091d9020c16f332cf0ea6fc984e20d603e85c4abc18ebf54eb87ef77738ac5d84392b396edce76540dbec5e2f9aa455175c7a982a885b49f18a34d8645b499c7f3d571ade99723fcec5245699e7d537e2e6217eb55689a2501b8e804a205cc2f137f9487bdc45feda7021c1f133714f824e29b5a53b72a791355f49c8ce26dbab343df8caacc8f629485ce2dafaf857c2f2986f105b2887631441c048d078193b148eb6e441480416ee8cb06dff58219f1513006511ec30d6ff79f47a6fb99ddfce940258feecab2e96fa1e7a3f68e76d33eeee421a553b49e17aec42becedd4c78197dfb21150cd3570cc959f749d10307be0867510eef58e275dbe786e4c74f248b82f8abbd770729d34e57ff7b579ee78488f3ed2e1aff90e1e5c921f9dd08145ef0b6321ce1d909b1bba0aa4ed2a1e0b65f8354c8d4d9a94c6c9b76ba1f0b8f2b96aa11bb9702d58f060e58393fe7c0a479c7dd6b615611a1687c229afe032e299c94a95a31716612514765d45d238860e1920e4289dcdc950cb7ac5570c7f0c0de58affcfac3ba38ea02e1e1413b22e3583915317a7d382c1acb5d17b7ae88a2900ca51cca2495c0b7db48cea326218950b71ce61ce11e1f13c558575922ddfed4b976661290f20d5c5d638d7ab2b093cff259a167afd15d392ad39e77ca08bc282c021937761fe05f683da84517fe69c7c4efdcb9ed8a9b026de7811ca5924c68672c0257401339ba86e135e987dd31ae0c29a1572ae595dfdbb1458771869c89c98f3b6026b095358c59a73c6253c406e1debc500098c19400e2780286c1c77e9fe649d229fad3342626a01493330e453e02005bdaf7d64def83ddbac54ec91c925fab857bce191914b7e96ae3fc8cc66ca51cb42b94d1188b607b04ade3b2fb860b0f23b3aeca4c632b023cf4a93790537576cfe439e1a4906aa35dd2efbc7e00d73c4e3a09c42757508a57e19056b98b52b56d09df6b062a9ce1d3d1c050f4ad61708d18894e344b911593fd0610d45ed6b584f7f0403ec0b795cc5dbf7bca923bb07bb6f97d84deb55b7a831f6f1eb06cacf4346ca0228dfd7a32d74572e4de563c5ac50b02b17ad46fdfc7d85c0bfbdf5e7d13a11f7b9267bc2237e9103b6a24a2eaf091c453e94bcd7a1d58f07b5b72b20b7e3f4317709356ed1f9531f47d021a5eb00d3e4c1afc78d9bef96b282e97ab22253ab5cc20e48517742157bb1561f55be8f4b058cd5fd86006ae45ef8389f24147a5f8e6bae0e41e3a1b276c950abbb3b68ee2c5f707ea3a194028829471f7383f2160844bb3e4f5db90489db1dce4922847f03f9d14abcb925666593bb6c7a01e9a127f16bc7c7b4fd41c28f317273c77b6401c6e379a5122dc6e86be227c48319b165db69a87857d104c7c6f6b14d5252335419c5599a4dea873d0cf629a37ba74595160382bf36884dbe759ae16fb3ee912eec0e35fa757a8442c5771a96080341fbf03d4cc82f0a916b8653d6ba91fd69f30e8dc715f15100c3d0b8433c811e450ed4b62f6a6c57c0ca869db04c00db747a5968ed828ab84c195891007aa0409d86fbd8208c66c1e988ddc6bbb5db884d0a2ee049a447c38ccc00643b1b0790a3ed04007877e3efb7f2ee72f444b9400d00296c37c1d097dc04961a147d66141adcae004561014941bc5e472dc2b4ce45545197b05bdbff28fbca9ac01e2544bb08a5f2a6df947afd4f6d32a5a8afd8b09bc08a136b9e6e83a774094d3c2a35ec0f9915420c5a2ea12d5e3c6204b36d7d2bad674b8a3920a0c0ff17dfe19a67f2f4256f46305faa9594dd1d811ddd5108c8953707846bb54c8eaa60eff03bb6f5d137ca0ea475a56cac272c97c830a72806c49719878505a212c1a1856b7299febde4d5bda2a48ce1f8303dbb3aff938a68a1ea34cd6596a1f9fd9b5f5193538003b18ab801fa1dfbe84af7d4a188b02ef0404b94d16ed3d4a97a6a93e620feece8a4c179865ea72de521be2310a6a39c13da102278d1cbec1f51a583c561b4d731ea0565247e02be38b06be55f2f23520dbe47e24ea161ae72c5950d3c55e6429eed15ffb8fc82f7b8e17abfa519f670827c0d8cf6c17b19ecdc28fa27949a5ad1d5ac6ff73bbb310654a6bf1f096354a7d02d52499350711da8b932644e09d8e469531205f28215e6bb5a3349f626fb7b2c281df7fa4dff63a8fd211432a4384d8be870dec5a0c62210b518ce96724bc703f95e18d04400afe0c1c94ed8cd159d41bd8de19770e06c867d05a1b82d8d882fc835b5195a83a9255d6a4a9dad9b48f7586c4c47b84f4d4ac373fe1a0e806e56cce3cec44523c9dd860b6abe463b51381f22b0923660a61d3f6f37ed24ca5562ec538e10c629bcaa62c009d9537411dbb08438b5bd11aab7dde5991dc5c4ea36c11e360a2ba628185d28b2ac219da6d2e98b4df166fbc648360df9ac0c46cad7f73e449b2e45c69a1184d164ad714522c13e9248e4fe428a9087ded339065056e4af1967e5a6f475d20cf32542490322a3663deaf9a55a7e6e6e7bf3facbe39578486c45433945908c60fbab205c407771235bc95fb2b5ca0f326453a19421f26fabb24d5ea3f5c236b025798266a315b746c648c85a021d6f5990953cdf2444d4be7ba6c3806cfcf0e8c29f16b3ccdf9e4d8436f4524b6d6c93865820297ea30a7deddc467dcec5f1c02697132c101b476f55c6d492ecf5bfc7dcb235581aa18447cfb4347a0b62f53a29745573ec7b6110fb4efc358a885b2293059b0c1d79527c9166a46589a540b039d0230642c964d235b9a6087a10bb2725566b0cab4dd6b8254d382ce5a3274364d3cde0ecea882800edef020afa938842bfbea12d4af63d52f6972740034b46b00a5a03851d68ff15a87ff230479042c2f376d0564d7d5663428acb3e6c6169086812a9bf93dd61e1abbf8a55a6fe4a3f613989fa18a4d7e6363cc4a46c5fe2946001d10cc29c8532982520c83324f6305a58d8c0f8037c633608f261a845b97402ceb9e68565f1f4ecb8880df480c2b0066aaa04922057beaad821394bd6d3ba8e1a1bca53783a4e069b4095624e910a0b2aab4effd8b0cdf82c8bbd328236af52350d77a1b83c80d14ed0125638202ecb2a200d36c34615dfbed32c44d64e99b8de1cd4e7ca1c6972692bcff2d7db78086f224c7d3fdc56ac7ca9da8b56561fbb996f391772b6c0af8d51c8743e01a1e0a2c054fbb405d5701dc7fa2946a74da55426766eda29214d5b4093fa03a7219828e5bf31a367c0e8b7090ac7859dc140c6ad9e7bf608563c5c5821f65ceb41dfb9ec68682742039f60827ec07487fb57686685f6297c5398c7c6d7ea733f747cf68c33c09b382c510bf2e642ce23ea13fa21d235336c7512c76f7bf028e5a7f6fc0181e20de8689bfad11ee193f57379d83dc94242c8f87acb4a2d3fa0ed89b3b539965f0615191fc0fb4b6cac4bf897c485c62fe5385bc3c0d5cef32f630a08fbe46256421aec5f064835ddaf1880d3c340d050fcd6d0e2e326f1fc4774d061390e610cfdff97150c47bd335876466cd312c5304cf1992b76723ff5c454f55fc6078bcb6d48ffcb499eadde9ba3130bd26230b3e87c688c3ca56b3ab78f5f06cd64536bbfdae1bf5c2d751851d4620601a6b331ae192d1b7dfd6c80139d6fc834309ed2dd0081f916b8b51a4c3c1fe1199cd936efc627dfeaddf023785c0426c40e79c95e02539056876aabfad55160426f0fd8114be8e835594cd0532ef3c23473cd34062606adceed7956447419eeea85ce36126460ae2475a2b8440590e153f2dd256b2c78072801972616b62af0bcfb352eda4106901012cb94bd3684cb9a6dbacc501e0aeee7ea0ee053896b0aa771ca86a635640d1c8e0334ee4c11dc04fa28353585609a13074e58bd68acebc46f731cc1d4244b20d32fd57fb476093af3f120f0258ea9f896c1852b8d79074ebf8f6a63b932ab252e81a4a5b959111215a0c89c48e22148d009f1a04934079bd0360f4c75a18f4c30072b53401158a164767caf32cffa81c95db0c1240e0eaa4be460c2912cb2db95c20a2429c9cdb1e3ae41793001bc2ca2d460ce42ab25f0c366c256360fe6f44e79b4b7f083f27904b78c91915027b943d0594972438794842ccd724be3154aab1de4cc803cc85f7e03806b89bdccccc23bbea0dc263a988466a7de180a794966058922cf506608ac611b789a8a1f991d12004149a05290c88e5bfe37eec1badb0517cb2298ccb9b27df751ec175dd989607bb247983aa9af8c5d8c4d2d461244932ceeba6df12f236be422e76667b997bba20a2e0528c9f46fbcf3d76a884423e595ca0ba46d9e2495768544a19790acc6a46141a83bc9e356eefafb8f5d612899f2d21758f3944369803d3dee0cf4d96edd4ba1d01bde4b852cad70db27a4dfe5cbc64e129b99b75b145d45f4bc259741c19815f238bdb850d0686ac5fda9444850c79b8978adcc600cb90532ff77afa5217368b637d31fbc84f3d6ef0fb4ca4644712dc2d01bee1ae86a9858a9910a99a8f7acd964482c73056991cd48591874f034fbf6cc4aeb912a8235ffe930d2a16465af5fd2d719cbde8d68ed9443a403782609a2585c9fbda8b33d49f898f07393335be0c973458363990166f2625e171ccb7324bc9c9e63cb5cf33ad01a5ac64f5ca3e875edd7d3e34cd3452fbdf256609f4e0bcbafb14e7653bfd3a0ff1d5064618b3994cbfab9cc4a57ae11083e613582126012080881b30303e7f635b183eab640727ade0a9f887bebfa093a2a5aa69b4383453fec217eb47c957a492c83714b7bd11328ad3d7b1d99c12e5c85bcfaf3daa99ee50648af15d118175cd9097054c49970ea3550012cfe3d47b9120e9606f67aced37be1dab8d7dbd129db1ccf65d9cfbcc0a2d73bfed33c66bd4cafb106921469f6a52d32ead5e8cafce51c8060027be941153f8caef08dce1dbd3085eef4bd1eed34966567cb070afdd7389c68ad50c631a891ef093e561327390d43919cb36d6d45622bf2555473546c68918876e93d7bc96184026ffa700451f8a601773dc35cf2d3beabc2abd6cf0a0836fede354870bf179350bf81a42316ec7ae48472bb54808ea83aed5056d63957bac6f8724c35ae4e9486e748ce8e344207a4cb09b3bace5c015d28b0ebe27e485aab3c2f6fd76423847a95eab34f2dee92597f1f480e40706bd9232bb0eec3aabbab448eacb390fc25a2c0a7441769105d30fa676cec07d97a7c00b970b5d446f2cb15a8c68f0c3609e5ea09b669cb4c415c73d959772eef569a579174129f587cba1e68746067287a9f0dbd623e095a80f6f4ad1cdc20fc9430223f9010941fc956a356433734e2b0c6c6a135219723239085c6e86cbbd6f6464858604bd2cccf95dbc19f532ed23ad24452e5a6159506fcd6e7e6ea13cca9b53e89ae83ce43697f9d43811c8025b74633179657232c5829494478a32beb1154a403df69ad1cd42a06fac91ef19dd5efb25426953ac81f9eaf769cf9f61913350ce2cfc6a37029d0a5e11e64e59a6daf291448ee23d2a6940a70bc95918ace497efbac19e866b0e7ff6d596f8265327b560d1e5dd9844150657e2ad5e75b92e1eb27e1a26aaf44642d622b683daf7e0f2862fd6e6d66375fc7617767e2593df0e0deb0efe95a1474f2d855e96e8552ad4cdecc7e693b51ed2570701e72c52d1518ace44b6bf9df985b3bd7b0099bfd3fb6fee9b0e11b7085c42bd9dd765150a40a04a8284be5a220e7962ac2dfe4a9630bd18b3684ebd816096e6b9e89bb56ce7d46ba80360d2a5751cef659d8b28f415fa9c6df27e46d86f2b71a0347693a271a5c64b66b51b226d120283632ea3b0a8c38f09116c3f43f490a93ec697d636eb5a18c65c2f030c51bc8640e9ee8ef39923cb5f655ff8b2f07b876f0d111dfa5c2a54f902c07b0aa05eb05a10fae0664c27e9cc9d0073b7bb98772d58a5e6f1b6e7eb2b816cb8c18d51c7fde3893a86054154ce5a2f7e8839087c91de43b46cb87a0203f16bdda02d538e11a618bcce3b6a0230bc6ca71cf88ae65c3225bd8c510c608401a33a3ce3479da20cc3acba3fc69223a4fd237dd2be731f19fab699607545a642d81fa174b249c08e45aca3da43070538c6b0388a6e66eef2444d90bfd415cc24f595bd7a7c5f9b08137478c12b64d3b14d82d20874a851be89414bdbd9117150260a39a00bb53a060d6563c60c5d887b72cbc21507098c84a27794a3f9285c30ec1aae2e03cde9eb06c7c52e417ca7e87e022ec7a4cd1a08ff80e01bf101a4fa5388346deb728ebeafcc7c74886687a2c79e79295d443f3d088bc6bc2e46af662272180d5096e2515e99c473a88b1531ee43e72bc9362b76ea8c63d847e0d12ec3eb86edc8419f737b9e3e0e707be4d7de16e342f7dd2b010ced94a493dbf2332e116fd36034eda510ddc2594ac5402129683fe4b2dc72c8302bc07ee8e7fc85e778de75e23907e42096b332004209c4f4dd387f7fbd1133a73f42a4e47954538f056b2a08912aac1c98799d9236433b189a4c79cd41e2a39ca62a4828f5afbbffb37bb4fcff77909e0c42d260d3bb040cbca251ee063719c95d5ed329c4370dfc81bcb084f9471347639933a4e95562efb26c3a52e00e240d3977ad5194ccb99ccb60bb39bdbe59922f7d62a195eb791d2ae2cd2612f407cafdd5d037381ef001ac67bd1a802076bef5de7846ca5273c81c745208a1e7348920a993aa9508d38e3a8db5ed53b146cec8ab8df4cfc852ee26eda4bbb8de8431aab6ca2b2d8f66a6e4062d0bc815c73b17fff7b469eff837bbe931081707029f3cec5fe30e7dc1697bd6c6e655e3b0e57c745ff400ae6b6a7ee2eb97b21b80ae84502e8334b822e118c4f13de3ab2822f31f71ee7279d14c917c65cca504ec2e3f69ce6ff885b82539965b42487d3cd92ac3bd829988c3455e8537f00522871d96777f1c0878f00cf4b25aa87fc701c0d31438f4bfd4256c6638314f5e5acbc375bcbec8b9f68395094b675d36969486da0cc9e800a2b72ef5c9ad4c0070fa1c1339929b0b69a7519727938235b5f9e4c4e1b3d210af1f12a24b7b50499005869eb40a458f7b4b5a4ec3dcdb5516af87a986b8a0d105e9069abdbdea2913df010b9e18ce5331a3ff68d427c4a710411a1028bb24985af47dcb04cadd3592ab007b7c4633a54c6394808ee217a539adfae0095e80ef1419cb1334f4140825263ed4885a908024ed14ec70eaa180d0e145afb1839d5af08aa37864c052a09cf8dc9e64e07b88e321cff9c40bbc8fcac269b5a20ee8195eb3772f7023b2d8761624788a324669a45c1f27101661feccc88b2770fda1651cf072ca44b6243ec1a088f1811b96e2826d8bc7483e9bc962006e324d454f729e8794de91bae005b5a9fa73e45fe2fae283843d4c6e96c941c227a85274a2c169b815ee7c00cf03b05540f9fd83bd9996e341c3d72bbbedc7faad7598271b09bdc8c0481302b27a87d99cd4abaf6ec2d7ca190bc8b4c2d83145c50d08dc435f720cc32a8e3243d71ac36a84b2dccfb77230e911154dc0f59f603ff08bdc74a0b638636534dc4a6dbe64ba48cd0f2e22f79d7a40e2b15fb15e707bc21204e8f3d262fcad9537194091572b48a8b20540b5097e7a5033a5f40c067ec8348158c577149079dc511e3fa218f3749cfcfe7b079ffc64549a4ef7c7d95548ff097f9243e1fe83cc804dc82a24901101e4dc56b59b851f3d19f4803c9bbb77549c093a11790394d544663c66308078d60afaa6c45b4ed53ee9e493cb7a55072e29a7f819e348954dcd3c846d8b396fe4e63ce8bdea8a8a34bd207d58d08a9817a0c075aaee29b2c19889801db0a248223b7d1b759d9300149b91b42ebbc60febe43f9852534b849c62c54ab15c0bf5e56db3e13ee2d64354cc3fc16f1ea2936fb2bbcd3b0711c8b8ae89687449c3cfb5887bc96c8867230f35f3bf3138343869e7c530d1d42c46bd80051a1784fad31a48977bdb4a8f192b2d2a10ca6851e89f8e032ea17e0c5be588b40692fcb85d73b84f406cf78640ebfe3aa0b904007ff4e4a79fcc172101b870fae011da86832f912fd7c6adf3270f824fe6d07c9e6055a6d30f0debd1f409b66ff050f07d9f5080c36e46b7ff278fc1e825da353585728372bcc5e0d77d764953a008f024433602621eba50923a397c8e5af08efb12df72018e1a749b24c5a687632622a8c90ce6819a5c74055783bfc4a3f1551815673c3f7624138da2b8d36eaa5ef054577509fc1daaa17b8d7f1b7751015d246f56690dfd1d76f3f7ef409c89485a40c604483130bb60939d130ba8d7b405bca885682557d4b43fe293f28e613c6cc63b32053a2f386407bd5040d2495068833138b516de67600a0e03729e207637ed01b45a7fc3e6f674a608319f880263959260936b8726ec2d9aff77062f65ea6f5150b585a5734a12ab8b57c7a0440c9200077622c377dd6f492cd9f8e935b44cea581a419b005c998b5cf77a3c2bdac0550bd42457797da9c1fd7b599b2b76e310600d3f1df927383dbee38d2b255012b73088ee18ba7bccbf06819a071344e1f31add113c3eaf4fa540234d1fbdddf8f8910f8b0ca17dabed557ab48e341ebade6c6123ad3c3d33fd2999e176abfd0db64d04dce7102f91a1f4ba0c0162ef3d8cf5534ad200221f0baaf212e5ae0c1af6d36edc73d7ded885c3c85f47a15fdc8a8733ea7d51bd42e09b519ce2a9fa5ded46d0ca0c30264a717248853e3074891c45124e186cf4679de62ec5bdfd88ffb2a46ebc540ba7cefbdf077567844eb726bbf69f627e2ad8fd2397d91e30b24d62e1f83447d45359a6bf3084d5f5c8318f85432ed53809e010cc800c997a3622ae5d02db22f85cd38e924c5a66834439e17cc40f14b4d9a4124513b365be51a5bb130246921042d04a91addaea414f0e6f504501d1e1013543645608d7cf4cc6c0d864a1504ca36dab4a6e42c2c8483f35579116fb568c1ac5a8308418fdaebf4ce0210fd9b6901898a6746a6788a50fddfcb98d5904b70843285eacbeee0b4e2d44e0e6259655d8d0100963202e4878242f70bfc0050c65798b26dbcb7f842b3b7ac5c27f41627e72fe3e997709629dbbc80ae70b923e283cae6c555fca23e1d8e92d9c19a0b7c67ed249b3d73a312cb59959ce8d97ab8b830a453261089d3c8e4d001d435dc5853fcaa0a75ad22216782e4a4d1e36481e0dd3d0fe57652c085910d4297c05d6b30ab0b54e372cf5306a04039b12a64f4bba59323d1b862ea6785285779a510f1f3ca87c3c5f8f4ae7a6e91a96e49b3da24f4ff7d4ea1ba3fdb472fd69928a9a3ed12758427ba5bc7c8868683a220faaf9a82ef56ed07ed611a9238bd9ba03dd57ccfd105e0e596c66cf7c2b939a342d0f5639e72b2a2557ec05ed1cc856178694408919fbd51bc77e1c06b2eecc3a91981cef132f59d35cd93fe2d881cb35420ddfcb54d411f752ad29b3d9fc85d9a77ec4105a47753f1eca014c7d329e1138316e57546c4d49fc82928a13be7d13017bd6009e75b8cb2731268bd53d85c3885dde5a6deb5bab3d00800268c69b76ef06d7a55abfc5779eab7f4d377322d5185fbb72fddc4986e299aff816503129c8f9d9b403d1b834109ff237b029df0353e363d0eef603e813f47377e530003380463e1d92b8b7282a0956141e18609f4853bd21c09dc81b1f42530171f3791979374b9050b7418fa1edc6d71fe09b6f35132b4ccadc2b05ff83e0aba3f30592df5d81ad73c1d769ed761bf8dfc8b8e3244de1c8f04dd6d56bfccabc0ba6e9d65fbc025e66f079221c5267414c689482cc8781426faef977899ccbfcbd7a226ed8b3f569daecd0018b8a109bcdaa638f74d77e1e6ca1a158287dfb746419972b8b72b31bdc17809428d1b482a367983063df61944eccc1c5cf56717f50e19c9dee1a40b2e13096c455e705d15bc4ec5575272979ccefedae8b57e1df397f83725638ba5e37f967f067cc88e4f1493d6e402977526c2b28700f34058569bc5f31d6ad91d6cc9aee15277689582ee2ab7b2944d4fcf66d6d61319b34a9a846c4154346e0488d6f8389796c3343fab82b91ed11949d0f2bb8ddcdcddd7cdaa1c0edb0a56c28d5be9464f0d05d0211e4e23445cf97b09dafa51c4c1ed13a1a5944f7cbcf84e999f703ce3f4cd1f101a1054ab44a4be44e8e88d04daa2bf272d2ad56472cf7155764d0e322bb6c5c353c601778ab22dfc761ced720583b3fa663a7a0164f3d87332707e87c29ea09e485cc8cc04bdcf63ceb86639296d83ed1686186f96f0341f23e2d076ee2f96903f05002461c0adf3a7b158f94f9fb59cf7745ddfe4c6db035a4f1fefeb15a03a15205094bb2cf4728307f3facd35ed0482ded0ce97722065314cff214323830581606ff2601ae80787d48a09635aa98be05a36b9283045375e87b630c03a568c63790e0cfa0500409e3b917c400101ccd0bac4d4605114809d5b935994991fe3443ca0c50c11cf7f94527d46a64055e9b888e0a901b2da3d41c51b44338d5ba0510e707bcb8c663701b3c58f076370cd3413c13883f5d07d883ee6ec0c80fca4a1d9e5666d631b40986ac7c9c552f30f8b19185a85a5e632235557451ed5e853b765ffe8fecb1d2dc557a5b39704f1b2fe4fd7674b14e5b29dcf235c7ef91f7c22596a45899ca83a431744fab979d04d8af07b9bb0ad8a20ce694708b3926e27bf95abe1a42d1112ce19c008d6874c5ff1dbf3e0275906f49b594a8c5c50e2e25658d8320fea2fbeb43f647d9ffa06e9242395c65e2383cee4c4d0359d070623f10b7f03426da5ec86b9ffcc174643e843cc229f49a098bc2adffa15a3c3a998271e4a0ad305b4e4208058045b464300a9fbe4288071e01c5899b4d33552f1f296794e69e6db50062955bc633634f63862fe9cfe9bd05f241384d381078ce61ccd8c74a561ee2122def506a35b1ddac0b028330df1f478105d5a7a3affb8d74b487e7fe944d049ac6c347c4be48252030f7d903469d4128cdd81e99e892b177ed03d4177354b730d728af3ace506ddd02460d7b598b2aae9495cf79de797973ec7a3c90c0e79900d8acdf963f2e89acc41f96aff159fa75517c5754954db798075e0d47630599a0a46371605b597bcd5bc125dedbee28a4857cd5de0b04ddac10f0a6c7b17794f810aec9d1d63aa81d5dcd74b63c6b65e4932fabf2b91edf2566e3455dd10e8417735e544bcfed1066139a3ef7ebcd0020e678972eb15e25a5d71fc9fef0b31a31bbb1a331dc259ef998a31b6591d219e393c9a51860dd1a046cdfba1df8dfd95dd8513b9a861850d74c69ef997d0bd6cd631eb9bf00423864228011d5ebc009d0ba7511fdeabd3684cd17fb6db743ae5b3d3a47edf20cf5c4a855bc5bbe56fc535c4c711d2335761f55a92299a446b90b7c1ee66899c1932f77b108e240b7fddcbb4a2f0955f2a019e25fd3a41cac9f1936526e94e4506a2a7da3788408539bbc0bfc9dd4d8c8dc81738959ac79810d76e46cc6a668a234887f01571c67d65f256d0734ec390f03c0642b7c78563efb708a0af75dbd9d6222e74c01aa720809a829ccd08b6798a1305010c34b21af01c0231707f1f3b6a56e70d0516662c3573185bfc556c1aaf259fbd13b41be9fb00b141e718ce5586069f76600975c8a670619db623b8eb66cd0f9e712404260fffbc29f393babc3de31d52cc44c3f51ad09499ee01797cf124d6e8e467d0489dd7cda13434591bf7f15acf0ef62ed92820b999e43a48d52b403ef1c1a6aba9194dae8d6803b403be867332317fac100cef3f7d8fc43fc58633b5c45b68fef317727d6a46006b568051116133f26d3101e76a3b634d5570d341936e72d10dc41953c3f6228dc355100d3a476897a8f7bef8110502eb741370610950be55d0c53d520134455c45fe6a1d59c4b07491b997b060900a600f73d4bd83078ea36760c00d53443d45aeeac570f9cf63e32404f23213d3e3913b0466d54b03e79d1607de93736633a662648197b66cc7573ac68bc9eedb38a2757cff5607bcce10cbb8f027e2a6766d8c33eb3e3ebcf7933e450d8da15ce4314343238b44a3d0847b8c07f433ad3e6dc174c825b9f615bc53da9973df0eb207f4a0e7234ef60bb041693c5467970b989de6bf080df0e5d6444ca7e1a743d357a7b67f448dfd4e9856178db72ad04327cea09edf911e709c62c3f7f905a2b7b06db3bba1a42babadb54ab9e3e13852bcdacd536199a8853e957dffbbaed41d63af6fd551a0dfe9dacfe0c58bca8eea0a374cdb1df9714c4e46076c50e7ba18462e711c774ace7816c10353c67a012ebeb683f7a171041416c2b8f02e0c400a04a42e8b34a3242161516d541ee2ec65b8c8f24548d87e827369206a3461376a667472316ffb6c8ebf6e6ba1d473dbff0c201ad60b1d127b1c98f0c4325208d2c1580d2159226d49c8ab20b1c4d0b3129841748a22a935b10744abbe626ec3d295821707d49d7f3a89086b0166989b9d851a39acd19a24c1d53a80f9b6d80a989c358ec585c65683218de049f03c629ca444ead4c6e6e311b51203520cf65092009a6dc9a3e8ef6865688f895daaea3b83db13b61d32726f5453f116023bd4d38c94b7fe18f7261b983023bd35113c8aa0077c5476557304f7a8eafa2b92b7ab6322a1907a6a316737eb4d0bed1ec4e242fa547d93cfaab9ab2d2ba1ff9d68d5661c82b24c3933fe635ad7a43188e98263d6cdd1d133db63d319b54d444e5f3af54a55b40d21970e8846f556617791046ffb5baa17964e40e55a6755840e71d5539f7293c9b7626e05d17129d774282d4afb53096489e04cca15027b4395dab7f61b3f8a008d734bb1198283776de1ef5c9c10417066ab328f56327ab92620ec8bf5575d14e63882c2cf3fbcc5da2f004c0d94d386de7ce8298640fb5fcc0263e02351a315b9e58271381f1f593ae13f0cb1226cef77a168875231215ac563892dd0b504c9cdb971e212a9307da546053df0b67e3876628c753c072054dd2589705e79294054435d2a72d4a1c7c1a0829b70371ef598a0b31bbc36a50606aae3db978bcf23e14b613c64fc21de92277fde12a91a480b64a6165e613c81129230ad4fce72c53c45ebd119f78f945cf90a33b6100676913f78fae832472635600896573240f1c27652f871e6b337170460a067c5e2378d4b072e603cbfe198d454d47abb638dca6205950c4c19d1ac75508b0697b96d7634fd98e822a8c0b8fa827254266c46e78048ba6624eebd95a858b789ec4ecfdb847a0d73848cd0637da8e63ddb9817a7ca0e18b0bbbf79b3a302ad1bb29d704c41ea99259c9ed8e56930cb5528a5f8b9dcccc33ee1be949ef35f6600bbf8adb8361fcebe08c8063f243538c920589174466094de62c8a609b10cac4155ec1b0118c11e80d6d1e66bbf27b64bb20ebeedc5105506ecb7b0d84133ef47664348373ea9cc91580677ec3a332226bf03eb14ced2da0dba09fa9c610a87f48392ac91ec23a6c83336b771055442b2b343e0ec198416e2e5994f6c05042a8e3bb9551040eb6a3a050189536fbf8d0634ca5874934789e2fe10122870569610d008b6c187038507c4e8e6b4fcf1a9d6dcaa6b1896d9fc5bedd208ca321a76fe4b36336863b4f61da711278ab76d6defb626b79432252903b10b710b060b1df5fd258d6f9cefeeee13ea74eac417f593fe6caa92579c19753c3b65bf55aa3cfbf7aa32c4b37b9534cf2ef6d0f4ec920730cfce2e57d00e4fa8d1024b1417b28061367e0d100389cc104f60dc80073324276ce0848e4d67c6c133d3b397c03db0e73997f846f1f5f48dafb1ebd979e9c6b7d3a6a2c5370f41fc0bcc37762f1dafc92e5a3fead0c1098b22228ade78f6d70e363cef70c6a449292008ce9f9d877b60f4637fb1cb0bb257247eb00f61e7f1b1b2b4e5e80a22c6d0408b2c4b31c852450c525664607fa5a0851521aa70c1c28a9304a6a25e08d3031d482162c10d2792a6f8420c196538500322a498aa52e6098dd5958f0b72228637da988194124fc4f0d4c41464cc88a2f484144de657283effd85fecf25a2738b93372d24fef96f8547edbf89e49cb3e10e2ca1345a0d18236268c2e86cec002cd905318549e78cb33d10ddf289fbaa8c18088344a74a1430bb3e97cd4b200441195049534968881092e4ad274bfeff572f189e7a9b770612416a76f44dfc844bca5b5746bd181a69443d2ebb0f45249872de14b251d883e090a292c5981ec05b1df210addd4b20a237fb8659d73dd129f0dc799840247f1359195db706e61510b8bd312691bd6975e10de2e962f8410e2f2e4458d9912c07849e20b18517290c184923f51e40ffbf45963d934ead8f4954f9f4edc63fde8e9615b18847f86913ba64f2d53cbd432c3c81ffee9b3399984744a1f7d3a9dfbb07c3cc8a2832c6a523a4881a102163ca809e286237aa86105be7486f8c61e5cb7c4677d55c4d7c4b1e9f736cda629be26b904e6891d7ad0624c182e3c6961893390727061ea0bcbc6372ef1f14e7c1532617182b3084461098b42941841163d109303251a8c109178c2051e66f032c318de321438361dcd4f9fb37d7e4eff2985a93dead24b5291e8be0c49b5a024e5cb172f2e440d3121a1112a339b9834b80485242c4ed7f2f97414cea0428c2b68087d719a4d9f512d93383843cc94a92996862862367d36cd5a8775898f9f49cbaa1627a4d090e18634a282868061cb1b3d9c61b4a605022851856685891cacb18332ca50ea41081dbc4c3123844ad4c8a4652138020b1829686cfc6065369d8596492bb0a001430c2a524338cca62749819356ec3aea8c9ee27059dd067ce283cb0eb327360ec5363134336a1967d431ea3e5c38f2a8c25174ddb0b74223bb327a2aba420f5fbc326a998f0f0f8f78c35194d4bf70f416676439a3ca193d0d9a591f923ff295549fd569f649961a4ab963d23a469b7e55247faa73a3f875e4a9e1d82488f6351c7ffce62df7f1c9999cb57cbc4dff64d2662aa2d17acb864de69a2b4d2dc3618d1b9866d46f54cba85fa99651bf532da3aea2b58cba6aa865d45544dd026f72f8660b2f7f944c3fdea6a7ac70bc5e387e5d38beb870f455388aaa70e4b9e1263d24b689a1197b8334dbc4d0130778c1c18c439805c217d8385f335ff52bed36e09311baf0a2cc0c8a8de3009f6c5ecca080c034b309334063316ce032835980fdc66fc227498200c2881987b023424133d891a0d9912741b30e6147846e1c0776c4e5ab33b408a3c40f6910cd682030cd6016e8272c04f1836d4039c301ca997c410c90909ab18b1da37ea4411cd005ca8ed9f006941dab216b8d4fcea89cc9d98d0e9f9c3d7172c4ac5dce603c339f8ed1dac4e723cf533f42fd04ea3fa80fe1c8ccdaa587843932331b90d5b001d1ac33f2986546f2b0287ddadefa7687b55eba514b3f4ab9a7ceaeb1a04d9b6e76756dc82bbe5c995eafaeeaa91bf86291360edf9cc1141ca51df750caf3124ff8f6799da5e50d7cfb6da76e99080d3b9aa5c5a02a95f7566f772d0fabfc8afdc98dfa262a5139f5afdbbf151b5179e0db554adae9edbc222ed89c86d7d6cdaf4784fa168ed50362abad35544291f82a1125fc18a24397378e78bd84e0f27a49d1f412e2bc70a9e1eee430c53c400e57947220fa9107061cf6ebc5fe81ae8e45065d4eeae79aa10af44d0872827a65fa46139a76b7993e9ddc3ca6a9bb12a495c9043aa4e957b00416e5ff686a7aa8f9df5d81dd05efcaa9943be42aecd52a1c556177c3eb2a6a4373e8a43bfdc6fc9f6e7ac7a20481d09f3fd26fb959efad4a399b65c3fa72a7a97052f6482ac51d5aabb3286bad3ab4524ae9ab56fbb1282fad6cebb535d46e94deb1f82991afcba2cbd5f5294de21d24c1b5ee95e1c84e29f3666b374859e4100b27bdcad9d647ea55d2ee90522a290def1c83ab6b7cd3f57178bb078e65f652ea7c3b367fa45f9e7287ac210d39a4dc47afa7f2faf0f4a0df84e26bad618f0afa549ed087a863d2f2b4acdb78786cbf120e4738362b521c93354cb10388685cfdf51dcb64120e46e24e7da934658d1f77a8e091d2a9f6b73770c7f216c6c7a1b932f8b8974a536ef0e3cebbf1d9bc549ad2f4d3c79df953983a269f5e50677ef0f4a5d294167e7cf1f410c752caa88fcc4af8766c32b7ea14333337333333734fe168e5b62b391504d823725f49edba2be54ae5155981ea765ed7710ff54a2f0f3e29c5b17a45daa95faf880bea5325d59b5e8f48f5f6ad7b40e9ed19bf9773ba0413030d1f8d46139a96164006474078cde79adfb9469d9da73ab8f8b1c7f37819838f3da5fed5a0c4537f4979ea4e44c653176df0f2d4797e78ea3edc23956ee8c1d3a5286d050d54b02ce374c31aa116c61051c46cfc9ede96257981c98a2d49ac41438d191d63a98a339ec230a36e4212d3a79e44fecca7e1b84446cd20e6371b5d21132bcdd04589861ea4b0f1ec521586932ee5a4ddd36b97207f3f953ba64b70bec5e21b77fcf4e93be40e2edc31e74dc0b8809f5f7efacb709462286da93e7b0f2b95e4aeababbcba8ad615487f7a4554bea9ec0a02d38d1f3c552e89d8a7bedaba157865c8679c57f00a1742e96659d8abca571656bdc2aad797e26edb3a50e51b48ef974fc2b66ef3fa9ddf2ee41ed9bc81d7bbebd2f8e67fae97ef7c1b52413a33ace4b6eebeba1f9774d2a31dccfacaa991db1c08b36191aa82b994bdf45997ced6da2dec58846daeba216c0b8b541bca0b042731804536e132a59cec92597a40b8c8a4523951898aa1974a534cfd78956450e6afa3797fa9444598e77a8a3c7cde5c77d4af5397957675f3e94540fee6d4763502f2bd20ec9b57d023127b7690da903a0d4516a70c5460799b974a54143d37bb76297fae8f1ba8f2da5d3ee9dcdc60d5c5dfdcd6b088f85b28b2287f34b881e3b413665d7a8559179fbea430d9d556faaa4b1f2f101811feea2b9020e8e54f8fc875abc48630ebd5b71066c322e25717bf8622189a0f1f13887df878f1cbc78b7db49ef3e183652024957064032948897a49292a15831a1f2b2d2f5cf9513a3da19169beaf8a9f3f5d47cad48b99b9841f3ea65fda50d29d7209356c34d142962528de7002840c5ab800a206a12231be7858d00394517db17d9db823bb2ff3af974a32689144cf7879100cc48c91861826cc10a3c4017c08b3832967c808a30828a922ac5412160c2aaad4d28452851b44445a64287261d644909103336ad0e2421369c260028a03f01005123ca0218d2cc4ccc6ef990c18659eab544942838c24987002c20a8b461731d074819ae2abe32ccef6db3790b2814ae1c0a16106f7e3155634ded0f1d7cb48d5050d35eecb0030d42e52522aede1d5836772f20669ca0071c50b49300df1850f1bcc08438c1dd4b0940514d5004a325031eae85e2ac980c4732f956410e2479e261515afd26938aa9cb2e8534a0944ba93fa7232cba806dd7af1f1cf1eea63cf9e746ca7dfdea114a31443d14b302f9562d0f49cd3a5328cd84de01e964b3f82847bbaa21e44cf3eea186219f583572d9736f666def8e8c447272165118773dcdd80e30d0eb7d6559cbb70b8ebaecf752d07cac751625df538bc7a44acab9c931e178e4c9efbae13fa2ad78dcae7a9ffe091e7b7576d2acea567ab73a0912d93c774da847ca43b91eafc2534a4fcf4bec9f20a7a6e0376fead7cc5d995dbdb029550e77c7a44a873ce51d03a5764f391824d24e8843e8c2b96cf7fe4f9d1b21e68a8b0f14494177a10c48c7d48cb82a4504368eac88d19701066c6c560831e5cf1441aa82f33769f96ddd8a08b98269c187a7a62c6feb5cc5368194f47c9a8b9059c482cb277e0e4024e2b0133f62171c62e34f49ab10fdd19bb90d00b77e6426b8a467bcd5cd8d408bd20ce5ce8376833ea2ff8cc6818a5c32cab10c68545c45ff92a14bf8e4d0f6228973b2f93485a39c391e7e7d62dbd65a844ba005e49a770e573241e04e5c9fd5a2d1fba99b1787e35debc146a39abbb47197250dfe115cf7fb077a0e70d5a60d6b994fc0228720cd1cc0b69def9d8fa0e47495ddf75e113cf7ff07772c6ea7ce866e609bdc033960f3160d6790b1c62c08cf5240b92ce9f9cd031ea9dd79e844f86b458de854f44968fc8c4d4f9286ba2e7a34fd7dddeb1e91d283bc6d5391de078f3a38c1a65d4b884e7adcfc953125d6689b9683ca18a810c6dd2477d9c944a29b1ac5cf82b79d86aa8a46e5badb5d65aadad95ede45a57cf75277b6c183328e38cdf6811dbe6bc75b7ed966e5c4a29e527b62f570a376aadb2d6f6f116b17a2532bc2cba0c92445672b4e108e5c10ee39b5d82ed0c16e1a185d29a974b24d408e55909c948c9123986e83b3c81f4f1c97338dad54bb9fa0bda066d5bcb7aa98443162e7cf3a5d20b452f410e23396bad27430ecc57bddd5a6bedf65209872f5fbdda36acb5d6d67ba5cb99342fbb9c81fa515ed1e50cd27341f3d7f97fbefc2eb84ef2dbb4d3b2cab33cede539edf4d1b2b5d35a673bdb5acbd6b2add3793afb366dac4f2ba5b449de497dcbdbac3ac41e0dfa58afefa7f449252e6a7e944bbfc2fc128670cfe6638fa74ebdc7cee6e38eb7df5087451d210f0c5ffbf41dffadc3710b7742f76fdfe11ef9d3f31b9caf824cfa15f89b4c352f7f5458e1fe7527f6b7e9fc7dc32672cd9adf42215492260ff942da4a33dddd4debe674b39bb5b576664cc1d4e2aaf868fdf9b13aadb24a19426ff9d85dc78fd66d953b24ad52ba7ab3d7aaac0dc75aabea6ed4ebe772b5755b3f944f73c0494ee25dba9822550013c594d6cb2f4284f1049a7fa9f444d44fef7c5c2f9570508344f4d2e9a592135c9e6b3d7dbde970bce958dddd0de5717883a3cee32092cf847b8cba22beae0b93ead5092c1f7ba9e404ed398ebbe909e17c86a38f9f4475ce5aebecf5938914b5e19bb3d56ab5ac6dcd392ef1f1ecb37279a209272b48b831868da019c0a0439a2b5710d1051851ed2db0c3d1f52de72bbe71124d2ddd3ce66bb9cb59e0c762cb1ba4367cad4904db9c836d4e8db887d560cb6de614eeb19955b887e5d5c6c6adb59d735d0823d2b9e742ba503254d0b35863bb8d73dcb1c0957f41ff814ef85736fea35360b1ba37857b5a36210a2c5622aa100877e302af070487a3b0847b4e689913ae7e4212ee61c26245fa5ceaab2413060c72986107324c916256754491628d2a61ae5ce1c3acfa24aa3e8baa77111f0ebff12f6e401c60e7c337769feba5e35e5dd4c15302f748f7c09637f87907ca22ed9e77a0920e61456c9ce5ed5e082362e32cf782d8843ebe0bc7f615e6773e7fb007728ffd7d36dfc7627dad6ebec772cf7b6e6997dfdddb7b9e7352513f3dceb9e9712ebd96aa7d3bcb37b09db579ab89c4e2b65a6dbf5a01d9c09577e0e61ca8720fc8752a44c2b650be0de7138e119c94d66e6cadb5d66e7eb7cb2335fd07d36fe76999cadb7d5ac60031b3f61fd67d0bc77b6f68439af571b1f2157efdded798cfcaa5eb3a5cfe80f0eda2fce97f32d1f8814b6d06a51bda41ca2c0b756ed25a06ca587b6cc80044af80221a51918f2ecd24f1658a1ea8a461c206161c41c69311314415b9316b9fb4f639d44e553f70ed93bb253eae4125ed361c87bc053996be8d384b7cbe5e1625159fff287eafc9424c2ddf4d3c35518315793681c5212cae8e8630854756467ca38c4aa16562b718d562548b519b964f2a3541d4c41013272c9333266acf448989a66f5f22c5960de9587b4b26a61b2a4c444444f7f5e3241a72efd77e65acfddeefbb62cb4a2063ed3ae81ef46ce1db6927b64cce787cbe53a8517c6e022494805ae20731516298b50957a85183a91cd2188a62d6498a70e8c28a0ec6702262d63e8b5ab6021ce4704393184f10a9612adfe657b6504a7dbbf466a8c21216db85c84f61f2e09b5a5e92a0c2c24797b55cbabc2e1f565de5f461f5faaaab2edd3a0d5d9eb3ba1ead9087877d27eae31d1628728cdd73624807de0ecb5da940712769670375806205779ef83184c7e773611987f0f8746c67405b61f1f50f8b5d5eae7bf8fc7982ee469f3fdd24281401fb9160c2429214be9619f10266a8062f5508417400228820c208286a50e305223ee7ff84f0506dd03c81680bf365d9f8e40f08cf3e8f26104779f669c4944d9a8cb177385e25b870fca0787639655d9efd5a6bbb26509e5b61f9926430eb413396c36c784428c61e34931d9b5ad6b0f1cfb3206939cb59e1932c3009b0dcc691b0dc267c92c5fa13d931962361f9173e095ba1919cb19c15ce30922883082a2e30a1d1663c1d6339cbb2c2eadb39ffc11de7ee796e410e1cc771e436f0d6adbf95dfe4c9a8e3afdd2c7d95afbc3d20aa90a5f0100b257142cfde3e7ced3b50417821f58214b51882b49c39e2c1920d55cce0c0822b0f88b5b408fb1116d991309a48d3681e5d26eab83352e39b3ece975d2bcf4ba72f47faa653a4b1bbbbb9a5945252d9537ab52cb642c849c170de7b6f48a98793a3ca9874bfdc33cef62967d7c437bda97ca38f977e95f8a6f4eee29bdd9435063d6c48fbfcd19e31b961e0fa9a7687b076f9b02072c7a494524fe2427d716c06d52e612d6d9edda194d28163eea0e72492cdb60783966db52cbb3e1b1c9d7b23ce98e3a7ec556141e64fe9019952ee18b716cb0b1234861f64f3578f2f6ee515f100cb23e2af0407d7d22b628954a7dce62acf84a0ef8ec58f22716f5c5dedc7d7bfac129d0b5475a5d4cde1769f8b5e183031c3c521cd8fdd15e27b9de9b628c1f873759d4b4cada3be9c974a5b8ebeb985e835a6a863f26e195ac28b1f776cb8f7faf0f45861b181615229d9583053770926ba5a03da76799628ca41bbefde4fcade374268a6a2eaacc494e5eeab56205991c431f9e3b5d3a712502e1a34dd6f2a61831b0754c1d43179ff7e3bcecef241d2db044526862cb632dfeba5520c51407d372f95623812c04ba518d4ec707d5c892a9e57cf54f6f1f4e09ec94aecf0edb207465d427d7ba59d14dff7e3f74999931ab83065d1c4143718cda6bfa44c7eb9c2431568c44094c410b3e9c3633efafd7cd197fbe4117d5ef38a4f79a4e41732337f99e1f9f5cccccc2c977e74cd4086ef1990f976f0f5e54c8e1626caf82706103a50aa81c8071c8af871e6cc95da17368cb1326366a983252921d432054842cb77fbd502c3b78fe001e9af0a3140388d46136266e61e11a88ff68b441a2478f8f61cdf8e93165ea069ea618aa115a41902075ff080031a6ba4ba78c1341a8da603d1cc93ca52068a2888aed4f91490058c6f87cd5905124e961cbe9db687d08d469734581d4db61904c861ea06c2d2e59999fde501e117183233802062a1f2ed1f7840fae5c50807e800477cf17d44966f777940fa85230d3598da30c2618c230180113346061d4441a2429f329ff1bc83e7ef9999b92be25b922fbbdb0833dfdddd7ee356d0cea5534496051451c6b3bf8cf0f2ec38fc031ea8a1060d98d8e20b22644d8b348048ea92458a3272d0458c0d4f56da7840e83c0ae3d9bf2a587ce145883266d8004691358240428c1a6af8a188edbb1bcd3798a3ef0fbebbbbc51d16a76f81c3a5b3a3a3c795a9e72d8e6cf0ecdfcb459e9607847dbe6441801f759cf1ec94881f9efd45041bcfeee21531cfcee22981940f35305fe06006a920211a88b8b8a287292d6166ed6678a1a1a9bbbbbdcea5b3237bf6fbbd7c08275e0cba020566891cacb101aa89d9f8bd18646420a6072b86d8c1accbf8ee72c377d1aca9b7d4f6dddddd3fdcacc15e3ff6e8228834841023449495a567a5217e08a2e8d987959e9e77e0a1d16842adf280501ad26eff8050e3db2510497cfb15c3cb135366ec261ce99fe9f36db4c6b75b0f48df1a3393f1dca58567d6333333f317de0f66f430fac1a88c7ed52ac14c61a363666ee1c30d5af840c60f303cbbfff0f4ec54bc48da7e7707653eea632be993b295d44ada3c0cf78cded3e604f26f4d0d7a4f1e14cb625edd43e3497969b66e05d66fa496794fdd4e13e89b3caa77b48e55ffbe6ea476baf7fbbae8abb362ce792d45eb0c6e52b49c7ff69503eba317f5f53d21fe6cbbceebe64fbd04005942208b466b99f7c4b1eaf77edfeb46ca375e89f9e69bb386b847f26c792babdd89c5ea0300678d63d575487df52d065ed0c11d5064b14a794f2d73b1f59ea8f7f4ba7d234347eb8458d6451da3755d51771bb958e6418d9d0dbd2716ab7b4f5fbd6b35edb00a4970f2f9e50e8b92c52977ccf782f0b780dc50f9a82784393a597613c7cd0975014ef23c01c74d9672870826f76416873cadc9b55aac935954eea0577cd23909d61d6927b3a607e99f2ee5194a59302294c7273fc3e68293d3e8934a4a6abeddfdbb45255f22b6a056ccc9dcfd73852b25ab207ad9e5a5129830cfd11a7c13cd0c6794996fd69e5af18ddf73bd9161dc84b62196dda7de84c62e8419356e42cf7e9fba6b789fea4f34e38c7a1ace2816d999be39cea82ba506d751d973464143460ecae0bc396fce7b730ecd377deb3832bed17f8379306ffad66d1bb76d2e52aebef9b6b5df101683403b3727ecfa742e84ddb088f8d76f28b2d844078bb36f28250e363edfa8d42045cd773eaba0018d752e079f6471a32c4ea97a69f332e771acf15597657ca3bf85b1602ccebdbd70bcd7adf529371b1d16554eddfa8e287f38b7ce714da654082b22fe1883c0f40ec639bb2432bde39c0b4516b91578844e0671b0f155a7de32894a714f6091276dbc4fa97bf984b2a8306b8fe4046c2eed04b7d0d2e48fa645be97fe41a1bd93fb4b76a694a1c93375c8d974e88496dd8eb1dffb7dafd7bdcc6304c0749e1e3b24d0099207fb744fca7c3a46e7f4e19bcedd0c7d27801b60912728dd4a594fd840ab4058b51756eb94a04fdfcb3e4026fbe8d183450a8e94ab92bbceea208ea98f3e1d299aa7944e2a99da2a6828fa9f9755cc70e6b9d9f5e8c1a28fb0099b6111f1a74fd9d1f08df719261d26a7ac92874576f19d5015e88f77850ba407f7ccf0048eb1dffb7dafd7fd4efa4698caa56f305558447ce9b376c351fc51d644166d28a991c706479da37cef7521f2af077d95a7495efa05379f7503d92d18f4b2b253707c0153f39c826ba77489552a950b91af0a612b5739bb2ae4a097e078471ddf1bb8025532e837d049bf6d70e49141774e327858a49476a88345feeef0ca1dd4b991fbda61d0f6148b8f5d560f487702a46cca583bed217f36a7ee63ce8f3d469b1f7b7cfba80ac11d91c5f6a72a1cd1d76e829c1421162b93f1ada6befac8097dbd7735d53ec550dfddcea59475b34a3d539fb887f35acf94008eaeaff32758028bf5bbf0074d92b1bccaea3d7c7c704fe73abeb29470bef9a8d2799ee7791c38b600ea390f1ca76f2a97411cc848bf029dd4576d9445bb6d21476465c04919f4d38b9a9f23432d4181732ed419e31b75c248d598f4bddf7742cba4daaf5c8eaf954f46e3f978593e7e2d1f5f0cb55a794056d504243f4a18c2c33296b7ebb0ace5edde075e19636f8152c658e1d74a4b529ee38e0395a82a9ada43e4772e447e1706bd0a1c9d80a33fe71d38725e37bf41af025f70f41774527fab41df8aed95abb2c979e9b3a5fca8f337c3f1c5b383f8ec2a827c4003c68d18d4206548066de83843e5061f8e08838c21da68a349083253d46020c3b2e1822a636e30624c0d6380b1c4be942e471e263ea9e485f6e34beac7fbd2f11dd81195cb47c2b4d9cabf965d67bf4377a6f20d147ac167a6f2a13b5bad98c0da9fc8a4190b3667c175047c0fa5cdeeed30191eb9dee104e4ec8661651ac6a6c42795ba3cbd5297dab3cbbf61661729cf4c9b5d1a8252fe5cb9bd390b4fdb6d287b4e254ef869b842ff15166c7ef33d9436f79a3540adc27cb966cd6c9bed4ef8af6c2e3d0b3460c63750ca5286b287d2e65eb306889df9a54f15e6cb356b5eb23be197b25fe0e9b8e63a50ce382963b30b5160f3a9bacdf3ce2de075dced40a1ce65c756b33b1b5fff9b570401bf39b7a29d8e950e1d3b628c99559ed7d519777954bccde0abbab2b6aeaced153865cc7ae5421b1478406012e89c730b74a1056eaa7c4de494ca65d407cd826644ae5b0e14e25c76ecc687af899c7a2733290db0790d12f47aee2208f82b657b2c55b8025f6b3950ceaeb575b6bad76eb6d2eecb354b1a8e5eea59a0afd30dbc141ca95f2820129a80ea824a412473ca986a05cf3e2bab2fddb2acc04cdbba7634cb46bbd1e0e44e96eab282f391d004b800c9a449191bab535fc1941ff4b7b3de0943599af8bc12f183662bafa0547993b9e68556fe4296263eefa40d3056b75b90a020d5fb475ae4e637e75477d54d574da06d63e65b5937ecba9a6505fe6db3537275020989a45bf2395aa7d30ec7f69acc35f24752c6a176d057eb1badded6ab75229446bbab2011bedde491c4c7dd04baf2e7faa87abe5eaf7372365f6a89586f214a7044e8946275417d2642692a588f0853cbd352e76ad72bf05be728ab49bf0d9bc322babbbb2d667737dd6287f6af30c2a720a8063e2e7a03778d063b3c324a85e68a1232aae68307c70832472ce171b25d1a8de664a35cc6678a127589c154ad23630499233a2d5e0320634499176b5167cdc285801dc2e0c05566a6a13be820c34c53a337509944b5e0c131828c11d2492d81427d2ad0d1c7a77d28cbbe7e3154df3081e60429f76a999cdd57dffba25c9d5d487576961274c27fc3be011c19ea93c86ec241ce2116c5eebcf8c68e369b641f8317cb4bbf565826a50744cecfc904a733bb94e19dbf8489fc39227798c0e2741d2c9b441c6bff7c102d690983e494f4dd93e9dbc7f6f249e11e5891fad265d83e6943dc235fcaa79a8694128d77dc1c77eebdc1c73e9f8eafd7d88df24972920e4ca02925833c5c974f7a02be517c963ba0420d389f7dc8032690bd74fa98e38397753eb2649e8f96f3eb237ba1d831ee4211841fef0d62c7a02b270043056a9e7f5c218ab7ce4de639e7e403b0c6a023d552982b2418a96f2299a640fa95f30b692bd50b2277404610390697b7fec50f5eb4314614f20c16b9851cf384147385dca20b2fd878db1e0482a0f042015f282006d648e40b1052cc181e63c41dbcf5108c1188107510429431363a8c300490265289d6c23b993edf7a455c3fc311054ef7f2b0462654d8e4d0e3c55bf784706882dc329bb5765bb146153409d9c278eb9b17c4e2f0d6b9db6d9e904a2548233dc04e79fb804be6ed05fbb9be77bbf76e77dbeeddb6eddebbdd398635fe03da8907b49288fcbc756e25d65ac706c81dd52fb8812d794cc963e552f218af2bb9bef91116f9572192160cdf0d55d85e7a420af04de49a37de8ea10a4de69a576105fbab06fc2a9c72c7a4dd05e9abe0f54e5eb63d22fc5b0823121e6191e753118868c2026a9867e7462b7f1b6dc813ea6091451ecb03ea88e263161adad910baadebb690ea80933b1c0b3c8dc82b2c704fbb6cc2c5887dae1edfba59ebd323629f5d6ee195ebf286505eb32c5e10ea1656c322cfde94d2cac2370627a7777beb48238d6bd37c63f753c753ef70e7474b9039943c06271d0796f95561ce868e42887a2f95a058e327a80485eda0a8bd5e2a4131c54f7ec9c44fe7aeeaa5121458ee66552c3979380d9f5482a2ca8f2f95a098f2f7a5121452a694ef7ba9f4841a0c705fcbc291c9af546e37a694524a2955853764b2854c29a59452dadddddd4d47166e142963d2575fcb6200c22c0a94ee6e6badbfe033b31ee549f557c76694a0990da3586fea1cca8e252001e31389006980d58a86521a40fecae56cf52b18e7d2a1c8da911b519ca0c8bc9165f6a43d0a941d5488514417346c10446d469d99fd059f19875082ae680103368ee0c18816b0980909090df9042c2ec0c739f5ecf30c121fcc45ca6812908f73e9c7c7194601ec399f3079b48f8fd309f9c372f6592465344ae6e334eaf1711e25803befc11b70226595a863ed06f051aa39808f53e811c0c36e020994a4e5ccbe44feac78f828a30ae0a37cdae14764eb6027228150983cda633ecaa501f8e8e39900ae43ca5648260c913f9cb3e8a3005edff396c28efcb13c25d092c9a39d7d6a69990c81161068f900cf049a5892cc5acb56441e98b50ecc1a077a4ca079b4811eb496a9a23440cb000d03b46ff79940d3ca093edfaaa40b1c59e0a8023e26d03442e2a3a965aa220a84e39d40387eed12f83181669523492dbb5246782a023c05019efaf61226d02c3261c9a86597a988d1038c88187dfb900934a70c61626ad93512c2148409c8049a442584234bb56c9b72404bcd5aeac396faf62313684a993cda7f14b56c6bea58038a1850b480707cb52399403ec2919f26b56c3bead8049a42934754cb365ac79a3679b40325fd2429204cf2a95d5938de9e70fc1210f60847fe4ad4325b4b32819e4c1edd32aba563138885c9a31d01440720320011cf138f707c15201cbf1da18e70e4b643294c20275c51cbead39209c464f268bf0408c73b80b03d168ae1c80208c757004200843be188650255a446c20282200882208330cf4808823b1efa4e08820e82605308ce079b9c90a8188a8642d1335740b1b313664574b4225a11ad888e487077777710041d043d04cf08e84e82834e02e8eeee8e850470be63d152c44f67a24914891e01822109207f186525ca8a083972e4c89123470e7777f71c399e11cf91037477d073e4f01c39728840a5d0283fdd0aad42a75018dca9902ac9282929c968041d1d1d1d1d1d9d1c3972788e1c3a2fcf480e1d1df71cee3974745c4747076a0470be0e54d40d286d4a2a8c1c399e4600f94500f9395551952a21e4e4e4e4e4e4e4e8e8e8b88e4e0e089e119d9c9c1caee33974c2717e4e4e4e4e5208e0fc1cb0975a8a334e619a0a1d9de6225574a5aed4952a82bd5eafd7ebf5cac9c9f19c9cd7079e919cd74bc7735c27e7f57acd7f816dd43b34526be9a3e62127278481fc215ca62997e9325da6291fe0e0e0e0e0e0e0bc5e2f7fbd70703c232f1c9c1c7f79ce0b07c7717070a63e00e7e34ca949a3a5b4d01aaf579a6b44748daed1352202c1e572b95c2e170e0e8ee3e0b85c9e111c97ebe538fec271b9dce57239cd7739d56c2015f594050e4e130820ff075352a6a6a6a4e0b0b1b1b1b1b1b171b95cee72d9dc78465c363638ee721c5738ceb7b1b1b1d182039c6f03f216ce128697980b27e1723196a6a1a6a6a6a19beffbbeeffb6c6c6cdcc6e6c3e119b1f93e97dbb8cb26fcbef91fc8441c839f7ec4465cc432d8d84c1c47424747475388e5799ee779def77dfe7d9e8d67e4f33c1bffdce60bc7f99ee77951ef45a111e3a70b4d3533cdc4c1f74da88db6d136da469bb456d7755dd7759ee7b9e7759f67c4ebbacf3dffbcaef3aeeb965ae0fc6e8949e9a9d6e425e927abf6a456aba959a9542a954aa5eabacebb4ed5f28c742a95e79d7b5d384e956abe0ab4327be0b205cbfca1ebc2a985052d5ab44c71f7de7bef55a954ae525dd5bd9dabbc5385f7aa997fd54c5a0f8a26d11c6a43a50aa7af407ece0e39496329a594527aeff57ba9e719b994aafcbaea8694da9a3c23c9a44103a5c5bd617d6a1957d4b1d9afef7bfa7e6eabb5d65a2ba594d6ce33426ba561ad3d6a0f9f1f0df0f3470b5392d1370278e48ec96f417e0ed649967145dd75edaca0e04962ea015a214d660e83d93352c3cb61f7f5c5f1f0edb48b8f9d2b5a21ed68f93edaa0b8b1e11bc5d7e95ebdaadd767dbea4179337714553c61571ac81a438bd820d90e2f41552cb1c2063b5e9cb8faba4ef11bae93d20e86f6cf846ae8836cfeaf46b3842e9682f4908fac09c5494b8d8e2cc993367ce9c3973e6cc99335c70c1051766cc983163c68c193366cc9831c305175c70c105175896b87c8bf6bd9f7b2777b46491a7bb67ebd993a8084f75260fca953b56b282cb4ff9d3e9a43f7cd33bbc737af1b44aa079668ef96041eefbe864fb195e25302261c76238ced1f5fd6a91766602819207754ae799fb3574b983cc386993522afd636e0bce67b0a5b8491deab66debadce53d03a73a5b58293f27cda6ec0c99db1d5f4b369b5db55adb8ce63b5929e3e6783e3c685f30108af9c10603a3944188103bb66eb3d716127e5cfca73e93c3a442427b08c00fe0a53e4433a6d2fa5f790feb1ac913a56db69f2a85d9b3c1aa936815a495fed6fcfee48ca9090dc517d451445f2682519f15407c3576f256db5adb69d61990e00744e00b0b3d219b148ebbed91db56a744b2b00de6a01c05b5cad56abb576bcc54d4db548f01687848484d40abdc53939b5406f7145ad56abe5dee2b66c698de0add5d4d4d4544b046f71535a39bcb5aad56ab5968eb75669d2b460de5a21212121b542f0d6cac9a995e3ad5551ab55d46abdbcb5dab2a50582b7545353ada9d607de5a4d69b570bca5aad56ab596cb5baa34695a37de5221212121b570784be5347954a7968db7544545ad566b7aaba5dad2bab55aad96a675d3b43e6f3913ee5179cb97c81f0e0909a9e5475876913a569d5ad7a9d52a6adda296e7adf6d696d6546baad5f2d5ddd26a6d53ad964f0974a74c1ed55b2e01e001690560ec683500d4bed64e6daa56ab4d7d75900456c8213971481c1287e4f4d51df49c2be2b670455c1157c46df9ea238cd08930c54d999a9ae2a67c751172703ab534b55a2dcd57cf015b85b0427242424272faea3a39aad7aa68b5a5b52a5aad8a58aba22d5f1d06c2fd4035b59ad29af2a9d594af1e02cee652d5546954b595aa564bf3d5736e2c0e1592ca4985a4425221a99cbefacba6f6d51fb730aa22d5165591aa4855a4daf2d5b90f6cf97cb55a4444b534b55a2d0d3fc7819cab40e0380ee93a5da48b74912ed8ee7dd0b7e86eb945b7e816dd2d5fbddb2f4e7fbdd5268feadfd71fd702bba3ce4a37d4097534b9a39352ab3265e3e2ab5331df78a7eed455c3b201b815966db58e5507808f14cb07c047ba45003e522ecf726ac43da2b39cf62081b6343b3ed21f9ee5b48afc21c1594e692cdb8e8ee8d011253aa2456ab8c77b20813626a636a6e44f788665db10149a3435ee01c948a0cd8a152d9ce4cf08482cb3515149514c514d5bb8476706126813da8496d0227f447096f714965926a6aec2648509cbb3bc89b82787b3bc679040160aaa6b7896b714f9039362993d3a9a3a6ada510fa1e19e171912c82e2d9911257f4208c3323be474068a897b72be48206bc54a154bf207842396d5a8282d51482c672bdce37296331012c80ab110cf7236923f1f38cb598865958989a530f11496338da71b12a8424d1e759c6ae4cf8db3ead151d491d4d1d419eec1b18504aa4b4b666af2c7860bcbead0d0521d0ac3f289c43d2d67f9644202552b9347b5e2c4b37c6e913f9fb37c16b18c46454da3a823d6ca65f02c9f3648a02ae4846594a963d599d4a0f12c378104a2509348fe4c6739135f227ffa28eae889e54758468f3a56594e4402d1a5c9a3ba5cf2c11a32817b3a67f910f9b339cb47013ccbbfb19fe51ed80f000944adecc81fea2cbf2ceba88e55673995405468f2a8ce729683e0016125895b6d4b2380b0168070ab0120dc6a3be196e6ab4b12b4f85abe1d316d47be1d6d474c5ffd266481dbd066651bf26d681bdaac7c751c23783a519b50944e5454751b11ba1c4c504c3a4c4c505ffd83712f7bb4648f5ef6c81e2d7df55608ab1c3b64add8a1971db243d6ca576781a0724559a1285794176585bebaf7c1c561826231b99898a0be7a77b3e1385a0a8f8e8e96be3a67635b75a85a7979e1f8faea9095afbefaea8a4655a15648a368148daa425f5da5c5477fdcc2502628262626a8e754b3b284beb2848e968e8e8e96be7a6f607b77db9ba24356e8101da24356befa0652bf2ada466b387a6804d0b55c001e91d8736e9f412faafbd0b07703c9a37a2d52e3a50943eef042ef49ee28f3757d86d6d15aa0c7023d2816bd288e5567794f5f9fe9a786e2dfa6ee946d6a9bdaa6ee949cdb9ad22a62d9003c3450511d387580138a63d73baa6577aa6342138853f38a8afacaa9a1425f9d82fc1c83ec17f4d074422cd66e88636a2650d782e4518dbe4edda93bf59d0b7247f5917be3abaf3a9adc519d06a406a8a4ab574b931e55cad140000000a3150000281010898442a15816a9a2f60114800e7caa486656184ac430c77114020421650021040008000088c88c460087e8bb0041dd44019c20d0a1757513ad78fd76ed2170e317bfcc07fdfae326db4cc947bbdc1949e8ede28d8506948855d812fc9b588224e647305ee29956190426b8be21133128bd303e8078203598d12851a65efa1d36c002d1ec18761b2b43bedca1d445d158bc5b52b71fa09e432e6ace659821627d33be632175c421bea37759f18b4b661453d705ce3d0feefa18a23b6e0ad69001e4972e053eefba1ec881a0f9087362fd503dfbb7ac66040d59de55d8a8ce90c72760c0d80bb015395d39ed2d13256a9265dfd63a5b41487b30435852b4bb6d0b6bf36cc5f04764060e279cb29d04b2b971f6b59fa136ef469b66520f2a9b4f75def42ae33143001cf3f7dddf4d043ec0a63462c2949efc0499403101736db357ff5c16596a3cf809462b113b607ef058bf3f4deaad002a534688e9a35ed32e1c7b211d643c5bebf735302c1c231e394a59fb6bf232f596f98386258a6e09d014d3d856e74ed0a16f535f9b0404b58c57500169422f5789e2c94a8c1912660997c3b45981dda1560723d53a6fc6db5b64f044e51f9721ce8e2650a098c735bb7da24fab9b093256accb682becaa7449700de70a90fc3dbd630a683830e6598ef40c0f5eba93b2978ef2cf3493db1ff72fb81d749a064ec0f25dd154145fcb2a99780d485b3da27db67af68ab2cd59b775be560da7ff3200a21d2a8d766b297a7c7118ed5c0a5a5f7c7589eea8f114f967beb9c269a0bd4fabadf992790521dbc94c7906f917140a0a95ab3117ea4de58fb2abc07e0eb55d0917f8c6123ae6809e6a81eb1881b1d1762615e891854fc39dd0b0d6a1c51eb04c8248ff8708b3a421aba810a0ed41677b6079748efe6d99c022a776b4a423db579adde5b655f2df2206d39f4876eb182d9119dc45570f96e7db1a31972162ccd3a1314bbebfeb92348fbc32ff2f5baef76bd34c2be399eabf2d06626dc8be3e7e4ee83ce702b86ccda8a307b1d79b00ea24a9b07960d8072619f41c24258b23e5fe5d49deb18c9942553ad09c69024050c3d2ee10091198458a06015144cd874b3bff4a8eb57f3838bd0298c3db6ec275c8b0e392202ebc20ff2f523ef763d3482bc399e2bf0d06626cc8bce2e198c8f24fea124deb9c40f48c3801ec02f0fa1d2c8eeacb0b60bc7be232da9a3c2eb23e5c177e50c977ff8711ac7f5cffa391d53e68922280a73292b0a88080758c3ada43482b3ca01f4bbfb7eb27250ebc24fb0f5a3ae7e1dc912b83ce3301001066f62420a237030abbba5329f2b95de1524d6b0c147bb8c0f9166737308879f9012858479c7700bd2ce7fd069f8478f085dc7f4869b81fab4eae684e82ab2d3810b135e18d0b7fa1f35ff8d9cae1f10d3d8fc2001a61cdfb341ed292c15032fe95c87770ceb844655d08be342040ca12bdf2094d1b9027f627c5026207f57508a9543ca1ba64d6f091921d9ecaf78f4a8edb71cdc4aa48d77d68d4f6c3673e3aadfe8198237f8fe62661813c502904b6d16708309162a27acbdcf593985eae9afdb72d9de7e9ea8d9574f727c0d689d98e2188f5cd70f0ae32132e4bba45a1fa0fc0024ed07d397ad406cfcd348760ac686c6e0a812a1d8c268413a6ba0f646724fe333989764d1e16d94fde0e37a8fc3b4d0832a97e7cffd1198a885213d0798712823750aebe76cc2e3f59fc3d08884e569a2c04fdb2f4dd5c11dc329e6857e47990e9e1fd3093aa3da05dd34480bcd5f007f85ce27fa3a2892b7ad82d8b3c0abb004713482362501944e7764cac0e19357c24448711e4fe49c9e3725c3942e5c9690f91768250d0059517d7b51e34ef7c02da03d5b5269b5b21d819661aeb41ef8bbe1ae71a8e2e275cbf4c7b1fd281e59039ff5c647db82e02aedcc12e9c8b3381cdad5eda20018d9f195905596172b4eabd2a0b199d0dc7f6166d35d18f39f995e472ff66c0e288ad4bc5ad36307e97b63780d1eea94ff42bf238c8fbf07e9849d5dea18745bb465e1463ec0585291258da95923c22879d1443814381b3c154b98a4fd0b004b9ed7c6400f9073f475eee4454ac10695cf8fe202ff880ac338a090d11cacc5d8beb9487a70915f8129b30a6187d40d4692259337425222cec0eda716a1c7a117d07b1cb49ef7498097f7b7e118bb445aeac04801fc8f6d6876653ce53a4f6b137c4196a1656f583028db0580dfb2be485ba51b42030c8f01d81a3c6c6197688c6957f46b50260062909a516c497662c6f8abf48fba0068648551c5139dea5fb864acd2894e60e84a8544d4b5a6d9b1d3cd45700f26b8d800959c8702b4a11f9c034c84033f5a3b973984e513cf078c4ef1a7f840d7f35652357d7e263ecfed445ffe41ccca6b08159b1db2b842882173660792d07567ec57e128c0cd7206f3d5767486e6750ea1ec714d2380602f1259859c4c6560e1a4c345abba1997c3be4680a10f95b8a2fbd528c0f3f306b64378a1b5e90f8a32e9bc3d66bbd8ccf33af42c2cc084ebf80095c042262304e966ec0e24d05ba1d6d1743532b7e2f7d2a0f0ed4580f55b3878e8cc32f06b840750725f8f126daba0d1abca32a3f9a833f6985e197e1ec1a0cd937014f282abc14541c286fdb3806a1c6c515ce213e98a5e6da129f3bf8f22e5d809dae4cf135f46643803b6d673ff39e1b195741cfe21a5a2c5dda48ffe960898a0b14e8d547fddda6ef258c17f176614f44bd0a6f22f614ea19f1a6b057443d933742b07ec7f573b4fec8f51f47f90b6f22f62ad41bf156616f443d85b723f616ea19f176b2d708d6efb83e44eb93b6fe04d25741d247d3e66f349edf14c12e3618a44a3f8952cf9c6ba382e56e440b84aa6eb15aa619971aee488474b7ba7e7dda9a8682abafa93b4ad136cb71cbdaa99d45809c74158213295d3b232e5bff74cbe5378a1a3e163c536d1e08731d76df0a83a7e56b4bec573679669fd99543ec703b27defcebf88b1db4f2e51a6d96a213dfc4893a559b07ece37b5ef4832f2dcee0f7120829ed5e7b1c11b876f936f0db341661af5c392e668404483067b94fc2723f24f4beab29775afa99dfac2d33a425f3b020861479a7ed2316591536ee83810846a22b1e4b71743edab6e34bc8ec8961af28b1d546842fc9981cef706d32aff5a98f6dea4920d2c1dffec6964800933253eb67957d2842b3643886371df20532e0141e5cb7f822c15094be737311fb401e8f9124e366c4cc7e49249b634b59719fbfb85d1dad8395365e872406bc0ee100673c7ae6a1285ad3728278357fd8352c127c38f3e9c814ee43a919561badfd302fc4a8e8774e8fda7b249b68550d6eb5200a194fd085646502bb61af2070fa290d9cfeb17f5aad70e0ced796ecb44e4acbcc39de563095c90994f100ecfb0db2e5d5e2acce4de74c16ba4b16cd616d98aaf05607a119d7a5dcfd44114714514411471451c41111226a2271694230e4a9050e288080030e34c040030d30300bcc2e301d9d9bf2888046d1a0749da4f166e1d7476009afe60f533f02e2b33d7f60a2445b97cfc83f570be0311398499bcee12fc6507bb0951233744e4c3fbd046057c2bf5b090dccc748d6f09feaff04449cbdbb45d07c6eb1ab60c3230fcf2752866340cb7879ee81404e567654816792eea769e5b4b206a3f93ac8c40d7ace9eb314b41379bfa56223e6a8cfb73fd6f909feb5c8be8681da87934c4ed22beba6681efc87b6bcd60a554d44a33833f99acb375d9ffc6cb411edcae6b2f48a70f44c3160115e0da3868b893993b25621c780513556205436a7ef2ffe445143f84e6ab85d461333d5c2df7d88c09ea2b2238a45c0e14ef672be8575dc94e0c6a349d0b1d31d4c217affbb103f85e33f35923a9872bddfa2ac044c21c0ff5da89fc0913f999b224cb99edfd6c50d132eacf0d5943d81f3f4c5bf96f51a4ce598ff5edc174cadb39f84a43f5ef23f374685a958f38dbbb9769204305592ff7255febc933f1c3435985a553f829636985ab39f03a1ffbec67f72840a988afddfc53c0b4a7f14053d4c7d13884fbe794c0453708d30255aff45656f30b5663f7b606aa771bcdddcfcc7970579a1e586668d7d30556efd7391fc79e53f1c247530b52a3f02391d30b5e63f07a1feb946fe642e45602af6b329e72d98ca63cfe243177c7e5186f957af13210f031132de70a29dc589174d99c7cf55e864b73a2093a0a3c5c094edd5e695692194671f4361ca11001282749bb00a4f78ce16aa82a9ca6d8c348e0bc378ec85f92b87274098fac6ce83cd76e610d36b35c06b959f99ee8b52e8358ad2fa3c651f2906a662dc9fe51a749dc8cdfb51ca5dbbd0f418d740004bc56feced9ae247694eb2f16faa76a56f91cc2ba9ccfab1e5a76e0b43a8dfe489593499941f920e592c11124378e065b12b5d4ed8721ee6ca41fd44ead6f5a0c774279a7e16cc1121d0040685611e140eee2b86b96c901d83541c35389b053fa00462fc44a4ce2749e0ca913494346e197ba1eee858cc11a4c2958cb42bef27aa70a3a486b427e0c5d0d09f25df6d1679055c2b6fb1c656cbc4c7527a6f8bc46a83a0ea14e579ce60318b00d9fb5def64aeb41819a119b549548fd1afbd0b398f89eb126262677dbedf2cdbb83fa53bd884d4208daae5941855dd5e1e1a9f64c261c93b43984a688236e554eb41a0f09a622b02323f9493da2351f1021a3f6a5655294b1de99dd8929192850328ef3ecc4dfad83500d7c98182be1704d51335e0d9292d5c199c112714c6d2c0aa46ee56bd992fa93402f565c0cd4cb6eb69885cb8b1287681daa1e7077610bfe349f047f035c7486775bac052830853a1ac0217a9345fb90a41c26fe67ad8c25ba0d1347f8eb7970661082fc1fc982f15d7510b8823d02ce83f9c0706e43f7832260d2086841b930b4369539741b7fde38cb17144e881cb80ea7fb6a2a0beb11f90638e0b0df984af66f652f1fe341606e70ebdeed4938a5983631db8692a806aeaf9b5f211e3f6183b36cf4efe4388a9e370a889ab9efc2098e84d3b3fd5ccb3692bcc68bfc59b4aedbc4e1ccb0f63afb240e5260ae3d08248775b805e882e34aa9d63e7d015225c7d5dac6462851dd4d08e09379aaca6decfe3794f6bba9d8b63b906749484818c0067dfcf74da7aa8383d34b3db9d6b2283c6ffa49a0c3009b9afcde0ee5007ced4a8ce6994292c0c11f08ee93a27b426514b9fc33320ceaa29dc877825ba8158fd3ff7fb8b5350ee69d0d6230a7b0cba39bf128d50aebea5c7b46727983d5a8751959ad6b753ed6f6dc9a28dc69c492d8e19232401703ef3e22a3b26c906e82626405244ac004117b546743760759ab5d0e1f00b500e9ddaadac9b3dcc4572c26790911414f75faf5e3432153e92ae33039442820c19bc5bb74ad721afda42e4c8368a2d3b19abb309b1d88185e8155d0a12e4893302c1909ab6a2d55a38c886b8b7072478d66cc2c4906450f493ce321ab1fed527edb42d04c532dc4f7cee1a49f5ed74b3a5a7a4a892cf52fd70b3fb61c6c2958899daa8936ed246a2bfeba60c755cd92a3144431455a2b2006748dfb81e44a24df4ab1e195c75ce5a04a12a1e15500c12af4f36aa652c2f0dc17a014c782ce93b0358e564af60dc107b2b958b513af001118b491f0e6244887587ad71dc9d1f96e4a1d816065b1518823fea41da873cdb4b6cda4ca19c74dade9323d43272662d8e919145134d084ef45325fd3b222005074bd2de610c13fc0e57b8c5800af371133fdbf1e1e3604118aa248d6d062628772cc226e9e3f2183b4c4d72fb763462244d5d330625a7e116236252067e7016a403c6c35a1ce837e99efd42ef9600cd16fd6f61421b27691a98dc4462d5f7505602854af41c49af47b8bb01d1b57f006d0263508950e8d1f3b0ebca5a933daec65a0a420054ef421ab0f3409ce73c4dd0a1cf8e52b5bdc0fcc4eebf30af0357859856c4687c0c276642f4cc0245398aff8218ddac04d6c056a45e5a30f745618c569e9637eec206a634128263cc15efefcb97783f7e8a61331807dc9e5c54d605120319f2a787bb8310a37c5a73faa9c8ac74a18f452236d4a4feb9eaacf625071b452f18455c3b12155cb245578a4d0b2a17dcd8532c3dcdb876705a007e6bccd2b29877858c2f1ba975bdcccf13162277961971fb88f2372832be292b1c401ed2416aaf50ac235dbd38f05707e955949ac8d773a2545c7d172dbf775d5ff935f145002e89b03d44325744ca229bf7f36278627d7413c7f359830f462577c2be4ca5e13a3db3aeb40900a2cabee9d8ad4193dbfb0d594a0956bfda570e5f64770de4e3dbe395715fd65bf443f3ceec2155ddf9c49839002d0bebcecfdb167423bfd85ffd6d6f9771955a6e094cf8b101455a6c4c00b6daa9bdcc6f667b516e2ffacac088bb948618defff853c2f7e238608ec6cd04fa45083f109dea787a0bcdad48969e29cd24b11f161726ac346acdde2f8c05aa7d5fda1eb1e53698133dd710e0782467cccacee36596132cb2af718b73aea1e81727954f4884c1b276515a9a519b1223878638cdb7ccd3bde81d53bfa8c415e03f3e449816b57dc4e2d2b5deaee40655a9778e955d85cb4772805401d915cd310ecbb629465b47e5a4b68b2d8235bba9b218f439fe0e8aa5d4acc77f459a3d3da2f2d82eeb30e43a76daa7e046ad80dd13b3d5fc4e3b057cfd3e0377de6cc520f3d4b60b4481a183adf5d05aef428af8ac9c83b359a35df10816bcf2c9bee8ec8fb7a2c556ed604713aa351c646f0c8b069da194bc1ac88e095925744d617c93c1aabc363a1df4bc14bfa0354879cb3afbb1d64fc60a49407e8893c8ab65dd96390ef35306fd1b9f4c81e6e40d22d5dd57c80275f4a62ebd90eebd4835d87deabb242b1d2473236ba5fa39dfb71593445f7ad188b9af14a29876563221d5b5b293ad66703580def4002f429cee939501b66104dd2dd4f7a023abdec254c86d2f944ec4fb021c4d34fd63b86652d38718b6740f224ff62ffaa35c458be8c3d5ac0e54dba392deca53286108f6d72cb20905b11b973c4ad358881d04cab42c84a4f7b0687a61b225f06cf22ef33e399246cb3fc36ee0ce418effc0c1b9a5e019b5efea3af1f0fead29229c6b7062a8ac576d1b4b4a1ac8d724c28bb7669e69049f8e1f1b73e4ac044a7cea6920af712b20e24135074dea79d81b72639e8a5dd08d523dafff7de456d6cb95b878e33facd2093eae5c930f220151a0db7061745eec3c33ea6f1a312981442ee460685e6f8fc72b365b2169a87cd4b5e3023d61e11d098c234bf865fc245a8258ab3164c004461577629b61f4bfd73cf28e5861df6d6202620523ba3bca2f59c603fc45f17221e208178a848ed13fe6d61a538cab1133ff74ebc8cd08b8b4ec4cec419db2851f0fb95ed858d1cdb030a71c48d9220ad7f3665c39961fe9ac3cb8d224bee072b08f400a5b4802cf6df830468f98c0e4a3eab609b201cbe27a148a28dd5495262f400dcff85c13950e9f8bf88efa268dc182e2196975d1952101e1a225c4a55e3d9580a7e87a96c183857a18e8213c8c9bb3fb81e3b4fab4305e4608010dc3d7bdc1644ea8a1c25019ca2014c89809840b73ae9807e9c4c6261c2ea8f40c409001eba73a17167da08ab9859a0e195115786ee870e465e71bd1da9fa4c44d7a25c0caf416bd80a594b3f2f39ca1de1bd632529e0f107bdd4b9aa322c762dc05a99b09e536ed6c3df7f77d00de6ca1cd4d1a7b2cf9abe939281451f8dd15dee5b30444d5f1fe218e1d7cc0ea3e348b2124693f521f05df50e499b62e87db1c90417605b8cfe29431a30ebe32c5a2a7a7f2ed4495b7c2f546bba96014b20a8a9be613ea66b7dc4baa431e19f183e79e924f751960c1a861ee3110cf1b4112d0e2f93e849555200cd62803cd9834d15a65a33169b3392bd906e3201b0ce6a0fc02197928427728e4f437ccf73f6efc33c1342cb75587ba1523b1ab423566ba12013604bcf1ae9a16a1820cfc2f5848693f358a2c2a6f24e0f2823e491e03213dbebc37fa90074d8bb5faba6989602b151948f842781cc09d32e7d7c4d56a6ae4b74e8bc0cc7ead71c42aa9985b50a69f5c75d0debbd465e75fda566934fb29afa4a6f071e91c03dd2a0524f8081e33155c5b6c603f78e9cf542a7b43c8e7965188f0c346d8774272a2eabd95ed854752421f31283867180b91c078ecef9d98255282a813a8969126a16c276e0042e6d09be12240be96f6298fb91573a308738f36f3302bdb2dea0dfade4090d0c0e9f704e5855ea8ec1f979a774ef4cb9bb9c59940a56441cc926bc35dba071d18445864cee606ed06084dc748e4513bce2ce43aefe78479b2e788b057b2400f6b2eea3f8bbaad7d0ded1448a8bcd57ba22e30628435780fadcdb8f0886938ba32e6d14431236f62b27bb595b9d831fc036723107d7b93ba84c7faee3f4f50c7b1c4080a1bdaad21e122228c0b048efc681bd3c7fb42b0397c78723de1bb7da15c3d916023eff8d424b24f3a885c765eea18aaf833ad18192fd78cc6cf781c927b2a2fac24a17bd0bf121ba3e0fcdda589cf9b49a1a40fb4f2108c0f5499dd053ebc87df743ce863b91c644f8a2800e7106d3831697735e10cbdab7e89b5ebfb03b7726bba648976c5b54f7203879ba78359249d1f5008d5bf69d2e5a4a1f00dc269805176b63e2183f970ebeff98e83dcabd5bd664682b710d8d07deecc21786c4f7997dec82f4ce3584114b339902d2df2e4a2d4ac5c35e3d2c54eaecec35706e350ed3113fbf3f358e21b4c5602f11220164705bd2772dd6e6afee32f5ba4009aef0b19cb3eebcacbb00ceab492b4278f3120cd8d507f53877a5e2373e53a1a0b69fec271878a67cd89e570b792aa4b841ccc8ce47c57c5923097c3eddc2a3c6aba6c44fbd67556f6534a2a949f92cf3b5454b61aee81f65457d4837d5ee6c1f961f37042d3032909047e80407129604f2430cf11200630fe68c8f48bab91df8bcdec6d13487a033a9ade0799a89dc2cee0a37e799b4365d7efda3f55fa7375b733531d2fc24fcb072d08f65c85abc885df87d0ac6ee4079b4c17b738102f5d456b09870700db2bd758e8ad63b3633b551ec291d5582dab9f301e704f789fc0dd7c365c76fc5ac0bcbc21322cfe4d7c6c0541d8f89d33b8a2260b766456e5ab6e4f56c008e57ba0406c4b36b253a4bd5b4ae5a22c377d4b2bb86179530d3fb1c022d50bbaee308fdf8f1e0b4bba1798f6fb7db33cb3917501ff0581e5b05fbb010e5db3ff5354f771cec5a8c3b82c2e099bf2acbc882c7c556f2babea491786caec48456f3924897e049d996aeac94833219c60f5f6167a41f96b83bcb9ec775a3d9c1eb4dabdeccaaf083fc277a983de911c7a065d014ad22c07446cd4431838ff2ff66f5fed22c6a23a4ae5cfcde935e50128e700ddeea4e42f6b6781eea26bbd38b73eb6e2b9cf8ae547e03adc51ed270b42115e59cad7ca8f4cc734f87b80d51847d8047ec3d91032459ab769c9e9020c6d979ec27bd678a0c1fa212779661d9ea4ef11ae759f4dae7560788160959a1931ed60720815a96d65cb373185cafcc6f89529f37d52f44f516466c9bd7ff0e2aaa79cf33279412da95cd4721bb8e503f43d36efbb932d87a3e02c7904a492fedea1c2163ad6dc11f6ddf273922c63b159b4391eb1a9e36616202bda16ef22c8dfb029b0b9b781e4c682ec11c6d6c66a519a9545ca9148f71cf35c6de923c94c15b9a240f320aa9cc84919fd6219f1aafbd5b09e5c5214be7b184a8d9b4746d5a5426be48104e92e0ce5196bd505125d4ce00a108aafb0d10c622b9be4b89a81e642970d8324049dcb92ca74a832966089e430d589047ee3e059cb30053baa92e5f3f1537f791099a374709fde0b13c3a8673b36799ce7ac574ded27f1a904f987a4b2d2a9f9d8efa412a7af64eb0511390cd05685ffd8662a917d870b584b3830a0e8cc6c8fead192cc84d1937f3790d1fb28dcb0428c779b9f6f2c2f5929e8143906c83513e3b288e1edb3f6f7101733d892225a5926817b9659f1eaf5b137afe5013c7b321c120ff767a7a119caf4914e71bbc4f024346bd8fbb42de110cf4d7d0e0e226f496e8227e240eb760d5dcd536aa15de24a736770d23baa94ca2d615c10678a83445f88afab2956995676caa1e9242da65f5be780e6866b579a19b90b2fded4dc36cc5cca9a08544f76d063dc7ea18524f5b4f4104757de354f557d9432934d1363e92d64922cb090bcee15af28325866bb00233d8c1545cc8126be20aa841552993c7c09e64f597fcc32c505f2ea62b95aa2f412c0d549ad6d5511c83b80263073e22a29465e1c117b28033afb70b0243623f518719a49c3995912f789afbb1c71ceb1086da63fbd535b79f7fa95d7b9e60064896459a2af500ad60ab79aa4db2da59864aa947245172901b29494886ac0c96bee1ec1a0f4bafbbbb3317893c0a84f4e13463f13b94858a71320a931a639959d5a1a952a1f6524d7d58a8a9f6d1568990d6a3bfb8ff71f41e536f528bba9535c010715c97d48d997fb9100bd1b958fe6f3db21d4f9bcb75e66e149e0d3e378e57db8172ee23e2cdfe0adb9c72c4dec150cef316e81a635423823190e4a6d8f0decb80493b6bcb0561d19a7c1ff556410bf9b9cddc8e43b1a543350d1750247c48ffcc41c1a1aca038b4a3a9eff615ee8b624b5efaa4d5619b6a3fa334e8ae22c283a0d4c205a6d329b8a14dffce7377d4005b14f06db542841d54fb70e6d550052b06c4f26c38e3b8bb8d6b3be189b29a8004ea2843f1365211050201aa5661c530d620c4edb1f19e36f5c8c26aa7ef8607ad1478afc342a6f3389f0c1f118da808aa714989ba8f0963e087d4abcb3af09848bcf729fe8c110e340e5559860e0e835961102bfd1117d405f1fc6c321be592fe7a62003cfba5c71c14ee5ba67a24f322320b7e05c756908c17572fa9b93ea95c39313082393c8d25537d933c169fcd6b7e9b5bb4bbc941a93f7e7ca982b4b641279dda2df727439b5fae704fe0587ef4a59c4a5cf1ed74116edb715cc09dfef9476726cd389a316473327cdecf27f23e3b640797a8fea54a9c72e741768d9cff5f5140ad85be7be5966b16485e35a785380cc0b31c43cebc6c6642b0801c45184cbc748dde9a4647b11021bdb6478b56684671b59acbdd427232118e600297e819bd139452e4f537117ae76b831daf6ca9efbc30a422131cce67099244f042e5d2a297a03c745e25607458c614b13862485f3f1404a26bf5b1f281338d7da40c8cf7bb910481f1608089520d382c4fd1813fb2ed21ddcd18c01223c8056a3d28a9dc83b022e8e56fd3d4bc5b4c411669a09a8a5c904489ee3509361f6cd6a3b7d8cf69007f14a4d2bf36870901fadb17d2941bdf7e323a24d2d115a075dd9f0c1da917eead8e877280a27e3267ea07d8bf76d01787ce0fd10572a78c95695cb70e7523a4bfe191fdc11a44c9d80bb7d277320b931af272e4a33be2cf9c367b681ba3512b23105b90389963243356ba1dacb2696c71400cff6cb527a6192bfa7cbc85842c39e3d1f335894e9dc36e64937f1728d1233e544979b8dcbb69f6d7d9d7dedb057e774ec6ba777e88e451f78f9fe4b54a74287acec44cfbecac1be4dbb82da8801bd99eac569a3ca02a754bb17d833dafa89529a2b134af7c0de97c622bd2ad9299427e9a597a6eca237116c714ca5942b9221a7c07b937ad098692bb073415112334b23b188a6909430289aa58916a35be8d13f9deb27a568574acff5878fb57e602985bdf592b8197d161a64d63923695da97b3fb854b4452fe2ccbd5f40a9dad5ca7d4fd7bfe6a4f7f4fd626963576ca9d7e13c9f4e554add8db3d33d1dff547aade7a0a8a5be460b84296db9f22a48bbbd8076cee8954ed5c53af7e247d50c3dd10622a4e48066a7b2658604e1435612301a03467c9127b89d9eef342e581a3335569776880be3f096332a7ed8f50c86283795f7a443c9e0b5544a151f9973fdc4607d40221e1209d8123e41af37fb93dac1f6e8c2b17c8f202a41857b836747265aef83829bb10ce79da6835d4631a92ba7f2aef05f2b94ba8ef10361880e3671e74a6a01b593d32bb027330645c0476d90e8a5c57964111b08d2c5f69669ef7de71e02ea71ebec687a2d28378ba8027b745dbc4f000026a398413450091c0075cafd64a93359eaa9fcc5e7c3efae36a64933d03862fbd05eebe25d9731c0e52aa5ad65a10a1ee34503435b48c1a478a899236c7a156deba3a4eaf62efeeed993b78e0b9f7421600be4a79158e5fc970bce4b9db3db339509fe4cf9eb3be7513234ad629089658ccb779345bbaf38bd5875d1ab42c9a5d738c6a3d52d1b5e6dce0a74bbdbba02101390082d01f1dc686807032881020198e9579566112d83a5eea5bd0e59a1ea4b66067deb072ac8a72713c073e28b6eb9d91682227209ddf4e716d0b3d91cdd3fea83f75de96bddf38a374778c73fc5ae01f5e84406a643e9230b163b1ab4f06bb88bed4a9c3eadeb7b7851cc43cc81293b09acb37dd1d4334357dae6555b0dbf3635160626e8c39f9ef7119b8d768aa3f392423d26ce5dcbeeca4ed131f6512092abe123805bc2392d8b4f8511215281de2c97bb1440716cb2a1d608680c9e399863368bdb3c77f5ef04809d1c65f40e334e3646a51368ff62ca34286c26464a3d312d6c996705ba082ba3d407d83619ec44271f7513bd5b37af9ef4bf628483d8d4f906906e928fefeedc08c38218f03eb1162cf3b74aa64a473e198fd1a71ba4d8658e7a70bd961bbb43f5e2b0670d4960fdabb4f8478a36701a9d0da83d9d9b1dfec42a111ae82226682e9b61e88f523b197a9080fa70a2ac3dcd48f88d3e1f6ba9535c3d887efebbf17d8071cc05c7df5cfc9d7904899d5baacf4627116fdab7f47e2953465c83e406827ad4efaccec36ebb28c9ee4c43909970df2b951be5167073ebe73253f1b4526d7b4a35581b6fc3cd95d964c4c31dc825f04038ea071edbe8e6551f6407ac8b51a7884bd71e4b067cc8b71f3d961ee08df4bc855e948c7ced21f264def48da6e01bb650463972a0d547d54849a09bade7bfe1dafaa82483ed5a3a942f0da51153ce4b4eb0358b2b3ba0722192e288c81b27d7ee4c8b91677df024fe36a496cc57092ba9ad61f7116f4ac369c903fa7f83038a4d11a66620951a72254b2062b610844f9d0c8c41166da81439d9c55a117618c927f21693cc8d1c1694111845b67b54fb18d109aa9a8b2b67239d840fb1e3544d2202788377c52f12871355b55f93fceef2d60db270a13d093f823c163f79ff3aa90111721b765edae78e1db65a3a867dd0b70f9729c689da3f98bf91f0d6b43904b312e6cc7294f8b017f5415618a21cb2976697dc45044fe6d1223754fd34ff991c4951dca1e4202941d375cdd29b7d9a8e6459caae9b6defab3141bf3ebd762df91981108d89c0c92a9f6be635bd7ab8a08ec7a90196178a8cc8c5f7617d0181aa240ebf5e3ee1539053d39788943aa4662c98dce88cbde82118737c5e46726c2ef70ea97b3a64f12dedd68d0dd9db127937e7e6200d523ff0b0c4630d20dd7be9a65721c371bdd63b1ebae9cfd4d23e0e54caa004c8583ac21ac09b2c299eee4e7aa2d2dac7f684d6b88287b9fe2a9ef09aafa95e45eac78cd25bc19277a653f76bd09f07a1688073d6c827b27ca7a04320fa702b50dc1e629d8201b472c98c7df2599f659802e705040369453a6bb66d3d5ef2364c5c1d20d87612f02684bbae42de27fc4b1b8564a5bef3715c6c935cb9a96aa5ae7eed6e5111307c63e82fc12ce158250694d712c700d034f0f8958c92d9007d895ee7a33720fee16db1eb9ae2b5c5f60d36d057503c4390239848ca60b2e6d8068c4710c110b16143a1a5df0c8805f05747e35aaeb3cad49a64377625a67cdca29f9ae24768ab0a6d872c0b108b589ebec1e761c1d4a515ca7a523f80d75ef3aeca9052b38dc88bb8066d053610f211afe0293e903a0dc2fe2f02518f6cbe048222beefbc02e73e113f519761d88fa92f54dfa48f44d1a28062b566a36a38a5abef20444e2f53a2ce63d50e86fdc7e1e3ee61cb9eef8b0cc4558fd896355cd2ef1a8333fc78df695e34e202ab60ddee801cfaa44ce455dce96226d7d8f54affeb06fa226ebdb44122d2d7616bfaf04e33492ea29dd617d0b92762bd52008c69e54dea23b98261d7740dc8e141622ddb0c9f9f0401a8081f47d202a7dba51f52a9cb643ba079e3d22bc1f77f08d36d78adea371759e9b8f5d6d60a4a41ba7b332d2e4277e6a9bb60a6f24e91006c33cf0f9d9fbcee1bf1789a02d7ffb15e82294c897d2013b777921ced3af620c0d380fd6c9b62f5d53e776eb568e75b5261276d86d9747a79b1a4950f597c9cd9651b1843523fbd783db58f073d725c08ca8ce16810b5239a287908aef72b0378fceb399e54337238b1d172c327fd88a287b69a34625c130f79f0eb59e42150df0ce6f85312556f56eef3a4b9fc6961e9301e308fdfece1b247844839e32ea700b878c249d39da32d6afa2547ada24aaf00b84ae468f5dc0a57610d0e6816f9b72133bd4da6b5bb4e2ea8bd99242808b7698a46417166a573c0eb548862e5886a8620de164cdde3b53e3acad9beb85fa265fe43fa75479b6c0b95468b8e7775c1800fb3038445ff331021ef47aa12120abdf46635aab9826f56dda0886302498da6836d6198e8cecd21a7a1c3eb0eb55b2d160b527a44febfa0ea245461d2238eb141b379777baa65d6e5db20a5240104875d38a6befaec5f5d1116b3360922d76e30aeb6c8d36329e58f8fc4596760b22f20e76210b62f83ae28f542ab72ef6f550b59dfa69b5215689d9a6d9a54ef744d6b98d5cd14e5ac493f3dca6c6cfab24bb4d97e7611051061a21b644fa88a622dbd062b0a323aa2b6fc588527064bbaff2d3a154060e02763e88800e62c10826fa1ecc3fb3467edfcb052528db64524948407357de404e75c9ec866fc95a007f97dc718d97600744026ef4447103f0ae53406bd2ada50511e66e563121eab3505f133539894e8fbf9d4546b0d791698184d818f531b80d20c68fca52216489b5b9349b6e6568743eb3e7c5619647b31fd7054791081ed3accc92adb33f08d1234d766e023b275046cd760713760096f50d20239e0d12e794a678ee86636c09b429f3d043456e1c7f2a8637c31c25f5b8816d61146d7a8102ee784a9386adbcadec57a67bc9e479c1afd0a90a2d12b00bb7b7015c3ea754c42968c5672ba8df2fb50ac0ed37d0c86158fc3bebefdb2c6c1da14698bcfb3be403bf425c0f56853c2c95bdd38c54c53e9bd45abd6864c23601335a11318ee6fd226a79f13b44c732e2d562478a28dd4b9650f4165e991ba19a8e50f829b330a85026a5605b4e339c1efc39f46a41f4f71c5022f8af2458d0a83e573352d127ee28af43509250ba5d3d6f226528bd1e1e46e430934b500594da10d5c88723ee84da365303194291051a3650cb094b3cf33896bd1ac9d65aeede9d48cb3cc9f8e2f70ac3ad65a64690d951167b83d07a970735a09935396e76facc127802837e8239b1302407ddd7fb52075336b6673db8c0c836ab91999de310a3e2aac5bd7e4d28dce4bc9ef1f75c904e905904b6a1a562a983f236fc0057e5af655757dd1cf5991be7681beba60165f33f6cd74aaf8c339b9eb5c1d1992a57a4357d81e8ec797fad7fc00b8b520fae0b0b64b908ad6d391eb26014f24f67f62e11170917d782c1e3b967045773cedaba7ed4bb2907d6d2fa917eeea51de0d1f68077ede22a5497da6f4cb14291601f9ca0c4ff9f53ddca62c6e7232fa83c644d1e77a93c2d300c5a6ad30cb13a487607fbf2d066dc866458cbd76b0f42a395f8212dc93f6e6f3151246a52a97fc7504b3b590f5c094d14df1017ae552bb6f891ac11832f735d12c0fc16c014214393afb1734534853cdbe9afef12f45fb1c2a02b06e04e34e5873b7bf0f7e615bf7c0772832a5b2d78f2c31b5a03828d4580e3e7df058987a8fdc1bf697e34384a2e44b97c8f3d4a3082e740978f280a907944f2884965ca6bddeed6380ba27c36c372211033e226f684a594e194901f2c28b31274cec2759196fc6172007b8f963d955cdfd085814777c523fcd31e852a41996f261c0eff3c24d91033ab60f8d6410081a27f20c6f88dfd9bff1b2315c3885315add384da078b45c9f20442628218803e09eaa29b1a0ea818551cbab48dca83da4b873f89137032375cf2d75730103399d50d7e1bf7be1a64dd37fb73b75a1275ef11624263e7e1f5be5c3458409fd61b7907fe74a9d1e52ffff3ba2ac74a38d42792539b4f5d572c7557a31b5605e57b865cf745f8a3f9060210852df96f243bc8bbacd5d7b197e643b255f54d59ecde6313c1d41f0896240c06fc235249051526a61dac7a174e270ec0d35650629a655a56a7d3a6a6dbdbbd786937f309a0a9ead7914791ae731e9eb39d077b7c8546487066876f884da3342e9841c0ae0d0606d80b136a3a453c330729ca81e6029a3e4200090c40f51459a74b515a7ace3d8233163054dbce495d5edaab8e2c9b9db12ed6ddfd7f7d9bcecdf14b69c82d31766a5c0518c78848063b7ff1bdbc1b369cc030cdac3c3f3403145ab4fc0988123e2ba4a8bdb1fc8cae9e0ef701c019598a317774b916c5cadf057d193834c1aa485ffe85b7b8bbede8e81af558e41f74607617b2fb5eb74a8e9b1c312c15dea2880c3606f1763bf8ddf97ef21861f98a212c7a5627566fcb14beeedb33f992d4360b01bfac8d74f1b2e426baf1458b5e8dacce64fe3b575a17823f06a0accaafcd45788b1a7dde2f4d99352f169eeec27b81c3a2a4576900be6b3279979723ef6372d8818153d15ef3a2d814177020b0070292455a9cf6ea317e8b0b9e76f572862bd0ab94c094ca8cf4559db6ec3ab5e31a49a9cf544ad12d00d1cb340741e08cafd3817e924add50e85d378712f839e92fe6f482c077d1f56eecd0f91ed7fbefaad08f1a6e92fb2744ea20572f11eae1f5a4761da9601a0a9cfe2cfb01561d69d1bedd269ca6bd943ecf2df4a505abe07d7e2e4c4c877a7ae4104861d91e88fe797d7f5e5d4d05c877b688055a7b6714b7f172a536be432e37654e0caf9d8f0833bc552b14bc005df67b3a62896aa673b21b32285a3fc5d25a1f425c349c1352c3bc010bc044f2b2d77f5f2ef647bd35ac6040cac41d691a26d4c35f43891612f9322b1ce80620f94b019ac9c796a16ee827d369011c928117897aa1fbbfa99ac1f6cfd2d8782308a5ffee3b6378bb51ecb366de6d24f21e4ff22eab0e68c6454e68a53cc1979af9cfc042537f1ade5b7b3384eee84cf94c0ba2b07902743665bd79e104aee0a14c3047c6f3403f34985a3eeaf27876dd7fd3cadf94a408af9a36b93e9606429412a7b09caf5a5ba50c09e9bcd0cf6331c3e19a65401a2d286f17a065a97502e9da16470ce2f3ec4075bf74f3f0b5e9e84cc0c8c1efb7fa1f45e1321ba27a392102e410225b8f3487e44bd6ffdc00d76aa47b97fb298593c6b15a5690b05978c96181fef187e4b98f39a30a7db5d8e91a376b06fc40c43a903e4886dd7b448d9ccf80e49bc3a00956384e46744ba233addb8e797d3f97e6194c9c1f2313b517127c490bfe2929f4c87847cbcbb4deb617e924409c1b906a9bc2e981a7cede367cc77df95099979bcf22c27b9236324da6ea86b751b49e48a41a8be115cf0e52fbef944b9cf3852967e7558521eb4da569e102182829da45f28d98f521a8167fc28616f1f17e3178f9c74e08541963082110030cf9aead6cc0e6ccd551273cc474ac73813259d321aced460324fe0cf2639a9ee4b8e6c8de439135c56c9f0c2f889229a34daf659194a9b54f22515b22986654618af634ca028b9e71fbbc1f7a62e8fc7b7d8dfd0a2dfc8d3b9878bf05f91528ec652fba420b25d4e85cdbc1ffded5ff31dde3240ab1e5445628622c6869e6be99bff5adda294493433f9fe30333846acbb633f8d22f24e75feb7d9d15ae63a9f37713f24c199bff4accd31c202d9559f3b91c809564108805b815aa8cfce5a0fb2703e0f36289929e3b4771646ee2c64802123f0e648f2b43daa95f10b779416b10c3f9091fc3d4551edd10f7d81c8f17a5b75f54d2c8969480ef3ce204a10d6c510bffd369007f24740a710657118aec23da1b585dea90b85a6f98b0ed2121ca52174c0e930e437b071f54c71c0fe373e88b30b02a0cdd0beb3f830315b3a1b527a1d5d5513c369782e82f63c4c98a190093d3aec9533cc98b03542522a24d0ea3ee570abf53d6dad14c143775e77bf1fc33f895d4f06e5858e502711342ddd66bc524a4701e02dfc3e711586fcfc45ba428069e96218eb1aee340c412a2fa44b18ba51ff23406d2ebe40fd077b353cab950a5e3bcbfe4c06d744676f0ab201274fc5f366f9036863fbe8bac947a1b633abdd3d730344375b47ac4b27d455d119c915ea29beef30c0ea9d3fd1f60e6c9aa4fd3db165e457d3e468c08a879acfa79455b15da09798ea9f2663c5b19c798f8d41272d7b7f9e9fa939c020f029c9e3a9012160e58abe1375c6184b0c77ac0e281143d9e098d54bf45a93fc4b075f5d3a0374e102ba05facc7910ad40602d38081c20de5ab5c0d6fbfa6ca5076d20f8bb4b0fa434ec17840d711ccfe42fa56766829a713c0e399aba47d551a005df8e5b63c7ff2d146af92e2f9d7c8b524907ad332fdf4571c71a758142203d4749310561ace1e95efbf51c5a450ad37f7c3c7470cc502fc04b12d1730aef3d8ec6ba554d9aa5429b9381c68e9ac0d96e20cd54505b7a50bce67ea68a6fa3dfe86c3981d2a1063c1f71b117bfbe32b59d03618adc19e2a7b9514812e5488b5c85e22245de0cd4d1fc08d920d50faa609a96531fcddf9dfb993f7634eaa7548604e4a59209b1f777a08c7e6efc196f3d4fb52a2e83d0e4e72cc74e84a76a8013f6bc8ef1bc01edc7ce06931ea6b0fc9ea6d4df4f30fdd5044ebaef98f73897883e41c0885455c242a9248fd6cb22e51d6dcd98f8c03d5e52b92fc2e86720fd5128be0c1668f727eee5428397170bf912b6722a9d975cbd4514e8a500043603d70d39aed138b497c66c98014223060bafa696d4f9242e4c097734d075c8ce1bce78fcec5822f4a156719ea71619b6e405f043a357c9213bd20e4b8f8118848da1d391f4b74b441482243c9d7a3d7c9db16df96e83a3f99463dd31dea2720f1bc83df032a20f21f900b9ec69a0abdc3adccae9ca59f105b1bd65dc917c8d119a61df906696c61630e23a97c85a848cf785d43422d431c8faf4342bd221045bafa2753d2ac989243135161dc0235a38eaa2213b84a6eaf8707dc66fa60012205ef885dd669b711e6a25758d1e7bdaea26f162b434653db0311eec01db1b128fd5f7424e1c27e830e711690cb271cca603a12ad01e846c329d337c76e20e4dcf745b0ac79e39a166506809261f1d5c8668bc8553d74842717b7410a955fe3ae802395444d63f6cd2aa5f52b0202dff9f9ad5033af8505fabd2a29df61cf80a297879677a06e0f5553a6c8053a2ed24d28e879807d7b839e0260bec4310f1ae9bbee31da1d8d0226d5fbde4c21c4f189cce305da404931f8a05d1fed0c6d63641a724c587fab6a4ac47c7f94800a1e72cdc0314c0392f06260b54a8b869f6336b1580d33f23498a4d4e58700e2e80471e5812030c1f435c74d0d8f1bbe87c771adc9062c771d6c3129a3125320ab2c2daf7f6f685a08d0fed0cc4abbd704027af0eeb89103689012ef05acb2e709972d6422d69eac04decbe992e5f82d0bc8fe79ad4ff012c8f13383dfeec6b42e0421ebe7635f62d74b229d0148bb9c31e5f4c0fa471c6d1cb7902814dafc685e1e877cac0289f5dad36781f4c233a6c2bbb0a8a647e9b7ee4c33e8324a5315b4284e91f477a9fee30f2379ec5fa4b4487b32c093ebba6db0260b662909b47b8a579d6199927fe5e97c1312522afeb0743b7e5f5c790fb6a7e95a89b8d8effd785f2066a76c2b2468925eb814463eaaf4df54d2eec09fa0d0427ac262648b9192baf0122733f5514f4f54ec6a2aa7da6ba39b2c8247895d39a339c269d8cb4cd629d6bf7c418f978a7d2a71a8c0d2a9740833e7c9beb9d258af5b718a6a506d2d90262586a90bcdc521a68ee56a84770e7065b1e3bb2e9a1425249bf405e5b8ef7a18b67207fd43b0f2e8600313c98cc0b462ead4f55ff8f83058712984e14d305de579e04fa47a222c64bb20d2bd9c90c77a314f4d73d65020a8c105175aead130351a07d62cf73bdc544eafc4488950b44b66a22ff8fc53f6ff1ab060c6f32986ee1a3c42cf52d79b8a53427c6df18db0a133c9601944a1e95307288d1f8029888b6fc232113806e94d9bc618db01be38c4f208d161348f2b5bf600e819656cd9e0867531546697cbf071f7cac7f7403eb3fa68f684f862abe12f36dc7c19edd5bdeeebb68de8d5e99a3153383a77f36d1b2f47a1126ff744a7e820d235ad615ac47150447f1cf8fd5054555a8c1da6abe47017137aab28758d204ce710e349a80ab5b744b58cf330201c9498c443e1d272dd1070a685a655cbcb2414ba499f000ce7ed3f01deafd06e440636a6727f30dd0a7d1a8af6c50b98e938448c8b97518a22787079588c0b88299eb107b189ab10a1f5a550e2aa33082b9de94ba551f1c5f801554f356e1c8e89894fa2337647c50e5e7736b73edf979d0d1e7b3780dddae69b82c4c5bb3eb2c3ae99fe75779f9a192c145983bcbfc237b8dd0ebf09d8c1172e4e1c39471c0cc40c5914e54dcaf299bb10225bee9c620aef9d65c4cf582e34e312b4f5687d6fd7cf254f037c4fee93019ee76e228c25c9a8062bf0cb63e6ee22750851b1479131995a7ebbcb911c2d5f1855ef3faac48c58670b11c3e11d51f4a4ee01d4a47fb4699ed267060c69635a2471b7505f97547577e7ea8d5179efd25c4d2f06bbcebff800b64d434ffe7e36b3fa7cc5df4b333bfc4c57b7cd4fa686418f00204ad2b2d0f173cd2d84f431af91f3726d151ba512e6ffce5be93165f7e33ddb692cdf2a50f87105daff66f200653062c298ae99485f21740f4e4008b01d4296810dab8c1305d7dc83d3ca2be68a01f5264869f902deef3ba7620a8121299cf088a8ac31c1b75b790cddf511ab06066a06be8fb3b238bd333f7161734402655b185337b2022b32e49bba5ead36a5e7f6d564ddf5089a91bbf73ee2a8e949756ed65747312957ac556a8d0915605a540f11888303fb523aefe228a7ca30b3a2cb4623d0d0b15cf0030e3bc79e393189aca125026eadabb8dbb8b140858d7ffb2fe44c046c86cf23c5aea62d1041511282a23720bd4b5d80d5c50147cf8774f53c856488bf4643e3562c5e07e1d23dd8cfcaa85d08d7779cc60db1adb69309a4807aabd154311eec5fcfd6298c40f0d6f3f3aa712273a1be6518799014c92ec7c9533ca5d8ab75ddf555f5a5e203e3c10a62e305ca3481bc377ea6806da0e81498ee40303541d065acde47f967e917cd0862b1030d049ea941b3859073f96689ff896ec8aafe31a5700c9df2a79e4e5517c34f6b0d09acf61031bd2f98c8bcd7993bb3c327d07a62accf85b994957b24e0ef22c59c33d0e92af028849abdd52c8a7e5118802deffdb82d3b3cbd0f2ed8caaaa9ae5c976cc6e8c81064c67e03cf7b2c711fa907504542134efa1dc904d776b8b432c5aece2f4eb2ed0f681065103750bda9f33571dfbf2a540ea8453c5b10fa8f46a093f93d286c023302c12ee589d7b07b976a3991c6d49c809186818581ea2a8f419111cc2030399e375892066aba17ef4011a36833a8c7930838a5cc04f68e87fdc09975e4b240e21754adf1bde62948b834cd9b63aad8766a269839aa1585d76e88de1a2818c63e4a53b1ac0cde1c3e99a6288cab4c262441858c205ef53f3df8f232a6d291572b3bd5fd6a50387f25acdb16e7beaf81def3970ee317934596be15664c7edda34420b71da9adde34023b8d25b41f60427225ed46da7bea7fa3d9f7ab200bccc5c1f2795a0b0176398bc646808c194930305e150c083ca5071b8492c3b0a850eb04a0f571b68106ca35eeec4ac73d257532089a92b3aa9e89481c6a358fa112b5254e5cfd2bf19794439882127c557c424680fc4ee816190fe354a2f8d72840d6a780c6bb6acda1049fc5b8bb0a47c841249532172af7ef3ea45c10373474a17a200b19390d4cd0b9304377aa348b29bc44937ce1eff9ed62f290d7e2f4e76ed9a240b58bc317e39f66108d2cedf087260d7b1aded007ce40d3eb9adf9339f0a1f2f3dc28a5e49df8814a7356a77e864553ae2eb043628cd7d73ffc2a529446f12843d02c6b9500ad308dc6432328d02f191e747e7e5e8e17d11124f46e0f4802ee963f955a61e48211b2683ca82a3b784f417652c9b77ce953cd8329296963affdedc24f419217789615ab0084253bda99bfed734626187a266833523c615e90e2e372c1b5a33c1215e477a9f9846c67f8214126b10c32e4718db6a585cb8f1b7e3c34851583893cccbaaa3f79475e0f85d1bdf528f659d3efd2e88d94b3c0b57e696f26f121fa016701a4fd540a34adcf75abec662ec752d0c0991c8a030bd3837297c0e160f95e3bb6ab803bafa7b4e21f252ead2d2c99639913b3c5d982e95fe57ecf4d4aaac65c429f97e1d632e6f3abe1d8d7a759d117a6c642d164dff264fe516824e56a21687cc3ac502549bb43f77a31e1b7c439abd6a275bf20421407f4f9467c5c7f2ccf6f885191934e02a01094f120074a423592fc4301357a9b83e545eb51a6aad4f69b9aecac05a651021a1f04e0c04653bca4b939ab718caa50813b911ed1911a613cfb6404d748d35de666535dd6de3b73df1a33e2721e8c2d84c033abd655b3b3dd8a39d9cc249d37cfdaf75d757a97ac9c87f984564d07ae0271ceec4709468754984f20867d1e3196f3cb73acd0ab5c728797819ffc9fe8983b20022464de9a9901d748c509ea3dac10847afee595bea78456fb65479072f216594f3018382475d531d8c26ff1087b45905c32cfffa85491effae5a24c647f483d264dc6b53270d1a709ec3c27c217b3834495bdc00dd7525626c098d0376463d428ab74a89d4ce37cd05ae32822f6f2dca7889602c239ddc811f236627d74dfe90761e95f64c0f46fa996b65e8608c81d89b9bb2326f01573e892f3da46423e34c2b4b6b69d5044c1e398fe6869983774bc20a3675086b7a70fee2b99aa5e099b86ff6e6dd3553351d4981b3efc7c000bb6095bd4d3b5a31d5c33a35c169a58c94a0fedf0335b2420c2270a3d18af14ebd3e1d2a21eb85e46b9d49df0c1fcfef4eebbfa15be6a69893954153d5c2e906f5fe4b5b50ee82da42aacc859e2c7e0b3aaf475ab8dfcfb5d0f3957141a781710bc7410b1cb5c1abeca99d8e7f3def941c9bc4cbbd43c95a97d042e6d797bd1c1fa91a2a5bbf72fe0bdb91796fddd3ce8b6cacff0fbd90a7dbc08ccee00383cf353b4179281bb3ea0591beea401ee8f1cd1708062c89e3e05fc5fa61a6301ed13aa1b0aa506558f16025e8ac3233e0790844884a6f524dfe901e29bf9cedadaaf031cff3697adfa72898960754e94119986ffa3d7d1334603a2dcd9af0cb569f9765647909247150869f3789f7c7b99f8a0544d74ede955b2171eebf2d63028aa47bc6acb269475e0a836e215b48775922ce5a452c130a4b7ba904beb2312de5656938764634ca17f2e70a270f8a71ecbf45957bcfcc3139b002da5a86f4e618857166a3689fb59ed1bbc29cfc18159a520832290b79608aa00229621615f704d3ceea228dfe3d8645bef6ac47cf5371eea78fefcfa6c0ebf2f6173c2b58f49be11a94131e50675b08c06d618013c4124aadd51628ae825d4c2db2bd786f2b565aff72ee22a12e54c497226a1cf6f8a369eb3c12eb35297d42b8dee188b07a1ba10f3eebe2d47b08d5f3ca803635efdf40ca43fb05c217ba5a28089e3d238b412b56261d53d254f9858ec94faa14177339f080da3fd091a61d102417424a1581f0b15710caeed8821d8ae7186c5f1a768a05cc1c033a525fbadde790f83edfb70ecef1a9585d084ad6f73c0799f6d4e5dceab81ed1c52070d7e229d53823914d129d4ae30dab6805df3792cd35fd48f53de177270210f6600259f7fd91ecff94a75152e24b9e021fd400f0a732c4660277451679f1e67c2963dca93d918c60c8305fb07d2d75ca18d37778c11c658e2b20aa1127774b6b826e408c82b2c5cbabc52b78cc1c3f670a7d611c833ed47e4aac20ea2595bd80e13611c1e8627e65c32e8dfe230e9946ccb95983134d49e35149f8aa086972b25fb87d3a3c3499f90e13da7bd39f3aa99f5a4dda98bd8ce95bed2b2f3f58a2a7354d719965051955e0c75894e990676bf40de3424754d0cf9645a8a180ca0fe2b672980c03d11ad353b82383b1dbe39824c2fb8af626936f8133019b4f829b4fd05815fc8b071e45a2e4d199e131f04d8c2d3e0adcf5ecc8a184cd57d004fdfe324b61168d3c7b1d9710ecbe5a19a6a9b8785343926d31bf33ee5ffdde8b6764426323cf3ef0c16594cd80c5acd0f1d86a465898af7d397e8e0864d2f945ea5d430b9a6dd0d0a875c21a0f58b9834ebb996e06eedf0df5335025bba861fa5896402ddce5add04aee2ed68d429868173c8f43588070efa9319e825bb03db4152198f41621559b9280ea58e2351b25b548b0f894e043468c45834bd6b636ddf5b60593c96d97cd4a83afdee4470f614a56ea81601f888f705717ec967d0c89ca4beb0fe7842adcd769717d260bbab872f19ba793184362dc52be8080d3ffc3860e8251f6298b3790b4871413f4b14099beb8c1cdbdaacb5e2598722bc34f1af4ed3b5523ac423da83fd42e2e2eb53dfb1669f096457f88ab50f62a9c0835d91614f4149b36d75c8e0ade5073c58b706a815d80371573209c772513c14bef2c80d0bdc505fdf976b795d29e01781b2c74facaa647f8ac28b9feeabb4670e524b99b00b9ebe3d22d60f66d3a4a2a24053edb1d3ef3d6426158db82602b0d16d65bea8f69c13b2dae3e88e102041fc4fe21c21426169f47aa5ea50484e53b723ad429fdac59b879ca4ddbeef0217f169a043751c68a673fd43c39d7f5b7c03643f4003464d8abbc32ac06913d10bf4b6ad75f79d10c49b318dba25f9e54e0ae286209a0bfbac0beea0e94ca25e607d81903458472231afb2bde2b12d8edc4ac8d54a7b18da45e559842fd16512d57366257071b6b1fa05e52e128448f99cd58e687a403c2ab7c6c2d9fc797d9b4bd16a5586dc50aabd42f39367067c7a05d7d6164f02e98e54b12011429fd50ab01a1462947c1bd23b7870b3a0fbdf2aea5b1495d547a8ca388f3ab2fbc0c45a417e2f44d647edcd266470c428d709c3916c83e87bb646e89b2f55bb2e363c99f1697e0ce3980fa09c7a41896f660bfb09bfe0b9a89b3ae35416f093a6212371d8614c7ea934068f759723004cdbd307b1afa421f8e47ae9a918e5a41932b0e8b11233c220eba459312919eb7ecf52470623e52066482a1402c0db586d5727a65e7793d25d30d94912475e46032ec30d37192311b3305065b7bc750b121fc7e76b44f7a118d5c6756cada637154f8f4d0b773cca41931dc5bde88b6e8145b830ce587c8ac3e419b1e5b207149e622a308ebd64486486071eb020a7124f25b24cb5a620462fc148579c064f1208bf39a1688e9fe8b183398ce5f3d1a86f317c7ea7ecb181e7075418a998372ea005e58de3caa4880bad780a7ecd611f54de36e1c314fa4bb294eea11bdb5d270e64cc3010b298bc8532025c0cd41f8ec37dd77f043cbe140668799a6175cf4a9934c0609b6aac824d9ed55a348d7c38bca78e434c8036a622894d7cba5a5b2c66be1fc97e759b278aab8e872dbb421033c8005d736b2033bbd236cb3c7d76a351919a212e74cafd47833bd2d8033b2883e68aff073d1457d152f865bb27c825e17404f09081d965b37df4b08bc1b8bbeaf2401882b7123852189ebbf38eb0e38db4cd4b15a0bfc1a0ee3cb075b527cd81c93d3b8760a611da92379b488cb151952e20a9bf7e70de3d1eb3c4b9ef5b8bbbff6a209de7a942f3c24e35b0fd54872337ccae162eb0a19755ef45e11f188dba1c90fee0924fc795693f48806c3c35a7c93d9e6b950524a4ce06bdd69216706e83802d40fa28159da35c900a9cb9a7c4d5756f5a7f727859c18a4412913d48f3446116990284484182e9f410a4d944413c9750bb5d0cea7bd0c98d55520c3c214c32b17b16f98f4f40f82db243d1b7cf3849e7d182d28e4f381ea5c19096e085666013fbb45f3ebcc491dbedf6b3165fa6f7cdc0c53e044c91a4ed3a7894d3fe4b1747fa7a58cc6a7b0a0b16ac6e212eb6849c8c20fb7aa04b076e171bca5f3c1bc8c9114ea85d1ce5f87be54c0974ce4ac72f6613e5f559195d2aa936bda1ff6394346cc515e8fdc408f53b6c9333537e6cd4dd3e8732d7069e5c545cac03eab678d2706ed3347137f3ab585784364ec83afd3572b2c3b1be3df0895f8ec48782babf9346d51a30605f41925f2f6ed9a5745321528cb9216e63411438332af1aeb9822d989a404ccecc9a2bb2de4406625fad6e95938844854a49ae56767ac536f03317cfd977380357411463699b727ab932a755a891d5becda34ac11d5ef5de6f4286e7ac6b3e011de5e8bf48f040f9deec49acb0dc107ce8007618d09eb2efaf3e91c1bd1dfb22551bc458e9ca270f30359fe2ba22afa6ca5a72ef9dbea172605610bab786bdff6838d9e7791d3529ffca7de85a8035e9afe61257466b841649f713eba372f19d05f5576db0edcbdf86338e55955481dac88ace2a2b87982400ed0bc0ddb8eb722450727461c9c8fa7868160b35329d7d1cabab0cd0e211e1ecbd1429dda28d9806086b8afcb21dc6c5f671df1441bf9529a8aa139ddabbae490c5481cd838ce54cb6b502dbbe30eb8e8651663572e28cc88baa877c0e948dc3d79a41d261616dd7a0259212be447cfbc1514086a3280f60e9356614642418161a9e532561979d65b79057eb27a5a6f1a6da2110b3e4ac32911e0c418949457928ca91fbb3054806622c103d8ae1a5b93d60aa23ae896bc759045bb4290e4556c2a969cf1fafbf440830c09f2521d9a0d21d4528af68e1e7be3558f716de15b8a5de25ffa55d5fb2d0d33e8d01b6ebd39faa9e43121a5d8d36a47a3ac438485e8ef727ac298cb58965850e7c52028a240b93e4169ac2a759cbce2456abb146b0b528b2b6e4b34aadcaa565b17559c54bc5f6373c64e66555103c322d22c25ec005d4d87f9707b41b60129efc44c3b8b41a9c3193f5fb349af3624c9cf33bf1a3bc17d06a3b87b6a598c8dae6e66f0e877de48fad04f31a70530cb6c4b28e406e30f2e7a6a68647e4ef69345b21b329d1c3681150c182bc69280bfa6abec07e3f126b345584b0299dee7cd92cbbbfd53aa55101f31425dcf03f715304c104209510a311111c3b2bf075c383473e7b8b828cc79e34dd6d302778e20a7953e510365f6be1c3663b0b3634d6381e96ff2b5cad89bafbd4aec800d49e461ee32b36e0c5868bfc6f7b755cce6a9dfc9f85c3c4262d13864f13d10440faa7566e40d90ac2524859cd9abd10b6d6fd507edff599cc0f8ecf30b0769473f051fd5930b16f912ff7620773517feed6897a49f009f1c82a98343240c9248e549bb1a5f2948fe44164bcf88fc6207e82211b35d2207116eb6a865821d65d5a4e952486325bafca4c5c9ef40f4e2a3fa0fe29eb3824c098521ab09f69fb5acc945f71a5752bc2a5755f5b98c841248f2055ca7ac501cfb8bcca87a4d1eeb30fb81123f932675398900ee2cd1d3f712101afe72d8425ff83246431d364edc03b10ddcb5d28c7b1df73d63fadd6c1455b607c9a74bc36ac5c6fe231d47a0062d06e0f075ced079cf2d29a68024a771a89c11f80ee0e7b43c14bf7fe0581b08b8cc86b37c7ff4a9ae21ba9a5c851c7daeca78bc18cf8e4e7e2b44ebc4bcae037e23c4a0d31fddbf421670133cdc38361b6e3597a270ab6b943ec58dd1ac386e7ecb44d347365e7958d90465371d42b2367d9e28818724b7762b8360b2badd0d939c7214b66ba2a1ee162396cf63c3b770e09a5ce05b419aab50ccd29bd576b7c669c93586cc3732ab25a6412a2938c6f09b0f91670ca7c24f8f21ab8096279b1a2e0235242b53812f251dea85ff0fd83b56cae53156629a6ddfeee9aee74d8ed0a0b2f1fe542e2d2d4e7a42f5f94c49aa016f45e39e5b3801bd9ac7bbb09f5ad0458617fc148a4fcc7a4987966d38baa645ab29182d96b1212db13f99d4f5c80905364af5ce98a548c304e7f38502fd75d1ccdc8b316fe38dd3baedab2519ca27cc5c18597f0f8a1c20b84a420dfa7d8274af7d8c6a43ee3a99026ab0bfbcda1bc17ebfddfdfe0a26a5053b3eab3d1c629d75aa4e61c4eab354edf99f27f2fe8c894857a672a298d60fe3c711c2e2a29a2719dba8502d86d6ee841b76d442e861e63b924de0314db50fac5346bdcfea14a35ffb08507ba64f351a4b0ea6d913e64549ed11909d1094a864dde7a2fe25437ce332c3fce06768804866f46f6bc17dda73e229e6af619d39c45197a1cdcbe5cf93eebc2e5e803eed0c895e4f3cd7e9f1bab770a8a41280e7ad27f14d604aa196582775d91efa0760428f5ea9724d03ed897f038378ef5f7d9dad58485a38f09c9df3373ab785d496b5f032cf25e458981ad3646326ee73974e81618cba92627f38de81705a2f5b7c4e9eedab152cc346a2b8450a8b253309392820967bff5ae03bda4ff4749914e5abe07f10f68645dbaeebea73fb94e58dd822419998b6d56d9ad3ea4f5434ac57f5d0dc87d71891b06c8ca9743c9ec88bd610b2b2397d66bace2a04f6acdbb0ec406d3367cbf5f087e584630c46facbb38d8423adca77cb52188942634c0b8e0d1845c46b0a05ad957ea9fcd0ef21370ffbd2f2253309f61a812f16b805511b29eabd97441c3599801db7393b054e762760883c08a2f32c2dba3687644ca0d45c658b8c7c9fc89f4557215c0eec520282694c3398e50828868a8454c39a2269d5c3c7b5d4296f54317fdcd1a0926a6c901262ee6b980fd05fb9419ea3453cd9392419df1249a8c0f1c01c89492d759fa97a78a6147922d85eb5bb7dc5712cfb5729505e8d4cf83ca3041d05157930364dcd77d4c1d5897cc267afe8ad4c1284d9d21c0249f676e252b2fa74ceae6aae787a62a3c24b98804c8e0a70e067c8411db64f1bed3b0bb7511909eaaa2d23041569f7939cdf9cf3ac0db3f3c6d4f08c50fe238728edda6409b45a0b739a4e98e334e511681166fae8e20c1f5416e1229f2c0213699ef25ab08ee7742476af1922b6dc225a16846838126342d6d5433cdc342c28a21c8b34e3c88f3188260a1a1ee3787059a3ec73ccef9f3ecb5dbfdbce33818f278b263e8607137d16e61186c0e1105fd9238494094aa24c506a5cd6c3b13cdd45c07137a212bb15b7c501ab0a1694d3020a7bda7a5b4058554d3af975e539dc4ef728881c405fb67227e5b1145a17917103d0a7c1e451e84dabc5b7d5e8e6190f6e7edf36625b3763db7b6ce5a0a671afa9275dd0e3f6d415ab32754e0bb298ceeb76dd6e3f91468834b237d97bcbbd03bf074507a307b87ef844a6cb9485bffa90dd76444f7afd8aaf150766b2d00429a41822c5b66df286c8ecee9e4ce87269ce3679a04d538b974d7f13864c309d58e85ad6621d9d97367dbae953081583a469de66b2a6f418244d482011df5edff4a73d770bb76c4fa5e7b76d08f98dea90dfa8a4a4b610d540d034df417f8ff8e3dc407dd3df8c5e07c9609646e412d9933da1cb33488f7e1211c74d0ae9539e3c989ece4f9a3e65ad87366de60d4c893e3f978029791f1c76ed8a6ec42129fbce993b6364ae5ce9b42966054597e50aa2b82b7bae34d226b8ddc61dd327cc53c16430aca5267ba0c98f8873acc130ef4c7097347daae913e5bc066aa08c48d703a73f8983e7a88a2ecf20282b4d27e8a0134388e025ada4836c683a9b554dc9a6c384e3b3787fcc68a43f960d871272497f53f6c09659a4eb219f445ce1392f577dca3de877a41098d23e2f8700537decb4db78c477d31bdf4126cecc89a2cb1227089e9f34787e06e9934a7c9e3837104e9f82668ef6f9a9ea9344b50ea069de075608b2a78dd04a50226df0943278c66997686dd337dc76237ad827c66e8e44f0bcc4e95326c99c195971c88d3cb106b6cc2803689a87915232e964cd6da020896a2592e632a50e06e1f92c74a50d193a69a44f59be474e01a6e2a7f4b93e384c23b64890999157aac8671519ffe11c6b228bd6489b3e853c190d2451b2a74df3d6765da9f406ca1f6e09bff9a692d4dfb45d7f73e2d2c451d5db107df97ddd4345878418f6f785a8e8ae15d25c65fd1b6410b244526c48822674b9eba449578aaf2fc154e3eb3ca440540e69ba7e03be7a4cf8823cf0672a910124fabb7e71d04ffaf9e9cdfe42a1d3d06dc80c2091a354ea3a78b3d09dfd85e69c734e7a8969e836da9bfdcd10dd6e843c1ad78cf282d79c874e20e1e67afdf50cf489fefa65ed75757d0afd3a29142ae10b0b3d0b6121ecb2d7356bf5011576e89c7083cfe0c50131963586f6f26ea006ee016f6b6008bd2cd63311f31fb633b1fdfa27a511104218823226bb7657aec7e2bd3ffa8f08da0f4178435e66e9db9016cbb77c36638604ff613b7d24d2a71c876c96f2607a2a63ae44983e15d11f7d9ce99ed3d0e15b25e4edf8709c895efe2e113264888525060a8d0da28c0841f8f7c752830e3eafac782cfdd138d31fbdbc9126c68b035ec219299c32cef489a6a54a3f7f3014f254da2322e268844475e79eedf65cea3cce9be18106a6d19fbd9cf0e68e5e32c2ab2ff889a56649dd4a89e532f0fc3065e913a4d65a6b2dbcc4906ad5041e3a718420d1884beaaf7a105e1e07fa83a4687b04832728a594526a034a29a594ce39279d944e4ae9113a4a29a594521b0c39020dce32f08441787e1e4106cf7fa04f32e667645c6731dae3be3987701ce1d802658434c578b845d8323f7ba4e702034d247433cb38cdcb80a9c6f34414a1923438e2e3e3e3e3e3e3e3e3e3e3e3e3e3e3e373e4c89123478e1c3972e4c89123478e1c39728465c22ec88dc7a49fa7539b5a8c2dd9820c6a2a2ceffddeff77e1e22b2b4f4979a97414949348373179d77ddbae69c7b05bfb394f4f3416a9c9536c0b32e3c112fb892e6f88fdc419ec2766dc093445151ce7268445d12084b00515d299e822531577dd09cdececec84387802bfc8029ae6331cc048d98450027f6616da133d377d6a61f990903e65357d824e3c619305c1f24a3cb79964d200a2e2aa88e789033c77307f8080e729e49201a2620f11cf3304789a60b260881a05886a9510cfb20a5862417641c7b354e2a209886a9c1ccf3208583a21a1b8f12c5b47750b8867f9022c692071809f654e0aaa836c341964087a587902a2e40d0fcfbd04dc51e82aecf0dc4850509255e3b97380bb890e820ecfcd53a2f1dc23c0393c770afa05373cb78d096ace788e51b83cc7295a483016894b884fc8788e43c0fdf88318cf71157360c3735ce27b8e32d8de2c7104353cc333bc788661c07d0dac788651e07e8653c0193a014531ed2c7ac0ad03ee16dc9d82db04770c88a23ed26443d62a60958015025644f4f038c010b147881d2a03a874a87072e0e0c00902e7064e0b8856015a3fb470cb06017ce8a1837878b949ddec70c3aac142b14e2c1d583472c0e1060934c3a56600352d353c3832785a3c2d181f0062cc1f1825cfcba5ae062f772f662c0c2fdbae85973b152f9756781906f561e16518239f131f9167bb9097bbd295d5ec48a1c5e2615508a3d45d979767107c6fe3cc4568860738a19b50cd54fd275482902a08e85e2f4b23383676711b67293c477a5aac9d15ac060302b6c270b01b172ebc2c69706c9c721b672840d80ab0184c150454b22c2df8f4b4529a48e93646b98d33137b43849d150e0e29c8c6c0ced818ab42691852e36c6b51f1e3d3e3d3559c8a84ca5377eacac4c4cb51088e5b55551bd49a3a5363620dee1903d08fcfb6798db1db38a3ab26b07876302fab8991a84c06d90e134ddce4a0265b02cbe7cb0a5d3fcb90015b6e637a1b43545c5de079e658e079ea54a0ef7bc611edbd3f5510157b28f03c6326f03c6724d04d23026d04a25a05816789e401cf328903dac5bb8611fd6207a21aa701cf928701cf92b5806e1e8ae8bea481a86e29e059da24e059064140a7bc6d10d12d8020aa83783c77d0019ea56a8867990408219a0844c99b1dcf5dc400cf6d4447a3bc73e4e81538102559389e7b15c473efdc68d25b0820badf301025810af0dc323f3c370d6e9333c017226cf4c807a2660d019ee38f0fcf112852a6608ac3b00be3ae8dc3360ebb300cc330ec0b1cc7711cb771df384c136155641a966559468570228e1369dd560526eab86d3bf6ac13659948a45da4655d966559161289ba509685340cc3300cc3300cc3300cc3306cc3b6631c776dbb17e644518b5fc830eeda318cd3362cc34627afef4427a38dcb30ec1d861dc3304e74e7b74bb176938878c7313d966558d63e88303b96e2179bd0c5d9f016cfe832ff192151d68b306d9acf90956be0f9e16c336b435d8795a657e7757afa1c61aa97bf796a6dd7e18eb0a5b312d45bcd9e54c84b29a594524a29a594524a29a594524a29a52c61a051b1464955798b9497cee22b504efac9478f9fd127938e7b3c0f7d3a6d8f0722871044f4893ea2eee38fe89316493c56beb2e27dfdfd58b98c38383138313855bbd42eeddbdab77dcf6e596d36a1abb7f3beb876b1cfebe294fefa764317ddeddc4d6ef7d13521dd93a35cd2575c94d265b1727d804085fbd2da2ee2a8dc176f71559e725bbc74539ec1ecc0458b6a842efe742db5aa0b2a55226daab7d6e2ae2b959a48f6e70f675e6e98e726722f7f78252b71203bb6f1d0766897dae50e6d65e5700be2c5ed223d465c5c1904a74df51103d0d4af167655d2832b5ce2832b12bc722da6ad58ac72bb48a7dc3672dba7bf7a16b791dcfee9af1ee536e936d06d25a3db26b797a8fa83e9af5e74654c7f32fdcdd0d4d8f47773af0cd2a67aedca1c1c4dc40b482af6faaed5f6bb7f04e788dbb6b51866431eb63591fe5a60e8724412b398c43ec72e60247db2ef8824fef4a9ad676127658b26419141967cd5a8b7b5fe04595240baaf4f7d9dd4a81cd2540fede12d168a2fdb21cc2ea2b41b4e9d3ef5b1673b77acd542a177666b586badb5d6da66d95ec2f612b697b0bd843d85a85e029aeaed766b6dc6c36656f4eca2cc5a1f1173ef204da487b490d6e91c5cffed59f4edbbdfbca6d9915de4018998cb1eea9a10f6b689d9b11c120523d6342cd39278a15bbd44aafa2473b22a6d647db764fdf7974a5dd7ddddddddddddedc9cdc3bc0cdb9a664776ec75d3d1c7aecb5b956b7bc4a411b92375e44aa3c1f5cdead3d5349b37638f3f10f60c76560f0e00864eb07270d6752752c7487f75ce6e161a76e9af3b1f2b0ecd986b464aaf63649f663a628cb2264d4281fa445ffb9aec5ff1f3ba9665b7d9ed266fb15bec9a3d9ddab36f0f69b728b869d1e6e532283a114d5a0c935baf8e8aab9e54a35a87c19cc9948d477ba595fea416d2fad2a46781441cf272e8d84b1b8fb6cfa2153da344e22a53568d1945eaaa8ebcd065585b2013cbfbe0b0bcc86e3eef51a950517571c71996c5c6a33dcbadf467bb370a85a657e816894422914824128944229148f48bb4dd10fdccd0a64c7ff533361d263c75faabd3095d9f45e690a8ae296ce96ff78a2e7d4ed238699c59966997ec912dc9923c2bb9bab492a6c9955cc9955c5d5a0865db71691bcb065b1dd68b4922902aaab4a8dab4edf2724844cf5dfa08f104ea32655d3f92e870e802b1787ebb40ba164c455cef04cc62e391dd5222b455bf62db916d598f984436015deab92b7d005b6ac986ec49f64cbbb348d772155f20963a3bb2489fe6eb654f9fe86c1484d8e1475de8b2ec340e894f64af8f43604a7b4a8a8949f68ce11c87e07a09614bb6d97c79ad371e212d7bb7e9d01e440f4df37a88322ffb8f3965a60e766366cc9859336f264ee6a2455904d7b72cd25f85d0932bd8526fa35d347b2b8e57ae6413b2075247eec8962c227bfaab39244a0a21520fdf564a297d707a6e707d0dae212596b7f0a59301210d79292d0f69a526a576619717dc76609a6771d04ed9291532626008216541533d3c5582fdc0702e94aed05101d74398291426ec292f15d08804202ac208c0d453524c4ceabbbd8c044b3ffbbddd7860d73c205b10ed7598a7f557a746aacfee0ccdde8bb6b0226daaa74a6a24c1f579c66704d7cf3ce79c232f74f64662547e7e60eac215369de9938f88b753195c290caed85492298db5e982947270a53a54889685b4671e9088372fdb67cf5e68d9a54bb04b83a8924b812e6dc196fad0a54e802df5dba54f882e452eedb9402cb61e25225197aa73481435d2a6fa183bd3d55c37170e0f0ba44870ad5fd98268ec0598aab87eee4c199892b8258ab23a26baa8009958bb0f0e6bb7cf4417e2ace4954a36e8bafee2573d13a7d59d6ba066cc54b1945c7428320adca71025a380a67aec307585bef1e850e81bc49bc78225923a614a4b70c5ea678cb55df7982dc4c59f6dc7f690072462919723e6581205670cd6492f6b5ea6b507e745a08d250712333ab1272eb9e921fd23b3924564908dd5eecfc643bbf580449cfdd9b57ba38f5dcaa244b0569beaf35fea3a7b99799902e1fa9ffe2cf580448c792f2811d8523f2f6551116f71f4c8bedd02f557bfdd2422d6bc98c4def883c59f98441ac1f54c98bc3e02b50fa3d78bee842dfdd0c8fb4cbc1992d56a79dadd8268af87e6b54d7ff549449c795dd35f3dd6344db3793fa6d4e9afa64f6f9b3ec955fc919aed4a72255133dad43c1dab245737681a7dccae8f88ed4b1245596daab796554b012aa79f4030e5e23669b831030e32061c3060fad905f86273a6802f768505f86275a2802f7627ba24812918a787a995d34f1f987af11c2a565cc03a5ab057b8a79f50a8027cb142a20b350253a397b8135d6814e04b5d45179872027ca13bd185fec8a4029602a6cf56ae00fee2ae7c745ffcbaa367f7fabdd9e70dc0bd3b65c8686919c0005c5c66ccb8e1061c70c821071a3474d0e17442a16ad4d8618754caf4d90080183786000ee3fe2e2e8cab5c17a45bfac925dde49ebc0b5deed80ddd5eecdab5bfb7ef5dedb1a79ed6570a2443c6b54ad2d292046800030052e2e2f21a3463c673d3d72537dc5097a870c0410593430e30313468c4c8e8a083cccce934438342d1d4d4a85163b3c30e3698dedea49e7a6e7a1bc484f3e5d8b002408c9b827c3836e46000ac6258961a4e1f77bc7b7abac3b253c3bd9dfbd5bd99e27aef660cd7d770596e8c9b51703d00ae0d37bbc0f5dfcd17d79b6e8e81eb5377879b5b707d8d9b6fc0f5a89b75c0f5a79b77c0f53adcdc03aea771337402d7e770337c02d7e370338402d7df70335c02ae9f71337402ae77b9194601d70fe06638055cdf7233ac02ae9771338c02d7d7fa9eb0a5feba16b6d48fae065bea5fdc0eb6d4af5c126ca917c02dc196fadf15d8520fe31eb6d4bbb82cb0a55ee57eb0a5bec595015bea53ee0cd8525fba34604b3de9d6802df5279707d8526f726d00c1dd1cb0450822604bbdbd45c0967aed1a1101d8521f807b046ca9f09b4ce8fa99cca0607d17c3520a5662c960170c9d80a2066753abb3c66983efb7946252e394547cbf98644113d5ae04886a3340137d0d35a8a89c9ce02c5919ce8db364d5e87854e47fcc4ba7bfcb08a6871fa1a1cb92d53ae5bac230c5f529ce257d3231d227a412ad49d2ab9dae2b959290833f0c9de081c1196c08e3146525705dfdb2861836985a3cdb909f4b36a1674a034c3f81244a7e54c5f25c03f248ea7db64c5eb69f97ad0d5eee62782c5e0d5e3ec6244bb2b04fe24854efb4899e07d37b5eb6acae85e9af87d330fdf54aa2e214a0897e85e9efe50f07d3c37071ad6ad840862a30fd0b2f97a6a8ab28ea0ad34723b0855ebbf4744706075501fae43c48c906d3d3ecb40dcef03094bad061a1630f6ca162c860113c49b081620966c1d009287a70e81d7ac305b4fa50c46092c60204d83e839b0ed35c5d3aab8ac1d41460ea0844c51d69a2023c69f1c50a698da16b2a76b480e7fcd472ec1942fb94b39b9dec548e5d95f9aa127355425375803c6526cdb449992f8e3dc35ea860f3aa602f7d62ff70e82fb0908bfb83c33e57545aa494e665687ab93e898939385febb76dc7cc3d4e9e44c42a3b3e6c72938feae9ad90f842777630a5d50ac1f45ad76d38b8eba1d0432138a3bbeb84bb1c8edc157177e3aec6dd8cbb21ee62dcb5dcaddcbd7aa8ce8c331273b7b91b3b4f063e19d53082d5145911a1434861e8200f30354f5f03a62e4c7f4484814b284c823d61b2044ca38069ae81297decc1cb48b05889b296b3f698c2d48623147b50f0078a9dc29342cf60c642835b105def0c6222c1d3cb2c1809165c9fd5dbe1eb7238dac096ec1cbeae284884afbb15d9f075b59586af9b49990c5f37f413c2d7c58660f8bab66f2cbe6e5d52f175af1eaa43f175679c812d59951809d892dd46e7902cb0257bc4990bcdc5a6c38427ccd79fe870bb3155fd514d65bb315bfd1551d2b54e2c4e514e579c3e460153dbe92710a80fe0498b2f72c9aa0998461c24607a082711e40a5317db0eed55abef3aebc4984a3f7b7fc545b92a7dd1278c4acf9c98fe260ced69d5b592a8d96a13bd0d79b9345bef6b65dfba3e38d06d43f443dca6a31ff2a6d730fd51956e610a030364e2f9b6176d376c34d2df8c3dd1880aba1c7bf0846954024e3f55330701cf330811cfd386c701ae954425c09b2d0410e1f1f0ba0378247b67ab4811ba3ca3c6c401b8f7e13f7c7f84ee8303d8be674ba20ee059db8dbcdc755e7efe244fd7cfaecd1bb1e8e689b79bc4c4a14f95d46cec51b1cf9f8afd972faf3f0c73df6254863c5b983ec7d62c327bfaa4eacc5e1f1cc87eb2f1186d43f4f47c446c8144dc26db8e7eedd71aba3e38acf2634a22b7034a60c9b24f62bb511fba59095c3d1525d836b6a4b4d2598a064c69f394be7a6308bb198cb6b1ad573f71bd2c8f8e8e2dc8c114aa40bb5b3b4c7fb169d3d8fd03d4999cb736c2c097180211c096798b2f2faaa2d0e5ee0809a58f7d9ce979b2f548f76c9ab46ad2dbaed4f14689a01b75853427eb07c7f9a86ae951ef08527f44406a52eaaf559817aaa8428988dbb4ae1369dd5645c6619b48c46118866118866118866118866118866118761a18861dc3308c7b87615a08c3300cc3b4e7ee9a1589ae71ef445ed78832fa0e6d9762ecced59ce9af3e878c98e322e5445ab755b1659c26ea300cc330ac13695cc6651af76ccbba532e520ea394d28ccb44775ebbbdc2f5d304300573f29ca119b76d1bb66ddbb67130a55128608aeb38ca715c96651dc61da3931389b663f1fac6615748240a6d9717d98eebbcdc9d8bd73b168ce32e6e0b89421bc7710f7122961c48cce8f4c4253743fa476655c466db2e692fd2ba1869e468c63de344527471258efbc65ddbc569228ee3b84b3e73979776ceeb44f4da9d37e9b24c7b96755ad699d8ee59a6bde3606af39a8029ee0b1cc7711cc7691cc769a39393d1762bd63a1187492903b98473d703bf4b9133944378195d93b823a20b3d79191dc26cce6cb63aedded0e6a5b52579bbfb91ee842d725e12495aa019d972464a29a5cfc949cfaa46a18bbc0d29a5541d216564014528200aa6b8ac1de527a413a0a7a4909e4d482c8e748ec49148a4c3c78dc78937516efba347b9a53c357666ac3e141414f991fc487e848282f2f94c84f2e984ee9a1ca76917dade41a16f1d1414945ea1a0a078a49164b56cb5ec69e9d3f267fbc99538eb349dce445288e461b57a7c7e465fe880500efb1b01a1dc56f547475dd78de0c99558db70f4b0fdd1fe7090bc11151dca471e4a9ce90fb669341a8d46a3e76f0be548a3d588ad6a95c454cec89a2c6580a5f7d0c6437e34338229b8437aa38fec49cfe855af5650d25caf7d42b94d47ca2b38cb99cc723d4b212737b4973009ca6c8576722bc6217106604ba4913893d86c510601d63c49d3aa0e0144ad80a9d7afb831ab4f4969957679d08b34fd71f49d4c9c81403c361dd9489ba7db3a9d938db4d105623109499be89358253298eaf818e9d991a816d2a6f8d24d4097222522ed032805a6275eafc6d04198baa8dc69545b9e8e556af550397342ba10e74c49236782f27c648d2e8fe25956775b051373611b2d0391f040243c10098f49ab72ab64103d648da4f1e40c8e58cef44965f41f13e7865119793b3e3cf29858d13e4814191a954ad5aa56f1306129a43ffa09d4e556c55013e0baf140f9ec134cc75cdb0e94cf9ff4d09ec4db074dc097d1e97ba78bf4a9eb55ebf489eb56af7a1589c49645b9d3443bb914db38397d7742fb84f649d7755d86523fa2a2a3cf9155bd1e281f9d7c74227daa9e4abd7626569caa546fc78735cffb31250d8ac7048bd3936e06600bfdc9e502a61fdd292012247246a258789166856763837439259d0bc1f423d9118ea848e4893eb168f330005be8b31b711c0253212f08cc4b82d63b25900f5ec8204b9e3398be794a9f139318b266cf747777777777777777777777bf88fe111d234d545a2d0bd50b8bdac663a557e457de3112d5b6cbb2d6a69552ca4bcacb4a29e594f2c53117a16bd3070854d87ee55a4ab339258ecc19d209c154075319064c87dcaecc39256b6508c4d8cab78d47e9f3da2c7dce17b789b48ab8b8d2e6a64df413a6ec8f88b3c481a53b6d7f2da548ce66758bdb29b74bb759dc36b2e236ca6d24a4db3fb79334507ff426b795f417d44ba44ac2c8982b65e44c7f3457de2b6dda448f5d19a48790a193434e32f154e21c1cd1ddf4bd0d71d96aebd5439a4587aca86c02e3d01d56e2e4f46935630c8d3376c775fbebaaf59a332b5dd2190318c60086592a35a92b699a6422832cd9f230a19b2dd8425fdfb607f640177a966a67f4f0c4204c5bd5425dabaef01f06208af2d45aab0793d016a6af007ca9524429ae80eb8f80a9f97a09c0979a852c1cc1f5118029eff50e802f758a29a880eb8d58009402ae2f02a6eceb1100a180eb898029ecf543c026e07a21602af47a1df5396e4024e07a2060aa7b3d8646c0f53660cae4f53d1000d7f3005327afdfe105d7d78029d2eb7540e17a1a30557afd0d39e0fa19309542e382eb5be08ba5a91100ae37c1175b63531f03be589bfa0b5fec8d0c986af1fa0fa6545ecf02532e5e7f9882f1ea02bed820f529f0c5e2e4b0c0f528f0c5e6d49bc017bb5a81a9afbc9e04532f5edfc1d44887c3f51b7cb13a3bf5187cb13bf514be5821d085ee40177abddec254f6fbcaf25a493c6ad786b1a7ebdaf21b0aca215c2100011cc2979743c8030f87b0871e0ea10f3e1c420210e010dab07108313e843ffc70080b508043080410370ee18d200e6110380e218e439823870e03ec10e230371ee210ea38840638843b0ea1102c3ec433ed7ab7573b869dbba1936b52baa4a7dcd25bdc141757e530ae8bffc2f8ca3dcbbd1fe2e6b823644767958313e4c6a68666462606c6aa960429014a324516a428759d94a2a9900e4317b13cbc544b302d4524768486ee5ad19dfea84ae83fa6901045127b248bc55d218b5dd7b5e24216bbaeebbae8cfa43ff4e7fba4b447e8cece8ea43bd044a91020eaf291267aba02a542090a9d12b08f11e80e15d22715cc7a96c5ca624f07d99e1b07983e0635d63598f64d9da13109a65109a68f5480295a730270fada7dd50ead645dd9ba42398bb39891a80e9239f185ea449799d6a939978fbc56f53e2f95baae2f1f4ce7f4325565521be20a71775c035c1d37c7c571b30d82e983b8372e10b700f7878baf8d4b80ebc3ede1f2705fae006eae40b926c9758a5cb350a5c061719fc5fd21e3e619054cdf72f39c02a61fc0cdb30a98dee5e61905a69f71f3c402a6bfe1e63905a6c7e1e6d9054c9fc3cdb30a4c4fe3e619064cafc3cd930c98fe74f33c03a647dd4c4380e96bdc4c4780e977b8999a00d3a76ea629c0f4a69b290b30fd77337d01a6b7e1662a034c0f801be366ba04a6afe1668a039a03ba034cbb864f5cc3cd33f64813bdec913d16539df872ad74303ddd017ca94992f02007a6660ee04b0502d2010e4c7938802f5589122682c094b6047ca9414137b881294b03f852972cb1810d4c6132802f56a59a410d4c855e005f2c0c4c0c68608a63017cb131312e9881a92e05f0c5cac8ac4006a64c4c005feccc0c0a6260ea6404f0c5d2d09400d3531898229d9e8600bed89ae8424f4580e9a90aa64a67802fd6860cf0c5de8401bed82055c0178bb304a6524e3f8360aac5e9a712980a99d0a8b40b584b9320648846440000000a8315000030140c058482d198244c84d10f14000e7fa2545c501c094549122421848831c60000000000000000009021d2009935ee68e3a5dd2d415c524314a39622baae4f0a44a789ce9649538c17628a108769a732d4aafe3d1eb571502f394f7f8d4fb6dd5124dac52fafa7ffa5b970e6ce8562d457d350502c6cace0865b3cc8816595caf644f9b348d174a180dec825435922f1596cbabd0986e9e8c9a48a4f0114b6d202140328e8bebf08aecb587b4f6aa2210a7ad6ab8b0982cb74cbff1bf750fbd0d94f0b403d196d9d79a6e62dde24f9673a984192f2271ba3b71d1c45443cfe9a06c19d3362b4e126b7390e20906ac70cc00766e18972daf06c42f6275fdd242a95d6832b1ff61fae2864e3bd5328d0b61f1e4e5e2508c2fdff5f324b01dafb835733a440c646bc0ceb1736dc7a1d624254e0dd8c65fcef352619cdb2df4de2c026fe4b9894da6d5a738a4a10bf3f906abfd905044875d9499cecff56c54280a98ac997de738021c11df5f35d7a74ccafbc4ff2dadee8553911de83da2b91792cd47395a6e8f4e688db33fe79ef4042ac36267333f41cd2c73300fa91f9e9c1d0cee90956867afa827fdbe2577a76ae0fa5d90c7f71ce5ab9666094cdfc5aa9842e8dfbca1209aa465a32062ae8a582794f66336a7d3f728b973c0938ebb06e4ef68fe32d81bb3fd54bbe86a1d43fa65b08032da8695d8d1f3baa0057f31f7877da1c311c4f6ceca177704f7ae14016022d8aea5a9b8d4a8960c4473f20ce70ea1115a9f456c4dbbfd4b56e9f9804809bf2bd858c39bf25233e90736e9999b1bf7dda67b86df47ce9aff22f7e9a5ec289c0239d165fab05cbc41b43e05bf3485a83319df692f69635cbfcb8e92b8e90be12ff43b1f0a6542849a26b4ad6211119120f8f354b2b30a6e030c9b4c18ec89637c930acdfacf6473b8aa849f98b98b4906c335369e11aef2f2d2d30557d83c41eef7d719825a62144ff8c84c2a7cb4fba8d8bfefaa485f9d569e28fa05e19f745f8ac40245142f02375eec90d910a42beea34b170428e644e2494b28767910367265040487dd642ccbe767186851cc487326217a240260092444bb28a26b122a358257cdac36018e8f29010cb158163229d53f7120288fdc6baf181e8d26680fc237ad9c76a1438805925310836d820ac8d0f9ed52585b91de29f1d8a2b9a2afd8e9bdc6026d4f48c8d3ab15c540c5cd30a232352a59434229577d6068e689a350411bc0e172ca3eff7d0922560c120c830a7a1122b1163f98aaa852240750b6992f95bce421161e0e6121c0e7a7df472f18d77c1e9b02ae920890d101580ef0ec743faa7d76dc100d70670e96a012e52b537d20b6e47c2a34b8fe6ffad878a1853b08bdf0bd82ef4875dab310bb677d09f575b985462b0f4f1408b0c18bf5ce7e8ad07317d6abd2cce57c644c61968750be4fa9aba51440490998ce1f28c9838d6a5688ec5a003846b312f618e04d2f8dc04192f6765db7a3ffb1948521e5136dc32b0da38cc1bc3cc625491fbcec0020e988a1bc2518c07e59f1149132ce70c283005675069371724d8daf0f48889a0f23d4c9ce32084c7d4da755c4a179031537aa2334f70373c5cb1e7f9ecc3c613558529d86d8ce262d47d78e70f52bc5076ced6777cc211b9bf23459a43041e947bb61df8367da7f28cf6c87aea92daf6b81a988b69bac349c2bc474a4c411a02e7200ba009854af6d483c03a6088e601d252167f0be8589947237261f4fd2b0b286f47680da01397e72d0357e2f2bb1eecad72448a53589a77ac893242134727d0aa18d8f4d8bc53ccd6847c5cc0be595acecc630e6262de5d8a6b5327a9b9c20f5013b161013009d2404823a95dd34450609e14a1778b5d0b4ea82d7f2bd89bdff20afd438f1b19081fa9e013b497714e6a517c05e73c50457ef0e1d041b76f32d3f10453f8d7682eb96cee91b432680ed35071799746fd16dcb0f2a3e0978a1e78d10f61473da2414ca5fbc38b84f985ebce2789d54c821b7e491adc646b0d4ff26c8b9b006229417f8a96f07b20c6011e4b4323ad01eaec258209c43b19f14550d990a6b17a29184ecb541378c7a6d76c7adca47ad1b62c8127f815548368211064eb95cef704421ad8a044d0506a74986a6e129045ff33a35946909493d9af07654fb58b866f98f4251a7c8719646cffd341f6a563779dd885b7a85b105c2a4a948b376ddb38bbfb824195c701dcb1cc03363e87eb32dc8f8adfee569b8bf7dd40d8fd3b2f64dd64af77c9b32c975382c856fbf21b3d62bb4914d4f534a530951655f13aba8569da36ead6e1a46c1456233cb84bfa8edee26942c7bcccd2781ecbcb8971d623dab22588cf9ac825a9e8d4d9b0ed686fe2d2a7dd8b450b5d32d2567158350a77eed89a5bc61b405d346925c94240f7789923b187caf1e63dc1cc91ea118870fbea86c849a4fd7348a0862db8dbe73321d4998d09ab722799a69bad863d8194465cefd880f6b2a8ecb04a3463ce900f92f0000c7d0c1e44ab7c42928da722a43e28b1a66625d6d44505e9029817cc35cbc087dd21391dd5eb5b58944da5f1f5a27d5557ad3c3a0f5e99766a52129e83986add1f3d520b42bb86ca6727d7c268b504d24e78e707c43c0198881a366da242a7fd2a740cc6f04482cd0516f20231e1d592eca5b563d0a083b9549ad4698b72a5f2b478b022111fcac73f9270f855805ca78dcfac3872c5589e357ca5299d76b08c60d7d3699be56dc30871fcda893c813a6dccad1f4fde27c01eae9dab1e23acd9307b65a60410c10501c54df948d28786308181b3ee646106adaf5165a77628c72d01470b1700e4ed491df819d7b2551bc2941259f573228068b8e488c85a0185642e93198db9d4ffa8115743ed6b2ab5e0d70c180c6929b0535fbb0e87cc69c95ad830dc0a29505bdbc6d6741c08f6bf31d7c906dd1872a30bff1904b6af765d625afada5414365d36617f4a9cb2d5f05aff93d78e14d41459da08fea6067b1a43b03687ba1661490c3684b4670e47f69fa369dd7f84333e93f6a744e7c3b21b53ebc8d94590e15dcd43fc8c30a51848bb94d81b2053206d5acb0480b49b1ef36ebbc32bd025ffec74c9b543a3d62ad1c492fdec83b43d28fa473b8226e32163a173830f77b457ed30b09e9ed829f0663a61769d3c0072a05149b774760d3c4f363cce810928b1b2993c6edac755ac2775ee2921b83f16ec04b6d7f3396819d5dcf5bb460248d8b4ef728752c05027195238218969cc5aef3ac560652591519b5211a0c67722ef974b2a8027430d970fd193e39867798e76729387136a58ae1d941b3183e7079101bde52abadb5d1ce7382c75ddd25b0bf186e11a6c5bbc4a86737b5d95b5cb56db1434910b69bd72101b5e95df6a8844e17b1cb3bf02dd0c3dcd60468eb3990ca702a1604225faa083e94e44492fd0f092148f58925000038f1140b85221289c85493904151ad089301d927b11bb0f0a7065f53fa32d92b1c04e280085c1d4229c5182021d1cce6b335f28b0cb78cd42c1f73f284866a5c4f497fa2b0e78c71f71a97f18e91b8bd39d624cefa87e4952d0a1223d3219e9b357573132a3fd74453923349266ad0ea1468d4c8be0e0cb01ec888a44606ca4cf5e5dc5c88df6d313e58ce048326b3a44e81c554f277284da91c04c8e45a13cdab9a69e6cce2882cc43e20f98df59bf9a26c4c3a38a957d0bbd1261a95b9d1b84b194c0afc0c1a2bb61c0b33e9c4691adb1157600e259fbcccc498611574ec6b0662bdd4f4245667cfa03b01ba98a5ccbe105ac176530116179cddd8bb3bc0b6845192553e71407ba2e4852c0095cf4140b11aed62b764e2ba032a908c72b16227a9988e347ffcee03d0afbba3a256333180a710985223576649f90cea38b26565700ece266f2c5050185af6e4cabb8d0379eb93132cb7d365db208fcd22d56dfbd5f99cd9d0b951c35222229fcc525a65c8dd1c4761a51cdf347188e101f0537e46c3c9aec8f1f0a447c036aced9cd73c69f728e94b2415e1a2500cb8849cc3a4ccd26215baaa84e0cbcf8955e52229e1159cfacd5382e2756f997b83d1160f18fb45487306b6c0fbe5ccd28c7f09cc02384141e2850874772c3dce45ae5ef1282510e5ff192f4453a3f376b4eca66f7e7c83405ac829d7133ea19266b374a3df157548374c359b61f9b653558ae81f34311420512987c107ae1d6f4a652729ea7846627c3fc1b69feb632078904d96c841292ec7711b524dc90d42698530e0140744163c5a9900cf896abcd6a02cd0311689ac8213b34dcd558f7c2f9308712c8682c0f4ce73e8a4752fe9c1c90804c589909f77aed7f452ef7afd866dc2b1ede14432ff56ab3fa9e15cd8b115d6ded40605cb0b5a5a376c3e7a0854164688a6c17d230af8e1526ff99c854c60621eaf5ef21266289176b7a057720c3e0d6812e300a10cc5609440130a0ce8849da7149c07b1c2da0006a92b585eb63b1ac6d4baaac8d04891040784a02e60091d0e44c4fed03c187e44372a30431aabb19808ea07b80e0b6970c83389a33c2a414c6777aa69cf5a242185cb6cc9ef90713f4b887791d16d4850c5f0d9a9eb1fcd9f3fe1c4167a0f26d4d3b7223c873886e4829176313e17ce96881f2774b96f3790d27c68e459991547e5f41ec3c111e0a746930c6638365a126368fe498d6ab1189790223f142daf725cfa5b868659ddb8c2055d01b81a93e8277d391f7af1df9ae0e5424799941dd8388de0b114cf6bab7ea381f0ac0158cd2a8e5afbcd8d103dabe9cb92dcd890b9e6628307a9915c36a318b26eb310ef20426940dd98be6bce32bb6cdb057a376545a495a0a29aa7fd722370ebd0b1b63398cb49ae60d5e0899a153e03f5db09c0e91279292b469bb78cfb155d1ae678c3fefd56169f97c48c78f124d39250f83263a41c20848c4a3aeac2642513b959616a9b85caedcf07f7d8a04bce3f1243001272fc6552cec98a36f3368a03a4b9ee82ea5a056c43302c9d59d63d986161f13f30afff84b11deecc9d254cf52d45735e5838476a4ea8795d6aa7b6fd68a53f6926e7cb52bfa3a312e9ef8387d93403545894e255b288f1261240d58860637ec84f4285c6b98b493ed15553f0fe6dbde535e22e517b71073659467e344bde56b5395dea0cf13d10d32bef552259742e78b426b94aa5ade85c88b019fd8c3f4904fd708d6d3ef265b9df94cd59287258e4979dfa685d01dfbd60f165ea8f75e242f5e9dfb6422525f9846cbe74199da8ce15b1422af9b072e35f3458ff03cf32ef8ae97c90e0e1c434d6692c69ca084e133f529b821299bc0c216fb83c511c96f32f25b0ddd21eb29a4e6ea1f194f91caa57f30362d3557ffd0689a74ae7ec29692da76a72a633d59cbeae9bffecc5039ce30b3130b5f9805a888950028cc6366bba60dc099edb5b23bf4b2d1193e6ff5196eae6f354c23cff5f9971a36737d0383cd4337d509b796781cbc65d28cae593420f280aa76cc117b48ab3cba7553130456cc4f8882d6903f75e56e654adf083f3df38ee6ad3f11bd3ba4376cae6562b54909cc2c13d8c579ff0272373f2b47b2eee09ef61d2771b0cc7b81131735a07fcd7e02b1430fb01f3073f9e2de459dfead2e0e54dcbb0aedee0d9f021913fc111752d0a0354fb48bb7dd820bc1c106a14f6c19fdeb895e51d3efd6af2a1c70971ae232fa6ce9f9bff9fe696059bc7218c12256f3223f8b3acc23d20d168781942b453959cce45d82c4719fcd9096ad60a5a86c8eb90a7c266b45f20fb1553ed8f862aa41d7844694076d8b323550c604d8812145c1297238a16b1e6f869084461c6cde2904604615575a481f8f6a4d6b20a793f8122cbec725b253f98ab8c1c7d1ece278cefb1625f7b5d287589061060557443e10a4eac89d94fe2980b469995622393c27eec297a0c40da6edb15db0ce03b145061aa8a2e7d1808e51af409e20a1f22908d0e4cafb46ef9e1ab6ebf3cda7152d9c5c4c60fb22c464c1c7a26b15a9e2ccbf8528f7bead2b9f405998729a56decd54f20417fb92b5c43c4f599990a64e0d5425a07b84939c145cbf43870463fc818f23c3a89d69d7c496e7948fd8c8d29607d06a28af5270a2d4352f033cf5ca8c2464255086248c745284fefe27b9762f350b42d020307b19ec159e7aaf8bb55123fae5d0b95860704ed00aad0aace09acfc0b613a3183ba9ab3a6430548c50c3b29f43199923fb31b8b0b0d184651e49263b7205112d774d48c000c42145e99b20ee20a63b877f8883fda1712b8b704704ddc26e8c714f9736129492f71053e9e94dbc2049b2382480547b25c7151eacde717ca0cb10681ceec8556284fa4527b4bb2cb16c205e29629b153a1cffb09ea1eb6ffa06f55ac26713f630da47edc831be02b469d5a68f6d86f4d278888437a6deb0a7fb437edea83ca15da4e34d5ddbd54037751ed28dc54799873d2832eeac427d6cdc8ab45ee514f7abc3a04ad3f5e29e2c7a74e7e6a1e7025c55f0ac41be003a163170567a8f7d516bf1e4db8a5948487b341510a9519175297456617fabc071395db8418af2811554d93d47c00b436b7be9c5440ccbc2386f2c4287e5ff2a33f4b5f64c65de9bc5812e08361816683b1a40f1615af93d536d31269f8ef64e11b5d47e3a5b8d146b7c1b943c06018b7ac04bbd3195c8b6dfed076db78323d589d5d25695df9e9991f772ba6dd645131366a05126c9723a38d2454b4e2838cd4f2ce911d84c705d2b70fe91c331c8d6a895ceda8f6653e44e944dcebd55d05040856c7df30ec1955bc6d038f95be3b88ad13adeb2581ba25f7e9bdc76d6c756604f85d3bbc8762e57050493801531bc6c487d43d88f1053c8c9a1c1e75236369dd86b4ddf5298e0103234e7f1c16cbb0c3acfcc1980fe5d35fae0dbbbd1d66c640e8611486213eb7621f40abf10ea55935a875ca434314da4d90f640de9e702d060f76440dd558745bcc4ff0fe29c01bd33cb34e55d5e6b9d8b07b0f528e1d765fe3fb2f3b928bdcf7d8a46e7b38e41077ae387fff4da422b156b86978f110cf72986fb73b680c1de63a266b1500a8a4461674d5e5672b3b04d06bab6146774576f9ce977da039324aff67d7adc736538408db387010be672a9fd555fae371879418ae7188b5c3f8a4c734d05e15038a5e6a4ec60a945d756ed6c2a35b0baaeb52f2ab231e4d7659e898857425468fba3361cc3e92240ac8f27918277e4109a2858c8901b3748c2b30d24e03dfe23f18cf411f21ef7487976790428185a8baf67839f068275e90703d91f63f29f9cf0384e9dfec695ce07b7d1e11691963d3d742c1588029dd632cc50ac144b522d2fd3173c24917a09cc47e4a8b37d4347fea5475cf42e4839337f6b8da71af5c5b192cff4ee9fa98f556811f3bd2fe0667d51e063584bef172e20d26655a7ca468ee6d4c2f3cdc9854828fe431edc10001eee42d84a6d44e284c991d71f25a6e6ac1f97317e7e3086b8e894005b0ba866427fd2de916804fe0625cee34192040d5c8075125b38993d258884f27abf8b335c0a827293e6d59552384cbcaa726e60cd80a42305103214c9402da62314d727fd32d9d086aeda41ff26f5e3e14417c7720db9086f34d67d5ad2ef192c302ce96906ab9795fc2b837d544f095e4dc51b958261226a2f7081728b49558b6c8a4d7a6e3e4231be42232e61bba63c17be670decb92b2aa3591d65af7083d5914d93b1bebafbaeb6d51ca2d684d7f618c56d3534f17649f17b54443cde76941ed2f6973fb1296f0ecf1887f2506af1f494fea25b14cbdc73ea16ceca2282905f7ca481429c335205f9583b8d374cbd71bc84b692a9f224fdb92d8805a1937260bcfc68d7ec730a6d8c8502130568c6055bbf75d0ba2208c1d13d3a292ed8bcb1c42d8b4269bffa329953a7b4645e57a23b88bfa01403be6d0936652562b7d13519ff7bd4b424ca2dfe49e2d569dfbcbb67f0ad5934aa28038d8a50bf2eec0f41bfa3f394f7cfdbcffe99d2f4fb3dbbd5a54e0b9cc6c25a1944a5fd498b360c70d36ef9a8cc03b5f091cfa853063b87cfaf010e4c6f7e6645a21d49faa3791fb86f852e5bbe3379bfe9ad1e442530e26159f9ab1189ef029783e9b536ddb5c56c37ad1c18366bd528941c1c0e06fd988af82f8d55b34260afc3505ae30f0a503885d70102d36f237119a42999943895435e70cefeaf687bdf915fa1880ea4f4587faab535be72a9ec3b7769715a88b410e1a68e178e7188ac7209020584e39547ddb6a829ffad6860fc99f886d17c1997c7fff70425bcffa70ab279802255a837d8b671e83c4b55544d626b6043c5cec26945f6b311d7ba2c5337381eb4e1d891947eb267a6308ef91a3af6423e6f2f65f0a27fda0042b828cc17d4106b8458743798da6217e9834123891657630e23b1236ccba1cda78c63477053c98aee135c4e00e1e2a3596f9f3f74a35f08b3a3c12b49352b20327359c8db59a13c4c1f6147d574a6b69198957de9cb00323055d81a3627a0139e51175e20d9bec2d216fd5ca2b522db66b0bdcee64d926918fdd8e631bdabb160c5b9242369e13ef8e6e0cc55a2b381b444aee5596a0b831fb7b7844e59873ad663a0f0b3acc465496cf58ef44d002006b742de1f933725b104ec1e19ecc46299612801a4bb012d90a43d4e69460b550b994bd63e8429845937b7b31481349e5aa3484ea238023e2fa98fe229af97d004c707b7631ddfbee00f348fb8292888ce8a6e3463edefdc19c797299bd690e456cec7a9f8d8f6c1580ee9fe10196e95c750c564033ecc4d1811c6f6224028b687a917aa0e8b6d72e8db4d7fa787601eedffbe1ea993de766a7e81f8a010cbb5ae921d3194073c489db175dacb56a73f823e77a3281de3cf7d3babf2d283748aae164f25c0fca5c245476433ffb8ee087285484b69c208ff9471547444a72e33aed571c048130f0ff56c8a94f96e1aa9826552c1bbd5ca1b65ff7506fff5c72eaca8862eecd6bc3eaa286a9f3af2e5bc7ea966b9fd7e160f56a1c521cce6e7bca0720414fcd467c879bbbf50ea1009d1d95371c03aed4c8e7e5fb34a1b3e3b58db4595c172626177167eeec48c0d9178034ec4e9c3b6b73b3fd24b82002b6775a5873fe518b38c5187025577996b514a15460f2288cc3b948254120264db4735f637e2f737d2fede41284cc4137764614a6a2d3a655a3f2d2855c1ce4a1e27513ea94b604ac99f0d7cb7967d3d9b68c01c457d279822bce00a81b4cc1cee137350cfd4d957e4ac77e2a5648b0b0cc96144d7e4a0ae96a87cb6c612904e497911ba2a350eecfa5489f6c3f884960e1cc7d3abc310c5cfc1e52b124aa747f2f15af4ad65e881e72e7545c672025373bf9c1b10bcc1f21b9c46dfd108800501cdd3bd2715154b99282e27d5ead2ffa51bde0c58508340539adb1c96cee1689b980ffbe3c2c777e17ad34f3cb3f5caae82fbee6b5fdc7a3f0ab05e56655c25c0826610a3060458b8b94f3401b048f10c2eeb254871900ffb2604ee602095ba2fef4ce1437c000bd2dbda3b88f775f35695f2dbad0016dec049010d498ad67c6571ec09f940d89a71000b4890fe9fd6d09624c24391b021eaec971fac0fb614d3e3978a164558ccbd5c852319a525abd8e7a09d2b4568328b8d9bda8fa59b17cec6a8bb228d395f5e27cb32adc7a54fabadd0ee8ae1e0840e6bfc0f49450326013c4429805ba257509a70c191e3d7c0a3a1e10ac015a69cac9b65be2400fc74a98f7d21777716720a5b92dee6fe692caa8e9fbd3f58738a20a588f17e8723c7cebdff7538d7534053e9b02702c363ea8e96b614900ebe001ae3d2491726a9d72c5b0aa40ea300061a2c2f9348f204529153f1250a5a96047f7f3d025b363642f8734ab15c2006d4e06747733714b8e1a0fe7f874fe846b7aea5f014fb674f4b3128d223131c827f9a34e169135324d5f01484a0bbb0daa5e0b509a2df63570c4a87849c1b5ac727907393c69314f074ae6bc044acfb328d221f2129ac863df24a7d9d51f4b00da4039807b3af39503db21101ccff454052104c3065893598b316b0e5d45f06d0d45d3a3863400accc457f3b2a8c4ef0bc83f22e32eb4912831c928de74de6e1b8df443cc5d233dbff789581212d74c539f74b8aa71eba6627a64d42a4b328e209b6e34f6c3306241e143e21c14cd2bfb44620232e7e2fa05c54b2cbc158e096b8bfaf59d094588162545c9f15100ec7b32acb8f00ffbd42279695e463e9750b84f58a915c52755c1dd54bd5a62138b8179515b35eeef9da89c7554bbd8d2aa4bdd7917f904f921fe9e5dd9350fba68fd43904bb21b3a13cd2e74fc5dfa4e90a26941af615fff217e4919e8bc162e8b0c5fcb5bd8233a11a0dc57ce37890e6e04f1cf2c8418c66ffba568acd69526161d8a46547813908b831fd84664a834311a66558c1b37be5687e5412d9ed702d03681922cd03d8a73b08c727de3216c476d75f5afe566ec994b51e95991bc8a909b18de307dd2e3f830f7f22ec948a7a840048baceb591338e1a782f2fc812ab706aa829255d6e6eb7f6426e9a1782e013a1bc4fbcbb2b0fa922be9dfb88ee7c650b4914cb3aa6761872fb7e23caf446f51b4dc27a822f25db6cd19d10dbf43b14d306aae4b1dffc37edba209b7fb24949ff73088c025b01f37f07664c8c71161560eae39e13817b610597d8bf000bd12896a74d11e09590309fe0003ff738db315c0bbbbf3595eeb8669a7270d0d5d97a8d807070824eb5fc8d6a598db230c23d0e87c142b288ba3f202c30142a5c90db54cca0d244e87b1c66ce413715b535616cfffd455ae8e08336a1b13c0ca3babdd0c230b313ba47bad4f1fb3dc92da46ca29f49b82b6c8b8a1051141261750618bbb3bcddc74029efc806e982fdf3dd989dc368ab8f631448bf767517d6b5b8af15a205da2b028981cc0b143a00a7534e9cf2e25e9e53d8d7d9dc55cd63a96712cebece6b4572f90d667764fbf5c2e54bc927e5716e0eab855b14ee07f5e07c89326438d78b8c5cc57278c5bdb6f2844f05316589160d01f53faed09a7a039f424eb653290e82633ff3c30a95ea3b204b85992a02bb29727c2458ad1a0cb8aedeac8a77fac01c01c6cca2e7204f72679bd4c15ae551c0e4fb3ffa62601879fc3ea7aa4156ca097c74e70d71f46a9743e28a1327ce99b346ff0e41b2c7a192bad92fbc0ddbc4f4595325fa330e828b978845a2b3454c448b06614cea93c3181db61e18e45414da1b42597470525a57bc7a6d05befd09f0b16833433c70465831d2228ac97208af5701c57fd615108c127ba245693b4d65e97d47706c4a019b77ee57e80550052827ffcca86442145702171b1cf775bc13472cb485c03beb5090302808dc70ae1191e037eef721753887688915b7f86dfb559687b5889a15c4eeb5a6328cdb873b0a929ea8c87bf71d9d399c57aae1f849fdf9cbf9c65232e7842b9ec6db4c28baa94a45658d12d682117a752bf00c84db20da6e65535af7d3abcdd174062daee2caf7480b0a851a006000f0e2c2a7c74994849229d5e1646ed0412097dd67ad9087b458f39f78a326f7f64a715ef8775071fe7c147f9fd1bb703534b816f2cb02fcd9a5ea976363b81b94783f767b0f26970af7ca3fc33466f86424376e2dd400a9f1aea1d7d781dcf31c4daadb442d68b4b7f5c371ce5a32a16a1d1bf932bcbb654bf64cc5ad9e1b762ce19551fa4ea3effecd5550795f17b2cd3878a2bb442416590bdd9a8fa9a37dd0f74684d224e65f4f24aacd376ec97bb4e72d57b203bd3b1abdb79bf0c5aae6050efc438d5cae71b3cc1fca9f5aae3009e095ec80d212877279188b948c725403ce453bebf91119701052ac3c219fbb3bcdc521cb05a9b1e94c45018fec2a044eadf2b069c119eb7844aedbeeded89809d307219f455dc81831261435e65b5a7b962360f6c03e81c3e291ce7ad7fe81711be3b0dfad7346c12ec554fcd4a40add6013cf3a7178fd4474cdb4c9ca91e110563434204c29fc98c4309a6f1a55cf0cdcb482a5f55d95ba5d48f70a67a296d6c3edf83b24c379c656f7b019bc2c93af209e0bfcb5d3fd7e4160b8ef3d009b617dc3406aac99b1396b407cb1935d40809a842ad61c262dcc5b09d07c3abcbb0ad936de12c053e2886d0bcefceefc7f922b9d8bae046b2acc00c2086e9d4fb0cde007d78574b4a4a8519ce29dd629c66833db173edbc43a24e5715f577558226ab85b61580bbdab4dd3b18fd55f258210b62808b3a599e47ba404b773a28203a2bb1e6eb422678c19d78d1b5d7b8ed180a47821602756e0aa01c2508319ae90a2bd9cf85bb55ae444e2517cddd3c9cfcaf833dab6d97478caa6c839d83d512ac9673012132028f61667b24dc1eb9bc872977016ff8d82c70cc23e4e343e7c9170b02e0085af17ded2d91f93b278c2cdf34af3c17a5b6a37736ae17b0ac0345f6bd8525af5bbdb6ecbac7f1e2b3faf13dd8eb3d6f231b0885ba55b91a1dd9756a35bfc21c53a35f387f37674ef4b45cab675400370e72abb86d98c9d117a306dc6ec6c087c8b018f9f2e0e2f5f8881ced3451b0894196ff4104ffd2e6d8cb9261fb94e602f894d54bfd7f39e50224fd4871f1aa00b759a8f394dc6b54e59e64f3b666feb2c60279aefaef159fb1452c7fc60be0c2910c7dac03c395f0c10ed63ecc842e4870914b9757c2af7c2f615d8980d04e325f1128e06e243c296cd71d1c3106ecdb94b896744a1d521780d70e134885c40700e13657eb4f2b2af28a920224b9219538edc98bd3699997d242bd4eb9ad991cfee854892f947dbf2ebefc99bba1f0c069e5eee07f1afe65beeef99b931cd4d6e26a6b87e96b0c7a9a0a5f6e330c4183bd1ac22bcbe3ee08bef56d313dd939aea3684caec8685d181645d3369464039140f28c7b0e528ee2da1c1dbbe78ed7575da18968201a7cfb6e28b6d935d4a4191aeafabdabea2a14f7cf7c82ee5c5107c7cc404775da11728b14e0e96078d0af8a039e8218e4a3bc12e638a3fc1ad40fe4c8e5b431620980ff9388aefdcc477b2614689ff1464e3a9724731ad204a83f532c8d66b7c55b8e5644c10221892f9e4f8a7900c69f143984371a299a3a86bf7b34c6b45928f457e0391922a7501aa3029012ebbc07f118a975406d02e6c6462358a267dbc8e00b71fc067ced5110afbb977909efb112ef8d8e2916c344e1e9da62f27c22bd2b41120e5a2dcbf4536aef9f6d0b4870f8543624f222fea8a8570e8c1b07def6c8274f302d4b1f381f80cbc9a689f0e42fd4c0c250c46a2a6a3118f449f6a9b5c3c09f339b813c1e01bb35b0f37b653ecdb2f53238e4220d1238a5d0cb1c8c6833b7b2709843fbd016f05fb9a26b888b95cd0bcde7cff1549046742fc178df40a70b39c1b0e896cbcd66ec82f6364c36e598064bd0428c2333f5102acd146517cae8e12e7c74a612ae341a25cfbc0883fff37b7fe7e57b3ed3e8c224e88bc3c98d1f8fc1b56ff5644d50214d0b81914138a4dd748c0544987592032d4a6e2ba961aea4ad11121307d5a5deb40e1303aa0eb766c1ee1d24e5616b5dfa2a6bf3f53f324fa8cb47c32b53765d0e6858c4efca7ea62743d5241e4f4fe3124b14542d9f8def50c52096ba8f196a3588f673ee177bc3d3a63c7fca44a049404128b57432eaa74c093eb4346cc8bb46ab365ee4baf06e122af0b5d5ae23fd41c8f8c527a4fd7d6b54d0d46b7df0e08fbf75e1e625c65b1cedbd600e3eff93a247e1c2338e7a9f30841e3f648422ca6209cf8f9098ebef4829fd2c963f49a85b945afc6796a637f8e4d5e0fac9dc1e8d9d4b0cf627d946ce686b5420066cca24fb4354e5fac3e34f2771eac587b12f66c9845ff43424567da1c013844351342d0127fcdcf00dfdf992abd3d1fbb7860de52e85148490f88f30121646216607974e6ec2e68b48d635deb270969fa2b3d9512f09330234e9614674782b852ccd1f6eaeb9d6dfa058f88f245bf0a72284ac3780b323cda55311abdc6b7a38e3724c6da6c196192f96fdeb629ff7d119b54a01bf609b064846666d82648ce309f424ae2bc9f5b640cd24d36b69468ef4231ad175769e8b4271da9942c1cece6d4fbb6de0b5c5916002b6d0ffb03282a8225bd9786f54166b995fff368cfaab8c42a22de4d158b7863234af990312a9c1140f7e0289643b786309c67e64ceca117f2b29654a89d01b2b9df453f58098bf56bd1147acdda6e93840b72357614e379e831d2b78c80c8264fae12763f5bbec19b80d12c9997a38635517ea6837b9785ecd38179e1ae7a2cfcd1c5965e1eb8ed37246381704e5e40fc6c648e05e68631999677a206c2ba3db17e2722f1ae2d8785f923555b7e822ea66f4f07699a6cbe768a5665cc08f79684f39c3ee425a28435c3f8ac613fa0289a2f347438c483356d3cdbe8bd456ba80bf938019a58cc81aad69b6a71a7a6e18759d4b2f26cfb0a41277ed30f9185451cea0014b9a425f39d5499fb835c5a91e3f50792d1c5c486341a16f345d8d113193ac3d54358d3c33800ef25e547daf633d48cfb77b71f247c9489462ad17725a0cbcdc61a9e5edc787aa6f10a23d17237477435eefcc2b2c7047ba12915728e2c1841d075530ca2758ef9d17eacfde16f27566e8d7ef2ec5428c6ebbb063ec52004042849cd281f621d77f92f8cff440cd275d6ed0687aab3bdf629f8ff9ed8564ecf99bec673c0f70f4556380a8912d7a395b43d951508462da3f1268624ee85ebb37ec72af8305a272e58a7df6df41b8906bb03ff7f1c833903e9dabf4073f8c9444fa4c22dcca1674722396b58dac5530f732897587bd4e04e6fbb31388a8f54212d5a885d3a245d91fb1951d5da3db4cae3db87e7288b4c41453e61489fb8aaafb5a4e85069db38ebe43698c6c60e0a54d010d390626719eb4efb52a6cef54a592cc6af8b55fe0facd4e5b52fd8a13fad9a74b13b55e367bd89539dda2b3698a808db669f45a5de5bf6caef5b9f99f4443acc1bd193953b989dd04770043b14f8f8b7448c91b0ab1bd976c19b3233923dc1f464443af2868a578e5a5a94ace54d39fbd6bc9ce1a9211a1a47b9a0d365acf82954cd74db158297047fc3eced3d00c141bf909254e76a4b22e382e36b2d7c82742b491ca5393bc20d354f94d4484b26301e60cfeca69dcc7dc1ab3689d0dc73e0d24194459adb29460400830f4e15f4ac9937ff046ea939d2ad0e5545a9811133c98f3d774c432644e3970de19561d231238ce7a8af708d9c1b5cf1d10971ce3eee962a238b3089d2a49433dfe4b8eb0cad72922dc5b9f42e448aeb22042bfca0ca67d410d955bb6d11d7325b7043df7dc2d3d4a36e46b08bb74658c1589f80fb02bad66c851ab84acc2bc56ce5cede49be7835f97669cb368569ff82a057b2daf939e35e57a9fa184d5105c9bcfda4f4d55b94ae1cc5a1dc1811225ad146aa8fe27d36cb64c8f3ceb1627976f50ca335400f41b1caad407c6aa572916d67c1498b33e2f25c1680deea42fc87feac93463b9000c2ced8b19d111bca9b0980d115b6e7967f677e9076631132dff77b8ca459bfcdad859d4a14e7873ae3d38b369b0e2ef4e63f686bd506f3d9d8cfe8f3f8043720c7e1a9522a05c246b95a76535dfd56213e667922704390ed7b2161cedaef1844df24dd05eab2ebe8469985dd29d5bfe3fc06d7cd07cc75467079503835e25cb993b0ea8327d2103012469ee77d1bae704b67c7757f219c343530fbed929a0ce2a96193dcf4270807c2a3ec1fba04d3c2fc6944c7c1705c3115c8704845d70568d4c57b34ec33481f387a7ea9a44e3fa5896ee80d5ee5d172bc3a2652e37e401b496433e14c9d15baebaa3ad497791e36b9041dae98072b358a5c3396fb0c65e0663a72e414a38ce55cc22977d16634630eee784dd0eb22c61bdc9096fdd7f014559742a1be1c88c0c23320519a931c4b85105dda0b05e2bdee0e3d6bd1be2a497dd5060270382b817bc0bd8c50addb79cc8a741748355c81418e0432c815359529a404c5c39a278b6273600b435d705df0835b9ba55b32313c580f3ca235326062c976d9312033364f1e6c2208211c31cb78ca8f190af7c68c6a5b888eee11108511619855c021a8331b6dcdefe5ffddf04173e831475721616bede51a5fd50d39a603e04065454035cd16a11d7dd4602eb279750356c81b561e6a29a0b3b42609370642bda436aeb08d25956324e1c0d5a264d7b7d7c538f753997977233f10d6d632a497dabba4606b26320aec1727d40db77572c0b09fc124abc5d855324e0deb13d19d211f8d5d20dca1ad62dab2e3d965ecf5a30e3bb26dc81085317c054e66abf74e63c585ef213ad2cbb5ce9831cd13f8643ac43af9813d3566a016d3764773d63c94fcab48b0092eb2923697d4cb2fd87360919a0793ae27e914f10e7e878974a561a87367106451cf0ae9f0d16812c22d8ab8c584a4e0cbda261a0591fefee0aeeb5e45aa3fbfc22341e82cb967448ef163592bc0dc9867f6c399307a8c4b1ba4d60e23a95c722ad91d54b5c8c64bb01518201796ff5f2b19263b3310bfb75d5d833420e1a07a07f023237dcfd413aa1c57af41ae3f8b0981c0f6d5b1437423d076822f81cbd7340f30ab4fcb207613eb336423d0f0e8f884e46983fee0e0903a1825a7ef2f1abae70e818d40e6d2e9f0d2709115cff12baac8c9edb89b2365177b0f182af3cd946d69231943bd3f7dc4d0e5b32273ddfb7cdbefaf502b52a7b2ab78c5e14d1f388870412eb210a24d0c020e7dc611f7e18f87d3961572aad7914c383001a78756d8b86e6e2739f966d467c9eab1d2762fcc96aafff2056fbc44df4431203d57c4dcefad852aefd00370dbcb89b14507f80fe6f02f55d4f3144e36d6a98257de02ad1cdb7629bd2e787d9c5a4a3dacd7e83c8beffeefdc8b7c532fdd585e6e0d7c24fb595f711a857311e39d3abc5bb36c44fef3605fe0883b2d28097ec251fa53e504b54c32e23efb2456dffbbaf1bcb019add4394438f3a4704ad7d63f44b498fbd06a320c21c368e9cfede516147986755fcebc763923e34092e1e86fec0d17bb3627ec6ac0815db14a713c79ffa8364812ea0f1221413e44582dfc99610bd43c88bf546ed3e49f6a2893a127598b4a10a3bf678a2bbeb07c3d390c63abd68baf9d68534971edba5af5741c9f3f0c805dd3c5395883ede6261639f7130aced47f1c822560f637558aa12bc9cd7be5abcba289a6191ee2affe2eca3ea2278c945884ae51667ab2f8fd57b45aa55c74b743aae0650c23a9a419247856289f31277b4f413557ed2ffc284c77f15382b53642b13a0ccbae603ff70f01c687d49a0c5c568f597077219a366e917343ac020566cacb27a2945a5cec5ba17d6396b3f745439115307d8eec0a6067682acf2fd6b1d9bd6fbd71230777d703c3aace8ac97a1e601fbd7a2a8effb4bd2418714d23302f875cb9304b034148b0c77a5e08b99a4cab4e0f304ae9be497faef67c9e0c93370014345e29c27374beb46469af0fabdfd0b901a87c04106f6e5cf8a0a3b6df754a15cab42047a9da3006dfb37155cf201717d61ecf70bdccc3f0b09f47e0aad6bd405c57f9a8c0508b793663f6d98976f9df41dc190e63a8bce9f8d52eda457a66cdcd00aa9f94203626a7b4796147298951cdea20a522fe806519249321483ad6ad40bca2b55e699b7a50dc9d318eae2a95b6ea835a813828e957fbc764c632fc0f2627a7b1506c69d081494c6d1c066e91b30854c3b78575673efc3d8d3e8f8de4f483b67525d099d6be1163f514455cb919faf062a66ec8097568cba993a58f6ec79cf8be2160058a1e22ea95e52eb043ef6cbe41bdcbb533eaf230336f18ebf8a52064365e426fa30609b9dc80e4fd5d983e59278c41d6a2272721de12daa81d6f834234f4f7044002a39558ef4610ed12f0618972ffa2c639ad6508077acf8eb05c16691049b0fece5bad938c126480c59f5ca6e4516b519f714725b278ea876ace6f98c27f1b3577163b2e737aac3e271e32c5e7bbf11d6408f3add3d2f31f2f374893b719d3baa988fe4171b83c128f9a7adeadfd1b3ea2917df1156e69be567d62449f38ea253e1115492bbdfaf343516dc0da39bea707e7042645a027ffee6cd45250af9e040d32d5a38c561eebc1baa7bc89f84a97f3ff1e6b29f1817503fb5136797b29d2ec73337b293ad57328237ac2cfc4c11a99920314558a2794598e446c020a497a2123b8926cca543ffa874c30972982afbec7dda348bde8e2ea7c64bb842d3d6555cdec1992c24158ede7df186e8481e76f048c169c0bc3ca2b3270358a48c68e879e5f23e5122bb5f37a4d2927f3d73ca0ed0d0d06339c60f2c18ff916ee0cce66383390b68e879c05a192d4919970c45b686f3cd4221f1fcd0db77a24314fd1044bf0c8e3bbf73bfb3e08e257f282d1896e991374c09d5bd86c5f55e3648bf9f3999b38047012c228cf04be0ac137df0b58eb025c400f41564d02d1dd09e3fdb85a5a62df43b33a93cc5a32428e741deef786b589f9ed887521227246d3daf1d1498a0a2e9e6d9e564097cb247ee2f429a620c21f70197b8a70de030e4872a13d5f270861073d32677ebf481ae0b3c1ccf5e34d7ec047b7189349978cf39db785ed6daa84fe6709597a9a904ca613b2ea8ab5ab56b3c97c012743e9cf6dca460ac5d6f4b02d33939e0974555ec201fb2ea03bccd08bf4159ca450e4082b055b708a4e587f698f199276aa690378963f95c5ebb1f9afe020d30e92382229200ca0868c75134df163d70418a99afb51c65305ec30894021e9c392d91f41af001f0ae26f5e8f9cdad52dfdd67378a5abf2ba95eea28372f004297f1816a68610e99903bd529e091ac772b33b0ea0060179c2a4af0f827cf9510689a1d6548c1faf92b36b2e3754448ac0a521142bac1a6db3026c1213368cf6d3363c6043c932ff41b7e4ad3465df4377117aec54abb9bdd70bb81910d2115b59a6210ca4cf85213c177aeb4eaff419412a2fbd3832d0de1f12f9c856877cf86e246da05a43ef4d829d8b111d0a12917699b70a8d085f8f2dcf9021fe0f15a879b26e00f3393fabf6cb6d7ea50bd3cfac18473dc4c053f4847e91f5a9af9dfa112520fcf10124c4109671d81e6de26a26da850cbb33c4ce03438e1308dc27682a9d5f08478349ca9995995dbdf19ae6e9163a4c2f4f124594531282f7e7048b149a5d1e3cc6e66eaac7020fcb1ebd324ae9ac9d1c955932149f940f385836ec8f880d59cc29c18fcac01df1d5a400c91e488c27c06053bee24658837856491ce3a29e7c7330caf4ca3e2f945032982049ca88ed94df5f571d5a1c9ee88e2fcbf6940f0e2e620abdf6ff9cbd71bbd326de286dc88fdb90460ec7829c058780980b1f0520063e1a50063c14b00c68297008c052f95edb6d3506f10eac1504f10eac5502f08f5c2502f08f5c0500f08f5c250ef07f55ca8d707f55ea82721adb7d4b6033a9ee9e995b92ebcde0146cc3e2ca6dfd53a6ea108eb82db17f9abaaa715c202a0d646633a33fb33d36d5806a8a5bf39dff176d058c5d4f8dfb9e2e84c623343a099cde63b51000d9f42857646fad299581136bf5a664ddd985acb56cdd8b4cd526d71754b4016c223947105839b5c4bd98454a85ceb6e5b40dde3b6f3aa2d54acdcf853da072dc59fce1d0a1bd64682a311a88bca24bd73b1947624faab6f91d88c6fa200a244cb48da3baf9334d169c8e25263a73ec99e401609c6f4400770277bd2cc98666096a2cba6e556f2c16296ab686bc6f9e2d223ae7d482b0bcba5101e342f7e660283109995dc04d40c5f98420c16c4872371051d6b358183e57745f905b2f4156b343496952fd31857d22138381feead78d80c80660b97954469eba7d948a8d6c6e18575a39e711112a1cf5b56b77cf0a2ad06d30007f72c86a2ae82f801f10afdbbf0b16adba756916130bc8618848c738a3541a9806716bf5e21e2632944f1a3870e9f89114fb19bd75614ef134a8258fcb5ee29bb428045d52794806070aae77e2e7dced8c964515e9fd438c4feefb34fa2e5342d0acf93bb44f048a4f8ea9b2679985bb79fc74a2f9a8393fa9d9551613eeab52ae6e2dd3305455a30ab82bcda3dcfded077714fcf5442d2a530096b7d845624f91a981e9897e4ac26e84b8a31d2e12964fe1af03ef054c9073ac1325c38e97bc44630dceb46a2d1d9e2a439fcaa794c0023368745ace7f331a09034541718cf98dd666202c14e7ea00423460a6bbc2c9f6114a8d961d5631e12489bd4fd512a861ada277d7ccbacca1933abacc1e8ac640625b68ba538389555987c4fa2536d290a1640d617c752dbfabc9c437c7bca2f77c6eb1ebd17fb64af50b0d4a94691d3ad9562c8426d3222de0aa123a86196706e6a0d731fabc60430984c1b4addc0c8f79686c65437efd82d29aa297172199a5150ec6905f3c5746ea8f072312909b9c5f412c4dc91a0db28a4b5593f534e927ba62729662009ba8d21d9cd7a36e584bc6c7a89627f49f0db4afb389d46789c2e132b24df16c669a658cd8bbc12145f735772274edaaa84dd490af3b9d302ae084a9fdf521693f7964fa7082e9f56e2c855fadc2d8430419d5c1841751aac92ef4904a573b0cc476ce9f6be902b7928ca8ed5c20f358ee23f541d1b114ca50f90311aa53069c90f0e758e861531d36bddc70ef5aaa5de0ad278c6bd82e551457bad7403a0f1d1a076e3c97b968c92423d2ae3d7c27d3b9fba9a3e7dad4964eacaaddaa3e5743930a8eef44988e1b74223194e2ca95eb0d95a433b1dbabb1154bd9486aa1137e2856e0a36572eb725f05c3ffc32a26603c9c3754ac18cb322eaeb849f482e39b4c68003dc485d017cafcbbe932eac76cad4ffa5f82372976f86bcb8affee73a7ddf8dff9973f034094f18e091040839870fb40592ad78c99fa07d043145f2f7db4664a3426aeabab606bacc403f741b8178fd92b9eedf9b9e7b1b164e84769d0603a1cc74d8868da66605147940ff298dce65ba366daa2276c5907bedc01879349da6c6add19f351043236a7a01106c4dab881d64b0c38bf54a4c140ef9eaaabfee57339db31a117cc4d434250734ba88e1b34291388b62fcb4287d56fc31e39fd9469ba851a3d26b3cbccfab2ec37983bac8215ebf84e71f76029978856580a2e7162284ce50629a55d8b7a0cc0c53842dbc37904d5a615e083c40e53c21098d535c1ec16a8601fcaa84d20c444f8ee50794f2d76cc5585c1aa59cc475b091059e1100a6d83742029d30c0f97610d18ad726b0f8442b5bb3dc227ba91b41f4ca012df4a9c00211a594bf158884893916f1b6072eb0f8a22d2fb55c27c3f41de1223c2731e9f6d8dd18d013d196ad0c8ce1d7184742a4d071d5c05fc5e7fa6db1010ff04d87a850f0c78162247ac5f71cc08b89ff1fecee111727a651f4a58c0bd786f14be389d513b204b4a3031acbfa8d5a3052ba4a0795c8d808f8a676a39a0ea36d5d6069be9a1a659a76132afbd067e53b8e255a75861e923dc9a3aa802c998f1d1f772f85941981ac37913effe6535e5532618b087034e8877d08878b4a542b6bc9de7bcb2da59429a56f09c00875080dd444c56988db0dc437fd466cd8400d4424b61aa83691d8ae06e2c17ebf1bc51617450c5e627600525205d8ef5862cb0049c04891035316658c80fd4e145bac30c0982289a231608c00fbbd28b60e0034c30c5c0801041210d84ed1c80661ca8411932131c3c58549746dd1c1a8092f5b8290c8ba497f7db2f10fa9b75f363646105cd7c3b041622bfbfaf37770abd3c13b05507db1b2bb52fec71f7213f55847ba5799ecf6dcd3c756d15bc5f83e1d141fe5f9b42bb2fcfba5df4deb56fc28a7153f8ab5ef91bde74385bd1edaa33c1fcdeb89aca62b351dfd39f80a51f18dbf0cbee9c7fee3735bb7695dd6ad7a685ed6ad7ad4d823f93f121ca41e4e6471d71ff7e9b4b18d3be82e669cd8c29e9f5f27b6b2e7dfb0ae411a860deb65b6b1953dadbc53713c1b59b46ab17ef9d6cfbe7a2bf93ed94baf47f5e1893f60d6e1ace46bff03eaaca4b7ca40f6f57b64ef43457a3dea6b9e8f8daccce3f803fe800c561c3d35b2289821b1966fe4cbe01bf991257fdae5105362b4db394a39aa3d337dabaa791bcfe11e5563f328a3631fc91da348f8694254e40b1b94a0d2c50ad0bb6cc895d135a3421f20dca5f9beb653d16859d8fe99aef29771e1905b3fd6fe32adbdd067fe985fbf6786239b8da176ccea491453a1f467f5987a53fad4e3fce37752199bd6bf540f80680013e689202d9840c9040ec28861258a1dbc880294385cf9aa2daee44069f339ab00978faa58da82c535625d3e4a7add1497205af3431b2ef9b3694ff54e48e9d2e5ceb87cb4050837b4f921a7d6b40b6ef831b9211bdd704356b2e186ec54c30d3b6889d370c32e6a12868519dc2046e8052ac0f0af27e9c215a5a8c89126e094232bba24696252c20930e4d714202870d841910b3400b3f040b44318488864e00518b68b0349441431c31130bc7a00c3669282302c047184c88a1454c0b089aecfc0d3c506277830c209242c401f22f3430cbab84086226a083254460b186e004516a01f9716601801c50d4f44210401244c3d782992e505260f306102872c68f0c10f45a03f91d8c2401551c674f134c30fbe80fe73c48823782882a98821b08014e8411647e8d0840fc03801b69191ecd2e4062b5dc670810b182fb822c30f0db210420b2c9658f2830b8e5821b403201d4891e1051a6e40c5cf1136a8411733a8f2e4880989978a24861f22c0c8208b4b092d308851614b174f84b1820a254e27d0810920ae3c55e9c108060b0698a623305d9634614456f778f968cb13b78cf5cb475bb2dc50d562a3ef24bca50626303438a9d2841390715eb8f1df8931be6831a2450b17497001a3511249242191e4207e7d610b55058a1186252a181ac201891bb2803184129f323634b1444c9623b48cf991210c0d6030050d9ea878810b372ae1c21818c2240551a549484a0180281214450b84c670d1028f3283305878e143122830d418709eb86265871faae82283160470831648e981898b182e60a8aea41c6c488a52a40b0d6408fa2962ca172ab6a8f2c409c9d303a08461d4040c33400185052a8aaa6851c4c90cb25c89e14fe01ac2444e3d81e5eaaff221ac5475bf7fed8d3961e5e5a32d47b75f75848422bd256220c40e86e801134c700186768b119d240a2c522c71814415604c39da62658b95db9f12da56256c5a838c45e9e7d69ad51a99a8fc8b3660ed18e4f1cf867f91ae28edd7e1ad68d473828f214e6e2c235d48dc90bb1a0eaab8212fe1c0877b69e7c48e01c7731ac98d4037e4eeb6c42f1fe160ca0d6ddc48a9b7b2405ffa39fad2066bc7ccaa777a51b0e7f1f8d5bf18f46d13a54b24dbaa049fce8208d43efb217d3bb0ea1f4011e833802270fbecfbb24d88d34d20fbfe1f5b1808a354c5919425367801e8ffc5d64f0d8270c390162296380202b90b2d6c28a24c931b5870bad1c2eb87213078808516ccac2798dceff29116a7278a2e1f3d21e5de5c3ed272836b65700ba788890f4b3419028a31a05fa6ad4322b78fb4d4e0d26754c76e301d42fcd9859c14598c79747205d2154468978faea07205942b96a02e1f5d0134c7684d148c12985763608cb62132305034304bc0bc2037301c77f9e8cbd3fdd274438e8fbe80b9fd1cb769d94c6c12c6a6a3f3e9388bc6ec567947e0b617d6500420cc924fe3ca1559ee166d5cf9d1867f728b9527f08c3a7c239ddb07dfc8113cd9963f2488091840021ee16b20bc43df3d3156be0e0d1ccf8977d64f32e0cad9f2881736610b599c4b719ce31bfad273ee472fa5cf27f00d35c13ffa920b1b720dd441ade445c04997b674228b3efd11808047e8d121d0a78f02efd4a72dae3a357ad0a6366808b73f641cd0982fb38c976af65b9649ffe88e9ddff379277ec1e28924989248a27f83e25f7b162c2946e046116edf48d385b1f52351d49ebd50a5b29128ab9e7b7125ffe2e39001870c3172189924d0f6b2f45ba8ef975e3c27a97ed7ee0fe5f30f49546508192586ea80a8c847fd46933cc82e8274e264480343f2a52424d45c467ab95d378ccb3ac9c43fa125534848ab5c31e97231f18a4b9ec3e42d947c7532e90afbda38daf975cc5bc925f26b269e937d41c01340060b65efb7a3a03e26452594f74342f1af87a494b8f4d44e9c1851bd2465b9d24f234476647220fffa47d62f5ff27fd48f3ae01dec53a0915f5118888fc5c79eb3299e43d4914942914e86fe629d10bf615cfac23b60ba255f91d54a59442f3a8611bfc8576cc91e98d50fc4ed22e4d29547b2e9f6732829856ffaa512363ab9fd728ce784d2c97df54b25f9d471896ffa9d788ef456d887f286b1ca90e7446f85154928daf7526cf915ccead7a27e61c550c5234bb7b3c72251cc723b5ee9df2ce7499ea3e4395e1a47bc32ec2bb71dca9dd26dd446b42fc556cbc0acfeac46197669e936833d430c2bb3f89ed31b0d87736badb5d6adc61a51a84d98bd15850159a37c4dc6c85cdcf6c1ed316e370bb74d60827fd1e3a6f7c411c43fae85f8a60170fbc7b861679c619f3d5fcc3f7e8d0bdbd11881e7ac76d43b1f087651304f40c173e6f3fbe831ae4f2964e31fd7bf7d240a5ba8ca12ff8ae09d3e2216715d8f1eff421fc1a17408426d04ef68dfddb5db29d69a3941e9115aa843e8ed398792e56633df73b3cc9be97c7e4094a370c8d78ea0dee70744bdec5aa847d072b3ef2d37fbcd0bbd5febb2dccc0b7f886e08845ff7070ae28db202d4f38d3d280ff5598779a88e232bfbd8852c70dd88a1fea2ba233f2ea321a1202023455c20921af611b767c74d9791c0109de01f4f57fce19cd5049930c8902143260c32618821c698d84adc877f728b8d412cdb6750ef281c95c548f6197e1e8f281cdb6fb2d9674215eecc7b35b25802bfbde6ad7a66fcaa87f65c839b47a50451b68f22e3195cb5d70384faec519e0f959eccf36910f533ff03868ca567fb6d25a57c790b01425289493a794e992997621328123d7143ee6a43597870d9881bca3197cea04b5f7a90e784f4e966a9722997e9ee9ee101a53e7b1ea74f9ec34756bc2e7d5ac6731070e96fdd6a6e5ae7ca7ec633aa275bf5cb7800fcc675ae544fca5bf5d83ef59b479b228b7e6afb06b7e771aefb01b5ee07ecae870cefc807ae0b008fca9cf1d9cfa04e2534c87d83dcd32c76d558506cadda5b6540c6cff81266782a50e991bd36e355d05e86b7ea6750c633d82effe8cfe85a4647e9572e360cdb14e94b25f9924faef6224abeecd3bc5b6fd534deaafb859ae6693c9f19145994c7fb69ba9b463e5dda4f335d9776b7d7437b1acfa7e9d2d73ca91459f47d5e7209e3a217ffe8332d5d2a5ffe51395dbe4f259974a937e6ea11dc93af0ec108efb427a168148e9e0c89c566386ff3a250148a4ce29014ad63301215f14e9511158df8863ef5c2cec73ccb34e42f3979ce928ff1966472cc155b99275f95868d8d7c51d7a572c93fda83cf895625642a689f3d83d408cbcb677b158c64bf79ab12b4df7ef354d85e7b067db2df3c1b7b328fcaaa99dc76e21ffd68c4c4e52e0f722167e2432ee5255fd1e8a5b4d4e4f434030696d2efa196d2445dd4464d53ae6bf403d2cfba1f30be62548a2d06a904e9c726de698cfb897e002f9cb32ccbb22cdbb66de392a201dbb0502da152b61aa615c21fc7bfbec461e68648040c1c4ef5f75aad55a97062d7c5f8f243b212048b53bfa387f36df66e9b1702d1b99ac75529b62fdfea615e8843bde9498fbdf003c28ceba9221bdbcc086548680342edfcd8a5b0c2e5e7e771efd9715bdf816fe4c7ce79e81066c0c0869188281645a38825be624b82ed2f7fb9922f79933bf99393533fb9828498f00efdc2fac78e5e46f910df502f6c7ccb37fea10f195d232c2fa5a5a61662d2432d85a808051f4188b4ab83421c1c1d1e1d3d26cc808195523e57abfa8f777e40f94e1425835282f21d0bef745caa40d8840ca9d7573ceb675f02867de6a940a5077d2c7b15b0afde8a9fc1fa0cd6eebb2fb2a6fdcac5863a3d4098d743dfef7c629da523b2b82f8f6fed4d1d6c7cfff93e62cb4197d2a35c581e9fd1882af1ca720970598917d1dd9ab33d427b28cce01df742c03754476c5121e107ec892d8ded55ddd76c6cd178284416fd995a51d6722ad5f691977462061ccc3c1e9f39d8f992474041bdb57ef5e81676fe920df97543dbe3f56fbcd5ebf14fc809fed137c13f7aeb12d63f030cd6c8eaa6580b46d090ac3ff6137dcab069ef5587418b1add623f2d808cc1862d458ae75022ce721ccd0ca51c6737ce7a1f88349df46f86f3789c52fa1bad5cb5a9190cc33ec33a889b2966f5d7541bb150ca2ce3925c933e625387f3a7f8e7529aa82f87c5caaf282ec9767c75c4566d7f2c53ead8d0e1b941310e6b29b54833a2caec87f238c67595f8d1f8706a448deb6fdf53a4bfa66d5cb7c5fa18867d0ebe98b742fd0fece76328d98535ec9008d685327b9eb87dedd88a9b7543e28dde073a84ed7922d769dcb679ddf130741969072c8eb4430e98ca3faf517d4ef85346f97ee5184ed30288b2c5297f862ef6de2afb1f1e0070b0ef4dbb8cd98a4bbb21f14eef031d825f46452f361f0d177aa2a90aa51a950e55b4c0c3e0d4d601102eea76fb2fe1d4e828a050aab9210d2a8e6e4cc08df12d154c37beca0b1137feb770a30ebee0b4065004ba776c0fd3d522914989c5954739b8b2052319bb70c97142ca144da67092020b8e13e306658e74e5a4e472be237ae6a0030e644c91a1c3b6437fe516b51547474aa78ffd463bfa4d63e3cfafdcf2c7a8175a6969ee8fe9d5e8dd8f5cc1dd79f042926343563c09e3308ec0e18b2646923069f2039c17bc0a48806210a68b0bb05c01baeaeb0d37b4319a5074e3f0c4cb0c2cbc8a7882041855804185862d56b64cd12f5002d342449560ee42144e38d154268622a25c89010731aa789a620929ad83152f9a9142098dd2bd812a7610842e7030050c0f988ebca0c91330395822069dc30e3306da0d1d3536a158cdab543c93868ac5af610805492125981448ae5f77015c3e52e24289094b626320968f94a0dc8d866309d91a6b55aaafb1d5a323b26813a10ec39d524a5f629c450c46bca6e6520fe321f559eea4224438365038a1c947109f6e274ded6a25b49d87e784eca5c70f3d9c85bdd8d8aab576358a2ab2a41036e42b376ae8789c7f22bf227f68a6dc1ebdd57cbf31c61831cc8580300cc3300cc36a70347ab0218d1b3929b6477c1bbcc3b53ee1c2300cc3300cc3300cc3b24c5569955abd485603bbae048ab163e4c89da36f5fe61be937bac0860d4a4484c4628f011965ad14072a82b0e898bb7489611886c9465980053764414b8e33324a7d1e9f355e09034a29a594d2e6b854aa26078b8e28850d6d30cc07f67296655dedacccc16d2eb7ecf67629a594722251d9ef719825ffbfd8c26196e461960e1e3ded61903b29a59e9c55b65af99329f8dc89d1e0d863ee986398466bfd46e1d0300cab956ab4629562b57236a5ac19a552ce7965f3c765f527cab655af355419f3f211932bbebb5ff7e715b3bbbbbbbbbb7b747f77ef678f3146148e193d8e42dd9f7aecacdade423268b3dc4a41103100c2c9d093273500190b22264e3fe8c00661b000f233f357e6679e8d3da776d9c72edb72c88fdc86ca91d1c7ba39bb28dacbce939eb3fb4c48b9ba23b1b1cd36e3afa65701bff33989198c68a5865c2e5711908787094453e8b51925fde086aa1bd2482aba3c3d4679e3e790376a33b0218d1a3a9e13be8d8fad558f7e7e15d8a3fdd25bf5ac4a601558be8dadf656255015bc1a599e811f907a0c00193970581285dfc93de6e0370cc3300cc3301d3058ec439beb2b5cf951ca8f3364c1951fc3fe3c677a292f4afd185988ca90858f9c9072a58db8fd510cf5511442b7fdb6133989445024ddeef2111444178aa19b80cb475c88ee46d344b4206ce843de0af2f4a4c9c8d14469c8f4f1afff6fbb88bcc8699375259ee3edb22190d4b5fe35d74898d5ff42d7703b87db1d064c6ee82d5002442b462fe52917ac4cb5770b6088b961bfe0fa2fe0f2111857ee46439f6d50386188fc94edd1c32f9fdddd9de5c72e0556ba3e74f8d78df2c26a596cff957ba383fcfb3efa830d3b480913cf616623244337766c942468327137a4c18161c4f5b72a2636e4ee9544d890b3b1298913654e2a6c4d6f3590492a2277d880a8748cde1476b301a775fc7332505235fc739caa52d5a4ae6c4054e6277910fbaf46cda7ac945212f10163431bc5d890c78c1993f960c38e29bafea99a5594f90cca9746ce6503a2d2d308c73faf791dac8e57c33f7fcac586aadb9aef3f811a5f60f146758db3fc1b95f254214e05c28638dc6e713c27b4356c4a1ac52eeaa72c576dbe2b6c5863eb8657f9f24b11394c1172b95c43a064ff74d46099c61bde62231eff95877f1fd690aff40e5fd0b85ea3e3c65f6109440d632d6c0d16799134832dd7dfa59429445e0c553142beae4f3aa9036195e522c7f6deab78d1171b5a8d06369452bc0566f9cb40e482a2eb3b5cffa71bdaeb417cd34a91a539d9b0dafb72024a85c244e4cf4db161cd75e6be716ae8780e7b956514c19f4eb1a1a45b6ce8433e145bcd444a43a9404d11364ca554446036ca2fe6626417c1bf96b1d1b3f179fe4fd8f0ff6dba20bafe38dc146b8347c7fd3c377474a370d4e8d0e06460c3bffe36aa9a18788cd353edc6300cc3b018b17eea55ff38223e2e824b8d081b63d8e8bb1225ab55b1a107bd629ced45eb4112c885dc49c9f57725be248ca5ef5129b2fc9594a417f6d2127b61373579613bddd083321041eac557dd810d25d0757f09248338c9c4c7635c7fe73e2e94ae3f8d1a6ce4caf13185fdbe5d5c700125bec0ba932bf1b7453d73609dbb2c5c8ea60bdbcff1276fcf4024c816aeeb3fa44cfc240fca679bd09d9c888be04fd3c4a25c36e480780e75814b133db8fe9c3f8d17366427aac586ece4e43490b6074eae7faa66be9094ca45f08f39b0abfe557bf6fd3fdf4113535ce021085f38e54067862245be309283152d808ee362c454016a577cb609bf014e4e461fc793e5baf70ebfdd43befcf97ee31616e79b32b07fa1b0d5eb33abbdef3691dbeed1cbd64ed7fbbb87c418a347c44713c20e21c263987c3c27b4292d985c7f223c27a594522a258d5d8796888f7ffede902cdcbf72ed54c5d6a016840d3ba84c03794ee831f40ed7bfb358f22545369437e4f857fdfc2ee451b280728f78901476b30acb474d4637470e523c679391230726db96230728716bce8b922edf1c3818e139ac0418236e8e1ca0784ef41a8a4dc6d642c352babbbb7f75a7ed5e3a4666666ea3ad7ace2380a665bb91e95d7f44598005773ee6cdee8dca717f68f714f33554c32e149f19e8c6c7ba31b0e71b1aecaa79e2ef26fadc4bcdd45e70ee74eb2dc79ebddc6d722e27eae4524832a19ef2af5fa2b2a41b3ace8d4bd2975cfa5a7c72167d8a71dfdbf8b27213853945fa1cddf356d9cbf738c63f3a2fe745a72e445dfa1b165b3f3e8abe7c2a1570a9174a035cea8501e8fac6ce7629ff3ca859f4552a6b9b15d64bbf72313e0ece7b508fe0027b0cdca2791a4473430f1a400dd2e20c8aa63a2a76180a47c42686610588118b28ec1995cd176a878d6db6ec43958dd35049faa1ca86673f71aac264b96d6d0a73c9f927e7872afaaad86257f9f72ab255cf611a3454ce5e181fc503fb23d2b87f3d772d47581451faf488c9cba594fa4b97f28774e7f71cfa3a9e53a4fa9523b4778782dadf0d11d2bfe2dbce2db1a1bc7467b5c3bfbe90ecb70fb9efa76f7987fb91bd3feff00eea5358a1e6d2df505d5f7f7bb50e0133d77f66e6fed5ba091ce0fa1fe0007773a331da75b5ae6d70b36eb54302d75f0212b81b5700fbd55c9293fe0c4ddb8e9de5ac9fcb287fd9f96f5ba509e3a5ce8a1eb597ee1ced6a17d66d1b6a262dd441ef85acb4f42137b1d35319ca463a349c17aa7e4379969370b00f69b450de33e760afa5e0736bccba14e2ade147c48dbed7109676a2f3b12e0522d80d574801bbee777ed70990258c10d765c7558a2f4d03f7c5e8f217a2dbcf0dcdb87cf445c9edafad6463f7d706969caebccd1dd8b644661653e62e79b95e997bd950ceefe79c153daffd753d6218333373770824d5dddccad80e3284884fbbbc95d9eb939fb2a6c14aac9758b0fd95e9862de689c97b896a61fbc35ef29794229fe3529c75810db9eb3d85cc3b44be0c9429a594aa640dcad10eb3a719a5d9d3ff21bb5453ca5a131b72f487dc997a5bbb54a5ffa3fed651eefd5395d655053c9b7933cf5beda05fbf7af2621e10ee6a8d0df144694b29513c321b96d26b1f604f5615f05bc337d15bed90e1bc9253fddc9f6bc5441dd0607e285fd6e09bc6f1afa7acb4ab55560c8b1f4aebd1ddfdf34fd269e35f9df3a5bcaad40c17e8d70f2de785f5b9faacf2cf31b676722ee70cc0951e10ee46efb1327ebb6ff8fdf5b7eeb83adbbbbbdddbbb3dd9f2fdca78831a44bc40b8db4d5fab3757e39f77fb5b7f1fa29592931508297f72b3e32bb91b3d20366ebd406cdc9fab4493fdc092b1dfde33977798e6cad5aa02d88d5e1ff98089902b3de61b1bf732924b7136e684f1fbfb6d77a9f8de5e8da75ad6e9fbbcd1ab9185aedc5716599fce592765e736763f50106f1415d0d72ea37ac81eed728194513dd808a46136b69145a82e11e1777904f9618c31462143e48de25a95d0e0fc06a717c481f36d64f1afe2f75deda0b9f1696e9415cce85d66f39feb34f463cb41eca9b7c2aa8406e93748bd200ec43e488240f4935490d901a1fc09625e922334207d07fda3e3e8a11eb30378dccad07ad27d08133ab2c2e912e0f2d192ebba4731728c74924bb249325d5a2bfdd845a40e81fe36e5d0a52f87a410151961e19d8e4eab9e8c7e7c922e1924852413de7101e7c8177ff4a98ce252fadbe6f9acfa3fed7db6e79e0406df47b57d990ef7344f0283349e0fe7852a9d0932d8264416154202833d91455ff37c74287df63f20006eb00c6edeaa87163d2c23f5e0e5c6771a3a67b85846e18855ac7caea181c3bf31520f626ea87351d037ac61c3756a6cdca9fcebf8a567ff027da367c382e577cf55aa5a3d4f492143e8f54be34f1991909e10213d19427a5203d29320241ec440e2410c120f5e9078402a028907a2397932cb399f797af559b2f62133f3f6916e1f72dbb77971abdbb669744ec995e5632c3f52666fb563fe64b934e78c625c965b2bb1592e3f92104a97bd21fe7d3441965b5d461202c8e51c19cbe304203dcfb7b78d5a8cfefffff7783c886c8f1e1e4bb20081f1f8a1c7bf1efe7dffee3cbcd8a66536b689dd9362149b5bab6aa6516c5aff7a493fa77dca66af699a0f1cc76ddbd61c954dfac728742798105d9653aa3e5026edc43932d6041f443ca7bf9df8e72300e235932534f08d7ff5c186ac7447e03961d3703da71f051a6c77827f2838cbfffb7e0adb19d38d5b3f765a6c7f04620347ad31d68a55af659d95d6ea851846a754c91a1ad3f11c395f47c59cc7eadd70a983878f6125151bfee6b7cd093fe7cf9f3f650e1b86d9d4f0cfe3b4e1c8f228594a0ca02cc0821b7f7638383ceea82c8a36a69a3bf6eede5e587fd6fa655996cd39318f526a232bc6b8b5dcb6975b742a2a11d6bd4af95246effd6b1bdf227243b47c14df707cd3ef85f48640c06c6c13ce027867a7a433b061aa65fb872d3251314c097a24bdb0fd31c6e8b1c932d6826db9b4d5bba257bbf3f6ad48b6bbfa85edf8da95f34a548f8ecdf50ea5f6563bda5bede06e7bdcdd24e5563b9a7fee1681704054937657ef56b99a659b1443e9c7678eed7fa3779759f19970e2f22445c7c337f159cac8d1048b7f7ca992917f1c726477ddd9f17493255766feea85d5887f461d9e53b38861cf235be8eaf01cccc36ee8f074f817fb75f967171bb21195c10dcfc1e6ff2081c14d7b156c2f43ba5cdad355f57a6e0f3602354f1559b53e467bb0d20b712ea3a2a86e5f5967d3c6baa50aa3f3bff2b88b91bd718d3116d9c861f6a1f621fd10fb30cbb24fd3b48f2c4a29866136b2b8a5941cf7d326662ec1c02246ed47496f442d360462e3ce99f21cee43fa36c5a53c07f5f151280ef51887f2626da150f537ae4b598e31aa659e8a59281c34462c949807c4c69dd2fb2efc336c296fb5474ec5ae1490dbcf1d856281a46e4b95941248eab6ec62db9adeea393176d16bd7ccca52703bbb0d54933c485984f91a0a28b7cf4ccf09e90a6e4b16dc9eb7bb9d9bb56d6a6c5413bb5b944672da28d938d5d8aa552cc56c6c766083c598c5c6c6c6a6be7f2bb9aa4d66a3d96c36d795946abbdc15d4ae5a315a9988fae624e765ac562c93ce22d8125845a266d14b63a95d6435b6302c08db5f81d7362e950a63b1bb358db751d5d814f68e79416c6a5229add6ccdaaa52614e41f8c69f05db5ca5d8ac5aa6e9b0b98f2044624b887bdef8b90928788acb0f72ebe3b62122101dd0bed66fb06af59354b0d901f4b3aec1d6ea3bb882c7e3746e47973e12128cd451470707875267ca4777dae0a276f0d1f77d9ff4d8a9636036b609ddc726391f2dd41dd474c3ef32d20ddb4aaba518b9de431c8617d78338d6552b36ef839053cf83222bc9b61530ac5cff168a2d6767e931fe941ffe953fa4e743342015b9726f2e23b98c2e9291a21be21821bafe356c60562c231571ba17c77318a948d33d7a2a131b858148c27c3abd15090cba1ae004720d922011831460a000bd014e2083f3ddfbd8aac8f2e7892d1e6385a905268298c81085e58291153328e9214b10407f1c7f1d37a27419c908968b80cb48ae1d2e8e037887df2f3dd22015c92c6f47bd3a426af08db7aebf081c823bce5f36ca0193db1fe244974f9e9f2f938112046e5cc0d8ad4a88dfe54912b8022f71640b30be7b3e3488c0f800ae20b1e430058c1e9555f81383b08508f48ec18d866f68b31baa1034378862a90b4823837738b662113c44d1c208dcb69800113d14614d9677daf6f70d31241bd6dbd80c777cb28485fde9f27b0739b594a1cbef38646c3fbf382c5c801c5bf3434bc3bfb5abacb258f77d64bd0e8e7f383aa2f04496bf910991054a212cfd696f322fdbb56b543f44d6496cdd050b36a02c20d16560d0c553993b80cb476560b8f6f291184180810cbee197926ff8ab950d0636fc3b1f8511f800126488e770a89fdff3b135f3139c8f136fe8e09d662670732e7b4de33e85ae35aa2c27eb7397c20a29f4b6837156b6f47a66f04e7b24f0cd44e1908fc2d19cbc331d8314c5838b4b5e72fcdf96a27ec900b3268e46f5f0cd7cba039b63bbcc3758b3cf5cae1be2834864cdd7ba2040465051f08f8b9551f44756bf4b0bdad826649a64fdfb9d1de5aed264b0f4867f39e51f53b1d1706a83e52c0e540ebac5e8830db91a1ad795925e3afef1a7ac1147c6fac472fd99afcc4abda37fdf50ca395138704449677cea9e425f4f590c43e1e060b0eed59a659ab6711bc771adcd843fb7f20dff6ca6339a906dae727bf315df5f525e43af7eaaf6c53b3357ba4b7e3fd11b6c6399afea81c5420757528fcaa85f9f4bbad51289693721ca9957bd6d8aaf281459f2bfef5fa5b2363e262485a40db37f8b43d8ead130b6c7bf76706b8e3f82fcb54788a176f91b4b8f103d27ea109ae09dea79105be4a290fcc652edabbeaef426270a9d48f54464554e84c5891acb8ce74b91b5453e91f87dff2a55a4aa8bf23e730bc3e6ad99c7b6ecf9796ecc743a9115028d4f0111c52dcbc35b0d2475fc8b9a8c998679db6f9b6759966575fb79519c0fb5ce5951155551dc0fb3ce5a5173566ece592b6ad6ea0941cd396b9d28d49c9c17fedccaf5743cfc8b2f64b3562cab7566b3d69acd592bd6401d444687093eb4583ffb9a790d74846f80b0f148ed23bcc3f76e5a9655ed6bf651d3be661fb3aa659927a46ada57ede373d9c74cabdaf3b8c669805991c798107af061117590d451d3b4cfc157abb566ef2dbf629cb4b9fd61634c08cb4854cadcfb75afe2cf5c1957f2373d2e8754f5db08e9570254c40b7019894aa041a8144d5685490c15aa1901000000005314002028140c064462a15838205354ed0714800c89ae446c4c1bc9b320c7519431c61860880100000000003030303345007f6095a748364c84cb7353643c1220919b489886264b337c2ec6ef8a00e96cf314b74f528bc82142e436b0fa2a0c0bf2e060bbdf6d6634247d6840d70f9df439e1dc252ea06e9ce40761a93ab0b0fcb0321b448d02ed1a1104ce7b8c3b816529087b22c04554d01495235a933c73801212287a8e1038d59eaf5bd2ff95db3d55d5ca1c0784548d7d2b377993cbdf176af28ade620455bdb62db4de54597458678898e8bcfd005e31c85163edac7705e4a096d78096fc735209fc55a882f3b5d13c4fe808b4fa2c6bd00ddb455a121cc63e48d2f4589b5a5626397651b6a27ff4b036504f415f5cebcf47852df4c0d5379c7027498bb54dc1cb93c6de5edb1e66b1f0c1e98327fa368c7b11b44277ead2fe85e02963adf13d7a743933c94d78b1aa4421ae4d114ca97e5acaae824e1f63806c8936592863e2498464a916099eface0afbb7e1d0c23c3523d016122aa5f0e697a2e089bb6853f061162e9db6d09bfcd47d92ccf48eef8bede7cbf42caad2f1d09f4794f59d2ebec226e184802467a99194b539ae80cda45824321f4f243c44ea04c0605a6bbe55d942dfa8eaea0e02c979669efbfcf780c31e6faabccdc0983a86d884121c0b857e59f0d82d0946b05192d2aef28d5ac8283b9082432cef21b94150af4b5411a0b3e4da021b5d9d9368518f4a71143b485ecaeeb448b07049c4345c7b72146f6bb358bd7c7fa0ac8ab3ba7887e50337c99f669a419d14f53f8393c5ec48b45dbd7c8b0cf900441f17eac38cb4e535f962aa08006fc1571d8988509007a7a388f5473c3982d0ea81cbdb95864a262042c17c6a4f89072099ddd6b7d212b74f66efcb6f4c6b7fcf022bd910a4b5286ffa613f6871f928c91603f2f3277c4301e8cf598a82efd406c1213510a2f81f9ca35acad48a59cf449fe5478b229c8374edd35c1eddaea4867e665f7ddd0290b9cd8b0ca03c82e7b4acec968e5b4d826b611a970efcd904201d67eb59cc93172a4c9d17ab811d2f93eaf3f44786242a9175f91bbad7cea1610f8725c34002b4eaa1e9932579852da72734c716f968b9502f28cde95cbd116005fe366f7cd8070417ff11a78c716d77f966b59d6ecb3bc8b898d8dfe3333d7e2a302c35597576396d0b213f490f699b0517835959235470c51fe5336b3289ddd98d2ac091948310db7fc7a1a2e15d76bc81e079371791a2164d7514bb03fb999647e8abe98f1d81b8d9ba3ed1c72d8562a1d18b5bab7815c7935a60a680dd81066ad8801881ec12edbc86677fe656f9fce0408e3421a6f89b1700074e2ae1b8339437256ce3e3c514ade4c9a0549945118cb3fa48a3b44f1db9eab63f184f77322b696f6d8bf45412ace70e135cf9937eeedaab76d9b670ceb832f960d4d058c47d6f468620b8d6ad0457f0e35f5bf16ccf1db452d32d0219120d39cb5c52cb2a0c988acefa82fad45ab264b003dc8d2089c02b35f0e24a9b90f4932ed044893cb4a656242884ee00ade011c6b7ebda8514aa942c937093b32abe6688402f2e85962e6b759e4fef0d863d782b3994cd2d8808fc02b6ae3247a9095b01977fbbce2235ce6c4a7762efd03d4bf86da2798b9cdb3ddaa0becbae7eaa3431d217b0eb1d1aa2960b4095a119ef9c57b16aa452ca615727c7a08258eddab9d86dba72c1abf18e06734b917903b831a2fe859f0ad08e4cf49e82e27937b35d022e44e6388a538d4f1ec7822bf338af79f79f92a2bfbc0293a2e2e00b6bbe184a50967c2de0cf2d9c23a690bcb5c38c6dbbc2d66fefb2bffcaa92895a18a9739976af7c725572fe50514ff3ab7646c53d5bc03aaeea958bc27cbf3b4cba115ad0ccf050d654477e52bae8205edb434026495270a8998459a4055f15c6304204d8349f625b092baa845742cf1c6152c4808e6b3e9005a67dd95f798184c88474073e43f87b5dc188fc5540486fd63919cc571ae6b314102630a93e44a30dc72282073d85fa3217d8d0d5d9da42c8ea3990c9c5bb894d9b7db8926c77c68ab991e4df0e30512e68b2921f7459b61027cdce1484afc2a0031c5d50a187fe82b963bd8939b043f5b530383f8787d7ac0fd699c0f8eed666028da393ac41a10d076a0a600d7676bfe850bf05f72d46f6aa9ae91902a0627700c91ab8664d4d49850472e5b17ac684c094c4637873221df79e5050563deea8232f2c5c4bee87bfbf85bfbbaa9d34d4550ec43458fcf18404d2233b0f4d844ca3e102f85922b65c19f5d0f2ca7030fd0ec7c030315a6aa29848826829e8519ddb7bbcb40176423337e00fe14b2f85af79190465e747bf291e0d80b1fb6af031bf1e8272d91a277e3f9e8d6792098776967e4f7883dfaaec49307fd23d79ce0b668dbbb0d115490e840bb4dd03af59d6d5a4acaf5af8eafc15319edc47290e0e8ada04326a7e0da51716aeca610113681da9249965b88c515b5aae3343802ffe257e885f91c5a02aab6d7a81418311361e90ac6f41e5bddbbd2b7353346259111c25931b621003074c32604a6e8d2f8f270c30385b563345c57c91d0a6f5c3121547ce72f07107bbbe3a7167e99237bdb5be499ea7a8f5d0b66f33e995341650245186fc95b52564332cca6dbe21bc1bda4b5aab501392d10e2db442e38d9b1f73ccb4e104caf7dd79cbf29fb8559050cd2918b52ba36c5da94c8b349d95dc9e06a025ae6abea169ed8e0159a8217aa9570da6d457557bbe525136529b8208a49dc6d3092d245e008a1cd4ca993744109e62ca0ea839b65b191b45055860cb93516ce631316789d12b75604e58221df8f90e35333fe88b1a8b6fac72fc312191242f1ecf31d273894d152e79bce5aa1712c155c941270d0739dc819b9e401376c9d982462f5077c6ec3ab32d782083273c0398637a80933fe771f026b998d30e1aef8b1960b970f68612cfb15e5d14f0f29dd529ce27d1ff433b887e79ad928ce6db8ff5c2df7431ab94227e4c0bee58d610656b7de7b45abf8a805ea2a8bd01b949c887b311ed50f9fc4d8a7c76d5ffade9c4ee45ac2a061f78cb7b80ad10d2180c0501d7a361c8004d66ef413b62596e1f5930595ec8eb214b14e191b289a35f2e39149e77d455bfc3287ad155048d842859e46991e042d241272959444774242665d0cfca9438d8b48b97f9ec69164414f415b4b7d485e441f5019117813d4fb58b0973cf05e91ecd6165f236ac0cd6277d81d1771d82e872ceac74d2f19f97e90c150a2083ccb5ff62c8e84cd28a12f17e7fe1e90adadcef75be47d6717ac8b14f896b32fb6a67694b917cea067cb4c4b6cb019c9d58ad1f25d3196031871dc4216ce09a76b76712808004596341495315af0b1ee91e843bff500520d67bc1da35ab25e6a08451558f38802caa609ca60bda5fca627cc672d605ec7ee531fda2f8103338818530d2bd8dda9c78aa73ae621209260190401608af39486f31a2d62640df9582832ad6f65e48948bc653c6ce004f84ab0967ea7022bfd7ae40008e01a52f7af978bd9515c4717b0624abacae50f6c9f90abb93508393547b87e0884834a4431b1940b2af1e34eb2156635c252de095753d20d1436e987de36192bca9b3c0d349d72f9a431c847af382ef86b73a3571d8731c3b90512dcd23b0e2063f529ca4136da8504f355248e4ee1912a91e5d219a641aa25dde6f1af4db4c3554520e197f14ceb6a792b008d73e3778343280050bac2aa803a65ec9300ae8cb1868c196d0a5200127469080e6f8f94d7786151aa42343d52defe96e470488943020c2d5339a0670627040d4d906d0d2244d2789d88d47d2543131fedce11425830c10213c936b2e87a5566c0b7150d02b522bc40ea22f4b372dfa67bb84d03395a075db1322757a053ba12acba782101bd1c0428a10e79838ff4abfba055462e8bc59bbe062bafbd442ea0e1c321a9fb89eacbbc12b74f3edff384e2fcbb7df4215a056e1638008a81742e222bff93969ba49a1b7cc301d87c4031d52039d7c02725a238a09a5f188e92b08d5b39b54f814f4ece72a427676ab517c2884974f2501e0a61adec6f24a08d14e6c64403c2fd1c391463977af21d188c17a9d1d6647bf225e9d3027336d821ac3db1b9e1f308c2acbf6a41f6ad87534caf876582d9eadf789f922cbec59c1ff4d71aa1e72e8bc777e3a186c9224bfb8a2371e20524b468aa6e971ea0c5b44d546d95269a0fa3621298f7bc4628255922e2ed8a102c91f066f484222388df560f5579ed491805322ac84047c4ccac3d5616be90095688d9a1e5d0c018917ec9a326b8e48cd0727f7906aa6577204f79a744607a1a57d7d315b4e69a7f82cd9007a96ba26145c3314fa3fcfa53507e79395806ddd2454c13b91767fa59938154e42a946a34d94c882c1d45f259f0f6791e644c15abcdfd811a9b874a057ea5d191614827bb48226b9e9ee80fb9e8c667ae368a57644117e1d8334adb60b5e6d6f8854685fe5e0c3938e8a8aa459d8473a78106611527a01074b4eae43d068e09c899c5846e21996218778b8faaa75065a62f9e767d056071745822ec652fab06563229821d14b49e31949d36fc10bc11a8ab0b765738e0c832b018b82118de7ec6bc4ad9f4cfe3a6e1c5fbf1c0d94d8a7d7b68cf9a3e6f5678721e09a99412243fa1aba76dce1cc8f53a9306a88c8cf3f4368a8439604ab4969f93130e2429726fcf289155413929734a90752c1c3e9b5318915073a321a3074215fb19c2af0789efaefe9b0912ae9012769d053da4a98fe3291a039d8ff204da9d0207ceb5943a10c76a3224d5abdea1c01801a869d27e2ea5e5a2f4873304039d25735440c03f46155b1e9812eb832739c12fa31e9d7fcd50045265bc3d8499d07b43bb4009b506247751ae36cb6f3d51464037fad6946e3ac75fbc429b7e2008c259df29b4ab0dabd2278e67361e01395940143076e4e89b3471d0cd3c0d5467076c41bd7d811849c50a6215de8f42f5cc863c1461fc52be225538fa3de1a248e9c2406b5a975c721fe06a4012095251deb47cceb74634d0e8eb98af7eedb1ad5ae208ddde4a8b1ef08b932c92138a63dfbc5077e59b9f4ff7efdb27d310b6744fa64d4e5e2497736ca0369da74902bcd9d0bb02e7c8c1fcff3e72b5d17a412d10a4fa7b39286613935413d274258eb42ede819f2b92a1e8f05a655cdae10403a2b9dcd2253963b9c84438a8a418895465b4933b995382b9ca8ea27164604c3c5ea093547517034c075b14ee835ce36c3b2399d42f0f16d678492e47ce24cb4917ad12c2c0604e81946d586b0852da754c814e7c919e71fe0f55680161117f520a8a63f6defcff739ac9a5d6a2878fc324a50b85832df1472e3c266b78b9c40b91edae7f2c4ca292e1e12a0d26ecd4618d6ee437d040928316ffeb9954eeb66bd5aa784077bffb7d681f579872c12a58ee6e57019f546c554ccaf882e89c7b21d27dc98a8accbb337c60345239c3048e88c56588211972e2544aaf494618ca56e48b5745f4768e65ed4f10152ce69c82ac9ed1b282be0182bfe1bc268f9373d94e0f4d01957c6253e08f873a47369a373d32be74e0b544b67aa62b8f575ea3c106cb2276febc5ced671030548715fcd46784e69b024530268548905ab00b49adf0ff721c40333a35fdf114d5a845ed40dfaacfc871e2d5e5e5fcf160221f6bb06dfc0c8a4ba67fcaca2dd1d3a239cff2fb9a0f4c80992718395e7ad831de57b8a70fc356b80cc788bb0fa3c1aa0e4ac7dc64b325b3d3138945c3afd9186d9efed0bedf49e747e484e9b1c9bd1f95a32039d8e8a52dd153fbf892b0aad41e66426381f9599da0b51698b8d27f2d0af9719c95c1ecf7c2d332280b0208a2fd9d27425d84a038bef462e22c0315d15a37d3a399edc08aac26cb398c205216df2a0ed2185e0d179fee61e11fa8b3d58b65f2004388287a9575b421250fa4a04a3a6ed0dabdf4b046f49f4ff7ea4838c2030755119658e8a482c2c923816267861ca2df30b658599da007a85c40a9ec923ee1f1b778979c532da3c99a2207b29f6e29d92f6699269fed6c420de6c9da9709247a6354d8605813c874516bb28c7fccc35e299fa88ae88cd10cd63a37dc1607a4143eeee12828dbdc8f8504fe560e5b3be8f248fce5db1b4b9758dc6a5459fcb359e033fece2e0a7659269e0fc333094c1e2de2dc1ca0bda595b0a98741208fb831947c644601f5e00fb4e713e8b9c9af1e2d82e0e0420e7bfb1ae9358081299e8325af2b11eab0f57d5dc82bc302db577e60c0033698f82d8683b033abe6379e51a81049c097cc387417e8e07ad056fc29610ba3e2b06e079dfbfc2395f1b1211785ee79616ba0733398644ac3bcf66c9e58a44db1ba33c2eb49b9fe0d80a5c807b5580bbc875a68442cc0488bae7d377920e241e7ee4ea1320f8f52c0401a2faa83230030ba338e16366a5d024ce22d7e459446dbc29aa75c290bec91ce5896c8fd727cfdeb7ce3d6b4296de2c52203f6d956f4f5fb2786ed5685f5c5b8156fd80de539b5be43659beea079870ba227133a7aff20df255d9297971cd8bc490f1019a0dfbd2bda21e19fdd8d678e0002931db7614d523ea10222d854ec918c303644ef3ec20a08e68332ee4be1b3d855b43fb8d02f94748cf3142c96d1be81fa7749b85cba751e38e68fe40533edcb88cc9b30fcbf61ffaa8c5a3e20c1e2220bb791d9827f4719f9d7ad13af9eebd4555ae0ccf8fdd37b4dec912b78a84f05fcc87842ccaf64e5072c0dca4c2a968eb181cc26e05d8bf1ba2ab379849803e4bc6d1cc31452b6882a709cdd0c054a652cab3fdb6e3c7e64769f19738f091ab6437be6fec872251808dbac81e2c8cb7b05905c7064cf7d4da21c8ff1c3c4e78425efbe288a1ef26575fe0151aed1fd4702b35d11b6ae17ce10d9b3b3c0a47f158571fe0a0337c2207f6081fe3c128fdfc50dd19ed6a3fdaceede733ec0aaedb45bd135c373a298ada2164c16e674f34936747aa4f6ecc04051e4ca04b0dbcb004fb110614964b32689f00322bb0660d400303917f98e8f383763a2375f3eea19fdafff569bbac19029383e88c6484f987f37ca3dd690b7ed0e7a7e9fb74e332402540a691ce5f7623876693206ac02fb13b1914e475344ab7b37042f3e244c26d499fc62a68cb2a4a24d9cb57c610002be29bb646e5803fa58dd1a8230a606651e1894113ebe08b759915a2d8e15f4409eb582416469e5a600f4df9e6d0d342a72ed1fa33939f343e0cb9bf959b90abc62ac05daa886255efc956cbcd07092b4c84db5a2b45550507fc075da4a7c99811bb99e628c3a26113c7c61c8a2e63d6816426d034989a986d3ea5a23476b99662c182af51125c0949601f45fb93b1086b47e247f863f84e2dd5e06b96b4d1c8775685836c7956c88de88ecc5e501c0034055766525d9647d1e9ede27dfb49bf6388450ad68d417dc1696a30c05d67cb3a125a5e584e50f6842a65562c50c92f67fe1488c8bc88acc06e365596c90a72d791dfae1e547e5f9f26f3bd31f8262bc9aafc82e735db5670145fe225e692da16f44f074a101f4a25a602c8d168c3cd50e52595dad1555b80aecb4d9e02fada64d8d0e6729cca3447c27718ba24355d6cf8592ffca71ab80b204ca4ecc4bee6da8d5c3c8fc4aa7241f1b90fe960545bf26280c1decec5cadadd085d660f14a94ecb99842397c2037b0014ee474600028472f96acaba89f5d58df70faafad0398556914657502c8e0d0948919440952bb5d98cbf141a788d480eb66618477f9a42e2205b3a803eecb87b12d483d93625700eab2bf46dde5070312a95169c4aaa98043dc3518ee4eb0eaffd050d24235cac581a171902563221b081a14e24a7addd69b36ab56b685d511811e3fc440f57f3659e214f9d305b4e14003b9aa7292be31d6edc5317bce06abc1a34b3d060d091c6a075722f8942b9a95e729e10076ec2a6585fc871af0214845a9f16307daeb0442a9196c799908ef246042a8f15483a32cdd2eb0e14daa709260a7702c24f610b58575202a93f7d2d25e04c035e5e896d4d92ed6c507d02d01224c1a373a63e135b09162dcecfe981e0a39b94d3b15dc95ea9e2a76156ac74bb217c2632f837f005d5f1ae8a252937f137c330eea4c5b244ec91984f267cc8b2fec8b1af011399bd9f4f9086269b48aac07b51cf32a3c07ba1e6f3eac0e88bfe2eecd9107f6468fb9078b62bf9f174491ade9628d2be94826da3ac9f59a8375dbc474c59f27484772cbfa8b71e34f17c10a45d6bccbcd1d4c5c7f7d5a5506ca9694652f1af35384eee069b9d64785e1f695e3e5177ff4a4b4030c5831936d19ea9fcee983d813bdfd16bc8935d56f2c930eaad8864b622231ed3e0bf34ffe5c252733aa1ad804ffaf8234ab447aa59a2def21c81dc884d74d672ca1362a455d1aab4a8dab009fed188603a0136a389d79e89bf813cfd6a485d32899beba6361b0c7fcb350577602b852c9cd4bfae9f87a6322346a31c6dec5ef695cf3c86690dadfc78690026595e8e86fe1a84588fc1b60b190e84c1e81454a29b8082d1b6a7d2e43d889247aec4177ce94f47fe2482ef66994da678ef58b5c2c554409b642e3b7f6df6be24d586a0932dc74cdee6d40648272e69ac3ca1ca8200cd5ca9324bdef60c361b92b49ef12ef4b5a1637119b65c08bf27f248b31cff78f4e1306f7406816011fe68e704e145c731d17f31bfb2db3956ebc7a203ef35496c0ea7c110417b1185bd40b063205b2a2b31ca5807ff194e057579a47d5252e44934eab4ca22a3d5908c8b547833c4bf00cb9c7371bc054c01191d00eec4be838361c57730262401a2476116dfd63240a8f23c000498012f95b2fdfd50cdd8d0613f2af889cda2a9ceb714017339d1b94b175f6c293c439c8eae28136c69a1060050e383c57db6dceb1e3903399040a500ddd5505d1f151e51d011c27a7654eaf2cc2764f3111e19b573feb3418a7669c25d34151e30b084e181012fd384a6f9dc5c0dea4160272da4bb85bbe1d9cd723304e510608e37266cb8111c3b3cf202f81b672e76895ff39b2f2a090dd241d849a6a5cba1a4e581803fb01b80b70799d0b7a6a587191188ef40d6a9961642925f79557647c9cd687e23f9cd5fef1f09de1dcfa99f0afc988972b97bded53864cf7b414b0f32e477025020e72c2e715ed773730fc4b92539b6efa0b1877a629a4bfab8dc7847d29d5ff0824d31792543f2ef276b3c7a06aaab888d1bfbf61b40dc8b64e3147f735550d2d909f41cabfe541e3a9423b8dafe410e42b207f9141922db99c28aefc2b634e5997af16b28f6b5ba839d3f13689fcc8368e0f70671bc906a8498b7a97869543e543a0636c02642ff36d3ded8f48a18f7bac788f2b6f7aa6bbd0ad056942785258d1352337ebb376203a31667e5adb3ba442739fcea34221f2ba3c2ff50615e28a123d627e8f69cb1f28db839f6bbfbfde4a8f3ecf5b02d42f9d028d587a2322760dfa3140e4de644506b243d2a1a5ed7c56c723a46981ca84728d745e3421d75234c7349dc4960aceb267a42f6131974e39de398d1aaee4dc1073b369696384c2274521a5b4e585a269028a8ff2a1d3312a669f9327ec2038c4e8d44b5c4555d484135b33f1cf9b6091b37e91be18a858262db994379e6c348e744c3bc2039f9216384652d753cbcedab9655b2e8a1b2ad1d445c14ff05923a4ee483cce8474042d07720ca241342a71d8a48374b854051d22faf986671608bf4f9e5a1ef39cb7097204a1308f7b48ea45bd9df6803ee1a5e8f4ef0945e51680d50d3865b9922689b26b4c69f6a875d757aa9e5cc06e84d16859cd08a01b0407fd2c7efa6e030a01e15e711e527a703821e6ac7096356e8e360feb7136b992893ff333cdf55560f4432752872eba6e0351cfbd030d34c0680bd8ea8f1ef1a4e126d754bc0ac6b0b182be0bf59099f5bb87e5c9ae20b8a28618f9db50534875ff00443c4d95862e984dfcff4e8ffb489972ac65195c04816e6e555c3d9a55132d4fc76b0e27a8f6ecbcf7a456ded09207210ac080ffb4845343707282287cfddf3820ab956c6c03827134ee08843538005a3dcb2f6d549db39709dcd01aecb5d8d22ce7d59af4163c31ae97ff15d916e93ce4f9084074d0cdfaf32e549f5fe2cf6377f08c19b80aa4249a94f050f0d285a93eec8114d87ee396d89401a12a948bf86d2d2eb38a8686f183c593c2866e674480af874ee4206d9b2b994591618efab24d7b86e7d5b9b2266f151d9019c3da3213b10aa63857cb7cd08808ad085a2f4c2f92710c75f28bcd8bb3618625af55ef7afbe999fc8ec721820dbe8f0224c306dea9f619f48182427ced3193554f6d10c956a2f52f203284546f07032780b7b78b61960d047fbd350c44791e89758c0d61f04d87250b6a604dd8ffa4e287ac68556adcd7c37a53a05e6210d6f0db807ad2e24731e470539d43a210812a2f95f860df4a2666cadc85838a1d207431cc02a67662a0f5b616d495f43d3c839b787180eb3d912459230ccda95bcbe76116277b44c239f0be38d0c0ef51f579f36c978a6605e1640df393cb56bd17cff732c2a93ad666ab207c7333c8f325505fcb4b78fab7861cb19754438b5c81513b56f3f8e2e8b6165af95bf3331edef6d36c0577d93390ebb1efb67d4ffe5e47ed69e478fb86bbb20c1e1c584b4f1166408f875448149f0db82460aef838bb8e0c8912ff5f266c5ef88c0d420a0101dd72978de53ca8360f67809b40d880e01dc61a73f2303e580277bd4e855aa21a25208ca7c571bddf90c2893c981b401ac056e0b6b864275601268dffd804da2f095b3a09927fa03216c3995a60c0547bc6f745126540222b035a1be2254517ea4e8d344f755ecf4cb7b514df121a93e04c40fd722babd60ef8ad1f5d0cd1bf5bed85098557e7f14541af26682c416ab643e367455c771c2fc5b881958ad409b085699e38970e25a5a05f7cef3679178664ba7cdb48f9af3293f12963b80ba04b37d0fbaf23c0eda83d9161139672f2d8e5d5df919fcd18c9b26ea9d797f2a3e5bf9eb8fa00f4c80478fa43b25ed53bf27e44f879454c2d41fddfa44ff616a9d82ff93b30b3e546cc70f0b62e77539dfe6f4d1dd3af0697e9079f6a1bc192a245c7fa835ffa1472985c0d05bc5a27707f4d592467dbdcf4dc16f9d78727f501be445f0cf214be46ec43c8a1e55487a13d1d2c58efdc2993309e36d62891171a696746e91f66a37e89c0b30d2ffa38645eb2f2884200faf3450a5b91e7a07a69372e8058bfbad5306a9f8b1b12580111e1e5236cca443b6b47350cf11b5a04eaa73a528fef7030ffbb1a8e4b80305b2909e88404628957272ab89731052207d5b0a47a051c90314a7ae81b95f715126fef382f8ea8d872294ce6d490994cc950a9b25c3af48b67c2582ae5b297d431267eb4826c464f7b640fddf479067aa825b22ff67177b14cc32802802608c6300dc5380a9d5dba2740eac3b0ae7ace55671e2ed801eb839e989cfee95da2be225a7aa35616e97f3333e858495b3b12037bfc42d8e64cfce053e45948946fb3a86cf205361ce8b8faf0058dc1d6e72fe6f484300cb16af662cccbbc40c20b9b710e9f3e02192015e85c73af5a3303025336e77436a64a89592b2babd8648dff1eda5e48b96c88b48d60b5867b5afba38936d2ec88013767956a39491cc4ff80531b101ea801e1e869987c2f90bc6fe567ff5c20b34b1bfdf2541a4f6743de8ea4ee40c34580a47a64cf2c1cb4e3af0b3fa9a5afc561bcc0e8d27fdb144478aa610122c257cc132011a45a9c332710078c65d3c5f411516da0073c9fcd8eb470b1652a18e3082ac15eaafd1d3f0880bb46830957a58250666ac6de4023e4bed55262d663498c59cdfd4fd1cd5f3f0fd74d63f2878b085b3746ed9d3662fe5da43600fd8dfec4113482e0f47b78aae31573684b80ccc759aa20a1c4909d43d252bf6927fe7b0716d0e48c668e5ef369d6ca152f61ab912038ec8b8ab66b998964e36c84b4d688f90aef47fb839052593142087b28524c8698000eb333593936489a77d34289b6c76d932bd1ce01fab85b988458f89d0cf45489cff3521b3890fd5d269842f53a97ed543729d2cb677298d6dd8553daa4ba851cf43264946a0bce15397214422087fc2c23775c0da0e4cd05ec1385b42e5e625c4f6e7f4b43614d05ab2db597e5f942c33e569ee2a089b11f5915f2e38bc3df039252411c5d239e1bbe012cf03bb6bf72530248a71947bce038d64f45ea375c1caa8855b7a40a68746068a473c040200b478ff1570210349fc8f19f0929a3c906c1be6243ee9e6ff49cace47ef4697b9eb79bdf3649e30384037f0e40e3e2e8877ea40b03b90f77c3185f6d8428e22ba230db4f169cbebf0dfbe767da33aad069dd61341cc73e19b7e255a16ee748c00234f51ebe86ad0bb2504b922748e1378c75381c50f88bd45df6513811f3806dd2770ae54bfc77528c384147a802e29da5fd02c221a798d2219e6c42b8a421bdd09e472dcca14e1b793ce502cc46a2773aa91814eee65324b32ce8b23f41a3de215bc15085338158a325816582a80d34aa75844e5dd9d1cd1f3f23c18d191518dfe64b213a389f602858066fedc8abc5f091c0b629a8d5cf1c81071bfe5234eaa06c3dcbb36cf72daafd07c4ed781ff5b9ce1bcf7c25f0bbf0639cf1e9c32e66c4d0ae08f8ac72c8da9d6816b0a52f614b16520d6ebbb70bec08444e4c3fa21147fdc2814bfa628bee1c794a37dd15b1681f85404c3355ee4534053f03f7cc279a65befd8d61755ec8a8f8b7d75c9fb8f5dc3b9822356e9b8a3aca4fd76ef123cf50cc0c60b2dddf21aa6cca1b1692142bfda0f2b4d671f927b194524340b3730689431fc58bbba160e31ecad64dff3ee13931d12371022babe1283298f8cb7dbce061009095bd89dab11ab1364b11b31909bbdaf6a1871a8168b931be2f09d441c92367b03d101c00484a3a679b0c31371b8709dbae68329304243f03f31b2650ae605442e280adf8901c70d9e335547e59c36bea9f577135c21ecbff44af3996ae04b5f38024e4d87e912507673fda0c5449f4de17c5d217f7604e01a2c281e8ea04d714cc9501e2abf6ab94419052cbdb9b5abdebeb02f3589bf16cbd0aed2d2fb7716fd02f5c2ce7e30c2e065a43672c19170e4c3d6051857b7f284ad548134a57d7c368b18026732b514baea90e1bf78ad559b3a0ca9f963a2437e3d491a48b89f00f395061a6ffd89f43f8689d1935ec880fe12ba2aa28eba2e3bebbf1089407c9078ec64e0fcbd56513cfe55e52116b5347a3b947501cf916985b2ba7689292daa2f203a18f23ebbf78a9dec8186ac12ef49b31b31e7ae1b8e5ac13c04846a7d0593db3b6cb4b82115f492b4cf07469da68804dcc6e7072535a8b8d296f6a2a0b84d6a53f792226337f7228038bed1499c023ff40afd902cb42fadec882c7229a3bfefe4c3406d7135824d6713500dcaa3feb710b8ea413198f840243dcccbff814da47763553f47a821a1a09bfd635608426013a0430735754a480844c7dc1e72eb304bc259724c59b9bc365289b2af4ef04566f4bd7ba685454c589cd07900f865cbcac0a4286a5572bdb924907f6b504df18e7be4524a33728bec12a590436dd13693d5852d461b859da1a0b4f30b70c95a769e8987cd8ba9b12ac3127deb59fe7d9165fbc6db7d824b7a2687ea956d672c869cb1580fb91345d01813922893684e2ced0eca41920d3fd4b343e8e6c62e0b59dd3b79cd5fa322640e0a0f56d73ebdc0fbc75e5a55c495c91e58f00ee3722ac6525463ad290eaad6c446e97b39a19fd82011409d287d621a78e0566c7ba0b4b39dfde60361aca70386fe95516bcfe7a2ec7a04488b145679628fce382f0828359b8c0ff81559d046587df163ca72ae3ee7646299a6d00085095fb8319b8d75e43a0c0e6e38af01ef8b9ae2339e6c18e166d3e04a01d4eeb657e703a42dd8892d38220cff22d1c8d37ccf013dbbcc5d0ce6021ad28ef84120e144631750498916d1e3390976296a0a9be284a830826c3bc2b899a34f74a5708e84bd95552486593ff2590f4cda55648a6fcd6a0dd2f6ad4d8ceb0ff65a30230bbac1b8bda9fa66ec89e77ce01ec00b7c80d4cf78278269e52a5036508acf4177d5614ab8ca5f6e47148e0b60463bbca457b2b316041fad663849056bae082a2cb65318ef292b627d409632b58a2ec8a82d87ed219a52f4f8f6ded5576429d5470b6ae093749a3aea5f7efb6c34a382d4698c610e1d061e27d579a7fb80fe34ffd6e624986a692ee90125c628be0191ffd324bbcfce12df9cd141a763208f291a75ad95478c6c0aa9e661dd07829a3dcfd5200e843cf83d367eaba49b063ced778934f8522c6099401b7fba99914eb45254891001c18b1f6548ee05350f8d98f2c0d191db0f7b8d18cd00953e3c978f3d2905580d46851a22f6715d9da7b6e2e7f0ca415dcd105dd94638809cf2bd197ca35d57fea0d680919573a6e5b88338698f167221b5ae3fb43daee7c71bcefd77ef033634f046dd3b79cb2327c52062236f94a21a9c0ea835688c5c69f0558469244dfe3a7ac36f0645208254dae344fc0c7a6dd979b9be9e79b393b29d233b2769fb7c9ced587863a6311ecfbd7a7f9b6b6f2e0712cfa30bb8b5dc253e2ec3fa9f896cd1c30536a04c8e27ecae82ff19494f15485c66b513739b9b2d315a98f957d5f60774c002e8fbd79c7921b90c00daae61a6d7b4fab37d8144766efd5414ed05c2f7b9b8b878a33850327c1ccc6914ac85b0808ea60dd20adbe18798071840de2912337c0ab96c1d3115db62e2adfd8790aeeed5137770a38090c0a7d83d7b8ae2ce7504e7039d104080dffcc1dcf7b8694f74deb0298dca2e0dc918c1485389894721a9ed71f5680278825370a40be8b111425798b4596bdde96b33cd653091cd2999edf940486526bb59cfff7723f08d5a20fbb806a46821638222f6b3aa0857034b8acdd7aaea27c1554d0298e68fff18d1e50e8419de9241a92cfdac50b91304368795b66c6c9e35280a08be7cbb4485999cd20c9cb05913675fc6e946085e2e61066bd04909887aa816254da3269dd8c4550707629ffc8b7602030586bed8e900575009f62f7224f4ed2d09221a4633901b128c38bbc25a898481afb04353a02f5f40824c184cc4580b1e0012daa6b985c20f56040de8819ee533f36f6fe09fcc5cc66caa923535f2a0cf9e3cfac85a44ab7e684df597fcefaae8acde3e06530aaabcd51c2d3bb15ee78bc76512a00aa90ccc5065ad0436794c74618e9d21914a31b750ae7c585a4ac1e222217b50a1021ebb28c5cbf1b1e5ed9f7b527da54bfabc773b743f947947c56cd08b92564eb9054ff69ba31629a9fcfe1e720f89d001417851f42a0f5e7243eba379bd552b8cc3c894b45e0bbf8f7dff49ad871398d2ad7818deeb1bfc85ca36b7fcbc2467bdeb234060b37fa96d44b94477df1bbdfef5b3ae306c842816eeac97883716e01ba978fd08cdf8636ae1b58e1b47062e985214f1e53b5e9dd0bb1a4a2ab8a3ed6df51048a6b4f4bfd9db82d3a189c028b4a7db7f94d50f8c49687a9417f3ff9f046020b5fa51485640040498d38eeb83ff1aa5ba0e1a38f182e1fe9514b868623ee40823654e7a00e43462decb3f124d070645d2a1e9cc3f9d5ec9f81bc90b9fd8db0c4f187988f1fc13b20f11884cd58bf3cf9885e499a2acadf16cb0319ebb3ea401509cb485502e00e469173b18a4740e6bc0e739439fed197e83bf19cabbb54f36478ad6e262b06d89af63136ffecd6543ad2e9eccbe9695e0c70b4ec4b98ae3122ba719673e8fe366c2cf9e18be143f81dec43b24001cc601c473d5f6591ae1fa1c85408499b6a2c06c1a51848038b63816e22b100fdcf86bda9c2348d47e3e44d776f24890234f676f271e8e900627e859d2d9f43acf1a61c22c7a8ef4201e2df074638c936a0ec4a359f0bc830f3d989d4cb80d789d8e965c572dea62ccd05db0e283b8f3a4973802c38b1dc7c5bf62b36cd12b3e54f32655d25b68718c5d8d190fe9f865001a867e4d2a424be9bf6c074375574811d6d0f8e0e7ba1ee6eb1a3107dddaa3b0d7838b279cb37778ab684ab44fb30766d8ae99883667450f61f52349971c01398cdd0cf722d66f1211ccc410e9f265c83be7a99922b4c39f705b46ab1843be9273d0c0afc6bca50c9879ec627926b842706fd00903077f980d265844392f71982f257f2fa852b816e3c534818ac6dfe868bc98fd061c1a376ca02d36dca6965c8fa1d40ac5ef9a47c12d76376c399d4a6f728dd7131c789ecd9436eaea913f67a9969aac10230e321cd577e659a05b9a4d037171d26bd4340275a2f06a9feb230dd922c08de58c8c492ecd30fbe3fac5c88a073471464ee802aafd7b7f40ad6e04ba0774147020db252beb4221fde9839b8c528989d50e6a3c0151255f9e1b2f74ce100dcef9f07906cd0715f8a34f64a4584e4243b5548d095529e124ce01f75341ecf3a418a273d2253f6af04b05eb7ff81302016c304231e2acd680c39e704b3c6806a20e8b885c7e6855e68e0fb164ba57c3a34c9f47c7bb4060dd7895dd57f2d5a7345d2f12c77e4f915a3710345adec244c6f2822937bbf30980b826e42ec2ab736026b53bef52f302d529fab1b077de86bb6a67b8d52e21764e6e343e239001f5324509e9fb97ec9a9ce088e08588fbe283c1b4a2641f8de0d6d46a451310747e4cb8ae013a5431d5e13549154ae5327fd7a964294a37a64a8f3128eca8da0d8853cdd79036d71a2ef52d51320d002b09478610660063574e1fa7ec4098f230ebb1edb0e2eb898b5ffb83d0d5406f7e48c9a1756fae108584d144eb3a64cc2e771ac7b81139d5a8c24ed83f3f42d932d8560dfe8a50cff581aecd206cc924e4dd450c13e69413d3ae1e7b33c80371d34a5d3bef849706e86512062a69a01002c344266803c87eb67d41eb95db34f772a561be3fa1d6f118cfcf7e3c0c0179aa57a33992a4d5a5f59329f64a067026d8a0874d93cf817950f04b74f1c199a175cdd50d7fdea6bb30df60010e7076381f19406335f8e885e838ec488fca5386302fa2a9205954a32ffa28c027087019a06749df255da8e064c03d07b5be55b720ca9ba5da994a1088fd2647b5549cd9a04695df0d0571ffcc186a0480a7532d1ed73dc89acf9b1ad76898f12c76d83fd7d0d72608ed9820f5de385c5aacd6dc2858aa14198d562d557fae0c99ba78525bbeb02bb19177f9ec27866a43f67c86d5346aba443a3a80d3235adece0116b6f9081daefb44aead299ea48ae078782f28fe8bc27df8c72811d7b05f2353ca8a192caa657734bb2393ac3f12c857ca82137dc39c629c4d445d3b0491575813dd8311639afe5874d95ecf716554e5eb8c80cbb67e0a50a0ce58b548216f018b5f96cdd5a3da6fc34006ee6ca6219e3dee77c158dec1f8ef80dfc498576d9fedceb06d7a9b5b3c011d07ba51a44a7801f19c3cf0c858b6535dfee89b32c8d59aa9b93d32f75b6deb3b507b1600fe297ab2c5db9a2d147a56580d59f7bd8be1453e20f413dac2ee3cad367a725896a7d71019fa4c0ca8fe141ed9fdd0835b37bf706babf9d92262f1e1f954c9bc188f14104c08f08ea6f73c3a2f6b4bd16b35586ae4b6e845d9cb487160a86bbc43dd468dd75486ec4fcafca66712222e284964e27c9c7491a0c3ea3d331bdb8f44509980367a40a3c1e94942f30e6a9c89d85b48f1bac1a57e74887ca18034ca5c2cdd032ade100198795697e4bcda51a7337404fd0089fa85b41a63dc15e3d0b823f4d33011493ad232948c3141c73392cb60a4750346773c263630bbd3425856aa1a4b4da74128970726b6f03e0cb903b3197be126d2b9c22d985ffab610ed42d2bfc79a523340fecd28aca73bf40f1f1c7671f629c9d6cb523330bce3de1101f39aa973c6601cb398021f51706c936be9da7ba918fd596490aa0cb5dc7477d30161709eb20f9403b211789e32daa326ef48c156aac507c62ed445f85c9ecb228fc1b2b84c543fb8cd40e4692c1eba8342be62711021b7bd7a26e304a4dc8a026a2dd94472b2376a937c86fe8335e9695894d9620468c4628ea023bd91e8a43f7414f400d5fa52f1c44d64511c185a48b4143a5705d3eb173fca8121aea7916ad252bf71ce12cc9eff795a71a2a5dc8292882cd95d86831966d684f8c16208f80a548c5e271237dc3f534f56115ad8c66ff903c6c2e52f7427adc9446bb781d83a97c04b7a0621297901c79554382e9644f4717fe3c0816fe08ac3be7f9a527a37b6cd7925b27162e2994d16fa9114777ddd92d34989889aa721fee1aad6c1ca18302453dfefcc67c38b6ad0b69b9c82bfe12b5b22dddd957c2911778d4a8f9ac0f1d8cb40a635116c21ed309be8b25d0027874500a0cbe74d46eb2d597e5d6605d444e2b575320a313fee2606b7027ae3e2e254c2607cc8da35d17306616ed5bd35822298f10867cdf19a0b90d78996f7fd61583690690a17c27ac8040c3705ae212eef2086c00f3097b292d733382c1fd529e8ad48642dc0f6565569ea0db48ae55c8ba63d3818d871dbd9893c596a9c518f0d4b5c0a57cdba5e455a2514ffaa5d47dc8edff0db8ff406ef676a9e52a3f320d5ec7f7139a0af70724bef5f274978ebef9686a58ffefa8f7d30c17b85ee31effaf62bf255bcffc0c708c5d3bea9f6eeb77341944d570900ed163e807d8126ce9d27a6594581bfc0adc83fffa46e3c9712ac1c4c2ef4ab858a47a321209ca6cb88f07a3839ae40def421b5fbf84ab95dc0b766b34b8b135474b65efc336c13eac35371a6c81aac27d0b80ecd1c3d6080e3730766a07674150ebd7aaeddb9992b4b6faaf35885a6376e11ce9acc1d7bf82aa3a0184111470f0df24850093f19a18f1d28d5fb75ca6fa3b2ad8e9c5238101410c6d200f29ad407e0a3ad49f1941a92d33ed14ceebcd47e95d4367919687be4c1527274ae965efc0f3682f366b3d61a6f1f5c497af1f088c23cc9c818146e1e73c3b1667b658e81042e7e2df7edb575b3b750a10ad7d92b0842b673e3b14f0e500a9f59041ad186626a3e4b37eeb314b990f5574096e15f1dc925ab499e96dd8261fe1b4e8cb53b3440f6e52ab43ab8619400a474256251c54a0d6b5cfc458c55cf0eb4aae8938f2c929168ae6d2ef0ba7f41a24b65a1855e7ecc82acc69c8d73fb02226b8d4755f345480ac770ac7e411eea9c7315c6629d17190515098d4f41a39d91eff04c8d9506a48197a2ea6995b7dcb6d7e2b8b5d8000a2fcef1d49aefed2664faf2d5dfe7774a61a49faca65c5450d393db80a3ab873faf392c920db56e403efc608ab27ad9e1ac1f620f7dcd7bdf4ec6a3c8b386508fa01bf2048cbb75855fd428b479c0cf5ba5bed6f9fa9197d183e00d0595cc53c96b3ab7fe16b6e2f2275d6a84ae5905032d642fd1769f0db7cd3a4e73f95eac603166a5e62aa45c5bf897faa17d0cd7d347ec0f6d5a487ae45b021ab1c9ceaeed45e63ac97a10b0cb4f0ccb2a60aecc5a978764bf2e03dc1642ff0c116ab911df716bd4099d65e71b78457f67e76b67e8988a75af3b9f9f3f87aa0182da9a6541baeed86add89def76a7d56cbdadd0eb16a776ae1362f95ea9435fe5cb23028d05201fc9bc1303862ac58a1a13c847727eb90c466f389e4e8b54b476f60e533063dd7d4aef1799455dfda81da6ae09ad9e9052da93b57c23744d414d4a757831137f610d00206dfc9b523af813383e814cc9a7a6acdc9c8e6834f933fd0b3fef62079384d643edbe0ff2bafbeb131e0a2b238b620e4e1f5519ac96ed108869eb4fc66008f5600d1309a72829cb6bdc095039c7d9de8ee110b80e7146f89f061e001d605e3c23b08d8ab0b0e35b5f6e79d562462101e61b2284875827474975b7afd08fa8d081632baa1245ab2aa00444da237df6b2f17900a0c24fdb1f64847e69c7a3550b12c730f5169683507305b259b40ef30bf4190c0d1d4400809125d262d4060d93642abbe2673f6a8ae51c3c92a228b65f0cbe1188108be96c522932007a9875aa329549f0889f4955fa2f59ca507f49ebf9d602f6a0df2ce69daa47856c3723fe1aaf154873adfe6ad573fa6d99bc156a59e06d25665b79b7ebdecc461206b90b949d2c83077efb93988bd959d03c4362825493a16fc16d9f10411e76c803c2c606dbccd17f8c9a0d16a6c7ab4a264d86d34b99a657a49613ae8685b5ddded9ab49ef699433cd78c2d930a4263ea839b7e445f6464ece7e2253cdf297c7b9944495b918d5e1f7e947f5df3491b942d69492eb5913341a8c334e4988463a92536fbf06df3e370ad6801dfd04a7e17a09137c0378bb096e35cbfa64559beb6e5228367aa398f806b420e46991efe039074b66a3fdf992a9fd82920132d94a6cb22ad2bcfe8f1576c1e53e5304c84725d7ec006a7d54463bdab51282fbf4d2af85dcf725615f9e2fc0f4f6fac155e8d7f25f77f39e3d6195b16be1215375313f7c231081fc9aae53e6f7c187514dac90d94336b22105655f9e3dcf014a1298bb6d1020e87a2544b7f5bd956ca468e8ec6f740059acc568ceaa098c89d405da56e2d6ecada9b1f6d93af27451c4f06f9e0683ed77790b536f80fb19d4fc9cf52e18e133ee0297eeb6304069e6fabed42e1330f09dd7cdbccd0f71bd508f4e66823ebb10df353844f91efa4b8f9c26705fd63da2b28f4467cb7850f6b006bda67f458f00289d7d7858e2bbd4e1e7a60210bcee561f00d49d08324e59e2bf1e73578e5f333c775578331f9d051ed7e219ab30c7df1531addee06b03df96eafcdd95709a9d51293377e12ae61c78543824403120034bed6983c1fb808b3e143296747af9e721fbd1945bd72014ebd051dc5f74529de0d051daeb3cb53ee0cfcc05de25c5337d9253b6b554523220df6cc54d5fefef02d1b279e49906182a11f4c0d2df830ed9d1eda1875f7cb6e0f3bb140e5f592ea8a9145ccdca9f170fb5dad6fc5a395cab0c150a09f54e973a2c2bea4dde65ab163c1cd0136bfb6eb8fe0559bac5897c28aa306790883b827aee185b27761bbaa0b48f8b00bba8ff806d28f674af2f2699e870c6c41480c4a7e8e8115320426446c2520ee5eadfa8d1b92a09e0e1b07b88a9e2b4704a08dae23d09f70e803cfc41ee7e0f206741363386d3e02d7ff801afc46832a3443cc7342c6da91a0c73eb50fc063f05f1c4aa3fc464e92ea2572e5fbe7d90d7771d9271bca4d031d451d5e66dcceb3deba1db4c56d99f26915cde81b04b404f9c1379ef89e150a44fbfdf13ea15b29156e6c38ff178aa003138f4732298f2b788d2497e15da1ef0b59987ca3c4a1f452ad01dc84c2653ee226d48ca626a223595bd5ad080641ffd1c00ce1eaaef3db5495bd0482128d9d846bfe74a90213eb82fe23823933d25d4b8b0f12dbde99a817fe2d168c2d2d4aa3fe7b2b5c2bef1233a3c0b43c4c26399d6084dcf88d168fed00e3bd8751d6fd12683cc8ead210364ddc0f5f4edd823b835c571676a8301c041664a72fab5dd8a651878cee13a2e01d9d9e9fb8a8edc5e01bbab2c971dbc7810caec735f3dfd408fa1ab56670a400dd4a378fe252fe84af774e70dd2842884483f1021cebf1f851d9363e68eac6485c49b0999f1025f16923adbc1da4e5ec1bb26ba152ab939871302a1a160c5825ddcf17fafa199c12dc973a1a46f1fe7fe33a012dac4089b3794f06e207d62f76b8a61a2fcec6b358abbe3d8cf46ac44ffaafce827292f5473bb703f4da7617e375a9066ed2fcc88111f184bab70512dde34346e271455656b230d8500ecbbc58ed9d2b9c4901f0b269899d561752820a44c3c9e296a9a4bcee5c9df28f803e6af8fc9fb51ea41fed1f2dc39f821f481985d4bec70c2ef385f3db4b7ca157637628db4a6d3ff682ac646078c201e64e25c07b5212b505a293397e755f84877862a0a434c030bcf5a51da86995ec27f6bc7f01787e9b0c51986f286e9651e8aa93aabbf46938d366fb72a17c05bd0c3942949d786818b12dc7ec9335b6533e2b1dd154b9d001359de1b1fc24396459e0fdfcf4a4b92b3ad671a38801a4dd91638a7875887a84e9471fb93b1840a92500861d6d5929de2d9e043c86a11284e589ff9828a1d840092481c0daafcf2dc07a3590c44576376db4e1614dbd1960983bd89f72d52f2c99020a2ddbf9a0f62eec7295783d9405e151ebf1e3ace6e61b0df0a85000a13ddd170db632615b2e5cb2168005daef1c61df48f71b263a86d9ba8274ef003c145f19191ea5608f4bc10bf97e490597c318369491b449c13bd67d16da34632eb9db0d9a05ef706fb2a0046830fbc51d475b9822b2d861241f208ff28a3eeb03688322c83c00ef05cfd93ba0a9bb682dd04a8b2d59f457c303abd5e99b8afd5a83694f917806f58f79edc196b66a7879a484d7feb9b82f9bf954a5c9f830d2afc1ad98e455df26bc07091e6b51f178ed4fbfe567d35887aee145472573cd88a0f4da7e3089bd3a98d91d0b65fe4bc3e9e28b893d656ee30da514b56f26a1e67f3a42c6c73cf99023fb585c4cb32d1ea88b0d52deb302fa7936c02bdb19f86685cca6c7d89417ab752c141ba45634bd0cc4cb7a3a0cc23bc53d1697e25313eec51b0be00a6dd0baed2bb7db3f343137318f61c526768a2fca346f65a79f9bc0f364e37000f8930f18a0e538ca86d8f6d81036718f80bef16ca63f7250602405e1b76edbbbe9c285b105b36ac1d9f8833d376748b2c632c0a7cd785be51ff264ab53f90cd2b456fb355bab4314a7580234132046352751582a0bee8dc0d6907587b2ca778577043301a129fe6bd130ec526c563e0b46c4c049094170601c41ee883065e59e8cae78cdd4e6663c62c4095040f5028f86f2a6f3e9b2ba18108f06ce749596ded682e7bc16358ce57e5c5e0c3de01b3205bd59f7f7c006277b5091785c89d595242cb7bcaebf1c660aaebe70b3b4b44f9c0b50d5315c938c703e60ca5f9b331413529f8b7b0d9178c0e70ac1cee76689a334eb34356c1c2d76281081c35fb693f8dc4c7af9dc9537c2d393d942a1083a45d19cd4ae1a725b2cb6cfd190dd44fc7f9a6bcec53b50cd8330c58cb10963489b930aa3dcb78f031d8fb518b6b74eda0db8e0c0f017c5c2e0056368564f8c421f36258cd4172b068911d50de8c641a4d4f20f7d6fea3f3d75fe7938e11442c8d93c72f1c323bd471a576c7a662678308acf489b0c9608f62a5af50a1ff7d33166d05c7dce0d636d5272518a6b8cb6d25a333247aaf153c52ce82702a729735aea9b798420418ecf9183f89c6cf1b2b9452bfd9a46f1233497680396ac89befe47d5c983e0e96fb5e391bcaf2b451c1e9d4633d55587d20a2f4c2eb0dc24be175bd8510b4d5eca1da4217539f5edd2ff2f5d6d60c9d3a80fbac591c94e0b4608e5f669aa2443db9ee0fe95efdec07396c58bce12041e4708147fa9c7b056b6fc375bfe02e608a02ed2f0d289753e9062b5109ecad154dfbcf1c2db44dac79a2c379b4e6f1b05699873352ac7fcb3bc548806d8beb568883f97afc33e849c7ad102a32509ffd8210abf0faaa63b8ccb41761dbf9a4f918350d13fae40669a264471d1a29d578e77427be2b9306df46ee712c65497904c47dcc29eab6026326683b78fe7cda9133de47e26866cea33ac1516824a22d23d5098a79ef006c109bb0c866b99ae8122acde3cbef24f0e0531a0c1c4506f9b9614b29d78bc224bdb743e63f4efd2069525ad4d173cb51babd9b965066475944e048d40f599a9ec6b110625c3d323fe6a2a4cef414c7cd879ec035c2358d907960f2d7a5f97a5f4b80fce8956b5caa873d1f92e09d25543ce6bb4bb8850463ac39edf0849cdcf4667a0f2373dfd0a637fcec893630f1c86b68575b47ef8f1188609bfa8453a82d8274ab09261b7a19cf26139cb5db292fba7465c8c35021f3725363240c564f9f389a71e2e7a33de650fa64e8d7178fbd25ed4bf0de8ce9049cec10f0ef2b961056983c9fb780e1dcd5ec55a36207a04bb494884f8d800d96aa6f436f9ca0d4c765f1bf107a30fcae2926f4d962042e1f271d2700f94ed461d093d436776372998fd076f1b4db7cf9ff0b64845535865389144082b25116145122f48e6fbfb0a5d874a60ab220d1ab1fde4643e95e7ac7855a2ae0e9114f613ef3210334ccdb7151aaa3458a2480608f8c2ec53790c3bffc843365f6625f02dabe7ff7077090135154c8fc88e10145bb4a51851bdc7dc19d38248c7afec8a010752262984ac8b4e1c62bbdb3c59b801c0ca4726fa57942affe82389820a6bdd0b854a419755c77f628ec8517f80c4e5b821c5d9d94ae69f167b1fbaba8b178a22a30cede8fc92b5819c24936974dbac8a2b92ea00b83f7493efeb70d3296fc0c357bd45740933505585862a894426bde19efb7065643aab079263b2a1205f9f3e1c5222631944c0eba2e8b1081c23148fb43cafc715caee68cc56d80020f63a4e028bf8ede362dbd8f3c46011569055eac02945d3ddd2929eeff5734b0e1384ef6eade404947add540caa8425db3fc4ee709761fcbcb77c1bcc4d56e55bcf4467979fd42881a9f52d11a4615d7c9c4354588d361883bab319d1ae813e1359d539ca8c0f9a2675ea6e23bd07f06f20a59dae595c7b260dd9a301ecac00d917226454b870bf45a386be94427caa662be25cf7159106c738974a663c202c9e668024f4ea81261ab8c89e840ef30e0638da550f0cf1cf23e3769d05019a4302cc9d851295cd8293dce7d4df68fcc434622fd13eccc8f93f98cd9c08945a5642d69e3ea573c568ce3938127b41cccd0a65ff78b231f4767be8ff37cf36e82512f1ffdf5efffb0f88cd60edc58ede5c7cee0292bbb52052d181c6cba58c37cfe2b33e80f406334b43b935444dc3a9f39ae043fd1ef2f4a0537e1af9f10366c39440a197e086a34beb9839d0c4181ab4987d0dc64c1ce0e94e49d2469553e53101e0032ba01d2cccc5233217c5f67d6c12d025857bb988ac7c61ef58ed5784726642c3e491c642db6faf90ea0582110fefedb58c4cbae5d3c0c45fda00415b09ef3be477a9e29a31ce225f3febe831093071a350076b8c7109a3834c15fe653346bc142865129da063443feef70fde56f848ac6005e2fd49058ce74ab28c5e41dab01c7402430c79610ef91e73c8f53b3a9398da51ec94bc70700996644227711c7acaceacd42ba7d80d0db358c051ecaae304e1b8947e095de5889e8c2fa1d97f2b50ca52bae5113dfe6cec615d9566323a032a95ad14107c4d0a869b4a8bcedc652e424f38322b04a31519bafa456a9042356e8b20436ac2ead5ad410401e58781471c5f8473a55b0bfe292e585a4efa7dfca40fa5c5e1f4100ca7c65c3d5f9e78454d40c431980a3d3c6add065fbf18e6d037c1f11da7c6f9aeabdd8804c46277237ca8b5f21e45dcb0733dd8ea1000226a77b6d478321be3d18912cdcf394481c0403548acfeb6e044434414741fc2d22211f12991470023148c072338c15da560793cd71a6f1739ebb0b05d60718448e683068c8818c350337ec395938d696d49a6bca1df7a058587baa7279f1baad869b942ff474e99d2dbae2363a0fecbf0c1d0ec46cd35cdd1c4fd5e6c5509c2b33e945e6a316a93d0ac264d9e77a4a83d5c22b05475f9b12b13b31b220df240f8995f8cf2392a316b5060ce8d955900ed001ede463b697a558b410a84e3a28f02cfb90b3b61fbcf848a3f37017d3c016ff7bd20d2b0f830fa78def97c5fffdf9cc4d31e81d546899292c844e9647112a8431d248914bd5764c8d4c5c440b5d04163fc0021919f96b0407d43947d53efa02d1d0323e24fe02f8aa431c5825cdf0382ad0819b017b1a7d4e125f1352d259c9cc373ff37401af31afe2118e0397bcb27759201bbe26d80f948a2e0dcc88353ffc08082b53d2284dd84aceddd76c28b5a1e8376a4dc71c9d4e3a52f83ed6493907e8fc725514e936ef88df932db7ee2e9f9f6706883e3a5a5a6f51626fc4d9d017ffcc975822aadc7a1cee0f5d84ca88aad21dcc8f7d616005e1385e47db580514020f308cc2b12d7b1bf60b866d711a64ea7acdf834a516c08805380a8c2bff19a6ff91bd76b50fa996338acb2bddeac17b86490737feb2f6bc744b86bf60458fffa6b70be0142684deed750c249a41a139f7cee99c15997b557e0cedd88af35e0467b2b4ca4d59c49490da01f0829ebeba411dfba5a8a4ff2ad4eebdf9a7a349cacf6bba9a01c69686b75cf4cda8c5f8e70ee715d1c59d62b70ae0fdb259308ca4627cf2329930143db749b146b9a60c376f177269780a19f5b6c49ec1f9de273217f34ea41380dcf5ed4f65dcf893d79c5aea318e758e257330b81c510989fa6dde14caf7915456cad153544a30ca22c2c2061f7be08953320c72815f3507c07d8663ae4df41ae86c0ba31a42e7c815e2725b80aa45f298f9980ab6b4a1693e87625f7ba09a6b96c8ee5fd0d25985ead36973a8ae648d76484a36c2b0a66a3888315ba332bd4143a543af326f39278a7e8a6537ba056171f78bb8dcf26814d651e7b2488af5366a9f42392f3aa891b1ee27bfe07587ecaf401252557e6079619119144319f7b217026afe3deb21dfa8b19946b463e89d08290af6305682659a472e6ddb875eec0008b392e8d58e35a6e5d3b026794a2b7a6bb7f3d9dcdb0f6f6af784d4917e00e8110bd23cd15751bbe1b9ec2f41dd82097e68d4b86bebc8883ffc9c59d20edb81b7f4a4c4191c7600b3d9b68f37b9e6e7e3ee96618290b18c75e51904b5e06cd152c379fea665dcc68c781c7b76cb43082341dd0f53eea3819b1cfbbb1ee8d1f36cf049eb43bfeb06d6468eccb6f5b7e7418c7c1d8f6c4638be5dc8e8f62e3927a21cac378ee4437411f0a31e24cbfe6543789d8256751d83bdb672ead2d941a589c75d467ea77d0f1403e3ec236a6186aaa38fa75dc6e85a2252b6f57c31cd6952ddc3a585771b861f18275ecd384d7126f46f4212b3a68a520e59f1715b2f55f82f2bb1a1dc3e9d429c1556d4527d2e44840901caeddf2a7c058b6a58dabbd1ea3524625102f936ca921f2c33ba5c9ef15f408c6ca85dd6768d4757beea8575bb043a3424a2872a73defd2015d3839b13e23cc42e180ac6201c4d5f0a26d2fec69a8ab32c4ef3d43474d5a4307563d77999e8f5b25a9e75013a2d8c75642308b695d4107855815d37960f610334127574e05d01ffe6778885ebf98323ad0fff6ea4bd1af822492a3c48676875280b04ab1bad053b69eb40b6773416fd5dca096ff8ec6fe0131a3ee73952af431581548c7c2086005693296d51e71314269ad55e3fe8c89fcde926af38e5c8f9cc16c30a3be6970045dd3bd3d0f7c3acee0e781f9599ea4298ca9f94ffa20c4fbaf03a7bf58604d3adc5ce41ea05dd46d5d10ca79bd67b0a2c630612d228b0e68e12dc2be8bedc0df145aceb76e9d20f81f010be0adf7573ebe8e9548a11466653e9899254f4e48460a5db378809f2f26ad2f024a2bae3eda5715a46f97a98cb3640c39756a105675660f04d0737770f0a51ce69a6229dad0760b4e7c6f48a5f07c23c66ec8491744e59b866a2613062e853a48362d2f8aae1ba3771b5ed906a3c93b135b94f4f8946cf07a0d1dd377d8722a70a4e2c83d627e9c69263d3c3d5d2934f8de336cf33a3ae188e5d594a1b7b7aa8462ecbe155357bd9a6bd8bd74ad4ab2e264de7f4ce328c2074280020bc2a613e20d189ab2b60e98a645abaf6c12f5592359f49ddb287d2e141f16d71a7f6ea25fa5cde4ec8231b652c4afb0ddb4c30a40a7182b6612d8135a714dbc10aabe0e4f3d421c69ce868b52290ef7651ed8db714b7f7a535482ed479273a5e30af9b7afc3af0514b7aebdf77940a0532b0d7fd375dc7c1d7b357500a303bb5eb431fec9c9190ab0bfe49dd8a62b2f2d965ce43353fd8b4f7eeef47505fcf503b266a1b331f9193f87c9d655327e735970fb91dcd3a211b68a6632dd75a6afebf89ff8f133f91188e79f2b745251e2ff44dbb2a1fdcdb0c64b954bba7d9c7be4096b7511e49752354d12db5d86690db9474b1fbd442743a28801edd07a460c2d02cf19944fe3e2a892cf94d36c3c9bb8a8f3945ff95ebef3dca70511e6283613f631eb1732a82bd8b9f21a2392c56a9c164ce7965ca9c25aa63e4af961e569ea3130b64f9770b27f391f1ec64310a1080a72f4dd95f750f0415b08853113f28917ed56fcb9c16d1ce6150d54158efcf3c3d32294f6cdde2e4e9620fb8d6f57a59a6e4283d1ed9be222b5fe200763901ece9164d6d1a942c581c672c08188f07a38baffce0ee4d6263ebff185af7c92f6e40d2034e65d870402d068eb202e03683e0d5a53c2fd799dbe6ea0a512cdec0cdd4c714b2c03b3e4a275249712d4050075b7281660fced8a2b24efb3504896f7f303c83386f2db039f85183c0b3082b46943774ad2a0f07781a9f7c583e04e77b8ced5364b6700af2f0cb8da91163c99169caf1611e00a52cba3a1546b96df14b9cf82680a88a0d10a543d301bcd473f90a54d1267405a5199670e5006a061aa5d81cb515880b6736d6427c0d91643eb1ba7523c92ebf7f305390c159f808fb4963b510d272dc2128591c3493d82a802e985ea96056473bd9216caa9182946a806f3ecd890a93c6099451cfaf21ead23a4daa60ad661bf2cdd6be7d8e3119d4916f30518437e33d5da64f19c7bd9a11926ca3931ea5195859e5a25771441bf65bc9a1054c4694f99c074a1d6d80a406bae10e7b3e2f70ee4f6a7aa05aea3e222fc322fd8f4e61263fa0aff90d0629dae28e644767127973d083cafce311044a2d89f23d22dc2d23735fe4d840ab45f97a5dfa26f5a9609df796f9dd928989d4efd15b55b0480820b635f868f21f1c32a7e3dc7d775f175283ecf6eb466bc41de90e3df4be1964c7a55a6ae2d52eb89cddaf77b3b5cd5e0125101af0c4f2270f926e2cd9d8f35270264323f664dac71fbe21d551c84ff7edca76b94b659084471703ab6f36af74f5e51c98889ee29b0bce1a59faff72001b42604ba9cefc258208e59b539d48e9028ece0527c637d730275880e142d52f31982c2cd1db209dc0a3f5ed47c206e6a6f4c3913458e7072507245744723fce46eed0f97e3c45ed06f53a33cc57d6d499e4ab4b5b5354b7577f7ca95bda594328d0ce00b2b0c7687af32f060ab5e53a4afbb366e8ceceef069c285b6b9b3e5cb0c6b5af0a185a6d52aebd38a55d57c5aa9101003080e526aa8f0697a6dd12993e381e60611b45a3db6ce3522bf9af95a7d84ea3697d62e211a5e20c28449060a6fd0d43e09c9e2440a8e3431e41882a6d6c98989961678e071f2660b1a634f0b7684ec99e1c485a6362ac581484ec60c4786e440539b24c90e74b6aaa866a0a9a5b26c6a960a90be0424ac1c3eb5bb329fda29ac4f2d948dafa18a5f6b85516ef9cf85bea1ffa070ff951052c4d313b56e4f6b5dd27d5ad39af5b56ec13cad5cb54ed49d4f6b575af5c43cb54b4d324fad938e166e7c6a9f70a045521b15e4a9957a92dbf1a99db281da2aabff7663767cf9d462f140539bf59f65b375f3d472d93a703eb55d9e5a3d2f4fefd275d2f1df8b4fef530d34bd405e83ef4a4965f9f44e39a1e9adf2b7ea5a6de0e9dd8d81e2f1e9c5d281a637ebbf9ddeadff2ed77fb74e8ea7cfeb19132ffa03ca24b149c8f8230e3f8e227c1c693e8e37b27e14c730e3e8a3d51ac5f167740af323399219c7d11c3d1fb382d40f6094e4aca0630fa81d0f5e7a3853039ed1c72339dd161b7264d86067140375031d2a61e0e450d36b2af4a6d7366fba679a3a1c32bce994c29bee8032c9f42c7e11c3883651f49a9e78b15689a257f14d539217f50c182ffab6cd9881f5a2e390bce8454834742f3a0a1a2fba0735cebce8296c4879d145a0f1a28f708daa0e85352fea6e5079d14f9449a2091dd674d1020546c80a68badfdf6f78778d8f48e002070f1fc028b9730675af2fbc7b03ca24771a1f1a191a091a0d075a8de61ecd359391a7f9d63131795a0c254f9301e369349d0ca9a7398a26194ff3bad4e5696ea24ca289102142c4120d2fc21950268970a4326934fa0db47e033f2a9336d0b4b7d9316fb3d96c36db112b1abe10c1dac10319d4d6031e1db0e8b84073a3d6f036070809a93200216b5880fad18dcaa4d1455114455f4099247a8932c9067b0d34d040030d34d0a0c96b20d5a4803269d4092893344012c2b3f5428e803249e84ed6bf66ff7abd7ce81ad1fce5b8d7eb5f8e74c3bf5e625eaf978b97f8c2af97bf7e586197648916921ea0bc582045063471a0d83043cacb8f3e95dde912001e212f7a519924da6c369bcdeb0f6ff303944936071a514b68f9d175921f7dc3f9d16d8ec37227ea473b6d7e7403944923d289344ba2e47ca9a107142dccd3aab08903668791183264406958eca8799a932893683ea24c7addc6fccd0b5026dd74cd6d35f75aad56735dd3f235155e149d0065924854268db832a91642cf87f0019449216616cccff0cf449f39e5723918e86cf6332b6d5ee06103970d1e3fd099577cb401a71d707e5ca943660b9aee9f79ddfad9388a19458ce309a24f6b558ea91039c2fce8b6243fa6a0e74715befc38aa10e7471d33fce802b01a7ad16b8af4a29800d1460c78eec0d861d9c10a5af4a257b1ee5e14772fbac3f0a2a358f2e20d1c42f63ce530e344062ae630f2a207a04c12b586caa459509f291fe400289382927c06fafce5b3fbd0357a5115dd12d7c8fbec48633eff642f39e759ce6ec294cfb1dc25675aceb59cb1f441f2395f7d6aa9ae766a779f73d6e72f6a5aa8ca31078d1034cf69b374274b4b052068bab38e2d31dcd8e0840999cc23871c7ef091e64a13bac3c79e1834c6c02182a656ea33982b517655497ee4e883a676ea6f789b7b363fcb249bb5611cddc1fc388e6ed6f6f4f035f732a9a6f31d3442ae907859d2074df7d368363c8d05a91eaea0d085c79e19509a9aa7b9883289e6217ee655869ff90665d24cd754f6a2d08bb71745df35bcb8e7e945262fba06659208b547479d19acb2242182a6fb5fe1bf6af8976b7c7422470e505cc664f108027d19f9970bf9ad4cca5afe32a8382ff31065922c16731f725c6cf4582ce6693e06d5a4e8470f2a93469d73d64121f9ecb65a9914a37a58d4948739ad4c82b900e743fd6118866178a4ca87b1908630a40a73e88551511fbe42abd06b0dc710876138a6070b417ef020e30a2d938509139393332b843178e10d1022503660201216400720a6fa289913e64ce8459fca7ef4fae5c7713cd2f5a3cfcaa4d196898c08f9ec3623685c00e2b3288aa28b1e2b93c4970b35fccb6165d2eb5526857b49c76fdf65d2d6405c1ec81d08c88bf0032dcd78a011680b90d71cd00804e41a1f89a06b4a9794265839d04181ba84c0a9f365060d2634dd0fc4a3c60e3d3fecf044069a56aa079a9272f243c99293d61c34ad56373c90573503f8d181caa451f619868d175b9ffda74cca651210574a3e499266c89224491c4802905c4fba47baf661e549dfb6184ffe58f324902b4f92406c783208912783e079d2c93289fcf99f9ffff1211c3eb2503f5e748db2ff78896b24fecf8fabf99f2eb29a0e7dfe74c4e712273ee7ec3588cfee65d73caa3efbcef1d96ddec2e71580f8ec45d991607cd63d99f9dc2386dda8c338a6453f8ea3fb9c1f5d8f3b76f8d1c532690ccba41fa46af5a5573e3fbcd65a5ee7705a7b09a41cafd31328689ddfbc7613e2bcae53f5a96dd29e5a1d1aeab5768d8f4090b1a4073e68a274d941759a234f86b05087ce982fa8d30b3b8c2903840d52685abb7e841e2d366d7c588302149adadceb22429e241d2c93c818d8803a72450a0d2f45c6fc63961ff3bcd0838dad3b5d7c4841c73c28fce8b94c1a835eec7a51e32314f010a48cd41e209aeca0e9fefc59f7d9353e4282228285c91717ecac80663e579f7de843225d3e0cb58efaa42fe701d277968074a96e9530174a78a1846118d6f9fb69a8672a9c0aa7b49ca2c2a54fc3f0a2a02f0aba8fe6ea4ab59eeba4af93be50fa42e90ba5e554e353adaf800081004110acf317d4d305768129a885e55390ea5370864f411c9f82567f3d05affe4a60ce133d2e72543386a0323257bc78e95344460b680a36fde380136487254a86f04053f089852f7368e8e85aea81a620d4bba18325a7a58c550e680ab6a0030d1d64f821cd9720d0149c6a804d530f603dcd7b6c9adc27e75ce76fd6c3e612594ff3183639ebe3eafaebe9a7e7caa7d929f3f8345b29d140d37cf5d7730e1f9d3064d9e5b04503951c6a474c933275787893064d73d3149b9ffaac3eabcfea4b3d36de9bbf68ead5794f8f954fbfa80fea7e570c9873e7450b79aeb851014dbf14b2c40982028f3857b8a0e90705e5417950f8eaa9f2a947e5534f864f3d279f7a567f3ff5aefeba97c3474a568af4785281073936daa03c6071e1bae18819ac1a68ea35f1302285091d36304cc54053efe917c084e90a48953571dea0a907a5e543d713ae28387788a0a97704071c90485dd161f940536f0a066cbadefc6dc2445829d8bcf98bf557ab6bcaa778ea532ce5534c15e5536ca53fc5577fb9feeaf9eb38878f6a0d6acc84b13207871b90a024e0b283c3e78a9e3137d0149fb943c5429e313f6ac882a618ca0d3eb4c1c3439b1d78d0144389000a0b60b6308521f2054db19412122e46789822c5a6cc1334c5531509135dabe72f9dab15aa30411192034d6f133eaa3dd0a0122486396ee8f4805eaf37bd565437caa7d7e9cd51c5442caa890ae553ebf4e4531bf537864f2d55132e9f5a2b7bf5d74dc04795ca3ab14dfe4afdd53521f3f96fd09015c220c132654710281f2f79bc2039c284c5044d6d9306dc18c143a5c78b1c0c9d16281f9af6bc60034d2d940a39ad3331a8e0f132836a06143335e878810aad7c9674d1218a983b5684a04a5231bac8f0a4e98e171c954b1123343859b18a83857a80461a27333c76dc2082a6fe52a2c8e953c586a61e76e865e2dae2464e8c3b5d2aa0a18b9ddea9b72ebed8a20beb98cb0e65ec30c6d653b686b3b50fd63f1bf657c34eab569a0dbad8d6c1dcbeb9bfa61d6149eb6dd4572d28c0f0554b0daeaaf5558b8dabc74ed504a6c25325978dcedce491f394432d170c3440c1051d5039d45eaa5c0eb516b52091175c68caa17697cba1f6c3d30595bb53d66fee36e1a32a030b4aa8eeae6beb6a594b858f2e17978db2d67a0a7cd480177652a875114640818f700e632b3bb5bb5a1b1f61278c73fa9bf24e7ca6dae99eb94f6b69acaebfea9438591d3a25b94f81b83434b866e501c0854ffc91f30e100618fa0788d0fb417c698d49761f7ed525a97aeba42ec9d45b1f6be9157d55c866cb57b67735818fc490c4a1a96f25e1e1bc269985b12660e7aa856c3650df508b5aeb50cbc2bd3549865ad46e6b28866128da27b5ad24bcf73c2f24f53dc24e42c6e507f8f4bcfa550f5fcfafde61b7d5de7b8d3cafb64b74b76c0ca29af8be620fd7affc003b9894c58ccfbd44df0ae6afd66a438cb7f09e6d1d8cc173b1adc39cf06ceb200c7ab675f1abcec9908a5659953d10eeb3ad7b5f754b6c7cad80f524111b6820740b1164abd166b218ecb5817e4a7214430de6cfc3b5cf1fc1673d6399e85e58d22589c205a083270b25d4aa003dc04ae8ce2ac06cde54809e3d9f15a77ec327062efa9d153be1abf70cd9392ca31b07d802b140ae91e7375dbfc83a928c8975245b917524eb8e83dad56a6d75075f1df8e0b2ef9feea24a548beaf835cb1e14de9ee92653b1d4dc1163839d20a468a0b5ee8024e90a0246932552d05a6bdd21062c4376e0caf3420eadee013ee2009b2c5d53921833aaa0b556af4355378a3936b6628e7dfd86e20aaadf988f4dfbaa5b52a403da5d81e7f9da841c370249b68216e89fd503606f81adf6dfb93f201e5c9c0784cad61d0e622cc1148e184398dc19b3638526437078714323ce159db5ada74a5fb5deb6ea44b4e6d2c3d49a3e3c7ce941c20897172b74ad80a70ef611d7e8cb4e099d243762d4f002c5ee4198292f84d1822506c55e8414fbaabbb2fb7c645f997aec25701116430b832586090c9c247d42c410c507152034a8a8f07d0949721c47d90f49c6825e345b5963b2a8e86379c99f9f1f1f7f480f322d5a9aa3bf4cd2afb982ec373d921e6456941c93f0e7374d8e1874f2c19ad31c665674144d8be2f1d6cc1fa7992f9f6dd1b46836ed7fdf56ca57ecb25cef852244c84488700d3c457a9a9090df7629f0d1061e73cf4f808f6036f7dc36e1a310ae05e4cdbca78bf3464b8a7021df40668af09829249309b9cc45c8847c03d3a27706b71928517173d167a081d73c84d16b1e02e9a216212465872c790fc97bf8626c87765a75772fb677cb6ab1f1acd6bdf75eef4925e179a085aa243cd7428e315049789e8b303360893c97e5f05e78a6a8243cd043d0c3ebfa4c21428490b340e9f18a14b7ec228c5e731148177d14326fa00bb9122ac2bc81a783a0c77c035742c330d49ee21edd44288109587870f23ccff33c0f3568ad3cb757d7a8ea790fbc6140e6225c85cc459c2c9468dfe064a1c1597399eb5345ec8681d16bae421c67db83cc1fb7992f1f6b66454518ad6602b968c26e2964b298d34298150d322b6a332b6a516cd69f95be7ffc05e430d9197b99db73a0d114b9684af9fe70d1d8f64195588fb1519b2f3515a1368fb1d120231dd698af3a7cd5e180e4c74bee90823cc57d0a1cbbdaf1918d861dc2b19b808fb6e3d0f1ccb15b287c5473ec4ec39eda28ab6dbd96f609976ddd4a692e29f0919dc2bb6b66a0a24b416ef3106645837c9b36b765d20d034ae8cb33a084be4e164a280b252a6cfef22057c10205f475b2606103b57908d3a2d7acbf24bb8160ac960d63cfd81c1efba8d3ecebb5f43c6f68779d609e7d72c27e756038efd481fd6bbbf0916583d974593617db1dd6be8e711dd4e63a0d0a2a09ecd784416a89b007994b311cad5601e98f5d405ae73cd6a726b357905764d767077acbd6ae57dcc033455090cd59a0f45e8aa5259acb7c69e6e1092e11d6e309aa891ff3e53673bb5865e31b066e1ec245b89d151385386fd943784545a898083c6ff9bc61e0e5213c8497873867a04485cdb7cf20e8ac98e8e5216c0ff2a07306b6b362a2bcbda2a2d7ccd269e6e833f3c7479959d1d0ac28695614c8ace867c6cc8a92b5c4008a7b4bf1f20c54f4e521603ae8f658cdac28cdace8ccaca8ccac68ccb4a867d687994c4a392f47ff211d68e975ee736322ec3fa66322eca5598489b09326977d634af99653e30a70d6cae5722e8470252e95c5f55a5da3f44a5daa6b5465df7c4afe95c2479f5bcf45f05c87f09d1a13a5766a5712555fac65ccd9da00d2161d8d504812f01efb07b81e93184bcb7a37b5a523dc874fc94feac0fb7b2fee7e6e53f2fa3d6ff5951efb0703760fb01721e172b99c0bae5c0ea5cae51e7b649c76d5a901a242bad5347dd5a5e94a23270d9ab70e82f17e1d3aa1a840b97ff5bd1efefbfc049fa710e17a8a7b647e2e42094cb846df7fce02eb3fafdf57bb72f95adb35fadce0231176bbbdb3393eaa28ae7ab5fa8a3e47fadc3fc7751024ea8ea291fd8919d00ee2a319881ece403be89f8fa2e8a1366f2a4017cd509b20d4bde01b8febef67235c5e94e74147728881a4cb0e335172aa88f488a2c7069d1df5cc7476756be637016fdc11de81673ae2539dcf74e8536d1bda09ed64f7c44d4fe4710655858dadb5d65a96b155beea64a8f3de4b45d9f86b9f845031914e51844b112a26eaaa18ab9621e0294c749d0b13a96081b54ebcc34437842f8414a3d75009b55e3df5a28e62549e54956b64758dbcbf5567e5c95fadd47bf277dce964d8f1a9473545eba65ed65f6c2baeb57a07de57ab4f155c7fb5f00ff632451126fac6d386893e37d3bbc34f18ca929f767db2a8f88e17eaa642bbe8a25611da2d4c7447292f0acbb6dde661fdc5d2da72dc95818a7a51baed9f7ab9eb9e133eaa595280b2e50a0d19324fd0ebde133e52e2e1254d0e3937e4f8e842af7bb9eb5ed3b550452eae854a62883dc085aa24ae5bc7a7c7b5e98c7528ad43431f592be85e7d08e781eed5c82b934210fc400f81436fdd2b080ed5f0447171267e0a780066dfe1f9aa9b52e16bbd8febe283cb499618f21c61001e182f52305224873076cff04685274e76bc6822b3cd649dd1e1c215208680d94a4dba80016383cb911e7760b0428f1d7ce0483205ea51263b9409d6c5d5d7dbade3ac6feb36eb59fbb7de5a8680891a8364070d2d686afbcfcb39873e73f83c335881cf3d073d33b5d83f1f01df5aabe7a063730c2fa0f1b51aeb90c5de88bdb552d4239b13ba4755ab16d5a3118adc5ba4480a456c2e8747d0d2d22ab5cda6a9a472182a7deb2d5184d4a54d9398c20f766dbde876d0d3e64526714375e8efbd52d07891b2c35f295afe73922c2117d9b604d97f1f96d6560aefda407daf93808b2a51ea3ffab58de395a55a9f23defacdd84b908db832d6217b1442e03197c707a84458dff231f071f0f3f74cd1b5afe7d8e1030155134595043e424025c21e140483899f8a9ffe3cf67a804a023b969daeb2a3ca4c9f2d6198a015f8e204c6ee8b9e287650ec2944a85c78ea5ebf64e6618f5d5e1b2d1d80af3a2a512fc62080afba2972a4446dc04d8c25502e34a112034a829d1977862041b34bb3b5856d445f7556d6fccfa743545272005f7556aa48b9a1a3d265c457dd151bbfbfeaa2f0b997450d21bb262e60d801c54f32e47123646bcb15cb439bacdc464dee02447e50225922cb48139326ac1c1b14f7c022c60948560d59286e832573c951746d9090ded48cbf5338feeaa450fdedab4e4a9ccf5f7552d0e83a63d6dad52b38e22b30a4f1e92c9ea7eb6ceb18bbb1e08b7befbd69fa157719d97c0b2eedef87553bf5ccb7d6620f7ba77d5c71fe0161ec547fd7b335df3ec89ffe3db1bc0d198a932a7fddda12ac1597f3e4e881ced78ac3d7abcec990988f7d3350e938c182d3a646139d1a74043251c67c6ceb237841b082200862d07e19f4807e52167f5d4b26c376d25c1cce5cb69765a727b4ecd4f6553b6fd9797693ac4ff54f0e1b869326ecbdd89edf799ca42b898b4fbc677b279d4ff56bdb809bb3f8858dc9d84ad5448d833db605736cdcde5e84e4d671d6433c1b47d9a9cddb8eab3a35566aaede73ec24dcf0f283ce193d59337c408e0f513cb800c39a359e89cd8a896c0e54ba6a90c161e4490a556a415707eb099c233fbc08e1839c147a8001246a06d42e4dd580d5d4648c19d43ae99f7aadd7773bf5b79544752d3b2dfaafba265a9fdfecb4baf9acc6c506718041e823e0171d0389d696d9c0341bc4a1956c18548ded39e961eb283a09884546b975c63a9416797aa27a26ee12815f7531e83e1df232d6fc7915e9c4c559af6507fac60671806fb6c8c3ccf69ce817b68e029ed9e11530cf06fa126f5dd3d8f92b1528fbaa5be2f4e3575d0c2c7c8a6b1aebd048d2d9e9759241ea09106da354d11837a5b629d51a97b823ee25ef143c752fbe17dfab8b3c0d454bd9277ae3a6a6eb347e4f6e53eede2e8f24e9ecb0caae5c7c00492f90c78e357e2ac247ee36dbde38457a6cf18522bb0c7d1592919ef779def9617ceff5ec95e11bf1f7b957896ed2f723d7a0a187343f027ff71bba6630f061aabfeef9e865129f425b57187bf5fa07eed1be44d7e22e0edf8b2f463176a11127bef383614bcfbfd28331db7ad3164d5f82edaa98e87af6b1eec2d9847aa64aa39e7d1d05be66cef5deea9e7b306ca111a3693b3ddfb2a15acf9a77dbfa10ee232434f4a1b8217bafc6444c4317f56c970764579c0cdb7a8ae3e15651ae6d48565a5adab95eefb4d636ea75eebdcfd93b154e5c5c5c5c777777980a46e3a68055adbb4db8461ae8c76ba51a855e86028fc820d0cf0f108a5b6badd5f19175c244d8350cc8bc4feed4c559a9f294daed76d6f3acfdbeeffbd212c05b7670a5626cf24a6122ec5a83e6c5ba591787af1326dae1232be52465b3ed7dc7d8d8b28bc3784b4949493979de75aa9f5dba388ced92c5b6cd75ed926ddab6641aad8d334f8ae838b354a70e1b36458a54558d4256aac9b6532546d1cc9699ae37f163e95ee9e9b2f43ccf49d2fa75cf6b35e161e9d851e0914f1549b01fdcfadae63e1dfdf3d26d7901135f9ea9e835bde7a28fe3256d79cf54e9afc881ae9584751418c515c333ebe93dd7baaca8f79cc465e9e207265e1c5d3bc98176ef068247fa78a6b7f4324db58f26e8b59a20a104132f9e2a30b102d15ba0bf5612d82b89d082feddb991a64c1a2b089c61a33b93957a67accee870ecaa43a3034dd357dd99ab337bced43933a0c362e382ed39ae3a1dc67c4e0e7d429544b5beb52585aa09ec5bf47a0a5da2eb57285b7bb3b5ba7effc9e0fbf2e70ddd23090879d5083202bb0f6449a1428408687936e8c7a46c01d5047612575665b37a848489aedf92036b4f5b497cdfadf6d62c0226baaeb508fa9aef85e0b15bfc9da9d0f5d2a197a5484a95c475d2c94e2b9652bd15a7bdef0e006c28da745991a36333a5081d14ef743893e68615131f5130e6cc90f3f3e7ab2e87a6ddb6da0ad9bcfac0640b02002a3d7c72cc69d2e6070b5822931e9ae4b9810e958efbe28a999f2b6ec20a27c7421d1a3ed2b050c603605ef89124882e685cb82eae50fd5cf152ea7290a1874628e0abaecc9832574cc6b0c6ae28d00f8a16a37565ad56d55b1f1a6d7957d83ee9e7c2c66876dd8d35cd549aa805387d3986fe9d37151f0bd0bfed4a28cc95d0982ba13fa4e8f9bca9c8dab32ba140ae84be3c666a1bb67598f9323726b21ee6d9260efbd44e5de481733c44252449b694a9010f179a25a85592f2648b4c0b7d7860d9825aff318b4a13e96aa745283c8822420d5b9b2398276061a755cb044c64fd336130c34eabdb2bdb80ebd65e55227b1585ed559415620f60dd5ed9ab7be44e768cd5b26fae117eebb66b0a0c51377765d9586bef52941502658b58186e2eca0ad96fc7d8ababa60ba4e4dd9287ec84d18c414367090c774d46aa8e4ca93ae254c3cb5c381c20cead81c2a5a60d0f7100390f4aeb8aa8a5a505058339496545d15c593438f16a5c4f972bcb19205259cc40c9920515457fc9e16ac8fad27425ac516989318e6081b1c505c81312ba47ee345474c283ab9be24a4419f3d6629759b7ed4bcb610497bc1a200e91070caa7a4eac8e52c32b3773f9ea6e1b50bd33b5bdbbeeb3a5037880d8214a14d30a70fad8a19263a14617344d6c88a286ecaaaaded498b3e7070e6d5e14815293874f095800f342571f304ea6f6641aa46cdd9023f343169f7bcfe4502012c30d391f2cb013d263090c2d532be8110105182b34d1d0b3d4431ea516c850a1618a181e6b5ee873ef083658525ed881725103ea95e9aa424390392ad4e0010f17936ce3e09091c34a0c2bc4b883a6dbde2933640b87973d403091212406ffaa2bf302abebd3a11ce8df97eefd18e849c0de4572efbdd8f7c5c930895bf03dc6f8de8bb3d8c9dacb0b28f7174f5b8bdd3d7bf5c591f624bf27de7b7f71df592fcee2ab66ac26c6ea7dd83bbfd67b2ee0b3b39f5c8c3d7bcb78f016c481e4795e09486fad7b368d8323c8b07fdff79d2ea205df7bbb7e397f1ebe3c78205812d8ad09c2354fb81e8e95840501df33ac38ecdee79d70752581fdf63d0e5f1dfc78fa3ed5247e1a777dc0b86b755bad5e2b8ad18ab856cff33c8cb117628c31c6f5c3fb23b3973df53ccfcb35d52590fed5333dc1d7ae6d1d97604baa5eb107627d6b3dd21a635cab18eafdea8173c6784713f131c6187bd8f3c2f7f746b059972802490f7bc5980217777a788757e2409d33c62934d161ce18e768128a3963bca3893862dd445b18bc2531c63963bca3494996a318961acc64394485078ae3a7b5ea04d2ad2640f1c5901c5f5fc3b75efdb12c51f443fe94499e0391de35d2aec9adc75db3e7810446e070403b0fb9efd7b7c216b2d95e304fb6613172c918236b35212b491959af04bc837a147a78aa30b26354346d6f46ce46319c9165f9c18f0e399b4818e4daaf1e3270c8c1020e4b2e90c163737a67399fb3bbcd9e92643e654cb93164b478ecfd5547664745c60a37a42353c4c6de577a6b7224f344ea9c9358a4c9c8788125908a8a90725ca1d6456f6e99dc5a6f1852ba486b7db91d0806c85bd2ca5762d8c5d457845bb82fa82e51b57ab1db36bfba1b64841883f6c9da7e7563ba8060e8b944756949efd7f7a8526dae211fb3fbd477d3906dfbaa8b02c4c8763dfa69bf7c98b15f39c8f9a26d6c320b9c3d4ee9b06b5f75505ac0b3f5571d941e5df6cf571d941a7ca030a163aca2f4f0de579d983c9fda8a9cfcd3ebf75ebfb66ba655c706864ae2de317b1a13e11f3d7ceff5ca8c6e561215e3eadf6973adb512690454372f76eb79185ffc7936db995e7beff57b6bad3504c2e61e55343256046cdcd5e4dda5568f6d29460a60b0b8c6ec30727356327ed803c3141cd0f442ed2ed56795de2a77aaeb02f9ebf7e987bfd7e9da68f2d7daf98ab565428ebfde9347a5f9ab6f10775fed74c37bdd6ad1b0a9edba44d6bfe401e2ef8fa514b86830b971014dc113101f2e82d0ea7a82de2534a484ac892125889912a670b8c1480e67ae3441531b878e0e316c4cc1f92104381869d262d203c60a7a25142607017461a8881173c38b2e964922ae0104b84260dc983fba2e93c61245a2e8b53c63c3ba44f5b5705b454cb890ba2e5145a57297080c0b1f7ae8609914ea0d5601b591c5e3116027e3bf7aabbe7029a1b3ecd4f6bb276dc9a5b7dd6924adb5c8e4ebe20d13951c54a26ce8a8564da6347153a5c54c9e5a47cfebd341f7658335486e540d4e3b8f5d486b71e1c9af2577f072e3b187d8baa91d36484c172a8fdd26d30222cb9c2238c0b8a086016982fc10c3ca141d70a0d7d2f95b65e46f0a2eaa899abde1aacd63a769dbe327295764c8a1871427745711395245898e1d783ca1587cf131c68e748dec9cc718638c319e9549d89395499e0d801003ea09ab267f69b0c243030b34d0a9a1eaaf17d5b0e7af0d62fe5e19f9ebb132e9eaaa291a4bd608e659c178ec2f910b08be752e256c800099ad85cf5fb769f9ebaedb72e7af8e4b15924883161f27441baaf808fdf59f2c7dfeba04622c59a3d2d3555579db5fdfb8bc95658f96d2037c64f3a4ecd49665bd3a9649d7f35c2c933c9b05ce63f7b0877c7459b8fc4dba5bd438d95d083b6598e2b43963430fa5204fe4bc4982e38a0d28a895b51ed81faa7e18f3929ddaecb65677c39f8ffdd35b9e9cac47a483a16acd8d4ade5396e4613e8fdd6abdc762a9fa7bedd01af71ecb93af3a2c453e1de5bcf5115f75545d5c6febc9816d8f4daf655b686caa23ea918825854465a59fe8a957073fa246ad66a72d98deea797cde72542aea79ebe9d8f4d6453dd728372e915a0a8fd9d845d1f44a20dfbb01c90d48de5285e667657e551f5593ed5422163ed24d2a91f5295a58b6ded2f0d653914bc412b5c42d914b4b551254b2a9bd31ea1e591d46a92a562395d35ba8916a8c1a776f47acb7a87b18ca469493948ea91e543e7eec70d0ba46e9b7f4cdf0d653b0ce5bb7a966a299d822d7c8f6405619fad4425d4165b1e1b2723eb57a7e6fdf1e7689392d85f5d6c13ad708ecd239b00becd239dda49dc02e0d65a5ec9485b251df0c45288aa8481fd32cf579eaa392b2fa6fe91aa5dfd3d7f4397d4edf93fd9a3e291c8e94296c79c67aec8a963e0226b25ed9a0151d3d84d2c7f3966274d22b5acb14e579bb5ce8d54eafa9a74c287ca4f78db26db769bd75a82829aba53091fda8defab7b3fe6159ffa83eab1f26b480cb4735715d05543718b0e8a182122a1b102cd7cde696d8fc352b9bcfe968b2d1749d9c74a4d6e9669f8058eb9a4a5b69293d355acf1bb9b092784dabec15d7a37c0e9df512a5a39197c6de0cfff37aa7cca2eb48d71df7837dd8d67948fd69ac4358ccaeae5d206923630d931d17565058549f195a706eec6440ab6fdb58568b676bb1859d6aeffbaa9b01c8a718eb508a9dfe3a16e3d771374bebee7a71f6ef3641fbebb66ac2fac6c2309c017feb206013bdf997ea6605fda5e395a8c2f83c7f6fd1d7eb6335f191c5b3abba19727fb32cd50c4e9f92a1d3932a25fee29a758d6e8a6ffac9ab75e364c1e0d771d7b7ed621b6b2e9dbf9f5713d83ba86fab243c8d8f6e2ab2075f01a0f4d91b659b70930de38a47c725aa4042144f11db92fca2a25007053d37966ed8b8a1e30690efbb114379836abc1126c45d2a0a168a182a755eb8289d2670df0b82206865ebb3c2b5afbcc0a495ae0741bc3f1f5646910ec19c33fe617589ea4e636d2ddb9647e00717aee8f311f589200882a0172fbb96a1ccd4ed05cd64aa461710d0f77d5fd7d72c4f6fba3448848ce8e59c73ce52a4c993b1411084a33dd035e81b94e3f420f8e3411f027d44d135b2af49540ed6a763c06edcb87173a17ca0e3d91101822008621f644c325314e83adcdff77ddf37c72acfd9e53958798e56cedf57044c82411004c1efe32326f329839720f1b8a0cc684109931f3398b1816620be3439b2a4090a97cb42d697a6dc215fa123e7fbbed97fdff77d48c250833e648939e79cbf2f0e95080367d7533954110182a093d748e636210741104cb2fb3ed906411004411094ed8abfad0b7aba6e10049f5c3d08822028dbfba39173ce395f4585da4bd5cc4b99d95583973479b02452368cbf1c5297a84e45200795cd073432a8aa252a57a54a192d4ab4f6ec40f34c2a4892295254543bd07c857ccea2856b0682b7c6530da81a5135a46a4cd5a0aa61955db7b101cc722389be222ad902b36baa2c66a06647645251d9e966d751c63089e39e87eb3cb944b54a5588d6b90a433087cdae71bce065d755c8d0a86e90944ba0c8172fab6a9b94f94128e76ab7307dde62a3749273ce3953e9b9447549dbd83a6c40bc080c1f962797a87ee4f77d613c100441f0fbbeef4303c2b14c563bd89111b5264c9f205737fcf02187294b9670b94162709531f690d649068e1f19414a2652aa69dffb7ddf17c3561803d7968104cc11ba476e591886611886429c2e517dd2503bca26e55338aa4b54855851c56181aacbea468f1968d05ca7cd913643be503db982e60be4339139af5df839c4d5ea6b169dd4e76c955d6f65f19e806e6c0c59b07a3840d4d865d13bbbec3ae7e143e5331f2aec35b1caae6d8c243b67cf39e79c73de9f73ce19c953ce39e79c2f9beffbc2cfd3553f99c244f5c390fcbe2f6721b2253a7971dbcb8ee2ca3ed79f8d373cfe73a1384dff7d3ee21e79e877a62520d982ecfa32ef4591fd321e5184d9e0086171238686468499fac2507d61acbecf06648bf8aa5bc355f51821db1a282d64725f235097208060ae4b34bef662186375ac2fae62cc018c11bbb5fae23c0ff3d975cd991b464bc291cf491ff557ff19f17942902577f9d3e7817cd4f833bef7b19366f9390aac4d25a9af3a1dc3d15778e17942d08758ff0acf594082f61f27413b1ebdd1f3ec6336b56b1ff5b922f41c1693bd5eb3d9cc4c95a4d2142cd2193cf69799a278fce3f547dfe6f80374a63f27f6d1c7cf43c4828c96fc70c54b954f1f94e6309a40944909a59df54c315e81f30a9b76507f05f89f7f25e62004297aaa24a524f57845e8290c1e9f27047de929d6f85c117a9a69ae434f35a6e57345791e994173a6164c4a5eabd56aa1d78a8074069f9de6282ead46a3d168341a8d46a3d168b6b35604d04e8f695b4f537ca6d56ab55aad56abd96ab55aad56abd56c2753cd5bd04ea65a89308d46a3d168348f8184d24ea6da994fd1eb9396f45c2f8e84ebb70fc2c75e02f82760a5188f1dbaedf3a976f102609f3e7dee7cf65b7ea03d9f6978a6fa08cd2fed6c5177a892db07de671fc1ae5a52d0f1d6b58db75a72fc092648955e05e06757fa5b7ef0f3f96c01feecf802177b054eb0fa3d2f01fc7c9e80ff3bd393b4b37bda193daf43a07b4a52ef2bb093e48feb7345edf347b6a7d6491fad797a21c0aa5deb0afbde497aad23527b5af7cc547b6ef5cbce734576eca42d3350d12f2dcf547f99942286455ffef214b21386cc5928a1321f73c9c10adbe7bd4a22f41b90a78ef33ab801013990e779e89d2bb0a73f7e02fe233190952964270c162dfacc80468e9d3c7bfaa032675242652753cc5f67ad44e9cfb9227b4a524f9ef5e2b463174f07fd88cc63660b9ba382726a5a7ae1028551fba0fb6c0a4265e70c9933b56052f2d7ebf5b27d2efb6a97974c2693c96432994c269329f14ed9e931edebf86431a38632b590bd5eafd7ebf57ac55eafd7ebf57a790c24f47532c980862b2b5051032788141a739833b5607ac11616187e08b2c54810e8cb5bc84ea62d93c9643299cc6320a1b293e9e5311b6ab468fdc0d2a60abd1e3361e6be4476852b626ea8995266067afda55464c9cbd2902b3d6b76e8cf8d79feaa26ea5f6c8e71308ed3630b6d3132617197be48a12d4e0cf99102ea393659d81cdaa26e41bd53c9cdbad2db6f069827b4c501fadca12193d8aca867b2b04b5a4f688b221a5c472e171c3efc30858e20e9992cac0b2458680b1c03ad77012909661b5638566bb8506c8e5dd06bda6f7195ecbd4a463b83cd623b8b5d756aa63ec7b61388c58aec6c46ca48d2633e9bcd66b31969d68fc57c1693c562b399c7623e8bf94ce63199c764b6d94c1673cc66369bcd66b1592c0673581ae4341f6126e8b4a01b0d66de689e1da439ee613458087385e53a718d6867aa14c26fb05a88101ee4b510305a6c46abf9cc479a09faac36336f339a799b797670e6b8a7796d4683d1fccefc04cdbcd13ce6b5e631d879a3cd66b3d96c3693c57c36f358cc63b1596c16738f91402449ce622ef35c7e20f358cc653297c962b2d9f9658d3f242e3bf81cfb6c369bcd66e44c369b91b3d86c36f3912467b3d96ce6b64c9a91defd977f5977765ed8cbb4b937fb89c9622590ccf69a6d598c8cc93c56d3342d7ab877edc45c234d7692307399c7ce74e6b1594c76ea98e95d9ce7d5fb0df45392a3186a30579bad91d1eafaa1af3aad315ff5f5eb0375d9a9fe3ce3235b7589ac937035f877ccd6e1a7773649f0dc063a76a15c4d68c71e806ae2fb1cf4f0c5effbbeb04cbaf6e6cfd6ef67c9cb814cd9b14756f7be5abfcffb3e0f76477fd5444a9ad971760c42f615d61b31e2e2ec0ab0d79a1dd713841317bbb16fe60d3b76dc7f9ef10902ee3fdcdb11b8fa05bf9f7a7137ef00641b50bf367d7dbb85f53db25498e83a6e80ddb207b88e1d9f7a63bb75fd5612d7087bd7caaeb22a93f0e7736f5d9cc5fd67b7467fa0fddf1626c2a5a7de7fd7469aa707ddb35bfb4cf5d55bb6ca86c52fda202b0e63b4a883fbe369a92a09ec9e959d7db45fbda2a54aad064b20d31270ef390840d8ef7e5b31fe495bbc939653775717875da7f5e4614ef3ab3fbf72b911f53487e9a9394dcfa849fd86acf3588f47c2ccdc348eb54caa695d1c96791a1483c1d854d89996807b9a7fbbf202b0f31bf361d9d924b4c0be9d4d02cc5b609f36defc26e4361f6fa6e736219b79b3ddcc9bcde6b8bfb990eda6c1cdabcd4f5c23db992add34f0db2de84c955e0317f220735f9c0642677abb9d20e0de769ea099b8cbc47a2e0e7bad266e9e0639cc479be939cc0c32653736ccbcc16ce60de63feec11cf7364f6de7cd5c61b9dee6f784ede6379bd3ce54e96f1ee434739749b7b35e5cd099de6c270838dc9fa8f7e2ef8783ef2bccf5c5c14e72ce06b72e0e7bed04d95c5c05604e73b0fc80e630b7e505604ea3398d463b4fccb0619e622e9a874e435189b0873a7471cefe605e5680e635cfe50735a7b92d2f40f35acd6b27d2c5d568e609f66be7898ba399f561b0f3a339769869bfced39cc663d3c02b3bdd5c309899992a89a54ac2ca1e4bb2e6a9e682d91e46f3d41f56ef1186f95892decc4cefcffccb7a39ae333384d7120b08c675be389b0dcdd3bc9497aa89fb98f49a290113563a76af76a61a473bb9c2f37bda19abb1695ef3342fe5a51b22f663e723502be8c45c1787412d7c643bad36ed2401e634af9d29cc6b9e622e0eecd74aa2e6e3267799e479b0ac8b839d6909b6ce87b570eb6130580b1b0f6bd1f430af4f3357b4789ac3cc148f791baeb04f736bea8ba3113d12cc2b0c0683a130bf6512ec84d17ca499405e33b78f967c9930af9934535fdccbc96b043b53f25f1be6b5becc4c6d3133dd9f7e6c1e3bcc4c32c96d7a3ac5952695c9957e57f6cb4b8f1d09835c376b0ba2031b34555f75689ea04182a6c8db0a60aac71a6b03fd84d68a0ac936b4851e869d622728ace309082e123a760cc3351ac5102834b18e3d62e7e2e2b24e5c58077eba52a7b5d8093b61cc85a77095cb75b99c6cb6bdf113fc043b393905a380a8b44b178b2335c9944333030800089315003028140c078442a14894e7ba9a3e14000e7f9e486a4c9b89c46192a228648c218610000000800060000cd114b100895b9575f0b8b1be65c72e9f9171bd12c71d5069bf713919645c5f5654b58be3c9c901eb5c13aaa2f15b1e421055c97ce11f21aa8feea651e00c098a40c0928ea93a53bb680a12604715e46a85c5beb18a822a327c72f52b53ca6dd5561e7eca474ffdf68c8cd056a6dd142bb59fb9f74b06b0f8666e608d91d99a422f055a41577adc038a14435f4e84c36f8a20d299d07de6aa605896e38b4069e2536149d6ef54deb60fa8ebbbbdbc23085d769d3279e516907e78bbd22004ce89ef0984ddf9701eac4883b27fac324cda4dff72dc8dd2c77dcf32d6b51211a4213195bf9e64ba60c9c43690f02b9c8d888aad2cbbbcf92bc083a69b09d04345bc25ddd261874bb371dc3219c5d0dd7462ffafb251b7aaf06fbab26f986f49c3a9b457c6edaf72038e54efd7acec6ee242b53b7dd95ff04785e3a0361abe1fb9785aae0ba70f1489a0c82c64e0d5d5647e2b8b1b10e1a79fc88226b09c6d94bdb650be017ddbf54861e9506fb0092cc2cab98aca81bd7acff49d1bc4288d5fb209f99e485eb74e27cf27f5a2897568c6c8f486f5c4e7379c81cabce12f7253d747bb1b021e038b0b0e830388d631f20e856af65677c1de43e3edbb6f11f4a7d6adabce68e0b107c894767b888d7d9289d94462afaafc70c5e30c218ddfcb9ff4f55f7ed0bd147d69752c12ffd00c7cd0ca93ff26d9dddfcaffdebde3d304e3600770303771cc76d2f12d1c59f9c6d99d343e68ffb15c6b1078d91aa7b92a0b8cd33baae79f27032208001f53c2a40a6895106858f24b5784eb330d2e66bfda3ac27042dc69c4ae99a750e0a17fa1c56c7d7dabcae65e381cc57a317f5a872c96e486675aab5424b0bf8fb99603a1f55a6b693e8c52191039ac3dedb4b9229f69926e1302eebb9b572f0038b500182643e142532b93686a7a84b9e4673fc2a28e6402a74b551020a0da2355e2a002a0854e7bd0a680a76b6a073dc9101977f2cb726d6d4ed5d9024e9bb9dfe77a87d97a816a81e86a92840b3708011d2b70bfd423b9eee1244bf73fe16f2d854cd95e26e397a36bfcd2675c870fd06e27486b83cec70f5474b212d13ccf8cf630919556dec320ef5621ac785989403018179c09edfe44355e1ae358e196a2eb079ea51e9bc181a4848f250b0537bd6c367d819e6ddd5c99645e71a346494850ae61c0d351139a5901abdf9bf0981b61934082164cfe67969583947fb0518b7a60c2155ea0ea1f9ffd55fbfa3b02b4cfe37da8bb724c1d2bee45805f0a7e898ff449a7ff105895ddac373537e86216eeabd6f5afca9b0009e4fa0553199a58d1e9bfc0f8ab5fce0c516dbd7c03ae4cc16d05737bf9ab09ab57c16e8217d33e12ae602c3618f7d735ca5ca7fc95eb2b619c928edfdcb2d5278a5cd156d35b4612e54a3b56b8d8e9b87fd2f2fd33616d65c1174ff9e6c509a9ddd24dd96f98595af4974d398497c8e4e49c2f59a3d3b709e48fc8ffe69589e206a6545581ac2f752b6c067e4249bbc65fe9b12b03262e146ea96763b5bb9b336f4c33dfad784f1ae8289867262275ca892ef8ce824c66f36c131b42f5c689e29ef8905072e19e44c171ae36e3b29971badfaa21d00f5bc9a2dd0f83709827b30809c7dc73dcebbcb1c8ec49e829ade3d9401e39d52ae752be5e8371ae74c55843670f6f63e697de7cf2129d3a52e16ae43f0278a8665dfed2037307b0807178147115e44a8dede68013a5fda93f9b2079d503f5055a44f99f5b98d154746176fc23b72c1f6373bd077053627578605520544266df56e8e7002036d2712922ad0197bec074029cf6bf5da464b39bbf1f936fa90423f8a046fe62f6f0bee53d6c92c5f026ccbed94b285ed458c5e5e76bceccad250d0f5b53f1cf18ec8bacf8a0a7f86431b418473b42967d93179a1566982d214d12b37ecc526b31c501cf64df222054476b102813def930d57d1e44592c1783e934d43a85024e5dd2efa6773fc5ed2634a7be9738581a2ec1992d9ba6dbd6d4112a57d464a894b437965eae2dbcf1d489697754a557b5b53ee54639b16802e74b49b97bfee222c2da1909a321aef9025077f0d02ca767dfc0aa34b91ed5ddec64139fd51251b574a3cb92b1d32c992ba5efac96f97ed74d198060e2d80dfc9cd87fa22c535d0d59f7617152156c01ebd434681c2f2d57b626ced56c88d6521ac906a0dfda0c2d2d9de3b56914d738246c218ba01d5656539851e044e7b1225a5dbeda55626bb058bb1d1781c83d89854475730d4ff8f22c51c8a8277f5bd6a60c1497d54587897e4fa8c7e1eb6a0cf6e561d7ca88470569173f1b9a9ea0e046a047e678e28c7817aa00aef25e5ac391d9eb576af400988fe15fd3ba159b4219c3ddc1d87e09c53bac215dbd5a10654078d88ed66a2c9a02f17f8ed027de61db159682255edad58c810593c0d23464dcf584d35f9c7ae25863c206a4a07c65381ea05887366faed6b85c21abe03c0b1237d1456a0addf62a664e2713d7b4ee3f5f0bc43b5cbf34e8c7aa15436d351f6dda320108a01fe258432f61d01f967b6f5ac4f94f33af928b6de7f94cfd5639f808ea258d9bb24621ef5be657b26d60547c1a23dd91554de2f2106c22424616426ca7f7c0313f0d7de4894bcc0ac439f080a77214ca3f34312922d7f14f2888d6a2fe4f3a3763798b3d23e70bf68e6653e2bf4af8bc8f16cf1e5b8052523e7d9277cba8ccc224e260885cdb6fdcd1695dffb5d129219724083f36243a4bccbb84d6862b6a7a28244bfb0728f426685c2d706ca40b01151f9521b62b021749747cb43e02858718cd4ad18f12890f519ce655e6828bec192d6d5e08d51fe412adac969fe0d84f327302a27e80e1e2e0663c4943d40c757ed3cec7c3800adbf48790b942794c444b15089737606305d65ba8eadc3e4a6b029c6520586d9605f93f48aa07d14d696f0312cbc33611653cd1f5bcccd2a7b4e968116556c18a52bfa89c36b714b5a0ab23b22d6d707d7ebf33faea441dc81c21f2cc17751a42d219fa717a03379ebfbb4d8165e0158ee7fac4e5cd8da7f3b797bea3c5e26266065f3d7f84c2d6c5d643b01fb1a13eaf6897c3a238a78feb698f5c046ec377b759a6e873b1a2960e2ceaddaafafabd148f717f9ffe232b25d22e0b5153a3ce4008bf7b61fcbb6745fc77f9188955793b8a072faeb0c022d624dfce741689cfc801715a026d8e183b20435d8d605a44971941ccafc767a2d7acaf227ac86851ce93ffd3584d16fc555e6f5dedd0dfa2aeb7ec9114a216124150252210d3ebd8b081addb1d047d7f103e03d8cf86a5dfa2c746dd1220c32b2a0435945335ff8cbac33c93e7b44b01005e374b77fdecebaa0a178ef3cb75d6cc1c1321b0aa07033b9ea206d883dd03cbb3f8033b239c3412240451051aa0b705679e0b2a7ef9d4dbb6af2ff324824adf90024b529c0993d3a0be45259c7afffc62fe5e813258dfcf2e9db0a1fef5e1e5afd58f1d591d5a91549df91879c7345e086c51820ad327b08e7cc62df493a583ca4b673517acf925f38c71460bef467dbd5c39aa527eb16fe67ca062f65641b38cc2cdf732a018a34ae57701aabf717fc53a2a727ed8552c3560d68bf22675d9b01e6ba04f40c30aa5cb0f34d060b6b220356dce8bdf4b7ff4c71730804a3f9e6ebcf7629d443b0c9d90d362682b336e26bba6c0ca7785449745cea14ab7fe77766f1fa2d4637aa44d3ef8bae01fa58d2a9ba6ea736a380f2e34c7135350f327b186c95bb5251734e0bb32f5eea2b80304a4d7105051dbe527f1d427a5339c40e537ed6652c67c17341ae5cfcba48bb96a29dfdecec49c431004c98b094d5fdc920624e39d68164e03257d7514dbb8d308b49fdd79ab37f5d198b729dd5dde7c29f12a10b85ff0cc207332cdb9f8bf9d89fc8ab6666517397224b1b334141873bee62e8513a3b4d6bcb13d9de9ceb49bcc125b793410a2906ca192f97242ea5d37020d2e4724ea8ec1b6979a93c39d24084c3245380a38ba4661f1c804d340cc200b2b4b036594a536ff5eba01379e03c0b0d73ad27111eda6e23a82a40950ff717ba172b95d281a13d532365ddc6d9247ac685b829d6a84f88d65e283a94426363c8aff6c21ceb5b38b3d2f405d9030ba9c164b4bda18d87a296793c4ba354056e817ce57ac914fa9e5d6edc1bf81d4d9883612f8d4d6bfae3ab8f7e95c9c046480e98ec1c83519d569ca50d6bde29d040572573718edb68dc987d92c770e5f6aca648dd09d3228e31b8bcc9c4489a468ae1e08133d7b18ce7360702b07b333fd727d4cef98cfef13331a1e7be38d8df46a468a8dabdc81135b7666c82505833319bb5cf487d4cc271085474ab8ed5869b2b83a667562aa0f5bd2c61c47f412f305cd87f46d12e6e1203c32d2f30d06b1792d1d560b2ca91da23d8f096cf0c1ffdd5a2fd36d8cb7d3ccba762bfebb834b06bde6a079944501bdc2052b8b0abef04ef98c8d6443de1eac5d0cf9315f678820d91e6b636f272bc34ed041f24b8c9413f6962768b6369ab8dd9a5f13740c9bf0c861a27635dd6c6b5e017c56bb84a04fa253ca7a65ccf769578e073b1d93dc5172a90ec3c939091832e1242b0c12f100026fe59b76258012f326b96e9cbd754bf667f26d7af713624ffe7bfa151fc7bada37d12e1847183433f310f1ae00c6dad5a0139b3e76e199bf5521506c0f757b02d1122f39475b9e37d4bdb2e42ca9e2d1afc175899687a8e98f44eb0c17923dc19296ef0a8d3fb8840e9119e69aea4a58aaa1f9e9e87c10c061782a8c91ec7a5ad468f17b497fab11a3a509097710ca1bff3e41f3feae77af6e9c8f8ad13c06e8ebe205d5cf63909c6bd02124ac21f22e01d4751225794753b7ce59d1715dd4d22f8c922f0359888f519895ce53f45aec72e59f2cce849ae2e78ee3b202af20fbe82217e7a8a6c0fdc2725d1c61bb319fc11bace174be74490499bda98df63204dc73ffda2961a33a30e2b17f93f8d7ed35bd14bfeecc4aff151155d20662555dbabb392990b22fd9f1d0f55df5110a0359853e7993e70ce9bebf57123e1bfa12468e07b30199118cef957922ef19d9eb3a344d63c21a5129a86be5a2a482fa9a8f055aa05eaa8c3b4e7ae275e54b1e05cb5a12989a9a85e0e06404f16eda52811416b11a09275768fea9945bc4918922abae5e344bc9b79c742dfadc1f961c20854e2a678f95ce76f680552d5a4c463704052a930cb1fff5473f739414356d834f5bef171547241c1829801574bbe0cb56a33b060b61a98b9314b941f8f06689f84f5da54a1b36bf6fca6f2aee9be5330734d148c8ba71d548d6fdf67cbfb37cd0f3751328fe201bdbab883c4d98d3f3eba677b03ed2c18aa0c389077c1f4a11eda43d8d472a3fd4ea6102f10f09eeb5822b4995c41dc4d342792658c4c62a81ff13dd953a65e4d0e2d04643a19e83bec6f535da3a4d00265cf798cc2418503d94e8581ffb0d36cd7747e4dc3e687e32bebe4a59b68de3b15b1790277b2e4dfc67a060485d56207db9ac6eedd6c8c8a9df34d2d30b66bfe37eaf28644ea1dcd5413ac4f0580cfdd805b227068ee4dddc7c1b39974dedb22ecd38ac27ca44cbeb21e4e1f0fc8a2ff689427ff265ec0d5e60b1e5f08884a9b6a00b6d0b0dd8a7f67b36d2e8b4bc1751767b6bbac4f6fa450464e8c3b9430dfa4b3b97c2477950bb4aef53ffb8b878fb8ccec0ab029102177ccdd130a685faa683dc0ab498a9128a01675cdebfbdcbe81d187f016858a4eaa94f3ab5123e412a488d1455c7417394afdcbeabf64ab47aff315deb461ec189d1f6c51b23c87f227ae1125fea474e818dd5bba1c149140e339ca56fd413fc93191ea91d7950138f913eba3235a457d73bbd5738903b718e39af38dd65d23ae8b1959e0d02ae33e1a8c35373d48364f7b852c414ef700a5db43036d47e6a0ac0a16d86b4018d34a2ef58e1450804fab4c9936a81d6ee50c40e6a9055c72d073d64c010757198f434954d3904aeac68e003e17ffefeb24f3745f134860700bbe0a6e59ecd46f1f0df402f4a3258622a758b683a4ef4cea35ca9ce6fd3e141a5b29030f8d002a90e72d4f5b7d3009ef16060178ef218773071bb6a68b3b8f8d317ef15e4f35b9df0b8e67d5facf4fbf98bfef3b90f30a57f0401271645843f45eef16a18c5f71444578bad0ed47a4834a80eb4373c43b60ca33eb4a3792618705c26cd1a57c5f85b8adba5160a2e3cd0383334e2eae3bc81f3def938c76b9c028b664ab2812bec602ec48ad3096c803ced0fb9b3e425111c898cdafd36f2549d14cc368c68df874978a8ed045450ca9849233f85946c5ba2fd92ba029912a838239e1466c3f15ebd77b1d9f70e9826a888124bf20448d2fbadbc4c24ed37f99eaf018150e23269c68bfa66fbb8cadbc2e6ca0deb70fbb4b2cddba2b1826ff1903319562fdc8d68c6186b8f3e2339d343e45c2a52ccd195d3abffe52b518d901b39836798344ce216e20fb53d40a5bb65fb330267b576a53a2c540140e732585ed0446ce3ddf5379f4723e34f8858f75b8df848c04a09ee1460ab63539f2529a50117662a4968e020c571d063b577da5f5156ceb3114d1767b5513c8f0b7fdce6f30da63400f469e247caf22e1f1fc21d03833c35b6310d01b4e33409f0366534275bbdb2b9910bef5560b2f2da2f1eee3e2aac79334b25e63ef8b4b603c62553ead114874d577cf216ed5524ddf72be3d53865833c9d14bc116780e70206045e854d0bc4dde07ff4f6a3354ed989d61803ab2736905c17d5f0c58b00fb012e066d03c34539654cb5e5910d051af8b1a8b1b29befb95689ee3345ae146838954dbf65a8288b6385b7be8dc2e84dd3053dd5032c0feed55371b452b1332224068a111d6b677f9d743346a470ea782e54cbc423ed40662f403a38bff0ec27dd4bee8f207bb39546b78be252bf24d67e2d616b9df646d94de3b4a9f83971af17a8b200e6200edc0d706226c3fb8a48e3143d3b89329208891292619a13b3ee37fcb204598295a08a098711f4c0e63bb0f822284ed26c430976650fe09f5b03f043869e8b855bece8fb81b89762bdc7853170e389eeab192ef41f3c28a820399ee0b6c7d165172f7e40afe8dee5b956839e04b16ed31733948f72f90226d45f49d3d3a9099a926e83272e64345c1ca80a91c50e3a30333f83abee8b630e51427fd3d43f71a8351082da67ab21c63dffc30d537ddbf893f27df0ebfb53d950ac08ec2845b20f35df4837705040da3679fd73588ffd0f32ae94f60e861930452824412ba3793499fcc1cd5644f99843b0fc9bf75038b593f5f7ff5ccc60bb5db639ae70a5f86759388eb2c1870553f24412d39b90fad4dee9222ab182cd07023719d3069c38ca9814eb174cb310550881da8a89de256c675f023130589d32dbbf07eac241bd5642d38e2aa4b7ad0e2e09502648435b248297b0b9ea957e4608b25fe64d38a830c0044ef942fd61d77134c8904d747ce0ce400131f2e1248e39edcbb242125a0c9a5ae524da34827697076a3feb01d08b253948650a643fb5fbfcd4b7af4bc201f46598f3fd910fee6722736a94ec1c3f8d9af3b810dc05fd64e6333632e205d22a13bf52144410cd9b09124cd2bd1d8e75b09dbdac426d9dc58803422d45880244f9e3dee80b2739a0554ac0979ea002567c0bb82ca51402d3c8deb47a49634613f6e5755906265cddf90f13a7b50f0f4cb083c5036701b10e3b1f8584d6522798ab658b109f889a9a818d6c4c5a456d8f1a043a49f2155f385014636d201f90dee733865a9869b380ab2e1dc8283ac0ffbc504d38debe5485621fd51410f4d0ee82b55cd50603b03b0fc6abcf55b24f803e2fad2b4825ac1ad15d9d50510d39739ec054190ad0ac521033e6348b9e898209fc44796a8b95fe3de7670648224cb89079ed56f7babf969141343493be1e04f9ffabadf915bdd41a61e641e8f52da1d6c8fd5bd201410a9db43b04202ecdcba0d61fda406dee1e56cbff9ad9085764dbeaa872587c532caa669c92b7d56032ab72c2f715309ca228b029194d000db613f03f1eca6d0c03f67ced5cbdbbfb1f07671786d74306e1f0e59847e13a90d29cbf5ad81e00ec5f2c5c424baa1a66141e624ab2b401a03fb423c2534b7352cbbc20d919e4d621b0332d452a0d08aeaece7f2c4670529de80a9e746a5d4cfdb23fd15391ec8c582c5bd653b998bde732b09eededd578658665c7283b000967a2ffffb56cfbe176c20ca860542e8c45c48b83ebf4e759df06d29570ed222804aafd0f4a9536f3df8ea6f19dfb0acc76e0e5955ed9795240a3253fafa1b2e58abf791753886a3a47f3b78927d974d44cfa6c19fdd1d5ad73de45d87b25d091cdfb0646108eddfe58587a437373a3b2a68941913d422be2d4cdeebdf757ebc373dfc6768b63eb367671f8f5e3f72e8c374a8e2efe1e7af85f082a3227d6e396cbc93035ae9cd840d4183f6c096870c768637099aa57a1f3c878b8922f0b88d0ba7f1a1088ce51f7e9d2e86c985677fe3b30f64d6b1e44b19b4dc30af8665eacc3d707fa2af1223de75ee56a45e01beaacb0a39b072719b8f28b5679b8f59413f7049d05af3fa3ba354268a446ed92a38c6ba1b5af3527ec27e3531620099c463d17e0f1e22f60061cc625f7a323bef36f6e0b2f031989597a0b1d3e05c82c62d97a3b316bdab19a527cde01eec835be28d872a606d816ab054f822e6aff5f6f98688529e3570c02097f50d42dbc910eb5ff3346ea2b354c6d7a00968dd4387dffea51a9613d269f2a942c204aeba806ee03ad3f03b0a15fab75127a7bf815c2a8c1ee2c2242e53b73c4b29a2b39336e9923130d5bd069bab517a5657f132ce75ab1a36b687721fe3dc9b50a7d2a8b466906a6e029da161344f8d5f668b407d2a3d6f6155774add2591ca57f59990b12d3d1f5965c86391f8ea6385acf764cff0310d9eb17ee8c27a44ae8aaf86095085fe0adc721f7ccd23df165f52e3e87677e4095da7cdab0dd25acbfa376335370c2cdf71fb5f004a32b18a16e3ed000b4c016e2d437e367610994825e96108a0666eb5cc5d9f6f97d54e87599c5cd116ba84154c2262c39b08af9c73701c3d8a04da29cbfe4cbb28f70b7f795fb8576ac5608b081fc0a30c26d9531a9685af1b6c1eade6519e10681db3d945729f89cc6f79ffe99201604ccfdd53aefec03658062e77a944671fa5366ff065f0561114daa47533261536f9383528fcd6da07442e62fce91a8781c252ad4c77fb71ab9e54221effc7cc7889b28812e940df96c1535deccd00b8aec89c19d6e7a15419976bee9dfa1e5b25212cf35990b39b41e0558f1ddd743439e589b68e0ea01452296e6bea9a6348af650001a5894b3ea6720fce18cecea4871647b74fed524322c48928c8834a5fced3d78f734176e96e4bb7fbf3949a1e77ffba80692a032e89952061c959d49c46e4633fb07229758a412fb8a4983cc5137f523a020c6960e9a55fedb7c6a2ae1ccb309828d73f5e0866bfae1af0a190b619bac44df7a1d5c3734557fe2628d2786486debc9fb49e6b69d3f0471088ccdba64aa355b1936ec13755dd6336ad71e05ec1165b124c9fa67aeb330a0588edbb5b19b30dc10052072dc98d8d71f5a2d53cd15b97cb5dcbf42944205999e890a89285a2373f4844292bcfaa242703b49f4ffdbcebee9b11033d0802d356b0ab69d176f09775e95681028085cad30344a8ef310c95acf4646112478defacbbd657c13f3fb236ee46710e4de56ea11525e627b5cbf901f32b677d6c15ca6a1a408b06cb2855b991c462c2ce377ca5ef1f733bf66fabd52d101b11a6388efad4b1aa5ed24cbd5bcb9b4765edf088ae00edfdd855fcd0aca63fae22097f33117817e5bf82b7d6b093cdf36c68ab5bc19daa1ed367004c86154448e6d026251d08c2c3de191a0d9504633a9ad277575f5887e9500ea534def13c1d4897fd89a0d5100e1cc2db6e5336ed8fb95261883f71012fe99fef5387e55f753d324df6a1b86e59bea753533374a15141c67532b52f1359fa9d1a878d85320268bc28e934339537198cd8fda5a7632bdb7e1b90ceb79c2477121d1cc05cc725cbde6b885d41b26d83523afb7c0ee25080f2aa183f2dd3d6679231fc111e2359f1dd875f1185eb308e92de87c2529be7b70b2955437b7a049ed9a57d51a4157851b4a80f5b6051feb76c0340e00786581b6e07e64977a96eceeb74e7bf46a7c7f1b588cd083f7d1c0f94c67f9e30e1c00c098a6b097aa5780e359c6a38cb91a61c6bc635f2c8fa203b4dd8bd2b10756daabcd610b35bcc2bd37f4d8e67eb50047cfdbc34e6ed2778b63f4ae7a68f0ca83a2bebe150c69b44b867ee522764d4248a41121e5a5d31980d2382a45aa473351849f789b2bc10da5930c6eb4a448b3124ff94aaf2e18bfb51889618cc969f956176a63347cc8db756a4aa5528a387dcca43f99248f64a4db8e24b15d66c6d973fba788aa79d115f55ace9f03a6b1737262b8b75216be40daf25e4245d89a7489b5884246daa11660c2075ada0ed8d20781a9103a9c10b11804e91cc2d789888b01fe652e82f297dc08e02bb322f4f9f0ab1612f589e95fca1603868d4efd8815e75c220b73ce8a786978cecb7f50b9c9cfb6b7719eaf509a213b2bd5c82c1b53919e012417d451c179a9c8f3089243ff68644eb7b57e7c503ca16c5400dce478d025e8f88db8e92104bcb17fc7e10403719f4fd81601e96dd84106e885fcd505700aa0db04e89aad07c4143d0a9eab39930dfa451913b34f6c8510402fff207c620b78a600d7afe7170d3a26c80ecac6bc2e370640ae146430c3bcfac45a1fc91ddf1fe99129470c1e8dab7aef58e893e69151b458fe5f8d800d1802341fc12123776161dd7aee936b4c454a1054316517a2e831a64482a448c5ae48e847ce2e6de9439453eee52dadac34333d0470f884e4a2e5a78b058141dc0891c25676eb70f9c6c6f537b31e2ae88731c4b1404732e1a56112a98c58d697b0ad14d9cd0dc49993184dabb832d51bd033b4a2bd18c3445b3e6bd491303a35d73dab9c45dfa9495b43711ae170dd356bc3f579273ad6c092996c589e6dd20e0819a433ef07086520b0fd46163e6f8d385580309482d1dffc255baba635a84fca42015864c11dc2a35e6ad9f8d93c5c51437a210adf5f152d7a69edbd015a74a5a9bdb0b8c5f38f48d2a5b61b6735e45c4c6684f8d2feb797debbb7b44bfcdc1b27c9f3d2ddcf152f8c5b55e2ce32f5ede26be232d43f1b22ff3d1de9342cad5779cd9f03d8b890c628d49e24b844dc264ce93948130486f622f5e9a354be12325840376136a27bebccbf5bdc193edc84793a06dda58a6a3b5432c83e4b44a95d4aac4814b3449f3be628e82c1ae13a2fbd8da087aebad8bd1e918d99b3467b2f100b6c93e3d5e19f1d6629b3edc23ca3434fda69596d804884a21a204799c8c1c21ce98944cd34e5a51875a0850677502455f8f3fa50ccee839aa80d9fcdf64b907e5311946800352f2f8c5fb06054edd29437047130ccfed71466d36585d42271d818962cace866e9a9826cffe88fa1bb9c2977059d8f13ca3a1827eb997119d9bb2f91edb3e955688344dd0c5cd73ff3be6df30729224efc4c917058945e9f15adeac60c5d3d3fe26501b11029986e9ff5211cb8a05685193461b966a7ad9676c2e8549ef122a467804d8935604b542cdd41574beb55b196203d88b17015dea32e937ab3df28cefab6127f4db5b06cc6f7eed06590400e9dd021f585f8d3a24b61e475c010fbe24c0acd6bcdf233536c2dd01cf67c49baf94e388de1c568ae4965a141313d3f122d8149602fdbc1285d826aa29ca178368d33d9fc5ca04f91500df438dc97cfae01e4011d6751249c189fec816138f955a25db7d52d6375e56416885693036eff23723998fd43431b0c7e7eb51b6f135cfd8fb1010a31488b7ef97de45e1349c99077e20dce2c33ac3556822b77dc1e52d75a6779dca2da5e3979830e2fd8db14bb220cb9341594c72df49fca264f134653938513d765d2385087f7c5004138889792718cc2237abcf59893790a8541041f8c8194d03a2215b9a4793eb0fdc0b9b8fa7194dca9047d4d00643fa3bd60b2c461eef18dee42c2e2d93b2a8b88dd467c71072fca3633e455b22a7ee6813f2f200d962d9d4a8d8a2f03a761b4be5b2934c40642361074d409c585b8cbd2ecb4921225651d4e89c522a70897c42d9558439ae5dd59387254b4ef4cdc272641381dae6dd3c4c6b408dea60b6e1b84ac3b2cfa0412f14ebfae7c357a6b8fbcee16b9671decf168c605c09ffc3e9ccb2410502d62133d2462a6819a947c466452f77e733e76cf0a3153dbf8f5854bf8344f4e12368528cda450769ad7409b5d438f57442e887a3a5eca45434d2ee7a0e2b3efcf61f014a60e99c27186cb5347f03e67b1aa75728742ea2bdaf2608ecb464669b3c9a43480f5fc896cd5d8dc8a01840ee2d64d15cfe5556b9d88344a14cf4dbb60883840a555bab5fb309fa2b2fe87ca4a74fa7602f26ea20234aa39bd711f4ac3af6a7a42b1c4333030d9f50676afb46c370fd1404c623c2bf3e8ab3b640b399a81ad001668a46c3f5864044d229b506ef73cfa2687d2ce0b839abd21f7e6ea52829dcf33a023d00d2342273f8b6b6135afde0f5406a179d5287e63f7a446d3948858a6f04bd46e0671d057f3ca85e03916c63915450396dd9c816f66b0bdd2d68202456b75891380d45258ded2159835ca383e995428f13cb57b5665711b934636a283e98377e9f9132af3b5fe23517452ad3780f9bfaf5fb2fccba808ad6c2ea5588b253504cca52d8361a33c27ba7e08a634793481948529cd252bfb26d12c720ba9d229d1bdd3d0707bf235a087180609fa20410daaec93f9922cb8fdaf5d364b516045517f5e3ad68bde8b49df85e634c21d5d4235e8e4a3fa4afd6ba51b40a342327eec3a801e3d53db231504a60eb70ecac2499dd8b157cf686edaa0d14ca3f0e0e92f554d08d696881738d29ac4398735b64b05efc6728305d072b992b6ffaed2f00ec5fbf72c47b77d65e85b1ab92279626afa94df9d2beaf3d1bf661caf5eb26dbd45a7e0c88d8db6a5c33e0b38427961f3037d0866643586cf54aaf97352f19e192aa142cd305f548126d25c69a5c0624f08f30f61cf7f9df36ce589ed0a9f50920d6433788234bbc56debfcd7b452882f37573e91445009db2fa1f875d6e990ef1761a1d041ae6f0c2f0655011522abb776ef628191e86c700b89ab3e0dae3ac51f06073e34576aa169d23b0142c9efd3310289b898ddfeabbfd4cec2fc5c0510ef1f7d16dd3b3c388fe70106de04b6b65ea3b5f261887d31824375b8520b034c72db25c5c15cad061f5d462e87d270a2dab49b18e11d5fdf0d69265ce99f9372af39a0cb3b70700bcc8787b22523142e48ad4c78b278871760826d4e3294e6ab4d1ed085e73fc8ee11d22c8c456161f0cd181940e22b5e1c5e0a71535baf8e01cfa11f437b9c72340864c211017334ad5426dc1e382eb481c4c0e82b1a0b20d60919534700946c43f93f046d81b661959bce7419fcc7c127b528b2e51441b58f835849b9fe8127ac5e6e06013e93ea9526f53472e68f6da1b6b19ccfdf72aacd01318632df4d7c49bd867056ed2599b6b800c4010ab93034da6601c9198aa0edb9a9a9e954880c0120b81e21922039f58a448d19e89d2687d06bb7bd403d037ffe50caaa59c21d3c670b8f960e081e2e9ee8bc2c9123a64b2e5e2d08b34846489aab4876d68eb22499fd8909bab87a9f196525381c50a37265978af2368d9cd6b975267c83aef28934507c054616c608c0ce5a1cc53b1bcc037b9c2a54b3e0a75c0b699f21edb5da03d69a451b91adf325ef8bec5d18ac8dbbc7c85f1137352105dba435d90da2572038e72b80ac66d05c2475700fe2fabb4aba06b6e6fa0d2b0dd41502bc4815f799e2d9ddc47187f67c7b444d82fb9ac273d8a7ac70a91e2974c889fddc8a0a5786973ac85e7ce294588bad34f871831c7924c209f2848398a9bc1f0fc968a422173d4889cd28289ae2a73926cbae33fa774681e835422ef6a639c634dba2a37956bbd8be4862189f05903ca2d8d8e3bf9eb320f45584560941c7adf331ca0a754db52144c12b715a8c5bdebd2988c4dd1db18e87ee9c99c0d8c2e94c35d2447cd17b624ed62b5a11b8315a7590a6f1273d36c7cc3e07f9858c127b5e7fba59cca9e7a47db1ca48d877ecd1caee62bbfdd2d1c0f9b6748b41398a946949abc02049b3109b91bcfd6420f75c0c12018e50935086a7dff10c670bb423428a2b3300e9ccbb60320d49134753d645c42c51ca545081b1fd2360ac19fbc1862fc7a1607d30d437cb01b06b6bef5cfef93196b3d3b295e6def7ce411c88a94ae569ed6e5c56ac58fc0b0afb3ccecc951bf1a345dc60becfae11482efbea9e886bb8245292b335b3e4216114979d267931842d2b7ae64b5a7d4ba5fdfb859ac1272e1d42df0217a69a19039c5c5c41ba334a39971614a5be8b763af13a597132aace28857978276cbb22ac437867cd456eaf936b86bfbe5d58b35324384860e6e15a5373c80e3f26a297434a11183ca759d551d82de74a8535fed926532215cdbbac0ca0ac1928d4d44a867bb694d0360dca30a0e603abaecc19cb5a5f531f2d094043af9f5dcf538c64fa46c378d8684bb7fff8e23f5f9af1fc5166a74fca94e205171eecde6ba94c022c16faece7501b2eeada9142ed004cabf03626848976e2894f317c8b2aa8924c395738a2084d3b34050d936e4346c1a145d8776800eb76fb3b374b5a7dac6a01d04b6b070839221ef95c44908be8db727a688379873cf75c5cfc3c233127070d13e13a42764e048423565d523c85782847a2c6ae25aaa4d77122cd000a2ae55be0922581fc78720ec0254bf242cdcd41b4d82522a7ccc8c766a56c4ed3b0602b7276c4c76943725c11957c88730baae70431670ad8f3eb4a82eb426b9fa40690631e4ff100bc44c7783aec89b7f6b6474b6474a694488761d50a57ee3318c916c96fe3faa6233aa4eb3484822cb1424323f96d667c44c86aa58a15343f9c982bc7146ac0f8c70f1ba558fd3ba9d7824ce8086c8b5e47a716fb6489bf49a723e087badc527283c9f56e9b2fa1e77de2301cae32906da01117a6527687aa6795e28f74670ad1730d14f19fae39e2b440b0795db8cd02afc9cc0aee0704b3eaac2f33eb62e210f4e3d70de02c600f2c43336424603b68440aa79c6349042ce717ca6cfdee144459d3eb6ba24ae570e71ef6617f1fac23420afce32e4a3c843bb7b7ac474f08c5f7ab606f749004017d528ae808ce01c904291381dce1090a8785b2a890880bdca5f63822e413f85b52fa3b7b7a62370feb577f722a5cb7a6e50e5852f495f9156f17721ecb672bad248ce53fe2e6ce5fe8b0e4449059384669439ecef346ab3fcafb852273874aade00c14b02ef8ed8c027e236674a3abc6d4e90a58f93aa0bb61a096464183e61a810677b09c43ff8dfc037486285bc940d083b871348d00d56ea70da6919e032ba9c77ba53bd55f8ce37df4f6b89a294c97b8d165f4efde6fae0f0967c18257f09bb6028137c21ed5a41bea4d36f405e3047cb10d2316985bc49d0712079884cab8e51c47bab0dbc18093eee69b09a6331050ed226b7f40a70bd9df36f6d795e3e3455c312e3c57c8d5fc850ae813610643bb4e407c4ca1cdddedd91476783ea76527a695155a97277365329e94e94c815a54b130a5be5095e74cb6350a5b4d0f615725778802d8c9b1cbcd0766ee822ad65171fcaeb5cd0dc45e7c3a262800362fada100f85bd56984a2d535754bfbf1037a6fecd6922e1729b7a26c2bcd68f25fcd6d1d9a2b7d8072deec826d68aca696069704e1baf7e8712f2b423b513b0c9f1485c7079aad8402ae9c3eb84531bb5633b5a2200c6f79dd6f6d155cc174464ad3c9678b342229dc8f7e576a1052fc55294fb7c109121c150f2d375fa95dd7db02816efab81a40e6bb2fa5b34ea28f1b33beac10646f3dd158480cb17dc0326e86f881f6e08f19a4b5080dd68004bf1a9b61c8c7659880f152e38783591769c5527bab7b6d150715d456bd735b32333222d0bbf3ce102b85e8df2c48b0fd43c05982938df2225c29c8fe20003e74db8ab522aad9e44807139d4047081895b2c21e16f17f83ca069ab11cfb33c3d2b36fad9925facaa0c890e06e66c788da57412114cc5d609dc81cd15ca3890bc665a33a6d2bbf39cf2092ccc4588cac73445cc121c487e6a4d224a7192ab843790e3203b6d2c391eb4588507f198ff3a55e96fa17eef28d840e873222079a0db7a6d2700389ae82c93205c113567dbca4b0e5ad3c187f9578a889138082f333d2bb377741aa07b50f9b44f69700cb820a77926bac2f28058845b88beb932fa216c23c637dec8d80a4170ed0dd7920f0237b117096b91cde1d62db484f371ac0ef6272bbdc8c511017a7aa45254a8b4c2c217be5155cf5415415c913806b982165fe70220c8aab404eac74e54b49a8428c111f5fc023f2c9fe770b73461455c32f4eb39234e5d9d1ed853d7436514c54f4af2b80349733080620b5a2ec51d19daccc952caccac8f22ea413278d6081862d7bd5aab49f46312e2250bc106a3b322292a3a4f2c5a283501f40116ea7dfd0e4176cd111c44b7370b968e98893c5de84258699205c3856dcaf52373eb9d1af7ecbad4075034a9d0458b3f76c14ecdf40a64acab55eabdbdbbd402443754bc513c492d1267cc8171e299486872ddc1edb47013d1a7c0f1d8c0d4100e9d7f82f57db634735f2b6df9a27677003e927096ca7017e09702ad713c5e058691f23b2e111dbbab24888c93635b0dd4fb6cd3fe5946e5028de607f5f614c90d99ed42c7255d9ad74a355bc3344a341e1586efa7cf0499b24edf15c08b093e8ec52353a4a5181f2cdfba5f8560f7431d6cc03c6c40d835cd25bb7bc2b278fa0aadf1fd8199ac3be582e0f789df98491e0767755b8c2d00a65a33f621a9ca1b6aad5804c4cecfc9b0229b6ba0d43ed5d5b4d6fda98d460650429e13c5ff56516675a5d46a66d1d45ab4fdbf32994515f52f679ed8148509a4b9c51b400472e3a201f837afe221448fba5c948c3b8f3a813d93dfa8bd8b6f0c9b8f17f8f9a43d0d066282f4257b019ebdae4fbf4f113722c65f52453208fa91d0c8ac3aa737ec4ce3a9ffd0004c055405797b1fea6de41cdb8ab673900af55fea8184e44e9ab0a7f70da9efa55a0a5f21f5cda9fb20f1dd24e084bdb42255ae6651439aa62c999cfddddcaa9deca6478c6278a6e94023f3812a6678bef8ff41783abae783290ca09db42d03b6fee4c2a80c97358079b4a120e66733f587844898338c23a1294f27e3aa4562144bd6813edd42e54ff8c1f17c788e4e4d216941e3a51789dffa8f5b88c6e274c34ab89680daa84a424cd2a572214990029d0eac2a6973e85af8ff320206278c0a3e9c2a491ab60c92f074be316c8022df17f9b4f54217c42dd060457300a391e9aa143e630d133e1514c5c283b4830ef7851143852bbb71464a392fb2122a655a16d6b59035a6b3a0d97dfc8f7119a22e04266515acfd7dcc440fb35589fea92200a5c2f464552c8eec2dacf968f043c048136d332e2ebe5b77c3568368d30068987fd1cc900ade55e6712f1a240142ce80d0e77166301fffadcb7c4417017ab1d97fa99aa0a4c1454ec8a0923c34e93e028909a492fba088ddb88dc15b50f9d8b14c4246eef2cb328c0b2211842de388a667fc250c8a8e600573ae8908457d15583230f42935e673c946f9f23709ac2fe5dc0f64e7795469d4c32f0c9a9518ab4e8e82a778463e99de01dc39f6fcbf4a4f43f50b5f3c7fb86214242e03843c27aa5eede01642964be5d92127ee32e3165385b7f4afd15a86025bea49636eff9c520caa6cbda99c1eb47bae90721e5686e9904e787f8e4a8e771d472d36f0166ced4c9d34842674ed9fa8be26ea4c71603fe885fe3b5a91cafed33e15075431b71ded7c130fe5f798cc9b48ede880134c923cdbad26d2a0cd16ad431fe8b6fe3dea5db968d22d327385b7eec1899a098db7a8cc09f9841ad3d011dbe8fb3ecef8b491ecf83b0187fac2a09d9ee7e87b1556500209b8121d8f85a9acbc6ed9e4f1094c2884a34fe7cedf3f97325862e3697e8efa1e53afe4d4c0d120670c013e812ea8baa018d26cfbf6e2dc546f1accd85261ec6cff77d8309d3771a77d95187995239d6ee4c9bfbdfbf28f7f9a27f88ab3029f74bd1005a3bf51972a88907701231090ab8c7bdb76d24f46a43ae19086a2760c491c19df6fa286d6dcd2f708324877a175bebd362cdcdc674b250bcd20ce27d6a5d1bc263a9ce73414b73d68624db0b21b9317a7ee8363007052209f8471536c9b9cc7197e871bf8e6deb6aca35c73c4c02e8a39c050326a927957e1ba42ca9e6912838e5947711c816eba19ee73481ae5febeb4df968f6c290f6dd280728a695f7554443fb9e88d88d2b659772f0c70858a9fd33ef0038bf618220133a1ba3cef9b5ab709a84f58152f4483af779c800568f74d163e79a2e99dc993f0d7766164b94a65804add0dd9d0d394ae62f436d4f4d1f1e053c73c1e751b00b19dfa4eb3acb8427d91224692d88d3b65d3f04a994ba4e343323505a640b8fa53be92ef477d845cd566a047ed479f6e6e549bd8428b70d18af1d82a197a6194111799bd2368d123851afb2b6a26dd71513d02c9d4d8b09ab2b3bcba27b35702f09b140acb8252e0f7709145fb97a03b649b928e789f59ab3995f0686acf7b6df7483ff595bef8061207df727d05e53720d4c5041a035574642fc638fe1e506386e77986b2b40660bd464b8118cac477b1c058c17e55460336e161152175b22f9653a64ebf503db94367f430716a2fad0a90cef088709d10dc05480418cfbbcf61618c1f2259a1002369376fc2103a9a71db7713297d3bebb58889fd4953e7fdcb7c05e12ed380a995a8cd4f258d8fd6408c3cde6769b82bef7f7e4cf73fca7a334100ef871f66d5665aa983f691b8a4088b507e2c8c15e55045ec7c7b790a4b1fd7bec084f0c5c774e41cd254d14f9601db1ff022a328677073dfd1f6a8ed35cbc77f823bb8d21b82b947e10dc2b3b5bbce6c931f1390d483d0d6801521e7321310b9ca9e0d152c9f60162979828843340d93936fd705a1bf2d0324cb64ae083624d4cf9a7ac28c99fca220fa0f935a4272559d0a86ef45e29c80672fe4d376f8727424a5e0a4b8fac413b6cc0de64a0320f7b914c6ac8069acd1ece6ab3a342497d6c76e1a3fc63cdadaf87a2573eb4ff41ce7afd2692662f63a46f4ad0b64b302109243794d5e5ce88751083a1d148bd1cde4d1792cf3206f8e0b35d8212548be3c9bd7d658f798813d34ee88a4649f5fb0fd6a6c6639101405f1ec1df0d503883e58947716ecd43646424ed3f30fdcf42a06a6b999efe743b51a6a50936ebae72df19a01aa042aebf9435e5252698163d8d4da87f6990b9536a3029953600761df6af4bfe44db3bde06e10b84c9b50e1e690382cf881b8ae0ce7169f4e208507d891e8d82aa8e4dbd8990ad1b46ef1c11b43d6858c1c661e8a497ce3cc966e196fbbddc8f2194806934ead1aec58ff1f1cab0bfedcfdab26383c5b5def9f9cceddd1589d2b80bc925d4f2344602fe4cccda67b55b71bb0741dc469643dd6c446136a6ac14a43de80aebc2c367b4600aefda861e78684433feb07a01d425f86fbac9d13e3a6241337217258262286390c486d78a054bbb50365e1610c2b49c85553b8b299889ba351aeca95e0482a6d4ddb19c913d4527d915d8279db52a1f0488d721f5e498abd48c3c2f0fabd1b888443751dc2b3b90b7b5bfb481500d05373030298953075d1fa0b18a075cd9535d694062b1a43bccfd90ec4e97087ccfca2fb3ef4c912999659c71a9c0903ff9d14c2c05ed7b11d178ab364223abfd38f763e87b2aa76e5bc073717c4e299b4d45e76ea373df22084a0eeefb9e896b520478156068c608af90501a257fabe17f6b469d0938348ed2567e9b9239dffc382067d5361ef1149e7e885e3ae2ee453dba03cd1c52129e2f6a385b56dac79399ac98a2a32f37a73cade9555e156afa340cfb900dc99cbbf46e0e4848d474d4c54574f0ee3e51e8c0c561c1e49a3a082cca8dd86c8fb238e5ae6b5ba1c526a516448d2d883600db913d196aa4e2113ef2e5824bad7d350362c6e64f1ae464374e0dbff2bd2c93e00d9f7b05792209206618a5f04074eae75dbf91f0926fcf6ef7760d0e53e2c0106361e2e3238ee42619403f3e10d01002a640f503c5dcf92fa32902f3d76701bb29cccaa042976ef04d47e8cdf27a774ec99e035d3e47deaf5794a92795316df76539298fd5a9b50f6d78ab77dbc8864062ec94b6a736ffe209f9b953d25e1a8069214709f2326e1e76b28f881b3bd694205c05f0fc77f4c360cb3212b719484aa473eb768f4bc80da1050638cc7a89d0d45d54d451828b93ce9e7e8a70e85b482faaa9df2bf9a8444d8b70a2085931c890ce9040ef31a72659466a1590ed5d99c88b76dd5d8314f9cbf0500ead86c58a25fbbc50e830597c812084ec527582241215eb70d099d94ccd508ce234e629cc49b4536f97e687df3c7fc354484aafda101ad00e6e0db6ea01436998941e400a6c99d1a09a1833883aec8e416b84fdf982a8eca766c472c57c3e7898b55717713c23fa3c4b0144f9294eaa1fe5e321197ee8f7b9a0e350d62740b49efbae3d9eed0b35c676364635e45dc217bde8e0a6076ac2bb602cd60e2c192759613436b05c839a27923759a381d97c398d6182b4a4ae7869ded3bc6de54bb7e32596706e1df32d644e4b8350377c56d941b9e994b2d0f92bf558645d862f8b192a93de3c916c9e629e50dd2cecc24f8f6ba4f3bdc49f0d56047f56f2c122c282330e9d3afe000e10de23982cf846036cb65173676f755a4a5c68242597c9787476fd539c9622eb1bdf7e5a5583afb4958ca6c4f019c04263f581a6baa29151440206787f2be4928b8dd0aea20f4914212ae3705e8e238ea8ee95b51789f446cd00c2389253ed21dbb3ce4848fe2383a21bc45a5084c2748e1701a2bcde00af1d3aac5dec346b5dfc84c20bb367fa9514466c0a041752861e5192dc99515cd1508e3f1365d62b3b0ec3435f1189d0e753011d58ff770751327af34f9dca6bf790865ea38a9184a37a227330aeaadcdadd6f25d0199520a2d26d97c97de2ea34ccf21c04d8acb9f002a82ccf274e4470b530ef82ac42755f7058bc960bc61269b851c15ed7bb204082140e0b37f4ad314ca6aac5b222cef6633b765ede1bc45155d95102abeccae6f6a4afe699a62b97ec99bec51cd37d8e1471546cfa0f44a6c12f9a3bfa318b742652687ce91fcbca5bbc21316ed6d32c443ca438a4f03d5f7b41ba38c667044d335f9841a7fcf4e9f5e9570d5a0d03f59cc6d9b16ea7ad3372c58eb22043af3aea7106f0dfec5462e349e4ee69f8582c8922edf71241a05f6e0ec0f9b66f891cb3d881b883f4d152bc41083efda5a3c3fba9f651a5309343f2592a2d375923962b1bcb2cd7d268ac832c92f083eb88463ffa2a277911ca3022a186c61351cd32735d9295a856253e1797777a9196e1ca8d0c00a4634cd48c5104327e55223f778598f77b965f85a806b05b818b838f320dae4e1ac1e88a1ac4f7959bb7328f195180f27c8e9af487c03717dd0916773a664c8b5a60131e8bfe341068e30f1498691718f51c04c4a30635306acf4d0c5a45966e8991c85c0d8b418bc90abf83a534c287880a144b3435812fb07e28f9647efceb4f8fb541b4700766f4b22c8fb1ae606b08bb17889ed5a8d23ae3c954f730b8e07f01b633f929281813fc0254e8489e5c74c22eebd050f7c54b790b84de86a37532b3dbeaab22961b1149458211f99090f9ddb8a77417c2cb2ef9481e38ee6d5669cc430060267c4696ad39d689892ac35ccadfb427d34212e121c6c11bdee0360903d3fc07bfd87628fca3addd1da1e88f1f6535c03768cd39812e84e0501359c1f5be7a327c43b4a60db5d0d14d0f671906f0971e242d516773d8cd9a77ce3d4a5e0ef4620d3d1d4cade8f11628ea23fb6a659e4e256e2333987cf1559546fffa8152692a61defc021889d573db02cafeb3832a76d5e33c5c6cfad2ae32e71edd2239ef48cd20ae93e615aae90800e09653146caa5fa50e35ed3d581a79f679288ca067ae148ad652123f4db42e6fa31b7da4add97d7b5193615bec163dabc2a46183f0148f739d165a42378e8795ce147058778f90100c4f78d756df2f63bda41d8b4dc909e547fad0eb7f551481691318a2ec22ccf24231439b7628ff7ebf3fa3a1d257090ad2d0eb277223c4ce73dcdcdc35aaa3ad5b0635ca211033b36e3927f9b39df0c252e291e06dcc0b09f428917d9369cd7825d13d91a14b42de3c3feb62ee347b472f50a0ea1a24ca75ec9074f1b88cea1bf8b9b087ff44497c0855285aa8126ce4bbd406d342c4e43a4a4c6ef1e996a2dc221cc0958a10b1af0d685af024b039fb080b70c842181aef6a3deef59264e1474740e44c1cedca0a13c87f589390a490fedd740300fac25cb4d999c478047ad2230e6f4605b6a41766ff256417d064e12d95cae46b09c5036679fcc6f0b61368e6b401dfa8174fe1cb0d6ff1799ebe6da7fbc00e5844d3cf34a7e90c5f0aa5d770b2e191966e780b34ab9da0f6c4e6a0e25fde6a498db2d42c8c824c94714b3750e88998a6074c6deee0e2967b0b3e162e0ce34b790e6bc293b2856bf2caaf90eab142f441e4591851e45e9a88bb84285cbd2b16ca11b120c4e964cb4e8f7180fde8fb70c82b9da9e22728c868a5886fe797c7abbed59487b17defabec4d5b7317c55b14d20dcb7150515e8cc2bc2dc2398e17105ca6a0cc980578d9472ce7108fa0ffdb7e38ae1db82bd444052ed2c06a7b73d7a492180da852100d26adbf750ad0e90431a167c52a0aba7617176304f0b83e183dd8a6e13cb16412d4d0e0e1ecce9535015e463174f2a8ebe9e2ad4fff41665017cee064830408b5569f9594980ef292389be390183d92bec5006254876ec59dc5f10b4d3e8993ab2374c101cba32f946ea2f3168fa39a3973f459700829ac842085fc1f839c2bbcd36418b3137f704cb6d9bf2200021b94fdad72440426264ce03b91d0d6988c31735101ce123e32614bb5c7e5959bd36259b23d0557b1376d578654de258f5e66488ecb4c410c89e3bcc0cd1a4878d0acbeae8ab31f2bf7363996e1384aeeb23381c25b0c2b256d4901652af9ade78e8fd1424a562cac3fc6c90cd7d52457459bc42fc9af9411e3c3d7afa3a685d832ffbf8c929bf41545d74c9282798a0b73b26f88cc2ba8021cf1b8cda90e81d58be9ed90a50dd7c06ea4015d44f668aa96ebdbe0d44bdc7a7800b38185e9c6a321318179210e59e9a498e004f208e15e4908a32a25d5ba609893436c04ee68504a9214eaf5342aed5e7cc1b648068abf60b90106ab892712c2d59763bd211f9c54f3e431bb31966d97fbd08e4a7026716d9da0ad336e048396c96e0020df71ef8dd2188cb484afc27322a96a7d127a757e21634468063eae4b54be606a439eb018d6ca128b3144f70e90b8525d1a6fcd0fbaad99081af5b50bf0b92b0182596ebef365a967c0c5fa0aa2817c4e70997e4e2d2ecf4a664e850ba17d0237c4c85dc3ee7601911a3eac5cc83c90c54f22400b7863a17e70a9acae0988247ee6177e73532a6f57322bafde2559169d164c2850593da062c5c962aa872edc15152f58a7463f5c96b16da5c631d72f7525af72635c03a88d62c0086390bc7a0228402581512f7b5e88692290e44ae0b8e3aca3afdda0e2441097d04b05fca80ecc652b3836026b693cfbf4cdf6a78055e816767c0b902a714722d7e6b8b74337d028d038d2fcf88bb02eea09a55ccde381e94761bee20f6977218c3be1f5eff039e5849e7bab6e567498ebbf1844b0c205a3857c33ba4a75580c09d6ceb1bea927a3451fb76aa82d162f98cbfd928cc644ef02b2995fe578fbf85299edbd4865dc586cd39b9db50647b48e6aa85daf8f0ddd93c6578e79d2097f98c8bff79e9bf31ce6a541bed3f9e4547f4fb02ddfe21c8c8d56017d95f12fd5fda56abf7f680b9808a52307bfdc3ee9b612dee77d81db620028f2f6a3c440610668edb48065350846ea2472d8001201b48908c4bb10446a93104d21382c83102bddc1f4be7a94a457839d3c021a0c7f78c06db9f321b0d5b1fb38ca2f5bfb41faa18580ebbd4344664353c2dfcc39252d2edd6c16e0f52c5cd7716d38b75f910e7e73c348b17629edc3c5711d3654d7ca83487589b1371c7bc52a69d45ba4a0c98c74322feda8a2bafe38bae5b6827aa4966154249423df2876fc6a02212a15cf571d36da4b060229876c3e18e123ca584899ee212a09b71a15182b0495509949f673d621105384f6cf176dcf17d5af7f4982beba7a5159a02c51faf5c2dfbad7d5b01f6f9a3c03c3bfcd89ddb064f41a14bce420ee62cad8ae594c749c925263653265f131ba510c767ea2dcc257bfe6820e09c0eb55493ef37edcad134378e54e826a0a374097cc9cdd57a5afd7507c5d426b2919a1aed2a3076811063ef1099c8a6bae17f803b8bd2433191d42deccbfa15edd47b687fd187dc5b4848cd03aa6cdd1a763818208d5f0b46d77ddb4025ce1df1460bdc3f1b550d5dfa7e7d174fe85dc7a21dea816c8511779f474ebd4e9ec15908ff9971537c6fc7fd87278d9fcb29a404450ed42cdee013c99e931c5d5e6a0d926d031c8bc273951209077fda7a80ccb03709ec0fa750732c0034b497aad0421c18795fb7fd134541b28e97ad3baa90caa7be73e4c94654b0900ea5a7312641cc59bd319880524481a8434925a4d256111a2517275d317dba9598832919ba43871e8d3a56dc46337dc5881a8cb643b1627d6120eccfad2e7706f834861d5f226aba2ae6772dfe7ec9407866bb94a107fc20600d94e84870112d944d6153313405de7693aaa75b2b5d2b02adb1089f859a1845721a9da1cd9d45481110741aa456754f0940cfb9c4a328bcaf62b6303dd9eefc4390038af619bb4c1fa25906c10f93b4fa2eec686d3f5f181aac3affc70a0f762f159e0880e17211299da0b285880fa385128323d27b7dffdede305a66d3a20437644d7994aed880aed7513f58f406dab97186f1590b456429b0dbb89550e705b4742420ba77ee470480e36fb3f9808a271b3a1ed0166fa8e0c5a80720c9099325a34d50c16b3446f4de626a982c27af008603475e70f4071d92ad76c9e00fa2f519c19822121aa3b943ff024e807f34635126c0a4b0002aef048a6874673e6e04627c9ca5eb6c0b0764b7439b56e47ecfa29b00d12f1814da3286a69dc0e495a725610d1703251d1a5003cccba2372041f4b0ccafe0d84b01c4c3cd3106370159f9580d58abfbc20448d5b4bf7248aad0184053d7ff48e7ec74872c6c5a4679f589b281187ec68da3f06f643a146019c7e845bf292c866e720986eb97be04860de1793ecdf2b475206a785b3045169135bcb36630a498f8af11e4b7c6d9b25f9257c52ff8b2ede19384aad5c3b1f2987bd261a2f20daa39abc2e6da85b0e260be75e29a24bf93ddb2ea448f07051eb3bf4bfbbd80042856bd92022aeaf9c1a5eff3cb8fa15506665400ba5a61fd1c802fe76d2eee4850c31def0c2fa76278041b23aa45e04f466d8120552ed369deb4e950df3cccb97841e6f5f7635d7eda423f4bdd318c0c0b52dda3b604bf8fbf6822278dfd1e3620770bf651cdfc6d0df853778109b64f589a0c9221fde6b4b804d94434f44f0bce7f9d93af4099450e467752fd1d82e9c13ee63b79b329f9e1fa45c591db1a47292d1400cfc160d0e59d42fc91fb8bfdcaaf355318e6a7d8fccdf98eb7745ffa4bddce39efe44a40edd40a75aeea15a87a13bf38a6247cb186f0750579d9a29bd4f61b256079c244e8385d9083775e9e595f580e80d36cc4c0daab597b764adc5097d42b854da09dc151e727b27a804f5e8650dc432bd940095b14374942397df8b7530ede1c1acce53d1328e2b37f12c9b38dd46d63e1788452af8f1902f82f38e564770adf7fa7b577a800b18f64b66ced9741e4a31cb1dd6331fb9caa4c9d4d5abe49b3c40c7d2da24c36ae5ef66a5fb1577b8100f1aa2c433c15318877ae830da7711784b9de439c3f1122f6bf4030570ed8d12f8700d841cd0de55ea5cf02fc2cff974b50a046fe0aab0af06815f39672fc8deff828ad96c2d79793c52901914a728b2aaf17b7bf91fc9158fa1639bcaef7cf250f3c820ba613337565acd9d49b3f2d9c1652d6aad3e3d8d63866d55111ef93b1209c1158e5c7f510eb6f24e38cefcc95acf92e5dad553fcf8710b5306a280f8ac089255f9f3ace3c93b2e3e33ba37b3f4976681ade3306583d3c26f899d70eea8b57aee967a4e866a6cce11ec94b7b245152aee14c71c4776fb634c16516e76c10f9322aa8c2f60aeba259f43f3ab2bd6b5b11f5f8a890d456bbae512c579b34aae954cc8f88719f6f74cb1632701ce1870c4044e2f46ade7753325f8a539dbccedf2621aa0a9f6379ee8bd14f31b973519b3e5636c33d36fde355ce0d20b8fe2683988f6a7b754af51804b633c6b26e7ba65627fcbad1d71d8e8bbdc7ece35719afe438052133784971420656d4fc1ded62ad473a0bb146556f1282e786ebdac6e8c9a926b1f680285bc1d8804c4cc123d03d483049416554c92e25dded88ff0c31985931721fb5afb7656a274e1b04c5465dc70b2d16cd66888d0d48056e1c47df75808dbffda4801ff7eacbee5245de5bdee79bc37e30f702a556184ab541aac1a7be7ccd043d1a2787c1cb1197c4985aab9d7f8212b3a89e34e58ae347323d29bbc9609b7206ae5c8b3b54a77b2769da1ba536ec65cf3e8f0bbbc88e4ca5145a08c8ceb20cca1190ed9ff1724fe2495943acdae1845daef77428696aa8347de8104bf83411861e00165f49181c2787b4c21ebe9770e52001722e701a541ac43fbcf14fb340945d23e5a3521761696330a58ced9e961fea30d8681ba6125732708b0b8de11a949434d7a19f91515e66d004ef8e529662d7ab91d8c6d205257bdbe8b7fae72ae3b0fcd40299c781a225412e27072d2adf0fdb90accfbdb089602c83f6b6d9345a0b301ed4ca7e73fbd9c9fe2b7be78ad3d0b38f3d6d078ad3f1535ab0edcf55f0bd27a08ddac8917d1a93e1cc584258d537bfe67dddd0b775f13d2df154ca15ff55f334fd81607445b0958b06dc5eb084402fa674a5e9b1b62d555396c8d8336b66246ed31ba3421a3874cb76df0d6543de0f9d8133146b0892269038722d98a830e5534d9ff1149270e774e563fc68972a6196a5948130eaf51e78c6fc0476a45c40569be8032c244842bbd1798bdb9c215f25ecc3fd5198c0071445e9995a89f7fcd5d49c27a2f68b11bbbec13fe57b323bd8813c3a7e1f714d31b58d65d0565b2f1bc40f9c53c5681b0bca8a78050719caa96961f99a161d16e61d44dc128c4d4f114e8c00554da6472296dc518f8a9350c7bf4f6e256084e7832d34cd62f3a72058d9762919be72f4d60ce9231575a99d46cb77b406014e0198e80d593437e3a0929ba849329ec8f47bc820e216c1a4133063605156827360368f239bd43c9c0abca57d7ec01184044b1034c40cdd0eb6328b6c07726ae5405f22cb49b708e0fb5c08e28d93baa24a2df9f858c56c90f9e6142c6ca2614e25455df21f6e1f050da829663ae06b97e2c325e1eb946fed8aab9568a406bdc05de3be8bfd9c4e700795bc8c4e8ef78fa700a58b197badc6ecdc7fb9e6360c34faf4de0e6fcb0dc382d7fbee8b3de68c493ba17c1373d7770f666851d891378c4e8d7d31082625f1500a45c99a04420fe21eee84d2d7bd9dfe098698c2ceccaf029111b0217f89e3ad79748de98e287c41b9c1907e55d7967feedd5409886d2ecf635d01650718d19c94b00f940aa41bcb6c0aa05f71e8357f06bcf1562a3fc7358a196612f354a09e27ce9a0d99707a544a418390d775e2988fa242b85483fd19490f5980ba3dd7e2ed69e60845ff52d3a4f72b602e5b042346e2d2e7a58afd2735763b23c0e47f64e98971acf6bb56d99f557d2da3842567364d3e176002e1a274cd730461aac6bbf17383746858ca12dbcadedf9468df032bdf9d189c0edfa73fefef031ae05c029502a60008e23df9f6734899547627b93adb067405143df2ad61cff43e7f568d2d1e382b3a290434fc2c2dc6baca0e2159d0f35be90bfe0569b3ce92bd59bdad23d941eecab4a1930414bf6252a2d5fb103492d647d5aefcf6b5d72d2ee00f7a4639302089b2209bf800489476e920da36598e8b9ca0fc685ea04ee30c8a53ac6f8857a8032b4ffce2b00b179969e3dd59cdb84bcdd4d50b6224204011f6b3aceda578e44d99ed66e1e588b02fb86f492debf20bd349b58c8367e8f9feeb7bdcc94e69fa1cdb233fef792893732b08356825f86c72f678398a160a210c9f8cfc97110ea9b39e7e830f3ebe571374e6c8c83dc98814f85c9ae89355e620c13766cbaf7fb5eecd4c42cf6030d3dc6ea0df0c108bbe178a954a7510501bdcbb536a98a1fb64567a9fbb29b54263715e6ba0b396301b2737982bcd17b6cff1e943569d72d9640bf0396f6249b9677d8b8575879ee5cc397d989c46ff3bc23b3d22b44239c606fe502b6718df30e1ef28a69e21a9f6754fef20adafc8c1ead68e495c3fb2765d468633790a1cbe0c7628a507b8f0db5ba4119f911e762a207833c72cdbb4d13a0b33aee571ecebcf4512ae758bb97501e62cc116045e3dcf4d81de11592946969871642d9c3a39a075d508c9e831c9dc2a08b4040a341cf973286fc62b3f642e0ab7160c4e2ae3c82365dfc5a120f3a513bf7b473ab60b8d0df933ece153f433884a35db008d6c886b4db0d4886c8c1a599f1d06f9d921d40708a262f3c753831e5c4e021654ae81c14e65a33bf1e77411abcb2ffacd80f5a664a94036fb2c9abc363ca69cb1e4bed73db287f6d268517cd53d90fa05253a28c684cd197142095a737abf287a1c467988289a2ac7836f631d3ba5dbedcac08b5a1502061e71b3083f523ebffa6db8820e46c8162aa0df0661bf8d44bce0d4843f4ec0b581ef3b5a68ccee696f9a2dfe69f13159bf7af9a0801c7a0804cd23182feabc28338d920860065946901bd1095b275c5e80621dec722bc80c5b4eb2a03842a4a55c7faf683f5b707af6f1e58bf79700fb0212dcb011bea68551deb6283c092e671a777cd2562712b4d7c2dbfbe0afe6dab1fc659d2b7e0e759d131a40d2425a5a415d3f631da0726454be87331304c4cb0ed162292dfc9eb2f5ae5fb10254e63c2ca562f819640bf2e78264717af0c6882ccf92a98bacef483487ec4b0932cf1a3415f8cdd1798092d8f0f7a1c2b2628c72d4e8a78cb3754334e05232aadc5fd9f2401dfeb39a753309986368821ddecd28980b104227eab325f63dfabb79fe0867e86561389b52ee5fb152216a85568f810fa7254a1272f7fe532c8f0385760cc97cd6c48377e5588a450017ba6581f39f339d393b96d0bc33e0f50ec671bb5da06cb9e2647773e81d808cf00471bf3430c5726b547669f3550719d723dbf52bff67fa6614f3e932a86a808532bb8a6dc1b0c917c717e8e224af982d64b33c75d4d479423427eca67c25c1c2266ee39e9978b58d1f299625d74b32c9a898fdd6979717ece4e85dae632e030522181055dfe4823f6af404fcb73b2397c6e6298f6924ca06923819684d69514d45944626570d8e6bd573ae2ba30711829895b60eff30257ba49f584de03a1f3db38125c9ed92f65795a7bd6d0ed1f7695e381b2f59bc5dea15bf8cde6aff174496ddb43451d4e75febd80972d13c878374341e20fe0263c36effa9fdf4177d1c5274275da18c40f83580cf888eb3332a0ebac65eb9b430753963a77f87c2cd1eb843b89ff6ac19dd5b26b6691420bebfd8f7b8bebf9dfec9f753bcb7c9dcb7ecb29f0b462313b12590a0601726a75f03e1a6e0637894baacf719f490f55cf46a089d46d90a4cbe2e8b1acbf81c4601821afbf47fa3562029c6b034a7cc67f5b308eba9a0e2333f14c0ca381a640dace667dd3d84e60613c8f0ede6ab6f4ca6bafdffac60b8adb17db46f70840d211145607aa200fe71743734692cac4d04d2feb98413166fd9b22fb6e1f83e3514a238bed4d9b6cb9a5942925192508ba07f307dcd7cfc7a6e66d5e48771068cd6b13dcd8b5b6af87fb1fa2ed7fe47736df8f731f411fffd573cf63f59ccdffdc3c8def877b9b8fa0e6a14c7039ee47bbe8ebe040bbe8b77a6e6e7e65f33d8d8fe08dd7d256abe761f334be9f9bb7f9d5cd07b3f9782258e3c1fc45df7a3c5e2c2675ef23bf73f9f8a7bed76ed72a413ef73ef223e8e3dfaa5f056dbd9308463f46ffe9bba8e484cc466de1e473fcb1f38fc75fd23502f944bcf010ad5f757bf88ecb5ff2e9d274f90e8fbfe4d3121aece7a15c85e20d661269a40f573e7f21cdeda76594dc5f3a1739375de95434027f3911e7207fc9303af907c45ff2c75819d6a29055a372615bf4b56f95d05f9f87bff6fd68ef5fbf1f221fedfd7faa448104be2d6b977c1d6c660c086a5e6cffb8c85f52bef5a01a445843eb1ec7dbfbf340f9f713c1d01a61553d40aa2f7aec62fdfb219afff3fd34f5dfdee7f3e9d4f73bf7fe3ea9efe72483a0dde8cfbd4f7faad52a21f5ddf3503dcdf7c3bdeabbef87c8877bd5ff741ce7b57aba6f512082ddb778f818907b8ebb0934773a42e06e470f90478f8b60e7b5ead72a817bd5f3483dcdf7d37dea55df0f914ff7d91f0aa23449c64648c84603a2405ae581ab15a72c6456ea511641dddd21f0e4a82c2be255b663bfb5a71f63748a4ff68b394dad2a6bbbe7be9487fa98ef5423967d96eb6346494a9d900bc56238c47872c462ec084fc7623978623cac44288c391992128bc562319417f397d61b158dd3b1fb43d8ed87b58bfb6377ee584ebb1896136b8775ac3d2af5b40ebf4f8f0c24c12ebbbb7b857133d3342214638cae3076232c8a6506629baa5c998865721f3655f96bca56cb31701050fb1125cccc3e7ca7d220e6471ce95f6c7cc960bf0faf96f52cc4437c6447bcda7c217c6999882303af5b58306e7f24238c56681f0afef3877af3dcabcb7bf8abc119c5c6cfd1a35dfdeef1ddbf878fd6f1af6bf5faf9685784808f1ba57b0f1f217459ec08add3e3d39f245ff688affe1a8fcc5872fd8b4b33daa81bb88800fb1c4484952c3fd77404e689df47ebc423304e979f031325bdb0e7ca9f1e0a76bbdfc70f16a83d28a55d3c548fe07e763b7cc7a67a0cd3077eb48e73a075b6e707928a313eb1211371f9fdb78f3c2eb5df6057fb969e6ce849c8e9481307313119352539293d5d9914eb8fdef6db7bf16a9fe6b53feab9e7242133c838d3e489a0276429e8610b2a558630028c901668d022882366494b14017e3045ca942d4da8e0cb11909fe3a217c2e27f0076677cce8b5a9020443edca3be20db07e13e7aa882d38d2f44a8e7c63f21c8f5d9097e251ba57ae0224debbbb188cbd12015e172bb134175e327e38dd82e8419045c77c718e7188fc95819bb670d2d08fc8d1ff5c1e284fecd75b7658ffa60a5e430648c8cf3734ee7d89542b13c61f0144faa69f47d677efff4e15b7c5a655671e78ad2ba1dda953c3837b530983da844d84a84dd6eb032b519b15e664a85d3b01a996a274103debb2a5589882f372a546a278276e747231f057945d02e7f3c4c2c7f183b1dd2ce898594d9f87ee311162f48d9d5194c607104aa8b5933b1a81b8fb018428b812dc2627684050c37c451aa74aeec9c4758c8ee5cb50b1493b47a72e1cc1b8fae8082a94639aff072a9e4c2c9e442cae4a20a0b0cab25e560b51b8faed082024be3c6a32ba4d860e58d47570c3de00a21296e6e3c92c2ca91154b4c3015598ba08105cbd1fdb615566ecbd417a0aa048bafaeb163a7e38378a3e307d74a89810ccb104e4a5a10cb8801152c49b0cc88b400fb7bfa7b84733af5f77823b623159182544489a4725445162ab253c014050e4fcc90904801b21721ae386dc104111f7c08fac5c68f9a0c373c4524319a8640ae53ee05d19eb0c20954216a2923460ce8dfab28a07ff1e8092686404ea6dc8b4cd47064095c22072598409e81889912d81eac0a589bc0c1c810d89e8d22a00acd8c6589524a65cbaf357a1c43ada10af1a98c31c6495f9b317a113c4471a2c3a19014191bb2ee7cf9f1ce2fca1557671c0b070955befc0ec386361e6663c58a218a0d1d70fbfd53d5a694d8f08da2cc21c42880f603912a51c830b449f120bee8d0c50b7e25874bb76ddbb66d33034cbfa29831a019668062c0013ca344f32edea45122294455b6d82e18c2c8aa60c10e5ab880da131ac814c900840c4ddd4315259b2a57507fe24a2475f1c2b9229e90b4674dd3342d8694add58ba295088e7499610b952baadc006a4264b061a805304b00511103d4dac9d5dc8b231c5836a4945f10993872b240e344294581912e0469aa294694524a5358b40d556cc832edca6a9aa66928b9d2b4264aab07282d1d29317547599858455ac30d9523d453b69b524ab540ea57d4824bb594ae624029a594d23296b63298b6329ab6329c9e524adf8616e4aa9b36e99c73ce3055fa15b35424cb85058671e25d3950aa699aa6cd39e7ec8088f800178c28a594a62497a62e516a17206a28a594ced9458813b384d21828a594522249fd8a4a0f20b2e4a4c6a6214a6907310a9139ab18a55050b4d4919b4b6f28a5948fdc788485e9487c3281932f362411c3181f8434f982a808a4244b49c0a089104f7e2444191b17cc4534fa55cb135788d1b4d8e44813a126434d664d8a9a1835499ab1a9699aa6c929e656e9d72f8e904a5449bf0a11c50b5a944a134a61a0686486a6508da555ea9bd72543fd8ab3072c29da58556bc254574c660b4e3f48adae660c455243e857fa962e75b111e9d71998521f5c736e4245fd8a42465528c90a29b18496dec5020acb15574c60439009ccd0992243624c12492c79810727316c4e4e70634429a594d22584be1003644514484a2fb4005211be183101a28a309484012993305267d068f42b7d4ba168010002ae2dcee86cf2ac6adbc628251b030964e3d71b8fc810c2a595d2c300ebf65c9d361f23441c51be7b12bbf46c8f7c9edebcf75cd3e557c5b0cd42ee454a696499a4b4296339c6c2e51c5109888174b9cc3133106bcc64fc7099593203313333173d41513b1d5b959a7674354d7b82e16a4f3b1d1a6b763aa8dc997332e0ce31b8dc39e78f41838ef9f1ca154e006ee8410e3b06c9f5678d71bafe4f26e9fabb76f02331b4849184fb18b0edc69b5037125994b8028b145f8801248407a099932a48435bce68a2b8e40221ca806276831058c0d05a2105b794332fdc66c2c818674071a18826430470e3911930b8aa1b8fcc786208b3585e36d29152b6108497322a2003840c5d5cc08a165c71c28312164acc1fe58896a3e19093a366e8f6f75b2153a4a001863345a608b142a4e20b152b24b560054328c10ca5095762c39c7ae59597527514860cb7fbbbfa821e788002ca11636c59b281239e08c1b0822ab27881bbf5a14abd524a29adefe4f4101be6c87771626eb8b2316002c6d3ed47b1e40f2f608cb0000b236704c98e62260b22bc0823054a4079e58fe03befb64ad94357a6e0caf79d1ccec9896d9d0ed9e9f01ba6bf22dd7e0b860c4e466ebfc6724d2bee87d03b55e632994c6604b26e7777f7978ad11f367f763aa644499c9c1c11294a301edc309ab9f25e1c243bb992a52421a39284e256cb7a178c8a2b3fc633428f9830577e0f1f49aefc1f407ab8f24710868aac8b1911304162b43862c59250174b0c31b9321e7961e6ca78f4c5962b8d8e180ab2475ca0a0ca67c9a325ae942188413b802dc0a05c230cce024240965219bbc1b3220e9577f975f90b0f709983e787f90e00766cb43e7475109380581f3f761c6817bf8fe884a3f41ec44230ea8efc8cc446319e10776404729362ef8f40fea6e336ade65534ac065f1413c144a6e84a345f6c97ea03e23bdd175a16cbe5f2ae8408b2a2b08c586f83c542fa5a81bc0d16cbc64b677d97c54adbb163c766c5173fb3589703afd553a3c6b778f8189083af51b7d8f8f16bb95f71f94350ba1c9db8e0c0b660ba618ecb49de919f3f85d6e927b14542dff83bfa461fedea6c74f001e07371e0d9f062ad1ade06158860fc90157f13a241db2f9cfce99fefde0f914ffffc991ffd35eff41141ff5a3df43d0cb0e5e36180daf7883858a31fda07d2c3477c622d7dd5bc98bfe4b7370265b128191bd60b04f4c35f72c9bf67649e2f3f5dbe96b25a27e45fb12a7f2c977d0e999953ad43a1d8feb28d61fb67636151a1502e330ff1c5dd1d34d08d4cb73de9b23fdd57424eba4d13a24be761f3502eb53a79b6ea09c7a1aa265dc81bec6e877f3fd02138ae1261e37334ccdeecc951bad3d06c466c582947aa858b38e1ccc27a8a8995dc2e3539ac458234a1b6120af286ed454c6a7fad4718e6713da475f3915632ea563d497dec783098fa82a800729f14f2d790f727bdd1eda2590dbac4f2875e74fb67837d4f8867dc39394f92807fc8d2a74c19d58243a165373eeab7afdbd7e2ea575f7b9ffab5b87f1ffadafbcc57fd54bd10307a7d535bec0f914f7d9affd9687e68bebee6fd10f9d07cddde1f03757bff16ead3809c7fc4a15dd45bdfa179172c76391aafc5b957f3daf3904ff3fdd897af7d3f443ef6e5ff685ff311e45246587f9a8f5d0f907f345ff4d8f5587fa19ea7515fbbd89a975f23df5bd0bee66b71ef2f046cc1befc5adcd72a417b7f1fedfd0b42d47d9056eafd23a87ddde76383b452fef57fe48f7ffd08da4f08688405dabebe773ddac714773a7a8080a2bf80aabf50cff217ea555ed41ef59910992613964929a59452762c2ec5286ec36e47a7262fb46f2273fb7d9cb9fd5596c5ba6e3c6ada726d6e3c6aaa72439c398b425dc03e9d9999999959c65cb58ff50e2b61c413811e1cc822e97294e272145335eadd96a9f64221975fa23c666666fe2666668ef9cb59c67872c4627c84879b9b8739070f0f3b33b39418733373736dee06c681c572603057acbd3d362c27068b79a0d4e3d3230330586b4b60b01a6432fac7513665ce94524a19a3cb18a5949e45a3c1888cae837517c718638c9d11626c891e638c31bafc39e38c31467719dd638c1f2c6e518e66152b73c478babbbde517e6ba4ae376770565bcd13e824c5529239072b95cae5495b2a664aa475e99aad6e53b52ba5c52ce23242735ef7011bfa8a7ba9c172f47cb582e8a3832b8fe6c147148249880e23a6bb95e6bed21849aa4d496fec5f24f06fd7d8464a075b430deeeea7ba70305ed2b475b1c877a2eea1dc6228b475a8861a32a6ec848d7b7a02cc2dc9095b250ba214b719d9d51b4c6f685d647f332d02ea7de7c972c5dfea35d2edd9d8dda95a55d2edf8d7c4a2a7bc71a394fa7d609b928851104991f679c73c6586591fc82524cfa67cd8e24b22d4a4e8ea482675275fd4b752231383d39691fd09d9fc7e6e51833333333572da2bbda3dcce937c13fc783763933e788e57474cfe1cd39cc3ecccdcc5b96db39320aee9dd80e8339f38acd71e584fe52facbcf9152caf93962392e5be6e4901f2c8b0d73c2e8c4e7e4e47446e4e45c249c8df1a303381be3c7cbd98823abd3971ee73d9ee5d4c414939464f75cf7713097bfba5ffd8afbee6b692d74bffa5a9acd1369dae7d37df7fdd725ec7c7e4dc70d122b230eed3983e717fd907ada65af39ef7474cf7d416c9efb60feeae962279ffb7cb8b7f982f873f57e6bb379cdb32a55f742401ffbddfb70df05a1f9524afe10fa00cd1fb55ceee734dfe93e04c0e516dcfe1a51a765ed6a7ffe0d220ef9cc5f13755a29bafab9f322c89eac753248f107fdaeb8a362a176851ce4c51b1f23a000db7d62fd99e7d75db1a15771fb19c953bbe2a5656c3b1171c4886383dbdf4b11071471e7fdadb81f34dd168a379ac92c74b5cc5fdd2075c2867fc36ec2865ee4451f07b5d20ed5f5ef55b716d9560aebf63ffa5155ba6acd8e2445ed8af7e646235a80e2b6d2f7999bfa3a2bd675432e62aad536ebdf0357bcc1ef4c5c1380086ed6c82f006f482fe02005f534dba37652a894dc3cee51a817e687d5b60e4a7624d4473ddd3edbaef9f5ab1d44144a96a20f3303114d0ee7cbf7a75fc83f99327710e0cf84f9d9afd629964ec07615aeee6cf5378fd52ff99c7bab76c9d57c495f7b9ef65a24d09f4f3ff9d56724b6241c8df4b221d990482fd20b0d6a6e4b6229a5945e49e7732f3dee29d5344b55b4a392ca1ff4e9731b125bf359c046a41da45cdbdcae8af106fd6a55deb9e4529e65e15c57852a5cfb7d20de70201e02cb25bf88d437158595dfdc8742a55ad5de5e6d7e9222c121bd0034a52721330339be0105329cf658f146fff492182902e757a5d7f29941b82ec02904a43a58c97166718609941ed7051871babb97707c6bbba23bcb29f9a7bb7bc7b93bb33727a59a96aadba6b917a9294e2845203a75ea31878cb92721394fb7af20bb704845b298f9a2deb8e585223354f88d5b6428c3319821e3f247550aa69372be4844cc8cf19925cca7dfcb967f04e74f28d60a8fef74000c17496eb8420c141740d00452194bf870c6882dc07e58ac7908824b55d76a55ed6a45032761d1fa941aad2cb578b2f187308ecb0332accd8d4844ba7c371e31b140562b2c24b8956432d9101a9739e504036e88a314919cc60d2318f718ae330eac447543763204690524d7dfb27ab8febf0219d7dfc58295eb0f2b72fd633c505cff119aae23013d5dff1e3e925cff1fb3eb482d8cb9fe23f06719911eae23b940c6752413285d47223234c4138a15b291528726494b5cd19224030e3ea610e3e84a124f60b1016c2ad78f40729dddddbd3b957277a7eb61aefb4700f4efd13b126c99f22f41b7c67c87883f721f6913f5dc55d40b63b7c66e7dce6bd11702b693bfea0b01ebabc6b0117cd527f2e9df7efb8210f96c8faafd45ff08d6fe5a3e2dfa7dbbea774e442ec02244904c06bafc55e70a98eab7d393d76fa6fadd547ff3e493bfea532e7506717b0c38de99df6ab56a9741241334b5d63ab5af9d0e4dd3268d2e124a209b0b66e9ee5960b035d2902214c0ba116908947b7323d210144c19d80503d29638292952840b1723ca18f3439821bad4808549ffa0850c2243228ee601e880812413e2fa33eb0c223a70913484152730b4d78fe48002294f4b677c11043acfc9f2d70c490b1717ce0d36c4c149d938232480db678c3883c9194fb73bb59a63386e05966f3c3a73e49e81e1ded8ed405d7e1d7602061b981cd9c084c4183084b50ab214691d0e0019494b8ac0500688a358bb8b78944440946dd5a84fb2b42facf40bedfc40b992357007425bf0c0c2961faae8020c613bb147e8294b40c84206a41ac690297a02ca2a5d60436b2b4b484cf2761fa45481c8a5a9d6e9cffbabfccf846635594fb5b456d6947f809fdc4ae4f8d94f414ad6f2313e8d77d53af5f349e7d33781fa9c1c8742fd9ca839e7a473d64be7fc18a9c6dde634ced8efb4052ee284d22ab9db18903fd22994ecca9a85e523feb5ba15f2973f907f67cfc2d28f0c4295dd080ed9b0856e91ef447fff9e45890d20c202b5f777250661be3794ebdf430c823b27e5201203b50f5b05d79b108a1f481eaefbd37b0b9a5c7f56d2d35351511310585c8ff282502eb9fe8495df93960fcafb59417bd407d91ef511b540ee7aaa34bafefee43b5228be5c0e5df727f727c9f2af50d878432974fd35a5a5229805d7bf65ee5464a16d5032c9de9438e5fe91c5fc852b79c44af9b1988378c351687f23ac6535b7131dc6de28c164a91115091159d87a4583e2072d09bb0d55214b79a83bd88a240a3336b4c06e371e9929d2c50c0b57586a0614313432b67a51a5584d8beac4da7c4142092e475a9411c4163f3461eb8d4765f85043193c541b2cd60cb3428dc1725465e4b07143b2ae0c176e504fa927d5f664881393aa3da0a6a0d17c08da9ae0e8d0ac961142839982226d4a277d30a236eea4695658929b1e5a9247655ca0c12978f257ac64a89e2cf92b56329c70fe574dea0a1d6565c1b66e3ca2624825626b6e3c9ac24963c2da1b8fa6608281a5b9f1680a26c2b0a91b8fa630421bc3dedc783405151daceac6a3299cc86057371e4d11440697d6e0c6232a9498c1712c7fc59f4d63d537365ed396a6555daa39546ff5dddb3582bfe2d7744a8f79f30e9ddddd4dbb56162b6475770634563736359646d565a0f2600a9b1be78d7e233373a7306f6c177bb0cbc9d49c73d2c8c4a54897c6222ee5b414fb0789462009fa49e07f009c8ff7bb5ad78a5f8fc7dbde95477c8c377c6377f739638c12e8e09a20397ed31d8d3a53cfa7b39c4e63b5ce9641482959376ab45a15123e4e23030de60f9a010d0d58d2add05849d606cc46a66c50e30bb5a7d645a323c14908c10120606f6c6ab49857373c9b591aad65c3a5cf6230186c4a1b1c2459d13800a462c4e112e848d0c0d5b4684141341d04b4f757691c00407aec3967537e290e001c2ade78c13990a61fd1a536ebd143a7f395c840c49dca42000db111e868ad301790cbef2c6bab1771f86f339ecd66b3587d1683c1b68ef5ad2b16f495c5e2d96c360b0a0ad25235fd383cadbc963f8d1702da782dfed50b0139212540d8909b7c6c9ec6b3e773f32b6a743b0b0d2f48066ff32b2f088dbfa92d1f9b5fd1b8f15a3e374168fccd0b01ddc9f29014b44a7dd61736e4dfc1772850bffa6bb596c57ad93563e305b1f9d5df78416e9ec68fa13dd8bf2175d264fd1a917e4a7732f894bf60433acbc0a34dfedaa149de345fcb0039b1c4480f5db000c142175ab86c3112d4c509183a863ef9184eade3d4affe5ae9177efd429706fb4258c780b61071f8f753177887d2198cd01d680aa65c1c147023521224d79d1c8c88a3a993efd05a2deb5dd4897d8ce764e28d1643eeb06444698624e90235f2335a1bb12105a240ad533f14b4efa7445ac79fdae5f99878a39fc67332f183315cf0743d1a8fafe6f5d5c15c9f26d441c35f8be6f9b68cc673f2dd8884e489a7998c0db989432db1489a903069e066a8194b693e8a126a62799aab1147063207ba458c38b46fe2a626953bd1b893cb1aa63b3917ad23a66a4e6c444202c4c2ed8f77ba74551577ca01cc75276f24254837221d71d2c18d484780ee987eb59be947d22108490722465454b9a13b45a329806e47232aa4dc7e1fe3669a9a9a6e9adca9491e716a92414d379f3bd1d06c444dbe23391b1a661ae64ec70955a5aa2a954a25e38d1b954aa5a9549a4aa52db9fd349cea39ce258da7baa977e53168d3373545bea36e52375e045353649d75caba315315cdaf2c7d1ad752646ce84edcfb98d689a92792facb289a8eb9fbe183399be2ba1d34efcf7522cc5029206c488d289778a3e9ac5dfd93057446598838fca33ff46fdd8eeed231282696ce5a6722d1e264481337a4556e3f25b2347446f3fd328886e643d6a5e1ad3c571756cada75e3f993bffa6d3cba830db9c9a989dcd09daa131836a4b3dbdfd23e82096353affa90ce54b322ee799aed87b5e663b1dbcfd18e04fe10dac543524c27bd13b76f7f944b49db4f09f76bef4efdfec4dd5b9a1a6b69bec65a1a276bbfce8aede1f1b48b6f701e2ac78b40bb98f20a9a90ed5812e92edd3d129ce80626ceb818d03e19117d154022e64eca56e582539897d21d7c5b76e1224ec82c67dde6a4a98e3e0a7352e6e6a95eac7f8bbfb6be72ff834af5a050dfe2e163c0fadc4d6a95fad6410185f9f477b60f3d488077820ab21382c8983d145437857ad979e623c9b2a4d3d98341a05f8e99232ef1882002ef44cec120b096f841ef3095feb0016c146fc88f673f64996d67fc6c5f51cf7d3fc701d72dec46e3f6fb00a283adad12eaa79e47fdd4c763fbe8711795c4f6731bf7dbf3407deafba98ffaed43fdcfc6d56b717d1feeebf3d7ed0b5263874229b1a9bbc96e4ac9b36edbb6b49481764d546a3b63c3b8547ffb7e54a7a3c53fbb167f3cb6cff2407d3e3e9eae871796a77f849e8d9979fe6c36abb3b824b3b31edb0fcc79ee3c29f5554dca7610e8cb423a58c91136e4594dd703b4f1734b29f0dd112f7f9ffa08a2bc167fad12ea73cf63fb14eafb31027ff5ff2c31b34b8fbbd1342458ac560d6f3a279d734ee78083ef80291ae9981aa51aa5ee45f7395148a17622a8eee6797581f58b3ebf10049092d7bd8853bdd8302ecd7ab82fd5ea325ed9744e3ae7520fe995290708242847de158404e5080d42341c8955dca6007ded5dbea381f49319c009a4cf2efa9bfb0c4b33286120880645a0a67d2d1b4116cf08b0583f2cd6170663fe3a2bd655adb05c1371f0cb6a64c34635b26143ce9e2e03182026950046a31eca73b7efb0fa504000422a489281db6bdaa61de026e0c6b7c120c80f873fe8efaf6dd44fc5afcdbb2b36b45e6eab1886c3202c207ed05f007ef5f74dac13c1f522b27c43d7dfa488c328e268ddfe8a44c431bf9fab5fbf58a62fbf56f1358cfe369357af61ad7163c456d9ddd19a1fafac464afd75a9bf1af5d7a4f62d36ac464846ade338366cac5629a36a548d34cdab2e56ca808803de9fcc97f35d2f0f581eff8d2eeb3bda6f10752a6783e581ebe38d7e0ec78bec3548cfd81006b346de8ec42ab8fdb1d69ad8ae23903cddea3548cbd89e1a61ad337cdd2deed49a0d623d2289d06511f8524da34a3d332c1efd63e66e9258a79d0eead7e5d79ae681bc12dda3bb07aeb711e53cc1af9c2e650f5c77c57ec7d85d7c06815561e10758d75f4affa8f7f194f50597f1566619cca5c5d8aa1b5a5a8648c441af0ff661b0dce176bbe6f6063596c5e4be2ecbb68dc8767c6fbbcc937932f7f522a5a6497739b9d4077eb4aba534fd68ea32d0a35d1d6529f4211f822da9ba7db26c4afa4f1901863282ac55e6ea17da3e96c5b8371facabdd639d834ab1ab6432d9fcfe979ebdd3e3bb790d5676942774659af60cc276fb59ecc51d1f7ad53be43b3c24befa8bdc0eba72fb65278287b13248ebd0a74f96f6d584544dab9ac6324dbb31694d6af31af482626259c68fba11e905306e8c3b9b0ee66a52d2dbee9c365eb8d331e79c9bf7de8d51ba942e65835e6eb34cb6dd4d027ce64e8fa8ad6a7472ae940026db13bb3db1db139ba35d51faafacc76d0cd3ede7bcc8b778166701bfa2981f5e83fda3755a3643034531edc2765dba4bf7e88178a3c31feeee4a3df423e4a0eb612bf11243c14d5c54c43dd42e0f22eeb4947ef557d192a5a691bcc87291b97f9d151bf4e3ab8c032b6129b7f31a64e68f69197bc40d5b16b6528d26166eff0f0fc41d96a23fdce086b1898c7e4d21ec17e9a656ea256eb26496d2eb21f146f70a6d43bf70bbfd6b5991e5afb56b1405a03fa8940dd83439e954d1080220a0006315003020100c860322b158344e63a5ed0114800b709244765630164863490cc3280aa2188388318000000031002085a8c82a00a5cd43ff5803dd557280ef9b5bb967df70a72c6e677f592f5a6085a53815913aa8a353979b87c5b254dcafeb885963d7aa08f191d4366f65965fba422938124b4f7d9a8508a908584b9203c9664582909f6d17672c229bf2e1e62d2f9e11f810feabdbac3327accd411b8bb7f7844faf646fa44716c55d44755132699e8d002d9711c3c50591a448d6b82165c7e2ded54da64a2784920bf545c0d8a917bb37ca41bfceee4e9bd4d328b7926e051fdd5db2f6a9faff425f358114061154dd3fae462830daceeaa0defab92b918c48419cb0f787523f60026b12b7a4e20f6af8a94739745d57ece67bd792b395594c851a764f914a9fcbefc0e41da9181e858de0c503957fd199246cf9d4d5f7ec6aecd5d6008850b76414161c0633a470ef662385daee1271bf801916d8e4818e14fa0d06ed9b602a6a9a733e7f39c3907b7712927c1bdf08355ad765eb007e0c42907901fca6157149a93a5270d090959f1a56851e3710514be3457a3bd2cfb7dc506d5ffef3d548c43bfc0bd1b3d59bfdff1d8eadb5ca4afa8e058f4028d6bc46870422f4a4ba6d612fa8121f4b52df86aa222fe8372459aa4c5e71f4051d4b27aabed8af29b65d682809ea42e3ceb1939bdbd9f600821e1ce33700c1f3a0502f8c553225a6f12cf8272165539cb025a24d8b5292ff907b00f2854231e9f7aca23dd164eb59c5793789f658941804a5aad54c31bd3eaa5af837c7299b9ae680785f587acb58fef9377c9f668b2d2c1c3eb0f8c4057eb5c2f2a1f05c9886fc0805bf5399b307318120babe584540e179f10a6834a4ebd281a83e7075bcc20c598e6957b8bbd6e348b843400012cb5a2a560b1e6cdfe356ad07ce1696d1343da01a41c68ba6be959608f4f1f4178b3532dc348f382dd5214a1c9302c1b03e80a319905157b22e602de44e6474463de8d4cc3a9a89797be21746de03a03189666da8becfd05e68f20850236f9adcdb0908aab113c1572d0e16cc92d20a6e0b87bb40b8fa34cdfbf09b4b809d31a4efd4a587f0a98055a475aef735062f234d5a52a25b2ba34c4ecba7eda7506709e9dcad71f1a8f3a842eb85e6fc07099c519ed8cf07a144eb78c50d5b8517968013a60e8e057392a54be4b22181a8aa344126f047fc784f21a8b2f99c9beea6ec559cfe96db6d123c2d47b2895d177fcec31234b943a4a164b812499268614151780352418b20981a9836d62fa47f63c005dc15ba019742c7b421e41ab4cfd3e29a27343ba0e8a8e06cbd6f9178afdcad7599abc92403783231c2d263ad5c7047537bb422849414f693c075e35447d59e7fb0558e94049325e911cc10e83b00521ca8d74b62410dc8005ff2a65c43db7b09813509ada2fcb75927a52c02c5db81e6d5582cb5ced6feacda66a23df5566c19a8a94f9dca63235d34d6b7e04cb2117b20f4afe0edbf76123f390c19261134987b0e137a499d1b92765a386db544d5de8011455e2826c43e75f6922fa7b098db4db36e2a494f241996860cda238acd3046c4a0e27a97ecce758c4af98942ff3e37370a3ed6ef40eec9a0b1107051d62b1e8761206c9ed970e894d9b2e098d84366b63b1f923b30d4ec3b94c18433db8da8fb4e87a209c0b629832ca33e908542c41d89b5f44354e4da660d6583f1e532076361f10560943ff40399c5ffbd0f74eb03c349cee1da460d6c7eabcb848fe3c898df07cabc8f329481f2506a32a1e5eec98b0a95d072bdeea279cef889200310735c9bf1430d686dd62e08193b9ce979d0ed17488655515021c558264a21f2b5f5cbe349afe9b65e5f8c46a4101a40fa61e16c26924f0bec3cea493060f29c1a0b33cfbb165a861c702e210c3071c1b7912bb6beccc9af06a78556941f1fff322601ce189c36ad8066c71806ab1fb6a78f66944508934c8a3a1c94b32106abedcc989d5d6d010e92768a060d794d35dd63c0798a710a1e12f50146cbcda21804d03a124850b689a02396b13957288b6d32bf0c835edad8128c345318d3e27797e08625d60e2657b8b906c23f37549ce771c0618e4a554046735b411e456422691859e691eb3087e0dc5c537126673fb40af21f5c2da031c50b41c3e9e6cc4e5ecd1a9553581b51937d6cd56973128e9d73e0b783b8c13706ee7d1016cd1b481c15aed3a3e8002a2aba1d4b2ca41408958695aaf5069a2655871e1123362f63d0232d75b65662d6f66c3470d4c21af7079b0635b03dac0d325c72b014c9537b2efba525684753e9b7a8779c7fc22f884441520afa2c2801f1a5e494a31131b5139c449910690a8590e27c4332a0e5128e8290402b7833798a3389aeea1d5a17e4f12e342ef24ec1bf5e769dffc0db25a37ed5ee4f1589bd03db18e5294ff9c6d2d4954744c0d1fecadfe423290e4e5a5972819c8b0f5d1ffa3f75f6b513dee6e33547a1c2bea7cf733f1e36e5502e1b3039f98e01410226f38ae6e332665106c8faf993165ea729fe5925f03906d1ba0c9537a34f305a3dd339034c8c8701f0fa741b859577712abe7aeaa7674ea8318482d72928f8db9d6f9440b75b541f56846f9b7d6e6351579a811e4f7719bfda60cc549c3f97e998065a0f5cbc9b56190fe75a54804e6ae1b3a0b27eb3230ed2e606c4a5b2d30fe1f25f10c592a4cbf04261a342b536b938fadc46594e75818c2593050e0280f8f933fbc07a19dfb7d97f22493454de7b6941928235875d44214ad712387fe50e7d8e31894f0158f9152510e58a958f3a5bfe03be4e2373d7972879add63554745ad5c2edaf6b428e8865e4ae26ea73d406a43c253a50515b036cb8b2aff204fe2818545c65a54b00091d722b74fa7fa64d69a60a36994e300fe1fc391ef7838e5e1333e785c2e76c75a8c00c6764716a618fef763c5b2b82d38408a81ea5876d0db836bb1a19504a50ae8708e1e62e76d9969b853b6c3f72c287b131e21901ed854141ae5cbf904449a2fc643b9afde0f393925d2f8e33f2bef2823b203134aecba09673af0e0437878bc1e098dae8ea99ef4494b9f3a725162fa2676f4c1b6fe7e760e087a4f21e7182fe7318e081b95c9e5ee42aa6ffb86c34ea1f6214cd42de31904ed560cb8e30457f900056b9546c9c402baeda351598b15e383ec3ae5cc6caf188c7c662d57398d2055304b3b2ee13915c4bd29eff8117c989ae57ad138f901d552462065caf099450748409611f9f43e6b0879ed8daa54049b671a442e5477ec0459006c7197a3924441716f4a589729b703d291f9d11503756404f28715f2d2a53d1cb11d507a12c229fd4bda019ec58348d8074cf231d39836eeafe91d52dff3293bf6c1a6e32d1fec99b7a3e64a62257a8ac83781277ca0ca22a0c775e27e84204dec7e83b275b35136902487ecec8aa6313cab81188d37184fa61281338f591eaad72f8300c7062e06473e846ecb156cf8dbd7d948ecaf0267072b54ab9ac9afee610ee41f6cf8646940e7594d292f26a2ba3930cb850ab32b4a964535e7700b471dc6453acee3f7c299b00b1c69416f0f1378d36985da0cd355774e022333128d2857c0a55f433686e60df862058fab499281b591020e4ce1f60ec3fa8fbbc6fdbddf8f2ad8bf84a003745ba32dc20aab5dfa003d6fd5194a5d3ab41f0644264465861ea6ea96fa0150eff6160c58a0ff2913ebc451f58f16b22535b953824f37b82fc6165202748bacee79c0a5ef4f1a47f58714081cdfec704b29bddf85b9d2f8dd9e6fd0367f6bd1300ee1909149548d0ef424a38ee0bf0902baa4dc88ca2046863b6334e6487e36cc07db595f1df4c2373e3a349a4b9d509cec441d0671caa2ea147e0c2009168e1b4a1e3d41cea8053f6710715bf816517c203b72d41d590348bd29290cf72b9db278abe26648176d38814da5baea3b1fbd95b042679cd4e46265b23e6d3c468e9747c10939ad5cb1025e73405b36c08f3bfdde8beb75a9896d84aca2301a9c83a689a0daddec8b0f865bdf60184ce80ba243915b6b29f5a1519ce185b90f80888e830ab8d62b37a5c742f9a1f81b1938673405688e8b54fb64f509f407351208c62e446856765bb504839dff11123cc2b485adc52165cb256e544f3645c5c43a850d2a1422bfe66412d10be43487fdbadd260fa65e4c128253125c23c215d8a4de084730534287d524ef888a5776f11cd0d2cf1add123a9b0383ca9b129b0748df44d67beb4454257115d5dfddfb61160617f7d06efdfcc7d567d530ec900ee5d2b8de3976c6e32ee9982ce6764c1a5b241b2a2384ccdab2d28960a1d1864539b761e8c088ed602d6d2e7b78470e7cab90b478af85e03c81283cc118d76d71f211f0f2adaafddf6ac74a81bdae08a694bf953b98b1f9c7fa9f862247221a09ddafb0032d3758a595ab28605d5ccd8eb983428997c3acb79b18918216046fcd334e63cdbef97043c7173aee883a54d7333d7d883d116aa4a12f4398dc4a2a833aeded90c184e12fca9a1f2dca1afece129cba42d8a7be78ef633039cb407088f22b115da5fc93d32a80437c3bcacd11b7ed7fb7a1834545b31fd61cf310eeee39f23ac002e86a52ba00f7c5704324ec31f514ce98cb5d388cc083e267b2cabb4dbed78b00ae22bcbc752127e7c8c2a7e9d4f10b5ff989eb6b1c0affb1ced956c57ce8e6be5307fae23f78219bc77093bde929159d007f4920738883da9944e072d24ff5e809e4b1d0e9c80b911318a478743969a72bf871a15fe5e1caeb75259f7db9a4f42004f27930953c42cf198fbf65b35196824529035f16c0ce9f2444b7a20eced0434cba5aa81f4cc0946b76d161b3a721c132a0f073779b6176b1fda4150582eb9246b079d66ff2edbf70336ab5ed975c4759b61698e51e523e6e0452bba1f6544b222c8e2a7912d358e4c5fdfad7eddd39fc3e4daddfe0dfead55193daa28d4ba0c38533154fb68924587dd1491455bb7ecf69a6d1259a50d841bf7c746d10b611c2aca1e628fb996446ca812c932c00cb2c3c66a91e7f4001ddd8cff15e65e0b5101e053b5bfdc4c400b4bdfdc9c9428131d5aa5581dc3c57a64467d5c833c229794e98095cd0d85975eb8fcf886e15b0c641ad23b1f8e096e0a2aaf6d49c22d4f878be6b12aa59c87a33d55a3b32777a5aced4ffe4743c41bd7594cd048585cefc9aceee9038ec8195fae46c328f7aaf2b1e3e041f04c04159109f1f4e4d87858e55241801c4cd3bd489d11e0e8963268d6339d61da6cd92e9b8ffb4a89e6909b3fe750d57baa71d35095b38e0ac9bc2fa26ae5c651d5a137244f40996223ab37d135ef16c0ddb6e08f38bf50c698bdd5da1a33b213a28604392c94474a4ee852104fca734447d78be73144c9850a3be2c5a52da0b3a9a6dec0c310030fe292c56113249407d5fb79ae1460ebe1a596c97942243b2c3caac41b3f36e1b0250100a9b7a221d67d60ab66a2dba9337766c12238dcf0d0e1a201af45b861b113e1db85817f3e575d8447ea129b0d50dd7fa18a389a2e11f9eb8b09d82326665f6fb8ea111b095f7758380ff928877cd084b3b25209fb0049715b611d92fc85f7840e30294353e8ae3e085d329d764475a2fd8fef90717647bdba19525ad2e05b38d49fffa7832ef712afb2870414207f3e2a407e5f8cb76f262f27f5fe0e48ade78ef82721ed563f196723826c1c6b0d15ad87dbab8763fff0306b1dcf0ffdc30eddce940581ea88e773c3cd3e3c6452ff6b62002f9ad3986830e8bcaac8311de6176bbc0faeaae1050f0c2fffbf9fa8df8b1cc20e0b1feb1f8945ecec8d3f6ec94bf44b00bf81d9838c94d1f37b050ee4cd0c6a9c8a8f16b1f955b6b2bf0a5f6c1827b2bbf061c7c185e13e81db3a9d560abc1fbb747d2ad4e5c03700b1d87e564b97b0ea4326dd767cdfaf521946fba552aa547d6a747b99112a2e1bc378f6fb5695e65ccb8cab4a6b2319237fafb134d4a8238bfb32609b66b7c3c737f6b0951604403d46a3b93a186299998a6403507c2f261fce70ded815993a2a8c7246e060aec451246b1ffb680e0f167d0bd32d55f17e26e2c0f6ecab67d49cc84c7f05e09a97a6c24ffeec0d885924412cff49a40284bb78720cab33d2fbaa96bb0e27a5d9cfaa71732b4c4165d428d3e07ef208dd4a4d3e3abb4044b15eb01f468df592eddb3aab3ec012be5c6d9f0021f5dd52ddd043951db7c3ae84f4ca60f66b3b7c3bad266b62e96818916f406975715c2537e4681ff5adcf8b9341bedb16c1fac6ad7eff470548cc1f119482cce6aa4e7ee325961e1194156a1129c84d4f1edb46041d7ae7405a026b1f5a23cbe7c3e06906e130e00e54a77448447ca69658acef6bf0b0089c0054ffc0a45af61332d460708ba3c8712f7619f65ae8c9fdb335a3c31377e8870c6450489048c6e8a4841fc1b9f9646a158603c7edd8614f6d3a68ac930fd46e6712154924a406da37b7900e7bd9998809f51a8db437c5d3db15ac7dba09feba9ec47ae54b4e1f49f4db16e3f400f9cc441cb960dfa9500e10cdd9f5854e0330613d3c0b6f7a04f2b118c4383d7b7d3252f0194e9fa1b511123ac82137bd9370ca9cb1e1f42da8037d581f2f66f79f171721f8d1ef1d794c2d63f817059ed3e7d227a0e1f7feba37e45ec5e00694855b9306df40c7f3df2a4efaeb659ea3f39cd4fc164400eb3ead656d9167b175bb50c2606a892c5cbb21f384fcd2c0afb500a288198c8ddb51a9c0759f2109d5510106addb91ee1ddd446dbbd384a203f940c0e6e60b453794dec3bf1a62e11e3bfbdcd6a908664e4cdc512340e2da670dc610d63d289857d8bcc92aa19e6db0fcbc3ca8c6845459f0463da815545a9322ce518d469f4dc309738643187bb23021b37b263237f870adbe3450314660471b86bd925b5f39c1f468edbee27ca700e5b67ee21553f39561c263a9d2b47f21ad343f104295c4efd9f02808832b17afa1942198ce9cf6ca9566990f9b7f0c2764314d10c8e5bc0a16f607028f8660a39f9290718761c3e027e50fa177c7792a402be7ad0346bfe0b127d15f53267597faaa3e5390b64944e984db636ae22edfa6831bc46942fe3851823318dc7e5031da8f44528e108001aa509f915adef443f3ed05f46da90bf00f91583f373884661aab66ce17aa991c33354329a566aee63830d242d5e28f73b6356a5706a7d499a4fd7bad86d916d899fbcfe610acad8c8ef70a2e9e5cee0d03e5986b191ba8c8b3a15cbb432c90e525c06eaa0927ed15dfb8ddbdd9d7afd561f486192ed370c6e9b9567b5d18dc3051163604e07dedabbd92d5cbb1322a0635adeca565394f44e0e391d90b174b18615a7672741865a532ae4745f9a51e29413b09fb67e781601496f5c4d1a400245027fbbf918d5f87b80006da7c82242898a167812c7a80c8e1fee387e16ead2187250b3a1d354db7c23a81ef176a70685b6511369567ca4e442795368e066443eb9b68b986643c46029a002f6b984a26bcd3af5d88f61919db2cb2989e04ab03435c402cffee29d4ae5f0a43dfd9f10e0b44ad377ce809d9f2e8139973a62944d74ec44b0c03b297108728c9bb356f8aac48637ba4e7b19812955eaba46bf8bc3846fb98828573f546f1824f9dce53955ca1f762aba87e7cb38270e502302524901dbea65f4d60365b083665607d04ab40953c292458e281b848712b1f9e6dffb7a6c3b1c9c1e1e1c97c111c933b1db042be44f6f84a2fce2b3c902eee251c0c6656c24dcd242f97d245934c217bf4621e1c48c51cc897ad610e1426749f0dd70e642c0fa48c459a076aa1070a1acddaf270256ce532a26bb14cdc97b26593e19a8851e386e6c6d8b9c0608c1b899256ec8e01e9b905a7a6b8f51b0abd12a01e313bd2af0f89d1aa4e74c61d2fe403622c9d4381660c7052a97174da538d6f50b420f816b28129012f69b556060de37bc64bfe4a57567e392f291d6c31c3d113e9ff9a589a195a35fef27805a7c77ec85ef1b057869e9a8c987de7426dfa44d16c0470e14f664440d754e58af859ad538fc74697f21289100dab5b7aaeb77c1411952acce30986767ef6231aa7bbd85926f03d94242e7661ddeb4be525d80f3f4894a77c0c5777d1486dff2ed786770c3beb49f593ed7c772a6fb4f62de27060a8abecc1146a3b73b570409401800a9988974f0f3c0b8e645589f9f60642016f3517e5cb8f4aa17ef381ff9809d87b05f09eca7fe83ae5757466409bcef33198d010088de2d47b738404a31e22b814d3aaa0ea100f7711ad04542722b8176f8d2075118453f12d055043234ae0827d81cd685d55b383c7b2e2b426480d84e05a640b01ab4700ae225b29487dc47053ac5501d5421cce225ad0821235286d145df658ac617de2b642b7012563a7b07c934e6ade38f0b4e3d960291602ed079aa1a00e251579b758f32c7e85f06916b96e2311ead7e91f89109972453539795b82131d45359c9b1595c126761ffa3a3853b45840cd0a663f057c819bd193e774fb03bcd7daa971035816108a98ac3985813f6c50fe97cadbbdaaf032fa55f578ab0b4eccf9daad93c6f45d582148950761850f24886995703f8a85c925482bdea4201402f196ed9f4f6e3e6aa8fcf800f57ca34d44185de6fcf8e5966baf908da261c3a9dde0b98522f20fa6dc8fc14bf787328f1f955c60770ea81cbdc1d59f00730634df4f88bfc0475facd54feb2eb8bf4231374eda6aec8180945d916b1b0d5fe6f39d8229201cb85616c9a89bec0fb084c7aabe1c14ac4eaddcf38abdad47cd052f4772d96e62517d273a93e414364e8a643c26ad1cd84dc9a7036d4109e1eac4e6b113f8919b5bc0ff306b87b664df64d791b51ffd869f68af77b98f85154e510f7964f259a62720216bd4935e1f1430244432b2274b13774adf4737eaabd89f82212c042c2b950f422f59de48a2bbb275d2e19fac1c5cfb5eb2278453d6e8683b3a50145974117bb3f1cd5106e14d4434f8a6fe43b5de3f352337d149e1c33faddf6f3fcf40435c5efabdfadfa358eac5dbfc4c708039128dc61b9136523d45982f93ea6c0318085d814db33daf7dd37723d22e1198eb7e22527663063975dbc936beb6354bcb71d969e3b7737c4e0ff3e8298b68c4289253657740d647ed5977a04b9bc21561e988e65ec7d25cb3e2c834a56af7580b858ee68e25a9e36c3170d19608cff885f273311abd4c04e98477229706e4128d93cea4385d34e2dc1993fea2f7000762a5801a18cc328cc4decfa76ec138671fa23c8e8a376465d0b251c4ff3145e3166a06be5263a39b47378d44f4deaf805625a26559100fa68b2e117503818a197fd17321be5a187ff2ee6d689d7536bf30944da601df1cba789accd6e24f1077b39147f30885c6186a00bc1bf308b446c7d7dcbb00308bef3107cdda8001f1c0d5276b5530eca4c708ece679dfcc92103dd5b5c2f26cc46c4247fbc7730908768cbb29b971fda424869636eef5a557d05430bcbad92be031029268287b916654185f26548e689cfd2b009bed5bc8afd08b6d294948ac720c56b6298b35178871e93ca44b0e8acd8ca0b665b87e7821d1fc8e758b131781f6503a3b3d4b079692d15c305010924e4b16d96bcae2f1c85a7e4c4e22463c595a7865859d3c0604e03718dd1d4a00a30eab987e683c6ef0310cff2390db3b464ae3277b4dc9685f63f79cc2465e4f7b75e26c4a3f0e13d2b978bb7f153c0a64f3b298c2aafd5aab61b9359165fbae698170d9f3925e813cb124792f8823a3149ea735c90bc6016207dc50861a3c853660d81563f2d2719382aadb6fae75fd5a4401a13cac9dfae0fe431549984b246bfcfa0697c4c7b502bc306cb043810479fc21abc44edf9ec246efdfe9f538a2ea4db3997582a27c6bac9ca60d4d2c623dc48aa1289965375936b2074dd9c046661748e4fae3af9b3aa24c244cc1e688f083a8582b404e474f44f983ee17a06d402be8bfe326ace8bae1f5e909b69472d21c807facdec9098ad1e8dc5376283f9ae364513896f8ad6c59626cdcf93be79b27c08062e8b42c850dd2a1a1a6b1ae6b06db570ee48460da102b3e96f414b701fa4232c44cedcc8e64ad6518f7d84819ea7db4e130fbe79622cd7acd0e12ea11167e61a6641d595a84995f7705ace1ec1460b4c3357d0d16b51dbe5b2b34842154ce5687010715d82e2e212bf115d1943d86d0e46d20bd26ca7ecad64bdd5277955c656393435eb2559428a29dfefbc17bdc78068eb62f14d18dd20ee89fd8794e59eba03bc5437ad2a62434492eebf200193c65be6b1c873102405d19650317253698bc3ca1d8953d38d70103fca9b83a7ad42c7c938c6c79a34240d68817d95a6a62153a65b953a04ef16b79d38b7cc061db2db8bf5911d8f33beeed16f53a8d2d35e1d2ac8c45635e7e8bd64e2a235707b26b85271de34b236e209d500c0844741785bcb46e237a327a24bfab72efe11baf16e607b7459f76df8ce4e31cfbada532b771cd880a428d763d3499d5c92cf125da9c4e3523aaef25b48d632c44d0945b863847aca424c7ebb0de4dc21644e89cf6a5aa4e6e07a9c4c4d37ed53a951d00801b02878797379cbf32560b0326b9fcdae9385e5063275e04a3605f58588249d143758f685ba900076f842f19269e224f9ad70c523b954cb14e5d6eb329d17e6ca8f554abb6c3189efabadeb877e6307349a91766321dcd603c44dc2ccfca34a7a7bc56c096e5677c40150382061af9af049c10cd44003d96953f981b50eb2801684c4a76d3edd54391ce8f10669c60b09ab48f200aeca49510443e2e53505e070a22babb2668096714a701abec0e7a258f65ac5805ec8dbb868909d1db19eb11228017ce58068480081a7ccdfff4bc4af38cf4e1d18abf9ef73af05111d651b05eaba935d4c3aaa784b6e1a4ea08445aed2cb64126d76a193b58ae2ce8f8b6aecca14030d99fc2de67a34d56d29415f3320c5cb794b2c7e2916d1310dad6c56453c9b5f91f3ea21ef993c4140f45112842b8a07db042d57df316f4050e430540b20223e29928d3dc8d032e7522a80faa3a4fd83e75c6019c43357966945b061d27fdc1d46a30e41e08476d913a03053e378345e8926df09ab73ff4ced1e3044c413e7455d269ded921dfc17749a33380e09a5a7c23d561085ae01ea34bf31531dba3c993b5a300217b026995c25181a5f7af96b0bac1f96240bc90fc20e9f527de7c7076a361cc699d39548621fe34130dc30ce249d7e8326c87acc57d49234ac83082117368d02117728fe1ae7936d1a0b6aa26bad2d2359a58d66f58f23cb78ac824e1d07dd2403c400a47699d84cf08ce1af7c1bcb308a0614276f295574aeec44e7252c5d06818ad78ba786626c7f59f2470fa3490e953ae0e51611274f285f54b0f053d8dc08de6fd78963fd49c0340bc6193c357e279a1bda6d1d0e588b3c3f13fcabdb9128870faca7526a3c29b12ec7b1e0bef9c77d53ca7c94d5add629a693847d6ffad842d8aaab36e7aec981b079028034be7edca5403b3796bf3b405b94a472089cf3f0225f863770386f30c70ae155e61de6969eab948477548ca81f24733b9059e1aec7ff1be1d637accfe4d22730d70615074b3d9d3bfb86e30e82aea120de6c34e1a20fbbff18899fc5a1d59562c6025666e233467695e0f97fc64832bb0913fa3108a048efd541640a99adaa4a5e9f408a44eb9666307a91788f465728963fbd98c3a6d4877ccdd6b7069a9b70c3fe35e1334367bbfb5954141f8a9a766c3cdd1879bea1ce86a56828809c7eeaa1ab362457a39afd64c49c58655fd3fd0b309f65bd5dc6a4683d05ba87d52fbc52987ee5aedf0516c03ae2b2b801e5b7122ee04e1f230f51c4bca52d4428b272223b06106f97cdc06a86f95b6e25b901398b3c5e87a62c510760ca65f86c36b1a100165578ff863e6d17ab8de9179fb88523b91540ab8ca713385bcfbe52b50cf4c349d619536561a6752b9adee08c7658d34199b5648b8cdede589bdb9ca9386956b13a937453b31db3d3147c9c3857dad39382e51be8b6084c73c2233610aedd396139d1a92c93ad7174b88df509905a480aef6eac76dde5950df73b2425cbc1f28bd266404a409f6983384de68c454222a309b47c9c747c7825a3481548e9a7d75b4640bc6f238154d4d3867b8cb8fc41f19a584590a9fa604c666fc225971c098a05075f1347a4a5ba611f2b8188f8522c17e04092b4e206f673a61dab4301c5f5a8237fdeb7771216574cdac5b55ee9f381ec4dc9ce8e9c7edd5e583cc9c51f46a56130f1db0418e2957c36520050b5ba5eecd0049471c72831da06522e3255cfafb1d900e462aede2e38d4b712f9757079f4b5fa8f8e1b4dd454fd2081c29fdd222ce487355779221a97be26a5aedee6a40ca7c478a89e4c7b6193999ce3810ac823c01a88358598b230308033a8bd36693f46f1f325b98bb0ffd9c5c8a075d27c6861c6efd7c0c50cd69da7d2d1a3205e80f82d8c437ef30915e262149eb23fb489f58f1dcec67df077cea152b1e17fa4e9bbf30445960525dfb9cb9dfb6fb55a7ed34eeff53db2a3b23e16417d91f3a6d47708a8641172a686c75b0f67068e4b85bbd176587ccc75fd1c30c77281df1bfeab54362b56621382224f30f7c547718695c7bc88400fcd3fd6f7a9c4087de11ff2b7d6c24754c87e67f62f8404881d04404090eedc63c02684863633c7b01b4ffa3a46e1d8ba4b5c962d7aabdca6c10b1140116a14262d60205e748a458297de01ffdd7b58bf617316c3f0342fd97d20da06d12d949dd1e491a0f5f03d25bdc06a4832d62315cba3938c365203f8b04dc59ee4606a505d49545823785b28005cb9e171c1a90760568482188f664ce7b4c3dfb3ec3d96d6a5bde4dc19e9daa583e8560a0ea9e33c175cba5fd341c4e4c8b4dddc14f90c9ace39794123468b2fc41bd5faab53294647408fe2c44f255f432ec9d9f1e16f6ced2c45554bba6d986923841cd37703a336f4d3aaa7afaf1c44e568f4438df2e6e32ec0f959a93101a5503228716ecd44e2a0ec74ab014805b0a2c0f4ad3dc2dab36d9215288c8d76fdbd91e099a4a0c6711c2d922f806d5004c211cd19f49fec838a40130f44130efa181b76b7177863d9d186780acfe741bfa4e284df9d4c1530a5fee025ac1383f0d66fb7a803e9e2fa27bf44c4357dab40493fcfe4b0defb4c38fa87948302754f7c6464c58805c2b709804d4e961cab0ea10231b8017c98cec7bb08d0f91afdbe94cdbe020bc7a347e252a57893684576ace2ff24910f181694904406a4768811d01dadfa5fdd6d12caa913cf7bfa3cea7dbf5f69452bc6610fd4d920b1528ea40f029a0953c63f7d3d4c4018e27bb943576e71b666454a5fcc64fd41257989146629b66ce5432c50dea55442bd19f2e70f093144ee10897894dbf2cc0f699bdbfa6a30f289fc66307c0c1407b9e6e70b88ae425fef7c67e38b269972da72b5a691b77f567ee0cdcc9e87ad6e70a29a91081429b349865a3c0907a89709d211dd2a130da3b3de3a298ad1d778da6c04a07e35b9fa8f126d9223d3cd404d89d0aa5a110a21abd31879b8a9dcdecdfa70bfd496347fb1534942d44e7ea67c02e8f2d989f571b215a5e1bdd2f8f41e4fc169c7950335106fdc10674e369e2176a02ec695af1bd4e0bf0082f3e25319e5b10bf4ab40af94e91a83918f663e2c8f109f10ecf35eef478dfa0c00002fa2b3b1d60cef0aa40664d3e91ed9eca27cf57fbfa9b3b5cf1f92161d21f134a740adf01f6fd543acd9bad151a1ce21d596226c1ea0e98cc1e8e64cd1ca99478b6f1eb19fe4e50086937f8a9ebc039d2f4660fb2230454c7312f593b14436e853c8c5cdce2f60a64f3697716fde5ea1e8283fc2d3e2ae3bc1c1977fe5e042cbeb842e0f33032f188f2bc934801776a1ac5169ec644061d206104025e0ee8cc1b6dc1c23212411065b3df2f8e4bee234346b588e66fec9228bb204f0caf5279284e460046b5b80c5be35d080182135918641c2a5184f3124d80778467ca8790ad37b342186e6fa5926d2fc70176cb3c7eac8b00dbb2255fd0100b8d235718ba0bec68986945053a9ce01224602fbb646ae63b93e0895c8a7f49379e64fe9e2784e5f0f51e79e42cb0f2c26243b71ec398044d28edefe573f5fbf40d872b81e4a76c2218b962ac6eb7e6b4605693edb70518b2177a2f4d72a6b406ff1f8a675e99d8ad9d997c5bc5ad260d99e179e2dcdafe66fc9da2a92fe2696d5d8bd89460fc0d035e31c071267edb04bf1751aa76e8f2590e9f2fdb10d63bc09d570bfbae8e4ca1a44f1e916fd2b1f35130bd743e9e4ef8abc1811bd59226749c3eb50ccf26a6b6e2c37f723d8dd7546e799acaac86943d833b5e5149718725bc708fc278da6c1ff8aea901c7e7424e1004efa9672cd57fd786b5633c78cfd97ce9bb015ea78e09f8bdc8b5321af4ea3b24cf40b32b0b10d901e14b972a8aedcda67317c942ce488d7fcda52b19470d0a6d52da3281a4726c033df24b07cae1fb92d2829202b55afad20366de576edd71e91b64ba81eaa8ae85c174d1a60a26f9f0533599b5a4a1b536c51698340bb0c1f5e7cdde47999abe4a016eb3bf050ddfdaec9b486cc682f50eceb009925d12943a09dab054421d465d64993713113252240e330ce5f4e75165db448418cbca5e42aad731dade04c7710604e8ca2d84080cefd36762a78820d29ea25f4412e0741f608fe922fe41614f5d4a111ec8511c684822b43a466afd8a5dacba9843f2fc927e5de5d2a0d98d490714af69604c3a55119ded798b26990fc05dcab133ea53e877e96219cb0bd467c42bc8c712984643599d9b87a9cc09aef331fff850a6db50f643f5df59d5b50042fe44c8f1318b0b2b39e11a6640f9ed9316c161338dad3a108482f7ad58f618baa0bcf9583c8ff6b239f43a0aae1e840fd65cef71ca236a5420d1c0c903a93a436260ac9523e550804c933fdaef16511f9d47e3e946623ea6bc05689deafafd974d4e1d27902715e331eae28efbd504e16a8fda710d6b090a420961e5a6265909849c267997dd8b8df5f4ee8a46f2f876ee4a6c71ca330a52d59dd642d544a5179f1bf23f2235a1fdcc9110f020618c52af7c4efb843b3a7238d383306ac152ce41e336da5f04b6e8fddbea438f387ef5486c14adf4704afd9d581e284d8e5409ea3c83f8c57928731f319506e90ec085f19b757f47bb0c1fa9a8de72f613a4d87c55a176462386a9254e4120c196ad20695feaa6c296985a2fe74c4d96132b7e8f0ba232a84eee13a210b75645a5f1add3d5d884c398183e5a3072231f4e99e7a59f960cad3d84a15d10814b69206ed5cdaafb61d4e588c0f9c886c3a61d3142d443909d7ec08ba622dcf3795a90b23d8c70219e298563d11e0101adacebeba175085bcddc5a2d8ce45558d97857730cc20a60feb125be34e425a0bdddfc0605bd10d5822126c4a7faa01a69c00e886c98f2de681513a2b53cd85ad410752620dce8d0a590330adffe596c2858e14e4118abf7a7b016b09bf468dc1093a37619b54d91461175181106d6965bb34499585eee4f942abdf94d649ea745ed651a48abb2a99f00ac8409facb7d4a24f6671e05c6141087f3bbca5ec97c2f8235c9d549132b46bee39b236b5b2185ad36a1ab9f9d06116a18ba1562b15de8d02984b8c0d3c32532b078e724d807372312f94400681932982d152726061b636e650ee420b92bd8bcdfe11a4088257b6a5d667810c9624e07a772dea29fd2f402aa8c7f337bd1ad63b809f5e0730fa59a716c2670385f1c040fff90c66bfd10f245a92e8be6b7ca995519ff5f5e4d50b1901a08b03c1350b51d804d8635df4cd77e395120890a026806a6a149153e60b4943e1c17754689dcad58771902605879d7ef1f7c617b37ed4ddd13144ae5c5d068d616f2eccdda4d25c649712c92e59ae45eb86109542255e1e81deaed1521785c1fc942c3ef80cf9e19237cb8d8d1f65fb9541f7034a33709bb4b487a89638bc6c5adf1e9a1192c9027cd2b56a5959b4720f3c09cbc7dbef5a36d72fde09505c56dbbc35e5d3f10633ad8d150a0e36399c7f56099604dfbadaffa1e258e34f00bde7005542d67c0a786e717a758f67c471ffc8602c12f92b9c2a4d7115e4201e9ed72bb2cf00df23f054e7c68ddbbf536d11a31889b3218daff5d143aff41909396dbc4498d3b385f0517eb65de3900500450c1226cfa08135b39736f9c3388d62f07ec391c921b173fd3a65016083a792d47ef0c29e978304ff1c39e429a60370491b3bbca939e672ad6998b49f96b457acdac96af2c66fc836fb4bc0aead8707142e6596eba054c188b5c67c36c9d316b050300e86cc13a5f4082eae556798c67bcbd9194e3fb0b2e2e0cf2a5d4bf662e00cc80cb16332f107f833cfd54e1e014651436e92451ed02a87533ab347b29dcab6e53971f126a838a51a955e0498ddc6f23e84252af369033f66b9dacc87cdd4f4d45b56ef2b4b87493b8b32d9a8021e7461025d38aebebded19b6f5947434b38500876038c180c194c07166b1a63c4e5156d054372543013d51eca2e93334644a305e1032cbcb592eb551f40f7a108d0ea2270bbcb2632f6134b6331b6d49e4b2b58a7032b8eb28db203e651e4f79a23165521d53cd8b90894722f654e32f41abf0838a4aea8c1b5eb52aed65ba81cc104a4ad59a90679489857d2c7ad32fb57156af322265a8c3d0ca14bddcbd065f0714a679d6820c3df8f93f08eaa0623c9a3b636a0c88f2a2de21206e00842a738897bb4185e2d441b5df38e6582d88237ac0a198484065791787790e5dc1991562920c2da88bc3b2224e1aee2f1039247a466496386978dcbc6d29a854464f1421cba138b887616893927597920727ddf61cc38be86b108a408a68dee3df68335c80f13d852a059e6e05218a73a53414939a32bd4ae4788437080f813c29fbd90fa2ffa0178570fb5332866ac95bf7a170d3b0fae5363585bcecbf195c03473f08a51320b1d34157b193fa8adeb77d271e47c1dcc2e6b3bb2b23c2ddc360b46a068ebb3c5e7923e7ca34620e2529754d774e010517693f729a4902e0adbf4940778d43bd9a64a3ceda2b58bd52fe1c2c15d694ba66e64052120fb41807fe11b437fd54b1527ba843b7c75acc05fa51de39285429a70ee6e0e6cff1fc2a1ff6b3a81c3628347298c0e3c0a690173c94180821e770d061d157efc0278ef40be434389fb16e453a5c29077febc9268d7287c6fe631603aa4e0f045942d851b7ef9c1afee2c4463fa8902f6eb32e02146b1fc0fb06f15e58706a4ceff81e6213e1df3c2d5ac2ac9bd7074d4c35bd8c3a80ff78bc28233e7488684b8e0cb422b5973a3fc8260f4a9a6d411b7cd4ae20e9c831e748fe225e140710539599b69bfa2eaeea9d726ef395cb8932451f1d26031d5575a30f5dd28f0249b3da017870551a15b541bcd02b419919d7b2c17b7962eeba55c829fac3bc29f9394839981288acb35dd07d13d0c78b21241852cd82c4e28e720c012fe7e68aeb41cb23b19fcbcda6674960fd4e82ed2df73c0e824389ac89df99d4dd52ea8175e8be6db21b726e4f61a733781d0e65ca6234e2e310d9ae5dd73f30328496128451acaee1fc246cbf6d78a6f9e3a0ef8baedabc4ad15b518314e1478604a8c54be97e39d4aafc83ff404a1a27705171105fc85dc59a348722541a0edfa9aa6e7ee0ee171928e6eaf54f223aabb11ba645ca3555a227facb3c1fdbe5b01be48af983df7a584667e980ab268937a59acdaba9224c191c3303098fb6d30e0487faa830f6ffdfe8074e5fa228fdcaa517ea2cf8f7afca5927897ced8038536258258c46333e6086698050374babff6647dc08842686a062726ebb5d7d53543eb59e274050e61eb71ec7366e4fb2604e27f6391b75dcf4dfc2f7f9092040eeb8e403d4dad2275821bb98c29c5b36e8fd3c6bdc3a79b758b5908f00948d5ca0e49074aca105dd13e3d2c1a53acde80cb52a27e032dc8f02d23fd7182c94071ab09ce19b03a6d9d377910d5fd538529d0d0b0ae286fa7c3b584af649f937eaccbda50a4d184b888302f35ca07fe9550388f5ca51be6053ec8bb40648a9929a97b49865ceb202aac07e52ce61a741d3405642ebb7a1020af80d4ae83f8b41e2ee6d9a5ceaae7431a1556c81e0ba17cc10223edcf03e6ede39e0b2d469775f46d839887223e489a5f535077478bb046ad596d91d0c0e0c19ec2523503163a1ef6a1317485b4820f57028aaf8a14dbe057796cae0c9282e1a5b54271c81fd750a1b8ae6551f8d6fca5fe798dcaff9afbf770dfd864a72aa0bc032083aba8a0b1b62026852cf413922fb3c4adfa0d50f181bc1bf9b57716e2bf35af3bb3b9857220d7dd5e07b857c558aaff0c5b19a9c813e5e8317311a35874702c76499db29808752b7010e5c499e9fd6653f48432fe45026fa652526046b91dc01f1df18f81590b16f713155c5493c06db5c11e8031a5fc20bc1e52b86e51b65e085ee9023622696a46b170e7010fb1bbc83104079ef7bbf014df3a345c78f91e79c81a1c9b9c84007e40d56e2a01d113bb2dd454258181ed1b123c5c83f8d27419da5a3e550d765a897de75b702b49174e86979b0454327d2292f22412cb9b04d0d4de21292f9eb22c0177dafbaaba7904cd3ba5f93d45cdcfe720d624489eb384f65fc564bdf8576e687b01e7723895edd07da12510b97033a2fd6b7ade3c87f5c487082af801b836be6487f6c6cd6c306c04d84fbd23009a4006f5911d04e87205303fcca3d45c1aa46b961550ab3decb9c2f874209e0eb53886a5beb0062cc56e71f9f0f8dd78f95dd698064ab2f20bb1ee7afe49d00b9986bc83f36385d4cb4ecf2b3425b9ca221b90d9979da34a4a01fcaee9ac6c247a402baa25ff757cee03c84c11c29b2181b8028403ba47a9ae6cdaaf962525d0a9924d0c8e0ce55a16888e11a4f5e0bca26269c8eb029136181c7a3e2f18768378048c909e3a676525f01548371f67d64f47d5ac300888db9af13a181c279ffe54ad074eeb1cc129431d1f854088404d385cc39e15c392a93f056e44f77c800a50a4564f951513cb59bfe528797f6e82d73fc9c25f1783f2377c12f3664c36982219648c0408b4034b2a135e19b26d49f420e2a0df77dba9c2d979609529b9b76853a8b0a270e938e625bdf8d5fa69312da8e535c4921cd47aa2a910278217d1d472b65107964ef73d580cf060e4d80e044ebe101bc0668a3f905fdb6e9b487baceda5552c5cab5debf2e7856b19d68a246613bf2df84a86fb84a148d706a8f57ce154b3557fb71e60ae51cb5553f6c80ddb195819edfa405866e2e868483d6230d870bc8976e18602e903f218f30386f9e9358552ee400d76d2d1a50c5455ffacc6caa5cc568854ef7d3874c7f05f94c050e1a20e4da7380475fcbbd6d8418536782e341223b7bbd0889f75b590636df3703696d789ba2566410e0c68622593e92283bb1d47b73c43d19578e1867399b00c1eb6dcc2dc33dae42c0f9d3493f3b2e1165b9150bd492304aa1b548da4ab5deae8e197f5641d9c713cbe657c418149d72035efc5a8e099925ab066eef38581c8ba68cd21058d69704284510c0fb37b8007aab6e4c772ed1a6b0f96e0204efe1d347220d1b0fddccef94e74bb00a1e6c1b391e4db615a5068f02c2b6a832310bd49c14167c8aed66630b46014a949d5815e5d540dce286e6d72fb31d9403997d37c03c2881c2042c5bbd044237eaa25c42ff1abcc7276ca56c171489ca039b2fbcb59e948b85a524a6dc6d9d0ad018b7519de144b62045a97215e4695bef8a25f4d64d7d1fa612b4bd45a5721de02e44f750c39bf45a9780541becbcd3d89453c63e0d8512d3c627dc237db4216b939f4d9dd921fcdeb2abe5be5f3baa26c2b98fc6e8be6e5d05a8ac21569127577e3e16264bec92a39566817233cca9cc3d9ad072441c24bc1777508f06d3f557e5226cbbdb4cf95d1673079ebc1e31a237daf528279246751acc416b89db81f2e264c32af12e9eaaa3a0d1002c7fac8671ddd2dc96d5fd6374274a35e0bd3e269e73057733c6e23421cf7a9e964706d22eb8710c6c93a7f17ef4beddcf01fc808703974cb61691727d56b03eb41cc37d6c0d295801ecd9ceaaf04f6f9a43a1eee9c4a43ca50897b4153113398b43df4ff14e161b71050d6409e16e2dd03ec558c3e8761b7323e252c169b40a4cc3d94bce2415af1e2ba1591aec1660ddb2057895f0b61c8c70e7f0158fccb1f189e3f942c3017d2c29212014201c3eeff1d49c240307332af7c758005be23a4e3ad41f0438408d8d125d2d66eec82416d2bd2bdb5941a4ce4038c8f298647749ebb6af9e5ea9ac9d9e6c5ab27f3441d590a0921fd0169f3f0e45263efffd985db60dd0f8c6a8ba35ee9845bb8ac6be1dcc825630bd8d03960ec13270378997adf9b14140a821f3b2176f886fdebeac9c088fed28787dbdc041008f4c5fbb72c07ab90c6204e4a07703b6df98543aa4b7e100de9130ef820b6b3651c8a40bdc990c1d7bbd8842828601cffa7420486db44d88a53e26c0bcb951f915409ad43324e36636142c78ea536fd6762fc8f70a56ea4cc436e97b922c201c27197cb1f7b22594b9864984d23192947848a5a00a57bf699083263af55e79d3e525cccfa50006ce4f491061f28f1a3d3b44f8c3d9979cae80dd58dec87958e2a3804123445014f756dd8a2117b62c604c1e3bc510bd2185b329e45af2b7ddb14bc4ed68478b3d6eafc2ca1d582e2cbb1817a8a08ebfcf60d443759ef4eaa046ea6a2f3b4e7a6eb31182c1b0ae71a4ef2f78d41c547e3ff9f35255e5f944b4864b5a4e8c6235c10149eca130c14a3cc05338e1119b40ebde4f6ef575f1972c60e1387b4b7247e985680ff2dea67e283281d797cb9041815af4568dc6bf2b7aa5dcf3d47c704ce5307258a2323f7b6a6f65037fcf79210f7dbc9d39262349b5a92d69dd18a47bf651605077622283506305f9e6d87748feb85ebf223351561a1cec7c66587012776b29a584fed2a76b6307b76dd53e3f78a42d3c9ff204edc877f0f24160591eeb47a22f4e574822662e899d368a10613ccef732e2f55e420cbe2aadb90ffc375114d9fe75a62ff96d9064bcebc0995d6148bd13be8d2930f8db76d9b3b81f97c884b800e38970a0188019c5c31b4bdd982bb79434361fd14f3d22c5d48903c7ea6ce6011145082b6203bf940d431fa9452fb73cd6aaaa6c356895807b78ecdc6d62e8bf75162f98ad770e4edb1a946c3ca893a132981a20852fba55a4125e7c4cf940c1e6881688e678f4fa45963bb6e1f80288989b9bb0cb5fddc9b97b3a4bd84dafbef6ae9f155cf020e03d166b2c442e3fb855356c506ae691b83ac0b5dfc21782504557e1db2d766a1093f91746c3b9ebde07fc967ea3c5667b201d1806916b70be6f4ae33a2989450a88dd92fb3cf63f5f50ce9f62d11084f653bd0a84ab143ef6549a1a2ec8876dd83b27e199ef5b72ec7ff6e1a539bf4db19f1009fa7a5312c47b84de57fb46ac8df00dc3819c212d1ac03dc1aa7850091e653b06b70d6fc095dbc317addca7aec5fc9b7245b622ccf358a7ad12cd9044ac062fb48f02a9304288c2bbb0abd319e91c32f1d8ea24d49fc7439c938714466ce916e297ab6a07ef3e466b6b8dea556d93302ba49182f419bf2f5a4bafd2e718c3f4d9f674585f0f7e1bc4683afabafe1e66f65aed512aa05a1ef51b9eb8108367795d656419a0c72b46a05712ad8fa75014b8dca255db9d9195ff7bc3143715f098fe06117c2b041de851fa9b1e89db6b491ff7320eecb047ef5d080fb69a1818fbefdda3312c953420c2c596a5b32bf9b6d2d8578517f0f1c5e261662e2d440237afe69df25a34425e1bb1195d2106328bf7dea0abff504f8e4a769c0bdd5710e71493d3b2066541b962c906a5898e35730a7c263bae1b44c8a84e986776ceae307e9935ae2f22f42c7422cfdb08fe1272f21835babbd51bf38aebe9dd9a0874bc68d64d09464fcab2f647200716bf0c6107fc824340eeff11cbff6a774d6428eaeaa10d6f5090f64bac967fa95cef17b6e55272622bdab2f1d3eeee88cf7ccdd1e69970dc9f9299d35671472c67ac353adae1c4d86e661351e8064a58d8ac99a9fb5493e8211fcc3790383ae95a42c56c3f283d48c260210d23bf24eb8f235eb0526221e3e807e1e56b4aff46799d20cc556f3d38c7cfdff4b126f3d49b2474adf6579bdd4858f81e99d8ae41fc564c51accdbb6a7f916c1ccd4eed51d23bd67d1823c074935b8870f272e80256ec0e6c8a07373a9cfe07d109f1f8d0e28b175c882fca0794b70fd0719f8f847f4d7955316f4ef3d56cd8402d7a683d4087aa4214e4d662fdb2222425a7bf7a3c5760d7a8a936562fe6b78034a56b56b1fbc10ce91586cea50aaf5ea4968b191cde0e74d4a57415633a6728e44a42cf3dbea2d045539616e87a6816b443cf4a84cb53edc1a220e3e680c96feddce2c08af65ce0f15d8015a0861d7d7f69728a5da4c9150cd0f0931d8c9302264ba9b848e06c8d1b0253a4982e4fb99c8d975745edbb248633e0f4a235af6fe0c9e022f9f0e18020aed6943fd66f6cc03cd282873b35eadce664dfa4fd5c44cfa4602171ff4f41f99e05f7aed6845d1eb3adef3924d5c55018ec4213aaa925689282b47c09f8dd636726081cde60870f936dad5d1d141bdedbae1b627f1eb0f25d6d10a2385ebee39b5459bd1c058954e8718fdda10a103bd62291b9a76db79918edf1c85a668bf4dc9c7161494aabc1d36fd779ad68ab0385e2ef5227de2bf9365a6685d9c6551d1809a746d8a1b939b297690e9a6853a4b7d686076ac66d49402ee3a5b1698d3e416addbfc75f64d372d968b59103195efc253c8f73c84596eb80b4c2b4b2f72edaa753bc2a243cd01a8c3eb45d18b5e47141eaea90dc26b1d4224abbcd6e551feec7301578ff836652e5a6ccc1714827a549db2626e754dbe23cb9da4223b589f5c87eb441f2b496626f1a7cb4d10b86228cd6c423ca2ef891b41de80075ca1fb531cb005feb31f9aac13d17b3105bbc88fb2ccaec50cc521b35ff8784a50c9eed75189f548497367dd0be175867ffaaa701a3f4306797822556b5be6fb0ca9ba9d7bdb6412cce42df31d563cec022eef671f0318ff35c60c1a597ed3693b649b7ba7b536e52562083581ff7f92de8a4552ba14caf166468aa89dc071b8f31054d2f1f353bf2fcaa44f3dadf325a327a77d3a5c09d5c90da0a49aa063873d2719fdd93ef142217aaa60ff17147217a6fd4ccb39ede9eb6e05c19895fb7dcffba55103988f057e8f84d80abd3063de4070031e9b97e313c1e2b810fcc6cef18f0a461d8e17d34f569c834db1568e82f7e693299edf6cb967ab97801eb7f8327a60b9beb83ad85e2c1da9e81365dc9fb5a864cbe60bad119ad8d28b7343337ad06efdc5bbe0cae8d0b36b7a753506dd692021b10fa57eea6712d5c153e29c2a5b99f3128fd6ce2cdbc385dbb2ee95ef2adaf1ca745a94410e060550a584be6991f9e7df62b47e360c4209f683723be3f4975c571a7517bd281ac86aa9cc6fcadbaaa219d06e04827c48b242555e8d15984eea875bb1a1f7840f70d271a9d421fa207d7a5e3544168fa292f88270699f7851e4b610c63e11ed9cdf53f7827dd707539e6088071ce49b5236ad798d5a22c308316b45c529743fb81fb51431c32557efed4725b3ec84752e61eaf3791ca4f1bdcfcfdd239304e4236d384bc094a28c4b44e116e5b4d8cf4dea11a509afdaf7358f795e6cb0c6eba5a682acea6faf7e417ef71248884763d32ef8aa3ea172068223e1155f4973e55daf0b34e954761cd811ee4561db03887620fe2f954a52b1141b6381c68d1796582f4634e6df7d0c70d14459e0038e6cc7619bed1d28741e2a4c1b285c1619badc5b54c70adfef640bab88eb2713de158cd337533514aa29cdf8850fcce431ac876092366ef946f8154ede16301dc4f9d46d674d8c9c24f746c191b98c759e787ef4db75ce19fc204bf266bf07f3dbbb423a7e3478f124856154e9d103baeb283693a967d603937f1e6a20c08bd813c39f9db040180b793ba395b7b402685090a7d065646f02c1268ac1dced2cf0dd5e402215e81a812612b75ff92b1cc92efa54f06f36296680343474233cc2f34c65fa1c2b116f435842ee27fba9c0108d44bc2beed0fa612907a3e8d5b3f4ad6a4b88e30ce8499c556329fdbde1d6a810165580f279d3f8656d94de2287c6cb5f799e2314f1732b5c859b4dd55a18b826ed26afc720883aef6b6b0bd7e0373996ef1d32042eb60428b5403abfe6536db9a963036d3a751239619b28401d31632c0fe910eb7b655e81a924ce21819927dd090206a010c8a128daef047d8230742b801aaa78209ba22df3c5830806ab7af74508b68db2e910c78b0316d3de01cc6b492bf8306a3f5a4f819bd143062a48cf565efc030183941621ba0a39a9cb08c71def1e3f67b02a344eab71370403171c995609db04ebf43cd35cd89716cc2f4b9ca5c1c127a6f0a9a9b8958b29b8d0337d1bbe03d2a3a4d9769c98e28e8b87422e5ecc15e32f5b428f9dd66c20136c86641234f4c08a67aaa68fcd26303f563dafdaf057c6256fb1a62a1aabc086788a918b9890a9ab521a22ccd970912d8afce04ff7ee335b17b2c2b345ad6c1cde5c37cda12e1ef3ea1649456c360147ad505d7027e62b97987492f53c8706824d4b51154bc377812786fdbc11b7a95fa5187c3801c832cdebdbec1f65e2173f1f2bbd8571ab9d5e107030249854f8a53e4e701bb9391c392147c94dc2e4040db55849b78b073f2f053d2b89b87203dd8686f20e932d97fe972fa6db44b96683320bf69f7453d0272a0163ca34bf1705de68105738296ad26bef5e4621623d7870790e7328cefdadd33e1c36135d59951f55a512bb40e62eadb1cda47859382ac82cd40a058977375e68ed5f00096b40fe69f6f297e97befcbe680e872d1952e3638fa965626652b1b656f575eeb36a3ff5f7dba2a334663f3c5de317a34b2ee49cff8aa6c3d1836cd173e3c616d72e2b0b29b871d94b8b673aeede5589b83e0da78a0b00fab96e29651f4f7a133a6f1650553f3d8a1b9ad81f40fce46d6d33a562cd3dd4ef297ff95b5ad69ed2e9c40029f1e15382d1646be57b18f4c0021e1688d9e30d5b8cd4bff987e70d51879346e3235b2be281f8f2bc3a6344e9e687587975533de2511f82681626336a25e42ca4210d0a060e59d232f6b4e8da0a497754ce51e596382c8a524f6ead3c905e3e0d6dd10108200b601e04404a015e3749e74b64ccbe806bbcdc14b5d2b859604e269eea4d07feac83d5a29ea784c115f0e2ee2b61eb47a068b63cc8de95cbc1edb0eb9f22d76bdcfeadb0643d6e1a0d24ef7438fa4d1b1ce506301f2348d982b955e86374408ea67020b5286bc241cea45027fe71a435f64a49047305a06e8844c7113f8e26cb0e386ea447a960143ef5e5edb49ca7f934ea28ce0c0443725b637b916ebed5e9c46c2f0761b041dcf7adbc9ce0421835bfa812e9192af0b36e717fe43ae69baa30c1f34f1193ee7bc276bbe7d585bedb2e9f37dd939abcf4eee9643ed13e4a765edbc60dff4de16e76462ab34e63a00da88912f3544514c797bdc780b1d2f9161d8ba3ff54e51c253e628a8235a5c8d7c5742af397b4bbec27193d00c3436cf632e13235defcc5319d0a8a47e83cba9bc7dd2cad8e15a3d309416e3b41a22c06f51875a434d01046bc60b9ee149cd2841e2de649319eaad1822e56c7d03c59e1cc1cf9ec6c373f042d998da127d6eea35afedd691cb8b9093dceb2d7a10b2e59cbe75ac50527105eded799410c1d379de7a02ce54d3331824af318329f5ac86b5b4d999181af3de91c5104c9f32424c1c234c7c1e145233c6c1660a524110d19520e5b68d8de208832f91a9e461aa515b7bec1d8a2e63d66fc2b904099326c21430bbd53f314f240e0b111d8d92a5b4c6a2842f18a27a181c283ee6a1b34b117601a35ca6a850960097c9cc3c9ec4685fa072ac84b6a41130fb16ca864bb8f17b418680a783bae23ea6d9ec20ea4a1de122327e757c50134003fab22c4f78e04c5a954abfd6d1dd6f0a107832077cd6a0dae4104b514950d2d73849ab34542557f7493f25a5467ef996728b13d1297630ab53080d12d6c98dd9e4bdaa98f7964caf59015d2b67c51374195e5926c81c603ca2c427b85b61aa1e0976930b12efc07189585f19c85f6ee8700529970f4eb81814e47f742a37675dfe103e1262f08377441460e011ea99de67ffaf62d516d2f4a10c3686bdff6fc39e6410a487fce465c21a5c3c1f7b2419412527b8f49648cfc6684be484d216c0496a29f8c0b934b78e520cff2df982257455506e18f55ac8ec563abd7db6877859023f0d060255a09aae57f4f2418b77c5f5e20f4066c559efb285c8f3e090e2ef8975a9b004463ec3bf05fed955a1bc97df620bc99c185d89d6025a9f494d1f994847d1b2696e0fb289606f525c5163414876a10caec5da4e996b1d3f9522a20728be8e4f33f164bdb0df51df6abde5729952494275e20ea592f44b347f74859aef3ad166fef7d5739ce4410cc399cb754200e42914a45756a062590b552e00b362b9a181381f62d03c58e968dabb909feb9ce2316872a5dcbdd481006b174b83dccc329e70304995ea2412c06054b2170507fa74498986436a1f0672d60b3e3104135aef28c21b70954e634f7a3de0f964b95b17942851c37078660c835b95891baccef909fdac9aef1496fd3b99961a81e51907f8e520efa63f34311db7ec3374583d047333e75bcfd93773e55ad057c12024d2e5dbd2adadcf67c2750d706dbcd21741871988126cb95681881c3d0994e0fe988a1d22e088f1f0933d2839c51947ab325e382035c4da067ea6b0f5675aaea432702dbcf0041659240c15d26c869d90ed46ca367ad4814c7a4aa64d422cc69d637b15e0cab7820670f45f5482dbeb18f29b0860d3c6a9c2b46e4fa494b8cb003fee08ee72e5536ce74b5e708252e25ff60bcb45673f5c66270ab6111d6929c643acad193633b7303673d89ae4cd0947345a388cf8fc22511eac1b7b83945442d32af99d014965866288601ccacc314c6779fc0d74b7ad8e2b2c7e9fbfb63f8d6b461ad34243f3f56e3971637f396ad26a54e352c561582778edf1f2e64cba05db917028e2460a3fb0866fa41419018929834e9896d9ac74db4ffc06fe124d2ba5da3dbc731a1dda98ac3bb994301a4d18cf301a30a3e055797ffd9763ba62250f8756fdd4db706480859676224f64af102e6b750a76c3857b8e26d4a7d479fc68ea4065582ae2a4468a83d113c307f088d0ac9c911e47c6e443d964050249e78c4e948eb57603adca8539f4753057e5e992a9a9e4f78644b9a10504ba9b9fc0defc9186c0a7f9dbbe36287a58daf5ed4945f61bc571988a27a812ac8c744487373c8ecad4306f252560b2c8c3ae60af8e961c61fdd781fdd179aaa25ca3afb073c3a6e5dd710d6ca4b8e3af57a4c10a335cbae5c585052c204b062cf9e40d655cc336346c6c980a841d34dbd0b3bc7b5cd17072411d51f2f9dd23ee2e87c89e1d9d52d2f241b26225200e2e1d7c9567b05194f20ec59dcebd6665b3341b95e0906b92be7801739bffb4b18698c41b70424572875f6a4c04fac708d8b9434b2b3cd41e17abe6e27827d95a0017793d86a045b2682cf083d0284ec21fa7b75504b8981beca7828e25955defd5b2d5544e154bba0f04741b5272076e089119c3b3036438e11ffc76843957e9922874009c601cc004fa6547a857309c55a50399049b561299d3273a6ab2bed46166a795b5ae137a5ca74e3bea4ae6c86fc4e2da24e210c9bd40fcd38265835cebe292847225e90f27621471e4d0d07581c4de1e9207dc8f081149c8de7b6fb9b79432a5142e0a660a7a0aaa1b54aea93c454b7195163dc53b1cbe49be1f1a9c274ff15260520ec3350f07bfc10380ca630e29ee1273f0304ff1325779fb3ff44a3638536cf0935783b3f7c24f3c9447beb894b75f4a49a992b2a42a95a42ca53a4f71d9a57827bd5492527a279d763042702e7da300c001862a25c563bcc1db8c524ebe20b04f7197bec10b4d70126ff0941bb63b714e49713e39f1d9c1a4a4f0967129923b214e1e7debbcf3d9b138cebb0ec6e45a471b9c29bea5e0e8142fa43f3b56659dfce4ccbc5d4af12dc5e3e7d9692ec54b7d36783d1a9c5e83b7a3c1e92fbc1ebc1c0d4e47891e77e2550f9572153006cb8c1b0dcecf658766d305553a0eecad6d53a24a3f914da47497d688a8d1a56f8e742cc3300cbbbe336fc3416da79809b655e12ac368304b3598651975cd436eb341d53214d46089bcb0a63dfb929362946350fab287ad0635c68844249973c6d8524a19e79c73ce39e79c73cee973ce39a7c7e91a11553abbd484aaacbebe1b0cd7caff6194466c964a250cc7d6eaa7ae58ad26d3c6cfe4b24193774ebd13222bc84064051746bf65d9f2163b18e6d88803b6936d63aebbaead396f8f5f669737f598d497fcea8fba6c905e9f0af38e8e793ce962d1cc3311b0408a1d0ff4517c8bde8ff6e85be61233efc73e8a6f1704f628df8ff67d988eb129e745cf38cf9b07ce6b0723c489639a7927df2e76dee5271e7597383b1ca68e993dc68e19b719c56c9366f78e9e79b183e10978c30871691eb906a5a73cd40914355479a902c660e955bf74f6188c71b1a046a9723ab1a2f612a00fdb7af41d1d3e7ea59511dda5b5214a1f5933dbd673fac5022335dbafd9fca2c6f493a7d45650a54f224ca0e8548fec6d37a774e659ee2f4863520211d2ab7d20df06642299b9420e796828b6b04d375da41a59c910182ed21010da5f48b1ef5b2a563ce0fe4f0c1a372e8f9e63e7511f6bff9b714977979d40628c2e0dca6f2fa629a04193c5e2a5a92546af485f8e917e2c0dca18d8f418b145c6ae48570065c01681bf182b43ba36448d1e6357a4535ac3182f3be9d11b68a30da341eaed85f14bf952df0c09fbd2436e4322fbb246c9a9b1a3bb3604d5d64a8207bb5a05b183fe88ca3288e152955b96ec53ee11b0ddddc53ec6693032693036918fd228c9122571a875641de8a3918feb3c0dc6ddaf6be44edf50ba2ae921df381667d7243d8a86e79262d388a4a0a4ad518cee6669509b9114a4414d8b422cd42dab05120f1d61235ec231132662247ca4699cf49a47ae6ebb351771a24ffc9630496ec9711ea35bf608d00c17efa157f235ef61e435a31ed28a6ea2d0ba6969dcc22f5c0bf52aec2170ab571dc56b9cf36f937b1ad43297f94cd52ef39d44e42a8a8b34a805754e95df12268fce9a6f94cb3ccc4b9ec9370ff3ec026a507393c73fbda2f9ec705cfdb14f831993aa690e040b691ed2d9c1ac92d73c86c6e443f9a1fc30c66bde1f0b35a8b9a6b9e69a7bafa86b0eb28d7d0dc66b2aaf71be79cd458efb68839cd642251c98304ae93479a99b255387cd49e79cd3a7738b88ce89618ecdd6b0cc57c3228795bc8d5ac9b536994cceda377daa8a79c5dcf4619eb9cc53afe4759d57ea265aea64bed39c7aa17ccd5da2a769d9d5c1508c318a152d6193fec384470f392805a2c1f6c050eb081749a01f235236101e08022409d78435a22ca554498f7e317fa14ac62f4639e7c430896133723d3a181e0db67758b651ceb339a94f8f3fe6a65e6b8dd3b49854cfcfc79c46926e3373d517ca681eab668c1c136a90cba9c7708fb98fd892a357da296d8a754d4c83ed1ef081862a3dc764892da66fd9480ea1869c1157512918ae02c660aeeb1736e93f3734cf5afcb66000c47151a38a943c69cc68b07b1aec99210d760dd344203c10044883dd3d1aec6ec93f9c13eaaa744cde62649fb2238e6884e887a5d2718936d879e9e40af90111937a8cb26c900f5d5ac6af8ba852673234df98775fbf4ac794a979cc392d6af4cba5c770afd257cc3cac83d97ce34ec52af98fe9eca5e9ecf373cd657e9b3c26bd304828e9474ee6b98f897c269730399b7c7630b4c5f4cde89566e1a6a8fcb11c1523875ddca37e23d04383eb2a1df3a34797303b56c6fa69899d2398e8443990b8500a54891c4c8c9f9096d355d1d96154f1d3315f4883ccde5620cabcfaaa545a3bfaa94ab255a7cbacfae5d4e451bfc1e4d5b7ab83a935f8f96dd1c0c8b3fcb66840f45be44c9ecae44cd4e065aa9ecaf4e1e0a1ffb8a5d9d490eb225ced9613bf1cdc1afb979f78b25722fd4c9e3c79ec709c4299d75c75f2cca9a77daa93900633af9f6c302b817f51af205f9552a72cd4e075a5a650b9f517b78698a8573e30fef2d98c5e4e3729b00d7e0a4337239e5ea5fc5a99fcf28d3375adb57eaa93ffa84efd54c1936b2ef3a6921706f9929faad7b9cc97bc18eebbaf51746a4631e65a2332e395b5b49073a9699a636ef218ee4b294ca569ae759ee69d739c6fd79c53729c6fdbd679ec60ba4fc56ddb17725f967559e61cc799e037ead946b5cc359f5ee6dadce6f42dfbe6a4737a966dd433dfbce99a472976451e23a68dd2a13aa74b0f6583a16aaae6fc8434b8acad63527f713d576895c2241197afeaf2702f9f3f1dbb36e9e5af77d794ed421a8c556c97cfd60b92fc36f96d1901f492cb5a55727e796108f8392d6ae7999f3c86fb8a9d54dda7637ee7ddc735b8283a152b957c931d4c87615de7b2c1ce65af4ade87aa92731e937aceb983e13e55e9d3319f73ee9b79ccb12f8cc13af66d907bce31a75e28b36da60dc334ce316f73cedb92b00ed8866d52601db0ed0b85fc866998b7196d9dc67998739ea62df6bd4cc79750123544bd44c5e8f266db92a821aa5dee8653db4d6b451a8c7e3b1e4c4feb0d74788eb57de9c658639fbb38014e50adb1a5777aa5bd7b24cf772aee6e8c73c63867fd6e1c1c9f22bd6a1cd938aae87b8483b97469104b71b4711aa779e29c737231c618656c2cae9742a2ce187737fa15576e6c1e9cb071e227793a2df8ecf039f2db92c1112dbaa02d7d064c7e5b3338da24fcb68ef0c1334fafae1e9f5e611e8fb4d0ee762823777783349224be8f73d3b94b7398bbb63ec3a7c1187d9d797aa5e4d154fa54dd17d46050a452caa640a8a89faa8355d2dbc8e5a9a47b2af90515f92914f483ea0c149d8b449f36a821f328a97cd345ab24ac1c2497b746c839f2dbb15839475a38ad97de2b99cf2962e50ced47809533c4ca1962e51c91d7c5ca61e5246970ffc86f9263e52029da67e510f58a9f9533b4cfca69310f2b8768082b67a8c17d4fb60fb750d7284d3411a3891cecc80110905175a26e2b07451f82cfb2bc587cddecc4dac1913b7c28996a96173e84f12d3d7e3b742cf9713a490deed14f2d7c08c30cdd927afdb6946002827ca564f4f0009f001a6c237e0b58b651450bd897d72fe0ca90728a1aae90cbd00f66fca007317a30869aa04fe2a7a6755d28efa40ce703bebc1412f5f2b0a6ae1919e983da9e2a6a1581f4a36eab08a38f64d8d6776b589850796f901c21e2a1dd2535e47e5d26720f1141c06f4b078bbf80ae22df8ef120a14424208eb2230ef589b70311fdd9e347f1fa65476ce1970f6c0b0fb12b01d30bb99f413adf8eb9db7c6e72baf6c56890656e2cfce19cd4a7af8c99b9ccfcf22df3586280139ccee2600cefe7d7c150ba464398be3e57bba9a1ca4b15b057d1b7cbe3e852720ed6d8cdee9298879253a5e3907e495f951997d8baced767e7fcda864960f2478f23e5380ef3ae2b46ace4dbc558a27e5177891c9dcdea8d72d8ec62d77db4c1ccb30e02cc95dac8973a13cfcde7b6f9522fac4ffd0af258e6559779cc8be1be7e1d04d6a114f425a7a58f4ba59cfb68945389aa69517a187da31273a981c77c634efaf4b29511bd632d8a276e7a46c9849b8fbead25207dfc82f48b20f54152a1a954b90e8b2e637419a59c6d437eb53b8c1d65c034a44b8352f2e0d1ca9c5b94e8a6837a75cd1a9b540d17d9187d350f223dd02b9990fae8d5043243d32bfe22273561224bbd8d43ae871b2f23d6f446af660c4abdbd28534253818f1f7806488c66446ddf9a9b3179492b602e2b891c2b8927e094d48ecb42bdd1e0e59717e1a0066711252a3b5083d38bf48abfe958118fa50eaacc2f50afd8d4c160a51bbdbac0be6a0b035dae0428b6f0925e993e5958403e3a3a5a2bd470897e86e04fcca6d9873d860b42b56c97306bdd19a531dd49fafb81fefc61f6c063c77430b65090afd005ca0545033d5a19d38f9ea72ae918638cf1f2f857b8805ff7f69bb1abe8ab72e261ea1d4b9d7c1b574e5f18809387e09fbeb6b97cdd5b1bd7c747ac83f4072c281d0d6d135b58bb72c4365ca6e0e3042c706abcac0ce92163e1a56f33c639679c2cd4a449172760d67669df3a0e3679d634918fb28f0b3905273fb9aeefe4fb98cccb69c7e93bf9e5f517d2488299c7f6e544fde4351be96032298300e18aa89d4b34d41b5e9986ca79d79e4efd6b9b95217dced4cca3734ef928a4d24d5ed81ee7258f9144256ad8369cb70d1b799c24891a23433e2234c4d28174e5225ef2119cc44b56e2a57c09fd699670f32eb1a5d2cc6d24f685b4d62a650cc972852aafd220830db250d72ed4da79a3238b24644985315a587a6566276e0f25e7c8c72d4612916461b485927d2248624bd3c495e914090d126ed2334d135bfa8a5d999e05dda2c68fa67d8aa82127f1ccd5498f85a29c4ea5c462b7508cfcd32b36bd9158c453a90662ce395b073f7d26cb8c9739a100c34bc953bde7e7376d0de9481b167a6870ce200dce3959f0935ff033885d99409a085113699aae216a9f1717a5bca6b0d933b43ba8c787a7c7e70728a88811c641d2c307103f2059d2632807389403c492b02bd3b5f8e9d9b7e0857d4cb432a6f713b50d65ed8888a3b91c41b606e7375cbaa5342306457134c9f2f0284def264b868171333b3418a7731e0e3cd139a15414e270858476196949ec99066313ae0a95c3426d7623bd0a79e65b3bc051f1d738bdd33c41ec31a66217f988f95edca457d817bd89f4aa6b7a15723d13318cbbae4dd3b849afae6b096bc914357a2897342f49e27c3433135bf685d6f8832f394ae212846df4cc8d1c7ec516386a0cb6550923cf1f19d529a608faadb9ea6db3bb8cc350eed21bfb548f7f8a9cd8511e33e1a49e5912ab5f5e1b4479dfb4d7360dd6d85d0abb8649adf1d3b75d9e22aab5d26f8d70f4cf4be7ae91de35fcd21ba7573cddd3a1dc032d9d6bb888ad6172e9ec02b65172baa432399d3c6422d27be815ca89d3961a1cf3ee05e79be6b27ab8adeae18d7046e8bfa13c18949cee4510eae45593d74cac0cf692d74db00e357849356ca3675a6a70e91c0a46f7d02dfb229d071391357c5caf4807f2c1f1e9169919fe893c276dc2c1b6cc53b735849f97eebf99625c67168f7189cba707b2fce5f581bdd251a5c1a804096c8dfdc2478f914683edcd28aa334c348f7834b8636366668edf421a9cbdbe44e7dd7c019997aefb84f48a900627c7ed5218848910e11bbee1a850433efa197dca253f477a4593043503cd48f433458d7eca8e9b6ace374ca457323fbd677b3ba74fe71926d22b9a1a9be9bc04231f72cfcfe93113fba68f5e4de7c23dfa492987619ba6edc030cc658a1afa7499f3626257a6434185f0d3691152d7c73f2b633a4d6d67a4ad084d05bc725175ce39e7942ea55cd91509eed8e1c30717851a72d04b0ee222eb3e427a3544a6680fffbceca8679e6c90eb38d7dcc78e5ec9bc74eeea6187f41e3fc40431daa37091b24f72cfb97415ce23c7db17d2fd38e39a511575fa6d92903993922ede242c94d570134a7e5b3d287a24fcb69a487a542a9a2656635b3d20c2b75f23a823487dbb63de7abc327a6548f9d5e70f2973196a1344d0ed821392148b1861fcf010e1c70a4cf8e06374da53708a8508c9711b852264f1d17720e225469a9718a3a43c38c3370fa0f0dd29e60d557920f42aea826dd301cf2fe0b7a503a0df9a5b02054cb05f584d8c7157361c213f77acf6e98c7a6ee77d818cf4f6f80d69970152bda8f6535140fa741fdae35782fe545b827dd9ca040d07db898d71965064841c225a3aa021020b2000d8068f1d3dd01d30f96dede06801bfad1df8bcf3002885f3ec95073ecf8ee26dc38a905e775cc70ed6149f616be6c8ac751669372671c4eb9a98a4316b8d25af8c756a03d043aae25262188661d2a3c27a1823153fa28c524ae9004a6b4da5dc41161abc420e9834d8a49c8f5d9d0e99297e5c33eb7858218dc602580eb0e2fdba0e9921fca4e2a56b3f226f7c99c9928b6db746c76dbbda6ed614bba6dc15d7e07a7bedd8ddbbbcbbd90d3615d4eeee560da10ab23244b035fa5d045b839f5dce68501e9952d270cd25835a8fe4c86f93639f34b1856f6ea4cb6e8992cf8f6b58f15b82c65f4ace363998a641e99c12e9d27bfc20dd03472f1d0821ed482f8566b63584a20f57f3c21562ed4afbb81dd225f7f488e6f2ebeeeb688391fb424a1bdcbe6df05d6254b1b0f6e3c73245ede194c66f9fc54bdb0e4a57e9d5b68660e4650e1ebbc29ee479e51211ac0c76adb3262d2592b494206a2941454b091eb494b869f580a1d59385560f155a3d58b47aa868f508a1d5f3d3ead969f5d8b47a88e0800957cea68637b89758dc7049f1ec9e51a684b02d06eab6a830f2a6df96d0cd111b8183236c04d30fc91378fe0936bfad27cc7cc8463c3b8ddf9613923c7730d915757fb234c869a8988715d5ab18bdcdb39f0663a67d4160bf6d31a2787376546afb58ab92b9f6f18e671ee334c8930dd5fdcb5d220d51936de4d1b62a36b8c141ebb765839e76c16fcb0641bf6d07b3f5541b10f96df130f970bb78f62dc26f8be7e76307b3e9d476ce0b95390583e3c6699a0a8cddd466ea5c7e5bf5add56badb2ee9eaae42a2a05c37350994f8c1d11656429a5b462db7a6eb0d1a0ae76a48f141d99416d0f9be89be85b77e939e3e42ab6d55a1a11aadc362aa7f3a3bc2c9562e72825944f7a1763cc38971d8cc9e3e9c4517ce2b2c11397b82828aca15e78fb282ffc843a49f1d387e22fbc903fe57be1db0b47f1a2bf4071142aa2a0f80b941a1cc5067f5183a3d480b2b193f34b812a3f815109695073d9a0a652a59c7efca94f0a71f2c82989832f0e0e008f8e43c40107df9a8b38a4380c18299f8ef9299ef209691086cb0661b833c745d734af895a87c3bd1cbc0ec6fb54bec5941c3eea82aaf90d34075779fcddb1549ee2db608ac7a4de9d7630fea9549f8ef92a577d421ca5cbb19fc3a752a99cfa0d9e39fb8987aa9e0da994f49494263da514aa14ca77e9a3545f8adff08534e5357c613d19c595e927a71dcc8969d88666fac4b42aea495145edd81c86872c2a0fc11b3cf41a3c4cbdf09387341ab1c0f8421610f41bbed06bf8c254dd68e86f34bd327d4bf98c529f910d9f114a8e929f9e06a7cb1d9c06e7747ad234120808683f49839f048a2dd208e8a7bbf4278f3488a4c124d288e34e9f343a91464d33450da5c9a7cb23b3db06a9c4992e7d4e767a7af573e2b4c1938f7b1a7c214f7efa98a741c691447ac533ec2cdcf4cae848c99288344f7c9e7cbef0899a42423b7dc3bc8e6665683415f5857b24d2a07c7ab4893bbdda12eac45f78aa13dfbf505938f12eefe4c99835fa13c73047a13cbe70973e9d502837c19f9c3b18148ab71fb31f14c74eeed228278e79d14fbccc8775c0fc4479b21db00e989f9cf64f1cc34e5f10d89f9c9cbcd6939347ab67f242da7921735ee87dd8342113f1d3352fe45cfe0e13c561734665878a1aa1267bb2c1300c9b3c8d580947c146cc1f0731ca82d2d948b28d9a4480979e032b3989e28af1baaec8354db6265d9c8099194950113eba2ee6c9d30b4910795e38353dece0c2b16c1d1fcd39e7352f366261de82828284e047f2d23b8f7dda88970ec43f3af5068d19174f0fce0f352e1b85bd4226970b96a02269a46574c635bf182c36390c61848609135a519302f3fd7516621bd8c746ac43155b237e5c8595212f9c1aa5a8982fdb3899f9f51a795686c4be708d84281bc515e9b46232fb7a26ae4837e2255552db41896194524a2986c59b88d320196a186ddec6a8572adaa0e4e64f8d3cd2a34f941e6da4471c396da618b65581b9ae39e7bcae197da8c8904f8e219e6fdfa189be61b88ec54f6b284b6ca15e01ead947b1a3874b0ee99c11955e8ee1b8fcf218f331a8972c2c0db6133bda7bb4bbe4e8de75892d3f8e46a1f6dea0b11ecee03816d4c99dc432333f617ddb17158f6bfaf5a978707406ea2187b45fee1357d6b9a3dcbabbde423db42dd442be0eb69151cfb3d3dd2652043d73af63b60dd377649b22d601065b833f5ec2cae8f5388fb035e2f784e7b0c69909b432a61353c888ef09846fe7d25f67a8619cb1914949346906473fcdca68cc5d7adac4161c9f47983adbc250d839c436e2c748586361294001021000950a05a528ae1c51a5873209e843a752a874268a1a67da637b9c89345712355ca4a46f9bb88279875c64d34eebb4892fd8c74871a50c359c58cc14cdc068b03b08f4176533cfee810699bb639c9f071a642098c033a3e2b1a97870dca7e2d139e7dc37c4e4ddd6dca7e2c179f5fa0d297d2a1ea5a621025075999793cbbc7044355ca4a7594df54c1a106a34aaf122438de1a99af354d14b2ef312793adf3c7a3c382f7d43543b4a5efa86f04bc9655e388f59c49fc883e5d418d4708576f4d0a9e11675ed9cb72f9bb72f32d6f0d2b78a267a7e3b560d1f7d7e7a1ae4fd228f0eaaf30c102165a83e620b90189410219d79779093216a036990336fedf33ec61863500f444804d25a2bfa01931f2c31b157548353b2f442da1cc6a0febaf663224cf383223f00f26ba7c8af155548f2dbc1b07cd722411f469a223f7c8305d56d4591f4dd84c8b347d1c32f8ca2acd9c148c91dab7fceee58fc57879253a773e0f44db22e3f39a2ca2f0cdb332602b3dda457fd314d24d2abbdbaa85812b55d73a2f677030d75d3a2a81b735a1455ce48792d6166797ac54b68821809084f9889e2e743c601c2d087dcc33e2caf8e40107af658d32b9b9d67e6b9bcb164b344e72e7d5d9707024efa1fed3408433bc00982508d871a1435ec26dd424f7aaa1041ea472256067b64c1eac09cf4170ed3479a95c13c43f325e76de718e9060ac497527b61f5422e8a5c7bd2b78b21f64920bdb226a04992e2e623cdb3b7a4a879e648d3abebea01051dd31bf216359489d1e06a4fd4e53989411bf5d47eccafbe3cf38c314fc503ab7185d77452e1d82ab62052f940311fb412bc6c90ee76f67ec44fc583f663045dc51644d2d33e7a5bc5163d8f79fb7201d1543e709a73be2fd453f970753d36c73e150f2c73ecfaba480f8dfb3ae55408db9716eaa246d246b3e516ccdc44d59aa8be1bb3c3f0c631c6985d5767f1c3c97c6072de902c80a2a58abe2d28b0f0db82e2c86ffc70f06f7ff218cbc6467e2a769917cc7b7e72ba0f2071a55d7a99fb10267848bf7c08134398e0417d7af3c03cfb86f0b81cfb865cdf90f90da19887d4f705fb542c3f55743a3f55fc5419988e398fe8d2e3c7634e9779d997eb53f197a3c1de1157da27141548bb90761f406c774b2db6cb88d08e1e2e396ebc2851b2f95082c59c7e5486b9d9b11a8cd807407eb5d800e4278fd0ceb429fa906b01ad921650910fb9a625be5c7307f61cdc67e19795844f6ca934559d999999991988b8c235e549cad5065793811284bec66f4b0944b2ef92dc1315a3b41d64512e0735f4181a2cbdc27cf68ba71e43d4d32fbc5c4694fce8ad50b73b28f4022e621721d4f0d8e0b8505a6b2ae50e822c2c346883abe3c7fce69c7372cd9c2efdf2349fdee66057e2617ee1fc42d497a6b767de8ff9a97470217fc6f9e5cdc5dcf8eccb9c6257b76d9c6f9b675977d6dbd659d673ebee2cebceba3d4ef68260edc7bea307bb4b0e202ea98a2724fd1239682581c92f15bfad24003d8b37c83e0cb41fffb0cf12264a371c0b021aff63bf90c6af734f54ccb7ab6369bef9d5f1123038075b63fb60f0116dc4836c8d92b3fb0873586c8dbcf4a156c68b1c31a302f85de76a0e1ffa72117d7a610c8d6f8f53546717c2ee030829e915b655e19ea891baa0fa4b6f30252314c0471cc2171f1db535f8db8bbb3ed68158df117b44193d18f9f5e0d1e02eef687059d669ac3bb84846babbbbbbbbbbbbbbbbdb07e951fa5002e9f3eb6df6eeeeeeeeeeeeeeeeaea9a52b4312c99b063d0ce3bf2e9b3454672346acf801122ba068624514496ba36eabe8e6311e755b57ec6c17c7dce6afda512ab9ca8758f293e7c3db41642596ae9001136870a2a77d48d30f4ca1cca086b4f4a9fa73892b130a1a0350020ca4b003147cc10924c8d0e4b49290410b353d46e8e011701886fc0310dfde410c89f11c3681f858d4bab5eef2ee6ecd2f4a3d149dda1ec6704f3bca6f2f86c3a863ce1d0f5d00c19a87390df2ed6dcedef6a97868191eae4f75b9cc5f5fc71fc3a15ea33cf4c7a9789057fcc187c73436378cb3a3c1a862bf7c5ff354ec98cbf7e983eacf6383d39171847c440722fa8e1e425bd726db65a4fa12a60122242664a1416be4b143d8f7a3df90f5f9c9bc48ff182b4dd568446b6a59e24aaca96823a5d878e789a533c381de75704694a2b647d9f2c3fe543c7ce11585ca84221fa4d953ec4b8bc4199b57aab09fc0a0862c2c33b82347a3fbaba9a56d057bab30d3605b95dd5d8ff1dc605c428de1d2ec4bafd87ebd7ddb57a54760d3be2fd1555ce38a4c0c9af0284133049d9c1d0ba840892eacf0851e296e60445fededebb85a06c711f45cc0eac01e24f536560673ede988d7b7803869ac0c769e1fbfbff1cc9eea286c2ba8e85930a8edacddc81877d0e02897c1c8cc0cb2740b902b6b18bdd25c63e70b93734ef642ee39c86f4839cce3647e39cd59d3e4ae67dffaae54a25ebeeb1886edc6abeb4a238ac4b62a6d64579f510d532f77441a11c6cb1923b283c0363a9869049c41b59e2a5c4b697610d89f99e699379d3b96108fd2ecba2e6761fee3f276ec6a2c5d74e92c64cf547c69db10f9d2c3a99297aba68a5eaec22e2d88218f6913f04b0775ccdbc75cf3f8691f7b86ea15f6fdc47eb655890b50b5e7f8253bc4fc9292b12f1c22af4da54957652a2ab1ebbafa72795d3a501c90414282fb6ed03927a54f2ad490fb8be33c1c74ce3917205c2b5c40f341e25f3a3aa8837020430522310cc185219e1d38ef0e02321bd81db886e2afefc7e521b83e11e4108439848b8e39668e736966e7b8678e9b1ce7859773aa6b72b879a8799839e7aca93695365d954de6b8203c8ea9633c4ca76eda5a507f4c973fa887d2b1edc2f9691ebd219c9b407b899d8e5901247aa41061e1092488b0f004ce4bdc5850a7c78da64e8fdb8fe972fad57d5fb8e3b7ec871762ce35c87fc9647c956133b16f8c317e1d639c41f0e7dcd6982c33b9878454455518bbeae2eec9317e512ad1d3e7f42a25f56619621e5e1e4e55a6c254976a3633b3b78ebe3c54623d62dcf555d404b48eaaa03633b3a3586e2c8516783901ef8f52fa85fc51ea5408971fc12584cccc07e180677f96a87821611ba2b2d3bdc20be1ddcadaab5e49f668a90a93a394dd04a64ba7dee9c87ec753ead3a9013e5302d52bca3240117eaf3081298bb069be69dae65600fd7cc66d9b5f1c4aa6f34dd5edbbc4ed60b821e1967cfb7068afda0f87f61f0eed796560ae2a7d38b4df958179fc7efe7d9798f1ccbc20e2cf6dbadcb6ed0b4d1e7765947cf34a5e885aefbc70f3acc3b1793be769216357949f4cc7730bdbaa4496db7777032e2f6d51b7a505d2c53c6ac909755b2ca8f93007ba805923168087b04c8c8d85d36f4b8b245a1041603f9a244f1feb9f94417497284d913fc54e886c326599a6691e84f545a1d4339a42859472d57b0637354aec9a320b997644dd5805cd33d7362d0695a7d330f32d734d6be6cfbe8905a6f2a89bb5db9476d3a692c740af536db03d669f631d06fa51cc2347ecbb647cc20828f0f9cc6976e2a687d4b50f45a752bf5ccb7cbb6161b48cca8b9170787b446132505c1c9fd7176e139c5772ed8a67f2aeeb8ad2579acf9b1922313db88525e6882da68f86694a218f0d796c8b9e90208fedc7ecf28cbacc47cf4a31c8fcee9332601d3ac967ee12b9ece3c0d842a7e6f15fb2a31c4b3a758d66192635245a59542152e7214eda1aec5473ea5c06ea5c443df582a7bedb2c78ea27a0482aa594d22f6ade3cb145f2d0187986e204fce9276f244f6cb970e24af422eef3f1e2a1367125facdd0f3b72b83f9a657387cc9326ceb619096269a440d83f40f97f3fb11811ff1e32412953f182c67b17d2edbc6ad5c6d0ce44411de010fa0d84045b11451431aba67618da00223f19bae908d7df004911f26a2d0224808a7b26f0dada2a3c792107d485bbfada2a0ff6d15f5e0b7df5651cf77609d7bec55fb6d2b0b2c7e5b59402100ad2c78b2b8f96d6541e4b7c80c7ffdb68a983c7f5b630946d9122a67e3a8a5450deab765042e88808ef41ce1e59e6e99ee45aa1c186a481f7c1599e6aec1b62a9c17d6652b6a104615bdfd0b6350edc57c7b08e45b4a9a1a36915fe7bac04d92b82ff074ef48c66970250bd6b930542e46fee19eab0845303295ab61b214de2e32cdb4186fb1abe8b37397d872f29d285dcc480db98739520efa18c8a7a7c12245aead4d8c647ed83641e6cb19341adc8b66599663bf5de663f4f15252a931a598b71f6394524a299bdbae6d73e96d93526ece329b230824ae4c8fb3fb9b43fc36d833f8d936db31d81646926a1dd9c1b4534fd9c49549e39af1336e346833bbb661250da63c5ed2e054d2c1f0518333498336bcfcb6e3c18667a306a753ee52a8857aa3c1cd370ff9a86d6cf86d65d1c497c66f2cbf81bf6dbdc50d49942b9bed4479a8de34af6f70585890b40d92d836dc3656a828971c3b7cac50164a7e06eaa7cbb8b36d6c1a9c42b568eb141690c083049c2218bfad2b7e9020f4db4202d0879a11ad2b86fe084aae40eaf0e221b27919bf2d241885170f52916fbf9080befdeae915ff6836dfee30342d32fbe70d361635e4962869b039e48e1a6c0ffa96d2a7c18eb18198207db73cfa963b0d6651c346c261d284c8cd921b7c3fc5f753be6f83efd7e0fb2f9c49cfd14e93263d4650be8fe2fb27becfdac1f99af425dfe78e98fc10a909daf9cde833dfbf94bca4791d9c976235229a738d5624841a66464022e9b36c26a3f99a9bcf667a15f6d113e9d5b68878be7d5ea1d2f4aa91d8c6fa0cc5962d42122fa35e6145709674cb0a256d8dfdbe90f2785f488fa8921cbe903201c0176242387c214604e30ba98dea0be9cdb7b3726e7a1551f0fb3778ac9c9b1c9c1c1ca45ec513fc7e8ac7da4162c224a95771e6f7531e6b27a94993995e7517bf6f83c7da99214264c7a6579d86dfafc163edd8ecdcecdc28e955a3e1f75f782c1d254b96e820f5aa9bfc3eca63e920e930d161b2c3d3ab3ec3efa378ac1d9e9d9e9d1e1da35eb5197effc463e918e91ce91ce1f4aacbf0fb278fb583b3b3b343d3ab4efafdeab17668766a766a74c8f0fb268fa5a3a39393d4ab1ec3ef973c564e524e939c263cbd6a2e7e9ff3583a3c3d3d457ad54c7ebff3583a458c18d1b1e9558be1f7378fa563a373a37363d4ab0ec3ef538f956374749483d4ab06c3ef671e2b072987490e131d9f5e35d2ef5f1e4bc747e747e7274749affa0bbf8f79ac1c25394b7296ccf4aabdf0fbd263e9cc102142d3abeec2ef6b1e4b87a6a606a857bde4f7a3c7d2010a0a62e9e0f4aab9f0fbecb174707476b606ebecac0c9c6e9f0f2f9ebe7c7ab52dfb720961467ac58e0961ad6f6ce7dbaf56af32ee6ad22d8d1457aed896168a2beda99b5af3fd83241f30d02cea16a98b0a3e9716be6523c59600841c0025bd24a634ad652bddb454e5342f08ce9ac664ca6884e2c5b3552d8778c4aeb4c7244ccf051a86f8f6ee8b457c7b23359327b665002e000f2f29543cbc8810000f2f247c7b46135b06f05d36d8957601e880aa38f10d848c06a69196d4bf78564612aafcc225facb3b89c8b7771275fac5135b680ffc9a09682ad02f3c1457d8d9d3dc259aa0e6b5af676238e99b48128c6ed22d970dceb773cde4a981e11717329a5ee98c866634d84e8358cf6336b105b3092f1e9beff0e2e1f9be781a8949833d8f6ad8483cdf33bdea468a2d55b3f11a013d9e5104d8681f9d32e17493180105a58f4e638c31464c6633bb328a51f935c159b0028b131c086da10842407d741a759250c5cf17c6b0829a2c185184d642ab8a6f81620b45476022890a1d50213d0b29e0c2155a40410f66c0b1957c24c2133ec6a130c4008920e8c0200c491ba6522dabd862fb88ab05115260fae854522ee216c19e5c122ec9cf0e4b1f71db4ebc93cf30aa9adb8042ba4fbcd30ed2eb185dda5d7a871cbd2a755c8c49abefc9b98331f9d69c4b08c8bcfcc220d2a5b7ea6d7ef2a89f7827e7ad5647f142994779e12fe67ce1dbe9f4e2429d50b1ba4bac0d9ebc13afde963acf3d95cdab1e4af3422ef3b85fce0b35dc231f84caa387cfeb637d7455ecc949ae4114673573070cc316eba1c1a6606549d1109acd3117d16c589d2b62f9a6699fd8128d260bca176e11c87d4d63b44234505fc86204b6a491974140d1e824c6188d9c500204a4a4df8f441f8762eb647462148d8c624b9434465f6cc5a1481469624beb6057a63b01042a7ed208a16242b1d52b2a81b02242bd9a28e75a3f6344c5d3d727401c148d5ac96318bf92c82446255b43faa4b4d6546aa31c77d977e2a19cbcfd1eb61e1ac4300cc342469d3c87d7434e3d79b8ad1307ab2fa8146e35a541ec14cd08000002c313002028100c070442b1683c20986bc23e14000d8f9e4a7c509ae95196c31442c61000002000000000000209c08000109603906bf2be4b630d6afe1495c149bb15c973e22be18eba0e7458edf65f03f9a30d9110487521479d4bd1e47684adb5e944c52c5b71fd5a8c160f74b159555916a9d466c630d9ea810d0ac339fdcde88e41bdf32686ba5d634ea50ef76edfc8959ec7870591be2e945c48f7e9ca88c53b7dc15830886b4d17cb3b0cc6410f4b9a6636fd5871694605f07842dc790708cffb5530687ebd545ff1be4cd426e20c3b9133222b239dc7acad1cab58ea220d6d2b19590e32364b5fa62e7fe12345eed11386563b8fe688c934949933f1a7ec9a4a36c8444edb5637cee8af68277d8dd5841a3e134958c9658fce61273294c187e3a4248c976b70f2cfd541b5cf091c4acc914363ef2985ae9835795984d0b368aadc7fdd3d9754821d156f39c2637a7cf2da2aa5057ba1f6e6912d411807c91a052e2af9e1fec6b292e4cb78945c7c960cfafd1486223c4baffabb6545160fd6788f0d8943996fa5952ce14ea678d6937a730b7f05d1bc7cb0a64f5b10767eabacb27b95ef6e53845b4007e82e09949a633a504195ebb17502075bb30cb1c7405d97bbd425f53d5b0ea14c6e15c50e9df33197d61ffa3a88396fa805802296075219fbaf621570b182f3c78060a61517484878f2b67577218d2761de5dacb92dd60b5622592e68fc45e22856959a05c8e4081c554fb6347695761bbb4be81c0b8af96756a4314a393cc589ed9ba83752774a4279a0f3f87005c6967b5ab78c49aba01547054fabcf8dba938b136555c754cd1d9df57d3b8d4751d6eebb5a0b459058405444ddb930172497a90038c48bfad78cc8304a636b3f762700b2937967265d55c4dc8aa3f0860033be8d348de1c6c86e838fba391674600c80fa44890ed3898e10fd90242d607bb414af641a722935161d18e45a8c4c1f82a702cc6d73d1b4d45c417247dc3cb851e8bec1d5eb269a5113688da7fab4983d2c71b502c4e84ce125be31a72a0066d3e25b2f053620a43c21b9729e0cdca94523da31a46cbc79fd4f92de8ac7a79914f77ae3c97eeb831e6e94521026884667da0069a974582ab5022effe79da847c2fffb94693d3e29acd4766f2ad4e14c4d2703b80c3bfaee2ccaeabd8c21880fe95581b420492d88d071f6f8781746d08c627dd80e7fe310f9d32fdd35a4dc9a8e43eeef2800b9f8cd62d6f44c0516bfba12bbe1b1b72dabfa1474460d73cc0d189563f90ed9102a8fb05862ca10a38ca4b11bc6edb69620beac609aaa00625c202466c1d27be836a87528c56fef9e76f07d89b89f007bccf4acfaf7e09b1b419259a80f8bd4deca8ce561b040809fc394fe81016130f3a7104b5af7429bcbf5159ceb4b00ee98bc4cc387a8565ce6dd103eeb062891adc0c70deaabf198bd659b846461125bff46575305d0f769b7012b384f6684c8e2d148da64e58879fe813961e59dc47d049ce454be4d9b2be5a5ac611c5722ff8b7df6c3ab5776deb9f22be00aebb8d8d2ca23f8ad5a68f308727385038e34da2ba5a0a151f790b0fae3a8024786b34946662b62411efb4f21a5266425a0d0bf124b8b6d778e8584d8ba92a54b110ca351e047b7462c3760a3ed8a0ee70bc14985f1e4c0f4456159d6598931f00ceb64849a20c21685b2b9d76364c57be3077cb989dfdd851262ca3afa5923f20148b7ecc42e7bd90ce4b7fcdcbc272b0d00aa779aded2a0cc2e0b82e27b6e4f5ebf25c7913b04998de0f96214b6f91369b1992da83526c62e0a23e7c8c5e5e3774197e9a86b39f939409134611aeac0f5014f2ddb9112ac7504b60cc8193cbea4dcb7e6ca3933ae56f0f395d7bf24762928199ad596addde8ab6ef358ea53b63091b7b9a3e056c07e0037f5b2f73d4c32c72eeb420e12714d6c2d6abe11f76ca905191f3cf154ec70027b718434ad2a91b618eb65255fcb4c2c916716e7f83b65bd8757c996bf121cd515900aef1fd9d9b687c78a11852c12093fa1e8543fd2ab68337b65cf471a2292d30fc92306fcd996859a5febb37c994ba84707e88608d66aab232662cbd8121e9891caf5cc4de8147b63e51e42ab5ac5a4f0d5210d51b9e6940c502b1abea7ae151f15fe19a9c277d58c66af046e0f2a9d7f07b62abe21842321d00ffbfdb95fab2e56ad5ade9b5bcf1f70d43d01c3e764220e53b4db8b30e9da0418ac800d82ac7215ee389a29b38a96be99f99980c4e10164648735d3057f25bc620daafea52fe8f87cb1257a8d8dc35bfa3a7a75bcba81767166a2ab0374128066886b91901d5499ac20e195e6dc22c9a367ab528033815b6f2288fb71063e3bd1fb02598763fbf3377adf8f14a227eb198665ccfabccaf19343c3f5bace69261e0ad904bec05211d6380bb033a7f7c1f07c302a44b260e56185aaf3c9d2fc27187c3ececf8f8d2abd61ec1f7b0ad7d3c0f58fb1fa6ab191f64e41f1b9806ada1d7e1c376af794b5e54fbe6741efee3131a27cf41d264cc522ff4cc84ed81b9ddfdcd1d5aa6b24465f22bfd8e72732d64f0bf442e69de6f190f683c9e225a48921b77c7df641f1f7381269cc1373bb9edfb1e47bba87aa378acd229266db04497aea39c1a0b60b7cc84dd03d3dae12d391b7334cdec863219693b461b96643abe01765611872c469559bb89df76b74887ea5d5da651c32b9e6f937190b069b1ea3038cf760d934b960186492d35a443261c13833f3d1eec367b59fa1381478c6c68c7b5d0202933fb8359c70ca07a6b0ef0db849d87eb41c43df269f7eeb162bfe033be482d57140ffa9a731a52f8d9f9ea2644e9193b322f2c839d4b0b9baab92db8e6a23f1644dfed565ac418539592d3b1e56bfa4cc4db10ef0e94ee98fb759e9b2d7abac36d0cae0bd3db1d6af19593a38192307fad306816486fd65e44e63c22ba71f2fd8a3ad3cc0119f270608485cf8b4a1e48fc8390006ca79d3c8091cf7e0c8407c530130da6466f1d4a0ed34b1d3e03bfccf73f0a84196a797fe7b32fa34d2939a371d3fd48cd00abee903141b33d1d90d866c5c8e011a2e87e32ad9c5d23a8344746f493536ff7275a8a6dedaa5fc2d1f669c0722cf48a6baaaa9514f83040736830624c81450b5481b25f2afb42199b2811ad05572290f7ad5ccce426a54cc5f49b7aab23f279e3ede0cdfe11e1b7ba82055dae053a76f85807e9bfc400b3067715e596086ac520e8faef7e64e6f50a3e528073767c6af95109ef8a98cd3ce1ab508d9294ca9a8c5ebfb592ebd66138a0051042b8d0832388098e2ceb447004286183c05216a364e5d8349d9f00a04905dab938ae75120ef6aa2ca0929acde2bd678b3aa8b5ad22c3ad45b8b207bb7667bd45b23fa43835555ccb1aa3948de61631a1676ad56b58acedf948c89755a0da9c3c634a740de90cdd759aa1886266ed3d04e370b0e5e0c6b04265fea13e6272d3737c7089c1446b7850545e7ad75752de2a4ee2dbf5c1c29e650d1101617ea8c0144da8dd0909e92ebbda4ef6f9e0a5972bbc7c96f94bd72a3f8ca01c4513f886ee6686d8684a2cdd9472beb6d62c0936734d5c75de47505f71b39586e78e7e4905926d13f9acbacfe8aaa36b820fa69539d392e9bcbfe347a593c50525ac1b594c9029c814f1bb7caccf096993411a395adeaa868cf6591e15a037917b5f7d5c8c2c9de731387c59ccb1ca7f21a1a6da6b8ba187e4e2d29bd123ed7fab614b92b63d745489e81d713a86d83c36efe85b3a9dae07ed61fb591f6a4a4b3a291c2643d93db2b3d3719b678377526cad33082f445570396255dc224b423ba2880ae489d5be482be3694a2afb07d184449511af3a33705ec754acb5c0f1adc92aa98fe90d94cca3ed046c40088767a3d989b29f858c6f5cae4f69bb5c9b026761761acc889e456ae58b06ec25cb00d7e5178dec46f4fa062ddfd6faaa54bea7c6a249ab379ab28b33a1cd306cb3ed8757bb53838e39a7bd9ff290839821f1dd211be8b5788cf6f9f897d72e2a5363f3ebd3c97f21929d4f2a7de02d5ef25294bb18fcca52910f03a51cbffae1c4bf3dda9424ad40ee247f11e36f6414fba8b93a9890e2f8b335c2180e1e53e70ab195b9d292790bd5f41ede843127d94f00e5fcb28bacbbdf93bdcf06e88ed41704b1ce278748ae8c39f90c26e7685cf06c09aa6b3304f528b7b668472dd84b518cd65e1abcb5aa14df9a023c2c1746aba1dd5714279d35f05d3218578797645dc9295e9673e3d390776e56e0093718e09646192074957564bb1a4f128a234d05c55bff937c29a8039cdedc600e6bd5e00adb9e8847a68192a62c50fa0801ebd5f8a5aca34d7f11682722947fb0874af4ad844a0334d03f608e02eeb264b1878cae12722185904675b7184f77ba37db28797b271a9986e4914adf4682274590c7e2220a1f9719e46d0607f172ba84a940fc211952e47f6576c898a2e88b4debbd15f7b6577dbe87bb7bfeaf27f03feaee8db207e2f6df28873777ae7c88068ed335bd3e86a5bf8a50ccfe862cd1dbd01b7604777e8c0849ddb308c6e840caa95edec52ebe32d523e2e267d0d179ba5929bb727f06d5a9573b9fb9cf65708946f489640cae5fb2eab4a65c72fdcb3e5563534bc4ab9a06d5ad2b55c4cc605734fc8d94030ae0b980b3571209cd8f816fc7f8d34e5fb70bb8c7674111f66d9a6a2f3e4222bbe82b01745044fd18d7821870727ab4a7c2ca834c2e2878bf003c33e754d781478f48fbf340efa85c61f2821094bab94dac802237eed6f6a88a78687f70091e54d6391f5bf3b063383728aa4a20bf9258b22c3a6b92923721a50f8e4773b40f48a5cea312ed04e6c74fca0506deb3e4e34ac36e50ecc384ac3cdcc9d58573aedc9c73fc5d581d9e5c841d96b2225e414b904d4784d42f3017d04f24016a14952d76882688e86adb1045438a12808cb962caf7e30b39c64b4ac9a19f13d8db1a7045a68abd6638c111a639755056405030fbb184feeced05297b75aa81c4ad44b95b4821832b58b5e2030fc61f07957ba821ecd89916c6e93680b391aa9c5d6056be44784b992d7bc8f2815cb97548851728ff2116656114fcb0dacd87f8e535b5758dd5b61523674ea8fd69e9a64cb20a131b9fd723563e9fb75a5e7e35d770023aba90934e01a2f259d256c87d0ca524a9c8147ac4d04c8c8e1d45f09634f6e3a7f92b83858c8f6ca4c12df6755a3755f569f21d6080fdff87a3a55c84d67616d52ae8d023616c4e7d1d92cdb451036868dcae3de5e9f61ab66baf92e9c7fbf4fa362b556e9142790bfc02e1bbe62bf7546dee43c5b588fdfb3da9b10931836a5a48f01b0e715f3dff7ed4d86128171d75d4b3277c9af6b169c9bdd2f993eb84b823ed78c66e656f5e75005784b22967b733796759b958ae80a4fbee8e040d4f9fa96750d784feb3ccce23073598872052ed0707b41580a435463a089a5584d3221af4818662cc5eb9bc066da40f03b73ed652c6d5c15e2920abe32a9455318cb3f82eb204a60b0397fc015582395dde801405d66684167a12050bc3d0e4e3dd0c4d98aee8ab2d929e4ceb6f9c4c627aa753cf48b0eab11df99539a7befd62f6eb145279c675951b7775f0f388fcaa614bd83849cacd95dec657fb3df99a6385294330d86cef920ad2990f2d6e6c0868e171334c302a25d345a057a4900c18ef867d1f2de29a1d117d580b5aa50b725352ce910094209e3a6698bc336bea25b733181d8dc4972f4aa5ac42bba95faac327a7a35f86c496c3159ad1d20e2cf3d89be3eb50cdab184b438a79ad5f1c60ec3bab50c9cacaf980fc0acf399bd892d9fc6d0df07f7cb412ecbe6e912863605cf0080558d50f16211928fa7926f8f57c0f96a4a496e9309021e052b5b61f8d2c1ac043c16293d1a9379e6ada6ec14943b7f6d07bc9a6075c5a1189bad96a47cbcc5c4ca23c0fe4beedd4993219d817a12c7f75534ad15129d2b4c742f88bac290b150b4d7b17b195c29411d9a017650d3ee4691c0b3986b1b203a41b0046d904efda972fd47d8c02714ccc0bbba19c9477189f018dd138648e9b22720d5b16f4197f0cd3377fbe2aa862b53726966f1a2f9a7fd1fa4f96ea10f680892203b9aa3b2084b25c3f5729fe0e22e15b7d30713a51ad49215cee13679c0004e820a01b1649779c07320c641a44a808313fa95fa426f398a2aa884715bf13b696d121d47d6e5ac8142a48b97c82828020005ce3040432a183f12b7cb8cec08195b14d228965e849acecac152656627e274fab612aedfa094464cdd55cea6db319cd3cf292bb16bc291f2831a3e71cedbc60c993665e4a53b884b45102d97097006dbc086584ae8358489ded0326ed8ff9bb91aa8622d1c9855b0623af867053513f6d28e930f0c3f30934f1778e82c5a708d2424d5f8e00cb2f511074d2a4fc1d2cc0e365ee5d4de89f53a4ecaff6d39c89975cbef99d5e30119b7f7a286f934b372f8193e80276bf89bd9c0ac8f6390e21be505321e95696407a0b4b257f099315141857bc301c24eedb9160ba39c17c3022356af82749a5f17e021b2852f86e24bd901fc9b36c3bbde6f60b137b1cc26e2c32e8fb003fe385a483f440bee87b6897e1e6902f863daa39bc75a4693c7da423b8fb300fcb1add12d7c155edc2eb719759e26c8ff61f4d07f68cba8f2a8e6b81fd908fe79a43dba79ac6534794c4fd48f2cc2f96175b1f14301be585210791e1c712eb1d9c04da27e530721a0f33385f76a1403adc598fb7f1c0eb0ccf84015883ea901d44b013722c7ac76a0336dfbe31258f878a1708ef637d86f2671535d900ac281d3a4bb00267054f1c1a1259f396cd0d3ecc8e4568853c108c42a190e84e7fd27720bcfc11312b7b5d3c1145c6ff85fa7b40f51c051eb793742b5e77326f4a22096d003641f2e1a84cdd2e3414785470904395425884b96a41b5bca76519481af4c55ac32373f2da365c68cc2da3bc13ecd309eb60c17c641eab21826e02f9e8c1dbb2df11699e0f790563a5d5aecbcc1e3adb8ad054a06ac590bac7a0fcc15af02e7b7dcbea6b6da63e69da5241a148416e9ea8f130140a9b79dfd9aa9d726336dc8b9c307f7afc6202aae69584b372b321c27b1a649bb08b3cb9229b31d1455ce7d8fca37d877204d5433c0c54551c0c68529e975480c5dc0931b37e09ada890b71ebb5ea71448afc9a12b30b9863a872d21e5e22b92473da852404c816a687fb2c43c951a1c8a047f9ccb036abd7e813949928c2b9a1fdadda18cdfb6a091618a62ed39cb331c44e5a054fba194a2b9865e09aa383086222850ead4899b566eca830707868fc79c753be5b99ba4f1a747c6bc05ee7dd4cde924a194db5b8ee1e1c99b148e7e4744bebeb2601702a3406cf291d56dcafb9ececc0c7d5f657ed40f5d8f76793ad315cc8ee032d36f1723dbf4cc0c6da493073bad75ec81703e080a2cc00c6cbbf79c75c107c892e806f3fe9cafe0aad3ac54ff269d219738a17bc30e5e29f5c9973433e6073b250d3fbba51ac5616462099237f9159a6cf345fc468dc4b736d167a4f73ad5100ef9f6e42c308ee5c0215051e6f9f97134588a12c49e6316e4462a3b5dbc048c9c98794564e916dc9118cfaaa621626fcc3610e0f88763596adf1b2539df8edd0e2b687406ed981e60178af61530185d9d552cb8f1417f75dcf69e7ab847eab1d6f2fdcd4bd18e4adf094cb3f88bf5feff710d643b28c22db46ed859eb6b3a648af6f723b3528108307257f163b754455ef7bee1bdefc6175d088c0e395fcfc0cab0bf6b2e4974f84cd03d41ec3e54646e102ddaefa4aa5e3c33b6922fa411dddcedabb27fea3172917162732ab11c26cbe69dc4a620095a1703c8720037fa0ad991dc2a671db96876439bb759084e0e83381a9033b851027e2913f2c5fe6220cc3aaa27e8ea0b15f39f22c323adb9073eaa7fa5952de1e793204b458daddb51fd359b2f7a95569a15cc94335825b44c375674fea11123307c85330ec2642a151e3bc6f8ebb28f361b8ef5d5c2af894b508122ba9a8914b6622a1050d77888e4dcb6406c6dd781c61cd53b29f015acd5a7025d82026426dd7954258c712da047b2d18e7af34d0167b4b81d02d2576890c7b1f9f13858aedd4c4dbf8c5b7a770e620c7024915ef0cd23a4a2bbb49080da7e2c20e5638ad517f539850a9e2a4bb20798b0a4caf21c027388fe6539883a8b04ac7304ef040e1a646efab1e4e34298c3a1cf8c1e676fe875ea4461ffeaa452d412f30a206bb9844f4098041ad1e46a0a851aa05ed31c5c6a7504ec78cba8ed69392b59493b7e7b6c0bf357c441e0aca5777f67c280f7f039cc767d59fa2c216aa4441b61d619b85787531023c3c35f8665311c6b9ac0f1f7584639793d7d836075467b9c811b264acf034e10851d6bc67176065e0db8afb83e56781253942a14a2c5f94e0160497fc2dfc5024976796bcc68ed146e44f0c01735409dd158e8a23d94eef09e871904ebbb64478a30634679810c842f55cd6bf291083d99b87588388070856c145386a1bae31ee8c48978a16d674b1ffb51aefc6172903ed270b3ad26dfe23b168a0a70312e5ea8d814e58c88237cfe364d3533811c815d592e602962af3644ec0f207364bd74bf84a1c7a3eb588e36855b07a032422088b926bf74bb9a75703a7039b2ec77d869cba36755e9f571c669155a3eb3f034cc6f3060a72dc91dfa134f68f10bd54081cd5e00744e066a2ece06d2a59e1c9f14a0053109128825e97ae489f0ecae563d9506bf109fcce837447202c7dfe818a78efe214c6044a4d2a214058abf6f0689c10523cb59cb89ca57fe75fa4ed84bb71026d9c1fc8bac5cb22804fffedf9571700772254d146ea4a0d847c836c526d914a7cd41cf2f9c31fe221681668f80f59268d27d92d8a7f63d14875395f87c4ae80fa67d1853dedc926c5beb62d82a0a7c5a8f8dffab7b255f364c2b9f45f6401e8901dea65954c4d4ba3074b6956c3f1b60b64ecac49eb945dbeb6f536c0a83cd530c81b5a146f352dca1c9736e167b52347999a73d9595340d340c6ceda89e27de250dbe364d5f447e9c6fb545624d74b35545c74587d88f7f40bd2b71d7728fdb5ce13056b2e763786e7dbbe1e7f895e73ca5a7b793e4714d70013f3b49e2c9ede6df78d79b3fd58114734b85f338d9198446d56c286d1717c09aa41392fdccd503fe18d766a2354864734a633d59e0e3e245ff09b0c6f2a3088a1e05eeb678bb4cf1c833a18587f9a7c9a4cbac278cbfdbcf3ff2a3128a1675d6cec1832135385fafea80693aaada35c1264f73af1ba0102ef4bdf7584d7a83481a7cb13a8360eb4883ec2a4c2199309f377e6bb913a3724742703b2be4acd689e0f1560450e10e9f2b19984f8033c7165ce8cd8dfb4d084892093a64ef34d48e965cd0e1824f6cea5d38c26d7c3b5195812d4b5c4be83365878934b77201c4dbcb234ce6398fee023c80e27238e90c7a170d626a9a4093d897c08fe07afa92cfb52ca6fb30b71cd89064a3ff5c4035cd5e62d6a496e21afff170129d088d431ac89bfbfa15d2f03e84decec032837da0c02144c9c2e2197c53e85b80032d6ea25f37838a8c855815bf68af4dea0f7ffc35a85625f17277297842d016eadf7712358929fc68f94231fd572de56301f7c0dd63ad95448c3fcd617a62dcdc7a31f86cdcddeb7be422217028cacd552960e33588f817aaa568e01cc24a79981718b6c79c0486334fd20381fa84497fba977dd6d11de8a52b5fe9a22744a4a861f12f0ace4aebf43029c3274392ee5fedf16c29272565c746f28188d8c69361717d3afee8bcb3bb3cc332e4635b8b1df92dfa2689617a99a8b862719a947a5983863b77416384625f2cb18c56dc01b1d9950a68191b9c943189488d3384369158787bc8cec2683629abf69215f2b14ced5d551ca4a8669f28823d827caf34845e2390f6f7cbbfa77f188afe4986a1b1b71a8af9c3a1e16f017bc5b1950bdf5fc9f160a56e1818bec901a317e98aef00ac0a7567163bc3511a1c01f365bceb9526af9c25b4795a908216e28350c6810f9bbf9429289748255b1a5ed57fb6364aaf06c268c7104f00f1f457bd497039fd5841ce6bde67bacb6375a2ab54a6660e8b5290c4b651eb42d2d16c87e22984f154d627184d6b44d8b5aa5d877ca1e52a5f5e33a6f65cfb087985a1f6f86fd319da5cda03047a3a03d65916cf3c349b9e8ce82b1606a56fcf5009da8c186fd80ed102b5c046aa259d4e83a5ee1bb7cc2938af7a039230bfaad7654fda70d5d9b6b153ef17ba8a9352a82a9baa3bc6cf766f5264a04b73936a4bf9f6abf1f67c55dbd6f0443d4513f9e9f9897931ff0a720b39bfb4e0047a3c8b3c3075e42588977ae7562b794d29d96f37a574e39f85bef373fc1045fc3d0c409549ad9034f9c4b8e80cda75a62d30a4872b555c780d46eec0556a8c44806d429174378fbda6442b0634804f47e897ae32f9415615d320149ac89844f74fc22df8a971d747629e94958af65bee4699e9bf11f20d7095694b6559d5b5c7a235df7f5b466fe70bf3465629d51f0b6f08b6f4d6b21fd2dd9e6995168e48410df6c446aa75fcba45138597f2d2cedeb9807796f14d805707c9970489a4db29ba6d1598925390a3489a5daf54d568a27431777145c4462e5d52cf93c6ff3058b9192de89596e52c1183d0c1e0524cc1917ab4b37a5543097cd34d4595cb8b9d9871d884038f9d9c6f57d03907a1438ac0e663d63565c48d7b0a0e1d79c4ea7417734150329fc8ba7b074dd6d37ffcbfb00f459821480420a1577412152c04e2f54e941d7fa1a7dbdaba6adaba05dfb89d0e052a81c59454d63da9e315c89468383ceb633f48447f37b14434ef08be6a6a6f8affd900da1989b230b05267a95f20adc7b85bf2b9001cbc08b2226831fa1c234fb0f5f176bf95815fc59c29e1b7649bd7bf649b91ea431a1a8b0f20f8d25b525fce2bfaa90a2483511d5ee425c7947d0e1a7e394a69b5e9d2ce480f6f8b8afd23600522f880a6da0d159a44112f81632958fb1ecd3b7b8e4a21940537919b372af5d76d4ddc894a8d40a1cbf2545a6079ca681c7cbf3ce3425ce2c9dd68768339edd856b7252b8990997fc130bb732d1026a2d8bd31e19a2650768466f64d80fc5149093d8f1a05f3ce7d8ca118f1298fa1fe0ed9429d9b687a5b0edf616025d0c8c9a4bdb27484753b5045d5cc945a3fc834815cbada962f2735108d723a4d63d1396c58c7656f202ec7d1285da727c0cf14da8228dc4625c0e7d380c754874b16c42413669dd1726b7da6969e028b82f1129b30b6736d4970d5e7450214a5daf2875cc02878a47bef5e3007bb3522f97fca349af98129de2c352f9622bf9727b0ea36b38972cf07a84c28585adc7398d37b55ef038e2ac6b83a09c4923786e1768bc19bdce8917e130ab630174e136e0b1b91d5588174888c054a0a1f0b80f24dcf59e5226819f40bf7a088b9acc67d0fe348013509d905d7d5cbc3fe055ad1d85a14b896c87696fcb8e3fd3b42bc492c62e0f0dd3863d0e0136eb2a4cb5d0ffec208eb8e5d242432092aa3612664755864d2632a2318af1bae5367af71c294eb0c1364241dada4bd11684a0c416964023e014731810de289c2f022b9f92790dd39c57dc1d0877b710e270cddb9a68df2891a77064352a07bba7b16318d6b3e3b88b3ef1f5a91fc334246ee118e30351af127311ea37d2f329196216eb45db73d1b2addfd69015858409f4e73016230bdaf832176e7952070d14809fe90be512f91e2c998ffdf93d5a8e9af898c0f1b50ba0cec3a2605087b6d398180919e561ef2839ae56a92744c4ca59f36fb900aff7544f985db013301070719824b122959af6180ca46e7a2be152f5052426170c0cfdd033f02e46424e0f3252cce41d9ce8c1aeeff0a62b9163c7605a8f984b85e50445e95ba1c710c53ceff7a73052185363079a42dba2f85569a58f53a98c661cd07743cb29cf483249c6e7f3b1db3fbf85cb89c239c3c52a4eb78821708a40c08848843975184e71cea17184cfa2671509d90c37e114e7e90ca6983c4e63f98b0f8efc4f9621c99015a7b40f5ab707d268e41587474ddf488b7311daafd93ed3360d65aaa7a979d49c2b6f3041b5cd8298ec925903e91b3e99212c2627034e439e7fc73bae06213519b6ad53faa5acf0a5beb27906136e1d3471310864e4573539224eb083bb6080d3c9389baeb5039864ab5bc89ac1c5ec459a24b313c4833f85e88deec1b5422501000a832a59e37f17255bc126b03ee6e50b9afefeed230dcba2578279b8792f8a942dbc94756f8970aa823fa01c52a46a6120901ee20c1f3d305e7c159666b7a30574506b2dd0cdeeda98065c0bdfc8b359c2ea67b167f0c419c7200a04e374b4008469839d44a83d37ffccee2c25a0f1223248aba9900b1716a16bb46da52f44ac1bbdab8fda5fccc1dce0ee2d627abdd470c196e66da36b417e49933d186c70ec12fa8b5e44c5d2197e818cb980fe71b7e9a8da9c3a7fa6e78e2ae00588c465f0874077d50a48af48a25f9631800b13ca53410d6432bcf263b7a04899c6834f52b6cbc175694f8197cc7e3bd28ef8c02421332160d1071c3406deda5d6b4718c03a20d966fa54ea78615d21200be8ed2247185a013de9ce915357724bb1679206eb1a256598e4bbe61b3d5b06afe81d982d437f83ab608e3644c9df624f082f3c0da784e406a3a7503f554e6e96ba5ebedc24aee908280424d835ad24a272b0c201a3ba8e8b4040cbc40b45c60eced60c4cc6c3f8cc76ef59446f8fe85438a7f9f6883ae3460adb1bad4f786c2d1e0ef2cb47cb561d8e0414952f6a2f8887886ca18fa5c5c94de2129330a087565058d0d17d057ffff8a8b3a80f68a647588ec99b8d4222a3500a4e683b411fe1200af6131607445ebaf08777e4e90060aff07d0c1b0c6c9f49041dd2aeb77d0d01ad2114568970b365102b511583373f84510c3d3b3cbc72c0e1effcfe5982fbfb15f110cc86a67527f491cbcb5c38f5d568e1db052c5e104a33d2ac85650549daa5faf17bd15aa4fa6f785f8f539edb88a6a08cfd38f6ebee0ba6ad01cb7789bcff0425913e32d7fa8846dc533c7af8c9500b16988a56336eba4a3df4849862b279ac33a15636c51cc3c90aa10d580275c0d836deb7d8d3b76f71c24de4292901e659378dc04e44a219ebf442de27153d5c453e6db72c373ef710a4a6c64c97b9e04973152915b8bf197628e869c76cca8febece555cc014161b3310ce7ff200585f2fe1f6cc84e98903c012e0d47f9e022f5f709da5a1d351aac3d07a7a7ed7b59f80f51223462abe0af1792133f10d052f10d1ef1bf91b2e00751949400f0eb1f46688a7ac6d00436bf8003a8916903c840a8636e52542ead481e19008421d026b862ab5a0d3bb9a5ae1f11275fd092e0cc16efdbc46bb07ae1234e129a677628dfe7e159a538970b7a2c61e1c46f70ab4b4c722beebb36834a77d840bda8107bffe7e683eea5bc47387ca6bac959b7a34735d5147c3314e56059af33cb16899ce0790c8c507a29b9d6a9b2072907bbf754809d88eaf70af6c9b4458b1057bfc059b458a663f94040f191e9a41a234e26007984544d0262059b0e7c0d4a66069a84df8921d3b15552234562ce252361d95e6e3002d2408ab71abffd541799bca3ab1376a8a8845301046a5fcaf229893c1df3f2215c9b66c45d6c440e6dccc502d49292c9ff22b7b307137422cd148c7e92c8d8d1fcb59529eb242d7f6ae6bcf2534a0e1d24e0d746544c80a1e53f32066b6049e26f8ff8a81cb4def101df00a3158d2bbde487f5e5f0994dd1ed5626433ed883e9adc52b44f06ede2ca4427fafc08100cac3286ee022046c09fa8d0dab23e2cd0588cc195e2e15a2eaf6b0b9e8055a5e0100d48365f0390d3e1ae491d401442ed277cbc8a28dc0f00fc8b1c720bbbf3bd2fb055651024b56dc49491b28ca923972ea4f56cf9f10017a74be0670008460492d4e5cd7cb4fd47c08fd63d4d73d0516d3be9bcd36d252d82cad54c715340b79d4d76235c2ceccad65eede07f31e71272512f186ccfbb430a4863ba5841459dad89f5f8298908e88d54da204e4c118773ea45a40b3d91e3fd7bbdc65eaa886e32e32f67321d6e938987609a17325bdc925ec1aacb8ec96798c3af39c2bb93cc3988fe247c2fe4f87e0fb08521514bb347ca4d7ddd5e17ca63004b5b11c697dd6356e8c02a66cea33ab3a90cd9ad4415708a01e936a778ecc80f806cd9b82f59957d72305a63ffa879e64716b280eb7589daeec16323a69d319d1d6e83af27d39b24916c479dd4d80c4844022dda203b0c84f965791427d83444ed33535b805507578ebbf0eb0093b630e8aab8cc5c6e61f0617257eac291dbaf9625b5b6ccd62a8b2e0b6f17f6a52b9e595207103fef38c1f34a72d7596b9039e5eddb79808babdbec43d40db826091be9c13f22a9d7f406a7cf9a6e9ffffee54b3a0ad8781686b3c5b0a6adc1cbebc9c74433a1c677cb1da4604082bf198ebdedef212c0c88b701877469621177ccb96d36d182448802fcc57951682026fef8099c8def208fb41fb746d793cd7d8c269b001bc8644f2fb6cc9e18ff221fdbb45e781c12f71af44d6a1372031836390f27721c17f05c9656dd222997cb6b9258540a6b7f8b2a7d2c96f09294a87948794062f0da860184ed9e8b55e69a333018afd5e32f127e48ce70a2454b8e0657421d58151dd852007208b515ae179d8b00633c500b14c3c0457621ff025e005965488e12e113a64de2218a30c13222152f423478393f8af3c4ec557392b7b3956d72f758cc0ac228027c2ad3f16db550434c6dd52390c314b4f80f18664de66338db2c824e31d1c3980d4e271c6e13bd6017c8a21ffc00351355083f73c0a91848fa54f386cf21af769bca142f1acefd13010fb6604efde8ce4af877b83253fb8b1c0a980cb32db5b9fbe22cbd7e85d5ffcc9da20f81281a01fce7ca54d45071ab591e28a542a176f74327b922a9040b1880ea9f35120246d563555e462a50ede62b97b99a3391c3d94dfb67be9f26e463a610f1b7d727f5667fe13fb0af3a5e71f40ac862aa0aeefb0b40e8796447cfdbac144c084442ac5fbb9f186ed88967201fe67f267282802eabee5a990f24b640463a9f386dcc4d4a2df45dc6d389260650115093518eb122714d6f6fa543c4f554fce953e649c59a4e2f4c80577e0dbf721ea942981894f0bd77b235068a502ef736c51d3c9030fda3033a714a299d21e70b5803841d5b0ba13a78fa07d528e8554d9e192dd57900770a561830e36db6cf4601407dd4f620b76eaa43c87263cd220de1ed1d8c54a28c6ca9cc56f9e9313a6a67ba9bef377a86402e6f52ae296750ab8edb76807b0869cff0cc7fe85448dda9c5ea5c096e5ab38b4bfdc26f6f37080641bef313227ac19f8a968c4655bf9659517d78d32c99298f27ecd79ba4d7be01d65add3a3d9cf19c1a885e7215a7f56333b88619bbdcbf6b71b324ab82d182fc1b463eb39a1faeaf03f2a37340e18dbb1e87c780512833db6bf2de263aeb864b75ea8af833ec0e90f8aedb48d9ade0c80674ceecbb5d3edbb3ecbb0adc2ce956167c5b44830c2d4eb77eabd1c5e0b71cd4e73d500eef274041ee00a28599b2bad0ccf0ff48c9a1e66b8a917f3421bd375cf2a0a443f83382d3f78b32d4747afcda52c2e2f5601f217815fba13a486919e314b35d3b56c5c95622439adca3a33cb789bf0915759e692f50160a3ebe38c1aa3a5fd4e253da363b0014195b543f0036069c69e1486d07b7ec1f24a4e39bba03a957c0dac49dec30e7e0ed2a08df70b2be772224d34662415451a2887a8a5af253745ca8071bd942952a049bd9b55612d0e76b6192a0b9dd4363894e24cb6994743449a0a34ef44d65a5e2108c64a12e80957e146f54843a2e0b5e973794f8e1a5ca376034b85d62eba70b419b97c9d77c7a6cd5898db86464a5a05c3087df29b4f43f245fca5b51cdac33a8d3edf7d325459c8ed49b67114a707eb120bae1219c0fdf5238c8f4a2cf9a61e10e0d4237db82208d382b210cf63acef7aed965c2657e59c149b812025551f136e5ea30c89bcea0403860d1c16fa9ae0b5926af3b59322b2991666953597f849128df0a36a06548a3cc52bdce4eb55c5d31de8f03fd4fa226d32ce02261b2b6952c6765fecf5f4c94ad8cf8da719a679ef9c94901ef1432b05e399396200cfef767cd1e1d900105a90bf92320335c182625221ee8760b0ef3c4d784641a13f2127cad15218b99cb83e0b103e2f16165d235e01890f71f8245f854fe3321fa56d931ae935b56729719949731254dd312da182b0f77b0e954a01dc7ff09067a99e6d91e3a92941a1643a785e9d0ac190b6d85d277068188a9c5659bd6166c17772a63d96cc9ec3d2462129703be7b61c24b7b0833275ae8a69a446720f6584106f3aea98d8de0f90c97279bcb37583d009711d660857c637f325a1027941c7d261f831c0287e217458864a11153698ee6d210ef03cc72f1e2dd978cdbaab16f0df68ab49a761686678cd7ec8f0792e63117d77571017f2f2d05c34c03659362ef0915fe10d33e18f47c48725e4b2cc0e687294c096e33059670f55bd066cd82f22e43318da82801841c33eb60c4191973a05177a464db579113f66b23294888861902c8069f0fdcc403173d955490f024ecb4031804ce43229d205a091e07803f9d73cbf95815ab8dfb2125a9ee6e585330f4cae06aac3fe59db61ce1cd04b17877fc7f6b8523588719a036fb8be0ce480ab5e6b594cee9fe34585a72b6cfb372d97aaf5faac8124490dcd0fe0f049352f623263735b22c55d5dfe09f77b72b57e106a63a6c5f5a848bc01bb9354261f245f07de88c8c651956f4a84bf14554d1f9aaa199ea29e7dc8974a031b5673c1ff9a3e5163ebc04e0269826e931d5aa1a23cda8fd157452dc87a542d3c89f56172fabd824bb1158263e5b770e5478258a00ce336a83237fa441504bfb3add19612510be62a7416ec5b3aeb4ee492a0d19f37a9efe94e89d202904f6dc342b81a0a05d3fcecb1a6f290b83d82631a71380510f6d81b8401fef43e1fdd0e0b3e5e4f97989ea20b2e017215ea5f5301fd9001cc3d1218172bfed245f2d771377d066e5e46d53fcde2f391a50a03671df413b11be0662a7f6ab99e6e5e47481a8bf56c5ada8903c4a97ddda62c1b11d8e43da61445a8cfccf42761b4e94fdaf4d23fc2c6d95bee090db3e459deebd6a163d4689da045fae526ed3006c9ac4fbbe911aba1c973f60eb4c6a8e7400db88fc26d4a26d42726ed0f852fb8cba1a4912f86e0cef502169b6d28ce498840422abef73743f5d8a430e29ab7dfaed89514e73ece362464f1be869861fa0b2d52093bd2277761ad4f8983c1f95948028144c49d5c6e6108c3d287484d7c62aa8be5ba849252eecfbba42fcd2b7e6948631222df3c6bdac8c6c6c82a54b74cce1056be5ba2019e5b7611590744b8af097d6f1172c05e9717b0af1ac43c98602192d3a00bc6f59df7dd97c34ed88f5b296719a98cb5f0162d7c8d0b91720c254a5fb016f8a0ecf0e742dd2d708a91b0b8d6251d6413c036d3dddcd96e68507594aa19afc033f3d1034b232ac4a52b020be2ea88f3dea0a51adaaadb151d750f31a21c65d59291bdb5fd635f0bd944caf52fa815de5d716696d2e5a637e631ea042fa44ebc76e278a7e2ba58b3ac58809f5aedfa220dd17f543ab2e175c8879337ace8fc2db5ab05a0df40644ceada2db02ab3f1cb7003d590c6490ae336234493efe16390b7866378e0250522a02c22e104034ac8c00fa45ef8619273deb6f05fbe892be8785f3e9743b5d5fae35d6efc1a7fb441ac84e5cb7d2f687c1488b431ccbbce2e71bf765ef2e2e9015dec6c454c968dc47cc18875bb0325aa273178d5561c3e2b62d1fcf9e8d71b5048d147bb2871266cefd99b1c88f4ff464d576486eaa64d09dfdbf89ca2bf05daebda65b82d7df243194faf47a07ff84823fdcf00da9b60c37656f6f468944f3a9445d32557f5a2bbd629e06449d46e48c46263f3ad554119fbc32cf733802118b17d00cfbd17147c8aed37fd0ce0197e1f85ca949dbdc3752db0ccab07cc6829d3de23313ead069f61076264698ed029cf70e6d259111bc45f0df7b73474f81c08fa7ba86a20c230261a2247f9ca16b99b7359e9e409f1034487eb07723a9b21dc9ba82b267aa2270b1d1299d4f6cc8e7c0383181955da0983ec5930c4e0523fbb5492e4e01090a1789adec3b4a3808f436d9befe12f9bc4d65632c429ebec0b958b2ea24cf1ba830baf5fc6137ec67376e118ee1e8a2c4016ffca164d25bc283359ec92d7890448e97175ee62cf94036515835656648cc62ad6a601f2e09dd987ef4ad8e2feea0460e1133e2a4175e2ed5bef2a0a07263a262bfa0e93cace2b217c77fb5e13978495fe4d1451364432b08e9428eeafa82963fa91d5a395120c60772c40566824af48126d2c1d6a3c6385a5c84fc41e2b26f365e69e4064f5b94dd9b4b45100b39a2c2b10397e08ac4f6e4c2a6999ac527b928268b71bf95dee59e9d4946959196e7b602a3830b5706e69440e2faac8a2051fda2f240d5f0f52174c2b9972d71e967bcb66c61394c731d1372de66478aa79adcf012ed60592f47a7ba2784e467cafd95c955bb7cefe588ad90815f17a8dfd999053867eba147afa22d997543a648ae0f0410ef84537f8143c303775cae6c5e9f54ff335674c5a31c45c3a8eb9b7d6fb85a2aa5978324a3c1ae5241b4a31979c35e219a1dcb710d14569743ced675ec79793970190eb17d14d7bb1e81d4d06e34c23eef27b8753993e5f323e0dad29b1b6faaf60152d421df1c8b4789dfe19cf0671d61b852d0e489940c8c2ff38b71cc894626e2f8eb563b0c0bdc123e7cf7d729607ea2c5a00343e0a884f11022e33356e274a5fac770b6ea0c68f15f1bd73c80853cf54fbcbce301d1b117c54613cdb0a3fb06ccfb31016fea531e4eee7deb208d0c603eee193664e61eda331bc54b3bb795ccb88d7bd8f6ba4edb357ed54fa42da3dc8ee348fdbc05b38accece98fea9dc3e3eb0cef287a8834a855ec5899ab89c11c684c1c1794f4adbe5d21375ed0f6d44ee461d72c4eea77db8d35244ea7bafd37c21b446f8ce367dd8395c09a72051da04a22e4224ed2bd513b01f1d8046e6f99657eca0c56a89463a312a764a3dea7ce2814b3ef71ca11893702c5d180342aa47afe35f4a8f0a1dd26c2da8f1966d3a13d6e23ec533a9e7de8e0dd5c9b96025628c01a8c7410d6ebf2b2324d094e3ecb308dcfb819e11e50844a820e2fd42aa852be4b0e8a5aa748379c447d2d74a0fceeee52c500520030adc45aa56579de2de62a0453fae54202d3beecd57f0e353275a1cc5baf2aa0d873c4178da95320c458e108445888126665417a283e8ce1ac7175ec5f579f68c75fe80e1955c75ede3b407ccb3a79ea927b5b9b3b4783273223ca13f32677748e8f80e73460e8db62ef167e44afdd040f944f74824016e99be076ce478aafc16fff4b848b0d25713f152e9f78ea8528fc62ba277205ec18e3264939274a22db003007593bbd6ae39da71fcafab02b53ced90e2b0e6889f1556efa2ed974c45f4c7a4d7e3dd712c92ce757e71f08f3c88d8990b0e62f3b13963002948d3e9a3039ed76a8e223f9cea283cfa139b86e9ed0c59b594ff68a7a131f39cc1b50aee5a823b6c2d7645e8b07e734dd080a5ce2898bc300fd1848e82df53a575f70f4f8d21e7dce35a1bc40727d7c31aabb476e5a390cff49f85901597fe7e68fd03d59297defa58c149f27560c4a13c77ae43e619ab397aa23c7d14749a7fd54d5b6aa5f70da8b8902da9580b931f4589d40536653de6cd7826c855ae13602eadc4a81b5dd5672760c53f85d295cf97fe3c82108b39f220b33b86b240485ee3774bf78f2bb9f050f74f46a610f44ecad7c25b92436485729a6ea28dec6bf06b28fa383e193e6d9e984586117adb63fafec9182420cb8af2c8d7634824fb5e26e332ce9f5614fb3e22d2677a354eb1f596ca5e8c4801e40c8c281d2890ebbd6ecd6ea7ee82229c8451c4ddb48a30729f721e7688234734b310b3edcf2bc26cef22308506d3afbab51fda1fd07c389760ad5d52537f063c091c5f6d4026e2019b023aa165247014aed73b40c337d577f8df0c3b8c3204e249fa1d236d47029e2522c2f98f2085658d69cdea14879592c6ff2a99d30774c9b5cf6923d45aaca98fb4fa4148025d7b64b5fa1b52993e91af0539409a5b750482dafb463dd4e7fdef5cd491ca7d5a45528640b9acbd44765a5259eb3f9a2edbd265dedaabd6646dca41c4913341a28cbd9d0727e5299698a6ec205e5c935339c8d4fe09713af431a31d9ccfe6e26519cc0a54842053c5248278071d06de43a81ab05d03d89e2de8a31053b94a872838e2e78314d9305dd0efdbb43a2812140a23197f81478ce4f2c4254178afe446dbb1aee00a3296f8e358c7daf811e4580e1147fe61d3ed5772e460e09b1c455e721aaa040e64ce39ba547edd8d9254c72787c0eceeef68890f5f79aea5b24032abe8dd8cd4b2568e802ba0b319fae0e3749c45acc8ecff2ef5a2fa2a42c1bd2eb8d4b786c8bc03fca1d4b1539bac25f76aca40d50ca15e270d1f602acabc6a6628e1fc71ab809ab8c12f38eb072a3b4b2a1eced64f9919b5c14ccecc63d027c21dc672792d295add9f29ddc6433dc4bb848e38e213cb357d6e48e17d2324c8bb930d69b0e52f4f3806837866714986c20f5f9cfe3e2ee3616ba0e7b76a7102b61c8ad02cdcffd7ffe5df07cd639e42ec7d402dd182b5a7ce69a023a77897ac6bd1ec16c6d7677a9ceff35c1b4cb3db812cc60cfd058fa0ed1e962b45c3d701bd89676ec5ea33d3b00ebb3cbf65b03daabbedae3acd8a6bf30da929db912163a5e5f51e861296ee4712decd53a53b4b41abe60a50b7f785b005859a2f9a8096176870f3e52d054718fa291ff93238481c78c6cabb9dad3b478711798fdc90b443b92cce2241276bd063680286ebd5df720caf8801c396d6ec3efc571039097b490a2edb380ab31267fd076c0ca69c6a8f1f346bd7027ea716fdff5eb600925aa823055a63a0c6fe2e856f9323612f833db81890ae710d7e7a1e94b02d62026d1098bb1b592bec5c4b78d12777b3906461b5712fb6ca277a1cad424af57d4b1be4bc16338c18770183a59dec195e5f2b99574b341a87475507eb4b6c94c1645b41bbac255c96370f7eda5cac592f887fbd2ece78997d86ffaa5fb5bd45d6d348e4c07b0ccc536e183a018392cfcf7142a1f952fbc13b5b8c389b28244136f38593d02c22e370c6e2c17fd2274d8ac00dccf969f655fbc6c30a9d0dad222226d96b0a7d2a34aa5287d7dc6934e865eb0557636179c495b5538e0008ea851ad1f2c169086abc9dc02d1af00d4c9fd9070e132afb95f528d41b277f2a66ff48151eb48198ee7e65a655088224b9bab397a07ae83d34562e02a75c619df9d0a8dcc8a6168ffc8846b80846eeb6d1c315a88bb184f6b643126a3a1ec56fd9945450adc9e54bba5d35b0523c6dfbd65d5c11d7c3a99fab899bd4e06ea871b779d210bcf6ececf7cbadb219359406e15a556f02b04c9d81e1fd445018e38164faf3dd1fd696f77634bb6d8cca101297e904e4829f9a5ea88284a7e01568fb22478e8811a9c273d604fe21a71f8004605d2846abce83c85d802d9bace1f6011a45a0d9cd44a0058a53cf19f9dc92422b78c648165290afac5bf528ba68197e106232d2e2242668048684e2802cc7b663a2719bb636c24e0628d1476f4d2339dba88a040c0508f50d0564d501c309f5c8b6c017d37387b543fefe55304b8bb25595218aa20b3510ec3c20fe99289dcb6e10508c231ae0fb8cb63eb203c0b1c2809e49112b8b35616b4e9a0da9d520699b496bf32827b9bdaba212fb0c4416bb450e16c8b11a50af2d0223e31b45cf9524a808bf7a844a7684449c01111b94add52a84197d0be4b1aa99f9c57e876b40beb0502e2417471d15c1b23b0f0a29c0c19b31a431463174ebfbf8f49dafac90363c5b897390853b24a6d041c2ad4a15b50bb097650500ec6958474a0530313f410d615f055a13b2ba28f2ef11ab80512569064cb2e8f7da86429e8aa625ff502ace18d667606075596dc5c49cdfeb6a2b896d1b6dd0073bcf93f46c262ae89350ef36586c46709b3df553aab51f709059d96f624467d4ada33704243e6400e83f6c6477a3549e7f420e5c7ba5e5cacde0b277a11ea409dea892e227721dc509619cc10efbc99ac0bf11d7ff54530e73c5b62c55199a13184b75e65b85ab56069fc5027250fec4aaa0cffc348c0ce52670ebf020598b5a883238ced0aeacc631096e377889568099a167abdf9b5fc29e9f430a0abb9e9ac69c86f5d8d7268e29b624329913514d9de5ea44546c1143778397629a4a873ed842b557596c30a09a1610a2ac3d4e6b7791a859c7fb2fd629ef1b3cc7b34e266d36efcc2873da6901688c7c434bb4da140fe3441cb966770c7e95fb30efbf21ab98b5f2ed4eb8f0109638b83b14f76ff8211e658a0cd4fb6051ffb8112514dbfb3a7c622c818e9cba7df106223091ee75a19e973bd6091422b5567e8bebcf0223e0f8f23d9625db038b7691bbf5d97c0fd3a8320bfd35e9c256dfdfade51d4f8098828d1ff80c4cc061dd833e27ed0456a2d752b058c81c4efc740cf22f905e92c11f34ccbd773675c53edb7d308bcddd2668e02025e2a653723b7e088e1ae1d20898b821a711a8c35ca80e1602ae02625b1678c349f6f7d38fbcdfc5d66e3239833ee38dbb79b5e4d66a9f9970f18599b764a4a24aa4f4d7688b55620796a035df01d4a7e4ac929df16537b34dae563f74c00457b6b579011b7e25d1c3df265b1f64fa65b605067ce36f819e833847bdd9ca4bad3811aca4943e741440d4d0dcaf32c9df41b399f4032c0d6718259878b7d5be26cab655a3e74f65136592212ec430988a0cc1cc26267d4fd7be3f632b6d17d4df05495c4a6413e562b318cd9c7eb3a6d13d255160d84f22e9dc6f93a63d3b4a04fa047def6fccda8767fbcea091c3519c9dfd9a12c0c56736320838a287f7e130f5e9b6e1004338d9cc5986ad8e1ba0fec9c7517dd549e11de4913a881303dd63d4ba0afc8910993c823704d02e158260292a8b791c2f320b62491bdfe6e1096459b9a2b1591c6b5080b1dad6654b3f55758e644dbafc4dd60a0452a0e659c6a81270d8b47def3d8012ba315350f80abaf8628095e9b27c515930aa5642d86d4aa3a7258cecdefb252ccc961ebbee818dfab584796b7e1870485db46efaa9590d1215dd0a33a3c2c9be3109b8fe2aa059c97209d80a40a4abc6dd4a0f29c44e65480530a4173bca56debd9481f650fc1c6e4d5f0ec07024a26f81f2caab0c0c514af8a9a4961afda3e6f2567084825b470f13b470c321e771fedb03442eaf0ec603b70bda2b0cebef066996af2177fb63f1321497456fbf587dff63cff0bdd29c90adf62ae26d034b182647e5622a2bd6b5ae6b4a18773b53f8656f841624e933e4016a84ff929ded53e81d8e1934015489a594945a0a3cc628e4b67edc00b460f4b8724b09f13326c90c46819d2d0c85151a00958599f7a335efaece71d2b40b924414bfb722384b6ce051454a20b312a7c0e9b570b8d84e9ec6e41c998f20a46aaa08f6861737452d57b12a983e60f93e0e4608e36ae62705b5ee866015ec2cd531cf347170610da400d6a4cbc7ddf135babf48e8e2944debacd903edb7359699e9792e978cafdbdd2b39cef694c4cfb8a1d71b72698766c049431abea9a56723e34107cf319cb25a0caa16b79e67e48dab4b64ab0aa7adc7c5e4dd201c57e8cd059497e99b370fe137f8823bfeade7fcb4fd757db40377297551920a5734990985146016b98546779590a601e58c5dd4e54a5cbe6448ceb91f52cc02db5aa8e0f8e81e079d501272ac61c455613f5b78bf6e54f9e8fa2a4c9cc14668f550e5115910345692d2f00010c1ade8644794834b0820b2e54c38b703a0dc1c473b2322c79d9c743421ea451fb50e09869e2dcaea03fda94bc541f504aa2de54030f7d9d72ec1d61d657b576594ef7f8c4ccfe0521e465879f8936129169a0b1752cb22734e99e363c3277891f9cd4da48b407e327ac6b1fe8add0b75b39283c3fa94639cd0af0922bc6b08d9497c2cb163be599383d3118583762be67a2383daf3acc8510ea514d79a149fc64bddfa1a6d9b942756655ddf9115279af9b6dbd385c7cbd35e87feba3b5d4488bb8dd0066f3d618cb4eaa935e8ef269b0cd5532b5a19d5c114eb84952b62cf1d53f88f3b3589971a0dd81bccf244993cffd5bd8f7f443939e5c93acf0a5547a4dc1f51bc001bd1f57eac82523b4df60f69019fc7f5f93522ee05a13e3738627af5a1ac02ca06f9847e6bbbcfb6a9f2b75e445aea1e87f6f1522f0e795cd0f422f8c49bbabd5477119711645f67e845fd4bacc190d7d8deb9e9f4d19e2096cf1f4d9e421bae23ce70e89faa608864b89a94cedc49d3c4abe54608a9e42bbc304bf465c515d37102d89f55349a5f339874f56c83739343e3ab0efe89d5352828b82baa56307670db708b83fdade342709870b4c7f5acce3c87cb78a98aac33db95f91c95c3f84c58133aa2a8f8b6e1561b997ea31a7d3c2ac371789ea901708985a405f82a633df2c5984531bee12912edfd84afb4d4af28e757551cbe99d9e59e4b6cd14876b5f1234c4194a4cbf59f004af3b7d00a7b1a39aac35cbeaec923b10f77bbd660a7bb415e5c4b557dee4dfdc58abf02d48b53591bb6b0f841502132840e4dba767c3630ab653b4de5eefed060be8ca7ade5a0550cef1f345d062a3ce10445db48da223bacd9b124ed45c32b2945911805dc3c4a7aaf5403e226eed33943b58568fa36a84161db228351c25438a5cfd74a666b896b23b6395967ac8c5669accac14fbe29daa3a5f3c9c664680d2f72afdb618f34ce4a113c51023c60fb473ce95cac69519ad82f1d2c5bd55562e5b637d91ae951e76193a64ee1562c7b38c13643117d0e65a7cd60855e7ef5c36317e0202051044cce878797063fe9545b97c5550079f95b8cb4351dbd998cac03092f971755684dc337cac4194fcde2f07978507d8af956a84b64f42290cea1d8970a29f45de0ea19442343effd3c1455902619b4e5a4c16de31832e54ddb2db6d5835876ac3b50eaa02220616ae3ba4b201ac667aa9b86e3e9939c0847d387d2dad6d867350cc13641ea9a7771c21eee81444b5249099155e9d9f43f8e8ac689547a801ba6294700d7b7fb170b4d6a1efdd22131eab7880ff9e3396ad66057488ca2f820f8ef58ef7ecd799245d49d55bc162222259e4437a74e89da8c6d7190b76d66267d216e5cf4a97a4f80bd49332141a21dcc6188bab37c3c4153211c8f242cdde090013148068913c6f91dc950ed295ba85ec233000070c0f01fb992cdc44b4979d4c9f3266f700c5939d76247ddc6738d2ddc890afcbeb228f9484270e515ef5520104fca3909d9ba6b3fc114d9fa496d313c4b0e1126d5fe0c87813d4997e9346c1a7f098a5335deccd9903e0f0e1ea5535675a071a42b637ee05ba801470a70069c2143f9e5a84e5d3591da36cf719be3373260b7a27a01f281f1df34a2444fe31af0967cd5d8890260a032b3b771170e27a14c26edb0746e3e99eba75bf4fe8cbdf96132d50ed7af4126cab62290282626e554d4c1260c17c24cce70b781c2a847c828f529ce1d454fce431c81c6809861348794ac9c83779d0b4d812cb94860deaf534c104f70c99a9313468c165db2766045d8a9d18c932d009846b41696c2bc8e2398bc013836c26049f9336e8c42a522e2f554c39be13d61060e58562c1550995270764a85e1c47dabbc5f716836cc71beea29ca285f45e68ca3bf20b350a13a24d829eac5b0dcb339349380979d8a2f4eb30141bc5024e40bd388d6fe018f4e7b30709dc64011d1ff21e8a5fdf95399ebe58032d1636e6c504276a48a83cc1f2814bd294ed140ae746e20b12774564840e8bfde1b07544651574bbf136e4dab5f0eb5e5c73f9164f5090bfa268b4dda8cff6b3c34bbb18037ce4f641dfc21515b4e1044a00863ad0bf5a643eef4736abdcb9e829adc4a204b425c50a4797037d25f5c0e8736091735fe47bb1b3bf0c79a543ef5af1959ee84410c12eab23e0b94a91b5b0c1b4ae2a478a5b1c1ee2cb4115f9309c9d8d1403147d1dcbc0f5b2feab2963601538032b1622aa658bb5607e678ca3a6c936bd8165694a7d83da690587549b6a6b81386ca71c0173256272968dccf5cf982ccd810e754d38d85f51cdfc11834b109f908df06be38b90c4093a60217bbe12eb55a1cfcac955763f7e77dcef0ac511a3976e48511b14231e9cfa4d62ec72bb0f7636d40374ad7007a8eb606281bbd1c82b23feaca2dd1c57d9ea6865efd52ac363b84f0dccb35bd612990f26bc37a64fa805130435a7a91a16d4ad14b170817e3aa300c85636d1909a870f3428189db4047b970baa39a16b43fb4e846682994c340fde7010cc051e7266da085efda34c7774f7f8964ecaeb6c23b4278a51d93a03f75aa84690f8266268169ca6cbd65a57d72f231178440f6ff10b00339a451065dbb28e1b8dbc0731976ec6e2a10b785086b62fa2e8ff4b357492afcbdb98659bf99c4f8ea77ce92abdf85a4e45e9117587106180de1de8db3bb55a9e60c33a96bd3c662aff88ceb3909d578582e5b749117025b9242fd1862b26f820674b28535f6a7892cca4eea9c502f5c39403d06829560361f361f7a96cf82740547197804e11586491957bc306dd2974071e4502caa2a0ccd5aa052f66f75eca3ea3e73cee30cac0950bf6964f8afb6a1a2ce6307cb70ffc3863bd62c248d05b446e011d9ede3486c01170310623f1963ff64eb54e23a232a66194d0d9f05fcb59a5018f160626448098f172aa0bc2649f3806775b226277610bb086a42565f301af9648a7932c73e09a33e8171d313a9a910cd1667e30024644694e58d7b7c72b9da0eac4d2c83fb623aaf3d958f66964139230890676467ede37d02c3d6a0c4b7b6f70d89be1c71be07d2eeb5b4ddc297a16519f14940761035833be5b79184966a8c24be63e67820e373a153584d9787e7a685ea5495806339bb8dce643bfb17d124a2054dc8ba5deb52a5ba38f36711a1aa1f7f9698c5a1885e87a77eb70d0f4ea3461bc5990f50005e3ad04b116fa545efab4e4765e1e96626b202ae9b58a55f26159c288859e237a93ce8a05982bbad8f409fe1c1f4254053e8ceb24b06dd3858273c51281a6d92d87b2b63bc085065c772ac9c9b51f2bbd4b11aaedab613975101e5f9e900b199b3877879aed5d4141c27a7c4a1d0cdec54cf3117ae209cf30b9890f3578031059ee91937489bd0241b828f438134257b11ccd46b391d2b4873cd6244327446fae0e1a423c01c1d7006ac25f0526c6084f883e67bc39d9987b950d35c1dc9105447a19dde9f3c3192517d1574e263da273d2ed0f717afdc9ac60e537e71dfb0fb632f670de2d138785b036ff85c7a6fe8f11ac4717d8ac265bcd4793e18e7d05555e63def3a876a9f939b009746f5a47aa22c10962f347e642bb441278f012a27944337dfbec02cf654839b63423073fc379ac2a959e66db2b27b566792589cbfdf5f294a651aaa26cc28b4c2849240d9a6e1107b76cac41362e617512947cc0b03dc30664314d5ac82cfbfef2883c2e588b097c020f78d2a75bf99abb5e9b9d158b823c0241b433122b6cdba88d99a5d4c9e1c7b441a1be1c9fcf53ea5ee83cbbe6d1e90e92a06e00f515b50ac2d5730d618171a70977b2ba811c919e4c8bf59800fe2d1ead7fcf02b2311b7d8154326d1f0f40e1fdb32fa406d112893d4e2317ab4d440626cbfe1a0c96dcb28dda150618f2985757c43c95c236c87113ba557bbf8aa362867120cd86a33d7779d334c555a76ac27e69d05a12b3018fd4e0116c9c7490a1d0e3fa821723d056c6f858bb1cd14ef0374713f53b6aeb36ea69941bc9d21d723d4de0d2d45b1b698ddf1a0a558f44b7c5403f9ed4a2ea8b626adff9478762c0d20df3c6e557bb949d77b521d7fb4e8270f2906b30382f118eec7c71c3da15466696b0b66bfb59724964a737ca2da02fb603685c78a64c9980be2ef90da3d365de27ef87568da13b50e7fc0080403e0392d304be2bdf6ad93deff240246a5be8b62484ae732844030f916a7e9d7ecaecaad6d506371dcff3171e544bbf8861cdcea29108d95ece219eab4c1b3158814a15cdfeb21b27fc02bc8df61e63b9d6e0850aefa3ef58a45881847955a65be5de88d1f66830f7431d5827245072f43424cc65829fca191a7babbb6a706fb5ef722623dcbe357e75c73fcf97e4d76313b474e267c56a656e82fdd12317f9f4cb526e691c5eaf397e3218d1477dad083acf82d235771b327645ea1c9795c23a72316dcfa79636960d5b0b2b17db14cc2141b720683919b46ac1add683f5ce0d7fef5f7fc70b6c1bfc0fae1c835a2a258b4a37455392bffb190da5ff8dea3d825fba29f8845e492826d0da529c100084a59d0ee5c956968309f0c861ed7b7e4dc2453d9d6fd093b71451aada46165e854ce6a7a32388a61e507fc7a4f5d44062b9043005abec68c19650ac6655a296f7ab346424ae2689036497793a15834f297b972cf977f1617427c0dab2113776c6e441734a3fac9cee3409062343dd48a8d7ce0a3feba1b30270222e54eee8de92a728f859ca8ad4b5c292b0aede5a3c6627a0d918a8a09d548af5ceec00334f31c0776d0f3b59e82d19ee70b57c695930a853141b63e7ae1b0369959e74144d08577dc8ba9807c975781b53452da99452b9cc3cf819b7b41122a2b978288b0447568948da749a6f268cdbc569eeaaa60b75cd39cd2978b94760b1c8e626a6df8ee3e9aa7930d9a294a58dbfcb84f159e99835868c7e1c3fdbd7a022c43f8032029371a340dddb203f56ce196547be3b352d8c54fd07261723832b0a215f54aad9601d145e553202596232692c07f9033fc5a89b0fcbef4122b5831c5a9abbef8185c6828ea72fce645ffb0a1ad5abbeec7722d3693a5e773b9940ba41c1aef4651abb3cc9fe08182f4b422649f6300f8839e1eff37707f24de4bab5cbb8e66f9d6d9b7499999eb49075611a95f19e9069a517f89b6ee02a7edc6a1febb9a8e7602b2e6d6762e0a75d67167dc697b2e516707d557219792a273632d55ba8bf8fd388a3c7c152ff6652c2f65abf3c8c610f52a2875af0285b5c4f2ac73fe54b99fcebff9777129e63b33a475f6c2e9d238a7652b0a94893bee988790765c8f37e2be61df832a244d7b630b9b29b31b72858dc13dc8e5aff54210f900abc6ee21b80f95b2d1bcbd3f89c3efe4311e951542681ab9ea270854738006602ae5bad567cf7ce53c7a3b3ab8adb90955499599362950b90aa107c4bf8544a40fcefc70850260e361179b2ac04a6378c10c54bd85005570f37e853a2055122548522c250a5acbcdc51b8f961f3f7e7fc7cf8b8fd406511c46574e363b38d0da708c6489fbfc8838627773e74c1fb11b268a318ad724d01ed3720b082a27353487134d512720f98b4c09cc0998ff014bf7b07e7b84f27994f76b92827e1644380b88ec254bb9e462462d24c981b838fddc0a9ac944fc84436969c027e1ea3fa0652563f9f0e71281cb2e2811db33efddfbe52aacc23921550e2ea70cb4988f586b7fe6a706edfa9e5c7abab418a21c078ee19139c1497c75eee38734c65748f6f110053c22978d05d0fe86385995c01df16c34dc712c88faf757087e61d513a963fef097953a7161650f47c5f793b595627fd0fd71d7dfdd904eb8b8d75d8c999de155d03098985407635a2fe7cb4a33117ea8b3f8a75942be4e9031a2503013f0bd4a836b32e074d99323fa68884d97b6f899234b094d3870c9935cfc8f7769e40381e0748ac5d9ba1a9a4c74e611a3db352e4e7172f680f3e647589b06b32b7ace56d279ab65adc78fd4c110568cffb780df194a3c8e9535e0504053ce142399c2581c5f9323dba8bfad5d4a0917c9fe082d32ae90d86a8d3236c0ef6eea4bf64a847f4ce242fc754a0703c32df6e69822b633df22d6e6f7df0986049606c0022cec547e9c41d013fda9db424cece5e707ab7500ae12faf53b1478333b1222bec4f41af67b54d679c7259afb365232f1aa149558558269f3a0468e24dd21497af7edd279c3a8f736cf2c485d7ae9906736230714f99a397ebd12704f94dfb3e5401a3e00c1b013bccd58f18e505ff075ac03e8ed335c9d993ae672702c5193643a179a984157478146c1b26cc7e5da0c0d2188d998d6700e68b77ef5953fef87c8a0960505b6dd9f41916f4911705d6981448c2f31fc732f918ff3c15b451dde52e911589994422d44dae2dd973ab1f77e7e709d381c388af94ed872880385d5b03f8e378ac4658ac5b2a051dc6a23943e4944a335842a2728fea8036a4cfcb702398df89ff4061b686ea65678ac4339b91a7824e438026ce940ba547065b4121875fb945aa1581b56057b65882edfc0d8a4f036a0b42ef26e04afcd9cda570259ffc21e284a691ba2a5469668c0b3b13ceee15a9693bdbc6afd071feeb54522c3cdf21f188410a4c1792122f46a16442e4a489e16a4c00489a7044b0a53388912ecf0a473d818b0a1d4a06e02c89bae63ddbd080df080eb0424d39c2083a9cdca04f0700f1c726e680dd7ab5dee3bf3e603464d294415e1b724de99ca8f2b4c9a9d017cd625a04411b83e3758f1078a388709d2d5d20b65d39ca2f702e2263d28d80989cf346b41f2355929b6c42f43d2ac6719c61b7b3f02c7e9d53ac843f880e4852892c8cdbae5abad10cc3e296a68a0c338bccb48d90e26bf16ee9caeb2e822894f4c134c013b3381278cfe92eea0ad7a8025ee129f12f041203347828d1d0f6a6483e18ecba909cc8ad73bee9af4ebe0a83c39ce3ff7510f0cc001e69519d2c7d2bb44aa051915067db951fa3bad7f5d70f01c6cd99f00dbb7eff04a4d65510cde839ad5816c25a059ba6b06a6fa638edfd65912d8f6a5dc36cf6ac1cf476652ff8ee84311931850f1a67c6485ea521b6c2a6f861230589805ebecb9995426e6b27c47dcd072123eba545a5d2af2685a2f33da2d2de9f9ff7d0d15a821f8c4ff50898d047930b7aad05c1a4aac600be1eef074d8a60ca6b96c8c9b79d3dcb220b049a91d8185e611f5b76eec346f842f3ee8869924d2a1ff74f75205a44e76d3dddf921f28fdb9b5e5cd30e9cedf221002b2ef557c626c24f62b0b84683c208ebbd0201c005a0e4bee7e42457aece824431a0b241582ed9650c19b2b2adcc901b52fab53098d9a88824c8bd312a3d6c45e6170e47e314b7da5e2d96cfc04feec0d1adf8a6b5d741aa883d5a2b739957e3d67bc99d52574cbd136ec4443300076a2b00841c85c869907766555948a08ecc0e7abe1504013d91dbe4f70d55a1a0bcf10e8c9e844c5f7a4168076280d62a60985ea06e4b79bee9d702075547f9d6f02b95c800fd9d06d4508ba9f491d2cf422c34d67def09bd60f3ec128d9c9bb9b680ec278bb05ab238578db5e1fdc364ad9c085c96d7c6923026c4fa450872d8daa9fcdb38d0af9ab1358f0018ca0a974fdf6c4a21ad8ac58fd5d02eef3c79dd2f1eb8cc6fa6f7400250508b148966b1d4c10a931e4005a2500e60954d263e7021401b293cb7b3582e5b5da7982b1a92a2e02c83d6495bd50c0ccb8c3b1395724a2f809243677821316399ce091dba0d9bb06abec1dab26d66db48a3559b0cf07d92daaf8084b062e791e7310b71958c9867c4413e693cbdeab50f1e849088681957e8b9d5598b6c7cbc457f94b1eb32d76db872b565656b2305304a0ded9b2aae85eed8332e1a269def415cfade8a3502f3cb09b79fc5b5831471c28e865f81d0678007651988137119f416b17cd02c72a194108f646ba790db39c29dea51a264836457cba186e8e7adaa11651c08d95236a383f38b956f48ef8557055c219b7e01e55bebfdbdd3d4981d64f4f8b9a271889c660b0b5b89d8d0d4435f8e9e2b958049483859eb44e29bf31bacd2a23c11656e4c3214525059030a3aee8e131adae2d8d481c61a72c1b7dfbdf9a0144ee2bee1491287becde87d970b0876a441796f7d89557a445c7ab948f205a0e79a4d1c228bd3b008ee35e00f3502750189206d9d66483e1b7c20ca53874a443a974c805ec01feb142b158dd99a2202397d90599f0078b3d51b939c7bd4ce04ffb91c6fcc11a7bfcabd587a07e619d0d73ac4735de1e9f556697a5dc85e9d28d849caa6a4e8d3628c9dbfd26c9124788db81961dca901e17e5f442c9b49af4d308d810418e53ff8f68dd29a89d82acd3cb076104ebffcf26440b07fe5e724ec403f7ce52559e3a2b37ec8e8344401b533faa9c63d3353301bbf992aee85093a32199e6af2914da176cbddf0b3c04a43e03168826c04b927e6fba8e39bfa87e18f55580b4891f33910eaea1fc86ed1ec1c6f8c966f66853d8698feae24c27844603295914bf1109018b12b44bcf8615fe4f2e6478870b0abcb4b98b2c7040fc3ff77f054be778d88dace17a1882cdf532ef99d2f5bfb0ff266e4931d276227b9148337bfb00ab7522f00107bb0549dad28ce04ae0c7fe37ff3257c3e751f447d9e377e6f3806c824178be50927acb0f9bc954d6aa24e90c4324e159644f1af2ca5a089f4560b0c48897c161385b557e969fda1689995a60912012296746fb720433bbe2e20d34177b659391732c4207f26f8ce774e5792cce3a87b73256cf60701232fbd74700fbf54c05d11ea7599fd1d1fac69dfe9549f472b72c672a124e5702f8e21e10bae5abd2b16228fbebfd69ce64ebfbc6cfdd97332a44294d98d507e86d06e56ddb65a7c427d3eb17ca39a134f8e4976a8ec8a616faba5ec1aab53448daf1861178a4d26fe0632ac8868d771b0cd1b6875e6a8399eb4bf743f5b3b906e4c40728b98f94c765460dcb0b672821a4b4eb069fce35fb12c868f214ac16d902bb497e0a0eab29fac4a8314e46e762b67c66c7cd7bff35d850d26a9f409614eb708538acccd249c9ec7cc914e67293b0167968351b8aa7454f1fe1390821044d091932487406bd4b82b6a3c8a3500d983458b72b31b3ce4131f512422155b9fdab94fd4a49a1232d6afafb1099d4cf8e39325ae24ae1fc0b26748270ba2508437422b66ad69f0591e7fda782ccf4c06b4ade1dcd6b73e9f54c8c2c5295c06d1be7c92b1ab641d10322ff0eda601bf82c6c03426c832512614f9a5758c11c665af0658085775635f54791c804a1c8aa1e8f7c5d6f2dae56b653cdd0e32e46b90b9fa8957985ae61c357d23016b9fc78cb7bf3b68fe16dd4c4784b04609bb7bcde4e01d70965ad7cb0fd7004243c110fcd3b3fa80029ff4e17a46bfc510fea9cfbf4bf9d970ee7eda01dc97202965e7b0a68445ab6c15f0e7c5275da4c4947032d343103437fcd1ceb2f363b221b0a98c9df896226975f57bc7c48a4750552816bf5d6de038533ebe78038b497de6abbaaa99c32dea0b1ed7ed1f124f497ec61b42701c1dfdb01a3b037cc16b605ac85c0c73de839a89a46daa31f26887c83d4551c96f8d79f79b5d620671762104f9a4e250499cb3bab90d60051ee662898145a6777dc731196cf4703d2e4a0b8bb659057f655b74739cf54dd7146cf01a04efac497fb80171cb5d3e571b8a730167cf11fd93412264afb624339814a62c36752893b579f6d1f93b5af0d2d1ca6f0e91ac1ec8c4b2ccfd55941dae505ded3755602b93ce221071dec0087bfc2392590853c4bf925f749405c4c2c79d43b89bbe042888d346575e880e5e8182b341c1b2e9c0d281b6407a38d3c950774eb3285e0f838031ee4142e1118a62c4f24365362d102fd497d44af83057bd4bb996fd00cfe7f6a12f2eedc30e77f9552ac734b6027f680f7656e72cadee04b3cc9049e0415a0c51e2c143e18bb382d7c3ac2dc14b08857bc38861d56da6dc013a02916c658b97bb992d7a7721ae73183efb6a59cc9edd898db4458494a977fa31c1e790332200825415b81ccd7a831f95e761424e7031efcb405f12f1eaaa2e93917be7cb6511a6488c8511fe36d34f46e4dad5e7e779e15eaf27365c6419a2caec98d830a097878639d46939a3561cd2743aa7154df9bb0f886c98c21314fbec024a4607e8e977ba446cf6a1f70bbb4f6a05f288cbd799fa36058258df439657adaaf753fd32929624e676e861d2e2cc3ff758ceb5e67e1dc45428f877d27fdeb70300af4b7adfb79e027ee6ca8b5665006099a816af8f9780cda6b3de93a9e0496cba8cf9a42de917b7696d598beab5748844170d4fd0d8b4c1c185a6b85882326eeca9f93f79483ab4f45b099660c565c08b18970da882ccd7b780dc74375c92b3e5e54291e06ea4bab953bce45bb3341b03ca3beacf37d66878a25d8604a3b47e7842a60bf7a38951858d5ff8a267af0046455b8ac1f8957585044efeb5e64a0481d478687fb2d7bf3002eecd7a05a8a49a20cd28a62ba1eb5c4e90c7be46a1b3ae83ab865603b3fee4717214904b31b5f721cf30e3be72e3b966112fe1db027344d0883fb80b0604b902a3a6d09bb98051d49a4b7ec07bc5878dc50e0f8569a06c323bd7e43c8aec52be0b3755153f54c266e6e775c02b0a08d6f5c976a41d267c444a9d6b5790f9c66a2da7475b5d7db138fb47ef582c812608c26ab511ec3acbe6ecb171d9c401030efa7b1ad33076036ae30d30faef30bbb2bc710fcf5a9aaffe439bb88efd4a9263a151e9eed4c3681bc0c4bae50db34a309c164c2d2c63c27376d22280cf09ed858b8a44909e0b56ccb9a29dd8f50e9abf777ac08ab6b1460fec3f5a1deef3368e8d9f5838488fecc2cd20869e94c6ba46ccce8bc51d7503f8226456866a6cd0d81fbd90eb992634409c2b79015181af9db1de8df06255cc7b05dcf04799834ee2d6a72364ce58db63866d6315be732cec04247b7cc0b1376b317cf30fca1765942b117c8e4ba35b234cd2dacfcf49fee098f79a76404add3247c57ffb0e9e5f779d09749aa979d491dd93c9e96b57d5144961eb64f37cb0ba8426a52aa55205f8202fb84e687357a1c223ffdcec1600d456169cef6bf4da7c8f94fc2daf1c6dcbc8810b5dc779b8e13f86bcd5b249133ececd659a493d23cd7148f80ee8829ae39bc9cc838089e8a9a0c5cf195766add6acb7ec957d4c1c9ea5a9844f4f84f940e52d4604cca379bc77a747d6ca10154e8d4adec5c9146a3c8f45e61959264bc4c4bb6b2f9d20076c1ce5c028c502b540c95962c76043f7c3f06af523ae618d23c122551f9336d54fb0fcb243ed1d348db44d341d09fbfdc2bb9588aa595826b0c03d08e5e442ff470ea358dd264c9b99e9b3fc557f86436dbdfbc4156e1d82a7b6ccce63932401a0e72b13801c28963d4bc720e8127512e382ba80f58b859d8896a9c4a356417c2f49775e419b875d2f340e994abaec6b6c964096e6854b330284b281ad7613828f0dd97c418a4044e2daf6ce786ca03724de60eb72017b226add33ce22aeb50b2ac62362a6e9a8b8e6fbbce0b36a441a71f2a67ff5729c12466a613c63545527bfdf37192614b18867e28d785723d60b88b102fc1046711a7431bfbc2840b2eccfa53b8e1b80ba99b4799f70d4e63b421de108f6fa13a4303bca7f16b500aaae56d686f0b108977731a023ed576044fd35bf712223b0b68f0900f9800fadcebed502fd5eb6f1848398b7b9ec874d70cace55e651c9f14e335a6669db320aef147f1b86f3b9dc104088654e8c4588baa08646864cc78aedd9068ece0a70a68930e7beee3fe0ddc5de7b09cc0c7285bf4363f832717ff9f0d6961c66b1896baa7cb5ff8a0a347c53d1ff3f4b2e06b9da02b1ccd701a30721d637448270837f46a6fc62da7fb1dfe7b4b85f996d9d97e0d4666aafd93c9d451bdecb581f7d56ef684e219215e805a2157409dd77de1d482be9862f876aa74c2038ed2e6154182cb54d6f9dbc3fdd09528fa97cabb66c1617f9d24d70fac0c32a197c0f74e239806f94deb971b926e4b978930c64e0a98a3ff91f3d1f14221fca8d3165d9c7c5a32f29d9a56bf721598d34587bbc2fec7b45e32072ae4be2940bf1ff7a3d2fb52e05f41b94971c430446cba643ad669bde5431082336b1db40d7e6abd5dfc5a36bd938f58fd5a475e5a373e088d9e4aac09f465ec1c74b0e8ac26896c95353b48679ad64c13519f544dccc846446a7bc53433b289e02f1a84fec0abddb0272b6a46f448c1cc9a2c3765281b51709685c85e07783db572f6848402b6f30e6c32639ace363b7096cd5a4c7845266c5f7754cd085a6d314a4f38c68066604e11d0f29d7c2504a7bb1d4650f8de59546c1e54c98d1859c8c9a6c9e3e48b008ad5945eb6ac91fcc26e7c83da65a704d2fa37941ead3a3bed5051a8e9b6ae088b11c3a8ce73484dc4bb3267d8070388a5c5f8b184a3eeb9f344e17c9dbdefd28c965acfa7748ce362e7384ab3b708970ed06d9c49f59ac0463d1e94ff9c161911ed6b962c24f197253619a7670c025145ee9d78b628dd53d7281ea7c532dd395a8e102da6a9089e4e69021fe75b8b516d82b89963834a5a7b0c511509bc62814961a15abe7482416667a49f5881a67298545cdce4a1976225f0e8b2de04920063cc52ff9cca84366a3759bacd1f7e813e7db67141de59e78317cde6720779e8ce45275b9605e47830b09861ff0309e25a0125f47708cb1dfc3f0dbf3d243e658509c789100384556c77b9920b7b7238d53c7cf0a8c013e667e750c41e2e38f1a2abc6e5168ed3eeffa93265c937d4a59c8e8546bd75b3e48e644b3af515e31da6962730ee9fbf1256ee4e3b1adddaf347f99e680ba7dffb5a3e5b7ae500aba1a64ad7f55f2b0bf048c7d81d62acd7473d4e779004fe263d3356eae7e79dc51b2a0838fb1e7f963611647b5a30696c3e99bf2d5d8c26b7129c950afc1598b273ab60d3b11b9de2c37b864fc2c523e3bd8de0dc55dcfa448e02a9430cae5bbf0e18242897585e17d1a8aa0164c6224eb4e69b25596ba977d6cac60f45474fa81cfd0e57339f42b562824870d7c7aacc4918c44156b1f557302260c19a57cc950ece49b61d879386d5bdf2f8fa0ad3e4ca15852b32cf7a625a111303f3fe8e45f48046c715dfba7a0b89bb50aee3189d2a9571aa803e2824766ddeac6c964087d1236e50e7ec4286b529ccc6f0f0d96d115a9f9d07bdb3541755028143cc4acb3ab9afb828f207533519dfcc83b6fdbfb8a186e7230017d5d8ea1eeab0f6e8efa0b1a5042d103ce0f7594fefc64566150ff2e73501a65e9438228953e1fa04856507a06a099facdd8fe45708017d3b274bcb0aa1dff4373eada22cc371b1dd72706192dc7f3d5b6cfaec507c1a27fcc7f28d8f9dfbd58a639039edbaa0021c22a4c72c4b1dd813e2a2c54c6d062aebbce8f4c367e033d4fe9047c9efdf4c844c4e34da65ac778fe0674b94217c667786c212f9b48ed3984c54d26cae7a746f59d72c34b36d9fb65962a25279ee5d8cd9c3693fe8e72bed649e86651049b2310d558c406ca42865ba760c0f62b3a11d4ae2f21a886abae986a9f45e3639946d3193661a53d2a8b979b2311939236051caf348de3b2e55766a1928e0bd12f57099435a35acedc6ab9d0ffc5aa6474ed38764aab07ccb1f021107092bcb4377f3c651d0a276ee02052fb427c69c5044ac7267d44abb89a76723097bce99412922340c0269fe62e435790856a0b79575bb29372b4d79b88add18bfc0646cd10895179942bd7aadfe8f9483b2a7e942d1514e2621c45308a53ab5234c5aa01a13d64391c419f7aec434484d74dd9986e9c15e64335401bb7dbdbc4ef776d7abdc922e185363e3305a0d31a1a3b37ae902fe2eba3c636c380cb3fac59364847dd4fcd74bee98bf5eb4ae132996aff612360158baccb1abb2e83a86871301456ecbf61b7fc3302a2f5664873eec3d58bd49e6befc4d7fcc67fbae985cd8ae14f08c85cadf2dd61be45ef78667038ef3bbc70c6a39ac3227e3c217c9742ff9b3308139764d730e51aa625dde34541f0dd28bae285b8c5aaabfcfaf185a96bd295e4d5e6cdabecb762916990480398c2b23c919d5339ff24200f1aad19618c2f1d392e653e5eab3c923778c3894318c0726486344d663c4632e0b63e7340fb28c84c61259c4cb161bfe39d982e5c43f400f474682d7b1ee708579a880dcb969bc0d19d7df69da2a70b5c2d27eb91aef3c90d99f9e269ebe151c57bf136fbe0f829907f58d4756de3cbc2f830f8ad280caaa8dbb10fea26a5fb12ec61f5e106840ce476ade1883c74dd5f73f2af02c6e716bb34cc3af376e324b8bc02c7897acfe95e63d7330820e0e9009bd6b2ce06d6890f8a610abe108aac60ac7f0b1338dfd90b2d6fddd8a0faaa1ec3a92434d3209fb44b8c1ae53d7d48c5c479354899afab4005ccf847a6d8529ae4fa437564e795d8fd10bd2b6323d2fcccc1190cbb78078fe8112418ad23ad00a27d37b0528bcfbabeca37234f1f9e8b3c6a3763c84f68246f452dc560ca9ff0176468bcbc2e8fe272ea544af1135cd8b7afbfe5caac572213ba704c4cece41272d4bba1be6dc9e4c5e4c76622d9f0f49031f4f696230dfaa6167b47d4036bf4a18d96103b5608808245b962c21dc5abaac80b046b894c6b2cbe5cf75f54889ccf8e01f1bd2804f49cddaca4a9cd4d37316c5d98ad215109c41e4ab3cee93de79899118a15f803193df780b6c5835e4d103e9f0a4ee9be924bb0c4b1e50de022490213d5861ff8f809a16e2cca36af5c50026646b2bf7ec096d7a6bbf519f88440ab4093549e91f518d53f5c18255fcb6590b2de8c12712a35316eb07da6bc25e333fc5ad4bec53efd48a477e08348c5e54f2916f7b5545662333f0105e291aa4ed02d892568728164e88322ea1fbc7fd2b5217288282a352cc2c53928e905492a850999962b170e85950d0f87e309e4b7ad846c702b205c876861e783431f3742e6b8b94c3961b3c323ec8f84b328a1f36451c5356eb1ed5be4a85518b3740c59441b0029af3cfa94e5eaac75efc1a76501afa101eb117ca5dd35846f59330c6e05a2ebb3224e9ec2b8f66f103511f09dee8b7e4e84fa41b43a51f4bc515972ec2cb6dc2f75cbee41272026828c218a3705d5e5c812bf3d1e152ad3a496fad171a01e106fd7d29f4df4312f8a83dfaf02d148c1d4ba0819f014b2bfe4424904851dcdcea08a5bfb2e6f1bcf8d330cc02f634b6e8e7d8a1392ebc75854fe7503c3980a2537ec69f7380c779c32905f41ed1ecbba44f8c242554abf537d841251ed58f525e29703a4331d1212cbd584cb0682f2e5e1fe4aa623224c6363dcb5692cda9e787a10e50adcc7bbed52fb21c0c81db90bbbe6e36e1880d2ce303baa2ba7f5430da15a50d41ca90d9550faef4f21ecc2c7295819661c5b6b6105f3a07889ba844ddb1222f1d04f21076bf6c959e15dc170872c91da4a9af56eabbdb086b5572c2d1239c1ccd2cd9177ddb4d2297567677ef4c32ee07bd0733085da9585d3b1fa7f3e99cb75adddad9f451de55a5d8936ed3d65a6b1d5a876e2daa5eece76710db94563af5a707c53f24ff9882ecb3f88812bc33359c01c8b96a3ae13a7f3bffdebd07dd7b6eea69923ee79caaabd6f7a874574d320ef169e2d3e4a13c14a84cf93905a7afda61ace4c309a15c52905d291b8cf3e73bce7294babd6fef43bf0f990f17a4fcce3b6aa17bcfd1d94e580ca382c4837db46464bac478076b30a567eeddb50cf7aadf9ec387ef3ddab00c6ae4b2534e79c4982735d10902811c647580cdb010209331ae172ec6c5331cd7cb5bfe83d1b01219176776e606c099f3c072809cb90fe6009233c7613338387397a661273eea1900b8009caa244b9662c48891da04a32836e204555daf55f43622454a93c2b08a37ca6f160857799a8400c45f0200aad6039fd99b1f6eb84db7238da6f93499e2a1160fe10dab296930d0a91248595c703f00c1e4d5e8a8e1a18725fd6c76e8114035a4f5340304e056358488ef1080d57c1a06fa12be8335032e51979c401e82889f075b094789250c42082773ce27a383cc4fa36947a66771db5390d58ec8e6e4e1485ad13aa284c57441b6347b738d0822a5de7befc86504a97bef2d42270aa8deebf7fa8bbb5074a5857986c8fe1a5b56f994be2484302a31522aabbb2219636c5d50152dc2653e4f8a3cf31923caf353191b3a45f9b3371413e1225d824ee5747e39294967ad943b7b4351af54d6eab34e497d522adb63ef4d2a298b3ee96f43580ee605b4cc13486396b1927c480e31fb8495b2fd372b52ca586355a3a758d260e0e85e289dc2e0f288e5b89852d575ca6e159daadea553b640228b3731d649e78f49ad6aa3cf6985091a458d5548a7545d595979e6138589af158f6a2f69348da761a0c3fe6130f0f22c91f2b21cae11acd0ded82a462e498c420a779b9e6c7023c50da7d00ad04a45ade821023df319430dcf6c5a64c585cf7cc690f24c29615483de1a80aaf558b7e78e927c8d95ea15ef0040d57a1a0f8b43161e23d4a8eed4468d15e52bb6477f0d8a0b231ca6673e516c50c36d9ada10d51b15ef1040d57a1a0c74ab620d4649979cd800591efc52dc708a436da9a0aa19a16a47e01ca0e3d03ff01a8d7e2a8b35cc91a684c574010717f7cc270a0a402e55f450d57aa8172b9602a0c68a6271e5339f273f5f2bee8246004496d2a8b1a24f6ef4e8b1a5e2a737e80b2ebb4d5b20fc2d8d062ca6464b9c22498d1aabf64497da1116031d3eb9ad0736258d02e3b24f2eea191b2189040ac8cee06155a7a43ad99b48c2c1a7e340c261faa4b5faf466c3f99b0d596b75b9d2dec459d58a9fe812f48946e9d4a552ead335d61a632f14f568d32a7bafd88e1afd346e546c8788a5ba9acfaff89822ca725095a2aa8bbaf4186904d2fee6ba90a721278540d4142510214fc2b13eddfaf4592f89b2971404b25ed99511cb21472c86468cd16facd535bdca39417e5114444d34f21c55aaa22eb8cc270c237f352f3c74e686a75d3cad15bf6cd2e7742aabe9743ad76a5d22786ac529ebdbb1d11250e29286d370666f68380deba74b2d4e83866306dc36d284e0c3c5153dc3fcac69b89d5fc1e297060d1a554b8bbf8a246a79ce396f69711ad525454ec35f45922d4e8a2d4e822d4e12b53cf7444ea3e267273de3dc412edcf6ca7668d00dad388b3712321c0a0da6c58f4a3e4674a98d2071d233226f91370de76f8b53e3695897085adca6b554cca44b228b9bb0139695aac9e8285543e99fbea29564d1a5eeee694f949cf0226dc8cf4fa97b06b7bdbd7d580e26ecd35ad836c10592673e5b54f1393cf3d982e78de0a14934e72a4857232cd8c5bd9819df427a8679be3d088fbadb6bbe5901574a0b08e81909f7ec241f8ce4d9625cbc4c746e972ea53fe96dad9447620544b53f1e9eeee96d3a84b0ab23a007813818f8be010402cf2c060857f9eec161bc1af6d080103206196c61cf8b970ec4f1f034f141224e8d8fd6258297ce1b3f7d221aad616bedb927a36b734e737af1d0a9ecd61cc9c1e61c73f86484d039e8da8d73da1ab49a6bf54e9f96a6d1ce78e71a7ca12e11bcb36215d8baaf16e16b2de594f2453d03eae6ac756b5246f81aeb56b5e598738c2980ba44f0a3f5e4e78432bf0749d03d0827274d534676d0716b7975e0fc31737d45edc9ca5f44ae22c286e974537cd023094a0823fbd5a469b27352422821a45c5d154425a269a8bf201aa6014181719947bf581339051eee8768c165cf2ca3d801cd038a977e736ae432a7b8b8fd337d73ba52c2510a63be3bd130ad4bc6fd028865e4320a63250d2b67085de762b43ca03b87644c28d3f0a266b13fa04b7f729a95ba2ef06853a68dba8aba76a270fe18a398a0ece5a63529bed41cc575e99293edb27466099ff451975ca210895cbad422945cd1213e64de59158b69d6594c73bac4bd44d4c525e67e73ed894179983393babd6e264d19a16b4084b8d69ea357a03405445c25ddba58d43317130d3a83cee07b39f0771ef31128ad2848c211a853aed2026c47b548409dedb0e91e3598e6b33660d40ed06e914b9dc6cab64774e8b412f25c8969077551cf3c0a300b0475c844a42e993d8107029c75fdf0d3fea8ae1faa93f2c9c832c6e663fef879a5f41a2be797a493892a9aeccd4dc165cf76b4b35bf7524697feec8d7496113ae7573b7b9c4893e4a4935ac6179fb338b652da2c0f16060ff6041e0878e9cefa98a4ed21f3535a552865e232da35c60a3e1ecac3454920e0c1397409301084e0c6432b87ba93ce82fbfc07faaa745a5dd375a6a74ea71856d0408b1e981856d0800a4fa71fd3cfc9e10fe92cdd05652f947575763367ec2662ad4a2f3ee48542cd55f76aaca6b3954e61d042215bea12745a25b53d62755d5620a7f559feb2056ae9339f2e9a3cc86d9ace96676f6295538d3e4038f21da555721a8257747be64916caaef8f41596156ba97a7b4656699d4690add8832aa8ed8b1e63b49405f974108420078140ce2e4154ca5f39e050c688897a44edbc083c8a8c91e4658c54e7246364365aeb034a1ba3cb2a3a644ccaf8cef8c95f73b637f29a3cd28a34413a4d4ebab64e4827caa5532e5dd2294eb2a244e8d2f3e9b2870d9b7616c706e514e5a2a626ebda79dac465a291a3d31ab118e6ac8abf6ef0d445bdd0a95724c9a2945775eaac22d93a27c864942e9d79378d53464855e198e560aa84e61cb31c6e0a03b5c5bd5f2079e6e385cfb7d33cf3f1a2480d2ecbbcd4e0d0c172b4275314701d8b0d6e73d7626306bfb5e65c6baf0989b03527c1f69e7befb9ea3914237f81be79d86016c7c6c7f65c7b43dc3a73edd9ea003b460de6b2981e8990701bbbeb196a8451206b290a44515134fa15ea91814c29a5ac5eab4f956c62da1e78e0e24a6ee92bbad34481aca5281045c91a2deb1290ea73ce7904e592e95445672b239d738228dbb07893e2c11471403df379c203901552b0b4d8686f4015bfe502042d0f7e90d3952aed4d65b9a25088c5d6968a77509ac53dc033286041e429d795ea8706532d1e588afb030f24dc153ba916a72c2db146074b9d1525c26dcf981003281f7db2d420065af8e994469d15c5e2ca8a1d8bb3d582a5069349ea1ac147eb872eb1581eb3eaa125246574a851a7cf19023988b2d7a7dfd0a5a8d165f666e298a36779f6c774ea227bfb43515629a5b75af98bf5cb5756ea4467c8eec062d8deecc062a07bf193d3967ae58d9cd568b637515ad52e49b7724ab7e91274fe5ab18886aa7ce2e4d9532bcc1a2505cb0f15e81d2c160f0de687235ce8363bb8a8067549279ebf18b36829cbd84fedca08a2bedfddb7a5e56bd01f04d25ecaf7a6c9923a8c2ed6e6c3824edfc4ce3f599c1acf16a5fe1c8be166db4db6d6d85be4d65a059db6d62c192a042f90d1ce5e7af4add6c8e8305af2fdcd8abf2a11dabce6893684bfaa73ce0b3cef5ce4bc60d416f772cdbc1963cc720cb8ac59c5beb92e7d41f98a7bdd118ef6f962c9777f6b80b26fdd37f59b31b62e8aeef6e28b2a681807ce9b539064ccd9c8f3b3cf1848de8767356b0c9e67cf9e7237e6257403979df93c9932639cd6a78d31fa9cd07546a4684137b5e694d668c6acae203fbdce4aa7beb4a2b3180a77837eb7c784c26d9f3bcfcd0d99a5eb8c9e59ca89522999bb99bb9293db343a3114ecd005478c30aa0006487a0ae70d8323efbc1d4fbb665e7370dd154a7a2632fb382b925b6b70dd133dc324234eb4292825f2ce57b0b80ca1c59a4ad566548d874a6b9ef6e92554a075d5170292788628c288203d03ada6d22527ad36a34b8e04ad36a44bce8bf094d1944b0614d9ddd34b846048baf079063cf3e9c2057f64aa74348cf326a34b4ae990b4240de3dc6794c53b6f57bc731252c8c3afa6d254b87b1ac639928671ce446649c99d8caa75c95c6a5d25d9d3aceb2e9998709b5f4cc5795391d6e4a6f40c49f2f49068f191693de11f26a367a4949e894e384a9387d66b4c4067c415267441e4999297979e89ffcfe5d975136125f63b74b10216ffb513ad270ae36a867bb9672afd13c53171a393e226372d61e2cafef991d2cc68283dc3a2903185ca4cb3984a97784a2fc1c2bdfa07f2c54e3469273df3642eb9dc2a1c3253eac3529792702fc7fc858ff40c1fe9d25c72f96b196ea939d6d84cf3d63d5ba06d3ee15a8723277bba7ccbab2d52f5eaa2f315a4cdf79a9c2415df738eba8abd6d15dfe6a67373d2ea39cfefd7e7f7dfabb3ba28add38c6ed36484cde53dd7ed5c6b23d0e6ec04a4332993724e2bfaacbabb75f4a6b0b29d52b88cfde8eec747de4181bee90429a58c702681b2045c4725645109d840f8758ae89223e28b6b39113a38b8d7cb555f70e8a063879e618fc68110a267d8bfa6b9a23550f64263a5d6d6c71e637ca4c94a2b6625475889b5acc492e22ab1f8a761decfeb23f475bf7ed42badd8f39176e44863662a448ed81e422dda4628657ae45eac8452a98fd6c952d65a97ac54cc88d4c8de502acdd3da3de9d2f3283c250a19fd9ca9b01c54471bb5511b71a3ed2346e9888e78765c29aed35b711696076da9ce723453798d837ffe9a19cf613b65b137b057a0bbf7822c2be9ea08fe28cfa38c7474e93d9f8a5c57fd91fa79106bf560df0d69354daf3e4da09da7a0ae77a29cbd99de94ba86e28abaf49c7d85090d195057e43ad77ac8771166ceb9b2207bc29dadb53939430be7d5173dfbb42e9dc73349971e74ddec103ee6eff79cb96792f79a2be8524a67965b42e708db136e233d7fefdc7115cf4af88a9d89611be6142ec8a5b7cb3ee175e710ca9469b237d0eb344d534fa7216796563b1f4393bfead2336cbad5c5476c0f3bd07ab5f3f2c9156770e53908618c3146bf4f458a52f141f8987c2e382884f039aa271f5058d333d1998f8ea6198d4644b8d7e821f4918b3ff4696a35b6d6b8ba2a6539462a9d23fce1c213cf8522cf7c9c38f11788827ab027e174119f674b9ef9f456c91ea2478be5e01f584c9b26978dad8ff8742699dca5c4cd645d3bb2cd283d56730a275bf3e8aad6a23b07247e84de634a4f79ca0f0992be7715eb921090b306337ac7ccea1d225f5d67f4b4db036dc43b9d7f151056a54a95373c0b09f7d2ca81fe1ecbbcc818b0286ed0e1c1167ac410824f10c0c84116767e30c40b2ad6508532bcc1091e58c203ddb0a0c353d019c20551a8e10c4ccc808c2c987000c90c8e9c600b28ce5892630329dcd0c40a9e48b182897605b6851649a2288314dca0843578800d1ed821528619567481055070318466851a6658c1053ed84113b468824e919c2a3a3b88a1e40a2ad8e205469841b72a5c5ba4c007615091832151e4784001392c4a33a9c55fa59d20c8e0085d48c310923859a2a631f7d0840d6928630a2678810bae4023920f7967e1e6b487fceaf61010ec2d06936f0f396db5d91bca1be59432d77ab09e67b12ef72c4e4355fb93722ff63344a3e1210d139d57fcd2117dc899f3106b5df29fc5611f2bded615f2151667e941f935c3bd58cfe4d69bfb88218694a7bc5d8c9e07f915a38a07f98d34561e0244744a561ec244b848a81aa24bd1592a228a58c105a2d69f3a4475686f2a5555af1eaa82e899ea94f5007988c5757e25545da20f39db1e40b8ca5f97f60765b92e8558ae90335fa97242968ee8a54f161c76e9b70ab94d0bf10079ef8831c6183dfa54e5b45fb7d5d56eaf4f4fcabdee6d3443344cf448bfb8778818721607e4b7673ce431ca100b5d06133de4cede8458583cc690db746309552177a14a3eb9a11e218bd3ce29655d4cf2713de4972564b138db1e2ba150c57ec522f9607190b358a2a75c866e455555f501d15f3a3f2dc91ead1c36422db1c5164e6083cf0422c006243018f68cc1c830908451c50fcf4336a25c0e5a9d4d2097d554dd44a7b59a3e6a343535315650c54fba04594d4d8d75844eb806266678e8633cf48b7be8747692524a90cfea46fa446b157dd4688270c246ec444a7e50c54054acf8894ba2d1b01225549450612eb01ca0df8abb6025e8ac24e42376c2846bed0da2d1b01327954d82c140675418154685b2b13df379f284055dd1bd4e00e3274a8b7fae9327ec2424ab145d0b02896a64aeb658f6c2436fb2ce394154ada015284cfee22ab27904d084eb9938e79c37b509ef3a9db6a83b86e6489f3e489fce608c55da59abc821a7f2c6f943d5cbeb138c51e4d9a9323c7512e5ec6b8c5052687fd43846152fab7e465be0c8856a021851be35018c2f2606c57941d6ae4829ab942cfd8cef7bb2e7af1c64484ea031aef8755924376b82a51a42c524f215912fe13b5626db219282c5572a22be63c545d590257cc78a45c477b058251e91d250484e20939daaea52521a62ce0a5b1b65277b5bd53acd39e7c8c54e95a9c9f2984fa2fcb3d39a3cd7d250ad4f56335a1c1b4f2929a56493e7649eec0faee88c94a53a4009fa14b7e42f8d8266adf8a7175a996d8f7eafb6870d8b63a3b669c5dacae69c93068d00549522f90b02b5494e705de5afe0f253135cf77705973d75c18d617e4e4487c2f3ceb92abab3cd47229752c9bd391d99920b921b3b5a5db214e81d957754ea73afca72f0eba9040d0c297fddf8beb5b5769b5749e5f2f388f935c7ccd15d459a12bee6263a4d30ca2e1ec6d6ddc088410c9e6bfede6b56ce7329a4e5e063bf5a73cd399174911339e722095f739e289421e57178e6534693a7a047297daf3ae239f354e341cf66ac0374700ed0d9a394d246873b65d9aa86adc9ba46d2bada3767762921834284118d66c5e1f4285d073ba086e5001dd6fca8d1ac5836adc1588a081a23a89ea95a4574e9d91ffe6ce97409eeb8bf43d62517be6744cf5cacc7a629a552ca67af4b60840c2ebb94876eb3831141e06cea0750b082cf129c77fb04a5bc20f29b5f933b1c67c9e927a7927a5bd7cb1155107e3aab88c37b394d87bf1819fffc79f5d06d1a1b3dc8af1bdf6a7c03f905fae68dcd40bf7ef5b7ebcd63b3aee9ae92d3dfd4e135bf967bc2d5e18978362c47111d60399c93569ed7e0e892f5903f0f55b2e2cbd0af1bcf56cf268fe0bfb55659e9e5bc739c73ee79adcf75774fd38b315696a33d7b5d0219236b3436aff2dbec206384169362ad401910d21b936f3e7f580f940d06b2c52141fff4d211ec4f4aa9e347f5cf1a41768d4623191b339bd6ed5229a5fc9123df7bef59b74b58e8d0d1336d316b94ec9e69ebe287300a095db2d72560e8350697bd3621e57438e523c1df708a024616ce39070633fe720d0c53be5d7fb9180c1f309ef8069d7cd3d2503d387ac64d2e714ad76455c95e65bec9e8e001882174921862e48929aee8d1c209550da182e24cded665fd732bb2ecb537d5c269a7ce2c0e09704c4ea7e75a3e88c3edef51d8ac0fa52eb958384655dceb053a0eab645d48f027f976074611eada39208ce3f138ebe35a40f85f02584c6b9a1d1e1e1e14ec20810e322ca6c1e0be94a44c22b42b2e190a6a4c1c6b9259702f99ef8b2de1610c2860c1c33aaaa8e482c30439f84e2b38585b1d0b6ef3abb66307b0bf82bae6ce9d6b13bde08c0ca7364d241f3c339dd1841e70fdd281b50010e099534cc343836967ec5197d5cd73ca43a32922cae8b1bf8a36715b4bdbecc045341a264224ca6326dca461da2f3fe129283872e129aef367d1c749ba5485739ea24bfdae56e2739c47ef9ececa2b6ad45521f3177312f696122fadeb39354515948c0e325dc221ba9e53cd0d80ba44f02ead8360e72f06f1d3175bd677e374d4ecfc45db39eb12c183689563bdbaea9c748fa1756859fbaef6d5195639d5adcbeaaa2c059643fbac980acc876a892c672257f8f6e631903473a1c51216b3a408ac9f73ec2cf3ab48749a514aae0ee1b3ecd099f93dc9d5abbba8675e7b5c68f1179be1db1bf76be9fc2df9b965e6a4504d00283f532079e6f363e48789b7cf7cbc6046eda689009d52489f15fc4293673e3f50fe00cf7c7e94bc37cd102a22f4e72ed11be679745951019d59972ee5e0426bd446aef3d63201ad724138085fb3d893bf74ea92363bd2565be59a83817368ad0ac2f9a9ab180a43e9927bf6866b739bc6ce60283da27acf702f91b7e390d1a146240a82c1c082701b7347eea82749fd41ffb89e6f4e74893d6e4e74834157cd48ff341834279a136248173534fb0f3a2f8cbd132fa9b8ada3b8dd3fed73a9cfeaaa50c6564956e2e61843079b83b0b5287a2aa53b29252bb16b2f9dcd2426d743238d6ec5759d9aff40cde7300e2c37b8974ecd55ad6779b0259d7fa0e62f1e3ec75ed6ba6a62befaa5c357bf445f5bbe02e0eb00be364d4badde52313b889dbad6dd74f955806fa7ad8c7fd069e57eaa3e50f3cfca717cfb3161e49d73d5a7ea7af989ca08796751e903192a03659c0ce4e9e02c7d7de9f252f4f23618233f79bd934f6b9ace427c742ee1dc78e9ccfdbc847c748e96839549146444a2d65ce604f2257c07e59375bdd6a8a84e5554f0e4b5eb8f589b753926ab089fe5dac8857af1277270190745ada2243ec6fb835ae148e605028fc3c99e0a870e324820f00dbb3d8145d039f5e6a2f5257c471d392aa2d78a8ae7cc8fddd39fe624fd4dfe7c569345677d3ef8d40e4a33d288747bbba89d198648c2cf08426af200d6d8374996ccec358de6874651e706d9d9ea9e255d6affa13e0b475fb99a6a8648c20f9c8dc88c1142e8eecd70d98974a92b927bb19f22748c0892841012ac698d897bc5159d452be99e2ed5b4d7663f3d3e5d624781fb3983a8a7c7860736a387d5a5230b27d08d466e8d7a64802df8600b67b8ec538b7b31274164f13386915aab1aee3592227aaf416b879a2e75652298948b3d991e2d0f0fd1312d1d5dea765bd90411d2a55ab1778d4652de3b1ab9974aa3ef11954269c3b48bc420f978de3cc75938ac52b3d470d993f0c1d5f1323ab8388e979792371f4aec8284cb7e8d8c4830347a466d211aa6e545e2a14b0c840e5dea1ae6674374090d5a3cbbbbf25e4b47b4001a6811c6935e483548b8cf39e3b2f740c395e2a8782e124d2e5df34a391eafea8c1ae5de83b04208a5948fd2ea9837f99ef3e6f72a16f20990908730c9e58f7c9fb9e4501b4d74276a981bdc9ac3dfd74d070ab8ee9b1afdc00775e70efae4d4779e5e9ed507469fc33e399db5fa65149595ad240f0a54a25c67f4a14b862c1288a2ace64e4afb9e7cf6fa6dde986915895a457ff8f9f3ea6c7d9687c38a2d27257bb63c286595c2693acfe9d3ebb482381c085421e1b877eede5924e73befac6be7bbf22eb9e62fceb97fe9996bc4bae4da4179132d12b4ac6a61417f9cab6460667e3eb8719af2e5a7ea1abd943dad4bca7b5f4d732fefa2a40c3048cd77be7589c970d96714eed58608d1fda49f38f1177bf22d4497da8d70d92ff6c4f13499a639f973faa6a94a39bdf7de332284e92463c244c4ccd3af14b5feabef31796998f6a91a35f62917b62950ef9969f174f9c1e59f7e8d465dea51953c1c09c7397f4f93cba6a13e4d54be3071457ebdfc853ea5e59e571ce7cda150e4297ddd96b43e40ebb5cce29d2779e7d7ce93f104f3417ad239774490e88cc520019db53beb43fb70ed20e19eb118922449ab01892f81c427e1941e8b612fb956061a5d3e772eda34f6f8a3c7764040ff9e8ccc6ca87e51773db824eb3b6f2dea16f2b015937c58a7dcface538af2e7543ff5f102c23f9d7b305aabd66f7bf4e4d0de40323cf1369ef990a18aa7b5d6aaf9c423daeaeac13e47a7dd7ea0fdf5683fb9b53d982561457daadad7ea88202e8b678218499e4d16e74cd1de3c8f93d7384d553f7b57e59d12256095633982f0df506a01e12a97123ff9c462d82b8b61573d7bb33b96a30b68eff0fcf39d2534e747d8fcf31d16c3729ef307b4007cfb11fecc8280a3befd88fbccbad155beab4b89127cf3347755721809e701df7e04eb7966b12a4f5dfd2886fa8231186979f5e03acf811e5dfa801747ebb2ae9df90d1d42875c8532b7c6da2a012b82b9593b5fe1b6d3667bf0e8ee6e2f3df85b7b61af75b7fb6609b1483ce433678432c6982527d098b91988d3a1e363029e2f9867b1f1ccd69de52c56c86fc51c55f17b6bcca34bf6b582cfc6c3f75a03b52b5229e7778dad53bffab9fdf5ebfa159fd9baa0b767a7fc564704b92ffd3a9df686924c595765395cf6d925887bd6064d927249b9f49bdac30e8ba92c66aaa67be736eda6bdd62086430852a1d0a9dffc8821dc89b7c357e418718738272d67315e4223002fc98c3147d53cf388ca180251b652eb5e9d7f0ef95ad79a558ef3d63c0c49fe0725ef13c5c9b7f7c09ab44b0863664731c8af067ca4fc4ac047988fd5c71899d1c816fd3116135db69a9abfa48cb5ae9275f968b2ae2be5081ef6b4544311efa64b67d6053d4e291963fe2ca6337ac67a0884d7f3fbea6b3af5b99f73cf716b2c4ca1b07ad4d520cc1d83425eead41be6ac9931abab50aee9120bf29ceb6e47c2fdb3729a378fd20b102e6b5fe068332e63ce49135713c4b9e8f63c1ddcb460e79c73ce39e7dcf376ceb9578d6eed5bc6156d04cd00eb1202283be79c748dc588ee5d278a57943e401fd1a775358ff64636d99ae522741e2d4ef3015f0e10da16d467bcaec237e7e4a8743a9dce699aa6ecc662588cb3da13f4c2eaf23dffc1cd91d972aeb1be9cc57eb4066d63f2227c13cd102adc9bf27a4ecde43c5b29653129dbfe78cf71b3954e53466839cb352b6897f8a524a74fb45277d5caa1eea8559279e95210f7b206bad6f12c677bb8da73d95ff8be7416a51ca8148e37643d0a118d002040005314400020100a07c422a168342697563d1f14000f8f9848744c1a49e31c4761cc186390218610010000110199c1840d44c4f0fd9ce54efa11a6e3c8578e960180ff71a01fff018488a33dfc0dd6f669a5e811224f6858223aa40953582afa032936f182fcc05caf1542b4634bacad7f253a33ac3ed038508a0eea109cb6011636969a22db4ad7c6f430c0286f9bbe7eb9a3aeb13405378812b22d75f4f238dfe97091663dff24f6b205e3b2518a6003efb0c1905bcbc6dd5730cc93487329ad59429240835be2e0750a9c695012ca2f2fd13b629826b7346499734b0cdbbc0829af1297a1d61d8ff81ddd8ce61d6f2b4e08fd1a61e948592df372e8e5ba9e63eae5437680a364f9cad67e6c52cb4e92d93025c3d00975e560cd81b6ef73585d717e87f430795cd1572d1198bfe2ef4b49cf88ea4e04c62ec53825ab98bbdc3cf6910b78e746042d09f49468b834f754f6cca3fefa84bf037536ef3c1a4e8e60f0cb3fe2157d1e4f6fb58e4d117f899b40a9f9d6c7532e5a04db3f7b05ba5d00ac9b2e67422207d87bb142f0d6f6d5b3f988b914e8db8c2400ddd6640f5fc784c1b5aaf49eca295b04ee39c20954ad235ffed73452cc81442e051ae3f75347d20beee81abf9ad50f653b504d48bbc592b5ed5caf9186012a28408085e0415800892ebea804c9a25bbb3695055d20a4aa26fa0e156738885344d15e2d60a97236a9e3351c8b9303d01b4b0172f5a3cc3ec4e2340d1583c2c5f3b734b220fd07e85c3c73febe3eebda06a0d62aa63a3c51a9612dbcc48a61efcb27a0d36f9d91c09b4dbbe3bbe44fd4e9ab1124187ab56ea32e9b7749430aa09dd7781cf885dd39b1e950cc14a672db8b253a69bec43e49346cadfdc34beae827cb20563296b4c1f0a7182222ce13d33c598c2678c5cb5da19bfed77104beb4ab9af7c9521cbd55e76610c17eb6b0888f3268798b02b4f33e33ac86e36d69fad70f7ad19d14a5d4e939bc20728193ca07f4f2417b03517f940688c1c4a8639b24b0863d619c55e38e93a50970be7d1515c8d3f011ba9e3ba2bd99c42f717cc569e3240b2bc54d18f066e48112a16ebcf8a8959fa1ef0d20a905d7f8b63e7298bb38f87c3bf7c334a2371ad8e2d63a19b501ca3f1551ed878014a49c4575ee47d1f3fe642b723cd9d5361988a430d22c032da88598a78af049bd869d3c14fa7cb7c4d60bcd6c77d959e6063f885b868241223fb20772f5b10878cc7d7a22556ed8d6ee9b3c9d8e8ac9e880c672bdd5cffb9f542599b5febc965eecb59584d6c815ad2661939a552c4eab0d6c91da01e73b4684b1ad00cd22a9d413d2a38a06c8de73a11e00cb3d7a52f86d3c4a07e1519571789777bc5f8c4a84d5f24d1efbaf5e21aab303ee5852a53287539f8634dae0b9c46b63f41e6c42b6f8ca1b9cfbe0c6281598b2bea9fb26ff4ca44d7a2a7c2e907c694906fd0025b95d9e3906faa1305cb1497c91020ae2d5de3d174e53e957a88f2c35fdb642411b9b9c8a0c5075a5bf1bfc824a28039e4e6002b47d5ac96c8e3e702f8492c0212a4510a6c2f7603f6c037c291e141c2f276a483597967a63348935fe9bfb0c5cd795a49d1d598d0d7aa164c9aed1c2ea0b710b97575d5fe4816356d107ffcfa05fdfea5539181b5072c075fe2cde640a75db779ae0ee64d3973b386d3f173b5b3806708c7cd8e6dffe95e14a78bec94f78aa7278aaecd270552e9980271b083431a300ff88d3dacc7eb22da29493ab2d6c42bef5f49b1acfe322bb24cc9be2554e973931cc958fe9b27e41e0edca4f3aff586a6910333bf84d2ea663361c8f0055b24042a80a09850b1b23d3bf22eac5f09887d78d74fa99014388767b8bab12039c18b0f45d991251b4be2b8e8d174435d116df8abba04b733b5e8ee879a1d6918e2f566e442924a4de74d12541c66168a4a2df4e21d0d36f57c68ad777ae77156a7f38393ccf99df0e896c2b9cc0155f55c40516ecf0b37359bc9c2d6510a08604e14398b944fcdd95f4d36d114471c5fa6ebb526a73b472538ff958099db48b091b5ed910cd15f635850aa66d892b16737fa2dd156bebdf3a75ac0b5d76db3fb1e8fa22f6868d78b618007f2698dde545c20f644ac25a64c8368ef0f36da3472087bd58d90234257b02ef4fe7f21341572d6fdd3422104428c403c431b15ab2bcac16895c894a2a2307c35bb0dbab571c08792cc59365ecaa86718069334f5029bb48c94d8c3f8d51e300e4b9d5bc2fbc8cb8f9b4c789801b27767d85e241b46e8903404c3ce406bc156536a802df0352b2f5cbe9b950a92c10fb6d3691de2c2991f8841a751e038711422d0fe90d7132e22e3691e28284126e808bc5c0b9e0700792313df0b2bac1e08baa927333326d76837390213fff55b5d382752b30f8603814d80198e8c8f0649f78b46ac3e56713ac538b67bd0e072e955203ace227e91a99070456a9e24c440e477e98897cd9b15aa3416917d65a38df434b59a14f692fb16b8611ccd6e147e6a8fcbb4281ea2358102baa20d20a36fcce2d61503391cc1f7b4d78ba52cd6729da449f2d51700ca36fcee42cbed5b5c6cd82d6e56ed998ca089b914d057ebb64a91b73b670346803cdf3bafe3ef262498add22c5912e1ba647012fc735ca3e94320fea31d504b343e06afb3144c47940517ffa4b3f2c2c961ead7f5ab3209467227b4ce591f88d7575b10d081953c6c35315f8817a1ee88a45aaec38d1f0776208976790bddf15d3cdabc191e35b9b111974c639d1d706a9cc8e0483ee551917363966476b86f62e8427fe84051d487e1c8eca4bffac20eaf4c66065aa98a263eb20a22cc719be199c545dceafa9a96ebff193d721c602110c73d1ffa21c87a259cb98ea6dd943e03678dd7e108e6010596aae17b29e0a398452adf9cf73c72589901020fa3868547b8049b499844fd910b88eb35d562d63a94bb92f4f39a41ea00d9a1992ad6e42975fdc80ebad2e87e78a73f25c7df27e0ba970cc84b3e20cd8ae6da1cc00702f06d2a9939bc8ae1b0d57abc1ce50a7417677126a24b08676e774ffb5cac1a02cdba2e56abdad8c52b51926fcecf6fcebca18e8b21501b70781115b1939144993c093cf405783a0b4aad89d7e25460fafbd58e107e4b13983fb71d56c0bff9fd43693a11f781cfdcbcf3cc6c7a9c49acb818881c80f47e9666150e816adbbf82f10d54828e5ac6b55416b1a0ecd60144f487f99ce048348c7b67007eaac0ffb916d03c47a6a9419a394f243361f382a27471fe830e66c4ec5d8c165c76cac03cc0f53e24fc28f43c2a2e6a5412349b13dab132028df99189e3ae5427f86a64ac78f8b73f5d505a41da9edeabcebf00985dbf8da0057900a9ad703e18ff9f5e9db9235d1def433e1b960e5641faede534325ee8056a075d186c62abb9464cd5b1d3ac9cf96ff6abc53217d47cc7131365019a5595dca3aa2573a2256975b209a59c3612578a3606d6ea7d2b360c6a4e9768b20898c8848f7a060e8f0435fb57590aed41c3cb1277ae2e6e490a78d2159b87944b4cd5e9b57033c9b83372b75b0e89e3627bf3fa5f7b8408718a16d220dbc9084ad8472eb8b040df9b2cd775067adb0b3e696ca876e5fe0b4d059aef5f8b79d75b0d35a82904c65986168fdc854834e4051dc90c3b9b32c2617e739c16368cef30377e8c2e22c482589cf0a0b8de00dc2087a8b9f98e36e6f1ccb31e931b99f32af0ace5cdc131960a10202dc3302e07f3ef1f4bc78dc71ab5220de6a5904fb791eae41abba382447f32fc2295a58f388e4bc3520090b5c11a53a34a4d7afe16afc97933198ac5a66ee831cb0504e35c9668786108267b3f30f41a82c87d9f33a5fe0979489dbf0c434438ea2430ddd3bd4eeb9c458817e099e55c9c2165364311858fe54a62de020a84413ba7313e0c22e6308a7c76145fafce46c5af3a61003c08b17da46c5672488f253db870d5fcc37747784c76df7c48775c3ca4d2f46a20c15262d6a598d0fef1b233c4e448d0b786ae48966c55fbc3ed420480a613cc822a8cfd646a488cda737b6b74c5cc1cde6b2c5f8fa920e2902b974e03863acb6742bfc73a3d19a4876d2c53fde12a5cea2bc95e46740dface34f249b849cb8116bf54985ae2d9a49d625e03930b8856a862749153472dc42fdc7eda4c5a9b54099a3bc6bca114204d273ed626c6ee3542d78d58230570079dccc6354cf3788632140e99e123df1709a120bac713dee7c1e2b590405522dca37ab76dd425b6d888e0783db8a204b6b69bcf6e6ca5276297ad1428506cece06253a71701bb64e9e6d62a3fc9f1d24e36a85eb3d5d4369e20acabda2f23c64929ced7a087534d1b6e029c2d4fb0d997ad13b94599a0cb0ea57053152d1817e34fab90a245a618584cbd697418ff24970395278e4128cb7bb5521e61802c15874ddb62c825a07b0059ce2c7e994835b952f9f3c2f6ad6e687d70ac5c454855751a86aa9872fd21d755953ff7db248aa9cc6dc4cf71eb5a68be13a311655a84d3942b8304540e0bcfc3549a002d1e6934fadd466c18a85f83fe6d8982a92f9200cfd12871e8c4c872155fe545bfe38ce42ba7dcd6321207110040461e3c2e178fa6880729111853142eac7c7f402c6367265bea2c1649733597f9e008b747d0c55f5b0707b1eca587c19ec4cd7715f378233feec42109c0f328fceffac3f991dd5d539ba1b659809d1c54cc035920966ee8374a857613b90d46747ccaecb9141a756d92cc8d38385393c5996352cc5509418ed12553b8fc9604cd1513fb7e18980e38e2287b1b5eb63217ff95b5809eb3398869fd29ecbee9ac686316b99e55fb659b820899658ceb8361d15511351cd862bceb852a168adf2e4b989f2c2f8725b18a5d1aaa16e73cce446ced791108d62e2eb57312150ca7fc6d56305c4b2fec3df7ad259786c9cc24150ee06ff534b2914d6a104e18d91e882620f4f9f3b1054ec64c1cc7e339b2dd56fcf31cc6c4e918b1242e2295dd826d260ba623c11940ad1bd0f000d5fe9bc7b475b140d608d1a18ec80a111a98df8488dd592715d320e75a198e62b30def78df0f91114d2b7d3180b2d215c5c9aa45e915a055f0c853715422ed0aa965ff19d72ef0be3efad6c880cbc6880d07e51141b1b52646f1e50551fc22ec19682103026e015a4772933ec7f84593749299108bc1a4de457c5341fcfcdc2e69f54a3eeb73624f600c122f1f612bed47e4ad4899a28e71112d43b0b486deb2fe8c164818a6b062711cd9ac100e8af63be55c7bbd01d199eef695e4b05bf851c6399b9541d2f68e29991e095ac96d06f5d55065160c235909303586d5a47930f1c0844bc4716440826fc90efa2a178bb0a816dcb4599ad67c0e47e0d987ce68244329394cc0df3776cb0bdfeac1d8da48f3f02e6b45214dc154ebec6a195fae9f1a256dcfeba26f1a394ad9c3284eafdd486154dd3056a17a72139aead43a0dbf13d83cbaa76e970a10b9c4e5e21cae4fb8ec777b3b7cf469ddfb7bcfedaab10ad171a3f8f94ad4dca6b9e24c577dda984f52b839e869d16d3713c0c44e854dd54071cb1379586b882f429ef938095b1ac19c80c5affe34b49ee8b96ae1187aaa37e0a06cad5a5b5a6a8b107ac932ed811c747b1c84fd782d268cd0d403745aa7506def5c0768661614621e6f8700d66a9989e58b2b305e09c79b25e62e42e9b0ccb8ee812c91c8222760cd999d78e0ab5e81466355031e1d0f8c330526c7671d69f9a4a26b4ae0f4351bfa57bb80088b840dc8b821574c355492168e3ab8e1fd000fe8c3aa980deac4ffef51c7bbca124ecdab41eb3c0aabb31ae92692bc3b99122f9cede8ecd3cac170e8f9ffc0b85b409470ce16b4669b264f601acc314aaefeec0fe09f9700e11500da5bb03640238e6c263accb031d6068a3480cabfa19fe3cf46eef12d2088bec6e1a4825b2ca9c18ff8441fbeca5561623574d14af864266fc8eeaf362d2b96e0465ea06d87749db294f6d4a02dd38d33f2d74c02797a563655c40310694fb956c711f4086672899103b78285a0502d8caeb9304adcc9cad891d980df5d76ab558ad13453ade688c400b1fa65362a78d7f355e143c22a52500c588c90f8bee4b63e41c14e117bf33e9b906d1b8a58f7ff52ecb653538e44d3f2392608a1d94f03c2e660eeb0e5819762a21a5f40aa09fb36ad7d917e796d6df941bef3d27e2c6d5919ceac14524d5a79abc10cfd4a0794c42e01297b940e9ec8d47837b0c19cb3f856dae0510840946c71805e931abaa7dbbebaeaad7e4ef09ed75fcc79d6121ec794fb22769b514d40db26a422609760f62e8b43d3e7b85f33208239f817be43b265b7780f8a56c4559943c9ed023258810a06927acf47bb99901889e30b596f34303fab211876a6df6b370a12bbab9a05359d85336dea7121f41f1938bedfed05ba30e1a532d5c75fcceed500ab97c1256c335cba2966e9e611b57dd5238931f96621c2d1b45e36ac2d505b2d3614353bb79285cd15dfaa9408700988c05fadb7447c1d91540c627833f24cd4eb53487d9f7864409802d171bb957e08bec8ddb8c9115c165774d7c25e20039f3289bcf19692a0231ca92d503a6e5555045bd2a0dfee6121be299c192ea21e499f5595b0da4232b2b65d7c49f3366030e917ce8a8c6e5a56c4a93179be0718fddc4a2b4ae8dcaf3a60f8d862a55d41c33d665091988349c39b35fbec87ebdb23b19171d31373282b3cbf8041bc7c132e343150865a3b9a1601cc182ca3edb12cdcf6165ed919f62604b4beb343b556e8ee88a3a25699adf79e879efa6852de44d3e647e151cae3a3184801e6120348653e3a9ba07ca5998815b5b82c524c1a8810fbfe23cab5f7db59811a7df1dc03eab2e50dfeff21654cc0d5716bc2b803204bdf1cce35e2eec354e7ac179842382abe8081a322b0cd316f5f45136ef998b550a4b353e46ed303aa4b9f232aa4315ea980c260a2c524576abed63827801c2ee89cec2cf68859a458c1197635bf6c0f31255380a2924f9ed73f65bc2e111d8b788c3683e150f42858172b10dd5f1c7ce5a868a91b7514dcf943c949d6c8e38295ab7a81cddd4ba8b628d6bd0b053562c69c60b5ac1a8aa44286c0a621193a2d9c02f8986d210624b8e88d16a5ed67641983f3dd80f4d603d8648e06aec07dc1537ea91b302e2ab689c2be33ca4257c75af64fb818a16cc1ec27cd2962f2ba0d920e18c79e9eb9fb311a6234b95b4613e5c5e0a82e7972ae36034b24fcceb30253b7bdedca36081707cd82b3df278abbc5e11db6138668b2436a6cbb092f289e131d61f65e4142ce205741b560137b6cdcd851b7162e22109a8f24e6e5cd87063d9b9c1fd4fd37cdd79c167040904fddb75b5185d76ee75f7b0aa29aeaa38f14432696eb3eb218596d094b23ee9898d06e998dc53ce9c373ec22f290d077ee6c6ef0bf17425bea7b24d46ed7edd08b3970bec454bb7339a04c626175c7b8f2483c8a325bf9d31f2a937d728f9895dfdc234118c878b90b985eb7717a43e6c8928a9e901759e13354a2e2bec01ac2ac3208281c407e7c18e48425fb97647c094603e42838717eb8c5a58ce2ed646c960b07da80a32d33ad87990910240b34d4ab502fdef8652d89515cd62c6a6f4bd7398552ffd79abc5d7315829daff4429825e58896d7cf4776c9874518309f4ab275308af582b0f72cbb6611687c6390276a1fb20ad8afae47c4bfc30de45201501ea2a05542387888c8c47302f2dacbf5d6a8bea8afe199c106ce0f438118c2ef7c492b26d3ffdc062e285ca5849b8b47819def037036fb30d70a35c95c4c58867c9d1e551dc99c944741a49dd169a0c5e9fcb950cc41bb47b125a16be8e885047296eb3738aa82a701d2321d5a68b23499972859fb959206cca58ebc31811302e0e18340fe3fee41589cbd1922d096152687f3615dcaf20b57824a282de114a06fb01b9c5ad16d2f8d1f955283a6dca5ae31f0e50964c7786e75c92ef67c869c9f899e10371a2632282e1aaa97461045f617ab0270eab444a23525181b47f906734c8dbd997d9b68fafd6d0fd32b11cc2d75b45817926c0cba9edcb775180c32c5b6e15aa5bf1d105ca67a7b5214d29ef225ac979e743b327dc39da252b42d36a30d662fd50140eca707403a727758639a5e1cd1a8394b2a40185c360903f12d13e4fca05759fdf22c4695135181deba275fb16f5b694b95ea238c0c0be674b0c85f5efd28c5e4d31481b2b6cf978c93603f2355c5c06566743525db11021b1ccaeba46ef688cc43d1128f52118c77f148279ee829170ccbdd5deaf12b50ed3e056977faae3f05b221198504a0e4bb0b9a74c39e3a1279ee161a4afab22d0798854d535e53c99306e14985ded9fd34d800bfaf234501aac6d4f6a02e15b2f773b010ff124d09ee2d7ca287d3d35015614c96afd2dfa0512d894a74695818f0bc0d410a737a121620fc74da9b73ec611a620164a67eff4e8df429940a100f16e2ab6f91f79ff5497e0d05fb57ecc1a49610e1eeb68cc2c3cf012ce2358cbf68e0d6889c0af8a708bf9745ea6a1e4ad6a9bacee1036b145ed2b10083b4b727c036c116e728d15f302ada6be492fe6a127f0a2b370e6547c036085f1397ae9d7f8124025ab3dbcf95aaf9d8809d822e02998c1fce4e54be606d9e89c662f39f77e8d247b8ce3bfd77cee37e2941a134739c542f74d1de4cf52605c6a9529169996db71aa2a8fefcfd118656d14dc87808c7b6bb4f134edee17b8c7a1bf4bbe83242f867db586e59d48ce2b4d4b0b4848d548ecafb33886bdc559e45aeef295c164faf2f5f19c9439163d4636f8b48de3ed5472f28b5d0d6fd48bd089b1b25a4c304b5ef541d54340de1b3942229e30a42f71d180a98d25cf5a4604752d56d0d2ca42ca0877f62db8718a8e6db41af4cae5a38a939db29a1ce0a495a64682db10172123f834acf4f369c090a76f9e221a7111eaff854a330418362846cca5584d715411f0f0132f269f7b0d7672c4f78efe882a94efb5aba1198bbbbcdca60a88be0d3f555155a9a216a8198112f86a358bc1c1bf88b5f1bf4bbe4618580cd65cba53c31d0e2279159aaaefa7c545c51dd77e7d79727e7a2adaf3608ce465dd33a1a38a3ac0a6c635d11c72cfc96f5178c3e45076c43c401bc852fd3a26c218035525d928ce4ca02e01df0097560bc015597591648686a47c01815ee8bc9484313c81681e901e83b95b31209aee2b19f0d8f00de1e28f3a5990245afb878c320c6210d1686fc991d095bb888d24672eb00c1fff9704a265441f4acd998f218995e59a46937e19296598db048f1a692afe83d82ad1426a7eb068f45dc346c8812e58457b5e6c0fdced8f8eff51a1aa27207552985e17d72b975f0910a51fcf471595ec767da51952617c9ccd0e81b2e83985b2a9a1f0110f5494a90c61b1e69202d55c55afb392b3e7a3263e741936271418e2f533252e0ea06662b95380b55e783da8f3458fcd0cf369084fe2f1e46f3f8d975a748b7b14d9370124f0d1180c78c0ee8ab23c923ff1a7e1f813d09bcc3e743e22ad81a951050ffb6ba70359b20deb52d6a41fe50675bb6d7dbf2ad7dd84c083b2a795882ad851f4d6fa8e2bf2778f62a3dc3a3c82f2a07b543b32b62650c4deb9b9ab2fb60e9c2ac2ccc9ddb9ec995736eb189979eeb077fbe3d7bd83baf09cd651214ca82c8da94eddf2429826de0a51a81919266bee163e18d370395ed20ed05951db37395a126637bc599c2efa8587096f2291a1764858fd3db05f0cb269167913166249d57820afeb223eba7003a3e87331ff6e4c3785f095decf89d1c0f39c48106fcd7d858b7b5baabfbde07e12c3c0af56d52dee2efd0f0c7a99dfb44d18d1afae1188b6e95fc9c1a9cddab4d0e50f43e14588d220acc8f71a0c5012f044785d6636082b02df31cbcc040c175efc990df8fb6762fccff63337517f692c15e75906104fb0daa25f0c83f8f8fb2f89c13cc084b4ff987fc98232d46afe8dde94e9276e05428de6af50efafc21f34410e199205bfd08a8fc43b0ca28f0b5fbc48714d64ad0f0fef16ea7cb248330a2c9bb7ef55d2e48967297cd9f57da3f888e61e1ec6788396164c66368011c48f0d2015b9524634bf8633eddeded1e9f469c2c0cf9e66cbd5b211f597c856b5b2a8e614302df5cb2870b2a4cb4b3b9f8be7ed68f68e809298cf9749b4a43aa49a85deef196ee779f53e933f379922ef5a7eec3a24aa473c44b1ee91ac1400662f78aa9a96873bcab80d93e9b0f47a20785f54a53021f23f9727caf3ecd64a3cbbf8c51890d1c8ffe7e0aa37b03fb5afd6ddcab3563369382c9ae12303873efd1aed949c82eddd3f60af2a3b14c194b7f6ee868004235e9e704f3a6bc2ee933c0f36172f13e5d303fcfc5688eb091812fa65b036ed1bea9f6316ed71230e309e19ebfd19aae8844ac0804916a7502309648d776ed55a629001e34fb3e431fe791a90689caeeb81c8409a665036855da14bebe24e15e36348619b253c6458fe6eb522c12c2926f19686f26eac2da104cdaab280bc6103ae4b3e068248e4f6bb42f4e65ca6d00289f423564bf6818a901a05170db491977468440836234ece73f4eaf4b7599280cb19c533223d42ee629fde4d0eabf413dc760f777f7487d9b47c67b80786405af8040be942be5c3dd5edf4914d0c14d7dc6f37ba36cbd216725ea7cd9edefce010a16c0a2e6205650091f09b31456569990ac2e12c4ce337bc3d83f2ded09c5accd6fd55f7f459bc30fbaf4355a89637768f391f6e1456a3b331c5b2150286bb8cc7ea7912951d9cee001cc04a6c5db4c6069179ceabf7cd819def1761046d1554441a5b890620d1c93d4163c2f721fd1da18fcba0fc9e4716f4947ac33bce37fe647bd1fea2f4f683daee2fe609eb40efb6e67af183cc014ef1946dfab784a14814270193b0d53092ed50dd75d630886c2cfeb4fbddaa28936bb67e13db40e8977e0992fc2a23593dfa68d9be16bae1cbec8a5c2cf92aa81e7794e44deda16baaa4dfac73f085a5b135a606d71e38d945982eb1a8e321d78a8ffcc0eee652de85091d3938c125f9ced06d1d29c1793976cdd9d6089b5f9b5206c5a3678bdebb7248fd13f2156e0284b05f1001a27ec5db5681300328728e939f268b84f14f16add7432cf3f560f1d6ed7422a8e3939a0d88bc97b3be088a353461db411f3f09cda064101690905dc56524d65b14b23bd1624f32f57903ecc385e5d7c355506ff8fc3afd3a7bd7a02730f50ee7268824c697e76deea85fe5bb1a77c0f1bf3c686a895264253024b2030c6ee9f83cbaa0aedf0a0a023209ad8cefd853ec26b6daa6215e4233d50eeb61c384830f661f761511f2e11ab3c9fc6ca1399060dec525fec17da4da51e61be34b03cc14cdd9c551cbc0ccdafa215acdd6a45c257ce33c70d7c278ff580f9ed45278575c09b1895699feeb1f23a12d36710a2193dc1c6935986a2c07d11da120ac72e1a0f020588e472fd8612d0f662ebb79818ef341cafea4be7b5affa3e7051914e6c3b1c4505fe49d78c51b472661909de01c30018a2e2851204fdc2ced0d969b9103b5f0bb00ca1e4d42f339a01cf786bc1c2f2f086e616e3b6214ec31e27e45d896882e220283c7f6313685efa944c4472d4a26c238c4da4cccae55aeb54a892448d012b9bbe9e0a09403b8f0285b305bb5688940db1139600cc7f49e5c3146aedec49b5c3d52d10c6259a3b28f15205b737985e4abbdfdd398a32e2f8a20cb3f427c92c11b990b334997f940c6053bdd3c86a31f302ec4ebf406510fe8998abfbbaad34a8a93df9186d61a4dacd87862f135efb96eb0ec82d7d356a2ccef658dd005419f68c8eb0f8db396c74a3d6c3d4f24cfdf3788056e76577f74a9ed4fb5100adbc6dda20e37838c2b37f7a98ea425a8ac412fe0f30c49673367c956aa2d81f2f919d75e67a079d814177c1172a55229735ab09e75dedf41c58c87664440870792252b3d7eebe9f5594c863b8047d86053a5feade9fb3f2b1700d513fe2715b8bbc03e68724d9e28c3b4cd59ef68e08163e5e6eb6fea2fc80b739ae080246fdfd431974e6e13305353f75b0a127ea5b3498fb56688d116bf0165d57d62cbdbceb956cc5e9be97fe83ba001f18039340b1fc37f5141d9e64c345d067cea7ab53a1ca2e96fd120b05d3fef54f20154fdfb90a3e2450752cde624311164450a10a4d1a63f242c2e0a55043816fe0ef290abf5a8a549e4ce5c8ddc7335ed85b40e6f1f435a67ea3a40bc5fce0b001196caa821e62604ac5ca0c29ee5ead469cc3de7ab4a5f4db01745c9ef0e3cacfcf0726a93b788c3cd2c28944d5033f4234a8a09d9199e44872efc0de02c8564fc5821d6d9e275a4718be02656f6c495c8013a0197092e1ed2d357c9e10c0791a9949fd47217c587afc788de176e95bd7dd641975e174008e46d1d1e492a47a2299f6b4a4766f212ac20fe41f901a740bf1694d22f7ce6dea7d8eb9cc0006498409a1f3effc6e18f5321a0b7e982751a26a8931e8ada3dd308871222123c14f584d8b885c7d809ea016eec066789ee0cad540355a3b87f635e80df355e0969a05b5e805130db0417dc8ce82e402ce58707f8fe860c6ef47e42f49b7b3c81ef42e282bf9488a3459bfef0aef167c978d4ecf28d40c6980eee88846a2e50bcb31a8b0305d607c4df9b1c688ce4a04741596eeb4b7ef02c8b3a30f004cca4a4690258946553a87dddfbd404df397ac8aa3521dfb719e91147900c558de358446addf73e90afa8b9e5bd6f4fb593ddca1e9726b7f6cc348803ca032f124d366df69bb13d41aea408342a260f3d0a8b6aa17006fdac92fe14397070a96bb482da439e8eb8e866d01f3f757d55b90907f964a56783294a93d589b815f43ba397c85e68847ef4a3ce65c30b58a239ff2a65b51c43bfb50425df3fc2bac9e7df49a341d152705893595de6bcfcc2e32a377f9370344eca1c5179d714d4b576d0493a4baa5b7a6b79e374a7191928785b157246c162f87d4ecf6d57e47ef1f870f234e427b1af7568ffeffa7a2d0033d62127cb6278e51f2ca35830790eb2edd910c57ccc7ac373580b25d342f2c5fa3a836c066a7bd96b26868353aa876da70676fe89aefa6438432d0db225ee4ef3c936760acf2cc1de1a98b2d8a2c21d8428e8504355d758550001bfde49437c204622807b5779010fc831e2db079022c4c4f268241d27cc4939d23dca48cd9d978d4aa9c11c7883a3c0695c56062751bc53693331696ff414a607bdf593d70889208a7f137599668181b480c464214cffa18679d796d609a2375d3a0cadca34e56fdccf38dfb72f67ab5f64aebbf179ebe9214cf61158ecedc8c24d1df49a0d956e8693727fe53f7b26c20eccaaecbaba2b38e27d17223ea6f548e5f7a90cc6584aa0f2518a54eeae573984aeb47d2a913c94ac2fa68090247ed10c53f38bb57638743840e89995b7d22def1d18c0743f75cfa758f34d8130348cb9fecdf5a65857588721fa6d046171c1425f4cd0116396518c9d48a835142bd0ebcacd42017ad524b3f4f0d4e35cc3cc1655501a53bd66ac5ecc211a6e19912d3f8be2b522ef72b35acca8644162e451f044647ca063838a37edf758b2fc10487a2e4bc33a4116a71d886f964b658c08d21d782dbc9c44c60597596d60119a4f54639ab7c7bf1e5ace3977750f20517781c86e913026af563ffd8ffecdc0088cf4de3f286a27c448d0f1dc60ad81f45b1ca130cd29198edd18f9e83e3e922d726704d3b923b94407dcdf26cd7d1b968834bf303ece7bf915c971e7a4987a0fd23dee9bf6c0ae7acfe00710e3158dd5c5b0d84ccec7b4020bbaf221cd1b1d83a00d83e62f9d5a340c38d67bb94f4ce68d9805648e981539b8c4a7223f9caf816f7b6037b00f8ed853d906ac7646c45d2f9ead284a3d3347f49724e4614c417c81fe9d9510278e1de5e741b1a36ef2009c276b8b1c4500d278534626b2f6d007d1f919e5b87c0ff411f6c59e1db5d05654729c56d30dd1e516f9ca3e68d4ff9dfa65dd898ea95c89e848231ef9c6661b7fce3c4430a6bf9f3727d2629aed0039064eeccfab077ec447c0d31a89e4893c9a84a88182fa3052246494003f8fdf49c3ffe8f8f885a1e8135992fa5db9757629f61fc63bf78600a2491b2032f372270dea6042345d7234ab916b5a695b8e8a986ba01ff2da0c763ab46793fac84ae1c88af149a9d355fc8a67145848f3d07fefe81464b595ab824eb3b144234300cff461ee4159c5da82fd7da44bacac3fa5272b074f07be85760cdfab9269dd867f0cd048b7d55ac95860b679a91794638a561eecd860499109b8a05bc2066e5b0c1d3e26085bc743810882f06024efec4505169316a5bb7344f3303253ca7ecc4e4d051fe46e07b6c37c2f0a445cf43b6ecb9282450230735c2430b86aa94810218b143c67dffe26a3d1dc963ee408810fb2befd74a2a5ff848861c00be2c57bf7edcfa5978da0f1a3801e6ca46cdb20d68a7c7eb11ee6a50f5aec6a0f54af435d247c68ec0c26010a2ac28600270bd668fe69a5aa9fb92409743b888ccac04708725a3f5206211c22d7c0655624714ddb3f4c6c550af5801fab52effb2433ab0c170c2deb99fec819ff129887f152208b7eb2015b743d2a72812ee4880dbb8533794dad7a708324933dd869f3a460810c9dec6e94df4172f79431f119e7980fa4113c0f0ff32b4f2fe68015ac153b04926d3c410565140b1b71ceeb00583bf1ad66f85c790a76347c0019763e8110a2f0406c39b4e6b2025d1df0d398d62b7490098fa471d6b9faad6743df1ffa3b34e3fdf5c7dafc5750181f848ba69eb6bcbb4b2c6632226dd1a19b9b852d95e26cc85ac3685bd76c968777c96f07178ee5c37f36cce04b86c776d0deb5b8f5e8cdbc5300a5b0c2364e95691f9b6d11e094aabcc7a48bab564615b2fe43ab67b3bede0524ba21a063e8b935bd37df9cb1fc6165081fbf8e7c30826fdd328e1008f9e3d1d1f52575c2180d96fdd075be4f1ab3b1441e254273bfe18aaa1c1eff8dca68e285927f0b9ca38ad87aa71d8759f004acedc7795cf94e3251103525981092c9418feaf510d776c4d6b7e70be1e449dd1f0f8c8cc2ee0727b2c7cb396e864c01c07f58ca9a0dba63c5665511e5498e390cd74222feccc4a5d27417abed4bee5db36731afe06086b404b0a9e04b2279b3e53932e1dbd48f660e23ff16df0eca40c1e77ee30c74ad078bc5b7dd582cdf06c6f44a0ddae207eec52cc48830db0094a132c7aa4066985e80cd21c24a649dd03df0aa93f46754d4ec2a7095bdb9e37f3052f55c9ff3354b88caa533f2131c3eecedb6eedc5ea547c2898cfa7a0477f512735a5a889eea9c828fb22bcd04f46aa6f1b4c5c88b4ab6fbb4755a3562c56e474f421f7318246c3c5d36945d1d708ebd9e74935091e7f393d8a90d9b768c84dfa1ea08a841c2f5370a234d2be2babf19217fc20d33f2e870cd93f63544046dbbcfe351a2578a10aa5705096db90fbd6c3171673f396eda9adbf414a31299d42e4111565a211a66fa49ced7a5f7a8ccc21fd53be1c296c4caac6e80be138849469aed0a34bc76e78e82644a226015ac704f9c160d66f04f5cae7eeb4927b00ff6ec4ae1b55b044ba4e1d8e0f3c67ddb7ac95ad6b2dd6173f704c37b79d9781f2d5d999737e517a794ab0bcba00ee8b1d406b45c00b08cb183f894c23cf0e5ee2cd198e0b1dd2b6e1311372f3c6169b39a819698252b1f3a833641c174dd99528f135c8c2484d1c279296ea2d714826132b5f43aa1d7c26aa25bfa3133fc93fd705844df3f7a487fb2fc36e5ad16f783476e061330533994da0aab1ca171bc212751c62cc97a9302b5e23eb99cfb0cd193f5a0ccb146bf0d3b35a7dbb431077cee5d2dfd11f3b6d88639f2809fb06378e0d9bd0aad86d5569ae4a010c2b210ec0f78a501900f5780dc942000f4ff86a18c79b39bc85bb7cf7fc47849e936cabafad9d10c27b8d5ed2eb87f01b016263df7c0f192c01f4703cecb87971394bcf740b0c919727f2415ebaad5363ef4b49cd7a08a0b0b5d49b090a0960ba2391afcf2f94a176ee976c8b21e083f375ad7cfb82b57637dd861dc515bb5d0e6775506ab48bafd66393935e82a44b967533f12b563ee13493318761c6b1c70412771663f4c451c94d24f3b6a9400400d7a492e12670ad4096aa068537087c5e07b32dda06ffe6fb4f5ba52e8cb14011b5ce1074e715d4898f064141a4ae1fef69b0a8534a3f7ceadbf3c2b3317da78872a1fa06c21f03a6e8cb4c81b0095ac79aa4fb56f6155cd0cdb27f4af314d37d4df6455bd54b033830d0c07062afb3a358913668195d7890ec7b2a01d7a186ad409da62375cf588230055107342b7f059ad0ab92a05513753afd15c70da7225a079dae14e39aab775f0b010b836bb841a920d8bc01647edb0e18704a792fb93429931162b0ee56916d6112889c5fa23d4be93ff144cf4211bc0671ed2bf6bd4633a03390a0d28a4c52b556bcbbb1c1a4217420efea64760f2690c9617939a787eb1cf2a1513057646c74242fe069189df0dfa860fa711f2e83c7919f9d38002ca2cea9a5acf9aa91b297ac3588d79136770589ab1e85de7e24c0c04987e5881b596871e345907e0e5fa4b72596e33c7f2271e8720ae75b116ac7b112efdc73dd86e5e9ab47f9b6e4b209b53ab5bc6dd8db1776aa7c477f4111b8e20c61befdfbc5c8a51724e679bed95b21e4def244d787a6a3a1d3a1a8fc879ab12a901867bdce54b49b2b08fa96921a1128ada0e0b16becfa5805563556359573d1598310696ce5f0115457f2c12cb9414af91e75c86f18b03665f1c53d3522554366015623e21951166707b0f7a892a1cc4cbf5be2b1ab13911d3633880b3c6ccd437112702ee9278a6ca0ae58f2854e24600aea7f1dac8464846407abe6665847f49e6a414947a7ec5ddb69151101af35e63e2df0fa2e2e7ba7f5c0f1f571a36b3554aad05233a2e5b15a5e7d3f60960b2554f9591d9aa8c5b19a04423889dfa0e933f4b40cf71d0ff2c6206fe9e2126e6497a2bf57c88e87cdd1eca8a0156c29a8249735986bd6794cea3bc975e31f076041ba1b150ae5144580a9f2fa366f6bc23a8bef6dc8af25665b79734dbf31871984e7e8fc988f03bb78a24b6c317cfcaa689a4b217fcb0b7f6cd9c695a40a690e5818ece4a167b3199bd045bf016012c258837077756a5aa972185b4c7988d69b1a299ef07ed304fe1d864ad7c0d58b42067b10f9d5b025ac4b1e8626565210f130ba8df1811f0bc5cc10f7e4be24c4d0249013cfd4dc07b05c7e7bfb620631f5c9d08a3e0fec25854f020e25534ca455c27f3097343e86d29a06d70c3f7f2d864cc018cc1b3ac34aa1fbd06b3f40edd57a8b520711e0ca27905c6c8e0731422c75bc12d93f8df432685cd9e24d10052d83c650c8fa9a98bbaa162b0727110d8f40a6c5fdc4eb215e62213cbf473531d3167672f473ff958f060d9b33994c60786b9fd6dc1f823953fb6e1a201a5bdf2b43e3f718dfa77a63549d176c181e54631604cfd0a0a3e351c18e5f70beb5aa8884e412a002773cfc3ccb9af01fe89dd14e4ca1ef2ad7186a144eb1888b04a417232de6ded251c9df0c6ef775265f09e11d6c2f0e5b4694adc78cf5dd28bae9697f32f9854064e2084baeaa6339c9c6cd2b63e57c06233e7c642779866e84ccc952c83099e5c6552f81bf3c0c7772b104eaf563ac209ee25cec68b2c6100697551f58c40407e5fe713c44b4778fb9cd626eda741f49174b3e9abbedd3dd562e63253e93516d8dce049fb2deda4ce6ac648eb90f245fb063d254edcd44bc12c962c88da587b5eaf5705673eaea8fb4f4282982a0387d53d88d073f17264cea0bfa75d20c1e0730b023d6f20d8a3e2db66e00d5761c7d49083bd62aa3e59da6a3078fa15581e027cec39555c3dc99df73354ab7961899c639d622f124e14c96ce0d00dad4a285fc97fad19522c0b2f7ca01ca79e0f9f1b8488f3374b2cf3c7ddf1e51f16c6a69bfb27d6ae746d2cb446639040da270b1451f0149636bf430e7a3ef05d16e6252e9e9a7147d452a9fa5069d5283199bf1d87f54a7db8df14bb08d1cf8d05632fa328654643bef54179810bb6633236ac49349e8553046118ee9ebcb43dbb851fd6cd0aedfa85e10c8d1733b46df31531684dc5f0be5c88a5716a45b74625bf84bd49895441cbdc3db89f5b1bf6289e18c8a914d6e4c18c5ad12eccc3ac6a22495286dd514c2cb3252bb871407d48572551ec2ff0b115b883559677ca4b3727309925e94b1d871b40ffffbfe37d556fb4d2c007cfd9943a4ee4f42912e7de240e2695ba54dbdc5ef73f7b6fc109437cb683410c3471790cbd90a3cc09b4366cc73a045df78eff5dddd0aaa11f7ec7691a7a4779ef52e6569474ae84ec205c327fed9617ee855229772af598f2bcca9f9f35f2fc4531a6b0ace483111861893269e3b05019e97693b4a047c8e838e38c331fa3684ead563a2dc514bcc9820b6d15bfc83ad1918fd3c2bb5c8752236a0e97001b1551b9f8ba63d2a95b6bab483136ba309c7dd7a81f56ebde6e9fa5f6c7525848390a54c39f0b8abf231ef2d0a76f150ee76254196298088011f696836222e2c11c3c12899369a278f012129a8f34bc26c4180a9429279071c13d6fb9ba3033e93111bcbd23b0061ef129c9ab50643dc610316268193e907e45fa81a561956a01408cb9376642bc92bd04ade418559096db4d58b4ff4b509d0a1758d1d5ea51a0aa94a1045e0ee96ae62dfefc94b34c0051c84977235fa76e912feea334416045750bd2944dcc51c36ada7c158ab5e1961b8770cb6d2f4fb858643231cd813be32bdea3e91fa066919225823f7a2912ffea9942fe586c275aa6a23954c6df3a8625e1bd897c3d107df4376856c4da5d3442b68c44b00d80214a35619730a26a03caaef09450644a192acbce98e983db21fa780398a1677bde4ec06b9b23c60a8133fb50d3f327e5cfaf6bdf17806985d35273c626c30e23649dfb32bbacfb3b3434e936b6cb005c4e1ba7526d7de55f7a041dff7f967380382fc45083336f3b39553a463816ada43b4c984e5acb20692fb9fe9467d258f9b28c06f1e728e373f20f298cc5c3dec01779393f39fc00135f5049a059f646e7572aec686cfa58b5fabbd4507bf576c1222cbed83dbaf36d88c8cd2fbc402fef49b5788ea9d7efd564fe7549c0ee6836ce62632a726ad952cab7cb708aa8f9979db7fccb7ca80cfa633d4d2cb40da787094e25a393f30774c65c3ad903c1698b609c548c85e9a101f44aa0462da496ceb32ed7c460c2bfce1431e456a51e67731f7376427f0cfad4ad167fd61b389caa21dc3a5ebbdd333f2d2e8cb37e3a5d310cff6beb35d90304b2f5c8a21768da0bffa41a2a60f213d35c6484de50de2e6739e8a077f8a6cc5e43fcbe2138058bc582d42a3ec59082e7e105ed7fff2ac444612bb7103cd3d4f8b6f717fb5513aed89ae15f22a00110b7cbb2d8e934e25a8d85dff194ab576077d4fb52e8636fe77925231d3c07cf6cb6d2e4bd55618d3b9f0361bbceaae34bb26cd85f3bfc8bf64e36c1593cadf49a4f5bad95b411ba08ddba4c2f18fc8c1d0f353f544dfec051d92cc6800a0aef6aec56f6835e95e220e6ca28d1ed8eab6bd60b046529ae47c7ec26901877828f1cab3ea57cb0921c86c57ce0170fc0e8848bfe4aeb89635e8307f8dd599973d0cbef69b95217096b1041bb828bfb766baaec5d184822c014c801fd090a78cee30616befa8eaf792cec2f1ffd1d0dbb2798f6bb87c47e8a08997b8c209c103e60d97d95c255ebde7bc0c761c5a9f4353f6fce16451d30d0a84e9e07a0499be401dd75089320c07e1303b4377fe1e074bae0cb0e4e0425a3fc724306882a87d0575be6afba592194c507e84fa00da4468f07081a588095c61e9ba16bb3c2082784ceaf73a1de80ae9597a04b241240be9436c86c7bf3db990bf44351d3c14d6227c4d626a4e8f241c5ec405db477cd81785a93ae1040a7b9d6f1b2196eab38fdf6c16dcab07076f420bba183b10b214acdc734e768c0b11fdd0845b248bb2b2d4c712845787ff4021544cd237582541a7d1e43259520c7b106170c4c93c1d8f6bb92db5bd15c3cee24a525757f599a3ac94ce6ae9974d0beb5969d4f115760cdb0c0c0a26734a0a055376a6645035788f6368bd5863c897124626d6de63577842ef9fb18997cc97ce349f2793b6e39c5c51d079b275d859f939223eadaf299a97572e408b01aa0edf90233fdf8e1360280d9789799613c0acf578ba29e19b5e8885b2f645e26e6dbfd8174ee88179bea3d0e6a1ee2f4c71396558d97639894d09ec4d562d22997a4752444f0729b6ca585c6b4d8e385d91b554d4c10f2a23cf3c2b5047988e7d87b0beb33999f782f0a0e2418bb7708f1482f3dedce988728b87c0ff4ec2b44b1ef03768a835d58e4506570417c5b6be91b59c4d9411ce48797f66ebb3b400741342bf23af47339a93d9152c0938039058e53c2874c6c9cb22359684a28b319ba8f375e57b3c821711b5b467fe05bbc88d8c89db1d47edc3dabc6e78eb6ca2ae79f7375cec1cb7fd86a8e7830d2b5acbe1778aa91048fa85450c32dbf3fed02b4e6804661c2808b3b0932322a30a87be5478de39fae5b5b0dc44931ae03bb3cadac7824b4530d81fbd6313aebd11855e94a169de2709c2503304dd18f7babbfe4dd69c76f11677efef2b4311cb04ae567fc1df06132b25e92394ca78cb2367213b0b621ced897ccae23f8a270e2b6302f233037d6fed40e0abb80489dc939ddb58b465c3fcc37ddafa25c83e4d269b039b5cca94271cf3256bb1387b992f493c89b737fdfd8eea91d2e0e20c59d91232088c7c7f19f8eb28e2b13a84f061b4902f322a2db976309cd83235f1601fd34e06871ca95ea102cef792aa5a0355b1f83ab2b17ce73a49d6c02aa58fa76e49cd74477496e3ae6ef465308b12067c9292ba2ff8a67913caa328458c64182343574429d6fa2c81d1e2dbab0f41cf4f58d496acabca8e7a0217c0e26b22f1320e1bcd9866d0ce9a0b58c4e5c0513c1b007ac02074d94e4d33c077d6ffcb42246894ef29a197c3fb7f44d9d5cc6fe8381b909b62462b61580e029721a00d80576a40af37cdc065c25e2f0c7fcd995a01024c2a8d43ae9f51cdf12a0ebc523aa6c518b27e2f5a6a499b852ca39190eed932d6e19828caa4f51c8c199acaf2ee3fcc3b913bea1721864d52c0d6d34c9637dab89a3a50629c91e4339c15651834ff5aa682f1d4a137ff529fbef9d646972cb9c6675b4983ae7274ad813f39c29a364d348b10694f6bc383823920197a43b258697d5e077a69924a7e64867e6a3176b8ebb1812b454cef3d07420b03d72134be4a871a323863913a7886ad68ff54b399fc58a37014739a0ea5dd1ffd66d218e0ed87abb3f9be8f76a1d457385489abd47101b1123d3edb808b7ed20a6829f6a6209735fed154d7b9176c432814fcbc20b593da517d875f798203bceefab7a142842598296eb3001595a470b19e438679b20775f5ee629206a6aa60df4104aa5bdd3b758d432b3a886f2d98efe0b866eebedab479bf89446aa061287662f56be66cf8e39687fdf51c3f3a7eccda86791292bcf3186e53325bd4c5a3d2611a70997630d1c1469db657373857f7607110fa8c1f19da4dfcea3b32628834dbc3f19411299c609fab27e4059aeff048b681db1cf2a25b96fea47663f97c7e85144ac33f2a17cdcf54d4d5210ee157d1b12e198d1bac28fefc6495fdc4f1a5facbe0b4dfdafcc46c5617f9fbbeaf121919bb95a86fcc095fb1a5c432dca44f12ea8913f70f1600693f8486fb2ce13bb6607c95bbcb1302165a22f6228f1a973f162f922d0a3213353004900fda4bfd25118241d0906d424c1522330b2b48ccecffe80b331691e837112376067d0d206f367b737ecd1105a4f5210b62d68dd0374d660c47bcb188e7c4cffb0a4ea678387fea0924d54671a48392a80cae0a6b8c45b0506c98e7ecfe1d317c66ce227fad820bde7547db2f7c0ec73e260de075651ff2ad29570a511bc41781b714070d57783b67172d7d86732f2fc2f34e9297f8b0eae76e678c58ef2cf38a7157e6251bbc05a4d0cd20274500be1999ff4373d265f49616cf021a9fd63f7c51cbaf221486d96dda154ff36bb41275cafa53e4e15ebe3b062665c19ede3aff4bd3a0b93d6dffd3cb509be6210b48649013bf925da45b8542b4842ea538dd081866515d94461d0a6c613fe1f78626cc2d99b23a20fbaa80bc7f695b8d008046f982004dd5cc2bcb676e7c2683aaaf7a91c78b155bfefe2bd1f1117889bc17ae02bc90df508ba7faa6802bbc9bd73415b76cea90d6b7b4d21b5ddd0d1eb17e24a674c98301026be13350144d48c3e6889b6643f2c85782334e963860168389887756ecf83facd9cefcbbe27f96ab97f43ada69879ad6e393b6f3d950cc67cc86c51119629ab917aba4c613091979fd2af7dacda0cda4af491b87a6def25fa95a9f8848a8ce18c8d386fa9ba9e76332febd622ba07878aa8fe066b01d72ea4eb8e647bb25ea242976256f4f502bd99162432ea5a2289ff766bb217e6262c90b35ff4dcb12c0d5df12341db6df3f480f91268b7da9c984c9610f29b42ddd30419447dc6d1354ceb87288d0fc332a123e6baec5285019d9e998bdd572a91948ce0ad9c2a50a713f39fde998a9e03dffcd8f662e21838c30594fda51202c2a6c516750d6eb3b5671739061c9bea9bf9d1f37d4099a028066c8351778e87f45106bbdae856c60fb71965bfbb9568c0148882db8b7ce7fa39987a04db65992ae41a01c34c328813b5718232482fc32a8a47edcbb96f7e4669cc003d25194907b9797ff0452b82367c8e92e752e1c13372f1dbaff273265750c3e3b322cb83ffee782c995db55c67ba5036bf125dc5ad3c776afb91372b8573132d1e7ff95e97b75362327c97f2494d23c88003353e733e5f4f14aa36f1a8fac775862580d192a2bd60afae1519167dfdb14f39f3b947c44eb55684f895f25d5cacc9663e07771a7c05a6e39f4931bab5ca9a42409857cfc147f1ba930573d7ca6313b123e638924c29358f863658f64ff3b8fc2ad0563eeecdcde468677686a57c95c4a549158026c5434571ef38f4b3b77667044fc9b050d170ee0e2acb3e690bf133ee1bcc4f5059b984d9af64473267d57a2eaa7010b4b636948c537a230e9ba8284c80c91e63616d1dcd05f0de41d7005479caa020216065fe723d7ea5862ac00c2e615c6c4baa7effbbe44396b7d5c1588f6f7ef9a444822e114812fcd94d819aa6096db13b70faca99f7cb301b1d5bad1b04940771dd21f5959620ced27c2e89f21a82f4e3fd318561b78bc30ce666a7b1a2cc38e9fedde0f8be9f1866b3e479b9782da3db17e117a40baf49c9f6ac70f085f51b7a78b45d3a21ae74786eddcc7db174ab65bb9b628f0c45c13216609c2aaf7978ad6731d573bcd93d166e27d65f4bf540692cb7f52d2190223ea699041ffc58ab6ebca7bf562c3cd45ae85a7ed7b91c77779f54d09c9c169629c387949fe543466ffb82aa7d76b2dddeac0b576da3d77fd6547b7076b877b64c8e4481a5296034af4b9ee3712474e7ea3301fc202291a0f7d3687fa9ca37d11b2ca555bf6199b67dba6afb79e316eaa5a7bcd5c41d080410f72afa4cfcef15a8812c6e721359e6c3c9692ff9c81257fa8998bd316771c1442e3a6de4ae3c2e413315baee8df8952bb6579b92e877fbe28da1e4cb7dfe83aad6aa706c7ab3ec5d587205d141ec1bc9e94d5660f897eb1bad068ae36d612129e551ac4789df41f977de73ddc4cb14ebb25b680ab2d84b9d8da400e35dfac310352b21cc5394415ea5e58f87b99055fa19a9b49fdecc3d7c62b8eb3b578b11f5889bb1d8c62deac80c4b55565347f58c0b4edaab4749b2d725a689026c4ae418d12705df9c9cfc6af08f6c0e39b50d43475e7d42cf918be939c289f4ba9c0c861b66654bad79c664f5848b173eba82d877a10a68a1b61c97c40284e6a4845f61c30ad9ee780202c89d8b6746d762e8f69a0b3ae83e5192a359e3ddae594037dea9af5324fc9988cf26c8559de0183e8c835e9f1e2b7d5600bd6b22f586979658dc968969249a692185535c255a0c6e5bbb42bc40dbd79e757f8cebec6b7561b93f35bc6d84b9c1617dc2251a44f1a421e0fd7a7005879deae63b7e785b994a288274702c3a4d7fe6623ef0a8d117f991c99ca8c80247df6b9da9b4c1668cd3c6d31bf77698235f987e45db821f6a6f6ead32260d5bf72ff0ee43d403df803dc6130cc303cdc6753620ff741392f2000b414d89bd45291477fad444d5d79c83febb6258705b04826e2c277f5d27adaa583d45640cda221593fc0b3883581c89a971f0101bf9a549fd7b368bf825a619e4d6b248246f70cc750912a509e2dfe0954f75ae9bceffd71acb19c4a5294c7c3b843bde4a915d0044272f35f1d3b81d3a0d092b0b97553bc4cbc030e6b1c7f7bd396461cd18476a0cbf4e1e8d95f9603361bbfd7d8a45de6d34d8bad4207055c2968a042f0c35410b62d88da571edfe174b08e2b26825872dbf4a9154a6c3080a2d3d0f1e7caa0ae8ed4240cfe76b133ee77d8cdd14eaa8611aa3403b5f684c51ca42c73009c0ff5ff0c331beb74362e4527535ddd97220193f7591cf117032c40ed1ea123dfa5fd00e739ff396ea71b37fd8fe07b9489ea8c48a36893e5ccf5b22e017c007cdd8e62a9673d53a24810c4c1e25bb47ad2e2de8bcf0845ecbb685657eaf42aa9b65cbda9d0614c4277153f29622d8aabc65696c7188292713f7dc52482c03696b292923dbfc58060148aa2c9ac10720e1764df234e23d2f467a9febcc6f0cdb2868ae68661eaed3f7ae70edcee1d2a46056cf4c3d74a9044cff8c86996bd4558bfb2d39a70c5e2e80e4af66b8b6ad1991d3084c43967abf4ddaf4b88228a80f8c4ccf3a563a623fb8d2bd58b281b77da50f0511749c0beb1415f0cf094b7e6d0866fa222378ffeff85dff091105c352fc10bc732efc487815c4a387fe81fd88d4824a86d230e01446c2f643fd08731d9dc48867270729318248fae5246935ef8dfde02c0a183ec4ca3e958a098600949e24f4b510c5cc7a9f2862e48236d14400a323866f2d5ab0053a4e3030acbd08eb0ce431c42068721b47314d87ae9f7f0a5fe77adebf6d4131a37701a72714209c68c3d187d7ced8f9cdba9df68db63bee2314625b8ee58d81ec25e2525a41e5ae857e29fbdc7177b2522d597a6a4a74b051f34226d81918fe32ae99e109001b482e1ba0a7827c02899bb2a46c463d6c97666f4e0a4a6464e634c0cc2d8cadc867f01c58e0fbacb59842a3048c8d879f46dafb4ea2b22f628040019826d73148e87a1fae0900a2e012cb6f00ced21638005ee1fe1cb98f7ae27e2c2a1590d12223f546045c10217f0515e871e0026e49476be202a7f9f62a0b99ebce3287c095aa91925616588b045c69184d71a02c123c64ea889617d3abde836736ec87299502b85fb0b2277e062728e0d4f166e8e5a5277564790f5c1a5ca1f40bb8d614f34d1056c5ad4576c56958b4cd088e6006922ee423b3899e62ac86d98838aac427ff49303c5570303797f5d2112ba9fcb56bf82f7bdfeb38ce58c3e1c3d09222af58f71c50a733f50f0509505f6a248bfe9f903dee2eb92289a335c5ed0299c7cd67fb9c440e0c609880e26cf9be4d2e73d1e8092c0e4b812e50c2be7107e18c1b54731a85438b2360828fbf9f1de8d01a8c847344890d4a422d8d3d056c92d27d6d01d7ee47bc3506c4ebea6fd56e28713a175880fae4059fae727283e628585d8c4c32a140032cdd9f2bb7e0e67c1cb2e852f38bbca562ce94a8791b39cd51ed333b9f29495e5cb879a5ad2768e3ce8eb813969f9285771e37532950a9ff318554127c9b41cdc719e6f205a82bb98986a5a702cdd74f207cc57e592debc0a1615f0e2d954287fa73b3b6fa4d084105d05655271de0bba2505410d4013305249a4f88ae555a39060f04f5f2e67d99b2867120c490ca2d87f3ea25813a8d2f33d7249c5cd93e8104fd3c071d7237381edf456b9e860d925994b0151d241cfff2045a9829cc161cc161cf5c11d5df513cc3d1016680381b8ae8c54f618b23f462d44d93880a473af611630610c61596503a885381f35ef0423f3e667fc4b727f8c7b6080fba8499d4b73b569c7aa28e2532cad1d18a85e31648940b2e62ad784c458b8ed43f7a0663166c3d0156b82309b8fa33f5f311125d41a29f0dea38fbc11970e0861a200d1277372cc96351a959843c721706f0cc9234a21ecb92bf598a08e8f5a1fe9ef4b2d5d9cdcaecf8a09b22b92eb4803ca513d2832c6d27c4a1056a56c152a1812fb1f4155b2e41946e5498cd9a0a2c7e42b8bb27b8d682b42ab38bfc3933ab3257811333ab42607f25a6fa3cb662a1b8cd95f8c2e2a8251c4c0dace7d9baca41a6dd6009d681715dc3c1983fecf711e553d167f5805b38a55d24826b3cb453f344f9199a7a31572faaf8a6ea6246f9028e8278f9b3255340cf7e801398d0e33f6a807e91650cd76e2dd662629f883132a176de67574a8021fee5dd97b1e643249fab7b18f68fc5ccca8300e7927270224d3f9353aa88d6fc8a6a4737c29d2cbb419703e8387643e019f0696f57755f5b4e7f186c01b998186ba41fa360b7e2bc5386256e698d65717c0dc54bed0bea1788ade52b172becae901cda95b8fda372634e71639d5a320434169bd9aab9c4a578eba73c9cfccfdef574bc7193acbc527f02a849820489cc3511a602c79b405187a394eaca007b950d41d183075e1381c1966b5517de92b197e4805edbe4ab3badbb603545f7b0a4b5065dbd9fa6baa751609db73656d53df9221f9b6b5e7b40d821f2559ad0d7d0d1cf66f3330d1d05900009b898f90d621fc4c4900fedb480710df402fcd6e78704d9fb4e90ffc36ff6d119e842ab1ffc3d2418fd02f90b9ad70c6f7a861b079b533e2f09065247bfbb54ca78eae20f6a4204839481314ceec9646368baa213f342af47a959e11826cbf2836216f033258e7adbbb042f5c7d3f4842e617eb43bb5f1e20a674ebf9739967b398af0d13c2a7c9cc6ab13f679f40fc8dc63dda794587b854ea36da90163af69b5bb52123632a3b9532b678d9bc233ee7efcd7bc0eefd53834d74fcefbc5c66b5a1884524743748113f0849b340f3d9a964fe9987cc478cba9e5dbd0e990b39de20e88b61fc27dc79a5c62c4b86d6bc9ce223c1ae6187d20d9cd4a0982ce38b218110f1a0550559c9d73bd72b7fe34ed48a08ed3b6eea725466a265951b439a321aa8ade3d1102b1bffac41e58b1011f52faba79f1fef706d394b41525392daa368f1d4da5e83bbaca878422011a76e6702e2b55b3b2a400fd499e4546acd9f2894c413895b0fd99e6814fd48343e93debcfbc9e23dfa3fe883434047dbcb30cea825ea52f5448077a5143dfd358a9f6a34068d461b0bfcda2720bc467631025b894900f0a0c2a87bdfa4c248c229cd4a5d87d16426c0186fa0cc0906902f9355b91ecabea1b76d5fd945efba00772c56751a2544f16238ea059eaa5d05c9cb59d02c2230aa1b2e93804bdb6e5496e7a3a0b9f78e17fb4b971897835f66dc6024baf6ee9c0934041e9878ba2809aea3c1c08d7dcdc5b98d79a3b09d04c435240beea6e7269f80d396ea7e8b818276c689210a1ecf4ee682ba33f3919c4ab075d5173a9fdf5281446cb8497c96d55153221048ad96405446d9e7905ae472af43c3b3bd5ac232f5b3bda167bf41f748423908dfc0410f2f989d1cc446a5e9f7e0f4a8344406a7f149c58d123e1c67fbb736bdf7d127a37992f9b9fe427c64623c6c613c710de79b61af1fbd862481db174e037a21165444ca9bcb867206791157dd03ad15e0ce05f0d09220d826ddbb5a373976bee9a489177564e790168bb7741e3a946f3a470ab13c947e86ba588bccb26df21d46a3a08b7029b2a71cd194fc5c1c9bb628c9f5e05eb1f29033f628e07ac6b3408fef2c29c206a0b497209f201c0773207c0ff47c3c533f7191e873d400d696241898e13d2e6e9ca07d90bd3d040be8e914652639b71abf8431efcaea80cb3c09b5e78314b02011f3dbb1fc4a57012104dcb6fcfe3d5dc10306495508847edb8345b6fa02f9c797c74df36e84a1605c254b32ed5b0256c9f30f4b6891ef6fbcd629125bcd0997c39c7933c310062d0a7deea5431beabb9509c244e36b92eb36c83276a04cba5ba98af07dad92060b874a831975fb782b7693d268b6e2a98e6ea455501e3ae43e64aee33bfcaeae6a8ed910d29d4a414a3aa575883a20f8af1b482eb7e5497e0b57c656e46d0454e8dbe98bcd6633716ff50dd9b6794a9c3ac4517cb69982c0b12386dbbde61fe75283f8b777937075f0637500afb5b4fdf09e5c609d0e66f7acbb8ed857e7779b59858a854f682e11247475769f57f8187df1bbb83eec4fee8943f85ef3aa157a31b773a51cff7905c75fccbdb0087b5efae80bb4515d7d243d7eccf8b4222bc5b9770eead49629fd126853cbc02670be08dbdb87707ea8ed3ec534bf2ab0bd2dcb3d53b045e376ce66a5cc306b9dfefc46960b072e68d5339d101fea63604ddf3db5cf62bc7bad8e3529997153eb2c7bb276f8d7dff0e5a083164d952843f2dce74d89a3dd9a4a787f1d8d0d8ff18fe050bc484b6820d03007007b712e20ac4952e0d9f4372ac04c638e97be00e0410c6b701984084b01e8589981e441568508b978fecfb00fdc9543257239a216739575d004a82cbf0b003ad9bc273e4af34e7f8bbda0253f291a04e25a36e2f70b077ad33e9ba228ec33bc1e651097aae7cc90b9e21409b6ac90d120e026659049e530612dcb51de1b8b7271b5337129fbfa4c3d229c469c6b5dee0fa3f1448dfa02354412aeccb5aa6a934c2bfdb2c9d7e80d9b5fb7493355660d3183e5806de3325aac8e5c62cd4637c0079704dbaaa99b9c845d5386f50be1d9442262874075e4bac7919405f6121bc696969120a9684ffc4b060e1b65666d19be9451201e406db7e5519391d5680e3e66f191bc00f8cdbc287f05067f8d498fa4b684972e60e71742c48e500d449ab934028043fee9d1fc227168278d9c16470c2e625d4df7f4dd2585ec7685b8046bd73a55ebd0f5e2b4d0dea7143cdcc87551d88ed434b6839726a20e0a529dc49a28f51b3466b7e0aa68735019439101424b2b5ed9d5bf25cc3ef2c0b54a386d9e06239269f0af3ef8eb8aa764651b51a5f4ab972ca32b43191009b906582c81a752e377d0b0922b11b8bb02c296f22f41a4c9d9aafe20595be1aac0ac61ffab4ae815a90426db6009fbfbf22b1bad2c24cac905c49d393148595ef30be8740ae8a55d7cbf06eebf23181bc69c82a6ca0d2fb54b32e5f44493f744eb51ed91075423b438401fa47beaa048ace6f1bcfcfe9a5265aec27bccb218fd6d9016a6bbaff52fa4c31ebb12a3e116d057995b0d645dd84ba525701fea6d936d4e328fd11e2534c9fc0d2a818fa45639a7eeece0ab4052beed9e6268d2b511262eb77184eb614566f1fcc969823512fed3de0e96aeaf33833a307ebf8869f9d4034ef0f8a93d8788b94be72fabea5a68d15c0dd2c0514c46990784663f6b586eb6f38cead769a77cb25f45a53969c4397bfc3d2d944c36bbffad3e7e6c887c99c4ff7fabf571ce94b886b61813afc7e439ed394f751fee34c0396eba403ce1d17e61261ddcda3cc1a200de0a3d70e9cbacd1b0b60b5bd1f1b6e59e66b0a206f2fb4cd67abbdb22725217a8e98251bf13523ef17ecfe71ac83dd10f7521cbaf4ca6c83a05af7a051f2011433066919ae7b0cc9c925db70b73d6383b803e77fd1bbe7152b6a6133a98948bd6021fc57146c59bb277ce8936282c2ba34d0e9c9f1a5a4e27cd35f67539a92d08558b598ea30f600f76b9ff626b8c251b4d40d65ab3b983467eb70b2f92c1f366c46d63f9b75432f9314c55f4527e0685b96eaae766bfcc745213d0a898d9e6c69dbb7bf9ad4c03b13d6a0b138004757610eb6fd477d7270eaab1739552c7ce533c702725c36cc1dfbea3640a9f6ccc2ed97876477803ef47fa26637891b2e37eafa28590447ca3abb28cf855a62f23ad99596326f4387bc0a8c5c5e60b3e8ce42c38552c6d335556549a4321d1140bfac1154cb47f4d16712b67ead7fd0aa36d82222f0fa90ca7372659d5aafd6e6200f81ffd2572f2707412387ce25eaec563c61286cb9de18d7eeee56c140dc1fb6719c3bdb6e29eeeadc57616b6a906d3f15dae0f0490c77f26f7247b12982cfcb2edc883ad4f0973dd6d654b6ce6eb04afb9d5cf51a3dd1dc2b0a3e37eda7fd2db1e5a94b88e0d1079fa8fc8dc877f53ed3eef220a567965d73b4dc4b762337c4f7964533c9ed3db9786cc38b7f2473f9e6b151318ac2179fce00368f6b8d8ed2abba9375b77144a0767d3201aff39ee3f5362b5638b8be1e1f51cf2f08991a4de68b76e6e617f929759cf7416f0c9d5c1b132f5a814fae85ed1383bf83b00a4ed90dee5d5bcc434516f9e8fa712b8863d7ad042f79ef9f49f1f8e863ee58e7dddff6063271818280fbdc75acee0af873b52f6f0e7cb46331e3aeadc9b087d0ad671cbaab8a70a2ddd8ba8b58b5b95e21ca5f66446dd4dc8180451b7eb72c1395ae332ea4c3a14577882ebc753763918d8c6d4fc9ad0f17e8bd007d9cc13e12113baf8eefd5c88942d871ae4c9a67fbb725bdcc458ba5cce123af28395527f2c25d0006847c0f4487ed751523ebd90d8eec5833bf9dd581f3ac1aad1e61377aa507abeefad677ce394d1467fed04136c56bef0437f671007bc579bba4d997bb531ea816a3a4ab9f574b8dbff7d50f4a728b81f28543b88be4cdf552bd29428d973ab698b767023d96460eb53dac61132a0925a6f80a15f8c85be7466161ccffd5669aec834ee6049f4038615a4c218071f9d5c1f57885333335b937b0204dc849bc30adca1d128bc8e58b9cb1292827c4dd820180eeb3e2bef829ef87feb6dc182a0b4700f14cc1ea1555f4b7ae9910407e968631fc1d9440aa05d4d5cf273eda60635e3977d76fd917bed4d87968311b8cd19cf41cc7185d211507c9e3b1554c6a39ccf4ae6d3f92cee871e0444761c2fa0817f6dd8cfe72fed5f21ac5e21ae70edd552cbc066e56062e35e9259dd9e767fe661f296d290a0459dd42a7cae877719f3c444a08f469092f0c7d8aca73b6163aecb486a524330bf7f8ca5145832fd3cf8b54e29d963df2d8f4e1dc589e169d7d01d65ca9ac2c22c0abb7cc1234aa870cf8fa1250b4b6af0f2582408ab14e7d2c00cf167cbd6568867abd1a082191f8b989e9194a098e0f6f8c20726a9ca2b7a1abe35d55613f465e3435317922b9cd0e90b4d23ec5292216f5b7431f01b33881284ae9ee3dd792bae38d20635f59cf60cd728c4adebcb104b7122d6dbdc043a6e5978451157c8781076196dff6104dba14a32e8b16e90176fcfa2d2a3a964f09ef2afc98fc0296075ba458acb9c314fa14e70fc41913ec011fe0b1ae3043a7e03f553deae8ac76356903cccdfaeeeba3263782f982b759f504711dbbde031c2e6d46b282c03256eca1e74b03aade94c9f5ce42e5aabb44a38fedd4f537568c7d9f96d3c05d15a27d38132ffe151a092ddf8fe1dedc6046642863b53257e71434acd34039e1605eec2593b77386fa46f82cc2d1e2c411fd2849a25f147d1382b0f75da3795f131e7c80ad18b343d8b8ec1fedc0bf2e00dec3b8f007cc228e79d8180be9be041ca0a9e79f26f15a9eb9e6fe1a7f0aeea6e2ca64131505a405d475d48d62557db0d03a51dd4b4cee8395d30979108f27952400fe952189385f6b9dc446293403f9660d7f985321327926ea89326f80bd4cc765f435c4563562d3d3b262334d26057ad3dfdd211db9e990ccbdd79b3e9fb3b394cd676224c2c91c49438f946744009eeecaa19e3dcbc1eb6889fd30bd2d44d921f210f89854bdd1842d2f4492000bce427b22bc394dc494f013d14c0d231505a3f49b9ee236bb1804a919f83ad0db3e88d4e33257d717c0a8c6c87672d91004282ed4f4a72b39826c8a881eead38431e528f7f74e1d06f0eac7a8e8abd17deee8682304a1333730b47a834e2ce6431b56ea7a2aa4b7f47fd4c92d7196154c82ba4e49e939efdfa0bbf7324474ba413452578ab5ee08fba410d5512f9f43d4e8fbe6c1a027290dbef744dc46e2639286f27bcb1d7bff047674d87da4c809ae47e1a5ebe096a641ada5e37474380b2b86f8907bfd5b24953923efab08922c83f89e5f62942c680143d200b188064a32cade0d4bf326845a2646088b76ee1af7b1531f188d276cbe57c8bc1002c39a2c7ca1718c9b7ed34b72eb023cbc6b9b52ec5b90da0e607bd76274fbb21266d05f6e416cf8f2b96ad1022df167d0e5bb4a587579b8f6535c790a818138a1049629e1e702c4fc35336ae1b872bdd7e1dd6c0557c02f270169be3aed0dfc2459fa0f012c0b6bfa622321e6939f1ba9f8b7ae2524f83fa732dbab866114dfa55cc7577b2624cd44f797b00373d7a5c73b70629115f306197ff636f764d4c103dd11cfdadea0ee06207818372e5e2e7ed13bedbb9c23ed5660cb34bb018dc956db12c08b3998c65c786fbab5bff934cf82c76e329b8482a157015214388dcf0bece97ffd11b52f77e9e12edf4d41ca6eb57258dc4b43229fbdf7cbbe13afa35d3449091428c3aa7f66136de1d48e9fb3015c808a89f64f5b8937cbf089804ac6728020abd04fcc6d4e589ff0d2ef51f406ea68731922e84a25be8f2d9523bcedd18d13eeaf7c98041f7a69d1cd7299112c57d255d17b7365c8967b128f127b30efc9c64dc786941a253d97789253073e9ac06d8d18b7afe2def25bb5907dfd9c3c4e9f1411219099e740946395abc4a13c0fc0ab8d9399bc3306fdf3021f2996e7b3ea3d6c8ed5b3f002402acb470ca704f5cb759edec1095522cb8c7936f91f72ecad9ba83ea215fa130c3864f6fb6dd7a5ad8b8c1da2d6613382699e9c98c8ace01c82ab79f2863f5f316b0150717f6e1179f7a159d59efb19946a6cd9030da83109297892f8abc29edf21409c3e0db0ed134e40fb60807ce8db260342a9091b15cc87dd954c5a5dcbcfc031a6ea164a976f3072eb5a1015f39cd18afc6ec8d82cf7d08196e1f1bb7008206ec9a033a81927e5e40d459491b515fc07e41af81f84d96c16a78be8ff1a163191c6ff041351dd860994b84de4c049b0596c0041a472115661b00ec18bc18807583c5b6bc9287a06240b976961cabfb89f8b695048ed6da068b521b6d3722923489eceecd2d03d107aa07920731663910466552a1e1b93a085d74107a2eac0ec20db6546fea64dca3516919758a2248140e4dd1b3e9c3905230914ee0d86a6909c53daafab955faa361c79d552e35c4efba1e42d7ab3a1a17fde29e4a4b28d09ef4c3a12992785060c890452f39e48bfebfabfb2fb7bc2c7298ac3b947ba76775475eefea54ba9bb84d9a0eb9479fcb2163687efddd8ed2a44dbf457fdc7ee99684e2308e44de1b638c594bb67ec6773d61f74e9fd59c23af22796fce1cf74f8b22f7317a2d99566e7dabf52d9dddfa566b05889e0c778c41e15f2f246350d0d05f2a9f654cb234e1a546d3e2bd680097a78f029c119f3e00208c8bd70a0a2b2bad5f79179d845eeb5d3a085368fd3461b71e85d6bf5a1f5bacee63bdcb09ffad7f1145ce8eff3bdb4c9ee779f48413de7bf1e2675c0567abd55ae1bfa581c457d5a8be73717db4390ee3e2e95b1d8f793d7d96a7454e9eb83a974e3e79799d1739a1f31f8a5bdd74afd57afa2e5ddc52ececff78838a04420e290479053492534828609134923f90462e2ed2c8451ab97cd570fc7ef1e25d725cb8782379845bfab3c1aaf7617afdaf7aa8dd503dea29146ae430ad2319235d2f3aef71ef1d46a53f97573dfdec74c38d1ad7dfc4ede25db40a14f99345ae4ebae8a413f7a2011ca743e13f160080a135801b0240531cc0177d0a85141484b0e94b4368005a1453a0fff9a6018c416951ebef6d7deba786e377b4017f2b67de50bd0a14f9e354ba46f5ddd7c8274edca3376cfad4c9479f6ceaf22e3adf718fb6742fb43a177a14b934fdabdda0db45e7708fb67e522197ffee365121577917d9ea4c78dd71eed1efba9bb85fb3dca3bfa245ee31c9f14df88ffa09d3225a449f388c094f9f427198984aa51e7a4a1eb987e41e7d299237ab744bc3165a1ab9476911cd415c81dbc13d2d7218164f9f3aa14fb88fdf6ae96f7bd6cf48b8571ddcaa6e4b755faef0e8c3a8aee88755e9be79ea8a3e94491a6d1abac7c9b8dfb5d5ab9d67815c3e63448431704aec1e3731933c63844730b0011dec00e79b463308dc247fbf5d1aa9300de46f1a49d9fef8c9cb18312947369c79647162919efd5d8bb38fee9e1ae7207fb8c7084a348a493747a36834718f8fc76849b8c76124c53d3ddb5f4b92524bb277def83d3d261e51a9a3d1178da2b6e1581af0d06cee2f4e8953329f162787768e9375718a12f2c5b997525abf84bd77dfb4bad279031548540ced1c957bd5c147eecd2b8478cfee9cc7773ca7f32af217aff8e21570867cf93856647faa67943f6e450604a119cfe32ddd2fc52137cbedbdcbdc25c618e3a7afe1a78f6f76e9b5eeb3c11bd371484c41feede6848123dde782905f90f73a8dedefd84358faef66187bdc3581b4250ce8c598095ff131f4e2fbe798d27bf69f8c52f7498c7eb5377453ed4dc414e4cfc829e3948267bf08217f2fdc136ec6656cc771c7d81ba3eb10e1d9717e8c952f5d7882aa1dec3125c79ff96a494e0cc119123ffe41feeee6f48737c518e377017f8fd98239543d7bfcd0e5cceecd1c77bd7d61566db7fded3e18fb96ba4f06ad54ff466e4ccfdb7d2f91266555e33f627af88e59a89a6322cf78b5c61520729df5af111fa226d93126d67b4cfe191fdaf0d7c44f3363e3adb57f5fc8aeb57af557e6f4038ee448de841f79138ee44810763634521aad8d7bd056ca80e9020328b5712fda40e85966824d982031928363046549904f4f94a4a2264990e8e41c19092d29e223258a9317f8454d9220993a33e7c84868c9865f44fa48f1285ee4403bae8374342434e5c90b8ce152c219a9e907ac84dc710289c99011ff9902e5499092c8936493c3956125320ae00ea0ec2f22cd19ef8d42ee510ac4611a0eba5772f8e49064e231f407bb728802d11f49915820273c862af18f02619a0231c951cb26120803ca9302c9210ab4fde550907fd4047b02398c1287098233e00eec2d8f9d22c331c818fdaa274c92ed6c06f99bdbe9a48978ba9744feb824f85c47339fe530ab397dc7586994916a1f27767c2834770cf2c74d0c257f33ab41964f2363cb7870868fb8a7f6e9ca4a314e493dc2baad74d48f06a73c4348886271a02f043e0bf3751022a466213ed541820821ca7eafe4c31e326625e3433d03fc083fea958ccf5122ee0cf2f7e21e91c8e000b20cdc6ba9563a2b8d4f254f8d9356d95329a5f5adb574d628512ca773d229a35ba048f68f3f3e3cf19dc6a835c9906aec9e2c2a3df6f2b30c525bd2f5b18e7e46254f4c814e6a65cfbdb75e6b27cb61708eeeda530fe15effd67ba77421f2876f0a99cf38e3580e829adb6dbcbb186bc7ebd106efaa81cc1d11b0c11036f8d954d7c4f789e3854836e777fed8cb76fdd904051da1e4881983aa91cc872c0e893a710787cce826b946b024d8101892fb8325f9c998c8a0fc643c9387c789f88e13813c3c1ec896605fe227f0a008e42788404b7c0911d9c7411b0e4a29a5c44754eac03f90d828a6e01fdd5f4a69d291011f497ce49e4b29dd6b113946192428c0c463a4de847bb180a283222448a20a2b924003658a28292832841e5c40d6007edecb1320483261e0d01342ec8884093a8c3b95d65e6ba5943f7d46773949f0c3fc393fd6971d14748492238278f0d6da1a6bafa5101e61d8d1bd3f30fac13caa9722914bf88df42fc112a4f6efc5b4fddb51f87642fbd0522a319e3bf48843228c31ee1ced4cc179305e64e0213b42cc09ef9115040581811088e002d006d98fb29b76be3c2a633fef5f1d1474841278445029da2582a488dfcd8441410851131b3f86aae73ad50a919cf343f7b24aaf38bdc3db2bcda2bb993bf53229bd023277ea7d9876ea31fe546a85f9290d24ee963f41bbf1c25548685bcdfec9da9f4eb6b5cf8393b6c2fceac461e49309256b3be6d78740e266d11fcbab7e3671980f7ff6b606fff676d376c4fbdba6693af06f15d7df90c8986814e10c95a4fc390f123b916cbb7911ff61f135dca7e08cd5dbf70cc019183f8be7562ba41ea71e731d7ea8ed48ad3a08246eee7dc7615af4a7fa96b79100990cfc04d06eb4fc4d00708433e05f6c954d2a504c9e1b355cea55ceb3edbb8fc3709a85feb8cfdea6740df7a9b76f4afda6e9e0523138c219376a5afec6762a50a848913fcfd9d65afbfe13dffea6edb87fd2517b294249b7acfeadfaba876fac2d9668245ff6ebc570c6f6b5d65a8dee9d91a86efea9fba60ddb7e9ef11cb7ef3bd306f8b2af430fdb6660dbb7bf753307c6b05ad34532ed45e8bbe79ed369546365bff498fe64ec68adbdf7de6aa4a7c8a02bbb37678efbf76464fc0843db658cb1c2aad15c9ceb4eceb1e9f390614d949a0e8980fbf66553ff6ee2aea9b17473c7b67dd9362fdb75be899006c6a80eb31a29d530c79f588eb8e5534cebf81c5808f9afce21f3f2e279ff5cb5e15e2d05e16e1f3f213b9b53cb706f660e7b1be32a78b614253b8b12c6e76da9497da9c8d979df37117162e7df3e832c98fe4ad9f731d36f98e9ef0574f6c52a53e42fee15fe4cd3b4bdfdbcbdb7b137e90dbba65f69343ee28cab89f5b79a2a8dc634f50e6faf349a4dcbb8a73245aeb989bbc67ea64d60ad54aad3894ba5b6db9d328ff7218c81fdb7c24ecf61d863a7c73ebb1d7dec84bdb757feb4a26fa68f88fa4fe54f9f611dfd93caeaf4f6574eef6d96c7f4eaa477789b45fb88495be52186e94f880af6f657be15f63276def159ac30bdc3dbf529bebf693b4cfb7e867575672eb8c5adf31d4d2693356d76b3f2b74eee0e6fdd177f975ca5c7f3a110793ed2deb64769345bd20dba3f1ff221873131f12670467eb95d09f92b1a02b63799f42a67938aa663fbac4dbec461644dd676c417f880b44d0830fdfd4d07b67db7fd7d399fe5b6321753fe537ed3dd3a1fa67dfa6dd35630fd66faed33cf3b4c376fd974c2990b6f737e66ea7cc7b6eff6cde0fb9bc177963b7732268d66b5c3dbdbf699a9a3bf75b08344b25d659bdf5b65bdc3dbdb9bb2f6aef9881bc318f355a8c8f6f42a35a7c75e3e8c1870c6f561da2a7163ecef3d0189fb847535d8df57e93eecf397b41da6bf8f693ab6bf7aab0267c3226c384445cfce50c0d06156707fda4a87dc1f0d2f72c73d3f7b9195b0172fe896f9c57c3be96f868d6959e9746f83726edb9b367d35a4fdc1d8362f5bcbb85eb4125d3d64f1de9c39ee3d21a67cc93b7d4a08dd93fed4a594106a8731261602148241d29e1ba7166daf4c64157265168ca948e4cb5fc6c964fbcfa45d91c89888e42fffebdfcd389c572446fbbb93490d7b67bbf3b8a77d0709396e4854019c1da1df4bb6fff4993e9e7bb5c82883ae0c2747d474bc767621ccd0ef85ff791a1f659ac3bda9c28bf71508437b3e74cd1f8a36bd592bc95da331e1b39b9461494992f3f2dfa48b790f3ff33a2c276618f6d85da140ce363c1d8666194affcd9c990367207198fb49b24cc31b19b26cdec8e03036c0182f9a3a6c3a7b68f1dfccc0a63f6528923141fc453ff6c0281ec59fdc30916994a47a339c017784af164f319e16ff4d9f163f73a68eeba78f8ba73817fb41e2e2bf0934735c98f6dc6bf12f3e8b5d86e91bf1b3cfb48bee8bbb458bcf248e8e5b3c8661acdb9939eee918e5d2d79c16a5172e973ee27ddc3c9292929292bc522a957ab2e96718c343de7b6f075fde0bf330a3249a64c2f38806703dfd042800c2bcf05e2f5edebd2dbaafc5bbfe7e9661ed84d709f7de9b65afa3356291788cf7f451535cddc41962e22f7aefe788bbfbf89926830946b9b9a12f3ec6e37c26993dd367ffd0df66cecc993a7347753397ff68529765af579e4ea938352749c648292edef599cac58b7749d92eba8923a7e8b8b7e199e32ffa3007bf20db5f3deba76c3aff4a9952751c86c761584fbffa388cfd8af3d59c5d7736fdaff66cfa2a52325d93bdfe9a893365c3304691b2a9caf5a2f3a025fe62a15127e6487121c5a56f66cecc312ab94a46d465b4e9bf4b37a33b6da3d54afa67f1aaa749521ce6a7dcddd2d2d2a2fa19ff6eeacc9d2419930475114dca59fd479358ffcd1c2ab8285252a92487e1a248497d8ca66ff133b2450777ab839bd55dcba56852141e9aa4d2fdb03ba93473786045b5a82826bb77d3ef655b17f77c3013b57e448a41f5e3121f0c45e9198a02c950143daecf026dda52ad3c6ba9546891f4f2df96fe2e502948c5551b5224724e1c55cbcf780e95e9553eb7a2380c2bba989ccbb7f497b7aba583db377d1565d26ab5bea573a8d06add88dffa969eaa9f913954c06204c0ff7ff750b63c003a143a97cf300c2f36752aafeae09646d208ce889b4a1f401895cfffc920b8fe934370f19f3482cb7ff20830acffa4145be710a1fa24159b7e062fc6b00c6737729c7bb4f513c2d89f8dcb858b8bcbb33eae607a170d246e17fa6b7d4deb55e47482bee9559f513a2776b97061a93c4d336514c77ad78effea4c78e2701b57eb81ccad7a1fa6add2ac8f2a0d24eed643ed46eb5522e71ea54c54ba45a3c89f376d90815efcec72e1c252b53a0831f6dca301defe30961b42981770d6da05727c21dbb31ae69436bad87406912f30369e524ab72eb87a6c5c7b7e8dd9c52f3c0ff3a58437866c819bf9d25a6be97ce9d91235420829a5f385e7815216b0381aa5c694039936045f1f9263c3f9da4e8e3f65368430632566600c88a293529a5dd06c5c9b52faf80e99714e58811c9fd6ea9a55d390a94fc0c053e45f028778e0d09e53e6d07ac8f1a58dcc9eee4cc81938230618233e849f1783c24a2e99b8afcc8b7c5d2b64680ec89e93aff8d17bd9dc839bc34bc89f775f6420f9ed78e4985154cdba626cf8ab3edc409051cf631b227f10caaebf6d207f508a0c0ec3f2f583e0b0681c30eef07cb0c8c76156ae8fcc873c64ccfbadaea1bf50f5db8ac05c7f32db6364892dd1f4dfefda9259ba20eea1befa8a5395134a631f3bed573a95eea47fccdc993afc989eaeaedb8ac8fe988afc4129f5baf732388cc3503dffbdcad5cf326646201e60a5d1560a6badb556eb6d5776618c6ae75bd6869c7b309b56068c01ffd6b7ba567d218cfa5327a4f3bb9170ce21398240de3063b07bbe03b1bbc65f36c9a4b6b68b31462637c658abf61a8f1abb278120841046ed4b0fe127134f397e76eab6ec61b71591f1667aff0bf14309e1bbfe34ed73b8e6f3089df11b35f6ef07912092cca6e1233a5f83c50523cb4add11963fad745b11b9946a79d469e5ff55bac9ea64dcb39fea3c7fd96fe94ade8b8c41bdb37cee666cb8677feb58e8813b175e8031ac7d54076dec6c642615c2cf2d43b1b288bb8fdb99fe316db0fb904157fd6be156c45644ce1efbdc61f74c36dadfec7f6f5f83d6a4e5d67d1cd63fe6c434aed7a1983265ff864353707696458c61d8741e4d5b41884768cf1db3f2d65afddd28d9d589e83811e7d17122f621842b641b9b33dbd6345fc9f6361cb262675be1c43e61c3212b86f6127cac98b23389a991f9238bb84fecd9563b8f7bf6b11bffb0ae12f5557fdbdb4f3b75a7af8feaa0bf6af6f546eefbfef94fdd4a07fd95bf1b09efd3bbe9ef46d6c41a4cc79f2fbf1bb9f143fd452027120d70750dc6ba263edd9666536b275292dc0b0c0e7071fb8381db53d7dcb08ffd9531a7972f8f9c1ebfd470d0972a7f1fda57e9b0bf5c0e13b5c4811d5179aaf22b5deef0fbeb06f6b13b7da99330b2eb43c51863a44e84d2cd4f4468354c9ffa26ee77fd04e5c170b98650dc377774396906e2cbd06b2ffd9ae3d42e17c7b9268b42cd5a19d6bd1cfdfa22b1941c3f8376fb64d82b1c367cd3fe7c1062635681ab69207fd966d3186e36a59a04f28abe904d73fc55ba30f875e9b6c2d8b1d37e90b118f6177b945f6bf56ac7cabe906d350de4f8d0b722320c1c9cda0f32550637c8d060841d1c5194917478991a0ef973e5fbdfa4f466df31a240c489384545fb8b3c1ce0d9fe11674a520c31a728481324c0000e106b8495628c3152fcdac7ee73ac3f998d7fba36a59fccd682c8d9c37891312619373d736cba334cdbb882041d010848369d1bebe09699360042778dc438cb32995dfa2037bb14c3cb9eee65197e0a84ee1afaf3736ac4cfe8ef928f886dc64ac81f8c7b3399a7512abd4aaf759cbf4a8f3bec5e29d3f767e46337aad6f84e20a6639a4ef69ff2677727914cffcb30c8d73cca0e706f6225fd4129ae6de0d00e1a76c0a10552e68e0eef03a0944d750d2eda21fb0c6b9ba65d8d33eced2d7dedeadb12e603c69c30c6fc38b7485f9041fdda90ec5fbf566d48f61be977f3d205136b60ee1d9db843a7f0f0f010f11d223cd547c7dddda5a4d1797888f88eeb3811e7e9008c3a33834203879042ac44a645208d229546111a3fd0f0a1f1038d224ea3c8ac62ce09e19c70464aefbd17c3a8a75deec180a53964ad1dba77b6600acd16d03974e710bd17bb7ace596d85753a312b2542ad1249128156e98474c2bd58bdfa9ca558aa413627b5b6da5ae77409290c1a678c31567a8deccf665e3a1d4b8261d8bdb49b3f9fbeff389db35a5badd78f9aad954e7ff7a00d41048a4af667837dc9120f8a407e025f5283709d09f39d73ce5a679d73523aeb9c93d25939cfb5718eef4c7c848d5c07e3d213463b8b79670593de36fbf5deabb5bfda0ad9be3a0ed170d4cab13ed7ea9834658ce74b18fa2fd9198deb22e492fe84eca9c31fc3307dbb1520300cca3824a64069a8ff5b9e4cca0964acd14c227e084931522a95a886b5ec49a286e408fe39e44bace150e230a50967c08a6934b7da2c5a6bb3922dad6c49afac0d0dfd75047fc58fb52558c52a56ad8f17f1577525412525704634c22e29bded289d6f5f051ed56e57ab6419b3106e41065d590d3808d91fdaabe3b567eecffb38c3192f9b6605084a69e723060d01f32d7dee2dcbbd69c3bd1bbeed27c130cc276223481ce6a346e00cfbf2bd039e64de9fd7aac00348dc54b3e09ec432629fdb2764e7983f6d384c0e29a514cadfaaf4f7edaa24ff765ec541c80e841db1d648c654a1bb92df54b511ea330a67c40b2b8e70b3a8f5b7fadb672ce6a758b8d6f975db1e6f8f3ff538957a2ec63f45d970061b0e55f1b3337d82eeba4ff526b468b172b160917a954693e23e95e252dd2a957a6fb39e4bb1562c56ac15ab8b9b058b050b162c5ebe8a858b76c3058e2a49c8a69d3f069e0e83a18a058bb859b6ed6b96d276c45a5b341d5b6ad608edaf68377ca734974a3d8431f063fd09c9cfbd8a46c379013d45f765fef7327b9848e95a31627f2ec902a716d6292baca20728bbbe0b8657ad51504a1b12f5806006d5462a7b68d2f304c9d452b39eabff71d5c88c5ea494ced913049c61e3f2a2b603db93c3b61b12f5e4ecef65964007323a70d5f92b47c560efdaf5b587ff4126d75f2fffaccbfef22f755877ede421cafe300f3abb7eaed2bd870d67061d2e911e80b56a32186289255cae25e41fe0881aa4f0c1610889150839220a1e3e30829c2888f0031e0bf000d1f1500053a25e51c255d020e0c308b4e16b4964d75a1219be902da5943f734e9f1829d5ae03839939c5dd66b827b06d4a1e000da1891520e1c08227413002080be8e00236281102e9831d6aa0ed60b459ab393ae70a36256a11f6f75287b20ffe2769ad429552ba5fe40b7ed293524a8ed24c6789ce4ec2b8658c6eddea1cf2058b88745882211692d3011e0bb0a0872518915463e2c0c91280a8401266d083d10e47e40e43b0a05c1e6a43221d70b0b30d897468b23f9737a121112463b0281499604f5cc708ab3148befcb317644cc9fec58940509bb0c60bf2e53273356cc743be30ef76ab1666c8deea1a92c795afbf1f8406eced97340dd8dbfbf7b32e08112dc4278c4802a746f6f683d0a069c07e061a4af6adff38121963df0b409ff040e25e4cb2e3f358b5707fd5827deced631a4a1e2f5fee3ff2e548b63f10f57a9499542b40e4871acd0f1f3d4a8fbf07fdfc34474c0f352c0261594b711c937e9264848499b0574dfb19477d56b9bffda667f0bf3d562d6c7ffa939ea1fe46c332258beeb142bdf6426a6495ee87cafdcdff6ef737bd62799346b262d13cb04eda1107d5f1d07eacfc0f1f3f5a28bdfc16e81f99ffa34710db234896ad743f567e7bdfdedda7dbba95cae31752235be97eb03c04e2fee1a3c7aa05faa52fe9196a68df63d542e94d6fd233dc2f3dacb13d4dcb6751e3a17dd4786c70a58b7bd3babc52797f213550dde73f190bfdd267516ba13e7d961eb787fd4cbbce0af5d877b683f2c5636a4e6a2135563a958ec78b104a43f68b44067d060f90b191a1818cd319f7a28d3999d8f3593c42d893458d39e79cb3eaec3dd89367057b4e229e18ec39a79441cb93a21c0845a73111672827b1e5b35c45354b29897250c196d2e5d190ffc9d83268b8e7246f1b12e50094e9cdc1c8a61b12e5b081fd792c907f2513ac1d85a8400512a042091a40aaa20792890d8940050f9650c51112477aa4203285c80da6695d730145510d60282e674977b2987d2ad10e17889a0cac0b20079d9d37241a22657f5e1d42e53e8ee5c1909182070018c34502ec18b5a1fc79f4637ed16a90e7864443a2d81fe7550d8556f4c4963fe55fa221481506120d41da318a4a652667167fde878090a86be45f3ab194be6bc462f41184bea5c0148e68c893fd45b653a067fbb35c3b3e0484ecf9255d33e3cf9fd4862063bf02f615bb588dfcfb76de6a6dad3a6ae4d31af9947635f327ed6e850208bda144dc88e37281c0b74b4ba27d400b815086a19f70fc8094399e180e0e0e4e0d324c66515126748314fb73dd5024634727d27dfbe3f0edaeb523727ce8cae23c5df738f7207c1a7f45297c1e2ec07083b42184432091ce109008872a2084f0e98c104a1e6c08657f786b41d93724c241cafe686c28f591fa33ee103ee43610dfdd30f2e410d9e064c787dbf415198ec95865162a739a096464ae014608f9d47084031c8e16101425090f7cb033810de86004f70413c5e53c3304141650c20a26b00410688004173c71c4074d8e000322c81cfcd00e683243646b7bea0f32a82132cc1e1371320c7f79d23d67ee3112fbf37c5074312117cec5e29ee5e258350598b39ee3644c49cf585d6d1841662307148a29694ec886241506cc31c3bd67c3062a912b7c8a4c6d486483ce9e1b12d99023f404bea4887272f66943a209f06ca8e1d04e903f6cdff5e25e2743c6bd28fbee28c3bdf862ed67a29ca46dab8604c7d75090bf1799971a1fcb6543a21c25b6b621518ed0fe5c9bea10831bfa32475cf289cc955b878a1118f0200303ed8864051de168c7d7ab1d9226de80524a8bd4004385171b170349b73a8410c29ba9e5e481da3777620a52ca87704e582780b3a366e55b16dc834c3c00875e646c0854d481a2520ed94ac7cdfcee7f36ea6ca523fee7ffc5cf3e7bac7fcc7d35edefc53a78b39ad50c42a17bdf5e9d63da700f564af7dcd45dbe85687156a1029c1104c6880f5d31c0282f36a80f188665c9920df9736d39270b6adabe2c82e7591c6a02f9637d3e59065bbebcaeafc8dfbbe274f86f234e294f3f37c682c7d8f80b834d84625ef017f658db6cf0902f0cc34a41dcc3b06d0319e6c7b2c601b7d0101387b93d4d64c0fe5eaca4fde4efad3dd92a8cdc2ba4dd5644e62163e28fbfb0c7a2feae9683bd0c0e737aec83d0c7b2ff0ffd1376f2f982bf89c9f6a2755b11d9664afe62928d61d8c72087f96eec4e1281a2120cc330ec312c1615993c49fbb3f1a6cfec993cd387e943afd881703e1039be3bc11bda60974c22f33c48892460347485cef461f6f04c1f7ef24c1f2749443508e5db4118b6c51a665f54677455fa1a4c5f0dc3a65f350f4efe38d130304454031011ce11cb635ddc1f0484ecd4afc07c2dcfe2b9e7e29f94ecd3632344383d4a86ae48c27158f7711bc330130a8542b5b4c0b04f5f3504602714ca86b3e15028140a05034a7f30a05a72cb9f744dcb9b740dfe930d67c3ed16cd86db186b29161c974aa552a8148a85858545c300510d3f443851e25f9c9c7d3fdb360e868d5ac9aafcaa9c5754af5ac9fac32cdd67c36d95c7bfa13814eaf3a3b437713260e04c12c8be4e1322c3f787fa47fc1bbdd201a1fe31b74f87ee1307a7b4b18d63f7dcd0e5a415c71aa466247ff89b53db217f78734de299d152c5a49412253f7ba1aaa824ae556541ea14cd00000000e31400002810080784028158389ee8c2623b14800c86984c6a5218c843410ea3208882186490420610450c9901182129b00219f3a168ea7f6e5e0f5a3d6023f0e03bc0a63a2343c1f6371a48a20fe3703ceea998ab3a20caf8351754511e0a100b2b3182c418cf202714dd977445388f9420f935084e83ab03843f765e082310130bd568acdebbebe221669393e04e5df47ce472329771e5f4b3a7bc7eaa5540f7ccebbaf71cefb1b0be816ed0f6cae31e76f816d637a495b85a3fd494cdc27631e506202a89329a68446eac468ec898fdc3a9e3b4f99ec8a06ac3445ba7173ed551c8d5c2d23dba73d623448725e4781ebc0e572ffc3107a520df80d0e382ab956fb6c1fc928cc814a8d6573ea959b37bb4607cbd057598f2acb4d18fa40ee8e887a7c16929b71d1aaf4b22d2c56bf0466dff9a64dc462c765808fdec03356ce90a344b90e0c6dfd6bc9f15d00ff8c1e65d637caf154869e1f7c866defb5785eab096175910b4ec23c86e87d29f12875d26c3ebef5735681eea0b8e20bf0f142b5551f4c11e4f7ca9b2d33c8d2c14a6aafe38ae8f9cc5a38eb0e1323d511dd294b5d8afa5d50d571222a97f098780bf052c2bb170303bd679112bd7cf667680b097737437c78355a782f82781743dd34bc21409a77053cb17b7227e88e06debefdf576d58fecc4b187efdbbd20e4831b9a20c4deac762097e4040ef6b64a3c9b5ebc487708fa33932886bbfe0fbf8b58d5b7629023068bd0ccc4fdefb368b654099c2ce5706750c8a5a77417ed047eebf1e02cab273338190a7931a17340bea8a86dc9471e85128f54608631e9b77c0498e5830c90cadafd200f760832e590094005959e2aff05f6b59668d1edfb6efcd87e546fa341d0a5f15ed39152656200700f172168ad592f32d2b36229c999af6ae7e6158a8df3a17acb9b899de9b5171464b28352e79bc0dc4541803e7a171d6ab47d2cd329bf858a57ca382eb7a408e22ba30911d018ec7721fbfbb0580ef498d2a73d4f5c373a3af36c2c464d29a7da100908a1d9a2223c6b95a9713456e1d17099c6a44b19a33a79daaf95f02e9683433344f49fbe5f0018eb7da93bb6bbcf8c356a696a33eb5b5fc9bca43fa210e73eedc061dd32839406fa13841d07022e63519c4a392e1887d92c5ad940f711999ad26530076472cfa2bbb423aeb94de584d5aecec1289a8e0caf6c87e863759073baee1a1d88eed425961b8e3b31e34bd97926f16e1245152bec1760a20639a81d901cc90990695460401a1d131099b38e3469f5a649500dc7ef2b6e2bf23193a0b82b190d8452f0b5d9681b52c87c6cdf690117555510f8b8ec3cfc3112cabbe9fa1551c2b56ebbc1b895c4f432b3b45b9f8c72346898eca4d3b54aa58ad264b7f78163f37b8df593ced2d7adf911e514a7dad6174f421f198822d507f1415dcaffd04060bbeb35ba63f19fffc8d10d5c62dc3bd810f20704e6f8aa68820454e73aa2b9575707573245694c526236f849838a8523d2fa64872f1de420621ccc70f7b1e7c4c6042b3b91fe3e90d148b7900f405bae40db99eb0e1b7f5105088029725d29c7b3aafb906d9b7d09348430ab621c29fbd3ec3501656b7f5179b9821327f9c9827d03675ee128681c037e4829e79b13391300e9d3b402894d08aa7a9d3e1097aa22534afbd88d9bfb621cf9b79316776b340e4b82e06043908ec70fe3fb72742bc941950972bbdb4cb05c1f24b974dc6a982b473715d894c30d598304c300bba9fc78e7cb1eb499f4a84f927f2f9360ab1e15e7ca6631b36832f35a7225bbed26f171321689bec8a4823d520596c4c56eb732ebbd5b4c1a0b6a42ac4ef9efb126fc9ff1867a5fefbaf18e0e6b80fda524669d0a04ba79f2935a677cc7b3eed219d2e837f018890a7ff4b804caf4dad77b992ad3daa6b8cab5bdc73b7f565830565620cc3b57b3faebe4740fe3661e6d33cb7db8e5f0e9b2c4d30a4aef9851901d91a8d660c8b3574f3fbbeec302de23ffd434c2823c27864e9d0d90053574f27174679997bb304794060b8368c1e2a14ae9009c2bafe9986349740f37dc21f335f10a7c400cd92cbcb5c82f7d15b3813b9396bcd851fa4ceae812741efeaebfb21070dda021c2a317338fc88ba006e59a4dbcfe365d83ef3a98a197a879a11ddaba55c8a7abbaf86e0b012d7e77c1965478e3786e6052923dfaf053be7a4b1914f44e1efad78989645ea7d7a4dcf786037c9334da76617867239d772b82dfa6086282afc1e419788b9a4b3a5e1b703ffd70c1a111acc87d09b8123824108e827771e723c05ccca95b9282791a1e645718af82c25a6e28b884e60a82a25f9a4dacb35005341a5d30879460d794ce305922641a74139a1f171ec10c9ca0bfa1831e47295ab47bbea1dab453dac712b2075bd98de167aa8eefa95419178d12551d3a5d9826333c911ac31b689bb7153eb5f10d47d14c4d380f9aaa5e0700c345e99865b6c9ed1a5b080dba6f57094125263b8f9950496231709194082f98e7b86782142084437b1457241c911678a3dadaa500de73c6b1bd5bfbcf6989cfabfdb97c402781ba1590ad43bcb4c776202d739fc253199814107ac8b479b0fb94f60f0e29ae588da582ba3f7b353dfcbeeb558cd84f2393dc817c92de217105b6d194eae80277d221c8b4cc74eaee3bd4579f23e44814ae0a75acf90c77b9bc2278dc39c30c5da6969904c4cb221852f601b9a4a636eded669eb29c752f37fa1d2fba8bc5817755491ddcdabf96679fdd7530b0c8a81fa0975d0608024ba20b579ee959092a753338c38e6256a66d2439ade4174d76d6e20782dd374ef3148220f0c23a344368922716c9a37de864f0ab43e9901bbeaf2e8498905c4333c5ac22163b3f20e01534f63bf4b2a840e0a754d3c927704ded78bfa514c140dd911396235c1a74c495be866ed6d15739f4b2bc41f64a1dee830c75d2b2459353b8dd2e2fbcec595ee08449ec36afe1e06a6e1d53758157321ffe1c1badf59d9948cf1fdc080c893014a92ebdb3bccf9be8a5bb0f01841ea8dc12fba1b6d7473127fe72beec47234a2457715e0413164a38b494a09fbb322b85e872f1b39597676d6f89a577cee816fa2314552305ed4564ba57f13b5a0b8549e0dc6c945602cdfa6ab22326c909b5e4e7b4fef704fa0d7fa5babbb9a92e289fa4c512cb98320d1f7de497b0cfbdb563948ebfacf424c23cf7bd429e0f0734ce7e82a80e61b336d13d00f532bc85583a4dafd54cc244d7a0bd9c4a2156a73f5b044c6517f0172f332113aace8eabdaeab33134b4ab4b324617f9fff0de91591af77718568a00fe0b24a167f2f7984319eec82f5bad126c5aaaa3c17dc79f6f4c8f5d2d96ee021998049f5eb34f4e432d5263bb736fb416f5c602d0d2f4a78d98d399cf26eb8edfde6cf748000ad7d685eb1e9383ef0f8b027c7a4184ac36c8d8a8c6afe82b6cba7b8333497efa186a816aa081b9488f31150d882b440c6c2c983cbc5cad6c68f4c371564da09df9fd53722f8fc2029f0446e55526bbb6a135cf00f0a48c1029acf01ad3ed4145376245a20a8479089cbf5de181337959a94f478bfe43daab28e852a250be2d03aaca95107a04634f4c2cacfa519d38d0f7ce80955cc600e997910473a85c23294f1402f8826dc0d8e535e0b22d4bdee52a900b92688d404660f03b936b9a9947150e0cb7f38a945a188f44962bff7c7d2d73776311af5677003754dfe2e599aea3cb108a1cd894afe9d29c65d335c08cfd0b52703d7c1953a19f00fa6ff99ec48594e848b15ac7df3c261bc9d33003fd12e48d5a6ceab9ec8da65cdf3e352b474ef42804004fbb3c441a19a09ce37964957cf14c9019e233e83759638380921e257746649fa769751789aae2bb790c6f123f782c59bf2a2cd13b85afd3ca5d385d18fabda7add304a88e0e96cdbc393812feb3497bef503aea825412dd289b13c343ab4d140d4256110125410ced11112be343ecc406cb0bc83da9e2e3ad1ec49420119147e68f4d18e4f9d71520a1635ef7504255bb3fe853183347c99e55e870d7da73431c2faf02b50ee1dd06cc7e57496111a374be855f9de96247e7898543cddf475e00a0d065bf43f02687da22aa4f753e44292d81de9cf503954029fb0c40f54fce46cc6a581b9e1c7e587dbb3fc2c5f69bac964d0f1c41ed044e3be605239c00fde001e7d82ddc99ecc67e2a30742a7981e45ce3809792a828c1d1702b5d2cadd07220a9d828470d12c64f946d903a9a25c4c19f18356854e7c9cab6f4f765c0bec493df27098234ae84ba29fa92d2577ba8379cba363754b39d2239ef0239dcb2582c2de1a18bbdd5587d88d2b2bcd6f710a800a0997a0d38628096afc268ed32f324ddceaac52342d35a5989e67d96d302c05422d4efc64f1bba5b510ed88e273f9d3c6523bf5dee6384703caab1c31b9e73046cf2a7e8171aac098949e3abd961e9f81b76779863b852c073f18a4f3fbf40a486cdf3d86f88e260fc63448272b2a94d7d6b05d20dc4cc8eed8cfc5eb55e449b809a8697ec227f216f17ddddd8fc9afd225bebf1da130d6bd20aa00593f130d484aa04c58cfd77e656f8a6d52c4d58128c0bd53eeb566e6114582413c6285e806ad37a87e345b035c610a426d3d7961a7f98d6714ab9b343954c9cc820f879ebc0040c1aea7e0433e8e72b236cb3210e804caa33672d0625733734d996958c6813ba96e92b5fbeff3742e7a0eca35ee5e15a6e13ecdd550ccab3146c9f7310619aab8fd592795756fe9880e95b24f78aed80139c38801122846e4b3afd0ba6a7f72f319eaa696029743a884409f5a511e316c4e41e964080e3c751597cacb7b2a684250120db2ef975a2e6ac97de9597f6e3a3af8a8844a182a4e266df23f85f32335d6b724cc6140c68c2eb2dd561a854ba67b3889494957077cf8a526a02d603394601258206cedfda037f715860fa5cb9ab75f4e9e190ed2b6a484ad304ec91a7ffa21cb03bb5364f0eb5a12a293aa2eb8eb0d2d5b69f53e9c6192ec67e967b236c0294ea952b86e8ae92736a18d40c0586b71fc6479593926e9edb3e3a25fce46cca06d140a5ebb98734a146180a1d6c3e71d67c61140ba5468a5650da77ece53cb0b8c42926dcbd2ee755f0d7067b1b09d9d0b1d8591ec6e505ca2250a8eb2cee430400a5e573f63039d1e265d2f1e4a11d688a3bff21c9fd05925aba47a7db5cbb5f63f7755066bfd4170799b54e28095ac6e5a0d202248d98e9b4d53819a347cf85b85e689bc49e340461b9f4c18feb0051ee508e1c9a3a17e6c9bfc7166f3405f4ff3ddd82bd9ac675d6c4fe2088e532483e4a6ace807d9c7a6e3f5eb1d6bfddf2c37256891fefb3442525422048ce9e0983c3000e76492abe5338b284e9e52bc8221a6d1825adc5972876d5c3be009ee7053c544ca5d1b4945e2734d846813b1aa191b6b36653b50d6ed4858c6d435bacd036e93f2038d004751aaaf7cce7a682c587edefbfc7dcd27c37c02ec5d29080dc8265667a418a2409241799441f88f5484c3b7fb141619f66ec664c9ef392162ae59216819e3e3b3a82ac473a38aa198013e4a7654c5f1d6114604fce0e2562d78524d41f6085a5c6adb72d39f681ae55c97de8853ac0ba6e441d09f6498868b17e542c4d034c4b34035a10c61a755f1a84cc3600c87201a88a4a45b7f3e1cdfda48c49ecface2a15f55361237158ed253048dd4fb8eff4a315a10b2aa378bb71a9ce69430b048f3a8255e7c2b3cd4be79be912d6c40f40e75c32d26ff2288f737b2eec942623f8b2e63c22a73f54be4e30ba311b102db920c8f6da7fdfb9cc34aad3600f87db0e5af99d12aef4a40dce0bec7ceec21c148685f14e461d01e1ae460942d236be131dadf0fc219256fd62dde11ee76e9f9bdca5c60e01a0f2bb7f54d8f80ac725b481b01980ac4ccd560aadacf3449dcb4ff1377a5e86d7c72230e2f7f2210f01fc376950c0197c9f59ba311e259802249e38cbe1495152ccb61d6420183d59fa843a7e1fccf92aa0d6b306bcb20726b1d10b119e0df0a88c85643348b0eb618d3aaab9dfc8c52dcf9004de6b8d8cf960bbd5e37b58ddc5d0b99d0a1bf325423926ede6973ae3e1fba27252c9da3f451372550b52bc92797985dab39a5a18541362d564df5f70e743a475554b3f55c7cef502bfd05200a2ef9462c81720db26ba0e5a44e8fc3a3854b585d3eaf81f78aea3b155007276f81903df02ab3c80b098e5d62dd1e8f1ddea22706479439ea2e8be25c2270d76b9638c765885baee5490124301aab2fd93e39118670363460182906b90f88df2721e80571d77dd5d81f3778731021c35d8b6fd3b46b922dbd07c41adf44cf13917f4b43b5ea57ec175034c5b9019d9789fc66d6b01db1f3ff93c595287a03afa1e1f8477a2ee824661d479eb187884d03cbaf2a0f4befc789fcb191946c40d89d1811d5cb9922856970ae47708190ea5ccf820594cdff3e615e927242c7149e4c12e0306de9adf7da32b0e3dd0aa3fe4ac0031bb497dc00ecadc01bea45dd0256f2f1d64a61b4f10e2a7a41242f59a1d1b56547df4cdfdae56bf4d1413c914fcb6ba3794362d0cddbe1345590d5979bfb3ed4ea73b75d0491f697890bea70018fa9fbe5248d9823f2f1c02a81ad49e5128c938a2d10dd17ec57a3903fa4388c385f3fe49795b384ac196246b794bb776db21b5cc7d2611c06244814ced9c0fc6f1905361bcc3fb8f17e3e557ec86f30199d98b8b0caed35f993e786d4be417bcc668fb1f2202c74d62feb459fe9ae03760103ed6507b4b7b33574e20f2ab360590234a295ea205f54c0209296925fc5d7ddbf80045da5cfa9cc8f9c9ef1e43a447e033ce166dc80b2b9096fc11aab762787c269b49866767c9daae10c0bc5f37dde783382352f201359c158132027239a8c130c505d3fd6aff1274d6fa78e8cbf8f70e4da70fd629fac7af09d1b51fd26ef68382fac8664ab673e303c8a9461eb2da2c7fe3f96b7acea633aeece8b6c07bfb709b970bec205f756c3929c714c0a8d8957ce2bd977bbc6fdd8ab74eff61bf6624da9feba65e692c730a142db7011ad8744abde49e50db1f90544b375fbccc7c2855acf0b6fc577b3cce331e2cf8e0c934a71192ce7528c31e258b4ae27bfd8fb0ec9779f3f35cf2f5446c3742a49ca8d69d42316852fc2fa3ee2ffede00a92c200da60e1cd4ee8661ef2bf0fae6b0adfa294f1af17c79e9cd65e009b75b88eba6ec7a68d4a031d5e61b53b537c01a00ab809767aa4888f86c579b6d84fd160a36d0fd08cfd60a6326a0d9a64c9461c03f9706f19023e45f6bb8b6a99270420737d98d3c2d3dd1497fcde60960f128f94933fa09ba808fdc677729b1351aeed322b73994c08a471228a5b5a57dc477499116b3071c3e3cb831046dc49168530a26f7f2a9a1149d10c172eb74f86e342e7700bac9235f3b2a7e9c42de0ad1119d2559b9743410f436dd887a71926a974962da580941508c2cc9b1e850e2238ae3ea2c177b1d40f5ca746c924e7f3353e31672ee739b4eec7d17a232e452c3864003206eb7262651ef351d1745c3198e421c00c427485d2caef272388c429a957b5d19f1f7eadeff262c287399baba606aa20566e0f56e45ee0eb66da5cb05ced07e955e40f6ecd4d4895561cb98b2266b10dfce204aaafa974b3775fa74eed16035f17e367d13efb75f6cfd3cc665db140b42383732b55a907a48e4483543e649c42832a585e46c320d5d772d604b66de3378f9f991674f2ff22ec1641d6c4f05a030d2a22155f8291a9853a6bc485e767f286dbff13af0385c35dc382bc76586db5e9e0226ca15e3eb1e53c3c4cdc60885d869af86dc3b370a933a100545bc01309b5a78e40d843e580661440d2bfbe1028a2b3947584ca5d3e48687b8c0f08733f24c9c6d437141664f1484ccec743171e8584394100e2dafa05fc19653bbb33477b3a03240915a5b7f19f27884c109830d3582f9a13f83e9e25caec2566e15ab39bed72e5646ad12a6f085ccbc20d50c4bbff257cf6984e43d420aa5b027e3a36bc4dc42a41f6b459ac9f47060115196b4c3e646f5028cd46a1de9f2b639cc2382940393f46f7a889716f754735828448a8123a56e03bc9fc02374303c39991f431d11bb0234900adc59e2cbc9a652b17af36ee53b2049f028f9ae084a3d1a2f6f8227f4834811025913f308fedf31b129c875b2a0acd16f88f1ff88c11356bee7c324617760e2d551f12b6a8f2dcc183f2c45533f8c3279c832090b67926b63506a16b189325e1a204fca985169aa18b80c9b7563495b61b78d1aaa6b1a506cbe000fc3a7f09ee4fb80c39439e46309f62c3b0ea2792d6503095424ee685483b0cd352e8d72d8443291369d2e0ff560f8512302b788907e0fd3bc97d560b301e5980b470d15d717a571b89be43bb40095ff875ca4a2abfcdd19db2670f04a804aa0b660e44ecf6ace4d156684e697969a158cdff3f002acf7e7d89ec2d9e835ae099d6c75f6b13c58a4c767d08c13ad5af1521c3e2df7fc82c891c1f4c59a9dac87d6aac59b5231d85d4258cec1f644e0e669619ecbf4458c4f37414b75f30b700301831624ca9758add882db0d543e8507235a221d24e8d36c8592dbfc5d5ce30bfb6530f34b544f13dc7f334ddb98cc694339f12a833b1c37b2286180c75f0670264eedd2563df36c7beb09c1025c77ea14f962112934aaf03d1e0b75cd4aee81ff43063ad2eee0d8b9593a48287a24f0a756150e34269f4822418ac5196626c3b86e91adbd594b4556296fde4399cc2f03c00a6c199509755cfd3d0f3e7a53c65ac385f1b7e31fac692a868e6a1a50c7dcf66891928d3bacd8f379aa29946d4a0f064861cfd2f8002ab8a7c043ac80f0e257af7a623ef1913a00bda96e2a7e0c1a08c28f81dfdc39c9d207ae0f9decf87ff3e4c4dd54b3a2c6383d655ba937715dc34aaf8c44ef26129aedbc223ce4a52f060cc1ab2e0c3bb24a1c243870d85edea1c69de4a3b6728fb1807215f905a8e22308d0ae591813ef67b2372decffb6ed09be054e3cf389c935298d053f88e8b5e3e41f99d41bd8b98cec9e17da90a39f235d07bb9eb14bb1b0b1583a6eaa7043f25e05162646a035243663c596b7a51d3c59900d03f092da71ea08eb5f56a1581207a5ff03f838aafc9fb85d3ec94a393e2e14326132d01ee5b4da3bc125fcb0180e19e08011a943eebe844feb2b94f76739406d68cf57e3331e4e16c507a40e643779017c809e0eca96840af6640197a9ef431499b2196e4feade4c0d02835bc4554a8e0b3fec55f6ab80c4487acc06371ada0eb5464a34b2aac026411be14c2e297028d2ccfa6e9f33dd03ceefab80fac85c01a981731928b29b5ed76d50c0e4db2e585b9e032ce28d5938b297ef2d904fdd44d5869ef2552ba01af6f0d901e198d688bf0970a8ea460389b00e5e252fe38b1c3690e5306d87b329ceae83bad4930edd06313e519185a8ee38e108e7bc7c6beb3e7835f17c520e290d9e3f2e1bd662ce4e0729877c21ddecf6e9934c912c2107078247b00687a7b9b10d5d1e3cbd187fcebb633767c85582b839e31268959c899e67196a3b388719d40ccb8d860c100bd242b39e685f49a0b82bf3de1be6e82228c0b5cbbcd01d6761e60d204a2cf31352607781281e8165f8f6f5a6e40fb3296c267007bde88d58aeddfbf1571c42e9a9733a6f8da2121a420eb4804d8068db31bb77f75c3c6e6e3e5e1483f0bcafd9013e369cc0bf4316b6e5a8106ea7ab67933ee357ae4d16340018988109a53b22fc4fa0b95f48919d645c0cd3ce7ab1650b14632c3b3bdda6aed62c0c5d171f02d165a1dc689fcfa02d5503b2cad9a7bd40d070f90de3e0fafc91137cae12080b4b134c0c173b48f458dd2ef825c4ab53f988cd893f42578ffbdd4062f93b6ffcaf05cd3f580eaad66670927d5b3c21c98caf67bc1bd6fa2638f3d204c9730f1e23cf852f680f9988e6475549f701342f07113a84bc2022203b02b20b05476b716daa760d5794002a2cf826636d4f714670434321ac63f35948b6d4b245a35422fcf6fed9a272b4647ae47cc22fcdc2ea9099ebaf2da4f6636ec1093ebaaf8b4222657012806e7ae492b1de06d37650da6d083453cfd8e3112cf3d620e313e86f030ae131997df28d5282f91fa578083432741e60df0e4dddad9029e74e53c0e66c7e1f363a732f404ac47c92252f229ae9cc9f34d435c03adacc16340a9a595dacdadd6ee37ed6b60ba3ddcd9c7c4b55517710031783b074d6e274043c39d1c3629bb71dc856a597b287594e5b87523b9d94ea0cb9e4483d324690b1173aec2cad3bbcc42171a3e5adac4c496bcd3a2a53eaf886b21382de02f37815bcaed4fd6ca504649afbedb16398bc7086f542fadad7ce5a4cb90277e6d6e7f0de23504c32f016a1e172dc33100f48bcba65fb397452f6c70b606cb4c36ab4a666b802188b557a9591abc87d91ed8175fab4e845e6086e7515a7f58b2fab7f5cb4af78b073b8e909035c8c1bd06d8c75e376ae3a09b388479a5682e3709c8aef109fc02819076fb6f048b00f52dcfd41b309924bd03f22bc844d24bf96297c1a744b256ca4e206d1fccb6ce48b3dc0091a537bf434b7a317cdf5880e45f87aeec1c16000d9311b0fc0f5df1cf399411a511fef98fbcb5709dc051877d8f9d8b3e887ab71f2ac6f2046d0286afab1839f1dc3bc34bf2361dad92b6478c92021f68c3791be9af22a07e6ce2945f7027bb81e4fc221d515f288710cd27879f670dbcaa9365ed6df5b8cb9eeb683cfae6764010182741669ff14b6f0672ecb6a4a2b6fc186d52c47bbf859fa7a9c82d479d596f8d85d7815823f1ca008dc9a4e9e3a8e1372c1938b639f8122e404c849891e5ff089a726120a64b100bd1635489f797262be3a019d08f09114af5fc8244392a8fa5d23c5a6774d3cd4f5a008eee65536086ca22a51b443ab9f47a7018e80e08c4420364fbe30a1aa1206d8326a97f479537343be71a3e25755c9bd26b13f570ecdef8934512e149095d0ce3625baf956d688db79eecbc1ab6c0411ca680ce4add11ba1dfab9f3012f78ec95e38f5c495315dd7fa4adc3d5514db829e7ed946e4c4a284a9c147aad14563548102feb29a430f8a01b310c5b7ad9a0529d60d9491410196979353647bef2516b651857e6847b35151054053bd6f7540e8746fbd09705e5ec0d99afaf0e7ff76c8bf98158dbc501b766a5ad2f22b54c219e3b7b8dfa862529c279f4b0e24918a5151558cb20c31f1eb3dff4db4509033f6cf710350c203c2d3c4c819d9504a7659ee3cf9faff4e81c3cd5dacf60653231e1d815b0d2283d0752f31757221df96d7049544bfd3bdfe7b68e1fcabcb38dcc961a4b1db16bbe662bb4cef031c9089cdef792081ecde6fc1881ebe244d84a96ab82a833db367bf1fb96e5411476a63bb495b99d2a3685e23ffedb754eefd2c7bf1d2e4c844b3cbcbf494187eab289b4b5908eaa9d8715698b7e455ab01fb415c9eff30acd7eea73bc6299e4614d341497cef9b2f646af7ca8402bf16756de453a51254c88fc26ac139708535cf5b248975a0f22ec15bbcbec0fb328fd5c531049f4244cc1958b882375d9ef80aad60f8a9ef574050b10dab943f64c163947c22bd067df9afaac413f16166ae250750002c4b76b61f4cfc37acc8d20f0d62e494967714fe4366c86dea7606e412281f140062a6e7ca10743fbda752e82c6ff69dd3a33bd00c7aada2a57613295d29fdcec4018082cbc1f12c1ae6ecd01d1ef77b007ea9af6fc43558abbbc7097f2ff9bd0f77c45c431aeca3a23e811709998f54dd842f691f78adc4530cbe6b414f43b84bf15c0d84c2db186f11b7c9be92ac4ca57f56ae56701d8f40f678b3cd055211cc3d9f09912459cdca58c89a2273e055a22252f7c0a29d787ef4784ee6d3c8de72e45c58213b2a13702e7fa6c84b43971962e3b93954796f44b7690991d1006302daa7cb0a789cd4b7b566703e81184467bf296322996d83c3dada4bccfbe8dabadb5f0bb29b92860f04132c2e78ee8d855f170f089e1c5750801ed91891cddbb601a07e8a728f4ab6189f6312c3bb9f85e95d02a644b4174984d43be74d97518825da674ecfcca9763c3b2a972d9db99589b047260a46f1f558df1fafabbb717da2295f59506a2c0b79a704f4e822a32b5a1bb364d5cb01e68d1bf37b98cb113a8f9768539c7698fa4201cfa442ae2b07dc3bbaac96d828307790ea6ebf6d3f81093bcc419524200ddc1f3032ad1aec5a551e0309960ce71a2098e15e6ccbd93cf67ddda62afc7c14871a4923482540f1e76034dae6a228047466c59fe9e5916fc783da42a843465eb6995b59f6fdb6cbf138dca731814c663ec0045d6e31e7dacef3e653e15421c2a347ad935f0113d4ec24d9261cbae2544692b146746033a81524bce94e41a9b05348fb39b8b021be7378280415c2cd3b82f2f2de31017d9992d91f191d82032467dacb9eb2035c5d1c393f054e7a14bcd0441c07cc1b5c73686e676957f884c44279df7d41f891d1126a52b5fafc0a831eec2f0cbefb748232b5dea15de0cc5b89ac6865b6803ae5cfbd92e602e10002b2e3a7c0f46b09ba71504c570a4e575d49df217e7624c40b8b4b644adb6db013c260129c0ff9fdc250940f232262a2d878c0cf1c128bcf8a42f0b258c81a1b7503f98bf2f5e399298ddd765b7ac59a13fe2fb75b4237812fa1a9da33a42731f6cab8ee9b928d03f2c81c5cc431cf3e09a9ef2041164c4b9ac680fcb61851dca6ff221a888109d1b09d1be62a9c11c5ee42bfde2e40034b4ddc285f21d36543dc2b0f41aeb25fc695327d0f3e7e345d327a66b4c78ab61377f79ca8aa7a588a0756b5a024cd7210f43cf9b5d63141970b5945ca6253edfdda567cba9cbfc2002d08d29634b17b274bdbe15891a7ff95b8213b855caf8bb77450dc50faec7ffa38b4f2d7c3eed307b50d0cf6049926538c8e890a86160a4f268365c5225db3400eedb108b017352ef06604eda3c9f5ae44dfc5918fcbe8618f5afbac306048d4f5d61d59b6ab42b42e99ca7f927522ff545f8a3eb014d29b58e938c829efcd5e266a6f60ef6e9da156be17ed386541268027241bce13651a3c6f35149f0989822e03ae41acf8e7f30f12a90415593753b739bed0056473a7eb28f999a85a66e1d38c3ca514d7389cc268ffde171dcdf25d8652e089e9fe6bed3e2bba9aedf20499a0797dd871ff658bb525994b227f117d8e2045a14ed64346c8e4edb9fe6491c4ffa75e79ad2ae70d91bda0f76f24ca95a71b12d643c81740e3c6c9a9bf0fafdbd141a105c1d6e9860a806f639f694d91a5530d8e6c21fca850f9282ab3d22f45a6894d4263a4a9192cf1c94df053f65891834463413be899fef0863d5a49045bcc240914fffdc1f2371c33b85800c3f293519f2e27a8bc6f6930220c76a41a0744f2bd858f8c7797de04e692897ed155244015e0830ee42f60aae30f6c7385bdb89ef541c8c9fbf0b79d0caa19a4b331c2f7f8cfe0d93516d142a18c6223f16a37ea4390790027cdae7c42d06fe0ec073b5d24e2168387c62bf0498c751f2935cc6d48a2099d85833f28467125005a1cbac59943a205853a596b67142e4c90d35ffa15372a571b8039e3fd1e6d5b380a7fe830d4011e11e33b41f4bca6a7328a0943e43a7b359cd38bfd09cd31b4379b583ff7181e7a913070bb044dafb8afe3d230ee64aebd597df48df66a026f938e8d10a898e1da3fee0973e2965d324d8b78d6e7269d07a2cdfcd7f0e3dcb3497387d0d7937c6ed86876523aa8809df57e21c47906463099adf6e0cf05f40f87ce806aa98dd1849487c67436ef4160711d87843e4eb439e822f9314280f37ea2299e4a82b8c8f1f02047ca16198bb06b588b6f05b426cd405a31520d2b657ba5ee3b41633e6eabd2b23c663aedc282b8100f1a97b784b4ddb6783dd522261031d56869c056c3ba638235e3260c966fd0f73830910287f16e6b9d92be1c37d7e62f98bf91c98cc339ff16e587d008e372fe25d34bfe35c4811bfdd7dbcf3b064009b5a8439c528e4ec4b887c227ceb40519e5f121da40ab4208e191aa4d9c7a5987d74f7a2457aa690b60ba1c0b40817db61c237c4a499a878c043c76a9f4d7a2d322b80c1eea37be2ab7ae37dcd90200837572512797819d7d39ca0f6a60e1a6437b0682a36d4f1166b10bee36f308e0ddfb9b2950e4bc2696f938d3b1ebf88b7ef0f5b3a7b2f23841eac824e29fb01bb0b0e07bf7c2cf7006fe24b9322055dd9843e213a01dde5076e8abdcc94ad72d383fb8fcfdff1c369093d1178082928bc5b3a3360bf044edc3ad0c02033e2b5c7f1bc8efa407f18bfbb0657a031429b5aa0f143074f460b546dca8709df1403a7d8efa5296354d536950da3a2f5c8e605ce21148ed1847ec6a1a856491a687d172af943ec54a2b200d8f5e793d28de2356af1fd26500abf5d9c2b00bdc9c3a2bc801ab0db4e53c39d54b1519405360c694c20988f691bccaf0ee83ad37a5c31354fe8c79a3e0d8fa09c329820f8783d9b1766b67924d9231a8fa267911af2c132df338df504e099da823f5507c4a475f285a594f775171196fd4cd6fe27f67e75142182d8e002dd8110bfc3ecf0a0d33708ce6d7d765478421d29da86066785fe620fd33d2752f4c8c9e9689743aeac9c22a391ff65a9a5e21645b2df1ca8d637e8de849894dbc9325a74fbd6029664d519845340babff9b5480c3759d71f97591a45d4fecc99392f3131f3553125ab9b19f81d7ac952f0e5b21f5ce6f67aab2a33d1958cf254663f213e18b65b9c023687b1a600d548f6d81f5b959b883d1409a248a4f2356ebdb22515de050533efd9ec661e54fb1bcadef3a63f143c506b9d0df002dcc5db180703294adebb066bd26a6de049b676e594ec04f70c9983a1139e9b952a0743b46fa9bb6bcbec1b2e3e360d794e5d84558dc6467e96f4df6b3c7f1cdeb3e7d524fe52255bf26a063c0e0f986b5d357ac8bf5500ac26a797e0581af91d8caab136bc0af8d32d0d7736b829cd5c82c81f15348520be226048de2eb75ca55a7010074d222ee2bd391023b0c5b2fab3b82bf23c6d633ae6023013dbb92a68950cf8f4e093447e957b351aadb2f03743be0d6f260b476c32d7d824d260f3ba6c60f0075ad2d985adf741e680d31cd96c49debc198e68406ea7dc76bb0ec4e272c9ef8b2630371a51479aeb7ba0e58e12ace13dd455b4b2d22f803a61c75add5c9e9aed532f17b86c7468a83026acf6e2db9d3b500a278c551fada085911fef256f0235a2087f36b69c79331f8af61eceb65258e5fd9996042ad6e74e672b03c18178bd0a1b0c4e1e84478dd73c99f2e47a6279d28955ce6491e4ad5f734772278424b321925091052b383e32b9582df9383d65b092d63e36758bbe5864814de6d235955ede71b097507031ce7791f5ff9aa6e30348a452dd99f143e9d7a7b77cdb2013a5a6fc287ed2cb6ccc1cdd65fede5df70af9dc28a944b1cda740da678c28a466d7beb53b3f67122a911b0cf034916a0d3920f264e486c025f9c28c8f7ddf5a2a5e6e61fa7cc99720b901b0020f87da05999cd9920e381e8dbd5dd33530be56f6c6cb84dbe19fc0fcc8e8c1539a1c8f9c9a66416c3da590bf45ccfabc7a0b7d89f2d80efe6577620a90f192968da1fc85bbab72ce7c3e503ada1f94fb6fa1c51260f1259b99023daf1483410dd9b9a5737f57e8b4a400147877f0b5e12ad9722963ff46e7f2872363d93cc5517c94b0121768182ea878159a35953db41ec1a3119c43189752439b0659408be5dd1079a264d06729e70a5675b6bbc7a984076f9a73de7e79ccf6e288a02efbe4a8a84e157b8290798a9938080a1017740b40f28a532c432c9d261acfdb64dca2005253b8070742a8418b2fa814228bb2cbfea81ae7b42a931e112cf027ce052ba56fc7f36f9b07727d6c0c3be71bac8146cd72a5987e960ca617e25a51193d1f411603e61f2b72e9af6593b5f789c2ca94ba3af0d5d5d2328718efc94c8c77b41b0cd63cf32f217b389497ce239bb42135df07b1e9a2fc7fad658448f2386d6fed5d14dfd4bd367debc17ea2f9f20629b765c4367a0a6f9ec7834c9be57f0add8a8086e172ea064846732e683040ee1053fb6472660e280696b8181190732958075798a95683ceeb060cc69fc6f3969d16a26112e5ebc80f85f977820409b89ed5f916b92ec13841152d95326f789ac667fdccfa6bf4f867218b2d660dd62b68512174d29f183bf83c30c84d9c77db7bed8fd54032361df7650f84ea82351bc266c2e406ad20e1532fc69396067ad8b45711e3280246b27c718b8c1e478a3c24692f845994b6ad4fb4f1955fb7056c3a2518e972c90bd3ddda347f9ff88a0f802e9f093a48b816c3e1415e7c6a57153a6f1d8a9974286d1c09178d65e7f18c70833cb3f76785a926aa9cc430167ded5bbeb26b306fbe4bd88d1b900870886ec1a0d0e38ec541f4459b08edff1b358fe5719a4d1c1841bf9062a7c23942630de5c3281e9e08d9f4e9bf39896d8f8c1836810abb2145631eff4b798c37cf27bf2a2f0f6632355713fa2462bb113177901097d0a82eb0f025f03dd60fdf43720ad6bb664be512d9858b857a6b0d4cb3456abe9652c0c7a0f070144b03c358aca11c7e4c406382c487107b056e10051d10d437025c546cad51cec432348e5903f980f33c33dba3f5c8e0aa0db22c41668e8f0b140fc653a38fead28116328b434360322ee4a756dd485eed58b6aa0caeda1cfb34ba630c8d05e15342be1d4c1929794e695c7de6d9f5229b60833667780f9dc3e542c0408f20a89381567f2e044939cbd9644290e0b1881fa7a2338d005b5b7ae743da7a888f6a5c9ca96247cc8630d46a45571e08e4794a05b33e8cbd588d76f471191d540ba7220f562a79e2ff45f308c0e2715501adc578f637d7b4895fa41711bdbb4c972230d535f1c81ee12b460b4e21c116320f75d074a8578b3444d1794213260f74569591f5693851dc897db372cce82c0989b4df405cd24d082c34017a9e51d89bdf3737e12032387506e8095dce79be8aadde57bf4fc5d38f7c4fc69b035fe784ea9ca1153675a4012df25fb8437982efc2bae5074aeb456de6e82ae683b0e89eee62d440a169e8c3546f457c45c86e4359034da9250748cec8a9111f260da070f0234f6fc8f5bebbe62609a6781a7860900c602259b8cbbc275b5e7147b1a7d6b2033d367285ad29d8fd3914a10af90f36a4152a7153cf0ca0d43fa0407e328ee2c21ad2616da32d582c8acfa77de7d5da192ec78bbb7d6139478b207a536b0bd48e2395d2712a97c698fa138c2547bca85a3a725d7a8301fe465b6ff1d2afdd58402a6bb0eb971a7f7584d6de47a462380b5a612e53afb18029b05d60340a462c7aa06de0d903295249375f6da00b9703245311e46e64ed0a89048c1c7dbca08b30a9eafc77a3753511e4e8e846a8f89c7396179d89b1ac243772ccedb3694acfa61985af8c5691821bad9b4afe2fca6ba8cf0be545c2f1175c7287de37fd77ac7538d6b9225fe85d6508a6a35cc37fbbc83a7a1edb73cd0fee38fc6c9fffff5eb1e268161884b6f46827602aee72bf006a7863ac0e98d5fcdc570912132f89728ad52f427672328b631dc68d5caad79ce4c8e8557a916b77949f51a119eba9a855b32a22edcf0111e40ae79363b51ea76fab452d6d2c398c188ecc24f3a823b3b7e849c0341c497139c5394bd8bc04c701a88a8ddcdcf9553713b783484453a4e5d924dc46f8728f6d5a1edd6d1336f2c3ed73b8e9182bb6ba6b9df752958b051c2aaa65c194ba841d6fac3eb0b7228ea6d6144b28d5ea347702e50b29a05ea99ca158d583689c27766a5ead30830d051b4a73a20c36f23f196c7c8f2985ef4cd32380b7260be741cedfe2b9db8f9f2d568cb67afbbb3006e1156d7c736ea97ebfb4f2a2273f4f5c226da48110ebeb125caa192c852c9ecd09f4e91ce1f79495dc2d57c43da54badbf0d28d481aeb703ef8b4e05810a310a1edf4740ec1b5992747a301d2e02619aa1ddafff0b73a46e5829d71c38ba03e4dfa0d2be1e25ba8e9806003a960c00492c7c6636e91253196e15005a2e203a4ea27e133b433d524aa8d74405d99ea86f2ec7f73d7fd0e422a6041016d2365bc5e07d77b618804db7a9a36a6cf82e744a8bf2ab66e4b40d9cd94d84e7588a223cd7a6b045273e448e0af6863ebe4e72b36f2192ba5dd04b6ffb40fd231ec03edbb8eef2ba81da20b830e9eb272308c82cacbd152823c627fbdf63ff0844427d735fc380ee112076cbaae960e0c5459ff243b3b89facadbb349a8704c829b99b50c5b3f0a450f6070c30f9a8eb87f3eaf014fd240772606cc4adf30063292101f4ebd5e9da3d75ea3ad21767759b78e8d36c8a497203c54fb10c0e6d07383210c8709e5ec49d3fdff9daeec2426402efd8e04dd2a58ce0ad18fc39da1d151379c76e816cbd26b412f14e03c7ab736604cdcfef9b610953b1892001656015f0dbdb4290556f9a9c0c3832317d11f4d9ee6a3f7542042414eaa09f093fef8b80900791d99ef8c879731c3aae6ba6e14f16565838498907d898efaf83f284109180561f43ae7f37828da6518642a2e7358027f57568f4ec01829001a2d916cedb140ad5cfe9208becc1ca2f0edfce553586e7d3299803e11aac7cfb01da06804a01b0c2837f53c7aff91c2d057a5ef9cba395ba68cc2f7d72ec97650c7c1b8843036e310c0da45682005ef53b5c61fd113edececd3689d46334082f7c5f158a6d37a5867d7be00787f1f9e564d54bdc5c5735fbc5347cd56b89667797ad9ec75305dc7d26dddc0baba0631124932bb927a1559eb39ec61c4453a270f8d32545d88c7ea0e579f1d4d610355bc0d7802776c06a76441f6940d47e111dec8b66008eeaa95507e88a56ed67b3e97841d62617d0ac09c6ce06a6ba5998ab1ac40077e3071f3ab2b9ae95c5292b5cc813e391bdabcbfae7caad37b419d57274202b38b2252bc7bf4673d4ce1f39507ce65561c10451f066570800e22d353acebfbf67e5f063cb5419d1648f210fecbaaa69ce968b32dd402ca2bde63ac8e22cfbb6ed48186eec47ca07a918849c3a9b52a1642dfb56e554992272fbf890807dc75ed12ac060e3e65e96fa33e410ed278c609b5b3899f4967ba080ba0713c0546f5097e305930514d60fdc1748166e1d1fe91eac48d4e0925f4907963af35619107c896432b3ed637440ffe5db7d1b023388bdaba3ee7c05f1e97b31726c370e2e7459c607bc1a70783f7830b6e29d7078fd42237ae7c7bfabeea62736d22d5e3cf4fb1536282dcfb99b76ca2c3a770a6252387a420a6fe038465e3d04d285c7c668ef8bea1f8959b253ba593de512ab309e696d8236fe01ec709ca9a82fe958ed2614bc2f7391d034508ed6f4538c31170b8c990f4f4114247e4c8da15a1806805d7f690df15a9117197ff3f947eca7a29868264fd94494212007072d0afe1ce26929da8022522b8db9c66c10ce4dfee17cdd0620e1114581188056328d3be01a06359c960a6c5aa476360670ec07849d1ab249aa4fc6b220b7accd74050712b95366df9bc9bb248614cd7a6fe7740d336e00b800fc43cebffd18db13ddd097488718c5397e712853cb15bd2723dd9524aabb307c7ac7020d5b66a559f47425edfc90d4c77e28035a494bf735640b562601799f17ac3e621f63435c5cddf1875ab16b224eb3cd7459a9c3c4debbd4c499dbd6b1dd784204d99eb350ffe25045fb9e4f1f975c2a40253daa4a4562942a3143f6fa8d93b6ce09e84ed59ff087ceb2231e20a67a9be5308394dd38d43202699a905a5e5de25099915913c2ca18bb5bfe23a60624602dd4e7e8030431afe7a73cfdf92e0006451a4b8fe4c6dd16cf77600ebd84d625d8c015499ffed61bc634c13b96da8c80280d0dd737086687e55d175d89da83f05a1b7e9dfb5ff4ceda18778ed9b9e30dafe4b233cbf96d8686fffccfbc63bd59820e1885770431bad95540564e0a2fbd2983d5d0cf03b6ac0c4148cbdde8c0b72900a64af378408d64d33d3b0050a7d03c76645704d16baa8e32a76820a18be73a063e901255501207b8573de95078a6dc29d4991cdc85c27467bad04f8c1cbc3b43ad65878e0504db48edd47de63c2e41e9c1443bb7966cf954dbb58978692d88d2d692e01e6feb3307140f44ecb34fad9519d9ef06450884d0f3403023071b542dc69f2722ff723613e4986a5ba438701b82022bee5a8dbca0c506b75e72e4f1c2383c174d22b06f1aebbb8ee843830e1cfdf9c5507997f94e299736ccb078ee77e04270248e21509708833770b1c5a8ed323ce78c8f2ab20833e157d6028a61cd0695a499cb16dcb343de578f3b24a6698382ad22876df9b67befd2774debd690c20b824d97561493802dcf52ca63af4b03dbef4be547ebf0df35bcbc82669a024b3bc62fdd4b175d260aa234a040ff5a79f8460fde791b277ab94d033bd26d3d1bab0f2c393ad25f1126841359ba2915de6a425ffaafdaa265e814ed9ba20f8d6bb5f26b5c6208f49e8309017d01ce17496436ee906dcc9ec5aca2aa385e2cb89a5d1b14abc775f22bedb055f784804ba0f0b4e80bb4557d8364328fc5c21704e26c59f56f11d6653f561d8e18c4becbf187d90e19e714ab76023f461fe155c9d08f1acf9b90c02b83340b12ab4e4acf83fec2b639abb46355ca10a40539a611986c8ddc8b698459bb0805b31d82aeb02a35ff26ec9b61816f1c76199b0f91cd918d61269f0e1269411855dc77d27d89135e559d2734dda72b337493d0823a3c084dc552550957d859bf9aba1933879161c4f9c21678d192403c254427bda4b89cba794a7b615a1bdc08fc127aa467293091442cea42aea80ed71ec4a9eb961a830d32f16ed6b3047d896e0a9643296b70a52c41aaf51e251c38967748441e5873998246a6f1e29718d599bfd365804ccf94664b751b590741f7718ab1d7405dad3ac92157f07280291c82c159ca9b5325fa6e9c12183bdc66b1491758f23cd6b0ffade74be86ec7cde2d4eb477cc91ec1c4dd759964533cd97d835d97d209841dae7b43eeaaaedf405beaba25c9ad7315ca38bd10ce669921cb2dec49fd1d22a0fbce97a075b4a8eb48ce4ebe2b3840e355a1df94d0061124b45dbbeb4150a59908f621afb10d71571cdaf0cfc45b86170731ba8072cf027438c3890b3532057a75d63ec9a04a0d031f0080811627e7e034221f87861a384dda53f336e94284ed52b595aaa0629a83d58cfda7f7b8003afbcbca15c3d96ccca02e8fcc44b144f6a2826d36ba30d245650b0f5448b8acd54a0ab74e33e340fb16f4079c26ecc95b97f4bf518fc47ba7367c9ef74c06a9b3cee7143cb024c055b54b28a61277ad8f43c0000400d2322218be6101cf1a57b49df8ac8b5170a618390664091083d00c5762d7c2dca9439f831844a06aed2db9b442001c022a9e2948259b26535060c114bc098752379a16cb196dbd304b411d661178e768dcceaee6d10bdd29f39d451abf3d62a0585a30f79da4f83e384501291822471045cc9ba62d794640f974a27d17dbae2d1931286e26060a643cda9d5d7f2597dc18a6be2fa346ff58e75f0c9a32258b9b968820a81be2d56048fb0a8b5d048161387677b9c0bf256755e86576a390a4e60327111bf0bef33544aed183d06f6ed08b7f67b6d04741a1de4d8cecbdc07a6703e985a541a0a37d6691838cb544e95917976d96981f1475780968edbaa1464cbd8b86b1b4404d0b975ac0a75a48ae6481adbd86d834b6d10634fc51f6cec3b82391282aa113e09ecea2202df3d41ccf0402de5a5ca8806eed5c65ea657a44551980323ff88fb9d55713bf4c4ea6c1f71803a7ddfd88cff6f14a90eb660b341ddbec98e76afe97969a3d030391c6d42d1a6c9a7ca2d42ffdaeee97fd71988b8803114175fcf78c044a079994e38ee76095cf8654a76d75d84b4e64bcf91938b18d2882be797dc3381df6fa5dceecc3736cbd8aab9c11c406e420f897b1651ab572577f1f1ed21d6f65434205238bcfe98ab35b9b0cbeafd017baeb726b0791df6944a4a80ac0c6115c5ace881b5257ab1be30277fd3912e8e9f1cea1033bac0a75e2ebc6db8a0370b5cad1ebda64832555c16266532ccba216036d6dff8d2eae786766a146fefa73cedcc768432ffe10bfd76afee5b62cf16d284985207e920cb0e1f89cf83245c0df17c3db75b2a3cf5f104dc6db7ad36de5f663c95af5f0878c73a445dbc5a6f199537abc367661b59d610d877d3df0bc93e5b622ff2b46cb3ee25d708cfde36c91eb947af3a2a5fc2bf333ac98b294f55dcff5abd7b24064a5c1bd75d3e282dcee8770487a1f7ae3b1da160f146687d333f379b59d34a93d7c0a97a6a4e4cdd0ff9679df12b4dcb2d6e775e7369f4b5ddcaa032e2bb4c280551e33e4541519b6e40d896545ef4af505ee002df6e0b78dbf8810a61e2a35547f84cabc301fee97bcdc4412bc60b13619a86aa7abc4b028dffee627447063497565e9865f934d9d9e863547f813f8242947508aefd08093c56abd5618b3ea59dda7d8ac627bfff483ce3c3805352e3861334fcc327a0b09a11445ccafbee38d17f01efa96c90bb7142d6a642eafcdd3a2547d0ce512fa78e90291c027e62d071ce1c9b8787e6194507182008229f2987e293918ec84cc497699a3ffb6845aa3eb27defbdcf02f5c10cf3acd0da47b2ce39f0ab0efd9be0e6b59db324cbbb4fd8a835a4086aedc569497c4a0208c26f2b97b4ecaf423888eb4efa254558a0369f54eb3c15e948c145dc6bdd493685c848ff823a07b96347aed580972a034498d2a0f2352abe3a4fd7f290f699ded15eb29c040d37d38e672a35d9ddbadab3733b2ba7e9ed6a26f58ab10da2531d6becc004b33bc5078cab41e263d03cd98b870b1beea52600c5d5a2143a033ee99726609b3b47a1558bec1898eeb81fb1653ece586d6028ac1f015015eee63ca2ba9fa8cb5a29b7045635cc2fde2698a540ac8e3755716d12e213426c45604546a94d1c720dadb39a8fd95587ab8d6e473a917c345bc3d308bd3f6a428cda63463ad28418ed628e6fbf7f62e61b3e3c7f9f1ba28650173a159a7ab541e6baaa020dd52d7db940d352eb52ac8d9815e4a0166c25df6a1e8df1889e0ceb5503a52a710635a81dccd3259fbe65d2688ad5d3d8944abffa4750151529e3e54d25e4a9aa05aacbbf1405b3859f52bba2e84f1503681ecea01155d06202fd54f1d303e5a5de8295dd4a5382d08785294224ce233d3874ef9264fb706a202db726cc91ab9fa05df7236823b98b4a83f4332ecaf3dd2840fc871eaf3bff00051b788dbad973c4d5034d9abf6149e3f97102065bef51748d1aea7c9e86db43b5292336ab1d2ac113bd81416f2ed0ea976ba8c143a9796f5d4a77eab09bcf889b99105a262a13ec4c430245398e0d286704323d61c85a21449eda7f9a7931a30b7f68f277bbefccedd30efc576763f6b5cad3e0a01c06942024849652ae2d9d373617bc90bbada28c5ed9971b07b1d5442376827b9a9ba3ca420f707944d911b462aa7f74778144cb887e616be637d5de08d5431e940152ab337120390a42143498b52eb20bfec09dc83929b6bd57de701d316bbf7fc03f59e570829d2f40f091f347238c20d8a269a3989dc613230b9692c217660da77409014c7c6d60fcd12e5d6b175db4b7370e71a76739f7ddab99551fd20b2011a31b57f5ded87bfd708ddfd3102f6de5984f7ab5edf946f84ac41dfd40226869323d8533b1f8a35f83eb1f198d3a514d00ec152f40246665ed562e2269e55afbd461dac41d4e11660905fa4024ff179d573cb550a5d43830ee50cd6a025e85fd597b8d6c0c7ab10b03095bd0d32d2a7d1ae5d0d3a0fbe4d43fa5e1cd1b72053d26c6470d0a7303c2c988f0a06c4a052f04bdc79b91f0791011faa1f372f2165e0db6a0ff03d2085f5aa812ee07a428484d150de5dc650b80145b0e5083a1a0d88418b54ee3818e663365584c6674037aa06512f94c17586bed08c8d1cfa48c44c12c8abb1ee44416bfbe199eb17e8f2d28a62e2c17cec352425b58368b66341f7e2218be727707f7070b597d061825ddd05fd24abbe1ff690cde0f032a0ff4fe839c4a784ca4c2e255d32f57b025481391db6a9f356745ab81a4e563aa37c8e0f670b9539414d940803c5f248288f547c0e67b06df3daebf17886b95ae7ba87c5bf66e67cee3f492089c1490826e778851184f2f861975e538482cc14879e2096638a16020ecf9831e4835a42e14150ad35ab46ae29e9dc6208b1b2c02327bcfc1e15cce8e52db5d3c2335578c8207b34d378cf2a540e5d9938b8a683bc62da1533351495402b47af98abceadfd3a6d865044d91620680612cc3ec54711cba51ec60b688aa3e7297f1ce400c161f8473753442688b67a011c18105094c05586e084d396db7b24174b761e400f42e5bca9c3c98c04fe87c58562474c40c308e83c10c041b7012ddef01195a3d371269c5d5718fad3032f6a7780734a41a85366fa792d0593861b625eb87ea0feefea81962745a9426677920bc5d529efe2ddb412bcfa7a717e998a78fea9c929a4141b2c4b32fb8c46955de4eba463c6051cb7f33fcafd3dbce29f78a05dbb7f769cfdb57c9b8fdecd9b9cbc85d295707a3ffc202546e311f3e00111baa2280c001c3aba2a77049220529d16315b844e10d7c0724dba5d14d8eac3157fc6d793f7add41d483efbe70f0c8c7df68519809504989b0a20136d25457df9dfbea5bc2b317af13a24e06ef2730a7823011f96a6b7c623aa0edec7841da2b52f27a19905dcbcb6985674f38924dd0926098139ad87add61e9287d7e788d484c4b10880b98daecf8516ef8e7e4c80c55915668c5bbd7280c5884e3911b40ff1614f6f0cc7335409a08aeb5a1a9d7ca37da30b2e459b2f33f00c472305a4b1a1d93de202fd831ff8005887f5510aa0d21fd74c2b499bacd16a66d0990dad146033c154c4c1c545b4963abdbe906a240fc47f948d8c3a90b00fc677375f21f5ee7a010d0059aecd2aa7d084ca62e17f3d9cad3275d40665fc8473709ef2f62128d5596478b05fc1f75d0da149a240da92d115d953cbc13bec0f368ac4a95ca9e0cef155b5b55f5a010fc44dc88e5235771c13863d3ff5c9f05418249fc0f51b1334d2e19da59fe27c930f252dc026db15918094c5b21f5082b4d1633cae3b7ebad51fb9cabaa19cea965bf17d1e5ea286160326bf9e43fb6f4fe5842efaa1251f6ed3b433fc0258c06af1ca2f30c7d75f4635e78f1f7395f3b1fe1e512741825b4a6abb1b0fc8cfea3831ffd9573e94edc6920547c0907ed8c3c1d0c90ba9174327958f881ea1742b85f947b4d68743e22284e1975252657cdf3fd18c35267a137f61a800732f996566dc441d580a9bc13b5c25272dd6aca952408192a56e1344a5834a7b7238594c4d8a62ba92dfa7fc62651e25d351b57b0645b1a4085e6d60775d4ea596441b721ffd0800b972c197db9f4023498b9265f9cf9442f4d410c77afbfa760f01c16135a376ab01edc614c64fb9a54714a7a3a3ceb4c9d14c0a1000fbe42d825a6052254a6135a35cb7ad224600cb66abd19dcc75de341d670bdcdb416de558c5a50f0debcedb21717f5d01f8087a129fe6823a57b9f0f95e7ec875596413917252735cd25411ddb429fd7c71f6a0ecce47a6c732825f4e06b6871dd6fc2bd35d00dad70ef3594d84b80ceef21d4f334196947736c77950482d62e13919432d63ce5266479fab3d123316ede7833c581bf6110420b99093b81792cf45ec8c0d4f39bf54fdbfcdec20c4e308123020adffb783fac5b5754530cc099cd73f1dd0b5975894328dd33069a44daa6f590ab8ab39e4c099f25956690ab51af4417d5ee8ba5cfb6ef04dbc4339c12742acd9d4fbb8be7be4585838bb12ef513b9c46a62c70b39169f7e59ce9ef3a2195be1ceeda749d703e5384e3a37c4084700bf9b5ea658946f36f4c1b0c0c529757b305006d8a35778a479ede3714f57a471cfd1542d172343c96fae0977c87d2a42887194fb9f113f7a2a2ac7d8a40150be150803674736587c1a0d24b2e0f01454e7275a9589feafa1f4df7f1265283ea394312c8d114751c28bf59f72bda7505775581ee2ba09b0a76b9a25d56b84b1574b922dda970d715dab5c2bb7285735ff7866556acd956884a283d15b087e0a4388efccc7ad3ba546c0dc114dd2b387551b51567179095a96a3749951bb70c425c29a7aba5b360cbe0646db6f849a7db8a77b362d9ae0767fbb0718caf81aab30011126a54b9a0d6c39e3756180731d98aec9817b40cce962b06fe2f62c51adf172edc63daf8df38e23bc8682c839bfa6c87dcccf21c1b099d6376e801e2dc38321a6ee88934874351939124f8e866c8860372e0261faee41baea4023d2bf742b226615b63008bddb50d09e6c23df3cb866b2fe48a60b904ca8af30ddc603c86ab4d9a4b9bde50bf8db24d62f891d97850a96db44f41b3cd08a79b77223c1a013e38a31a8be4daa2f8513389dee94b49f0b0378ad83654cf93d0b3976a506f924660ad71860a4197475666114b4826b85e589f20f9dd529b5a1d59b51d9b9c4b21a2d598d8235b2b7e77f2304546adcffef17103537b331bb5b076ead6dddd5c3fad0cf8456ecffe7f6e91940699d2f096449b1267b39385ab762889fc5900c81f532ed8be3ec08190256ceb333bab06fd6aad49e978c9fdeecf03ce76dd25778abddb758286d70e1b086dd29d5b61a0dd2149fe08ef8ed1ebb5183224c693c0029399da31e4b05b9491f2cb7b2118f5b25823f0aca142344a60572144a5299791b3c72adfe2500da1e6bd65de68b1f3602a9554a2b964a26c7259a32d2e43b1fcd8c4f3fe1d5be99b6653b558fc5eea41cabf8368a11ae2073b988e694b8ab56455467af11962590a173324801e5256987c73ee7c25254c2562b42d9d107f3e8937849d25af00f0ed0007e9a87c7fa0387f77260a2372fa757b7c0a282cae4cac3c6d92feb04055e1877357324995c6b58c5b585b720bfb5f4bf31f5400374707877531b9b2cbc421551e8e5b86ae13e6085d92e4086d009fc073dcfffc6719706dba4f1851b4b9bcc2f8cf1537d532933bbe9293c73f7603103f78138ec1d5b6bb8df1bdd0e7d5732abccab12d381ca481602dad133a1e238ea8f69ed4e5e15b1d9e5e63e90f5108abfba9477ec809678c02cf708ba75914883ac669f6f8c19654cfca8d5cd548846fdef61ab17ca645a6a14da1272b10fbba040dbae560f79c78f519a57b20f9963853da1e5f3a6b8b436f386e3618cb9c34dd4d0e38d63186d112c85d77ee10576bfe41fdfeca75f087b4f13a962b4a705454ab402d3511975ee0e2bae9d9c89aaa9d0239fe8ac940e842a13806353b03493f2c86e28ce196765425db65cc9b2a3153db4441209a64ea61a35504d0d75dfd0040c5ce9c645155ec293080f272152a903f33dac8fcf237341acc3e917dd959095f5fe68e66104c2f6af6b155aa026870a440090f806d7059dcb67b1d3f4ca39e00d5ed300e220204ecfbbe6ebd29ffcb1761a8e2841da8e0d46ee97db24321c075ed8dedfd8b829cf9f20b4b40767fff5e2f8dc7eacc810fa83a0f494c639cbaebddf3cc4a0f388f07434c0f7fc471a690f2eff4fefbf83543c0a4e3d68795f634b88cb9799ae22c4dc031dfeb0e54f0a8830217a2b99d1f14e769da790785428aa9480c768bbcfc29f76e729db2b36e0d93d9c4ea5c78341277475e1d639cc74481e8598f659ca8a71f20000a0bbfe487f011a752e7c0402a15d01367fa7efbbe2fdf4afc1115f960b0d29b00cb56800353bd0f778cd826eea5ed598c8411987bc6a406e794993c27931cc46967127bcf962fc41536d22837d7722a17a72b76e3f5e690aec2473911175a09bc6e53e10044eceb9c875e92eaca9d94077f62f2b3dd20d4e47dcb360f1746ab5e0d7e2b5c15447e54f3ac965a30e95a1ccd7b4e1199264ee30e7139c1809e8ed38140257e81c07e90369325331fb8e9b19cb280aa32d9004dfe8d5ef20b7e383a4462c243d037ece36cd0872c387ad2a9cfb0649000979455e6889e2d9389fd1b88d1be5242d743f202dfc1cc1bcbbe8ccb973103abf48ca1d4af47f72b2c8f2bdc0f898f1f296c99132202dc2f5d303c36a00fee7f1627a5211b6b6d51acd3b8843a2cd243daf3a14bf466186b7c69e2c899b243138694304098a8686c3dc9969b1c56923ea837d3bc7e1087515ec7f790f87d728a1ed698a95e5f0ec559befcffe37e720073da81c685449eeca9376609f197468bb1851c10a57d25b8f4802b4be80a57162b83370d1995114a49d478116f0f115064aa83c8ec3e9861db7305848ea7c682d90af1f35a61da924e7e18941fd0be7c3e89295dd263ff3fa198905994bb19dc212ffe385b6b3da91a3a1ceb61bb23c8244ebc3a922d373dac257d42ef983f783e207e9f3a458ff4d8ff8b20bea059cea0f9c1832ebc38ab815465f56fff01ee440b1362f15a5174810eca04471ea44c14e4da6d788a23ebf1e06f598f4cab336ac0e57a5154529cd035e7586aa77dc1c743c376ed1974d469c95a9eb7b6fe291fa37ddb83befcb8cbc03a0bca126efd57615c34753f86e6e089d6f9d693e5208675f754d738957be24ef9b58282751cc27ee2f82ec102240613860fd16e2dea68128979dfc4e58837715dbba33152b9d65882dada8564554e0f78e522c833acedcfb366257ae058d7988dfa4bd73dd07e41ad926aa17deba31b851d6e18a6c71b8c29584f4cd38727e659e359eed368a3ae277893fffc26839e1e40117aea1efc4299d71c527bb781e6d06fc902756ee6b0dfe032272b33b4c5a2b16d9c99b18a73707f602860f216cce4330574ab1fbb48722dd83039af29f2ed148dc6ebf06c3238e36be015067d43b3781550cb6105c3cb23b83444ac2f3a0670ae82226603947a30faaff1522bd9749ad69124120c91ef0d35eddbd1a8906320a03000c7b8cc63460a93c1b552058b83270538c768200862480298955b974828fa9ca607d51627909a925a7cd833c674879cfe8e6addbe0dbdec1d9a949457cc645bba6945b53a1b2969858db4d4cc43ec0c4e42f44abd1966ee87a19e65cc0d5645fae3e3e3106b6c93331f9a7b1cf17cf282c98f769017c2fb23681e149a0c6197dbcad8a0c8118c91239a7b3a05c0ba6cee5f3d2017763dbc61ba6ec35e6b38d81b118d32bfb206895524922ff1eef65e0a913989c9af01168f3453a641fac4252523cb22d9ce10f0b5d5e79b5ea975cd6d4fc8f5f086c127ac29e70843193141dc974e21cc0b3cc3db15739f3f47251b3057a1b5f09b7230320b7d6887516d641793864652249219f4d1d501588de2c477c1ceeb1608e191f1a364d019de42350acd254a811bec3ab3cd029a8b96281d4ec3cee246617c16d078a1d399a089d55816ded806916a1547985603aadd589314989d7cb668a3bc5f892e3a5aba18e06b139d751c715ab3a95911955ca5aa9023f22c8dc7226b5dd9f848266429d6b4d65a9b6897f491cca61470a30fd7d782ebb7882bdb7f78cbef2250ed0d38e3e1f928d66107038cae8b4dccc274b94d920d624aa8c5f0b9149bb3927abb605557a0c0f250897f9e91a27f800bf1d7acdecc82d06406fd2270557e75434d473ef0816b148035f289981806c9b7ba3a2391fcbb5b052c29b07548eba12df38653b6ae31cb61b44314d22029295593bab1b94186fe6c16c33edf2ad345aa4409a3ad410f322e9ac8cc791eff8a028a16ceb951491aed43b212f2deaeddbbb2c2bdf552be365a4598fe564586b6ecfab3d47d36d4eca34341e2b6d1607dfff710cfe24c496ac4e1cffd8f6fd888243eb03e6d00b10dbb4d6807a405663666eb57b7895a47e18e3ea94dd324786cacbc1d97238784fbb09b665dcbe3afa14281999865175330ed142533fb0f017f528ff5c4539b468334583c54264464e10a8e5e4136ad88affe7fb8db0012117394805d5c48738e3550452cfd91a207341603fa51d2765a30543a4a070574cafb51c4d7db361cb22c01bf929306642dd8fe9a321c2a70a6167faa26b876584e3aaae48bc6be880405807091fbbc8e25d9fa8bbdaf550491eab880cfe70071f2da3c289855d67eb9f7de72ef2db79452ca148107f606470738abbc38171a389fb4dce07c4f584a1c33be0c23111c114b8f6246c040718657ef248ee72d653c40fa85f30fe9975ff572785d17cabbea26e897745847c05905009c1d07e7d3751a38e2cb3b189d060a4b29a1af2294d26578d2394903f329a6ab95166533667cfdd92563d00720c4653e770e145ffabcaacf309087f43aa6cb2ccef14d2ea7d267a0ea9d5bcf53e93bcfbc460ac70a74eb503ac459e731bcbadc8481e2c3ad8b97ce82c2c9b3ce65728981e25f9ddbb85dd765ea3c0cd7c3e4d6bb4ffa8e3c7d337ef3d1b8cd57dd94559f21114764eacef3c9370dcec81cea2af7d389cacdf6971ad8fd689ed5f84e048a3543a8ab54eea793ccbaeb9e679daf5105f1ccd75c8fce571767383920db770e896a508145385fd4a7981784a61878e3723192eba953c98a813c32fcacb3034a09712682e3717ca6b9f54c044786571e6b7c0d6351f5530ca40147d8c2461855e82e62961093104e2cf34e873bb14f1762868184bfbcfb84eca50a1693df8a3ae6f6da5c8647a9205de7737c8cae9a477b91f218ce7513e252cf17f44e879b25ced826bfd60289cf520702b4d3e16238e7e9f272c9f9e89fd88568642996e7dfbf7016e27ccca084643cd6e1c7ee427e7342ea0e78ac4b217d850878ac4b21d7122278ac90050c55a9df9c90c9c5114b3c9c901b5944917d7342a4172f74d0be392125142541851d33450db0d8be3921005862821d88e0a293a130aaa8d27d73426c6ea0841130de3727c487a5251eeb52c8cc1637805204234b4b3c16072551b7337ffd4c940ffd227009b58211c8638b444073eb2e48a07936b799e79da77d5c673b23ce7764b732d238cdbaf769ce7d9dd38ff3eb2bd27315f1591979de4f048637d2f075cc25e79ac6e3b9c52c2d02f7fb9930bc9175db9c10dcb1341e0e57a0c32c8de7ba86591afd7e0cf0d98873224241bc91e538d7beceefe709b99e6b98d55f783acff28d92308047f3ee137a967ad036fa73f3e85902d337fab11ff60bb27e448867c6634802525d7aa769da0a9bef442075452d16fae67aac8cacf71309c11bb1288f05623344e6e870de32276807ebbced6ebede0c4ea26e7d019f61a879225d05142cbefa4a7a7ebde5c5412d606f1e0ecc5f9e5b49ebb01c69f11706fa912f1d069a2732c144f12b6c4ebdfb62d836c9f5ac60e488100f92a4cb8578ac4bee2785bfa092cc89ee7d9048422b3247f3ceb7685a58b15bb4804544b028e888104f1275af09e24a5ca4973ea3f02b186a9e08095366a0c457ce3d6705450e2b79f374593e47168787a2865be6ac2ebcea21f4d261303d91093439f2d21b4b0cac702a087940cb670f58b17d462092c8637d0863b1582efc882f5d02cd638b784b2fa16b464970f0686e3f23758947c350742cc2a2e98a859e65f8983dc459868f70cea0159148310bfd858890124a2f310b1e04af207a888daacbb022d25f1e0453063dc452848be216fa0aa29f9885be82e825360a6a97c1db1265052c9e8a5937b29082c5f381e62c7077228d728b8547db0b4422e88876f4d5e570f366da8eae18b1458a39e282754baaf78dc5882323b46861bbb7c6f97d109bdb11058b1157e6e3b40de85d035644035396e11bafd460f92eeddc930be01b0b141a40c9f259b5458b0e8e134e4a27009fa2ce11413a993bbfb14099024b29a1547929a5e39c70a0ac4042a102854acb76cc31296d4ab16aabad155b89c92f53efcb246316b10c9351c6b923a566a9a516e7e952c3e6f417845eca79e5d0cdd0cd90daba2437e3e0b6cbad57cda3ddaeae868b61d9b4e27c73285136c77e6c8e65be6d3f36e770de56d5b5e6b06f73c855dfbe159d5ced91ce7dd237edbb59b709b43c09f3e40b855ccfd53db43abd56d4b1eb420e0847ddd6ef72fafda897afae5bbf55e5e4dc56d24d57181d92ee48379422c2932aea132c54c6274c10d5cfdb952d519f1711b00a9f48a9b73f6f179d32e2259dcd8443f38de5c91073490de324059893156c4e8ed09c644e74b84e8e744dc4d89ee0f05995b454b404112b28c24e03ae98a28a324d88f1822e187812840f3ad4c0082a74c053bd68020353931dd03871b24d4a806a22c58681b14851b929c2898c9d7b15b1c4c674ba770834b2d622315c5116b233b274f38dc5091627607823e868e88c18c009199b7841f78d85082416767c6375082e42e040f6808827f507d8105f3ee71bcb104318228ccf292e730889f324e599800d87c9a40481a26344b6b752529726784d3dae69e6eda1e36cd5318cfa31bd7ac51995a20f3f9aea9478c518e917ed73ae1a2a89d98145082ed1a7bcbe6dc68d5eb3874e3ca1b401670c420f224baef135a2cf2e1f3f4a1e7cdef25c4dc7a8152449ac1c29fae6a6cf94f0460ed349b7c8fd9817f723c21bd1af0879c0109f7ae57e4c16eb29c6e1382feefc8c333d671fe34eccf1b2014cc349035ab94138e70f637e60019144dc2e96030c330101253be5e0b6c964a2f18d0508258f7d630162e8b3c97df8b2c5163c70298116586be1d2e5e1357dec4455ed418b97e262c7870f5b2e1fba90a13b52878ed4e9a1891ac885ce0ea5397540a62e25f1a148e6ec5cb3872833292e767cb0a663396092e46292c34f4f4df82a13d7c5b6997a98589139fd14fb2dea80ac9d243a7a7a289239fd9fe281073c7cf99cb25fac60b3af0edf2d1b84f0d037d8b201cc43bf009353cc016bada6a8aa43dc13ce90aa810d401ef0abb700f481daa91a57d0b221c9772b09d11fe0bb55c30dbe87940b1d62ac2bbaf9ae10c42b0079c0a7b08997a469dd5adb35b9d6a678b839351d3a26adf7744bdd5af8d625d7634d3205994212e78929444f59afb5a22220dd7321d13b9740f30c1d9147a27758e8b16ba306b9b8bf03dbb163d201c18256749b865d47200fda1d938b35114bbd484ffb55240345e0923796737e55686421229efa8503198fb8f1bb5583672bb1cc41289ff6df89ddaa56814af800e813afda252e12f4597e431fa45bc8b5105531ebba73edebef0e723d19e75ab592728df3aa412e128146dc6cfad3d76012c44747e2b67bac9366b0d3aca66950eaf0620ef4deec74edc33cebc1e035bf7ea699db599cb8395819e9dd2754ea173b5d57a954176d1bd0bb630eedaad6219ddb8d2aed030f24899c28d7a3551853d8b0ade1177fc61c5d866cf483dffd807d88ad9b0f57033147052e306402617e631a66db4f389eea134ae8136ae8d0efbaa434467971acedbe7afda6a2ef6d5fc669dc0fcc1c3f95f28b41dcac7ad97d1313e26695f47b3f72331f1673a86fd6e346373ca967598c18f6d745576eb5ead1da9b4fbacd27a97c75d4cff43ac3abd710e56b0d4cdefa3cb9d7b40dcc5df3ebd746b99e93cf4f86cb8f9b1c90ea9203625d7ed1e4d967729a6f659dc6ef97ad5ff73ed4c9fb6d661cfb5027bff17e1a339cc687fab13ec3adcfc0a81346fddcf88cdff88ccfb88fd07b3e3f132acb3cb7f93c97f1e5cd33377dd97ae635df8ac6fb338973e719eac3640e759a6f95f98cd06ac311d790654e8cce17e4f702f4b133a50b405b11067cfcd1c26b3f86bce63b71fae8d7ec0bf0b99e227009c351a709f54e519b982dd14ab48b72a7d2a5248686510a0294325b4351c080e122c22b6e54931adddc553a3a70bbae4b07fe2cc1cdf3e749da48e7e63da26f18c7636e2dd52ea0f8190d7a0ab96bd22ab6fbda1acb62fc7ec24aada41c7606a718712a29d1994826bdbbbb9b8556fa2d88dff15988a8087c1676fc86b38f9778657d551db3b8effd70c49ce8dba7237338d78939368f18766f87b96e9cadd70c44b5eccb35e2143363172009592c160b4816d11501346516a91486d550a552f0af9b7526a5107a3ec52da220a1f293b56108a1eae105afd3ce049b5fcf26d3c5f1d3a1e7ce223ff0342e658d4f259a9a2cf4339ec3192b06def8c2c01bd0673e4c0cbc017dc63b6f2a4515f4dcf33c5554793e9363bba9ee333239175dea30e1e88e61f7469ae5ded309c3388b8e8f287d24dd2da71e1ab132268dd3f590ba70ae4f2e0ab25031d6d8300c7bcad9c253bfbee93d69ec7ab8192bc2f3e9393ccef3aef56cf270def370e679e65de74d8ff3c9797fc76d56cbb04a3d468f1d8c45f0f9734aece6748297baf96edc5a083190fce917f7d393fa0dbd380bfd75efcbfedebcd964986626aef96afcc4f59c30eea76f4e3736323e93a9e6a3f1f1bce3dcebd9bad9717efd15531f9d4aa11b48b5a45848fdeaf20a553daaa8caf0c459e9b32cf3f159033efb34cde7a71149b190ca529f55db7918ee7cd038fa4d6f1b997b997799db4ccb28cda183024463585a5acae20442c77c077e3b5145b73e61fa0b347e0c5141ca8f5ba16ef193df6a073720aae84e03a28afee8fa04f845e092c4893932876e5de29a4f7234497e7319e53347fd48cfdce499b78e30f9cce797a5afae63dd36eafcb274191e392059dd2eae87c6e5e779e79843201990cdad8c2d1573b48fd0cf78ad1f8ac66bbcdf4a97f165cc2fb71fea6773936f6ec2281a47fdd4f8f51abf8eb31925e93680cd8cd37c3e423f73bf55e71ab6f50910fa70bb7584cabf00bf7ac6a9205485ebc1f548d48f395f7e733f6ef5e92b1a877dd625d0f616480b8f7911067c6c1b99035daf0119f2986b5986491f3b7ff9600c25f78eb201b14f94010a9962b604562393c72098cc6e9a6f1e9c3e71d63084d72794022dd7a3e1be6e3bd7be7c5fc6a03967e5f27cad3a8661cd34575cad99dca4f14983739cd54db83ac6cd3a27e7da9c0fd0aac33afdaab5fa8432fcf2eb1bd70373686196814db362d333e10c97c026172f6c5b64c2753006699a36e6f355bb0aa5540fa37518aed3afce350d731a8781e27718287e857e5d73b884c359bff9dc07a177f7722de08dea95eb715dabf936a7b171f9ddecc8fbf54329331a076720e4f02acb40f3bb6b890cb4f20dc219873e8351985f2e38c7375f4b9baf65cef53e0ed70e735c402ea014c8058560346fa9436638ab908b1b69c6a081c9fb778be525c9eb7cb766c8e25b2c2d4ab0e8a7112a9f80ef9611d6b768d8f2aaef160d5168d0e2ed7753e927add9acd74b4a9c2dceb0e380d88732cc7529413c4fdf8c5f5fe7f6339d6e68a0703c723e16e72b71f6a7535a2b7fc6ccb2111ccec0ab2c8a813c663804804b00e0a9f410272f9320deb2e5a5c32cf5a3d3607d64c1202881ea5fa8e8909581ea5f78d513a3c3503fe22c54c3a3709ba77928862c1e29c6439f637cf41173f85481d2aacee153c58856f5e7b6e2e5fc6a78b82dc6f7b7744cfa7597ae92ae237d87d4217d47ea685a84456c8a47030d1e6b2302c55a4f7069398183d613635cde0c34dfad27c0fcfc6e3df1c5054d060a31c6183b5a4e0cb5544034716839b1c5eb86d07262871fc077cb0923fefa6e39e1a44c75ec64a1b71683e69ddbaf654ef5ce6368e979fc349f1e44f31983702e711074cead6f11df2b73aa7bdeb98d376e73fdc6af07250591e1d1a17b1e04bae739f40c07397987833a3fe115644e751b1c9414c4c6210ed29139d50607edc89cea1057bf3a412e73aacbc056b4edb33828091581e99a07999907d920d2391c0489644e85d8e2a016644e505290209a471c045998283ac4412d839282408f38880571d01019b4f98c0ecd96e819b24cde3cb0d678f340df9141492bd4e020c8e3f9759a6fe68b212988c5b048e654d73c869a1e2e942273aad7f870710c414912681eea570cd49b2743295fa7771ff7358fc326bafc8cef56134a6f3b76ec8c284f73a8152e9740f35cbe135315afa02724634541ea0b4c765fd02fbe480121087d89c6d43194cc0ccc961ad99dd2cd6dc5015803628e1d1fd5b13a846fa9c006b9230cc8da36134e99a7f1dd6202058f7db79868c1e754518b0a9816135f743ff04197030c8cd6142f59074627e6747215f7dd9a82c57bdfad29563eebe430254a9e5146e931cc76bbbbbbbbbbbba30b6c431ef01b6e74523aa594329007e491a103cdcf9a6720ec31079a507ee651d3a4f699e65d2bc4a89fb98a3ee935299c59faa56555520861a490eb818220bedb0676c119f1358694279efab49a6fda75d57ad55aeb55a94fdfe0556bdde0db1fb8bdc41b129b1bd52e2e6bbeea2d6638b899475f599f59a3914d734eab7df34d326ea6d7ef643da12744b0f459e80916eb5f90cd627dc52e6461fd74206d0beb35d34b32acdc56583fb10dbc618237a4775f2e9c32da8694ae03cdd427682e6bfdae696a355bfdba1cdc9b977eb5c9e5cb30d9986468974535c8a1a07661280cfb68288bca3447510dce4ab99fea13054a1e7240849e2062fd0b4255a4b07c2415d64f29ac9fb88824c37a0d77718337e4970b5d4bd3502dbb7a66d3749cbcfce6d1cbab9ee7615ee6799ee66d9ef5b8205dc6c0539f37debce6d4b4a94daa654eb91e531157f3195552bb32f8d7755d93fbd97c7a6d4909f336d4379f136720ac4ffb619d165773eb9aafeccf36e37ef54dd31cc32c44590ab139b7095dc36fbdbcf5acf9b414e7acf96c29a1e42dce72fc09dd0a2ba544fd10c2604c223d7a8c524619637488270623096ed0dd20092a4844f99e99317147f891161f8fb6ccd01ea7cb47c90f35f10a4e1e25310584782eefd61422be5b5382d8e166557f59150123bd4486c5624141f1d75db9d055317cb70d2b5246266cfbd7c5e066ec7524eb65eb48c9cb9772e9f3269f5c79eafdd5af6c9a68d400713d8b5d5eba0989cc9bdce68824df798d4b8f59be7ef9c912aff3dd7a32c3dbb6bdd1cc7cf791c0c84d7ed47a6fdc8f74ead78c2a783dcf3c86cd3ce636db20e7c3811a0ebce63f9dd7b8e520943b3ddb78e47a64363636be137722c6fd98dcc6ed5557342e1dceb8e791eb31e3b4c33973ea92e6abc1796645bdffce3c077e357d4602ce041048c8a00b285a453cdd399cd72b679cc90335679fa9d3e0fc59787dabead223e780ecf374eb39ebe181df72f69a7be0359ff11d698373f674e65b49a7ee81b75fa61e7f68ceb9357d53cb6b8efac1f93a75ed89ef7cc6cb772d27615ef3c9f5d870df4ac645e39b4f0e88e6794e9f397fae4fbf3e31cac64d5ce56cb86f75f9ea7a15eab6319d03a25dabe91348e71746d9fc30f975a1f79cfba8cfafdb70a66efdc66f64d4e0990ff5d3f9f5ce2fb678d5712a085591e1a710e700a12a3d9c7e411f830cf3137a8f9ab5d9e640d717a9df6dc3db62782cabf25686c734dc81d3039db21075c8f954afd89bdcecbb654492c75e0f5a4dc234f1f2dd6ac2d2f1dd2a22cb5baffda4e35b3e7a113e7af4ee05431c1064031720d22a42cae7fef23742615bd544f8ad6544101f7d6e1fbb17dc0d081b4509e7bb15854b9428a2a020f5dd8a22821a5de0f86e1925d1320222051bd098a2464ad704ca0e50928cd18599414d6b53c18c22687cb74c5043eb4918a8e49ebe5b4fb8d0e86c60bd3eddcce89880a61c9d161d0e98b49c9469e993082f3f6331eaa05d1637625201d3bba18435b09087eb634293a0c4851efdb36db4fb98f0d745e99c52c608db0634e1bb6df8c0874298f05f963cf9296f239908fb8b64b4c84866cee9c543376170c9cda6298425225472eb776bc99787b29b785661a1923b632554b284ccc3930c426b89529fd039e828516214b9ef96921f94e030b7253a877049321553c23a2eb24d061a0e5afe6bdd60450201872b903be17044879d545201528ec1814816a0dd7a328c1b77a0847d70c905e3a3df1bb87c7453c46882a0108c9712dbb1754391853fc01f5a3710b56e48f2330147700652349617f4b0c4051641032e1d4615e8a475702409e908249da32cb440ba220c923c1ae347f08616c20990200b6e80c1d1421ac0511860544a29a5946e18a594d62ca333065a9ed093c9a1a0022975047574411a02d2018eb620f138b28100b84ca95110108417ad24850748251c8d00852f6394ac94a08f9ed85003520b90683082748fb6c0a173026ad9a1c140aa41cd80171c8a9a10420c64d005cf7504131cb64032a5082c92260c74a045a939420269c7d110bce283fec19431908440b2823473f405d20c900270f405a98b1c475005475ec8741638430a4790a8cb1861842403a4118e187054456d69e112a32c41b234482ec7584033b45de85782441f52878f6a4f38be6367884aeae0208eeadb19d236a216e309ec98165aa82c3ba65b4a29a594dddc929bb79de83ad37aacde573edb51ab97213207bae67971f3293591b09dca534ae788b8590e7900bc00590e492559620e1b9704903ab0e7b8f40846ea50b954e5b692dd239597eef1e0c625b4286588e7d2a55f227dc2e603700194e0d27d481d29979d47a97a79657f1941f696afba8f1e229c775ce7de0f6e8e4a60a8bfaa1e8b784b4b4b7f72e99e989ba312a29863864bb733be0c595012794af7f22c899e46ed8c3d0d9cbb4cff573d2a717972e9910986a1120c73fa6e6c3ed54e0560125804a944b8c5fb60172f51a505fcf2c13151450696290001723ed5003e017cb0840f469139d053d00380bfcf49f820932c92482a45cf72878fb806881b590f7d4c54c1ebaab5d618638c31d6320f21f47c706bc82e7c74798566448bd4ed45031de683b8b4a02375e8c81ce83e82b75f1f2b481d2478b7dbedbbdcf3bcd65a6bf53ce7dcc7f3ecc373ce692e8d98131d35c32f93d77c7e53bb130a679cbf9c06cea919f8fbbe963937a757d5e07c2d736820aef117ce9e5b6f626835400236c28783e361aae35c74ca2a44235e45e886107677777737ecf6f861179457586be59cb3bbbb9b7677777777992b44d58c526c37186b9d524a29a594b2d0602ca54d66ccd5b66dc2fa5dd3470be510d80fee85713e1b26d2649ebabcdc1373a163b9c97c0d10b7c9bc7b615c0ec338dc42546158fd2e38e633169acc4f0c545f622c4618d8d574ea524a2975345765ae39bdd4e729857d3a32a7ed7772f9699a86555155339c6a59a3e26bc22f629985b559966559666dc432ccebc1cd3a180a38fab6c51ccda3e656c3f938ad44a81a8000e6b446b54bb8d1511363f8e449d9425ea9005cea38ce3831beb207865d37aa30bfa83703cc371346e5e702fccbaf8b4a3abf5b7d28896238f8a5439452ea75a194523a2509970e591ff823a06a5629a651374555a553895b4ff17301528a8dacef440cb3180077284973ce8792a4db0dfbe073976b9c9d1a7cea5108160745e3b6f715c48b3aea75d1175c28a9cb18c3a8c106f1dd62c1119fbd6fc7f1ddca12842f32e3eec44e3503ece916814b9f853c18f498f204372908a1cd1d4aa2188baa2d2640ba9c59dc280586ddd6de3f6b2fb5ced1da86c41155d2bd16dc5c437a0d1d1c3b508850861525ac0f7cd3952ea321111102910fa78fd04fe9f101f10703f8fbd58c91467c650eb6866626753d13babb2058c4dc35c16eb7a7b57728299e6c0ad175dc88b50b1760b3dbd3762ac7653a7dde0c6edeb67b5d731a55df8952ce8ab14bdd67f0badc483f1760c4467156398694db3da5628e94cef5e0e6ed3fd814a2a094111b5d2e67bcae17eb039fcedbb30a32dfad2ac0bc09dfad2aa84887db8daaeffaa612178edd414a6c94b91524452f8d92384f86e51d4ac25cf3a1247839e6f6da8265513a7cfa3cb0f10e25b585772809e21955584c40f4a1a4ce61bbeb4c0f2188ac60f2f0bd29779ae0a115440fe10b3774cc11b7cf76847076022ef46e5571c443e884ed68e10d562479a17e503e00febc26f723bdca5a61c78bc517ba60ece1ca3821f6b8785cdc436247576cca18a1154a5792cd9b3a4671a6273aa9cc81a573526a83b9c5c4812cd3772b0b0b3eeb501ea808d322f3e42f3f15fd95e549094ac0b4208b1584a182295f7e8c88008c30967802c6932492ec9025c90db0ae313ab942467c50268c1f86f0a2841212a2b4b04062031d847082bd243aab5eea0ccd225a598eb4a828d3a2a2ccbc6236c9fef1771401b7ecf4608c0f50b085122a8a984542374ce10492124994200b24ad16184f070f8937e41d695da122e5bb75a5a875c587d615252d2c5fbe5b57c6b4ae64f14c10a7f703f4b2e556262d23b57eb7a428c22bc10e62bdfcf29462b2624b0a30b3871f989149849562070458219384492b8a28ad28a850315a5270c9f2dd9282cab7dbef9614485234991d5b56583b34b6804faf491f214de1d15726e4a40a0bbcc0a20930ca04c1812b622089428a3190741141995a25089f5557663fdf39a72833c511cf09566b0e5f5b58c6609e9193aac6c97471525e13289454d9c1dbef56152f9f554eaa6879ec5b8aa1ef561463be00dfad28b240e1e5a7c77f78e95459e2e3cf255854a2c2bac6c5f9603faea21746c4ed1614612eccc79d9e2fdfd9f1c5cb29de51837b00fc19a567d55ff874baf7ba709e7807050fc90e1476282ed24b4b56e08dfe9d78d5603b956951bc27da6d453af4e6e0961d9d579c55dce617ce278b491d9751fa2c923ae20e1d956ae2591467d14b219e28bb40d6fb74099abfa8540d76953d2b99a219001000004314000028100c8704029148301e142db37c14000b94ac3c6c4a9807a31c465110033186106208210400400c01c0108398393cfe4959a74807e59829bb53a04f313665f751a64b213645f751d2528c158aae50a64d19312930bbee1ca7aa94d03bfc9d5e6aec5aa9e231a5cbbdbb57d4384c11efde4eae4a2f1f764ad4aa0c25f1fbaeb2d34aa1ecbb1498fb3b57913c42b99fb27e1478e371b96555a74abb80965eb2d8c5a5824e51772f095c6e6fc3a8843f3d5bd66105c23e21fc1be742eed252904f98a9922ef6251b147bac3e3a658cc5f0edbbf05f1b72499c1ab7254bbdc7546b07f474b599d2feb0dc1d6abad15d5f413902fbb871a5d7e8de6985fde300255e4d3bbc921077b8ab94509a126f2989efdbed15e5f0073b594a2f2bec081af53b969de34c2f41eff8563450880ecf2ca1abb7f2fb39fb509f11c5546ad5079552aac9029a2582f82e6549913e652c28baa748ba143b287667bed2cb8d9d2b950794fb52d64be126c55e4a3d29eaad073196b46cc7a48515c072f1041954bbc5ab0f29f4a7a89ff2ef53bad8dfb55ac563cac3f6efc28af4d26157a94a39c57b94bd14f580e22de5fe5186fe67231e08e9ca31caea2d1249e5b7e4386c0f4884f813a1f8b7f4b2c5ce7154e2a1ecca27bddcbc73457928ca7d29eb8dc27d8aeea7c0d0d9353455a9ad77145771097dd7bee9a5e61d5da1603cec4aa9e2a272d7d1a7972d3bc7a17820d48e6f051a285cd2dd8596842c29b644df2146714ca19fd74ac9a350461f2531fabbe84f5b44913e65c7a6c02c978fd809e9acea3b953b0a7ddad2ba8b334dd09a4b063e91ec20a42bc7286befd692a8d9be758699cce6a74204b575f21237c297b0725ad4a5f6c80402290c1735313de0bfc50e6bc0b4b2a45f3250a210a7471a331bc1c067d2faaca633da5c5bbf5bbf7c4ea42e678005f5a3306d9de1142627f1d7a71053fb62cdd7c88027569a632c0ce1471c43ab0c5c148a308289bb8b758e73a95d8bd101a729022df3a34416443dba855c2e4d303babb6dcd06d018d6ff75d2a338337d8079058fe230357468203d76c7f13774453516335050a369598a6c2b19aca834d45baa93d36553c4dc5086c6a83bd9435b8283e021b289a0c0be7bc7d0ff726000e903bb3fce63e24910735dfc6891f086f551959b8620a36b13f8a63146719a67ab3e089a46942e19fb1c79738b677f37912550bf3f94666d4b6098763477496b00edd34b0ae880d5d917fc7e6354e13af0f441c5824759f6d5ebd7d3596230318d963e923945a01768747a7d65ec0bd352c3180a7d462e55c0f1d8d860c0de11c1280a6a93112e5bf45c035a4125bfb6c1001de150e1e6fc4846f2f88807d0d70b61c6d5602172d6f708fdc6c8a3c0bbb77205819f106ca27638fc9f5684454b70f407a8fd115c0580667f37d034d4c94abc73a9c49100a27160fbbca3da3e646cc71c9d7470f4d64a6d6a3a502d81e19de06010362a248df986098dec924359bdaa34e1687e3b842728d388b00ca9e7d3b70cdfa2d1d99001df4c0a4b584dffc9bf01285c236d54fe16d53da4b99901407530accb4f44d04dccb9db631413309fb883b13b5c20514c45f657d9e69525645de6ce2ab7c009d84b381220dd4cb92d14d04e912e5cd0e76a08226dada40ac1b3925a13f9785e560967f1f5d7a1fe8aef3b9a59fefb6aa0b3946cf293e33db119ba311dbfe68115a4fd1e0f3c913a0bac805dc2701dd08e12c65651686349d2c19d4e83071d327a8d169a94fcb6d929556a80023a3278a6124895e3d349a91865c3e928d90004c1ab2b2d0662cc3fe5c1a838e2e1a6b09c0d7fead0e8277bb966bff46c52207c822571452df0ff49d0ea56438cef999b13804d41325c93819160b0a4594edfba5938854fbc31553432861f4921f519068fa636dd942c6234f0af59ccdbf7c0bfbb99dca5974b0179aed1e1b7306aa273be1bf3553ed9f5d2375a75461844208fde212bf1e5081119867a888536892fe9101fc60b1fae1827f91a12cd3558879ef6b9f0618e45b2c52eb7e6d19dbbc1946162eb60139b1986c9cad671d1004316ba1b8351b1ae1459851d27aac1d00c8dfc8c270e62558a39b9b806000dfca54650f1e5f5e6e27b883f3624adb735180903c9128eed8d5717c89afbd220600186d6ac52b84b2e3d8e73c77684b23f91319bccae9534e26dc11384e80a8e18b932b1840475411f04c304466c842dfd704089d3ff5a7c276e108d2d60982c74871c6743c6a06f161b7a876652aa7a1fcc355e4718ae2be738cce5cdeb79375c07cd4527fb803769470a53be259d03abd4fc32efa4b123210083d70687d8cebe51833c4c64b9ddbc57e044b3e2c5cfd8ed39e491ff784f698fdff7a3d26cc23ddcc8407eafdd9f97c4dbbd2270d95449784ed21c856dee6bfaab63db961e29bfa5943173077774089e2ea7802d02d25cbdc3e4a6d5840f236d7310081f544be0c7f94d9faa19951580eac4e2977a33795942d20f8fb93058412413478fe08ab08c1fe12096edbfe7fd5b6b109c36ac3f54fe990fa9df44c2fecc94bd0c2bdab17a65293fb29b0acfef040efc36e585d8109c2c5051e762eff397733de44fd9c0d456e419be1f6ffab6923b1e96f3e2019f0de31aad1eb4d00b486f9ddf04bdeab59d208182d18b2baa6801d2b8c446902f9a00406108336640d8bcc91c24f503779781291bb272ecaf53b0ef21235449e359ea741e75de758132c2abf5afdbe2dee320484a28d21c4e350151f30f6021a41406fda6b24e1f260fc242d6cb9752c1c9a03688369ea448364abaa4c26120d84316b6dbf288e87df8971716a4fad7bcd5c143c43886fef6063676f977c167f96ca4b10d4b76ad611c1093b7dc50ecbe4deaaf812eb116c77a04c748dad9ca8a3d26562290dd92422ebb1f9deb3125d01b27211dbb4483e38eed81cabaa80121e663d83aa635d5345db3b71456c5b1e93d25cf6c354c13b4634d4a786511d23666bcfffcb4b7cf215d4910b0d38c14a929848d8bf3a28d7915f9180a70dfecdec550f0c44b42816304387c4e12e88fd6ec90fe364652d1da0ad12126793f68d6fcd0ca77f9f05729ae8424aa582d193cb4bce08733dd1875180b8e7dc5bb588107b7ddca60d51af90e2c0b1650055ff566f9e61423bbb0f6e3f84c5cbbc55cc645b318fedb08c86915d5602acca80bd57146de64848315a9c7bc1c8d3d74e68fb8b01f78d7f0ba491348310330ff1ac87d886699a3661958e8c83765a9b62abfdc98bf780ae9eab0589e9c6dd4d70f91bec9adea3450cb7ac6e582f5de16236e326536811fbe7f75a5910baefd3bc158fdb1d607a8204be56ce47f25a593e6e0fe2081bbf4e962c67318838dc5c22d1bc830be20bd4c5e7f95c9cd1ea35f05704cb061e6a63d0542d6b2400103c2464598487161d9f023ae8a30dbad84f56f4898dfef81d90fc5a9a71097817b34051a61e480d3d16c7a42a00f422b984aa68c4daf50d9bf44f1a9682ef60957226ca5d5d59610e3d7eca3f4c3f9bf00a7e47c58f8fb09080e30bc2e11f8b21f1f921f37cc71bd2c10557bf52c4f643618ec0b1b61c53aafb295de0a955da1233c368fd1f6e0f23ac68d15e063489fd97488642007c6476c1f1d567f8c71c2dcb7b17a67fa69bd0a04fd32d034002127b8fafcb5cad0307b54779e80c9925610400542b103ce5f48489b98c658e4d001d2101b31ac84d02c86fd2ab7d14551c5524f6ca4df3d9786653de667b1dbf29958e60b9eca8a5da61066638559a3f283c4bb27ebdb3c3c1cf8d95fa764d89659b700b4583edae995070e1077e0c7a258cae808b5638b149a35ce7db442a7de3d28c731207816b4cb9d21c15c92afbab189f71b0032f5171b59198677d8342808c3c4784efb6f8cfca06e10e9889efea62894628038f6c344e5b77cf59ae026465094c7c042a1c21df699f9e846c89dc8063039da9323284d0d9c08cfd6a64ed311a06843e5d0662369f15a61f20748bb028f7d0d5ff0983bf4a755e40a9d1aa569ca88eab140677341659ed2ca8df6f9f36929d6f3bf50ce08f9a9282a73e9beca1591a5f576c8272613b5bf1249a8c9c35271b2d898a18b1074a36c1eb1adb7b2777b0e1898ed2823ed3dd2bb212240731b97d1856f3cabe5c5a93be602dcdf442a3d76745e50d86461e14e3e28465ad425318d0f951f53c9b91843a0e1c07011d9ea748a7693fe58351c4a0b70ed46ebb9b4ef81b769a5553287c0024c17e8a1644d819cee78a1686a103f7299a28fabbe4bd1a17faac3c05b244ec02ac34442064fefc609799cb0fde53276900fbb040c75e86f98871795dcef6cfeac8d20b87e51449a6877632680ed3c35c789c8cef5e631a1cc5d050db4be36e64ac65a34262966000d7f7ece06f5aa4176bd89597b10c883ae956b65cfb9e9995778e9641657ff46ee24491e04f0e4e4c1d2f906decc305e68aaec4b697d513094144960b99a5345baf90f3d173f575ca4aa50f7377cc2ebd6161319bcf3bcf21838f021b76391315c347843391b6a883ba4238fb56d705ebe7655fd706291a946e920161058e76b455b71bdf3a03ff936952f7e8a39c15dad1b44e434821a8791ba1eb5bacc7f417658fd5ab5526b02d24e868e157228d10f147f36d89eeafdd6f5e055f93e0ff79346f8b3df9f0b4905b983147df8e94bf120491182de47bb0ea5d6981859a56fb2ba6c47f1f28ece7b81cdc9611443f10aaad69531f7226377e14b7a0e7e4394e962536c5bb308b29d1bdc4ed515d7dbebe1da1e3824c35a3774f12b838e6a9d5a5b3b5c23104a1603422c14a12098cea6512966cbce90efbc3acfa0a780255e7150237574199832c964fe95ffa58bb8f865300509a01946197c03fedf7e5a259d95c2914eab58d0965f32d8715fb772aedf8d1f4bc2e8cad29249f0542a89b18fc9d231b023910ea6f16a8a4279a157b85c161673ba70098db865044c517f61212240f855dbe6db465822482d22e618f5d91111d9e1f1563d5318624aead0e5d8647facd20513e027123a4d653121a2c94d4a3a4eb3fef40730a0b64537317c4f32abc3b1fbb5ba3c60f43c5dbb0ae2cfea23bb123daf68235c0a52b5b59d8bd3305074214418515cbf511668ec49252cb0c84e819d37d2c9c4cacc8cd3f839ae1878c2e3914f210c5cac59cb767aee3ccea8f0375194ca0d915a913494b7761f1669027f4240253881c3893b609adf80562a695e121d1da0516e54b0ae908a01e620fe4689449fe9bb1a6891a52b1c31cb41c5c220d8315a7afc6ae8e1aa0ac810c0612c950c51cf014aefc46fcf705aeacedc71cc73fc295275e6f2974a1ea581a1d007f8dcca4884d24621f878719f18e8fee9c46b827175af8c7ec97dcfb3cdb04187422857c8d5df6c160c3a807e3a4391c2a60730e5e338994225f59039b637d923c666ebe7e72631a3081415b8b7e292f2d99b38b6400e033dda2ce89f9faf4b63385200937e8a0e15a6043325bb81c41da4aa23ca5cbf126d964df5605994f5348a8e55d85747e8c8f18936355816a6f88956142f07127cbd227c70b5238756a669fcd63778cacc6273f2523cb364a29a00541902d06c6b0d7a0ca351063f77355a455cbadca85d88f10381d0832c5242beabdb9aa1a2509446e19dfe6db791a9bd1234571e2b75e8431bb6ed53e16905ebaccaa5c78c05a91ee46d568187cc762358a2a6f0532f244d13f98437418e72c51f6156df91940f886750133f97e1f83fb9bba15b3338ebce1a672b8ea4dc4785dee6a9155206dbddd4af08d9f1edd41e4de2d2d061687dd8e068e3d0daee4f17db14e45a668b20483512b55550a1e2288858195c81a4afbc4bf3e29c414319f99e13f41050636e2b39b215297bfe89aa4d06f6b0ec38e5197c1bab256ccbe1a345263d289bd1ff1f89e3b2347d8881a28ac7a4053c43037c1923a111ac5de3a0e612fa7a125cee56f12b88f5f24b1307f9ad5d3a2711202d4ce914513e1a84e249d4cdf993fbd4f3e8d4915660ea165d8185f3ecc3afbff972b5eb216f788059e905db243b66e40363f18e4e14ad0e673788b14de343244f0550128a353798ffffdfd5ea86310d9dbe50e82bf611664ad535dbe3bf7b81f0491a44b21f71038d2bcb1206742d5c50b586129ed4783d999de4f61905b9b367896549e6b2bece952ae50cafb9f80c80fe75318c4b25603dd35117c597a80ff706be2a6495d0da152fb5a4a1c9f5d7765cfd02d1445b150939a63828842422f7bcc880c9c5abc5dc3084e706404fb4c119d70cdff025bb44714984114b5c0a9b5ac9301e47b96ccaa4913697a9152f027d6ad388f47bd151416eeb36338f08219e05ab02de960d6a68f90bbc42afb1040b42d39aaf77bd01369cf9935b1320469a928ffaa8cd242e6e738f34e5dd7e5b62d1e23d897c85bc0b16d107188ae714eede6c67c8b972cb52a4e6142cc20c08ff6118de6d090bfc679bb1c3dc68aa0180f2c6b2a5704ff528d556b6e5bfd919d860a624309c67629441044e2837f0a6e927a059c791b842696e86c437df56a30db80906f44491e0f14eaca5687ceb0a4fcbed6535ad587a47e8fe7f1c7ae32cda5995110eec7661cd428b82b3b30b61909f38677872867d6ebe404361896aa24735d204163cdc014e80fca7c878c138b7d69fa942621381ccd85302045d4f44562502690873403627d3e2ad791f94312bd6b91fd36a2e5dd3c780cce27e00886934eda27f0fb1fa740f112ca4b9dec8013935098be3da956226226a9e42c5d729883c1c6260d32e65b3001d9d457e8099b9692494ce3f21e7cc4cc80a296ee6312e5bd6636a4ca205675e94d7ea77fa06a99846d18fc0386d169fd261a8daa1db519020a8ddb325b398857331217225a866390bbc1b29dd4a51c4e6c30477238d9137452496bc0006ce39ef313829ae375938b49d570859deb6e0e1550b47d30166295a3dc9488a84fb727b5ad5435746598320fd0270a6b53022d5fd1083bd1699ca409299aa51e20d02a6847012ab0968f9530d6167dc38ffe4949c37db9dc2a7f7de1d0c328d2be32f86c570bdce0f0e15efbf02e17cccd099a12e2129ac9f81886c02e7e2bf40b9dc4d02fe87e44bf70c152802274da297ac7e8175c1047bf405589f40b512d33b493b79ef8791b3703f52874ee3b2a1faa96fde585f26597b46175f25fb8d37fe587e2c392cf17729cde10fb2105a49f669df5c4aaaecd64bec682c096698fe16f36b9beb218c2236c5665a65a610da5a2d91c63a1158e0ccc85375b23ad57689c5b3fbb7ca0ed42886c059b55963ace2f2f708e9b90c2be063514bcb10382a1b69792b83cfd649659479d3a6ae334993552d58da041c86c62c234b4841bdd83af01e59a03519d4827ee7f2edbba8172044a903e87c2caaf8216703688f6bab068ae22a50518b4cd29ebbeaa6095f6b24293ee4465534baf86ac87d6e41dd72391e8a86320200426eb31be2968e382c81b7fe48eeb7c07653617eb31ebc31a5c9342630763b469d348b24453ebc6e99a3726c98889d5bd894321cbdf4bcbd029efbe93201435228f47ec81adc3eade7c242c31f3e1b00d999cd10e6cc59b15ac0a973d09bbcb6ac7f862376c980b82d1738a3ebfda25c3364e0958df39967a2931fbaf8eb6b1421f962f782c75e5a8c544e03a901f600b31ba4f34aebf5293c11b59d3fede96be359fd5c832d176c2c3bd36d8e966c485e81f5a1c2de855b387981c55b105c7560ee5bc97994d2a1afb21e558bf047a28b89dc6dfd1817e8690278eaaf769c73697ddd2a47592ff639f59eefb47fa8330c985969b05223115d0d0d8cf31b08e5e325d41e9f1bea1cc817aa83e140e62399ccc3ed39a895773ab710f2238dbcdfa860f3d8dbe55e6a8b92b0b830051acd0002ec19a220d2d01dcf6ff2c0eb09bc549c6d2d076e985060903e58b617866e22b0db16760a63b76617e937e683443d8a639c070fd5f2a9b6132e28970e14e924cd4de5933445c5c5aa1c223c30d29478fb46e9bfdd8798713dbc540ddbe1438970f52919920b5bf7d35162ea841acd8f485a69095da64602b8ac9aedeb96c948a0705248e3e8ff729f286d5eca8dd2476500b617fe636f617a34817f9c166cfbdebbb1c23abcce065f5cb0b550cb1e91f6b64faa04a132d76be2497ab212d9f5e9d6f2d6724d7dfc7331e466600c45ee33d255f794644631f0cefe6cc1e51ef1355ee616b5227f43ed615268346d79193147d975bd6b493763c38bc16bee32c779250acd18ea15d5de124c888895844cfa740166c0a94a42d624c8b5f7146624efdc257bd420601d65a428834b789036ed490fd4be3a3f7c5d2d401dc6d984e734e65a019520376dc3e305a8bf7b41647e10180e1ec5f3c3567fa3f7e00486e6fbe53dd0911fc2319cd05652fda97ff429e384b9c13108e6480e8547722746fa04dea319fe682d1aea26db6867da72bcfb3570433a3ad5422b89fa1e79060a9fc11c1f86455135ca4a74cfeb707922b028f80e177f5c3ac44aa5db1b0de0ce46131891013a1854e8ff7442883e9474d170548e24ce83cc3a93282d818e51c6ffb13a658ca3a4e3f6d49fb30da6745ad1bffa8cefec58352ffcb339013294a902937f9a4bdd3d0b0e491b66481f0bcff577ea7c1c73c45047856a2ff2bcf0fe3c74fe39e6fe3864fe3ceaf36567d7db2bf685100683c48cb2e82108c9665d54d2d7b17206bac10cb2705bc753ac701c54c4e6319123121586d4308415d0595480f54670a98ea1124276c039c2b345a79f3c70c14f5a6df00de4007d23d5474a8b887af458a1eeaf91e7689f2aa8642a548da5c4d78c32bdd67812554f32b8388635b0e9d80dc04a659e160e64ac99b6e2a96140adbe2766cd8f32639179275769f34107cb325b5b070dab05dc0f770e7ad0236e399b921e40d27665fd3c5b45d3be9e53a42eccbfe9319b968a5bd38842267ca5bd090c6c834baf6d2cb880db372ed71c5b06ee0aec0d89144f1ecb7849e641b3615da04fce8c579a88e9a122fee826efe1c91c887c71ea43c495b361e2b099c98766e64d4a4a724941bad74e0f2e895543cd794eb07fd0a6645ceb4fbc22a8a5ddc04d2831097a514ee3e1b42bace9319e0f74f45c6ea183bf2d94f31c235692983610e59369ec3be860c6788b2313a95162d11c383bf9aad371de44be058ce98b904f792f8fcc4ef77dac2740ea8ab42e0aad8ab8ce609b192925c2b745d6ddba1decd3c551faa13d2435a41e2669b0a5182ac7eca26e1a7e923544f028ae329365edf0fce818934400d71138dfc30dfa17b9fbb21324eee98ff27d11bf3dfcddb26a142f98869a8279566aadb148d5ef408b5510802d050b7a8135ebca69a2b2ec1c5517abf1e0629c1b9452911c4c39438d62e6f1ae1bdf20b04d69a64d1b996402f8f9bb01812a45c6c456504309586ad323bb0fff12c3c35b8d8857c4b1c661d1cdc4af241c15a3c1bb68e0158020eb3f8d647a89e9188f3da2c099c1a13544d8382568e115ce46ced46ad834b3da7c1e032b3b3139d7a3e0d89007b5e1bd07b24e4aff77f929e6c0cc5eaff4429d21a0e75ee7cc843bee9c12fe08bc4d1b3065ba350426e3b2867333d85d545bc1dd37ac002113787b203f62c6a9466ecae551eeb63fefb0d3f9d6d871d8dce66d29f1d1554893ab731c101838e4d28b52c3c645ac3c2639b25cb32836639552a8a1a7486cd936f3873bc2e0d1b34fe5cd12e50f034ec74c56d5baede9d284e08a1be134760a260d7f09aa7d629d78d08ba2d5ea78cf7514b2248cc47411ca872fb493bc808bcfa305039f010e364259a523b5732baaf5b0188bb27e0425d89c9e4787c7859d72be68b378c78d32c86f6c9ab05ce0ebb65af414404b90a319a7bcf1972905fe0f1eb22b40aecb0739f08339bf7b087fe44fe3237814cfea32d6732027c6c507766149ef555f2afefdfe728ea5ef2c2e438fa0187fb51dbf7c2505701dc37f82edc9d14a5fedc725129357ba6d6560e93581b1bbb6f371edb05ee3848df51fd375a55b011e15b2ebc6e48f02f63f11a889e037df8552b29830eade9d0f9a79515dd40d137290fdf0c90ccda5830a714a1bb6515a7defd3cea48d4c4c524a987c600ce20b89550197f7a6267e652ceb5c6290a5c5454413fd256ea4c82de66c35875f4e8491b3a9d0f62961afd494dc2d9fe851b579fbfa3a19521afefa42f67a0e1d81e328a3bbea238a9a2a0a39bd9658061416001f46f9a51833a0757cc126264a19727b74fe4042f0ec644f625222e4e59c3778a277e2582372d16d173755e4f243f34d6e02bb689a93d5cff22670ecbffa0bc5619c27f79c81f71c274fb89eaa56fac983d06f4d0845e33211cb038c016d8e39bec1adf755a178e72b422b88354bc930cc3c3bc32d6a5e4472a338fed318daca1b3076753f0d36457bc62633ca7799377bee73e5d3e5349aa8fd22567ac5f3436abd83fc4f83da4ae29b254e54b229199a9217dc57f342f57ec92e583a2323e56b59b5e7935976a240866c35a9fbfc752bbba6f94a997962ef324220ca4f77e72d97c02aec0402b3ae301e2aa39b10d627b27bb62a2ac20fea50ae615ea3b319f0ad1b96b9ef68fa5cc4528672f3a1a0b19b7f28512078b1358b36910672c1fd680c6842965ff9c703689c90502f206865dbd7d8d2749450888ad0f37544054d8cc481257e06ff7e0fa6fe39f1ceeb010f1e5e20739362e54e49d23c47791ad13f409bb5a506a9588b8a3c208442f2d4180e620ca34a5ef342a313304fe5d84c7847a352c4b66ca3980a6c8d973c9df3153b79ab1f6b6f17c07eb34fcc9276d6a3310a3a42067441681c04ae1a0fa6832f8b448305d2e7a53ec26c7d1cfd1a49b32d455ea4ecc4a92e4bb68996a9ebb092fb0837a1bde7883e0908729364ef00dbbae2a9acdf61d4b490ff3531609c2ffb3c9fe665360c87b07f87e694f2e5c87d4c4c38407cc315a85eda3ed9a7a899b748e9a1d3140302be3e10022a98aefb0fed3c10cdf1eff06072c3bdbd12d7b90b456601a2191987d79c36345fb753a7867354d1c3b3c14a0a9b0c0ce40d3b491b583d4296aca5257b66633b2d73a0ae78d24a26fd89fc50edfca734f80221e00bb2f23b03ccf332a3e4d96c87686653ece6054beb360d61a5c9c7816b0a6da1b2f622680c2de6922ee5c4700ec2b3d7e09634f88c5fb9a30b1c315d9ee8a3359b0ef99c8f3468575ae6ede84c9d11528ae0ad0e84480a4c3501c63be82f6017c13056d86f7c31a92ef35c179ba438660b046305cfad38a7e7da6660b94246708bf0f05ed1eb60fc2307eed967cab9f9036bc3a206a6ec7022b6a03055af227b824aa2298d21f60b544ac1b463e3923a70730be40b544d35eb1bdd81c731468d114ebdd3a67d0c4c7c3fd72a9e2f3990a164cbaafe07f551c3d583fb50d40c0d60822c49dac12c114fcb3fc3bdf86d269282dba7ab98e39b1f2b46092fbd0873e395766581a27cdc39b90b3037cf513b13f6f49b219165ef450154be5406f28a539c80921bb4f8e33c442fed415a5839a20151570c6b7c07ac66ee7d47e16a8a76b7089377db02e3420242be900b749e460f73b1da41373625beb210e4b348d1c6c6d0fd293579bb34718ef431b8a20090afee52a300b35aa72703c776e8fad8467823911fa5a7735a48811d10bd5f03f1c657490148693756017145065656592dfadf63cc1e36c9f4155cfbacaccf193d231a40d9ad7b59b7a0412fec0b656e927d2bf781a1df4d0d2f010df7ab73de03c2a4a787b94326768401c4e4fc2821a15f623b1a96f7251b41278e4c190b50a36104f11eafb09767433fadd59820f55d2092a70112886a6cbab1684fd38e577f62f5f000b8763c51855821a3841e72f480e725a0925629246c72c1ae13216af8b9c550fa23b686daf464a4b122a12bef240f62c5b3e775e0e95c9f41926c998ebc9bf02725f1b9a53924f805f4b638531484c338709eb10aaa6271b8b2ffa8c4da8e6d4b06671b63a1566bb91cc428855498de0a9d5f1b1da09ad8a8c39bd912371216aa49f506c67b79086cded1d0450017d6b8b5ee2b91fb091c8c302deca553adc79cd85b1160d7ab1808151ff029c775f41bee6015b5c4b0fbaa5287d47d1418621a9a301fc5baf543f4bd3e7ec30422fe070dbea2cdd22fcf8333526dc42a58fca0bf622e4088f95f394f6cb2e6da610c11f64993776c349c616524705669dd304c8a724e229ca3123a1e39484c1ed1f08d4b8de0a461c7b0728e2cf0db03a9cf6917edf1521ca060f8a97f3d73b22a8ad3515bc295c19d21cc8daf22373be9ace238132a0c5f58966a39f43da502424b2d5af2bf5ea24974c9f838c839989e639851ca75210c067b445aac94f405a17d79004c156212de0a8677689321413d086308989161fbca0fd486607e45b1c8f3429493a6ee1b033c5911bb3656ed8b56106d449d33697d8861498b4bc2f970259838576485a765a3b35696df62946981807d45465c00201e08c55b2803e10b1fa0e159728af51e34b4e5ed235d3eda20ba926d423a5365431a994c2177122e87e0c03668f729c584619c4124be2354d667c5d89b002f213644b99a5b29e40dec58402a1c1d31feaea8e217aa4c308e9c32892647d596271cc57d5433b262e30d08329e15a32653a9046daafdb5a21a2bdf80675e125f739fce88d174ab12ac66f928509cd35096dd70249cb8e470d1edfc6f66fcb9c4ccd4325943b3cc9a77b35560d48d5ea05c33fb67b96b11f068ae066c1160eb6316d84ff0d316a95bab8c05798d32b7715178c117ad3d6f2b299e65602b8df40b0e8834a7d017316785957113b672c256e7e98bc2b49c6a8039af2210c8c552e60ba9268a2fcc6a2b94d56d5be8117eca2edc4532b971d5bd18c34200a35001e7db51570ad468883cd2768868a401fccb298fd47751952e35e52ca262d0a84f04a020c4418ee8d99e4ea56cb5dd8ece561a93b4decdec85c762cdf9fa1d49c462f478166f1a55c5f89600407f54a1d6460cb4eb72f7d468166cbc18a08d7b9859d266a047edd42b48f50b2b4d4725acaf36ebbe9ac3a6f9e59502b547b861a920bc741954cd183890c0b5698dd1d9e5e8e6d777ce6d9d12f172948e0d935d15170e95fe44942598872453a4f0998f1ea33bcc5083f29494f254ac1c2cc2d0f819316b92fa5c0f143f49da1c9c6a046749908324b57cabe0f5955d0aab2923da1c8e3320b0562ed0087e83671b1deaf0aa88193a2ffa3d81ff628b56fac8b9d39147ba6c33e30100111bb89bb72e1c051341d7cb845e44ab7012bedf5647ad41ff69600f484c77f416b4c3852ab39612e1db490e3420c3162c05f3f610b8b767ec67acc2d51f6a7ee95659c57347d7dc742ce4308e8adbcfb7446a0f92908eeb7bd2deceed3463265c96040fb4f8d3d597765554f2e37395035f15cda0dba6ee8d93c215bc99a3aa1cde9d0a7b196ee3c9aac030086c209eff7a1b0c40651c60333d9a2fb827b0727560a9e288cf90a299c748045a5e3b5571954b9658109152e303ce44447c58044a29ce4dddf5623480611d3506ce4c33c89212abc7e86c36df0eef3283ba1c2e4eaeb1d22156776a096f41b91c45a670266a1591616b2601d511fd85bb4f734891453019fb29fd27f812a3cfcce4eb61ac9533ba382188b845b0272730e2b64dbea2d20a7152dc0508b8d7b386c6506d70302913bd56aa82c02c71760e823552bbe10c8c93e88a9f9555a56e2c7558856df4e106a6b3d2dee7cc784136066acd44fe9baa420be8310f286259e8e5c514dce03bd043277315ea2728cae7ff6c22d99a81229754e31f11ba286db04ce699a11e5dc18f42441df222d3febfee00ce13e5f652cdafb8908d0f4a413a5c14c1603dce0da411c6d12785e4b8e9f26b9e69cf2b329886e3d4c2ad4ad348f5e3ab6d7ee364d7ee41a46da237e9a73c836ec11f6c96cc49872d2c4f7712da09a9a1c640f8a16465e274dc46a264dd33a306be9ac0dcd1286b929da686c557ba645476f285cd1d0f26c625e38d12ff7c14ae6bbaaa8de28dba9502108de53511e8a3fd047186dff117a4aea073953ab5cd2855498a2d11585e7e7740ebb594ff8ad18bf99b986dd188f5f550a56a65b6ce579546b957d7d1f71afccfef1682d5b4af8998a91ca0aa40394c8c2845bfc2053aaf22c1f7e12b7263c62a7838b0f11c70826d25bdb2b28c97ebbaf378473f0ee1fdccfd24e83c509e79ca678ea6ca1001fae32a6cc0a62849aa4765573a59b05e11f5e0687d971157e302202f1846de5d69b3f750bebc217e40c22530e969c721abb66ba2937714b37db33570b9e6d7701f6ebcbc7d250db845628486fbaa1af56692dc340d98be0ccb8c10186fd9a20dc7e9fe5c5662120b2e1a012d3f0e7dda309960f7b20e994ec70a4c0cf73304e9940383af5b1352eb5f9deaf5d489f0b86883b1003b48bf03dd2f1e9c8c140e3d10bb808e06b380e1a1f3d37438cba31e5bec86fffb15fedf97caf981a014733b31a01d105802f273bc5cd6da626092c88b1c2cfc136027e8deef9984806e6c52e82b9d6d51d2480e0f6728bf8bd40e791b7ada41566cfa705d4c7b5f468fe0c914ffea76957ae55f0d60ea7224f885cf6117b8267a548ce8887a7256f042cefbd3f647e2cded2d6e32f58713334f075c5e780cf958f51f8eda3de9320110cd61c803dca1f70910f89ee368b99ff50ff4912f1bda30ad92961ef569d9bdbe8e6edd05e6d3213504c6db67244675d7c78085f0332984645d6f18b13bc68fb9029b52df174500b55883dd659aa1fe05b97dd549d3c9084edf4d54924db0dc3fd13d5893ee0358234b016dcad17d83b56f97ed5b0d96d4ddf0284ef47af8644f81a14e2b613aaba1e5e8a0e42cff038003a721a695d94ae479441b23e289a7380f4d10472859c915a3d350e280b57ea318e2246465d5b48ba7dd2d85cdd216a0b66d3ded440acc58d35a93f44ae1123793f6d334ccc6dc32fc1543431f3a131f171187010e920fdb051ce2ad893ba52214b3fa29188132d734aa02d033792c3715d30a824192fa4f8f8a9715bc996d948be853e3572db26d1feb291ee0b56e9d6410d5adbb6473df43c77269f2ce7b61d7802b577f214b30afe043fcb8fbcce2cd38dea5ffff2c7b3c4e0059e27d2b0699076cbb169b7fca033b70255d419619448569bc1b7c6d36cf90937a59e927ee612b5bc3eee1ec96b333d25461b7b73edd87408f8fb651434a0ca312e5f87f670b366b81161755cbe135b6ddafad78642dc0c93452950a2d36761911e7ef71df39c9e3395a4a243725fb4b00a75b49f6d1cc2dd0dd53795d36a92fcc43b728527bd2129314a231f08e6bce50350a6616db09c3544093fad11200c29e9582b3565493099a2f0095b3c9d141efc54b64d7878685c1976edb66ff25ff646cd47e6b354af3e38e271a3c4c8e4f7dfd2f72ff7c7e7a152cdc8011734ec4cfff1f06bda81662d08e9e82d020ac05af13ea09e2229bfaa07a1cbe9edea0957cb735642aefc579c9d2a4376f17c9ae85fc98a7b86023aefe3694a6c053e0ea638973118294b6e60b390d3266a437e656916402c21bd3899899a89261915439a50e17bf507b0dcbcecf52ffd9eb623704cd1e87e31a7e9b6da1dc6dbc20aecdb68e1d22a8acb7677cc745e1ef57d1714c50a9b5cf788a7b2eb3ec1a43eec38126a37851e97227f653307ff7ea9d5b38a0a99c444244a21d9a4114e256112c9df339aa5cf27bc0ff31f4c63a1ddb4e5019483f90f97ab06bd48616cd8fde8530972f3d2d2dcd8dbae19ec5aa49da5cf466827bfc294eaaa41e65dc3b8509583872bf714d71cacc4c38514d4fdf7efbea3fdb2cf94b2249973a19410fded06fa91a0ffa4ce2ac005b0b271f7accabb14baeaf5e728783c63df8cbf35779ad80717d202bf67d2fc781b304474df08572784d854baa34bbe6303d77ecbb430fa6ca79d488f55b0899c92bfae9865197f652c71ec79c5f273d3edddb920653a13a1a47f34e5da1b7d204b1a1f2361e4281b0f0f75d2805362647889289b695cb30127fafff75f0595cbd5b06361689b13cd5fb93a9ab3cdbb124984222f517438ac6f33a9c85d331042c7b0ac2788288a6ea22b5a5f16cafd5ac29124cd23a890f99cecef13c1319ad914f592bd46c7c645f74d5218e94515393d1a3f8cf325eec167bf3479d690b7b0e0b97153715f756c1eb3e893f12da3963a7cf9b1e0e69c4b3e0fe0db450ee701f47ec26251c81f756e7e192696f94a5375063233f351756ad3d27259361699fece8dd007772d4fcf1485c22b690c6d29a067d674d5568c9e38a355bf21e1813bb12ea02aa7b93f4fe1742b7524cd23c5f8d965c8657a900e877a9a1e8949b124fbf3711c3cf3cac15bda6420308e76775c185a26ed0b8b0040cb72cf956a7845bdc3507d021f24d71e229a93b2c7584d2db662e7b9a20991c1c572930058a9351db8a2316d96b08b0680a30db580e46433a7687440e664f9ee8e24607c601dd620230b715a52ac46cc7a128d3081b5775a9322ec9f4442c75bd9bcda3303087a0c8b30635e8124c6c64959a6adb2f8821b7d6652a3b976608f13e8396a63f3caa3a0e118b9c169f9d185ab81053a64c1880c07bd8e700ec36095907142f56fd28ded5dcd02a45ef84e5869a1a7c6df6dc45896e290470926832d06ec20ac55888524bc258440317d8de9cff35172dbe8146231923196aa4436d64fe3c119a6db938f23c518c9aa66042e8b0bdb33bdbb2430101cc764f8015f20d73411ea5aca763fe805eec12425b689fd8f356ad568c2d8526bffc22b0380501ce3a6c1470f21293beac18df81fc572345d670791d3087d50afc031612f917747f38e18469aadfd73e27f72605114410f5686b46f1992e93ab8261d9ca36cd3b56ab5780e2efa6e43691e0aae877a2ace38c443c4b7c47c5867cd43e8c32c256a1b331075a5f8000fd93ccc559030f792db0a133bb450de342d04225868cf32bd9ae0f9c6f7431dd5a1d8e31292fe386a37d1b17788a37fc923aecdff6449d334622ed4ae19d538c2c2a57b206e4c966e765d59f29a077d5197c372d3abd1d4dc51b2df78d97ed588a7bf696c917f1e034270fabaa4832e12abec142ddb647aa11b355f54adef21a8e0157ad697da9028037ebfb1480ea3a6dc54a33b5a7099334508f840af38606c41ec02e5e8d2f7dc51d5efcbe8592e4d262ded570346a696ae31785950b2785693cd2204466a199f6c7e3eee4d0038b9f92087c255d9b808b38268e39202297b361079482195e18cf0683ef74393c7a7db2524fe1cc64e79f4480ffd31c84a810216b13092741c48c8ddd419a07428aea9f7c9bba37a8b4ad63c050207c9704faa26fae1a0c43055bb522607b215989281504494bab6e8914dbe9167db1cfde011b0d1c21f2bb633f11a3f19e0488d53b69509179e3add650b8ea36ff7f1fe3dd8b5658dcae782eac4689d2100c80a5103ef8d967a9f6a026ab9e09aa7b0061aa8547778fbb4b811cf6f410bd9b19d2b8ab665d94b5cdee89e426786b5a3c36248626ed5d5ddeaeda067c4e787d4f7cd4f837f5f297335f013affc0cef5878b5438d7137de26f0036933d2082f546cf729d0cff4b6a455aa5e73f6ec3e7c78d01fa67fd6827b6433af77f3ddfe028d2329103fa0ec4c10d28b0eed33d6338224e89ebb38e224b20376f731ad5bf373ac03bb0efe614f9bd31c8c4bd0812a4a8b47322a3c7bd81610f52f68c891be63ada4306513796215b3e22b7e22954c2a0fffea030745cd7fcb7623096d2b3c60281d6444a8269cbabc408a694567e3a915f28ad9171d22a22c4dbd45bdacf7d48a731a89817a741e2b4f2d99d02c164c3e3fd2a0eca789ad2625c858ffc2d0bee480a327b4d40b3acccccda0788283a7da7063035f5fbcf53eb968664a0065b7aa21ab63e1704995c11616870d1e19ba61ed8e0046f0d83e87d19c26d56bab6ad4166c3ec2f066181aca735893be03ff71c742ceef0ae45f140edcbfaf92359ca159268ec1e3760c644c5b25cbde8e8ac5a98d25332bcb4f915dc5404c96f0137a5fdd679ea86fd20d3dab7d294f5f5cf000204ac4ea5f5b85beacdb4b69dfdf7608b1263ff3a245ba102d17e5b3abaa88da8645fa78f44729e1147f2834a24d1519714d7c2e1b269fba83e7e47b9cd0d273d39ae728662c485b7a51bdf0c877d012b8a40d6c6163be17cbb06b1aa37a8b2bbeca38ec22324b6d01e62af0a340cd1300b7bbbd56628a00b8d81066dcfe2346e6eb43490290f0792501707d7d4a198d2acb75e990c4eba1fca2b2abea67661e13dbff522ee3bc81e56106b1a4d7d6b9c0d84f8fc2be2b3eb35098cf88c67994c9707d55bf20da882383f925a296c38e408b08ac88654e454402a54007b53be2e3be54ceaf45619b506b5dc49419524c4741c7c6c9b14469f036a5e68e4bed1f2d0c8574c7952e1ecda58aa6f0ed17961842ce8cb85e84f487a28ae6b17c7840f42e196583aa60a1f9e87c55d57b02e3df90989691e22ed37c881e33b453ec8740518775101070e3aa7c5c22187e935ac4117323fa562e2d51691cd3fcf4b25e155a628e41bc305a96fb34b9fd05f415d7618cf5c69a86766f800c1c7c992cee4978db212915e082d3537faede45170c071c425e6f5db3b7a79805db37f8be4b5bfcf3f27f110ddb42083bb51e5a1f8a2900df94682f11991b51a69823896ea26324ed001b3954d3ead23bd20f247cdc81aa2436a92827bba0ca62c5ec57d30383089e0eb6a3094a0e1afb40d7b50c0479788079a9c9b18a45045ddd544c05b55b84378ea9650f43121127a8c814e387a844cfd4c0d642ef0cd0194a13e1699a5d0203caca721044c2fa854345a57d7a635c845091bb344b7dd9a9fbf8383622292f5c3173233499ed84f148fd2a2913cff9eab09eb1ffbbdb7f6250a72331904d41f917643a8771cd0df95998cf54e34319e3c1b0e02f669b02102320e02de28736ab6c76009f63577a7e9cf483364cf9174b950a84ed32df58ebabe6576c6b1384dfaab9a132ffaf4dbce3d39a1f0de5051dd96eac027defbb6cb5f1b44ebdb2f05b2871a38060eca9c25e54270fa08dcd7b8b3ac1b60528b166c08be1ca8add87d7d51f5e0c1a48bd33bc18111649d8f0ac9e5692818fc515754c3a4dba20b93c62ef021d187ef2bf43c1de93e1cfb756282774712b63248cb55a6ac38e804e5c9eda688547855a9fba25446c02d909a4b8a3228bad9a175bd10b43c087a4696f4775d2647b70509ddd2338864aa9da143d13da55bd629175b7d8688e2a0924e66b4f0a1bde52706eabc393af42c2a82c437790bb404d5c70083e152f595f70354f910d9493b0aadaf4c6c98fc2b19be8c33763f206cda234b36ab59a7216ba50cc12ca26da334b85cc9a33abf51fa4bfa98d1b64d3a266e52b5e68cdd4fd8707b57f2f60513f4168d1e471059734249650ac01d4934f820c51580f1863d37858781d2fe593931068d43c531bd249f7f045e7ca4be05b80ab6a431a4b90eb142f13e721f848c7641f7ed7999382aacd7e41a129bd1af5585988f8c789e956d24f61e40294a523d09973b193b0f4cb0ea276370f9097dd53dd089b0a2c6131391339b24d7e51e135eac2c07a9dffb046b5517c0ef515cd35f013bf116d94516ab7b537f5c248c5917ce762bea4ef44ebb524d46ef2090a7dbebefc2698f6edfe40353cd23995e21b2d739ab0ca9116b1aaaf0e4de29d9fa3d09a56e9a28ad1239d1eba199558a59851f07115c11f20c1ea1517a3f38b0c2188a6fff1507df395f18bdea651137a544b97b70475f8fc94bf325494edc2b96b29a27cb620cac4228d76bbf9cab9119ca28383198a5ea190b2954d143ca80004ea1824e705d197fce00dd4eb5a94a9135b9abab0c0d32e4c153246dd3f705787d98a5b5eacc4278d2248db9262b779f6936d138a21d6e93836e862b08f974d4463ea07488463b2f866116fc79e7006d6a40dcf62e933795740008005001e5910e439812080d20bea2aef88847d031c56a25191998f3576ef16d0bc5230f7419ed8e586657a42e32aad6985207373c39758094d784c8f68161708f63e4d02701b5088ecf93b92733aa58e34613ba066c8c71f3f787202da6927813b24d165f667a831238c2c1b0c7908b081c7305f7657ef52a35baaf8095c8664212ae66b4fd4ab4d35b72838ce9bffa4c1bfe7ad1d79890d230a893d3fe9c255619c9710aa6455639936be29cc74e868e930bfc819f660d8d18e59b8f3a9300d2c4a2ed6122dab1674d90ee62010ea74ee4c0cf108e5f18f8f28363f012de4313fb71a32deffd383ab04fe4decf970075760fc16958008553446f511f94a92d646edffce38119951e6a90ad9973c6aa2489ad481b634d2fb7af75dcc2119ad4c808f8626f0ef622eb5ced110896e91df86638f9240c295d401a54e57aa73cf7d85fe3d906dd8d7f29671009c142cc8a9ce1dfa2dc3cd633c04e20c24a758577a72eb8e6d62a2158499a402c0a45bbc4e4a893e317185c58395a335318803662f13d39e7ce09b32889c4efc49465eb196b793dc02816ca8476f2adbae5adda7ba7b24c43da573d4f4e61c87c8116169ea79235e63eab97f4137e5c69899c22d350818fa325f30c6c31e3e9f5fb055a45875a0513fac0f1120bf23020c7989ee30af475c8fe9ea25378b2f654ed72dfa37b4e67ec61a49fb1d7c1d3b4a6e03eac8f740f4021435244c4bead3a8f97437a8abdcf90ee90f86ad4d8503b04f07d344c42c00c9cc49eda93a25c8b2b64eb3e7252a68d3e2c08748d68e6174b78ca8c5dae0fd55973aae254feab6dfc688579fead857d9c9869daced356ae233292074a7a78bd80f5d59492a28b290763a3d97a8e219b303fa6072573f36ec5869ecf196b77e61ae799d18d0259820172da6184d5345a210d328398b8b9ebb5ae0a233d41a7e805da684b881b53ffae90a9d5bfe7311e54a6c05cd56c8b0e2b84000c75251587c2a487df4eb2476d1f21fa84ca82750d800ee8c372fae308a31856cd59dec87259f5c76673811e1a6253656f9e2d11bb9c22b178c92e4d8232eb895906aaf12b2229a431787a33e3a520b04b01668096efaa5e1716db86f04719b12dec1cd670eeb7074785b06b5751dcd87564b111e65eaf0cb9c562544831d1a9d055ebcf9ebc1d6db65d8a5cbc257d7abd983e35866fde8f9793190cabed4212b7a3da44de0403761c986afe8db78a24c9366e6801f14b96716cc2f4719852c3e8f245f245f88d4b82d9f9e72c3d7fbcb74af5bb03ed2cde7df525b99cc82593661050d0d59e7e7cd0cccb2545e2998a5636cb91fa3c2271b075a591b78654b6ebf985c2719ef7c371f6fdfea60770f121cbbc719dec1eaa80a16167f63a6a0969b837a6d2d9d697eef25ccbb6f8c546de6814f8e18547c74df423867ed0919f6015299c09662f0cbb87e1c227e68fe35ce4f018882e4d42b1fcc8b9741c2b918a00bd50297e4a8866f9e80e22c802a84d1a69900b1dbadc64004f06c0bda2334ddbc62a21e5b32d9b2080b3a02e9c9f90dfe871a306a0b137fe142ad3c6f925030a1d70cc19099113fd25ee754de5fa93305b6311674caba5949665fa4cb0e49a83faed8cef81ae6a3c631e0c267f7beebd00654b58390854840ed1a07dce11d2e62d89951df29fdbffc460c2d8a78eb790864e821c2a1421041c1f62d406b8db86d50eccb336403811cf562320c16a068583beeee06447a07f7abb2684e81688af5419a385fce227c5deb67be7ae8cf1710f36b86d92b0278b1eb7c9435793563cc136afe7a5be50885c4d9e29f600a38a8e2903350b4de9e824efdd102d8984e525ff9dba81ec792071f1982283f4ed03feb70e3829f40fe5f509c5df9c6591ff6ac5c190b8b068525056d1720d302b4bf210f22b5d2798b73a459b1f10a3d8f02092e371e3a2df4b3a70664ea74005c730c86cde5d7c5a8bff56aab5322bf0df5e29bd34d92e9489105cce6165ec226fe55ed63eb98f8f0175ed702c49f5b19c0c5ef5dfb907c2e94a16a7b0847c09f2a57fb7a26806710a9dfd088718b9a1028858adbb7ea702ff642de27ba8aae2e7ac56022bfba4dc669679267e05420a1e4123c162e7422c7f2dffd76e67e9581a9e8552ab41e6a00fb6d3019b4895eac6bf68cb64e95cd18ad358ceab0b9a292172aede6e6e1609d677df1c7ad1d62a0935ba352bebfc2707d890c4e45c3b813f3ecc2fb488f56c8431626615b92e72df580397793a7c53a0e31fa1387dfd2ed1f2bd67e20b9e709445a4ae869e08df0d95b286d4a4664067e1b67108a5943e8afb2efa9822c1ee17f4bb539fac9856d69fb43253bd56409c3dda0667acce9009840e36a68d2e951c93551aab30af95f52706bcf1aa50a9618ea89f3d27d2493384b50c5fddfac0cb53751bdf17852a1a1df6dd62effaf284b47993cf3895d9edafc2061864ddb46f0e0e4e4fdde22e490b39c193cd6a6ecf0cab2985683e9688d26a526b819cbfa2ea77f9017335d6745ff73adc8e000aad736516935db0705a06a94b43a57f57150c7c085eda19ba58f214f1c911f8004c2108000927043939105f9f9402d481d405dab927d8e597d1cc4f5a3245fe7e7dd7014c0facec85abc6660d0bd41a80e0bf979b09bf0d93c3d5b098632dd9cbe420d2ab952f814ac4ecca6cd6e86ad5be7badad3b93a98c935b13c3d566220eca3362d66841ce08b8c98d9ff68f6e6391e6270dff63832b84cfa00387702496d589c5b261cc4e17087d8d6f2c77cabfe71a4a8162850134127ee0aec5ae6a6b6405a12e3f276c7548e8767e352dc9448dcd74d95eed96495cd5eeee6423436277311cffd34f7c6308d2f388b5c26a0ccca300ecb492396d53c204fc5bfe82d24ae3f27142d2f19b558ba3f9c74ed44047046cb598ac71dcb5f8ec0309c0f4b586b5eed16ed1a19466e56bfb6b7ef1c1813cb835da85ba7cb2e86cb5997a399c9c5da2696ab0730e244c081aac37be538975639f8da577d9c466bcb2b277103090474ef65e54a5b6e8854da79d9d0487868f8070c0469d0b3308f1b432f6b832148b90902407e96e9ac560b38ed3a7cbfde850863681ff8df97abe66ed6738326a8902ca3e1aedc10701d80efd44c5dc922798c8bb5060c0578aa878d0f3fa35b1709fa6cd0e90babe19d427eb367fca24a9ff922995ce87cf93c9a5ce23df1d60aedd03254365d2a4641d10cc343bc343c75e27d4e50210cd2f035f6a090a10fcff44c299e923201d94ffde0fa4721340b498009354139035560c29e30829d901b8cfdfe2e7f2014a34b420e934642869a579eee960d3d8b7aed12224171da0cd5ade6e5b88ec5a668f0192c32b76eff01457fc0672eac50413145d6a886552f7020696935f14fe63a9d10ccec26faf31f59ec7c825e43f2e61b61a241241512e903df0305f3fd5d639bd3c5069e7840f8bf1e1a4eb018b3619c42db200f37373d8367f2a84f2c7ab4063220e6d686e615d4b9d01807f662280e5c623139eaf272b1d66c58e7fc4912c0a2baeff08f06e30a70190b3cf42e1928fe21856109676aa3fad1774cca6a6bfc6685405f995efd00b7d2a2dc1f6626e77c683605b90fadb500fdc3a15d1a5904b0e3668466365d1d64686aa8b1c58391ad71eed908d2e3f54eecf505ae87c368178e56c05d66a7c9278b4aab2c3ec1bfd693420f3fb1d067b0715d38868e69828a5199f3c2111d39240edd46bc0e311aa34e8b9c170e777f1149fa26060135d8781350e666abd939adbee221e2df7dbbfac2237f43fb7ea605e2b323c81bd1c2b12f5a16c307753dad5aed05fcec4c981eb8e97abf0bf81681c3c0f79b2d1dab9c99f237fd3c474513e14b69c6a987b5deff6d8f0c7eaa01acb972e36b8a4d808f6740a82dbf6783fbbab656c2fe1961a4a5050bf016c258034d5440d429e096f8eea60cb32068910e28795a229950551365c3c76752d14d68b071d3a0233d68bf4250dc36bb5ab97e12585717ac55a12caa96d7d841ddcc837391ec07b6006689e1a860f5bea2aafc064c2762ba1d72fec814243dd841ade66f9e1723eda227d06f15a868b1ed1671821d6d39d0772075a579f18eda9d2f17a4b36f991f41a05c74d01e5ee873c7a2b2b36fd0a22c2865884aa8109346841bfe5611ef53855ba694b97678fbe543336d673c9579557ea824af8e9039b89d474b99a3a2c02e65e9573e9db53abba8dbf178236520d20244ccedc4c5666dbd3d67410d50df4ab37a22a6b7806731d225cc9881bda5fa1d1c875d529f69d96206f59482afd179cdefadc4b534130cb4ad549efe6b2f445f4fc46cf98a2893c12b35c8094587ad70dc58498c0a23fc7b0f5d2decd8a755b7bfbb5b388bb9b213854c964bf0cc15f201ca6a22ca3fb10f7257bd992f159520e18b7e160d8410c9dc8ebc9c0a34d31426abcf7df32473944d98cdde76ec6a19f7f6e0bbb1d620d9d816a534f8d504ef1f9b6c13e64f8afeb7db7326512850970abd3eb7fc04c78d6e9727a2b148a6dce55adbff36002afe01e0ed65e48ac8458f18d860d67ca7319a144fa291a06cea09635eed54c7ab89a9bd1540f5a93e70a0769389a6df30087cbc9d8a26784dd8d33f3cfb0971a606de3c197bce5d5041c5d825eb669676900d0b1d487ea7a53366036185ede036e1fafd99ecfffd112552b9ec8bf630bb19054f3438cf7b26ea3efcd17236ef58732c9df5403ce3441ded972252164c4f0e808e8b3231dea3fcd07fc8ccfeb5d511392d762792eb65c2c40ea9a4dafe5f29ea910bd701fd6e3fc06b5e6066e7a3b128442c033a4e2fbe4d10108ad9e6c0b382fec74aae1346be986af4ef885e1d05e86113480178cf0c3a65730e8c35a17ed7862ec648edd92afc0a908fdacef6b404870e3956f8d156baf6c9a2dd445b5b2f2d6d22650a650c390bb10c5f034d5313494f0eaa3f3921d15189bb13aef5b696e6926be9f253b816fa6505ab86ca45724926519665fed27c9d434ac75df84a3cc2cab1c80677e1eb7922bd5195866b3e4fa5359f4172e36b1b1c6cdc741d2437add3340f8bcaacdea6c80c8ad5db14755977bbd3772559be9399d4fa4d2712eb06f9d33bb4530fb28cfc1bb9070fa90595bcb1c3d792fc25a9dac989c4caca5ab56721ada01277e83b6afefcf460911aa41b3eeb579465d5bff326ad03c98c8aae4f5aebf3dca9494be91357a469e94da83ea3731d6c4b94a82d1112abb725ead396284f223a6d88faacde86484e1ba211d6b4250293a52dd15a1b22240e99693b44664d576f3b04a6ed50960774ae754f74f2cd9ffeb9a7576549ea957c7b93a18f7c75d7d24fcc39bf568427c5a58f23c67a4dc9562213eec7844b71bf14f73b8de569d2138f7b1dce77c257a251739ee2fec4cf0dade59acb3cf4c794e21ee7483ea21b5a73afbb7182f94ffa29c3317d0d1c1c0a25dc2bf95ca3f0b9c6f170e09ea4acccdfe2bab1a307d2ebc8a393d7eb19bd0e49f3769830d17bdd9b30b122f9f23b5a5c5af34f47c9513da35eef478c57a2ab2b8afa2ee74341252e990103c70c9a9c465fe17ec7dbf9d36a7e2ec57d8a53f515efd34fd26be9ef52a39d9a8485e291dee87548bedd1bf9723ba35d1fa313af3bf14868ea232ef974f87ae24dbcf37cec767fe277e2777fe24744dfe879274e9cf831217dd989c73dd289c7fd89c77df94956f47b9fe4437aa337b1a2c5a555357a2ef2c89d67a4237938d0dd4f35b1254d71b8cf7b7a5a55a2b8d486441b1274de84a2fa7ca2d6fae75aa385e0acfa555523a951cbd0d74f44ff446a414d7139dd76686dc53d8af274e01efd25509fb9aa3dd769d5b54ade0f555fbd7a8df59af220b38c37af64aaaf348fc92be740dfcbd330e17e5e197d732d57bd926846499e174a9ea86752ff7838905a50cbcf4fa27af0109273b43e4fbfceb75bf275b753f33b4f976bee75aef31dcf4bf7db69a7a524b58c4a3e7a3ee9dba5b85c0a4d4e4f5c24ef00cfbc1df9005f99c8ff99d840c599b9d446e813ca20a9ca5a1e01662dd33f75983a6ba31ceadb9d6b749a24894970a02489333f13d25dfd912e8f48f371bf3f3fc99acb7c47895765d7672d91f4da8eb7eb731ae553afedf8ecfae82b5dea76a76fd7f3a1afcff3ccfd6e4f6e37a8779e4ffe7a3f2ecd27cb503f939f537aadf4dbf559f3a73ffd3b3ee4e75dcef9519dcbedd03752faf357a6849a28d7a0387fa75f09e5e19476e51a8d5ea138c1e3f1aa902949e6488d44eb412b7197c9d76b3b94b8f3b312779accfd887d5662bcfb11777dd6ddebcfbdfe9deaf946aff327edb268175e3cc9d468b7db63f4b9dff9f27fcfd743e123aae69ff0adc959928c7216a4cf471a0c92869273ce2ad223fd98d2effd99c14a24cd906648ac9cc54cba23aabd9f892d6ab1b8c47bb3445f3dca5948ac52eff86419f9478493ace81bfd76bcddee473cf51aef777c78bc5d9f1d492c7aa20c653d8b4bebaeb894a65e5cda957b52944923486d1d4446d0db5a04126b963623f6b41901a66d90a1b64170da8c582bc2098f88257828566f23e207384b44e041716f78690c2a4a44999388124e932402845d49c4951dc9b544c405bb408b0215a12e2dfd529f9528c5535bfa403b18f1b896d8e8768164c8e90299c1e57a08c4b6123dcd5295401facaa96405c024151cf404a7426a041bdb28701a0219600f98003346707088eb9b4f44e3c1e6c4001bdd094a4ee965e6a97b402101b8ab6d9c17413c300e8a7e8ab6ddee894d480bae0c007d09695a8ae015445ad011006aabaf443f801c464355abd6d88422bd109510628ba08e7c682d207dc104975929654152dfdc080439b892c351cbce0c06682d4aabaa406b1129d701bfcc993fea963fed1015d5a7aa73f32c051b9ceb42cc9b3f77666257a9a5e0e7f525853555dfaa5d5dbfe6c59894b2b511d82cb99d41549ea92ba624b3bfdb2ac5422482cae3f6b59b70971c3aec9d3f849c25c81085c6ec52f2d71a5764ce0b896b49b5dbae2975e09f55cbdcdcf9a156b8985de2942cfec202db598e4d2921f2aa71f28a89fb5924f2021fc08b1c34a94e259d1a12b3493905f9aeaf055877bd3ea9a49080e49fab84fd2e5dfd4847e53d3af58c9a55cdcadbbd50c4099f9534b5393527443c0c1e36d7f0cadba6d882fab7e4bad5f4c25ee564d6c223eadf9b59e55f391b3eaa5b5055d5ebd4c132f79ac73cde78bce576f426a53ae3b5ece39e79c7de4ca33d2bc1f655a9a9ac6a63b2be1282165808120176248024f103bf0e942852082862f345c1964c25a175ae659d1366856b44d9a2324353e1db09539e79ccbe7d22519ede4481aa8445575bd92eb92e99a2ccd12d5290f074f0759e2cc94a7439fba9c0e15759e8eccc58c76723e17ac242f4776a7fcd99dfc733cf2753af2fd14a4cb408238d60df289bce3701c00b2952584c80aed9481e82bf29724b55af970c44aaedee683a055ed1344d2931e7a41c8e90962a3ce30839a410b3d39647018412da2835e12567a887c8052820f4c54b7436d46d0f133460f951d544038f43850d3cbe3c20a28a84a909042971bb0a846ec89d27b614f935e9444261052d7865093f0e1043a6d6f7a56da00bde042995e0c6c1b80a048cb1f3d19a869f458a0f2b0e80851a12e817ef8018c9d207208b4e685187a17ac30678c1ac21795832d3d103438329427002a0e79d254444a202d29a23702106978d42a71aedcd04323430f0933aa1813d43c220480835ea12abd167a78d2410f4b54274ba8470cda2204525a1e1ee64c69d3d343834ae88c9b13860053c683de0e57b0e0c1c00e1eb53a8854118e500bfd51b4a7178687a3446e06d5d0b3008d4a420a3d8471f281ca274b4f863b527a5aee3849a448958284ca0220457c7a59eaf4fcc0519170030286de2215c4a85cbcf4d836e819b233453dc1cedad1db5b4f85245c20e228893ebd3a77bae8a0c2b1014c1a282c8c50428f8810ee70b142c54b9d0bd42f7594a84a0c49112426881e103df412c9395ac4468d6186402df48c20a33219417dd3410f052b3d1ae840d1810e133d87b61801c58faa821e0d76e861c141a5a24695e342ef0f0a3d3c24a86f5dd86059e3210a1e1e9acca0e212a9015071847a5300f574f841fde0ce0e713c60b3040d5c5c504ba147884df5c18bfa644b1a2a4d7678d253620726bd2310a97b08a98b0095f043ef873b21c44152c2060e0d835c1022852f6c3d16bcf4dcb62ca1a266ce13d586394c542110f5da10da03c8cf0f3d2677a2c4395a824d1a0dbd0c5c50c9a4a0a261ebcdf1d27bb3e50a1519e43cb1400e932110dd4048350308861f7a1bdc51e9c451dbb05942431c17caa470860d062f3d335b7a64a8ac89f3e44c1c262820526920a45e00a867e7071feea839c419c3e6e8100d29b8f0410a1db089e0e5d0161ba898a0c313127460d2f382880da12c807a6a7e5031b803429c9e1236aa0734a8825c504be1a8909ab2f551532f61b86860453d14c54d0e16f4eee490d65b62893847ac44876308d0aa3651d1d5dbe0f45989e9eb3638789a7c25fe1e28343a2c29af72ac2620bb15498a4a945adb5461e301d214754b4aca4a6bfd468555a758b5fe59695f96565b504d326a0d6a29a6b7c21b2f2bb1a957849a5bbded8d96356b3542e366d19a5bbdcd0d126b532e9fe4d4536d9265597ed63a29ab3929ff54940cd205486b59a5ab19205950cab161d19e38359041c10b0a650f467cd9c1c91d35193240f282a789cecee78499c3b6ab83c4a429a94a4b1b219290986437b6372c64a78302220ed6d060c6062d419614ea40cd041df66cc183c3142430f9ca165754882d45985203df218917b20c7e678e2f81035b4e743ac921e739019016b6368ad87c115b2e8ce7a0d74377b2c42901509d305255d68880831238e45173c70475045f18a7a10c5b0e847ba1a54a0b85ba6069d2e6873430c187432b5059618b1d377cc00cc166fec24031826d856c82d6126c50619c8f4f70021724a458d962419e318594fc014287224cc053a7cd1b18376c31ce30865c4d5298ec67294ce6008cdbb0c7a79870e54f1c258160f8a1ebb4c2e54c096212791944c7cd1324304861bc10105dd89c0e1eb617618298812d8a01685c84f11b4a296c4f615824e1039b531825d7418037b64c2583411187ad4d85c361c376224c66b3628e1e36a63044f4c066662a4cf6806d03b622d868d0930e00054a211666b8c002b5b4326e63cea07923738687414760b2a0d47f981126a7014156098a63e58b057094c8e0ca1051fa34c1a1882e3a943bdcd181c96b8bdeb0c1e0428400021b0f6cbb3032b0018fc2d4e07f3c8e9d0ed6a09e27cc107cc264614b21b790851081a7049b96a3c1f8a12260940156b92c4a2fc40061a588a98b9337386089010b124f8a9c87b8091b029668b935250a22832b43b8593bb2fc589188cd0c6a952b041031809594e884255b486811ace0a6815da22b25b4f19ac2752488f1ad4c34c1105c7e670314f1844da2442c0745c4481923820d2a209128479c0488384d2db0019340899e308023c0980c9224daea93a80703035304ad653becf0204ae2edec844430a0c1f3430e223c6c668b94dc3668bbc1dd7d511b443204a1e20d3943050e3d3ca3cc236f260db867234deeb9c84e9773479c844216cd85d336baf0173c04ba700a3bc25fc20d8c5b36e74332002088102f1d5e37be747805f9726045e067d078174eed2e02c58e61674533230e1fdba111283caaa61f977a1a1fb7ac11286cdd31f61546a18ded987d63382ab8855471512cca786ccd204a7ce111e4068996083c6978dc9458008dd3117b09414a6d1680d304df84186d75c58180c589aba6316d62640a40a1483bc70a9da33707b466657980b4219d88b2804e1d0f5e18e25830240b1049d63efe085000294255921468702063474d89278df3a650a001e23e514727b214917ab4e0805668e4a51fe49f1a4b206167042c44b459440863200a908b8032ae439a8811a464002747b832b89fc1a8e23a4033789e82720f402dcd491e97bb8f7747e1b8fb1aeda387bbfb5c2dbfc4ac5b14fb421b0aa38cc756ea67d078362e6ee17ead77c3300bbf40a16b8c8a8d62fb75836a593ae07ea487bb1497bb5bb9c74eee2f9115ee2d915275f79fbb6b57cbd2fd17e6ee387787dd7d88aba416f805860d8bf1eb86b1ee8ec23dc9ddbddccb5e49b2b9bb092477d5dd8fdcddc8779e73771cfc02ad805350f08ed1b299ce3dabb97b04aeeadf4237b8855240184029a82c18705894d89494148c29362c8c8a4a8835257605e50e81f08ed93708447b637838b6df2877ec6583c0a8961dc6301bb6e1a86d74c9a2d44ca74e1ee4ee47b6b01d7e3c2c9ac10f16b3600f0f9dbeddc59fb1f53bec85c5a34b06bf0b17ee4ee59e8fee9ec2d52cc6bd4583a3dc3394bb2bb99ad51c7e81c137ddc7226be4c1de1707d8b7ecb7ee83b9703263dfb3f6a8a515178ff05600ec85bb586483eefeee5ae8ee4baee6875f606c1443dd3dfbe9affbbefb5bf685bb7d8ff17ee3761b77d1cc38fc78c8bef18fb5c338668daf2bf66c17cf20b8bb0a57ddccdd79aeba07ee7ec255bf40b88b4356ece11da385fd8bb9dfbac3987db4d7356e23fc02b596bbaf70d59ddcbde7aadf70f733b728f66e23eea3c5c3206bc606e11718dc46beced8372af8c25151682ffb860d8bee6eba7be9a5bbefdc5dc747178dedf1baef8b03d56248e769d2d25627510ed638c94e4ab5b5fc4ea8a42496feaeec5b5b535b2b7f638ad4d0453c4d033a131a98b0e24dc4374d64d94a492cde7b976ee7d33abddbe99df6ddf963ca81fe5986fe4640d37ffe464023bfc65a7e992b3fa7f5ce877bcd0382fbd2a7e6a340f719c7a593a4a5f99cd4e8223fe7535bcb5de43ba9d1557ee6f97297d666fa4b7befe2f9d478bff65db94f7d6abaacfba5916a4c28a880fcdc2f8d545bfbaedd6b1e04eace474105e4f37e6964e625400a215f3f97f6ade5aedce37c6bb90bf73a9f9a931a5db95fcb5dbad769dfeecbddee47814e2d0de25dbb1f054f41eeb54ff5391953a4c67a7eee32d1815ac4dfd6f35736029afe11d080e8cf3ca604c8efd2651e903309a9cf2cba94c44282a402fde45790bffcdc23515bfb2e53c8f9e65780fbf487c4c977993f2415e07e6bdff5abe0fcf487fe2a38f39b5fc1995b9d892ae4eb340fc7ef47ea35099979e8bc08e9c5546d8912fdbacc2ae83ce7ec2bcb2b5a9665793e8a2bd1f792fc34fd329344329364898498ff446244c7e4235953324582a6bf98dc9189e82359713fd3e422531f31c97afe90ace57b7e27a3731f317d1deedd8b7ce3f2cf9f11fd67e92bb2b496fdb4afc8d28ebca6e48afbfd8a2059f59f9f9ff4955ffe8aa8abfe1974e553597eb96adca7e4532e7d44075614fd277de5b4ea166b5caef9cb37af25d349744299d2374974d566ce2614372c74dcb0c071c3b2c60d8b19336e5ad45677cb52c50d8b1f3f6e5ad61c90a44de74d69fa5947926af415ba264dbdb2b933d7f3fc8ca29fc2c972565773fe93fcd334bd722ee735a728699a42c847c1ace8a7e8a7e49be69f3da45eef9b5698e0e5c86956b4d4f9d4c610cdd765e69f793d3acf4f9d87fbd3fc11d1cf2b17b95b6a92dada2104ac78446dd5657449ba139ab7dbe152143b3751fd381e8f9c65251f459fe7953e9a77a8d7f9337f25995d9b4669784b58491428ebb2d49e43e761aabb5591b356495b1dd1ea55faacfea50f9deb9e9b95406e56faacee66458e9b15376e56d604cff36825df80d5ddaa242acbd2a7a5eacf5c3a042a50f0acde66752eabbf8966253f3f15312bf9c424ab6b192999481c4ca48f475eb393290f81fcfe280f81f3474cb2ea9524bf3411458d4b04ccf77ffaf23c511e0219016292f3493b79267f2549fe493eadeeae9fe4915fbfe981ce7de7933e8de298c8a7b48c8780d6a0caaadfd4404d6ba7f24b629a350f6e53aa1cb969e2747a97b546755ac7250e977ec9c4439375d03f49f451f4d41a45f599facacc8f975089658afbf24dd73abf7c475f77e27ea07fa2e79bf94b924da0957c12cf7abed966f5d5fc0080590358dd6d2dccaa058c962a6b9c57f2cd279eb89c515dee3e2e57dca3e7e71ee7f473a8d49773e42789495e23e5ca43c0fcd3cc65f9c9673299ccd3873381817abe1b194bb2fa5af2bcc8cfcf94bed37a7efe31a53f1e4e4e38dd93be327fe7679d7f26d3f9d9694dcf143d3f1f3d69270f41a71fcd7abe1431abafce257d1d69fa98704fe2e272fddd9399f747ab9172453f2ed79224c9cf9124f147cc39de22799043ed7e4c3c9c9e8987d39ae6b291cc949a8ffbf3cdf471e4e94e4e4fbb6ce6a02b99b2ee48f7c45412dda2e0d1bcf2c7e389971f45cbd0ff9489875319d1848be4d5fc95e5d7faf78423936bbaa727ad37bf6bfd2b77a68928aa7fce9fcdfce3e1b4963fa7b55ce32787723ffa5f977d4ce9eb40c935ebf0df99fbfc2393f8cf485e4f9dfebcd0b2b38ccc89748f43cf93a799783f1e4e698e74f74c3c9c3f0ff724ef47f9e82f933f1ee73bee5326dccf49c7d36f97750e18b45973afcb81f4632277bfd331ed988c94ab7f91a3d57ffe69918c80ee67c47f59f3c85f8efce7bb3b69a7f3f76496aa96c10d0aa989389d4b2364f2973cd7d26074a55956e64cea2465ce210c5ac93d2bf9e5930bbaac26f9ba32f4bdd41576d447ac6045754744f3e35cea9efc691f51f76ef2bc74bacc2b72b4c2ee5044ddfb0ff2877edd1bc9ab4e5f97354f87cef3f9e88f48beff88e4e378e4a3bfb2b24c7b5a8a904688e9f6844caabaff987838ad4f6bbaaa407a53c99feefc5c8f24ab8bd5fc959d8f9e3fcc4fd15de9c4c37cfd33927938cad7bfb2f379f0bcd05f2ecbbf34ce2b1fb7275d8ae415cb9b4c405189e6d3aa3ff3307f6496215008e607656ed17a2448519ad44d0b1259b08625978504c8d04afe1294b52a2b49fe1399850468e7d4e46e4eb8ac2756777362673d57777322e7cd89efe4bac889080988923cddd40cb9a92d718201cfcdc9069a6be990091d7e168599d285ed8815ba2e70632150126c690075994a082a09a13fec96b878d8c921b99668e8c92157fc527986679a5f706378b9d5dd9a6cb01aadeed6044a2e11a99e4ea45410eaa1396d5f9a9c402600519a3c4922cf10164401b3854b9b1b7275b7266ba45b93353200f0542137448ce8e00a9b1b2521f441224907809afc90c20d5b0a2d6107c90e1d243b59483ca42ad20e2a516a8b944a499210120f2a3125ddd494906e4c9648992c91aed93c01498f1b13356e4cf6b4715382a6873c369447bcf55924c8083b39b7257d7a4d295c00420f246ce0050d042c18f185ca920b4e188474e70d8915c5ea6e4bd4b82d31d303f99ad45aa3013a29973a9b658ea17599d4016492d4bad4658ea17556a1731997d352e79cb5320b9d43c95ca665ce19ebf3d28b748b34c0cc64c6e57229e3705aba214c01e401caacf5a9d19dd51352ba1d39ebac73ce508eba994390240f7aa008ff073ef003e7015f9f400db07c4a58c0873d2ec467c7837c90c30ec2be71053e40c381023ef747021f10070161adb87a7c1000a11dec0aa9181f2c45c5608dd8b07ce03561f972f9ca87ace80aecad83ab5fe440304401408181d14f7b44709f5eea85015d9e040900f63b015e09c9bb9888c0c1cc29fe251377f2dd64b16bf55b0fc7c3b1a1d06d03703580adb1615894f1d8ba58003b779fe048047e81db8c0dc29b081095851af805b2312bfce21d914c240c69250669658ff3c567b49012558434d3dca105d851527e30552aedbeb09d17a4953d7028722b9698a4e11e28212003d0c5e72ecd91669d3952c652ce6493969a494b22a20487457270c44e4f9af99666ee54ec90b68b7f30a4e1968c342ac38c32abac9dd0a5c0b2a4849276e43bf29150bda874a9f7b6c43420cd42b7c823722bfd924622301575e64e3169a4ee54513ee9a6c85ceecaa75c0ed300f48153c5993b89bba45d126e0987027d8054b4e45441925962ae492380581aff8b0016a5d6eee8ec959984226d9440764aa7461b4099501fe609a37cea48b3dc9124a949944c495c6e4549a20ba0484740723df44433899656655499d3142493129c00265b9a911825bdb3644a6f2c29f52cf97dbdbf2d12a20e9d1ce0d8b0e63816644a0638ba6accc0725b414544b5508f527408043f7cbcb991a3830052a4b260e1da400f0f6fdc6260c18411a280055c39c652e0b7901183f0cc9153830a492a908008040efcf0a12387000128a140e34212134aa880822f162bdc5600233d798a18d3de1629910491214a287a3cb8b5c910030b2b9c20254a00be2478a0811f3ebcdeb869c3e1852c3beed879e356430c3088f0e5491326460ce2614e0c30a041412d6d0bbd70f4788380e8a3c7861a5c3853868429186ce19704448634e0854386968b1eef8d1b1b38d832456d0b2538c02b070e190e449f376e6e6873e14c991348d0208a5a040778cd90a1856535e502a957fa1b107df2dc60435b0d2e9c3981040da644c1408dcf5704446a44011321eac1e3c8a88715194079e24003522060f004edc818dc1bb9482b3211e943295b194693a047c8547a8a94ca401d146900f92804d02b3213aa824c91974aa58c026702098954cba39d91ca53b14ba15b91ebe1d0f444f5799a2699fd54cb11c0260dc5a1b8d228bd4271248b9d10253e7ea9d3994bb3cadd512e77e7577946f2c85e4987c90669a7914671e5138f45560969390676c2f2c94889b662321728f3b93543da8c1e377a4c74992b7bb850222d88252fe028c9a6564f002e25ba54414299651f0dd3803969e7290010b513475d4d481d4a2c484b816b6097b44b02408e1366299c4b226d2bc6e900d340457124cf2c2b030045495a1a9d2cf25195122140c0bdd8412d3584c548eb4cae1e1aa3e4b187905962c274cae5c8157012295fa03196b4f0818e2561a4a050a5d478c11e17a849d31dc5b630e1511d6506569032d014574a72688c33971a91585e3a4816b91c49a4e5502f5e907407138e1c39dc8e5d10e1560b694ae5d355eed432c13b733a1c3f094448cba53b02087b926692aa99cf04ce9c29e37c41a34b77c4b548779c393405ef06aea9f481534a5a51800a142f520378285080925c0a44ab7855585e40d05d89aa30b5c82bdcae6cf15c280ecd9551268f328b2b9b4ca4cf4421854b83640c1c3296d21c0a1c96121b3e7456a953d954369d61d25e1895374c03cc00704de58aa32992c59234605426c548a8923427f849400506b735a1043869c89810e6cb05492838029789ed2098044420708081058200e971c00eadac2aa7020818e0cbb61ade040512a2060d027e2a52a05d706833820809e0a8a1c5e2c44e77aa4173660c9811be78f9a00b070b38b588026ed9404890b74448844120a88818bedc9e065286623464e450305332c0c2d5a1430218ad18574a49ba5c8aae60626105225bf8c3c7015e397068594db940ea19f1ca0ea204c002a43d305e30a18430491a6000eb6a29a9cc010e210668ccb8c2a1e7094ecea000c2152a4f26f0a0830ea4fcf04143468b5d46441ed286ca415f84f6530aa17d30f7643b9a07bd036ece4e8ece41bfd168f409a409baac24e6a62c40cac25cc14ba195f4899cd4336122e95e564b23ad33731a97a61a454d5d6632e7d3dd73ae425df262181bb7c3d72c6a0bdde0b03d7ade29c951fa020f5f553aaa4a46554987aab4e5602fe6be8b77fadfc221dc0e1f1e7e3c7c19682ffbb264c167871fa385293129e954255445b10418d88fb5c34d76f62e7ec6d63bcdd8fa7638b6c32200028143c8c6ce184e6ee65051b4ef8e63d62cea8d612f49edd900574fac279eda610c6fe17fecb60f6f57f82e9c76f03dbaf0092335c9900bdb1db30f27d111b65b4d1221a9ca93c563ed2ebe98fb3b382cc2ffba622f1bc338a0bb33390e86bb33bdf1868bac98bb0be06e1e5116a504c5987a1affbec7e08b1831b26260c5b88a012386558caa185431a66248c588919595859575950523cb2aab2a8b2a6b2a4b2a2b0656161616d615160c2c2bac2a2c2aac292c29ac185759575857575730aeacaeaaaea8aea6aea4ae62c0c8828105e30a060c185630aa6050c198822105238655961596d595150c2b2bab2a2b2aab292b29ab185559555855575530aaacaaaaaaa8aaa6aaa4aa6250655161515d51c1a0b2a2aaa2a2a29aa292a28a319535853575350563ca6aaa6a8a6a6a6a4a6a2a8654961496d495140c292ba92a292aa9292929a92352ee4324426e3cb651b1512c82dc53cec98982a720f7949be0ffe927f8ff7f7777e1de82002432afa516bbbf968aa400920c15c9007faddc6bc562bbf89f038bc9c686ef7f2cb68b609b2c18b3c619be1933dcbd00772f0908a4f6dac4c7b07f78f8ed2e6ac1c2f6e886bd98fbf1d17d776ff29cd6c7ec0b775970d8b2663de16e5d1f60dfbac3d8ecc710ad5e9617c3d8f868547b2cfcb5843becd184ec7e8b2c02affbbe38cedcf775bbc4b63018c6c6c8c2ba826155453525a5fa710702d537aabaa6e8c224c1dd995c55b9a8aa032f6c8faed8433d58045755ff443504ecf758cbbebfc9e26f87bf87c58fe1a3f1b5e276f875642864dfaf3786bf8cee2ba69378bb8b4758a394583bf4c1fa30000a280584c1ade0f865cd5e6821d522ec697c045243c48e6168dc7d00578f90789b03dcb520fd43515fe92a191bdce066211fdcb35c49f3a32e2ecf4ebab8b750dd493fee2ecc394fee21e371428bcd8cfb0b1e02c58e613e3163b832cf7d37001e2decb7706864287c37fed8ccb8e398cd39135c4c5dfdd6d64f39fdd6bf0125b0852181027707baca03728487ef588ff208d09518da337aceeadc200b7590e28e06657e6022618bb423a74a89032e50ccac56649a28635ca224b8f126e5890c21065f1f2e524c0f504de493b41b3c2400c0086f9aac20cdc4387d9d301948b84822171042dd82e8032e3b0e76a48c2dea1720fe4c9972914bf2e108204815a101b5a744e4f9842d8aa015b8b8a840420372c1488f1e237cb9a106d270106d4152e7cb0837b6fae815c0d4c92108911f52b882476fe1d345053c580490d292a39564410101a1097c41f4b4d1626ddecd9638448e84a046f7584b4448e988dfca078d9e62014f0c4184fc81c14d198d2289b60d5e2f593c202226270a61cb0c5677624021e04bf6214f0e0f5ed0d2e5eb072ed9cdca8b32440e61e99242952c660d8c2035acb912c10c28590327439c6830644b0d33a8e5b33242fa7c80d6c3d219924ce408dc9109ca5050d624ce5d2018bd68d940d0d901c5dcc24e2e42a8c20c83218499a70102c3271198847080881fa12602164b741561b18110a7c3c42d8da2826ddf717f814c9e9d0565cd1830371c042282204cc95183a8c596af79f0a345014a1bfc7058b9718e0e595fd8fea4913d7910291550b99960082266ee5969b0b899c006f4440aee0128a911e388a12a38357772cc1140358809dbbdf9f1232704f5cd0d17ae446f29e4c08292037c52ec2724deb44041d306e702596b13e8ad023440a4420d7a2a00f5790b2ab240852398f80d4678debcc234356919c21ac491f306ec434455f3c20019679bb7242d35f8b4c199208918358b96c0810c010beca9a915d02cd273413ac8500c4727caca2c52d3c20d332a52c06c79236611098648f87ab3165350e5cb222922e879c10333409891c26551ac6789b326331715bc50651104577c348132e54c010b405954c306346f6056324805515b448005615f6611c9014f902ccaa9a0c2183061ded2ccc48a0411e263884a1e1a8c28a0a8688e17363107785f7692102a3a73474cb18982b010d48828ea42a5cc03372e1060c315218a9ad4d0c38d162ae2e070a687a232b53572f4e8d05643c60d454050c81a43f402060a51b614c110141bfe1df66e6c76643ffcba621180810df97d7cb77db1e1b360ed701783bfc3a0d08a71bb8f4536dcbac1d70dc66c70d81e8d4637f83b8c8107bac1b3ddbe11e0b8f1c38696168cb6cbbeda33b72dfb2a16f79996969696193c2402b02d74835a6043e2e17b562c0e9f8a6c3b3684592877ecf8f036321c63bf755df8e1f581c23d2c9a99b1bfc3de8dff3759fcc25d3c0a3759107e16668370dc0ed9e03683f70b9fedb6651778e0034140811dc5df64f158eb1659b430d86cef3261710fc5de63f023002b73dd1df0116e37dcba36c08618dd57ec37590c0f1fea85dbc8bbe130f718dc47f6a315e1d78de11d6c597893c5ff040b5ff7acf57aa070c7663b18641f8e5b56d8ee20bc85ff31bc63b6c7e72e1eabc22ddc3b78643ffc39e7437bb791fdedf0c78662ad6b031ec2bbdd3a5e3d204e9b036a70f7b83dba36e278681cf6d82d0bb75ec2bd1e80c4dd1d28e6bef1d8ee077bdd4d26e475df17c786835ff186d5034c607008b7c3373eb2ffdd661fb7ecf0658d3c6ba358646d00c1c0be7d8f4158d81e7f0f61d8353b136e381e3e1d71c37e93c565af7bf62e5c64cf5eb883af2bd6ee8fddf6e9dd46f699bbe3813b388c83ec6bf6ed50ccfdae210230ae7ec6770d794cfd8b2f8371b55fd718b768ddb3df67f0f0f7bbc9de78846136668dc318de63edb0ec658d64c17687fd51b8df968d5fd7cc080fc9843cd04a82aba98fd937331e891f1fd9676e91f8f0b00cc6d5861f1e8ab945d6383cc21a7fbfdf46b6ddc176933dd4178f6263edb065b7b11db271ecf5c087d933e1868f6fc61a81c5221bc3c1771b7187643bc803230013e28580578faf1b0aac3bbe70d85060811f417028a0a50536e463d8357ecc22f0403002a4a4a6c0cccc58e3c3c30793024e813d106c1785c3afd67d8fc2dfc6a31b3fd8360ee32fb1fd82fdeb9ab9af6b1587a0d7da646efc5eeb025be8da1082236eb7111c6cccded8c1d6f5e18ab55ec155f81507d9766f21fb8e991dbf767c64bf84ed86bf5ce131de30e9c5460bf77763623b848deccb9afd6355554d0d6134f8c618f546d60d2777e0bbf10b3700864576180fdbe18fb5c31df6f0f0a15ad785ffa97587f0bb8d08773b14dbc277db8759b24d26e4813bdec2ff3fdb3e3e840c3c18c466088c8d35be5bf6777c3433ba363850bb92dc15f9516d00e0dd6363c3b0960d3ebc876fdcee6763f60619ccbe425ecc7d222f919688189130224488fc883ca5be2af71478eaba9cc02ff0ddf0d414500a3805d5ba30f16b0bdf1da5a5d5ba717c2c8ec5af6b667684a1b6917dc5b4b4b67118b7c7775de3eeefd8d0f86efb4db8f0e142c205365563cf56510619192cdc9d0c6677d0d80a6e06c45cf70512444b6b0fdff8cb0c66635638061b63f62b6e37bce38baaea68c435fb3ac21a7dc4f8726f872c998de1171bb337c85aaf1bad978f1d5846b4b4d898bd21dc313c84df0dc419e021f4f26d7483ecd6f521c4156bbd8a45d7c67edde0973b1bb33784ecde216437998fb2a05bec2a7b59e3bb63f68caaead89eb9c22fe186e11d745f331a5be8da6060ab75875f67bb3533be3be2e38f221bb72e0086af4b46632fb08d5fc2973d333b0abde2760fcd86c1fdd2c83a6e0537035a5ac16d444b4b18c35f66301bb3c2ab3164b17078266cd92ee18617a021dc6666c33786b58c307bb6e582c084ed363363c19e2c1e9efdbb87c597dd2fdcf1bbe176f8edde610fb7702dee1ee62a8cb5761bc736fc25dcc26331d80edb63bbe1fd9afd0e7b33e34bf6c2fdb2c5e016c643e3b0b869b810ee31e1f00d5b9db6829b0138f805c3fb1d6b875ffbb88f45be846430bb434b4bc86eb2af6011e35711a370036008bf3476cc0acd1628eeb665c96c9819df1dff24f4625f16c8d6583b74c7e2a3fb65667cc9becc8c5f66c6e357918ddd98aaeaf835061bddfd860d14aa48805fa0b0383c864d01a7a6805450ae583b84da453608b763431866c96216880440e18ef303c0b2201be6b66cf063962c0eb270cbbef1b7dbcc7dd78767ae78c3c37fb7f07583472d5ca52a13bbeefb7b8c7ddd18d6511d31a3bae1ee2d5a78bbc217b29b05e2ee504657a76a8802c61b1ec6c323fbb96ad098b1d5814fe0fe4ae171a11bfcda42b71dbeb10552453b7ea202b91612778fe1ee3ee58cbb4be06a5410f7769705d9b0af3d7c63235414bc8d0ce3a171f89a45851d61e1765b77e7057115a8e6ee0ab80ae4c1dd7d30906ff73e8b77d86f98dd6fb01d3e5ab1c80687ad1bbbad6b7c7798f1d87e59d02d86fd4345c151516542182a76856c59d1358b825db3fd4695bdeed996020a78a99fe1fb78c36262260da8020af819345ed86e06dccb19ca325cee65142f0f60e15e7a953bbc94a14265bd2e1ca542ad70af2c80d770f7434f5db4d29314033ccc5804f67e857405d9311b07196b87632c0c6f0462970c36635bf86bc76c0c7fa1b1c5fd6a6919770ca3c15fed90250bb22f6bf615ef629135fb828fc5a3f118b431d60edb216bdc0aece33e2640168c59337878038d2d6e058808c1049e393540f803840d60ea6c0d3971264955c8f5547833e55d00806e09adb0a2c90f6608386ad2438b2f031e95150eca94813a62e9ca929b3924dca840072117ccc8736a3834b8fa828ba3b5ecb72c591cb7fbdd626243e1b3bf8db064efc60f0bf76e9f2c38243bfba777e3762864dda270c7c1e31bc3ad1b7cb462eb3e3c04b22fe692c1c7470b7be1fe1df6b1db7ecb06ddfd85ab2fc8dc5fcba39256f876d5051ef75d0c0b1bb668c25de465c431fb6ccc0a1f4663cf8aec0b373c248b5fd8b24f06b364cf82ed639165404b4bb8dbb31f5b38d60ec9826cf0f7cbfe6ec01dca0370d655273ac732d72d665101a5a0c284507bf8c63ef70196dcdd4975da42db655f4536e88ae0ee22e86a0b336e059c024e41155bf71d1a69b794bb7ec0ddbf5c6db12366c78646d8bcd9b3dd9a2550907b7a9a4163c6bb38221c3ac562bb879602ef8f586cf7f8ffcf4df04784c3af3d26dc5f6541f68d7bac3899ce5d0f336888eda28967c6d6c7edd10dbe01dfeee2d797b0e892834a41a50968540c0b7fc68ce00b871930c3d501e4b8fb16baedbfd616bac1dfc530962cc8eeb73dbe70bf3b6ef76b15d9f6dd713b4cc184a987122b6ef867ccf8986c6cb8c9807b4cb835960196da078478d95881ac367eeb8f088760aefed6e01788f6c6ed8e72cfe18e6e7177085cfd31b9196b8cdafb8dc3a2e0d61d06a3b0d829aa2b2cac18625656556155565855c2abab30aa60160c18fb2a4b2a48c556614d09859b8d0ac6f0f18df24169608e1a512fbd9c911ded9285662fa37e944d14d928a75425969355ca00509da66649e6ec4a1ae8da7302658deca80cd38fceec3967d3b4d23aed396752efc819cd3a67f20480ce3aa31a8502399f19759d7940529fa753ee73a97599412e73d6b95c48679c9bb9d4e4ce99a873d6e9029a49677d963a03d2399f3a2790957226754a8349a2461945ce2752327390753e75ce9afccabacce1acf42ed348b3d944cec8a8d6e51499d33abb38baca139453ba1c2410eda5eb1072493a95a6cea49b56329fac7af65c669d8bc8a97e91b336b52673aeca5139cd3badb53e6de4165a973a4b91405d8ab480cc4352a1b16453a7c86526b36b20fa73b9743d3cfdc13206a4fb68c8ced5a6c97ce612cdbc4c66d13ad522731699b52e5fef704ed9cc19952aa70490ca3a77a61acd592b6b7d873c334e97a491fcd3c79c49a88cd3e99ca25973e90074009a05e9a4e7a37c6a9d79a54a963a85d63a9fb914cbb8a6ac337536b3111693f64275389dc3d21daa730239cd99d4b9cc3b320b1d43afd03a8d6a33935967add368994993cc192b93d929e3f22ee72c2307a073249ad332eb9cb5723e51049663a8244c34c78116548a21694640000800009315000030180e094583b134c9412460dd031400087ec042663a1248456220074110c43008c30006004200018618608c61ca58e8053b2b72a278be0908d6f13042a41657cb910d90152e32fd4b502fd1362e637788284c1b49c0fb94c1a7a975c09539fa24569c8335644e8272826eb9f18922265e5020b5b8ee60fa1cb024e4400dabfcf0a0c4cb27f9de424b02c45502696db00a651cdc387a56813400b306e231954b96befd102e64cb589abed1bd95cddb2129b0f189e32dec3b82d4e3be43ed59bd31e19155f13d5f17db4ee56a42e49c22efb35ed4c3829cdaeeb7c62a909472275e57e3c08545dc96cba3beb95398fd15a01816100624ebd44c9e3597d143da38a5bdcd85cd06e1b6e35d61f15a4a03e5d66e0edf29bd788170e963880f848380007e89f1fb9c4acfa6833f08685873631798198ef19b2484e74155952651d1de518fe5d4760c8bad1f5e6d5bfada09cd3900ad49c3fd709a575ffebcc7dedda34daaba1d8b8acc55bd5f33b8d9625fe08b74384ed894a26cc34abf289dc144cf2c470aae02e0ca811adce7f13d684c2c943f22457e645d2afb8ed9af3a8a7da45b95782381462e60c8a0f6b5e7a4d4567733d633f5ce4b8e49958234c67d1554695f296b1a9148dbe730c150924080c5e6cc0d2c82d9660019d58aa110cf44d8dfaa9ab9ec18c7efa81f78bb8417474013785e66cc948cfb0558432c5ee793ca6ad2d12cf6400d15dbd3f9ed2bf254f6da5487ab413db9fb7f3b10d3c2840d182e26821ba4c68a1d646e55ce23ccd0331067cf387a8746442241bc36e118d22e0aa90fbba9b0e753699a189160233b2d4eb372a7b5926826ea4f0710d9b616935d2942154de82831f5ed30621863be974ac040db82279645871ffa826965b7db36f431ece64f7c018845ca7c7bc2dc45583c9ba167ef96fc35da9d3fa0d62d2ad3b2d3fae5c6a9d6b5a901092501525a33bdc5c1fe8b0fe7d7d7c6c18ba4303d4d9abe9e11a675ec4dc57f7de136157895c5b83c67adf55ab1777b1ada6d65b5dd929e8507ee413e4ccbe20e8145fc6808cd89b3f7cc8383de7fd4c3e637c79bf99990bf33d135b45f7443e64ee8b9f17fd28f9a2872a319885b414d397584bf18d28e6136fe9cf521b9b957f44c773122bad0b94be9489b984a623b2c25dad9ed18f90b1faa1080e0d872bd5f32b841ab6675e09ed135e360fe3da738f453d86089ec043dfc230be6c409ccc3baf93be610a45dfe4cc5efe0b70d61f638bfa822c00c8826ea301d63f8c02b7c8cc93c1a1a8727910109f145f277fdfefe78c7c751ae8ab4d38aefd6a7718f1792b8271c6d4d1bc7f132592cde5771d63362deb6dd8debbe94afdb479665680e220fadbdeed6c32672c544c0af82ec1655f45a3f51f7e1ae169e12d48338b3e02e3086d7f8c8c07511c5973be9fa630268a63a56d07a4c6076d7c810aa836dda67ed6532ddaf573d72079dddc9cf0a2d57e94dd63b8bbb9d778bb5a682fd24f18833c872fae4f127277405d13d13e3650e4530ac196722ae3edb011bf623e05a6bfbfb94f69e9a8276844c02b28f93851658ff163a49216c2e0a58abe10762d14bd591cc774b160e47cb6104a74617e98dde1877f43c5012265975104bff9075d1ed69b6186d197b81f58c400e2e140f5e9f958f07a138468ba8d542f8c51fd690ea33c8d08f890e1afa33947a1907395f2158c405800ff842d9f03c95ddecc14f48ef23f802d7b620a513efede4ef290d3160785445ca698a499ea2815ff0a5c4659f100419d5fd247c303ec5a93ba43447025edef6af4e0c1dcfe7f755da2699a5186339962c6a74bc707f47fc74ca10fcb2e6914f10b7fe3dba03819988a94ca6ae22b982ab7fd0cdfe08029503e2c983898b02ef046b3d6ec4e59ff9f9ea7e4efa9265b5f97b999bd005eea1b51b83496bf310647e57b33d6ea0772e41b5f96e6644534e987d5f780c2a4a2b38123e090d43f7c6fee066ea2930aca16f3719c6614a4c9dfe332277e82583a2304661b2850dfc9363ce9c70abc8af227fc7adcbfd3f85b0b739491356e3b941228a4cd582e7eef3775065d7e89e8a6f3ccada4746122a3280f3a50d9152cf7b2e471eb485490a557ac2975cbf78943c5391b3fff59251b5b54133d4d2f0b586ae9de2039b51923b597d4f58616dc13cb47c6b277f041e160e435d21d2bda923c0933dbaa217d3d92ca6a4ce7235aac1f4ce087fe3c98418857860e7068fafd44d304c27df38b5bafc5ef19b251d6a3944711831d7f35e4d7d70bbd7c1be11918eef7392ab7ab3cc135e8c598ac38020eed88ae899ca97232d9355c83f7f348e63642cd0833c952792fc2c999b70119abff3f82c63db0bd0eb655390ab24c939b077398a764c4e050aa0a8e3e7ff4ec3ba029088324d49ffdfcfbeed1df293b69b0a8778d8e0ee58a23933c6eb974fd8dd9a6379df1ca74cb42faba598f1087820a1624ac238a32c6a7cc5378d5785c81a9b43629a38526a529b454adfb030c90c0bf7ac73273d8513fe91685bde67e67a50c47384f92d24b8da7acfdd82d811f727ce010ca68708b92704cdeb81ddd488b201c4056b1fd21fddddfe4d8bed1877966175f53700ceaae87b5c72ef1b8faa668c2ad53bddc4f1a7db83f3ef966ae5dbe8dc78e0ebf2c48d30f611779bdfe8dfc4faf8734871ecab22c4f040ea24bf21bc3a92490c07abae223efe878cb6a74d503a6b35bcb716c77ecc3a4287ea9b17ef4b8eb9e3c18f673e90aaa062d264aeeffb745be018de5070bd5e7d729ed47bb76222ee4e08095eef875576bf56eefd84cfff0d6efe4ad7737f7580eb7d18f3fd0eebfe912aba97b452af4696568321f5143074a1edd8779ae32fd4fc296be19347ce9e36754cc0fcf113e03605b64bd63da5f8c17632683ff366cf1d4930fcc749d4bf2bcf449f0d3c11ae44dfd63a41c06a991b9f76ebe9427a67dc680acd09a655401f120503b3eb1ec19856a63cb197278c90b7aaf13d35dcc891b60f18cd0680c0c89ac9c27c64291385b90372f6b75ce813311ae3cd8e268f9f068fa70478640d178a105056f8cc73b0eff39206e757fb13bd6703f2bbc6768caee32b75db2ba6fd04e688969391c840d125d75aa343d9c3530de08f0025bc05e2b0fab5b98ba6866dffa10af50695e71df35356aeb31a17fba59c3af28993549eeecf313b178594c2925d8891d9320515c32a2d94efa4b1b7a2a931cff3918cbe266e5f323f79fbb50702b9fe570eb50c43f0e753518bd4585b08e8b9e096ff01deeda687c1ceffafb2fe64d0526c9c7ff1425fc1e7b521eacfdbbfaddb3d5be460b6c77c1ff1be090326cc5d8f72be9b8923b740842635b6ec4b7a2657866f996fcc17db8368bd01871e49667c5c27fca960844756838129eab9ddf17207aaa2a80cf6bb739cd0df22c2c626c4177669b05c6f4f25d54442e32b831fb28fc052cdf75daa91f7a70b9c6a83e5c467f5b6cfe63a52982f9ef67c9e4463f375163e8ee8eb7a2fa9f1811b0d1d6797f7b8823c6a2e33ff3596e35235a0d2f3e297e5da3acc624b565bb1d68a75566f756e596bcd5a6bd65bb3c69a35d6acb762ad156bad5b6bdd5aab60354b7a9f39f0c357f531743ae4c6250aca8d6f334be26198a9113b157ab4d0a0871e1db4e8a0451f2dfa68d1418b0e5a74d0a18f0e5d34e8a147072dfae8d02df4ac377dba29d3ddc407960783530dc81f787626ae879913809fbb27c811380e2f778bfc2baf438f655c82bbd3bbc192f88cad8b5e3ff7c49f933aec89f3e90eaa1b224e7cb29af35b463dbca1cb703be41c62c49e030cce87d51f93a8d61b4fc2fc975a79f961ec1fafc91164f647a74f653fc9e851897d76c433644a86aef0eafa2ca1e5e877cb3d1d3c7eed0f28fc8807430caf309e37b531ca7a5ff3a5e7837ff49297f8497cebde506314f5589f08f79df3a467630e015c0ebe07d5f9a1488f430d4f916e654e3db1b1dd9603cf8e8cb4d30d34fb40c8bb8e7ea12e5344e1368ca67c90e04926839321dff78d8366a7ebfaa7e496233226065fa857a9fe6a2d26f8b1a65e073d24d0ebb251f6f3f98b4663b9b03b43fa2ea1725fe72157bd452a7b7a8a7068a5ae62a8e35e374c42f241bf29b4d4fd722159c7bd4188507c382436de595242ee3babae35d99dfafea3c19b48e13301c99a107f061159c696bca036985e79873a67c9bda9bac2f796087b16dc7c1f6cc86b7430f21e6aa57263d5df0c23fcdf71073cd1a51e09b6b0cd137fc66f62abd71104b9a2e6f88b4c684060c38edecf23855690def5b7d59283b7fa26d6418c4969da53402cb657949cd572c0c9ed0bb69a54609a20a7e257e2da809c6e7457b21a176881a666782d572ae23fb97c7337f659602aa7d519525ccca353ba0ae78b7d49a8c2e92c75a9384df0084405222eb1ad3dac6678aa6c965351f046221fa8285fbab7af56c9692e9b6f110d76e173c1c1799fc15062a85992ef19237447b407d7b1bff04f5aa39392be9523ce1fea2b6c3e3fb5e20d25cc4161562f3b15683c970625cc91fff27fbd356e7795ca3df4f69eb98a0488b503a76a9a7f3e4347bdbcb61103332ee9f583693ab0aed08d343f2b97629fb83202efdfc5e1fe9c7e050aa47e08efe8946ba9a5628c40737c9b199134eee65e85b3b4c47df93e9c85ceb81b0e47ee636d030566a4919c041a082505c82b4bc6014eb3be4b2c3b0c0eb31cf8cd813e5b4c3bcc74ff196402740219f39ce4af7c984b9edd46fb2e9ab48bd237caf8562c2d80759e541136f6636885149e4d3358a78c30e2f1050c427931d4744fd42e28358c28460cb8d8c564a8e36ae8ec448227659fc22f699ac5c0a8517c7552722488c8b4dba95c0b4d45ef33bb33f96d2d11f5f55810045f04ca95d4c3bbbc16bfe8202cd7c5bc42315a650b7b5eebbb86fb542ecac6434cf1ad2916d5c94c98f90170a562950645ce60854675816ad5ac16abefb450229d6df08b33cb8ce77cfb81438f8d30aff8ea402a5003baa67aebc7d8b819c00ef6c45dd1d395a74483e47dd5bff6823e337831276cc93da68263bc15afcd653fb00c12af2b2549cf525750b657ad3a656b81fa4c9075a9565f9bdc2021e320de53d8b43dbb8bf02673d4e58a045297f0091f450f37b24a1151d1896b26ee8fc5b64122469ee5dbdf58fdb9ae136a1f08271721526b4b8ab77bc893e014ed5dde76c7b86707b1e0145cf720330957ebe39a3a38e4d038fe3bedc7ad538d19b5f5ed6ca3f33eb3a57a38dc9cec96a8b757e5b4e03c692d9909f8bce62f8787e4430d5c53a504f6cbf9cba7b998bcfa4c858667794d24f616919954d5af221792179ac1b191580b55fe2e07753a6d516ebb0328790d8a89a3a1a562ba0d5e81f70784b73962866903c6351e373048acd57984c231bc322ae8ef8e810c8532e9420c58e8c510d7d3a138c7a06011a289f7e6cedecd20fee33f3f94a9198e93c5326db7aedf6530f5c6c667cbd5657c8c81e9e53ee7b146519b7ba602aba8cd4cd9d88cd68f1703ec446dc4defd4b38680153e7c514e3bd441f9c164b2b7c0e4b9f902b94a7e075e03d7d324f347b9f8e6f5a80d93cf8da498bf262fa8cdf33559406e2d14c779c99d98e64b9ac9e8a51aeeeacb3f2ab6572ee6b0b217f6c27cdd7960c640848b160461e5d48fe2fc1e910c6d6c4e608dde93c96eb8fde210cc1d8891ba56db51d8de2057e3ab151a086f0f58d843b76820748eecef3bbf4b54bb48ce6f62c83d2ace191c2df8a268c0885d680db97739e42a326219e01a372498ee880ee17d507864235e1998523a163caa243ef5823ecbe4c1ec666e6904fbe4457217e81806d81880606774b3f5cc460f9624c219c2faa4a80d92e12a3a5fc6cf9e81152b8a2922cd542ea527f0ab29fbc7e59e0091471079834640ddbc7c71a2b7382a7797a5400ff84676c638c3c33abff049f44ec9840f3e499d944196550d61e66453858ca9bcf34337d3826fa34089c54b047f9c94cc84e8d9ef55e7408ab2651e824d4104ef058ad18f805e81ace9f5a584a81321410aae6dde00f5da59d44aa92a2a1dcbebc6a6a23c9990f5f99f000161a293f7b8d5381e6b9b8fd17690cd631290c6f944684c1b9ceed39ae791b2c675d38f9c49cece569ba0d99b0e01d663b9ad74f88aef05715709fa86ff79b4be49d78d087789df8c492610004319bd2db67ea5e0523b07df530e01d71c11bc2331155fd64f31a82462f9ececd2016135919ff60e59730dbdb683f5b933071214f09eff27eedc3f85925af666745548bbc5f8082112652428b804f2c72e586f12a3326d4ab7afe3b716ecadf002fdf42312b382d520dcd43b49750fb03fa0e527085ff6ff4ef37a8121869bbdb679d39860ecd0c80d898a59de63ea6247323052a4acc3d84268ba38e2a2d00ed968408390126ef0a71e5fb4994db24f363935d955dbf24e46a1746d27996fa0d1e3310ae5392ad5ba113891dc5f686b5518480e407f448564d76be101bb4870bf44e4c742ccaf544fca04d11675de6bdb3bcc00ca6dfc1013204741f6d73b32eef2fbf17e6021233ea9f55ae335c72fc98452fbf63c110f7d2e39d6053705f7ca52ab0db1be6847672dfed0df96ab8a689454d8772693696b637a082526d8289085014b4c77f26f6c9ecacaed7e3be402206f9b257cfc2445aa6039ef7544405b1b13b4b1355b376e55a9aca17c80a1dc2907085296154ffaedabd0c9e0aab8e383236620b8105823e089464f3a80ab295f5d7aa8debcaf393e33497005b9cb247c7934b92bfe880fa5c18ebedda327e896f421127468d1805b11e06502588494cd27de6ce4aec74ab0a2be08e254234e01fe5906f64ab4e9d226e1481914ed4299671fd3babdc640c7df6a38ac8c1438e8d98af25314725058c710959cb938400abe210c77dd92f29ec0707284b337730ec4463cf21384bd14b451c78297b3eabd5562dd32de9c3af317316e57a22c1ba1016ab51739813a68bd6744394d1840212b99633d0b51f107427aaee87e5b0dd1927989b3e27c1d89e38a9dad73396fc3d8156ed239fb263d26eee6c08c39c0563144ec586aafb333cfa39af3322a3f777a7eab7a09462b27727b37e577e9c4b64c523e48819fdd679e064021af07f12bfd2d2474cc4d9a5496733c7874ebc9527e6c679d31ccfd7cb4ad39a248e07ebbcb3a4157e4804a6e7aa420c5aabca72d648c9d28f3aa14610f66d718beec7e1df094681110d9c00456c2243573a613155209e88e80a182b60e779b6a62cc2fec179fc0cae06b69021f243c0abb6eab5a446005cd298c73c2832937f26b7781b658ed24db3b80a3391773db68d26bfd47460c2a2e08b6aa984ccfb3da2253326f60aa2bd2b1c40d2d0fd71256bd41712986191f36d04a5c45691bceaf9d3962cd96897943872197ef4e4601c7e12999b823e0857c60acbf8fdc1fd750a7ed1066019d3c524190f61b48cc45aa8a2333b6276ba31424adcba2461ec36406381c34243bcd1e3e29a19619fe1dc0c489300609019fea991e9b075af0613e1185f15f3f84bd27da70cf8eacb88e4131694441f016d130d23a3b0097a691660c5c88f4201691aca92d479c60d5f3bde51c1c25cb1b56daea24eb38f993eab620f65fc8b62313a8e55ecbcff9897ac1b89bf782500eb11596bb06e66f9c047d49f299cc53e4e68d50c07ebb11b4df9bb457e3f99c3a2304ecaba2dca52aa84b5ce5b28f4ab94e48a62b657264259b627d43fa3e004d2ac5bebeca7288b5e93ff2e61488b89fd3e53941060ab7c66c8d1ba49447dcd40becc4c272887098421078703190697716918bdf264ae7f7acc567f86fd8e0a8c3bb0e6d85e6fcdd8a406331dd92d4847e3a114d3352800bb22117e60013f158bf135b9764253d82287e02ebb3333570cfe07e4ac5f1361550687d5ec2e286ec71687371346ec7cba19334be0473c48e12c32ea7cabe0a562336c48492ceeec7fea2ccb536c73f520df417f01f171d5df92c553741016725070e31669e14913151a2b3ce00729add4dae66e23469454ebce7cd3abf72b927ba6b4f7e1edf1c1b50ec85e91703602f4920e6ce7a1cde155707b525b890e428adc54cb39e86ce126e05710e021a93e3ec4bbdad39a1e6ebeda07c25c32d4cb1461c29f282a4c29ce2f5e6c2a749523cd2c279c9821dd1d7c1c5113eb11ac6c0315a9936066caef03ccd3f9b210344c681fd312ed61424863f468fd3c3520371943424333f14bc5624d8b5a460f99f59034d9c0ba60fa58321ebba6910a629088e576e5d9eb2fb75aa288caa821cd4983cf19a745b2f0de3f34e7195800291b472363e4193399edf061c26b989835dc7e0796fd039d61f26473228835d6547ea71e67bb59cb457a52314743e36d2deee0729adb31389ed25bcea0746c3b24aff04834b9d94fea99048a0af3cf563ad5ba13e88b7cf3bd04399e2d15c041973db438fe45b5c9fa1704dabd90c30f2de6adce0696934631948968c28168e9531b4ed4e1811e4c1d6265a386794a28fdf77dac504bf2ed0d1e019245887b135b499b9b4b1631d903ab7a079c97f1d6ab90b8f87812d8c8603b6d2642e3a9960c0cc19f3a70763ba05960bbded70da6601464117748884918958025137f6c32d9a8600dabc27a1716f0ec0ac3d2f138040ac7711ef9a475670924485d46a55db620b85822c28b114931c136a65adadafb90fe2c4cb9d788246311827b7ed113704d01d9bb038dcc1926e83ce47adf4046201ed5907a70a139ab17d0dd600d5816682e3a65eaea7862ac88815d03180bedb206e724d7937f8b7e0224ecf7945d15684774070f8121badf2d00c193b2ca7430a0e722ecfcd58a4c8538117a4ac146e5bc660fc3bd092b1c52b7ae364e8b96833ac908423c24661241fe28b71b294795db3a4464c31d94b4478da2953e208de62745e6ff68377151a3cf5f8ff384c871bb4d4d6f5fccbca456a6d917ade66b03f52b556b134e4ded10eda228be76642610aa7e21de42a707b48c387750c26aec31796c11307c561f06f45419b81dae549bfe794dafea2d71b9722813563ebe1ffba5065a27fa9c487226670aea399eb174042580436395f933e35e6e4e68c6025555f1c562ad0be4649f1d9cec88f7189dcc2e1d5fe4904f37b5069c89b5dac51853b848005e831938ce7720a3ae3ba6b018c996667a3e63abd2a3d32c08588587b4406d785f77d3f369c1f2ed63926b518fdec30324d8921fe099db826804db383a3e92126753a911076031c4bdfc153d86d5b692712a05a55555e7bcb2b11666a68cdb7f694fcfda3a84028b8929e3d030dc0ee4b736a19b95a652b7ea55501e934d50fa0870d3e1b119c2140328722c2a11134e5460c2e4ec76a3fea8301ad4c2c29d7cc703a4de04a607675d3b4eb11cc08ba4ba132c9f2582e55a7b75a7bad1527926c33c950c6f27986e251ca65a4d960e074848dbc27f5889f7305e58c4c782a2f63ca7d1caf8a90c1d2e2d0030f5a68f204088a70501890d58604670f6c0ab2e28edec03c6573139a2a05554adf597a704aa1f4c1c0a571eff9eaae3022553766a405bc229c61df240ddc9510c733229a55bd616b2cac85f5a9171ecbae620c9c8e9be467c4992def7141c6c0b06f87d740df6cd266a7e146dff5f574c29afd519e16a415370e7e5963b37399f4c40a4aad1b7f3cd8fa721f0d5a46c9ac72938bb4547d227a0c674c7968c3281a2e6e097052048ddc71f211a96e650cac7868e5ffc7ba85c9ae3b66df66247775e91d860eecdae0fdc2effaeec0ea6cc29090943bd29c8f422bdd0a5cbe9981059842cec8353fd521cd83ddade7e5a35df2a522bc43f98bc10285247da06733202c79d0d05a585f667ca562fe73219736e7e73c3c211a9cee1829fa8a7bac1b43db10d3de523de3007198391a5c336280788c1cee5a545be9741b7efbe077a13f6b798ddc6bd4039856d10ad0359d8258e55d0cbf348c2e0e538d3a11e4bc75f83c9ca88d596bdfe7db864227d1683dee58d10469638481106cdc10df344ac85aa86b7ccb72e9aa82799bac80016203b41942bbb8d8359746163d66291a87194f39a2c9acb4a79350e4f2d8ad65ad638d0bf3487a21297e3fc7e165687b48794375d6f963061771090e97b5b2547b70df8eafa2dab4ea5b760248d45b392d00ae9a3d03a8b6b0a72c65f2a196ea823469db3f88ccb0ee8df28631cd324aef56b6c81b165b8bed7d61615968bddd06f2d5bc506331fd32a6642cb276333a14ba373d6c524583149b1331c66bcc0c43cda931cc7cfdbfc6c11374f95f4b40198193d4574852cfa578e92a323e29530ac45e2f5ee6c7fa22e37a118e47e26791f918d2f35673ac9a955a5d6a37bc7fec7fe5a65c4e864038d37407abed05c3aebb24995e05367e7292ccd95cd2e24484319ae1025f8f4b16c0772bc331cb5741bc5ccba36b9e45838af9824c0c16631b9c5b89ecc247126e7ab0e77fff4fdb8379ce0e1fee7a30756305432360f9481d64e3d31cd78c0264b5ff006ef7fc8071721186866a82b5770682886801d4c7d6e7506ce7ad79bf0d12196afea59b05c62440464e9256574cd545ef93aec25e556f6109dd91726c614b6e8a7a69b592fa830230705a1af28860400be510b50c3cfc20f4b17351bc5e6e009b6acf91e2683482fcfb24fd3230b7b5a1f7e02e72e0ab833877656061c29a423bcfc5ab22b51f4cd7f568cdfab62f44e4099d86473898ccb4f302bbd9395492930af2507b774aa7c6df478dacb21ccac384e924e04854c7218933da25a078ac51b25517b9766ad463559d81dfb8f0b18d31b85ced05f7c1490d3c0454bc71211f60e2c1f942056a0006a190e6389a25160db84bc16105c04b0c02958ff1b80a910dffe074f6917ca7605865316d8be6ece6b1576d0233e4867f3c1cc5c6ab06719aaf91195b89993db4f42602f3c264c242cd9f61a60ae6d85a230e4cd46c6be953c67eaf583653cc97481e44ff25cf2800066b25ae50dd8b35f0bc409641b37c0952913bdeb26d746d5faa599260769d7b4f93a314aed22f0063d8a2541da355067f6ce567ba87b181c5e869d0444e6c8966eb40f5b8ac0826b1ece14025161470b4fdb25eb20ecdb5559ca1c4589c5e2c49a27cf4a17fe40ac705d5cef7727597b8de73e90c0f9e6f0cad46bbb47f9c6294c6aebcb9c1642abe44b0c035621409d9451a4ea06e88e34c217aeb95b37c613b8b89ea5de4843cd30f885b4ce5c2fd0e14cb8879e458667691d034f4d3ab17072e33f8e354a6eadc40b3f6be55b83c5a072b1121da7de19ed23529bf63023c9173ebd46000e84edc0f180c7ee5d7d7f118389b69ba1a7251745f0d3866b141a2296538c55d23e83a234315b05244c06041bd464d9879265d73f5c4e043a961b826ac7ad082ebeae9078d734acb583df694ea7b88aa8f127b0567f0ebf5881878022b65bf239a51b1753c6f9dac286fe5ba04d097091f82e4ff8c8322a10999b8e443f3b8be5973cada818ef6c5d2231032e6a8b31734522ad04e9c1454b2763ad286d65b604929b4e071dc58c5ee15a805ed40cf17a982d98b448c88b6e68cc35ae7c8cc9c0c45e82b2c466652e2690dc68c2d47d0897d64410a2a08971a02cbaedd2242bb546044c8e3d30d0be582c8caa92607c5129a5f542369fd92308600cfcfd0cf11d84063e920c0eb70896a5e067aabc67a37216b453f937b9163c6b77ba347aac964a5d1d114d3b0196180aa5ec061676eba5c63637051e306341622c036886b04a6052a61f59be2ec916facfd0135cd43a26c844996c9518270c999cf504c2bcbb31f68f1fdaa50b07936cf0e823c3f00965fbd84c5129296b3bc87b9f7acbb1a40d80f0b8e36e205039320956d47211c084cbaafc3320c950e8ab682395cca3e6824b677f4e2dc88837175715ee38bf8e692da9654387b910244b41f2b06380827f2e7d8042b7b0ebdb429bacbd65c117f011de45afc85af52029b61c05f1370f888a7531e0fb708ae8b332a9ac5cfb583d060ada8a0c24669141c3719e9fb6eae3e8e4b7399dba55b4a6b83adf8acc8464a7f6fa3246f19afa5fc239edec7f00ae105e68d0cba902145153c44fe3561233cda05972bd1330fe2d4acb42fab97f50aa96c3512fc19fec5acc28fa05e4173ab55d386d0d72408ed20f57bb32f61b85b572eb8d39cc8994be216a17cbbbd3aef37a4ddf395b704eaa742c97defa6d74d05ae239460c135a02f9c67a0211b4599ac24ffcb8daf674e33b3cc3e153dc433c04f3e6b1c5609474f01a33add60c4424d9b2e1f52bd900596ad1b4e453d4b6a0b8db04451ef58f87c434698da56c7b6396922a26d62af1aff35c2dfd8e03f9fd982ef85da3387ad83056e4d3f78571136b5cc6f0a1f667c4e917bae2459d0aa668cde6e5fbf4e82c67ad279cc1c0622863571bc89de14856e5937468c3c8c1467216bc19690b3d24a27477dcc5447811889536daa09bdce0a2003e8cad8c585fe38cb7906d21abf756a0961f0129f7777fe395688390afab910cf4911d1ba50592b2c892f8356292c03babb54a8387a00eb88a6bba32eda9faf6c9de68793fa9a811ebdf11ed9b936222079e780e868edca10fc0a474984e5d966e02d3c7068a7ea01f9307047658014c874e4d3ee5a56c7cc28f0ace71494da532ec401139948cc4850678c10596fa6f01604ef0b9f7c6f1281dc9daab92a5a94636343871245afcc4b70f013638a2f001f0b649d8b83f9009ef6d4051cb3851a52d6725d0a61833ecb51080c0bbbe9ef7965e95d192fba507bfc80c8c77f7e9743294408e770e9369774c6343d84f899c0fb9d4f6838d06f4d7edef6f65486276cfa6db0872295e683bd41ac0c0dc2fe28790751abec9d5b0b06d7698a2599c5c1d2900e64951d50213037822854533aacd9140c0057f738df4638743d3da8c00c0e9aa342684dc8acfa438620a57a206f2afc73607fa8f7d810a990cdac4aefdc6f505c4ba2b00652b709253565ca06cb73cbcc5a9344f1c7cd19c908359ebbe6d54770e77d594948ca89302b09315d2fdae66eb1e11d8ea83319e1a3ca3e49510998d081017ab5cbd9ba4bc867d8ca0ac09baff1b29d34766196efeb11256426d444cf8e5038ff1c6b9242b18a16e92a73fb26f835103c2b60fa511fc5322e03f98fd8d98decb4e5db2e4c93e26edca21d90d96bcfe9daf6a83af1060641f0271ff948dad9230c828d624e16f097a3b50074dadbdb64e8ecac227780c9c9c3e45e02b5bd95992828451c30005b672de291c5c83a93362a0d4ecae88c419049f06a64a4ec3f93c0fc3b93298110c6a8bb3691c7899020db5a799dc0234a527a0c3c090826d982e94619a279c1bd5138c27cd4f1438dff66005e9d760d73d67f3012a295bb0043c2070b1b9259203dd37267a5c28ffad73bf16fa92e074681f25ebff997cedcf8a15d046bed8c868defa70e5a6989ebd200dde1c7054ea9fc8b22214e8e07e176b83a7fa6190ea4302a2f3a5c6f63c8005b377be39b3c4a9063dfc3d0fb495129036ab79311050e4224184f6cf651db98990634317f42c54ab4a5c660e7831d1d72d9b75c44c7f639b3dc10caebf97c1f5c89dc7c554eb516bf3383701b43e3d0771a04b47a1f6bcdf1b10dc711d0c37bca52da965845b711a0b1fdae2a648345eb7ababfad7578f8bbe1678d5a3109d62999c47e49e45233f8e294b05e3602e65353bc6a4f2d28d2b734cd43031b7ce81a663cd77a5430f31c28faeca07755f2e99c641da9ee55b92b6cc6146206008230da18720bc0385783dbc2e47f2b9c75c1766f8ac01bd2c4c1788b5bd4b1ee9c376cb454b988af19392484e4117ec13c86e7c274b69a30845842e930553121e960ba6f44efcfd277e874b0a071101f3953bcd9ddebd1a5157f2dde2dd50d374855a56947b004c7471045ee1c07cd0c1e4ade065e7b848c1a5444c74a28ea74be9527d0322b94d8742c11c0ccf4b76a096c83d201d585e9a96977dfe6e980740a9ceea8ea78b31b05afb0e01088118250abe064438a8dbd0835758820bfc0da8a924a804ae86dca57fd3be05096756374cde86c0422c67cea2f179a342161d4134f6383ee6e93aa309d84fd438b111408f58a59897c76df1a9832535172370f9602dc9fab16aacc4a6405896e6b75176222210a6c9074b16d67370f6bbd916c19805bcd16dc6972f06b9582205d37fad68e8b8a968d4bec8b697e6987c62051a854e4918d96bce4f774fbec04320461e9f0a55274c382cc9a9af47e4611814ea35898f769abc18b52838bc9143feaab37aa9b0333bb36852c26625f9e2169add571c7540fcf4b6454de822c6a5b1d9ca99eaf19601a5a1186112c65ae8cdcb4a31240a42694840336faff0203c6cb6b4e4b7506ef3347b935af9f312c0655675045775af17fe3b694c47af3186b01f4a30f53a82fa5e85077992cd2ac550af78a0c720ea7bcb10ba781d9d2a132d00fd6a812c0af0602d2e3e2c5c2c470f295a4cdd09ec6e1c3072c4fb0530585cf935eb44aa559e093631246cdcc52a8c55075b42bee1d5125661611539ad6e71256c193f458c1182fb919a1a9f7dd4905e424939591049e55eabe1deb655a3fbdd46c0be82aff0623354be4d9136497b2a3a122986d4596b137d8013f37ec8763b2970a520380e926465fa3e91b65183be284557490f4749ea531026b4214f955884e3838b0342c8bb6958d54f6a8d2b6972419a5dddc024665ae3a08a23565dbe57072e8a391b1a5bad665038f44d61109b6f80433b20496ab33f551e1264362f1e7a0dfbbcc6861ccc0048bfef1ea3a0f14785e8826dce53edb8aa3aac6df27995c2c093283aec419d31e905dc724c277d47cfcac2dfc51e418a44673c875872058a312781c2de87604f038ee46d94a5cb7778a47556f3e293c835d073bccc74bc895127417cf5cb3369796ecff5039c02ae92968472fb7678cc3a8e9950c871d05ffa0c778ec2ead65cd791b4d2cc806544649bf39d0aefb5ec5d4748b986c8a768879b55376b3ed31f224d5749f44083db6a9248ac174ff4b4f1ddd02dfbf7b12e29457eaadfed37c1b9a283b8d6d2428cb1fdff2b572b24719c32c494e3ac4ac22b1d74c7b1bf5127b9de5cfd5680044382afb550506eab85236bb18c10b9fb3bdb3ac7d2d3b2a904c1e3903cd93bd40293017639b6b0a9d3bc9a06abf78afa742228ccd15988c4d9fc197b13dc285fa11431e91aa000d37c1b34a3d1ea3104943d4b547f26612761f0ebe0b687a6afaf88f74894d092277e829872b130225cbda3bdf6b4ec81fc434b616d9da02f31a8d02d22824d373a317d24028507904fe16ac339b803828f970c7b69ea031549fd7862b48318fdf3fe9dffce4d4149efe8ca5a2d1eda5d066cf45d6addc1a988def14d6d994708c79c166391b8ecab90c6e423184462b42bba91956752ebc95c5d279eedce922ff278497c586c4164aefde7cc5bafb5587056af72adc76c35adcf934c0ae6077dc82832d50ab6d9df922900cbeb9ce767c95cf950cf9a3fb6c921694d925a744ab486996f2500d9b764ea7213c98df1c066d26d7e4499ef5130abb13deb82dc91e21891b6f3be939cb7e8b7864208cda451f5fc001a76b61cb5b47d6bb3b26946dd22f15715d8657522fe4998fd264587ff747945d1fbdc1787d103685669b9c2de51451c28c021de306d197d29f45e82b4d9007dcc3d9e4bc8ae13cc583f92571c82bf167d972718aaa102b089c5620569e6037ecc6d4a018a43008124c370f559ffafbf81ef2038f1b74ab28b46d78ff1377091e8852ee899a3ec2303698efed6b6bb1df602e9cfde5171889a3bbf7959b89805e24a156132ea360b8eec20f4368e555983d6af7b1e9673abebdceb3a06e4bc6ae46854cee26bdfdf4d92af695862d01ef73f94ebdd4655b81dae076d940ef8ccd8c6051e3c2299609eb74e3a062b7cb3e72d4a4da5a58d51f8a0b0a3d574a436fab13854665dd6b4cdc5448839a4800a5fa8f9295c29314d5d6c5454986404d58b48667c0c31b8f7bac25c91608e8302ac957938089f90fdd375a4310ab61ca4b7c933eefcf63aa00acb21fcafb6f2c48850713b82484344e9afa6f3d2262fa283ec90c78473d08755acb95a215b55825144710f3133e571e40df928bc5424b3d0861e9b01fedaf03ea566bbe5d1fec386efc457dd4b202bbaa7bf15679302381ccb2b708b0532fee1afb87a10b2ec45565ae9eaf4a8ca705f2de18ce2161e859f7aa55d53dbc8de440781511059c4fac9f73e04b1b35399be3f2de92bef659fba9895aa94f07314e0dd0d15fc342990ea567427d3d048815d57e6c0d8167d9ff01c9dd193b6555c3ad30484a3f459916d0ade2f773c7933c4f723378df9a24350951939710eb11bfcc239f48b46367e6f45281eeb6b437b911032b39f6202a313cc2d8fcaa1bdc33a51e12367871fe1cc069f4635c9b99230ca36a9f177951a5f653538c8fd8766b3199c36019bfdd75751cd09d1720d0ee356507ea1546af99816d6ef57b77ea2e5db5412369cb44eb0215e6ac265b5f032deb46dabbdac00bfc26e128765bc2d5a58ac747548cee75d04d2f77e9989695c2e533c42c29ca2e664152201e38c72af79f569b758089de15e36612d6d8dde59f944fc28813f87016ff26bc3f122c3c6db6693c2c353788e66f6289b7e0a778e4976c1529287368859fd6c0538e3449fb2f1f2a243cb6051628836133d1c5b59598a2a040bf933c61e94585e74138ffa61c7fdbaa33cb1bcf18599c626668aa929322bdf917464a71c526e42276a5917048fc4a9d12aac3f8a37d608149424972eb99f09095dc9a172d5092db542f1281c1f0484c12889221c8e681c48b141cd4b14a14b3f200b70af63845d9f944499b66f611e09428f7e4377d72eb04a24cd862b49330462e9c0ec8de4a5153b2ab6bf69fc46cbcd6dc5a037ba8cc1779400e982653f68514dec7d823ff4cd5ee4df4922ea92d91d952c3ca7fcbb8d24811141e741bc996adcfc7692aae50bcb9502dc45aec4ef31b7d47b7c0addd8a100327d2ff4a31b43a720124c2ba6feb6ed0af2dec75e4b52bfb45b5fe8dea133fddcb5276c1942b16fb97a365d4b42a136d8e3faf672698e35066af2b6bed5995e7a2ea4a72f4cd458e45610a8073dffbb160fc120260ed98753a75527d2906d7b0034bf3687c7c7702b6908014cc22a4c43ac9173f8161661af07a0f1f638690c4bac9312e3760265b525f97a7a0bd8e159a43c41dbd7e56bb9249a96da836fd6ed08d551654f9529cadabe2edf24ed0b6c5e2ec53a638b8300bc96d70e2403703b2ceca29d26276177b2d118da5c818e4ed2aee5842ed194ed1a191943731634e81216728f6361fd645612172aedb46bb8596b0c8b942b5443c9bdaa4c0d8e4ca7d34a011d99da347e420b9194a938116889761d805dd7c94a40fc00ea22b77d21a5c68c67598632c604cb7d387948b630e2ccbafc499632e6cc7992148bad21e5dfe923ba453580fb5690b267684f35513a62f501c1ba8196e19450c3b98656d21ac8ab56c260e186a74ca61aa5f5dba2849005403db946aa5354ef2b3103a40198293e4dcbb946aa13aa139c33dc973a62b5c13d6f06d7e01e423547011b621ad82c4e952e68f5c986f00e718d8636d684cc63eab82f5c432b690de4552b61b070c393c8f44402e24599eb5d17f07a4a1db1dae09e3777f244b6ab440ca39a091dacb86e48c98cdc3441315f4e3e92ad8df102ba0df20cd47815a65f287902505bb54d30abfbb12d26cd5a196f3053470b367a2df1788247ea09d5e64d485f181d90945a381f049d32e39143cc6e9146ed633ccc471236bb3231895ccb61c0ceaff7989a622ea4605108152e2d039c0f74fa9587e8103a0d69d63d7e4927fe3b118910105fc07f54507e5b009afe1022e7a3b74796f16afbe2116391857ff0b8d4417aac84e4f968e582a27209a75b8f0e786d303be854c9f556513bdc9a2edc8ffcdb665cf7c70d03cf3dbca4f806e164ad19f0784f44363951078dfc91d9c15f7cfa2e45539315f99aa7c71a73a3e5d1020c077f04b8ea68c0b3aecb3f102b41d2fa83bb1788c65c2c07084a42062423fcddabc67d2e6bbbc7edf4ee8824b7387d3ce8225d4bd2ae97c963f163d429cf136ed0f964ad8ae3906d786465df839d066a03ab4b3ac507f06e37715964693a2d7fa6c76189318a60d4b6596b73fdb20ed5575649f0798e4459951a0f1d32b20d34541cc52f39bc68466319ed9edaf1604a59b8293e7185e4ba13b02b38768901ea37d6540fd311bd40776244939806eba5328e7fdac679ac67c2fb0d370875d6a484a8447ed76c46e6906c7a4663b1e5269e21fadb84ab114163ea2f89230e5c7a9b66c05257828c060c8460ec4eea3b506bd738a3903b1b06e140d8e661ce5ea9f7b4463d8c5a71dabc9a1ac71652b5b066d7eef19814dca8ad031c780c49e66632e6b0556ad54dc71b04c2abe638c69006a8694eccffa9e280a155d7a77045915c19570957f24a5939742ab2e3b5642765ba284597c2036977334d5baadd2d4df8c82b4a76255e14b194e352c640292e14f114e3a0587c0a618dbdfb335146a9baa727211d4533656f94fa53f6a65c2fa50bbdbbb915f85370c0ddae4de2389f7e1287fba930b8767f260a94f44b1688235cb51ba11ebc500435894b753ba5923d4c8171df65298147110333f9aa4fac1d86d9cb80aae049dc3d9da006e505d76e99c287295dde77d8151c28c7a2544c8aef6cec472aa2f13e190ef7ce7f5219a51ee6a5001a5442d608448a63190a55cb875d7baa38282fc6ecfe950a9e8c4912a37059b43f69f747900988510c4fbf3b49561b431f8e30c0240952d2a14c8fe5d7d21194681d4a21207a4d0c387141b07b4a529382ae295d70ed2e9be03025f19b5db2d24bb876bfaa2a79303653392371e7a4a21e055c3c2ecb553af09052d6b4415cbbff13050aaef7f454107a558bcd3be14a5bfa77d913f829104f71b8583bfc255a50ec64a7093c9327eb28ec9ec2035c764a258fa0bc41b9b79487ddefb429f028e2a2d4d814f1c6d8ed9710a3b43b534284126d4ad15312a7dda5c9f4527db754d5c394f1dc775a15e0a2702976f73b61957f25656344578507c74e7daa619576b295c4943428d3f3dcc7fbedb83e07d0cebe042e8a38283e0e858b98dd3f12450aba28f434e27460236cf280e2340ba8524ba23e855d29b7e0b253a23e84e29e226f5350caed8e6dc5051cbbf14f2f14bb94a96a916867926c3dca0bd75d25c50114f7a0744b7993f27dca1bcab7a1d43d059edced5a0adc14f1293e96d245ccdd7f45110a7a9e0c09821434289896025edadd53c9a8d3d60864c43caa7dd4d0225de32951f288c2e5cdc68adeb4dc1c061eb607381c3c1020b6e401899d764044124010d511dbc0a8b054422793dbc72fcb77ef8ec1a20db74c8fe37b8eef912966e09322a408519f1942f33e10d328e3b714d619641f531f483ec8bf520f89599e6f2b2b9b8b42a2fbb81a08e6f6502e881b71fa8e96492f7bdf561d1f57121f57968fcbdf46ef6fa3f76d15d3cc7c5ba7290f6f1bcf1e0ebfb087a2b381ebb0e47e1fb7873199979345dba68310e1f76fffc9dac6bd0b08117e3339f4bdf73e1d8e9efcf1ee6cd893ffa6ebc5f1f8cad0bba95e09b31eabde5bd03ba5de3b8b19dd1741c790f6f3db7b2f863ff92ae0e9b1045f85b96e17a7619940eb587544ac1e5871bdc7e83e0a5c9d1cb3dd62f818fce8a45dd7f3bdf782bdf7803d1d3d1cbdf76ef4deb3d1a3ebbd47a3f7de8cde7b73bdf7e47aefc5f5de93d17b0faef7de5bef3db7de7b6dbdf7d87aefc5e8bd07a3f7de5aef3db5de7b2f7aefb9e8bdf7f6de4bebbd87d67befacf79e598f454fc59d14287aef8b7a656eef8f24c8bdd7b26c66736e6f37d6e2ded4863eafed60db0c37e0fbc24c4eee6d03a6c599d1c1cd00d6306b0be2f72fcffbc05ff445c8d0c99ceec5f2ef41def63c060102040811cec85ffef1637ed3f258f73d10f5c3697fa77131a00e9c0fc4ee7b3096ff13f8af93ffd1a62144a86d1b2f16ed5b26e5dad736599b39f03910f620f81888e8bdbb759f83de3bbe22c591e86b201b2bf4dea354f13148d47bd17f6159fd8b6fb69bda4bd13752a77c0b82b87c7b3cbbd8c332ede1fe7731f7c3edbc48d3c322d1078372916884494fe6bf6ecc96237fb890442166824471b7fdef822c419a20ff9f8161a40ab248e7c0fc0f518815e93c2c1efa18a88224f33f74419e3841fedbaeebe8b11c37dec16090fc15e91c26c7c48a741e46921d87b71fd2c4da7893e5b58f83434fbcf1daa66bbb48e7a4f7424fda39190c1e73fab6e9bb18246fdab64114e99c1c7a637ed37720c8e0d0bf05cdc81ff9f324ed8b346c38d2cb43db93368d87931f2fff774dd3f917c61eff77f797235f49e8bddf9f06daf98f67e73f9dcf7d1a1ed345fbc7a43fc9ef83c68745634e7a17732e66c8ffcb351de33f6e4d8e933b6b1bcad1c9b92ffe3839ff72396eb3e5b8314dfe78b65cbff6fd6ff87cf8d3d270ffd3ea6adacbf52fe6bdf51a3e01a2b509eef4633df4c69a66cbf36d646e84df0fbfb669b9f69e9c871fb7d3c8b25fd3439268e7b97d46d2e46d3492f9af3b7a226eb48f72761a79db3c3c91f464d148d6bf6897d9e1f44dd6784732f7a48d93b64c1aeda3fc81ff36c61fafe920f9e7dac763f6fd7d90258ec3a1ff7789798dfcf016f7de20ddccd4e6c8b877ceec8d7b41be67e49cdc8c36f257ffa26dabb991c113a6ea9ee689e1d05834da777e8eff5dfcf26cd77ecccbd53679accdc85f3048fae0f1f6775edb713048e2f36c7fd9df9f681bcfc8609034da36c86030480621c9152b7ceed3c831722c059116ca157d9b0a922449f20749da75301824c9d9f6399e1b6d72b67f784ed7c6395489501df991204196c934700c9fff4ddec27f1b735fd7d172334ea1f25f86d3fb29adfbd73489670fe77a065bef3dc064c10364effdf7e15acb8138a63ef53e2c1a6553947a3f7ebb5fdb69b8992d1be5e4b8e38f8176fc31645a36ca999a62cb46b938533b7eb66c3c7e3b60fef1da68cb46bc94a5b9e1d0a3f520599ef781fe367a527448a1914281408f0f871e68cb467c54cfeb7f97a2cc968d722bc6e452dc365a59590420fe6560fd65991602e9a2071671bc810d9ffe7c22fe3e8e93b558d8f1df9fb4f1be11cfecfe9fb26ada93a4195cef6f9ea2f4be42887b35625c8368ac813d88b2fc7123b013a662b1d399de7b27eb54ecbd53f993ffc723392d223dc9890927b5de7ff27148bb7112db24e9571b6fd2ce693c9cbee1a2bc29afe3395e248fc34da4a645dd78d3b22622bdff68211e69a6c976cbd2e4f593bfcf7d5a2625bd77b59e956945a6080c7c62200b0379fdf789764cd2f45db4ef62d1933f8fff3c7ff2cb344e7a12370b0673bcda66600b139e1ff9853989e9ed92aa4b607ec7616ed7639ec4bd9096237f364ec20f671f0cae50f3b72fae0002ed3a6091ce1758b4808ffe0bda423cda17c7fe9f655fa4f320298ce9b1e0ff333048fe3f9bb9d59f68b79595cde1d9b525139634540a54c947256225b65594c850c229d9a00461d2a3494326f1f8e51f07de7f28d75e4892763e2f2b93e9b42039db61a49168926462f8d007f32f57bf05c3c8a09819f61624c9d0c810217eb8fdef4fe6fd3a32a77312d80624719a04feda76d3112c2baba3e723ecbdf0dbb91c6e24daf7fcff3d2bb0aaf76ee74605042990d77bffe1b83dcc8d6369af115680a4e57fc70af49fa445fd0767499af2130b2325c1f55252d64ffe785e9847da73cbffa6c3c8226ec42315fb4f0cff3f929a6d9b450afb412ad53b243cbea6895990704864f1f885f9d0d7b48b5f02927e62b74ddf79e187719af8abfbfdb004e8c83f8129bd3692b8c7934ba046ef3f3901b21e0e8df38f6f7b5e7b34a8c35f26c78241dce3cd3dca72e251f051dbcf1e3d20fb77d1d3313dfffa9f39c264dfdf87cf87df519bfeb3735258470b499b862322bdff822ef27cdbf7f1ff3d3b6a31f478fe9685398d87d7367dcc694778dd1d69d688ce4ffeb9bfa3f3d87ff9c7358dcb36b151b1f75f70c55c8af98d46909487b6b011d9cf2893b69d936979fd89b54de7f897e34fa3ac6ceeff7b06e2fd3a8b511ca3118b322dbab228d87fb71d0ce224eea08b60b0f6a49dff7b2665dad8831e2e2253342a4bd19ede5f32c42f1824ff1d4dfaa397cd14fd5004d77fc1dcb6ef2089d377a20812a14934239199880bd1aa9f587d1b69bb1e929f2e8cc44b93cc8d337d477bbc9f2dc40b9264bf32b2df0c445010c5212a3bb4e9176248cc85bf5f595e7b3cd2681f45b82e6da703c7277ab94367a20c693184664843a1508528f5de65f4ac424e0aa18428114a62d6b308a57de39d87913faffded8d75fe0fc9dce762613e26c7702f9cc9e1d093c15ffb3fb46d983423cbc87ec11cff729024fbfd7e71fec9b163ed8f70f1dfc55f1bede3981de9ed39f2777f784cecdfd1430f2cfe6f170c2371794cfe76b13d248fb527817f087b20f9bbff70e8c97fd379fdc93f1322070deac5b1a030f75f0602ef3f0749dce7bd83021854d7fb6feeed2d8e3cc23fae67e0b74ce3757ee8c2d7f9e15c7f1ff63dff7b1674475096de7f38ed8b4798b4f320997f39dc0bc2d17bc73d9e706ec5891a53d078e93a43fe79b48b405f02e1813c005ad47bff05cbb204aac12079dbb36cdb75a419897f98247ff037f6e3da96237f7916a01c80161cf027d87bff0dbd318f7d8dff2169174594a549567bf238fc76f490fc370d1bceff21fd2ceabf604d1365b3207984c9fa2d3612493c5b48e65f6e4e887b216ecff59a1f35333f198e43b9cfaaa2ffb7599f45bdf75ebfb5e9667d98783cb33ec2defb4ca8bb8dc51fff9bf47ce810899e4f8dbb6893384d66d67b3feb597b2440d1b3f6ece9bdff661a6430a6dfef226b4f5effc564b55dcb744c1be5f6d4b0ddb2f66480c999d4b34986f52090a5a7eefd77fc31561c7f8ce3b7fbb21da7abd1eef64404ca20f096675530f871234924daf1bf73db8dfce164fe678f93c7da7f3b9f97bd705b738b33a3cb23274f9bde7b8d9e95a746effd87cffdee9ffba1110f06ed3c63781ec023e9170ca2fd56f42c3c508afe0b499c04791cc2c48fe366f0a7cbd0b3f098b8e3e90e95ac3b747718cce85976daf49ffc8743b31f79db448f47cbe4d113f32f57bf05499c44da4fc6bd30fe455cae8d24fe85f51ff3b5170b237f9d27d2ff2e66d9c9cb6b9af889769b9db9de7fb39d7f393b25ea40caaa33a5f70f75354d96db35e9edfa17b4e53ac2def17e2d4767151d345974e6fe33c6431f93c7611c7bd2beb3891f3f7e3bd888db796edb71473ab2448912257e9ef8737a38a46308712f1cda36fc7edc0be13eee85c51573b1cfbd5cc4fdfd9695cd15d0fb0f1f1af1b9397462f2d026bf706e458aa13d87abf79fd84c879595cdc9c1d4fb4f0e9d293fb928078eb4b3ed9c8758980edce320cde488e8bd935f98d3d942bc1565652b704fcea54891679f0d873e5e3197627e93d7ea384be2a4f81d712369cb46b92fcc65ff73bca687431f07029c4f254afc7e6dcb64b5b14489df9d4dfc77ed89f7878313009c00e01c8153f6fe0302bf704e2eebcd239b0ce6b61d177ca3a7f74ed7b3de08fbeff8ed6cd9889378bf160be2fd3a1846ca1f3f7e3bd2968d79fd85b9d14c88fbdc58cc8d6f656542dcaf48117f1aff8026591dab012e0f69610c04cab507cafedf6e16c0cbcaf0fbd77b1a7a5f5e43df7b2f4356effddeab01a2b6e99c966b3bfe77f108f7c46055302051ef3d0cbdf707bd0bbdf7deebfa43e06ddff7b77360d1086ce77c46ef3daeba8e1efade7b5bdf078d0f879e2867db7367bdf7b47c593d0bdd58a147a1af9920a117a1074145ef41ef53e750ef31eabd456b98f4f03517f0fb777fbbd8df736a403307bdd7a0cbc5ffaeac2cfe34ce146052e3a0cb1f48204048f9932a5690408090626138fdfbff9e7f3f4efec3211d03efbbc9a511ebbdffea37bc8dce87c636f9df3f1fd22e86438f46b4d1d26adb2df6779ef7da736bf61c2effeff689de2dfe453934336efbbedf025ec1b5aa9cdccf93396dc4b36b3bf277ccef5fb4ef2209a255711c44ec8745b255e5e448f9e75ffec169bf6f67dfc5bf68fbdccbb32dc4bd5a8edff44ccabf36de4532c7bf3cb4c3c8e2ff7675359de7db48a211c7cb707c0449fe66fa272c92b52d0cfe5b98db739d8b85911f1f7a17e42f78a2c6e0fce38264ee65e38d7ba2af83b83d14e6245d93796dc7c11c8f9c69f2e3461f7f980c8a8dad984b71db2ec282c2fccf24feeb669b88d3b517c69f48d6d534feebea7ff787f43026cb8575f490c47f4ce7383d1c9aa5f8b3fdef482f361746c674d1ce49df46fe822be6521065ffefdafe441bafe9d926cb8d3669d791b95de7d967e48faca6c95f77fb21e969d870e45cd3f2d078e7c6b277eecd8dfce5346e17bf4ce2e4ed8b6369469bbefb77518dfc0583e41126c5729c045ef4c43092fce1bfe8dbc6eaec9ccc8dc5a117abe9397c38f4e42f6dcdc12f6b8014bdf71808891ec78db2ed06a6c29755a11af802e90ba12f7dbed4f942e68b982f618a362926228c3c418a89208fb79d7bb9f644724c045956b4c93111e4d0136fbb0e23c77052078e2fdbf19720595f62b24c2c2cf7c7a27de7f507fa3bafe9b2f81771a2172b3f591e0ecdbc0cfb2fb7e7bcb4e8bdff7e5c7b1cf7c398ecfe5e2278e9bdf73c4fbceb489c26c92ea1b2ba24ea9d5c419265efdc8f6bbbee02a593655dbab890e282e904973f9d2ce372860bca25449910f76aaf5a59594c97951563bafcb6dbece22f8c7f516e4bda7b97f3fadf7d607138a4ed7020f0cb36feeb7c1158c4ed6e4ffcf707f3435cef327e50ea593f12e8593f1635180e3d1a8a658296b12c2d20b2b46465a9a4e541561656594ef5eef3dac6fd8f9387b65a5c66cb465c0eb765a35c8effb917fe369ae579afbf8d669c7ae7d47bdfd47bd7d4b1a4c00276f788087040ef268edf0e08ccf19f9b90fd57f399de22f156cbfb72bd86b65624de6ab2ff6a718fb61ec4b4daa6e364ff8566f68bdc1ecac9fec7f5de19e8c73baf5fd9ffb8b6dcb6e3ac40e94080f4de7f6dc1204e92764eea08e26565f3f0cb05719034190cfefe6da3fde4722f0cfedb460bfebe6c13c97f47cbb5277ffffd5972a0658a244c97e8e2ef1794679bfc2f48fb77db33190c921e8da48b667233e4d9967fee6f63eef13a7be84979481b6b1acf1e0efd587edb42fccb9e88830041def4d058f76f1c6f0dcecc0f8d319ddfbe48d66b474fe69e3ce29124f1b6d7e0cc7ef3f0e3b930c7694fe2fe787f630fdcf678e45830f7a40a156490fcfd1f4d8e91326ddf79fce346b2ce1ee6759ddb437c8c0cf7e4af6d32fef798ecebfef077fff9fef91cfcdd5fbe6df21f6b4f0beb682289136f7bbe7f7138f4b11beef16030c76bdad77912fff5fdef6e234e7e3b4fcc8d36ec497c48fbfccb647d0f6dbb48dad977c0bcfcce637ffffc87d3b75f237504cbcaee1fc4410a731aef1b7be0397eff645b987f22190c92352dfcff8e493b175b5b948de73b8c947fddfd895e8893c23897eb9ffb9bf64592ecf8ed4831f9e7f8afe9bcfeb95d0cf324fe71fa2e12ed582c6cb6c96090943f2e8c8d3839d3b74d8ec963388d47fed6f0798dfc05653a48d734593ea48df0bf653a1f1afd182e0f3fed49bb86237f384d8ee19efcf91f1689b74dceb9b148cab51f0e8df3fdf12f93f2c73d4cf6b699c5b958c38fb587ed214cbabdc9c1207d302e4892b58df3a08b66fe369afdfc6df4649116e2368efff8d7e41a9c19f9fbc91f37168ff9d8718846fefc6d3423737bd87b6f7befec02965e14b187b8fc5f228f8471ee89384decbd8c08b1e337d0ceed219edb435cf6393df4f2bf69638f7f9374d193c1fbcb43da786617dbc3b320feb373f278fbbb9f10a76bda05f9cb499ca6673afe45fc13ed3837dab52f9a917338ee8768f787a38b66746f3fbae8c9dffded709f93f36c935f98cb91f797fd17e2c71fe34717bd1cf9fbc5634e1ebf1d6982c4f3374e0f7f313d848d45f265334393ab7feee3da8eeb6aface7132d8ceb93148caf4f0c3f2273d7d47ca1fb78b799f3c7e3bfc7f9cacff1d5d47e62f48f97f3c88d957b0e081022c5fb73fd15877fb2c1f95fa27fa1ae8434d27cbb27c0021cbb27cb4e864993dd73430061e171dadf49e1f73901f071ec3c8b2fbdbdd369ed9b3f244e5d121cbf03c2264199ec7d57bcfc2c34496e1a9896bbb067abc1638de0360ee8177647cee659f7fe25d8ade8d8f64606e0f7123984e96d576d10804d63ece320a7bef649931ed9d2c939295573a91e33fcff37aff1df322719e8df0fdf34fb4eb323b278dc59a26657fd6cbc2dbe059884022f522521d3c4012f4deb1605a856d4a5300a07aefbd425d16f440c0a24f90de7bef49280f62378314697aef586c2f0b4e4f483c51d57b57d02565d1282c59f034eabd3718e0caaadea332572d7aef3d165570bc4d69d2054fef1d6b532a2a4026c0a289edbdf71ec127a01c00f4b0d47bef7d0a856e3192f244eabd33d81274a0456888c7a5dec972fce764c3a1910c9c43f7a0de7b5b7f719775cbf8fdbb1974d2aec9db9e63a2ff778e939fbef3de3b9b356a72db8ef3f58cdaa6e59fe3462fcc7b7bef697aef68623aff44614edf66bdf702ecec39fc58fb36db9ec36f38db2dee3ef38746d96eabe93afa7e93fd195b6ed7b599fb0bf337f9c70d7dee5df4de91b8a8ab69d98e7f5aefbd0c99def11ca7f35ebbd8c353d18b44ef58afb26c1fddbebf0fb25afe6445a05d01aeed87d7d5743e34fa3f848db69cd3fe369a8dfd6191e8f33e79db2e86308dd71f273df96b9a78fffccbf7af7f1d6ec4ebfae3b630266fa36d83fce1b831f7b72f163d6994edbb58a284c7f3e43f237fb86cd3f72f92442391ae6922f96d5b48d6f617e66b47d8e3384d848d383934ce38fee3d88893b55d3492c16fbcf32069e7e417e65f4847fe88747e7f7aa6f3facb6b3ef76971f29a99bc6617db6c67f82f1ef3b2b2a18781428674224bece2f4de4f9c10e25e581b15f42cbb0c59760b3a59160c92b92f1aefdb46bbfffd7d006bbb069695e1b54de3f5cff37e591919d909205da9f79f5088d3328967d7e418d9bf8bf21fc2befe645d4ddfa41aba4def7de83f7e861642cb641919a67fe0d27b8fd1b3848e7acff33e99bf8dfe438eff3a5a2687fee3a48f339ad5f44ce6768d26b422f420b4d0e5ecfbdfa86db7bcfec4a3879bfb75b717a211693f8c7f1cdd7dbf766f6f9d5dfe7112612a7aef637aef3d312bb27e0ef9cbf49d1de7763d57167d8e13e91cbf7f314e134fc4384d2c2bc3cbca801f0ffe8d384e0be39f13edf8071b85395d77e244195ecc732199df76f1dfc3228942fe777e1bff1d8dd77ffe32e9ff997fa677b2ac48f439fe89747e02abc6f2bd01951d351a9474d118c7363903e58f1b1b84fdea6afbc623f3fae3919f68cb913f1c36e2a45d93c2b8f6f75903335a0a3a2c4045e7fd0f319c23bd77230f1cc0ddf67dffdc68d35fb66bf9cb765c7f32c78d307aef457aef4486f4de8504f992057faae9614d931fa661270b9ef28373f44e96f51899e5e8bd2e4707fa29bd0b631f039df8863d2b38e62774dcbebf8f3f94fd1f92764ee2390d9379fde9989e67234eca3f9f6921deebb28259f0fb971b89b0fce93bcf635f24dab1fa5b7f2819d931a76f5f44fba4650559f43110efd789cce27420d07b3f3ec8a381f5a3a7f6eee398877767ccf1bb47d1ae89763c6861dd0d1b35e868cc98938b9301e7d6c6160386da0b176f1ada99d9891fd9d82b1325c4c2488c10011602c48757a4870e1c3668f8f2ca80e1c2ab57af7aef5c6f3d6b0707fcfed979f178c7e7cf347f2659fcef86434f946f1b0fc73d9cfcf1ece1d02cb7dd84b987cba3e77fc3118db85dfc85686bbd773c1738fe6f59366b555cae9e21ccebeacf26fbb356fdb83f93fd59effd6ec1f0bedfd81e0ecdde7aef463cb78772048885d9d9241031203986878d00428edd5fae3f1e76fc76c0230c14c6b7ff38f078fb9a867f0b38fdbadbe7a40a15e46d8c173871d59e8583ecbdffd81771d2ae19f46e7cea9d8185ac1b5e7acfed3aafbf1cdc1dfde31f87cb5fbe7d8cd36966722e6c68ea3dafff5d3d43fe75352dcc6d37b9dc76cb715bed0f613fa4fd9d596ebbf9dca7d5d167b63d07773c937f4ec3b4d0bee1f0ba9a2e16fdf0fe776ff3f0cbfd84398d67bcf1c8b4353c8efcd5365dd365657041f27f39f2170c92b38d7ba29de3c698344b23bf30cf6ba34df4f47dff3b1bad863dd79efc37f9f1e6e4dacf765c1bed7ac68d78706d338e30f9ff4c0fbf4c7edcc3453a1f1a6f3b8ffd5c7f9cccff91cced9a946bff8be47048e738f96f4ffedbe3fd3c59d3a41bf9abab69a21dd7344edfb78f499c96ff9dc749b9f6f297bd3dfc782449fa1cb649dce3f91cb785b8bffbc37f93c4e1bf89364ece365997d71f873d69e3439fe39e18fcd5fd3e3936c3e4d8bfedf9df5f38f7619cbeffd093bf9fcf9ecc3f9ed3429ac46bff89437f7fe217166bbb88fffbb66ffbbe692249fc395dd372ed6352feb151aebf3047c3fb6e411cc14fb4e582b21d0ff13ca6ef1cff374de2724ddb646d46fe82353d1b499cce713fa4631bc73d0b72a673bb26ed4f47fe3e7de7f7bffb358993c8e91fd7761e99c27a1727134c9841b79d46892e88b03f91dd8784c41b3860700c3a43660124369410e91b1a9411358706a230298cdc201599de2fd8cd298596c34b8f1f70e0185081ebdd472a900d4541620030c194160bf216bd6f380012041906e569227ba3058c9d54797f308109c64140ecc59b41bd772d1d11b05f5e9d54199a737380e9bd7388c54cf9c941464f9a3aa93c06234b507181c1610621410938891c95b810c64d07233093291d30d041a3a335c80a164d2292418b95a22399490e8d67ea5b67fe16d466c4c412299f3a2cda024a12100579923ab5e81908d004c205212ec135497adfa213270e83fac21b0416f4ee0100524c1eb4018b2304a677af15365c30501aa0f48848e7323145d029d20720687acf22e1e98407ad222593debd14e8b1c915929ea7169d6b0daa39a782b44eef594f4a8c85614db1d2fb571eda51812e70c8debbc8b00431000302223dab94a2066d0954e95dc3d726489948c1f5de650087bc38505a745f8d4d412a2a7ad7c08758e736a8f70b295d1249607af7f939b29888f40d76a946a4bd5fc0f3a7c394deb54a2e9c5a740e5f56c4f48e41edee53ef5a608064e780e8f78e211292deb7b416f59e8147ef5b4c3cb4e0eabdf7de7befbdf7de7b56efbdf7de7befbdf7deb5d25c80e267a8460f841aac62a448b284c130a3d209542f228d326400eba5570681421c4cc8a13065031128215b18243162e107440b0517833b49e40152484d788fb520152e1052a0c1a3286197ce0636c0b56da92463039037b5266ede5c783526963d96a3ef43e406001a162c8c0206ead0014f983f1e2e98712895a68aa30654cd2943805d21958406467f08098fc926631929590df0f4e9e1832fc90d22c4894268c991c70295d592ae3b58543800007ee04703747f92a0e17dd25022c884b5e21d03be34ad894380951999b2228842624d27635b31111b15261be2b0e9724d375a825a6010f52ec501154293d7d712211c5ed1c1b0d6cfe8c6c86a285dcab2c2a6911e47150000237617a8832808765c75262db10535321fa08ff00830232190d727196231ea04ca03a305a12b53e012d1c932cf3a8ae636ac6ec220ad7c9c45502e154384686221d0326175012249cf07225e6c97cee44e0db9261d49ab54615403973c80c1a0f5a9d48b2f1fd8852d2d3464e8b6fe54b06324c05811861c000c854243c09c0c71b41a0092600e141db2b9a2d31538b943261a4cf07c94b1f33c2aa28029231364abedae0b861a33ff0c042e8e60600424ca403a1aa00b1d23165ba8240c44b245463a883d2892b6065014493d1107b5639a182d05cac01512b5e5f8a21369d416a350270c532a906965a60f5d963d611a60f292e70b875ccb4d85ef0007849422a4962510b18196f049b193090b8f6c1a411001812c00c380c5a6cd431c47849e8c716831070703b20d7e6c60aa1ba376c701556053389981f27c1164186b11888231b77337490a8b0d122ee47961e1544d69c4a8012e2a68054d15365c000448846a74a024b6116748a32d8c7c51506c61cd68b037ae32f86c4d61e22e53858c30f0f921626ae5a5cb50a5267834d42a4028a191aed950c160cb0a476a4cf8c03aa901a4c2b42652a010451ca4c5d8d2557be8b3ea540d05dae6a8f16b5d3b8a7c1132f3664e79c2421811588e5b6ec8019185c08345714238d07fe60851d3cbe026012e079e2ca8e340e68fca69075d6fc70230bec21c004484138554683be288e223e78aa52c1b56b614a584d581a1c17cc34a8b031a2e9b551fb6031ef0c4258c2b52158d325d5e4f569d972e1910e648a12005a8636e373c8c82800596485b9a6ccac361cb089e2fb595ca8627043af1597f109c63a6932e6b8607da7836607a1cb1f30681392a1c483be2e1440e1f5f6a006c2a20c8e653105e21b31544cb2138620d360d541abe0af33a9664d0d159c84cd84c2223c764c50347389f3ae42dde54a09944a54dc8c3cd800c20406c3d38632a7132688045feac0799dd450343a1462a3e91f9e083e4180085bc4293d270c8a30411dc2ad0831316558b20b5a242434b80bc858e7889a7134222c8a464870f481852f8e0723c34260976d4d9420202af271c247491a1120a898db255d83375eacb28ad110e28a1849e73fec0bd1edba2a5bad0e6cc272aaf5efd383e8a98256930f7c0861c8e40c819f28a0508053e50e9f402d4cf674741aa032cbc5a621404478213a21ed071210cc9a90e01bca2e55c31ae049f7ea8341c40c0894eed2bb4330f220cf291a9cc8defcd8c25529abe385963d0200f1b22d980ae315412b0abb46448c985da104ccf3349c3843b18811c15a0a68561d29241dd0119599e088dc293b6864882db272b96ba15b9ae0f7878d8cdc8d1c20d84183b5c2dead47df13091a4418937703e4d0ca116384f7cb28ce040434c6aa3a54282850fc0465314e01263ea952846392e1c6a6bd4c01c41aa052f436c867c62f066c310ff828c883a5871591eda2c985220c594222e87026109204cce45829473200d1f8576e4d52a15794d1879959f849fae4c69e091fc0a0236486a5e0f41401c01612715d89a1016a7304da0a3b1c546a5920a8e02eb9a519e560d1dc8112083963e10e0202c20b1c1230c044b209041d1610f0ac702a800be0d08461e7688028cad96846bf200170f9f921b132d4398b865681026abb1d148b088035142cf251e700707070489f464cb94851168e2d891d222d0faa3280a017244dd159057c2cdeff46403863b05379c6cc68a1c2455879e2099260e7248dc36056174141aea13e744ebe6d09a3bddb82512138a812136dca8381262d2850658e810632406010a5c2a3940d1246ad186315254092016983285c60460a5367c5ae0ebe4161991cad0d78d5507960b5a3e051780821828be5181a9941f54135012e00a9a06557514388489828d31540fa4d0025266c5e7e3511839e1011d1e2f0cff090064ba7429d0e40cb3108198c6838e15a37a50f8a3e12d949003b41041e8f2944641434146eaf39d3a7122c61e116bda1051a0845a1c9f2e1a760412746873c26b43180bf9a4ba1e5f6a24b0aad32947d9a598905c9cafd79695660910ae13acc818f2a2e3d1160c308bb820d138bc50aca2e02a49aab50c1cd6167c4d50e0e69213087c4248dc5b76806d79b35e18793321478142a3249909f3058981095c36e04c109099a2024d14464d3c142d6e5ef69d2d70dae0b4759d4942d521a5478c0743688c84f11f8237869098cfd819e064eb120c2a642ac1a9d44ac9032386d6262743240e6b85ad4c5b2eded018845af900e661c2a62354b24cca922138e6a3c5518cb825acd0a8ec15932f16526838248c51675386332d2584f4f008e44802083d46769cd1d1210e4b1890136fde1244a16c1882b85ceb9497635b9727767398de88e8a2c0a92618da28c11066c1281725325c22c500ae68c7818b992e4d5c884582f30503a84064a028d12af2a98fd1d0a4118b34d50fe01911e9110610f0a9ad158bda24d900c300bb1280411b40496080a40a482a1110ebc0f14ee0a64c4bcb529b27085b103cb9fab22121cf284017b0580913344477c8b70243ca6d0d8fbb0d2a8e84e8b822d3e323080413206a00daf21130ecb0e5a51216355144d84985f763ec4296031159940490078b1b03c40e48c0862a0d561e8c7275a655d3cacb172a0f4eda187d29925c018a85187630b248520072d8ac753d21200239a7862f46844852810e191b94be464da923b7795183949a396e46548ccb4ae00b5f60d418962b86f49c22d26246bb22f82c4805ccc9f3638501a5827043f67cb1b19a31614e849a49157088ca93bfb4c92a6a4880041c2c501ea8b1c20dadd094880b0a88423dc2e4b123e060172150814b1f2f034c04a91061acd0a10718fc71a00ada0359147efcc202e170b50703da16ae1f3cf0b8b214607580aa075c15397015516080b7cbab2b2bcf431c52084c00b32106ae43bae1e1c69c0024c6d8ad9142568cb0a927c1d45696dc92a44021d88e40e606898898c1cb20a44a979b2a351eb0501ac2c408c968ae839775003171b09008d208c8434c010c0ad80291892ce346481e9b313fc49429608c130ca10638a388c3021726b1dd78f2c63561c8a15311392c4e33b84cb9d4e30742010b4bb4da64396240d18c22939e108027014105c4c190a3ebc124b4129964fca60c25b856407040bf6264394a3500271fe9920a0e5895d06251aa0685e44844d130f848f847023b17148972524604160614bc384230024159011b8e785ae356b75220cd8b2e86a63784e47c8d8a876430d861a6901448526a381d8f2ebc98f0eabb9023230f7a085ddb645cd32069118b1559e24e6344f4b4d8a0a3ca165f9d11124b3cacb0292dc263e2b3f3234c171fd88dd05305098dfe5ce17141ecab8906f38e0e3f24a328828c76fe6c79e34d64bdeafad282ca08ab140558b1c300dc863b5d2b26f9163dc6cc79e28855035ac88400f515650aab29512694a907ad923b85b14d595abeb644504390a7af62cb0a220f5258e0d2e3cf568d62c5c00a00b02a9011626c799172039853828e8d28e5199533132c45ca528f4c10e7e30dbb6a01b12d101e4430c375b649823aaf2003555d707a86605080f392f352d6e2121d0739a50f582b364c21e3e14c92418c30100021ced7c019a23170106d1192eb62848d20408e629884f62891d133dc398344d38de31c350eae52946638b5e800aa0a011bcc0c22be4404319482d10253b6e2b69861e4c5000c255dfda58102135f19489c5109d4e046a50988305c083a928a810ee6d6ca2e31650505132e928ef2291b5a0ba8e9658203c1046554d8418c4b19326010800e0b079cde4964c44e930e9016e0c0e187a83e0f94f101d527046d628672a58c1611671549ae73d6a1f1e10e89c1d2120c0f16ad6a53e169485d1a34629f383c6a608321066b10000f3413c00a1c58048c103e579acc26a891831213571b4ae5a173a371410817ad1f75ae65a782cc98a8351f426de88086e10b860f43030a145a129278ccbe2a0d8c2ad630d8c483c2d032783a23d2a58a0c8f094d2cd998c0ce2977e9c316a9c1080012296ae6dafcf884c027480dd07df289e5dd0a188233aaad079e0c25322099eac2214999b2428c1826440988f0d4896dcdd7a24368ee06038e8d1e0cdb5fba2429abcf1030616d46b599032651922e264279e23ae581c969a9440e4e4db0482cb8ebc4c0d7094f3c5858c951750875d6069015305ab2749412538787508600e420b0f901645390cb3834d44b23c10e3a240e7d7de5e090e7554550ab3e17225867530f09e61418240faa8ead4e2e74fcbc42e0f789d0895112b62250b3824598533e8640b22423481e548232b0a26b53e4a468c3c3212b652c91f560e5815df3018d38c1aed35347d15c5e22bc2d2387d2426024008189f4e88315434522648887984db0c69c038102213156ae7c5b072040ad1f92848019928122cf0bc20acc16853b7600d4b9417aa50528cc901b9e051818957051e403020a0291ee6e5720ec187000944b9a60caeec42800e62ce449c32090d616dac1830b995aa5ca30d70492134d5c309ca1a915dab025cfbd8356c346c6e50807ad475f138ce9a32611040b30005d0563b44cfc9962a9930d353d1b7da26c3922c6c5053971e274014b61e8b541cf33d989a40d720ce2c61c511bfa6c60e1aa51ab35517c08e4499577c0292aac64987985b60094e3851ff18674a9cd1d1e01be575c904e60d160e781222858b858e9922280904912ee00f1cdbd45e62cc0a7120047042ca8bd98f1eb2a80462611906eb93692c802f8b251e2a8614bcd0006b055f8d4a542ab0a132923862c513130ad91d244061ca6690051570a38d14562872449a7eccad879b3a188993b5b3ebe7aac522c942ea488013589f11520c94696923e5eb49031af23a5516f8c08245aae33f7173f96e6789014d700a42e87dc34f06a24e5059c04c03c25aa23c3f6b2b0f4222b8416288c18b0590cf44006a479018a8d6b6c4829062e9024e0d562150e01bc365df262bf886a906544042095f5fe016607060f4996787ab0e2041455462416be9818bb6cbdc94bfd1196e87c157037295e593392014cdc9890e295111fe414993864678ba60e83e6395e26d8b10b38d307023d0d9c51da52d1e2ec2308559242108e935853840865983085057e346526c51349708046a540d1c1029c37b81ab54f029b44b22ada100c2d428bdc5461d30a99696bf1ea4b8c870a1880a459820050572b192495150cc020a011071c34baf23b1c40ca08e344d1d2054e89968d2e444242acc83cf91e47122b6eee02291c2dfa4c8077f42ea24842ac4e0d6c4873669dba7385ae0e13b3b6330560c6f840bd829165860a1a8e52852d5a3b4b9b2f7c3d1c56f080a286c903f8021c551220a2e1d56f5314062722a5396101d08de7e4926f481037497e54742ad48aa654e744cea1ae4b39c4444145211804cf9f3833a23c44031d6ae8749345a78b895433a34179bcf82e10d9f18a0d1a1c46710ca271b83bd29583bcd333c08cacb2427474e4363d02fb7a1366c526026a6e0d88030408178030966500ab1c80da54c9d78ce262d27302080f1725556f546d98e35380d682a6e7009e892fad54605069da04e9ed4fe732227c942a2b860248b454b019989a446402a32249beb87628e2a4272e82a05a0699c580814e41afbb23974e8c00e0b8c649c8e5e00670958747609022285546e2b2a38f17845215045b9bb034c801a983123e77dcb732080c1041064b7804a1924040d85dc2c118293f333a1eba4cb0325541ca0151e0348172b36a34628b8802c85a8097222d6502aa04550a5123839a131c697241b421412418eb381afb75b8a1e6812e613b07cce12617f64295abb54a0d86361f22bda3a5cd2956631120c120271207b2ceb0078a088752559e2b820319289b849e04617d122c884ae345ada54452053e532af921e9854466334495c1101645ab47aaade3a5de86228cd2d425daf0801b2c15ee1a3568f089c5b8b860c6470b031b57b4033c766d1778ed1035e075a1cb000828589bc14081a02e4881f8c4c00d6f8f8844031a17697428b1e5f5c0c3fad2909b6e2a30ec409d6a62c1d08b2e3117ba1ae02045edd280531b3b3904325092a0614b2c9f52b040edcb0625616bbef810f9cc3a78c0c040a635710f470a0c8fd8915d543e019626e1a881c74d4d912032efa7af547ab2aec03df00be52929a803001d9ca500161e3ae2b0e890e31096496e150d2f5d165aa5a132a32235b309fffa04c1f0fd929b400093d184228c2c4961604cea8046561ec4d22510661885287174a04147220017952e3368849201c82e5506e10b2265ee78c95980460d0123d6400fec306223a8a84496af0fa8349e22654a41f7c38757a9c80fae0b68191a0c209a6488682381041c8551c04bc39e286a0630932144ad4d8c186a4ede3cc06d0ea0dbc3a88ca549957674f852a369ab0b1bfb4ed2110768ce10b2d368919a0a19927c49988b3286d095b809c4962089e4eb4040308ad8016c77223073076d609e00698bc404352659b05301399340ef716950030ca624b0b30288f1002547115a44a1b3e380c3281f301ed1e940aa8aa0438bdc3870a689569c09f59f535b33eee0c18465a74d686080df9cdc9d9064a2849a0c0a24f4d2a4e150a689b87527919a8aae8302447d2e5cd14a4b04363623c8401d1a779fa016b70e1720f5d6b03cea7c915063e15ea5274c990d4f8c6448f2d605dd60d97a9343ca49055f24f34d2e46904bed6ae86b3443ceda05b65663c23ab47e9c20e0e0828b50212869c0a442c2032202a1221299509254465423df7004093c3a2e35fec8c6267575701474093ae16606d9913a55902aa1f8988559a0a195a00b9abc4d300ea8a48a00375520bc3e055dce9c3c89c2c680425f837e12bc86bad2900440f6bb6fe0c013c647991d0c2bbeae9499b3ca4785520fa421248990b00b85ac2e4baa48c0b646034b9a1d248230008771fd6900cf8e071c6a5408a0bad161c3ce015e108448e08c99130b9b047e38c0692306cc7221fd26c2215ea670b0f1c094515e94b8d462b80ad5e78b9214ac8dad8a8189f3bab1c315016f5ed4f121abf4042b7f50e7a10d0408c005bdccdc1ce5d6f8f14520b2956880f5811416085508f5884d0b2802a664e8d3e20f1b435b77e2082004dcf3e1d20e0f2c4a352988243424e07ecc6923848cd9165d1f2d67a298e151a34a5b5ca2b7110564207bd342eb001969a3e4603253245329b90e2e9985610727014ac85918c138d408b534c1895061cb5b9049422e19b1748cc10703973013aa9c85d021a30396d84a242f6e381c21f426a7919ab4ccac22850f0a4a7468dd3a1835424b03c613b0d37b480d8f004385542e5c3c12a0c907f652241637a6b0dad0e8002c929ae03141278984c882a9b25a0a0cf0e28946d7960fa708c02426840fda05245b948431b1a507aa38250bba408f003688e8235cbb2bd2e74f8083400b481456f9b068294206cae735844429083e251974a7abd510068ef215e002a61c48c5982903a501c8250522e5b13307121b611143322090f1fd247c1a01c9ca019dc87a323c6811e0a0eb18255309c5bdf4858e599939d21b93af480f0c80c70035ba2504c455d80340081e5981548189e300002b1c41a7d6da1a2b08ae55719868129642e25995d2a0a4464bf3b5660ab5016dac8c8fbc21082184470264c16d8d4c152081a7e113b42b451a802dc0e58381176cbabcb4681980d471a2248ad688638e81553dd5e6cecc9de9bd03f34a1e092c0075962a84c3845cc47271e7c7038eba54040d41b2e4638b0a4fa95aecb1e285538a286aee089ff4740184e6c11f5243da264c2285c0a91571f8944a2aee2c5054c5e49eb122a123af8af6e95444cc4d9852b391e60010be87418f31376d5279b11c54f4120d0088002e742c6a27465eb105e500811f98c2203ed3e2d9d2522607180a3c5678000e706465c5e79187487e131da30802103156a1c895552ae15449918221642a3f77690b7052f1f62a8a2431432744a4d060258c0fb311872cc52948f3cb534ae881a8ac2cae52dc304e46eff96dc36670ec5d5959ef2b84b8873b8beb236e8613eb6a3aae8fb83ffae197f16c7968db3130cf138144639de7895fb6eb3f041eef1c28ff13350af3e297813130cf13df14f51335ca6b65656ea5fa6ddff747ebbd8b751edde756a38b68fbd47bf7b535f2b5b9e99d54918224cb824132c77df14ef6278ddacca4f1e3da7c3eb64b6c6c4b7aef3f363536addec9fe4d37b46d38a76bfadf3128f59fd8bfc3e4eafc97cb69222dfffc0f873186dcbda6dad334c2a0d3629c6efbdf05d9da14fcfed1450ffcb9bfa3ef2210689ebff45792d5d9c3b514c13bbb207d7feabde7a9f75e274ebdf7b0dee5ee536b83e76fd4fc9564359e7dc342dc0bd5a0a8a911912b2b3b51e30ae0fd8b799e98e7892b52e479e2c73d9ce78943ff0243ef388efb6159191c171da7510481b73d93f70fcf69e2264d2eba0430ef0414695c80f7cf6960fc8bf889f8dfa515f1a171426384dfbfa1f79d89fafd7eb9fd87c37f575666cff5dad176c3bf8dff6f17f5b7b373fce8e1fe9f81f8d11771dc0fd17c6661cc7c2ce0f85864f1b108b3d4dff856903e15483a9621edef1cc5d0d3776e9330d178c7b8b1487ed9ae81765ed340233d3bc3faf6e4bfb3e1db5efbb2ed7696f6e97b8e946b5f5606138d371a9921ede7606e240273dc0f83ff8ec4c743b1a7e3f7efb625f5de8bf4c857b6c857c6a5775f19580f52efbd041ef5c6f8dc2c372ebdb779627a17d4c3b712f2b1127c88fdb038d7d9b064f78f887bbcd8cf649d01a4952da75d1f85de35d8759f0ae6ce4c2d1f9048199501816e6f6b72712f0de0fbc22cee6d4e0e082ceb01a4c1ee4b5bdc852d1b711f6aa7f78ebbbd771161c2c0c1de11458b9e98efdc83df3f98367f25596edbf7204186081522246890a0403d403d061320754be5269fc9fedc02f095f99f9e9f5e9fdefb823b4a88f6edc2774252effdc41d35bdd327a69027ea6af4de71bb1e339e48f39d507befc120595747407f8f3a7ef7f81c87473f2ce2741ae97befede9bda7a7f71e02797affa5387afc76bdf7f0dc21bbd4bb49fa14414188265dead911d57b5eff7f9bf28d81d529febca68bf65cef3d3a26da74b24c4b47f79968511c7e21f0fe73e4f49ffc7b903fbbdbc623edbcf75e1aa7f7ee0be3d37d6175ba2faccd031f0904ba8f849bee2311a6fb4808d07d24a6741f0924dd4722affb480cbb8f44b0fb48c0f5de1d6435989035a141ef5b23c874df8825dd3782d87d23eaba6f845cf78d68d17d1d0c755f073addd7014df775f0d27d1da4745f0724ddd781d87d1d82ddd7c1adfb3aa0e8be0e23baaf4386de3b840a12286c55f07da575df17da7d5f19baef6b42f779b5ea3e2f50dde785a8fbbcde749f1799defb040d163858e8b5e9bd67c00436bdf7d6f4d2f4de43d37baf80de7b6726949595f5de33d37b8f80defb8232fd1f3d9bed1697d3449acdbeff8de3596dd3387d47a7cde8bd1b3b99316216fcde7b617aefbd2fbdf7de97075c4800eafd4efe7f68bbc9435bad9e917f1c374343c3b387ffec38acdf70b936bad8e06f5f6410368687e5a8f7bc74e9f560f0f71e972dbdff1091d77f6844b0553e304abd0b71ef732f93bd57034cad3f39e20383d073bb964343bb3f9cd9afd784b857cb71cf867bb6fab3e1c3a1195d9178abc599e1706945e2fd8745fa9e43937feeebfe5d576786bfd11589710d3cdb2dcffb6e5fb6d1f22f27d369f86de7b177f1bf8bb4139d61cfc9b817c2d5363d3cfe18f6502ec73d9b0f6237e7f5de6d741f19a23740ef3d2dbdf705bd2cbdf7b0f4de13a0f7de95de7b5602e8bd57a5f71e95acde94de7b52cef4de8b22c6e7212dae3f8e7f60cf85afc3231f1cf0f438793e0e357aef64de976b2cdbc7014c887bdf86093ad158932a540089c6dab721ad2b43efddb7c145ef649982141b16f4b4340d83e0330d4c520d63beaf077e72b7d03b8ceefbcaeb1d80de7b507aef3de9bde7a4f75e93de7b4c7aef2d51c0e6f352ebbd7b85f06548a077f2cc9781cb97e1810f03a6dec9b2bcfe45bc369264993c4696c9bff79e9224bdfba0f11e9ffc30fe7b6818c8eec320a177fcd369b93d94fbe53a8236de5c1007f971e3cffdef8ea687439a48d6f45dccfbe4586dbc27f9ba02f6d02bc37987c000147181ed020243706d81d04a570ebe0e5979365edec1c2aa9e6485f63481e7b7f343185857d342dc0b490a2426e05e12cedcb6239480f0f5e0f8ed8079deaf3b383081bfceabc10606264d24da610bce2208051ab04ce0869e0904e67db46f7dc97a0080de27fa7a41d6037e2474415dc098f53819706f6e6d6c3160aca9bd70f1a6a19d99b560b142450a14656ecbae6a8a9e6679e247368665c2c31a58f7ad81f528dd305370464217a46595593f04d68f143152a437ca8149bd3c3d3c861c742c22428608e9fdfba071182b0890089508896af02bf4c04748d4fde3b4252f840ce94c0881653d481bf4a5b719d4fa387ef1d23b97256a3d895a7ed3bdedecfe754d93284e520459ff61fd876aa0a00a085089f5ded77403ccdeb54c9142a3c3b100e4fb43a7c1a83f6afde7f48d27fb7fa7abd18f96f30e585656c4fda0f043e667831859468e916561ad31fe3470ba6886d3455f570f8b44ba88cfe1f5d9ea737c8c29f22f877fd9ae81784f823d957c7b846a2cf4a0ea7a882c78436050d1ee1d47000a568d45f4e551eb1dcbee010f2cba35e24142a4c80f207744759fe3777224f1d9c9d1817544e5d501d3bf5da7f4d129d57b5eede79099c3751cd66f5fb6dbd686dee372fccabd66be3769baef0d8fee7b23e6c2c3888ec17da3d57d071ceabe03a874df0177f71da0d67d0780e8be0314749f1b51dde70650f7b981d27d6e86bd0f7d6cb3adc9e5348d19b6db2dfb33d99fc5e1af30bfe9b3d9b66f38d99ffda1cfe55c0c871eed98d3786df47534fe937114f48fc43fec8724eef1cc62617ed330e9c91ace8db73137ce62f8fff3d117493b27eb3537735873ef581f2bc6f2417f7f7fbfaaaaaaaaaaa6699aa6699aa6298aa2288aa2288a9ee7799ee7799ea7699aa6699aa669966779966779966779966779966779baaeebbaaeebba6edbb66ddbb66ddbb22ccbb22ccbb2ecbaaeebbaaeebbaaaaaaaaaaaaaaa6a9aa6699aa6699aa2288aa2288aa2e8799ee7799ee7799aa6699aa66996655996655996a5e9baaeebbaaeebba6ddbb66ddbb66dcbb22ccbb22ccbb2ebbaaeebbaaeebaaaaaaaaaaaaaaaa699aa6699aa6698aa2288aa2288aa2e7799ee7799ee7699aa6699aa66996a6dbb2ab9aa2a7d9465ceb367c6612f5defdfd4f0cfd97fb379c8ef7c69a1c30ed4d7b43737b81716f71712ff0659b91f6d606ac61d6e67139fef2cf7d9d2fda7791edeed7d5f670459d9f836b8d2b883f5fabb387f2daafe9bafa2dd3a69719eb62611dab84fc653bee1d4b0c2bec0c193c3010c77d91c488de7d4d13e93bc6691927e21e8fb4d5f0a1cffd6c67e32bc8b1143ef772111fd3644c041da91824581db038606dc0d280f585e5154680debfb1872fbe8511f6dfefd73bd685deb1bab87ac7dac2d20293a1772c1f565697d77ef13877fc314eb463c97d31e0cb9ade7b17fbfd7e61e41b07d7aa72725ea0f4743596eac062d19795b9a6aa9e370ed7e543ba1afb1b97bc9ed3707b9a409c0b56effd819ddefb8db23292bced798009b6d0c0ef1f50fe79f47c02f7c0221ea1772c08580f7a77f36e734d93cd35fd0a828233bd16bd48bdc708516f506f0c9641fedf5d0b0b9c4df71cc67b36d6396c9cbf1cc31ecb0296042c2c097aaaaec8f8fd1b1aeb2b6c5752f4de835736742bae7c564af5de8bc7dcca212b7dec5881d37b1723cbc6c6c27c56a85861d27bef644d340eed98247f4d1be37fe39e48ccfbc23afbbe8df8afeda1d85cd364274c90b74dba793732b7ebc2c89fd3353d93f8cf6d630ff2f8ed8edf4ecc855996c61c64655996c61c61e4d00e8208a2632c58168c3f0fd826ebdb175dbcbd52f2dec5eab0e3ed6ffa370f3f56830a548654b2b01c6035c06280a5000b6b0803874e25093508cc10353f3ca45093a343ee06712a14628ad890b33219b51105ec0ca15042c3a60552a6088934a769c3a27b92103168de60b4c0914908d1520c343d000542d84d2998742317210a36b472b5a86a132491954139c4a0b005c982d7a0cd07151182c455ecf67c614111e4049c9a798aa955405851a04107472508c89f086902f929d10299f2a0899da2b90880d83073e622c3120880802549e4c54703e08f527612dc48d0b2fdb09376e98809005cfc48a2a0135613158d7ec0290aa59661a1f4e3abd3fb41958d1d3e382559a061ecc5101f6ed8154888e1f7f1e3899360bbc6f6e102020a226474507cf8c04c303b51533c564a0545c0f3d1762460ca17145506a938de14d84e9c01631e5364da1a92a3468e0e349c1dca01412faf1110b50863475d5e970098bc415396c9ab2ba04c6cee149dbcd381411fb2fab0c273b5d622f5e42507dea0322d7e440969831700ccc525cf39020fa8608e4c822345bc3045774f4e70b971774a011362a004e9bad3c3e7120f1ffece5d933a4ea306b99db89b93eb5003cc0a2877e49990356cae20194129689589ab9029231c45aedcf01eec311221e04ba842ac33c218f3e8129c01128c5d6f9686e07a52e40c4c7073f67915e7695e1401c5288b97dcd828d18cdc4786dcccd8c3120483b87209a43608404780121c520d4d698e710bf03098e48010942fc28703e45970cf15c1d74ce5221c7788702c3700702040093722183f424560a6b9b1d4849a5841d5e486f538088306c1a39bccd5bde58b29b91eaa5cf5b9e00540a51e7ece74011f9134f58822c74e2b2a36ec7ad4a872c234e3a2d123c419117cba255f91146e6f49ad3450ac2336a2cb0f9ab9221232541a17266845b8a2971f3c4406e518626fe2220022e28543769b206f0f302d15b60ff8419c0647acd8af86b212765ceeecac4c5646e1093256535af0214804fe525d868b272c12141952f780117769823a2d350a341d50b25b4adde0839b3e4efa4c20322a12b9cc5db853455327e25c401a42676fa188e7071a655bf010c3565821a6aca2c30e05051a56996267805610a3a10e383afc4499606448c28f9055820ad5ee1496a11db65cc20e013b26338698a7dd1d3b39bc2ca8c26894763c3e85eab5490088c0e30da9948c25f380c7104ea49a8d06388f351e5c349bb3413426d098e69e08c1a441a2d1909728202a3345e79e32448a04dfa05bd0c1a4468d9b0174043e753ed6c070234ca02e89047912b8210ce3c10bec2a4d4d682754433d182b642592b0c7c411dd03bcadba43153a98320316aa4e801e07dc10c5a1499d4715c58010301ed58dd909c289419a92190209b080e2d1a59dfbc09746dd69c36a0680c7ab4dc02252663a2687e41c9068c20cc211a4555224a8f8a33c207043489eff74bc7e97c9ead33ff20249162a41a2be9b24476e7338d7cfb0c628094d0a9aac298f2a4ceb84553640001b331e4c34e4e3cb1557bec993d3e4ac31559598f04bac00261a35ce5ab88ac9bcc973b1a5ee8c8b5202b03320099fb86c48dccb498ca298c1798605f5a90cbc08de02a2c32b4efd11fce170d282a417009b5e82418e54bd4927f840656863527240f25406a9795804c9f33950f9117d1e89b027f0137c40bd4362030b56304f70899b9adf12126e827165683cf912872ac82101bad7d01c07809e2c5db2830034057c838113a9b237248042a08cc9a023d40d542b1a396ec28303b8e392da8c0b9ee886ec28a0019abc3a5a8776e40c6690052941dad162070430c40699bc968e4744e8da385f461d606635643ad8fcd1c1430526b52b9b883a523a1ddd50b1510cfc98a3d0a52f505a7138725c19a276c78c12901cfe047325d15a99c3441b0e0814e4f824875481830f1718727f3a61c101850cad0e8a085070d0c001e286a84930031c645e6ecce9d2c002011372c3c879a3ed060631a2fe7081616123930d3666272cdc49596323cf061a1f1b15d41a926a8ca961d770ed6a2c2045b7080a9d164c743211ba9246043400c1285f04b2e28a06151a38b4688838e44a852aa9c20c534543b2892d1633eecc501247aa523083981932289dbaf0c6c5a719739d2a65a859a1ca3177c0da1a1156fc04990b32f742f8248ecb26624ecb0e041d828a1de42c41608425bd89e5ccbcc9e113e456b081c2e601bf46ee01589c230e715fe2e8b834aecb20e443869541328244192570f4e43098f1032e15dc1e382740b819701fb4bc857a9373e1adc81bdb9b5b26373513dcf054b89dc96e14da22b58969abdbda37050db06095aa4dc14d2f993d1536451c8c658a5c34b065618bd94ec46015e3cf568c2905c4b86116032c118c5230ecc048024386860a8084c803c058e384afb9c9b10664cdc51a9b5aa5a31a015eedf6a4a6a28c9a83178d5e787921d4f40275e1cac5201701607001742106ea45f5ee799b60bd73ea4b5249039516278d485a8c343406d0d2a0dda199a14d38837426e68c78c69e6181019288107d2c9190c45a8bcc7e4888ace2e187899416365a80b128d57b3f5163f94b42f6dec9b1daf629f913ec0f3829419359f7cbf7c7e9981e16f33ed158ffa227e2fd3aa76ba32f099e4e260193c7fef6c23809912099d7b42df7de83e4fdeb7e5ed349e492c008068ffebefd04bdf724e8bd1701abde7ba6f0b62948ce1ca9d4ef1b48c82ecc7df1c4312f450a8f2385b92f92c3a1595959ef21ee236a4616a048f381c11c236d914144800c0955feca0c7022b88942031297c7805907c91cc9daf283e2a6c1253692114155a30d4e38c983174047f20862c0442d91dc9e1f6f2641e01583d16a0e17101d48b8430510fbb18a2b85991d009452e06408c1448ebc0f2722c82a93705a61834b8de7118836c12f2883bc3ca508d32a075990081c58d0364f61a005179d566ef25a1e5730dd4a268e42919e15402b497065aebe86bc5547f24803cc5f4ae0536fa860796002d59e4673504aa8e86adfc472e4798e68e8a8ab8006c21d398b952407344d0916e0db14777f0803cbd12086e342eba957e148035070aaa205745d760c488b20ae6e85a2f60ebe83c5aac6078b5834c84cd4c9227825d5a6573b4a695894a2480bfad8c0ab4e8ad4234386be2eb428eb663b8246fd016c40419342cc0fdfa15349420dfa620a14030ca8986be54668c30f0f29d4e4e886340a7a12dcf96dca2f0ce25428c494304d78b0ea26b8a2874309ad3219b51105ecbc11daa22446f30a06130e25346c5a2065ca9033ab223158e0a751c030a769c3a25b815776826a16b801c52592169a37182d7030a0c5772aa5800f9320470e9662a0e90160495120c1eb0b170a57a260d8948249376e29c3e501036c4022a191b4b5a195ab45950173da38f81a83458bd456072b8372884161b3e14546d5102c54060f19f01ab4f9a002022606e00095e2c00493d75615bb3d5f58507cb54d624fc170d4c987073835f31453ab4a5c103bd561010f914a7851a0410747158889ef4e182721432ecd71454813c84f8976386902724e96990d2deb41133b4573ac4a19507e8d1d4315572f33672e322c81a08d93971f1f39d274cac3952491171f0d769099f342d1950ba44215cab293e0468236861c560d58a0c9d3432a81afb44b474c00f09a8a52fc960078d5094497824e584d54308a2201800e3022bd0ae596a528945a86659224082adc2470d4d244c257a7f7832a1b3b46184f18211596ea8c565792051ac65e084952028a508f9caa3a677cec0a24c4f0b33354905a2cb0f2721a9e3809b66b6a04460d4ac3bca46079b80001051132ba27861e70fdc8bd28b385cd076682d9891a1b120e4f5b182201a262432a28029e0f362726145518c2e580ec7761ca17145506a9404183c58a43590cf220a04581edc41930e50469af7e71022339cb864c5b4372b4480061b2886163e0cdc10d0c1ace0ee580a077e6698ddb184ff7504d0b885a84b1a34e5887eede50278c06180e01307983a62c93e3d0b321023e93c0500c059489cd9d9a3365edb719b485ab013f5a0e0cfa90d587558bb2397bc000c9ba83d561ad45eac90b0e2daaa0d4d58d79a2d2254399163fa28418c006382689a810a272215b3017973ce708115e6f5e681c093145f6a0608e4c82234514380e10a014a34644c2645074f7e404171b842e84e5ed31436980af2d054c888112840bcc024a0475256b6a5d1ef85ce2e1c3db19a015991e03148d2d4078d5711a35c8ed97493e12a56bc41fd48d4bae430d302b9e7c82a357e0c5ad527a649d0959c3e60a921cbee48f99016211e54b41ab4c5c854a254952a65eb33ef86db814b972c37bb08707231922e876103b8cc822e04ba8429cef4c322343cb4da94da1bec63cba046740844025cab82179f3f4484dd79ba521b81e148ceeccb915e01e2cd1f04d7073f67915573801089522296c6eb434bc28028a51162f41bc52d8e1740097db91ae468966e43e32c85ce5152451eecaac3e630f4b100cda3a8276c3b74ada018a8a06521b04a023208997466271c00090d118b95043539a63dc82211596fce1a00214082c1f26392004e58b7e19976ee36aee536fc3007916dc7344c4844965f4d46a8e00fa42a672118e3b446e9e54515122a3d199d372030007028c504609d08c17395c02b8e300e347a8084c34628a5a2698606474f260a80935b1828a4991536bc6dc384217c895961e0761d02070b4458c2e4e262c355f4c0eaeee2d5f4cc551a1a4a709dd05932b39185cf5b9e005002533995e85f910e3ebefd83ad3057c44ca242a8e96363829ba3870ea20c74e2b2a36ecb866f4e972606c940028325439619a71cd28608174013a3a1169136c9d11c1a75bf2cdb9f1c3494b0d8745843ce0f696d4caa725461c3de080e9049c3b2fb1115d7ed0c87dd952a98110b60720f8c345864ae3c2e4acd385352f868a7d800ab2be662c0ae22aea9057c6c90640c8a6c0cb0f1e22837208c132e28f18b62e5c0d232e2e0220225e30a4c683823810d0f42965262bc8db034c2b459303681d616608f728f9821fc46970c48a852394086181304b237469282b61c7e5ee56a4c941fa29150b9395c9ca283c414c489910e78b0e25533eb86958f0214804fe528c174c5c4d108188bad6c5c51316098a0cb187c42c84c4f412617c30e22e4d50a7454429ba35b50674469b06341d50b23bca982f1199d6007518a5e9c207377d9cf49110870d92380e16717af2c907278a8a2291fde749171d5f26c9486167c3dc853b55347572f00eba72684a9108fc5c28200da1b3b750ee0230789026f5aed05a1f68946dc1415851f026002db55eda1c07ac105356d161e55c0f32e428b0058c120c69032d02b1025489ec0033807c64ead4486b8a9d015a418c8098c25187c7a038498c1ce0e8f0136582116f640cc7021448a11885c18f9055820af52b51134d19248820f4640bcbd00e5b2ef14352fde6c2965143e8c0638156431aa001ee6923245206236b6732cc18629e76778620b2f14acb47ef91922dbc2ca8c2689cd0d283eb508541bdbb461e44f051424029b63038a3b66028b0c5145c8650bd36090010ec94a861c1e602c287c216a9948c25e360d0074c136a582a07287ae044aad968702ba0e810a6283f3825dcbc907839f26127858b0015447a20000193155c349bb3413426642171d56fbc3201e6cc9a7b2204930609ef92a5ab1d02d129ca17798902a2b252742618314fc2c44682c1e52943a448f00d32019278e82232a60645161d4c6ad4b8b171b2c0224e680e956a42e88b4f9d8f3530da2c60baa548fbf17557a1ab2e89047912b811e30699560aaeb0f923c9e7c10bec2a4d2d85da91565cf0f428c0a4e117625b9551206be1e844504f96066857a8076385ac44a2abb360e3ebc4b400021f1347740ff0b4d4c4dd6bd848f1ea426543850ea6cc80815a033707080c21526023177a1c70431407264e086055a2c872c7517da8a21810028623311ec8f69c58133645d5063b413831484bb2c8cc84c8ab8b021c3d1724c0028a471756013e4654ac41d343c7d7822f8dbad386d58f5eea0a8cc90d371d38f078b50958448a09f5830060269580d30a039343720e483401c4144f69de3070c74f2b2d479056499190e2132eaa490e3802ac72070f08dc1092e771516bce58990be1a42c83d7ef3259799252ca89036877461e49b0f50249162a41a2f0110938e1b2435116a10e921cb9cde15ba17acc401340a14d9ece645863948426050d041fdf0cb407733cd8d9caa30ad33a418d5367e6c32202d9ac7810c0c68c07d30c5212b6b8f150cbe26389d7cb1557bec17bc036a0c728304709be70b168f9a93e81704081824344db0fee9435a6aa12137a3160cc18201c22d578ebe08589468db316ad3835fa3236c1933d42b070bdc973b1a5ce447266085d69233ab5b2a404606740123eab03a79a117a22e138fb1a12f7721293080135195b3dce074c74e93acfb0a03e95f90dcc9ced4915a5098cac547240522412b8461e8403ec9010e68106101d5e71ea8ee01cf97989526b4b8b2e389cb420e905e85041f9993b75d685c8a703898f457d49903f7714e189f5d244d030c891aa37a9840988ac6298a2a42e8077a10c6d4c4a0e48f113324838bafeb861e51ba4e6611124ef4dcc135f26bc4551821bf0263f43129c3aa04b9ab7457ae060e85de8f348843d419f543048e1146631353d2df50e890d2c583a12809223029d0f34ea3880a02b0b33d50526e582159a3d2a9d040c6e6a7e4b48b8d1f0c0971f0854c7a5145a65683cf91287ea028e039eb84911c256724880ee35344754a92a735e1843caa3270c962ed9410096da6304f208f3ca86041eb630702255f68644d7c16994a7573f4eb075803226838e503d06380129c60443ab62acc9503472dc84e706037a1610531c4306816e0b00f5072780015faf38b9ed31e28478c983da8c0b9ee88450d1526faa63d132bdf26a8026af8e9621336b1e808babc2254e162e0633c8829420794000076e3cbba06a4dd68234b0362069d8b2ac8995d8f25631e50586d82093d7e21a41c998b5ca9651848b085d1be72baf142ad31f0a0140314bb36635643ad8f8d144ea13974805a8e8aabe546052bbb269f8a5538b081e38e3b78071b96a6bb0001c8d4e32105d89e2c057a62359868a8d62e07974cc7aa4dd746a71d6af4b5fa0b4e26eec11c629837b6286098dae216a77cc28fd40444e910017238aa8e53bc15c49b47622525b0b42626f219c1835204941683ac3f6844da20a67847c411b7541418e4f724815299e489250c7152745a67c5c60c8fde984251eb395c28aa15013f86c2043ab8322c293465e9290d9b9b4800f45179c70b17202c5980a9c58ba416f32c02cb41e0441ab3181911b8ed55683546b34fc0d93600638c8ba1c81c3878e04106caaa4c0d0a581050226044b552ff8e0d39333a5169e1aab9283b96515a24e442590c8111c9e9849e535e80d880ac8984c3d68688984418ca83f5c60580c81a0d0863824f27e6c697dca43a3f13a34031f5c5015176850a50e66272cdc495953cc32c1d4933964f20032a422caacba4d8dc014e106a4b123538c5b394085220bdb13aa536d802fcf4ac14407097c796a66a99a319b62bc5d09a1969661d0a44060d21221e4c0a56081c6081876cb51a69688d89d37401326787567cb1ba0873a34aa7e0688adfef1fbab587570e5e53f4ce92a8f314fae2030278220a72c5c6d707054c7a80652e0190ae43d75d8ca5a2196aa8f9b270e10626533f2242a8305af56164875f9742953a53e6c4726a839c5c655081f81c181219fda6c290a2195ea33262b4c2a3a5b60b3dc1e20361cc8dbb345ce17173c36e894a9884314809fae289d55882e18e58b40565a518a54807001096804467c0f467c699465e8828b0fa41b315224d8a2a1858a4347dc7c7954f41035b0c0ab4a95ae43ae54a8922a94adb64820177119cf7c4543b289ad1500603120c5578b2c1d8934784ae328af43212022388d4170a8d304412ec491aa14cc106682501cf25451914480423e4aa72ebc71e1a915934d58ce986c9a043604d0c1099d1ef80933a21ebcc8036a985ca894a166852a870844a63e04bd28a5885a6b6b4458f1032494041248fe249270ca0987333662967cf9a52d50264c992617717818844fe2b86c22147092d136280e234a55b4ec40d021a8c881cb9c7c4599890a6b671c2030c292dec0566ad46925b6409033051856e9f8b426879ba52d41adee649053455b64181ca00b2261930547267c6cc08f021dd84061f3805703c64bc6a72e522a0da5647832464f985b88372f723b1808582b756f8969e0d791b441ca50875793c4c1a9281eec2c4010b3212806a62b34d7830974367981b88976d8b81088e02d4173c708e2c0a5210a023f5382ca108d0d554172da4d59172418aac1677822429352261a9808caf1c273290d1ff5b8c9520144d220a541548a0b8b178db4842050304675562b84041259790cf8fccc18deb1c10eada2f496c2c3178e9e1c06337c001212e605aa2a19826757d700ab16a4c16c96220d7498adf1e293b54057006b170dc03529030c7579d8a45f139092514a821daf7e28a99f28702208d9854504251227869c84da1a36a6070a11f1bd733225d193251531d09a116d521ecc1ac4e85994c02b1c20d65430002993103cd2050d87ccf8b474c57120c349f3e98b1d7d0640125581cba7e3cb113f78ea805a626503db93adb53a71e02c8d1a099262a98c9d0b63c4181f59a1a2618dd138c431cc19a4b5a1882a4b6866d6e8a894c813762990bb21021aca1557c219281af0ae543821f5c1f0b303c992a0144a200101a2e9d1e7156a3d199466d397f88baf95d70c1289ba38c0414deea22ccb17b9012ba9664c0842e807863c628c06f9f0e2b0048d0e4b63b03c82b55adda9e04af00246a3516e846c38dec5e900ffd12465d5ed9311e41321416179486dddf492d94f6123eae80481004c71f81e3818cb14b97cb9f191c3578a822301a40c9b767038d5a6ebc6a035333768a83ab1c056039b36f53995a606a64c94da5b05ca011e2a85a917d0219af51d2e263d00e5438e579036535d827475a8902f5c8e460daac225afb8b1a94d8b4e2a579cd0a089209a65c19999e0549c0940d5ab0e1f14c9004bbfbc1ae0e135410b517a5c09c045c827d7012e069630e12284c8097a6a5d30244a02b02c38c3a1a57ac5833054945ebbd420505f765e705d095252a83057e5c19b2f4a595dbed19da5567b22f4b06406468a9a012d7c1a2a0012226b0983ca4daf8d05d146d7b043c883426552e82545b6b0311458965ef37ff7bbde6d7dd97ed6a342d6fcebd99a396e0b8167ba04abd21bb3eb0cff169d61b884d5d8a5f4b2f3acaa326baaf3accea6da4e6a55f42cdd5445dbf33457143557b535d7538de734565d8fbab1abc09bce732ccba5099f311cfb5295f49e70fc630fc7a569c228acc291de793e57d9fd2bfa59133ee314d2dba61f9dd39945bffb4bd434896025f0aeb17bcaf367e1d595cfb98dd9920ed6a3773e51b36cd51fc766c9c2def5b94ffbfd4c1368b2281e2c472f3cfbd5c3b1877fc99ea99f5b530e56a3b7553fccbab359ca68caa632d81c1bd801588c5e753e659fc6aa29c76e6068271bac459f7567744657365e4b595584966c9ab6686ba6ae79aaaa89a2ab6cceb3f76979ce7e2dcf19889aef1ac44af4b2ecda9ea979fa765dd7324611bd6be9d9ef9ae787d33595517fe86de7149dfd6f65592ed995f58265e895cb159dcf196de5149e5175fdfd80667aa2c12af4a6aeea598fa6f0a9965ffd6ad926c122f4c6721ba7ed0caf6d7cc2abc9dac01af4ca6b2acfab4fd9725dd7198e05bde859ae6bbbae6ddaae65ec57ac402c9b9aa679a2a65baa2adab6ae5bfad94453544d5bd95c67338d8105e85d4b336dd755feb3eadb55867fbf1668a2a7db0d600f0bd69fd78cd352964db485ddbfc2288ce547f631ebcfefb26cac9a6c9fd89ce5133ed1f884ff8fddcf474dcfb2544dd56c4d545dddd235ddb2857db9aaa769ce5f8eb560ed79d1742d515896e5d29463ef4b216bba009b6303c359330d4bcffb61f72ce5d697253cb7b279b2e6222c045e54fef247bf8bc2e5e963d72d4d285879de734e4b7865dbd5abad8c85e7755d369effe93febcaf1c9ca4214c6baf39aaafacbb22d5bb48ce5d845edbceadcc6f0f7b06ba2685bc6e5eff7fb01cdf611569df75c67d37f1895d9effe5335cfc0d0c0ccc0e0d85223169dd765cbd385cd3476bd6ac2abbace31d1525dd9164dd995355b955d51d65ccd9995e1bfb2701acf2c7b62c979cdbfc22b7ab6ee699aec19c371ded584cdf934e3b62dd9d24de99a06025736b3b337b617eb8c05e7655d573d5d9faa6aaac63f8655ac37ef5fd3d4cf2b5c9ef201af3ba770e9a6fe8c67d52d5337ef59a62e7cb2de8d4d9755e7b4cdfbbfff69599a320afb198d55216b0e87b49d8b16c132e095d9964d51346e63768e55d73c7d60b179db143d3fbca26959a25f76597ccd0ba3f22fe3557661f864d952cdeb4dd4976c2ab7706ccaa5baa6797dec55d397a98bbadeafe717b2a679c442f3ae1f567f19b730dbba6abcae42d6447f6015f0c6a8eacd5646ff9fd916854f216b96681ed69997f5281a9beb97d1b5f5a579da5866de123ecd5695573865d5f44c5d21016fea9e260ac7f1caa2b119cba67ae258655e3faf2e1bfb8faea99751d8b6c9bcb397d5d49c510fcb298c9e3db0c6bc72dbce29babaa88ccab3d99a625e774561949d53d8745118768958615e5536539945cb355e61f9cf701d98b7347d89ce338cc2f30c9fa989af3cb0bebc9ff53e755b9645dd5976e7f9dfb82d644d3b2c2fafa9a22ecaceecaab2decf3ef7f2999aa9796375795757954f1586d17946e7994d85aca9f6fbb526da1b85c5e54ddd15f6a76cc631aca6a5ca0ef1db6c35b7b433dab2feafe7acc2a7470790ffdaa2a667e1b82ce3f684b5ace5e9ae6a5bb6e589a6656b9e695bca698a96a7599aaefc3f8a95e56de3d344bfcaa6a74f51f67f216bba88036bcf155858de586553b85d571846d592fdfef763ef7e3fd3049aecdde96209f09a2cccc2a559b625acb25f8e5dc40043035373d33758575e38864f59554d7936671995e52fdb6e6e69a6c0b2f2ae1f85bd2f4d14655b987565bb46cd2fdb6e698b15c0eb67d96d4bdf96f059c6a6e9dab96a96a6195615f357635179d33866ff3aaf685996aadab242763561d408f6fbc1aa110c35cb604d79d5f27f184dcb5985d9138e552971297b7366e1553dd9f83c53217bff2f8c3d5a3de3f74313e25e0dadad64d30555b0a2bce609b7adcbae1f8ecb1566cf740d0b8057453f3c7fb385591fa3ec3c4379e13335e134f53e2e5317f529d693df9ea53fdb9875f136129693763d51184e5bb375bd0aff3a54ed2c4d887bb5df0f968142dc0b5f556d84d5e4f5707ace69ccc6719cc62dabf643035303430393039b63033bfbfdc460317967f6c72dccaa6c1bcba9cab24b5e359559539ecd745efde9d1341d62294151d46551d6355df374cbf2745df44c5d7fcae899b2aee97ab5df0f6c8ecd64efbc8895e46d637776619895675376db7468cfc0e39db7716068606bb5512817d3bf1fee5700b090bc2a8bb2672c7bf9af66cbce6aaddb0de01dd691775ecfb63d57ef4fb934e5ff7dd0b869b26e37802e96915776fff9dd7fc6708aa2ed590a59b0b91760bf5ffce5dfef67964ab08abcdf84d7d5972bbbc6ab6b9e2ab0b669f5c422f2ba2b2ba369bbc6b077d3d2cf4216589af96de3e9abb77467f69ccdf2a3303bab6debea5dbffacf34966136465b38455bbde8ba9eeb3affd597adeac645fb4efbfd8af62dbbaedb0d60af486f02f64c4bd33c53d74dd73555cf744ddb768ee1d394e332f5f28a0a59d3880351d74c4f82379e577955dbf8f4b1fa4fd4c3c5c1b18181cdb19911bc6beaaab077d7f65cd3f264d5faf773da0518dabc96c7e699a5c7ea354b564d67734d67d62dbf9bfe7e454f2c4d2fbd55ef5aaee857cf798d5bb72ccf53ceb4d453f5ae25caa6e92997e78fdbd99c7fbfdf2f358126a81e04af3a7bd594d5d385d1754dbd2c644da08926e9a57ad9d6457d9ac2e8bcfad4fdb290355b233d54af3ccff3e97a964d4b8fcaa82b644d201aa477ea4de5f5fcffc7260a97b22fbf903581eed93bd27be02de51556d9354ddb58365b592d4f53ef29c72e0cab2b9cca7e5de1b9d41bcbeaca96e7874d339ed92f0365ffefd22c4f1325f59aa559b26c0bcba5fbcfd9bb42d644eb8d7a539fa6e9f955337653b7fcbf25f61c78615745cbb45d63557655d397763d51effff28cbab3673f8aae2a2c0b597335db7aa1de358d5db4655378fde53f4b2f644df9d7783650f6f6f0f7cb7fddef0736f7e2d3f7dcef078606a69e36de9c49e3f71bfe7eab822d3d506fdb7af4ab29fce15f9ee93c37f09ea6a9aa693bc3f34759399dff6dc4ed610c6c4f60d108b4b3ed217b82cdbd0093018606c60636c706c6e6c232eb760378d7fbf4ce6dbaae2afb51375dd3d49f42d604935923189116e2bf3b3098358295e98d9ea7d79f65ac9afebb9f754f181dfa38ad5d9c66afd39baebe44dbf89c5b553ecb325e2b4d604f4d8fd3dbfadfcebf9465f9c3f1fcd94d2fdca2269cae2ebb9a721a975ed3dbc25e9561af9ebf8c4dd4ceebb5dffdf335a27dbb887f51eef763d135bd4c2f8c9e67ec57d555e3d9abac2c644d7bae7fbff8dffd7ebf9fcae2c322915681a5e97603d823d263e085d7969565749557b85c57d70b59b3fe4360fcef5c5305025b13d3abca28dbc2a6ec65d36cdbf85f7ae7193667975dcd1fb3a6cafe055ed52ddd1335bd2c97f12cbbb2a557f5e57ca26a79ae72a537657fccca739ba230ea9a3ea6f4a2abe9d5522ecf339ef49e72bbb2eed9b2a72acbf18715785bb585539485d3ef25bd71e9d75685e7352e5b585523bd2c2cafb03bbbf069a2688aba90de734edd338ed176363ddbb66d026f8c9ef0cac6f2c9962cdbceeca3d74dd7b48cbfdcfe582de37475f496e5874fb78c65f79fee3fd5466fabc67039bbf05fcd5295cf94d1fbd75976d9afae65dcb2b08c2e7a67b33d55cfba68ebca6cec2a7a59352dcd1575cdb845fd8a9e895e773d63d43567d9544f739d11bd2aaa7e562dd315f670a97af3d08bb6303cafae47e5f8a3ac30a7f152b0b917c71f83355dd434f496b3ac7e353dddd89fb1eae542af7751b434e718febe644dd5468fd0fbe7f38ce57295d7d4ab3f9607bdb03a7b1fc36a6cca72abc6aba0f794ddefcf394de1d66c7faa067adb585d4b734d4f758de3536601bd710c9fa88cc26979b67159d3c09f7bd3fc839a258ab2295a966c6abae7aa962b5aca250b9730eca6e969ce3d3f6fbbaaa6cbcafe97ac6f7d3b0b59f3ceae5d29f5fabcee5753d8fdbe3cd338fd7776c0d9ff21303569c450cf15518fcffb59b684e7d3a3ff5463532d5db0b9176bf75bcb9a6b0f82de9eb74d7febe7f36463d994d93816b226d0965b1d3d3d2f7c9e7e85bfebd9d8355bef85acf9ebe40f544fbb87c0ab7ed69ff24759d3fb336ebf9035d7b997e745bf9a96deb77e4ddb58fda5903587fee738d06e688455136ceec51c1b589ef7f3da46abab6917cfeb51f844db999d5373455b34bef39ee5b99af33f65535ee50fab42d6acab81abf9ebe4176cee05d8ec3f1b1a180d3034b018606860b9b1edf7bbbfdded89f38ffbb2edf6fbfd7e3fb5d23cbf6cd7a96a9a585c7a76deb85c53143e5d35454f74f6729d376555186565d65d59933de76fa4f3c2aa6cc2aea9cae88c9af147e7bce8ccfa7fb2ff6c5d2fb3dec33d39ef6f53afba2bfbe1b88d57f59bbe17a78cd9364e537855bfe9cea59035d3952d126914460fcebb9e285ba2a9d9caea8ca672f9e6354d192ed7d89b70e963795dd3035e136ee33875d3d6bbf3d9fad9cd8bfa96fde88f513755cd0fbb6ddeb5fce6397b3f7f582de7b934e0fdae39c373799af03cb7adccb279d5d695bd7ca67f2e4b3565d5352f0c97738cb6310ba7b1eaaa7f35d5bcaabcfa189dcf725567d85de36271469af7fb15fd2e1b7b16354df65cf3bedafdf16c36a2b146d1bc698bba5e35cd8fce32dccaf01cec15f0c26969a2f0acb2f0baa6ae8b9ac2de9957756513fe71e9ca25eb539f9a79d1b235ddf2a366ea12f07e597651d8c73e9d4d375d5b216bb660732fc0d2959623dab78bdf0fcf697fe7bfdf9de375bd326fcbaa7f7557d42ccdb23c4b95cc2bb33efd739baea9c9ba3f5581aeda1bf3fa9faea5fc6394855756c5fb357a7fb93b97334df6ce7154ccfb6354fe73da7ad5af6d1ac342d66ce7dce8e2f9fdef6a3b6eef1c47d15e98f7a73f3ed1b62dd7f4cba50b03eb3f64cd63d18e5530593582cd81c1aa11cc3d7f0fcc6bfed46451799ed7dfba287a9e2d7a5f5e564665556de7d27561343de135ade7e5fd738caeeb9caa6e0a9b6c790253f316c6c44f5cdd5e97d7454f6fae29dccab2bba62dcce56ddd158de718f665ac9e5f3ebd70cbdbcaf30ac368fa51d44dd95ff6067859dfa66a599eebccce6e7bb2ab79e738dad3f2aeb11c9bbf745b948dbd47d11ccff27a1435651395e71956fd6a9a43db86b1bcab39c7312ccf6639ff566555d5ed0670474f80d754557fb2a6c9aa730cafa7a787a579e5954b578e7d0b9b2d5ccefec7a8959785573f973ffdb1fb53f42ccf00de386561d364e7524e4bf7a7feacf29ead974b75feb0e99aa93b7f216b9a26dba3f2a6299ba6e7d9aeae3afb765dd129ef0a97adeba2a92b9b2aebe3f694f2badf6cd71536bf5fd7543e5d20703da3bca809bbabbbfe1646cfbfc22500efecddb46557784dbf1ccb6999f6a0bc31dcaefe9451d39ba537d7d63c7b4f5ed5744b984d4f574657f4647d11fdf59cbca68c966cbcce1e4e4dd99fbd266f9ca6a9c9aedfafaac9bae8ed85311068cba9a9de39bef698bcec39cf6969a67f66e17ffeb3b7e445d9d49f2abaaea5699a251b0b5973e8efba9fd7f4d9f6949826ba962b2cafa8cc7af6b342d66c4fd308cc8973db4bf2baec7ac227dccef03cb3679cb6a709ec2149e5b26c5df6c3e6f95dafa6ab11f8f1db17dd7a475ed5fddffdf2fad1f4c76cca9ea85acfc80bfb36fdaa7aceaee953349d85ac89e7b72f02e59f03655f74cdfbe72e8b5e9177567f19c76be9ff797e579e6b9b48b463e0d01369f754df1e91f78c5513455b783ecbf5ffd2e738cde60e79d5196557d54de7169e5defa642d63cde79fdd5fcb7ad9077565775fdec7996e7bccea72a64cd354590579ecdbffa962d4bf39b259cfe61d1385702794d5666d5336d53796ed5599533cd3627cee88fb78de73996cfefbaae8ba2e849fb7857563edb585e4fb6655777fd3f2f7ad94cf670bf1f7effbae33bb7de8d5776656318455b735dcfbcf784d3ff6338553ffc5b7536cd5cd5ed06b006deebbf7767f6c3ae5f631376d5f3eef5315bc668ebca6efa61549d5dd3f89e266cc2ed3fd7f8ab71c9aa724de3d546bbce5f5566bd09a71e86610fab686bcff55a4cd71eeef7b3e79a06b26e3780337eae72bbfa798e63176e677975110796c6f7eb96ec09cb28eaaef21a9f6d8fd74dff2ab772cbb2717cb2b08c9aeb597cd9b2fc27ec3d3ac3dffc302a6481387d9aaefdc62c9acea8373feaa22dacca42d65c65a0bfeb54f334d9fa2dd539f66529c7a7f9dbd3c342d6ccf33e10b89e387b7ba11cf185d3769e4fd635d515feb09c0a591358a266c3b7456318f6ffb3e6373f8ac242d6943f10789ec3e18f53bb17fe3e55cd563563f9a7a54757b71bc01c3cde2faf2e8ba26e69aaa89cb6fef71b0e7f6c837e59efd5567567cfaea8aacaae9035651af88bc7fc589bfd7ec7dacfada8db0de02b7cdd5835cbd69d4beffeb88dcf3c79adaef671bfdfef87176d9375bb0194eb5ed69cfd97bd2c97b0fad93416b2a63a629ed1b44de39545d1b4fc6eeb83c68d60736c60bf9f7d7f1fb55dff7e4463cdb26e37803d245f4e59338e631865dbd3a7ec5aaa77f2eb9abf9ce75fc2336bcaaaebcd7ebfdf9d17dbd5ed06d0c72fcbaa73fce11246d3f53c65b6845fd5fbd4f567ecaaeb699ead7ca2c6532d12699468acd19c38c3fe4c5134754db5354bd34dddd23d4b139e5bd52c3d0ab3ea5ccead9035539368ac83af997ab8fd268aa2695caaa7197f1968e740d604beb33bfbef5df5a72a1b97f02c644db936da3730b5b1e395558fa6ad9afe7835e5d297ab8ed72dcff4645bd6cb2a7a9a5ecdf19ab2873f9c7e552dd3563667216be6451be89a469cbeeb54361cefda96ed69fe329efddcb279ecf3be8b1baf3aa3fe8cd3b835cff99fec2a644d75ccc6aba6f0d99ea75cceae3cc7722c64cdb3756bbcfeb3be5d53ff65f7ab1fc5bf6aaed1bd6ae9bfe9fa9365bd7bae6b29644de0d0482ccd32cd3bd13afaac5d89c61a4d41e355e7359d4bd9544bd6953f9c0a59136fcdba9ab67367bc691cafb39cb26df9d79fb6b29035eb3f94eb0f4c4f559d7b5dd4bb686a9a2e2aab320a9742d62c4d3cbb081c1a89eedab244637d26f7b6a9dbaa289ba6e6899eabdbbe887bd57495cbdfbaf22f5136feb217aae79d1751c878cd5445d7d8b36d7ab2ed29b342d6fc716d0387431fbb3faedf6a176b8b17ed32b8d797e87c96295bba6c1bc36c39ff38fce7c7b319ac3c8dc3229166d73a23fce5e2dbcba265bccef32fe3d8f4697edbb00fe1e696adec59d5a7f39cc627da9a2fdad8145ee35966d5f83c6515fd42d65c632bcdb884e1164d5bd34d65f534d562bcbffddecb6eeca6693bc3ade99a2d8c373ecdf8abe93abb3f4e61b314b2a66c97adbdadfa557936e5b25ccd2fb3b32cdb6a2fcbaa5efea52a7b19354df52c4ff7c5bbb62cabbab08cce288c9ee92a64cd61914803e57f7b21deb22ede723e5b745dd1b86d51385edbf344f1bee7b9c2de84e7d84c4ff6b3339ecdae69efacce30fb55d34c6576fda9afffdd07da44fb2e9a6719da1ccbad1babb3caaaf239fb55c89a45fb96cd17676fea9ea9ec633346fd6acef22a64ed1c3dcd52b3744fb335cdd35ccb9335dbefba706cc6b16ba62a2a9f3330a6739fe3a7a9badd00aab58059bce89fe7efa2b15acee67aa22add8a77865536f6ac6759ef57168e85ac69e7350d34cdb555713875bb012c55bc66ebaaa81bb32dfc57f97f53c89a38defedb46bb3d0df82c35d714efda7e598567d9454d176581a839cf36d05dcdf8dfa128de162dff7aa2aeabae9ef5ad1adffe44e3fa88a76965ec57e5f69be919a7be3c65216bdebe348f6e5bce6999aee7ccb230cacaab9035ef1c6f55b71b40bcf635d533feb2bb9ef399aaea1a0b5953059b7b01f66b7b88f6fbfdda1ec6e5ea760388837d673fc7edf9e5d484ddd397ad90358179361cdfee19df278bf5f566a996a83ba76b1cbbbf6485ac093ccd79cd8933baaa44db060ee51b088490beb1e99a687ab2e557d1129d53216b0a71631178dbf36ab2a16ff9e5f9affe9b3f6d57f8bb42d604b2edf9b2ac2baf5f2dd51696e5137685acd99aacf9baf1aafed697a5db9aed6aaa42d6c4b3ef3aa079966f8a7a352d53f6c7ae9b9a6b2a644da02d9b270b36f702cc0c0c0d6c0e6c8e0d2cfe34f07c9c6bc6ff0e88e76f5675bb01b471028d4d3455d7b22dcf52f6fffcfddcd5ed0610c82f3de356354d5556e5942d4b13ad33c23f0df760e56904a2aadb0de0900c35e7b66459b6744f56f6e6fafbfd7e673a8fa57e95cbb5657f09ffd64d65216b82cdbd00fbfd72e2fcfbfddb8ec1e6d8c080350d2cdab7cca2775ef42652d4355dd74d5dd63cd5f6444bb4357fc4bbe1f0f7c26e3aa3a9bbce30fb4d394585ac991367a0fb73faa65373e28cfedb8e53b71b40182580b8f10602bfc44c10611c4800639c268e2821022dc14884080311f6618c24e1a144879203506c03b183860d5f799ee8c1cb04da43605d4dd7d505a075a8b40f0ac7991e0541a590218620c9660000a000c311003038241c0d07e441e998bcdb1414800264ae749a4819ca834912a4300819641021081000000102032336350e64db8eec9d5fcdbfbfa3ecd99b31b5ff07c3269b35b7865bbd1a7aac3fb35f016e87b12bd3c55619e7938a3412b5e2cb74e375130be5ef87e334e97d1edc3eef00fa47bbc77ddf9c6c91fc1bf3ce92e0de3fb9f2a1f2bd4dc619e9d593ad0406ebe6a0f3d9b7ceb8e8b175355ca6d471795c5bb967926de85e07eea007ee78cb0fdf80ac5f43838faf0cbea59d12829341b88f981302b95d3155ef44b1638fbbc3a64d297e90e1e6be4ab005f15697450529377d95c9253fcc72463a7baf66c0cdda9e0eb3238638fcf76c447cab94792bb31a759b18f8257acb9512bb25567bc4706c65f98e8e1cb2ded522bbf598c647e1085db049cd18380c07c79f41d317d7f0096a6cd55d041c7aa27bd9aafdfd3151df2529999618ec065d07e6f0f7249be2b42ddda130bbf5c65abec67245f2e086aac08bf4c79485e120dd00c3f758f03ec81b65d244f44024b729a1cf67f38088ea394db064edf56b0be94d62deacc2aada8ea3b6216e2e79752edd689e5951f36e9ed8e4a2cc41e0c7e4db7abb53d189886717e0e21dff79b68452cce9f558f58a7e1d4b79a334a61a9b024ebc3136e0bd56a9eebd7a7f182ecd4d36c457c0661e491dd8bfa3df3b71829bca82c320d702173021ad10cd8117649c2b3e3030c117fd50a84bd744fb4775ce763372bda20be820773702a994f5147002c4f57cc6bc67407550b106128e596fd87a7618feed3dbacd9c0403a713a3ef01a336695ca1dfe7141e734e21c2e13f65a859438b54c072098b2ccb077a9a9866db3f0e92ea7b0c816394a80e7ec5d357cd7438217729817d369517e0bbd0e2f3e38dcca6d7765103f2a4e7414884f1158c599a066f3a203aee80862c2aa958f864c4cc7ac565b7c693771a9d2d8f6ad87692907f5aad9a304eefdd961346f93f32ccc3cdb99f07d77a08e8dd8ec84aee47e0116b18ccd8f52466f4ffcbdf0af2892870a285244995bd4f19251bf2ce21ec137eb6a9c8cf02e01a34ec5ce28ceec80ce405bb18b37eff50f7857c989cc0b7de565341c93f5fe70bdb9006e1b8259e53135b6effdcb3390ae2d7550d9fff22a20489d44a71fe6f481e2c4d427c4c8909a5d468e9079657777509c0e0be35f17bf4c170aa0242d3744d174b91adf549d872340db3c9e48bce961da002e99a52b6fb0bf09ab1960f2fc2e0cd2a392ac6222cba17a2ad4adc1915fa435f3be103f6cdea233880e7926f512ff2e94d1e5dca9a00837687380f05e0c77a1677dba44bb89a52ff20153d743a6bab2169a86fdc446bf96b8aaaf2cc15e2b952d246324c04330139923fc6c910c8e75f5f752309f5797ff0e5a49e1d8eebfe9ee42922088723fc64c00a77c266587cbcf244991fabcea99060e3c36b4aeb48c3cd465bfee845475abcb4ac9b0a9829b145e8e4e8b68fd03f9dea06113b5c0183f95fbdc3176ba437a5fb81922cb5e1a48c266ad49b09ac9f1de7fb609fc34ffb271b3d953fbb130ccef1917b52bd273a8d4a50a3b5c84c713d1f886277520b622e45cb4ed090a1f3fb37d5ef90345bef6c9c8323d0f3874e577c78bd3f03ea11bd7e87e60a969f47639d144879f4908b27be1b2c86aabf313c7e6959e300f60001b96924bc8e81b171ee0874eedc7f7868377c509768c4d12ee9b6e3db16aac4d03124b268e2c12fda3ca653082b027932a7e962d68ec98768ed14395aa8150797e2d21cb944d45ad8bdaa25b1efe27493bb3157d8ede711ae6db0a2a8fe35a2f0222925f6b8d49f6716f26fff5c1535430bdc75ad50e1d2d0269f7b1bf5bfb7dcff66e042e671f30198bca79258f3f10a5af84f171741b88985087052e09a8c5b02195364d0aefd1b0b17b8e0ee1e5e7ae19424c1f12a9b1580010529d6cc68f819fbcdac6a939816d4bfe02c07c7bbdfea94ba359ed45d7982130753cc85ef395d367787aa0967a0aa6afb19256290766c21eddf822d6da7ebbc49e731762e6852f05a4cd1383dc247c7df3a67ac564500926799da288abc65abb83a7391cb5734c8b9842e6d5260bf286960155368dc713e5173ffc052ad483ad70882715cd47f8693650a899e48e5791d956c24cbeeb65f01174d74e248ee4387c2ee0953f4d93f0dd85868f4a368ddfd8200c3ee767bcd87f71f62eea13dc93908069c99f248f0b9eef83bdab65a2e1c989ea8efb9594ac73a40fa386b1d9b753a30be7d7b893ab6a7829e9e8ac3f0381f6d22f6f423495c32e47d37733f9b4cccdf6e482b64579e487c86082dc2c2de17a1a5d31f47f7167de5a183613e708ae017e3415a1362ee60f6a6b7e3b111ba28fa2675087328cc1a0ae5271a80059477b9a40889201ee7a33ead18f7c77ebb1e72ce16f20399a14df06c0af5325d7ed8768c9b74b699a9da774173ba52a4be5499c22af4b00aa97f76b43de3c84fa5170cb8d9a720565cf1139938342a0c424c622ac0090803d5aa4a9f761e9f9e7b92c6097a6ef94b82e114cf0bff181a37efcada037b32815ec85f1fb66319794b4c7b8c81547004035d6f49ca56860eefc2d2bbd30d65d4c1c0d0c88c9532e42fd81547910315f927c299b49877349a4c1a1f675acb008588abd168e9b3afba427ba771f8ad8f0dfdd8938fa5f1b1ac8f0ffdd8934fbb41b858dc1654f19f88b1131d5a8c6b5c26c0530bda2fe0c8750e981a1f8d87fb3e94c24312f755ea97a4321b92c8fc02916f1649661534b4798ae52b16d60d74c2c5540a70a5a6a4f1f30fc4f08d9cc6597862000f412f110a9b44b8a3f13a4a2f0a2aca523d3723e8750a308f11a5defda9a9e49c6e7d4616011e6d62dde8638f5f00dcc083a9ee631bb59151d86323895f5b7efabc6b8e6bd721ebfd9ecba95b8ba5a0af82bb9c9be173b6cf6543c6a25028f3a1bd92d06bd93e05866fc8fd813521293645742cf75e272e8c20d28495da50f93b6f86a66e0a9df298d1b2eed4cbae1731909e0bd7ede8a6b7d620f2b451475699108bf2aa08f54c47b9b84ef26085ae5cf11094ca445eb41254cbb36d4e7862b2a5e74517f2d997723c57aefba91276aa0564315d50333e284459d06c42766ff6d151f9798ba1cb96f22b5270ece2959bdfc1a6134a4b48c191dfb711fe11a26c2670458fb259c240a3fd1727ea22e3125854ff42f283c9fa6565309c4236199359a444d96cab92e29ee00776a1d82ab60c40bd7652465e768dd37eda065ad8f4a03be2ab4a6b42674f2707ab1acb3f3d25ac8f85daf5f51eb33f9d01ce7e9ce47f8407b5650638d6d9af767dfaa902d787a6b3d73b2c940fbb6607a7750407e60219abe5343b13e7f692c278c394b33cd0118cde69a0a4483b6165a58ed475f26c491977db84161a752dee957803a9810c99a9dfe0c5e365a21187d3687765aa3057d206009f5b3a68c609ed3ec2a51cde561ff52e280c220600708b153c8a7f52aa034ab89ebca3346b785df11e4f1887a7f4982540ae52cf288382eba72abd13d043945f25b144c045f05e73c67431644bddcbe385bdc12e08221e23ca345fedc558183faeda6047abc0f2588be08528b1cb9549a33f7b3004bbd2dc125601ef61f61444287c785e800898cae3e65abf911fcb51edaf9177435c55e26a88491e9a829d1d7365da23c6e43d80c635dfecd47995dfab4d296f132fa9a81a29f1c5fb543d0ed25448732227090351a077f2940a90cc8189ca90a2b561007214b35f6c2a6f253a10b16896d4b65f9f2212153e4c820da0b9f2cc74d470ee95a411f9dda0c0f01fabcbb57aa52cb0f5e6003228c5547bdff0f286ada6159f6ff9b93ad0dce2a6603c6b6c97ae8aa3329bab849fcb198935b65aaa50112ec6a53391e0a306e26fae81cc1386545bdc5592a779541f34699fdee398ef6305ee410cae94bfa244da4c0ac02cb28b58fd22747ab4fb794dc84599bc69ea329b07d9ce9685f4f8bd05dbe58eeceb6d9f2f01d2b6640616c7a1196ee8e347abd2f2bbca6aaceb96915a961abe59595b90d04a1ba12253451aad2adf22407204460ca646a42946fddb6e6b5fe533097ca262c96dcaafe3c46b90967b0f5f98d7cd9a08ef80a85f985925c6447f3598cfe7614d3f88f7108d19fdcf3fc3c2914fa4b4ab592deb28c083cb1ad21cbb4a48bbcecefbe6241a758bd0a4c393ca0efe3ae7fdafc28ae8f07b7672d2f598f1632ef9c7449f2dde1430bcc66167b80fe2e7c0e88ba0f19be7f216de464aec00c16bd103b03adbb89e0a6da180f0d4697f40c829a2a31ae3227eafbe6ad95f95d0bca01d1dbfa19cd315c84f987588ed5a9f50fc0b22e611ccc3a880de3f289797932a0cd28832badc7d721145019c06bcd5faed487d66245971e88c8953d494c26ff98a05b8ef094a37b685af8386e15b1a7f3fa1d1ffe1595d390cb896b3d8a478a21b407b6bc15452a616adf4f10ff413c4d54eedd39e51d99b6cf335305f1e83bc74658df7af7a59298e5f1a01d1314dbb84f9dee126a2efd5160d37668aa8e9bf40a5928f8c412c8611515e23a9bff27542978b42420dd4a7622ab82c444779807ca5c5d94401e985eb461d8b661ade276ceccfa7fc482379abb88e2dea37b09d8dbe5d706ff8bf0281772b00b18a2d1341f9a7d850409913bbcb0df01283debbe24ee04bb836cf4c85ca1fcc219008846c6004f3fb23cd3060d4e569e66b69ef86ebe802c4af2be6b79c0a5d02998e49494fb12dffff643c12916de586edb771f652858d076a4a56c3304e043694f6b87ae252279f4c47c364ac9d188ce0fb87a176a0a097da41497ab71825bb0a02828aa6d32f9946e8cf6a637b04cc1c1d8ad78b7a1caed2fa115910f82abdbe14b1c288a573749c9dc230928318d4ab5fb7f2100ad6f0529dccfd932c124fd625c263f9d7086299690568af6f2a5d7997959a42fc6d398079180f2ca91a6c2928b01c8abf56aedc701a2834b45f6365db30e8546e0e7a07c607eee898c14d0fe11f066697f7dc16ac7b602839e20bc9068f0ec2379abc97bd7c607771decbee81c48b1e7fcd3dd37bd98d336c2d7d008ea45c53cef64b831babab2449e8c18fda8688a79c764a88d174148d1c150e63b6e44c4bbfa998d77e707081f866a65acb8a11f397d6ed8f4b52dc5aa441b04cd52a1f0358d82bcb1cca2df8ade27c2f3bb90cc97eb4079851df8e66777a56721143c43bdabc43558813b702be01ae11beec8cb8121c72bb3ce2a8e529aa31562f62569cfad91ba5a723c3973d53256d51a0847e76a1216fe0eb76bee0e7d3f780121d99359a26ee8710906746456937510ab05bcc5b942cfbe2cb963baf072cef6050b9f7f0c3f2a1aadfb9e35729d287972d27fb3661f6c3c8ace2c3b457091a1fb09f05f9b2df0e4c063c36d1a11317d6cffa60e318cbb5aa8c50b7f966e9c368c1f8e4bc98366c2e39355708f6bc790daae3f8e9d2bd4ac84f8cd42b0de683d51e7ad07f61b1417340f7766661feb6d8c73d0728b93294832ed3c43ec1969596263b8b6740a3c713dfa87fff6fab69f555bd432ee3339a74cbb63ceaebd49ed28295f61cb3a21f12d53b7b1f77830fcbefc49b208a353d0ddf1cd11b5b4cac1b5ef7047925362819c105369138d716057b134e6b341a5c1cdd57930fdc1d629935fb397c0b906e9a9767b5591c65347ca576c81bb87ba1d4fc8f65cbe8deb2d9c3cb1c6e053434b2e422a7dae6aa6737cff32eb5fc1aaf3476b38634761a8c612eae322c2176988a55c50ff190b7d641ad0fe499fce8a9d215467ced33721ecce8f46de4f8dd8098ee5d1fb4f7b93fea8760ec39cf86c27b156c989a66ad59e30e076f88d9cf9f94bd1ec3106e7c86f8b5a113be3e9dad2eef626714203f740f9e83f5de4f5a953931bdde51b8375d042fe03f561ef8dcdb9ac7e19da0b1f855414fbdaba9acf3cfc21d8461fc47833fe23c6bd89856c60357f9ed92ec4a197c5be1b0480aefbac3d6ea87b85c4cf4e76cc7d43875513635ff6889b4e1d63d73c03b4e5ab7e1dd07f3eb73f3a79dd7b180e1dcddbc4833e1b66f105862b76dea569bdef214f2bee1a8a147b74cd2eb830cd0c0d30254f633b6954a4b4898f5319b98d3cf5c59c88965a13d1763a98ca3e4a505e8b9ffe5a6219fcf0558c3b56d1a6e71ada31dbdf10b8ed33c374b8e3106269bf40ac8074e0739b7cab185a6f1cd5dcb35072d261e27aa1640065822a773ddb5694059888f1931d7ca10610e16348f986c35b862feaaff9a0eb7f6b7950c867b077bbfbf9e6cb5dbc6c37be6fb465e5d95f1e0f530b338a319be385295f3e5e5caff01c2c9354aa0c6af2228e92cf40ed079c44ed1e47d8075fcd8fc2b99b2b0583187e4dda073f23f3801746c007ba6d666a3eccf9dfab5d70ccf4a5621a43432ab3c80795913334acfccbefd4fd47e631d53a1059d92ab18d9cc0376323ad2352325ea04dba8f8e4dec2f8810d78d65de260c4d59390e2e6033fe9068d3307ae1f74ee485a8ba8a15dda393ea4df4f71d04f627a655ba826bad0be3b579292517f91ee652d75d193c9e12c5e6ecdd1ff18a4bec456eeb469c899e51aec89a2150ecc7f7ea598d79c842013473426ae5319f2200900219e2e89361cfa47fb2b9e67a215ac444b024eb48003e211072f9e61c1e44b0d0d01a43bb6ef9d425bf10475e49e47d9b455a3543ec2bc8be3dffcbb05517d15f6ed8da6fddf77bccd97bdb90c20dd9419deb7b244773abe71dcc4a31a3c016b58c3c1970e03c225114d9933cdaff4b65df28d19d49771e01bb99c00cbbd803d939d76171568ee80f102fb7fe68aad562e08f22de4b3d3560b5d8ca76b3bba0a6d64efef2641b375018198a857a90f02460770c31a31b789ca5aae0e45233fe77c8ca921d5ad6f885fea7d90ce62dc9077e02e608fa5f097333f57992b535bd0682d320ea525693d227ca7e75be2274dd06a1edfb5e3eafe4319f4eed73ef51dde5ac573b18aeb46d320c2a690c52c90a48f78b4f9c33489ef1c15671dc491170b6a8045a054fad3160679810793d65c42e3d7b3fb9b8e016509bc1227852eda7cc8ea6bf6b301657afd47a3879e46431d8f344f46baf3cd23ffafbb973e043c387da71466e018bba96506d0ec5d906b09547e67635c02c91be38ec4e51c71b61653e0a9858de00a2e6d8c4b24bf63c459b4cc03a71662843fb0b4115cd1dd0e235248ffd5514362883fd58a8110fd170c5d049774766344b4f04b03ab02548e5b309422fc92d98d20d2c72e0d441578316e41a0ca714b6669845c1bbb1420f5c0c5b808822fc62d09ab39626d2ca5c0550317c1251cba181749fcc688b5609507560da408bf60e822b84837c4a5772d4b706bbf6d106d1bb2498b4dc5b508ac615eed0b6af69e18882be284750302eabcf7ca5a1225c7b64d0aa3f4828f7f29b4bc70ee48b09c33e61d8ba8f3d78517d1153c34b02f94f82756fce556f9c5aa0309c26f983423b9a47f3f6e6497fcd0c1a81822e73bb02847ff2bef5624517e780a533a24222e34c123c2397f430733e522e3f05717c5c179878290e3af584aecbd128c8f64b716e926c8d02eb7df4fad3d482dcdd64cc568390683750ac01a1a2be0d073e1443a828aac8c6f3519ef791702a6f1c99c69d669d3c6993bb011c454a36f41874a9ea82c719f3c1270a8e019da0aa497e533315f534103d2cbec607de922429605e2ef2458515d0c8ecc6e8ebc3aa3a643c7b722fdd746fc15be40c6a76503df1f3f9575c5adb0aca8c2a328072bec1b96c97bf46e7f64fd1b76f1f9d00d70117ff58dd2a2aeb6e3a85eb5db7ddbfcddf1f5c1beb5a8ce3881eed0597747094bde101eb4d0db7f823530532c69a3ab591fa935b8a2c6efdfb28d10069908a8105449e7e94129bd62a37180e8bf9998dcac349c6f08d15eb76eb7c761eba52f3649b8f46893d5ceee8bab4af4030c77ab044ec822a0d50651a6f6d39408011a76e97a03f92ad2701c2cefbc8d8def96c4de1a8f579df1c3394ad1be6da3a4fad91c4eca1df8e8f4fd74dd2a1ba39d1ef3596b675ea5435e652d0a2f34c5f416e4e47cc87904c97dc5f3786b18fce6802eb4493ee480c2336d9f70f2894fa1d8177878e7f188a090fa5f908b9e86264a2497b36f6f8035803028ea6d43ddb73cdd1d0de459da65eb3dd57546323cedb8cc9defd487d4269dc813e936131f6afefd379e1ce3a014d1623f9d9ca35b6f2995077b889d0ddbf99dc2e6887a9c9cd4c77cd38b49825f35c43def44d4245b731a6b25d570b6f3479f45f257630f8d17f34ff1deb7d1bb175975a9cb0c59da4ad1cefd9c7c5d849fc9bc4fcf60fc0194d72c17d9a13bb1d71b5ad8993d9df8f67974efb2ca89a206c390e337333368bcf60c68b52eb76c57671174934fd9905978ba2e208366328a674839ce250f0f383dcdd8c950e1cc77aefcc87d9f1fee3528b93c79538a993fbbdc20bd7897868c951f805193e9894b9f3b23f3c12d634f377842b81446ed28dc20f948210f0f5fb2df4f3b3832590ec3357c89d63e747f50d18a88ff247aecf1c746f7fb3c47fcef07549cec32d65dd67bbc9ea75ec2daa256cb5803ece7928fa991a6aa014bd726c1032d65d03a6a74fe4134b7f5a3149142c85024a4e0328d1f41b099d31a554df4b6083dbc18c86ebb37e735ff4f81d44fc130afb829c34440aefac0c995ee831e7e1257b74e1e4cfaad0c282d2ea430b416e305ea3eaf8deb8a028de6bc1fdee9b411045dea9c20c0a863afeba8ef93554f74bf02b7ef0e83ec05abecc4fbb0c7f35acb3cd076beb6baabb34690646217035d27c70ddbcaa3390fc961a340bbcf98834535b64f7cb1f3f54af4c9fe230239e439fac1e5e3daf06bfa34f74fab22ff13acec5fb510070a17d74b10af76bf46c5b47e51b6882770195a8d2be9756e884da913f995bc54af642ff99ff6d5fc17c0a12228065430bf108679252c4c5a38590db5c9617c7a982a883550c41149944c13838b6222aa5854599ca18bf28531319431006dacb3e2b87feaa34a90c8c4ad4ac6ad94858d54ce2c96cad532935c26d1cbe205735f31c596cc4035330a45b316d91ca09b4a0a67847226259d356be700e2a9a39e19e533ae7ed615d07d145452090d44430344b452159d2aa382843a9aaaa511c5b4b66a3a22a7faf53404418d4d510b2ba9239aaa5454e34c5583e86a2d0aeb12651521ada9da1aadb816afae7391573dfa1a4360e32b6cc112bb4063e5896c04950d95d97aeaec04a155a3b489a5362ead2d20b6cba9ad44b94d5d6ff30a6e098abb2cb9423537b7e8e656dd8ab23baeee8a086f76e5cd97de52b577a6f82a407dc316d641728c9ab6115ff4cb2d46efa85cf94bb63073ad402d44e4041ee364f940618b155d6460cedb5c7f4b7f2ce3e252e8bb439210f75bf90286ca213c3a01c200e83d5460c073cfb6ddef5c1976297840f1c362d05e7e9fba4109d07b443db4711456bee7efaa690625ff2a16e220ccf8cd1830aab8bf826b558453edd52096ea0fdc5e27d62ebc5ad8f484fe95731b888b4062829487c084e957bff6b7ad6e7e78e460fa4c26df19d16b47118260e7ba012e7b46cfd27616fbff048e8ebf5bd483b253cb75a58ef8983bb0265777ca4e6a846113d41af731265d3de063f8424a8c461ce7846874105ae6e07683630e0cdc11b893b9a6947c9954f266e3094bb8f362c0f95ae7fb628d9c6d1fd48a4bf23290ec039c3364e1909e3ccf10758c53c5e6f94f61962885c119f94bf4301facb783cbd914e132cf42c0a701675d157e346644132d6eba6ba3e994bc7671fd323141413180edeaf79b20d36ecc3f27fb2d3293186715a0ee80ba274d442343838c18646490b92cf3ddb0c45d697a4dce645084354a747faee317125ea61eb0d3b6c6042435f2886edfc7902c066376580cb5f0d420533bbdaae99546421560bdf00e5a5b60f7e5ded244f3449cbdb1a285d3b7097f18695382b589defb31722006eb48fc567200833d76df0367c6771700e493fd3b829a47c26bf2aad3fd7bbe32c774e1b6379a63288442854e07ef293d44c72c6fd0cc7dc1c2328a39f6628268f958bca8c8b0e4ad091da84c162a86feeae85c017a88252cd68c423a540e8c9759c3869c83b1ce34723c27ce2974ba9a9268685e6d40f11bdc228c0b97d67d8dd5547153e9b9bb0725070052e2e10d07bbc0a16c79e27dc4ef2c7a6acb867d0cd9e0024334632d99311209292e26cbd0ce41e4c2e7cb29c3d3aa78570443363bf32ac43d03bce588e25aa0c707ba59485b76ac182f6eeed36a9ff21988d7beeb500eb4b420b2c540de361bb929f4b54042d5e556cebbce764ab66ca23affaf934deaa27104e7eee79e365da1aef30a3f7bb75f6a345fccf854b434b6d1e8a2d0c25561f30822da27dee2c5fc84b52da837abda16226f83c2c2bca14aebd27de7b4da062ce4dd6c4881293ddf242d029c1d5e21dfb3e37caaec792e0f5d87fc8c9bc65594e9c5436bfd90af4b5c34cda9961dab3ac6637ed94ff08ee0bd08821a4d36ee6737df5554a76ea0c40e2a1be3bbb54b263246e89b7a649e9d24232bf02b3ea1275e8ac22ac437ed38ba19f242d33fb20efae6fa3d0e42f6374fcb5eed8846cfa17d2aac2d209101d00314e0a8a3d18cf3cddc4b4a680b23a1ea6e8728a228bac5026e11da73882e44824a37a4fc402c43e20030485b14c8cf314ff76ccf4fc500e5c767ab187780f6a3c633fb005bee01cb03ff5ddfabb28a79313e23914d8cfe805c43efc99dcd234fcfd45ffdfc35785c450c1a5619554342be15efc0c0cabecd334f405cb4ebb0c74f0c61b4e03c76286ceff38f5765bfceb7cf906afeb7591f9faa1d889bdbcaabecc9570953623078e447e8d8df88a5c00574c7dce6a4d450db95a5f5256f683c7d33b7da59dee5a21f7327bdfa865f499acefdcf6457094ad8c9cc918b67eca5bbbf930e8d6d8a8bd6c016c3c1158b25eb7e253f44e82f25da12bc77c2e511d13fc2e5e5e4b0a4c217100989a42136b5b4c4d4fb81fb84e3627e4cf198b158aaecd80c6af7dc357458e5119c18ff799c0ff0687f2ff41117182b66d97cc92b70cd05b8641122ded0cfc5e482bb59f4e138d316fe0b2e367edc785c024fb6d33636726b5df68ae3ef7c71607c4f8da1ee3340d0a7bfa803fe8d5d257c0360b693a2ee3b7f0ae3dd22e9d5367e117b6237232ebb4e678cf82f614484fa60cb882f1a76607faef559d8d87b9684e0733c41d939045a1f5a22b65bc6305f2f6d05099bb561e1a2661c745cdd27210e27bebdc87832f29df84636dec468ca28fc19d7f6efe7cb62ac7e45ad28939f0a8a97948ec063c536f07814da64e1223b949fcb8a5ac16ab4032c44bd15abb8bac5368ee64dc87d7b8dbb8f04b12eb165a40301a4a5a93016754f04aa1b88d04b86b0fb5fb4283f043596138321af25881f46467217763ba3f48e1d08a7aeb917dd1b04d7b963d42a391bb6ddfe7bcbd27755ce3fee62169a0355fffc2a772c2fe834374343c58fcae1aa69b8e28e3bd0b68e21dcd9f89f1808577d53fa668d2b61b3079afaff7e846f86c6102ee7000be8f70e9f54eb4aa2dd28912056c48b44ce2764d6b8e34dc2f2d66a002cf322c1df37244bc05d69997acb7d26a08c5e7c14407c13e85c948f17e2796e5840736bcc3101327cee5f106d8ac29bd28f87d2a3fb0144708f10ff63eb0e8ed04c3760c6d55e45c4e5df59968512210136ff577e4d7da1f3aa006c0aa587beeff29c3a47e3b7ab033a24be94102688b9909fe7faf42f255ed8f7703087fef34b0b9fa32eb1c70e44f4a53d213a20cc783d99f80206b0033440812b2000fd7daceb4cfb5fe61906ed194fcbe3dd69edfd80dbe8ada8f17d01dc19a861c0f447298e07b820054d8ddf45bae6c7730b000d83bee30c03f56662ed7c522f3cde0578d76ee0094d4186130631793f2058f0f1ef47e5d39fa002ba47c0e0295f5fb6054539df516fdab6169135f4e8c1c69154ebef0cefc51f71583579af8d97eeaa53f5bda62406cec6b70e29e5ae2a4a6fd5195af5d383828417f1d4356d44054f169bc77f67d05d6f603a7d48b5c5e33883c3a3fee7ef58288f95fe064bbf8964e78399c96a3cee585ab1dfc9fef238617b4ab4272edb039c85aa197da107300bdd06cee03bb1e079b15df682f066a98a2a5526c725c3adec00ba9f5e28fc88417148dbd38bdf1d834340ced93f5c75656eed16530a5173300c54bd302c6a8ed93c2e33fad0fbfea016c7f932ebecda85f96c5023beb4b54e6b1635364e1d5ce9393f8afa6be76b135e4b517ef0e63ce977f1ef7784ae111373d9dac42c18cb6039ed2484ddb5792ca3d8fdbe934035d430974b03e4fe83bc1144d88e6997e98c0fa2898e9267ca4c51e3b77dba601a49792c3627c6f8d58300c129b2cf65b0b35b06f6236ecf180e7650bd4e7f7cb021f39494bf9cd97499b7d0749f1530627f2b7143017c1c464c1530e3b6cf00d20fbd7c4f56dca58213eb25fea945a5a83e8d2b331918fd45d4c0670ce71898de71f35b98d1afa235cc45e316cef8706e4e195487e1db5f07400e95eb7d153d30717e2790a74a35494afaa2723672522c26ec8327a277684d566bccc913006d20f86ca2c081bfd3b0968e8d872e536adef6153ffa66c31d96c2e340e1846f5741a63a5fec62b41cfd075fbf4ef926cfccc02781e1526da60c4d9681f83361bc9dd53a37cb13f299c6e8086f73e01a163e946ddbadecf4f9c346f917db465a73af443b51e0d585a32377998a9bb383fb47de65b378940fc9bd99d908049f7d358367767b0fb641bb00778ea1ef5d33fd2df341fefa787b0ef0beb2fbf31421e3effe2b2d96ac016b483928b4a1eebd5bcc6f36d16164dd62d0744e5814f07e6f66935b23eaab31f892242e9043fc6ac3e9138e46013b72df21f0fc7ae4452200a96a1f452e4054b14f3adf334aef4d2983aec606ad16718fcc1103170d4697710df1d27378bbe4a4a493a7cf9583d071bdce9df3e6639fd475b48bf0c8f195e42f430904288299c80340ad1c38e813db48582be9e685c3ea110c78872ef0edf78f6340648211b8c4c8d5bf5ee59d5136ef229932abf2be807b2c9e543a7ac1b672348fa52c73d0241639c38afbadb67b8a8eb9557a50b03451484a1a42233860eeb3e56cda5b724fc32d68eaaee0ccedbfa337d1f7ab4bcf71ec9dbf80ed448e6d3966e67f02dfdf6df7886f1c4af8eef958aa4f8f8c4c6f78186b0268d422891d095b8f4af755602f69e60938af93d0cb354601dbccddc28d9ecfede280b889bc80d6e4373ba8c66bec65fceb801ccfacb157b83f93eeb83aebfb78da2ddd117ae5bdbc5795d90a7742ffb01e7eb44d26b5d176ef925c0d33f8d89a0a81dd38530b644cffbf47ceb2e3d4c5a44d6653ac85ca3bd031f9fd1f8ac7e5d7e8ec63d1aeb83d3ea020182191de9e3fe23c8e51981e4c8041a1442a483f7a0eb03f5d2f5011421170babed6c57a4d67d8439ea9c19ab8b812efc449eae515e18b2ec7f1378d278c56646f97cc9960724429de348f8e957a603aaab0d3a8aa08c1eb68904f64b7ee22032ef4ade1aefbe5759388b3e5e1cdc418cbf6ca58e107047207d402d81d7cdca591e1c9aaebf63ed55e573be650a605529752637724584c53d450be8971eeaaac8d86c52b02f7a6c9234003fd05c120cd25119acd45afbf6be80154d1b98fb8ae62321fd69d427912464ad4cff5421b8d2ddb22f01164601d6b9ba73aa4cdc3a7115a0fb9ec037771f3fd79737e8f35df9d1698a59c215c1735d2e7a3c3b5ba43ba8c5748e0a7179d810339fe701ebd4751f95f65e0ef4549c7102a077046e9a52f8ef8d8c7b1a96f0d7418b43e5a3f0ebd4d21574caf585b8fba89138777c75da63b4aa64d4bd8759a14b03ab8395e6f810e3d2e2a53316051312ea719307736a16281f633610d0334a9163c3f556ec9beb9725dc601fb935f9e3660ae84f3423144f1effde7c5c711c48c501b390d6baa1e016735cbea7a3df1ef455fb02bb88c0e1b2b5a10a77738fe90ce1db054996ce5d8d00a36a812b27db18e46b4fa83cfd4260f68f14e5e89491b4113e39e520c38f03f3180495887315f2f79b417898c1a625e3835775d321af4979350a07b195c1dba6b84e6bf0272ea688e59f147d7364ad9bfbb735b796d69f42d45b064a7e51fb6b32a8c7f8ff8cdd5eaf2bb7d0ea7edd939ea84d5d596b84bc786cf5d795bbef735a4bb580f8afc71bfbd2e157967245d2a7c61eabc2b9364a59f325cb88407b3120d65ec86bdbb8da6bc1e70e2d259c5032c5bb98ec1ff35044ae2111f1f0e32caaf1d8b468297be4f6f64cdf3e275126d417335004e3c6a85dbb213ea9cbcbc7f3531fa01e7d62a662bbb3910ec4630a3cd137c0198157e593253c41d2139da5517f08bd02171768984288c17ff0eb048b73ec6519794cf64ec5f03f9b03eaac13b003996ead356cc9df318f298abb16faaae09ed8563ec5156989b926dc6a47111804a7ee08e9203f07bb11a863cd42b6932f67322ebc079c3cebd14cd4ed8360c62ecbd3e05e966209e3eb4ed8131de91127fdee43f2906ce06c42c140e23e0194dc7294c6490aeb21d208dcab4cab0c73fabf799ecabfd917f92f540f26f09a27b4ab13259e25bd0339d30a2378ba88375624b2f1a1d6fe2a87b889a3ef002f7caaa0f1893101dad973b64924d91cdd12674fcf800d35e921b2b50a81c0def72a8ff14b17a3a49908f5c281f4701468c5b803f63b1050d17e186aa79b5bdb0ab4f5b0263566d344eeb0fe136363163494b9f19b7da1b63e9daa6e85a5ed4e2c65e199d3913d37a782a4d80d3b919a2e4c2cb40101959c4e7167980e28bd64cb26a4cadaa90a5ca5c3a152ee49759305a979b44b74a7ae36615c7ebaafd0c816437e15eeab86750f517496bbc26f2ba5bfb4be577fbb754d03c368007676684ff5af10a889be9d3d4c0073537861f1950f8c9939c32bce7bf12966ac0228525eb902968183c47387fb122e1ccce3e86665f9af940a96b6fac894f9c3b47f1a52b826e124a3c499030e8144da5773f0d72c5dab51612fbf510ed35807fab1fd0d6b18350e18505b4062495b687a4279e865bc8ba11754c75c35f01af843f30d0c7583456df762f0ed545d5663a5039cd4e3490e76ebbbb92b9679d9a98640b77f3572c38dffad80b69a2be71d785b6a0cedb843632b9f07fadc1959ffad5d3395b0159ec5a27d5902d8b7f3aa061f4ac5a3bcb07148f670ce95855525bd332dbf676791db15d829551cd51b0bed69f4e4257833a0b4bc67e1f3b38f145647e832c4836b65999bb6501b4f88e0791279d611983a7cceabc62a6a0d1badc04b31412f9b0708c8a0e08b7b5eacc7dba1784ee155e5518b5dae16521d1eaa88434eeaa9e1bc7ecd322833acf6ac34cb23f5a8c07171b083dcc184ad6b73b31ac5c4181b5f4ec957dce2d29a1db5daf06cbf57fb67bb8708967ff3cf2bd59fbce45eda798ac1b2f0aba38710facd1246e1ba2f929701f39eb0f33007c85e66c5ee578455fcd95726506419e39d52d3cd390a5019e5993e47499495f168bbb2810fb8cef146387756b142119029043bfa0681c4342d5072f4618ea4da9867d4aa29d981e27f6e04c140e7f157e2427ecfe016294f398429372a639a18b4a3415d54162788b5a9060a5fcac9a4b845e9124f09f1d6901e317b2cccee707d03b17b3160710c6facf9167e5a8c74e3c3854e538edeb9e3585078493983b483b486c29192d69fa2e2a59c17b02ee47128dd4b246009d29b66990262bfeb62372574a6e9ca5190d7db04a6122a04671f740fc9f71599649b6e4ea0253aa689c9c659a4e30cffc804b3f53ad6e212f1690bc407db2d9c22a80c5e985397c70afd51e94d3e857d0ea4204ad4b675ecb20082a6b23a8298a0f87bf7d35a9e268d3812bba89aa43f667eac442ac6a39b55ad0329335ac793dad20750f315dfac6580d0f4c3576ee489b0e16bc1bbe519517641f4922da60cd1a4af2d92f4b2f598dbb483ff61228dd21032345946f8ef707335de53107345f9c4c3198d1da9c6a4d182fe1bb5c5cc134d72409380e96a8b17f182fe5106947744b4ff22ad8a8c187ce0ee639c94f06b4c41dd386a0febe0a071acaf70d216612813ec54d693fbde23de3648935b1d345de77fda3aa2e6a3cd904646aba27bc0ab7b53b116f992a369b2bb15217e37012585703e1758eb61289a9467862737ace328c6a4a3118d23e15e1533239f3b84fb896866183c6d7e982c95386ec1ce6605999bcb471b363bc96a526dc69a5421a26a14d17cc6218f51e044e64461a2fb1d962f801bb308248f53d61b57c89126da61fbe242a6eeea3149f378ce9dc1e3ceffbb206dbb39cc2eaa04a969293110bd2e40a400a7da2802ae5b1c556446ebfa9a193265e1655171d8914e32414693e4f3330c9e0d60a25c9a32943b91429fab29bb45da3428e2de52e5237befb5722d6e0e50c7a4dfa692d5360073b5141b9486ba3e32d0b680b7b5109981a54f0b8c64563e7412692703e6025067d1bcefa549e6fdcf1d252de0227e3181d52857be79fb31c700738960be836d0b3234bc2556b68eaa95802f5797212ea44ba669c3f8a81959395f7d79861cd7a1998d05056541c4513b2981e3d1ce1b791748978c2b120512af596c33c46518f0d4c89f0f4b6355ed52c00bd7dd892b2c8e6305ecc1afd83004fb0170bc353ebf5a90f3b11de180e92e593e73a56c2f7c22c204c6418f8cc6a273dc2b6898bde4d0e8040daac010a39526428a7c70b9ca61824380f080758bcd5d4892ff6e082311d849a0d0dd0f6ae5716ed6f98989a266d18efcc347ae34acf9cc07f28a82ce62970ecc178a2692fa024f62f3abf6c54f9847f4b34eb6ffe63321e86c3aaf4eaf6dd9ef1ef594a8f0dbe2ee44ff24ddaabf74e0149e96a349ff90cff2f824718f7531382053029e7f7b8a029dd827fb155646063e6d3072bbea805c03652a2647e06578bdb7b74d1a1c10c35af20760268213fda990a3a0b96e905ac289200a328fb49ef21a0bbd194c1d7e8c65567e75871c3d88327af7cb55b15d04824362167e73bca95ead95efddbd18a4ed1c4f1f70381bac9e19d9aeba079db8cae4bdf050e8a39c9245bacd672aba303090738f1b95db0b2b6b30ca49d85598f2335f862d2822a71d408c621a19b53621067071e3ea46408e8069ed5eca78fcb4d3e9e9b8ac26e1a47d03e1c56cf3baeb16194b1965bf6a72460c1bfa063a99301c038fcb9af437aeb1beb87237be39dc47ae60afd64f5c21c2f31677b948c8628a4c90a7aeb84c3be11567cc947fb31caa293b11cb5fd0a851b21bcbf0f9a0b44b0d3560102b63e9c196d323ba4e36da6c75db6469630fd369ebf8b02cc4313710eb9b71218338462df261c961125b6e27f6f2e21c4655a05eccf9ecfb2416f471b6f88a7a9d517a104f6e30fbb4f70c2b16ee3b68db59c1f08cf115b84e763c44e71a12a247e4a93855d680c888092391d320b91915e10e971cd57df93da9e58aa457fa42972284eb93887b8c0ab7abaad4adf5695c5105fb8161651174143e56bb7d815fd00394d248fd173ff6d078a1a6d81f0daec959c8f99d49e4759a44e97e9b9d048d94cc4fd277a9821dd11893da3e19d59bb06d3cf9475d88d8179d1df43b5da96c101ee7ab8934041c4150233f84720166573bd1280f7a038c37e968b67fa5a92e53146c940c084b874eebacb811077770402d83c944d93d1ec628d593e344dda1b9605289a485f4806dbc52212def0c8c1946a3513319eef2438dcd790d07e4449bf1375e4a75a600129a2222e7a3680933e151076edf3d18a7f02f99383d2a9e6d044ed60da0cb5e7ddd21b247081224ea7c2eb0f905f24e2d096a50f6d5d7a06f7ce3c58aab94bff3a9be2569830966d98b9224c0fa6e4392bcb0aba34b6f8604f58b44ae462bab699a34d8605fbb00e6aec7c35200b404b4626794a9e669eb7e1d46df38089304a3e8a64744d3ffd27414b7e2762c38621b7eaaf5edced710d728c84dd92469df8c86c6708589cbf8787d46c3b0021c08b710c38f538e42e57ab5011f9cc51420ce6147d40fb6f1dcd4102e383b4688674b944ab05f7269fc2e779c4639bbfd90bfc1345ac8b7b35d2017078b8be7f809c250389f1c9ef7870790d0df5c96978d859f6dde0360608602150c2f815161ef27719d7348f74cdb3f05b353f0539b6430f5c8f453c13c98dea814cba4ccc65fac0bec5f072497512e588159d602a046d91a4819c7032bfeb521d82cc49ccd5735473c9f0f8291667c4fef2364547432498ecf57bb7190717d3d6d53beea59581084a5edc5a019fc87ab10391028aa571838c866273111e2169ac344587fe4e85a4c7607c15a4153c1c63d1318c24f370afa6d175067e12aa660cb607f3fb2cb1122351d1fb7eec7ec301b53689249d5d06dc051b9882a275e869a36a46ab9e9917ec55fe43aa3b96f32411fe928ce184976e5fbcc550180cf3b000d5dc56511acbb31cf666b1f85e4ab064e456d2b4a934b8ceb4f00d3636d98a91eec6d37b72b169c4451b628ae1db71edd5c597a13ed55cda2247e7533e603f374327e0098269fc0a6d13e658bbc281586001001dc33e6bbd46de2900bcf63ca4920b6ba53d9cf1c0093595c6dbbe36ab79f687bcf5b998a98a5495556c6ea41685af3e374b8e7602ce2f7000a1c83984b7932028d8a9717310da41c4bb109101deca250aa0675a11cca5e50ca89c0ef03d665c7939d4807a1526226df07350fed7914e3fa71eb84f18cfad0a287f8e3d080afae02ae84f98cdfac4fc2f3b9489f36317bf035606edc65581771383a1917f400ada6dab5c0158387729c33bc2853459d74d6a2aa539c2db2559158ceff1405ea450bd07d641890e055a70c6d2973159bc5aa5f572703a099563d13d4e37f802ed3dcea84236ea4f55774ce4a32dbd19a2f25248d53812d53806e8e56607620cc73b28b34813539aed20852d20ebf81846550da340f48aa9d7b8c05673b40017825006340d516ddd40434f64738dcb41bf3d5d381a01d815842dd2d1feb5ac2fff63ce7bd0d2c62efd62b9301b27156c4e48bcbe90448019ce1cb5074155b7b6cbe2d85998fa72a10ee9e75425d8b78135a7c06bb6275facc04da0c1d102516f22421ab75ddd3d1e93fc8e97f2ddfcfc498ee2a70f7b881c04d08a62beba95a8e250655268d0106f1d36ee9d0259d8420ae9eca05886b5b1f3e016fc5529279c1c6f52946028bb8654792164bd7d93a5e34f25d390bdfac321ba8383300a334755d3f8c8b1871584d13b0af03554d3bd6abd978eaba6c7261b51a33154908e22df80171fce5621bd2543afe428532df2d78074dfac293eb56c3f420eaa8e217f3196bc3fecc74767e0993966f20a134c5761770c867c7a5c8a4f2896ac2f0b8762024bc17a8d8b590506c1fbacb226418f3d007a9bd7ed938c0bcb1d4cdddf19686a5d3fa8334d680367b0722c537738c9be5a582ca22dfa604b9e0ec7107f1de1c89b40263c735f4129170613a6c100921aeb57b173ee77cf61a0528de64dc224200982b46e26f84cb38f1fb233b1dd169269c1bed03e387846b70eb2c278f226894587441cc2ce109cde6401ed24e72ed7c3f83fb1e129583fd8b8c28fabf1a9ae5cb9085d255357774ea65f598279f42542ef06058f0d86c90d0bc98790a92a5fd360bab983706d6c12425219e49527b7bbb89a67fd01d25fa26f48b7bf4c8e4c2bc99e6f80c9ce3315fa5ecb7eb746009d6a4aeebdc0d32e103d4e645e50586d55f2655c8281834c518dac2d4556bdd9648a1a7fb9ef8651ec3c8a273da1fd20d084fa687ca0553f9bc23552a6bf70a8b3be97bf50d35bbc1790cdc9c79c160579d614e927a56f04995926a09665ab8373ed2d0bd06bc1f83e6245eaa31887356ab2614ab91c52845a6b0e9181f04edfa928bcb865e3a422388e2fa4383875d62e409a828cebc0dbce6d69e033ce1b809223030f640c62f20d318c5664748e8cf8810f1a36725f5a55b909eb960528f85f05f24413149e2cc6b129877e7e47ee81536761a750d0de37b4c376138d71138ed56a211adf80df53723f16436ab177a3f208109a4dd92b2ab2c43d5e3cd53e4e5df0a744b1caf9f249d2057d71805f1e2d0c3f1da68756a015de9d700f775b43fb8ceb45cc7c33eaa6449a5cb0c99c0ce1e407375e4786e3bf8cdd6486466a5c371422fb5906e87e8184f40198ea9bfee78fd642cc9a4180e1fdc0497290a61b9c06595f91d72252a9bb5c8c67cea18b2f05db612afe70905f769b6e2000e77f750dca5441e9e307560d5c207c15649fe23199f9aea9cf0a8737f20a8402ac60b59246c4ae4d4b460acc0c37beeb9488bd4b76dcab50df27eb9bdeeaa53106c0d0ce82b9372ce71568b7df9e514d75bea3ec0e81c104dde3172a21ea2c76b723c227f9a55407e0de72c22a24ddbd4ea1b159637cea27643de40fe06c5257d5dcdbc70871326ffceeb52d42e6495e74a28ab8242be57bf45305725fe2434dd61d26373f8dfe1d81be332973cd075385cfc164c37ab1f277b44f9df3a16816c1563d51c2439ee10abf81256643c3ba54b8bf0986288fc0042d124819dc1ecb173d242132a74c1d72832858969a97e26ec0439335e22b83f60b7b65d4282bbda2f9a839a3a40da6d0705e4f85dc164114939509545c46962929948496d21bfce902a7379abc7e96b6634a7a0a0eb1f953702eca709ae08ed007b9c5461c697397afb7e2dcc56c41908e6ac36e36b54542bb0a651c053fd5d3b718cd243364975ec6867312bb026feedd948174db1972cd9fe0b0f85058664e39072a101221886accdf1b243778f140064cd159977dd3a327dc2ca22299252c640b484262ed4501f9661e4fff473c5e35e266fd1881bd245146086145be610c7002bc18158d929ef61dd686766dddaab9ade0ace9293fb90814aa24f86d6208d83ea5b796ec9d6acd9290a7af3786e5204cf7be28a20896b28c672890102071582c4b487d227ab587e82114c33ec394b783605903ed20e7646a135d9ccc6a797d5c07353da33c3829f0e6f1ff229865cfb573137377a65f3eec3b8bd47444762819d9aa48aefa5784f34ec4fc678358da8aa5f106c562a28a69fe9e63f4217bb25bcc4898451e20fbadb956cc1c49eca29f321654b1b347fd6449a704f812c27eab13034f90e4c6c73409b7868e32ebc412e19964b24c554b887d37b01dfbfaf11b6f282aaa35b74b3276bc57b933c753af97e851c652aeb80156b47bf47bd018ff9869095c0e253ad0d30621623b73fd2f2ef61272b301af80b9dcb09f48b319136ca5e3963906557b89a44d16b9f6edc094e3c94a56a612c705d38692c159f82945e8f107894e295050d1be30835e637d909141324b0ace47ade114464da635a06975857a7f7443ad24a3eceb1e4c842059a30f9df4aaa49f324113ef00a933b0f04c11fba95568e5bd5c3c0df664e34b32f8727e18b4d5006229dca5fd6f5da327353187e695e150d5a7b39368e803a1e18503cddbd2dbcb12e0807925a771b128fd15bea5337ba888ad11d8adfbc764bdafab3ff3ad1579d4e816d4e4814573096b2c52bf18b8726007e40b9d662643602044df1d8d466fb4c3f49e5c27032085ea48a6b91ae951028da5c8f4c787d37b48ed75fc09744b556d2bfcfa0a41544533791832d87a35bf759969601c7571c84b33faf5f88d6954d1b6c843a0180436a523a3d74b0ae0a31da4744604721b914fbb78b15b48dd291b8b84b45bda96095167d7a60690402f1fac9964fe9dac27eec7370c7fb69df9548eaa5fa8b7ac8705bba674642784e11be5584c150b005a120906843eaa1731c42ad96bff0bad1769f7b783b341a3e7270137333dddc9c1b615bc1736ae3cc66d910d049f69c4616e81ccd9782a0dc0016fa10e107625db88677d795bb5cba139da05f01f8e214706ff07cbba313fe2eee4b713689749788f75a434c737ac05e48f8f45834fb960e3da4450f859da3c75e9b373773b207b6b1c772f06515b9ae3582bd7581b366a7d71f80f78d5711c138935357ddfb4882b90bfc330facb82b8e85f4914548d9a247c0bec7eea5328327801bb84c1102e34a0d3f50b720e5ca689d65a0c942a24fe7fbbad23a61b25bb9afe84fddbf0baa526bdb014e2c8af0364f92b2d6b32848f11c98d44b432e8934ad5ea19420b3a3aff1a1696e58442be20d8fc57ee790226b7e4b7005ec9391d5b7226a65e62eaa21b2c1c41ffdb46e0c7fdb037de9c093bce16880cc5ee68aa89d5c7acf60fdbce7c9283988629a9288bb78ad14e89b1f997ab9568c1f3849c056404fb31614ee247ed458c482eff567687e1f4503ebe4dfdd357aedfa6b3c44366a8c77faefbf0fa578ba7c00d62f2bd601ebb8f8bd1ffd5f0e09741267413edba01cdd0802e682f22557c62bd933a710631169336c69f8bd2ddda071b2879bab1b8a66b62c2a7bd7627e824d69e55e3d103f4f52ba2675286abd47876f1b3d4148bab99e9c319247b15e4e7ba018b1bdfe80e61595b5d571cd66bcf38ec3cae822c88c1a22d2b039dd9d4ac25e465f747c194e7f0fc80ec71f9820acaaf0513e2fd8fa8194601b3961b5de59f580b75fc1f1e2d0a85652e556782aef5fe338ccca1beb67454c3b1b9126a0da8c54be88187fa767423b3521e027109ea8202bbb4d3cd726f19ed796c78c56581c97515d35d633da56449d10e3c6d3e2ae95a38e6c2b05b5a80dd7dde849611d8f7110f127b0e572af7a57370f29bd767c3d24ddd67b22867f7738f18f31a54a5d762e9e0e8da257f8d0917f8dd81e2f80341a483dd03b77eb6b2cb52fe40a34386b283972ca17e5894058aab9285045a1dbacbf77f6b3b4b0f97143aea7903554e21d6e2f51b86bd8215501021a61680bba55d0ceecce64335b035475cd2c9f437e2fd0768db205dde521d359e3a996d682863415149d0354a74544fbb042c51191152f9c2b242de26880f70b12243faa104b28eb8476a8e4d87b2f0e902dbb84a437427f175b5b9202b010a5f33585e999b08c099422035d72c64759b6c38f3a57e51b8749b041d0b10d2f5cd590026efd26de00830aa7d4bcc54f2188a53104d2ab523afb04f586880ab8faee26339b9f5ccbaec5481501a051c8967cbf83678f57a0107d87f1a409b2276c900505911c532dcbbfc1b457b38a02b8a1e4691bf515b50cb71f8408a49bf641bd037894b5f7c62b10e7758a3e9d57a6d0f9ee418a7f9aabe8af52d47a0ecbb13d2644cf8d5b83e767ecfd4e129db87419eb959360734d1279938fb55a633d20707390cb3b1cac459e227ed219507a2b780b1af729f081d8fe9e26f85e9f56e29966a4d2814367f9b80da7cd946baffd33d01cd5e00ae48bfbe82557e9d5df756b1ce643362acf5a03ee1e5f101485a1af0334265ba6953809969c130c21957be12c0d3e1a791a16ea2b6f09b86feef060267191e9c9e8a93c872c32d93a44128af0350bd7d16e1b95738b2e51baf4554fd65afa02cdc95035247f8a0285d706e707087071d6bf8b696ce384bb00a2731163fc360e2daf42b995770078b31b2efd58d01ed39d70fc7ff52e8824e60205421fc501ce556b02b2f9f86f20f003259c6a407e0a135ceb58c4361262e241283f8b0f3459d2c59af007e7b8a9949389961eb09be6f705489c2d761022cd5f8ba943131b234b383c7c3a64e97880a87390a42d71d70e4cb97f9f16f3afdf3f7b64fa2e1c2dbce1a37a5a984ac3030168a5f3cb5aa8b83583c80dc0ea6f74765b8582c7cacdfc18679d7a079a6c3a7b615f2168ab5a0642e8cc5982c1a4cbd03eaa490a12dff49347eb08621403ffd646546e42135dfa6b63e090f4cb1c9963c6ba55262bb47325e887241f96c98a7ce24da676e6878489cb725ac5177eaab08c1cb6bd55dff10b0306ac29b8e217f86ffa6ff6456515282abeee1fdb5448d21782f6fca8437a25c4e24209ee7482f37fc10d8a5d30f1acefb854367604c2ad38e3f2d739eace2d6ac9a499dca810e6932abb0834889a75beef1abefcaa958930758cf99605ebba7e182b6886eaaaa79e165e814474030094d99c21c65429679f83e704b5f5d5e0703903b75632f22b120d6e5e8a4d4b1fa0ab75738e8adb061c27170cfb3ff98e747b74c4946c7d43c211a9a9122c56a04023a8b05ceea553f083408da27686661976c2eaa7559c80d52b5dd770e975040570c770166c3b0b152978b56f200f5eb0e7a1392f791fce21e99673c0c7a8aff9f56b6693fbded19ed81d439f27b88465c2fe92b466f63f4a09378010aff914acd08240c072c5fb1e86d35c0822c3d6e5decd135ab4dd44725037e2c96f6ae5687d7c4415de11da7888e3f22a868595b5817173ef9385985bf8ca0d11a3388f6b5c0c7b73bad66b02b493eb0a32e82d5cb6c109c87e3fbe4f0194ff47c38ca12f538a213e8b8dfbd7c3044ff2eccd901015872bfa7c8a189844db8007c22d59f014915283095b1401479c2ef29c30901c0c73f8f89583c6acbc9cb9ca7f132d8e3b84368be69407ee6298f73767a72d6e48a808849bf5d84726d3b8d764e8eefe67e953d085823d920577bf99efbcddb27e0d61a12720cbc8e0cca6928d685264c84783899e15883730786ceaf99850f0d02420eb3522771352498d11790cd2a096bffa2dc18244f26cb39c8acaa91f0b49f83b28575ba0dbc71129d773b920e980dae6100287a8c248c154d34781cb0558ec5febfadafa713ba440a9049485dc4f0a2c8eacdce58b7b569f32406113273875615f3980f7fc849fa225bce9a0a7ba481012975cd03e2d42457f2c8bc856e7040476f32d6ff1b3f7c50f3ad1e038c8ee07cf81d46940d626f65627b2385ce81b30ba4d5e7449d88b7559846cdeb218d3315b46e996129ed970a375e6bb3be4c3f800e6e3f48b982ff4984b38d98b82791d9f337386d6f3208128fecc58495f2b4c1e1437cc763e7d34e90e5ee582ec7594c9a83adb87ecae9270104e0171be466763b885e500d7e4105ad1d4310ab46b8fdc8d3102c5cc007609a8b501d3f88ab78945f2c0727f0d1c1e109d32d5175ecadfc84518d6a348229df755fc381c606cb000e71cd374962ca55ac564b381752cda37cf8844299893c28deb9a28950c0884600e7249aa3eb270ac22c49a9552f124dc36526734d184c67a574808cc565270110f5c57fbd0d5e660bb50a48e0dd2a41a40cd12ac7fca3e9d111d840cce835c9ceebf56c16aecf9f7d0df631dba28816eb8bfe766d571f21ceccb8c2421b801d6fdfb7b183ce495d2e77d7eedf66080df9ad4697f00fefe8e7eca52467836341addf0c728c8f3b96e93ee30d9b6378f107fd620c0b6a2c57a74da45403d9622b3501d80cb5b7af4588905b3ebf42b4e251297c727c605dc0960cb6a2b31b85f30153e9a1bb451301aa08ec24e87fbe2eae947326d02a1e1963827dc5500ee6a711979d1bd08a7890c79dd9e0aa2215619f4e8364665348504e8b6d238b6f3238757c0a5e3ea72d584d70cc64c029be2e2f047a23a66b854d55416f0caf2bc20a0f9e8e4b3f5abe389a3c3bd9e4a991b83418dd3a0a0188cb90ed0394e3eed439044c5ec3d2af939b7b412176cf31eecb638a7afae65330830646bdcbb20617c2e15836cc9ac447afaa8c225577981fd9d391d083e6a60c36a3c4198501615b75a2dcd3b610c9424725f427352cea8fcf5370c60f7077b248fe1401553d5d8d32984c8b1041dd27a289c92abaa5c8fa3b17a0988cc2f92b40ebfae4647a676d79fd2e7327bdbeb91466b828243b27f26d8d054632c746d880d3636be3b53f70b51ac89f68ac1a6459465f8808d1327773a4e8247a3d2347e703589a879d613ec74743b825bc66429172592a1b4c571965c61ed53ef14439dfc2b2054b46461fc39388933b978408a2a74b54b8c0de2a799f195d7f422fef42bff68725913d5d9b1333302e816d8ca5e6677c5bb0f19762e8453568700a6f1dfb68cc72c5a83179e48bc3d3d39fd07cf38d57ac76d6b5c54ddff054db85ee78ef03a32e052637f8671e296914aa0c1816d9739ba4ed8dab652cb4b13cb0d80386cf626333acc357cae4e17f4a1e233b549e02cab44286a7f91c6b21f0840a103392075fcd1b3aa136c543b7ed98547eaeab8a38644c237dab2f3b7114db51821a309b3ccda9b33a90582bb5f4bd78fa4cfd7239dd3ae5a7ee79fee32d0d6df47ea38d6b5dc7f19bb1e47ee2da77d70e865ccee1d9ff55cda08f97ce37f7cfe5b0ab282a66d122f0d2bad9cfaa9cd399f001d07301e512e18bb97bf8cf9ac10726ad4bb0d57914a06883516e46a776df424baae748790d63c6ce219e7f24024a17860d28fb84e848a505b89a83476848634b999c3b83ec07f093c4a51949db40291d302ea66c25c6c8fe868d8b4bae63f1bb80bea1b2eff916f2a210dd91aa5b0bb94bc5cae68fc403d05ef70e4e3148c6a29acea0f742aa1339d01ad8078c2dc6386715d9d2b5556efea12d525396d3df1ad05e1a6f438ba69f837d85614348eb9d96c43d92ea62eb7ae3f50cb29e9885448d91e06bb358556beb5d25aeb54ca28c56d699e8982d6d00c3cfacb83d639e9e9ae7c26d04e91567421bf2c979b61883691013f814af974e45c58b2547e7a1bc2fb391b8bf068415bd74acfd30f654f037bc808842ca615d99650c19451561430b97571063a98f941fcbfcc1fa55c6e5ab9fffe14759761fa9c438cdc3008f69fe7f479ad9a9b6e095f1429e9604384c110cb127be0c377eb2cec69a2f3e4935f5b27f64d5ab0aecca2643aed627f9b26dd28e3fdc77f7ce19811280ada5c9fd63f130fc9ed14e815d6daa0f1f1696ee0ba27522f865da153465c855b0ce7b99670a0609f60f99b6d8eeb048115ae09b2dcbe9c7b5c6cde93d2f265574409a974ebf14e5a3865aad19c140724fff6d6cdf2014d8bfba7c626daa584e6428bf7a2dca962dea1aae99dc05ae710ffcf48e38859eb937448c86f5fac46da3152cad7d4d777405dcea15d7328fb162eee60ad9c51cf30d0ee4fe737f82d80df1b80340bbc9dc96b5424f027badbfd1650bd47b6420d0369a27c45489f05d7885ed23025ed5590e347fe4bcd6419e502c8ee49300d77a0d57bd5644e39f9f5828d80735c8055a1c3c9eadbefb18dfc3e5bc259cdb05d1bcb3c936ba3a9834c2683f81d76ff6c29019c9a3ba787e4e61de745676befb9d8561603118a14493e7edf8fc6666bd3e6d8f1456b8b5064675d64baa0bb9305def21fadf1d15c4fc16cc4863b5cec66ffa0999338070f4331f0b4d84992993527c8d3c95df4f859431715f1a441f98ff794f62e1c9cbffafccf4e06b1e06f45a3c6f0df757e683b7c1af896fa328774058c0c4a06507499ed60218c5bb8cc1ff3cc1138f88b3a425c178b8d703029fecc5ac89c90317065183f007bc4ce7abfa810c801308f16cf468260ad4768f4e0c851bfc76d1b1a96dac4f147fd1c8ed00f2f91271aae747817129eaff4e1d7a166a2b4905e774ff39c4da6ba47e89f7c8bee6b96310371a14058b4b661465d83917082cb4dbb8cc62334bd7d209801cb2a757da613c185e3f4d7b85a08549bcf7a6fb87f4a60389f45d480a8bac95c2b0b70283f8b2f0222cfc33903a2ace39f4cb7f0ad567471acb2e85115651cf1823cc6e8acaa9090da9248adef28b2a0014e621aaf131a2634697b4c377faa10d889525ffa93c4f02e506e8505491a6ab201ececbe9475abb40e6d24584cdad88ad57eccbc2d5d151b78fb62e32f3789e00e4e3ff809d28ab7c79208cf7e72ec1a516481e83ab1440ba9a27d57b4cc595a686b10272a566ff35062e5c131237312db0ddff6d0ff6f4056a091c3206d99f6550f3e77746a3634134709efe8521f78ef12d3528d44333ef4998a68e79b6b4d59748b04ed96409c7d6ebbba6c9af3b81a2a2e7be038c6c70b5af31bb34ef628d5e69e6db84c7ee49e700a34b345f1f2658501faf1c83ea17a9668b31954473ccc507bc7aa791f7080b619602d5da68296e342d8056edd82c78f686c4b78bb6b95bb07a13be8cdd20946e36acaa23a929e3c7f17e11a3957938b11d5a4029ac8540edae540523c2c3fd8ad42b32dde38f618ddab2d5d0905329b0e23c78dbc61ea14c3f45049b955c470d972932351bd08de3e7f8ef2c7425fd7ceaf20e98be48357c9c4109b633903ebe9243ff5d4be6fbb85efd78b9cf26ec8dda3d7f3ad5f652d571165e11e9d1366ed2bfe00d23ecae092df3e5ad7cd63d0ad9a2c531a212d9ed0c09f5d162f1b6c4f68177cff7fa271692a3301885a3fe3fe805b290d6a4d1a403ff47afd13b0a7059d1fbdb96a29c37944d9ca21d611c61f982654af789f14ea462219efeb6365e0181c2b51778dcfbfb326e795986d83b73609d81b7cf3c9c0e179f57a1d1dc589e705e651f62a3ce7fc91b19220b0ce8b38bddfdb681c3b7f62355bdefd9149db7d393ce86b1bdd828a60755b44c879f4de5d08144f5572839ea960d8e9fe8a607683dd4ddc844af52bb985187ecef16a7d6107841598c2d6e648c0139e65e47d5d5174b2e2afea499ef7c90497cffb6734e48bc5a7b5d1238b56a53bc36197382cf7505110796e8e061e66f520742868297fab79daa3e36fbc85dea3f73c73f78ae92dae1bcc8a0c2c004c8d702115381c20b86ed2c4e35953d4c012cf580f5bb1bc01fd2758bfbcc0f1febb8771dad0edbae851394e8f6d4e5b8b1c4513d8d44aa1890107532fd48828843ea66bea603edd9071f79dc1c5c02e5fbcfe8c1186d923a21177806616c6867b57a90c186972212ef173c3bd32b3f1c2388958ba9ed5ee57850c18bf33a325b68826f0d90872345e9d0d60de6b402d019f6f7e255ecb6553b8082c6c341e832ee7a705ce3dafd75b3b2cad580cc1d428a6a7f2ee8f66c23a6a44f9fcf3763c00a25d8d61d890b7eb5825a513ec2096913d2495b1c2d0ac8e7031ebb284883c9017f0c3ec479a0bd786a71c4856eaa8376116d0d370aca183f71664ba587a44c01407c991efa5410c2a4eb8b421ae0ed6af222b81bbba7e91e57436c12bd4e3cd800584831259c60a0356e9afa0733c75f4be18028208904a637bc6c6572a4046ee14fda045d3ca04eb672fc88d3aa0b586fe57097e1ddea0b379a1ee420ce02458e034b498cecf616858c5f1e43109f91b38d5d439d0372d3528acd14a652bf80f86d391882a473d80f82337f049bb9056c1ef05b016128b640bb04c96d1e2de7baf4a95f2be1c59768b736c336a68a497380d34688f8c225ea863e0f81b3d02a1408cc3f0fd841e9ae6a1b1a2ed9cd42d805aea50a0dcf72f29a52151086075d3fe26c40c048b845dff39140805b0cf47bd0881f5fb5adc123973662f106956b5a7f9ef8c8b5a30fe35157fae8a7d8492f29b6b347e8cc0bb2c3631316bf9f3fb044a964a7f15110d564d08d2638b2f8d22500a53000a33e06cd9ab504908dfc88cc15cd9e22de35ed6b70080e36928906ccf58fe64aae51c3768755bb18f474b5bee00a77fd69cd708a4e76c60c78c002a43157456077226d819fea6429d129b219af8c8419465c48595b93c39615b869f8ebfe7ee67f7ef9fb9235ab0a93db8b1adcd908a5712cb7cd663d66438be8993dabe0ab03cb000f17263c7b845d205aa9deb06a33ab3ed4f4785afe2a9a3d51f225390736be3c952f3e410384ef02feeac4f20c3840b026c3013c0c3c0c3c0c3c0cbcc6f05bbb6f169f24a424a59449d010e0366a90644a49a69474f42feeee4f087d015f9c6b6a4ddd7e0001de0c1e0daa0cd557ce672a9a0c973b430cd088c424d3a22f6de78edfcbc06530e1d13b828c2106f2c0176190bc80062426e68c61a93f7505b19b474c38cdd7cc49cd75d4706424530f341c31b94267cb9dbc93393698061a8d9878bf31889ccbe97e29664da0c188897da5ef226e4be55f682c62628e78c7b788695baeb898404311133636d74decaa760569246252adcc8554771131f1362e34cbf4b26faa64cd77fc00a3063e2c303292bc063e8e9638d038c4a48d13e2234fbe838621266f8a68ce64fdc13b598849316d4c1ef3ee629b8a0621aeabd2b9683934937e10e78bf958a1d1326e17c461ecf745678a031a8130c56ce261152e2d552c3175595cc35718f1a9c46347093af38031a60188c9155dccb206afbd3419621832c4c8818111e4a8c0077a606064646404481168fc616288a709d5689e74c584a0e187494109a54cdf5bca96c5ba48d0e8c304a574d6e6504b42683d06243f7c3c094382061f268e52976ffba97e314f12c45f60f21134f630f14b6de690af7a159692b5934880b406464646461441430f93d3ee4757cb1fffce2de30718201841e2b1a344c7c85d81461e26a7243bd47d3275e36192f8a4e3c59c10ab41e90e13463cd69b0cf51859390a34ec30296d977757e80bd7d14c028d3a4cbed2d229834ce959171d26b6f9c5d50eaba12e599040630e1354a994bf4a768467921c2686d1a796454f79c96f0834e230b9b253d0546e1e534e82c3e4141f9b3dca2fd8be6f985415974f33536510971b268bd01be25c4325b1a7364c8c59131b1fc554ebcb86c9ea79c7eba4968f1e4b0e303240c61817041a6b98184cb6a84aa2447f6a6a985c9e2f961c95461a2606214aada6bbe5540f1a26eba5cf52a95dc3f57d86896269695c8449f32435c304f5d10b727154d0a55286c9576fea5521c3a498ef50f375336fdd18268fcae557a672a9945429a0218609ead3ce8a121a7a750fc3448fb9d1f8abe9359fc030795479fa94dbf4854941e57a0a97a9427b8e1726a650213dd8072167395d981833a6181dfb1579311726bc6de8485f3d9974760b934d3d9ae5706a6172d05d712f1565fdc9c244dda4e5634b586cb030493cf605bf8a2ba1e5152689d24bd2f23d07e12956989c49954ea2f64d7fbe0a93740a3ad645bf76990a9347cea61f3db5b599a33185c99aef4f3589cd27a5d190c2a43c25372efaf62e2b1a51987422c496aa0f3f963734a03031a92454509e3dbb9e2603349e50d6b4947133b9983d2b4d9b8c5175446fed000d274c0a1db6bbd133566cb50993337e1c79428e4c98a4cfad2c83d4b170b9254c7e135955117b234d12921f3e8add8dd162e0a1a184892d761d367a8ba5a497ac25bbc0c8c848318d244c4e2b966e47b5d6e88c8449253be9b37053c94343e30893622b88cf94b266caa092b591912fc220f141c30813adecb3f7f6ace52c1761923a5341a64faf94fa4334883041c595d27f6b966ac1919191912198e1ed549cf0cf532df58b30486a4043089352654b1dbe379a1a48979412205df24518242da01184094af709592574dba5381026688e5169557e3a6bfac1c424ec922599545ff4900f26ba7ec7183be9f798d383496341338596ba922fd3e0c1a43765371f7bb38bc95e3a9976b6481793c3f2f3e8b8fc8d31998b49fa2f93a912cff91f5c4cce2922faaeb3a8cade6262d768dbe774292895628b09a73bccc445b99091d562c2a7181946e52fd15279da18fd01125c7e1106090566d0627267ad7c7a4a9945612f09192a6e9eb04b5607173166c8626295d0633178c8f4ec633159d46993a272e77c3e2c269caf8d68973039d27cc5a418d17df7296f5375335c31d1f4dcf3dd527b9d983c08f2316a301919f13432e2e987cf68c5a4b0abeecd2db918e69235922cc30c564c14b99c92bab0f73962c91a09098993e164c8a087238e61c62a2628f1621d83899ffcc3837c93a8629255ee70a3e3aac690f829a3c5e02fcc48c5a4b59c4ff12a48b9182a593b2ccc40c5a4bcfd7933ddc6ea6e4bd6ec4e31c1acd3cff9769051ae92355e534c129b378cd8cecd5e1c8819a59870f94b565219de374440cc20c5241f553d272fe9e0591ac504ad14849e0cb554d7e9c30c514cce9139e63ff1f3a109c5840b26532fe818ca534641315993e7ce1a935c858c65247398f18949e23ca8ffa4f6329abe640d48901e1d246f862726afab9a7dee5ce8ea667462c2e58caff137e3a258f84518245e4462062726e759d7a87ad37a212a5933c3400f103462c62626dfa63e1567f3b706af646dbfd8400f10dc176190783187199a9860e349bfa7ec9589ec0e33323141773e8376ce29e24298989c7f741232e9f049c9f81213cd534e5fca9a8392318f0e332c3131ebe5e61df98c4a4ccc2a119b766697799e418949715d44a554575b1e3389499f37aba269e7946a929894ed3909f99df9b6e5484cacbce699c74b74c69098e82f42fad57a5deef6119394924184ac3a7da9d4c286198e981c352b9d5f9acce96323267a8c3f959eb228d39c11933d346e3b94954e6d5ac444d3a9623cb9878ebb22268670bd14de3e5786b8469043478e12418e107820c7c8c8aa1666246262ca7ad1183a2aad650613e42acc40c4e4bfba64722bec6a477ff8f8f163c2879828377a84aacbd1d2372450986188c9ede71ba3a72da9f27861462126c9347db2aad2c9184e1e3c5a070900b63083109372c3c9d9b6a44a6e5bb2a696a6c5be08834404330631f92d4bc308e571bccc1f3e4848ec26675430431093644e6f3599a4c6cf4e204a32cc5a6af67ae71a101384c574b7be418efed11f26c54b954626d11efb97f7f061e7873a3ca8c51ea5f365d6cc1761909860461f268b0ef59872a7f4e7a6642df510a37ffca840057280e1811c3d3c480d263c78b41824181911c30c3e4cd64aef1073f649f8a887197b987c5ea6f326630c4761861e26e5183df92e9fdcba45c28c3c4c2eed5b9a2e9f74572b878e1cdf03af30030f1336f69d0e13b349f74ea223c72407181ec83132524662678519779830fa2d44cae8db3aaf642d970b33ec90666810994bc8a43c26f8220c12001c61461d268911572a59138384078f26e10ad80c3aa8a229635ba8570ca671ce98c3c4bce8194d795ccf2997e400230389c70e322c30320224063e7c948c8ca43d61861c26b598c6507fab73512a5923f11f639ca9290766c4619228a5c36bd2be119926633f1c083e60061c2688cad0f03a32a367f98689ed252be7ab7bf8f3cc70c3840dcd0a7176d7e7fd8c364cee7ed30a3b331b268a7cb54aa3e3dea65fc3c4cea195525031b9a524354c3ca9f17137babe7c3c0d93b3fc64fa6949b553a161a27b527f517fa9636bce30318c8c25ab9dc305cf9861928cb71e4ea9243674a60c933b48d1a63b28c930796f2f54d87687bbec18269f7a8bb76f6de2a4268649796aab54b8947289310c933ac970f9732b1826ac7e9c109d37647cbe3039e9c8a8316d0ea55dcdf0c2e40f3ab48633d537a1cde8c2c453a6b55f4db8858e28f8220c1292195c989833a859e5fbadbd780b93827cb56bbb91415559b2a61398a18589495fceba310721366419989185c9d164938e65dac9bdc6c224cb17ef4adde67f0b5f6192f4513e6a9b63aedc5861e2570ee2c2e22b57be5598982bfbce922cd1162d1f3d48a8303147b5dc51f3f558faa730712eb442998e175b7e294caaf64bb1172a47c71f85c9fefb5f99664a6d76284c0cc2eb36782e8d31789e3051f6323c27556d5eb313268e55a5779a1096296ec2e4d7eff38c694a58c54c9820b4499df7106f1ded122667d0219a3b55b75aab84c9f141caad85e6b547933031ffa7f7244f3bab53244c1e5d7da543cf45f1e41126e6ba8c35fe756e731a6182921f844aa6a772cc4b1126473129eaf28a10fd15224ccad10f7a74f6f9cab9214ccc297e92da6bd76b32214cb898b37dfe58a332c68230b9b36cdafa7518ad1a1026c74baa5c83281d75ffc1c4944dadc23f3e983ca2c5d34c84fafc7a3031c8b73aa15f27639bc1838996d12f4ceb694ca9f2621793a4a69ff374bff14978b409ce7801092f7431492c798aedef87f53817932a2d87de39dd18c62431f331ca00c30010092f7031b9f4799a0b8d7336f22d26a53c264d26f131ba59f4125ed86252e5268d29a8acd72caac504796a4f4c68dbb260f1821693a2c936cb786273886916139488b18d9e31fd788e2c26ec8d0c1b833c0bf22cb198ac637a6271b1fe4384c5c40f3667b99d5252edbd62a2c62f5da2bea7839217ae9854274b6c7fc78b79e1564c92212d5527f9d6df2c0bbc60c5a4d31e7dc642b527155fc5c44c991f3fa55199cef5e1852a269a0a9953ce7f9331735231f9742d8ccae019c4362f5031299dc6ec1b3bd37bd29e62e26e6d8fea24dc46695e9862d27bdcac31bbc50bf7976282a5a42b08357fb15227c54419eff1cb8d17db3fa398dcdd6145d38f4c156344e1fb98e8ca336f282658fed5d7784a2e6f05c5041d84a6fff7ccfe4f3f314173d7782aad9b97e4894929f7dbc7847acfa2d28989574a54ae6838312989ccb79229c5e5af6c627274f17aeb201b43073531c9cd475846512fa2741de58eba9b2c84646252e9f0ce33c2643d8883ec00b263069c038c0c04d901648709120fdf8101129291919191911192359b08c1c4c4a8ae29e32925b45b5a2e31b9e3e653f1d715bca29698d4aa19c49e279564f05462f2b8cd8750cda3b116252687d3f522e7cb2be638991032898931c61459be79fde6ac238448625285126115d3cd5e16971012894965b17b7dad84e79090dc25ef518291912d8440427bcddda4545a48f110218f9898f2d459aa8aedacd0a0478076b00871c4644ffd3e3e5a1e17bb91911d63b43922a41193f4fd8bceb21fb206a23b0861c4c495932989e8e6d7a694aca53972d4c3478f111d3a7294f13b7eb8094a3032a226e0813c8d8cfcf03180148e41842c62d2856c8bbb9a2e59db1a4c46468a22ceb27b3a8a8a99fab183c46c55109288c92e42a51ab13b2564be0112cf8022c2ab4bf1ed433e7ce390434c4a9f7b47069db3628c31c484bf6456a146ac8f4c1662a2766ed41ef97ea1217f1106490e420831594b754346abb81ef3839858d982cab45f7e26ab2026956f0c931df4bcba0cc4a4ad98ad22cff284b0006272099da58307ef689f9d808c903f4c4aa279b9432699f36898c4d47ff8405108f1c3649937cbb9fe2fa293c408e9c304592aa71cd4a820cd91911f0ee430d57e1106c98e103e84ecc1465c10a28749b229783ceb8b8b79cec324253c3fcb2df67d362178d02eaff77ee7dcb6374808b983f739f7695a75778be1e3c78f8ce81819b92545881d106a4c2921ecaf4e0f24a40e59a8143a4784784504217498681a3d7b4e9f19539e42e63041ac5ac52dc7aa8e6f881c266b9c7f2c4f614ca831240e93e467bc45d39e63c51c02870923938ec6a7fb860976152f3fee7d4527cb0922c40d13835b887ea8a073aea82942da30417774be7652cac6734611c286c9a54cfb25797a3af5dfc3c70e1bec10634790314040028a90354c4e3d7aefada5a929af864961ee835dcee757974ec3e4caa3e6a7e2cad9c7216838365ab64a350b9766d9ece5324b970591359e61d2b9e796e81f6d33a319265caa988bd5d5f34a711bec00c2580829c3e494a3867afbf06ca127c344bbd8bf8b1b5358fd8c6182272553bb43dce939c530614c2bebe7bdb0e696304c768f1b2a6eb1cdf4852d1002864959a76cb37e724b3d867c61c28c2ef526830a73c1f6c2e48bbf227cc4af27753189d55521a40b934dbfe778ef6ad2d7e7c2c4d2a3be9ab623bad7106c6182afcb59fed0364afb256b2431f0e143036504d9817cf070138c4422440b1345fdb3a2e7d11c644e10cf001b21240b1383fa760eaf13ebe06143081626751459497edc201ebfc2a417dd94d94eee57a11526e5ea67ce61e5aaed1f19410ba9c20433a5bc4a99bb49db94ac9934845061c2c76a90bbcac94493255b8390294c1c6daab2f3a9dc0a67c9f2e0d10505215298a0826a75de6cc911da92b5e4713a870eb490284c9ef7b6939d9e3299ba83f405ce2010028549b9fee12a9ee96cf7f7f0612c071819e8018220401c8c9111be42c8132657f9ef7b323d22a4c6091333a6a7fd54e7693e3b32c224a668c75648139800648c03842ca100214a3040481248481c108284233020c4080a08290211dc012143002204200b0809c2014280408280901f2420c4070608e90102427820801abb18400d5d9010a0462e481a50031704a8710b5b04a0462d26680d6a21ebbb174cb49868392c6a9ab71a3f7716933fe5a0c9b3a511faa52c269d10ebdca9629c6d251613434ebc7dfe444b7d33a8018b7ac365e558be80f18a49bd9676e7deca72bc243f7c90d0a07f9004f117ac72a0862b267bb228ea93c8f9a46e090ae26f96a617a8d18a89c173c5f555be3e1d2e5913a39d84151373a8135a4da58b764882f8f0f1438cf61f4148f045182432a8b18a493984edac0693f17354b22686f3601e13319c875fd750c57a6eda3f444f7ea7e4176190f4a8910a356b6b8e12f6b9a263d440c5977f25632f63874a1554e3141353faf6cca05af3c71a811aa69898c6e4a54eb217abf3a59858713cef678a755d312926891e5f73519f19261dc5c4d8fb27d65b5f498535443141c73cb59bb64d65f84ad612117950231493fedddab49dc5a9d3ac062826ba769908d396f3c9a44f4cde0eafd833bf7d234f4cae9cdc46e558c79f9d989c55ae9753dda9d1214e4cf6d70c2b9b3d9b982c3a7bb65a6f4d4cb2be9e8f49e96c27d54c4cb4d8716f44375db41313934b659f2ddd598b332f31a94a8c4c8f23d6f6532c3151e7b52d79ac12936497fc24672ccfa90a2526cce56fa89447c798b3494c52af8d729abac263554312934b66eaba78ea16cbd691a3429043478e02410e1d39ea8b1c3a72d40772e8c8511ec8a123479501200f35223129fd8d5042449fd697fac76464a47ff8c8089a2fc22001520312134e5f6b3ef39472fc11136f2bbdf4d5bcc9d270a286232606b19d7f57fe3f74a6648dc44d51a311932acde92cca34bef7278a1a8c98d495f387c738ca82fc56b3e0998e1c35c911020fe4e050d458c4045319ea4a57fc422795ac690d454cfc0ee247aba6143eed240b020d9853d448c4e45ca13eaec542e60f8b49a8500311933a3c595c9041565abc821a8798bcbda6a3fa7c434c0e7f2a8c8b50d3bfb993438d424c8ac1c45edb6db0d79c109356eecf43342b568b0631717c445ed4a7e8c891100c350431d9db54ba34de3163260331316cc409fb8ba694e539c0f0c0c848660d404cf634a6a5df77a3d252b26697038c0cd86007093450068f1e20701bec20c188d5f8c3c4aacb1fa49fc9b4aefb61d29c5f08d5b6213cea7d9834aaec7467a7f4694a7c989c5d61e3a9c76c3a95f63051fe3559befe7ebf480f13336691ad15bcaf53501e26c5cccdecf2a421f7c1c3a4ec306e9e6373b679ee30d1ca3779c550f2e46c3b4c34d9bb38264e93cae13a4c3a2b9db5a263bb66a6c3c4b0ba27fad1634fe5394c0a8d0b372aa7ebf995c304919d635ee8ec1f7e8dc364511743e99e103a86150e937f636d8a8b9b96aebe619252b9dc574a374c120d36a22c64764c671b26fb6b8af36c57ca74c986b63a5dc7cec1b286096e166fd67aadfd56c3e41f311a94e6b0d94b4cc384ff186f964ced521e0d135b4d744bc6d366ce9d6182b48f1b9f498ae98f192669ddccacd4ca30b395a1f12e4f714cdfe7e08f1a64b03eaf5b0ed30d6a8c6182d4fc500ba3c2b8a7c43029281765aff71f2cbf668e7a7410203d369046821a61986832c51cdafc46991e95ac91600c32925f20f91864244f64a80186c99539aec8cfbcfd27be32d4f8c2046fb3abd59823456ebc30417374111f1b35e71c97ace188de186a74c10835b830e192f85a887cfbcccfaca1c61626796dc6caf3acd018b85aa8a18549325e8c4cdd9d92dd3a4959a89185c9a19563abe9eca8194bd682f4d851521264070dca15fb400d2c4cbe70adf4629eb6633b32a2e7861a5798a83a3797534eafabfc1989012988a8618549aa93b8183c3bb60877646464e48cc4ec4a1235aa30b9ef7246a7184b8fa70ce4d09103033a725cc024a10615267dfd8ea6d51555999cc2a4edafd823f6e1930ea530794f7dd29a52d29ece8bc284f110194fa5dc29a86b12840719407c042323a50835a030d17f2cf9e80fd6b5a7274cf87cb9b9d5b26e0c1d274c9026d33e585f3abd761326a61caae7c3079ded351326ab9dfa9cf9d7af275ec2644f791dee5faa96844a4047f3ac1743e892307153d8ffac9dab258384c9ffba9e54b80f1a5dab718409a3f192c9503aaea59111266e99dc8a0eba42cc2ec26379415aded37e81ab831a44987c22e3351f2e239654630893657312325c2a0ba74c29460d214c0c75713b7f4c35a14610265ba9502ac333884cb779400d204c0c39dae2afcd332d4ca8f18335a7a67026973ce6bb63a6b28f35b2b43e98bc9dadba2d8aca1dea1e4c5269f396906d1eb7524ad66af0605238dd14ea820c9baadec5c48ff334b6b1eccce59235dff1038c1284862e2665a94e1393ed0b9f7331394bd7828ab3d74a0f1ab89878b15dc962f8b4f6f82d2686fe8bbe9099912597acd962a25e0eb3393d97c59ca9c5e41c8bcfd4cf6e91161394c67fce11fdb722ce6262a60e6a377daf6c2bc3c78f20403cad073cf9f8a24e1693f2271399b72dcd27ab063b9e6331b12b5db765154ff267584cccb9552fe6fbf6499a3a68bca2919efb62ed475eb05d31e9573bdc4a476fa7a0564c1ae56b425fb3a99872256b3c7c906c0868b0e28c297ccc5479a56c6e1aab98f4f1f46ccab437ea35256b3f7cf4d801021aaa50fecf4c740ee93997a9b073d40e26cc944e031593c49cfc501f439a6652098d53a822bfe2373cc99c76533c2ebaafa37c749a256b568a893a6237938efb9f39448a49d62754a4efbfccbea398949bb22861a776d3834431419fcb6aaa79cab74231b1834afa553af582f7a0989cbf5534bfcba88a399f9824afcfea4cc59e986852e3acf5bcc92cd2b3d2894915a74f6397da1fef3931f1c3dbe9f7517af6a64d4cfc28ae795566ec82a5ee0b1a9a98e4967f5492d5bb59a292b5dc008d4c4c0a2b422de99866d72d9898e869f3f676b2cf95fd121394c6a43c7514b5a0632c31299b50324a0525a233a91293e28e57e8bca0e4544789492344c51315e244631293c7bb648ab42eb19623f9e183a4688086242626c64080f88f942a50de70e3131393079536da6b8638a527267f523a5c296571f1db4e4c3673395942de94d69d1313838b908d5a557263d026266e09659d83ca4183506a6262d2d4972c3b8f3e371313544f7dc988e7d855c1c4a4cfd82998b5fa052d5e6262a9a0b2c54ac8ccc72c31493dcc468b655562928e9d7d15b5ffeb2c176e506272f44c1953f792692b9d4d6282fcbcd3f04967f5dd4bd6caaa704312936acf64898b54b9fa38e1462426cf67e55efc5c7b2d061da4d4a03f9043478e32828c21c6a4070872e8c8917aece840193f9c0c11e4d09143478e32bc033974e4f8e166c668319009372031c9e466ced1ae4aa5127ac4249bb599d10edf9766474c92ffe9b6f3f7db36d98809fa272b27b11bf38cea0623269fe99c9b5a27cd4abff98096e0c622924166523269fcdfca8f8c8c8cd491f018438c1d6840d20b35dc5004232c6cee534469ae644dad4709cad6799c1d2fe841c61bd51cdc48c4e4fc4909f529b7db73acc30d444cd4d9ca4e6d29416ae02472b87188c97966db4bb3675b513a37dc30c4245db50f4f13f24a5f8598d436e749a6ba9ebc891013d46ed4ecf40753bd09370631d1c2cdeb072beb4a66608c16037ff808d22c88c97ba6c3a4abb6a82c1093b43e6c53940619940c101343a328bde4f5d53de23f4c54df31a1e92797e2f3c3a4d510519f4b870a2abac28d3e4c54d3b76bf3142c5a9e0fc58be68b8677d875f730396f2d6eb7ff63eca4d1c3e4cb39f8a65493a970230f933c4d7cc97ef8b8238487c941d65692a753a3e5740937ee30299e66111b3c87084b99126ed861722cf19a46a9d6caae7f71a30e93b273f02c3a9a3726b564cd472203c8066ed0a1b2ca96ad2934a56e0d971b7398949eeffe2fa3a26f66b821874926fee9ae7cdd6b4e719894e37f85297d7b17ad0f6ec06152d810b935dea3197328dc78c3a4fdb399bbdef6f2f90837dc30e1c3834a21d5adc3636d985c2a6cc72f9d795e2a1b2607398b7e62842efd3602800837d630b1f305f5d4a579a3dd2408e2406ea821915651a3593c0d13b773f6974f5a3fc6a06172d8aac72ebbf4db9e6182fe6c371aa727f46a8649ab6e722ee76edcf4cb30f94f09e1d941e7389727c3c41c6eb73a6fc617e18f61925c0f1fd4c9242d065f0c93e37eca381926fd7f0fc3e4d2f9154b7bdae01d07c3e432995299ee6d79e95f985cf1b644bc3ce65fee85c9729774e58ad9dfdcd485491e43e473945039afc485097ae7c2529f92e63fdac244b930ea639c4c32a9911626b76dfe72d150ea625016269df84ad565caa408111626f6e8bf9f9cde08fd1526be8c5f88a7fa9c72ac3041986c58fe0f274d73aa3029e779983c0f152686ca41bb5aaec7d19d294c4ca3952d9b348ff31d294cb09ce129aed5a7d3771426fd998ef93c14262815a62df492aa313d61f26b660a4aa8fef6ed8409233494f851739de4264c10c2834c1bb77b7cd34c9860e24459e92a751fed254c0ea375631bc456d456c244adaecb76158baf27616209533abf778ca34a489898f2caf353d5f9d947989484ee7c52a5ff3e6a8449a775646cf7a7b72417619207a1198496bda5c84498a4b2c22c6a87fe8df110268f79c5138f276573214cf670f9b7fa584a988230f9da379aa90e1026b77c6c932a2aa6a87f3051835905e1ae17c5bee18349b5faa934c874b7991b3d98f4a94bf8794abd746ff06052f4cdd359364a6bdcc5e456b3689f34e7fd6774313189ce41a73ded95542617139498cc36eb9c4d5a061793d37c36e58c714f7a6e3149ab6f27e1a782fadb16933bd88da8aae5eab91613ad47ada928111f312d26de5610fdcb795979673131c81d17554ac82c9795c52479e9f51d631b8bc975319ba2f32bca57584c8efd1e44ff9ad0a3eb2b269726734f6d72c5c44f1d9f5e4af3a8522b265e4ca3ea9db29f08b1626290137dc13cb694ce2a26b78ae6a8b09c623caa985869d777c4a9ae0ba762c26cdc8fe6bd20ce54544cb42e91c1c452d6977a8a49a2ef6de4dd37ff6f8a897e49f3c33de7524aa59830234a63b888bfe52429265f6ca8f4de39a9f7721493e2dc59984d63baba2826c7a61c3298b412e609c52459f5741ac6e28318141377454b85772b8df127265d89ab9e0f97d235c51313d5e29d6b97ca1daad2894921e644cf28b92d724e4c34b1de9536bc899b3631412d8f9685533ae6571393b352faf0d29c226e262689cfa573d0a543e4898909d6b9e7774ebfe7798949caa427f524a2252666c6d0bd1d63acafb0129345855242c79c1293ee6b93588fbf2ba2494cf61e3d6341c7dfc79298f0a29f6b532671df4462722ca949da26f9361b484c0a4ac385cda32ac9cc2326a86d6d17137d9f9973c4c4b71ed11683dc10f71a316994bae7c620b466ca3162b2aa7fe8d075e215bb454c9a950db2d19209f34d1196d72879794289989cf1dbd24733b9e934444c52b99ce5c56767748849de69f6cf6e4fd66a88896ed24429fdf0b12c1b85986caaa19efe324f7a071b8498947ce452cde3d3361fc4a49ebb9b8bd15973ba09614310932bedf5cccda8a88a2c10360231c193f686cc5e1ef64ffea3181834e811d8d1a07f78c00620266df46ab54bd1b1c1ab808e1220ad017363b418c85f8441c2011b7f98dc1fb2aaa4d96cc30f93564c55ea9efafb9cbb818d3e4c92f1a19535a9a04709f161923ea544ce3efc82d88061630f936f2b4f98fe322f6bb0e38390940021638ca28709a2b94bdb2dffc65712d61103d44148f0e3029a87491a5f29e22f9bd8c0830d6cdc6182e61a93567a594a8d232323232436ec304976471d15c436ca5dea303967e9539f4c63b0202c59e3c1a383ec1063070f12b5418754ceefef1abb214e62d898c3c4af4cd146b82987c969c4a985d13946cf1c874931ee37fbc8cffaa881c3e4b41fc4ca6f9a15f9be61d2656f568eebfaff6e9894396d10966d63dd5ada30b16ad7b7646b8aa3191b26cdea87aaff3c52532b59e31cd8588329775d9ad29937c86664c4249063430d93ca4ffbe98d7faafa97acdd8f2063d848c359f6e56775d3c6ac646d64040323c093830d344c4a4234845855d9136a6c818d334c32cd99930e3a532fe32bb061868931be678e4f724305b559d928c384cf97825ff9e5d1fcdb20c384cfd323a7b76df4eb36c63041a95cda46fb94935a36c430397caf5df05ca722636c846172d898727e91bf56ff6c806172188f517cd3b46212dbf8c244bd54fa83505701850d2f4c4ef245e80e6a61b6449ab0d185c956c1827b7c708d6f594bd8e0c2c47cf16acfc236b6f0e9f5b69cc45ff4d21e226c686172cc98328d8e576bfadbc8820c6c606182e95dc57832659cc5e50c36ae30a9c27cdecf736964ca0fa560c30a132fc6cd6947bdd7e4a9647bf828cb01460672b0b92fc220f1620836aa3049ffac54b757db2c4e8589a33a33e94dab94a43c854942a97c29e7d1da9d62a430b9d2ed5f756b75b8940424867c06660c071b5198e86aa2d545e9a8773f1426652821f4c8a9ed8ef513268d29bf5119375c67cc8613265b8a7537cd39a9f4b809eb9fc7b0a083cf994e60830993df426cb84ae9cff5323252b013369630297d8e67414354c24437a53bbf1f2b9a3e03369230c162d0b76823d37c5ccb038c84c9a196b5ed72ea247c3ec2e4cc9632e9ba9c299bd4861126ea7ac7d049875b0a9e2cd828c2e4cd3c174c84d29a59224c50bf9b358b888b8b67051b439858396de60b9665d4a88530c9939aac689aec93a769828d204cf4a45c6333660a15938609368030f994eeb84b5263cc563f98206fce468378bb196919c9166cf860c27706cf932aaad4ec28b0d183c95742a7a0757b473d08021b3c98ec27fa2a87d727997941c82e26d9071d54a3a5cdfe1a898fa43608d1c5e410153fc3764fe8f894ac0129b9986c2b1aee63b298747aecc0c5c44bf9544b5dcc78a54bd67cf4b81984dcc218633a4bfb419b6d9784105b4cca9e9e4a7a8757f6bd87cfc06b31c12c5ff6d096d407cd94ac91f468743c4268312928af8d25ed34573e4bd6ca6010328bc91ebfce4cef9c1a1bc962529f4ca12eefcd3d786231b9dcd49cff88f220af203f82ac8dd11f4824c97ff80802a49c176c088145dde6a3d941de5bb664ed2e0821af58b774989117fdea97ac915c0f425c1124a415faa538327630ad342b269b67864d1f132a8dcc2aca7c2a97be30db18121f29adee7410a28ac9f2c143839bb6e6204fc5e473ab109b51c974c8435031e9a2a911d161fd636339849ce2ee0c736ff54c2953e6d24a9ad64be76139534c0e613e422e26bf911d124b3584946262929bbae3a899379193627285583615ad9377527314934253ecb071917ad10a11c5c4602d966642d8fa6948ccec10128a492a5cfc724aaf51737d790801c524b5a8234bbde764c9cc4f4c4edf98a61dbb77b2634662c887104f4cac51f190417aec18352331638a08e9c4e464f1aed255ba30fa1c3ad010c28949ba7b357a77786ad2433631a9b36ce87e399547a489c9772753c7170523a2b09116e008c564cbbcbf956a4e884db9a80007282677fba9346ab469ac9f98e0e135c5fb888f8e254f4c4c42af7978fe4f6b391c9d982c428e59d234716262c5e5a0d4e7a437f34d4c0e3642f65b748ee9439a98143efe63cc49fe467f323151f4c78e667c78d1c1c4a458e2c974b068fed9bec484cb5d328e30dd2b8db1c4a49436df698b7945d35662f26ad03cfebaf1f4a7c4e493bb3f7e2e7ff2d5494c107afaae714954c75212937e83a8a0ca3ea9fe94484cce99b9d3463b1c9098307257f7a7d2694a2b8e474c4aeaff79ee41e4ed848dc0e18889e2335b418bd88d60c0d188c979dc4b99ec744bf3952c1034464cb2b0a926bbed4d5c0e8e454caed94e62313b1c8a989c34c8acf9e25d692f256bf6001c899860e2ba29e99cd0204ec3818849327309b139651bbd1e6272cc3dd3b54c72742a196282fa0a25338a56cafe29c4c4d3f8583afcadabdb84982467d5c4d99b76793b88491f44a6f24fb5f32d05312935ff7b58cf795edc404cda32973da5d286f2130c1c8098742ad3a5b0a574e49422c0f187c9f9acdae4f601a4870f64a687c30f13544489cd336219eb22e3d70338fa30a953a5d40a9f6b6663ed000e3e4c4e41f6e7ece6a792a5057671ec61d2e7763025e4d6c304cdaf39c3e63cf2c29b874977c274f8f533d51cbc38e0c0038e3b4cf8bcb771a76e34fa5ab256678789bfe3f6397ed070b74c1f70d461924a5f62a1dc3cd617831f3e684007e3d2aae6e3dcf2051c734035aec96021fcac92b5dd030e394c10d7b89fcb948e297a4ad6ca681e89870f04442781230e13d357aa4fad31aa060c38e030c193d8f1987256b2b643df60b657abb0d7db0b38dc90dc203d93cba5d8e92809b2e3044078f0a8400e1d3972e8c8a123878e1c93529676c0d186c9b75b4266c9349d5ed6030e364c1295565ede2c54b95b071c6b9860fa76f95238e580430d93f6b27252296b6c74340d93d34a558a9f740c8fa261e2eb097dd1bac782e50c13763d6f0859bdfed0cd30493d57a8dfcc25d3316598a083c77dde2da119a36498e0c95e4c676829138d61c2ab5c509331675d26c53069d4a69e7f689e915a186cdb68f179f1d2880a071826092bb7eb8d4166c6e60b13d7448cd85cba67f9e285c9d94b4ba7a8c80a5284028e2e4cd064e3d93f0593b21b1726068f37995f5cd37fae3801c71626e87cbaaf424d4911be16dafa9464dc8d978c31b230c1644c49c39bb8dc99b130b93e7edbf9a789e30a133cbbadc5cde1b463e564f0e8d3000e2b4c4ae7c162bacff2494e861824e50d38aa3041fbcb76e8314bd64e2201d265402ab0061c549824f4d67a74554c997d33e098c2e4a44bdad785ceef5996c2e4da7cb16a339f3bdb5198a462ebc5ada4fa6f64256b62f8d200071426c794971a7f969367d21326e731538f9ee9ad741efd639218061c4e983017adde6f2ca9e5dbce80a30989fb93c1d7ad458cc7041b99038e254ccc31adf3cf39a70a1d37e050c2042b37cba24aa609d309e2c3c70f2be048c204ad9a3ef669aef00e1226edc8a68b41081defb751038e2370c2e347d370a592351af40f63041c4698243eec4beb35c7dd2034e028c2648d5a9e5565b5d9a232461c4498143e6527b7b3d2ae8d8ce018828dc400871026e691dda2f45a64c0118409d2f3c4dcee9810262e030e204cb88aff9a3f9e52d2960a387e30a934c6686ad782c91c3d010e1f4c504f5feef27b71f3ef1f64348e1e4c4e2ac3fee61819dcd46347eab1030323236bc0c183c9295ea864394498f81d825d4cccb1adf6e62763526da05fe05f88b183e40922ba98fcc9535da4ecaea92e17b8981c42f4a7cdf68d2617b9c5c4cf1b6399ef775aae6c31e962e4b23308f941a416933a97c83b95b191913a5a4cbef8d2496bd6cc628206a5fb419469f5f7b298b4b6bf1594b2a0a29fb140b3a9995a8cf38ccb4ab64107cf2cd69ed21ec37f8cb134e81198ab8305e339e469581e89bc420722ae9824c5bc3c57de94f57225db8a8927a2bbe288ccf45095acdd4084151336bb376f10de695363eca041294364159362deac8b525d6a744903efe186511051c544731d0f155fb22e1ee30491544c4a9b599de3e5c873f350314959a7117ed1638af6a798a44757d8586cd1b92a534cd0c145d458a797cd839004f117e42d41a414933ec8f968b9e0ab3b9262626ee59c9bcca345b5870491514c5037cdb224544cf9aa4b900311c5e44f9f7a1abbd519412414933c53ee8a4925a5a982181493c6738a97e52b3c78ec88c12726fdc76c2adacdfbcc9e98a8fd6144765985c5602726755f4e19ef793d2e6c8820c289092a374d3f66ee20938c0c1f681313e4830efd2163faba740f1582882626afc58691a562ea0f792626a778f93d5f74e3e9be6062e2fb67d07ffae7cf2c209798f89a74b54ce92054505a62b2e712a646c8f493f9dcc1c383ec28a10149107f41252629195f937cf7501d235262d25552c2b469e6d9a8273141f6f879880c9ad42b8909f2a69256adf0a364fc2231412e9db68f137a198b4062926a760e96b139caf35f8441e20291474c921b7eee35a3469f8a2326a806b59564a8fb305619fde347a7482326b5eaab750e9efca35cb2fa23c818228c98e4a3b52374e8d39872c99a6a5642641113d5af5554cd74ff572323590211454c8c516338b38a5b15da8f2063b441241193ce5d43ecd65a6e7d18042288985c9f965a77643627c9530b5203c7434cba1451a2e2a95cc41093f2a88e6d675243755e88093fff9d54df97f2ec295903e283075acb202284987c5d9abd84a5f298f2b218880c6282543f9931c7253b95c64144101394a660aa7ec34058babd3fdb7e614513e0e14004101384d5a75a7cd5d0d60f2fa181e920030456c66b7f9818bdffd4c5b958a115fe80881f26979b061bbb8ff7a02e597320db01913e4c8c2a427eacb28caf9c92453e4cdaac91ab7b2ab46b36419b88ec61525039677dfe24c734ae8709327a07d1f06321734e1e26c54a556769643c4c1c4bb2f632e8b2acf70e93826891a163d2d9beb5c3a464db966bac63caa9acc3c494d644475c56d68974989451bbceaf5a83f4104242640e1384cc669fc355dc89278789d1b4062533a744e23049c4af4c45f5b7d295081cb43bcd58f22bca6f989c9d3d9a0c96ace357e80811374cf24b1daf94af8a236bc324659f53aca462d27f962044d83071b6748b757aef6af80f226b98ec19db6c5b936a9edb0711354c9049d467d714c52f55d230c16cb35d7f12a36192967dd95ac6fe52ef19266f45d7734b3adbe8cc30396cd24989ce5daaeb2b5953e3d128528689ded9328b5651353bef41840c2c0391314c8c1afd82fa919aefa4a60711314cb84e1d540a3dd17a5f182657a6184229b9263e6d487eb827c32f888061a26736cd6aaefd9f5248ca38244e3206100be4d0914303934205912f4cbad65e8ba9d63dbd0282881726a5d0e5232c45c92cfa2e4caefbd2b213622e4cd8d24a5eb2c4e7a8e5162677124f1e16edf2c6142d4c90e6f9316e5e8a41e5b230e9bf8225fd9b7743695810b9c2aa29c3c9554aad295cbca9de0bbae7442d4110b1c2c48a1553a712b9a65d6da00822559898693e57774a699765646464e4072254989c152aa975affd3f9d8f2032853d37ba75b24d59296844a4302933494ddf25d3c7ac256b12108902a2fdbf1dce7478b7642d0476108182e72968dda9d8a554060691274c5c8fd92989d508b9fb6540c409134f65d41ca489bfb9b3099334dd091597d51b54c88489a5b94ecd98c80e4ab78409764a9756784f8fae2961b2a611a7721061717189246162274d7f2a7b90e9194b84081226870d3246968f8d5794ef8b3048bc2884c81126e6186a3d7c3c2ffdf81d448c304955b41167559d3b9e83481126cdbaea68ea8cdf49488408933f8a3ccf68aa16ca7d91214c4a7622834c29a5783286052242c82e96ce9e8f297d6f256b34e81f24ee4fe241c818438c3088046162ae64ba2e7f98bdf6409818fc937ed157164245f120f283c99f4ab55526dda5412fe283c926fa83aeca8721d28349bd9da275154206eb2e17223c98e05bca92fb8e77a76817133fd5fdcc6b44697d743151c52d64ca9c2c66bb94ac15b31bb99864f1d42ea9c5ecfc9f09dcc0c524ff4d37edf96427a35b4cfc18338b5fb19af9ddb0c52435617baba1c47bfcb5989c43c91cb448068edc0440788c21c60e5a4c9ed353e1369398d2d52c26fb6b0e52fc82cad94f96c5a49467d333a7ec495a6c851bb198b819d6c4fb745242a86c196ec062a29b905dd5ef495ce95f31a992abdd65f8c870c315935b84888ee1736d64d98ac9f13d537f3e2f25ab941593c2c293798e7169df2709c38d554c381d73f6186b4ca77fc948242fe8b1c39c1baa9898642e99c964e564fa24375231b1dae5b34e7823232323ea871ba89814cca265cea6172d654d70e3141383c56d4fbbf771d93436c524b1d5e81fad545e7a90c165a019fc70205706b2c28d524cb69eb1f22037b555524cfcfc1e6fe1523b05fd287edc10c5e40e19f77b36a94e417e231493b4da2ac3c76764ec4f927a34095e0e3032d00304250001181ec0401ee2062826dca5285e392333078f24a8349165f350180a84c180301800c320f97d36001313000010101a9386a2e19050b8ef7a011480044148325834301c2c1c1a168b456291301c0e0442213120100683c28070200a65111185a05b00d5dac294272d2fe1a0511085d16adc370bf7937b4424aa5d14b93bde9a3dbdb244c3061c92ee0f866a2e40d3faa0cdb06f748ea1275c0a6c43ef501eae07fe4339a802441bc4b7796dcec2eeec4d603419811f8f89dc79c3a6922e2f96d06458b13282790a3cf9a67ab76aedfbf9c5b4f6cb4f355922dc06176d4e528d385ef2c9a969b39099134ef45465d28a684d117d5b0bfa3cea275a85a90a097640b3db51ab3c98b0ec3652501d93a878f2b198ea1040d64da8eda564928124da84d842dda2de571c6815649c0f322cf1cee253c7b231ee92912246af3106dd8ddeb0688fc1dde4d2db9c94f903bb7120ef56404490e9b195ca81a9170279a903dc764e24d37bb04957e6a35eb294d708bc1a726d5846ad6ef0c69a73c8ca48cb34f6fc82ceb5f7a59dd18dbcd1b7dcaa82712e25b13f72a4391a7fc43b0b4720c1cb0dc4770e84fea20f65f76a28fd94ff308343fd61c2be62c010931b135245d1cb0ec1f3e572a92e06d6584b774db17db5323ab82336dc65fed9aedc088042189e9e050a103fbe24259f7791340f043a8cc36aa75c1f4c5875ac74c859fa3c5130321689017831deb15192f0dc86d79a33cbb31e45238618f7f0d2dbe0463a6201ff45bdf7dbcb68f0b058e562d696e8f1a9fcaab1720226333bf1e0c1acba67d57f4facd5a9265d18e76e4e31f925f135fc88c10517cd9c838e331f4452a9c7d2a6df5bf0d8b5f31fce200b7f018a558b6b2ec01f63f2686ff0c018e5a1528cfbdee0a8e0201ad87d6c677101e7dab5405dffa24f234035317cb417749f8779ccfc82adeaae9388bef72b182b9c4c9bd2269fdacb01a10fe0cc0dfc3e9317c5cfe825baf4dc1cc7c2262c260297061636f8a2035022a8a5c1c68c06856af27b6f36fcdeee2a742f1bb9f69e958108bca1f20dfd8c061b2fcef5c32c4af848d1044d67267c077c44dca8185ea95bb6162a49c7d2579a550130418a792c1d5d9c2695e305cf398ba7eb02af1cac124510587070cb0938dbcbb46bf772d0aa5a387f97852e0afe699cdd85c3164a7c2774be442c09db416af6d495fb72f3cef168d33ace9efe455a149aebd986eaba024d89b212f4eb48a9efdb155823d7e8b9a643c354623dff8dc7a8e2e4989e4f820daca1101de5725d5f15867fdf57082b6198d95a94b0bdbe845ede70689f3f9909a32ef1035e432aba3e4554787fd3383ed786ee0476d7fb51503d8738ef4c3bd28a82cc2a08d5c8ad392549c86822ad4a4e600720f234b1818b30c5dccccfb6b18612bc9e02fd477065b1d4fefd67b558a18532693d3fe0af69db29c3b769acd49c95fafbc8ce6b93d3c7f07ce2e34fbb043081e5fd7d7d0dd283a8b10d9c8d97a13512dd4e903a48cf2806d7f44d53aa5752027e9f1f182c276973ca3047847af0c1f069c5ded5de9c67fdb4799dacb5d6b1b744969b8d065c0033acc7b6195cdeacdf27dbcd95bd6a4ceb626ee4e5dfb713335854985579b2d320c44c0a5bf3c8ef88e38799585ed631dab381514814f7df885cc3b4fdf61612ccab722b7f452a197c5919d9a2c89982f59d97e8727dcd3006f5d5e132d77848160884daf241cb4c78852a1d95384dba387ecd9c2a3f3d41eaa436d5c47a00902fba5f3958ff7b1933f8faf366281813492872d2df6180a68687df3610968881e27fc6493295eea2b5b2fe71f2848b2ea27ab8a540aba81cf7c815048a236868675678a6ebc065b1c97aa5e2b6f6b8d6442ea7562b0e25bd2c152dc5a5f8cb7b6838775a06e38792556128e064fb29b6ae00170e2b3d3a27b98a8c508a483334807ce3443bf5bccd6f7fc2e2d05f661cf38b60f4b78c7bea254667554f4eb7ce541e8c669ef9852fce20e854fecc8aaab8d2fcafb7c5b405efa6e4a6bf64d830cfae1ba915fbff1e29f69495de78643c96f6a784e7bae19976c0abd1a5b7fd05289da9e54797bba185589c482398a6da26298ba6b52624c08bffcaf50461219735a919f7f868ebdaaab6e73ae2c786c1d55bc4848c3d5be9b00f1e2bd54778a5b99559926651c12b22ae59db6f1431dfc979424e1a48229515c63b2373648ae8b0225b6f6f35667df198753f94bf2758613c08df6a39c147166762521ea291f64414686fe40bfedd247cead41599684c95ffa9ad5419da10bf901645dcfaec1c120bac4400762c2ba7f7a370bb4146f800a17092ec6cf814b324148a10c5bd9b8482dfebe80d6e258e1a423a55c54a6e9568edfc9d768db91389132c261eea1e7a8e0f8144e88638cd725d288464e99364fdd8d37d7d382bf4768489d03ab63cb71dbe6fed8db22592bbd839fa72a10cdb372860d9faea754bf90ba5ffef56fa68114ee8fd8d5a4a8c019301b2bf74cc6a6130fc044a1be1d176a3726edbb0732c622815022932588d2e90be14e9fc2ad94ec0a5b22d5de561dc5c0b8b5aebc2a0f92e44df7df504f29629a14e8f012fbd68806f6c654e87fe7c4f2c3860e9de3c8d608ed632a0e525732931b23c584d114e148925050629698e5b663bf73ed0d295971dbe2de3a1d994abf33d2cc22d68949e24d859d0a4a930ccef47cc0bf0f1a1078f4915eb122063d524f48a153a6ac349dce1b4041ed441fccc6b5e57241241d68f5adfc14c39b4a64fe4f53a46f89a5429583eaa204c2ba7eab86a01c3201df26507776605c2fde0944b2090f254962be7d04e32bf0ed8e8786b4535922b40fd1768dc1912d71ce5537424fb3ed996ad59581c98a9df4df0228b3a94b3dcdc7ee9d230b91c8a7ce2beab4bdf3335fe687002166fb52a31e9c52f4a55a8f381a52c39f9f925a627be2864f16fe96e18ec30c126a5c4d5fe90175b5571517e189332b8027cd851658ea9d60dc9227bd704d1911343b2c74735e16974e1d8ce905d64adae79c24bd67e07aea5f0c7613590aefa99374d1c85c0b67afcb255301cda8e790f0dfb220392c5860172d65e4dc9cca607bfae069bab4a4c5b07cdcffba9df46d6b672838cae96c6c1b194d80bb5900c4212e013e8c4092b4a683811ba5fda2b2816a2f0840b94661885a4c20f4876d5323cd4df09bf55a069bfbe89529ae9494729110474abe0390de397019ff1317d52e78ffb159024df1e863eed80538647aa2bf94a5ea95623c63d81b94a1ca299ae73c1b40e2aab2e3faff6e68ae8aa2c2106dfd081a5f81c843187ef0fd3138604cff8d3fcc4497fec0b28ffa9f36e1a9ddb21191fef06a9d580f2c122111cb48a8405c37847429f0f7a3a995ff21c890cd05851c69b3afccb451d01d4178c0cda4196ca3aeba4816369e979ac2aa83a4e3786126a4c7d7c9d5005bad74c3d4094210f807258564ab21d65b421a6c19a20f7f47e0ae3ab320e58fae07de8a42ba76221637958ba58e4f09ac6c4c0723f4000839f1f5c59d5abd0630797fe4b853f123813d8d1a0a1991525791d3b98310fb1240a41e60270f2d141364df6bd1d42532989f7201fd40b32f8dc50a9476a34907c8f2095d8a700727679faeda60885240ebc4eca46d0d2915886d2e049d13bb861aa6fca4e2fdbdd3f6fba5d61c4bdc69ff275f781598957482ffb1ac5ad27b0bb70486ed060253c3e076b226a43b4e400bbd9e0e5b57947cc7289a66eca0225f9bea95617b4202bb7d9e32e2f012590a3ae58c2e0e118e105e0c85c3aa513afa07f8365313daf9b39bdd299ad4568f32da6614db2e04aabf60aa8d510845815115e1269c121138edcd046e7351be2d197778d516104d3a9172c4461b5ff98750c7374185c48d6312a8d25424d588b186db7b658154282a904bc785b38ca71377402ddb674b73ef606f51493332376567b83f4b4ce0825ba19cb3a1080fc80222dd395e01c374b058e85f74df1147f2730a0790fa9d8592e9767abd76167eb529b5a52d3b4eb4b6d4ee3f4967fcc48e3fff72a6144bfa99a2ceb6f21caccedda08d31f60ae59d93584957e51a734a1eed5cf076554733f0eba32decdf278c0838ec40736ed9026ead298f7f483da5b03e1a2753d21cc9268fca62324461406905dc3c3fb21ecc57e4ce944686503d190e00d991a1fc01617057881e80cd49ee424e85c9971c5a06ca7837049e598340e5059bc16a82d41e89c0d12b3a56c13e64214857571548f2b4e76836f087727c17da2387935b6c5da03a550d6563e38a7e8dd51f3fc2d9bbdde8868a14b085a529144ea5ad13f5c99dae562f1fa0067c2b266da4c8b2a898863dce76523391df19dd88409961bceec5d0c0f23d6e0418e6e888bb8f7ebd646ff8d4aa31ed34a1d0aae87cc5cd24fd755c7c4dd0500eff9919b2662a0defe039491757311c2169d50dcda6e53cf1c949d6f0a48b7af4a15af89d4116e4b7114a03f2dff084dfd5e1886987eb072de1dac094d79c26bd406d1d4c7b39b071e9a8898da3db842c0a3c6b26226f3ebbf7652878f5090f91d85471fd9ca136c8eb814c37117a7093ca92a7e9734c774144494f05226c1a4e5be6ecbfa7e7670d79a9a0493450b04eddefe5296fc1c509074f1a9a9943fa0f4be2feb3d1fad12837e0ceef201e91136c9b2bb049c9e5735004363006639746936578030d1cd1244618a04d3e4397f5afc63a5d223f17a0c3d41eb133d1721aa1b7dbd8c5b1d53a851202c4e827a31e32e5d15430c7f60a67877965d379f8a4e12e6177281c8ca3fe03ef6d5429878969fbe7d55196b790d6f6b44437d457b83186af6e5772b34c7e706e0d4120737381be8cc265a53cf641191d284214d41789fb22dbd8a6556c33859ec22cc45d84a8ad0a8f834703ba8ecd94a332cdd345f1cc22ffa7cb7c07d8ef002693bd27551334cca99a393bd054555cc4882e2d589090217bfa0981db82f3359508749f143de6dcfd7d3808f84925f1a948d398a84ec26f4c66b2cba92ae61f80bcf5ee506359b983f56631dad079a05c2b53d5afc1937f6b58f0d86477b2eaf8ec3ff19415ada0a0d06b214b81a54871139199590a221c4748a0b744c7bc8c1fc9195f231eaf38e10f45e090a9cb36c162f2266b3f29cd46bb48994b3332fd86b3c1f5c9ef38149c2d5578b01670b99ab0c30834236d9ffe44ddbeb06cb078d2e66a9c9bce2ca461934e211f003d8f27c00c3d963c6c9b936ef056f84db7330a0a3de5447bb2067028b647017ea15b2ac9ca7a67a006412ab7398d03cdc62a1cc90ac2828711d879d2af788087234ac7512a1930bceb990fcd0bf6b2fd2a609eea9856914a3afeea8a551451ae8691a1315f8004ef9ca6b3ecbdff58098bfb29d23971a234f638e0107bc6f96a0425e2e668a7c979f9312942c46f76ff16207056fa8a36f3b790cfcd19e05f732c077ea158b24bcfd20d40159c832de9c7539a9641ed2163ef0881e308c62bd043aefad94bcabd3f5ea767b00cd400a9802d2a1048c04d2a1048c04d241048c84d16104ac12e21d6204727d18dcf9a7c01051728e22989ae38a6ad092798dbbe6df06e68c3c20069703ef938f11e7c83e2386e4e8faa8e32c868dd914a09fcfdbce31c5a7d149be9927ea64ffbab7e3ed79e7fe306ea4002eac71938481858092c24eab36d0a4154307880bd41df6007e42ed00024e09ed0e36e024fc3afc03e009f90e326024903a8803d4097b077e403b05db228e12b1b2b2904209a2a0d8a7a88d139413dc19fe01f084d841048804d14144a0fa305c5e1e603140934165c09e32e0952b04408d803c165ff089a72ce69a9874868c913665704bbd8c27ee01a6f9ca3bf638f9b03866fb6217d68ea72b78865bc86447b66e1c381ccdbdbf763e707a04f19331afd47fb2f9070f798c8dc8ccea2e7b35f6e172bcbb60a83e869ddf5a8358fe3692444ceb1155434c3fdbaf719c0a9a627cc4e8375cebcd003d5b707afdbbbe3a7e5c564e98106a8eb48fb60aaf1d6ebd21dcdb56f71c6710f1ca966eeb04c77f50a4624c314892879599a887ea6653065ef48546466ab34f803e58987e56eba2b518d08616b4e70effdde021efe14286fccb2d0cb5b8c8825acb2f769a52159c254a85e16d8953f6b975b2e13e7f5ae18c28a1333de0365ebfd589d8d6f80b243adec96347be5d3e6203eac4fc94e6eb09a9a8b471f16c11ab8f8d8666e81eac69f7d5de32aacb9c4522a5489a796a6afd59869428f0ddb64d8d0195e22d9479199d9ef6d553b99b3a95afa012f4f61c70b09f25e700a3955ab1de50f154fe8218d3beafbddc42c13507075b4ce88ff7d1d3e34c3e8fa2f910146359638ca2df105fc339e3c2588a5498a20949f03fe46f3ff96c9c13507784861d2a4d255bc8a185f81ce3b3806d4deee652124ed579f11530b9c9d648fe53fa8c791630fd3f9fd8c1d787ff7e722c119d99d7d2030dabcac8a7950405025e171fb3218899866887df854043402ab27241b8f50e2f4c8958258399bbda2e799f4012eada2207b1cda475455d29b922b0226156af1ad5f848607da2f63028de4e7d3e800ed790b53032de5b55cb933cc9bc16e85c3e12fb9ebd0b6209e9d7a977a69531b65452a3c7a61ca640ffa64a7fa483ae98297d997ec81c98df887e429f940a9e567221b0ca4d3482e91c219e3e2d97befc62a90d20bceb558d1065945f463b77c561a7244551181a52dd1b8b8d30bf4c32c227c9374612902ab48910755bd2d0482c502ba942d8a6eb04574691b59576fe249a39668f3d95e9466891c0cafc14152ea1b919072f0300b4d16c29174eb1006505341440fc14e6e0e9dbe81173ddbd32cccbe6440b5e5278bb849ec80102cc4244a7c7d82f3239862d597ffd7b046411e29f87f8294249574510386302f47dea4b6100973264808ac098b0298e122f7c7981658400ccbbf3a144b130e84e75e9108d9656bbf822f9258e9a11987cd3f247470e315f8f6a33349c9942dca074fec2253f12d0e956f1fc080b5545011389faedbf8cd171c2a3d9b31c5a29596ab53358d47c41bfdc0e297b85e5ea932ce85607d701f9c8a6e902b150ba8377eb81a77d79659ca049ac0e6a038bb0e5c2c908095c1d2911b7b499387525e3527f6b5468baf949700c3f38d261cbb42a9e9f2b2fdcf7fc3a328bb06a130ee92cb08dd10937dd07ed651f37ee4ceec0cef7dc086c82ab00b8b722e6953394613699501b1434d7139598fa964464e184e83eca3feafe42f32dbfb1e5ddb0cc681fd9a4084612db5646cd44b57f5021bed3e320d34409cd7b4540151a6ef1f6f672ee589dbefb2fbb01024db64459919569b8473f8eeafa0c9c66204df64e005fb404b37c3ad0cc5fd142ff616028dad51de81ac9b774eacf6cdec57da74215cb7c87de406b7bab1678e25ec01e8edda42f7f4eff7b0bdf3479ca09876c3a3d06c060c80e99d5c3b7846d3fc6fa48ec1ec1d8655459771c5581c4daec54d65286dccb3aba7afe23322440e06de644793741cd0ea1d94061347168129fefeec714bdf62ccb339b1b0ce6761049338e3ad3679b46032bf1d34b599d3587b6e9f9ce13ac4554a4adaecd839e96a809d3ec30c2324feef44190969a49dadc11931dd94da425d3d1098fb5bd1175493b014239300a0235b58689678adc9ab93c9da0824549068c1a830ea59978701a800f0c1d67e13388d043c3f56af5c94196c76598f95527c146088620af85f2eb72909fb1ace83e265a87957c27687d4307093e34baf30496175b156842ec4c4becd3fec76a82ca765afcd09dc3ee04390d274d4e41d387c30220415c5d064ade041fb37c9350c9178e0cd218344e8c22df145c2f6bf6d9fda7682ba226e2271ff622ebc58413228599b05e04b838f074b06c64daaac1cd7dda07d52cdd95a710cd5923253d0f29effb4c17c734d36208fd629df25d562b3ecde02731d372fac6d48403468aa4257541ef5dc48dc41921d95172bda6a2ced55482a385ba6c25293b7bc6b0d2d943048c81a2f2cf83943a059387b565aba71e1743ca4ea7c6c587bc0c1a41a2e0b2c1e50a35faebd84b9ab718e2a1eb587120ae937bf8e70523a8fb860bac46338922dab740e8d55f5524b7ea202f5a5032e42f3ccac827d6aa676484912a51a1a40f49ec214388d685000eda3242082ba43408f87820ca6b08164975fa19249fad264aadc6717f6f6c5e07c554805939596813f7c76fa5330e740b8d01d9c713222d82109d458da3871cc55e8ba3218c36acc353e6c95534ae46bc677ca3d093b45539dea876a162a2cecfbe428c2f67aaa359a59e11a1be6493c43201b84d4b4fb0d651a22be0780c84e27e8b2bcf2f452e949bd3415168b44c2e2d50a34ee4e410c2487c9166b3499a468e4ae0a0b477c9ec3a8078501f479369e316498e42339088f3b493ae97457868c2945431bd23e0481f82921b571b6e1d8d25a7a6ac256f61d664c77b5c698bc1e28090c7f54717986137468d5020055bc717247f3d7d37438df534a8105270e23fb10a14cf19344600123c5b70c2e75a3bacea305b1f36d9377458976062b6856d8611a1393e01509dd2ec62ac747279855d0b581bd431fdacaa3a04a2a7c8524fb3919643865c146e536d3fcddf38813abd50ccbd42193709baada62046e67ec9092d1020ef34f44363006ef6109014d9397a1bc1ddbd78c6e84498bc9f80702209bcd46c11ad30c6e62cf87516a45903c65fb312429a930b1ee72b3b2dacf03ecd8c268fca1ec19e42f60e3e48212c7109dec2445fa1361964fe87848032264e97724c4588b255a829d82647839265c93c166bf0e3754909b7cab68e1e3abc512702c898fe33ef3280b6bcc5b679349a4de1081f1f01a07e00bb12406505da0aaa5cc41bd85413a15adad60ac0e54f0811c9e43f4a1a2e1f96fadd2eeca5002eeb1208319ea1f393d527c4e87d8c4138a4ef7c86b0de5a796bef1f48ad7a7e7aa8cfe0f60124ac77a13600b56f636e54e584542f15a12a44512e91994405c18e5eccb9f045546c2c912d188503f9ad83882553fafbd911e6932c1b9393c193b81de9bc3379a56e1d3be1ed93f14dd59ae09b62a50e623e6bc5f29153ded9cdea5e64d6c7f131f676509a6468dc9945e4c2ad19142cdabf7e09f3655378e9f26a40ce1e7eab895594f6a530fa66c38d9315640448ad5e13e3a6b52c487057a1f1626711e67b0b402494dc743c001bdf3a252a880257169854b1a9c44069a5dad51d9d2ae5341337d6b19de3de973f629d95da7ce8a5725689aeac50276a71b5714e252acb9d1af60a8bc917c82b40806826cafac928bae2ec1b2016b526d28ad5e9ce0733e8716a5318683318680fe5101c19b074bbc7721c8915a9efd2381b6418c257055358e4d62bee6f61f85953f37929e87ec1195d70fdb31d77fe808f249cc8f2c114de9cb4b4c8eacac6137a150c38332393fa11a5cb373674280dcfe3876c0a18b63c54d38d928f18069d005d87963f511a124cbfe122cab416c3aac9c0c1d715753f183d04580dd4a3af4c3a6b3a52c70fc8185595a81cb2614b662df1baf5499311420224902baac05e6776581b0e97885f1314c4d71c87a6192122562fa50dcea9f2beff7d22d97cd9cdd7179c205cf24551d02c4e43f193b6de408ef4c5450fd2c63692ae75d80c816298f4544b69f5caaf5111284ae726c16c3b6e7afa2fa28cf57cc9bbd38de585a5902a4e9cb58751227844e51caafa0cfaa4aeb5f16688ddc49ed5953a53023908842cab2dfacc68c9b4bbf836cb14f438cd6e4377ee1c59274f8551488fbb01df2481221fd96cb6f58c7e462072c4c309397bb257edeb91121948dc2a78187b332ab4098cfef52e508c6e0b3342c0aa2c27b462468079964628bab5b457edada4a68d5a42ec62252fbef6aabd45919616bb80ed551b932345a2aeab13983ca2239af5ab6bec3ec8b1b97d41185993121a7962cc6f197f412cbafd2d936ee5eae8a644a2b38852d0590f4a919b62e2993fe8123fe43db9e071c57180273fdfb190f435a4e2bb18a4238f2da4f390d5a0e66cc4868d710b6c848ca1f7aadd7326ca0a94de239d23c71ce1e9df91cc449bbfe916b509e2b805f24dfc9ced8e29040232fd3ea412c94934097785b6ebdb3fc460152bcbcd007a407411ea4cf57bb5bbc20a8da3de1843dc8d1ec349544dd5c9cdd6b919a8b841ac6d660e0dc739892554938a925a2591af6b3b173017f4835ff858b24fe3518ea69f32db44ab02e7c76f1c4568ef98d1f2261f31ebc731a0ecb5832e61e0cba11a93d24f0bc1549b16651255a6c57490d078736940bdc080e9cd863a9a050482a4cea3f0d12617c71053fe427db641983e203774f38641b3120fce36308125c3848d1e7d16f40304c6e48955a73ddbfd7d4207202eef8a1b1146d889fd7e6d93e761f12b88b46fac5fac89cb0805565f9b5329f401d184921160e73714644c694e05d205b3d611383873d4de396480932a871dc21490ae2fbf6bc5a65f5e8e717e11d714458848e68a0cbb79b683440aa82bc28967dea5a8c5750789d997e9a994822f357a6d71e9ce23def6d8e1c0d765e2a0d96be9c75cb420a50e3825c62af53cb0b3255d2e7f130f12642e642f0ead99bce3a7bcf870f1f576caddc36f24f9981a108db418c92c906d430dbde9cde406b7468e9ca5f79b470111f312e8e608fdbd25cfe0f0b87bc02e37c77db9f6b34340c88ffeccc64f5d75ca0bb9012a428000cb9bd42552e6931852ef48434a626920698c025148a7707f79b23ab6f95bc46355b52de30ecad0f571f5c98aec4b55f9f5511fa9c7ea1d47f3461599dd0200da08bd32294d9f32d84e9e199f7728d5852366a756d6b1571cb1ec0f283b63e817d8405295ccca2c7a7fd06f1cbc75be16030ce7601df1f8a77097e8722d139a2a518270ebc9bb21a39d8ebe834762ab6c5b72c250fafc500cd53802569195666d5976961d139725423daad02617f54ec299bca823122351bde8109d915952932bd81dfc27c291e6ad2b0c497b14a2a9e90a03d4299a77e2622d3155bc220834058ff1b3432ae8f3553c32a322a2be5ab61860688d6be48578f82bed23c8f85682270430e82137004300e9964af634a247836aaab50184cfd91481b66001ee92f0f5bca91025f0edb00f4f037aa545fe7cad026b6d4f612fc47fa702624ac0e4b19b08cb6c2174d9c5a42823a9212561da1bbf5fd0387f481fa73f5281ee5436c47a1bf237d21635331e630cfafc8b3495db00986ca2dd27b08ab8ecaca1915d68aae016ad8693f13a4f08f246ac0ab3443479ca545916896400d6fc7f0365c06119491b8d07347c9585ee4ddbb455aedb8ef0e2050ce2ed83f7fe336a87be6fd155cf49f5608f72d2d9828f0059aac90d1f1a0df2f4919028459dcf58e890d278857a6867ce705a6f2a0d07e164df29e589c0127d13d27ae81f9c89cc897fc2170d29b50b302a3e618bc5976ba0c425981972fe247cc9c123e616f2a32d9b9794144126b39ba065e5a0cc0c31ce3926ed06d16823cb3af44a01c1f386cd1b86d883d89c3d679102770fb2f742d147e6e84851f7504ba2a4a28a472bf6b80a47eb4bf14465d8e4ece6ec83b14f46983b54ffd601c6a4756bc5766b323d92b0c320ec3029662b8ac27be8dadf0018cf79ea0e0fe4e29e6bcd9b4b6257bf8d0c95cd83c7c8c1558ee6546e8e1ab25e2a7d80ebe6e5b00c5cd17c9b4415c181015d33bf9514ecfcc2d6a3109c558d03255635bb316e9773f1697d053f01a3e90838654e9e7aa1ff572b9362eb55e854a0f2025d856a91e1e602704a3309744c97b200c1c99e01c40fc08df595e589685e86716a44d763a67fba742598466307dedfd286ed3905c0063c417b0172e29cd33699bc1ab486b3c212df3582d9b56d0318e7cae34972c0484335488882ea627a193ed74450e7b09e27c62f949ef36be2c323547af46b7ae9da0e51ddb0da312be1324859d1ace7fb0291e7bfb7baa57d9fe3f837ddf08cbb65052a85d880af88fbc66cce50d2acbd522d8fc1a4c126b222acf4e7b41b1ab020c15653472ee4536a7ddbb835dbab566853af0007a4014d6632ccbbc149180c71e8a096149a5c59f3fa63a30b75435a8e486aa14a1215320d5b06cb561c2f2aa39efa527f001917261d078f43226bffa62cc7c32898175ca3a9f35e96a1adf6257164425c1b9ec6dca29400adb3c06e4261885c7d77461b045e3b98fce5a8ed9f8245e95f84c2881c4f7507160d490cb9e6d362f62044194c718537d9115aa4b31a09c7da1ca1acf530180ad8cdaf1154ad7a72b204fcd89bed316067db6635351228dd0c405eca362370889bcd2aecbfe9115b36a5270e6e805487ac63213b9f28d1b8c4187c369900e956960209e74662b6d9d7108b60fc990653642ef3a8c9bed3c11525be53df43908e2e69e66f958910f12e137ad8b14004f13eed3dcc3cac60f311bd71495856e26e97b7802e18b37cc09080ebf6d860bfdcd4f86d8c0ba8ac69cec652ad63918542c4a1010e45572024b03ba53a5fd6e6f9ffd8db587ca6f21ec68a0d1b019952b470a92d716522f3aaee535b99135aad40693932064e45a55d81b43410000a8087f10a539cb130ad7fc4652cf1d3924ca42cf59959a2eb9e4ac589fabb825a0d19df15bc48f6abc0402798c89b9ef8522a7652ef9a5fba0fadf2ea181d38445c802101541df4fa13e0867a6436a439498f580d751addbd9afc561f7914d9025164fad209c2dde8a18de2f785bb6919a76044c7d3c7712817044ed343a46a7d9bd3a7333a033a5291a34fc185290b51097d29ed3a0f96fcdf5246a35270f8c4805f771e39e477d5464af32110f2c5b2691d4e44b44192cf4da64977ea0354a0a082ebcdc6f4a236d4896a718b6903abc6a9d1e13caf57be25f9ad652d11580f4083d6c631d6f3886b7bc5c41dfc5deeeefeff76cb061e6ee1c0e1ebbe3934822bad9ca60c498e0be4567d0e7912a91d4192dcac281626c2b4fd0a8b19367632d5fa3a698de6a3b48a798801c678c83f8d4e1c0106828984bf8d715c56fa938875a9e5a1d004512c41ee0000b403faa668b4fa3f61ec20cff9d607d73c5c18daa4bf2f05c705fc5f020236e9458e1407c523022dc154c9985887ec9e69ffaaa828906f38d53545f5fdbe7b09906aeb08a4925789b157bbf2d273ee6b4db39aa189b59266705fa4ec0e2d0412684b953cfbef6b85562c06d115b1cf8922345bf39df94265994b2117943445c41a59b27ebb146c9f857d10d80455745c2d3c83f21328a3b77a62c82e334b9fd2347e19b3f8ab5a4aba5622c59aa123076d6679a9fd6192691a4b3b72fcd0e0f5aac92f4253e308c90c8b9f3013bebdd820287e13f3fc3088238a8284ecf907d4b7de0f5b1182c10c897b3fd3439b1df21f2d005a2597714bc244d575195a17661485247c2ee46b2866473651624ea55ec27ecd2680c7154a744eaabebf669295aa28c5463e0361f995fb1b9df9790852829f6817c393df08a24447ee850a2498b719bc0cd25254d774a8b252e382e03fa8f34d893e64338df1a8922c7332c893200b204aedf7be9418761c190c29cf3df43a64f430e8509cf458035bb776c34d8a50189938011896f889db08c0ad82e68b314e146662775bd5994d09280a7bff295c1a5ef83d72cfe15035abb8776cb46b7d3f46d285855e1a3d9a11660aec5daf6a17b3d97179d7eb2a93bd9b16dfe9256b84940c32c66c310c19ac27ba543bd5149a2757626891e3fe6970c64875d8e77315a49174006199dea6ececed43846275d2411500443b768ff08ce5a22d7f7f1f311ff0ff1df46706351bd041f8aa2b7bf78829b572c4162894a885f85d2c5aa26e5651f7491b16d60b20bb956924e210568ec89c74e1f483c52fd97c3e113e490d419a74c6a0dbde1493b8cf1944aa848a1f57d6c1ee0e9a9bbd6bc002262e437fa8253d0394aba8b489817cdbd7665043130c881aa36c234b8ee34b5b40fe478d663b9ce1c57a1fb74cf4979c6d9a41313b866bfc3d54314613f366a888ec1be5d371223d41382908d71b4c9663d3b8475a21add0adcf2996b8a804d471a816db43398cfba73c464d30fb2985ea92efd615f8f5a221d827b85077eece1f1a7a667f25977a6e9e10acfeed8b37c9bc0dad9694024c380390743507e60fdd232a63a5411f7e7773afeec587830fd911df7320ead2d899389de540652a3eb4b79b26c0433157d2db179666f778574814eed25e8d0c59892d350387d42eda4db725b498c2d405c42ed3203edc8a3f8967991ce8f2d6264c989d2b04c8018b9dbb93ea453467d51768684dbb99e5b213a07392541a97573fe1fd7c88bd027eaa4e3c56a6d610675981b2084e8e4bbeb2c8cc48591e515936e65747581a4792629ea7069b72b5cd66120a9b7d22f63f890f59bbd7c1cc434808d7224cf80059c594f08a71c9769238ef19fe77ad52a4c7e80b7c259777d745fec9b580543c913979a612f0a58c65a0a90c0ddf0f4bfaf62500246e9924cbde415a2466d7914401a62912f454592f07940d0c33f3c08916f2adc3d13246ae2e41c3b9c2cf1de7307021cb5af7897a386c8e6b3b999e30aa391be03fbb23f20573fdffcf494f974aa4f533623410cab9fbd1413ee33802cc1e19ba12135951193c53f63e7b5aedb3ac3d90e37a60632955db25651c5f57b3ebbd94b14b5ef00602d95605f8820518851a0528a64bb8b10405aad0794fea13b212687cc3432aa8fb6840442b0d3702ff01173ba2c60c931ca5a1298e1d87c465fb9a3fcd462bf8e5ae7273ad5b9ca18f43ebe32dea871cd17d318580249f92e1944604784e7b1318262c844f2121548517217b54811f2073748e9f2373748e1f22c3e8103f4566e8d0bc59a877d757d8cb7ddb9a7132e473eb9f39bb02d03f7bae7dd47362064658f0e2cef42946dd326380b22240348eac7f237235d9e8880147fe3b8b54b37c6130efa8d32aecfcf1e0693ca12810b894662dde82064a62ec630c290d4763830b231e2af4e60eb8788f32579441a3ac85f2f1bbdc9fe865ff4efddbb1bf67276ada43e99aa0583ae3d14e06b11c7b86398b6ad6bfb66c717795857b6941bdb500bd5b18cd4df9f8657b0bf6c2827bf1857a8121f52e17c6a283d2d8d618da3b0bda4b0b23f5228dd497035db102feef44a70c3240b0a6d0013c0c3c0c3c0c3c0c3c8cdffabaf51c5b9049a622777f344320a494524a2909873a909dfc3bf877414609d15c6aa70cb60c410cbc9dc53a39a7d08dad1e2d58418d1e3b78d4a89136a0e10b835808712acfea85612c969cfbb69238c28417c60e5ae6e1d974e813da8551674e2ea5723ccf17ebc25829e774ed41a668c77361b0a89b9e4ddaefcc860bf395f6ca6a595d64bd85e94f122fa7279c4e626a0b83361316d3b4d8eaa56a61b2937397583e4f6f420b534a5352dcff3f4fc29d855946255b33af311351167f75e5e073c1938adc0d346261d2a6247d72c9f19d64d7831d1fa851a3073b7af4281ab030a90e1726a7434e895dd37885417c12ddd3d4b5ad9bec0af3651356fd22caba746c85c12f7cbede54e8141dfcfbb0a1e36ffcb061345861ae0e35d3eff3d99171e5021aab302fda5d328feef62a0d5598a4d3593a9a18bfb491462a4c62944969753a4fb4d983d76127386a8c0ac3c866959d2739b6e9689cc2a02ee50eaadd845b2f6998c220479498d355d12885d9cedcc75310ab3c220d5298b47559ac688cc224fe731613fdbbb17518ad053444613a29eb2696d085c260727a0c7d65bad53e28cc1eae9e92146b1a9f306a9f24b33a4923f429a1e109736ea5fb12bd7f26f74e184fb43d2926773861be2427888587e5e5d2260c278d28f330d9d449234d98a49ce4acec934c18e7f7c205e52126cc6d4a4972ee941c4b2b19031a97309b14a12e88cd12f25e4b983f54909fe74658ca5709e3a95cb05869cb04b3d0a0849e225b156bf15a3181c6240cea4ece71663f88df8586244c629c0a2d2af73f7a452312c6cf295b9e5a4ecb12244ca6277db894d49924ac341e6172ff9811f1d3131115a6e1085358be0b7676f25b07d16884b9b2539a2d41c927cd087349267f1a53b78b212b0960a0081a8b309bd221742c391df55784c1b4996c157a633fe5341261b858a76da2150d4418e54ca8190bb3917f7208735092745d495732214c8630495e5a7b7325cd94be10a6ec41c97e29432f549e10663751c2c525a141184d92b46a5c4ecc5610460bf5e14ce482924b1d0873f60ea63aa90b0853253d7dca6645b709561668fcc1683aa8895722f3637532d0f083c9a432612fa204bf92e328d0e88371947fc9cadf9b31273e982ee72e499ed4edfcd983593ce7b0a2a637af6d1568e8c154a13be728793533cc3c983ab4c5136639bc738d07834a9fe5d4de7e4833ddc1a02439494a12a372ee9ced60fe287a2774d06962a47530457511a25410fba17d3a98b2c497e0d14b295db939184487ba85e54a0e06e97e3af9982a39dc8a83d994943cc489d4f43569c0c124db69db1acdfa0834de603e39c8f3243a9949d24ac30da64f59829e13bb75716f8329db5852728c4f52ca49d86072f7f09444cbd8f4cf1a8ceb1df7e49cb61a0c3a98cd4927c46930c56b0fe25976fae28c0693783e61bd92eab9ce9ec1a0bab276d2b9a3ed5e33d85194b8b311d232989497b035694d4c5e910c66d90f93a47ce1a268380673e5bdfd203f880f171483b94367eddc53180c3672926c26c7c7f40e0c0679d2cdab4857cba52f985252e5dbb6ab1eba178c2ada996f5fd2fdad1b5bdd34ba600eb16b95e25c30986cdae157949c9bfa160c5ed6b5a5b2a8bdaa0934b46036c96eb4ca7d8e2fd1fe018d2c984de686ec9f288f0fd3c082d1849165d14d07517ba2710573125b737f925c86e9a0610553d8532a4f4ff298e357c1e8d7352e4a8b9bd410158cf39de41c31494e8fea148c1a9e54c979384fca4334a460d4abdc3bbbf39ebe14059358e9e41a2525fb3e6128984256a77c1def1f6d6e42e30926d9dfbaa762b5728a9cb09ab24bd731499a600aa29695c4ade3749809c67acf96473b4b6309a6cabbfffe294d4309a676b914bae2c6e57837d0868046124c9ba254a9d227dda85e078ef3e37b940dd0408241678f9583fd35a0710453ce5fa9a0fba47f7632a06104e365153d21272ee9e0298679e59468cf7f16faea0c6298f3e5d52e8f7edadbbfb1356af01ac00f338671ac7575dacb67e51a0bce1086b96349a73a7a2cab958261d27e55c2d6c496a44b609846cc9560f2a52628b919bf30bd49b2e7c95e5b67428619be309c5877a276eaca76a55e9833e4af5a54e7a9fbf0c2b09e72c9494e9e5495da8569363f07a5b4df9ebcb0200c337461cae35631dab409df4930f8717284a0460d1dffe3c7c99166e4c2f42a4a1e174679d3f761699663f55b189432592989c9417a3ab18569d4e2a2bced97984e2d4cd9fbd947897692071d5a98f26479d2affc79645d4e153b27a14a491606654254ee50292771e7589894854ae27d5cc9d16158983ab957fa18c284f95f612ccba19e45764f9fac2b0cf79ec27dc429d3735b611cb3ea5151462cf4c90a93de3239159bafc27ce2d56d9cd29fe4a82a8cb6e7418cfc140d115361f2f550176474c9370b2a8c27df892fe1253f957f0a7338694c85baad8a159b610a739491da1bea939c706794c238f2946c97296fb288a3c78f528119a4307bee0effa252a84ea15198825fd0a79d62b97a5e1426f129de71d2d75594a13089967b897951b4971c280c4ab6ea91595a52cbf509f3e83461de9324eb5f8a27cc9e4413c4c94dd39def1b5b766574c2a42cc9a898786e633b270ce727f69b9cef2a9a4e3661c6264cf1dfdf04957b2f88481346935496ba9c4d509ef6106664c2bceb96dd94a46ea53d26cc26f4f5d98fce2e21ba8449fa371b0f27ad52674b18fbf399c989a246aa560963c995a2283928fde6a184693ef5497164c80973c991243874d86827cc9884d9edb49ad4fc1495a492309fee7472ac5061126644c258d9c6da4b8fe5cd0d095365d5fb9c788f306ab65af8b27416fe9383078e1e3f6638c224d7e5f9b83255561b5ba5a006367acc6884e9fa7a4d09725418d4a8b18c30ac9bbcf9399f124fe48b3025f59ea278b458f27fde878d1a351ead22922e1fa7cd4cf7de83198930a8bc276f5d504b151e4418e5ea77bfd37a1cf4382f48661cc2e833e626a5c88630c953361627e4853056dcf7dc8f95320861d2bc523d39e79c4a6807611415ba3f499e8497d1da608620fa3ab5373adc1b086378da8bfd7fc5bd8030282994244fceb6efdcf983d9f2db9eae8b55e9f2e1e3dd3bb0837741f30c3f183564bf3b6953827ffec6968ddc197d3009763ae53d7f6b3c449dc107835fdbc9122dad99ee7b287f5934a5afa208fbc696eac16c615a62555ea263e31e59cec8030f66e0817d30e30e76309464a7c45907a19b5187740acb49501933f2e78d197448deff2ce1af1eb582e6708e5ed25c5a926e9921078392ba9328e2ec1e3f7ccc8883c94f0e193f4a99ce3f030ecd6b69c61b4cb275f4e7af4e676dcc7083f9e2cfe550825de56c9741860ddcc18c36986e774c4a729adcd8ea814ac70c3618c7e457f3f738b977d760da731debb6351db6538c8c196a309a24a7695362c4ccea3966a4c138e37b929bdcd94c123498822839dec8f91c6dd733184db01e55aa7debad66750a6a60c36698c1fce521ef737e1a259e6e6ccd2883294e0efaafa49247a918190c7b23c62b895c08cfe560c618cc5bb1943a73abfd24ab6230a8f96866e11eff43c787c12454ef0579e283ca6f4933c060d2d114e1a992fd27f9195f30e7f1cc4adeb73d171d019ae10583ac14cec6fbf3ab5c107881086674c1a0735a4db2ddb98afa8dad32c10c2e98a267353d31daf24ae8c65629b32d983a58eecbed8893f3c1dfb0b6f183d3a3c7a931430b06cf717e4a1e3db3f5c982392b29d922265a293a7ecd0c2c98446b9ae47a8e1d6ee30a7889ae72d556e6fe8d2d1b3ec091ac32ad90c9ad245bae8a0a0e1b3af8e7b1386654c16c4af611611dd6933fd071540533a86038b3a0c4fc119d4f49721683195330884a7b27d8ffef89100e74ecc8c12c982105537ab17c4ad4fcc656144ca6a3f2a42e9339713483c10c2818462dc743092167747d824989f39b951eaa3f77d4842898e1049324fcee882ef1d7824c060e7fd404f30956db5e92d88dadb4e36df4d8c104530825bf993a3115fbe0ef04339660f4511d23ced2270dcf8d2d1b3a8efb508249d6ebb00b5795956046128c9623c3655f74632b7df4382bb07a641798818431cc38429766bc6445bb34d56413c30c23982cc775888db44ea2da415040318c1e9674285de1e4a4424d0c639af8a1cf64cbae2445050ca32cf6e7f6fa311e82028461bc9c4688bdb81e260e86792f4b7e5c8e960a32609893ce9393f726579824bf30c9490a32cfe4103be5fbc22498deffe9fcf20b592fcc56e2d4c7ac51d225252f4c92b839c94a1295c3590ad885b9c7b57d2f961cd1ae2ecce9241d334429932e2c1e00017a3f3c5cf08337810f05e4c2f8ee298e12df2900170ab885d1d5a41ad1cf29c0167e3e5deb275685080beee041e01f83b22f63078f6cf8f3a06bd109eb73a2f60421eb8dad10b400023c0505d04201b3e043e56472504a502a4016550331a08058185744cbc47b1e93f5f8c14301b030af5eea58e297fc27cc1bab9050c02b8c3ab75f3a773e45ebd915a6ad13bd7efd74cac2d88a54ee59ff458b03099ec3c51d1ff25d966b2e7dcd5a66e5f5271d2da7566f61924cee6827a7dd16a6d192ffd28cba16a6ccef8f2aba53aba6b4309f3cdd1e3bc6c5849dbf10320be37b769c4fe6e541a5bc10220be38518ab53a5ad51836dd4c5a26ac0a26a9c9057540d0b7185e192f6194fa6b6c27863725796b4bafcb18a15668bfe26d9db8b8652253adf036b84acc2ecf3a9e48732dd7f728efb781b3ef81bd5234415e6bc5fffa9849f64d575482a0ca23bf5c91ddb2b1d21a83049925f7bf21e25efa418022f10c1f916bce3c8e1821a37424e61501ebcaf469a7eb3b029cc39c9b9c2bccd4ac9f952b026f272afb529bb9b26c89be785dc9b14869123b466095ab5c4b903478d1a21a330a5248ba85aba1c9414168539e9b9274146eaa8764361dc31395ec56e9faacbfbb80d0185b9c2043b9daae4fc4bdf274cf2c9dfde4a51f3a4d3b1c347093ec413a65f37152c65afa4e3ec84e93b87ea3c39c7febc0e0e19a53284135cac6bdd985c8a89ba796fb92861946f296413265131d94ea4fa78993508d184b19250b727678fdbda8764c21cba74dc56b44fd252219830078f225abb1d38cc422e6183104b54c2f0a7c52df6cfb8251d8750a205219330a9ec29aefa7fe42e899230e9a4164769aaff85789130dc9612ed93af1c4a66050983b853494ef9d4b9fac286904798373c3ba53cfb79b562218e3025a59294c45b2b9d28aae075a8e005218d305f7a7b8b6f9f454698929294e7d99b68a32636421661d027ae9208a1355a7b88224ced1b72f9feb4c4ae1e3b42a0831d3b4ea003c78e1580e0c60f1c32a8eaf1834716421261905dfdad1be197c4431061523a9aa7d62d398469dc8390ee27d5860c49106208535c050ba65474c9398548aad7bbffb024680f84104298e3bbfea9ab35bd12fc1e367af03ab43c10320853c5d78d93bdd2c9d21b3fce0af0c68fc3037ff0c3304410e6ed9cdac1c4b83e2df7d86143478fdfeaf19c829040f89ed2569487b8dcf8715650a3c68d1f87478d1a3ff8913d7ef0d811020883d20e6a4df5ad469f8820e40f576db55bbc97bc767b878ad1a53d5e38dda91b84f8c170ef1dfef2586e9794159c0002cd23a40fa6aab992b92c236a2b3e984a7f32fbe89e7745b507c38cb8bb339159fd143d983e9e55d299a33ffaa3853a08c98349f84c53d59ee472108207b356f9857b17a1b3dc1d3b921c2177305be62939b6d89ddf7f63cb070e2e1f3970fc282333106207835293c3ec7f12644ce88a39a40ea61c437c9bee3a3d0878104207738adaf14ed9e70f72143207a4de6fc9d4ffdcd82203478f1fdce3870f39183c980c99d72745bc1d1207d34977537bdfa162cb217030e849963684eb5c25a59037a416cc36abee56dc52a7e8471195c228e174327aec0801193d76242884b8c16c72af534eae1893478e42481b0c72e5b3757bb98b4a3236982f66ee646ee5103d5a83694db67cdeb64baebb1acc633a6dc5ca23f5649906d3a7132e9612e23b558906c6d27a7ada85ddabcd5978b60f722d07abfc0ce6784ad231ae45a9b6b4198c6a1654aa93e6b16b96c19c7ee6feea244972edc860b8b393946c9dd4bffd18cc65ca942c4a1a0f0f5b8818cc7943f609a5c4b29394c260181f31d9ab7dd15d8225793572c8174c73d97d599259d26a7a81af946333c6e282a5a955987c7e39bab282e96908e98249fd3635d3b44f88ca0583a88a7b973cbdcf59c8160c4aac3bf1f57e917d7f1c327aec481308d182694f14214d92572b5ac7870f1c3f741c32f8073f7e7c0f1e5ac60f7a5c0a6a6083032159309e9c93ca0a2d49aa2761c11cf73cb8ba09b23bfe902b24d7c54ab13eeeb42156489ef78b71e2e40e4a3b08a982a97f4409623d7c6cfe102a942be592565c746dab9494342946fd04854cc1f837dfa9b4cb7f5dbe36ca478648a1bae47159ec52fc9c924c540555597f418644c17427fb4d46e9f829778d1a0788102898c345a9f674863cc1144f532faed5a7858de309214e30968e6622efb4eb959c2698524ec9ea2a67fc8709e6ce76396f6f747bbe4b3089df29e7da8aea39476910a204f328f9547ffcbcc6f22498f3fef6d4b21982044c64d45285932da53cc856a8fd98fa841cc15ca7dcfb82ce26fd4797106204e39d7439e9f7cdb3a5c530aec8b89ff858882e89615251c2459e249ca0c46c182615b6946fcfdccdc94a17408461ceb982b6ecd6c16018c454e774da1130cc5d6a3ea67eb0fef97f61fc92820ea12fc53319fbc258e2e953ba94ac095f02d20b93861ab9585f73524e7861caa9e67372350fe292c0407661589b4bf94dd293db931eedf8000f02441726f525c6999ca9f0f12b05920b939c5ebe5872beb18583c7b141868fd303b614d4c0060a4070614efa47abef9ddcc294361fe4e70eb76702b18569bc4409a757a498cea905a35d6665a9cd2b45afcecc517d25a936255a987352ba24658278d12182ccc224785657feea24e9f8ac2ccc51b4a52449399344138c85c982b21529b7dfd85af3d1a38c0ff8f81f3ff040c3023da7e4b95cf50079c5666f1b5623673636efde39a7ad4fb317cd5c51350ca41586cbe72eeab9bf8ff35e00618569ec2f9a5882d062527c15a616b17a82aeead3f654613039c49fe869920ab37cd65c5031597e6254183baf7ac8ee8cd86720a730c9b1942826e9d256615398a455c8f174d71f840918404a617c7feb6a5126f80795bc0208294c92789274e9ff3d1d4a3c0a53bcffbb98ff50b29a88c22469af1e2154503b61868277d93a1bb56c4966b44c967c56175b634d5098635cc89bbae8cb32e160470ebe4f607edbf523e748e9209ef0b66f9458625438d891e30e48272ebfa8effb39e9ec8e133c082732ad154bcbf6d62ba1a4ed92f338c0c18e13f0d891821a3570b023c7f5f8c1036413a6d45eae6f4159100fd284b94e87ab9cacbc322b08403261deaf148410ab241a7a4c98736789a72d7fb6bee81226b9d47f698bd75d7964099389659296131baad75502910bb36075a96d536d2c4dce23f444fbbd5748095376e71d9d4a577cc659059049183c74ae79d54fad559284512cd69ca5b6c5ce222c8044c26c41647e123da64ddecd00020993e8414dc7e7c4bc0add007984b16f3bad4d0c556274a800e20893548d39a5b45e9df07b7c8b00a41186cfa1464e4aa1e7c4566a8c48cbeccb2b58ca69414dfc144628b98fee01c8224cfa49f80f55d2e760418a305950a5e19fcc2a9e6c228c5b92ec17df470605104498762b869fdca3ab72a5468db5513f003984a952b491a752ca5f2a3284a9d38a096122dd3bd5690029844197ceab25cfc55051062184419ee89a49d9340863f7e8d335c13d8d0a8308c2f81e7c63fdfc7ad414087355fc242ff4070b6302c23c9fddf37f89ad39ed0f663db5a0edc27faa6841fc6092f3c68d9f980f9725ea71ca10418fffc139811140fa50c77a5df24edb4acd7ad3edda7a8ee7c1e7c041990e103e54ef01440fa63469d72987ea4f77f9e1031b5a2100c983f14c2879515ee1f917de02081e0ca3a32e9a3e3927ff4e7301e40e4611fd93d4a6c5c921fac159811d4c5284f2f14e929cf2a3fbc0410682d4c1a4a1ad4e7872bd180f1dcc352a25cdb0fbb4923918940ea62b565b5e8ba21c0c26ae8e999b38c14a1607c388eb5879d51ff3257030fec949e97e4f7e39ef1bcca172fa3ccff204206e28acccc8d9557b5d58a68638b9fc2dcf0b2607a40de870394af9895ac201840da6ecb7202a9a9620aeca5c834945c8e9dfee18214299a906f3560a3355b7ee412833330d26a59d437b9430592a9d68309887851371f929809cc1aca3cf24153ee90f5ad7a8916630ac07b72c6fa96727ca2c83e124ef3713de4206b38b4e69f6d572049031986e6df7ce64c9418714edb8f1e3518083470732ed002206938f49a295e24aa5b45022903098427cc8757dcf36259405103018eef24a0af312aa240bc8170cd22d4c9dbcd02254ee40bc606c8f6b11bfb016bcd50248174cd9a28f789311840b86138b6d4ace9727d689c500b205c39912a7045fb7460d2d187dfd5236e94694e37184a0460d1ffa831f8606902c98cd24bb58df49b6d777053ff851a3c60f7e581840b060d2f7379de2f55c124bcd01e40a069347fbc90b26b4864e61038815cc5eb233e472d5fac2009c01a40a06fd9fc4b754d1e47ed00309205430ee8f92b3a9dfdf2d59ac18f00740a6609257494992abda578872009182a97c4b5e16a5f7ba641fc0e2418d1a583c383a8044c168265befe94ed257de5200818239499ef209f2bf35a23fc16c1f6272880cd926e5fc007182412d4ba8f7b7090655f9a4f668327c332618addd720553f59453ba0483dc51eea1c35a297d2188124cb92fba3574a7f5d4f20224096693e4b3ee34f724790141829e616fe16e2ccd8bba9bec297fd4774b61d612801cc1645aeee7df1f7c4cfcf806102398c6c56b3ddbd277578a612a5ddb9ea3a28921278669ae82140bff574a968661d43a1de592bc304c336a43ab982718869d2fa12d5905efbc816114d5b07ad1fec224270c77ecd17d5a84a5a5606e53497eb5d2513056687ce812e552498282d1c3865eec9aeed013cc2925bb4ba14f3adb0966cb5a1fe54a7f0a7f138cd6b183ac134aaa0e138c595278eaa8f1efd0128c164be5682698788f120c5ad7fa533c1d334e825176f48c574941291d09a651639d533fdcc7473055d95ecbed09f232c00826493fe9b52ab9d0926298bb44e7e52062438918069deb9d7716a4efc3305cca757ee9b1bf441806a5a704932f65933707c3bc7db1ae6341287781614e0b4a9c869975fa0bd4a5960a97535f98b4a72afd94e45e18e74428d1bb4c5ffe9817a61ab75129eea54f32de85d9d48d8df08a75611693d99de72a89a55c18f37c5434f4fb97245c98b43ea46d986849dec220473ec94ae5a52c6f0b93163fa5fb04ed026a61f035d58a22a68541afa734a7424eab390b538ac9232c790eaaa62c8cb75bbeff97174e180b73b6a7ccefa823f4080b83d80cd3de212d09e12bcc752baa2ac9ebddb8ae30e56f7b7b6551d256db0a931c7b4e96a437d552cb0ac3e59ca42919ffb92cbb8a3cd344ce8e655561ce5592a0fb72f953caa6c2fcd992941ba763d7478539969c7d6b723f557f0a73cc9ee7f037eb2a3285a9d3a59c539495747b294ca3f4c7b5b093c224dda9cef923c384c9284c4ac550294aac7b1485415454271f75252a1d0a839f60a208cb515a040a934e522c592fd64962fe84d1f593bdfca99e480733e97984503b6152e9a49cb24d3ee7a79c308e4e97c2c725f146a69b3089134ec5b57891d7541386ab6023af16e3b39409539960e9842741b4f29830a8394f9f2e7f4e12ba84d9e72f49f2de29ad234b18a4574e6f1f2bff419530a57b3079c47489e69430759254ecd149caa9c9248c26bcaabe4474c3441226ed1cbd4cec0e723c9130b65c58ac247799751212a6b99c21467c6a28e97c84d154f44ebbcb1afa4d47183b977c9727bde5fc6623cceda1648858196192c37c52cd932664ba085390d7f1947c42093f531126a545452939d5d56126c220b4969c5ee94a2e9888304719cb3213cf257f7908839d474b59d74aa24b4318e7b3ce4c49a5ba4b8530ada5a7b5ffaffd13429874d8f64afb7839950cc22488d1d0dde673fa1584f94dd4b074af03618a1e54aa89b012468a8030c54bd2e74dac6789e21f0c4aeef04f4a2cddf9443f1894322f593ac955d2c43e98f353a88b72e283c9d4695323fe95cab407c357b08e35bd174e5e0f06158452d94e103d93cf83e9ea5db424b94b12111e4c3dda831c511d4289dfc154a37737dbaf4c98d8c12407a54795274bdfe93a18f3d44893ccbb3fa774308cad9e142fbd3998c3ccdcfe43a964ca9383e14e4e5af166a489f0e260923eed7945ad584977703008a1849c887fb7fbee0dc6bae4c144d349fa243b3798a41347bbb7e7247a5d1b8caa7d2953a4d6092ac7067ff4757f7bcaadc12c7e4a4a2a4931552ca70673388d2b13695250531a4ca72658d63da926e9d160121dd49d6bfbe7e49fc11c9a1a17db42c90a99c1dc960479493df568bd0c269d55ef944ecf309d0c066973d2c7ab50d9f231185b47f9c99f0b671e319844c89a60372aa95387c1dc39f9768aee949434184c614ac9b93a76daf3174ce1e4bd1b1f5976ad174ca604bf9c9370ed29db0573a5fe24ada8fdeb930b663d3d42b692786c730b26997a7ac7835a309ce5246993e28550b22c9893a8bedb962b43595830d89f542687aca866d9154cb3f1419956cc0a06a926aebfd7c834bf0ae6a464b3501d51c1a0d4592731f5bb5b3405739ab49e2b859a5b5d0a26bf24f23f4fa2606cd11f45c83425b950309e76e89fcfd517f2134cf249dfbd625232b9758241982ae5e59efc7c6d82495fa9c5fd8e6b924c3097dccb4bdb23b5c225984f922435fe15dbef5382e977f477db8c572e09e6e8fe6e1d4e10ba624830fda5f4d9d5aa051cc1244375b6b8ee41c7520b3082f94455a58cf178da540c73aa3cf70f4ba2264e0c7325933565a7fdb43e0c93e0d59ffa927c1f4e84612e7d6149882d756249300c4a122a5cbe131806d125987a4b2a54f217c6b731a132cf4491a12fcc29eeed716a4ee5eb85d1a4f09ab5f1398b4a11e185b9d283cdcfa9dba714915d1874acc9b4b91a1321a20b73128d39514b9fa03d46cc85d9c399d2929224c85131ac1820ee4104178693695f623fdb9660a5c82dccb9d7c4a6b74882ab2c1e5c0f1c3678f8c03e88d8c2d47fd1ac537f2ef9f222b530f975ceb3db781cf4d891eccada9f0727420b730a4a27fd3a1f35a4696761d4ac3b49f3c4db8a135918ab921e315aae84b81d0b6305a1f77e2a6a983261615252b58fc9e9df44b388bcc224c42a48534945b13b6f6cbac220edf76d7545cf3df743472b4c4a99b22c59b7fc6a5698532ce89c75a71b5b67387afcc05518c6a42a932354fc6d879c8d99b6959e7da4c2d417afed49c4a8307b52d7ea4adace723f8559344c2ecb49ce9d953385e9ace2b59bdadce594c220afdea4a7f43b26c5486114a564fc948831f1e5288c69692a59d76f96eb65a230fc9647cdeb92a37bfcc616191a0a5305dbec13adcc4d30f548d8a0307e96b809ba5bf2e54f983d54941f51a588278ca76ef227d7be1326af10ffb7a0e76794dcd86a4e98f3ad2e499653b72cde84b972360f17dffd3ea93461d4bc24eda81695b27a914c184bf22f1546498960c2e82174d4aa0b9fd4be4b986ccc04f7a072d05cab05229630277d5ec27b524b211e12a98429ea2769647c528278fec61616254cb19f73e1f22459a6f3244c17f4ec82096f9ffc2409c389cf1f6d31c68a8449255136266c5b75a91712069d7292dbfb1ec36b7f84414c7a2d6969b345496f6cb1238c213cdcd68abe94d2b4469882580d79555e793abdb1550a05228c30c922727ebc3dd65bce0b441661ec3e6ff7125faa4ad68722ccaff53bca9460924e76224c72923d8eba6b11615e35754228b1439844cee83c52b62ca81c43183f749ffadd37252223520873bee593fab232ab4e086192739e8e491baa72128281c8204c51d4a79252ce7d2923158808c27025b5745fd26b29a7190883a974bd6bd1bc210208a403470f749461e3878f327a3040e40f227eb03e88f0417793e592dcd80e88ec81bd5196551d4f50cf40440fcf9fca754ba9e45e79285bac930b5ae5e26ac97eaf4655b32fe65f7830e5f46fffc851468e1c384c50a3c60e1c3678f8c83b9883cec949eea7db10358e94b0cac8716240821084a0460d1b2662075390973f8b8c79fe1cab03a6596a73c1eddeae5287752c55795be7171d0c3a281d1a7a82f0a0939c203207939026ee5d677f27eb981ccca184eb8e33f6b1b48e83313fa9f094625410962383081c0c7a54daf76c424d49fd0d863f49a8283d1d179f8bb8c15c173d78a73441e5a5f8106983b97392f6b48356b12ed1ffc041068e1c369ec70ef77115021136184d12ff1e2c48b1b35d87c81acce1baefcd74cc0525ad06d349529e382a8e0eed9e34185774f83c56e1abaf081a4ca95a3b3fca5b8e508b9c41c40ca61c29ff152f6efec544ca60aeac24749d783962ae1e3f7c84a0051088810819f28a0d8b29a21ad7b635a6ceda553e5abc3a87c8188ca275dabd3fefecba02113198739712a6f36387db5c240ca6132b4de9ea9c2feb14018349ac76b85c7ab2cea7d8a81e887cc1d82f264ee71b8b9ea23ef811d4a8817cf0375cc40b225d50bdb36a462e9bdbcb88c557bcf06632b42a225c3057943fa9f294b82ad78d2d15d982d90d44b460caaef19d2b9fe6a3a48864c1a0cb823cf7b04ada162cd475265a5e292f2a6ab6598b1e6520720593dc4f370f1a972c432b98f273684935a62a98e22715c3c438d53c45a8603c57b536cf5b9f2ece12884cc1bc67428c526be209168b48c1987a2597c853416ac945a260bc534a36cd0ddb597b8f200205932eb9b2e83d79a2cb2509224f30eae5922bfd8568f94dc40986cff94b5e4e829c0931a70f1f6c01912698539ac9b0f51c94ee9c09e64a96459df4e5124cbee91b163f69354145031125183e9a54c9ab654f2c5112b08cb37437bb346a6d5e92a868499238d9b3224830f7b78d5c86f6ec58891cc1fc27874f9d4d7cab95458c60ec2faf64b11b9e333a0e2986973ec3729fb2921a36cac78f1d397cb012428861d25ec9d3f227a1440dbde00410d8f183c70f7a7ca0468d20840cc37822ae04eb2af9596461984aca2d9f8418cf499083a189d86bb7958ca5fa7433399450297ff8d46a018641741055f9a478b9e6abda0df985490e974fe81e95ae4ee90b93381e754d2e49ea79f6c6160f70a00341b355632f8ca6c4dfc79f56c937f1c29ce2ee43bb8ca7e9bd0be37f1017ab4fccc4b974618e5a73a6d4a9aa4e3b17a67bffe8793bc7013f7cf015d081031c3e1030011f394eb223070e2af0221310800f1b3f44280000096c55e04a05d08a3d20020f2835766b9403fc878f327a1420003f482ac08306007ef828a3050408c0e3e09481031d27070204e0a3c77b1968470f1e0940810f1c3c0e8d008c6106222b00800f1f490d0208e0fc38a8460102707e1cb4a3478d030060000d48408fd7819f1f3e6cd810014000460e70387ee4b8e1e3d8b0918031c8708031c670387ef4b8e123870d1b0918430c3fe011061e6438180ec70f1ee04065d8b0918031be6092d4f78f7b3ab54ea51bcb56655891f13d6cf00007b2811e0838ba7ee8c0c18231bc70387ee428830c1b36103046177ebc0f329e0c038cc1059328237a3a45d19293780b66d123da448b61a1845b0bc63a61a25f8ae975231eec20838c2763758c2c98e42f741e957367aff070329e0c25e3c9381f3a70fcd81c030ba6f026793ccf99fd1c2cc8657c6005278040085a0081c4c4185718c30a77cde9b12efff0128d510553a73b3d27973f86c98e4185524ac95c54be452b6bc7bdedcae9c9cf99088331a660cab943d6929cfa639d31a46036d137d44e0aa6a3c46ee8383956706344610c28b8b116ad47fe77da06fad5c179192c11c67882b1ef844f4a5a036338e1b09b279e937ce9e8c18e26d8ad356fe72e57972a586330c154d2ebe8b47471d2b6632c01c7508231467f285d520a49304612ccab9e9492eee2ac668404839ead0ab2b34e7eeec6388239f596d84176c55e0b97c139c63082b17b3fcec7291d4af2da078f1d36ca48310c73a94f84e9981df5ae6a1d21860e23d1aa64b63297b28c875536910d75478461d0a2647f871a29ee9a1b468261f6fd34b13cfd497bc98d2dc791c3878d1cc70e1806d3bf256b8fa563e417e6d83529bb633e950e477c61d6b51b259f4a82fe7ef838397230d20b7368532a42c99fda6c5e982d598a67a9ec0bf320c34f05bb309d1a0beb93739fee6afe31a882c3882ecc6a29b224d3278e143d0f7ce4c278a567a2ed9f3e07de18c18549497db157fd2b23b730c56fb37b779197b394b63009df9d2dc71d9fffb08e1d6490b1c3af6a61fc302394a0cc2cd9e864fd18a18551e77f6436437dc776a4a0468dcf912438b06a6416fed75de9b33b219305aa21a37537b2f5729526a9f88fc4c29c9fed55ed79236bd9a8228cc0c2784a09ea2461a3c3a592f1c046fb18798539e7bc13a6f96239ff23ae30bc25cd5933d5af538eb4c214a2a79209bd659296acd0c5b44c35d3a2da5c542b17fd493635adc260ff17c674eec95f9254615cb37c4ad65af11c354ec2482accedd92d9b5a7c17fb51610c552abac5f64f49fda730d95e5c92828c4c610abbaa97ce2d695fa9146693cd455fd634a9a44f0a93765241775a8e1bff8cc274b7259abc2549144693bbb1a2a5edd2cda1c0b2eb2c2d54ac6cc42c65684b7d7a2b467da030c9eb27f44febc7926c308c7cc2f0a319ff9624515146dd84114f984f2e310f169ab757d209730e5a5a469c387f6f3961fcd0e1f7bc74549fb90983b8b09763c9253a09fa88268c992abf16dcc44fed493b76f458411646326130d9af3ce7f850ba4637b6d2f91cc563041306d95ddbec20744c091ab98459be247192d52849f61c1bc576241d24403970dcf840174b6c59265f3c71dffdd51e2395e052b597b55aab6abc9c89fdca63c25b2e39a550c2d4e5af268f5e6c563a06239378544d4a728da7d449e2542fb955db2a2f7d7171dfffd9ebb74898f64258921715d2531c1206bda32ad85d8afb9691479843ac99b032a22d793ee208e52cd5d98cb6c87d9da551f9d97f43bd845d8d30c81c3b71f75207ee03238c10c2c822cc6ec9f5d6e4fc245b7844115cf4ec76b955b979f5b43835fa932c294e92be914498af94746d2a9a28174a238830fd78a5606184c68730d7dd858ff1a14a90fb8821aec60d460a61f65179f14cd8f70f428430bb6e28799efbc8208c234dec28a7422382180904e72662eead9a2e77b14af4cd53729ceca996ff0019238030270b25ca96e63a3e47598e60e40fc68df74e51fa669475237e3065d17a5adb69c3e33fd207930ea9a7535e3d781d367aecb0c1759582113e98dbc3638aa8b0fab9e8383d6c1c1e3e6cf848e7cbc162640f065df139eed39378f285078f32f4603cebf0eec1ad1edf831d39ac47f260d0659b258c3ab9a224c183e1dd4b8f10ca337207b39994b2496ef2927c2c993062075312479e24dd882f4ba603c2481d4cd2ba86ecb02697d21edd218cd0c1e8a7f2bffb8b7bb646e660d2f7d039c835717490cac118636f7279bf83d0561c8ce2596b754cec5cab0a0ee68d4fe9e46cf1a4d28fbcc19c2bd6291d2bea3d8cb8c1e4ed6a49e8f9ce26f73618cb7456132bfb0b5352871136982ce5f5f2122cc929791d38123276b895aec19c1527d7e8147e63f51a82185183b962a86c6ea9a03b278da4c1e0361642e7f3ac16e23246d0d0cc57754acb9364fb0c26399950c2720aa11f3143aa66a3d639da72be5b06f3299975515632189494fd92bb46c6906b78cca8850b35e9418a057d22caa13d7ef0f8c188184c9db9de75b57a313a6446c2607a75d1735e4aa8fa72040ca6dbce6d39c5cb46be602c3ff5144dc95d267846bc60529f4a922dfe3fd205739aa75452d29622d4aacc85112e984cab4be5e86a9dd62e63077fcad88119d98259fda49d7c25a893961dd182d14a56e89af83449d0c748164ca62ecfe8e8a82cca6e4163c15ce94dc5327f53e2ee2357307a32a1b4849283d6af235630d907993a6f27d99df2057318a982794429f1c6e29a2cd653c12425efca5542e44f5330e9933139f21d918249dfc3a5ddd44bf6d64814cc6b82166d6265cbeea060d02afaab64b31c3d253dc1f03d42871ae171c272fe1ee3ac24479a604abd665a4de59960d05a3a8e8508a54dbf04b38efadc8812f874b914965aebe635eb5db64a98def31c1e8f24c174f9c2b6c9232d8c0909e650415cf0108f603caf35a5b28f18c1245bf88c7faa9033298629aadfe738310c3a4b44c96997271a86c13bc66e7f9294290c635eada78f74b3f006c3942c283d4a3ce1a4598161caab2a77cf134288bf48eeb0f924e99c2f0cfaa2764ad6522fcc23b65ede7e4187967861ceef964ad0a65d18b67f4d4da78e2cd185494b6de446f6929ccf85593cd909f71a936f5c987387b8bb24da9f9adcc2582f165746bc727e6c614e61f73a79baf09e5a98d3c44fdd4e2d16655a18ded2287139dd82d22c4cdf493c0851629e5f5998c39318a7d5b4ee2816e6caeb612bdebf540e1626257dd6b9e9dea8ec1526d7fdce9ec4de1586db922aa69f5a61b67c92e76d28fb102bcc79ffef4f140b2d5761f0b9fa58975785c98435d974dc5361b6eca3c2e9a85e9ba3c2946c47850ae27582e71426498a09d3d3140653d54beff8b27796c278f96b19abde314c52984a67e6a24753fac551183d95251df4280a73b48a27bedfa4130d8541d773f0383afcc40e1406534adaf89866cbf609839aec99255d9027cc614566fb963a61faa0df6a64a793b2c409b35e101e96c44bca479b3089bfe06aa6522d09d28449ddc889162d522b9e09c3b9faf5c68963c26c1e9e3aeda29abefd12e6adf0386ea2e4daed96307c49a25ad2e9727ded9530275373eb289b7a69a784d1c38975aa4fa8deeb93487d98571286dd12275b4dc6e83612c676b58ee7d9aa6b858449fc3a8b27ab8f30cec6983a5d9594d4118613c7f69424f7aad908f3ce86bda851d2529211067d82494959078b7f11e6247c52b6df79428a8a30f928f1fed46ac553220c6f72b5a3a58e08539c3c32f4ba4398a227594a775e586f0853bab53369e9728cac10c63c5d1db3a43ba18410a62c4fd765a1ab750dc2dc494aff1167a1e48b0bc274e9e33bb4d3c81908d3ac6f49c2b86a580f08f3c91f99a2a7a14f7f30883439a89464cb5e1d3f98a42074d0af0a27c5ee8361b6ae04d9295f8df860aab4a02469e63d18ede2dfecdf84017a30e9d3517bbd2f86d0260cc88341c512be94ced1bf3561001e8cb7e61f4f3cc9ab241306dcc130a3e3524eb1bed74c1860079368234c3ebfa40e06b710ab5c3a3a183bc9a19b6e5f9dad640ee65cff414377d6eb92c8c1e416764f52caeadb92c4c1bc6b9a7f9209163c090ea6b856fa6162550efb1b8cf537a3e4274109d1dd60ac242fc5765e2c7ada608e594a3c8b9a0dc650c2b2e45e1b51f71a4cb28ba509e253c5c7470d6615752585ba270de652693e7aa70c4bd283067314fb98a2e3d2a378ce60caf79fa6c4911d2c78cc603e51cc92b9fe99ce9d329884ffb3b425853fd50e19cc66b5efae2662e1340663b9ef6799c4601a713b7166cbec466130e5909372752aa72230982ea84f91b72487d3bf601247a90e67d2cddfc70bc6d1598478532ae63e5d30fce58d47cf17563ecd0573bc5a517a46da499ede8239c6a78c70f1377db7160c166f743fe7a7e87267c17819f3e92ffd83521b0bc68fb5ef1c1e34bdec2b18bc2c53bf2fdd9db0ad60ae95ef300d2532baae82c9f22cbfe47ce5ad9a0ae68a53d9a4af38db979e8241ce018c68a8644e8542d240200e0883a150201408a4ad47007313080018481e8bc682d158220edb0f14000352382c3e322422241c1216121045236130200684418130180c0a8342a10030240e376532d50143215c6d80871e47427984479c478f3aefcee922df914b592fb59614f895b2834e16bda1d3a80f0f7bb8f4d654c47295b35ff927930d1dfe8813937cf5c18d3d153ef99ddaa3dc033ca811a40e14bb9c85495ca6639595344ee12d2f4ddd65a4c69be75c21ea16201b9154e8f312bad215c8da25db4f90fbbd5c65301cec9ab89609baf53f92a565b394816fa29e3e626c5b9f13e23b4fcbb785aa5fe5d88db1416ef3b98afb5704503217586f289c7cb3dd4002ac5e74bf5e34235cd13341800eabe524a199a4a7a63548a1f71e0bbbe2f107b59823770a30b652b8b3aad6e59859f1a0d640dcd374a20720722c5a006b336198bd95b3b678b70cb8f4208126daec5a3718c8e02191b866eaabf08c7a23d7b9e01a602d6d1080b6ccc254a1dbea3d4a115855acf1fb94f3c6469786dd1c32d30da68411d4dd3df1c13c21e8c5f4f5a4ea948051ba1799291bfe842b5094da87a60d7897a023eb4a67e7727496bf11495627341c5c1e1e20f7c261792a6670c9656adf4cd2ce96b2118c48e1cd87b60306b86b4b5037335888de8c4782bd6dd0e150ca68b9f5bc9baeeb5673ccc6b7d0ad89406004b5369c604cb2cb0423a12dd0250c93015cba5cd725a4de872b0d64d5cfa705502bcac49c87b0328b7b133b4483211c680c6eca3b2028cc798671ff1848109190f2562ff3c8765f14c0b8e67cf724a6ea3859721516a08cc4351c2c33d1832ea005f2a39635327e3ee05870d707bec73309b8e6da5472aa2bb16ed361ec951c41c254b13e738147d0bda155261aeaa91c6adf353d03f274b7496f61d1d4926772503a09c7755e8a2adfed4469ef2df9657fe07c10bc0e8366afbde9faf1f29f2876892c8ea6715bf42bada3ac01adfbf1628480713fe3a1a81d976d63d5e5689081b0837aa7020e421a7f551581d93c55f00596822c80fb6b93a7bb8dc9a397806af58d279c9af600231f58f4d5cd1e47eb1263716d09cafb04b3e02979ddd940c8ac2d1409c450b77152bda2d3f715071ddf42e5ebdf7fc913cb5da809aa1c6518b1b34de2efc6276ce9360fb5dddb22ae19bd4b0aa6f98b1e4bd3ab992539b890d85c6eaddc67489c24200439df814e9219ead327ef43056049efea4e405c24e9f6451c55b9939e750a587f4af6a3236049dabb3f6244a5aa9c71048cd3acf40316e05b661b7eac59cd1887167ae2b404e5f52646a18111a4cd2bfb379d878d321f4ee580d24195faba3b10d04c717eaf8de46daf43b7c9993b0d8a3b21771ee7dbea088e288d93b2c0f0c675be91c50f21a16d77891a601b714462f42043410ccfb8cdda18974619278b961e2e26c8d8660e7998db2d64d94f88d5142a13f0aa332ef389100a663759852c0530f1befc8f73a658acede58054d0024083da8b102e40ae2d303ef1b500742764a9e019cb0d9a2f582b27757235cf2a39e896c95451ff35340915ba51021c3f46a95a68c9a801a07f58ea5f4e9db21e18b7b0eb73acbdf9977a22791cf6d3b2b255d49f81e8de1ec288beb9e7c6ff1622bc7764103c169a4d39e9492a67d9dab8515e53d4b1091216348d1e7e884debf92f3f1a7002225e373cf9246e8c5f6b9b4eede50eefbe066b0bed759632af469e06c995cc6121b86cb92057575f4e5cd549a1c5c31fdd5eb752d983869e8dad25443799d2ba727d59b09bdff1a0048d2e04a4b825f7d65f27c3ee1b72377f99ab3b26e45efb828ba325f32f1c0fb356cadc13b6906ea3c0fc0dc9818cf4c92fdca7870316ae93370577aaa9e108fb1d130b374e16aaa1c9de6e61a43ef93d2759a17ea77c8da30020e129e122e5c324ce102d00540b200129185684e2e0341cbd24e0b288a09938f6da11cec4e142a09ed945ed02b85336622550b283466890c05c0761a9629c6e023b3d27f12d72d64a982c574f76447948d0961f6c5c786a1c7287b991fd0e01e36d0169bcb517218daaa477f6c943411f3aff856f6c751e603592bdbdbc9afe2d0b42b877db66bbce73d426042dff8a7fb4cd603516224c4375dbd57ce0a73b5fee86da70542d0fff1752274272764cce3c564a2b5c239cea638470208b111b264a46dbb2ca97ff0cc31966056a4bfd75ba7c1b0b6ba15404c2d1b797785d60eae7f00335d388e5d433a762fb85c4fb23cf29b44e1332f0e85c4a8beb2f6030131db379426e9f36fb4c764c8816e4b0e78b44630aacd8b638d421845db03aa5763d8567a9221e4efbc3aee20f4eb6f69cce2ba7ef0272cbe73fbedb847337e3f420c7e96ed32c6c2ac13ad4c7132ea972c34e76b1b916859fa3f723d08523a186eb262e9be95bd9b1d837af786e3f3cfe633182e1125b9878eba5dc8680031035a440bd13af902b0dbf59b9669e1a38f66a4f25636f51bbc7b897b7935be3140eb758b2772503ee1aa4ac04706e432bf354e2e1633a100482c16fe5fec11d3f53e515cda0483cceec8dab37ef3b58b532d3a7c6ca560c06f2f45fde35f04c21a13b3915df29f012a047a5c820132e92043b3da9d7990d5d41f4dedaf150c0f72cf4a7c3aa15f06bd64053c37d80b93ba0fafbf8f31603fdde36f102043fb1ccf5d899a4b95559878e978109af619ca5999d4dc9dee65244a7d460411497fecbb5a2690ad757ed4f3259c4c7fba67d8a509aad47f145bcded0824750823c1b04c8d0da6cc924232633dd6cf63c09189f49893125999bd3a7a8decb134c844d5b97e89aec7e5c022a6814ae9ac161e90bc93be97b78af701f7a1d463a9707ef581e80701f50a880df8c775e7e3878cac254d76e2c32abb0b1aac24f9b0374541dd030417bdb1b498a50088c70691e6994c67af329e0aab19eb6a7aa46bf5e2a5db8a5c441598d3dca63067753893d83b2695db5e9f8e4b98c8684694d49cc6aa4d9f9dc00243b0f8ac1840af13f023130532a20c6f2d33999619377d62e3f91395b60edb0b02414b6175a427eeaca633a662e4e0ffb96e7d5eda7c7a65aa26f30e06c32add31eb24333c4b238d0e98236234bb2bea4f7e9e83ad2aec1c6e816c1114702115d82a767124036e8b87475fef2fb98ae85360277243de338491b77c43e1f9892e8b5cd8d15328ddd73837b691051c91bfb83e0b261336c1e8c4427f4a73253d9c9c77112ce89da88e7004e11034d7072177770ca80e5701fdb8fc1913c2edb461a644ae7af563899cbe0a7bd6bd325bd4ff7bb5a2bc07639d0df3db6519ab26f89869cb26b456ed2a40bc025571ac9064d203085f360b9a753e63cdd65c7fc18b81ebb446f44207abb20a26dc16bcc87c3a852190d6837a12aa60ff8e17f40809921ee68d3a448bbc9061d73091a16e6f0d2f425b9a1db73341d6747fc381c587e3b76e49842a6797aa111a24264888d00952ed39e685a277da8d51f8323795c77cd6974c6eefb51705c5e91fbba6b8ed1d1d87df472f2d61d37e6e6349551c492722d96d50a1dd6d785a546dcfadbb8972ccd8115ccb79d13f5317ee00d87447947264caad3a758db1d3c73e464d30b79b76ecec1d1fb3812762f46dbc21ce2529be271346891fc3f60beb146cb62b50b57bb2fee3b881ff2a69bcd5091260ce70b917478d337af55067d02b456918cc9060ea20e44a38d39178563173202bb8f0c27535d985e27dd8f6ba5020a3dee3d10b937f91daf953ba6b4948a4fa00ba47bf123d04b0f02fa637be11fd041e61b542be86ace644597a0f15138c67232dd8f8fd9175dc4d002ac7021acb9e01d9b077b521d2d801de123f800806b8f21e27a36a1d8a46e9b99d2b5c6fc499d3a84378b438b504f09d5a9deee05f427c39f83ce22014001eda472e7adedb62583fd7c24e4ad48804ca1b373d95d2087293cf82e92cc00ceac553cb550c7270e759668d675e675e939761d748be86c1361eb4190ec19d6a2d40dc70e89c4d91da1e8a499b8ccaa331f20250f018d7870dee01c3476520b0f9d3b50069b704d96176a33fb91bb7efcce45c1ec8971af3b5c72410c37a7c2d9193b1779db4db9b72f40ecd211c8f293c9548e758e34d78bc5322e7645bf938c53df28f1cfac7524a9f836a5e50782c1d5ec6349ea66c862c2758e0d0472d0bed357daf23150b424ca938ff3150ecc934fea387cd71972bfdc106f56930e7c99f52cd4b1ea8875adb4a6f139728428215447e9ef7960701382da6f52d7405311304189573dd32fb6bdd91cb9f0b49d9106b160481be0c9d53d599fb91526e1eb8e820b52a798654036cadced81afbb6002edd4c80f2c7ff211b9f24c211226d32f2cc81edd1021b6d71320be267524baee42a7f6209831a7d2263399668e89acbaff75d7b86907a4061c50c4dbb48cc47c36cc74b03fcb11282504cf573d90ebaa8f7b9fb462a39fb11c32dfb1fcf2903ea1f372ac82a2292722ec8365ada53c1de19ae08f8a6f9eb705d75d2e32ae46398b27a6afd4a808f27a19c33481a313e6b3b91bfb3d44895678a2ff175cc5512eb967281602166894c4b93e5271785dd92c038a7468237d7380eae6854ec3a9730ddfc91ad8b4071bc18111b9300d9d1a64e12c015aabe466cfa820976ec007850fc095218e5c4ffe3d10909140a6c3039c864eca00b042343c58da6a120aba7b012928d75b68f5dfb1992984037f2830285cb0adc4d1c65137b343020ab5f4742af0eb24469288f013b307fe252292f2baac739e3b23ebcdc565d5c35aa04847f99d117e4232899b910bcf2f2246a9161bac7b9b6a2b0ad4c4d7c9005d0b117bf2c12cbaabd1c7435103ffb18c52761fec2813d91b94e6f17c27391367b7be65051f55f9e8728e0bfe56f0cda19d7b0e1ee451077dacc00eda0565b8399f3e4c330223f5acddd3ee347e5c269328261d21397acb3e85e6ee73c6cabc2c57752d7291faaf87880288e814b1fb20c811ad0d1109050b4554b3f7b07ad2a356ad6a45ada6aa58aaf0f171bc56598562bbb4ae6f4305045dd2fde624b88ccdd686f3f4dced62907be08be9ffdfbb4389a0ec61919cb9d73867e889cd27b205105ce806923bb2f6e7222ae42ab690818a1e650944692523f07a363beb552e5f561cc668e3987b5dc1eb8fec5e0ba3ff188ab08bf7d20e10b1f7a2886f10ad9efc49c55440f40735d2b514c434a8061c0e80ea7d8aa84f7a20902c3f6040df87d417d0bcbb6f39f2860dddd8bed55a04ba27fed7218b2ffc4653521e2352333992250d6b46a6bed8cf042f23cf24c5988c1c68b83a62d937dd1f6d50bd8f09c3ff6d54ac9b8c09e4525cdf6a81b0888010144095f406bc9080f218bcdbc2a99dea88bda3ce3d486d4443c103250c9d0db78027310dfc3534e80966a23bde928498d2e2187cda7f7fbd3336aa3d5a75a661076bf0dae39a7340ea72dfdb48025ed47edd2cd1946aeba9aa3d6da9f959e46b46f9c6a15d5b45f801e1d066199c3ec16e15bab7b7d6fa78864de9b596214057ccdca349874da612ab09c3574bde21d24f98d318acf95eacf8a0d0fd541f1210c18fdb7185504614e3190c6663dee79db88a6b68905987f2409838d783c1660bc9b0883289cbb5410ca302eb488470fb3d81865636c6ac6854e54cb69ac83241494831e3842f66f97b9585f71a916fa87007d4c7083480a383d2c26973771eba391003573f45dc52b5b75c2fde623a045d0ee63b3496b34ed0caedae1b1a38844b73762a03f7d60fc208b0516cd7425f3e91dbfe90c329537b4b9bca2f96f677cc1f09b063543b982afd64b55a00dcb2af5f8c6b878079844d4865899d3f6b31653d9b5fd61027d0ab1ebfbd93badf49106670d84469c7754437b4c95c26063cc3273e90da100f7cb155a6a1aa6477fb991182ecc36359ece4fc398f44f2ac5876293fb891fb8a5f1662f99e7a2416f27a64e16b8ca8c7f382730ee4b125ef38740642184f8b34e43251550b1472778c0d6553c4fa957050876ac26440e8ed0954397c4b4b955944ee89f50d050c3f27bd60705c0c11568f192f7e7919abfc14bc995e808773bcde7f90a96d05c2102f58074de29a7fc92ca6338a9efea08248fec7bba4ffc9d84754ecc46396cdf4d6c88f33647c89e8b799c9dc688881b8596c68d750423d1f71e39a7f87ff548a55107867fadb893e7c6a6a2ea44a242d626b4c2a0674aa3d0da505f086ef4f240c0b8f44c09cc0ac4d20c93301ad19067f4cd6322c6016bdbcdf87f942e2b9fb9e2ef0d94b4e1a751161f59dc991a0cf7ce023c2985d0067361413f8c76fdd295132a52ea86d3c80ca970da5ea0b4ba9ca92996692dde6f35816d7d1ddc62073f58a8031607e20561c5a53299cb60ddc52c146c2c28e166755462cdba86a0503d3cc06c22906701f5d8509834c4ccaa7573c20a16adfd425e9be1f5484c443ddddbfbc789c0ef2f4d54d8d3202a3dc94ce8cf2e547b3dad4853bbb51b49ea36ed3698630967be14612766d718eb4c3cce9be7e71714dee8263544ee341ea15f880a034bd6be661c927e406a1bc1363c0349fbf5fc181bde9eb1638e929ceec28be2e6afd33fdbb88c5aecfbfc725db8cb01a9073bc9d6fb381b56ad6c83c2980dc6e855860d5b1268019d03b78111c10eec41ce5fbac47ddd84a3459ee8d701e95370b3d6dd41f50069440598e0d0094b64f82f8928dd56d66a77efeb551e6a5aea68119ebe56c969df648cd7e0c44cd5e0550605918817f550808564b7020fd14a3c779008ff2c4bb712983dd2de70ce5f5142191f3d7174475e9b2dee127949775b072fe1c28248c621e9f6eeddda272c26e445137ba5e454b6933e5b9c35c6ac343193dd1c70095bca7a7422737e8fecf34d9f6c1e7c28163295b130ab2e4dfd498fc6c370b6725ae59c7ae988ce152b546dd42d1459e25bb8fc6a3da81108a88235d161e66e4de2f3ed11556654dbdb2c683587c51e72b13cee34f18842ac59276cc38654875b5affa9dc476ae5db8157acfba56f75e93445ce7ace809c7c92f79e63e176559266989bb24c1f0ac6a5490298d33b7d12109fcf844d505d24f4c318453a62b1c7685539c8cf2bc3203270fff6c16715106174b45634901a75ccade91af811181ebd9921d76b62b5303195219fedaf48f6aa2200d673320a564900bbe912fbaa6d47bc24dc889d22ae582cd558f75a69d03a27b11b00e33369fd8270a578cd70de192167389df4882d78a49fcec9063f87ec41e05c4379ec080ef15c64ade7c5f013e97e42032d176241457b8f6e2e627f30e49b140d19b24134f53434d8893ea1cb716cab7341a3875501d86f416828ccb566d697488f44a8c16c29acad721950299a7cf6615ce94f281465d99a4fe7c73d9d1a5a61993b36a914714653749a43c3f5f82f413ad0aaf49eb4332242b68fb4c2c05ec8362327cb2a7a50f4621eed66aa647e1d7bb9443ddd782c66f44c34b0ed26ecca94a960a0d9f1d14fc6876ae2ac9f91901ad2438d3b7d11bd704430a8428346837609732c59070fcdf630c3188bd7eac269302e8e8335b2bab648281161ce60b6f56cc9885faad85bb825a0d58d1097421442d77c32876fe1da49734318708d1c36fc98a5065bf55d80eaabb363dd12ccb3214723f321bc74416d05cc06dc5dba1af0ab8a18205f98f34693784f49c33542f69e7a0dc0f40a70c7b1253eebe7712e621a257b7ca081556cf39896245ea59ea4240abaceedd9111547cc4c5a13ea0e23c365c6aefbdea0bcf64b5cb305400950dad142272767e593a5627f44aed041ff3c79c440a091e828de6932e66c3db72c5ef2e8513a461a1b1ee3c14afae140dcccc3ee23952e1d8867c16a189eaf2831c7d7fc49e277a0b782263992721dabab81383329396ea1e2de74cb59d56a7c93a5b6a23cca15be500a5dfd81fb3a183e34207500abde75dcb0d1a144168aa6fd5850b039216aced229d42a4192a577d4af97bd2ecee0b3e9f7be948ce012544d87831a656086df4f83c452dd9887c85992718ef5feacbed6cbd27380a562b5045457f4ba44dd43ab803d9606d1d795edb596da68c5b1c1b4f1cb4be240faaef0bda668bc71699daa0f690e4c10aaba6ccee50150d9efaa0d71ab28e9444456843c80320f5c3c7c4d80b250446a791f7039f1b5291f780a61a65feb6b904a6036ca3e7733491e7ffa0cd49d1c58275dafc39e248291cdabb7da59fb89f93e2c32cf452da3545584eaa08f3451f65c9e9a5048657350aea915ddacb6cec3cbc88ddd8c0a13f4e82743b9f00e59f92267563db17852b444398f8432b7cd889dc27f6b45ce0f20f4209c0a0ca891c75acffdbe1db0ff1960920c5bc1f3b9ec2ba786acbca9296b8e77d4b824d2671fe26a95f76ce2e2a904b03e4df9cf86101a626f78bcdb1f20b541614870805653088abfc1e568d047ebf5bc9a5b67feb02d261dc4560a94acf2938a5f144c104800535d1958c6c3df9ce7b6074f630a02f105085dc67932eb1224b554749f2fc60a223c2130399e11fea97b6471a1c6e203b46994a309bac54f9ed8962c039b93b0013b1107da004c0182b5bb17056450724803121608cf19ba1b486a1580900840e407660124693a21170e4d9c4ce34bdaea53b9d8ebd257e8643ad5361277f226e142cf6a1a23b26d41d46404998ed81df84f6e8249400648dd60fa002ee56514c742a4dad242c036e56488e18be6d7187e56d95c2ec87c3bd2b6065cea80f497ea88f2ecddbc3c2c55113d1623296d8db9ea0c8ce4daa82d0d585ca69aae6d46a11a009b418d00d476669c583aa28b7b624a0fccdaa327f8c6a4820de883a78a4a63f4a32d3d24159b2947bcd827aeadb41b228aafd6cf0e436719d06707c6f36c02278cdc25eeeaed6c6eb01b438502cc15be38017c5268154a4d6150f51f974680d12aa6bb4e589446485b0368f45a2ebd74b8533fe7ce0d65ba2213516badfde2a1227e2eb6e00b58dc56c4fd5661e9bf17107f31a21b3a9a2a8ae8bf929959d716f812e5f48f29db16cf8cd845ae349db67b186066d8bcbac1a8abc1e8a58e990327d04b9ddfa916a8135de641a3fea9396428e3f8c507e1c8b5daee2ab1c70766766428f3bbd3aef6ab02077c38e06b89221b94a9b4b9e262d5b5d5c28c31ebdb688e298de1377625f6c651deca5c10d42f49fa5e6d240d778fc2aa88b135bf0817cc66a24ba6d1de1abbaf02cb15959381055cc9c81847032197a89fe38a330dfde45a5f447e9b1ab9010d91d472921197dc14995f0d07ba0f167e9f836d3ce2c42cb231cb5090c489aa4e6ccac71d6d537335fee4f4ab4673376f2f0739a6c4c7f3733916b58d3c7df6066590f37371bb3ade4e975d1f4d50f2d974ce3f956fafbc803bfc527605afae740d7ece0e41e07f109c24cf948739ac5074652c589c970d2c1562026f27bb24d04ac64a88038115219c16a80083709a973ebc5ea97e7d2b27af2ce08db17494fdd702a2619bc1d87be99dbb5f7932cec3479e558feeba33f92df590370ac3e9d44b49501f6c9297bb219e613828be43693b4a9ba391017cfe74abad1d6e8b5c928bdd574a8e3611f7388f4d2bd3a01d603c0526c58bef248e3ebb10cbb123f5b349bcd4b6cce7621ebed08df501f0cdd68edaa8eb060f2db3692283094232c8d48bc98edf3aecf47d464c4adac0397c279f83e5c974e596e1fe17e583343df1a2314f84d8980c1636701d8b3b32ccefe5f3dceb488d332690e885d60e903aebec39241cb3371b7ef01d0891447f19c52140871db72a694d8dcb8261d0abc0aac8c584f9d01227e1abcb6d4c14ab45b25ff89743bfb7f95f3252513359667b4a4c4e2a6753d6580aa6a2e0996eb21d163a3f7fa4418d831df2e283e08489a8e54ae6275fe5412b44d45e39651ba04a110a4663f818f63570768ceb3a5729441180f8107c55030f92fe82602189309141329ca2641338f92e4ffca66d446df724e29b8e2e98da017cc1c8e5a19a16bc5ef05ac46160b5d10da6bdf282b4922b4336a1b6dd083203704eb260172317dadae7b82fb20bc5b11683a6256b7378146d0e7e9abbc8ba8a77925b7b852109f1ed97b9b293649d3f5742245d73d2cdb1319e6f40fbfb2922d0e519936ae5a2e787e5f6f2bc812ce2e29db470dbcf5b9e55b948554a8052272c6e4f438131fa38f0d4a7ad93497dd7a4836e88093583738ad23881e1cc66a2c354b121b64dfdc9b1d23c5dcf28f38b4391272cb2b5c1c1645f2a8b93b3a4dff644bb3bb24b11a1b46a0a14ba1d00865880bb5572b4e4f6c07a6b2137405746c68fcd21316c311bb17ca1b5d007d12a5274886182dabf34ce7b8468895f1616695f795b6d48154271f7068d043b59506ea9af6c11b8d1fc5a0ff7acfc2d5455eb10ef96240370d9aa0dbe37eee0c32341d4d08b18a9fca432e39a8d0fda6844daaa71f97261577ff0ae7691c495b70f1c94f32be120f8b24affecd8ee6470c43ea4e1804a2e2785fb0946d0c9c5b8d00691aa0d69c08a34ce12308210f0d705185274daac79c3b939e6e99e2f39f52928351959586af2d2a1c76a4059977af77f1e83a4d932176061055de9c5ba81509d19e7c78639d98eb21bfe042a6b0b201e15c776548061f7af9699b540a2be18a2efd3f2ba9bd586ed783f46eb4e096a568991a287d99daa6e3e3534e4ef99ab972a8f4999c4eb24fe0485a59eaf26fa8e066d121de19cef68f476d10e4af2abcdafcda710cc884301e29c6940db6b5ea606ee0de4d4cbbf105357fa335470e1a5c2de006c1aaa0e66b9acddbe9856247796b8b6204268ee933011648a76ae339021000c90c7067db1f1007614c29444971ba2844a38d793b4106fc9e933ff6526cd5850bc7e4cb33604ef3559cb17c61d1f1e5feea55ccf916d6054f8c08184c41c49c7b6fab377c8f1d0f8b07fe3615a63f69101c8fbd5f169038af5defedf42d28d8f709e73b0b7850b8dea07b1e1bc63fb85def0ddf2732496384709aa6b4cfac00dd867279f278657df205e4c8e6f6c930dc0f4638eb201dd01606200a8f02cf6b1041383748573cd546ac7436d734773277971782e087e0c8c8056758d43982432abcd16d657ee4c7a7590acce4def31d18d38e8590704fd3566d3d0d871eca2f4bf0127a9f388ced1e1cf3d6ce6221db2adb7ba06384c79c8797cf23c715f3de5bcd2d8943966a9054e94f644e310c05529b1c4fd3aaf9937ddb4837ff06e38123a5f4d5449edd1420cd1c00139381dff09b9ce69cea29985a5fb188e356d921c86f7ffaa46490ddee9c62bf882412fbd5f23f9d4b5a3687b8e1dfc40ef595dce4068b7d3c67ea713c02ee68d760d698548e57f6b5b20065b24863ae592e2da1913066ea7eb0ace0cc151fc5494c9ce4e4e754fbcaf450f9a8377bcbc153938a8f9c52c5de5ec7acb8a0438b78732a8ef720ef4555bb851830e8e893b6de28a49b045fa8c242103a0fad32b05c4cd1de1d88a16505460ddda23cd0c90ab6fb24c452027971292d6122f723a7a818ff2ed04ab0b6ee411d37082c2639219f0a4eccb4d625e8c63889d82541c67400c8fd37522a11ad93fb2463c6d2dafa6a5e1751328a6a5632a8bb0fe484dc17a4372cac08be809970eb5eef84c9ee97a8f2abfadd35a7f5026bd910ae770ee1abfb25a5bc011c7516b7d17f65a8fd037fd1b5b41d8931e79ad3543c904fd99c843b7cbcf13822335e3a426ac0ccc80f2b8461330c59e54afd3183f1a4074d781851e73bb1c888ed0836c57cd4a63127d19ccbd1f642059051987147de88313ad28b5a156351f1183d6582b60032abd01f2fffa295dd29ab21ab3310d5c94b33edd6ad60be72a889a578c799894bf4211fc278523b7aa02a411f6c4e79adbe751f190fd8ae1b3562935764626148a1643c8f858aab1dc819e54ece618a11d6e27459bc761d920d2530e6492857836d4e918084303c4133db218ac8993cb47276d18eb870cc389a7d562fb8411ae94c3cbef8e4425da0900b798ad46ee1f4b6a4e50efda27aebc09e77aefb40a885ad31674b30fe662dcc725129d535ecbd71359c885ca4ec05113783461c3806c73d965827b2541455fbb1e16f9885098d5260243c3638cc7a9dd60a3f827c7d25550f1d347356aca6fb57c84906bc99b9f5c28770b8e407da8f42c26de3092881bd8ca888932b3e41f303aaa897736a4e8e33bded508a86d282dabfd1760e364b3f37f01b9e71fc61e69c4464b3aea352190ec1fbb965fe3285d2f4688eca346062cbc22afc26e598235f9f4a62028c457f007182276d332d02445ed59cbbcd77212179899ef9b34fd5a743b45c022bfaaa6fb08d05de7c8ffea95ef025ee0c3152ca6a0a5c71a1d991a996b587279000bab8064938988387196de3620c94d4c69b7a319697f5e6a102334f7eaf3fa1250c55c91dce2cbf5d6a1328cfc3ee507b84726c3a70f6807eb437596ff2e6db8c5f442331e0238af1836021d78f1729dd99c647629cfa1c1960dbf4f91bf9a9104922cb77d12808c1032a3f44a4261c54201fec6ff040437f44679b5c87504ff5e80976432a5499d13a592d8c1215d7b934c6c67b11ed74554b917c2d888043e319a14b3110ae9361812d53006e0fd16c45ec38527b99182a764383ece98d7088a98794ed21fa5a81816a1d7e5af407e32d16e428f85ba4ea219ed80b78e4461cfe9662bbe3d00b879ac549b65d44a8519f596eacfac2066d5f7df6583e73522b888cbbab2b97a3e3e50b167cfd0089b5a17580ab1ca06f4926232005a163e6be4774e55802", "0x3a65787472696e7369635f696e646578": "0x00000000", + "0x3c311d57d4daf52904616cf69648081e4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x3c311d57d4daf52904616cf69648081e5e0621c4869aa60c02be9adcc98a0d1d": "0x0490b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22", "0x3f1467a096bcd71a5b6a0c8155e20810308ce9615de0775a82f8a94dc3d285a1": "0x01", "0x3f1467a096bcd71a5b6a0c8155e208103f2edf3bdf381debe331ab7446addfdc": "0x000064a7b3b6e00d0000000000000000", "0x3f1467a096bcd71a5b6a0c8155e208104e7b9012096b41c4eb3aaf947f6ea429": "0x0000", "0x45323df7cc47150b3930e2666b0aa3134e7b9012096b41c4eb3aaf947f6ea429": "0x0200", + "0x57f8dc2f5ab09467896f47300f0424384e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x57f8dc2f5ab09467896f47300f0424385e0621c4869aa60c02be9adcc98a0d1d": "0x0490b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22", "0x5c0d1176a568c1f92944340dbfed9e9c4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", "0x5c0d1176a568c1f92944340dbfed9e9c530ebca703c85910e7164cb7d1c9e47b": "0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d", "0xae2f5cafcc1a57aac6a0e51fb2a269b74e7b9012096b41c4eb3aaf947f6ea429": "0x0000", "0xc2261276cc9d1f8598ea4b6a74b15c2f4e7b9012096b41c4eb3aaf947f6ea429": "0x0100", "0xc2261276cc9d1f8598ea4b6a74b15c2f57c875e4cff74148e4628f264b974c80": "0x00000000000000c00000000000000000", + "0xc2eac8c3d5c3234dc0a1a2cbcf2683444e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0xc2eac8c3d5c3234dc0a1a2cbcf26834495875cb80ebaf9f918457db6a86ac6ad": "0x0000000000000000", + "0xc2eac8c3d5c3234dc0a1a2cbcf268344a60b3b950949d0170fe164cd975925c0": "0x00000000", + "0xc2eac8c3d5c3234dc0a1a2cbcf268344c946330e6fb55244ecf7951cd7f85c4c": "0x0000000000000000", "0xf0c365c3cf59d671eb72da0e7a4113c44e7b9012096b41c4eb3aaf947f6ea429": "0x0000" }, "childrenDefault": {} diff --git a/cumulus/zombienet/tests/0007-warp-sync-relaychain-spec.json b/cumulus/zombienet/tests/0007-warp-sync-relaychain-spec.json index ab871f72d37e93cc5338e2d5daa2400a77234308..28d93481ea85ed861f8ff6faf3ddf2b4b1abb32d 100644 --- a/cumulus/zombienet/tests/0007-warp-sync-relaychain-spec.json +++ b/cumulus/zombienet/tests/0007-warp-sync-relaychain-spec.json @@ -2,9 +2,7 @@ "name": "Rococo Local Testnet", "id": "rococo_local_testnet", "chainType": "Local", - "bootNodes": [ - "/ip4/127.0.0.1/tcp/63035/ws/p2p/12D3KooWQCkBm1BYtkHpocxCwMgR8yjitEeHGx8spzcDLGt2gkBm" - ], + "bootNodes": [], "telemetryEndpoints": null, "protocolId": "dot", "properties": null, @@ -16,154 +14,159 @@ "raw": { "top": { "0x0595267586b57744927884f519eb81014e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x06de3d8a54d27e44a9d5ce189618f22d4e7b9012096b41c4eb3aaf947f6ea429": "0x0400", - "0x06de3d8a54d27e44a9d5ce189618f22db4b49d95320d9021994c850f25b8e385": "0x0000300000800000080000000000100000c800000500000005000000020000000200000000005000000010000700e876481702004001040000000400000000000000000000000000000000000000000000000000000000000000000000000800000000200000040000000400000000001000b00400000000000000000000140000000400000004000000000000000101000000000600000064000000c800000002000000190000000000000002000000020000000700c817a80402004001000200000005000000", + "0x06de3d8a54d27e44a9d5ce189618f22d4e7b9012096b41c4eb3aaf947f6ea429": "0x0c00", + "0x06de3d8a54d27e44a9d5ce189618f22db4b49d95320d9021994c850f25b8e385": "0x0000300000800000080000000000100000c8000005000000050000000200000002000000030000000200000000005000000010000400000000000000000000000000000000000000000000000000000000000000000000000800000000200000040000000000100000b00400000006000000640000000200000019000000000000000200000002000000020000000500000002000000200305000000140000000400000001010000000200000001000000000000001027000080b2e60e80c3c9018096980000000000000000000000000005000000", + "0x074b65e262fcd5bd9c785caf7f42e00a4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", "0x084e7f70a295a190e2e33fd3f8cdfcc24e7b9012096b41c4eb3aaf947f6ea429": "0x0000", "0x08c41974a97dbf15cfbec28365bea2da4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x08c41974a97dbf15cfbec28365bea2da5e0621c4869aa60c02be9adcc98a0d1d": "0x0c020a1091341fe5664bfa1782d5e04779689068c916b04cb365ec3153755684d9a10390084fdbf27d2b79d26a4f13f0ccd982cb755a661969143c37cbc49ef5b91f270389411795514af1627765eceffcbd002719f031604fadd7d188e2dc585b4e1afb", + "0x08c41974a97dbf15cfbec28365bea2da5e0621c4869aa60c02be9adcc98a0d1d": "0x08020a1091341fe5664bfa1782d5e04779689068c916b04cb365ec3153755684d9a10390084fdbf27d2b79d26a4f13f0ccd982cb755a661969143c37cbc49ef5b91f27", "0x08c41974a97dbf15cfbec28365bea2da8f05bccc2f70ec66a32999c5761156be": "0x0000000000000000", - "0x08c41974a97dbf15cfbec28365bea2daaacf00b9b41fda7a9268821c2a2b3e4c": "0x0c020a1091341fe5664bfa1782d5e04779689068c916b04cb365ec3153755684d9a10390084fdbf27d2b79d26a4f13f0ccd982cb755a661969143c37cbc49ef5b91f270389411795514af1627765eceffcbd002719f031604fadd7d188e2dc585b4e1afb", + "0x08c41974a97dbf15cfbec28365bea2daaacf00b9b41fda7a9268821c2a2b3e4c": "0x08020a1091341fe5664bfa1782d5e04779689068c916b04cb365ec3153755684d9a10390084fdbf27d2b79d26a4f13f0ccd982cb755a661969143c37cbc49ef5b91f27", + "0x08c41974a97dbf15cfbec28365bea2dac713b7f8b14e2815d297585d3581e774": "0x0101000000", + "0x08c41974a97dbf15cfbec28365bea2dad47cb8f5328af743ddfb361e7180e7fcbb1bdbcacd6ac9340000000000000000": "0x00000000", + "0x0f6738a0ee80c8e74cd2c7417c1e25564e7b9012096b41c4eb3aaf947f6ea429": "0x0100", "0x1405f2411d0af5a7ff397e7c9dc68d194e7b9012096b41c4eb3aaf947f6ea429": "0x0100", - "0x1405f2411d0af5a7ff397e7c9dc68d196323ae84c43568be0d1394d5d0d522c4": "0x03000000", + "0x1405f2411d0af5a7ff397e7c9dc68d196323ae84c43568be0d1394d5d0d522c4": "0x04000000", "0x1809d78346727a0ef58c0fa03bafa3234e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x196e027349017067f9eb56e2c4d9ded54e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x196e027349017067f9eb56e2c4d9ded54e7b9012096b41c4eb3aaf947f6ea429": "0x0100", "0x1a736d37504c2e3fb73dad160c55b2914e7b9012096b41c4eb3aaf947f6ea429": "0x0000", "0x1cb6f36e027abb2091cfb5110ab5087f4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x1cb6f36e027abb2091cfb5110ab5087f5e0621c4869aa60c02be9adcc98a0d1d": "0x0cd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d01000000000000008eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48010000000000000090b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe220100000000000000", + "0x1cb6f36e027abb2091cfb5110ab5087f5e0621c4869aa60c02be9adcc98a0d1d": "0x08d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d01000000000000008eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a480100000000000000", "0x1cb6f36e027abb2091cfb5110ab5087f66e8f035c8adbe7f1547b43c51e6f8a4": "0x00000000", - "0x1cb6f36e027abb2091cfb5110ab5087faacf00b9b41fda7a9268821c2a2b3e4c": "0x0cd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d01000000000000008eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48010000000000000090b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe220100000000000000", + "0x1cb6f36e027abb2091cfb5110ab5087faacf00b9b41fda7a9268821c2a2b3e4c": "0x08d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d01000000000000008eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a480100000000000000", "0x1cb6f36e027abb2091cfb5110ab5087fdc6b171b77304263c292cc3ea5ed31ef": "0x0100000000000000040000000000000002", - "0x2099d7f109d6e535fb000bba623fd4404c014e6bf8b8c2c011e7290b85696bb3": "0x0cd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a4890b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22", + "0x2099d7f109d6e535fb000bba623fd4404c014e6bf8b8c2c011e7290b85696bb3": "0x08d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48", "0x2099d7f109d6e535fb000bba623fd4404e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x2099d7f109d6e535fb000bba623fd4409f99a2ce711f3a31b2fc05604c93f179": "0x0cd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a4890b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22", + "0x2099d7f109d6e535fb000bba623fd4409f99a2ce711f3a31b2fc05604c93f179": "0x08d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48", "0x26aa394eea5630e07c48ae0c9558cef74e7b9012096b41c4eb3aaf947f6ea429": "0x0000", "0x26aa394eea5630e07c48ae0c9558cef75684a022a34dd8bfa2baaf44f172b710": "0x01", "0x26aa394eea5630e07c48ae0c9558cef78a42f33323cb5ced3b44dd825fda9fcc": "0x4545454545454545454545454545454545454545454545454545454545454545", "0x26aa394eea5630e07c48ae0c9558cef7a44704b568d21667356a5a050c118746b4def25cfda6ef3a00000000": "0x4545454545454545454545454545454545454545454545454545454545454545", "0x26aa394eea5630e07c48ae0c9558cef7a7fd6c28836b9a28522dc924110cf439": "0x01", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9007cbc1270b5b091758f9c42f5915b3e8ac59e11963af19174d0b94d5d78041c233f55d2e19324665bafdfb62925af2d": "0x00000000000000000100000000000000000064a7b3b6e00d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da923a05cabf6d3bde7ca3ef0d11596b5611cbd2d43530a44705ad088af313e18f80b53ef16b36177cd4b77b846f2a5f07c": "0x00000000000000000100000000000000000064a7b3b6e00d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da932a5935f6edc617ae178fef9eb1e211fbe5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f": "0x00000000010000000100000000000000000064a7b3b6e00d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da94f9aea1afa791265fae359272badc1cf8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48": "0x00000000000000000100000000000000000064a7b3b6e00d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da95ecffd7b6c0f78751baa9d281e0bfa3a6d6f646c70792f74727372790000000000000000000000000000000000000000": "0x0000000000000000010000000000000055a0fc01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da96f2e33376834a63c86a195bcf685aebbfe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e": "0x00000000010000000100000000000000000064a7b3b6e00d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da98578796c363c105114787203e4d93ca6101191192fc877c24d725b337120fa3edc63d227bbc92705db1e2cb65f56981a": "0x00000000000000000100000000000000000064a7b3b6e00d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9b0edae20838083f2cde1c4080db8cf8090b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22": "0x00000000000000000100000000000000000064a7b3b6e00d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9b321d16960ce1d9190b61e2421cc60131e07379407fecc4b89eb7dbd287c2c781cfb1907a96947a3eb18e4f8e7198625": "0x00000000010000000100000000000000000064a7b3b6e00d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9de1e86a9a8c739864cf3cc5ec2bea59fd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d": "0x00000000000000000100000000000000000064a7b3b6e00d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9e5e802737cce3a54b0bc9e3d3e6be26e306721211d5404bd9da88e0204360a1a9ab8b87c66c1bc2fcdd37f3c2222cc20": "0x00000000000000000100000000000000000064a7b3b6e00d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9edeaa42c2163f68084a988529a0e2ec5e659a7a1628cdd93febc04a4e0646ea20e9f5f0ce097d9a05290d4a9e054df4e": "0x00000000000000000100000000000000000064a7b3b6e00d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9f3f619a1c2956443880db9cc9a13d058e860f1b1c7227f7c22602f53f15af80747814dffd839719731ee3bba6edc126c": "0x00000000000000000100000000000000000064a7b3b6e00d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7f9cce9c888469bb1a0dceaa129672ef8": "0x699218726f636f636f", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9007cbc1270b5b091758f9c42f5915b3e8ac59e11963af19174d0b94d5d78041c233f55d2e19324665bafdfb62925af2d": "0x00000000000000000100000000000000000064a7b3b6e00d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da923a05cabf6d3bde7ca3ef0d11596b5611cbd2d43530a44705ad088af313e18f80b53ef16b36177cd4b77b846f2a5f07c": "0x00000000000000000100000000000000000064a7b3b6e00d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da932a5935f6edc617ae178fef9eb1e211fbe5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f": "0x0000000001000000010000000000000000204aa9d10100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da94f9aea1afa791265fae359272badc1cf8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48": "0x00000000000000000100000000000000000064a7b3b6e00d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da95ecffd7b6c0f78751baa9d281e0bfa3a6d6f646c70792f74727372790000000000000000000000000000000000000000": "0x0000000000000000010000000000000055a0fc01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da96f2e33376834a63c86a195bcf685aebbfe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e": "0x0000000001000000010000000000000000204aa9d10100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da98578796c363c105114787203e4d93ca6101191192fc877c24d725b337120fa3edc63d227bbc92705db1e2cb65f56981a": "0x00000000000000000100000000000000000064a7b3b6e00d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9b0edae20838083f2cde1c4080db8cf8090b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22": "0x00000000000000000100000000000000000064a7b3b6e00d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9b321d16960ce1d9190b61e2421cc60131e07379407fecc4b89eb7dbd287c2c781cfb1907a96947a3eb18e4f8e7198625": "0x00000000000000000100000000000000000064a7b3b6e00d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9de1e86a9a8c739864cf3cc5ec2bea59fd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d": "0x00000000000000000100000000000000000064a7b3b6e00d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9e5e802737cce3a54b0bc9e3d3e6be26e306721211d5404bd9da88e0204360a1a9ab8b87c66c1bc2fcdd37f3c2222cc20": "0x00000000000000000100000000000000000064a7b3b6e00d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9edeaa42c2163f68084a988529a0e2ec5e659a7a1628cdd93febc04a4e0646ea20e9f5f0ce097d9a05290d4a9e054df4e": "0x00000000000000000100000000000000000064a7b3b6e00d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9f3f619a1c2956443880db9cc9a13d058e860f1b1c7227f7c22602f53f15af80747814dffd839719731ee3bba6edc126c": "0x00000000000000000100000000000000000064a7b3b6e00d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080", + "0x26aa394eea5630e07c48ae0c9558cef7f9cce9c888469bb1a0dceaa129672ef8": "0xa2953d0018726f636f636f", "0x2762c81376aaa894b6f64c67e58cc6504e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x2aeddc77fe58c98d50bd37f1b90840f94e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x2b06af9719ac64d755623cda8ddd9b944e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x2b06af9719ac64d755623cda8ddd9b949f99a2ce711f3a31b2fc05604c93f179": "0x0cd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a4890b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22", - "0x2c5de123c468aef7f3ac2ab3a76f87ce4e7b9012096b41c4eb3aaf947f6ea429": "0x0400", + "0x2aeddc77fe58c98d50bd37f1b90840f94e7b9012096b41c4eb3aaf947f6ea429": "0x0100", "0x2f85f1e1378cb2d7b83adbaf0b5869c24e7b9012096b41c4eb3aaf947f6ea429": "0x0100", "0x2f85f1e1378cb2d7b83adbaf0b5869c2ff3ae12770bea2e48d9bde7385e7a25f": "0x0000000002000000", "0x3195e99b3353c0f2dd3f53c10740793a4e7b9012096b41c4eb3aaf947f6ea429": "0x0100", "0x3195e99b3353c0f2dd3f53c10740793a57c875e4cff74148e4628f264b974c80": "0x00000000000000000000000000000000", "0x31a3a2ce3603138b8b352e8f192ca55a4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x39e295d143ed41353167609a3d816584": "0x0a000000", - "0x3a2d6c9353500637d8f8e3e0fa0bb1c54e7b9012096b41c4eb3aaf947f6ea429": "0x0400", - "0x3a2d6c9353500637d8f8e3e0fa0bb1c5ba7fb8745735dc3be2a2c61a72c39e78": "0x00", - "0x3a636f6465": "0x52bc537646db8e0528b52ffd005894f804ae5fc66e14552010ab9a0ec117fa6058596ebc671fe7774ed143107932f0c4b28cbc70d5a0785d72e5469c084b32f9ffa5a6732fe618bc1b54fc473b9c38549e6e1dadfec5885caec5f28cfd521fefe36f6b7bb735b9b79429c9145316f512cb13deaaede3df3f9fdb677a0d16991234e1688af232e818f0b87dda3f163dd641c2e3bbb3f61945f8f6196122b4cf7cff9df6e9ae7fd83e7c438ae3fabbfaa769ae73fdb97dba3b8270fd3df971ff841ee3d93e41fdf25dedd3efcffdc31ef319c30dfb1a267fbed79ffc4f3ef70fd3f8bfa8cb2fc17e068df4cf2fa17f7eedd37ceb323c6e8f9f754669bbcdf287906f4bb72b6d3ffeb128670883fcf98ed2d6976f4b50575ef9127c8094e1b21da56d3e8b51e6e59fe291d6e5779179c838ffa684d59d56a875f9798d3bbb234fddd1bff9b2c80d63518620942f2f7708fc12147aa1f0ba95b626630ad4942dfd63bdeeeffeee3e45e9babbbb8e378943ca185296be7dfafb61ed33cedbfd3a33b8f1e3b4dee93be2dc7eee7f32f340c8b719ae5cbec980c71d61b73fc8e59b0cb7cb601116c23124d261f8b50f7fd3bffc1e15f9ba28afc743427939ffa8c8bd048b38f70c9a7074394f8225d0e7ec489fbed76009e1a5cfe06cd87c6f7e2ecaebf9c789f425c80d1b5d57bee731c8d9f1e872efe258e9bb8be3bcdc1369cfc57101d7df63b0b3230cb77b1747be5d7f2a8edc3018a0b4902485eb3f72c3c613aeff4849b8fe449c8a7c3b51c8a7a6a6c25cfa2e8e22dcf99efc5c9c4f45be0c3ea0bbce8942dda57694d7ad909c9a9a9abae3d1f59f22374cdad930f9b3cb1d1c7172cae0b1ec499660e5f150c837199c6e6d1fbec9d074f9bffe9134fe57fbf0cd16e6f2e35c7ed6e104782c42289f9f559ec7edc3f2cae7f75adc3e3cdba79fdf93defcb87df88ef532c74c600e371ac6d7e7fbf73b58a42dcb9809cc1147c3f8ca7791a7956091da307f0649e02bc122fd445a8ae1f1ed7ed96d89f491942678f2a5c84278b345dd71defe2abf56f61feed8185ef96378a7944b5c7a4b7f222ddddd5dbebbecfe7adbde1ce99fdfb204f96dc77e6f29a13cd619fff67b6c80d0e32121bf3f8345f8256804069bcd26c365cb0d1bebedf7fae3f691df3edcb07e22ede26c587f01c2f9aff6e11bb60f378cbfdfd53efefdaff691b79fc1223ec5281c5ca2a37ae5d72bedcd11f9f3e54f5b24af5b068b483bca2b9f4813e9bfdcc1914b5986c79775c6f0f67bb57d462041f208e58fdfed1ffdb9613ea17c7f7e061f203f881b36cecb4fa43d29fa053f1e3224a36e948f25bfdf939f14e7fda4ae5077a3c8801fabc56009d366bbf289b4d71ff310f9a33f378cbfb6cf28af3fbfe7626d187f08a13f3f8323cc86f1bbad0de327d25e7f52ecfbf1902179bb51b82bbf1fe42143d276851270e5f74bf001a1edcaffda876f3f832548db954fa489349126d22c72c3f859a76d5078b983a396fd86c7edc9e7f619f9a5e586f1f31f4949e3f1cdc674b90be2a59b90011dab20b7207704890a8245902e41b608c245902e7a521084079e3d78fae091418f1d3d523d2be881a3c74acf1d3d28e8a9a3278a9e11f440d113478f538f143d4ef04cf1c4a0678a1e15f490c153468f103d5a7a5cd00344cf0f3d2fe081a367069e1af0e8c113078f1c3c78f4d878c2f0e4c103c533064f183c33e0e18387063d32f09cd173060f1b3c2fe8d1a3a78d1e3678a478a278501044071e3578d2e0b983c78d9e281e17f4f8c063829e317854d053464f097852d0f325880f417608f203cf1b3d3df09c6046c70ccc0c8d9918b312ccc8988d31db62c6c5ac69c6c42ccb8c88d908663ccc8c983531db321b6226c42c8899951912b323662198fd30f36106c4ac871d356441cca69831cd9e98619941e13590bd40e602991db23a6474c8e690b54036850c8cac0d9909646bc8a49045218342f684ac0b1917b22d64379916b22c6458c8b8c8ae905921ab42c602991cb215c8e290c1217b43a60259942c053214c84e2073435602d9161915b234645e6464c8c69089210b4306860c0dd91932336450b224644ac84420434286450684ec079992ac8a8c8aac06990d32196438c8966449321d76ead8c963678e1d3b765c20b3ed4cc9acec9060e78b1d2f76bad861dad1b213821d237670d859dab96127879d1a3e98da912127891c313e70e303137c80468d1d3575c84ce58c2047899c295a37e41c914344ce18f3e903232a973ac50c0b26179b14d04c7d53a6145e1e353ae40491d3451da3a60c9715ef0e9b3966e6a865501a6ef400a3a852cc11958abaa53a51ada859e4a471d3021005558b9918381534884a068d548da296a07e2153c50c9819856c2adc218729c7890faef078e9b9a1ab987b501d7c0a190d3158e4542143050f182e9ba7c4a4412b87960c2d1a5a53eaad478789450e97960d3334e87123880c54080f06354b3942f49860264c4ed38c0ce41e3d7bf41cf1c11e337bc86ca9c1a1b19899ea2e526aba1173454d0e2d9b6b31d3871fb132a35543ce172d29353bb4748031f5f011c385678d9e1af484f92c66f4f0137cb0657aa99941cf1a417ac819a2c78c160ead2ad3041f133d5e62aaf8b2d8a8a027cb4c0d665d66f8f880063c4f418098c963e7e9fb627fb0427c69b0a2b03358222c932d2267891c2d34871c3044188877b06a10db426422a709981a3d6a744b9f1b3154b47a6821753eccb0a040ce1d337180327858c08a8011514730f3464e0fe00c540610a96a9955ccac20e609d61e74e9adc0aec086006d3010cc2d9e16393fccc8f1446c30054e0d368802678a05c506476c80044f0936981293450d23078d9c3072b0c039c31bc1cd1c3845e010710386a5e53323a4c15ab94983f5844c8896139e1e353708600a1c2b324b80768846acb800d1e3c68e9b366ed6c82922678d1b19e45091e31413450e173731b819814c1137596e98b0e922064c4c8c1817338d5919b32f4d43d7d03c740f3950e47831e3f246b0a478f1f0da6146053153b068608386cd1936536ca4d82c6133430fcf0a8d95171b249b286ca0b069c266043472d838d968b179c2c6091ba51a1a84546af8a8e9c3a606d70d1f10911345cd18ada59a2b70f68875f142d42e1e891a1e66ea9879417da279016c8d1c2962ac9899414f951929590866ec905da15dccd0310335c3a5668f192c6439cca59c2c72ba7cc0142ecdd0d0a2322365a605d58b9b2636c0e2032ac014ccb880da401a66ee7029de8719a4191e7c0b9913d42b2a18332690d1229325c78acc92cc94983d586ab0d698adf158be88af02a4f251dcd0c03525664b43f157dc8d0a052add84b141784b9e0e3834086d703ede4b8e086660e026a85d389062c78c07c1cc69e6c40e1ab38d1fa242e1b71da90f827699c1833505a2f1219850cc44b19a608d80c9388b82d5857505c8c4e28275038b606dc1ca02bcc2f28265054804eb0b1616a011ac2e585a8020609180c5053c021c824505075138173b5e583254315a33ec9c51b7d869024be061691ab476f09adc0c1c1e707a907a8022100013332ae608c0a4d6835e61257123474d980f8d1a3d3ea881f5819585e5840522ace15323a78e6f8d1b353e2f5e0e375ec411b0986039e1e4112a7d67e4d09163c7678220523d535f12372ce0594198438f0cbe326669e48020070a470f9c30b3861c326e6690e343ce155f0da10e1f158ac3a7f4d1206990c386c7865702ef265bc2f3c1dbc1b30236e55c01a5e494009c92c3849705eb043621b039c286089b226c8cb06192cd509ba858acb090497030c54e9807a2c5434b69e78e9d1adcd0f1c9013e9153c60d1e3966d8a49173460c143924b089baa9c306053946ccc091a306ab8f5652ce132b2472bee484e07bc8d9920344ce162c3e72ac889122274bcd9273bbc923074b8e16ff43ce538c53ad2207891827aa143c6de478a94fd0243a8bea241b8285024a066da24bd0115031a808681894090a06cd429b90d5e0e6049d0dafa5caa092a0ce60c636933423c33ff123782abe8957e297f85b0c113148c4145163468d1a35673c148fc537d5dc6abad46cf14cbc139fc44d17375d6eb0b8b9dd643133c40c11335770be4c3e70d8a859018e972f074ae55b9af161e6870fc4f8a08c0fc6c079a35546ab04405a0064063665d8a861538216112d11b48a58c951b958b1e0b73cd33bd54ca9a95283f4573c973fc265840b8beb08207bdc2401e103ec0296017ab17aa29ab182c28bc393f2564013039a1ad0e001c40d2703c80958535834b090c037c03a403870b2e04481a3e583db075d3ed842460c193564c6905943868c55977ac6ca0b1c269c261c23402a3a0c70cb5be14ebc14ae45e60919285846009903481e40e8782d7e8acff222a82ea876bc7e785d7901f13cecc4e146ecb4801e4187a021a05666956903fd81fa40abcc26e80c948789030582d640a5d01d660d661f3c75501ba61a738d39c5a4623e316fd851625e318598404c2b26d3f4613a4d2b338839653a31bf984a4c2c73899d2226096619938c09c614638631c798494c114c247652309be60f3387a9448970387a66e02af0373c0e5fa327871d2676b2cca4f0321c0bcfc29770261c0957c29390f920eba1f7e829afe2353892f3e041b80c6ef3199c06c7a1f9701d7c085f721b7c4af7e1490e84e7e054fc0757ea1af815f7c1a5b815efc1777021fc869d256447f4538bd15a4823baa945d04a74128d4487a08d9825d13634951d11b4524fe9a5f6a173d8e922f3903590329061640c76b0c819781fd205f205332f4aa416920cd985dc421e21c39065482ce44d7221b9c82e9204120939867c9259c82629028945d2209324925c424e91523ed0820a926905e903500760107ae264c90530802449062c30010944000252cb024e7880031a70a404124630a200a9c40f084282405149e1c9cb528604aa762022251b40024509500b489078d25570028404c92abc432794ea0007e10b98a809132545402a2001025ac183d005fc6405274c90746008e80521244ca0dc2227402e7440c9091fdac1404b9c3c718244c912274f1cb0e46e10d6a1c29325402a7010d2c1441d000a22ea00d0110988e11c444c16d0812b862d082104a313b2806100722213cac12be016963c81027413c6c1432fb0c06405274f96206102e5026d40098d2684030a93168886809c70e009920e00057910bec12a0039618109919317963c89c2e40521202445434fa0000d090955c02a304152044434f4c2921f6114130131296232f4a485a21794206101091328570914159c28191a21274c0113110135d92044c14c78025ee1c99321286e709193179e2c41b28212a02634a10978c805175c68402b6c838b8088900c3d6102e576600520205a4dc806130115bd008588890a35e1176e8148490b365c838186a020011a62f28210d01012a215a240e92054838b9c00b9b0421428b0300d26022a7a12050912274f70422fdc810d204183a8099013274a5a5882048a0b432d2051c1c90b4f36e084c919454e9e2c4122e4820a66f093158084504c54e404280a50099805274c5470020405095091121598a8e044c9929db00c0652e1c9920d423278e8c90a444044633051d10b508a5e781280500c175e2022520280300c5652a44405244e9e305101a8888809d11010140f4230980868e8c912241d2862d284c906943461a2248a920f9f9808ca0b4f86584092137ec144434f8a889e90a06448c909af9004cc012650ee1050d0d0930a3c400cbd6020a017805e80000a2a00b1c08212143e08bb3051d012a0169674c144454e8086805a70c2e4432e9c3059e126dc8297302172c264a8080620241d6802058a122443402a3461f2022d68c99326349cf0c62e205152a444052545400d8809b5f00093264a98143171c28426cc8283963c69b2012440452f2c0182014826c482879e28e06309d464034a8a9cbcb00292a22540434c5470c20409921f42585e3aa834ece872f9c8e39bcd76e591ffe05453a8a69050643737a094d20d06b0c10694d2015019009fedeeb3a6736ff78e7976dd734eaf6977ef78761d779d7373379bb941f7ae5d327bd793bdebd8d93bee3ac95ce78daab9e99cd7dd71d59b3b1a1a6ec9ed2cefa63b0756ef6e15d8adaad3ab75bacff93977d7ec5cc3ccec80ee66f50ea7dd2bf3f4a05900b4a564e6cea757bdb6c7cedc1d4b97cccc9f7bb33aa7ee3f7eb83b7fe04e33bd5677771a49d3b3bbae3b6fd5aaab5e9d7336f76c66a6b3bda3cced2ebda9cb06c454ccdeb372f7c9ba6b9cbb2500dcb99b5d4a36c1f94877ceed75d8dd4df7eeeedc27b3c7b3d59aee79d759679d33335de8ddf2bc76ddd3a74fe9de49afe3eaf7bdd8bdc3aed95b767bd3e6e6da75ddecb8dba7fc9cd95ffd720678cc8bbfcf4be0bace996b15ccd963fa6b27815bcdeded1f3bcfe62fe673eee89cd5f39d6e4a6e76ccdd81f38e379d3233571cf73a82b3f367844eef5a16f14efac72ca57badec7536c7cc1cb38b25e7ec629564664e72ec1cab24c72c5d33eccc719c7bb333cba8d8c52e5631ab58fa94edee524a6666d607aa9652ba945d27774b97ceee75b6172ea0e7f44e87bbdae9743aee1d4f9e5d673357da9d94ec1ef3f4d0eb98ba774c4cad353552d6aeb5d6ea9f3b534a05a0005aadec73d6596b4fae554a29dd9b5ee566f696bbb762dee0b77777b633fb4abacbae93b9bd7bfa74761cf7af99b95a679837fb9c35d2bdebbab9bbeb6aad5dbb76e70191e6c93c9d6b77773da777d5594a76fe12306b7b3765b8e7acdcec5e3733bb9c3d794e4a71264fca4cbb8eb91d019d75596bb7bc4e791313d341d7755d0731ec9fb3bb77af03b07499e6eed8abdc717bcfda9dd7dd9d0c40d779bb775de7ac62667fcdcea9b383eeb6fbbcbb79327b77ed3dbdeb3aefaebbfd93d3c5dcddaeeaeeda2c9bbb99bbdd6537bbfbec9e4cbbd9ceee2d99bbddddbd9db277dc1d77ccccec1c764b67eeb86badb5e764776fe7ae7d52dad3dd6b6566769f3eb963e66e32bb4feeba1f937d324ff639997d765700d4aedcd5f69eded23b67f63999b96377664a999bbd63669fde2278bb33b373d7b97bb7777706e8ba4eacb5bb2a251d520021a2f843c3aeeb68d7ddf884d0349cb4765dabdbdbbbaeebbaeeae9ba15dc75dd775ecdc751d8dcf8eb99e737ab3e76ceebcdddd9df349bbf68ea50ce225881a5ec3dd81a1272e00b9c001d9c00b44312022242e3c51c1899221eb2a22421234f4840345404e747e10c140800551c189122440434aa0b8f0a48992254f9a80a00293264aa22021eaa04705a0212015869e20f109a10788c95091003cf8d1f3e4c91090a0254a36d0a4c9932101f028011a02022407c80f9b222226300071454b94103951325484a488890b2e3c81f530590168088a65dd380182024589641e1772180868680524434f8a942c79d2a4891220cce3029322272f0c59d60a452f6ce0c20b4e583000b580a4c80993212848961031710107049f0d6078c281a29c20254b960005f984d0f336427a7890f400052969b201242c3861d2029192169e2b1a525244e4414f0733272c302112679887a803404148963069b28117a0c08600a002101111d01014179e2cf959710f5094274b808678827c42e881b204886847d5c29222251b40d2021113274c5680fd0a4c8680a27450009e1042e85101001c00152919027202c4021225442a2c0142f2a4084a07869674a06a021405a809121894b8c0c10f169e3441c28213262cb0f0a4c90f1918805470c2048913264a5a58b2c20a4f9e00441e7400280849110c404e76728a8058f0208a132097611e244e9e30211a028a826448095093254880585032f4a48808890a4d98b4b0044951931794ac00a4029222188062519c00794f784373a74a72248fb81577646474646464d41d19197992230926399247f2a86574343b89913c3232f22446d2e8e8c88d66f592f0915127399246464646d3c8c8e8e8e8681a1dcd247ca43a92474646466d64e44646479dc44872122323a34ec247464647f2a84bc24632c9913432e29218c9a3a34e7224f9882639929ce4481e1d1df9d14cc247479d848f8e8e3cc9913c9249f8482679004d92cc2c5d2052c20150361b5be3bec64a195b83e2b1fe185b934c2b5bf3a89a33a96cad99686c4771144b31511737636b5a50887999afa9bea604026df5352d28d0e7a06e7f4d0b0af569df6e32b6a6fa182b435b934e1eeb6fd99a64d99a2f81b6d64b9f6d289b746234b0d063697a2a5b9b92f4d156b6a60505d5cfafc9a8dbaf04026dda9acaca288ff5cfe76c4d4279ac9fda5a57db37c9d1c08b3cca90420c192494b40247122c58038b94ce1af5175138b183197c0c419b564a45b9d48c629a504b50f3366d37679a4edc8f2ee524e54e9ca556a2e88fce1435c5442d5df2a5f963437553533560638d3086589a962af54dba408d36e028e2a90d1ad3fcc7b6ddeece00428d2a6820c30e1ad3dc529bc7fa472975fba553287fa4b6db14ea720746f648764d0e59b66469ca72441622b25849e24a123adc18c27eeff22d892424fa907930bbb3b3143945d3c2b2323c29a594d6b5d4439444228efb6a2db3d7ede7970f6b9f2a52b71f67a77dfa366c74dd1602701b0077c683d73024c2786ccef91edc911e51a33b7f543580e1b8d462a9f459ac4fc5295277428a56ad8dcb589a3faaae3f119fa207d7930c5ac0836b248f68371a5020f098cf9052485e7fb983c72b7c1f7842f2761059eef7f45b2492b7bf4112f8aa6c907c550f4996d12faa5788a7aef70d1af97eb5f22cfd56896c65fe17c495fbbdea3d8f7ebd7a5583476609aaff9e488fd0bdf752f45e257eefe091fa525a66991cdb4a96c957bd278e7da52a4abd425e035b913ce264db2179fe07773ef756e2b8dc7727a400c492d3de61ed73c3fdebc092b4608589d2743aa8e3d29df619b98731e5fa4ec2974292f6a1fc6442fbc84b7f06c418973e0874ce2e652f4f3e7f478ee3d2fa506ef7cd5fc4dd7e6feab40f1d6a091e4172bbafdd3777967987ada7024d38d2825b71cf3fcaee5bacb61339713cba5c100796d075dfd93186dbcf97b3a3bcdda2bf27bb8ff8f711c9d923f29b3e8ef70398cb8954ca70c7fa7cabc225f45cedc33dfd098e507f8c61aa04f99c1d5b865bdfe3b6d54e1cb9e727e29c0c57b64b55309e08977f5acf1fb60ff8fcaef6593df3e3bc4efbd4e787b50ff7477725825fc523cff39e487fe24d7d9515a53b1f14827bcfca9dcffdd074e77bf33def487eaf5279ef49ef85fc7aef05dd1ce99ece8ed51de9589df7f53dd5eaf9aa56d6487dd5abbedcf9ab7fba33887ef7df57515e95834656abd5ca06d11fe7131d3d80e8e87e1fc4fd03e67776e4feb32abeaaead18fc1cf8eb5fb3d278ef372df12bd9398794639a5f549cc3cdc4b1a11ff448f7e9ce8df129956c5232a1b04fe7cf0192c12448f107ce7bce7ec08be676fbcef9e1e990fda1bcf1ea9cf7df53871f55d50addd91dad512e6abecc8bdf79e278edfdfa89eaff79c78a3b246e87bdcf3fd61cb9defbdd75fd0ea3d3bca3b72ffbde7df4afc7e94f76bd0885782679965a3f7fe2acbb251f5fef33d3baefe133d793979e5e54b4110e1f2b3d74f1aa065b8fcac99102379b4ea2f071fa0dc07db106304d1431609c4e7f5f7dfd067499f39f186bebcdd7731f33db8feddb7485f36d75c73fccd556ec9dc13714ea4d7a36253c943d82fa97f747e94f67b1434c26e701d8cd5b32bd9860df3e0fa5127dd0c8f2511e17c0e3d5944d84d5cbe5d61e27611976f4254b9b0cbb720b894502445ea8e475cb83bbea003092e7f4b16113a17976f4c33b8b2cbe55b114fdc9dcb3722da90e0082b32a2ae50922b45c4153262ddb1e80d14bc8ab863515311de1b772cb2e10d7a472236a4f8c00aa83b126d81ba5c6d369ebafc97bf7df084e49def4d913ea56b5cd900ffb6e34d09a73b7fbefc96e2cd11bac69d4fd7b823d1d19d4f9faf104f4d4d8d47b79f3a5d9945e98a57bc5e7f2d7270a948d7b8121ce1a3d0485bd447de45af1b1c414e5d213945ed4d09f2fd4790efb6c8e35b12596e515f6ac7fe28f2fa1f5df1ba28de2ef22eff1195cdc7962b5bf6facb7e7ed762b6283bd943c8371e9a6efd6e046ef5551c571fa4fafaf4bbf7f75afcde638937ace73b1e5dd677e2d86d855a374a515fd67f2df186f5f286efcdafdf6bf1a68469b35defe7f5eb7d8b7d1b1c81f52d31fc4e647d8bfeb5c479bdf97522cbe0b644bf1efd3a91f7b82db1af375b32ed2617fef79dc87ddc1653d99305be5ff07b37ee27f68762eb89784ba41cd47d7d37e1488bfa5c2b1b91df49b084eeeb4d097ebff7fbd9f1888bcd765bf4de93a0e421f49e257a2fc3f5fa6389de7bee82eb4d18301ed7a31f4b24ea6e94be2c0cc9ebfd048bc81d42efbd091a6137aef71ed3d952d60e58de77b1cd7059e2ec7a2bd5b7073eb36ce581ffadc4d1afea3fd5b752bd270e7d20d8ffa97e25326802efa8f859521b366c5a7bddbe1ac6921d1810fc3e107c291a81200882cf3a6018cf5bad3cefa568e4799ee73deb783050a96a55a9ea77af52a9545f7988ea59476583425947f77b126c9675dd2dce86759565dd4bd1c8a8fba9e221452a0f91c3e32861d7bdd71a81af8ec7b973eeee5cf79cf8b1ac9bf5521eaa5cfadd1371ee8efbae7b4e1c81fbf944ba6b24bc11f8b6de636666e696cfa2bc925b1fcb5adf620c21ebc1ffdefb18c2d5abbe7ef73184dcd3b1ded6b7fa5badef160abc5609dd770daab8effaaefafa9c7be5545e57dfc528f2d6fafe6eff561b54bf7b061b5055763cba2aa9aa5577af4fc4856ab76babba76ed97fce28dbf7cff166ffc5d2481c865de19bbefde45bedd7775a8e88372eb335842925bbf5ae69d113a71ac1fe4dfbd57453b24c45236db2d92b9ab772ffaeeeaeb33f8002857f544ba8a434209b8cd32ff22eed6befe2a71a87e117757cfe0112457f51c0825e04a96a9545f559679c74123f46b15e577a3bcfc541cfbe5333882bcee62d830fea32abb313ca6314edfa3fe9e04fb695ed7763cba2d6b1d33f3777ca52854bb9d6c51c86f4b5a16c759ab64d15da89b9a9ae2e3d61685fc562be4f499fb4e1cbb8f12de26d326c31dfb853a3e6498ba51eaa80a9a5f9fed185efe16bffe289dd05094ee121d5d698b30f75dd477f5dcafac90e4e34e9558d477bebd2941deae7f8345fc399147f9dcbb18a539eeed2854bbf3e978743bd9553bd66efd166577777d497424e446f8fb3921bf73daa023f3887cb741fccd2a597768d8923ebc0f840deef0f449c20ff090beb71b85033db45d296d577a2dbedff3f3ecaa78f53c447ee2b36c76f9b912ea57f9558a7c25b8f25646542d793d068b701713366cf5aaf75e8245a41d8fae54892bd1ab6214794779552fc528f2aa545f45bed363492be4f7c6885ff9d23ecbf8e5ada2ca06d5f77e8242f572ef7d5e4bf5129454427fabb2fcd2abe2585fb5b2e3d15dc9222bcf8eb5ebbd1455a2b7e41df923038eb4b8cc3bf2554fc4856ad7fb55be1285fcfab34a944aa17fd822df4e945d4eaca2273ff99d7823ad90bc9ce52e36dbfde0724c78be74e73b7d0fee48adacd230be7cabc2c59355da87ef7c201e3234bb58f88f588e97cf6c393b254946e35e698656a57d5c773e90203408c726575669d8fcd90a4e98c2bd7c222d6de128abdcf923afe0ceaff1871e93c1152a8aa0c229ca66a3712f7f0cefa449d13699c02104331c81056d4a928c265f6986c63f25a969dd2b2180269f13951040ab6941417eed048fcd9750773ef7352d2874cfd91a118fcdef6c4d0b0adc4b5b7b8fcde7ec8c6f37f92343f10c6800038b1d6d2ca18233fece0fc247c8b4231fc6c0820822b6f8f2440c684ce31f67773e8328bccd469355dac7833b5f2e754f233ce621e3eca835b64f09abf9744ea3eb148e3b2d1db96e7e679d7076e4be893b2175a9e57e743bd6eef4235c460e97b3582afdd1e83639ba723927079872bbf4c7694718ae3be132962efdd1037772d609c771a9856aca82006b703177d872712edf76b872bdfea888a5c66fd49a9a9aba425361b1d5a0c009292db0cd97423e3575b1d836b821891e988600c0d4c493ad080ac771b1d808b00617b62807987283c1c6652cd1f8470f5cfacc066026c0c8b7252fb7485e2c33701c3495b5711c34b6357e23274418c1860c7cd86cb46a6d536c361aff587bb723146f7e55e49fa27f831420c01a5b4cd1f819a4408c0a50a0440da44c4dd1f85dd79bc3c2f33945fa527695d2f7af624829d7480e521deeab61f4a728afe7df7c8e4e7967f709fc2b0f71e9f55df5cebd73efafe2be72fecebd77efee1e27f2a545fa86f944ba9f7bc9fdcd7c79fbdecc1cb8a71d4745792bcbb8edf098fee421dcf3534e04a16154ca9d358c3e833ed60fd4f79fd5d387f98ff7f471da6736ac3e7d213ce459569fbe27861dabbf126bc7aa4df59f57c7ead37fb58feae9731c7704e1d2b7e121f5ddf6712277f5fd7380ba380dabdf2f5f82f56fbaf7dbf7a6eb9e6f4b345cbe2d21dd57c3ea73a2bc2acb0dab7472a2bc467d44db9df0b87d3afff99d282f15e73338027d669911fff93c8061b001fef3eb4f3bd63bbb97a0100c536690c17685460eecd1c7d4e59ee8e87296a8b3e3fca662933a650619260c0d1ea97684c16370043a7f8246b867968db413e5e58a4c7b5382ff7cff6983faa715aaddd16f3f95dd85d7bd27c122de7f4fbf8ae0330f613df71e4b347274c7efbd67d0486505d5e7ffc4b1be7c4f5ebee5c0c7a52ce31a34d2fda0587f25caeb790c36a05fa57a5054fd4a64f90c1651d9515eb6a3eafb5389fdde13698fc5ef3d91afc7e0086cbff7faf34479191c6175996523bfe7c9cffb9e48f3e78955fc1ae65f0bbff77e75c75a42bd9f0d527d7be2a87a79a45f25572b91af4ae45bf9726215a7381bc69f742b1e0f85f3c7d7a53fa37476e9d30781fecbcba58fd33f4da3225cba73e987edd34f29a5cf3ad406f1cdc86396cfdfdc52058fbb98af61ae13da67fc2af68eece5cea7df55fab7e37ee42fb77b219dcf5849689f316ca17dba17a17dfe769f42fbf02d07a7db3d06fa67d29cbf7097db3db78f7847d71d85dc8e3e91c6f15aecba48316ef75e7f2df67d9171bbf7b8253b4b484e5deeded53ef3bbeebb679dce06b1943779cc81906f3bf071c77a4302ccf5e7dbef63e81f046b9f1ba25afef8c2612eb75df747f0d70bc73f74d7081ecbbe08bf2cb73f94311eb33c5943381b269f6bfca7e82213cf6fc0c3ddfff6ff77c7f0ea7c0de320028cc711507c9981143ce840078d6762a665b088fc19e270a5c3ceb9fd5f6569bfcb371caadc695f0d937ca381c74561d7f6f900e07193b0df631571430f38de1116216850038b103adcc185c6a0279f75c699282f5f4fce86c9d90f98237076fccb7de52e6636cc8e457e57ff6a1feffd71daa7f33a95ca8eaa5fbdaafb1a16b64fa77a7faf13e5f554227f2fc11136b89f1dbf5f7d27f2fdc422bfaaf764b3745627f2f544be2b95c80d1b5f577ef51f2a4fe38e31cb469c2bedc8792e2527f24d80fc2a16d12b3faf3f182ef72c8ed541ee62e433a8d330ffeebf611d8b531ce5e5c422bffc520c1bc696dadab00eef57ff99369bcd66a3f9c378885fd7b92b4941e02eae10d67a4395dbffbdb8dc7e9c1542f92c2f148fdbf3f83b72205cc3d2e55b0db63bfe6d2a52f7fd67a763fd5dc46b71df5108691fbed960e5f68bd03e7cfde533c84238c2e80be15b95a6dbbfd33f92d62f020e4efbf4b3386b58ef34acdfa928c24023f2ee340cd6b07e0d8446b7b60feb3495be83b78150bee7c9f79824c844735b9c66313d772139259fc11abe70976f3540815d48da5dbed50086535dbed5f0824ed6705f36dc97740759d61fcbfa598c21e49b0d4ad72fdf6c98e18e95bf1f64b18630f7c55d6551203c6eeea1a084369b4d06d90f80dd26d2d24ac8371bf0b81e5c9f3c845f08f94625eaf2e5ebd16ff290be3cfad397efbdf0ba45afdbefe228878478eaf6177577bec781475ad79f48b7c82c1bfd2b97c03d7d0647f0ef88b48b7cab38d21fe5f5efc49b23dcf7b70da2cf3ddf29f2e5c0231e5cce32cbfc2758844a27b0db3f92268f701e4e60b7ad6459bf830f805db7ccb2b6dcc9b984c7edfe2399dbed286de091d69def629479a7159253d79fd9999965ccb346ab65371a9ed42194cf967f781e7d6e58a54f9f487b1e8314e8b7e3d19d6f4473b0c87c22ce600afe6d6b47b4dafca6b98bb5231afb4fff58e43785902fa320df6dcd8896a4452801977b49a3e2b4a3bcf43971f44bbf457f22de340651709a7c223d45be2d328dfba7d28edca8bb952a407f16f9ad542cf25b82b4d96cb62b7f8a453eaffc39a574a388bfe7a264503e91a6f4fd1d2ce22e76fd1294dfa0b79433f0e44b7104be9e14abb8e0be1ac6cc4c8394bfaacc1a245856d06f8245e4e5dbd2d27d356c8242f332cbf8275844484edd1f2ceb9f2c52905f8af2b22824a7ae7c0a1699d6d5b07e29be58d6efa251c8371af870fde0217cfbc3170f593df57b5dcc19f59322d398af61dcb011e7ca675dbe29c1715fccd1e92db96351228842bed11075e9e51b0d532ec7809173167926840e6bb9442164900147774e5bed91940b98420148c07c71673ee28fbf41138e6e105b21a3cb3ff687f28a2430976f494f77ac77fe07976f4957eef438d1931434e1e8ce11e4e57e3cba9cad2d06c983be37c122d441138eae33c8fd0d678dc8cb3d676bc3e4b3bcac336d5068c53341fee8df520cb287946cc46314e6fdaed7e2a8f7b7f59f941ba1df9f4873fbdc18e9f7776ea41fe43f9fe3beb64f5feebb378f5108bd16b74fcf4f0a73f94a5b1b367fbed7628090d19d42f24ebb018f3b0cc6eda73b8a30013b6e0de3cb56074b67c3c66958c74c800e241ac637bcdd4b0e85c73a1cdb68a308dde53208fd5369b72bf8b85d5145d611be4efb387df93b23b5df30e9a24ec33a1cf4908204186da840ca174bd427a64cdb647629a5d49fe951124a4c7b4471e587134491c00a05c10dffb0f9e35f9df79fd07f3afb3159b801471355dc50431c34eac5a51f56b91c971d2edfe8ebd8b1c9ec4efb2d08e5bfce07c71d7f466be0c297ab0d2a1dbec6f0ba42ffe112d8402d18491cc8659ae1fd4c1a3fed388520dc4a93ff72251afd71e77250c85ec4f072632e7b09238ecb603f91de6922941fca978f33ce263af7ca0c3f9336e74b96f7bfb985883b7ff68f14dabcd38e4d742e37cc3f041372e83f93566f8ba1ab63f27790086d2edfb62471e7e5db1623ee185e69837eb6a721a968da52a5a7b8ddee299e6ef70c06e1f8afeabe7b7a2a91e51ce1eaf9ae5e7eb7ea3e68fe7c8f824554261c5d293d074be85eda31a87b09ceefc4204e25ca5bbb2955d25d503d2041f608b9e9647683fcbf86f1775fbfb99f3f3699ddfaaaf7aa581b4647d83ddf5689f5b2ff545a7fad0f8822afb4d33a995dce06cda7d688e52adb06777797ef2e1b059205663499d12c9106134d6692054d7466df1270b6dc1147131d8ffec8ccecd4f29c0376c3cb0277b4081fac2c11e631d67777ff3df7cfd7b1eebbf7ba67896011d0d686754fc43f71ac57dad1b512c7b045e081769c79f9c2635cb623f86093d97532bb41dfafc6d995e367c7d9fd5ec7f5fcdf3e31a3ebcebc4c8c2842c3fa5d22081d9bb1de8732e27b4c7e4be7e5ba20f8a1ffc8840c1609edf87d37fe059f258ee105ed278eafbb12c7138cfc28ec3984d7755dd7cdae49f70c1ae99cf0971bd47dedc491bf7496f5fc3b33107888f7fc38fd5313b6646210a0f4341ad7ccf3cac68858687ec615d67cc7ccfcab61ddf7cb88b361ddcf88ae86755f237ec7ba5f89b086c9887c63c41d2d42d5bfffd0c4ac68c4dab1ee63c4b061dd87e2ac61ddb744101ad63d4b5c40c3ba0745121ad6fd279ad0b0ee3df1049675cffe23a4635df7f22568a4efca72c33a95ed669a2aa14638d6cb715606c923e42e57ba11d64f42dd8079f9315edca51b45f801a163f4bb5ac3f0f5fa87cd1a46c34e1c650f97b32e8b45356bc36e5dbb164fca6ef739298bf23bb0c8cb4bc87674711a21dbb15e4e9e20e4a72cae607feecd1555715fad0d637fea1f446d6d18b3acf532f308c39d972fcb950ce674af93dcff60199d359ff37b9ff9a3d34f42f51ddddd3df63a0ce89cd144e7cee7a457bf248f06bdf33bb0c87c9c86f1bf58c60f254c41d1a463d775dde4c622f77a9050f2e3ae81ed48c21572e7cb2fa17c662d76d898ee1376797c71b9f3dd5fae11caf726dce54e1915ca975073be736180d07b86ba2308a3ab89f090145806fef8ac1f613f4276fa07e631ffbae7d9f5ab95718463b89aa9de6b9d231e48638934966e939917131a0675252bf49804e527ca0b8a3b5a84a31021fed37a7f222dd193dfa7f21f57c7bcfbefe10885dc9510ff99a2a57ed2d35aefbf80f619ab4f7d7f12daa757affacf8e38bef2de9b08b9aa77f0480d8c1d9070ba4df8cb55cdcba0ca36acd5894224437dcd5151e5edd2ff72e9ab7f48f0187d211ea3cfcf3b5884f36b0da33b5cc21d2ac2515a9156daa7bf6d91bc45aeb44fc794a57d3a8bc5a97db6b4cf4dcbdb851ea335bc2c65274bed6811d22721051eb28270e4a84b3f890aed539f7e0b36285d6b9fb109eccaefa70f8309d58eecc5c1229c2d9a320a96d1ef10465727ee68c1d44acb37c291a52ea50fa5681402836c9aa2657ed2d390681f2999da673eed7cf8d28e04bed536e12e473e90c41960a26e138e9a9713e79d22cf0e41beab7f9856691c5e4a1b77ae3f95b72e8739524a293bc7ccff727d505de727a1be65b7ec6e779e577eff27a1b8fbd1ddbde3196cea70df4fc5f175b9fb9152cab2f9ee921347d7652a8edfe50a02cbf8a90c88b04c042118d069a389cea520f0c374a0bec7c79128907c9f562ace8649cbdde14df92d4a13a2dc8e275c7f298eb32ba59472845d139accd8cb6d220deb97dc458808527eb94f429af43be1a81b24edd1945e8590dbe377ef7ad1af45be5a89f4e4d601418864ced530eef597e32c155b326531cb66c3fa192c22a44aba86e779fc2df2efcc6e73170c5c9dcb5fe3a211e736d1b90cc2edb061ed92963e6ce78bfc944d845cfed96313ee72e573d26f98efcefcf4478ee3e7f88338b63d3abb94835f4285f2a79423942f53e08dc051ca4c9fe907cdef3945fae39c2fa968c72497fe14251aa1fc59442f9d1f44a5196193bb38afd7dddddede34785effe8eefeb3cacb3cc4efc8cfccf332fbf88fdd3768a8af4f4d311b60fee8de413ec521798bfaf2119e9a929779887b2d7a98b6b5a88f24e01eb9f41e3c3e807cc1acb4fcb8cb1df2b8a7b832450f32f0e43f8187ec02451ddd16b7f90605d32df2ebdfb7dbf1906699aba64cf006da1282eb44d0a99c6aab0a15f8b4f234bcfae55b4581ab395851e0114598705289f96e90590531130297144bb86664626858b39a8327c508a5e072fb77665278b9fd20b44fdf1e3db83c6426e022e08e38e290ff5094f0f20bfd8de2976f778a1b5c6f7e530422beaec77d53b4b95ef74db1e67af59be2ccf554df1465aeb7faa6c8733def9be2ec7adf37c5ef7ae037c5d5f558df1455d76b7d53e4ae177e53a4d78bf9a638af27f34dd1af37f34db1afe792899971d1b0ec5051780970bb9f5bf124184e539ae0a3893a6eafa089a89d76ea414ad9ede4e494653ac5e13486d38df231f370b283e32b5138818413556a175a515961a8b82fab4fa2c07302ccf749d10929f009252427f6607dd24aeb4322e42b4e41b8689cbe18a7717db7c7b831847c73f2f2c4ed862e9a27a6a855e6934fa831c3b727dc88095b2cf0f356aa2a23338627bdf8fa6ae28bcf55e24926c28f3b8a11685e044d3c35e1d444171681f4e730ced28e52886f300f3332d4b423cced08bbf2594655718af9eec3f0633a30fe43f3636ca91868c60e53f3f3b2f92d3f6c5be9db77af10ec2d1e6b278f753779ac996e4d28dd514a31d41d3b8aa96425d3eb656a7ee6695ebecd585f3276fc9fb1e3cb8e21535b91aaa109530343544d8d0d4c8d528d9254cd52cd52189a2d779c4a4f7d948006a406aaa6e6f5e5f5fafe8ef21f9b1f373796614080d81f3f7ed8d86963f3bd5e0a8d7cd558eee54b26c9f4d4124c28a39e7fe6e597e7d6330dc9f512ea5be28c8d50dad6cb279a1f3650f2e90b1492149aafb12fa49a9742237fd8185eb6a6c64a304447b76f2ceb76d9b1ced83194b1e32bc68eb0d08edfdf12fbc661c2a051851142ace08e10d060fd9454471e35d83145ebbc8c2d7280c0a6c7153455eb818712361a6c22a079732049f992c609b0a0b1c7580fbe47d58051ea838bd49287b1326d314ca6186653172fa0b5162b779c4a2358ba7d63c160e1ca8e2f951d5fd58e7f3b7bbbdd7ed82dca630c86b36395a2760c4710c6637ca71d5f449ab0798cafdbf1afd34ccf0ce1b1ce386fb7e66bb6d8fcd8e2f4c3e6879c563cd66f3399a4840ae3a271b96a6a7ed4d4d8d4d400a1a171592429ae477ae17ccdd77cd3dce0744080fc4d7df61f1b6bf340543facf74c7bd9186a6c0c34bf7a6f2e79e04f25b0f5d3d68a790ff31da6c348f5adf32dd59d54cfde34abb5c1b847cd47a2b1fe85e6a5b8669e694834d6a17e469c56249415a8db3ff3a3840273c7b649cdb4dc3a8cff7493c7fa6bf8eaa6dbefd9306deb19db4dd2d64d617d85124a36c9304f92d63f99da03bff5524fb7a56e433194ffd0b8bebcfe048fc9281b193035cf1e0b9f86e6d963ac97e2ae678f7ddf2ecb1ef3dea3a9ef7ab0c6b2c7544ff32d1bcb1e5b7dcdc7d45e76f6fdd38affd8d8133c26bf46c68efce5ca8fb163a509edc851577ecb8ea1cbb2c758766430573e68c7d7674796baf2bd69e5f6cffc6765c7aab2635867ddac525be5d7ab3a9269191878ace3b1ffa89edf0b2325692a51d2186a3679cc5695c225fe69f31f7fa697957049e9760da77f7182f21fa67d899a6066935347b1942bf90f92d10cad7e6d5a7d4d4cdf8ac9ca23d53e2b4bfe83d4bd14ae5a57f2587f677dc95da9b75ca5dbef5f2cbf773f9f7bf92bcb6ebbb3cd59f6985cea2830566effd85b6e7f2ff94f585fa1fb97d7b4ddfef1fba9f84438ba9364dabf66d3a5c99b0403a6e3a4e4cd498679da6283bab5d297278f3527a37a36dd9e4dfed3594880821508814318b4fee9e43fee030df8c0b2c4115cd0fae716ff914936b03115664a0d5affbcf90fcf1741bc3195d485d63f9ffc4752a1070f4a32d8c1466b2bfdd28affd424cdfb5e7dabfe678bff70df0fe5eb87c17f3c4b82c7da0c69f39f953da15f2af98fcaa6d02f97aa4d1203675bf0587ff7f42f2cebf72fb7dfdde57bbf14a19c52ddd1ecd00b18fc87bdaafa515ab99c2469aa6fc53c8b9f57abf7f803fffbf05b3f4aa5cb5fc5182bb78009ad744a92b416686553c87f4292a4c5fcaafec84f3ff2cdfb51c8e5efc7d9e587f94fed84e78f11e593d812e5179628a3440946f5fc15068ff99fe031f0f943d0b3526965e552dbf165a5158f493bfe6528a827f9a36482c1aaf7feb3fad5f71752eb54a9de9f04fff1bc87794cbe67bfb3233f5df9e37376e4db4b65436a472157fe18568f4d3bceaea4ad9ac1639db16f2387f9f923434d3bb21d6197edc861ae3f15e12899a4eec861c248f9cf972f515160c08cf2c97f6a6f3443f3974cfe53039f7bda7deffdc84f1d5dbdea47bed1ae7ef7a3903b4a2696adc5007216e6b1aec5c0fd28993efbded36d655f2abe6da936ec843871b6b2c7c659af8eba67175ec8bdbe7dd28e7bd6f3ff575fb5f23ed0f534cf5f9dd50a636664fe4649d25c343536407e4a52a5fdf8974f499ad16e2c901fa2eb25ced8d4d0882f97f88379e4cf88b553ad98c7fb80dce030cf06391c300f0b6c85313240a4fb522d9cabf97e6b1bfdf9dfd7dcbbd96e6d6b49f1faddd7dc7f7eedb3b596f2983b4199852a9617aebee6614379cc6b12aac67289c98be9288eda9a947ae9d4fadbe736d5ad6db6db375349394939a9beeb282f7ca6793f3613b8924c21eb470e5bf659b642819f7d7936ec25950dab7d4119cdd03a5b3dd6cf34ce326d7aeb48f68a0c8f754629553b8e3efffbcf7c7e4ea4a2149fa214efc41acd57b166f34633b42949206d729f2469dcd29c4fe7d7ea27495afd1a5da9987e92a4515fd1cc44ad3e49d25634b6362509a44d514a008de69324ada60505d7d37ccdc6d66a6c92a4d1f8bbfc676c4d4679cc5fc62649daca3fc642f198bfcad69278cc3fb4499246fd5bf66b2c9b2469d5d6428ff9835632d5d863fe9f4d9234cedfb372c96350957b2ea44cf236a1b8e7a859c752d7573fcaa895359aa1d15759a319da7ca6755f9f69f547e954c54ee4442a4ef13d26a5eb4876d749dd70fef81aff8eb0191be1d0af58ef2ad5db1840ef7bb5f26c0caaefe7b3ff7c368655ebe5b3ff207d3336422179bb271ad2f735a520b4968dc163d918be8e0bc385f11fd02281a0e5c278ccffb348dfd7bd7ceaecf89e45f23c7993767cad2cd2eaa5d4475a59dee231ff69b9302a8ba47a29d5c6309f69482acb1eeb974e1eeb6c3336c221ee3b4c96a76e7a6ae25b96a7cb7150b2a9c97f6a52dc68865657ffabfa7ad55f85e11d65534d29084dd507144d8ac7c01e4b8014ad69c646f8b7ed2885e6cfd8088df48fdd937422944e8463c7c485193ba62fb2a9efd83d754ffe239b3ce65f6b18be5e77ec9efeafad63ea9e3a268ee38e1c14178683eab92367e39a381b75fa429d5c779c5154296a75c7b934b7cc257a47bf81712b7e6b29b7f21446aa996cfdd474c3348d32cc4cda7ee42fb3b15e975184128a50defe51367552973b30aa47b45b60bc1f04a049f1a8c98114e703487f2e1c9d6ea68726a56dfd49b2a3798be63634e780e61ed0dcd6b8570a42eb294a329a140f634be268add4b45ed15a86d640686d692d005adb1a7da5201c8b30454a47539ad1fa939ce694e620cd6968be01cd0140735bf3570ad23e69dbda7ca3195ad735c7bd147f51cad9d06d4d2908cd5f2908ad36e3963d26df6886a61484c6c979f3de7f94c2f6f95392fe45eb7e4a5248e3de7bfeea3f539440a04d717d9210daea933eda94a4a7a9be3effcb7fa628e17c608bf5e127e9d0bce70fa728c168539284d0627e4ad28c36f349309acc27bd68e14f499ad138188d328ffc29494f9bcc239f3904f9fc33228b79e4cb8820f3c88f115bcc233f14430e417e4ba4611ef92cd1c53cf241b18679e47fa20df3c8f7c4170791bf123be691af123fe6915fc5ca21308f7c4e04c23cf2a988c33cf2a7b801f3c877318779e4b7c801f3c8379a915d86c7cd4f9a6111a628cd68fe4993d63ee97cfeaeaa56f4f93f6a2bab15c6c8f8f3bb5804a549c322287d352c8292cb864550c279b1084a3a3f5804a51d5adbd70d8ba054715804a570031641e995c322283dad9f9f03164109466311a6659045701b026111dabec7e4f31b4dd9511eeb8c14aa8970a44df4097c29f3b645f552180d2cf47052028136bf26a5c97f6ccd2d0d09a081b656b371b6c63d0d09a0a96ced280b1734505beb0092154a4e8411c514ad46430268d3d68c5870a50d2b4d5f78a0f97cfa53923e1ab7c157a9dbafe4a2a938cae5fc6a3245519b9faeb771d1a781e2e065a0e6d2b4efe0d7b4a020befd9af7e2d76ede9b7fbbfd7a20d3f6fffa9aedf6df1cece0756a70bea6058599aff95acf7cadfb9a928be6ff4da7db2ee54e3f9ef535a7db2f755bc7d6c0efc0beb5b550b435229ef737b6366f406c6dbe6ccddffacdc6d6d8e57a1a5b9b500ec5819d4b31af5fd9daccb1736e60937668f5553f863755c501f237320fdabcd4edd5c730ada26e7f65a27915531447ddd81af8406c128ff5d7d8da091eeb9fb1b599c7fa3b5b4bdaa175ffd9da747229776aa71fb6a59ea166dc0bb4a9799bf0b999d6874eb759df5aba0d3ecb97be07970214d002c6144c45e891c51519884f8060411827d0e20a20aac0e3071a779c51022e4260430ba488c10efdd334c5089a60810a46f00506ae04ec30079839bc54d18210dcc139790388369ae23882052890d2c106005cf8a0214a05535401c50b5a3b0cb106120f70744152c3053bd410f4501a4209386828420b3bbe27803842054f4c59a28c3075ec30595b544105131633d8d842c7efb8710213c89047135e7a9803c801d09063cb1d5150c4808b168430c871c11620c0e38a1fa0e600130399cb711c0c428e6fb72b7770d1218b14152c88c17c39eef8ba3d82165220b1e08929534ad07a05b73ff41f9a1b44b0c104022d750c41ebffcb60ff25d2ac23b77097f0f57452ea85862681eb6582a60efd87a91b655cea7a4a296d30dcb8b9b1c5dd045298c0e98ee1f751afd77a71ff3c8449f043a40d278ff1bd47528400410d62b4c08830e0a071715cae8d2d976bc38b1bbe68a82321def8a28d3292d8020479c041e48517b3f0f50fe3a6cf696fa1eaf28d8d3eaefcf79f900d19482e9e8d172471f1aff3e3f28d0d35d818e38e3f43da628be6e20d36c0e8220836aec0410a36b0f420051b3cf420c55fbe7d89c11739b2e0a6a023984ab8fd428492145f7e5092e2cb0e53a49838976f6bcce0ae2edfd6a8a392e1f14f29e4537cdcb64996b5d1ed9725ccce4a86d10fcc1ba5a51de2bea85ec90490b5db3fbf06fda728a3f4e5dee33e074b98977b4f7a4b6775b7b3427e397967fbb86d2d66332a66afd79617b715dc1a6ea841c71593ce49e7d739e79ca2e6f24d8d34d430e32580349650e315451469e820258d1ba6a45183947ea275f9e6658fdb5dbe79c1c3899758dc18e3caa72be3b8e3cbcb953b562f6e5c7f1c33dcb82e4569bb574a6b75a428a75c222dbde65e22e49b972a777cdd6e94617cfe2f2ed71fe786c618d75fc755c0814664182c031bd00d060f19e56d3b450906cb647fe5216d8578887cea83c73a734e19867cba63bd47842cf943e40c2c38267d889ce105c3f88e35d7e51497ef2873899c41057fd20044ceb88209c0505438e58352f94e9fba3d5a4266b07f8553a9d27c62f17f9a73ce7ae79c73da71ce39bf37a8534aa9534a279554d249a9945648d24929a5943eb523a5941e49c9cda0e5b9917e9d51c7954fb2ff01f2a99d427965aed40a6220b3e3054fd2007cf98f08f925161e4224a75c898565fc438824184ab08cbfa71277da271ec21cc7653bfaf317d7ad7c62197f3b857c652e7f37117a976f66407d5078cc8170fe58c779e9f3cd8c5bf5a7f4690b66385d4ee3d26fff9beee84f7dfa3b4216d03eb2e25cda31fe71f6b3fa51849518762cd65f45ee587fc739eb503ff29676b4c797a7c7edbdffe03c3f09fe339f1f8afff8f3cdf3cb9bffc8d5f31369c17f62cf1c3cdb6f3dbf10ff613d7f12ffd9e0f97b7ee9e43f3aeffa99e74fc17f649e03f01c3effebf94ff09f9ce787c17f6a9e45500076ac5700dfe20dec3d78003c15712c1290c7794eb41dbcfdff4ee4c022710078d8573166919a7eec3d51c722e9fc77f0a0b8413ffdfa3162006c009e7b0f9e46142d92155fe76dc41c8b14a3f9fa3f44a49b47caf9127cb90278d70e6d839cc7f996889463a97c4043023fe781fc0a88a5c2a271f03716e9c7b71ec752a1a121750fe45f37effad5cf884837aec77916ceb3de65a9380dc9e65baf1291702c15190d29e67158bffa2922b12c9503d090bccf59592a3834a4d503f91b4bc54543baf9f93222124db5547ed090ea03f9b6542a0de9e6fb3d66a9481a92eb719ec652e16848accf796aa9c8d09068bef5352212cc52b9a121d1bff1c052d1a121bdbef501f84f440a80a5b2a221c970964a8b86f47dce03c052114243e21ec887229214a4239a8ea5e2010de9e6fddf5289d1906abea5fa7ff1a588d481a5d234a4f0715e0ad211cd5a2a08a021b53ec722a92c52f848318f24f348ae9f792a9296f3a2a5f24343523d108b04e4a948da5b24f948fd48fe48f4e7732022dd58242a9276f33916897ba4ee91ea23ad5ef5f2371091661ec722dd58249a47aa79249b47faf1afa72269402c92f748df23818fd47ad61371018846b7fb43648ff1bf4498c7f86dc4133cc65f23c2e0317e1a5132798cdf25568ff1cf88338ff1cb882978cce631fe50944d1e637e9628c463fca098c463fc9f28953cc6ef89d2c963fc2bf1e5317e9548c463fc556cc1634b1ee3e744b9c563fc547c8ff14f91048ff1bb08c563fc2d4a2b1ebb798cff481ac5ba62f1b8a36efb6dac6338befa855ae00b793ebfc8d0f749d9faa0e9f4ada0990587057ed06c7a8141130997173499422e685ef9a81d83a69586f50ff94f3b06cda586f567c76e46d1b0fea0d943c3fa5b08d73ff7f4e7fbfbcd7f5cf6d97f64ec0ceded76bb79df1c8c83b9ed601c8c5b7177b772fb3bb7c2d56ea5aab6935aa96a27b5f3f4f4f4f4d44cdd975ac3179d4b61fa89b827eedc3061c2840923c340492809259ba09a9a9a9a9a6a93b4d9a44ddaa42d85ca85fc8567b3d96c369b71740ab134b778acbf722a3b86f475b7f410dd3f97fc87bb7b2ef55cea28560f6962dae2f247c5b1479649d008df861071b3ca7a897e907cbe27b04cc6f8472ea9f8477ea93c8497b6080bc0f312c31f1e1b63aebf47c579e592ffbcbaa1be424bf28bffbc5e61f8e5765c8b320796b914ace3e63710e128bf40c92fd75f2eb9cbd76b2e351377028f75bc191ba110b3ac3b8187f0652b7610a16f51411737e87b20dfef5cda670c02ffe6c67a9c2eaddfe029fc9c31629e0328997f2f332f7ebf7f699f91a75c6fbfdfdd689f3188e63b18ddcad7ef40f42a0debb7a22b35ac5f147d4ac3fa5f745bc3fa39103b47ec300debdf406c1cb1a51ad67f233610b1c1344cca1ff2256d648da411dd0dffe25e1ad62f233a948fd1b0fe50f427efd2b07e96e837e7d2b0fe4ff42d4284dd6dc55ba96a7777b790eae17cf507666430f2d62df84fad6158ab8fe44f881422bfe90bf5142aa5b8c4b2aeb7c1b44b30ed606e836958774f69584b3e1ad6128f86f51b9147a4ed2a3f84a304038270c646c817051e229f6f19532edfc8c0e38e4d0698eb3db48ff77467c9b1a45bd9b2f9a32034fb8ee221ec514b5f5ff5abf7beaf8444fdee3f95da27485adfa2022e55b8f4b174eba18b95a72b63304121e1a5a97d82fccbd4ccd23e41eec6d4141fd7bfad846383d9729965dd8f32ca97c05c7f5ff2255f72e954653847d959a670944ad75f2a2d35ac4aff740f3df44f5fb9d23f8d0412fdd3593ae6ef1d45c3fc5b887014725d88c7fcbd65c7ea852bd08e2fd5df4aabe18c8774b6b7743ff6525494cbe7493919d55b7848f7eed9b1ae7ae955f6ab1dbf3b3276665c19158711ce8ecfc7f89278346cda3114927534ccdfc811d9537e08e511285556ccd93df75dfdbc5f3df8df83ac6f3dff2be6c38f797e9c9997f91921f94434ef7a1a9d86892ef11bd63f23ca8831a2d8125922288662287e5f153b711ec9c886a2c376563bd8ed3ebb6b40fb3e69f5d36ddb9a11f7dcb7fc7bd237c2e959fd8d544f5ffd46dccfeeab3fbf6b7ebf517dce7bdabdd1eafdf94399d6fcfafd46f4b918d5776fe4c98446de7baca4150db4523808bf96b4a2b158ab37527931fedc7c23fafd4a4068adf7befba4152db4523860d99aaafbae6fe43f5f09080dfcac6779a5fa49dfa8fbfa3523fa7465e7d78c54b67ecdc8bfbe51f7b31a755ccd884e236ffb1d428cecacf0a623a076f34a40686e6bf36b491ccd853830eacca0b9ad25b168fe4a35b429242795d29a520242f3af49e1206945a795c241cd08fc9a97d2024203e29209595eccd7c271d5c8842c6fa615f3aa9171852c8f2666c655e30a65eae46668c20d6a5c32ac37fa3ec4f1541d7d23ee1dcb06373ffe45fff5b25238a819d5d5cd0f2b85839ad16a56a6c1120d07488d4b26f4dee87bd6d79256b41b2b85831f2f5b530242b3b135a3d5d7b8644296a7eae81b7def5f33aa5fe39209599ecadfe8fbee6b46f36b5c5f33a27999af19cd7cf835a398677dcda8f5ded78cc0efdee87b558dd5a1b1a1cbfe8c75c9589c18fb0aedab657158d6055a9d37faec7b365c5956d9afdad921c810fa6b469cfd3a8410fa8da6ad1d827cb7b343e8e737ba91aa276fc64638449423c42fa47aa1fa42dd0b712f445f68be10510775fb898a0c491e623bbeea875476c4a93f54edf8ea7ea8b3a38bfb21ce8e21fd216ac7af613c34ed1805c8f51feaf7e66e1ba5e64aaba36a1f228e23a2f4858854aad5137d1f51ab1512c9c8cc10b9d310d5d4d810bd5e483ed1eb857ed8a0212121234684e40bb95ec85f28e685582f34dffb23f58ff40bc9b6a3909c9a9aba2d7fd8f125edf83676acc171d1d8d15d767cc5ccd85126c68e2e5668c716cb8ea107daf1f3ecf8adeca88a02e4ce8f02e4d6310a90dbd9b133e372fed40a7130353575a71da300b96ec7ce8ceb3f1671d76d949adbf62567151ece067288b4fca3a6c501b99936af3ae3a2f9c21899b0685efa42ad1ba546c543868ab83b5f2801378aebd22143457dfd85fc467981dcf3b338eb5af19028dfa543a2cc4b874491b943a2aca2f49d16a761724894f0f647615d1f1285bb6e751a2687b4f52c1ecf1f2aea9e7fd28e5b3d7fad2b15ebf93fef6381cf1fc684df723dbf8b75655c5fc4dd992faab942ad6bf3fcafefd2fc5094796dbe68de9a2f725da104dc9ba12299fbfaa1a2d5fdf14351b87bf3457d810c0d158537e7878aeadde071bee87585fc723054c4ba4351fa72609b65f28bb82b3f477496c9df409c2c938f235296c9bf11552c930f44ac2c93ff43ec5826ff25722c936f237e2c935f237a2c934f23ae5826df25b6582665b29065312c9361590dcb6858e662d90ccb7eb0ecc5321b96e1b0ec866540582693c9e41fe5480f1372ffdeed3431a9e51bc23983e728a560c0e0524a67985edc9144c85dbe8141c71dff4aae3d8daf4c7142773db9f1c1040d82804193141b679820080f5fa12b0c81b460ba018e2ca42002cb97a7ef490b1ec29acb3730d2b863f8de02ead37d7e8143f8727707e38aeb5568eeffeeee5d25645dbe81a1e5bb7c03c30830aee4e18d58a65b232dfc5a829a34e16febe4ca37ea23d946bcda3edd6295cf2ca5145bca30d658630d319c485abac2694a521b6b7cf1784858efeb7aad2e1c855c1fffc6819b1c37459d86d1a0a2b6c9ec721cc7d9974b5e9d95d22f6c97e3922ec771744e773086b8febaaf03c6941b5ebe3de1c135f5d252382f68dcd5c1e3b8eec7ef7292e3b89ff5398ee37a8690e33a71725fb9cb3d395d8ee368cb10f29d3fbfb2ceec2b4668b8608b33dc88630d3568ac06d771c63a7248c89394216690a38c1c6e40e32949f594831194524abde843b545520c565ec82069f6fa820e1c247d4335e77400134c502851c40c5a7c71c6175f805f78c1e10b28585f6cf13a72704a785e90408a0432340e2d32d010410a945290c71566dcf9e11077beab7dfc0b227c68195c976f5e9c71bdcb372fbe78420ac76eba1de53f1c1829c549288f713606cef6850b13a52497a415189a9466fed37dff28843e6d8aef310e8a8a3714984f9fda18ea4f1ad33cf975454e8080a4754fe777d688fb496b5a28205d204518365afdf93523eebbafd688fb188c3a6b7337e8e8c1469b3fe9f7bffc6786e036b19bc6ce72e537dd50803ef714ea8602f3b99fcf491a1543d1d2a3ee0e0433ff691abfd76abad25bcffaa11456affa966130855a25d21100df7bcfc620f3a07bb498775b64cad4183057fe8cbaf23b29a7f959f333a69379b0be07be077af6a65fd536288fc997f972d361ae7c562b35532fb5952b9f8a43f441afbecccbd81862be3ed340999ff9191b43f732cf34efdb1669d7cfc4bceb194ca1fb995f52baf2412b57be4bbce1fe88e67a8f8a43fd29b45ef5fe4329ac9ef5fe4214a879ff7deb2950033ffcd57b124c21e6eb4b3085ee65fe8429f565beaf2f636fe6d734c1e031f931a2ed664aa62b9fc63ab9c4a72b7f46bce1b6dcae5c89a1f8f2d81091bc4242431188c00b0da5704381d5b77ed53f94c20d055a3180df7aa6c97cdb22f4e7c77cf75ecc339802f89d8c1823def41fd1ea7b138c00d3a6acbe4501ef57df600ae0b71e4ce1fbd5339842685bf6c69f05058a9f5845f6d84abc717b0277085faa787344638f198547b42b1a1e77db74da36eb22cbe55b1757ba8ba5db48b48f7bfcd35338d6cf5d45e5c30c1bbb87db3fc65c8e99c01c5d6e5d70b9457dfd87e46df907b80d3e80bbd28977fabb8890ef1c9a77e42f29344ce2118ab79d963cee30777ef75eabd639761df7d38efdddd3addf69b1e572df493ec27e39efb77a7e8ffb70a89171beea393b76bfb2372570af7aee55753e67b9fef6e1207b849d0deab877b0011c4e575f9c486de87ec5e39e134790b7dffbe46b01e6cea75a7cb91d5cbe6561c4f5fcfbaf7dc286f187734123a3fcf99d0dedd7306f5bbd9809d01185fd6c10f7fd23f7f47146faae7ece0651fbbd03973b94b8d831a583cb372e6170c1e299ce1ed6840e2a52c0c7d40d4580419b62dcf9e11477d2409bd38e6e9bcc2e78f966050a6ebd7cb3828e2cacb859010583f95344e25aa6e26499fb51c8372eac5c9e3c847e3fe5213bdc977471bab34b02c8206c7461bbbc0595bafe5e7710a10473478692ee74bb338c3bcdd808fbf93686157ffae43f44c490ea188b1106caf64529eafa184b1de33b5230d79f32f9cf849a61fca79f9ef82644c8382b17d2d7943da178485ba2ee8582faf91275d69b58e62fc3b0cc5f367de92b615bc907cbdccbe59b1857eed85fae7f13118ed500fce3fe3fecd3ef53c898ff58802b522c0cf3f7296401ee38c3b893ff502638e63f6bf8fa1fe6d8e8c11d3d68f001ccc5ed07128406216f71f98e33cc752bf0b8457d6794f907b80c1ea1775a4a65e784c7fd236d3321f7a88a278e7062234c0c629085c6615cfe99340b78dc3ecdd92a8ef5d6ef7848c7f1108ef210ea3cc49b87b4e4219265dc33276d10f7fe1cf7447ab657b997d58eb55eeebb8ee3289dd3bd79487dee6509dda59513eb735d3b2bd4dda07e9fe2e84f7474dbce213ce698dab09d868d308f7135ec867bbe95208e3bff86b346fa72cf37a82f973e910530dd7e28b5fef19bcd669381d66f42fbf0ad0aa5db33376ed3c6f092d03ee16ddac85177cab439dd91c1fc4c01a3b4f0ad0aa83b321eb79f132760071771027354112730c752c3f8cedaa7a5d2ed0fa3b2a824ca942b94999824a1436a46682441000923154040482c188d08049224c8f10314000f9db05654a0c9a45112e328848c2186104208000000110091191207001897fdd35b915f8a1febd55527610e0efaf606e4470a3ff45e2671f2ebde8b29b8a5f4259bb1258b70fe55afae2abc29bba51ab102c939f975af1b8b2702ee98e0f4d06f6f7c724af9a3773349ce7f7a1ffa93c25b28d988256edea481e4569e34bc7fa2607ce91d24aac551305c5c8f45e1a36f9d2718febf095037906076045fd7da3e59af13464eb2b94d83dafe80525edcb3a6874e7c095d6e9eefa0edeab548d439dbe5b7194b5a8c09b0ddf22e0daa1f158a8076a3184912312627c9ead1c9da80ad2d466a2d8c30a905faf2273e4ea6882a56a7d5fce1b7db614c4f99a3c3277dbd38ad1ff87b88175d44fcb021750b6d32a3f7de1637976863345ca320d22951a2a3355a7df03f09020e0085fb8e1420a04e9503890633fdfd6f438cd075f5a973a0f81eaaf43ca856ddc37ff8f16419ba0f1a4144ffa5e28b2beaa2965508772c020a5decdfd87c051c1ec0d54b288c2922468b932e665f34f066802ceda2d38e5e037df11ac3fa02ba694fde044e188de392a5a6eb6e537943b21eb4d10d190736e6f40fffa68b4f42cc0217b771a98b44a8190883fe702ec1692604106261683b5bf8742eef4d4c27ca97d666af029962dcd724fd37d8876d9c9b27e37816e667f883a87f37b5eeae65407f94d652d0f14ab434f081576265a554f63dead8b596ee854a0b2ce3e6021b372af0b9553c59f900085c00fa8c681a9938a4aa762fc4d7f7eadd6f43d328a116de46d01d3b127fce9d1962296c0028cc646d99295643c508a85ee6f014c393402c880751f041fa66d4d7c6f7847e753a2b386469c834b25560df1df80d52405135715376e9e6c7e6ca8016107cbfb25cf5917475176d6f3cf2b925839bfe76e09cc9d9a1b3610d4a8bee2e07d1dbe351ddde9b73bab1791a81dd89c1bdd1e9bd79e64398c966ba942ac370a61fccb25d74c80a2b100e2fcf5265d469846542939742e75ed9792da3a0a0f2e5ff6e823c98390e32a1f0f6ebd3f4b29dfc3ffed369e5c5a3c0f4f8f0974a4c8feae5805e200beec5aa6e7c12df9a28cc5ab9f7be078dd9f4d1cd5b5184a18edb4a89d86ba5daec14ea6e5dbaa3a596a75b4b1b26d4e2a7b74636948cad314667d772ab25e3a5e2ae279abcbe415ef94c35354f539d05acb2b4c9b5b5f79f05522ed19061ead297bf134b1dc52fe99e60f8ece0d3c5d23495534a4691613a2251e5f5dd4ab84423bec98d1373964493ebac5f906e559a3d67b13cfcf484a4534511565dfb5a4a082a0d190b141bb36d0f7318cd5d0d8ededa7565f3a9e35ba59e0e19711d37ffbc33b3eb69b7c579e43684ab816e7e91eb62fef5e074d13518a376871f32c157a92ddc1b9afac295764eafa13c17767d01e635b7780ff1d78ae1497971b92cb984b0fa90f438fda1ae6d2fb847ddd7bce4c917cbdbdbed5ce5bb4eec20e2240b06cccb18429754d5d1030cddaaef808d8e207105ac0b4abf1f1e48fe3647278b2573938702dcc4a7546c13c52710679292ba96e48c19142b617ce9bac0bea7f1f8bf0dc6139c0c90b17340b135dbbf1a51d7375332164afd8d53061345d151f6fb20db854b43ecfa608f2b6a6b081f3f29fbdf1650853190ca194b3a749cfd988786e7acee418f51447c6af83ba49f585b92716866af051de80b92cfa77bf368575ac61b77c8b08e1d8dce1b4ffdeb2a17d9560f5c0c7b05fa484fcc36c4dfadc6794e9d5595eef14d5408dedeec7028759070f6520e2e77b002f5c5b1b8b55ec8fc50ebd68480ae986a3a36575017760a4aa1252cf1330d68506bad151642dc90561bb2bd335b3da1f5f761f17d7f844d23db389b4ad6614a28d864f83f5b2365afc8ce2cdb57834aa87527c5161437a87e6ad4059eb8e0d1763cc64af732d5f2739e8c2c90f77cdaa157c0b19bd419baca7b639d5e5f99b64b30621b94c19ad3ddc260bf1250f9566c34977c3c793aeeec0d1183ac2ff4402fdb76742ce54f0a9d3acb75347a57091f7dd2c303f4900a57c17389152cecd765e4053b42d64d38f9f49beea6f87f7a30858be818d3f740553a027d2962cc8a73eb5808baf96599e924cc906de3b1701843b4ed145bc630ea10d386543caa914e9506b7a2747af03df702aa74d1f81ad76f106a820d7db6c8391a808e3425f9a1e59adb208853a31fea7dcef5aec39f32345a50bb6cec8a5b59207368e92f22133fad7cd3cdd090c05adf3e874b6fc2eee561b726b105fbadb89a1f52de8d38d86d99cbf9dae038c16ac8cacb228b6fa5b87c976c65ca836f9d786d1069ea88602574f52df2662eefabe8f9bd14eaed474f2ae21f90bae1e6e0bf3b8a3d473a823e3e9a50fdd1be71fc83f34e7140138d6375b49b7ad8972ec74e747b811a9f7b8086146f552eae316a2cc44b17fbf8fb22636d28007cd81acb4ade356b2b068b94080826597d1418e7ef09b6d762c5f5f2bbe2b7fc00d7dfd1d175b6754cbfdf675080174b67d70de00110f23bdddf59e5be742a2fed2f74c9c344248f965363019d02ea4a18575bb80930453c2770230b1c787288983d9313570173744a81bcd72c67584801bcde83097d8c37b321c2d59a8d5486551c0cf773597504325eb97b3a6b6b48886caacefa5a9c327e61672326e92473b5bc6e164255311715d575989371f5004c96a46d62d36aa820c268a4ae20319a6d166f8cba072ae9e3252a30a07c241e3423a98a344a0744c723954ee030a6b7f9fefff1f40f5f7eeff4af2b3e52edd95b4edbe5517ac8a9b590a975f900813eae8db63d8c951c20b0054ea07ae5ab59727f7be146b81b9d694bf02ea71cffdb71ed15c24d1461e4b8730b381a12326d5f99b79f51c99550cc493d92f7f4d320e2cec7c6560d3335db5942f723f6a4b36c69b510fd5171d56c4c177fc6e749c5d1cc245bdb75c80d6e9f0a06ddfe62068af05add26584dfa3ff51999fed5249166025730da834b5bd81355c4f9c9456813781530b50c83648ce17d866f79094116722e30e68ac08e926b164861d4ff1b2be96576919a2b94751c4cd3eabb888a5661c67e00c62c1d727033b5c55da1f869d46ac50e84beaea2da2c285e69ab9869aae2706211ea7101cd5f00ac159ff85cb4013ca9d512c14d95704a8ffb02d7efd142af857c63dabab23756cc3e5e3048f3adce16516030ebb600839d12ff05a35f62245309b69ee4fc35436828bb638835db655a1b3fd11030bd2b20d081242a2703958c33d40b5c575d688b73f2d87fee46dd831d3a8e5c9fa2e221932fcddcfba5b2753c083a0b050632f259d6991429d464e8170be313ef1788d5d78084977aa7276770c276dfd7b6cbfab470c11cf510d47a06bf2b4a21143df42c529bba2a9323b0163f535c84935e0db94278b78408677b2c5e9ca7c896c0ef398096bde9e902f8b69d03cc2d1c5b2a5ef8ca4cd6011aaf5be4faa53203989680cf9189f46f0cc05c3ff8dd49770abeb6f9b59caf93238054640aa28f600d684f2cf584cb986b6464fbe2dfe43b4fe127543872911d274a10f06fd9e28044b8a2015b8a7436c1bea0042b4984ff2df97d6cf9756f73358ca4de466599c3f9121fa88cd333efd91db1adea500f39fd6c66d66b3e0596340ee31c21a5db0d794e55b0c67ec1254905b7020b5519729a5645eb554164a982fc53c11b4593a9593db92a285c9afc77455656d37a05abadf7be527f037bfd8bf7657edf13100c2a4677f34ecfeb7281b7b2e8c4f85d9926cdabfdfad62d81bf11034a9a169a9a6b83a02753df01edc779859a68eda859daa93199d80135ab1a2de2962eac26883e9f205e53b6971a696df6c29ad546782f31165d19076b19a11d841fcd547199bef04d5a49b15c57e393de89350838aa3ad17f28b522daa0597cc94834e4c0b8a28483f674f19539b42739014f45d98d2b79c3da858790ab0a24ca617c3945e6a24039bb6d64e45702494f45312d5520e98979d6b47b3008380209c35ea4a3093df0b66afc81c3512a4ec8a4726d1b9d01ed103c09a37716755a7be18ddfa73e3a68786a26a743d4812b1821fb90184741df5002aae2b18b0bb96e8493a80f5232ce0824541cc90eee597d1e92e5a1d33e585c38c81ec0ad08bbbb149149f25fb569260ae7242464697690102fadb7c2f65071632be17c7f974b0f69fd068b3684984ed30f63d7e2fe2c6da0c36bb9274e772717976cb96eeb9c7022981f320c8ffcf921e90bbc9e5e421a0aefdddf9ae068da7a31c70bbfb042dfee7a71fa47b9a6d0ac1b8d4422ce07cb039959ca364e5edd74570aa546c97b8c5bb1adb8ddd8756314c404581a2e787131d8261c111bf74f3981c09451df4fa776371fa530d40d6c24d7add25e031033d1a42f819f677a0d84279096006fda8d1abb080f1cc6c587ff530f92886b93d2537b241b0085090c58a391e7e8e3e94e58417ca5d2b1632a7a96a250e00f740ad4002effe2e8a95f43357d2afc566064a5d8fc5e1558abc056abed1a67216b9332dfbd82b7a902bf539b55e3b38a522d57d70c5e58c3956bf95dfd0cb9210416faae58b990e17944a021a54c311b8637490a608540df575595744ac3b97d3e2d273cc2cf8b0970347f4f20595eab1cffe7a972685961d7c905a536df6fcc9974282c7d9c02bbe3ba19671c17442444f6425de1feaf77ce0b3aca8c045501d12892bbd6d33ca335331f8b5b1da1fd0061b0eaf89e83dcd7901a2ed50eaf79d35ac3d19aebead6a70a69072dd43055140a93d50572b3a38befedc1602a7f60860a3a9c7737f53aa038b1d832cefe0322df5affa1ea9b02103efdaeb32d53e953e0f2f6e67dc22166d9eed533fb3718b52773a6e191237b44c206a2a21b517212ce18eff0610e22bcf511b5db565de28c75684b423f8e5b5946daeb86c2d4b8108e67e7d91cd638bd3a7ee4bdeef6b21b1131d392a0b60477f71ee7c21a345d8e6c588f120c717c50ec6ba020e56d3083bb2876d3c02d4c93eba033d5fc53a95858780bb33a6bb8d29bba6c4e04baddc157252ca69e4e7a71324c5754b9019f52d7193208dfcb495425fddb414f1c647ffbcbae34d67f917d3c5a6fd11d8708b3ce0863981656bd748047ad944d246b5d0ec0cdbbbd619eefb996ebf3ee9db7fd15c47112cd7bb846bb3a963efac2818ad5f1f23e0378b9d843906d98aaf46bd9b65b2c6d088be2c7d6602853b8c0a376b5565604b428749fa89ce4bbdd41dee579f732f54b490757671b4c816e3e434d37a736a4ebee0e3b30fd1401692491080aa6a4c5050cc85d8a40d112dbfb5ba080c32a219f9679c1076c166e36812d2cba3332122593268009a4389cf64f7d09ebefd682c6d5b1ff05ae11cbea4b33c1088e5d33053e55e925fc0a5bdd08c0132ae16bc5dabd43c34014c5437e160d3a1dab8029b931ac7eaecf1c5661c7b5ef1a1626649fcff68cab6d7ab1f1bb85c91c854e87c3068e674525f9affc9746f7e457b491babab1e69492aa6fa7becdb98d1c290f9f1e1af171b6541d1bcf665f7905e2eab19362f3d60d6b1cee0d0448e174b80d8e5342629b44c9842d111470c4103de2d891c2062d96d040b0ce65b8d128276d55ab09e3d0e5987ac41aa1c763fd92d836cae071f50b7c1718d214bb9a4e2fa3ecc97ed70e98d665c686e97892b96a9a1810f796005ff37bc62b0ca499f639580ed4c61077d94c6d9d8b54e17c4c2ef36e352af2029e3d46b008f8126d0d32d7969920f14f5969a11bacf2a93636742fe26e1fc88aae6e7eddcb1bc99cbf427a1154038b3ce6aa20c282be7afc0b02fbbadc9c6e092590347715a01a71eb1a20630999be02e646661c4bc38f519aa2e170f8985670988148c102ced6eddc48ca3fde0ab281355cbe5d9bad492bcbad00d97cbe1a0fe270f686501d9f21bfaba2abc01b4230718d184589c5a5b7143c1620d1eaf466b957fa8ed28f55f0080c5915415ad4c8dedb0c2dd5bf8190deb9d64d7b75280bfa7313374f89a8166c8bfd8101e61b6dbfa47a70bc4fc996ee4d9694930fa7aa023145e8b4eee7852d88c9838092b491029419f2c51273e91b2a60157a87392c4ebc3dd60895a1cd0de36f46146433e818401913bca3c3fee4d806fe06ebf3b2798755c7c4a890dd7d84bd399e409d34902b4f08cbb6a7b31a66d2dc5407da12dd5b885f436903b5814e68b2ac7197d5eb4c64de080bad9e55ddc8489003b46e550a14ff69f85606215e6ea5d0edb5338384ec4c19a4a3c94790c66bc17a2d4966463c129549cdfd1163fb121fe6b8f3b41f0f30fd401e91bb9e865c0c6801667a1c43bcb0deafb413b77b019fc46168fc64566a3a11a50591ce0a840ea37dde2c6635acc626e01d87cac33e9d37dc5458fc0b88d9240b46c93d59e101631833407c1b5a0e5d709137647e938cd6ded6225df261a543e8e870dd36a31369e0cf76640456c84af86d3b5d123ad92dffb1b911d226e2cc6b177ac933ca0e1f8dca174aa33cfe5f0a57e21e1198c6f7a8c9458a81b8aaaa826ba767dfb5431c352525f79a7dd542cede5d1585da69b58153725e153cedc6715a5d2f9af11c51039e37999df857a2b50f5f2326a8f3631399857bd149ff8bb4e49f68385b916a29c015ca9092f953f9543b557a8f1320fedbf6b49488fa57239573e81bcd7f42f794fd98820a5ade3799ede1a07ca994ace442c26e3c2cc54b1b3b13a0abe62f8b2790bae50026e3304be5260f9df67c6a2623c7fd78c2910ecb1e818ddc0d94c16766410660531a2ef7a0a6f19048c70af3640a63203f71dff53b247858be428838836d08a9feb0f3501179d6a1e63251dde49935cef5a1376422d2dd1652ce68efd4378425416ba79dbc7dad6b511c4eda675840c5607c704099bd7b5c230341ccee67fabe792f61c5885e2f06c4fc0dcceec11123617b8441943767e4d0194868139e7117bbcdabe012a56f245e3630572dadac97f8e7a8d23cd7c38608f82ecce7481f1fa6e0cc3d4dea6b129a518a276f3b934b02be3f6bb930bec0625fca78a1de89737a89b0cc1dbdd1e1d9e2b6a62e2a1d7cd1112d634004aa7fe5858055ba48ae648bcb81c512f4306782f350f80ba6e060077f15eab06aeabb6651f6dc5f8248900bf5301a2bfe49fe94401c33735a8e8276d510306930c43fb1f3224ef0831841ac7b879ff24250bf801139ac076a3f72a2ded7a32ac812d04e3c0110d2867e410748cf0f7f292911e0f06adc2bd433dafa62eb6a93b0e628fce174fd60f9a70ea020c09c956245f199df6583ec696f1c7138294afa4d734bcd086838c246033b26e231b79fed9f7c4ba72a3ad38586629778a4eaf8f631c981072c569a2d9fecf82267b6edc389df952189f0789fefda15d21a1f12f200e855e558e8f4cd6786c18cb6ade4f82963248ac3d2d20ecd124be021a4df359027a4b28afa305449c6ad604caee4a978d71d430ee9beef52817c9561432db6a588a346b59e8162d47628131302efc538894e5d75ddb5e898f5998473bc972d5085832221b9a69011368ae6f80ba48c7b4f82999c48c8b57ddc88d1254ca1fd8bb442da3b4a009b68100268e8150f869056aa1e9ed1ae1d9a5921e2293de263303222dd3d51ba8971a660c70a34b2d6a39d895ed1f69bd64d742d454441cf63db61ca4d9235d11d080b04886f58bb59f09164ab05b937dfdce669d31f2bd59e36fc94507043cc73b89861ca257a20838d169bbde00d4cc4eae6332bccb57ae45e217dadadfc5f8f0a5120e32fe6fc2559060dc25f523c241554ae3662729ef192cd25355c1c6d0774aace5f510de73bc7a23bfdc4e92ee53fff5ef60a60628da21aebf4c4aeffec8b4b40f710945a929f7b0adc2a39026bd158cd9a67ae3cae6767cd6f3593f92222c603e616128cec95764fe0ea93f79c92460dd066d6b12fd4310ffd32b5da88fcf136c8042bc70bb0b56121a34913e2bb4eeee7371a612dbde9502541947060305869a8e2a46483fc3016b55b4d4955ac3bb4d9dbc17a8f7c183a6b42c5c31b55b1fe6669fb0cee89459a1b4b3e450a01f135fa875cdd9809c3e7e640eb67bce5502dbe590cd0f62bc8e155d1873ce5a49dcda43fa872f1b6fb2b15af369e679d3f55aeb8395c9baddfcef18290cd8c4d2f2b93dd4be91a159700eb9ac4c30df9f246d0af21c235438a3bfee3008de60652a51502fb4a5d254e2c10342336e3f7bd869ba5a2a50bb95e186bd6f6fab57b078773a564d964c6f4ed6678e54a8a5f72801d19dd69657fbb2438ac8625384852e7fa317f060a838c4c54a55184a172109670d15b3a2859b5997eb9c949bb657cb8cfda1cf33c94d3f2d1fcd36a7a22a9bf203961b08f0d2f3c9611109959d2519c4de8618dd884b1f4e421495b69fb7c75ed271380d14cf2398444e1a20e5ed738e53074d31b08b8152082be12f730a46d7a9d28fafe8c88f81a6e1c1114b42f32eb008257542a860be5a67d0f1a968faaa134a2b54285b34bb5f16b83569afc7714214a3402a4338a902ef739b1c0cb89d6070ce83226d3b8684774942ecb6d9255fff5d3000bd4aa57fca04a345665bf49355c8d52ab7d454a1804ed904992b928516d408973ee851572ec405f06d9b10891f6c23cbd7cad35d59d905e827acc38bf67b23c5d876737195b27e186a4df420b07bde5fa616fa386ce3d8208b11b7e23b7ebef2f6409f31bd798c7105c004fb3a373e0a4b6c33486fc24ceb9bbebc5faadc16411365b510291446c221431a3e24f2d89b169fb81d20a58d8b925492ea011564d7ebd8acaacaff4d0a96345d0295558badcd125919b7cccc5b6466905ee47fe14d2115213f4925fc59db1c4dc13b7192646059f363ee57ca6c69937d2cc1739a654584335e84ab60a9dbf2a08914e7d3dacef27d5237fd3e28ec956d2e528c9df98f60c3c4268cc75dbd252c988346f2ee30f3e57285bc68b10a977a0e737e60f1050c92efede35624d394311ebc52fb70f2eb1e9143a3e047c8926ca74035452ab849b2b37613f1279d864d9ca35a47492798f6dd5d7044293612235b57ea143a8d720dc2f9c827534f8a8e87a10bd87ca3696859386e8dca65c72c211490d3be747b70018e86acefc749d823237ef305ac656e31a2e7a54019f2307bdb49f58215026de8f565fbbfb7db7e1af7b18764fa5e03a51790bd2d78c67df666f0dbf4bbf3c6c9ca8558b10c76a015decfc1da4124414d2b10d35f56c591b330e232b3c0b705f029e5a809343fddc46f2bb28771b43e1f18a5e38ac22417f05552182c10038bfbb10aef300ca2f140432a6754eed55c2617a8686bd7ef78ccf77c29e9bd5bdb3b3380c02c6285c052c0a038f008a97dbd65f293b2f858b6206be64cbbed7e19ad6ac7fe0a399b588eb11f47e7ed1e9fa79bef1e1563234a23833094d55ce0c626e8e7ca5ea0db83f59c69c316b28cb743a0287fedc3c8218b60deb12ae1f2b6a97c5ef66ed768e40d9b28fecc2c9bb0a0ae493a4e4a3ab60a92aa3e9517f3160539ee3845468b9c263cabd3fdf706bd2df9cb12c6876e13b8196a15d6bef56bd6e6ec622c170a129637542dd9081894c369caf60b27a4df9f052a8ea75902577ed50b93d239b6c5a06643916d916e2f45fef4a9a27628e71b91c21a7aa4dd14932f9d59d164dfea4bbc1201bc77799d7aa26e68d49d431028df03269a10e5d89d6be2022cd29788eb873e1aff961fb0ff480293992d72516c9619351bc6de5ccd397dd674662b69e4ff35f175104c29fab04a58d31c30abb3a6e5d13ebbde9851e21b47d44b909e206281a465ac8a7845aeb56c614b5d5dd741b5393e61b83b14eba4166af07f8c3e54afc3112a331d94a6f4070620c696598361acc4304080975b42640c0c6cd0f2ba047207f295079bfc07cfbdf865b609d56da63c31f839039dd31da21120cc4a13436411fa70c4629d23942dd62a515e827c4a4c7721265361dc0e5afd9d44783fa60bc8dd1d397fbd7e83b881349eb188f320292c6c1b086647942a26c8923c51ab1d2d181fd629ae59f7bde20345f01f11359566e775cb3a953ea48f7a3facc31729d345eab18ad0c87b2e3751f80bc8315369ec37bd7ea8f8cb060d610a5afd9ab5f516f413890334cc07536cfd7d6abac7eaf2624e2de0788a2545fc710e1c92689d18c67ccf07c9a193b9c0d64d68a6ff4d2c912f1ea1a2e87086961a67988089218c9f7b4b4363dc5c6777b31ab530ee2a03eb175876714495c64a703f47ab4c0e76b7094b3edb7cb92dd174ccc8a86ad85e1d89c0fe406f283df48f9a11b203f3837d6e70afd606364ad5fe75f17ae0e6e8e3a4bd6498903bd894e3ac45a0f6b13af8aeea704b4190a3952c0b9693fd23c184dd94dbaff4cc3eaa6d27892589dd351bba0703c09f3325cf5948a53505433389f4f6532d28eb7a2cecc5d71b90f5a9923fdfa5793147936f5a87357af40ca3a336e036719f05359c9fbb03f5515f1afe77288eeb2cc53141ef810313a5e215230fd3f8d61a375d03f6e12cf02f38408035dc77caa6d9943fa502285630b4a2bde4606c73397898667246453236db0ce839f5f8deefa388858860a4d1a14c95873b2322e562b41a9adee44c50406d7798121dab8b2344c32a4983a0781188562f7b9f344914dd245b264505fe01925ca5718136046045178f2239c96aef8bd7ca24cec22307156a2b500a6c73dabce31b60af431f7098d7f1e51a474a7c6dc6a1d7930ed1108f7c7911548d6f0aa88917d4960456ae550d824ff4efe71e1c4e8f64df1255488e03611eea58487c818d49236051ab8400616adbd0745e4f8350f27ac4618f396f0709d553ef4aaf9b2f24b30fbe3e9b731e6ed8b7c5b0a5a5c3bbb0cf049a212db8f818579e170ef1127c33091a1684b86425b70786b5ae586f2d94a51ab9f172154e1ba17b0d5c195f26dacda4f2dddd86e0a02a18ace11c4219e8ac0e49616465ae434a424c1186c65dc5766158d74359e8127b4d798dc46a08587d1314ff58efe21e6ae227d7ee1aee2320b457a27efc109d6c0ac42f859c729dcfdaa1fdccf5463ced72dec1efa94aa38d8c2f37ce5b8e027a0ae72f154c4fcf7f2332e6ec2fab8afb15330970ccb6c7466dd3d5c3b54f2218ba0017d372e8c96c30662818397eba54fa5c1095794f6844fa744d2f1c4d48144c852cb7feeacaf2e098e5adec090f7200ca15dfabfef2f79745097abba58045b313f0a043bac94873ddf1f4386e52cce853297b5d46df52429af9f7156eeaf36acb03734ffc16908bf080c04f40eec3158364161f5bbb2d32b3ed55fda4551c9740b7ab8a07b711cc86f5f61c6e8dd96052002347a24aba73d74fc8d42013b6c8ed77326b572c091726ea402d2ca58949d5a7b8358f89d17470790392793869f500af6da458620dd0b8815e55e9908eb2c61b57a4a88aa454f7012f2391676581d21143956903c3d96c29eaf2ef6742cf60ea29b65417908e6dfd1a5a996a03a1d541b7138e61aed5af14b6c54b483a7f48bfe6f328ee90114c3ff12d3f8deebff0438c69b45b5f86d6f93844499daa10d595a8034baa44112698b9c0620b59e793d079e47163c8040a589adbd733ddbcc1d1cde2d8e933ce3e85ef9bb4541b88605a3c2a1e2959b799db673ce281272d99913b2d8afb699c378c1af9ebb65605571cd482efb4500f3bce749199fe4158a08503d0dfe8ef5b5bdb56d85a2f532c8c9d66a8bb6bf01dc3934e19b4e9cc0f8e8a0109ecb5bae86954c049408f32f37bc0621e7377f9504f4fd80c36eb8e305727b12d202305f11e3287e7a524b90cdb858a00f1fb4f3c845baf8de8fb339f0622e0623bb31f3d43cfa84e8f9ee210d06f1f82b0517451f868ffe02c3265c4fe8048248be0c61c4473b6c6ad8043a2770c1b6c31941746c419150c39d9efe3388b7c7a31bf8b158eebccd6da19d04267db5cc714203e7f6f1f2304834da6589b8824c123ef2814dd7d46749b2ab685a18f014326382f7863d0d72856911b68d85e3ec3121f6fd491f70af20a18c5217b02b3ea3428237c0ab29cb2711f8edc717d7f267f4d11f0a81122f5b4b98be91239ad31026b7283f91301d24c9a6dd7c79c17f2cf0df12a6211fc6eb3f7b69c98230c9917d513be77c2aa1c0798f86c1e84f9c788ac88c5b4858cbbfa0789219d2e8a7f363ea22ce70178a779ffce6ec524a22ddfff3c54250529382056878163b825f770effb2f47721fc9d1657e1b2085709ab061b3a46ccec1bcb32c4ba9be61b8d73848d19ce6f0bd70d9aa3e382a8ae060a51a44b5ca88cc48544126f4fb4633bc0f946f15158241add68d5dd69d08d10952a32c2d80750f30a11bcec57bd7db3080c0cd68746b9670cc40c40fa6fcc97f0c716caeb8af29712eaa8c24c826f13b49acd7e0922e6f025da6cb28deca6c40da5f6249effef7059b271d46d9f388dfc19be5d099ee4765f13fadd8c1e378172b99147680a713aa160e79ef2a57a03ea462a51ca00993a4751e7b4c4e0db3c2fb8d5c7c508d73af3b4cbe1775bc8a9f45aad3d6abb982214d38df556b872865a5524711c55bd04bb324bf1dc7e2e676cccdc51963478874cf3856182da88ab829c32c24a29978e86ae30e87554e9c302e62b0274b04840032bcbd3f512da9e038b69640de180220813ebfe99c3928f3689ed502eb1f19b8c3fe34ae54858ccd4181bd02c367796eca3edb18410e5aee094253c64b70440329c3fa5603a53868bcf422cdb434a041e1c645eb15306042ca825deeeb0fbe1cb688f25b6bbfce51f140bce99f01db402acfc49dd3e63733fc521ceb1c0b01278668631fb788692342ee8f6ec01078e1256dfa3ace7a0f394cc8d04967af489a75254958207910ca019d186afb9851bc075268dc78857a2b061f683261f5137ac9effa45087ef2ceeb83f443ef47895ee83360d929d5d4abcd05de8208fc43b157eb6ea4a756e7cfe2f61d19ec90e7da22977a03da06f838c7f2a7d89d699a7b75c5e8ad9ef4d5b5a224e2287f056a423f476e00721b75ba3d689206953a3a2074576a3469d0b88dcb64e0d1782d46a6d54085c504fdbc12786a8ff0e04795b15b51e289116d7fcafd7c92af98701831fc4c1117c44b4e93ba0fa7ab1c4aac61e4298f2aaa50190eebe39117dbf4d31e1661b08d9479c7b4751dfacef70c4056e55c6ec2e08dab80a84137703c677477a4af0e84fd893671dd5c7d48c9fb2774b3a15e1740635404e7dab2b7cb6f33245e7c0a8416092626d8a02d792b029b882b0fef0bae832d6e0bdcc2b131f892c0f09d72815d3aa335f284b6feeff47d9740988b7a2f3c5e6ebaec66afc2e3f2752caa911baaae079479cf8c805a4e944b56730ff9025564ac66522840e7b99eb135a097f9a083238bcdf7936f2dc8a2638ced0d7fe0dcc295396f41543201996cb12eafc28641b2c0d824a042c0a84fd8b5bf4be873f5465ead0dafe596821abbba74ce525fa9a39b76dbc3dac649c318dffdab00d11bb538b88761d5ea1b6d023406d4cb3f7a4ff06070dd520032709a62dde07c6cda0068eb4647d3f832b1d35441f92827d8d9e5063304834c305c341a58dc05f523a2a8f063ac10d94b591f832b271062a509690c22a1ec7712e1568141f080c04aab11f685d0c10759afbf234ce0dce1cdf85ac9037d9136a3d7759b1c5e813f492dcad1a862a93742be73424d7f0dba1875aace73c15f337291a74c6143ac0735e54c1f1170a3181ca5e83edfdb0ce1de6b65dd74189b49eabe2f2d2928da724204d7255d637d4f0d19ae36bbeee011905da613d683b2deb1d10a92508666d2eca4416349db0a6461a5ed4f6bb19cd3f68f2ef4120c50a91ef92ee53c75b13787749ed3dd60151933bdef6d7c5fe2911db6351f4ae9f1a855a71da9209ad604b5bc5300f33b78ccb58a3692f02e52cb33b5dfff698c563bd7e72e94d4fbd0d93ed0281bc044f3b35095716adc0cfdf3a025345ddcf4e25577f9abf99c196f6a788b9fcc51c7ee15fcefcd539f9db6423dad58e9a2f8634cb9055b6cc037a4cb7ba68240cfe74dec57cd65883e1e77515748310b862e9325c542cf52e799a9b8bb41c4289677cdd6fef7c0179d1640c04ab3db9bb0258a96cdd0f3a799de04256ae3ff7717cb7dccd67a32336e599cbf6ae310005814ddcc15e919bba79f9e8102591711307978f8d52df866ab71c4fd6d846a92843b0b431644e6a96e0be51b3d83dc3913776ea398e3ea7478aab63868bc8e15798011149694aba9e4e374961c8c96b7fb485f4ce7bf5ba35a1894d59379117d362ce65c42e00539425eb2ef85bd7bc011b89c87c18152ca2a5beaf4679b153cddb0132c40099177472a782d4ea32076d33f9deb9bb3b61a9d586095d3504abb77dee2a606e30da570dcdee5be3dcce8b86eaf1fcc986e1a2d6796c9d8f7636121a613158ac62270ca954c21ec581acb6d42b0850b437755ea13e1bfdcb89bf1988956884493c4f236e77ac093fd13b974c6151f967bacfaa1f94d311463fc33c24c9a3db509f3d6d760b18372907e29f2ce2125c66127c96d8aff1be1144d94b0c27433dfe85d99ba9e7e32988d0ca1ea2158fcdde72678b815480951479bd442710e8c6605543efe465c9ef581a5d95a7ea2a3d12b9a976e5348aa321292195e9eb552e82892e70eaefb63f8136c231701cd76a3a6e04d7d9fcdb6cb723bcea60a07dc1033d5f354235930e07573a604e5244abe07b321a0e1eb83a2217799be36d7f477fd3f4d16e54aa55fe36f379403311c209a77101e80ebbdf9029006ef9662bd8a32789141991777774e73047e5c4791080a94e72d8c9f0e81850a7ce64d3f674c372243daa9dcebf7c49037e345b180a5fc66f10eb5783365bafab8d28db8df95931e89dff09582aa02c48eeab012d87ff8c37e77ea3568558121133d69c804dc5c4ed292b429028fa2b5c483051a62d6aa112a9e7caea74612cab37cfa7c096ca5b168675e93db009b961c915053c8e156bcc648024173044bb3f21c3a72003e215fad8f6b534b07a125f0b1a1cceeac16bc9ceaa1c303e5b0ed3d8b4c32ecd095d38f9141e343459d2450f25f79cdcd1db1825d5e78f7dc763b75fe5c8059338868b0887b9c7f198e977a4dec6585b72753facca502d279d268a145b821fc4890f3b4965a80fea6631b7fc473d9605c7913865948984687293c53cfd547695b1aa84483b71c814d2066ab578c18ecb664f1669dc88af8562db15d6c8337407d322b4f028afe34f83d0fcf8161c4de0d70ab36c6104858ab93535d85871fe32662dc80e6e8448bb6d5992e99b2c7b3be5000ea7c5e1f25d21fa45faa30236f12ab6a412facd8a23c39291dfaaac720d9a34b04d489cc06893a12b5eb6e8fa3563fcfe5c7c5572b7090966a33c0a5d27d76a8e0c1ea50041930d31995976f85ec3c995ac242fd6f7043f94ffbc961e1638abc89efb0e8a99d7e2d5f8b6cbbcb023e6f794f7ec946746bcc176c0fadd2706c4f8a011942ebf8645aa2159d3501a95a06c470bfc35cf7b67c00328de4144d3315de08418711cf5d291e61395fbc37cc4aa3d3a6e379386e0323d44ddb4764406d75909a7965a71f9f9ad625d43f96769ea3c3be6a42f83824039c7ac47359718e07409cf1807aab304f381cc022c1dde8ccb95681c8d6da4d176664d79b18f9692405b58eeec58524986551330fcfbba6fdd2177d6d485db5be4966bb08d793e906fa5e24c4d724610eb6837a0bc678c3cbba16a94f1c7dd75908459e1653d2a4a94c2deeb7ec440adcd5617696725b5f69940889c0531b588a4631cd8fcf9a45e50a20364ba8740470325c0ed3569305e9af419cd01dea608ebc3fc90df2b7820f0d285fe9d8e37c5d7e69f5a76068c49cc9b17423c307091a446f3317e4675600e610546f38c1c01bc2cb2f0f3cad273c10c908b03269ea22df9d41c1918674183600e390aa143c2b62e7aa2484a72a7e7c31ed2d8ca1821fc7b37fbfca8b08b10fcb50e7d17912c11905fd3dd04a7da161a5489941f4c23d377dc5dfa8f3e0d729830be6c5079f17392c787e7e71067f152f8a7baa757276e0c56d8d51da553a253a7b132669018fbb922fc49fc26f5b75c6267d998946ebcd349a123e51f05b36b9af74a832fb0c217b2ef32492ebdc8e7e0ce7318de8d380bc3b725d57448b853d68404204ffc9c38e6fc07a8f4f70e823a0817d24b43410844fba8efd80e81d4a49ef638622a6b8b314590291d048cc003a80fd976a46b940d1547174bb2eb1bd701175f39ec8d6397e0740c80551384f3ee7c302cd496e55f26e612a59b571097cfa7fd0638645f76e1f51ba400950797614fef95801e8cea9503b983cde9beaa2074e0006c5ab206c6a42db94ecb522134fcbf5a8dec925fa5a2890dedd427d484cd9ca65fdee2aa9310c3ae911da4cec5f687009490c54962aaa954485a265d79674bd3e41fa708725a3844582a18d84df11f6045f320f2b20afa0ab184b72fc999890fc6f250539faa5df0718f2df6888517847a5a1622fd61fb5b7f243ab841d5cde90e7f4cc6b896674c8bc2b52b81e4681239503c9c7b9e3990a9c47207ad1d4e35cd0a5d161ad539802b6babe2add9f0c6b40882171fb7fbd716a845bca85135a0a4fa9034c02eeca40cedda884d2c1499e7eaeca4fe6b6ca0f3260450c531f78f94ca2e77aea7ca1786d849e2d1a6860a97a891e1cbf628bccdef0ba96b04908bb7925ec78c18a31ca5030751ca32410ff67af724c9bb89876280cc25d43ec1be1775d9d86f561c4a742fb80afb5830bf2cc81c0282348f38b86aab2c4bc01539c67f1fff315f20ff9170a087411b4ace2141b1170bd3991766713744131090c4008258d5e5b1a28b79df3b74ca00b8680db1415582282c188a2ef8a5c3e60a0214333fc88c06439122502b392eb89cf05808056fb832ffb77c41ade9563b8cf48ead08c70be9c168692978781d2416d5bad28c9060b9ef400a0e595a0966cc23d13d612bd67ef80f51077b2bc3ba4478d06613a37f639184f4e911c72c6572cd370d9e9c4edecab1739d9e99629a20f8112e99c327a909322eb8b580c95ac0118ca59688bbda87a9d4fe20d4b18c5c74f0c430434d8b1f4dfef2086b509e2756c6b70c92f78c7258f2f0b7b1eaf4dcf47ca226edb46a4eb643b7ff67feaf7f018fbc844019c1b81440368f432a65a4f2d89ee8ec3965b00d01ca3c0ef736cf654abb6e210246ece94873ff1dd37c92566720c94ce78eb72e68eb6abb88064e834c3669945c066d0e68c6ce1ff47438d27ec3e1a1750e045526ba2dc5ab4ac34926d5772bd7dac4db19e4bbaa593dad56d540bd606d41dbf3f6c285c036ca8ecad5f5028a15f575aa64ce56e534a30e1ac7c8b7659957f46e5149121e24eabd13f6f53085313155f3781b5aa829dbbe35ace5443058e1c30c635c401233cc10bb2991759f6754c18cfaa62529955a727eb43d5407fa6c1b343c1fe86e96526a926dd56a7709ec81db783191c38f56787de29dc6922a07d8745d9fd60602eaacaa4a74d9492d9a525e5fb3ca288fbf921db18f1e453179ca899e813ff5d80bbda0e57dd3744ac00a0e1ef0461945a46d1e8be3a7295fed6bce24210430a2e644a0c19d4c61ff23fd833564cbea19c592051f83e97a76fe4c5572b0891423d8dc9be468bf3178d4d53ee0ff57313822c9d992c45e105db957f14ad70194ac9939a64c8e7466f113e77e43f9bdd295e1046938fa93afd3dc6ea8584a4a17d871fbe9a2ec19dcbadfd6846269fe4e02b59a5a4adb80837080f4dfa03267888e2301bacc541f4400d2d1322865c2dfad9ee7133d7f0ef081a6b81c3d94ed49713c14a4c77705d42daffc8a9da098a5d824e714df73c93d2ad3d372862d4dd46117042dc3833534f08fe2ca902141772c99679cabd1c3ea19631d00b0015d4a1365e8edba3c03c2fb7f5b9a2d1542c4db72129e0bbe9dd70cbff1cf49630e09c386d788a98d393c83c3f1965ca83ab6d041f04639d80a25b9f87129e3c0325c7888f41604683ed90bae42606f72c9a42372c66f308f0aa29f0a9d7066951ae77314685182db747607ba1cb6edb9d580cbdf8e388f037c59eab9a906ddda6df7f689912d6c7efe2b1e7657c7a5d9edab67eadff234ed2ffaa4b7d482ecb0d6fe0c9ac6d3b41d285fceed73b402fc9450462c619b9fb481c1aaff552191f23a29654d050e56e89a051612822bf0b4925d9e3616b1831478d8d91daebd6fbf5e6894833d2604c76d19f2b649375998c8253cbb4df5139ccf3e590e549c2ebf7242cb13487308d1ece1ff0b40b3f9415b5d92bca652425eac76c7e2a9b17e07dfb70feba5f289bf7752adcede1a4d844e07ae600b5ace9dd6ccb0974b43b2a2ed88407a951c6eb8cddf001d3d5aa895a9d9c8913022a3ea08096b74e0c7db29adf5e85408da341a13ae2e73a576310e9666c2d86b3480bea909aa3d009da95aaa06b7103009893a058026b66876d80071d1248f698a843e005b690e58ef3602030c1d8993d995ed26f69a68db4be98e8f6a312e13522520462e293d68edfa5e29538b98009f021d626a3b5323f81823725a965f046ac11d8170f69f4a5049189731400b14cdb45028e4d56f8c2be9bc2ad4a98a26d7073b5e577abe85e75ed260a13add5d007963f3d501284d002aadbd23086486a6f227ca25a581ca7e20df6f924912585e9b6a5028e3077ce3a98cd95dc76de8d26e2401ec5032edc8b32c80e5f4e012ab51d0a4719517543aa5c0f39d1a0b4eea470a1f23913ddd7f4dc9d63c46b649cef7e159e6eb497af63206f24ae0a9810629af6648dbb293ab2ede093f546e940c23c0d9f784b82ef2716c7b0147b1894bdd1840fade7c0d609b315b41949a19af793422d839f5289036408aee437c47506681198ca74dcc5b027bfba1be0dbb0dbb9101208e9c8897783f0c5c67fcdb75fe22fbcacbbc8583e842352cb832e76444b78106b58d2afa4603507eba7b02d91769e212fd873b0b66b79692940bbcd4ec64ff0e6348f05c271d2c55a3c55ab2e9b9505eb60d488e61a0acf17d2792abbdf5e60bde559c432fab34d76d6ea8a966aeda6d78320ee13e4ad77052dce669e066b4a2d74caf2dd587b0909fa7ca4871aa96b20f1a9e3ada835b63f34200c8178e6ccef1bb622c1a6f34b5993f690915e3c17109f4b45ddf16a83df991a72005e698369c8926011696c0f87b0009f49631f99d5d313083b982492b2e3849712c5d0361758c3423ef69866a03d6d983698cf2ecb748d4f6c9935ac03ccde00b9b60015ff13a523cd7156f9d50376de31eb14b190d8e4e9e2c6f3050d533d2eb02091192a9aaf77bbb8678b9390a9c7d48b9b4573c5b1c84ef32f96ce522e8a65153735535f263f9223f1b8d0ba8c74d0d7ca265d0914a9838479ed7ebcee122173f380ad2260fb10d588a19bc74c7419d65e335c5096b1e628a6598525747be1a7c4be989d2e01f8420b8d0b2f72fb6725720600cca8e0d8238146ef8aba4d4d98df47bce23b5465bbe151248cc7b784d4acf47e5375fe76125a2391ae8088f01975ec4c487ff715c6a810b7825e9929216487d05a37802631d697f529a8d7cb06d285089aeb69b1189012e6f50d05034a037987b08b9888657aa5919fec5ce1886100f26654655c1c0e8eea108b4eba41ae6ae8287fd8e816e5d447a17359403a5bff25d7458e2d1ecbbd02109697698cbdaa485794231509b6d8fef46d9f22aa4fa42b978f969465f88e5f36817ecd63fc065560379b3a004eac82bcf37430556ae67c93105b94dac888489c4a8646e5ed02a66158b891201d7926bf9cf7fcd1f218770407d55ecb9dc0e220dd025eb046aac4362232962586689ec559b25e4c88b6e25e64ac41c8b7e02bc5265b9cf26c59dac39afc522caa2634521070743c4740492612a0d156951b6a11b060fdd247cb35df660fcd6c74394a0c9b262b7923f4c1f237fef190c65f601211e5cb2b8ab3edc3dd498238efe1680185bd093c8aa5d766450a469dea708f0743169cb359cc0724a434d8a2533073fb09b04812c0335a7c6820c80df6a58053264da9ec7f92fd29cfbf2e96b7bb9bd5cb93c26586e8ca6c565fcdaaeb715012424f606bedd45ea26d204a96cb6a568384723aa85e4453c712f59389a691d6f96fad9ec881d85710f45420ce6bca1cc0bfb328efaf731166674c9b048611ef0221ace41600e41ead131f019abbdc7d665218ca8383421e51a166aa9d6a5e0076b2261c8cbd3022ad893bfc8afc55b3ae87e82fd9b529743a845fa36cc728dc51f82b0c823e0e612f8869da4b1fb0f30359790442d6dc34d604d2822343bf4c70b59106267e712e2c522f4a6372d80d7d18cb1081b1517ccea25ee26d7a9bd54d920df084b81edff692e398d68a8f0c73040a01246859e3858011c49bf91130bf5279573dd15e8f504a56d5fd1d216058fab258fdc5dcd3fea8d4e55d380634a7e207ba990e373c718b97e2b985e385757b440b993c3fcaa035b104bf02d4b7977fe5879762b97b0af5fd13e1818417d0b8735b73ce876e062f9c637a2f41c93f9c2687f75687d33867bded8a95934c56aa75c88dd4961042682e1e251cd3549578ff13457458a9dc7c632ba516fc0f930d2f1e0bc622b7f27eb5a044c63fb324eff17faff77d433b866f5ea96447501ad71ff062bb725ffab1f4c84099c925617e01ae71bfa25de831f48cd7a1d388f60fb8b10737b0b66da4eed58f3404b1c2755b1e2ce31a0788d54d8023e0720faaf964feb4c3dc5bf60f0173b8291a9cde3153808019e64a6e0a609a08952929a555a72bbb365cb8b17084c4a8b2ac4d5c29ad104b423d4789e83c97983b916b412889fcf18861d70e687c04991e80f544010b27e7c153a1c73636a5b8ea79ca65598d961a194dc6d1eca4d52e65fa01ef40fdee807756e7d5443c489a8b8180832a4c4e397297928d1b1004d9a43f67bfdad88d91c3d7fd93d713205f38bdaff0612ae97613f6d01de9ed2eef356868138c7628eb622c1e057dcbea60829e643f0f8e623f8a016a25576d68e981fb5f431718e5fe40100f7e4f8ab9bec718d66ce0f0a00db619468188c7d47d4ba2c4380f298f6576b313c03649b57888700c4ce42e09e6b59e1cc9809d4557f52f6c8d2427a9ee509aacc3f2c4c4cc0884561ae640dc8153901b4b415b03bf20d8bd06c18fc7fad14352d140a0069e6307472434a71050d896676ed17d3e67bd7dd91185561e92f6d32a7c37ffb251a99d22a9310c5779e56a950f86e1f701bdadbef742dd2f7be5a2b60dfaec04772cd502a3489594fcfa44b396a3b34da209fb7983ce51c87f6cef1a0130a0660838d7c355822c7eb53731a05f970f9c3de624a2a3c04ed25f4bd27039f27fc5cfca333e6b78bad66d5f7cd2cdc39cfb52a01890a2c309071a99d45742175f4ae36e8897f23b9f051ffc1526782e138c917a9fc390e7f0aef4bbaaec2ca74082805488ad893c8f194f4cb93397ea9b43f67f19ef2fbfe98642ab59d9c9ca72813473cd239079a273af4b9a89db3669784eb3b28614875ee8f15e89858c1ba69f7e7d79654dfe185b557133bf1f388c3d44f40733ad1005f745ca64e6260d4842492014932dd2553f50fd8d377e7434de396b70657bfb85ee11db33f2c181c363d3dcb7bb282da9abfa4d6c5c4ed18dbd90ccda085917512511a7ca43a1dc224b39efb330e462bf61a261513ad6f24d29524d6ace7886f6fd47e528d57199c9f0da2fea4023e1ed408cc8545220a9c8bfc2b8328083cd72787b4b2ef101a64e020aebb60db37fef16e2e182db4b1b29b6f426b3f1023c134e4e657053b5b858ffd403ca331ea428446b38ee651fa41ae83bddadc5ad5a32908ebed14db5c14ceeda9cd0d9e0a4da975bad5b7eb011097562e009163f67684ed80fd5dec0a5834ab0505baf31fce84a075cece0413a8b4e584c357d4e466abfbfc30ba3d551f4f049e5d0b1c582b09e7c0bf7216bbd2e566536e5ed57ca52cec3c6a6e4e97da8be4dd71b7583f56e1b0fbca58cfa7fc7cd11085b0e14c6674ad1c4004c00bb3e4af8002988d3df5bd8c59aaaa5f4eb73a5f9523ee5e8fe0e0740fb27989ae2d9873a8982a697206571db4de5df60925bd5088ca32e39d4e53c9c7672507c4c1b2f7fc1a3127c73bf777814a0780315f687b2e79cf1085fbe735494d1573fa2c168e71cfad0b6fb143d2c21a39cd7e45cc7b88068a863a75689a8001c617cea6e903f7276659a99421a7ed74c4b7e21ed63d96275f7633b65be80939f9e3a1f446367fc1c08caf845291605cb2deb8bfa4a35c340e99fdf0961803177cd30bcfe33ce364d0c052e5e3374fe308c4196ac002900046c4d6b0f493dd14c6106a8cb0355ad4335e0eb7f8d8cc83b2844e52976d7f78301ee83869525a911011635bb2b695360fe6d5bb04b28bc57233c0a9975e809998672328eac9578cedffc3a2df8d21c61e5087e45948ce19ac55f241c8b50d35b7c629f8166081b044bc6b9913abd242e3359044ac73e5f47b641377dd94f05aa666e219210bb4ed710a7845fe70c2c0335ac3182b8c83a743c920b6295d0748795944709bbc53c99ebc4ea6631b45befbb4020f8ea97bebe0ab4c558a886e9aa634a4c18ea942eef55bb0a6594322e1c3cc8a82ce17205d1f2172c3f5ca18ef8066090674292d8dda1d58a0b9fee2075651ca21335b5866f35a5937ed4dd0403c966ae2f57bd9210bb9aa8b3f3d926aea1e098e0a9b6a3f5f433192e2145870185550aaef8b8e1f89634408803b4d9befda99358409202b93ea02b642db4cb8ed1202777b427c6368ec7f03008e1b348fb684ffc28b746375ec359838eeb3cbb120b5068bf069da98834346ef8d79d9b23da02f5cde66d030c0211989e866179d83d8b23df3b74a1e9ad14acad6182d955b1075b77ed16893a22698b5e0ebe39ff26986dd5e4091320d67227ec9488649de6fe8160500d0a54bb0350006a81514c13030d0f724e760671074a8bdf9c2faa3593ed278c4c27c9d03bbbab3612bc2e6b5930c611c16c3bcfdad757dc0713995eb44c8ec843644139235aac2d14d0870eb151b300eb481f143fe181b9102c1a4c5121b654756be79e9b199bbfc2d885eb179c39d8b9c4b70adc1618db83727356a5418fae013ac29761fa48be22c8eed8fd4ae4787a382e020a1b8b6ffd56d488580ecbb76fe9fd46fe4e8f0a628fad7d05c16807d2091650f513702ed8e1229b81e54b2fa03019e234c48f4460ecc960ff2b9341fc87608ca597fb97cd5c60cf389f173ae2cd31037c31072a29d2be60046ab1f7c6b23cef964de7d2103a8c96a6ca8d3c4ad8df8b2fe15ad2183503d23f834aa7440c955309280466266c8ba8908e44321944f67e82a2fb10edb81d38fd95c3658e901f186014d2e9d5e3113940d801416d4d31bcfb19ef6a761a9e9f99cd4a1e7e1d37feb83d2b946d69ab42f2e6112a3cdd322cc42fddc5640e152f14cf2e9d88c17607219bf551cc3cfa9351f01a8e9c6678e585ba6765f457b7ead533621a03254e296bf9cae8d9ab3901c80a6046887209b60fe4cc9f1b018acfdbd8fe20a3c17e9d769722cadceeabaa7ed52509c16d3889c9abc80b835c633e9eec167994548f725133070528e7cfaed047c2e149cc1dc880255bba4bc3ae96161328f321cf99f2d384a8f3418418c2824c054540b58d45ca946170c5b004355ba6f12a9babe92ca6ded9acd31f1d1dc97f7ff45b7a47901fe724d4aa885c9745f409d3ad6e153160d34fa24f0e89e2d12e42481bb27785ec9db9878ccb1429843ca18168f25ef7714afddfcf566e5154298bafbbcaad044f8dd01835f52cbe5c209c8ba10aa0b9b412ea681c7fcddbb0556cf5534501b636a62e2702d5b2bc67866dcb0e19cf1e1c0e55f5dcc61f6b0d386b62e4f6cdd1ccdde35a72613323ec49098660dd0513cabd170d562ac0ddc96ab6fd27270a33eb95e6ca4f38c653820f03b4bbd79139d8425d509d6e0ca4b0b32d04d6c87fd0fb869fff16e32b22b94ab436e07d7b5de8ff33713c9b0d38a12b46b9b2c2440002e80ab355055fe6bc1cccff135b5ee319659ec3991bf1104d9e74f5399d21677cd6900e8c5e2f1743af5a0cf913b2cceff8a06c499bbb7f6cd377df36ebb00d97770e8b8d3d318d8c33f3f22f00e0687fec57c3660e0e41884dd52507188311201b1d5c3f0a9e10083838fd79701d767e378b93b327bae0c4943b54356f589eec3c8630936bb09c01c287be20c05a0d7601a2f8cace50bf1faee20b90edb4a15712332bff15127c5b07d7269dc7823cf216095bbfc8af8763fa2e197f6c6afa85c2992feb24384c6b129a2fc54c0d4d21764700e7105c4f67f84408300e75d91c5006969cdcda39a85c2ede4b3756e0b91e72de4b77a8cc517f7828c71fd386021d13866d10fb4af81be9b0cb52b1b4d944ebdae0860c224436e892d9ec4013f09797ffba5f9055024ec08bc57c8bc4a1d0c7aedf6277297841c3d32ad3e88645e17e0f41b622ffd42a198be86352cd23eea8313511a38a97f9924302ad6f102286a6a20eaa1d6330b78f9af11460c59a14ec924874ae5b8b199c6587c418f230040c4d166425162a571c612cc0adf4d0c594c4267dccfa048028b7cf5b88cf5f9c474dee5895e5bb1c0c31dde09ce6b9d9fbc4fd39d6ab0f29c6aca01264af7f652ccc29831a98c5b6cfe0458776126ce1f36703341b2af10ded95bd8e551f70fd8a22599f7132419fc8d5e83351a84fc3f3d1e351390033144bdb3422718081ae2d1c4a35af5d8294ed155b7ac062de55551c297d8e392db04e41f13e7424b7545f921ff120d1baec5bf9f98206d3311d5dddcf8c1916255d40dbd9f1b03c0fc29db7560ac62a41bf7d8435cd1a145dbb669221738d98a08d38a02f63e4754b2cda61afe65c1ec133c6388d16cc7c13060b24ec7d97519355d0ee1e05a7334b321df53630594b9cce505b6a5ebb3f3e0da74ef5b9681a59404646e879c652b3a96426e5de17bd0a9bc176ee8b380d1d1fb1619126914ed547e1242e12713db2016ff8661ff5558d96ccf6018dbb66543f0b121d30fd7f045dccae947a71a3a645f2d9c3a67d2502381c16d48a4d67a4bd187989aa148a2cdd27ab1a7d6a4c2d8b477906ed27605de12915e84b6c6f883eaa1923ef6157f69c04ae5a87e6b10506cfe49114e8e78bcea8dd72f9cfeda57142d311a78fe9eade17dfff9cdfef2be61d50f9cf17a0db554e123e9ac3563eb4ea99b98da3105f111bd06918ae8b8ea6a2be1c7930d4349e10b945a935b34e994536fc57640e951f3301f038dab83a9c5c876a386f88a7772f39b01b2a7bbaef02a8c6155af6adef606c6cb12f42c0b1106157e393116b64dff48bc1d5ac911e4dac14dc9c5343bfd32c84e7c453edda7f1d602e615002b54faafe49480fed25acbda1c913e17ba4fe2d0b9ecb6da351fededd329d562a97402ec1f5b983a60ba4aa24f9cc2e936d1e96d33d41cb68458a665e02a889588ede402e68bce53895c957f770599f944842b299d9c3be8f3c9014f2fc96fa0bd37b3f28884e91b4842c81fc556f053afcbdfa990cfd21439d6e9c539ad23c35be921c4175447a312b36dce2fb75baf09e392b45b3ff115d7269b84ed0e6f92ae0a488548a02e3f55e500d94b8e161759b344531cc15464e0691e23f4b6b1de52bebe7120b784baac42dbf19d446d5003ace9ca7d31303db38558ece2ac85ad5885adc310c561ef488c3a9c36925f1b2ad446e933e0890d1b6edeb636d5deed50ac68150d2a045ec1d93fb227bd518fe3da5f9e8e20f2ba306c090c0b409a1392b93347fbd4061de11b805b67e4c3105abef12550cfdebe83ad2617527309e24c6830f7e2e9cb232090ad013acc3ed2840b6860a9ee2df2b60b484cce48a90b2b5846cab6ea45d671c4107dbc485ca78534ce6bd0b7e4c3fee9ba39680569244c9dcca67707a872f212588867c8985ae9fa1fd3c8ebd9e1dd1d85fc628f95c94878d9f4675a52060b8b736cd0142596d07de7f6898e0dbcaddf25d4b7ca43d95486a1044c6ecef10d03457b11b177da98524a8e1a4510f2aa15f46c21b1a06a0603e1f0fbd5d88d9bb04183b3fc3c7755b0a971a82af65483287beaf6d8d43d083c74a21c902d502d01e29d7243cd8cf0e9572e2798f49782a5211b7dc1095a3800d54b539f0d20e26763827182b84fd063036fcfbbb8136d3c345a2f5d4d47a055d613151e37eb749fe1f3db102d3690153ceb480438a1852099ae406d0a8ed22489a8402530854e5283c44ba2325262860af891cd8a7195501952df4d25ce8efa5fc46b44db3b7ceafe2de6f8cdf91fe2ea39935d20450bef105dbd73b36c8a52a964ccfe3cfa531fdd51be1ca016828dddcf4f938bb0d95649e644234a4e111b44c8b8acf0dcbfa36ef3f0a0f8a6f8408ca8c2e062c36c22b38b10aadf57a97cc6719a9a8dbcf4374f1386e275b630aad0cdaa352aacd81cd7dbaec655b7fa2a696aa23e1bab3152bc01001f6fb6001c812405770c75769f801b1d5e645695bd0db46622082050801efa79269748d1c7688618937aaecf673a3ced8dde6835b03b09a2d105f37a7131ccbbda47f70dce0ffc3249f4ffa66c6b6b0de885366d390ae3175a4b6f1686491c857ff8e851c3661f695feae04c62b03cdd7e7f4fe7117cc492bf1a68f7f96cf2df02929be4a658b9818f26a5cd2cd082ba82d71d84af1cac6098e98685247b566a504fc0324315b083ef870158c0ca821dcb8e54a5ec710fc2cc5db9c51bdf31e97f77b8c362129a292d76a9898b78c46104b38ed970d2833a7882e32e6a9f562b564c8ab7c030e28729d1aa38909bfd691a720d3fe9f71ce443b6c81b49c9f26e2d9bd167f363ef235f9307d1cc58eaa0a2a4994e84b0e4303b36aee8362fc99a19efbada5d167e9ed312f270a6c7da2d0ca9a676b8f165bdfcfa73f9877154979853fdcf7bcb919e2d7b673c3e130081f200d81a70546b87ec61ac214c21d0e68c695335952c22801b254d45e9e50fd7295a731ce07e417156d455778c467c7b0d10ef203ef757e654e7b6e08b6aef952fce9782cef6684c6d893883606eb0535eb02171926fe7c9a52c27b20c2ea717661a0bba312649b4b311086a6dd9b788b0091640ce9017047fcc899c55e2307f74113a7094b8ac6032ffcda86020a98465e072ac85f9e9a8902f64a4e42d7ce91294600201efca153d9b2ce6f81c6dd6723d34a1b512daceda4327ded98fe41faf48c0785ff5583b727c2cf7c3b292d5b59592a2dca03604f955efad60761306c6224bd50eb929b891447a6851c19b4aaccf9f1b1aa98eab25fa7f66fc344df84af1b945ca59676cc26f6aced8d2546b9aad65702fd14c2db439c6f8bb0be9f2337ee3c47614694bd3be1981d3a784af61bb46bd066a2850452f3fbb345372ac2aff29caa46f088200d46d5d4fdc22a80f1772ab7390b108127c8087e7f599fd60f2fc80d80710f1365d6922e261083725f152d7d9a093700c5cd0dc8a8753ec38f404bffbfb62bb7cce55a49cc1a63882a1d8083c66a506883046beeb2726fb6f08583a5eaa3c3a25e57a6480320c7d21683603c3644c1c79060c081160a4459081e9171cbade3c0de5b9bbff71297e499e149089d6f5e091a30ca19f792d27cc2ca78bf21769463e47dbfe0ba5a688899280261a5b9e391802003cf0d00d6cf287404461e616ff987dc4a91b448fa19f6c34214ff95981ddf958ecead82a4bb4408c31c726e5ecee208027d750cdc255be2d59598678a790dd2b1c6c025a2ede7659308a69261d4476d964752056ac7c68de0325bb750f8259038008e8d3d5aedb1510228296a4b8cf3b0ee6ebf8eb9c60115c07877735ac8c2ec2a2456c4e4dcb716c0e268b97b6b3cfc102608b109184ecbd09d97b4b29a54c018607e106680755f64d9d1b75a028903a4f697c56ace8db3ef4793f498547a1d71c2ca5c22330f45a19c5e208c4439fd900d0fb39c847e1f7994ab80ecba681ebf5225ab4dc5e6bada6a593dbad57fa574a1b4da935866cad99d468b97aff19d65dc54d6d44bb88b64ea66edda68537e8417afdb4d6da396dad3dc3eda7b5d6de36ba417de6b6416f813ec906597bbfe5dcee6e1b8661ebacb7e9df213ec94ea6deede2bd371c6d9cb0aae8f386b51a9588afbdd7bac9e1f7569a9d3669684e9406e74fe7d5255f1921f6dab2b42f9db60408589a0840c084beb7d0f49089b457788be815b92d786a27ab8e146b26063b34603b634e307c4c56c818a9e14c0c659a34d11f76b6603b5f7ec448b3f2028d32aa3c28501f76a47c76ae3cd9323fdf5b686f5e82ef2db42f30555fdd9ec9ed5d7794bed89898591bb1313116f65e8cbf0f0c6f18da4ac38bbf0f04c3b0f68d6018d66a369b4864bce3682b1dc3b166b389e238925eb77bbbd94a6f5db6511c471287598cb75b97af8eab597079b465ae3af9b93f3fb6d29fbaa4eeaaebd153a7aa949edaa407cf97979819af2faf2eea842ea144282542afaa1e3c6d76f6d5b1d906ce0c6a79b6d79981486bb5f65efcddefb3957eb45a7b2fc61f7841d0560a5efc7d20188635dbb5d96ca53630acd56c36511cc94b92b652d2268e2349de6eb87c73b69566f286c3e59ccbfd005d20205b29d00f5050909050870e1e7457a7b395ea72e20f10d068cb205dd0684b0fee0b8942a32d3bb487ebc183add443781b42aabd75fa42e16d08e9ad797ef015c6047fb3b4d1583ec3cfd218087d752cd51834ae3ac1473cbb0b00031932446478682e7ca179d5f842f38276650caf7e544cb654bc72fdde4233e17434297feede5acf51de7a908ef7a195708407de2e34ac3fb35d018d47468bd261cfb258f71ce7aaface89766daadb1599ce1815b5413a39522c0b397f6fd1f9fa1d9d2e70ce0a73b8401a67380811d2a34acb9d1e3d401004e380d5a28e2316661004411d61c03869701c374e619ce8b573a45a4f112263b688d0421d2e94471c331c678e0db10a7396d8a20e95a694f9d271462a8d0f6a3547ca37e70a55983160c0a45056838bec069704df5b70bae06c9db70b1c2770b4aed956d90b368b0c4e31987d5d333027cb05f7bd05e70a4e8fa72d70a8a2ec16b332331aaa162d3c2d5d300b2948612b52a06adf5b655a655936aa940989aa52c6c35629832aa3f10215a2fc7d9f94fc7d6fccd4a2feda9bb1307f0c6fdabca93365a3d83025dbbeb7dc9871f3d5c12b0c1428d60e2febdc779f930c7e6fb5d9fad37dd7268b2deab0cd8e3638fe74de05417054917960cd411004415b4206413660b5a8c56a51af68c1264d2d6a5c2bc332a8ee3e48a22689161a5ca234ed480bf550ed74dfb5f9c5d9165dbf67f820d5839ecd1e04d99c3d0882e6d901efba5d722f36af08590c9156a5e609c2d3704d152d57e85eb1a2c91894c6c9f42eb07fa55478f4392e39a84d4733be65dcc73e8444b31e5bf39cc1413e6a0c4e8c4d25dc5f53eb637adb4dff956d8bd6884d74f6598b278bd0a9d740b8782be911aea44762930ea864e8b8921eddca3e2ac9f20c9f2c6db7921ed5f22bc917a163bfa5cd3f1b2ebf5bd6c6f28a6590ad6686e5b964ad4bd0b4466a838bdfba89b11fdfba043050577c38b39ec2cc5be77adbf5d636a531bb9da979fab3c5deb2789be3ed4f20579f40a60fe823ea7d26d60f0a0e215e4e5ba668a041098e344e56b5de971bd290d1b159466a9e9a80b1c1a27283deb8216d872d42e27b2bcd90ffbeb7d2f8b0462c16cf62f16e12e0405807024350f0e113d285b97c498a475b900771829f1eea506b21286b5a03d55b74c8cc50391db23250990ed998a7900e9997131db23050950e25dbb241878c4acdab062f311a3cec6a4707227f6510f610d720a6a3a215a1203646cd941d1a40a814d9941c44c6e4cfec536213f178bdd5420109500003aa8ab303a2dfb54800590fb2aa3f4306f527cf2cd7f4d080c6ce1a3465d96bd89a3c064d99181b19de90396b014d970b2998f1528316b02a6351e03089610437595e43e4fc684184325371d0d85083a6c60b19ef9921633c37a4a539236346d6068634368c7d8989999101ec6b9bb1af93d76dcd33b4d68e79bdb5b6bf855d71abd95f352c635dfec3e0455cbd93c5d0aeaa028d32a404682e1a5f5560eb1d921a7ce6e8b8448143b66e1d3b48bac0d4dfbabf35a9b783a40bfa627fb7a6e3213629a58d01c64e2976ea2dac12f8353309fb3daf7fc0f498526a439a335d35e8b1e1e9d65edb6958d3def67993d85b54d205ae60f861a4efc37e3f111c434ae2ffccb06fad8d1c63d53a75ce9c3920867cc17155e5648611bed8c87120c6061c2d6a4a88f2234a845bb7a9d20396e38d1d3e3d28211773a89a98e0f95ad3853e11a585d0009a2e3f689499e983843a4dc084f5456487992a226069680da0375c92bce1c3c5a5ea0ca541bf04b9caa2a40e0a5459b48982103860912343952f485ae863a69116e0a2254d0b54d838f9c1a746678f08b617f26849423676c606303d56601828275a3684e942852607ab21124680fa81c70b9b1b64c0c1aa0388302e687040e59192439e1169d80756192a27592330c982c74a17b5851565ac096bce9b3b7601289c1953c70a923028764488bb618ff8f6ebe7047ffd14faeb27f9d771afa8f988f10c45b3adcd6c5b33bbed0adab73118ea36a2f7832ef7146fd1f20385bf3ee27bc4b7a8fed5abe45eab827eadfb1bfa996b7e869f79b1590bc15b71b65e8ae9476badd5665a761399a179c1aefba64b8a5aeb2d79a09f154fbdf51ac9d593e4ea747c5b6b05c30ec61a5a3ae2ed65f0bb07a5e3a290f1770f4a2a7ff79ef08c408fd0287feeb8b67248b32273039e3d4715ca57cfd5ddae608292ba8281090faf334f3c1e0c739c3c88f9db77cfa90b8e3356b5ef9ed35418b88249cb0d28655d489a5c31e1883ea1394a7cf79c7cb887dc452b7aa86763ab17f5c21dd2b3f175ad7a35d6fcf7ddab3166e682c9d58b5c4077f83691f08636b4c16f110ac7bff6b5d66aa2ee68adb556eca7eef33383d56f77df7a6fbde6597beaa1afa81d75ed5bd43334aec21d8f46d55b4fd1c289f9d67b4d5278ba5e8dafe7b5d7db3388c780aac2df7a8aaa823a79eb3ab0b70ec2ea32786b63844fcf9a77ddd5ca10460d6ca325fb49d845d16fe5f9e33720cfe519e4d9c59cd7726ef3b1eca7a38cfca353dd8f4e9dfa6d15fd2dec78928e73211f4719e1d79ce2700e3e59caa0de4f853cfc9a7fc0f4a3d2e84b4ae00b9932c21fcd1475c7ab3b9b418bbab39e2b13507776a9e63405cee634fbc9f300e7e2e7a28db4d9461b892b97ece3fc2b933ecf09b94dc84c1a3d7c9bb7a8a418348a6e735c9964739c639b07551536276fdf03194ae08fae44fbbc52902f0d21f993de4f9a494ab4cf8fa68cf0a99922a877d49d9a67084fed0bd54a0f96c2af790b2b5225fba3b7a8a3932e549e4c3f7a8b1a54f26aa55202dac852b3c52843097c01b49175a5146dc4234d161de6c8d16fb672c8e66439f482fee8b4c95326df242de187689335b2a44b90fc712ed2d203ea4bf65d505309fc24d24933a9e6e17f30fa817eccb3662a81b852867dd12f19c3ff64fa2fe7fe39b34763c9db0f6f657b2e4fd083cf4573c97ae8403d98527ee4c1bb8d6e7ed3eae04dbab891e6c9f4e4494fea22ceda5a47f3a46e73d171a552085f7bb254b24348b4a6e5a1db88473d451b596a826823abab3bdb1878a0a4e5a473293ffae0dd46a42b7dc0f45a3a53ca8f74de6d34faa8f5c1e4d9a2d1d4d2993aa2bab3eea1dc9519d49df50e650bd285cd85cd9b144d6751776087b921ea74c90fd5cc17a1d65312a879c2e857021fbb0cfbd84fd0cab0e7672a814348e15f0fff9a60f8b448ae7ef264d8a76e816aee478f0f3099527687862027c819c10321665e4f2d30790385a684294a183a40a4443801899c24729a4e3872e5634f1524489aaccc8b903150b0a0c1a2476af5ca51064c93af2b6368d61541843e486a44e18cbbce15991ac652b043870935d287c8d747480d0abeece953768138d53d7b9660f178fa29bbd5c0470f9fa91b45fa4cd988a2e07b6bcf973d5830d6b50105a5274d0e69d7c90336603ca6e4c4119342b1f4a43d5d1abaefad3d507af0fc99fdd6b84db789777355f1dd4a6a6091ae5fa4ea49d7ccf7c465f2745d117fd6bfcf995ec4e406b40f3d51fdd691124004c7108f364fbe153706a1e3ddf93988490dac0622f8cf717922dd4ffa1c97fd6129a37ee8626da424d2fdd0b1bdd4de30363fffdc9e19a4968ad8ad02d77a4515b7bb12c003fa8d6befeeae97561caeb0df1cd23cae5fc4979248d45e520312c922554fb266be75571b83be96d61f77aa594917d576a54ec91b1a036badc5985a6aedb55197da38716e1c7abbef8e1a0d2bd8dd600dbbfb8322e20f0c6b617fd1acb3ba65abc6ae143004bfb2ceea96ad1abbf803bffeca3aab5bb6eae20ff757d659ddbaf8f657d69935abb5d6fe32a39ff4574a1bb58728881f18d6c293f73d46abb6e859cdaa5f177f60089ebc1ea3555b67350b7fe077f2bec7aae8d659bdf8734c29a5bc1ea3555b175f5e8fd1aa6b79678f55af27cfda40715fbfaa9fd65a6b9bda28fce25de940ec4cacc9f2a72ecf923f431d889d89a1067cdecf416d3aaa790886e553148ba3cfa5c2a35acd0c5b58db0114dfa406cde6dbd41aba1e426f1d81e073108057c5b5d5f4eb77a8cd06807ecd07f411685ea65bb115b189f0dcc962d5e4deca23f56788274b1edd9dadaf0e8283da7404fae75aa0f9797982f03769a9fe3581be490d4a7c9b5a20b82aaeadf6abdddda7cfd1a7f579931138c0d17769a8757783f6bb18dfcf76777718aeb81e829f64adb5b5ae85e067eb5a413eb55bad0dca7130be8d75d7362cd76c580e9f8665f06958fe9e86656cc3f27d1a96edd338362cd7a76cbedd8665fa362cf7d3db46edd6daeefe2ea65f0e02627131b6568eedeeeeeeb695c5bd61dbb63a6b2def1b4ea64edf6dd6d66ab69b12edf34348b657a27d3cf0b837f50535715c0863e62b0f911b7604012204ec062c1a745c7922a2c7e9e81bf29f1d3a65b0c4be15015959750219d7640c20c79949409ecd24d2714bf571e6527d2073344fea38a7241269b6ce5cb22fe4d771e6d9e6ed602ed90ff2eb42e6493f28a83c67bcc5f9e8e258e24a4a22d971c4c0677b29b9c1293ace47f3d6ddb9643fc83c47f0d647d285cd6d5937c099b7ee4617cd6c9ed797ec8fe6b964afd9d66da35bf35cb28f265baf57573fdaf20ce1addb9b8bb7f204e1710e54c918d96f9e2b71e6793fe7b7b2eb2ee7947cf1639e4cffe31784cf790b7b2bcff0b3dfccb1ee70dea2e64aeb3f2539faad04f29be7ccb0ee707e2bcffb386f3246cebc7587336d1bd01fcd245b25912c50797e6e4b7083da8fb7ab8a9ce76c9e4b353b90272dd507f233c8db719e2bbbee70e6b9543ffbb95495ea8f2ee63229e7fd62d32beaa2f79e48bd28dab1491839f39cf139bf792e4f103e3baeecbae2861f7df0ec5db3e3fc43d9b50897c4e765d0fff1fe5cd91fba255fd0073265d01f3d97fd41e55245aa3f9a495703eaa28b1ee46309e4412512d0cd3c9946cfe549ffc77337c79539ff29f3ad243d177a2eeb8b74bce529fad8a48b9c8f65765c7986f038cf9548d9ecbac3f9e8b73cc752f49b374e249146d23c67bce8ed772ce9dbae69a36ecf2510c610fe5ea7d6540ae197e853a1a7eea1e6396ac8c8a931c6aa6b2a489698a9eb3b277247e1ab1a5b41c8129b902955634e7cbcd077cf4993d47dc20367cc07eb4b4f992c194a90a25d5769f70acf084de8f07439490da39b1cf86a0b7735866aec059caa2c16a084b9904398ab12eed5131e631cc8928a7aa242333b53e1aaaa7615a46aacc99a2598769319a6c89a7ce120bb4d4ee0ea01f1eafd10c34f5480d4b972d23186330622363576e2bbd7848a099f37df4d33bb6ff2cf0c65b903179d8cb30227dfbe7b4cb4ae9dfcf3dd63e2e3cf7cdb64f2bbc7448a4993b52deab7fbee2d81f3f8bbb7a4cd153436c4c8314b5688225bc205458697185952f5017dea78ac3b4ce62060a6c4b319ba788f646cd5cbea3d6ed1dd5b768bd227f9ecad15b48b6cf59ad7e32eb2fee16b7fea727fea3efca9b3f422c9a70b5ca3052baec79e800d5415d5c316320c8fcfaee1da4aefedbb238a7d808cfb30cc59a7db7dc53e561539e46ef327769b9f1d749bffdc66debaab94e9ea3be836bf5443c0385caa8fddba884bf1ac8fbde62daa68334feb4b35a4af3423f4169596f4c3f245a5ff9927137da84ccd7b9de0225b45ba28922b2459b5cb9f401004b5ceb0161ebca4092f9172300adc71753808826017ae8540dc4cd96c51633c9bc44c92319cc1effbbeeffba26ef021c302b3aab2ae281129af48dad4a27e246761fe8008393801f3c4043d75c020c16303bc1107831f08d28ccb20a75acd842c3738aaf0ae12ae57e285330882e0f77ddff70529e3e4bc3e3c5ed8634d4d4d51351093d0a5163557e895c1744fc2ee4190e74475771b4c2f499b287cefc560af21c16c47837e867f0374afbb1d783d3b0846b93bef2363b19a8e7cfd11335c47c66e80fd90adda1735a6c277c9babc112e23bd215d51df7741b057e4cbea8ec93963c20392b428266aad67c46eade10cafd743ec97ea778f21df3d1e343c35950ef01ff8771b1931015163c5cbc94a0b863129a4f16821acb743ac4755660685de0e3329323c786ce14125c4778f478f27bf7b3c6c5c25dc5f7c5a1f42a259f7055bcab82eaac574897e2d13d41381486619c1bcd0a3b2e15228aa2a4f5f3daa2736be2ea68ad24167cc18de983b8668c5d37dfafce909f5a8dd9133fd49bdce88f2effbcc24ebb7d207885d55e42ec51a1388b9ae787a7a12c53bc2de6647f9d193eb4cdfe48bf06f88b3a6a6a6a6a319945e400cab8ab6e1b7e72525f09794c067fa265dd03ecf446906709cb1d2e1266cc4774f07970e2f27c6987a12fe4aec27a594da50b1f63c05a9562760a0bab3854d5814596f852049b0c2fa442922048619b6a4c886c8b81185062c3390cd80e48bd4961d44a2dc48b3a2587b9eaed5111d477448a102b18e1ee4bdf7de0b7af0887a82b5834c1af53295838e1a564148c081cf0f385fbc9c70c2d49c6feaced3169aec8431c6188ce4ca4e744e561238f5540ea7315cc2a4f0a60a0da7b22e5f79ac49cb70e6a68c85207bcec470c9210597e38b08b7d74c697d25c14156a3c8961c376e398004b96103933768e0584d9942b598b1e120d3c221e63675efbd9766c18145c4818254168e291d0e253cc4ef5e94951c5706b476c46025489b184ec09225810e3238b0413ba1063057c0c03ba4dd90a1d123ea8b182f332b3d1c515156e1e951558ef4a2a8f0c0a812fecc2ec34da107f5e47ec9e1772fea4814d51313236e965099bad2a44a94c737b470b9bec344c024537e998c28f902c6c307932e344ae5068d5befc60e1d40df3da81c46901afaee418dfd99bd0cfeaabaf75eae3c7279c9b8ef1e9495a7504fa43e7cf7a07ae030c78619d4930d39ebacb532d8e0f103a68cbdd6f69ebadcb0f6f2c8d6dead6cfbee3d4dc1e377ef898434f0cf4ce5c1c74e565e58a0a061c10b951133748a11253b805c1b43ee409550c58c9b20626a98e00387550ecab927c5c30af7dd7b929a33c7c9f6dd73e253ab83c70b9b1a6161da549192662408cd881771d73c69531a9a671894ff82d05d4aa9192e8eb876441d31828ee8daed1c41599aa60811240cfa29ba8988762688742e40c0a81fd4465d827411e2855ccd366669b8bab66896124a0404310e52b0e0d5eb95ab5944ba28ca21f8e15b81ada0820a2aa8b46f1ce08eb0dbfea4af854d221233aa28a0936b07f46ca4272818bb3cc72ecf36a35d6fe7083ef4916804094a8244df112348902841bad8ed481875d746eddd4545e108a3feb500fcea960489123bbadbed1a1755902b6d4b622caa60375a40c2a8262a188d2c182f2061d013240cfaf1308f77793c9ead94c7e3750eaa40170422c4650b82b2ce829ba6eeda4db4f97613240c6a44ba08e142aee6792f303a71c1d8a5d87d0200bc000060ec1205be9d4c7f8207000a80b6b773c65f913706f174419436892158c8d5e4911a501c0002d0551cbf3cc75ba208212657f31c530840c50ad2050b0ade4ea60f03100012461d7d7c13f269e2bb4fa61f42b25ffdfe4945d03e82088508b34481c243a0408102050a0a26408102050814282a0d4035cf113c35917288e377832076156b8cfa27d387f4047590ec459c12c5e4036a11b81d593304101c85b6a8964af46528759fa7de62fe2363804fcd90be9614b8d5f4d4d4d4740492318c5ea9cfa0ba347d48c600f1d4fc9ee25e08e1945ed4feb611f5171fbe45fcd5dbd981c7a3288ab69a3886a2281ab57fdfe63982272daef43609de6650265a6d12b1dd5a6bad2df1934c5db463b5b58e96245f60b7a40b7bcf19432f3e7c7bff876f6baf79dba8860730ec87f404751840df6da4658e75d7b9aebbf08626530faabbf09928a54344fa7df5f401a2e26382d163c7b22b87720c879b63724387b015ca375d1dc284a98d25980a2455a6eee1ca5a6bed01ac154703748f23d0910c2e3982384380dbd803c08de30f1679b4a084eeee56819301c5cf28019a11d0e8218c44d08823814868b4c5d97518cb1e22420f63871b7e7563891522fc300639a1408271a8c604776824c58008418cb62c4377825184230105a3509e0f214609d0e87cbce1002a47d2cd4f688e204cc85d11a3055d99083762fc21732331da58204b8c619822cc2073e9bc1c6c27f6dd69befd6461cdd3da4eb27d65ead75a6badb81bc92eb6a2b1940a2d18ab5c8516b6cb0efaecdb2b205db4e78e586badb5d8825102b46b62f43d99bab54663aee9f6056398464f8c3a234d79272e303261410545bb122446108968b3f4ee10144c006248820f3a0f1d8482807e50a0f8efad798ee0899c28ad35d332b3b3bf1a60c33067dd970b1479b27f2dff6c3c590ee822eb614dede6ad978fa701350701b3a7baeb3f79b4da5b6d1ac2916dfb8f9a6c1d6b65eb7db740184480e9f22aa126ff6c2181c524ac0b8ba8a94b07d1153c2546c835392ee4900d892f19938dc021d7c2488065d2cbfccae497b4304ea24a20f20a438257982122cac2fc20f1238f7b4a4c9d95f09245354475326946040cb9c3941163d946d9f1c8b74909163259c44cfbf1454502890a517454a021022cd7f090c002668e49831b11525298a292433423d03238c30823f903132196432f124d3290961245c0945006068814982a113380b121022d8770487065700dd1940c9e292127dbb67a39248168850c1a09cbb5ef1ed70f930d97d588355c53443d14867c19d1838fd82c6c041bf1a2c7cb145662e6cb14ce72f2f7bbe745eadeb23f04057fbd34c5609dda7b837691e19bea4ea7e4ab8370b1af3150b7de2f525247a477c2d5a54eb6741884e4a90da921d5812479f880bd21eb89810911c30929a39ad1e6898613acd4a90a524648d728044cca9de804a93f9d57c5d2cef860a147161e516e74190147972138ccef1e973c5c2801700572ba5a3dbb6f09d345050891137c30c943268b94d32c63a1162961d681186db8a5c9896add5d2e774e0fcb962b58567a58a2f01a3f7189d928e3c3863a4fa05ec06358a06079c2cb415846f83343c17172ed2df8ee5dc1e14a9a08578ef8a81d29820353204b4f923c75c8eaa8f9ba476c501d698a4251a549052b1f6fdac419938576b3eedcd00acb14d8e971857143a54b950b5fb87c5c31a167c5ace9139d2082467b9a685b0bcd337f354f1db69883ffcc93031375f79883efc0c45fcaab5a7819bbefbe6befb5d72cdbbe7b57c47a57ca5c3277a22b60a4b2aa884e382b0b678db0e34a0e2b39b8391bb326e7ef5e952f77aa484153e2a6ca559d1cf4ddabf224870e1b2a6354cc54f0dd9b92c2142f628400c975b1816d5cbf69685bb8dc9193c29736b405214ea1901c53378fedac369642262be3746318cb384da1220621bb8de118c6324e4152180b02e516a48b8db1204ceed40941b06a4148782abf7b53acbec377cf043de198d850b668941ef5e91ed9ebe39f99e8ab8fe1b552bcacd57955e1f527d15542c7dc3321cd57371156163e3de2e8391773a3ff9439f3bc9ffd9667f8d929e9e2667655f1e3d95bd8dc1dfda7c4f9ad14b3e74aa09cdfb29964afe7caf3c618cd6cdebabbd6144ba607324f26a4fa66deba50d75b0f7251a423b6f6ecc02fd94f0a72eb4d6e20e4e409e41edc9a6707efa0249c5fc795f88a3a2ecbe33c90bbf764c95b1772a49bdb9c5bc7648cebb818d9cbf3fe9813cd161900e4d92dce1c1ddb1fbf94dc60746b0e896efde6b71c124da4eca2e77c4883eca2df4cd1ecbacb394ef44f01f481fcc74471279616a8046b196d9a542ae668240000005317000020100e8984821cc8c244da0714000a638444563a2822c783a140140aa2408c821806421888611880812006831cd3ca5a03afba71746780aea9457f2a01d6bf3326129a4ed4800f292106a3eaf1fd7ed091569530270919f07ff66bcb27b50302a76f6bc2250ca0378ac71120ab7955340f211c6cda8368004bf5bc42fe31f7f26443069126a76774a388967e71cea1d45670b8a1497d8eb6a5a1e6e009dfe265a816cc2c46dc2243a887a64e1763566cac3ee97f20570f3a60a1a8c38a5042917dd1aa195904de34d352776d61485e647accf24be57901759ff51b11ce5299469ac43bc4dfe19f92b3905481b05b3b8e9253f6374ceba40ba5ed4bb50a2c0d976fc80082f4b228b555e30e6b9407c288ba19d9cab6755d7b50c3f3dce952571211526a0bd68b873f5aaca72b0deeba9cdc08c9026ef04405777eaca2ab34922aa043ae0bae64b3a6c548a112e37dc1937ad2ed7a90671f0bd78a48b526d4c1cfd970b356a4a13f498821d46dcf63cbc9f00c072de3e4ac509d801a8a75c7880fd6b806170bff28a50975257a158aa7304056b6b06d716f445b8acdc7c42e9205aaa8ff50d951c4f7f45e8740d7c65c509b496cc60f41d1066b9e0e6bb7470e8bacfa1a2b18a8e13054d1729810a75167aedfc7aac677c64b1ec55872b20bc6fe13a33e9a8fdc54d69f196b7e7371493f816d70b7a898693e94a7d40d86b51caf2f750db7ba56fe137643473146c3651241c57af89771f78a1e89e3f80809c2ef6cad096b752289c1b879466035e35053fdcde0f820ff93b7e27d9daf0c315e3feaa5cb742d83a424361e2ebe58cb898bde20bb968bf315f9f65b2fd576ad1b39a832b001c8aa9af27d6188c46a86db70cdd01cb479c82f3464e829703bf9d2c4607718d7bc14bdd76ad4d7708f16380d5cebfce779855bae13a0ee44ffd735108ee06ecb1761a285d7099288a89550618ded21d4fde6095aeae40de02136c82cb7ef1ca04bd6f5982ecca0052c42f98e4d420214222510ad1e77f98a441f9551de47ab45f801514293aed63082f2546db9066e2ecef6d96e4c78be49ef3a88371f9ab746c43ab4e50dc79f684360423fc5b30010a589fff19ef3be14357267fe36278235fc9b28251ff4481509edf922c987ad25b06873a65840d0330b35944a77815e6fa68d2d3de4caf01f0ade9a2c66c2fe6243c94b323f14186be25d9b9270bb349489a5c3f22a8e12022fcaabc40de5be91eab01c93ef20196c76afc65a142db3693205c1b6ecc0d5e9baa1a3d2ac90514271dae6b6ede7d6f0d02dd64ab74a0355cf2635a2517e1339d7046df58f06190aa42d36109bd2a0174ce3e230a8ba9c33fc370a3fd6ae01fa61d148651de287ff5622b897ba7608e155e24b2d996a20590763cf88350620046b1f0584a42a6ebb6b0f3ee85f189f3b37ad66136c461176780c27e02cd79e8cc91e05398ebd8c4130c5d8df43aa1e3c574756b1833da571d4234d43779d154416ccb04ed215ab1520881899015413c4078311b9cd02f11522633520c542e65ccf220db8688f2576a18734977feee88c7c137b09fbd7b8a3859f1708794e8f3cd1805f0b81f9ceb6352ccd3d45e66c5b8bad7980a15e503d208d7c00b5f70a09a703ef08c2afc5434ee740be082307b0669e227302f9e317ece83200c95b27013bc8fa1b20fe06d7d870020ab4e0418a98e2c4d1036c6dfbbd8c00cb04941e2a633add92416907ee02855d0c652e6216fcfa66a139727f8b16fddfe281ea79e7810ea6ddbb9729a3374b2dd089cb12a160037010740d492526d1ecacc7d2814df6a2f79d658096b92751e81968044528282e98848a09b1eb00503572147341cc19c279edad3861601fb830208f7f0ab748de71e3733c340ef99a8e142f748771a963ba25257161b2c41ba7386cd8be4b45107ed8f4e9a61e71abb3646bfa082a523b40ddb40d556dd46e3a16db40356d781288eb997091b9c1e83917d496c426fb4a8c64403aa7218d2f58a77adbb540aa51c73ca4dae03cfc5bdd80f895233ad118678c4b4a5e28481c5e39302a31693482f5d71ad621b529bd6982e349284b6500852e410425507d975bc94a209403fd8cd0d766796c82d87425fd8248c7b5276274b0d59354fe8e279e6f2881503924480013d51ec83f021a5300a9d01d8ac72684f608daed009a57d008dd06653e4c453607015e75aa1a8ed216adab598747eaeb5645a0f65461d801cd7705ad2f1d0050623045f8851c937910571f65dd3299dbd49cece604f04a64312a00aed2474aa0c07a100822fa5ae09a246cd2f310313cc33360d3a78427336c0e7416ad00c1c63bf5a1a7410b6170e54cbbe350173b8e24f30bd9c8680f0b7f77d039d147033130ccb575cefb1622a392f3258b48a3927f951905bdba305cb7aea83e9e567da4856bf1ae207b41913bd84a285d9bce7c193279d8f844d57165a2e1d6e632c2385f5353fac20d2eb64f7720faac3ffc8d7b52ff617c52b557df00fd36fdaed462ed44429a3cb566f2149d24a5be3b35314d04c2a71b524b784687e0967d1fd8259075d9e6664bd53dbbac43619e79518439c87fb5058a0542972983d93c1efebaa4699505b29f2c5053b296ccc627dc66f551dc245192b8598a3848bc800d68a416a08a71bd3268ec91548a032a6e48b80abd105e2cc3a4852a3bbd36ee4dae424f027a480ce0639cc029cfc1fec4d16d9e2d134369a446469ee2f88be536f53fe5226b1740107fad635a04ec153a32af86e1f89b230187f7e089593737c08fc93e5079cc7f3b481b8eecb40aeae30b863196968e0fed397226527dca85bf6402152985cf550c6aa795875d37597f498900bb392c074393701970bf37e7fe68665c02ee55b01c4e4d814bc0ddfd1cfda95135f6d94b26fab2bf5e01b1b4fdd47a443373c8b616ab91933974c9c4e7a2d0ffc656ec6627cebc9ec78a25e1a0c256ff72b708f9428c512e1e17367932adb2cb9535ff7931fc96aa44c82684e144197de326c0dc516f3f8f93d4114a82f17faba9036bb00e47b40485e3655607c3969018609c6017eb04cdd2c5879d2056fd95956ed769c2be7d2a7b5b0eef0179d99c9d1818f37731bd54af4f8269d82430e25085b38df650300d32250903817f9290dc215e663463a6f9ab2357f270e973a1f62cd84f7c8019b50a7e7b539654be01ddda4066f04be196b34708486c23517119ba78ee62aa56dc822e79e056ceffadbd7c4ca8abcde5d6449a376acea04589e316b171305fd0c2ec15e2901cc2bdf4f942a409cdd895357d5d18a9428e313617003822f2df79ab2f5ba7841968b4da427434f46f83d25b2f484fa7ab502e4597021e80d88a1103f23cc0775a1ea080576b7e00364b80de3f024ac33380d7aa5de8e6acfc3e1a069f75b875a954dc4d0828bbd4ffbd1090a8f33aaf20c255420029de1503e3b6de9708795f633b243546ed0951b487c53172e124d5eff9cb694acf051409842a8d0d091e447d68431a6f2a4c8cbb4e72e4521ed1d66072d0ff3b5ecc09e4edd658b84e2360d123d02ac01dbf8bf321ff0809d3ccd81140e81a1a893555ca8274e2dcfda5396d036d55f5427dd78aabc727524e0e4a8fd4765512146b88e77215787506ab74dcbf63949b200da14a85f578fc894c5a6024473d3b84372078d2e994c5f39663019b6ab06710003b5d6b691518cfa59b0b4fa5656c4e4ba0afe95296e651600dc2e4363234369975a6447da8fdf0f5520687adfc8d3afe970a7e6e7305a92afd9fdc5adbee634a7664a98c2e745a126e8f263aa5ab5b6a179c61c1d93148d30ef68fa7efffa2b1dd0fe5e856d12a916760a626255111d1e9b8a103daf62bc276b3af3ee14b15498fe84a2a091d829ed2e740bee8a209194bcfbd78dd281d516b5caa621b5d52b5b610e1d1ff103ab7231c304416e42eb32f213e06c60f390df445532170b7877e1465c5934744ad4a01548423db8d6e567a913c352162024a9112871f3d65c5d981e83dcf76cb00f7f7be5fac389bfbeaf0f9c8392fce7aa8e8ede124d070d1115722b986d968442bec4ab78a0b1d1a18d27d4fc6a78d7a3aad5764fa585d56fea179d648870ecd5e866a1b71266d10f40403454e9e9f72791db4d793565437a2d813dda9259a86231d21472c87d0d4f93d4a07f898108983f03b3fba5682761e94a72032bc428a7156afa58491799b09dc25c7aa46d7b3cd5b3c702a7c44cff0108cbad7027ca8106eb92a342f0b0fcebce1427b11720a042a4b38ef4eab8f182dd29d64e19c6e12ed7e5959008610ac2c590fe1828231d2a92def36b7f958e3fa67b3f205d2f301088c81d315f9555128c87a91196b6d21a6b7eb4a0d7ba44b99c7445dc6d0c402c65d5a702533ad1075dadf11c886a81c907ff485993abe92f453975aa3be085a4508cd9045d21e39842cf3ed03ec442451bd0736bb9585a466932b10e9735365e95573a26e4ab16fe1ba783aff6b42e65e22d7738ddf78bd61f6cb3b9d9f3730ca7ae9d70f49d525a074128827718c12b48f05653dfe3b7e1c5413039bf898d5e636e174454406d8ef9b400d5f5265515d0c0fc07bfdb9d5cdb2582374a13363a9c048df5efced37ccc4e10b543a8d1c02ae2024a0d1211c111c01cd08eecdc383563d96a8079239c81749cafb434712ebc145a491488d98d8b5f9c9370aeb55fcecf1e920112143767a59c8a4fa684e08484f6215a970e1988b37793aa411568db5abd3e4879490a3146bd7d665d4cd08d152421f007e4978b0c10f536bb9cc106d3564079006dd6f42a4e123c2ec05bb68ee91ddc645fdc49a1c7d36afb5ba6a2ad180f1ab8ac45645aaec8b4cb527b76c995f60d9a371b34dc16702b52caa5ed3682552710c85942b55214ca4c9053fe96315d62c919dc048b7331d402801d6ba6ef6782a98473c5202033909a00dcb350a79d34faa9ea54ac43e4f70dc222bae64f2bc09172a1e414888d1a00c818fd24bd2b777654b865f77b803f780954c10fc38472b13d9def2e6f93177f6edb95466d9be793ad439a7c5d988791f72696a1b2a8424aef2772139abd75216827c898c813c6997bf6d773170f68d5e7cb03985b2e1d2e5bf898f99974681eeb98a982545df69cb29c9bd54af4587734255bdd2b425b5db515b0dc713b0320f9e23db6c12ad3cc2319079f54e75dd47377ead55dd6f0df1eb2583edadb3ef93410bb380ded6c3017bbb46615f3875ca65ead011e13aee3015180ecdc6e1c09c7c457db0bf4e4b9c550a88aba07a434df44877867e5e2240841411893cd7a2915cc440bf1a86e80d1b926e581dfa0e684834426225cb92cee1579b0dd590560c50bb596ba114c67a420a09be55353775a5df8ac20952427e4c5cf344bbd93be954bb040e9ab026a9592908bbb12110bac1152d7575a7c053c9f7dd5cea768d7cc657a16d9a8eb431ed8c6ef764baa263078389a11ca7ec50dd68f568619a07c9ac7f097b2e7037ee79949ffa76be439fb1ebcf6c55ad398be0c5bf5d1cfd0657994b550e35b5cec0c40055f1e44baccaed110f00b1b1f543736efcacc9f6157f8036fd22864675976ddee90b37784c8a7dc2bcca6edbb3ca1dab93a0c57ac96ec6f233e7c20416896e7297213b8ab7f815c5d7b03e1c76822c65df6aea9021e5d4eb1998c890aac1f783aa4e1adb3afbf3d9052b23447f0981711ff6188a2dc13529c612efd51da2731d66b03f9a2db92c08712d02a80043f655c9d449be7a6705ddc55db1bf230e5d818f6b190e8b5a35fa732e91cc64de90724eac44909f248f7ac6ed6387bcf9bbfb943d40dba6a81dddbec05508622b614761aa1714ea38b2e30dcd57a5cbe7c29e34685fab420663c19716886d07d00a508e6b5ca0ec136005205312ca41789c11fc4954afde79462855669e3c1888989cdde0ceca625cce8291f70f8e2b5b04f1ad17f6a9b109fe57bbc2aaea8769696af06c8a306113bf7c5e916eff2410e540a1d242ed1f3bec889021f24e82eafe281eec90320cdaac8d8f0f18565ff2afb8e2633fd1fd7c7b3d83ab55eedb31096b05f5b624c4518516fdd2f5c0bf332085e10db726f08b9649f97c02ef4bf3f655b064355c507a6f292626ce53ef98ce1796b57b7c3d75729c752de5dcfdc690b3b2a6b0b3dca021422c03298e417ee74e3e7fe5c6cb2f351a3aedd0af3e2667f6c3eed366a6588f0464efebb89cc34bfcd86369337f1492741ac0ba3890ce60f4edc46408002276c2bfe055a2a069cf5d50d821ddccd955c5530d08eab1cace5b0c53d5f68c4848f1e6e0407b726f89c1dd67826da63978e97202b717928861524efac351024eaae6398971e92864b263853b89d1db4b031cdff641bcc1e323e5c69ec0632942cc3c3fb1738442bfb4611db70819c348dfc63e3e18b198a0985e5cbcd3dcd2aa79c784edd74a42abdf1864eef1d6ce50cfccab3d09e563415f2b4b2f5be4b0412bec08809521df6950b76529e2e287a5d7f82842279010d4e6810fba47a84578af2fc320c0c0b935ae1df1dad5858b2b5e4f85ff6e418530b15f296783f8ac8c18f645e60abb269c9ee3093ead98e2cf08a2f34085c7cb024385464dcc9b83d64d588e2c30d7f19069e02dcffae257371497ddc33c8bdb2d7460927e5653621b56ff11efa6641f9ee74237726ef0130dc1f8f05c6d807428bc906e287f7448fc072b1e4994aeb63b330c5f8b47668323f234486735412b2fc81f0e880af1ec96b455d6daf34507deb15ef7a5c67331be8d16cd3d7370b65b193b45b446b5883a8ae274a5c936ce1ece89820d3279231055433e4e49715e08d4b830c8a0ec0c9e312200725346720ee215aa0e18cfff46690e56e41022f8d0ac0a1ef22df58defc01fe6d5461e13cadc90f6c054d8280429c7f1840ecff63992fcda54578e2205acec92bff28d932cf96fbdb25a56b555d054665c0439e9c4149abd99afabd2b028c66bf781d670d56a682a03afe1da4aa0d5367a4b9a3981a7a669471469e0b656b74668942c3c11270d807d17a009e4588fba4825549e04575c881fe1a2251ec95a658365d2b61d9c3ed15754803e968b99de4810c30bdc49168b61c34297ed499d161c1dc979269b02453a588572159e5f48121436dfa45558f85d1dac924958d5deb21c0bcd6d5c4e0ad917100a291662d800ec0108b94937dc8574a8deb890aa3f04ef974408b73d5122460fc2bd79a3919e6c5b5ad7be452c08e448e34a0fae9091a93bad6671cb9106ca4a650b643e8af7e5e4e42d8db81a3c2cbf7e4be3d45db2c3704715ca1a9135ad0c1d9b1f975f141bfeb34d42a42a3b1a54e7c733df681c55020c63f89bb4602f5749152a9d586826e3ef8885e9f66860c173ae7f85cd85423d78117b93ca2ad203468a4634ac78f5111c6197e3e9b19cf608cb7c0bb70d7132094d54aebd7dac3c0f58bea9291d95419cfba252414ce728d0d68fe38a9495bc4db08d06fedf979e5ecea907923280bb6bff3ee148f9058d93700348022e25a84317d793010a6299040a27a51145bbb425cdeaed7d305a2144a204a26a22c1e5c831c6a39170ec125aede14e687dfe35444966e4bd238ce33bcab8d405082293f5d11c1418432782a5e11eeda3e0420cb17bc98592ef3686c2bc4951dada1596012f09c53ffb739795168367d152401a66c00e47773d082a39878326846f87a603a2a9978b826f45a3fa87cf0831a522ed6c20d95bff9469833b016476733b2e4a5c80d679da83e2ddc6d774fe43e426260f20f535335f0b41ceaecb074161ae84bbd8dfea2d5db860cfe416fd91c44038bf727ac699f147223f9bf5ade85aca11c7cca4efde73d344c2cc8efc69cbf231b511319c77048d0badbf35306ae62bb0a249150a782374824ce9282d3d8516992202f58d92cfb61d28151252967939b464c44c346f11402d65034fba8558fc8edbf59fc8fa3fc6d4d15f95290beaf9f474b95a6a11320fcb39f6c7a8b400dd03ddfa95625c38d4ff18d3da3f6658d4aa8a13fc96d705fc2ba5a0b4b7d8ee148920ddcd1f4d58ddb6d6693baefde22cdbe135ce102f9fdd9860edd61580d11403516154e8d664f0e3d5b900d8bf6969bd8efe574490abdc9b9183dacc2b73b2d8a800e8cf5ce9bc55b5604624e559307c1708bc8828c0ced423dc453651667f308baa3a8b17d7fa4d1a779976dcc7ff1e23c8086c13f4ac8b150988950056ae02ea56e71fcdd602e58bdad571d7ba8f9989e6aea70880782c4fc3277b251c18248e7b67b61d70b1c7c9675bf5b6f1e7aa7c26dc0f30d0fa6163a491dc238ff5e9d1d5d0e3363b51e95b84b52a7ab84ac72674da79a9aa22956704324f464dd4d221f86c5b936353083f8410e0faadb899dc0a156029f1858abf146841d9216ba33d9a854c47e20949017fd5ab93b727318ac8739e2c0530cea1ed45e84d5d7692606b56c445a42a651d8b63f4fb2755454fe6bef54719d5b806e9428dfd880b8089b21340d1b758b86f95cf223ffc2b895e2c0abb0b424eb5bc1d5e1c3e43d472588539856d866cd71eb2aac2662c5dab9956f5fc7b0be00ad2a78392811843693e20d34370f2703bbf6d1eb1e0ebc29de48e6fb4e2218cf69a009cdfa0f9471d8bf5343b66b4fa425dee69e2cd463211c978a1d1493769744d337cd9d866aa554d431aa81577960e360723e34c2407387316863334fc49047ef338ffb0161c509ddfc24e462b1867edd59e1f180271b41904ed920414e43c92ad09b8f50f4b32fa4a2bb059cba9b26549bf09b6e92744989f03cdcf41f35f3579e9b5a92670ec00e2290a5f67cb493fdee8726a29b61b347d09981d142000f701507a6a26ad78f297467f4e37e830d0561d0de2bcb0902f5b5a844f09ceb4be976121a05c59aa633a73119fbf14c9acf82c206af9803b0ad9d4f228edfa41500cd797b68afa2fd9fe30b1346c60d4573f8bac1211d9683f0d688c7a9e5ca7182d057f34c05bd3bd3ff3ef20aff513edd40385caec95275531bed7b0faa221c45c5a8b266a0363e021b107d136ccf5001b80667ca9512a4e403387530ff92727108a183bde8fe2d94040594c50515e81f8243b41ea8e3ea253a3de7b3321e25c1a34f9be694265c473f32c0dd6bb4be6f11b1fea809893f3fd5087928641ab3a11b5915de6122dd5fd8ab141f8a392802c2f2ac467df9eb7e3497e3e7cf9037da840a7c07ba7afe9fe2d837963325c2b2a04cac918548f6865b2dc3c51731934dd2974cd76751d27a92a039d4ae7e2762cd6d5d96942c2f07af464eb747581e24247e6a45db1a1bf1617cca544f00243300904ae8c1d053b1f1e0f1fee6a26a853a94cb2d716c1a35857d5dafcae81696f68d67677e1dba8c35f742ac3ef3a8a4ac0ea55014d7b25d7aa006f7b256069df23715f7c911be4443ba390883eca97b36ff742e2bd685df7bd895a4b0fb3243c4ed790bba495cc137be3fda1f8dae96250dc386d8d2ceb00a11b67f02952c03d46e4ccbd49b8603f1235fb6ab899fe98cc05bcc1bb31a6cf598e88648a7e9cb75862a074fbd4e550650ef891d22480d68b972cb9d5e1dd403d89ca2016c010db6a22db9426e93d2092d0103f28568daf6fa82c70af34c3c25513f8938e163e8cec1f35d6a5bc9b8c60f870687279933720318afa68d704ed0ccc6771d238c9eb86ce99fba1c796acfbe7e4f7abea09c528c8d450dabe260c800cb911e4616a624306bb28af4cd9efb5a16809c7b00b9cd9f3c1bf1a2cf012edf9dbf3c022c3bc9c61a508f8a0d30bfa97a9b6efc21a98b4ef5e09dd99a8d44d5ab722a29f20bd0abbb00ddcb6c5c2853c638e757a4e20f4850f8e3535f9a91e55e63efa10b6210fb4a6c30bb0a67fc5b3e12adbc7361b593551bb356df0333ec3a2ad11f10bd2f40a39ef4fd666b00e503abbdf90919ae7f85bb9aaec3486006aa6e5389948f4e28b0af38bccc5f247ca725a3c6aac06379acb59f341893000fbbc4cf264bfcb5152d50debb33c4e4685d5dae81fb0fae292f77cd039fc29ed2e2dedbeb410800f861735e5a34e79760bb243fba9426e460f0c72f53c78a1a1a2be7363a67c55a9d3b4f4d53ebf479b424b9a8b903e1bd100a5890329ea3e97081d59783775ec2f04bfa7953762da3aefbdba7c7875014dde4531a809a790f7c9554071cdaefbed2ab80dc3743755c4998b93bbeda5345ff5ef6f72c478c8b1889f60fe0b070c07edc7046eee88412b735b323d7512c6e5243a4412b1073427c7e214c033396062c7958f87fe6cdd22ef765b95d6df7817609259df341d6fb3ed4f72a1089ca82f23d2ede90513f970ed2484640e87a2063aed2fb0e907262871b62f69871d57d4b51e9becf2f4974efaeab92aa38f1e0625b48e3f942a07b164fa50bdd54fc252f45306c2f337b4bbd1650b9e5fa45d50c7db07d0cc3c016edcfef60531bc7113d5a1e0fa514c4f0465dc325dd0594df9b99b3e01b82fc25450b2c3780177b151d9f5a2b9484ca0416f7372100fe23e606e49766afa97925e7af303ba87ef9c50c9220e5e248a7bfe4c6c68b6b008fdb50d421ffe285b4d68596e54218a26348ba110356dd9c9f0716ed2fd4d8850c2092db0c5de78e9dd980411b96bca00ca86637776338159f98cf4543e86da32e9b647cfacbce9a8d4f1eba9415e5aaf8d8132ba4bc7bd2a0e709a248051b29633d596d904ada94381867633ea60c4fe71e3dc74c0350c2233ebba35b03a58422a4ec0e169292748e709087c8440a3df0c345aa76a8318b48c7e1a0f8f915b236048ce99f71a486951ecb9dcd151920c3bb98e3175bc5c1e667efa3e077d381ed16adbf3adc41c57cf49839da6d937b6fd8d842bb3f32a42da0b771d2acf51f28a1acc2e06c4bb3e5fabb1b35c28bbc54df7f420fe8c3aa156cddda291243bfbe652ebba662c03126f8391226a96facc2134fe9783d18869ba4511eaf05fd414ecdcc9f1f51eea10b4d610c78f9adcdf32b4ce34ec034a464d9bb6d88085efb18c3ac5a72d8e11e81064986a5c484a8e3887d4645567617594dfaddc7efa4b571396d50875c7460f755d20d951837a3ea1d8729e751fe4ab23fc7b225a422dee240ebd5e7990701b3bea4f80f9f4c535ede802e3eda20e618e25c3ba0abf1eb6dcbfe40eb910f42d7c5af7d25291c5ddd46083f29ca45b9dd82a93483c991ee710567bab252459d583b2873a5d7e6ba3ab88191d12f2d4a006add8044e56270c89fb647e8085820b3ff933d0dfca6ec9141f6843968edf6a2814d0b0030928aee97659d433e04b6b32140c67b6644b116fb32860847c68bccb16ff1406a42059994f9de6e2493ce060eec0280c9be442d9fa4d04a58a14ed224314e32e43560dc36ab5fe1044efff30e1f0aca6d93d6d81491948995f42bb5b08fa0411998bd249598bc8cd7b197e1220208aa612c6feb59e6431af2c975f0cd965c3fa128fcbd19621a498ed947eea5d0786fb2219d850ae8e5112e307f77654889fd0d31f9afa3e64c7b5638d9e040a90097abc0cf4be5480267767044be41bc43a05b9c8de291e7ccd854956972c41a6d0cc321850cbe693fc3381ebdffa4b74f49f8ae4dcbaf231af591abfe4b66b90b9bbbe970e1a1cf4d26573438574735f15c35f513c16da49e0351e9aa1d01868b0348028f8f529febff7432f1c248857f2d1d4402bd313ee22f99de755d7408e5bd95e585377f756e9eba5e0f379f6ee2b26b30bbdfff04b1d15ec2c5240e19fc19fd165531c1d31e462d19a2357a1bff39a058408be2d546e0c5e143131bcac8450e16a3abb9bf062e530cbee88781829bdfb2931f1a8c2f95cd5a3ab0ca84194ea187623eb8e7e4d2f75c6b3bfcb425dfa77180c066f51888b405d326b5365514ff777b656a73126010a8f615698ac711f61de1f1d3eacec6c116e13f6af87f769ced6c9e9f05a798381398d432625a77365e5010ce2182d393c44ce44d4664df39710d01b1a93a3660ff4d8a618ddb139da74a78038030bf5263ad25eac788eeba08ac99eb24d7aa80fcde0346754a4836d6b0a16c8c0cdc6a4aef3f6b9b514fbdbe3b610935ee692858f7a23279d129f880034a58787531481fa53f6b07356f53f6565d4d95c09984e8e8e20af471db5dd00de16d98f3279b8b773224ebc5e07e6ed1cf36adf98d30bb3b7ed16f69edda31b3dd7068f6ca64e303a41360183d33dadea133b1442d109ee95d607b59320702994f460336c681e2c987428f43368a05c05e19d26af01a4e2905c9cea9f84088452fcc5589b32132fab2bc480c5d8d3ac8c1a2a0132d5de36b1cdecc271b06120206e1e861d20f1f82a2e416cda7584af53a219d42a596c9411be96f6accac3c23ce7583ee0b6b4016a99070b55ebb736f4270b14c525ca44ae0548d24dedad997e7b1b49f654d7729b3be23801e7e99c4ad5da20cd4b77d61e1e46779101c8b6588d93b1da4bb28e7460fb59d52022f0f97b2bc73bb3028c201253935264b40df8eae31c65208667edb3a7798e6ba786061786f00052a3a315e600b4129875302d3b6288b47bd91c5eb3b82999e3d8c38117d66acd0e8c649defd937e239970bdb3a942fcb4e9fad66da9e6bd8b28b536454bc1132368b18f19e7a87d4fe462f3cda94dddda2b587e3093175bf2458eba86624fd9c4573abb15fa32fa6404287d3c7082dc741ca05013af824621c31b114f8e46d880178bffc2982068d88f33baa98e63d80cf61ac63c6ec6c872dfeb3d436fbfc48c589d99018d7144ad6b659f249a9009604377cbcce79d5374ab7efe433628f80afb6cb15a1363c9ab2bca9d47a948d6e1b9fd321e8a4ae74ee42e8c31608be0391ae6114ee86479b3382f61d49032c333a73cc8ee48d8cc1403646aa241026bd31e67074d1dfc8bc9617e88e8ff150218ff9e35f319ee1f1a035f99a57c34837dcd26325855fc5e976e44ac22a257ac50eb70425a37a597970cdfdd021932589d255c85f438d24798893435b2b46f17036d82599fa736a8e0e95797c98ce30bd65d3dab40a1895991c846e505173b34fc43e0d33a23fb706ab5defb39e224397e49c24eab7f3c3479eb2b389d98032a66a462c9d3aef4b587053191207802b3541a64299f1a26db35da63071667ff07fc39dcf68bfbd88ae60ad0f8ab7784472b197220106df5dd1e02db4fa50e48620aa19c8f7b055ccb9d71d1e43ccaa793e0f000b617afc6299ae1c72f7284bc8b92aab487a7871e79f644aebd297afc3bbb6387442af6b3488fc1946cb6037040046ca8e84ba76d2c270234d1c9218d5ccbbba9b12b1d8b44a6287eed788bbecdbef6dbf8e261cd7368bbbb207b394e2609706f7856d050e73d0f7a52d5bc4e85f40a86f9a5704dd1323735566e76c304bc16d664e57f70ffc20036de645135e45f69517d990d522c667108164385ceb6a99b6e9b37d793e60431deb78dfc084a5ce030a9feb82259372f976df19f36652054f1f5c697d3d4528b0299ee75d07bfef97e992c943672d59629fdaa687dc89d1fd5dc585ea878e7d2738d08d36e3243920e8a7c99278d386b954817e763b5dd05c5fce1a380499493688b1214796f1f6cfcf8c0b1a1fee5f99be632f36002ecbef80946aa4b5efc77a25e5361d62008df405b3f3f8010a333de9485c487e66c6f44a4466d66bf636128bfa8773741b195873b4b42fc037c95fcb4112a54a2f3b80dbecd989dadae80ee56fb345c2645e2c235083b93f34603b17a4ae0a1622820cee4682fed89261cecfcb3beabe5d146dfcea9afdbf571e51fb3bc77b51ad2a25b7c5da1ede4261f405117366a55d9036b303687a995b6644dd15bd3e6005196703eaf3d6858aecbcf98576a349cfc3f6069cd2db25c731a9214b9ed3429682a119aecdade611954595a71752f7c40ea211d4f4d980edfb7ab6a0e2d5c17dbd01b2f5cc02b9b74dffa1e2f2b46c3863f5444bc97b35f00a5f960103748d55777128be85188c512f095f5440f2bf9e8b650cfe78719b57e72159d0185ddc8faac5aa689713a1aab7165f35e613d321b8e5d7ffd5bd52293118060e875e5597bf725a52b40fee6a7076a676ecc9f893cda60817a5563b08dbf2c2731df806f8cd072c47d4c73228b51dc0eb9cf95f067007bfa601352754aa2cca628161b6bef01436a850120276abe3edadf211569e86f95c6ba17895ade1c8b87916f94060722928504650c3a65f5d3fe65b466f8662499e2b5ddd6b51d9b7806529f7087728681bdaa9503c45ebd69ae852da0b93288d28a9c793ac72c8002da4225a120613560eb35c636cb8e27c6b1df7db26dba1fc02f65b3b99c53d554c62b944e95e2ed2def70007fb53f3a60c106c313a56625959868c7e6a1cf8eadf1b0fb6e5bb45eda7157c577df9bce2413314f022af1abc6a52b3def6381c6f0c709d6457110b84087850192db0f449a9a4e01d67d53a077ce71a7cf043c3f2cb77788822f1a993a8895fab243cdbb9c07fea0a837f04019e0ae1142090d227a77fa1108615c17a5ed7ae58c3daef10392cad4ee388f3e458479f7fb2ab7bdd775e6cd5cc413919b512faf7781bd1fdf8ce8f074f26d67c06d1b08d109b2967c920050c425e5087e9ddc2478cbb050454d1a6c93c2e160b22ee511b3376d5da7249ce517f5e413bf96ad8dd028be22b737443f4acd654e5f20d4ac2a735dca941341c4c6d33b5646dabf153934b6f74dd603bf0e03f438dbd6ca6f85f029aa60b00ee66bf64ed5bcf471ae4ffc07b5ec83b00227230bd68bcfae8d9f76f4279d559f929cb2a72ec25715528cf2c02b3e91d770d0cdcfe55b53246cf549a3078bca536882a5fda69331924b75fa1d318b71ffd797f0af77b6dbe52ae23ba855267ccf2eb38632f0b2e17c62a6fc30dcd201f694f716e1cb55b2a6167ca2be6e798e18e8cb7bc94b60be8189fdff3cfe6e9035f0a41af8e9fcea25670f9a8fc6fb064ae3ae08bbeb7a6742263e058dc31ef77149ef2a5bd2885b3164ce3ff4dee94b81068b33aacc07c9281181152aea92a9bdb0a77a33379b7070dd014c64f72e80766ea1a1999bfec53a105d91a4cc3f4ee2c7855080629ed9d4447645a945f546bcae9a5df51dec621d96aaefa1e77f44032ecd19fd983ff7068755f4a49c5b675104f979ff78a7142d971d70822ce99706d27123ed2fcdc3d9562f571b7885cee3779ed4ae4cbf11f9923835d037f063473a2b540df22750832bfc56f4240fd414557af22a963c0186af2e6e610298a52aff8b9c2d3207c802fd0420d2c1c800962db849ca6ad0aeb6a860ada48277c8651c5098f20af0827c2cb04e1f3be637220e068471890ad032ca4c4b179c0fe07587817a10abb25e4cee9642bf866ff6437a7903a8b98329a61bce954ac24898b6361af07ffb20de9053d209527bbe8f25119cd71e00c9cd168c5c2fecc01bdf8d8c2d70dac8529650c5c7d5c3ef13a6320ce99a2c2bbf38830af8b0587ee07461749ad6bfdd89a7be829869a04a4f4873f5568f12a5414c58ef04b39d842f42e7403d3e53be0679e1345c10e8851080cedd919a90e7093fc6770031a2683e68c0fd6e8ae38a4d4107c8f10127968d5f25731c2b37f0805efc410f499dbf54cb679bedf6f90ab0422c2110f16d0dd93485bc154b468cc549d631d39ae3f300cac3fe5763eed0502d861746cab550057037be4c3c9f815ddd48fd177f7923fd1ee5da6714e689a3934e7b4e633b2df981a449b4e801ac1dfbba048aa78335aa42d5ca5d48d388b5d15dcba8c03ec28a2dc2d974c9944554f9113ab1ed9de020052d914a1770b11b7560952c1a74f274ab37abcf0fc7b36925ea05a3a327834e52cccb5e3599005f761cb67c1f2025d13ee19b8d3007d6af8d26f868d3737df429206c6561c25977a6b012e5121e6fe80956a2d88b618721d345a107f8b0e52e702e44aeb59ab5b106b18ba577a0792e3efa4c3ee4d272b00360724ed1ed75821510878af540da702ad1b1ff6a148f959944a6644b406274911063d5ab903719134972cd86e32313fb8646c1ec681d0ab0dd7a2c8c692b4468fd033c9c5ba332eee655f5937f7b2afac8b7bb5efac8b7bd957d6cdbdec2bebe25eed3bebe25ef69575732ffbcabab857fbcebab897dada77522e808a11b1a3c76bc16c035dbac0a5cffa4124075872171eab2fb781f0a3f38cfa28f6ed3d6ebd41f79a9297ba69f217181f5f6fd03a26bed00d4b80c6dd5330cf52eda6f7b5b30c2752819da09b6d1a30b9ed7b10a948fb1146bad69a02a89c89d8beb8be36bff50e83ef9eeb318506d651aab020abda85c85c2ad8daa886f5bf2f29ae3b9721594d1f0008cf1313f73ecf88e9c26f21ab96b07e4805e2f0a51a66ced5dbeda1e940b2d28162deda93f975e556b07b4b8c17931b80ea99c14f0028478f60221d48e1bdd6e93fb31c2f5b0dc24d6099298b968119139a08d2ec4ee17241a734d199ea96d007df63fb4ca563a47b439267003fd0fa194cbfa9748c746f48f20ce0075a3f8e19aa0ff0c3a94d77c0875b9e99d9f72a8d9dfcbdf5dd258a6348d26e1edf82416546c2436a87fa7cbb84715ecc62a0909b420e094576f646b0f6055e8b5577c659cbad535cf3a8fb3e8f181a4342616b22a46d6272ee92e037a741807b84e1d0aaf69c0d6597912e47a13386f18dd8acbbb471d2c27521ff6f7d9f1e5bc0efcf1b052c09501020f9bfb7117204d116a4464bfbab48a7ebeb0d42f0837487352bd11af3c131327f153f2a2ae4195dff29a6819a9e540bd3fc947ceb34e0157a0a0fe854d23bc23e375620e64e7f5f32f529181111495cfbf79510d4102cd80ed36a1853a6fe7d0fdba2c1cd9c17972a5eaf3c6a54e0e8f9a23422d9142d2dd11efd40eb1ce97e8cea63313b10b39a6047290f94d220f87548d404808d20df4927c255c44c068a514593b4ba99e4a46360bc5ff094d2538dff7a18a2cc4c71d11eaf133bc8f865e5fc771b6b97df45c9f1c38f8ddc3e8dbf4ab7bc9c36ad0c1c7cae3640acddf5574a1aef64637d5673784952fea1cb6c64f8915fe1f96cfca54fc865f8fb6548a3ff43efaba5f1e78b4b49f74bd7c888ff08f45a1cf3fc2969d84bec5b6035874c2e55c7b4c44085e7af1a9f30bd50207d4d330dafc562c61dbbd5c3dc9ee445ff6a272755513ff2ad3bcdc6df4a7ff67a7cdcb135475862f179b7132457e8df5f1bfdd0cd271d1f54ef036ace87ce5a204e4a5207f7bbd6756cb79b9a6655df69f60d33f7769ded72bdebc92ef7d1362a9cec541d6f6fc659a3f2e63b3e55b128700e5252ffdaca19abf6a2020eb7cd2a485c050fc089759fd407de00ff11c492bd4bc8de5b4a29a50c7e0c170dca0d45b0c0e0866e6bf4169dea0b2fe544452584b5a51767e525899f2d53b4d4583984358057a02e162737143496283d5758c02f84597cb85a9cc83be02c43c22b6a402c67ae4411660192b5ac099500b13c7db719c827c42c39f246048f9627f88a4d95854762e9a5ae1cf9b0c8c03229194427524b2f7503a2e5858c05069e2c34905cc22b3df0609902d4f22695258bf18a1930cb0f3f5a9c5c36211622292454575e48dd86805aa690596e371db4961c6e9614422d45c82b56f060096f4e3d940786bc8cb3ad52b0d9cacab0ae5679b58665307449a4bf98ad40d9c559180c9ead7d3c4d8a63edc381b02bc330de9de15aa8036bdf0cd4d92a88fb74b017b2cf766176866da02d05a3767575766d295985e119c57db5aacbb0fb8231a3ab1207163a4f715ff9ac55606a6fb5d6da7bad4029d5da0ac3a8b7d60a215a0c449b79d076bcf62a6112933cae1236e9cdf7f608da5dc1d66bbdd70c6ff8e4ada53607a9548516595966735cc7d85a8cf14b8723124c7754c7669659578d23d2a25d653f64fd737a0e597368022c2a6c4fe7f50964c73e8112a0306587f33a365fc043045854d8c69cd71c3ab339644d0764bfd49ae04a2aade81aab30ebaaee6ad24e456fd75777dd1785134589144d96184105efac326b6b192b4788581142a44a1c2355d8ac50c5cc09559e8c540913c48598d4532a556e5cb23071c182e585991db414647592ec684196c8228bb952c20f39e79c6db0b2438f9523a6e05045c7aaf246ca0d55625855a1357d5912a506a73749aaf094807a22085692dd963a6f8630a2a496a1d2048ba1b20394ec061463ab82c9059a2ab2941c91168955556b52ed2a03c1b58e806bdd156edaa394e292747c586f380ccb17457393605399bbce48d0a5cc5d61b0d0fc31333958008cc7ce6b23d2a27dabbd959ef91d86b550b674c35557731577a686bf4e7a7065361b68793c1eafce48d0611c0e0783dd1ac6b6866d8dea7eccfefa836e65b7d5a236d0dc1cfc757fdc6a697db3793bf0376baa1c444a29b55ead633bab301db5517a6fadd55a6bcdfa2921ce60b6edfe94ca14de5f1eb6078f2a6650a37bebb72cbf9695ec61dd923c7824e0ebb2421bdd5bf7346595d55a6badb71097d3b9ed2bbbacd086566b9ae51aabb2ba546178c7eb81706f618e038be9bdae241d3e3bb18b9ba64fc3d0bab5fec2292f5fbef9e68bfd52ec1463108738c421e8d7451004c14aab31100441ba0b9d7a2ae5d7c172d35b5986a17fa1b9fd5537bc2a33a4d8afccda964d37c96acfab335e5de255190f8743c07dd99aebbeacacb6743a876b519b9525bde585e1873bd73f205ce0e2c467f3d62e93cdf1f9270128a044a194b53bb9cb0a6dcefcbe329c5333a839f3db8646b654e1fdb6b88c49a55c85114ab0f96d6b58097f2eebef50a48a13bfad0cbb39625df4edcef761a1fc815e8590346bfc930014f7fbeadb7872a03dbed3b3b3e33b3e020f3edee323f0b84f8f4982cd428a8cc784f1388f6961d7a87aef1a556dbf2a445ab43fdb5717a28e85f6d466e589ea9edaae68792ca33bea8e22d507d8d32e5da3217a63d9d7745fd409071c0c06830139abf65c6bbaaf1d3170a1d96cf7f5e3ac9e6f19775fab2c487091c1ceea397741b84639acbbaf2331583451839dd5f1eebe7e4ca953a74e9d9abf9babdadc59f7d541b82fccbb46d557a459477357d857d1ccb3afb2af99f6d54173d7a5afb8869b74d5f3ae4231e166e9ac8e9778f755635f139e651eb61961918517cb3273e7a56bee0cfbead4dcb8f7d974cd504344ac57fcd7850afa9a210c1e44b0dfe47a751f5b006c0e59a7273687ace3b72635aa9eaaa99e664152fbed7f6dcd899f8bac1ed4b3e963cca68fafac759e92d9bfd27e2e9558f629f9413daff3d09a7e4321d43a9fc5affcca8f5abbcaf645967d1124e9107a875fcdb1a7d6b137b1648f1753a3257b7c3d464c663145bfd45d913d3e5384fa3de8e790ec11666f724d6c52b3c95004f0791d9fd6b4245c8bad68a2720e6c78eaec768aeeb1e31f4e7a2afc54ca24cbb1a4542c4310b45f693fdb81636b8a901fd7a953a749cc4f9589add13d29997aa2fd6996179e70b22e7ac58aa29ab27749b42eda320ba12fa9647b588aa3b81ef7ce6697ec819530d9232b65b2c7f7c9641fd903cc42e88d6b5f7de39a924e776557666dd6c6e3d5599d65217405c90ec290d695e581cdead7fca410ad8b2c1ed5f2207b50ebc2b4da8b47d7ce4f7960ebaa4949b8d6eb62aed5457e702ff68bcddb43f5f7031dd7a8ba8efc813eaf83b42e8263253fb0e4075adb7bb3eab12b9da087eab3d943f5d80c79540798204448788d2848f2a8f453248fb087a5d5ae305691d845d64e3d80f6a8f545d60723d983a424499264b5e10a3baea2bd387f60a85a657f4af2f84c6aaa2a0a724d3121d61d0d9e3a0d2d0678ddb8348a14c6a9f66ac9e0ca15a61e2317dfd0384c2d98ee08c053c7f4e5d7a8cc923f0338064f3dc6df2ba5990f4c324a02a3c500af1b9fcbb5e3040ccddcc8e5fe874c98da01c053a791ddcb5d4a85f483452592b141a344421c5f6f8f9e7a8c231cb4a12c7407a53b6a3cad26b9baa18d9e7a0c1c3db3158ba62e8dfaf581be5c77883bc5fd1a1131c1d298a8655d6474f5dddae17923c38d9bd4df1a451a91f0f45418688c8aa467a9c7a756b1c54fc97afa015ae33aa0160cad8172ad20302f68b06e081272a172233444442b57182232800f59690dfd76f79f21442ec808e14a195cbc1013848b81f3a1bda064de528f21a68b15da11f8e521180caf03d4a3d17bf2e625981fa7184eaf1aa234c1b4b8dd4428cc186b7c7434741ffc9c97768d5af46214f5685d6f08355124030b1e1e0ddeaa888c91d21d74eb48c2e05d463b940c182dee2e575212a966068d2efa767b1ee35f278a4454a3e10a4ab1b484acdfee7e84c565b432aa41e26a1c6931f3f9a66440df14cc87bea9169b019a5eb716ba832ed79794f4dbca74e878d5edc80614e22ec6ee9f10e16003e9f536a52289401a29dd4179ef146988aebe1d0037461bf2047123695cf3dba9057fbb4e688aa491d21d54cb5bdf2e2f63d02ed44a6b038de38f6814c9e760108031a44ec9261cd8b2490070782b0867b36500fdfa700a1c198cad9db24e83be2eed1a590f6f64df2f535b5a8b065d7ddf0c464a77d00c02800383a41b38008003c9c6510d1c462e1c38cc12070e1c388670b8c041248403070e1c3870e0488538401c383e0b5be120e9ffb8f6b7e4bf98fabe18832d10044dea1cdcb0dca07f7b7c9c4b1b9a2318ff9a5b84074d1fe3d717bf72d3a7cf2e7e6315213f568da19c1e14702ef7fdfbfd758c31adf9bff20cded9418f3f4a946c78d2bc089687f4c03e35cd520c6bd4a216f3d9595fb96998cf63b8f575ec2a5209dfb2c5f8336e9ced45b040e30e901d20aad6f8058d230c58683c6a82edd0c84a826814a22274310229f16264e110c2185551843e962d94e34f0c9b6349431863f4e101178d4340b08c91ec1205d3184537a16b6c21c76814d2d5a8f17b8852a48dc153af5f1edd6be3d2354f69149a179166fc1ee2615d3c75fbf5f79003e83592f1f53100289a1b4723b9b33112fd8091c6232d001879c4f0880993461597502969fcca1b1f25cad7531f96dfcd9fcb6d1f9b01184923708c3803af6bbeaa81d5344f1dcd8b1a546a57988a1a60ec8e4557c7a206a412f5bf43f9ef57db536c6a300a51a16bcd313a1dfc1a7780581d63588500c6d64cd7eff1058a51bc2301289cac0be31dd8dc20583ee85704a0e36a036715a6a3b6300c43737f65f939f60741d0dc9f19d2f082428822b54f36cd53bf3afb947bca387f20fdc03045c3944aa42a7124291d49caca492393d58ae9a9b36a4f4b6d694f993cb533eba2de8bb2265858542f8a77bbf284bb72bb62ab4c66154946f25566a39efae53d4db37bea390d0819d86bfb0c92aab5f7629c6bbd15e70fe7ef03c1304cd59a52557154d591acabd55859e46aacbaeeec8c958767a4d4a705fdf91929502d37eea9a50fd9a3beb6ae5ab6207bd4afd5ebdb1fb602a027d634b52eec737d70fe3018ba4a1c4925278bdcb52a5262913dea8b2e4de9ceb57567e75b0d75f0fd7ec15bb7bf49786bae424d2a893b75676787e6fcd6eb6ffbd65a4ac7382fe4686b8ea258516053d9a450d95880fb6a515f0d5b17c65aac3070ba9a1be71ff41e83525a6987ec017e980740cb4d14de9f9f9f9f1f5bc31e3c523c8e570c754ae513848342125ac0e8a2ad49e461120e938868d10b8ed828281b25c2f022fe8c40646b15c412d24324c96345f26805d520da6af9ec0cd9a1a14a73102d857a68b9b50b17d7850beba286d625244491868a5a37242272e1c286d20b170cf7b2a44919d8a0e0977151d1b535d5d2a1e396b6047ad182113496b6c280e15e96a6a954a4c391d200bf70b57f3cae37847ca824127d5cc4781131fceee1712344942c37202932e4dc3d36c9ef9eddd313b5a527ca16296f774f13aee709ae8749d7b3a4eb99f5d0de3a8feebe44b0040c91129e94c0058573e937cf4e083559b451c2cb09369c9b87f730fce6e9c99e480195440a5d1025e7ee79e1774fecadef1e590f1230094f193009d4dbcd9303673c4ee08ce7a9c6d354e3b1d56e6f9d07765f0a983d61a3218a0d280071baf09b27b6801a6ef012c596384f2c9c9b47f6487ef32c5d4127072485a8a873f3b4f09b87f6d6374f8d87890d1c3673deee9d1ecf0d2f0a84ede440980e84eddefaceecbe6815bd3762768829d1f2e464e1f70eed6d163e8091396913a6cdb9776a7685df3b4d4fb6182102862371e09c7b47f67be7f676efec3c7d5176927c51769404fdde59fa6c3b476c4870ba87db81e1626f5ddbee8bdeaa585182105e62d861cea9c26f7dcb45410342899a0c4d4bcead7129fcd6ba2854a0c989a2cb9228e7d628fcd6bbb7be354f472dd151964879ab9fe8dadbad3f9afe684cde3a4b775f3f6c40a3c3982968365491e13cf29bb5c31c2335784981290c9073b378467eb37a6f9b742803031d2ab636e7d6b03fe1b78ebdf5ad656fcfad917c4058653e202ca8d037cb89857bbb59b92fc66afa622cdb66ddde3a0b765f348ae830b30245051a175be437eb87132254a0b0840e923a509c9b6563bf595fae0481eaa14dae8821cecd9a3d91df2cda5bdfacdaf79bc514064e98396ff7aa975bb9c945ed56b99d6eb77bebabd97d512a3d2c99a19744cd4a123be4f78aca1036580c81824417c3b9573521bf574d396860e42801c30c6d4e38f7caf626fc5edddefa5ee1564f19ca2a4986b252b23ab242f276af969a7a4d2bd82af6d649db7d31608733b12880ccb9a18a0df29b54c24c11298c603972c512e726715fc26f32270117bab019028dd311379c9bd43d90dfe4eead6f92d7f39b8cca40c828198894b79b6cca31f2498c292f914b79899c6d92f6d647dd7dfd08c2095492208288a1a18513f67b1c22862070bcc8d00b33c3b9c73abfc71e8e224e58fa8108131049ce4dc2e8fc26636f7d9332fd9b4472662c7366841a9dc6a7b77bccedc6a6dd68dbdddefa08bbaf1f505e0033260a14386298c8e2f718fbb10465e50d12428c48a18a738fb239bfc7a51f3ed4e912b574820f6cd69c7b9c8db4b7bec7dac884a988703015718ee8468c7abbc5de4dccdd74b7dd5b1767f7b54193167628f4ac6841ce6ff1c65b4345902a9a9e9839b718e7b748d94811050c153244454939b708e7b7787beb5bc4894f780531095e41c9db2d2ee125f1c812124c53f5304d846d31f6d655b6fbfac194a50b1c2c4bac61c2d4fbadbabdd1dd40278816d2d060e4dc2a2c7eab726fbdc87aa0a104197030726ed515bf555ba5ba7054178e4af584e9adaa09c3544ab08ac92ed553c5defa56c95e3ce75621d9922ab305eaed4ee5dee2704fba54932e65d3ddde7a0a765f548c094ab2d4dca8018289d38adfa9d806275c4961a6a484364bce9d8afa9d5a4a8aa206384aaac88902e6dca92a7ea7686f7da76a292627709ccc79eb26e4bddd61af16e66abadaeead87b3fb1aa213c3921e9014f1018a8adf2195f3460a29e8b4b14264cdb9c3297e874d4d4a68b0a20d136f9e903977c8fb1ddedefa0e71e1d32d1226b9454225e19110c9db1d2ebd75b00793c5de3a68bb2f12d42821028e91314d3d9c6fac0c2c3cb1021d156610726e1027c56f70d664820c4cd0c09ca8393718c56f70f7d637c803a3d88051d88052c0274c53fc069bde3ae581331e6dd703636f7d83bf412461be32613ea8cfe9c9fcfde56cce1a55df9f94b75e7d7f57624b1fedadefaff6f6dc1f13143850e684e7ce6ea2dee65e53ce35e99a764ba0c87189d591218b9b73e7dabbf99d9bf2edadef8ccb4f76859cc4aea0e4edce47de66d9db9d97ec52cf2e65985d8afd8f2454b0f084993449b410e484e237bee15c096ca6d8414a0d52ccac3937d6b5f98d776f7d639eea378e3a83a39cc152cadfb869879fec30530f2ff5f00cd3d2d06921480c53c42173eecb63f3fbf63696f1fcc648a0dc3250a0de365da7a6a7b7b76b54ebedda6eb0fba26e8880e189203c175e40e1dcfdbe31299a48c2b694258a99d3b9ef9adff7e6440c4240c1030c416071ee3b7b35bf2f2d87ff7d99de26815393cc79ebdbba79ebf41ae9ececbe288e4e193a4c2811478a91f3092634402161838aca92c2b96d2dcd6fdbf496ca95284b256c8982cbb9adedd1fcb637dcd35bdf36f7f6b7850a814d42d92879bb54027b846791c4ea35aa0290924300d4557dd7285850b16288196020f3429ad389dff596abbb1752bf6bd4dbdaf4f6c9dbcaf4b4af330bd01c297a7fa7befeaeb233bf6bac0351921893822e8adc9cb3a703e1be7ee030c5943950b327604da77d7aeb0ab02f6df5adfaad009324c05401f224864a3523420d6d969cac507b623b6b133f01269ea0a110031c24be5426de7ad2f7d6432c7a4cd07b07f7d57b4a30abe8bd7345ef9dd28ade3b3cbd750f7aeb9d99de7a8cdeacdc57ff79d29bb5fbeaa51abd59b4af5e3ea137abe9abff58d17bd5fbea3f55f466c5be7a89d37b0546ef55eeab0f61d17b45fbea4353f45ec5befa0f1abdc9dd57ef99416ff2f6d58994d09ba47df51f357a93b1af4e3446ef71f7d5ca0b4e0f82eea0bb5a4436077dfd3853ce432aa54825705c41eff1f6d54b387a8fb4afde0383dea317bd45347a8bb7afcec2e92dd2bebad01bbd55baaf2e1485de2ade57077ad25b55fbea4038bd5536e8ad827d75d64c6f95ecababdae89dc27d75d54eef94eeab9732bd53b3af5eaaa077aaf6d553b1940b319b831eb100662102c483450fba2695c018f40e75663807dcc2820a0fca78d059a412e8c344efb0f6d57d6ed03ba4a37708fbea4259e81dcabe3aa9456f10f7d5c92c7a83baafae0a426f70f6d5554c7a83b5af2eaed1fbe37d75518dde20ecabb7b842b7b042ef0ff71589ffbeeff3d6a7c505da83351ef415a904d2313a7cca49522935924a5f08f5a19536501f865e645ff80cdd868734681e9893cf01e3ab8ba452b81aa2f717fbeae4137ae7dc5727d368a21ef4ce4d5ffdc88a3eaaa2775efaea3c60f4c6bbafcef3456f7cfbea2a2d7ae3a5afaeca529de806bd2feeab13d9a0f7d5ad29ca6e650beebfcf55a4d297e34361f6a0a74825302495321945ef5bfbeaa51067416fcbfbea3c4d30c642a4c863ec4536477e25b504f07bfcecf3198b901e8ecf1eeef019cb90349f1da43407fdcf3f52e9cba412e661d2ab995ed5a085a4d0426ef4aeb7bfd7359cbfee53e46a59d8cd71f4d931a994e96b0c82882a4c273e6dd2d7d97dede8f68eae46127aeff0c0be3a0f8cc7849b1cbcb3dbd19538e892890e79fa8d6e25d1ad25bdfd2b92ee7966b584d096842781ed152a7271d010ec17e3d1d9f81531268dc66768130ae5c6960d9a32316a9f1619240388a4765f9f3785a5b8aafdc0127281f6d72fcde6c050588f61587bd728fca4debd61efb66a48f2d2d778c616919e11e826438b3115640cd0e863a4c8d51a3d0c8e08ee8ddaa745e4452e1b19dca51ed1189671badd5e8c3e27e8608c4057f848f6c0639244c4061783841235a4310ed5c1ae918441341add4b58a3f6c39150920d2ebd7834b68450a791c891c6a40dac6f0c9e3a8e1645ba1ed2ea06d60ca237aedf211d5ee13502803dc90f83b0006536c70e6b7ffdd600308663bc7563048a0a6d367a222ddaa0aca6abc518e3169015fafbed0f16d1bbf6f2d2758ccd2cab2145b24311c067767c667304124e7a8d2c28b33230edd8f4c6f4be3e1466f4be321b2243cc60414e6a8048e2a4068824f705ee6a4f181f185c8ccf11cfa968dd80fed6f4be02204486a573070b5985c498ecced0f4703512c5f4c6ac51dca223108e1e9a43111049089fbae0503b531e0195871e9a2384aef21fa703463a148130f41f2710154dcfb1a4672df7f8d971e923e9ef58d253144b4a2a8124ecbcfbea62391481d14927736d34872220fae8a339c29094af9e5ae2820576d6154aa08244ef14fdc7f9e3e4e0e23204569d3a74fe737a8a0db0518feb8fc0463df661a31e7ba5a7aaa46758d2335552abc11e4b960e3c2350962129b494b089dee1cfe828008d4036b308a02080aa0c552d3117c89c366644181c6a969a9b1c8cb0600511a748afc5957ad1818a214e9168149b8ad03b7c31024d19e2f90edd119637f6034d77bf2c55e1dda62635182e0784ed0a316549ec14cb9db2be189606c0424aed14ed480aa13b453b8625c50531c6cc7982971f9a4e3167da631ab2748ae63844852b869d203b25844ce87d8d5065637a00738e40420f95a7935a0d48a85fc49cd46a10123975c96223c218a400c6768a4623bdaf211ef68ff0e18aa6d3be91428526202cda2442fb106577dafbd2758372045b2ba20a27b093041599a59387210f689aaf4ed37cad37c854819de28d71e88dfe7e7c96b50bc2728adaf1f2830f0d5da2585f76219820e3971e7abae46a9a8b1cd6961e769c8410bf50e971b3f2924577e161f525c6f2922488cb108d1b6f58acbe3cb16e50e296362b2e2f084dd981b2020385b8e50bcf1734998b6d87cbaacb099f53971d3035f0382d69215b75d98d5e84f88051417f8101c809aab5058990130bac30415cdaec7c81a3ea125ad3cb81af7eb38bb6d27a5760aee0c983a2f9eb99e41180bf2ed28c43bdba669ea9701045149a9e8414a9562044f108bdf7de7bef0defbdf7de7bef2582085dfd5eaf4257bfd6f1596d7661466f461131a4c86872844ef58a6c7853a4820ed7d0c04267278a6a3a55c6a58226a7c450a3f11317127d9d1431db68929784985a931b580f5b80b052c3152f4d0891a1d0c5f5020d372474188529851a195934686686115c4c379aa7071a737498c30c253458030d1fc064114289b468b7a84ee58659547b8d6c493d2a5c0358f34a95b000d5d4d6b54557df3a7f2cda03edf0f08103f859020c3728a108536476e070f6e796520980f6d0e05b8e51893a7c888a38bea0e8e51e1b46924c0e1cee03d5697bd788680972a5817b38b2b0628d667ee7dcb5504760581a87de0940cedd8096d8e1318341ce4c8ed584a7474b92191854f888d4c1e20de8722525e9d081556f7a7c6edcf89d7360e9824fd0d3dc2befcf092d7eea20cd99c3f31756d6f003b4c6469a25d2641f1c805a567ee7dcd1d78291a3df3997e5c8aa88c174e8f86f28482ba886750a3af33be7728e22a988101a32e3ca99c969518a21223334726672aa1673885cccb02e21275cbcb03d19b68e75232f6014a5c83630aad34a0484aece81157deb48c2c0c83453cdfda9f011c9755a58e837e19a6c7b2e9cf4475b4ab334638071a7259c409ea718456460e070abb73d8aa4722a928185bfa89728071933d6681747e8eadbf666e031b4ae22345cf94d6bc8f672ae675d3c349791edd93af49575d787dbe4d6f0f6c2c053e1f38e089873aedfad9c6b7d4b6f5b39778d6cd04635cc04e5544251358e729d9ccbb99ccbb9bc047dd95e96d3aa4243116634d8f6aed739b29173ad6ce6adedbdedb562d0d5451b556cd43832721dd1389a21a328c6917954fad1118ca3a317472e8e8e8e8e848e888e86828ef0d1d1d1d151081e7df9e8e8daa3a36a61ab7c44d2a764cd42d7dfd97374470b1801da88211ddc2333ade8ead65a1bdebbd383ae4e7fa0b6946e6e3f5bb424a1ab5b3c54a500b8e7860110416d30b6a0a386150d301210d40c16ad48c573952fc4087f8c782d67307c72783124c40526bd1085aa2286aaf846a8451641a1109a165e1de921a1e0096d0edf39e2a24316cf9895ca0b49d444c4e41495b5d6526bade57102e2d50d652864056695305d2fab2583ae6ead593a3d3afa196fcd1d82a795688e387413b3e88d49237a8743734826bd7108a577f8d4453f9a29a5d5fa11a2094408ffba682b136d710bb75c2d3ce2d0881a59eb460069be62f0d6c4d6459ea0776887e4e80bd6a1037b6b12b110daf196f76d39c49383c65e7f53dc3ba06e60bdfa036a55a26eeac4d76a447dd39d11bd513dbc2fd03ca246d52b35da38be6ea0bf52f9ead4dc2f5c14a93a4f0cbac66c8e15c0d0a24d803f9711b0afbab30eb0392ccc0df6ed83cd3dfea6b8d27e28669c6fb635e79c3375adf68f2fed83453cbcb475c1a754c05c516d210e5b5823e99e67f6558d91305ca238a9d725b4ddfd0f2742dc4459610d9b2a68e7e6e181dd170da324491237e470e44c9cd3aef9ea3c4ae80efc5504d8653607e641f29f57e0afdbd262d387ebaf639327665d3c301e13acab3a0f1abd79603b697676360701bec2412a0307090ac909e9e92d528e0786d4c40343b2f120ddde3a12ecbe7e2cc161f644991f900863c2a9e637524c0a254458d1c60a912cce8df4c46f243a728ea083c5942974d29c1b29cd6f24da5bdf483524a69d2d36e0ec6cb13187ce6f1b3ddc3572838bdad1d9c8e9de6a1bbbb76e63765f74ce2e0c94245084810187e6b70d1869a278a1810e1514aa9cdb8613bf6dd8a658d9c29b61f6f4c3b96d9cf96de3f6d6b70d9c8da71d273692ec38b1a1c4c6111b48deda58aaf56a366036626ffdc8765ff40b134118e192c390296abadf4745cc44d1030f7472330c39f79199df47b9a3dd5bdf47bc2338d40547cadba3a61dd8d11318d38eec684776b4233baaa1bb2f13d0e808e1b530c49a5b13bf6b8c2fcc00c68a314b4841e2dc3598f85d238a85999122c61421c50ce73e82fa7d147bebfb487684e44c8d32676a40d5707a7a5b23a77735a4e81a57de7a0dd87dd12c58388da1c1e996050de712bf6bc46a2cb978028d4c0b9018626fce5d4389df35686f7dd7a8d560a20287ca1c375154fc36eadd8c7237dd6d6744336a32ba0df96d84337a5a629464899112a32346482aefb7d112ad47338219c56eb9ed72456920ae281a884b8aeb898be9adab49c75c4b3ae69a69170ddd7d39004b18a614a0e4c44c29f39bc68f9a383b584953468b0be7a691fb4dc3e989ce9a222534fda0e6dc2e32bf5db1b7be5d32171256181a65586168406df94d23c7cad170ca3db16834b168d858346e6f9d06ecbe7cd08058b3242a4e94363689df34b2389145883a426e60cae1dc34646fc7fca6b1748b13850c11606290726e1ab3a7df34686f7ed3a8d160622d81c35a32e7f67b468f4573c3a24535cdc835e99a766f7dc6ecbe289913b2a8f1214b112b6c10f37b0603b0344161892db22154ce3d0389df334ed0c298326ed4f482c439f78c30bf67dcdefa9e819bf134c58c245328793b63a937e3c8aa87841593c18acd60cd88bd7519b6fbfaa00826624d3f2831c49913f75bc62d04298c78018c0f33c8969c5b0698df32ac44014514268ca10226e6dc32745f7ecbd8bdf52d8327238a8a8c2854a4bc95d1b4bac97872635ae564ac723256391945bafba24d541182841a26aca0e2c5cbefa21f4228b1c29423d2e0c005ceb98b9c7e177d404e99244090342167c9b96574f92d23f6d6b70c990c244b8aca2c29822a727a7a5bb42a5a15ad8a6e6fbd08765f3f5ab0a9d01405c6cc0e339c5c7e17c58a96a080e3846d0926253c9dbb68cbef22da5bdf45b522a61510382b2073dc44bd8dd15bc562ac623156b1183166f765e386266e784e20c9a277fb1da3056b604bb04003658477ee185a7ec768518598d8102266be389d3b4696df316e6f7dc7c0c5783a1323c999184a621c89818400bf632ced7abb18b018b15b6ef7d6b7c963fd36a3a89851a89852cc2726d35bb3e9662eddccd9cda4bdf512051e9860608384ced3142cbf4bea26892f724e80b3821929ce5d5ef95db6612288963558848039b769e5b7197bebdb949948969465969450a553f9f4b6246925492b495a59ae612347c604ca1a25557e9746cc1871836c061b9523e72ea9fc2e11a0029958094f946401e5dca5ed77497bebbbac954c2410382490396ea276fcf61e19f31c19d391b1dd5bf7d97d1d194182c4961d96b8c266ca6fa735dddefa769c3f9df124675c891f71246f7d69d7db396c177beb306cf7c57302152f08e90191c409e711bf61dc7230766f7dc3e0c188a202230a15296f61c0a8e9f80d638431c21861d0defa0bdd7d91b82298c4a0039d23ce9c46fc7eb1dbc109549c393b1b9ecefd42caef1730136868a20a981c8c08736e1845fc86117beb1b860cc6f8627cf1e2c5ebf78bf1c5f8627c718b2dbda0bdf5fda2f682690402670432c74dd45b17bd31e62237c65ce8c6d8eeadbb98ddd78f174a68c345052774d0183989f8ed82d6646ba24c992b900013756e17517ebbb8bdf5ed0237fe76f174c64592332e94b838e202c9dbed6249dc11893b17e2ce0591edbe7e144104962b4d6e548882a1e937d19a3a4880f1720314299c9b6888df445ee2388185c90e585819726e22217e13eddefa26e2114551218a4285480ad113a6b79ba8e946b474239a11d1defa90eebea89c18d03c89d196c4b04210bf8776bdb7b1b7be8964e26f22244b86ca2c19821a727a7abb8772e25093386413876e6f7d08765f0b10e2c29c3943dcc8c0c4c9f47b2836e4458b1055a08c00d9c274eea11910bf8768b9df43b52126b188101cb188d01c2137516f7d0bf544991094284b436b12babdf52d847b7b6ea1a7324249ca2879bb8596744247744248783d9e104c28f6d6836cf775c30a1caa843942892a2cfcf03b4886344070676ab8274c387710ce42f91d94fb12e68dd318d90d40e89c3b4817b47beb3b88f7f33b284ae524288aca8994b73ba8a916f4a416c4640b5ab205cd6cb4b7ded2ddd78f13c8e066f0c1851ae2c870d67eb7762c30224d19384f309460e6dc2ddefbf0bbd53b41899814363b30e9e1dc413dfc0eda414148e0b4cac0817adbcac15a4eb02795aca592b554b2560b765f2e6c479c18e2c80b39c4e1e1770b85a7a72f74c6186172c3b95b4f7eb7ca20c14687355bd238d970eed66c87df2dda0ebf5bb516d316385be6bcdd40291c500a0794d201a57440291d10d0ecbe563a166e4803c419294374f80d74013863a29c085143c588730339f90dd4642a4923a60d0a53a244393710ed37d006227f03a59200a59200c5f80d949a01a56640a9da4faa0694aa01fdc4b9116152c2071e144a9afcfef9418413283518b1f321c7c2b97f72f8fdc3a5cd169c962894f8103bf70f0ebf7f766f7dfff07ea252407ea2a480fc48f979f2c3e4bf7f9adec67e7e5ae8ee0bac193133d2c20c575c61f2bb05d01b1d7ac025892d0173ee1637fc6e41e11889610cae8c131e9c9cfbc786df3f31d90f92147eff2cfd2829d3a24c19a8b7bb454ee7a47b7aeb2d6cbc162d60f7f581182c68a09062f643104b7eb70061e643939cd8131dd4b95bcc7eb710df5c9133c37342b33b778b1a7eb7a0d598defa6ed1d4424ae8044ee864cedbedd3abb9a945d97c72369d6df7d67d66f78580a5248ac87d09724b72d2f0db8706d4440dae8b921e828039b78f9de1b78f1ada9a1ade68993224766e1f25bf7d6e6f7dfbe0f26f9f27383e49e02879bb7d964298cf9110e6832494f542990f2cf489bdf51edb7d6920080f75a61421e688955386df3d3711d0c014a11bb393c23b778f0df9fbbe9b8170511ccab93c1264954745e5d1aff294a86f3ebb85e5202cccc2705879d886156261e55d1e175ae66c33ce21d09c5339670fb3836176fa65b2836c8e38576b5fa83630abc456f9a07f39d16cb54a0e94e1a84b18417847d4d29684145caefecc015897104db4b84eb601bc92e8952d1ce8a44c8ea2b9c3a4a4a42bf50a112b67ae88155f81c7948736beb8f428da18a188ba321e01db00b221aa8711d8c03dd45a6d78f3f77d2008e6325f2ef385a3be813ba87a984832ceb88918e23187f9cbf793128efa421175350ce98dda74243d16559f06f718e2ceb0ccad6365ee24d2dcaedffa4753547df8c3fe79ca3f73ffa8fde7b8c4d807c57d0549a54ac9109442e751490f0cf038659a38021570c0d00d384b71a31a2092e0c02362fd8aad6313471c6dfd0e79701d3b364580efadb4d66a9d419cc55aa17d5ab5c6c2bb3517a746a9f0cb2108fe65f003c19cbf9c13e9069ada2cce18e38cb1cd6e3f107411b4a0052d686db6260de1e60cfad6299f28368bf55bff67ba28d275f1075d7dbb5c14873e389238a9f1b155016161e8db35923ba26f1b9f3db5526540660457a509ab1699f2ea9683eb6376b134a2aeec205c2408a48c28e09ff295ca0c29524ea9805562a5d07eafbf1e8e3a839edc1727700630247ceb6789a36795af4ab2a4174dfe11da0b470cf1cdf9fbbeefbbb905d5165c8414f4cbf7eb92290e9dbeefcbdff77d437c50a852da5d5cbe9c3535ca385586ba043aeb6caf945ac32ee2228cb355f9a6571e0fe071068f6d68df44dba755f4784cf9c68f77ecfbd8a957ba4106ea8d4b6f3b0e3200faf5d67dd5d835baae59a0afcc6d7f53a8903477a847736b51652a85dfd7183926e68112043cbeff4c1028d275728c06a9eea6e3adeba83d8df16355bf2e2d6428c0fe228ec6aeb2a96c695453923e9b2adcb8458553e154367ac6ca1095ad85ac8591f7428ebe4ebf5a98cf07a2cfe667a348d78f769fedb3511c7eb53ac3d1c2aff63c2730d55560bbf00a1e873e5c8fedab855d585a36b76c6ed93c80265d7debc83af2f761d7e31f34b62f1f63976cc2103f33d5207b4a058f2bd5207f372c4da854831c6617e0a7df97c10f0473fef285c23b5bc489b815b4a0052d903d0a605f45d867b7e5f691a98c2255a7e407df49ab196233ef9e76eee9fef39d7bdf099a62ee067d5dccb4da1505cbefac5929f7616cfac8bbcfb5174af8fce5dde31d5bf622e650848cb1a8325359e8a450ff9794730af20f792082210ff216819b2336f5e3aca835212040b400f96d6776765dcfce5812e72ab714a67d98e6372c4d507fe3dbecaf03a103ab5381fc578b8187f392c738aff0d87311fad237c7e88ecfb1a9a3064518863060c47e671bf89fa9ba51a4eb260bb6bfaeda523b82ca11355e1c2c8645fc67b6722ad43b3db674e8484a72b9dc5b58c23195c2f973615c77764138eadb4a49d314f8f6d8d46134222ddaa32d67247929cfec95aff98a75657bfbec35e36c861887f68abdd957e8d86c599c1361999f58a36b665a4de34cb339e895bb411e2de70c4207cee441df204fb5645dd78f7e502de1dfaaa5bf9e77a6fdb5b83be4c812b6b8d1f695107eb35ab15b8c31c6a6750eec8ddd3004c17d818e4d5bbb312f76e9bfa5da07f7044d0cbb46d7cb13ee12e55d1ff58dd92f3e9410ded837030227117df6f95c44777c9e3d3b766129a92b7bce395b2f3f6310fccbe00782397f1913d1ed1699eed8e1468de641df2d56605df9b3390245ba5ea308da3341fe4d7b749772d304ca4ec7e355ecb5c455872dc6d8baeb71cb5f6292141eb0461c5ca30b9a9f09c213aacba553172eca40e5e0aacc94199a1884af03fff2f7619cf4df119faad602de8b2fde68ecb5c7b6f491657607ca63c735ba233b363766a331fe7ceffc9df178f1d94ce128d275a22174750ce5779efdf5ec23cb1eaf091266d9ab6a374bb845b04e94ba3e3c0216c1d64981a5f2e99aadd72a02fecf6db5d47ee60bf49cf34de75c648d6ecbbab0e94e34a9add0396b9fd687ab0838e3c74f8b2e1e43b658befd957dab3e670f537447cad1e8d204d1839440bbc82a5bac5c7c968101b2cce4e7162278acfff36ff5d953650ac057fd7cde8fbd03f03f073bd09f724c7af0fd678640ebbccacc1429b7e073a576159a982265af1fd520e311b08fa4163a8cd161044937b43905eb389738b0d016bb2884238eb66eed35f1ad7549a44557fc1c971ffef0f8f533754b5b2ad211934aad16766c6eddeaa27dfcc39efd73b0c48185c61e9aa08be0984b211c713476faa0635209bc98ec009b2625c32b74c5a452e8daa7f559ebca5272f85f0b044b7a45950a3f103c7f5e6b0a72d21310d4f1d9afefd66771e5d9dc227c0ffa5726891a65274b7d55a9b00463e9d428bb58e6126410fccbe05745f83c60d5a953274cc1175aac8348a7fce739955539e79c43cf1904415095ca39e79c73c61cfce79f873ff68fc75ffe722633a59202d6a1b97d8c5da8eb73fa51a32ffc6ffccf2be9011da3c3181df0f898f75dec5f893107f6c326b6185b6c31f679eb19e3f2f35a8670ebd88ff2c250536cee1097ba8dc6bec311ef60d695cd6a82755d772bba7af863fe3ed387253d48b1c064cb633cd481c5e60828ef312f339193eef6ff9c86d7f53973d139059aae07b1575795941a81e1832b78ec2178c19cbf2f7c4a9a23703d3693941065dfad2e0ae03f0c8c76b98348df3b3bf59f7fdb07a5f29f0b26f4e7f7de1fbf2b7387a4b9f568ee96686e37b7cbc74173277d0bc7e6d6e180fbfa315be8d0e19394d4e372f1b8efb45adafc4c4ae541cf531efbd78094a5140934b399b307a08931089a3e28150f58ba2940863ab0feb9f5cf1c01a5f2d8ba72958df62342a41be82f93c083758afd7a756c7e258e38ba36207c91eed0644600fd6a8a703da01e8870df8650eb5435b5c2aa09b49af5d67a6bbd9ef197bffce52fe79acbecb80ce1f220bf4591acff1061b34d568acd513d9664fd9a195897fd51a2b76db24db609f734c68f5c4123a18729b720cb39b0ada2773d007827f550dfd78e537705505aa6a851f550f3943c0c65c7391b4f49afa72e87acaf1c9fa972c89a3caedb0fcf68ff1578bf75d2575b6ed776bde8db3f95dae1efa4cc9e925e23bb53ea5269f44af2105d15ba2d4155e9c3f561ca2969ef7710e4a486e943af3e5c1e0439a901e2c3906566608daa7360c367816652f8e12e852bdeda30a2f57b485f1acce4d08c3842e64a94b3baa6af1f26fca06b52460c902f50ceeaab5207c98113da7f87e2d32c2c54f1d60c47fb75112dec494091aedb26fa3a7dba6536e7f197e0cd0a284f049bc3b6f9bba586347fbdc8beecc9e6379dd30109e88e9c1f013720721ee85bb6547d2d43a821d41445baee29e87b6dd75602bf610883895600f6032000f682585d85d66d29d11c210707a03ba8539775eca1cdd1c3c1012892f51e6c2a5197f5035817350d409160d0b00de0dbc7f806a03b546f9d529c4ca43baceeb18b14bb0d4abdbab12f0eae11f6568dc2be89fe8bbded8db96b845d6c6197bbd839b837f4541942dd3f7cd0de833ec6071d7f35e957e2fba261a875cb71d2bb4c5fb7d8b1d7ddc53bab7b23561fa1f7d85f50a1775da2d6a4eee3c64a605dd5ec556b12b568ad15af765829a554ac1b6f9fc73884dbc384b62e1271e37cdfd72b92454b131504bf1c72dff7adf9c030950ac12f4b98efd3526b0ddff71135c1aa350917927cdf8704effb3e324c3e304ca542f083e203c3542a043f166a25a244870f0c43f013aab3458836587cdf6726562b1886e0b7c687effbb27c60984a85e017e603c3542a04bf301f18a65221f86d615204112178f5fbaa9cefcbe1fba8f8be197090f45f4623099c0c3174d0a9de992cb7a22f317ec0b9802b62ad50d91ca33bb253af6fa9e3268a5395b5a6a0bcf5daef0c73f1d54cd58ce4d252a47cabf88d1483210e534536c3b003324d5157f60cbb2fd2014228b4f8ec3bc7280e971f75e514fcb5d495f1d782bf5ec11aa6544ba52c9661d728c3322cc360e667af1bf8eb15c466a5481954855fb62b52097b8aec41d1fce798e41180ff5ca4f88a2a954a65f52abb0a16da1188488b76ae5568eb0feca9afd10e0e3647a52eec34bb8082b55e8cc35af4b445b4129fba8f057d83b1de483975f12b317551d7488d2abd11ba0d72f1966efb7bac3853574d6d153caed45541173cf69b0a2bc679749529fad2d788eed001a2b1a834aad7b1a21e540ccdd008182008000317002028180c8984b2300dc3b0881f14801072924e684c1dcae38110e3288a52c610640821001030440046888856001c866bdbc7ae60b7ab0e37ded08ce85554b9794227fc0aad105592e2d0ac20ad5588bd7e997a787d0ac6572162467f16454b7c70b3860fabee2e2544809d7e74e4e2878e2ead90481402b429cf5152a3757b8630e0f2f9d08724fec7c2b15c69b26bce93e87f2ef1c76ed24f58d8e6f000ce010a0262fc80e8b2eaf831d98a51e69f8c75dfa69b49f8f49429e32eb8b939fadd49bf973222c185542a788113e55a072c1801631e495f323a5a27416f8d9d5103d82ec980347d624a7d574b5f367052df2513e36307b4d6d397649c2c7f29836cff9e0088bcf07675f3e50b6da426b6c409d1e411c7d622af3dfeca44c528ceb15fe91929e3b2b0ec3c5768a6276a0a1b018ac64a11d11ed0022820560e6e4642f0ea959e42407db7519ac540c6d8cb594f7dea4bd338c24daf9ff20bf71e0ef67b3bf9f4dff82f3dd96954d315ad504c13f02d1a61132f4a0a8d11abc8a02b9a27d89e9564ddc4434429fee17d20442e54366b6430a64f25cec8b3b4f59f4b8e0b3fc5d03e120f352b6e82f0b341f48c3f39c6e6b6f5a29aa494da628fc124ad689a7c3d9d5ecd414ee656f680ff0ba5710c7cc3247b46cbe3757119f0e6c9228c4c927349fe4503363eb5a75fffa2035389f1d07950f741ba072e0a0240b1bf955d06ff417dc149cf1c387b89ee8847a74219a6492c0762012a458efe61b226eef96ab6b9a370d292b0897cd8c1d16cdc386d1f51d17215d33866e5fd63a7410eb6b448389e7f44dd152c486bb6b144a9c92afc409f23f443a3a9abff2b73ce26839f430594f9e63b0fb78f5b7d2222b88519ffe3a5d9d760e042100b425e532cb2275c54c65bf490e967d40339a5bb7458e43f16fb18fa640dcb83a3a27e1f21cdfb14d8a5317ef3a9db7ea31cdeec1a7efc6a19972df441340e43df72613515f4e5f34f91462df6b9514d567cf11f70531e89c288d43628cf30951feee2876bf97cc7072f3dc4b9683cc9057d4c7887dc300484298805ab1557e9b94672dc66dcc5167306689db4563f76b949e6cc07e8dbfb8aea7b6d2bd495a8d22ba5d70cebf2f80a75f402ccfa9ed34c4ccf729876238a16bd08762521f5d93b58b9321444d1d5b9b3fb79828cce109d9b84bf492d8b0b854189e33a8f150c150c726d3ebe12c9ea51a2d2541fa0ac7a0d1285037cb872cbac4a105efe1c77626e054e9305db92bb60ca25049891ce9f29b1bf1c64d6d5e1084381b766ec40e51cb6541ef757007d8677bb3a104ce23b23804a29011fef2c9e0dbec2a388bd246ff97e4634711b9e2c164a699688d9b5dd6bd1efde45b67048057d1b47678dd322bf0c289bfe4551e7daac531d9a8bd369b36445755135a6c2224c275421805ad4378ec83dd036d0134a6c5e8fdd0f89e91a0416512f6d4051bdf2e0fbf95acc8e7fc67881ac2031e97df81eb80b22d157e0333dce27127d238117546564313114b1976c3071f0a6982b35796a08cbcf925754d6d3b3dc25363678a8b1652e1d8e8d2c98378f1981c055219252e7b6c0ff3641878207dd0c73cb5315b96ed50713acc99e5a4956d073b0f2e6b4483bc76e5e02e79032a2cdd48b9990c492448359a6ebe373751e0ac7a370b4717d281fd7f970ed9248fed32bc5824ec4013a019e58c29d08773374131ee99b914806f1e882abd4237cb040fc06a5e5127cecc13051db63bf7522505c1210ed1275f1efd71ccbc12dad1f130078c12f2741bf097d96a17c6b982f552970e3d704c409cdc16bf4e35da688d36326288c6db8ba964237a3c7137b7894d96f3ad0cfac58f967d6c67c5d5ad01ebd502b29e3589f951833c4de2ba1758339cbbb12ed83c45893757cf5fb1a9345a59953056153c4abe7d2bc0a5922762685c30862ca4835a05fba66ac69c2492b4d6b6c295b947078365efd33a1f7580f0278f6ad7f8a26b3f950614d1fbe709d61dabca739cfcd2b7cbc38d9bcf341f42085fa60d2d956bac890d85918645e358408b0104684fecf2c8413bd875edcc68819d5def50737fb197c3394071f205081a5bc772bd43ef64ee7e2e9f68bd93660c6eadde722d56b6f0f6361ec01e907ad2faccef819248d9585fa2e7a84c13fd37cd5be2845c56930c8b5dd133f8ea586af9b4417f4650b2bf71ff625a1736ccf25fc3629ba990f869f4f7d737560b3049167fa02a07f585bf7d7c9d5a643f48f7e495cea5a9904d3e16ebe0b8ccbd94a78a3aa8449fffabf9aba0448f1959960d7189ddfd53cfd2d746d7c5f8052bfd8b58499db3f624c729ae46d2d5eb67fb15ecd1adebfe078594bab03a3be20742adc79d213238de9599e00cbf894ac12ecc5ad6d02cb169a5aa5a331bfee56be8ecc407491d4cf7bfa5308e8e5db028cc179361c599f7a6d5b2e41af005727a596f0311d37a9f22329cf1e3847838d3083afee8f33f8e809ec93e5e74ef232d056493017161ef1e20d33ca7cd467daca757f83e3d9692a0e90aa1a7c84f97f51b705e016a98d13a882b09526acd0189f1e1175271b502b26de13f25b38f2fd9119073c30171c200909dc79c5de1eff14b2dee0d793c3d95603f77440981eb86fa2a15f73b7e43afa9f472b81740f6c0b75393ee12f7b074d76a3e23a0df338041c939d57bc58f78e64a1ea904cf8aad3533647301baf18f14a9461b1e36c97838a5231cb21eb15e7ff96e964e9f78ecd9d32018849dea4a9d291c6bf33994198e768a3a2db22124d74716d024669575113bd089303cb59668963b93c3732e08303b8f826b300fadb67cfd003376a2abb7a60bea9c9a1f3933bc0911f3700d71292687f2209aec86e633b502eeaf310b03fd907d4870f12f9c15254beabeaa609150b59ebb383c53f0274a110356c98570c0affda61f532e57c38180081c1faf6b1c1879b03cc74aa0166f82fb7a35fa38f1441eaeff6f0c1951cb4b6e6eba7a6b40a1040688a00f5329a6cce0780ad785b928e2738cecc15b94b6649189efe4abb3de85c1a2947e9ca4c085fc9870b4ae770044ca9b5f80bc95720102b9f3da2f90483ecf1e03993f0000b13ac992624c662ff8cb8553307df81abde0425279fccb256ce5e4f0d6ae0482270c2566ee505005c2688ef28f027650d79b323c2436fcf6bd72c0c810626bebfb74b997e59469f922a2638e13c8a4bf81e982b57381150d7191188d1fbb615a31e75196566fe702b4caa3626af6f9b9b65ee4d84f4f383cf0afaaeaa167556ea561c966107cadb895aeed32d374592991835f09d1c677498e912d04828352200d453970740e51d5807c3d50fb83ff18940556b6ceac5c236b4c9dd75a5c126fea93780e4421fd3b3a033d9bd42df109908687408e4c0f1a692991ec17ea21530eda250387f57628b843147ab5c32add2f727920620c9973897c1457840dd45361a2d8512d4b540fd4c212c4251fd5dac8e282a421729b921b7abd9c2ce083c120608b1b9303df2bc24f7b65ea1478a151142025e04469c21d9bcba7703147cea7cbcb8c1a98479163c3c0691d1098e92c9487fa73597f50d90ec3293b552f4103a10687c48eb7e016db57b5610c370f54f87b51d5d4e0a32bd79881a9381e911c9bc7d36028cb6b106df3d3fa1bbbdf33e45df40d30a48fd5af1fb43ec150941464d604121af9cb1ca33e2f237782823178faba6e33e97555bd634ee57a2b7633813c39de40d72841f84941321a69a6e9ec1aad244023ffc07fef5b9c80e07bd50b728d0121a7b51acbc06a8bd6979a4fd4c490078aa257d04ec1b43495551423e827d7d612143af00fb7782f3a2574def1d45654c12e45aa5dcfc117f82a9f42b653fe43da7ae6ed6663f0460c74257d59791915ba47febbe1aa776723eb2b3fce91799c96d56b2f532ab635a78dddc5445e4caf00b294e98d7cf4ae1f4361bd57f7521073bca695324448a23f4e9c7297f29c9f28d71380c441a83081367b7eeec206e38bc8f165f964f906bcbc9704b3923897d719bb7bd63cbcf32eda4e750dc645a6bb4a8b8f8e149b9d122a9ded8b017bc018e56d7b716572e450292faf831f7e74eac47061b0065a9c2af696ba79f47019723fe793f998d1217f891f1f806e31c492a8d34262e837dc4501731487c9d3724fc7f705b26ab184ddceac7ef3b6004d7e5ce61e73d583f8e7166b25cc00b3108989fd6284273e87b5eb2f31a1314e4e18648f695b011950ae7856998aaa757785e2b622afa89b0e6f52a34dfa4e8739ddc0e599fab1f5c95f8cf9975a02241c3001ca49e42054166dc6a27edec0010399fe03ff907ebff87c0fac06b5e5ca10cc274042f7afdf4a506478605047e9d5fdeea0fd1f3ea50d8d2583c6d1f4546c3b37db2c58701fe7072086056e3cb14c34e038772795075bc9e446033e61bd1113a80a2a3a2812f438a2e407c76f5ca1bddd709a7f49016ff1662c9998d384b80d67120a7cc1f817e7c4cf18723a1d4873a813287aa8578214d913337d4496a890dedee26f9d51dba9a0b7ba586e2c524af9a46c030e93f6766063e2d9c161c0a3d9f90ef85c58ba24e26a190a4bb5978ee460fcbcf28f758a9290a4cf26508a07b47d40de616907b3e378b6e5bfedfaade3334b0db6389859dca7eeec4eaf863654edcd9045a7e4400821d20575ea7991a5047948d6fdb4a2967fb6fccfb2c735d42c3cc3871b9068d78964abc826e85ab49b489bd5b4be5b4306a699e11e15c6a16da0a4a8e04fd484f92391c8728b9bcb7aa5038cd7c46b4d9e0d04e8e8f937a7d1b450f3e395489d19e060b9dcd041be86720b2339101f60757c707973ad5c4c82d8b8e280b426eae11cafdbb33e4d95a52f3ac3595400dc809b282410634e2064ab9b44f4b778e7b510bf7442428fa3fc0e7f266165e365047f82c0dc93bfa0dba0b640152b4a978e0232cc17056c01c41d4734243798e4ecd042a8a581e7884c0d0d610f7685fa2d36c0995ba2a36c16052aef7159192ed4609b698eeda6a9ef884c7243814a4cadd45b6c44bcfe30e3f625d45b3458654e1698fe224ff24ea4d99623e0bcb284a99079dc7af50b199bf0d408cde61301aebe2ec1a83c4b4d0420308d8a8d4b764733be94b882b4b4b3421461e4a713f1ff7bcb2d97dcb6d70825265d291f88cf420e8accec48cfe668ae3d9d1ff06df0a4a0effa31b6ddeab5237ebb1c644af89cc1c99d52c4b9802270d595e5cc114b73144afb50c9f78b7214120b1f047e6bb02c7489f83c3eac53ad3b9ab3e017df70959c2b2a984baa4911c05b6cd49e060c7905ed54571f9d1e9489e44c65fe97470286993a09129860963fc20b4f0b1400c1689842023180b0614dac1f4c146c12188a6632c6c5b18ace15d2e34275af37f03a25bc3741ad8a6830d737678416795567756c50b98c4a7034c17621144bf9c6104cafc55e5c131cc822f9168f9c2619845afc9c637f633d164c2a889207c4ca25a814a396a2a8faa0c39d95ec1de8b94a11bf10726a1b3ff68494a6788fdce565c36deee2a24404d8768bc82085149ce5743d855fbf24ac4b1f41bc03d80a6b723e1d3062742fa991784a8690cdf6f629b14522a6942ad43407cde5eefa66410644784c31ac837341fa364a585452afd4fe1786a978a740759c819dfd25bb9577c84f0490aa3779c63a558d6491e076a8792b0aaa913441944cf125269cd7614948d05d0b7a2e4ba925ada979036c3e7a5f9ad86545156c5fb28bb3e662fc8aeee1f7e742c1eb3092240d056ce4e0781d769752ee7b6687291561f2609ad3ded4b4a01ed27271a33c54e7180b01db5b5f8059cc9224a04d8ab23159211414f08321e813a5d08a19612f691c8d104155ecc34b8cfdd86d9030b0a16055c5999f8283e5964492b23cae2543580cc1c4d683d6dcc7dd94b137295795cbd81d826bde1815df2415fcdc2e28a902f4ecae2e9344d40219548100662d96091919a5e3714b0813b310325d23d3a3e765369cc7547e45b62ab74b60891562579b3182f0456926b84570ca3a6853476c50ff1ec425768789d321eb5cde98a0231e0ad548b19c9a8106c6a8a975fb2cc72cb700996fd638e234b146d2988474a4fda35200ad9cda8fc80332e00dc4afee44eaa3036b7c9cbb9700b6e9afad502209fcfe8c0f20a2155b53ecb4e2ef51f7aca9dec315222cf96d4fe9f271598619403a56654a4713d03243ecc07b34735a4bdbc941d23e89003e1b558d70dd447501fc229fec29ef6f9123b75ca227714555c60a9f1e5585263077d09cc441c797c2641b01ff111a2794084211144cec689058d370fec14f5538820123a66d73f427cdfae26f972c5c8f4c630ca3c7907df61fca5e49fac9639f4240551ca104ba7e0fa0a8373f460c9ac3584b416114d132f781050e9703d7540b59771528f1b2da345ffa048a143a5a52996c0531f3684ae47ce21fa795e18b8de9481282483445c7bdcaa4239e0e328fa960b58d56b106db3faf60f577a5b059c4b41fbe540bb79e3af44a782cbaa55b0753b20f2ddb21f18f2409ca1b23d4286656c5e4667b6f2d338ee5e7dd51dac7a1ae2e98110f95a50e5ec9ea31ee7ecaeee232d7e31f68f2a448697d555689058779f6624d5d74d9706ef0f7fcfb509c70364b09dfa7ec0a0606733b548d02b3bd087dea130eddb3d09e922cf7b7a4ab8c949dc8a2a19eb258d23bac932d38c689bf23cca32db1e0610ee8892c9fea8085e80e11f8cf9acd73fedc9543aab70f774c6b517611f8a998e5203a80ac4ad0c290206391e9ff31fa333ae36205e8fcae9e150062d02d4f5fe3cc31c925ede7fbf61bcf17f8fbda1618cfb5884fa90192ca517959ac4b2ea4f65efe7a10e1e186e9e01556cde5f65437d074492de799f2db26005307b3c383a4c037b837d1f515050389901f35adf9402d94b60f589d60ea1aace38b27fa6526cde4a92397534fe368b7d7dd72acea43594446aaf9089b2ea575b99071b68e9b227f7debb3b7acecd02bd186aa38fe4a2320c065fc7e4a026fa564a35e21fb2900300df8765ad4e56253b0a3b612f80f8a7641fe10a6ec14ea9289897c3697c4da92aceb4aa47d56a4941931e3a31c499cd62b2b2c135a0c24f126f3809608b4c991b836e3d10accc4cb1d91562c7796324d961fdad55373116d91c6cebce54beb3c088e1b971eb25e1505221c9c5a5c0952f45115fb8842eca3f8d6404f9713dd6a869a4d745b2a47e711e14b0a2a9184ce6fb983fd5b823134afd2d070a202554ff58135a6960aa3f777207d362c84bf28882d3456982a26ff26dcf39547860c2ecb755ee602945dd9b6e49fd1c00aeb5e0763a36407b887e00e22392ca90e71f494e6b3f4c5c86b435af2561bc0a1140a849add64412749bb1f9e98ea8c991fe07639f1cf3d9234f30a45600782d8e376bf67e6ff12df585f50c86d1f064b0002b54f8fe4560c8141588b5b1b40b501f80977ed3299f576bc63ae220b2e7336596d4c2ad0b86e625d4aaae7c05f4a10a261ca14d095150d7986090899f4dda86f08aa0f130a510dbbf83e6431617e22113858c842d52251092fd99dbb795d82c66976ae70930eefc147426d7c906c584a091e686f735b1282eefa586f79caaef46fa856dea13744abc8c0d1a1517c951d707a9247181bf68aa116da4025d5f898bfa730c1e7f6597361387405e47577424186b84258327781fdbf392c601579175ec79568bbaa555108065f3f209d039784e49c8eda9ca6d366b4822032594fcd0678fc7f6dca4e3f167b693937949756a2e34373e1071b6ffb68d3d4511dc156b26ddb629301de020792584d5b3d3ea18140b9da6926acfa9c404b35aab524e687d098353bc545ff457440e57ae36b2b8d34e5d968cfbc30c6a7cefb17c9d9e19a59123f85726bd224c97dd1bbc5ddabc4c7ff1a51cfaa21f358b2d109b2e313d34635dd6c7975e1daa311b1960e24415e62354f6cda9192d47f42ead09d3bba3d2a632f989e82238185af2b052f4735a938ad071c4b789f66c8d648b8d8a4ac356e0002a418c075947db718b7bf82bff340e35dd629cfd956943324bfee5bde9aa7ca456f1a8f845f8585b414f332745117f36b7725e481f8f0e39a519d0c41eedc18317d66007c75aafee8853544cb0bcb3957be5ff922c7128d1cf7b402b511c49259a2e966fb058789b9973fe3e71fad7ff39f487dac88820c4f83382ee2a36044360646d6ea0ea5c86a55220ad2e4bf63d2b80f148470f7f1ae87d3500f570634b6853368db047c9c1b37475d2b4f6923debc16efdd5c49765a644235de617e22429fc2ff05164caaac74da89f869f3e7372794450771791d7b971f355ad3edbd34c69e5abe9051e7e458939b9598256bde1a657924f1e908820684757ca07230e8a13ff8278de1938276aa540c98cc64905c5e30755a3dd8d23143676c1c7776818024bbfd89bda8b92596cc753252655f40a22ab653ae12510c634f71b1cc9c9f079d1f0a9a9324a2eb010839d1c9a1928277d2c509f5aef58dc7b5cfb22e9f3e1a0495b7512b7933f51b7635822c66a383197a85ca167309e685561e9022a6d970d7cd0b06b071b91235a35b86c04125cbd4d13c5a68ff6884e92f6eb960e684d3030eaa2a8402c83c0dc93ad74b500c608ad6d50903127d8da7658d68940b1caadb20e816e8ef86309b99f163afe14d60ef825af73b4365a6718ac37a25d9f1aac25e04484ed092bac97fb2975e88758f381a257a2f74a836fec5d3862c6a235ce280534b8b9dbe31cba436cb88569b7c668abc781be8bbd0c3d2fd2f9708fb560cfeba5876a340c023ae2ae9b6f9c0cb0453940f443aecf15441f40da049d1bc645b345c52455d7b670034d4ebeee93e5198eab053773db1843ab8d1b73cb3c6b1a50b8815e9771ef672e1e36219977310674b86eb1ecc7f718fabc7b6d8bdc333e1b0b34f5c3ddf84ae6ce5fb92b5b69b5cfd0d7bb01be79aafbf94c317533ee3e8f4e176e7a2b16ee69587a638af57141e9fadecc8421d392a9aec6838e7bd88ddd186a651ca875b19fa36bbd3194fa6eff8a87f3f010a38bf680676e92c6dd7d96069a1b380cb9ef8a730ba39e5ef78cbeef6d8cfa3255b7d0088fa3a186fb4c99b022a44f0e2ee4852c1a5ad82bb89ad4b7ae6a593752310dcdd2889ce05a2c37a9097648a11b8727bc48a6a3ce7d00902a9eae7c28bd3c48ea1fb1dc789a9e09ac6758e58e13dc0f24094a1183bdc95b3104ea6c94b3a43bfafd9780c6341d2ca580590658ebfcaf35384406d7df2aa4be601a66e35b4c74596a641ac490fd3d05b5174f764253895fff84787f64de467bbac9e8f739958ab23c9cd67995e62c04252af2269200a56a6cba25d7a44f77b04f4ca9301230687d65a140622287cdf2604613308a55616ad2e43348eeee6205a7f3b186eaf892916c826a7c0873294075baef9b600759854fad794ff7e04957e373338a32cac4ece4566dfd6562aebc9cf5b782bb27e4903f37b1577fbe3c4e17d17153f986cb9f29e520d110a6343d770d11b9c03e3e2c69a9a8691e65ab8895b2faf12e84da04369765954e6b0ad67e58fdd357395fcd1c3b60bcf0e7f0ddf00fbb5b1952718bac37f9bdb02a20e094487319614b6df000a6a9d43290fb9888901a86c8a6ec74653bf0dff9e6b4287115f10f43bb109bf476257f742f556580a88e690dc9858d4fd1356a356c9eaf81f27c5770bbdcf923b0f083138a6f9b7b9425caffa9224c02953dd9a22b281bfb03202427db90b9f1edc58d9cfd4dcfc7803ec81da800dc6011789ddb013feecdb19058c291055a8570cc27d70665180945f348584ec83dd88b135803c3a94c793e6b97fc5088e90544210ab414120f8fd7f7580a98610f9de7369a9b8827969e0315b47e18e4c74b50e9b89e60ceef6b903e8045b4930397be8022fed4ee8e0754ad3061b99f611226a8720ecb334c2dc97a2aa200baaaf9b32042264225e9372b65ba9c7e14155899b325c4168313b9c915003622ec0a75506c8ce2f3df09fe1050c1e8c985179afc9964b02173b3193a2160287f9138772b7ddab8b28022832bdb10b7dc5b70bb22eeef34894b0be0be51787afa9836fd46c9b0ad1b0667959c574d1100e591d0b760816d58c841d5fdc0eaf87974e3b96dcc13ecbfaf2770ad19c86a5bc2e05ab1e07dd9c14b49c04b49602edb7200a315f02ac0659924bf690540f29ad201f735045a40b41a49a1c95663e96d4ba43a26cd39f0774b6cb348c05f44f1e8109b9a6c899dd16d553293cc9a0c30852fda1dfae0b5823538748d15552dd90664e8e4cf2855b6b5ab02b18ca18152ec5799910e5c3abe0230b8b62a61a6e80cb5e78cb253572b23e782b9682260c9801e2628865ae5dd88b8c3194d68079e4d814f1d02e5dca527658d88dbb42bd87b6c2220718067a78d115472f7cea0cdcc216e836543b198c69afd261f47219eab63af4d9e21c74a30158354cb36cb8f78e0564a39a682cbe705283920402c0013dbbcac03fff6879ac96e22c176d9c2ecff51af1dfd33338922e967c561a6e8625252fc402345a400c94e0a2fc5683341cdeb2eab1f54f8ad7f0e130bc335bd17ab09b077e6ddd6acf026b0f2a58b2bae9d9f887551511b871ecf3d8eb07b55bae2c2fcd43052737a9d0895f18923cc74c4f484c8e8ed0322665357f6f37f8b800432964b4f1d3cb595829096daa7ff334eb2b059f3a88aac6d89b7b246619ab54836871de0f1eb4ccbb70a5adfcdab87d1f4380cbc760017609dfc7fd6266e62b5645a8d0b1963412714dbbdd7103d47ca336efc0f437b27654d1a0d4f071b809f37cbc0913d3caa54e1ceb001fa700f6c4920101be9b3f3b150a53f34e5c10b2cfc16ed57065fd7aa8fa83a0e532088b432753e1af622232c8edb637f5102c81a7a5a31c12e9cb7da06efd3f744f06ddae90e8b1b050c8d1c197434e2314e066d13f07196b80ce74aacd9f40e45edb5182c9c1aaf5cce05bdab407ba558f51fd27ffc05c4b8002826568a57a57c8aa6a6c71c85bcfcf371feca0ec5720d47447f2c43c2bc165b226723c8dcfbf25b5cb7a6fcbc0a91445dc24dcc62067cde258f7bc7cb39822738fcef61bb448aae86aa2c48f28fc61b566eb6c8a2566ac02c0bb86b7d20047c19c489dbfc5d1f732bb9fc310134f74cfc890fe83972514db1f883daf4d6a66764f21d8fa5c3f2dd8df7dd8694bb94702d34baeefbd310a0f7e46097853702d480cad4e4b359e5f3b02f55a994edbe67c16d69c1aba10527f2c1f2b856bebd09e9db603db5c06aad2425a12653727dda8dd89bcd0e409b7a955f802aba752ca392c430c408ee9cec5efcbebda85487b240b6c36486b3dcf4ce0a7f6d33880532ee79d9084eb6fbe1ca5fa5799e1713698ed06ecb5ee6020c9468abea5a33596c6d0c8a94070cbd2aa8fedc900dc7f42b95a2335291b574db891b8af8bc5e8a87e330ea1b8f61d4d33f418a6b054cb81057bfb4b803da42e801f5092fcab4dd048d59bf0820a5a001ad223f6452054d529fdda0031f8568dfd0c3c3560c896d161c94520e548669ce38f180c91dc2cf801619bf033b9c138c7a7063c83934f19389fd99eafc42ace807628a4b1328d03c44e3e5126a445b6a0bc514911305101b5e3aa0223e1a2d7b0ff122fe885d644e1240365866336245fe1357f477228ac94902070245c0495048a07936d8cb4c3314251023f530995abe61d2deb390442f1bbf07b72d80cc68b044408de8d460f97fe2b028ed26a0e90b86395a462272c45bc9ab2ed262c7b3a09d8711e692d904c28585e468b146917f8917b9971815093627b0baea36462cb561dd6b34e960f99198c6dd2458de4de2d149b03af76e564b32bbed15c5e79f8a4effeaed649a5dcc07bbcc55eb0971b31b30698e92ff56f39f4b69d971fd0a9f6ebe1c2a73362c7a7f190587e14e7dd4dab9db3e71171286bae9f910b3747fb0bf6645bd54a9cf037beeaaf6ce3c330d4cadd12a486b864398c2ac4c41a6bc8511bdc7c846b7587dcf892ce3820d761e0c49efac231e17888e58bed96aa3564fb165ef3180b6a07a1b79d9a7942ed053839f0f94d1a8519bbc81710600f0c30211c3b9200420705c6f9cd5b1e6db9c99a80f1ca0252b8fa073be28d9700c53989aabda98268c53665950e873d09a31a8505f5259520be5b0e6f14165b31c14fd4693f264e74c936199653297d8b60578a49f0d52f25370252c70693a5e9831d50e1c60c1fa3273271d104551548bf9b8978b04c677351ad33e21f54f76a96b90518426a40b0cf9d30780a74316ebea3c5e2b1638e54d9bc74354f99d20b001a8224ade5749c1268804d9962429d02ba8e60ac311c8aad1ec7f46f7fbeb2e6a2334b8bc83861e5c5403e63cd8ab8dfeb31e4cd8e574232c4c49bc02024d07f941aee517adda15a2ae92eff456c644e84b77c4780bf4978f28db8386adfd8cd802295ecd417bde2281f7d28f7931dd0a36ab119eecb1ec2d1d6d99e6fbab3c182f6e491c37bbff911645c427d49fa7871e99b59e66e10c80b61891c88e981c3d36913238aa931f93107b7f1dea8608e346f1a46ced3afad44f149e4a942b4caa52267a2e941b28c35500158089f34047f4d5c60c53e5e89048bd1dffb0e2188690ab4a8095cc61ab0c778210f55b7512fee6b86723a0c351d65af44ba60f5415de37b45a2f4a02ec55d3116df18b2747cafe42bdf1b5bf7039b226eeea6bd899073ebe95bbce86bb63653b6c9987f73c1e86661000b7bfd56f3f0e94807ef5051c5370a0e367474c1acb4863613818c85f84e208512e54a9ad06ab048a4dedab49c19d5a395865591ca3016fe784fddf958124a39ce94ed7f3d7ee593d7b9d6b806f0f8a1eece9b49d0eeaeb466dbb0c820db74deaa47e48b192bbd661e10917935a6a52594840fec9ba15c6920028c1e2a8634c3fe5e41c87a97f92aa1696d703ae43555047337a41b033d4d2d89ff83e02f9764e76472f1e5d00a26d6e9c0ffc23779af102db95318e39c4cef53b8428db8e281346791ec7b698b97cdd725c5c9099638cc8906f67ef505124128e6929b2d2c5690e76cee9ec3c5b3aeb782dfc2cd29deb850b1215032404608a55e2fe5a82fc5af58467459ddef14bcbe579cbfdf03b5dce08669ddd5eb3c244638d0627a9d23971153b7f5915caa5e91f23bb4f9871ce31c114672c2b64bf3810fb1db69a6b275653bf55277f74a7ae7196c28b28497597fb06e464887c63b5de4c025d6473727e2547c7a5451bf484bc32242f1a7cc7678e78b79a5a912d7ded4513fcb62627e47b5a1cd727dd89382a892d626882c0d28bd31024b1db67ce73d1536199134ef73dbd263374faccb29966812f78e8a9425b050c9ad7b57da4283506b4b6556249d5554d6edb38f0eccfc8b2616f7857337cd0ed2f56bc04ab2daeee46867cd461c0c11b2407094814f2d37757935e3c0c75e3f6f54d26fd81977eb67b8cd321205f6f09be91efa3aad3f00913a896f8c6b84e1abf203502b4d4548215ede56abed560c5b80904af474ca3416fb8ac68693eafc7a763cd1c7e439288a1d83754a021b8f2548e6e61fddda557e819d0a97caa90894335df650fd7beee482d6888d247259cebbe1e1eac2a6e22c19bcaa004c682daf0e13e9d7003d78a5054441b04da85887e10782df943589c0f3725fb34e0340b2408a42896e96b4c06202d323fe2145670ba4710a31cc409c857f232c8678d74c76a25b53439092ac91571b5776a14f50af85a3f56c47b7539baa411df9e06981290836421a7e1edb0db96da38f23fd23260ecc5fc181171c874a18aeb75ca2f0a9c7a2a2f5f2604b08244fd8e736b3e592f53616fcbdbb8601a074168ffa9a221587259cf974f394249200eb30e77fdc9f38c5e9a9ed8898937771a1df41f87de2f421a914deacc1c9ffe44d74adc8d6d02844ec73ed13e9d24b93a869073a6e2867a50aa78c3cadd2def4503b2965cc19793c1006696160751db22d19678f5535e7c21cd69e5f0d24043cecbd92237983f8043969603de75bd15391c25c65f9193e9f01ac018db70dfab219ca35bdece8616003c4132422dc7f90b10abe49ecccd4808c3192ab02353824075b119004617e21aad776d1950393925c693e6eee43e7a40b2a5b89c6e24acb6b711ed3c7bde007ddccb0b74214ae35a443ce540feb73a9fd7528c040cb8b53e5940d24b19db6ff000e85874b9b1e305058826709dbd57a3a04bc7e75bd9f77da6448b1d32a0b5b24840182bdd866ea46cfbe272389e14092aff39dd7be2ddf7c20b34b689b10b4adf873ba6363eee5098f210f3389d7234b0f253f84734f7dbbd363d30f30e35f4c5211582d7d5bacf85e0479020ddaec85fcb9a67a81f1194bda5cc1eb0066b83e2ec31dff100681f42262ecb4f17f87ee86155ba0ef03402e976c2ad6f554b3bc4a0f1b0b3f538cc76753a5d09ea53e29a77d740f13a075366ddc5144af54744f7eb0930be448e1b9c5d06987d905cc19505b0d8870938dd536ad8ed188b420700d3db66aa6a038c021461d437490cd4eca99b7b23686c1f310e842bc106f5d2ebeb79c9f89053ef62aafae42f56f35321c0aa12ede63715005c759d9f23973793a4c3de017bfcbc7b7b3b581317a7816500287a3ac6d96d4098be5a92fb56becfd5b8217390ac62b9a7c9349cb4eeebee1d3e216e7dcc169d62d382edc5e3c7f915f65433b491a00c204603c12336de0f9672bc021fdd73f730b75940d2cb25cb295648e44bb77939009cdebdc70bf8df05f84e4dc05ce2f6038b9c84568ed5c066d858e2f192c3ff3bf69af6ab8c01321e7362135d40ebf6f32145a2045c4cee805bfa26422f09578ce6493070ace41757df0ce75b22f54cfb941dd03f764c5cbe9fdbb006cdf45aa03a6acb978429ba5ad084fbba61051fe3863ebdc385a82c889a0a50f86bf322d28f17edcc6439ce0f2cbf38585fc7c4af15b04badd7066e6f6bdb377ea4cef59a6c905837cd60ea3818f3e9aca03bb4f0ecad9242b434856e669dd9cf8da930ad1e0a6b231807e7f8d9468ece7969986ed64a8d9559c67e8e8f96b7f05aaf1bcb965b184636ac356ca8998ddaf8efe67f9a4d1d8bdc863b6c8102dca156ea01a6254bb885b602fbcad5d09f9220190268ba6ee9f525e0127d587da0d8141c23aa61fbfa1d2298c87b79f2558acbb252e3300a09b0cdac9f71cfaa25344d111b377726df73277cc770c0b10efe39b501e7e240b1f52bfa747eafd3d14b3efd347fd9286678aa97e8dabd23ad0ad065278fa3b2f8992c1de9e0dac7d7edb3df31d927f4e8ba0c059b2c3970c18508079029d67618fed0c875caa298de24946e997f1630985f5b948ede27021ae392ce1f280bdb68d632b37d4d5de937d87750479db3e0e6dcea30cfbe9a5020e4242ec8fb2edc15617e890640f3219735e09ec42dfd1af81d6d7e70e713805b04e3af862e0aee5f7f70a57e71b102a7bd7bb794449c94841083f1bb6344dd7480103ee0878d0547439853dd80a0f97f200eb1a08d0b44b8736140ddcb90adea91cefe362d7403c72fad9edebda3505c6c80cf02d00c8476f3c4f429c712d0fa6ad0369e2e3304450e4e2df10580c7648d961815238a3afe55beb2baa3c759d5baf6edb6b1bcfdee7af723ca3165a6d98b34d9119d900a708a5f6814d414daeeece584380647c1b9c8e72fa277764f16a19b31a3418a62deaad4388aa3d2cc344be2f984bd309ba01bbd6a950dc65d4051585eeba5c6560b70dcbd13db181fed16f90d235b13a7e5a002b29c64e8852e2441cdbd781035557b9acf57d2f1d1aebebc6286351a66f98f81778eeb3c313d5b12381cd5fed3d56c6345c04c7b09311c94fa63bac514455eb83383148a737ea95cbd24180e90b2bca1048d42fcdee734449d814146bb2c902bbe4d0ec6c9daea49a83e9a63688c23e3abb4fbea1d85f23b8c9a284c9e82dbee269391d743c1ee30bf7844e48795097b3f5b73b831a899ea2feebf8a9d37799f91a58a096ae7800ee85ad34cc9dce02bedd684d7b2c634575d8186fa99a314633ddbfb0f5f9c14280e33163e16ec4fb45ca15196b3648066cd0f8e537932b03c40ae4ea8cde0e2b1fb357fe028f9f65e9e6aad8edd65b0ff36e9beaef5ee761750c57386c8b959c0fb228d8790e7c173e30ffdd94241e73590219cc41b2a56a4eb7c5bc661cfde3571e8e62c45efefd9dd38e350a288991da80bfca2b9942a13243694193be496314e4211ad7eeba95a843b27d3e81339e02b6fdda89fe42761358834955c4b46223eb4910e77c82660f130ced576def767a700d520420f4843cccdc2f8aadd2028d892b3b1e305de14afe65386de607027b8ffad3281e6033b41a091f0d18e1946a30b3424fce820831cba31569e890bb6821702ffc5fcb095da414db1a4de76c146483aa4b6e54efbe84f9b98f683c82091cd3b49df38aff92a598dc237aaf735ae313594433bf59d4ccb05db031397ba9e281eba9247533ffdb4c130f294c3fb44c3859f81164cfec3dee702e4e5a8748269ff4f3a60f5f9de0cbec1677ad53484677fa86f508661931f76b0c6fa69e766adca045fb6ab57f7668ffafcac10f548713b30df2fe48428c664c9b5e6fd0da9933d2f040b079499339022265427622c9bc526c3e404539f9d301b5f1e1615c6f90968f0f013d50ef02636ed01e432f54dc241c4c92d85ca040f572969e0d330e1962ac36ad4e0a69ce7f75ed17feb09fc54732eca6c759bdcc11ca9efb6b880ff545c138cb227eddd83436da4d785c081067e4d1c7e1a83d38b496d1b4de1140176f2e63a75de2dbdb4717eb1f63b15b42d79fb8f117056f4b593defeb40852f49545b8cd22c2c5bf37cd26b953f753df43c25a44309c73b649a288c98249666e74753f77f342267947c0bbc34b9b8fac7809ead8ba3e7cd8bf0f77d50cc98a2d15bbd2d17c32ed6aad47ca5ba0c342c9435487744161754269fb3f37140c860086d432f12010165d953bbb913f81f2a77bc1645f4770b79daf66a5ca6dea3b50c11a6e70b1f80e0a42e88c758d16db4d28282a653151d6bde5ed0506073de6e3e90b3f320a4b4b0325ed97f0194786d7fac1b4e5f085e0953ab7a1b8434b44774475e724b87f75fc628f80927d2ecb8814934826950054a914a9b31c088ecae2a268959c4f57ef66dddd5bc047c1fff5ecaf5fe18e0a6acd55dbd840d09aca686bb47ef52e10d20d8e249a869ea14997aa7476906e56aba7aae8e05ae32eb59aafd339e72b39984827fd0e9be2a60b150d91f025be967458478946fe64df138bb8584b81304b234ccda631a2d80aa7032f5e97690d412016bef6c2313287b00e9434d2cd0f55da50e02c5a5b08a0f37c366ca5ba168aada767a6818b30c216f3fe31692161b1c2a180a71d4847e96b638515036550dc6b41a5964a6e79798eba72ce71c0e85a340c3c5fa43b1008f23081324ede03012ee082f0a5baa8ff0a73dbb7f0481f075f800073405db05dcf0cbaaeff60ffdbc72fcb6b7ee59eaf19bab67d0ccfc13c3bab79a7629d05eda64ec2c4fee7e0ddb357dab5046861901f65181c1bca327f5744b2a0311b344f9f4f5548959211cf763b283547b8ee0d191b4cab2391a4d2485f6c9c91ee76326d8db997223502f0ab41f0ccf4179253c26708786fc82b4ff13424a212a558275109a3d526fb763a64008c9b40d4e7fe45e193323ceb4a15841f517f0f6e18cc1cb4a228f55a08de630eba0a8b19239fd754e70610fc0f7f9dd0a1cb8080b92ddb866427ba4ba81a00c94a7a355998f2564a0a19844ba61e7cc7414eb48756e65d9cd6f852513a19079a5fc907c14895db153d7ab19a1940807f8c820aca255234d61f486e015b8edb5b6099d6c39d2b5baad519ea245d2d4ebf11afafa53cdc740b348b5d653b6350b6134ebd5b6d2910f29c2fac042768e186262a90e419429b567f83f71eec5e042188cedd2fa3b8a21b2b10a0357f5bbecd71c8bcf4f92629e677bfc7a4de0a420ad2a7b8dfa848e95c45095ab8580ca3d17128d4b0de3933cfc7b325f29cc44949bab70531d87040143493933ac759a66603239281e1086ee452738ef34cdd26422403606173bd71ff7c306fa90ce86df21d7f2388de825becf1ab69ff566337c02919f6071c2d6a9e0633ce2d7b78d4b47fbbb3dcc0942cfb77cadf2d8008622814bcafdcfd801ff060de6c5243fcbb41e8b4da38bd9e2d71ef244e75b621647e44ef86e2808197c83b4db2abfbec0551db9adbd3255b415e26396f4b80db4495c0baba07475d450b33c34d668ac5d7a354694cb22f62814a2ffafc975b6d23a35cd38ef54e29d4d6aff863982d8de95e4751a531e99bfa877791c5bd8ea34877c21fb567b8ae20dec21d8c8bea4ef7a1916eef10cc91e4ecfb6c80f965d79b24ed6c59529a14a0f08345a86debb16f78882aef2d68f6fac63b2672e915d3a92c8e2f69bc35b4a976a89ace5303497dbaf875edb803e32d828c7530d60eecaef68fd90d8907351251ed0b153fe73fb1c73d303a770a5b88173db8380ecec05c9a7f83de975982e8f22cf043b13e821611414bfc093426505a08941b50d3ce835e5af6351c04bf271687bb781674661482e29920e8f5f771311588024e5935f4c368df81da534edfbbdb5cb48f164ae250e91b1d884a2209fe34122442eb959438e347c09aaaa6435a027e203675e64088274355491dfd8d11584867907af171e0f989f139743fe1cacc87b2b3558ab5f0c38fc2458dba0ae921ac3aa8c4f03a6d5fdd5801c3390b40f006fa3efe53879c5e14de3bd7d76fdea412d4edfc3f43974a30d5923cc50e1d865158948e78a26467a52019da37273c40aa274a6851daeb8a8a529bf32b1a01262510a2444666deb4eb63be87d52dd128b50b9ae504dff1127e0255d6adacd0a1fbb025572f04d5a7fe72e301329d30cfb39f0f81abc862e743ee88c69d1ba77970d298a7c658ce6c93a47de41fa051e969441cbab07a5934bf46c643cbef34ec7f9a5fd6f87c28c7ef0134da7ebad85e98854942adffc22f24a11a8f7c7bedfb04403d39b6efd94a103a460073783a35cbbcf780ded71923e84ebd43018f29d70d646940b387fcd348b6c540529cf886ebf296845d513a6309e6636b67b85985fa668da0bbc9fc9f8999e5274d639e3c6f750d7fbe0c1f2d768c47841e45d57881f8cf319ba07a48ae6bc918697b8169e79a5d1018b3558497242eb61753ab65833135daac7bca2584a9344ff67fc926939b934ba94375e0391e22324753b198e8f81d67dc6fdccb65962a3106670b2a633b2b8e7d36b509bceba69586db4921335e9b7222269ca8697cd1cb7717c30aa52b7a9706b1c8840808226a7528380e206d89b230e7f0ca6df2a9971552bdb21110d923dd721acb15b1a2f372dc201578d5955071051ed19d6212142d190cdb2f6fb2861e02755bc72873d64f1a1bc37663a3b069c3287ff1507823e2bd92419c9980eaf0412d292db215c7f1df8c52342ec0d17883702d0fc8e90df28b32c0acbb1233c0712ac13541cd91b2e8a8631cedf8f0f808a4864b2c0a9305a4f86f1d911a350bd1bd94703202dbd369aa3c6f15998cd4e4f0274ccf1f191c963f31951bffe22b0b5e274410a3e1cd0515beceeed68ed30d35d3b71aee3138056b74bd6e5e96ed0d923258f346f2e5db2d056cac21dc03d5a4c13512b7d96f8e76822105dfecc15254b7b0a4ecd17f0fc5244f4dbdc9545ad477287e3e57c03afd37b1f23096f5d3ee7261309ff8f58488ee2deba30e338a69aa878d21f3088fb1ae527d91a00d133cc0749ee1188f0ded5a14e765f8f9b0dea51f45afa6f4213e68916cb56e5f61af82307194dd5273545e6bea28f68ab48ec8fc269a211d81fb90a15d807bd89648454956d5241f5792f2eef7143d8cc5ab2278af53ab46df75e667d1a75921d3b515d4d0ba09a0a632ed8a1c5f223cb06a7ac01291cec5c44ad9648ac51dcc888a2c839139cae8f6809df9cfbd804a9e1bfaabb9015c7c4133535f290b4b91daa25925e72e8c3299d908caeaef0a4b6fa9c429bd19eb837fc61b3bf6c9fb8de9f81152756b18dca9e7ee7d8203753e3c5b9edeb179901755c347b981a9e101a3db6320ca66ca6a02d70309750b81dbc2143bd013d54d13e067966dc727f4ca044d503053bd9842975a1d325120e9d249acfbec05fff081d97a9203a44e23bab46ba40ecd05b01135057c47d13a8ec8e84bd201b55d3f725e5325923d23404a5d930b9922c04c1cd31dfacb451deafeb0a799c4f81e2a47af4945164f875e19712b8b39c76265617b3eefcbdc5154fa58f7c411456da834e59ee6a9b1c8463084b30e8ce58d0a6268ca59e1680e7aeca8d9487017a242cfdf43a6ee00bc2943a0b963fce0c7f21f3d28b20c5a9478988d821f48cf8bdc2bc4a24b90910435b5f5b09a2156e9c9ceabf8ea10bff55b4e5423d7e99957195ab83415df0ff92ddab82a8ccf2d07697460f795b71186d701c4e2bb694cd66eb0d0fd966030386c9b773aa4b7a959ecc2dbb1f627c323e86b160c3380a722d836d9956862dae5429805f076b7a23421d6771ea86f9e00af257dfe9276e71c2d66f304d5edb6cbfad97c1717116263a3060b332fc3cf26b8393ec35858ff4c1bc4c0681e43a3eea3eb8b36b5b21d1ae2adab21477a8b4b11c8073f888f2ff677d816874f9b422028db4a52639f34370c32e924df19802440e200e9448bd51f87001c50352eac8a10b1e7048cb813a1ec9086e0664cb0da006c670afeddc2264091b6094086b9b9fd32e6d32aa0646a42273203a1b75dab1581ea2fa86e6f7b4bac9761d3e46636c039c9c263f46eb1ac97146711624d59725ffc9163c70bdac2692a4c92197e65b2afc0657df24fd80f374067a1f84e62f12a2f0d4fd49d6b8ba2b00e9b562a90a0b3c4afcb87d639de27707d472770e2cdbec236bcc6890867be9791e2c6247b960ab9068173affe2742036fcdf13aa8102f3fea41d667a203283011fdd95e9a8f2d520b17c9ee7e76a6021eb9e051485a9bc44d0e552f27e4d88b4784f21abfbab71ed7596ca03e253e9b78cd5295a4fbb64bb2c64d4c2b17f40145753fb8e39393be623e6765cc002e669a9872637a636e94f0612c9e9c5e901f2a7a1715d7ec3e8b2bfa2ab9466d1b8cdcd475242ab8414a5a284357cfd4392e96df4f31a55f2b8c25c3c62aeaba702d07ff4dcb79b3078476f9bdb02f5ef9a3270e64e868af9cd547482dc4db8eb97e8e8cc1688ec13dea2a69bf59212fe80ee1a1c45e28f131c77ba4d531d4fa567a72d3e6c7b334dadec6d71bd546f88daad82ea40a10204321e7af1f96c08aac3bb0aa088f023331ae44be083baacd33c8d72b27e3e9921f521f72cda724716fdb377aa6808a8fc54a68e4e5b8a3701ff435bc39f24bd6adcbbe015e5b7fe28c8ce1871522f5ca01a8760021267c21cbf13855b267f7d4606aa0ff484f00fc5418be835950a911c1a1ab7a5e38936685972f927fe7010723bce0c617d7d41ebacab813678a4911dcfb788209860d8d719bda2b4f14b0f9fac69104489c46c1ba0ae832bc9ecfb3c19ad85ad214799977abfdc8f4828e6bbf369a1c95b4f0413cbacda2ac98346160cd1db5ec90bfb5e9aacf68c913495df3e4a09841c5cf9bed50263e943219ff0c520c07d58127bb979a57442ba85dbdb503213fd21ab273f97813e61c51e1e88cdb2c9bf53b1e7121d42d589fbfa784718104a83e48eea966c08eb29367c3c4646c081e452193c7c9b19c0c26a250830f69a8ffa70b629094c1be816e343594cd1bdce92efd09307a098756606e4c5b1a5d2a1e2061cd7f49e579da7f955c01ce7bb84b06c072564e1c1ac36e71d0c642c22e89f716b27122aa907845bf40d7e364cb31d0836606dc75ae9b8ec230663bea367ef169505b8fc921dd753ed31dd6a63c7fda82a95da2d23bd654d81a9f2d45c459efc6f0da29028f72e06670a38b520f69fad2b2dfd9c80453ddc07e2b844b060028c05d798357318ae51f9788f1842739976f4ccc8b8135a42871ebc203d7b4d4a463bf41c41170c244228bc3d0025da104e3ac5bb0d93651725aedb52f61f22fbcbbbe744fa88b27194d6051a2abc93540d433550ca81bdf0b6d614758b05540f3ce1bce184535d7b5aca474b0fd5b42b008a1c1cc9ad451c8ea8c1e23aaba184650c24101960ca24cbdbe0bbc685d1ebec7813aac6290d080d9f7f22413c0615969778c33d526be594525b654cbc7ea50a89e9c531a3929a9d1b809a281d5628476ced7d700bfc59d2186ed93c559b7d999dd6e65829b82601d1a9821d5895c14ad1aa00fc0fae8473fefb5fe8b8379aea39faa80790136c8f0a67b6d7183ddeba6bbd487f90cfc71b2a0315d7c484f63a67ceb16dadec5790f786c9f0b8ab60ca8e54bf5bfc2f1810c8169285cf2f3af246de17d519d97df9a9b13c209047bae3044c84bf62ef2d2fb55bff8f3285b278d18659a023f4210c6fb25433d4360182204a42b8f814e72aa96ce8ecd8ca7ffa58eb3661d3483965b63e27385654db3b504729d1be2ed6c22d7b5572503479fb0533602f14cc989934b03eca2ec9e52148418d309ee5e6acc71aa34ebc084a119ecef13976f3de013e5379829f1c611878051f2f2dc671a759bd7b8cb17e317366014f9432b626193b0f6cce1589ca60ab24c1567417ffdc120f8b2e28c3b568293dd04f33a258a0344c004cc5a2130096aff09ce874ac81eccacb2103acc2bcabcaa7d8b34cd4ee2b6a32643616837279814cf49103e0ea6f47bf85cb2dbdc606cf8377abd23921b9ffb9a222645b5242cd2cc8cd86e6d452b08d86ff140f6105ccf9693b9c9ae76da5d76479b6285daa75ce03b5c6d71e3777ba99d06c3f52b800f1433ad653d08be88b2108f610f572cc6945c5d96496d97df2f3cc7df6fc7b376ad2edc0f7afec0732eb99be868fbc770c2987b9d70c68775687dcba0e285055ee16bdffc76e5439f9d6b1adfa9fefd8bbb6a5541cd8c35f5fdcf565be4c0cebb0f4c9f968297b5ee82e3bf10c691ee99d1b42f71cf8faebe755d967e2dbad31ee8ca7ce08f37eef1f8f985c7c6e64d956342bfa730305d53ab0be61a5859c5ec94f7fe7674d2a3866d9cc30cc1ba71cac8bd0197994a0b77ce08e395cd07beee83e99aa75bd9284be421a78d42c134fe8bb2789c57d40698424c029681f7f81f2ea1258550284865ea60531d0e829028d671b9ddce5584c6d024d0d15993c76c587fc4b20b5295477e2917a5a907e79b04a67f5108b12cc4b7349dfd5901d7f544348bd5eeaa6ff7e296b4c972ae42e227876bfe441e5158acb4094ad85644f4ab90007313083436ddc3dc340de8548cde3a298446d594a963c66bf7bf213d1f7a10db30a8677266eebdaf8f5f51220ac5f3a05c8e69638a98d69a88a1a610433c9b7404437b629dad5ca3530b8cca6e80a43aeb92130473335d1ec49d6ea569a126a9688c044d19ccc43ba5ec8d254e102361ffe7b3c2128e0a81c8204a891cb8d9ea4abebc96dba6ddc5daefd1957b9396a9d74d015bcff373dd48064d823f950b038be60528733d9d8eec1681f1e30be7d9c807b7e42ed64fb8b9f3bf9b65d9872383a71118eabdd1141633e40574398ce1f4786baa948e8bb1fc8bef2bb3dc0d7298080f0d30a2849ec7b07c7e67dd52bb51c9c83c5e41c7213983c980228ef0b8164baeb22dcf8220fb83b8a0dc1105912ce9f5f8a6d3e5a12d45114ee5e2692d8ae9d9a1587b391142ba84a34553c8c2fe831982a3d8c79090f7781a843e2b5e1f24b5f98c2ec17f3305b98f07f725058e53213340f02b3a248cf49e717e43ee3188b71308691cce4ab7dcd48b5220d53386fc5cf5810accff6c6b9c7964d2b234f5940a207220c79ae6043b8cb66f7f35488b8343279cd23d6e6de51bd5d89e30cfef37dba0a3fb0318d2797e90315508e6711f81426c2938cc91d2441094cb6613a131364ae7864abbed4fe95413ad1cd329742a3747c28062a63d96b7b3be03c580c6ed029159d6b1cc38a046071fa88168ffb88a77d6cbe09e81339db878eb05f494543d25c46441e731e7588a3e3835e2470af89f10e615120a592c1e5e34e98579269adfbc4da6c4590292fd6b90a4779cb25c94612c8600a620df1298c0becaca5d946e1485c4a33a54b71c6a7bab1165a020b554a31a8d1920c743a882f4006865788c2f786f8bd2ad012343bf8a0adaf12f02a156ec056186b0e25987f48210567490640c0c0a149432aa5016a41dc6b03e490af12c8c0ffde7d92056c1468866229a4457660d7670ba36c17a7bfc720934ddac71ee88b10d48963cf5d8a15651d7c12f2a626065812733aa1bf4cb509d2c548e30d15348b4ec7cb6e111e0bacb05ffaacb298e687fae92cd42c902d10d13b4308cea7f57f2a0b4b559bf8c54c40cf6ff1c3724f4af35904759e27392724b6c4571e2a7ca226e25d72dfad0b5f48f0abde973584a8111bfe670e3c2dd7c475ee534456672f60ae31bc27d9c7573b54d0a8e24a9063215586dd3efe81faaca6edaab693ef01817c5b8ca4e5310d507d1855fce901b1974c01f6f838b5377d952bc2b66b74062c3373028e6bf616ab18f097caa974702d9d6c42d31f7eef341edec7948b06a256b8f3ce669dfc350ec076893504205ef560ec899d779b8fc39f53abf3cbd99197d73fab4a727071815c0884c0bb923523dc0c00bc062685a15ac1666bb896112507c62e53bfe86a84789150e017639671a98784e1f9d593b3127eda41ad08660edb088ef1d5616601d4172c0647a914411a793f92b912ca6ccd10df4cc4de4a7a5797163e37180821e2ceb28d07a2fa2db8a96504c66fa99d7f67adfd30e562e6e34f1f54b713dc1d7326e06ed3af038b8a9e4233eb3260986d04702caa0dd6c1f1ebfcd1dc944667675d66b8968e4a70ae80f9abc6c08c80b93f81df7b337e47f00a6b1ca410283eee2a3c85a64cb9235404268e1d935bf470e27e186cde51d8f29421bac1b4a07ca12787195d9306bdfb6a87ca7fde19a07b8bcd36621d24176833162d7c1cb356aa8726b608366bf389556da520e392198a3ade7b7ed20f7f9de805220fed629418d0e28afd508d3a3fe719db3f9fa4def92f2b266348c2ee3bc0a9ad27032b879b754dbd8a10798748e83a7161cd33d5ce15729318e8573857c1928d05543122440466eba71931ea404a457ac546571211f33eb9e46d8ff1978f2f40c10512707ffbe0080172fb2e3c4e615c794ce66ba584a173558d440fa523d416ef35be4018ab1007a0f37e38f44e94a1bec0f2e478424c0feff7a67a147422cac4102bac9aa7d744582d4be01cf1f1f642f1b13652f1b4acafdca922ff319db32c3a98fe1b0ae7d64fce4b30981de97b096d965b8d86530e5a4145cca9236b4827c4b820411728c1b63f2514fada617421844533a42eaf45784b740741dc301ce3117732c1a945b4ac849d662b8516fe0f8e83e69a6d3b5e76338987c07879e555bc16e9fa58bba262da0a676d3f773a71673a090d1fc1604e681a49f41b34b019240d2ca256b0a69aa08fd8c9c6f607e3a8058f8898be5bedc9f1e55e9e3e0704d04646f0426c8f8e719c40ac919cdd8222c848a1512e199f7fb7198ac55b0429a82f74786c9687d7d7a19eec53e97051b3fa8e3736ed700420214c5e6e1e4d00e617ef3acb8905ff8f4702d367870393bfa7651ce01fbf3ffae767bfa052166fdd016bd8fdb751b22ff0d9cb944159f0016cb4949e9aed08b071313f5de29d98195b4a46f6ecd47355787d7605a8d116e356c78b48e44c9435d2c65919a1e9769186fc0ea83d0a49b64ef33752312658a390a103761b62f532561973b23faf3e9f2f62c11814cf4c5b467ed84e94d848e41c09004dc73e08dc02acf306f531a1afcf93dd4de9d61264306a8077993e8540e831e6f70536bff4fae4b56346ba824362c8ace873acc3a338f27ff57034fbf433349b8200bda9647e2bba6faddbacd03bdb7b7938d0923748f51ecb41379c1f1203c3b578e043a8404ff875e5b6923a2a5f2a982ff6c4855e15fa4b9f50558a7260d54da6da2d879d6abcc94eda4721b60a4bd3d84895ef014193010108f17e426582ad2cfc64a1f772c238163ccda9a5660f73a82257772914782e128b705f241d53ec58dec59515f8b095462df13753319566683d0dd46deba726f791e5bed22bb3d4b1060bf8405dc060d2d8681b5132c442b475042d9a9d82536e7430857ee08e440351ac079039446d36ae5836db7967fc44ecaecd6235c99a851457c660fe2d78ff3ff39ebe9801f6b6f022d9191575d23dd4f42e5c01cd3cca6603fa23b29d0e4dcfb8bd80da831850a61f75582b1cb3b5849ea5e95d368d0b70670cdafa6849621027ae508161d41704348cb02bf6be46177cf9181779badf21cb224b60867ed3a35dfb7e31cf1d5ad6d899084c5962a50fbb1e597195c2fc21d8ac307fa7589f98f0d6be28f4ced856249e2d07d197aa1bf88ea53f0db0c07fbb5dc3a991ee06e866b59a98c561e9a944256e32e177ca8fc7956a687233a5e0a5a15f06c22d84df97a9c64ec450806de69dedbb5d4f1e1b611817b9754f97de5b862bc1625e1e50dc31a9d328194d3319121d00dc7e025c97217b83f5f35374bcd04cad5b830b46c551f922782381beb5698cb834c33601c1c038a5cc67a5820d03a4e07243fb8286a1df33a3cfe8f4e489e8e5d6da82372ced1ece81d1842c17fac80449e4cc150b3e6bbf1d7f307a0145048256ab59b263a1f40d2541a1be963961e8119ad6dc5b939725ca310125ad2e49652a6945240075808950745f5a3ce441aeec1023ea851c50e4c941982cc00c0b86285953054d635ba01064cd4a8cca0031a49ba8869378ade18c3e8062775ab6b74c34f0e8da69d74cc6660654a1569246943461823fc4007bad5352a1aa27ba2a9ba46454cb81f23abba464537a06905408c94120ea960c7f486d22f3754e1b65031a3d4a8c6c666540353695da35a1bf5a310064edd46fdbceea7ce23a48b0bbc6849e3448a9aac87164a475814c10619352f49ac01c5fd77e6dd4dbffa85b41355b5d793b2c14b9a9a9accd0c18d2e96eacaa06e5117472685abdaa44b356940e911fd684e7badf6f8dba05feb190d0ec65a70c12b3f0b5bf55f192ca9dfacb0d9a8b04829880a5fd53c2d8310c28ef9c36721b894e4a454b9785f3eff776125610af1eee0ec9647d3c0adf3185d81545d706a848598ca9d4d0fcefe569c0770dd8eb53d987f79023f5028fd5cd78667b05b3173336dcf01a00485f5a36d450320cdd7bd05ede66eeece97b8d5e1fdc1da1efdbbe28e55fb797f6ced21103a0717fec2ddddddf6ae78b03df665a85b77150000e4e0f0d8d1ea80830d6e74e4b0a1ac9a958a4ba1e62623f4de1efb54a1f80be9dd6eb7c7ac9ea05f9f033114beb38e0fb9bb43e8eed0a13b7408dddd1d769d06377fa0fd5cb74308a3d7edbe18ea6e8f6577afd927b85d9e5d16308bd09ccd05cc70696f5b4a295bfe5c9ed4cbeeebad24b0aa7cce8542cd08c8c0b93ed83795a950dcee6ba550cfdd175f4ad752d67a7cd97124813bd85e6bbb166055a155f9c99c41bfafbfd331307452aa9a2a1ae4eeee44a1bbbfca238411b6936108217fc385104208650464804c3a5075930321eb1801557fe6aebbabfb7352baf2815c376fc31a083b1596a9f29157f73b46f831baf63de0e565d8c18fddac70ab2180eb2fa882d747b195524a9b22fe4bd0728c327a4b19a58c3146c9857c14e0c2b959892acf0a22fef2385d6e70ce08510dbf9010ce861326a5742a230a9b16ea52ca0dc3356deb9d67f5103606911685c90e76ab4d22e23bb7a4896ab886af7c9068cb5f1e638c31f2ca073eed85b0bba9c9c1573e12607e2a73020d4d8912b9c4a9825ca66f1bb4a1ac9affbcd5aa762adc0d88090c82ffdcb890d16382b4a1ac9eeee91ef91c98ea9f2a61032e14daf322a824947faa94aa2f975595a43270b9308ba793186534d35576ad1d1315578874c230a337016152ea7c49a1b66d8b01aaa09343548331e00874946a0b53a8b2d5aa526e94528a2117ce8550cc68f31f4cc77f3d39fedbdaf6b46224ace7ffc1d8102f543a5c395cad1e1236e681f51c85d5aa96db9424e23c29a0d031183cb03115ac8dabee2b3ecbe5ed2b3e7569a9f16b5c2a98ef9f82f3f4ec2b2e53f52c9c883250c1aa590494405f4e158d9389ebcd8a1967909538f83152851fd76ae0f390f3b4e6c367a62e2a2a547dd57a523f0fea0e1eb95c100421ac1f3b7110d394345b986a9c452236b94158e454bf4a6d70ce13f849b6ea10b0afc800115c1ea58c52c628b78e53a21bc9cdd7d1707e7f9622698b2e7d3a6a7a4f8d7189c6889a52e572ed4bbeaa7c180c01256c72939f925b4f8e275a78e8d93ace3a4a262415e912c2eea30b46179abd83cdcc9199996337a38c472b9b70a959b352a120ac06b682a93a2ea553274b58276ca3b6308556cbb53b672b4b37f5021086e7452961ab424713f4e54008652092a18a0c532aec985fbad6fbedb147db464f3d032a4440852fea5a1efa3d104258c45ffe3db1a7d6742b1597da501d0c455a4e95560942a992b2db5c5be3caa71fc23d0a9a49a66a5513cdd0188fa46a9ee33897944519d72ace05659cab3897cb38a8e25c2de3a48a73b16ce552c9f9427a3e7c1efc1f55801b1487045608e2d32f763823d03a3fb5d5b0c04ff1e9f6f0df1ae34902acf1a52fc043503f8effb20b017738b0c6872e38e76f1d69d2e32eafb8582ea68a9a119965943e65744914a78a4a3806d21b8efcb1638c1c9b99c639593e7f8c11c208a1e46e32b8e9518c8a889571a636948c545649c5c8db446da95f58650ca8b93d593893640cb695914bcdd80e162a2ec26029d700d68b4fc4799cce029c9001f83205cc82aedb31e924caad898cd0779065c418e39c93d649dd0c0a92e4d019396466755061c20d24f9d479e6cb18639cfb928f72ad84616e326e314ab9c98643860153e177d236f99018150d73d349f5f35af7bea4fa4f85bf2c6c353aed011b2455d87dad820f715063277f7448413faf0d3931858721d90495867ed498801a0bb0527d1d6cc21abfe70512010641cb0afe6220bc8441f06fd1ee6bb16a5a2d556a72a9a98fbf82f3cce525df6ae2253c27fff00ffff08f910c53c0d47391eb5c1ca8d0d5818fa86ea7179f8d573e92dbb685dd119742492e8ef055fe06b7ed85e8677646156c8c160c85b9af18e5739473ce86354c8afad80a03e30d8c01b60aa0c5125ab48c40399baa152ce93361facca43e6f842afc7eb24b67caa02afadd386d294691e2b416aa9fd3a68a9ee9a52835c03372e669247da0c6872ae4b836c8d3ca21d39a93521d4c28ff078bb0a9a2393a5a7878925325fb93941c6394720bf35ba8635de377948e6d962c4f6afc1e6aa51ed33c1c0cf5948e6d155f24d5d8b41affeba31a3f280c1b9555c5174bf5eb303536518d8f9a5bd33af6755337756c8bc444a9f1fb4cfc5ed2314fa2c65d8d207128a2ca8e81f8a73d26edc5f7800cdacffef34df87bee46342ca9ee6e449b557777772037a211b93b12d559365d1d94ed3fc77f3c06fcdc0d1a947b7e661afa31d26402ba46578ed4d4a77efe2ca5e25cab09510bdb013827d4e040513dcb626019f735bfb22c48bcd456cd392b6d89a13adddd73ccd4de0fb4e1581ece62db697fa0d918ab2a98e569a730959f0328e8c74b959f973a36a663dbb32f5156fa544afee2a5c8b592f37018fbe29f41e5af41e59f8ca6722bf152e5af9b78a9997636cf4b49f9754e6eaae6ec6c5ceb7a978f7c5e3d003e2abe74a51eca6da63e76ea63aac3f48b63d74a4cad347dc06a2b394fcdcfeee3f6994486f84bc814533381487bfcdb9ceddcc4476a55d092b27811aa9caba0a87eebd93d67cfee0925945042d8b05df0a7eb46ae2ae0b255c72c28e8d74a4b20a1c1a8a2be953a967afe0e33e7c775cea8ea54e8173fbb6c96b15465dd2c3b38d1b4015e2ad204f55505a08c97c8302d4551bf75fa40a3d01e2ff94faa6fa28029034c5d37ea82212383234346928c8efcd45da36e1119462ac7ea0c48c1993827c4d8e1f8ca265c99105f7631e04099b1a3ab0aacace52f9682f34a5547860345fecae28e12ba020cd3e56d2e98e743fd680dd2ddf5f40819e2af5a0e5d6a9bb0db114942c155440c55527264a6427bfcdda5b04c95ebfe04837ac331e26fadcb185a8cfc4ce3253f1d5b1d354f073566d2b12dfa0289857ebea81f0fa98abe60a37e5c8581b278523f7e52fd23b7eb0266fc3490f81b6325ebf96b1db03f74981d03f6e5cf8294cc3b28837e8bc44c48b0493e033907b93f0b0d6d11185f547faed2315a5d0699cbbec94c639a3fffe448e2639a57a6319024cc83faf91ff3c03f548f349b0501d5e99838d53f40e25930688e1f98c6b315bcbf0518e7129a3f710aa23a7750c540d6793542571638e967cc9831622011bf1459a18b266eadc16bd43ca4d096c8d769df11258ae7708712187914112516c9e3485353935c615ba16985a626af69eba674b5ac05254ac7be451a1ab23fe0c378a27240a55a4b5c8adb81c44fc79acca8202472aa2eaad50e272ba51a1e46eeaa1fbf01f29c20d711aa61b5b460a50082225b4609891661827edba4548b7d53081d5264ad50b2e1118424aafe92c846b59f27898638cfd64d7f4929e444cad13a43bf6d92b48e7dab2497b48e8cd2f2497555111460fefa64a879bf9ae0601401af801cbc2307eed615ed3c907088068c4944b9c569e3810353c7be1faa313f18087cff20dc0c023fb7cd1d62e8b7b5f8462305b135263d4baac38ed4a9824d04d05740f5ff52d551bf3d881eb68e876210f88336f061ca942970001199c23cd922085903f5b9a369fd8d8e41271de6c1a4c9a95beec1bc2905fdb6c60f2154810acb3b8ffcf8d0d5c340bab359107454ffef47f56d39a1e44c3c86e47b426ab2dbe86a598b284cf3cc7e29750cbe4733d5e398eadb3473708251a11f55b5b85b9b53bbdb4a93cc59de95eed1a3477787707f85af3ceb664df00f2fe119d3daeb3e9a412bd3bffc1000880a2d888a910faa70ca220d012851aeae11511969c0a881161f184151758d88b83c658101ddea1a1151b175521a113d5165fcd2792560e1f4c11a444cec4074844e91174ee4115286e841cc10357cd084d6b4e125611ac01ad4a6ae91105c64110249889a17b33151c628c374892306341c4db942f404090e397c71e3092b677071449416cc6021c5142d671ca531a24809336d08c5606806338a3882a6861116458051c5154149c4004306334043c9882a44d030394c71c49121acc03104cd89a409418494524a2d5e5ca18496c4bb682165498c310e2017a20bd50d64803aa86b5484c4d4a10c67444a297148396941194b288931c69844860d150d4a92ca78c18664b7a851e1dcbf0533aaf15039a86b44c51bb30aace5a5891f201b49b64c2186cfe0c9c81535d4fa8b95307ab831e2b2c4aaae111721aa4d5d232e4b906400032320d2780222065c04712587165b64149a1971e5c886315ca838103d6c5dc00401e5c3d4cfabbe43258dfa6dada67e7b6444454b75245ad7880a95baa3ae1195203351c628a708b3c50b13935313263f48a0cb1723c82c3511070cdc878a450a307250e2055d8e8014e004192649ac34e1041927324a1999f0a14b1a1f763073c69bccb82990cc265ad0021a9a8809620def41c90a08e888686b19a58c4acc7043fd7e0056cce0e86a3073d2028ad02ec15a6218b942831b5dccc438220d104f8e90524a29ab40954112a5155e7cd9b474e1c60d36504871c61357c8b8228d334982582801d3e42787ada7873daa9ef43344fd56a9fa86f16fc176a91ae970a6ceba463a98a9dfc3b6a7273f7c2932230b124662b4c047481a02083096829af080040d888e78a2e58d1f663bc0ad6594321220093aeb1a51716600409cf1411015640890058d758da80843366b7a9da2304735d6359acdeaf7b02a4194a01de18230604ca9f2a3c35a41002aae240943082b44b420070d6cb142c397245484e9c171e0200e346e38a20da119b3048ba635c020628833905c5162048b314bba24a991c64b928e882c5c5cf1e5e8070b122ab0284152a6ca143408410bb2258aa525904c510335fc06267cb2d002c40d6284f9e1c18625ac30924495274e6af07054831f89c2680c9633a21891460b23324cb10512a7a01a86e0f0c1698882c588500e4b4155a6f80c54d2a4892f4032c68c0c2268305380921b8688b862a60d303e9b411b36a831449113274fdc83083ea801058a1627946ce938e0a85f8b852c46783143064d3c405912e587298a623026a94abfb1658635d6480b531b3000d435d2b2a5a6ea1a6909403e90470a8e7f7ca6b4f5535feec0144eef9942a4b949948b9c6853ca0e5e5839fc63b6c1a5c23666a8f071563e90461eca1cd18419386cb1841435a49492074a890d2736822afc1d2b1f489178992df8e5ecd44f2776a64c95df5a63a8caff35ce9c89a2caef60e523bda4d96c5643123a4801c2090d386c188ac2440942082107aa2d760b38a1a8f2691a30a8f25b6a20a9f25f0d3135f0a2cadfc0938106228ad8028a2c3f715cc1040e4c744008e14d96fd7266d3952a9fb66a8084067154f93abe84a42cce2063e589234796e0210a29a58c9f63e5136b3480011a6d54f836052043bf0945950fe5d3958ffc99cd6648600e47a858d0013902006254bf2055ee9107669498d17206922c9e9cd1c419334083893266aafc9a958fecf929c32a03a642f8ab950f8441521ef999a1a6caef09414a292584aa950f841deba08c953877ad600289890b2bb86cc9a204922e5a2c2edefe20a3c2f905e1a0099f42f83d21400821ece8a45cfd6eaad4a972c74795bf5f90faedd115f94bc401aafc49afa8f25bf2bf0ca52adff3a1ca87317151e5f7045165d10cc2a8f287746c8bcc30a2ca9f2b1f99a4e408b79591a4c29721d4a004c50f567818c20d1752e203a7aa0ea8f027193242153ea4dfe33c23e862072e4f4d46ca9c71286c70adf672709cd0afd57a32385408bf2055225158c7e4fbe858aacaefe9587c299fc8fee0aa54e54f0ac654d1f65806c970927dd0c3efa4f4a69533e516b74d0926be13ce2e42fedab8569ac8b6eda6959404e917deb62c847cff9bdb5634a64cdd24049266ad1a07bd8103cd86460068688eba457094d104cda95b04c7962ce020aa700c79f15261dda237c4e8702d24b4bfb777979bb723ab5a4868178d71a6eea85b34e607aa5a4828d7ef59babce630823260797ac85ff0217c988f9efdb17d4d4b854d54e17f3beae781e99812aa6d7a4773f754b5ab6b67b13de0f790f3b4177ec1875f27d5ae420ccaafafbb8049ed0427fc9de6596f8f2653edff7c880005c78447753329dbe39c30573071a692071f063fe5a2fe828f72b5fc05e1e7f96c90722004f51fd8d30c7c13fc611703f5d7b6dadb9cf616feca881491ae8f2e8f797b84f86bb9fbe8ee0f696f9bbcbd8630a847c1d9d2d4f1425aa956abad7244b9fd7c6f96fa9901418e6bcec33eec8bbf88ca4a547ec8354682403520d8a9ba395110d6401684dbdb50564dea552ed4731b8428140aa5a3e3a37ef1ac3a66c7b58d6f604e7b402da0a09acf61f32ba35fd3bd7b301facaf4030a0201b570f7509e9018ac010242235ae22fe4afa0044616905570aed013109c50004437bfc4ebcc4b951240697ba48758bc438325414c699ba34a85b14460d4d362fa45d8899c0502e49473e84822c0f27b98abe141c7fa854e1efc33a26859c0786758a42cec33faba0edc1af5af9c4cab42946ec6e6292f3b0124fb01295ca1f8b98899358293293d0f660e6d8b55a93e3522956ccf171156b62ecbed4cbcfc1aa59f970a9ed39d7fcd416a39473da740ca65f369cd41e3f7f2c04573e71c76bcff39509aca75d0c38506a581dcc7b84b417824a88878610e10d285160652a1452e08f895c106ae226ae573648286594110a7121ad23304228a18c21f44bc8151a7f25017f7ae2f5f8bd9d7e2f0132bfe730bec7ae85c8dff085ae71bd46762c788d9d073b6fe7067ae9209df5200eead893a430cde351dc9f6b8cc460aa47e875ac81767c785c933307f9cb196873b98c8198813ac61d942dd65d4e7b73b6a61fc16d0ae862d952ab8b454b94faed525d2c5654a92b746cb16c09a2f6bbd0319bda8fe5e8a8eea88be568a90ef50761645193419949f16741038ed464f3e3ea04d46f2f5727b09e9e9e9e64b39b6d3fdf5d2380b2753827b06c7b966d5d0c52e24b11616b085468c0915a8ddd081a70a486eaa4f8cf2e0696e19cb0ad60fed6e1c0ef061ca9d5e92b13b69f5d0c385052bf32d46f1dedee5f59afd00f437fcae57590ee9ffd5b777bec7ed90fbbdbbb3f0526d81288c369d5544297eeb78aa0d8667bd89c808d7ea6fbc3a76beeebd51576747b300b30d4e631ddfd4cc6141eaaf1932805d9307fca671b966c189a2595802e18324375475d30646ab599a8990ccdda8b6f64bd1b27ee20eb88dfb4fe69a0fde1ea1f6f9a9120eaac63edc37ad1e60265ba6ba031360b922eead7442a9b399de8d7af896e6c68d3e2cfa6c567a7290633ede02587d56ad51865a8bd9b1f68e3b03cccb42fdafe4012555c66799ac66ad4d842eb3f5b49333e849f5725738a3996efbf527129ba7a8084aeb9d5c8df15cb7631517bf157bc8ab372ddd44eedb46e6aa7765a779fcf74b8dfc088e284c12ab393f2bc8f896a7c244672948f09fb9e93366d5bf974909edf82ba302b4ebf0cdc4d4d731e9e72d4b165247fc59f73032b946324e76925f615ff89242a357e17d518919c676549bcd442db23d6d4cdf23343fd680d210ae16e54d2c555da8b2fa55cad96a0316835f250d1183fdc52911732e4062ae9fa31c6d4d552b7680c202aaf7c88a4ba1858967aaea9bd7806e727c208b45cf9743784dfe96b13ec4c8044926652e0e39c905a19f7a90e675b192cd2de06da8b2d14bf87e2ab5c28780afe822eacb04d3cf357fccd05437b31f212a6b51799562311d73a06a7748c7ffa9cdbdc7ca98726d8b1507b9183fc05df236a8b8f8342055f2ced783e3ae630980f14540882b45c7a9294c6547f19212375ec63a5ca85c1c0ef69c13ec04117fa71eda863dde9ecab96a098453555f99719b627718d2563228982ebbc6d618450421977a73d87b26d9d90c68246d70b4d4209b0c6970fe59498d33c29a41d1ff50b52f775964748849057232c193e3cd0827e9e909e21b5df51d3b59302ec2085813d9eb3258fd8f1dce1b651b1dc5dd34f6cdbb6fdfe8e0e5571dd5caff57a58a0f633ff0b03b517c03f5dbf0bf0742afc9fb3ee4f551a1cff5623c70823e4eed5085b651d1714d951bad55de5a858c8dddddddddddd773a76b35e7f6b7faed7bf5f0a3715aaf6e54265d8b110c309ab26295b4811839fd94cb675bb2f6ef802d9b6c10ea15f0e8f2874bdd0bd207895dddbc357d0aeeaaed79329f017bad76bb617d25bcb6e7bcc7923c43574f9bcd023c0d9ac051768e5b6873f6a41f0117ad6b500b787fb74a8f522afa0cb676bbb5ee8ad5712f0d8ec351576d38763851fabcfc6facd0addcbacf67a3b1c8e94444ce8e7598e9f0d746c8d6e3053a463b4b6fc11d2b1af350428845e2eaaf6ced0af857a21add393f33b3b029d55f99f8fdadd4d90fd21bb077045cdeaecbe56dd3a05b841e9ac6e95efb32aa42307a9012194718b33c64dc6f6e9ecee7242e6adfbe64a5f49840078db7d9bb5bebedeaead8253aef5226a6e1aa8fe0cbf3995e224d690524a7f86b1818839cf7c9d8eed8eb589fcde2b12bc32ddbadde7fb6a049e617637fd72a2ad1d13d52dbf3f17b90a10d805acd53121fe56e6c9999a2c7638155819f51777fd0a63205cf9572673578e10343a3cf24665f676a2f223d184906810a272ae823810760c84ca9f820bcd136b3600c5a6201d5ba31a8ec82333a90617d46fcd54e60553f9a1b7af46e0d668aac9a46b655d2f7046cd796227e50689f2ef8a057f7aaa281afdfaf56c5017490951fd1649a74708fafd4c1a51a57edd23234d473544a9b0ba4747dea84caad1515035405da32b4c2a8fa91ccbe3bb0b3d462e2fa99f0bb1fb58ae484855b81f5722c88f0f9f690c8493c06552ddf5ae9c095565d06f6bbb4b969330101e5393a468d56a7ff0a36ca0df7329fe2ff5a8e7522ed7b70753a9d7f16aeae1a73ad43b0fcb20eae1dfb4381d5fd06f56089fb6d72f1e533f17baa23ebe74f9ca87057eaadc735c8733642bf7226ce53a05a0a193fb6fa65c28d797faf8db7c212d439d1d2761107e3a0f8c08a8892a8088c2cb19195c6d0f1824f2e0a732ab563956edb390f8595cf8594ef448f37490c402d3b1359ac14ccd81ac8ed1ca3f444310f5633555aef9a1818afab1dea8bc3d1dfb3ca0557e5e6fa2f27b307e1f95732ab76beb2eab4a5d56149650f7ac5a9dce138033fde267d61456951a3b1612ec02d0d41e8341f73f16d2b75382e7c10f961f980112205bcc03694e18b715ed3c8478c3218f2970c252b0d8eaa214f38f928716df8e9c1de9d80753f58b7fc7a9675fb36580ea5bab08fa6d2d8e914b603d0f7fe8127777f77660fdee39cc1c1d7e3b743368ffd21a3e2abce99a33a88c6defd56b0218c8b28f0a801f0a5f7eece2f30b7158c2f6f4f40447855d08f8fb618dc49966aa1cabbb75bea6897e3a9eb703eb18ffe742ac3dfba36bbf4e940c84a942170098507fee661aeab1b7d4028e83740a8fe1dd1ffb22acd6c5e056e75b6e771e5f8e9aaafbfdcdbdb2495bd53b5fc5e559d77ac31eb0aade7530c6aa7250e535ff4940596739a1fc3e6b3914ca0fdddddd9deac0e970bbbbab1c467f0eda2994b0696b0a65335a4ab83d841b64d9a4c944a19c267592106e318ada10ca891327144215a44e28e784ba5c2dae097dae89084e40ce1fae44e8ea1f553a3c399ebf3a6251fb3fafcbcc4d95578cd4de517b5c3a020ca48b1684fe30b51bcc95edd1efac1ea214f35deb5ad7f6d5df579687488f91d45e6c527fe92d1e11560f9b34d150ffd99a14cdb7fc8586ba8f6f4de8fc1137a93a37d516b8b635a1ccf1d0105cf4f4e45bb4db688112a72d7ad362d79311a903fda6d226a394713855196590d4aa4f4e376fc6d64ac0bce0e98a0108d10dea163d1179f1348563b980f277f72a07ca2fffb3c0ff2c943fcedf0ec68e99666f3c82e3167677b76c2965cb6f087feb6ddbba257475b3bf7c16babe7661a1fc5856475d8906dc7aaa52292ec7f6883a44503db5aff8bbf2c93182eabdaff80207638c3e7dfa74f7f5f8703746e8bb37eedeb1dfda61bca92cb0772a9fedd6e53c5d9f0aaa3a5f4a29a77c9fdfab12604575b0833a88066aaf7f1aa1dfefee0e270fa006026a5a3f69af3f471a40b5833638c3ad0ec7cd5b9d07f5fb2dee6cb607cc51e1f308aaa3f6654382ea2f084f50fd39c25985524af8312e3b333befb6db6ebbbb9d54c5684deb25383854c1a6555ec18e56dda9364d76cda406941d3664aff9b139337ff677369a306af7b772fa75fa613d43549b5e2e0b06855ea62cb67d838f30ed0d27eaf49971e5b31ddd7815ba1b4e5477438dea69a6544fc3061a347c7c97e7004d32396f80387da9f0291a1f9c029d73a8c48c5855350a119d080000405000c315000020100a060462a1603c9035d90f14000e6d944a724e97cb83b1280762100531c818438c31001062100186102a2a1b0007f316c04266d83d6158a8a6dfe5abc249c3376d19e6c897e315d67f816cabc2e41618cd66263028e1d118d28fa70730c0b0d6f375a458515fc1c8b27816a4a2d9aff975f6ba0d915edbd4829087b5ba39efb77288a7b0b010b546f743a441ca07a1a486e140fc93089e26b8673d815da018fc6b48e203ae7723d6ce10d72b68ff4afdca8afd1f909565009907edd71d5313f8889729b519248129a0ce1bc331fd072c7ca413cfa0c3f24a443446fd370225954c540d372758b247ac97843aeb4dc13d64ce2948b4068e794e165f7b2f85490f4a1721a5acaddb283c0ad26943d8b8c9e6fe86501a7575022a9dda46de28122dd65a1d556dcd3b4de6a2642cce3c040d5dc19c2082beb912980588bd0439381a1ed7dbd9d4bcf5e0923273981f531d2a0045e504ea4844e6face523a6ecb13cb02689e8144f42cac6d5b6d16776802d2f7aa9e1764037d5aee9014037e9e0d6774ee2aa3c3c813f69cf7678ec9388dbc2af566ddc1caa2e9a27c99af65f62cdc6586c4a0a9cdf074d118c59694a4ab84d8e566b8d9a118b69243ee9af9f40093990262d25abd1565609eb42d58067d211d6d4079028362f9342d8712df6b2ddaaefd93066885cf9740739ddb4045bcb4e180392b282e8274d87730e5538c84607d5b8fe0e2946e907ab433170481fbbd8ee59054808bfaa4dd8473f8a91b0107a5ab3030f5b67851445dd09c42970e5b0f0fbcf1106e9023d59a9e1f2f8b9f822e0bcbd9598ae55e9a467dae7dd0802deea389f3f5aa7c5d4796371f025b82015fce397ecd852a18740a8b03a1b2ce84fcc3eab6637ca7ff18fd2310f162f57365fbcad4ccb9c96cfe318b8dfcc391e05b99312933900e264f6e985fad0259424aa15566626b8768f9c280ef2c0ad199ae61db0aa31aaa7fc67b1e176092847288997cc4ace50e85059f8c27069baa240db50083c7ea448e2081c2bdfbad18aac8a04cdf65036bebb862483e21a9328246f51a738045a5784087aaddf0b9d375af49b576f8acb9952e8083c3c9617bc12230dada3feb7bff8168b172b1f1ae5becf238df607a7dceae4862d8c45829edc4f61352871609788585f43553379c3602b71b9f2260902af32a8a6fa050e40260644a389da53037cb11dea394ed6bf485e0e16edd63b75e6a83f7c0779bd65024ce68c149bd1be1058bb532e0539b8c6ccd147cb6de5d04ded0a8c8b39b998cb53041a552513d6b0fa2e023a5765a5c1cef525b7a4ba92457a477daf041a44b5c4ae5b5d00da2afc34bb9c0494799f6d536becb78c829d59e26dfeb9a9b96d3e5030448a261be72326bf28181f1a966d8bda5dd568a2ec7a561f4f6656145959928c049dc4c97c33716b0d49b13023bea18c5d6b6d07ddd55b235d2c91195f58f8474b1a694bd8a846e6ae49fc4f48d8ac8912dd63a7ec0d28987d77bf712d887ac852cd5dcf72573a81533debddf8c2b4f6454d6f94a9b60d44fab58c075a52183e8761b11a34eedd3563f6d0f663e22d84456ceda8dcc77cf2a25269102816b295a2e1143426bd284cec4cfce80dc285218ea9418b0c821dd860108dd86cb264ab0db129caa889fd11fa6aed4430b131991854523ade350496bb8a52babc4d62f2a12b2a86e6cf0f38a585be703683b193875028af0a46a3129a984ef42a42f95a6e8273aa390004b702d510690c3411a956905d4042c242a30922f3f429b9aad2653f2adacd11e1573aa7d05e6038ee246a286ca06e4988c40354e8e65706ee1af8241e9f1a7a9924f6419ca84b9f0efc873d77b5b867a7143d36372ed26245224ad0fb0deb0b5568888a6217cd2e89ad0be985e4800c0cdadeace68a6a3fbb54d39034c4ddb9961632fa936d41470020cb0c8578b088e6fd2d6f03c56a0550d6cac4e5ee370146128c129f493e41500170fd559c4bde95da5ff8a8b6b996d530bc94b3cff517afce274b36ad09dc7869d02d64359d32a069978db846621fe6b7bcdd20f606d637d2034ac65d591cc59dc3bff4b196db0f3c6ec6314d37ce9944b6c04f03e12ea5d7ec709d2f9295c0b45163b942e7eba8048735143f3d5d125d4dd24359ba338a769eb48f34274a650c5f0a6da430d75712e837fd85a9d2fd6d63c64da445c104da4c017649eb644841461962a4418a86f74ae8eb2ec0482cdc90dcbf2dc43594bb7612816a56a3e3059729b06cc280b173a73d952be9b18699b080b529cd1526b14f3024909e7e936c13280e014512fce32bdadeca77b8bf100a76fe95d2b1a5266a38d3a2147efed81875a0ed0e500b7c96a84c644c5aa0bb42fd78d539a23e479a1b90967e1d8da1b91707bc0f85eaa7a7cac54135d695dd90209ab1d591c2d19c9d61449f533252196146f8779bcf87baf05a866d0f9d421318b5cd10c175370cd005bca182c2748e1eaa92684159671da969e34d8055463dcc7ced52b43760eccc5820c3c64dda620bec47dca8d74220f78b27a5216a52f7671f5cc94193a5969f994c364a52783d74f2f7481580c7aff1f40884d03fd10330c0b6f51cb4518606ffb41e235f2ea8aee11b194384d5eeb5f981f0608d950cefa33946546175e33fe915f81822b173c0da3f68b3ed26182089af551e3a076d63276525f45860b12666aa0831b6b219c0d5b603e19bc547ff19822417b8cc5b4d4b8fb039cb01f97c2d14bc08c97608600204fbaf6ec1ace0ccf5c2a4884180a3ff04d87c7cd2139e0de335e88c015d62db1ad50467543123862e7b3c43615aac4d2983d70a244aaba5721f55677604733d8e8e48b7ab0894277906143766ccde443116bda962e2c6f96e6a3891c737476f2dd81396f9b91d255e25e9ac12455382e61fb2fafe0f0a59be2e535738ef148c9cc2d6fe6d5e0d80e777e5676c52fecc0ee4baa6324b8b00a6e7101684c9850886ab681882b03a8a8687ae5637bddcdff1d67c822f5cecc14ce4e774ff43c34a55818427244300cec71c38d8b27ba7e85c43ee0e80c7460352127f4c950635f930f4898ef7d9866c1fc6a7e5b5b1aaf298cd3422b847dbdea54a85faae1894a2de591ef19b154f4ba5317c5b967ecb803798a0bacc10ce8f72b828a32c52396cf2611e06fd583b9dfc3c1b2afbdaacd42c4b72c4121bbd2b85cd665678269cd4aa0e39c6b9c228eac05d9490d3776f99ebb93ec8a28a090869c502e585d253a626d8d803a0c7a69ae8dc65ccded70ef6c3d38c7ab20a68fb1431e43b20a822f09753d5ad2685637d6425995de1e4a9eb4f52c1c1f07fe30ae16043aba2e544e741c4b599a0d80cbfe2bd62c595ed1c5537212de0afafc1c26ce4564dd5fe67884f94e98e4c4f0672462f984ca94f6631ac5d67f5ff407660c432cffb78ec7e26cac5079c7b839227ff593410a6aada675f690c90d71459a2f31ca64ce3018a9d2a905785f137d22574e64918f2451eb1813f81f3cca2857ac9fdd908b2bf49ed3b1ddc48e491bd8e2a39259d571b2c1cedb4e926a84076956714c1edd0c9bdaf72c6a7c07f079d0ab4948c8e8abe50ad09dce542a7033c6f346fef4b37874a71a818c0237f163db17e51753a1c871cff05a6a8e2d4287515dc15349966d9c0054e7c556803e927ec07267d379fde95a88de81c4f96c4564e04dfeb7c8259d1122ac8c3d8ac7d86e0cf3a07cc39bf8b332732d51bd35a928992e771b1eda7ab6692955fcb2b6c40369dd7e91982f4885b3603777c0d98f0f5f9a83676a01af748fa76af02dd2ef584762b6316d3f83055b0a9b78300baab17ba5e14d5366ba836698b2e8673397b2d0cca8817cab0f362a9cf05b51bf1b72ab6868b31420a54f111141ac99638c48d17eeb6dd32e2a13886490b1f9d8ae7309c8d723f23adb6c541a060426c6602b028d896206839f1b40f482b003988578029a99d6324557d47dd899e86198ed4dc927131f47367ac2fd29050103ca5be8a420e78ac4092b75102a912763818d2ace87a416a38abac3389f5073003f59b336df22868f4dd6e053de60ce50740847f6dbce87df66be04271ac73384588e61fb881c8cc167011c72cb3a8043e3013f7fb3f76109ff45c863ca81f07cf67566809e88728ab9e26640e2b5b815252d8bb8718fce1393c4717f82d2ec9fdaea231b093700070c1ae89787df40726506c2c361528b609480b143f50387cb58e7e67133c7a8d1c3d12e3db505a752bd3331e8ac8fb6f6680185799c5aa66e5c62c0a425b5aa4023ffe008dcb8da783765336ff1354718e589fd023c5ac06de0655faff569f918f9edfc98bb9a78c8c8d08ad7f07495a61e010caca49085b7d6aa2457016c58ce02501f97bd9e75805a91c4b6fbca48ded99a97836d343fe990252b71245333f93417eb5034b549d2de289b403495972b7dcba97329717287f1dcb568f2e665bc3678f29224700b2b0ccff26910c5dd59de6a54a1bdf8bd7fecf9caec95be8298110ebf5ae8590deb49164690c794618cb7a4428c5672bdf33ba6d0b24db8a049810c431d192043338324016473b72e1b32dea9ea3d68427195be63c285f70104bf1cd7195ef964ba3d88a554743706d4eb3d967660d92f666da11ba53f7017a8a0ddf5d554fe40d51a24614d07e363b3520388a34adb5fe608e7771e7b6224842cab6390816b7e0ef6efea1399a02610b00467493669f5076e443a60f7dbb9ba2890b160ee8e4ae5369180c48776f6547c12cccdcd51b5dcb6ceb4d15dc253a0ed4d4b13fa7949157243105942e983c8dda05d28f70527612219f820c3e6f756c235baa97b841f16da92f76ebc3c90cf20ad04d112b3f83a840d55f91b2c1dbf79741d8cf83f3b4da305ebe8923f5aac3257f3d7c003073c407dd686c18d086cb38f7e3ecf233671e9bd3662a959b6610c94c5bd992e32a14e9152da87cad3a7b070161753d00d0556d955e8702968497c9c915e9966e920dd6ae10ac9b95a01da779416d19ff48a4f2b3e757883a92e7a8a828e1b5ccef4d547fe96052b1f3b55fc03c8eaa6ee683dd535ef1536d741a4de7737e8bafd570ebddd8a14279f85b807c727ed1a99df1e79fde1a9357039d794380bb2ec29877ed6afd25d3b7326f6d2a767a254e9f5bff38842598f31f1b3426634a4b30abed54c4c64e462c6a6631e06a3d3162e6cc90a81240db6a48f0bf5556506a5ae8f9f64d54a35d61de63b86765d3c01bb50d547c1a90273fdf7f8ad560806acc69c15bcdce64d5d103819e2198c816e1463fdccd57ce8164377bc6d827768db3f1f0b51b19c3c1d47a51926346b2b77d51610cb5a62965295480f804da449ba1d954f34aa10516ebab5ad8b6eb858e746d560ee224b1f95e6eb1154a7b4741ff2bb2ef7be3b666990224eab6cf2fbbc1e7eded9c9c0bd74b47f39b0b3da92b864aca5780ddc664edc38d6e870b20b3e7aba751cfe336123711a4fe1b52ab6fd62ca31bb2e64fe46199c791009f4e3d7b4e538b3e060762d610adffc1838a7302618f38f7a05a03d8f38abbb479c193b27de7cae5e8dbabb702f26c06322e3f292c4cbf7b2cd16037a53ee2b3d9684ab6103ed4ad24cb8e2f720bce124bdc96190beffb2f426714ca0900ca383902200b87ab89c975e0f3d7d4c971b326463ad300ae47229ea112714635a0b2f6c42f45785ebf333ba771e4c5a6cd0bb0d5935e1213743ecb5103c56e2a6035654e02433a4381ccb1573af3296c0fff50ff2ec149d49172b1a9deaca110edf1fb149c4892613ded4224441d412d4f0e6c8be3e1ee927904e6e6dab84a91dbbfa14007ab7518cfb8d005463a853904de3edc27e13c042ac8058777a38e34ba32e4b99631107e45e051c97e578a7ffecb24ec172c328d73c8734c78eb6f6e988d74a218fc74747ca0f1935c7c0f699e13ccfad6b04772995efd03af029b014edd9c2b7f0377a6a9ca165f74816ede5a65cc4f312f5cfc07350d71a184825511c7cb6cc1d4f805beef256a54d30d4d16820f8fe8c5351071e8daead4c4aabd5314af871e846e83d9485a5208ce17e7d031bab2f88a7e69d687502555bcbd8d8b42bf9fb98c97898e6e616fb11a5321c664cfe911559bd9c2eb6c8155528c9df1fe7df8a5c5b6eb05dc4caf9003e585ba75684e4095a8c15f10033cbf40fd041b3827dc5c770f0a94df0e99b31516c2dac662bf9699f1ac073a5cfa6ce7d4d24cef8197229586b0347133629796afadc7ff64258bd70ca46ec0dc76d9fb7da6eeaeaf3513d27c023c6c8808125d3d307a74fd57c9c88d1cdde9bb6dc6686e5368bc8fe728eb00fc7a332a0261f66fdaf16bc4c239d058c879b4ec96bff736d191fb4ce1033c24354bf170576c86e88efeefdf7c649d7831b43d97b8651288b6200aa2f940b21eafd8bff4c7ca93882003406f02a6d419f807cb3affb8f97c3e38467b191685373b3dce6a0fe6c614d177956f4d668f252c28c53a46c9f1828fd9b29a80522c1f297a4130f1ee4e17d85f9397ea45456180cc19a9b33d9c8460800b66d1fc117045a9000f121e83c92d9c33fdc873597817ce4fb495b8ace71e4c615ef33d16200b888d6c31febac9be8b2ea656b931467871099031e5ad1cca76a0ea353323faba4a9d86c4b761ff873bc9d3468a9768b71f4f4c8737b5d41399300d8bb993d252a5b058402af23786a499392ce225db3741619b8a1d4b92221693ac9721a8247c4c65f798d117694a9bf1e532133738c57af69772baa809d1c85ecbdd71b21f4055ecf7b2c6743c98af46bdc308424b83dbcdfd958ee7146a16f3b2b41a5b215b0cb1afe8f0560ff09d916c66b8d1c42c22a7de7f51aaf0a6cb726881aa4fedd817b756ba5676f08ee56ec594468aee2f256dee35c896a864c79ba8a3d1481c6cc894a4613f4f5f21a9e4ba84bd6cfcb165cb7d2226de1a8f832d78779995c799ec68fe42a4e620680d3dd1cf4c71bed85bf68b7f5d8e7cafbd3e45cbddeb31ffa7084f07c28624ba02041275db85b6fa83272b80c7cc88ba19773dbd012edf4f5ba4a1632379a4acc2e7b61f177bd76e10b8ea817d206ca65dd49c030afaa9cf2eacad6744dd5e8be557939637afd464017336ac892a86f1356ba87aa39db02393aba638d1203a51556da91b062ac74f1bb3faf4e36e3a817834820f60b37026a8d8d0114e844f741122eadaba949226ab5675fb4580c5052f45b47b89256b208c741adb3e5040fa97341ab886f0fcbec2147e0c9a9e16daf4ef1732fb8442c7a243e87ecfe6675af2310ac6a72904c3b41432d242fe3819fa159375dffa181522e6b172e540678dfeec08933503c369029963ff2038a20e847a35aba0d3998a19198de7ff3033eba40cf97266d7088a547f0329f03a5f450d1c698ece65a842e1d41727e6fcba843d0c1c3b71565666c97a9cd66b152f508b52163fa62a26111ee3c52c018e171ceddf382d239c2002a654c94f3868eee695cd696761bb8a384d663887c35d984cb978ecd5c1a494b53041713a5028892e0e0e41beee2a5b030b414d925fc9f2184273aed95499bb45d4cd8b1eaacdd82ebcaa7695f517d551337cb8155c6b0bb312ec5434cc79686be83c35b29871028c832471905b72611ad2bc082b52ed4c183c92af85c2550a30c61710bba041863779a60627eb87dc3b9cbbe91d144597e48c1b29fc6939018238099ec514ec3430730ab3e07028252cb4f0a697de45d2f08be7d3caa5c02ffa611f873bfe6d29cb80803068c9661231496cc392f2e1b9034565abc9ef06d0000b7949e322118b345ba36276421021f3753cdc81349ba166b0091252fc128795ac39b17aaf0648a57f46eecf31e2abd082d651f91cab2997b303f0ec0a6498d3b522535706147d00d1a15b87ee30a75b0004d3d4eda6d8757b8fe31554e29c5814daf94746f3a6b3bf20fb318c644afa135c28d569777cec9c0437b2641d6095e4e6a7fa06b139c76684c49a2eb114f82baac69c7d09bbf3c36ebad2b965e828e495b2cd3a83babd8ecb2766464654ee5d798e8eeb663fef909dd7b13ef54f2a3a6fcf40c18cd6cf623db8c372443306b0f487d2672bdfb5462911160e2ed121fc74e2562bfcab71bd087302011eacdf6be2ed983fcff651bbfb2855da404d614d5978b2db40a80075f835c1e60c864ee9ea63c6a3144cd6d01ac888066bcf10abeaa694f89d7656abc61d134622b1b6a23909362f32a8255b77e6eed53f30323b0bdc95272ca18fcbbb887d08052a0cd0444cca78856fe3698620b15fab76860e591f68d02b1f2e8e7fcd24bd68ad547016845912a3da1a26f53635d9c9161f0e00b481db399fd2e27434bddf7a31c0df9df41f93be617a63ec221010563ade482c7e78772b46bc2b619ec952f0ccfa7fb14a273ba4ee095aaa25d16aa3cbbba51647a5755564ef3a52cd40aec27cacf36884419ee844b521e4b873faa9da86febbb84a0d553433ba190481dcce4f1fcd2d322b3c1ab0df3d60f32e2b6a1693d6ff6806012bfe700a34ad879cdef4fe0e610add6c657d6c6019e5f3f3190a39ddbf2d6db60e88ef4d6ce8199bbfc46effb44851b8557add8ae717b9fc040d3698261bd9b88f76a9eb90672f928f3364bbeeb256065f1de261c7ae2dd4e3d880b8465aedc558ac3bf6d47b162d9546b6a54a20455591321661ae63628edafdb07e0040382379848677c99308717bedf4896982b8c5da207cd3512b6eec27c44a7914e2f766ff4aa18020492b24965a9b6df88cfa2bb33d95b01c6cb7dc42df5db14387b752603289053187d3accdeecd693229076e5fbc8f326451e1d935a78a35bc8be982c6d72e9f1fe4ee882d35b9fac5866459500afac2e015efdc8855380db88caed559f19a06a085e17e04da742da2f2758c763bd195c2cbbea21ddce8278207083e47c245dd33bf38f2ea9eb2f704bb567669e6e9b064ca9c25afec027c57b6a37899de0f51334d5838cc71cf3df5cdeae8e3fce13f1384ec9e4728db3a1af85f2cd4ad675d0867d241c788739c3bdd966f66ac6f285ba8d73a54f2eec7adefa638aa2549d3769e6c4ce3ad20f72fda866a3d9e897156131307e434246660052212e0cb3f8f2deb4c39df9eb63141a395e29ae48de9239f6f54a41aeb3efccb8f2b80fd25ffa401ecb1a9391bf600ee98d259d38a7262176e195fad5b44d1231db14d77f53f242dd7398190899d52ff09467609f8e864843777438377610568461e615c704d5951a15f8e3a52997124d29f0842877ccb137269af3d7ea2e8484400378debc0290648c56b1f17503f75e67175d68eefb4a46d8140143b323a1bde8817ef2e699a3689e8ca905e5d26e73dc68d0db0f6e403fef4c87a19fb6ca96f988c4574ce4349c93754e7b76955390957fff807e81abd0ae8230c53de6d458b283286ecc8e6351b9b0cb482f1ce414c0d343dc4bcda2cd6583a3f274e1732388b82071e869d3552eaa36088826dfce01cdaf36a159174b149fd3e042de8ed7974b7bf191c707bfbfbbdac272ca137148d039a324cac56f6321148b5e50d42a11454e34eadb7feb013d8060c819a5b9bcad13ffdac8a6205c74230bb7dfe56d9a22ba1436708f3ee3972281eb11c38d453a0838af7a5d6ca5af03fb50225cf1a08a892d5519089d56e78c286b5d3d85458277db035d8a946a5c9ddcbe2a9c055e318d0d0ab2dd1965249aef6581ce005bab0ffe359f58a42e6345208cc0767cd8c3634247455a6d7ffc5c4d5549d091883e8616f117bf0f8c195bcf3a0387806768efec62d6bee9d9ec5a38846bef57e39d99b9813e94848c47eeae752c2836dd5986028dcab5409d1a8bdcd88d07580e49642dbded6fce0f722eafb978cfd6bdd3d3aad4399aa7b1c9d03cac5d78a5504af1489f02bd20095f189e7e619c300e28b7c31632208cd6cb89a51fc3d5097d367a3a4be7f4edfa5c4c3ae584fa39b71038ceee5ee8d5339112c7adb94cb231ec2246bc37dbab2157ff0585a1097fb1391326f7ef1463ec10c576cb8069dbbd6431b745ac68a5a30c7237b086648a4d518424a513a33c2916cec7d19cab1d846145f6dc370469a958618f9e425cb116022fa5f45bd149019b6014ace7fffc7970e22949f1d29718027af225e6fdb7310ff2a7fd92d778af786f7fda58b422e735889c96d49c379aaac90bc6dcbe8cb455cce693510405f17e5af8b20bd108f20d017af7a2d02209b0e1de64ec41540543f18bd15bb8cd0d0aba734eafcc3bbb47368651f7ae98652a3cf4e0d3048b99f7ac7b821ed6ee3f07d2716f9944d89de07042ed4d9b28d609013f14ffaff8e85024eb39cdb03a6185708dd74f0e100b8dc3a9f8d08b1e92a2601cba2e7a863c6dacd3b94e16a1d04e3dcdbd9d12ccd7c998b9cfe91b1b2d4b8e085db4b030d6cadc772150246b6666bc5b92a4869c9eea5e66a39683e16b3e83b125da9687946b4c64cd81eda73bdada3bec03fbf4924198851e746153d0e5c232243637e887ddf3682754875a9c478d55591665f5087d4bed62d40e5fd344a88d52a2fd94ce3adfdf91b9cd28f445e1477e32b4ebe250a74ccb35149d41a412f4b2300a1b01750ea3c15a8469f9a12d9af94b0e6a6fe5b38039dba190f4bc303e8ab82d94766af96135228249d24a46b2214e92cabb1952794816a956bb2cf6f167a849120627608da24f934624ed664202a90e245b724d77e9463b2759d8e1a6aa7d9268e03b00a5585ce08b108d47389462708b50d23a29b6053752c03a635564b08f46cf13f352af5f887740b1ad40d126c8979282855d1e8534d9f73516b15b1fdad74289dd63ed3f65605aa17797312502e9a7864b316e261088648c3c85a35e8a0d1084f93409afd3d19e34852a32d3e22970aec7720d512950a413efd387fc5304ad8fc02ed583c31fc0e7a199f999e66306f63d4b9ef2f0a1ca7197826409f14ca0f58ed6ff66109067addcbb496d5e793d0541866567c7340d939b32488a232c0c95358d2557f1a5c87344d1a208fae9224eb5c81e469583b983c5b4f669f3808f47828934dfb0ef192b91419d525347f56405418d77d1edc73e35b515632e1fc1f3cc5522b4352eca398a2184d4486ed583a349b71c3e68b58324b8ade1eb16aa5b2d2b74ce734d612fdb9108c25db5136953a9f298f556502deeca6d197ff61bcfab6c98202ef592e6cda190c977d5c3a890f3c39e7145638b51d817d38a23425a8526c7d5dd2345e2a06c0422ca969704307fc0ac8410a415fd1c2ae4e63dd268cabaeca4b4b8f03e41c67ae56b5f8c5175dc1ec7f40c9c2c1f32fcea11aeefa06d85dba7ffe1854a948e6f857009743104da648ca589d3db7bba3d06c9b8fdcd86c38a3a3a9374e8f1d5d925506a9d71968537bac155ab70cdfd36643ffd5889b67109949e55b01e42fc353bbbe24cd5adc2bac5ec1b386af7c12c531536048e547530d4dfec81e636362e61c2f6e875817e64bf537878cdaa9c9f7ee3d4df6a159db554f3c675c50ffebfaf89eb9344f9778caa781438a94e277d580d632e34beb55f8d671078eb949acc5be03a6ef9d446abdff436501afd9dc5989e1ef1ac29b4a41574b9ddf26afad4fbd6e0f8cc20471eac97642a215e9936794096ae6958cc387d554efcad289d99691a8b56fea4b2e2aef37fe406e5b079a9ba6389f9b7890bb4e057f489ca55e8561ba90219444a67f0186e1cbaf187bfdb494cf178f662f2dcb655333f4d13c7e8e803351b5eb502d1e055e051c5f37b2de16a49592366093828cf1744dbc481257b5632b7c30283830c6d4d4a57e3a1a62ec57df180882aca0b0fa8b0ce1237346f5d0c7cdf12ecb11870585143308ab3cbd546ab118f0236adaaa6a24006d099dbef59130fd93074a3b69deb9f2ef38ae6f06eb701f9e543313ab6a1906fb8110f775daa9043d39a4fbefa5be3c042029f878044c5bef85344aad000902040220c90654f04c819b5c769e2ef151421607f68c25ff335726b1db743060ac820e146b3512591ca61cf4a1cf194ce9404f6e28be2df77281395c723df03d29ffd3affe6a6d65a904729d4570fc3e267f0b46b4bb6e43c23b3046a340e25bcccae2f6fa68c821dacaee7700b2df4c2224b0f2c00e5d49b6c2b82fae9cf9d1be7fece35538aea1c18f7772bc0b51677f43be534d8b61ecd0d6aede8bf4fa546bb69e8059d247a98e629623dc6ba1d932857c92c4f46656d3b2d1720d1da90cdec5c3c18a699776b2a9747f134c8b149c94d76677c125ed53b7c5120d6d23a5e41686c1e59fe56afc9d6e55d1b1258307c8da12e07b6ad4493398f20941741c333040fece27152bc1584f61a82cacdc1656a326eb5e4dd805d2a73961d2b9c5ed728a1927d47160a78a5961026681e7dbd69254f4c19c778daaa66612e8878cbbe6bd62083bb0542953832b54bd118d3d662ea1f17aa74822728c0a98169e0c0cb26eb51df770907012dada0306cd2d807c1679e9c6ce86916a78b037834e57bdcf4e2ced02e1c0aba071de97f4ce40d64240b2f0e457564e02ccb2f8616ab62fd1e54b24296b7a92d849cdf09c2ffd42fb972dee0fb505a437ba1ee6452224422efcbf211779528d5e0f1460eddb9a33ca8866c3922f367694c65810e823981fd48567310c1be869af919bd6ec8bde8887f796883a02bba1a5171e355b41d6f32d62c25beea724353c4a4f62343b34c69018a950576df2537d574a26f07680e4f528657c91d8931e5f923035bbc0490066816ee375da8d98de2b2321494ff8a9af9507eb9c71c48007af49fb848c032bf7e08ccf5891190a885e43fb3bf2e259b171fa8a5eea54073ab98ae1b0a9a65de24c5e8084df5bde6a7fa905f2bcf3f6c8e5d6156a0cf9388d81d2e156092b79a858d854d82c04944bb775504d663c10022110449018e317814e4129dbd9621e19b9fb425bf3fe831c1437f712233928830e36e51542ef7be814a28310308897412df3647a76cc3cac090695e1e6208449141ccc25939ab1ab084814f1223f23e1f7e8890d6ecf807e13399df4634ae608f7a1e3b316084c19ccfc84ac65accc071f9468f6675396d7ee8a73188be49444ad0085b36f3756a1b663283b08afd4f4b80459d2e3cb693f13898f40331e8f1a9eed901b7500b8f9588bc415e7a8ff262d336892b9667bdb0a84ef6f1827842cc03254e039e10d1458fe90715ab2e1144ad668c297265b8d98a15a7c7481a632dc5fcc4cc0fbb6f42c05612e2d39a9c335120709e6cfc2480cdf5c626f2bb63ac366acc9c529061dcda6c77c64dbb557fac1c4c99e9665c116e5c7a949bc83794db8a5c345f28adc43ce460f983956a5b57dca9e09fb29797a8f630540b86ff8c88f59196333c9c383fe792259c9fbeec08bf3b0ccbed67b2dc118ae225efb3b894fa784d1e8ccbe3b3cfe44f321b58defa6c949d84ea7aaa4ea26596b150117d8b49cb3554a0b36c87bf534ac05119db7806e572f51bd205195f20d2201335252ad35dcc870d5b2ab338559384db5219c5ec52068ccc2b7c31609c40f76a91dcc2747743d50f7be8b73f3c36b735e4f5407c1ee48472e2f2dd0de038dc5f21cc0bb3cba4e68a43dafca2d79544e4f0b8f8f6263b3dbb73b847b97c8073656736226aaa76b33602248c4bbce14aa2948d6de65b1287a98da7df30a707473353c4df65da40cd4b7fae13e45e33e6eb190f81f8f5dd48d02984214f4641ad68556a7d83c4605cc3a81a243469903823a1183216833ecf220110925c94ed631cb8220c5dcbf683a3f5108eaa3092da0c6c6ab274fcda8f9650889e54c739cd6da7c16bc8ae408112943d7bd421ffeb8416be34b7899c924746eb03a194fc61c0ffc5063303fee70acc9d3fe92babf33d75da0f0e55a4f362633ab54e2e76ac2a55b434aa9d80271d7d6fd254c9a7f547a4958dd55c4207108617b249b40e690b7bd51464576c70d3cb5c82c8347a1ac1acc19791273033dba6d31f31c22660af1aff125d465e1329c0b4496ada00274e7d344cdfa6baca7caad297d8eaeff0c4113576305635844740333d7843cf9d5c9587b1c799c23f7b876fc7e8104e741a2970086ea3e171bf68559e429f234b1b9d974717fa32c0d4f2552fe953f3803313802376d15311399c61f447bec58f098113eeea68f6dfc6e8a9123d32cdda7577e1735e502cdb0e9b160753650fdcb67184236ec5746b498f73df7205e42751c48ab7e206c9347846599301c94802a71caadeb97f700c29216cbe5cbd79e77f210eda7ca0e36a9e193011573d1988c87c1caca809e47b7045185314723e54d53e30e1396ef060ffbee0c2b6c0dcdf7440c2790999d3213a9106fb36b9851bbcb983be808dd10d12a5816a6d1027f5ff1f62a56191855afef9672433cec070a401dd3d59ccc778dcfb8842bacef28c9d192be7f08068c65afd3ec9b9a2e019554c679462df3dbd2e194ee5b173ff10fab365d074d7d1c9131ead5cd0b72708149a5f9ba2a98d7ca0a303e14e14b45841ee448452d7500c28190bf857af3346f4da1c74a56a5d35f226582b5cbe4d7d17dcf394e055537208866eea3b31164bb04688de1483db604a43c51472079ad9db9d58e07e65ec436f86a53076d6642494321df4c0e15ae8b6183346e7d2f9905980fe93dab02f08b7d7563b04e99f0f83034c413790a36ac027baa7a55dd571db38a3c42ca2928d78c4a593e31eeb1c28ac5805dc3948a33dfa5b515ce607bad2efc30d03b58978a394a258e9dadd196147349ae6c20298e735c3d632bbfab80a5a96e62b20ae059832d5e9a0164a8317a35dcafca9d493b0d77514d901a51177525380b50aa8da9da5c9457738f525f3392280e20ba1fb23b305077d5574798f00a40d9b93a92ca53713c79453e5577933c44c97a0641ae1eeb8880032e519dc1ac0fcdcaa823ae1a0a831f388859d065e693baa9361750bfe529c0a6ff94af838036231de3cf19805b8689ea8a09fe4d884b2b2e8db04a3bc926f80075c6a73502f21088146a039687b065cab3dc012604200d69819380011ab918a005d2a52611331ca4b2ec934e25d80a5a9a6d78224a197d64c10d0b74ca389e92f71457a932bea8bbf156e86f6ded174e88658df4df136d95ecd5ab5add0d8f38934560f6ec7d9456e053048e83cc1cd865c9117c02e49f980c389adb2a02bd409206cbcfa9b272dffd73636d4bbb57d7a4b3a6c53f9891a383e6d3b873bc34f930ed5e4bb53642c1d6a192962330a00f91b13738fb4318c0c844d6315e5dee811a5c840e23b9d6ad02291650c752fd349a50c496053b0d3ed873499aa08695d205e62260e90a1d2b78c20c429c2424d46a8f444eb925900d7c044ac2ce33d7276b8a4a9185ca3625210a27fad7d4c9198df3b2fa24ae15df8c3f5063932340f30315a475382bfa81eea97434974ba8b119dbe1f67cfa8f887709b5823c92ab518b1e6ed65c26a655449cb8bfe76b4ad731dc33d36d309250353db95a691b49ddf206775b18e699bc776a0965e8ef8ff4255c9334a55961c8f6a65d967ea562bb98f8b537d2606822e23f92d6ccdcc2548d39f164a45c987d54adfa8a059e3298acbc4b6f61b26511e6132e53471c205916bca72cd0c9a932c2ef951dd059579d536606e0dfac1d824452143ad52d3b6e586cc1a79cae3c46fb63092ab4f9bcd488b2db69d898d2803a7324b9b478aec4ce142075e0a7ff16a2fe53daec9ebd3b2af8a349761999b8e9bd57ff9e984028f4a9af9bff6a93ad6c7c48ec1e8f57e4d4ba672ca873d76f0b0d4130ac30a53fccfea36541ace404aba29749315b789525555f9fc75beeadb642f8c1594737b3194d4c87ce3dd72b721a6498f6eaef645742c25795cae0958764f25d3b90bee2484c110dfb60fa01df16ba1411f3bfd950179f3a798f8c4767226b84975268d4c667dd454b129c6c6d7acf59f216b2085d7d86f35a9cf0a735a13923e0510ce8d585e26794eb096f8e0c901ab0237b1862002bb7ef1e4c2b066e3ea3581a7bde5b5076b095f4352ef82c662822b6d3a85511b5cf7f62d5e2cae3dfd2fd5280d65f45277340b93f8c820c687d68e8eb5e1de7031e070db53bc29826e9ff07df40608711bfd2e4da03e1ec3ff6550cd30b0400cf14733c732f13498be31cd7bc712c109860f311ffaa3c148ef9d3f1c1d7c67f3ca7857d310385ac1fde4af2c93456de9c4ea252ccda6b41eef0e0ac9370db9cf7355c5fb0563c3af3d7e4867f141b459af37a642d174ee59818385e16776d55c97d25afecffcb1dd53c6737d2d4f08fb25f8ca85708d165811dcb1ee5b721a79b2c10e5ae41d86ae1a5503d224fdfb919bea48298e6dd48679aae98b9148cb7968acb71eaf7799354ec6c7177454349f27ec82264d01226b19c5065e52b9259a973edcc1354d3f246c27a1fd100a9d98849c66ad05f2adc2e3d1608fceb2b72746ffbe5b7b30ada59bd528ffb9efd0024811378ec7b1024254cecae5cde1bec08c30980304ce9ff3d83aacbd1a309f8e081c39aff43abe73751c8d13a83a3479d8c1231033966b54a054c8f667b2e1f804e7829df51940a95c4410e00b01e69289f5143cb7a6937a2eaa7f7d52e591730adb8251c3571cb46bd7ac1718d52a61454c0834068c5089dcc13078152eb6c03baa41162bd8040bcd40d985194046894e1b9519c14ed46eeb92efd599565502834526e8ff9d8ac1f7ed7a314facee1e8e20cb9d3d6e74930bac5deacff170e904ae7912cac034a2e4173e41baeb14204a9d2e446a10f15db5796b99b9034addac464346ea0e08f2761ecf68508a064ec93ae5c5d964589b487576aac7a50e06f2a88775c5c29339a18d56257030e8ab99d17d7ad48655c0379f4b35744c56b5b70f92954b48647c55e102d67410fa9ff818c6130a14b6e214ece3ac6aeb96781bb80f1b814854f6a90a583d31091dc1ba542454e390425afa926460b7d7f40c85128fecc0e9842556de15ffa1dd27aff533196351ead566d3796863639db8808bfb26c0a4fbf264c6dfa70d3080730e2d6fa2bddba7a0422def52e12602b05662923e04cb4a324413c0cb7d90926c8dca7df5aa286b98ddd15346e39ec05b32fb7f145a943f68acc75d5c7b310eacd72dab4c6c341d678a14dd686f08afdb59388e12ae5ec99feb4fa51a7a5aa30cd81516746e7fc6818bdd3a7cf739754278f9ba497e268192757c4c238a6a8c0d7b41072eb51a8f39149c7f434e0d36e1d330b969af45ba58208e442ef28f531ca126417b7abb867d2a2dc3d5a4f91d64233e85fbab2641176d164aa60b74b3d1adf83d96e02135340c83617b3b8f67fd1d634dd030944182bedf759306e77d45b59b6ba36c58a56c0a52ff1872d6016f97b8d9249cfd5c7a3b86d0d00a580268484c1862bc972c8b288701c1be38ed779703bc97de4856f6de00f600ffadc6daea9f42a920756c9851d0622df4ec74e548130f116b334d577f17eb7c1be1c5a16c3878c04531cac4d81f796384590fc5b74b1b186f828083344f089e832389c0a93cac82a152f160d31185213c9495ce2e2515094a6f61d45d45defeb823a3998b0eb89ba839cab34335104435608f70d70ddbc99e44581b69f4b0c5c23abc8da5b9cc017e44b81512d1a0377029c561c8a016632fa3ef8df9f2712a66ac639c6ce305b2ab4ce040985535ee598d945b196bd1c6b0b3af95f82d6f507aca59035547196ffce52493a833768d74b12913d9319ed3ea792b3ae2cf2e0c695ea992b30d06036b4d99b14c78f05d51659a45111cbb9c5c31a6fa04f15c7a29e549eba38e263d5802786e8ee08cf5dae18faf59bae0d3c199ac3cd4987a62394cb93937b2b74a8e5e19d7524c0a76f7abbd0464a54d2b3532ded510a327c7f48cc680e08ef6611d4a95640237c462a0adfe2287cb00248c58c873ece01fad64945e538391ae1d42244ef5b0b3d38136ec282c07f977031443c94a6cbfe1da8283b540fa37518b4c7a4638112c814e40b95dc6f618a135eae9c2571a29ff7548a75e67f7e45a88e190cce30f168eae3f437b94145f1fab0fb1898918378a6b24f931912894de5b616a98efaa3466521d3febcbab29a96c49d5dbb0cb9bb72ca4bf24fa32228111b5e614c25284dcf74f6dd64018eceddae74e90380d4d996493604c0cada9b03396775c10c891e72634fda5d75c6545e4fe0bc8a8f5e55e667bed66dc979e5c40effcd67e0169f777f2c35646db0dc733318cecf0cb007465da70e60f32aa856f2d9d5cc65d135939a205ad7558db52e5b4697574d2d811f463cc1dab5082fc7b2c64312721e334ad85d1b3910dc5d5f781fedd08b8582e08eb5333135ab607a3f554f9869b9e88fef9d1ddc221c45a3d7945a9c4baa149783823d59e2663f54d5d5d7f0436c1fbc1b7959cb89867ae60a1318a5a82b8f4c7c1824320d8c2c32e7389e32cdb57a3d7ab6345915e329dc5ce8db2e3555ad2e3eadf186d6728ce179a58a0296e4ec6c84b70852e0e74eaa03486e9b3ef23111ece87dc3de73674d7498c60801ea316c4f4e5da1058e07ecd3f80cd444a94b72a13783b70569104bad251ddd81c612d4bb437f44f9468304c7e2a59711918d61d6340cb2b05aac09c9ce11cebe65f7d1d9783087eb8f1ecc2209ad595757486b61e2c5d1404aa06b6de91edbdabc493e8612a780b0b82969673350f16887fe5dc34f64d84769e541046f65e2a79f7ae5c9ac634ce2328b054b74037d51113679300953a68f240dc3375b587417f3471faa51d706db6a4950b95381a937a46f9460f0a399e208417d8d968c7123fa13ca2c8ca58d9fccdd2d465f0a3fa773423b74f2f6cb220264cbf40905b99682c1899ec087e369ee2d730b861f8411920f11a231a083c40836414769850330c2405413dcfc0c80e12ab9228cf2c25ecd80c19242529070b7de613def261b5b595c50b3074b1203ab224f0c4142851ea44480ec30ff3c18331774a853fbe07c23ccbe05d09ea4e2b15e31fdfe685b66301dcfb8afda77d31586a58a35f1766c76ba621984f81637320ee6b2bdbc926ebbd92c14e74cb278916d76d3c5bfa3b383e492e7947edc5164b82a6422e8983c2dfb064d037d1b1f61b223a4a6c76e0d0206565602458eca183e1060124a978f3e0948902634efc6b9e47dcf258570a029b4e413da8e756da54ce0e0895bc9f44518bb2b6e2eb8252aae2ad5f9e26cda02d2f599ec10f7b59bcf93c84940c93ab414b70ecd034ffb034b8177686200f3093c9339a02ba28d14520761927a8a8412fd023fbbdf3621299538071975f029af08704e300592ab1135dfbcd2bc95d11ae14d310e6359d6d30f37bc2a44eae1d001cfac8989cb353e6fed01df86a9bc18ff0d7cb2e72540335aa361a7ed88217d92582d64819b20ee487d90a6a0e311f6f39d002419281d9e45a61efb2a770a2cddee25b0b97cc94f80028752ddc38a2eeb6a9078333e62cca22e5a4fbd0820e1d5ce1b31546689b48c5e8669671c21f87930483f32ce46c61f6225ef907835396611b86389c5c070f67a0fc3e52a24896a7e287f58c3482c885b35ba802e0418b01fcc47184123106d60db765bb4305952b9cce7639ea14d6b5b60e844d4c2e902a3e200a846b9fb96c0a364560381a12a81fd868f23733c025f0a31cc2ae9b0373e061cc02075a74ff8ccc925aa2c9b28327df2f09542512dd839d7bb7192a42cfdd5e576ab81f9f9055fb096256b20b1a240bc535f4d3984355b04e1b92dfd864f453e2869d1230811a5bd46ebdb10c51f473369228e0de70c621a9daaedd8d07f56cd84b442e9e3a7c73395b8f7fed25ad4ff39b32c067c4f4a3e7744a0dd3d3c3746bf0dd9bddfaf1817c846a26f4f367122b307b0372a73ff1b65368c638a3560676115be083333da3cf47942c62c9d4422f26d3396b0a1ecc2170436aa6b5476ebc9f575e890d29a2ebc06abb31637b068bab4903e6735d8d75d603b701d105d79000f38eb56823c548b1962073d6542392b29ee0d4738139d4be562b65c433030e0ec3b12f672df8ea63770120378a756421e95c692265ea3645ad8595c145852b98e01eacbf1c8d160c855511d29219a606210ee6a8dba04eb08cd6fa693aa5500e65835f90481e06822202555d9049811957af318487485d41433e4ad4e1813f5c319d6c1f793a70b780102933ded832bd79659404a3f921440f099e99b05f18137d7e19280b78ee8e16a451579389b589101e42f1b079f3be829aac7d051f57aacb180503fb8466a12c9ac9d4093077f3329c974624c74e853eb976df2e62afb74c66296bcad0bae2aaf9b140cb349f2fef969ba6b4c62f6560a8e56997c061c71e7b42b2d38aeedde07cc2a2001259130c4ddd842fc73f79856bae197612f38c68576708f3d7538a9193fe624cea92079485bad98b9a00975c5c3ac1d2849c528fed73b5950b6ec6ca9a509b64ba4857defb2d0fe11661115480bfbd44fa4073e6f76e2ddf08472a79e20a0c84968d0688673aadb6e7220c7b87c5729f963b5e6e3ddbb6a7cf13588f5444cf8a167a677081063ebc0043adf57eb42016063a60a5e582572b49369e598eef8d480c45d0f828c44d8081ea7b35e5200f97d9f694412c8c9dbab6df7c247448b5f99e7236eafc51a61650c9e0adccb9e6dbc7909fa87fffa199f1548c6c2de364cec165c4d1b945505280df7cfa939f14312a7e9db0974de6781a3ffa6e953efae6884db2b0bdc5d2343decfe71f4107090ffdbd6e39d93ef12f128ef0a5ac022d176b005c04ea32b1e26010d6ed4649275ff41bc7a07d703546eda0474b8cb5b8cf1378b3e610a8ccec121cf08f9a5ba693b99df75184d8fd0649f2b18ff17c57d17015d8b985f24070a327e54f38879fa4db0e5f500ed027e5c77c1700d32b3fd3d1175a21e8270a76235b20bd3cd402bb3207367247ede2457dad9749200cfe449cb3958dd90e3e4d8113a167685aa4689fcbdef523954ab3e2a072a7bcb9b6630503439f4ef48d180f2d574bda915c13659ab4b7995d8012b42f8f02bdb4241b9752903453af80869e23ac8ed656430a68819b1ddc092b742a4f0407fa2824753a54084f16b53b6060024d15c5405aa7064cdeb481e2c3c8433d4a64708d800f29527fc1640b07701370abbc1832879a740b54db5195a2fb6474b47a716d68ea6fb36a86e768974b7f0ae885bf9aa5b2bd972f21541de955086cd688e6065eb45772562bd26aa2025af3521e4dcf31a2927e86597642accfc7d684dad2e1111900303fd46d169abd7cd130c6e374d4c2496f1e5b7528cf544035954076f78726f8da37507adb1fe26735da4725638cb9d8ffea43880bae0080326a16c433146a88d2d7b0c0f0ab877fe26fdbd2a0dfd5da74754cadf54e48451406a933ff0b203ac3544ecffaa5fa409641718e1dc7ebedf68e9fc37f03c0c4725bf449b1e28827055dbd036777a020b2671fd46ef8768134d00e6dc9ef7c0ba4002a58049c8d01c1a3e7747b0ee5f1cacc09e83d577a6c7b4f52d8a8edff66a3f917935e34fd161b0c288602a60ecead9d1ccf62ac78c9dadb3fdef472f414621b860ea0b3822245a20107a795f9c699f8f7123d37d3e23e298bb05b65605a29492f35dc0fba8600e15c22541f9999561124b6912eacea1ae2bd07dec0bbe7079b95dc1e090f84e12761a242c1c9daba59bcb58dc7da782a74898bbf3e5d358d577ad2770fe06755a949aa00262d44dc9b2a412161c83178eb0f677f5068e7e93a0de9de821fd7562f5cf5fa0011d6c6c0620cfa210a60036b651c436206a451155239175f1c972e023020fb6017d1539a00ea10e657ba02b8ef071b4bd794ecd7ba826f7f2e4cd5e9da50ccb486d7577a64b4e8d25a1b5c0ae773309f31b78385db76d04ad9b398c786b45c0870718eaa070f27a5502a5b2719e58b15b255fd86a6392f4099f272a21e8c2ea53e3a678346a41d1fff1790639a5fcdef583c213f7c9f4a8479487f36b83babec843c1bca56afe434312b3bcbf3b9db0e9e5e64055156fb2cc8de793b46c69d05a70b2624eb8ee2035f774d2185b467c81feea70425ecaedbb48467f0a0462fb49e36624b957e5238b5c9ad23a9f3c8cdc28294ec185edda53ebc24a9b7b1e2ff309f166eb4735ccd340b16d5b222807e3e29b8771a692841f154746fb63f2a5fab07b1b2702a54ba7bf67b2daf16007aa214226dd380443029afcb90a8fbf80a036ae26a3e9ac7a11f30e3066f1b0fef26f361b21850f91d4b9901b9a69ec004c30349351d58f2833bb52542c234d078d41ea0995cf6068d5e0adfc3230e7883d2c2695d1b6f1a1b3428f2aa82da355509662e8c72f1b85dcc09591a8b2ce81178301264afa49e747be46330e0cbca53fe1e2c1bc5c7e038df25c707402b5aaef6882db18cb5a8578ca1df3b2e1db04da2fe699af4db3eedd6f7c4761abb0cb34c09a464cb0e3cba64b8f2ae9dac22ea59367e99b72fd8b620165daccc00b1b129aff1a7f731a7f30d0db1173fda439e3c98ac65dcdd7860241efda85945794818703700ff7ddadeecfd1b6e7a286e927989063fd418c1612532fda7f17c68202bdcb70d02b201e6f37916e42cd5c58d60dd7d5538c1e0e2c9d052fbb60e47985daf99f97ffbf96a106541810e0a565b89bd134ec521e009dab8f64d7571c83bd94765d55f08983d5db37f6b22c984ce08a765d666877406321b8bab0f744aea02093600387b228379143a32c77ed066226ca385a9703d4a389bc48c10eee9b0c39126d42b6863e505e9d096531ac79ce825d73de9df9bb8046db9f9a941c3c08f0407bf4baf9409234b07b7321894e53767a54164e7b0a10eebaba92a241ad6a9436baea37a8dd6b5f0e8ab444eaa53ea84909d3c4482fa5286c1535733131e6c744ad6f2d9c8ea2fe19cb20f2f4979c2b4923890f335e52e56100543305f35d0b895bba9194a610c8e01c38cb378c15245e3af6b5f4db5d15369d5629d854c92671d29117abce2d57394f176e9239355b59609331945f719d54c53599c3a68ae0fe720e97aa4c6923559aade77d24e199ea06c4680e400ed2ca74065e95afb9035a61a775a81885588175aa5e8f56c29be90a588531e6ed918993371278d86f1225c35455178079180c8689cb48b5c5e3c2ac98234913fdc41432d0be5aba6a449a5d53c79ac8337d12b737c50a604a1dfa73eb7ad381c12a39efc8c9e13dd4c3062663e2e2e04558826b28cc700615cec997c9d109274c432135f0ad5096771b1c88f88393c0edcfc4be6a683533b928928f0d215d1a5236d26f2dfca7980a2ebc3ae208375df3cd7cf747da251238e499c46616421ecfed7fa3ce3600a8b6bc5a1521320b8077e38ccf283817aa553b0135b664d55671784ea28b6e1df7f70d21f34be4c4dadd7f852fe2948b487c7a9330118633064ef1d54b755548ef82edc59fe7b1ffdfa0c8e49a6cc5a9a6172fe9e45277ae48f0dc1d7e88ad29bad465a7fbaaf00703d6379fa384872047e4f5d08cb825dc461c7d5091ae9c5a9263b2dfd875217271bb8303457fc86c9a948f6b5606575bd6f2a3561dae3c32eb5804d693c1c652bec7d01dda4191fce039c99e32b317493102060cd7d12263732fa1535261db270222afce07650a53a7198b3312c090361ab907391c4331e2352551f776dbb1568b92dea390a4dd782c51016d15114566a4c1e6bc4543451880b4b52cf8f83b3cb94dbf7bf746634307dfb8dbb976378a2064bcd998dcd35e6769e9a08842bb6db4c3cbafeaf33dc71e36c8bae619ebecb470fd604db420b912677b06a5b41e70d0f59815837f919e0351d77ec3c4d8abfcbc1e5407c0a651c5cce7456e95de3337ba80313d06a67ce7c0d369db4a0708c203a1c1404c024cebdf9e7a1a0e7ee3067f934e2c9490a86f21bd844720534125d16fe144b20b848063b95144a0e65e9b9638d046124a24a84a78d24cc15713324b24c564827f30b61512247810ff699b9080e0a0cf882cb9b16914472d598e3bbad470c479d0899a430ca10d7c2f6d3c07f1f8c918e53b95301f224b29c6829e01b4d405595712d0c15accb86978f88d5f63b5459d804b3e2896bf7e48541f1ae23e3837277b4934bcdf0f2901de353b78d5705f56cd8280ca178501b0354a58b334464361310fb262098ddcf6093c52c1889e49e04f0da354463923b7448e1b3a35331444a6c1ca466fd7999cc7b59af49b98a5361c84594c5779974fc63f5ca01ab9494a5482a837f5bb21a41fb293eb4a39d3b07e00cfeb75a016172aefb9b31f144ffb8104869e4a232fb63e48b1687c9446439b69e21a2c203769ff4b054fc743d22e0bfeac794940b7744c97e63ed4860bf00098ee2eb43c6d4e39e1f550268bf7b7bcde43b629cf3ed35ad0b23d0acbe2d9e108c2e0e6a236ddf7d35bfa4d59d780709f0b46e6362c1f758359878de620e8727586be0e3b416d99f221344b3b532fe107ead926ec4b591020bb7cc92120600c31a59e0046308e4393cc3fbc94c16f316e91b3adeef1148f063fe189f72eae0b702ee84b95698cb6b69e5a75ef9ee07a1fde23643933882663b7cb75e739f8c0e4e0286277e7d0cdb069e381647a508443a7143820336fb90b75e9b009c8a4b569726d5d85834074549a681c9436200718002dd58ea0039b4c58efae6060e60ccbcdbcafd80409d7160b2f763ce92bd50926ed7d8628b596fad6e39d0f8a199c7edf7e4354b8b10f4698711b054ac0f55e18ac11e1e51a76534507c5037a6fb0d0b8767849cbe4ce8dec945c461326b4cb020a12e6685b30903a4e075aeb77ae4e2134a1d12d351b63f235de02671181cfc4a8358fb745d5c3bd1d363d81088ccd650eb496743ef0c7f7fd708d73a6caf5247e0713c44cd5708e719f0b3324671fa2518ffc847d41444bda9652ca245392017206280641065adc220de628ddea22a3302d61b0a1a1580c0b9622a3ee64c75cdae39860f9e53631176f33776c6e761867d8a5c718af565d4a8f3105197a6ac73d3dcd49a9558a86bdb0148179752b48084a142e3c4f12d9af813c20270d8b5aa86ea3b4af555bd2b0bbbb9bbfee8e714185d87a2956046d5abd52a7d9f374462b434f727bec11c48a036bb316ee38e52064dd76815970a7fd8739a79cd215638c31084f5c3d19ce044ad54fa916c968740640637678d25dbe7858d28b91b53ac0970020975f4895dc977980b30e6659f7687309cc5faf20212851c284d9628b2e5ddc8613fb3110901387c92a3eaf6f33770f0530f41c76cfb49442ab687821a442d41f8f6e9949ba6af1cb1898d5308ffcd6b6c06debfff6bc66b19a47c714f716449d66e8350ef4faa1d72d0040af73dc2f04d73b005441638622a64f779f7346fa011a6f09d1218f098238e7cbd9c130610e9dde30875f0450f60cc31cbecd70fa4c97dadd1dc4e6891a633776148a4211d6ad2f0ec529918a18f7635da3f66cdcc07e3146da42dd8ab139a79cf28d84c055affa2866e4a32806ad0f5883405874fd1372f95d782d1ec129a38685ff2af8a5930368ae974a7f54e44343312c55ac2000010e735230fb310c46c58b24a574d2d9b2baf6040a7e6428020d131078590ab41a40c58f272e50fec429fdef6907034b97924aeab204fa344ec9037322922c2b537dfa9c7452f75a2b11394120330f38b707c19d76295da3a139c11f26401ef11f10860677da691892c2a1974a372e3f0eb3707b461cfe6e4f1ccec0ed491fd5ef8c1a72dba2b4802edd5d4a4a99db2573bb9c53327b37d0194035ea50cfbe5a29e59433cbbafe1ac8a3dfeb2197a57b0dcce9f79aa5d7ef750b97a5d7c82eb60bb6d92ea175ab5dba4f9fd2d4552b55efb21a647223b427756025b7bb94d264d2bad530a0575a4a4925a57252d36b0cbdea0d614efd9add50c39e4e5d6a79c49833bae5915b736e86d167bc837eb558e66733f7a4ccb3bb7a84edee6e29a5cf6e185a4a9f2da5cfe69646aecb4e4af59a447d16b4cf5ac16a402e546928eaa1560c4b152b63ee8742d5eaa33d140ff6639807a3628b36ef592dcdc2d5c355f304798010e841afff73e16ad7abbbe66160910329b76d041d4cb8cf10eb22a3303860b1608e2989a56a2de6454c48a85b309ec2543c1d3ed88f8382a2c4a21550903963074300c12422ddfa2972c4f3aa67e3c77e508c0b31d02cc8a88e9a55316e554c85a55b9f2a486545a525966a92ee6723c4d904c555b4f9b9ad73fa4f75fbcb41f31fca3ed46c826e7c5550d4b19d2a1657f1696a9db1f6a40aca388d13400e021c70e7ab6271dbac55c56e8f5bdf149bb98f3f237776524a3f39d9e568afd42ada334c11de2d4a8ba0975f5622728240661e701982dbb5ba5483e808698cab06053524361980620c8c804924295918f28a12031f71815d0c24a751f69fea426a815ec52f75d9b62179a7821108b79f833cfa85b0e4604ebf10961cf4fa85b074f739bd7b98d39cec5810e21d4412d2ad4ea15bdca9288ca620a807dc69970be8a5c4893f172e5bb65cb922c2fd3c113ccff33c0f0150e7027015df0692fdf8e7a7d53de04e47317994315a400c15c424f191b7b066b1e2e2463038a8030128e4f3583ba273f3c39d19b4c48d1d88e1813bd3888d3e4662301c860742713f0f0acff33c8fe5c33b16600e0e19f6e322af880b0fdc9962c8e0c2798b186009f200224752082304494c99580f05c8872c1f50477b18dbfece7441e2a983718505b61a00bdf8b0c5d39ec61d00aefa4bdc061b1024ea7870d5ad66c1dec0e59e919d8539fd35b7bfd2be5acdc20b18217431a69188010583063228a9763c6f870a18e851b2c2c25204a684a55b45ddfa4a46252d252e3ba51d2e0c7c3fcfab19c27ea5582956b242bd74746482aa8e12044bfde262b94e497fd2974dbf762d50daa54ab077bebdb3731b714a38280356bbbfb4518389aee8a4c3f4983eeaa4f813950cede891e3361150a7f4b091b8f0a7b8f17b28ea943a5703661d1235ca2537c67762c58dffe5f0da886b242f13643f09054ab7be865d5853a151e08e0c7a2247b77afa9c724af7152c8f7716d011c5529aa35bed3b3cf4ec0b45ee0b2e5cb65a542305fbf3f3f3d3432385e649e0eb933e094cf3564edbf1c4266cadd574b3cf208f4cbb590cb79eea370ca5ecbdfa27136a97412f3bdd8c03b79e4ab534f33c3d53ea2accc9b253f77940e31c7a99d7ad48c4044f26c45bfa1d5eed768c10a4bdf8343434ae759dc1a5fbf429d7f802a92d479645d2fd32571542a910dcf187173583bdb990cb17345c18b885e2cffdaa4f4da2c17e5da5e87e5468470e2ceac8668fd385fd6a12aa0beb81148ac5eea7fd5c7e3f05451dea62fabafcdf0976f914021a9683eecc17f73b11fdc01eeb1ab21f75b92e3f650ba9ebf24fa4a8a375a65afb27120a3d25d54248f69376c4934f644e06dbdf51bad51d0fbd69267652e8f3b48fcade43bb9a14a9504da2433da810ab0626c659833f6417f10fd9b518e6e1efdf57c09dd8751930c7dfc958f9a6db363f17aec0c618ccf11aacec3e7854c48a3ad9db2ef2af5bd645a0b8f21fbace29b1fd54da732a259db4d24a2ba59476122687b61b6cf4973039d42d31dd4ac12c0bfbf793b0ebef32765dc26aad3129a6e8eed1db630e237ab0478ee5a33dfed50c2c7c22fb810bac3b01bf04441661dcef35971878eacd89852a7681b95b0e262202baec00244939acb0f06dccb0f04f6658f8364958f838562c37c5c22f0d61f94db12dc6e04edfb81ac3a62820024f51201381fcec610ffcfadea552f0f91e3b1524fdd8a552882f5f7645e4c7acf3e2ea09fb6df73dce47e4894122eca11c941cec710ef6c42daef8cdb07fbf8e3159e27e5d646d77472332fee285b1bbb8ccb10e19318f15c01dee3a0630a7ff42fb23855f71650473b280abfeae48526e3f17b79fb726f693af57d4a94141f5be48e80a9b4335c63fe2f7d732e04e1450a7bd80550cff885d1f318ffe2e95582c1d3a40002195bab95fdfb0910a6cfcaf06c5eeb75d5a83fd6ad06d28ede56065907cb5f7ab2b36956561ed85528861c1ed1ff221bdfb751deaafd50edd9e5d27c5152784fdea2bbaac129bfdd426d903694932c4b1638c1d6367a5d29b4aa552297ac7c3a980c91857ab49385becd75a91d36b6fa487e68df4f0ab10754c5d6aa62b32f3a637d263df484f5f7ecba91057f289edc60dec0df65364c4577bd109e7440f5612f6038a3a304b0f3dfcf105a55bf37240e00d818c9d37151f0a1788b9d1d51e67e9e17699f8c3c523ed319f21051319ee078f22fbd8985893099efc23670a12a403f636c31ff2bbbb6f08ca63dd607b8420ed310cf55f18c1cf2dfde44240c3664f6188e14d1e79c488eaa05297ae30f16b28e6eeeeee6e975ebd7a756f6fcebb224b8c9614dde0e40625a6e8248c285c92c65c78f289b0bb418b959ffbc1a41b922e7f117641132c056189a464606188c15e4f0273f8dd06c88367ba5848a4c4e87eee3a72f93fbf49c470284b5e17122d01bafcaec45f0c05c2660e818c95dfd60281d08b320432d61d089078a57cd941d613d66391f6b8fd48b75afbd1361dec0793b29a09d8600c1076fee6c4d600c5e81a88aedb427df9a6183b1266aebb7eb07c14754acf48b1a75dfee46abbd01e7ccac5306b2620c614088385444cb4dc0f26bd46a45b90888995cb5f84df5da69e5c5feaba32e9c6f77a02226ff6cdf17d8101376321ae9c2f9f7c22e58c48ae8bae1b0219fbec4aa2ce07e08a5f066bc3656e72f99989c01c7620ef0bfb19b90cc5c2f7a01b1e78dbe00e1039b3f95b5fae756bafbd3dd4f42ee28c66c214fd37b84353a95b71c01f15d8e04ebb3b3bc7d83d48a975833beddc84494a96124ac8dd25449f730a8ffd3e85769d99992b73b384518c54f9a0152da0156f1ee69cf3bd9b33ab947673c620af9ced31a9ddbbddddbbbbdbdbddb9249194522a37afdd5ab8fb102ed61fa22e0f415d762f2638e794de5ebdd2bd21189f33f7c9eb40bc69b80ec43b5fa07796bcb030f07cf8b38b21de1b9fa6c670fb6589898d2fb596b1a594d2b9ad74838def564ab36dd6b3f41f94a49470d53f616daffa8dd18904c2ba1de9f6b4fbdc6bf6d59f763cd15b3a8c32c452a954eabeecb32ceb6a7bb1d2d9dddd63b87b77f7b9bb77bb7bbb3331c1d9b269e7ee5fe7dcb63ba5fca9ba2e339dfab2fbd9dd2d913e2965731bcc6959e7943fe5b7301b0634fe15eacc979da589ab5803c6bb32d6e6604fec6bfb09d318a3a5c2c6a71fe9d31d28b8ea7804fa802d5b89ed87dd10a80568cec993277f77777377739b7e28a59432477f722f30a522a5f429a54f297d324b39dda52739952de594b3639dddddddddcd39fb29a5f427a52f69adc1dd59bab3740f41f70e23522a57a7457d254be9d2997b812fa748b8dc51d350a81c39543b5a1f8c797b37486874cf62043d2ed21c0e73e6b36b854fdef9ed6dec9af20885f8b3e369afc7b01fbb188afdce88441d214549b66357d67dd53294ee0721fe7cdb14bb991ebd6abfb1639566b07f9ba471bb7db09f67615acfa46182aa8fa6e8ce376d5e2ccd859b177b337774c09cf95f5c411ef3e1dfc86221f00780f33db8f3c19dcf823bf44e30ee845cdcf973ce04ec686f7eec3c98339fa7bd28ecac3f7ffe4c4140be7f0af2bd4bf5a4e09f8a9d10d3f438565ccda71c8c5914f6db9b1fbbad3d6f2804320c77e2cf9f3f1faa66d7024d11771c23ea401384ccfcf547c82e5d4aefa875776cc87d100a77f97117723f95cded5d7caef3fadc9d2561e2961ddd5dc609579fd5c02c30c8e2c2bf15563bb3af791c75650fb025e0c2e7bee5d30a71f0c458d4813dd068d239c30373fa618c672609d3943476cd6c74ddb6bb14bb6ad9c9a7b91abb351c2e3e43087bd040e8331ecc816f621bdcefee6ebfbecd7ddd8d6f9a1d69241513ecfe2f7e7bc7f6961dd482a8eeee3ea5fbe7eeeeade851ca661e31c637217e7497ec2ebdeab507dfdd3d83df3528c627313e89f1c9f4e9f2894ff924c62752fa8423a0723a0972307dba7ce2533e9153c26230987c024673675d259573ce39699554e32a7ef30072c358a761bcea7714b00e0f5fb179606db861b18d2766bbd5d073ff78e137ffa03c66a40fe7752a301b68966525ad2be5d998473f64f9c04282bc343af06cb3db4af24bcc2d6fc9e7b72ce10f14f3681b310d1683c1ee507b54daeb2abdeaef47f18f5e02f2e8d7628509148c7f64a5ec668a0fcb72ef631732bf55a2e6f2abbcc8f2b1c318be61e70662c9cc5ce2c9cc4718885f3f44e128973f9e7299a95cfe1a7a3e1eba5bee87fa5445f7db71b31e377b68829bbd67d9db1e906ef65b1337fbf76107377b0f4a969b3deb071e6ef6f5e493f9a8954641a9ead21d97be53faf645c5a5bf2db99488072b2e25eac1c9ab864b7f9e7c286c65774eedcb71a5ea4af935c995f2b71eaefcdf618c2b1fc6bcd9c31626e8c116e07e396eec72a30e576efced09096e7ce844cc8d11429d052489a2e5484ff774ec669c31d9dec9114debc881df73d081ca4910d76d92f85d0719d7fdabbf4d729d2887a2eb0520c3be4a09a2cd6a50ec575d600364868b264c510d900e94ccd81a929c6a304483830d5ad28c0f3798c49c8c4852ea02a651b121431a32b10049456d43a5296852d6058789dab2ee842f5cb50637c813be18a267d8e0278411226ab20612980be8041a88792d39c10b24221c88407202126a8319d528a79453065844f10cfbf9f94902051658c847d12ba5941bac220b34ba2a255d10e08a9821b058c3abc1d628218011971fc2709982c44505555e315d133c3900be7f732d40d8dd0f04deee422063639057761ffc0ef0ed7fc8b9ea34cdd29c73cee9b2a400538f1d5b8e0fa57286566e0bf3fdb36c9a2219cbd77dce2e65fa69ea4ae85b3f7b9389a3fff92d99ba5409f24d0f4496264ff3c48cf39f4e3d63e7a1964cfed9d7a813dfd479a52eab3663dd16f8e967943ee3c0f2a534fb5a7afeaf4b95ba12fa7e7c53a68ff18d5c53978a80ec605c953a23b7d6cf9e27661cfdca516a648e2076cc32eb53dad1e95475e97faa4ba594df101500ca58be52d29ff53fbe5daa7625c0f6e8cf48a53432392231a150728b417a282b96ffd32e10fed9cdeeb3dd10efb6c09fc763fdf9fd9d0bc00c3f5f722d7097a2fff1ec52b44b01c6d5173bc057fa4bce392a893132113b3211bd99581965f46690320ad92da390395460f9654fbe1d7fe8f6a2bd688fd18610962337045ab9115a7182374fe960b79a352c7cde6c7b5d71e8af31816596eed25517e2f02e27a5d38bf92e272dc3babbbbfb74af5e7dfa0985eaee5ec88f5942d9d4a374a78e453de2914ff36442098e8263e157983c4611c1b8bbbbbb7b742ee5cfd73d8a0bbbdafdd92c22f274cb163fa4a85e35f774361ba2356bd87eea75d320acbc1205fff9e1e14522d31e817419df4e4d7270526d669ae4bc7e8dfff5462ea54ac5ce664e58affbf6fa574b2c240262e23a6cda720659b4f041d2f0821ca89849b20b89808e80edd89054f413c491afa35c57b71806898018733b53726b609a89bbddfddcf5c31d38b9cbf7e64229963841fda07460bf5e95a949dd2a232474c40c5babc939cda5fd58b11288036a194e0a7de7a4b8be87be76a4b51fbeda4fd45cdd82b36ba1ec65b39fae26b5b78a6285ba1538b098a0ea63cd46019aaaa6477bfd260981f4e58ed5c572cb8e9dbb494a7902d293da87cc41e8791186ef5ec467f033cfaf9306774c3bf2993d56ddb88cdba6920b773ebf264f65587e9e16c363d24a3b3c2fbbda9b9859d51dfdb553097ed98b9810aff3b4698686d2d8696be03db7e1a8e16900d4e117f462d3026251e10b6e7ffc8239fd351a843b6ce316b78fef5d9e368db1aad3dfa07adb50271f7fd40e6c650f5f832d1f156e17527eb9c03cb8122705ae6139c808ed3da05de01f17f2e806d30098d365f06436e0683637361cf360a8be7bddde6b75cf9d95402f49d0248186124b684b28a9e1a1189625c2b81f17311730a6ff380c8bf93889892df7eb9f3ea2fdd7ae5672faaf9df42b4888ca93fb35ec7e4de5720f55a1f9afad60b9fc5dd4464dd0703b8cfdaf915a8c9aff7a4c27fdb89c70e27e11e8b2139bffe2aba1dcfc17a34421d8900c1cada0fe8b58b4e0fc17b944a3cb1f8f221297fb4531718c8dff62522c73e33f3fe240ecaf211dae47d9fe73219f82e33fa7e2432998c1c581e3b7930f8eed6f9c7cb61b2958726fbc8d93cf8d6ae3714e3e36709c68c1c579d4c907a7a2fee6e4837204dc5cb9d9716f6e9aa8726f9a20e3de3401746fdee6e47303c35c9baf39f9d8780d9513dc9ab7279f1afb34271f4bc3841697e6674e3e3433ae3bf3a793cfcca7dd13ea9ede4f28d8724f4c10714f49f7f4dac9e7a4bde9e4a39996f8e19a4aa5cf4e3ea52cb24c092e6ef61b6c05377ba8040bde004ad09080245a005b338798162e393b53bab8f1372492b8f13f8919a60835c72e0ebed96279b375ca4bc93cc1162a74f0c0da112eb893cb9d5f4f90c39d4f73f2999bbb0b881250090307318250f0a40a0d5e77779ff9b4d5fd501edc2f871723a4101951e60822ee7c2804833bfff4cc02244e7076342e79119a420a19d7dfa4a306fbd9ff92a3081bbe1015714424250577ea2801113de41031c59ddb131a4e6c378bda5ad575aa17517ab8fed4321162422d435471fd65016c305b68704443bceedca604beb842c6173e5401e38c259aa4b1e3f2ef60219cb83e6f5082865bde2d114c40a6d634a9b6d68a83521a84144c6c4811b405d1a5061c2a60378200c3044585cb4610366072138413441a2e9b2a84504133d45021e626280724768a242c3f36f6872534598e6a8e683283058b7da2c9494b8c468b12ed05b019239769cbcfe92849090b921664832699162053509925f50547251b9050298eb21c924c297e2a1032892a91835f419a444d50d812c382499657174c509022466402325c2864817d0774e403f8f1f2f2486033290410026685355d0885172804c085172d573cd1888ef40a2aa94e2c940d05a228bd925e909098a015ae2a57aaa2f05206083d784943882f493a2db67421145f5e55be0801021216c785507c5901192c80be780102195fcc00e10b3b2f84e20b1a5cbea8b1ede0e5e7628123c01ca7d1c1f99b26127570baae5ba65814b91481b5e743b07e1b3a0cc19a23626f7b4003db37d57ff3a9f8366fa427d58ff3a918a3919ef88a3ad00b18182d4ee8a0092ac2f4f4e976e7a9c07eac5d2a3ec42908e0fccd5300a74bc99ba7404a76426c3cea610fce532a36b8f88a2b7f141783e2cadf867ba5e4e37c6a3eea8df4dc7029f9379f9a5d0a02376ff329dcbccdcfb7e98a2031bb14701ed515b1f99b37d29345617988760cc3e150dc1657d186b35187481ce163cd7cd6fa401dfe0212893a0c13015e815b6097cf5ed3676b856d30867957eb3ed6e52fa04ebfc2c09d25200ceed4bc7d53f7c130a5ee835b64dd07bbd4ee835b68f7c12bb3fb4490ddc75a71355c7cc19c8f61b15f51276e812bffc8035cf9bbed3e1e5bd0749fd765c6e34b049397ba8fc7cae370d44cd95dd40273fc3b2a69cf2350175dedb9ff0a08dbef3f334d334569e645b890b5e27064b507dce12702736ad46124e0aa753e30d37d3cb6e8a275dfc32ba50e26b178ac3cee71d444ee780a87c18165243e6a8fc5c820e443d5477374ddc7fde0faf3c09d78fdef08ee70cc901cde0ecfdf6bcf860ef6f371b9679b43e2fbf30beef4fbb3e023eac09e67253ee67a9d9e4ffffa3e587fcaf9b83e7da07c584b7344c60b49121653bcfddc04eef8f7b3138eddb67255b0c00a2a18a9b082741d565c452b184c17b8055ea13e5fa3b5a2acccf11f6f5705299038b9b2fbf8a592ff0c833936f070bbff83d8b10be6f473317a52c535aa2940f262808d3f857c26c618638c11be4fce1f6e5eace9fb249d7fc4f9b1f6da4a7b558aacd05eafd09e0d1d5660a15b90c80a083bffc80fdc8197a57d9fbe9f59007f084995c03f73885d7e2355e04ec63aba7d850b5caefb77856ea5a6d77eca69593011e246d49c3ed81b59e0ce07b79f81ea37cd4c09ecccd3fcc4002b690f88e397c9b5839d1d0b2bb4e7a161eba3cab01fbb5cddf23f4203cd0ebe0789f8fdaca823847facb0d9ee21504be54e1c6c4fe3029b3da8b46c194a7a1aa219000000410013160000200c0a054422915018c8a9b67d14800f719040744e978ae3b12c85611404410c318000600c418610620c62a886ea003de5e1d9a6350566125d925067371e45d432140ab765f015d76e64b3ecde383c80a8aec68372f645c06a6f9a20fdb21f7a15b373a77fedfd873f223d35808229d389e38e892ef1045b7da152b4deb5359a561cd54baee34b4c39d2e8ab446f9f902ef46af036857fbc91207720913d19ba0ba8afce2fe68e1bbcd0e4ce5081340aef8b7d91ccd1f44ecc6571816a96a796b7c9bb2069111301a4b6bcd66c20000a0796d7169110a40cd5b9488380628753c9193fa8f3512a271ee8af624feb46ceae93879a54025b8385f5de11a504ae9713d172d05f5ea13b69234cd46b0cad69e59b7c424aa2253c3fcb8ccffe5414af359872b7940c3d22907a94696bfb79a198db57c27d71e10de7f3e9c75aa629cd793b6eee72a03c4daaa834e26af83b22edef50ac2d7787d1c5de6b138cd076763a6a41068dd8fc04a5111a895879d2a1f3748873bf74e441f96db708494f02418cd0e580419b4cf32f515c398e7b43f86fabf3869d8408c10566477077487f066b4ca2f2c20a1170ca6309cc3f4cb0ae25a9181f88a59f8c702312f2fe4b91606178d4e37e52abc06d3da073405d03065ef7558f4e6877c3c0a60f129174f5cfbcf836221f7104c090c4d69419136775b4695424d15091bc6cb08cabce75fdb81294a378704fdc8dfc4ce246aed7f5f68975a2682c2564368395d1c1d55a858eca725e07602f16ac9f7c206efb827ce238b795a13bbd95fe285d26bc9e2259e2cf6b47bcfd3f2ab4899b250fc6edc31cdd036a3815f9d8998154bb12cddee55bfb591f0b165b0ed2dd5428ef6eff41a4420f2bf0d68ffb5eaa2e14bfe815803a8145d118d1d63a775433f5a54190042589a12d37e77b44141afbc57dd47447f5f3085d970efb9ae8af554c66fda82e45248db79a63dc8ff59e23019175c6a1accae9d4649a58341d325ca21ee53146443ce8ef1a2e739f182061ae0fc839b999f1949bbe90856e1372163fea45aa4aa1bab09c1a98174b440042a9be74abc33e9ad4cd026638ac1e21d2b98a8ee13fb5be093b0b7a59ad958bfadace2a1dbb6e56204935b68e7167b3cb4f8457c4200b48dfec56ce1b678a1d640b763bc8a0d21785f17e66344e7aab3f8aea7713679f111d52b9b2a0b7a37dc8a19d4b8a95cd8b66fd3a9dd5b4006b6bb89c63c5b3a8935622560a32055257dafb45344353d095f35fbfb7945f5ada3ad537ef82d6143ec638ee6bdbb695ab763b753d93a91b0d66891673081c54c2bc08b1a0083b77e6a31721d8cc5bb8534cfa90a88e64adcd117222166801f8935953b2da05650471f3c9a7e795e98dbc27b85853f053f97dce5416bf3a222e7298c683ee5d41bac704ae076da3f8ebf58450bbd30b3984f0360ca2a7a3e72e3809801c3c3bd35f5304009e728b29033d1fe384dbc12aa804d7239d2d814a3ca5c3439d4e60da44b26eeafaf7ce20c41c2cb41f4ff56e0916986792fa07561f003d35fcbcfea7a138b0f6a1d0a27a3ba24204822cf5c1efdd0a3417ed56b902c9733ca16306dd6ee822144f85cfffd42885025e5359eb3b8d24d57750a45fdfb6867a513b7e4d778e47d23ae53006d5dc448b2e1a97cb8b8d4fea4573cb193e1fa4c3559433940ed1208ea1a4c20537eefed9ba92c363d3bbc097dbdd46705de85dc5f5ffe32205197e46125e25d4c669e9e3d593bf8c291ccb71d5d523d3455ee885124901243037db0532b7adae9ef37d7f986b3647325060968c81a00ccbb4b54da2a29c2019b454758dd0ca08a078d3768ce5898811da85a1c6b20029553cc32162a8a647c1fe6bab8cf7b3d10b17a13372c75c6b88e9707518bf1479b489ebc75d5da942f535e4fe946ab691102bc258635eac645d8550044fccc1d89f86ec8fc601efd5f0db9f65cc49dd44eee80a4650f52a72e88c6e685df55fd921deffffde581be8eb1a331903af255f902f71f09e1105f4b12706443a706479b83d406fc22fbca0313144056cf5fe53bd611b30047548cd97b0592c02d46a96d2b454cbd1de411f420364160b5600f1ba3693c45ffb94e8db5f9ac35484f878adc2ef4183511e24b239efa95db0f42797f4727ee519f9441dc5afab8260dad74af73f2d5aa456bbff575a36d327320fd0bcab9bb282c935680d3d353d2d70ef283dbad477ad103e0248331f224a6f0409bb72ca44d602292e9894de5b634eb847cdb63381674a7a6d8d39211e35df8e24de29e935ad9d11fa5173694712ef94f4da9a33423b6ab61d493c54d27b6b641b302d5bedfe27a9d6269d94f153947bf2003964a8d45619913ec14f8c3b74b51aa92fa88388c27be27e1f9a50a8b04cfaf83850d5b6c885124404417113206e454fc7ad61d825b07bc4906575eb409b47948d2914b6a7d74a9d860ab37a8513ef533d3df45f17695bc04b71f38c8139a38743ee2843aa76b683ba2e7f5b7e9223017a36ff5c8b07d36889814d14d3a055e43e89cb36f80ac1bced7088b86723723f39f8e39ecd876778bb46ef7b66dcee81237dbca09d5ae8b346f86dbbe6b90501ab64e5ac75ed807ef1501376bbfc7687b662827768ddebfc2227328c917f6da034364d39c1aa9e4edcc6c3f7fd915d21b872ed020c8ef8e57fc2fea6878a4cfbed89b482fa70771097b49be4bd1ab8bbf7a80b69114d8b8d91f629ad7789b86e036fca61eae49c85cd7d7f432f5af0ad3518e42ca2166029b6fecbc3fe1efb929cd0d4ef27c70e4d018d49184c3d0cbaa45ab8bd67748559792787324806154819077b6189c056c462599261ffbb6353caac41edfeed1539dd5319ed50a257bb106fb01fffd0bb2680fdb0b6f81f91436ce5df002515018d9362a1811e56d3b77288f699da832ec54157d01cfe0d48304f2e9fa84477022db268d15158633d84c2613be8c2c8a10dca95e84ba49ecbcc0f147aad3cfe656e856e8e1dc454cce845fb93a00470131d207abe769477c95e44a89647e0e32e5fd62e4a344a41754b90e23536d03ce3f0e8c637941a541cefbc1d4a5555ac8042db1cf57b0db17ffdff44f8e2e0107070b50fca70436c9e0f48cf49c7e7a731f40585429f1eef818fec719ddfc89eea8cd15fe851812ca0b60caa252faecedc1575f1e390540dfc27b789346d77018ab61b96804909b19b263c46db58f9b6be393eca1d72ff07f547ecfa0f02c46b91cfc1dabdc12d71f53882ec9b60d6e496dbb2fcfe2214ab105c56cadc80ee5a8ea0a00ac827680b7c3efdc19b4216f3a311ab6129739fd412bd8507965720d48a8a368f77715ab90dec5fa0b8071de8928f08aaa980de8d1969e3476e2e7182ee09130f39cd626f3c2e255614cc596fc6a5c29a2adaecdb609ba1dccfc702d3d93ed347efb320fdf7e13dd04eae4ae4ad9730265dadb29708fdb8c1d916a682aea2124266a647a2c7a53044afef1e923dc777796ddfa8b2319e7896577b99201d110082c231da14936d87f498cd0235693a616ce8785171395a3f299cebfe7660fc0cdf04c167439a2e3f2b6d545bdc92e1b98d2e57ae99c3d01b0a7e589d78d5326fa9c0a850127a00e771ce2a3e38abb4a3941c95085fcd7a1f338663c77536b2068db33bdb889cb5310bb807681e08d74ac8cc827b3938173f1514b2f944131d7af2a7ee28319f16156d3241b8384dce64b4b6dd1d33747cc0589150770061f8509b95533cecbb0f67104ae1276c9f490b4e802225dfcc322b725a80f19e097b4e57b53aeb8e560710f195542850201a377183ac48b74e13d14a05528d91a27f05d292c4de184b2983221b3e66139148fb7e881cd4ecb27b0313db55c6cb7e0d1397697f69e657a52e608866189ddbf672d39a79cc652ece7a64a63c13024875b354009e0da54f5f2813223fa5268b75bd1c54078be0400b2e63acfe199e12f8e49e415803557a3fcd5ed591c2635bc63832d1e9cd3a8920cd9a29375356cf464e14adfa2e471035cd1efd9976f40660abec9f64a438539d4b70c57653c30bfdd38de3643815cd2f056649efd241fd1c7aa7d38d6e184d5ab11717d34dbde29ebf281c66a513e28cc20e8c9c72ca9c1b28cf0db40bf45bf2bc45dd3fbc60a612794cf1cb21e3a319abeaee817334e50cdd70f66d29412aec04d8d7f46c3dd883e6ffc6293044a651e1178b72988592c9c20693ba56790cda158b7519bc01c1762588ace2c4af0f1e5ea0ec0d64bb59d49f6a8c451bff885078c17442d35338ae5ad98c3777cf26d37e1b1fd2a33b906e538580cb758eeed6a3c5c85d212a124d277654c8d71ce76d03bc39f6cc72a3a64fcf8b076fe2e4f63f6ef1fb6bd8d23d250d9d1510c3b9a4168417d95f625b52737d35fd9790ea7ffffb9f7652438b9f950ef8a99a5267752f1150fb1893ce4ac3a0ee37d0904c858949001561923b44bc4521453c56407555980583a22f8252b8cd568de7e3deed604384b6120d67cfce71e7477094e92565f1a550c63148f7cc5b70a76c0644157258ca3b1cdad502a84733a1828c6ee3291e8354f127701a5e9a15ceb34046cf9a7808ab003b747e40255ba8642778f61bd6fdf38e75e8515769da8cb9320234ab136de500894529e116f2512ce4683049809be44eff0622750d2ffdc09efa7507e032e8f9f12e2332d96982bc502a74d39925cfb304bd6ad7a72774019daa91bac9d7e66a2ecc206a81a9e21f549b7f4465b8f56a148170e1b1a782475d537a558db5b2b340a0726a5c6bd5dc886e08e8de1606b8ece1b431db7ee7a4b086120898cf9fff5299cb549bbcc80438fa0bd8888806ba494b8b7d9822aeb2d180b2c9a9abff300f757dbaf35399bcdf38c174548dcef6efc1a0da90ab972bfb62107262674bf86d0920b4f3a631de0b97a07cdda0443777213766baab3d5ad7441003f5faebab5ca8c83f13022669876e4ffad358db70cdac4eacf60265feafe4605a3394e0c1aba828614adfc66607d37c8b067979f7c3baff9d81560f1c2ea5a28cfe5e608d812a5823d1776c98e34df4819fb288d2583ae1d4e52b4e61f79b36968f56fa23ea9c476b69341ab6048da433b8e2ce47caa11576be727ce520dca47f20a83e0d3f7052235d671f7159cfb373c7a843be9372dbce1d5fc1bfbf232ba754323a673ef7ed9c837ef602617d6202edffed159279f08050334163588728e302f75048eead5c3e6e8db3c3f0afed5fcb38b5420b6a0a66b51739c9694535c43a81b09776035f5a2cbb7f437f7c8b951e42a764ae492b801877bcb7327e355a5cc57d994f7b1a567d0361bbe7e31b8400adc0ddc53f00a363bd72e755aa009add0fc23e7875c2227ecc81b44bc5efc24928e4a8d5bf1f4b52d02f29fe56400b1ec64169ef0237cec05743580f9525b4a3114a81770db43191e74a28d4b8f6a122db5542552caa4d8a5eb27d9dd685ff42e2f0c234fb1501b0cdbd53d7f30b974f27ba0d5415ad84b551689fcb4f707e838abf04faa4092ed62ddc9a9f384caa2d166be2753223d3925cdc98fc2b106a26516a331d5d8cb3d476dd0e381895db8ff432aece92e18aa5e72dfcded81082de5bcda1e20853624f3ce3fc041dea987d1eadf0c7b87611cdf3a51848fb05f48927ff0413140c292b5e2903b94c8bd28939d806c4e87a43408e5fbcc422a61df0a75a1336ae11fb4266e0faac2b810485cd7cfa3187c83429faa3e7fab52280ee120585f9e4a726acf5c1e9adefeef3995b1c01079abfbae1bef2586f9ad3e4ef0ee8fc038d0b0268253846ee92807b6577f24d128f4feffa10029e10f2779a9a3efd4eab4c9e8aa04fb64cc3c3ba71ec48f198036704f52184252356ceedfbaa196d33335666d75954f7414bff8be9208137d325529753dacd0c644e330a9371497ca02e0930c4beedf2048b9f340c7f47e304ed4b2baf1905223052b14ee5aac8657e45c9460e072b7931fc7d829c19e6f3333e80d86b9d984b0943318d53d137746725b0a7f6ac1cbec509f44401e17999d4663e3d13e005dd271422e2dbe938afb21f348405f11de259eab154757921068c879a6175849569ecde30fa9236488230d5f79d2cef4ca488bb504b0d13254af13c77ac6a05cd4f42785865c7c562d288bc5d5d4674fa60c308301f9dae881d801039599c2fe6cc4d35ee428c25a932552c4265f5c8794bb968d89986454d6e3645d0d9ecad02a7ca542047c8f44bb86cad962813a9c1e63fc25d80f5156b7c7ba335e212e9ca593f40591148821ba07701204900dca32d179712f681ca5df4e6a32330bff409331252ad7549c56190076ce5fcb36e8ee7d6af6614b38a5e4eaa015244dac3d06bbe786b22a1f4ad9e5e77952198745be009818d3f1bb5a7705549f55568931c3fec26b8bd5e6d5fd072ab96e8e69dfb7b6ff838d5233cc1420957a5c12ab67a0a78ef5e84bc39760b866b016031c2616dd5ae032fb81e9d73a595b5c95ee55edf08d11e342e53ac3e25580258fd4ab8d40f000f4b568765d588042b820714f329c94bf7f0ac9b8aabefbe3b00e2d584e0e9a989fcf6a06dc978c2175aa52732e4ee46c3164aa7b71b79503f1c1e5f1a572b5b8537fd0b175288f758e9c94434d1705a6dc9863bc14d6559c3b8ddd7f01c7c951d1cff0d0880dfcf218625b5be9ae8769d93c173b38df8504f021c8b02181c2e93bfd8f874abd07c0061aecaa4b5ba88b0147f78cfbaa0c8e981ddba895b2dfa6a2e2fa9ac16792cb84d9b532f3f72e47491d94da3a7204d0fb9aa70ef0100f480734ddef496e3e39ecf1c7f92466a6b7f327591dbce8d611050f3544b6d88f0cda28c68f687c040503459a76264bba5633f3f8ba98fe416390c8c1e004143c526cf831ca66d6c402897b1afe62064d5517013872052e4fb015871e29a42ccec92170a6223fa14fd378b31a4295d0780d54ddeea6f4affeb5a1e80e50fea1e0567c4f9081a8503a4dfebd367b4c46fd29bf3dd4451840dc81e3b25f6cbc159e18601e65bd110f66e7b13cd1df0036fddf9f9cdb1e89aa5e1cd1600b6d9e9b72695bbb1da0bfd0b57876f32267a2090eb34cc2ff6a194f0ef0567d0ca86a9323c16bd2da5676c595b665a0b03838096e2e1dd22f4752a071c7bc935429f8019fabf4cd057dff4a005178e8cef240f80fe1e9ec48d51e8b78556a1af5eb7732f669ae89d2d5100365960e5cd22e2dff8cc564f4e0f3024413e28aa1af56a2a441bfdd8601eb180bf3f3e60753fa992274a508d10cb466bc6139b3cfe0136e23a3567ef235c5d664cff1ab62d6295989943e2cc8abdc36cf0b64244f9598e6e2e3393c4fda7301b12015391b54a5b5e3987ce0dc9a8c76590b92b33c175bf54622b738aea015c03efed5d15c3213d4472136ac6c22933f2c57ac73e370912be69d4a76888c73d67f8db33236ebe304e7a41ace177eb2ecd3a5bfdd56fd6640bf67364e38df4a3817bd762e5c27bc4d6a1585fbed06f8faf796b4b20f14386df11dd619626209c1912110a61c565601147914a597fe017e746e8452c079bf2d05b1f04dca482bc2cbe01ec4e0157cbd439e1c1f6f9c1b71c677a768bfd763767d79ced7ebd75a4cd1ad9bf18a7b0de6a248d4d629e43b622d9cebaffb52816579e53c8d315b2d6f56a6e84ebbe2e1aafaf7276285d1a1b19c2c250da0243e518e2e0c1600d470b3aba7dd90c840534cf71e155107278281deeb668e267fb58534f0614364bbd9677417ace2fcc338332b9f3ee82ee61fe904d1f89247d1d451c8da518da6032b059ecde727d56df61f49283a48652476a3e84f5ba5d5d4c6752f4e9391d951f359776242d2f540255341dd9d05285ba97b521a50a56f2b61b5942780d6c98a202abe6bd5bb28470ce7c5fc8969713236952249a6d6d445a0115d062010a6bb5fa051948983e9ea76f34a14eedf813486727639bdd1db48af2fa4566f02b62047875c505eae1c707f3d86c9c4a63e23dd5086e710343c8082dad2eee2b7d4684645f7421f618a08b6ad4f7e7c0ca6fad0c5b7c763d0eebe4fd396833acdf5518a0593560024d250be5c14ce670e48b24fe0f9a5e9eb807f6088c6ffae15e290bcf1395cb07bf4ef4e4db62bcc1474ec2a04e038a0a6e8200bdc3548874b9cac56421aa2145f750b6ef8e0ee99f001c6867c27b160862d7180434191f0d5e2bf76ee9d90ad576417f1008e333747606824090bf3c7a782a9affbe2e8a9426cd6c32f0b3b09ccec0f059c1a8a30fa02f9afe4f90928b8c3a34a5423341fe6273951757a9f528979a674f692ffbdc1bc9c30a0a7eb42f4f497aab5f040f718999a2c7f18885e11b3267a6dc88fafb6929eb01f5a47bd2c2520cccb5c22132a129b536826b701fa045ee12cce3d87c3277ac04dbbd387efad29f1b3d462804b0dddf8a868991a5a30bc8d1acb672b70d65e73f449130be70a17b392357f6c3d98736e9cf5a419b7448c2c8396f70a3e2d43c54eab2ecd28dfd9a3dd9900a0fd062c5a110961ecf3a6f07a6696a840011568993570e529dc51c852f2685c7b90718160a50506550f2ddd2ae21ea80834e2df5eb9b52c20c9399818a6d42b19dab8b129b96514ffc716e0207d0abf341f151e5f6367271dc7436a8a50d2a086a388f4236acb9f16f8fb9806cd3f096f8230b8ff98163a3f4d38a0bb52f2ef5b1cd404e428f82490665690137548f4a434fc0c01834089c7ae2bb61728fe23e82c42e5a5b88556763506e73dd93520a96f50d5fd1304575f5aa249c85c4db215d4c2131f957652a3a820a023924c0f4b0ffd3e0b48c4ad795da5e6c2557a38b9e17760711ae82b28cff698a810014f9ef9a77aa64be74e22c9823f84f3dcabb56bffde9b08a08200de8fa6f31c28264624063e31c1765caac2abf0bed0d6eba3893599830696098400cbd19318b8b13e240f343ac96c3d99946c5124ae2ed786a5a5d4c71d5d5ec9c0d5454769a899e5ab10b5d6e460316086a8e7b42aa4d0c5adfa3a546d9dec2c13d8762235fdec065055d16667706501f06393387f28c1666da9aee5ded3d51235798f029ef1e3a5b2ca63df8654d4f59b429328ad836b7c9163130b5ff3cc5483f8147db9fe02f5cc0c971884042b3ae76d10c99d191470765d60964be80c107d8c9511475b960f02046efdaebcf4670b66c12b3ef73c28e35f2d4c437f5f2a931571bf224fa3a142e06809d48452fd061329ac16a9b5b512e1a33699b3ef3978ac78472f92df8297e25f9146d1495e8e32ef060348e3cddda7e7ab6b4ab430a4751a0b0cbb39ab97f7a633183ee8ea7f0d5d95a4609218221fc4f99a48d581cfe1a89359f2732b92c46c86317f5f22d86bf0566864ef94d512a280949528fed081ce6b06c0e0a176b05eb67816132c8189f10cca3ec9e25bc13327131681ee77a08867f44b4497341210d98a7d7be2b53d7917ff7dff8e7a8497738b652c3e2a76294d097edeb7e26056ab5f7778c1e30044f2d717a38ec27af6bffbd834dc6a84d529019a021652758642085202f26ba30285d944f19b8f2dad25fb8e23eabf1eddd28b3702d0cd765e10e9ae85e6c677d609630e23e6c2d8fbb4dc3b1a89ec288c46e5b1c1efa489f35ef9ca2d69ec3198034b8921caa6bee2ac8e91c3a4638c445fd5441d4a26792a798446a47ae075d435809f0dd5d21014c50f9aaddd4f3817b816ac882d4421ff0b03cdc0a336692a37683bbcea21a625b3834166b18259b8d9519e9670a45c9cbe840123d7e670b11354f653b873eab307d14f40327958f311af571dae26887d761dbee7c5d5aed52664344b3f1b4a24fa98d782b3eff40115f4bf12db32cc05ad27ef23cadffd5efa1c21ae33e4c1595c0a779d584f6295e9e68f5d685daeb96f9b40eb44971f47c87ebf584a7eb2e85bd1bd812ea0d70fa7a478fadfb2284fc3e83a5393c33b142865cbb1c5ec36e98bfd33912d7e4825727b62ef39c22f619d3df61a2ef99221ed158624309c7ce8013da7f8caa7a8dfeae29d618c0a02fbfe63e6daae89c56b7e966aa7af5c57385100884aacf71f38a2c3248fb3d35027b4e6fd2bd18fbd24031b21f52ed602af8333d156ee69afedd59f681548a2687a8d4f49bb764c431fdf89273ec1648441c0e02d539345a4ccefb91cb8a6b8fad9f76437b5be6b804789bbd7270d5e05d43a7905d084554e6bd8aee8b100739a3c2b3303c107019117f3336ec01c9705c60b11df9d3fa82cbbbd0ccc91b1a92b4808af393d4f7d4d8450e0927883a9591a31b76841d882746a97d71fb16acb21beef9d0abba913961f4dd7066d9e38cb2000f578f8d0e9edea67b979fb4a2f903a515841c0f3f8d3bbc1b92b00f2478d513e062f446b53a938d39231e9635c26f2c71ce7bebec061749f7c08d4f656d1675ccdc480aa8fa863038ffdae98f5dcc8f01de4520f8cba5f3cb8134881977d1b41c082c4eb9df11427bd7b125c74d2cd5187789176640a230176aa6378ab71b44cd104f78ab575e83ab1193eb0e6be00bb41f3b539c2b39e712a3db28f49341399fa264e1024b7eb8e8d75b2ec3ff13c52854830bea5529b2f795ed4fc6212cffecb48c4216d728f83144a9961a5809842baa719799047a1dfadbc48a933444ffec3194f455a1c2b55f9993bbd8482cd08c25607406a213840ae9d2eda58d75579f358d9e5c376756e56048f610545165da4355c373d3957e908749573c180414eacdad3dd73eb17fec14db2abf03c3e05e054a99462f72c66894c81e68c0cc289e09490fb967b10167eec9cb8060777055ce7d9f201f6e60b307027424d42fb740b87d369ebe2685c8b91bba2f21ec080cc1a64d3ef393643d6fdf6567fae840deb4ec1c9e37671e86076ac0d7b9e89f38710688f330ea1a46eec214dc52d8bcde5886b6c3bc04bb411de8252c59989c3bb10bc5599a72869f04e47b4fccaaaa3a737e00141a3f4b4c3fc3bb0a5c653da02edfb87d93e7dac1daa3a1e7df4a4e2389920840c1517902a71be2d60d34e4d34bf7da1dd159fe07c06085a1c5c2faa845b47db15e0a248ba059854bb1323ffd614eceb5524a888915d993c5f6c7b3d98bac7f795b57ff925c61b6e11567cdc2a028b1f62d316801fd2b28deb49835a513cbed4ae14dfbbfc0963887968718bb4fb8dbde18ad6d302cf0b48cdfe64e6dddf4b9d60dd756d8d03f8c747c13bdc0794983251d4392bbb51d7f71ce70c74fbb7adce0f9d6a4f04d05b2252bfbc38fd930ab9d9938cea56af2efdc666318465e94739e9313134c2221af1ef23f16e8bc3f7e4d410616887a2cb00df9bb6203bba7fb8c21f7587cbdceebf3fd8990ead864a0971b5b5d0f2df4e47e23b963f8042f08055739f1e2d699e83182e7b6090745ac34457d01f0eab73ac00d34486ec652ad6e86816342bb45e11cea2a01b30a67219793231693162e323459eaa4722772a86b7a0e4df05414a82621a81405d9efd95fe98e45b5bb9f65bd7628008ad2b7d3d3e2acdc563e49263cde3c02b40554fc4a9b7a85234cf01b18dc199ceac2c4a5dda4cc69ba7160e44c70aa61fb0aed3903c70c1481017293f7b911e50965c9bc0104a89f207e926befffe80706bee0d7aca9e071d83776ff16289e3c03c0605c4aae3b125e570b2a2584cf08a2f1bf3755f90909f729b3674f0bc0162f834e40213c44a2ca0aefd0c15803d0fc2619a93c99fcca16b766ff72fcad95311463411b4fc7882a234c09a2021656d60606557c243c9253ba7c446d9bf4caf24f8c8f1e72e021262d0316c8e7fc60446c9a08938cecbfeb0014e6a952ff4ad7ba885abbf803645ee712b6070f757d19906d1fc892a0f93d8efe6ea15c69ecd8b203b18b103074e048af4d3114290cb717173d40c1119eb4aa93189dc6b3c3dd4b0e94bd2edee4225e266bca4accc01df5f4ac0c826caf28978ee7c15e5f5417ec29c030cf86fcd07b2e973e1ce7394c8d1984b578dd44b2f10c78a952e189031a814e68096b206215cbe87c385ca38436812320e30dfb1ed5c2b46d59362acf150186056d76532de0dbecc3614f6a14c34ee8a0971bce13ba2334afbfb1e4b4e660ba8af564508b8b0c1364bc38b5b59ec9b4dc56d8090248016247147ef3bdaedb6c3d63f8fd7342169f5074b1b335352987cd8525816aa2024d1a1c6b2d01ba01098f728386813aafe8027e21f81852ae5f24860cbdd0f3f2992f02d586c181a47c5166fb3ffde1070dffdf0846adefb9851b2e2b3efe221616119bc58881c4b19cdffa2f017fc760b1a1e8492a8d1710078460a34d3e47c12b9782296c4cb010b773d3a5822dd3f2ff8e47c0a9325c5dd15f5135478a9c8ef8eb42d54b2724eba1a646887d148634f602f53d04e5c1f47e1f759f6e581a2b2eb0240ad9a0970cf33fe2b6f4d5a4259b1234930c77a5462805240d3c8317c0ab8617bd40ad4ba73de220c527507263aa344ba2434627806ee422366d9ed060678835a63518e68b56a88a71a248e3f60d55ae3263014e2638d86c8eedd8dbe3dc789e21596d13b5667756d4c2289e9bfd99bd67aa3c64688a0059ba9ec88c276e62595a3f0b44c5d1d7b71a027d6996ec015ecf0d45378085130be7aea01ea12a4ee469255d76aa38bd4f65a282761f01b81b82513646b1d55b868bba7d902704605375c9bd2e22814059403e2db739b62831dd6e3815058fc154e1360f5c5f15a1768f6be7e66a986081d97b28ac19d802171612e98a7b9581f6c33c0d97f2e205d1f5bf04f747b5738e9bc73984fccea16484f9c44dfec9ecb5ff8e7d0edc2f9036ca3f821b4a3cd2601207c0ff3e6a7fdc48cbf0361e6cded2cfc9ee31ebd8da1957a8d8488cae3f5df2b6b56eebb00349a86b83b8c89486ab923f4914a2042b559f4b85fc980684e56461c754d661d64a2050435472f3e01948036b772008fa7508f2ae127af50d449ec22d9445a3a814c0b4a2feb40280164e2f7f9de115cb6c66b2a6ae6a5537a154bdc7394c7e68aff4b801d035457fddcc901d743f04d81c789f0a84cd45d1a36e0bb2f211661d6ee498a9aa92e12e4a4e78f766fa2e41ecc14a4d3cf4e1aa6a94af661375ac088b59c60ed0c599df434f157ff238edb7090e77f25d09105409f62a212ba3c778db13a536f4a6a00b0df7c5e42e3cc30aca2368a92e33021732c9b841c1cdaf4bd7c410373ecca70266dcba0f846b0f69a3594ae0d53dfa5dc78e2a9701a9238ea6dfbd1433998132862eb1b3a26a5c9e68363b5574698523983e9fbfcc363a719096099a233f86f8271e75f022b5872faf70917d6f330df8772e83bd10994a5ce2500585b4998e6552c19b25a63b86cdfed7318e9351e7899c4a50839486f4b9a8b2bb324d1f0423210626efd13d8b8feecc7c7477def98afd1920820e63084e383d837b7af09d70312afe2667bbd1e285191d40e862268345330350d326246cfa285997b27e56106109aadbb2ee84587538f34a955b4f58415d155a177ba310e57931ec927a64cc97f0f64e59105858d6effc23f80a81c743bd58855d1bdea8534675417d67621aad1654ac3446c7d5f4d4838f9dd03c162c8fff60745107669c3e6272ad27a9038e8effb1515b26c19f1189536e3d5fe672685a2b7dd1523002ce6bee881e1d57e94146dc8e1b62629142b1190a848cd3dfa5d3f2262cec7b1c21ba597aee2196af6216bb0d694908905b7314e41ff485c41465c286092af1dcd62eb388f09673784efa4658578192c1a7b8d12bfb1aa1d3166432e3386474b20dbced3b4d5024dcdada070df1ab5e97a67a727918b234e6e7257c1b9804216f844fb18a190003487e22cc7a6132ff4e0318d023fa9a725956ddb599e7d939e244b2c85df5110469a54762d340317f379910b827a1f817e636d30e4015f708c124917883df69b6f7f76ae52111bf8fb683449d12de24b489f9edc2638f158c6bbb9e13ff49a8de6a394c0638aaeac063ca5e3f0b8390a5529bb8bf2889a9e3c39840ed9b880dc93ce39a973efce239cef392d7461a45d08dfd478a0593736c15440285ba55ca5c6d7dabaa0a4450974b591a32c799a2bc8e5f2dcdad53e7184d4f7b799481f8fe95578778d4161ed6aee63ed90e0999d906a77f5a3f5ea301220ea1c725ad32a239492d8d4c3df074c3aaa0855520aced441a607f811871bf7df8337877080caa66062b7c525baf1a34779e421b53959b941199d81276171074d4135e4235b488f4c7a750942be3a9201462205219194a7c995f0310e5374ddac9b56fed515445553d3195be34b94df23c4aac01f0e27905500e45f2eae2343cd46f0215e4beca9bde9f875c8a37e446712103667b613214df663d460d198c6710a62c428c14b0862fc0d26b778eaa3c5c56b340330986020ca17401d4ac091ff680d32ea1de53904a0f381e10ab652b2922cd766dee0f13b70fcf9bd22f4161f205c464db27828eca16397ae2805823a19cc2750824ea7d69e2f2d5e3b07d4913579632daf6e318d3442ec7ea015d676ba4407d7ba806e3f9e3f30f97940cc64aad84e3f6254a6fa9b5dba0fff220504a83fc1f8fa1731e113fc77c55c68e9a930442ab0659a6044c383fc6539d68d03ffd27b4f62a92e4cbaea05832bb8b6d6d99590026111f20d8f0a31202cf631eb1aefe800ef8a32e3f0efea425c9e147010e1d487a63a8044dacd7c6054a32b8a2292d46fa4eb9e9282eb155332d1c3d5a374a1affa4180fcc5f18f402fe0b392567441b56a024cfaa41d6ba9701d49e99ed7b3660581e2a7eea04218aebc3543932ce112fd7255c49d8f7050c21c0109a7e894471513f5ff3008478e79b93f5ce3379bedc1da3f8b48df4bc022f202f4ed3db5c341a48d6ce1290b4f12aef7447e9f9f3810506d3293b91813680c090668cb32a41e79df6130608e7d02cd356d9c025ad80bcce91433d6b9000c3505b70ff84c1fba8b20a039707e0f14e30b05f7c7fc79960ce230558f08c0e3fab4b9f65f786f2b8a54e753d015466d1dc3ab1b9c14afe0a1e502756108a583610aa47800e299315b4c8b57ef5367fe784c74f26a9da6eaa98fe823a53ca74858bd9d91e1625ce1182ca0e003ba99ff985e6e31ffaab2a42c64fbc79f967e1085d64a288346b35d3c85c7d306a70c299cfd161beb2de1a411fdaaa5868d608f2fc701c52c8f0ab01f470f80119c69412a51c272d91e89d5164b1c68ef8a3ec54b0f1c5281aa55395b21248c64a0da111b66787db9f60cd008ba6911b6e0a7cf20a5d495a32eb323e2271ab69ec2c311e65d4299f9664a4ff4c94878313000721493a4f310294b3be3b146960223d7bff5b5fb99e28da50db50f2aacf4120c7213196d13c7a54a81171b96a3d64329bbfaa982671857bbad14584e7cea2ac68e7597f163be3d99a3592327e450309a67ae008a8a61905611bb504a37eab5de100758ba6949e06a58de6150e55548e254ede668f58c91e693b14e79d8eaa11c2e0421ca61df05cf938d7134e383ebc7871ae1a2c58c2f5517d87b9908d802e279e59528e3e537083387604da3bf35ee154f321e43a6140ced63af45bd6fab2207e6a0fd763009163901c729f0129c4a1e2b7a0579eaa28195780fed4dd0026cf0c7a67b6d1609971d3cd126a3383aecc2ddc48a8a982898cf098cb5d42afadc1c4a47c4a2663b57312932d7f32e7fefe28c72791d3af9f0c047b893cfa319dde0b3cdb8cb0ceb0e8cf1e0b95423e83aa95c241113ed6a9ff261a3a9d46d7aad76ee6de9c78983dd6ed30acb9d25cdc99c5a1be1e2a1f0d9d326157de829e80b2c9e115095b3373654f0f1f2c79ab2ef14e286d3971a03265587db68552bc1087b51668b4f73d848d185fc6e3e9877d9cc081aff78e1dc9431597304988c0a75f36ee5120144305f8346d6357900af093c6e46313ef64d50565092d11e799144631acbea0eee62230036e3b3045717ef8bd6aba793775b9784dbe8e111a7d2228bf51a1074f884cdcedd2b02165b7798e4440ac9b23f17d56c13c27e1f255adf03be24d383cbe1df45f22b13d7195d062681e7eaa0e818fc6b77a54225b72e12d3955f1ac4cab715d0953c378f1ec60fbcd96bef90a0e3aea78f3045f37274b62e2018b6f00c92a2c6b3ff6ded0367738a71de53239809f3e989849f4fe0838b95794374faf94e4c057be487c909314e001a2ef65670deb9baf78c6033782a6da2142dfc4ac579ecd8954128f9184738183e24ec0669f68ebfef5d45acf0c55d8066f5a9d90560f0f0bc2bebc532cff96fd60a0871fed64c6d486fa80577a00ceae9e0970befd704202313bef42c5ea60388220b656a349c33043538b71ace4493419f74ed7c2a856fa40b343863bfeaabb278a9476f002baf0661f307ae1a0b54becc819be74ee85fb4acf3d1b28258816e790b3df688836ebb6a296a4afb9a83f09cd605dbf1f6fc69138d630b6fb0ed7df78684ca308f3e250a5e5b2dd368de117e2dcdcf5a7085cf131845d52a93ddea3d9c5e5c3856e6edef39edc4c7c1418cb18f36842f9a14cb2d9ab4f76aceac7f9bdf5b265db42a40fba1315015df3870b9c9b72cc594a1b0e388e15189061c836ae34c82312c8dd7d60337f1a525359b2a6a5814e945312612faedf35d1f31598e61d6ef6fec051531e19499c327c86767f59c9351402cd2eb9b3d1057f517947f2b48f8e29f60cd6e0d7356decd5ccd2f8a6d78236a57345e217cfa010217627f59a984e7e22f46fc3ed44b6d782b7c0ae1b62dff37b4f29e90a4dc36db46059ca6ef10ca19a6a9b165abdb619e8a6e88bd714cfb1794f455344890db922610ab85a4f51b2b650d29d040cd87b9a641496a5d80df6061ae3c3ea838d2cafd7c2efe9f6db320c160c318a79da0291fad37c653f08bf83dc460de309f3678e5546e280fcecbc925fc078c487f52219c37721d8f8a988db86b875112775f07b3fbf22c916b9a146698c0a2440382f505ea43de230c3dae864bec3e5b936df2b0ea2ab2ee9f1f5a1db35cac543990ba7541abd46428b554f1b48e60389352702dba8cd6933ca96cd51b58dcd02c17241869cddfc4fec42d5e58a78bbaa19ee5608465bfa2a8d1c84bd89d78e270c378501a69bbae83f82485fe5549e321f445dcb2b5b3364d6d3e76a3bba9d0eff6723c9cadee792d6d4cc018b2da3c0923c33c3cb8d6700fd529fdad01b1e67dc6ce33c8696a081fc88e7413ada38af2538c48d01dbd536e514b39fc792617f254812425b82f81d5fc38d10308b34d54d5f33df66062e6f465b17bb111e699028005802c91a936982d70fdb00bce4f47f69646ea73d83d5aa8c5c7efc33618bcb1f3ae1fd930fac172b52463bca165e5a4b6254358cf264a8d0b5c574cd1aab2a363f83844eda4ba41b860bd58f9aa4c11216c8e8c9a16a638a5c44de488c8f6e6613cdc21cd1bf2e729970d8670a72e5efd23b598268b992e620aba4245c1c77c3960a6c417374826bc4547ec587573613ae6f7e3051f4490c1fae56c06e80f00155142fc7d3753a155b56dfbf190ecda9f3fa2e2573595d24de7b441ee8ddc0d7e7c35aef48df8242e05bff928b6934a03c8e79cc6d762f24b1ec3637bafa0f3170290203fbe806633b351a3a514c13f67a94245d8f7184bee14f956494b689e6034f616d49032fe7fbcf2d9b9c324deb1342e8944d581b84e7bf9c154713ff6f74c1b8445dd29dcd1110c243d277622e95639e08720b43dafcf82c29122767686d82fbc7bdf6dc58960473c0deffe9e5de40054217aa761b147be64a3ea5fccc2504680c2a94951a54e48eb68229b53521b91665f3f14903a9eeb8458043295dc7c38cdca52c48d8263161fba31469a85dbcd1bd23a39be57fa4226e4dd09211fb482c985ba202043adf62cffc9afc18bdb3bb50741fd6f9b456a9084301f15be12acc8aff89a376750437db0d8b044778fdb4ce47a8b0196e33ffe43ef7a2b1da333343f7f88a6807911a8c58fe2194bca44c5ac1b306fb0fa8071b2214226fa74d4d2747df8c65242d085b17e9741cbb857d2bee7e4c9d3a58aaaf7ffa10b47dbb55a9f69869cd4644ecd381cd92cca1cf7803d0d3a12e7935a84a957b8be4c112853e0531008e7666f6b286c3ccad03d4b255fb7f35ba30c1c25912e5f1199d5f13b503a2f8138c60bb9f0dc174abd4b0e50589505c5e163f72454c697a901c088ad7fcf1093ede25b2d9d061a2013871af05e67fa47c76c1b6d82687681ce3c1fb5d21b5435890cb0e6cc2133ed01ac0c98d2b92b47a8d00a6810dd6696ebfdfa102e37822745ad04adc6134368688d4a87c4b82bd47316dbdc0a4b3c4108c6b8038b57a71a326847d317c3067eb8613e704386bd377b808482d875c21fe4cff2a41276de88f9822fa5aa35fb029cbe4edf16b847e038a8abb896a68e713b2f203c2019a05acad18dadada8f7c96359af0383669ba49103e2f5b3581016eecf3cf573077752b29f43b894c266a5a521f6a8c56318df8da26487394cc88541e9b663ac49a379c4819b89ff5e57f50e3c76e1c1b02c1446ca4b5a8d9443ee80549d0edf1009a263464278ae68b69902993abb4879508c9653e7793cc99327e876236ac5d8f54e394da52b31be3f6a8ea0ca8f8c9351b6e85e352a9f8b834fa6d6839db58be27d0fcdc01afd78e08673c53d930e23147631fc7baf8be4e0633501ea34f7e5c77e6ce94057b84e34840b816492c09f71e6b39c7f1152a0a3056633b9217ab6854b4e2afdb4be7f45c39e2e6addddac8b0c50b241e065244d5dbbb39a1d71e2f4013598d92442dbed6a898254a43d65592f65327158d8a9456aafa105a28b97c9092ca237355c70f515521455967d4cc7451e6afe8c4d8b5f5a4951b8ddbf4f57ab9d222a5cdd10c46749216c5128810413b94f83ea429fa298e71644cd618f33be19443daf9d8d91135ea1fbb5be4ae5cd8b8361325cf7d480ff2c5109264ac4771df9dc4fb407bb4fc897dc3543a57ea915d1f98385fccdbe914e7e3dfd110f896b7c65bf523c1ab284724d2137160ea96a985f9ed2bca22a6a9aba69181296d72f57c87aea3942649ad034a687ce13ea39c8029d5142973dfce2ba5d64f3c6f5a3ebf9936584017772a2910c87cbcb84ff806c7fa6831b9efca3a1267438c1fc588443d097e1611e2c27f65cd7a7540f7c9a067edca37bed5e55ef6f9da7368da1b1dfc0f22f565391485143460d4ca222a69cbd92e636303ccea424254e581592b595630881f7e995f3403ed5993bec46e57129ba794f46aff834d653fc92c4df46df28f45d8b0b2445d98caa00992eea21af1b623d898ede84b4a6082c4e645106582bac1c9d55555f4047031fb8df804212fb2771ce2cf19e9ad8c8f59aa2b9ab31035c269f1120423444b9a87f3fe0f7f0c872e297202cd08f8f3b540dbf404d5d9a05256e89d66a2be2deb48b82c95c9b9e4b224dc7c0d064c3109cd6efbbf3516193688b387d4618d5be77d30a9c0c76f40044465beb001c6036b900661fca26b573c3f8d074b15e98dd56b0e1acc37090721625ceb4379c25313681edaeebf8d86e1e67740f33cdea8226869296c232824f3cfeba17660fcd198179bdbf1c49334b7e2aab09136e5cb5bf33c4fe6e1602fbbeeb5910e184570a05ddd88c684926e0f3317e9244f60f835a95f51df64a412233100b145884367b8f9e196f1377a7235fa1ffc50c5d7b56069af2e0f2c91534f0db92f84b7e4463f4da025310a78fa772b68d9ab409160e008dbcc15baab75424f328f5530480e1ea4c915a623ebb305dda5194722aee63681bd0bf6aa497dac98c652edfadf9d6bae4490635d32d7ea165c85d9c781da0fec61e742a7c9cf2c0224681c1ad5e98e4f1dce2353968290dde2303980a453fa535980433e4a5a1c593b2619df9566fce8feda5dbc0825712c35d9128f946129bfb0938627f7bd1a867f76f06cb1d3af89aca20ccaa65dbf7b6d436aae8fde021c3630bffea069901361c68b894a55bc6f3a50cf9d73c74806da80fe333164a7eea32180dac290ccc517aa936903ca84c87c99c5ae88344dd0d690efbc389f0ca025123e884f2910eaae3a6e84dc01f3141e2a0fd8c0b915d52805bcaea15bb7c20d4a61884eabd257cb8c0a4ed9c6b8232316f86167608fd57738d45afb47a239d3d7973ac6490e726674fede640c85337a41ceae176162a19998881591f7de5daf9f79d9f01ab93479f6087db740c5b72a78bf56882270310264bc914da3e7d7da26a2bc633a76d5e1a91e6d0c761745e1576a2d6289e9c2095070d231cbb5114d11c9847a7bb3e7776de7b83cd3478a0a89211d7cd77cd132056873c4c046e363e4544c9a3d8fd9d1179af9a88a1f08164c6cec6e1652de9e22ab4c44ff67d2ed3f8aa39f846f1f7b2a4148df0f0aa613cf85bbbd11b31a8b24bb711f458735928c0499f8963dd3192c0efb9a0ba1d59c008a5651d21b14196a28e15e9c3bdfda4c9a22d5c5b44822fd4713ae447d7369d15254e02f1c1814ebe29c44d6dc3d4d75eb0983a6c88b1bac8d383de01793260f35054a22c6ced75e992aa0b0aefa59e29b41e42567a4bc0fac0b1d2829288f39567dd6787d3433df090327d62e9636c3aea86037dd08f96f01677135660fad74987186ed57602a636a8d626dc4c8fdf431b036e6904c30acf2625976655dd06d4c111d483fd667d08dff1713178edd42070c7a0f29401a1f63d1c468680be0744e5447146739a86322f538ccdc2048127a957f437295af60fd7521bc681c56c17202c93bf33ef70e19c33249d5f39dd697232daf685cec6b50acc53fa72b73832f09af4ab85c8db3ba72a58d0f790b67598493a4dd1e97e3f4bc96b8a85051f35b38d636f9c4142053ebdc8f1945411831033ac7ec406cab8b730934d5e114159d1cf7de61bf2ded72d75362228d15732322fde735929ba4426470cd759b0216049da4dd7b1c0296f284210ab95431758b57923572929840da4a8f8e19ca8e91a9bc34629194c242867e85a28c6b48ece744353cf217ad58e9c24a631168a620cc5db1e2160326cf870dd104d1fd11e93d80fe9246a1fbfd92696c8cd44a8a88e4fa8a804637be78fd13c624ef502b1102e3a577e87eec945a2969ff848ac4e5c5d959639565088d0ac31e85d2dca5e695eea0ba1aad2046b7d25b3a55620c77059ea67a994cd6652e578ca4a9269e6e9022eb4b5fcbfff6262331d702b77a39573a6538a71d15faf5581661ac43160ec6abb0877b0196325ddb5c77755c3a464f1f7556f08ccba4182c60748cd83b3b60b8de59fac6307edac23c123143ab2968f7117aa6709fff663e8f2c7af04596eb1d5884eab2696bd3ee51c51929b608ebb39875bca48ded45a9edca2955f9ca42c847d896044708705e1068b5dd279e42e9b3f15a493cdb11ffe7d05da49bd594e22dc32900877fe70ddd57859c1fc072a7745c7ef68b0f89c636ba96feae8c287fbd36eacb9e10224aa90eaffdc7c73ad0985405a12d3269efc675dc0a404dbf79b039a2c36e489cb8226c3a21f904e8cf5f16bf6e63d6138f38e90885b08934387b1f545ae7a5380d89d127a68e1d8f9d582a4812980d213230aec1726326885d44890ec5a066f137b2dedc047daca66340d2f0a7104952fd8fbda9e7658f56561e8cf6a5f9d853a92c222927da3bf7a8425b19239a8558b5cd5d44735b92e0d2503befc08f93eb56140099683d0befd2a64ef231198f7fd678ad2af5c3217a8d8574a9dfd6250c8003a53b5781f7326928323e7b8973dc86aa3013973866c48a938443778dc464584040e12dfc36fad1811f92dc7981abfd02330cda7993be7218ec3c4d9853b7a6ba30af4627a88a798046b9d6a4ef8524eb7e14872609c73ce6727619bd83f42343429f91d82a24529f771be975c92205163d89d8493ed15d56c17cb1ee33645dbc6e5a4f84e77b339bd01e8e67efe5dbb088e5076029c362628682251d959eea02ea5fc038de2e7d0c524d8534172af1aca1124ef68f01b66d6071170fea31c280f334326f35621a071877d0a3b4014660a42c98367931324cca8148aa6ee9d9adddf189e0694d4b00625b020ae72d2dfd7080ada34183922d819b239c1b17e7393ed2a2a82323ca31bac485344009ddca5e4788283e862bc240c8c05cb8a8fed853c8fb2a45388ec50fe221fd47f1e48f76158b53eb7236e68af774cbc79d85423419d2804457c55dd500af8b77bc918e00060ae9be51e1599c6c801c0032ba61ccc591fcf18d26a7fa59726bebbf0798c78d93b4267297ff6ce8f26e658090c15cc8a665774507b1b560f7fd440f90888c2a3dc21a0da349b04af4e0e4a286d0bc70141107942d464d5ab7011c11af5230426ca729594a1fe0e57982ed328b47150eac46f0fdcc019cb6290d2e148d87240f26bbad4034369c36cb2b0313d20c5e9b6b75d159e1aadb048f0a20cdf381248f7653aa0d38fdc6a91e3132913f1072048f56f6c1bfef5a8d33bc0547fc28604bd20a9522ff5e1dd469ea2d3c7e42e209ab81a35f2700722a75f0dbda0d7d03501b3ba5a39af7008b41948d13f9f6fe55a56e1a27f471fa5d0adb595ae4487478c2cb2acb8be0bb697cd9c3b43511040b215042a9feb690c04bdc3b160e992842cb183617f4220484e199089d30aad9c2e660058953f33ec8f59833aa447b6a9b519e6a1c5ea2aa7bdc6bda675f220d408c246308f352139390bcbf6164db7c9ba395fda4253ef85ec4a9ceee1c256b091f82723989d02a9a4d5880a7c85d397ef4caee6c379bc7f7a39902bc2a03da5286765a30d6556d0ef921e45457d317e8db8a8a33782371b8c73a9ab49fbca41dbf616676ba833ad834c97b7321e3f199e41f7f518641010c4cc7e33df7e946d8206682338177097247d8099f2ca6c75a4bffbf576d77edcade52a69452190743071307e00fafbca356443233f833a4f4ddded5e1993770f711a658254fc0e6ee67811215defe7215bb3bb372777f3766b94ceeae7497ef60bf8b524ab9bbcebbbbbaa96ec21e0bb3650645fe0cdc0ee7f2cf75e7239b77c5102da54f9f9e512a73b4fb9c2ee522619353eea9b43f1ff3fca3c0155774b82f5b94d894db41bc1a4ca36966dca5cc04b12f7b3a4393318ab1c570a70e860423c5e4bd945cbca6a5baafb0b0acb4a8b8945e3c530a0c124c77e262b6182319da0cfad987815346ce384dd3d8adb12c50d8b89dca8965541b6d5c474af14a53a55b6169717931c18039c5c49031e33f50668686460daf412324cd2535386c1a4e23b763814cdd4681fb8d9a3192b1c5e062ba1309260586672abda8b8acd02a52da2896ba8d5a71517929993c182930a413b78deab651dc366ad428adeecba75f0662327346d2388daec1dba8b0a6068d9044e9ded83aa9c8a86b94a6ce542da33db8d4969a517045e05bcbac1b8dac1b0daf5b0d8e768d3024390fd6ca617146b36adfea8435eae634ea2669ea4c1d7d5d0456a753c9d42d03eb46bfba695fb7d18cba6d32eac6c5a85b175337d2a96e293075f360d4ada4b2c2c2c9afa5d22f070f68e0dc9aee032ddd0268cd7e6b61a99bcb8b4add4ca5bac1f0ea069352b713a96e315ddd62c8d8ea366354b7d7eaf6d1ba8159dd646668bc6e346a701ad7ad26a586376f18922428d766bee658633ed876465471c980bfdfd28427ee92da1bf8d1bccc37e34275178f101e154f4f75508a6ca462ee38aabfff9c1dd89798bd0e4e8adc3fec37effdc3c0d2e77d38d6c659fc3b85d47123aeaabce858fce54ffc0a1f12343ec60e14d4a811fb5cd5617758e2237be38abde1b5c88b0e270c75910431a4f64f171e024e0be0f7de03c5d30cf5e5f979eaf6bb6ae529f5bc5e5951394eeb6ca35c8ed323f53c53fff7e86d025fa4d5fb5defbdd3e1b5fc6ecbefa25afee5eb222c4a3cc94f5e9ed81b33f686acfdaea451a517e2cdfc09fbd5a1791520c7e1f17b91febbcc78d124e3c5180e44f3cd7cda0f2b08525d623013149e687a79f1053184f1e2c3bc683abde8c5bc4847c7d97eb237bcef0f14e983a2370394018a314031146f6240919e6040d1040334816288816203aaff0b28be5045ee71f944afb67c22d7cff2893caa5ac3beaaf6f3fb441b558bdaaff2953e0771ac4df69e3d0dd977f629a0781376a0f81c98fd068e404dc98c2d78a203f9d828715b0e74848646d17cabb3cd7c36ec8b0a4a70a27303f7840552d0e181a4616dfac56dcd7c324ff3813cae4d8fbcc4121effb837bada40a3c78f813ecccc7c36ec121ca218a17303f7c4053d3a3cf000e6c3382b031ae5e0c906768323a7c376a0ae3ad8ef329f83deaafd33094f742015d7778b15986f74733767efceeeecec8936549895118e1b13fd68008f78e24dfd1c18fabc659d0ef639e7d4b2ec247f6a59e612e398ca1c769adce9c03a06cc9c1c6767670f2bd7e042e5bfc921c20de7bce0e0f9f7d6f4c8a536e9fb899d0e1a50c03adc733654d187ac3c46bf75f6f636f0e86cbf75ff823c7cc83a0277b217b5ffe1d58704db63bf1d0d1b98034f4a27071b6e88b2441557d8a28b2fa2e86c1f844767038374cf81e04ef65bf7f3d93efbbaef064e8d2b550f9013e0a093c346d1e981a1b3813a6c1fc4037582200d7430e904d99e7b0775a03a41e812fd7c11844913246c81073a4178d0bf819ed7ecbbf0bedaf6863305a9d7f4633c4d93c5ff28b5a150fb6396083d54af4327de4da723632eeaac81ab58d6ef42ff4da3b2da6f010d348e0bcb4677864d2448e8501b4aed9fe96c0af3b584a90929072ca40c2501071d569d9039e79c2d3a08e209ac23f428a184ffa089ce082d904770ff3f83444a05331d4af9b2b999313b337b561282b24fd91207ebbbdcc807b749ed7724823ad2b82bb4e06e306ad984892d336fe63cdf677c4479347afa1aa5bf145c538772fbcdbb29044fee27a94b29e709b6eeeee66e6e83d2dddd726eeefca269dbddbd674b7084ea0474b8dd6e3251eaeeedeeccdcbdeeeed85c5ec9dddeddddbd8b43b36649bb79bbbb49249725db2e3b499ad15c4e78b35dc709c32c78fc3e6546473794a425a051fc061840cd476548e96ba411cd1947a42da3c16bfaa90643aca96118d2e0386177188661b87118d7cd8e449224df5260b4e0b1c7a5d06bf80baf756415c326a5904861b837765f2a3decee6e0a148b496fc30edddd5dbabbbbecb85dcf4b09f906af8d1c7951c4dddd5d3ae2dc9dc30e97e5966942767757c8ba2439fb06c5e3f7f7a234f5a2ecee968268423c7eb9bb2b6feaae208139f13453a76c395da6f432ce5d0327c66525d18577773db051bbab713ce2e4d6e9f08dd378901a0f52e341ce154f5d4b75cee971efb3ca2e01b9d178901b11662db029b1239826e82036b149334dd326866529cc2e90d8ccb22cc366064a99c5c45cc0ac05867d180c9a0d674d05aa7f1bcee7682e90a3476e871d76607f2db460d6029bd8d46826bf98984633b9438e2f2bb225895c4e5e45abd56ab55a61af71a6c6711cc7d9335593c85ccd9f1596d56ab55ab5b88ce3388e63edff4c3060604ea798981832a40c19de2c43a5cad58f64018532e85594ca56d84bb624919357110c98d56ab55a9db017f6c25ed80b7b61afda0fc6903163c6fff781325246c69b654af5e5524a49246bb55aadacb50adfe4c91fc992407294413266ac56abd56a55fb653e50466666868686460d59a38637d7e0461ae411a5dc95ca5a5ed361f86f32791ef5222fe55553cfab4c60d6a2592bcb5a58d69a594bf6cf6c34346870fcd5a0aa1a61b723a4351400120000f066003848531da654154d794d7bcb89dcb534e5389445e9068a9e8945532c9aaafd3494c5aafda49ac3715ca51a55aa5135d270d50d3cfead06d5485d8db1ae72958a722c7eb1f5338fae8449ed97ad20251df6e83ee510b51f932b2989d47e2a876852d3bc59932a0c73d1264f6abff61a6d4d3a6cd768c4e28c28a9fddd484a31d261b3523a1d9e2af590daafd2ede0faf5902bdd0eaede53fb5980b4c896166f6e59d0532c77a9c6209e285f2f2e4933607ad53fcd6aa01e3be83506b5885cce4a752b954aa5524de472f262b1582c162b954aa552a9cd5361617915a5ba276c2263508bc8358ee3388e2a954aa552b98bd52b168bc562fd340b089bafd7ebf51ac7711c552a954ac562b1582c5689c5c5b4327210b798c8e5641cc77154a9542a95eae52aea54f7b46a8ee3388ea34aa552a954ee72b9cb5dee7297cb0b07e3a4c22a4a8457fcc3cac0388ee338aa542a954ac5412d2672491fc7711c47954aa552a960bed25c39d917a7e46b745518fe9b4c9ec744f8a7791cc7718ce1ddd01c6f3405c95706c2f0df64f23c3a678be76aae56f295c917265f53bea47cb97ccde0b620dea7d495d784596f3973e538b345a9e7995e9c2b9f2b057475b67e668b640a3bd28fc7dfad46751a966ac016de4aed0d7f026ce179b7a278ec299e6d1bc5cc10c074e6f3b73a98b93bf98d92ae739a80d4c15eea60a00d37e84c5587fc446cfd3d76e58e8f9dacf683c07f27abf27f388f730ff6f77dc6de869abdfc26284a0e788b1cd8b5913b36d4ec37ce9cfeb61f077634907a4d6593d77060875b9beeb03dfeec25c69c499e3d98f99d411ef26975d0c11f5e9db0f50cfea32ebc07f070b0035e4f33f0fca80b4ff2343b6026a45c8c0bd287575e002fed4682133ba8a2a93a415463ea2271e2486da26b2b69525b0993da1fc3fb1bee7c80a776ccdaf4f3be3ff626de75ec73233513f7b11eee0df01d5b1ddc6190c7efd3d30c3cfc29e8c32bfdddb1c34f2918d3616f1c7ded4591fee8e76fe536d034da3690077ded79d08fe9b067a0afc5e8c29b4f4151037964cf5379d06f14c51eeb9d6c33285296b686ede0d740d1c7c446a3a682641ffdd942f118c98b0912222aead61c770a9073fe0eec77f06313939f06aeacabb1bcef1beae389b412b1edcc9b58387666e6af5b5004a5080a50735160669ed48aca4fb1a0c0d6f0346559e61addb20cc3b2c7407f1e193732496cf36da45189c929e58d3f4f606d386b8295506a0229b831baf0be3a0ed612f42a83ccbc79ee8c056fa54b6fdacc0ddeb494524a39c3199edc98c4a40604b74fc7b04cd2f69b9c8a4953c75f78934a8d7d3703456ad2e4cefd2c6094a7e4dca7b7cf205e14ec4549e76e29c89c73ce2c5be2e5f374c94d2ca3da9c73eeeeee9680b4709ba4e4fce5df482a3a57ac579680bc94d8144d2323a040810245be40428102050a142872ca2dc8174c285092b005285bd8dd5dac67884a9551cc064d04450ca4c3d48e4696181407b436fd356cc049f5e1810efb5f238981cd02441ac8808b019c0c1b34810eb7c571dd926e3a45eb360636c22ff48d2f7cf179e423aca4d908c7c047ec0bfdcc84977012cc400c8443eb721240bb1c1dc9c440401d4ae1f1731b359168e6d2b8a054ae6b0916c058020a7195102159e2a74eda4a604105437842083af16f6db94b76d88eb9877a42000aa2050680210cd1a8d84f952e94c8014dc55eaa729ca8d8112c540cf3609002ef8fdcc006d36726d164c82a89a21f686872a40717d060c50a8b228729889891021334aa298ec0c51456d4f0c1145a60e1a5d465828a1c88a0a2053745dbd6f2b88a924d45f0ba8a3266a6b2906e87ac1cd89afe2c6affe4a2f6cbde00131d784cd41f72d16222c63affe5899bbd3104ffd4688188fc9915e970ae8874384f3e782213e18f7b4a5930e5e0d81b8ed33fdfbba933acd31b7f80e4899f275660912a75a474b0870faf3ce8679af8c32ba66d43785b0dbc1e0efaf04ac1d3d70cfce13ebc4ef0f415037f780e27751809ec791dd26f3edd6fa763e3a953c47470eedd9c8122f6daa87273d26fc7b1e9434af99ed7f17ed786faa4803daf93f2bb36d9674140550cc53a842255be0b9d83a351bb83bd0b6b233190b3c124057d3c30f41af93e2920f51a299f847d363a94df7d395ea3fd86713c02bd0e6f3a9473ce39e7f4f94b4b1a3d29e088ea40753bedf320d49302e8bb11d581e046ea76d98679d541c19dacf2a03f411ed853ecb32ffb1f5e3350dcc96ab76327dbc92aff0cde17dbc7a35b1bff0d4c1d54dc408f4ecdcf7e03f3b3979d0edfbacb3e1e3b1ca5fea035fb0df4e854a5e04e06721d66b44393fb047d825e3fedeed9ddb2411ef369953d3fc3fe87d79dacba3331d2ba79777747df54eeeeeeee72c6cc9bc9ef2cf3808f1641a3e82f633293dc62261d1275c8600d19d880065c2e278de2207a98e03590eabbab49fa19364516d246bac64720b3a67d8ee639a9c6acf16834e2d758541c611603f5aa87e89f0e9d8dd023b406053b0162239402615aa665e06423327752e937d3eccc4d3c7147f126c74ddfd41b2380aa6fcb896d92e2cf371cc37c8ac10043f6f35bcab6d1a4d2cfe4b5642bfef759c2c03170f5e6210411d1b2d7441f4da4c541155b4ac1cd300c6423e8672f1f7b3682192189340a0baada97801c210e199ee0f5b7287d390d72ce67a0358263e03a7f4e49a44a4ecd235c890f79ddcce94332d3925d1c15db160c3ec3a83a0803bfb0d80dc700832ba9f3bbf95c0841191c671d8482d3f77272a4b4b1381e0c3e647271451fa95b0abf5883a96ef41b8863d0e86fb66d1928b26c1ab89f75338cea041b097e611feb7634d0917945a5dfcde7c2e7b97336a2e0891b24e6c8d0a8d1f733a07f0216c8c1d1a88992cb03aabd6863ac378d04c7c0db47ea76f3b4fd9ef665ddd7bed3523a92818621231e7cbaa79f0fc7804f86263c0fac31b2a3c69c909f6598b8e27e062e77e2a26dbbddd54c9a88c99cceddccccccccccceccceddcccccccccccecc541b6dcca38d63667ee63a520a29853d66ee5587fc4f8a9e34904e3d297af25212a484494b499092918730111ec22a6ee6666ef6e60c70333773b337df34377333374fe77697724e6c62589651aa514d1b8db68d1b6d1cd77524524aa7b4d7a56e07b70a330bb7f08b7373333773b337b333bf208472b1333e0608bb5bf618c7edee7ad973bbbb598661d4e3d6c3b8f53ccaed7b1edda7de3f414a49b749b7497bb6015841a594526a6bb31d834a2aa76a2f922546ea52211bef96d666396f6d7eaa18037383b7489010893195fabdbd514ddf4436187e7855273dfffed6f2b5d4dd1b2dcf4fc3de587956797e7eed8d92d73dbfbbf646cac480a8fd196351fba9c643ed1fb914b57f9338a80d7273083bf40220302b188bcc481fc981876de56379956fe5b7d2a7f29bf7957edb64cbc7f2291fe9bb2f656219d5461b47fae4cff71daafe0c44f5672caa7f1fa9fece43f57729aabfc441f516cc3f267b710ea1fa779ff7a4ef445fc45e50fd491f8cf6226645f5cf38d20763f46266a4fa933ed3f622cda1fa6fdccac7f2a4ef857b911aa1fa933e97dabda80951fd37fa2ddfae4d3fcbb7f2a97ca58f5f6bc3ef7d3dae0d7fcae7aab5e1277dee125964718b50f9479fc8427016623351f9b34ff41e2a3ba1f24f7e7ef9aa2bc3b3c2db92edd4f24e2d1d6c726219d5a84bb2e4c4329ab9e4c4324c4e6cca295fd24f45e85311a8cfd0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0500b10212121212121212121212121212121212121212121212121212121212121212121212121962c70bb9c5846b5d1c675a414afa4b2c2d2e2f2628201738a49b956a9130c0cd38b4b4b0c19336256b3e5726961595129cdf8d3ca55252f85d4dffd07c32aecd571dbe80361a8b2f135ca40191333485532332f95005b78aeaab15c0a68a9da290acda56e145e8b64ed8d18da28d5a2c3b633a2c6aafe9b2f8e0a8abb27a5e0947e5feace28c186fe2adf07b6a604f2ccf03c907a605ff067f67ec126f2eabe3b1da4358214ea3efd8f6b773a5ca4e089da4a94da108ddade5ffb69147764f4a3e3ec3cd228f937afd0c9bb4c445e6b0629a087e8d0ada0fd68ab0e3dc76ff6d54424e993423af4ef3ed9d321904fa6dc0b2fead03fc7717cf41affa0ea44d5e4aaefa486feaa37307ea44397c2fdb5956b2ce7e99a4a2177a5983c4d524ab944e0e65cb65606a2a03047e793e335fd3952bedcc2b7f058061996db75b0edcad9a06843651a6cadbabfbf4fca01b35c6d726219d5684b4e2ca3d9f8ea959c5886b16a7cc989cd514ec92a777577dfe0c0e322eeeeeeeeee3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e5e6c2700425dcbed72669b65dc9eb99c58a6ada671bb8665541b711cb773a38deb48de7a1eb77b295e4965a5655b5ab8bda5c5e5c5345ffd306693e93aede9c4eda7e91a624564884a8531c15a414ac611480a2bc29e602fec6584f533c46ac59c35c95c9e11654c3acc5ad86218b76319b7cbc901a9fc8ec3a2b40dfb39b53798348ee7354d05df3c6906270b688e41b345348ee3388e2a954aa5524d97919e2e97cbe5521da14abc25b59f0915b525c84a79a629279651954aa55269d3355dd3355dd33563e3ba8e444a49f14ab2c452676af64c1591b99a3f94c873999cfc2b2cc24695d7b44aa552a926d01c67d06c4d22ae23a58ce3388e9e4aa552a954b5ff555658585a5a5c5c0247a84ea9b539f5b03530e8a9386c4da360b8d890ab8217f5e7a58a27971027d70f27d74baa08e67309726975c884c86b5c5c8264d409c214c17084277640142332a4b28d4654a4b2f750d948e5d70e2aff0ae843b80fa5226a7fcce7409f0d1b2a3010c0868d027005e87430ffeecb78e2ede7f0fd46cf5f0d186bdb9b18d503618a7c5c1e861a6844301f47b4035051794d69ec7c16478508951fce894a7ca962972a75a9d105c86bfa4b2c95204a4a288d2e40360a80428d9ce3361487ea74f8b83caadb21abe4c09524418ed3adba55ed0f6a944a4f735058940a0f1baaa81ca74b9546c7d1889c88c52905616b7e1ca7c4f29a8ed52815a0fec1a25492d8b03fa58a5d2aa58a2aaa94baa2a2aaad028a2f5e09143d0f2c8d2a63e702e4389c1317a0ef04e33bb5bed3f89d7ebe1e3ebc9a3dbf0a0f2725b5a751272636ec528e73c2c1d600752cf041ed2e75ea3e982298d7daf46b448e73d2616b82902ab11c07868bad4902e6890a50a360b2d8b07f75851f34a2daa71e8aaae852e41285cb13fb42bfe97379f95c9cb82ce9b0dfe5736939711c17221757edef47b90429f16418692283d528ea45840c712042bc70204fbcb8e249e517bbc915476a3f4cccc9d5a82627278d9a2edfa949d7f4e3743a287872e59c723a1da7261d9eaa38b94e55c84c9eaac05e2a05bbfbf14ff38fdae0fccb2af7498ae26875f97c5a7ef4f91055962282d6a6c7714c405e33b2a85255f4825255fb786df85b3efa3f6366f4f3b289b1983aa00e68a6d3d11d91e9749c5c27d7c9a512863502100000a88c1df60ba0d3a1a2a483410a9ee81234d67e17a246891d50eda0252e2d17268d9a1dd0de5819631b69ff8132386a9a378634aa325e1ccf4a8fa00a24460082a4083f508470058ca79c53ca68c19b75913c61020b8fd645f2e4882c0b231892273540f28488172110100a41ee44cb206a020d7a5852440e4e086229a5cc154138814609490862890d163caa64a6076f3b027442103b90218247aa9b2408208210840f4204b143c803105fc82401c20a404ce1c30c8d0e1ecb10aaf0b824689ec04ac2632942430540f4400520828050bc4d0b3576f0b42c66152d38d5e899c1d00e9e8ca209dea86e9219308105a1ca972aa59492e68919ec80a6082fa56e9219cc009c814a052c324ccc00888c135eb7854c10cf93c210bc97960c0a92805728c25ac2e3ea2629320410de563749911f8a8a08f9244570e061f4e18e19309c6981a772851f6f850a50091e8c2432397834099a263c169f2f62c0850c5430b305cfa56e92186ce183d75237490c9e6005afab9b240648a8e24b7905104c3f93d54d12832475ab9b24065054f16f527ab0b1f606f65cf9a78a48e5973ea8f341221c576550f421375e9ca9c3d6e8d0430f3ffc20841075e7feec013370f6d430599245e589337586bddb21a362a064d5307b2a0b3cfe6e1cc8d448c7c4ed726219d5465cb33a0adbb87d3b1221217591088d15ac8b44a848bdf11b1ae8bf16c4a32f7a14ccd1cf83c72f9a8055fbbd6213144df023457fd506b7c38ee11878fc62db192ee2872a9908e57ea28825b54b442ea58e04c51abca73a486308792fc4a33c33e5b74d3ce1845167a730624890ced6dcfc9887244be0a0b351c8010a0d7436093f5638a12305d00a88e86c18373f1b360a29963042e786941f344167bb0022576d28f5e0854a67823c3a590abc70735450844b477eabc35136963b598321384d40da10835011a38e7c1e9d990eb9a794fc9c024f76c8eedd6d84693d2e722f82229520b95deec6989a593c8f39e79c379c72a66bfa19fc49e94aefdd658da5cfb68ed3bf3a2c3133a3175dc876578bba6bc5e664c1c3822ab9df2d02078a3c4454693302c5013ca07e345b83491b0954f97c812a599c152b810d8649907578b41bba3d0b5bf3a4aa3fcf127e9adf2347f5e7599b3dcdad3cfc5dc6cba8fd32102049b5bf8747aafda41975db6d5fe4e93a3f8e52fb136fc0a1f6e4fd1cfdbe53fb3bf96fe5b1efe00c07a8fd3d4e0b3840ed3f4094ba722789f69cb09fef148711d7f9b60391fea8bd193b66540aeecca824e657a5ecaab4f326613385db06cc1fbd7fda8f3e6dc45df780e908a8dbcdd0ed4040a5e00e022afdcde39c65bb247da0eb0facd20c740c9c6182b2b1256cdcc3ac6e3914af98212c3b9c51103913f54d40e4b892a56b9a85e000128a1ca9d89f66c07e7eca36cae52736c75d03b0d744d6c0cffabb7b00f63c9f7e293503e98e147e9e8cf9082d8b2dd359193d947a1e0b15dcfdb75979b48c91056f132c9c6ce08320591c21095da060dc510214511055018b244c2c91031028b902899391091f841042941430a90216534c41092b5c89d781124e28ba620a292041c491103481c3500d8420850b2889a09f1acecfa9f371346afe3c82d33a8d44156dd4391ffbed66e8d302c0d30cac84bbbbbb3bf63d41fe45edd61cce5fd3fd419ff254f9fd382da04e9007adcd3bfc371de6c0d13f2768e3863a4b29a51fa93ee39389278ef0e4a6db6f50fb092314d5ee6efe217d9c1650319007f8835609dae8b09f37292733b79d833b5efdb1f7ecbbe97067d7465c25554a3047873ffa776cdce4dcb034ca9f00aa2da31084c4901a80ba41480cb16dfefb75f6f5f81daef4776c75d0c74e5df9ed64b57b4a7aee65a783d48122fdb4e77668bfc351360e3cd1df2a7294825c8798f8c3eb0e175506c54e0123ce3ef18773a36f27dbc92a0545f9c3ab3383e20da97ac310de56032ffbfead061efd7d4a7b74aaee64393aa002a8442d39f5b87488060200000093160000280c0c088422390c658128e93e1400116f8c405c523419ca22510ea3308ca220a48c2180100208310c90a9a1a102e033232cc6eb722f3a856b772840c7c4cb52f02e5cf31490d3b5d577f9d67ae6c6aa16e51205ed9aa5eae51ac49bcf7694ebc569b758b204ba2073c15080fdb3f61a211f95c50486a3914915fb818aed2c23cc0cc2d4c77b5bd34040a8a604b992e1a49488dc33fb8f28e7445b371526cbdf0890331dc89db689c11f6e8a0c6f65eaf86036979dd8a2ad2affc552ea62ff00dc839803de41ea6ad607e58fd5f9d02e513afd58e49820d4531dc88ca9b2923a5cfcc3ec67bf83fcc0d7a9ee624f51121f43f6402615045db1aa158da2c331243e4f4ba3444db2b7f6ddeeb1c9fae599331e3db3f2d1a6cadd3d78e7384cc557a3669fa6a0200afcb97f09aa544c4c5430aef3b3c6c796ca9190cefe13192df4b1a29e1f0d937d7c404e0782a3714dfb243520b2915ddd31c65af9c0e746ce46af2800a1ec2bf39ff5f83e4fea3ffe134aa40b2e8910ffb588fb8069cfc44be9fee820bab48f4ee182be098a9a85597595edb9034d50acf7968ec5838bc982de50306b83a0643de4d2e3d6bec39ef1bd3941ac4a0f37faa37c1567b68ac9b5d52ccb74d6ac77485620904a52fa743108a2d22036d82a63f5be11c10aaff420a18acfea383e895e31fc2fe73ecaf161ed10cd3b151725115d438c537ed55eb4829f2cfb940972c3f9e46288c4950e68b14acb32fed7642adc62f79da96bf251f782c85fd1c1231d4a5a8893180f48ccb676061d86d66b061573577178cb49dc513778ca694002be77a78dd43bad6beac4d6d7d62247d2b2a455908a92fbf3851834d86bbfe8c6bbadf2a38273226e64753e805a84707ed9e5339ce56fa1f6812d0776a452653f91385fa8b305980fa840a660b774b683fbf1deae4004fb402c973cd9e4767af612af418db54ba6ff5eb1d69904a9a5bd4df607769bf3181a65abe3ffccb7aac2c805605c711d006776b1f4b22592e57d060c279b8ae33d5da1ba1affe5f51394eef811acd98193349542649110e0cb3f854afaeebe29de76a30043b880158efe94295c5750af3768a4ab1149936fcf5544f2d15ec1fe86172adb3ed888b1fbe8a47a7f45a868aa4dedea5686e75e7e16fcf2ea0a115a363ffdf5ceb9a2da064ceeee2e7c0f164fe572ee9d321ccfc341b5ad02e3515cacdc33dce68cd7dc002209b09ecfc40ba09742b0b9a0769ee0617a410fe116b40051f14cfa81e2d8ca36e908dc3097251a4e0738f04ad5b040e8a93c16f25ebe0dea9946f5e4444d791a5d0a975149a401b5c28ed922dc586d3ae91478cec223f0e1d95f29939355437922b133e992231d4b56f8010c8da5cb476df00ddfd3f1092663f3a03457c0170a79b94875b4ba6a60d8941cbdd47450260a12bc9a9ed03da80c653d4e0d533b8b70e88be810d409209ffa67ae5d5c7c718d3d03a6c8f815ae3c8432bd963762a1bfc52e52882805c0a881bd2cfabab16c68a9c48d290c92aa48783b11f96bc2837749589c44840b462494103d049951e239b40b12c89d7719f475a8562cabc3d0c99003e15ef3e9365c010370786d1429e62bd1202e72f768798085b95bfb944c70a3f956ef01b6bc1e0223e37fd16afc5cc79014314069dae73fd6b9f95197f72de6507ef460bdb25a8baeb25cdc6b5b9674c694f73d15c98ce28a42d301b88a152954969ca212f55aa42749d5a40c3ecdd75d7b5f1fa57644298a3df26f018586885a477468e4527aad0329eea15c9b0c35f78c6322f47c027555a693192a1d599b21e064ca88db40527ed3a0a718deef881de2d3acc2de0dadc7ec5b85d04b8a4471d04137d99fd25d914f97d991e4e71eefaef6d7a9905e147db003b86d878ef4f99949ffb0927a95009cf8169d8c2484ce2935d07d03181a976860a646128243c431d629ee18f81fdd918dcca8bfc285bb0bb64286ec8c9d3a96112f784a703c334249e636b11fbfe8e98f0965563e5474c504a650bc89196cb09bedac6f9d43e217458269ccaf62cb93343d44c1b47ec60e6fc7031be014f0510ab9a7794c7e8cc9d91a7753edbd8df04afdeea0e7c565c7b95005c8c31947f3d464b72096a6a1271b74fe084e66b128b5b6cd22632b6401dc45d90dbb76877001b34971e96676026bda75d72588b2ca9df80ef58e0361046c00a68c4243dcbd802007c0289d0e5aa3c66451e38b48418508b8399ba1d127e0b3df0a5562ee40196e283db9bbae1a1258e339d71d94a1a9d01329b06b800e3172ca15bd40119513451eb6f93c994fa55275d878714a420560b76aa5c94550163c858e93d149744cb651b1d85255c2a057aa83b720d4ae27825767401f44b34a2779f102f9e7dfa69c37b26843899094712d085061744e9470b4af034364ae71c702d3c73d4353bca0836e9fab2c910e19130ffe6482e1589ea3cf50899d82475a364218343ac75c4cf30d43d62a2cc4a9769b0528d68c59fe9b8fa838f56d200e14b32ca755a2bcf763c2c7e290d6a1c63781cb67ca37fd5057b5f67b39a186f7a048f891f068f56490d1ca2156c613b91e4f16fab7d8bec613531e263b649810aa2f375b87fee9f01f2f23269865288cac232ecf41644604526d92b5c9d6763063809487401f9b107ea62415bed193600d52c755b1bf6001410d22b8bf6d38764746120646bec049a2fa72a9ae4ddfc8a367aa9a1a2cf70c9c6e7e6393624f4f3b56dcaa71a2e858bb34c6bcb1bd9fd539c2ce55c83f07f75467aa3a11fb3d123b635c6cd492e872c2f949ddcb4c72a57baa38c9cedb2393fde628baa25a173fc5eada44724cb5d227c0bf4584b2d3bd1336fcebff815e6b94324e5f0b867d36f10fc87af6b0cb7a9e8cbcdc806f368fde3502ac0ad91c8cb0398558178f5bb2319e326e8da3da87d0c10563d31b192f2bece720368ad38c7ddd4ac0e563f6575b8acc6832ac5c8f59cfecee834b1e9cea71c2ac067f4055809c93b2573cc7363a81f39b31f5d32db218a6b3744b1a661e69f852316db78455661763cbabb9aa906fbd16af68aa15c2f36c0d99154eb17b61e91e7562db6426008762cd2bd4f5b99b160f190711d603e324311ca83a1591426ec1434de176e2af6847df20d7164d2cc8640db9f0bf44aa008ec8392b63d0ae5549d76680df3958cf52414ca0e68a16b440975e769a5e6c864c47990d31f5280c2806895b237242d2901325799e90a53f4ff82b3063361059f9b03d765b1fb8624e26d83c3ed2e0507b2f1b8733c48b181d4ef164cd1606352443702a58908d2fe0b7bce83493cca2297712c1093c9bfa4e24db6cbedc764c9c7d9d0b7db94801dbd322d8d68e32066fbc2631c9f8be4977c2cfb5654111a8c95d3b22e7bbdf1c7eb8a0092cf6b94a04c5583f87df58e182a66077826e04f82bfcb6797cf4f79c7a2de329b0ec7d29260fd51ed50b151c617d8a898679b40942288fdb86330dcb609e9f3f4168b58f89f755660d7b76693c60de22737fe6af21c45a8f4f04717573a0487e875765a4f4b7f2692d07c1f817e95ff9c8abffb6b5676771e4853beef9d3f2a7e0011f1e4be9ef3d7ad74effd6c076f0a1bf491d10c8f5466872e8cfb92a2f94a200cd5b2913680469c81df8843928acefe438334c08e540d9dc67a74deca7d80b9d4d81e6b3e241cc0a89cac31230e97bb6680ba1f4ae53ba6d9ed2f1180b3b933bcc434ae34f7236ec5607d97e25db56a51457cbc850fcfa5dd0fc047b1c6586de171f7308d9d04892de5ef6e438edc142082939f3deade3c04fbd9475337165108fb57d75eeb24c7703d9ef629c0d381dbf975ab3fde34939e0028cad7589072dedc39eec1d841f6c3af17e412a59813320627396dee45d916ace101a0984ecdd9b197b19973a1d4fa214e29e49e7931f95dcba68cee73a6eaf5242c357761f093d795345234e241407df406f0523b9a673866c8c0ceb391418a67c33f4650aeb4fc1650d4c0222daa82840f88e382d464bc702cac3ed34736ec96e45959d5ae673282124aff71e063abd6509dec5338dc14348e601444238450971823d240779b4d10ef3e4dc814804733382987959b468431f2349b4a36333c9248d25e4f9b9438b0936e94960f62cdaf4f89fd9b36d9d2944e174e28b3aa28c6797e8d8b859f4bb3c23d7a8c0fedf4612b702f1c4cd22c6529d458f79cd4d745f52900dd810c1ef70225b71f83f121776ff5f8f95dc32b5ce63839712e91098319f54dc2c229ad3c2d24f93382d54e72e252b60523c23c9fbb633067e547505aacda25f0878d2cc828f7b4c82d08fbb70f78af0d156109827d8a55cb29c98e26749ac008aadc9f3af1a6d6532b33970b8c56bd68ea776f72984718b5172053eaa52fb0acab75be8e81aed8568719b6ad5949f87d379459c90fafa10d6d1995f082613ef2c40399ee242705934524792957a0a5c1694ae2d49792847e991a6dd31ff91d65c1e1efcdfa1bbb629fafe52e457d6a78ff495241b348da3f97a586c940c10620f10634f5986fa27f711b2c165d19547b31e3d9b38f5e8b2f03df6bf7dde6a957d32f72281c0f787dacb80b006107c0a3390a4c32eb8ff1d9ed4e8ae74772df9091625c5fced760f3822adcca943c2c2d905605f25a617d5c4a25986931ca426c44eb456f87dc76ce0afc8f28541eae73d8ac33541b68074dadf505cb22a8b9c49e2a8b7d324058b738085e621ebb0fee580a663943401d8fad06aff8b317de771b08b1645aec9d76a76d4fa61c3acd5f8c4dc80cdb5ea122487619277a543b6fcb52668d8cbc8f7c9786e4f56af98255968eb07f703b4ab5db58e6140af69cf69385f9e4ef673a4aeccb313105e36e319dc318698439764bd1cfe3eb0da278fba023b1572d73791b1a654ef4dca79fedf266f75da6864f840e5d4b7d0b55a9e945219d40f1b1a1c2996cf75ef66bdf4d30be0cadbf67e640617173599a2a2bec58dc4959fa5cfb8516f5a4dfea30a579eb9740d3878a4efac8a82442e801fa1fc64a00b11127cf8d24844cafa128eb3235100043d5204dadc6af6881c7b45ffc19b9df3caa20a55209953a949860e04d91b4253df29e7ef4c4d24eff4bc50f8c5881ab3638a7ab1ca9dab8ae6a39cc103e6d08f07eed90fa602079b5a9f4649c5c0c71c8b6a9a3a1c3b0af69981dc0cbc9d81ee3390c4eb20b0c8c50e4ae3b3ebe370e4ce14aea8112dfd4483e54a3bf2a28a6c6764253aee5e1c66ca37897a892779fed6993e19311f888be40d7235f2830259a9f04ab9918426238573c4e0f241f6264ba5a549356425d556a32804b799a9e0730f69f2108eff713556db3a3d90d8965bda27b02ecd40b31d4b932c4b3c541e8127093a3dbc58b1040709260ec24965de8615e58378a5d4ae4397f8a574065086a94c1fcf18b94a636a0436972ecb7d3adda961734dfa2accf8b450bb63ed53e872b7533e74b52e68b03a36dc6f08a88e4e891c80a0bad037d4a657490b045de71dd24925425aac5155ce96dca6eca233af56b4633849240f3bbae8afa59b0d981e5d98577c3e21d68ed4e103f6fa6e8609b857df274d5d74e3f1e09c897d720cb2197cfc4eb9da2dfa3b5678ed30d0290c984459a60c0cb2f1ef29255dfc5735383dd8d9dee2b37ff091baeb49b39600576f10eb6c72f4a181dc442f04dfaf8237c633b9f5b5e801594d0b30345f775cd8b030389fcee92ecf47d6adf771fdff055b2941cb02b8ca357785ce44c5008a6d57f61f39e63d5ccffb2a223e0f687086c69ed668067bae63efe8c817b664bd93f2dc104017e5c8bc037e6e0a669707055063bc30230632e806b682754a9906e60c6316a5f73cabab99832e18d4e0334f4114490c2a126959317efeee5967d7a91f886170d34b077de958a6665c2d6b2e6abd3a57d6ddec9cc2a9be3628e29a635722f062486548ab7ffbe2aa790fbe83cb69c945e68fe2b743129537d5a827f7ddf9f6b1c185f0b37754d99220604265c0cdbed4a779c60e18d98cd8ee58ebefdfbaeee1054f737ed44ada8f74b5c940922e3e0d6d81b9ef14233d87327102d95f7bba8343c63a402673a5b901c882ce8f025de82a4c081ae55d8d72e4abfb853775f17172250dcde9b02d7def0866c2522160f824eeef24f38b24323e75ed77983761cdc8f2363791b7244906ed50f6f03ab2787193d6e27ffa1bda97a1eda3f4fa30043acd973630fea43aa8ca9fd73ab1fdea3d2c4b56b348d77db2ba3342869aae5a642c485fa3547948f9c2a8758549d00adbde9f826f5250d37c4118050657e8ce5476c53a7d7a009f722a13e8e059d055d5f62440b0a5b2734b3981439994c807535f80f117e0f4c5c31d2d53131d8f00f3e27809870b37750156d594302b7c8a6c36b8fd84649d875c88cb8bdb5125c723bb0429fed0e716d813374312d4cefbc6eea25341f5ca46a911a7ca440dca974d703e907c58cb2f30643158f5a9047f07cf269a01c0ad4edba858b723379fb5eef3c45a27dfcf8a82d1e8c92d3d657a722727c591512ec44d3150c36402afc77589ba0e3821582294602ba4d177d829462a9345d0b5fd597956cec61f3d25a4262956c361e8e1b05b5f73b400a4b07172e616ecb30874c1ccfcb2c7d2b18748f08e4761d4045bb764912ac13e9a3cd96f96e4a0029d7eaea8df5a621f05744a018c7a23195350a0354a673b3c4eacea336890290f8817023a475977225cd27954132cb01beb3dcc1e253b0a67ce48188f3313c523ad69e170ee3a60b9f279bbdc7473a79448d4f9207aa5c63cfff3ce79dc48b083764bedd0af4a180cca181ab50884bc3678d3bada2dd04ace630bedd7f38d890a7229a3c723596f83a4bda62dcf7a886e41045a1ad921e294f37b056a2d3e4ec44701ae9f0071ba3eb9d6f7c4d9c80418140769bf6ad65ff285f341d81c1eea4ee9b261268d2d49d94447bbf721e6dc63fdc53d2218a8f98aad12296ef4407990c0ac3d2cc9e03050c836b7720865633b83aa9af5fe87af6ce79885a41046a35f4dfe525658a96add72dc1993f5bcb3688378402bd2308ff6801aa698fd5cf26774e791256be1d571124a9b5ef93d0d0508bd81dfe636ddf27c7ca0078cdb63615d6c0d218ff9010d644e9038e6bbdd4cabe1dab806c1e47e5dce170ceb6e51a35375ce9f18dc159bc6d4886966e64883e8af2eb69a1aabce165d4297db2ce00e280a9d32c1969201bf98d5b7da5bfe295ae89a6809deac6dc6c802ce194c4c507b420b41dee5aa843707549af78af2ae54846c6fb50eed681cf93fa2547536a97d38c5bf31d80c27d2f24cbe425547b88d53765175d1ac9be3a8e213c3412f5d8ae40a883ad732a07d613c72645de3b9835c871a64dbd888956038b2a63dddb665c6d0dd2dbaaace26f1f0f2d57b9cf7c3bea8115f901a4709f544b421ff842c0d247a00d38536d8b4275d4f00839b2d8aae58755cf77a647111b97e21192601dd9d6079d7c08af69e8002abe2e48bdca3ac3a1b6312e27f88e5641284fb364c60604471391fce5c00fb20fc42f1d3a42cb9e1100be4e535fcf7057c6364809a17b13fcf10f04e6301ea7cdc767f21f87710ad3a9b00b8794e5fb4ba9dbea363fa0d7cc48c5c937b556c1c3b3dbfb0bd904a96c08a7148aac47de246d5d9c22d29a4b29c4221f9c4b67c43b29231143d4f1da1a2b8d08e096cf9872efac821788c146b9e040c439e1fd1f79fabce9694546564d07d23c727d4d985fbbc5e28a95fbd7d64a2abff14c7f2b0724eceedd61d37eb26b34f296bd6299c7493c832d590cf0629b7bc56f446ebb74fbbce9a16d9d5aeb15b0c1478a06e8e73b6d939d9a4c6422e9c412a96e5ca368f87e03e12bb67d1d8ef092108a82874ced8494d947ec73b1154ef0a4539d0df391513d1077b191b67c7690674ad90b14bc90735ad53f5bad1e5a2186bb50d426a58e5a90ebcb209af133abc5bd09bec63a2b05858bf4e66eb2017d2ce1cd330237c57309917e90bc1da664b85ae5eaa2a20bb4a79437ea9b1af27bb54a4e3606744ac1ae9b2b282203c808a13085312dc9214deb38aea47057c96b19cc1a77999350a2d3ceb450494f1a8b4c0bff0ca6b53390e5cbc0644ea04dcf3f7688d201dc4937b1c07c3caf7142adbaf129c4144557a5d6ad6d82237ee4f34ad40aaa8188e40ce546f855f51cfaaa0dba3b2fe242b46342a97c99a763c82c88400e46d647b1e4315e4ed4efb688a4c2d0e9cca7087bff444f72484a3b8bca2a907b857d6d32d5bd71d9c9a3726dc838f9f07d1b105198e8d05bd9477f32320b53d831bd45f1e39ceec4423fe10e701f0bf0a2f529411ac7bfaf5a7b65aeac98232667a898187d4f3b6125680f71dcd246004143106f51fffd23f84d5d78ea1cdfe171be5af8e3d6ea9156ab71608fd801f01fd7790e574b04a7fe0ae3b10c13a5862bfd36ab4ece3623fc06d47d6f09bc581da8b37ebb678100a6dcf9cce8e4efa53775b809e1a5525ec6ad867b41e97c01f34c5903316f9fbac8a9e9df586ce95c8e5148e72178890594313fc894b63922de28af613869576703b705741b99cf2b3212d7a1eb4b7aba819db27d218b950d79386c983b47327285512f01d46040a394a37ce8437d5b8a94111c67b6b08cef860968a59fcbc810e076f63adcf5c6abdbebcfb0406b7b4496eca16dc322803c9a7bd11b6019bb3e04117ddf4e88a1d5916eca4fa13e760ae9888793dfea363dec233fac0080e168b09bc3e9088ad35661b124bc468317145017b55b6aee8335bdf620235b2b53fb5cfaa385017134f3347597b0e38c8c15e4c7437a5ffa7a0dd7dae5d5100638212900ae5f6dc4f4a23e466e284a3421b45b07653041756c6cdacf2f95636966b7bbb4cacaaefbd155732b1aea6f7653ee8bfd67b32666d5d867bb89315ebf5d9aab354eb3dd3d5b7640ee8938d50c29f6236ca1a36a575e21c932fce51f69e7c2c1f5fb26269bd77c9ceda3a3db7704f26966b7bbbcc07ddeabf5756acd531ba0b67d958bc3e5b89f5b5be375c7a9f8c017dd96065f06459dd75109ced3762ab83baa3c4966280b00314454cee1760acc15725fc6db45e8deed7d6797a8d5fa3efe935fe706b5fe7c0ea28b10cec1c27050e5cf3f690426cac1f44a40902f468f657efad322396e3b1b494e5eab8fd953514a41068494632c2ecdeb6e6e0d5c2e539c1d8fbc299ecc792b33af605736987c495ec8d9aebae2f988bbb42ce542e053a9f714e9960b1b2160e4a2c9da259e9a6cb9ae42c818d602765cbfae47cff8d93a4cc29506f649deecaeed3fe767b2153339b60f4c265bbb1b13c0dff7dd0e306ad908cce2c8914e54fd0bba19cd0659544e305b567f88d692f66b97315e7febab9fc5ae5c07b4d53a37c5184813b65124d5c64198eda77972f190dcf029d49a2789505bec74d96cd904595eb274e89fc8983b35d26dcd803e1e28cdf6df68769dc78abe06c6e3ee5035062b16f50f60fe29a79896c824175254ce4e5d99210b7e0d8fa73beb45c9d544f314cd9c926d10ff0f987034f03b3650664ca0852c64d6d0c0f2ea7213b990e8586d5e8907e2ceac3388439533d851abbe38d410d28bb1c9978ad21428018564aef3c46c7e9bc17815ba8982c7166ab87cf698bd355ab1f4d4227247ef99b0b4675c9215e84dc2630ca5a300692a41c2c29b9f00aec0d378d7c8cbcbe3edd4d0c2263bde2dc918c4943730e674d43707b10e2310c0f037e79e856f343f9739e13b037075f1e8f8578ca0a904479a4faa174d56227933af7941141e3df3c595c0969687d1fb1c3b3077500f4f2123c9118b79f594f6d34619f42a28d7c7b22a33979d6da9019444c74c137558e193993ffba64c86e9c7cee5608b0e80f1e60a0b3847b24cbf1a64f5e07b8f6c02ece8c3d89b378f7141fb25e7a85af356b936cbec07896f2ac1265fa0e35eb994e5427b2d0ab651abb95898689c66ef8699413a7008f9ce8621aeec0486e58dcda8d88233e4ac34a32f87499ad13615800bc72f07f07604c7b2e1da034a4a3c11fb36c0eeb07751620020cd44af016d18641e0a314afc82909a0c87a503db8d6ff9a89c659fa3659b3cdc197c9222b4e8e7be7fd0fe8055687aca6e2bf7023e5aaa902573cc6720d10cbe1135a7db9722cebb49a1663a09c39b0954404b5bf3f638978c4b527fb984d185eb33b061f9180f364204fcbf9387201fa7867d76e21ff4a1d1db19205eba0cc786898640f47f6b428fbda64e224b9d140a86d0e42a4640bd140a92aade1b689f901dac97b7e40c064cbc48498cc141d02e73392ca9d0401ded57ec4e60e5fae896ec9382ebcef250301bbd1c7ba5c4becae4c1e4368683d7750c0a6a055ebb3126b17999ac4de7cbcc1ac86278029fdfcd79097ec43c71bd020347a1fac067c807d45fc801b6f90447ae600a0436f73bae6ca878c37241a30d6a05789a85affc51b3e35866856f2c12d8e24e6802dc4a156bc61938c9cd5045a53728f91c01d13ca2abe03741825448388e15bf041d132c42b1a12427d4b1f3bebffd580535b64b532b08639b06ee450e0c63864b8d9431637fb10e4a61c70433d957a4d6e2037b3d520f4732c8c5e60bf6f7203b93daf82a43bc5bae8f5adbd2a7a6777905bf315167a4ad9677607793bad50a1f73b7e153d6637941b35e7ff7207b9b9beadf27600371874e1d67f9ba27fd59ec7fa765c1023c914d0116b8c10b3c7cfb5dff7d8badb3d4e3cc2e1fa0ebce807bc68ca25da669658962edb2fb2f2e4ef3c13878a775af60b91bdb443779f7f74dbcd6a7350a738180354fb52f94bb12e7dfe75b427ebcd475d46c7dddd992c12f6813283e38a46b44c39117ae752a5ed7e84e040b8a7765734b94aabe33d9e0acecfd738f63d33db18d86daab28bd618a59f0ec2331a5d30f8621ac4b59781f0097d5ab7c1e6b856a97c1ec02b711b9ab47c1ae6ca42462224b9496cee314d2ca917b2e175a66fba534672c6e407a8b6b88731c4f281746b0e929e02de1222d026b6dc01b9dc9962b9e009406ed8f491ec4756fb5806c19c45a00cef800bc7ecf60c84fb179f673f25a515ccd1cae2badfc3f90861f04573a6e23c46737f1469e1873bf9c3d25131d3e6d06a449a371994b0008d75947bc47bab2f1ee08164779ecba5039be223f9f399bf71af888e6571a26f7ee6b3bb1bb0447ef6a506d935c0019bdbc3c40360d4b45c8241cccf88fd41458c77b77f292c8999f02ef6ac0a3502530a851ee55abd45a5a7c6f2fda802326fa5f5bd1b8f57deaeb8889f94799fc22c650d54930d8d91d90e49a4637b84c6e086ed26383be64b1478d22f7f87716ec84dedffe9be43af6420bff39520f413c40c40ad9ea89ea7ee345b948f20c3f2ff584a131a3c43edc50c001a726939f3570b32c7059f860adb793a176259586614fdcd9c0111c24541c645e2baf99684f0b86d65a54e468e4b0b7b56c4a96d5404e1478e1b89fea35b055d3643443bb3897d6bb64979b6a13734a67bac96a34b3d6afc9614ed36cd6f5288e992e6b8092eada8815b2981e6c0a64bb4f92a48ba13c40c3659ff69a7aaf6947614e218c63432d41e7f9aba162f5e315584389a48b92292a2835ab986c029bb815c3a468e45c0afbf80eb4386ec92cf7ed9403e257ce0723d9e6860f69891fa75578da4b11a9479241f8e37a45cb0a624db15aa0507b5f4ae1af65399d14100b0b4b7b7d422c6fb9c40a6dd8b2cbee8624e95ab5631b2a92a5a7b859fbe6a16dd3abaef6964eeb67831c578d1445352ce0c5124e529304dd5888949789640a9c3e586780e62ef5db20b9a54d291d821ddeb47c85ee5d030c274e47f38c3f3ccd92ad96f652412eaabb38ae68a47e7280f82de36f4b2ce36c07553015ef70ea0ba4500a18ab2110569e1c45c6e8f24c8c67d10897f8747edee0e5c94260ab955f911e43d5558a0c2d39067648f666276791ae514b36cfc7a2e90b002332628e2cc3f27d4089017003fe3cf93ebdab6845a7f2b92594143bbce9803587dd8240539a9ee44d2678a4fb6e4ba6d2a83716cccf9edd2fe157a49d57a7e6d330dee1d619e18dda39ae2d5038e3aef70fdb07df0d35ee9db3bff9bd8fb5d155facb82892744a8932628a5c7510c3a97022ce53ba6d96d4aa8513bc9d25ef0f1b68fc8ecc0b012e13d46469db4d32fc01756288b5c16d6204a8a18abb0d179d7491906deb1949f682791ccc26882b205f07c80303adb526c99f7a72a73a87ab5ca132c2300ef57c288f7a50c020015426430d015a53c3a1e160270fda6373826816d221a2e5609784a1ac42034cf46d4d13e3076e50431d2b7120ba8804c4b8c367d11c20c78d76664c10ea55c47425d514665806680f866d6ff280f707a545a76825e4f83cada6767d60a2b37aed5e482b78017e905ed68536543a18e0b790bc375115fbbeb85ec22f203ccb068cbd36261626990e5f6553a3b311778847a1a9346d7729dfda1d37f1419293876e3700373cd4f953bdfd13c889e60ecf283108022be5c939662a2751a3903905e0d89948ad0098e14d899cff07d6981d5bae7d35c0216e291b239f390e68f031e49897091517ab0f4d8202998b93c250a193c735fc86815dd670271109306fb2ff1b78d355c32542803f45ace8b18251b786280ac7c5abe8fe488d77b033d8ea108c4b513e9f7d4f667ca2943eae083199858c0464b75a1c0349fc57980589cd7b0a84e057eaaaf9b73e54d8ae00e7d6f987775662ae3b8b8df9871a1278a0131b81460bff3b400cb03cf312fab6b5adf556d0ccc60a60cde48853cf7486d39c92f3c5d99a995899c03a17e0d0474a287074f7dc886ac9515221d4250efbadafec74103fcd3a2938d0ac554f26e95c60b09628eb7cbdbc8dbace3da6f5d013b120ce68ae79d263bf003eb5fc93445e7fedc300804a9fbfe4ad8898eb2445e97cc7055a6f622bef9793897df03fdcba4ce1d1353d73e441421d848174f64f1e32c83eae4b2dbdbe409249899ef911f92c6059d276a69112969087401c0df8cb02f7bc68d6a0b1ea4c0f88ee733a201392d123a63c7963c03be3ce4415141f891d04d70391ad148f3021c614b3ccdd8b16b91815da29a8fd9061adc29cfe17d1f0f93c616125c8b43fc0c48b92cedf82a5f86dfcf0708b383032859322e5d74874e40c3d8ac1cc69a4db79e116261c80b9a16da231194dec0815b30a95872fbaccdd55bed7a83a28fd7acaf9aac074023a9a80788274436f235e43ad219a174e88122a627a4f77c9d4653145a6e8f1b6ddba3535cd26424ad0327557a4e8827b435b3cb9156de44028b6ff9ea3e73b4486dbfb7dfcb2762bbe78112b8e9deb9dfc2bb1f9dbb70c520cbbe5541b2d9307b30d55d6d8045f0c2ca98f716d4ad69eb842164930a8f2bc4888f23388d640643a0f121b82f6f304ea5008a6434db51aba39e2816303ec2791a18c9975246ff382f4608af2a41ea8fc6fa0f635c2fa65762f56b162455d120e22654711ba084e0bf531ac726a76ecf7cddd79544fc0ce6189c28b134e107e88c486ee133f89ee03cef3ad618991af5a83ee65c69a7d0ebb78f11a3bb8ac06b407f5709c4007c7448649d4a22330b40a681de802f50c467c7db49ee821d24413fe95c3ea27ed2e142fec042699a307a2da951f43a4f8b2ec52a4584552c82da41cdc36623d92b396e47b3cc74b042b342564bc11a271dbdb39a22ff4ee0cda7bf0a746ef4536ccc2f4217b945ab5073aa2f7d51c70df40733ebf3e58f575a8c68caede4f91b191cdea2ac30fd7ca195f1dc15a90a9167877017c46aa41d8cc0db97fd63a49cdf63a7fd93d2196c7406ca144e4679bed475cf6895aee5eebb7d3d8bd1263e731e227d612d0b578f1518c0cc3dda2442a9d0629b6045613081f40a0f2d9ae5a6dfcdf40b750f5c2d01a336126183b3294b1f3469db626e49addf89de63ceefc0bd44a79d025d47c8c6b8470dae98ba10995464212e651e6db1a32439ac72571007a62bffbfb75817f03db434663c873cf5a64c0bc620a291faea1e11e6ab90f0a024ded45188c6e174390aab410c1d4d25204b8b57546877a586706036d41210519f0bb3ef98e5681db2b79540464dad00c57454492edc97f9ad8c25a507a0c981a4d8554b0fa77e6580dd71e07652b051f52e27a9d325be30991fb5899614a625398d43a25748958672507163cf44c1bb29278a93a3e63247071ffce66b1013801bdbebd813a42d2d03b8701c6b40f2869243956f3412d9af7016ec34184aa665c73cf4643f49f70d83f64b2dacac7c1602f5580d120506d07218dc94b85adcdd6c7dd9542496a90642263f70712d6c817a70927ee30dbafb9cee3905676b6909c34d9156bee0933ae848cf22c0f91e0e3b4a0f0a6b9547eaeb8e5104c1ae428cf0e4e501d62fce70641296b8aa9828877480130026487b52e167de61fffa76d1bae69d40180b032643296212deef3eddad5a9c42185925de586180f2e6bea1101890a7de091825acd52339a230501a6c8c6cca7966dc43cba8478060112a0a7831466d3ac5312bc8cc83f1626a29ecd0075db629c7ab47ee4221a47934b635df9b51930c366f2202e0329421417d74e11cab9541010c3c0c76d8e1cb924cecd0482afde7608b2d09b95cb38c503857322f18bde1043d93646e216de907479e1ddae18d6d4dbdf3816d265ef385a226a0dc03da191072ccec9c78562716fac7592d8922096311c7c048be53958ca08a4022115444cfc09f7919db15708c48b05e5d2d2830c73725ad9ac66b41d0ad757ec4e695e56c9564ed953346ead566280f3fab433a596b6d649916846c829135355e274c5d83f04985eac92db74844876c1edf21e5ec862e0a556b218d3d46b1731a07abc222beae88c4e3ea5d041cd1082b72a76dc54e3a40b8fd9d66f59a070ee6cb4ba2064ddefa28e726b87d512d6a42d2edf2d8f5635617da749f68a824a07bef4a9b44c3aea9fa8f1d524e0ab122d07d84808f2bcfdfea8624a28796fc94fe3d09348335a2db5b583e91c7e80bdbaa2ec30a370a77d30c82a057d473184a880d1f847cb6b07f1f33f5f006a19d9b2ff193c5dd5ed4ad6f6f3cde6b69252e16f97867d13d41a5c3a764829e60b496e9a2776bf7964eca5b88363f9feeba6a3918100a0aa8ce35692b2f9a456938cd614b510d5025ccc8a6fa09d2a8d746dbd958cce17ec1bb8f996bf5ca0d1bb1232be92e0c792a014e3d410c61db09732efae7bf0d8a54623b31fffe20652c674248e68ef2acb8e35aa0e84c934917619b818fd6897f9391c285de896708d6654036cb92a253260f740db9cffae03b52068401df07f29d06248ecc13e4989a8831450ec549bedbe9773c35ad72e1056e15bc5af5f4e49cc9fb43ff78689aace7a61fc13b24e56131dd8a694c3ce333f3cd2183ded4c3d9d31bb2a9b3d49a0dafbb6810d57bdbd17c512dacef0bd95caddde8908f301cc34821eed0cf0ea34d38e211ce0085930e70baf8ccaa357c27cc20b2febe9f44465ad06174d54e5a3073fe50b07d0ea1bebda1a2d2ade688709d8bc9e7b376501185cd66172f865f6d651994aedee208afe22d56b1164be199426468e01ee0428e5212e997a6d7166abb42bf33906f6d1e26fd8c0689e356323c72910767cc01dddd9615ca5053bacc704fc64384be914285c406324702b9c16553c042665cd1cb0c647f7b02494fa98aa2932a5713e3a1c52878b1dcfd95bbf98feb8f0e54c54569076ed29d0308cf0f7afe677d10e6391ca96be92b6a0e889761c5873ce2b16543dc9bc6b1e0a7f3119c3079954172a826f9079ae2c236c52b2355cdac0ce6a62f48b0ae1142b8256a2319b2ae8447dda1e10b8ab95a8923c48c9759a37b30a39984ea8cb38a882483b5f2136508d9ac558a659c07b6e95603080eedd1c12bedbc0e18ccf08544f99f18f10d1e98fa3f764802550341031edc40f53579ef703958ec73d39d8bdf904b684d51c1fc2a525a079dcee86d323130c545fe9873f85d681e7a7db3e9b355ecf293b57ca0afcdc0eca7b8250798ad73a7ae0090c96770acd4ec3b90da6c72e38b05513df4d9aea280c7f78520a84a0d400674b5367456a37e2e5fc3e15d639168841bcbbcc1a2b656fda385c75189a2bac7f13a1134c8bb4df1f86a0963d6ef632ac22262a4831441979ca1e078513ca3dbbc0301e73425bf306ae29f887334161d93b22663a5aa1446f4859931cda5e1fe70394b14022633284509521fc950ffa3361f2f1e823a4196191c9b7bff89378cebfa1d2740fdf00c17f69211e32788d569081b41b5e5675cbb3d44142e730ddce3abcbd1503b45fee59670ee16b50c90a59f2a81a61aafd14ffb5e66c62a7bb2d34b4bb7c7636171a6ac9da63affc76c4c52f46456267dd0a83d668a0d39b316ef5fd3496fc54f8f02a37b0be1cbb57e4f83b245928066413ddb17164e6f86e8623a6c0b0402109029a809b04f182e58170f70e52645fc6ced4cdac24bca0d95554d102c75e5eb72a075bf92cbfe73ca2ac3636f76239d01b6cc3ae2372cf0abefd4c9c20916e01463d3fe825a30e6c957f2d832b512b6019c65bf7401193db79cc48065ac9386aac62790f2e6ef998eb99b4c042ee7e48fe8c0361d7478a6f4c28e527febdfbe71ec62590dbd372e7e15d1ff41107301ce1deeb6f29290da075b39d65ef17fb6d7db75ec94edf8f03a64ead461da86b96edeb9cbe497105f2e700ebe1e7679a330cde68c50769d3e58b6ad8429ecb590eb7d271ad02d5b82ceebaec0eb63c8063c80567df9b64719ae977a6fedeb3d50f4018b0af8fb22ef41b8bd2e008ee8ea3c531e440fe76da5a98545a5c02e5fee7feaf9f17d5cd550c303d11da26e99549b9cfdbcf3ea03192834ac01c1cf5e54c984e2e8517ebab552517ece1fef8e938967f42c3debaa00cd2309dc799deb72f1134cb108ca23920037304c725bc1564a02b59cb1c31b08ebd5e2efd474b9d74e147c96f272e27c8373551b953296a69254ef062546ba9bce5dfcd5cc2f5a42df8b7e34502874dd8bd4ef4e12a1c3cb0afa7acad375b45d65b35da04175e7bd679cb8955be3e1b610f5bcf5a7d9f8f2fb50d140a753e7062aca1d2c21116d2df3c0720aca4ca553dcd62a60d40c57b22bd468c02fbb5eebe3fbe2bee502f138df297123ed4996e6548594cda5456cc9fdb99b6e421b35a8a2a4197bcde0cbec11e7fdc505aa91202402df732b734f3dc72cb4cb004a30355b9f19af94357c8dc21a2179a9dad4069589152412bed43af6ed11aaa7984faaa14c7141307f26732b5546f32937c5b2327ac53fc190c445489de1c30d45843d0471ac3a8858873dd1958f2ec1000583c15c5afba1b2f64563e7fa5a5b1dffb7839260836e90025ceb0c9614501fc1cb36e76818a1f371bf4fe5ddfc614bab761f94140f973f2fa13e347fbcb505b7c51c6a5082a42cb5131f99347c15c6745a67ee69a595cad405a516ded66889e6ba4056a2966a374cccf8cf22bb04d92b48d49745ddf4ccf001c9ac9a8fd27e10fcf89a8f3d68dad8d7a5ae9fc43f833b39e1f442f43d4c3561fc6be5c3450c4ae9ebe9b37ec68ca43f293b2f3f183cf032707173477142f802d6922ae17c719fb40773091c2f312993b30bbef1de04a05828a74b07eddc5b2523f146245c8e84af0b72abe589fdacfe58187688435447e126dfec6642cc74cdc00a50eae54603e353acfc5a346c2647867cc44b7a19bd55ef39e3fc682751967094089eba00d40147960f2e23055700cfcd57f2564727126a0e431e47e78f8a7e3191a2d562e9b4848d761b92004e247cca5e8d93bfed05340f8a081ffffd66dc6afa37b062b40d78a54e5a0ce53cce15a541c25544ccdd76a3396cc315c3ff4e15c4f5e8525c3b5428932e4901290376dae2583c3b761366c4c62173c0ea85a59f88a0802075664b54d712a58d0fd873ac00911a87067899119320d9f2b8f534520b3ec9a084777782630c991680acc8b6d47072552dc72f2c7093534c01264a7ee47456170784e0b3ad0613c048faa77a13dad106d80d7e6944b11f130a8958c275b49e85021bccfceea69330d629127fa99f7515eacf08e53deeafcf4244d34652fdf5790f1ffc02922e163f9493d15e4deb39b70797d4faed2d87cc61139e5dae897368fafbec9a07cee88dda40247cf27341dd82341755b94d17c07549c84eb1700a0c3a3290f0ad7552511247595fbda58dc61092a95d0c00d8bb6e447067757ad9299e100dfff9da74a2ed2e651e6e2cdda2659a68d73c1cefc72eadc9850cb256a86c75718dd10974de84f535c9db89963aa59edb3db5d696603fff404cf5ee31689de64b1a24e5daf12698c40cbcf1b026052a6e59af2f7dd7a79538ba661df674213485e43a6eada3f6bcac857b6abab799152d73f140f254a63c2495796e94c84b06934bde2ac35d8662584d6c91b83632324c9938fff371965d7e48db0ba1d0284f5ae4904cc552da7e166bdf85f0095af8def5e388b7cd6eb6c6e1186bf12566c358a74907462fbedd3957863abb90443562e1f7daccb15ce3999c04ecee4fb47d225af542a34da2bdbf5014188399d5b0568852f9b6c341ba1a0a7f6195e8614c9e453de5e1c7f667085528b1526244d540e02110f1a86168a53208262979df0eded14ffbbede16c3380630440e6642020a8376eaf15c8dffc64a3676adf54e37ca12487cf58a13866fa07d8461563efb4a3cb94b170d72dca648a934f8065c436c4f4ffb8fd15ab4a4420054ada2f4a9fb3ba15c8e90ffee300af4b7fc6bff345200a6b505082091bbadc9b826408f0dcc9cd6afd880899a13c9ce6b95a1743b88ffee0acdadd0ab8d0440ad4bc5049285bd28ff3ef0b3892a3d2a9a0c23b94cc1d7491de50872b3d4f47cd62ae97a5c0a0ed4d9b01b66af0862d04004a182fe66e1adcf0da206ed4a7db83dbc80baf24f0f187cb8532463eb74a58082d713027555d3a9d621ace12f9063f25555d0b599cb02c7e4c711af9fbf98cb7e7e3ed30d8f48922ce5470e120cd13447974e3382337c0ab58837f79917b6495274d14d56e2b565a8a11478ab4a53479dbb680fc9f8bebf8aef0fc01d477cccc36ee4cd73598660eb755a7b60939da0775751c7a688e1b7d9e0df58132ae00d6dfe5404224a01d99f423684becd766645ed6512782a7c99feb9340a39f03102d552abc9b39fcaa029419b32886173462514d6364a0184a8763e7983799223a5b90ecee2457b4a43d547c210742c2abecd78279a92486f63b533b10a4b78cfa731edcf58733ea46d5e22e45ee0571817dc20bc26f4d5defeac01031b3bc9fc8621e0c1d22a7c27d3d5a7a953b4ec583fb212302e38c08e8a27aaba1bb202eba9eea04268c873819a95f30068cf166353159519768ab6df56be8280b8a0be94376ccca9edc97458bc1ae1a13839531fc47faa71f0037a463d6c52f3641ae199afc8b364ecbff481a84e40cc08310c1c0724309059342568d1c87214dc6ef5ecdfa7db6500ae260750db09abf1295a3a1dc4263b1903efc2c5b25306d3b15a249fd3e2f1b05796187532247ba330a4a71bef9a656724bae28d7ec0aac70b004512dfcde5935908c3f135a34a7407b1db167d7f746e337e4af45a0ae5b55da1fc995e063b75a2a4ac7d4b003216a87e4e980cb7a9c53e8ad0607407c1b5d4d936ed517139b511cb1f472b94061629301ebe2f009e99ea1e066a9cd6bff1bb082647235e7a7a1b367e722a9ab32f45db139a29b51ef9fbf9b81173acf40c1eaa49746327ad2a9221d15c9d149479b641412ab251d05e9d248acc224594b1141ae1bea9f2ad4db7dc78bafe12c7d2b9f590129f9bb992b585e6a8dc0c549e436cf577766daf3d93b9fd6f9e9cf4eff6c5ae7db3d37cdd96a9c6f776677e7d33c9bddf9e99d4dff7cdae1f93e894c40eed1ae3d3ebaa0e3f682be14cad48d8621666243b79be67d137f2dfb1494bead4283f54fa99bd00251263efd2b1c1c4ae9895db2513eac86fd04a0b23d802d2e13b8c67206d430ce0074c67980c6780aa44116f0aa55f00ba209f03f77119531947ffd5fe8dcfc269f8291bf5dddc978a37ab3b1bb3a3475eb48163b16481f4d645abc2110f5638465543a6eb6caa3c5b109175de5c08595410bd6ba1fb4d495bd1dc4cb2f688b3dd32bbb0eef0dfa217814494f58ba6b942412d55ad0b00819eb9077f28c862c2665662a104383b462db19b5372c802d3aef8ca3a5fdba967816d6742d8e77068945658277a63ff00f8487c29c7eb5b1ad5507ed70d34c729ca529a3d96792068e94539e27f06109c4a67e7ba6cc28444312ba215aa36ebe2a21e9dfac70ada1ab62c2b1f23c4afd3191a4eb1d8ecd07a7c2e532515cd2cfd1e438805577309d5991d1d70da91abd3b26622b562e803ad39458050705cbac44bea8ac67c9bc40ac986d22d60f30aac4455f5a666724094f6954d43c0ed844f7bddbd88f769e9f6223de5e1065db48422e1ec2da7e28bee55641d242dca92f93152d0daf49e35ce6178e1a7d1584595512136e12565f281d04cad02b5a4d6c6242f63c6fc77dd8c26a1703cfb7096ce501b9d9081ee664001bdbd28a041a37545183eb57a7ff8b55aed7a55590d85f7eae50107caeb859e667d07305fddf9b44de8719950ba5a275063dcb15ba3cd333977ad398064c902b1294343582c97494abb882c1c5e28a2075b16fad6a7b2de00131b340f19990e994046b965c72f41f94382bd4644f6eed8494672d510ae6af1c03247dd7a5eab47377170a4c99a8a6e3a578666db6088eea6f47827676e66641d58ca01dad402a5f06f0ebc6e3d3f50de87cd5caeba3423c8e920a37368c712e0235230565eb51be06a58aca038560f7f34bb2b6bbc97618366241c3739611471e545481366dbc8fe8e2dabd0fb288f1ef078a31b5a0791d81914358004c4dcb0c7159b781710446e0f172f20764f8e5c390cc03ef0686a2c897de0cc194d70396ccff69946804561e3432ea812e12825bb260af00af6444d511331c7b1e9f6454c220335df6c5884b069f13502d0e78adc492c3764544b0bf76aa8234962572c7b6960ba3abb97bba6b86150c43f9152531250452d8766f54e230cd62bdff14dbf4353f62aeeed82a4074bf9ef51839fee6354010a94affed4ebbf01be316614eaf401c1f30bfb5415cb098df61c567e0188c44e981a2de0866e611920e86963d1caa944e21dca1a005b5ac145e9e556e383597bf2f0a36588301f8bf072102a6172b819d65b9134d14f97634e3065fdacb9d5134b54b58470ce12540282b1d4b1cc0fc83e4c66f0e89b60aa4f941ad97c7e5ceb9a9bf5b623e9de8a1eb3b8aefb39c5e480840643b844769e1c1618190b14866971504cd8970fac5592486e38557a4a044665292d44bfac56b8b91698a6da0e546749f7c6fc6edf5eb69fbe4cc744043751318718e78f6ef5bdb99f67adf59e822a77ecad7c9dc8c8b11cc9c702bd2734007531cf7e3f8f01eb5dbbecc41ba611dc80651229ecec67e2e686d6a3aeb4442e63c4593ddd5f1e2b0da56eac50e61bb6aea5430a65401fefb62f4cb44cea430d5c491ce5068ec3738b2ea4f6173d2246b2f68feea56d2dbb9cd3aa99ea2f9e9d6cd27b33d890606e8354f44f186f0ccc4e8c56279ae08a83a5868d18140e1b7bf911e6942625d030467e4500c027d9406556994e0b30ae676486d1f587b24b854450a8b0a53ac0b54aa4d37509ff1459942191ff03b49a5c43d55a0618d20e13ad14e56e3048d140f1ec098eb10b39a8d2a65124adfd6609891387e722b3b1054a0ad5390fa26d7d06ba62132d55da5da7744b9d9834d41971b192260fe4283bf1dc011088e73550ca37f4b07533d123ffb56e1969c31f5321539d316305a5625d0026653180ad4252d79d33c4b2a5a3ddc1408155f3fdc0698bf09ca2d71dd61261d596c18d8b1cda6d0d2af6cc0972cf9a09427e8fb32e4e897da040d5a0873c9846dd86054a0186b92c172c0e25b2a8cd075f07c645d371947ceff939128a626cc693a700c7814513820c1910813fcba056c62833c6c0903f2c0dc76c8d287b38cf1a38771f720d3deea0b11eb23de7e300b01fad92bb2cab9e75d2abe8a201e3e1919f053135e282811013812f7e3a6a1d34965a5ae2c84928b6e44670887343d7fb6e4b40670af3ab214f4b6ccd852520efed4e87650eede6bb6316ddaf2aca9d9aa028fed7b62bf76514b3841ea190a53ffe7ebbed5be7f0d3e43385475ca17a4312136c062d65cf0cef55cf8a399b843872b557aad204ee86b6419385863853b9452bdf29cb4ce5afa43f35d9f049dd83830747ae54edaafa7a317cbbc2920fd56c48c5e0c959cb49d0ae8afab203ab60b8f9ab9b3af31c7c12e28b975110d028286284da057c1e649c1c347fc810d657010680ee22202dec9873325d71b6590c12c240e77df9a6a3ea56ca0f6b8ff19fd209c438ea9d1533ba692e7f701819999213b94e01bb6457e13cb2601e159c2b9ff24841eb1aab7c34ede8e999eb76bba45facf11e77ab95819683dc30e0b11e5ef13d64214aea4ad16eed5cc14c82a2fcb74a37414fbb4037a5cb925bb1c20069d6f26361de7264a940ee7f886443b34c62a86995c25361e488bd0f61d6a13ed044d4112d43e2769f6bf8b460f98e2b4e61a0cf792853a3272da6d25437b1d3df5994d09e584a19ef60c814232aea22a144becb55cae7b1b8d742ee1898d4fcc69598fb17fed3311cba56febd12ab3a8f499b1e2e32c8fb246cb0c4fb86ab71e755723df62ee64b7bcf4f900e0ef5fc269ae48531ac5b7b56b9b7a3d82804c0f43ef787ce39545983a13ff10dce6fac1919a68ec496d7e6aaffdaa77c458a8c45b52bcb52b73d05d4dcc3268e02aa544b589a21e8b5863a30dac251a54c55b3685a6fb3f30e5b491ebbf69e7506553ab9b8d04f54b4ac78a54944e9b72693cad650e37d52e4e1e5f36e3b83ea41bc81499710bd6beb0d450c1298e58411cccf331e2b325a9fe1d2abb1d970b4eb36050863046b665f1568b6ac0685e0dbd204eb62ec793780ffbe259f8daa7fd1a25570383b0ca01b6240b6cf7163dea40233f5e02be874c9043d1f5a283a0d7126069348eb9ec5a0d8152c44fd66af8ac13de5c0078a4bd870c7a2615bb0194f3f8463f6846507d374640010fd3cc6d97fe497f5e0701d398ddad64a1b4bfdd7f05dff5d438eb47231118780d488c7ed609cb8f3a553a799593e085188dcec18b20edaa6e83c3f02d08cf5bae97548d5fbf4f0e89bfa67a58df54a6742f25a85d3043b1c2db38f13bd5f111ce3a3e8c21ae3468f52d2e5e878c4cd0f4024dd2cf983eb69debef3fb42c4c7fa6355231c35ea187aaba94377980e801c775f663e04208dbc172aa7760ab488d5e7c0d7bebc7f5615df43f3967b93221834cae9a4cdef8132fd12c02e4cb422b38d4e2a9398080994d54ca4151dababb8ded5bf64d6f2bb7c1a90970f40cb97ee3f0ad416666053f6732a1b8616dd46acee147e8f7ea1c2c0157b8c6fd9341de78b6a1dc7509748bda15fe533de3f7c442c74453211616bd12b840fd9bb15c67b5a30b38d58e42b0248402fce0c09a6fe6e119133cdeca6dc64eba9938e54b110a8e0d4f8123b1aa9bb8df05e0f48462c24330c172ab1c6474bd01b44f8343e1774c4c9d64438ecaaa5ab853124dac30de8357b45ef080b51c9ba114389c0dae8642f336b0bfd912bc592f08a450ebe34a157e877e0ae0dfe081d3a07397d30e036c314b3af262803714d822dea6e26d2045f6ef5b8fff606dbcafa551f697258ba03a345a84adaf95e54ae8efe3065fe740e2b0e848f30783a45845ac23e535405fd8d18b4db323b2e3da1119f4c5291340223988902ec96303e7bf741ee7b5325572a828d398a1f9df7d8bb9bfcb3f41cdaa84b2ae024e92430669db50230811231267787c2b6d49484544ea610c1a97172889bbb205e56207b620b00e12b905cbf2b7c5431eeb637e7d73641f098fdef0a040c490d39677cf24927a297f49547f14c75fc93cbf0b0f62e155f34636e27e1ce63077f06ea33fe8f55729336a662c2f84eb58b58539610e45703820a8b661f1626490301a1093df739b1546bf112ab5db78a47d1bf7d6a3c288abd3a5fdd46bb1ef510fcefb6b112c1eb41f1aafbc393fe340bf5006d18ac9f0b41efc7039b556c36339b010d235c285d5798d011cad41511f90c6a59f0422eb7da9d5d5597db2a9786b795a6220cadd38707826d96f67f7c1e1952a308edc570212cc3320a8d74d6baa6bb185df52993047c04006cff1b91f4928591c2c5eda9783b9914ecd3b561fec9e4ae78563ad02f260719daa7d8c77f75d0ea42c8e61a3bba138a488c812a1f0bb63b0928c56d443fa9875aa769e8345fde419bdddbc242f3591b5bd0f6f78150c9bd27afc688ce8dd904bd4db47517753508e6de6fe81090faa31918b65b1ab1e680ff674c588b1b473587a6cb554ec76221137e18fb41caa0671d6e5face9354306f53c52b7d1dd01ee29c3cb1ce6e0cfbaa3b92e6c6280c04703a07f36ed5a375d67b34b94c67a0b5d25818856334eeb5b9f0e65914848f33c9957e69e404d96b55c0fd0d57130ed243a90bc5d48e0047107f184e19ea0a80170efcaefc80858dfd28c5ea9db1159313f3c17e58568e142875f6dce35fe12add1e0df965d0f9bdf6b62fda83b13f0c194aae7e3744ab0944141ee66a7182656d85a1af3a90762a47e5e0638d37f90160f5fa97fab38dd4c63db2f63c845f271c04574c9aa4f59982b414aa97aff8834a4dee5b2e4403505b2779cbfd9f6127957a6d5b29c1c036957282bc087eb08f1900a0f545be1fc08c93f07bfcffb789f14c4a60c386de0d7e21fd0811d78e420c8bb03a64eda00f6ded300054d65d62bb29f0a6470577388e1f37122c499d586c89d2122683c36651f7a6c1c133ad71f1e45dd3620b5bf06e7f01dd4af0140f747ff940a4cd5a0c83e4c7a1540371479f8a386f126a302b27d14e0154ea2be0cc47d2515b945d059f81e38c39cee3baebebd2c86f0d10fee441186e130230a67b50ea9973a7c5a1f009a35554c88defff99b7c63d48ba16b371fc403ccfd31f3c589b5af5729ce12d6d22771fcb7836e85cf602651a76ada45370a3efc4c31d256840832d68b97da852435f4ea2a88d9b1ac32ef66158bf3e33d72bb8340e332ab3f609d90a3856679d95ff8446e2b11678a5912c772926a7aa698a45442bb80bdae079288bd64c5994c1c9cc7ed6f5fa0f4a935162e742b766be5395bf85da0032a182b02116048906ccb22c738611394a09d39f263be3c923f520a4823242751703f5755618aa4b58b2a84ea05e459f9cefc8acdba40158a698e9f048aaac749194ea1b35ed0ad0b681442304edd02bc8fc34032675e242f662d8800150a4feaceb79a1f2789830f0afc84d10242baa9e66f20167f4872d647562482f4b7cb2029f89195ccbe0e54a88c6596cfb956a546efe4cf121aac3e1d5380200de9adc646559729a142e9cbc98d9c91a8ebe400628617cff71a92ab8c998b99bdc34aefb7cb003f0e462facc5498aa8acc5570d6e059e169f149bfe84bc1b224a819d4ea29708a1b71fc9226b8e89708cac510993fd3a04011b5570b161f765a25b5571dfa21d1c1d52bda527b4538f8af305a7f6bc20c94d8e405b4b9553c68c06c410b0b3a438d410b0bb45a7bcf2cf5d05b207f0297bf96668f62f8c0589d60797de1fc2f5633d89c1d21db2a2c04ea1c5445daf793fa6448df45b9792a5c0a05ee1da191eb4167a30b0c9303eace42945c30542a6e0e192ef6a0159a997af4cd3acfc146f921519553dab26e6ffecff6328bfa4b6c05e92b1b8465fd3b895f75e8874ccfe7136d8ec64c261ceddfd495e2a25f13a9d0f24ac9184a947ac4eed213f1d6c4706969691329a594325309f7082f096227ab34f835fa2aa970cc74d005a736d263dd13febbd24df49a9354bdea9cf05896050a27ba1922c2ea98050a9859a549d22f90bbd942a4e3d7bc05764bfc3cced837a67f368441a693aa4a839f4710f6d804c7aaded8279d509a189b903e385695061fd9f74d9958c76f923e1dbf4c4cc68754d51bb105d6b14cc7f193a9f8aa0d1e30568d216c6b1f3fb863be3459b2f6f089629b9a75f5d5dccd9c237b6c7135da0307dbd4acfe32b50eeba23491d6459d17a577b4eba2f2e3d7e845e91e9d7ae3a23b163b6c0a100c74a670e17c16bcdc052286d0c2f9ee1555602c1c1e46455c7005e239c285c3c3c6da2187808b1ba87078182571f90e29001d81e2f0b00dd9e17ea1b3821487879108c66e370e63aed2d8d78117467c707ab03cd86b81a0e99a1d1af93df4db31b5b794838b493cc079a4628fb4cd2df10e6793c36ab14d898d2b9560571aae2b0de9b8ed6d2f0b8dc84599362d3d0bd254da4a63f594feedf103b1e1a58d0c37df3884bd6d6e4822639bd547cf5219704abfd6ce7b493f0f5ab0d6225fb561ea9acf0c56eb4353f574089a0a41449f4289730a2282e89f06b7e7b87f5d0e4ff757c857c5aef5f3584264595313721cb8f7378e5fc2c8b679836e105605e1d4121bb05dc3287e61184e718c48c78f9f5cd4a84bd9b67b57b6f62c9cc2273ee1e7b8bdc7f14fd576f1e9055b9366d72ff77775cd1cfda660632738899aeaeae9bc289d4f20c50f5a74fc58243249ddc4a7b5714ff835d3f6b66fe4b7e0759ac85b258026008d34711d348108ba89511713ef186c735b1f2caa9b9c537cc2fa7d7c62b13485c15e2f6cfe43d99acc537457f613e9c1d8b3cdb163aed2689576c313c622c24abf2ffdbe98199937d5e8c00fa6441ab7addbe9765c1de73199d2d62d3f53ea6a9daeb3ee48d2ed743bdd0e0f592111a00ff84578864864533a27dd83ff7d20c8ad68263a4743462b6ea775cbf36c9d274afa66be999611ccabcc9c969f854f2b7c529564427c6879a14d604ed4534f13a59fd21659b44ed798a22dd776cdf0d1cecbcb4b7ab6ce1a1de79951cdf8c00a62263d5ba709edbe136697b228c59aa4afd6e94293485d2dd485569a139f5c7e62e9194e7a978a31fc792d57ebe542bf0ffdbe8fec34afc9090b89b8a89214e017a21169da42bb7406ad3b5a2438134d992204a2d581e7ce4da175b6d0f3433bcec3790b05e768351ae214cd4456623af00167455827121f9fd0c5b9a9e7234da8873f56a53191a0c9091b0d519202f6426b70b175569afb222b5b3402add1719e1a35bad4d3bed49e26564b27885ade3fa580bd943851cbfb629d892f149f5c2d232d2a586710b646ea6ab94ce8f991a1abeb5c49d096cb85b68e9c3be879ba5cad23e78e6ba70cd7e97ac136c5d6e972b58e9c3baeef3bce1313433eff077dc02e4e14b402ce4433d119274af29089bae33ee7e112b547123585fb261ea2f8f40a61612a453ddd77a5ba54494f9223270a8c541fa355abde7c2d551747fa45998cd4d2e403eb0ce22cfd9462284e95c0a8272b3ebd94453d5d54a989e80c27a520b4540535a1b1163e9db7dc71a12f58ea6ab9bef4274d4742f4fb3332288c5a684b880a455114457550b4e7d583a23d4cb4501713ad23e70e135ffa7d29da4ac1b4ee10cdf0497486456a6a342464e1d468e503fac0ec7d8a4422d10c44e7d9425b4254288aa228aa83a23daf1e14ed61a285ba98681d397798f8d28f1c9dadb38553218bd58a5d9448a6838a124d11cd700a9c9d436a0afca29e700af4c1a73b6a8d50008a6633d10c66ef4e74f6b3653a59a520d11422fdfe3591a096e0aca6e103382bf9945258690bf08b520cf4c1a95213144cd1baa892145f94c4484b60a4e989824a63a4ea3872bad0173ec1f0a985b684a8501445515407457b5e3d28dac3440b7531d13a72ee30c16a7dddf7759957189e552a90dbb1e33c2fe4b983b64e17da3a72eea02e5712b4e572a1ad23e70e7a9e3baed6e972b58e9c3bae73c7d53a5daed69173c775eeb85aa7cbd53a72eeb8587a68b91928e2fbeac764d7ff429734b1b5d65a6b4933e780d16effd68a2f6631715001808cafda3067ce5b863bb7b41ef66ee7e361cf7b61b4d7f75c3865f28ef4fa9e918a1abd13a74a5fdf6bd51bd1579e45c7a173d2eb774d2aea862e566ff6d7efd27a33fa5a6735e6ab69e6ab19f5545f27515359968b50cb5b5f07515139480f51f59ad1e8f573959ad22accc2a997afaf5bfad4ae7ad3f275566f42cf846c83b145af9fb388a24a5153fa85d257d4f2be9995f4fad9898ad2e92d63f586e5eb6758bd09852cf1796f9617b0804d438319bfa656fc2c38f66fdbb8f8f231d99cc6e98ff3904845d05a9f46d25bf290c211ec85bfc0ea0e25f774f9b51d88394b8df00c918c5c2325c497188568062214947551eee9fb8edb114b041b313172892f3cd23a31c465fa8845fe381adf00774bd167d4d12d29c66e093482612e06c34b9830140a737862ea4d4da914e6f0c460aebd9691c84db29bc27daecc9c06c3a7173ea1ad9e268cd4935792fd94d028cd4a62d493940e462d5941f820ca7e527c6231fd842f19be63f8e8db3606840131ff5e5e5eb811ec1fe78989810d6122c5a72e1dc15424fb31c13cec1fbf8075d12d930f37cc826632318df9541af1678bff3027ff8fc8521012d5cc4fa589e1934bd026cdd295fe19d1480c7aa418be76cab56a8035c21c4ffb986c0d243bcd0b91282146d1f9987e3a9f999fbae3859b524c86aa1119161191664def624f6e0a626a836d8e602fb18bca3f721eb85ddf7f9863ff3be7988bfac7796abc57c375cb9112b5bc2f82dd804345894f64f007f401280b55214f78866808835ade0f5f5d8af65b8334fddc32c707bcc7e0c39470a101eb33b1a6cf643fa2182b22a6e237c59619f58ff3c8bc27d3f9682698889b5ea94989c90953ac54a5dfdf235e92559afb3850e9f74b62d4f2fefd192e9a788cd8a49e6cb4903ca8d03a1f1952860792bd91b8e6c2275627c134c364f31024c3d72dbf0f7353ff2e2896388df3bc902452d3344cff3cafd3c25003b01922ec3c4a6fc94730b0c6a9b9f4af07b8b50efea7039ce159a5c2c1bca554fa172ee4e57fe07084fcf038427ed838ff357ee6359e832e4a7cddb20815253e514b510ba74c3ff8a4a3a8a951917ad22f9d5e1428bba5bea2a2c0295aa55bcfc328ea8efb35780845ed717f86874ed414ee93780893e1610b0f63294e852a33c2308b7abaaf4afb86f34286afbae33e8f9748a59ba294d19b6294bec52b447f5f6c527d8850aba3de809fa24f38e9e2eba24c4d6a696aa29e60a11b222a222ab7c44f0a9126a7494b6a60c6a3c7618ecba8a505268d6de3b8156e893b8d8b641fd8f6c36de374cae50859462ea3961f5ded87be42a738fcd7be8fd3c0b2d4423e623dfe4fd784deac0959587008dad8680f0386b84ddb9ff6ed4f244d9fc8eb449dd7bd90a62e2412eadc72e4d282cbdc63ca36c5197a0018628a6cd28fae9134d9600a527ad3579c12ba038934d940fa988f2183e08cdf038e1d9ff435b4a1447e2ef26b8d1ccdfa05bb5fd007f4017d575e309db32921824d718af4f6bf184e8d6f85740baabacdd983adb617d7fa527cb25f2aedc05d1ced40f8894f42b6147db5ce52be6e96fe10e5a2e90f66a029101fd0f98a64178553ddb3b9bdbab6811cae5dce97eff09d8cdeb247db0a23a46398153f5d7ce796556a6a7bd513fedcf1b63d515319552b933087efdc12772adbe42777899f16368cc13453551afbf5622006999ec91864fa25b9cf86345cab7d42f4af708800048cffe98ab5b6312c26077afe1f976724352ee8961686120331943d86b2671014816cb5fbb2dc17afb517c83dd0d8f93f93a08e38c3a9910c0a430fd63f0bca30fe31ee9d8639a0935b62d1eb87c827d4f18b7c2e2aca4dedb44ab81acbfd97c3a9d2dfb71eac9760256491335942ec8a6d6eafd945d174fc20d04d8940e2952b9734fe488a403357b6c94fd04724037d706a7bbd383c3ee92b89fc01b3f6efbdf776c0f21c3847f9f6ba25dfc9243f6bc0c00453182157df5b8a40a5134c5396712485be25cce108b07f247a96b7610f34b6f7df6b6fc318bcd7dd877efb7bad0ed3a5d27c36fcb187306c64fe511467b784a1c2b95bf2e7363810f4421a8b9a2a91326828fa8bfd03001d7f48e4a6be5b23dd17c8dd146717d4b9a5dde0917a63bb26444e74aba5e836896e5b40edaa37b5db7ff1f3d922cc08338e248cf1f61267a620273bdf483b6c889aa4e3d58d24fa0db4df788543541cae2e49ae2e4dab9473288a7d51a64f56693a0f1558539c6dad6e8e23d8b9ab8458bd11ed466a5d6bd9b4c57c50f61583ea8dae372e314d64826dffde7bb929cb68a222dbfe98bf6ab1b3fdd256559afcb16ef5eb19ef15e66c4b826498e369d072a1ee8ca8462a096a101586cdacd1b5ff78889bbb6b0ff26c7e3e3968b4df0db6bd3625b71411d9db5f7ef29d7bc297e4e70d362702dd7bba97efdc548914832e4f7261563d3da6883d3ee94dcfa76f382686f3139f4c64a90719bb6e2f12896d8a330e9676fdc2a7ff57b2bd2a0d7e5114216b25aa223cb1e8f86b0ef68f7ae375fca709a04c2413c9c4994c5f7ddf7461885cd4d63a02b373511b8c2b094ccf4599729e4186177af844e144d39ad666b825ce648f2db629928982462b9d75d63f2eaabe707b98b1cded5561dac577b0c930275cb104dd12b35ce9df0e3e1ba08d3047a4e496f82b01078e30a7fbd3298b33712602e5f81ff7a3a10973f67f19832f2a1b4001eb27f44a45107cfa0e6468af3b0803ed3d7add4118573a4af4a830677b302b189518f4852ca3cb62699bdeb40e75429d70d5751ee7795c0412af88302a21302b719664eb2f0486a0fe426028fa2f0486e6e763e6207a2fccd1a29d4a8539f955d8ba5e551a9d6d6cc29c4d04da3086ef7b4cd91d7a002a2caa1bae7a1302dfacc1e51dc2b0f510a957b882f7c3fb9c7e909b35ba59615c376f24d1f177dcfc7c3adac318ca9ec9236c91cc0b73f812977bfda13087d39e0bc3fc9ae65905f07bb26f44426cfba42fbda98faf9fe34c67a5c9255ef37a91f80b933847f109ffc8b90b9f5c402d6bfce4307e7294871ce53dfcc5777812eee228ef79f1539c7dfffd28ccc9df12de1508aec0824896c5feba4e537eea54f4fac09007932d9ace7a2386fe3e8b75b9a9512d6b9b924d893883615d14f7e2eca26ebf154625e4a2c2c70fb30ab908245eb92526c52018d52d85dc12660586e24c897ddfcc41a3a29708967767ca2f9cca2b809f0eb619b670ca54c3b883c986d2939e440631dd2f7dcc97bee28ce4d7b24fee60b2617cd39bc820a64bf2c8fcf8a61fbfe290c81e702e697e67b76fe2302a7cc21fc345192ece6e0a6f82ac56b7af9fc4b797299302b03ef44b6eb05b621829dbdc5edb6b835d54e5b8bdc7f12f392bcb3e4bc1366fa01d9bb49817813a175559dd12e95647868b663705fc31a2a08edfc4117071442f52b629ce5ab36eea94f4232986368cbf01b171aaf4f8b9eba26e0eda5eb08e9f27b9a9edb5a55cc906ebf8b5cef612836e5922c5b7b2f59b221918dbd469bdb98f5fc75cbac975fae4a6f87939da3177993a95d24df14ac76250938a12abd4d249458940559c8956b619aeb2e98e2b5b69ee8f9cfb58005b0065bae9ac34f8732f7bfd9833b6c94deecc99ec5f0be110d22ed2c7315c41c71f13e6e4606faf7ae39d292f089fecabb8d5c7e22e803fc05a53a5af6f72e3c75053255234c327fc245256472a283dccf1beb7fcc78599c1667918255b240baa372a9c22bdf6442db7d79bbad54d71b6d2ba38d32bd248c6bc209265b14d7ef2b3de801d8b5e335e6c5314bd3afedefbefbbff1ebf48c915ad74fc305b53e2ac9ecea82950864ff88bd0f18baa7f566c59c72fce702a5cadc4d92c8c61ebf97ee69ac44acf27aa4e7fdd20fa7d57d006dfacbdc575c0472be4a375cbcc47ac1191165b314b1d25192519e9dc12cb2e0a5f72f482859b60c8cd914ec70f72b3ec1b377510dd144d7176f3cd25150f49d357bbfa5e9267fc1a1ee9382412eaac70aa447212c7919b7bbc3b7bacec97fcb1c4b66f6e2f7176c3a5649b2259c72f9289a8045d54c62fba3252ddaf239d116b446474e4a2b8d139da1925b928532639ca7b6e897912bec35dfc0c63d8fa8d1e646cdb4d7166f293d54d6eb6bd3afe0fc706e0859c9a1d3c7aa0a0030034394e30210554ca46851b1f2bb0702a5bc0e1c28f8e73a38400bc90a3f3c6791f18b2846ac4993813819474fc62d0458d1d3fcc0993e4a66e62e2958baa4ba0f4c0e8b02c6c0744e8264c6b6369f1433761764c18d5c9772e0a577123f672ed8e10582cad2f8882cb906d7218d78eebef4ada528f31b6c9f974fb19b0fd9b5d92e47ebafda874fb980625abd17ae3d2fdd41b31c599286ca407ab349e142e1c4618c9a67e6d21fda55f3cced8d7e5f4c420b93e58264d52129e182e411face3b72457a5c11f9ab90475fca15928c8e5ac37014674ad23704bfd37900fb8a5feb28cbd827a510bb8a51da2a2186087d4d4e6c16fda22f877f76c70ea010ca8280b825aead7aa712347cd69ce8220f7154ed93c607bfd56b5bdd5db0fde9cc3a7addeb27205d8647dfb1f977b8ff43ccff33ccff33ccff3649eb73df79c39fe983624088220088238788f430e55d64d96df1e04b9ffde86307ccf7d0d09f03d67b290395459df7e2bfb9637bb6d3638757f7b19eaf6c974b1392e060e86f04d8f34c1ff6c68a261bfe86dd82f62791b42cf429ade831e0c21c9bdf660656ddbb907bd0278dc835cfb4f73db7bdf711cb6f7fedbbec7e0479a4c34e0df5fc3fdd023a0e2080901fe4d821f82fb2112fc4873eb5ef3b8ae69ef867ef08d9f4df8bbaf38979b3069a2e13ef736d8efc820dddbe7c8204bd4d0bdfd20dcdfaf389f09456c73052042bef7fec79501a73ed2849f34d1709f7b13266bb8cf996ab0dd6fffc2a69132fc28cbd8e6d871237ef3bbd6e30f9b8bb536ab5b0bdc506fca6e5f877ad38d36888d860e97bcc1049d1c6e697fd41b7b032f65bb86bdac34f6c724fbe362670b204d73b9b2c3633073db7f1a3826d9e0066ef7bef6dfcd9cc69126192a47f6406323afbe2fdc931d93ecdbcd528a2017bdb72d5224a6ca7e4c80ab55badd158d6e7de8f639308610a3dbb09bc58db1a48b275dccfa17caa18b42d52b01aa946eb274fb2cf506874a52a03efe21d643f5a64ae996343150bfe1b32e57f6bffe5b729723b9b173f8b5e7befa638730e00ce82e8870d183c1afb26dcf7a4cb277af0f8396aab562fcf8b9ffb0eeb66deb48136fafb5c7382c80f6e016430ce92e35d8e6e6f1dec67def718d14fb6bfaedd506ac2117dfb106db1cc568b2cdb2ecf76bea4dc8a5889dffb3e0cb919d9f47bba6254cfa6bd01ec7943fc8f6f54d9934699206fbdad71064894cd6507ffb20f6b50fb204266bd8c81a04e68a6dbfee7eef0f7a7cc8b062048a20cc705c8ad8a6fd502c890f0683c1aacdb8edb6dbeed5362d6cfb44c9514ff651e056d8538c4efe4919a54606fb1cb7b7bdb62cedf34d82b7efb6c1362d2ca80338d5d5208c7120432eed585dd281d6484ec82e4a93c18a8d04034e93d2c15bdebccaa40da20376085d83b80e541a1966b82515dbe7a24cab24ca45e1bc737681c1132aae1d95ca0acf1941f8aa0d9385d5f1bbea56b99aebdb1ff06b88b23628fdd979df16bef667dc58c89f8eb1acf5f16ff651c176e7a23cf24b72cb0fc527fc3e3529ecb5396f25f3569ece3d7d18e8961f0e0bc0a97abe25feb205dbfca874fcde8cfc82806e89cb08836e89b57e6b7f06685b0d0d81c22be12c26dd66380b812e0a2472c3209c025b204bc4c43641950a5409b91f950fc5a9f0f525b9280bb2bc15c8f25620cb5b812c6f05b2bc15c8f256206be5ad2c19f6843390c5a2ea38e4093de636cff7645f77fbd57edd02360d93007ac6c153692137157afc5ad569d54edf3cf4ba87380b0bbc610c7657bfda93ca096042d062dbafd6768c6d0d1f940fca07e583f241f9a07c503e281f940fca07e5baec0d82401a98f70699eccbf90872b11fe46200597cb5defbd65a6badb5b6da5a6dad953415d0cdf8be6f07fb9bedf8aa0d73c7d9b5ff6cad600e25ae37679b75fedb33692aa0730f9312df74316360488f257275ef0bde9cb70d93536aa9913ea827189234a356328dae3d69c5a76b640fba46fe541d1acb9b395a63eca242affdf8e4a2f66b3ffa6834309c6a49699470395a395a398ee43843bd25c5a931c6b9b4a4e40f9f01baa5f6233e33bba5f6223e43e596da6f3e23bba5f6213e23e5cefcdc52fb318653332e7cd25e8b9532aa1a1915c618e3ee668cc9999d5b6affe36621b7d4fe7299d52db5ebe4961ac699dfc72db15b6a2de92db596b4c5898683357e1651dde7cfb3aee58d53f5c71db95e712d664dd3344d9be9dba84ae7040bac6b2c9c6a49ef497b6d6fedb5ff367354a56b63ac25e5b4df38472b8d26a38ac9a86ea93d8f33767e5346d59d00ab34daf308c29651e160755fa3fd74ed3bd2cc4d04d14df2e7923569a5d1f29b38585d7b3347ab6b8f83556f5cbaf6385af54677ed4f80d51bf172b4de70afc9a8bac6911995e93bce7d4551be6ac3ec585dffc7d2abb9fb8b6f8e1de6cded815aea51c3e8d77648d72f924074fddaea0f63b3fc8f6b7351a1d728d1eb904671aaea241775dffabcbc6963292caff2aaebcfab8bd2b92856a8579cb2013faf7b21cdb26b17d2ace9dab6707c65c47110c79be310c7546ea99f8563d92df5dbe8475f20696ed898c6389bae5b7da6833dec2c1ddc385f9b6bde58f087fa257192d52dafce65dd526b0dc066cad8da5fac7334fd665ee18e25ba5c175fb5c162ed4ada9a87ecfad65e9cb5b6719df781214b08148d44a31e1737de72145a6b472d1c0f9f16e32d5dc29cb3cbcb9317f14594f23921c288305a2b4c0233c28c5a052c2a184923e908242bade2564004a9442a1d91c4112a6e0542944c25d39323d2235e4734b1c75b8220089a628e08e26c4b17a150282433b3e2aa98a9315323c4c5f961f13d19e54edd1abfc623e94132451e5b5a5a5a9e2309ca2e475e5e5e5e38b9e2481006060686248123914824126cb4886032996c94d0ca76f4c50d1c3770b4c050cec58db7ac51a3460d1c25cae52bca53791aa3a549c9e32ded0c4c0049208104124c38617602584209259470428e9d59ce01da904503001a0018d13242e775c44ac50140070074ac9088c1855674d4e8a8c9447618353b6a766cad73efe0b1838711b38d07495ec1e6d1834768019b468f4ce4dc3d50e8d143b79010a249196fa943870e1d28a08064c519d9b163c78e145238e20917ead8233ea46c52a92e059d189961a3828d0d1324d296282adca8a0020806b8b3e0909c482c2131b9f171e303b4fc569a9dac82f1090b56480491c13de163051f3e8e907513647284944ce45d785660618515a6e826c8040917b43429f9042c802d581658087374a5a93446f46cbd32618116fd3eb8f3c47352c302252ce8e9f7c152905d99eca0dd042b931d571f5b007df8f0e1a38516442b2e802cb0c0020b2eb8f0d2831fa00b2eb8d0b9807f58ce31d9f96acd015437621dff2753836d6e51a2c040f1bae945e5cdc945c5369f8b32d92dcaf6b349d9a85c54b8cd36a0ed8ae5ec05b71c6a2db05d3bb7711d9b09c1ce7f35a9dd6a79c0b629cef819d29ce6ba2fd49f0eb5263f11d02db9f07bf8f0b3e33aae130169fd91a64b3745b22d3a874dc153ee84db71711bc943e2309ef1b70ffdfbe6632dc7cd663587bd3e218115ddd42a1bf8bfdf9762635fec494cab72943fdbdc5c03c8a8254d30dc8e1fa8b573509ea53ba317b535a9a7fb59701b1869a5b99f6728d4d4d4b04ba5cf29d9d8581f950b0e89ab5c70ec0c9f424f8595558fe9958a218cd1cd1e5a5ddb92a44e6e79b7f47517bbe5ddb6b4d6cdb5a121d8fb6dcb6b7cf49b6f6fb90efa35d3f65088d7dee2f2239e43957551b8814b008c83697bedabb9012b008d347f606c81998e811eba047caab8bcf0e313f1daa5e4918fff69a088e757eec9230eda0c568633871e5a5d9b56db1a456cfb5bbab970706d28abded48baa176512c0f6f6b7b77f476ee4faa8b970ae77546ac04062dd85733dc32eca92162000fe06dcf27e0cb52fe096f72350fb036e793ffbe014e9c7bf3e2c22b05bde29426e43718a44ee40ee006465714a5fc39b48213fb88053224d7665714c5f7a1b4c5f22830421bd8934d9377dc5b1a154224d960412f325d2dbfce4967c4bb758c764e71cbb65f9dadf1365d62b945e974431d285f0a4abd02b15429835d9dbfd2d68bbc2f2f7b72cca7aa3f5bb89d1ef0646bfdb16fdfee7588ee5588e612dccb1360318933ab898b1bf5bb203d595e4a26c4c46886d7d6e595ecf92669d953536dffdf6da6fa94bcbd7d1579c12559c0a610d6fb8c33022b9bd90a4c9b590e61e919b34cb1069d3bdd0854ff7432efc5a53e16f2ead3169eece717b8fe37f6ad6b09014b0e91a69ca10be4e434b66401320481a69a491762dc7409ffc936d5880eeb5d7b84dd724feedf146e66093613ae0d73a1f496f397293257193254d3490def4368c5f2283947e7c131964891a4a3f7e10d30b45512e8874216403619c6cdb73acdfcf3152895d97f020d64d2862eb80b9108810d3977e8be19429c529d745659dabcdec9bb9c4f3995d2f53b6996796d4669945d250718498c8129939ce6e693dddb79f80293ab7ac56a57ba56235031dbd6a629b5bbac5a2cc7e58524ed94599f948bf7fcd8cce2ecacc3afda64e6e0ba5bfbf6d4f2ecacc017d9dae7c84955ba669d3bfa5f506074d524037a9371bb7ac6b7d8e6ca96db9003f2671d0a4f5b96579f996e49e2ed74b96dc5c1d1597b9f9ecdcf3ccb13e246eb2daeca2b4a04d8553a6bf317f7f63e194ccdfdf5ae6765ed56cfbd97cb6d83632429420bab9a5d675cbfb256e51235b3a858559987d7253e3c79e98ec5b9325f32c03ddd3fd4e8a9d5a275b6a6daa834604acdb27f18a33f28aa39fd836667d2e4a9c893725e5da1b2e2ab37c5d004e85be7ad17588db504fa40e085d9fa0e3b71b01b5dc5ab48085e3589173e00290f3b8e9fa6d0d3a7ebbb7ae913b2a8de66100edf78e03789d2847476186aefd57835336ea89fb8ad21ef8b5e4fec3361ad0b5b79aa633a9394fc7b3418e5be5fa53c2134065dc280290ec5a51a2b3c1e203fae9668d32e2afc15aaf4b80b810f27117b54395dbb59226c658d3fcdecb6560eb31d45e79b8617cf9bedd44f594edc673ae40bf6fb1a77dbd6fb75e35d6c86a2d15cc71f6375ef3be371bd83afead672da767d202358d8ec98a2fb6b7e67bc90022ef71bbecbd81b0f86a806c90458d0c32105698008def8a194cdfa0052ee0aaf46c5594a872a40a919d9a5b73354d2362960212663322b219102cd860116c90b1b3151bb2ed91816487bc2841b5474e4a38b2c71e127a369784f4626f489423386d58d95d1123cc28c110cc18028619ab2fcd5095c1eae6d758a1b1d63aeb10c69605e75c738831e619e79c73af34f51f63acb9d63ae39cb3f6b48a31deb88af9f6853999acb57eadb57e7defe69c71ced9d35f062bc638cc1b63196238e77c7366d196e334b63967fedddaba5962ceb0176320f8b47d70d62c3b04922faa6ae076d3f1cd71a4b953b15bf3de5bd35ce7755ee7edaffb78bdb16fb38fd8f637afa9dd420231f50be489cedec762b19045b3847268e32d92a1c66a2ae9b403c88bf6a8aca981a51b07c237105ca36b724d0c088ee9588e8d760b9018109fd81685584270b30001427ac1973f8c3d8c336751e036db358db1b556878a640e77361cc6e40e95a12217639c3f5bfbb5bec63b672bc6a1158bb3d66ed6da7671e526ee3aa7f59c73266bbd25e9edef9a64c71773f7de7befd5bd7253d4eb1686d62ea8652d739b2e63dbcf1ab7e92272d69a97b522b496b5c89ba68bc0d66a59cbfab3e67d596b1faf3a74fc03b50f6bd5745982e1cd3be4cedac756a4e4ab36f2bd60c538ebcf56185ec8d8f63347e69cb5e67595ab957b14724a2eb81b1bd76996d4e376009bc7ed7df9c33638057e858d75dfb06175dcaf0ff25d4fdc7fdc76fc03c330e436b226c72d51b827ebe35475dc5fa15f1b650986579f4415e8f82d4b08de5d857d7bc97d4b5b03de1af0541cfcb53eee8cecc7fdfe931a569811dcde79731875000a6410c5084d4c910204b6020839e0c230b2afcc0523319ef0c6607d778c2fa684ee942d42970a92d1754d91f596cf17e5c3a2300589d31864a0b6181c514d31060af21562505103935d01039609f6ae7b4e0c223218caebb9667bee0861245153e318421022c3d1341780c0458ebe524493d6aa048417be16ed3db4d8904ab696b33b676e5b20b862430cf12caa945365f4fca4137cf881165dd37e0c73b4126cc1c1ecf801123dbf18e6e4115015144cf0420a0d525d7b97ae69bfc7c72578a233656ba9373a8c9e3fe7173df1810b54e8da6f12a87208a8e7673961480fb498e9da87f70a6bc806f6a0899ef37fdc106264efc64acfdf5d9635011132c09aa6695ae5c21c1d0383a7e7a06d72168c1f765942200a104ca9228c1394e089264388f0b8cd81bb2c73dc54c6b1f5d571c08dd5a660480a3488c5931f247d5f2b458a6c95db1cb8475f403142a9b9352e3cb80284c88a550b0884d8ad91088408a53051111d96263f1b092bac4216828110208b050a203e2a5ce114423c1bfc80e9105d15b04f0743382b625e0f866c69abf3a2ca08b493f3228d95a622dd80d0c955a834228298c106e81111ccd0049644103350215bf2c50bfa36433a1bcb70d1bd2e2183654265ae9a5bc3654d2ba1063bd4eb122c761065937a5d8285141c6061042b022280e0aa132651b4ac93629ce0f78da9542a132c89ade0074d0764599dbc7cba75f512b0d861af4b6248e09062e75e97c45e80a38a980c6650943a5bf7ba24b684049e8d7b5d12ab828c153ed54e836e961d3b914509965089c1b68594ed52657b245075d3b6baeff47b9507547a4baf4b7800a57f16dc2c096a6a2cbbae49a2eb32a190a824acf746412d15cd000000000316000020100a87c462d18094a5792cfc14000e729252664e9c4ac45914e428084286186208310818428021a0104d6d0302f3162b8b7c929f430ebd754321d3001880b1fff48d957054b9f3d4ce93d58c1fc783852be50f64a24625428cc6be60e1150ba49931d134404530f4f73b02a06944250386536567e332607d2724233b94b1372182c9eb870f3175e0f05f853687525a2d72c885c540fc4c75fdf3c18e44e87d5ee607850f3420bb0feb58918facdd9f75689c808f771d0b71b5600dea6e6398bf159b1a3a20e3686fc7370ebf8ee1108e8c16be8e66967071a0bacaefa6da037ed61a9f0a303f19f774345b7e6fd286b9fec25c08268bff24557d619a0c45552628eb8217b6a925a1a3539996ca758cdd21529d7ef27c6ccbae9365857c4f32d7e57501a7f02e1e400a2292b687debc8916e25f9921a788bbef9e2d10c3057d1fe81122f54d5309f9a61fc5accd1d4889d6e52f92f8b69022fc3a5574316df329869b3031c926ef182a934a7d5c982e29319819d926e02f06bb7c742691408bea3d42a4a283bda3a3baea2952bcf0e1db9e0139de89405bb74298f3cb4279aa2a6e14c74406f97c04e70e527544466d307e3981955eba52b64b76c1075a67150fe63e3292668e03e696caec4f6013bbdb183bac470c2ca57386c43bc6d45942b225c00a5dfa746364e1033611bf55c40c567a9db05c213824a113784f2d970f4f341f86944d317d21044fc2a20642114cbede5a21617c0a5a6aa67d7a8cfc3c8f5c2d758758b98d01d9fc75db5bfa19c955d5d0fa2ae03d62851980c57a5341a7dfa0d0702a8bd8e187a23fd895caef6814b98eaa09396eb53ea7013a2e37a73fd9bb17b65e55be1cbe16d2ac25b00864b244cc5837da426cfa24fe68070a43d46d4cf72c787ccd8011b36e070723fbe21845c1016279214678bbd44ca074cb6d08f967c27a767c03b85a7258933dac09bc7d40254298392e38f75faa06a63490961f883e53d81b49c7a920ce4f8609e90ae8b46cc4dc58d4caf3196845ea51ca94b7aa3fee893029d0fbf46258b0f79c49f2d75e6a4d8dcb2fc421a145583c8e6e7511a38ab803365852de1accbce3972bcfcde74b45f89a4144b51a879e9eafecf28de3258f307f6f7a4911bee3c1432d458d3f585c4bfbbf32fb201ff61131afaafa9fc35721b396d040dad14b229ef940c4d74783455e850802896856d27c01484be2d79060ccbe1edb37a1850d445bdf0b3555bfeb19601a4d5564f315a0bbc9f1b4a8438900a21af2b8c55206205d73ef8c06d46b20c46b1f71416eee7d97c3bbc677bbda097c17a53222193e76989cc84104d864f86ea5620980fdf25a99b34032b68df5547103b4d7834cfcec4163fc8652a481deeedc5870236381d666f6c31795db6442f847dd832ea6a19600ec9d8c68f4bf018085598a7d27459e3ed81c595a8df9c18ed373813da240f7baef494b2a5f505b9909584070271b3677ccc2e6a467cfd09b9a6757b051fb458949a97c7312279bee103fdaae7f8a2c51bda50f1379a65a505bc17ae13930fe76512552ae582974a98aa84e3ab3051d61b44929073ab3db98a4d88ddad9ae38d11b6ac8fd6cb550f1ef92037c12d5ebce3c58cf2f2061a114f75653ce0f9c7fd1e535df37938e4ccdf0583be7af64e4e92f420aaf08530408c56b0896aa2e22e3b20500d29d1548a833486a8af513d4d8ceb23eadca968b9fa171ef2f66b244bb37c9acace1bb14a1bfa25d9d558bbc160720a1a6fd24850dedaf1087160f6623bce40c979011fcbb184687d87d113b3efdfa6ca462f4c1a72ec5d2c548e843a7910f759f18e436ebcfb6bad32f232c38f55b2f7983b2459e55b9a63bbdc1d722a8a8a95cb69a20a60e4fba48c8897a1df9bde04b4047e92d64a1ff1e73314589dd980d1eb099411c9b6115dcdb4011398cea5db2e3b16ca184ef70d512106c26e96ee0a14fe48ba49f106ed0c3a1eb3faad43ad1c7e92eb6447f93bb2b06533e7172aeebe7a1cb174f4ce7f958a8c41e046eaf9e7410731d3b933a677f037b333bfa033d8911eec406585cfb61f5157554d808f24b6d82731eeddc773c6b31d085824f9d00c540264b8eac90529ae8ed69d1807a75c52c046046c7d1a0fe6413d3e8ffc504325f08503ac6976890ed82ccc1c15ed5612f9989f7c0dcd20791d96484e5834e563a69ca3e4265059759dc1fc45cd403cec619ce46c2592e969edd913213a081af48d885bcbb7edda98838390cee9d8b75c9ed098a809c132a3bf69c0fa33cc3fe79ecddbb8e9a319742606361e1044fd8a1438e85019bffb209a505f05fe34b3ca0b6a68694aa36493ecfd77a28f3ba872de10537880ec725b66413a11c9606cccb4da9ebe379171edf3346060d2a4d0163f15d1482b093cce90bab8429da3bec019454c834e5f74c3ae14570726a330a6d2074fca81e1ec1a1bb813e3c82ab4bc8dc515d2810d7732096718c8461a300ded65c3392f9d624c3a9c182dfc3ff88a4ce57094e90febb37c28d260083ee93321fd07f6d2bd0ca83252c2037da3b3d6ce90de654250cdb68a1605d1c7aa5559b25b9f91e13535fb3c1fabb07480d1b92b21dd53b6ce55b253b5014b9282775343e3e0431e0d0bceddd762c34d5950a968aa13779a328a77923b5020b08c9f764d4ef3eae0ec64581459f3486caf7db049512c1f5cb47238e7bf1819c2cbf43fcd9f5f4519700e66976099e31cd7bc778514252f21577458d8a116a0df834219ee35d77681280714c9f00cfffdc6d47602a75ade581aa7ac0567f06ecc6e759b8d187482780cb4736ffb522658caeb305acbdf26ea733150b2d185775226691c5881b96df29cdb36d20cf3904adf86206d9c6accac3203038508f5c4033f291eb86bdf36b65299f0d90095a65303788589aee6347a6bfdbee565f6d5a9f0d508c84d4e3c7fa99bf89e0ec97898178c96c5f5de2adc56745fd55efe36954a3d13a4b6a8292032abd4b49c96bb4fc586848132e46d9483799c9a7037f31ca6a9ac479b5a4f1058587df9b0abf79422972909a6613fe7201bb2c8b32f135cd5df00f34d8a065546b2e1d0995e75532d70bdeb3c7169b4bf1d1212cbccf87f70ee2e414cb58825b9f82bb81008b5e797cfec0bd0b00f02e5c4ee8f2f12528085966666aefaac1352b686b129f67897754c31506f9fa5042cf38ec854820d45fe11bc856e2301d4835ff425807a6eb86ce784eb14dfec44d7728171cb4e133312ab0dbe38dc99bcb59adaa02ddc5013773a8e023a8055167b9d61c6bc277d20efcc0b5a99b80c89089255e165ec1cd353a412890304017d9e62923579cfaebbe35d8db5280d596310e814b9c20b1172c0c7a4dc509517bd6b71c9df96bb8525e704ee2e281d100de1a2ab13d44efbdf39a3712b1b4176db45c726296bdc970a5f3bcabeb33c89fca313723ee07a4ee793cb4e779268eb3ed3448e4b205050f04ad6abe91da5d513e04427f81b4dc201e7a15caaaa12c7367377217ff81a9f72335227d403dad779f8989907059de40e5bae8e62582088b151a65d3a9d8e8c952fe31c097265b716161bb11f23937d18326d0702a0457e3e8bfb293c50dd54d1d1d8908f7df53b21ba490b3cda771554066218339436f30d8c6c2e78e03b86e4e776289be4d7c7f6deaf31752728c8ff0fd4956631871a828200c00eea634579d9d639ea3736448541ff4d5bd012a3c8db61cf351ef72342c7d7891e456c3b5f7dd8679fcbd9d493687a51761dbca93f0290b7a5d399e1dfb4b07f2a0e3a0952ea6e3743df7594c976a3756b4c2b94f756c7d076e0ad864768de61f7faf957df47baf7bf15d29cb522fd50c9e1f4fa074352e30ab974e7887260e063ccf6f3f7a3dd3fa68fefc197804ff57243e4f097c6d4caa93670e1cc16f93c313f8bb2fba3562804eb9f6844defb23e36851f010e258743d12d43c52b93da4029c225fd71b3930eec278a9684cf92c822e49571c21f89f79c22ed94e0fddbf009a4cf707130dbd41f745c5930a650d4d30d9d675fd7bda6f67c2864012c61a44072dff9916237baed2cba71eee18d6ec4b8ddad35960619a0542b61907ba827e16a6135f88cde1a83a3d34adabedab376969129b3ab64d0ccc82d6eaa0a4dd783468905dd10e280461fd7dcce8ede0d98d8a1039391b8e8c9f63944d64c477290e38ba43e78aff27077e741cbe36a0a268d36a80641e39d233b168515f86934c80bb3d05d1601c8c5e1bd9df6c09c9e6cf3b18fd3234f09dd39ff5a9e44cf2a1caefd93f035c7d82f09292837121a251d0b86301f2dab3a3e3b2561f1294ec96021d70fa0b2e7e00c0c7b4a7f42fa9d5cd19a89bf3a7e4b2f1f02494ac1222f093ce4c711d9154fc214f3eab197844894fda436c7c6e2cecb73c28e16b965b991e71f41aadf2f79aeb088866dca74353e2a5337e5a38877351e370ca1ba9abd36403a6660bc350f6c9a953aaee1a8a3e10a123d2148e114e092e888dde9c3ceae6d0d2e20e13ecb93d8ad153d91e80fa9d59ee16203443ec12357c41892561c0cc0c3d99453d184108cb290c5636f6b27288aeecc99c4009347734b17b06d1d3bd000789ac74144a964bf3f6f48f4c29884b312508697d377c318fba55b14fa56ab3dd1b75f5868250f4f5b08ff53b1c4c0164cbc24756c08d1e1ac42875cfefe7bd7c33e90b639e30f03713934e93b712a547f409e54ac0d6bd3daccb4189c27906bc7cbdbf8eb4bb8e6695be74b19d5864911a3a68424e9acd88ed91f28c5c3e260a0c51e1ce3be19c7b5894562c50e7f120a1823a43b00f21cdacae93705782f043f818a4f8b6b7f43db9ed6c11f9afecb2568ce9f12d2c68f8ede1a624edc1740b0460f4d32fb8b031274f95824c8f5901c1cd5ccb26488f8d636e496fa9c4a3aa4449420dab4714bac02a76cbd057be2d17f16159cae7044b9d6999fcca8bfe56771c6de9fd9780667929603d2134bd0b77c02046072879380fb2160d579f26b58b1c73c81a18426604e7799af0a13cff0e0dc049c79b437072ef81d09411462b362cbbf29d55c9af18bf7a214b59adef21999073843cb41127f8ee347fa1b039c4c3acd69142d8d29a2822a679c47ebe94d9e2f5c4d0597a5805967ee18c0eb0128fd734b5bec7d31e55602331a1ddd810f163bfc73f44ece7873763e60bf1bc0babc505677dd2d42b0681a1d26d9501370026dc60a9c6f796ca69700d9f83971a761ba8abf05d4071c7215161c98305c6785971690e219e133bd47922c2304815b34b0a044a5e86471641dc926748a57cb11862281d52b8dfa9e9fc35023362420e3bd4cac88149edb2d590ec1a607b1cdbb3a78089e4346d730ec46dd0ebe34a9f73c8ec782167034cb9b65942d6bf142efe30bb2e1b265c8e61d3737832d4c6c202302190a934a0d49415928f2da924f43f179cc55a0d155f9b6d01125c77f3d76a6ad8ddb75edf085fb42fc44aa91d639c59ab92826191733c133107ea14c040e32c3c1d74dff277ac221c582da79b9422a37a3b7a5ef6b88dadcfe8a0e7aaaa3ed43808fabd61f94b1f823fb01e3174d42e4f523d172380e18381203e81c03043c8030a58d895e42a17573a032738e708c0fa688ff50d69b00778b5077e5a4e1a3fee37ee3d31b9b08b139c2356794dd7f8e1a9cc1a6154ca47402f63fd0005572f12a8baf05c1845ac7bcc7d8099a3b703775ed60c811148ebf5f008167f89fd3c8190ae5d9142fae29490eea64f102bda573ed0f883d7b665ce216cbe882e6cad95e13e35b3143bd6be71de426b4a1a231a3b06f34f05150e1cee5117e024d9efe41662666a142c05f6ff94967254ce300d1fe86aa6e2787e09b8dc5cb7c7d572d446c4c62dc47f2f2bbac8e334a706fcef4e335772dded8633dd07117eb5b2c4178065c67931c5d8a2dd6e7889c534e43e780001ee725f7818777ae4fcf15980a9b5f1be097b9552ddfa66f1877ffe0a657a53b4dc27ae685f6541f590395e351aa825a420868a5849ab72cccbac03e939fd0ca512fc0da477afe2e98c0460504b67c4688c384e0ea98012b27544899252268e5bb1cb4f7f29d6b89f52c251aec9ae49a77b617309ec77344f6f17a3bc2b972cfbac1b746f8eb30238e5a314a404b6af4d36d222a0a00d12df610185c2585ddba04ec2b938f8cf4c53ef2570fade955fb5a43fa571f1b2c830d36c355d9a88f9a3092199703531e9e86688ee626d0d9773f1b1ee718bcc9364762d3d0d50f010a72b4cf570a868176849fc29802afe7b78d24b0c7918449da26c4abb50b4d421670c21b4d59211de009dd4f65c039ba63c1c0692f880055f45caef065d478f69ca2cb5fbff70483da83beeab41b2b6abb913619209ebbe345dd063c5c59845ca1f611243524c7caf0506012e35b4a7534fd700d665d59c010af76da5ccfe48ac8287378ce1481e005982f7efb687c1512c54b2831ca60b549d15dc95894d32f5026bb573e0827a1f35fd0031de714e971d732008ac9eaecf87e60b9eda8faf692d444c7a8b517a59f9e598b054d9791f9302a5ccb5464867e801764ee4290494f8a5ca378a0104d9a3cc36d17dc134f6352b5fa27f3d2e6abe20169c50b62fdf39a6ab08e01cc74f381ae6c6c82690e08d11b8de4b84cb153b4f0c9ebfd4c893b8de3a03ce645ef71475f8cf44a9a9e8e42015075a1723d3737a3cf31fbc44314a262413cc25456a9644518042c9e33bb308a1ff4736a8a74dd589604e804769c05cbae7492a8c3254dfd809463234c14eed8e57c9f7ad33904ef355eb1a0698e54aedf80773d83b769f18a2e1dc00e3057c1e09b77c63eeff9835d4ee0501e18aeb3dad0e234f26bfb5c0dc852a0feabb60550d0cebf05e1f7fb37e1e2748a862beda878c338bd9793c499bc5165b401ed87efecea07fde92b5f9cbe57103c7d7fdd2f31d92835c59d831da5361b7989931d648e94fae6925fdf28b510037c3bbfa54e4a9d51231b72486da9fbd494478f2db593d0090ce5fc16bd58c43da332757c59a9d8f7832502e6faa1e6e7aa73134cdd25918b04e691097156d39fa07b867bfe54a7e62678724434c14b190874af22311cfe1aa240c222c64144f823ea3fe30bb2b387d517373a3cce07f8767dc2295389a2057f3f8f38f2ec4f84d07eec6ba5e95d3111be71507d43e0416b1291a85ac22871c409ba31ded998d2266744bd63465925f7fd54a41d000721fb5cccde16df68d64961ea044c3b148e45270d8cb1c16af191eeb64c42d98e748e9af6454ef8d8438c078b8b9d7c8c7e420b390161c0c4632d0a518333f888ef0475ab80921a400f1a46e553f9bdfa48244e9d3b337fee7224331463bbed31a801e2c27c10b06aaceba5e88bfbc6374c02287b600166768044c8cf08882cb8bc8d6645e851bedc4e3a38f54132f7a12ee6bea2e229219146e14b3c18ff2b3cfa6fbabcb6bcb8ec03449674a442b59830e8dd70a1e589d309ee88109838bd05f4a0795d3d23c57c33fb7c577ae841aea7112b18b53144d83076861351351f9ab7919a33275cf0380859e4a9db61a09ddc1645cf823dcc3cc3de4b5e7bf468b0e0a9d0ed4ddc850afb578ff2efa8bb1aefb01412fad0362465fa6625358ca66494c34894791f17f777c4ff0b25b295adb68239bf09063294b15771d8fc7f6dd201b8d15f013ba702df4b31a92b6edd452e4eb81a682f8aa5aef2d65d70e3e4ab81f7424ceaca5b77819b13ae05decb6229a9bc7517b839f95ae0bd2496ba8a5b76a19b53ae06522fc4a4acb8255d70e7b4ab40f642540a2a536b9d20b1271e4a92724fc95cf555893cf7509987bc96088d7bb19dc8e7aaf49ff079bc607bb86aca3bba2587f9b442af78f5c56e22f5f14f8ef2a2481e16ca100d4e21fa069c6383b5b46eae39e2958faada702ceaab53c011a56fb243e774dcbcb6cc19902aac7a9ebe873d4a30086bc1182b9944144d116a9afdfaa48059a1315ba93dd31f63b2af11ea9f951330bf9996f39414296e4b2f462e4aa90dfb86d3e87f9074654e1175e7dcd7e1b6017d94b87984b536d8cf1d538fc7d1bb07eadd91c03ab8d8784a72427edfd74a228d24ed9c628d715618d216886c02b4aa1d14d145d1fa391243f25f3b328371deba29e1392be4b4722a89a024c95a155472c30a21f6d500cf2d9261a9239e874a38bee2e0f15ec436f7e67e7cedcd434cb0232cd01e44000b813026fbd97a064f03a2ecfc8a11c87fc74a8496a809cbb39239bee1bc180a54f0db5dccb7f2e961086fe825ad738f58bfdfffff1d4f2966f1bbece56ff455b3c5e64f20c1c915bfb25646eecb5d75b90c77f12696aefdc96e0d699e0ced1ee000a5a99035e5805db2380cf52512e1926995d68e26c4a5739eb4211d4364ab07b20a4e1f372f6b0e5ef2ba8c83361d5b6cb7350ad84f72a32461c41107941f4d44af737cafbbb491a3161031f8277947d2677963ac9fd9ed784b1090f5061b23cd6c98dfef3ebd0b7f41c438b785b64468faabf82da0c97cb119384d164c11b9c7c7094d9c03d8752922e93464664beadea9be9a00490ec3ccfdc21ace419542e6418856dc4e4f1551ef3a705a3f65f7f385e0a7a24cf1ad2bb433a40c69940163a61866008f2dbd40552d867d73677b5dc4c75867eaf53828c827832b9ed0d15fc69f93e1efcfaebbc8893c3c683eee9f860e89c880578d8f7e3d9b77456f6d2659534372f49eb5ddbbb2ae02a59bd808a4a3c61140bda863ece10135c5e5cd8ca297b823ec61f2d3470fb6a4102dae3a90877fdcc6268308bc26460437532a7be27ddd494640a9f106cba55d5208216c2538f42c32f61b3de3dd62df828cd85480327c9c7dcb6273826f5e237da5e9c735e111ffcb3417588fecef37d135e4cadce4d88cce63f1ae0e12ba1d5ab8dd65278e7e562e5584bc06dc4d3d2681b4a1565e4e5e54ba98bfe08b4ab15bbbca8cb8554b414c76424e8ecfeb034bf6dcd7e2067ebfd99a0edb5a40eef0d80e19b06be4d84df450211c864a5f25dd61eafc17bb4d050d70aed52b5ea4709a1ae99a54dc801a2caed72068ec7679725a623c1c62c0adb17ac2fc83c89bf321c063d0b2aadafb510f67eb23d7a2dd72fb6d5e8ac897ed5c02c9024f40255195c75baae7668b8b48d714d286338fc5123e22bc5e6090a0fb8f4b180f2c5eec6f8d140c8bd986bbbb1c634a5b414e0816ad9bbcada58ab832fe1990303269cbfa46bb6d29d21898407b18ddfd181a28f4ffcfc00131c4f1f755eddd39dd8865028e7f42e8adbfbafabfbc41c78dfecf4cb7eb7ef74d9be0902130e4575f4951e211854f85bbaa79c897fc477e3349045cd63e9f0dc0bb8b20ca748bf419408e00ba1806cc17d765843008a3ab5db758c947891fdc2fb8ce273b33b32c9f2655299a01698f6140c847c0d48e2ca32aa90a1f56fbce17f4f57d9a5cef7bdc18ac8e322aff316b8757e3d1ba4e132b243f1f9a67140073a827f4cd2f19e46f4570e1d11958eb167f0b27653b90493b7b367867eac7ad803fa9b4d840f68cd6fada7d9d90476c144dc56c748d9db06ad3330963b940148a8bf4e9e1b92242c4ba1f8c9b34be1370b02659b8135ac7d77d613b6980743a3f9388ae17c16860841f81d36ade2049e2d7e71dcc59e05000bd6cf97ea64bb0b2484f1b390f8d034469468cbe60c72c6a65b3f3800887325c332bcbdda0d3be6217bafd10acff7716fab23a55ec4b3dbe7b412b5993fef77646da58de6d170dcabe7238d747e549f4e02b7da8a2c4b2483e67131363ec8d6abd2e1e010ac6122497daa2f19d1f5549378c93593fa6aaf1d8bb34b592126fc7c51d9b440b7075c4957fb17068a4c808f6368e6fbe454edeca95e80209131cd865108e007c0727110eec84d27c18177f6477592b39a8e1039884b77edbd865e8536316f4a0f11c5e09c477cdb692c100ee7c7e945ebf62b8fc834f77c6e4e91c87d9e9c084399fa1646430db0ca40b3a13a93a5168de5d62992dd0d324482dd74f26c72634a7cb626aa1fa6c723e741323c87608a69e0872d7273aa44bf262771d4362e8d3702ec784f8125853f1089db4076245e59bcf783200e861f872336ee3eef527bc10f340d208752851c3f1d37b99cf72e4433f2ceb7afecadd216b3a6e6611141542a41ceb7866c5420c2a331672857ccc900ac35fe1fa35acf83c1de711587f10edd2993bb7f92abffad189b2f35f1a7829c6ba67c6be586394f85f4bd4abf441e919be3619fabb4464162c4b4e3efda1d954d02b809b43fd51497de6509417403c0abde2d6af09a52a4a2f22bd2e723f4a25036dd0d08959e4ff4950394cc6d6211b8eb8f34be1a0197368d0ae0b039f0c7210d121790ce5ba52d3edb40820789f2c668c42618c929fd949aa803a1a0b3ad56f69368d032b51e282c3a2d9846c693e7f833740b3794c99708dd556592c690ee610ef1f372c70da813a4558d3fdf453e7f13aeb697fd5251e0a34d8b08818f36e0a33ae0708aa5838da3c23f58dfd206568b32216c69262834bd3511f06b1a1b95d103b5c3548fb315c113f53b413db840cae1acbdeda200112135b5b1ac9d9d6690a9e9a659eac510e446fdeda346ee51e709bc66dc82b801b236db66f6d78c166b05dd2158021efc37d1b1aacdc3134278a6e20822294acaecf7399d2503087478b766ba745395af3381dc521e507581cb9147f2df48c71718219cd3bc4057330454f5fc2472782e2b12228643e92d3271b8a0059306e3a35391fddbf4fec53eb277cabb501a85b7f82fcf23826a419f9c5121b3b3c17196d6a429c88f99c7f6de81834f32076b004da5e010b50f5e4823ca0aab18ec8d2c21d60f970635b2bcbf3d239356bef42485e7048442cd341e3215d4889784a6274ba02a945ec23844a31d26f383c0349f307269c321167aa2e300a4ded4415a0470aeca54337bfc88b1547012de9d9c4ca5c3a60d257bb8c7e31f967bc34f2008b6ef9c075cfb60a30ab422513c44a009e3e4495ea42bef88c032caea100c7b651e00374190ed50cd3025a50b1b9195b11c90d22e270b670b3d1d19bbd3aa384e6270b6b6b775e616d45170aeb16773461c5aa2f12562de428c2eaa66c06d53c9e29f5608d45531dac6fce801aac64f78b00c4e4005cd9268bb6faf0ae81d5b42072508bf34e65d09fc4bef74196f74504949698cb5ad9ab606d78e7d8b7c1643368725f6bfc23f6d7da4419929790fa3d3a807b1035f861aa6e9b8fbc020c15022b9ae92342e8bfc6ffefb107a1747ebf3ed3c4258555977b723a3f8b3e716f497b3228e1d2b6001898020f8072dd94f1c1b0b6bf6caeaafedcb48cfd4159b5b7c01743d39e4b145497bab3f83821ed9363cc13128c9b5376283118afa29314b8da95a98a8d4b5df53fc6afd76e24c61a33265e856f078a4997f7e468308d0242266c44d3582d0d2c403e007639cee44f4e6fb27377562fdab32c1639f60665fd5326ca4483ab10a70803e27037b06737c0415b872c8f69051226f79396b88d163fa537d72bf42e20378220c16443c9a5d979d31fd3bbd517061f8866d46d8f22be6ebf6d50a993e1de5628ad76de72c298a385b25b15460c58cf722775bd302fc0d7d91c80b07e0e15986e829f684a7dd335597efb03df68101b5b53d5c4035b7f29d0b21e7c36cf0c1bb34604d67b37f492fdaf0cbd2db614df9ea5f7eb8f93d66a99a992a9c67cb668744dc6f98552842fe08bb6857aa7bb711bc1013e88ff462d1064a0c87f7601ae5d0c0668606d0d3ee113f4be88adc273da7291f0b01f7829969d365efd3736e094a8d5229d5665af4c5f8b9a1f7357bd36fee0b78c0b52718b9d44346f8ffb2e205c06c035b60072966cdec75f43a86d2d2039fc79b7fa9298fa5ff78f739a2d6212154b4e00c2ed0e3c12bae7e10cad34d846553546ffe97110da47f59155f7371ef17b2f6ca0b789a352ed8ee30062bd775859bbd54cbdf9e5fdf49ce0fbc0233961b1eed79749a4e30fcec0c38b6dfec9e87a22c81a7751ecddeb3418ddb5f485e7cb122228390c8138e925ce84c694b57426d8619cc62964e221e56e9ce1f6e66db547b69ecc5efa5f75aa899bc51eb3edd81cc7c196d3c3992579427f1cd2b17746d6cd0c7f62ad0a64c5ab4f0c80b09a8cecef2fb7737c04539dcbd26c4db5423675728375e860cc97bfefe416320c73c4a99f4f84f21448b44441b35f0ed435726a1c325046b93daca7a53651c955e90093eb26f33023602252ad21c03e46cc8ca9016eba4687564480dacc4a9238876132d04c667e4ec594eb4740fbc8b99415f5578f1ad09ea5dddb6da928506da945912c3aca0c9fc738d4de779ebff281e37e99739cbedd40892d7b859c19d93cc212ea33071dd7f77d183fffe6ef579db70b43775a0b5dd8e0888c169c9e348299cf20a293c95f0ce54898ed846b6500e8043a50a090281577df9235961b4b166c68050a46ff6b61fccdac661661b32d752930b96150c9d306021acf7ca6d5f0732d3bbbf32778f4a9f920b2599c3c155058112a10d5a5e82fc0f67646ea217f59adbdff0363708ee6c1dc3cdeab4234eb8ba87356858745c3a5f89e0ab0fa9a6411680fd2b3d94c4d231c0cdc7b5bcb6928ca3aecff4c357a5536c3ea95b686888cd5b1a2315bbc745209d0017813e55fc552d214b184e29a26a921a50d1dc80d043d51023ba6a459df66feb30c37967d5fb8890c359860b067eeb1219b7c8e9ea19eadb5fb67e2e62856f7da397b15dd123b0526a4f2d5e8f44c064d60daf18b56ce344c2ca08b217760b189f0abac60823dc20fdc8181260cad70f64061633950384afaf0a529f655020f3a754734f9ac41afe463b5f808c0e9d07fd3db764e52a9dfb8771f85839b31d82c9fa616006096d9a0d522c00eef0b94ad7a04649021b9a48b08a8d2e4665cda798328d706211a1f314c86b779c8b801504cc6f72309b786f439a2ac46a140414975ba6914a96ac23ea446a97186f136e6159c04783acec7eac860077fb1b25b9e40e3be412f7747d5243b1656f5a2c3667803c5cf3681a6b690d400410a71866ab9e2a7d03ac2f820bc125e1e304e1d1aae31ff380887d0b1c954a21ad8296e96132f1a323106504d3d0614d38d05651363818a9b2c725c5f4e55e32f56f1c97997f1f9bd7058048c3a52afdd7d8ea1356cbbf9ba9bbaf575cf97da71f93d9f4d62740aff46c9b2d8456581ad724b2eb6171d480f3740dc8bbcecc34e25766a94e81c5e19f3e72f9a96b3b0cbe46b57f975794f615498de5d44df0a9186ac09a6d66b51c7bc4f884bc24024dcd5a63b5231a93038f2f8bc4ba67e5095345f177bf66bdd2350f095160f77fd474c7e3a1505662f1666702e7b12dd513ad4d78001cfc7a6e64c151b065dfd979318a3269ddff4c4cc7b5d625df18ed73b82e19da2ce5d456eec3fcd621577d7db49ad65ad9352bfaff9c08db988ac820abc2fe64367a9c2bd70693d4ed1401fbaa48c26619a1f9c3a8b28bd46302226bf8826692ee0a20c934d056c263df844de2e3755a63b7b95480540ea1dceae29c22833da33ee26b35deb04c99b60f0aec34d3611e5cae3dcd846686b0edf5d0cf3a1b1aae25e78f4a8258539600e11f1cda3ba31fa689b66811288eefedc7cf1e6f8e92da9b48b3e5f6ccbf0bc2c09d14d1e6a48a71e838716abed48b0e163cd7e66510233d69bec912a8d505fbd6d7908e13b1c14fa4d8ddcf047f994940cedca035a1e2495cf034d500f3a1926442bff9950962c8f38a3af161e2a61bbde21be2b91a1efee3724cc9b804f3901e47df7e8610daf1dcc10bc1b05fb880629e27adc8a3f9130f924fd5848d8240fb2d91f87fb6c266b6c3c84f96bf13f3c9f9de98d58f3db11e4c035d07140be925a47c9cce2524df9b783f4e0dbdc3bf740ac9ab8834ae79b330ebc3b4d53bc31f7b43014982c1dae45755aa5cff6ee38730de422e495998018ac1eb97fed7564c044050f3e379b1e7f5dd41840d2947f719ff921fbd28a3ca5cbbf80d12189fd3530ee6164acfebf717c15e40714252d9b2f039894e5259b09b6fdccc69cbbc82c9847fa15cb364776efd60aa1d0fd204e93d0af671d2d81c07c61c0354b5e25e98ebfc83a93229f7cec7caa426baa4064b59ef05f8061b4d6abf30e98f8d3db84878ab77d1b00cc39e8a0914d7768cb78e490fa7e0ceec1a1dd7889356de269fce4d62fc44fa7529915d323410c644b80784580e792091f2e6e69d0492223f819291ed805263b7e4b2900390a3c49a3081c8162f47b537e03728118e58b43d9168ab341440efafce688097e17249c8ca220f8ca9e05015489644404051a01a7aea924fe249dda73589f92ae114ca4407ae828b52d22806faf45f50fd27df26cbc1b019123c29f501c066426060949e455766e55fa062922f4eb59d9d26a736f9c43bebd45b1d84967ef51c6928e1422eac50b954a3aaa2d4839357343121a1fbec33318226412abd260eebdb707138af7a304bdccfd57ea497c1144cfd716dd791e6490f16af1ab4a321c5a90791da6c9ff06b40ba5373a21976ff4a4baf9ae7b2bad238a5c7e6f59682cc9465263efc22c3e40e5fe92b8b32a715a36445e90bc563a9e0742c504d7eb44a075e0f3c65449fc1ac4797c716e87ec09ad14db9c47400629b346e984c6684beb375418e84ebda2bf49b71001a570b4a027cef38230684f9450c6ce1f9158914bddcbf108cc1672c586c9402dae9d2bba3f9ac6ff8180f4f34baf0ed08f5849d57385104eed80cfeb0fd0716e360a4a41f84dd48d3b190c3410fa1619b94cd5f0d8c636d7f808f63340e68751837521b5a10f38aea8a8e6959ba8e016ca478987fde3b6663d71b6a6a6f4f3e9529c40c6691a97ac267466a946f60c3d798aa745dc4c5eaaed6743dce5e3f2dc274ebf46878f3dae433580cf03e07323acc8a8b182065835b2455523454c883013925c208290903f0d2b7ced02462c72bb4d508cfdfca3ce10c3438e8ec6831df7d74f7d109baa99375e7807f218c9862bd95470f1eeda08c569322fce6b80c63eda083902684ad180bb9276d8dd0a10f1e8a0245472c02879f6501eb05b231ac62dffbba3047e1e48da68254d809095f02db516a1e8033b74faec7dc025d643c8a1d701d1df652bd46f25d4de3327ff1608e62b269916029ab748f4252be3c401b182d2182e10dd084de377dc4afa5b8b75bbcbbeca07da4974c862ef47f90aee67d1ab28b8564446ba220d7bd983fdb61d539ae5ff5c8800e8bf1eaf214891f35d9293e37fdcdfd1594ef50db895892eb69d95ff5e6f6726b2ffaccbdeb5610b2b2294d903dd06041838d8ddbfed2b5bdc99a9cb036de6e73b8cac76985a8f9ba7b01f7fc0d00b07d7fdaf2f124313203b47cc0be92618ae6e58f7a1e2e5b1a2f44860931d9db395f53d5ac680df69aa567f91ffd191916d968ce4732aacd6dadf2796f75e277be2c160f5673bcb791c20fd7fb40f5129b7ac449bb3268a1f73073447ff8de10a73f36786a1061184e925b5281b340e57e03e6853ef0f339e21e3c42d4c7353b598a24696fad24d8eaf6772757065e4844fbfb057b9be644aaf297f163fe7fe1e7ef253c3893e2c9e0ee4c5cdf90de60ae7bd43c55593bed3de67039dfabb973c86325fbf85190bb142815eebbfde5d2b90db2d254d3af6b7fb5c64f75894c2c2b14473a7bb69ef0fde87615db6f8fe221da6f24141342b9a8a0cf7f305c8bd8aefcb00c7a6d03687431b29ac1ec10a66d2eee5b9cc4cdd9136648739b48f2bca884d3ef7c0c6dc12df566b8e4500b16c83f15e52279bdcd1ad947445c28b27615fb3f7a174233fa81213f8f94be9f045e82a93b4b4d4079e9a74457db0b7c9a64fbd7be69219bd2d838c3af698c698e31f485e90c2c766fbdaef6627bf35a1c9871b19f8dea5f5dc5fb2b13f005ff4b97fc02f66a090db1e83fb3707eb17fabd9f2b024c0076a83787c851b48bc77685b8d7efbddec6c2cf28c2e0bd153678cf1fd71c8b0f97b0d421891252beb24942155b7737e5404cd9141861991c3b69bf901778c82743806a528092317568e502bf5ea45dbfe3f40c73da3753bccbecf7da4a75645a200733adb0b19624b5acb387dced7e34d1257a36661619c3ace61c74267dfc489f0eaf5958eb4720b4c4ffcd01b92668c9dbf8592bb6e26b85c30759a2053bd4f5285ca7128cbbafa78ea0aa6452ed03da74c95313e3fb1aa0f1929870f53ee99a4621dea8d6b47e2091f7814a9eddc01676fc4e018fca0ba3f5ff1a3ce540a8ab160fa009f390a6566cb3011afafa16dff0288cf128dfc45055fc90ce0d884d76ad430698eb904467d9709cb86c3f2c539776056c49776cf77a564e87b8cf6c2d9e6ae06e46f20ffa84a403eaef5f988b26b8f3513c9b25f0485bafe1bd563c5176616746463edad0f0b789016e695c7feecb19dff338901e5ebdaadf72e05522711d931a865ffa9c38c2b119c59513de7e14386b30288b84aad3e34f8f5728d07111249027e6a0ccd426ac2905398dd1fb458857b3675ff3dd75510c04bf81c312a1075bc6e5ad03b1c901ccb9b1de0c53de273cd09b8718abc8d77192f0bf262648aa0f1295624ef8bcbc291f1d205747c6095546d687f1ac322e7edd39a7f942ad54c320db01aec733fe8d9ffc989d7a208d904584bbff49c3908a3697809f7c5bef07ef136f2f9202b04e2c5f9f1d80aae5eff163d0e30a9213de370ee30bedd0525f4f391ab5d126c258f43c1d4a65acdc22e02909c9710796bd394d2da1f6006ea82fc812724417533e77915dbbaf0fcd8675920896955f7bca99143dc4acbc5bfa98ab218b49f8df0a9902cf1221032e516173853114ccefb1083c767cc73b0419e0e11e331d4d65a5c66e589740b1152e0b51b10a17539e4e01dae0ffec5235e6a16ab46e40d288e21f09457740e02a4b21002a86a002988b6ee65e7ff190dc0049206d7fe854a132cce268ff7e6476f6d7539e030a1f249bd98096a20ea3b7e887562d68b04e9ccbf093609f424478aa752c23fb702a6c3af7c3f6056892176d0d544d1d91ffe148ec187b174c985c02ec0f7d082ced52655a0db010282bf375e3451c4696d14f92201c8ced6b53980d1e316c99f9890147adf06c388160338badd6e501df8aa36e35aba67c44cb3488b4d24872199d36091e3b3932cca1762847b1d40d15089de3cb8a9c009fa22dc53f0f02069fc7e80d881aacc39af07f81e5f8bafa078616f891decd76f6e321acba7fd7e487411553826f78287636f61327d630b42826b3bea40e647443f46185d595cd369c42d6b1d58636a99d9108c422a0207b266fcccd5a6b17e94d1580afc4d152d137ed5ba885d2e2793e990c31a48e56fa2a3867dcb143f1992bd69b85737e998506a03ef3dfdd5a5676239356e9a4dfb886a63484db25f76c8012d145e9c4abf76f71a94de046b8ba8cb743e7e517afa39d3640b60d1cdd3aa4823f3d737bf8f0c148282526a899be3868e7c83e9dc190fc8e49c3f1a536a27777d379af24fa40abb016d951885ac739427f19ccf0cb2478b5b85ba1554696b62557ee02ffaaca27d4ebe43f43e1dff004b76b9ccf29b7e51d25e53883ba62ea48b6fac2696ad89b05b1c3ebacfd771bbd20bc77913598b97233f9376d6da1671894a8abed66b404bde55af0f3fdc48dde2a1c36abcb3c956f1ede217082f52b1b5374e69095d177af4896bc249fe3659a1b1246854a8fe50cdf6de4d7137812f0703ab178e6dbabb53dd90b9727cffbc2971c12991952f23c264f95699bef897c14c103baf3e6ff450d0299bc968affa25025cbf117df7194acb99704263d65a3ee2ee76087a225a6062b50f4312a0ba201b8a3158957a3d3800d36747d15d56331c41a19e241f1a83f789ae7142c6fdbf5e3e78c843f39daaefc8f910ae4ba30fae43ef4d53715b8273e5a5ffbf64aa16f4705b23028021540a8e901a18eb0a9e0c925e9fc26d53bb73ea87df1d8a1d56d57da4ae399332f8c577bd47829a8a17dbbc7bec226fd4cc0365d1c2e5f928ef22f253c744b07fdac53a12a189bf453db5aa9f0eef588d0753fa428546d06e896d400902a282cf73debf9109db6b56aa6b5ec6ff44c163df7bb6af7b7d8ac1a921d77550b6f1e2a1fbc67acec1f01ab2c474fbbff9cc3b5bd9d9e4b03867d305a62ee70ff4b97b4ac10e3f1def23e1968a9f23e82f5643687d9e47014a1891d2495c217c0f583e4c04df1577152f0c89d0a411bcec20e017e27d84c6c3b2d36fb603d476699dca977d97ea83abf11faec59727b11d9b14b1618b70e8d18f302cec101e459bd8256d40c5025cc3052b8724aea1c45c2563fb82614869283b83cfb8797ab53823cc2a292af60536e9a10498b094701f1adc860c3ec054174b69a32dfd26a40977a04ce3ce7251aa41d55389706aaa4527ff41bd4f7f0ce02a8c45d180ce017a93da56a01f1b20995bcd4ca7d5779a08c9d3df610b271fa54e84da4e8e8d7f41dd8a61b939ea15f879bdebf6d392420ad07ad2eb4273947986a732c50eba95a7723e66e0863b07e4baaab18275123fa97a20f8094e9ea70d58fff5b336ae7c0982843c7479d3e828f1a40e8d9d55032f606da9a41e58c4488cb023a173aa73b401f024e26843d35f0e8e7c483b461e7b127528a0bff16e911c5408922243adaa63a23ef01d06387a921147949572c6578da183ffd10528a5f9f97b58c6debfd0cf4b257bd1575c444ee270e6f9c10138f31beebf48f8a226cad032d6fc66425671e6e24b0acc459cd5d8c25479c9e7fcf77cc57614d65f2f3b913b614a31c381aa3aeb5970054496ada118831dd055485bb2ba6122068761f7fc53aa257be5b63949e246a2fb5a8651b35f7ecc1ce7edf7edee18b9b72c2b6ea272c219b8ab2279a3d9e18d2836b633fe400793923e172bc5a241a4051e9e794a1145181e6a7fab7cd8890ac4b0938642ec8c0c1e9131540d25105ae417d322eb1ac0234258e4eaac4fbc6dda2b09981fd231bd08494cf7313befaaf53cdf8f56e21692bf81951238643937a5d3c07ab0d257bb845e383fb1517e8b114a16ec1c6925a908de6f9c859a9d29e6b729686dad48d64bd0d40173a30fe00581471843c5b80b57400f7b1e94baaf3a990c1794d25596a11a10cf7bf536f511f6f1c5e08ce2b043dfe7cfe8023eb06b8d8e1222e9fa566342660167bf9f0cdec23ec93b239a1c05c64acb1f6709fc8c88461e74d0175663c905e59ca5c8084b886e3c3f2f0750780feb0ddac927999bf210bab6e0c71fcfc6a1549ce6285caf01ed52fedcb60c31a87892441db461d15769e6f9869a9fd2024d527459924340f75868c2d9a2931250bc50c7823d17e4f98d550548dc8558d0146f0e63458c5bab55ca6a01b1926fd440d39feecff397678cafcccab39f0ebd305de8d958f1fb07dd3b42a8b1f7ebbe1c92df33fc3521651b82f18f290b72b289301487f900d4a4804ca112864a446c24108d9812b790caaeeab0d18e6e4b4ff11290939901ca870a5e04f5ffaac71207a9bf43436e8ac31e34dc8d3eccf228ddeed71fe6db23520911db840c7ee9a61720bd83fe1b00f7ff47b04a9599f6b61814518bcc2bf65f8f706e3e0ecb74901da5842176ebe328f37a5b7561a627fdd021314a4c724b61f1603e678f4fc66d32db0b13454438dc9aefb0a67477bed694f8453f9d97ead601b023034203bd418fe13ed2249ebcd9e3340d5d71841614bd6c483f755f510d503a659c5846e6891ef9cc28b89469c1e6b81720f245a1872601b7585e6e6db1ee3176f2ab7a97da531f0625bc52df852b5272acb0f27f155ab5f22794ad6edabfab316864ee534373ea78acb567559864df6df6bc224e42d0381eec81feca477853b0faf82ae4f33ad04d82b2600fd0a5d1fb0178ef5b883481b6e03143c36d07bf4f99f0e9f4db80139c8a231b04284d199beb95ca78f5fa6241d56a0f5135997e1c2366871ae31be6590b88132c99eb4703b6b0a2c9f5a2f5b4ca5aeb32a208d50b1155b3e95d7026c160647360806ee231db2faf0f0f691864dffa4ab01f827f6e594583912b3dcef586d1f6ac75788b3548302988a88ebaa24a1bfed8e77edb5c20825ba76bb160c9edcdc3f77cf6be08fbead3e5aebc01c7a9bbf509975905b6b4858144d91d3bb9c867482785d985cd5f8492e0dabb8b03f00f6cdcee666ace3eb629c44090f90a9ab7787291ab8c321f82251268ff8ec43794299028d3f52f5f2c9b02145505cf61a7a3911c99109d0509131b52d9c0100ae56e6412ed0abf25f6337f32e7d43312f3283756ef5cb0af681a9016d9a06eb04fb106e19ff06ae0d1310d14cbd60353dd09b1c12eb082c3e7f814655952a00a3ee1e2aa56b20fddad7d8e8034c2bb3f0ab0d29761c39ac975ebf1fafab1e4debc242eb0fae2691076c821531ecb747b806c3e987250b242c40497f5dc530bbd59cbf98cdae187bc49f7a8da5b5366a052b5279a7bd8a604b43059cf0fe4638f6d6daf5ff2371eef07e6d66b62e65c51dbc712607af1a1bf9d2232991768c7f658cf9efe33a7d1774970f527dcc3f05e5c0d2585911c6ce2dd1c72519e4e0023fcc09e999a9f22765c91e174d3169a3ee543e4c543d493f38c3bb3414bd9017b2b892edce7def2744bce1c592fbef5c2a56ee9ab63e888a54b6f03fee5389b6cd614d338ad53f7bf3474fb78772d9f44ed3e3ce1d424f567898324f56f804c39992a57fe1f05ddabe508a404cb6f23a44f78640c9f56965d23aace4abc9b9d322cbbb9af54a203081c72e16074913bfe8e28a74dd621ad65ab821003991e17a2970a727ca04410d20d163b0d3ba1c037fff5d8a181c10e92d706574302446fa5e67ea1d9a73f9229f94c03d6dceb9edba16a8ac3fd7f50ad310468305eec9d55c5111bd5b7996abb70105cc18fab16b3878d8535c17faf549f102ac74412b4c8e66ea7aa5f3ad32d071b15450f8c2a5810c8b8b7228474512c682ced98673340215a66735b08aebba31784a3ddfaaa5d7bc8879bc6a84fa42b88b3b099787e00f4081de2b919a072a8797e7ad9cfe0f83c7c035057337d4641f20f74c65e7acdeee24f125235c85922291cf022a304acd0b6258b2eb71858c39cece25434c9e2399fe397d00d048947700260f28c585385c9b3fea1843efb4bba615e3e04ec2767c98aeee118bab78f5baed0e45ae25d5fdbdc3e5441f5040311f4c0a2e11fafeeeff92aae9d794f06b0a4c5c30e67be94af788f73d764fee05f77ba6ba34c2fe7b8614a18d83eb1c30c9dfa4f36ed71388610c9492ec580094925cedc1c8a6d32f7124a907e72705c4b654ddc9c7cd97518cc198ed2d5ec3160d5cf71df6cf63a11f3be6c7edf366a0c91241e93c0a9fc8ba50eb1cbc428f0524d9065d6b1e11675301fe9322a57ac70bee16d3eeab693e9bae99d214fe45a7460f6b3edc983cd5dd001b280d239ee59532f2e3899effe4c4189e558ad6c8c43ccae728a1df6e982a35017b6a9f0bd10f5402607065620d474ea1c141bf8837162b39c04bd715cba1392ac4b7fc63194c292db52e86caae2c538daceb2c420607a47479594b01ee1f8f85dda90f30e1c12b6a1bb52462e9aef4e803957de6465f75dbeb17c4258df55e1ebd21fed71c5932cdf0a0ebe3e00dd67909445b8a75273f9d2d61c4229644cbc4167addcdf850119c1abb5afc31a19d980a0f7b933b1d4ab0b99275d8a9498230f45c84cb62d7abb07a5e06b1a178cf2e0dff63fc94e322276023e5852a481e1932e36fa28a85dcf2469f2247869814d3fd7c440a4cdfc1dc57780ed33423cb2c927514f91623b81ef41cbc0737b2af1412f2a94d39d1d80b67fd64ee1725d8508e9cc42c9d9d8a69a1903e83cef6cbe8909343a34689d59270bb2e1c3c049321866adbdb8569d5fb9379d740c2db447744f5564689de7213e6602166ac9843ec386517814b5790a62321503988212a1e1772e6fe7c27bee355fe9eb710a77805913ec1a779852b37e8e50bc6b3e1136d47e43166ca890375a344278520ee0ceefccb40adcc8cc106a954446f21b50127eb0f26aecea5b323086d9f19ea91883bd448afeb0cf5aee21a544af4e077cd901e49dc476adb08fbac106bdcb5467982b3d68507d02e6ffc262965fc82eab9f91fe7428ea47de149209ce4c4b3096f4f1619016d0d0066415eba2566b61066b886bdbbfa34584e6ae4bac0707a0034ea1750e21f415cdca25cd2cdb818f4a2eba52485df6a190b8bd538a3a25c06ccb273061b6dbfa1d90cfe5506c517dcf543831026ea1aec53d42a6fefc7b59d188aa040e12900f957fca6257a4978c17ce05831eb3ce370cbc4007300e9df8b4407c43613dbb6318b1fdd808ff190a79f0507a5147198e69a77505b0095b71d8818615a576c9b462de635190006d28091d4aa43acce65fd911978777d3fc4df4f0a2c66220f518c40f213e998600398989b7d73bbc5487c61311a013fc041797d2a12b36816fb0295cc24dc509faa28b46d9694e7d63d8620420d9b1f79862f25804395d7ea4be1f730a5e2d2bd6cd9bc7ca063a8c41dc496e7550d932f661f685fc573af2cd318f3d368c4be442a59d12f4d19ea152bceb3331c5cc53361cd47e3e21185d8c8cdf163bc63891cfb230322a31eeb3b7e0a04835b30d60b3f9b1b431a649e654a49a0562b13348b3fab6a87c9a51fdfa0d590e6da4ca10d019621d7ae1c6267d971c1080473c48a0e8429d903708d4a9daf3efa2361d8b2d5a8754bb3c32eb3888e8a696144cd0564c9f602ee362eb95ee7f36e33ed771cd5d2b44b6023db5ec622b0acccc92368750b98cb6658b5e0e81cd1b71119060b7a96bb752c2fd3375024b00813f958e192aeeab103ca80d858139a83fd3d96c9b832e0c1b216ad2cdc4afdd84e305cbec1d35b090ef6d2fc7f399417279c37ee3808a8bc914c130c3d493e665db029524683bcb863206af03230d32abc87d15349b15d6aa49a3ae9bb5dbc8d727d66dbca8deb1081a1da17c2a98a60aef6c21406dbe96671b30becbe8a4cde3ef8283308efab8201d040b80ff5c8f86f7f0763cf8310c5a1f903bcd67b56db741d11419b75040bb5a1c8c01981115efdc2c8c827232812d3c54d84c2772d7efbe1308236273f792387c1d71ea96e225fb19e3a2c02331cabc40c41c456c193deead1d8683aa3c4a1a052809fdb5c69101630283e1c25eb6f5271a7f4674723dda37c59db6c28144f464e113279ac04eb87c800728f6325109916158b26d36fe91c2b6acee6e3c53b96aa0f5b7c533bce388f97de87006bd88e95d07cac763448025b13160b32d08e8525f67407847d807fc6782a0ae78dbeb0c4a7f10043358220f81e0a40f4e6cf9f0f580c804ab24ac19d82516cf4c609df5ce27b1c17ea5e177e942d4d1cc17f387a1805d17e8ea5b537e87ca3ba0a1c98322cbfe09cfee84dd19edaf352df8d9749de62788c70717a18763b26a3e717d33b883a93c07f1ebb1ddb25c7f7e46fc98a1d3887dd2e84041631e9e629263453fda1c943ff4830ba7386b0fdccf6b4ecc340e9923971276722c895940800495950ecf46a674e38549f7c59a53cdfa39a26439b4b2c4df445ba15f08bc11e1effac8748968d06b0600aafc28886d2f4d4c69b9ac9adc44c7d976aaa34d9ff0f8ea5bbd6ac14ed1013480fcb3fed267fc97a97a2abe6f8a449c33b2ce9396127177ce2ad49dbe91cc5dc535bb2c253a699b29621eb0d9d468be068b04c77da12db646678cb245f8062f401896d6a54ced837b6c0bfab529e062129897be9a96a0b39f14a58c8e6490bce2805e1975672b1ceb7100a35bb1172b2ecdadd25d02f164f7268fd937078e0ef1580809c4a60156deeda50a15d612f06620c49b02dbf7f10723205e88f5bc675c097846725730176ea36808daa034f9c86ecd029d1ba01380c1e34cb04be4d65f88566ab286a0189f7b4d0892380cdc10f84384eb55371e844129b87ff3262440f928ef261a6b34ac8dd54ea18b9d8a51e5f8cd029f3b72b8d0be70bdae54ecf81427b43e8c4d3e7cbd27e18eb85b13cb197259796a6ff511b6e88d08d3c11a47cb553a671c2cffc17fd97f333b47c530e53045d5c123f23232829c9b3a77c669963a13cd89542064a6cb387aee638da58f4bd2314fd13af79cfedab26259efe09c701c9745b6d9df4032c6c8683d582f44fb0dc126c891f2bcfbc188ca0a8b7a2d824f2f692f948a8a9f122dd08361688676dfa1dd63bbcfee9b59ea6c3fc6a02a596381f7ff527352856829f8dd62c244938054ac8ee00498352a2f0e26e1c69d7d698ae1c6fd65294d05b7e00572442251ba48873071ecdd7105d771d79090579b8fc88a6657c2ffeab0ccd59f8db8cf1e1230e14bd2485dbfc78448e548a179d6ed852cdffd442f88476d405fd53dc47383d14281a8265662d4ba644af6817778e4c080816beeb2c2263103c3b8c184f969ba24b326fa1f2b2ee5523087f7899ece92534928d9efc3b28b12ba8a288b3039cf33c54783e15659944165fdc6750a5bd5247d7ba8e8da928abee002a380de61ddf66073bd7eb2113d2c853519ce46cb4d8fcaf3c452c30bf0c09cad2928a426a484d637129c3bed71c6d740f3fcab546c2695a9be68e73623dd7fa202ce5a481f3a7abf9e0db9459d028da160ce0c62069ee01b8cf9840c5e57c767b66b16f7078c0cb14dd1bd794e57a31eae4b683bc53aaa2f97fa683476a2755d873a4b93bb04b12f3f287896ead566a8113492e6e7662a2936af7c96c141800d224b1de5172417812c4678956b39b4553c773a6752a376f36d235eaa1d8cac2a90850baec292723f7e2729895bd33db37001274cf08ed85f61565559d2b6de550fe2e5591d0aec6791815a00da6de264dd9c93c3c8a2092f179af8adee91285bfb9c1c0012af4dc2f1292a6904597ce30b8f7361940cfc3096ea3ebbb81f3bb4b01688d0b0c1e57b094e4f8142216ccbb88dcf1295e9bdda79934cfa221d85cf0a11d45b8fe21edcf074ee139dd635e440531cfb829f4dd30b299bb6705b0c1ffc0a7405c78c1ba630e87848403f531c7db435322e6460fef07c4cf60df8cec9ffd98ee47de7d09d09b8fe73485d547d62bd867fa0782d71efba30995a93426924fc63d943468d1509e1aeee8dd4d372753ace601c66930da9d11603eca5d651f64d80404b5cd691d1401ea942b8416cc4408545c3334003691708cc97b89344309630a11ee328c9ff09b7b5655a0ad6429ebea931658507ba0a48614b40f669cde832975b8169ba152be4dc570eda848b3e0275686f938ce72b6762df3af0593ee7f8386a1e6deed7ccc2d4ac073cb7527d4fe88d24a9fff3e1d51e7994066a77fda1be8f53ce1736211e073544abb5e554c633c631a85e5153c77cb181dd192701d6c209f8d224d3bf4f29ccf331a21037b6a764235b7172d36899678569f7b2732dc9f01ee4d095ac7b23a3f6e9463f25937675a793278486a30eb6888cfcbafda49ffb60ec1ea3875f923e344e87167b8539592737c635def823dba1d82e642972e6c1dd892719b75cf5b468070942bb86bc4c68b61f8f1ac801a089a88e84fe1390bc91ede81a65336e33022b7fe21dbeca4d461a7c046e86e0fcb1fd9db6aa34cbd1387eb63aa90776719efcafc1e59cf603dc583192791bf27392c71c211e006fb3c42b151b7ba157d9b19e361b4ef53ad4c5aedc3ac4c0cf5f5c3620f3e6fe8ff286b209fe91f2bc1a5bbb4886931beaa57130d297c2a0f75b84cf9f67e884f0a9bf22fee410dcdfee5ab7c7a2c60871c3f1f2a23fff9083960017ff21b90f35e5ba3d3095cee8b1c8ecfafea52966f0fd3ed27b47b0353700cb646c9ae1b276dd51b616c9f5e800c17eaf4f090457fc3004cca65361a475f8b83a510dae712444a89a44530c0eaec40a05f9acc48afb6497fcb358b782afd1bb0c762389a099155489c7f00a061f51542620e52038c75fe99635f865982dd75d7f123dcf1ced368cd203e98c8ec2def9c7bdea0f6abe306db2cd74a85551a925602c59ac46581985c83ebafcc5a85437c0acdb1af1a7c5b91833704547c0435eeaaa12206d560c60a31a39114548bff98f18519d8b205041a473aed599b12b3b542a500b2a31107058dd1382067c4e28e5c44fc700e2eac7ddd20c2d3b66582fd171798ba51b45f3045300ce032871c00f37a70059b97ae2c8de04735e5804fca5c915a8e9bb3ac9dcd4df5632c25f053baa9208b7eb2b3965e9a7ac7936dfcf9918fee3c6f78d1064746539fe69e40378c1445b9d7835b88587a9eba96dae7984309f18b11a4b6386165baf8d59cd46c4ca10677b962c499ced6b97a1c790f71f3e37c2b4c9042dc4921060d51d3fc1c8bc0d89f3cb293e84d742f948a709dd91ef420e6dc1358b83b02af211150ec116072af7ff291b857008e37914c0fa606e8dadb9e744e0a635be47789b5c34841ff851359b10f3e07bd7a1918584db30a67623177eb4ed361dd7a9813fd70aa0ea3431e7c664f60e032eeec8476c2c25652044271b4ff9b070dcbfd2cb420daa9892a8ee2fbef64efdf6dce9ac3acd339bd977dc2934279838c5f271227e2ec0099819f323b75859084394e04cebea171b8801b76ea0e3087512490d5972ad4008a4df7267943a934bf034a5c799a5178452c7062102d016df3768a4a9169ec7a0cca9e015640431fbb885aa40c162138e9b5af44114705be32741af8deeabdbf71feac8b1d311c3d6c8fea189ae263b768a361eddd267c54654daec835fe5f1a20d4ff1ccc42cc2bac9759d6bb9f80bbaa0c587f80abb3ef30612a1bd9cf0680918cc4f2505667f321df1bfd8eb2cdde6e0518017ee60b10f34f80843bcb7ed975a0733b369f0582f06179142a5b6cabbbbdc07ed87a04be024bd9afcf84777a63b4e51c294f7f017f5a4573af28f838df85c089a9e5b8ea70deacf8d9115558462844543d967225933a154dbceded2c0ae78e7d6634e623475e18874194dbd6e34a3701656524157fc841dda6a12ee4503732fccc8e943330d9c7c21abfb4c271982252aa3f4358502570023340b9d3dad857c8138c38fa9fda493a5135f1e9707fc6910ee56f9543c9da82a11b87b8f97d8994de9426d8ec344f6f6e6cccd7c8cf837c833104a8207e0a56c2faa308a4401316818efdeffc34be2917a6703ec1451f2d4a3a82e59d5b85cc34da111c222bc8599503cfae5bab7a37267eaefc8aedf1dd4a44a8acd09b58afce44ac092006ea4877c0cb6cf92217c4a297925a1b431a08a8ca42bae527bbe327d5e4ab904436b4ceacb452849f3390ec8983701d323748acb82906962fc592c214c680f796199cb970b953ad7f138b803781e4f5a46693c0f737935627ec944b0af1ee5307b0b5ba2457a7f9a48ce260b34ac4a0240feb8bcf36ed4dc1d2d5017bb2cc36f360275e31b2e38b6eb092140c739f5734261a444fd14a568f99af0050332ff6f5f3f78ac99483784e3d78d33521c73c8e5f3dc3db72bdeb6a6734402d4e01cbaa9debc3ee2c1bb06925a66d54faa22c381f62e8e7470318f51b894da01a44183db3814ba298192c41f896cae0059b37dca303cfd36ec9b993c84142cbab01b5571bd2ad1b42345f02d76d97189740f8298634fb385b069dfc25636a339bfe1c4b88703982e512b149cc05f5f17fa99fcf4108d8c5e26865868013a62af0fb04a9f8cce98bd3770a382a6a71f8a2f221a20a0ec0a89385e836a15a329b7c627ba5bfa9816b85fdf5fafb8e6954f21fc0b3596aa17c9a1f11e3e413526329dd906540c583bbf6cf1e37d9f081735c253f23c2961415034a42ba735c30523a4a1b99e7000a519d51b2eab21aef7b9d67752d23c40bebeb8b2bafb05fceae3cc9da6bf47835a22144203a3eafb03d10004610045256e1917d04d43adda97f096ff483fdb8841861d641da717f8644b62629b48556f6e69601cc060a072f0734de7673cee9f94a847fcb7936d0f6deb79de7de2d6d407f48e8a6f1f5bfd8c55fbeaa41d5e05179ffdf73ff9dbaff348effec9e79e8f7671e6a363a743c8b7dfcd894dfa4f9c423adf9442ddcbbf67e8f7b18ad30583c8b8cc1a65a1c618c1ff514ebe4e8e4fc8e1c1d1d1d1d14638c31d631678ea923c7df508ab30ce5661f953d7c1929f1d5f5505907c477669f6e782509cc46edfb0ea4841281d164df779747f11d255708e9897ddfa5f80e1cc2cfcfcfcf0d2c78458c17fb4ad6fd6cda97af3e9b2c5eb8d1fd8b4929b4f815be8afb7ea60da1d8d378a761088d57fd89c63fd48ef8a01e48dc180826818e9f3d26819e6fb3ceba771fa740d35ceddec629d09f8e5da2175fa1fe7efce2abdff723185f95fe7e0ce32b197f3f8ef19d67dd7725be03597702321eb5698fce07e781c43d022db56c09838df3f4518fdfd29c73ce39e7753ea593a3b323e7eddec1032787ea501daa93d31dc136ceefe82a20374e373dc541ceb1b877fde5de7d1b61442d8863c1249030b92353809e454224e171ccd9531a49e0202b7270671c64410cbcecc91d8931e3e217f7ee532e8271ef3e095c0c2353f72317bdb877df6ef3ede7781d5ff378ea9833c7d4316f72bcdd37237443ec46e5787fe9f8fb9e05773a74cceecbd11dc136ea6f4eeeddbfe92a20374aeeb82053f72f8eeeb35df769aefb4edf7d6fd37dde8dee53d9e83e9efb55f3a97919997741ee684fc9fc95f91932328fbbefa4da321fbbef653eeb3e4fc665de761f4f0d07dd93791437dd93f91a9c754fe66970d93d99ef91272e6e19cef433b8cfde1781a361d2705fbe3fc37d7acbe090c86d5f8633fdc64dee33753efcbeca57f4ef4357412c577bb84b1f37d6e4478d05f9d94797afb20e89dcdadf77a1a4b95c0b2257d9df7bb3c7597ea8e19c71a0c407b67dc7f6ddda93afe4dfb7813fac6c79cec309ae250e95bd7e1b582d985e7749b637fd8d2d22c52c86ac7a230bd76cfefa58f7d1c7d9e3eec345b815344e881168b47126e43e96547373ba207f76a816f49bdea4df06568f5f0cc33016f0df2e43e23b3f9619a79d20fdde1e4de3e6c62ea63fe332966559a6b1801ffb8ccb1dc661dd3759c00fddcbac06e47eb600f9baeb913917c3b04bb19fd8bdf73ebed8c522162fc69edc99ac6d8345fb7fa78cbd0bfeb2af7bd91777dec5bdab857b4759b4bcf6cdac102d3173b248e6b41a56f1a17df1671cce1e66df696719861f839e715fc658e752dc93d808ecef67c3c6f9b1cdb22c8bd1de87b6c7ef95a4a08dfdb5cf822c56b6f6264e7e912ac47236b4686bbb22eed505cc872ca82d40bf942fefe38cfbe6c6fe06c9baeffe0d2df49759ae08b782902f51a16388c0fddf707f704b11af7ec6c1edd9fb67ee04f7fc71fecbe5fbd6667fa5c682f6f65d6341fb7cdf5ecd35adeba9ff41728fc4b9c441d6dc1807778ee65c0e7772af66eed35e7318d85e3ece1cb68f399bfdd53e7bcc4d8d85fcf7a9c6427e7b39140d347eb869fe8cfb92ec4f7b24bef34395c679eee18c6a3ef831e6f0b542e0be1d12dfd9631a91986173db7451a4ae20c4dab4a085ede573400b59c157b9fbecdfaf5f647ee94d1daa85ed4d6fea92987eebac97e06f038b839a4fceb2377199a943b5607afd3a3365dc7d130731be5fe220cb94c58dbb2f6e191cccce2c0759a5ef710c1ed5084527b4e4204b4d9a81929a83510f5e392055c1b02b48ad6d37bc82045497e00b2184b04e283f42588d66ad3c527250a73ea5d7be8410c618e1a79a50d60ae1b5457018aa19e30775788050077b40c3ff6ef6d74c085d7631d0eecb5b674ba9559540c7570da1e9139f10ca19213dc19452ea24747ca7134628dfb7b41fc8363659f7fcb5bc50475ba8937d2763b9dc47e826b48e3d5e4a0879b8ce6b799252e6585fc11d52e25408a1acd22455c562104259a58957c5da2a4d46a822e5cc6e9ea82a747c2aa5941a45458e1b0827a538f41863407823a91ea39372564939297ddb6cd3bd97522761a39bb801a10c191b33326a6650dbcf4f0dbdfdd09871da9f945242086bd0100185c7a8a1f9c0873452ce684f76a0e3beb1030d77ecf1ae898e3fa5ec7890b174484a6973637b1b1da1ce34759c94720a9584a4a4f25d1b7ec703754989230b512a250ec2d995568f41e9fc4f4a295b1b3ead3b60c6021fe734a594920afdc4104208e79c73e664dd044fbe41c7afbffdb87c611e3ade8347545dc0487ed78412f94028a1ca042ce09c780c2d5d4a393b23325e7915d4a9f731fb18a5d77a7fd25560292184fa642ba512fb1eaf34bb15cbee4bfd3005bf76471842c8d90da1ed3e7f775d4f1ef59c9366d7ed9432039ec516af2da4c82b5b40d970c72c682045842fdb2d0d0e87c8a2f1270e87c83a3da622763122a1fb6fb6d6ce103f6e7ff96560d7a8b1c54f9acfa49452ea011e14e1023164e08412312c2aafd8548b4d29a594d292e6438f4c805fce06a874d9f3ad0f7bbe5692b4e79f3890c49eff1dd8b308871ce068c97bdec0c59e55ec59a401a23d37a0813d4f0e6002840c905c5c5a37482b7a002263cda77e79d39fa941daf4e90d526cfafaf4f3f47afe69fecfb8823d99ec39e79c130651004d362dfab1b271bac881b7e7633856cc31aaec1e7b5a0a1cf10225464052b8baa8020a5136e18f2124418730844da9d6aa3927ec81104ecc608a1320e48035a9d89387277b6e7bce39e714c38b4da5a8026fb1bf9a3153e88c19b3e79fc4c8e1a7e068699310b4709281789578d0c2d35ac1a2692188e143e672e51e9edc1fb0102efb812a991322c05c46370c2e7ea840fcd830907ca043d80e4da607c2d40f304940942d53784800105f4ec02401415c19738549027e70c9d4a9073327d8c04d074070c4848e29acb8a20ba3656c78c50a1c8ca0038ddaf08a15629e40e9e28a12cc6057ae7805e1ede1cd37bfecfa78e3e6c632bf6d8f711f068236f632dc37f7f6d8f3e6831ad2384f388fffacce7f3ac777fc6771fed33bc5b333d5cd7f5e0e1dd9089997c95666831f7358ca2f3255bfc6faeaf49586564343692d99aadf6997f42ed95d7ae83b9348a6ea974edb64b2dbf4d0eb9b7e16a13f97b2b7d7be3d8feeb350f6f63adda73dcade3ea77ae1a9edbdeced77749f05b3b7c7f12f63f6f6a9ee3bd5972db913a5786a7b23f6f65ef7d925f6f623749fb6b2b7d7d17d272c7bfb1cddf7dbdf749f77c5de1e47f7a9b4d8db77ddc7535f1ac99da8c453db07ed0dcadea2eced6dbaef5421d0923b2a786afb317bfb1bdd7702b3b7b7d17ddacbdebe467ed91ed57d76fb1adda77d7b1af54f1c746fbb9946dbd7ed6774df69db9ea6abdbcf74df697b19dda7b79799d184fe2c2a07487f7657b9e19e4181fe8cf8981be7524cf6cbc93506ed6ac4ae5e760dda15ccf6998a18899c73ce39e75c0393496f5a6793496f5ae7ec9ac964d24c264d3399b4f61b06b466d24c269366326926376593e7ecbee59c73ce5ad6b4d63967ad75ce5ad668d65a6b9d73cea66cca39775adc9e73d65a73db6f5a670e6ecd4116d51c161ad6344d7b9c69f526bbf7c31ace6ae5a9d5860b1d897c55ab8d96cefee2cff0fdec7259f6a57bef8da5acd4c1ecdacf4aefffd9b071f2e3d0501685e290943824f3b24349ed6d605dee9b44f0671d3465ed332e0e452951c8bd7a1487844a48b0f41a6670af9a5e86436d1d646113d72304bb0f7d65fafb996b2cf8975e6a2cf863d997b26b7a24bedd3b213deedd219fdb75487c886afb0ff92a4ae9913b93257f76f625eebbf97d6b8a9c6c109af9a25f39032d7bb4b3ffe6be1820ca1ed343dc687ba9fb90ecd267dca79afb6646f22e7547b0fdc58d3b1954dbf55f4ed34f33de57771ede389957c91d99afcf234fd5f3fe2bf4aa699d2e71a71ee852ad5fea4e2822b4fdacb1ed91a9faf8e885cfd64605fa9bfbbee6a034552db52ad323370eb230219ddd52fd9b0080a1f17f46543b7becb52f7558c31a2e492c6d0cd9dbfa7267fbfa90de9ff7e7bdb79b9946247bfc978b21eb50f7b3ffe2d61e77a8db01891b3efe4d0c2d2477344cddafa6126744b5b5eecbbe02ba12edfa35c30fb50c7348dc66d03eccafd98031c6da67af7132a8760cd867f7628c71e9fddea37d1f96bcd3b823b0c8c65fe26450edafc88e417bdc719fca5aad4fa7df9fb733031214115a0bd58f42a5afdeffe9a435e5a0f6d86b4246545bfb1e5f80fced8ba8be6c44b571929dbdf6fd8d9379992ec985a2035b10b1926c9f4f805e3230630551bec428fb666376f6706f1c64e58d83aca8b110b9237267aa7dbbafc836a2cabef268c485b9f3de1e8f39fe843f4a2f3d9b263c279e14cfd71ecb587aed6fbe13cf89a77c3aa79c99d37b827bf76d8ef46538b86d9cf91863e4296d407f3546897f3f42c9321e3a7e5c29dd5ea642231919dc6737ee5a34ccd97d325c2d611e95f7fdc60ffdb4f16bdfe191a9fbf8317e8cbb4bffdebf9b08dda769baef34d37d2f834786677f3cfbbead9dcce3cf7289a31b6a406c373dc73d3ff8da7772a6d71a9ed1353739fbde9f164bcd472b3dd4b412d630fe69dd0b9275f1c8448322225cbb66c3a2a131f46967b9f8f06dd0f00546afedffd92371578076f39b5f1f42ace649dcb0880825b60d2188d0be4211890176473024db8b8828c26eff192bdbdfce9753e023183e8279d9bec5741f47c7254d3e90b84bf725869acf362796b13232afdf723240a31d83cc6bfc1967041a590befcdb2b7dc872dfc1eb7dc6b3e310c11185eeceb40fb3efcbcb5efc3cfa3ec1b66df879f2bd9b368e8677fb14b1629fbc2a229506e1cb3af6bd957aba951f33d8ec5bcc2006d39dd48a37d1fead0c1b21c6324a6358de2564d81e97cb520fa65fec4c1ade2a217eedd2f5ea6e8fb70c32b4210da0eaf08c1b57722ebc22b3100e3599e6d55db7adbea1ad4dbb7beaaf1f6b3af02ee398d161a3ecd140d3f428aa5672f475eb8e7d3639723a39adde533d4e0de165357717a805ad4e0ab2f126df7e25e0403b7601b5af49c2d68b13db65a24e27ce3620b7e396ac00b33f8cab6e01e14a237117d2622d2b42eba5a4cb4a2e8cf5d76cf7824b7eeb3fbbeee4a5deebe139eee823a9ea7104ebe985052469446306af52bb224dd827beefaf92ee4abdc7d71bbcb85b848c4c52a5b34177c85bb16acd52d0d88ef38330fcc5414527ab41662a5f9ef51a610eedc05afd80ea9171ae2c65ec6c31584b8e71048cae03c8aa7fc5d447a76b14a24722ff5022db744a2a3cd6f92e4e31c02fdc19710ade2abf8d60ab91419bbc81dd9c5fd055ffe822f7fc1177cf90bbe5ede492fdc93f0058d1c4ae9afca791626a216f754c8417fde1385bbbf3cbbe753be56358b6779b927fdb57b84c4e83496688f8ec53de9595e355bcaaf9942b70659662b6ea02583172b49068e909f24034760ced66089d4af118b9c0f9f570cfdde82fe93a399427ff28baf32540b99b65987420064bd4c798f195cf96141160e91952589acaca33142b3bce5b28b55b06abbfc327fe49725f4e7cdd6fc41cc8e9383f61d3b94dd79bbc77a020d6b744f15b74ae59e6f202f7d36ecf8393741d812a7d4a7b1443fa553809e553b94ec6640e229ff4b85feb26311b9938a4a22d0cfcd0d8685be0d88b06899249aa0cb0f2f960d819effc157971e2ac3c030301899814604faabd9943e047cf5c96f40acc13d5a43c47e6a708fd6f0c3f508493979d52431d28fb1723570f1878b594392d2a61f8776620d8c282cf2c08f119b46289bfeac511be2dbca6cb9195fd8e087e51a9148df0270e7776e58c2e364d38fd6063aa69848127f6a708f86d934bbf25afed24359d2b8e89229fa383de80f7681c188afbe0865065f7d3c4e3f0ab18468ce9c4d12849e0f77dc92ea195d232b15070193a01f160d10da1f853d8c55ac6462f4fc8a7fe2ce88a7301757c005d00f2b35864beec02053f4ede9f33616f38e3660a06b90a04d61e0b19ac7cbb376309480d69bf927d096cbc15cb4765f1cdad4c7531a7ca2165067629b02be88125d5c78dca31f454721fa2925b4ff175d41bca20bfe2861d38f51e00fba693cc1a6f1884d85d8f46b6624674e82bff438678f8b8b4566ffeec93fb9274fa69729cb17fa9bd932893ff90188172b0bc1c495dd290afd994c2f5f5d7b4a925f2b61cbaf813fb02d31ec4b9ce572141ddd9b7fda46bcb326233a0322138664d397e192c8781997c28b18fcb06630ecb1e77e1aa1f337c057f163adff59ae2672279a24b0ede37fe478dcc37ee37adcc33e05457fa78d7d8dafb40e45e47e7cedb3c7fea471310a2bc2bc583839e8ef1f8561188e18f682afb4c79e07fe2861637f823e99ba4fdbd77aa40c075993a381568e86c8615f514422ed50447cd3a75d0cf47d4316bcc1ba184c47f40618ded4c7a79ad2f61dd780d10d96edee50cb9433c0485f5ef1f4272e3a6aedab4f0dcd6e7e0d9ca7d4c90915cd4b7f99d239e77cf7283d6dea353841e82f4bed4e66cc4010fac10b9a332e49bcc1135c5eac6c08204cf9a179e90f8e51b2637c81a50272d93052317412f77082d05f54b2e74ce23f754ecde68c835f4801f3858c415ef62c61f19d080616b9a2749132b427d19e56f6a41e95f8eaab81c1575f5462c457128b3db51ea83327a5a2673e00431709c095d421091018edf9304c23f412a0a7d0facbd4a45c04f21413d66a4de7cf39ffc3b37633b8373d2ef457f385fbd588982085095eac1b24d2192e340525d6195b5d04726fa68cf457b3e78c46a630b01f813fa4ce1c8963eceb4408fd651930bcf9a24449e9c20bbe028a507c2742694120ca7623305bc92cfa414ad10f52c228b1ad2a867018611129837d6fe071d19fea42db00f7fc5fe85c70cf534cc82b72731ad0e7febe98ed8b6dc9b9d3224e9ea752f1f0c018e08e11e8f870e6cc39e5ad3ea984734a5ae39ea45ea5943243acd259ea62642b96e13ce79c73ce1df8b0a58efb2ac7389b2e60cb0e7a5407033a076cf971625d843a5e6bad310729c3f4e6ffd249274fcd296b72466b1faa2154db3a3622ba55713c50c2137222ae296c2977ba2939e851fab24aec8bc8d3e9014f24e28a711bdec7b6fc16640efc5137c4f4e6ff6a43e6a65f13e7f44aaf76ca9a9cd15a73195bf022561b32b7853faecd63acaf2016dddd5dcaee9b734ecca9d329a95777c7b42173bae71617e1e898cb59ffffffe9fc6a7d55318959b737daec7fbeafa0fdd78cf6a3fd2ca7f9f1348b7cb0028d76d022d381266e8a3ac045910f25d8f36dbc6042f952c384cb961e7e28eae10928ae3d1f35e78458c82a5aaf39e79c35349f49e349159bb2c0524a29a57409189b524a29a533341f3a7f4c1c4eae3c71edf9faf473ce39af08eab2e7fb9873ce49a3f9cc160c367512824d7f268b0d1634e061a2832c7828e2e1064daab47a90b103a8065c7cec790209fb83589668d161891d9cecf025e8057bbe8ac757b028a8067b1631a9b227ccc20487d2b6448811b40fb8cce460250a201cf62c02aac19e6f0a3182a1602818303f6832864e27c0d08904a5130c9d4800d1e408309040028938f47148074f3ce1f5884975a0f309a44975a093ce8a3469d581054b66d24c4a92326926cda4a420a8a080028a4985d6a04aa148a235a8d24a6712ad33a8053b50248a8414231245a2484827b993318c3d722be627315b02099f1004adb4d24a2ba543d02692549fa3e1ac65fc0015b723e949d293a427494f628462072ba66841a5934e24a49905cda222515a5b406b16262862082a545a62c4505a9368a5b2821534f124a805954291446b50a55024d11a3467a5930aad41954291446b50a595ce245a67500b76a04814092946248a44919080d0128356289268a542694da295ca10ad24c450a14245065b2bba9c73524a6badd8635a9079339cb592496f32326668449871a251239f722bff0077ead194ed390432da019c158798a8c9379af000ba91a3fddda296391ce3abb81d5c87d3e148e1b8f16e72a4600422a0193974e8f822945ceda97ef993c7b3e5d0cf8c7a646d3d3a1af244d080643b0e69d19147c8b935c28d979a82438805a98cca692b768db887634c42e2de0cd8c5c2d2485243181c9c1d9cd0c9068b1d29d0f789727ebb433648c09ddcb2d95f1c8a2948edec724f13a1c3a3c90d20a01b7a043c7ad8e8a1aa51a14800400d7dca9ce6847be18636c5052b77305744480002e0e364a3f9c8125622ac7668f26b874700299041945b32959920c2f6d6f520801f536484720beae820840300013861009b8f120680825ead341fec775428a85230c5b8aad895518ffc62f5063c3dad25a520b8135d50b6d7231a814c8838c41e1e5d310e451c504041f3998f8216646ef959e756c59bc625b6ff975b44461c45132211b0471150a7de200e753aa4d033250b096516f46c9ac3fee210de3f48fcc0259b757da8260a281040a5825521cb19ad6bb60f100b6405868b443c34273a1a90b9f78e2e747cac82cf901c54538f8cc8addc7aa21e6d7f5d8304c53d576e0509a2f9cc9fab0991a2119168e888204232843f5405c0af7d7665212f0e01b9a147a0e37f712812c9e824b7e44e1c6a0d0df1d080f4d89108098d75f0900278018844222b6408911882298f45c09ddc6a29b1bd75446bfbe3155424a84adbebba0962c000030c1d281125a24450c48811b3430880e40efd583f3e75490a1f3b69efaf0db6ff47c2764a34bb7bb484282392ee52e09fae282afa93134c29cd72a9c8f4aea3d1863d4cccc4399fa111a18a137bc259f6492bced55007bea4915146d16fb094ff4d5ab96ffe279fd23d9dfea436f276c3373fce3973bd6193e5fc3c67c60588b71d33919c57995d8723e3c071934ae1c07c0507276b3d68275d4bbb4ec7e1b8c93c72dce810f2bc11525a95b3630a69123266a2bbd676c30d3730b1ee23534a573b797a76ef933f4bf0b11280e603797ec0592995524a49a99454d2ca7dff83ce3921d498893e217fd9f086ac848ebfdd308001a080420a73ce14a49c29ec78520552174f243181a482b17bfb53bc2a6a00db39a747a18af14f609c7af4e8017f405534c1a454cc14e344b461f4494ed161e25f4142421a02690824a4a4a4a43049619292ea95ef2bfc14bb369b50f3b133d7d69c7cf0dc3c18cde57832079f736639bd08dc49fcdf77ff8bffd5ff6486737e9cbbb8b32ccbe89e7eb138e7dc74cf2863f42c4a2e1863bb4eb9735e42476acab8e808c4dbfe8ea913eaefd13bc9c4104843204969821851306bc5827a8c312681c481304961928238cad2d343a4a58e0a3d4ee89997d6f3d4a3859019e81d1faad3abe03d2f9d5f4974081cdd055a4ad752bb406b0d7fc0ad030fe7c95478a24b1d68a4b395393cb007fdd3099e921dcf165d827f9c3c3c1b67c31c0f0050ec9ce029ff28348cefa9dd83878707fe807b8a7184081da450410e520061085c4eb4525a4d18e3c78a9790173050018bca2d9b5aa1021af860a30bad673efd3e06c39bcfe6b5bd078e3c7422cc89f047a438358579236cf857c78fe7f1ec1c371987504dc7e53f9d6c367cbc01c9ccd4106106d08f19d92b7bd98c407f343441befa8cfcd028a101f255eca67b10fea0c164c85e3b86f95bc64bcb90bde46730faa3b4c697bd7209f447f3f3d1fc6cf9ae015105000c3de763b2eb26adf27ac5ff68161944d0ded86c74eb31571212ea5c2d1c59e886da1c3aae97dd0b637f343f22f800ee4c30b65bf8039e2c8771f08e9c93b38c537116eb388f1e793a8c6ff3a2d1008d255adbf0dde55184346a88ffec50f4a10df15d529e6ab8f8d08d94bf65ba4be52e95bb54ee52b94be52e9554b9e89429272ea823a754b927a54371281bdd019d7e4363898e0f7dca9aa8024abae7dee7f990f8543efdc8a168173fee9be8797e558d917c61f8dc04e286efe3f240f3a89cc4c833777c11e0a883f60d8b8474b0e3c392acb1a2e50b5366bec7f10b7227b2be5cb1c5048d550d08eeea75ddeb2e8fe255fce5ef595c8bbf5fe13b51892f2ec557b0e80340434bc0698018b1c49795489441e072c1702d7cc13d18b01c41000677657b3f35866e657b65b2307a09f7e267895988300c7a9095b7f316ec1c480920b933e345f852f7599ad7ba4fefad9b41eecce82c4d0753faf117add03069981c12ba923f1f3f37e47f7ea48f9ce9e2123ec34196e66224a2c2876e3ecbb2a3ac79491f7aeff33c08289d7ba8b4cc59a972d2291a11010020008315000020100c09c582c15814e581a4fb14800c7890466c5418cbc3b120896114c418638c21061840084008019a1a1a9200f86c68e5385e06638ec9ddb4f1a812a485b6be04d751345c15d1a18933875f8d1533f68a1be9c622efcad1ddd0f4d1095e85e5b9bfe2e1ccc4998d6e4f35e53a8bcae3f98dec663c3c9a3acd1ba09a344c939c3ed6185577e70aaf83986ead3a4b5653b032655d32ad942d02d283b128c032ef4e731605c9fbd26eee4e739adc8d11cf94a4409f91fe0814d365744d2f7e5adde061f98676e33e225eff397d54fab66628dd99565cc744fab4ea50b28d02cb206ba96953b608480f8c5d60d6bc3bcda11844ee0bb679775ecee6e040ff7bab02902358d0834499f4cd383218ca7fd2f60610e8f32a374ec3dff4896c32b91baf370e6531ed9ae7a4f4c38a1d86eeaaad557d73b536f6b1dee3f2401dbdda5d5f10ff922e02a8440161b66207fa1f86f52dd33b9d8fb52d6f0d3febc9325f7a45ea413ac30d727f3f3876f568a9a71ec2b9ce620f3096d2fd918523969f70b41731a3b30f36cecba9c34967275f4d2be47449f580ee86f463ec127d0173e20ee59d387f6aac6cd219631dbc791f30f6f50cfb1de3caeb4a4f9bd68ccd3b7365eb484c5bab9cd5c6db77a4f0bb72c496a1cf9998f1e09bd0599df47463d55192fa8295212b9269a46411901e8c5d01b639779ab35870de971673779883ffe0feadc8fa35721949e266911dca9d70fe6a5e91b157dc906e167d5718dd86a69bfeae5841c81f318373d00c52212dfffe4e02e618ae682e71af5f7a2fde288fa47306e994b92b53887c2d124568091544638d741a29c1d66a2fde2c115d657de50756171c89d227fed82da1e4de6de87ed066a6c4987bd8a487ab2c20397714d9e27b10724686abdfaf7f647fcec114929f97a44f6e8ce2083db2886ac320a3f46aebe094460ea0b8464211e1621ad1e69d941771571300c58aaf09ac5673d2e4070c5b447b6a6221ec680e17e07df0946c9054c0813a0e5f14cd3bad33624781829ddef214fd50508df7ae37830e916f160926c7661164246709db969ac3a3fa8c6d2a52973e4a18bc756a7af075b9ec5d7c6bd0f8d2b22646ad8baaec3c52211af3bca5770bb7bccde214881b2dbda809337fc66711b4e44eda561c63d5e5c918286aefec776e1914b505e05200421cbcb19c11b404504403316a6861b0e032105e6811d9ee86d6964400a0cdbda1f55c6658d8c34037923b633cf74fdcac82c2e1c50e934d9fb5a4e2e3962bef61d28aed107129404a8c4d2025b3aac8c39e57a80ff07ba2e373e4c191d5083f64815a95b08206dd09fcd0180aa44ec349654eaaff7595339379a66af15cfe44fd04b6433e0a6192fd4d4e9f529dc2d98e812dd00c3bef85e0658e187016d2f4ff7e67b7f543b287f1d90f3b0746a000cc2fe4b4877bee157d2cc8cf6609a2e1b2054d536f969f2bd00bd616de5816177e8aeda02152818b5d807ed3dd1dcf202c02574db91bd4de686a83e2ba4180a4a9baee5d00cf45d39d42c0c602bb70f7c65dc9e97a83f2433869c7316ac10e3086815e749ab73a1f23479849b7e242bff751f846bca18930682daea1fa4a720111eeebe9c7e824f62d9d895d549d7a17f52e6c9c44a8b09857c407de067d6bb53eaa9d4fd0264bd2ce08d12623427d1016aee46d4e0a9f7fca0aa901c4f2a9d37d8580616e30cece68cafee8a17be5d1dd184549bab6f5175612982dd4862e1c74b01fbd75c94def02e658ec13a15e2143c5942722bc0116453b4156965ee5c0192e33e2dd7b2e716cb6cdc579db656a3d2180da47cfa8cd6b44a769784f13b1be81503b22c1c13aa4e6f9a80d65c2a7e67b98efbb4388d9610b2561b432b8493127064a3b101e488c7920a2d8b9fe93d498ced96d95013708c41c8ca704cdcb5f79f8a903381c6992d0024c109ac0eeef61bbc1ff4fa9d2cd3ecb006aef865142dd2827de6ed3562087cec1b28e2bc5102cd49c40d78781d4ef1a093b2708da8173c7214f0078d409ccdacbddd7e0a99d47a98cdf35902544f837242c8d73b8f467c73165d6f76b2ccd23508d3cd27f8e2189329e0d7ee170cec8c436378534f5449660e1a0c84179dedd8b210604ce60928f0e5536c399e54f260fe93bee9eb12d48d4b32673999892b84f47cf87deb682928b9dc0a545a820d49add3d920d240872e6da3554acfd8240b5df0c8319a9bec8ab183e3b86408dea195f71aa3c0624272aa6878afc79bdd0be419bf3a5feab35ff19cde658c9aa1d6456e524a307afd855d373503a5b9481c5c55c38a168ccdb32b5052091b0e386cd9a9ea6d6143d08fe81a462bde1cc07e5a1da4eb8f5c9269296578eb890067423c77a053ab4960d992403996ea21e3a4a96df19592273fcc5491b5a41f340ef1e1606ddcc34adf72c052d277a3e80c056f57340080561830a32a1152d7cfdd16b0adf3640e623ce712d48b3ae2485ae6eb1b1581b18cac73f9c276dd4015eaaf71a58747ea620c888ec4289c33bb2486f64c1d703874124e1a992b7ac0cccb5abf1550938d3873a3976456e177541cf503d5f9eb57432f8a4d14ac6158d26ffc88bb1a2646488139e54f97dec9e2b80570431bbca92bf77c9894ec0a47062fabee6e217f129f47babebd6b3e455ddd6427c107c324856ac476657cf3e6f24725fd46e6d395f403e8966a677c2b89466291736635160efbdb0552c62dec65ad62c9df3b30a3faacf03f21e372530e2bb18c36d7a68b826ff4aec1c5c94cca9c0405fb8a5c74d980fe41157ddec0c3404c919daed926fa441ab7943580fcfde943395bc920ecf4c4683ad188269be07351ab1708869759e727d25df434870f6ddad9c34e1d21352f615fde6733e82b8f18c96555551f7ec2bfe0a55b92caa57d06d78d99cc6b97306b838f750e0cc4ec49cac3546ac9a40c7555e973b179466718248e81643d3ebfcc8f5360737f8c75609090154074b1795a2ad4a961bf9aa57de22cc1c2e3790d58562207689e94e404bb7b918c4940c2cfaa0d703a9ce37432c3f4364cf27242729cb65ef41d712f0bca6bb3c8509b930298ea1a2a280e48d792f063028dae4afc97d3675759cd451a46a0b5adf3b07c6f92d942ddda76fb99ecde9c3564c239c672cb487c5a13d3e6c4a98c5a891a1dc92f667c58819edaeb4d07f1bbfa41997c507470913a579f810387f1f8968c6ba05d4136d4fcc65fa947913bde92128bef3d556af4cc343e39f4fa7ccbb0e8ad528f4e1b0a15fe7a562b27544c5880501ca0398e7b703339d32c5148007e3b5d503f1ca9d7d174c9a13331d92348c6f6c0eec9829b5a617e993b17499b448c4a99b7ddd8f76182623d15a71a603491d392147ecbbd44337ef17e634d0bfcaf68515e7661b5e8831dfaca17811f019bf08976a9404a11db8cc9c5423adec584737e6261fa63d172fdd0e271646317d5de69b06d5282d9d313832a396238c5e9259e7b13a9929cd5457c4d83a31292463ca4ea95459e62dfad3b1079c5fe108540fa91468a73e313349980731c02d198d45841dc42be23b647e189603933b21691657c7dd65c06fe073fa4428789f09a3abd382dc67651090112c61daa9af4f1160d62f1bd44661c8c507e2b6e5fcdc72abc0b9ec7481bf6dc8eccd54800a7096b09b6b6986cd0b7636f2310eb5de7709b125c5066a385831ab496abe1ea97b4c291c590ef4caa8831c1b4fe0c5040610c931aea0ca31d17b11db770a6115dd9b80a7d37d57fbbf41041603bcee01c49720c8c3d56f4890f5510c9d46b6828db490137168ca348cd47424757505d7471b8e0da7de23120ca091af808ceaf9b8520cde2100d9ab28cf6a73c47e381af2d0c039bf9cc3c621c212e8dd81b5b30d0d647939845850c20df85eeddacb289e524418417a8c58f9155c56b47085d12d3defa1d71f3e3c4ef7de33486415d09ef6f4109ae50d7aed3b0652fe63826ddcc78b9af480f5126872c3143d6472e1a0a83ce05aaa7877ecf82e132baf87ce274dd96da8dc9b28a04d2d3595d3a1fde287da8cdf42f50e6d2477d2aff305d0cfcb36af1e602fda1118e2913b0cdc12e2020ff1bbbb25bcb01d801b05b411611244bbb57928cd201f8e78b4dc52fa1440cb0ad6e43d292cc0e306220a0df2566c5ab09dbaf2025d68c684ca4cf8199946f3f945ec907aa5d5b3ce8df18c6f6c8b44ae35bff2bb785f371e9e0a95c6b1c7e0a6c412cab3d0d17d764aadea19b715df9d4d09b8f9c73fcb495c5b338bbfa8d049effdb61f50090c94d5018ad68deadffe411388a0abab41678466aaf79b89f7a81e72d325cb9fccc20a128e432e83e4f74fa583cb8f7dd09ceb2d09fa40f4f7a57bd9d0b25a0f77349e8f966387c53e0f29b79354e2c6f514382815db18e6ed4bf8a3d0d0fad4196d49d906c4e86e6ca98f302a44f43a003ad6dc25e317b76e1de36a1250ac8516ef31150fda77f0d54e02c0393f83384de65b707bef288152bd82d50d57d0055ff5a224b667df50308d157771c449078d1679030f911a241f1d5bf7d5856c018628858537962e441620a592e8abc811b34cd26af87775c739271f4dc1adb581b3e9ebfc539f6748ec08a98e4766ccd40bfc0e44b36d123243845bcfadd702cc93d5f6901583b275c9eb7fcbb7f795a22d2291cd26ed04d29bdf1f45933c70a75e019e6c62368b4cfb7603152863dd57085625471db56209f134835c50cb27b96e0e3449a6e3d61e39bc8dd03764b561661da5ed6bf21433cd0578b92fda0a41cb22e78a42dc0b50fba88311e05e16088f23af64c04822a884481d795d519fc47a5b003ae9a5d926bdea03aa8eb5d378f7ce6f92bd71e1985efde1a5cdf5c2da09a466c2befd28e5447a8f25e59f6406628c787ad95fc01f2c7fb904d1c8d41ae6cf87b9d5759c52913f91acdbcc4997aa29276e013b7f08b91bb7ec451293e5f1ce2e05ee7c1c0f99c45a453854b007bc16543da0106f2c326dcf7e7473562efe16c595277883c675a672bf5d0bb8ed3a7341db245ca9d8300cb1eca94453dba807dfccd114453d0b4533695a20be99d42067f633f6c5300a26ea2f209b5c0c875521150827bd9cb174a3ebd046d436d3e5db859db34f3aa6bc218db8ff5a3964bc47eaec6ddb09fb0a5d1f2b9d812f8967cb39cf4af31b25aacb009b48b17eff38a311a77d7a12689ed0e257150a827ae939ece5fd4c05bbb1102215725989602eafee8158e36939d23b1096cab16495e9fd5442004eeaa4b05487f74c7081cb76643cafe44c3f9a7f52ef679a27f31e03091ef7b4cc10d41682032c09352ad92d7c4a3fa44cccce429666ecc5e9fb98d2d637aac784c6bb85c7866d2983a738006f2d3985604372ef1fc0156182ea6463d796b2c739902d1700213357aad8e88feb3bdbbcdc7e9a877a51eb54876223fdfacc204361995779da056126696199087add46a61a6710af68fa91bd8a2987cabd803720189a6d1eee010e2d830a2244a4d96addb4b3aeea8a0992765ef5b1997cfd03e6b1f51fae907e044f0b041b0070ca65084e349ead110311197fcbf9bc012f305cb8a3f5358917a195befa41fa33d0a0f25b9769c202e96d06fcc6604b9b1b1177fbfb4c1d72dd84dbd6e07ee1eec778eeda1a7e5e9b4b4fc86210d902b65efe73d353930795af9b055cc9ecb8305fdfdc238c882c0b06f10f7cbb32a33189944864e2661e3d6cb7b9a26faae2936ffa4fdc06fdb806711e6c03b37bb816070f919a6f59a9655325b02b088a361879bdf6133994e9cbd687b66418882b7341ad55bb7c7409dd8c1b60ab5b4474c7458874edaaef331bdb10164a7681d625255c3bad345da2e2bf3de71a1009f09ff478bd19775aca8683ca332ee0aeaba98130277541048634a06deb8f55d81c5a545a7b1cd418b030c612451dac9e4c562cb4cebcc26297740f323c1e46896f41e4bcfb5c86e9ab44f80af9bc819d92f6fa8217cd320530d8b09393afbc7af08f81171fc1bddae9b08c8bb0466f43fc77092cfd227b850074623d6b73d72ffecf0dda4f06c3603a79ce77f0294445dafc87a6e4cee2a70cb537e51324c14a45e8f55c93d498d71e383d6021e58e5c117b004417ed986a86a98add042ed9997a684d5a58d86bb287ddafb348bbb70592057bb1e3d7138124e036fa459553a1024645e024a9c4b1a62b6c1101e2fb3cc149bb57f8a0974201e145978d551065313cfc0a41ce388618ff7b1fe8e3fff9764549aa4eea5898446e928fd75cd6051a8e712bff58798dd158cbe20a2cf8256de2669b1e5f8f8c899fd74737c6724690859686ae059f3c3abe210f5e87cb1bc7d911715d4bbd14e4a124547875c4adebb79e42bda075274d5b907dab445123ca381df1e32dc61409233adf97123c2386e055317f0740980b89450ccdcb60dd8d43ca40ebe850d7db8847be6cb9def86619fd731454d597676ce2bb9147ad034c69931716daaf95175a3e688c904dbf11506765079701993bdb917363bde7d422708aaae36089baa01eafbf790e93623cbce95155163c464fbd8a848082db292d0c73836a9a4478b52cc0e37c40fb388464f5e5846ae842dc594989a1b4215c351548347a9f9ba6247dc3e1456f2f95dd674c349357e1f005516242a478d8d094f2c6d5f6e1b57e69353b63f77d8f424193f5a0173e0b136465f29263270106acd22825dfe75c0b7666021ca260ee3eec09aeba6351d3d92b29586c9b55c232469ddd6e94bff492f7ca0957e3306feb7af2895bd71b5eba75e74febadfb4e45dfba4d7a0eae1b5bb7c7272517ddd2b44aee523ff9cd1850e61e247b72774683d73ca0dbd6525737823c3ae5d92ea4ea275d8c81c54fad3cdb3460c60d848b5b23b8b6703e3c1b9db535360b4f9b3c0751c9e56df0df83a9abe82bbfd258ec178240a561c51ae91d762347ea34000624086d52f1274c3e9cb0bd5db75243aff4de9b4b281a7454e87c6af038422410876b9452b0d2295d5dad864c348a34774566d04477c172498a65e14a4ed6500ea285e51acb6822412230d9a8083328b5682c7d18de5fa8aa642a48193b3d9679f603381114ec3281d277b4d925bb86fdc801dffd39b6e5d51dfc9ca5f9b35620b708f7b975152ae3c7bcf31b7a71e227ad888b77232a41dba1fdf385c8a7fb96d9228dad164ddea30818d2e1a2c0699d61e4cfc248a551e33732c3f4a9eb61161d416bea5ff24291a071030b813ef6497893f6dd4044fb299836e2b7b8a455f545cca06da4464602a93bc2b706085eafec147222d3d9be4c607a11cf0c347b56ffece5fec4645111d1f417458f6614e8ae39a83525405d010deae0f58d75683fef90998772935556daa3313a9d6df06e566a08c844ca6ae2b96e5f20a87523a04c27f626e45ff771d1a7925dabda2b5460519587d1dc128aae478531f69f803e3e333b4784cee46c545250fc9288b7042e97e9da0d873db44199595bc1b726bfef1e6086d0edaea49a5f2fab0a79d63bcb1500b0fe8ed902f89fafe8fda1e0b7df5690b4896ce264463e6141c17a388264a4e7bf62e6962adb713265e09c928bfef4cf84be98e9d532af22cc1171d6af37e79a45873a4221eafd7a3f593e228c6ad3bea349016d5285388c5d2cf6674e039698433ee81f9c2685a8d83e88cf4f89415a6ce2777db881de02a05fa85b2095ff706428743087172c25c2f81b7003c91288f40a72fca9cdc88e244e98172599333fa209373953a53b902f18311c7076f0acebd689f0a39c16fda6af2ebd60e0306d51785fbda1ca8e24d57081ae15aa1c4cef6578ddd91ca16df58f5575ace30e755e812676ec8ef0ef20c23df0941cb78b946b92b28f06eee32056672ba6a0b7948dcf62e9a325900a78aea754c90916a85a2cc4f815b7b11730b05d6a01e9a6377bc186699d2578b74c1dde76d5ac07737f12d1d648b731fb47b25dacd8264c9ee000732a304e9bcdde61bce87a10ae4cfe17ddc50e38c3b1be99ff9a2ede5b4e2d4c790fe5488c13785ca69556b2766923e46e386845e41a8ab49b5888947611ae2627b05c9ce17de24d25aa4b53875a3006aa10b608d71f0b16b55e64211ab334073abe13730913a123372b62977acb0b975ce0c528f9a6633d337b5b5d4ac4b541733e233ac78c3782a01ab6faf792f43393cad395b44e19528c9f1f3d3ade417a896f4f5c20635221609d8974b8182a5609b549b0ed7fff24a6e7ed1ef2261de8b2b860c3b65a14aa91c0103752b93e49b4d96f22ea305f269da6d2302cc8b5baa80232cc756b8850d75b376a5dabb8bc985eade185c18c2feddf9e28666f3c67b7d703006d6a3d005a83d08a858f23225405931005428c06d0f3bc49851a1a4f9595a852a17f96669775849eb16216da78ee2a0f68af0d3e5c65a03df00cf9021133a35004939dbd1e338cdc548a7316249f9af4a6582f00d21ebb3f341a6e277147789653fc6e156e0e6d843eac46996dfb6045b6c5e21f4dc84b4c6f6a74db971056df59d5db802401e7f5c0b5b468465f18f4dd83333b4edb8f533beff6a5fb86d10e94373b7153bf89e136690d72e85be711992bd8934a57e627fc5b493c002a6383b6e86695a76fd4f9d729497f6021eebd4709e3ac3dc952ec4e60b5babec0f7ddc0f09a27785533b0b00f2cccfeb553f886537d46e7e71f649779c549d5c8a029b559a4879b89f4221e39bdc5dc6362a8e174d39f4520275d32fbfc29ba27801342c251381eb62c68b0416bff71f611984a2f0953eaa7a510f4ee405fcf9cb561a542efc9c08fb2589a19d279f81d17579ea55828ddf4bf63df77df21d22c0435d9f6b43c0ff4eb42241cd45c6be1870934ead1b4e08160b05b6bd3baa2c5a6f4c78b20f24b48c0254b74c146d6bf1dd3eb0cb8325f5204fe12963dc7822474be5a4d4d80fd7b300090cc038a5d0f3801f9b5b29e6def0349abf9696857e7ead5e465115754a9ae123b0d0d6e82a64fbdc94de95b23989a322c2b3b5614f965147b5943abb2fcb60030c3ceaa54d3378ff5ea113091f42cadbd066bcce4107de04fd34d0cdac337d80726d89018bbc26fe7276e8740da85eba4e6da8e95adaabe6efb613b36d8661ecae7085234041aee464bd9a1e3851c82301a23b314fb38992375553a89097142cf29fa329ba3bc7fab6caebba205f5ce79f13e7088fdeca0d674342d96d2a5066b143b17195c7c5588d0de4194401d586e3a95bdac0ce53340da929f7f1120f127a50777f547a8ed9f152d74e798163188375707ccb244210d87b500154e5de87a327a26c851309720904d078e7421dd35980b20242c16b68fa90dcd11556eb360a78ba1712257032d2f38d30d5e27d53f919898f450c59cb89b49793331e681b15c3d103e6dde5e176a4e591aedbd3cf4cc2f7e08b49d3ef1dbbac7a9006e819d1fc073df591e828943d640e8be6cdc8b4536cbabc98748c44e8426196c0fc731623cca7d2817e11c8fd1ba4e6f3ea8200db121f0c0b90b158f17bcf1b7cc0b51639039eec2e434b63a9d406015b20ce21a924069e88638f97a08599cf19fe429c4b4383798750a39050ad9c5f9f6d80f1f2f5d9c2a8c7a9b4e9ba1f65ecaa08161834b715dfb23f95f82f2960d6826ecfca027a8d4d4b3d35f286a1d47a03a4ac19ee43f00abbff004f16e6b792d08a6802850c9fc963f20644a0eae703f9e7e9415b33f2e5ce630c2d5d526abd5be46f741a5d7d9acd995fbf8b103305f0eb6fedbaacee0b49ae93b4fa4ddca9bda7f737e6c972b9e1acbb1f9fa09ad59dc337e0b50b1106c3b8ced47741046709264eca6cb28836a7aa217218235c4500b0d222626c2cf86b99c323616763442ba6b86c01eed05081d288360380061b8edadc1f3a5bae03c687078b0b02058e3f1bc95aa21b69e900f1c5eda112729283cfaa5ba79173fd48e989fd2b4ba5d63c3632d5a6254b0d87bfd2e8daac8031e7bde916fde7e930671c83869b15484b3f5dafdd32a65c7443a35b507285f4d38353441d8668645f142f83b268d7ffc72b327e62b4827aae5342a1cd78aa13bf6473606d9e0286a577a06758edaba04895eeee8fe4361b312bc818649ee22739df49166ba9284a249b8d8a87f84e2cf7d5cb1cfea847fae6f0f5ea2bc0746b8b9607e7bcf1efaddc76bb23347ca73d071e269a321769356ef6cac37941dc4b90234b0bdaae005139c1f788defb5139b81c864a943d68fef08ca684007a09d94af3dda06acd247bd2df3b8660e363d259323aa20cc8f36ddf5f2d406ad3927b0798b1723d74ed2e173e39e5a8424aac1dff889d7fa382f4f732c30e91b4061d4c632cbd456459d5d3153eb8db4458964af2b9daf8a53ee54c656d6a5ca69c429d53f218e443987569cf1f07f756d58cfbc3a1f215ae970dd38f9826eab7957ea9e1957c37b4f4a2d3d4f1a852a6e6fce305bca91740f5c20656bbb06008c79b8e6009e53903dae4f6eae0f03c68ee21bba30928c960eae25a4045387e61c141f1c4364ed804144235efa8465a4399a05756d4bde9d49d97a1425fc8140aafdcd1f725c69124c2afe075e482a1a49f7b9f2d967d295ab5cc97cb14bd3ade42e85499ea086cc329b621b348a18922d91763362ffaec7b9833ca004a20018e818d81fb1ab848aea614c4922df004d3c5e7e83c0a18ca00acead74b1042e3ecc446db7dd14df63f02601156485413551f59a00e736e7ba9f24833c1b8d3deb77e8662af70a9415c55a088fdbed0e139cb511f048e0fd0d7060f902b3ee0d21188723f4987dcc1b06bc2c216473ec00b27cb1b6642c94569d09de96f182bb50b58a2392b8b9bcd56fe70d960dbfe8ede943c5265e8ec9cc8918413a23ce8cb43b900ee625522ee3a2b6284a00fb5ec612742f442c3bee304d948dee6891319d93a98773dc263fa38af5e1eee2677c7e844d5b844df61ac97b2e1091fdc75548329ec1e3e7973d4b40e19628314af38083c9cd80683863f0012218f47b7ff2b37fd1fd59eaabe61d94e6d398a07d9b67b49a102066f0bd81382ffe7f9fa541e703a9ad0bc796499e111608e3d56cdec2a014f185f8bbab7987c10a477ae988886b4d2e1bb7f62d3bfc8765f8cdbc3444d5b4b73ed7a104ae8dbc259b7341014b7a709c7c50bf4fc42242f317347fe6f1c1178b0f5e826323e0a31644e4e00b30e5a0b1115c5c6fed3fd0e75bd9856b7d34ae519f220ae94920cb4c183752a47245a581db9814853b97338b1a4039bd3312f0ab60a2bf868f249cf69393783a16c4cc1a220434880dec98a041191bd36e637097ad32850b71d70271b291e368734040d209350dee799a095476aa9d77567545c13e90c7d3fe843593c68f3a6d6b2f01087d8420dea2d030f8a5273322f2b5e90281f3a5409d8b7bc5de9bf0121d5422e9b571104559bde51eccbe03b266f935582f4c0501080cf08aa240b666c674af11b3b64c9688ae71a3bc0d7b7781723074a1614b8dc209e16d5ed31eefa27e9cfd6385505d9ab6e7ce48ef0cba9b2dd8fa80b46c35386f1bd0dad92cd0b064b7fa5b42f2c0aaa4689e80baa6c6ad6ffd3868f10d5cc46712986680b59f5e73da11987cb0428a9bf826745207b82ac8c1e95c909dd716a26bc5997e99ef0855b3623b894f7f80f017c1d91f40483b4ceb378d18c5ba01ea780dbe8fb26eaefed5579711538503d796923dd7d8237b3ec0e75e6ef857ec52558426a65c7b87154500d8666d9bcc64f2f5985b9e5e094de10b4949f0afa96502586d68f60ee140398b5707de0ee3685ad2d39eb18e3ebb743884b5493618419d38518c08921f350affba38fc5699427cc6eadac9ba98514c07dfbc58574d6bdece17d442422e24f1e4d774ef009ac24988403eb79f24dd8c996f1f0f384d84932df40dee331a7b4f031887d4d973eb1d525a7a6658b9b5842067cb77b8c82e502d3084253e556cee2e46ba9168a5a4ca4b3a6cc74f489d51c38bf41d9a8cf68f7babe09c1ae84698922001c2204b94bfa8cd9054fa046710af12c176a3c138454f94664a6c645e256459ac4c54687d6623f61841869631326a63ea6ce89333d312cd13168d5a80ce7ca00838829d391d5448a48b16205c8526c811b0bbdef959c602a3701108e6bf78e5fdf68514be5c38353f6ad543347d3f342f0cfc05785fd0b40f4c6b57750debfbf111522b5bd9484b3416ce9e4c45c794535c306d084b2367c15bc0ddba69ec3fb35c88e12c1a14ace2b4e926eab35f387f59dd410b51cfc50b74d0cc2e75624d9427e96fbe76954deeeff560fdaacb62cfc4ccf9fc39b6172360ba7f1906a0bba6e4eec9e12e0b99b2b38221d4fba6030c3257ecb685f83e483fa51cdd3bdb593e00e26286c0ceb6fa2d156031a2f8dc7d06de2cab5825ec2b17d586ec983378d317a5d34dcf1abab4ec330db01766ed09dc4c69a0878a44c6d7f2e914881593a438a4ae3f031e29d0ebf8e87491112fde019e9a4c9900597d7adc25451be8ae392c183e8cfb2cb2af2b1593a216a7f3fa4cf6f199d06829b2e39c2b44c9f4819f86b6a5b225820623c0e4b66e295f146b0d46bd83554ccf2651ce08ec2719cde970cc53a5513b12ba1b80833698a0ca2dfc94fa90e4244d3438acc8e95e637c8d7008a6142e24af6f1356511338e9ebc444aa1b282fc0ca166dc270b4d212bb3fb5febe2ae85bd6815610c65ebda673289ca51c30bed8cef7ff111b3cf9fac8ef7a7e2b9609ea157080d344c465fdb16799fcbe24a3b4445e117ffbd57b1595e916463c0d20c37343500280288c5872377659bb50747cbea24c80ac3ccb0690d0007539878c7c17ea0a508e8288abb91ea0347373e45c2b16c493a178032edf5da08aee759f614262d8150308e5e2ea94ab131ab033e8639dec615b5aeda3fd11841c4f3e598b1c9b3172d06122c8269f884939bb7073075f6f514de620ac7962411aef306cf57fdbe52832ab28fe7f9f6c29c76e140e0d0e29a32e4d939c676981810496b7076669ec785f8ba50bf917c071576955ab0d6818bb72e412a355a5060b7e30eb1b50fd53ba16aa318bfffaa9f1349bcb0375b7c5ec086cd05c381e335b07d1b7f546155aea84e9a1fa2f7fd16ce27d2a0fed5a017baf5be296283c47a1638af6d9ec7e229956f4fcec3c870293d574521c17443a9c7fd2dc3a0d41c4196f6427c50cbfb1ee711b7ec5d6949549be5eba0c5740e8240c132904a94944a08aeb8ed09d063ec406f766c38153fbb88c0c039d34369339b029d50c7aa58b5ace38adecfa82d4b739d3278545d5ea1a4b9247943c5b93d296733360a77711f07481e4af14b7110c6541a92e448e7a1d785cf5b532ec13f9b208abe2960cd61f09d5f29f1cfae8f3fb97af6eb17141dac3e7ab445b4e42f2d85adb6bdc03d4a81faec529756c08f32f815bf7ae151e305a47d2625b64c13a6d6298b20378999c750032b3f0b769f0bd81190af99c75906c2ae98a2d742b680e2d2b8b59d4e18a75cbf1882fe58604ec74506791015490d461c010a3bd43418c1448dd2faae2a4088accdc9c4d282dc9857c83301d49dee461e8af6f2a4a045bbfe380ed2d1ed5fd63bf17dfc3d9b6635faffe6d9eed06b8540be90b4055aed276914f756367fbf567cf559d7113fafd592cb9b60d0084482db6d5909cef83eefccd3a89447cce2da3f180e253606c7c242b3943d66ceb9df95c2d0fc64c21b7aa767002de18b7d84373098eb09da6c7416fdc0ab4d10b82f862b4b65a8db85777d406a8816bb2b264ff04489fec2c24adc3efca6a1312e2e3debfea280180f6ccfbb54d49e207bc41a1e43b065038fd8fa0964e7e451f344bda862972b83657aec0d9bc235b2c846780048edbcd2b0779c6b76980bea4336be97b7d0de1b255d644e2b21dfa7011a3ce3804b639fd76f0b9655dca27fab1ffc6fa38e5bf2f8ed4e842a51ae86d20533a0e2badded15966c2652c31d017d596cf36cc985405c2176d3830d61aba8cd775872da1905ea9bda839a655b48cf6826a9013065ef24544b3182483c465c9a99bd56c1bfe21b3f9d187b9c1ab636193004c0cee8a7e567b575e2640216e39ff416a79d9906d9e4093cda53c49e96ba022ae0f09c00a02df69e0bf03a3a40ec34ceda1f3a2f07eaa16cc61a07ddd0cc7ca0d3d7bc73d8674db307260bade558679b9c5266a3062d08540eb239f90770919ca9e8417bb8c491e8985d20940d9dc8a37a2f3a5a278bc9f1c6d1d73e642155c55bddaadab0899a8750b22763db2a149408fe19279832705bae4404e130280aad749dfe62d17255046822550ffa85104208ca8d448c55393b94ab07f7c9c348dc9c843ee398f5a9aa8ec3850eb9b9febee0490c54c9da9c2e9032b8d128e094efcf9d312eea5069aa3f7e323cdf093ffe06eb32b1a46a62f8b8c9f56400cb370a43ddfd5202f769077f92aa77bcb89556b31f33f0ae6fad501a8ab662024c8d3a3ed3d4b325ee68087a07e7c0af407349315df8342334153850410d9c300a6b0cd79fa83f14c7f690be00be0db48bb1dc1afbf5bbfc920edd70f4fd01069838406206f68cfd04a1a408783c27da505afb58ac32b47ff5ecd832af82243de1e51f69eb3815d05b48c8e170ca8f3a0569124286a12e47f3dfd0e0f0098748f82dd8f31b9c2edbd284e0adcf6ecbe000694049f029575e2d913355e03503fd0d1f0fd1833d119887aaffe7aec4404e994d49c1e7ddbc7487752104ee2a3a4d4fe2646f179c455c280eae119215c865c0bf6941d1132f60812985a30980fc5307e14960c50440f142e8a46a21936e2a6442fc8b98f341523b79e130c07d4266d187084729e563e3ccbdfec9eeacc4939531f8d2ea721411958cd914402611c8107bc84dfb480637a889decd508d4bbf3f0c5494735807d5b7c631f99eefe549e9eac7b02c3db7ac1549d2712e3767e7efda63dcce12f67435c4f26966ab2b9f280a19900d7d128e95664c153638ce503f41cf27307a6658594f470950e7ec14e2787b37b4978c10af856e3c2e709088ba355559b3af2068ed9f1bb3168fd3cff02d7a7bcac37e50c62599557479c81c67e5d04f4882b6c4aeecbc4bfb951d9b316deff5e36182df4ad0f5093b83d045c798e7015e81480660a18cfff49647a8f8123cd9485ee4e2d15d28ac00e39ea82403a526ece5bbfef014934e28c1e9e2c6beaeca3b310d9ee30eb88f740d515ee4dd157d7118bfff03b9fc3c324a10ba7d62acd2e577858fe67d5a22e833b8b0c61e8ec8c3fd6119b8461f51d355fc4bcd02073b72922d0968ba29742c7d4024ee47998ff88316bbf4a5ebe556572481907d9305050d588a0076b8a3c75a308342cfe6f10a14a8e2f7e21f415e8509603e76ed025cd14845cf4b8f2b7da4106b4028c7ecb5a7808be768393ac78fd09b71283ec79e802077269fb5cd5f61e5b473797bc03ba8a974a42d0fea87daea20fd14cbf212ec6652ba32aa597bb28502a55712f91f8cf15217410a1154589909e17a490bc7fb1fba88a11982e2b7ae824461f3e4cc63e79932b00482c636399bf8c5a56859838ae9c95603eb1e0fc1ba41817644b9cc93057329055d8a9d70431ae8cb6bcac7347782395213684131920ea93575a7b101657eb8a4f5d9ee808af33327b33d7178d28ce9c914963f3b180897ed61ca8a8d6ed4bc0faaacdac23e3bc2d522e66007ca7dd5ea7c229a6b5f5297ff093185036f3ab8c505ee8fc33ae493371446e212f1ffc66e5af9ca9f6df5df07bf1b50ef76b911a12aeb1fe85d475756e5af0f7f272ff4c157f5ec2f5770bfc5f44eefde844027f1afc6c185742232a419ee970cf692414fc99998b56e19fddf69c018e39c1841c21a44a04f846bcc70aa536fc1142c8d959bc833728e1aa5125db589c3cf4e3c00fb897a3ba41f7a75f112aac355fa17b3ac63c6aabb40143bf90f2b7e79360f8a099a49e5582b3706d7ec1f0d1b446c0d4e97cf42a6e30e12bcc56f8f7a8752f7971afa52a583b97191f87ed41df442d0e10ca32f87543c6a11995972f145392db2f0ff1261bb6f2d31a8afb1e3d2224aa0bac98727b065a78723f486b8fa5397272671ad0ae18000db3d9b0df340c182a68ee045d16a3aead7169ba081d13243191c5ae05c2ead38fabff399caad24323d855fd4a852dd801637049e9b8b3b74ea71a9b6899b809cb08d49041331b1c22ecaae89268904d0920faec9f7e3d207a8a3bb492057d341410b5425a110930c4caeec587ed0aeaf8a040b9a2737c5048216f770428b8acc633a79822b0ea710fae545cf1a2dc6d52f27e144d4a80baca259372fba533271afa6ebb66f6347e3a82da2d76f459e7230e556774b7042586386826d650791571700c4e5f1f369a4b649ccb92210aec8964800e07ebade40d6033301121cf8102264e16a8de3b5af0f1f5b60b2664220b4b844e9d1dd13c131ee3ebab7ff51a6739036e3c1b02a8f0ee879221e81d7e40c8d338f0765baf920c759bf5465f2292f17e985ead2e21d238a69144abbb9eddcc2277a7757e31c1d93318192cb5d52d995cb19825a4b2db30e164ce074c691ad94f34c66d98d76ded0332c3e0896b74a80df29098c758dc70f32677046a13a52b901d681b12a366c60e7f6486cd8041c8e7f8f402505cabb1aa169d59ff71513e44dec565768ed88fd581afaea07283cec8aad561b09458041c8d18d44f64e660abc1219cfe8b346087b2cce1151c28d0b103eac6b0037a6dd60fac7ddd7b612dd31eb4a70c8d7fc9f643c6cea5041bb2dc7e582754eb6c616f1d9862aac3b8b8fb81fe7ae1b42c0f84a248aab7a63696451b826692fe550a5ce19000405d32201cd318cd609869bbd69a05897e178363c48626b3c66e43c2046581f3905d31b0d450a94206ce18ea3ff218f773670c2bfef66dea755d9c50748b713326455e2b61112d28439ca96f7192526c8a56a06a9620601f7a2140c16f99464f399f3e08282c69efa0dc1f745aada468573e7cd3cf5f0771446a13a497749be92e21fc2170cc8264c748e1bfda1160735a907079c73d4e28087466074879be9e44f991f6f1fad5c774e8a3b6f786008798f938aca763f620bc23f777320d3075ae8f232d028f031065bb217a11a5810296c840fe6644076c1be7968eefe28e7b04d7c888f6ed621fe2babe793f6d09c57eb219df9508b09468f5902bd177366438f9d34359397255d5a03c904e5901c9eb6c5ee4426bb5fc1a94bd8275a8f3be65be2dbe3a87a0cc32cd2e7b5be9187463dba948940ad53fe6d1ece7796cfb9e700fc25a2d37c7c838f9872a2426f7b247be78cbaf25362b4f73864558755d05213ed561c6b2413d041228b42013b001ae160a225a76733cdce37893d3d3d75643f7cfe73a3d97a5374138b134e93910b4ce7d4aaeb5c54fdd84bd41a5b7c0719d125957a69adfc7121972662e61878e664e8263279e9c38e0e0d61650a94eb49cfef157d0796e5edac6c7a0870b3d15be87f3d1a0392a75597a42f7d0889cb39302aee6ed03e6fc13f37ddf4fc8b79fb9a5744b40ac194794f080f44cbeaa2fcfeea11dccef9b8c46db044d696f52d6738354a29ee9e94204cbb1c39883bc6d1a19a9cc42bc3184b0095addb62150d7a4a55f4a4841f7517e0d690f8df28971915df1a1877c33e491a11a3d94534085d3f29aadb677a8da778bde1368193c7dc3b9d9273e866dbfa5ba354a1a795638bf9a30197eeb79c0562dadf42bae0c62116b8e51c4939b714af6dc20965325d3b504b57e9165412ec4e3fe305604d3b71d682668168f955807a01abac58a2ac0a3faa39abf25d074ba813475666e5b80f4cbcbb4833964204ec660763df311ce0ebcfcb4fc0d5c2a5414e26c8231a7e4408ef1207417b16a8802c5b203b9052ee3025e947692e8c45aad7a588042b6a67f08d841b6e150ebfebcca652599d3eedcf5b787289c31c58df6d9954a40887d60b1a2228cdb6f6b3c72554cc15d5b574fb4b17562fa4534ecc8f1f4fe63fe93fc26f1dc62fe0068e087c03264b01f9ea77a38b7fbaab2c8067bf5137dfc10637a9ba43b95c3d302a30ad42799f7e4ad1feee9ee5db39ccd7c2fbed92e99183e0c251d94d42eca8a6e658a44540921a51377744c6839d1edacb11c33f533617d6cf665b621657c90285915225bb27454020797a51fc3faae173e3ce0d6406d3979218b6ba1905957d41a406eeb7245be19c4e9fa128c21671c90e23884cf2554d68432f4651baa253cfb37100799204ce41550496aae4dc91b76ad0002e43f89e2d983619ac22cca54ed368fe433041fa434fc5f903f903ccfe4270d1bb5dcc034250a06756f523cdbdcba3485cb26c0a3aaab6553847d34abb91a1c270ec2fcaad8c7ceded874166533449cd6da754b67df8f555a0fbb1fc4327708ed33264c512d634ba90abea1a9ae4698aa1c8958a81896340a0c64d410da57576e6ba9ac3eecddcd824820f521d1c195510ac2c2b73659055d653145467e018d40c7819bc0aa524fb0308997d89136e204d7b4151d5ff21af74d941af481d2f9e770f6bd854eb23638fc23cc02637016373ac4ea15330e5eeec48fde906bd8e1e3309aeb2965ea9bcaa66368678a0f32254f8fd62c1ce7f86340741b9570f233b6e63d8481408772f009219a9df47a445230899b37a3cd90b456edf0bc942ea684c0341e382efcc8c289f97019102ef5b660e250c5e488d86a3107cf71c6932dfe8b2c59dab0fdc24e15196d9a5f848ed04afc48b5929450a6238ee6e5075722a3fac68f922968647330040373a7729daf3e7e2e3c557d7245752846b70f4ad6474b0a85f24eb49008c42bdc6b66647992f870abc685c82fbc9080236f66e9377a2ac24bc0424e7f1baa89c2caa7308271e5965e7d679bd29594cb731aa5141e5bd287898162d9f7b05bcfc519716e79748a2e1aabf9fbe3648ed701a9c3d7264dc24db74c6ee6b0a71bfdc841d2ea9a1f1c1672374370caba691cf772494b3884a40c78146d5e0bef206b57a9d7fa043b116939e958206b31f9b432c6d63773518b57aab648a6a9a816322ba9b89ce74b7248db6d58c47cd55352f3431b36b61caf84eba7b4d781428cecefb61eb99a96cd1102cb51cddfab989edb7f8f742b8c2b4715d5bd6a0b282553befa527480147866e58916fb31a453ed465ef867da388c9731e987b9b415f564feb4aa3184cc1fdbc3efb6f8bf9333af732ae46c94b6fedb6102ea12b2f89224529bec83d603d8f7f0906b7e94e990f4bfdd307e1d69b3132b711a52e8799ebcbc7259d1e3a89e166111284b118d673077d031f233295c3ea139a03f349b30fac3130e89f5fc3e7716638c2ef8ce78c435b0c61df2a982063ac5f1057af89c84c6277bdca5d4fd889b18ccc2faebd794126e391b32df612d0a718707e4d37bc133e5c0db0c0d8d076507c65b6ac4dcabc31da308b0c0f3d626d000e2e05dc8cd410fccf22a8a160a5079633bd2b3294a23d843c5bfbe430c6f3d76ed516b2b1da4fec0955ec4668f65f42474788e9b39c9b622861937833a53c401bc6b0121bc616da44d71a5dbca7a2769b5fe7b8a21b73f2abc78ae1fbf26bbcf9517c4ba7228e814d26993cbe0a31dce4dddf705a4aa9198edab2c01323e51fe2fcaa3262825a9112d9d0047bf3716993f6c2d6941add859e7eca93de04b55dd83bfb94f0a555e18a15d997e01da0a4ac4ad68bd374b0f9708e3afc2e74eebc3ca51ccb6dc6c693d052a06c32b33d12e1b06c23b4fbd6881b4e87bb7a422c73fe236b40043e782a973af4ccefab1e191bc7c74ebe8045bf72432eabddb237a47cda91eadf535bc0638d3329ebe0e8fe85d18a48173501a93661996488a947da0784ea515cfc8dec5e059d46e5c8fe03a09fbf17edbc723d5c9592bd3b8a70bd0bdb50548bb97058c05c0d70483744bc40c8dc8e069936e7761197a3d32af9e928a6c4f9c06f9914542b2c4bb6aa780fba2536ac237226ab7e6d10aec782535776b5d7a823351e55222cb784c2e068e65fc234366272bd120212f6f6b19bd04976c33af93e364c1115a9c7f1bf4fa8694d107e7d8860af101ade09087e6d70fd8c91adabf94beadae12b6e14c4ce904ab52d54b9ca8a8c6217a146a83ce4078405ae99bb2f1f42eba2a0850b5f71141f54e1439d7ffbe20564027b7bfb389fc1bd900846bd7c18301aa656c53dc2f843d9c74250b4892009914ce758f07f4a4eec0fe2152fc12ac2c0f2dbb0b4cda9aebcdc48282d12c39fc4fa40afd298011b5190d37dc61783b056a3a4bcc14b51b78b88df8f1423b7268ce46a60ce97c08f86e6e79e00dc494d73e14e2073dd11b7f018d48e31cc466536166eeda74a10da3e76fdc0e5fdca28409ead3163c4893c569ae42c2f8ffd288e723bcdb68fd7622e859fa9d2160b442a5aa0e418aa2dd1207a11bebf05b6522a2f7e8e2250411f3f051bd7fb489bfc32c1332570ed123a9d305bfff2feab46ca158cbe39cdfc0a05864320d6fcc3df652e922ae6c4eebc66ab5f5460e5e5caff2619c4e049769f2f9188db4957d2aa2c1155494f84f2a6095fd3c75dbd6df3f5cc454208d573a7d9bd2c3e66f95cd8d4b185c80535bffa1ce4c6420c56329ebd6d342ab540709b7b2809840ae8b0a21b591a8d33e73219a7d8de5c6b35cfe3c71b45ba2e036b192c6bf0d5a32e2f73bd1fb3b89a104a3bd4b87c16a0701ec949f288c71c6f7557642436d9d4d6b139c575473adcdaa82417006eb0e2ae531d3ae6172aa1e3d8195f3b2fe0404e6d53bf2aee328294291438b6a89beb78aae21a02f7e11618e01f02256dfc02d1897ae3e471e7edf4bbca55ab1897b838a956f66a0af33f7695e3f7d674af3dc303d4e3ce69ee30ada8bd91782bb53a51f2cb83f71db2fce358a9c7772634bbe8313c8d4484c6efaa38ce52e37c1eec95b96e4fa374694dd31297511ed6c0eda1aa524c820040519384ab8524464110925b4884a5b8936260e67672d35223908daa2a6f69e0bfc7470b5d7c5a77e2e8733a33128861ab39201a12fbd2d2a1f8eae660e1768afa15e7f0f80d2c5fa707190214d1b5d8be85044297e0cf1e988ae1bc4bd38ed016dbc8c65783cd80a6cb0821d39cb958518747518bc7ae9f57093863fc3f31620c0cb18ff8c1c0437aa3a37d38e71dcf72fc21e4589a89362fbf37216baa50b6414f85773f84d4ed0582c91c3248acb68271390c9add5798cab2d75ad1824a9bb5d6764f4425c19b05156e8e235efd5d27421f4326c67afeb2823db322db67aa6af6e9e1e8bcbf34aa405292462c38edba5db06c67a815d25f1b282c0ac50c39a3fca747f14a487149a442d09ff2ccea17d601f3d858c5f7847226bf428a04faf313a53e1e229f36457b2ab8f89df46514a455536c3e669b0538af5117dde42798c095f97a24992e3e5adc2c738a3c37cb6559de221d728d554d5360ab9b4d892f806f300277476f460b8aef5ea49c97583dd85315c5efb99a3a9f3e094de33c3c50df906818549491367312a39e6404c5f9345991115b592c203956978531e4114546ba59f8c6e610ad2bf6738b88da384f48b0502cf776f5a43f2c68f5d3dc176e2bf35fd95800be9a78113e6cebc8aaed22fb3297ab8335e00581c42e5b79c148248f01f1d7de0fa7950a65efd84be595e45d5d05ad8192deec82cbc54143355dd926a764c88a051c9b8bf6fd9d8b7a73e089f058407678797e7baed7252b0153f6c54e68cd5efa240028ce5d373741e1eb4b82616ca2cd83fa1a82e96d0f92df283fc00dfac65c920709c41825ab2e5ce523999805aadd84c22fc6754fe375058521b1f505575ae0e7a0fd09eaec007a57ed8901a86b6462c545bb388e394725f66f37477ea7dca8ea5e18380cb9049157020934560a3479019cf72571097f78db62b95f0b36a66268600821486c6256840221d86a41c8cca1f39d873b6045efabfaf9c855d4b5516a42e4f056b7373e3bf114658ec6c5bd0c7cbb9de9c333f55164b982b28d4dd02aac79d4978c214a3c02f1a3b6198c1576451e884f132962aada0fd0bca589c01ac33e48293dfdd250fbbfe027172e1e37ef5f0b0c752301f7b93f0503362f59ced774a89f0c7f6f07d640946453b6ecb1903bd8368bcd2ce0efb1c42fd0fde88fde74e3bbc98d93f671471ce3904a1723967745713fc3f241caf4f4be11e235fbeca00ba0a471b79ed511808ec93a7e9cb0e12e0cfa116cc1f79b94501bc6796071932d25207d8553c2189ccf060568b1027cd17bffae69c0d7c3e78c5cc4933291f5c9089f17ad270112d1cb38210a2f0e03e6e6865717a7d32c1e5216e56e59d36b84507cadfb59b2b636a66e8a60ec7777bd427880f27978a7072c17ce71fc40adcc58bf45464e8c1ab7ece23d2e3eab4b40675e40e21db9b9c938bee8ecb88384ff597dceed6d2bef7994dbedadfa510ee5357059a25d1428a374a5505800070c25d03ea52e5f4ab11cb47fdab41a6fd19aa79311f87b7399f1b8a12c8f23b478f10d1b241bba6199d6df4987a63cc417526c7431ead94d1fefe251689945a255c4777cf8327cf54eaf9ea9a548a4b0bc12cb8096934e1e7a8e93080984cda98e9a5b3d5394cffb949f759ce77b36609c75527869ac1a17d8436eb376add19864d95b516a70ea8e6db3dda92268f92e8ed68507f21031c51401c442c9b435f331a3d5f979a4be1679fdca7b25bcc255e372dd2b7ebf7a86eade8ebf3e3691b6bafae6e93fcdbca45130b39f53ec48860641691f6f8e64d379f4d916e99177db259faad1f9e59c5f3ea5f40f150245b279131ba578bdfa9c662a980cf2264ea067eacd707a326c6799ad4f950b6f5637a5061be89238eb2c038c557ab2aba7217c37242be406241498e23460c0295fd52389455d069a82cda660691772181d1675df11479982a46c2d0e52a8c19ad594014a1ff13123c6b5e8942d5bcf083a4013c120da26519478e0ca2354450682afa13d158ba53e0acd420aa41924dd31522e4ba91fe9749498b1245443920e0d0421fc915a485f3d208754890e20cd883d1d8a0e64effbd81430943e27802bf814bf163b82009f55f17ca3388e9c472c952e8c938a5b25f3cd33f6358436e96d189e0a9b1dddb41724988ae8aa9036945f563542962a1d1df644d9af23a825b6563c4209e9ccebaa9090e71260282b50eaf12a3ef050f9c69dbfc89780f3c332fa85c13efbd3fe86feb2a0634b4ab1e6007ee2349f6c2e664ae19fec7bef80697c794c57be83458211cb985e06e9296a06df92ad20d23c6f4199c909c921af40292da228d7f868a739f9aff10d729eed17ea71b6979c7c9259499478cb5310812856ecf82acb4ae82370bd340ea28431f68788b1c36bcec09f660ca8dbf81cc54336f32f23804788b600450dd541d3e43f9c7b3621212fe27d98e2e3e57a762bb618e9e42edb05691c52511a98a0505a770f2733d0a1e0e4dc04e33715a31525fe2c82c147a6c7a377b7f6ce184d33c77dc2461434be97f285a5388196c2829ca3a2c68c6cd0960e520b790f8156c330e87c801e03cc5e4a0d11377dac629ca2a68f74b3dedd8329ec3b280fbb5af65203dfd42d9e5586bbee88ad3223e575b9abbc779832d506dc884ad057150aba42186b7695f97b75b1d057d8d66e5d91d447d57003320a9f2d725880818403913c1a483be0c5134236dd4556c0c3ea72ada6b28da8975bdd9f827ed4796cdb761d5237cdf7875719c1119894e7b3d5658a3a15dfbf11b0d4ef1b9ae9dc30c2b627281a6fa21daeb3ca2f02433720bf77f206f878c8eb3bbd440746dd537d7908896deb85ed0870e0cd801dc4fac0b59d63f8b58795bfd11f0223b19782c02e86613af887f9ac4ba9be754a2a59588bb34e124de6572b55d69d98dcba70a889150e639868fee6d113213c1987f71c0db9c968c4185b824bb969d6267598d0c31cc744faf5faa6d04afad0e538bc200d1a47097b25555e134a4c21bf67cf1ffda1c4582665e1853201cc14293f5b995eff0dda0b67071c82746677c332e63e19c02927b048c6279a93220a0d895537571c3a88625b51f9825f677437d409891ad85e2bbc0140fdce2e4a5ca561658b59bad5f82bd0864e3da621f08d95e2b7b4d017b0be0a9a3c181a1e86332648e7456b0b7508c7c470d51f5c18abc18936d47306a6c66324fe85d736d61c1c8d6ff683893915112f60c658442af76a2ad7a9630609db27f76bebfdfc97505b428e18d560d33f30bd6a82504668ab04025e2332c303ad2de6f3dd291c1a9da694069ca9492f20162e03d47b05ee8e0acc9e0d67befc8da0c4bfd6c429994b06deeeea8204bce3a66dc53e2831420dd6e55d3e9a2e10f765d95688431cee45413b2fa20fa606961b5280b9947cf05901998e9666691dfb213520862ea8d34513f4f7e8b98bfe43f0cd2e8e02131d1f571b375b7dde6c0e9cd89c086b1f211f2a7231ccb02ac7991d839b8f13c56e16aa7419a2dcb6570496c4cee3be78d919d5703a474a68e0af641f2a02b43d569893f94473335e558e4b627ba85b27d8b323fcf114d1c477739390f372d936ffa3e2738f00790d89dc248fa7034b859d8e579b7a03531d8de215265bab86cd1479827d23b8383fe5f3d82ec57ecf6d423a17b6f20fe2a98a2aa71dde7aa46da5af7a2506152647667795335284927d63c75e610ca1b902eb1194d96dff6c7649d156724ef6425ec099f072fb34ee6444326f947a6d78d0e1830c319d2dd64573d8a2a6d76fd089f59f67a54a1c78a652881fd6361909013698105dc0f09030c88f625706f921edd27a0be7a42055ad914badc6d648f7ea4c2094c0a92ce93c8146f5b8ca30f60183f4a2ffd5cdedec86afc8b7d0067b7d4fba3eaf3bafadccfe297a9f53feb9dcb1d8d5d99b55d8f78f45f8caa5475a04407d504b4108e70f75ea39770dbe0c09a9cd8a7ba798987957a6045940bed84cfdfbd7537d8d8732ef19b460e3023457aabaa71553161b9d178c772af01c4982e073099ea25bd5f1a834485de6f906815790008dd09ce4d66a4b8785b816e6292035a70d5bd544d80c8fe3bd38dca75d3106da5ad794215f134c184acf7a33d9cf221c84d886723c7a3291cd303cafea29b5c30145651070a5848ecf0a157df270c75ea7330ff2954342884dd684739b4b8cf70a45e9e605e6c102852206970dcf2aebd9373785ff7799d8bf918ec0091261ba363e0d4ccb985f86f0c7b715c7c30903da180d8bd9bc8bda59449cacb095609c109b55455935812cbfc5de795ec3c873aaad7a6be4bb4d0011a2afa0974c4e4db553f818e8e7034f46fa04b4b3f10144b0bb63867f5483c40c7e0033a50c4d44a1186cca3154106dc8c76056b69c789da12ec623e9736f501f63f9f23c60ea88f45bbe2f8859c13cc6e4802099c5012f403d717ae8825f8dfe7382c69788c0ae9eba8447e95fd24a68280af22e68ce7f87da5d056ea76fc3c9f9f775d764146514e04b06fee82319dc2b8636a5461cb5538fe3a4cf24e00c9d268ba3f1cece73dd8b481554f567ab00cce0060c76bcb6be6f08a4afd502ad9f62893859572a85a316e91b13f4954d145862a86f602b38a51c9906999c1623dbcb098ac4e1f588fde08787c600d843702ea3d2379cf8922eafadc226e923bbb49eecf9d590fe6f1dc2456bc3e60489d4401709ac901a0f6947255eae4aa548e81a67c4aa96c77a794ab522757e114beb2019040efab7dada9731c824db6cf10f1a4b16f61b01df2041468d0a4903992a350da714f28b590f39492422f77cb83c15417069bd1442e73d7f40e01e69dd151c2b9677361956cf0084fdb6b3e249f7b9fc37ae653f80bab2d0c6b3ca3963b86e6672c41e3b9f0849f41cb650c8cbbde7fc532026f458f7c52880bd036a8edd68c59430566002c785478545d01821db071b3a2cacd329e34b3ae7613c7ac3102f5398782f417b4f248a212ea39ae1ec7dc4c84f1e4af1791afb705ba8553c73ae5abf79da144c6b59567e757c4e2fba8089a121434f43328c8161454fb1914f4f3a50d0a52f2a79f41413d4f77be035f01c018b2aaa9c35101c22840133ca43de41924852848cad0cf2029b627fd0c92e2e4679094257f7f064951f2a59f4152644fa73839f0e1f9d19b902bc755c31cd7577f80c3cdf5592d74845cdff5c1c7f57140408191ebeb6890838febc3600da9124840e4a2509ab0c38eebf3c01a521f6441e4fa3eb08674085d08b9bef995a81428883e13ad09b686057819f9b83e15b086dd4303c2e6fab20db690b9be13584305dc80c4cbf5a16e8064e6fa568c682eca44c9ccf5b18035a44e9420e6fa5ac01ad2265aecb8e850137c30737d2a1815cc84b1f560c8f5bdac5e567345b548e2c8c7f5c1a4625230313133263711571c01737d2bb08636b4016480abd20e4efc644c19b49a4a1b1e37d1842b8c5c5f0c5843fa8318c8c0c745c140e2e6fa64c01adea21ecc5cdffcbcb900238b1d9990ee300410c866884e9630fb710084df0ce801db9dad7c54b71dae7c747b8eebb3618eeb8639ae8f824d14f1c4c7354b9de3ef26cdcc55cbfb7a8e73b1b48313a718fa0c993024e18e13c330bcb6ce9c78908398abc3e9ca691b6ca782f8e64c79e3f6d8bf2933fb252f93a447d911998f4c4c86a7c79ec70e8319e951e765761ecb44e911ff903112bb0c19237d641891491e97328e3c7b23c6039ed88d98cd8aa22c6ec464c47ac45386ec7790fcb3613ef1904b94cc4b94ecf6b8c9588b6dd260c756d0fe7e292354a26444bd45e972a33d7699285846488b2fc923a92fc9980ca39fe1c7aac8ca7fc0c8a05512c700914b32f62fd98ecfcb80cd1efb67c30b19468f3d859f154cd60d208698ac1b3b3305d9c4c13df6146229f8d496751b4334208e3cf659a6d0f3d8cb14668f69a078ec34b58983e5b10cac47ece5ebb18c91d78971eb3146b555848ce115495cb9c0f9f51f9c5fb188922231e2ac24077bec3f6e112baac4e96ab194b15384144365c559c9164b19afc74ec6628cb07f36b471b36154493246c69a75c91a09a55b3130f2880f4968e412f287a4914f481f5ac5c2c6adb6ac63b761545bd7b1cba811b1e2ea07e7ea64d8ec15573faef5ebd3753b5146ad92d83951c64f25f1b5a0ec4bee15430060606c492863be44c9acab44cd6e10c162438f7d969c111eee456aef24bba758279e629ee3bae18956496cc3d3cfc988440a4f453de2d3d1877aa1747648216aa74714caab7be1a7a34f47353c159d8c4e472b2b2a2aa81bb14a62c7f873993f7b873768b159ec24bbf15349ec563cc978b447ea30d5234c0c0d091ea97fb012452e65688f6fd09af539f61bb1dab2710341ff28f875d7da23495a7b65476e6907d9c3715d873189e479617c2938d99142ed4b810682a59e52690729eb3199547a544a3b4859cf9124b3e93369307964472e31c03e293b815f503ef9a9b483fc5090a170a4478c2aed2093f488354093294226b947237d7ac4e48c94adaca44094e73989442291cafc2b25f2a7c5bf14d852da4132e9113b296459d2237671a12e24ef278965049e9cf58859585a5a4a3b5c5c4a3b542c2a952ab58252a94e59a552a9a84c25954a6522639306fb8d9fda5af9b056bcf17363565b2b1f9ddb1b39ae4eac29f9e8dc8a44ac77e25849eca02dd793cb8bca514c5c5e5e5c6cf404590dfb8bcae5c68e9166d52c1ea37c50b34a62efd20e1c548c4e2e91b24a62bf21e95349ec5fa5f4642a3df09e8d5bb3721efb676ddc6acb865025b163cfc68d64e3c6637c1b423d624f29916710117abeb421f4d8638662889a55dab83d764cc66cdc9a55ded8b9b13371d0c737623242646ce2f01c9732422f63eb117b0dc9656a1eed49623b9679429371d22ccfb1cbd86ec49a35d6d3e78262f285a91e572e228f7e974f6806d2503528011812823d76d4acb6ac0bbb4b088121c084bcd9a4c1644fb3aa0f64cd4a1df169962909396bd68a63279734ab62e1800e6308d223f696b024973c7696b0247f1e7b2a2c4fb1c7be1296a79fc78e0acb53edb1d370060ade288533d85358aa3e8733d8a3c72ea447eca71aea55513d3ff554d42decc2fe613fc56a6bba6ca81dda632f4f47b32fb997492c4f3e9fec4f2f9f77f1a92d9b493392856a6bbaf02cff3cb6a1dd32511e42c93acae313d1e3f2b3f91519c657de0e7e60188310268286605e5e4c20c1877b55948c7b19ed10c184381dcc1979ccf13c0657303ef3d37bd8189a053af620cd2a397621cd6ac78e1d86daea1cbb0dc6363faec3f84ad451e27d1d92b21e4924cf4961108f8604c675342e81a217723b9c11d86327633d62ff42b2a747ec3021296b03609f251cee55491ca3931b3b4a866be8117bd8579e4772940c3bea0876940f76940d3b2a0a7654122c23f4d84b1493c728da6354ed310aca63d4ecb17ba496116a56398d64a260520dcd2263988c3df6398345196edc508d80268a607bce412af2744dd775eba5279beecd2ac6decc9379b2e7b8cf869ce315c6cff9ed893de7b726d2aeecf5dc6c49e6f273d555de9fe76e3e5f5eda739c0c892fef93e71c77d49b71ee2d69568df29c7b3df8d263f21c165f7a4e9ebbb089c3b3d91cacb5f6044a1491febe38a5b3a73f4f6935210a453c453c453c453c943609410ea678c2de0e5f5c5484afb8dd15b6e85efbc4b557c4e0052730c2881fc000e35e5b74ad114d9a28c1b3f384bd4d8aaeddb1b749d1b53b1877dc16f6f2c03323aee58676ec6d5274ed8ebdf6165dbbf344086ed12d2afa00c8418182483eebdf8a9729315e4825ad13a1356cbfedaae22b61f61baaf8c7812b61464d79d085d4167d11a139e8d1eb74f4d73a571a4295781aaea3c4921f994c7e12cbfeb2755e75f675fadf0dfb3569ac835fe4945f8f327164b7afeed5d55725776a2be5f6e4d6fb35715cb7ee5326c32a55ce352fe668bdac6ff2395bb546d4a37593a7c23ac5755bbda844cdb255565b95a8c917c639ab64322e301194900a7125af9fc21a0dd54cbeb5b7426e535d717e4943f7d94fb94716911461f1945f202927a2e48a2767f16f967cb088b39227b1cc7ec53286bf9ed2516f1844f5599c3d7e9e0a672555c4129bc21968a95f5f254a2d29a70fdee6fe6edf47a90c13787e7a6581fb211dccaa7497e8a79b6a90afe5b035d5607a974a610cfac4c410a96aec2735d52037e8423805794e1aaa934b45d6baa906d9c68098cf278bc27305b572ca2b2b2b2b2b2f26ea3197b6ecf0ddcfcb9907639cda6f96cee73bb80bf4efba15bfcf360bcc29ff6cc90136c0c824afb4a36b01042fc92fd8a51e356fbd23398c0d306e0b392e9300d6bfb06512c03a17a6688d66514f047b24d18a5f0445eb8217f7e25eaf17a52febaf4a5ae7fc3b225b9b00dbe4753b2f18b6ab8f1c81b9a0ce3a6fdda93bd548b3fa458f7aacd448480cd4c87216771f6d28e6cbdeb91677dc249a46627c498dc4ac86c8d57ba7613725f83b3e562472535bcdc324ab0331c4575fc1d79bda9a2edb2cd1570d3d8e5ce4150bb644b2f261451cd091ac7ca8bc1557b3c7cf01714d252b3746eff44e78442ea9511bd1a366e1f4586fa614f5387f67a7597602cd682d5fbd7f4843fdc592233e567cd9b35911be6c265f3b465f3bb51ad1842fa9ced7185424f458e1e4698e72d93b469a55bfd6ac58e26b7bf59a8f14ee501769c7089186b501aa935c02992416f1bc5d68f7441d14e0ca6d80ea5fa8aa64c5f1c40fe890e322b90d917480c80e453a407205b8725c24241d2039124ffc4091761b5cb3844312895057fb0f7858f065c7aa4fae5661262b3efb85d33561b6d4e3fe15bb77268dad3f4c1aebdc5b28623fe05bb759a15b366c50a840cadb0a1bdf364c05452628643a7ca9c2db52f596c29a55d61f62cdb23d84b7475f82b6fe307170dcbfa80b86fbb2e94eef88614bca7d89bfc8ed9a2506c82ced9ba1834cc532a6b1add5d2c9715d873189e479497efa777d3e102c954c26153c1bcce08e49834fa895981da999544b0b6d616169a1a10b752a4e8f06df9c29ebebad7f2adccc69131afa398958289fbec2649dbc54c04f47c0cc4183d6b03edda659b9d2f0529cf5eb2b62893b91c647853e0769604c452789555461e2a89cdfd0849a2a3e69d01c5c0e6fbdc655259c557e036d681633b2430eae72fcb2466564871cbeacf95ae2911d15529f9026e9d13a15aaadae3569bd661cdd55aa9c1de39c3dcf2195f568bdc8abb88e6e18c639ab54eea34a488f4c1aeb2afda46d3d5a5711bbd6a375502ce9df5258a650e23a89de12f1d6bdda5b2f1b765f1e1847c023cc59f4b627497cec8ed591324463527b6acca8088a6d96a48df40e911427342aa33d47462f34cb09e56fd450a74e7ed27a9c6e65b6e7c84808ca925985552353886a4e8eb4ac5f4751847e96501e0abb05994f6ec05b1ee9a473c65af026d6d28e9a49a3624ac276cf009892c8539cb6da6aa25ea9f8516ed6eeae69c502676f27a28ff339c385f4dbbf0f3c42e6fca3b4b95aebdb9eff7d6ec38f532979d96f89e49811cb0e3c3e81b73c7b44892591e79ce420fbdcb4ab0935a43e4a9c93e6249635fc384373ac406b54afe3682acd383856afbe82e7953456d2e879d94fa76d5369c30fa96fc59b4953ddc505b9bf590b32f3dd5ff1962907abe20972895f47c90cf48754315e7fa7b76d169d9dcf108b5d587abf7870ab1ef9abe7b7e1f534d4da3c5f3bbd7ed38215572b17402ff90f93ab7869d302dde42aa2fd40cf4b9bcfbd4fe4d1ffd9a8505d071018aac7509d866eb5d056f8489e579f59796ef21c1718ae3c15bc70061fa09744223795aca0a8a30d507dba6c1ad7710423cf1eb1d88574cef9ba467c73a6c43723dd52a92a8faaf64cef295d647334bd9f740b885043118ad246ba756777d63cdd73677d64964468c950ab8622a3a369d43a4fba45633128b128312949ba457f7e96fc30f971d22d8a7972cf0bd1233a41ba458d8034059a65f2e93058a059ddb9db6836dddd5dd3ad8ea9f8a4596b418c412026f4bcf5eb435094e0f903fc84a2c4ec29ad9e77a5213b3ee7411f74cee43ce873b8568bd562b518ae615925ab635c6558660303525bb5b62ac639d7298471ce2a95fb38d6d4dc9985c56acbce7e542a98914a95f32c8671cef4e7abdb9bd1147b53a9a85111eea3ac93ef2c6716bfb3091486ce57bf3fcd7af9ea77e84ee9d6079b404b38bab6af1c2c0c147c7985be926661e4e0cb2be5021571ab9e596ed85fc3313289565bbbb6b4d0164a733d8765ce67ca12cebf341cc2e2f3d2f0ce7abc3f97497869e15d92e96ca5e22967f12fd39c3bb3a0e22c9e0a57fe7598ea951593777519505eaa78fb29ec9145194e9e9d452c49ae626d2a65f2157103f54da876ea5488f5558f2cc3874da87d1d718fb44331f2f512cbbe7a13d556f7c23b19a68a99c22e4a8fdd5027a523eab19bd215f558bdc23a1aacabc13a5b17e33a59e733eb66b3215c6dd5566d2fa31dd857b7d516f7c3c5acadb6ae0d5683d16033954f96cd5e78e7ceee921eeb15ba3ff7a6b2c97756557906d3d1cd84db17e0271013927415ca0f7215aa2529442e71add6ac89c38ab7956ed980468f4dc59b6655b126791b60e49a644a2eedeb657566daf3d924fbd4496209de34ab82de38e710e326a7e332f525fe89edac46f926cde671725c13b78ae3dcd0c9285fe1a07cf5c274a1a8ebe4ab1fd47572ea3a895e499d3c5d39ae59c94a9a562c983c3b909cef7c0614993441719266e9d9d41589d4df82d4db0d40a0c5cb309d86df249cfa329352ff5110f47c058a3cfac18f3e0ddb9bbefa8d4ebfb2a040b774405a50113c586d85664d5a10cf57073f8f84473a46ae5e8edf5e67f52e9c81bed569f0271796b39ef0ea46b3aa2aa6fbea372d54f731e39170f501edeb12be3a581d77b5d442c7d5175cc721c96b6b62c7fe953eeccd34cbf33098c71a1b155648a9bc6927f8794ec3cf235df1ba8e8ac3d989764edb8317d6afe64b9ef7c93dcfbf9570ba502ba85048c9e4345411cb1ac7f939bd9c260b98441efda69b16a47c3b4e0c426a4ba7ce90f0e2db6bd029c19cfcecf0ed54a75b2a98939f9b89359d2011e55df061909aefdc03a56ad4018ae367441267ed595bb4aeaa3e7e0542c2af7c754ca3879c9f8859736d91747c98165a81b191a1bf11ddf68c78e3acf2b1a6b4c1242732109c1392e41f19c501c535d5f7fbba15c6362a40b1361c3819330ea47c6946bbe131d78dd66958227afe17aad0a4f569bd73417ebd4eb3462ac8d3bea80b3c779a6375167bfbd613063e24e51921dfede21426ac1790caed66e298f9761c204318af2ee73e48beba5ec4bbe28a135da04ef2eb45945cd1c774cf8b5027792226d5da5271a20aaadabae9ca753364a8f3cb2aae58f03bcb2aea106dbeb469b761714000220b22ccda0dcecd0e35f99142022f7c7c7c7ca68f0e9fda721f1f1f95112414445f870e40001619018061a8864692e7100cb54e22dbb661a8b01eeb0b12b55a6d55a80ebd05a6089943300c4918b230bcf80c5118ab9c46b527cd2a2992afce51241387aa46f5759e6cc83269a87337b44d613447c310c4d0556d914bea43e39c74734f9a83f22f517cc29b8a14df9c292fed2d7e90a527dbb8f52e74912273de79a99a380ef0325b38aaa8898264a26433696caa47eb1d6763897eb28d8d0a3a62a0a15baad90a3f2a28424373caed54cc4c4e5d9a5dc2fa37a792ee30f594ae3ca5e18a76b8a21de6a72e4f43d5d36ea7dd21f8b443d4d3d55d5d4f3d77bd43cebf394b261f93c63a044a4f6d08a1a692574c968e2b34710cd516c9ad116b0137ca5b9bbd59c064f598a3f51a8c73d33cf4b016c75a4c9120db581c550b32fd7eec79e270e1345b2f50d2ba15c2b8c55b2fc3b7e5c4e2ad972f3893c67a6a2783b60ba3d6afcdd269bb6fdd07cb0b06c6c590b53a7d9ba66ccc5bb059cdbd3c1fbe395372b4bffed5792fcd2618aceb3ccee3381df5967376e9ed09fa754a8f7c94a7c9eb2588734a05525149be5ec190f2f488c187a5bea4b05212fc377feab3f88f8248f895d7182bce2714316a3fa18811c4d370c589359ef579089722fee3e8e4aa6948fd4ef51d4e2858d0febb209de5607b2ad2d03fa4fb0cd8ef5041fcd78134048ffc87411aa266ff91c00e57d567d00d4c7c751aaeaaa71ebbf756fcf7818d6d0821cf60ff3a37ab2d21951c6272b18943c6fdfcf5c9f9fc7521772787eb17f6ed340fb487599adccc9741dc2c529010d097d9d425d310951a521e1a0b67d00d434f4b3c4acf89342c7dc94d5e4e1b8e0bd3366d346a260e0ac4a4b97e9d00b34583a0e4f52b962f5f52988a134bca821335c197357f27cdcd266e8b7c5f9386f34b9b3858fe3a7787d031383b9be9f13a5e612952feb2fc9d7f63605dc8de8604922fe9cf5f6c43c2c9c51d37335ef7d1acea05d1539ff1cad1b20e98f07081c41286e49fe26bdaf3db003ba01fd83f47325e06ed67cad3db10d467497b9eb600ac0e4fa91342b839f14488103001c35553ea0304db67a06ffdf57abd3ece4107c92f7263d0a9d7eafdedd86b28438b41c0f6761d8d415b6b2d498e2bc618d77008c5a1aecf735c363dd29e21e3a92075eb331b3cb12a007102830f0a34cbea3c750b38a057984f7574ea2d48b3265012433cf51884346b466d5117ede9964e29899fa74e8f744b9c404a44f976dd348b7a0bcdaa4b3c95a1faf5cbaa4e63dfa517b8b661e981d8e32097e8afabd0ac0b9676556f5a6892ba9743ae644fe6fc1b7bac99a1452e27510c419a861aaacde1a9539d6a2bb6314c927a3714112cf92a12a5382386d431c6f87601d01c2d92768ca611b954d1d94a0e3f467ad0020e87a01da2fccbcfa01d68efbdc89749b6e3eca23e4baa49d38eb5c837a20ed57ba52317d98a48563eae97aab0080ed73927d23927ae7e709d98ab9212cea59ec5a8d151001a5511a186b6acab8a8b1193352a14eccb177df17d6962c154ccccf5ea362f4f4806478e605a34eb027dc3cbf0724d9f0368828510c419be9d8110516cf142520031042d7a8082891b0abad0a286d7bf0ac6b4483e2707e2207349d0414a106e781e56a4f4894afab8571480002ce58ac8d4bfcad964f0a4b69329644e9e3831da4abda6592f4f1d48b366ab93dd68d6049a41ed694903cad3da74d96440842f6794a7743ae1eee908f953c28d365da34d11b9c4b77b83e17c8a2b4cae1327edcb2904847312a6b1255e503cc755f19c971446635e1c75dcf57bab97d83b20d5b163f75c47c330e3b173349724f21193c44411939c4f124bec9d08a447187ae4b8198fbd87cccb80dd1329008329ac81ebc0f580fd4025d245a80d8fbde43a5aec3c7148f7a0498461e49ce425194cc8a0c33c2852198d854028d0ad2a7bbd5e26702dc00ba159637ea9b2e5da24e72fc00bda24e7771d0ccc7f3824b917f6203d762ae3bcec9cc66456e4ce4b1aa33d352f4310ef49e205bcc78eaf771c1e430504a64688d6bceca00617354bd52a2f7e389e6e8d4dd2da92af365ccfe310dd9abbdcad40a86aaa554511b23a5e5533813cd5ad79d922975388064ad1c1c4ad5159798fbe3a8b455f9e9852b35dabd56e6e6ab5da4dad56db2197b376a50c154da93539a2288b9818b75b172cc002c808202374e8a868d28322dc70c3e9757a1dc0c868094b00c3525706c32d60bbb2ebbacedadc4fcc3a6b25c2da246eed07e66a2fd78956d523a52cf8bef6f6e92dc595e39ab3c790490692c109be56b7c9730920683f97f8e1e8698901245f59a74f3c75f2b4b4a3f30e411f5e6f6fc8407066b9ac51a9541d5a1f5edf3543b954557f81a1ad5945ece509a6d7cfda52d55ada419a53be1d5bb00be7d784049834d56f58804963634ea0eaa521f2fc2b2ae9d493f6ac78ca37030d33654dffb51dae5d37c36e76734e8cc312fc6ec7a22a15e333b4d4439e3e9dba176313a04849c20652f800038b430c72a0404d6a40fe046a228237fd043a820bd5f7d8b2ed5e53a3033a8324bcd6d16befb56170b710dc20f060678f59f05027b63906cadfdb59b5839c02c016b9fb0954c5144f3dabaa70e28a659099df8105aae206201b9427fd04aaa209b68111545c6105e906415c1f7dc69dae200b1522f870395b67a3010f40e05e7a1080f872a4616f000a4208529001088e884d513224025705ea02a88b285f7a0da753aaa61454e880c41426d4c0a8411da38e4183044a38f1010b643cc0e2c7faf0a04000549df841084c3a1dc85a7e024d1982bb1c77eb0f371cf15c1542f0e1e154504510534854e0b00487ae15688a0eaf02f28208bff213c80b2c92a0b42d5833819f9b42d06ff881179728a59404da12088257d4d12d5ae4cfc3d40877ed936fcee4a2954f2ec7b18e79448527e0a0d2d040a19e40a2babbbb672d1edeb0cc8b57187005c6802a17969a5a39dd2a59dde4160659c5fb46d3371a62df5010612788a4881267e36c00b30088a503402c75fc0dbdde72647fbd45bccd66c06460392f98c788255e5d87e9f9ebd6d6e2d5ed0de52daeb2b5b88bade53a4b4d89285f1151626983ecaf9f4491aa84653ff9eaa65a2b7df2554a92afde49e131ffc27e064550824cc51e436bf4bc32502f9f624c12572c707e3baff49639b687d06b6d581f8728cc014c00ccb1c624690e9f35da67f457ce75344c69fd8a32586baf004c43e8186fc595f5f932880c986f83913c0e779f4a064da5d34aea85c5695b0e7b200a668ed22ca9e0e79d3838eff3d9f9741f1307a8927d7a0d13c7c9a7136996e9d53371a07caea4a89366bdf8745aa34bcc1c544a8b9714e8a7f74e13219aa260e6a04992a8e0a7539d3632bd03930998683a04668e205378d0f3890a5ddaf8e90498395aa035daf3a8a241034f29ead7d14f6f51a24af2e04a41302f3529aa7617b12696ddceb1cc4a5fd2198ffe2c04bd85740a2c0985b55b54c924e4e6f49455708298c4b2754a62498f6c60876b5aa8a9a15f17350d9a830a61d6686f9d6fa747d40b1adf3ee96a67e2e88a64e594523a6b6fbdae443a85c8069468c25efa545433801238918317bc665d30b13d10c14501031fa67841122a0854c043153b35a5220e87ef9b1307776d6dda744ebb0226beae7371aeebb2aedad4d5857492d6397b4b2c74a6496da839b5e9132a9e4e87e3388e8be2870a5c410318f454b1041147d810401104952f605064717bb0f7de7b4f507576b83af7de7bb92852d00141c7af0f6ae0831a144c64e143050f336f0a286c70c4b30d01fc0964ab81b75104547471a342880a5b0e8678be7beffd6a5b4a5b9dcfac823b5b6db5b52f9e756836a5a717f7b1a6bbce79f25c85be6f929eb2d01b3d5a6b6d58ce7ccf39676db1d7cbdadd57e7a39452db3de79cd336aa279760ce39a74a09f2b43df6dee6a8bd1c27c4b59c109cad9cadf43abda2b55c1542881bd8afb769f5eeeabc931382d3ad12381d866ea9f87432aaf0d36f746b245d9fe3e70405d5cc0c05668e15688df6ce7125dbaa847992dfe7ed7d4e3decf4fbb290c7f9f1258d2b8cf73bf186c333572ca7948ed263e6c6d66ecfe768ba3307a635daf334d11a82210bb9522ec4e9b17d34d92ccc1aed527a4c9a766cc51bce06a69a68e6e6a6e3aed75f106ca6419c1a56438172d00221ea76b262dee2009a42a8875453d46ccf9e3441831ba62081c765779c00620559887e9ff460c69330fe7a7ff18408160b2a18b893c226844d0a2e620ec0418a26f09083ecc90e423071c00d4e9e9c20040ec8c1565b9503a125a42448f572f77223a8e24b07c20b86aa788112bef42c04039d0b04031ffe5e4fdd6e07627414a425568bf912943f3a7e9ff0ed3540bafb73d0a937e83989b64a342461fce41254fd752527d93c4a9584b992ebe892e35248a3c97630b4292d911bc63a76cf6789e4556f52f5c63546c6acd17ec31993a6554a72c7826fce9493360b93b4255a7627b9cb934c4bdfe2cda4b149f2091387751b23cd611d855963ceb9f2e568bd896365b6404c73d059a35526ebfa8b6a85d25bab69368592ef7d5ada81a3e39170b038df47577f0ed5be54cc4c873048876a6d67f11c57292cb9c97d94dce4ed26918892167d989c4524b2e27cd58e32399115875b5cb9d0e22cfe23e528b108ca532831cf9692e7b84efd53aa522d2bceb9cf58ef990dfb278a6c7dc94ab8c26111755472c557382bbe7a81a32e165ffda02ce28a135713587116ff71729458e424ae3877f117ffc152644554d289ab1e9d5befdc8aab1e5e3b8bb872c1c55f7cc5893f5cfc65ba5ac415e72d9ee34a892cdee23e58bc4524a20474222becabeb291671657dc5390b28fa58f1166f1189acb038830f94677f61ba6c2ab972a1c553fea3c5536211253e4e9ef222592482126d3f52454e224e6a455c5971061f2b7ef217a66bac64f51527ae5c40398bff40398b5844890f16cf5ee42412f11f99458421c7554e1a8b9735319d6dc5a7ebe4a5c3f874ad884a563dda2be710ca53617696f0e42ba18a77a1e7604872f117a6cbc57fc87095cfd28a734ec4797120324425ed2b57798ecb45860c5149e72e9ee352a93ce54566255bbc884a1492721797e1368e64bc5e9564f1186ff19497f4d5e22c3e8194c7882b1c1616a7ae9515a7ae15d7d12ee174adc215e7319ee37a09579cb8c271f1f99cbbac7c252af1dca5dd2524a2c4878bbf884494bc305d3a4594f878f1ec458abc881496ddc5576ee36825ba9c1cc6519ebda4b2950b283ff904b2c3882b9cd3c9a94b45c5a94bc575f44b485daa90bab890d2598f3326f7e7f532853deb972cc96ce6124e5727a139a15df189add564d83f6f61e9c0d4ca870a2be9851ecef45873251b77079ac27e55b2ce4092cba6955db62c4ab36a596b6d7bb558f6ce8ada7a8452dbf6354a53a118e49e75b8c362ceadb5f8ed0b946cbfb4251638efee29c7eb5414df372b584b3bc01e3bfa2f41f94ff8ce754c1cf33b8fa1b6ae777e4515dfe1ae73951899fbf6eb33e8c1142568c114517ce1eaee093eb954914bc8e5f89d8f3536079864e7d3a96833693a2f6dbef3643ca93a92ea5c886407bb6a77c39b4a76dee10b94dcad4a5568b2f3d2127974181b60709dc77cf6ab5ec5b85938639fd8b35806191f3bc6a18c2832f6123300f41eabc78e3bef3af0054abeb8b6b00b8f3d621217198ba3924c4b383a57a77a7b879f4c6f1e15cfae9b5d8767d789e5bc3ee39641c69f3e2750d3a6d54e6c84e2e0fb66b3e8ac251e73cec979370be00c4bb0ebfc76b66758760e5f1d73b7ab1dda1ec7c0a15f5fdb863bb89ca171236692b3298dd5d9a661a94a59d0c504931b9ae3f549facb81ae76aa6aca5e6bafbdd662d1aa52f7de7b5d7ec814d7db746b6bed6ae98d169544f07a5ab2afbf55b2af488d90c8f376c7709c3114345a56f990cb5c7383a650935951fbe2afe7eb2a28607fdd2bedb83ebbf0610820c883278cf044ecade35c93c4a0eb668ade3a77efbd3c46deadd1c45b7c735eb002268ec0c30d7e7c8eb8ae05c1df7befe59ce079ebed2bf87ca2a88a319a98810c88b8b9aedde1ef084af0770a65110394cb9a9a266e339f929c494ec6200167b3612162b701b64e49cc724d80a0c793d71311740f286cf68aaeebba289c44f1240335c1450fb41e52d4b24a0aa0286c2012155575cd5d8ebb46452c09000f5011b401300154449405445153920220289400834506fddba264748817b51d575b335ac4cd15e7a4a10ef030c93b9f5f2685a92f979ce485315764ba23d2578fd6c91c642239ae92830de294bc9676b424914bcafdeb278d75af2d1725addb960ede7ad51103d19c9487d29e19ce2b7243df9cb9c10d6889175093da7ff756182cb2ed7a3ec60990e2bf9ce747accfda4d0b3835344ba75b2d331fd7e7bc24dc0139d1e1ef0ad4a3301a688acb3d388fe95175798c7ec66f935cfadfd5389fc678a36b6a8210e3cb29a4c2acd934c9a5cdcfb0086e4779b9310125e7af3426a67c494b32a09d2f2993af2cbad363c523fd613a8ddbbd3e73431a75a44180af1e13452ee98e0d9eabac29913ca140a8f48cb665450c95a2191100000000b314003030140c0744e28048309826122f3f14800c809a407a569889b328887114648c310418438001c410630c18a1a121020011376e50cb2d0205aa05cd95208518eceb9c72d5df8bc020229ef8b953ae2cce03d6a96c611219dd06d28dc33f379e831c0f7e97675675c5b12a04df7679bac3f8e5895cc3ea09209144eeaeaab097f7bdda176018d9140f85590827f1b763705399319c83a2b14d07deedbdab1d07c94e3f1e59eb0082eea11bf9a2b642258d4ed3a9d4de654f04bd6e5375549917f484b9994ec3c53f115b7ac6e0615481ca17c78869eea63a5cce06d0488f9a042dbf798a371bd595923c0259f545fa297cb2029d7447d661e18f9f9e4b59fc4b8996306d16c81541af23a05869bbb7686066cfb650d0d8deb5b73d32c3929d95ffcc8e3459242750aa764ff1ab6c80cda889599a9830098ac81cd190175d2bb023b8e801cb22d6e8203185d0a89efd122db92500ad385fd7a546da4bdbb420f264430382751531ad81193e108313bb28461dda55bca2b06b618634a40c5d874c47a1c953ad40564a270ee5b150a467d5a83c8a0adc1a09f013997e2942bbd1a6cfcd776c854f10f77a04f40ab6df74f252d139fff5c7d80fecc98dd5504aae583985791ae1282991944275da85995ac2910fad3b0e51c47b2d7ae305cf5371373c99dac66b085de73b1b74a99463d3e19a819b3c0c6ba51b41958c36e24e129545953cda131e1a66e3db4e0d0b30e38b55ef5243dc85604361ea05afe15f0945f1987011188db43ae0e4d991b4986423b132383a91a0044aa4308b94cd7a3cc6905fad953cb7b306cb5a8fd0eb5aa58f26ef7c1fc93108002fce665615c5c7ee1b0489cb1225e0be4b4025971c3c1668688ffae1017433d3acfa107400cb375ad5ed88b4fb5ea7dd6096fcadf4b7e9353d487ad84fc8a36e483223d30fb8aedafefffe76a7cde9b651464522fed9311460c5a9e05ad448a100560515301c261b60effe7f3ba312f69cadbe72f26ffea35c6b6ba57eb17ec2aed524cd40dcb6da8ddbb86d16ad852b4a81f0d40c9d31b425686a7cffc9d20f5e2f10649a61ef5fbdf2613ddf2a9298ca0c675cd9cec9d241fa515119746de564600b86e20b92e30ed7a4f047e29af2264a62617f0e31d050c2073b3ca7037a22b577948d3d46c19a02f600796ed2fa893ff66f1a224ed04165f17209ae181334cdebb79a39a97e58e2dd251f5c22b609c193986ca9c2e498804b0316cecbd88006a3004dd6d40de8545abdc41051a2f8ffc437ac9c3b7f644d4833fdd262289fb6a87320945e9d8f34fe9e999a9d9ee19d7d551eb4848fdda7c7e932b4ecc4108823457c5446bf02a3fff441eaa95a30971ddd35532bc20756b163e831574db1a74a9e19ab3cc686ac95b3a713194e74171962db6f000c97fc44a815bf5853f1dcece2b8c9f27b93a6e3bbf29611937c3e0802faba2bf958aedaa463c40c2f17be581231c57e2d93c352ae2e6226813f2e83173280882710d6243d60dabe6225b858f8081e2ed2be10e46ba8509ab3a440a1801b447a6914547096f548923d48e4b26b22773f32b72cfe8ee6b91e58df44c293aa638736daaa228d6eefa40ca73a52859ac83ae301837f876b47e847baf8e5c74652ce758d259b42074a2c55fd3352a0b26ffd81b634d12dc2e954e860cfaa0885d67d71d173f58e2ea6ee2d29c283d932cae1a4afe6204cff2bdd80570dbb9c45a082ac7663039e8b32d7a47aba2f79a24180186fbed9503973130ad41f7e80937ca4a09c866090ec5c20b2a11235abc180ab25282cdf248957f2ef7f98992fe307a73e1da40f3009adfea6a4c2c5de912be5877eb80830511e88c389787a2b328292f9843077d385b9b514cc0db8ed807abdb0974998cb22c36cdff7a0ffad36a2a8e1fce847216a4f77c234ac48c985ccfaf9a65deb18fabfb48e79275cf742001d6452329f004b646d6ff905904226e86ff10f99d08c804333ad194c74748496244ccdd91ff65f03dd06af1a6356fa34d388d9866cd1440f00f4fdaa906cf998dd4f1d0883118d6b903775d9719d236fc3fa816262c94f595b21575c38e82f49b3550726c889563c119527c70592f0f45a95629faed5096386ef493a701abf3c5c5554c595dfeb8c50d80a2151f907186a8002b9bd8d20a7cd11a6d920c0643bbc0817ed8508cb9b9db01201622a8b310a0a4bd3c87e4521b940e6fe41f7f26bf845784a23e1f3019d2b1d3bf2e8963a2885e81198ca3389e05e0b6c8edf21c4c1f92239cf8ecb184c38161500fc7560715d996fd0e86e92c7f1b970bcf9ca0fd739b16b4ac2f50366351b797ccb09b8103c0f6bfd5d3e120a8499123ba4557ca450f9a9b46cdb70f6c439195446e505bb139a1c05a30e796d47b8501596d4ead98a634bcf6e40943858692093d9ab0fcaf8cb1876eb53bc671fab327a164f862760664b0eea6b7c56a489a16b41a636990b944883853d53cc001b133f32b6de1b996e4a5c9195a1651bbaeaa085e8290e4e1b852ee6dca1ee5e4cdf5551089224148bd7a8c18a9185fe3498827ae8269795dc46e672c0406987543737586538acd2f71899efc1a6be6c65e8498ec9201fd84e008168f199b074b506b321da82ad8d348e3228dab0b46d89cf59645dd0af8050f90926fbf83cc8341f299d11e12879878747724b1bf741dc28c1bb1a8a8336df001e411560b4f6228b2c85d21922c033f1c1c26481e4bd114a29231571a842381cd34661f2823d91df536e8e62783d41f8dee8ae9a41a0aab2f0df3436dec889c30046fb3eb73d4d42b7493dbcb04bea059ad7beca87d9eb527ee0f05affd0dd73156610309e81206f31598e8516987a01ba46a99af88655de0bd2f5b93eea1e49bf97da9ba32e6afc43e21f3b1b5009581be29c2e4bbf2f034368ad3d0158f5dab1cf150819df5213c1ee0ee94c78436f04276324e968a6c790413bd87636cb13aeacbf8d728cb39d5098c8dcc5b92ad863044f06ffb123096712fcc39fd4c90e43a1359429d0be5e4f311f555f79a53309444911676c5983b4374cfa7a2418bb0f92ef228c2a486e51c5e1b4bfde5c16df7f6bc984f42cd9d75fe5823c37b06a81b242654201299bcbec2c9c98b7a081aa1f89ca80fe2476c8f2ae7112c150070d96de4e2a2489c6541fa5a6aff26950a6ad991995873ca858af980ebde03f092b3b8b02cf6ef9f09803f65f966d19f6d59aef718ae4a2b87bb3fb201115cae57092a5fa9690ed0b39d5f6e0979c5bf7daba4f6260947541b7313ab9e3c0167fa3b3736e5b57610fdb2995c60be720dc232c38b7863cf549f1ea9c60f1a47a52c64f9a106db8edc59f5a6d30cbb50079a0bd1801377c486e444d09e033c109136511aa82a9b1ceb45d2d626eae050b79b3c94701e4cd0e83d95391fe2624d0cc138e1cd62e3d7a869d00eb50dc71567a8ec089c116b6b18bd1bb81d7ac6d5a4e53e1a89db3bca8ccbd63249c5818770689ca353e7493429d4758747d60942cefb861684d16479a3ad0d88d4bdc7966acc157e826ceef7aae8b3a02170b0903c6734aca2f729f0f950c20817e8ffec2b4e250c30eb1106c4e2c03888aae588d3b99167276efe391c088e37995720098a1b86b4cdd2c4722bc88b02d25eafd3e575341afa910188dc1d3ba7923586f3865436da640f5403483b6d434de0149788fd0e05aa5563807ea4da51f5446133b042fc041ac8d0c81052e746f66935da635c2188ac5bb7b044f933ecd64e97f3684e1b034b5982575bf96bcb13eccb662157a5c28c3406d1f62c85ab8cf9e4368ebe69cc00af0563c78083f9d84a198ff4d9b42fc7817cb5474ef42862997dbf3a8d95d742ef1c0cb7961ef86430ab6d7efaa35648a3628d6fa5e27a09cfe85fee78be78a963ae44662c1e01ff87c058dea4e50a045be561dd0b9dd04bdaf87ea94a7d1a2c26e191e2c17bf494a9e435f00f13fe867cf116a183fe38411def54f3e0a1e01f09f8ea4ffc3882534eda340293574abe0f452c22fc32783245202a8bc238c62be8e0624bc46d0517a714373062c8f7a99a2cbdfdeeabc77428875ce60d6e3421654e343fd63b8c3b19ec83ba7ac5dd72aca3225d92d6351ab9872c111c5a3a8d5844a7a5677da7a4dc01fdb34aa9f8b901fc05d92ec7bc0c22a1f174a9f3b460dd0e3251d8bee73b0116601bfd7fce5f9cde379783c3bb57cebbe0b1c978ae2b397ff7e25e7a5d1aff022c0d15b491afe1d31fa0a6a08f831de198d0e60ce512301f4a7b7002dcf8bfb0f55243c3e05b84b6c35a01ad999fc082743a3ff981a4e7488f5f3e316522640a0639f980ffc3b10c50708de0e02f23683761cf5a8288d47e5d12ae2ea1273d4839c9fbc9f50b3d80853d7188146c3564bb5800bce4ed2e505380ef9e2dc6aaa98fa56d1e40f8d6b3d664840214de1f40da5a06d7b14ca1d5fb575d8f3811ffccc3f9cb8184efaff02a2d3abd313f37f25186b75f4270a180e5034ec35a4b51f24a50a617e4be664dac934f87ed06324aae92efd66ab2911100d891236b89f106d20831ef5ce28132fe9512d09d3c996e97c14ef03f05e694a3631ef34e03b3b33602b6dde7e9be51d825f377def136450b91b8e1955317ae186e453b9a3c1ce9454ef4dba9f29ed68a4aeab3369e059f8c567d137652dfc2ed2dde8236c8acabb2f7b40c869b8ab39abe0c6036a528f316b1919309118cc2310ebc2187a9dcd187af80b84cc6c4dc462290a06e834f20c1035d464f94965f62327c1f9c9f4b5f762ecb06093eea4b318399701c61eadcda922dc5263a43634d9b7db024e4d0e86a4c72db9fa690e358903272eee92762cc33be4d5d94030ec94610c2b92d2017e0bd377751024221d6bbeb7c6c1855f754d2e62a98e2e7baec1c81b35bf4067065884e02cb102a3ca47e06108cb6123a5ac650691970b0c09c721849bfcc46d30a780be14d5834fa93c790bf137250773306d3ed3c6f25d58f084fdce49d519e1bc577826841d8fbd9f0f67705ca056c968ffb34a71b1065e55b8f80c034a4a4cdda668b9b2af85c2f4401779e5004d456f4eb3771f04d50490a7e2833a6ca25028ac85afb8195d3d4ae134e57b4e82a3aac3e1c9a9ff52fb252ac066a3a4692ff2f35858173b27cbab84b27d847482814059000dca8b15454c9d6b4a3691a8b5308ff2b5028c9fa042403ada03c039470cccbd9eaeabf39ae68dfa22986429a9ea36ceb16fe2b912c5dd531b88fec68eaa90e561aef56edec0b6c31dd81edd3a13cfb7832fe7bb5f5028605358f6e3a8f6d6b3777dc7baf5273aadb9a6607e3c66a738fdee913802425780ed7e888552a6e789054481cc7ec0c622b0e7cf4899e443a867704780d2da1f98616119439e49e2bb49d7d1bfa12369cb8b1ae2b02c6b3e9ca42eb43eea43b099413caf2f642f742d6e9f67834be1fedc0adcab9e2030a110b286302664f908179343e8722a6bb8c166fd00bf7424c4c901cde94def2c8e70618a849e2255400554cd74502ca1f077e3aa4964c169d81d541b4aa9a6daa8a6706646ee29ada6c1608335dc4f38f6a652e24f65f3ab2070f7e366beb2fbb08b82d424608bc03f1d39029b30d1c42383dd151c02aa97c66064104bc883a26111b8cae42e9f2f10c3785a4ea918f9840fd3688ce4911a06b475a8f4ac3603888d4a018850cd7075377c4c5ee3bcd760625b005fbebe6643713816a2e71f5408d80ebb057344d597cd6a834faf8bb0b920eb8835aff048088bc1204ff68e2a0b798e6d71a207f32e3d3d2ba2df5121bf662fab507f303d6f62dc5e9451801422c076ba214383bf9be864d970dd31a515d1e473f1512f51771521d1eeb8d91df8cb2565248eeaef9079904ae493d28ae67c6ee34bf67c7b9953955985866ec2e4ad884f8d5e318d104f40dea9b306ef07302fc8c013304d7fbef180196d70b25a06117e47d8741f5830cbd1735116ff637c01849ec737da5243466ff43ca391b59500a05e13852c37341bd1bf46ceb5be1fd407c1a48b6d48e80daeec5fd2b0f9bef104beb0517658fc6ddb51118c85fb1839fb4616d7013441630ae7aafdf67de33a77d267eb70f0b0d7cef41cf106c6dd5b76c19f723cd59b9d75518fb35a88daa16b24ad86bd1b436b537f13d32bf9de1e68477f8b5bb27daab68c00600d48c8eb03223e8988465df3b660b3815bf9337414213a620ee083e1965d392ac1da273ae632a702603539b4b988891a8f6856bd31e18ebdb29ccac0e0d3f30258508449a8e6469d3236ee1c5b16439feb8d3de0dd51c74bb703ffed6b319b6e63b32e538203272e119fc52cb2b1b267c02519fa15f42349af37d80a426f636744dbe7a892e6e80823732f7aa738fe848eb508e73700f3a202475b5e4922de2c8a123fa2a8ab5caa9b818d1516899bb8de8fe80402ddef7e5c40b41505036504b9746352c776a3419199ae30803be8bd019ed9092b3f7bba1bb7e851b48f1e511ddabc5c34175bb6c99719413d668cbc176380becb18dca1fad1bb089c9a90e8905f51b8aa3a5cab773250434f2d632f11afae0d581c2fb13a82b08426d23a8a3e27681b08a53e0d206ac59c4475917f1ad3133cdaf0109ed9362c4bff43332a6c7b9bfbdbe68738cd7ff2f4c6953c5a49c482ebcce5d02f66de34c2205970e105a8120c77ecac6d93275117e46f8a2753c04a2c2dc8e2980338da422692df0ae8cac81f8f8b9c43c7fbe46a4f90f68afede0deff50a3eccd94df78c071a28a946248e9e8775e05749ec677ecbb2c0d01cd250206f1f81e06f8a2f9f02c4b6ebaa8f3e6175643755a33f714ac90b5a2a5d76574f6a4f8a0a2e51ce8bfc4fe5b6df9b9d0454590bdef390763b7508141bc2e300758eb7835ee735788534ec9ff718dde22a0d02038ef287c54bf64683e1c1f8a3c2cbb8cffaa79ee710b9c68022d5a612a31f2efac26714b35842baba2c1a2fb6672cd253557f677efa8b095e302d6c5f5ec12a3d198b9827b9d0b94748a742a99339f0146b1ea4702720717115f86322281cdb2411652228f4e254de20dbe1b0f4580a7ef9204cd9f920d8cbf88630b8c84503547c19b1d9880eb8f652feb65051cef6f57b4061b028707c3e5efb08cee4f68d97170700f1ef3e0b4077212aaa169e6c6c8d6827bed76cc59f221551e01bdf3b0bd279bc3564807bca3376eb8d77cd0779b08cc38feb97773d6c361bf5d150012a5b5fa06cd99ceb5146bcb278ad0e430548b05acc99c45f59e97ffe6da6b34c5c1b672a23c8548306f4a73b84caea241afe1a93d3e98a496663f45f630e505f39153b76321082b501f4bed59ff77f33d3a7a862690f8c09021d5610a85bbea45036d8bf134fcec5a74d6971001115aa88a9a83533efd977de2f10723971079419bc21f0a0824eba39f51fd0824bb3f2c1a6f51a8781f043e82b5e56a1a9a6dba4800bddd435de4544fa4b3432df58fff8a1786094fd7ef11186beb3c0dfb95e5efc79003553e325783f179de7955aa78ccd1aece079739c08581de330ee04241a3daf79d2bed72b3e63c7d74d011a3fd1c2c6bddd0726fd2e793d8058c47359d78fa28ae030cf624bbaf5a5e61edcf0ca6a79a648c5a1122e0b45fe8538509baaf56a7245bb1bbad890b25492f02b54c351b241fff954b6c1d3cf41467d17d26b7c9c19bc62ee2c41a15a7c1f39f111e0ba491473c1c40671f859380ac630e16a980834c2b2986bc871853a718dc30415d40a812f487203547590359695e4b3ce264f3178b99d4deb6d545d5e1b417d8d2be5223c9bf8630f696f8e86267d1d43d73b51b0439460ef641a0c03ef89da60ce0805cfe9792775ab610c0a0840e26d230d6f79366d0ff9fa2a8484696be1c7e391b42b668994da45dfb2af26b982518550e71200baa69b8d8d859706336e51bf7c5d5c048d8a70d9c1e32bfa99aa3b7aae937ae8c5ced6ae8b34bbb171a68e0b1e0cb87c958d37bca606aa9c566ca9b2e83dda200a37b1f33cff6b8f54f7194d2e480443b43253c3a42a253f5dfadf3cd1a4d22b65f922c926b444ee00ca5f65abb81e96e5719efad0bdc3c773100af98eef0e64df10228adad7a1f410a8aeacd22d1005463d286f9efa8be4e34e6ab5c0eb8e90c80186e9fdf966d7ef541ec0453084246fa58cc9c90d9e2e87b6b23d73a3c994fc9264ecd7e4fbc290df842229345cf6bc43c0a9362315d07173ebefe30097423490b9c7e73088dc36d5308e8a404afd673d3a30c2006625fe2da1380302878ae374c607382c98ec9c5cffda8c2896612a62900d131dc5ad0a99d8dbc66950d9fc94b518f2269442fa57aa8a3fd734c708be30e37420131c34c31b4531024c23260e3c22f414f68d276878bf6978612e72d20343b7d57eac711c4f31ba79d64fc0f154e3ed9db2f9dae2e93bbedf8280643c2d724eb28344ac8d8c6b3d848a870185a62236633cd90083a98618c653ac1b1753359eeab0855869184fc2a9e5dcaa2086daf3583e1cfb018c5cb297a24aa08d5ff91707918147bc7f2ef3408473b9275ba77413988031e88d5b61be3239a1718d9a2327d6de972bca40d476d96e00098b0d1bed3893d278025c7ca1931a865b537867d6f12a7c423229139b6607caa11203825d69dd6493b8104627e1dfb957380def0a63c6fcdaece98d0cac02312b54d9d9c7af2ae5556f4d4c542e342db81f2395fe652c3b41838210029b68d338e74ac4e3a407f0f4325cf966fe6776747777d811221af4f1d8c238e5aac7bbf235d730a66a3facbbb88d571036442224b5896e61eab8a2e4d6090141238b94cb7c61d0a4bbbf2d89d11c3f7e56169a42defb68968ab6e1d39adef14eb94155acbaae563980444e21dd83f2915f9497dfb16b2ae6a428ec30457192db9947186d3f72613863ecb93c6c4bb8628c31813ef778807fc117b8603af45058b70b4552a8ecf673b1d3e34e27499ebdc09a6845f6bb93f98d0a562961e9a4ffee3f0b42ac4c868918bfadad164dc5bb129759fb289028114bbfd2a91ec0ed3e0d2bce5fca40b769ee016e6e40a7e22bec13e361a9593537e0a86219e3811cc641ba01b634ca213174b58b4c13a41b786ed02390bce5065ee9803ec964d20dc0f7cb27f3695ec652772b8d76940efd79fc260310df4dbbf0c1e87db89c7f963ab0010c9f2dd0b5b4bde31046bef49bbf39373ef34dd3f1e44deb97c1d82e2ea3910699a2f966b8048e2a56d5ab7d335ac8fe286c21c550fcc896ea5dd22f3cc66e0768e8acd8da8eab28ff12b016df797bf104b1c2dcad89b0fc54949aee701a80fda6c1bc5c38ad29d0a68183f6d236f61be495a625a147547cfc1aca67019d612f4e79196cf937e21616c0fd29df92d4adbe0e5f0645b19f9dbd3cf0ac9fbd50a3757943bd3fdd087252017a663340f2a110e83ed8087c3fa33566a06d826e0f264cfba3926a055e28593429437a08a80406560d1688fee2907369d1cccd86088ba2afaab886984e617d6685ac49f30e852fdd2ee3fef7159ff09ea37cb5f0600c9d648339ef51e2351b33e3c3c524aab38fdde06efe1ed475982c68f53554e104dc539d0a2b497ca9eb9e4fad0282bb33faff304c380befd87cfcf0431937b4d633bfc0f5a00d2d8b796c4855f45b6363cd53042aada4936a3448d8234117d0617f67dd2ce4248038378a2f168b32ba260bd7126b7126ab816832dbb61b80e911594476244ac2cdfef1a24de334e170f134d2ca8725a3daa334424414658916875378034e0863d8e3487256bc5783aa86071b8bc0ab024751116a9ca1ce0c66c8735a0b10ba9212dc3e566d537e8a556bbb21799daaa901da70c04fd6eb5f5cc9ac064fd3f4e81ee66ec4e7c867e2096592ed52e31167dccb1d97e6900aa5318379f367f869146a4c1a90b58520f9436161f1b42a50ff0c1d7aae2152f733c7dc74c81beba23e3544ed33b5da21b25d07227f7b53611159e2258ab950232c498a028989f2c223e3f89c6b66449b12fca4efaae0e988f54c043167513ba6959aa7f9a46849801fd58ae95ac1c27c34cb4af6cecaa9992ff8d59e94cf013e475aa7682d8a5da7b2e66c288763e46f5b689d92903e5919e803365aecf955bc3677f0bdadbddff43b1d75147d24af912bbc5cdfe8a1a70a20c53188a6a4c761c009fe81bd16f51fbcc2d4f946c9b946e9b2b9d56fb86bd943ba95f4af6d43a49ba5ec34d6793eee9f7a097f903b73e0a24ea63ee2b350055e37d9e4a71af1ceaf1d5bc86616792ad02fa66a88ac06c41847c39f619dae21e72afaf6fd386fec27ef7e10065c8d87342584171a2388694e56f1f59bc925401b65e34abee5efa00886c8995424484547b926d0dc962280b84e79a19c1052f77faa5cb0e9770ae23339363dc0e262835d50d6e954340882900387246dd93dc87aa3c99f18aba0c9609b63674cd1d1c48862ccd6dc635c03543794e30563fd0e393b813bf137cbe1af41bc2ba9f53602ab06b13cd1fb38da6ae88dde8df20fea1d96948de5690e18c0c42e4f056db18eaf1f5e23a092226553d48fccf4fdc2b554fc57e9f42056b2c34981d2a60dc8591d6bcdc20b2bd1353e14a946bbe687cbc204a9174ca881fca554fded00182af204e173e56c94990f864b3a6d03677054662ce5af44c0e0bd2a1c4c2c8f36fb0dbf08a2ff41335f70e6bd1a3ee3f2b26dbb69a0d476a6c8428498f340183f5f83828648242d01c4a77ecc6f7f7a20ce54f650f0a2cdfe0542b1fc99f7721a3cf67695b2bd1da0b9bc8476976bce9a98f883152175c8b092e6d3d7cf3918c252a55f415ae0609883d0fc31b28450e3fab18a4787ec4e0fed366b20726a9e9d63a13af04428cd43b011f9638ff55f28e5359e10e980e35545e1780cc5f5c2e6eb8caf2a3fd06b788602fc641ecc1c5e9c5894dd9b8272433d37d324d11b0e9013967d51276c3053343dc3c444a8b7e67bfa43f46ad04ed65b603896dc86e9978b26c22a61bdcb244ae7a976391c2d9afab12ef4935b2d4b370e271f76d4f6c2374c41576d48d68321cf31e5c29fa0cc89a23132dba83a01b393d3a440d4436542f13fcd2496298fc55792530c5a42e39be2d8fed849376248df5f4bde8b3247d0d21dddf0f1c3940ce9dee54de9c8fb0cb43124b607e0ce72ce21afba19a1772a79f5d8b8da842224378537a56351fb635f5f44d26d169bc7ff8c94857e5d7d635bb75927bbc64485d2134610268cfb8876854c7a6e642c15937364fdff274bdb6bda72733db42885f69a8a3048bd69b986d2348a355274bd009e663429a9c4206d087870c7b41967fd1ac4a8ebb69f44d4bda8a82b8440695af0270dd0b9116883c25311e8011d36312ff46f10de54fd7ce86b6ea9356a6ae133b49e38d47e1e2e844eb19398787c68fb794144b48f6ee148bd6234d1757586a257ffa0c0059fa28014fd880af9c377ff51dc5cd41c5787810a3e481446a28f3d118d3a81d60affeb44cd9b88ae16e2426032b81269bff3864403d06a30639e73348666dc7ebd8159ae09e2180e2d3cf00a2459ab6b85460870e7490faf854da7f140903126d88a10668761583505ff47459f8c70197849e24bd0e37c6b025b4b0eed221a161dafac54d2a952b627e0bd0ee14be0e989a58c6989615ab4635f805399a24478085afe43cc61ee053e231cbb9a11da8cce8e3b635a7ff406d57e117a93e513ed3e388131e765444864f202b071f5a08300ed710c5d4025a7b4ab88f780e59616637ee972d887e9e73ab1042754ba009b8749025832e2d37e735d3d653e38d4b14139bf66fdfb0065cbd18c7b15571bb49a133c40e7e41b50701ecb63a7f3f7c531a44cc29c4fc0254c2b745289a442a2e81f2ec357bbdc9822bdf1dd62fb45377e3545fab04e0b93621c6c3fc2131b45244eb3a42ef805ad02d375457033d6f4cc631ce3cd1b22d77fc4d2ce557b6961b05061d1170a9a6227c0a64325788343d5600d76c7307520c7909530bf82b3b67e5a2abe090db257a822fe617db44719aac636f695a5fc2c51347e830493addc10447d0fb9d56d308e234f4a07df0cd0402d7b614dc6248b8a07267209d4fd07f4a315fb3adc45913c91f211dd7502809af46b6e1c18c667f11eb4d5a71d39caae24f93498957e45dfed87080ed013badde01bf5ed5fcf59211828beb5bcde9e49cb4717a9033138c34c20759aa3d5c3b68704b8b99920a794d1f6b2f3e57761b286a3dc2d3c72cd53e4700e6fbacc75fafe91a57c0f74abee7c3574a55489a40c893447d5950e905aea48aea24d601e9ee206db478131035cc4e95a0fb5650ddff074e38d60f672c5bc43c82012e02d7e4d7b67b134187fd73d792f49033d8f0141b93ca52ef28a693ae81555b9bf26940a884ef683226367ad229a7c2c41d48116032d22df375c13843c15277da8a5ef645e29cc95a873f55228b3476ab48f1d4591e4ea53b7b3d12ec3ecd5864064d8aa3ae6ac70cd9bab714b812b823090113dc229094f50adf499cd6b427ba9ecd3d9857c953cf0a9f826fca387d2fb729a999d21865ac8f8db29ea28756178e5bfc2047ed489e3882b92d9f53261189044d09703683ad10d932c3ea2e8b246f471796703a31f6fc43b785800711f3e31f020b533b82d64a1cae67681de69bf63e07a0bdc1ce69358c979927c8030858e13dae8e0c662d7ddf9132f9fa0fc7486d943f57d33bff3dce678bb762cda054c4627fa3d7301c39de26116437ac48018668cb762fc3a6c3c1a593d5c8125ce23500438216d5b06088ac5756227ca3cce1e552099e5ec7e7ae816e13a658e70f6e600f22e3cdab47489b9f763f94623319e1a73aa6c92a1c55f2162ed837a59989ea00d1e7fd4f930f45e66f3e2f72b5f786a68978207a185620edd189f0980bf242fbeb040a29747f52fb9df2a164c1904c3abb1128333f362c156b83a33c2fb6080adc295a0033ecbfda4aa44b79e0b0b7ac26f63c7244b426ecfac103aa211abbd3bf24c5e570362d1b204cb8b0ee34656d12665cec58a7162c67d0169d5d512570ee4c5706fa38169eecf3213dc502077d273d9ff8738b81126bb928b5e29e4e4fee9465c99bc62751cc7fddaa4716a1ccc58ea51d20ac1e45726b168d38f581c7439fb343d179a991e7672786d6c8c3824736b8be7a20ee0fe276ec0a22cd264fa6bde59c4e29d550f5a0e78154e9b77d98f7a6d44d37c6b643ff31a5b48977fd1bf822737c67c69f375564fa9defc3d083fbb0095800d0b2e448aaa30ba67713fe7f22f43406bef670b18b52aa0ff7b4c475100866b02c334351305744d2f0edfa1b6053b78ee5f10745cc1c67cb090c06e2e0099abebf45164ef9807fe293d6531e502e5795d800a899ce842b36559fb0abba9065c32e0cf4828a45b072f01c69dca176593894797f9cf6091a8ad7af0adbae9f437923749b648434aa9109082467b838ceeda11014e48bd4d9aee3449cb8ba12b5d8b434f8504e31c03164190d6f8c091cdfe67b6f7517ca230b660fc01d175cf552b62ef8007684ba71e01916b0339b99c7bf0ec3f1c53352067c89b0599e9903c944c77688fb6d5b040745f866ff9c62895a8471aa09c279ff5bc5493592d9360762435abe9fb681deca3d528ae8ec216d4ef998100bfa8b13cfa7d1ab52492219f49aa7cc5fe9dbc423cb1d18c842ff36696884febfd644c350c205ec2a99a79d5b4f45f0b1944d8f454c19bb01f9c188d769dcb6deb9d9e7181bf5d8b0403d6991e48a279aec329594b66955b0187f785d61914f7b7a55af65e37bf5f9a2e8480a67ff01b3c2f7dbfcdb92ce4378d65d365e99d145e1084a5d0ab3de902d2c762272fa7fc5c61df1e8d9b268501415f3c37d86b9603310356c5159fd69f74b9512789913d80069f7e027c4b8ff25f75e3b654873796e15711040a76545821a5e35be61b74cfea1700130240762805253fd29c3da4760d9a460a1986f633720e61706b6230bff4450ba4ddf95bb0498ef3aa54e64318b34ad99f455994e4acc6914a5c0027b390a50534563170b90ca043c4b30e0a28492634971368846bd029f18f5e4ac608ae445e6e896b44ebd08ba8799c79dc2d25b2d88aa561888d288c4fbb24341d49c647a07a1e7c0c1abc0f8c82b137dc9bf83df6f7895a88abaa2a7c7f9488aa7ac50791c67717a5405da09fae376c686ee3290044cbbbfa45e3e564f98b6cad50d91a431c31c4ffbc157d3ba294def0504a8f1b0d38bb6573f16edbd86fa0a5b322c8500605eb6c779131d1dcdc815686e7c7427db1d9c22e6c408afda2b9c0db03cbaca1548f9025acb17fad2a50e88b4c47d68f9cf6faeb39046bf04e2efb45373783157d52696e04b12ca8093ee25845e66cfd344098524b20f134cb6ea409aeb68e9aaa4ff575b263f470fa0288145bd0b249074152f836b4431737243b85595a2a4d6c99cb3d6f5f5f2ece58746bff7c609923fd620005e53ab32cd6cef1fb5500234e8ada7a9f5255be0331be21c78e62ceecbff17ab1e845d9e8e673e7523e567ad792eb063738a43af3a2306275abb6d2013304d8355a100d8405b8f8a948095160d774a8a46c01595e4f72bc398308d6a99df72e8b2cb25a744e43f82607172c16959b3c3ab7183208e6e3d6ba263182077112ba39c997d0c7adf742773180f77d01e4cf123d4b43d8172ad411a92d6a595fe008e10f0a2cd7c7eb6269d15fa9b12a089b692f40e88190ac3c0779e9c367ce92327c490194855b23941cd40370760bcbb92b307f6f61408a149cddcf979b2d0fa8194c10bcb123350bd1e9e283c2195480b0b2167f6b5590b91f84236c0e1a355a2151b5a32f0f85bfd588dd98e010a13153e2a434c81ec1b8e72dcc388e573f07f3aaddf902d9f40e3f611a711112a14946ee133354b830a87e4a52a2fb35d3a54114f5b22e67fcbb70259ac0a770ffb424950fb1cfb2535106ed97af03a14be582c5dd35c5f95711aa1ad57b63ac54a24586854559438a8059d1cd25e53b10cd75b4a3ee6e0f9ffca31f5b05c6d75ab3c208c1a1f4f05fc7b5366e63a970facafd68fac47d35bd3a82babbba1f8935165120abe7758e6469d3466832f957d189efccaf7161b51d4bb06929b06a5b894dd761179d05a67654a8a25d7d18c10339906255ea0f17af25f40ee51b9bd2f2420e02fea30a1a513047e5f1a046d1926f96bafa83ca3f2c7f84e826f59fa25fd4d93d369c60dc2e6262dd4ac542c54695d93b5ffee28f58a8045350754c3e8e09a44269bc3e51c7d2e8f9bffe85b480ce2dff74a77ce5c4ec1460e42173fca9f1d85cbcda4e5f75a9785523e8f86fff4d27a6046e2ef3119e971a394037075259bcb9e12d6d3b265d6a24f601b2ab7d729d174e5b1ec9e2396bbdab2c2bb33b486a8becd80400bf488f922850eb00fe03984b852a9b2e1e36c52e2e91e1b6a91713d804c4877b4a271d9f07739bdbd6d111b2a1dca1a80a4a718a1d82b442f1f7785bd971001e099de48b7f3eb4a7d86993f6a64abce4808af0aad2b86924bd4e1a367079cb5324054da250b74aa753cf5c8fab1315402ccdbd2cd7ba75d6326b3c60efc196d05194af21d7ff736c9d5ea37a8031c2f1a95cf3b45affaf5928c085f69d540a05657cfaedb5096196ca27c161bda1a475d07e4a3c427187a157689cfa201e2cfe5ecff7c8dd79ed074e6d3ed48895f0590cebfb97b665165fc65846321da87ae75383b041839416326e9df536e311b1f6425eed5f3e0748313e98bf159d76428cd6d9dcddab7462b17b57f51aadffa295dae4e61db5277f9de937ce36fda4ea4103ec67491f6bf9876648834c3858593e3171d87d0a33747983739f12c2da3d6dabaf5079500fbe832ebb00de3c2871050f0b7af028a90288088484edeb25d6088817e30437611ebe596f36435590265221c4a7178bff8f2410d92116a4dcb111ecc15459003a004a4e7e1184282c9189ed8219ab4195082c8853eba129692d79ada2cf9f4e74be17b2bf34c463c127ec1ce2a0b4022db7faf6fcb774622e5d6c27acfdd740ea6414d141425be90aa16426dd51f301c17627e41c054be01316f84188d0fc8d42b4c7100fdaef041987e32931e9685999090b515eb15478a6eb7ce69667e04912e3817445f00c478b645a3c1de28254401626b8c0b3d27f478fed9953be2074851f608867d4a8c8edfeb2f78678127e8bff2c44f02cf7b8410fb69f166a44500da8129b87fe9bf1000b50c05d2261204dab07744cdd4c85e89b25050b7d42364519392f58f39ef1d67e06ebc8a71197dcd8b7b42e3cb57a41e3655c3642e3257fe1093077a0f1a287712d1ba2f19272e15178da23e212699c2a758e8719636038a98ed9a6ea74370d14b83503669ab2cbd655c7657700acaf1169e5b978e08a08272b1e030ff1701b192101854858097bd5159dea3fd7eedff20a113c1a31e251324e5d32132b4796cbd346b160137db62d120b99ed3bc7309e5201bf1baa372ac3008f670fcf2e8aad10e54d3c38ef6c0a9f9dc9ac4773ea3e91d82bd73de1d2c3be501c867b84004656d32cd2eb69ac4407a10b82bf362e364724c6dd2fd347292548cbc79c2cc4cbe3e2fb38d20768986f73af9171b151b714721564d1afb5fb5a70485b14374fe5fe176ab7f4346f3b9336d9bf9769b59cfdbbfb87cb9cd33f29bd678278e5bb3105ce9a7f95cf6ff6024efc07427f4bc76604ea9ca1e888fb003b6b7d6f723fa2164348af914984fe262cab9c950ad887c52d65a2720acf07527a96dbe0a71df012504ec025ad69af2827461b1570c46785c01d34f6de7c863ae6723c58289ee4e5fafb3959a022f3eaf0a36ef81ef044f3e04c20b6189c4fae24cdab8f76d3a6b0c9e0188e12552a9a1f59fe1c1504279b3c8f7690a34771948974f47399701dfc6aafa27fcd7057b8d7ca7f0fa421e6abbef761268e8e9d4e66737992663eaa477d07152c28cf3281e098a588db46454217117754511276015fa404427706b2104ed555e12552968882ed9de52d01146f7d8ad2de4df0c14c390b15e625343cd1009f905940eaa2be05b6b22ee63c9b0a63e476dc4057c0a7520f141bec3df76160677348662f5b69e86fef488d8e93c31ac582c5a8fe688dd0fc2964576a6ab4d9c1837248e72857be2ba02b84f1e5ca6f239e8f99ee843dbe91cd5cec297a9224bb4911f2924b9e650a5379a3bc506f435d66527de804a367653a6186023d37f3cc4303c68a58ef6f01e517588fe8ccfb1e789f5082d353c91ba490aa5fb8e6613f167908b148222985c6fe20103d827de3044aca2399de97819445e1a6de8fc126f0dfc8e1a25e079df8164e6d3a9b8471686d08d26caa1df2f55b22ca57d770d6c8d07f6ba2a00714bc89b3221ddaa23285d26dd27263f51b6b0c082772391cb9b4689850eb762909d948446822932bf295ede57e567a2afb04c76377b338332ea01dc7ce058c791a6e402409c8e9ad2e3d3ab86ae71f059cdb18f47a94aa5702a411fc6c1ecfcae0eb0143a273dff3f2b1fb0adaa16c43bf9ed01c08fca84aec733cb81e3c5f8d308b0101108d3c25d4b474644206c75df6deaeb61d94d9a1e075427ba26f7762bdeedb49c5c51e34d39f49a8562f9607033260b6c05d418f04a65d774dd1957be511a48623b95003ce2b0c84e0692e47391a0c6773034edb711a8c022d0a4a84f42c6269425cb946442f6b7192597d2f6bd4f8352a88ae7a4f23894aff6b8411f8c908c36cd09ba25aa75beea4543bf41c617cb93c5406d211492046f6262560d0a1308f28c793f94de256eb00d81bf955a56514fb684368cbff8b3b690358162fdabaeffd12a5c64a6b8487e7c2df951a32910ad32a91baff45dc5244385894ae13be5f1409673d62b8c7fb832c4ddf3728707323b6572b234c959bc80046fd7a998c5dfe7f3b5aa8d9bd5340a2323ca75517476dce404dbfa2a2378c7a7f16bc9fe2eb9e36c0e3671268108e48b02295464f53c085be1dcc7bb8aacb67712497005920a6c40d344b0b57d864c4d632481188c1ea5c89b018f22b9c5a17fda165ffe106dad8a3e82fbcee7eb59fe1180c7f853d74aff8fc5e23fc7e282c1bc655cb84e65ebdce2a391da47e85ed0e1274c229804a3d62ef2e2207c4c54bab6fa0cdcfe85d97536f0ccaff06c3fa7fc2cab95bf816b61311b77fbb0bf201a9e0e0d1d86c3efaa69580d19ac1f47c2f1d27dd82e3742afb7012f491c47679ceadad1f38c643b619378b258d462489c06c810b6e375703da76d9768283249be072768eb2760428750c7c5d00ba1a961eb0691ae9c74e22d03f8589e7190acf54f0cf00c9b90a105f9364180b6291cea0e3fc7db65ac3d57762ba79999083a0c1261019a699f78bc26d4d1c4891dae7c8f46ed97baba4bac9d90ec3c8a705d37040256e7c60f9261441a22a23e74c0243dd06e118171f264262dc18f3a8fe0da7971cc5964c121d87419246d0b5ee7b4223fad42a8216654ff316ab931c17f7c9a66498104730c95eec0084697f64d401a79825674e7d69fc9268dbbdc483b629b67b4634d0ddd29d5cd1fa30130416d9b37a27e88c90b85bf8fbd83e713d954f6f944c1b2d37f1dddd57573a94cb80d0054a3afa92e8a23331974e8ecd52703d2a3ada981ee9ddff889ecfa9a281e318ca07408359356e515a8208dd4089a3258607377e843ad7081ed94cee0c50d9323c31c5242550d004e62b1755fd498474db55cfd8dcf500f70c5bf76e382c2b700412a1912bb895fa41a564bb38086a9eb06fb0a33d43ae482236ffefb719c25a7a0257d53d95fda109352016e14ff193af24a62ea0bb533165b283d90a1f0ffd232c04af1b8d199a63d91448656ea7b41dc0a307fb781d423ea4077a06741cbc9e0c6383060353663a09b0a9d41768ed38abc250ab8581f3c2c628735e09e1998519c25d299c41e69a343e5fe58176d314ab0b00351072598301b1d54ed5d9a4e10c0d940a1be11daf6b728e8135e10c90c3cee3182ef8431a29787398da7540c16253cc8c3ac92916f02c93dd85456e956ce7855da9fcd9b5ba987670e6c8117ad16529f7d9ff6bb223da4bb1959d5ba58c362c26d4066c9e85a3cca6a294bd6352f08f7f9db52bc1ac6b0ce204b8ab6a5903640fa08cd5f66d2aabd09552c44d94d028d4529b661fec3c7fe6db1106f39a6c3101eab0a84b1d58672d15ed61c2d86e0f59b9deb2785abfcd96060f7fc57162ae2dad63b4174b3eb09f96233499725f929027988336c352ecea647a277d425a82936900a83264b294266ec4560179c4c2f730adc5107042770be327a982458ba4a6a180a23c9723e2243defd10b706cac8138aecab183e4c8cf4f26a66481518c939d8c304e2f55fb70c8e9ca2d1a7982bfa17c3ac4831806d25415adb3099436cc8ba8bbaff10145d3ce5c28cb0ef1a953c47857e727868510230362359dc37cd4606deeac1b8fa4213ee7023ed95b6db6985983cd6c588d0c1003a9a2701c13ebf10add8d193e501822509748544b2f7a97259e1bc8d7e586c496ac255f926f6c5e71cd83e40119fcf3af0c2ec1a6ebd1b5af981cc0d169614b144b1524ca0423f6a05e18fcf3ce7f6b56959850781245ac0f795540e17bd508a886cb029546499a16226b36bd7b08b7a59f15414f70da9930c8134f885372864ee813c6878821ca5340b1f0c707e3304ef488890418130e085dc3a275391ed5eda368925d7093489e6c629f97a10ffe7dc3bf896f0db0d63944fd9a87d3cac214a722390e44f42b64e9c6343122a148280d595f337061c475a1604c94eb4ad6740169e2dadea9a1776864d2c4f5dea701efd498f7340a69e93adfd380776864d2e2daf47d41d148f31306ec315f5a2783cba45f0f9031707d408b53207386e6c2d4dd49d9283ec050fbdf422c195c868c2c830c2c1f6b572432b92c325816190e31be631964665964d096ed2debc42882325fc4edbe1b801b385b4a6bd46177248a0eed8d8e13c5c808fd8c88559b40255ff4b08a26cd8730f5be05a6c8887148432953f3b3161681e3a80f683b82df62489d73df81ac0058cb33c6158cc8e30f0b29c4af5ea466df11534bceb16355b2b845eb3067e28b5f6b862764ce2fd05a8777fb91d55de6d4347449eb9a412ddc35f5bd5047df547338b21d41614ba1dc88bdafdeb7755e40a15fecb6745274ed4fea40506a554c32af19e13c492a42a2ab7eb014da3cd32efed2176bcad64d5e247cc71234a20a1def6b261b67e13d048208a7b9d68129551b4d0eb10291379aee8c955ab60478bd5e5ffa41aca8d95fa58c5102a97136e401cee68405b9fd3d623e2cc1dec004d81f5a7b0cc34e82c0de1ffa4d401e6190dc0cdeb0f8f05172c474dba08831b5a06f7a8a9fd74e026a6bf0150c11d1389c044a704fa58cead6cf4089cea6941f0a6f259a5a921a31f72c1b32728c059f93a0edb14b2284e8080a544dd0a5960752be1a4da6d7c49b958630899e0a7ac6cf2e8c324a8823492d2e1556378582bb9607d628b73cbbb3b91396dc4812b81052042dc49f3ee982c212f613842c27f794754d81700757b573bcb310f19496f58b22be56ea8ca082376fd542156bba122bad317b783f853a2d85199e25a8e039b074ec964834042e660948e5b5006d00bcedd277b426f7b33b4349247340309f74f2c989d6e690fa4736963337d24500c402c0f1d88c3c35e211d6e026823be79a4e49c41cd8c1d702281c7420431e5e9b00dafff0065883171740f13e7f411b3fcfc239ec081f404421dfdc410fd4e49c636b006d6f50ab1ea85f841e5c62490a7c823b8f3e54dbdcf48a53e2fff2f11a58753fd8d501a09fb5526fd3ad61ce377fddca4294bef2c8d9b04019db0dabd5cc455877b1922cc5b67b076c070cbb5e359129bea6c440ec9eed34f5fdce47914f1623ee81c15d83af90b8152d3a8b63966419b6610ba409eac48014b4c099caed49082c2f2cbb254671433068e11f67bebcc0e8f92ff3e2201537631ec6519383c98402c9da3ff796d99825ca6266e43dcf4c70f48dad5d91569c9054544d2c959660f0406834333bf46696ade13a360ab75dfa7a87aed191e44c78274320a26a5cb7c7e1ce8a3cd603181eeebaf116051c95e6c98a14320f054ab953804ec763c230033bf76808b9189a2f39497d49bde4e5309fef9bc0de9e36602f862727a7348179fe54b74aef7af2a33ae3daf2cdd05c9c324ad21bb4b851993ce0f475903a0a678299b169bced2ca447963679ebf53398740e838f21c1fa7f7b37a1d56824d2ff0429df53136b73c1dce0caa508ee502eee3f5988f90c09562b1239f9a64ff1be30ba7c5ef329f6b0bd1f3ce8c7020195087db91b75ad854eddda02dbf092cb920e345bf884710950d1c8d6fca0fe055d0a3c15c601830e6be4c7ddb4b00088e411a61473e080c539abd338f96087cbd5639e648a644235413b4588ad8afc242867fcc74d9935fd3c7c30cf5d37cfee8877cb9c7ee4c4bdc3dfd84f58653a20d80f639446566488302f5420ee49df9efe67e8bd534431066c11c93d78ef4e3d92cbc21035698caf8873b7f666d0f70f0771a7fef3bd8b574f0cf9da8eac62d47b87dbdc25cf229b6cc32df95c007d3388fe8e89a30ca8b8b866c8d77eca2ec42f9342a83021682410dc5c1285d46bebdce11989b77cb91b596568cd8e4746f0a57ae75630d4a4b605316e1130f5033d831779ce8668be08983adeaf876b5da77da582359d822513a5b4c93dca5a5731da991107785cc8b70898b0c6f5fc4e044ca9509c54a7411cae0a4701a45ab244113065edf62c9e3de2b0d27ec1cbab061384b82763bce96772366b2c6767a3b658963ff5433ed35d7f7618f02c135ebb6df519fc962f71b929944e2610a14e7a9e1e09e82786d903045d47a8395cb0573f2124c3306bb1660a46e3f4088cb1f9fc1df29a4887f35e214d14241478751f986b1792d0ba768f30aa55b604957bd4d43dde2382cdf4a2062f610df36989dad503eea3e9e09bb98a6e90598a9ada4dad1b76eed439aa684a81e88c15fc6e7368c8372afd979b5b0ea444746c8b5d89572324ec408051ccbc3d3bf768f5445a0332d1395e6cdf7c37f01f68cba7bfaa99ab8a43025acd96eaced72a860d991f6a1dc3507dfbc6dc301158d94bcd5a5c8329de95bac8cc23cdbae105ef2f87e46888e6521728f21c74b5fe22f49326a5294791dc4b2ee35c7d7895b6eb78a000bea0b9831bf882a6a623d5cb7d748a1c0104f1f2982ae60ae20770e1372708b7242c38825832c9d95482103bafd6dd4ef46854b1d3dee1a214bfbda6c97f0831d25a0284b395c653465f1a284cfb0a5bb8f527ece0a1b297adafc1b2aa2774804c8c28b32e4c64ce8d10a5c4d6be79dc794b38651db6f696497d0bee3c24756ee8b93bbb46ac87ce653ca8469e599be78c3cd3e0816e39446f394c45fdb93a75d53c57f850239b6c78120725c2105ed1fc71058a6e37726bc348d4462929c78f9652d944aec94c47dbf814e8a75bb94fea0b2c74e3814472f6a51e70ccde545ac13c4b9e8f3a5b23445021a57a85711c88d672448b08c6df974487455101e965d337b1e7fb2be134e872193fe8ec8eeb36b953206f304b2c4f0f4ec7e11b6e2f28aaa2f5f7be93249a0831fe33f9c5ff63a0dea3cad05150d298b1f8a78c4f20db374099c029e5bf79f277b0b76c4747cb33bb204c3cd32f1fcebe960ff6cf5b153f40b05c34df12db6319097c2490a28c39a77dc1cada1611ee8f56054d245d1f2cef12e4cf05a704157681db0391503d1320101a309ef01c56a8a418d7676b0ce0818ef8b056241de3154d7f4c3f07de10bca0799ff5b3cb60ce14ca0208d4c3c4760320389ef0bb001cfb2efe2fabfbaf6529f4773090b1163f17d3e09028cb51d380446bf2a687a1e6b3021591a860a4d3f42e5ac95e6ec7ea65ada02353604bbd1ad631a124b6774a1a17dfe520e8638fb9176192b61d4f1d718ab2d590d634fd0aad3fef746dbb52e26ce3ee7bb2ecd8f40f87619efb78a847c8aedb3893393e72ffb2a7f9a45ee6a9baa3451ba7f62a4d1d6d3df1b7d7763eeb25ed06598182120cf6cad0e7b6eccbdd3f856ffef6122e655800bc865ece903a53ccab05a5372c2b0cf368ee6b357ee42c403a7c83f69264082bb0cddf1901b6d2300c30e7b16febdfa2420ae51bacc49a09e5b8fc68b64effec6b377fd893962af65ff96cdb00cabedfc7ca916581ab4ac04b9b169f655da6f39105e57144b441a2fee7ead6aad0be8273ae8b27b18f23f49e95993580939b835a57e82b470c9f888d71e4b94526605149a7f433f72c1833111241686e0a78163f5bf184478a7955322cb05c998b7d6573683506e9e3d739255feb15699a6216942b2ccba4760844949eeac52b61d1cff9717aa25f1fe593e97dd49e07002f18c9c6bc4fca9370dbc9bcb8aa9c292dbf92171044f1aff02ee2623b94306a495949d78c9add29d980dec93c8a4fab41e0a3db9b6ecbfb5ad131d15436b83bdbfafb896bae9ec34cd96a1d6afb80274c4bf34aa7ccd1a7ff62fd40ac9ffe4222bf43c45048b2b305289cca32af19e4a9d12d5a47cc6e2311dd10a09ca30b96eaac5df96ead1bbc724f09912faf9bbbf81dcafc3c8816dc80c218878536a6fc0589784a749b445791c7e5f31301b55e9d70bd058310f80365f6ee0712351ec90fdc6b3b5f96600abe7d144609f069da0052715cdabbaace7043f36daaa00fdc42b8dc1dd0f589ae2bd98f7688355c49d758c8599271cb6ab75e7a2d60ba8f6bb513e4fcc8bc7e29852d3fdb159199ed463bfd6d7baa92f35cfb36ae7c51fa4dc6f4030a9d3c292f14dd6b24d4e0806e66438ded9fbdb00054bbe38076305d6e237cdccc5c4be57b9deb028ceec602669aa380dec3b5acde67fc8864c7223108311b04dfb512a5b8e1a7885acc84792320295afd2360da621e091f33bbfef3959afcb44280a69c5f4026534b44b407057f0a0da127dfc8448f4f0b9fc955046952571ecf95a8563e9d95e1279e084f2cc70ff236087c2cd0a891e1da4f396526b85a6376a7f568f579d6ed27cbf25e265aa023bdff2169b98cd89efb75c720e97c32ab23e24854f651524d263407f686cc963e965e0f6aea48f14eb66782b5ec90d83fbd10e1621bf45194a3ee6eaed6e98974b8c621175e26597d08f0bc05b412c1f60c959bc172ae6886745b954c77974c84770cfe5231c97d0dd4fb3191acef99a18bef9b88ac5236767981fac2a5889d897b6b2290e45a9ee5ae209ad08692d90113f2bdafd7a0ab58aca5c156980f03670340b82d620eb0fc381f38110d7518fdab990a995f176a09da477409307df3eb35adabb0297ff9faf975bb7584807c6ef5569b7bcf84944642840593a7fc75f16bf3696367d67445970c415b80afc58a497397d7fb88ec13bccb374ce2fe057fda5c4f182b2750fcf780a76f3f632ab59825a63c9477ea902411245b1a3058749690548510da2321951081e4436e417175e57d5c375729db22293508c7480ffacd4f77fb6d1fe1b9c41d4348b031434a78d8d6c8f5538baded954e0f37a75f25e63d15beabfc924970222f443a3f81ac3ef57b162449bc8de7061d6f17cba49bd4f19899e9d2c36290ebfcc7c8047171e2b5fd9ae0ac6e47deda909ab16102ee303d7ef86d9d64d59880c91d9b3fa473f76c5f53f73e1295352f5a65b2149e520df7ec1b17ae82185d1fd7e67270de14f4a46f57e8377ebb5a1db56f181a02dd6562b80745f34339c667cd9004df7c13ba974dbc6eb00c3d1f2e4aba73ae829e991d0088bfe9d2522d05a332e053870309bcb00fb9203997737c41bafd3cb96a176ba09b1cfe499923a903a1316890371e85d95256d8eee8c1e2232d96ac9bc6bd90603660a76e80bfae53b81825b4ccf816fe5c6f2187febfe79f3509ccb7afef4ab0bab49a19c408e58c17abeb602dc66c1b8737ae661a0ddd164536505be258976713aab4265f33373b92dfc1dbf410f1db4d63fc2d8fada12dd0c5aba730512b8d6fcdaaacec63e875fcff3772cc71d324b1895709088736040a8219bff3230169bb6103cab2c51e997b808bd1ea814ea9144e130e9d9c1b3ab9ca2be7e48cf73a9c5a1e966a24d60b4bf73909bc470f9a609d7491b5a6863dda3cbe36c3f1bab1ff391500eb79cd36aab0f8ddcee684742e10a3aae5dca8859614e4052e58e33caa8a493f6be1d0474d6ba1104c65a1008151de43301bbb9bd30c211a682c510b8fb162398658a81e96932b968a6556a5c0661925545023e1b09eef8f33224f64d4ed9d968c991d5a2e69cbb0aa7b498316e040405c731cd3768d5a191daeb5c29e5829a120af14dcc70b6b8a51121088be63b2892a339be8c1449d57e03e3afc3539ef2f57ef75ab4bf2061ced382c7baf2ce1710babb95eb7cb056602e3d22209c913cab88c9f959270f287696f956116b23561b1514b3320214fe7125959b881a9f93dce52809583b854d8728e355baebf30552b69019b41561604003cef0f9100921a064663cd5126fcc72ef696b369506ec75601adefea6fca5b44a44d0bf80831f894ad75a8bd5ccc324119757a9ad21bcd6fc542f2450a3ff3b7dc491e61941a0f9acc74029771679b5f8b2c367de8ef8396f816031a762ff18c32629c78493c8fc02281e4aca7f3932cd4cd9490381847c37fefb324b100a4f7d34428e718111ac91578dbb5df9003510d34dc14eda41368a9b6241ab1e5abb5bdc7aac8dac51f0c636ada4dc52670462475ffb17dd2b4c6c32856b5466b8068080627246275e0267aca2b7d66d1630d0b96c156169f052bbd8a707148bb0aa0ae4464fc14191f6c5a2641dbe229d97fb3e1a4bab0fc93398a5bec1ececb167b039082a6f8ee020a55e336c16c742e723c42bff119785407240079b3c00f9d8f1ee577111699b3994db0567d1747dbbe454a29407dc989d3af5e6049d0ba9a71a408988c7b86922c3a5359fe1b06504ed8b3aac4feecae077ec94b392d67ba6a74add789645fcd19dda9ce244dca847537333bd8769fcfe01123cbd719cb163fc8551434c9c48c60de79d5595cfbd777a4078af9ce63fd256679b1903c8b078e57b8cfc40c49e76118ce2ad3d264462d895c9f0a16eb9485382ab92c1d52b4c7c5c7dd8147845c453cdb8bfb6d88099735478021fd0a902da6321a417bfe63084ce03692e0d68543635f6a387cf72b1c64b7d7391c37d0342573e30fe7d494e9a3595837776c6ac2586dcfec716b0b3d0353b2bd27fb9e163eb7cc42d5c3e7904107a01c198389f07ea1ed1b8844adc86a017c0937be6201d06c4d75084b49a31eec52304a359c87a5f091618937b1a17053a4377542e4be9bd828f667bb3e8c72e621c3de2fdec491729b28cf2a0ad0284f9fb94bda8b19772f658e47792a029ce487e9ce332dfb8732d61c19d3626518a45a7c43834fa23e01b9794f658753924d1d9520facf9055a8ddf583fccfc6bc3e0693292ab5c95fb2087c3dfe2cc1f4360be5a85f600c4001666c892e6e6ff07ea3817a91aeb309325b58ffffafe1374c5700859976177e39fc988b50be476cdd2fcf1d273484fe7d400d95cceb4d0c6478c55749fce6006aebf45d31921cea529388d6204e0eb788e555e468f377261ab9029184e66bfeb67e48f15dbd11c5d7e9ea96328c61bdaf23bd1b0b92f6ef8806a48af6bd5ee36596e459fbaa1ef8308bfd7fcb56eb52ee4dcd9f3ec3fedb0bf7d7331b12abf59e0df5d8deea1948d0e2e8686c51f5e9d24ff6cdf7caf27e7a716c0894a1bbc54440fefa5e6063807d1cddff70dda00ddac11ac5ef612344f0b39e046ae07455b1802b791a6bfa81f1fe375c049230f9b1e445cb4f3ccac5cf174bef9136b95d995c25628491ef87f51f2f4c2113548fe4235080879f530d6eb20ca2465c4fc801cd38b539e49d4cfe20454414c5c72214e0f60ed9111ba498fd609ac5981689d64cb9baea477c90623b7ff006c7e9faa20b570bcd8b5fdc3f7d0cb378aa74799def56aaf5415ec377aed07c1456ca3b64bbf93a2fc525a05eebff9ad08a14980e320aca6fb934336bef531d78d5a39f6f5d28d842dd2d41e0b23a6f2e8ede56a2f49812323e2423fe9537f27aa4c3caf1ffdb7ec232f1295e7de7296791dce9f3c495b606a3ff05512432423ae746416183982f60aa99a170d798c526a506d6ba355e703199fee4049d99346d9000bec89fb08e44b3c9eb9e0ad57b17bb4d8e7a039c531bbbb3b0cbad8bc0a6e3c3ba397c046b3bd9faf6379f52b9c77fa483e5b97bbe10cf7ba4dc7e21f6524db0c6dd609c13d033a562ebba06e61f7468f4df6378d874fa40ea430d5860acdd1fb2cdd899761cd81504800298741f9f7d34ea1c57f516a749cd6105e920e51991c0b8bf620a4a25cb5cab507e6abab9548c632575b40165490981ffa2694bbe82a3b1df8f60cfdae8adc32e9ab388c2f6b849b6b8c6f87316af360ecb712adeddb1b25c06218b08eaf17515ab9fc59aba26a8a64d5d1d87958278ba10e9b07068f978c634470b8d88b986f54c22e7eb24306e00c8850d3ca4594dcb65767169d482433c31ee2fb50668d33179a2f24db802f59a01647cebdc81c7d68a0cf52e1f08cf4faf25150ecfaa710a51a9114a8d319070e02461bb5b62ec00c3ddaf31202d68353220dc80e2f24892408dda2c8e6c24cd44c1972d45a4bd7308e32c423228ebc1c9b84e64adaed3cd2261d573f7e0f6b970af1aca7e88c23b89e8acb53a9464f7fdc4df5d3429dd0cc3138de81d6ed7fa05c76b32de9a5f01138aed9b8267754866c76bf0b464d49501384006710fcbcb8ccf087e6f4ae07889622e19e8d9ec583b5ea61192109943e013d67acdec6a94b581ad837686c7abe9156a47b8111c4afa6be3d97dbc5aab32b778f5e07908870357462290791f9ecf1ba09be7d71bc4a82543d8f64b1b009f79b7daea47685374b837040f65feffb96b2e075eba226f2d0f59d0c4c04252b37b872acc9229caa3438a63fa63504db6761d0ae051c36163c03f73b1a27ce00075b331422ed26783dfb463a9e8a0a9614f4b6ff01d2ac6a8e390f0ac07fde3e6d432de2af26cd3163edab4af96feda274c6d57e4c843c259d03207786c1d4089459ab8e932a939222f1a4e6b653b1a3f0609e0b89c3ab6d38a7a141d9d6a68ffe8d4b1456d27b809ee40e03ad44b855c022ebc12b496f5e4424a259d7419880fd532a3ebdb8ca1d6acd1b415d77f305bd8785478eb02cf92ade158b94844d44ad7293648411d7b7d2588836d7e27ca54b5d2226a756e2a7cd7506d2b7681a7cdf30053206237ba1377124c53c9a5f7f57c1d0b508b8b8d73ef75a3b86dc54b38d81c9e55f17c6b0d386021ff9d3b39f45310e72890f73050b31f2396b9ac9cdd14fb7b6bac9992134ac00584bd352a1d18e84ca79a330fc92e8f9c2ca3b42bb21064e54bee9c5eb5e171c388d405add8389de1d842b66d7a839c152b6a2c90bb0a198baaca6b38ea4082f65c7b16d0aada72985b925b76fe22aac40cb10a7cb2f0e118df2c1f3d338728100004b8d3871b8e20d1ac7fc1e0138f56e0b3bd7d639022eb25e07d0df2e9a3dabbf217c40906c7afe8929d1a59f717bfe6514c636351bcd790bf8fc09e1f7ff63939f97b23fd7473b0255cf9a77e5c658392c774127e70115163a944c782d96a74968968bb6b8ab808267fcecfa65836c1400702dd67eca496f933309a0e02188b2032d88be4438e99f7446c62f84ce7b11a8248f10306a0f3a9126cff7617b70a6951d38dc74f2aac360e9b85f11e7507b5b06cf4664b465a783d44ae0f4a46ad89ac4fcb2382252f2ad746959395ac8d5ae014c7087e2e5fcc5785c330db98c63b9e7ec4024508fc9c47e0e4b9916b4b818198475544b6f1219ff526139b644a0ea0d0e4088e5bcd3059c4dda9077e5311b23d4b09e7f5ec77d020b0d0837d8330633c0e22836669d7ce24439ce31778a51830e227265624aa53c744a4f95996ae73caac0ca26293a0daf305df3a07d69dc1e309ec31b6819bbeaa495bdaf7e7f93a45acc68ce90e92bc0f604579f613fbd55cd036205a84109198361ed0693fbed47920e6e887dd097b95ac05187a1449738d5219926a07b96f9239fc4f6cc114da2b49e61c63a00c6231d12d3c2a178cb90a8aa18bb4e8b4d657fb7d587a6404f8e30b9fd8f35c189b5099b7458169f8b0b5b76dc61ba1fb94387b954f2639867106be9acda7da3ad378585f32d764209867dd4d53a02ba81957ef60d880fb008f590c61ac7ad51c6e2d887d9254f7e321afcb71c86effe0ae785554faacbca68deca289af0bda7747f4ca8c3e574697bc3aa074f2a42ab439541337aa7b40323978307ec34099258c0b17860c64926e355fb62a1d622f9c769d4063c336ea321494e2233d89e911e1e0c9519fc8bc8640c2f4ba8500328393a37b36f3de24bd35bf477a4eb78e7867244832341de7d9651796c50c0cae4b2cc33c7b69867be26fd2ef177c19dc2a0f7c836b3a7fcc889eea261118e625498a2834daa072504e5c4df02d227ba1c679c2daa6ed3e663647dc6fb8d977f0f011bf9b8391ddca6fe56b9fbebf4a3b4e6c5e214015fecfc8d9c378d0362ce2b9c2ca003c215575fc25e118e6a54b51f2d0c45bf8cfef736515e55cfbf1a282ba6f9d7df31879b5cb8a515fd7c63d1ba0abb8de6cdd36a3197ddb7226716038551ba1ce0ded0eb4968ed2284b8931fb05741474134a2b97861b335066b11e08a22403c09f6a1790c8a0e1840a9b4fe46230e95c4c03258ad967d53403a09fa34e0daa5fb33bba060eb8093140ac0402b8195144acc79b2812110b7a416e95f4ab52982097baeba64599747c8a0e3843b1148d810808a10a1d7b99db243da0d886ee033dc54afc3bace84208c14414a0b1bfe53ea47fa0378103dc86388356feb0b28107ea7d5833ea1e1d2b2770607a8fd575932d1e6d090fb09c314e781dbf21e8a65b4d5209057893c3b9509e030ef7653c2c67accb1f5626f040bd2fabd41614ed37117bd0dec71a401f103bff93d983d21d056651ac2104aa5747a759309a59a5318929492da0b51525b5709581b3828ee9e66e54f4c49cbdb35998670821acdb2a6041441dafed221c38bedf9cd72f6ed8e402e7345c8a6d76e55d47bc7da6dc42a9780c6be7d1f911919bec2df7967b6f29a59401ea0a530a2b0abf3948fb3d97838e4ccda3fdea6f06d96ffa9bda06376fde2e2657081675fa2aaa4bae22ba024130b5e731dd33a7fe762e757d9203278cf00089a92f26fa52aaf5d792fa4b69ce3999b4eaac36383928305727280458b2c39844ad4533c7e84252b1b0c32b49ac4b755a2772f015b358a91158c62bc618638c71863f93c6abd6498bb89452da3981e943188f764bc0945ed775fd5c9308b7524a297d965d18a6318a514a298d788292a5c4ab3bda18f1690853ca512be02d4fa3e01e59eb85bd4aaed6fa53b7fc74e22981e50f006e26c0f27182744e4929a574562a84498a825bbbef860c77f11c329fb9da45fee25d1cfc4cfe6eb838f82f6a1c2e0e7e3866fee2337ff19426b0f699bace74f203eec0922924318529b6ec6147a4278c9e683d116447a42a7ed8557460afe85068afdccb61dd1e3e5d87ae3eacc29a4603d1bc46ebd0e86f53e96f53e96f0b8a49dbe9847395b602388d25c08f9b07e0c2cfba1958671d0d2f9525f0c5db3cb26e32cd6b8e43751b1d64731518741b0d5423c4a2b9b939cd63d43c30aed24034877120d56fc095c81240fc99b3ab717391ef8b9f118f0300af798d0612ba7772b2a301ebb06e7c134dfe3c55febc7ba7a1798d060ac0690e8473d58558b1fb6edce080f1cfa379cd8354361762e1a8b9002e001d44a379f0d4dc4603c5a0aae980c8d2a921b274e6232b001a00fa487c64e168eae15fd7a1aa1c5938c74d93238b850ff8d7315e39e9ef864a55739a075da571d004d5e853153e8dd08e11ebd07bdc17cc2f320c1d55b2dd2c39eef81f471b1f9543b9515fc9a1dc2b31eaab71df0d190efe06190eeaef0699bf509de63caad368a023f8409f779a47964a7ff1358f2cac796caeba4a037d9efe6edc9ce6386e4ea3838ef0a80ee341343860fce6373a4875189a65a3bfa8bf1b36afd14147786e5ef320ef363a52158e9adbdc4607dde81a1da90a3fb2845837ded97293bfd3bf9595538c95d30a985af1fea53c1bfda1fe793c36ff3e94cd4d6a459fb40e6de99e7289b2c937fa5bf997e2b9b149691e00bcc6cbdfb782c3f372ca537e936d1ebb93de41f74d49396a4bc92abf7103382239f96147a42a92ec30467149e9a7be2fe62b6f7116ff3e989ffefde5dfd772ef289d8ab192af439c9815f0d482850e0f73aad19f77007c2fda467f2d28971cfed48dba4acb498742fbf49843fc7907c06b8ef3f7a5ee7de5f1f836f94be91b0078cd3f4fe30080aef9cd6dfead681c37b7f98db6b90ec559e5a7bc83ee1595c76e07ca26d7e448552df18a2bae18c346a96cd4b76e06ea2cd967822a63c072a31ec62734f84c701e759b1a1963c63ad2383de63073502b72e33073543eef3373eaaeb9cd551e73d8cd50b1f15ee33d7a1a6782de6dfcf8a9ca0be3af4883a7c3babd9b6af0e36bf0a59d20d63813fcf59c722fc77dcaa129e52939259b2ebb7853fea17b676f51ff6c42db543dcff33ccfd321d0f61eb32ad364ce9eaed21f7ecd855834fac3fabb4173d57968ae3abe4a031dc19a47f51a0d74aac2571d08d35c88a54363be7664ddb94be7c891a5dac1e91d77d33ac01c592f7264c57c01c7eb502d637791236b2647968c0c5987d6d0fac48b4a2c94670b22ac14531c31648492e719c111290a485170b2b1479af2e900279d30cb13d8886762028e0251c7c10481a7b89b5dc2d92312149868b69b816198866d5cb6d372324061f87279a509f84bb16ea381208dab88b88bc0d8e5b6c7e149ee31c1eb87281810629ce088048524fb877fdba3bd59064102fe8a748f44310ed0448c14c8605b0510695a0706b8cb35641b51c0564be0cac1240537a0c0434964b58eb8f4cc67f2801d339d00ca9eac6b490755d14d891d919670b4e9ef8c749a8ad82bd5f35ca520eedbabbe617fcf637f4fb7730fb2bf9cde1e74652beeb96d0faa029a45a0820956b0b6c955f9841e74f551eddc29d5dd39dd83aae681b86b5a889523cbeb3c535e81814c924a44acbd0fb2d73e8ff058fdddb0effe5d1f0f77ed413cf6dded3b0d7484e79ed34047421b5a0461c8ce01013f8eb68fa7b4af63804eb12f5d2428f5abada7c4e27e3f802a380d52d544c08f2396d59ad641555d06e2cdfccb4a920f69c414ac0004ebc8ca0da412a52fc8a10c4419514ab964f547e771a0abedf638b4dfdbcd6a52cac78d6132874b88a12d9128a25c4b11a20c992883897c72801963a507da57708095e86afbfd3cfdc0c6da1e591fb8fabbe63f1c1e178e96b0b4e3b0df74d0111e8f0b474bb0b45bfdd1db47168e1c4a70c4102c4d7f54dbd8ae694124492007110e23132332294b25ac48b6a40432a74c8aaad9a2524a39d403a807146cb284004f4edac90999328746e1c8ecd3882329a9a41ce5516d3c20ae706ec80f20ae6ccc503b1ae2335de47efe5ef192d4140a6d1b49a16cc920392a275b14089245dc92886ccd1cec756271a9051418b523521258d8a10c125abb6590dad1101fda98a03ccf0425d215461b3b766551f2a8966235cb78b020324e930c324169512cc0f20371b523aa6494c143cca94ee80191216cc9fdc4951c9267c981945b72609765dad4e57376c676ec966699cd91599e09c62714986047437c917b1b7475b595f27634e656801236e0d1ca0a74d4b9df4eb6e3b31db31d3b2924e50c4f28baae1e98a09884a8263ca8c74d52d745012031584214540c11418414006104de9e882c8bd3e4046068e3d215c5d251a4f3396c24c04018b1a37e2887a2b641700e3a35c8a11cae5f55e6f023759559ea1301c65b0e692bf8e41daf8099835d0ecdab6e9ab31020b114b3b023a5c28ef4093c318238542541300afede71083d30d94b330896bf7c80591831f4220a4d8664e001775dd049c05914ba8913175bc057145e0081892638a16445d2124e1ce118716f8cababa66c865d95ca3fe6aa3832f3c2734639678c736a261f628cd7cce88565d955338b516dab5b9d71b92b9eebb83859b6d34c756a45544963a4f88a2debe903916a414e5aa55dd9588e733bfd08412e4849c5555570552ba4a4424a2aaeaa82ab5a41651862a497027468bd2a4e1110bcb00833411007bbae6b63bd22556d3d6d3c95f6f52294f858899ad004c7040f5406508530309102900e4ce108150542548886868650c04409378a21a965041549b410040a2ad1904a9568e20ad6891eb899e4a1b6f726b8b03dcf73020f3c2743406a8208576f134f696b242638b097104b6042899d691bdb981478500210551852674e5c4213a820a31c494111116e820a9638a2205052da9ebc2ab04b14619f294e800524f410042821a8272022a269014ba58070c2c5298c4a5df8004b88d8f5b50a1ce22ff961633d84a0c3298c4a551513b0409405812dcec4e9c187ca0463820b80a00da8a28a1f9808a2d9002b8a2a120964b5492c5155b44c48821024a2941346384c4c9c6c6217865d333d38a20411f86a22c911281c916246892356203901040e920e7e48813a7dcc6e2bbdb04ca3503bdb861201ca673e81830b900c51e18925434e4c8084218e3423f0408907b0105cd7755d54703ac89a58caa008418684232932278e30021eb22986250c211484921814e14715424ec0030b6909285882077a9044032455f861a44994a112f4a00221062110e2c108414029c2083e3c81082450020a4a3c39e22ea04ab00155020a82b8e19ca773eaf03a56694ca5309ed8a51f336710e3c35ae3f55a8f69997ad51905c7cf4b28314efc032c631421a3ae494cb298149ccc7f1348bc89977b654b2151e29209e298136099495bf64ad244132c68a289269a68428917b40d263b9dbbd22bcbf5dada966de42278ddd2158e30d8e78561dc962d76ed57b7635f35ad591d0aed6cd27a49ebc294e9f86c08269830c204134c30c1440c39ec91b9589164cb9b7e2bb792ef8abef6869747aacaba979cb56b7fc9b4ab616ffab559ceee86171dbb1af226db99b25007a16dbafcbd3fdd55def343b7ca539e659dec74387777ee3ecbbc977bfa2f5987de1cdf8539ec94471acaddedee3a73467753feb27b3cdfbfec2f99e679e97ebd9c65f7b22987dec394cf4bf9521ebf72eff7a6fc999e729567d9ef4a4675ddcda8afe48b8af7f15d0e4d5d77d353f2d7a53c1ef594e3fc79c7ef7e5554509953d19187dcdc4d393c699eef9ff797bb3cf434cfcb5de24dbf387bffb2cb4d2fd9e559f68e73f62fbf3c763c2f9e0e855cb2dd718f9d0d01d8b2933e74677a87b94d45c0f211332101d31dd9b14bb9b12cf71c42cd4f488532699461617bed77722620b03dfda3448aabebe924cf25236c7a242988b250c5fed25c4aaa4a668efdc9f6f68c6e07674e04b32c83048e5b66bbbd06656703a7b4d2c555685f33cbafe5b4aa1d69290dd394240c7a4dd3cfd9be9aa6a58e94ead1d5b02cc3324cd3329969ba4850fee791ccfe9c331d6ad7ec0c1baa0e3812210a4b5b861d874084265b7635eeeb891085ccf2a4a96482365707cc5fdbb2c3a5254f971c0aeda944053d3b5c1eca9dca92e7cffa325cb2aecdf7207864593cc434a7c5c3ba2d8c8c33cc261206bdb53afcc9e81294d29487314f274a2a4d5067a15187994df6d1ccb17a87cb2f4d1265c0c44897bca5f904cacc6171fab9146568a77f2a35845b29b3b553aa1150432dd4af96e5cef548cb0849f67588ae6ad25cb2a716a7ead0a616e76c61ec6bcb9ea6b0bd3dd9933dd947fb5998cfa528634e1b607491a098e7db3c9d4c309f661da34ae511d4f45c8a37f49c1770be7d38973a1cf940476c4c8c0eb35b1de2b0edf3affca97bc7bdcb5b9e7beeb1bbe89c81f4bf176d43ea3a2460db0309b16478900c3af5c9922cfda0c9d2cf7682df8d5fdbb7e899348f66ced53be8ad9e4733899983e91de14c2214da554f252dd7995687a9bb5c67ea10d3b48ce5d4b33c54c53eed887414c5c69ed97c6b76fb9ae91a26a8656b75147004b6db3e8c474b33c7c9ccb1faa7ee2733c76efbfc43b7cbe791866132ab9775070bb85c685f8cdb5c72b663e7807f2ed1d54f5dae33b7fcb9dcea7de3cc61d1a1dc4f4a82b2eb43a16d6dea2fbf5c728f50d376a03becb1537fc961ea57cb6947436e7b17d9edb4e85068db1b2255fd5a4ee91c6abf6c4bae67c971bbe4506e174d8b1103070704ff542ab503dd2e5ab68f3af4bacdf72e39757f680dae25c7cd62f7964359a7cd7a6c2cc7fd1ca9ca6eab57e25ec9dc51998754c94b212aac499b1ed37b4bdc53280c4200c73cb4f697c6ece7cd37321de61edbfa08b1a6651a7387dc990e85a4e907dc63815a7f595688b1a398809d6f73110e68b9880672cef95617e140d0ef83153b1b590349d675a4aa8c06f6eca2366254c59819150accb46172a34c981dedf926514c4e734454235999d0c2966048604568614a5263acd07277fa10579c9e4344a28bc8115d4d22ecc86b11d9b315e30c678b5e99ee39445c6149cc3b5521767788b5aebc9153caa22b89947185b5a86afeb426488b96c0f246342d9ae04cb2e7b156fd86b5a8c68eaa5126a9a4f29abcc228caa02176b4e9f027a3ad0952f9498d2a861dc9cf4d5b5353236a34ad9e2da309ce242dbaaa496a127b9e4a5d8d84c0218629cd9c905b32738e92c0923025b41a6149604758d27d881dcd384d45ee2f977d40454e6b392fe0c8a2d845c51057989e57f5c0fea53327911c22c49e9f447445a350d58ca1b789d0287435511055f373be469944f1e60438a445b488891c725d9ad2287425335573c7d00087936808fd21fca1fb8739658600beb21057338a28433e453f80add87352b1272da24ca86ad61f620e15434441cca1513e89a89293264b8a94a49260244c8cd027c429063a7364bc9216d1158d4289e8adc538959a5128a5c2667aca649e56619392c194898c12cc8f3d2f0e9b7e4a5a674e94719a8a5cc7215997ae434c49dc2833445cb5e88a64aae89310b1e9ef955c4b76c12ab4f593d149718e8a0ebdebb3a5a968ed5387de4ed1b56807f83bfda3315324362f6afb0c4251dc639c81129130286da572ae94a64182d02033f5949e3925c34c90522272866a440545896c7aa2170a6b99fbb4f2d34acb5bae335351c64ca1de63f44ca741e88ab6b48a0e82d2f831ce508d4818f4f8f784698bae66ab1a9133cc201206bd0a6d6d5a8dd0a34de765908aa4d59d7e06d1547468a936752d8a37f42c52c02fcf1ed6a2941cfe647bfea48b04a5fef2948e402ef7c1a2d1daa9439f14d804cfdbeb90803d8124ab25f5998ba47ee5221a48a552a94f5d8403412d0f62c5ce464a034d56cb75664b6639ce3ca497436bca21aacb3ce4a5df722d42edb066fa93ed4be32570dc2cb948659aa4d0240b516cba23521698d4b8ea2e86b8ea34fd61aae6a7a61ed8b7d65deb2481b6eb655ccd28af2c96c024d0a1b7354db72d600924caa85ad5ea371ffb0a195a48896eae0e7fb2ad7dd39ab63c7848d4ac44170de4f5a8ff0f81ca244a6736bd54229a40a25021e82a28bb761a74e47a1076fb1ae9e45253c0750a78ee7824a060a16847242c0c59ed8874052b6c9944577288a5d16dd91de120442a282a7abb2284825209077bc6a5a680b11dff490409cb961c32417ad008cf6b4da4284dbaa4d104e9a9001ec10e902ccd052a1bcceebb81dd9e07bbd55fe5c9aee9afea10d3a824954c90e6c83ab420b054924913049792a06c4a5c29e555512a5996653ee60aa4aa4730c4d1c116b5c37874c9cbeb2c598104cb6357d4a81863a47565ab76ac92ce58a3ae61adb5d6ebba2e2c5e55afa45421d64a694e6547ed4a2f5c6b55d93d95d65a6b44a2275a1ba3ce3b5a4a2fae0b3340f9a0503ea8285e6802ddb966eb8505815d3588cd98b65a281f7a6115095db1ab9a90e4a4f5c2e235b35968ad9335408c4b4558e9ccad136f8ae05a2b6a672bbb071589602b963798805cc996a436902b0944ea60cf7814244890b91391d8f5d8bd2b4faa34622130b516637a63b2745ec0dd086cda92ad1e9476dad913fb7a81ceccfbba8e3a26f2c51238db11e90a4feca15f4109ce0f5718ba96b8aca084734d218334801dc23cf1408b273178e2c40a2ed8d7e724522255808222aebaaa2c5913a45a1e542ab08542880f3772b064714004c5112420a2c8080a23dcd04112144e10dd4002040a2c04b941c452ca081b143408e2c50a30b623521142bcf881b91d918aa881865244113235c0d78e48451c81f4832894ae8304e59563d6db98600e31e0f9dad598baa7ea1c3c76e2a08302d8374d8109ca73307bd65a2b0e18a671d0a103872a04dba02bc9d2110a08567a80c3ebc8ae08c1e1759444b363a92be5e4d2d7936b698274e95a92289625144641c1a050e3890ea1de122d2269d32877a0b4e96d90781064531f240e701863dbd3a380c0a1a5e175741dd115f7cbe9ebe8caaa437b8fe82a460c1c037ba99894f1df5187566a9caac16a3357f10894d26694d25a63d01f6025aa285541c9a6d7d1a694d2288f664e521254c9a647f57b5698944c2505b13b9582790d3327ae5686c8508104043852025acca1865c4bbb9edbec238d6e83f1a67edbe07691019edced735c1bda256883aa2a935da5bd066ed97d37ecb7f3d86f9f01d507f7da8a32e4eba9a4464733475e9918ac753f373d9a3977e6ccbc9e2699392e6eac96de4caf63c7a40ec5f20cd5f64cb65d7c7636f438e28a3144d997f6914066b2dd2e40cb8157a7a8c059d89811468d96a45a584880940d96d918cc3442ad681eda2d071b2282f531076b61f7de7b6dd3081be2da578b5a8b314e1919d1daca74c5f48619a9189224148cccc513acdbd45d76334c94c52f15ee2643de747ef1edc88c0b694455f5563699442411ba6d3211898ccce5ef34a2c554221206971fe23f44810f5334dbb94f23336747f6696416b50087b325739da96146b0220c09ddb2cb51731a0da4fa274f73c9723998b1672c67ac45c68c1079f9cb632a11ac55af1de0f06ad516d69a57ebfbbeef585cd9fce6a1dd007888570e807c936d32f623ca008fb5a6aade5a8c5329acc562f496dcd2f2ab88ae6c5e7f1981d4e81a5f3631a9542a959294fb7eb564f6fa225f3f8c6a54a92ad2086534c17a17b9cee45a548d1091334ca308a3bed66b1d0df4db35ae763bf432c7aecc74532a898054340fa2b964f5501a4dbb0e09d852f5a0c952dda8b90ae6b5a56509c448c57db6645eaf43b9bc4d233367d33bc2696482425b464f2431a7423c843ea2eceda1d01026b7a209561de6c7b4b8cea4f7ca4e3bd5320dd86588b84b0984e6dadebe5d669b0eb1c75c87ca2d93e9b7eda1d0758009e2a4a86872c5964d228cfa1655557d26384a008bf08844ca0038002df9a8aa0f5d725c5d2daaaa9f46325cd2cf408d248c7a61077196c0d843d006678255522359a9518e11c4e1023432d4b8696a4ef3ab85e90a0720c4d505626dd1550d54556f2dc6a9d41f821b3fc4d9f8e16a87178db5e2f0a7df2d5fd79902f1465e97216f35d05505a24a5ab1a5ac3098aae4694e691186fcad310e5093819c4583b56a484ad2580bc6ca601a1ae7e974bae8108d3997e3d63aeed855ba19dbb74d63d8d59a60bd8c602dec580bb39b3b779d99b38f04b25bdc7633b8cf969c399cfc95323381901e6cee2a92687357e96cc84c20c4687392d33b58a0c585764c4d8c163adb90e06cab39108c196148664e11d6c28ce0ad86058b63d9b2c8dd61320ff95d2d1e1295ca616db95a2b572b44a9d496cc0ee393568815b1ebbdce9461ba9c026d70e80fdd3b766868a886cc86ec8a2baef8042b04b0eaf85ebdfd6af2f294e6508a01673ea2ec4c87f73e12c8c6ee23ca967b9b44fbda1d4272632138cc5a522525101a1a1a1a1a9a1a9a1a0984e627b37445a3ca8a66a6028ee083e383e383e38343ef83e383c3045a6be853e79c73bee61db1476a1f9c5def83b3a5a4979d0df2b45ec69c831b656e8cf16672fbc9f628c510298a28572ff663af13ec68c03487494c0824733597a8aabeca18c419a6d1136c08917befb32bcbb2abe790d99a5b3ea13582121555d24695b446589e5b3ea12b3964aaea9339a4a5676bb660364b7441cd550f261246f59199606dc91399ad09664964822f4cfefac2527f171d4e39a40b389c4b467369dbb66dfbe5631a4519dac39898c5fb2aa34a6a970e5df4c43e5b3347d6983085eff6971c4a24f443e86a86ae6634016260807948599fd0950d141ad9de7e2ba669daa5762cd372c564aa95f7e65066dfab73eca0bfbfea37ec62d8b71ce26c19d33198501d45f30989e7eaf45eca2509239343e8929c01c6f52d479a2ffac4aebfd7eee5b7addeed4a2cebb099ab1c04a0c1feaa1c68f38da67ee9349a792803b37ff917598687774b2412c6f790db7ff110b52576a9612ea3b8594621a164531038944f7a5a5ceecf2113899c6116b1b80c4876fd8b24d328de5427f3c904e34dfdddb44c9646a6aafecacb0efb96e9ae5d0e179fd13397ac982c5b5f9644e69095d7cfa2d3caf3905d679543e24d2d02cb21b7082c91b290b46b7644ca020bf6b59cb5314958e5f8b1c37a00e9d7cb1f732533835c2261d4a3c2b95129a62038944f66125355aff33cca330913eff572899c41469130ae6622c3106feaa55cb2eb2f6561616139f6b934a39839d7f7984f273327e6f58a51b962ae0fab31af312c78b3d8cd829de52a3046db7843e3e5f737e3b64cf7ec68b037225561402ffec90309b1661e3473c98add8c1d2eef7999c9ff64c96cc3af4302b67cf1a0c97af11b2efee2465106f69887315b4b69f9cf361394d8cb4b8b572daab20e2d0b1de24f87a91d23a3bcc8a10fce7e81b97fd1f2898b4b0e7d705cacbc4bde118f019c1d451413ac777928b45b6839050c0b2c03f55880ac614b8dfde537873ebf2f398c4bf9fe7947bce2cafb1ef9ffe1d521ce0bd58b2ac7a802738caa1719c330ec45c77823b384f2ef398c39ccafcc577634b8e897ecb2b1d3c6b0ffbec5e590968d7ee636e63287f730d7a171df63f7d9e5d343c7947288ce81651d4cc0d8c3c844023a86a04ea813eaf42b8d6097445a598afc3141a01e51c685ba5017ea3aead7c45dd95679ecda6e0686ea1620b4e56f0e39971cb7cc307fc97167ddcbe553ba19d82da6e7138d6b91a59c4bf52c8ec076cbdae255d61706bcfce53a3326fbe0ecefb59bf172f9a4c5142d7e5b602d30faf214ece5292fd9eed8bde81d2cf0b1c83e13ac87c9384cb0febacc3de24d7d8ffa1c9e4ab5d08772880b1c26f8bdbc5e12e991bfd85f7488b3b1bbb8cca18c01030ee510593473421f9ceaf27a5969983a13dc2e722aa78ee5d0c676d13152997b4b0ef19687c4b0641e72afe410a59279d494188587c4438684a86dcae1cfbbbc8009d673b98609d6e790808e9913b72cdbe4b3ba2180657466cef67aa01bf6d877e6a175f1027cf88d3d0437865d05e6172ef24c8ed4c6c674a8dd07676f5a87c50870d6d98854a56532dff2d7c6cc652ec2012c17d1c0cccccccca58b190d24592e74a4aa4b630b7d7076764d1799b9c57e3d065dcd68991cafcfdd05b984b63392188a62d7ec98c4d01131fca9e14fdd54f760a79f1ad33d7406fc4b563d633d02ff543c73ec4f9d532e19dad7efbd97bbccfdc6ce145a1e17fd9275e77254b94187415c369dcbf19c8afea1dba4431f2e37703ae5455fb9bd1ce2b0e7dc374a16b07ce5486310b2ef598c6c5b9f6506ac9ce558aee1bdfb95f99ee6eca61fb49b7ec0f55ee9e51de8b723af5d0b57be03dd3d2dcfb45fd33d2f765d8ff72cbbe8d0e950687b2ed2744f3e763bde4d21ee3a1f3bf79c7cd7f9d85e4ff7b8af4bbcc9e4c57bb97bec76c8ddc3bdcb3a08d5e8cec9eedce33e7d71f7e0c71d7f3929e3cde572983dbbe97367dfae3231151d668f74c52387a1fd43b70e716f79878f9db243ee944c07a17d758c37a6c7a7dc45ea6fe73efbd53da67bcf740ff7ae87d763dfdf7b99dae9f1789e1cdaf837873a76c4261dca21ec61efa6141d0aed149bd59d5de537874f513c79c81b5ede75d7a12aa7d3bbcce9ebd90eba4feff4f5d89dae33b9f79cf40e7267cfbe9453fe529ecdb8dfd53c76bc9b9ea277ba73433bd33b5094dec14076a67be463cb4f590e6d2ec7dd6d4f0eedd8b37296b7acbcbbec6cb867f9ec7656ce72834bbe9363c9de6367c3ca597428b45958728f1dfe502f7f3bf72bbf486320c1b6372159a1e4de8c935d8d952d754f96e950ee1b1fca7dbffcf2971a5df6aef664c7e352a3bb3405e1cfdc31de98b8eea6cc711cf7d130dd4b793767f7e279737aef668fa1fd33bb97ebbdfbf46ee24c2613103edd444d261dee984ca79b4c39ecceeb4c1ec77199e3388ee3388ee338d33d6eda1f9d8ba9eb6179ea2efa26eea914502a77a9540ac87e3bdc59ce9d659aeaee9e3d25c7094ed3b3dc711ec755d3e470f668e2b86ad261e5722894e5984c579b949c4e3dd9ef4973dfb32fc7a93a75dec99482674ace8e4da6e3895bfee10fa7cc94290595ca2c6fc92b2bbf99e5a97cdfc2b232bb87a67ba66e7657b9e93725e52c79e59eb782f54ecabf2eeca6d7ddeb66a74d494b6099df10ad9466b31eab71edc409d6109cce659cef91141cb38cfbcd7887dca61a6fba4793f6f47d0ce5c6610e2e67e9eec27297eea72424a13bb1bcfcdeb2d03f8e64a96bbf26dbddd3cda69ba317b97b7dec9c2ea3d7e9d0d3bda7df1edb748e33c993942b8fa8c79bbc1e95c77d5fa38cef579b7e6596377633b81cde73df524e8f4fd1e13d3ec5d3c5307987dcf8d341689fb4e9f858aef106bf25c709e26fe7f4fb93eee1ee753dbc530e7becd34ff732b5d3f374b8e3a9fc6452e14ed9a4c2a95c67725887421bdb2ea7289e3aac91bdbbd72fd0ce49ea0ba3244af6a0f40efff0557e8fca1ffe3d2a7f27ee58fedebb72754fbce9e5a82c87b68c9e1cdaa61e96bbfc85e5de656743b7c372971ad94fbff9e4924d2c777171c9f6d794bf9dee2cefcec27907c1591e90ac23299de919dee9ee3dcba6d3e9d475f8d2cb113fc6249563c91dcbbbabab91ddd32c35deb078c6b1c8717235e20433cd1d21d441e86651c60eb963bc3175f772dd373be51de4961cde319deeed9c70ce6eca1e97b3e3ccddc49d1e9a4e7a87e59fe933b570f9331d9f7b96bf7b77584ef770fe3abd736a39be4afebcabbcfb6dc92b67c928d4b9bcf296cc9d6505a5e304718ade49391def9c8e759ca04ac64fc9de095f25674fc9a7c76e073320005b5e09a5d47c718261af4d36b683d11a690decd76b57037ba5143bbde6c6ae57b1e5af28b63c3683eedc6075a63159437e3c17e52177d53f72d31da4182e0d99ed6473db1ce2abed0433ee371ed13aab3d4ed094edb71c0af5649fc713bc5dde21b79d5baef1e6de946b68da4ef05add937920a6cb6ec70053a7c31e9bd51860c2616f8fd3be760c30e922f87182dda6431f3bdb597958c7a9ba2a7bedcd384d23cb3bf2da6fde6acc8e46667beced57d3d666c772dc57d5e1a39bd7133bdda3ae1334d5e8bee5abc3bab777dee94fdb3bcd4db0fbcdd9efd6fdf4ed378775d70976ddf12fcea1ddb8c3ddb98c7508b4ad57e3e6b0b78b335783bba7aec6e976df74e8e99f79b9ae33dd7799cb3526b8c3bdd371821368561f8b2516834b433ef468c84b1e1adadc515baa8af73776345cdb66b3ebbe6593ee7288b9b03b3d977bb4cf10f3e09f748aaab6eb4ccef4cd94437b03d6276da96aebd12eeffd7a39c4dbd38c5cca7939de703a3e77d9cdd0a1dd0d271d7b3bbe97392f47ef940be25ebb1b4e1a6b5877fa87ee9f32a7afa6a1edc873c7f9742edf807fd291aa240ded5778b9e3ab7fe8d61eb530fe875aa19d23c461d016c0364d4c8839e79c31524a6916aa90ebc55865953ce4a6f4d87fba8dfd3fbf74cfb7237fe91d99dec102421bd33a5cd7e1fa0ea77d691de47fba2d2f5ff58ea977905b4e2c4cc15a0e85abb877bbdc2377b59abde6b8afcbfecaf69a3c60bf309c29fcd66c7f1dcb18c5a8865d86f2d8af5aab04c2bd7b465d2748c3f482291f65e21230185a51d6e4e6310e240f31004ca0344bcb0866019a508786b6cd260fd5882b7bc07347a42a4c4bc08008d903ae3b1ef92064cb5f4ff680af1d8f7c1802ca492b96516a638ca1c65de1757a7197bd5058f370514a290ca57882faf27a48af2b5353bdb4bd4ee755759499560451b03c7d4d176c1623c528fdc015e35f2ba5284a2b45515a4f4375dac78001cb47596b04b250c839337a51715dd7755dd775a9e03a49eb8549991ac2322b32cebe66df28a596c3281f14cad3b46cbb3030d06bcabb711ca5f4d266f7840d493a63ada64bcb78734d1f97a3820bb254afac4e91655996655996e7ae5ec8329d51aa69b4650cdab66963a85106dd36996a398cf241ddaba152305a4ee17357c454c7b61896d59631603a5a4abda02d714a72521e33e8b38ba32b1b355ec0f2b7666ddb0cbbd8dc57eeba1831326af2ee466dcc9c9b75abab6d70df55dccad836ec3028d4d2bd76d72ba730e63a1e33b2d367c7df741899683a8c4b56d74c37ad3c39c704e7b99407b07c1895a68cb59aaab61165c4ce34733a1bd20694bb851b8f888eb61cda934eba547f2f2761f2646535e97a5d1198cffccdee18ccff9a6515ebcc1e8ca41ce8039225936200ea539f798aa128130a90a1484fd943ca429320ca58348db959ead1ae2c4954893299394deaa993b96a59a245ad5d29ab9e259b4f9286cc9c900ee160d7532195dee00b0217556a671255c11481575e4f5b3327fe80e30e27945daf329fd0d5a42b90d216fd9227ebcab2b3fc6a59db4ab59258f254da019e0f67528bae6a88aafa68694be5216d652e99c5637783c5e74b962c167772455ece22bbb0b697958cba4ca259868f924929d9f1673723fb29d708d2952c42a4b2895d2f855a8f92e24dbd149b3b8c1255d57b5932c9b2895c922fd92543891227f863d7532130d0fc912cc901f3411c481d049295d25fad9209b68009d624a94469e670bb5e46f186c825519c3cd9b5ca2a6c86b56ccc9c501a993915885d7f873656b18a556c2849b327cc052cb74cca76783fd9bebe801a2e0a0535512ab0194ed51aeda71447da37f82bcbcf535215c86801a7ec8844c5139090f450a312540821b52f85d90820408c49e01d97442701a882c650feb0a914228948a1b4e92bbdd5020d363d4e6921079bfe507e6c7a100a129b1e670b3f6cfa183a5b70b2e96bd8421736bd0d0f6cfa1c3a68b0e971f8c1a6485cb862d3f72802d20524444036459a220a9b2251c1834da90c0396e2e8c80820f0e1075030a1e8c713d6a5827d993046d5e3e0c8aaa5bea1045066c0032a58819482fac3099a9c348ebb6221aa10d30e724e998cf04d464a46570cba8a1d972335daf6f6e3996742551f4fa4aa39698e980d27906d2735ed9057ec0c5395bd7ec0e50fbb108b32c91fa66dfca04954658fa18ca480155947a48d128eacee36a8cafe404778e6b9031de1a19fa7df74a781b6731ae8080ff74d03e9e8a981a8063a4dfa236be9883eb2b6a9691d13b4c781aaeced099aec106f7b4dd33d30217018a36cfb9925cd2c63b0f6e3d194c9edc7b39d7ed374c9d2a46daf39b122d30b70fd8df19bcf2ec4ca34d03d76a0edda85ae47aaca5afee6b70bb180be899d47c3be611a08d4522617e053bca1565b8ac56359f5129d14e93a95441b9344f43e92481239a128ce3cba7894f2094f70802d0a0ff0c57823934419dfebb121e40c6684d520ce505b5f922fcffde50b05627791b908629fc93682d8656d61d8c36a034cd3fba32d6da63da4bb89845131237ab40435a249e8d1046bccc36984196148b022cc4893db640b32bf02a416a8448d7585492d99a21911000002004314002028140e080583c150301eca92a43b14000c90a84a705418099320c861ca20438001801020000002000033b30d08103a4ede1a89b22ff90654ec0e745fb82121745cf4ffbdcb1ac44453eceffa0bc01323038975dec5479fd896195872bb31ae85ba7c5c7ff0eff4596906a7da582284f7f4775d6be5e97df2c7e7317cfe47b9eba8de033a21d392d99fdbd56fbccba9ad2a08208d00ea70774e7eabe57655262c0c31df7d2ea876aa7fa5eb68c4f7fac4419d856cbc892f3a1063a32b288966e0119d392898df6a168ba2abdf6a08727cfd6e85285565e98c7c98c6d37c1ea4ef35bbc11b80c48a5ba6c6c700b8209c8774c17935efd6ff3aaf25a598c771400665bcacd92cbaf3dbbca7efba7d46879a0e0e2f6ecc2479fa3b0f7e3bfae050dc1b52d0051968782fc3bb227e1cdcef62665849ad9c3efe47b85832d605f1c901010f2a54c47ea93289015a74a56efdfcbe19ad24471868ab99c61dd9352e19ef55627eebb76051f0f419d7c17623b9a41406f1f2ccf19dc3346e43de920cb068243a0db7402acec59cc050ee6fef9dfe07f00b10444e94e2bd5babb98cff8c8c7b8b6f1256ad1a0dc160c44a561a8d77f497633463eff087da4e4adcddd0bd47375a01766f55ab84c021dcb4dfbbc2db3fc0d70c52e09748fe01f3bb7700ea738dbcbdae4e98f673c0f848d315e82b77b96a7bbef9bb179cda3a05080efecab9823ab49609ec4715a44b6107c3f633003270d410b9d19f2128a75d281a0d20e741e12bfa8434b2d97731a88678d03e3ccbdbca2478c2519cc71aa2884f0bb4875e0b867b55b208abcd86558c0b090c53b1d96c7183d86fdfe02c27ccf65182638f15917c970bfa7fab029edabed6ccc15a99654f66e1dd1715074cb68540e08ea6f4161f1ef75bcf1c831d658e244af80f0262044eef27a8ecdf3fbca6e2efbc77b1a31840f42e7f17e4319a90ee02bb4d8ebf96a4937a874bf40e7d72f42b621c6bdb4cf47e36ef2b13bdbf5ce04fb67f48b730eafde1247a430b0f6c1f423883639bd5ad00763c9f3c76e7ddb593a9e6557d6146255d11bd63d76fcdf2c91240f4d69ec3971b5abdc08fd5260244efad85b14fa91c99f79f87dc3daa8098ebddfda3bca169de322ded2ca1190323edbc2f3d3974d8d1cbf715090a7859dcdcde3f3467d3d6f0ed7876de622460e63b6f45fcb648ddb9b6fbc75eefdc79fff0d64ca53befe77733145ad0cab5c3e637e57367a5598854dd6a8cf4f69a4572ea32e56a933a15d765579044845c9ce84a70249df30c7a64acfc020abd1f14930303eaedcbc879cd0361ed81a945b8023e7030715bde50c4d7d4eb8eafd996f7c44e45d4bc12a3e86aff0ade3454d9fe30cff7681e2de5c570605d5cb1a36401c363b6f561f2e4b6bc3369c1f68dac6b53ad1b2a09bf2bb740213e3355715ff9ca5d14b0ddf659b7bcff410d434ae8cc63b85375e75744a9e0b2d5bc91b5bcbb0f423ef2144d96bce56dd726144f9d2f457a62d0fc5e50ef77c75e4b94c94d4036579497211b5bde5f5eebf713797f9d5d621845cbc530010882eef06c685489d6f1de702a018e54b7456584e58738876b024235ed051180d3be089e8b3203fbdc92410c59bc9598e916bcc78d487556451fd8082219810df1f86f14ab88ddb06380b25253df494945e361bba14a0b7909d10e096f889d78af8af64b2c5c78c3ccc636ae75eba0c1dfb55b2231dd2055d7fc8b896ed095da7d6cce9f7300ed0da8aa1c7626108522bd5ba776e0c4de763337a1d21fb2f53e2a66c15b6f7b18259d83ee2971fd88c4f2ac735b6facf613ceb6de48b7d71d4bf50609e034e73278e29ad3bb4b6cbd39340a890bdc30ff7adfccb03476a7ebc898207f2df9166ebd493b33e56a9559c39413b43d395b6f97958a1f30fc4c73b2372b70d463bf800f202e00a69c19f4c3293c057a715eae02288724c89112b5b2804b723b3a16a40bf215216030e2feff574bb7ef3fca6cdc5394ca3ecdf08a5968ec61127b388422c7b95a3df64c52bc1d22ca0e97d096a0b7780e658634d722884cf65445286777579203c8fc734916c946984f5e528b7ad5bd5a06d70114dd49865549aedf3d0963165dcc4fd7f72e5f3200d48c1c00a1d57bc6ce9b6db823ec5aaa743d7151d365012bfa272b4af19ca74279f16a34c1df667d7653e75ca2150a9ee77940ee6c6bc2095a1422e061e55b828ad5be460cf77f0a56d295f0489c391c5155970630362bfea1da73bd00909525477a10a35a3d45c2026d1b93332cf2be2d8d82207893af30b49a8b2d894bcf32d0bb47935b46acad62fea79aad91ae84d1986a084b15dd4e250db9a5d8de25c4b6eecbff4d9881a742723b584aa241e9bb72093e6b2ae7e579de1b79e5b1cfe2053e1efcf8a18ffbf3ad558da2bf8453d884be7ca4887882088f2d17237ea3d66daff9e1fd7b448a06a01d4b2adc4d7ae8704995bf024dd6aa6e4db2dfce4ecf26596a33041f3e2f6a4d223604412cc49e19a7e62cbd98c42b8a5f16d8f495c0e446ffda209798f0a68d267556eacc2844daf8b9ac2a6539f63f360f3093e16ef599cfb810261d3964c8308e4390d56401b8b256f0d31428f054e01618fff3d30ea2d5e9da7f81b7490ccf8b54a774378933c9b82a75346df64093d240f9fb28dd6c3893df1fef8cc6b0cfac9f4d06cf8526289003c0dcd4d73629d9ec7dddad018d354fe2d17483990e5c966058f60a05e8a2b94de34353509173732d723fedcfb8bcceeae893770eb5ec39be44d02deb82f4de59751dbae088a00d458cc2776ec129f8d0f75fd518369ecd25e413bea6f1e8f3b97a5b460e948bbee2366f7083ceec3a3a4b67b21791dcd77693e7f30758dac2c7aba45dad7f649484304f7509af8e61d34d29658323461cd47d5bc7894f21bb58b5dd8a7db40ac34c1e58adc3c4bff3611f721f0729824e98a8acfba2801d6b126658a0474cc37671203bd5221b4a343cb5666f62cdf64863a3ca2f3e173d08e601ea6cab1e4b6d4dff086064c4c769393c5e67dec751bfbe381aad662b6c659019220ee842ee34fa8671a5584cd693b15170d9628dde09453882b469030b063468bf3c34f3e997cf5fb1d2b85c5d3f3f733a75878332905abb982bceee540a9b913c8c1ca042b2860e1f908b7fe954019faa5c4817302703ef477459fb3c0c734f4c592356401ba961aafda14784fbe5412d2b04c2c4c2fe59ddea2758b6f933da2cc47d531b05d0082a534f3cf111eccae8803efecd05e5af3e8a94c5d10044954a3d93dd4951c22a551579711bbaf66c98d2f5c1e99f0d892e16dd2630e9c1786b03db331302696c6715983c75e6bde38d75ae0dec4b7c169722b4952863330a08117ed286c092dcb153d8d413ecdc438c005985a8c9af19b2dd62c698da0d9564307a674260c64e82c0c9be7e0e3459ac12c68747735c830394fb5e89a1bd5677ac9bac438a5132aa10fef5f522d7e00ea4a306f8b7d49e1ccc0ba4bffda8fa2cae86e7b6676befe30c8d95c2928ac53d6c7a9d80e55d1bc0b00f27b873141d882b92ded66cad747c03ba8cc51063338cf453d1689f3ce953bbe43cb5be6b8523280831d0170679642cf48a411f898d86e5a7a34e0a290f2668c54e5be575dbe71200c23c453256ab9d1886190c249a4a7158f30384c3ad30749e63c247b046e3a11fedfc3b7dc40135f393a1f25759a8806dcbee1a679d6cf3acdc97b151404c739d7fec7f3041419ac0f4ea2eceacec210a6ed337713fa0a33a0ee33eb37893acab192bf0266d1788b80cfee1cfebae95de94a15ae75d546cbbf0949f80de467f2ca92519f17d6e5a13c731492c37316d58348ab960d3550c36ae1fbfefd68e336779cdacba697e7c7d51e8345a0a677840eb0e149843e577ca9cc42c4e76fe39c10281e9355d4ed56f6d8990300ab1ca4984d37febfe41951efd41954b8440612379ca3aa0cd380ae372746a896b8aa2b7ba086245421f20a90aef53f12253ad592c278c5e7fa8b0893dbc222b1c9843d2c82596cde1875c3deec95b796e254db98f66e24cc3978d2ecc7e875ceafbe1dafcc013c1c05282161b3d672823955f04758271b42d2349b85c29bf2aff83eef269ae9529ecdbad7216547406ce64fd3fafcbf3fac962ef276b9775f146c1de865e9e3e99a841adf1ae897cd1f6385a12ed8986e8d9a86c4d65ca155cc90bd9ff9c7cf743f9fce3553720832ec22ae34548e7eba6d73991da71befe181eb385cb4ccf08c8db2156ea637ca61c5aeea9da7023c8d6fc43b8d8d6f74e8388e860f0248f29585632d71ecb1d393a4297018a180b188e1ce8bddbc1d49c1e17590337cfe93bf001c1be1e4a51e4079d28d1a481db60d696c42fd781a3ba516b62188bfaedbefa0ae9cd79ea5a03d453a112f794c7dd495d3001e36bf240105438000e91c9a476fabac803ff6e9b744ac12c5ba46bba0680f3f4a40b7c5c3fc9f42998e6033d0c40883747eab7123f793000037d2d5889f8424f3f5e2a3a19a8b3888599544405c6190ea594f2831e9500c296a7a3f1e5a7fd4c55ef0ec071905ef5f50d5f3409ec8e1311b2a1677e1617c6159fcf2a3f94d8213be39bb5a0b94423162b768dfcc89e89aa08a65fd41cd18ac93436e2e68e6e02cca3023de773745993f356f9d77545d1b5ba28b36f0e57dc42d28fb5c07e85552a8bf1cf090a341df2257b134f23d92730b3d70e58060552eec216306e2626512acecfbec0ae150933301dca0f02276565e94bbc24bda5502487a0664cf8acd01e308acc02b8317d7ac78d6b8447e67b0d5e2dbe80babc6996f27f452066b2e64079ddaf486101973f8b14f36fba346733b8e2992c8694699d1ff5e48b32eecbbfbb18954619c1913fa67d979fa570293d16c608ca105db52181b28009b12c8e47b3eba4bc9342d92203ad3aa27304bd8868e6f6baea011d6f721bed71c555b66b35e5a9abc11431ae13eac1e9eef06b00f0625c343b04f319df612e3f3cd6ef5f8760b9378748025e6519a2611e76d5cbf283176212b7c609f17dfdecd238df7cff86e48af5bcac7c64dceb41b117260b05314f08ef6a676a7c6707e5c528071722f4f74f60734228e6d376fdfd1046f91894d3430734cd4a203ef4ee76a3153ca89f0388d01984904713a7577b43b9d136a37fcf1b64316fd83cd8f02c19479320c6670d276b53d04bf518317e9110c5fd10aede4eb1aa69385de90453d76e4998630735ccb5826bbe2ec63432b62769a8b6ffa8e7301349a99c743de5ac096e9e8a9ff9fb888b20c8bf71269467eb16acc2552dc91c0e42b0d4a138425ddaf78bd8389b12896c7e3e98fc374963359c5a2c86be75f1fb5287013e9edb58a237f35e63429807a7749b9d30ca9f2a6f0e96c13b38ae6ec50ab3d236a3fed685964b8740e87091080a70d6effd16e87fc511f71ed871a6ce48d6348a9f241f023609561d7e82269d1d4f242c908c3b3fb22f4215145b5417eca6c40191c05012489c46dea5fd6b16a3284d0c61dfee5c88a42ccc4ab0bd8bf94c5f03d30809c71e688989d997cb0a2cc4678665c5cb946ee9cfdef7601dcb614be4cca0588e48ac2e8f5b7e4cfe16025e7d72a4e75e65ae18fbb046585e9e7d10815117f98b2915871438f282705021bfd1a431b7fbcf2f36384e63703580ce70f06264f98e192baf29b998dba45a429ac6a0e3529172b94a09bda04ee61ba94561bf06d2e55766b2338f118d30edcd9a844ee6b4c825b6dbbea2c077f8fc9b17d7e1dd67ec0a33e2969e1e78e00c07cdf3073d3806741a8d944abaaaac4e6eee39c6745d161bf8c258661aa20eb028e10ace2110af5e36266ad01bfc33e9da895b51f4405085e4ced5b50f2985ef1b696cb998f5a0e4ed365738376236d11b001267dd9bf978c0c3c2e895a645c4cecb8693d50f39ccd6d76983ffd023eff8b41e4d5fc7f47ce0edb309284939c71797395ba960af626f9a5b0d705cf97f874ee70faf89d66764c1d6248655e3eb138038c687860b1c43231cf9458d259f7795d3ff2d9088182d1ff401fd3765d00560a93e7295304e91fc6600c031f58a85478b6aa97603927c27ff02581f0208522ea12bd966e62c359a4d53ee84a50e9e2949634042116c6bcff0374423b48803c74f2756cdd69f945e6e9d0520fd6029b12817a6fdffff4277e1b83e57fce9291c9f461025ee5285c91487c0c068dc8e66d2997e02baaacd6e65c46d55ac0a3ffbb55e8b571cd07f5f873468deb0818f821181030d8185ea254eab3cd7e19dd4da783d437606a5105820d133f0982a88625a03eb7f601da1ec5620df92d7cac77534b388eacd808b6268131566f9b5adc40da7894a33d1c24dbbf725561d32dabf5936e5a63495ec3b69b6abecfbb844158403984007409a8ca318d25b105f6015a2e91a894c0dd3c757030bee24547a66515cd7124ffc6d03243f15bd69300e4ed92cab54958a97a5749c2e61cb8cce3ec4169e8cf68c54def9930d6c5ce5bbe5599e6723868b098d34f7b2c5933ec8b977fd5dece3d05f11530b50bce089194c592c2b85a0521a655b23588f880ff7bd4016c9d763a00ddb2c3b06613611ced4ae9f8b91ef638de22d5202fe9516b93ab0db0f95cdcbf707b75d9d4769f50f1eef3344eb1acd7c6c22f8701eef4e32f373c32e7b14efae085fc4f7b15653b1010af71c0511c0702df601928d5e2a657c7028ee9cc2428cd14546bd94fcd61db2aebd66a4f6f015b9d9a205d9b9fbf7b4f83000ba85d1e3a8113cd1098e08f7789c56922f3f78b5a1ca14924a9b94e1da2641c9dbe9ce465d95c3924b1264664da04c854747c0cd960ab3f60c3df03c0f422bdcc39276781fdf27005d5c2a7e10dd18dc61d0a4e035d22f02e0f9b8db1312254d636d23fd74692bfb4c52d7c80922f4bff6f4e8b575e6a4510c3c18f9aadb442f14271c643e874ac3f8aef091126dc8ab24c8b781007075485e58506d5c169ca561fa9059330877468b319a9a22b0f5e5d3956ef4081dcee7fd88557d54654a6309cdc1152996b43146505efe2f12ea6e3a5697f7bd1b92ef9cbe5222319913638b848f7b40460408abf3cbcc3fb40d44f719e7c8347df6fb82435893c6dedfc79ed115dd6cbdc20f905cb05d7866d6de270f41335cf2eba6971d7508e784054ca7cbf608d4e26cb1d9b0847a218ad413f833facc2c8aa841a87a9ff7051021bb1f0626d20fca0feb34d9228d358f11ff29ff77e6894644fbd62c98467e4cba8ff25d9a5dde397272071f0ca557936aa440eb9e4a90445f4c2d59fe1b99eb73124e7feb1be5e4e9039c6223f9d37b4804034e75c234813d06978666fd44f9e0d59ad07c1578fc180ed9b1e38a18fdde4042a05be8de6e1311e60b2e5fb422cd017845e1c18dddeb2cf271c4df56083fe4b325b062755cb20557a21e4f7bb9210434db8c2307ea66073048154e52122ecd9b7a484ca5ed2a7ccf9ea7d59caec2373e26ad95a735df0560bff9d37f1e47363f928063880324e820f1b5809756a3f090e428abe1f48040b49cc68318eec8a0a0aa28cb7410582a40d9f0c2ba5aacc9e22aa212c708a04823d3455a7ef23d51dcacdd53f0eb40ebc3bfccd0c31b99f94aa03f140f00b6bdeacf8dedc0a8f75e948301341ae35e3f1a2f841dd72041ff7908c16c78cf44a9a11b4019952bf1fa4d5eb17872aafc38087b47d4bad6334ce7b1c446c388b8f0df1dfa65bd2b478f3eb6143f7e31cd655693667e9985d3bd895d210e401993157c2b3ea8d51ea32fd7fb2c51599a38a0c4d6ec3de425dfc26773d2805489462c3a89e70d1393bc6f4d3621bd01be832560b39b0a150a09acc4a1610a1e9ae5d4651ac3928d2d74532c19a23e0b8e118a358f6819841e98304ca38ddd8a1a54ab20f776d155cb9db32ce54fdbe27ee32a5734dfc4be7910f947e8ec109509605b95b83eca65b9b654f662f7dc92e1f8ab67710790702610e455dde2e5b218f57b04cdb6ce673c8b249df99ae556db84c50c0334881aa1a7fd62105f3312ab5c11d995b68f16e2898e8ad2b0ced12cd72274103ebc7ca93b2e8e6597a4751d0bf33c328a260e9dd56a73fe0ce4a677b6a1a0e1ae46de418655330d10bc13c8ec88f0e4774322f5243d64a1cae9f31aa812301ac7fa6f731fd700027784eb2d2d8bdef26687b40de8587633bd70766f505324c1711ccc2dc91136069704971bf3fe915ef43c77d96733e317aa3df58794adedcbab8a328acdbaeb63e61732923f9fa9b943263b81a647ec6a9d8772047303b0b734739c815edcee57939472f99e610784469e20bd8f7d6f408ef974822cbd1f034ab88e290bb5176d92f723ba1c0e9e30f9a80e2e08491da769fec6198c3a685f9e0ec0f87ad99f5b4d95bd3101141edb9a106c2da7a9739972d61e68417e8588a39b879ac4325c114ff4031f94c7fc80e2e92e0a7832609c0b310f23dd39e7095579d1972398b2a4907a7020fb225c6629ad552c877f832d5d217749ae1b2fb6ac2e7bbd31e5d1b33b075e93c4800f9e333aa10d53523d7fb1d2cd152fd501764f33fb329be970201198f9beca8966259f03db693dc01c19b6cf1cfefcfdfcd5b6b8393357f0e2560b3fc866b2bf3ac0178c40377136bd7e5b9c05d3141d07eee3f04309766df38d2a8b7520742a08b8ebac38b8e1d1a40e675beb9845bc28d5b27a1d4e9bd3ae0c260308b41fe5fa00e3512be14043c590e18bf11dbb50ce2829094855f9ea3ee754a4436464b36840b62eb52174e772987e945311936276e8103c07ce539a2c37fae31530cf0af300d94b1fb0b25441af90541cacd676313a303f95ca019516ba9c3246bbac622b4f28e4500328cf381ebfa06904deb97ed0e9bf279cab02285b06a3829bf04cd720c0d6696061ec38c239a02c309c7ef8f23a393b0d69e03adbd10686d5993703647a22684d9949e1361967b74669eae4e207e2db5a6791f945c327096accb0639ce2a8522f9ad4d6a530daf8661e4061e1d7d942f6cfb64421dee3a4fe228f5688238c1e58272d76f5d5d1d128fa9062b3b64ab12dbefa28638b3f9f7a15df5b31f0d21915ec30b67a1e6f421bad6bda9a8567af099b8be36a56128f73e0ffbf466657b87558bc10a6d0ea48cada2ce4a1c0e35097bf102a1f345dc4e713fc1c499ce656d26d328f8e662d13cd97c13609bf399e31ce6027431c20ad11bf58a5d6aee75e700ff37f98283281ff1a49529fb05d23fd38e2634b221f8873c1b81381cdced6b5a96672b3e7b86108f648d82f99e4b34dadf8c8a2d9e86d0eb8c826db73548ad9e7e22fb5c8c01e62cc2b74796608aafc8f460670f6061d842ee13fed4e04cf9ad32bba64899a4918d6d7dc9a260a2a8d8e2f17cd5c57e13e4e4cd7f48a7a06a73d5133493d84312937033cc5d163814644c4c43d1d60704aa668aa7529b32a4a85d1c748154e9785866f5e9532b1616d1ecd8ce302098963c5d6304eb26f4720606a0482c36fa726892e532c9d6bd3079c3983eab4e3a7f2571c39d50df2c94a456db24741df6312a9aadccd634b7cd5b97c2313bf56857303d29ef68b059405244ed3d05b6b42f947cf1c947fdc10779a5839256fcb3df8c579afdd1f82391e12141b7dacea888557a1ece004ed656867c36a6c96ecc6be8e567255e61ade4e1922ea6129dc8666f7a8563a335c71014abeff7fb8a76151304910e776cd6f182343534411afc2152772de8f7cef8033d75a7035231e3a20ee7e7e45c23310197a34cafaf6984383d8f57659e00df163119170d69bced71e6031eb562cd13c83a9fe9c9f932d05b0008fe8e6175eab2c19b21885c3dfacf9b8885015248584e749d7e155c8142f7c9cc0b603b1ba29c79e5ffc09e1b0ee944cdefbc9c37a2bd39bf3b1a36af2674b4f6d9d7c8423c98d77ca2828f041e4d475be399f8ee16ba815ed2b05f1e95141204c0b1125e11f75369439f4c1229853293a9cc21e83fe466e7d378aa3ed46b852fae355abcda71bf9e36244f4ab51f6e391ebd74c560ab4d1407e59024196d47cb6cde3b672b1f984c25d478b6a23e8c7b8c6a34299130055e2d28979b8b8554d8e4106312b4122d31efbd9ed96a6ef2fe4ab90dec46ee51e736a05e40218d8f5acc43bfba565cfd35239ad5c69d7d6c9af8045578511d3fc71b45e44455ec061f19092e9d59506965d53aa88b3852d1f73a01fa114f51c64b810339e063b2d9d886d25510ba39880514083f2aa14e96343ab021a1d0f60ec163dff59530473b41a90e2f28e9c1de3865284fd1ca903b542b2083d1ccc8c793d1de65bd881b2dd8f2c506e0f01df593264651cd6770ad1f930e3da02ccbe034fbc8c89851b56784a2225a9e68ba4b9f4bca640cf9bcabe3896b1ba0af8600fe3e1b5afb081c4cb221676e061281c4003768d23298250a6222ab57d26ee08b5b46bb11dd392b2a1fb0d8f618a66fdae4a59568ec6cdbc02f66eef5d85bb3a72e778487aa888ae5716560d7fecea19c5ee5703a6e949ea9ff72d10bff4c4e421ad4193af8d1c67cdc4e15ad5632f05dd5184756b15de7adb388f6e83978ba21276bdac8d841524a4a86aac702164d56d14edfb9ca6d331ecee1eced7030551b96404601aa77cb8a2203e24f720b709fd6030e5a94e957a98ef118f92f7841123acb850914f0018ba0e78b4f62b5e0d6f0c306610eae8d81c0918e4eaa3331d0c86badf1c97fbf1125ee2933c862a4281c3608317c1eb278c6ea2b4e3de9b09babbacc74441a13125f0b8a29f3c857b0f380aa8e9f4ad2a813a0ea4b3d50faed96ffe2f506329c632092955319310a36235a0227e7062ae063528eab803e58c0d067c6557985acf812d1b6aa8c0800615952de68d5863049ad51897a8c64444d44b5116f15329fc02235a4ea384b1c2db1854aa583adb7a4a8da12ff3080681d3fbfe24490d723ec87abbd42006011b28fca50b691e70ab9d23dc0463b90991a5178f430dd2e40e6cc85abc4b475810cb4696eccc61465e944fa3ed0269fb7efa7bc415c76f9c9d681664205dcd07f4be1110950e43bb67f4b00f220ac8dc4e8596f85201b18962bc2320ed695f878e8cf0b70276faa64b16de6b04f7e91e4f40b818b8ad0c2811991682407a73757a0764caccefa473deb2d7f12e77da9efb5188a8f92070f65daabe7b7ea821cf97a210e7113b99ceacca8f786f1a92e4f4832b2d10250978d4d4e74d780180054ba0a00b848d9c09b694531f902e44ec18a9b26bf5e2ddb931878920bf4e791ebbd4583520ca359152865491d17744c2cfa1382932bbc451c8f183f80a74a94312b67ec820a5884d86d2412a3f20d347613f36d399d886962f5f6b242039f978811b80582191b1ffb4ded520f97fb0ac01e469328a351ee9086b562700c804cf09591625c3d6b005408c08ef3eda642058c523229e52262c03c399c148ea19522768742407c518dbba40e6f783b08018ac597e423064dba1c818ec5d8fc73b868402c815c1492c3bf7df709c915f715dd1c9648b93fc843131c60d833f293950bfb2af40c0e2917d1204e023b8b263b2234fdf0391837825d30236a475cbdeed5881601e12f24581c64f4d7041314a3c72723c3c0622920b4a5e36b72c8561348e213e4b802c01b11083178ad213b3532c3d167ebac0a8b5102f5649049487d408c37c0de879b734cf28b7007d277f336efae1a9c5277f73c03398c77cea8f626076bc28d6d5a2abb90ef3b4574bd878afeb74943628929c790bc3169676bdf528ba50e16316766e3abfe8538173a81dbab9dce87a19fc1dc056eb7cd801dc619ecae95d3b452cf54ee611594dca9d247df3acc691d569ad1453b2985235dd4b1cfe78b21eec471213300b5f28ec6b0a0ce2e689d1cb31333644195593124e387c3c69ff88eb204338a5e48c10a5e30f726e41b051aa50738c21e130b75c13a8ed041e3d2741e9e58bc0634bdea2699933a1786b089a3112169dc0f481569a8fbff5c516b23adc6ecf15ed729b8cbc40ad0ec8109fda2e8729a59ba35378bf5da756db41979bfc1a6691b6ae231e36fa3c68f7c7cbef332dac725520583679d6047852b17097fa92da41e2b1255a43e79f02030f2626c392798cde527eea5f6e42728ddfbdd8cf61c1aa197a286d27d78fcfdba2824c972a40992a7be85c2f3b19896e9772ef382605ea3dd424c964f710589c4de0f4e694906771ebad083bd4e2f0654cf945942dc51224dd2608f7f1495be85f22cb480de754e98a7d328b6f8f18a4e4d2ea72db9e8a609503598baedcadb681a3ba1395c80053967c8eef9a867065beec886622c3a82f4d6d73b719296ea25d32b378a8e0193259ba6afef6eb97d4111371fd97e1ee43ac0f979eb11c9a51d03d485e323a03300746965a66305299c3dc6528222ab09331bc3f8fe5324d566f76e4a942b80c94e89ccc50310b9212686f7c191aa9dc11a4e0ef8e6c1da6a7829f8d10646f308a20c07b86d6b603adc9f73e3c1acd5062ef86671d500caf0b4ac444c94337cabc86d4f1373a8e71d0c184fe062d9d2018a8a8c17b0335f3e08eab45e875f282d44b0950ca646d389fd41d10f259877bc1c7640ef6a3e84c8c56e36d422edf727a2472241da3469d621a4dd3ed9b505e210dfa3ef58e903dedb88667f2e4b493868a57098403065f20cb948a894a7afd30b34dde71a7a62e86977fe62086bb0fe0998d008bb6b0dd5b60e839c5c82835b84e08a546596d83d7bb4529a991900fd1a2482f79092d863eacc3e63ab0f98034a413637082fb9dcc59fc9007d241cbeaa9bf7089ca11b0ba4e83cc45ddc0b4a4760e0e7fe41435a336196c86ae1ffd26447149f19427de701f4a59706ce86f9456536827259749fb264b2043e74a018a9a4779e9800d92b21f5f9b01e42911b02beb8422e18f7c7772f9f90836dfd6215adf90ea7aab2e0143d57f46b25e137091dca0f2bad452b5485788a6930a01dd972413c424aba4c9ea96db4aab423e34f2c0fdc62542a64f3ed1017d078156b4ec35ed30a5cafbf840d205514927e04d4a06a1824ad6757a6030ebac251642591e291398cb6b52e19298478d355ac156f16142056f13abc6b7e58942a0f11463e387ffe34ec51d57af7717dbec41ba17b82c75ec2cb20bbc203b7229d7d0c7123f3365178eb66671b6d1593333eea0eb08e2d387823d5002d0cb7575ff85ae253a236eb12670de9c827ebfde651da5a6496dab9131877e295711515fbeb1ea8ebfdf6ea7fa5d48522c1bd6cba1d5285b4cd58706195fdc17d604c004eee77bb383f38c81b31005398fd374df3b3d3619c092bb506f5058bd0ce26566f85e43d0b6300559d18bfe0d7d6dcea1a9b6a1a8e43d35def78cb68c0505d12c4c2c0fafa2b33e8d9dbd670d7bc468a0627e824dc6a109591007263f9257ca0a95b3d00695c9115580b83da1149978c9706e28ccc7648628350520cd086c400924b44ed6758be23bd6b0555693500da5d3adcdde28e024089acce8915cb9aefffdd730e55fa24a14e1a4f5aea330a10780deb97c8e71be42fe68c817a42c09407bc10244a220784d2140816a2a0bf25ab64672a75e0c1c2f1aa30531c3f0bbcd14dc4d742f9f452bf44d93c6cefa59cc6860207305c52b7b56cb84b021f11c843793e6d9f2129bdd64cc4cce5c54ca6c289be9789bea01bf58ee4b871294891a913bcb5ceefc4d69f439a922235c11c8e9f4deaba44470bf50c7daf2a3c2202ff44130c32225c1891193153d0c7ef251a648511c7c320383ce751c896d18f8f3c8ba135065b1a07b8bc0d06911f489196b11b4b74034614176af5784bf60f765eb8ee7affb1af5001f47ed7c77fcac5f96e63cffe8cacf8ff25f0ee19a8b6f5d5be5808d9124b6fe634ea30a7c20c2560ee26df74275448b79fe5d53afc4d861694829ad3c124b2836def7c0e84306edb61dca4162cc18be2cb2cfa19018d0a1f6f19dd2308d709a705938d21ac819c0a4326bdae089850441945d2fbd63b88a533feafb474529abac6302d643fee43bbbce21ec7b2e41627a609a8205e73f011a2848316973ac285eef47597031e4ffc290b88baa032a2b994167f4c32143d50065ce41edb904a9e5145694d1d8ff8c6a4ec5260c34d242195951b27d81840b77eadc0fcd04a50570c163d8c6f2c244b192b59ea8cc42d9a5192e016a84906db9c44da68ff4ad1c4e4c8fa475cec0ee7a87f0aa198e707bdf500c2a2c01aa82a583307179519637943cf8a4b0454b64c58990ac43db0e0126a3e693c3d867deba69eab3c5aaf3fbec93b5c47fb986e63a08b8a9a0f5570b0d2de7907bf611ac1247e536e840fdb3506cf439bc959bf2a9434756e6ba7a36a00bc2184a0c38ad5f944da7e03667f3b09a94b712d29031e30d8b94d99dd9aef8fc93e8480510b0b33ce02749da610f61e1527fe132409dd831819d62f5527a7b612277e272af0944d9f324a9e318b322e12221f696cc53abe913c078efb8b800938aba8f2d4de40685c62f55023aa0bebec164c9333619b7b3eac1d72312c533a8fecfe59d2b6c58ea7ad98d757fcd22ad07045815e4aa8784b997da3d8a1cd3fb10455cc94228aa25d393bddbeb592d4f2349de508ffb910cbf623b15aa9f9585e76db5d81c4683abab3064b66cb64133b6f4ec8c849634400e5334fad1116501b06bb4f18a51e2ecb5251cf350c7ee5a9786250bb1990887457db269783a3a191ed933619d400d8d63883abb462e48e065cb23d77f16d9c5ebbb387805732a7e7fb8246a83cb801257cbf54290c1ea9d53bbf334462455e551e59e99023d8987a311c536f4e3cc1548c905af78ac9fd3f81375647a3d744a69c1736cb531b0531031e7c897520552b0c3189a00affa34a4b9bf9fc437cd25573d7265ab4c8f6a3cadb42a587b9ce0c6984220ddcc0ce3722d23e6f6c2a59270c410b47d6644dbaf22affd6689e01f87b0ccb4df2b9e13b247c0665f5bdff8641c11d6e927d225d85fcc20e6c168548c74aff69851ced0bc84109622aeb103862892ba8088fed00df19e3a6c93741af221d1aa508a9258e2decdad5690cfb6add91cd54c521e6f07c4f7af7bc1a3896281d42755c1532b8e0b516a48d9cc087704d8aa91b5684ac1b557772b36cb1ab7bdcac7079349ee9c1e732062c501cd08991df54b75cbb436ff61da29cea122aba51c8958013b26a1f3e24e2330e1ba076f11899f07b5ad6b1751e7956780ecd0493f9e99fd8570866d406b0bd399851157eadf71d295a43b7e328222d96f335ca045a68e76ba958fd2bb929a4c51623c2bd81ec412c2be58adbfbee20bbf3d88745539a814af4abda3f98ab63e4e644ae60ee58f8942646aea0bf4279306459a3e5919a1f48add3c25b8f897e02d997d5ba3bb9df40b7755026a8d710298e96ed356f7d8c0959a2c4f24f3e4336e3d624818c472800507d5dbf6ddfe99dc477a5317b87e7c11bc67d181a6b05d182fb819b6098494e6c465097335f4a29a014406682900817dd2a8dde83dc4653fbc2882574c2d5600145cb0e6ce5682c02ca0ec974cb130b17462da62fd9f602d40882b6ab5db3e017a9ad6415080fff9dd1da048904676b3506109fb63929dad7cdf900ec8bf58b458e11d96c0b824024f103a1b468471f0a33e8ba72b931385ed844e945a19c02fef009e70e2707f915d2ccd9daf4f1cb788ae9bde9e05885e1243f0872134ef70d3c729da227a4c44c5f8c01210c12266dcbfad8bbdb3a8a22cad7e5dc446f21a07caca803a8b06057968c02f7a23ce1419e21cfb5a2f707765e62e5aa073d33b09df9bbc39903bcc9848ae7374c228715e3906ba184a454f788062d13b07fc0a3c033e76c9c49fcacbea9644ebd924613501491563038a6361b0c5c921e6c163c431cd91401ab277da24f04c913479c6b07053084a47eaa89b0a0b20608a70c879196cabd2caa665e88ba3113a872bca1bd63792a5f5bd5385b0116e644c067974ef94e4da014bc3c486d25ba27ad94ab37162e7a26492f552210c7454028139c8d853e206000ccd63e62d5f26483351afce7c0466addf927428f6502a42de0ab17903e85cbb7a41c9b8461d2a2dcfa1b51e5b04e07008f3b4d0c422dc99617f258011bf2bff4c0466605e0389af60c219a55888450e9f1ee540379035fe25bea94a4f171b4cbd6b0a3ce6e5a6f8afc43fc13f8b039993927cd66c4d044c840fd3645480a96e0d028622c9d8bd3d1ce5abad5233cab3ecfe132b7fd7fbf0444a3dd6f762708ed9f3bdb714890ce6d94e704fb95b500faa083af3e078b600215e94ddf91efa900dc0b0d8902f6e9d5ca25605c314c3ce594f87b38432ee0bc3a05bcee5782e7cabf599c669f6e13a01a2020c76fdc3905c837cdc67c092f69bdc43c7fd1665b7a5610099dc1120099fc7a0551b5f5ad6817d631c1715ab069d155e0f0388c459e6daed9e667e7fab90ac84b4773fe3d38c405a78309b86534294b241c0f0467157b61207402afcab67ff0b2a2e08d45778d8621ca59c1b60114c7c5361e81fccd82d30f9bc71d014ec28a35903112e63126101b19d387c31d0890d6355a58f7976dfe5d1d019eacdaef27a4f0b22e322de21b9b9b2dc23d9354bfca1d7507f9072a213966e642c8608f172bf7c84cd63f4ca865661f0583332bb32fafd673fd4424de3e44dc853593d22be489e67ed2bfc967a2549800430bc41481513907c849fe2a91b682f2688aee9b2db08f7f82bbcd7dd0c29ff83638499e07bfbdd17b70453d5c9eb1aabe12f44b0e5838405054b0805c3c45167333d7b0888e12bda3d3391990645433b3820658a1edc01157a8649f7b7939e7cc6e3e798c0ae2181d37ae92174fe80ab0a75f37fac3fe49c11f85070d1576467a3cef49292941c616287e0bba7a79cadc4997e827193934642f8e6bf9b2b9e5623a573ede58fc9e424d9098677e059d5be3f513d4a6ec60c5965185a71203a2996e74493f2829bfb1baeca57dd4e4908dda4bfb1f0fa65462c537e1df45359f7186cc721ad4f24ffb09a7465d161f60c67f3eb7e2844c0560ffbbf7f0e8d13072339b411ef3a38a450407ff60398157cd9461bfdf64280dc5de748aabf376560609904f0facaf7e0ac7f116e1cd6bd6b41b17654bc31500af2798e922983c2240983c3019011ffd1c98031870f67c40b42544b14743d08e34d0155206c0c6ed47e60599540e2bb305b3bfc9385f77fbc9c6c123893e789372b706155a3c62e206e17eadb84523c8d75a8afff8e5ab5916aca0f7b9527d6589375da1edde9c9c7751944be1f76df839358bdccfee9911a18e5bb969a21670190c543c2c5e8a4f0613c23f0a9b98d1f4ae78ba14026a3b91f091d73fe9b0870a3c633801fb48d3f54518f4fe0daf28e4c284869b3b549c92e6feb6c6eef681ee879749c35511b8de1fefc766dc518199d97b88aee51c7279ecbfb56db5ede9c2c3f3f1962d9c4b3b73897ac74fdfa5ad88123473ad2321cac65bce3d62039a4b3d67183e9f58a9d71e285361d3b08fb5f167eef1f5e3efc0ca48f554207a3579108332031e004d4de9ac1a0a152baee0bc824070f740249876747040797a10c07562445aad2f7de71cd88b88e90763bb951fb2ad7b80e3da343f9e3e369d8431961126cabad4ddf13085c3138e6d05c419c6d0f5ecfd32479eafa39a263105f9cfd0b5b4c16aaa34b17a1a240b9bce56f26f20b2dce67e3970b9ea3b70dcdce940de5590579067f84ecb39dc89578672a3d121938575695839a3d81e68da31a385f8d598ed3d52e96130767393805985f57e6338523cbfda9025654472b35c905c1e9553ad98d1a7c87f7e70491de0794ac23b869359c8dbe08bf347e9faf3a9ac1706ec7e50cab924cf96d5a8f96909fc1289347fa42c28919a278f538fc7e00ccdf70c1541815afe4d5a38ef547dce20893b7ccbcbb5172db497481340e6853a813479be4830fe175171984ea215a744464520324290be69e3df6d1a46a40888af8fcaecd137447f4cd9355907d7029b230f97e7bc8977092693299291e995eb7bae8cd2c5cc090a574f4b3b1204b70542535eb31ca6545c54431657436977ebe3b41660bec3664f415f01d9a9dd07b0c1a33dca49e8dc56750b34293561a8e5287338bd577f6d0e2076b0783e98a1f5c8849bf2ad8e64393afbf034dfa1b9489d63ffd25c5592104d0b94fc3b04c396463d53ee8ca5c3a422273b8a3601045afba39829d81ca7f0d83be6f808d5b4b1a8d3584a658f2f4e7b1e1cf60c375357db25ca271e1f8754d2c198896f57c23164e279288d60870fb89c1725745ce7cdc05e186a3a5fab04a7275d9f866aaacead94ea251b8aa9cfefeed3e1c8ff593c440264bcd09964209516d8710287c85206e6ab5876ef4b88b7ca926a6911e680e941102875c8d2eda012de4dde06b0893ca4e1dcb55382272b98453918ce837745c8263e897a5cc4e51e020b84ef4b6592aa9f986e1b215567e96c3bda68f7e4abc19dae93bd375e2dd5bfeb79eac9ba013e99afea401ce47007219214efcbf47a963d78e766f5cc5091a2fe108509d3b762c038a0b85e7da7a69120e452281c63b0295809be659de72589e05d8229fe57e881c0987759ab5b020c148b9a3ffa58b73b31a2d2cd8ea9952516ac48a2088f296b5101d71ba0dc840d739d5591e5b93188a4b4614b622e110f0dada579275e7298ab33c1aa6fe9fd4872ad5e47ef1f9f3d380249ef64ab704031e713847b23b36f7db089487f2012e1e8d2849c94f915d140f19766846e68c25cb3e6461c2a15b7f7cf8b166fd28af586325d3a5af2b9766c444784552de527e0f3075ffe56d8124e274d4e016b43b55da24cd7c18255bbd035d66c1ce4bee24a10020534592f13a6d29fe3aa032ccf75921fb48d80923c8329f079d544be48e66d897859be8b6f577f58cf3dcf47fe0bf25f61f87feeedda72e47a314209874c1b6efa5e56b2948d532800d0e9fd8653bcfa7bf5fb418805962632892caf18369d82b79ba3267abf03b289d6d112fc1227017d64254edb4540327b89150cc41286498d310d036afd5ec096944ab05c412f16fdc3052ffd41c9ad463fb9ad985831c4daa5fef789e374e88a1696719c300cddc5b72a0bdbf9f99ec4d802b2d84c5ddb120dfc21b050344d6048558ff304a057b23aff78596b591ff96eedd96a7e9a05dc9f83caeb6f81d59af57fda8c13503fff5601238257b88bc307436a21c60a3370adc1cc3829ae0f5b7d1f5de00b55fddea093246b3c70926af4ac22d89a8fb4507928c878ced80ef6cfb5dd8be6cb4c2a637759f9ee86dd96abe980f41128ee9b5162cf7574e14cdc273b28ff809ccf503fccb6a84c1794234cd7ae7297be19ac5e8eda500bc52b4cbf50bb03502e582633614ca4a168643ec6585b60280a9e55ceff7dd495620044b2df53a68b932961c30c50f7d42c83503d47a44f260613cb62fa8e79a37c2952c9346281e5b5f7a5e28f1af51111930a1ba5e513c761c4eb05c862f5b5e3ef7740619db2d7b0068a2391edbf3be2544ea4aede206d77884afa5be873e0bdf9365200aa8048ff15e19883d6e638f764663f0b7deba92d1f006628d639f3f8e46e436a7511c1be70f20fc5feb7e79b839cd89c670c6af3a239b4a2cc66dc8645d29009daa0cb3a8297fd1172ac2336d7f2f1e8e0bba8c13e0ffe262146d5760de0c0df3660c2183be6b8371953d8632eddbd07495a94eb5c5465461538d7cc4180caaa1ca4c9f08af923386f494e513ea337eb0e9bb6e4add2291d7a2babf3340b263cce4e355c09926729c3fab33ad685a1bc60eadc6143d514fd6d043ebcd290ff880ac45d2c08cd8a66951c1d7d3e1a2c45af4f963873b0b3b5e1281a8b5087d1e2510aa214e3e09b77d44437a97af58de16b103a1802101a3b64358d469c95ee86d5f9cd8e0cc6bf0a495f5ba9d3c4ec6df9d5ed2d83faaa20a87bd2ed2e16898b8bcc942aeb3eb2f1c22d88040a24e9e166b31c6f1f9157207c78910f251de2090fe8addc340b9b975d6e8d6387503b089f8d577782c26aa41c7cbfe182468e473cbcb07926398d6afd425178674746a8ab7d23d4e2d25432d62158bb758b2506888a1aa016a6307b908ea7cc6bfd33956cb89abb50af1e352ad5c60a27e828885912930b7197139b8e0c9dd9500a528e2e46eecc544324c4d60a90af5e32255340424a3722a5a896190c80c5a872d05b1bde05f011dff2d7d98fec0e472ee1175b825b20bc44f0676068aeedfff56ae65b8c17d68fad4ada3aa72040b8a5a80e2a63d432148e3659bc9f4cb3c934532f399da5774b860caf7b77b9bf2aae119ac60e4d4981419c3626af21050439d02db700fc37699809accd146fdc5fdaf57af11b351b8a9a1f7789865c2d35e34736798d20b0218fbfe4e7cff32c111b7701a80515cef928d93a13cea28f28c87dda28aaeb6fe01db98d89ccc3308074aef3c0a12c11ca797d7bf5899ba2a9eb1b01ef75471ca6aeaa5fc3021101191ddafb0427c88322a9f2e906f744549f820f00f331d341555f62f368102d70eb7a7ab0170af5ed149b842a08382962da77d2d1908220163091277f53dcce2ffa6507e4c6cac39011f7cfdb97b498f616cb9e7445da48fcbd75d7798de74230be907e3d937441f75fb59912e4644b6329b432194d6fc0ebff384cacc5d60d3a216b00b9296a6fbfbee9e80d19c0a74bbc640977f8a417c3e159d8a97c65d1ae47abc8fb47896af3f335aa3370056f48ec910705067054581f933ce1803b5de213ea7bd5c133647ed1606d275c0946ab64992c1d5a8e4e3dd20fa630d35bf9ce9b86bb0e775f35f98fcabb10f689a8f9573d3a422a1e8dc7a4d692afa722e5f2ea40a63c9fcce56b0eed55f82bda4e7e7dd5485430a5c58bfc6b83ba8054003fa3d02190709699d5210839cbe483fa44903f8726b997ca4dfdf64b28794f7076604d1416d9cc45e6710a1d2b7167ff89d0d49e699b54c3ad97b5cd78748b1171ae4ed19460d6899b1abc4cfbca105902935da7f4568466fc67630230ce1dd38cfbe471dad875088d4d708e8d03626c97ee2613d9a4ad317894c81043324236f61886258f3ae60918a519f40781d963150fd1cd76534a79d79a6fbd716344ace677af529cf29037036ae65a1618af6fd675c7604da5c34d303c8e3bffd90fe901589713c527bff456b648660e78e513aabceeaf152d4eab442783d01e5bccbc6713acf4687d8ace095bb63bd4da902c28966926022a69f7e31935b0ea9318344bfbb822b37a58ba7078f795eb3ab6065b8850d684ebc2144c028f8c22ff54db844ed1b875b81dd51a32309e0d8a0500a8c246885884241b858bd980c268d41f8f67ca57aaee1b80d4d3a8f1f1889de6947ee110c870ce72745964ca7622182859ec7d9f52f55a6e02c1806a6914f55418ff4c6b99b76e7fd324f372ae53ca4fbf1d46607c3a6c3591e14a19417900b08e5dc8ae7f31f590db8ed487ae43738519c156b833f3954ee3cca42c0fe422312daff18ec7f54733b424af881b621148553b59b2d91bd2cd2b9ebb56eb38e1af0c73a8d0cced904f2c30c8d6c25fd608e6f478c6d3792e69e5f61da31591ab8048ce0f6ab1058eae5cb5fa170cdc669e3af5f367021ebd52f897087613a65be320d24201b53099b80704ad1431ae50c47472065d3c709ac2dd1be3d875b02aef301ee61e687ecfc37159a4000c6cda0cb2bd420c7e61e9cf433dddfb998f28a8247cfb9ecc7d560f41a3cfe8b8c235d098c2466291e3e40b81712f8c445ed3b7e08cf7928be69e6e0c064efe17d4b44d9b6431b6a3faf417caa52263deac13bcf2c4b01dd3723eee86c7e38514c484224584ef709ced055471fe0427083a2e4cd9da4e3048ee44a43d9870b5c054bcbbb84a6a78f80820bc5eb098a41a6c2990996f459b4226af46e21b9e986de4bfd2347085a2a06cb15011403568c9dc9db7854402ca7ed2b2e0c5677f1cb7c67705f6b409c95d94d8aedb7602c9d227fdf094e16d757d6a0b3c44774bc19267ef7c83e5a2893bc4c21277c3fbde63ee896ac65e89468b7d0f2bf80edc3483288c10605ecc1e26d5a6f24d4d2903ac0dd681e45a232d21c3e0ad47d462d30b56cdaafb9d76436fc967270ddecbfe8e82e7fa42de1e8ee0c01d6d988a40c57b0ae89060d80cdd17aad53f839f1a2257981cd70a6aeb92478af061acf63e3dc69d4364a8a951998a0a440c3cd0799fe6e656e61ae5c2ea27f9863c1e6920de134faa82f89b77b7c4e214b76a4e6027fb11e0e04253bae32f0b5cd3e1ac5e75261aa799324708bccc18918bf59f867a9e60b1816831be487f70362de5ef0bfd97e208fb41ddf9563c1597c131203b7493af210f14c236ac7b92278c6bdc80ea2ef41bec40fddfe5da97b2ddd24a271c78ec19082e012ccaab05eb847aefeb1dfe9265f99cb0e94624e298d98d0f485f7b4e300d9866e1045e254b4df0ee655c27133278239c34826846b117491fb556df462d13635223c540aaecb85857ec4a1f93a1462cd0533a2892565a000d88e9932bc31c0016f12f9f73ce19b158eb053ba406b481e94f5ce39ba7e153b4a15ddeda8312f903b2143eb45461e5cfc5c957905712740944884ff540548584a4da458d3d1a551f1d42f0c932a71d6d9172ba3bea996ed8d97a2f51fbf85a8568966439bb0311641b6ba775616eb63c26513b7e42005050b90c4fb376778d92a483ebba858640de328c195c7e118ed8bedb9c84db238a6293d8813481420034225e8714dbb11f5f111c78ac0293848c1323fe0641fc651c8648a2bd320261c7abdf455ca637846c75b86347923e80e8a624c97df09b657b0ebebe731d1c16118a385d38673b1b118d6fd139d3a9818f0fb89a164ef8fcec37b29c9c2c503d4b4b123fe60a4f533c3f146aa38048cf91f37cd7ecbdca2b921930b159e0be23e0f706c60201107ef28c3bce60b930334120278a8dae87bcfa22a2becdc30b1ab78074e88fc86c5040cf756dbc42b1c86372017457b0fda7e373e15e8af26355c0e95ee637848cb1ea0582c9c9a12bdba17eb803ebf8d810eb541c48aa6d62d203281c92dc2de05c2e0d1af38fdc3f77e93701f1b926e77eac45d48ea19df99aa4fcffe8f92b09d0bde60fc9f391e67012516285ccca560d302ebc69d0b21520f8c4d189e4126e726ade234a10b56db113fcc253ccb524de516f284b970a505a8e72f315598c13adcbe5a018a99e208f58a2d6acb77094bd5ecd73e4e583f14e92922663d6e5a171f199da798f4cfa146f2c7838ad50d1dc378bfc4c5b6a0acad0cb718b4c5619127fc954b5f35996cad604b3ebc6c120c9daf2176855991dfdadd05d44e437b9ff46331fa8cba9e2b2545d3a41d0118964d5180ff8c03bf660f514e9850a4f6b06bfa4dc9cd04f40c681e41e9bfe998635a27d741070fd8fd5a05cb8ffa56a0075045a30c419ad773ceb0c5f5aeeec8b7bec8fec1a5819500e7dc8dfcf59a1b4a66cc6adf18f4b5f476296616303766358eb449a3a6667ebd3fefffeda7df0ac36c817a1c1bbdaeef7f93a2fc171a1c2c9d7c83889babf813618eb7516c08fcaaebbb53dfbc7ae9c13eb062fb171afd684ee0b9138ddc7e25393ced3d65debfc7368e4919ebfd491651e03f08fa0c1ec335540a0d1547f87fbe2dfe50b4b9bb592a8678c528ef13b00c148209c6b04b046951c9bd0b43a89101d2f4fbc2d2f14206a8fc4266c1730b14db2102838b12231f6c19cae3166aa1a0086325180bc8d25728e6de24cd7474acd5861879f9543c49c31c86b5d70b638396193270e25a64d7b4ef7033a12ad5d6fa8daaa3f329473c8a6c05401b2b4e335d76b880f159bca465ceb913a5560242077a969e9c1bf91a66922515ee1329df161ae5717c1826c81a63098c8ca97245e9d37398ace8a86c4cc8bb897a27b1e1827e6cc9e2372611127c1611f124531d05b39948ce7e3799de4edd60115f6608889462b908c31f84868bc436f0be78101244647ea789af0078ed6d3b06d1353718f4d5c1df090fd5ed62935d3c92d579f66c2825c37488f5fd894ac91158b64d105de4dc60e2a8204479059a6e48e3bcaf09f699f3c97664c8414a89936629d4372adb97bac2744c72d309a722571dcb1967f20f7f166217a6024c322b7ce1971aa21209b6dbb94d7b4a08ba1a8cef61f685357c4f14061ae451a0fd658865e19a08b5c5933b9c39a0408d68ffc2a48a57dc5905c5772bf115b7d754d724298f1ed8b7256b21f1a0f08a0bb9eba2858417b99e3882d44b705777056a80ec239901d7a10602851ac1d9809ebf243afe39ddb9b2b670899c8457a0ca8047c09416874a55c611e3bcc943534298a5e7d0df01f0d1109de70283db27d3e46095ad076c42bdd485c478b6886bda096692af8c66751e54ad6541080d47acb3bba13fb46a877e72e848601b0359a253c238869c2bba3bb663409f7ac2b498c06375d362af5c7c7a42db662dfcde1e15777467eb2f3b61aa59bd497e090ad3d91b783e2aab3a402ab46fa41a863384fab8b8ee3ccbf6954a20ca9fcc47b7c2e4efa43afc7358402e11fa0f32d2eb2702c9a03098bfe73fd164502a43f791b796a8efc697ed7f1f0112fca8c18282442f1a61b2d21640429785e4034ac03dde1211e3e1477ccf5f8128cc6bf1ab078df13133690a19e610967581e1292c0811c1c5729f7660a796c37f06740f9ab3ce049ba07c7bac480e8365735d242f635cc92f301820673499ad6f2104f011ee0e73f93858a0e1f1bbb3f794c4078c33b3424c5b089ac24565fc4343c50729e65e02173d814c8c9ca3be5f8dce714677aae7ff0d3e65818602b5c208f727857c132ccffff9f58af735f97c2ff7599c7a4efa9e2de21946587220f220ef4510af49aaffa3699f25263f8463445c58fe9b6bcd40a38844f05a2cce495108e4f0659bdf324934b29f8ca5445b6e08db2512d010c1962c2fdfbcaaf231f02a40277d083a6f1f82d54bea2aae54e5c5a2b1124559035803bca4d125b64f1956e191b19fa93755b6d399027933a4d4e1c4b34b4d05cfb02d5e8eb31026fd9c2a09dd54357ab6ea6700ad3562293db0f1e00e670be0aec5c0e44015569c75a04cf49be5a33c5015890d75136d41b04d7dc080af54d661cdb4dbacec227530cf3b67824851010104cd67b3971f18857e6b1daa393a5856c247e61fa185564f9c174d31756cc753d7683025ecc4c60d9dd3346b593ad11e0d7090f215b2c9b2a50678017001de1d767c63b5d0b4da3ea162d580d1b0515b78cec21bfebe812384ec1fd52e7d06f871a0c5163969887609a97e3440281803966aba5982bccd9e5fc0e10044a70ac710fcb50d6f296fdd2bed4e72b1a71a1d19762ffea759c00126ff57561d5d62b1c3d831822998a4411b50fd2e450e792b5c484b47359490d7361b09636b732db3f0252825c8ba3ba2908a0a40825a1f440e12dea885bbd4c897012b273bdb60a6c4f78c084dd4a2497c8acc17f5807b14d0b7900a0111f94d862691e1411fa747decb92ed0ca9f6e4006f0ac6c86994def026f19cab63fd1a33f48ad683e35b12a5ff5b4cf92e9a0b6a97e58fd6d02cd8b2f995daf9aeaf5f206ad0bbf7f89b044f9cd6056b868a534b2fc2279f35c8adfb766fe2b60468def937e6fbe202d23ef0532d5891c30de3046c4cac7cdc85199df1e3c34eefe0176cca25d2a7a868b5c0b893579db0d057d6ba462b23464d8db5bf4c1e579f508f43c4a3d19adf4e8da73f2eedb8013ea504b834c30d34ef649cb9028288d79cf28a7fd2ee3d6c198e667a809bfe9c7fd29bfd23bd2983927b83f9e16e9a7ba5f6c92b1f1d0a54b5e18432ec6aaecbe60c13bc475ff2606ab801fdcbf89637d511d57bdc4b4bda74add1983077cf14e04f18ca899afea9e0e84560da14bbdf497cc344e74706f2c1a51525417302d949ac7acd3dd2e64aa5bcc06d31338c84170f103728ceb72b0863ba318003ab1e2750bb56884a0241a27fd077b4665696ba2a9479bc8abb9f86232571fc1442b06c1d6eeb9c7f5ee179c6b0f6a2f57a37604a9f407037555a284cb1f577757af55d9a6e01e385206b98a4678ea7c42d9ffed1af3f90878c0f8fe4935fb6a146282c9e0cc511e1c8a633bc28344102d3722db1a9192ccb8d2a0ea30d208a062591069c06776aa7f70ce6f87ca7665e208db069f5a557d63d817ae4fa5b3c2865a22d98d73dc7832ab708b8eee2e9de4034463591a90ca67256edd087645dd7c8495bee24c9e94b3e519bbb8178e2024c0adae5562346f67408ad44afd474fc34c89dfe3ca7fa0bfb7c2dca2b83433c2a786b9e26d6ee4103c23911bc2991ef6a39e50faebba295969db2576e5e38fe240c56b81bd64e1732a8d0dc533df05ce376260777e341d04ff7efbf5d1397c10aa095fc40c5d3269a2dde4526894a7480171f3b502c2b21d3eac663911c5082c036bd782219d4cf94fa2516635d958b7a77249f2d90d15a5cccd39cf8aa696d3a0750cb1d9ecbb57b888c532fa1e5bb5dd6c4e287b9e0ff76a07552a78bf89b66695a403a0113f99f9ea5a3e4796ec509c204b37cbf6fc03a87044f0a1c4c35977d1cb2945ee0c8d9f445afd4b4f6e4b82287aa8980bd1f085ff3099ecf013544b2eadb6f965de975ccc27ded37cb6e9ce1cfee2d0bce8c359b1b6e835577c71dd80c075bed7d3fbc0154c96d3affa5b9a433b6680bf14f74419b616fa82134d963ae0a202712181e333aac1de26fb8fc3dfe396fa984363aceaf85b0012dd43b482edf09a3aecdd4e1aa2623b0113dd3fe7e34b9307f362722f4b3348d125040516289b10ec3320a61ac65651ad6505cc955b14ec33a0a61ac65651a16a2c81c9437d8826000695f0999210ce8ae15fc45fbe489f8af0f027f5d0f5ef2a27fac4f8ffc10b71fc177b33451572c92c60a4822023e6c83d26a81c66006f9ba69082a391b95d799707c8d40d8687258efb2444341f8f74c88fa13f32c6b72441aa1468f572ec13bee18b083a968c4ee4c2cc82a761d262e38907054c5f6c497bd427f21dcf35a1b4422fd19e31971a30974fcaf2763437f14ed48cbc733fe510bb2349fad1234e4591a2390caeb9972fce218c45b011426152842433edb8dc59f54478da178de4d23ef08c43b5afbb8a645eb070348bdf3e5fdb06a5a89ed72b7bb0eaaf8638486d997689f9a1888e5a160f4303f1bd90e2856a2844cb91637206de289288cdbe9130d8b326be4d9f6aed45470a329cc54e2f267d737df04aa8fb5b40ce925fc13bb7f17adf9e7b158d078f3eecbf5f6dc197d2374e17981c46e02d97cc22be732c8a1f809cf274312002fa477fe9e9fc61b761f3ee74708da9f3844b54ae4df4f83e16963d3930cd0c5bffd40472d4454d1021a611228067b220d795c16970e81fb2c3293106d76725fe6f1213b16ad6b6b042cc4acaf278f2378cafc1d583f16856d3fa76c2292106f9341e97d12222aacab33351417aedf57d682a0c71048035968302b55f12bfaa1974b67fc6647f6a050db8bacd334e563e53694f5ca977baa9fd93a3fe2e1c56a579380d700557eac399a5afb72351c714063872d6d2af1ffb43cf074f9651cae75061a341b1426814e0470254e3053f4e4d504d948f3d4cdf1552d603bbc5c88be1776ca82bc765dbe122a28043b0dbb3d2a2e2f67de6332a06eb39e25cad5e0772f77e51353d6465ceb115f3f475157fff81ccb80195957749de3e613137146b46a7d511bde28bb48715115a08a33fb67756f9d3fd06bdb8cba288ee74160253ca87a3324ee7120fb032353e76847f8857ce06b15e926a0ed62133efcf68995c9e1022ec96a9398d8c46c82134ce90ca3fa5b920d7fbe49aba65ca3891755e0045944979c611ec7dfb947e0492bc2dfa4c20c899fbd4f58dfae914a1a46168ddf09dffd19953b11ed6731308a440bb16dc99d0251ef76de92aab886556315d2200e0db9e9a8d75d3b3050aa5b3aafb0255d791424b297ca385819fd1900ce4ab5357773facc47336d54be101d5d1f53459a921ecaeb1c54749d51fcd75c6bcf089f82acb543de5915e9269ba3bba5d1a1041c4d9058975df4e3e8a98f36be938f26dd7a56e616f8e8ab850395779299f36ebf6f1552d18f774d995d6254a54462228a5297db4fb414137e8f8f9efc0c16718611a1ca5a87f24d736711cc38cf761ef005790fb25818f2968e0a12f08cb13e34d0d02f16fe0534c5edf0f902660bbdc3820482fe5966612aa7b3faf22d0968e84ccdcb7f9a11e67a72e54945fdaa2155ff55bc655ab253bf5fa503b154211fa301570fe0252176143ae8ea775db2411859e3e604b0dd96133c655542f89de09163b012df89b283640149ae98407785fe3c575cd99133fec142ad2edf08c307aa11de683d429033d63ba419c8129eaaf5d0ba1c5047433ff783b353f4b9a16880764204b034d10c4cbb219fa026f0392f11c9ca46b343731e2cf5c078072df75ef264201194e2e73ce27c07e88395402ebdde84724d8d7c2cf232c41ecffd40245f6b989d967ebf8961fe12019b92849ef857cf4a3e49d51b3971734faaef872007a1a7824d0fbc78b233fbf7dbde04acdc764f06530581ee7a3c60771a19a8340f7cc22b92d672c7debc7b930329f443771df63abd10a84ef297048f3bdd719b059c09603cdf6f94bcba681e40c2d8e037bb4622090417dcfd03101641b3ee5f2d827e6613cd4ca99d5a13e684975440737ccb9f05cab855790b0009efeb098756e5a3b227de5393f903834e546c4833af8628e6233d3465c72e0de2bdbc4915c3cd71a67202c8354ef35df304a7a0979878cdacca0b362c8a3d8fc251cd4939d25188cd79b87924a66541e7ebf557ef5528f06809cc671f31ccb35865e53874bc472174f6795a4e2d847845f497c6dc5be8a3194c96d787c38724264a2324da443f110b9faf878f0c973c7ea9048ffb53937ccc8e4166e304b08630d63a34b1cf04f6151ddcd78cac33566e89946fb6d0abc98b6b661e962198bbb8f583eb8987ee1348ebbc1335b6061e9bb5590ca7fabb63df44d2cd3546fda47a75aea26861cdea807425e09397c7d07c5b8c307924ef1eb435618e48fc60f224a850d89b07704b07ad4b36996478caafb8a742de9be8be6dd13d3d2dfd861113b031b33e38ea686f28d7d9a310c297825fa35e69135b3b69fdb31f56f00b97412a03cf873f62fb8dc101004deae5884cddf5e8e3ca32fcab39cd57e3ab87c20c4441381b47c4deb38c49d8d5ef4354d8fe072d05caefd2e24cee9610d3e582e26f8e0f776bba790a5f33d7fecbd2c20e2ac333414b643fc0d4489ae5c0166a921e80ca65b5fff82a907560737a4b03d752dc07f481f5679cb2788c02d5e77752b73bf877509f9830dbdbcdb50c6d2a51d65a5afe1e04bd12c401a6964665dc3630a4a272c8ef2f327453e9e856f0942b21e2075b75b142bfb73a3eca8ce2a1a968fc32e56b6a69a1e09a9fa32c208768a4a196f02821fe1926b6cca100e5fe10cef312d501de8e4ae68e6fd5ad3f6432cb9b908aeacaae33f1edb882403f78cd9f95d5082a4f1ccd2a1b6cdc55dd838ce22bcd42a78a59e6743dcf4bb77078bd58893b063296f2fd7b0f41519f58ce151abc1dfba9cc005d1aa3e219aa855b65fb090e9f26848e0adac7488af24263c946ba1cfd84774ed3c8c5b7f2d2a8484f85d69323d3a12e9982dfc411b80569bc66c35c3e456984cf5d0f387013c0bca4b0878f378f468ffb4d80e573165e33d1e753044d39f1233d3481f0b6ad362c3ec5bc4cda2281cc8cf7c0b67531cf71bd59adf88dadba5ecf73a7b14f31fbde7717cd91c805dc97ed81850f87d7eda60e3ddaf0c60587a2e03529b7ccac4ec33e2f179864700cfd86d9d9e5a9e8a38de9374c057b524524a131183286865c5e0df5e7210ef57a67f0a0a041568692dac217f0251e4f6eb29a9debf95f515897f20c2ecc55102303f40491601406f07fa9932b4c0d758ce906ff53be1ad5312c9d48091000180ba3cacd31b19bbac535f91e351424f4452a89c93389a83ae33246d9c2113788a8e3a0a17007cb3a31f7d9f0eb73a23652a7b0cddad2e93ae96dab8f002568c8325551ca5e0b1acaa408b11154d125914da353f7d0e4e324eba2d08cf7cc10771de4bbf5105c144ad9fa466722b87b21e160735ed01c95a0830a49f1fdc4398d8377627dcc6120928f528a35210d235e784acbe5eb497ccc05790e629c4647041c82c1830886fb6f17a1fd6e199f82251825e831cf5d3c79818a3b068f8cdbc9647cb8936d85c8769724e189128c56a22c4a2324c83e60e3b7b15a8db7b48d8bea6780b27892e0a2f3edc8581b38b56cc14025320661a65e106cf9638e7889c1b0726225069999fd056bc57bf7157395e50ff0125805d9b245d649358a799f49f11d1dbc5a83220061302d7b8fb18edcb5eb1fd0c219d5eb003a41f7ca26d26cdf019b6d77e00d416edcbc0a26fc034ce8bf04d01e11a11ff6861fd19caa490f8a174038f82892f13a282c99e9c6d11799b798285bd8ae861b7ae5271bd18a965d59797818ef3fb55dfc6a811f400a330574adf5b3977e1e071d11532711b17b522d83c0ef8c22278b9a166f1ac8faaacf268a3aa89a3b49593f8293e59a24b0f742c1e19d6cd1c18f2abd733a50a1ae78afa916a5e28634165e6a947f3755cca01a3891b9c6c72d06b17d1e41a7e23642c911570d6cdd8b27aa6a54d1e64a9a7a30b8962992ba6bf78bfd0e2555585127e79190dd3574cb1b6f2434f54fd36cfd136c6c2d683112e41d0a21461ccc05516f0cc074a0dbe222e59150350c442458de5e9b63832d10bde8842c5e7b65b60d4ea8ddf2add36a95f29a4600a3f42d048d3776fb580b95b60943b11e1f59be28f84c3e9460145ce1279eeab8a6ac3201ce44a23c30d641fe59c7f8c90e1071fb0284a2587daef863942cb4a47ce4ca94d0a6b88d5dfff318a5224cbc5965a2a7c50e1a95fb853a1490c04514731042bb3554be70baf40bf893d5cce14495d25bb1a8628b21a195ced04034749078e6841812841be5744b21cac97b375c685a238b06e59663ee9e92e334df318de77e09a7020e8a56e408e96eb72c8d646dd3a0947f295127fb361a4f2915b3ff4f6729f7e6cbb2071a8aa4b368ac8e47465f801a5d9a70d6e130469d0d68be9559f57f193315c9d8d4cdf4d4e6e3eb9a9401751dfa84234bb3f5cdd011e24d94dd102ba9cc57eb51445a460f7d4365abc563c39745e29844262d2c6d857baab41f199b377e3cb2f6b392710064de8d8f6af2445ac462d145409629fed4e50f0c7857e657300571353377d8f2da19e9ced55c56976cf276b84903d371c3fece3b18839caa06daa270b13aaa558360e3f4339988636a03fe104c8ce186d39dabb8cc00217fdc8faa9244f3602a69f907fe9c0fa5a38a23723141a547dd1578ba0f3866bd2e49532c5bce6c51270aa695d7783ea0e6f57b890f8ee03c42f813111c9948c22c4ab8306b11b3263aecc9ea0d8f28e27829843befe8a013c7756c4bd638e50f8c6c0e0043c43bcf275ddb0f5c2ad4821590e3ffee35d480bcd487f0d9ca8ae9299217a9adb8cdea7258e2d2cd669f70863ede10b5a1372d2ecac0472b272e5ed2dc6750787a667f285631616bd0f98716d6e6133cb24c17e204b8467f3bcc6306c62aae0a0c052136c556cc576881fbb090b13509e5da47a6feb038a59fdade7b5b5824634ae1f7ae6c8bb92a32f0eee796acab40b0c577628e344949fc9291c6703e9132c3f654805dfd82efd1c56e9bf2c514a17a3788e40fc686c04900851288779ce592c975ea14de401b985bf7ffe0afc35fd3991784610287045e4f0332c4be04476a32cf00d5521190ce757b7111e59fcb83bf99caff67a567f34e6a4c23f5ac36bf1da6ad7db596dbf16ff2b6079b03b93255c6a5dabb3fd4eb23539000ef0acd5a8b1ca15418453066c2cf821c111c2f28aa1d5895f8f139d57f692ecd2e2b130a5d9bea6171022a5fa5b4cb0affefe7b43d5fbc0e123fc6673d9930fd01c3fb62cc8f17d29c30d69b68b6aa6b5f4dbed458b9875c7b8d5440f4cbf7700d23e65e00f075a0aee1eba7510ad7a13d7825f06c0c27634ddc12e30cac76032c9d498af48098a597689e78499f4d8fb0aff16d1fb686a4dc0c8c7df0c52d0a77800460beabb03ff610cd3d90cd84fe4bd87babc028097416483d1cec1af16fb9bda4a2c97232e68c39abee318655422f44000e5a73c2f2fdb7009f8fbebb624ddff3a6f666f64dccbde8e8c54ecc947bd969a526cc4f896b9fbf9fd6469256d3107baa4410e9ded4681828412b75aae2cd628c14104fb571235f321e86463037ec14675c7aa2d766d8fbcdde75a3d7554125ed02ecac694359814a06445f6f67334637d5e889eebea189bb7e3c10cae99c75bf6b6903c6f050a8490a951b1464a94f238745fc5ee263a052497fd318caf9f8ae73b2e5d55652d7b0ecd30177f3fdd5498eee5b80efa5cf5db94eef7db3e606f306cc5edb57071ebc53032a723a7c5b3052ba4a07aa56446b8c6caad1a362781e5195f30a2da9426b744611f26a5c06e21d5fa243ad6887e72821901ea132598100480c5208612541e8f20cd4d63d716bad5cea711e6f4caa95db4f02351244f6267befbda59452ca9464000779072e085f33245e4665f6583d7e167b242274d230f99b7fe44636527a04a3f6eb2f18c5479e29a594c628297ddb974657567123398ab4733fd23afca9f797893dc7a1deb191bf4561ff9bd34fc96c14f51aa5292ce38fcab81d981667ae34577777773f9229f7f37a177bd59da19c4f95ab9070de9dbc7e436cc546fedc5b24ad636e43b6af3b668b8d3057bd6d2449ea633fed4feeb723ec29c771f8db668ee2d74990b48ece1e93dc0e8c7a7577f74a7123699fe9aa0b618fa7b8c4df54383aded569d330ccadc4ce6a35df9a5fe999a8c52cd31c4bee1edd90d59095771e1291483d4b8c31c6afbed4da4c752c99ba7717977ad535b6d6e3371abf126bf091772b542ac6e856bac6b1e4da5566c67e560d5ec59ad762376b156bb05fd1344dd330ec57dc4a7ca7b9dccfdcea8e63f31b5e45211c8c61187b54d84361e969ab6cff73654dc3df104dd3fc0a8e95a6619ae6575c2ebfb2cada7f435655ab5d0f98a5c3b2f815bf8225b75f61a2f19926349507c9afbfbd56af9735f8056ada36e7947fe4b96786b9532af10b111b65f3fba775f84b49ff74c218868f3c531c7fdae676440cbf2f8d18894874c5efc83d66aed6d1eff8eb7e66d8c8eb17f1e7d91f28cf0e577fec3f0cffb4cffc9ef8067bfb32ba5a47fc897305cadfe9edd38ce3513f62eca77decffb48ef8f284abe4d1357edd61359fd4fdc6f8442e9fbbda67d73e51ec0bf3945f377a616e2e6ef5e9f6f165def00d7dfb526a3ff5b1b776ce4c2fa499c6187fe29ff691485c7360ea37f55bc95a0773b44f953dfbede16b11c3b0788d3a8b6131a6be5a5b511dbf6b198b3fcfddcb40c766fdf8ddcf7f0ff232242295d67e65f1b5ee2c6b2c35a232fb5ff7b5cadab6fed7e1a1ea38baa210b45de37963c537dd674f53f0d1fff5bb4a4d3d75af35db66fd9914566d15a75eab75067f2e554a8b5d9c7376189d145561a609b234f8bb29bdb66f42c6f0fceeb1770de56fc8967dc39af927b16fce47d73f1fc337f67b8921db96bb3f7ddb7f3267fd461dd6efeaf03764cbd89fb8adb387b552194f2df54b7b7982dff21b4f9bd5300cc38cb81a0cd33416565343a33de7abaf594526cec2df9163df34d29efb298126ae1489c884ae1995f247ffc88db02f92a7f6c93cdfd53afc676c82d11cf94feba8da7f3132c9f4b9d770fb17b1945262b11b7b22bf10c214fa1dcffb61f803ca8d6fb8af4fe7fc39e737c6e6c77afa5f6482f54ffbd4550a35310e0b279337d246b256d8a7a64ded4eedce894d577c4abfe6664f73eb1345ef9f52c69fe48cdfa495f2312967482943ca0edb2ca6699ab661a3f99ce6db4feba09fbf233abf62afd5c72690a6691afeb49ff6c11e2863f8464a29b1a727edbfa3f901491eda1b7138d3b8979ce4240794a9fc9fd6a1619f7ded49e7c4aeccb6e29ff6a153b2bca60652f29659ef59c26412327cd96025db7024b7327cd5c0945f3634c95ade3e4219ffb580864cf0a0ec67f4c5deefd73c8c42349ce34f66ffedfb7e5e6e8a44a488258a6da47d91ecbdda7ea376b551a3d3b3de3d6ba726eed87ef4bfa31aa771b7d8e8f4da7b6f401e0483ba983f8a3fe9158948914cbfb1f71743cefe4928f9ab7fe446db17c97e726afd3fe9247f5ffbaa7e8d3fd924d73ff24cbbbf718d33ce384f7d3ac1cd2f0df41434fa8dfd5afb44aad7348a3f1ffed49f7e53a1df1ba5f6c4f1603dc546f4b7e758330f63ea6144d1af6fbdfd6d64e08de3e16fd43fb6ec1f64e2600fdbb0b0d3b75996ac9d2eccf474baf474e906dbe7eb2ab91ffb3ae3e595f17debaf6ef644d131dc54fee763a2d8339fc62aa6f0e779deec3aab59ecedb66d9b868de89fb6255a477da28c653ed51336a25fff86bfcef404b76dfbe67c9cec532bd9e21bec37a1d56a69c97efded4a99cdbcfd7734f3e9b9ec675c187bb49771358ec7f64627bce5ed83c4cf9ef0c7e1afade4fa1bfe288094ed6b9f652fb91d59439a310b64fa5d2053fa446e3b43ce87962dee25daa7d2b9f21509b4008c91e1c7315ee4e67eacd015c9cff2d71628b2b167276b5def2047ee87cd10c7fc7586f802ad0c9fc6184eb2d675d628c703cb36866c610ee77cd86cdb87f331f357645298a37204f06e0204a8193e013c436c6dd775b5eb30da755d8761276e6e9826a36718d61d8661180cc17191468a1e33a0000d46a1291350408f29ba3e6c6e3fc0ece69c73ce39e79c73ce39e7e41ee0f94719b0642ff21c71d0fab5970c49badb9d07f87d3bab5630c74b06256f95e14b062a596ea07900b764986508b66deff7c676f3dfd2c5ddddbd33841042482b95124208a194104229a1dc0e3326cb0a67a5f25430af7eca155768d102c51858a690ea5e6bad4116bb7b0cc257992b7c22278af56ef421fe62e0aecc436e47f7dc853f3c4cf191e70ed53de47ec8a030f4a3d5f6abd5563f5eed4f2d6881275f7bff5aab6723d66bd86b9d3d72eeb73f6ddb693b757fea3abb6d30049db8d36f0f33ca23e2053590e8e14bff50454e94a8334664528309d7921320d9828b152e5098e0e982841aa80089162801218a23567a851facb0019620d840c494a211e49c9cd33926804109131e9eecc007537060099d1a1e0b93314cc002315e5188a00bcf0d1a50f2620c125ca8eca08a2b4b4f39a7d4c19319be74a022cb15c86f21be20811658fc90832c3cc810bc7450c14b0729aa78e900e5b5648a9a246566814353122df91b322da5d6bd4876a9a3c9f4f911c3f6a12f7530c9f2752cf196fca9a38758db9768a2947ef631adc2b1f815187ca114d2b6d65aa45c1d22e5798f6296b891dcbeed41b0068dc13728c8b7cf4322e5491f29c723f7278a126976c3d83e615601861a9978ab5698a9639bc42658f892b81fd7ac7dde2fbd3fede327bcb74c8870cb23e59f2782a72c92e9a9079e3fedae4ac44dd5c955ec71adb1caf3e2e64ddc6f979b8db7ec8403cf0a698a1ccc7d613e6de119d59f9b100fd23efe101782b2ce7ec37da48f6c190a12b7c082c6420b413c8876905353bf261b7f48a71c7c43790bafb3094427f430800af9ebfcfdb44fe3f9af1a9cc4a1570d4c727c135ca88b5e338409c22f1ac4e4581421f7d33e53c3b07de48f995f8863c6ac3018d9503c7175d225db0f1ad420918edad3db2ff34ff887b59652fb270b6d5b4a2d957336124ae7d339c5c82e621807d399e2a63c717f393d4629fefa0b973df4e2c7d473ef71dccb5c087b381a3deee56778c896b30d66b27e9761232c7b78faf9dd77484e9f7d7de750c8aae30fe984394ca966294e9edfcaf3ed1055b64f9fbe106d0454d9883ef65aac29998f147f2a9928de13b9e410907a54eacadccd7b6895b95eecf16af6f5d2fba9f296b3ecbfeffd3ec71d1e8eb7da3f22e1dc330111faf44429c5308a6133eb362da354db3a6f6a928d8099f552d9441425b7e3f4d93dd55ab12a9bbc49ae14c3a8dd60a0996218a2d050863f8be1cfd37267d9ed332dde705bcf3eea7a97e66a2c44219aa7387a280c21456108a98771473ac3906262171ea6f3c46032c5def479139e94e651ef32ff59d4b7a2497d2734f3f5e7d35c087b2656dd1494c127fcad34fc1d4d975eb1d156dd31a54f31e750a898b64f863f248cb60fc54d79d2c63616a0f5f2915e0c3581f6e8a2942a712ec3826e26204c4098803001e9907a76cbedebf60332f5927a670b1548dd6e07a456a6ae2d000952bb819c309006d23ef2a3a0fe74a3a0befebc183632a5e21abe483a09b5b6d0450b615a00d342530b5f5a08e2adf9364cf93bbdc41f64aaf4a3bf3d84ae2ce3e5b2dfeee7c2478e8f9cbecc111b6518fbed3ffbdb091f0101d23a2036da1efb06d23e46946220ed03a46a1976eda4d7cb304bbdabf21e26204c40988030016102b23949a57a95ba1f526ab21e359f857fa0ae45bdeba77530f120d4dbd5b3ee0a85423149e1af334a5a1b99a0ae4dcd0f6a81afcf841c04680651d178ffd33a6676ce87f65188a866f5daa9c933b23fdd8517e241918903861c79d007995dfdfeed768658462f478582608cc24b1e0ea2058942d27be8c72d530a993c6fdda9bd95f7f4776c79715e5ce7fd9032a5f3ca58d39c15515eefe6dcb64d9e9e033a9dbe701cf7a5fbd3ed388e03da38206edbba5a6b965a5fb52ed58a6bc5b56220ee3fa05c3fee2bfe80da7efd533d7d6d7ce416b32f73b7e38fc3d8868db8effe90386c646dd72ab3df7c685a5b0c7ba2a86518ad150371ad29791027ef6c8e8bcdede0baa7df75f84798a530995e3aff872876d7fba161a60f2d47adce97f285ce1c016cffbc19b69d36b1645686af244a598bdbe422b7442d9e254b3ce7f6f4a5f712cf8a7d57ebc38fdc47a88d00848f1bae3c8ceacb6cb111fcec67d3c3dd7f8ebb3cffa77570d8c83e86023673e47ecc2c9b7e76b1f9dcadf32b82edcfec5accc21c4d04d39ff6911f12443af55625035c72eb90e10bc952d63af9410e7fb2b94f719f4a719f5232fae8733495e22a873d576d0acb6866ddb8e7bc4f755daaeb524f14535ceabd6b747a983b85fa542af51e875f8828ef4fa74fcda0fe53711f509e3592b592a9a95dea6b244bae640df73292864e4cc6d699cefbd37faa94f7ddf7cba03cee7f5a47f6d33e1c96d88dbfc5744a9ab64b922cc936327c65e04bd63a69f4d5975f6456cffb39b7cdabf69339f529f4cf4ffb649f456fdbbc6df39e287a99f7dc35d2bcd3b6bde771de73d91f79e6f00b316f5fe4bd27f23ffd87face546d6754de3bcd8c2afb2ed5b50c3ef28cc29db98ec3dbc7d7ee4ffb6498c55f469ae9aa820863c42afda211cc5f1340d61abbc6aeb16becf8f21ad5ac5db1896c89d11b9af24f86af1baa20a1822151ba410c86cd797af73ffd773425c743fe5cb16e1e487563c34aad6864666a6aada94f33533f255365bea65e9592a9155567ce380d7f4874e5d138f6048caff5fd1a7bde6cdb77b50e8b8d5e2032e1277386f1912a79840c5f47926e8072248cac45cefe11309927c3d79157d67ca3dc0efbcd6d2a6fc167d5d7fee31efb8f423698a8067f2bfb10a21e4215cd136115fee02bdb973101f5f6372cf3a90bbd2583c2d83d3f9a1ddeec0840f02a3e9ab9fe77c21f1087a5e4787c48461277cc30f6f3d33a2c366a14b42cf14ffbc419af5b50cee4cb63ef51a11978b9efcb456bed91ccda18630c42dec3af977c3a389f2ac3cdf1043a7f9fbba6cd31e0f41b2e72a3802edabe8b367c642b3afd11596464fb1a6c514311ea73b78b9c5b41169d700d337445db7b517d9a3db6610845a88f512dfb274ae0447bf643432e57abf5bf5a795ec49e561f70295b2db3747ee6b506d9960f6a39c185a02de28207a62894bcd8e083ccd2001aa658e185164862f08494e23505c90cb412db25bc6f2ee17d43b209e6c8b2099630233b0d39bec3123c675bc4d090d812800ee688734e2957eeb2cb38d83a5802cc49e0906394388abf023a7f229f5434eb416f2d6c3fd2ed13f67014f0bae117788567d004ee214e0eac76c39f0d82cdb0fb5076b82484055e8f9a254b8e04e458390ae408ade699119b2557bb0c3cda6889d20372f6605256135a5938542b028bad94c0321b27320d0c6dab62e3585870271a4e5d944e05d701885cb0f288babd91585f781f5c9a4b3c141528192864562916d3504ab5faa29a79cdd00c4153b3d252b332c18a8504cb8675c5e666c5831b1c96161c195cc898c10263068d550868407fd60c7fa5b8988504d758395123c7064b8e4e0c74765836ecf03ce169ad9a68f5b0c4f4d888c2c60d1fdcc061b305c764fa61c41161aea8d2c55aab9484abe342479616de40072327194070c972b59a93e6490f4a76b8410d9860a268ca28f29c73ce3981b08293ad14ca82a423983cdf44a90f8ba8c7861416d1b734e8287fde1bffce2e9ff03ee20f2eb9b82091345f1be2ad39391e78d1d69cc42ca8e077050ec0007be6fb0083a4123c207922cf31794af15627d14d2e0085fa482f9921cfbf4678f35bd36e03b2fcf7ff6cde1cb3f4e51d72e97ce9d7a50f1a33843141a61f25fd48df050fa2df75851ede223a610b2f4814d2f04d3f2cb22fa578f3edf562cf9caf8391ec78be144fe5034f852884f5f020d7508c51de6c01424a94ae216f4d1f4f038ce7d2fcb6bc35dd4917799eb228bd3af0254fa62a56b2915e020203530bf3ca0107f96b2d7976077d2fc483280e4a79be033c489e20cf9902c541293b6ed100e36d5478503e529194a5f914f3e26dc9d8d76b5f830d6194b008bbaea16f95935dde9ab8157be8ab80be90268f85165ca86a39a8df3b90832a45d293d21c0eefa12d6fb95ade124243e96b318972e48bea277101540f5a220496006951cd145e37a1b084a04c63d18a8a144abff0e203798b3e91e3d8e1f216fd19607813904de9e370a14ed2caf4e1116fd12cbc0f3609a11fa9470503437bbdace41d97bb90d0c111de96e1eb09163e3cf1b283032fcbf0f56405b88b47337c3dc9f264c9c9164dc218dd31ebeef64a59e98cd29d4ee931c6487dba74f7e8eede399dd2638c91fa74e93b3c42f749fdd40126295dce39699cf261162f74d60f6e01c08542de2a1259fbb2dab6139b449d85992d69f068bf958d934208697cef1b8a31ca9edd6dc05af8f32184d0f34d031265c4d3daa39c544e38e18493db312bb49b967d724a4a2d921925a5945229069594d229a9189487298bf80146fdce497998b4881f7c404649219c1fe45bae4c85c41e1f8225447109696a9292723bb4a7580c92dcc3a5ff5239d31ce07177157bdcbb2ef4884247ee80d601813692fd317f2398c3bfc22f93ce6921e6b2c3aca098ec2dd8244408cce17f875c17221642399bd549616760bc86dd60a49adc40c687293606009102252eace032050af9ca5f3711227f0d25b7942f2aad3f90b5971e440254c1cb872e25a85ad0440c0cb394bd345132bb1e2c75892f884aa86c4088d70692569d9414266b5db9a0f261531b9fc8e5f7941e45f710467e3fc9f25f7e4b7251d224cb9aa594527641340f51e4f9b3872636c4f03ecf05c4827f69608c2c5f90e58b891559f250c46a098b75b94bcb9476cc92dae5062946139dc10d51da3098620fd40289152e9214608c2662242980184b564e5caf1fbc70bdaad349e9dcb9828398fc793c5194c820032548787c7829c141a7094fcbf0a584098f16de29c39712204ef821cb8b0361a4327ce95025cb0c5f1c108381ce7e98a5fcc1304b19cbd0957df6028fce3f2ad019b68cf034e949fb9e07c9cf82704b7e9665d9db771179f56dfddabd3d8c42f1a390ff268307d35a8b61f8a607ccd8f38019c3fd1bfeec57a091727d5b6d8533053d05143a01f618210596e0d9eb7f22e4af95600922f4155864e7f282eced44f666227b83208bc98e7dad37061a438d160f668b894c59c13e7dfa935d805ff20b714c1879882acf8fc09c384a0c9ec545f6e9fb8f10867d0f7e29fa17f6747e5683a73df6da018b0a46340c0f606f56a88f7dbd8978058b6f26c537b3be02e8dbf9b4be7d5bf1cdc42ad8aff8874c5c819e4ab1470a145e37f196ff6c5909d34afe327af03e2f4b0f1a4cb6a8a0c91bdf050f3af2a0afa544dc4a3798f0887c4bfda20db15042afa0b4db2cb15ee6459b2bb30b2a250acd6fc51ed6473624873c958d1243de7ffc9637e429c950a5c95aa25979f6f07cfc500a9e0ec11c4ade8a50bc356688baa852ffa6414ac5033b2441bf5862e262b000777fffee202a4f95921d6d46008294726a52ca183f4609216c6c219d4574774f8f518c172c947c195da600b6518e727a8c16e572b99ab22896e16bf489cb5d9489103b503c2cc3d70e3ee8fce0c50c5f3bf4c0138537337ceda083159e67f8da2187fcbdc7e4b5c30cdb172f1d6a90b72aa20d746090058a2e3a5064a0cb10456ce10549d31355602a7212489ec04009a490820be9440e13294e40c50c5a341581e588a51a493f98a0a0091d40414313529860a786e6d265270b2da4ccf0626afa0114412841154ce078811740e48004104b32d044971a4d74c9d9014745d3182c3660c30e58482c3b4c475879420413592cd1822f240974c04030a80073240460b060ea81bcb243a50b0f0c62120134e5e313424aa652299aba94a62ecd91639b5393524afa92be94db4ba94929e7a6650b976ab14ca34b9a49132716cb345a37ed76ce305be9fc21c729c7898b932dd95d7f13020f3e95b8c16b45cae9df1768e8eb2c728c22fb7fad85eb3f3bc27f9e08ff0dfd402d900bf402af804cf00b6c82606018d8051403c3e8a436d2473a492f6926dda49db4524349a2a97495b6b294a5b5f496e6d25efa8a66ea2f40ffad48f8ef83fe6b0909fde78af87bf99acf1df2960c16783effb978f80cc52f06d77f459446f8af881411fe2bb2e5e7bf225ebe224c397e912f391669faaf08981c8b84c9f18b7491632c12868d886404e9488e484972fc9096e488c42447a426acff909cd8fc87a4942312941c3f242932fe434a62c67f48547afe43aad2fa0fc90acf7f485876fe23ca27e0f8af87ce7f06b8f19f0adf0a39b290630b3906c9d101ff9f90fbdf10fc9f0b39ff1de508438eff110122814a8e4142df72368510c21dd24dd9070fddf8804c500440def2176249092e194c77741440490a8194c8a5d039460fe13d2e292141856ef2464a1556f0421304951708b618994a20d841def20408f96b231f941d391faec9adef962b9782969467baef9b65c8a560e3fb87671b4fe4944b8187c7661a6feb43b8f5fbd69cfabed453dc770a21c80cb9147a478f1819d3c0169a0ca3e8410ace6a95fd4f681d44ed0397fc73a0d04999f55cde92f2cccfab65c8a1109724e5eee7cdb28d9f17cb904b81e7ebcf145a35430e055f4a4aa2197228c0a5a4a4ccfd44a197929264cc3c4fe4ad27f21ed7b5d743c9d8b8d05b23dc99ebad9a1b7f9594e3b36c6e706430e97192e3b778a0e4f83b52727c1c49e4f83774aae4f8d852fc8d86961cff6ffccb25c7c7177a4b840b63cfcfad71e3e7dc2b802e0937e80a7d459ae42ffe10a2d6e1533e90dddf7555883dfe235c16628fbf08fe3fb78fc41eee3693db4d5ae93614d46d29b793e8d455f9cfdcc64273bbe6f6abb368d972739b0bce6d2f7d85b7fc67dc66bafde57613cfceed30b7c578cb5fc7ffc6f52437e247ae27f1254caedfeb4eae2b5d87e22d29def2af713d0998c31fe806893dfe41d785d8e34fc285b147e8dab89e7b6ee7d6edcc733bef5ca87361ceb99e6b5c98f185f9661a17e61917661917669c0bf34d665d985730d3c0ac825906664fe8c2a2a00b8b48b8b008e8c2a2112e2cda3a4bce2efc92b14bf3cff5a5a4a422112e44c1120d962415b92e2cb2d8331686f7f9732abe1423ade27d9fbd39d7cf1bc5f52e0f722117f62adee3ef8a42b6c8a978cb1fbbc27b2ad93fc8842304bf3ee0e81b6e23f6c8d6e4a13b55c7e6603532acc518ad07c1d8cfd1f0209cd1c9f07050373629966a355343435333b352b152363237289c4ec6c9fa402346ebc36fafdd0c63356c4ed5a13b9347b6628fdb807d03c20c6be45042f3f6e8b227ad33d3360e7542751e4a66eb946a86a666c5b2b9d9e69c346850f917d7c8d1d9e169f54c1c38bc36b50c8d23de88d2862422259c3d73ea5079aaddb1980e96e5645a0d6dc31b77b9d34b22f2d4d1f05cf03a6fc69c9e0b9e87928192c19149ddcca9c30c6b866645535353b3a259b16658362a9b9bd40d8e0c8e0c948c19de0c1a5decd21dbbe00dd7d06ae464393a98ce8edde1a93c2ddaea993d36a48d1bf1060e9744248e1cdddd396e96d0a84be9796249a471c41b51da98179012ce1e9fb4452b4fb53b16d3c1b29c4caba16d78e32e77dae605e4a9a3819280d779335012f03c940c940c8e4cea260555369eff6aa59a61cdd0ac686a6a6a56342bd60ccb46657393bac191c191819231c39b41a3a3f12795f797db5c70f1866b683572b21c1d4c67c7eef0549e166df5cc1e1bd2c68d780387e38039268e1c38729c6862a0cdd8c0830fab27874090b492dd44963d48c992264b29a59c39f2b779a1b2e50362bc560b3c2011822b43f85025494ea1c48993b7fa9c98555bfe703e1c03c81fd014a62c954c1993e5afba64f92f5f1ec0e2034c642987320d07a678e0c75671d1a52940e480802ba838513d0e56bdd2b9a284a525839793e14bc9cb0d4a61d42008254b411481c1f076327c0501c513416c9183821d7868f06e862f21ae2c11220633783c19be86986167cb10472831c4143118e2064ebc9a0c5f509294a06c0067e1b5327c41a1522308285e746c80e28356132272d0001149ec78e1d964f822e2045d1041831c1a1001c616de8c1c6a60c0534da9a1030fe5840e115e4f86af22a8d8c9c1cb91e1ab083076c6f064a404e1c95cc13df06eb47089a2c54e0abc1919bea28ce151f2643c31e2e15cd1c922a50a9d2c3c55862f296072c0f0689272e07919be8ce88187031e2ac3971145ec78f15819be8c1801cf0f3c9c0c5f466cd1e1814723c397116054ab9f0c5f4738c1aea8c98190dcdddd2d642b849ebb15d0bddb8a0e051efcd5a6c48338b963c4f16e194018218410c2ee399d5a295b6e3188992f3cf8fe3047bb1b4529ad9df9c8abb036a86594f2ca0c2194d2b16e2fe295468e5994c78248b13d8aae638430b69451e29b037891631919906291764fe2af84101231e1c19736c6e8b7238c8ee445da3d498325c06f28b1853d78fdfe10df440c33cd443e4626296b1dcd101d678c32495226c989a82293783edfdd6712cc11a3cb0886166384314a196574022e45b7abff2c5b520e4139806fd572ed800f9f5ef1b5a496182184391287945256d9524a5831bcd69382524a298594522a31cc33c72e7abe95524a98adcc73cef992c865f4c05c01c793ce4f71c81968d083bef8f0e984d67a7477d742caf71e793eec98f064a5154f40e689870c39d19c7c971f8544212fca11e2020cb193fa480ca007a8a46c19ea6aead094000000411000c3150000280c0a068422b1581aa6a12ec9071480117b9642705a94c9634994832008620c218000020c20040005000435443a41001cfac4479965fda83821f47df75a5473f64e807bb27449d138657a8de29f40df6acc60f28375151874ecb91070c9e995ab18f5dbffaa64a2e2e0270c501a0ac270c90dbf5ef7823ab75e62e9380180a59b95820847d350107fa91912eedd5889c004d16f36c79953b9dfd0b2848861423d6e4d18e51ec1e9f0b7de91e7c403587492f8056b4f905b5f1bc6be909e50d3c237849eb0bcd217df3678afe9046fef86ef57d818b0ac296ba36ff20d128b1fcbbb9da902845a78e494e361566666827a8848644637b6665b6f9289b018ba9b3c46db7d7b92bf629e9fac54523ed21f3135b862521bc42587ebbadabd47d9a3928f81ddc9dde3cc2c0847ea1b5edf4ca79b126c631b1bc4052da2c50f396a4a1714ae744710a2f99867728d990dcbf03a32f63006edc49c35cc8360fd295ecdcb4bf1214722e96d8641773d19e1f1ee6ed31427f07103e4df87dd8ce79474157d814c767bd751a1f740a7e2e290665647477703e5693fc7c740fd09962211256b413a540717297f6b82a4a132019ac5d7c63d04d14c3275439dc9874bd31aa048f9c5f8819b1a65ac98029a199f5bfbc5c7ce546d3fcfeac6544fb0d6069829d2c492768dac0e530197e7d2e474e03226d643319982f5a5ce0fefb9762c642578003a3c070ae782a50bbce99eb842d31d97a5ffe337b81e6081d40f493556b5bf61ffe1e91738256f73375eb342d03413686d45cd8db7f3342ea8424ea38db7fadcd74f10366969913cfa64c623705201c865955e87921498be18990531b01b88113f908ccb431465191647c892e4014a6156c7e66e7e349fb2554dce167e9bacd4da56d0dd1d8bfe1b00059a2d5e95bfb1e381969fce06f97e2aacdd5ac1aff55c54b4b0cee691fe0269acd4efd2dde1d29ecf7651cf3619a91eae1d3e75797cdf5c5d100218b2e9de4f66431edf2ce39fb7ceac4642e1579bc307b7e010e4cd292843994356f984905d3e26820f9b02658dd946214ad07adc125faaff4751391a2c5825315608f52853d6451e45a3972f5e3484d7a3733cc7a1d1e06c8cc4ca2cb5dbc796f04651d681bf441e14f7c7288cde98de198f3fb6da671b551bc8fdc5eb9557cddca7e8dd7561629babebac1f6a05e1d133a53d63a142559055b51e5dc8b800f5a2d819c389e7d0ceb05ec037b9e4ad1ed52841a46c1f97bbaf59506dec7d9e07b20d0bba004818df07bd33043e8deeffd59c9e3dd95718670cefcaa37a4061c24c7350ede102911bac709c335c687c37a2318a511c75d90f89958217095d49580707302e84d14f6c9a386373bc3023d1b3df5dd2c3aa4f09c17bf4b004caa8538d490bb772f3fe4924f110d0070444834a98a126d05a2d956b426ecbe067d818187bd22ab5f7f62623d7e09fc56fbfba2bb2a68ae019a01f7aa76776b2f5550cf5bfc3a10fda7fefb8ed313757eadd08830391e3d2f6787a5e47b7479a385aa2a2dfd5e637b5b68ffa0ded3b9381bfe2dd3e8e500a6c97e8233a5bf5dadeaf0ee0bf8fd2e2c7ae1d9a64f7251edda88a57ebd7b7c0501448e3e3919b5947746948b3cd98b19753169421d28e1aec00c694f7cc88f0491a981321e40ecbff6496d36f2f5e966fcdd63163c8ecb82c9ee44cf42df76b0df21e3bf436ce55e3073caaafc57066c42d511341bd27af55bd1eb28a6ca86d54ffdc7aded36584fc99a062ec12997b4923fee9954a13a62f07dcb5e9b4ad4aae6111e272bc8a64113d473bbed96ed1c35332a55ee33efc0e7b42ec5b80e656f52015b43ae6b607b7967dc5b08979722f882befcf1e586aba9468f1f489aff5a1e5cdbdcd46b8ac712ccefbf03b75b15c32c74fd687f29011bf9dfa24f9e4d2843d9fa0dbbb885a6f547ca794f7cb8848221b0bcdeb3201f36734cb83f0f98da74076926220154a3f05b850fcfade9b9fbd48acefc34fea05284560678e53ecdfdfbdfcc1c1d8e089f41f6339658c9fae8fa525337c5b372a5766f899faa05c19e36feba3d2c88cdfaa1bad54b891ec48b18d7ba7abe877a41098ec43a0cfcab2a21dd4d8562ceb18ee925957e5ed739b38f5a11c32c76fd687f29019bf5d3f964b66f86e7d54aecce137f5417965c6df7a9d0b4785e0a60556551432dd515e540eccb080914054b7ed54021b4d7d8f76f07b4e5dafc6e093f147ef5e48d069ce9bbe5880a09b599f91811571c118e8f14207e609433be2869fde163e5626d54eba461568a16c5a3b032db9e9f06a3a17d4fa560dd5c1cf0d8fce8fe43c1f8c697ff183e1706c8486cf821e9e9d07aa433e6fc9dd4227b2ee1554d75175ada24a3778a46d9a67fb04fc7f76c39426ec3d0ad7d68fb3f9adebbf7d2f89e6ed63b47ad57ccd72ec378eebc058507284a4388817f6bec5b8e92c0dcf772c12f768776c282f1928dce8954ccd5f4060fbd199f0577ab0cfad3bff4a9affa42cfc2a1ed87fd7762bc469f07dcbe4b2a350c4b9d2fdb878a0d31fc04232314378df7262e7a387c2a7e326ecec3e60512a853aa7e160fba5b2f0a77a61df513bff5536ffc84cf82b3dd8e7d69d7f25cd7f52167e150f60afbfc753112dd17a06422f4c025a5c1fdd94c4f5c0df533bbf4532ffc959f8537cd8ef569d5f21cfff6426fc541fec3f2be7a7ca73de605d6a54e49be9fb53011dc01b630874fd485be61af832f02670951cfddb0bea6ae6c5f525fa22aeb30b16f31f4f7aa6fd6e02844b0518381f28630ba35f40ad001d4bea8521e0ddec18ecc42b0063c74c1ddc249943b1f877aad57bc9cc908fa018500cd6584ce0622fef39211ede8673609e8df0f436a515f59890816cfdb97800a11c53f9d4782974c2b11850990fa16bb188b4108de297057a612079e906ab8a50ca0df806c4994d5ff90a63f013d8d3b06c9ecfc603c473608876f1020ec8bf428946255909a72132fa2197e9db85f29e11650718cb23851ead878447180a23859f2d0f8427188b03059e6d0f850ec270483965ed9c46b057c23ada2ce8221693dc0c3462e6e4c92c37f856ca2fca7d8e82b7c943e101067598c257c343d111866580c277d343c21146759052f03dc30cb82249663f27069c216095c79c4a1d9192086174b83924bf4ada8189030f1bfee87fcbef5e35a897f053be60ebe7a0d149ddadb9bc220310e5fe3f3b3940923205ba9aa75708b9dbb1ebd2465853229533df43277c74e9feaa11d0f1a1c45ee0fb90607bd26c6519b1c41afce54a2c1ad1e0c65c85c26e700be00e8c709796264a26b3b499d2ba13ef6c85bdec9d563fe64315629c970226ea5d507c2b29ae1afc1fe1db0b6ec264b4cabd5ea581d5ebbc9f7f7a3a5de1887acb847282c1bf52f1febc09590ae4f4d49a973c5dbd0b28811b6c8c98e8dddde0c6972f64e284396ab3e2644f1ba7ef61dfc3a568164e847e3271b11d02016a507c9173b624b00dedc02ed58b3c717db0b289918edc1067344d21ca6eb25317106281d9e33590c1f558748a1b944156b67cc287d15d5b7328a3673fe9c0492dd968e876d3607548b997f01d82e5b46fbab57d200f4cc741d40cfcc46d7a38eeac5ff53b29dbe9d7358905ada132bf53af9733bf4d8cc422e5874b95c07ca2578a3ed75bf5f64fc3d78407bc7aee51c79aac7ebc21632047fa128ce9fa99029240733852a1fd29da897ccdf209c68ca0d384fd035a4c5849b0c1bf10f1a23888bbb4e0be37c06bc1b3ef974ac90e59aaf041c06526ef8ed32914bc58e58914b23ac988de533cac7b94118eb3fbe35ee8c1e423b14f6265c218a7563bc2ad826a1f142e0b4dfa0d9d6aa3a7040c9d1d88fca423a7340215138d4ef735555aca7a767dbc50d219b53484c660ed142b846e1557238650cc8c8f70c99be400124b096900178ad83a55e50a49834d6e29eaadb5847ccd8aa05eb1155def101a605f1594ff76a86862788ef7ccd631472e5bfe412d2ff3545d7141da1178a1b89f29a98c4104cf14e4c9e3f0a5c32fe3a7d92800dcfb150a52e3881ee3d6c24f5b636c9bae3e78648fa14d92d34b96e2bc75e788be6e3ae15d2788c876c1435b88ee14f6b8ebfb1ec7013a7871cb4747ab3828a4be07b7f2ceb08f830b5d2b13efb13363afad4e8e5446dd9409095c12d1a211a3dc695f768c144e2cca48caa654a27f3672c3fac3d03ff7f46e479bd0a6771d8222e488c3500aca44c401b3240a47a8502dd19ef9d0637626265feaa1a0e6725ab0505d67444eccb1788edbba83a47fc0c4817ced2eaea214778b827a5e03fab68d4626e4019e3beb3f702877d33422b727ad07ab1d09b6c80b7ed6d904f5d8c5d549d389ce813217265a9e2ac86856d4583d031119261776b8653384383efa7a3164b1bd4ff2768b196b5058a990184d11d7b84460f446144c2051c7fad36a360812ddda689d8c430ada6a39195393e52735130c4274c00845ea125c151726eb979096a59d2cfb64a2ba7ea5fe353cce9fbda54763a42695a024a52eaf512dbb9893bb748b24d695938cf60f567dbb08762ce3b749e8816e22ea0aa95d9a1dd903b89b90bddaad911532ed908230977c547d9274fb31d8099c3a40acc36d918d9baf2c0173f4cb278e90b90c33ccfdc14a3d7c84a112e8a3037692158940ba1ecdbdb5e4a9686179cda18291c95c3c140cbcd17e744e2c935a5eb783dd71912bb2b32e785dbafe39b5ec00d4ee33561ce8d2488c1ecc5cde8653fad0cd7780a5299f2b8ea5f122c815313054e68f400f53de11f242f68199d6bab792d588ac4cae6e82dbfab35a606d6f0736bdd3b2af1409306a2336bc29281b69d727572dd6b47649c2ac2c4ffd1907f202a6af01baf1da31ae7f59984211d58e702d7af2f29e8b3a642f8c3483a1e6ad202761cd309d033b2351cf9a73d2db7b725d50c671557533c47c4d2aca71be60252bc7ee29f7f69e8fa3802c5abe7f8bc0169260420c519304020088b9fb0dd0e0892269d06e02b935be85b22606c3cbe457bc3a2f739c1bb90070d3e2e4281b1c3643f835ecf1a3033e61ce0fef7e5187178e748b136e01a67a0a05645ba978e8af4d27548c80b612b3796760a084349778f75146eb990f479df898f6b2cbf2cbce7f5d32c44e509b67d4b2488e3a1da2c61cc58dd56971cbb577cbc0373a9d7ead8729a13e6ea5c7f56a5a66ec8a56cdbac4ee008272cfb004066a61d6726eb4b07c037c24816a050928616bd5cdacb7dd1c9fa1691f9c5db100aab038c65cba86878d3e115a313c8c3b66a58affb0b9fed2d43c8c6b165fb6975d6b2a53dbac35dfac092e9878918a6272fe8f8e5aadf485ed626004250446f7ca7242491b459d43ad0bca8bac12e43b4af90a2ac2ae2dd4ace5dffbf0d7e55d8c277d695f58900fa35681f485a5025d26a9fc68a8d1c820532e72bd4a2fc7414532caa8cc45e132fecbcd1b7e8963bf9902af26662478c0506bcb643bcd5ca592e9cfa9ebe55b3902a9abb6fd0e9862281ebe903613313c8b237efd1d2407299ae4630fda575d20f3ccb9b7fedb22810d55c9001a7b62a346cc64e5ff105a6605794cf75aeeb19048eab7117182be63ea313eb10891ea37e41f1145171c8e67e8138e93f2d825282068e18aa6459b6570f9d4b146d594664568f01af6e184303ffb9060bbc8723faa012f4d39194fc99231a34a06d6b957f18de44ce9bbc074cfb4adad0ad6d848ce4523872e73c76b913397138c75c5c1d5854b5d5d0a7e87c292a4a9eb51b6226f06894c11459707d8c1f039f12f847ef97c6a7230fe59968ce16a586e53f6809d7cc5e59e75b1b268df4c1481dbc18236b77e4e35dcd02236c8d986229e05b413c87062af85d493fa1586e38363e4048e4f3a11caf812d73801041aa7a4dd0ebdd4349c103302c519337c7c645adf48065a917e2194b0a2b8595632340dac1897dc0b56160d5b651ab382b4a0a84d16a50911f720cf8a13e7be97acd3dacbe8945cdb9a158b8ff4bb82f3f6197461894a441eb71d04e12726b850dce3db9200c7129d2ddeff60a915d1f5a962b6ee89f022c1d5e90c8c0dab19b5537f75c1a51dcda6aaa9bb1922e51be31495bcba5dc77c0baeb9e3f929936dcc9cab43c095f5b7996eba3d2e76fc71adab65007052f346d93b64cbf1e485ac4f077bee631138043cdbdde51385262157efe2cbec9dba227a728a4374f9d7c012c47ba9619049cc9c043b26684651bf2c162bf50a4cdef288b4af64dcf675276a4b161d743e4e980d9c92d3ebb3b1318eee460e6b743828c68ba2152adafcf4783b52065da1fb8a8c638b5c0ced3023acb28cd7322ce8a8e896a86188e08f425cf59087e181e652e7b2209471036c0e19a479c82e2420024407da578ae636951501cca63239f34a1bd0c03234cf4366d0d795f23c9a3225cfc3cd919689b97258cecac30bfb4fceedc26a5481cca51711f7c757b3b5398ec2dc34858147cabea8a7d0cc81091cbab1bb01a288b464558e82644aa06d4e03ba291e5214410365c1cb69c90526239fad811451fc90930d8ed45ad3b339593bd59a4406046dc101ef10b794d02c135d64023dbb45562fbc2cff2121be40cac52fda361d4d6a22d685717dfbe18d421855e7b79ca70c1b9c280d990b09f10576d8eaf291acb444b70511d0e0f637da4657766913c7d9db9bb16327d8d6b7bf0978be93c46fa957f6c416e0bdab93b3b1c0baf8d66b0133c974d7be3c9b634b64afe1e5070a30eba88f058e2dcb862b50bc202c73f32f418e9673d0ed41b4305a8e1a3b8067f00365fa9ce77611f6c74513903e6d949bb12e81af8cbbabb3cc8104d68b15dc8b3ac344ac840fd448353db56bf70e81d935a001f6bd7aaf9340775d38153c8fa902be676b0c76b4e3f604d16f96b416ccbc76938f7f6a0ba004b405ee315dbd70b5183fb0a0db4c0cc4cb182c56015dc6dadd67a2e00634ad5670958c2670a1fb4daf29b43a230f28e47e4d5b5fb09af1031776df7cf505ab2ae36fa780426eb109b73f5970339870f34e6c80407400018f30863e5dabbc77f50cafa490d4de192dee1e7e88fd25a6a8a5854828ded5b0823e38b8bf898ec595e9b456e802d55fcd1ef310211d511c05ab365e40417799af3aa007fcc1e9bcf5a71c837f830978d817d75a695ee0155ea1230b2ce0bed9d60a5632f2c0c2eed574b582558f2fa0d05dcdab1558a5e30f54e88ecc562f5c85c60f28e82ef3d40b57eb8c6b87d1d7423a915895b350046b3461f5f85db2505a1afcc633483fbbb0d5607355705bf36a0bace6e80716ba4fa6d50a57a9d1031774cf343585ab7be40185dc337dbdd0ca1d6de0027761fe5ae1957de4e08185dd3279bdd08a75dc5ed90bac5b5d976e315584f1473e26b233096ab0d1134cbaea91889ec168d1d90afa1d5a0d5cac81ff6051dec22253b8c434fd4dd687374b3672cb2027d58bc167a72c60b97ad3eae930f1c84ed857238c3558e97deed8df9e60c3b2bfb670bfe5c32219e7bbcfb74b6573e07d0e7305e3dec8adf1d6f59f33f11913090f50361c226ac4ef34911431eb443c1e6e8270b57e12068e47600464e181e454c4c2f334733804a314042d7ec4c098ad4a9660ee79f9ea17284f8b08d7f3c0c45a893ac0a1b19c9d21f6ff1eba601b2340de60eaef42c5a0d7b809eb176d0474acc7d958c15a90152c6ad739579c1e7daa2520aaef4858199b92c538f333f808bc4fc09940b6a167547bfe74242b1954725129c60d1e446f8f2b6afdd5725f271be8146fedfd8bc673f1098e1eab087aff5c5b48e5f04c2e6038f501603517e2b8b4a885c1192b7e672299bbc05d1de00156bfa64672b31954a42cbed776cae5f7d89c246faf2ada8fcf04a87a8ec15664db102acd0575ebcd3ea91df9c558dd551f4e4a8ef61f4d4446183c1d745ad0220ca28c665ed36cab4f685da334520db12543612f8cf683683b2929d2ce83eb7bc0acc08622e5e820d43646f6e531551c069e92801e75a5d6386bc5d47987f705088ec292071d7e4475571e3aadb682fbf053ea52d9ac9c35038cc3848cc9821afc2bbd1f7b64c26129369b409be0db736cee6757a77b20818020209e680883a4107f66c73bb86155362336e161959eca6f72f58e580fff1289df0bd648447bf8ef1217efbaeb45cb2dfe249b977e291e293cd8ccd2f15b61d4c1f2c5641bea3b7723251b8090e86a9b900c40546675dd15cb9ee805784a70369333907f8e714715c384669638b1331c15f878932501415f698f2eb22b8ae89721b021fcfabcb0b50e3155d234c4487e154fb5bd3d46bec4f33bf24003b7a041d92e4255e7b453667a2753f8c3d96745bbe267c33d3a04efdb4518c164324a2480944c1ad615de30300caba314c519290887960395677a8d37bf2e6827f970b6440253e14ea0403acb4d4b0dc7a1fe2c03dc5595ce8e9d03f9f31d5663172fcf6a0690980689860fd88dc8cfaf65320c82c6ae180604a2787a84441cb75a9247b71a41e4bd76a53ea8bc45ddfcd19507c814ccef2ec3c6345f6c38d8bb1f8b89140a1527b7f4131711094dca0f29af789228dfbfe9792a62568f44b37c705f1601387cd111c7e5f59a08b206ad38464448115e146d44fa8c02e78452e103a6c1a33d6816f00032c035d4cdf57b42c04312a6d16672e4981355312184eecfca209ce0d63a23385d31f2dbc3cb63dbf746e314b2dbe527f46b17a1811793d9c5911fa5b104fa50bdb7867f3ab7edec09b212b481f4841847f52707992b80bc702a44667b835b7f80297d63aad87a220b3e5ac6270ef3fecac966c3707f2150ef18afddff03d7f97b5b8f5207e310957adee556bc4d18ea8073ff2878224017e5fe9a98609afd292783c6527f7cb306d3664b56c653b3c9502414fc1039b8bf904283e233cec361d3ecbc0fa559878b709d4f17816630a1aba295311a1dc712bb0f23d753cbe99c78f4078b8afd53638f598e7ef6522551bb55326d98bbdfdf12842717692754fd2d4d395a7467c5a5c0180b96e59e4b8d0607c21ffc1469da8ba9f8b5ac14b6818bd5519d0f72a9201601c5156fac15ed90ee3ccf7de4b7eaf0acee80b8a82e9996a574b10b65dfca76b756c2366bf161ae1e9d24dd4a652a570ff6f1c5534085939bbd98f346bfd6157afbd39c4746b3de019181e95f7ddc8f1ac4b0febe3515c639855f1263416cf5003330d7dd19ea02bd1d89a3c5600290286566c4ee915af80bd144c12594db5af9e8f125b30fa682d5256a9268cc6a302534ade45cc5459d473bfd934a26bcb78aa26e1aecd4beac036f2cf1eabe78b8903ddaba2be2c40ba9125e0c9a614e7fb00923ccac7052439a1552a89581c9b49294a466672af15e3065936c447f192501e29539b31d604edb75dc8495add0ca45cb665a9056c748cb06ac02e20149811c526e8f7f075217e2417f133686e0bd1667c8ecf5d4d0ed3d16b8d1ed89b8bb7211ae3da1abc88e976b4b25ff02a884063efb8bca7c571c40d37748c404a85b8e5c65c42c58e0481b68c4c2473a1b166e2820bb0852a1b4541705c7bad7668d2b7f8a58eab70703f30a6c31b1a6067a56f87823b15b574abb62374181a65ed7920cf45804322abde591b03a61d8bb880b15ac274b9f6b047cd1c5d5bffee3f2382aa02ea6f1802b5907d45f7380d29f7bbd62825fdafd9dea57ccd1766d148f5c69a9c7f9eb2f33b0203db8d788c56698588855d4b14f47c6a3097211b04fa56b9682e855787ed8d02f0aea4cb8b1f097c8738335df722a46199ee5802a482ef1c20ff026e53956703618872deb8f6f042a1eb0cca004b17cd57eaab10ec02a5cabdbc5610ce1065382c5ce3b4dbf6d02ce175f171976a42c8d7d8719aeb0f6937d3508fc8a94cffe71749fa8e91f4d11cfc6f1d0e1fa4b5da051e3878abc54f37f429bc2c56eee1e02a7fba58a55dff7dfebc3b74e6cba5091d7964c580b12166e3098682e90c9b9e412eece137efe1d2fc7002dddc722110357535a8c9cce2baef0803026bba124b6008fec3ea10d41c7e14306bb2ed49a530962125c6519b8015b64e87d73135bcf13d17bf88a7292a58c8dbcb196b980068a3812738a8f12f59b8480221f7e4b98fa23bfed8964ee04668a6460ce3ff1b10aea8166d3cbc0ae218b90fab8777125bb6b12139bf9e8761dd6516973105a69a39c29d84d060284a164a0cca1044d2ca51392c49b5aa3cf7fddb5e3948e6dda21f40466ede57a9d222d8cd6e7f4e36e5002d43715d6843b79f22e7a3c9b6400b7621450800f2cb1e2c023d9ddb04f130ec45bfeb3caf137cd8833fe92ca2913c5adb01312c389c8cada91383ef848d5090c1f6deff8d25ab7a03bd95674750adb5f0ff17ab4249a6d7dd63328c3212179a861c16a920474ca034f962293d3258bc3fa08144df228dbb6322c1d3d975f21431f17923a6231a865ebae5aa8ffa53f93dfac22b85de6bcb1ddc1cb002fdbbabc434e1e141235c2a7c67bdb2e4a0aa49562c3c75f17a45fd0fb0bd73772701160bb975043ab234913a06dbaa841ba5c40dd272eda5d673d51b5d108a2a7bf7076f46bd41070eb2a885d19a61d27505cf1a82584dbd18ab1063260005e793232ad4ca019b730ce1f24fea10bc3df8e548145d704c1dfaead8c59a56bd6bcc761a1cbbaf52f185ff716d3a7eb01a89eb998155d4fa923d79a0ade5600426bbae23a1e2dba84a55c9d26be12c2ce3d15da0de59aedce492d08bf3c430d486ae8428e88a169fba3add8ff30cc19cd7a9d38fb60e9639100e8fc57969eb968eaa6008a0919a3a0f131c43099ab0d4099ea8fcee9ea64deb719c591cbbf5543650d0ce82d19d4265aae0c92503306b336fddd9d70647671f40769436a3b86f92d31327c50e7858d6166ee10d032358706284e83ad3e3671f07a76688a0067b1cc474eea8704ddae1b3c790674e9409b90447b4a063a4288fc9c9f25b3690d289f08bae4ea2bf506988bac5db4eca6e42392876f4feb1975626e9302c8352fa9ba44a1c49057d8b2121e303ad6f4f921d942b6249b3d5d4abee222b4409260011b4db265192e46096d384649bba75e59fafb5e6cad2ec94eb266535d9101021d769efd5cfe99403ef5a71c64578452e8a2fde79479e9b081d66e345201ada4c4917efa6334f6710258b5a2cb75e1ded057d56f670da0b12ac02af3c449dea8078402572d825ec09a602a928b0f5858241d847b9a6079cdd2469389fb0746b0b3b32215bd341a93b19782a6bf986d6ae3d12c14a68934ad332d110896353a7361fb9045f6e6b94309b2b6ac03e116e771df16a57b7d1ee4ae536bb332aedb4b30c725c585149ec78529827047d98a2326333596727250fc615a03f725214f61dff71292ebaf2f6d78e3d828b1aadb0bb2d347b55d73da07dc2ea0aa3c8177ba9939988806981e76934cbd40d8b4fe21eb65adfcd65e6a7333e3803203ba8a85231d3c838796bdfa8c423c1d9b7b48bc3b2210e5985b8d2adbad60c88fc2c0ad67d4b18608793561afee34d7f543f62a8193af536203d20652bea331e54cc9df0e5e24539c2ad0130724d810fe7c9eeb70c8bae51d4076d1420e60fccf43b2dae6bc3a0c619197ed84dcca3bec444570cba5a6ccf530cd0cc93d8f1f23001909499cb82c35b04080c89c40e7a2ef944af76eaac1d3b88af1f1a6e5ab2aeb8530df62feb2f3650bd4bda12933020aad6893d3e26b185650ecc2da149476266d0a2070856909bd1add26a02dd60c9343e89d6a9cf301a6d022c475ce2d97e61d7a8fe07047e0f165bc0d1d1800e11df7453a992f8f11a1a3859d03ccdaba3392b707ca26611638722d4752898d6328c9c9b1417264683b8afce65d0821dee6cbcc08533b49b565e4b9331a5cd4ea6af7b586c5c2ddec7b58e72e1ff9d8155c40909479f1c10411254e3c95e5599f5c13085abd7e82de05c5c16ca3e9892c65fe566f81ff6ba7ff82bb0aab541215b8c0a28e88d6a10dee000e5c5db126432c5e08a4e1f301e8fa8ee0a9ffea10b011b43d786712b149ae75762037c578c306add3617b078832265f93751c5f973a55b2265190dee12a54f0aab7a55efe26b0379c2b9000eba398a811a43c1f551fb20c9ee5050ac307344ffe9f953c23769430eee080f6907b8889f45c58cdea4e9bf6b645ccc026122b9b80604dbd04a2cf13772ec94aa5edeee73a95e85ac4aaaed902d32f9e3a4ac5a82ab8e88c313823153720e2e23b00345c89a6d48c6650b08fdf34675c28dcd4a017b2f6dbd12baf62282810815b2fb03d99a5a2336425906e6383b7ff7f7529c9865805fa23803dc453b428352f6e737631a479437e075e44925063e2196963587039e7e1bd1d16adb80905a9638989d42055ed6971873d07bd1e2e0b717c377021fe806b26b30e0904424bea95322eae2acda7e41bbb32f2fbf541712e434a5f865b94596eb20a7455b9b353816a46b8b1c0819234aae269839e0e5023d59c9fc207bb21440e45841d3e6bd2c5b79595e47873dae145191dfea1d3cd3ea1bfdc0394ed7922120aef5f5be0b29b0973b2050d8ef56740ec5194e8188926480f6ea0d3af07e8930a8877d1f50a6a861d62a69b6997028203787d2fdebedc8af9e01c2f4050a5635c5fa080a13a4a903a3aed38e17d1211381c6f64dd283af5694b10fc96b9b1899a1503fc10cb4c0b64111a4fadab70280bbb3cdea23026c9426707d1819760c7d7adc1d40b123494ac6595588923a32b316a894df7393070090def47ea24e8f1f3a5a5b23c6d39f45e378f0c0937e942dae76ea43f626e13466a46b2766a626e7e984a2155b33dc91ec9530e5cb83ef7314dab3a68c10c881d60f661d62c62cde1249c41a5088cdaff3966226dec7309826a12abff22c90d2b55bfba6160ea2127e847f9edaf9006ca530ff565a741f4b4023835dfb2719659cac9b4381a26510ee3619ab5260e2b422722cee328bb4d229e75384c217b74c814ae4143da8cc4eab7a23a13880f8757416cd2b50bfe9f5c56cfaa8d5c630651af9afab3de4a6fa11ee29dac49345671f4c589a3ae9e4a7b09259394a888839e2310050b5e75e52ef4b759bd6103ee9c4da7db86d0634162cbf028fd0e4e525da05ca8d65b3970764c4b0490b44c3b834e5c54e8545cd0a15f8bd0dd66c7fd3454e7363b50bf93d8a847c887ea6417e74e19bb8870927b6b739f2cb60f21866b6be5cac9623761879b9d86be6c67e2ec36432fe0820e7b8588887ed2b127105abddf3a5aef46b1d37b215b9676469cba3e5d7653a481233beaef20ba5008f97baa07eb75b64fddeb7e785abe66cad9d5691dc8c08d53d2b1df21babaf79215191c7b6e4eb163a8cb1675ec3b2135e3865708ebde2a4576e5d89c3d4bc1af136f845e097053c31347047b83dc3bdfe5102a74ec687d33a45dd3cdb6dee9eac69ca1381df6adcfdb72cb3ee57b8fc944ae7260e3d344422260ed08258eaa4998aee1f54d834ff91712de078766a31ef28b5b0836e3296c03dd9e375ad8b614c376e5c4fe9715524bbccb477c9e86307aa8d495b90feb0f840d50ba6fe43017d1e360ab5fa3d1dc84702b43f15f0146d6f450f02a1167674bc4eb9fe38f24a0b560e0bfd8197619eeb1408d879f4fb862efdca3f46c23f46d8fba39e2292645b1724625d71bd246a440a33d6fae9e51a895139a2030a94d401ce5669a3067e78f2f4722da9e9bd205801f48f6478c1953a038acace36a6a7d37f1b930d4fc2b638dc355fadbda03bb6ffa86422abab80bc4a064b5092b1c6df3cca92e7305cc8c5fbb6407a2ea5babc74f49b3b9033a77e423d7eb43e42dce5679dd8abc4880504ef865d843ca9a6fc7b57e00e4ae95820ecf25d75551a5e4fc562561454099696e20a924bb516ac0c018f331af91c4e8dcad5a6dd9bc5c862fae10a75b69547b8cc70e766250e65500b865660b64cd2733932f0ff81e438a8ac4783e8de901a489550da45522c2d93f3f7e53d518713821b82ef1996187bf2e450fbeb75593cab47da703644bd4734be9369f23adaa6ccf4c212a74c8036f7c334f60d28b556713ab655f01ab0feb38067a1417da672bb71301b755a50a478d1551d42c3ec8869ab4f21ad0a89191188562f38ddfa333ed15158898afaa16e89a05889146d2d88d20637a243f29eda95c1810a34ff60ee6ef4248d902d0b8309f30809ea71f06b97d43911684c485083dd591d3f94cef0d9ddf7732c0b64bdaa6dc2f4608c27af4a1ca268fad0b52690f57a367783fd59d4ac5040b829582b3d43de7f9472917df4fc8e0413d1d9598e9ecbc533ac7df3d8fdf581866193b7e094f5601b81339810aefab86dadfb50fe412960c5867d7fc57e6808f06f15268ffa8702460f0037926c22236113941def893bfb13204d20f9cc5150088e68bf7c658c60052d896b01193de03b14b347271ea80fc2c24437ef2e9ddb2bca4668b57204baba5c5d843a04f0a0c26942d5a3430b6034e17fd31a63029cb595edd853879f6f6af9ad9619ba005e33fe66c89dfcb89402bf93544551fa11765cdade05214b2a822cc39617354c58a8558217b8cac89f3a3d1a5030b5a47c9ff1d1972381423f9196883963453be7fc6bc5f86e500607fe7d71e5340aa225c7554f3c8c45970b5f22f045cc28ce978660f29a10591ecd4de4ccc83e2e863a7a26e99efcd8bbbb940bb0e1239c79eb84ba384932bf8a749c4f3c4d701550c659890ff6b2788bd8e3f3c314fc883517fdeeeed853a60e686518380ca1cb1dfcb91f61d57a931b790d88b7727ddd35743c15a053f7b0df3386d4e5d9df7605c0994414ffcaef5dfb15aff245a0137d95b2b8a125bf7f7a81b10c5668f28bee2cd961e3df56aa28123f31d7ad1dc54983763c8240a4545d59910c90830202cbbb89f946fa821c3e2aea07284818a95d823a1922200e1bc332666ddfbaa43e89b92c803c391716149628c68fba8b20d1286762e3d87cbafd6a58b42716e90165517dadd755ed33b27a3098b6bcc0820288a25f6035035ad8bb96545ac4f45bc12bc05e9250c9892a8e3c0ce90a7228399aad78fc9195f92b95478880b12eaf7a7fa011911483e8fc2c4fb6651ab493833def1c42fcf2b08f2e139eea0cad57fbcc168fae2bd6dbd62b8f683f64ac9e44435d5115a4194c0982db9873e2b082ba3c520d0cbee6ede2fd02d4c4df641bfae0222773f9c391145d4a38fcaa02454e7aaf8ef6efda75c98e5be5434cfc8fc77972040c2009d2741dfa8051d567baa58b759933b5133df2d1e70c93bac7d8504ea73fcbbb8c4e993b41a3a52aa53320ece2aac7f5926de3192760f07e072d69f17afe953ded1ede87dd076d40ba35443b767fd23d27897df6a3c01ee11c647264606075e6b7ca0ae6f8806cd5186eb19073271bd631bdbe1f525f2ee90b4904a6688759401fedc22f23c5ac8cb918890ad7b8299fd917aa111988c3a13c22291e136f3725bf88233aa444df7b76ca4fd605f7aa6710248e507268345ed72cd2a7e1f81730fad540ab7995a312e118a43d72c08c6e687acb9072d96555b7f43533c6a87c7c1b4ca5fc3567481f1b31b01f568a8fb2db51dd224493895c30036c6b531d55a615093cdcf5a21336d1748444b89cd8b4fb8f2f7924dc105e9580974c374572520b3ee77aa2c87b59abc988c6374f7743f927b201715e8a6c9c49605550f0189a20f8d6803d794bbb2a07d53c5463f2f9b2a58ba724523fe7c41da4bb9dd1784374ec3d88788dc0c6aa12b125904bb17a274b207f1fcde3b10efb7c74492800dee24c5c464bbc8f35dcca35565ba3e9f9a56ca9f00ff60124228595faf9bda46cbaa7762e232774116f7627da7269c6a0e59679e085b45d4b375ceaf08dce43c2cdd037336caa99423f7eb99ecd2fa2492b35e9a2fdc8584289d74bd1e5c739380e455d09971dd7b7a456f2c2c3c17d81c239d46321397daae9f944f6d84e26431cfffcc6eaf5327198a2f3d704f2e26a7221f3f6a80be9724929d60dd2e238ff8f294badeff04eff926c5b46115b35d58ed86aa177de4b60c727f20e51913c78724711da00772e4223c15ddca8da696c74a787419eca915c4e3e291e3f0ba4166df324f9e42db239e1145539e5aa2e58c4ee9ec7445e81dd3f694c56ca6698202cd597721cdf2c85a2a5b8dbf167e19ba80a533e94d20132a3b3b6c6f911e2271ddcd15249d8bed0a3c45fb04472e8ba9b188b351069b4b1e422b887d6ac02e54bc6e0c56388be46e9ecd915998a57778e879c7006cb66d0b8965dc9c8ec54a1bfa88653322fa5eac211a2a304e624c3b8d169e240cfb7c626351d37dd4cf3a78d05c7ee7daa5d0d2d6de6d29fc40b27eb6a7553d0be96b4189da67e4a72e5c3a8c64a5bb1dedeab4a529fd73219d29b04d5d8e9699db15e3c3ebd6eb952d90cbd2c791fa4fb01ac6063ecb760a940d7cb642553216fae9d99b32581f330c3fb9d26530ac0ea3f49a1946675a1ec221925aed1e74f30f54803b4bd36856db91f5be8efbfae476ed0e69aed87968e93501b71fa627adfcfcebf32dcc40992a20517db22e1226cf3673ca49613447b34f9540b7a010718ac5b0898b0a52051a20b0300011e19d62c3a429e56a664f7fef390fc59cf22c1ff791b2c016bf3cc31b46812e87de86fe89c93d4d425bbcc0d7895b4b140739215da7a87f448a2642ae6806f1f0146643bba20424b0a1bd03a813baf739e5bb604adb7b66d56a0cd895dcc213d50cddb697cbf91961d304e05a29ca60c7909ffa2cea8d79963362e26e14e37a951b0b498b2e94ae4a92f06a94add0c9b16dd52c9c824663aacc11483f0e0b8cdb0de0608863f1ea67b7c2f18319914b9bbd67f4d16a46535a1fa7566545f83336ae07138e8fa089ac3e85c6e22181af2964d838c2c5b15bb22e8aa44653e314cb415120068a3e0883ae042a7f6808730af4a28471f2be6493cabf8804c04bea7e8379346fed24c2c6378bc7662185b1d5b9fc5969a73c542898c456002c3e20b1be4001b4f9514c15c578d87d83833ea7ed1f6ba925a5ef8a4af93607181dfdb5fd0c1bd155723241b503ff9d319dcad7d0a60dcf5494be1d065f0e598a3a0d52886bcfbfb212e624accb2ca5d488004248d60f8889f647078473b1ce82267f751b57523c27188184300830635bcc0d80338df134bc38a2fd286872f472458cd0c8e75b9541e3a1ce4056736ae3e7cf713891dfd30d9f60f979537b56c447b9204d543923d716e6702e2b661b98671feb7fa949a58d7290bb3bc4acc0725087845597bcea1fea6499566fd9b27b9e16b1bf340668677452790f61767e153344f959fa604a158468819ac1d1ab64e372c603901cfdd39c078c32b2e6cfb96f20840a39cb5e754f13fd695d1bc8c5bd8715ad2b6b840e93fe6d2e5017436cbd7fb2ee8a2b7be44a90412101aee81ebcb5cdb9354012dd95542bff63430ae02d795ec5f8d3e2dc0d090073340db9ae197bdb2930a65fd952a76e038778057abaca640c677db491cad7756851fbd321af231b163aa5e0bcd19b4b4aa80baaccec4b137634c75ec2ffbbf9d3bc4bce3329f06d4fb29a953ae7cd36d1762598dbd5fc648598d50266dffe543f5747d54d17385d495c93e6fa511fe7ad5d177735721ed48a441d5eae7403254d14be7cd584aae6f494f5a2a41ed1d749b04b732df2eefe2be6826eb938e3f2d1ca42601eeff59c2c39a4690984e3f1d8e855bc15b6355d5d23d1063a36abb9a29d4545747d83fe2778d6cfb04acf224e1d783358cfbab78082afe58cefc1cf4ba8d149c95a3b67037389cf5250a4f053d9bc01b02e426388367492897330b9eb6f4e0c690cf8d60d295004bebede4831b023eee054915e6ea5e19242c88e92d287656ad9edaa500df1a0ec4ee28c300f7bda04f34060f3fbd0da0a7f3acca4997d3d37b045da3505da09aee276954514944ee522ba5ae423a3cf4ba5560890c1b05f1c7a6e509e65b3e7b765d08fa14b095e835086b29ecd335b38d9d62340cf60d233c38e73d3eab320e3aa045fb60995e9345eba465a72eb9d2698a800511cb5c9e81c752d46113a2c0455494b4c6686ce7ec07ff4b184aa4f037545972955a88103a265b8e7ade51b049bd0054fcbbf72d7cdbc71bf9cdf2accbb9e2aeac0a6488145f7bf537d1f810e7e0c15ad9f9f9dc9c77a6e58ce272ade6a993bd8f429e8f59b86cf07e2b68eaa333b9bb9edf4b232ccba4a6977af1c04ca1916938d048d5eaad8048d98517706b1ad2bf8ed3c1c29bc0c47b6adefcc68389f40ed731b8e40cfc52212da9831c0909a36e1ca9de3a1373f0dea39cbd130da5e0c9108dd7465fbb741e7fec338c3d2922ce51f94640545e33767ed30eee7123fa829c050d26cc5737f7927522e08b082e995b846530072fbb42a425e1b430a4aef1fea35445caaa86630bdf530d78f0ceb3d86dcacb740d223b0f0c8804fdd48dd949a819f4be49eebea42f1f47fc979a650ca1f306a67ce44a015214f0c15a8d14253818980bfbdc92cd0edcb2c0c899c182f52e52afa1a941c96e9e2f5122db561e69f59149c1871c67bf1984bcaf3ee72b1191ae8360aa313c0748aef4ed5846d8d9d4fc9667e355b1d00fc40d309b723874a637307cea87cec2f505316ad4ff0aac0402c3d488cccadb62fd773a3e342e1362baed25b0a3685e0c15161ee4d671f9e88bc3e20d9d08ba276608841f479553a17457fef6f2d78a0b408b7f8ebe61a59e6a8d42c85e5086ee353b8d9033ca821879234e5569a0cffbe6acabed6c33451e315d0042f80483043a4e9f05f46ee28a4714203b1e18d7e54c1d1be146dd2309bc8f6799ea66523204c54ecd7661091381b7b6fc9fcd75133184065a50b2db5677dd8b0728a14050328207e4ee5504895b2218e1e7d5c22917fedb4d0ba025a73262b91d35eb4f8167359f06bbdf7ef8ea1e6a83f5fecf6a6f2f935c0beafa8fd9a33c7a2bb3ea2636e9eef42cbb8bd4d2be4d3917c6ae42f20ec18085278aec9a8ffeb6299c9d6aae3c4a282ced5965c4285ee915ffa48ed19b7567963450d8639fd5f97c903d86cfc128bf844d9682092fb32b8b8bec36c4cc56b7008314495129c74348dea59046ee9cac7372549ad240dd9842c21364e650d6845a29c25236ca2dd5e3d1c7ff34c124566510b93f4d2c4373d83ddd27048f554460e00dfd01f1762161f201afc4dfdac067692844c8d76727c758bd43ed535b408bde398c85e37a9e17505ade189a85b586c146608e043bae8fb687031a3fa4708ffb5917af026af007dd3e8e25fea0de0ed735f2d50e439260fe0733dbb9240354e6afedf828937dc88670c481221033b377821ae76326513e91c34126b2349fcffab1cf23d55c26a9e5403162b17d5688ece4dc5c85f98d47c06a5f31e3cad02734df79690a82c27f92d841b9ca8e20f98cc8956b611925fc843724e8c57e0e54b07556f7e54c7f433b4d49b2b502771b28540900aa3302fb3724e04017a9feb98a8ca109143e8b806cd0c5e98f5a8c93a6abba0940942edb61c4530232ba2aa0821bc9886570fbf60f989836ee373853781a34219dc586151954c1194f6ac9b8c5df077258e6a17f81747843dfadcf16f5b072200deb9397a2e4005bde1186718eabe1c1a57237984d0d559f4c99dc899a360475fce8c7a243d2d039ddd2aabd6b4b18ed32ebc0f609eadb20b8dd50248b17290562a14a6288833b9012dc2602f4e6a770a488a4ee992998e4a5de540e7db3d6070cdd64e6e3b32006cc43e6a0636b5372faa7b556b741a6ab40754ef261b967dd826073d004b25e861d436558a7687965caab276f9ce3c4877e0ea33e75e5c726fbc996b3cd5d33bda78c1f20d9b887070a7947ce6827b31b0ba2cb97ccb1af846a18938dafd02b605a2bd0bc989532d81e35213bda442df7655c592f16c543888cbbc05e24743bbd8149171133acdf27b4e8289ec13580b7d59a8804c9cfe29d4e4fc38e4224043ddf58d11828282adfc3f099cdfdcd1c5d9155bbfeea0d00fc4bc39a40702eb9f9b099e86694c1f870aca50fbedcf93a7ed6d7831111517c255c8a2b170c810aa82a576a90305750a294a84155e8de76ddae2b698cc8de51b5cbbd2f344161295dedbaca02ae0e39484f8f94d49ce86af34c073a6ebd02014731012f92df4c6bc4ef41c3be5f1941284abc83b8db714e35fb60cd74f0ccc690cfe04a142b7cd1a65cadd88deb957fef23fccb5a342b70091afeecaf89667d14dae9edea5ab7e3adab6579051d51e5c1db6b2b3112459c03c8e630b22d445696a1c1168a65ae84c696b53122cc306c3855055aabe771156b4db6ce065c3d5d769a1e84d67b6493bde7786db67cb07e45a5ff0423b7e87a7e6ee600ec63ba18b972cab55d2e2562bcb42d7afde776ec2cfbb5ad80796f48abaa5584e17e6558bcee515893a6eb22e96ad4b266ab2845087fee01ed8d432825df08a8ebdd77aaccaf626f0bb631014fdb4cda85478962b94c985c4e402d5b9999065c9e4738914187edad656d04475342c1ff50eeaedfd7bbb7cd76b0d6e825acf271faf552e9f7fd258b4566a19e6abad6966b49547f9479023a74098f664b1703f73ce7fe90005c23b230ef4b7747d3bdd9fb3bbdef27e65684eb8d31cf5a38b5302846f9c7ecbaea77a064b7132fb8a0e154b50b9a959143bc0553fa8f1e3f2c94111b1581d74aea51341c7b53c37dd7847fe2fe53b31006e4db13627cb44431fd6787e43b263519bd7312b9ca05e8ac731e8f0bed6d22799f19341dff2f2d29233a0c8198cbeb9e3ab33b1e5e4dcef1e727b229b2a2155bb971318cca0b0c402c9baa6365eef3fc1cc476778b873cdd15882d86ed0b7fd85816b8164152d78a01271f6ad1d4f501c95b72c84808901a7811823a41b57d2111c7e1560dfd215cd8b117554c803a9100cc83fc1289256d650e23f9b2e26972a01f72d07afbba7f76743b4c0e60f3ceb6d6d2b50e4c9957f85be778dd724cd710a2ad6ec677947bc7fe8dbf186df335cd12884d023c4f1cc11ab650a44d3b9362b161b760bc4d5dedaa369eef860b92d8963a4fb494af92f5e756752051245b4239fb9b88a1f1535acda39d03a81aa3373c68f9a9f6c75f752c97a043a01066d084b829b615c73d20bcb8e2038f66bf3190e1ef08aa77b4c6ebfd75577ee8285e78bdcfedb0f2ca883ae6cc86db63231b0b2bde4d7cc50a80edc8e2cef0fc76874c71ec44f63a2935388a02303acd1b62e0f3fccb5d5d687beadeb30b7d54f27684dd3cca770751d0d4ba5c2c5bc66a843a1870c6263aa4e7bcf62ddf982da674675142e62122fc0266f4ed49ed8da9b0c29df896d27545ef96fc985964a65b72502abe774887171ecb6397354131121db76cc35e83bbead6d4a15e310b7e6864d456d2d03a86d861fb5a2f559f3908131ae4c8b875759b24b29bb0506f78fb6d69f29bf5558dcbbc16fbb73dea3555516e0b0c5ef7ea9710171be9d0d0436bdc57f2ffc8f22d2096bbbae8bb4e1afc6bed8886682458d676bb4e8d5e6785ac551bf205799e3d22ad3477bfbc883dbc672414cc023e66274e81f94a023c5a13105697a2a8fa794ab88acaa56dcb98c8fe37ab0634ffff67b76b10d3b7cfb67ecae51e869fb673e0497d1da45326358e291be2bd1232d976a2554f5d9a5aded5591284510cf6725ec2a3061c6b2cb7e2f397677728543d4dd4cc76e2333802715df5e31b4baad8db9f4312e3a54c9383cf6fe4ebdf05d57505a71c24fd2eda79390a70398d2b49e955587ca4673a19711762c75f38e26f1a0a04480e56118bf42a6962c97318ef0d5c180cc851b050ee7ceb18ae0404a1b7f515f688c1d19f0a3fb959e470c4f7814a63a556470e13126674106fec05022f236d6d3193adfb8e700305b78f65d5a9e85292093db2c26c366b30882db3eb3cdc27c88b351d83fd4ae775e9d53476af9c34a9b6ff1706272d5ab923b81922c5592fda366e0aae1f69ac4522e443ab98a8fbbda7edfe71fccf49c58a3245c3e2209eed7b929773d375b76e78c28b8de8a6a60382d83f1550c85c16af9a13be2191cf7ed96060c2ff3ba7c9a0751dad8600b9d3b41f512b9bf62c455c71faddb3ffef55361bdcd8cda652e649a9229ead4e0e2f6b483ea101250501b84c41287db0a7c536ab5a9743286942fc1d3c4dc23827dcc5d38986c417b5ba32676d214e60bbf0019f560cc84868e0d0e50e8452107f28f793f8e2eaece45e047884f03d8591fe6be02a3c90583f7213371d72448beac9718307ed2d9cc32154cd1d468aed2f6820152124a3281a3fa1de13538c72342f6471d25a56ee0d11f21018e12dc0a5b22684f8b90197852da32466e5960766d8dc9360f51e4992628236247f60bb5038ebb7056611b1147bb864c54bf28ae395219558840f3a24b0187b7a2663d31c53d25aa13368d8ab6b70b445820fb2f2c9e33c30374d00facfdd89c9924ffee2dc1dc93411552f1f42825f287123bf580c29110cf10cfe82e83f45fd5c135464a75b0ca494b582ab517bcfe54cba2543d5ab51a718c7bd8cfca76c43c80cb893d876c99282d864ca7a4c64fdc3cc0568a9da304d0387e966a1e968c166a153376c3f078bf20938459b59f5a3cca34b0b2382ee60f5fcff34476b37027865c000e860f47536581fb1c7fd5f10a37de74deefef0b3f9ce1e2bc18c369ca19a3ab02bac15d5aeb72d6c4082d5d2a2a7cd40695f04afab7b1c2b674dcebf18859e750afad0170c570a544ead98f7892974c8717d542691ddb59d64705e64b9d8d104452c556d71d6aebb0e4f5a9c3f1858d765877b224dbb61c7c529c20b27637d50c9147f519eda96e41797dfcd1d8e3bdbe200606a19aec914e2fa8bed1ca5f1d7b5a9ec3a05f855c71bc9e552facf3b005c1a39e22b2fe7259f081e91433ba40a44d42c90913aa177c21055b023883178c4f7306af10c0e9bdca0ae35b4c53510c0abb29120393b411b1ca7b457531aea28529f56d24bd9b1e8287805244f9772bfeeca80b77fdfae8050b71cad4625bbc11986ada65b35a115940f062506d058be8a91b43cdc35440d0f5c44956325d92d9539ba931e324c960a513f231cd4ad3614f5a73c569125c8fa78de576e6fd263bb679de6a89b8e47bdad986f4d116e5e9338a51f138206b2a4ef047606516959a917897dd7ebbbe3801b935841b124a9463ca1a94838edb4ea5a0321b73999eadb5addd4ce88b62eea367de9ad1560805265390e1e204b4469e6d1e32317f08bf7261b7d7e16d1c64ba9fe820dc85d0c3635607734d4318b3c98e369d8be9b9304b7ec5f2876209c2cfb19660b11faacce08b1dc4110b69284f2078292b6a88ffb2610b846ec94c795c0b794834aeadde155ef13fdde4ef7a2a46e607eb0251ffeacc37871cc9841a173c3f46e05fa33ed2b23ad67ac0d66d97ea4e1cfb2d20cbc78b187a4b04e33787a5f42f6505cef39f1e675261fa367d207624c1fcb5de88223ae893152109c2eadeb742935a0db29b12d96b6406ca42ad3b449e6f6d7524109f0f6bcb2b54c7aed14a35feeeb7beddb7360e55c9b395b2f813ca58f1373ecea51410520f71b5c5c52fccae47fbe8b7836f086257e5273839c01801478eb089180ff8d00497fc59f17f4a8bd5cbd52926c8c2c0ca785edd59ad24ba4d8001e324183a1842868ad1fe00815612a54034fc0aa38b7f186a2c2068c4f62058f76312054f22d5f954550235927a17a7154d2ae73f67992b02c9c82f610b562f32c4b05476fcbf8902a09e1020dd62a31e949ecc93ac084c774ca67e142a305d5582597ba10213ef7d09b4235b96e77c9a2cac0984b35e55b8642e030344bd353cba57ed0358f199261868e1bd6fd1f29c29302341219b5ff702ced8458d0890c2e95182e15eb83725ad7a179c3ee51267e6e974c236e6a2778f9cafc7b299e316688d0e5aa25a85cc829fac6d508bb3a4f98a77ecb0c934c704d96aacb2b9324ba4bfa56a5446259ae2b7c135e24513a2a858441ab283b549a33f3ccc023dede2542a9047ae4da7288308846c63e1811942a9de481e1744d2d38a49094f93d6ccaf3dc81e2ae613c4202ce941952ad5519b1f93267c4fd1774f27cb898e709c1aa1204658a131c27634d611e7cf17ba0aba686a774e24dddb7c2accd2c4029e89a8ed5e88154a5c167207481aeb8ee5cb3006c95ec02f96509ce36dc65e0c1f7e7a21f2a54442b0ae0b38ad0c735f5157ba2b7191a1d5c135867b9ea0879f9975a85b1482a10f78683ec37252cff915b3bf9ce4b09774b761d0c356a930e46e07db7400f8782933dc1fa2979dd08ce103a2e4f23ebf46442f97ea6114a809fc42caae45887077300b766af61abcb1dd93161d050dab3c4fd1328fbd482247ffac531adeff1e8a68de3bb189f7596c895a9b9b0ca5c5d95cc624cd6ce435f2cc3483da61e02f64985b8e87c6ef61b0d26c3f4bbfa6c3361431114cf4df792f78833db5800f63d8a5637f49d4bdf6f4fc50cae286529bf071eaf2dd816824b9623b30230d663697d8f11a716f5807039b4190c432c7a3df234d9e17ff1de6f8494704ab2b3aa3ec296757aa7e22aa58e0d7346a81e0e4ebff6df4405f02320ecdc89ebbb6a447705163ef0a87f6f20d53e9a0d38819319d18f1bf38e518f14d24e4c8743cffadfc1d8a90a4b560d0fe1da9876a228e007daaad4e2bf6adee816be48f43b99f2476227e874465fad6b39eebe7fde14ba989f7dd1ce652a419bdc0389ab7121746be911f2230e844fbc014f4c3e5c88cf64527ef8a9fc9a36997f01e4a968c8a649d92c0cc5e20634f445bbe11bf185801d622ee250f1d79b5860548ed17f25ba035b9d4bae11955d1dd21d74eb049cf75438b4c151bcafd11cdfb91bfb2148c61d3d8b2d20670bf61ce05b2a471d4d1c487aa4f0a4f4c1863b5613f9e2dfedada4ba68eaea34f2aecd426e57aa7180e05d231405a1016ec87bcccf0c06ce1037404e1c08ebed21506fa3e49ab257fa4500a62fd1641cfdf6a2d0fb3493dca55859a8d65852177a9de86337d7852f0addedba9a53024acd94e2e871a59281a1fc695292e9d44e878b7ca962bfcc9d44fcaa5d83689b1e886c12f3abf8c9e6bae92ee32d555ba4026ee3c8951fecef847e719728af4ebefa7aaa0a0dd07fb277f2e2ccd07cba3501768fc40c94424f1b78fc126eda284ed6298cecf18a7110c00e2ec3438c533487bb7592292cefd1b30ea4ea9db9c2c9582f7596936088d32a21afcd8c2bb20dfda18a6771e4387a2c8694e676e7f55a08a6a3857060968c6ce5e01ff9e56b0cebd618cea7e3782d2b6af51cb344c4cafb537bb5dce7f98d9c5bcb03f8dee668084a81fcf489e3d63ab11d40d560351fb1828c85c8a12a3c5e1232362114cdef40fd9bb2822769ec5ac007492ad1dd0635caa98143efb40360182ef4d0b620ecf09aec7803a18a43511fb5dcf8e8fffa91dfb257db8048541319995240880aca275fc6e29ea3cde4ac5cdf31b0227ad930e685de575af8f3aaaf223c30e0f3b712bc6e4b00e35a1b1688b1b741dbfd5120764ec30d6400876927daab0caf6177b61c40ff7e4851014e6a772d42884d86d90776bcccdecd90f647a2fa78b5c2397e1fc8bde9171d9bf592ee8c90d935b2cd3a2bc561afe9f466ae1c1b68078925ccca6dd62d782fabe06fd760ae334d1aeba324566f6aa62e91583dc25f518febcfdf87e4d5c1b24755e72490757b5b340e199d8254a0ff19310f5d5a031fb2ff8ced5e986000d0101fb142114d69f5bd59fe276057d9e2f398a4c2895b48b3a117d75cabc3c33fdbdc356dcccd718b39042ced8d6522eb985acef4972a37bcaba2bf80be28c55eeafaa04ce0dd1b8d6be03272e60c737db8ff84880c6c18de9bac95fd5ce878ac7f164413438ce6bc29c197ffc7beffb92d4f4ab3b25bff96fc0f1cb1e760e3c76b598b9f6d5f13efeae50cb6af92f09c86a98a1d0d268443494b30f5fe4cdea9b88a57e461e1dadd9012a876683756630758e51ee2dcbaf28dd29929be5c5837f4d83b308c3998b97a4a7fb7d2e39e340af15444475f18c6b95138b4f4813172f58ffb9daf54135d005b84369175098634d07a9d20b98e4608647be774e0007d8d2ed7f0da89883b83e22634f0565dc54bcc9d228cb9557f13a15f2dc184b3feeedeed9c362140b35ffce838a75d45ce6ae239355c8a3f3e9939c7a91fe33fd5eb82b06c85a3ccf7a188ab6efc28ab2473bf2d1cc00c4d2a83357064d8c111159521f2cd2d359e90aa102049aa1d51a1eaae3eec5c8a291820e20ed8286809883e4a594a01a5df73ea5a9665fca45a3a6480796c2d993a418e0904485bacca11362982e681990a6903cb43e6f105e94fd8e773f302264019464264317aa8c7da8ef865721e341761354db57824af4fc174e4e547a6e23b26dd806e4b2ff90cb8afd7e69f97197efec4c942108eee66f26a43599ba1ad18d1b8c393d8ef859eef74db0468d1bf8f1ea3f24e1d2863100816cb798cac5f3454723c7d0cb569ecb99a31deee6589803bff1a2d27e56f1ea0b02c0fbc816e9c1b6ffafe3c20b4fe799b0ba2140a58cff9ef052024a153da70a2f17d4d773554abc1f414129c119760b57d5e23d551405db701243296e1fa1d86c2ba36a14188b5d27d1101178de118698c4ce3a644cc1471bcb5e6f07f0a6286b1b6070b9ff6e58cec25c27ef3e1a4e74ede1fcdccdfaac2386377443cbec2c83990a2b69c76478fea3e37a47c30cf292fb632f61324fa1c39ec1f87f11dd22bc6efdb35d3b8333a8006f2ac01c4ac48d2d1b5d2906c92df92383cded84ca993a93aa4dd26cd0a085d028cd61d25c4449f8a92ed36d1139b8067281ae201b730d19d35c7f88ff4c600028079fd9b72db990eabedc5c5f5dc6a7c1896ffd1d9a0fc0fecd6f02752ee55f958528ad4755114941e5b35d5aff685323df08db7d6efd88d93ce2b1efe3db37c8a4c51385da5dc02620e94773e004b2feeceecfaeecc46c0db210db7d2b5add3dd013f000318b043bb828fd817a06cac282b633f4e7340653af2932ff28bbd7508b22b880edeedfae8e29a8dd0dfe41cc640384b57b20232e5e0f904bb7fe82d15e3bf16d944ce13f836b5d1702044c006a4c2c0f3d5067e30630112a30b2010101080840602112f9596c78602422b388cd4e445455eb01c311aaf845c88456c8b609d99aed1289ec1289f09b1031827e34eae000d800e500bff7defb7fdb9bd2bdffc1d9ba1e67ebfa9c0f54204880c96836ff0f2489e494c289567ba90a67ebc2f8063fd1eb63a66dbae3fe8124919c5238d16a2f55e16c5d18dfe0277a7dccb44d77dcbfe3ab1a45610882dbff343dcf8fe0e66355a310dcd3e300377f204924a7144eb4da4b55385b17c637f889dd7364daa6b96e61c1e42292530a275aeda52a9cad0be31bfc44af3f201147a66dba6be042cdb0e0a040a0d30c8f2392539a68b597aa3e92539a68b597aafece59eb9d55b3a17672819141352815cb858152079244eff080449e06faf0f0f0e04092e81d1e90c80320de77819141352815cb0593d16c3634b0774812c9294d4fabbd5485b3756159c837387ee2a36d9af3ba0e492239a5e969b597aa70b62e2c0bf906c74f7cb44d735ed7bba3f7ffde7beffbf9a7542c170cc6f4317d8cf1638c31a51847724a1fc929fd9c53b3d97830b9c0c890539a68b597aa70b62e2cd3c41f37cd759f27a734d16a2f55e16c5d58a6893f6e9aeb3e2fdf396b6d80c62c4db4da4b55385b1796690e36cd75de57eda52a9cad0bcbb485099be6bacf6320e069050552fe96bfa594ff524a2925b7e09c3ea7cf39e79c734a397f8bbde96f1a724a1315abbd5485b3756199d643be1f1c37cd759f37200085807ce71445cec3b0561ef6005ae4210f3b843451b1da894b55385b1796693de4fb4770d35c1721e17d140220262224a63451b1da4b55385b1796693de4fbc171d35cf77914da80a8190874bda020110191e0a5e9a5094284060e2815cb0593d16c36e42847297f74381c0e8bf7def314fe17fcff839ff7e0e7bdc24b13adf65215ced68565daa6b9ce32b9c0c8a01a948ae582c968361bda824927a734d16a2f55e16c5d58a63db869aefb3c39a589567ba90a67ebc232edc14d73dde7e53b67adf9cebaa156cb0037cd7501d5564082440444827f48e42191af582a104cfe0f5420b860321a6b9db7ce5b6bdf5a6badb5da712c204924a734d16a2f55e16c5d58f6e3273e209147db34e775902492539a68b597aa70b62e2cfbf1131f90c8a36d9af33a6ca5a414829e861e36783c209107f26050e16c5d58a67d85b3756199f6396b180d4ac572c164349b0d0d92440f893c90247a48e481a0077a1a329a8d8643c3e402238352b15c3019cd66e3c1f75f81e082c968fe3528158be37c0f47d1f91e8ea2e3384eef8ee338ffe1f7b087a3680131112121a73451b1da4b55385b1796693de4fbc171d35cf77903025008809888900885b3a8f3b22fc318c31e8a489c50551d13c08181c1a4c0a02a0a6210046118846310044110042140100441100481180711e33c961e4d5d546c0f1fe3d3c68807e320aaee5817cab89c637c858fcb3ce673b6744d102239ee892080e50464082e1d61b2787ee8280408723a36bca5c24a22b14ed34e47ee50f711329d25bfba6348d157c93a0f47216488a10da58455b81580b74a3a52d921eb3423d631d516202c9a06990031ac9232d2d1638b1d756c51476cf7e8c41fbbca80ea81ef4e7c3bd7238b255025ab78fdd925b802aa1cfaf726b404444f377400f9d5790b63e2a117c8965a44e8223a9aaf5400aae0b07042c8bccfb5992e83cbbb59485aa009b8260413d49173c776d0aa6561de55af86692a9456e0042eb35c8375ff795dd2ded75636fa1c8bfd8609d957dc81cb9f0a4074ac8503e67b8958e375ba1c262d248d2e1c6b735c56c6819c80749485568432d2383b21fae41857334de8ed6b43ed780d5f6178c32764607fa2a7602cf3b135a0a8b4ad62102db6cd524869914c18a8aea8505e24097a91b83d4ac939af895d8b614ac29a482f905bbaf7b9fc6bb988af3c4911697a3aad3a9e80f0be0bb6991c6d4edbd97b01c56b7359679e253b205bac36085201c324536563dedd46ac04ecd5eea4f1492e92fc319ac11e7b998334a1c4207d6a8b105dc6451ed2736f3426ee0ad2d39468a2ec68b142dbada17cae6dcca9d3dbd3f274da2e05aa5a5b5268e80ebcccafe91a5fe66b761903c99a6656dca82d92decdabf4ba03ab09e863ddaba009ac36d751d3bffdfbda079b2ca1e2bac211442c4b925ee5f1688e2ca0aa1eb9aeea428b6bad4a705964449b9c976ba1f5d5da13ad8f60a89959a46958b265f6f0a671d3c40e62441f47a4d0985d152dbcf218e5ff272bfc152928b4f6ecb609917493e8284c6825c2fb60b7e476a03cc1a9a6759d0425fd7c134eee734684a2240fa2ae5ce7dfff670e46dee28022753ccc35f5bcb987332ed111febb76105a1e5887aa1e0fb37af258fc3a5e196eec4ced942f2868d10b37c144810ead1659dcc201be6dc1272027d813f48c9a6ea3ea05367a24f2a8f2afd743ce8ce72e55c07c998f3962b2aa8bb4228f0c4a3fbfad352da4d0da8c01defe5018578ef0c6455b77af6cf7e8c41fbb6ac40ec4fd44680dc0542249f866578ef9469ec483f8292fcc07f898af4f1277e82ba06ef5885a7250881566c7eb7cb926c7eba1a117807b82e8fd21820dd18b164c4b0bac8e69c652ceb51655902268c2a5929030e5546999e3608931186d7a9ede9ea07a5729be738a9ca6f5fab5a8ea86ae8229c9405e7e8a415b3fb44b0e27faa0f3095c3c55570ed00cb8d4aafec8460d1041e9e839b5c83eab2a4337d61edcb4ec9151ea88f3104235b25d77bd7a7e08fa1e1fbf835874cdd42c77566191350475a459559a38363bf4cd1b7320aa31556ef66a45605d6df768c91f73f519f4ae42d3c3f4d9a1ff2cf46b5253d51ce3d3c7ce635561077c235671240296970a5fe9685e47995fe3f58d777095aef7a83a5bca9656d84811b01226300c1e6de6afb3517354e5ec51aa361ee7b4d61c8d3f8882e5d8134a58b32320632828d06cccac6a16a51e6d591cb83f1c85c82166b12ba111a475aa35b831df886928c474e5309a2a58ccb7b48f45aab7852822879c6d66bd1d64d35daf9e6f346c6b4e70c9e7d1cf3e6a0e6322ac9db291f36505d109bd09a34c158da9a8866d5a104ba5be51a5614ac7b25ba431586df49e9ea5a1ba138aef3965046ddd0916a60c8b3b2197a29a917a7ee25082cf9fb4c2bc1b2a82362eb7bbb9aba61349ca2cf8e27edfcf3fcdbb7999d2b0a8508c19a63976c26c32ae086867421b608276edb43d9aa376688bcc911db2c5c32a3c9ac0a56c02e7e0845d76f7d2b3095c93b70a87fc1bfa91ec6cf3c4a6af9e80d2a2c6d5713beea76e3b32bd41eb63751ecb033ee62bc5e5c8cd3277749dbb7374169956c0ed849682bb5f8121c84f63c8bad16c0c53f3037c98389c33ac6e0dc3f4e8d37704d4a3027ae359615d30d61da7036dde45cd8ebd6ae995430a12dcba701208e80e39cb48b1674f0bf7c844ba0d6d803bff742d4b1132a5f8f89ac1010c9cccf42fe4595fd1d0f1b6637c81b7b018c9e1ba0d7db517fe037db807ffd288ecb626f796322529030706ee051906ae29b30fc26f012a4b30273ca18545ef04287cda9b1f2361f2f24f7822c62e59654bec4f80220abb664e80224af3408aa1980f5e46b0008a21bc3cfe18944547f040052faf598822348217910f0943660b4f9888f222f242655623d8e083d98bc89cf385d4b34cc534773717cf4372a74f2458b2d873ecc0bb4e28952c9ecc92d98a27a57de6c9734e2b9e4fc9fe424ec9524a24a625a46c1cdce0d93c7165542d5858d95d918a510173512fa7cf33956cc755da2894cd1357cabc50d7e1e2e90d3c2795cc5cc34cd00a1fa91a9cce1bdce9edd3881697a2a1e1d50c553acc2a558b796e59d1a43ed1a4c49d2e3ebb56b328064ec0431d8e54afb4fb064ec05bc07195d2274120a8b1b1810d61528e2512467e0a71996991716c3a57e11d86f58a8bd8557d8635a6b85c54daa1053f5a23cf30c912ca22039a142659d59b0335cfb0dee9aaf08add0ad0955896e74ecbec998b8b0acbb1e26bd8157569b679f102c6b1d00db19e103e4c1e9e56ab5ace67ed2f7242b55477970c299a5cfa75892c7289613a996e05c670c053ebd24457786a00fb9dcb8011ad0cad9432a594d2294d2fd57adf49f665e8a16ce745e8c4004cf60cc91e1ac8b0c614970ed12117eeace121d96333842765cf4b49bbbf489df304decce1fd9e04e5cfe4982fdbfbf9a5ec2f42e74ce2c9f912d9054ab17309e33b087cf5d95dd7d529579d37d875d53d940f77fc2ad2449ae7161ebcaf6b50e655df82b278af76202757f4e5a90acff56b30f51ef73518f32adeb35f8330ef95be06efa3defb5edefb4e5f83df7b6f7a0fe6eb4aefc17c0ddaf754a4ea7b2b3e165f0b4ff5b50b172f1d56c9a24e35f0ec53c7c58c97c0e329bb98dac53cf54ea59ef3d47f9255813c4ad93740254af2cb9c3d8c3032a2671f00cf49e02938b95ace8653b238e7e7502f92abe1a4475ace84624a60004bc20352129f9fb52626650ec2fdbc795d0c97057796905caf3d902ce9d7c99d3e56a2973e997b512d52522925134ff29065b1cec0c34d8779923235c106615053e5e0c99bb1e4b65ad082328aebc3b6807241a7200d8bb4442967673c1851aee43efcc2077714479b53798659cca17d8df95abda14ae464e86ba53123aad7889c64a9954b610e3ec19c5d362c954a25a761b19e405514a34a078d583faf0472e1047374f355ec3aeddcef74aa7e3ac1de87451bb6f50996c2910e79cec8eda6dfd4d2b44c702cd5cde4608a4455e165715574c76f3a09c22275ead43f76718c6d37284192c4d9f7c15dde65387380ea9deba85de46b57ad8b97438c00cbd3ea636b869d3ebb952f5b6fb0432100c2d31b5a049eeca4ecd0c60bb7bbd99bf9c81377e600d6dbed78f31309bd7272c79baf32f471c3633b508ead9761c8c362a75eb8d4a6666448599c5d0e9ebc192bec796896723ee16871bbad60e1b36935d0c91d270de943b2b6de99344ac42e95f3388dc659344edbacd5f838693ff68c16d17a67da84a3ad99349a709c453393e6221ce74d8689f855e164c26287294f815da87cec990b17324a5aa88bda0aef4c12c09ac90b92bad6b6aed2431de5d95dc8a896bcb8d1c14b9f4d48136e6609bc23f68a27959f55a6d1b4227b381791fc480af00e4f6d4699b4cea50a979f509d415376615c65748bda4a9bb540400eba74594f38da670b4db099b4929e39613126883b9d0bbb528e34b5f0005e38fb4c4abd9869b7d3048a04dae5d953ee81540b4da25caef08a3dcbb353279446a3d01ab5512ab4a80a35a256e88dc258e41f5eb123b133dc20156502820e7605809a3d497564edbd2a958bfc179c8f9a95df346d6f4179e53b9003fdf5127978784457dd09648fe844ead94cbb7cbd78014e2dbc9ab1ab5415d6456a589504c77d2cee63711cc7712c0e64b13890f57d9c0d2c962c6846038d9d968ac64eab860d172c64882b711563860ca45bc3468f1a34667880c59a41f67dac151f6bc5f77d2bbeeffb58accf069689652242227330643918b2a814559941164463468b869dd60c1b3bad19365cb0b832c455eaf489ab18302a6264a456b068a1927131435363f322c64a0c002b07c7c11000346adcc0986143c7756154c4c848ad60d14225e36286a6c6e6458c951800164e8e83210060dcccd0b121838e6ba7a5e3da697d1c43e28e54488832e97aa73a15e2a1139239804b859ea50831138eb28443fa91691c4899f08a8578a857cc220677648ed11a778314a1095bd22b1fee78655049893d3b8da4a91bdab2541ca449722785018a1d3f7cb43c7b0150a080162a262fb9bc318173a834692cd286e650690eb16bd67061b7aeddd050efb4187625fb080da5c02b762d1dde3934d3833bdab75f8cf3e1f260d7e85ee5d96f7c0a5025a7f3f983758408e9f047908e863b4aa41f6eb96a0a7fdc2b917ebc88c11ded37a35c8f3852d56af6a3c961bf2c5a9f1db33bda4e76db7b18f140008de706120b7884c49c1b453327b8a3ea258bbde2e7fb452f6499a976dc5aecd9533cac3343822bd9ed7d35c7a0fc4d05ce76476ba406fb7e54f66dc75cbb83dfd5552c3ae8efa33a0d8bd4393005d05964d57b4743aba299a826978bf7d3c4b67c2e1047cf9e6ad920f2ea276d3c364a220dc79bef709cceb9055b3c2cce3945759824776cf1ccd9a185e28ead565bab82856a84d8621d769411334f78441108a367cfb14187208211105168a620b144c82891888030b292854b17c929e5e4976767a09db92536afd4407bd6f2ccb09191c8e9eadbe3a03972c769f446b207c6b34f2bbc73729e5798652d9e523cc3f8711afdfc9441aed865d410421619f1a34432b2c133f1d348aed86d0da97cc1032c3fa7d111e4ce4aaeda5bbd627f7167c8681f6bfc388d64fb680211422061040e6c304e2350aefa013fbdd51402e3047eba94a194acee22cf8729035810d1122ed8787e4812736e74aaeee65440a47fb7bb8bbe12b158f4d3b916fcd5e2e18e62abbb8f451673b854138f34f1238f38bb5c977b7fb83d7bca6f6c50eaa28b228b6c45f79bc9e15d21ddd1dd43afb5a0dd512559bce08eaa981d6a4cfb41c67555d62ac3f1c7d30a5ad661b7b11ace48a72f1d26499d3308fd0ee98c0c5534bc622f41b9964516577047b11eb93ffc489ab2618345be21e6b89095d11d65122764c8ea852ba5586d7091244d55da7755f25d856c2ff985adfcf45abd2959ac95d608f110829193f8888fb2b016ceb9cab3db88384a4ae53608a5f6b2ecaeb1f4eef6cacc848f38b0057f31920e77e42346e298091fb16b4e194d5c294518097c18a2343f9275584a294367d1f60febb04bda135439d932e43c3ec8c49c1b3fb2d6ee9af16e19eef428493775736783327260727b3b1fc5b064adbdb753a938f71af24a05faa3b4ed40400d0ef69b5125504892463d8c9e3d02577aa0c03aec319edc511aa1d02302507af40e95ab964853c70d2c8a28b4e9dd2df84b060ceedf3967a25ce9528aedfcd3432a591dfef421ca0c371cadf2cd844a1cfc52b2586c26354b2efb4c0c6a10552a2849cf4e73d3b9bc195bddcd7dd2e6e8b2cfc0e006c34cf5a2bd3dfba7a2c949d52550ee12207fd1f0e315fb0c67dae7eb20aa1a872450a8f074b11d50786e482a343437f7abb7aafac6e2910dd784823b76b1187b17e3c12257ec513c6fa975469ebdbbf6ccc31d4996ad573357eed86ad9e8867ae8c77b65cf9e9a4a9ca0ba366742ac33c43aec2d68b8cc4c6613c9e2211e12129a4c246ba82bc11d7b68c62e0729993116ba407c820bab30efa709e736ba1be8a787d2a937984203591fee0c7968d88a69e23eb9cc61cb5bee5060cf7ee3c53471c7d6f3978ab17247bf919432c5014c480f579e7d88fd68e68ff5d8d7dd3d7b7673d3b9ceebb88eebb88ee3c28f45163261acc30efe706777b4b124efa7057fdd8ca51927639d19ebb0cf98e08e1d33dd703b980b214e26ebd81562d7d8b1a7f2ec3d0327e38238261df4ec1e7884dd9b813b2659b4937a87d698e2b2ec67c88d1d3bfa9193d1b083f50a7481fda6bed28c0e61a59367a73775f3357865b8a3b4ed984edcf1762edcf1161144088b4c6bad418604dd512209f1f18ef7f6a0e4d9533f82f00fcdb36ce97557eee3c61405d2f3f6351c276cc80f50481027bae3bcdd9cdd7e1349076fbee48dc9866ba76cca642aa21e903cfb44623f9aa0d96567d88f73663acf6af024cbb3fb300f0f1357abe0d99fccc02f36e24749f4d3a45dbcf9a6e4f1611df6af03977de489c22b4964a9dc2a2a2b7e8557524a165e9d00458d0372a72621b11cc91eef69bdf2942611c353cec8535aa3f81d95f7634de2698a7ab4739eb15f17f26091525fdd20f68a3aa53440dcb18a9446ed8ef548d53b3b6cd46b10e18ef5a81eb18bb35424a65eb97040ec9a992e3924ece26241ece2669c128e0b532b621dd8814211b7a902c2b6633217d43baae662bd53a98b40dfdc2e84bac71254e5c49c3e4154192d3d2a27b34392a5dced76430185dbed86c2ed76dbc2855d74078fb63252d81214ee875d1c8c5db4c7122620ee286f49325ecd1539789e3cf94744832bdefc9cf31ba5d28edef9e1dbcdecd95df4e1d180196cd99149b815c54a9c89ba9a05cfb6ea8373938f9c01a4644d07f297e7d63ff0865726d154ea98b0283ff54825a64b28918314d63395ac9bac03d997579778a14f9b4a9452ae5acf40c94569b35b2f390d19205fa5b0f2f052e54aa2238a888ea8cdf028994aa5b07320fb327130403c3f2dd89775209e57c985bc736ec10e88eafb88a157d1883916403df50e7ddca6ce793bd72103e4ab7300015e9c6c276e60e245e425880517a014f122e222094494e0033e68010532bc885c231cb4d003292f22281f58c420c5112f22a71c08018104b117117e020424a6c84106ae0240053c7ce045e4647b35a176087740064498bd88b038e2d5843a65b1d6a9430e30e8f0eaafd5abd9f5a089180d5e442e92d7342a7a02cb8bc8cdc18b0b45d6995ee4e5d18fb343561c410a1a5e445ea478715ee4d57de0529d3984c612a024a11711eee1072ebc5aacc3d5293b2598e8810d5e757e13595dfa98a1dcab86403cdc6a91faab761248f5aaee71053909745f55862b74a97a751fa65c6b287bd552888a382ac2ca8b0dae2432c246544412911135a2228e4a5c08645fa54e3af5694b39ef388e936d4d6815e6cb2e5d5ed63b08ff12ebf2e40002bc28139e942ef6514ac99e9452ba0f15e607e197d283f0cb6ea1e6f67edefc3cb0899c92553d707ee1adab5ae5cb7ae1943ab582330b38f9e73d4e9f57eafcf6ea73d9ab22df7206377314f9769f3681a3eab98e44be9d82dce90035bcaed6da27ead6039bacc05c7777d3d34b295c81bfb325ae505a9d7c4d6ff7990594dc7a8f52d843d648f271f4455e455efcd3f9fdb15e230917884c922f9733dcfb8ad67e1694af2ef404d4f8a6a7ceba0f417abbd7d705b79d67cb9028e90755821241c0668e788f705d0615fc373f9ee11d08b0c2e2a70b81b94d5b94f79fd986303924227e7e945cd82bedd15b72889f3e3d474e01a609ed367eba1c6f9480ae3f87a33492b69b007676cdb04ba229b5679fe150b5e26972886989750da03a359c7245a757029bd0d9a49eb87eea5396c03e6da96909fc29cda8ce271d459e5dbee848e40031cf79cf53375981bbeeb6f5c5862b30754a47e0c99b26edb384e9d12e5d2cf7006a0284e77d885fe4c5b907647679f087f3169a00e1793983bd4f52be6a036c036868299f1210f3edf239b049cf39b9bed47005e6bad92fd43bb4f65e21eace2b107352eeb7b287b26b368e5a5de04976b1271114e5eb749e21abd095300d406da88021b472a09e0e50bdc3248298f4494791f6e615f83bf7ecd7759d801abaf0f9a04ebba39caf402d577ba69fb33cbb8cfc3ea64bda551dd5a977dcb373d384fe26973e19805a205d25ababcf5e290b375a120f22994f01aaf8987670c7ebddbeaadaed1df96a796b5fcba60f454752082ecf4e7934e0cad7c18c6e49ee8b09eeb4723392ac05bcdc70b9a42d92c51cd251af68ad578cc41db5d17337166bb01d08e864f09ad635d97d09baad1667f311e2d6b2414467610e7714bfc51c8625094165ce0677b0c8be82e18ed2a8071bc5302b2cf5c379f59bba2dabec85ebd46192b0ac728c75d8bbe7a41ff561affe70478e89d389d8c5d1495f9d5d148570f2ec39b11994549f271c3739e2678b60dd6f601d902884ecd9736eeac6c6ccb92f3c70ab0f7309f5d56529e67cb5d92588a4695d35d3c31d55309871ccda6fa6c4498a2b0aba23cf6696d2e81c298dd28886b894f6ec92724538b88245ca8fa4a30a143d7b0a5a786e54e0c7d01337089aa4a91dea0d5a20dc244104356db0078b28f0703b1bee6891a470e08f38bd25b6a6385b39624b72a2bc37889f674f89393728987342c21d45915e3165c31d45cbe38de7398b38273c5a9b5ee7387dd53f5f02e341ec2f51519a7d77fb4220fb82710f06fc69f2f279e98463823254783543ef93b19d70c85061b19342e3073746ecb25161d78b777ed3f94de7292994fa0b683f19bb50364817ca840253143f7eb3efdcf3c00f85eaeed94d5cd3a9544dd354023db02718933d35d9e379e7a618a4eb9b9962b2e7fb709062e763fda9319b242336267b4a1efbcebd1268f26fc6ae6a448aec9d7f38fc3c7b67e4d9479ba40f34895bbef31195f45d0088f8ce479ba4efbc0406c026593729293736c9eabc504c92acce69e070bb7cc955983236d933bdf3c02e95beeb6a9282704719db77d3c71bdb775e03c98b50485dd7759deb6391bb2c7228f17b31bad33be7e9407b7b879d731e3d1c0576f573de8288bb43f6a8788e47efe4f08a03ba3c37baee3b57b12be73b6ff54e53ef6abeeb9ee3b183450e85c4c4dc2263e639e79c6e6a9f3de764e6c973ce3927334fe61ecccc3f8230733fa78298273bcc052b4970a72bc05b313f1629a5f38d78903cf5ba45ee5419c81d55af585401920167a44651b17c75e2a9571b2d7a2a7dbcf1d4e70c673562af46fc32c3497dba55b763e752e8a17a63915a619142b92a6f02a15a61170d2cb7fac8b3c4863cbda23c346277e431ea1d5b8d9e3a9f745cae30fba276d96ba802ccbbe2d9d480e4e06cdf77b43cf905487fbd80cd07b1f93af32828bbeec22e0b3043d434e314839c5fd865a13de69a23a61c833047aef349870d4db23a3554f3aa9b64750dd8558226bd4d333ee5b07919be144956ebb0a1c91eeaed364fa40b25e442adc026cad71cc99ece6968b2c73a8c05a9a3843806d40a66a0523a86d2686bb07cfb88dae19be6098c8626592d431bfaeec29a231ceed07717d6be69acab693625bfd0f9a195ac7e2a1385c596a9c9d0585c31b9d347199a4dad348507f3c2b52fd929a5a15dbf1b9a5a67a569a76151d2fc74a6296869591402cc0b20a88af9e17acc0f54756dd7b100fe84a37b76cfef9025a5fb3e8ef1d5293917e219da06754139ce47f65248a733bbc9da6beae4aa6402a5ff8b6737b1a94f0828f2f6db678bc576fae3767f083b097b893b7edf50dc5122fdb80929eab18a0c60f0c18f9773c1f38c4c1941b07c6977d658b70e9bafbdf421dce97c8b99123325664acc949829315362a6c44c8999123325660a1d922c2e089ebc19756a95766b89e096dc932d27d317d34c715b6febb90fd3394d545210ab4c2ad5874753d15b1f4d55deb2890a73dce44c36166ddfce7289fb189c990ee39c5f7066864baa5f57e11ea70284710403a957d63dfbf1cb8389e1528789dd7add3ace100e0da7d63b9cd3b78e4383ecf96a903d25af208c23d6b1ae02e9ad733092de3ac3b8f5ca7a0774471cd908e3f676745b0aa92271471c59efcc17e7302e4f0ea87e431c59af7066bdb229a41828b848386c8c24cbfa07bba38d908dcd90ecf9dcbacd0e6e43eb1d53cd647b6b23746d5f84c465c699b486235385e0e208f58edb7a65bddf3aceac77da86138e38b4b730305ccf618edc51666693c44609ca5160a39c9022ea0a2a8693132813d81e9e6e92655fb8a3e916932ceb9e1236b0bc751b47b2877a0a890643c19ae7db4827982340669737757b0a8b74c1b09e3a92d205830752b43ea6b2bc751b231ade7a4a267ba8a790546079eb2a8e640fca4de08ba34093c3b8f113183c30452961b14f5e4cb41844bc5dd1f0d6c714d24a26598c7293a5bd751438565ae3cc4e6f1d27885d2f4eddc6ae17c791e1c084e0f68f38b25ac24df6d47ccddb1adc1147464d5794b068658458b42e3363d13a922b232433a3a0e9c6a2f5099a8e587c81a7096c04753483b73e4fa8a36e9431644f3047eeb4994996750289b75e53247b506e7b87b73ed22479eb343a6c9e968edebaf7c578eb25196fabf5d1747beba69ab5f79a6a3545d66d66b2a7ddd21d7064666fbd63d824cb3a0d1cee88231bdda6a3e651e1edad373834b6c016445c19426e7b8b237beb3832d9c33478ebf3f4854072cc3785a26459cf91f35eb8e4ba55a96e6871824a492ece2cc491b168adaf985cf61147a7f6a2041ef5588c3f9fe680bc7f9a45be9495cbd37a84840b7aea1c08029791a8c40db655392e15cd4c00089314000028140c078442c1502c1865a050fc14800a7f944e7c589c49d320c66114658c21861842080000006208192019a1a406319905401036448defb1a12fef12830426bbe599e630c354f41583f2dd27bc1eb3030a65b74e995ffee32f302cbc548a19d3e76cc5ec8d9fedcbe121316920c2ddc14e26c8c704619068cd2895038b64ef9b69f4f2df0df503150d7b822a0e9b784b60bb386251599c1c08d19034a1523bb644ea7d65e4e0dfeb6ea996371ea94fb00c4ad9e82f2376db1292759c54cb5a2e162f2212dcbfd3845f1d1547b979eccfcad416fb7cf1701d21209e801b1af6590eb1f075cffed54da0653d9813e2635e58bea29428119619d715090f964f637a5dcb9dae841b19ee024aaee06c3402ad318447fb70b7b59b7cdbcc0a8a0eaba6746be8e111642efc9aed8584251a8f39adc295e408bb91a3fa25a49c72fa5f546d4012a3f2d1894b0266ed161943ee8928f2ba29faaf70c9dedf7a19c6b060b2ca066723af53cd36580c4c8c083a9f2d333b5de0fe47a7e55509304369d3ebae3cf347c06c6f600c187c884736c5a478fcba5ee4bb2497000ede0739bc2227221df02d8e448f6ec8e9e1bd1ddc65cd159c6d448833c479b75d0de5819760644b99d47d020c4cb48c706e5d90be93d1dd1a282b316d44ddc44dec1c9561d3d69038dbcc0dc75f161742c5068678f8695c37e63b47c8fe0e55a7abba338420cb652ae3e2ee463621486456c144c671992d859cee6c577aafeb739b848778334823f7802a1848cef6a0a725210849cf0b32c07eaa401b598420863c3762454622832d16823c0899c06a374bab4f41361fd02371e1eaf8c3898362a2f28619202f04f142d2da060ab9b106c713e37184ad07f15c347415bf71270c08801d2482050d57707d3112d2bd6db929668654eabfac2908fa73f0ae7e18167278708c818116829b5492352e2482cd059385da76e8c843782758961666b67b426fb2c710bcfe0abf30fdd133a10f671908b85131ff9cae2aec1d40202f0707bc55eff10828ca47ddd0a015565e7d7a28242714cb253c4133c34777f343d0e4abb65093864b2d23ba126214ec42248ab551ea20db345ba89baf97389a369a1f70c966ae7c27a5d1b02f04f8a1273d0ecc9961ac4857016f8c83e13c2baf3d3846af08da1aff82e6d9721fa25f551a7b67cd6b89cab11ce1b9a7459219cab6f17d1bb13ba60c6ec054d2426607bef867ccc6186de2cc88fb96524ec2506dbbda8f7a7bdc255469e4c815a31377893af210191805c9182c9a6bdb876b4d6c7a55f52402b099b449da292a16dae77f81c2a870f0f12238d585c94445af8460896a8116d45c54d105eea0fc783cb05dcf5df58351802a8441ffe8942811f08a5f09d20aa2c61c7a4bc813e65782c71df2033dc8367633b3b0e882833e1c119210e3d94d60e460321a43d6af92b353856cb000d2ea06e9a55a6e3c79e28090a3559082169247df9f719c8f1a1d59ea8d5cfcb684e2efaf2f812e7aa3393a8ca823fa20ac2e96b37195c52f7668a90851aebcf6cc120b446941c2f02b1690d933651b849dc0eb49cd35824260031e86bc6cda9560f57feb25cd5186b86cbc09c7041889af0459d041933dc047508b0122d75371b529616dda18a2f3da66d013c4f99e79aa1fb230736eb5fa56aaaf041cfbb669d602d2042911fcd777649a2556077d6ec25d80b0abf16dad478716fc5ca2b128686cb2e71f968df6d777bc138672cdc1a5769a31baab268341d2de375859be5d9508c4c43c1dc3c3dc5f4e7312ccde78e554a9b7367e6ea5d14214282f89ba98e63f72b480b78df5957cf5b5b65e492e520c33d76575d064103161ec669244d76137db8ca00a1d63c618f120f9c68553a403ad430b919f3f55b55e7057268899865a72a6444b2ab3d00a96589a0c8f9c3291bfe03bcb3479346a132a8d71840f424552bc1be4426e54cbc56f0e13d9265425488545e1edc119f3015d34011551dd0cba8872876ab720ed16997db2608950ba40d271c2f23845c43cd12d8b5bf03868e1decb7ce626ea4c944c0d5144004e9ff577c28b78d4cb07b02c60cab870ff495de0382e7ceee3bcd8c138c4e4a2257f63ff66310f2cbfb184c53353b5df60745d52f05c0f6ee7f76133d188ccdeefa6d169dd2b69041df429b6de92fa0fc3255da0326ba5b376fb97c3fe4df8094154d14c7ced0876f98068dd801c0303450503d361bf741953a681674205296a40073346f7b44151f19c25a4928a7550a8e921d15a6491fa1124d66a24757a39697db3765a1ba6e3fd05ddf2c9aa11dc214b0bcf6ba121fb4647a1befa09fcf48a724115978326bb3e7049ab167dfdd084db62c4af26c45bed7f0f487dd5a9fa3a5528fc4701e82299b7b2027d66f0c1913d69e3f23dccb7dc44ac0ffe30a5da30710cdfa402f79394e80a82de8800dbc5e45732f8d838f83483043dbef02fcf45ecec0370a56e776f2e9c8699c4d414187c61f610b90c177131919102b451664d65cf1da87836007c321918513f6d0948006e90077b95130c48ace0c4ec72430beab089de4d024e11a13d0f893877b0b74b84c69c85c66f33c5922988d62216b96c92e0086c9f532df66757371ac2a4605b5628eac2cb180d0cf560421feb43de16f73591f7cabab8f6e5c1e4f8501d9aa98ad8a7a00c976c3a3016000a5276fe27adc3860f39d426df3f208c151a3634cd2bb6c32ba4f98cd9915544c5f3141133168380ce2eb67df35fe622f22dbd7e70d391b06c8450e708c65040ec0132f8726f1bd8e7e739033f3a04b80861d0d4a6760d6afdde95c46a360791d9a70091be162d5476a81f272e5c5e9d1003d2e0b0bdd901771d25d42b520ef1f88297108b4062ea331773d6a183c81f6397deeaa74c216390e045b18651f1cc00c187972bd4e6b06d459e5a8cac8334d0e0d0c441c4154da8190d844b1ef6ebd36c0939f4f91b4fc351a8951155009a26b52bd071615d0cbdcf479b0b34190db97c7414583153de74351e4ea99e68d9f54a424060a54c8e07e079437d2c40ddac18a24084c74a9f625424faf914c1b01193467a599e38769e52327f1266cc9221dfefb6a6cf8ad4023bb2a05692bd1a7e79fb320f8375b358609f54290d18c69334b0a4ba213ebf51e21b3c7b07cd5f8747813e5978c2aa493625e9692f0c5b48a9dc74e1510900d51e80ac86d0f8be6eb8b7e9af00ca914de1a0f0ad484a3b83d2e48fa532cb7df5d667eccb0c2e481476286ae8e43954a2f3fec01ac2835378cf8e195e1ffc31e8119c9c196af406442bac7576991158aaa8ccb3ab93313bc7f21f74cf65b76b072378db5dac523a35661db3118b40bc57358d3dd658baa4a102d1936f7ea80b6442d146f46ad9f86d50fd3a144799c63b8897fdbfd23a1af479405ef4d7a50126a0904ee52ee729da43348d2780ce9c8c7f57a0a317a119a34ef62cdbe2665d890b83252ff3929d2b8e45658009ee259623ed51f6d82dabfa8eabb102653b379205eeccbead9b8039a302311b6aeb42c15b8c86ce907822c1d7a05537ff1f9c0f77c940e7774ed3279ca7bb135b1651a0e729b415753b05aadad0281465e1a7833e39213a1aa595812223c606a3afcf94c8fc67a27027a63e3d1637fc95af86eb4ca5a3db4e2dce513de8cc6d1bf4a4a55b8c97adbda46d83b3ce93f81becb8ca11209cb24fc72269330a698b73a043def020938c83006babc6483ea1adf28a801651fb38c10c78adbc374aa1f30caebaa4ad0839bdf0e3145ef0e357dbc7a461a64a4d788e6d55b90de471d6ac26e9ce50c520350215ed880a989df8b9d19b2d42be42ed00d2da672011653a4874b4b9cccbf6e762db363778f221ebc871d7da276f898927db2ad3bdb0211fe22052c38a7a58750300e9464450d2964e71e6129ab4cc073ded90a5f268c9f5cec9a040d0af887cd04198d1d46cdabb203981bd53aaafe151612e066d7dd6bc611cf534bbdb2d346b92a3230dc78c5e7d40c3ea3a2093d0ff574cd2ae49e0969b7ca909b4263967bb1bd837db1a2726d43320d49413829674539a389d51be1a09ded0515438aa499804a42145521ae7008f4b7a4682ca7bea9b821ff4ca4d6f814424010eb3eb10bbb4e52b93f42e45bb5fe5cc0bbdfba9f1c0f1dc84833f6823d7a7f7fd61aa142cd3351a74a382e0f32ed47c9e25007c2d8ae5a0acd35dc76c5f335e24088a846a65ef80336ad651f9a71d418ffbe69a71963a58ce2f731ac96c0dcd05521ae47a10e8599241e0f684afc637fa3ce15cb14a5772b1d1abe38c73e5dae7623ffbc400d69af0786013f4c5d4149dac768378802892fe1cf23c99b33a855266394b3a81f5c36cdbeb721fc6a84faf377a86ef08c45c06e4381e7c91ee7ff7714242e0f1ad0226ea3b38af38f0c331a20212f532dfafe28d9d4108131ce69279be4e2c127d6e74851c951edf46e30b0b4ef03ecd42111618ed4d45b1c0e5f5a0d688b34f6931fb22b893aa3130df127b5e97405e261bfd6d18b215dd8c49e362fbacd2d2a38e10340ffd015ed190d72072bf86979c98133c06e70ba1a5ecf61618dcf3156c21e330d80f2f3414467059f014382a588e811035e1f03c81ff702c91aa3c931acda5791e24fa0ba1b29ec597e39ab6cbebe5d6255b4e12cf102ff588ece335c09be9194649da047b9709772723753fe5b4722612db51492522354f23af251c7f218f9af7c94f017f889ef85c51e6d6ca29bf81f19845a586bf767eeb60895ece8c8cfb3687e1c9f7fef7e3e9122bb73431178b1a24ffba50ddf1691f47eac958706cf101fea672ff30ac02e3e0cfc50f55e7d4058a00322b647a8da13e58ee67666c7e0dde96232b84bd8445e6d91485d39e18956aa95c66f9faa152222bde5f341e2b3119961d161e95ffb50a87cea4d27f0f93e7591ba1e3248650af1eb5c134c12f653dc49510f7065f7c364517bf07a5b2f26284e180a9d9cf1e279e8ef54198fd38d0f12fd5390a45c54539cc0a87a2fd4355e07bf56cea797e13c2ca54d550c03d74a50756c0fb8de2107afd4b0c28f9782763a047cf72a74b00b03a0d7ef94c4cb82071dcef42e3b00a93d0a85b1240b92176a77cc164f4703543a0fba4da912d81302a8a00dae610ec388ca24bb4507a02d8430954011c7e6913faa801e82a210c28f73dc9c25165e8098f8dea494218ecf283a8bf9bcc2924ba634be3b5559fe81a3e01ab272a4f447f011e6d36c97bfb000f7a3547bd16fe2a224b7f851d026fc4c6404fca3121b3f010975ef756ef85772afdad9160d77172eaf1c0c72e852fd930b8a565fd7b7efdab1b06cb49242341798adacefffdc4d912b04ae9ce2700c822032c722a4b22dadafc0281983ff49c978c898a605c52a9a3378e29df809824b31f6a90c9d1ee71966a13b1c4f12048841b86da7b7e9b3d07332af16317d53a8fae40c6523809c217028330554e18d5feff83c2a965ac9f22e4f5cf2d8cf85c0f616b5a8e5e3a8875d7b87bbb08516f92e8cde642f30165e94fe3831eccd01c726b1af2914ffc2613f90f8f7febcef0344822b7c679d14a010c1b26edbf2b7ad62f430dc4b6762b322fb711cca571a6221eb238ac069846750da0a4fe68ede68a6bc58a8d60e28106ec94d656d18403644ec6da7bfc6f8e96810e27add1c53aa3d17b2089a930623207c4b2e0b5a7ec7f9de142f7d3df0c303a3b1912a21873ffdcb83d6f3001e7c966b5ca05067cc781b0c772e33f6cd25a94f25ef0550d68cc8b1128a254e12ebd7aefd43a23d55ae630f9bb5b22f010a7ed588460be5f9b83c05d82b3900725e730a477b2143474ca2cad9f427093fdeac1372c2df731d67c4aeb9393f325f30e36c17b599fe882581f2d13a162b605249719d5ef236924de903ffe5f5693c2b1c98342401ac113ff23358e1bb227f694532d17fd0515ac2d9a73f08690fded614f195a53cdd2ec054dfc2b6684ae181ede1d256bb213be80f1ad0d015eeeced7d54221741ba11664ee64c2e0eb1fd1f1319a08a193ac4c5334642fdac755905bf30a6bab28c412ba1d3509a065906cf2239e0f99d7748db4aafc7433d37354d8c8e522285c28e0c1e9f07f14defd55c878ea647c5d469ce7052b82c960770703414d2a01858eeb3fa0b449f909acf9e8c3757f1013bbb709e5d534b1456e07e9028b754b3304396320a4fdb1e80f4e74b0d5626e346e1d8c4ab139f767bd1d898ea1c5acff74e6016b34ab59158e5ec315509f805994cf21b016256393ba37b5baaa29318943ba3e585bcfd4ab6c67d3171d4a62f69a6bea02a6025b8935631157141e94830b11df22f7ed013f8006d30e45667bbc7e737232cb4157629416885cb8d895e619f0da7c40eb27c8e32a837582d8495260d1c1e72568e8647f13e548bc8d52be306cbdc3635f79f7fc34c59ef4fa1ae19440b84f7ae32b28d05aad8180f5276b6742033b184ddb5105e5194b7591f4ce2b3a93f2a1bc95013a8d74c54617499d9e202a9a40a6c58e37ee571cf6b1242be2d98faf0577a8bb6b2f31a6943e2eaf16966a923354dccee67a726726d169504075a5da8582b300147365fdf019410fe057ce74219ef828589a893f99976c1cc01b998c1052d6cce8a89809659b97c42c87fea3ea4de6261b6203afcff489222174027ecdc80256ddb5d4bd6f25fd54e375ac07105cf2fa2d30222591a36448d4645aa9608442be91e0ecca90342ad95fa5c523c7205d4a1f029bbcc88c16187fabd01cdbb70a8a8aaf8dc8159915717472874c1a69090d94f42a28f0f0850fea5d702258fbd2f544d84c08dd411a8578858d4c00d62546c69afc070106e0048fc58f96a126d04558fbb6e7fbf7545ce2dcfba795f5353cbb57c68baffe05a3ae89ea6c139cd19e5b277ecf68403500d3b860306892f2aa2347d1a16ca1e2ab9aa833c7c3564463aadc2657e99f2c006e3cbf79c3f7e5782a7a80cb5e4fc8078210cff50a1e8e5ad5d03b154ec2d2e1e37b65606658cfd75512f0c41f164486982cd1ef3b1eeb8c7cff3938792056725b63a03a911ff215d238203f0e52f082691ad199df10d1bfa2233db5d76100e6f0e77e242a14e0354721454ce068c15942096e3419a2075504f1d4424c0ae00fac9bec40f89604b8fbc09111c15850b3182d7eeb28a7c1ac897e46cb89da1784d46a0c91fc4b00af13dddd9989203aba8fcf925b4cfce0ae4410645a3396fb89e5cc86280f0c8095659332bd92b1ee068580ee403b2d3940aa95a35c60103f5112822b84a24660c6292148e53943f88e1e587ff232760cd3f4f3d3303c20c081494b4fae5049efb32e6849913197feabc1a87f4aa5961d67b8bc4c28ea3ba85152de7b89c6eeeef015e3cef4983f2487502c95f0dd3c756d5ca2bcdb04b2b2ad114db5c5f614a8ba255ce745d1c0cf6dc1d7925863310aec3330b42560daa8b35cd86776214a6f23139112e02c15d79e300d6ab707ac65d3199615a95f9390aa9f0120932a73ff816db9f7b536a47ba4ccd3532213b9f3b0f70105d4b0bf4c3ad93960b862627759fda344609de92de5eaf679d9a8e6656f263804708e46a64ec18f57433e4cf8861be201b7df271808db7d312d848cd054343500ef7092fb62e55ecbf225922b9cd2fc13d2ad940808ebdac3488dfbadc173ae1339a43dcf4d91b8aee49adbd1ebee350a22df2ad11e126e568c29e635a794d0c7bce1e68c3c70c50a74767a3c9198eb4c8125ba1148dac8be00f716756cc76014573e9234bdea10ed1269a04915c17b10386edea4336ec802000774d31fa710fcef3e56458e99f76ce73edbb67f8c22f82ee9c314c31ee86218d2e62f709281d92baee7b7c9464cb1a77c8b300aa5eea071159c7c03835c718849f99973405ec5a354004242b1a955fc555522d26e07909e99f5c12154eee39d83713f7bef730602286882e8b9786076be0d6916ca804ab719029de290fd8937c06ad65cae46dbd963aed540e7655f93ee7728dc26cc5b782a45c66e706888d967f5aaed53bd8fb750da1cdf4fbd8936afaaacf342acf0cb64f42e005aa016945a13564f3a3ab3bc954883b06cdfddc6d6a7e739b83c8542e167159fbadabe5498a7cadf8b0b80403515daa813377b021b029f70b6e0a7a3d2864e03d09c08a4f1c26b38da430233490180cf9a024bcd0279d2d33cf10b97f69b0fee463211224f8f82a9903bc1ed39f6a827e55d28f8dce6ee9d048e4816934a5c50889c3f8ae37a9e318ba1273f1a15a906389673e10d66d8d7f86570ad994cf26f5a46958a80c0f0c14cb044a34d571cc444554da8d80f9f0d537dfab05ccb8ab68bc27c81e41f267dba46b709ffd4138999d164e09c8e43a657863fa657ce061effaa40400f7c4d401700e098270ab9b6fb3b38ee155851d2eab721c0a24e302cac2b6706d4d08e3a7762014d0dc0c1fa1f77ad827f7477b09835f2950d8dc3986bb4b7f0cadd5210d930a784efa99c672373d2c02e61c65fc98c10ad89733607611a05b5518f8041e2077f58f82bb8ab38d7a8d645c4daf8859bd24b4cd41a835ca0be713e35104a7ded2bc0f8eaea7fe1fe9b48bd69855ef0158bfb80f4be53c5959b465e25160b2b0804f754057b90cae7e952fcdd52891e91340387d294bcfb0c81ea6916ce6e82c57ea7df921cda41356b44d79d50d0b9e1cb5c9740b0f45c36551d0556480377fab518e97a47684d93e79b4111ff8c9deb16f4a86b6a9828ce088aefb05110b575ee7bb2f37c4eef3a0f48d802ebb83ea0ea18573bdaedc41888d8a8dfd12d4d71f739d502e341903e9e1299cbccfafd1629c75211f629ce03303cb437aff636c3e7ee52facafa2d5dea230d3a4146737d5aeac633578d4ac4c45030eeb7ef2fc803766f2762d119072f94f10b4f22de071d51a02b3c076381e68180404f64a409c5c8e2f0269ce2e050855627c66b91a4062731e29c0e2a3a8ef0513a30073b19c8b7195503d105bc243c67d471831a04b704d101178d303be30d5b3fc5d47d97a1ea3d5949171fe67a9ce9275e8c55313867aee0468fda23eebcfedf89758933597b97cc8e8c63310f75d6a62b98525c97f93007e7837f14b924e3bf798c1a9ce7c54d8b9b886d064767c778053d20e8d3cc1cc77b4c370ad64527ee2b4caa13d47010d930001fc371a756dd04759703671112c6992d422e4e600ce5a2186e8d8123f9832ee58301f2d4f0bb7e0299e41932c207bf6ffe513ea40c4443287fb839378408c9cda8c512ff79a52d636f72989f61115815e3131fbce193a5b4e79b8e13de2e2d7d426da130e34490cfd99017bb398df1c10050877eb3456bbdf7868c94ae8bd47dabf1bd2780bb60cc0627bd3fdf83d296c5ea37f705345977d5be83f01802036d9ee85a1072eef3566c04cd982f753cae579b6daa3a01c706663259a96d26a562852e4aad7666e8194f499b8d35fd786e28b90e01580a7ea83aee270ba3c40e45b6a921166f75f0f1ae8310a17542ff37b3967d034038d834c9ebf8ffa5125a5531a950c803a40c9956caa5087d3b0aea556870572b1a0230abf0462416ea2691813624a2fff061c6cb533870c2671572ff004be2259799b53dfac6fd0dee9bf24c57ba4694ad61eccd7828bab00909ebc1243dd66283dd4676a16de2def7b3283a7ed8c530dfa212ae77bc04c35c819b5ce400a00381b877d673c07ef95af1b357529f3ada068bef171ee25693e15c3e0f10d51703abd3d924ffbdd053951a16df1dcbc0d455c1970260aabb4fd85b7f5de41e3b9b16a39611241d2d3134d83e6ebd73cf331468c9d5ceb8bc5994b10ef4d6a546ecc07656383072eb0c54428b8dd017fa4d9668381da54a80a0147e362571d0401b9714c1f3524032260c63f2b0cec9bb64deabaf715ebf9416210a63969b25275977b1794facf7509ff54b03dd1536fab4c2bb43f582f559cfa81a5c659d26ba3df5be9e73e9122ae6a4400d82ef0a9d05e04b89ab82e06be38b8983282eebab7e39cc461cc365c33d72ed502f281c764321ef8352c3aefd87cae6d2cd4462e5bafa88e81d514fc5020da596a03ec15afd5fa17309f8822e8e8d92a303ee86f3ce05da0b674e33f527a7aef3b34f30fbd6542b34a5223fd5076d23d77d00c482c00a69aa2f873a8ba3ba231fbc79522c08d966b153ade695d8950ce04d5424bc5b5e0b7b435269b18977e76500af9476c806634d305dfdcd640836ae6177c08931743bb011a6508468b6d70706005f15df692f7016389173ab37ba7832d44140fbc6f8d44641fb0a005f613be1caa7d06d13b45e405bbc4232499b0bff03783c28ce20a87181ee534f256303fcc4f21950e63f7af0c4f0d3596f07f99de52b5c4d0c96139d5fe7e8ab12f39908716e420216caad7f742faee4c0c0488b63c0e81b07313a60bee8c3009c9d1bcc1538bbec7847bd4da53bfce3a8e7a2a2ea2e0f9619694cf1b7ad70d27b3764f5739229eb3d49ef65931476c98e56dcf439f740bb6454e813eb0e73f30f600dcb1d221f4d2b6d07a4ef2aa57a662c7b3e8ef1bbe22a4d6ddb9633da53428c207e196f441589b3284619bb50593a473eda21f61bb3d0ac98ed6746d84da73de581fe8898db6bb80120bfdd194f05c0ce1060f8e0391cfb3b3be53b7289343f315420dafa5cb1f0cf9ab635acae0acc7ccda7edfdb4dcb05187d21c36c7369ad66bef041a32d6e1e9ca68c5e881c7033328b4bd57fde943b38dd7d2616c328530cad725923af991c289e822ec03ae001415e1e204bb53d62a65dc0e6c4e7a637e1aec81fcdc903c86d804bbdbf28869e83a2b27f65042776a78bb4859305b3b003c02e90289e11150de1d5317e76a506b3e19cc072991cb57466744035c30c22f94ece8663b70d6f0e4f023a5b1ec35d9c445ca6348848b7d56ff347226c3814fef39470d717b4d6a8ca800f547a239ffb2f73c4d3c27a4099cc35937041beb21b88e151fcfadaf368e080cf8fd0c1ab99390afb59c2ebcf43ac145e218e0a5d361677cc03e260daed21a86c064984b16b87a07110899169b562d7063c06e449a8f48b18c7896ffe76963c6c0213f2d15ec263184a7aa0fdcc8396ec8fe9c305c3da2c584fe2ab552412482e2b7067d3faa3157671fbac8b3995bc333aea473c54c0340dc5df644f4de0da9e319ed144363fb80a8d1e4735bb816d3c9a6c4b7a448c5e6c81f4161cccb909782aa9ba3c12d4596c2fc09d80ca8be000ff42e6dd03429a324b178dc9bd3fdba006a68f1e6e01c6ae9ee78a09a5bde0069d482d513163ab882fbb8663e26d8c8b309fddc33b6b92f38d1851a23ed88f666f6f18fad981f824e95f8c5bf8da866b24ff48609fb9847c31ee4e76fb45b074e111b53eb32cbea9824023461c3c5b48f82428194191e45d1312a9ab739eda8c05e4aa15b09257fe01c80aa6d30c0cc293055acbf055fd2c86f32b8c5d5df2ab2375ff346306908a50247c53e1b64ab2856442dfa77b27b779cfd17c125e8e7e37a24cc37bd147973d45a52b89c5ce7f8363ae1edb7f2f5db0d0bcd8195b4997e798bd0b5f9c5adada562a5dc115e63c8c2be9f34145649c0ccce8d33ba8999d243be75009dc5ca4600e623d1982905175e2ba87f58a2392a32ec9b207de1ba4d52bdd23a1bf883f6c4998092e93821e07e806f08eac7f7bca216d990a3a83220ac10c3521c1b05372aa3741a284bd17077873263f72758c5d6a2460f79ce8e0ea7017b31f1dea745de7491d762ef3d435904a4c432ec05e0deea2c5eec9216392ae162f2407c38ea91a2fd55dcc98d3e793511981e2625464c7a36164332740456912236610bfb5fdaadc5cd4157c4da8f6ef73cce95be89c8dc4be8e599e5a18270a898aaa7c8c541a4bd840eb6b5d1c5e5ccf5acfcb2707b7c56a2137411ecb382c8cb992b489ecbda29ecea9739ba555ce29774da16f219d65ded17174560b55659d6464867130971af1cf8b6f2ab5b8e72b36a77ec10331c56f46bd758767799c05c58487ed60e6f06a509b17beff363186aff23fcecd2734136e4a4e78553dcd9b448bd83fcc4e36e924a01b8cacbf5d01150915e0027b64c16d8b47cc2d14d81d83be6610a79c2c5f14ef70c4c2b10dd29de9c4a11658816b5fa2ddf71a712f66f44d241a6b80a26904aa42d47713593a4af3bdd7e40163e749aaca58d1179673d43938cae0ce03375b8a74a726d50999cc3255f8140ed750c7c8faf29f2c86cf3052ecf25444883f339b400e875f846db945a9fc7e7a60d9f2073d2331da21cc439d6390544fa84d0484300dbe4e022df7fdfa0010150164ac428048130dfe364624ccf5990c5f41589c8adc6e81f49e80fe544c876031f19eb6642bb29e47503c5424ec019bb625cb26d9db9e492ed0398bd24713a6baa39fa9a3a8d73ceac9de5407df3b5cd95d14384710fb74082bbb6f2066adc11e51d5172574667f79ca79ed449bfbb132def6f0cc0aa2851d569d7e06f6c8015c7de8dec499ced5358d1a8191f0ab47c56f0adf6ab0e04aa88057c75152d62c4500e1607460cf742a37fdf00aba4436c8818221bc8a004832aedcb5b1170c89191c63c8dd9b3ecd2a68bc9df8284e0cc77f4503ab1837f3d23b931fdc3f1a5d04d84bd8ae693d8a1a4b71e41d00d3650c5e060d7bc440e47248e97415f0c3a2eb59af743cf883477c96041d58700fb6cf7450035a935d01b2b48a10b5a638f3ec94917b1c61633c1321d09564770e2851f0c59b34000893d9413382c4274514e9a37294c1ea519a2cf0a739511dd62079e711a457986fefc27a6d16bf739c9a4ff8fa589ffc0efa645378ecf075f050e40716f109050bafd0199d07a9330e0fafdfd033c6245258dd2b189e277e644845cce58d56cf303e6ccd6def1ce491a1d023a83e27a40fc60c7984173e6dade05aee1549e9f61cee0320a871884a31d5b241c33ee0461a7525308010c50b6ef98af8939a440ff2e68a184a6ff1e0836f234b70d74f9afd2729ba6d9afd3886b6044572d5a81d8b1dd2dc3a105638c2cd2a7840f8f890e38018c8d0332fd3fd0287a7309134a22d61f9f869db02cee3d9a369ba9c21c7e636b4820738f6726b38f751438763c14366501f64c83334dea8c42da41ddb4e12041da87be5319495d3934134a8ae1ee0f7f1194f1e69294722d8f4f2b0ac01a8dcf88652a7b1c345c95cab805acef02f2c6896cec16740dfdf3b046d3b7f6c9d3fffa73dac3c280be29d699ae59423a430bcf2f894573671a7884b16ad0fec79418d2e9fd5d9d9118a710f7d9ac08432f2be8faec9d8f2c523e99f54be687d86bb666ac31372b41a0344698ea8d7080d2d42b3622b0fe23c1d25134714d4a60d6464f3e8d4f0b519611e23075535c62e798884b055c6ea49c1fedc701b0ea2b81da7b8eb8a115c68f8137fbc9d7cf71d7b3b2fc42b27f3c5923eaed1a90c7ef81f1deb4746537ff6744cfa9e3a916f0935fe4657e7096df92b17c2b9081f07150d505058456e686e770b1fb171b0e8a88e244144bb30e2d9cf16fb8da2e82ceae718521584a7e9b3c4e3b020c3e47122c112e90cd89918c49e14eaa26ba3ee68f752879a6ba276bb3c60404c7c22a7f39b5dcd8c7783f84dd56c3a68e55534f92ed47a722cd1fefe60a4fef502be420edefbcdd9b68d98302c64705fe0582a1f7621864da63c459b024a191057e3f2f9dba90f982fd9c46e97d4e25fe07c3af32cd589365ab453dad97b97d60357d9fccdefbcdb06809a4af11a66a413bd2cc82c1eacf2ea73714f462de47a100448439b22276eac99f891641035ae2c7e16f87a07ce30b9b590ae06206278cb7088b4be1ac4de741088765904b177e1b9544f2ffabfcfac0e7dc8521ed468c8f0f0c1c3624904151c3f21d4253218fe0b92e60f4590469bcb7f1b5d411e2b5ba0b29b44936249a32d133996513561468ef83acd2f2490a1ed23fd3895ea1506b7b747e39e0c0f7c5dee4ab34d6c70d960704fe21b36aa2efddb72f3b63bcf218e9912a90b78e8e20886ed72608dc5bfec59a529f388475f0870ee5ddf64f85e37cbf5bdf603e4aced0d0770f608d3b79a9a3f6e165e6b091f926144f3122dc7b131580f259112d023102bba0b7038fdc0d590e4feebb81ecace97615f09ca1830ba5f1d0d54f03f71e0be2ccb48617e89849c4f12131e5c99f8fe9177d286cc262059793705af3199238ecb4d3f762e7c05cca16d146e2416a294876150ff2f26050b8f0d2f3a2a08f0507c59865c5583069502e4ed70c60e79ddea0aa1b8c0bdd1c70495f6701af07ad773e37ac40ff7156ceab88165ffc761a766b703758aa914b3eaa52a89d17c0d4dedc678a48ada17cf8102de9df687f9d2f7ef693302eeeb515623e1cc5869642c740c0126b943916998ff9284c39471d4a46f4dbe22f96c1f72f3181cbc39be8ce812415b30c084dc78e962d07cd6c68d24a2fe77e59c1ea25d115a9b02a4888fa39055ad8494e564140fbf98870d2380b765a11a8f5e8b5183ca5ebe7f6ebd9324521868bf281142c6c0bf5efd78e03636f4f362e82d7a0b803436f7edc6d66c78d9c2f0932abf188da09b32e43392ea6496f7a50fd5eb2d4ccccc1b58d2be1d0c3318906d79949282cb8ae5b5ff0e403ce8049a247af3272c80f9150c8aceaa99ecc1243d11aee4e76e02bfe426e6c57aed75f28c4b8c99a49caa7e3da618cba4d7d1d3456daa2cb426ebf72fd34347f3c43388f929ce0f9a70051c18f1620c8680aea6038579b408a147bb7299c73ba44351e3a1444ebb96fd2c5338c45614f614de11c612fb68385ed0921dad802c22a68ed810f3cacdcd639426265e01b76305c4fa080aed815b6e676a58511dea20f66036390e9870e8b4e8d96d7a4af7e366bcbcbf79e2ecc0f5b212b858794dc4c39e2c401471cbb2cf2b20eb093c9adc58055bb52b1bb7027be3a898b5a44ea74fe799e688a0ca1a0f000e30a68a2ecfbfe70c46a275ca8e87f7babd643fb1c842605abaefe052888382c517ae3e7ace55392841eccecdb725b7232dbc48cf4027031bbc39bf545e4d86df270f279bcaf3534a7fba89f77575b4e4b6805375aa544d332fcd296d1909259f1861393804b19620a5d07bd4479e92098fb8a710cc8d90fa9e528a646284d686c9a8d4b38a55bdbcb593ca8a49ef080fbeb8801a873ba41bcd109019825b11bc231e6c66db8a0a2dcf68a8c06ad96e96a471526fbfb11c05ef95aaca394260137d64c8b0b53ac2f4c031eb7f8e88483874f767df3fc428642713bdf1e97f21c0bf6befed45da35556f4744d83dfd0d9e458be6176ef49f2879c8a1e54de6aff9bc9409b63184e9c9a113033c27d452fee00eced57d8c6561a44421068372213ebea85f4e807a145aab49d8698837917ebc860407950baf91f04005836e65d9cc45dd98c23058bccf1023ab4ba7734d2bfaf1d90010530bfb1306271bcf3b3d0bd77f5fcb6afefaced9582e1aa8da8e8dfe6c9354ad27a7b0301c4df0c3422995972ba17c00abf834091357167f27744b47590e9511696095f3f22daa9fb9eec38e48941a02418024df3fa7236d6db6d791617d736b9be7dd0147c3c91a86e874a33ddec15a076d43203038de690635ce5db8f44a866ac0166d2327d20d9b51c76e5b267fe71d585128d7f277ff0f4a9ce88e02b63274e177bf511ae0bf1218815c17b5f7b142366d6e093ba5d0cd455165900335499864983271f9f8fe0ff40ed60cb0f8d2153efc72b74cd5cca6736c83a13c5f8b9c0f3167fc4d2c0792b1bff63a79de3e78cf0a3099327431784d5a829a48685cd00221c5e34bb9c471497701a58c953d417ec6e44f40614aef9cecabe989e1fe5dde59b9312a97a1849b006e8d5b2241f4725daf1a81c5b7408185cdf880ac1c0c1483a014064e5b8fabd5c643169b9b8eb8b3ed1d774e8786212d3b2b9b6e589b926805bf68d5d53a1b454d4aeef34bf467a42b2ed391fc83c151a22b2a8b76c498c892386ea0c66076f28be02da6290643b72557889515044303abca12d1271ea2fb38746e89f77cd77358bf5ad0ac13c97c4552877e37214ca64646a829babb0cb71e933d7f84a34f5253438725db19879ec58960d9e2cd34d781e2e8207e238951117959dba00c104d049d9125bd9d26d0bdb543130dd8c53b86a49c9f34d261c552e28e9a011e47e8770b2aea480778404f7423b780432d9d443f5f449af60c049398c69ff218c39c1270c911ba487b04a998387076cabda9ae0eff886c6d8302cb1a7e92cdabaf04ca3f4bcb1e382d327c01de4512de908b4b6d84c95b16d193f2c6b6cb91535422dba29822aa14b3366953328b21acd1dd4435d05e7d8610daa7ab0e63241317f35519c097751192df40cf5a9ce90dfbd3aaef5a4b256bb43a601f3c6d5e396c94861ca436c3ffdd56995004d75d588b087f6cff6ab867b444babe43a14f64a1270ec47959cab757c60964f639c758d261f5d748c1a00c4fd524eabac6ddf3f927d4061ae9ff88732660f6c18e9d38196a7a2e7ac004c9ffbc2e0dedc2c9ed24e4a49c1d2b1e0e4e3a4b2e5a79e4542cbfae656343b20d47d5ec2319586ba0c2a6528f48b4ae5bf617521aeb6ce79a2cf922efc26fb4ae047a7b197f77cd8eaefe5ad3aeccd560133fe1e8f82cf991cd15f32c5e3df72a7687fb55d53ce97cc11662ea025c0bdc01a5750cf2b3f622442282c7d918ca6fd43f8594fc72d291ac5733131b920c16906e09990b4277ef898a20cda1c45060651cdff896d859cd0b8d12e3815cc995edd22bc3b079f0874bc6fac1ba005bc2607b1378ed8d2437dcec6ae4891a49da0b13eceaf3dcd1447e0faff5bcea1ab7b833484670837d18fc073518930ee49304b4b12ae0c60eba74b69ae6c077f9903c035e552ff7d799675a3bad4023c03ab0631e2feb49b4e2ac383853bc2bee85617ba7095b1c64e1a2ee451035c743b917bb34c11a6f50c57739528dcca0fa4504e47eb5f4508f83e47170302e6c251085c6b66cb7a52a793e11498dd7f2624807c7a1f805b1e65779804fccbc38fca38ca5dd6d06228bdc84d0b5bac7f01b0b8bc5bd4404f0b7f417bb47141f35c8d6a761613debfcdd1d90a1163342bb80cc290c61f82978c279046e10a91cc864fb95ea1926f0b7d6c909e1b5e54087efb00beaede7accb68e1fa3ffe0db769bbedf48f432eafcd63892c84265b6fffeab080262255f98844b55ed76ae03f97d6b231dba308b730978b8936911bb64623dcb8626f61e41a86daa41282961603ef60102ad33e79e2fa5dc044c341337535ac2657548ac627b99fa606d62037362e71555a8192ddaff48ab964f5d15da36a58f64d142876ce499ffc7e8020ba8d515d5fedabb54de7687e4cbfc5d604de800e10b0a0182cfd83f7f7d01130116df05fb6269c56c2346d1e4c714c19c18c7940c86a9c4e1e3d622f06a65cda0708c7a23e9a04d0bdb9dd0a777747209cb18a50ea042d2f642094c5ebf579390be9799e210e3271dcba8a5c59441904a7290d4d0b19e2336455ed7f344437a7dadc63aa6688a66871aa797fac8885cca84484109606a069c073083b81235d0132d253827e28883067ffdf1f1d5fcac8dbbf8a24cce0148d6c8d091fd94bc733fc234bb6c862cd29a1cb25b6609bbe22c307bfe6f5700cc7e2a614e553543fcb6d3922db9ae2c3dea24a5cca13c3df66f44df289808b2db8d8a66ebf170faa250f2d92e581a63672cbe5bace6c2816b27cf272a7fadfe3c5970b94df04267215812a6dfcd4ca936c43dcecd98f3a5b9b7acfd4d12cde58a1b9c21f4cf7054d95ba11a65b440d330547becb3699437a9bf2eb9488eadddfb118a4357865393bcae5fa94c7e0f0673ba0fcf065776fad4b5152d4e1e4aabe421e032f574ce6fb7b50ba1599e4b54c3e71518b6421924bd1b75675f89f792791ee590e1c328d4da96ef5a66e38942e664ad27ed142ac124c5368fe4a11abf0b0213570e2ef17f3471b8bc0661067145166c3c69a6520eb2802987ea63f383c3db37ceb47a409f540e577f6d30b4fd160e6266f0e6591de74acf4304e3c450f3a7fb89fa6de4261ff9f503842c43fcc1831e813104c0d27b73cae9f0c6d1cb9bb1c7f61328f9b39ed4ad994f614401ef301685e0d6b23d4e59dea5dc800d9f7c20b7323389cf9905d6864edf18905ba9e92aff874ef7087761abad0652ce783bf4d1ad9b597b21aea4e619c114ecb3f2181e4dc391c07e2f2d900848998c461d64b039d824eda0e58bb55e090f0ee94a6f2737ef69514c1cdf6bfa7190ffc832dfd08036e1c8d297a29d4ced5c7af2feef8f4994e95f8b3241cfc176d5005f2d7b6d072b2bc5a9d98e7726e80978a36030a88c675548a670402018375813a22dc1020563129178bb359618e5ac03a59207b1b97fda33b1015a3d337e39d8530666f2b1745a33eef16444e80a6cc0b2b87a240a925b158213f1fc3a943fb39f628f858595bb57e04725f0ea856bb7127c7a22488cca3b6aa0f8d2d041907f042cfa0f817d61b4901b62b1c38dfba1d4514f380c6add1013264238c87f9049cfc4370421c3c9aa76087eee8bb6b97af6070ed5a84c4826f14cb2ca40da25f6d4556a832349e37de1f3c56612d3ec00441ac7c986c6261035f82ee50f4648519b0f91c70f41fd7bdb47ddd52187e1735b1ad861c907f5e3f96dd44d4d69a745bbbd27d11e06891f2a32f6d392d709f6a569c6b84bb84e4048824e362621b896867448934b27c1602354e892a0f0619eef88ce40f7cee7caa0eb33bc600ba62deb708986a470927df0932c5242481b0ec8b449c2f7407fe849d4656d1cbeff19fbe7a7c50b06869438694bf5c800155660c485eb3c8dd51bda2f6d2abfd76b067007052e67f4b39be50543164c30f2101967ad3c41a7fb2becc2ec2c2e8b99fd4991a608a3bcbf69f2797045da5fdc72dc10557ecbd10a947c80301636f1740346d1791fc291f7a78990e39d3a2d23806249481a26e94282282cf8425b1899f31dd60934728a5d917dd161961dcd388fa2f83448e7c97944567bf31b3e651bb273963c577a7672eb4c436321aab820874d1968dc2cae6b355859b94353d7f3887f03598dc7276cab7ec2dddbdc1fb7c1ee626b07d10492a8ba35ed793718e2d85ed9af5d91d9631803ac94846fdfb64aa395050eb1c0182938d93995045f16d8f8433fe28d8c7f3831a7790e6aeb782548b42291cd8e5e966518694ddef2c1786fdb02749a80fcaacaad43be2315a33ec577524be245101fb042ca48f37125f66ed5fc385ff0a2cb81f07f0783611391dff1073c4a81a4070601fb013b0f2a1ab7c5d36f3b3f868221d872d227b4e52ae22f58495ed22ca6f6400a01ddac11fd7ec0e61fdacf5e3ad9d82e881af09de30c65a8e72232937286aac2dbbb15f1dcfc47ed56b02387d5755b7b51c6dbee382fd9c41bd8d231bad0646ea7fad55d7007ed4b2f5b12f438c2b055fe88e8f62dca2c1bcc4f671e09a7fd8ff9b101427646c340005f653baf67553b5d8e0bfa094759d548d83fd56731bda05fb6a1006ad6a2a88307ec3057cba59d4cfb2d4abd51a9100866535d152c21d4ec8233861ad55b208c0392bb097638c2521d921bb6f8a11937ff8432eb16d8e5416f1fa5a2d7544058c2af056b7427628f8781de5ab22fd34e0be8cdd4d6daf310d7a02b50080e42a55dda4781101c61db091fef116ff617caf3a0d7233e708f361be3d6192945ff189de3366fb2b701404a6ba1ce869722db546237d44554317002c560747849baaa47d0c66f32f9e39a2ec7dd64eaf3ca541274015994cd1be3a603a479ea1b9f8ef4045d32c02ebd088449f4999b4ea20c0d2eea03ac0b072095203969d851a0ff2437fa67bb3fc0c45c31a25ecc288246291809f3644828d56901c232cf20460bd37bb19581d9cf4b4f8399470afccd4363c83f9249c22329fd8ab3b44b1a4e78ddf0ccf0697423faf53175f6781c0315af0540edcaffbf00cbb46ddf7bffb84890234f5adffd44177989becaa6ae9afa62c5eacd61598959a2f39facc8e8b8fb5ea30e3ecc7a9ff2d937a5f5e4095816489dc3e67289290a13fdd002573a8cb92f3442402891c4bb386609d29ad688bd2af2f465333d4c9480dcd09585e386cad3f4b86855a0ac62847dab2bd0ac163755e21a64cd9cb018bf761161b75ebeadbe78bde47c10e5de8bd35daf8268b8bc5e95e568d3c679195e2fb1a76ae11894f8a1fcaf9aa1eb725e309bc7cc08a731afbc0d8a9a8af4b257a2cb1c3338fb89c3ed1488cb9859885773ac237fb8ba9f62603f5c7acb49b61710a1c6481f2e8e2220559f9f977a9061c7b31f5873f9ae68bf676b5abe04f11f3de76cc3807fa014ebfb07c7b92320773430d687aa4e3632c4af1ef11de1c867709639585914d300fb191cb04f8de684a09f08a5521cc9e530b1c819e4169c41aff81f0a22d82c5e9303cc7c18934978a65674a698548028820142d47a06c67b7082a9d7e7bc19c36255e48a48675cf8af17415e6d46d53ac4b572595b137f402c301f257e26e6bd68d969e08aaa7c7096994dcf1aa86843cd2162dc9e85ea6c7fcbdaeaeafb0e1af43e6660ba6668550790ca3e532a14c92d7fca6827bc861f6b8fb8689ed77a5a33add8601873d39a594babe199607df8b9a041d05621edc4c3afcac8858e345fd72b543aa5c480f4951c712fc6e9f462853b74a220a35d28484bad304abf4309a50a0fbc369cb30fa693d6f74bd28548c177424f4dcc499833ac88922f06595b2e82245d97b907aed9f3dccae4e416d8dfd4ed6172e72a4078472b79f4421a369eb5bb0a9ab62d642aa8ae9f0705a445568365836f8018915968e7a2adb7038cc80c9f64c988c108803939fabd3b78f7418354dd0a703c7b2ec386cd06ea2b1baa36da6c2c811111c9042c8b319eb8f0a278f6191f531782a4711686363bda463fbbc9d5038864bd405806be2a4119cb5796c55698895c9a74de75789aa1609369cb69743045b091ea6699c09e57808168fe2c8c6219e54253ffd424d62f612a16124f22da30eb776b034b6ba21fd2bc1858b9f6ad4ea2a73a56705f28bdfec01013253d72b8695187ed36406598a655f6464cf5da25d03b02a373f26dc90d7b5c3c949bf7d26bc9a57462dbb504c1c3c086b1df4bd167e0bbc7e2fdcd45d1a8d2328cde0d87df00835e7d2c3b39a168d4ef4476831713aad58dc8ddeb85d268ab23dd2154083e165114e692fd3a90b5e67ea1a33d67a668c82a8c86c03998be7ec9b18c138d02d743e33b9483f10e5d44057a1aa117227d095a6f8338d7b530d5ea18ad3e2162e948e84e545b1f43576985c25a96743bb051e89569c9ae4007717570b6930e0356b15e9109f7e4c08051878459aa391a3abda16dac6e2fb985304ca094fa01e9c6406b89410c0e44bd91f205e474bba34cd598e0c9bd39d0dc2822b723f6bb764cc03d12b4afae4c437aca1fac2a6e50f638d11cef0d557558d627b9b52306594fb49a1cb3ef778eec183360b653e47234c00da793208ba944306b420ad03609c924cbfbd7cc092dd7c5541019d76c3e1ac8e73fc77b5ffe5b6c21b305699ca3a0c8fa4811dd2001ca11260624412b9d099d295c056920cf6b5b8e6f22b19ca97625bee281b4e8d2dd19bd04b802ec9803ea97aa875e3090325207a600989eb704813b21911dbb8224d2407556125f13258bb62d7675f52f09ae20f86ce3f7d67ba99462c3b0dcc53f3e4eef33733a1c1fc956be5e97d2a0008fba352f761cb3e526fe800dfd073f422cd97bef2db79452262903a308b9083508165bd9bf95d5d68d62a3335b160c983519e9da6ca35734746db6de1e4aad5e6db0681f65d4517eef5b778cdda60b0d33961615a4fe5018dc76e1bd4b745903bcb00d8eb48bf78523992f9746a496175b8dd4fdf1ec6d72839c40c05df485024d27896b5c2f46265350269431a29d35673606b14ff2fed5c0ae1d1ef3bdf73571ee57fb33c2f6fd5985b99f50d46169ba5c6d3f8d615ad55a412ba619367546d8b2449f6a421a61bd18fb687f646ed0f47e36610d695091d2576ddd26aef2d0ef0f16324634fd6ffeb8f03027d0c4815177dd4cd484c316382a5bdcc632b600e2e08b2d7ee0d9a248922d5e6170312aa145130150811629e0a00b2d968c6068983d83b4b041072d5e0800195a2c4af5a065a810000ab496020321243e20c4c48a904faaa6f39e41424700e08316f70c128ae18a2cc220220b2f98686fcfa02c84b2c861318481c0992a4bb3edcfa324854c5410b2de995f9fedb3da0a8399aa8b0a184d1f8443f8dc74797d46a07980ddf7935515cc34bb301afbf3400b4d5b8a544a928d92d8fe23dbc4b94ff202c9f60faf78ab655645d9c4a9b6c576a4d60324f2fc64d9de420b895a6e5e6d578068f4e29add32ab2daf42b3e2595aece837ffea33042fcf49d622fa3e1647a8d9f5c1d0366fee8b0ca82808c9dbe70d7eafaab0f10a20751fe5b1abe5271381c6f680e6cd7d7d5f13a7fbebc5beb7fe6db9ed7b49b3fa9a3837922d4b8d08e8cabd24dabe772cc28bed446e1b86ea6c4440340fa8abd9a4596d7555ac906857483f4424a02ca45ae621d9f0d8e12a9db5342ba9c0846156d83898c18a2286b08204e0120cfad0e0d692914dda9d6a2b7a7698728364822a641b3ffe175107c665b4a08a1ac490e40537223be506255a9b74c924002abcd8f65ba6154c74808c98173bd870031786c1c64768d81866638c31a6b34a2987844aee8b6d5f53f1826d5f9b6694971010301834215a816da2069f1269349d05802a53104d21dbf6458d45ac0421385500c5b6ffe58d6d2c1431c410112e9c40072a54e0b25236fe27a1d48085eeb027eae8ee67c721031eb6fd2e3f412468641fcf8d31c67832112445946d7f5621daf6afa8c352814b9a8d4f3063e3cff8f56de3af22c4be8263e0810da303d37082509b4c63143700e2e5876cb53651538c911716e0815b0e3d4219f7438b0fec05c7e406fd03cd0587440f69875c0bce05328c7c10d238277ac41e66241c1546421e7e46b82f8a801d9889af19bedd755dd721114232e4aab9f50c3278b31988030d59f6fd4043f7811f6f0445f0ac281ff1c2f521d63d91d91f863095286ca83bd02e952b30efc0cd52219a81ca6cb29ba67283197c8616e053a4b110ba62c8c68720aea002001b348d3d83ae404115faf70cba6287510a6d93450b2b56c0c04a133d52b088c18a114d3469cf202b4c381842db3d83acd0acccac90e2b2ed9e41562cb1cb5f350167aa1c6fdb3ef87a4d9addf253bf6aab656ca1e53c61dbc6f68cc9427f6028bed5b7da22c5aa2a8ab3ead7605e40459bf4336412d2b98da355531193f5c9304913d0c4991f0d4eb62d65b4d8f6658472fa0588d9d2aff9429b3830dbc6a039305b249b6d866d694e5a26346aba24d948f649519c457afb9614ab2d922d9b7ea55b5e66a8179f17d9cb9197d84bcf0bcc49fb245b6db9dcaaca3e6e2cb5d0d0b68fc7f25d8ac897d7b625c9b6ad4b94234e5a4a69a02b49e6a425c59c8c4297a4188914dbf6f1098f22f8c62f2f4c9c3583703cdbfecb8fb3c46dff05f762c55b7404432f4d9c3583a020daf65f82b67db16ddb8413bb7cb96dfb5265db17a06d2fcd5925c9a65f249bb3cafb6a6142835db634d9b6824cd82f3f23dbbe5b6a3fbf6cdfee5f7e359b17ca9711b4cca0675013b96d6bdc8ee34d745d448a4a473333a34bf767999aa12d80a9514a296542daa08714fbcc462cfbbec4b48953f289726d18d64375e85c70a45f6f957ba5abe3a5dd9fee69f725d0bf5fd65abffe8fb32a96e58a65583655fede8319757f2eed3271d23df732cd597453da8d178f37e7a45fdc1572f26611a2f8758b9cbc538a2e6dbb9718f6e3acf21631715689cb2945dbfd6f1196d16099e94e81a979551425a99173ce3450e80cf40d1b399c55e6d26dd8889560e77a6b0067aa9cc96d7f70dadbe3a45f9b0d567183d72f9dd7de6e74614eba0d554de89920277d8a938ebb39e9333867cddaa2ae99da8c8d89be5fced48aa0e0bbfc6434047a8b6c7ffbc9be196dfb7fb289f3b2fd3f9f6f565bd72fcd499fb9ed9929567f32182174b7ebf7cd3ed90eb2ede34cee0601ce5409c2d0ee1e9491427fb48806ad3842cdce5f6b767e0f045156d491e77c0c06a93f6107af0d564f460a9dbf14ccc9548f93ddc3621c147190c5c9eee79c73ca48a16dca964a62b6666ca9a2195bca0b2d7657a6a8d85dca067e9992b2bb9f612243a1a73065f15dec6e9ca9c1ee3e6442b7bccbb7bccb97333620d954759fc1b1cc9ace00d5560a9602da1d593471f297a1a793340523bb776941690a8339aba78be5f6bd1cd02fbfa0cfb6ef6ddf967d39c8a28e5b2a954a2517171295fbb3e95fda6c956855d57de91a9940b5f5f214e6e95f5bfdbe8f84dbf46f6ce2909efe95cd96cb5f4d614a285d55f8c130949142773252681cbea0a80b4cf990919a39d97d8ec3a052b7520ab77552b6aaea9e86882e53b294cc87875965d38fcaa6df0fbbfb52454405dbb4140015f14b01e0360d6754369df1d39ab15515cd88796453a01946367d1ab589236e1ab64dbfa411657f99c2d966006d3aa3b6bf9c11dbf4cb19b24d67cc368521b2e97fb589f36dfa30af89f3b2f59730b04d99d8ddd3d94ad9a6aaa39f72c16cd914a560b0bba751d31dbcf68cadb652b61490b36c8a52464c960d963b93b2d556896653e4ac1290db6099ac921193ec5ec602d43828da36b8aaea4ab4dab211aa2a2067d9489925234ab418666648a3cdcd89b6299a38a5dd3d8dd7c4b9bb7b0e6813276677afea6845423bc543cf2e53b69d9239d97da992b23b156e775776c1fb3645b2140ff74b1a2f97d8bedf829291c60b9b376590fbb36f0302b565914c95bf07de0e21b4fd565bd385ab425ecc8be5f06222b02ca845d9eec59ad47aab779339abccb899b3c0f7f78ee09c95dfbffa7849b6c34c321ff3262f96c34f50d21f37419f983850cc04981010f325b84b7cc321f32596626897d6496cfb9b50b68769001f9405fa5036098d8993f6c7c9267312a0042708a5f5c03dddfa56e62cdf1e14c6cfc94ef1d6846293386b42a1c12cd00f142543bbb460d86097368a2d6d93ed7f2bbed5d68a881d7a4e3043124f865c6e6520d0a5e73c37dbb230f484b204b77de8b2507210886c6190600aecb6c34e619e69123f7846df67903829640611f44593326188ac377274bd61ddbebbbb8fd75a9311499c6575a595c2aaceb08791b0fa3ac31e367738597138596f38294312fac254eb1b7ea30ced75db61a72f1a82a52eec7a63095d5298b34ca8adc9b276ac95bc0003e64409700b5ed8b4d8e1423193c59402d84c8f09063362688189064d80ba5a37d3440baf263c4d806a0b57725555d548161c65571c65e2b4d44ca87993b24094186857a03bd3452e97f3e12397cbf9c8e572ee9a21c3b014a6e159adab9be90ad7d9e991f70e2753ab306bf2068e1c255329cc5d1943369c55a9136a4b4269b4466f740aad42995099b34a2a4463f4c8b44167a49df9573670849a2609eda4333c6475e87df97adea5387270d8581d019dc9acafeae3acd2872aadf254589dd59fdaa43aa93d35c62aabcd879cc8b30c3121edccbfb28123d4dfad2f67f1d4d7abf6d417196069b55a3d0f1bab1b3a3e7e04c19143167daa46d5734582b378d858ddd0f1f123088e1c1c3656366ed858ad5ed986fc79df97b305b1e058beb5fb7385826e2d264774b3786b12dd28f7e67d40ceaad709d0bc49adc2981c25d3776f5029bc516e2dd461ce19c78ae4cc1c38040429ec870f20b1233e414ce041d3d9e9f1813347da997f650347a87dfc08c3d1479099b3d94efad36d71ede781d903412f7bba4493dffbf297c3e97d86b942dffffe7ef7d21a2b5dc2ffe5d46b4da35364ea7f0ef5b8bbbbcb60da193e017adf37895eded7856c83ff7d77b3e933593239f9257c0f7ef97d78edf5be7c3defce2f62de777368a7b764277b38098e4bc2ff1eaca28ecfbf1d9dda0a471cfeed42d4cecd9766bda98ead6319669b022292c85c207db2431850b856b8581871856e8004601982b956f01cb2e06614259e90b956f03146601b725937c095410a0d62ae212b50da075ee0c11552da2ccb102e473912243e422e57328444c805767954b2b07d8c326e00f4022598a70b5816424c016738039ffd79e0e781a0e7456670dbfe3ec0cfcb410269a6c255d5b14a39494bf0fefbd27b9393a202bc6f6c12820673386b4bfe2029ec50174f4fae070d7ab6bf0f2f8b404715c979433f445954cedd9b663779c487e15de22884f733f2e879a61d577de07be08e93ae935b22702528cf1bfa254d699b66990c2121212c43dc276ae8002e47a6280d46ae18a231b9111100f1e31ab2c297c5b5827503d0076bc5a392857d5200dea50ae50abb8ea19334842548502b0117b828497091498f4c2c606ae0430bb132c0080366a7c038cccfb303d6660a9de99bec077b068551c676d933880b2865d0d706492c0cd8221f423ab5e6cc5a0b0c586054789c1821e2bae3aaaadc5691c1b652ec92acb2cb1b31d8e5b445b1cb89a362711b06315e60cc600b233ddcc04231811c8ed8a208239a2079c2820c376811b4c5154982f8c1f592440c886290a50912445cae83145548f9009610bc5c3b9c5002030d29b84207295c0828010c366082065772081a806c0b3264418851c51597bbb626c731586dd225ad9da8f91323ba62b1a1654546d115a61960c9317962891326ba7882a87b014b0c44d83ab1c40b355f0206178a9482b070008b08ae132f1855f12efe553706186308b9b08a418a164edc24a210aa4482c8a861664f283129fbdb134a6c0b17b2b878ca27032257b22d820a8fb46790184d10a1049e81f6a0024f8918e4786e96880be36b6bac78dac30b6c39773983c480527f55c40ef70c1243885d3e26a20653300df2d52606b9a0d5c8808b99a9c603fa54f74d796bee4a24887e0542c3e4f4ae9ffad9f5496701803e99d52668b45dbfc4316dbbae76a5614293225bfe0757e1314e61aa976c7d71a935d428d0f4ed9df3cabe59ad2d5877345f7c518cc41a6c958560e87d7ff3bd1faa4ced993b7c4330acf53f7b3d8d824cea3426edcda00d5bd014ac73c6aacac198a0c7b5d6fac9f6955d0ac6a0e9d739653a2851aff6e22e7b1f188a23926e717929c1c4c89866669c6862646268c21a1b181b1a251afff228bc047f60b6ee0d8760fbdfd8bdd5564e1d6564286afc6ef4def0ec83e29bc5dc1bccc8819e1c707063b3365b40a2b904a3f122058091acb6726a8e931f0e003201f86e45009170330036996db24b12ae9444959d93635973cbf4d8d8738a1578a3b385bd1f0c3443c2e148382769665082e1596d917017cf2c9e9170599b40f2cbaa0ebc0e3cc843f346f320433de80840ae5607206fdc206b605407afea80243bb8b99db7a3aa747276dc74e8e4b4c8e8991893096600a14f1cfa964e6fdef8df8827d09d3b70f381ccaada6e9ff3c1de21440cb8224068ef24a2883d454e9e2001c23971640a70a1b8b7a9f2bf3098ad528e1583ed24dc8de1990af67c5bbb9572b59553caed236a241c0d9117b5cf0ec514008470953355fea4ea51a619dd42c255dcc5f69f330bd3143a4f2648b8f2bb9170df8d84ab2a1834fd92840341c624332a0d59ff4056d6b7ddc6d6a57edbb6f0d4e7d975acb07933efbdd96f5e06a5a4c95a6b6dd7596badb5d65adb75d65a6b6d47bd567bb2d6b1db275f8d5afb85a65fb1b5b6cbf6fe501f525b98540ff337c3157c2198010f8634fd8ac1a75f33587934fd5a69e908cf49f6aed65ae70ce79c73565a6b6d79bdb250ed9ca60b4d3fa4345a68fa345f68eae50e7fdf08dc5a6b5d3e5094f9c49850bbe048a552f6e2d6b5d9aead8811dbed62a2978a32a65c451d75c6a593dc4037e364e97dcdda959da8c88457649bb34693736b0d451df5667b4536cdd8d419362d4b348dbdf4bedba0a9bd6f1faca1e1a2a597061f74efdf32fdedfb58aa36fd1284ed8ef2ee11272913babcb6abc50ce126a11f24316d13c75e255cd4a800a2b2fd47caa5fd685aad34537adab12eefadcb1b87ac505137968486a09a1fd06acbf360d32faf92ed434b2851e282120f7f6068f15b8c313ef92842f71e4802714b1515654b1f1886e067f1e7479d44c8bf31f6cf6f4d90bed7da4fc4b77aa590c7a7fa73bbb516490d888a84c680cd0be809a50518e320f2c5eef22d75d18de5c495acfe54e863e7ef6006bda3e20e7b33fc8c12727727764f77f71f6a89389ef07b4ef4e39e2936c63f9a84d03532e4642fe7ee3fb07e27e4eefae5dcd58a7f8af5bd1d24106dfc3ace7ad9f85370168fb7a80b35283154d9f827c6b0187058734115bb9c5936f672876fdcc0d40a8d65125880eeec1dedc0ae9bd9e68efaa98e22e40fef5fa72048dd4507ccdd796f4f22786fc2b9beae41badefb75347dbdd9718eebe8ec37c2dc7eb1ebd670961a58219a61916f7c37e80d2b1b55569fa99b9ed8e8eacc916a671c71670471b10f1dee4c31b091bbec5dce5bd498e2ac1a2b1b99840378fdde31356fa6c994f3389d48a6b856b716d398385aa9a9baa35f3b5e5a7d4010d431124511354151044511141f9c2fe00bf802be802f2028c4c98aa2fba35b0443310cc3f0c5bbe744d10d7ae8216a84b9a90e49a8a86389cd9f94d0b4a6c655a533d9220d1768142c288aa0f86008ae447f9d304714be1792f7cbe7788ed35031f268f16176d03636334f52545b36a333716fe2330fa0d025061ab56cbe1e7199b36c7d312c6263f3a3f1f4e1dbc7f63512dd6ba27f7b7bb2e086225b1c695ef4fb9bc6178484460ee89209b43de2ac97edf19927715a133a6547a8b94f4a68ece4c317d4dc233bb6a0cb1f3dd8e3a44493beb42ffbaa3f7a8a2aed066194e820a94dc3f79988c2358cc4bca9ef287cc4fca0fe87c24ee64dc5401e38a1fd4b0b545b1887bdfcf5dd05cc01273eaeb63c862243bf3c6bc4842e810232ff7bfe4bd9c17695a12398edcb5965c7e3b418dd26fb2aed915d51b051107242b7c51bfd7a2c2f50b73896a5171fe6a7d800115f11ea78c4f15f1e9b5028d85d62210cd413ba4d47ecc4c92af33245689991486fe0a059d93091354a9fd2269a5097441104b51d3d7d3b428d27743b463f45bd3c0cf882127f8a54a431ef31ef220362ec9689192dccc912caf2d8d714cf05edf22e5ffa2cc6ee700afd89fa73bc05fcd397a91e57d513caf2b8aab6303fa81c9837f54b0e4e352e8e40374903b2062cdb465de9a0799cacb05d4710371d67d040812e9d86daee16d48c6df09de62c4d29a5fa4728174dc5113c8993f5f55397b1e55d1c217cf1290a1c45115e5ea3e8f69927a1d9a39f5edaa3d16be4f695ddc7a6dff2124740d1b11451a20ef105558a6390d576d8e82fd409fc9a67c175429dc4b769f9b95d9e843a917e6e4d4fa3277155f5999315b573fa9a7108cd9f5e44edd4bccd78dab1f99aaf1987d4bccdb3e09ad8061a5f1fdbaaaad2183150d8a34b2c5462a01d7e7d9ca57b390bac325f634a2f5f1f8bb4fa9a619a3163c6abcfae3f63c6645b98f68569894c4bc3b446a6c56192f5c5fab4be680c8ac2a0a850fd17141d4251225ae424cdf2a8e9a2198d4451f47ed4752f3b68fbf8a70b4d4368dfe5bb071fcc96589fa159ec8a0da05be441e3697e8a12b0f9d30eeaf428d4a3c621ff35ef58c85957268ee3aaadb62ead0655fbf2d94df29363853cc50520f87109d1bd1d8da5ce1ebd887af9745ec6e964f823d4aca18874b9dae27ff85414c106656355559f064ab6eb8b8416d48e1d1d13689d2d9eca90d23fa14ee369e7f4366f73a2945231fc93486b46a25883aa194f3b356ff336354f51f845f1f1d3a0a6ab868e443a5d34a8e93aa1a64ba348281e36f6c3c7cccda15c6dd916a6aa3e112123bb3e925d9fe66a7dcd9b5a9f020147a7d1487cfb7296ddf52d4f3d5927de12c0cdf6386b425172db150395f6d56424522067e15ad2dcced532767d8f1539ab7b1c848168f63fd121caf4a16c68bb98c9130023521970dffef5a8e8bf22d0b39624593e0a74cfac535176fc91c6ef9b9c75755c123ec7af0e6c5530854672de08d9b19c397b8f187ad1ababaf206885524a29a5f48e48a407499774499774cb925b19fd70d25195d6bfa37b57fbded187136dfa36553475a21d5a29ad740704dc1593adfed1b524bbaddda3d1e8529a17ad090e0ac305a34bad08b6cf66492029f262b5856f586b93e949d28b89a81d24e8ecf0e8e1c37f0071d263467cabaa2834dda5955927cea2ab18b9cb6923229a5966161eca437b68cf952b56ac54a932654a9428413b08070e1b369ee8d26462812ec35dd208d2e5b4ed7016fd189afb01a4e5b7eab5284b0556bb84d15bcfd97214577906ea1e04af8d4d676ed3b15c9d306f50ea6cfad55725fd11258d41561bfc917519cc824852a9c8c3c62460612fe8d84902312ff332a30ade6bb43057996d43194764abad6cc5af00d556c6016dff194fe8d28be1b697b9c90c96c459a595d18680886cce6295b568df9c557a6ebbc7c459dffb7b4e7cbc26e5aaf482b67f6ee2ac0c73d28b6aeb03aa2a2267d1c7e16e379bad560302faa13fbbc4b724f8f6b500889f4abf87427f4db2e01bcef9e8412fe6ac239eccab7951bc359578793e405cf17e3c202fc89b794c44183df82390c6bff7d218992fb56966c69724fd19a819940925838a41e99285d2847d7f74bb1a1e74e9c5bac7324fe2ac3a7a7ffca3df1f036127ce72797f5cc3369817189812cde1891857604a2fd32299640fd37a605a104c0bc4b442cc21a60926e9b2162afaf77c2286cf7641d52b4efab7a0aa9093d54acdd52a4ea2ea941bccc6ac6d15d95710291354a298d13b5289bc98122a9b5e6c832ec9d36adb7092cacad270dcb0b27fa24bcfdd0246600153f483f9e0a1e3f2f24173b62960a5d4dda99d6389d2847395832ef3165e91780c17bad4f59dfc182664cdb1938209290c09492105138652f8ff4fc1042143424c48c1042129f0d8e164fd9bbbbbfb4de79dbe4ce0b40607b43fad392a75af33cfa7d3b3bbe7dcb93b9ed7babbbbbb7b16c375a8e2232a9abe3f79a5fc6a1241144752e0210e1b9ec3599966aae8877b52ea3b6a8bd4399cbc7fbf24f30c73c407fc2e7fe821d22e856cffbc4f1852bd563a8a25d9f7a77604937d6de1ac76041259aa750674171ba1a5a9d47b5ab167ae39b38f590c1d9810f27c9862bc40488c2443eeeed65a7c7da59bdc7edc8004b95928b11520d111a91e0e3a3b39dfe5a54bbdabae396b3d83d59b8c5b0dfa965a6badb5d6e69c6db6d65a6be98acc3868afe5e42875ce3165649b67124d2dbe40ea08d21f4ed6eafe40bcd67720f569add4a33f80d4ce6631679df3e95f1c244c3afa0032bf9cb9f93f9cf4e974d2d19d3a75da7d7eb04301f1f163e6a68fece3079089479d1bef034890f9d9347db87b752c6aeb6b853f9784efa202beb1e4aa4c24e7fa305deeecdf2e7b9fc7124c0920ca7ee590aa0438712e2da78a3d9f66e2cc7d6fa53b6ad7d5ef7e87b3bad17d474e0e27bdd27b9d45f7fd71458257afb5d6ea830369684c7e689746fed0ae3842fdfae4b5cbfae4b5f1f7983875dbaeeb280e34d017e8adaa6c89d25bf5e8ade691de46cae44669732ca714dbbee3b107a5511a8d4669777c13e904685fec316facb53ec48f61a2cb999bb750f46650d11ec270dba83d836060b26fd863e23817ba9c37df1575c5fa1eaac7bcd97196bf7e1feb1127497f451d75356f788cc0d0393976ac3a31fc8aba1b3cb29f85ee047a83f1c400f0e98f003e7d16ec90dfe17f145500fa412e4b3b93be3bf90651d349d2b823fad863ded8afa8babd26cae9d9c85fd617475d51a6ef6b09f54b4eda3a96ee2667f96873d6dac7045126eda4b5357cfb265b75c954c7f106f93b3d9c65ff6bd6ae56ab5ccddbe6941529787fdaeecd366d3767cd21402ea5a6284a6a3b49e0a90f63c0d084cb1b4f3ade9f76de1b8708512e9180cd9399cb0504f0d45c2bd83c99b9bcf15e9b27b37befe55155f7bf6fbaa688bbaf36d8a84beda8646177e39016306e582be04cd91ac5495b6f3627ede906ea64e2cc6d730eabad371460a241e307bbb08a2248d1d6facf179af4e3aece42130c5eb1973b8a6d911db243dbbefff8cf44e11eb1dd16561b586d9ec55be2e8b7ca03f6dc0b8e9ec52bcfb6efe028a4342bfee859552610e89f23702208637891ed86cb712faa2df1ad38569b7fac4736933acb75d6d519aeb38ac4b63fefbda69ba61b05bb4bb744b27d6c4dd67a1722c0e68dfdea40a39363fc1c31ab2da761aaece340eb615b0b826d1f26eaf09e79631fc4b44e6c4775a44ee68d7d87e5ac75149a8ef495c22cbaaf9625409fc9ba77d94c06524b7fae264eddb7d2ac0ffed265277bb2a3cef7e14f97e509513eabb47d612f59ce5fb9972c47937821e7e3ac19cdf9d01ccde5f134edac7ee9324bad5c97d5d6293fe8b3da3ae5f17b705401fcefc551052176c09f2e15be0fc753beaefb1e124d472a4473aa1774fd92e674ee83e50c83da9115326fee53afdd9496dabe0fde07e99eb1695b22c045143fdd304193142113c7ee8b45777ea4c5c9be2d4e9c7562002e59d8783c652a9a8e2e1b3de6e425b368fc32496847e2a4e6b189b39a38d7877020dc03fbfaed1b4fd41b4ff47b0978ff8d2a08b123fef72a84efbd043ed13f0c5f1c4f10c8e38e379ef27b3f5de17f2ffe69e77bf1bff194471d97f8d4048356dda76288ba348b9338ec1b86c75c56abca5f232d72f23eada18ae87be71323aad8f7fd48f7f76991498af6f674f24425767d2c7db6efd7b87f2f5985cc9b28741d6fd871b56aa9e5206ca212105841adb5d59c3cdda0a98dd6c09cdafadefe8f89434d360863db9f3398576c6bb5fdfc7ebaef51db7f7fff1b870871c79defbd7188f7df78ba3f5dbaaaec0ff91e1c4f9705977d0f89ce23051ae9cf0bbaa2ec08e23649d1fe270880fffdce37ee78e0f43927bda33cfe9837f6b71785ee46b2050ced4f713486d21e7e8a6e74457dc4315640b5e5bd37522acb99e8e94ec93901a23567cde0ae788ba7bb5d9162d3a744deba4374065d69b2a9bbe85feb2f20f4e9ff7096a5c2e6769dd556f7d4be5e9e80576de571e6f7de1b8784b004096aae3cce2e67fdd2c9f1cad04b6c780b3fa52aeaf6a9934adfff86b3dea90d67fda675d4afeb5e0b8a74982167edc866c4ed72109a3f41106aa0bfcb9ec53c3ccfbbef7d09de77de683deb592f5b6bafcddd4e8e93d6ea58fb368718a6abb7bd3fc840f3b76eadb5d65a6badb516db6bad75dbb4d9f71e53acb5f689edd3b9503444ada5d89f52ad35d5945e6a29a53b6eac723e7ed0a7391f3720b51fb720b55a0e941a7e76a875d065de3805def3c2352e0e6b2dce39673be6905527a8eaf07056b5b9ec0925766497265b6d3542e7b4c04d8edcfcb540fcb8defb1b7f288a83c7f7e5f77dfff170d677ff334dd5a50f7a281e4edecfa2027c6cfc7f69fe9bc71c27ef6d0695f3d6e3cea01c17689b82d0a5cead009c29fd9564c955d75ecff6afb59eed5f0b73ddbae7d0feadfef7890228120da82f846e8a0413fe3355de7bef9d10c0ae5955f705babc40469c600779ebcaaa8a3eb5b78819c26d423fa013c7ef944da3c49c75a4acb1e97b9a7e9e38f7e95896f6c4133537f5a6fb14e7a4df5bd7370e59c1e58d3944e97b65f3e9dff929da9d95f70437779d803355dea1edd6dac9c2955dd9f5b1b20930439833a15fa8244d3746350915d108000000004315000028100c078462b158280b232d583e14800e789a40725a170b844992e2400a21638c218000020001c60098a1a11907873363330882552f37aed4698229b932cdba3cbdf14598ca5ec954530faa1aca89d51318855aa1b982490cee66057c488c69b504dc36a9d1f7002f7d6aaebb45302114e954b5b0f985b5c50d5fc882ffc3172b7dcee5757d4a2eb17b54428fdc0b7016d64198d21ec989f27eb90e41eac2808f636af3f6f1fe2bb45ac1872af4b996b50f4331453ffc52488b7ec86992ea985508e17d5ba7f4fef9f61a0bdedc15abee1a1d81c9afec393faa45cc5149c30a0ba7608fec44419f9a4b404f3ed25dea2822cfc0a7c26e76bc9ec712dc18c61baf5d40328828f4a7f8a32ff44f20bfe622d81e4eb34e3c4e5669602f34d6f85eae8539f780ae886e53ba7e81819869a6d47f233f738ae33c1b57f1b515cf35d3b31b1e630b13303b4e298f54a5547f8a948201853c65faa578ac292564229210b5d79e5240b402c65f75928ca5afc426e62a7040700895ad633fedc8ca4820e0711c0cf62808e7ef3daf87eb680cb7fa676e67bd8af3611788609f4ff6f496d857f7def944d697a7f8a6daa651b44ccd2f790b2d7081ff42468d9f3171f6eb830d0ff8fa92d8aa5726f1a1476300c27d500840e9ef8538142fe633ce1af6edf45d78864f240e7b55c267c22702bd4e2d57b715750caa0a7071aebef962b5201034d25076485e5c7bd5f39c7f1051459ab5443da96794d1904c2c06fc610002f2375bed4999a80856e43a0ee2073525e5cf78cb06d678aa4128bac17a5303129b20426e756328fcded8fd10fad3a0bf1d977c4358b10af7914690f0409e3d973422c60e1378b6b6137a76d0d8edba20e10113f9431a30d5038f35927a59f1013b5c7444edb7e62b343fb13ed0944afc636b6866ac66424e66773e17863cadb464397539fd445e3facb4c8dbd03f73fc6e9e844c355b532fa550980e4b7a764da50229f84594ee5726381b2c93afc4c16b941395f591385b536f1c1bd54bf356d92464ce236d4273af5d499913ba47f53aac79ca42aea32a6d9e9a8dd91690e6a6d56c1427c40e04406b1860434450090c68413a6522ca64f26768a34798d79c429522f342eb05134c79a368cecf7abb6162fc1f28976e09ef25cee145dd1bf9b277719c50a5af53ad2edabbd6dc65f6560cfe0fafbd050d4b9b514f9435306da004f95064e5b6ffb0017ee598e80f9585be3570812c9d68cbcad25de28ac9af35865b67c428b6d0d55eb9f9cd0234508fee4f2688d2137bc252461fe24edb4383962c0c99a606b8ac63a49d1bc8e6ae89f026c758d08e076fb6dec5e5504481914c080e1883ee9209b7e4c487294e2bd40d4897b471eea1a70e8a402e582efbac8abb518a679ad365b0bf3b68369a456f5b7c3e9bb44110dc007e7f2d6f789fe1d55840351c7cfecc6fdc2d25c90a7200146a23187c3361635beab0230c1aba19d26544cd83a31f7a3b93f7d3fc4e5ca467bfea0342d8d305c3dd51795301886bd94b4b8d6c95aa22ead8035c4672f57913a03c246bdae4f72d98ba8896aa99d28ce04ce58b60254e6cfcf859befd0f3d3a35de61fdb993d7e03b7483a0e5555277647ebd2edd7bab375f79e4af45bacfc410afe5dd93a753914db972a981a4a65469d8809fcc30f7042b2d17e0e467f4ea2a403b91b6459db12d9cf52fec36846da8e53502dae472febad49fe1ce5bc4a2e773bd1ae8fb5f8b1dee4f828d66babbe3b40a780a2c20342f0b8984744ce99adf4c180abdc64b7fbba966e12c0804f9e8d1e75622eaa983f2350932a0c46e884f7c9297fff147144c6659d9275e4d6bd294005dbb9eb001d20b7ccd951b535bd4cfb854708b820c0dfa71a73d662a19aa52d2bc13ab8fd67a15d606ede58df5a33fc7de74170c05fde76113308249c41d34832eda241525823e5562c32533b89e772e2b8e801faf8627e3b0a90a9296c27b46c2de4cd0cf7ec1f22dc8e29ee045b5bfd4ea654dd6b33f79593852608a43659743211bdd92399651cfc9cff4992743a99d66ee2a8093bfc92f574f237c801868de71a32a500b7c37a67e466f8c7527f4f06f4db6332872104fa9387c3072cb1d8384e2c922894b53f82e328724b8c7535ced675e054218787c491c217169441dfeb195c549b661173a61a1dab39ce5da4cec18b0f68897f91b8a658b1fd7b90bd30af900c304e27652f32e606056bd0f37ff89a2157ed27982fa349af6e0f1141ac8541f160a6c7e3045f6d9a42d120a32db9f55218f611b353bf7bcf61de90a096486c2e2b51fc3aa6e6de661e469a6ee8dd999ce52e79d3fe55886290f4c451677be8dc1aed793bae933402b43272ff6e1782e19e3028a7d2a1017c9960291249e0321cf473ae38cda01983f3c30adb1dfae530ab008b47fe3e08c815427c19e33983a683fe91e027c25041baf32c378cb8831cd8777e0fa70b2db06ac2f71883d46f0b833cbcff5c7bbf856ad03a48676b1fb6b83a9509318734948da11a2d7f0f25d871de76672dab8f7f9f5092aefd073f8863b55011fefd8d97fc38fce8a16a7ab5e922c75895cd925549ab42e06cfacaa832edb0a359568eab3d82108bc078e047c31df16630bad8ab5699f29ccd9bc1e4f45f274a545263e4854516aeebaa70c28c14d3aad7e84ad8887e5a91c7fcd32f2b07883ce4c1fd8a7a3364a7338263abf19440a29aff9989ea92d83f4f93c75dc70fe1122a7f581c4c212659af31e383cf5a5e0ae03f101946b5dbc870b519236f3812e1b1f1c69643e6765a6e424b7a280ca92f8e969a087304a1024b5d26ddaf6f32570f5001ee00624a87228ed93f8913e5845cc188cc94bd5037414fabeb308ecde7b8baf6216d7caa4b3bc8110e52cfc24cffe8d16bb9c1aafb9dbed931ce604c572ed9ac27192df1a93ff05b4e505e326e04b2765cd60e2199707095bed0cbcdfe4552d7d21dcbc578fa3be9b0b123d9ff01d53ac30416820c334f86b25e395d18ddce38e0efba23b6764db78896a99b34bfaec6460a8895b777e2550e2d79885bf7983b841230bd50b90b63c24b37b52792ef045b4c5546e3a02478b9b2cc320302478573c82517aafbbd62d5f444a6f804c2a24ee4bfdfa2a8282ddafbb4335e259cd878da3cababd9181eae44400d20fd1699294e319c88cb2106259de9b25026df01716ef8cf11eb7d33d7bfb69e1aa47311635136de23dd55448a3472ba261a34e5782f764b284a13cdaf9c13d5ac50c21c839aa309ae9ed52b455d1a72ead54d1e2284597b4b3cddc9e2136c101d3b53c4ec40cbdab85c785e4c72a52022e2162ebb28a11674ba8463b6f145f7529bc246a3552204fef31f488271be2163b57e11f749d33fd943a3dbaa5c8d5fac781b81196c18a253da350d29023cc2f58bb00b081929b8f7b81b9beb02c1a2be062918d5b4e62a67ce6837234f447336e6692187b707c565a109314b92741f9582e42cf7bcd754598d501085c142f5f41997f38d7132f2a207c60f8786f55e87db10e001402988199e6f16ae3065af80a62f9ab6751bb3bada687aed8d27f732b938744e0b5c34ae185f3a96326896b74735df5d24d5d41016dbab2ed126b92adae886598797ac08223ccc440b2e120c4e3c9fb20d22d6cec9e91b4d97bc115d2f194725016f398c6858229800a4081819d7114f3b7438435674c4d9db42a9f2b84c0f6a24e76f58c6565f6a20dcc551a4fa0e4a019b1f4aa1dd61f05413ca597024fece04e88f094a14e6c27daf0e3090da1fd9e8a55cafc51eb3eb6ecc34ce6b118c7540c8dc2fd55b4f51debc1cdb7ed7ea174400a5f4ca6e6f97e56635b6e3a6a99649cd9f0a11198dc33e7666cc8035c3731ae7a99bb517a8a1d0eec795821e5ad43e0fe72f6339a8887b3a326f6bf2fb66a22ca532a53cef70bb9f29c84b8e44eb29c3ce0a64d03cd82490e17f2633cba51981709e369a03b1e7af6f3463135fa1596ba1400f9726fba27eeecfcfb14d4d283cb725b2a5883a158b7af6077e61baf85d94acc7b08ca8a5417f5545df77599c86a3bfbe1a0e6902b6411f703891cece486cf3943ac46aaa2d7a2fda2ba13d2e423dec76734d71c0ddef0ae9536c95aa527bf48fe25a7b03e45a98d2f119273c814613140961169ba64871c39dd499fc56af1a0ae52ef50f4ed3ddff9dba0fa894481101c18256ee31dab0395475fe097c404269da0e6862f2a9ea0f1f4b7105626c5b680328e12354435600d95e8ef415c188373e701655ee8489adb8553b47d1d31c1b03c15d98ba2005535fed0b4917e50a06d70a40599bb20f302ca331264f7ca9be2df92e1b620f34d1150c881a1c7d6721afe3f67542fe98701ce200a203529948a021ef08169acb9e3b0471634146c225413b634e0621225d095316cd3596a4f3a128ae8c35e4dc10a47688cb5e33045d13c06344cff73020a5b4c6ea8df6661ef5f9fcccdc45bcc33bf8da20cfabcccc9d3061d1d4f7ee1bfca27c333d0442035b49e27bac3c93c41b06170d7bdee79d1ca01d773607cb477d1161337ec4942e06ed04f96468271eb06324bba4537275c6ceee3cc1934e9e490c0094b2bc891d1da1ce959f3d2adae73c856cf7e12e119e97ecc4f21da5f31796a69a5a00d6e9eda63d7f3dc20a8e2904ee2b149f66030d497eb9938fe30fcb6c3bb9cf69aadcd0cd980c32b5bac5ef35600a79f08b0bdbf827013706e102bed26b0b115a45fec7bbf643c2a6c0e6b48ced3895cb58047f151718957b052f7b85de8b123c187d990d4fcad438a6c2f7e706b4f0eade5da5e4aff963e22afeb05d56f5caf76392aea8bb7a9547bc80b06a1c087453a8257062255f4681f858544354ff906a367721ab6dd84cc99b3b537d581231801c45fb08147855b8fa2585edef9622f2fca3880e147494be05c8f57cc21e127848ff5b1e4e9c025de56cbe4ad3b84a154e1c4b262dd6087b531fa286254c262f92dc99008671b97553e381363cb21655329115c374fc8bad1b45fdd34f9b8ec2b2771c006bbdc5dc3a21e41e9364693818149fde06a5052ea3f53a80db2bb2960c010bf14e01733a4126a6ab632427e47ca5228d55950addfae9281df0ae10c78a45d4c15781dd84e5437059fb6e22643286ffffe4d2246144120d015b600b33cbd9838bdf15df4048653fd2d6d1b33ef2147d568eda3a952d280c508283dae82978bc3c933f589d098f22ab40f3caa175d0a1ddc9233dba760cd57fa2550ba517b8f162760648bb07650d746cd098552133e092b6ea3f36a6b1b058013ebc31da4c02acda72c7c6de34fb1055d33462f71d9f231811347cb2f5adc95799945dc993e3e187725d57f58b766c6e0d568b02e28a2abda292807828d99bba6db401dae686ecdd748d72c43985e2c00623702d3c3e7d5db0e29ab3cb044a7bae9acfe5e2a3cd65e4eefa1fbb611891487f8e4c5d9481ac309bc2e633d4e05c48a6142da6c3e22730949d19e0ffbaa8cc7217c42d36da242c12353ccebddbcff4e5bf68ddafaae07b62e1b1b1b3a86ca0689f2c0f03c5be27d9f36187731295f40bba8be40228d0ef684084fcebefc7b3937b2a644fe353736787ee99ce0d7e50a3b8c9d6222a39df7dce9654f8b3671f3b16fffc02b4af853c10b584e16ad44088a6f95f0890fbe5002a90256ab106b39b04e7c4db84c9e013ec068975a204d550e510122dd0c68d47d26f200074ab1e4d057895f91e0c9cad182d29a9e9215e80f063de77e50ee6a42b0ca0e4f40f4d3e5cfc69faae11cf00f4b5a2d82f44a041ab4b49da562829232a56b3a57a034fbffd0ac2b097d6b94f049fd08df485e064e36297da75ece501922e2861d70eb380a0a3288db19b1b71e4adba50c5732c5747758c2aae16985d0fe16be46a2086b1fe3a807898dec874f57b758d076b05cc9106100c9afc125761c150e4887646c1852a4722778b25f976d5caf6aa39dad588b6146aa23b3bffa62f3d844050a06c3e73eb4ca39b3edcb5b17faf9d0936a2c724fae0e13d917b5ee3a03f1bea1c52686a88bb3a1566eafa91ac043e46ad81a60fa90f3c0140a0632626dc5d2ade405492b21753994a1a672e43b52cb8d6b727c9e93ba1bffbf783fe2c11a137860d4abceef2f32febf330d4a2c3d206f713fc5f31400ab6a38f91aff541ef1043c78ca864e4cce8a70a8cbd311022139caa847219145d0e2f380bbdc8a0d5a9390896369945de876ce34b6f9c6f47524f877a21524347423e0a8afb214d6f31cb9fcc19f700b06a8505bc29c75046c060b518cecd2d731800fef950d843afe0cb8973b5d616ee25f2001ade7757c4ca2edd9bc103e88c4210f2c46c464422c949e53150ad7591dae21e8bdd817ca3e2e90f61856e541a414b0442e0823625da12ce07f5f2938430ba229a3d21075ef638bdecb9e6c0d053200e140334ffe32b744b22e466d4e5bf8e886e0bff1c2fd1faed6f821133d9299520c990d4b9f5b2fa929f3567d48b39502eb885d8fd4cb228363b96ec0476a34c01e820152533e0acb778992cee203be6b92e7d39bbf965c34e74fe872039667786a55bde4173c9e510c01381e101e20f3d09364a4adb4c722a55ddc21448a4f0f7275ffe3796d926ee40ca83be11a66f99a16861c8bb5dd0af63fa2949cf1359d9da8d9eeeaaf36499ccf305fe35928d190d889ee6c982ad1dbce041573c3391fdc17e13e5977f7c315467131c0f2743f5c02d8c21889372c6e29416ffaaff72881b3194f2e9ea3dade1ab48cc5a9afd24bc07df656db4ba6e2a8b37c7b9be4303f8fcb10c48a119b88dc149048e8ac0c2f9e1ac3407b18631f4bf0616772eacabfa8aa34468616c99c86ad14cffb114a6fd2f3563c26214c8c53bc1d9991d5c39bb12e498db1c452c6963204f258eb61b75c18e07d33dff337d87c9ee6e9eb2117ac28d938ff22e2ec2f2b8432b07427fa2aeac2d0b88447ae714ded7b7e8a8dff1078b1b8aba7c9023cfba4eb416016980cae6c0f7eac9237039e6846a59ca63e0a06f8a82b6680db713e9468930b865d23feb31c3909fc202d8620f167caa7e791ef53916a4c3daac61ad7da0c31d9a1ff7c01c3ef13a4139401cd43d0ca8dafef58a083c87f9ab4f0d5ddbd75ff9fc399f99e615ff882075655d14592073f440cc7c9916e516b8742782f7d6f27c796cc90d43bdd9fe08ab17e8f10fd8aae3626af85d8f1efb41c5618e8208a64bf1416d916831cf668e1a3230d898f3b6c2b43d2a075b40eeafd1b18dfac68d4be6814e2b387623819da309ba450c284c4b70594b2e11292d09a0387108217080848971f66148bdbfacd9e37aa8e04d85c2422c7e3eef0dcac8b6d1f1472998a54aba1809d75113c75fb7fcd19ce11370f41140642984c7fe298b82d285555cc8a8058d4c584130eb0af914dd3f6174ee213e342e1a026ba16231ba55ff024da77c2ab194b8c0bf57fc4913baa4ed10a1d1acafbc4a2c4514ec440026a342287ecd03f9ba9c4c20d1c9b126eac4dc1f40e109bf2c6037a8fb8575c8241bdf65025add8a0f851948824c86e5cbbef8de8c63b6c91c9983308df1ca4690252e6641945846277eb97f3d148392e22ce21603ac006c76127bcb5a0f1d143475c5b5abaf5687487f3222d81342606ef8ec0faa02bc8ae804ac6050bf44893356ead08df0861f1e7f0aa9e8023b57d38b714c8fb211852ef30f8a248c1aecde59d168c496670f50b73bb05e974b8637c4ed40c4191f81fde3041bd8d7ac3de7024bbe8f20b50b2277a0dca275ba22ac1b178f278d2e20d576e4a7b0f2a5b58f36cb1cb2e3661149cf62f0b95d224101d328c747539418110ce0884ecca2ddffa116a1ed32a551015c60e36fd0b4f466bb39a3b60e380566c0d7a757756418cad90bf369ca987ae91736f480eddc008f62c5febe96a45470dc2187b139822eef5a365d0cf25ebdb743f8ba54907f7ec440abdf0140f8f8c40cc1c6dd1423a9394ee8ae3411ee9335da16d6822c1362e8d8c4f065619bcf7293d634200e1dfcc3e324e4d9dca862304e9187240d5d0a887a890ed1cca095bbfc02dc2bc93134bfc07e1bd8fa0d204be836373ec7e08cc2fa2ebac03a3c88521a5091cd95d591c346be465528732bf61f4c97fad921aee16214c4630dc57210505a55897ca0a9ceb25d6e36c9ef5491c016403bb3643e2e4642fca612adeb083be1fa1281ae87c66ec015a36cddb9e2b4043e5860f8b91dee78af592b8211d6456bbda4258b1f0a1541440fed2a31006552f8860fe022beb0516008011e69c0c1c0c7f5ea7f6a9d074af34e4b3a03b7c6d5149f0fdb11ab7dde484846af02617233808c08977c8d741d316ad0528517ebd2de9a3ded7b5ffc1ca2cd9fd1e6aadb19c1cc7da0ff60543e1c049f626d3a01e2c61145a47ba69ec4433391596dd77cfaa9d9203353c91d7b32b70edce05ab1e935dafdead35bee265bda17fede285cff56b5757a184b6df675c15fa704f8142a33ec93e09f7ce81d0b54bb6b2701236c76758c45289b2b207d237433a4940b2a488182195dfc8e1ab8f769a0c21ce3a1e39f55322e5764134f659ef0eea9a0846d01f2495c7273be06970f6ed05586d2f3c5010d81ca3ddf08c90d791a67c4eccb3236b19d62ae868bddd99eca93c4bf50bfebaede60296832285db712299f6362267a1574b440e6fd43c0c13f0cd425de302131e6916b73f0f2dc26631189025c8002b160083d30b12198e809d2d538133901dabc61de8060acffacefb6d3fd2ae4e7c3b16e2244894128c94c4d35065da07aea1412e9cb822d09c423439ec115c5b4bb4b4beb272b8e0a39a4b01c272391742a448f75b5bdd2f05fb7ede46310ae6cff02b68526fc7aadbc8368789ad52d11fc991a17a60c0fb82863a17381e98fd1c1de217a636caa74ebe391916a15d9a93eb5da98ddfaa02d6911a576dd81b4e7eef598c5cb324461910f0d7632a3b44a66aad264baa411db7d255141a9400bdcb10076285ab842722c9788f267f20105c2e938b6608c724a506fa4b0cac143731adeef64aed7daf7476f75d8842e7211184bc5580083ea49f3df4fcd44ab099640fb8ab2043ae263a45fd4773d24e129e78b1837dd641d116d61228f98b53fd9da0ef5fea8f219d880dd3679b2e3c8a8d4c005e66ed6452e3ee77c25ea6d7d194e655737b0eb417ceb7e59008ed356dc752ec18608310878d0a2dafc1f3252398ff85299259ae3d0efd7a5e76af07e3d723c95005cd93feee6ba09dcaddea1844f80d881ec2bd3da50a07c86342597abfdafbad09ce2fccc7664e58555e906d2585c9b7cbf7aee6c3076ecca2436c8f7dbf32991029bb235b11e8feae105fea656e4c34bedb305ebd39ef3181a0240d8c40dda6f4ac908f3c7183518be2183bb9f2f2c10ed05f45230385b1e03d0891689caea4f609675a7d7605f4d6f8d0394d819b17cdf5cd6dfd4c7e6c01faeb231c14a0fff6bd18a9ac920bc6e4d88aa94fa17ec18d34de717a91f74d7122e7f6369cfcd6d3cf08d251cc56bd55895903d6ba82bf12d19229f3d960c5750944f2f6ada44508003e5738cd91f50d411a9d5b47780e86235b875949b33d14fb1c89809ebcc20509274dc470fc8c44281f7f7719ac6174811a39feeb6d24a3fae95346b368be190a781f3d5435929294cd8f7e1301abc5cb78e270e6181a6a329d407e7ffe23878d004f540870397ca7c63e47e67ec466b14c09b5c51acc65cb4b2d575eedd006840527c6dc3e9b785af186bff6c297d75819c1c7f71088c1a7995b915afa7b224309292949a447de2ae2e92e70ceaefa54888767342b588d6d70b8f9e8f78c851179a2d60d2cde0faee94928e3014fb877d93715a67493c56407f89f56ac4a5f74c869adae915ecd4a7f50fb15cef3207a1ec9d36d09223118b892fdd44fd9d57e1a0e2f2f04917ecb0a82290a8f0164be698fe4436458fcbb4ac945b8b08f8e59ba8dcfb62fa0b4ddaa5a69b9cccc3e3db11057021a88f42eebbcdf26a7185b3e05d8f4e3730fe467460dae646cb4fada266d043a51be18ed726772237aab4081c5a0f600d91f3a05485c2470f0de87b664f59214112e690afce73ca86f2471327e2d8d2ec72de7261d4171c709d8e3fb98f308cfe6abd4175a1171eee4b8fac2f27d1e999b42e5bc9b6d8f68b4f191a03808215aacd081551aba0fb1b50313f066fbe859b92a7d292e4572c047f838199e2d0903f1f6820a1795132841363f84ac487272cfeaa3f0a69b9ce524c30385f2274e24c6a4fbd10e60113c1d177898b1fac5cb8323d4803a4acaa27e9702bfafef4fa0de7c86a196340e4e927c50d22eb474c4142efde970eb6b38aec0c81da009d5d10354d41608c731bb4fc3a6fba2e09dcc3af9bd721ae17b4dc6ab18c9b4b18cc0569a1636d286ba9e84f36600a7d6b0b8e85d41dd2fe00538a24aa800369d82e9fff5ebd71e5d31af9bdeb65151bb49bc3285ba175ca4cb354afeccf95878c8f5993d5fe1b24b5c1e1a2babc89b6525b97057c0c93da0c7c437958c97a82e86c3bba05fcfc52e940a1006a8c38032f8224de95130a106eddae5b6046d6730cf0f69eb0c32e5abfcc59b35cf954432eb9504aea5281d405d248804827562e274c59e5ea7a5b01c5cbe810abcf1bdfc334067647d04d83d919938c2c33adb66cb184b57de92aefa6b5d3233350ab019d8272eeb653a108b9f96f5c7d653292b255c5b98e98369914b35c83d3e7c4cb3cfb09fbdd45b9831f6a8592f5a29987811be6a8feb0b14af9a10d5aad2c1b479bca4f4b1d48ede2ec189566238aedf0f2f52bd58bbca7da09e734e4547985aa642ef56234cb26b545fc219577ff800e6112f70fff02c9b88b9ff05b879310203e14418b18c475e2aa8f6dc1c7bd5c2a1960d3263df43b2573f5a6931c8ff8da281b06daa45f4f288a05f98e08e3ef943b44a754c152ce085e2df042dfd0d08df104a6bb129485f1918345436e706bc619b7b1c5b5ce9da40f11f7d2ebda99385a806b2b8bd6ac7e2b73827e8173c27aa16d72e99ccdece5480f2c610832bc1e96216de28ecbc06fead51c2311d20abc5dfae5e0847644c7d2dcae3a1956c6edb6cc53e233aab74e4d564f8eea1039f59d1123b9884ddcabb2428d90572a9232157ec670bff4b7321c426b4cbe9e336b7452b1fb97f72a055247652a79ec481ce8e8fb0a080b62da9f7d08b7f28ff6d6ac584ca8d794d964838aa400685a8fbf6f94cac1969f57c0d6deed25fea774a29700972371759a7c3bfde7f8ac43facdd3b68c181a9ae226de8d7fd7df1d5edc1e7aedc4239303eac6e8c2114fb831051c132388d0f772b9297401f1ae74fab1590f89d264b460173815cdf279f06f06151147b1da4796b972f3482acd6c0d03552054bb3ed4313754458ea9580c60c5934a13cb8ad5b460c83e443fd3b3f75439870a7ec6a5ff258147d321b67e2f416981d704b2b0d0da660d700675d0cc8ff90812be9a46aa763fdedffc2a9ae46815a1950bfb47d43ed2ca3c91ab939edf7210cbf7b289217eb34f5df8cfb47527a0ac9ea5c62f3b14d6d14c48f88e8fe2c0891b16b5abbb50b1b44c2c72626783ddc2d1833d7952d21d670535d55144cecea9cd2e85435401d0b0ffb63bb968d310db08e49a2ab2f665bbcb3910d9febbe9823ea74e7101371187cf8444d7dcadfdab027a601c467de424ba493495e9076bcc8728843b0c635662f7f806379d300f3fb351cb9e51db96b857878a90cbf5830ba10517f758ff8f1aa010a1c9632f77717acf23c86e2700d91103cb0796cc5dab1403a8c9eb30cbc9b3c66208c45ab98180eb3c2e99446c12e835b91e920060ce48489b8b01fc2b9996d1cacf66f9e238dc937398dde2b3942b4798fd9dbf4eab6949e4116bb3d1ca991ef5c4c0bfb34958f557cd44701dde57050ba90dde055035308b13d6551c03fd3b0ae22349a310086a9ffc02bcb7bf37229ccbd56cd51c1db73cf1ab80c28c59cac3b60fee26ce77b4d5aa7f14ff6035b0afa78e286f48714b3ebdb2b887175f4d0effdbb959614b16b6a2e22994d5b5c1dbf9754cdcf8485ddfeae2d6bc0ccfa5320a527909120fc535e7069c463f774d2d97ab65e836143cdc23e5c583d9fd1a47ed9c7fefa4404ef50afcaed7300d20e60089d958bf3607e7819c9c405c6e84301e7c3dfe0194fc0fb8e3362b8aea63b6d946d86a629e38b234799ee094051b9a94eb299b2e85ca45bc302c34e3674344f810f58042eb18170aa0e829a8b4b4a91c60c825a57a6db685f8a6523a4c8c0961b456a6bb2ba1bd885f740cd71a3e39dd9ae7afb47c092c66c367d413f567ad3c908b5f7d961a6461b70b160048d125c8efcbf9bcbf43a673dba020848e254797753361b0a2f230aa70a93c44389d9e9313eb889eed9ac520ecac6598f70a0734ddb59493d54f27fa7557e899e9d95cc6b8dcface051d437f66d52da52a86c69aede74bc4200fe8ee7c6198d7fd8d4c7f55706fb48dc31fcfae81443ceeecb5303d654451143f9aa86e9b9b200d86bb64e1fa1ec5c789c3def88956cd2fddabce62a6ad595117024c829f2f86be0027f3510b8079930c42f83707ba9812feaf2737e13d3b9c572a7ebe7f87b78229a80551ac28e8d0daa5ccca079f10a53b4ea75543ada85aad1b48d86f48060ad1f5485b76237f6cf4d60beede15e5311f4995526673a256234856cd93de6c5ba9d56ff4897173c37484d8c2113f9ef551c5151dd7cce61de460730a26218552813800a3161696052dd506d11a03760572f413cf5716f699a380d3b26ba24c913bdc3d616c90a9ead94bc76a40168645271fea2c37e73c33b92f9526b1b0651410766c7aba8c64be17df71ee71676aefdd2979fe7e42f4dbe58be52d75366358969c80ff0ac6ed016c0ca6cf80105c43873e9cf448d8271d4aa6c775430cce676f1bb2f89f730fafd72013f7e69ff6374fe9ccd8f3f9c63313a81b46d27b8225f358ada12eb272a2c5400ea2bb19349c5941650e8fb1d814fed7fceebc44ab957ec22bd21f6fd76795e40dbaab9609099e9e5cb6e2fa12fba060a6500064ec1f4406d9e8a04086bc7796cb8450231449216c08cc3ec41c509f5acab2761ce9d256bdd4dbc27bbc01e6044a7807763561b3cd3a29579e34206a2da3231ced5dddac7727810db8f9b37a5f5009ddd9bf8bb646a9a622a21e9e68c1281c6295f065b2f6f5cf5937b04b057b336f7703619a5926d71b241229139a19025081ad173742f4960a4708e69c32c5f0807a7b6e57ac95e24c2d44b05f18e3ac108c52b8c882585d3c9eee2bdafd418274f892f7644c54333eb3161db05ce44513eabe12a9939d1c9cc3f8a05adf42a8003451fa6b058b24ab58c37e01fc9ee925accaf51d1dd3228955400f77e6ec0cff525a3ed7b5131cb6454fa8534fbc58e0f581f49ddefd26e578a0977d29b567b76d8add4e848633599584f582630171438b8190231ea87b0cfe98ea1c52e5c0e11131c52a08f1f825d562c699d53734409f375652ad2ebaf3c8cb222f044e53092f5718f0862692d589634ac69d2d652cab0321653d8285de1ac4d21b783b92156e0c9f5298c75c4793bf488c6b819bf71821a41d23acf59460f2a40f2cde16dd23b3ee3fed0d87ba0022fb129d83d34b7c1212324c3ba095316708393600753a1fbc35a06a7ff6cc1c982d58be00296ea7aa71cfd811d601e32c9b2750109a4c2ae5fdccc67029ea44d19c6d300f1f50fb2ddcbc6122f5a4ab6b11be8bd22910e1288280ae49390e0ab5d14d9b96b062caa671505b294082cb62057e0a16bf9d5919b3561cd0c84848e88226de980a21a0f0a2c234721ccd24f47a203200c7782386c29bbed60d7e9370a39073a5448941e0cb87c3734e452cdac6848dbbd0b7205d6000c6f70893995085aac4e18c5668f310b9f137f2b597c24769e0e9cdb5ad0c4efaaeb674a81d18b54db49797e7418e451ea0a7594724a14d92422d1f084bf8985196762b3968873ae179fea25a378d8e68f2edef7d2ab5e5ca94ca28a14dbe09aec564111202b3c085928256fb03b10546db98bf98ea1d5088044c864b1cbac27c302f25eb001b38d3bf860970ba8c7ba9157785444a4a01546660280edf4aa368e05a39cecc3c7ab398ae93a671048e14013c3c7b0322f9bb64281e87313ec3523c3530bf47b2915d411557a019eee65123ef7fe0938ce756a4580e5dc8655a55f02eeb9d7bbafaf50c1bb7b230e81d3521831d495ba463861269b265fc3920b59b14228597223dc8827d4baa1a8e00b052ef8038c23d74482111b51ef2fb3399fe3901d4069eb55d02b2c3c0440922528d680c6b57fc22bf9b6aef6b440584b202bb833f8c35ec50c467b7792063fe98de386978864ad44ec5048844d96a22aa05013db47fc3f4b9afcbf483ba1fa3a9a1514deaa30a9b9177917fed334087a84338607fa54993fc11b1496e367e9bab1da5667aa0ff60a08675504a1fd2d56846ac94ac5704fd9c6961d710983134d7c2784f3664fd10cbfca03da4f8cf82125720e6d8a577712e4f41268f90ee3a7d273f614df33cbf0487645b86e70416f29fda5533277e4a12f4109ad64aae4e57df268e1e73f31dea55567e87c98523168faea719631d395472675446024af07821f206758ade66b920c4a535d21d64b855efb69ea09ff8a8596f9915a7d6d8b1eddbf262fa32cacf7665070cd152e5aac19819098290230da20b9ae5a6cc3bfea240ccb4679feb2fb42657d15836d3ac55fe212edc5fc81cead7dedb962c49ba926a1de8ec6a3c74f0df1453f23ef9d900f324ece4573f3b1c0139d7a1b27ca105d94c876cfdaad0ccc97bdb3fdd7e1637db0358e741a7a38b97e753ef6c65f4931ff166e13a4eaa22a93a3aad66c6bfa47653da92b29febfafc924c3f524ce180b4b1bb36e49ebc195dba918d50e20c7e0c6b5f00e5da51c46b773f8f108ff868f406eb5540e0b35b90c6fa2701eb7cba992696c0360597d436831d3a12d9e189c78eea212d55b14f0ffd1f52dfcda50724638781b6ae7fa660c71a142fc44f0a67a97bf11ac3f68d5d629539b13b3919ab344a9167a6c6fb84aa72174d5af06308cccc91d28ae9ac354019a3cba1b37e1cf9f85f53c10a64bd9d5f50306601012d93d778a305deaacf318981bd8575d14cddc51e475a22ab1130b7f4218f2b3ea837ad68a9185c23e995f71a9cbd5467cafba703859cb356e9abefa1410739415818ef729b4fbe8fb351998a684ed2ef14bc3b86695366b374981937f8ed7d37876e6d1440f7ba9965b4ce7c4a4bf8efa81dffb23907d727038080ca1c05822cf2f29443fd6072f186ade14a18311a58d9b693f7810f29dc590e61352de80487facb88bf059c0bc67cf81f8027531b38cada28b4217d705ec30a9058ad9f242a7a8bf6f3d1d6144794017809034e5b6a30ce16481095f9018d5abda93caca33d128a3a5da7e86a121d78a20fc4aac0c2f77a180cc2e4208386c4f6d074d71188e40229dd7b6c479cd2b8cc32e743f77f0b33cddd09427871cc46e27f7bff833a79779e9d501e2dde9f197281827748faebe82adc1d1cfc19aa2cecbf33e04ac69bae6033a535146477a2ae63850d728ffbc237db428ac237fceb69a471c7f66ed966fa85de295ddd192d39b8572483f9355d56ae571c99603fc7896f095962a55f494f753a6779d975a125d3099924056f526d47d497887a3aaea845e4cec1707ac00eaa0c4245ece334a56e9e35603471952cdc92514bb7b664c1e6806c8def60f9e6c64224bad0c82df0e9cf06425f64126b591963453cc6866bfdbafa81744a9170c45300256bf674bf9cd9fa5cae6a6ae3a5d77fd57b24d230391ce9dae954083eb7faeec6222d373c75919d0077fc5978b30536ff8f7a6492fd4f5dab3bd3bbcf736ed6daad13491a468ee486453409f405331a5b4f13481006319a6c17d4834d039c810cd871843e4ff0a8340eeab903e6428b856742e862bb87562129d8815f9e85330a2386c4203893cd20a1f7fd96465b939f8446720fabd7716201ea6eec298b3ef4a65e6bfb5c6e52a97ed3a126c2bd450df0a71c44886a2049703cdf493c04a3c2c637a42a2f728406c61536bcec19f8682714c92e26b9de4e66ed7af3cbebe16340428bd08043f7bcd7884dad4329a6dca4cfdd19fc8c067db3e8e8120530e938c5a852ef4bcd85076e7f6d8a1950c3880a2b3d728d6503033b90229477c3ba5ae1911385485a843f5fd610ba49811ce231f05a4217a87b13d960fd88fc2fdd94f59601e324e09d120e5876f5a96439cc6144fc889acb5a905833c4b24ea19f05ccbf02470049bc6e561b3bef00f10b022f8d358037b7814d578867041d79cf28d622c8fc2e928bdd81113b2612c249c8b26a3072f637f2ee94e8296e038cbe011185ff038e3d8ec6f19b030fe7911c15c6fcc0070dae8c45e8287507d33af2dc034b2d7a4cd6d4ee02ad02de619c5359456cf57bde8935a70ab19cb881c9e4161a85a8c05bb799d786d34194ef22936117c2b0562a880d41314d69458b06609082704d20ba853c05e6905b5adf5a368093a67547c0ae92080527bf26aac3bc488ec18045089dc1527901116f05b82cc3f5df65f1e9c9ac393feba80e28eed65d8c8ce935bfd4ca2bbb35a6fc4648255910023b3eb301416056c6d7457e66380e527f8bdaa6f1e0f324a1af754de8bf57eb824016146c08e34ddadb780757275300800a2183ecf2990940c7862878c89660103afe9df2425b3aed3ecc1ac8782bd90adceb517686558b2f9e2bdfdd0b95555910c51c9deace745fc03fa0200f0db5d0d4451023c44540a0d144998fbf810ec8e028c875506b05f03b1c64c284043f2f83f999234390c76cff92c28b5b9d82d26547d64446094f24f97361e5f78c805604240eb33396a2f681ac8fdffe104e274cc6983ff429f0d62e1f7c0b53b53e6c8cc011f91e23a839d3a8a1b00d8b77904360ef0d4674882d73bdc4c183e00971731f1eee1e307feb331784ba0f80bdac63e07a600acfd6859d977e6de22c5dba49a5ff9f33c755993ff46a7059b31ff66cc0bc1c9de4ab6549ce002669276a51d40947c8424a590d8f879151057a495b3cca47c52c32c5da1165e58aa65ca235d03e2a9beba468ce17d3015b1fed715ae055b169ae197cfc5f716f45cc8e1ba4c35b4bbd1af883e6d212cb63d6dae7589923e3f90f3f4628999a8b39affbf75388183890d6434269a4105fd0ddf1788ba03ab6909383a02d86682d6ad81151e27a4baea64fe4caccc7002f9ebbb6696d39eaa9639351bc8843a8c9821d01713413bd70117e7896097294d5f11ac9d499e4a6b9a726516b41b44baff59e647d72986db7c549abfbc64cc26262f58fb8bc078e13b5cc54c9bd759c5c91152494e36e02434736849d9c2c4d8b0227780df33dff67a13eb8a94029f026f9ceb7d628f2ec3f97bd1de3a4a84e0e92ba54c4744a506ae63cbc286e1ef80214c3486bdbaead7a1433348400222f6ec52698c82b7ae84f6a1709587941014da02291963f6acb59a5211a00646c245638e9b33fe4fdcd0103542d769cd4e6cdd0617a30107dadfe31c720c5764b008f8e904faa0253d360772f41245fd1826a18185903bead6caf490905785326da894da7926604d9e8414e3eea1f16a1193327fbd434d9a5a5831b2b7ccce358d9b84a8f7605c8b0979aa3ea48f91b8104c6aae85bbf135dabd82b17c114f4e3664cc543fb2913baeb148b1dac215eca78f0457cc90a3fe05442f005798da044bd188fa541050bdc13860cb826d6f02e2b50aa36e2acd511f12c5d3b2da9dca5c8a3ccae5a7af8252c6f1d6bfdafc8e874e5a9a43f1ee1bc4e0144d554253fce71b30c5d3ba37d5ccf26de095437d1c574f5130966b2cccbbd07bd34a2fc60fe6cb02113ac2b6d11f48ade4c298bf11ba09050ca1737fd37ec8a780f5d02746aff0edcc94a21245dcf2ff1f24d9872887de55fee6ea2e06990a779c15001ddee15b7434464065acc2257775a0798db37235e21e301e4b69fbf1b979aa5aa95f93f2511ea5b7d37ada8e3aace2ebd02bdacb57583ebe01b4a541401f8f80267a384f091284efbbca2df3402573531cc92c7354e569a14ecae9540df0ef1a2be0d285cc82084f12b0fee6c15a0ad07d96a3427bd4770a98e5a843b3ea946cc245022b1fbdfe8a67543e078f3a554a4f3e7077b484dad16c4fc3fdd016286ddc1e95dcd09ca0bd7cc67aee7e13987321ebad9fb52a7030129105a172961b5f221161b7e1ea124c971aa3c58f8649ea45f374dc5909d2c8baaa85cc73112591495049840da989e895a5ea880e0e4a887693c8b1aca51e0b5d11e6314e5db2fae74e159dafe70db3f9984c323705f436bcbf6e3e0d103ef5bb8253feeaff319d5982af29cb1765eb8eaf4c03f13554f56beee185e3ebc20db78c4afda4b6cd558b240a56dd1bb9e6c52d0150ee9580cee20f155d001d4495ba655b13ef7796fd22d48eee186a849333ffc4d3fa6dc845a9d42bb93dc85406c596336d4b854c46f610d695da96f98b7a6bc34d5d14fe25f5bb70ea6db011b8c648712dcc81a85df951d12917ff08b868db7c2c956c063cd0cd787dad3d577c8029c5db2f37cba62c64019c148153ba5b04a6e584475baf6cb825ee389963113195e39c8bca2792c1e6c58b6b00624e1236d324276e98de4eab8ada868a4601892c741d9ea2f6b042aabe97803f65c579f7ed89daca8ba5ec4e18edf907caea316eb7aea3d7207451d1f76cff02b8932dd481a02295b0283e26362cba0d163a66f9f2fae55a60dc28111660143ec92cb03fea41608e377004f698ff3e78a19ff49003070d25022557fe71c3699aa1975892e999c8dcc60e822fd12bbdacba8197511e547fa7784ea00073cbee8cda1d1dff86c93fa48bfbc2e79e5322ab78b134df3f37709c29fb6104d64802510195691297c64e0f8ad2107db349cb705a499780d51d8c9da9bb58dc3b266716c4e99d28546abef01c83ea79265740d87556dfdc3a983840369b1187c699d84a6d2b83aea81222e5b69a079b68a6a0861c30072f9b7d4ada64f37a6abfb35a2ec6d5862eb2e98199d47bf39d0d8efaf666f1b84c3ace39b61f14ae16b0c5e0202e440c365701d415a59ba13575187dca672277275799f882446c8d146a4abdbb1056398b5ed8215bd82d996d06aad2246c2f8f88bdf4008528455f5e03e3cbf23b31a5a6407513cbad28a52756070c4a5925f8a3f832eb04b9c2998d12272d202727962238273c1074ebc019284a0e55497e6177bf6785400cb62e29b50a593f41a0088200781942a196b8cab3d52db7f15ec2d83970fc4eb595d0f1a4e8bd44f2a99cd9a92557a951107101f3b56b93711dd52ce36cccb9910c51c760300952debc45d1dde79c49b3ca032fa93535e45443e862369716ad2909b9fb604fc6e727672e9a7ac20729d1cbca11b25090e791f7e04845b364b24c9d0391dfa719a3de34d8770cdbcc50cfd5ea7c8306d0f3934a2a9c1e4ac9aa46644d203ab7cd55ab14cd411b8768e43ff699078e221539d5a321b269a6282c79dcedf1d0088e29a40fc32079ecdf07e2b0708187a90a09891b8e085ad09c4a00a2f1e2ec51c6f15023b5ada763f659f92efbd168c9855836411a0d1474bc58a2056d20ce83b2c5a0016a041c2035af24c7dc243869e0cc96d37c91ca92792b4a035824faccaa3cf0ee5a7392aa4694468902cf9c19a62150a94f496d9ce8016a0c820c7bdfd625d251d57bdbd10080e0215dc5a6a2c9205912cfe0b493585100de9630e530713947d4cbd53084a7fabccebc9b9838eed995d2d8a90eda72d99239675c1a1ed2c412bad91780d6bfcaa7770c9b5d992e29f141b3cb4dc56d335122aaafd6a6cd88600544357ae51f21bcdf4c81dfc31d4f00f0fd493947da4639e49bf22feeca4de8074a426cb80955d8d665422ea8ad9cc55d78b9624f33ca74d7a6e283b90ab24a5e663e758200433e525e0e2bdeaec63ab9e0c4a99c7801f75df2945096768e89611092ec026092b05029316a34c50895e9df774ef7c5715e4a27bcf2fd6fd36391056b50ec97cc790100536a3c32d535f42cfa8cd63707a202347fa3b739aaa44a281f60f511c2b1ed2a9d7c253cdf8957d092b0102dc41c8f43be560a66ee4d35e7ef2ea6d926067ef60c0322424fb6721a6e94d4d7e6884ba72c66eed6fa343619a33b5647e4958ebb4d11cf235171739a6a2bead8d327678388b323647228f3279229ab3de63c41dea994c9031ebccbc47eb9f65227e7fd27dfadc45735bb3b23b21f9b484bdbdc3b3f8f81c176f878d1004004a2cf34c4459322082538f8db9517627fc6c18cee0347e65a5b54ca7ce0674da148eab3ffaea96143b738b0e92a9b41916aa4de1084a90b8ec8af664f98b149bdaf62202993909555cfa870b07c6cd46151f7f6bf76085d959cd22fe9d70ede43ca70b852882559622138096da29308cdff2571fc3903e03d1828ab660bcb434c29194e392171ce8e0648770dc77fab915f6d8dbade4f8c8474ad4db712a720df870848c1da5330b318403ea6afec16f08205bd00160ff5333f05bf0066f545df3536a33ea2c7d318f496c48e870ea21e3e926ad42abff22b4bf82bffb0a4f0eb5ef849a1b693d012eb36339cbc27498e1270015ab379b8fc62cb13aaa5e5acf3a64e4d73960bcdbf32bc0325243aa7125d9114317d215293c9a5458c011f871086610fac8eaf9ea771897b6d89b8cbdf5dd97bd43804cad82e33483f3eccc83ea1096374e806db575d8da92922161a62d009432c10a05eba86fd84c6f630412abba367c305e807b9ca5d58d0f9f7613fae86a31c94fe43f9c09f81170ee966316bc710feca22c79ff3da461221571b183f2dd6b94b2956f708aca2294f2083dbbad58931fc0bfaf678722c204c17c503ea6132e610ace7978b823badf1b9ab31ab4314860ef4bcd6d55e9f2469e3c1ea84c3fff6b0e7ca51c0df5019d28d857a38a20fc5978446086c955e3f0dca7134a563376ad70bdc956210cc5da073869dba63da0dda275b00946200bc49af6f6c5cb7d52580be5454d875c620e200c41ec34b842f8e9e79be6c4b33f25cf876ce4294581faf716b2475f78e93b35e8f46f0dd036148a3270059ff5d20fde7a9842e47c9fa4b9816705ec2060d3f144ddc9d7c5181bafdffb6e09a4db8d7bcf118de71d99d11cba8a2a3c2d5c059a0cccf8e44c29094feef27e974e24f200ecd73d63c3cffcdd15be669ed94df09e79d612c5da20940d531abf698b53f802af458cf7c5e2085899842108041bf08e3239baccfa89960afeec8a6a9d7089ba4044e1082e84eda9b09d6587b4a900e84ade9ff294774cee779138edabcf117fcf4b0e5d5576014703bad721571976c858b63ae3e2b274e377d5f2f4741a0c83f94e5f54326edaf92101444ef13cb9938fda2a41fcde2663f0a1e2b2e23df8fa159b171d991952fdd25268259c4000b240a11432cc21f8afc0e8ccf08ebb90282c7435471ede26d492a08ecd6c361f9a634ebabc263d2f467f9c0eedc9ed5fbe788e04d017a6e1d8c45623e3247d54407d81cdfe3faa403c6869cd42cc276c5976acfd20cfd505c987e4bfa474320df40a7156d3861804eabe9e7ab4fbc3a140fae88dd19627abec6d644c571b6f39d05aac21ed1483b5d8889894c05701dd41aee3902426e12a0c377d890fdf5a4c098aebda05c33d75dabf68920a0e4d9790bd37ab7d4cd9ba48fbe6c0f84c046450f356d8aac4880f4b9356685b45473780a88d04400bb5e37c3901ba09c68cb987d929f404a0951173eae1879906f7fc75f43f17f5feefa05d11adb62352ee0ecd0f44fa795bc894b17fc30e1d50bad3d0c6d3aba3e4b195340473df8295ebb699b34b587d8b551eea4c423d58d2209b3226557787da18d1a15dbd07c8087a29d681a090a62d0a812eec1a222e67f7558abf307e9c258986b82e0e0916ab2faac3d97e0a83608f5320d7bee4009491d088d01b1710f2b7e1da1afc89c72216b9b028e470b5174266c68a369240a87b041d7cbc3da7500b4740a273ed6964ed83b5bb4a1e0dea14922ad8314ec8fd5214a1bb2b1091acc1072ba1eb022a7c3ce753334515e5b454ef42ca5e720f101c15c7ea97c714923568e03c71ac6c47bc13b456379076e81fcdade82797d73f3e5e1b185e35bba85b0b2828b376069b8f2750bd226f00c5a1934b3650e9a510603c89ad8856d32c5e320580a2d623d8fa6d558d3c25c0cd0ab2d32eeefd1169a4e03531ebfa7e1ca914f5a718c653150b637e9bc3039d6899a268c9d6fbb6179b1e8988788a57c72264e9b45bc1c09699767f63d8262b4f9ddc8fe1e70c254ad1af480be3235b041bfc83fc005948fcddc6fd0ca2c39313f4af6889b1ac5e9ea946769048f7f75bad3b8dad0b4c0fd154b9f05a5fd81245400299f8babafd1a99a74f63040d8f838d0735565a5b920884a0e31a7d17da742f6a02e41746718542e2dd14270e8592e732aa15fca9077338f5f9f25f6efd96a4741753cb323cd065cdc0b86b7a3831a172e589c58690f849ad40d60e881f8a1ce4383f543044d0bb07249d460d0d51fe43501542f1eb8c90cbc0aa0f4fea94145783a453532a02c138e83ca278e48f440f70d37d0dd5d21a716e1c43b50196450e74eed1c1534a95cf49bc772fe8f8c77f53903c5907d539d822c789e10cca555db9545b4c5b5ca91de9a9edce763aad603420893c2178fd5dc532f1e577a5639c2f6342f511b5a14c4207fb07ca99b1e8717f15b43de721bce3487a15bc400498b612ac6d0c93140201fe2290cd1291238c789d6c637802551088ceef67cbbbd2f568629ff2595c114647714b7af7051a733ef6ebff7b35bfe6366b83be1de7f32c884f4fee474dd96083f75b4d0dc2da2a96c602a20c3a447e6cf6c01676e920298bb69a5182b301da35b1d4458816c4f7ce913a8bd628a5a7c166e9a1a2d834442a058d14295c7b46ce15581fc82183ace44054494e4a5889669f82f5949e7b582b74fc334c3da00641872ef6410c752fb1237e36f919404b17d00aeaa63bfebefce79db3451ad045ed7b464f31b9bcfc5ef142d49f05436f3baea645105a65f95d616b727a3c77ed9556345a6f60f24919f50544334a73b90600c3482d6c4077b4116aeb044800d85af575ab1d4df523e90eaacd2f42c82c8eace0bad6a30e3723bbf1d72285c38513f18f6ab132f157a54f6fc2680cb68feb0c391171438191822baad4cd0f570bcb2d202980c040e9025d840f9f7afc4d4080f4feb0b6c0cf16ae435c0364ea3076933ac8ca8ce7452193549f857ee5f6d04f45e08fc0f4d8506c836d423d132800832fc12fd40c35923a3ccc762aac4d762ff73859d0550d0c067a320ce3b2d2c43043a2024556874fa8da49a050dd63605039048acc62292c1c614e8cac22e4ed875c7763ae25bcdc21375ae6e29fc7bbb0826f5aa2d9905ac4fbc0c2da8c45662fbd6027001c1faec60a130fa33a365bea860032f65a8a6942c5c535c31fab5a2a54a6bfdb55a67a0ea4cb992185b382b86b05638c7712fc1ae8c233f5fb66db4e3297d2263225fbc65927ced2e7bcc81fe6b9f3178aabe6c114d2f2d622b1f6e1345343d41f859ffaa85722e0f46f9c793f87c4b44bd651be379ad9b396b0b6f794293d99b627b9a96eb21349cd1399eeb0a70b4409b8bcc08903ea9174eb8e6c7439726170e6160d0b7dde1cefb78a5da41f3ce91f4100a856c7ee8c0470514b46bab173ed3f7b49bde15eabf9f748d76ead521413cf4a4296b2be67d6b79e3ff14d713f9316ff124fac0d64f9e2493e2de4f03e5de8077a89373388729fc28fd24933cbef59bc55da70c5f77728d06b59ac7bda550d29643990d054f602607c57434a75e2804d72ef1ba1d65ddf5ec0495faf592c415a3bd1020738ff25d6151ca05c3d82275f233769fe20056115266094b0a9d229189234e6f7e3ceef75ab28ab34000d7d93e950f778a25294512989a0f20a7fe67020495a06f0563d9219dc0b82e5dc28dff07d55fd41d080cb58f311a20ad19ca399028a30d99e8dd3cbd9ab5d2baa980bc439e6279f3223425c488af41454d5747571b25e0309fff714b95d0c9563979b8d674dbfa979514f1c82ef379ecd61281d1447db95f2dd3ceba1378fdedef29f63728eb36972da4b1dcbf01e51c367c74f35cd1d3dd295522609df171e8eb72b12197430643547e53cc6c44052504cc2aeb909e9fbdc030766a4c3073a0bfbb202376a4b1f3464380f82a42afacd84cb525bee6a927269bc2bb1af59a5fbc5013ca3546d771aeae85d20b4ce8227b865947c514372304247301563405c1c389c498a23f186f25bd23f20aca43694af7f00cb5a9a5494b27757500a3110e974dbb82910a13c63e9abbe9318210e43569f507a3862fa40d368bfdc3447785c9ad054b688951abfde85a64d569e66f89a3a42ada929fa176b4702c4fcb1682309db9ac6e7f26733d5b2c36dc0e4d3f1db309268044ed4184b7c47d980c97c5258d21bf75cc55b8b646e252d119ccf581e8a910c873433acb4ceb3303aa70584cad008b9f6123771883b86b13a1a27609bc5fd1a2bdd11519f7e1799430b4ddc762771425a439af4e3aea4b9cb5204e3fcbbade990005176672016b1a01095f0037f99e016bf4b8049dbd0e4c9974b4cb0a24c446f251b0e4a965544542b0fdd5dc42eb1b0ff03950ed72022414196a43ca7931f622063704d5453dbb32af58e0d332018529d95bd0c7415e0c3373c2aa70a8180323a609e138abc613e31a911854125959bbeb0eab71cf697c210168f1dc7e4bc3c0cdce929d2b4d8f63f04999b2f53b139697b18b5901d61f332fc30b3209deb0834a72dab602abff4249b7ef5387b735a994328118df1cd1a35927f693bdb8320a77f301f8dac0361bb468d09de315c114a4e759eb592d3624c05bbda5387090cef888df5faf6886d54a69f134196c8fbc5a7e985414d2f957eae80859cfb954bbae58a18cde2c2a507be2802a6c2cc2f60e41a51280a49f916a368a8ae148a02956675513e4899214ba44ae9081831c743d2d98ea64b54077afea769383e2dfd072edc9eaf2e5e7b3644ba5f08896e2812a13da5da33d043b243c91ffe4b4f2a57fe4a310b0f3e903241d60bd2b405b6afdee8fc8c5e1e815774bc5b8b6e1bc4b54ed52e5c1319583a036e82d437b2d43d3c6beb30dad8023ad473fc4b8d6675d20c6e988db4963329855eabd1700777b67888150be7e9b69ba7149fcec0a83dd2c7d77e000abed6686df8ece56c087f093f130ea555e904f086e5c68ff59b080b179cbb4d1559832b871c1596f791f435b60b86ade7149e115cee59bd7c39e09ab2a195a5925e65cb028b3e9afd0058daeddda1cc3bffc0358d3c0d4b849a273614358f71721cdc4657622bb19aa50b813953c9e6726941d293bb7537f6d45b370acd99d3ca0fc50ac2743e858840f897d86e3863b1febc73d396816eb05bc43860e3878d8cf75150ec9ce5b929cf17d280b807e4e1b23ac02537269f225302f3f86d1025429997d56aed8bc2c0fbcaf6c061d53f76e08deb9c4069c55c598b8a6e56fa4554e1e737022918effb9961d1b91ac908546fdcd5927263c7fce19a00aa967f19e2340bd8e2354913b52d6a9e144c65394297c05651cb6bb3b9b57bbc696eb83a92b6ace3db5522a284cdd29d53d42ac4d4828dd741b2251ae19083220b55a2a113e42573042a665199a16a1b3e710635bbe4143606ebeb57a3d2e245a0e9584ba0851c73fc1764ae4145f43f525d43932899f08bde850742013cd5a36b04b9316abcc3dd7a7a3fa95e52a4929072d70b7888f2c3c53952d06ccbe759976f3ce8927ee3bb9c4dfa7145be2d5de5b2a9083169f8bef03dfc0150473c52df287a5681ecd98da0d921616415166dc616f39a478a90b3d6ed96886155290e495142e18324714ef84607aec6624fdb66124291379c04b539f72d6d3674b9011468431fa60f4a1689b44b3962b0a941462aadb8a531e06cd99646a54457ebed5dc33478d6180ded486154cba7bd7d583dd0e726c991282a9fd958daa0470b521ebd02a1eb517adda082580510bd96f887d42ccf41ad9b9f9ba94bca90393ab0973568e52789cb0001031a2f8db9f28e35564399943e81214c492d09734079d3d238dad02ecb5453b7315c1aea5d146ab00762d8a1a62e5297ed1a846ab087fad452d217642ac7732def1bd2ed13f76779503cb4c45ea26864505521e7c7a1d954d28bebf7a6c290d6f270e9f6413126daef2a4a857af71951629399c4c5039c248c9e0258745f4f37ff42d0e94838f7cd7250ab85022a5f74656fb630483ae4bdeb1505131ceb5590e262bb84a0464c276d7253038935aa3e112b4e9971866d19273a17f4ce051a0098f76826c0e4c12ca8828cac09c06e13a2d8ec1fd14c92a23b34371a9ea7a2d3646559d993ab2bbb0461b4bd84aca9dcb3de0528c16ddb84244592447c7efa8831a29e6d7c9737b3e0b3f0df8f76cf521d8d1f180f678b5b9aae896120b4af8e62d773180827438241cc9e91a4d649b4aa7bd2870808a003b472a422645ad9aa09b9635985c1ffb2fde1e9e6c09c347700cf2b91384abf8bd1eab912240b8a7266eeab8ddb1c483aea46c7a0669855b58ec62e032ff05c7c75ae09ec30b426ef56ae859ccb0c5066fae7e2e2fa6e8e5b088eaa1944339bfa68c51f54359e4982c77c0e6a6b77272b597d0cd6fb4f60194c64018a20cf67711939d53d3dd19278a18e62467a2299e38b67a8774898497f267e5a20293dfe13f9746ab84e6c92f79abea7b0676030eb01c36c59a388fe974e6d4c3bd885076d80c45bd18f5f917ea67550801a06c44254ff3f62412451767256d344f8271468b021e865f400e34bde108d167506e084f186fbd347c1255e27bdba583e682acc217e2969a378ee0f6afb999beecba4c2e394ce41faba6ad3d4f83ed6f7a6a9a0fc0b4332b7bda57620398743e6d86d680f6546e82658459a1629dac1f49e866b636cbb18ab5e91027133a9bc97923b12ef70de931086cabc002f159fbb62e9ab4fea211b1d586641d8eaaa0ac706c98770a59c48aaaae32f88bb4ecc64f981194662abc4f51e09c27b2b4c1132ad380dccd31ad8e99f1d133b5c4ce4cfe5147dabb06181cdba6ab57144ead5a246e29d8ca6342971aa749d3787ab7f1cf3884d16649684b9ba22bc0d5359925b94bd22ebe2852303e6a397e92b6d37977df6ef6e6ce0449f9c831c1ca4fa09ea916a651c1ad90956ef07cf074656f6c87f1fb124e5a21a3215325f8be8907af34ee02c028194b046d7399fe269b8f831c8c43625508291f64d1401130070440258ee7b5eb7114dafce39714e38a43e56691281776264161e2de5632bf0048cf3d549f8f2e870f5c7c3973604648a77d601c553777954578598d17158384720b9d012faa2a9898813dd685425996e9345c133bf0232654c3aa374c0e47d5a4ff33b011aa5274b0752f9db9c5e192cc39cb99d5026e73e0331bd54a5dffcdabd26262a7fe64a837029657078edfd8b26a55bf624f4955ad706de1897e01f8bdae5349105470c33679bf4eb928e9b9caf3290befbd5c7d5111922c21d378e2b010bcaf16763a70b5d7c1d8304dd8a72e96a7da9da513b7da43debc5f33f0206e5d04bbcc009bfbfd679bc9d062bd7b77d173ddba1582291329b6a006832292d6f56f40178588b212c6756e1a839bc7435b230e4a4847424ca5aa85749a5ebea67460f1bed73b6f779e4b5ad1f5fcc5df29a4a3b1bea65d6ddb100db89953ef13b77ccec32b53b741a077caf62b103411f772cdf8f5e44550ad54f9a583aa00bf3f7e134bcdab6e10f296879167912fc457d52afeedc34cd20fb22dab2fee2b8765625414d132bf8970e12372bae75954dfdc4d1748ab4bc220ff8da171fe9391019e1be79d05f85d5c7f96f102ecc58ccfe750e2dadce7a0ef3f327cd1eab964b226dc716b670a60b60b37b3370ae76e9a12a16143c41fccdf0a28450d174906ec3918f2a5a95e341697ed48e057aa26c3b72ec7b7e746fc25e7b7482ac432a50d170e87aaf58bb8ac246135825058358e124eae5af6757297649c1613da8064ba0fea4109e0d599f066489409a8428500606f3e3f0fbcd3bf2eeb44028865fce822d4ab0aadc8071e6502abf77cd4d03bac4d36c720cd5944144fe6b136ab2f7857646090319495fd5001419819515af2b2aa46eca2a38bad40aaab1091b347b0d1b8d2927d12a20884c49d45b72d94a690b216b83c2e477c987f55e3e5486a330a15726964e9df32205372bf9a7382b4887db7d7712e5f205075474b300f8704944f3408a9bc944595c09d5642bb2283b5ed409603b8b001aea17e2fd0ba6b8552a9b300274cf0598add92181713014a2c0a8abdc10a39442dcf72d52d90206bf66b63124705d84158dc9b5d285551cbad906de09392408509b0036610a61dbef36089ab9e7dffac2ad51a5072cf9c271038deae7dc7f1b162e6edfbba5595a5d4c1e6dffa6584d903a705fbab1c204532a940f3041b0d25c0d543fc807bbae2763173f0e86165a693978642b0a04d0e2b19328cb4a2388ee826597b899f69b52a62fd95acc4aef413dc25006bd37b60403301005c2a3f1879aca0e167a8021d401b1bb76ec49e16b65c9f8253022f3681ceed03d99cb4992f4db1c9cc9ab9c92aabdc6340e1a69242d69a127b73f9fd387b11b23c1e9937f8067b654b92163c2bae486b5abc6602724a4351dfdd9e9c020b1e8e601dbd04011b2b5c50c963748dd903b22a23267a1b3508672d341bc1215133c704f1714560401996ec09de0549f081030631b5f9f81fa410e4cc2e0333f4a181ae09b63cd7813910354ef619c5f50a97691872ecde0cce15197f4016867ce190353c365cd75d9d500c15be8478744f2e50a0f0e24818ed252c0e573e1220188f8d58d3240ccdba5edc119f9a6766f6287b516226111ea8d0cddfc05276c2e4b132a2ef3d0c9f7baa2d019a13d4a9e81750a8f94343309094bdd50886bcfdc43eb0b23c5790341edee482316f0e733e32a8b4d4b6e3fd351f00c82c7e5b56d6daf4bfc0a478fe978d21a230b8851797be19c630277a0a57ddc89b6662eeb809d4fbe8970435a159637614214ac630db44b3500c64e70f5a5ba08a292123018cec038a09df9e541050aa8a3ab0f2193b81cd70e7991a504182f3e28e6d56427588bbb6a7af3453f6e7c5e61de5dae307ac57d3eac015c3f884638dc0bf8e572e0a0e68e43f3566a196484522d2df27516ba2366e237b6f295392328e09270ac4093344649ec7f3c049e609a408d2611ceb31ae67aeef9b239933f304a6f5ad87f9d19f8565701d93c9b5de5b8f83bf8c50c77af5acd58b3fb258ab67fd2883eb192be68705b27e583f5216f3aa0f63ae4c4e06272384eb99eacaeca184a85432324232b96e619a1c9eb9d1e0468cc3e5a6c1dd723f0dae67a30c8e26d7b33145234433d4334f0697fb53bb9e7906ad1f997c065084f53c625c0be8e648f2b0de7be43ad6a5c738140b3c320bdf1cc99c1aa3d5e3c0fad68f2c5c93c3ae9a59b11e93d1b3b11ef90aafd0798577421887733d73e9f0117e0363699a24021ec2452b961ff52ce53564c89cc643ad37fdaa85a7f07816cb85858530cef41225a462f11feb91d3787c7fcdd050c76a8a3ad658a8654256acf7afc1758cf538d7b1c6421deb9a5cc71c635cc7bac6ca50c7baf563ff90099a25f4875f63d433ca46eeaf2143f2ccdc5f83ab11aac9d178a45e2668fec0381eb81eb564827263d9b1176ccbfdaccbfad56ad5ad57fdd86ab57eac47ad5f3d90ae483d7bf9c63829eb6fe1f1e556a47a74eb1bf588f52f57e6fe503028c9abd50a081c7dd4b346fdec647f5c3c17c8d41d6b86502da0dc7fb23f230979acc1e57e13c6ddb8f193fb3f19dc9802e994eee2ef6347cc33d766aae1a22bec875a81e6921af6312ef74b13763528111b0912d3033faf3611a194923ec5b40f07160462412156e6f45ba3fee20e211d0b003a6609728c1ee41127d33742944c873235c22e53fa6f44a61f3b821a993ed5992aa8200a338adad872061b35ba46a6ffd44790e91128a574468a9579e6f17f98841823d72e72fdb663688bad89d4c35a36098574ed0ad2717efd70fec33ae62358c1c6c95fa4847c2f61fdf3c23af6fee3c3a4e7c5c47ef0c3beb16f58688af5ac1dc7f07f9ef381384e76987b1adf52fdc8b4def5f3ba5cad93ebe43a89273a9224cf0c0fac937c00499b45d20b5954e4df72a9d3a8a8c88a4bf569348d8a5a2d570b06c6e572b95c2e974b7c98d349fcd6dde1cba7f756ebf4aeeba363fd7d3ac9d0ac320243c7dc084810993bad144161c799042497944bca252549326028b2e1ab54a73781a09d6f2025cd2d3631a6c8050686e65b32ad9996ab253e8deb67645c3030e287e2493c9dbe844a89457804b12d726d992e3c93265052d21624299341ec4892329963dad6338ff911147fb430ad161e5ddffad075db96e4fa7126b97e6ee9989b4c30784e5bcf5cd85db86d9e2426b58d84f77fc12338b3c237388d044c0382335825f191ea8229973b9e32ea149e40203b8a1da3e9ef51cc31d50f4cb7a680d46532a15c502e2997ddd19c269369b54afd2af5a6d64f8149a55c68962817981606a2f5ad0f5b2653ebd4725117a552c58eb328871ead5505d372ad60ae6bf5ad95474d260aae502bd491cb6456ed5c26b389a284a08c384d8471b5441857cb093b82598a1fb3ab563d415556547debe76db554acb72d6bed4b9665154d2397ee2a554bb55ab55aad56abd56a85bf62b15e7577f8322b0cc3ab5235eb9bf57d0a59dfbaad3b05881b7485add66abdea67abf533b75a3fbfa5c2483c8fac6f9490f9ad7b83aeb065899281a5c23998f2b4a175c14cbde92d1e3fdbefbfd3873fb3298a704ed6f75fbb5e503fa7ccab44558caaa5c2e37cd6cbb43ea685c7f9abf00b4f2f5161f825940beb4bcdd66c59f19f453a97c9fc824730a382d881ea9834e2b4199967adf068553356c6c658d1829fba32bb7c8f3af550412aa7d8f194e9a9c606f655b7d4149807d2144747870427bbbc6ade1127abe6553deaeee0c2c54cf6177d8a91fd5992367d66b2bf66c649253f0a04a7cffc1965e289e78f8fe8f3235142a80f4fc1937d11479ad96fba3bf8905d4625d9e59b2922fe9498ef7679a739e6da440c84f8e287e26562ab9203ea67951c504f1f85675e98382041e5f01423f1ecf2e215af0b8ceac1d28cd2329f1758cbc48e3dd48c43130cac3f08162515151541c9f52b3d5194d0cc1076e65078e28a7a66df7f5ae95965ad5efa9b5031ef02661717d5a3de7ecc15af943298abc223ea533f8178ead64709f95a90d9fb122ab42f78049f85477bc2eeeebec3cca71f8fe4a942c5d2b0a34c721e6cd87116cd2b2893e9551fa2ee45bd0083c28ec2d308cf2299618c384d46fc14867917bc138341114bd40371faa7faae1bc40e2ca44ce6d60d6287155226b3e99a9eb02ebc3ba574d5ac3882602281e779d33323ac8304b5d65a7300b24149d0823cbe87259492477663f72aadcbe4f774239c5687d27703f4a8cbfbde7f209dd3db6ba529dc1788ee66328425d59589e943d34bd37b9ec9f4f3ba494a37993cc80dd235ec9ffce33354f68f1bf6bf4b606c7e909e495d1e63b11f3cfe1c6ab561c7fef1f00e0630e199fefe81b5acbf84857bdfed789c41fe2d693984859ee69cb3ca89c31420746a55c699bfa70f5e26e09774c0c1039ea784007c996b122535f0e51d9548d410107b7804eff8832d57fae0154249cdbb1f9eb65610e8ef5a6cd8ddbb03e1624bcb64f62e902e9a740f94ec5b6421e48f836cf5244f064b620ce6617e9e170769d94cc28b3c4e2415c48ecc7934771d934db1a3dcd9403fbb7d9f21b6a165fe8e6552d85e61668a2ab0a3f84e43af946de4c2e48530bcc140e2993e929a6795307a0afd1e261461ede91994e9490f4b8a3f30ec180b800f99fc019b31db3dcc4c1f897b53e64cdb317096fa2657a15d5069a16792c88b28993e0c3d53e529367f2098cc0c2182c1c6451c8b2ef31ec433433c0f27a942c49b35f0c19f35b049cc65e2b713abf9f7cc0cfef38bf44b3f4308506cd9c8838aac64f094f2cf614a7d79254f911f0482a789323269685b4d621b7d5964de51abd846f14c9159a33f6bf40720e4951ab6c92bb559640e9157f22c027d39411afce713f1bebf7efb4f9c24c9cc10d32ba995becacc901faa10f9beff874c4392dbaccd67326bf37ff8f0bb0ccfd45752f3f04cc53c10f1f73e8963eafd6865ed7bfa276c31e9e8e480e8fc508508f8fd3ffc00e221276cf9b0cbe81cda9209902511514f96ee442a97eb4ef3b895bebffad49f9ed11f776e2c8909a763206a8aa503bcb14a8f240fae66e146f68eb022d7f7274dfb7238c933bfbedf8ea8d851f98ca2e4fab2bf9c43f990421739b2c8d53b22e764ce11155d5163172499533f1ce2eb4b42fe724e4345296ac2888a2e5714153b94d051ae2ff321e58abac38ea69c6a7e7d1fd5b332678e1bc8ddf5c39d1d20348b142405dd1bb91691f1422a8693ca8158ea955ce79cd37d4ef7e93ee7bb60091d13c71f74ff3e69c23204d26118beec99e941d01496c0d043939740f7cf135d505530fbedecd9b3c7a5f411c41d1fe9d80d726783b794f25d5a69a59556babbe7d5dd77742c153b232377776fef2f051dee1348c81b572fad337cdf3908a676bb5dea25ca6f2e4bc38e7d46ee1ffb8c172c9eb12fb34ac86761fbd4e089d276f909d4330a66bff4fb54ef503a937f23128994512c7406a2d2446edaeda1a267720ba227b95d3714f482de628b2df238cfa0bef323dd19f4288f7e25b7bf91258f246202a56793889d9eede8ecc474621e94056d02b5aca7fc014496d03b3a5c58cfc35356a64c57efa369abefd50dd2325a9372d89cd378588435109672339aa60f3dd952b66ce9b5d63a6d778ee62e16d6c32392975c319ee997b5204df14c3f9d601bf6f328e6c658a9149363a46cbe2873e68fd22867e5eea3c16a08dbddefdd46e08bb541d6282673d3885230f1c99288c92d6b9125d192a11c235a4245f69e66b1548653a61807fa21bde00be5ef87b27f589f3a123994bd129196d1ec78881c5ac0e618fa8a83a439a8c8720b25b2c82de7f7d4911b8fef496147304f1d4829037b3e2e7ac09ef537c5dd90b0a2aae124d7ef339af6f5dc5a87f326411fd0cfe79303b140e288aa460f6e0b904f4f2ed723698fd34e574e6ff89cb0fc9cb60035097a82ebc99d763d92ca06ed4e90179d5cff144b41d299eaf986e8c099b0cb2d6b29896261bf63ed1982f5a0d487f3f452c7e929ea057925538c43eb650e67e41c4cac610b676eb13eac474bd811e37ae0248fe9fb0a19eb0f6b702e2fab7f1b99335dfb7e4d5f83eb1a44bea2bddab2bfa8de31ae57ab775bf6159632078fac4f8d9e5df0588350bd60dc1802a48ca47571f09f790a8f9fb93344647ee6674828c28e34b8d4873c6e7da365fdb2964ae17a8403fb5088c8232ecadd1fb66e76e6c13c837960a397273d2f779cf9e589b53571fbf362e47ddaa2e3e2e815f3aaf0759bbcbe0f5faf57ccadc9d508bd6a70af9baa01297dd3a43cb68084666e34389a5c8d8e8686a6e6454fde9c3d8e40c50f0c17ad54eae6208d9e9acc2b0952835399c08e2d201e352f130b9e592f03247956df53f84c26a863fdf6f4313ac9e38f7a1148f2b83c0d2e84f971e6568f685a3f53780eea7ed78f3238d68fcc6911fc71e6668393393257637f583f2f4632a7df84644a0a5937bc996ef8a463d656f323f8b2b6b739ed31aec1e00b4b97ed7860e97865847df911e35e4689831adde82efbc3c304318e4ae141b480c61a441e5b40200d0d0d6ec2d258e9c0d5a1a770f2850f2e25e510d7b27e2cd433cf3be8b0811c3480048731033760e00216b0a1021498c01109440002353c80060718694011061059800266182243026280e10504b8d0020b2b080972801ace405430400152f8c143801dda0c051f270cc0049d120490736b1ec7e7072808972bea61e4341ebebf870ee3248f5b9b2ca1df7e7873616f735f1fbb37dfe3da3c006eec65b7c7e35c007c00aeecff06e06b2ecefb75c93cdc263561cde5513bd5c23ed55c542df493cbb540b609979afda9b9a95a4d0ed7e06a70f3a4c36dc28167a283cd66b3d53af03bdc1e7e037787d7c0ddc0e77075781cae061ec9cde1337071f8f122790cdc0cfc0d777c0b5c0cfc05ee0d5f816b81b7e15ee027702bf014b836bc04ee04fec8a5c043e04ae023708ffc032e04be861b8177c07dc0d3706bf8065c07bc914bc333e036e08b5c23bf80cb8027728bfc0c7701cfe3c25e0197c8cb7067f82157011fc395e1137087fc0b378687e126e05db82f3c022e0ccfc275e15bb808782197855fe1b6f007b8429e87fbfa207785c7f7005fbb411ec8c59f6fed0d7081bc0a377f0ad7005f80abc2f3dc14fec72dc0ef5c9e27c0fdf1b3bbf3b44b80f771678fc2a5fd00ae8f3fe1a2f03a77006fc23de1057075be846bc2df2b80cfb925fcdffb3537e7fd9eb2b3c61adc4ccfccad083be21690d37838edbfe6fb6b8c7ab89603d716350a365783fbf11d74f80d7c3f36725a0eaf81efc73ba721f97e7ce4341cbe1f23396dfc7e9ce4b40c7cffcbe6b41bbeff75731a06beffd5e3b40b7cffcbc76916781bbeff05e4b40a7cff2bc86914f8fe17ce6913f8fe57ce6947beff55e434097cffcbc86911f8fe97ce6910f8fed7ce69357cffebc8690ff8fe17d22b096683dd603d301fd80f0c081604c3c172b02298114c07dbc18e6048b0241b9bcdcda6c7c6c7e6c76941bedf06c826c806e7348c9b309977d4aaac7e04600d7fbf4dcea6c86940bedfc6c8692a7cbf8dce6906f87e9b9d8d0d924dd28dede676d373e373f37373137483bbc9dd14dd18dde86e7637474ebbb84915d68f00acddefbf41721acef7df24392d000f80efef71739aecfb7bf4382df6fd3d7c9cd6e3fb7bfc38ede6fb7b0039cde6fb7b04390df6fd3d704e7b7d3b8f77f77faf796761c65b4044649e074e22898e5803579359dd293cfc0e17e3700e176123acc33b7c849170d2cbf6babd7a5e3eaf9f17d02be8857be55e452fa397eeb57bc00be99504b3c16eb01e98cf0f50102e5764a4db1d2125d9d86c6e363d363e363f364036412eb3c9d914d918d9e86c7636473648364937b69bdb4dcf8dcfcdcf0dd04dd00dee267753746374a3bbd9dd20dd24f5b0f5b8f5e8e9e1d3e3a707508fa09b7a294f78f91b37240afdafdbe401cf04085bedf5f8dec01a0fd806e7b201b44087ef9c6f017cbf67735a09aff36dc2f77b3e4e1bc0f709df3ebe51f89e7dbf97731aed7bc76904f87e4fe7349eeff7764efbf1fdde91d352f87e0fc969057803a800247fffe7e3b4daf77f3f4e3bc00711f2fd1fce692b7cff97731a0bdfc2f77f464e73e1fb3f9dd310f0fddfce692f7cff77e43418beff43725a0cdfff25392d01df0fda9c26c3f78337a70df97eb0c769337c3fe8e334057c3ff8e3b4057c3f08e43422df0f06398d015fe4fbc19cd31af046be1f34729a03be1fd4398d86ef07774eb3b101b2f9b1f1b1e9b1b9d9d860493024d8116c07d3c18c6045b01c0c070b8201c17e603eb01ed80d667b25bd905e472e7bed5eba97d1eb957be15e412fa0d7cfcbe7d5f37ad9701246c247788775d808e31cc6ddecd802ca0fb82290346187dbd2e1b636705b39dc96066e0bc96de1705be36d65e0b66eb82d0cdcd605aecb02d765c37555e0ba28705d13b8ae23d72581eb8ac07541e0ba6ab8ae075c170dd7e580eb32725d0db8ae221786011786c88559c08551c08599e1c20cb930325c185c022e4c2e860b5304c385317ae1c2e8107061762e5c98a3162e0c120b172669852bda845cf116e48a3d07b8a24fed8a3fab2b02c99cfe7cc5202057c4a970c59c01ae5854802b1aa57045dd8f2bf25c910057dcb96292cbfa6937c61683c28df171634eb8313f3140313a3706e7b2fe126e8c006e4cce8d31ba313b97f507e0c61cdd18d98d49ba323697f5f7b8323797f5df5c199b2b03bb323f2eeb7f5d196c7a294f68bde8028942ffbd529ad0023a61a455e49832240acdc2313a99c3e3fead35b7ea6edd75ac052456116190691579c477a433c8aa3bf638a3c7516e951776a4a119a2290a873ad634452b23ace7b07e931fb689265e5ee6143040a7f18071b960440be3f240f104823d722e43b5e1792fd68a1e18da55e82ad68ccafeb0547885ce2aafe7a8227937af898a2549d562595cfeb14df4cca99c5a3532df8f73b8a86772c45672632322a61acd4b140d332f83033e7ce0e0c0603434f336c65a309a37db164658c9534a4fefcf292c2d05e18644183d6f53d8f16d90e90b2292b224dac24ab659126d21948bf0c992680b2c59126d7146fb89667eea954c3c3383fdd413b19fc249aacc4f62f14f4c44f5f62d4e625f49cdf43344bdea65ede482676660bdea8bb05e857fa84264f5aaff41ba0c8559b888ea59cfc23fac700bd965cd34e7db9bbad2651565c292e7bb9be83bcde3e8c04ab73542b014d5740ad0652ed650d91191ecbcc08eb1147c4c597338a2783286917519b2b1226443c58652f460c305f80b5bb3247ad28494275162744629a59452ea5577982b534a296577b7a4b4dddb93dddd527edd2df06499235f14417076b7007ede47b30799d4bdbbbbbbbb3d170e42091be56ca7d5fb40cf633a3b2f1d2c99ea07933cfe25a9923959b64d96b236820142fec2efe4a70fd5a8e94fe9e9e420787a5972f9524144029820cb53feff97c00fbd0fc84a07e3cccc37bb47bd909e4e32882040d4e7e212eb18cded799e975431b3de649b170c67777793b5928aa7eef6244f34fb4dfde89486ab504a38bb4f9f5f99232bf53cf99dc025ec042518dbf19e4710ace7493d4f27cbea799252e9d5126832812593bca6124843144a7edf576b0974afeeee626bb5b5e2ef8e145c8287ce3db4ea47fdd1ddddabbbbb7bf53ac5ce9fb34aa953cf13456bebf7e1f07d9573860bf74aa630cb90237257034519d15d09fc09e5799e872a6529d151ca5272a9214e98c5c8af0444ab9a5e166b85b45168552ca75e29044d6058f2e8f56e2e4d139dee64057af54bfda04f3da3a1d52b993ed4c988c80d438ed46044374d3147b2bf3cf9d0d10182da49f20b03aa85a20f7575a53e9aef252d9452fa25940b9f5d8488a24c759d5a6cea64b5ecdc4a1f42e661d62ada48aee69cb3faf271a68e4926cb5596a66c6a493b32254fd820688d4aefdefbb7ae634d861108aa4e52f298da6e9147a03283253cf0396ae38a27d4984f9e3821429565100d1194e983b5d6da5b7a8cf8ea0fc0c8f43d94105a2b6ace2a5d95c028532f2a51095ae045403a21d72ac30aeab8c387091d53f820084fd22839b102ab52da81a04eeb9c8492d8f92d8c24c09de9f6839e6f480a4a37220c6122e95607123f4e9e10e1648912444972d202238648c93989c1114350f0e3440b2743a2d82c153aadf3da626b9643624cd123060ec684185e6011c30c29d280e95e778801078e8e1092a809be3474e0060eb2dcf1240853f4a9aa504443505a20e4060cee109243cb7f95318c88aae88114eb0323f8dc80288b114421cac2045608c9a1e5bf8a1c2cf9d50f2504fc2f8d22c8400b387456378310ea5355a1daa25027156a8671c50570601186152db07d7a55adb6db9e50aada78447df8e3e9671aefd0cf42e330a2fef47d5990d9aabeeff827d0714488c561fb789ef7a1974135ec875e83a00be1cf785f2a83a63d91e62f635927cbf722489a634aa164ef47b7237b384af6e8fb3b4e4271929983254962d49200e1a1d146adf5498048d5a0461f087904256a55522ed7f5249779dfbad4d62878ef7765038bfad48f8ea47aea447a2e96f5ff8247d109161ead14aa44f61c29c4b615ae498d82a7cb2a3c8a8ee4593cd22390aa2365efb6dac2d27791d292cc2ce01843574b02441d42a356653e107309306a55523fda496fb239bc89631df328f59ede5c65c36f1f5fe1113ce11185291134a867a8f79e52416f92e766efe913c9e3650fabf0489dc89ecd52b2479590c1e5675e48b93caa5b9f6ae18ed2b2f6bcef547ba84b4f9736d131efc34b813af6f446a1d028f4a7633d1df3bcfef17ea4b7ecbd6c8ef66105a53a2606221973dc2c9231870a167cd829060a0b7ecdd5fa737a2cc76292e773fd187234a0430f389267e65a7520890a9051a00941d5b53775434c1383f720a6e958b5a02d9d1ebcd5444b59d51d3d6c3d06d33b0d4df8a80f43d47d094f42e883b77260e693775d3e9428101ca710940b787ba8342f1d93d92f38ffdb4185d29fee942516fc25cd60cf3e9a8f965139c399722693b1fa55e6d4afb1faf2a2e3a5c8d8d9942e652493c328bb125387514432b264a9afeab1a5e96dca9ec77a7ae958fdfe1d5584bea38af877cfdf38320f9dbf8f9039b57b644e6d3287a5376aabffe153c76416b1d5427b7a84e4d0f2a9961676046573c814151d9b299c0aead8fc58169b0acaf341ef1f41182e2ceaf238c5a34d9e2309798ead542e8a2782ae8c2a3150c44041868e8eb47f52c7eeb5d6ea5ea94bea791894142994b0d1fee4faa1aac73a1d3af73e9934877e902269319725913c5254621281cab34aae4ee45a826185851dd2b1fa25dc42c7646ed851ea62a0c5baec3849cf6c3f7b7efaf46c06142397c7162397e4b233ac53d3d323b405862d8114bff7c4779374ac8a64d816c9b0261e11c89cfa6305812ca1becc14bfe8ec184ba25f033d828dc861471f926a9d223dec437db73f253a84e4d0f2607ca53fe36f5ff52e3f43f19019ffd4db9f713c43d752a8961656cae6f05dd56529f2d5ad3897d557dd1ae4b2faf6562097c921695567cbf5a30349f278f4f461d539ed2bc293565dcdc99c5ab190b2fad58807b9562e52b8feb8ac3e90fe6e55f7932ba8cbf52b929f51cfe657e4322397d587e1c27e5fdc5cffb32279fa5b23573cda0f8d5c3f3ca2f2f815e5ec42f2963c185562a0d01dad6cd93f051d1f319c878934baee335ac7470ce761796c5debd0b48e0e0c17d68390de93ddfbfd1b0dc973b37f9f2179a898c51b0eef355a974ae53b44e6cc20652e776df46e86aee9b80c95bf9bd569a446d2b25ac24237f651eb649e4f987aec7c50b45956243adc20871d5ba76b5deb6ceb5ad767f44e3765d7fd14b7ae634e85ff4cae6ca01da1848120088260cfe44feaf5f3c09268c22f545ad0099531d087f94c8452babbd7daefb57b3b1a423e84e7799ea7a588de1246933ae81445841107d0105c9881820ac6962188287d600d80c8a7ade3cd4a6ba52f1958304ba21b0c603cb05e96443717c061bf2c896e2cc8e353a2db0aa6a7ca92e846829b4f1474d2f993651285f38bf0add305388984386a9b6bad4a64719ab504b1d65a7beaf06232550108221915618b19d8208d18d4aa1bb9562fd75a6b9d3e994ae1e140718aa52a6e392837319ec810c70f1a4f647863e7061145444db4f404b94c8244428c000919e048729904c53839b1c20bdd90910c5a36fbf5a955af7215ca85c83061ddefcce1fb7bd73f04dd145aeb260f94481907ef41a7ee4edda9c924692c2624ca3114b971b3203713d6b3fc21247a9261c2d28cfab09e6498b035a33ef44e324c84df498609fb65d487a1cb69a25800df8b61a7ee943a75a75f6da852d149252ca158e8ec3dfea33b969e8d8d735dcfa6efbc9fdee8937e0ac5af1c39cd6bfd957aae8b1ad742439d44ee2fb91492474a9e99db243b4acc953c324f9d1d3765c73bbb930c13d6e30148073830b0ddddd62969a530a7f1ea1fadf5ddf3d92b37ecfc0ad2d9b441eeeef246e8c99a69bf644ff43c0fcb6ffa7d4f3ff7c6630f214e4a7ec7e47fd9cb282132d7da127647a7ee28215def877aa19ee48f3e9b3e2baf52d9a565292bf1a6698d0f7ccf443fb0149edc253553a9afefe292aa2e58ba7cc5b463154b53101935c59e92b484b59abcde0f2cd907ef14fb2569a1d3a52b0aa857bfe45528a6e755283c3c658ef73353af72d224f4ab3e41907a5e3f10fcaa16cf699296929493524a7fd2ccf95e29f52afd9cd052c127a0e731ea51b07a948a20cf77d07b2d1e0f424e5f7ae9a367608afef44ce1e96332967249cd58ea252a8654924cafcca6ce61a34e21954dddc584a5cc313d903695aed799e9a55f1019fcee14157e69d904414967aaa996b09df22084bef7a753cf40ff0abecbda88cb5aea5ababb38aee148bfc0faccfe9d68cfaa8cd59727ea511004c10ffcbe989fbcce2335bca06c0d473c235e58a272cee972964c279a8a8f18d165094f29f8c0c92714cde5c797540abb8020ca8a5267922f7559c708ab04311407b257ef03b3d6f044737b9f77ea59c9eb491511f6877d5f480939810eeb4f1db330c394100a88efcd4a6ba54edc6e544024250544524e302bbd4831820689df1441ef2183285b721b4a546173590f29f6cb9228ca0e368405b3248aa21312c508a466845bb27c222b57b2c43df409401405594a389e737f39e2f818e590952e5c9ef1c6e75162f19147b96500799c4d76f2389fe47146c93e9b8062257b4e7628743841a4c41a4426b8e209d109ce8842e4c3064e47b444121522267c60022214000165296794da21da42269ee7799e0c862831a96354b18532a9b5d65aa5082e44c81045088d2562b044891e502314711a238a2088781151591249596284298a445084a690097a44597376a03c49828c5c9fea80c695319a788114299cd02d488461a2f46451a83509152011845c65510953c2a8e244880d336e40ed30c24aadb5aedcb0a39877e68bae7bc994e6882e5e327dd0fa20532224aab03df3f9adb1234e11ecc1f2a4067db625688fb744093c06bbda8222fa4554c0143dd43a4dce2a45ae25a8d5599fb44c4201a3d826442a4f452c7f5208b54ce651277fdfce115718a18018e0c2298280d2834a1c4fdc208e2b8a88230c39e250e3358775653914871caf2c87902a092a9329b5889a25518f15266177f7e84feb8c52efdcc38f9692764b29a9154c76230882a28b7943b3bb274dc7da8f6232c77f6744299d3323d1dd0b6eb48105500cda38028d3a32f084104f92d470630b2a948e1e2d4a3c932a4129a5ad64499535808860870f1873d0a49e27503c53c7a940800e2d54488105098ee098a307caaabf5a3f8f7ef47e18e68958986812ee4a4308db0ab400c21341502d5a28a51407d6b1ee194dc7b0e823c5851d455f428e18dca863063e10f2620c2168961d58931274ca308486b8e20a0feeb04208588a5c66d474825a6bad2f69953d28620da42fccb8c30630a8555a845c71d607181482ed9732a7293d499ef6ee9c501329b88306528470c70d882077604410484d90a2b41b7003346a7084a338683024470e4655dcf182a0268480a3a633834cdf47cfaabf6c25888c78929bccdafcbf634b6907f685c83f56c76b75f7dc73cfddfd65ad4eab1695ba162f65356624fbcf962d81104ad838914e2da59c724ae974528f7ad4a3e30bfd7977f0d3e9e91f499a44129192dcab5246415cb31ca146e0d971ca32825a6bad42e862c0440d9048411d0e14c58e1a45716596d1050e600086b1848a2565142146e3b4e0083838e208296458a9391d4276a222bcc8fe2f22511156645596444500b120047b36a7cecec73ee9a5aa37a6785ea1ee52fa4b7f3a6bc5524a3aa7e74959abeca156299bca13789e9c58ca4aa553e95406d0875c9d89714eb163b4564aa947a947afe77993eeaa0dab372c7d494393e74fcffbdc4bd78222f51258bdcf3f2c3dafd6ea795e8c0acfab3e3e6ffa7b4e713a26dfdb65b532744e2f8bb065775bff4f142d088218885652bb7114d7ba3aeac15309f18376cf1e689e629b2952abf876aac99f712195fd53794a082a065d267d4ebb2594b091cec679d1fcd1d89166095d489e899d0832c7931307ff494e25702ef31e04ad1545dce7452cbcc22e18851f05e34ae1d1b6bca8287bef1fcd125b9ff60d0cad492c3d28c59efee5bd772ce48c2e2163de7bdf38a7bde0971fdfbe0b920f0c08baac6d61241cf64e98be511fb9f7a0155f3753a4f52fff827f78f9d6cb5ad8ba3f2c69bdeb93b8f04c919777bd0bffe04ad27a17b62e9bdfa821add6555293282143aacc2021493b8126d004f2212929292929292c7dee6345f16359478af51c2989dae88df6b8cf8b2dcb6fc923c5fa28a979ef40ee415ecd7bcf499e497f584ec47298f23ccff340100475443bf842ccf33fb08c25488479bed78309650c539e5fcdd0428a35e819538a0c4e79bea301e492e7b774d0ef7c70be158bcac822db3c7f82208824963fece1259207b962c7a3d8ab58a6814ac0e9d24548f33492524aa937756c3b26fd89066aa00602aa413aa0ec5e869c51273276739a09fbcefb1efc120e4e1e3d080582276b4351bc65fa031b933cfde3f3fc367f7cd877b38412481e0ffb0f640e7d4c6f344bac3f9d492ea30f82d68ae23ffd3146938a8a66d12c9a3ed367fadc00962c287eefd51db06441f1fb58dd01bd4441d1f3201d2976f45dd0ee082989da26ce694a6af43de7345aa3ef45f4ddc8759267d29e931ce10f7f199b3f1cbb204bc02fc89cfe1100361b174cd4a44c21fb90304c3d540b28272cf8611b739a0b52d62f86b71ab16ec1071d3a165bc3d224421e7a00f3d7b5fa61afd03b43745ce67de827f97da3567891914158fa3e3390f6ee0973d82a674f09c2297f7800ccdfcb2c755e66f9e2fcd1b88597913c132340e678af237e4ebd4cdd297a8f02c193b5a1289ab00762af847d78494236696cb6b2d0193f18b63e155133c81a5804ced2055d26c59b3ddd9588e9b351e82f76240f902c796ae87c3923e94e0a24e41e9a2685f013a4679228cacffc519241bd674d9e3fdfc79c734abc23a310522379e4efa8113397fd435969f3d8d966a5120b78025fa6b52e34d2bc1c9039fe93ca5993c35139b11c29420c278e3cca2b311f3acd01c9331f25c44e7c44878e84ed87c99448054de446b90093a5bb58d611b665a56fb4825d572ab11cb122d288b0c6ff31e8ccfa13ebccb8207fbec43e665ca02f5f621c2c6518d23157922586a1632e649efa12e9a4f6210909d9a9681a8f1f97443f4550c69fec524e89255bb96166a763fe540870e4515ec96fb8df3a17030c3d934f24450597eaf0a50d07416b45f13f168b8df396c40050d0c0a796a4ca8c0bae240361da522b7d78a3fd92a77be68fb6d5515407ee46b4044a260137d434c986240ae28d2c77f3569341ef8690caa8b5fae0e7cda81072ff0d56de905872bfc4d0990170e486b4b03ac3fa0ef38ebc32c3d2af617f07a3a3a874cc37663deb149a110000008080009315000028100c0704429150248c4451491f14800e72a04e725897cb834992e3300821630c31801842c000190011a2a155e6abc1f0eff98a5a68a59551fd2a84a489e20c874c8d065d4848e9139e58a41cebe32a11dba4bf8ca7e59d069f016e2760b5156c3cb78c30907ad851b7e34b2f12bb8309f5099500f8f69f9d8a40cdd9a8b4e4786dc7a1e79c22c0f1762ea3b93c581235afc569846b9f4bb8d2dd624be75c6762b0cb40ccb203208814b1cb9609519dc0b471e8af3e56e82d4833a20cf7f075f3ccce0e5910252811bc3d580a25a51b9b2b1043332ede8a162d40e9496c8acd644ec816d2eb81f02c07bb762d30146f47d557c1c4f3b1925791b9343118a80bd4e2a2014855459707c043312d447c1625519a49beda77b794d305323f05f1efe572789d90d82f475b97fdfd662199181f1e36bc8a490b144503c22696dd69cc42ae0c68eaa354e69d184480e6fdf616e61b29e27e3b3391351f5a8ac78e4cc6c9acee6f06e3f855bb83f75e4a91f6a63a66d195b8b4abacfa57295081960f54f48d3e2c1607d3cbaf4c87626d1e0cdffa7db23ee7c1bd624dcd616fdc1441edfd96e7a2051f9fcad9893ed03f6043c08cc33078e414d044d8840fba3f67ec6a3d1b58185657b79cdab909708c66f255c9304c7181403414e28967bb049a809e8a078767f5f83ace74356124c3d921235d7dca6ce27524d3f93a107000258c5714bf429b747d7a39fbe9479101986cb0c8b19c435edc7d24d010f6a84067509f6896dae524e64f3e325305f5e99fb30f98b6549c45b266bb43b8146b6f04a50f54e47235939cb3e733aa32f72d374ee3e5317216a01f23256ded02572a5502091f53deaa8df15e860cd84b8bc6140ac9873281e7fed779c971527c028b59eb278bfd7b29a3655f861a920e4bff53fb6d63698b0f1c6154ff012220228bb28809a9602df5b59143024072bb620dd386e90592b1831484f0702650224f4636ffb70f887a637f391a8b951ed3341f8d15208af24c4dbb4b3ca50425bcf8d8a61a5e7852f45d67c6fb8aece4f69472c8759b936592602e857a110f487156d505750b22c84dd1c767edf9b4ecfa6e427c4b163d36c11a8a0641263bad01ba89ed3f97f7d3d459e124c8b92131d20fe07b38282f326aedd9328bc6002bf713557796d67b26c2d6f051ff33dd174ac9240ccf7ff06fd2cb20e1d99af1b2deeb9aa44b1abf5c7f5bfe976c98a015b5e349cdecac46e8d592027542a72903e5c9e5db88304d25966531fad720ec0cd2e3637de8164559cda3d890f43849e0b7229bb8156328d3e1b8c8826398311a26a9a8355cc49b41f17e4869a24756b2210498c10f496eddeaf871fb45a2a866f47e975f3cd55ffbbda9c627cc83646b0cb08700fddef03566c04870cd6f05a19951560913caa45bcf069f13b073b82d08eb822680bd4078563296b615925ef68126e19a92ab047e568566f72f880b2ded6c3c7920f6435db8b7ccba55ba0985d1f8636914b27b3ac29891925d3c66a65b1c9528bd2b20f8c0da37932c3dc35d5e2610da74eca3a81bf340448c8381e484343a49d1b30a827a153419400dbe1c61083c6b1fce9f87319c6328c961d49f18f01ab69a184ff8805cdb99797d3ebc2e11d91120b59391c3c7c8b27b9749505a62b5264c34df438510708a9ee884624e5365c9931a72ab12a351ab0fba5131ea68a055a08e97183945ab5b241b245db42441d72721a628f22e0dea43b312583de79832a168512ec3e10c429b83fce781dbdddc8d1944affdd10d6618340401d8b5404f3407e40e569fa2d4ae00a054996b47feefacb1039855630db1be71a01ba986241d9926b10cb331202d36ea7782101548c083b0d80abe0c76910302942d574968f38f74dc1fdb32ca1e543a30fb691162a5d89c7592fd13d3222a30eae25b3c210829f027d3277b1ab470527740807c75c76190150d6ab032a8af7dc4263b71511b66c64dd62105c6174f015943012d9a4afc9525f06b2a330e1d22a9f07e013da98098a283c2c88235c4dad0e3025a72c4b9b56bb7f1eec012c46b0029cab5573460f1340915b64d97106417eb770a58d0ef314938dbdb97629d1f8673e13fded6e99905f4322388c7ec27b8dbc19a60fc650362159cd03d5cf35429ea07f5d22f7c65c43359c8a329b8dcd661561e77c6025edfa083c20c3009c9e4a9b10f323ddf18f63eb53ba6246ec7053021eba0e91e564518803d75d82f6d5be514e114627a0353dd91e0b113f208ad61b301e01c6603ca11ca0dd6d69d028c735028259b19c0a5de131216a2d74491e903448f2f89ddeda3e9f28b60250630b23417095f29692f800b9721a27f5dc7702ab2528a4856b2fdf5b57068498e33a0d1c3755496f9bf063dc59a570d6ac5953ea41f2a356e581c72239801e41cb63f2f0aa6c861049d889617805023c1cc07cdb67a4e859b7890cfe44b5e6456f9f612799bf8dbc997a8162093ec5bc9dab82251aecc8cb5f0f5e9f61e87807169230830bad3e6834516e98baa95b7f7c44d604398780ad8437c169f508f9af11a0b51d10eaf3848db7d0f4cebf68188f2db795ee06e8f7472fea26e6de4e12d1c3bea469ef99b9dde43bc669c15a171688715a614f9dd6822b3e936ce1ee2942115380d07b05296d53e0072330b93e23e226dd7ba2a466cb239a4e74e5c20bfd52551b2a39f0eb9a5a3338c9161d93beb51181d9521444f5df2c9ea524256001de278e13f33ce5cab01bd6ba5fbfc04fe2dd14bbe77e7c8db5b2a97a6eb32978bfe721760b68aee145c2ba308a38131d8aa3c5c259773ad17cc98a8c289075c403a5223a3029c2d77ecc1a4ba2f07cca287b05b4697b6dd50ab4b53f2ba5178bab69f6383d6b215c8e4066ed4a961c82c95c64e2b3ca79dd2a105c54232ab8a78f12484eb61256c2261a285dca04696387ff69a63a9864a91153708ea7ed81eefc276b6482aab6a6085a2e1989923aa02058e6d137dd880090d4fb8f88453b5b4e33386731c3d1f845c881543a2b4c8fa7ab1c4853a08a6d9b09c38d043a92e7e1b31bd119a6e5f657e7ec23fb956b9082520ad5f66b16c612a1a9c0831e5aa68600d436197144b079484268ac140b53232f2e290affd539abf32816353a6e3023202bc2cc4eed037fa368184605c00fe28446f219afaeacd6a23242a137b29b39e5ae49996961c959d9d814530952588a80dc4a9c0755b5077cebab93de01ee06ddf171ad4fd4ba570f2219f568955bf60552e2113c76c6688d3ebf4fec433505ca5b82ae1931ab8b747e5ca14280d8cd4f9c22268a27a4b94c2df6b6a7951d6b10a2ecfcd274a6414d172f52e2c090eaadcaa7a997a9f3cdb2438786aabf6a59c8f2aeb64b9dfa33936fc0edb53d4b37878f957460c16bee57953b1921b8f179cbfd5fd8aa985c623bfd0e076ec55b2a8794180a13133d1c97e3ae7f364fd60c6fe53a5daf1c278e3d501b11b47929e7a272def07847baec18c995dd2c305ce2b066cd1e0b2410ad73c98b8678f3ddab0252304b47d450bdf7dc0843995b73be8467890f6698b5277c2d638e58899257fb65e1494fd70da28bdc183bbb9ac92f115935c0af0b36f21dd4358ef369df13448ceb8b411838e811c43615ad573d5e0325c6b28bd66eeb9c3e76a8c2d13e45308a6188c96834ff93acf5301eb022e342be4bd924c7339d31b86af447ec0a0d85e0a7ddf74f3a3320b0c5bae38680b2c9a6b35e391fda802c8886014769877642ef57d1d12df146893ab75c08d1a29a2d8f1d305d8e7a761be7c888d55bf8d2c73f7632093e51cf147f2c569883db2c6fd1e354fd739b1c3899d81f3cee8ae43c7090bb1595b87fae8d15d47744a5e873fdf2074ccb1f344310fccc3f7439943ba557fca5f1867abdb8045d727735247e63e133c0431a0d1086ed16145e73b5b34c44ed3f40f55bfacc6a49dd4197f269d644c182bfe309daeadaae42040b2ebecaf4f38ceb0def94ddd53c818a6810fee722457ea1b95663dc19ed578c08b8197aab1fa86705315475532b487406b64b87bd3df5e1148d26b37a0ca9ddcfcdf83ebdb972fcdfc77a9d99e6adfa42915e6b786575602211f930ca5a08f1048e33550518adf89e54ef20d2b928111803f482ac81243450f9116bfc4545351ad5153a696c480a01d498bdd0d005d8723424a732eb11fca180987fb6369539376c9ca52b6fa528a03b8dbf95776df3f0ebe0044ab4557d2f1dfa6ec0cc10b174f9ffa7c50fb742ded72746c128d411be1400732176ed18bf92f95b36b1d9fc2dc541952ac34346b039630735697fc5461a54e91e186949504cc6a9c7c15726a9f9be366cfc0ff959e2c910a621f87bb91b66df692af4c0623d277438431a113c2af5d2f00afb743250d5c55389f0d37656d2e60ada64f8226256bd6d7078d63b1681b78e3021d3b5c906d955ca95fccddf81fff58b84018d1750660d155f864cc9bfb5e2acb537a43a246fa3a5cc8e833e1a48de9d5a67d5141a66aae7496330bd55c51e52ccebd164c52497873cbb54a58320adaf3aa5e4229b1a03f8593001a143145f7d3b8b87f507b7b1a94581432c1278364eb82149d49de36dedeb456780984fe714452f0b14cb7865e4a8ea533b36769dc1f12744a158357a3905393e51f124898f6a2ada1aaeff4d45dea65d1a12b063a670b65e8ca0c12454888b544613c79b7308ee0ebced483b78b3c406827bde96dffa82bd43713ae63e34b415363181db63d428f8a9c407fddedb6973a0663284609cf5c259ae4449ffc6a56dfc7dc82a1613364d5a18fb5c045b1ee93dfa33292a80680328b718f1e99befa68868d7758a9c012bd81b9e3da434e29027d2234469710de972754d9dd3b60ff3306237419b29703d54c533e2acfc26fd69d8f5d6a1d9cd02db69c9dd74a232da59f99657223ff3b41197c1fb52997f733c735b0c63f6abb2e20cceeac7ee7d5e7f2510fa54e816ddce780d2700b66a8d9bfddcf66b4b698b7587c67fdc90127196c08ed2c0604311f65375c8e95b254d23a7bc28b8a1554801ecab5bb9871cb99f18a8647183a7b1dcebf7878d2a185a9ead8572f9b778f14f95b462abe30be7f45b017c30f6d5e714b9855c425723a0eb90702cfefc7f48fb888f0235b3822f239247e7ca7a18713ae62502f32d2fab7d6cffbcde858306630d34945dcc9c9d3d974cf89a678e6c35b952e324969a61095fd784dfbcf4dc8d4c4f0c06657be3f800f7d9558d958d3ed1d10e7fe588734f267525186eed8286e875c050e5e78cda2c0c4b22bf86b379bef23b6afb9d8dfdd1e9f70c983e1f994a3665cc0305ac63ba7bbd6e1c59a2540d9ac140f94f06f738b83e1bbc8b8082d8c1020b83845f8512a075164201059404f4c37f15a351ef7384971e1247f5fa9840ba62af9bc5f80fa870f23cdc72718de5b96b9194a4ccf32c21f7311f31388703b1cd50d72015c3af71620a3c2995da2775a1bf11f0c924096a4c3ef02ac8805728f5ed3a4713f3a247011d9738d05756b7d35ebdf01529b06013b0afa999fb21793ff676dbc63fb2e72746fb884ef3efa1152bb895b81e2055a4c4f92289fa466880277638685ab2713006cd7dccf7168c1912f05500ec2199dc4c195cd27b8ae448afcae172853b6de507fbf841fcd02ee3d98c32e95e773e2b2717ca879fdf6fa4b15ff0adcfb59f5938fd3231cf864d22b9dcae93f8f1c28b8f9ed4595d7d60b78f277d0080c0e3d877e644436ee6d351b5f47e7c201c2bcbea34c823c2fcf302302da85b7ea566b993aa77789995c8f405eaf7bddab02df7bb65cef50d91fd204071d1e53b92fb62b4943d06645f3e9dad9a85e21fce302b771087acf6bc72cee91534becaaca62e373f8cca0009ecbce751a6aa21b1f916ee54ce7cafbc04130199fa1c3656e9fd90ce38adb3c7618a63ed94b09f7182216964ea03f347e843e786ee3ef3a37525d42fa2491e39b70bd28ec16913e4a6d924ea03d67d42138660cbb065c26d496d59fc4635bbd98dccdf7a950625b630dc1d22349c0781699e1543020190cb7fe80c1b490feef033a32d89f87a75fae13ee56e41e4f3d887edff88278e78d41bc243db984d7c7b4489db5df6a1e77585eb8561cf2bd4a27268b1b6f415bc875fcb9362336018ad37049e47d216c1d8dc1230a2e236216a304bbf32deacfab4a9a52fe624e505d4ed2684f79cab9130b4da58ecc09fe3b3c68cb93ecbcc4c49cc04514b8786305044322ade15cb49c51a1bfaa3b272136f8e775623bab61f5ee376e92d61d861235054f1c852e7be20b35a7406cdd32f6ce7403b1e22ae2513ef948d75f65cb2160253dcaa11ca8b9dbaaa25c24c823faf6f7d57c2c383bb8bddf865e63646ed8983c8689203c1187a5fab090d4a0a0091953ffbfe447b02fec700729f17ca68470b119764b2b90ba5658829870c85fdb29242c1af09919aa295fb96b36cd2ba5b886900fb27225a30ba56657fd9dcdfabca83d2f5e9e1777e77328ef17a9dc185354089542cd5449d030d63efc53d37f6e401f01a1ad04755c6467175d88bc005210e6f221102a6261198edccea463b10e0baa2da10f5043c831add1b7394d882efd814588b11941a44f745c014fa3d21a4d0718779f084c66d7aa9010c0d71369b89782dd288607ada7bc73d9670f3b13806b44659fafb738274cc0522c6d2479fb9d63179f4a733f6dacb826f332614cb23824ac231f2c7001b9c88e13724a1f67f6ffb7694efa7960181368651079ad8c47c262e237cf1ea71f2088551eabe62b1b4bb042e07e444d295aa6fc828a09cd1b1f6d35110b42b897cd47acdc8db3f915e87a912d50383703fc5de6558b123d40cc19da7ad4e0a30715c7b42aefb1661059443a9996540849d9860d84565b6fdd1e9b30b49663ab99554b321460fc4bb5b580fbfadc15944476f5feaecf4be3c7ea9af56bbfeeb1fbf02486fa94aa18ed70a24095c1a94b24ff2244a9d1a1e08d620765d2a6bd2b05c42da052b274cc83d6072470d0cdc8021d916a2b24422ddb45baa3b3c8f91c130dd0d5b7e65f80402611ac4c31bf6f9fd0799da34e0dd0ca2610154c63d8dfdc7b48c1b0284b3f630ca12e2ca3a5afc3eb8d8ac5a5f7e109e231e330358b18a588c10c7d8df9167c1ea774b661821a4ccb77e0509213e6fb4f58463c56d9347958cb0594237e2a3218072e1aed3487f125bb0901174de0742ed5872d21b9791f1359aa72ec1201b000682de4ef073c067c31d7283064ad009bd65cbc84ec5e574893d8d94feb2ebc2218fbe458526d184223859d3ddfb955e6347560a101cc2f1358164f307cdeec1c107d3804932e46d892005da82e343a7412b0f8c26d42d4287b792ba8aad9f82b6f1e09fae8b78f9192c2698d5c277ed8fff1ec1ce5d24b7de4f865ecacaba4f822d0ca6c6ede6e8e714fc129862f50f787e9233145444bae64a685d82bb6df18a5d5e4765ddd0910874876dd2d0834be44d7189e3f95e3afd7020b37530daee140a3b1c9d57116f74bc765305fff14a809697deeefd7bc6159922b530ce6121a73c53f0d46a1088c4678cc771c1b53b76a9642446307412f820c4f05e06ae281ea15eccfaafbc6aea917b4fa3e4fd2aec0b3708f444111f8ff14bda82a48996f4b7c6aac196f2d972cc8a48060cf225bfa9c33052421f992f3182f2d7b59c19add1a14dd5c744640e41a2cc7cf16fd226cdc8af995961147c78b483b9477a847831d9753d1f4d7f532a82bd480bc7f64d19ee85ab7de84f99086ba2ebcd7f490dbb535bdc09504711392d5984f18b8ce4da003d3e1e1e3d0fba8fc4546ff8d4d6829fc8dacd954f158f155a5bcc217857c75866f0c70414804c4cf3c6d22bddd857fbcb1e9b5719e8a60d76b8b444cdd3f8930693360dd8d1a09a0cfdcbf5146acdeca6b723ff8416a0f8b43dfd625afc26b9b04640c25461bcd4cd9f2c74aa1be591b6a68c30ff06de3a2b9a12cb7c51c64043e53e133c75168186e4fdbbc97e191c02a1305e3f90feaed80fb00279617704ab3ba1e847a94a96d35d502bb9daea7a29263bac62b650f73fd2f99121180cbce2174fcbbf7c494910ad47138a4b113403bd2f0a3f2deea9f40d10f5f1e5d5551d3b6bd48cb50ac145623543a212283d86068a9c91f2ba6fc0201b192f6b2aa17d50290e5171974f691f906981a0171bccf4dd091cc8331c0dd189abf539bf88d1a70488353a9db138f1d2cbf457c7e07c3c02e4c5c0c4e898c259249c4bc199ec1cbbff1eb0b59244ea6b1e1e88cf829eb287c144f4c493042c30129046de9eff5a9e48efac6281088bfe6e2c8452f211fd5a43b708bd665433663d0ff173200f701e0ed2a62f70b9e47e299f7888262181d441ce92eaca89a99201e5c336715726b60dd87fe146246984bd4320e0279e8c5630defbaa46710e8bc6b11c8163184dc5fa8c8892b37500d7f66c58a6a0f1ac0fb19ff62d7302abee5dfd185086ed6e516f22940fb2bbe9f77da83c415981b452d4d3d900e0e68a9294b596025349bfd35452bea60c1b987c810a7da6841fe2efcd53241a9aa8e3b6bd087a405bc87ce63e5bd83efc11cf4217c85939d3fa82275fcf9463d04133aca875d92960cfa471c1c2b31ef3a6d934464848d11949c313cb8797a65b61a61671f05fbb851af58837faffe32e74dc9b7b59389b02e629408254b0d966e19c0b723f54d840f23279c266f80d090edf5a3361041c4aac323b4ae54abd958d351d91f360ae1d3724a32a089951741df34d44bee7d5cfb1813185da31b241b5f9c883b68965e770c3b1b1284290e4b162312f153984fbc0a43f21c7f84cd0b2517d4c005489e2f96cffaf8ef8c59d059914c78e2b3241621310cfca1a229f6ddc12b19748d60b941b4029ffb74c708479b93308f8adc894038054140253ed81e7ac2bc8b5ba6fd365bf66cac5dd04c183f62c5c188b5a2e9c160ee916dda0ac8c5e82243ac9824ef702365c9a817db9f2847ffa4e2b540155e44fe518bf5ee018620f0b9fb9e47c9d7960b825612f61392f42c825c2d65df85695b48b3a05b544abc6efded59bdd19ea1cc10d21b9a3bdf32cd4c43cf913f42b04cf4f15de539e75d07cf51454af945df8928816166ef0fca3bc7d014f88e23163ffae98b97d91858cae09c3c46b68028e5af618b3360c422b72ffa6444ced5e898b2e4c95b26b2ea0fa2b242213175e85f154376a440b97fcbbac9471d2c4d7b38f38cf466791a8e9bb6dea5565da0ba0bbab3833b847642c6959d1904af796224148b34f895e07e73f0f90551731c792e98a9ca0fc4a5b6a709740287fa51ce6d9adc7eebb299df0b44a534a9b00ecae12694d968cd403bd90d74144f249f366a6fa87e2439a4d024eac938395a3686300bf0fea8a7d88ca5697e9c6e127afdcad3f51710ac4219a25e98ddc6e2a4022ad938f864ee503f8f5e8212687a940674c2f9a0285c1278cd10c89a2642073a2d0e4ab43450f10aacb8beb7c7d603b6963bd25df3954aa371614920e286023f22a4e50620b1019131ab23bb064d22dd50fc315a7ad0211ed0cd9aef41afe6e41eb0bd95e00a727fcc743496069b8e4b4abd0e334dc3743806b47b4a5c577818daa5ea076bf8e40b528f4a11075b559af966d9e9c015f7b08331effa40a36e0fbc70435276a6c8797eba24808d25c678cdd9c72af49d1d38bd0e65ab841487c4afba009004da7662e8b36d244dc1a8a8c2508307684220e886426edbdec30b2785a243cd707d895699fd08409914064b98c968455f125d7eb26adb7d6e32eb1984616b2ad5532850da83ce91525794e8802471019e6260dd3d90a8992bd15d7ad49dc762f6ce297fd075584042e6efdc7ca3fbbb8ead94b6811b910c5cb2bbd0e94c4a3a61f8853787c6c5e2bdd6f45499be3ab021f7b7103ea94a1d8e2d44facb77554a833a4ce03db0cd5f700e06fdfe67b666260a57adf5f76fdd07dd4147f46b5867b7226e9373030c0dfba693cd718cc93954ba9446f399b9d69560a0fd40ae1f331a82404b0b6bc89a3b0f9efc0ee2730f05702a13aee558770f6b84c5e37f01b4d5eca14bf3b11ac24916c6e5eab31e020d7b8ff70e9604fcf17be8694328cb3d43972caf69c4844883eff5ce6aea1ed968c2e7c5556444deca240e55eaa627365bd12afe1fab8258d68f16f62d8dc6691378e1ab0f942bafddcf9866d90cb453b9a955fcfbd8a588c9a9c50b88113a3879d3a9318df0f97318182e2d213f28fe37fc5ebaa663c7f69397341da8a366797f77efb41438fe683a60603ebafb6543eadaf2790d0b4341863962d412a6e109f0d0ac3e9b92631775c866044d57df1d6f6c6dba75a65c25954a78ceb198bfefda24bd9ead925a930a145042b3f622fdc2b2f5944f5b5249153892ca6dcba910116d40f2c8d1e6fbc2b2b1276602c69515c8b450264e5a0fabee7d0be8a5670d7aca32cb9fa24ee8778b0d6d611d9a2b4aa4c40988a447aad7d9cf5a9861f7f0838685be8cfc150010a50b8103c0d083dff51a801b2f62cea61f8896eff7c724157db2a641ac046ea1b8dcc3d8f540eb756f09cc2c6785f9f487c62f79b4a52962da3e715cca88cd6935f063f7835d26e114354d11d7816079b107d029b807109817666be29b2d5c860e29db3d11fa7c073c954022e6df0be03feef8c587c376578d343bf1dfc522c54fcf3ba47d566e26b6de54b11e70025670e22409dd691df50a39a4677e5f3185c1eed125ad7eda40b8e6ae468dfa2f7a8b8f074dc3fb54474c183e767bf50be61fc95c747a5a3a8500340585d35502a6efa1ca78632210030812b9217a4e60a752dacf55c868581a857e3956517acfae2c8cbf5681c6e03cc1372b223274a6978d100091ac4345bdc144f762826f1ee889f5fffc0f096ccefe5461116909c723df0c6f0548c06383f091bcd3470bdda1de80dc8d81a383577d4ab037d6099feda0185cc47c2eaa76bd381e9b44f93a18ea5d8b2399557aaa094386e975ab33a9d3fd60a485c01c4debcc3e8305917ad80343638450c017813c1ed3b38b8f68712eb121c5d11e605352514775ffb31276813e2e02af0b087a890f4f18215585e99e5156cf15a9bf2667a457d27716783866f16ed40c4ad59c9c7aa2db9a68da2b37be6b01185f45d90c0b6476e8f39eeaf044e8125d47d808113f448e90ddeebc2a023e2e43b999050edbc9e246dcffb1c00f303677368caec870927fa69e9c68185b5e26fcac453313de16d295272846a570f6cc4e7a4539133aa2a8231b3649a236d32968cfe6865cb768000578d42fd2a02a0497be00c3c5e15f06ae1ed74709a15920cf77ca1a9d0602fb51046306e1083b612856786bef4be768fc3778c6871a28cb72f69ac62bf2988fab9ec06cde6776be9d2953af11bb9b099842699392deaad3a218a13689ec612f831eda42191bdbb482967e414b0633b742f7fc0bf00b8a23b696943b98b0c57b0dbe9c366e738193e1da154be4ef753013b30489ab77684519d15e6c9582b79c946a89559877e4919d5006804aed30a0c49537b815b66d4b969dffcc5e84561e4260316420cda56131c0754580beaa7085bf138ea2943cfd8c8bdcbdff2eb8298001e7f4a1bb2d54a9a5974e670583e9fd65cbd81a3043488a26e13a218644ca23c34f52d63bebf9de671cd0d01694867025181cc47dd3006f337ffd620e4970efa35e074485755f0efe29d3480e766559fb2a45f8179c1b302e7cfa39547fc33918f354db42618d6570b354fc73d373f8571b86fb9fc567631ce1a2bc4be7cf089f18a9f3334d5c88f3b78e05554ecad1cb5d9a51ed6f1ebdaf92d655f8688cab7e848c3f8e7dd61d5b814a1393294885e7003d503725830c8b784aca0c9096a3ad208306aea650d372e90fe1c1fbc10a2c59d31030388ba8774df3a32e58ef429a85252a0903394df34268ddf5a108b6f14bae58b330bf66acd2b9b5615f8639e810c5104aff38cbca51625f50b4bf1e28ce320a3e70f3141d7526844610eab3d335a50312045ea3a7524712bd509cd4e2d577a0dda0d2ae21e1e2e347881cd9967b9d5168c15e53f08fc4d021bfa146519d4e4c30ce75def323357803088bdc7011e57f7182bb6f3186e95ae47a2f66b9397fdf466006b57573c9038402d0276d7ffaadcca1b987f24386737be7bd9b2502183572ca313ddcab9665b37af72320dc9e4d60902d5db983205d2c7743a4bf09adfa025682fca45ca33f94332611e79a0ccbabeb7e81a9f0ca9195d718237455014e0723b8db51fb2b8998f9775d10d8b3032d5a2c042da4bfdd115a3647b7f31388935bf89fa9f3d897d843e9ce42faf38ac146cb5a17f21dec019f49471cbbd8e1817a7a81d1853d645bff0b7a01ab100c93b93a7585338fd7f49cf3ec013226e055456c24d83ea4bb010d82e0612f47039b9b8df7779c65ce80c07f6c1f4f045b5c9f515b05e2853cafb12be7e67eb41e790a6e5078d6a525bbaf32869a503e13fe86fc56d80ab6ddab17f9faee28cea47012bc6bd81d51ee5db1c99512c2c265358ae88f66374d02df3d65fafd0093ed20b4102662d1964cd6b1b666c50ad0c08f5aa804d3c5b36515e07ad4372878fae43ef8ab0e64d4f7e3af2c2406a418c6ab8a8cc7aace6ccdf94289a9064bd323010a13452c340025e4704e288c29e25c6b139484a390569e042703f596a4b2625995ff84fd5c85a299d76c36c08bb180ad8c83cac3fa8db33a274098d682819dc70a521d775e29a7233b947789ab73902c185908167441b7f15b7cd1c4dd418ecc56945403435cf0edef39e2acb1236d7f4e12a3b28f54af9aa0b3e0d6dbe9437d5e0b12cce82cfe96da5b171f82c405306cbbfbe6e1bdb40cbea49fff3c60fce95af8da6a8dbab7156b76185458c5d21f1f7042d45ff0fd62f3bf1ab9c04d6e4744ebdf3a1f847594860f9cbdb8fc6956dcc70af278fb92cd75973a4e8cf78eded11479684c56cf85d8dba2c7840dd00e0e0fc39a2e7257cb5e49ad3055ce85a7995c2b9c41de75e02f4bc97b5f465972081a0c41133e408f074b3b6830fae1c85217aa3f9733bbf45ef98813dd001523c6e7848c006722b4d53d0052ced627193dc7caf09d154aa56eb5eaae8958ddf567c68530b237b7c4d1d2eeed7f9d72f862e8749b0cd699a3a6403237e3ec95450d7e96a3a26b16e7d7e1a10f271ce7e6e9c79de513537d3607e933f1a34a028fde722cc03685005888a7bb8218b4508ada38325b88d4767d6f01ba3636afb20231651a70c63787042a4aa23bcacfe5ad018edf3bd540006161c36b219ef7fd980313f8db3193e9acb818f0e13f4dbc2b5eaee57fcf6d45c908d9c47415709439c0db2ea6d68f69684169162d11f1a9def2861374455e68d703abc89f018d29282e0898c38fa01e6a82aecbebc54327956daf251f03d7cb12d1c4b18ae220b727bd9e0d4080e603916ec1a81704b8ea7aa9384d42cf6c427589a4a2f0890877dbaa97e11d7755b8dc24fcc0d5fde5c3b0367c7caa9fc4781966757292b4bc16367f4225c6f1228c2e7701e99929135701c0c643c7f6d70ffc885d8ff6a36575c7de7ef4ff0a1bd46f19650951810902dc0b08bb2f2993c3fa52f98af2ab743280f774d592043917dc7c2178b930101748e704efc588d77fd289a19041a4988e6dc02d45cf32b2ba006995d0f92f5e599459990b1bc99bba6531b120e301d9a73a9ac6808e022129e253373036e295d2c4bdc9f4d80be1877ac26f04762b490fd5bda9ad78361872958fff96ccbdf10c7ac9b8147e5a736e426bd0e73e8248b93b2c265ea3007709ba5ef456cccd5b32f77dd94faec1a107d247d4f990086c31345bfdb932a6c4c02dfa3cf5c69ac58045e41a6f62c25a87849dd65810dc3613fd8a42b6e8945082a6998fd27b60fdf3c64098d6e26bcdec2b8200ebca8bc85cbf986cc46e25fd43f3c3be4042192e7456cb3707d561c4162a1805875e1057bf3609ccf6766ecd340408d62071f48cbaeed1cdc0608699256a91e586abf7d0296a76333f34505841270f5603d5c71be8d4b183d8dafa3c13909d6232a26c409784efe0b204841bc11d4446aaddfdd67a853f6842e1bb31044ac728cd630f33d00afbac8e5ac2f27bca47a076517ae549859466b399af19df11b46b89d46730154e06057bf5aa317906d99a76144154736cc16d19750673cc3a7ef9a35753c608cdb1a688ce5073422a2c32aba9c6100162f8abe6dff47b88e2e32cde8859a7b57c9ea5ee2ca1d85cd3dd65056efe6c4fd0c6ea602e23b37e8fc3f56872e8e7eba2125664a6985bb2f3c89e886efb3629d2a66fc9d5fb4ad9eb72fa7c41a8a9f6e4ec01f20fdfab0cc3411dbd7341e40e7ce0959dda3887432b46a80667a1484056263f553a87027b1c324b70990ad4d0a1f784f1ab6c9a3f3e73080223c316e918517912da55aff57604024187f352512e41c84f722a13e790afbd1c166bf7f93be7b610729a3556c25a9ae2831f653bf1fe99752e47ccf0d5b6c1c980d02764724b64cf86b61b4e420888189411e5f3634c5928025c1ae899417c1b11a689e835da358f5acc27e68bcdb653595fa32bce2c20db63dbc590169854ee567e5f30249ca0824eef6ec0c8b8849d1013cbcc141712ef73e3dd505cefbdb78685d09b612a7699ecf1197f408798ec6a6eb44f998c1f7584c3c67c3fb63ce50c1bfa96bbe304ea2aae0534c98d245c0ee21a090f15407b81f673de71f9acdf812930ae399fe6387ce8d09d8786568e5a1ce32508bfa27f686e40a1e9d80231cafc4eacb8003a3d906854eb643ba33b08f21d8e34309fbba8d9389f3c857e6cfffacc806384aca38dd7a9bb68a52e30dd1fb8716f7a11064f201800ecb0596843a4e82e62a03b0372280e7df70bd1e23f0f1047df71ece098dacfe76272aaa00e5ad904149cc2c7dfb3331c1aac28579171b8b0de1c6fa43366adb58058db1205621964c21a04aa4feed02de10e270b93400b8439319a62821845da38800883ca2204d999351d94ca9ea9c1a3fcf1144a629ec97b83a2417d9485fe68858f97480943f0cb0f76c67a9f8d4488e80ccde96561a4bc86afb11eebab5e6db6bae4495ceaefa72cab475243ee490d98f53347c9d8b81a886dab42080939bb174445b11a41ec89cf99762ba82888c0e20ea11fc2387c06e487379591c05da9f620bedf0df3e285b4502e507850384126767bff1525cdb0a297e13712eea346a892a8f350f6b4098b77d923f272cb6e15006c5bda3ef251338db1759670c9f559f8c83afba9012dd4f79325c53f525c8d08148435b061188a133c8b9d7ab84c2972cb4bb4fed6e9926fc708d735e813a1830ca08cd458f3709441b5306ae219749c3eaade1812e49eb4b10f75e9d670992011410ecdb939d8dc66ce30e75962506d45bb52f0e94663c75ca0a24c66dfa4810212ab2ad52ec2e93db23cf4177f50e9a17c446cb9138ab9d0d949e2d163580f579d3330048aa578727d930be74d6276f51292232396160fb4b7a99e3c61c6c47e1ae457aad947693838f99e7b7be1fe95dddf648c31e172b0bdff65b33bd3fa8c9d689bd434224d824c93068134b59558907751b7eeb8ca9fc2a05cbf5c230d45deecb0e681a2c9ca20fc6e302e972d64436f1f4bb941678ab514cfc0dc7c6192a48f1905150e7edc5a17d1109aa5c9b9e8ad214db1668ec64dc1f545d95f076193da0dcaaf399936a1763794e9d7dbefa5caa5150a9789a17c0c93c5a57d39865b8e7bb4f68a1270fc6532d443f186c0bd6774befc5f0be42b5ad65eb89b9ebf1378388a7c187977a42d211ccf92d368804f0aa681daee80f730ebb7b3e0d1a06ac9c9bb1a6c30fe89b1f3525952f72cddb07df3e8763618ee30d083f1a63e2dc92fdc17784fc3400799c6231284525a0f89befe4fac27c226bf022623606e2a514bdc090d48a5fb592256ff9002e1af7ac8ff06bb988f61be75c61b18a0fc486e7f83192d94fe86f43e9d9ffb6064ae4068f003088ed7a41a5255e0c975f15dbef999c4492ecca480ac13f692c091820b987703801838c3da1382f023b325be400d4f471bff1669d9364494ddb3c8ff2a87a48f62e9ebcdc1c0f8a6ad74d35415d532be3faf6df3d33833a91b53ebd3d259c9e1b809328320cd83a06ba704452e25bdb11554fc6e81aca1286afc79931dc0b8b9e471285f6b1ddd0b5b84c15d1c22533c945d80ebf8a015bfdd2967c16bc5e9bbc248f7401b914bccc0065b20d004111bf8ad3aa96b48905f3e48be86d7502cf73579f28bea6ab7351adca6e30efd4393bf76b7df341f0f6f39e91fde814be70f31a977edbe3fe030183b6d625eccea7f848ebc46775477f6b7b9e109da3ed1138c9af8e8cadd4df82fab4a92514b73f7bf3f30acf26f74b14f2260f034f18b6a92c51b029e072f7e6d3c63099dce0393fde358fc46ea9d848836b75fe038f49722838bdd86b702c7d80094c0fda12feb21f46af5225e0a1c8cc4b30df57a72207bb1d847b24fe3377a01ba3abaefaf147466c08e455f3fc0ad6c55cca4b150b1017ff595014cda1107e57d87f0b73062dd4043b40dfd81dc7494f318aa07f1bcf36c2a8e208186daebb77e154846b57512b1eea51455f0a86b133dc9a764cd57fead9a0e22f74c3cd78c29c971df59315ffd88359a150bc99e117debe46fe1d344d0dcf5dd7fbe8965cffdcce734f8f223f43b1728e701db11e5b916ae746d9adcb397b74fd590d521ef40437489d18fa0e94330c28655b90f2b8dad74beeb2bd32b642f18bad3580da293cea282e67749ca04d6ccf0be227434223d40624fa273e25100d81b278c83d9dd765dcc7a191014e83738fc535b7c1f261a4b4001f08ad2d15ebd946e81d29938ef00e5080b3cc8f016c5bfee2d4bea6aea3e431f7ef8c9f21737a2214027a2c9808ac7c9d3b330ae9450ee82e404977eb946a11184459d40f5601bd00100b3a19bd1ef8360cd8ecc27a51dbb3aff0eb32685ac6bb94a5d007cd7d57442916eeee06f1acd88813f90b214974b866986d65a786198d0d16681630bad1d32c1f6b5dd86fdfb4c87be6ef77713cb54eb311242bdc614f822601c391074020aa1e4991cd921ad4981b3bf5a9c700cc1a4708439c8304eb72dc56a7eb5042778cdcdaf56bbb470b3257078c76b02a0f1dd4ebc884da9d7ded80b63640fe1ac6ddec88ee5dfbeca8d7ec797db632ac6b7eaaff1e2530f60f0833dfe295931de9a00415c9a371ef4141e946a0fd9fca59a77ce706f45c6c3b6c88e18b52dda22c184c2746674c425ed210b29954fdf489577f130d58839da6c8d18079c5a963328a5c4fc7aa7bcdb4d7527882725623b28d16dd871b1405cc4be549cad6e22ec96afb78ca075b33a461e327544134a957da0b05db6537d969d7576ad834d48aaffdb5de440245589c2d46a2325d6a4da0e23e64ae15440c008d93f010d77ba3427d5b5a2b72e126b8452daf3b0704289d9df3e1ffe9fcd08b9c1ecc89905adb50ec1b2bc404bb20094e3aa395af3dd2325aea6c6e56f375595e5036cc339b69620f80129de0624b44a584d0632f78817ff2a1f84e89d49bf3c131841a43a03ca941a88e5cf62a5c3b6886afcb7d934315ce90e8834a8583b6b8cbae8a70c8848bc9dfccc1a3d3b8421040d0fc4c497196be8cf4a20b261daef5b677d0fd050ca7e249ffd27e121daa82f23afce9c4dac5535f1699d5d997dccdd013a09e93dd3ab65733a13d28afff80b30cdbb7140bdce1619733430e16c80eb66b8ab10f45c568bec6ef3fbebba7237ab98dc783519e181acf004cff39d2ac75d7aef9e184cf321cad94f8be318c2663fe5d66e51d6a5807619ddb08a32023346d26a13481bc7ebaae4e7315d1650915451704f8359cedf5539a2c66464dd3a07d49500eada8e1f7d4693dcb21d3226e1720c27d9dff92d01d6a0cdbbe039bdaa2db99e704b99a03a37adf4c5c7a18cbee4a147653381d41a92343d6e761d244b9fe16791369751f2c938f8d0137a7ccb5043c4b59e26c5794059a4340116ff2692608d2c726b0b50401b09a1047f458928e858fe46716e547b9c1b83c87b8a867612dfc581b97ef28c135570c3e63289dfe864b74a885b7c682af8306ce1134f23a1872845e4bce0243a834174b1e8ae3a82f7702f87022397a3443462ab55a2b60cdb92cd1b85ca4b01f4263ebebcf076c3250a694af2152f0998fd9646ef12b19108b702d0faa59028ba4ca43ba92f79276fd1732a8bedc0c24f1a19d0ba518301cdfd423f982cb2e306c6412309572d1bba9da525ea547ed9f52e64198e002ead6f17848bd7d97328adc4da97c9c2c0dd07eb71e7a021a37683fb40091c97416ca7cb497f14e525ef53f00eb1806b0f952365431160a2f7cf7a8920937a010e5c8d8f4c16ac326672775e24580722f8e56c7eb9c937c3168df98faa738a4e6af601e9d81e7bfae15939213da300fe7436fb38b0675945fb3f6c33909fb8ca51cf18ccd7ee4a30631f9163521efdb020174b90983b21f7a52ecdb36f222471343561002b82f90699061cf3f0d3919f60afc3f112d7fd5b789f5b2c311769736a7a621efa14f7d59a9ce642c687d1b0602edcff101b6bf8f408d8d616058c5618d9620819c81cb1eaefaf495b69a3f144175cbf5c385e974768e87028b8b738cbac5da01c172fea39c69affcb1025ceffe5b6d889c55df8140b885ce4949ec848792396ce7129bca6c0bda98a33ed8f8ceb916b775e1cbca73cbea80202ce691183ba0e106ecbced313a188f24d025c300b31e57ea3b3a3205d186a38c4fd633509a30ac23dce27fd362c30df06c4d9b7b93f20eb89e405fd08d3480bfb265ebb45702093a3756f2f50ae379ac548f5a21c71701bbeb8d97d11b1553f445ab036f9e8fa5aad72f6f5bb5e0e12ec20d1e2a32ff9ec16ef571dd2f525b1da7034b149018c01204b63d39151423caa7d5c9266dfe4294d1f513df8b85e7be245acaada028d30a31dd8363faa26db61d7700b1dca122c92f4cf1633779643fba8f4e514ee841ed81d64c81e43dfb751d4baa7cd4b1fd4b67aea035d14002ff8121a33e124e1fec8df5172e8837ac78da84be79597ca8a5cb4da99fff9d41c361d3a5aadf5d33a068af62a00e17b902f233aa2f064c3141ec3ed9df7e6b4678244126742181136054ff850d0e2ab1f99df212e4f0f0be9dd799bbb303067851f845541f25e60ac92f621d511de65d33b4b81130af3c8f34db6bce8baf075b74f64fe55c7456bbd8e5e6341e44c23edb526ab3f32fe7582a7de39b0059f4208c552fb15dd4d0dfea912e8a85ba084a82eb5073ecb72f17ee3135cd0582079f7111a0a31b5befcc579ef6670a7d14fd225848e947f9e70691b83194e05b13e0363332ce76ee81a04613b97c7d7931e6ba53f5695985c48b9e8530ad89d5342095d98297cc2ad7137d1f295e0ab28b58045a5f63481ed99b58d24477091ef6058acdaedb45e93de2e3f10e25cf446e642e2f014e90b978c727aadb92b94e01f4a98f654946105a00f788382eded0709d256773e39eacc10ec0516b530d51aa97abeb3d35d8bffe2d0b0013851864eb5ad5d5f1fdb88efa0b7f3f8f9cd849971d98a0bca1c619fab58360e533cf9054fe08b2b796f50fef0dbb88c2f80a4a6958f6f016fc0904c6e8c63719101a04fad34c3d0342b60458eb28ffba1bc96d9ae4f70d695a2b0857fde75bd05b8ecbc36312b433935b790de0ec92e3ad827b3645b9956597177e42a17b858cf5fcfd1564119c113a05bfd052658eb927502f2eb0f2baadb735ca6588c30da2816fd3846a0b4551f8d64572eead5de62ae59fa332c7a8e688dcd7afb810df5ac0284817fd8d61d35c1a4fdbd111f9fd90f9bb6aa9c001c1dba1deccad5d057419bad2e1a5a726423e0e006ce6cb3dba2feb55822da5798204a0b2928769c7cc666ff676ebe63a4d22664017c1ac8cacdfe72bbe827ca8057b915e7a41d936e3e9564d2e0aef7334d633cb11e1d1b3f54b83da66ee48ff00dc418658e9d90627c0b1febbc29cea741d96396016e557966c20395a3d069b60d118c82f3c2df88ae59187a861787c61c7b3606e460dd6b2d99c099c74fc76c538dccb6683e6fc0f05c7a6043e864457e40c5200faa044c7b06863fc5ca78de8754f86104703ded3ee97ff45765c9c8a2bb49f234292b92c96015d3151b76893365931a579af40c9ece297485303165f2900e9b8ca25b46ce6c82a1d832fcd5f576030df026df3d58b65fbbc2a87fe23ccf0565220990679962cb53f1e37f77756731ebe2d4c3c1a5fbb06195a8009341442a92533302e3c3c03a83cbffcc58970489239938060cd6c1d7fb2c883113446877ef0ebc42efb72c48a1176ccd9fb45edf17c4587509f8bbee511f602a71303f2cc4ddb043c4386b8d9b5229478c835eddeb6ce2e9c3ac7b7d9b5e5b58ee11c37f488c2b278901a5c438d923f28e2ec2d0545113061303a33907e32bc80b536fea2411a6b80089c463916a230a64532172c020f262cf76672573d36ce6ff9af6de6b3c86ab6f7f86736c306afb2880dbb7d81ed5cb0ab7e5354e6daff8625b8044cedc9796b312ace1ee62e3639c704dd8fd9ae1c10e1413db8ac4fcee2f834bc470e1c905504831edd9df3186536c52e88bad064c65fbf5aba6330e00068ce86ac63d3b1e549156f87644157c026695b978a680b33b8f6826731ca7591794c5f81f44902517644d1a5cf756a78229c39e577ed4193397df1e2f695464a74fac5dd15739665b72c5b41fae62cd6fca17226e18cf7429b5254458728a3db66f77c7634b9c16177c6fc8e467e5ef7a874aa2c8ed88769f5cee83d3189f716d2fd46ef50ee359ae5c194f17b2e681fd6e824399b0a33d813249de2833fccea82bbe99d54edbe4a5fcabf7880e48990b312476296f0313e9f4ac609de3d32ff81cbbeb3a06fec3b42c5012144d421949f74452156650b537ab485053441c0e6d4fa72872e2485aa6c7957f03e0dd0ee52a2e10cde1cd4e99e43bfb8bc71837350e58d05085164a47259bbedb7752a3c8dd16a1a7b80faa47769808928f04e658f1171f7bc70f3709bae7680846d532e90515685befc04e292345c3960c808ef0d546bcfd7ea2b5d7540fa320292cdc40476d273f4cfe0d45170c10080751e7c840f4cf252020b2bcdac36d34fb7b64bfa0f984b88d8d96b3037e5cdda569ec45083c0e056b1a3c0e0eeb6daebc578dcedb334cb28247cad946343b26d16ab35358c599eb6ae7ca14f61ae5a793e44219008191b0cc92372d14514512da20b0b64320a64999c2ba89a2bcb4c4cd089497d844195f6c86c0eeedd5a4c88048f342d06d8aed21c514d1a6ccd3359639a953132ceb09905e2785eb57b23f1e0dd01720f09acac60429f6082e4f9994dd517807b3312e476f21fc32b43c7a7db8c2d4f02f62a3dc9e00041af8fd3d89a01fc109136b9f3f689535f0273ee7954885c07517cad2a3128482735db5e8d9eb7a304f6c4a8ab724c57e21a4bdf3eb4fb2652044460d3f369b35311ac36d1107dc6e914d1f4376db708f98512ec182dcd44a47179c9e229ccdacf33c84304882d8d9db2b81e82acd00aa3b61d57dc7e74a65bcb412787b2bc1e35c574186842124e4ae31d5f64db01eacc4f50025d60795b10ea8c4f56025a20795b13ea880f56025f3d5f00364dc1f96e7ceb09cf7c3e5a41f96e7fe85b815623cb83ab87f02e716aa6b538b47aa65eb484878811feb5f10398c6cd94d85364fc4edc33997bf04cade8070d97348e32150923c6692f00c997cde086069b7ad468312e1d9fdd38dcabb0894d1a4e051d00cb7cde73cbd2b0758919ee9a9496ebadb7afab21104cf48c8758240726ee18191306915d8c4eb63e4a0c21049be486325831a677a3e09d3487720febdd32bc8fad1f9ce1ae2d18fad1199aa79962e65681776deb199a8b13266466acdc6554cec2f0b2f3110cdec8b9d79da58b729e37a63dbc54c439865d1314c5f762d22cdeabc51d7e0da84c66f445147a359c1ec1e4b9742b94324480e242671685a18db51f44010d78c013921443c022d05b086f8590eff13e9e805edef67e051a69af11e575dea4f24f60c70a4ab31f3fa004ba4fa721006b93cf890de29803cf10b850cdc36be961514f5fee8ff844fd74ada2d732b19d6fb44cdb4fd2ab39669bb4bae8b4aa842502642da0627620589ac634cb55e13aac528a4b8a67c6ee339dd38559569d9c9d64fec6db335b9968d747dc2e63a5f9569dbccd625df4526dc64e7b919bd881210dc03ed50197a799b7d9c7a0fc45047a7bf46dd84662f5d5eaea59bd92163129f4e357cc6c1eed5fc658a8a6f461ac097762fadf4283aaf5f7d277431df14a4e88d2388e95370e08d17eb143d974433650c6721b7f317626453ee7406aba2c9ea022d049f07806253c0094a25703600149b82bd2a45aa5d2d1dfe9bc658673329690e569dc5f0555203e0d0406506e8050f8595070165e9593133c4b2a72276c80bcf0a0cd0740fe4f1c506caee94330da38f1c941c59040a871655fdb2a1ba41fdd0a2c68cbdba7d785d4e16b3e0f36e40039c9226950a7ddc201a758394c295b71691c20f571d776c55762b7700b7fdad2f705209c36720ea4ad323ab7bc17f8fdca99011a156a81cd96ae87a9a5130f1342a810fda6c70e0c6710d31c769599c8afcf9f20a91ce2142ea3d6f36cc5eb5848d6beae28f99afc2dd67a2c6cb9a8b694205f4c07358477a98c180242460654129085b6d9afe5810d85f42dcf3b85c64ee30150f8feaa3b59b027ac45a8d743f106f0c0e7129ad8ef881ac147883b8e2c62b96ac4399891cc69a8f01e769011bf75e36f4f6a0b7835e10d443ee82dcbfeaaaac29950a9d6bea9a403dbe055ff5515f04d6cbb62d5b0601f3596450eb4d26eeea5ed0ce77a87df94f9813050d78604bcf23b158c82114101dd5d9c65d32e239ecbc3289ec56117da641ca565bb3fae786bdc35ef910686f868c830607c342ad114fda9bf5d2b8f526ca8d4f1117f78272c0539a535e19e89f1f4d12474bc8bd3ea3ee3a833cc145757f2c9c2de48ef1b90ee4d2780975e3089488bfe5eaf3737cb8e4812a9c600016363f4c13babc11f304938f988d9a13cd2faea13b87842611e105ff9c186b1b10b8ae884d8169c5d2fb58cddf1a184ee75f40c578571a54239c1d1c2fe6d2b7a4768f496dc8446cc3650ca072f20c326386c39c19a4e0be18e307ac19b34b4c8e144c694d2bba1664bf904f94a229c2f11d7ab47f0ec67c7918b8843f0d2b326c370ac8afc592e837bf5d6cd959c3c400d973de35108b883ca660860310bb3937000707f8adb07867a001f90bcc39eab10b9d146c5cb1f20480cb0299818ec6df3ade9bae9b7256f7077e340fe0d32f1c4ea1d3ecb2e7fab8e82894d3f08e11a51c0a5a60ac1f0377022fcc0822f23d19c20a912644a4b487e7d2e02a0ec1326b73bba101446ec3fc0a788667d8d5b13f3dbe68d8b181fa19d06569cbabb59c55d52b69525a93485a182991a6c17595194f560da33838de09eed48f62e24b36a5a1873b16cdcdff44207e0f168e6ca902abec5163205369e532c6682bd73f3b9cc6afb632d75a055e0287311b86da347136e1b7acd8715d3b8904ffed9c19fda5f8235eb9c532bc02c482903b53e2dfcce575864e50ca0fef2490eb3b6c6d713d5541448ee364e9d45f522c2f9b0f62563d105639040bd2c9e2491a1321c37f7b8cb09345d3b3c0bb0bed580ddbe0252c70a106f50b3b4fc3c57e232a7c0b7d1fdc425007a4fd1d182af40af3b5713d3975e009f328ce5387b7388a728cbaa61f4ad0396d9bae8912842a93a72436b450883be58178253c4e7a4e53005b729863a8a75a98b29f0476eecce002af0443771e78e0fbe3d85a6d3f596ae64a35d7e11c8d356b268f33d43972696d34761c0b068274133665b691ab849ba817e7b2213e888e95bdbc98fd9f257ab8346150cf788a1e6faf8e15a9107d212f2fd3708afc798f759252d27492e5cf280c5a841679a6c289eb8771188b5cfa62ae5f17d4e8f36116f51ce9cdfad80ea73ac509bbdcd840e838af1937e2beecea249fe38dc510fa752a8a4dfdd8c19c3d0f9538e5a7bdd988b2a95cbede841a374c03446faa9b6f608b2ad8665ed92fd42b70cfb023f1dba2b470ae46dca6c967db4b7e0217c6ef0749d1a47328a6bcae763c23584853482fdc04100ba95fcc2ed753be7846dbb730c34ca62d253a70712cf55b036f049b77f5793359537bd86129b3cd4b8a7bebbeda1e43a3c6d82f2277c0812b91b9801c4f93886c3b1f14554e91c9724b12aa6946b088af6599728bff50d0b439692a5b987b03be4c2fb29e60524cbaf674f1816e6d1db72d30f2a20569629df56979b5b036f485ef87a37c605c98188c338ef916c72de52af78ab69561c726aa0c6be17e9f04cd1ddceb8e725b3d26dde761057580e1932f347a8e0cc7387ea5ac3cf3196e1d49b4d5a2bf2ac48c145b0ffa1764b4adb77f15c6f01f25b06c227ab63c39d970a0572018e810ca3806f550ccea1702f4d5d5a6791b117662404b281ac3b7fb17bb0ecb33819ba7c774ef885cdd862c0080ee2c784100b25857a5547e159c773ce5ff688d77369a025b82e4c30bad94339109905c81e0aa735bda61d3653d935780a8dc9a010136dd8ae9a4272014d58052b00de0583f1e95a953af39cc070a264f25759d9e2521d18995b23387b93311357ecf8c06494e03aa36a888ef094d6b7ba88f4ed2783d72e28964b2daae1b4a3dc74b512dac40362543138af028b4b5fc339d8eb2d7e886d19d6a3f37aab1ddc881e75a00f3c5d73cc764486522cdc589f08bbc377c122e54336255787ed5547b3c6fa7fe27711176b8810908c5a9c6ff4a99a09d5d6c81336bc3021347bd3a87de456fcfaa7c9605efcbec0556e0c2a866c1b535b65cea9d874b5169891bdb84241bbd332836d23ba3153201d696973cd49691c7b80034742f8b22780962792480aa51fb039f7761b0cc534e42e62562f857b05443fae555da91e12e30526f0c944bd2b95a3c3d840cadea6487ad58e33e8064d05b962f43b2e3df0b931686e068b612a9e60cbc8d1f1cc6ec08cb4780554ff396d7b0283b6c89e5dd5ff0c98128faed71a757699aeec4a0a8466b97f182f5473c130e26d84941f4e53674154e5ca54ee6a3b6c482d8aadd996c962ca9d29a4ae9b38555fd7b4d0b662b771c201a208b841342cc7118a2c8bec8da6c2f9277af287462cf2c86ee7dbc1d6d57eb555533de636c2db3ec8c7ffcaca51e5395af0d51904984133e98e74ef42691ce4c43c73b52be6a3213df61fbdddccf5de9d08d213e6e37def3de0d205fd65a2c3a331623044f360f371edb0089d44d482d6fdd1cf2b593dd649a3be5076da405438a0ee060d66bd8001d3742a3251af136f956c17355372b6d67f60ca21ae53dc015a14beeb4b6e84a41697b4f87fccedc65a04159cacca88ab086d3d543407c2f3ae37c239f1f1f29797e4825006a36808038c5ca9b843f9d134ccd82b77ab268ad5b44f87d989810879807c1a1fb90d46a92a88958da59ced20aa209379096d9afc8194850614b278b7f02dfa8a903663e6ebc25e9c1695a1cf3699292b8783a1d804c4459cfabbaf39181dfc786e49caec19bc1d84d56de306e357f99e36a83a1ca23574e0a09c06c307f67c33387bc50f8ab8400bc18a8603835638057ad1fa4c30c28bb29708d50cc1c6a17683c796ae2c44474555f03c29a486f1a4129582c5ae293835f4c7004192992d95c32af0a01914461a1956aa2bd635ac9d088079a25f6fb4bf4f182383d932042c82516093a30b62969e5278c7bd235c67c46c339dca072c4217b3dd291c60cb938f697053d3049efbab52d9ade254254a06d813f471d1945b0d164960afe688448be30a322e3efa220ff8468c1232007f428cc32fb0f3ff08932ee0f6a6b6dad95f1fc4a009a9c2266120490c91cde4ec889e7e43ec41b34080ea34f8230823537c2d077c20c88616ca0a5365a8b2d48de7c5c16920b43fb32205ea09d3bcecf87798b42e3b5bbbb2a171b40a539b23dd4de0f2330cca071dcc5469e8ecb3eed7f7ccd215e955fbfd96b788be77f35a1cbe7921657b9b5d6e4a3e3ca475c297078c8c8184621247b9ef81d56eec1a3962ea585a9d8f51614c20ba32253981bb94958d88b2db93970fbb68b23ac056b00fe3ddeb5abaf8c850f059e174de065a8336193d6419a3ba27848833b3862a11d52097c3078d173dd036bb0c841d5f3a754387df19cd08e9717bc5f490a11ec06237d209004f648abbeca6cb748c5490f6669635d61b36290df5316b080eea919932d430fb99b817216ce97832a83f5854152a207b63ad0c1e7246e37451dd8b01da7668564c44ccb2f55917214b136e420e736197de651d7373e10d3d89cf97be8f18a159d07e05c2b2c58ece5a10e9c99b64528724d8cba139b283bf688bc7917319c5a5bee55d867ba58bd727f1bd85ef89ad420f5fbd49f1c7c6d0773224859c528ade73f844f6702ba86bd8c17eccae008b18a5e7863edcc30d6be939305a589168a4c00b74fa5f9b06eb0fa547a10e5a42d199b33cfe8504a7bbab8942783a8a719cd9c670634c5b1a394fe891775fc4e3b615e4a9b2d9df670ddd9ad7db06c5d9f6e9bc104af3f587701a84304928e140723c2ed115d8aecd8bfd173130fb9c70c4cad67a2976004d90d0da5e07ad5d6237ac1770be7e7ec762858f21eb665493adc02c53591e8d1950128adf1d52af656ad9ecbcd3028ac8c8b4edaa5d4542d8c7fcc57f5bcc6eb3f21461c6f21a1e1fa2c8c0098f923c0ebecfdcef25852e35a819ca7505edf5ed38efd09b284a3bd5d2affc3bfb4d51faed97731d62ea04fdb103912112f64b6b099458b210968679c6f4cc33a825b7b71ffab390bb8b6a5f71c07401edce2a2f72d9c1955e120fc9c1fb8c61afad5179a1075e77cff2063f665356611bf2003bf627b2c3e479fa4c9bdc458e786f1dada1be192cd8821eb63ff77db5b90fcdc86385e639af53a652263512af40d9e21e85f7122b44aa9558258ad54ef183e0b1a7579235e79f29c1f268a47933aca48686fa8e5bec58babdcc6ecb38793fe1d8a3536c937d46626fbc54599d792c4ccfe161d0ea7617a77715474ea7b957d2f6b84447ffbdf341f2b7f39139305f92085cf7279287a0d29c49af30de23b521859010b836da267736fb1d64f47f2e61cccfaa3476be4d25dc30a0ae799b2f388d52842b06a9877daefa28340ba6772019c2c2164e3af8e18b2352b6ce5e8fca611847bec7234d603f632978e31e0ebc185c2cd8c05aa3fe09d499eb612b0f25f15ecade8ca881e3f0993568124af16a13afe16cae8fe9cd5d228b9ceb2c0f20092c6e0b277d816f570c83de79b42599205639c6c95cf04359ce225153a955cf49acff0606948d04c7b814b2d2d5be2ffec93b3f61f75b2bdb7e111054ce9a10f17d62b9d8c7be2166e788b68a49f5e4cab612e0ef85d9df7edaceacc0cf4cedcdd8ae629f088e8e4a768fc6b8af087aac759d079767d0266d7b69c5fa71f24286d3fa5aba1c165e126effa702d6b7f3f497b0641b8ec97994be658c8baf79edc0265ea6e4ab89a4bc34a01ebebe9cb5b7d6a5920805b2f1637ccb931d47e74c8b54b0d06fd5557c98fdea3a6f5495c11cb42c328c1fa0e2ef03c73b1a2d7de480baca425129d48229693916584e53fead79bd5b39a3d82e316b13c27e4391e5e9b13ba93a7018d8521834d736c0f8d7d929192c1e648abe018c6d1591a2846fbb814b952526e032d3f8618277ae903fe1a26244d5d8b9304574b48b448116aa73394e00213f72d50f1a2556d5e0cba7c7b05ae8d80882462848bfa034640104c838b71ec9f93c46028dd437ac63d794bcc252380073457132440d6f9b12344ea6a3144380a3b6b82176a137ad35b5eae471fdbd4e0f6dc0d0614a5ea0d2f69cef6d645f333548e7f67b836c0d29b574125ce120db700f0af4bae09fd22a65465a96b397a25d53d4e704c643e90566a16c36b21e8e83add4c41dc57a925142ba252ae82efb320b6a362d8ee91ac8ef34721edd637cd44c8a4a524dd6e2049a54e53153b2aa3249c9f6b517ff76484764970a426ae918c5f44de3360b42524c72123bdc392a6d83463492d3396ee6e2497d58afb67f003749564de2c137082e105f07d32123a5d496268955844a7724186a56bdf1c1318e951db2037f742539a006cc74c74d2218cbdf70ec064dabe56203832f4de8e9d035323ec43c5acd32c9ccbd56a34fd54b92675c2df77b4301d4a27ec3f41dd1517d00ad9a025b5943534d2eedc9979bf4b06712e59bd6e0b4793097769b73b1b040b735c73455a90d0335522e719da56e4c043c813510ebfd0acd70b76b9416d7358c6a2841189328d9dbfd23484988286788437b007e03bfa904398c8211983a1d0028145281d27b028bd45691c96352cdbf8fc5c9c4fc5b2f2b10d7f14da79a3f22a2cfbe1baf9886852b0820a9940a027870cc8c9f0bf8346db32f30f86ff6e129fefd667b77abd2c4353212e8141fc91fb865b8075c09613758ad70161c475b9ed47a179dc1c2537d49eb8182ed487e703fef82e2eef1ba1966fcaf09f836895f4c1c1c57b4dab4e9ececbfe74e01a2b2b1ac0272fd2210c2dddb5fec7127a0ae57063ed0f81a23dae94473b8af88f8beb28b1dc3b02b217de2ac1cf6f93a2a40950b2345fe3857cb4d8d42e46612fee38ac35d21b7cd2ba021267da7873771a382db503d869e4f578a7de92ae6d45283842c7e3ec567b268be5611f2709c685ced41af16757e946b97d6cd3c3d4655b8cb08c43e1b0e8e7e7a3493ee34437dffc5c87ba51af42e10a53dc0942b6c7e0faed6cf8c26caefe9be91e3a772ec50898bf2ffb5a6314548421669d0385b8929bb619c0218677c5f0f495211a7d902c212cb58d848dcc5865d34e59684ce88961ccaf3da4afb3e4b224dacae9721e4b25aeb8bcf7c911c8e9310b08f5f65ea49149a8ec0cb64de46c495eb7b816afd4222c5552e66b4b159ac8084c7e785645990aad65c8516c5c760f0eea3f3de4d9f8b9cda7961a6bc04033ae7e9592e8aca73b64146f609a774897bbe6bfd3f801688ae1e850cab5d02a67e3c2bd16835e852df86d0cf47e837b3940466e0ae917e9855a37050bdd17d22da45ec6f082eba51532442fcc8ecd8bc3b73047af8aba9e655e35e9b7c21ec7746f3d03688588623e08390fe573ab6e6dd153d4edfe46d9c1c3098154cdc6d47e640d2ec18309d4331482566cb453601ca69785efbbfc9af342289c776693fbda9e7cadd8536b61f78de1928a21c3e02574a8d92801eadf9859b8a232e30c0e6e8b8d2f92020014ae237cb5ff1a5e21c577e59050760de621057182edf5af297e50c8d4fc1c478dddcb83727a806d618076081f70fd8547c4db5232777792449abcd49085217f0293ac899baf004265d19682b6d12697420547da1c0be62a7ac9f9600a6c41965601496692be0f4213fb5f72f89b8f084b4cf308f59c4ef35249ae5cea826feafaf5816d9db3568b8bcf9d8ff64d17eae6dcf123ac6257223c6b86571a649ae08ce28e4fdf1a452a08a456b366109b9bb4908ade7a9a6f3258a1d588cc7837237213ab731ba1446eba8e2b594f7bc3b6be9c7ea2a578df7b15433ac95656a4472ed5146f4e3f9590ac88e9e4c16fe73911a743c47fc09df28cc0b0895ec9e5eaffd26a62b1630a8622bf35cce11a81fd90d66000f2a1ab352d224d59ffa841d7ad182b270eff3be4ec97cdf1070d2ae891175fbaf861e2239c28f36b0c938e830832025314dab09b5300bba5403aa483d864301fddf43f1d7f51591e87dbad6dce9830ff35d4c0b0e4656a475318088065c08043c1a2a32ba98506fd62a5b0b6f2c1a52a1c8125870169199f547da901a92eb451b1ff1bde748d273aecfe48550f64ccf610a93ecbb1387ca46d6d8c3a3a6888316355f7c0892bad5e7b080e5b32a09fc815c180e34c27841e1a709830a41bed1465ef022d14bb148dd43090d6f0aaa35be2b85059d74630dda65c9c105bc5b2a52d64e794e350b3754655458dde494f25adf5e1ce40d3d7e256ce6a68b661bbf7d6cac3809d5264df179830dd86ca881344aa4bfebe4f8ab2b073188e5694ec33bcc6d6f57d1d4c9663f2025e5d36337b0331fe48a704b1fb947f6b4a186b944d86d362ced76567bb3d6beca100e51ba9cdd4868690aa9e63add26fc7435ebe676bac9615c8f74c39b569bf57effdd1a84de41ffa9620dfb4a61d2042db60350683b23f02f17da87cbabb24296c19054b86e1a4447a614ff9bf392a20c6897bd57d1ab83a78803a2747490f3e582c3012d9566c121f6a7a2b661f97b62fdf884335757ea3ae8a42837cb52be42c30292d5c0453a9b5a4859d29ff83e2cb2fec5f55afb6ac0f665b4e2ff0ee98829544affab8cdfe246b52e9001667a951c8d6c72d54209c2c95362e2a645653be297a031eb59b6cdaeccbdc01a3e4839175c1141dc773882a24beb901072177c1952b4b4f2e79a5382fce0d8c130a255b886b9b7e7d0763cf2ff391314600e29cb71abaf11150b0e7e3a59b8f293b707e0389e8e6cc6d9352b030b6af3f513f4c1133d2d4b99f37927cffca5386ef1bcd2e4d84754957017981c8f29d9c338a1fcea30d226670e4d239aebed627cac198bd8bf0b9548f3c9e18859d66adae2d26496a609e357d41123a8fbda9c531ff04c188c183091362f7271a6bd4bb12209e37a5815168781b136910b52ea632c8bb4a5b0f0b99fbb737e956ef94c7672c7f078d2d7ece9ea38e8d42cbdbd3f4566eb5be92c7703353992e8c7e822d0194a103ba9f2a875820d2b24a078eddead3be3998adc42fc570006df9f894f62b0106a866e9b27aa73c1a207fc23655a4545cd5b830a77f737703730fe0ae6a0c70e95e742cd8c6a2abf65b1df867dff2ad03ba2caa6c64efbdb7dc524a99520a7c08fe077f08bf7d4fc2080f00ee3b8cf3e47c09fcd30d58fd8d6943f5ec3c340fc69e260ac07f0e1c8f03031bf61291f6ded744a92662ae758af55e6e30c0105582177a26fc7f8e17f6f53e2792f07d39fd5e47c51ee10b5797fb007ce10a005f0e9c0fc717d655bcf9426be30b57365fb8fa9a2f7cf0169940a55f4de4e0eaae7298e05567f9e75ff640a295e9a5b0c17411429f411480fc2823093e13d42d3d46ac37e949ef58983d3a16eab7c3411f07270bf5c3b01fac33670b456eb0f359f6181c15eacb07bab23f22118a4dd25cfe95931004631221f26594b165fcbff183c141f9cd5049e41f9133f67264a16ffcc021d890a18e38cfdb2061c3bf12f4efaf01ac232511ff847c7f6cd714c2c639dce5df2e3fd522135e6edfd0a15889892ed115836e7c4aa1628f640a23a3a494328c8b8182820a03556f8761a20ee5609483368ca294817976c8e01e9fc882e29f79429cb283b884081dfd88eef6e748ab2c2c47160c4c4831ca300e32c51e876256fc5a991c6a853ddfac6646bae527a32494835142e5847109d51d04fad2c7aa831c0e7dc6c03036ccb12a2c36cc6972307617243a6e92febefd61a2a02493f3104556373531312d2d2525212141c52992e9ca181daa937f429c72639481c1e86408ed202e7122c421198b107130824dd3256343bf8e2a965f0791e5676f5009cbd96f55faca89d59e7bb02575c51e9059fdd8c73104571de9fc2bbf50caaf8dfad5562894279880ba0e7a3e5ae619609d8edf0d963f6cd75175cc68636666a69d65e39cad48690931b7afd21261ee7c0f721ff229777ef78c4ed1a9a6c8e658b2733ecf76b06d886c8b8912820ddd45e43cf19be7e5aee8422c336ca8ca2e3f76b9ae9ab074d5845d356165748a5d306b3e3fed52e82ef645a7ecc329820d5577e27037581598cb50375c5d161076081baa2e8bc8861de52fd6991fbf645fd8f8149d1c64c9c0861d75e777548bf9a6e2e0fc8eb26ac2c61bbf93b4ccd59dd89c7386f53661597043145cac09dbde5e53d877c717f3e8cc64b02ee42e07e76aa5729e96aeac8cad9f735ecc1ce5c67721e7e9b4784fff3014c57958698920b9c40d4bdcd089b8d1bd7152786fa886720f054cf4280c3df2a0cfa33818976c90f374ec97dd8d147ba251bbaccbbaaccbba75eb2e1badbfec8e6f6383e5966082baedc9dcceacb02ee42e2c36acee72225237c36257ac1bb8bbdca5c0dfcfc5eeacc9b6393bf9ea7db0f1c3558c4ada87328a5c2deeb9dfb22ccbb2eca947d98eed7146e92784880e196cc85cbc8883d17ffa378b3022adbdacdeb3bdf68549244864c9f60f21f2806cf336ca51a7488e5ced33a7fe8547aef68547b22fb429f88747eeac58e53be4e313b9d4734e9a5f12797bcc18d98a4fa43d80e39f1007e3673bd8161c8c2c256cc8493f1c6c81f33616c34a98a41677fe794035830d5737823cfd3b767c9c07c73fcec1f83a9cd8c8d33171d9d13d72d1dd2d57a53b6b5d6ced514e8ad54cce4cdb62a4373217539c9c1847398ee3389a838d2dd61ea3d3f8491a7d4629d9c148a974199d36e7dc11cd60b3ced3cd8ca0665d09e8c4289db24ae99cf3645d094e70fd3bab5c8956bd2ae10c6be3b25252961f6c775929098b0d702081c8d65c564a125ac3aa2e2b291166c7674749892f0368010a3a7eb4d8a1454c1638b0220929491ca194c410949490e2ca9fa10b20c2e88a2984b042084fb4e46cc1954056a4f041cb1015222e2d39975c29c31557d65c29a5945226e42ecd1275e9002ed5c28395524ad9458a932b6fae9452caae0b22bb20b4995c2ed70b38ac977695c8832e508aa09452ba7541a8369772d0e3870c80f482e386fce5064a20e180f4427abaf20821ae3c22cb954848b95209892b5766715d9925872bb36c71e5d3d531460f8c2842c7081f5cf9558716dc16375415f103018ab8e2cac7a244e5a00370412fa972e4ece84144132522ba983aa0b4a8a20644f032441557beb5c1d100982c71f4040ba5231fd460d5235b92a3c014214c181ff0b086132d395d574a71e5f790524aa9c38c1dde766061e281658c104220b133840d2c363408220a4d928a064855665c3534b842061689860664c84c6089d10c103354492159206a8043e79201820b156e0c520a88a71c36264c9d131d3435b8222ad9045a10b53551c50c69417051054bc3290b620d2a94a95e91810f6b345d49cae175650b1ec640615982c3045c4b58a8542982516471c592a5063151399a58f56a0c194d393d902104129288614a19554c9052861125fc50c61633ca682aa10c28d6652786401465f38ecc919b9d96b8245dd6c23c6b1229ab3dbacc46714a2b31f2f37cd2030d1be338010ddb532efb607ba7872fbfb24056b6844183a82f3418430d39064a0fa49452ce1e862efd4867685239558e2be50e1f3c146145ca95ff5692d8218d9d1984d5010a06738b284c87357a905c1cd11d7898213a25cd1d8af01e38492968c0300cc3b6589a5b30d91dbab841025c40d5708698132e3b610614ab29ab8a4aeec262927f98993f669dfeb62e19143207550999232eafdbc9105a56e212e5aec0b21214622e7fbcac0445d40debf5b802c3aeacbbbb7b1cc0d02b8a47778f3940f703227f38d85a7ca37dafca33fa4e6a2bfb8e1e236b287a952e92ce2ccbe8f7bb3fcdfc03323f9f1c20b392146068bc587aa51786e0fa73fcaac00188cbdd0a37d7598362e3e71c1f8f51c6e913003b4755a64c9796e51a918b0f90a0f3e0ace0fe81971fe83e031cecf9a3087bfff8f5fcfafd3df9ee1509ad5ad8abbcc7df496d61df5f022340e84de01f423b2decfb3d4e00167fb04e3fe6050539b12d057001fa11c027f43b59b5aec40f8847779983134680a3191c75bfcbe8f17da41b7db89d43d3ed1dd679383663d9987fbc48c8496c31c15a574a20afbb8498b4987fa2c7189d999bb9bb2718393ea53f425329e59414cac639213349fe09fbcedbdf0eebb474fbe00e5bb7f177e6ceaa3fca8e85be48a4a685941b95a91dd6f1dfd9915a24e8207b9e027847ac9d05f1950a7c35b2bc5bdc05c1c01867b88df60428ddd3e34be73033d4b1a1627f6063ee20789452ce59b32c0d4dd3b68d524a69d7c954a53232d60a459999a194525a6b381a4a3fc618638c2e80393954d3c6c6868db6a152d9d874416e6c6e6e6e543534373733f6e6e646e626d5dddcdcb8bf6b49d7887fdd169b1c6c7238e17ab73d4715836ae3cd1333dc53d9f24fdffe66ddbe71e3f6e7dc49a05bfe409cbdbde09c501e09394f141f8a3d1c7350bd322ac8c6ccccf1f5e57a92f3a4911fc0b5af358d6a54a31aa5946eeeeeeeee5a6bd9966559a6bab2e56b1e92d8de659f7c45594ee87563ac918a83413818a77891888c2843f2a82b6266c9cccc2c99995932b364342665def1a9f1b35187addd006038d2c639314e49dfbe6da7dbddc4b4752775dc41dce6a6dbb2466f07b65fb57a769076f439fa5ad64e4637f575100e527047e3a590993eeeab76e53c9e6ad945c78f73055922a2d7d993622d3b766b72e3baae657777ecee18a3dc78a6a6636913bdf06d7035aa1bcec6042d494bd2a0d86cec76e95576c7f80dc52827e5229548145ffd3330b07352492b9d81413fc6612a955d39d95a2b478d72e458fd53c6f537e79cabfd9eb6754de9c730947efc96c921f3396ece66edcc0c0da53f63c4b018638c5f48a30bb263d3237a84f50867cc0cb13869c799cb0fff563baaec376ef2b9d1bbefbebbbb077fa10b1c3bb283a9a79b4aad1ea84573019bb7f1436e7e75f3f9dceefb1b62a344f5365f7fe1ceedbaeff8054bb7fb540d27e3d1bccc5b6b53a9d4abc037f540b7f3c22f72fb6b3c1a2fec4bf329affb70d5359eccd3784077e63340f390f9ce0b7b5c19073ff5dda7bcb0c7ed8c6e7fc7da9e0bdc74ed17da558d335e713024693779c1e4847932062a85c9c979a4cb0be6914c98640c5408540ceed15c9ad010341716b63fd45c740c3fc98fba98cba5adb4c61e6e4997f3d02707650cdc43a55c7f2a467ed4b18b5131b29f9aac3805f1440494962827a4cb459f7210468b135c9aba387979fa0205268a3e4917d2e6a24f29fac43af4491bcac6b4f69db59665516badb5b15a1b6b4cbe7f63595604acb5accae98319ce82c8da0e6ec3c66521fea11f372d7eac0583ce7429b29e300f6d1ac32ca74bd1a916cc13d56070298ee118aebf3f33e11e0a453128d7a1281466036355965846c6daccf5694046c50c7b29823b5f324b7b81762bd418e53cce20f61ea6001bc33ddafb4e0c35c352f46bbf98c4eea6c535e494718af7c4a5c892cf44a5c98a5310373e1111a1b478363746c51ecc85b95c3f1cf4f7598a3d591767f97b61fad204260b9345282c46c52f636a01e66a969a4b3b62e397cc51e86ac5dfc7c99f65e64fc627977be21366d58ac5270cf24c93300ef17c29679a308771687e95638c5122fd4ca139e79c4cecb30ecff89f828d1be79cce29a9b981ed97b1ab94524e28db562f16141ab9311eb9fbdfdcf83993832e05fbeeeeeeeeeeeeee965894320ba9ad31e994347ecbaeb5bbbf9851afe084f8a77e8c31c6251bbf566b6338c1103918a9c4b882df6e30de43e71bcd304717292829ca75ba34853251a191c8e6d2a6d893654d99d10856bc62cf26c659fe4146518ea62051b96e65e93a174466d4a56073e7b74539e8bf2db1ce3a717a36307726e7b9b9fc9947bd388b9e00c58691882852f19e2c88cc680ccb19ddea4cceb3e28ebae0d85f8dd1ea6361b13bfd4ee9d7c359cc3b190efc35c97fd8e4c4b1e5603d9bf9fadabb7dae3b49b5916bb71cf795fb6d6b2ec8f6f6c361a1be7d15ea5b22d73ed06d2ff442ee72a997891ed0ed247e539d17eeb8da735e9873b50712376dc69be9b1b3034b89f757c9a7decb9997dec311a7bf9d560f67f96747161482126d9c5394f2ae28f5399288ee43a4007483523ff34ebe75853fe501f97c1ce42f04ba2a6bc3f090f6ad75771f778fdb43a9892f97b3b8acd484101351377b1d4196be0e19d81b80c49e99efd768de7ed7d67cef20c08215dc100591b9a6f8b9eb3a93c102e9a10b3ad80ee87e1a6fc68b5d10e68f08ebf4733711d88f79fce5238b5f06861b464f7d3dc559fdb20b12bf1ec221c7fbffa555718959124589ea53a27a9a07a279a056aada0c14f98838289f85c586ed92a9b7299bb7f9da95e3f296285192e5d71c59893344f5366ff3a9fe0ace1599076a8143587feb59108bf51a2cd61f489c2a4fc90f2a8868d262c10f32b24c69d17c57e2d3cd35bf5dd6ca7c458884b1a95f39b1345ff31c86711c37c48955bdcd87dc4424f6b44b069bb192c8cc17d6d4eace76a59e2f86c33e363ff5199953e6ffcaa43e9c5f1b7dfd72505ae9d79c29210e4e1b8f4864c9fa6d0c03ebc87c2de46a622621da675e1299992309fb93011d90a47605b51011eb518c7b96e9bc8c888345a6f65388093b3fa885ec772fe385f2cafcf44225f66307653e1564ca789ef2587e1cfdcd4be261bd753e2d52a99e7a38f3e59d4fa448bb5a48e57590b3e44ff9190e16e7f2961aa47040031c945fe3d11cd10cc15f8d910d2b7bf39d29fdc2d9373a00aa58ff7c4608820d6b12bff1fbdf1350bfbffa8e1e45f5e5add14be2b7283bb253dac0720f8f735663f272f7ed8042ec84e16c1d82e50feb4d92c126b9b6bb4bd90529ca7edba68cd1b18f1e126e3a3f9c15e2d35721ca5a84e1f8675b2a67c9cfceb0208b8648fb739a82ef83e5680e02a8eefeff99fcc223f73f2399a7906d72138000bc7ff9f2bdf73ccffbf790b01b793ec2126fafd33e09928331496a49ea7f76d0e3625f85ff3c2f3c7243f949e4f5467aafb5782399d0489de4af33ecb368b096cb4a9af0d18a8d1fac1bf92b0658c5761ac70e5af847fe7440fb151e79f05595ab1b5faca076cca81e4eccd5115da6b8310212681f13f4e6d193aeb08851fc237f48fbf0e6d14d2b56318c09acaec0a8d98d2c546615ab9886c307f9717ea44277684a0fe4ac621a0e295151514e6820c38a278c89963256764ada85194a0cc1064f558099610e01418c3ba3b4e6e46e758b21c35db1c471798b1041777559c98a28ec141be7849d640e3b298b0da32b8d1b46a6e80aa32b09291e55bb0a31a8e872115d99bdae948fa3de708bd2aab86136c4951f62504236241bd22deacaa7ae68574b2c7d8d6992cfe4ea5e6174f74b2cf62f3333b6e52fbdac644510f6be0361b3cb4a56dce0ca2bb64e855eba51460ffb7584e56f236c28878ce2535c5a8a4b71a98bb0613b61b19ca464c5d1ede7ec0babbd2bfa853f8f62115bb703ac062906908106ca00678891230c3966f640649db0425b74a878ad8183115f9461c5946284136e8619f80ba622d4a04c462c69d256b585c806222755c007270c6e0846f1c08b3150fc5005073b3b546056582e708ae2a80667142dbdc0fd2dd25b5551078512ae257665a79d2dc061f3618915d2d23d832d42597a8b10104238b8a1c5c18cf2c20ec040634c11a034c560420140184ce850031a636850f29d9c2d94ce502a21073609ecb2d2193f144d218f4123b0010c1df440892c361c11a5a0c02889c996232b388861baa0ca7cc24f46628eacc862440f32b03e97a5f749338d18e69c73f2f8420c274c5e60c60e425348090aa827709873cef914c578f2ff3ec41964d81947375e563a430757f0525ca23de59c52063b2f6fb12108243c61652e6fb1810b2f488e461a342a79b9b26db1418a9bbabcc586a41e6cef64f9199bf28f5483232955e152ea52e484c4f4f224c332ec69ba61127969e8c2149252ca29270a433ee3d38f9b877cf7508872fd270a42110518340f6fef0d06201486e28ceedf4b1b34f395b2c93dfaece1f8f797eb532e10df24b3c7973fda05614ab107e2584f6e08b40b9a07bf046a18bed06e24d8f5ef975edf9e340052d3031b5a205146b5e21f3d9c6727458695ef824a88f370bba07dc41c1b6cc84ff7bf08ef0c70e7913c3b96a144451835043abaf50b5d60262aad2862abce233fbbf27b4cfff498cca7d2089286ba49fa16a560be2b019adf7ce9c56f7aee8540ae3bfd633532c9594edae79ffa2323934af14f2ad575fcd3751cc73f1cb76dfcb36d9ac63f9a9665fc9365ac93fd645fbdca3ad963fcd39ffde41ffe497df6927fe86f2f33307bca3e28f3c85e7ecaa3ac23bf3d8c7d48e6213fcbbe7a9375b24fb5f6c28d94c7ac43a557e9736f847ead756686ce503a5f765d9844769e11fb85dc275f9347b6cd9fa55569343589d4b499196d66e69bd4c8f2998fbf1dacffcccfd85ca91f3b6824f536545ff3fe91a5f26c8db73aa2d1b0ac76664672f6c697f1140dd4483fed3137c43efbc28ac4485c8186f42bd2587045fe157f9c7ae59d73ce174010025d11603749bc520529e57f0edc73351c2703740474c4a9542a9aef9a12005dce08f77c2d67bd10e8c8c605669251a954325fd1a7840d5d60a6063ab2b151a99889c63534b02f3c72eb67a4292eb1c9e71c185c2ed7926b532f696868686868b41e736734fbbd706393378b9b176ff55bbb6e7bea31eb6c55477e61f6a9774148e609b9be698f646edf0b37ae2791cc2f8191eced1bc95e3e10d7a6565fcb3e7b2dfb906c37ab2636aba7f1aceb32ebcc7ca1fde46bdacb78a11023488c68cf3704ba61110bae5c4982228a95241d08754166286f1744a6c05c6b0dc112005df959f648b60f61b8f57be1c6ed4c7e48b60febd76c5f3f7b29bf3e90286bea87a4bfa227381e470d8eefc9aad5c4c6d77c4f6aabc98d6f629925ff66f54d6cbec9479fef670fc4997784f4bbaf375e131b9f12ad8a0e45dc50831250bc5a36292f14723b6f7b15ad1ee759de24475fab5e5f8e3d4a82788c125c08010d358ab0c69856cd33e99610d66a02d4aaf938b2ea6b99fc56a02f2140bf7eec56c0aee45b3d2efb5457c8af77e73ee085bed887e302765f8897ca19b73d6cf5d96bb576b5aaf50b85dcd0859d6ba43edfb08d604f1fc9fc10865bbf176e5cfa61f5628c31c60f09c551d3c5c66746d217fb0dab9f03807684f543323fc4be5f0a998fbdfcea615e581fabb7bf0f09fd8afae7c79f6cc196c33f8ee304352c33dd10e8e8862e30137dbece84be12a016a55f5855e0ba91a39ff45eda3827f49caeb37ba839a171b91a530242ad0bd65be4aa07d4da98bd53c16b9d736a1a1725a1f0e635addcfea903f354075ffc33e514b75f32f14ffca8c3ed8f2ffea11f94635ab9fe8d6158772a54aea87a40adadeb3a28d71011914f21e2097d0a9529cd7db9adeae276b7e684b6745be574fbfb25f348950cb75543345ddca671baddef5d90ae4d3fb43d5dacd39b8738535c7f1c3ae078b1cecd8b719878b0d40b39a778f3bacd39bd0c20e4145db1d95a6b6766ba20dc172d290d2d89737aeaa71c4441b5b2ef06a875f3720fa895c3897de1c89b97ff8d15ff1b23e7d9aeff0dd38d17ef9150bc2414de68b97e9374fd66e9fa4d97ebf1b57427e7c43d39715f9c077bff9a242b022d293e17c65f33467fb18e87fe921e70d0bfaf0507bd62b56a9bb66d33f35c0b2a5d34b5361b2ef3e29432be0cb50cf08227925adb0d572dce90ecebd74f0926e4a5a9957d759ba199a1a1919e64c51683ab1ea7ea82c88fe39c387f7147feb272731384bff887a5bc3192372f19a5c739987940addac9223eb0e1cdebe6157b6e5e37af1194ac1c010756f2bca9189d12c7eb89628ca856f5b8e539f11cb1f5af1c6ceae99637995c87c2e9aeaaf06a4b0873ae0e122e835ec6b3e3a0ab2e773e5348f3f09740dc711e181ccc76da553f998b492087f6d1549a870575d0daf63617d904eb786bc1a08b4afbe8a4e6e1cd45532125ac4c740ed7bfaf87a47f070b9b82934e18b1d8b0939a0bfee924ef7ef5ab5f37f78648ec7966c58f1fdedc909b46e01df165356491cea633f6a70222ab8dd5c76e9d34d6501d2728f66d0fbba158a77f1661b9593af9d0dd5ae4da01ced3e1006eed3159ec6348f3f0cf7e62d977ad7d2fdb0fc4b1e933c4e743f7ef4cd29505565fc8ab1e51ca49b33927c52aa514e41d9cb4334be83ccedb309f0fa398bb534ec523cb2486615d1059a7b78ff83cfab9fbe353fa58b782dfa60f88976212d3e2c671dce632f66a856158d77591857831f931eb602f65d45e4e1a7fa971f84cf6b16a1e5dea539fea07dbbf750701ec6a5fb34e967dc46a865d761e0f386bd53e2cc00e06032b225b5631aaa538739c343087120428a0cb6a979582b044688c2826638c113586d3184d4a609ea4e49191010e46a7537a8c31529f2edd5d7a8cee83dfbdd53cfeb2ce8f506b95b23fca2933a63dca49b12ae79c53665aacb526d56d720560314fc1585cfecbbf7aaed53ebc7d3004b01bbf6d9bdd96e2f8277e37b9e71fe4d133432fc1b7fee22f455c7bc11d9f2fac6027425e622e563430c6684010e2a6c30873c3a3747f47c20d73dcee79cbed0e70bbee2d10d4b8ddafc298e276cf75413a7e1a0297a716b7a9eeb671b9dbf654c5dd805074b7a72753288181a5ca279e8f6236cd39e7973077fe60893bbfb841e98b12d8e3882f88b04fdc30c78d60bc08c20b303e78baf18831d4386a79cbbb20fdba405d6f3c28f9a049c96906ae0308ed0320ae94527431c3955374e18545c287aa71c104e5890b2da02471f14514168e707151c613262ed48092c5c989100b481839c1408805a423a718c4c0429697afc088f1d4dd008b94e6c4c0ca5c568a82088a288a4a308a02092e6c8da2041e44510554145b3c8d020897529a434598c9820e6282a24c992cec408584282c7759290a349ca46002da60e7652529a20411830a2baebcac24c60b6ef83bf4854dc13d73c78d8f71e11f26fe69fe70353f6cc9638c31fed27c4556fc1b638c738bcd611de612ff8925fee95517376258dc884d61032a08c7ceced4e23ea237e8b2557807a79c71ca0b76cf99cdd5aa1bfc1c07a7bde052102e923ec77970e0b81bf5703c19d6ab92748691352765c2cc651e577e09f23d1fd69141eae7f00f76f9573ad8186dad1d41ae7d94c03c5a9a70fbc3d495238cb05a6d3fdd47ae7e7e39acd319dd301f5931f9c3c1fe7c2e9021ec0acc01a5e27504aa93562b224d64e152ecd401f8aac6d58d2f3664a8955094909b78c00c2132e9d38abdb0265cbc68d4142a54c6165f9e96a051362612488f1eff0361a24018628eb021330919e23c9caaa97d88f390a06f582d7bf92aebf457964fb6f6382dd641fcc37595e399c1acbcd82ecca5eee0e8010670cf4796f730a5b4050f38e845a8b01b8684cdb813cadd30ce3a8fb77b0afb8eb0ce24438a578459f3894201893daf1b7fb58a401e8b6187cecff9b2053df839ff192002172f8648e28a0e5b4c196c9038dc0004c40d3b50e30619c084b122c680082468a0028be1c1cff928a8184f9ee8408b2c6890cf952d6426f6b2d380edb2929719bc40b9e1ef6c4530fd15127b70b89f48ec994fbf02f1e5b702f9f1e9b7822b43e4c70f8757107f7e38fc1561dcd281cd6eb07fc31ddeb123a36ba165cb51947be3f296a3d796206e8ecb4a4a4f70402dfe1c39ced31747fe6fafa4fbfa12e0d64a49f73d50eb7722eb2ffdfa96befd94d49dd0ca7cb8335bdc4a3d7dc6912f24b2280924c0ad0650a056c84c977e38433857f7dcd7ef8a08268e7f3817c86cad385348f7e108c11e6708f7d8738f7db76217016e71bf49cf9bb9630a49bc3d83f52497ebfa0f9884705d8efecc625531b02147c9229115594760883ddcd3e700ffbc608bb40fff8aecd3ef00f70439015bdd0bad5a366c5702845662fc10f269751fb2102e6d715e0f792de420cdbe766fdf850405719ffaa0ed651e47be7da056e775ddcbefeca744e6eba45792fa96805adbe671de118efcee815a4838f2c38900f7db4bf90dd9befb5e3d1459f49518115d2a145954ebcfb28efc19d6919f7df58b1c5952286a40ed590b361220e93197fd5bc8c471e7efc41eed6764ff707cb1dc778f6d31be127eba5f91c8aa9b87c39f62c2e14f3d504b096f3f44fbedf9b7ed5353fbe60646d654812f0956acd3da6f1f3bcedb368f3d9c21dc6fcf691ecef6d5afa96516ffaa467027b25886e9cac639ae1bf979a79fdf27f668dfd2bccce3883d8e9020fffe99db1767be12eeb59fdf165f485090f6dc1794fdf601892ccddbc199bf3d50cb2702da673f44fbece767d96fd967230bd33e8e2ca016508d2c2c35036b5967fe0cebcc1a599599da23181e777af430408f1e97bff4e83189d044f4912492446d84944457f691f431c5c7908f18f820f241747d2cf918f24184421414845018ba2824a12084c2100e9b3771273f7ad8bb273d6e8e619e65588661528bd78e44f3f02dcea3e85ae49452e61dc7dfb55c0773bb20d2b5440860518b83326e1e816ad31be4156194aef84177bb4fe982a494731291b2d205c130f9b52a3539293539d104755597959ac6dc151634dc551d620b13cc2df853e3e8d21e54c46703408478f123e4c9ba9c273e3fd1075b88b63e3ff114d62587322536ce096975698d2389f615111e6f6c31a94f0b28cc0ff4110605256844cf0e67f573e9f283727127aec4f1038834a56849fae2448e9c1d3d7e78e0486456ff12c726afaeac0bf3414b8e1d158b6cb5c58d24427ebab1dad5b62a83fbc1d6e1a0a1a65c2e976bbe4b882bda1a415716b6c6576c97d2145e6e08de28c5971b5bf1392529b4dcf83b7086c8b4e86b37ec5b443f25287022400c3b3d98473ebbf8a77265feb984e392dba1ac81935de2a4132ebf4f01b68dfb306edc4feeeeeeba2f3441f7f576610178ae57fa3d9a876fcf59ad1f021805d6f1afede3a779f80f9eebec2503ce43b3af378bcc3a3b3d18ec1d7ee4b34673d9adcf803b3d47acc3fd8505b86d638c91692a54c14532c28d9d0acd42766768821b9f757a93336c3915b64e7e2af4c559a1b674410da118a834cdf665410a15d1400000000315000028100a8804029148249c88da1c7e14000d80903e6e56180c834190c4300a828c31c41003882104180308323554ab00103a0d4d5b6fc441b4dc7d0673d1baf854f69ac1beff3452617b0a1ff09069845c282e5a9938dfc19fcf4dea3564d3dc6c28384e38f50c98302876f595e87e1a495e3267ce8c231cdbcb98ad00bc9ea5853b286b5d8fc44d880603af8f86988e9202fe751b6d3b1fccf6b0a901a161177a0f97b611ec4016383f237b4b3795d9314078117af25a591594bf537a6545b01d29b51d5c42c4cfc46d6406a6344a5e775fc8019521b8b85324a05927781f58e1564f7181b775e69a9ed0636e4b713824afe0508004fb4a7ef93e018ac441b10a41d4bab43b640cf4e00db48f0efadb762cceb9e04ddb38b9e22477a15b16b0e60d69768084b05adc14cfc98cd85011082e1ee745dbb7089639416adcacf981731c4bf69c07371a5ecfbe6c7fc56c7822a3cef4beab994eee7e0d83174a34c490e093b64d02951f83982f40a16452c4cb4f566882a97d127377b73af48f4034ace5f440638258edd55a3d3d652099f7a782b7c2a836b1391daaa8275f69bc355cc428d20fa523f19499b4a2cf5239148567d6d9dbbc6463a5ac48920ced56e7fd32b14486d535ade0cc636c8b28500d0cd1f1e8a132967f1ca16c60d50b153e049ea62e7792586447a8993110b08501e03a4a0278292f859249534b40e8427b9b21414a1792687662f557e31fafb24887a62ec811c0093075d9ca2d20c240ffbd054e500ee4ffe293715c8674f71666a52ae08c19dc55784cfcd9139f2e556f0f23e2f605f2525da4444f3d7a2c84e4e7afff72ccd4448b6732baae3eb4484521fdc5a8360a030c2a84e35baeda07d846c05765cd476a7146c0f40fc05c049b8c3aedab77672cb2a64e3f9f0c0ecd62ca5eeaf64711589d73e876be2a2571a0cc986e3fc845fcd90c2bd050ef6f8d3e86774b480b5af58e5a2b895ea8f1f258c22c487ccb9b60f4f3b0b8faa2683b599dab8a0758e032a0b1a27b303c2cccbf946765718486b0f91a3a05f2748a1381389f7a1c93db976489534d9d430bd40cb5de5edd1c41f810d574ea4473dd8035c9ac4c4ac0465e4ff1cbb12e00a404e9c202c95e209b099e09e1f300da44fbe65e0fe0030ac0cde4d88894577d30783e6783c37b70000b64654e2602ab93f6419f570f0f247e08bd9b3ab316cada8be884deb4ae610f024521a7bfc2f5a2f68173e4c5b4c9e5529fbd5455ff55d154efb4b4f58655be60618c6051ccf57bf66e2d7ec765bf5e77c429ec2e646fd819be596a5bba671d16fc885f2d091c93ef28c9899d1f0b211118b1446b49123b4994de48922afa57ab516af8870614e4dd2d009ed11ff0500cf1fddd311d0567a13538ff8724077286d40daf24c760332d8407125b072e9ac4935fa4717bf8b65d0679bebe07b2e1a729db6474b25858daa9bf029490ba9a11ea0b6e511d4009bb490b143b3fe0867d1ccae9e2a8e5fd4876fc2a9eafa7ba05abc1d22703fc23fb9c8388d23f008ba46c5a11f196079f905bf0c129385eed731ed0a863f1800946a1b46fe703828496f03f2ad702066a76955404efd7f872e95db358b4cb00854488a3b4dd2b15d27d8baf1a4560394f483c2c41c4bcd570b5c29c98757c3a1bda2233b70f27326f1e79186d6a608851fe8e37fd4be83f2574afeb079a92accf6d4e8c246310470d6cfc0fb14f8455083c4f286070fbd46b36209c1c96be81adca7f07914109a915b83f24391386de56e83c7d8db9990fca7096c13d8f98c916857ce69df49fcd92ae13434d820d1c0c65660254ce41cf374f403681452cb3f09809308fd51a0dc1b66e1780f6bb100c1008b7e7ea09ac59216ea69dd440f3d055185fedfa3db04abaa87d4c316af9c3a8519bcadb1a4b56255d5b8988f7b0caf5992953d2a5c8bb4b438724e28992487280f36bf78cbd16621c5acec4175dc5b59ffba15d51e3e8c161457d5b7228f7880c01428d00793791d35ff1100faaa55b30705a89b6dd2f5c39125868d5af434f490b81772c9f4f26a082abff5c48efa4b3ed4681ff5c2dae4e5244bb684958b658a940aeff5ca358f85c9cfd9fab9ff8b37af2adeb5d604a79e1e20edfe949103918906fc3334894982527d7732dbf9ff65237f9fbea84fcc1b078ad62a29da56024fcc32d9241ccf86497a381aa65b484e8d9e7a4ea8cbf88b0caa65a4829e8878fce0e86869b54b2d4dddc115abaa123e501102e8655dec510d81e2832b508698c2173baf79d6f9e146bcaa566695f7b6e7f63400d30ca013d796fd1780785859605a9068b9f86d73dfadd1bafe274b106fd271abb80bc401f7ad58d53d593618dc4acfa24d9f0793e6892916038cb9dd343c2d7f38d5e756f495018de2402a1304c135cccee45965ae5beed0ef0ac658666920ffe490a39acd5824abaa351309e1abfe3809c4cf5ee37bb28334b95907c68930a1d569d94de83afaaeb4c246f25a8009690f5d748d43a721e41fa1ac2fd88bf742bfdeed02a4cdd0052bf2e7b6bb7a0596d57c7da36adceb09d8766aea5a8faeefa5dd916d27932d447fc9a2fde0628d82bcbaaf54f36d3a8ade832d9443b1d893a7eefa2fdcd0ca97e7544c3c612242d2a5a5439058f0a231f7092660c0c990aa6d9640de43390582943aa1b4eb273eeaaf61ca937948952d9695fafa955352fa283c78bf1be3a2250f795cfce7499f7469e13e3a1d9f16a6ef960e2981cb3a62449566fefcc5286af059398ac506121e76b2e4a21883a17d640aca9fa24566cb2259085f394274185a1ffb83df4e89314bf9e13455cb9492eea8ccf7599e6d2ce71d2bc86bcb3d76f2c87db2d7d3c4323bde5a69e10a584ec0555a5d003adb5b62a54999c611b20421b2592e63503431438592088e0bf6d8a9f2c1ae41d705b060ef2e93256d02758371f506fadac02494cc3c09fa1ba933edc56891678762c2a2c28502fe228947e0f496aa636bae78165f1319a1936c4eb6d6b9fbe27aefc44b9a0eda99951d986e837f84859f833f8f599420ed724d643b4608f54a1f79b5b979dcb2aa4a04bc8faf00c23e525b5d678b83f5377ab056ecabbdc51bc1c36248cfc1c66fada1fe90da59f0ccbf8ae0ec531d6cb070c4f8d1ee23a0e4262efa24c4c188e23fc30c812ba5d38667e4c309f4086fd7d51ad9f06111397e9541d7cd8a970561eab1f81be036c21948ccca010d646e011460716e3868679277fae678e23ac043d20c0441cd465df36b69e670e5a9f9ecd3cd198de2611e41c8e645b8493d5e1f51be5b41c0e52a0e3061089149c20ac3078d4f2c66b3f0fa577a12b809daa26e77a5ed645ad4a4fe9c044c40fdd4fe74d5ead20dec6d87a1471175b5d3cf329f070730977f90f9073017134e9dcfbe57c3606812d84bf781a653997ce5c198ffe27b47c7f49c414fb875165710634f918ecc4792cc1dc0398a33983045bb6c88f7201ac6c093914b3625c2f15a5cb100b8e809e9464a62f3af86c3b99fbc9df3dacc15435291993e90bfa4463bbf3a06dfb33c24fc1d4a92a3331ada07ac219de4a7a16975023e80887410040ad6c361ecbbaca78b46efc5d508cd65334459a965eaadedd55a3ef34c14a619dc0fa3ffd126d9a905a44bfba53adb2d2df5dff5f814c8db92b00a1f106807efa4c3c5a0db207ea18aa4883e163c36d83f5c5166bbc615ca8630d7d432a0b395cdde492a6e0cedf4d3bd290552d73886446764eba030677f8535a268e8b005cfb0b3be6cecb4555d0ea0b18f149e97c5d139669c4a831321ccae86b9286e86f1ead07cda1bed7c36aa05909f42f6da2215eaccb35fff662fa829906ab6f5ab9bf514f079960f6fcca9599e49d4d466229417b3cdcc606c970eeb0e2fd29c99f15dbd80182c0de415ba73c343c8d95d5291bca3e4b574427725337d2a5d5778312670af038e858ac313ba93a864fbc0fadde6aa4e6b9ff233f03218324b8b673140d255ed6c5250434eb677e2942ad080a756d352567474e5146e2620ffd3e3e952a245b1e0eefcd7bb26cadb4e3750374d1e1a35987f72e6697ecd04df0bdc925790024e2d26e2583acda8ddecb2921bb20f8724aae6b7c20901da385e51d2adf5592f70bdf707649c2c60225ec58638f5cbd249439a0b650b1b30053ca0a54501e301ba75ad0021a20e0ba23140009107440edd64c77afe3cdc3f003805752b77afd89bce419a9780d3198a735cdd9711cd4ce4df108e3173377a087877ba66569ae8c3f86685adab0eb91adf480ccf0faf906e969c33aaa904731ba976e6358da21cf635750cd85859cae267e65d86dd7a371b8a39e2c4b9da4dd3548c45aefac13fcfca33a2ab22c9d454141871035ae138944a62156a836c97465fc5cb207b1dddc9671081365e095fd7c9d339ec58ae7ac930902bbb227840991bf0e9adc2164a520fcb7273f22249c60d59cfcd1b99fe7df5acbc704ff3ef551b0a6d5576fa320bf84a8bd7d94748839948c06d45c933544f371cd33f354efc4d2353b2872362bfb37acdd8482341cf7e3e283c966756bfd322a1567d465e21c4a43a384e2d4e3315e4ba1af549acf403da07309621cea154649dc9211b98d4c63a746a3311044a82e74761da7e1fb8213a879e617a552a81458ed3cd67c534725fc426bb8f041feb1e6be50e49df519eb485fa13cb5d2f2a3d3aca81672d6dd2181275c762014e74bc81bf0e1fa62aeede47242f7e10be7ebd367802f27679c8bc0b1f45f41e5e27943375f7a142a135eef8118ef95323b8aa442f5beefc937ae4d7ebe5732573dafc994f4368a0ceee59821c2800ee8df2f1740787ba96fa84767e03564a208bd82bb286037144f3b6267556cb5fb7368c3b5c20d0ad433cc80d8a41603a3e8734b100166f985dd17ea6d55683fa5cbfeb5c036e08b3b73a09d0f1a5cdc7bd03cffc6288429c341f9422486c3db4d6821c2624c82bd2f965a0e12309453a058186cc5eb2a02fb9923828d7e9d84b0f392660e2c83981c7e2ffee732ce923830f058c0e40299b4855ac1c579c3cd2a5659ba54e3c410cfdca66c40110a759ee4871690134807b94ac4eb7914eaf356dcd317c5b4686b764018f90c8f45414237d42f2c5868bb073a8c2ca0aeb6cfd20882338ddf1667f93093d2a7b7a445c688feea7fe06d0579d4fbc09f5662ee29a59403465ec0a1215254330c5b1aa1855a828e57588b5816bb488c983292fa34feb3d9612f098b1f3738ece2614a49eede9c79b8acb0eb2304a7d6a7d463ddafbd2d728aa6d909345c668edd93df0f0bfc0b49f9b0df7cad516cd8e83625543789da0f1c8fe7b07338a6f9a277f1d17c12432574f451f3229f9e5f1b6580993f2db4301e94982725de008d900ab9ac603c090af2118c5726d259366bf245bf1105a885e5532505015e6473f4d20cd0a629e5e7ffeeb458954910289ce486a0c28c5bff339e3c059d6c6aca229ce4a984f0fb3b8bc1792bf20441acfb049f0f3a71bf78390d9597733db416ed9de0bd3a339a1475dfadd2a5408e894359bb4b0f5dd9d2646a0ec04bd9d66211383ee0a88a733811eb145a71159dec3023c7e5037a756fca772877494ee48d16a500fd0c159c7c604bbd75ca454cfe2977d878a95d24eeea57878e9850d9fde8daadd74c83a847ae7a3093dbb2b85c6a8414f47b84d09dad5856441dd6d784627097ff7f698555db719a750a3665dca000c6da1b2c400074c82ba66b24c4df37b962b1ce313065a874c1a0edf2ea0432ec8d705de0d2d7d89aee0f780ce3262ebf8c63f0f3a1f11f34b95618fdc710cda589f41e5b8979cd4aa015d80d440369643cc669b3b5711c4881bd5e3ec5db6bd18aa2b8c785ca7627f1d899ad6b4d5f97b33ed4c90f3cb4d6ae3a180c60dfa38b32d1d00afadfa1b9879c185094354cf01e74f300341e3f29601719cdc793cb41e0b98c980ad0f28003a3608c3848ec9739cd372e93046b9c82f3901df5cbf218d1d370bee8d709338f59dc17bc2d118603a37e593be55746f28cd288ebabbecffa6036fb04ecfe4b089dacbdc8f9c505963fe1547049905338a7f696b5b5823ada674b025456fbd26c1263155ecc36ba52701d92e16831e0fcdfc1c18b66bc6abd2f12ab76fe8538133301715d2aca729fb9e8dd9d7a8d78bef2509178d381740a609e53e57e0f950c0271841c2d84e0f1291ec56195a1408e24870528b2e7ffb045f2d6194a45dee1a5fd2224990059e47dd74eddf46828951dac4ad7e458021dfe516633ae4ba0c339493ddfc833c4251b0c53c143d615512ab5d07efbbf419fcb4571b82f3ff1ecb87c281b6c3d88f8d2768b252f4148efc0aa16262fef048d5ab4d748e699bd82194a85cc53b722110ddc5afec73bd22d10c9a291aa2abe55d33e896906909d650092a20e404c1d80601600e3bae1ed8be5142719c149a3a1b19aafacaf71ca20e5b6b89b1a8d41f05d4cdf2631ce0da5e06589ddb7e6e5b0dfcb475872176e9f06b41b8f4df1780f70a62d2fcaf8bd2f9a4982d3f662b88d91e5172c5df37780b46be04f92778fab2a74cd5a8007f989001e85d80a83bd418e1a33a227671ae05062488f12ab1127dd035b3ae7dec2d3e5a9b605f5b3de7e3b1b096de0785b76b5f235966ce2620efadb9a7eef390f19367da1843d86bce53d4a0ab347ec9cfad019d7bb8c4f1a288f306d12e6ae31e6f0357370add460f6eb77bcd7bb24064a5793cd77d34bad07296aadcc5e8603c1472baffda450f743620543d793fcc390d608f28bdc15d74a9c1cea169661c3f8debff85b39901784c03160e8059bb4ed951c9f028d88ed6c03c8e802fc9661c057eaf651c3a85ea9cf527b81fd341cd5e123174016c733d23a62bb2fbdc7a5983a3a810188f073888f1be781baa164d66abf6446c9802a8e4ca4ae5486be721ad940255c0c375538dc7d4b74406941a60e88e55803500618354201d71854c706b72dc561970de48b3cfc9c50ec82cea6bc60f0ea2a93fa1e142f545105e9caa07036eac23f47d25db03fb5485d9f950268ed143c037ecc3349a0747a921c53996924a400cc426062ed4bb0b86dc6c37047cbd037ed79a56fd482b02520679bb234eda98d21aca843d26e89b1205bd37434ff634624f79b008322206880e879817f2081e8475865ce4fce6c6799d62568ea2b2560acb918ce51b486631bcd4f4d5934e92f442c4d6d999582168409b96b06d26e954d6c60d6e37c3883918f8774b38826a9cddc84973f0e9346002ffeea782f72727d4b1667ed8a1bc67bf215e73b7d53cabd22009aae6898408d83ac5be9d92adad140f759a4689960e62e4eab29bb0a124851bbb9084d8ae85e50d3641b84886f3d6eeb802a6a9d77523fda049dd4d302fd3fa6082f92f39044f42e98034e37f9f1ef90c7c2a0bf56db5c36b6f176e796baef6811941cd798097bdad06ab51eeab5e6ed5cddd040be0ad9eb86897906823b7e459f2b201421b3a86b0b94cb96685bfa5dbbdb7d3eef15a217cfecd01f015966130b7284b9841bb339741101326af71214d824e6bd10f4263dde08912c139dd8f70c3d53129e46b4e9ebbd31b100b028aaa913f37518eb40fadde557d03969b1d79114e70c6c591b7d2fbdbd16d7a6b678fbb1ff1687bd66ee1598f7bac43e4ac6db4aec358a394d4bd57264b664909e0f5030052165d0bac0a6a1ced0a03c53d3eda328dbbe21ee6cd732348f3153b5fb4f5b7db9dcea5e48d8bba1740c8a1e80c6ba54ee4a16926893ffc9e6b20c4c44853a7ffc335f20370162cedb5c57c28076eec0811d32821c7e42e95d89002f0041b4214c119b63ea642ac09edf603497ca28558cb364091a053992013346dd21942b68fc76f11d496b953e07c0166b887b46d1c00fe8428d053a3c36c27dbe52a850acdfce8a29104bfac652c370615e6a0abbfffa86dbb707e4c9b7fc9f5d21d78c6b3d713f7b31d4e0ca43c353c6e8626bb6e03591b7020edc2b12cab88bc87791fd6aea8cb0f95c3aa37250f3888ee589c4b01ebc779540cb1d8b180eb2124d36bc2bd83dd0e33d0cf7c7019d4a1edf32c47c2d5889ef63c7636dd07075127b773d08a56a06f4887a30fabc0787ef4912c40719ca5e7d105b7d38e369356343d6a20500dd5423620a0825aea1c5661d26c6521ad2175813d233a417cf0e62d3759e28e5ec89370972368bdfbe730e289761cdb81abb39cae54766238d5ad7b63867c92c0ea932c5fa9ac90103fb49c588d5b38341276d101ba438f68cd436c276e883dadfd063bd1d632d75c343de874b6c780b0aea83f11004f76eb42440448dc2b1b2dfd0eb7349223359dc51b756f83dbba61922f36204b293158d9616e0c04ec9147fa9a187ba0c6a5db8bb6e0996179df45c256c3230d87df633ded1b20a6543983fbeb65cf750833459a598309f2ce7ad2c44f42758af947ad460c149caf62218a8ace34dc894579b74d9d70f3bfc7beefa22e4497db7b6a2d2d336ba5ee464b62c7e3ee757f238a61416746f82b53a08ed37e3279ddaccc38808e54d0f8edcd75f8bc2c2f5dfae2e473c691df3ee00d6a2bb99c61fb959ee5e9f5475f7a2251b18bf06090a44e8efe8794f6e2a6edfdb2455bebed71d386de7beb31d8e74d02a1b0c8b49c7fa4d737aab68b5129c4e888664d79a34c366b92c339019ff1cb87a333ce6604250ab8c374b23883968e5024882261f5d1dbd258f90aba1bbc20cb7e0922239ced08ab285191c91e43ee286efd1cf9caf39fdb64394fedd0dbe42a5ca2ed29a2d80767e9054e608dae5e3685c7dead1403dd1af5e4dc27a01ec0b41a3516e0b52ad8e439259df1fdb446f2c6a148f5ea8af84b4345ae0dfd20fd3f472123cf7818b33718ac1861df079aa209d7facb5960847568000655de20b4859dc1c3d10fd14c209a9c91c4119f69ebee13979f26ff073ad78ee03b1c48a9308de950a3778d0cb22f998aab5f136b972c78821543e7a1c588bbacd547c03512955d7a32202e132debc2eb1af510add9223ac71271ed25f38a7b3264a09dde51312fc80dfcd83aed9c6c42b8142b6a59162551fa163a45b53a231464ff7bac44d8a89249f4209406a41c9aee1a47552a03f81b2874b98dd1dd83b4d2782b48d01323483dc9992c6b1cee4d28a5e56d45b1f4dad0fb7d88de7309978047263ec495ef529c8b30002d67780160db6e0c2013de6342e2df3ffe3024f48b7ddb2e985630ecf7a87be029e4388e939b9555c99fcff31cd81c4223ea2af341aea2eb988e90f448f0686c0a97b26b33a3c934ca46b3494fdb265bad6aa8d2af2fd2a3f48d6a6dad07ad72dc5c6822706c3126dad9a09de498f2336bd767aede98dc5139db4a295718a10119a00d93b18903e233b55c2a2912302d92fd9b01caba86b7139d84faf9bb6e9ccd7642475f5d2790f43de3b6c109e16b2deeedc575bd08b130dcd57c2339cc0713648ebd75df7d1bc6c7ea7a89d079f187b43b3dbb2265181c79e82e3dcdf978851faf0a286a528f6fbc0b2faa0aeff84f69b3ffca013482b9766299ac5b4d608e1d968edea7a91953efaa5d13a5d2eedf18abe533286d2b421a3e1ba6e8dc36e8b40a3f2cde5d851b1ee01f1a2a58d8873da5864718ec7e3a11c313a3840f2bbcd81a19e875cfefa9af1c7b9226f42204d4e817cbeb4a3ac84408ce75b6bf58947b0bf66b4dd2202c10c10a922a6cc5c9f7f07475910328bf46c4bba35ec43ff2cf13949fb386b23b56d5254b25588456899d1101b87801d632b32c6f71c2119057140594aad1d7f29537b3b7dd083d16edb836716c7ef658873d9680f73cc6c3cb54bac6507f0f8d11e44be2eda7e4d25a6157e1ffb8fe8018a45bde9f5085f5fe74a9ddc069a64709531e611700bbe337c4e0e673e5c80dabd5351098d6c053573f99aef98980f4c97a18639a96af74e55d4c135029ae9f407b9291690624b7b568e11b0847abe6444cb82d7d6f48dc6aeb5cc58cc40cca4c0e416d25a9c969278af3fcd4b07e87b027275b59ad66cdafef3309d433db1d5984cc1599e520b918af336ff22cffd47811d44660c335c90aca98232d81da2a2aa6ff939cb37797565fccde9610c5c4d235c295d4d0f96a950b5803a3094a6e5e0b1e52ca99488fff8a1744516148e5ef9aafa101c7b5e6d2845c1780a629aab2913c39a45ad9592281be886677dff3120bb095f5bc1c422551b1cd120f2987f629aaaa1210581488e5393c857b336bcdf85b8f0201e1931f87db0b1145863d4ffaba10ade6e87db8fce1b093454545f99d867588e0f811f8123836f55fa8945a98e9e47dc45a5b3d64c95f5494a4d70285a7df0287854c90ad9714dc03aad269978f19e11dd925712620e425012438133f08989a65ae0a286048051a6957b691dc5e51527be6d88e2d3627f8e89c562c61c94b97a7750bca706b614fb18e96d5d5690d2d9878395f024f2b1da610109179dbb0ab042a5046ada00637889ee3a071ecf1c9fa183e8b6145b34ddcbe765b8c441d334b2d7056ea6151c3f1d976d832ff196528b3315bace991f93dff3250545eb2799ada32dd44169072dafdb52d945c8e20652bfcac2fb22510c150194e3d39976e2b61cbb071187226f25ecd096e197349d03c6038aca181fcedcd219e0da3f7720b1b7e11124505c686b28c926b51159dba3c10b849df7bbd8f8dde4907cbca265e02a0db39f3121e0289e932d62edcb217b8f0dc205ac60d448d5943a26754a1f7750c40adb89b8281c3082718db70936056004142388f4f9b814c3210021abf41aafef7826149f3b3c3f5b92ef65c28f31cb47949da41cfb2ae702d3511bd42fba1af97f61cee4bac049043f82cf1e8b2b3925cd56f14b8faa741325a4ed3d767bfbec55c335b11eea8f44a0a1ca5539d60fdc3b5c73e3613d21ec382dda41df861ca740ad2f01c133313d86e304043e4be7081d9956d9837d00f04c656ac2ba8a5d3a680b6617d840b0eadf526ce74430f9fb07650cd9b84604c2fb3fb32554c8490778663b1c91f753c0bfa1ef436f97eec4765de1e1bf6b1cd36b39adfca349c7a59a39356e8c6ed0e6a2091ba7992b590d047b0ac18c1f684f9e01e1b96382e8437bc4380b588ec13f67eaa602214b772c57c29c58c3e2de3dc1beea76c04ce3957adc53f91bb626fd61a1471ebc14c33f223b5cc7a39458dca342086632acd27bbcf3250ed85a13ab4e6989afc0a0adc2647a564649927e9482c874ca897cc22d0e09218b32b6d2eb35966d2e02b4067fa528da2c5376f59a9a54467e86d0ed95cf36df2214cc582febdfc888713c13123ee8d6384ab449a61323538a717e823a06180aa380a41d0bfecbe4103c79014df6b99d04955afe98375a8b80c303365137b5861c1a7b56d7b04f2396d773b34e667612ceaaae41b42311837beac591b73f13866e0f4ac056c7555d753705f4f3cf4523875c1594f3e97dfb17af0cf7071a8d9aec965df6abed593625320cd8c30bb8e6e05309870313435bf5db1453307c34e7cdf1a3823a150808f89655504aac6e877281250b217763f03c174e0afe60a8ce29197aeaa0f3e266c02a9aca63a0d24a94eef6f0d3974043b42a082a0f03eea69957e53b593174dc5e68b0ce6fb92443f5199f7b10c2134bed58041bc00e9d8019e4bafcda9d2f94706a33c49096a5a9ab76d3397b36b344a090a4501eaef63342f60f9d9f9c57581b05eb81fb80e9bad6cafe764a500af87e6d46b2be28cb464cbad2b5e8a818c68c6960898c6187c73e7a5795189529fd6058f250802b5d03d8f40e495c679a7c0b72940833006bb0f57894c720d230535fe1eea0dd166a3800e0b08b108d0b571298408320e45d1ad46e0bb4c0c2fec3410f6229ae60822cabf5822134173ebbe01d43711cdd94d1f976d1125caa08b403699a667b7385d429dba9192c7fe1918a66ea71f289a71bd0ce11f5a0ae44d5d77dcea8e61587e2707d22358ba0cf037b5da903b4d6b72a2d952c32d927ae8c859c24a7629537f1e2f5f5dba5044e359d33315b965f0089d4dc2fe33bc7d9a191e0e647facb4ffc68bd41891ef07a797fdecd15f56a7d9bc231db708efb884f276a39b7809517f46731f4fda1bb99d2a1c7e8ac31cbe8b57905044848854ae5c485eab372e6d9c0330541455c6af43909c33be42397244f1395d150dd5fb4df3b5da2db1183b2350990862ae640c919135a7aba364a624268d223f4350f1c9f23e28195970f3259d54808aef945e7a7861ae10434b79b24c712a577bc79ebb3f4ecebdc1f424c20d594b0e20033abe3fb9513ef669cbe2f855537cba7e200ce8bfb01e80fe73a2f81fadc6cc17e7c2e3e34aa4dd21cb8db7728fa811a789a66348dd0e91c670f2471911422e25bcae143247cb57133e7f1ea5e88ac251a02dd6201489170117fc4cababdbdf565fdaa29e37f3471835d1d63109f188daa291bfb67638f977c1f932b503d2a475020284233e6ec1de19e0cfbfe28f96ec468628d3f69d640ef0faa1518448f58d3e47d69c0267fcc9ce16974d283cc3126b055133345c2d53a064e9223a2ed2f9d9f4b02f79a698d9659f3e3ffd95862fcbfe0dfe9e831cd3e6c84c05344f0de61e340ca088be178e61099dd613544bac2410195c4c913c45418c17d965f15a79b7450c80fa599b193fed09731eeebc7b9c5ed3e23859ef2a1731ff95e2964ca07fefc455c69046d3cffc518a9657696684a301957302e4223aede12849f95428f7cb4983eb1cc0113857cc2b13743f098b3d9436ab2431f24b9e6e770d3be2c61c23ea8b39310621df40d358906c7ecf422453a0f2a2fe387f8e8a2b9c70f1de09afcccb47227872fd1894a806f5d9d746914303cf3e44ec5ad6239121d3a2fa4ea729f1dbd6d71863cfc10438914e810759814248f3b986c25ca028d7d2375a426023a9eb723c3a5c74cd13006919af25c0ccc16b83b81a84ca77c7e52f2b667586433d0058353caa96e9a7a88fe192e87eda55cab6b63d005385806a5228d5613f60333d701bc2c470b849757b8288456bcf0bb240a6b7890278c0597e14518ea87324234cecbdc5e923f110341b2b882bbae8fa76b40f6c0e739bb4b932727010fd1557da42715f8ac675bed53ad0fee2394f6508ce212bb277c6dab145dd133f096552f27ebd0ec4a00f92b2cc6e17bf15abaa4462ad0ae9dabd0aed68242577042ef9282bbfb93a3b904c75ed5b8d72c9891829b6dbb7f85da822bac8fd8b04dcce98861672dcf56b1dd7fce72f32c5a90bbb52aac0783ab2baf6c549e87b1cbc536c3f4847fd05e304289078ab441cf0010480bfc1a7a55f325f4339d7c365f286cf59b2d073c413200156d8675efd573b895984d2f61089e712fcc574685746a2440a6133c862b864d030f51238dd8993118ec05887c969cde836c8e7c600d34b2cd867b8348fa60b4204ac52ba08fa0aad244598eceb0723f91cd96f939f9e8e310635d7ef7195bb5f8872e1f8ce28aaa95a86cdd510256320601e905f51448cd0071eae46841d5cee62de3a2a85c4db7102eb008b99cab74b1ca9d362de4d2f924c5b9b58c10b07c3d044a4983b7f154fc473a863a081214c7a4e548b2a8993400364241ba378bf47ea3a56d09aabfcf354bb0a1fb41864700f32ac90d387197a606fd8e73abb03babbf3560eaab714cbd7919f4c90deb992be16c0e4e05e6efaa7882f5609ab5f130374e0040d1a9724cbdc8f16878649e4d7bb613bf1d8bbeca41d4c7e66a188b8df5b1a5895ca482433d0a9558052e509e99951dee01372c8ee6980f8538e8ef5ee823e4902e88ca9acc438221a74bd0bd0fea3d80f3f387f2ee0c5e1ee029b055e2b8a0c33bf7b6c4a113e75da56ea01e5d97ea333a0ee5e1a19f82e7acb18bf5ad4cb5055c61e0d47dd861e3fa56f72513dd99c1bc14f32a32af6b8ff2e46db726027be4632980c7781bb32ce064f5fd295ab6261a63679406ead716325e0ad0e851e321f1fb489e1dcb0236aec39810a550dfe0e95690649d5badabf701cbce1e1db6841a7de7fd7b27aae69731973d8a56a91d576a2cc2e687f25f9d35fcc369aa82517790fb06f77be1a9149d472e5e3fb8197b7e590199b6ad74979a5a9ef6a2f2a6586d3f74e43da3f55affa4e3cafb98f06f5e3200a3ccafe324937bacec4fc6a91c1700f4802d30d8605d810eb5f4cfbae4708c18b719a6154d9d45d3816aa8e4a40d7dc5b2f54588c03fbdb78a7ec128f1e92e4535d361d787f791c314ca21a2fa22f2702b5c5d4edda79722258a97603379e1a34bb20ca71c6ee9065174747c19480e5860099905b3b6bf29042129a1a1122cf46c95c2329dfe396e75685dc49060088e9534036c533bf8093d2da7c86a03aca32734864002f38aa7a6b011a7fd88543679d910a57f5d8827bff858b45290b116b72f86d014036dbfedfaf9685c1051a4adf67f2246782301907471bbd6bf8af7c3833cfeeaf4ffe053ff0b2abfb92867c99067e2905b834464f9299dbb7f94f3235306a9f26a0056aadfcd152ee26a312452f800b1411397fa938266f4f1336f1a2f855d22dae4f74f28efe520433110bd0c23445b4ea07ef376d9d045000a668094a76eef4c9066fb8097871985ce509046abd309b14eb9d07c2d139f787640608c4890b977124177d0fee2d5c995f27d0bc8226af2b276cbe32929b9632fe30f94a6f0f5fc4e134646c405f7514eb14261e841382a56b08790839fde089219e7f90a7faf82e0fca4d5fd355c98a168b0541d260242d020c361e8ad0cb589c2714636404038405109dc25c510df9eb0fc1b852ef3c2f2261a5953c84f69021b1d8540f0bc3612a61a9f9a2aa50782eb765b2dc04b69235ff68cc67a7f28d021045651c81d592cef06b13476feb563137881db25ea5959e8ab5cdb40df4f37307c322bbe7e9303a6b3dce578810f7183713eff9ac5538bbe861b8b43c1f5b23b201bfebd1ad9feb0619fa128eb5a146eafed14f40d2e6419207bb727814938cb8ff10a93b3aad883459111be50174bd0bed4e6c58de16c6afccb5bb2278c7b53443ce7d660efdd922df536a69f49bb540539664ce0c05613951606881cc8e40e33f386c00f5b38d5ee24b87f766724421c5353ae7b6dcb5d3c8faa58b9200b5fea8009fa1206e82881e290aecdb8a3ed42d7e78048450d5fe6b322cf97af05f42f244ac1bc1c65bbb212594f0d6e5e9d67228ede8cb4391a5568c59bbd56aee8416e1625d86da6324933a276aaf032626b11e67ed7e58840b202783ba612293e417b50fa88b76f26648b606235bbc591cda282040953261883abd9a20d7096bb01ab3500f2050a882104dcf97fa10830118a37af6c07c75ca55c50c962bb21f284bbb8aea0aecd5bc40a04312ebf5f2cf7727a26f07565bc20bf38a7c535e7e29bc5668a778bc5d74fe05d4d3f62c28719397a27e75c2a15090df4580eba0820eb3c43ce46073206d7511ead64cc74a61398a96575daee396924472874fe2f1832be05e7bf580f677d6d3dcd2a600fabad5d612664f88dac6f59edda499aa3e990cf96d05de653fdce441e3e15335f4f03bfe222902707c5b0b9227524b309844408cf09aea5776eeedf7dc2455b70562af3451eb116f5cea46e1114eab67142203e93940f137727183f68521bdb546d8e09f951d52652096431d199e09295d1180039898a85cbb45303c2eb0d2b2475ad31d4704144d9f948b5e5610bfc18d92b3b67cd0a22166c6de31350f45e51595a2777c3a9ceeadd72b006851e15af9ea05f53065bdb500e5420e9a183d6514d66909508efcffb72ae0d0ebfe5b3eea6f87cdbda4a0ca9c00e1577af2d9e0a31ac06e2c313d3c79b94374c5304a83cc6ba0f27e12aa0ed8f07c1e472f6bd2ded9921fbf5dfd8294d4b019b2dd4afc642b1bad613042735208a0e4891d2b58a384c46499cf4fa6e497064aec64d324b0484f782238fb4a8f45273e159280e7506b39b533d3f1ab7d118b5ace09460df3cdfb012e12ea83848f68f8b31f08b19a877db79db23181ba0cb8579cc47902504d020961241164e2497e61dd3c7f5d5c890ad23d2b5344c745ab0bc7d2198e20721bb3735e4e64c8fa37b5dd0339edfa9c1069500b69e9b910c899c5adb650130846e30b1f7ff6cb97373516f84646bf4de43f16a8146288c65bae471468671f30cf16885e2f8ca796948e8270cfbc1a39b2c3d637303957b0a87554c0fe84127833ebddef1d5a764609e59bc390c784d1df7ff9558a6ceeed131ae0bdd4417e55804b989c42bc2996d703b8166e52808f9b485dcdde8313fb7515002b51e17224764986ee3e67c62bae2fda5416a438414510a11b7ec20cf6041e165665a79f54520354cc7c06e51420f2679d1ee206e2a5f653c8617f4bb029057e4137bbbc4fecded7c763052ce45ab4f34c476acdc0c9a18a6c5a02e8cafb8c9138006a43891748eddfb498d3850468cfaaa2c9857f35b4426e009f5821cf1bf6899c34d8026ec994e74a05d369d8a0651e61529435c680e7059ab9b5c7329cb3d0b3f2e8676c49192c1e51d13af68409df26f6dc881de11df5db93d3759aa9aae4ebf42a74fa792aaad1dc82c3f05681a6fcd25e82dd446eb2ff82e4ca6728ecdd6d979a2904a39f45a645d6205a14d2ca26ca98abef356cfd1737ac34e9422925d761e6bd1c971eedc89e7bc9c00e29df62bbf837673f2138de4956a789cbe790570cf6385d926784dff6fa7ec93fd44b5d8a87c245e1a3d3d5ac610e6c9a4f57342aaa7b1acbf33138c68b1f53f2f8b59c3ee7643e114755be2e1bb097d28e46e5cff1aa469305eba6b06f16fe5689e389921e82b21790d0f3e85a66a92a987ac58d3d9058cc459c332ad2525191a1dc122df6d073b3dbe269154cb4b12d55a64abf0da3cf58e3fd21a115226fceb66bd562214230422b1f6622548b388bf483f3d738518ef213f803c4aec65ce3ac26f51b53d08374da717a695206ab068955e6c148dbeae0bc7a5a9a4bad20daaa2afe0adb78c73f227d432eec9d68d1e19df6abcffc5f9c3beba50f908ebbcda22633eb1b8e800b299e0fd935d4835daab453d03903ac482c572401ce1df2c1de1e40aa9c4a95a188406807c2257c73303551f5ce56572b29bca3678acd17c412ec76389a7acdba592577d28bacc5534aa6383ed4af1396a4a6febc88f9633958bed26457ad4e6c03d45d14557837303aaa7f536602f8d782045ea847c22cde0680ad76dfbc0d1b7d0eae57aa833236060f81cb0bc0fddc1e42a8c085d54e58aac389291e78e9323e74c90b3d00279c2db37e98d2d133331e372df08720cf3864ddc2626f0bcd67ed650e4ef5142221b22e3d6dac20928f01b2821ab4502c14d08a7546eb11efc91363e12df6a458c4102ca2a8aad52a3cbacee53e33b1d03887f2a6a945117d5de87961aa1af06a31044303392171585f5c13a3c9d8a0a450f00393e310315424c42588faac731b6f0632ff6c55866a0c3f4eae2b137db708ff14bdfa29e24a02cf3c6a02336ac9dc47ff3498b5a0a910f24799280530a0509a3c2a43edb49f38c22fd62dffa8514a2135473fe4fcaa69a0af5db79a2eefe728335e6374c870841a42840d12b66122c191373d1e310e9ca9d889d4a33dd4ddd797fdd174fe485c45d13199afca8f1e9cfba7c3db2b9dea87558ec828f10fb0e015052a2ea607652f52e4fa0e9d022e03edadc07886634b58a3979d9492248deb42b5a078239030d7b2eb1bf0d2d8a8362ac68d3a9910defa4daf44b27dc28546001f018b31e43af60d7293d4f6095777853377a9ee5f6de2db4be641583c394412995ea8a0d730cc2df1401841071fe4184970dd1cfc3cf4d8ce8425e3e905e3f1bfbf965c2dcaadad501b1a5f85683143b39a3e1fbcc2d67fec8c448487864bd1fe61e16d13097de830b532c4be391a1b5cccadeae91bb91c1985fa8a74469d797f1ec7e5bff8f38740e6905a1aebab903ad94ada767575291b4f80a0af291a70ecf7676ea2c744a81fc84f331bc1e2496f1cebdd9485ba3efedd3a4822057efde3741638b9d8fe8689fe0d61e830162e249267dc00bbe9fdf51048562b9b493eaa35ba6f36492787dbd341813d726c4c6d0cf6aeb413943b66ab96eec4a3204fcc785d390457c5427bd6d208e6d6f7773d57598d88765498fa2e29b4ea6b903e5c3f901d95053476c9c2c73e2ebd513696a0e121969fbc9a88f6fe1cf9b4fbf3fac2e25f5dad74fb7363d1704d29b553af14fdd0da2ee28981b05ba0dd5ff0f745c1443633ae2763de1393d80cb8922d4c62a18e211182a63f1fb18004d80c5190536ef0e012a1a4dc6c0f9e1b4f3daf4b828d81048096197bdc5054fb9884ae957bc4fa7d9880dec6a67c62dbb2c8e54d7b66797d21b95db0a4860cd78f2c4294c58de08ef7509e5f5971615c24760a4b05f4e01fee603ad70476150c980ec011280d440213a5772e57e23e16b7924cd6f7ea0ffa32c324740e8bec82dfb3f7bc0c9591c230c0466a4d46312208f2ebae72888131dc41045165e551f0257f50cb58e78ee88b6dc760f18766c44f506426a557db554d083b4ba690fc721112d763c5060f4ce67e83d79cf6b807baec0dd03675664996f06341431845d9487ce25cc5f6ee0dc7cc1b877d231b500542c8049194475b4f251feed4b931681ed08a2110e0c8a84524c97a15d05b26338b98a07fbc2477d0c639161ba3f3d006aa8f6098d8aaece65268b45695e95edc182b2bf48a3f7f3a290c13e7bad8388f5552476b3df3ae9dc90c122e51aec5325d82f21cb6ab1fb465b18db5d7b613c443287d0a698ef906f9d34820a6711ceb97a8cdaf1819698c042b1f15e3cface713045663b291ad2fab56badae7a279bc8326434915231e5ccb8c857b5c9951cb5554a897c01807a3820734c74f3e153cb1d0cb4d67c19400a0f703bcf69fb31532fcdda35040c230f511db47b3f6876e94a8ebf872366cc6a644e937c362ce37b10359b5bbb1fcaf1edf8f4e1db7db0b16dce99431fcad326645f3fe1e1cd1cadcc8a865fcffc2254a348afbae9e6f44b5f3d90dbf801dd019b5d36ce837f0d8641b976191000588fdf7e60e890e4706f189216afbc677b4476015a9e5101de4416ee4d02aa182030ebb423990dd9ee90073e8dc0f2b1d7614b4e68b0f66c59abd347d0fc6ce53fb8f3e8d3af0ba71e240f627ac13b01bc29ca65ec85148c594f0e608389aee8db6501147785b07efdb78612bd9c9fa3ca4d507e32531935a40bd9e9ab44a6dd3842f63d9d56e302b974ea9ea540833cc19aaa23244f63d80818b69f1740146215a1e0ad37cc80b6c83ca46aa7a556644dcbecd9a43bc339e5a08738743e94ea24c4721ff08ed185eeb3104be52d91c43c2b2dcde8eed013c44ce6d33e36b25a4cb1d1e845e0086d009ce74d4eddf0f709ce66b6cdd4a53402d2e433bbbd7958f85c222c70f539d13c40525e6e1bf1f43dd6a501c85846de54a887d97f20e7850eed782bf80c8fece80a4d28a8a7c3866d799af3c1228c4be797c3d92e7b2c982978bd17364980bca342cc38b336c1088d1824d26c14a97a7ca2db48f2083ba2e8b4e94d3f77646bbd867959b50650e4d1f0d5d7db20e61739e35fd44bd30a6709f6c8c0ac14539f604bc75d8ceb1eb798f0a31d3df26213dcaa11077a1a23d833154c79bee64af36d0602d476efe5fb1fbbb89491e96c4840090a2ce4d3546ef2a651ff10132ca8809565bdc3243f9e0567b8c965620bee192a48b5d10140f8b7ff6c692a9f28344113971cbf582d613be74304479e36c529c21929f25b4a83e444c52953ec8b2ea0e9eb4d97a7623f4320899501c06869582c49a9b4f228a21a096324f914985948b0c1261caddebd6dc4458a22ceca58f0da9fcee03611aaf85611ba17414b08e4013eaa203eb2c932463c13f07aaca4725c00b422adaad3a60cbe1f9fc9112e7fc2746b9b0bdc31b371937b04828de35eb36c0e142c471215a0d1a544701d7d2418ac807c25735bb5fcdc4d8ceb32e41f63f3d9b394a2664115dd8d163bec1aa4c75f0b2f2544bba41f11a20b40927113f7a81fa48a3e0b2beac5c60da28864be6958539f3048e9b80a50fd687d944225d77bbf1a26492a8e22f356aa2bb3cbbdb797a46def6f814aa16a9409aad0d9bfb100962514bd7e68eaa142528cc7c7500f2e5cd50f40be8ac1ba7e186c37d5a8e5479b185320764e95f8ec1a2ecefb37de23cb014675cd49d467b8a252dab6548f3d23f2e04380e72e3fabe7be2b785b9c35febad4fa396305a123968113bfba97da6c8a6ee6a742573d1ea0d283a22ebd4904a8ddaa657d4a7ce0a47744b8c614a48aed722ed23b848f475a04886861dda79cbfad6393359052d778667ba12a2da1d98bf367765e3966f783e85b22d78fade4aa22241bf88d0cfae304b23584365de036314b473116af23e8b7a1d42a24bb13427d9bed4046aca89c7330e41a6c2af022cce0f0b9d6cca1022b5cac710ca2e71315fd52829ca3ea8b26c866b981ec8c0497d1e817cdfed82067e33b1ebdbfeea7b0cc7021808af13e137e9a2f55af9640e3948c3480614282d2e5c6d786b674cc801ae95d094a98a15d700172e2211334808998a1d9338ce623dc16e248b623345785279bc5b376824b75c08eef22091a7ff5aeff415ed0d6c9ca08688af95e13eeaaed2233a78ef3c1c804299f72af9f0d0201390dfa3f6b1f18f5ed67f45de36348240f10a52841d5865c7c95d5a9ff7521fbc0accd358c675930a51309e63f680252c33c172cee1643771d7cb736fbc24e5c5cb52723020261d7df87d58600276f1dd6545d813b0b1b8884000198d8bf1073c578427c04c727f1748200f561eb5c092c27ddd70cf7bdeb6a943d9c71196d0cb81a5d91a36a1e8d40646415ff9130198cf401ac3efdfa06094ada3afe9ae9fb1eee364ea99f9e4362540a18fadf70415f2068176e88cbbe378bfda002be1af46c6f4d71ab2663fc33fa9f54556877f6d9363cfa81888cb4490a9243baaa5bbb0b860aa03826283517ccfac5e8290cd5925c4577ba61f8232418b526b2e4f85030f2b4af82079225376c0600cf11f5c1a442ebc8da83d61b14118792811b4d20c8181f84174d8c5c6d87a0a529366b8cf91380d60a4a93db1ec14ac688b011b34560b4cf15402479834b020b34197eec11c352e19c20317b33ae196f419bedf58199595dde53765e8645028b6496956bff783f72160f473ce156ccf8d61a851f2d1b82ce904f83835d1166d4ad97ad694f3a2ec4f48f17733182f34c4064b0c8f631ec996e803ce86aeddd29924096905e0566db0895894db84e04bafeba72d0a498497a2e151ecbdbf6a33a462c06f26bdacf0b944a5a090362180ca37672e40767bf3d87d2a31e91cfdfef6634c281bd71f223e4166ac39327dd5cf196ee7e4044d705cb2339bd778ab1da0aabb3f16b8910e7c222ceb3f1105689de327d07799d2dfa029d283da17398bc872a1188c53ac5eb8dd303b70d66a01aee73e0842a9999c3e93f9c50c422a48ad3a8f03201579ef61f6888613a10583f300bf54827c2fe4ee968faf8690d71cd135c9a389486cd2e6189debe2e46e074484fdf8be9934c1f9f23ecc32289687886044e1b8fb09018a2631442a945c4170d6f69fdecf320a8790a90b6235549e68cc6113e6690609db9f5c1bbc8593084c5352cfe72eef8336aa633f2558397abf2980723b5a37cf9cfef64b7739d7eac45c0f76d666439c3f1cc352757d74ed8e817161e0bbf78ba9df3ac968790d5335ecae7d4f117c71ea5cfacd468bd36178206ff8e0ab572700e1cbab84aabbd89c2b0bdc28274a2f78619c4dcb85b3e6108421b3a3650aea45a501394f537de252007f257a4952196e4046f3195193556b639428da1f4af0c63404f1d3ba5866240c843920b6a2fbcadffd2ba27ecda62feb1f7208212df5eabc41d1eaa4af39c5679899238053e35757b08fc236bd16776cf8fdc8aa548aab93c27848239f2d1598f16173a3c96b1f46e969c6d9cbdcd81ea58fca6e39fae3ccd15d913963b0930e5085fbdd92e8014c9caaaa2dcaf9210264376f4c725cc8bc9d4d64e643c8b0537b9e2903445a24938d7d0d8605f65dc1653ba9baf3f2af91e63cb8c44db6c2f5bd99bfd2d9ad98da03ba61cdede44001d1d402cc89717583edb40cac00a248cd8275a990aa3e4de01119bef59a593bdcc34903d8ae620ead7327570ba5f80539d45c93fd0a0b64af7fdec99f618657b90a83113a54c20b3f1f9a9a5aecc3767c995e73b2f4e386fe54169ba38894f6ef4b9cd4e583be351d5593c7689733aa7b0f1565e149cdc26c178ec7320cfea31a4c7a9af1b9063961d9c095548557fd186a52347d0d948e83db1d9457ba07e412a56e784b274311c1ee3b1037e35037da9d1af308434c9d3db10879fa6b2215e7f5320e2a79b84a8d4000ffd14e943c8408414fa36503f603522fb1bb91d4206b2b68e057f25771411d6952f9abe2997819543966d5d3983f2d6f463f9506ae01352bae193e37bb35b61c2871775c11d5535d80913ea2b6e913231963851a16cb3f0db4dc99875d9183718e9d00fcaa1971a519dcb195651b4626b600c46eb52dd0e28c42d78c9ae9d73ee202427bbb864c7431e24b9b08c8ffec74d264a010865bb433a149fb030f0d49ab543f0e63c756bda08e3de840a382a2796ab52549f8fdd1103589d48c9e12a744e546fedb5a2987952027a4746d88fb4110242faaf86c2604f415ce456131020a0714e1f97f77186cd782e09a9636e44524cdcba7b3cc3c148ba34c114456eb2acf88b4533af2f6b14d52b48ecd25a82e25ca3f5f8cf7c263329cc3cfc6baa47aaa838e58d0ab1938fbaff30ccac6049ee4561de7f6e161907fc28681ed01a21828561ff75e54090ca3fd2725cff1ab8ade691c8c80303514277ba6e9362b28b03a2158fded216ccceefc2a45a0a83aa394861f16d50441e8a1eaae103881b73813d2a857aeff9b1fdead84ea050c1547a558e8e62f2a640e9c63c319e6a7bc08f53597bf694e150b29389f1748d6573ec585aa7c2942627055f83497941847bb57fb156bcebabadb03a6cbc0662aafde036cd4f65db2ee300050d88958e53ac6dedaa0e6307dd558a5af9aa12f1163d72ae3fdb1206186dcc1a0bef5f805634481b4a3b574d3c1799e70a0d61e0c1dc89b121e661ae610b8a3b2cd8f48bc099ad9414d02209ba1662eb91d9249104369ec6ccfddf299f3f49b265e8c663172cb8bf78abb50b904980432c90c58713622730587d49de1beb2dc25f1253f2a4d3ebbc71b19e6f4faa9ccf65197891ef3435859a072e02b4f587f3c0edca080e4445bf6409c5f36b832441d9af37df0b9ce7670472969585a965a51d0c1584041cc6e69d9205a8c05fc7e31b07aaff55bdbd74918c7766b4a7d9e001e766d4899773cb0fecaa55b8e8a73435517763401539cbb55f5a4d3e264a10009c99b2be22d160aa313a2e7f22d6fbf0d3ceb061f4939435f38dc921027030173624c9c383439c091826707816b6b3610a2988d94223f971b0a891097cf5436d00419e8888fcfc04cec5d31ffe8f2d51203f247a5ca5da5e5744d148ea415238429076331e9994ae3101ba183034119f2d0f6f0f91b178cdd33d3074c660c04dd78d39cae9b1316a2275bbd1d27c38bc08df054bfbc1e7755c59c80446257255f98f624be04ce494f0f8d9b7eb384897592c786f19542ea6708b107b88ed19b9d6eeb75d427eb1b7fade13e223e623d599fe80fedfdd65957d5e86550e72c2648cd0560226b7302ca35eea8cf65f16bfc4ac31a88e40d72ee6af7302b68cbca47dc6c4f8a58e9f7611fa4f21a545f55452d3e2ffd4bacf1c3b5f790be0f672e0b90f363df84849af42143d81ff062f6a0e33fb59c9d778a55fad88f1e51ec4bd3373a955d95f6fd04df271819973437395057f47c7bc61c73098a2546911f650a8081c698b6f366e3d8058cd9b50cf04f186089ed1de656b0bd5da6ec402775e9d959f8004c41982de6542aa27a47658def9602f977d0726243bd750742bd27d83d85c628e0c750e7e4e685a3747528996956f1b4b8a996bbec81d9dfd5637b4bc5394cdb6b598bb6533266fe32f9b835327533314af6c7452bd782ff7c21640bbe240ce1543e52843cca719204489ee81602501ec5a8af7ca889713acec8deb02d8553bce9a6e57ed7918aa905175fc440a0b0b590aca3b824b1326d910f30ee90eb3f9a4136f8941b13a7719147300e458b6ff17ae370694f3662fb017c5dc46f0fbb11bf5b93072cc263aa142f7629560a6b42d91573cc9b751360ea20929d5db278165888018554a85d6544ab953fc3b976a5a61f5d261c021a6201b17fdc4f9c54b73c7f582af532403f4cdd210608e3a2f3d78d11be43528d53b81a95ecbef29154fa6bbe8f1d8658a33cda5f248fb5d3412ece32128ee48850fa7603e0eb778c3c28d4f7d6b3257319763d3c6f276b145703c082522647c88f0f789ac64f10c3572a9ffb16b148ed7ef5ac24320aa1db62c76c9194ae016a41586bd4bd40eb098a968408a145489839bf20b2d061464409af015794d5031926254463e82bc3004e86ec0fb20d853929b5fbdac89d9468cdad473c938a84df1024182fcbf3cc2464cfd96c394f121a41ec5bb354c068ef804b19103ca166fec70589f9b83eab3f691be90d5fa20d97917788a804227902a2cb71e79c61e9c1df2832b5d2e93ca08e2cea34459192bf7d926e23046272a79e698c7cba4eeaf26c53bce233fd4b0a5716f718ddbcbd9dbaa8c906e7e0f2a5af2c1fd412a0c9cbd52cb961a82d018e7883b905d53b2e91fd1eb7acd7d6c8df9381e64f06219cdbf68e9b2b31d0dadf0f8d80b8625c68c02c78339a4d59bb8fcbb8b5cd88a86d1762ad998e04220a72436569d513afeb21a676032f06648260e5ae287176206f01a3fdbc94be20e9c3dac2649a07fb9142d66e3b4117857bb13e60b89fa6a2646080fd63d42b83a12c2cc2c7d7a42cab1a384d006672e217482b10bfa259884cd86ce9feb9a841c041c92428d83bd436e5c63c4da29a161d825e7749e6bd594f547099ae179ca106283222f7a8a182f38b525c221785d6ac6d4c4473ccadc891f66ef65dd7ee67056531cd17b431fc15c3cd622c6e15e5e38b0a23e8c0c41f2ee783b452783d6e65d41a247400083a3443fbc3bd7b5d36fd387dd2f3e1d1b14b56d2beb290cf026b0df14a9f02929834aa34d33169ebdcd2170d12f8a9636217fa58528502aaf0e70c480df85daad6634b12d883274aef929c09a5b32c38ed9c16b782ac216fade2ff6285912f6f26fd8470962007cd92c7ea2b1caa5397246d6a326c6c769d80e2a1d4df4f3214d32be3867b3a408c396721d89fcbb0b1487eeac7f87bbbd2e0a05202a37520362e51034f25caa1aea5959c31ed2f832715862b3f586399577f2d53a4e39cacaf1a681e6e96013ce4d6856f6cb0a2f736cfe6261b63d328e501fb09c48541a118f6cc5a13c05fd1694becc577e096041d0bb6883246603ac40b88b7f2881b4d800bbac5fc97a1509da68e165461245d817c1bcd0d1d563ca9148445934407941002b1b415c2659a2b24b8dfe608450b193d99951139d93df3148c4203f8297c9700236a8ca8ef2567b4f99e616c0177840043964c310083c0075e501ebfd3489954fa419bd558a49e86d78ef60cb24cd3f008acde4d004c744457eaf1374b43b1a3d9979718dfb0206f15d36a077ba25a01a93028d75952060789e803776954c1af2bdd3602cd73dd91190fff185aa400d16167b2334911978830e3280b16640362c615212b974e288d23ff8f0b4e8bf437659e9f90449af71c32f592cc497cce91113c5af404269013a2693a19b566eb9ef0a5d148798f7d5955557e8848647614a4b2ba2f3dce668a8a94d1444e8bae7b6c223f3b4861cac4d68a3c39ac026e5f5d9bda219caa828c9edbeb4028fceb3c01adbf7f7da54881534505f5b2983f649fbcd3feca5f683b875e46210d26923aea6ae4048b8bc383c70409e03160a429483ce96b592400a96764008a75f0333cf3e77dcf92f712bc45c471049bfa7928ffc4a08f41395871a8191ed2c2db3114dc072666788ca0dd4ce4ce2ee756ca9aeb70abaa4f030f304fa6b71052e83bf606a65d2f04288f37ea2c70daefa76e6fca68489c1f7eef83da5eb9a30000ebabdddd7417faf37dc3af66f56c627f4fa5f0c616befc736c58c36d9b47abaca0b9eb7cd93b70f0777961c2e0d63890b24a0bc4d2d0040e1465662f70a3d147a0d7f0d3144ccc61f6d3bf01aef8c041978055ecc68a37334f33a18d74c8a0b65464beaf82a541fc43fa6770928744b33ad175f691a84b8a7791e0ebb0b7b327afc61aed3786b206f6a2e6151f73ec1a2b5d477a2fea179ac9167e8e23b430bc24548d6947c5ba7c1003f70ae097530bf7fe84f42993c9a5660c6a9ad0f79c72384594edae74e78482fb378ad669bffb72865cdb3ee1d180c8039098c75f5bbebbbb1347a6e7c92f45dd548e45e8c1d3b88064e935bf279b91eef8c6fb15973eead081aeb920f25c026d424ee1834a6cd55ce69ca98acd7eacae931462e5f3125a9136c5a10eb7e3ab1c83cc66ae3dadaa4c41d8f0e103cde01b16214fb7ae235dc8cf3aaa093f0b178ecc695cdbd369557623cb1b470e82abb442a1f07f1d97078c9832264b1e83777305f084ef086d0b06f42f407a461d963bc31321d456a8d2f98ce93adb3041b3c6cbe450ae8906c1b96c1c03a710692f07c255dee9f6f0858c433ce8aa14ca46183ecf36e39d0e92cd9ee001947c5fb4f1c04bf76c12eb5f0e7765a43ad1117e79634a77d403d431634d47d42706d9b9f982d4570c18aa42834e55d9d0dc4e1e088446e5d6c64ee310f9fa93b5aacb087339ca682d6f0a9e99a64befe09e563a7e4834ffc4e5d49487da4bf59b1babe9896bd4af0cde66799cacf7a3d8adbb69b9748d58efe2d07478e6b05b36e495f4c8241482a98024ef1cc82cbe60b4d1858debdaaa98930277a9d2b59546029cc59ffe42ec3b2388f920ad8e51d8b000150e9721de0df8b0ccd1f6983eca5d1a57e246b1f5a4b85586bd78e5620092b5169a400f6634eadddd0e434e8b0c48a1ae3cb35818305cb1d7fed0718921190d3462c018cececa5fc1e093e8a78650d6e4c152a017509d7d430fa9ffcf2662ec4ee20b49f4077064c97af03fe78ff0903963f8cf3c5dbd05dad5fc3ea70466df7992eafaf4957365cec0c4999bbfeda53d306b5abd9159691b718876d13fa68a11054935e7ae15e96c152118e8ec72fb12d0b11515ea2e2422a588e385a960cf52e676b93c69173f801ad116312e415fa67083a9c1a853d96414ae03ad4581afe16b469517db9ec7d347e5b70d41ea5f26d829ddd91f791a0e0d94d5323d686bdb4c8bb9eedecab464fa08d97ec9b564dbdb4267f3354535f2dac4f70b36e02af5d5c5b1669a7583a62b542c5ebbb39cdde534bce0baaf26d83c7e33d07007ddf75f4aca01d20ddd3e03969485822c5822e40749b37b10c1000e4cbf47cedd5565c10f74aa136e82f4a6cf157c7dd374f018f47452014f136c9217b55a207814bdac9767856ad5fce38019b3c6d3bfa4e243cf2e4dbad5fc1d3d63a7cc5611f0753187f59b60e5fe506ef5d4fefd9671d5983a3b66ddf1fc4fedc907d897ff990150c03c561c2d8f2750c04f06fb2ca94fae0c4032e6763f6b8eadeb542452cd1de3bd4f1f6dbb92c4d2ebab794fa7305635ddd292224315577516dbccf7480668dd38f67c6cf87621304b31ac4bccc8352c397f86b7e72a0c58e99795d87174f930a3fc0e8fa3156b978c561d760974891de10bda31d85299f9021c27b0304a276ae257aa87169341a9ebc09c157c77f0a27ecf2b1e486a4a311adb7da86d4f1a67964ba6d53a98f6552577a1e9104c6ff74168ae0fb2a24a21ea086f7a3a15c4a164a432d97f2b77d2f612a29145d7eedb6319d71df2eb59735b4a550ba76d461df5b2419875ad79a7f7672d1f1828986dd0f1ed785f1a99c1e07182288ccbc9359e004e282e63d9bc9a728adf32edbdebc9053b6a0cc9158da35508113e897ae7fad9c2990cab70916d971fcc2d2bed9f5a895b30551b959713a7e9375c83aa40e6bf923768fd669c38e3ab6005970e2e6c454c2b08694e8a4f732e944d85dc6117e8015107723fb6885d136c1596ecc22a0bb098c7c57d9d3dd44d13affab6f3d7393cfa2d358540b6c7038a7eea5c4e88825f0a91da79c806393b5d04562c965a4f23396ffa2a3c17672450fa66e9b26e1305cf95e078560402adbb531b2ad0203fc4b5b55358725bdebd0f48c44dca236d69ca7ddacb51d8c23953e017b9a6e9a6ec7eda882bbf101a50f7cea7ac8d3bb002ad8c4f0b574982953cd6ca40236db11cb0029838fa8fdd6bba7d4df3538328ebb41ee79576770a82cbed4d426ce844af421b7aff780b0518df74ddfc7b6fb9733af0d581968d337224aaeb449fc28f5d861b3aa068a6c28a5b12e9e98029a3154a58bed35ced1f06eb89e6d0ab82e2d6928be62237ac7b5c6c94824b80ff220852557760b9f751ee47373a562271a187037a4c02781d95b8ba5c04ff6a2d93c0e6f9620536d93015861d065a62b2d584e3526757c8ae500f73686fbfd9106757cc5d994741e589be443a9f11a4eb14af26559e929aa0e0dad0cd0d22557217e9672dc6d0accf0b6c732721579ccc643c7c16c2fd57310966dde8e59582834df3a262d86bd5399dd24554e1072709b59f6ec47e6729039df01527f7b20cf1d6f8f640b07ccbc30471d5210da7849930ac525c8a530adb814112225cf4490ff2194c4ab856d28896a0d5290e39a12892208286031c853084ac990203729776ce7ff5c6a767a634ae2145cfd874601d81d1a145769784b429392510972378a7d062228e90717f856b23e7961ae9af0b4d860c4f48eef4b40d747a13a70df82c4741ef65b0b924b275817223951adae69593c075a9759cf823b6112233a1081cd84c864dc94f04144151413609bb58d293eb26d284759e146ebc26d90b35ebb55fd21b176262965f3765ec850386c7bae03221de872a7eb9af3d3773fa8b6a62b018d43e9100b9d7b0406a3e086cd0544c51c91884e0ab89cdf13dda7e92769a5cdce167fe350e3c4886a74cb815847589c97ff48490bf2cdae9acaec1cd4c8fcf2bc0a1430861f8182672b4772a0316ec812d123f836321c270a01e20b5439acc5e2cc2072fa5910b2bdfa0d746569a1aaf436fefa2dff7252915e1c6467200c20f94981c533d6931658a0b6cb56b503101c7b77a612ca3a301d3160025984bf20fe88b10eabfeb4a1149f1c394c2a38d617fc4e4df76a0becc0a8a7cb80cd7be5d4d343f5226f40605e30de41a0ab2c1ef59221543abac4a6dc13945c4ed9e4853e36771ef6d36a074c4e68204dcb59d97e6ed5bb768ac934ac390c553102a867955d185a487f40092cb0cd36b64d485d0862e3738d6268f526286d6f5b751f16fb7491ef6262dd34e26e35a141f7256371714dd026fa7a188b521dd4617b0716fd020107fd0b32d21baad8c6546295c705f46f1ad1985b5859bac1d017be5630e2dc3b193dfb5b225d39baf384f63b32944bdef948354dd520cea4d0033a8ff6825a3054b24a0705db47df663772432a11b8be023670375bb4ec2607ff5153b7653b08f9c0f47e237677707e744839d433008421a3d775ba9ae19cf8564621bf74fefbf143c6af7c2857c6ca81f5979434114bf6265bee2da54c2905ea070f082008dcb43f4a828282825eda77bc2395047a7f2c92fe256ea4753fa0d2deae2b065340e0b37f9335ad7658d0b7148b1111111112444f4ffe4a3c3e18423885ab2c5b118493bd2e9f82de6e053c44a02d7f8dbbc0bf5da4c4bbe800403023c7db8bceca0c4a72e85fe2a41f8768972879ff9af3212a0e42d80bfb837280fe80047b9ba81b824611a020a8a8031eb032446425034f10421e9ca3ff05d6d1b2e2207fc9b42f708e9e800f812ff0d743a095d07adde11cdd92564e18b42e58d815f4520b8736ae39823eb4e91fe20f1fd6567c4e7611b0bdde1d2fe8fd772dde070d15b4c7e608caef5c4bfefd22a8bf8cefb05ed75bfa79416f67a10e3b71d2d4cf356f29104cd8ebb24550fe1b17b3fce3671616f4bec727961f861863d73b9d9f6df8ad74c0c976bdf48ba8b2f58e1afcc53d770fdd43cd4305178d6fd57f7bc82606b46fe7f008371d69a5de81df4850677b98e4b5752f7bceeb97c71f2ce441729ebf76d8b3da43a8fa73c4d0a6fe4031947478a2e8c5d5091b064e4c79f1eba8bd7f6bcb79fc8229ff6dd278eae82d46a9f754917ea5ea8f055e5ceda156f21a09dac047794da4d960c43f9b21e89d99070505d9fe5a5bf165658a8402c2c635978502dabf5d19ee2fcc953ce65fcc32ca85ab3bbd0365736a4c80d6c0304789310f09b51ddcf3bb70cef66e51de04a6457d3763609d027003d8010ff020c03afcd38c607df3b8bfcb48b0fe3d4bb0fdddce001763f0ef699b14902c05c4019cc3ff863e23726b9ae69a06512d31c8136d8b43b49cc31f7a0ef01ed03adc89c7782ac3faf728c1fafb192f38c239aea06c2f5f31e20248bd7f02e263d2331aa2afd4c75aa711bdd36e9e4dd14ef23b72ed2437bb35d7b4537b6e630ad676ba108b51f6108be7c49759855ef41838a0fde44b48f616a322ddb0a9c20a9dba0745b67f93c18256a0759873681ece44f784f660fbb93b49eff8b763795c897f8c143f08e60075b0ff6d4e14a55ad7cdff6c6707ce4969d7fd27359085dd485e633507e7a93b364794ffee1449975f50f6d78ed661b6691e91091abcc0fa734b01e14e08a8e4719517feb9937fae5239c5e840afca49f5a472823afdc2a26a52e2bf2407cb3b3cbc23eab0fe0eb1f01d88e5b0848773f813c52cfb2bfbd9c597d51d68a31ac33f27a8eaa9aa6c8e9c6cd074b2b1a6a0dcf00710427c00094c097677379445b24822e15df6fe30c2ff5c1dad42a5948e02a340ecd54922e0d0520cc92499fe25539d5d88218410106b01edeeeef9f135eb8f055e59cfefbf9352946651100d21840e5148fef55b59046da0d08b4a2ab27d5149513c87882fecb5b1fc2efdd4e3df3c5503f69ad0a651492827fa518d9a816d1416b65151d81b781c831042c8d9c75786414f12f97735cb14b5a0e2024888412446509185728947ce73803826e84531d925ac0ac5ba18a5c79e938acf29d4927ffe4b1c51281453929014982816c62cab37661f3dd9c546312d598f30455908b86feed9bb016e28e68862140a857a768f3ecd23d60e6a1df2e5d7c03bbaf6053887fc22a8129cf327704b51b5bc3f053867cabf37f63213eae533c07322f7f2952cc981fe7702e7c87f56bdff526f27f3abda4d19da2265fd6e299c437eb601dadf4874942e6a22fc9344fec9a04dabf7a695e04fbe94b2a5acbaa0d58b7f68d3d4a78664e36f2c14d06e6e4e4abbee9f5ddc75c503daf274e3710114154ddaf554d23c60854b38f08e59e10b3807e431816927f3f08e9455026de2cf49a9d3524b8136f1bb68165da9c15f704956a197952ceb68fd9d167406d16a44d06de401dbc4ff628641c9e8333ec6b9b578fef2cc09ed596982287ce701ebf0f41761d8d864d8d867d8e81ab091e86310b489af8a43363e0fd4814b5cbd5fbdeff25abd34ae2875e93aaa824b314583bf5a2a5ced002ec139299dff4410ab5d4cd58736fd1a1206a4b98a8930947400832f20f49630e86575345fe33972015de303b465bfcc96c0ee07e05824fdee2750ea2859fe79167a69acff77f33896b2d03cd8462f0241ef8e0d33a8fbfb478129f9605230350d1964b13e7c66c93108027a996927a2200b174e4a635879bad214a5194c4c4c994fe64d1f2626261fa659fd358305bdccd4a484f1bc6059a704bdccb49345489a21c7b03bd9ec8114f6361759b8c87a7c4cbae3c2c32f3b343ea218c6c5c5a878443806c531275628429d8959c176342c3034404242a2c111520b982082a09ed7c9f0405f86871946777710b6d07d487c201bfda5f38f25cecdcddcdecc5eb71f1bad432086ccccdcecad85184862141121c9b2155484ecedac600111ac944dc535307e567a17009653034059599973448eeb547cfeb197fd8b9d6d222c59b682ca12f676565081623b25e49d05d962b181d885b333ce38e30c32503c04d8ed0e218c319b130950d334140a6e1be4b8540ab6b4b4a838160a28bf8a9952e63761089419ce15c73a01bdf485c58281898189898961bdac62625c684c4c8c2aa6251513131359485b1614a5e4df57e336ef3616d6f78f65028ac2c25531034cc71871e0f5628c9139c6185d359c83dffdc63f7e97363a9452ca683715333333b3ea6b01c96c738e8e314615d10c9ea3c528bffee919172363514618b19a33e819184be93cbcbd75c018638cd373a037ec183fff387e9412d6e61cfc30c608b599a1fc85878d99390b22033366514e2cca89952023029b130342c689e170314a4c935262d98c583681c02216b3c9a136c9799b27a59435462c9b40486c4623603a304c7e635a368198126b8c75cc1c62c42adc388e9318101926e78c98d49e358919095eb4332c248ec8e527072227dc0dd1f739f19ccb4f445c0dd1ffccf3780e5067a61e99a1d1a271e1a1f15a3466bc6de52939b20ab2aa4afceb57b2fadbd6a52e591d6949b57cea88921c88f889c32172b95c56cfe33cf1a5ae38720e21a8e7cad92b293d1105e95ecb38abdd790dc56da2d28e8c735b38e4e16125cb4e3c3c667ca0554fd456f6fc82f9c94e58f88911432e344a2e9c17b3fa17e9acc8aaad21ac871f845565bdecb27ae9ad56d5a889701b2fda1817241f906039a54d70615fb01cc5142c56cada5178b044cd2f4103bbce28e679bca3409d98da439f0dd0a67fc6eb3c8636f465bc188fe3901734b613ff1a8ae72889df501af5a8687b886b47d18240dfdeee28a91ba427dd0c5be2f338e596f792dc481c21dac35a8f70f7bb692fb5d96fa821069080de1d9b7db4d9efc0c0d3e339b07f06180f06b7e9cfbc9d2476b08ac5c59129d5d4d4949404b7094018247a1115bdfb631d95fdb459c5e0637709dc6acb9b07328c200621c61c638c1063e6c720e418636494fcf61cedeb16638ccf317be8ddc0db0d4ee6c51afffa012888b3c3137e1623168ba15ef36e60787d2c5f1f8b243e6fbc39775df546ad625572bdcda0888503fad65dfdb15df421ffc631ba47c3a05dc4d5087b974bba1cca7a69ec1e208679fc9a50076b229b1c11911fbf49f6180dd9638f80ac2240567e816184114b19fcd8ec5cf371fd1f7c08f6d1596e433525bc91104b1b8d149137ec3120fcd8736a083fc6740cda365bf2da43c29af641e26b15f24b6614ea59ae837acfa2a5dd2be1d9091cf36b1d9d31532bf9c09bd67163fdb3383e37cd63851654b0fe2fbd94951565af4b461f8636523e565bd8f38b88b7b09f16ab3e3aa072ca28f2b367067a4dec77007a45a0170dd8674f04fb0cab2d7f7e11892fb9d2cedd7b6084113f4744b08fff03bfc59811464001049f8884f063fdf901da82860acd5eb228b54a9799dc486695c7efdb08211483b68545b8823dfcec61c46084f083b085b58532e8120923e47137d2bec675b4c7711b862eb519c44a63f483202236deb60de573c5470f6adb1ec5281464a51b21caa209c0c24e1c9c3efcebfeae97a21e7a28d486fab9cd396f5c1ece4eadb19ad2fba0032c34451a0960a0c9690de916fca8023ab9aef7864543e90e2eed82363ea3431f028b927fada2c276bbbb43c8eaa4840982de2eeb329a396d30d1bba3bd4531336bdbe2b641df7ae398169fb68330fc88a92098edbec33056c69a5a8669528b9aa6691ad434cd5be31b2df7c7a260b9de0658af3448e5d4de13f4528b85bd2a2c2a265629114d1590212588338e58c194162c0d21012b569450e2e8e849cbc9939884436faf0114284de088c287a4269e849468967f9e040f24a10495a7a727aa279e4081e24529dd9dc76d0479a007461856a3521148b060a0b93734d6fde903421f99f5c313257b5dff84c59c083a3641db08bed7047cce311b76090db1804806f6d258a1012f8ea04140545847f0244c45f754c2195c303333f30e5b1104510afcc916421d28a2054cddedccbfc3383b90ddab2803c3300cabb73fcba01081bd34424c54307b059c2491e5a779427a4924d12bb14515d33fb8c30d67f985d000d743938f8062804ea1fd911942c8cccceeeeee0d8fdca9b08e40afcb3a53017f9c60083244a06f2fe53e329112f97f720042b20c34c532d012966be42b3709640ebe64170e4a885e97edc82d88626593e587c942638c310937d9fea682d551ce7184df06ff8e1c6180e68406918512534a29a54060584b09638c5906bd4ab79422ff5450d0db45483c69e26976d3fc204eb43b2f389f3061ef6350508ff28313218a30863bfb00460b7840f4b136f42c843b493ccb11321305614aa177f2e03a587ea944638cb1665ebb0e36fa0b9ac67e478ff8d7bf0283d22a4a4a7352da75fff77327c80311178d615e7d07c7bfe61d7f977f2eff207c6039fa03e59a86426c94ff5d0b2bb33bc0c416533a8aae3b626b3585369307f43920037b5d341860e254d7ae73b271cdece2be0f52385585921e9468ca8190124fdabdfa35221a04189c9214f407ffacf080135814f1c42915eca08517330b91afbec8b2871c7fd0a6c1e8f9daf35824fc4b301b31f7a8957ef9e1f312cc46fef8cb3caf79cca3174924d1594942622e94d6286dceaeab33cec9dc495c368a60835f64847a160e501f1bbb82d2f03dbca3dad881c15df47719a0db738ffd951f01209bfd7571de4346c2efbfb167ec9e7c968f7938444f0991f5d93fa3eda1ce56279d16a54141df527b85ca499a80a94110e505a215866c3ac873d258e7c8afbea0ff326a5a65f8cea9bc7e719a96f5cb3d97c2395c092c20d022ca0c88b0188aa2839cb041d3b4a750c7e53524fedb6b7f59697bff0db3fe26fc409b28487299b7fde646d49f2d5bc144936d2b985822cb539b0104fbed579ebb789e84a464216aa2e69ca8cd3d96d242ffcb3815aa69f7ffb95c522c34523d8fafbea0aeb1266d823a2e05dac09fb35e4abbeefffb9aba4948f519f8d7d17c973229edbaffefd3b4b6ee7d05bd1d16d44fc03b2aefc02c543d161e853b61613702faaaef6883e76c7009666f0480a8a7aa2fb1dfb49fda9c28d407618baa2d9441976076ce979a974d2f5319a93e0146545e67711b2336c06e7a424a27b93071fe8284a1effb503dd07626a6238ae960950474de780eef48559f93521ff81d151df780a6bbf1914cff5161261675ca86545b07f93714c4017a3b08b2240dc309724b97af442af44edb2e970bba9aa0a91ade918a8e7daf058d435e6c6ccf087bec1dc76d6c803d90217d554d073d20c1d22c51a1f38868631edfdcc71ae937e29ffbf867243342848bae4643ef1349404cb05a13e7e847290d807b60a50b638187ec7fb0e003bdae4e0591d9cb0de3b4e72035ac562316ced18f79492411f48c508f425589a8a52b9296e4924c52629e0009a925cb152d59aec0b24c4a29b18c318e55505902972e68abb6fcdb7a75d5a965c1d159450a8296969c509aa6698f7294a679f051ee0ea36f36586d0494fbd45f667271a9dc525d566e1b0e11231ee7b956773e32286a8a45a27d12ae52c5b94e05d1eae52a3e9db2fe33f3ab3dbcd3528b71151b238edbf40699fc7342b946868f7fdd40360a9113a7c02905146ea8efec7d88784edc503cfebd37834f7f136575fe31bfdeeb4e104d0a8a302d8e8e948af0c88f7136047bf941b02a23521124288190ff8d10b47f0042f85d9c5c8440f9790890b69d932c8468810b82faf5d32ff8504021254ee11f0b2792244918897cf83162f026019a62e5774346e2ff598604c3705c17a02e3ac41216ebdf1f9c3c3258d08ea293788792b716d67b06d61b0bebfe8dd4df1040c03a9de4391de43e704e63403312c2fa631fbf1b5623ed8d401dadce7925016ee3463aa993f8b1641b10aa3b3ca09f2589b7512a5553bf6d03807fdb7259c6f50c9bcb45633196c56a3ecf99cf3a3dd026c94df48262373838431afb81f2d49d2c39f52ac0f66bb5dd6209b0f726090e8f4b6d0a4db7ddf0dd89afd78e7fee7ca566095585ec96526a40c90a16206181344af42186c1aff9fc5302bf1f3af18f95601f1fb693fbd98842ef4fd7e1577fb713a32ccb20129443bcea09fafe84885e5672db347e9c854e749f59cea59e776f50ffb992a06ffd074cae65998f7efffefbbef678a6d713047a696834cd997d3c2b882b579248a20c223f40447e8058896b17ade0872656b001248af0218b228490c0d27242dff213e8fc849f501f9ed3b34dd13810e313865d4081a26a273c6003279430c5141f9822c8064edb7391d46fb549935491ed539faa4db8ca28d7849ac4874618c1021e9afa1f766fb75341209c41480b83c2ce8802f8736d7533080cd8fb31651eac6c1164d98a165c587e8c0a5bb95205ab62f93322cbdfa221f5dbb7ba5584fb96e7bee5f91f8a80f26f2d5ecbf7b7d49fa3ae445a5e557f7e80723072e4e94a4f135f61f9ffac9ef55e89c0b83ccc03bd6eab9f3ebf36afd5b545c3f6aa2fd2f2b436a1df426bab5bbe49abb7e7d78a45554f5f3557f5a77b98caaa3f3095d61f55fd992edf54d596bfeaf975bfedf945ff762dcf2f5a5b5e5b34b05ef54558afaa4d8e88b83ccc37593deb8bc0bcea55b589cbc3bcea79dc5b0e61bc96b384625e9286a44449923214a59389812f18d3d0cbdf8e2223a57b1a0ff49a797ec5fceda4fe9f232230bffa9fa39f2322f259cfef527f8e88b834fdaafe1c1159bd4bfde92bf5879f557f7a09ae9656575cbae9f613b6b479adfe976f752d92aaad7ea097f62fb5e5dc6fdf2a2294fdc4de533fb0e46089318e50d4f2474452bf0d31e48f3e046df8f9f9b7bf3eb4459102875e9a5a62ea4f4c4cf52738d4f4d2f244c3c3663cacf36456cfafd55f6f5ab5fcf527cbefe2f22f170ef995d4ff1c1191f96d2886570c118efb54fda93f5df554fd71999a817ec5d42598eb4930b5151fe8c57a7eb16a2b561fa1246cc9afb48af46bfb7e6d9f7a983f22c23a8aff132b11ee61ea0f8c5221eb65e5612e5e1296c4fd8551384e4a93546d11a1aae76aab087d55cb87fb1af855047b0a22084514b11414f4824bd086ff67c85fa9b700f7aadadabea5b67c54dff2fc2d2881f20b5e8136cc908a0f4d64918517a9dac4025c0dda7eab2d1feeb74ff1df30c517054217568a6880a4f2b0160f532a027dcee21f3fc326268aa08dbb70e315cbbf61b1fc920514e5c522ad9b8c7af1eb4622270f3e411be60e7061899c0cc5a11820e9dd164924c1fcf1f8f08fbfc75f67ca283d4ed3a2c73f76d17cd705711c69946864d5bc7f18bf7c97527e3cc21c923df641b229b194ac31226d2008f6329344420c3358a909249070bf61c14a73e36d04a6828a7eba6d1dd503bd34b6bb9fa6bd22812fe3671b9225d2428b3dd6b1675371717f74443f900d8a342df8187bce2cc378f314107f18e78c43304321a64c618085cf3436098d85ab20d07fe95e82084b40bbd7995e4663a5ec1fe8e0387f5f75cf68bef48c685c677eb45d9ff125a1bb04f4d2eec9530f4f2d859a11fd7f7afc27a55df75f91d8047eacb388fc282bbfd8e5fdb473caa315c13b7002cad1e94d6d4b125cb90269a8c01b3f0240329352ce2cbeb366c0412323a2fcf044153720b2d8ef14d91e9cd8d0804b4a293029e89dd66873419d8ddb9e7b22db731bd7590099a4b3fc5f00ec19bb40f6ced7509532f3409477c38f455d0b48ef8608007167e7f74aa048b2c71e49f6465b56b12aa5cef6cd00b7e996105fc2f2fb12966b5a4002dd29b26cf9778a2ca7b8da80840788602f33d1306b3cc0e7ce9a8b11bab6f837b0cef610be12de212d6c1e2c6c1d2c2cc3c26fa4a4c94df64600e86298922343a0ab2bee6d367a5cc51162603995849b96a03d83dbc08fd3665d7bb8a9891291d15276cf496995314a29e394a424154b0c6ece39dfb20eeff86c3f0fef90b63ba8c3d50e8ae2028a6291f827e1261bb3cf9ab37addb969561ab7e9d9ed74bcc4daa19947237e20e205545e80c5bb7dfc33e25fbf435897b83542e43213ec9acfe5443680a0ae7e8c88db348d440289d903755a3ef163fde917ac2da3f8fc820ff4e23e2528f43a68b30115d8ae77c77233931331cc3882cf358c043ea66915071038a8e7f05c02ed6f596a88f6d73f424dc2182be5c25e17f7502061334ab525b3a93d349a791aa567b122a53333301f0120fbf231ab7f59bdc8acbc1799da1a22f32e1f4426e6e5e559efb2f260fec5838199a93facefd5ddbdb773765d7c1bf3219cd104db8de7cccf9995a646861d16e6f7f5c2736665bd0c9f10d7df18dec65de1dbe8c7a3be8d7afcfc9c6b04e451df463e7e62e97954a5d728c8cfdaf92780ef8f01f8fe09c3f7733cbe9fd2f87ed6ccf777ddf7d3c87c3fcf8eeff7f1c2f7f7ec7cff0c3a374584eb4fc0fcd6f1aebf395e85efcfe1e6fb7f5208ca11726108c7490b442b282e512811aa6f9bc7f10d80ff9250a072e3af7f5ff87de3f795df37f531bf3dccf7f715d6f737172fdff784aff9beded7ef5be34df86e3dcdf73fd4f989af199e3f06afc603a2618047792d343cf55605789617e331c906f033de0b99f91584bc904e004202502f4ac86aa6de007c27640521cf5ad54085bc8c016664a84247f3ae9e051b30d4dbf1904166c606958185173aeaeab59105a05e1ecf829015a690b7f19d90aeab97c6cb08e9645ee88847bd46429e05195610f22f030b2bbcd0918d7abb878146bd32cfe3676a9061356560d196a72103ea672a134e061a3346323cab86950c4f6b781b2f74d4522f8d1700aade990fc0731ed72385cb7a5765327bac5ee868478f17eae51ed5a30515d363c7af7aa4f0c2ea5b7cb87a5b1ed5e3270ddc0fd7abf023e66f6e50cfe9cca9c2df542694b25ee80855afeb676592a1e6cedf54267347bd37b3878eeb513d50a8d9a3ee207484123adaa9d7a8c7ebfcb8e9f1295426f42605d4efccd779ce87aa50afeb5ff811337fa8b0fad1522f7dee47dd41e8c855afd18f57c127e6c7b37c5c2abcd0d1aade96df41ebe5fe8577f15c7c54a1a31bc3bdf1382a93e923e6858e725ca8d7654571f8b8512fcfc7f8b8e142ccaf08e052efeaa98f5715c00548153aba39f79b3870eaa5efd2824a85a35e1c8fc2f74247b4de16b2181e85ca64f2d48bc2f481d3c2531f94aa7c50d50b1dc550af918fc70182828fbf0104851b2f74d442bdf47154dfc2bb1020e75d008263027101c8aa5ed6bb0059b9bcd0514ebd4640de0502e000f21f01707c2f741453efea73ea7579171e6648109aca64ce186a6058416258b6a632a1415e31c4542699ad37e65941fec5639259a301c0f454a1a3cb73eb9b5099cc1a1360e4cb4b4dadb7e64da84c684f65d51b33fb3208cdbf2a931944bed0112b088bf51284f5f24247b65ea3206f420f4d90973d26d0bcd051ac97f5f1e5e5c3542699351a0279a635eaa9993d31f8c39e98ca84b37507a1a31898173ae2a9d7a8e763185253afd1d0bf7abe5626d4ee207454535fe8c8eb8d7987f5c208200030f0d8f1c28e4e8e0b382db0e0d5f815bcd6bb3c1d2a7839fa35c3df78353e05aff5383c9bcf0380bf667814bc1a7fc36b7d8d7742f5bc1ff89aa10a1dbd8d5ae3d5a846439ec66b0df9523fe36ddf79dacb78d9f62c4ffb172fdb9e66dfe2a52a7b5bd5eaccaa0cde8f17e2f5f81eefc707f17a3c10ef47a5d086df87d7a332f450567a98163abc600c1bbd0c06435ba0c0420f7e4087a52158f7301fa270f281b5800b9075cf87cddbdd68b6d52cbb588e41358b31c61865c4309cd48f1a4ad0c813e3ac382ef93c3d3d3c3d3e5869869e9e1e1e56e2f1d133396682c2333637f41e706359fbad66fc1de3b7778958cdeb9af9732ac6771cd7e11d1cffe4bf6841ef5f2516c99268e1639b8781edb98df37e78db3e7ad9d69d6dcfe35b56c352fe169f235fb9b1cd59565dfec99d4ecd23c6582265f48ac4b0fd9622c24a3ffec92ef23ed945b1a5605e4be922ffa4fcb1f1b3efa26e29a58f202b7f8631a0482b567e45a2f2251d014c93d70861cb093227a4e9dde406e763a6d7d16d3bf3d8dff03070e351b8617d6ef0380a375eca1bf5c6b717eb8dbef13c7ec38bde12768af51f33b58a7f4e05fbd74c49546cc8806a5f8305f4f690edeeee864150dfd5fbb67b19efb69559612ed818feb9b7743fc6c43b1ad658c5bfc854ff847fcf84b75143be7cc725ce91056542f6626658ffeec690ea9da9d95016e49f67439e6386e7c8bc09bf49ce0bcb1f6b609a28fcad398730b648c89c03fe98a937da99df5a9cf8f6629e6b6ac3c098c53f871d5bfa97784743ec845aebedbcfaf5521bd5847aa7952f8fd5eb96f5f125eb7879d677c598966a50a1d1de2c48e69798bec6df2f32c52558235395b814e439cd1497621536a1e250a386d7f29b7335bcd46f90abe171bf45ae86b7fd26b91a0d21fc1ade752c10d6f0e8b7e7590821ac5148416467fe2d0f6480c590a08e2b411b7fac552fa581c4f225cee156fc2b836257662a66d304bdaee44a50e78355e9abcc36dd03604e1428bd51bbbf5de7652fe3b18d897109877ef170e8958743bc1c53f46e0c825894601196bb447a27c5b6c285fb3b51273518d65b0ceb6574155b4511a678141870ec527721e312d43942b1ba641d0b2a528e743b383054244a7482d36860e31d30b04d3f4b966182f6d0e0f1e13932f50363dad91f2d9441e3bb1e6b810c0c6b1b61c01eabadece77711347e16a3acf746c67e5aa2de53d4bf5db9c2c4b4b4a4a49484c49f046dbab615b677c756b1509a08d7e9172fc19c120d0ad261e9d54e5ac80c1fc3b358fe8ece257ed9c033c5690a51b48201279ef4c5dd3f38b9b87dc0837efe4dfe5c466c803a2da8f0396e52c0f16ef3fe010085f71b5ff327784e7df7deff6dbc7f4bf11c13de6bbcd3bcb7de69bc7f53f19c99f7ee5de6fd7ba9abc0bc7f5be92bcd85e7acdea59b3a4b3bf518dbfbb7199e837ad7dedf8578c764618577e9782cc773c1731951c1cbe125f194a480c3cbe1270805ef86d7355e9fe03594ea7514cf6b22de860935685a3466baa5666a2b5e5f692eb074937fee94f27a0c6e43f910e7f067c1dbe9a93a3c266899bb8a170675282eb31ae9c0a48eea4444bc779cc3351cb857615af2afdf1db5a4bda3965ca825566266ae8426873ca7ed9224b2f2c1803698c2065284c06e90830982b6f881ac1cb2d9cba343a8a4ce95543dead4cc0c000002026314000028100e874402b150342055754d3e14800b8290448056188963491004394c21638c210000000064646066868409027d23458f69591f27f40ca1d3312ec600bc33f46b696987edfb7944f8fbc46b87b44716bbff9a4535be43a298b05dfa7cc9e2ef762c2b2856d3526a41c57c2b317906fe3022a6c78a2079dfc66a2331beab35b203316f30892058c8ebf4977cb95b14233458f3f70b3f03c8366a8182cba45ac80294b56764f6b44bc63ff6662c0d8e0d01589f56924fb535591182517ab4b7fc81e4a45a39657439c5afda979044efd237e5a4bafe611876bcc9096fdd2159d3f5c8ce274287ab490bf4ac172177fa49b6706f8b6e7e5e3a18b909a861679cc541e8c821d48408c52344352a20706bf4124da8e03c07aaa9d284e378026a59393a41bbaa3c32681ccb83b62fa20ea082e08c678c8b6e915fd7e1ec3180d3be7c7995ec41b0b4b240164d655b47e09016a57cb8c3827b04db053cfcde6536b4f1559246215f5685ca811336b9c02a81214a33a9a51783e62a721237a6d7dfe20df7f90ad887dff248f64da00acaf6b18662d36c805ce2e90e99ffee207393dddd3f1b4b4ff463b369ebd4ef84d4283343bfe98ce5458b402b7298cf6d53e15914d70e8efaec886b69c87a488d7b66054a65b0ee4969191640555f5823441586681ba1d0d30e8c15265b42619e1acd681840cc12099c5f600126dd84df96521fd9d89904425e1ecb8c90ca1c58d2bd9d7b739679dae296cda2c5dce495703966a7d236863a665f9b57803c1cfcf8feb464bfed39f6670303d133cea399db987ac26c4baa0bd59d9c467710fe75c270c0591281a3697aea0aa0fc0ea2c14dfc260b7bd2c8543c81d9b0445aa26da69560c228b827c7003d61b4eda1419af55f411aece61ccf3693e7efa7721b6b60d87acb426fd393a8560aab3bfe0dad3fd2306ee1f007f438259694cc5de39d73e5ab117e88aae2a87d7428ae10c952069f0b423d1cb7cc0c95ac196efb066f68b8c2bbaceee6d1a4f0b96b6397e60efe1aeed2f8d561d7c565d86ef439d98392b7b1a65c65c0b7aa34b33aac3abcd63ff28123e807bac7ccb9b9ec5b0acde73be4900ac861b78984243f692d40b72b05fe3c18dbb608efa436e835bc21e90e7db02865d831cdec2345ebb120efab123f5880c25087a19852f96f19c9b134158ec47d934a773744e345aa2b6b2f7414609d17a6c9848f86bb34deb5e87307077c782aaa5ef8454ff9617dab56d18b46f875c85af5b0babd6980e8ec14429f4b779e4ff03502a133f6809c848bdef2ef8a14bb012e2f99ac17eb2281adbe9361226f776ad377e6c8f255147e5ef08c9d7e7af4d2f347d7e887443b69609e3d649838a3212da229d4d505c080cb21832c37855e151ce0c755e6bfcd5afb38dfdb250120ee5cf84f3874b2c83d3957bd3247f7b887dc5fb8f4b93152970c7362672121478d9201e1421cebe4a9b214d1011b27a1eb11f4876e20e04903cfa1d7fed0fe4bd93589452e42ffa2f6b0393eb6ea809d94caa4461919909b1df2f3bfe525834f63c2d20925ebb9085eb4bc189b276e964cbc7c4295410a07d04952444380a177869bc5cdb2aed8f480a0c96c1c7aaf1eee872b80b30c2223f51f74fb3dbedf7725615489bf4f3fb886d16eed8dfecaf70f1cfe31e89fa69afd8f5ed7906aefbe8500a408606ea2a7ca23402bd3e42d8df8c3078808507c3a80f81a61633ab0ffae7553faf02548001aeb136947d67e08165fbd52c4a6d7cdbc710a5b343af00a5d386c864470edac1e30e031b96b09ac23f5b7c2e4f4925d5516f6f36717e1fb33f15c9245c6a682582ebae2b784be6f60669b5e6651f3642ca119da3197f1cf59e785440ca67987a74c3db7a5e43c91c3af17111f048f577e3d8db941a8d14d01e940b5b609d1ba67d37877f4852be36eaf4ca78219c4bd2817753e4ce40164d532d0e98041fde44edbc774db6f348cf85584e72b75543498b3c2770356e357a53813ea3f88e498944653510a5e2671b59369843ba4e1cc965d6e3670ad4645e60f142987f956c3481e55bf94454edab0742f616fff09ed3ec470b5e2729198d243d1813179aa1298e7cadae8e77c5c50206065bd07c3fb90f604c41f1471cc4143ec553c298db4b897d20512e71a28ecb5dc80d4e462ab83c210b43e235376f19c51880127fab2e9914ccf4fd68772e3a50ba8209cc22e08da11a46ad569107e0ac45a10f2f89c55b0faa5f2963bcf36a87364fde1ed3c674ca899e7019b6d858e82390f0896c22f50e3264027525b3ff7e939ddb23abe186c7aa1cb9c069fe17c337a4887611226db381db1f38359ba60011101d1bd29819035bfa1fa6677cb932052f2f4e6eb66786650182dbbc7e95ff585adce804e1a1429622a24fc34df689fef08682151cd9c6a4ef48c2d4ec62cd04c0a5cd080266b755c05d10fbdeda4324efb292e901b9f5836ef9d5dff6d4999c86a6638274179ee36fa1d697b14b812016495a935d1103b27fc54f74093637bddc65d03ca30dcade057a440bd968c7dd432febc546a24dc362b7001f611412d9fa6390c94185ad290edcbd532d7e738e9b715a8b0dbf5b38577f3dbe89f8700fd02dac89bb74d43974b807b758c3c365fccc57db3d697e6638e2f710f4569c6cc58dca8c92b03b1ae385b355fbc3fd3e0f5321751742e2a1233ca3263eea54296e390bdda280169afe145924d3c36012612f85097845ecc80546b20c5dc82aade162a2613c3bc86ab05a6665342252bf0f809fa1044260f964b5ff97c179c780ae6497a65f91d236ad6bffb7800b1e8be6ca25a9f2b2b7c3df0d1ae817573fed3a5c95722d9fac1011c37d92e5f2388e448b8fefafb9589ededf49e2bc86b1bb63b57e5000785c20e31d36a54a4b70c5c04323a27f4ad2453cf7e1e8f24ae666eddcb6a97996315915e3dd74c892c293274937dd0973aae6de0da99dc0c317aacd849af66f807f3b48a6496ff2552c3648b56e88b6147e21b9b1fc57b6b256a51391b2ec9a2e87cf4d1ffd2e1401bcb38991a3abd91a1d6c55dc270a7889300cfc12624a506708e0b03f72e3f578d27a73688eea9f7b4884ecf19683d9036cd70956bc06ee36220100023f3f60302539677f0618b24c845a2cfc85fe1a10f7d252011b909f4216038a631b01350299a0eb4d9f281ea0a13f7dcbeb09b3e39c497132a932cddfa29bc02299ac2e63674ba516091d63db51f8318ac68a92558ce8d6f87a82fb2adcc2ee4d2e8c30dfcdeda24d69f7628c0874c8d637507e6dcc6ea7be30d7980a8c7c67f63b51ee82fb98d9e710c4cb3c887b2db9e3684682d005e9f96b8b57082650388353c51841e170a202ff4b84fb0d6b8be8eb367790366b71495b45cec3ed9b7a4bd013a3874111e1ba6602d5732ed49da8a2d6c4707ec9b6d3617e0e94f24260ff68d9357dfce0ab78c41657690ae9ae3a2451faabdff28f5f64912d8be48a03c4c399bd86433ecdd08d593618f52d10d51433d51892fc0a3a8b5a87439a3c446fa215e2d5571ff89122c65f2b90c4751653e7f1ade67e5d1a399405016891e7d8d2ed8531c4d6bfea7edad078be78f690d70dabca04525a8a29804bcd07187c224d1f9bff54a1698c134a5b64402d791fb6bf1e227b88cb619d8d0fbf0e280a7e250ac98b10450c18502860752b94983d5acfb8e5d1b4a1d6b64b8e241088e68c9a3ef61210d2d4c89e39123b38b7d61ae5529c5513663fa3990f532017500a2006a1d7a20ca42952b6ce9cb81d20a41ed108ca2397631d7f6137872f19c5ac0fc17cfe9b2b21c7dd972d07e85b409081d0c33eb4c27c9911810aa5a5ad2d970781af22a67620ca7854698a65aae699c53381c3c044d1a643964400738aeccf19fab794cd4127302a6f3f84f969d5e5358e17a7d7e5ee703821263624cc2235cf4471e93d231ac8cc7f80645c9f1a01260d5aaa500554d3c56a0919ce19426501921b2d097241fa5c7baa1550bfcc4ed47d52e1c13143d6838fd656160bf476073fc5d99b4a1d6cefc6abddf2da545e9814fdc054462205ce858db91c5112b3bb98b93faef3ce7173826fe3e338f19ad3edb6b99d66d637cfd2b07249a3fe96fa18086a2a05cb8da1e251d02a7c1bcdf11d334ae5a7e7090a0585d3a8f88af0efa6e082837461411dc61f4b93e4a0ab4f55aba19c72bb883f18de9c813747e2ba572fd614978b8ec81d2444c93283c6948f90314b980fa336353be647d26da5c1c01e57d7705556f7dfc9e08a90ad62831b576785b760f39a6031ca6e07f27581d30f0c522fc76ed27d3d5b03912217e89c89f8f00c5f935da4fd7462a9e7883a871d8872776dcb8d2445f26c71b7afd29484b3e5d219584c571fef0adc07526bf822379a13a24f65f1f8d5237b82f40c2bc49bbf5aabd970a4d344c72aea44bdfc82c59fdc4eb5525516cc962d8a7651b9a203353894cc81ac1c309a09efd29974b10aea827c097c259c307d9270c9a372b3302ebc4d9a49d4b01ad682b87725e37e3b58e4add3a6af3b88e9a722372cc948262c28b681baeb02b84174762bc75132bb90bf650f5572508026ee822ed48173b694d5db49e49dfcd329ec9b17d4d979395c2f734d0e8f52aadecf8a0ee2b32845028ce2b76daa7501fa651b31492b202e11c1dc383df4abb23338dc92828360dce6227663add6ba2fe7a1e6d458a40bb6b2a2988fde0551b625428a627208375b653706da74466bd44a24d60bc7d6dc4849ab62a05fc01ce193810706c33af620591849a85e2062922ad19fadc2fe9fd18c153a8e2399f9ff2afe7d727a193a1d94d69137c8a2adc95def99b9fe19132ba547270e4697e39e95fee660f273e3e5dddef9af351a0e7a384144451fde11c340e0b673e9d8ddf8cd7ec3ebe56cf281a2baad553fe2a1fcc1a7dd8c018129cee62b1764458a68cb6ca90b805570a4298a0c7eba17875abb858d4045ebf8d15d6aa3ee33e210178fb86561d5f8097e8a2bc93b321f88057421c9afbe48c08c434289f82cae7a8b49d293b0943b2098b6d1c6bd6b45ca52df184c419360ffbf8a8b4dbc18c069d842be99dec5691c92bb5fcc6b674f535cfb6d7dcb70f3015059ab4ee86f8c8da429634b71170dd66856465b1893c70e691a52775f4964b25222696aab475b4a98dde8dd49c94f8da5f7b226c491c06d34cf5437cdd9d0255e093f3fb63755b8b7f9b7bd977168b2832915472d2b6976e8ffd724e423327f71d193b4758d0ff447223334a3b255434fd9edfe3e548efb8b6d904d263fd1c2793228396aa78ce69aae7e85acb8ac3a45dea0c826498b383538878021a2f2e69e9d4130244a11673cfe17227b0b4487e847c7c711a48cb9ca4839e057935418e47aac12a5ded30230fe489094456b281a5007a70b6ec918fc38de251a327195f274de3a9d6197fecb816b48e7b06688c945015b3ef361d77d491fc725ee2dca12c59881d9cea6c452dbd2d63432aaf5b886f2eaf61afa681d1d8247b5a0f2c6058abe4150ef1f2b2e445598a8f659a22b2746f56156c652c099ed09a5d22001065a8af8143b558d4753c066ec53bb4915d84b9216a5dff81e8708cf23084419170c4197d53ca478c03a2054c469d3b7f44378e89a1c51035c9337d7eda3e0255ff94647d59844efeec281b73543dffb086563e3bca277c579506beab15ac6c9a38315beafca21c4c528f5ee60dbf6c3ef4301f2950e95a9336826f7a89ef3300eb6711dc625a670d2b9c314539e6b2bf84c5008ab044b407258344e6a979bcdf12b7092b68eb7198101c1b6b8b808c9bd97f91dd67015956fcff82a2e67a9f0545559af096db13b6b0f6f4b5524065f166d3b6e03efb2c047c2957ccc850e83bb62d7efaa1a7718e9a3e1b70ebee5c2c85fb6c67c3d3e91b8f9ff2326fa999b9d859d1b98d7d2870ee1507ee47ca89ab9d32c49363b29ee666c457ff04d2bb896352a86a29624e058d25e32abbaa1c4fb3cfc2bf01269030b2fd76e881803e84d0e4143ad9618aeefe684acddac25616ff0d7faf24d759c95c2c517d6c8e8471093cebc796682d86e87148f815e36b311c8bd6ac8695377d5e3161c0af1105d0cbafb6cd4c40579d66e8347d2cbcea90d05821dd768e7d2c671e9b6800cc791ed9d78954ee59d6170ad5c9566d9ba45a29950251a603789bcd9f79837e20d807bf5fb9c18dbc4f35d1d291dcc2caa89f5974f0846d46b9329ac30a333777eb865cdaf023c0c9143cd588218ea68528111f836e784f9f90a9e891924535c01c54323554cead5d98d6d0604b9ff8483df26bb1ec6ab69fbd6992fb77bcde24d624095b3bebfeb1283b008aa3623476fe3154c04b3a5eac07dd2c67748c025cf17dde164e5998b9744aa7f03e654c35b0331acc6e1298cbe05db6bb7753ed9a1731843517ae715c733289a0de8a74364b233de4e29ded7422069f59f3775ac29bd9109decb3c66c17c1ac93bc1ad549736fdb73c73571a68c4aca5fbbea45c07a227876d1e796efde744a96a2f115e5ad9a8b542369680b61f1d5120932506415192c7f9fbae208388ef286b14b79d164c8292b7616e1e159164e4f00e529af842271b9cfb5a5a2b10454da005f9c6c83f2532d765d51b7ad4e582b0cd0ce8e59c4968f1f780217f61019b695158683f47516dd57dc4f57aa67c23ffafdde4f2a0a5b42d9c4942bf350f1fedfe9096a55acef4be9ea12edf2b1851dcc6e04ad0e49e5d4de90fe2cd74bc2b4e11ab278f81460cb308df2e1d6892f99105cf80d37dd555d29d006f4b59e1c6c1b91b297eb1d91356736255b6f178c0735b04ccd52ad28f4fcade4fb037bc9b3b8035e742b295e97301104ad948a8cc9f714b4b90af70a98202b7176cd04762d8ad58180a2fda1f3c76173abfa06eddaedabada47db7a70e04c9f10bd6df990a0c42af127934ac290f406eaf196f5c50ae19276c0b35c50b8880118c254e375e430df1a0ab1c7fcde8211ba8ae500246ca1200802d1f242f22c3771c448111be41d005e977e3c8dae27ddcd4b0a3285a4cfa5a088ff9f0350782d18dbb3c4716a9ef655705e94f02712e45acd1b2520c19fb1b0e4ddf48386ec2d300f37aa015cfcf8851f91c83af49cf883d4b7a9c2ea4d4d97d0748924aace2c01562387348e139e25c5c256ba28fa503d5e211bc7c502887473f5f43c8b226d5fae73572471fa1dadbcfbc8f0ca9244fdef977b97af56991ac6a2bc3e5adc0c9576082107705ac60e82876f43051704b475604e26bc0658879d604b90f44780031fe0686c28a9aca56c840c26655afad8b8096614d7c52d13e7c16cf0d03c64f7714f3b9cd348059582c12099092c650da975b86c90128813ee540fd5eff0874eec4a0d2867cb87e1097f0b5ed3831ed408ee4248c860400d7c21f3386921057973423935edf04ab98e543a7791e07cb3789eeb14b141215e740d8dc4846a1f9027650c988e5d9ed3eaf694237bebe109db41c23d2e52ce6778762c6b2037c18e3d8b447e06da44ec150f1604f48602ee96eff326bc372e71e447c259866a30f9c20149d9367bdc9ae1ae16fc28a93dc1590a9a58fa82fbebab11c8a80cdf0f7d6002aee1e3a3b0f14b375149b0d397759024027b05c48c9258a52e6269ca962cf6c54752e54b88e4a483bde74caf0083ea40ed4f3b35956d98c6be17e0fba56a007a1c0cdd8eb09e4c2508d767c87318ad2f650091de78e098d1c0ef6bb84f4c1ddfe0b2bc6363a14623f32d7e912221a04a8ddc10a32bd8ae9b9dc498d12545804f823c4211e90c97467ad7452ab1283312fa4b8b7afa078d074070914a8479d24897a7874d36a96fad0c2758e51af28dddb0ba081f00b10557d218f1d2640b512855b0e56281899857084b6b95cec2e206c93210d9ba52bd1e6c334a29aae2786bccfe76fff3013d9be0b06fc6be9e7276b90a70e169d3ecd557e4176fca6a991bace89867a762f3e0a9a365c890acbd54601d64fe21b03e3a7359eeba7543c7ade6049f0061f798d9152998f383c7278022adb9ab63f7515dc6218a5ec2e5b2ad7a8261a9a80c9397c6342cc87517f40774c0f8deeeed11c7ffa2ec8c11107d8b23581d00b9f4028eaf369956c966302965072fdfec2b71599896f6ba926506a88090b51a26277f8d9555c6051291381a17ddb2932713e89c5f603c3a3b5a9f63e6dfd11d679dc49b577ebb309bb874a9fe2ccc134b3b924f46c638f691bce36472ca4e47ec3c2288d16420ae8b2e664743e44c4b182e16d5eb0ded5f67c3372714175b0417ad4a1e326a105f6f7de1ef4ba8733498a08cd2afdcb964863aa79a61ec3a8817b38e202ce349f8fb7618f5d43d75c0a3158ec9239d4208a003263ce05103d38eeac96b5b18ad43f3713391a15b8011054e07eabe51c586fb4e9f9a3ea77dec8654cd2ee9809a7376ad1e6b8b6bee71c4664d2a6409c37d31a4826bf2f5e758b43eb22c9aa6626f09141f6598aca1dcac3b18fa5ad1035c5385792db2cc2841e194014115f1f4fb33d464e8c5b680608d09bac15b755b265cc4b79541dc6e29b03629f1e97c83a59611e250d968e7caf696fba9c61e196fcf7650e149dd3b3efdcfc83ce6756ab90638bc6a7019e93547ee9c2419d845e4e2c0d9dcc504df69e590aedf9e5ce72f52a4a8b3f40b9c7f20834ca146b8e817081e353b5d5bd8e42f0181ce2a120365afc0130702e40c3b15af1c8b6bda70de1401ea801a6e1852644fbb1c24bc3da42938cf5972f5269d5a5e927094f7fbd1388c1f2afb0ff8891045bfafdbf231139f94f0e829122da4394f97571bcd09c98919ddd2cd9772852bfcdd36abb9952abfb03859784d0f90e611acfef0c4f0f1116a0e2aa0a26d79850991b0c8d01f789e91ec337d29458051524256a32a0e18afbd05b78e90d59c0a1732af72eb2866964ee2ef8ddf2857b1cc1561656e4cd89d5d5e7c36eaf8122c953c27e0b14f7733a4b75145587df1213ebd82e29bb24d596c55d33abae5a23d5d0c845d15c67d95c8f8c687ce600ccdf946cbf28b33c902259f54195a5e6958f459f70836819005828de81fd25fd6c5a579105ffe0ec15bc1a73d276339451ab6a098fb1c23c73031173310664573ceefcf7ccdf785cb33300aa50a16291df1ec76e43ddb34f3c06d8972c62bd63761c3506230d21ffc5881925ec6959b4a76e2886c484624737d4f594aef4cc3b4e3f5d0ac2ee770fd1e4181a9d53cddc20ab948529692c2b15175726ee0797d3e1873115d10685825e57bf4dafb588a0280146090d418796f2ccf510040798c0d72a1b53a071e438860f31e8fbaf3ced090eeb5164c1a89d18a25febc1ec15eae5e9213854e9d28269a970b9b52d297826af41853eea697a013308f26c9f67fde1e15344323bf1f4eac4911b9964256de45f783b0384067dd27935a2540618a0eae6112122125281293776b05ecdcd1e93177aed445573a77f46a4f6e88d247abad19969f82cd6b47add782a4fe1d039a2163585f80298151e1a5cf68d29236ec4815e0ed9d326b6232e35b596bf890ef4090fea10344095db0fc0521ee4cdad867df29bb3dbe920a4a9627a63f503f8637a783d5c2ecf72e1d364b40508a8d8b02507aae48fa1a78be008bd48a1d43d64d991bd9314afd0df104b1805f2aad5a8965cbf552301a1e14514d9f18e8a55be3a4f814e0fe991e8d5ba2a89713c0917908b92025b1717a7ccf06b99ace36d8ce994e804fe5ac11a0b183a6851bb05dcd44b165c6af6f6333b1e57820ca39cc9da048d6f2d075a3e355ecad61fc72510b8c6b6cb055100edaf483cdc68e7a56a06dbdc1df79d3ad68492edaf95728b7d6f36fc25b47d7fc5d857e66b432baa733f2a67d8e74e1b1ecc7f9908fbd9c1cf6831feea2da39740c5c769b441e658ddbc5fce8a5c3d07b4f700ad38b6d5a8e62c85f0aa74df8213b07adf7d395a13fbf10f9bfd0c39b78843196fe51882832b1759458ff4fbbf44ceaed668cb9df8d615578a29c11ac30496a4210d863bc7e7fd15fd239c6509dd70ba00614f163a081f8d04a274f760f33249739114d0b3f08a0eac85cee8ad1a6c51fb36413d1b8a048d8cb1ea0efb47b305b29c06509a3fd9f2b5bc6c74d2961809ca843de24009fe4628e37bb158925157aa4db4f81c5ba179550ee102027b98c3f673599c0a7d3b8bfb6b837e513b47a262a31871373d54a212962a2e01d4548b3c386cd7c4b05729d90821cdd906dfee86647f54071a1b3bdcef7ba50f9d8ebf61194d0fa82b789ed0806d82c77a64df22655edcd0467be3f13977d3196587a984576478e9dbe0c7f65c551065d09577f0cba66ecdc089edbf8bc6d54e064387c642d98c8d82f3394f7cfd37f86445af5962fe40f2ea09119c389e03e72787976f76e85025d7d1c55e58c7a4309ceafb3936d124c9ca5603df481c61c1edd6286265b6676398ff659d8dfa83972605d7d8fc1f3847a004bfc6e2c1699c97da5a1a8da9a2897ba9bd2ac6db657a05c953e070965a74d8ed2cdd7e002d293fa348d4f34ec72676df1e380863e21104e50d1a6a422c516089ae58e4e71ea95da61ddc34abf64f54bc68544c6c225d55cce62e6a4ff2e08bad0323ec05d9c2fc3244dfb6b79d477d5848b0918792154385890baa705211df218b0b3025e253180d1f41eee683e12a3e024cd1e45228cf83c53e9b2656404c886c4423655938e2f06c94f1470f2efff6d454a186089f46585ffa46740dd5dbd5800a93ae92b67f8dbdfab60d473a9e884504c6f9152349973aea4df29ceb5d45e60914ea1c2022a143078cf29730e1b8464f05bd0c99e1311499da87f67836a014ecfb6837ed40c4590440856674e7ab20f8d3eac269d132f182e71d0ea1452b41e9c02d6aa7cacc20577b1d88a6999b320f237bcdf02dc2094295dcba88c077623c4680052f184e4be8bfe2282c5383e4494b872b4428a09bca3a32ca44580ee640ec5137245362152523362c2c7c5123ed0be109977f0477cc09d4435357cc02c170d5ff7466f9b6eac81a3a60690d9664a0372d879076efd8c91ac3049427e653f9b7bec25eb010078bda106e7cafc19900af62599b0815c0460c204b3c8773b8346d3128f792b5971a678ec7bf43786dc3063f9ed8aaeac2dc8210abf5cf83d2fa1151ddfaa8cc4d84162f31c956b71fccd08d5879e22d2839b07d8150e40b21c63a7ba7122bc7033af434971d6d62533a3305551ebbd77151078e4c73dd37f6cb787985e7ab49b92ddaebcaf876eb7ad1362ed60f351c3ae4354a9a8604c5c1a483f65a006adcb16eded4a81daf1cd36c7f16d2020f61b3ef84b7364a36ca6f63c3ce690209b7c223037ced9a68519c3b85e804813b343e01a401e0fe6e158843a770de32779f24e4764280b8876e21eca86c46fcdd2667e00781f31cc369b266bddef3037ef99f3085b202c79eba75e234cc6146b5ffca40c8189cfac8d8bb9664b162d8906362fc34f73800e7ec124d7b7b9a0f7bfe1ca706a1f8d60efa75e6db008b9ff00a3450c36023e09ec7672790c2400f4c4b8b838a409ce3c483d99f5e9cf8a300558de49c0277c22472c78fbb138998a926f95c44f0883e69927bf5e53a94a4386099ec85c1914f67aaecb752f8904f831ed56ce9d8a4330d45c90518fcaca237e6073a0b00f1e0f37519ab0114fdaf9015d0ecae063dfbc1621ab9e417604da8880fcf961810426b23317f1f5dda84541c0361f75db18d7c72c835f84cf21d43cb1cf01b1fe7ced94d190fddef76d013b48653ae8ce9fc6b0980188b641c8ed5e1c2d7d373878fde46a62fe92afe4345d0ef01b3febc5435a4e41f663009419c6f3ba086780fd894f94959f7809650012cfbf998238a6dbdea8258bb8901b8807082e8d9a971007fcebc965acb104b33bc1354eba0f0251ac6cc379bf29ea968c99211ebdb2d81e28e802e064b234a4b48a61f905a183a6afea810185c9b0be3aaba6bfe0b35ddb9609c3ff15cf39fdc26aa0efed4f3fc173f0030f8afee17c46353f7d0604764746a9565eb29c976a3bf428984f55d605c9888425db0d9850e2c1c2696eabebbc644e100ded96951610a25d1340d72f6c42dd03ba3d23a5e78d9b514d1ab2ab01cfa81175929a05430033d6c7901aefc2d930f1439a496ab94ef7f6abc78328357ff017044ea2d71f5ecb0a9cd4c4d4f292aed69632d6e4ffe659226ae1488e0f9aa6442ab6ba0f2fc2d1676f01f705046415cad06689fa2816fd7413b990bbc59b45b71b7e4f72ad28e57a74df78b85315e1fafd0db471365447210b0982591d5262bb2c01a19520c86616232610c9fd9e6289dcc3a018fafd986ab8e79e44138943721da9b05403dd138a99f319fe43dcf7ff9895a57a1b52b473276e755bd1628c8e3dcedab2848314acc28e83073f41223f1cb47c9fe9967a1453154d4514941146c54c2845b54b01c5ac0e896a20a21a87b3db8bec6beb38cc05999f6b4858caea1bf93885c42dd0095ac819074afc01e4051cf80fb4ed26885aa5ab7e78580930f9951074f2d9f500707f897ded912c024affcd9b5327c2c3b7cbea37c24c5c4f9a32d2c2872ccfa0a1462c9c8f083516416089e9c7013d4dc5e4e9c824c95c1b2145c78bd0053a53d564412d1de746f56fe105e6ab2dcb3864bc7c490e2837e819f38287a0e3943dfabc612b5fb907a50679e1b1802595fb9f5428ba1281eb388d6d54978ff9ef92579673a7cfbd46ba57b2fa0137824890ff6357d77db4b21ce0ef4584d5644913d0c407c4707c2c571fd368493b24c4ec8ebf6c6dbfab6251f6a2b2a8516304dfe22ab9308b136b809fc7c97e71e5fdb46562f44c16831bb0dffe0953e29dc184d44fce369a800522b4016cc64b9335638d1b1420566e6b05b039fce0ac79c4c1de2a93b981c867d5e4b803aea19288b3edd852ab5d279013b7807f07b126c23b3037c674dba83a1141f4a9b57ba49eef7aa059b5cce62986a6218f75682462fae9e4eae932121dde4ef951d5a2b2ec977d230c63e71309b83c5de91dd103e0fc400d7dbac7c36697b4ca30fdc52da24b08dcffee846e797a3036c0b24259db8f89c3c1ba5e5d2691c74582d5ac5264c0f4c9a2a9d42d35f7d225d5c52bcd65a2109c45ea2975d2c66714db47cf73c6d56cbbcdc74811896b43b02956c2205b4c96717b0569123765f690c95a9bba51a1e8830fb3cbd1d8d74cdae11a17b349f3fc87170c997409c39460ba009c9deab51d7bc4a2f0568fc9252f7233896ef35d6662ea8579d206df2c8e27d15a87ff0c31aa28c29a6d71f8528490a181cda3cde6e64e3e6b110deeabc4a91005c1782488284a01c63352e3f1c7bb997c3a9a29bfcb730dda04a24673f1e439e0c2319058292ae169e0aab07c36b522b830cd8000ac4ab6728d805cad08ddd739fc2aa64039942c050581adbfee5f8e0d6a45a0bb05018e89118dd9ca4a0fb59b957d64e4895004561851775b71663bf03f00504560f6ce37383733f4f234aa9a3ea7992ba1d38f110e7ed9ede472d51c446285d9f84a2ba80d6f4a54349888895429edb55b82eb5f08213cfb7b83a814a58d2bab8d35cdf84c59d183d904e9916b0bd78fd178555f7f043b72284697e5277504c15c46d4fcb91adc72b00331b2fde0d076e01388030ca3876787e13b1c80ed058381d84a2de13904369249cd4d29a2e005829a8daee5d90968041562fbde94f7cfa098be22711b08be8dd02c72daafa01744973fc239a711057e6dcd6e59d1a5a056eedf0860f367766ff3ad2ca87af91669c19b0d9dbae972ef03a5d0176066a510993eab3ba40365b2a29f212cbc16143af2ac91b85512aa4acbcd382e296078157ecbcb0470adcc469ee719cbc6cb21e9e02058aaba3831ee679948fe84fc2d722ff8c6300c8868997fe0f33273e106337ec8a1265216a6194460541dfc408a518fe4d435044f8a6c7252b8d28169d298c16b3d7b37bc8daf26be3726a39347eba3108ab73b223e08d1146639004393495d4ab1e836201fec6b3134c8935a1118efac98c3f0aee20944957666a2c236671639c22a7cf1bc48dcfa3e5cb145c2e2f951d53a60829a01b52d562c75884c644348ecf07743ba001c1cf019fb13c0fc396c166d54f47388d940defac7472bfddb901a1324a6c3d047507ac02e64319aa939e248f71b7320b49449d6ed0afaecd017fdde9c4bb215a074dd1e5be1fdb052154b5d90218c1566e303338bf47b5799f55926aa63c6a0930b549fbe9e3b82d733e463fb5f97eed4a7b17734023b5e983e22c72b901375a88c3beb109bb25c5e79d5bcc4716715f7bacc2ebf648531cd075f78a2538c42edcd29c510483086f208edd6d072c7c58e8cee9fbc8c3c6f8c69b9eda3c809d82c4719f669a198750bcfd912463a5b9dafb296b73284cc6f78302a04ff911bb5986c048180c6d5c72441490d8e781c856078e8066be4247501ed3ea2cb220ad040c1367285a05600023bc0e04564873ba9c40b584ec3705c167c8c564c108465041477bfa98c84adcb8d94d30dcfe9c5a0f023d08aba081c8817363619e40a6ba511e1e93567dbf842baa47cd091711996520033146609e13e3d909ceff691ee8c008fbcb16c0f1a503263988e8817e14cbd1c95d7912882c22bf21fdf8ca185557a3ab3abedf72775dc481eff9f296907418f6d5180322e98f08416694ce868c139b028647a117a680b06a4b6d895e333fb3114bd4a274834c0cfcc417408b33f2f2949d2a8e504c4f069ea2643c2a4b8898406f96fd32d93416db282627b1fdc76e2474d611d058a1cbdf7e0ed2d628b92b61cc532e765883c54b8257cc20914a14d3214cd1eace0d9d110576b85600c101551031c033b3fb8c82a116a4301d6e49bddd3d2946fda0f1157c255fb72875a4a3f70840f87e6877f4d670a594bf42e93dc9ab3671905699dc5d2582b201e42fd8da4fdeda3801994a5e94921c3ccb048624d524ed9764eead410ed64da53e4c0ebd859700baa1c46509a20f541a4c0ce61268ecf35af0036eb006e83168ac2ccd40ff636708d0587ccd0f5706ec9ce8e55d52b25805bab47c99271d03fff4b103a4c97dd700e4232f858abb040d1e4464ac270a740a811c890863466c47137c016b988cb62a81c95c968fed7be5aa39f08108b3285230c105505c9a9e9616266bd49d192bbe2ddd3e83219776c5864713473398c3b484f05587b84b2f640efdc6d33b3ef70eb5905288afdafe45a1dc2aa050022ea52c1898c8fa3a484c17472ada52f0bbbc82b242d46900dc2d31cd45f8d7e37cc8f8e403495954c774e277b33d8b4350da1c4b9fb940686e591cd2b2cfdb099f1e405538433994885ee540f88749d9204b01e17eea23bd17ca49c20dd1905c08845fda0419b04ec21eddf42d286bda54e1d66454c3c4b25aa904f934f64c5b6f77304ec1c5b18ec7823d7ba8051a966c1cf6b3e0348b34be04cb6efcc68325b6010685a4f6206fb90a4301baea7d0686818f383e710d98cca448c22ba3b5d94c269d9fa703ef47d5642e94b978a42b02c4a15cabac20a04a5a4b6d8e5a7905e223cea12f262f8fa69565e3ec5e89346838ee4c40a0018c29690d5c017827cfe9ae3cb4b6a1ea6e6189db6d1108ff87053d720a2099e9ba40b1c6183b9907954f08b64eb6c718638a99882542065e0354172138086c30de290787116946fa1a38310b384c2433311d9dc5746728d03426ab2049424bf2365003b39ae4c4a5f9c0f71df3250cd8faee184c9a098350d5198591f9854970f62379ed06d5203811034b4208bab3c8e5adb5ad7ac787080fcd84fbe2e489916486139049f463f9a1d7c63d2073de6c2f462910544c05215971892a884d80ade0350ab3ecd5c4fb366d99a9a085e102ef8f2f5f240f9ba767734fd19442285570b8282cc9cae2a4ca7b305903afa0212d2769076a0891593359b2e903b9298aecd0ad30203ba9284ac9be8fb58125ea61f6509dd60812db6881708b10a83ead2dc1ae4e2fda15a16cc9096b67ba1ca747c8f33a1e91e8e063bddabb4d126b7ad702d65e19333d127a004e81ef42860882b121c58af02e8b7337bd5e55cece7127632e18516d8364c79256c640bce4b45d3e5a246acf76e41497ebaabae79387d43100bcf066060f44d9aed144293df91ed5f99f9bd73fae07335095a9457b11816cb436457403b0218ceeda76ec4814ad931ab5d02e8d17a0afcbc22d656affd180e78a9a461835eebf257b55e607fcd2041e4a0812370ed3aa7deed2988b09452c4bcd423ba639e6b8818182303e00910d2f662e441012ebfc7f6577266e23f46230004eb3884bfaeb98c200f8d0e6177fd204f2755e97c3df73e1f88c5213419d613948232614db36d4ed1c0633ffa41115cfad3da9141ef1e8c69dfb7de4f36903e00db03fed108445c340688cacd581240f49602cfd0bbaca6f057417a8d1465d9a1d82c171d8c941d39c2b617ce4216f62b32c9605fe14a889e0e44f0d47f47548e5439bca282b2200c9a62d2a14ac9c307cc9e33f7b4f60cd0599cb19be1bda83d4ab97c63e5f2d31a251af709c78394a496f1b557c4afb632c8b0e9c4340f828cd17890fd5a0520ef1f07e38984df0526eeed81b41cbd9490de4c62df72ec53134707f2b79eabfc183c025b1648b8dd1c1a30037b8ff4683fd81b6eefb123a85cbaf6e991e825e2b58a74e2f506cc2ba31bda7f66ed402df592b5758dbaa596101817c2276582f05043d03578a195f360459e34b3a21dbbd229e1c14897d800fb0254b81d885e10238be65a7e5c83361646c9b8d3a8113964014537742ed0f558383202e645a37e2b5103bceb46ce1188650841ce9276188fefc8119811c8c36479540c0c6b8cbf55e1e29aeeff584c6a55497627b70f809562fd8fcd7aee54968f325fa6422818bb60d438315e4ae709d5500a8a6e3dd0a561c6c4732463faba9bf3f64b0617c8ef23c8631c416a2dd3f6d2871370137650e90130a8b185d0dfb340dbbe3e24b05b2196b0ea0c41af7714427fdfd9c0fe3d6c1c557fd797cb0948f4ee867990810d7a7c45d7fd18bd2cb882572b9cf9b73da488034615fe1e14e20161c4f187e732d11c002d489f7431f6bbfb3f6b59c65fdb60aca5c5039777f29597857887eb496b13d054c78049f73eabf8aafe68dfd26dd04093d5ad90148f4ab7f61c4039654725ecc008a0b379414ac52d1e86d5edd23b5b03e47d441efb5804580f9ee2c80908da57394920d9bc9b714ea86709814d2951950aa6f9158f03f61f8cd2d8c00340464b2833d7e544e8915fbd8ac428e64e79a2b9bc9003811558c077ac83918d07290c3d8656d09280f344ccaeb533644a8d038c7d393081754bb09d63036971899001d088d47748593c54e0b623a125c1eeb5227d920c911a8e0f4682e78d88cfa084e8f055767f8477d84a10f1890523c6b2520bc69b519ea2ccb94f08d8236f40156a005bf5ba0379a6292e9b015f6ad59cf9b1384aa08d02af01a4bcbe283733f2021e19d0ffc97270b8168e2b7dd0548802f964953ec4045a7b803d10776efc39aa4a7f42c0a50962f4542730f79faee224807e9bdcc2605d5e49075bd7991122d8ca7d048c7a87d411f9c727042daeafcae9a13aadfcd8babb6c4906f9e7fa58ace5364cd09db3158e421bcf3734f89e51d53171c121d34ea2965bd4b33d9965fdfcae41f99a9fb4eefd62618e14b13303e4731348f630012c787855867d71305a98e6c1e98af7b28fcf8e91a6d90b9b27088551cd35cde4ab80d554be189f388bbe18deb00bb3bfeea0d3e73c8d6431bb8ebbe6a56a801aee96c437b9abf503e5bf8fa04bcd0acc5b4c4a7a7645df023c21e836338c9b8c69f92d2d77c21681a309d38657d3d86d59e7ec9b6aa2b0193ed1a334e9e8d40b90222594aa6deef198dccae0c5c383ac38d8e7f191c908927eda51d4cd4a951db7f0f3c4e233bcaae802812ec25e9af0d4969f5ac5450914656a5e55f4d54534a1cf88ac6a566cb22edf182e5171a1cec5405e84d92053c4ac62a2191eba615302a55d3214becb53c2e4b537d8c58e05a0e478134f3732f28f56ef8e8a339697354a2228c9b538543d68942ee00095a5472a2200c83f54d71d439ff7f633e6eec1a32401a32057d6e24767edf55f5ea6550d2db7a8bdd8ee470d1bf32996ed475a9df73cc108606165c1d2fa0446674a61e4d912a0c14fdb7722e56a866c1a2a623b540aa9407ce381f5a658d63aad7b48275da999b25f48f2a6fd3c0de271a1f06e61952699ed4c4f621d6787f9607fa5726eb46ba9e87aaba98a2008d389230d5404fa14a71621f3c52f9dceff78ec86ce9a5a227734a56a775d2386a5f87e6da01fd4562e412a102f1f540ec08e8583223a38ea6dae2961fb4d985f92b93e146bd96fa4aca0cc1848e3a645d1b47031cf4f27f8d7d350f803da340f1199661e2ab0685931c2e4335e009b352281ce78181e486255fb93e6d717de4a086c9bf18181ba4c47402c81235256edf14bc0a134a3904c9ee4224a6015227f4d00c3dff22b0aa45412ebaec1c803d81518dffbb88d625eed246bd3d642e767d6f1c42fddd4e40ad787017a3ce5071b4ca31fd4895be0d91ddc993f4d19335ca5b00897a0dcb1b7cc9be8307819fe43e8259f4215000b5592660e5f1114e3e244f6d02972c93fc06d1eaf0b180c6f6da94ea2624a3107ae226df484a0245dad2c23eb28488167e1ba654d495932f4f563626d713b29754e712ef1351c6305b334a7e73011169545e5d9d576a4669a95669a89cff1889420d2fe8bfd7949557d0e1873fa890283519cb595bec17f57f26de3d09aeb32040a5b58c1e9cbc58f10029de2d4d5309411e9acb84248af2f2b9255cf785fbcfc16925311a302c847438651a5a7cddf43ae030c145053b58ffd339e039ac7d7549f62f8a0742a551d34d58af98152f0a6dc95b9ffe89ac050ed43b4b3503dd1c5bfd1539c494d8a888b3e802f58359b9ccb7843615da5e60a34e924a51c501dcd551ea45e4a45631c53de0c72c6ac6f4a824d0a1d16c446949d04a0059fab43fda3df43152baf8594266f94700e4c968f444caa41290792569e3469aba01c0a196a2053d4513c63b167191e0adb7a12264286d9c923980f68f9f91ab2badd90f3bcc4b859188f2c134dc30871c488ed456f89b3ef03423113d88fcb3ae866a36249d1e2f9de2f9f829794f0effa999a9cf81495e0bc74ab44c94665eb92033e0c7b582c9eebab50a8f561ab09487a9a535f5bbcd21c181f46b69e1152a48e1bb62459b05f841eae4194753caf4d70bc07740f2109bed185a244ae110e500dc22390209c5aae66870d91710a6a574804be3b3a54612e135792a96dbac882ebaceb2b79af6ace16abbe908516072b3e28e3c0d521478802b0fb3c978e7a71edbc75836db40deffbbd5057fa5a740e5272cb9d471955ce0e88dd3923f5426570ec5591b3c360810c3a56ebac27cb7745696645e8025f7672996722349b7a5f2324c3d0b0a51b93d3d745e8edd700d957ec914d9534a6c143728d9997add8aea4e454bdc89a861c30621d8f4fad1d47619b9f27ab86cd70e8e458a9489d86e16d22099fb38270442954031615557adedd705ebd28189a9ec46f5a5197295b48fb967d6e2ca2bf10402d5e63a633b406f226a9af25842fb0e8bbae36f5e110c5618d1eab670a9156f4f56997d95774b0a23da81765133cb463a465033d6fe778b32e89403480c92b45e2a1dc2eaddc437a63adb5c84d2a532807364c1863210f1f2f6d128eae4a35e1982b67402e112578fb5a9887137e125eeb1cea0c49b5d91a6bf6b9e5aba346cf7b73166cc9444de7c55304693f2b882df5efdfdd465cf21aac034742b9dc2dd2a4177c089eb5bb88931152fbdc7688cb4ba734ddbbfc4acee45ff6a94c430615f03772acdc86b7946b5fd1ae6041d4875e0c17666c297648cd0af5035c2c23e252633e6f77e5629f6c5acb148effd95f472fbdffdd54048ec3329adda2edadc8b63cf8410aee6acaf2d8bae822c3d3243ded8d430315d5cf7e381d75825f543a5a460eefa75bcd45faad319f00e82ba7e1235886edf2fee7b256f198a6a51f5e604f1f3303fbc8991cc58e8780a22ed1a4758d933a9e4e2c4d7868a6b6e80e4aff1538512751dda987559a2049727795e0591dafdd4a2033f53329f983f127fc2f0bc32cb141d81f032a73d67bb9d805c4fa2ed01049660bd198518d26764c7db856bef36d9336872e739d5167c2688e3fd0b896b8c695d93a047c08d3f64021e9ad0c01a68f77d99965500f9075407fdabf9d4d2bb1959764755de2b71aa7962e7e52f4c7916f7d4ef938dee7d8c7af81e2730504e33be2ead75995b19e5396fcb043d9b8798112512ec053a50b34e6c04633819f6cd82f0cf57028a5b75b919036679feca5ea0107c9e6be258cac9d28c1caa37717a9034d62b59dbf1fd914f4cdfe56da0e3ae5506cde0552dd899a15e08141c0b1e4020147632964b594da1918323526634af1b48abe33c4b2289c71b114c299d0b5a55210e64ccaba5b5ab06efe3d9e531ab066ce6989ec4f4fd9cab2b91a07e0227a20ad4507c257095f076c26d19fb92c8b4c38015b565756a45f331d79bc7c4689e05631959b1173f5d5531ca74466d3040c7fd5ab9ac304b5cc433d45e97d8008a1c6db2819a3b3d036148ef642d7678688162d505fe18eedd6168589a5da10f8fbb427583a014d930194b39208fda7452ba8d3c0eaacee42259d07c5f952b711e5cc022ddacf21704e164d7199cab14e2acd5f030ca17795e26913b5281490431bd0ccbb01c7512989ac117fba4d242df567badaa4bcc65123c6f7cfa66a71ce53c75921ad6a8f85bdf1c8166ac7c4b4a15eb5c2096cf2cde4a16582600b543adabb00e5491c47dcb55bac038f55814dd19bdfe182f5ffd96f11ca87313941f3bf401f499fc6f04ba2cf4a02bffd8f8342bfe3b64d3c8b1f15b6bf7f268e083ac582877fcda453896520d4b9e64a62eea0620931694a65bede6ca444fbdbd93608af2df9f59ea41af33372c023cd42a688960ed16d83ef28d2ad49dc5bc458aeac8243ac8da34e4996cbbf941a30441d0974a197a6e5e444b2face33900d2de8696f24384b41b9cf9faad88d253913b1624128cee43e08e894962286e96d83cb6653442c1610cbe193da003aacd8b3c50161ac1ecdab89e1856e148324036c536dd7b286911160ff37c58fbfc54d4fb01ae0174265c99a0144374f1803e1b3c16cc7340804d65539404434fdb04ab7963e1e11e2053c6ee4202d2054dc022966e73128b7a7a9867821d9a61f050038bb845cff006efde20422baac4d53959fa691a9a8c8e4610488523a4aedbe76f91094630d3abce158295b7f4ea5c8c1104815e8f7431ed39b29a87ac0e3f4da4b14e9dcb2ae0ff5ba45989c34879d4a3846f79c4011488560b154d45059604db482cfe70ccaef52a3f554506c862a12417867646766adc6f9224a766754d15c03dd2a426f051cd748f2344c5be1e011f63d218c543b5f22bc82719f4f01c559bc3ef59574b3ce1869b0ea5fb146c62b49d81c667508c7bc5d0dbf9f016f6fa8e444db08edf440498eaea68bbb50cac5363dc546d42a751b96be401069b0b1ec2163cd2bbc8a76a589fe008baff8ece54fd00fc8caf4c8be47dcaedba929960f96878c418181cbfbcf66419e27e48362143577610bb107aee588819a518d7252003a45ba7c5b81048a2765654a3b4f64aaf46a04db09abafd42c6031232744a61f2e363620e69bf5681d8d9a99e65ef517d1cafaee164af3921b656d3429d2196d8675442ea02bdd841a1c3ddf62f2182607c696fe69ebc4c3d0ecda5b96c3a85d160311a53b32027e0c49aa1ca55784a5146d55365b5693dc8929f9145b93c4f0dad6dc8e84055ae32bc213880fa8b8b6976af662e6415e6160017f4a5531ed99d37e4e1f8a462d1b7b0f1c02a38db01486b0f9f1a0ea6a544182dc14707750aa197ce97f676a5aa404198706adb40f45591b597e69887546d03371ce5a4614153174222ba730e20934d484779a0ed9b26328c2418697d6e73e223aeb23a18032c8dd2f95cf1cc4a47ce4ac0a1ab0dd461f154588c1e70f4309cb51c2b18df0df7acc282e276afd60b325179359b0de2ca226f248cc30b39fba500458083d5ade4530cbe3610941e237c8e0b8dde8f50dc85cc0bc0450b8b08896caaed87783e40ed557a5d42f6fd032a4aeb363f43dc4619bfc80950cbc301d1d0c952ec107efa6342f0d052cabc03377674f1ff2fb6b746ca07be16107dbdcc7f9bbb6b31c3216d2549917918ae3c5523d6c38b0954822e9033c95196538d9c34e5c4d393f26602370ad7e9d36cdc4566f75c745bbf048fe04b5ac76860b116e64d11659683a077904d0131209ebd60ab4d5d4abc8dc6b37d5c20d7558ab3df5b507d2d2dc5a1841ba661391f38aa14f1005de24b2e05bd7ea5a9a858f60ad8307a8a4fcd48b75a694c44023afc2dda35df41e907b067dcd6304a9ba67c0c1db7d292d98b5985db36e8fb26a6c87837c6f7fbf44aae557bbfe5be2316423e8207080fd8a340fba6cfec0068835183a3f0f88c1aa4dc3e0e608b991ea6b285fe71f638b1f9df89992dffe0af42a9cacd9178f99c5dffbe406f83ae2cc70029e1c770a6e5c54c870770065911256d31b363872961dbeaae58076fe048b28e3b5a6ab455735b9865daa11ba60da646ed7842621eca71611aa4329bc93ec0944a041a92ad86f6c1dd29590ef844eac210665048b5a53c189925d0fc042c9fc0640c6f45a1d3904ba14a026c51fba9d8a727ae57be08d1dd4da0b2729932225ba0c6c84586dc42a237c8b854277d4255d0755ccd1f17ba875c10dc79c430a62ce52af065e91a4522cfe1fcb76fe1d6196039d8e4970bcf8d0b75b32220a968fbbe36b3629b5c71ba6bb2fc4e6ec7942c847e5cca932805368be1a781e31fa9a1a679c85b6bfb4fb9ed2dc1eeaec6d92e5a71cc91723a7192e5c11788a4b66b690890d7064f4823e241df8fa5ce965b373cc08c896a7dd7d0ae77fae91906d3c3a644415b356706288f5f2f9c1c886d9cadbcd71ad500fee4b94a95c5639d9aec267f834f462cbf8d85b6d5cf682db9559f71984794c8a7a16ef49540f750e866e677dfa0d83728a8015ed26127f0770d5cf94b515985a2af6e55e8b48e1b433060b6088658a0a13e5acf1741ae14296163800b6af6602674a4b4ddb09b2ce7fbc9a05cf0655758efeaecb891d24bd460a1fe1252d3336c3dd2ee8242c9956e0e3cf92ebbb86247d2cf9c8b1a8867d6a7c399c4ea134c28bb09adc17ac34665507214040ae7d26cd01f2016bb407085043e4a161225a2e2a40a8d1b5c4dc071354488e7cebae6a01316b98c344b6a1d8de7517267d1ca5335035def470f093879453b803e50cf6580e66dca5d3e7062f689f1aac0183f11eb92acad6e9c1185ae187f4d425e459d18a942feb2bf65bd4294a485a733261e3510c96b22ee09c2de9bbb1bf5464d557ef9e381ca9872b15e52c7b302ce1acce398190438a7f41a0346050740ae7db70b14c28a5e86f419b3ec101b0812cacd3c139fc0560ef1a2bb196f87f443fb8a6ace3a75faa245e241c7d19692e52236a15e8e7f151c946b65fcc29bfee27e9567a9af954448b2ca58d12cb9b2d4273df9a6d92a027dcbe5564caaabe884567fb53b56a36ec30caf7088822ac745d59bcef97701407b682dcb3eca12cf6e81277173d6654118a650f8100e5470deb1d0dc036ec11f7a7c15eb2453ad86994ee86247e647a877b611a8b7d4e3335e86eeea068b7d73f25a681a7e6f237bb35939af04cb78975b6c350775e61f0c380fec945b16312d5488ae4f7e7c428d180b4363ce406e590d5486cca9a3093f6b22b0b41983980d4b195245d7baf658099b162312402f9e6292a2933f13d32984022d25a1a101a7480ca71827e6b912c1e83f1e1cf49f721e2c59e9e47120ee556d174d21c1360c4de2d792152ac8f4142ca41dd7c1a835422f3c4b8dfdb420576bcbc0943e189144c3874af14384a3a98f5550955f6ec48cdc9a2e0b3c646e6f2885dab45ae0f8b8608a5c5ee64a985be09bd04df8fb5229b98ee8af64eef2885a66d104e91c2f8f3da6a822089f40a1f46475f9378c65861325b1442dd04d7bb5b7c2810a2e9eaf90eba638805c7334b071239c25103844d9699118b8f08eca5eb1f38ba78a751c003389ebc2e24a47aa5d5c47e64cf03309e76d6cd783270238120e250adc5fef2bd1572ecd5a19049fa5041a8f2db00f38e0f723ec5f2938249f78ffacbc7fd9d990a79b2bd243a535190f8d622dfab2a6ba80ae1eb6c5b6293af4f61a688a9c0ad3db182f7101c3189f78ec1fde7b7be5b56e4bcf67ffa5aaddbda3439ffcc7972044b07cab95eab92fc21acb5153a305a4380d9b7f0ef452e038ba940977a2ca5888f207a81f40f9e3d48b4a66315f3e1ac031d59245f4d5bd22a5cb97f68218f969acd66b4545a75d213896171717ce151738da359dadb8e385040ebb73feb216576372e7c66d87232782a758ac0b0951430a10e0e1193bc99535855c72abc7f917e706812496c9987f8d55cc8f95e62fe68acc6896094f22fd4869209c2d6cc68a31e217fb5f3577e2b9e798c8adc2fe0ad23edca7abb001f919ee0b33ff4639fd426fc380085b89ffcba25a2bd600cc09f8173e58669dc454fb4a10e04896910474ee1120d86de3227e0a0458a191e158701775b420ca5c640624cf1c53628b7889698ca837e2f572b70911298ce45f31dd4eef006962cad9e09b7d774eec59ff9d8469cc38f08589f4b14e257dc5e9942085ea388153523391fa2d6a54061ab8979b41059c525a68c0c66b99e8d3fe7d6aca14fd33b7c18b52a5dbaff3a77f3645a58c520e4f22d15bba48b27b3b5f365096f91f7102d9909bc3e32b18ef59ce2ad6ab8a44619bdcd2c65901a777a945393b69bfcaae53323f0e81e2f63377601dcdcf970969c7327f3274279e5c2b6498078a75a083c6d8ea401b47413121211ea56e1d4cba763b70d846e0e8548bbc616f222ab1210b13a85381940526e25f0187c8bdb8a7310106f6ba0aaf81c7cacd9b29c0e564c3ebc07a23e756b6719ff864bd6b82bab871bf29ed5967e9ab2e2288c00d1456c9da8d84a7a996464cdadd9334a6510d3935230e06101ceaca6f0ef2167efca7e901a1d30e238149035ce1cee771bc6cae524d33e9ff7556557cc74087c2cc079fd82e21e481f244dd867aac48243d339a252dd0e57b9c48c31802119e4b1e0baaaad12e791e1ed034b648e7b8b4819221a96a81d6c0aa45ffddee9f438f78175d2eeb2284ab3bbc7e7cbcec9bdba1e8b6d43943eedee4034eb1214656984e9f0871bcbbbaea36fec98fbcdc1674fc43dbc43281a7090a154f1923fe7d8b5c954a45e79bf3e229addc6a591ac198dd97f5880f143c8012a952fc302845b8760f8dab38d3fb8c376cd31ff1b4652f32af311531095f467ceb91c55f57d12dd33fccadf2284fe64a889033af2e28fb63a5411228062518aa87b30da296641f8027afef19f8396025f7605c2f3e51d7f223023c18e5661afe9377c348863d79d50677ecd892718f2b5cde41dd01438d40b4af834d007211a967d2af3db8fd10c806d30a7f882696bd7784ce2a89dc63aa41768944c48818cd07f16c877c3041e6a0eae8c22ba89ca76a88fe3a2ac1d56612f643695a5b06be1aa0cd160191aedbae3f3aa20ccbc287813ec2b5e209fefc505057f38846400a2bca62d5366742ffb734155fd908c58cafd86f8e55cf84865a3cf6dfaa1a7bfd8f9af08a93ebcfc6b1c2b8373fe18cf6a034df3c54a97ecf3dbc70508a46132e4753f7923df1b20acbd823d37aa57730fa4af6747f3700b20b3ab386304a73e890cb0dac1c5ec20d48bee0dff6dbc4505e00d8426197c64b8926a2ff083be29fe01fac244bf3111c977e35378e7941f62186765440dd32c122a5f9c5b763977b8702703e6158342a12be8c2dd42c0ebddfca78299cb42e26c2d031654374d736b1fe780718db157d871b011890b19083140d2082d6995344538b16c1b2e7b2441ffc6a271730eb8bd6b72c9bdb84592c82e68f1461a609f2e72268b908fda79fb38395e31f38faa62f3fb314611460dfc16259917aa04a062ab938a5223fe2a52c4a64918cbfee694295475df3c0bf055e57d7dd7b975f9c59342a307ca714bdf9218082fffe14693b6d8c1621e6bfcd289624bb4de434889a47e0afce9997209cbe09aa039fb5cba6eeff8aed83440605f9cafd365e9f9cc545240f5f1a3c9652a59c509a2878640387fea590626db57bc18e1d8a7a412ad29566617248583786f4f82afd060291404408739313e387963228b00ae692143134429f654deff71824659802490bb2db0f87a09a77f6fe06a7eaf829cd389ec081946683542c030b7372e865ded5a96bb3835ccf5a7aeebefce59e81a3d33c79ee71f352466ed9df67d52d2bdde09d6020d8377dc2fa0864249c322c2d5921f9ae5b86039c3a6ee636391c056714031213da0dfa7b14f4eb85974550cc7f910ee37cd4b67c32ed1a8a314fefa14c03bb6d46d752411033ca412bcf70d0d932cbaf7a74e52b3d431e505c07baae694c5d9b791f88be571307e45bd8a0922555515f8fbd275c06b14fdc51ef139c394509c91e9f26ca101165cf2e0ad3f9c60591a62a284bd15c94eb182fb46193d93f6441e1c1c14a41b2756e26d3e809811d916753e94a6adb7db832f4d398473e481cc2009320f56f6b81cc6ff227c8524ced33bf019a2425354a3d36c5215617a0a64891a8e9f24cb569a7421a40f2f7b5ecb2b86b63ee38ca0bc487f129addd9712ee01d2f47747d01b00bfb000260f733070ca27c486ec42931079e265138b5402e5a7ffc044340f9191ddde99ff0a1ec93a4947b0f4b7ee9bee23f6e498fea2c3cc0114da131038afc6866c8a725f1526702dbe444af73f5e4be66038d7446f3975c59562ab89647bdb0a83ee0dc21725bd5c79f6037ba13765dc000c68fdf255905f77465f1a72088b78b04d52f6ec8428ac58f223ccdee8f40ae96944db590b6d59aafdc2691b95081f5978253c2f40f4f70757146022cb84cb1a003085fb6283d31f684799a01f9463f2212d8fb84eab4adcaebcb821e804bc169345880fc4f990308b7f12bcbc17664556b4f3ed09ad4f96bedd78f4365eb19d24aa5993d39b244745dbe284bc0b2f40f42492612b70b24389c40bed3c89b6cc8d735532aaa664673629e52d31c4e2bdd5f176804baeb840738793c120389a2ae00bf9835dbfcf2038595fa64b570634a4ab22ee31ece8e694702d519142ad90706b54500dd5e15940c855497f4483701b420d62a77a50e6ad30e6c84661249cc4ac541beb40ed8a1402b6047a4ad867b6a6c01b85bd54171c3a235a5b9904e93e43b03a631526b6a16b1ee7c67d8cfb3490679af62702b936279a0c28f41094881884b416ad89e2d586bbefa5f850d33d7f208fcd9d2650c21adad3ceaa16dc07dfad3b55991ab358358920150bca3c8d9f3aab064337923cd018493a6eabdeabab25f75ce532636a76e2795fe5b34f0e6e08d323ef716484319a237f4f8d79490f1200fe09cd3b00e6e2d25b412236d9d67dd8fa09e11de28ba564f910219ee9d713d16064d8099967f9c3aff49e543a28302aae104acd6c47f8531b6a131235dfc35630a6e1c48061693d94530feb07688c4b04fb45ee8e892afdc5f80b854df644e3425eb7d5851557260745e6ff34d1db823e2549240dd42c4610c334e0447c76c36124271d29a1675a3d3ddc3f4903b0a0e0e9996e8d64493acbd502269ef9d78b2d8504d870031227ee4116f36628facdf79da10d1d7a88918ff05def8e8066b082fed6e3356d30e8af0199d47304681f55b90f1671cc979a45e67d7fc4981a8de19e304dc3c343a4ab13afe9985090f4bb86ba5896c0e7f76b48a161b46828fad6477ce78b48b04411716ed4e5626ba09af87011601873660c92d7db88c4ffd47f238550f02c7d1c64e25918b01f53f1ad8ff19a3e59336253562041ba8292337b961f15bf60acfaf5c70028d9e66b2f98ad2659cd2b71703014179a169ecf4ab06e83535b9d299284ad9eae213fdaafba137d000b3eb5e69279c127a5a97d1ef61e375ee347b68332486a160da41df7150b327be53eb8ae48e3f4d20a434bc5b8d33f01294bc0d71aa1494c09bd8b60ccd820022b68abe657d00ea582678addf4021c5ab07b299da0ee5a17baa0cd6e7b4941d04615012c221e109e3349bac666e42be3e8652dd201a8e43afbd3692dd71b58327d30fb2bdea2bee2c6c04e428f68e73b443e47a763001b45131a0e7ec6a654c211181b004eff38a213c63722606aee8af1b950d4ad278f2a517042f1399bf8b471ef2be38e7ef2bc33858171517ad08013efab7d81c42859d43e0f5e539bbf360b7e573da9c8c9d18e939cad48f593382fe858312d11e21a85eb9bbf736fd19080be8e1db12037139de09006275240471be1aa2f861a87314a9641c31459951e62dd60617558556bfed4f747254ae3b26ba54bfa8799b7a7896a5914847d18febef2b3c4a2f2dcc6570a87684b119ae2c6d0cf35372bd583f5717538fb6fb4eb010bd2b0eb66ebeb1ce5348263b9f1810afe084d9922863e4b120f79440a97305bf01741ef16194c5c50ab403f96093abb52d17a9a6e340de194269a23464d4aef9d14b10920098572af075406735f501ee899ea8a2aa9de116031d7c18b03a51ab6faa029336017f4509b10775ffdf4c6fe9f6018a330f8d63a24196e946ddd16f00c7094f796478aa6a10a336c220565524259399110a0ec1b62096182569b27cb935a8a4af3e892973eaa13e700dee4b08bce7ed8af391165e03497a40cdd888205b1349b7aaf8e275ac676dbca5803b0563eb65cca4e6c4b0b8e2695a666efa806e9906a0053f36457b9dea119ae2e37933199d7a7341a4e0d7889f1c8c48940987eb0fb6fbb97d4f4b64358e57f68765c853f43938c8d78575baffa4ef8b77cd7f3f23fea30117a5fe86af87e000cd92f74e7037ea983f258756e9cffb3ca52b2aed80bf3cc49a4e820aa040e155360c1a639dd46946d519cc72de0dce57e33eb60da6fd794dcbf4c0c3fddc5753036d7a7c497e38887ed41d705df87270036b19606bdbf8a4728d6643e46da1a125fc4523702fbc48613fd4e09e125c67486065c70e44d04d02e14e360ebca71ce92660f997c6eab8d67d875424a1aa3901b4cf5e7581572b8f2f2799c92e888107aea751e4b55f4cca491a280f8610b247ca9e73e59f0157e3ab65ce3a6f79174cd22fab53b781f0ede3e02152233583af13e795e1b781db57b1e003cc242866457c2b1e4e6c6b820a57dfd4450f8efd77e2790eddd46b7469cddf1e8b3afd86334fb15e97c64275e4dd2582ceade74e0355b5e8fd903a26f2b963ef94a2a5a0d2e56b1d0aadf1ba0a7a0941a79f51edd92052c14287c033d65c5559bff29565bdb74e7abe2d78a959202e510684b57f857c34678dee79169952acc0503378a72dac086843bc03ad30072a81e05f54a956780b638307b8b43ee32c551153579c82b1e96772856bc3f31fc54ca772abffad4cc7c10af7a5482637e1dcb77f7df3a3cd2f9295ff0f81244b4d2e647c5d14a1f49d7892e2bc78d854a3c902ac948a01b99af0ff5f0a78afd8fd0712eb7f37018a07723222e2c937dad602d3be2504327981b34601001856e2bc7d2260d9c21e26b71b2019dc48363fa89a50179a41af17c3ccff50c138ed6c6be4a845008965912b7b25706c7f1aaf1eff9eed0510174b26a7b50e0926d6d40508e92865d88548f978212f93e56792d0d6de2cffebcc24d0fe8f6b6232b3720429c1f5f882a617734551878a19334dfbbf9daa10e07f59a0bd64e6807fedb9791c277c3081548ee2ff3a88fd8f175cc7d752f3904d1b2f72db40ff3bf62ecbfe1f8fd608dfefb87800adeabc38afba66cec710e4748e60dbf40e4d006ff53f754dc948f27d2a7a114189c858172de4bb7ceaee75201436f5816257e6f90ceac27ecc137a0586e7baa14333874ce9b4c5d8f999a1f0d9b104064d4bb1b371f7c57eae65b7a5230bb453ef7d94afac665beea60153169cb719cc3de6b491024ef48a73b534d261c71676f41d54b947e6fe12e30e396e0712b7a3c573b3d12b36b16846e424f9b51c149ca4bdcd97c603f6dc104808ecee6f3ce5f13012ed87257b6e0ef9c45f9d7428e83c9412c7c852a5578b45f49d0d1b4e9b24ea820b49accf93317accff6b250658f1d3f2eae0ee1fe4a177761a55496449001f90ad3363fc77326fd8695b6d6a0192239846cb1173c5e9367d70cbf6dab2bf37034e14cd7df303b0d8b74526bf2992e2ebf5eb3d093bd56a3515e5d73e039db7ac09094f54c4a72ea06b9ced158b50d5777eda3460f244e46a320155873aad9466b6d6c4724d7c5babab099f9e4757ba0c39727dfee60a5dea2204c4fd14294c568e22467c4553949aefbe35dc1293208363f54a6cc325a3d8040bb1b8d2c866d4a7765a0b5f96ad374de45d131c372ecd8ae74a95c19137878ce5e8d91a81fdd9bbdd9a8da772bee3545eef5511339dab6da8731ef364050570a67b66c229d1615c2bf6e4704017c3353d5b62f13e29117cd1c13363c123f6c16644b27305bb3c0c199e7bc301d6ff0eda8f03be061d0713b6362e67c8a786a78fb5199eb0563ef21a1ebdb7fb954dd49856f26011607dfed844da14f0a8a3be2a893f8cfd71a197814f1cba40c3808581ff84c5c9049bc33545cd7c15d04b7130b838a0f7204db86297c6c25c32bc63726f50b7bca64be60b3c4ae2a9c342cf042ec76726dabbf095825e60e4145710d27689011423dd31c6c6c8beaf2c74e82344a72d97c2a401686f95c104ae7577b75d30b38f901f108ade5faacb52f0c1b65472ed3e18400d1aeeb363cecdc448c44e3e9814870a42653f5ac9d788685282e31f47dbe36554e3d9f4290fc1a04f0a6ffb678095333a5f6a572c252be5597bc34a59ba5ed033b4f42a14d1a5d19d912b99007de9e108b2c93b081809f45f3e247ac77d97b3fa36742ec090eb68d4efcfadc3d97ae68efee13d7ebcd4b4cd5dfc2bb47d259b2bc255ff66e73dd310f9434e8ce4a472bb2cf14bb4f297e474203c368d0f131dab164a6b67df5bc55c41c6b7a80058b37591554f432673cd2aef3dc3e04bb50940c306860abb30b7e2760aee7fba99456b9854032ef02551ce56c77d96b3f2f25045636ddd986d0da2f755f672f66e71780963d967d1d10e52d715d67ea344d3c5661b8dff5999752e01cf3420089341863354de383a6abe4b8843c9c381905ad0245e9394de198e9521c2d954cabe56c06b11acfcdd14d77d952b1d30f3f88cf0d3a1605282289470a4ada55b5754f3e922e37bc0dbeb4644edd8209c34c4a924a5a8f955ca96d0010124b679ab1efee68a316b56ff5b34580248841ae49b6e84f6e3c7ba79c3539f0c53a60e8b00f2f89c50a78d770cdef9e9d5cb7aed73a87d3cf8db4a14693c468b8dc1f3fd8e82691b86535e2de8c16b04937b00ad2b16b21120c828441a40944d5c9614aa5ee70d71a1849cddd222658bb24d1fd040319a05c278befe238114319205579d7905ecd6f52658638142fa1890a8d352eff1d3fbda84d07dc18d014cd79906e96ad7fb898ae64114b4e643ecb6e385bd26b7ffc59905d9ff4106527cd849a0da33070d620c90d8a1c91836854cbc2cd325669204c25ff734c093954db07d81844473c21e68f0daa6e3585b35c7dd0700d913bfab113e302d00ea200eb64d1aa4d1ce87ba221695a6360c1b07832ce1ed4ad522e2489835bdf9b639436f4f9848524d91620fc90a2808c831d174673af990a69788db6f01d170406a74a043d3ed68edc3250c2e103e4ba4bcdd040e8685be398e8bb5f64149f9caf84ecb3c94129d55ce0484a1a3138a3209fbcee0ad839bec4d760fe7bdf6fd9862757c6bdec22a492b95c6efeb14ed535ad4af746679ce29eab69cf49c3e8d1615e5e167557ed6ca099c90c3d9b9a1e69a30b3ed41fa200b4c232abe5c9797da509ff869ce02992ce66d7545d147fd6b7f8d180d0830910c4d5037a82ae8157200ebb4a076de9087365c44f747002abdeed92a83434231f1f7e0bc46d4d4c544c2c9f08fb53c4f89f532f179dc526f0e0c4756572d1459ccbb8825a6b1b4c4f23c7be79d4f7e27c282ab6fd9290bdf7de726f995292292d08b3073808736ee4bac738ae7beca3dacf24d85f9ff6f3f34cf33aaf87dbb9e7c7eaaf79fa9fccbf9e648fcdbf3ec9fceb4b923df6048cff93ebb57f82b5f649aed73e10fbed8b3af1a1b4a6a7133f179268fc4169fdb630ed03137f5b9790a1ebb1676769458c1be38394b5b353607083ec67452b847983eccb35db82f20a81901e2129a800b444d607ebb8958a06a999b7c1f2640c9a097f6a56647fa607ab809d95a74315800d28503d7bcecb96548f0b66cf5997d055cbb2c962f809b041b8f60756919213b243bc6a7c05f1028c8a53f1074344cfef64c0092a8e8480010e195c207328811473e5c1dff9bfe20634e40c3984560045982ad4a8c206b3c986b8b0c2534363cc21348866f89d1ec6ecb4a1b36e930c386820860c5778aa862fc394098481d954759b88a6a09ee6bc8151a12c9a43a96c838a193387e6f020a36e28a8217da721cb018ae23833449a2ecc9c9165862f534c71c20b2b304c91a50a1218894316d269ca85451c50c0f0e0efbc0a96e0ae28628ac14a0dbf4c043a41dc33b8e0dacfeaefe9df75dac146f0a1a158dd262a67567044c58ba465e6e5dedd65e6588b6d777863cc36be4167d7deced271bbbbdbb723b755b8d95bcec544efbeaeebf2865883b445eff718e3abf0be32f64cf5c8f52ca61054d314368e8a88a270c262858412106d2922018aa7262a60a690108590190e74d8220d1b94d61db3051c03d032868b2b5ab8e8a10550658c9ed090300c8b5d8ccf31cb6e6ee49695482f46fc34349c472c915c6832abbf46d43c9cc33e47953f04128d2a98086c2b7b8d6887ca967b1e98b5bd29736b1eb734a2fe991a5138438dc8a35b98d59853e3b38eedaf0b5266143983291abbfb9d303855db49f494b030bfb39f31abd14700c4da00049d1f8b8c8818644d591efe6c86b0477688b753b84e194c51e76e5597edb93b815bdb6b5e7412c3c4a0d10651f2620d9bd480da5b2a5018897abab5f908488e8099456c2b2b688c4fa41b8876b7f466e69dcc3db5c95fd66fcf2617bcfefa4075f9f906b9fe9a980755f7d9b43ff3626bf3be1f557e1f8084cf02db7a612f6a80053d0845a8fd3dde663c55be014af02ef02ba62b09eeb9a27429dd089ab131c394344d53c4a85ddda6294facc8828ac2cb942f1a54a1b46ed3142d030863ca951afe19364c54a139759ba4b451c31f001714a76e9394a80d6aa0aaba4d52c0d8194357759ba45ca1811b74abdb248589079bcea2bb4f5abbbb8f74777777b3bb63eddd2e65fbae0f7ff74e7777373363ccb158ddcdddfd754e168b99376a2a1d6db6c89d39bb9c57639485bdff4b6fac88fbec9459e69af466628a600fd0bbf496de1b73dcc4be0728be4129cf6fe99a6a55da461e47dbeeb86f7ed57679714bc9a0947273a4c466a66ddc3739974d5420d526dce5d211c3965282dec359590dfb9d6a3a368f7367791755de8adb20fbfe3d7ddbb89b2119abaf3a23bb5249ca7560dcecc009fdb773b8eddf3137c8bee350319beffa763fefeebafb94aa63e67aee77efd4b69a6cef6e6f23dd712133d9a3ce89f9a48e71d7943752287b77c7e96883c66fae33b2cfdc85a1dadf952a845231ec0b02416b154416e9d2bf709945baf42f5c66c9e2523ec92cbe06d41a59d680638d08c71a98d41add5713755f72c94c96d5a1b4ed4e2819e947474b5e39d77561338763382d4c66530811a79fbe3a2f7c7e4933bbd99ec6241b2a7fe8a3ee076015108d620745f647f5663a8fc330cc89b66d3e2af6b909582bfb58689e2d685cf2fa09e6318a0ae823b6037e322da6f227b141381a151111cdfec97ed5dacf3c1536d518948992a8ad7f54ad5dcae951772a9724eb90701d504fd7d333c2918e6bc9edd6bee6b1687b40406efb476bed6fb47fb2d62e51252bf406878b5c438dcf32ec4f346a8e5f4c5a45a3fe914d847d54f9e80722b9d4a100076b7d2b752b71db3f3b5aaa8edbb4957cc2382706d4a9b3e89c711cc109117137dcc080866a684a8e2629459d0f1d6af7de0db920a73ad0164316755b439d8a2618b82c9a2f30ec8b8afd7441c5a234350961615d1107143f3ea47031040c2dffb9ce3e1ec0d12683a22c38d278944328a1910218547106064a2d89a5a94a1b5a9529a05768f8b37effc41f3dde10a28b37a6e000a2fe88f27daaa2471ba5ea05a8de2605d59ff53fce285343ce8d21336e9ca9fe0c461b454eb48d32ac4b879c2d596ea210e560a2073a8553866815c3d2cd9929aa21213a55c6954e0ad26a4aaa064e4a942a8a952d8a5477c58a1683198e87a22c06a2ad8bd184214a63c3c41527366368706253a68a129b1454195a62135585042126366a90008311095192d8b4610309433cd8e8d8b04f8ff915ab687105918ab272588b45185f8cc8a7ca4114aa75a1c10f5a8861450b343498d2228d2db4700305542bdab94255599e28c6058481aa8ad8e182de342164837cb2a24ad93b7d1ad5c5c20da32a8dea0643d05977cc93192a94ab3be6096a8ba7341f4859a2393cd8d0c772d836cfebd6dd3d278bb564b8bb64e615babb3d7a5fdf07f34ac1ecc5cacc5c77aa8a6c90fd1ea007298b7939126d396c579115b249fba75bf52c50dd8f443ba3513ca253cb0033eaae09b650c218580510891df06f9917b72c288988f023b18ee46744aa1061d41e5a507edc3246f6b917a32c285f8a1bb59d992bd22c16a51da5ca386a5fbf39c7edee4b353f153688fc25e3871b0fc9f2481e2fa27a82a2d4793dcb239ff3da37b0d21e2474c9424dced4708292840d46b08146143b5cd942dee085049717262e4b381534ab18341549050b2f2398664c1c86c080b6ee21e34105dc13a54be9a00eb4ab3b66ea0a1c53442a6053431a83294cbd05bfd3051dc38619445d38982d63a34ce5ea8e61c3e90ad35df7bb5d011b50f3ec64305e32fed84b6c5bd8c5588bc01f3f7e4bfcd311e1dbc04a5d614fddf7bcbbf98d4d4b94bad825bd39aeaae3362d9b3939706ee80a002c1e3b7404a0874e06ef43009f57f77d8768a041070256fbb71d8eac0a4350fbb70d2ee9ad0a4550fb370e362d9bae0a836ee84ad549d506b278ecd09193e3526d3cef430001e8a19301a6fac1030e80830d7634f8a6aa7f23c0542d89cfbf249a513784f8fc7d7de12b227577f7817677d767ab138087225c847fa84123ffd0e484544754b7d84c3c286d1669aa476eef6eda41a87639504d3a4cd5fe1e56b81d86a8a110f7093ba9f6f7b716f6913dd4ee5144e36fbb1ba4958471e30d7f1ff54f13354ff7b32701176029a24afa875bfd31291e716d27aaad24b5d8f8e36f31c616762cd1f98cedfa7e3b96a89068a6c6f8b10d57c338c54535f2c75aba0f9a807319c908fbddb9ae8bd5c34b957f2409fff828351d99a94228500e439dd41154bde24a2d5576371268419af5f9d3f272c75e627293532ec7c8dce54ddfcab1cfdc915833ab58413ba3a476265125d6d233814e3d93a81e01a9e94903a2f933ac32948c18262291a979f8638c31c6186714ea1f9e935216eb1f045948888598898946a618a1549893d2ffffff7f365494884dbc50c5fcb02f2af1c215db3353ff3094500301f5f480e03f8b4569330edb17bed082da263c43f54f0bb158f4044508358bd5425b18513b424528a808658012b2e5917b53e5941fa84eba917498b42edc6f5ed00b710462483043abfb242ff6d10e21b243aeea23df4343b757f9d5047532b553ac3628f6613c5a344cf4f045053a605e3c13cb9849eaa01d6814025940dd3b0aaa4d387e5dba2f88799ec0b451a2b5ddf529c5a478b485b2b12485a93927f1773efb824c8d5f1893ae2d34ece9ef4e841c2ce488e04894a0c66f497ffc36c96d9a132c4738c050c39844e4080888324dceb06c72840de2ef03082b727311d77d7757cadd5d9f1f7671efeeeeb6dc4e604437ce0fddddf339b318e717e916b03ac3176a9451ce79c5256207fed73b995f0b9847d984caa46d9504dd6f5e2df8acde5d1f45743f72e433367e6666e9b3eeb32e6f774ebfb3e7bbebec6306ba1fba5f36f4eefec4582cd67a11a59377178a7c21b2fb508441225e37ee58853cc8a30c1a3fba925ea779c6cae7fe607f7d61378b6ef74d5d1929f5ee279c8b2ef89dfe7823011694a10c32bda194c1bfe6f64b8fdd52aee736c835d9476218867d218661d88642ea15e3e5854da494da754999611e3b90120b617a6361d05bc0e457ccf3ab6bd9c6755d2fe53b173bb8bc6eee8ccc2d942fde517dbb3bc8be0f2bb4df0ada9d6518b6699ecdc962cdcdb2bf36c3e4e79f65fbaddc59f9c426b329376ba7ab8b2e41fb4321b5070883eb72c77d9c41b762ebc1200bf3721874f7bf3e773ae437c8ba40fab23e8a4481a819a3f6efb00f4e6df79652caabbbbb63179b7677fbd744d6d8f3bd8fbdb78f95b0df12ec7daab1af190ccecea980d8bf133be0efc1cab9be492b3f4ee55f9cca24587692ddedddcd4c1ce60aede72406f7091086f67b67997c296599ba3fbf709ea9fb181a26b33cfbeeee5c6c937d76bd678796ce2d9d776273393dbcd97b656c18c4ee3a02a4833da76302f7daeb60df09dc6b3a27643fb7ccd3c1384f07cb9a466fbb3772deb6b20d8523950950f6dbd23c9db82ddab2555db2d7bc6dcd13b8957dab137fd6e839eb68288b8251f4487630dbdc9b0f6233a82082a9a57a9517f442a4614a93506bf5412f74e0c514422dd507bdc053a6cb15add587843de07fa11bb2d2d4520579587499a7fde6654197c14c768320bbbfa2e615e9cc9bbf65aa0c8bee3865e775dd77de912eaa2f0046f488575f41c94d8b4a9589c190dc5686201224f208838c84415ea7119030c811882dd614fa044cf74f56affa27387ff3ab577d92d5b7cda3faba2f09ced7fd8e2d7489f5d892ea8bf06a89198c8222c00dca04a8625f08a4f29668fbe66fcded9017670d2243c33583420abc8292963c54fe26dd138b4bd106206a24d297143404aade2af2229192528d5f1887f412262bc554fbdbc04a31d5c8b1ea04da6c23296301979fba63d424d59d345868948a623046ed0859aa4ccf20676a50d6545e0caa5f75ab7e557f5d2ad5b7279f08a95e7b95a615e186a27cc4465c54f9799ca0f1432e629f3046315174028a53404849908ce0154183aa541edda25075a1a92929a9a8282828262627a7a7a7061d28d4ba4e0fc8ba85df5ea6fdf45a6840262bf6b32be18584842a36590cf2f531d1882423524c8a5c6212fbf417678b7d07cab132a7896210cbc7a81cdca861cfef40c359d5d8e4777777778cd786452c62118b317ecec5ea02f73a79c7daf6614fed3c2d9b0ccaba20f7726da6eeefe24b8aad8384daecb7bebbbe2bbdbb5bca8fbddee103dd1692aa1c01c67e9bc783183cf222939cda2d06f2021a4629f691bb20931caeffa7a0fc6194aa4db453536d74c6c63ebb603631d6c4a663d74f8e59df41a07f72095e310cabfd921bfb26b3ca0dd23ffd3dc0159bbe4142ced5c0928616a5a0fcc0c41946ac418154142776c05206e78541c31fd314e18f65ced4ca450c7f24c3df84290b5a2a63a9ccdc06a8829437a470fc2e1745748165052550628d291d6e50c30715ca1fd29f0d98848460f8d2e26f6f630f464e4cecafeea7ee6e1e82a0e28a1a4240210144abe5516d1a8ea8ddfdde2eaf1b213a02f6811588a971d8e236754c08af5aa2cfbf1e33e55fd1d56ab57afa454efaa20529625916ba42f7354f47846f47fb7444f896f8769f7df13a6a4825786679f6d1d43475d5541ffeda4cce779e10235a0eee0a1b28cef6c41fb290f615e149ea42bf862c54a3d10847e412f541050d9ba96e0cd34c2d86dba9c9f41383576d2e4942712949d23e65b005cbc3a4893fd29061ae54f9920059241612092778904053e5d3248e601569a9f285004929a56ca623dca8ee5e48ada00557e8f08694151249cc569d1de8d6c8e52891a9fe4a6baa1ff1c4bae2daa1290724c9f27a1d1ae8d72e44dfba5e4c0d7be475050d67953cf2651b942e1135b03cfd3068aedb29d920fd3c4bd066ada9c00e89dffd438405a48790fdf99cfd39d23ccd3ed24709830d81ed254afafb4709f3f48b519d9fdfdf8f740e937677ea35b3b351e146a971ff44885f972728f00781f16fdbee04feeb0b95d479c48671ac25d8cf8f1eb6bbf385ac16e20c9554df00ab864aea12d6ce2d7efef39b5c68f6190b6b26acdadfec89c1dddd3df4668e9f55ff0fc01c6d900fc0182dcf56f9851e003768569755307390527ea52f778c41f7a58c606cd8b3bcd01c5ee80e2f74abfb2c2f54abfb936379a118cb0bcdeab2bcd0b97546b62d62d88789ec10270c23a262cf73021a026d4c58609fecb1d7818532cb0b5db1bcd01cde81903d0b0c62f3336fc713951fb0f4b8ee4801e5bed391abbff924abbf79f93737371fe4bf7a282dec753441fd8807197abd9314348c486d6e1efb28d53fabc7fa31ec59871d1237c80ef18797e76887a87ec890031ce0c78fefcb20039c2a3fc4a9a15629f6371e1f350ff69cd2978a2155eca7161a32968a61611fedb1e7ba0f1a7bcf0cbadd3cd88e2d348c4edf06d51e7bc65ef38218c41eeb4468c220f6d9a7c3eac1da319261252861107b1db002f9823e58314eaa18f6d97f3d0c627f8d80fa0937df092868d8cd4df641fe37fb9464f5f40bea5f7d479a077b2026ec331f0302ca3c3eda20d827607f5887e5c11eebe9e1e1f13c0000e0e606a8621f990c83d8c4a430ec4116501d24fd374c9d962cee4ef7ee76df75b9d1bd1beb7677776f77ef767777efd6a81926cfaef9ff058defff1786edab7486687c9f99cc34d7b6de387e4eeb28ebe7feffbfa6fa0d123723b618caef07c86fad66d8c5beebd10ba506fbd56b198c4b45dd29ea7c809317ea7cd0755f2704aefb6950bf1aab7f3d5202e9586f865acaabca760fc80b659debc6c6e38c387b1763bfdaa53b8d83c6dda571ecee76f33863de4809570c8f32e2641f8fdc8d146c31cf66b6e2f2c39ae9030ce937acf13572cd1b6b625c13e31a5f735dd70f6fac917ec31a5f23d7bcb1868b8adc2e2f6c66daa65a654b61947c97565d085e379c1c5750e764a786a25051243aeaba44a32f3129478e6cc2200b393a982889d2d1005861870a4b1e97be1dcbe3c8145c68fc23aaae4b911450e0b1ac1ea06562ca9c367610463371698926d1c8496eeb582c90885097a50d98281c44ada104bda40690055d91a141183433f30616445f9eb84267dda62f6196be10618562759bbe001186522f6466242ae28a55d3971b6ab852ab66aa4d116024008baa6114618497323fac868a309c8ece102135a3281150465a74d70f2296a8f225cba73f75f76bad484a333f0e777713d0ad1e725db8a8f25d362575a952c2d165a9fa164c0a00c458d901b5c4dac2061d6120f1e062460d395f44ede0a2a62887900e21231c3294728c6cb841139503081a2811ce11452b33906ea030528d0145b198a13b23b53253c48191a412028d954d0ca44e081864d1cc30c35199212b4369b3c1ca74d27ec06242184910990046941335987006890c0d26a4c0298c2313c8306a1a22063c4ce9604219424d5dbad460821851ac34518438f3c4152b3458ca828331d451b0a3058c34cae000063aeb8e3913d5c5994f05f46a634c0ad4206d8991dbe58509619fd6326d466e5375215817bc6400a32c0ca0b8261a582547d6773ad1e65ed3bb10fc5a2c68dc599eeb57def54246f805af9d14aad3e5b9befb8b5ed2fdc1391f49ff38691efe39c3eda980c28b4e58aca99da2ca28e4c5715b857d5e6f64d56f90aeb337124061d17c90618aed7222e29ed0806186a422e0b8e206215ac0c4193f3875b9715aea610b27294da56740735179793406991ba278e38ca717481faa60c1dca20a356ec862862ab216c8b071796265b42dfbc88d2377dd54f2db2fac285d4adfa00c9725c47001d3c425494a179ef3d56de232a5d2ba4d41ac21b5f16b2f372d3d9473b6f7f777edc1e89bbbcbed2f10b65e1f941abdf0b7979f7d8452358f858af9ce0563fbc62eb37d151ab22a7f8f6f20f6d1891fb7e53ccea390f36df3e03c0a3bae7816479febba33d2c2cdcd83b0f5e6a1d4f6c257817a6144001beaade8ea8b4b70dcc731b87df3b30f6c9ef8381e121c206ee17cdb31640254e3fb7b5d70264e9107a001a3a091b24c83bb8b38b504eab85544e606d203a4cdecf77f2fdfffd8ce72ff7f87ac53b1b98f9710397621f87a409ab9bb7ba7d707776e775eb932010bfa3b7fc4a6070b260084ca1b787b7353e0f296dedc6b7a23e621500216940b7040ed8f1e2c9800106a6f20df57f57a97504af0027ad56d0a42ca8b20cac03273d87abc884d41005165ff0001555b8aa97253116a02e289004339446ad86307480d851011537d7dd1f8fa8fff0a51dd7f522d2ca8feac1e9eaaff833e1455ff1e1fd0547fa02246d5ff08fb6cd30f51d51f090a38546f425a41f5a62d52547f169a8038928286d3855c4b952a26ec30a5054b0d26f09024773841186470c0664c18523f087150778c1842d7bbd7428ca382505022428eb04fd86304f6b9aeab8708fb2c89ef7fc5785dcff41485fc5ffcfdd7efcec5493471918475c19e8db8204209f14d08990055fe1cfb843c76e8c8c981734357aa8edbb46c6297f466f76b8d6d79cb418202606bcc8b01fb795dd86fc5b00ffbcbf3efeac7baa30e3751dbf2a042c1bac3830a75063122b64dfee5c5703d763df3755d315e7f3190babbdb40bae705dee90093d2098278aad96331ab3afd5e25f691c6676a256e25f960c59e4717da5cbe2f745233126a480b510a2b217bc77c45c830f73c10ebe4bcb96c3c8668b6496d4bf9e45c403d769132c81ed2cf79052bf7e8f15b82f27f7b7754b32c298504abc7bfecd0c5b0d8879d89c1e84c5f129447120d7b2a10ee6b82f2b373387b42212dc4da1f108e46e2b63a215cd5df6bfc2a7ab2cfe476db9dda5381c8a0cb20eb89fbed09f6cc795d72fde3b6ef0b0213a4faeb0b5a3dfdf6cbe98f3c4c4027b048760888c20e99b57fb7bb1fb06304f44811064134683855e89f6d1490f4cfeafb7bc0f7014567035653b5b3ab49f7af907942bc06ec90f9eddf07dca42b0bd857ae2ce409f94fff807a8468b84f2800a98d847db06f81f043add0c69998a8856e531469aaf65fb595aad9f69a767546b4ec4300d4f89b7d78536316b308d4ddc69c167fdbbee1189c1f0201ed10ae59967d02f667364ff6d9efae14599665590684c12cf31b0994fd663f3ffbeddeba03e1aba6fdf631464d8b3b99c482a9f2bc54bfadcceb9efb13b6577d4f54bf3df73d0193e449f6db9f309ffb9e743f9f6c9f4169655da7faedd309a2df759f24fbeee377f3b72fa8fbf941db675d8e17042649d8a5fb13621a4a5821d47af282d077df0b4f8aa868f774b222b02dd5d32f2868bfef541f5d7d943df0ef5ef50868d37daa0f49f330f7db7b505adbc6dce645a120169a875f85cf85086c4b49f3f0b710816d751f816d715bc75c0b5c65448a46484748461b739cd7fde6a936e9619f07620b5ce5abbcc8e44212d5775f5050f7dd1795be4ef55d9196da77deca4fc706d158992c13cd54aefdf11290221ac627cea05c3cd3d8e4141a9fdbe27f1155f981d09d08c6172f03744c184444b89d0d7b54fe9ddd2a2bc6c84db0c5d752b9c5ecc31c83510a27d090004d5d6f3742ed141928744df0845443aef2cbe7973b64bf58c5b63b1d5fa044b9598885368812346ca9966a35fc5235361c2c2a1da8f2e5491aaa6c428a2aad6882a2c25a77c2892730865833b5c6d41a437cea0f9d1bd88e1dab50d31365d836ecaa578d45502d4a8e798a700e30747e4483615d630701ff467808f8c72d91bf46b02f6cd27d3b12265cc52e0cf374bef374fab7ed396f87c16dfb0c0ba50c6e2fbff9757b9e1968d8a36eef5f921eaadfaaf286c0487fee4a909fce067aa1db4f0814e186a0fc5184ed5bd273a4542faca3117b707d372588284b4c3e5c696de52ef422c153f5a8c4252e1929611f2eb15e4d40d5eb53e09f6e5d614e987a0151c39cf6b41d75bb9c7c8055270c5ebf438a2e2999f9c2a5ca2ff344959f6149114d8f9a7d213b55f93ca4537f874422bcfd895e22cff597144024a8d78706a857e4092312f5fa90a75e491be4fa1f4a507f23712872d151b9887f786879e417a5c1a286b5b4596179e45f1fc9f0f531e9f26fc3436adad46ba31a161a7a2696c1fce6bab22f5c315516e11f51d0a48bc5faff7a615f4c924275b087524328284c33de75cd2f26adb39236b5ed4e8821556eecfa0f62ed5a30927152127f611fa5a527c438b14f0cf9a932e7c47446a94ce5b4fd612590fbed392755db05b9df9c933889db38ede35f6da4501b29e4535c988b4f3d4d110089a9cacf4aacb4930292fca227032b5cb481460ca010634c5c2229aa4b5a5385082168142a55e4889214077644c40d38471c884a33552443152a60e4962723d8684f4a316479f077fe93b0a24d511742e060050161849a6cc081055169442d8898d205115564f89edf594a230d8b898be251c8cc2e92ca6009739a969c6a06759b9646201b4b6d3175630752ca2b5eee2e658472456fc3d83773dbd3c106a95de401979702833e48f68c0a2b2861e2bc35094be93dc0ca111f68d070a1983aa8fcdcc10e3972e6aeebbaae25a2df6dd45876087f8c31121531e843cc4595060d7ba8fa634becc3d5bf872ecc0b80151af6517f6dc4a00b21979e60629f3026557fefee8e1bdb99c4845972779c209a88d1b08f0e2f60286a872cf11365f574ff27aa1b31e8440cfa53a1212b1979187e82c5d8215cfdb72632da322ccb26cb68492af2c4d25043c43ed83b73611eff22fc230cdd37fa605fe75d4d75c1ab0bee1f8fb618fd75626425f689d59fc3f8f3d23314fba4e19f0c94f88925ca341193e1a790cd848c8699aa7fdc36629f15c3c499eadf45ecd34354c7d2b43454fd990bfbfc7806fd6723dd84d922b7cb4bc80e616c721b8b2e8f46460c114d88a6655f84b5ec0241667083f0d32e7441299ba32cd49ecdb107b9d11bd1b0a7f68f1ca80b5e3b04126317c28c527bb09494ec5313404ca879da11c010204294503281126c96e8c18925d654ff1e26a0a83fc608d346c8c442f43b29cd61f590408cf0168075c788310493531a6272509ad281aab484596250d3b44cd334ede330514dd2171e334a5253ab86c3b00f931393611fec9fb5f04f9432ea1f14ccf48f9366219ce752a3104b2af2b625c52f39229a18263ac5a778262ec5df328e4ada2803e2d329940506e32b61308c523adc7be53e87a7c3fdb67264396d28137d2c148f568d4ef6b1667fe3e964bfad9bdf346fa5b35ad16721f6e198a3c6b82971518c61d2c4b8a21afded3ee0c8efa30c1ab250ddbe4f67fb8f9fcef65e37f6517d3afb918b98013afbc5a456fcc299146c347fa09c83515a93b467a31e198ba5a980bda001a45fa854aed7343574342301001d2315000020100a0704c260402c1c15a55dfb14000c76883c7c5c361a089330466110640c32c61043080108180360a6c8b601f817803f02e34b40fc14804f01f22140fc04885f81f129201facc0b5cba4dccbedb32290ea6c178a0bc3475682ae980f351656936a8096686d4ad05c2f0616a566105439e5600a56e7949507f66151e5dc01daf0cb5bb21c9818964bf964d622eb1151519a8adcde0c280e75e80bc991f58ef2248bf2c283b2b72df56b854c2a48b94ddc8f03eeef00fb73c8be39e47e0eb9bf03eccb01f6e790fb38e4fe0e615f0ed99f03eee720697f90c3b02f12d6ece985a91522d21e52ad13fdcb3429f432bd494d86aefa5d2d125030a32be62f5d53fcbda8b08ad2fba296150adf8d0aeb28bc5f1459a3f4fd2858d67c0adf1b95f1bff3a87d55666514cd8f6b20d575b1b1efa1a85f4c48c3f1643e7d71d6a8ea9db54a0976aada3b2f98452901a7358e9201cd84b5b9a42305e2d4d243f1d6ff285e415c0c7508945d83df016e977cb3da2c83097a6e9e73eeea41ccc8c08baf2518323450a082f4cba4565ef86bc2b30d46bc83ae653ccd3aa62801b687ba3e256d8166e6ec37b0102cdbc6541d3218ad0e7c489ff7f8ef85898e61c20fe909760f8904f8290ef5b56cfe9f8a1bc9d5a0dd9372663e717b5a867b05906f8f7e9557e7f9c520b2c23d0852e87f01990cc637b7c5e1c5596a1d433a5c79d7157b508d9dae25ad32ad88949adbeb6982dd2282f69611512028bfb63865eebcf28563eb82091245ec3966d017b31c140a5cb9286f24a74265c22571b32271f2ecac99b54668979a13ee2180ec755cefb314e024964556dd6e52b9c4c7b52fcc07afe1d8ab88f40523fa44071dedc22055a95c382cf695a7dfdfe64a119c9613623580c0abb240caeeb59e466325b106b6410ff09e2cd60bce89259926e5d512e50f2bf8427994d2c664d0979409d4410cae45454974810f42a0a8c870ad024816920969da8505e85dfe1e198643692886d0e766e5443763acadceeff0efcbcfc077426055059b03eb430b71b271efc8c0fcaa0a41d53fc0b44a3bdc6542f08dce343a53ead11be4c0433dd70b9620a8eec4ea810c1482174a9f9e013a65557bf9ca10caba15f447bb0f5b44c1e1cb46f5b967bd0069734b07e39490d2f75c1ffa5f7818dc69ea76ca78bd3859d7db4873800afdc7421e5d53ee8123251edabf3e5807481d9880fea73f02ebd805eea65a138695cbc5649901edd9fc8f1f14c3ce0b8bb8dd61d439aa309defc39d50b1966e1a50ba28b98b37fa5b00e6f0e50f9e9038cdc86ac6a72361946f31522e58c90f70387c004e821c43b173494e1a4f1395ca7181885f70cb0c5e1fc8b0cdeb9bf1688c17111c16526fcaba2e25e2beac9bdb4eff9946a3bd9ced9085023918287bc2be00227367e82b0afe60673ae1844848b675522bd09a12bdb4cc7e9bd0fefcf5a0e8dfd8f797cb0d77ddb49fe4949aad8a7ae9fde6d5ff96f1c0e743dee590a81f90f9a049a9d0cee396f0786112b0c0a300269d6018f7e59c4e8931231a53a024484247ebfacf02307c344ce7115a55487c0fa510d690bb1c10ba3d5675d9464c3d81ce2906d98d8d8913a395262f88189886c735fb597d4897b9ffdb25f5cdecfb994a4b2c7aa60dfef1021c8e3971500083cd19a6686f44b6d59dfab6c9c46db7edc1534d2f1967b424a09cc3b9028bb8ee3ad8c2316500ec98296e2bbf981208a14d166cfb3037cb808ac15501f0642459b67c82b8cfa6593f285266cd28904419e4b46352e73f8b64cc96b3d0556e9c8967477c1656c8cb2f7bf43cbd81324fa02479167c7aaca412113eddd5d5f2721065598454b38c91d6eabab0090842ad5917020b9bdce0cc585832b2378d2b9171b2323c96e4355b19584eaa7067b479e8285a19d401fc62fbba5a81a54e0b3da72898aa721a2ce648d9ef0838e3cf9a8abd814321065905cca3a7750061529deb5630dc5c00df6e9ec8954566b759985870d7dbb605c4216851bfc3c8fc0830b172e6661714e180b92585a2ff449205315066f3e00810a09b825fe7b265e9de139e1993e0a675a7122a8394dfdeaa791d8ecfc4cd6df5dc1e27d893b09036cafd10f76393e88999109ec0dfbf1d3a2d3d732038de863b4b2cfe26e6d96475d94485e7a7c650694c5906d461cc9907d08948107f9c1f0ca1017f2966f677fd3eb485062e8561da12a7ddc77fb56e9c768909319914773d3d2fd0e28908b626e577bb5555c8c88dbe6648507763e966159cd7223981bb6ded95d323e594f32e78515246ac6b23b23cb90c686724022dac0297cb40aa6f461f4149d0d0f2dc149725b0bfa73a25aea53d6f71e31ebd3809f82e558ce1e62c02469527d3612e06fe0b08440e2591447b875cd06d019e286c510cb1892e1150cd5837e5a748c7f5348d9756882b531409e4a35378fd4830fc3b57f10a576d285207b450babc283d40bf52832b3e5b00b72bf8ef681962bc2267253882945ea12bb967318ffb9d8342a00ba01730b15adfcf3b380ef12f9d1f19a24f3296a95fcd9029c18c577c8f82cc6e5b03ad32639233734e0d2669924819f28401667dfe0cedd13c1e66f8fe1dfb9cc482e8d398285699e2abe4f5f830d6f35df01c790500a00cccbe4894fecec86323d1dc31ea71bade42dba4e1b0201814414f8f561acd58fe8260614756c6431a9c2883640fe6a1f97c409ffff07926091bca8d67d89b2b007b387e4ecdecebedc2339f7964d3b307996d5275a398748da59bed92a5bf59b28ba4455dad6cce029aa947631ffb2442c5400b439ce80661d123023eed42e66f9faa2b6275ddb1c1a7f1573c52cd05fb4fe5792f92411cbda2c937043d81e373d184f7f24620fb8f999a08cc768b0abece02771ff1833402c7eab7503c83742056462a0825850ce2cd6dae300030c07f6b3dd37c7c69c5f4487798e2905139904294f19325dbe8746a2036a89b1f7e6f1d3bed2c597ab8a8c778fad9fc5a3f276d56d99f7ea24c6d44299a799f4d44d9c6ced9c068092aab32b2f8e21b8c47d7214df64f69a9ac24cceaa9c588ef9682123c4e9d89108cbd0751fff18f0dc4b93cd4044a4ba9096b461c87fc25da65d0f949c846d12ec1cc6de55e98178eafa8a496c043d750240af8374c33133b28fcbde8764ed4786903086a5cd52bcf3903878f7c00ac166634164748d6e7ddca3f5aab477ead18eb3bd38b2ed19ab2e63aaf5bb57062bed47f986b27e81866fd5ad096c0f1e6d5ae654da5f06054533c0bee5a2ddb7d275143da68f606da6ba868f3314bc8cceea9b7430a1e55332615da7abc983d438adfed27aa8e5551513d48d4e7cd2e79de38490e381266f623d6b17c071fb1f038735213eef3c49052e7902b24109c8279c4e999ed1b88c0dea4335ab0d474b19de3b1addbb3b7b27de34d851b0e116e3ba4b8591df4a37edcc678661bc97029f48f63104d49136c90a22d516f714627c7d4264aeabf2e1a2af5a49ebefb0d16d585ace5b4dd7d60a8e1e126d1a47d10afaffce1242a7003e44c127e6099d014a7d9da97cebae69373588cc582b0f31fe4c5fac754d067342a6b51aa1dd21e13d3c95ad12f49393606c4108d30d444f1fa9a400af6e407a990e9c2f78560cf3042b3c7251cc46b3ff28950fcc8a1c4dab40fe15db48f0a05cf6d6fd99d5cf98e7a213c08a33f2ec0e06906703ba4daacfb1187cccb1b0ad10ac6feacb2fcf362bebc331e8f5a28516f1a640f3bc6b8e0be9bcabbe06e114894a613f1407141d49649f365c73ce5d873c8fa8130864bf401898f157ee17853db606116cd1a28773f721f030eadae72f571b2c33b32c069010bcaaf98964e38b6fe2d033a736fa0a6c0b241ae0cbd7f3ad8303a017fe44d35b791a9f1f5413b1b6c17b663bcbfe3c8be9c93095a0e1b0d8d2d505bf9b6cead1f41fef5dfd4be944d5eb81d4b27a7ea3fe3bb36d25eb6988ecf434e25d15e2d567f25f89e877a1a6ff13692f4533c8c3a39f625e46161dbf650135579ccc19193c4a55fff77b7f622af52b639603cc10704c6d9e5fbaeb7993fc452ba5502e95696d670c7e5a6a0409f22e3d28fac9fd46fc88a4d4d2bffbf26708986321e381a9bbf97ef89f233df12fa8c9c70067905441cb862a9730fa706d03ab96f2ca4a237c82ae9c114015753f7ead5dc073371a71f22cfa0e68977a390cac8a756ca001c9d3f144c6579b84fd0bcd11c5a95492f1bdbc5fa9d8792b2e65c24612d4df26bba45b194819ec9d727199beed5db9c51f98397070a084efe4b16f13d145c72fc335f0758e8aee410e80ed808dc5d9d5fbfc5cbdccb8f79050fbff93f4f87b7e8d20576e8782fcf2ae591bac1e1ca1963d43bae59ee1fab7bebfa70781115bd74c4f3e709ba370035f2e39a47691c6b3355f39c59e31fb53414bb00362d62aa1deb37b8e0a81f39d568d223e457388eb5ab3326f9dca9a9bf3be0b626c974286e86bfb2018a3b0ecbf4fab2c15aae9225025dfd6bcb66c84d8420b8234e2feebe08c0a7a2a391020765afc17a94b8d65c8a0bb44fc17a20fff314b02e037a57ea94e0e5ffa8d301bfb0ec1cbbf1419203edc5d2247536b3d666c57887820808e62e1ca6e3757b8826541cbf233353dceca07c66fcef01be09a4f4ee4189fc36234c6efc71a83e80a3f4e3292c91f7394c598aabb2359552649ef7252328209d757e3f73d30188453c5a863109ef35beddb8313b3158fb9a485a169dca10d12a0f627bd2818733b47fe3834e9e7a9c37afff1824f0269f584726cbe4bc039a8eef8177c6f6c1cbea32afb783cf1bf31de94698c15bdc09363db79d241a210a473608d430fa8466b5ca4bee1c5a62e36acd0add70deeb29f5a655e8349f32b3c3fb4dc82268f17c5d1feddfe0e6bad19f840154cea5d750a0608b26b9a36120b8b5af3013d2e9f8ac8624a3c786b19ff1b8dda2a2a64c8ed279839a8e58252e705bd54dc888ec968c8d4c4befc1564457b04ae65492da4a7593df8597df255945c27c606248d95852eb65980fbf91fcd09f2cae2bfa6d4bb4b392e035255a1e6a9d0f6ae9bcc7b4288a9b50e0ae658ae770a74a3e987364e7230486e7631e21ff5f677af08303b328c04dae3ecb01ba4ef7248a0081ae925ac5fb9c7b21992579157b9be0f62ccc7dff6ba6fceef1be496ab27e04aa92ddf348d8497b2170263aea976c725831f5c12ff4451569488f284efbf6aaaf286e71919a807300e196ba3ff6fc0d3459312694137b696ec7c401bc6d049f2c46093de76544d3a879502fcd2dbdacb9264dc5e1d53e54af934dbe7d35bb6980602c9b695ba7fddf660cebdc6c31991597efb49124c802c28aec858ae7975c7e70a654127da26b87c26d475efea30efd55a69e3fa75d75c8596a0789a4c22993b8e9c23b39e8af926c6ba14a0a31569aae88792b09c71f1c8a6fc8d2068f82a3717fe3c54349f7a6c0d23ffe1dc841e063dd1ca442c56252bf3e71851eb4e0ed01d1f9a8cf52fc20ba9dad5b9b7dce142e1c46ebbed0277748c6abb8e84a4713da8861a95b135534467ac4403e49a8d9d2a47a1307da049c01ea83e0de9592b632f6e254ead7c9c9a490140899c17b7569b32a900a563f8f2f65ae0987e22452010c5130bc4108de8ad292194fbadb4dfb070cc89c5f220870cda27a8b92898afe137a7805017aa649c12aaf1bf25fb5614bf22c291e6234c80ebf67764d6aefcf398814a4b2ed6e7dbfdb827392e44bd1d3f8d055451a1a65f85c2644b0895a74425c2075ce3c79fb04499bef6628a436614e1bceed7122ed35386c26d719e940515d2818e6e9076b6b62dc785c6f9d163f4ea337a00ccee81beff51dcd46d01128814d5ace71ca2fe787af8587935054ecaedc8684a2743d2cc182fd8442c3d7f35129852a2da4e7af51866efc6941acecc017241e4fc6a7818b8c86d7567126f91bf3946a368fef6ae96ef362c7c0baa9bc44ba1862efa6912346f4fd2d5e4955aa929cbc183540d4c90b05ea39316b4cbbda53823e3f1a30f953ecd9e76059870ef22eeea9f6400b7e4f8aa49be7319910a18a5d4acfd83a57627659c8e3cbcc53faffd25c447f089c6516d76092ae67d816e16680ff665f00ae950d749337193d824db4f01ad14f89a2b853d8b611494dddc3304fe99902d1c689e2a47dde01a98e3d5a0c4b82e25a349b3083835eda6252b2ecc8902f41fae7747a1566c229d9421c97184ad26c0e9d856ea886ca75ab852c4699d81110df858b846580c476c1e14df1e1238abc45cb55a28c03e790b41a3846ccf4285776d64f4ff7c0f84c1c6c74cd9fef087285de535ca3f11f0080637981f960574b1eae4e1887a5d5e61d25fe9b08fcaeb4251e4a9aeda6f6c4a362a4f2b2f1a74eeda26239d148b9c23839cb2facbccbd8780eee1e9a19a8cc9a289f97598d263dfd35ac8a3977296846c32f8519a8c251ff68b48676b776e1af6e0a414bf015822532c02ccb9c6931be079a1cba786d1f24cf305762c8a7b2ba90ef7694e64077c3c2661dd8d985d8ea398800a1897f64c1d4abcbd30c6f16abaed1299717b4c8512b272ec8d54f129b7374ce7cf7dd24357763dc9e5df30da15ac7dc8789e2220ee01278da7a44261d17716430b26926564af8edba5458b6b4988eccbadcbe259d6b1e67ff956f59fb3b958d406ef555bab7efeacdeddf9130e479cc38371e7d847332de16dea7344b1f8f3b4395d520475bd79fd9c01a46baf3e5e2abdd9e4129bb2db26f7b1859fdacdcd65a6b70f85fb79ea2d6cb13656ed36b16a0071aa0e25b6fc5579a952e119116dfd27aedb19d350c3696e02fc63c73a56c2fb3c378b6a92398631a0a3098abd8a0f141067ff017a76bce3fdca55e44f678893111405e2e7e46431b47cf2ebae9e97de344faf342d42b523ab44ac055cac199e2c26662abf5c8edbb60065e20e1fd45f1c47fb5eb13100a89ca717a54d42fcd6fe39dcab3cb168e139f41222b2459949da9dc8439f8229054e874f6c7a99860a9ec63a9c7cb3cede3b321e488b561008bba399e137ab338d819aca6e6c62ce0c045376dbb1f9291aa1edcbdda768c0caf02dd506018f3afd189c2e474e09b2b3e2626212830e2864e423a51b8fae809607071a0c0f8db975398dbe108b0330b12493db9c8f75342dbc6eb5c54ceb5728426e2f60946f7a8ebe31b76a9f661b6bdd679e226b31a916603f87b92d8ba75a1dbfaadc5844e1a5f9550ab50a79b4ab554ca1006b29a69a39c918085682a9004e736a334eec34df09b42f28a285a6454e31221e032555bdf1346927cee0b2e93e1f9d2502eb6ecbc29154170b39640d9b4c4a2accef122ced2ef716a377c3eae533d01fa8aeed3d1f85b7918492e7e229f8e6e464d40ab82601b80d2a673593122a34802afe6eef6e0beac0fc8fcdd9d42ed7306dd1cb77c0ce5623768a9bd0e3751cdcef7881c1d298134e11662b3d7a8ee15254bd0afe51391e83cca8a70a163017da91a3bb7af2636d5ca6dbf012e0b44a77ccab84b73ea499d5b27c14ddd72c9cb62800a160ed112c99aa1a6cb12dbcf6ef8ff98b37fca3662b01a2276669811d891171fac7c3e3792af0fad82965529021891c0d57ae54d5b56c3a9bb3a6565d988b06ddf2423e740bf360e0d0593afb86277d85670b331469a9fc4b56e672e778943203385f4be6ed5ecb8796b5d40319d2073f953b8e6cab4c60653a3e86270600011d5528e8b3cef2cced43fbaf2ce612eea9d5908099087f4905df6cfbdc1e1692125f245d435f7d492cd19bffa902ef2146ae0bd408cc8d32d3516a805c0157ebf43b093ae8413619f9afa3ef663f6687d7f961658bfa55966a8f1c067f86239a38f860f003735dca9dbeb3519b7919f6b91c7ecefffa059b39cfff106c5c973da897ed6a15b95738e48ac2a2856abd9ada6399c9c90030b291e5ab23b0dfd4a6f300da5b89eb977886771429b0a712dd24d5500ff095616406dcadb42d98f57f49317c1e47289b67703b2695c7d5ebe28ac00667edb1585a5d3abac431ddb5533f47dae851252320670224b67a9678618a87d51213affc579bf2e3ae6930fa52d150401928443f604fd02388306d1500106817360415d0bcca4bef75699a490d7d1b15590a692cf096568e44ceb7ecbd03ed271dc02b44f454ab1ad1b47077cee021d1c875aad1cf4aa44b161109a2431c0d6d4c001f1682868a0a4e58ab30e794bf539a4325c248f58228f6f58019f9b6f7de63eebd3d709609e9b527674b2a4a255a00aff8f7882bb5b2d1c8a40c975c48974d0382b0ca1089e248047b01416d467f6ca02f33bac71ab4fe21a5aaa17274306d88608b11277ebda71f2c960c12601ca8398854af60a8275dbed11325e33ee783e48f1bf70a7c1af4bafcad5f7182c1240b624c17f32291bcc549c7487637d4cb025323dda0ed952a0a97b9b50210a20de44eed1d94c5119982f9b88339a674a07d8b976e68614591a20cbcf758b68498e144bf2ac88808836f1fd02f34a68eede182fc165aff42aaa28e3beb6775c6f266fa5385b691d5ff77cf9219afd3400f17739fba41bfa12681d4691824cd2a96c706c6150e5918998d023b84a5a02f24d9dc12bbda90925d3c705d6f43d8da1b1779ee5a51f5d85124669d4db7b481440b92ce86213aa4d88e371828d9bab60a2d2ef5f04f71b4fd77659c34d9b72b67a5b8b0793503449187006477720250935c46a72feab52701f871a8ff5c1c9b0350661b28371e60a94a21c1e39ebe506b0b01ca816a54827048f430b8de8a7c548f7a172cf28f24d372a6efa782eeba27fd30915d05f362f8a12fab2f7b431adff6aef01b25319d3afd8356c5c92eb29ac6449812bfbbb5a8409c3de36c58a5d0dfc5c8c4bfaccc588102a06d656e049101337289e4f0fc4f2f7253e0cc326edd75509c2dedc8ce7d8c34fb99b23705f17fc57d78c9b4d11ad4bbd95d0032fde5fb6639b1d861b9e27e262ab9ca32ead72a417ac8ca9752661586575e7d22668fbb77b68808b8b7a768233ffeae423ed4547b7842de154258d2e0f314f980dd62ab5d75fd87bfc271989b4ff1bd5f4beea44e9ff306566961e55d6c6422a2e3d32d0c1f5d0bd571205527b36e853c24456d0b3d7670b31278621c85e29a386d4852904af3a3fb051e019f759eb1223d59e15760d1f0167ea114e3f3002c01d781c4d3041d255b7339338bcc86685c0426b1be30126ccf9ae308b32453a5461a577a6bf8543a320fc7047d406d8ca91d979372e977e37c4e9f79af6561d28332a08166d7d33466044fbe85daa27d338db8e87bd55d45b01e7e336b3f628cc68ba9229a9403954e745b5201a66dfd1494d62d623fd8d9cee1298b663bcea4f96aed0c871f1505d4d153bf1b6c7f131ef0c63a726d1f7cc1619b6c7b3bc635dc00aeac45c7ca5d47c77c174b582b8d425a7072f4a7c953c079c6eb85170dd1e75a06812adf2fc5d8e4dee5de179583b3550a667ebf425bfe86094958557099a2541918fb62db0af6cd00f470b4b4d20ebeb971fcb8e090f70acbbd468b9d7c51ee37617ceb367c94c8709c25c65e13f2c9122ea78641f7d62e722dae9ea2ac18632b71efb1ee00bd9063ca51b3267ca39755c1fd91faf42b6e21100faded67bcb98c03feda918d371f535be4d85845efdd5e681d6b030c9c83dd8a96b1c931c1cab4f87a2e5d8ec50a89211912382a3c283624144ec484a2da0295f13ee46b34af7a5db5b52a89f60851f9bdf756cb298dfa2c019702be9ec2677069c2753bbade584e6aed07015e7b2d76d64e88937b759da7da5678d6a2fd817a25dadca282af8e3dfddfc7d1dfcf34155a7f9ecf7e7a2d937f8cd852ff819c6a1bac1bba180ba2e616fec5bdd9350db1b42f2fb2e771222ccb806c78b051d2503fe4c024aae43af4d3b76ae1dad4c955e97e06ee8563c4bbb8ecd5091f0ca444bb0a5bcfb31449cc60082e86e1432f64442c40920b6886fd1be51d3f5e3be1b9bfa8293871dc46ed2e8466c346fece910e83addab156dccaa6f834c1e624203115a467f9b75384e6efd87f0c841f8ab67168e2c73143d3e06634aa7a677a2281f6475a6bca6e3721827102c6c683e79f209494ed3b723558fa428e3c39f9525b6a40ee79f357c3a107b34aa4d69137e91fd0e80c7bd226a11443a1817f827f88e52317b611b6bd3b4c1be7bb8f450c4038b494f0cb0cc6e1a9536bf420ce7e4b8b5bb796ddc77c22085c37ce8f6cdabf146bdb9aaac9780e7068eeae7d43e93d0645b1389c40f061b64ee8ceea59154528dc4903592ebae9c85181763b587fbd4f989f7a9abe35da34f89e8e101a8823e4749d2e805ca1da1112193b13f5e21617ccfbd0b859575f255c0a73fece5f49343d1002abe128ddad66363c5142241601a290bccbc8ec184b90e4fa18564c673b0c83bccf4114768933b528b2183619920aebe5b653fd290082099cdf88d8f2a4d32ff0fb4b53df6ebb6bfa23b446b26ed92a802d6ab6aab49cbb4ccf3daf3f6b943c64ac4c803824d2376cc29966333fa7a5b9f1d32b00394ad28cb74ee67b0b4ef5c8b7d80addf0d2e62fe7834c4aeeb7009a80c0049bf884737e7063411af767da7dcc5ad7f4ec0ccb4cceda536373d53519af8fb11bfb2dab2c8d25754df675546a6b032867ad1f9f984d478eefb57abc0a9415976499c2ccc0120c46e9990e9b118894062df3f2d584db4541c64682fe0886c169804f3b3fd3a23ef357e56db5f2a05f694c7a938a8f2a6af52bc401c19d68874925816986fbe7614e1831aa9510a94fecd214492375f9698ece8c384b3fb045a293957f42507f3bd6ab137495e67a22572314b898856ea1c7bd4b8b8994d3435806d6a195a78843d524e443b1daf36469f7826e26d31278c10c8fc872e48589f7a46a708c821ab657a65d46dfeef32c3e11d339f1ad311b849475259280d5b0d54937810d96eaee9aa7c1bfffba194ebdd9d2e63d5f90922b060ba7e4660c8002dda49482173f5564e8688a125cda2a752d4b8b923fcd77c6a9a59628fabf5a815c6419be6ad95f139035944079801972f5967135ddd4edb727e8fefed6cd089f8838d6d4e7cf99e5d13b5b14200637c7108b3599275002b617a69e788a253757ca1b690a5036c413e2787c5e4b60325568a6cfe8d5d7458b06241c06e7b854e0dbd578d1449d526ccbd848c6d4bced06ea7fe1c0df7cd33bf704fa06115697dfa4105a60c33e776b4a092a36e8114d5f8890bd0a58790df71bd9d8adacef44163811b4f72ca31cf7757dc8f0fba9d4304e51cfab91fd58d7c762530d41819f2e06ec8698ddd1599ebba24994b53e1f9116238cd664827b2fa2ce6710847c545204ef0090ea445e0c2d746171edcb3045e1cce66b2d353db3a510c815388d558ec8ec78e5a37a63fda6df5e7f55068b17769d4fa6a8e7509b8decae119d8e928dc0363a3b8a2d630f1215a638491846addcccbf371345ac996694876bc358021bba4cdbb95e8f213753de529b4d546df6ae2f344a433b8365769d6f79858209d77787f574be51038fd54b9fed8690cf7ad0263302dbd98b790689969869068c91f979c25384616461fc8aef8fef8c871b7efa08ffa839528f9141dbcc85b43d22de0d71814b93a680be513a8fa9c7242e67324e4f4e1a441ed07a2faba46b4737f342884c834d1d65df1041a683a2b0d0e396755bf9d1f71fa485f3491c6b8227bc48bfdbbfd132d34a42c732d0be73ba051c6540a66022acba99d9794cbaca9dcb91588b1a6f66a38f8debbca3bcd048bc2191d0c6e875143460d992dd361228e96ce18980aa3e32eaaa57966c40335aeb897c63267e04e6f477bb86dd8ed1359f8084991aca65fca1b48ebfafc17d00414a0839e76cd37c404565b6e3c1b805e406e43c936c7fa026e7441a6867259797493463ad32cfb9afc27340f8bb752d19d0624b256f74564022d9e8e6ae78e1a70660b4452647fb1cc48f576e66ddef04865e95f0d3e11f3cb7c4a5ff2933a0c99d7330e7431846106201c6716c0d388b39c684198362755f33d0c409a42e88b77082e12bdcf14462cebe7f7470445763ff37fb62052a2c2f5633cdcb838b2d8afa37cb55c9f6dbe8e2b6218f9bea6a18495fa61d4540129db92dc052f3ba1fa5e60b342a9d356a52ea1acba1471c853b5300b15b776c33b597fb7ec064dd92be42e6aac93f5b9c94e45526f2ba90b5de2647ddfb059a1146a8b1217bcfc74caef8a5d0a4d5d0ba51739ac93f5bac93e48a6d669087ccac995cc4abd41d513c66fe678e827595c90acd2375279c6909b1903fd29864b512b017a9e2c292731f91b42de5e78ca75f57bebd9c445bca16490b129e14059a254fdc19df894d72e11fdae4c10b9e2e5cdee351a9f22b9540915da6008726b095272d6cd5925f2ff7bc7ac1249f0ed6e6218852de7b5a71456c625771795a5c1e23eebec875d346e5e952c1a02063e88d33a460fc6efd5b175a6ee95eb320510ebada23d36ec7a25a2759fe9a222c2ffeaf609f5447bd6f0ea487a6e48c5454bc8dd0280f28fe07e00a1dd9c7a8ebbe10b44a64fb90a8d0959ac9e133d881a186816ab79c40e3738de65db857f4ead8534c01484142d2e8465d13daa580ad3147286e0d365564c581630e2a61fecf6f4bedc1ece9fa0be0036c1e8034a5a796c4e552551ad9882d0710a211f64ac358425f12cfc8b6cfbabfb480ef6f4d37a29370a00ac24a68a8cddd2dd4a44a96f932e8e1edc828b1d5d0d4c920c7422f297649cc694e3fd522a00a2d28a54f3162c54bd827da9ecbc3ab7d95de5dcb3659ff65c4bc67cffc2b318be9770554f3558eb35d0a1bc34112923ea8a21d789840c74ebc2314f16720f3a1da9c8e18d54da80d13d119a31865d546485bcc06e359e473cb0625ad06135569065340d217f4aedb3fd8f632bb892a5c6470ebc3ea519da5c5016079395d5342506cbf6b6ad16041ba00c9f8d4934306cd7b009b8960e774f2870cbbddfc37a0c67d17199014ef4847838d7678a39bbd3c9c528c231e696125d03439429bdf369078f03fe98735611b68a15cf952fb32fb0d60f9544193ceb46039cbee4391c80362c9e4b276ecf24e3cf1db33715072badf762de6d04d8384b46620b9f18bc8e816cea30d7b040fd6295f6725c90176c10b564d0c2d43d9f0b70101389af981c7784f03efd368b4ddea6e41a85fce8c32796b6269ff642c50d908e06d3439cf27f628dcdb93f8b47f021542c156892f25778a5fd60cc8402575a2f3c535c1ab0523611c5640ecb8cdccd3317126100bad0a0e94bf2a36cb036ed1aa861699aa12d22d4ac17c9cdfab15324fc4f562f1223d632b06a5911d6b51c4a0dc5bdaf14f0359394ae70b2a1f452944d560b2bf503e8b6a95477a1b2d6a641e572e7fb69aa27a36474c83515fc11c134dccf32859140696c820230b1ec330978827565b815af46c03f9b14e0a11d9177e13ca2d1f02b39716dcdf6f147c8488cf482bc1ec196339e6c68ec29a8bd44c8fede80abcb6d8a3665a5be58d0d41787e0b7568ea87dab4dd8b21baca415cd0d668b8b9f8748c492cbb6d2bb2893a8b648f32aed48cca769693291e44cad31641a583e01e7f96be661cd0faa0128ae64c5215ccde1c1d49dc83f1276db512e5614be74d60dec1748bd78bf6aae2f86caec795df8e738d0511ae19a2b179de91697ed52eb047a0d426375ca794304903ea763d4ad0c2400d485ec5b9826e4baabdfaf649f91625c88dea6b99387296704cc9b51c903cb60f25820cd37b891ab05d77f41c92a1264c438970e97a7dc7be9f1b545d3ae6b3276152c298eeba4a5d2b946c68eb2fd6ba5bd65a35bf31a47a6ee7bae6ab727a1fbe7f1b19baf79e6398f53918ae8656b2c41d1bf6f9427068a8e026b023305b9c30961688794778e156f5866edc159e1c4505a36776281cc8b05986f178e75b908448804b60d9e0d4a60922581dad236ac68dba16006a815bd486463c2cc462f5cc716f1d26bfd2edf426760bf49d3d7d7dde7fd51f56089d4c68a2161b1b9185f74b27a1d731835bf9b651e0e7396403cb395dc7747c326c7b6e5a4f48d0c4a80c2280486934303a8f965320afc77a6a2d01601c8ad6f80853e3fa874d57cd76681fcceb52dd007a3bc022017da75c02a8512fbb1a5facdfebbdfd2ce6ca82762b2cd0e0116c8ef2b1bbb1eb4befddbd2b11546b62d2f61d947403f3a5002ed9a7909a231843d82a5ec3bb1ca2a80018e4a0c04c10173568b1a403ae3c6a74414a1a6b1421d466a9c2219a372b8d3e600771abcc5c53b1218653d496a5705123c301367f5e5194da3be20fdf52310dc504770af39e76810152232d71f107cda6c6f322c847a172ee526efc28ccce99406684963385565d93598092e9613339ad5660a22d665e5329dc12f226b46f06f6c194401fb43a9d99f094d40214970902b8f0b1994e5c10871889eca4922e10ea74c3dcede700f745c5440bc90062dd07e3ee3c2ad81b5737b5c300a4aab3717b83d0e90d0bbcae39ea2afe19721444742129ccb17ac3ebd5927ba7114a06cb83209b9c4145bd97524e22fea23ba08c58ae51b7d9f381d443d3a90430337f6c5ffab7582e66e9adec0b85b42238091bdd9b5df1e62260393368d9eb108249d12db23592d91843481257e2d077b5202ab8e9462553375cba604ccf0a79ddd289bcbc183d5bb5c777543ccc0d0ce15bcc043eb7af82925d70699ecbbc7c9062af5d0ac5778914201d5d84fd44b2be364f4cf2336e8b248996f3081dde19d5568684fb1e53fdd2347b1628db45035354833d44e7ce1874c4354110e771004e369d74906d2adbcbcbcec2da0893bed60114be201a549fcded8bfbc017e8a35c566e0d5646a39473528fb314a31e6f5ab098282c19e53c7b3ad7f384d34d26a504f696ff7adaa8bcf4118645427b193cf31f26fe1547db737b2ef23c307f6a03c42c29712481f36a0e26e29f860a5a356e1cf1595e860064bde626e1693ab5f10d64e9dd0d66b76eb92f272840605704a7c5e045b2089a9d744e3fd135c14abe743e19f30fcaa08f9f80238d8744fa33a3357d6a7e14c6eab121e375ee79f6f5775ab238eebbcef1f3429402bd7acdcca59b06286f7b3e6ca00a889902b0a3c0ffede7781e7c24922cb3bbfdd78c9666e9444348e53d2be90889ede61db5330fcf8e91165d0a641156fa63ff238a47ec042e8768c1f197bf948c26bf03f7e61d6688f8867af93dcbdaf38bfb06510cfea764ca38d33c1ded055cb89a1a48c1ab9a2286e8ac67dae70ada0df37c9b2ccefb04a6a0d66c81f301cf3950c1bbf2eeeee303b658ccad31240873b0de441b3595d968ed081ed59183422403e7f98adc23860c30c35cbcecadb1832c96b61dedf55e4af242814180d998eb8af605c60c44360fec3aaa35a4b7dfae3345b732fca4efbaa19e462606d96d740137709a900c6ee4931910bedcc672b8b04cb32e44233f56dc94a41d98c3c104dbe5bb422589e011f84a96f17561281c63522aa717e8fed5b723e277a8ba5bc89e0eaf5d003b4d78d10f0cbdc1ed6dfd78085147e79cfee418a9836f0543bc1b2afa18216bffd754427d52b8ce92578716515333358e685ea9c5641248bef77c905202702a26a4eb55e20e2639267343f1bb9d4451a3c36770629c9836025c17a9cfe2db12e768e07c092a418b5cb5442f4b2470d73e6ccbf7b47dc80a4c86ded5cfbb0cca6763a7db82e06e9be2ea3cba2be3a7be5fab7e841b5884c0c851fe46fae6430a888f937652df689582ed27e0782d8d96783f2416b1d9b656c64770f59a9da5d265f7b35d3228f80e9ca7c031fa28b04d346b94a71d2cbd9b8beb5cd12e351bada8db149ca8d7543e3cb231c179c4a60be6a42605572ef8c7ea2e9079fc3ba04e91df00e85f60a30ebc282d5360a8882301ee000648ccb937709db5f121587e7eeea557d939e8be782d248308e8ae907b9218c9dbd4a6371e2d05e752fe094cfcd1bd8dd14e753c2213215b24dd3bc44b5b318521a830091d9be2f0751f62a8ba45309626269cccf8b87a7f4d8df48ae0b6f6bdb0e0d227abca583c211f37cf87f8c4827b73db5212e02f8d89e4113018411e53a6d0c7f1a85338ea179f68a263752bc6b78f5878009301624112dca8c5df5aa0e8b8502ec0eba4cd04fff069c60818016fde009b42af93100ac60e1470fdbaed6b105924f27dde6495e1474e3614f276db9cfc4bd9faa32d8892975c6bec83e516bfa7305cca5d6639ca99d1b1223e488b7fac63c7b1541e8801e0d0d032e1e14fa5afebb4c6cf1bf7b8d76d92f53153f5a21c84de1fecffb127f9f9548b046e715e6c34efe93b934e3c5ba4bfc3791614ddf95cd828f788a2167a891062bc0a84518c4e5ed3cec61b25299558cdb03b9ad65a97d653e0a07f0d868dacf114aa312badfc5c967842695cd54d66e2a0378200762d521432c1a8670187e382fbe1c306717852a1bb0a3b7a2a13c891b05d942550983fe64e39da967c02289ca1b1bf3c71d665f681ca36c8270a97d432d3d3e84aaaf85ccbae7a52d106c4ebf780f4ff001eb16d756efd43f543b899d840e4fdc4746bab0d501ddb97b4b953de69ddbe078f3263a97d877b2b141edcf99b2130a937e7a1a80f627ccbad3cee9a7f1df52db49c9761d66e415310dca3dacc7f4403412ccca09cf56ae13215135e8159871d2190f6cf6341bcff1294093f8a93bebc0ce6ea2be3e5694bede5ef8cd829ba9be91597c1c055946d389b877438b336c32d525e9487620754fc913e3a437940c6f54fe42b4cf8b274f45f24d6b60475b4b421303e4eeab5797fe7400b36ff5eacaaed628d476f619a54c2bcc002676850d726afb29f183ed20833ac2776a2e285eeaeccb31f8c4065131933696ab8f1316f2db985c5539a300ff22759a89b0b5359c5f1ed700ac72874f0d80a7df8a482bde43ba0cf99f6eb51c749e9c9d533fa05c558cece71897271063d453062a16634df97d706be76aca848327d6014ba8280aa9d19b56aa8fbd33660e6a1a41116d8d58da13b2e0a38e1d7fc51ba0e6a0c817c54f195d4e2e9180e5bd6dfe5e012033bf4031524e84247a18247a973af5a9d53e14ec0a21b77eb6b846b367efa23d5c940480e4ab4474030873124438f204d30401db2191031b1eca43f19eab54cbfd9689c3f848a28d1553c8dc0cf24a9010135984bfb085b12cca5614f473cef4d176701cee89c924746473b494ca894166fa18cf7072072677bc4dc9cec5de1f2b0f1cb38f258763d4d018b3eb222511252551c76403e7d301f1a602b71b57c48490dfa91aba51d913119e2ecbf68ecf58ae88bdcbad6e5b933876fa5aeaf0141da7c1672222af86264e9cf698931ae8d5f9f486f06b50488653b1ed2e8812e804dbff33e8b9c2020567a3f94b0c15ce61c09b8f7a7298cf2c067c541162bc36e67c00edda81e1aefb884e2e20e421422d9fdcbef1abeac3dba4140367aa27b95ded05651519312a564d689e6f53826a76ffbc05892c4b7138381223d5218d69796a76807d2094ce1b02b8893c7d740538a33d4a14fd94e82bbbfe508ee52e272f639419f34fb2d348bf8e01a3b115ff5d071e5a3969453522d6a8b49592a57ba804f974a0e975624b5b99ba88fc147d2922d6a47c3f0914a086697a69048c6748dffea85e042f11c2c25686af4663ceac2b395bba457112f91881ea36d09358569c902630b619bd1368e93877b1963d25e02a637d2124963f7c3746489b310a1c7b92353e1cc492d5d370c56b0cc73d02cfbf5ae15b79e908c4f4898d31ac0000a192c57052e1f2ea63dfdd34558e1a654100c8a48662ce2044d29742ecaf2c28a96ce331cb0b2929d41b095c1d8d5769df370a8cf6a171248280606cbaf7e216c4995752325996a4fa00d3c599e3aeb072d7b2222abdb0a52bf3ccfe8b65a7fcb40a4dd4289fe6e119aa869ad62fa5404e855f37a278550837d0465db49a70ea9c88749154f405b7150125240b1d5cda6e23b413878c8ba4436978ffe81ee3e552a9266b3654a2e662e545d31898d89bf986fd3b359fa9db5330e5f1eb9cdfaf06a713ef4a6890bc5a50356bab45c486f95aefe9ec106dc1918b15eddc8a87fed534eb9e2f90913b325c6119c4c8fda61d97b0458b35e11c923eff73485b01147a89a1b8c6592ee3bd600d3793d0db8ff5ffcf7bc96177e4f25602ae9bbb21dcfb6f79abccbe3849281be3837a481081f247562467cb0f9137bf0fcd652ca88ac104227c52d731cc032cab5c2c2b2be4a6f6eb748cb93ce3a229436aa1cd9da593ab3fb85bfeb37c8a3b99565a531ab92c1b1a26cce2df78bb0991904b3806610df902a59210e8165652431b13caeaa530353a5bb496bc7d3ca69bd68059d0704d678acc8cf6a0407ba2e25fc609033850011abc17caf4955a8ae2d2b4316690d4957674c0ca6c51d5748419f038006aad6b52971c63592fd7df165001648b021f9a77e0910c04e1b6dd93ebc77a163b6cd73324d7067d578be5d6a5c9e87a5dadec4c561d133b06d4c0a1aec143a14308db513f084e07081971667d388afa9df22dbf256f9c6acc142281e485fd987900b1a1a0455fbc902f5989f2e2c243e97859b0fad2fe8d11f489c09d0e1c8db046403914d8905de5331cd6254da585d8cae1a9e7e1e4777dd42e5122fbc6b481cd541dab0869e6790d43e900d2b439049f970df8358292696f75a8ea8ec3df9ba96e386bc52e56bf9d89116b7cf3f387a988414610064ba6e3f637998103efbd1eee9cfe3c8340c6d9b9785d063daaba99109c02e2a4e4fb83fc0bdabcd703eb71faa02081d495bfd5e915b2693a234a6b2ee8f65b832ab7ad4134ec9382af2a2218b101287a1c57f71f38d9a2565da934c352587859a85ada22d1e556fd96a415d58027f408082431c086329eba775a0abc58f0cb2c448e5726ba1954db757a1f5090b6b4cef11c5e52b1ef8f4dbbfc57e1edbf8655f74882425130ef0fcfcd372244e0411771e1c308eb4b6177c08bef0d35e89e15a0b830740b3ef74c157bf0cadc2a85e77b90e0e2780debb56c3fcb0ebf0489e5a92c2a0daac6208ae80a1d26c2372cc36927e2fd2977b10da9cd1f20a34801a3f951b2990e1f8d32a391787fe1731058baec08264c525788958d2fc5edd60b02c10a0511a03da2d11af9b008a585f98cee2f0351292d81864398b299ff534dcbea5788f84bd8a5ba466680044a144683f86e83db353af9ff072364009a2e0f6067cb2f5521489eedc8aaec783ae3fcd720e8eedc147a8e34cb167413cb056c38e747ea4e71cba5d1a4643282f1b84c664cabc47a7e767908f5c205d5cd9d74165ae353b043273d077aab1ac025b945820586b3c998c64b1b006982b431963942fd4ade8c1caaf525f34dd04bbde5c1f905a7adb51ce174ab8eb4b045fc3239f70a95ccf7523b6fad7e43afa26313462908feb2d6b7db7914fa8b6ac973c379684d133366f3df6f7fcf680ffb1d9abbd0e10b132cbac9d98e80f369cb37a04e2afa4837b987dd5f943c1c4d272db1611d6911b91eecc71265c6ac7db06bd4a4c56826fc13ff3bfb341152f0a9f3d498742ba7beeaf05b8a348101e6defaa7908ada24fa4cb00e325041c4a91f9e7e7db66bd7f48ecf6e251b8dffe1ff579859030f57455bcb10366c0e9f960d2b4aab7eee1abea4324b2d8b679070de92d2e9c903cb1ff15916bbc2da4ab8029128da753ad7fb074cd10fdc5cf566bbbd400f2b787520b0f6ddbf316ddc8096b8a9cbfcd575cc6a8b9ced09d65a2806eaf2fd44b5563dd428248bf189bc532c1af516b0750a8bdffc9d13fa42609d5a49018ba9169e6e78f1a4c987799f29a362c9c855cc9af630fb001b96284bf3ce9175abc0a8efc84408c9aeee625d42618b38ffe6a115c96caa35757900791e370bb82fb97c5d9a19d36824fe6f95785ae2fa6ce95bb28faa9e4446bfcc2edd0feca8057fe640c04bd8bfbdc74a82397640d5880f99044d107e3af28c7290a89045d1d374c33cc7059f3214a1ecc31c854694de0d0d4378b486a1c314a4167b430683e4ff6c147fac071ee40911e383b7456bdc5eb3b27e137b242ca0cf44ef2c6e37ca64f42dd2d4e799aa728d6202e9d799db32b96a4363772b63607dd272e36b1cd471bfb63efa40fd98dc83ede95e27e1c5d9470f0bb53a0d94e5f4da6287c39dc2f34bc6428dac52f8c60f61fe21dad8471c0767ab872b90cc3d7ea3af7034c8a11e93a1977f7783923e291d740a18bdf1da9c72de0edda50d90f1205a442e64170aee040f30dca2bfacf52cca113044eee43de6a2db075c855703185b30d79a6b892805e9831b4c80942ac4dc3c2521d5813c884475c3d61e1c3159eb8b643ab7010c7bddf3300766a1329ccf36b3d00ec345d4cfd7c37ec6a310eeade1af5eb9ea269e764a048c4b44ada4943c2e4b28536a4152e5392b01e305b0d70f7b4214492e764004f88564372572913ce3244586a32a70ff5393eaf130195531aa95f8030860ef71143233ad9752b30451bb7fd39455eb7278fc47f8e17f181f301bb5ce02a9b19189a20c7a66b4eab5d158cdb984d258839859ce00cf53704371aced03ad453fc52d9c4ab200af40f3a6403c56cae5e577261eecbf06898cd9141d985821498ad0ea967396854e602892e0323e7d319b12ee41deed1a99b01fa1c73e5a0bfa483fb5984388b4293f705dc3fa81f30705e14f13e34b07014afe6a16ba52bc524220cbaa75fe2560537973446b8ab589671d89a3bef69b6c26c7fc15f3c08937829302689e2b70b465ffc4ae3d4f214becde232ae412e47be65f798acf3bedf154a96c8025ea0c542187c918ca9b6c2bd67b4662e39c9848b4790fea68ff3285202c6212f8d6b55d4899fcca4caf84c85fef681e58f2e540d12ef5ae4a3d10dfa1c626e62e870978ba420b1b07503e0f05e93188066407525ebaf26a7c6b14c881742e7758b8fe37f3e292363102abf655cd6300d923746dbcde85e2817423ef33ef3205a592678750c543802c9acae32e804da220067a729ed5923be92fd80531489f2eef1252ca61bd80a9cc6e9634e3243d049fc58623c71d4abd3410dfe6158e29654c0b9a6a0d31f0f10acf2f01c4eae0de762e6efcc6858fe2115d3b362f38563f7fe93704fe0a36b4e14b605837f2d6cadb7fa51e4b709cf6f30d1de20430ed67567d58049a302273a36012b020acd0bcd255c6cf92fdb1c855b417269027856791202e591bf01ed8861e66404ea85cce364e4ecaacac0b793263eb02ecc5918b4fe08ac4bf63ccdb7e3641b2adcdd322829b4858146b0df2ff4ee9c27111157000d91136df7833b49d0723b49c881a9eeccb8ba8f69b874a065bb0338ec2cef2427f601e61aea7f44e27c1b594d75ad1974604c7d5aee858f116e2d5cb37685f271e63fc4f60199c2536ff8e0ccdf824cf7d86ed6787687dcddcbf05eabef510ca6a42fcd7d32fa2fef9b752db835beba5ee318d835174acbd61d9a1015aca39487468b582222bb304c4555b307d80b83cab997396dbb9ede9e31cae5918bf4501d6e41c47105d7ccdf3e5428a2c475d461e676042940d6ed1490671c23b8ca869a8081c87c8529c7957e177d452b66d5945900a10b42cb41606f5700d2ab8c099bf66b262c9b93916d89ba82d287baf91217d06ae4b2133f588019e685f3d9a837c066d64a5e709b4f6eb19eb8e2da83e8665050ece1268a8a1c75e8b6e7c7b44b24326f589eb3c646823a6222883f267388cf72a379bf0fb62df42999e11e678fdee1483ef87f7f9637ce5946534d507302bf892fc28f22d808694370a20df0102136c2f5736e278201fa04a6f1ce8d0138a5117b56ea14fda044545fed05e64675d73e3aedf7a5bfb058589df18dba18ec1c2962da33f1c53d51bae7f85d2fe48c130364ad48208f8c68b1b7bca675c7dc6bb2c5c7e78e09334df97d13cf90ebf4dea1e291cb70aea2c6be0e543a6d50714ccf8896719cefa253a13ff8752327e16cd0964d279c0d38285d1841aa88c99e85c0decb3262a052612f91cd5624862230b8cb98e10e32a70177121e0b352cc0003a2c01bcb6bd9563495a74a767df7a27bd390be94887e25e8a549665d2398b754f30e7aa2e385eb57319a9a2e885d773a93ca1c8279f6706661913fa1bf52aff793070f386b747cc8440b2141d9f5af37e16debed3964e4cd8e04d86e34e14878e9052c3d6aa1630cd3bb904a976c6c5afd373f6edcb53b7dce69f7d8f1f9b021eb45e5bb9dd8d2a612d4f4494a8a69a5664450a8dd51d94aaf144124a9211fa971c442d9f82809b1233406e3280c8e0cd424cab1338bf404af93204d9fbbffa59b99696762bd6534db341d722ab0bc01881ec96b429e4ccd56103757301aefd7252c43c8cc9eae857ebec19d8744ad459fbdc92db05ce0a94c28967abb7790a18a05eb275a13ef16746e2bb70ecaf5010da2cc9461411dae9738116262807095cc24935785ea1058e0762f8351f0dc229c2d89041152bdedb1f1bf6993ebec3ca79cd7b97c4876d6881f782e4eef2dc94bc7848e551521d9acc7c5b9a3adbc4fed8adc1eca40421be24bb2a9691579e78c936fe27bef54f6e0345b0ccab31f35225ad6e11792e2b38f6437de4af708d8a473f14c2b160fcb5f14271f960080633a07c7cdf8736cca7adb6116ab3bfee50912002573d4498c3494fd535c8251454263a88a41133ffaa98461327ec038c45e6910347d4f6cf892cc7e9910a22e4321aaf8eb80dd39e34bdfc8ad42786590e203eb341018458add6d74a579c1a7e10032f63e1fe8a44edd51d806830d6998475b92f31f1913837575b32c29526db2b785458cf44a049cfae0746b5831ef679cc8c19b4c7072c995c79fccac0e6684d1fe3eee459d8fe2bbec90b31128e52007bcf4ccccb18abc9ab18914851a939c901632673300169d342bfcbc4ca3ef0d14fad3f9c9712c9000cfb7da2d6b008bbba199637754d4bd6236d41e9378c8fe4260d92eac47ca5534e7a4f93af1b32746ca577dd133032a45f12f2822c840fec556a5fb050665937e8e0ac4829c276b502f31fee8da555c2cc2cd26e41cb7f2f0d5b2126b01d1a008d48e9ecda0a61a76671db44f312536c8973ba1bea4b716d618a0da3dee2298a2bf2312dbca0aaf237d65026b3a029fe5e614c7b664e68821835001381aa4890bda0e8c20d62203b66302be7f62f80c03045e0d3b4f1c815bc96269d2ed1b466c4ab8e89c3febf5cf7fccf98cb5f151387e4adbbce2675a243bcdeccce0b0b9ad98c35a468e7a4a718d541550e586ede0f736a3834bd5b255fc11d31dec3a671d321bd3ed873bb018900781f9bf76279d882eae966cd8e7607071413e82f97b684011161d68250dde208479050ded11746795504b14f4d5e3cc3edc9622a1848091e1e8e3288473d32a701b27c1cd808acd4441bc9b5188a7032d35157d4803dc98a8dda19f2a4f0d27c5d9bc8245c774839b2235f12be037466e57051520cd58c9d36bbc0b07793478cc8c49412088cbc910d0197bfdc7c6dc08d1eaf5402baca01d71db189101506641e87ad891b91d926168a14b4650c8ea5d5761b85afc7c4b55f9bafdf021383742af5fea022fd8a9c3401d318490020529717464af5a7d89a3aedc521ff1d9308ebfce3a010732b497857bc34e842a12f303c2e88c92a3c45491af74187624bb3f418e6ed4ded60e1b777c882f0879318036c4d48615cd84a97fd3f7cab27a44a2d83d15440d3b4f5c206fdb6b816a92423f42dc0471c8fec076885450b4ba4a55069c12397d6e066e2d6e2d3547c22d1db6d4277e91ad2ba6d59b0bb603683fcd98915970ad02727d08f8b9a085ed71030a9bcbb8db02f0eb495523c955f42e0eec49e9e6f109a17e541f3aad4ffff4169bbcc28edc37ebc997a88415f4c6168cd59eec406fe082f1d5e9faba323b6e6dfac12346c3ce85c6c37c81aa90a7b02686e4b30711a8f3fd543d25539c81ec06c685476c0cb5b9c0c538835dee82c34ee331047d32abf6d45e1b0d2258d624b525f2ed571b089abc7657fe89bc23b296fa4fb74fae67eb5f4fa8889a0a9b3ae993cd98fe33634f733bc65b1cadfc7497998651f91ebeafcff4eae8e8f7415789cf2e90bcf783972480a400c7450aca16fa2e562768d7c703a04fd17975f6e0b9637be998c0f7ed1d33b07560d426148d97f47c69e195b821da1d44f0c02751b03311062cfd016490a3c990ba70190f1811794560291e023b225eada945416d3f0778a42a041fc39e84c9d5c9c4a8acf9353b0999d4591ec8998b28bcdfda7d1f202e853fa1a4d3fc2ee218be4a7b0562ca018e0e3d0ad762b513b45de39b84e0c2509918071a2beec6678d25d398a4040d1248c3478edd5e5b245ec761d64ea9750ccdec6e66516ba9f539e45bb2800fa5be02967445d0360503f0946607b532cbadd6a93899cc1292b231355f7fadd875f82b8057921c78c20d57acb0d6a2f47713e5da0cee18a404f9051bcae5ff55c102f4d74eb05eebadc874be50ccd1f891e318eba0d07d11ef163b95d65cdc6cad826834e1ad619d8a1c4a7002eaf608bd5120f4116983a43fee5d4576dac32070b93d5c6763332faf43c2ef931abef754768342c20127110804a51e2cba3efc61d0bc8c3dfce9d89bd4788edd722221691d811787696eeff09396c0d0a8ce2e7acbfbc05cb24364ad85b8bea0737f331f7d5bd72b06abd47acb10cba9b54c19960f52521bcf7225c9d98d9de0059cc28e3819ac66fcfe7654cd18d9a47d84dfb8c84f85ff68e519667e9955f5291bee500418a6a94290f00e5151bc74b78b2f41287d6970a9f8c5fcff931d52abdcd929dd9b35b3ca98a59a161e853b5280e10254e495a79bd4be649417fd449561205046d00c74ac4103705fc7297d35c846b8ba06fe29f6bb598d434d82af74c3a3e3baf898401001009bf39ff9961acc4daeab4f0d39e463055731b61e145694b0b2e3fe512759ed8945a82891ef4ab655adc0c43c57ac7aeb073b7d089ae7c233aa85a42ef4d22b52c11f68ac1f7d49ac9ae0c72682422a25a7bf84ea728164ac8a52edc76285c2aa9e8743083df4b148205dc4194986e9d03ae52a786fec6fbe0ea8c73ed4ed2c7c47cd3729f3edd5bd9a96660c854aecbaa986831feb7934511ae2756b0c5bf7cea60c6096bdc12c080ba09bea3c75ec8f17890430802585f786cb05a913dee0de143029f7a1f0addfa284332be21dbed22a761534816785d57fbcd53828e98a144345f3619923ed2dd18f641a186643ec81421ca3f32e84cd1f4f4061a9b638a320eef509c1f9933bb172472a3c3d3fb538555b8ed85e3f4a6e5c35866c1bf64ebaef98e6116586c1d9623948bd48cc1f929827cded45ad5c1de02689099a1a3d0d600246edc52e3658a37af4c639f1ba214915d41a0bd0fc175f40d7dfe6ff5cf267b24b717aa7ecf962fd4c346e0682a61f0085c84c34ca1ad4c0d3f86bdb44f802629bba454f35ebd1f3e3914778b772219e118b348f73b86e7b72eca2c6bcddad3dffc1edf030f8f612f294f4826db2d95598071a89e81961291973a61c217e68f1e90b5d9205bb93322176fc628166a62c55284c2e488088beecbf94b9330d08f15f90770f32a9dc3e0b785e21734d1e98963d30db3f51ed7cf6d151d02be00ffcfecaac8ec30713a3cbdd1485c01d0cac121aa0cfadded458b9670ff5abaa8f5304010a97fadcbf00dbeb906b9477b7e82fab176d8d769c0b6cd3481d43bca027872b31a3683d30393e10ebb5de691f410c7442d01d888f4e00d40e0f9936400704799301b251ca3ab0a746d89eb5aa7113fcc17f5ef8a933e08fe6f2c003f8adbf11a4c2ab9759e8c3528284b18a292493c1b65b931e776c1ac41276c6ca90b586b91e6dd79f4d5bebe48cb1b4c18311ccfb7a237f49d22771e4ee511cb16a30ce888349a4820d15251c9ecdb7122f601a0a60e65be9069ac57c106143fa976c479faaaf5cc23d1228e52cf3eb34c563313f28ca2b67c0a4c9dc95b9c39945e1e66242005e67bf231b90a19ce5b9b018312e09ccec203c2fac2582922accfdea8e8280b818fd217959c9da1a8feb4adb71524d4bf05b1ebd94808138da0e4732410770a7374a59fb99128f31dbdd37abb7fdbcb704e976eadfa951af8100b1b2577925b31b9c7ac7589f55a5140fad2a868b5fabf886219f308632535b94f8b871f6b5420f3a90d4a3b25334c1a2035b09b12f1ae52c76b1624541344975d74a57f3ae64a851b74ce1c903e54247a2e5ae2ccc591d15505a0438b304a6fe5df44a033cd2117f64d0540ea81d7c7a48e0fd665dccb2a4c5ee66a066f9b8b8eead61f7924b101408e06d7a14edb79eb2a085392f3bc025cc9763cc15d6028cc6338f2e3c6040d66ef897c10f3307f4ca5a8082d434789c80be13e7942911118c144228f7bd6d20f20906d210347009a50d0f8a69f62e02bd9e561e2f4fa8b16cb30781dd748cadf7056c035fc7cd586d54ebb897752d7f63f42d6efd261d56e9476304f158f8dd5e747fae0cc4b540685abbaaf069fe406004f255afa5bd4cde7e0088b1e9cf41e1034a74168e6c38348084fb529bb3f178985b58aac797a0e41ecb112e9e5cf49c5c3780afcc1f587263dc429885243f38efa5d11283a8df02b5604d558f9c90b0330824b9c82dca361c951e16b6acbe452b96bc36dbd138e764a79c0f43699204b14e39aa598d5392b71d5403dfa2c34ba35756ed0fb08ac9631c7ef458b982dace92291df27b5423734da64de158654eddd83809dee01e2e547bdbda2c568d5f4b1939adc54f43e36b86e45a65b45db3f06e4be45700047a2e50866134d290e1f8716281fd774d9b1812a71f38836c7e13ecafee9d4a48c75f6eb2aaf809fdc1d779a13f5896249b9ac3aca805bfeaf19408865e14e5be9b111b5d3dda9b6eebf344139867cf4d37449f2a423e7647e4555034241a3daca39939ca63541bda28515748a4dd38eb283f51bbd10c32fb77d21773cabc8e58a03bbcb6267fdf830dcd129438d0fd272c68c4aec97339274af951a39487a61cbf83528eb52d047d2eb768eae8587e1f4ede58dd07fe313751f26f2f312efb7bdf7325d3ee133f215df60e3e210546aac3b0f2bfeece1244394a4523e002fffc738480f3358fe9715b1ff7c4264842133592077a61dd3c0bf2ff7651bf6727242e9ba542a29ee9c7feb9212d90a08895daf939ba1f7172a2ba838cd3bef320a7d70dc9bb3458315e0e881f13321fcd9e1979c840defe0332d6517fbef7c824d8bca0ebe1616752f92124fbd92820487b570d0485e670c5a9ade68b4402142babe797631ef63878f7cadf2b312de1ff24e14801d5c54abf04848a6929134c462031fe3f31b296b86ea2df4c2e3df73a4c7c7381e26923ec6da3135e7c93b12fd42d509dcd606cf6491d0bedc94adba0f181eae1253d18eb1668ffe04f4736eef93a4ebee4e46b2690b91c703ff2eb520b7659a267c0e4da5344c56f55cabdbb2408d54dfa032dc9be530c607f0f29369280a3247d358d1cd043537902fc591ba1722831313314f74d581e87de61e714774bfdc87606bdff1bc8aa5940eff09c35aeb8e3cedb2a68b394b1a322a3d3173d7e689c3cda54999454a6d714f011f48203849bc90d78d3a39d2ed0bda7e7eeeb208375c98c4d5c7a1f003a8ec377904c34b663ddcd7558d90c93d6f727af7d839a28201c2658c95723f8ca44a3221f82d3ccf203817df63018cc04cc89c59c71a5b24fefbed850791d01d6875ee9f6f48c18b7e7a74c8d36aebc8c346bd9a893b4dd39a0fec255f46867e00b4a2003b4a37d1cd52479cc0d4d79ec61233f53ae3bbc6aa28b44c7f51b0c22e834a3131016b66030369e771dea111e0906611878e1e6136546d60fc69dcd5e6c0b77e965358819618e78350a359d8aa602c69db94b827e8cfcfb63bea24fcbf413657e8b97c2dff40671026383c228e7da0962fd8f7c1d00e35eb77ae7ddc10c60c838bd52bef75e072a5708719c0be9a92813af7b09cd0967e8fb38d099b0cf3eceb517b691756a46a355b591a927aff565f3e8771f55ca13b0bda36ad9b00780e2709273be66b9648e9e5a894a1ea943284f3054651b813a8ca1adff780604e1f2573b181eb67329227a4992afb4cf04dbaf9f970796ab863a93b4373d0b0d98b0ed84a3f8a75001c7ca270e05cd0cd6114a6c7758ee376aea0603ebc19b39c199afea3d1beb902c99f41e1dd6cba7f62f531c664a0550c90c450aa7a307d4c45f09936a0c6c0468054be130bde4470284dfec3eefcd2162380d420ceb8b99af7d588fff67f536fce7d37636f12fb0b45ba7dd3a2f6d81d6a3d679fc335f09284c2548345d3e690d67a2927e30eb088052c8523f5c4f7771a0f06019683094bc2d6a09c047adf45f3f9bf9f77e35b460fd9306e4f08d730b48de8dc8bd43f4d7d4ac82b86c883f09c88b0acdbab6c96878fec59842fecc2636e67a6b9f43ef7dae175df9811c2d69c854af0a74b820e1c0b4a9862dbefa56ffaff3c9718270db2e6ec902f31085a556f7912ca310da4d6261d949ddcd1e6bc4d6828c96a8083874acd1cc35701de2890002f8d0969223fa9dece9db31a557f0a7c256dfb11634afc4a57c73f0923fe20a75715c88b41a21994fb4c19d3a8f644ba1e43a2ef963f8991abbdbad1fcc7daea8570d41dd10ed2d101de92fddd8822165cb72adc0e3d0fe033a4bf4c63ef5849dcd42d2567561f1ecdaa1856ae59cd18c96baf3e854b0696d6a563275ff73a436ff4381af1d73b772610c28c49e690767c85daea20cc8f3a3f1915400ba05aec9ae6d4534d899020226390d774244ded6ab58fd2ad5574f3f76ca88e7ee8e6c8e5ac11b83d0c28e1f98c5a4f57398589073b490a18e328b1873a7aca8e2dd2694e85750656aad4926e2c1202559238ebd7a48aefa371dedeb310fc272d664fd1f52b65782569e165492ff5cb4293f1d6bf119a88d501a4a353a881c6040430505820728825ce90a6294a50f0507f6b7032202b972dc4be04d189ba1adf2820a043c73ac19c72f17da14701814e64ab20c459acf5c9f4c0319742e728ede5b30bc23212fa442625e1fe1cafd08687a4e83c8da1c40bfe34b4c03c0b479803f47499121dbd0d80d1c86fd7944d47e01aa774d2c19edc8e3ad4a52b53ed994ffdfb98bb97bd43d778f0fcae00830e98aad1b089b3143217f21cbd707ee5b4cc0e3dc72ce7dbb8ecd85ce2ccd6588ca6b892ddbd97249a061198eeb182d86c61b21fdb396923b425705ce098a2e0de2f2972c86c6fa88b816c246811301f58ea97620c3ebb1940cbdd3ff350f6743bec2456439eb11fd54011923ab977d3e78a8c94ea03aa2f6104a5e21df54216be27ad7eeddcfa8536430f561eba59ead6dd13b8180da4783d94d33b0a8de5180ca846b7603c0de72dc526db3b756dc9d71889c7415f3fe227488cc69e0d1afc8d00d731dac6a5c52097dbcfd4c380a64411fd7c62b1ec4a142d8ae32f9da7c4b4329442ad471e862a96f62b0f38f52c59130b6e53a1fd70a2bc6c295dc67ba2d57477882c13073f39eec03e6c9103519159ed82b0c85a85fd794b7a931cd6b2fe7a5c77f496908279619af7a0c9e46f011338c39db410a740798b27230186e7ffcca61c5a722c0006c55f853f98fd27a7d3297b32a5a0f581caf96a5acd74b8020d892ca0e3fe4f090fad3133178fc08a6d8f71d2b5e5e8757733bc34a7cc924ae24836aadd1b2c59726d82a4701a16439a6d01bd4028c13c086876eed7a16e9d80c49b393d028fdda27554ba57f5c629bbdc562a2d7f2725c891bf8dba1a2adef37b71e10b1743a86b982bff23cadc698552ca081856494934dbf2886728dda47024d0ac18b9cc0a32e0134afa30a17d23a19b22fc77600c6909ee35aa3fafea9689b3c2f4f8cba4ad944c6f3beb8648ea0d836a3e8f64734e5b10ab4c3eac9f1186747116da9f6e54cc2edc2d0249d34d49ef2cd28c614f881dad3e3872910e6e4d1cd62fa32906045f1446ba209508bb421ac913e38ef1778ccf45a3906e4f8bd7f18871d5d28df220edc57992c141ef55926226988575158d35774e5619bd90bca6175ccf315403fa45e796db6de5083298eafd6347ba64928e43d7d6ca98b4329d13bc97541eee9c85fea07bbf38f02594259b34fcbc367ff05984e88b4f3e7f0a7b14b2bff7de0d76196868a0422fa32dd77b5da30c04c1dde208772aaf00e726f46e0eb526a2f89db5ba0839bb11d5754d0c7fc818457faa0320585dc874522f33e5bb32042b3ff9132b989d1afcfe639b800fa087eb015199cebd2e8bd143ff8901e4c8288463f1aa6cec1db117efbf2d0ab5c4cee47c74ba01c7afdde1124f0ca8d1922e667f9ea28fcff5643abc49cb925505d6715f12fd28596423096e3d49cef810c8890481536a0c0c40bf6c8f3ffec22ac852f715484033366ff5bb3b9c56ea8109b87b0c32114b813f313609e9a14296b9833687e022628e2d0a0e328c068976e8892be7bbbcb2aeec1130a8be1044bd59fadf9e1ce1c79f66d9f6cb80ee727f5d2e6b91c4ec2016e7d279a7b7e72c3fb6d7202fd84ccb42cc7305b90cdf84f2697dbf9075c4a1c80022e09367dff0258a0f8a8eb2f202ac7bfde40c1d7060a0bc241c1887f830212273f2597e20967800fac2ba04a5a2f1c688dd8e01c096f2accb845ad4f0327a5143f09829a522e1c766454e4409f9268ff3d42a14d5f49aac892cd1feabffa0785fb911234a606085452c2528a042d062bc6f0dbe8a041aa4263f8f43ea0cfde571d55b04fb3671479a3b1cef68d9a090f08d50f0031764061e55d633ead4f13cd4b7eca0682669a61af9dc99de09048053c7d782dc280ccf6ca06bc77abe8defe5a7eae973af164164c7a71d5f50485446ccb9a01399bc8acc29343056bf6c9fc8c68af1d3fc6e5e073540cfa4a30a83a118156d89f88055c28a4823a911d25f11a02d761fd04eb7b190555143591a556c3c3d931772e27d15cbaa74c4ecebc3fccb51be5747bddb19928655d94b8d8234eb6ef053b244e9db2267551c79e463dafd913b0d4b548f6c2479ed88f5b6c142c755d90bcc8334eb6e7163b254abd81bde5b906c189090fe3e87e7d4f7a2a88a34fb6f5f7288e41b7d477d2a071241a10f784eedce8ee417f5b85bbb492551f4901c01b6765b7c83e5b8ed70c3e02eba76bd32167e21382c8d6b46071071c36d63f84aff70e9d99295eb3be4b2c45f2138dec4e71fe29b7e0c7696e2b02f208ef70c917ab25ac1e568a9e5384045b2d1f3d05971b6c40241cb5ea8d7bfca266609138937312706467f38df0ee99e03e506fe76343e92b81f3a4b3825a690489e0486f440c6d17c9f83b1cd816913738281c447e5c2d70a97404ea905da50b28888e25a9d2078be7066245d2aa239abd01919cf20130479475853a13a0a4d5a96d1029d91c620cdeb9b251d89e9db6c47afe31da0543489c5a6a55367be7b83213d6ac093b325badc7082e31e34f4c3df5414c860c6bb9e29384d8e30eb843c73380ffa0ac3d34bc95a1e1af3aeda553bfc10674d66a0d90f47f93b1962bd86f7107a60e22cab91040275562c489cee83c9de1df82b6ee67ff2e562bf27778f99b390797713dd992e487fda0a81b2fb0592d3fa5332f99b7e18b50117d80ceb3c3035d99cd083988449ec6f55744393059dfb6009a2e6deb47a83cdc0d8cd317dd194a2414c9ac9ac37e2a160747894083db02140f06f4bad2144c6fbec9ac87b9e575a022bb4a29a0a3fcec079959e862ae5506e2cf701da67f7e7605f478eee269ece70a295f580f510b7ae5f379fe8dd2f4010d6dcf33c9d0a5920d251e3969c91f996a41f2693097e720d12e63a4b1a83a928f13bf41100d775140a99ba835aceb10147e5c67eb1579ff40564895e29360a9feae1063f1869d94e1edec22699ad941b3051e02776ca584e298e54d1da2a6272918e5140da10fe8f2600a6f80857da2ab742db83dc793b6f14beaa2eae48befb2203353a02cc33d739f849f5720584ad79c88ef93466f1a2888f08b4fdab8d2ccd3f8642a4d0119cdfb81e494cf914f9af5d9c0e9937cf29c4083d4d4820a13c3405f2900d439130cb879964663c64da5ded284050a0c8e69655790345f01341d3da2c7cec1ab0d9c77e2be875ea9d45a33ddf208c0b61d8b0ad3e7b754f2d7ee0672025cba866128f8524b5234ba972fea504090e439c32c4d69d77ecee25f01f2527873287d507eb2cf36e226212e074187d2a913404f62636a7788037dc30ccc8757493e7ed4fb1fd9dd02aaaac8a93794305cbfcdcd3bd565120db0151ea9b7bb44b7d3419bafea0c55da2699a30cae2f8612587b302a0eb782fb2cd3a9a827e54a5991d054d91168043f872cca40fd93c60f9fab3e1178b8ce3e45b135bdc3bcb3d657fa9ec7b568384aa20a6de9a3bfb30ed679982b05ff172eae01940c04aa8563b95b2054aaa20e39aa252a7d50c66540ff326581d1ce09c7442151e77ab2689c91efd847d3fde60cc70714693f2058b8d000c0e7190c18407e2d30d4507354fbf6b9ffc952a65db01dfa0849a55432c62e557c21dcdd76cbbdb79449ca0f0bba0b780b74e7444cd2a853dcb5725d75cea2dfb2ab94aab3362afb4011eec76ba54e8530d942c6c406b9fada09957ce00b1a3971ccdd174028222715401cd991a24f346251c8481f568cd469671a34226ea40f94424036830cc8801429098e68424e1b1a435a90461421a20812002500a203312045af0754148d418a9f0d764c48112c63092794dc4e7001520c9be80014a4482ad53c7530d3420c52144b359300860f8ed09162a954f30e09678ca00c2e481f08a0c5143b72ba004a5caa797e0145116490d79fb505d0f6d7a1b7fff52f396b62d31465201922eb0766333bff35c41074aa305550010515c0b0dec46d3a9b506e98b806dce0dd7003cfedfa633fcf794e880a6d9ab3f3bf69e79cd3bac5fbd3617e63cd7c2a24e40221a1efdb0155c159f4692a6a86cbcbbaf43ede94fa91123280cbd22ec108ecf26cc659a51302193d9c0a2e76408a75889334be20454b8bc8a28b2748d1a3a289123f20c56f8b1c98612345b0488b217e48f196aa2062051aa4784b5e9e59d8e00b18909ebeb5e5ac39494d8640450f489b27f9291aa62f8a2924d8df9fce9f2c08f83c2d4487f9250d7fa787bc1f660bdc077579457beffd207ac8ab8320bda8b50ef3e97ff34be23ee96a21ee071186f77e38eb0771e7adf383b85a555bf3e7ac75566b8638636ea0a9d5abb7d659ab57752010270df0b54f63ad0e0bde7c73f841f7d4d359300d052e67ed69acca7e3fe3acf9de0a535771b43af5f71e3d1401e2fcb4101de8974efab93d20c2dfe921c327650bb87f4d830c3f881e32d441885fd25a07fafeb00d2611be186a21c20f82440ac327dddaa2b5653f8890f441cc0f2288595bdfb404f84fc8e2b6f7e22afc6c8d0daa42f545435010cbdecfe5e5bf74da67242f564ffbf294bebcd04c77188a62c9e5954846d606dda0b7d906397dfb02fdfb5797f4c30fdf7a6fbdf726e60bdba2eda9aeb5412925f0dced7c5fff67f2982f3a5b2fef85432f5fa2fce54b77e2959cf695e8e7c0f19ee37078383c1cdeede54b87f28d35395ef24b98639cf54261a06fe9fd2fa4387249f7cbd531ce7a9914aca697ecb4ec4998c0a497bde8e97d9e0a761611ff1c9fc3ed4f7dd91e76bbb99b21999ed24cf449f4e5e997c41b4f0365e17bef6b58c07491defb2fef2b7f8979acfca4bff2a45c278bfe7733fd9cff33a52f390521e0520dcf7d3ffc6e898e30dca7e17f2f864748b4a020a7d1bcc8860fb91337f2966c0fe62c51c8912fc80605d16d64349d727c0e93d3a19abbe812775d1c2fd61289f45f1692e377a0fb85f6a811d92623cef27e026defe7a7461ab8c5c6d70f72d7f7affcdedb9abb8adc65e3bdb7369bc45de392ed7956687b43dbfb4ed806d9207bc4d2aa044af675386dab535f3aedbed515a09b0ab1faea1ececaa1a7b348ff42c45950706965f5c85d39defb6779ebaefbde5b597d39d0cb93b46c7b9fb38dd596f7e268c717be9f818285c09ce53d0f74f710628dfcd4970301799ec4f36a496f3749973cfbab3a6779ffb94af19607deec4bbc967d08c8c3a169aa4bfe749de22ceff5114c7ff52d5fe39d66b48282fa3951347e23ef78dfe8b4faba56af740faa2f9d66e3cbb98301fd916e93e9dd7b4fe24293c79cc1f4b402745b5d963e7c9a3ab78b2a9593f8af915b5079075a02b3d3760069f05434f64eba54ed18eaebf5f4967d6ae7dd1e2d9fc5c2ad9c0422b8a655f9933845771f77d59928183f8d4fada950a542b5ea17eae3c7f541101ca2617caf2ae37bb0bfef27f87404ff94a7bd17e3ef1373a8af96ff4a627dd2b7643a5bf551b93e4b06331d9a2b2aa507a97e459c3f3520f07b920a4822d980ce2a0ea22856ba8f6c102479f6a8c88935b250ecd1a96849cd64a218eb0a503aa333677dff819afe471485915d7fe5c57bc5d24aa643cefa7ea6be686d6606fc3ea5042e599761fd3427ab2f96ffde8bb81147a2fc7d223dc5b90bffca7f336d9d05b3e1e77bf11b3fada24bd5f7e29cb2c1f7d9e004bfddfe1e8f3d7af64ade6d50cac92510b3573ad0adf215b0bbbe0ea75d57fe86155d01ba5574491f6b1dce025f08d53838eb7b1ee8aefa01e338030606676a03583495ecfe9e1eb9ebfe6712e7fcc057f9c0cfa1e65ab50da75cd27d7a1f6fe9aa987e12d58e4c28fbfbeffbbeff72287de2a72ae2aed37f7f42ed40b76ab6aaa8bfbfc1866f741c4f882f4e919644f14e52f8314c1ebec59780bbe616bf0777d5175f86f952d5399fb0b8d8a2284eb9e20ca6ec19654fa219ccb648c75bba5236fd5a976c5a73169db14ebff9ddb7fbead2870d6aab13ffaa4c22194cd9e50aef893431a8aa58baa02e555a84012e67d116df690c936afb31b8eb62d48c11bf27c439013c89a0880285ed53d99f9e78861ca91fb075163d420866a420095c4d6797b8cdc9cd080765d730b7bdea5a58545ff762acc355f77ad5fbdf504cd9f53f8924db966e328cb0edcd59e11430dc7d45a51d2ec32255b8f374b83352231dc98ed844293f43259c4f909351672a320497aafba66ba7601fd5fca2daf22f2a2a2a12aaf762ac529984a05829368adba3ed1f8e30fcb6b7faba437f4b5cb7676bbb54d1a2c9438abb665854f2010e77ee2a4d424736e7ae322cdaee2a4b509c6c9cbb26016ef0099a3c9c1411722831248a6a94994d3279f88cb5f762ac52fd87539ce5e12e9c439832fe650a2f5278c6dc11ee90c0f6e62e283e3b052160ab93ddea2bdcd596ff07a980f04fe9cdeec558a5fab7b7ed2fde701550afefbebfe769d4589ac1e15505ec065f87d306f57f5f86a38d7d5057a07a5fe5816e1beea69090b0b3da950cbbea92675313ae060b3c2376d415d9d423b2a9e763a76c5a8574653ddad4c8ae42f5352ef196bf9d526b3eb588c82eafcd2be2691b65ef60ebd1b5557b6dd7e693b4d9bbab1e6b361460db766ac4cab1eb099cad5a27ab7efd99821030edd1f3c26f4b471db80271facbc7c662319fef7d90d01fc2ead9257df741fcf290ff9c5227c4fb6921f5ad531c71ba2b8bf3e78b88fde5e383a4f4a73f64860482a64122b1effdd46569c893485eb8dbe6d0f940a903bc6ff2c83ce800eefa13e8d93ce8006e21f5e7eed973aca169ec1e4a21208a734e4a7b10ebbb8847e0f2ee2d3a25cd409ff430d027e99e7d73694b7affbbd63efd817ba6a20870255117457727a9402239c97d6e52ee4181ba5377f731822e0d0ba96a5fc4b2cddc56a040b5d60c50779c65a9eccea8adb5d64a006bbd1bf529ee5ea7538753ee979ee779f37a3d9ee7cd39e79df468d21df7bd9f936680eef0f2dc53973dec69e991b3eccfe9cd39ed5b951298e0843de797b8355bd3b50541e5823e11bf0f7f6f5ffcecf79f7e4ace0ca9d0cf9b9932b58677ce097e1e598520ce3ae79c9507b403b8be6e44c1f34bfc4e8833b6e93b757729db3dca76f71a9b3c6cfa029b3e79025eac2ac1d8a631dac405361d7fd8f44befc9180b8af223f3b449d4c0f7b2c1587d958cbc451f8aec68b629a55280369db2e9c736a5255b1a787e498a6dff497bb43d8914f4716201b0c7016c7bc2b6376c6bbe6e0ccbd27feb645f586dd151972af1564dc5065fb0bd11260b24fd6c6df06b026ecc9401abf715466d17b4617b5f3f0477b6e7cd6de91ca927ab798ce2ea6bceb9e32ef1e79412e5684241793997ac74943194dec0f1f2f3552b2c2efae95f4c4bba7c16d6b5130db50d5daae8e354babc9fd2255681bafcf774c9f2beea728656a0daa2b54597b765a5e9b591d2e5e366aac6d55a5b748951babc7b459758459797625d0b35a57426fc0fc33aa9fd8923531f06a094524a71b48004031f98842da862fbcf10b43fc39bc9b2efa0164c6cfff9d99f2bd8fef3049b971cce96f5669dd3ceba721c0693346cbfebcc0e707d6b6b1051144488a2f0d9f36fcc9f3fc4ed79def7f1e055c07b2aa521102baed3e6c0f17263e56243f501aa4d7954977d3ada7dbff4d0c0560bb1ef7beefb9ff7a027c47edd42bc4739cbb1b3bcec6139ae43708edaa69f01231a1052cd70cb077079dae518daf4730cb9cbbfc4327bca39eb14654664c9aea88a4f3877ad5ea8bee99f72f545c9d3d13ee9826cbe91554350551d434fbb4dbf646d5a62d9a63333397620ce9852053a41a97f1a54f27d6013a083b4ef36e5fb52b51411589b324d4c991418b475abdd2784beef3b63ee80894f9add9ff00b55507d957eb4f4fbf437854ea1df4727a54ebfdd5706a5fa3b63eea83f690ea67c39fbe5a64c094b600b134b7992a61f69e298794a7fdf94ef833b15c758050b9972f863be343e96bcb4abaf6afaf1754ea71f4f3fbf544bd58a4aef23cc67fcd27f630d4c7cb194c73c8ea552e9794270575f27bdf26a7afc3aa757393d3e3d4f58de5a5be2aea2dbf8e1eb8c2a3aa5faf8eaba6379155d73b555afcebda216459557d13ca4176b4e666575f7c3832487e5c3e709e261d136a8b6aa15b242364817d9222b84c370e57b48ac57ae13aafccae7a8fc8a8a5ef915bda3a2ef4f0f895f277c8c9f67e5c3d7c1aff298e55934cfb545bbdadbcacdde6c2eb4399b0377602e465be5e080bafabaf7ea55cefdf043bd43fa7bfa78f0e55265cc1d38c7033056a33b6ab59522aa81b11c1744f40516415bb5bec059ed2b032c02b76baa8bdaedbb41b91d959cf45925b4dab2d557f8423518dc767d94145cc212d8de1fd2875f3f0c9f07098f6cd72f85da93d5562569bbabadf0d6d2eebc1fef471614545b5588c7a43da1d20bf28abc22a19b77ab2db23492bc3492f4cadf750e89a4c7d38faf537ad297f063cd137a372f77ca79396f377a3b6fa792d5566ab7cbd1affc64ab1c9cd055b1fa0a751df5ce15515fed23fa848ce877fb88e8eb03c348e809a1efb325eb7d1f1894050a0e31a2d54d141c3285b2907a928a62ca8dd41052bb3b82fb937a3277f0f0680adbfe7c3d5f23a0ad9ada5116acfe84e88e9f11d0173884b6ea7fe0078216b4df3794b24d99fa5e4e299932f5c121f4f5f180b62a6581b24075eac9dcc18354d1ae5f5351d096d02e53351fb7eb546dcad41753b5c943c97c5d23c2b0965a9272e227f0bb2695529827a932e22e96d40d95badd56e08defa5946a824d7b36a51600d741654aa926b8b2b4a054a5dc4cdd5441bbaa683b75abad2adbf54570575f2452f8e2efdc16560b70f9ddf677fb70f37ef8340e86356653a6ead2872baa73eef82b1ffef8ab103f92156c343d8fca9fc6377d69369b65fc2c292bf04cddeee3993fd568664c1a56ce5a0977436d695d0eb5b542045ef9ca575ec833ea71d4e397bea477467d7f3e0c9fc7540a573a5fd23ca52f5b45e012a4d19837052e698cde8c0a03833bda4a0a97caa5743672d848d52a93daa69f2e179433b2eb7f51ea2462427b39798fecfab3fca4ecfa2bb08cf97ad90573e0ce0b70bf00b2db8316642c32fc72dce197a0105254807b565b75ce9400daf56b3962a43a09b1066349e22ff1ebd36af5551ada95f4a2be5192663c49f9fe5c310571fa745312a4a77131833a70b7eb93f44e0f996f0c3cca575667bb7e09343ccb814747ab1176bf9fdafac8495e9dda7d5fa0a4dc0fbfa4430df2843fea49525d82457b554a35c1a45da67253c609a6333027b28c304803419dbb562eec4ef282b9d90f50908e09b32a86a9ca88b3360a0a3e69d411be3767d5378d3794bc3f5e552cb54bed6842b522915542aa09f676f9e56e9ee425e22e1f534d70b8cb2f7733a8ab2dbb573368219788b3aa8f392e450a2fb04883dce9e1a16e9df2fedcfaf74747bcf5c5158ef8778e37930c9fc6458d82824da30c2a21d4111ec7d4ada66e58551a61e33879dca0da9a325dd7c8649d315dd788c9aae5fd59610516eb2f50141d06a9065b1dc0169cfd0081412e100830f6ddbedb0ef104bf41f535deaf4630a595c67bafe6194b30173e0da50ff50e121ac6bf7a6707c90a761f07094f7d128fa829eef4a1a6b6da32d94e9aea286ed6d6d51eabadf0eff3ccda22cd6aabc64ca276a0d9aeaf82cfd5e2dfcf21bd89a47b48d739e2dfbf2bdf43aa9c9ef43cf5f17d2028799fe7a4bd565b7545f50eb4a69dd643960ee4345a5bb1b9adf658e31c879ff43ccf83b5eb6aabe2ee9f748dd556ad7f354ff89a24fe7d1df16f49f790254dfa9cf17bd2a757f4579ee527d943defba5d7b9e3f3acbc3ffd2cbdcec863baaf63fad37d935e796ffa49eadc1c36300326c8ab579e86e13f8d63591a6bf052535856f2fd09a5c0aa586a07e656f48b82f3fd3999b214f8d37d2c215ca6be5c9d39abfe8446e0afb35d3d7dc459f50716be38d6b8ae414deabf123027e64bab2da0daaa33fc49483467d5137e07e2abf479e1fa6e933553442bf395aacd56fd3b4291bb8cfc752f12bb5d6de5aded595312db55c844ab2941c12eaf931b54de24bbbee7941671d6dc2930e86bd256090aed23ca02a8047482b6ea5796123cdaf5451440da94a99f6a82c12fc114440194be2fdc206df2f0af0f26018540164c1e570453a689c9c23562eea85f415a8a0a6a956862a676b15d9f6584cb2fb76bce5d2518dbd55d9fce5df46bcd4f7dddfadad5567d30565f3f33b283227a00850f7464fd16269fd0574bedae116765d7f767ca6881cbd42ea692d5fa0a3fb5abaa9faa1a677026f6066ffe0909a0f40a37a5eefaba4aa090bb9018f2205a7d5d23dee2514a513179a0b0eb5fa0c963c92dc17c81b9daba4ae026c01c0c764ddd76ad7f73eaf60925c1f7c75d2578bb462e90bb2e12656aa78ad59fd4ce5d17c859f56b6a777f5859e0128c95a99b8fbb4a30b765a4d1c68f6c4ac39bbbfcc80a767fee9c1a6034014419b11819a6ce98adfa3fe884d8f54b7047442cb59b32f57f82c623f35309a283fbb3ebdf9faf45d89fa63dc02c7bd66ab2ed15a1d99bddea2bfcfa295c7dddaf56db9b55a51ecfa91127c419535a9b0997841631b8df10b8bc34178c381d1718558166547061b351b1054d75e303b85485354f971b02cae9e0635c80cbafba8f160577713bf0004b07112e59e24c0519a0a9c004332acc7cb1216ab0020182d0c0e5acd5a0014d0186142f80603945625c01e587061beecce2be8881b62d826e78c0c489b61cec686134c141024770397328c43e1d130de4c21913216639f0b0042ea74e0034cf6686edc6cc20420f3be5dc7db86fc683a05be30117311f1a7b8979b31ffc80352532224ee092ca5c6a5e1050c0213e74468bd09917fb220520ed8b2b7e8cd01f51f7c58400ba34216c148822c1042e29d054a2f3808c6a378b14041da1412c3532acb833328640693409a595703f200215a2435408e7e18c82906234c404b44697d070496bde0c8a220ce48a9cd0a215701fd01246aeed0821501b354a824b6af3869000714358d01b85426f14478f280ea8a889682b824273340acd0d51035a3284d01222922ce1006dc9101ca03a2aa5864baa3be96c50968c312e8cd01d9d82025cd25d0aa88b9f2b84623e1e23c58c66592ce13227e2324c2302848516b32233c0a5cf806a35d05d11e5c7480c70e93f281bd1155b2c41c2811c8915e0d28156704998e840d0110fb2c58ca6a02571da14136651d8a444f1a403515c21250a5b13a12119e0d2856a25da1434109a820667004d613b630a1a10f19a2ff15a188b5951449113215c7a11ca3e11056481cd6d6ef4025cba4d25a673c20788891ff8cda1cc70e9b71910b25a1a65e08ea6c0a5e372357446319c358a1561a401118e18c55a908be239d7b994d2752d311dec7ce7537ce73253e205089e2011f3296bccd294e8400c191122705965453fc448b015c562453f14416352042245312b66459ec0659d853329908c4009dd8f112870597f646a5900c1091320242a90c906244597c590a02345b8ac4160cc8ca0b16646135a924af37057c480ae0081d01012b8ac424b8aa0a8d49658b17341a966c36209935a6d4913b8ac35590c4d0a24310b9481d126459223521cd1a2c8c90970598b6cc47465dc80a80082cda8092eabcda339ee0918b32a8c6e50a8c065bd159d8a9ed46aacc8e804255a511327454f8ae08e8cc065c50d99624ab24842cb42c429c902074ab2c0402eca12fa22259264d3b73377d5d8f4ad900a678bb86b12151dd9348644506d0b1a6ba2036a7f367d5bddc6dc55d6ddf671574dc10e5f63acb91af604db40c3bc3de0866f082e27ee1482eb052e29eeb3400df9262c36609180b3aec6a1082a638da77370d6d4ed8c353d7853703977e307ee16a2125410271f532c0c5cd2189151561a6be8ccbb012ee96c89f10437806095608914f7261a21fdec0097f4078910c85914e8080df2cac0250d5a15612c824b8aa3a248c5089714a732031525630aec177a170c29cd36e42c8f0a2d7156cd0b022e698dc957611fc4d12397806a5bfa37084f8c41d5c63104d36d35083e06bf4c9dd0221fe0921651239b0aa0dc9c451f0c5cd29b2e0632e69cd3de692d1533088b36f0e1cf9bc16dc2e405326f065ce820e3c905c30517304a238a219e30011932d8a63d89c8a0e5bcd65aabd7951de047952a95ea5e4f7b9e3522964084634a98027bbd62c6c4dc70564c15d8bfbce1ac1b55e012635a2958bfb6dcba757b2f59679c6549406170a753c6495bac250fef16bd92f56f8b60e9f3b6784b6058ba22a9149648a592480a4dfb567d2ad94ab6cf306bb6d64a9dce1a8b3533b3c20a06f07e7c4e2a3a694e1b7a777e6941f7ef03bd39e79ca4b1daeaee74cef973ce3104a2348a5e48f5e974f2beeb9b6a93c934794c10a47a1cc7c963da591aa7cb4e1e93cebfa3a92492c2d1244e197f51ac40c89bcefffc4eddddabbb4f9b4591cf7c24f000d73d89c8405206194c7880888c25689139650446b08801115600e10912056420416793570f0c8450810e8a4cc0840b9a2027928d59f40821eff3aaf80108dbf32430b355cea2f3a73661022508dbb427132839328adce0e706392661ecf604f0d6218707841a8835c79db57a9e32b55696bb755b6b5da156696d396bd76addab957edee7b9bb5f1626d4abf5c003b88bfe004e68ed1be6f9ba1757e2adfa9ff5ed5b5cc579b81b6a0b7b3397de9953dd11dbea5d5b3dd0fb56a8dd80ebbc02d37790047e9fe795461f4d1487c3c5b066a6ca8dd27903ee86fa37e070e207de3065fc27ee86c963d2d8ca136a675dc1c24db7684befd6a28f7a16b700d3b7efd45a1b84b5b6fed41a845a83506b103c6bbfd2af9ffd82e0cf028b40a911057bc4404bf53b008d25c00a76e6fc405e4d2725bd9f53e67b72c6a73f0b54b96bd6fbf9ee9ac4745b6d06abfe63583a404a75dc981c8cf1040455ec12bfd114ba8b316640c20930694fa2315a20062eed493486124163008df18383a05d15c2621546612ce543030318739105388351158b5de2b738b8f72dbe3318ab30b5334a9b5f547f8cb67fc5592d76597344bb4ad9eea5f5d9ee56c672438c1ed820084235b8e2e6c9609755e80647ecb2d6ea12777fecc4767ff75b925dceda5cb2dd7337e2a288e843675dc8764981828e7c49936ca742b4c80b10ec92daa8d1f63f72ffe20aff7c742fb2dddf814a0f02c309d22e3dc97617f2a1fda52fd9ee45dbdf6d7eb3411076e9b8ed7ea4f2a5e7a2acecaa2c8c21f79f4aec1abbc6b78c35355a1e35d6b47ca56154b151596cd4b38c352895b74bd46314ea4bbc518f52b9ab9ca8a78ff295b10655da2cbb446d963054b0597e5e60b3b0fcc56db1595e65ac61518961af0c0cbc002866c3c9182c30c2c9182c3082a42b3f4bd45eb9b1577e0eed959595c71ed82b36c8c15e793cd6acb850d82a7f1a6b54c25d9636c66028b1f117461bbf69acc1b61879fa71ac3995b66997a86d32996cec52c73699fe7a51c6363d56b24daf324181b24dcffaa205dbe44509b6e94b638d69ced7488ea55d2a7571b44b5d14d9a5278d35259715c46a4477016097a84d8a6293485c84b1495c906093fe8e35248a4678519b00fbfebd8fd1d8f7a70cf6bd2af0bb11b1450c3e3fb23d8f68db8fb26db5b35d83b6080105884f036060718bf920091574a1c483e2f68591334866882b805c8468ecf2673e18cc1cc15da08181effbbe4fd4c0d0a701117840446ced8713155ecc3470832c886e60c6b827d10d6e008538e74b4f3badb5d6de697d70f72f2e510da05c95ca426056c4125a6ce00452c41822c13d45819da43510c276ed3c723205131a903921830cef09fb2ab80b2c598d534f70c9da946af1858e12aca05aa060856ddf6b18a1e36fc4d0e0881b110d80b00409a30f18e9587a8247b00a10074c3ad061150c31ea762728842845d199888410cda08d586c805454b24109a30089b6a30d5c92ad0719008342db1032f0cdee9320649e0c3cd0814f36c0012b83cef63d1181105507433a58829f20c1011976907be2040764c841ed496d2683192a1c00111d31912a529930410e8e8ca8e1714fa223222450814b7b121dc5a410b9796be2ae0cb99cb7e62e31094362941123040ef7241203675f10e346248606ec9e44626060973fe3b90017a0f4d3738cb7ec3fabbec4b73fe305a0975ea794b610d9c7a2584bb865041f982f142562babeffe108cf584c51f1c3f73079a4109b3c4a44589a57ca342bd416acb6ec7b59051a320e25b00053fbb654a107eaa3c2acee4df95ebcfe326125d3eb5bcbc5fe9eec8f8aef4f356afce954e3e430705b0be6eb6beb6b62ba48bf82e2417d2fc6fef353ab6afbc4efe3e8eeb6d194c7d2873909d38b9e94f0bd2fe90d26282846679717554b4c1e1f269b3e671caf738e77c92bf025af4015cbb7a044eda20aa205d1424d779ea63affa171b7f1df97a074188ca0769b97c59fa3e7a44bf619dff4e2c4d1209af298a9bf9bc6f1659834fdcc5d893e82e183e197b40e387e7c9f1c6ffa50af440dabf1a7ffde06774dd5f790dfd3d417feffefa9cc5dab1f4ac45fab7bfa9cf14f7fafce31bd6a07c78f5f0cf565faafa431a0229992a4d50dff90c05abe285495e01de853fd104cba7c6f63fbcff7a7efe569fc45eff490f893a8f12285e2accf7f1ca8be00f09fce71acf75acce72f9d954f0f805ce349c8fa47c8aa8771f998d5ff8dcff9e59f84c993cc7992afab2fc77daffb444d71f476136b0955042e69118c3a79b31702eae329d8df4f2a80d24de0a31b3165be50fbcf94f96a9c4e2fc3648d9f63cd5d9ed67ffae6beb8525a7dd5f82ff59f8da46136f42a7c1b29bd0a6dd8d03b48c250e7e08c04965ff44a4e863989d3dfd3bbe057613d6b4b86c993a6b7dafa5ea437ca02cd8d2f8c9bdec22fe96d5cc1f0e378a257a21efe9cd363fda7f7744e0dd5d7f0b637ce40b7e39cf54171d6f7ad227e7453e67b1b26c0be4baaf37dc2af5303967a1a7722a96c237bcd67a176d90ab6223dfe1e7245ca191feb1d24a4dfc19163caf126bb6b649efa35fe947990909ec7fe09fff839f847fca1cef937e99dfaff222d8d19bf29ff8dfdd3e7d83fa59ea473ead7d0ab4be375abf2eafe2455aff3ea6a9c4966ede3f3f23eabf7b1f1a9f7b9f13e2eefa3b2f19f5720367d8ed3e3c82bf027897126d9f2620d95cb8d948dd54b4bf6f141bdcfcafbe037bd0fcbfba8bccfe9c7efafa6416376a0eab4dafa5e257badb6be67c96e13fa1e95bf49b2e449fa4f6d7d31681a67b184b0a77006ccc77e7d951b3da0e72f445266f930abbc98f3711cded220e60f347c7b63031b4f164d5181cb99f3f1de670826653364e9876072149fc645bdd343ae3c8d8b5e06027f6fff01eec22187fa727921fb2a5b52d9b6259da5bea43f2dab1cbe4b26bd8d5c7a55163f954d5f238fa79fe30acc9374c993b49127a9ca934ce549d6c89344e549b6e4498a34f6eda76fa0c149f1661b9248324c86fa00deb26fc304d8ee1dec067fcc3ea822b0aab66c04a68cfd9b7b7056cb3e294f2a8072fa60c89393a650ce2088b68e11c061cac8307d5a82114c9f264122fd9865980cbf947d86cc90e1cb30497a3bd6acc0d17b3aeaf0fd0edf7b5ffaf0d32b50c3bc56bdfabee57bc895b77af5d5cf09bfee2069d13be2937ea7f4e1f75831cc2d4fcaa867c9f555b20e3387c903ac2f3f0387c9c3c6b6d686dff239e1b7d40fffd339a447e91d7fd224c530cf954c497105ab3fb7e34cd2c707bf8fe97d4a1fbecfe97dc6f7119ff434be922749ca39d4967d31d331d399e907e7498e7992241c4229b0c7120aeb3b4b8fe76315e214a2c29e4458c4886cb33d896cb15dc59e445824d9ef2ecf6d6c7b3f998431b43dcd836f0aa876d9432c16db3c04f3451ca599636c1dc14718818e304353c9b36fce5ac3c08c30d0adc29ca81856cd08314f0209230cbe51a71c4fb06b950df4ea867f757be189216628d0b68ff7a177767cfc0d10176690e1851af269be003e841536b200ffe37bc820df43ea7c0f49c3f790357c0f69c3f790363d766c1ef63d7a7c0fbdd3030131c07080fd2de8554e0b6f803780de31c0b7f03d244e0f9980ef2115f03de402de867cbbf81ab22a0a05e419161309c8343a790517e464580c359c7c430da0591112c081097c9361b9871fe8b64da63213d470cec247cef24ff98016a9d567ee2a51ba1c18c0a58bce45e7b273d7a446e84f14513240240bd99e444f76ac3d899ed8368cacbe1440034c6c1503da2e3baf2207538511955d2ae5d04266a03bc7e778197ce7787147def13aaf64d0385e7fcf8e39abc6838939ebf3db78efabd51e13131303137b18998f5ffd9d2f9b5fe9d27ed63036c3c8607c6c8cf6916d72ce303118194c8cb473976589398bbae8b2cbce5926c870e371681c0f24ef4c253768322381fc4d5e5518ec6d5ee7e67d681e1f7ff337cf6323b2c8dce52a56a5e115f02e31cf128bc92c323170cc972c3118587c9ec6ef380348c68ed12c32673d8de722a91ee0fc9367ce6a7500d72ff30f5a7df97879814161f3a8bbc208c1d476315fdefdff2ddf82d2893819e74b98188e5ee504799cef21fdc52fb7cc3e19d32723f3c998be2f579c39e604791cbdf3e3836894aeb65a663f3205aa2d9cfff1b3b69ed66a6b923f1e1c6b60416a36efe34b5aa3b611679238da56c3dbf0399f00cf799bd749c0fbf839c216f034fe23d7d70f9cb72fe2e4557d9d9fe48f1ce475705e4707d13c3ae2ac2af54d3046dc55e659add4c1ed0f03546182fc616092f8c30cf9ab460d86c8ecab79e69f8be0641e1f8ff33f328fce07799bfff135f8781c9d8c24c7c7e3e82099c7e67fe89658109ccff9f1385f1f07e783e81d1f8fa35b766cfe879e55972ad8fbc8374f43e6b9791faf80cc8324e7e67d3c0fec6dde4557ef75d18d366c9e06d8db681a6ede879eb5b5abaf952e555997b86a965107c8d39145566d2eef36e1bdbc9241c72a091fda079715c4c8bfb900fc7bb68eefd937f2047ab67e91e2c873cf11869ead9fc64596188b8fbf5ca4b0c42a8bcc45179e00b76480cbbffdcd5d391e48b6f939d2e0e5a630d242378e3a367a9503a405a332804820df438e3bb2f8d9b644c71a980fec6fde4da88f71ceca51759e7b479e1b269730423045db7f01d907e77d74fec7e7c87e647f2e6184d8fe2fd986bc82d5f02b9c49d6a07790e400799b0ff294b4f9950e256d9e92367a0709ce247d14f0343c90c73958de419203fb1bbdb3b38047b282d93cce246d340f121e1bbe061f6ff3b067c0ebc8abffb95f5ecc7e64af3ee7d299d842569f6badb5da9898afb5d6fab5563226ebb0b3634a9e9bcd3ad41dc3c49ee30cbec45e3d8dd7fc35e7ac172260fbab17b27a3fb285ac3e899ba7f19c573f571a1fe1dc555da478cb71f8e8c8aeb9bae8606649680cc8403e32d5e93ec803f914a62ca0066de3432b40f320c9817d029ee7e6739e06cd03fb047ce9331bcd63f33e7e92feb0ec30b2faf24f614a10ed2af8e4f49009a8e1c7c33e07e76f70f4aa5a9df3634747efac603adf43e6e0fccdf304813d1094843d0f8e76dc0fbdaa7a078aab2dff1fb9da6a790dc8976ec3f992e274b47f8e765d6ddde81ad33d4f105d675fd618ec7134105dcb3a83691e9bffa157f5613fc99b9b87691e24393f1ef63c2bfb40be87bcb9c1791ccdf343afac5eddfc78209ff3e381e81d2431bf03e47fe895fd04fc2463740ecefff81f7ae7c7e3e895d5301a5e01b01bd8dfbc0eec6f340f929c207ff33cab0ac3799d9b873d4cf30481bd4e90cf817d9020b0cff91c98cee7dc6818500d364fe3d5458a02328c0c66b65d762e3a4ff773ac214dd1c93039194636a5c0624c9376cef277d1ed5c6cae42b9d64223bc56235b0b901699f7b9de2a947a542b0e48a61d9842c48c9c638e8fb7791a47e9449b0c23dba9300c4a5751bbda12ab2db2df9374f141dad45caeeeaa0e0d8c7709137bcd25484e10450a9e98224919a43f8c6cbe7a8a08c10629a802e888082ac801854d1f489ea488f2791b5b01d6b3285e7a1b7935838daf6fe36dfcb7baf1deaf64f8defbef9380e1f852b4edf4507a390b14d9d5023f1698ed4a81d8ae626caf56ab9a4b2fb7572fabb7b9d65614fcbd60638fb9617e8e3fc71a4dc798117ed697cd5b21313fb75744c7474e1106e623453ae230393265bf7c1651f839d6cc9c70239774df2851ba1b90b479dc16c097281d69575b98480d9ee51773cedaa7e6653058950780ca93a0f228a8fc092aa58fad7ce9a2bbf9c896940eaf64a02ff332ba9479fa3dbb44e972bb24c1c4844ca0a027a2a4c0a7c7b229e32e2fa6ccc0254bac9af0a22d619a091a0be12430c0c4268f00c004c11c81a1c134317998f03b66bebc7bac41822ef11651d0a56a8b35fe045dfe167fce97f893be566ce3096f7382de41e7c7dffccdf7e871c2e7bccef7f86923ba905728fccdbbf03df20a05bd830adf636e9bbc3a412701e471dee6576cf50533a36d9beed8a175729097c96f42fe33a60ccbfbcf124f96200f24dbbc4e7e5d6df9cbe47103d17fb3c98ffb9c0c9730b7ed285d9e6d7fef092e6162db45072373d70e32cfc3dd26c01071178ff78799b96b00ef37f75ac9d5d6a8f3e38300f939e6f4f8207a2747c3c880e89d55cecd0379207a0747c3c4f40ab6cab1e4cd5bf246eff840daac5ea05bc6814260233d041ff8217b48173080596c6e9ef432595cc9f94ace267ba409b90277cb6831e62c133201de265b02989059789b5c318f2cfa0c208b3216dc652a9db6c423aff003c8af3721bbde263bb992ab2f98d84a6e25b7fd459915b2f8ca62a6db95552ffe3077f8c34c9898189b3232796e9bb7a48ddef181bcd1244c7396bf8d8d5ee1a129e36f63a357326fe3824d8e91e202f0a7e30bbe65748c0e350546c9c0c864340ccb0bdcf24fe37868f290797f7cc45d3bde1fd370127fddbc3f26e22e14de1fcfdc35f3fe5836799cf09efa3247eb4b554b0b0b005f5ecf46c297ce821785eef03fbd00f2937637d91b7215f41c757cfccdcf31c785bfd13bab17e836e16f7ee78ee046dee8550a327ff33b332108c246debc0b28646f264f67e978f126efd01fac302a227d08712492991767f20e5a4d27686f3665eccfe4167c6afb265b2cc0f82177642f89b3ec9b903d2167d997c9de9229635f472ebd9f6dbd293c23de8a4259f088983bec5bb1ed074097b704ef8b6dbfa54b55eac8b6cff26c486cfb00f06cdb3d0f6cfb247851b6bfcb08dad381a5afd9e623eddbe45f3d1d6d5e3eeb39bef01f9385e4a79ba6c2e4789dbd9c7bf6e732c7bb9057392ebccdaf6cf48e01983889913b2ebc0f5a08202091d477e15df897237089429007a4bd1c69e01206c6c75d387429012fb75f7412b227611f8391ddc8738b303ecef255fdbcaa1aa5731609080c63354c0ca5dbfeac2bf0f7254c4ce7c7f7781f757cbccdfb98e3c2dbe89d6945083a5004d285b97bf46c552e452072d420ed3014db658f46a9da254ae72dd9a58bee9e483b5c04c6098f885dbae876f048b9d4119276a85dc2c474ec1226e642ee912739471f565b9925e22c98989f3ab04b98d9765bc45930313b5bc18f6c816aab0044bc4046fad0b6479ea437844bfbb36d90a5a181a915b2b551ca0bd916d5963f0cd9da6acbbf8417c09027f9420e5357db35d9de2c6e92242d3025b3cded6c754be4b63f4db6bbdaf23740f6725001b227ab2dff16b2b7b2020f0c4c1f85dcc382d7c00371c6dce995767ba4595b36af6e6dd9595299cef2f4ea854954c66da553c5af3fc9958ef390de7f92250f7efdfbab6528c04a8616b6f72d0809dfbbffe5722583f7f7bdbfba024e54c6ad85fde54944c6d116bd9c430bd8a5980d3111228a9332aed0990194839815bb3db9d893c8c90744b7ef0ebebbfd3cf02aa18556f264bc0ec6224c670c41b1e0bb408920874b8a83d163cdd5f70c5cde9df18f35aa0de052e5dd1c31383e0d5cbe0e960a37c69a991ce0720625a4b2450650466e7040f4e2c750018315746303b8a42b1857804b8a5b1160acb97a85156c8c359ea699b51e634d0c9f0670398b5239cea201a142a8744cf3a751ce42a5484400000000e314002030140c88c462c158288b7355521f14000b859c4e764899cac324c85114440c31c41800080000000300644aaa6c02188e4181961cd6c6edaafa28b4bbe28b41ed979d7d036bf25f95f10e916ee22f4a890f0ab90c7bdf099538f136616b575fb223641cc861ec8375c4e4fa8f7dd5edef94e40908430cfed6b2aef4e43ef44538ca396fc020e07c80769e01c0a621bdbb9b7864e74aa16962a740eb167f5fa23ae9e6941921adfb43a4d6b83b8e92510e08a4a70b8bfe781df07c8a55483c5c1bd456c6850cf3a09b78ee41933f9acd2e0db3dc5fdce3855abbb5fd339aa34a3cccb7f5851bd4fb182309a6ec8c747922d804bd9f1c41495c6d04e1276fc7c6da864f0d62413b4c230b7a72996ab1f83d04c27224a910174a1ca7932fac12eab4083cad6c49cf53f2ad6fd69233f8490e9d6f055f1101728bdd9aad027415954b2823019aedd23224723a806049d41a928122a1202e6c63f808919f03c1cf8d690a01a5276c8bda41716bdc166770fa20689b5fa4a2d8f7b30fb0f2c6a8ea628eb3875b188f1473fec750abfafd0523453616ec98782668ba65cd58a7fc2326165e730cdaf0155498493e6ce80835d4c12b8bc4127b67e043dc78a2975f4d1c9496256d9b64305795ce97c9c42842da5fedd266a741070a8ac582931116e07520a510fa99a91e1abffdae5323ed7022e424ada990d4d5a07b32957f2078f0f1becc09de1810a945918a0c534ae67ac5bd483e8c269ff0341924c79b42a2f87d105227c0bd384237ad1733ed7deb4b1cbcad89bde28c0926268b3df270d91224237a181af2d35df207160844e31f7bba2e894da6d3de01b08bf3ee9112744a71dbd4a2019addb30d6daeeebff5f2d2816b0d89a42380363679ace656bada6b32094c12dad09c40cbf2bbea0577bec0616449037ecbb22c2c555ce87b5a42542570f73b0100683b4416d85e5fab28c5ec6a53eec9650e315475137ac1e3f7934a41c7f9079b4a4b010ad9163feb453a3d95f2ba06f9b0f416e413ce414e8a66317be3f4be59433338af5f83f7ae506007f3bd845643a506f400369b9172fa5e48b0bf2e0cd98d68501031a1b7514b00d0b1130b5a165a32a52909ba69cbeb83606fdb51c0b73b9e967541cb1219a9eb59a26f15100bdb6dea6173aaff8c39948741385b4a17788ab3a1c6b29b7473e2b1233cc430bf79ce743283011e081eae0c5a203de2eac5964cb81e282d9d7105f73f3710e89e403353134e9b4c9bc7f1092746a19ce74a23af770fe66781baec70a24fbce088576e8b72dc0467371773159b9aeba9354b53f1c4f79964fd54ea70aadf8b1f17a8bfc81e03f2667870824d0a7a69d15467f875dccc4a2a9d4111ba83795d0cdad5f04ae154ae9d55d156ef049d2174eb525103bed465e5f7ba4d21b8ad1e077d7f9fd45c15575ace49246339ec66e97e171e41029bbe0918d4581d918c58b5549d0aae6b587bf59ad610c6ed0797b04bc00964c6ab8c678cba2b7e0b51404b144b7026f2d8094abe4cbaaed65fe1331b6f8259d18e825ba5fd81c270be5fc6a963239cb6dc3402eef8a0e492411fc65fe9a86d4ee65d694be1a955cda78b9c2d923f826da16bed96f32af6127ec0425a79c774b3ece60e4b801c527ae0cdcd86f4e50a85ccae85b6bf10c2c523ac0cc8c99501a6148cd493667bc56bc3ff1c80f90f420cf57bf933376071a04fad34b9682741044ed24d29033c713729cb211777290ab79e20643ad34e4bbfc02a8d1378f62ead329610dbda4b47160872f02743ac97b4cdfd921c1be6ed71aaab8a09c0eb6602e3b51ece1986b8b274f72b601e86550639b14166257f672a081e5488add638d46f440a5d34ae418c8d27c06d4241daae68ee0c05d17566413a4c68e37073bc1a14c462b3a6b6e5dbdeb0910f3b5da0226bd7ad54b7d2430b10b346ab16caa8feecea3f2c788d04a819b2a0b010020bac9e56408f04aa897fc06b9dffc43e7096b636733c21954f2dc8b13cd26c85054c58a061485de344ec11b84b7c95589994a006a23dc9d62fc7f78bad175286f4190f905de7006a50db063ce11c20d3c957ec177dc0375140e61c80a23d30c93900e2713856bcb074a1f0df9e1211f8497289d57f2913374cdb2d7bd94ccd655e0e5192efba1efe6d276c593184fb6b46297493a322d86bf56143667088070fbc45e0ab780394aa9b9b76c0e2524374737b5a7b5a09ae4b14239b4e9209bab90f7416216668076cb7413a840fedff8aa17272baf8ab4c132224fe20320723d715e6e8132de0cf01287e0407a8916db1a2292d30ff07b4d8e007038ce5d4aa68d6d485c83e2ca5d234708dd78c5da5c504cb042d8952479a992c3ce0dccf7c18991b170c604a3c915faced98b3516df2931c51ec8ad540cf05de6e3e3d106bf95b4e5ad794dd0aba40cf528eb8310d3b105f0f0433da8342b92fa7f3dc91ac9c026182219929bee985b51c8375452cc5032a7d1a4bed03b9b4a06dc207e71178f21c47282644246933a8c022a61ba8a5a2014ef1a80eb12d4e0981c8a72e2182d8edbbc24c288c016e902e9ed7cb2c5beb847d934c44042c37fe08468b00e940e122d53a6220a3d83d75784f82a003ec1a53a6301dc95c0ca0cdbd90a4ae5a4b6f675d3c63c4bda5e49bfd3fde28d54c255ce201b35f67cf2a4f12048c9a88058579d4856d9e711e0190e5609b1ded71c520ad28fa2580ff78818a1ba0f91c8be53d6e57bb4f223058f00d28e671b4e7eee800e21d1ca52921da8821f2f9f418be00bff428e499d3c1f6612001bcff5d8e74349524ee00e716e1735bcccfefeb0bf80cd985c0d1f53950883f4444128f16b0ac2baf0119e7010469f2435815bc2e02181ffccaaf17d2a772199117faffb6e5c966ff05c204b7ed5d08abf06e6a413a6792888258e4325f617822a755039930560da0c986c91aa4e07326818a27afc4419902b2d994bca0f75be83f103df76e22e3cf7171cdd34ef95a275a9dae136565e69952c085ea4231f51cfb394ea1832757d70b02d0120f076ab32fa094a321ae143194ce0645ea8aa7c6af4ac9d7016b1690b7b6a7c449a5297df4f935b8778b5fdbfb6ff20001cb4648f2f693a81f674e4f3a4b9205a842663518c17c0e194bd0475da9f51f332bea9473a0ae5fc4481bfd32c8aa3cc452eff38b4d382d29b13e4b5cfd0225b6072187ef6fe8d7d48e0273208b54af72812d87115c64c2e383db4e60273f58d0fe32ab24248e0b536a88bc48eabe8618dc70b2e664e1b272a6598580e013cff86a07c84f264133a538507527fa3e6ee4ec2104812a3051631540954598e0a3aa0b85a702cce423b07df56e62040b931544cba38dc724f11184d034bd8849fa959f6280842257ff874f99ebc9a8cb3db4ed4c0772cc3fcf4dd666fc25a4466cda78de2955fb577f1ca84e19f98e7ee1e0b18361d28e4744d9857e4195f7f2f33e18f68726eaef9edfebae327a555d9ce9576b0a7b41aa1d157995deabcb0b95e8db92c6f6a101aed2f55499259878472a4a2280951c0f50554379d8455ad8c845f32dba842f0ec93a521c9b44e9fa622abc1075de4831ba9b91d83d2a7c8c49952fb59f4a1bb59079b4d0bd43e76efab9877ca3d76dec69ac7ecf93ec558d0eb03e069c6782c293c79a03760cf45260a38525fe28b37f27ff9e183312c16165bce7e8833d937bae1f99796be7c2ca8f0c0eb55375bab909bde7ee50497f6e963ed4439dc0d2a2560e0b7f2842a98d1f282836df8ffbedd8af7c77493eb7e3d71cf1065b8b3f1fbc1c35f9b42ba1ad678a48c9d8a84d593ab47f3a55a1d6a0b768ffb2c4396c192ab4e59122cce6cc579d049038f9f08d823a5c850060a576007b2a39aee91eee1bdda5be1b57efaa31455cb8a3c6e629711a6b1af8e1089f6e571572e1df7a815176f9c08a5d9cdf284ac775a8c7ed6538821fef5e42cc21f727644fc3fbbf4c39a8d9938a26ed0f826835da3813e1795d4758995a7a5a5ed8c28dcbfef1bd5e830c99fdac2ee38b607ce204352d2ad3948197fca339fcc69a8177fa0e26e8aa0f1f614cc6091f417cfa82b5fb7a2fe6f4c38f0410ddd127046be3b2985e830270114d5f1066ca91d3ce97ddca5ca9b20d72a851e11b8b948e058c0b76842a6e30d994bc1da4f75bece0530dfaddea22c13ffdf84f41e695c9f02964c51fff72936bcffcef95b05010203b77aef054dd6d1129b921c2ab27eef81218b3e720588794ce3ebab374db894299545447be7ef1d6adb47ff0644a87058afde18c584e0268f7a2050442ade83be73c8a3e39c6e33dd6004971dc5da1fd4e61b8ed9e31053511b5949190c11ee267d8bd81e77d1453dc9ad2d08f7071a677120821e81c51706d423451b4946d64dc9393ab88122493919dad2543ba43a85d7c28e3d6a99f166c72ec57fd55823c2689227dfc6cc43fca65a6592df5bc93a9075cd222ac6c33647ffa31bc8073642fe19c62e336c3fa95f8cc1b9d0a311a77d2d01841b0da893d86d0f133600f5d37cd39da379dbe4d24407220a4b60e0204fe34de4638507295476c8ceb1b8dfb2a57ba6e177734b8952ebaee2e2e44bfde556c8b8ad6678307fddcab8ef8e96a4fee7057eed21accc5ea77defd4ece0c439bc0ec79b3cf95901fba89ff9e168875a110ebe2f0b9caad1f1bccecca31efd4c58d8e5fed4a97db2fd96c958beebbfb0bd14e0ea6d8f6f9bf7dddadc17cfa121e17c7dfdbbf8c5b76021b4ca2143cccdd1b65865cb09642eadd0fbbac0050e15d40ffe07bdbab04fefd00cc72c27ef9a348fb9e94c2644f77eb69e8e7c9f6b6c4b355ae74dd2eeee86cb25ecf453248812e685a3ca42194b37a3ab73840ade36818eab83933a1775bf14aefedf6e69bad6109dc30dcdce4db8d68e82fc71edb771c6998eae686c6b5c29d0ec68d41e75e61b31ed63f6cce6e3c3793338e8a0e51ddf8856b15a680b469e8e75d47924c5f89d3f79c151c0997efa7ed4cdd5d68deb78ac4b1542c190b8fe433b7f6dc1ef06873cee5b5a7a1cd1a8131a813052c6cf24960f10987fe2579ac4377fe508ec6ffd2fce52bf525487b7e14e9beb6640abbc83ab0e8f0801a604246abb544ccd909d599d42860662c6056669c3ae85b80ff9b294116cf563a73f8193fa3b3162d9353e314c0cfaffb586ab523a2532ba85c379d645d471198d1a1a1a1a9b3ee453051ac44231ba9a4e90720ad92e912fa778466f84b7ea5f00560675c9bfb673973be2aed46f5bd7205debf55627dc33b2cbfff2fb1dfb0ee995a109526ef0fe0d140d7983997dd80e98aa43f082953e4ec415165f61d007730144931afd2a58de5f2f15f41c5e969c71d1a1ff4c88fdb53626d20be8a8bce8491c29b78740ee8099a71567745a7315122425316b4e30dff68dc0397ed606d9e016d1fc92b39558691869c4ceadf07ba6ef048fcd9697c02a42837a298918dcf8a7aa4f61e9901929e95fc6a3c4e17f96c4fb78dcf87f2f79d8d97471caa951e8d537e71c5aafae28dfc4d799a848c3c0200ac396a484b3c96c0142152b6d671d85100a61861228034884094ae30b21649b81b16edb6905887a8f2ed7ef4069ce3d224a1720f72a76aa58f4c69609a830b6828229e14ea7264132f296d8e95141375f4131a17794ea8a6e450a9c3c22fd1ebf47a4bd64370ebf131350f88615ca1b566a2af850d7cc6498d65bc29e8510c8284caed42a1894a1a3af3b81da4c8542b99e2ee3fd9c2d385739c920c014ad6eb80702c1aa5d37df538c162163af716a287c51845c6cd1d96232a32c1784039268468481ee3f9ac88d85d1cf7c70bf51c18cd5f69839311f387522808cc5ceeda3e1dba8e4a679fd96c5c11b030f3be41111b90fcc5088c083a24eda90f23a8be66f1a077a989876ebffaf4cad4c423c311edd9ba6c8f8794ae5a4c6ae5dd72e28c1f780d80ed4330e6ae1b05ed0fc74941a240d389dbc2c2dbcd1f213787de5e907cb2dac792d10e963d4a9d9724b541c4d1e9bb18fdcb435c19a63ea2f141a346bf95808b6e72e6b6ffd65b26edb67532676440b8ddd27dc75c403ef4fee00ccfe1c04cc521668386c1e8bda6a4ff5650f73073654aadf151a3e665b55523e523acc607d643baf145564e83f911b9a24f06a8fb311aa08f48b596290c493f1ca9f21f3bdccd57d43cf34d380c0018c9d221c1e8757dbfb0864cb5655c718547403f23374fd5a56e7bea81b41610be72064e767a88f102b2461267b23bf2e47365977570f88b41c465481787ae588f5c745de2bb7c2f432ed04a6519bd92c3dd0068500602b4da0eb2c180110580523d1a8e0bd663a3f2f766f2b2598d49487d13187e64613716b6b3fd0a4464a009dcb39e16df2d2423fb7154f20bbee75c453b004b9d5e879a033624770b10b0190e9fbe137fe2bd98cad37b01e3f9a042614d59e24899219e448ca42dd4cb700e866d244fad71747d416aba1e85c017d8f33c132c45e18417c289f0c2d572699842d885b6c0918616c03f992180ff25c729891bddb74942b09ce98b90e77ef91ad48270c84a5a928e8c86fcc91e0471f985856abdda521717f00e25a071433d35aa9e23edcebccbee67624ad262fc9a3d04a1b0ee0800e3bfc1e50ff796fb9d0fad3d2991b0effb88b148089218da3c623622a7ca1912c182a4f1de382a04cf508e3b61817f34dcd2b671ed8dcc812c7f18330c5086c4d07f019306096329407307a819270edf05c3f8ddf8cf8ed4910826eaba2780840baeeb3d386ea7359f1dfdf929e2ea4439fb37e415777abc3f551aa5d1cc81bee055014dd043ebd977376b712aac120924a61e06af20bbe7e0032a6e8fc2122c44041049e23c026f1d85f0fcd8ed1d51ffa708d5a96b5b63d7d13aea1f8f4c2439909b70f59931e324d15eb538293fa93ae7b591da34fdb149e382f738258a216e2c7bf846af43a4c76b49230a344860135e5e94e109e09eb239e3d14c301ce1e0173e499eaed86e1ac7ba96785cd7e816f9c20fae8afd70426af20089f31f4391f1ed51a5a1137b7535d71924c01516e94cd6917d4bfeadcf3aebe0ae7479d2f5ac1b1b2a730393a3dd1e25b12111d8a4333f51c4f2b48b010c2bbcc4657cd24cf9b385a40c2415a6fa038b84e6d0037504ad981b9c38f7be8e48e1061aa42f4651c40c61725d1019d17e5ebb943e591acbea5c63716f786212f58e653f74eb973dbff74041df50768bd10458b205c17781bfaf49187a65b81dc422442330e75a4893b5c253a1dc03e8c01e7c13cd199e5e4a3ee9536a83f51a33c7bb8da8cfe3e277433c477f792853028f468aca96c0d028e186a9ee3d00ce9a70408ed6b2cc4c36b169249ed71ae86d05ebc6e46917a267be02c3dbe6cde60e4630044c5f4e6bab68f05eb7248d70badf88438b5a42a48ef03ed2977befcacb90b7b52a9ae61cad3c50f642d45e2d91af0aa24d4d4097c77640c9b63df7ba12c1c231f20e9820cfd51f013bda97a40d4a6d91840bf227013e7aeff2e69c4195086004b6b15c0ad925503772713ac636bdb3d1118c2ccc98b32c5d22250c868f648fc2fa5798d4e6a311cc85164c7602b2847b03c2330ac0d76bbb4c440117b08615ee3d3ad424bb6ca9b79a8ab998da322dace2ed7f59f6ecdbec3e036270335cec03cf9096bbe6566d1faabffc1f6d75cc03484b35e55f949390fb4dc457946a518ba02be154487404653a5f2d642cc8b32cf1ba87ac18dea9805bc08e7d53590cca02fd1fc9c09bf05388821053f4377745ea214de612024fc0399fde8393a755e416a0bff8af0f51d0a4da10dc0dfd51ffe830bdf3291e0878f7f19b05e363415c9dccf3b682c61a106736908375db2b2190288dd923cc9b37bea1c20197ace0aee958c214ebb0fb155139c9ff2f11b47ee98975cdd983b9ae3b6f9c7dc687ac883de6645599fe80747b4f297ab849d4e3c239ecfb063c34968f216a7f57b44e83cbecfbf102a81e083c950fad8c61baedb207bba8235a9e4eb489cffe60a2cca934012dff7feba6a3d05d475605ff96ab40f5289002a9255465ef719c0842cab0a27f6fede2e987817dbcd29a4ae5f06c9d02f30b960a4a21c0b31a815b81e385de81e37c6b88f9fbc4d8af1bd834b716e910203353c827b6b2794a1e1f8fae73972891ed7e2f997b71ca399bc2c68b701ab51c9521f37478085c05b7ba042c178dc781000653cf088f951e6599790057401d019d0c2a1e82e4961c065c172e86abc5d6bf0e39741f1c596796432f873ff4d44ecf6216222040b41ce43d3879a7d0cbd44fe21f707dba12a4549c8e0f55b6de5f4f0534f4a5be1d73a5f8b7793d19d8a12110255ee59d16e7e8d7c3ebce0e9c245bc987e7dfe13d80781b7f72596d7d4b960602f5ea14e792b4c1ffb507ea73dd18b7643b22e3b5fed219b921ae8216c41da0bc173907413fd438ff62d7efcb2d53414fee999519d4d07c8749f308efbb61ce828389a205f4942748fba2d395b61f4a08387cdfa3654910b73d4c31f85abeb9781370d6d5268cfb435b8de42f292f9a00fa46aad0fa13ebe001d559342f29889eb04e1c90a386e094060a13b016af8566377788b95cbe13e403da5d9528fbcb300b1555159029930ebde35062c84ca1fd84e86274c41fc4bd4ffe7ccab29aaf73ffc2b5f52615a67ee7dbdb3dbc9565a94ddcb8dcc93174cb97bba3ad3f20c85c8cdb4f9b5983e84f72155a6097dc3e23d3470572ca8a11361a144b9952e772a2b29bd7a9a57876274f0e18e28ba82b8b299d92b1c4109ecc000fbeaf469fa5b16672390575f4845b4da12d3561583b581756b34752cec247f6e1a6b4eb1184f0eb1df968f726f281ae5de1b6c780490b9ae104559d015af6bbd4e66c1e2a7348b4fcdd2de1dbfa87657a8fe43dff97dfd01239a447bc7b2420f5759cb1ea011d009c53ec48f0f8df52202389aca09c648da06f3ad1a26136038fcbc058a78de49592e77efb624efaad9571bc4f22b836608c16657bac1c67f03fcec2d769c88478323bb82dfaea9b22c41c5ce454098ad47b4364bd0e52baf052d617f0532229309950af87586cccbe498179941e3596ddd696c2533ead8720f63e4fde1fdf0b7ef94f72b25a46a572209f3a7803751dfe8bab1dc4ab609403ff490e9e036c559cb20faa6de8d41680bbe5c625c1d6793f10b1d4fa1e600d46e52445b94519bd5c83b6db9b702c8a08f65c1c002c572ace2da0e372232cb7d65cec9ce414a9c6959b37779abb99b25c9b4392c30e3291a4387f905a77840327d22d4376f5e3d41b8a074610c3b0737267485b06469cab4088494cd9757cffb4dfc63dbe74ba42831fb3c75d4833b82e395ccdbe0b57a10a71671fe70a12221888c878ee3ad18e2a7068a5fdef6756458b2110858768f505bfff399dce0eeda52f1c3c0c4ae48684c223cfc61d009580d640dcc95732819f313bab6290c29e6d6e3fddf9188585a31ba2661787de85ccc58a37e1ddae422b1061921011c4868f3a17290a4ec47ce56a36e050cfa9b8ad9a85219d50c44dc4a41ab6fc01390424072e960e558ab2874eb6662f44f8ad5e96b3fb2aaec1ef152e2426eb5583f66f62ce944e7ecf61471c587e14db53d68d15b430b1834cc5bd7f8c3231cda15222ae66e367de2d50cb7ffb8630420e26ec3e6fcf442bd040324aeba56e4eadc27a3128b49e11b6d11194082870466a6e01068d8d4415bd1db3e7e0920a3988716e53fd52a4b405e4960ac3aae5655a214ce3db4fe685ae014919505752e81d6ea657c8771cea6a81f351e8bda85b08a802143d85948f04f58a580ac72ba8d3c6a1afda51353f2d8c328bf551fa23e2bed4b350c82854853512a058fb85182123491a8476c0a4ffa169a3642b9615a20f10d772fe6e5d16dcc871496f08e40dfa360ebed7d0df67c4f2c8c0ed2db83765370b85c2c81a788471c08d6e51dfbc5e6358fd4dceb1b47dd1a3359545dfcb5734370302c4bef26e7dd7d2c316875512f7e3b7d0929db59a1daaa45897362299f967e5569238f6da3a549144169bc8a6319351f4e3b7eaee7eafeea95d1007d207450da11a76f2cb8048e0711b65bb1b718318c7797579e33ea2e2f3a8fc50a887fc8affd8e4532e3c5bc715e1dd961fdebfef7dbf4d0f634504e2359f50de007be3ee8792b87bb95b973bef1dbcef0b3327d25e389feb2876f2980c9d210d3c09c0867d3143a6b940d3d680cfee0c2c5f08f4bc75ab4a76232b92b4bf679c636124f6eca248ec8957b6f0f456ffa871fe9c17183e57bc8179fefcce34f69c362d22024b652664ce2053fa886e28fcfb46bae7eaf4e24e5bd911e0c038ab1dea4f0ef49bb6b223c08171563bd49f1cfb9a4a65fa3847604d43ff7a8e65f23e43cf4080c3faf6f413217512dc3220f6f4c97c6dcb471488675587fccbe9bc39d586f2b07f130cce1c552b2afadb5777de93fde037815d2d17c4351e9750f1a4e13d3facf8c086fafd3043bb6b92618761634914077e57e201403beae3a841ce6c049a9085de04b26dd7644a562841af8a7175f1ac38c343c00e8afda63bdf859e7f2d6fdd93afe3514923dc00dd9ea2225bc49075c0b4f15574da927a87590690f4b08d9a0d702f824cd0b31e678f478bdcb40444d43a4d057d05ce3a959e30ce38fb528b819574bf2b4c33626b4eb75847cfbbc57df60ec9dc2408cdeabf4d4b7317e62b8a4b6dc3a9b5cacccf27569528596ffa66dea00191c8f713dd2e5ecb1d1d41be8bc72e1343da6bd17d981e819500c8f7b0d3e5bcbb2430f1841256eeb25d1b339bb9401195a42b309860c2a335b00a288e2c2205a73d1e13fc678e7c372f016de47583c0819bf8b69222967a1ee250df46a3f516e3b0e8a8fe36c3e362144d29e05beaa0ea6f7ff862cd6574252df2b7a1ed7957244b48bd32736d59c164163bf0fa1b0af8068224bc283547c79550fb7a2464bea7f3a29f82620adcb21a30b38a1971318d2c13c0c30907216fa79f7b016782c27f01560271ef4500e5c11673c10a05f55a1c6e43447c0f27fa82255c49c7c95f4a4834dbce04df9cb6ec004fba64bb8a54663e67a619ce3f3fc5aff5f7fabc4ae0a2f241e333b7cf01dc667a7a1e095b1bc0a4a908bb4ff5904d5c193d19ca9cae754735747ce391f0ca7382ecf5bc7e53aa6dd4ccc2e664745d4f6f2150280e349a82fb3db134664a052d11689335410284a424d41cbd699b9e269c381a4f3799108094bb7633d4307f15f06d0ac9c51f7a9167958d6a73348ed056477ab7f1cc9bf4521bbc91c051365c88e761c445ab179d43bd3940c51c4909cfbc152d281b30069d12bda0e361b4c0f09c101b795606af7b5c4d34cb628a7e17c55594ea0d56e27d5adda63b4ab8888ba65c305f578ed7fb08b8028df6c1d6fbfde5f6b1716041060a4db3db2e77a3346838ecb424a4e879c567bd9d22035a0aec04412b11c16eb46756674b84debda992d549f4ddebe808eafb8165d51ae79b973d0ebdb5549e5129235c03eb825d0b63e191f8ca8f5880320d8e7d5c226d8b2752220e6e7ae281e87fc532be263633bc63f572a5534bc5b59432fb97e877a5d649bd5f5818beb7b88446fda1247707161d8105a93b2535a94bb9bb67cc1f9e8a03257263fdd14a1e861e1af7548a2f93d4f8e6ba88a6c10fd72709cb962004003577a70e78c9eeabab296cfd8ccc48b0c6954c1e02612c19f1e84f6bd03949127c1e7b452573b5fcd19f2ff45bc5992236c24407acd71fe6b5abc288e809e0ec3e58763ee8aaf837ba6f7255e4621b787a02b272e67f34decab9687649814e8b51d6430a08798ec67d783dd7ebd9aa15edad076b2572a551b039b16554f83f3de74e808d13031cbbbd21833c73a5e979464e24a41ac0e672b6e3b3b8e42281bedadda068e72c8698db2869d2c28d16103b0466772090871fc62f0999c39899744b4344e239def586a0b86ad623955a3b5aeef1deca030b10f24876d30d52a0476bb12ac21321e59fcd912bc0c6c7bc18901e953501fb057b2624f053735a4e064e324c8f0fdc59f3de3ba4a4f19ca2bf59b2d88970a5fea1a4767100b53f868f975e87c16943f7301911a65bf1974dc9b9ced20bd668f1e2269d4a03767ecd4463ad946b90231d2d1418f2b7e9cc9ce8894161a33b19968087d6067c525b326b27bc14124496cd86de84348450da6c42d573b489f3bac52c43bef76c3595787cfba5ce8ca727978f5cbb803eec194b170909d1d26b57af4dff8ce7b437089e9748590a1210390ca227c1b908eb1bcafb39bd84d83ad6143b414de1e920619b727e60591137b6fe2beb59515c351c1dde0974276ca851ffb80b64776d7591a091051d7c446b33e8f80a55647f8bcc77bf4a33221adc3be4b28778e84580b1aa99ac04827a755906575cb0563c2a629f55533fd9d0150a29a4519846ad7dc0dbc6a54f6d54c76b4f0cda082c39077c4f2a909f6c516c6433837e893c402ecc24cea66ac5dcbc1d3fe60c415c8ae23fc5c60b364e626f09890dbcc32549ed4143041f4b53b13777c2b84e05b837270ca8fa6b8c4588939e9ff75fb5e0f35ae12e7575c143881d9e748569f6fad540433ad6d08441c830b8baa88e419e70add0d30a03529e092a0ebf5f24432e69428eb3bd1cac6befa24da51690632b3225a8880138d09fd426caf8cdf39cb0433ae72041c7f9007073fb89f0819c3edf099cca779b413d43db84336c380c3b0cdacf556e0f0dc2002ed284f56da2101808aad0dec877c1c1d422d17bbb90657c390454720aefe61985fe4df68ddfb5534cc5889982521b4c8abfb82a792b2812dca4c0b47e1595318bd795648b4cd8c90391ecd2e62d3f5f98466e9a2e79024c0f54ac3bbbad170426614dce40448d7c7f70e2a197874471df9bafe5dd9688ba0f45a10260a98e447cf371eb58c398d4a34b829d9a38d990abded63b461dddf7897ef11f6f00e8e1cbbc46b17c69350fe31e5dcb7d9097999b4be21e963b5fe68da3f3c78f2bf3093f2e8ed1a90908aca6e0c5749c072cb39bc55f9606e2d6a8e4e7c78744690efe1e39955f2c457eb1927931df5fc33abcc03a400ce6b98a5d589715ef8bc2499224344b03c2372d14dd711976ff37d3abfcdee664514260326fd557247699d81be762b8550612d00c4b66d13802719aac6958e82bcb5c8c3610d3f0f2c622f1291ecd1161cdb446368aafbac2921841e8d094b1e945e0e00ae47c1bce0b9fdcde34572c00bf256509b0c7958850002d30b9898e5f247e4cc8498d6addb8b124a7a203188569c0c18408d8164a6e3b1320e8eefe548bbfbd43a3015a80301630c171bf29b23da4c70f63c753b41e10fcbcb58107a72b21532169c40a7e4149683f62e95e33add1503726e011bcd5d9eb97da523305d8302f9a519422bd6b98b6a52c62662398650035d4be9147ab8c5426560ce27a6aa3b5a98267e93358fa694ad177ebf07d87e67e1dda0d0842d605c96d942fafaff1dcddd3af7e4cc57c34e53d3240df56d08e1bc015f86fde8244582e72c55a90fa3aaae4762eba67f7de9c79b8448de21c2a1291fb034e8cd65b48f8463afc461da58a383b74222c446c3dc69d7c2d1185d4f3a394a62689839d77dab0696900de73db3dc70444e187bb23a6ea7e8a7add6cc11805d0b3e4fb37a1d09d0f8925171b473e40adcf01e64818bc0d314de4c27c9330800953b05a2d55ffb629b16595c825c3bd80ed62193ec0597a9d463d815b3275b03702de3f644755291af9cb842214ac8acfe2922474e4f93fc1fe1b40f18d0178c194775ac6f7e818314231bcf3525f55f4240119e043847aa3ca6282a359e7d99152229ce042d451f9db8e95dc53362a6424d694ac6c8e8a03bdf4d15f77370f89e16402621b4f5ae29337a806362fe717edb7e6b540a3185de330e5d3e401c73aed00b4758e38ae006ac3101039becd762c7eaf9b6aa62bfa6e9d17f8b0c4cc58a9b361b5e5d76c1ce2626d261994b0f5e219363d59347e727be36a2c6015f2584fc33bcf24f606ba1ac022cac8c48bc1b2f88ff340e6929e7811b5fc72e71cc24cd8b05bc7f7d989438b28232f742d12eefbc1c076fa85b89cc45da3474292a65b98991c9fc63011882d78829cd40911b0967f27e0f58a469b3d60ebb801fc424e5f0cbc988cbd58c67cea00e86c374a465cf5b07e70e4c0eff5cf135a4044c4c5831d3cbf107123e0031136df7c5089f28acf772e9f1920b4cfb0521910b7c28002d3e7a9972128bdd80355b00a6ead7de40171b10632a523822e3ebf17b79b8f0d21fdc27b280c1a100b51d0e455e866a07161c40fb4fc718f5823963df992ede41aa21bbfce6c6885851ac5ff34651e8774c33f456e8ae5c8e110dafb3b0d1c0d17e1bfb2eb96dd5f49c2601b169d6bf8fd41825ad224a24b1cf67e98f5e8be20961b84ccf8e0a533383caa9e7f333ec69af0eb9326e7827b0d416b43a73aa3670d51f8988ae35757b6666f0a744904868631bea6197d8616b6e83d9378c14bcb2a951f8c776ae52231e4fb11e5bf6ed0b4e3e87009115c378a1ad2aefcf386d64ad74ecf6d5488781ddd7c939d8a14a495d6a85b7b24f94de3418142f162b5f6ffcdea3d199f4a9c3a863f8ae93e509fee08abb549dfa44ba8711d4b93d95e1d199f5ada74413a1ecb1a4852a2e51a8e20b7fa6be379a3eac5bd084abe959894d2157d7d4fec984da150d25db8a6b7dca60a086ff38ff02379c187a53b960461284ff493978c9a5b0a45e27d82e29093ab3ca1320fa07e2087dd7bcac5f3733f6a970345459a8fc4535539fc9c4f4fafa4c464b94036f4b42e33a812b80b225cfebb3560a23fe8d28d6e1ae111ba63c0df54fd61a8f3b325549a95f89008867962fc749f90602ace905e22e211f1c1280d01536d337eb942509817f1d4548c4b930c296e336734b88876eff232e13ec75f6c12cfb63bd6323d1fd28fdda97fdd61a7b0c4c3ef6b1ad875bbf31a4f30011b99794bd3516b85ca8a64277d81f0840084e0b73de08ae2fe1d3591b693f5da767a77306ba0aa27aa02e384f7e20aa58a1b9add7bae0743ee21b5186a9d3eec119271eead744b8e351e218860456ef738d87ef999aa32ec4fa5f5c5c5f4ccc7eb214190ab7d8f36e077c59e3fc89d07fb13105c5fda07fdc809b566e63f63952a1e5a1cde1d69885440bd433591ab5b3235a9f56e3f868d578f0a0d6476f4f25f1ad9709d8aad2127738c1d66842ed0fad1477fa07dae75767593c954f5dbf528622e6025d890c382b3e64c4fcc60a8f73cf1a3308872171128b55bf91690c704a2684ca60163779e1b47811b9834c7801085f0a3e04245d1b0daaf8488c679c46f966bce0a854f8682bc1a2bbacf229dd0fcc7323c3e83dcb8c4c064840a1aa2e18111a5f2824d44beaa1605a0ec931c2d3ff7c24ac1e68d67ff028a995319252ee45082729b4c2489366ab5959f40a3159e65a06b12176211c3d43b665874f5ad28976aa9efa427e3c2c8f0bb7cf83839f18c8c48305a28a5bc6611a6fc011950a861a9e0fd415fd3a8aa10fd522a78b272ee34a95a6f76b390221c5305c2c7f90141bd28e9de2b03ec1f2edd7251bc1d5e802b07015660e1998807181d2080cb8c36bfb2e843a43d875168bcf028d8aa7091f0b0a81c1a504fafab097a98f792178cd69d99d2775909c08f0a48a564373c4406a15ad0e11e9496d758864c0a6970ef07d032463b3016d705e4f5092ef4ef8bf89465518117a2837114173f067ea53c8efc8b9fcd313d296f3d756384e1a2794f9c129d97f433709340ed07dc9e65f88f8c66d8e7ea3c8213bb54ed3ccb76d21d194576aa2b093b755833c3ef50b7f49666e409b05d052b5225c6286d98eafbd6205b8dbe754704d0cc8de188ebf8ad13b6cbb59a8cd236d31bba93e87133cf17d92e345e7f9596e4e61faeeaf5dd8cf73a04d225f2214cec1bab395a25b3fa6fa5ba66176615a34e232909d27b6bfd20ae09344574d1fc7d75344106ac242aaffa391d9364bf6b0d860f4caa5ea6d00802077385b3082113d7c8bca64691b8b9f099a01fbeeb69841ae6cebfa5e26685fdf2f0ecdb9d395382bf9963fdb685ea3c0178a6f6b3be66950c731101437243591f9373da2295e934b4f005853c4e446cdc0b056e0032550d01239c09276eac58b26f02ebae85e593db23b30efd6fa60dccbef3e96182166c5af94f44f1c3efbd92f086d6c007489a9005d7f0086b04651b61fceba9d80ac50dad47137bed8ca363f01c421812059a92f460535c5750b55b6232ff6e297979ea25ebcbbfb7d97fbbb52e3b866fee4b90b1ffc4d7a695adc4b82eb7f0b4c7372328ee94fcbe74d2363d3d358e61d4128de0f34c1d17f0cb100366bbcc9e00ebd01d5edbe054bef0acd200c10fa5f2ce6553c1e4b8e1f04160c394e6c5bdfbf2e69fd49a72a516a20d653094a5e0b3b0b475b8d7124afcf3c119e70c2b9b53fd4f44ea89d683b263055a1d462b728365d034085c0d2facae5a6566e004a1855effd4dd0bce20a71a3c3a5294e786a90b679be10f04bcd595f04824bebf152c573e3185c2d8d0cf5727981297b588ce367d39b303a1ec1331e1cc5fac1ca091c00a22483e28e023758b5eddf115a63137aa0245ae27cf6aa8bcf0637cfbe6e5dc43050f8d698ba37b2efe8936e49b0614986308a77f5d5ae7030437111a007d17af1784948d6e94961d2a89c2a9598043b9f5db3ea11a1a0c13755f7e3225fa18f544d3383fc90bb75990c87322bb6dfb411bd9a6624a4861ea8a48bca8a05757553a939cc741c2daa7db5d53e9b77ba08a1f8ca37fbdfad5601498c98f710bc0a9fdf59bfc7383154ea4a75dd38b00ff8a9259f84d24fb4e19bcf9053a88da1527313c105f3556d7350a3e2bb24060062c2e214ca3f491a080a7483a022d526576e5965c5cac749a3d7b05366cffa5c72b89146d984a8f5b53e659b06ac50cd3a99a7afe6c94d3fae33e67ef10e061d94b6a2465f03cb1fffd2314fc2bbc6812cb89c47a49b120b49a2ddbeaa4d63b87013eab4e9680a0175b2441162c056e7391eb12f7ea116886012df529096b85c1bc7b0d87a17daa60d83b98ddbf3eb76855e8a2f7ad80facd9e97b276b513148126e4a26bdc19d45f4ad643dfb5510d208f2244c40f5e155249f3933605d39241ad82ecdd6c68c9c83de24b610068cdb759f12c2bbf3a0745b1360841add126512d8fc2f8e766c432e15495743928dd52f3d2942ab3967f5d2ae670e3ee7036d958f24a866baf040f6051d69e78b805bb04ee04ad904371316dd133722d7981423fd7d0bb3d2154367fee4302b3a8b09e978646fb88f0ccdc43c72b098a0777b7a4b78912857576c6b7f6d280183ed596c5af879611c6eb2c5a22f2d2c768fe7d2fd3a937434fb6ab83cb7a4bdf08a1500f2bf92c8510abbc2c635b547b09beb84a64fb2f401d08e3850b4f3948eb15106d6a1f6e421708e70eb0b862945bbaa8494b017fdd5cf9254465893d891fca66f708471ce88fe2d401654a4f8dd573e86de0e212b24571a2f38b84c53ca0dd88d701458a566c23be800a20c095a886063af918c3de3ef8e8f3b5221909678552d9825c34be350a5c297fcbd4c48e522b21bfefbd52c446a9951e8ade1f1c7cc80a319fbee8edb7d8963c76056664ba861206ea487e60d81f9ad2e26504e0988c8d45ccadac8ebadf955c0823c80bb493cce468fa96c51a437c27b1659841b942726214fe8628cd1ae16e0e222252f5e2b6aef9924a9ffa2294db4866d553d6bec3a93118e0fb362370b2530e2b9f67f8474c359bbd2d8007e157dcc6aab54fedea8550644ed285f4df405c857e40cb4dbdcf0d967332c7c6872ec0224276542f833a1a609f5f78cf90a38845b96e42fdccd04a6055c66a8af6652fdcc5f0af51e4f8bbc61066168679b178d0cd8d1f1615fb8b05d07d6f5ce9b45719fed7f653aba086f9559b0fe89bedc6a6026bda32fb705fca54e8dac482af251f49e332f7cbbd0d182e390a56b4b7d9513a4f2429bbeb3270e326c50b0f04132a6b4739c42b164bc35cb7e4ce3c0a7c1c5e7cb5a53eae2de3b9f1116bcb3bc0ada26f5c352ad3b03d4662c3a02902c985e2db84174728d715806c657794d12f76515d52cd2029acec49cc66381df20d36877ff7941900c3cd2a89376dc405e8648467f7014bffa8893c20104c0f654a81bb2a5d1239b76b6f0d8b63e9dc52450c6f24803289495167387768ddcf227f09d9478431a0d62af92ae51f57d347dd0f5c2483cdfb9878805b69d1a87c45a993850447672e31726473b8d3b82d8e69606a61eda42f138fcf54692f6ed00fc16587e3759237a64a75d43cb9c40e630153dd65b4f8bfe77602702af754f0c4a0695b6c4d52cd2227a112ed7e8e2cc51faac879cb45f700508bd7adbd6dfa9d95f401e874c5b5013e6e9411eb45b68bbe8c4bf6c0da388aff845184b86a1cfa47e7090c60f08f624a6aac677aeb3be54be1eea8cc5d15b7b7e0f11d2792d9cd94fd2b66d76a3fa47bca4494fd451822291ab80b2d4d0eea83320dc5cc448a1849d7012dc5686b389ebea2bbc49e6e99f9663ad16f1180a563e8279af3c0959e88f8fc4594a09b686c034ffd74bc64311c17829ca8b5eac1753e3a34311f8ce32087df25e2fb0d4ea6bfb5d29a804d17e35c7dd4a316749abe7ec97212e6676d3b6a736b5234560c4afeb2421605e6844dfd3b741937506a8e8d483883bdd893b41987e0ff779e08e1b1696f957670a6f80e1ce467ff10123408059a736351075b5f3b455082114672fc1bb8626395b0efff8a73b2f1c8a5c5de4fb0e3438a641a796d0a231b49bed6235ff8801eba3d1f283d53312d85ca271fab1a20e9ad145e0e440b406889ae65c7e31e7a2c69940f1c1e4114c73d3704d1715e811291c6550e1604dd81e0f7032477869a4f9a9bccd73ad81c4e43d72c8f75d14f188dfaa0a9ad8b616190b4403c2362a86911201b3ba99d9c478ed0c732c2727835ca84df133a3026ac651e83a30a97113cbb83a1054e9cd90ac01ca541688ec065ba425314eb23eb46126cbebf5d730fe396cc2ab602a9d6f61f71692763625952f5e84f5101e2deea61e442d69db8882f3f33c3d06716c4337fe10f3698bc84b70c29ea9ad18144ff61ddc2127fbe5370b4049bdb5bcc2066d60e559af6c6f8fdfc4d65403d2d39e15d77a0a04d801f5bc8383d31575f7e89c6a0c9842aec06f3f8dc79c585205830867ec2abc48d8247e09437dddcd7080aad3577904389f15702f44ab97d28096a19ae8245ae7f96a1454a8b9f99d44fe45cada1f65d03085ea6a87dc2c6caa0b4edd86f606b793e6fdeaa4dadc0f765e388deb6c4d6fa814d39dc8f9b69bb992a72cad5febe4b0246a8a29488664777fb1318b878edeea772a1fd48d9c5b5fa05e67d35f22cc857cff323ad028ae35c3fe5cf7d73d9d1bbbc5e9913a9025fabfaaff6333126aace6e8f0e5aed6f2322382c5914c956c7dc27fa5840f93de044faf5944b0c8b5201e138b5610fcf203e1b07668f0041f6aa8234d16fcaf769f1d22ab22e0679d73783a292ef9323ceff6151d3439b55d728073e02c11ee9d63891bf3842f7dafde5779954c8c57684c8a62295961acbad43db41edf58aae42e73791ff4d88355244932acf9fc0ad835f90191d457dd4ef40f9acd45b1924235bc9996dc467e746b71e8036d36f70fc8a800c4b2c2e7fe0fb8b07716fb5cc79760525b7c406e3ef079ab8d59bc51b24ad55b4e53d8ac8773e1f6e11f2c6ca064b5b0b054e83b164ae8966037828015dcacfb337772c8d4e686521d7e3abbcca1f605e5643cf827cf53cbf2a91755d1f8c5bac7f02b3be5267b5ecd964680017c939bd27009bcce42278894721fac119f060f17a677f1d1a588c7ed5ca7f7876ad40ce4adeb468bf95f849d504b7ad969ff04c253bb26d78db993b44e4c0fd973b43cd25619989a270bbbe83e08831692005e5c5aa72ebf210d120726e52232b02b5d5d71bdd692677bdf60735795bb6e0670d7c4442af5a7ff3005ae7545588170e251050537486b0ff1aa91be05e0e9edf7fd5dfead325fc5c3d39b7640b6da04566afae705ba720c9bb51efc4e1fa6636497aa57aa6e81ced008a406ad24f96413a5b5d1c88648e6be6e917a3b818f7a64ed2a5cb6f66b710fa17fbdd1ca8954e76d80e798c160ba53db3b551b0de98bb77511a9ad90201a0fb207834b0d2f042f5101639e38da1da468e86a53698494632fb565618283493ac709c8e9009f734e1bd7f4eaf2e200846ccdb3a118f5b714057cf48d0bef5556f5add479d14c430ff0feef7fe208123863d77b1402f9445cf961d71902ccb20bdd870bf43a965aa801fbad6a05f3579b28e6a42b3e264680c18d28da88563bc6a81d6c6b8668edf6c2330e757f153d4460dd215e9858d3592670ec91dc7302beece75338116a83d17406f72aafff8ec967167ff53e0283ff028dcf71889666b5d25d06ef7aa9d2824c27ba2cb4371b068583c4218dd2fc09d69faf4561ec4bb5bac277f5ef7f3fe43d20d8f10bdbef64cb8592d56bff35f1f4ff3d17057f3ad450f8c3a9e52d8b3de1adab25bf9df19c86307ef4ffb6b5be094b3da97ce23788656b00dac921fa0c782d761c4df684ad50332ea8f30e01b0f71bc20e5aa55eccce40f222fcb3b6dbd69609419e4fdfef7f3eef4bf3eeeb40f235ca7891ecc4abf4224ebee14eee83c287981d5e29e97eb6bbe5cd6054653d019d6eaeaf421a9aec51899af9d1726bc530cbe9c3f7dd070e3fbd40783344f20a1d80fcd58a5f8045453fb5d67588f0c25b277506368d41d7f22ba6235dcf9ac680226594dc433cbe0c61a48163076772152b0f8d5376d635a9040a614cbdc3236b60b388f9601e39c22e79358fd823614b4f2fa37f33251dd592d6998960d8e82989c7335e14e6533c4679746e9fb95402f91ae3c9f3551b8e40ab06ce4b3b54ac6100a0574e7c63967d9d4b672be032057ff387a0791491fa93a0ea5a48cbaa6f167465892530209212124d1c82a799e6952a0a3fba82d1c966a7c23978126783103e42a13beb5ba71bb1b6c55c5538327a5ed929afbff884e5a17a61d233387e39185e0e2013d509a84601c5f625652df67cd98c8de28df0c9f923d16490186feb647fc5d447eb7a276754f4888befdaf851926e69be095eb0f20004c4b4dc2421867ff1d3b650b0b9c440700be11bb35fa1ba00d3c16b5a49c60400c03a09099a7483df717d5b496017bc3fee2bcf57cd9ee792a7b46c505828363e5d99aff51d633f41cbdfddbbc1a178017bf8c00a7d3b5b57877e8382a4cf35fe1d1e4d8fccd5933247f12d9eb964db51803c3963fa364951baffc436ccebf91f197e5647a36d5ed0904ae5acc549f7a7887d7d63eedeaab91fdd8b52e28b4b0e4f15a4231508ed5d21460885ae9729c33d876480b18bb74f09af42c4c2cec85fb17830eddcb37cfdd963d338aab6dc7e801673ce8005981e26f540b7a8409db3020a335c468876317686b7458ccfc60e44a3a276dfc53e02a701f0e4990b8243ca5014a0f54e6ff1ca1944d888805aa2babcec95c44cee17d8460af161b0da3fdc3e8670d96c8a95362b4ede49653ca2f561a35882a207a340017c62b711cb08a2aa823601c31ba107c238bfb339427851aa66c26354999b487c89419dbcecb15bcc9a036a7082a31d36520d30a59a20cc0e4c51a58d076add31d9e1509cd8bbb2d2a5964b8e0d3c1730210788577e87d3910a4ad0068b11c0dd51f44d2bb35d70fd43be5aa9b0d046f89fc929b483b73d7d8064cc1a01ecfd2173c042a12c53ba6d896a6392b929686b10f0487a8445e1b4e7f1ef0d0e405b86061c536aedfb3d8482d08c605ed60ac68f634aac84f22d316624406907c65a8d4adaea2411bbfe10412edb88c69bf80a692adf06f1a7eaa3ef1054f0a966c17e69332300a0b5081c6d83d86a3443516b045c3be565d25130e5504373c696e30201f739d2f0094b6995420d8a46c547f65da0167ec122da5df4390500ea7f28f77d0db9c2e921c5947769691a065c94391a0eeb2dc8592f2ba48330d047a6baff95d0123ca0b483a4142347a0742e4aec84641850e50c79263358f4e49ca4add3e567290e74cbd2e93b042dba4b406761dafd7c7db49b91317997e1384596e31e134ad3b012471da716d36d63244ff4f3dec857a7b881b55f806205a3d815c60d2e6980de72946bf47c34b7cc64280d7ebbb61b9ae97c68a5e4b4254dab726dffa6e0220797721c14a74cd8ce8bfcf839763c0373b6e0d424da056a67d6732edcef8679f2f3d84ad1c780cd615f3a8e2f9ca4d7c2d8fe838442b0e61d2b9dfaca59f325b60a19949025011e902c4761903862667a21543ae59b73e3e2cac5a181f8a2e7ff5f496060ba57b8f72bf8fe27e37e1fcb8aa3ac0b0aa6b654c2caff91e58ef43124a7b9ba03a4f2f649bec90650057e511a9e6823319b839837b184590485d1ff565b1c5acd722527c7a472fcbff5836a7acce1e3d8749fa034c7f4be9dac3837529fa3db0cf0e656ad921e76891b9c5b83753e24c73f8c3e37bf7690b8071e44ee1044eb51aa953c41d8fdcd7c7804c7a284087d2c0ee9bc8e4d86581bd3e97e461d6d85dd7978cc9bee2b384062e843c656effa39f5ccf64108cd45987095e61f4ca142fb88e17727c3b2faff1980b3ab09823a86c4ac09ea0b9fc74a58cd3f76964b4beba07293ac746288f0b0d2d44bb6b080001aa55289cbc3b18e567f6f6fd7715998b36c1803991cd1ae1f65e866e439caa521668a48010a9816be06b1658a752233aa667360e0b0b0d0d1aa1e694a88fc0a36eb95d16892125e232ebed84fda72966b27e02538a4fcb51c33cfed9f447713040b75260ebffa5e7299d483ec85dd06ae980e4170811370bd99ababccd6eccd4363f03f6dc75d5e0971860a16051cceb9229c6cc43727ea1918d3b22320704c5d524f14554b6d93bc8c8d79525895431caf1671bb754515693e2240e21803660b5892c15989b77a50c8e87621908271f7e71e75fddfec59df56cfa00ab032c69fd822236d8efe42261bb135cf74d8c753d6c879da4ae677d9d18f391619bba8ba58ea44dfa878302c5e190c11171bf5467c6a9db64049f5261c9e3ce359c0fbc5aab49c80da4a8d885cfa8911d243aa6f7faf74f58589ff620566524ae85e100c52784f617a6442a70b02384f5eb8cf9d2a8760f76f63bdf1261036378f85039ed1cb2842ee792bba6079f97a2456f527402466f51c61dc0413653174009aa0f8af9d071caa17d622a03e8096eb30e756b212a4ecda4d7abc7bf6dbf00885a8b3eb32513d6e89113a949ef831209051a1cb514cb1df3256e4f04a97ba55ae3e370aa34699e89ace9c6fbd6c19142e9121994348b68eaf4b2179373b5a445afca87b2a15fe3325c0e804203e4186b1cf0ec7b741d282929cec95caa9c57ff1c33876eacdd8970ebcf6fe1f63f3ce781830544f377f9aaa45e2ff4f6a99ddf2d2a759a9a5082453493e292a886288bd3aa0754c396515bb28eb043befe446351353262455088499136b431c988b50bf511782a6263a34228b8da90bf2ac24485fdd9410c4346b8559327a2df2aea1788ec439f77257747decfb7f083bdd435280d878af66f1ed1a1e5a1171c36210c9beb567c4e9d8098afaa376e493626e7ec8295fe506226727058e381dd2a78639983ea9137247478f0f660da0f4b5a002c79e1fc9493e3751011544b2878106c91d4ec90fe387361128e78db1fa155ac17f348caf0a500433143ea94db64db0e307c71217f65d2f06f0d0a0415e000525608e70c17b93f8f12defd14e065b8b2ada779785436816513a5abb48b09844293f185127ee27c0ff534381e1ac56799f955cff46ab419a3ee2dd0d17627e8e6db4965d4a5520d1331c16a9432564af8de5fb1eed3c55d8a92cb1acfb10472db14b173c2d691c867904c575bbe82ad06ae5bb6e1090eb98a4ef8db6da4b499559720dd5a825f960ce5da1014bd2b664ba733cc2a87a6b1c22c0d0fb02bfa13a1c8135ba05933f1a10c6513fd5f22c452951822f699a4f756df528fb6f62de4677e7140be6f519c73f3023b3911b6ffb1b2ec6198b10e606e7ca0547a696df71b4f5cdf7e214c8023fc730b89b7817f0c6c2118963c7735d6ff7fceb1d536931b588951ef75360e4258c60e23e8208080f9ac37051b70ec1989e6fa9d814a4298cb95c7a782065cce6df647c05561103e5b4de43b22344edfd22bc5a4b0e310081ff02bdbe6550013db73922f84831d7901d8957cebd40210ea46d5943844c2257c448efb3a1ad1d84c25c5a5313663ce58b29de88c57fb0d981da72d942b81bdbec2595a73876b6b6e3065dc659b58e847c27b82c7c9ceaf1bf900fb93706b7d1a982ad5b0a7bc1c4fecf998b4274d57b1e4a9b08ea700d2aee69a669305df8e117b4a682952a39e848488ec88b031a9584ad39606867d13f91b05746775fb7d19d9d916464f189e26585dac1dc19007ddc7e1ac8aecf20cc0c83974a59ba12bfb8f5e6787d2265e9878f463303770ed75c1b88e8ce705ce9db583c7792dff24ff47fbf645b20aab1cc41bb0f5449f5da5e4c1a3453d337e888667588ccf6a55d589d1eb9d139fcb0f5c97cf24584fc5935abcf77a444bb81454ea64665c4fc4b4632a9006c09c8a134caf077e2d734b7c7f68e709c05b12f89f945af54a373e8451a70b23b471e701c485217314cc02fa42d0c3207aa43695e5a9cc11c66d2f0d0be675c282163420bcd807950df1182cc82901eb1a76282800b62b1283e0ded4adf09911b631b816be77b93f3dc3581926bcf81046c940fe8b8fde1b65ce968384149a76b05baf938633ad35bc05233921435195014ae166ba9dab0922f19e99ccfd25a6e67bb94a274f03aad16ea061d1dd0cda43ba438efa40ce998a4b9097baffa78dfa0a08e7dbdea0f14ed2d7689163aa212bfd25d9b62cb688dd9595587e0f7d4f56bc288c3b3ff629704a03073f3ff9437dcbb8fe66b25142614bdb6e095260cdb8e8649d5c91d541cfdc7013de6fd9bbffeac1a077b9892a025086c73dc915530d1070d507f53e18fa4d0314899f293c519779a60829ba096a2e1d339f9f9b9af19b4cc70f8bcbce8dd6638a0b61f573261e591a037fd1a7d89fdcea1d3c9b70dbfc256e489f020eb1c1a977dd7872d8f91a0ed97b10de2e09826ad42826e9925c01d45855526cd6c7c6c7a7b25297c79b588c5c1b4e706303e8e57ced62be2cff26542049c56667286650c784445b5afbacb9b398b66b89d023e4914bf12c4a4c549db9e06bbbb4182cef02e46e4286ab80079780ab5b6574dba3eea99772c993013ac8fccab64d8fea9cc28cf5fbbe7edaf73293d33f30dd757286db45f5e6935824e663232ca1608a376eface088b2e978d19069436cb90f978334576da61e276347e1e22125fed269d25b842abfe0591ccd128d91aa907e3e5870f2be32b3f06802c3f5b983f5d0c79c8199553ce1a89fea09f12bfb7c8010a3df1ca2e304ddedefda01e36fa212ead043a79b303e41764381fa95a9c0101c34d443d5bc0d81550d73c1bc9d59ab129249f3f36d0c7f079ae927f54da58659fbdd55b800e6a35dfbfe89e67ffce513db13805e54eda36cd1a11f2664b94f8238c4d7551b0a458f0848e41dfc39380ca47d5e2632c56262293e85799eb92d313481e4b818f8970a42b5de82e4809fa8ee973f279a4669d75d7748531e3bc6be0047ac87c0a46631f9ea36b4d24cc374035cb8f9a67caf48be76cb5945014b1ec4b5cd6c4f5348db800082370467320bdb68dda97b2366481116994fa84e5caff28dd80d8f38818d2f8060a10884a595f3344a958333deb0f95e5b4da03da4041d67062fdd645b1087e374c3cff1be6db7a83a9dcc4e40dd813645e046533a938c14ecce6188fd9eaa38aeebef19253f3f49bc21788498c7841bb57bbd3e1ac94dd1dfc745b1600690bcf1ea78661c9c539ac38b6a7bbc9a85065835802bc8331cf55a4808839d87b395a28b091b20d22ce19f6473bbd3a6cd0d14d401a2947e8a20397f5dc4ea3d2965a96b329a36a68134997e1569a091b5182a959b18c4606f09998d7decd4f862570810e634bd910f132174f9881e64d4e8167f8761b571f201dc53994dbd11af2b9f17b7fa72ed86782c2170c74d00e7ab354e750c3b5be6aeea5e3fc21d0c5f167be40b83e4693d3f3eddba01cb4546ecf71a3d09843a07b2127853a30402a24c7b67df03866bf0e99e65ea47678225094a9ffc48ee8a8a88adad7d78a59d1b0495e14ebc240248b200f61ad065c8e7bb75643d224fbb55cb7d253a23d66497d5d6cdb8ed3ccc2aba048d28584d1482b3709dae2e3c5a2f1b19de2fc95441531bccfc7e2cb23fd2d85915a17994a63725a4be5969e086c00557573c1c0b3bf2fea86abcf522cbcdd6db211ccbed3069968168a1fca56ce241137a15169757c82041b060789d9c25aff0e9b03fc9fa2b9ffb518e2dcea09d5354ba4bee4e47193512402fb35e8452b9239006660ec2019795271e7417fb557e80598212416ca5e48ca27b604150a564bbfffc3ef02d55dcabf33201957d68f761f24a7f71fb8e8fe7bf1d518dc57b7738b5f8352c357ed84bd1fd1d5313ca0b33a37c2762968ad5200b2f9badcf94feb012f8090a9c05e2364a1b0172c641400f59e6d1addee835b2cf11badde05aaa624f88d002009756ea42766f119aae766a9e524983a3fe95ab70d6d5025c45e713f9567ebe455e31e7c3cd1bce529b817b5cdf301ef8c1e6bf30c6e9e26887fc293463e9c1f751870771839bb44a0d7ccd861cae7949c69809d149c4f60318f122852b04d8d81ad90117ba6346e57ee476281e214ae042e0966a66c14c6a91f3273ad1c63502d859788f57cf48010fa0052bee1abfe160aa485ba5a148bc1b44494cca852530b9e4ad4e4846c488116d8e3d9601bc752d9d3d9d650880eea5d9c91449e5fdd2da356844056d262f6486d8c93483b6be08ce1fa6f1b9852f9d090ece4e90158cef841332356fe49d08798157a7f64d50a4748da99ad8e850f664b84ea46146e03ee9af0e98bec1feda8cd4333faefc43601ee6b0b70828e0594719823ee8178f21e970f0d6a13770ee07e21c0e9fa6b05f5958b200a869afe7481003f0aa240c4317e04fcc857027cd3ed48e7d7c3446ae6d0bc12d52700e5fe57d9e124a19108fbd89e3ca57e4184094cb07bc9671e06c75f2ce9996ac5e441d276b1d592341fcf96b899276486a97ea51399666e439dd1b306dbd47e0c57e1bc33121d9c07b31030452a29c5b8bde4440f87c03951cf6d818cab79ff444d6cd43b832349932d46f9c81c4c95457dbfded713f0e52ee9e29806277f1a7585942f14028644200e3c3d30749df5a0c84e06c679805d98720cf9ad358f2f5e2f4419ff53ed7699c580d48c87e4a0f8527820be8d1debcb274bcf4ce831ad34613654d6fb44e50b1915a37e7b3b1662d9a12f2af848f079be7f630680cd54bcd29d9ecdb81272c8e3e5e087e65e505c988fe3ba886825cf28138880297c9ccc53dcb69920d91530dfc46f4fa9d56fefe9e7fcc0b7eb4a27aded291545bb0961eed06fcefe913b3bd87fe6d641021a1539e3077726602be1374b12af1b3d343b6febfbf695a1846d4f1958b7a932bb0ff0cd178ba06424b11f6e0935339a815411f094aeabe0322244a5ca1b05a0ff85e6221cce6e1a416b099f083023d271438f02ef802f85c77b1d9fac035c78cdf81445210f29e89f39f37fe55f8566bd4af59290c091fd2a71aaab14f3cdb82aaafa851f004da7061818614c542cebac6973a1c98c2e6b9d5827e47bfa5285e682709c6bd6bc93bea45c9071cb64d59060cf413de74ee869f2006624a28a92a8cd10f4009041f4afa87d2aaa4940157ee9e8938aedb687266ad137c617fd6e0ba6e79784e4a3edf23e82d46b3fc8b81a94da78b369b2e54941d986c720647a75a9a081ce7b2f160029d838978d18694a576b80e1cb8fb3e2655e7e67482fc426cd13d266e131bb3c3cef5061ecb7a3af6d0be58df0c37dbf5bfc2f7dce1b5d35397abe20e9b676701cedca16c62cc308cd0900f1111b0cc921f959c90b85a32784b0d964e0341920ba5f4f0a4cd8a31513e8a7f951b4da4980750462b53e3cfccfb6132dabba6d27e05709cb4a3a1619ff6a942e79c831e1bb2fd9d3a6283091db0580826b5d365c4fb3d214ad1688c6da2ebb46625420548bdc9e6ee93903f7346e92366ded16cdcdb3f24aa93bf060ac2cb0677b4800b46f338515dd5b72b5a992b4ee945e46ab0bf4192282683143ed71f6fcbf3ef64c8e416f9f2ac851c9595091fa9abf389f3c9d21f60060c5a6a3ed05043a172bbc434c0af2ee8e7603751afbb69ff7d00594398e84efe6cc9c24986292ce3a6307e73d80ec22cfc244800a6b17913a37511dd2a6055d2a199aa6bc78f5defc0080c833b7114e5b9963f7574d6c9918a06a16b8ae593946b9d45f774b65e53218768d180344acf9d06778bf6debd4ec2bc0e4888b5a5d2b8b0c910ef4b0358f12b6a33f673f3bf7088eea86425d55011ae48dc178124204f6fcae76901fd4969e52c33e8175be560032ee9b5a4c5a67b920fb754f6b3ea0226cc076f0c4d3e97fb4ef8e6c70bbc57f56fe8f74093e4799a16e43e6590fccb82b2609c9bd367f50762bc6d3a5263e739ce1eedf10c516ce2e06e4866bebfde205f455cdd4de665ccf54f2b401806810e8a52533f3e21949da90c7f4abe4939517e914dc9d9a9e68090272808127ea465b1d21628644430d96da486d4049a47c88dffe156080ac8f12e62b058e3fde3f95f897de108aca28be3526941e26cd2700e6291104cd649bac01927cbcd6d77146b2d0b9d641cc991e7f00b034c14a251f3a3cc00a74094090b3e0fa51005cbdad5ce2e96f6301386edf504de55c12b47cc8fc5fe7adc194e451002c90512084eb2414e037af942fe892f7bd296bfed9ea77b3b0f7b14ff29ebfff9a42d14e29000c9b60da7d2c8fe07d3149bacb9ac46a1c6010bbca00bd4c09d542011aa42524fc03e8bbe6ab6cbb20f58f9c07780ec739dfb2b130165d7e9a3836f683328747f1686b0eb841139cfc96028e04b0131007be0bb6dd84403c8fdee377fb73791e7d009177d91c3cd858ceef6e286013158e9cf0b1824dff4146fc98b5b8fb51c4e138464e41dc1ab2be0a1b153b436f49988252a59b53eb7f996b959e838ee942e567cdec351c3f999d7f1fca433b3dfb5bf8feffd83bc510f45a021c2bf84d487479dde29e246907b792c6a9e39baf1f071349dbf57b00b6b9874061679e1bc2898f5802fd0bfb2ffc66407a5c5994575030df8a8fc61129e7342a85e030fda4635c5ac8775644465c4a2461da7699774390c4d49b12d30190a2ba140e62d5a800998fd7e3f45ed2f8998edb60002eddf883bb0503372a176af9ec9cdb2056af472c9e046d8a039f2fedae8a31e92820653f068cd040090d2cff1b82523fcbfd03ecafedbcf7d15fef5f7ff6cfc61f213b0730d5dcea8c1eb987dd5ac3ffeb02a0f908d60dd62bf94fbe49f6e2520d48823de9fee7591c384d18562da00579d9b2fbbd969882cc5f2660e0599042adf542ba804f222b03df41b2fa0030e4aa15d06cbb7e598c57d011fea1ce4b3e71a589b09799f4b0ea9498731559a0a5f25bf87a057fc170d749af48da81e73a3a0e48ad1f93b62fec625455f085d9c614c06d78970085e9f30d8dc701ada5c18fde8b56cc706998a10752c565acefc261f065b895a116ae870c43ce7333f7c91b61c84e8ce09a36d8d8bcb4435a2cae112f5529c6d3970f9b917aa36f4a10f00bad900e63b11108a2e47e1be9a54ee27247135603a59d72d2f21f4681796fd4a8c3c4660454a31ad6600dd3408335e584d413c4a5039acc5a8e5b30542a5207121e37c3d4cf2187c19998fed2241cdbc3ec6cff61a304f5ef1a869522bc281ec672282b531e7bcf16c258eff3510c001a5b9a791a5af4472bf0e0871686b66e9854e95e3adc34b7f827648590bd7713b9a5943225199408c808c808f47a6bee1e72f70eb97b87dcbdbb9077b52d8b036e9c1db9464458d1eb69fc5a82f35e363a13e43922c2bec23c72c914e71cd75cbbfbbdd75ebb793dbdc3be5a075ea25723225e5e8f879e4b4dc05c1be914344ce6c8c9bda3a1903a5a05325022cff772b73421ba359223d73672594bba028f75966b4a7ff217927d3ed733e773b0b059dcce5c812f3367855c899e2053f3474e2692713052b79d684ca5378935b60931d882e5810e43890c5848ee0b6135c68d6777572678b43923973562faf9f688cd71157d4dc32fed35ef342148bd814020afc7caca1676dfe1f75c8774ce6a839ab029744f655a9129e4352ec9d0d99ba4916b4c1985630bd98628ccc00dd26b90c02e8138fc2eb490160ad110d64261f725ed797828f43cdcac955e1d0aed735a48d3bcb2b4300397d289ddb5b0fb92a6692fba587aca2a65c0eb10c8f382abeccb134ba9c5f4f24129d31b8b288acd93d8ca2c9cbd386f3f7e5800f0e54b10b4a228c689a226ad63fe686feebdf65a8e1b472e3a728d70463a2325232223d828679464f4a297f3d9cd122853f710577a516cae462e4fcd1fb9b6d0b364959a80b93785a76f094dbf8558074b81bb59e0886b90279e419e8fa19003983f22a25718dba055b112641c0cc9b3595b13a70743d7659d5eb24ca6378935057092a3c32abd1016570a43d16ca64e34a62f9dfc4b6ffa5378a2397d8bbf498465071f14f1ab246223f6552a323607abddc6bd1604e630c618e3d2088ad16b44241ce1386a3e188e5c33352ae2a9f9e3c88991bbc1f656ac4d701272e5f5c8d46cd0843faf678509dce32ac9844894277a47fd55cbcf2efb2672b3b96a11711232356f49c4dc6ce4662f99637a517ab9aaa314d94af4fe04ff478b24cfb7af9f2c6badb5762b85ceb2d65a6b3770fb52585949c821714cc1ac972d07ebc4141b6ea0b012f1d6d1cf5d8f0bae09f783f67a5cc5592151f3399dc919017344e0609dc150b29ce3388eeb908b715bc8f920e49cd4e02c50e4603335b714cac0de21d73c1c2c26655aba0e9b009f83713a73d5acee8b15148155537a0ff410bcc86121b93f723b5c2c4f6ee6a839db27b705da27e3e0220234b14271948f1523979479c9f347436e783538cbf4a5f044533a7de985b0c0f044037ecbb788352ddc29b4add0ba66ea149e6858fef42ca26d9db63f3dcbb784279a14bee553106d8b78da9e4514f9fcccd426d2e02cd39b44d149146942789a0b8b6479bee847389e29268a814ca18ddf422b8a8962d4270ebd297496283657f6258a8962f6655f21fba6b0b2bc9e3cf17b3d5206f4f3b71fb9599e5f7f34b1fe386ae27087cea3d7338e8ad80885417a8d0cdc6c9d80470e964b2051ca1cdb83a164b54fdefe3e0faf5072689ff975e6aa0df4436ed1827cffbbc09da675b8f36646aeaee302bf5cc5fdb4af28f20e2e06f1402bdb0fd26b64fff9a322bec2af999aaeb902472f57d1cf7922632379fe383a923b73cf95f0abeb464c2776074367e1d75c8d5c178f5cddbd9dab45d3539649acf100abf43cdc3e1856d6c8357275e198929dd3c4b185eca19ca9ce7fca7c5291b7b4212cc51b0a2470120733769cb89c18a95f7cad3c9fa316b73f0b288c5940b120553fa4ab7c38ea85d631bf456badd5aca6518d5a5aadb549acbdd329cc5ce19f3f5c05048b8d3371801244a2e6b70e4b6dd850c81cad83f9637320bb5920d9bfa9a6695ad3eebca9b77639dc3ca695b473dbeeddfd89333d3db865d0b02ea438d332d0aad76aab7577cedd2b98043642081cf9040d0a999a0f6a58e3bc17b676bdd80598c681c11ae70b9b481430edade66d6fdb5b6badf57afdb4da16703c48bbeacd3073f763975bb3da776190696d5769a55abdf77afd567a32783f8fe921fd1c204693ea6190bea128741607eab4506e2146926c43cf22adb3a1ecae21edba4bf2f65eb1ded6ed6b6ea9f55097acc05ecaf36b964bc840224b1e4eadd785bc1ed47a28d43029e3e5f95ca82b9d812787418fbb50e98ce9fd90562891b7efd0b3cd928a1cf8e493f6a1d7b2e71d72327b5267f77460e0b15d43c21a47cd253c315fab55bb61677f1440962d6132852fd875e388ef028c0b5205843c7f364ca266246ad26cadb54ae0eec972091425b99f9b1d6d4aa99dd65afbee757bdf051ebba72da5954878573ad93bfc4701e01f57c8f2c55e7d2f3fb171646afe14a5d4d149fbe38bca7f14f38724899a6f922aeca849d33bac28a58eb189b8d83812357f925cc8f3a77477399176d25df8903c1b8a759fddb4f6fa77087295bb2804a2594864701e3af74bfb49479d5a4480dc420c22596e214692fc60e0b17b6cf7744fb7fd3a6f000b4630ce5d3f511ce5d47d9eb8cc674e1ce5328e0bbb1f05814797d5eb515cd5aeea8fc9fe73889471792fe86a0cf01f4779941aee0c9f1d562772efb2e9b2f934f497bf464fe2accf0778ec9fec6fc3fe89e237ee9a8ee32a1ac6bd94d24beb74c9948baece85c4ce5cb90be10947b9a3403c8281d2f8aef6abc4221be2b8da5b3b8f7092ce3979e4fe01d72c0944cab090e7e7a083abbafbf95c6a0cdccd66b98a63ddc12cf5048f720664aeee96e5830ff2bcf7bc8a93bd9758c4b548ae7504b97e3542eea040eb985fbf12f1faaa3852c6fb3aabe268c3162db0f63cbc491e6b91fadac24aa452c07f4a24e40972af06cb0a7d176ed972ddd75a6bed6aad5dadd55afb321cebecbb3048af218e75966bd36059b3e3c2711373a8b3ac09206b4d885e137d7745218ba7e6cd37945903b71f70456541fd439cdf25e00eb863c23dbe0a43c8ddb9b2b2b2b2e27de59328ed24ede6c5a08d4ba126eb811b576017fbdddddd9bc2884124b619924217d8a18037b0c02e8e945be94a1e1832896ce053f5421e0240539be4044353ca77f2d3a965fd4ca18d70ec523a198eb8a565b6b4784bdf900d1b9e0c9da9cc71c291c2bc2c2c2d2d2df4480175e3c67f184a1e98175a9052b395e2c031bd4160cc0c3dec1a1a85e4520a30e00dd387a307f28d1bff61288ab7470bf8bebc48008c42326d1df26dfc2964e96438be90535a54089215aa3a7e4343f7f86dc0efbd4da824dae0d09f5ab4e1fb90e8f17b5fdb24c261fbac7ca16e45b23edc9f912f47a76fad7d7dc0fcf0f1e3fb01cfbe168cd639b59bd651dba0cff5bd3e9c962b508bda28d733b4d5aca156c8f3eb46ed08c5c215305bd73c5cdb3a50dd5ef30e3f21648ef97836575f083e25f0cf77449e4f3fd7e702552c6b1df3a7a86768fbce3b6040031d90abcfc84ce9d03bb093d6f119f11949b27d86b89e794196fa8ccc9574eca4e6ee87818705d963ec24cfe7b6104541618599e1388d5a2cf27ad4177932b8e57a669c15eed0a9f927a9469e120a222f88cc31afa883cc3145a3e4c15e8f13c55e7f7b41eeb7d77e0a5d98d5c1b0ba776196b785befb1bfcdedfafb510b5ce5cb18848666c3c08fefcfee97972d1fb8bbc3f8935f8bdaf098d2d3bf5d83ea7166b902c1be2cd0de96f54fea6f4a694bf5979d0fbe93cf47f8d431c18f64ad83c61cbda47ce940ae9077ff735a20f7562cdf7f84155e01e74e0a92102330d900f90aafa724692a49e219aa50e680be576418d0a634429fdfdf07d3f90f0cc552e7e2e2c51f33f571ef12ccfbf3af7eaf44ecf1a4a2be924ddd34f3a76bdbb53ba94942d04e57befbd295db5bf859eb995cec32032c7fc99b9dae103120a9ba863a46d50854e8b63cd53c8ce8154519194c7d60125d833648dcc5510999aff19f960797e46749039e6df26aed2745aa775f2d5a8ccd15f513b9f1090df500617211499851153d83a6ba5954e172e1060d039279d945a1cea732fab48e91955a05135da944e3a3bd4fa9b01dd2f736de9cdd02245e3089c4ae6af600559de074f767751cb0b59aed4c598227bf6ef5c64715009a6a0f430388903132443a2fca431a446b9cf69dabdf7de973ef3de7befa5f77eb7fefdeffe77f3b95c05fafbdf1029d3f9821f13f97e27c8f72341bef7da6ae46a57bbdad5ee73a070fb1f9d41e275148d82b7909bf7ebbc3fb69fa719b69fdbbdf7fe36bd1e9b781d75ff82c41a73d47d1417b8ef4b1cd7c2b8a69ce6ee3e694f103baa4b3dc19fe2ab1bee817856273df72d4a0671ad0cfac9209038cea75d8804f45cf88387386ccf81579ee1b8bdfdf618d03458d60c3771e4c06bfe7d1fe74f0ebcb2268eb6f64899a2dc7ec0597c4dc107cbda73564a19157785cca1713c33a5ede0ac903ab44e427194f6e3286df39139346f556333a5bdacb299f2c12317fb5adfcde7fa867c48a40c7d9d5cab919b836159b3f5861d06914166d0ffe83c65e69a8b45c1338f5c2cfb87a719eefbbb1049354d8b65ed83d5253889637c691a43ef7021d23aaad3d6349136d5b4165d88504ea39f6709f27c072f48db40976bda9452dab4bbd6385f85c4185a874b2cd42b972c44255ee8eb28a54ddb7dd489bde33ea76def2f45bf854d7cef6113f8b96ddb361cba502cd14b21dbb66d5b290af63c821ca5d40a1e34e1d1a2826251b831180c0683c16262603780f57579bd5e2e2f18cce5e5f28a8909e500e5eeee06852e50c81c31681d51b8e824f154832ea7855c60add6e8f2ea3cbac0babb394d269375739a4c26ebeeed79782cf6f22a6b4e1b437639ad070874f1056f6f2d936d9b73d8cb23e8120b59138e1c13ba94d2a62ddb71775566f7aacc5ce52baf95232a505670565c2b45547e2e75fc752352a7b964d12b97253a36572eaf1943eff09fefb2c15a878b9abd2e447ac7067359a2572e346897d75cb9c0e6e64224cf77777777f710159a648ef92e34e895ecde91b2d1a9f92c6c3100533ebc8f979cd87cc9017177abd5ea06392736a7722f1736d71ed7a07e1c5616085471ae8b2c1cef8bce0bc63809258a1839e2a9f92f4fbc207979c10bec258a171d9597cc315f5a2e31979794f11b57bd3ce128d75cbdc070e6ea45e735572f3b33e583dcf1e284d4f18394797141eb2547c65e72642cf6d2021fdc4bce4b8e8fb9727181c9d88cbdb440668494b9c46e2ccf7791cd075d642e321718e772030de40e72777790bb83dc1d047281b9070269d7530dce899a3038429943d3a8a6d28173a5e2c3993a152279be49e595a70a8e154fa44c6729c342066d30474101839e5be1085699ed20cfc7c2678b9fec452bab289139748047151c16ec9a2b17d94c81345896e85d6473f5d27259933cb2a8f8ccd47c91a83243618147dc1a55667983e5895d7808c6d960aeaa3bc09456d84b0e0d2b8b729a46bb90a66954d334aa691aadb49331d1e6689a885e0e44e916ba80e1620417272e3397279ed2c2042840e6980f0a17d03ae6df90bb513a011e6db8c8648ef9a527e0fa2eb23cff2547caf813ae4a80a3607335a3335710d87142ee98e1c505f3e74b4e9e3e5296e0b1c262b83557d3855b735559f339a77356d8112f92270f867022231e92e70e1fadc3870a19d97ba9b0ac6286e4016ee1580a7692c853c7883c615308181979beca13747cd8591142a333346dfcd888e2aa6d8bc2883c5f258aaf5e5a333545afbd8840887c93670a15785499e56903ab44c9f3557c5cb583a6325381a2f2e32ad0732f5bf43fe2904e4ec3adb95299e1166ea9cc384e65c6a9ccb490f83d657d22edb1278ea928f2fc9716f7d3cbdc8f1ef7d25299a9cc386e0b2b11dc5d3953d753ed92625f787a093438c981a6dfcf8404434412876442822279c4915bc891e7bba7719a168e54b453c4617aae63d7a75d451c26ed06415c8da0c3491c63e85bb76f1d36013ee90a0c8e88f8eaf42d3f8e8a14c0f457850763662a0655b9abc2c7b80aef255107100543ebe862e6cabe3c2ebc1efcc236e65edbde9cd7e37de17dd14be4994cea982bfc922d927133112786f70537f37ada7d1bb9b66de4da386b6d7bc8b5ce4390572963845c813f4749e439329227288eac28858c2191271538f62544f501dedeb3f772e1bdb5b717b93a6b1cc01238e32816249092787d685ac77c4ebcf7de4b4747e8bdf7fecc5cd9d74c795c783df782a1b36ee5dc7be3621c4fad5ab785327b57ebc5c0a3699e9a0612c940a34836da9748566a31b584a258186bf9d39b4ccf228a784ce2c9ffe42d73c5e995b5ac65df177a0f559eebf649ea5210c944322c93c948ef2251cc3b1f3d0f577dee95701c459142255d81c7981a03fa59ffbbf0d6289dd8b3ad966d75e71d3bb1dcd79d20654647e09374d4387772bf10969ca9d3cc6dffb93c2e8ed58702da0dbe9377e6eaf2cc547f7b0cc43f31dfe9596ca6baca72a8b2dc6f81cca6d081871ab1877eb78194f1b7800c235b60268185efb45a798a27ea24dba061b76e5a435ee0524899f95d3fc85c234ace413ac9f461b1fedbc4555feef614e00cf056a6a205e6d3f77ef41ab98a1698e2e947cb20330e394827795ac06bc571144e117fbda23072a4479046f627664e0e0c16853fe1aa53eb382a096e25b1c9ed883b182236694bf92038c418798ad33b4c7194c48263f2454f0659fc432970bb78c22938cb9f1ea44cc985c04624913d05d9939093513ca40ff90107484276d415fe3c38ca5f9e64cdfe3551b28bb27fe744e1ab56c2d36ab57c60c9253e4f7a878c21723f91bdd229a1643f8199250657552ab2ef80d9a538b6cb7990410a21bb94a13d579a5823ef050961f573331c3d967db0ccd13f051ee509244af1ce13cd7dedafa88972cab73f3a15421d4402aedd27ad2270078fb76be1060ff6971e0e47494e04727164d91e470fefbaeeaabf6717c707e48d092ec3cd777a3de453eac960ab77ada5b787e6dd97ece25801ad0743b84250e4b6f47a4821b9b53802893cc264d9f575972dc11af4532b2775af3061cc11f02824cbff7b9990298c6f380e834cc5148ab128617215c1176098500a3ce9cc3cb5ed0e7c5e505fe2e0ee3dd1207aee9908a1279bb26422049fccd1ae86a227da806bc73d280cfd0cbbdf42fc77e3666c389187e83feef1534e871b662af4ddfb7bf741fff7bb90fb50d8d52059a3e7b8f66ab04152fffbfba070fb1986be0bf173a1e8fd8635a4f1443cbf1024de78d4e6ba1045f4dfd37721ca7d6c4170459108022cc2cc14ddbae71ef4f33771fb90789fc7b4219ea97e6f76cf796803aad95eb481c453f5b7994f23f21781c49afba1afd9a664dd966bfa6f6076db49f34297b3bc0f8537401480e5bdcb59a1d7c219ef6d58431b262bf4a0d046f4a0ef424eacb901c200acee5dcde21ed7b89ad5fda9be67838446249e2ae86d4e757b1ad18368422f126bbaed79ccc671410d1c44aa913120243771aa41b2b6af913bac0d807e03db4b56b3c6c6c9f4416d84fa86c3491c9a80d3e323c36109138cb846851a3f0d85263889c318b03074c288c1b0d36a5527748193ed73f4ab7746b48e1329482277f7f5baf7625c0818f7a1f3382a7afc3db3ef20f041aaea5bfcf4ad8c894024e5136a6856e87fae66268f09beb58fc3ee6958c7c2d69929fb336ce23373d5b399b26fb5c8f6ced96cde8bf14ce89b0c29655cc8f6db47ca48eb3e64eb42e449c37689c41a21ac6ecd947dd538cabe1776677f8517e0b167b95bd97e3f71d578038aab4619a567aefa992bfaf6ef0d29533f1ceba033eeced6c38554cda942e631533259dfdb9dc4cabfdf3ba4aab9d8f9b7d7dacd6ef7de9d9ded5fc0ee9d975ef5920d047b47f7c87a49af1a093da0e72f5fc297e825d9c518a963f68e9c89c400e24bf8cbddddddddfdba7badb53aad4efce0883cf4a39f1e13f5eb0b9be52392df4ff47d9f5823840564a65aae97d7ad000596f5cf4deac65f3932b8e97a36579d0c0a448842af2155f687ded13dad4362d13f5a77a9dd6eed9d9d264268ca97efa1028d84eee91d1b903ae638eb9e98181829659483bf9ccc463a00f157ffcc727023a4d061bee33c29dfec59827500b2c21378ec1f207d636444bf2366477391e7cf9d9daf80aca50d6ac1aa813b3b365ace0643e6682394d14be858cb6413543bc9ce6b94385c40aa68efa040ffcc7e661c8f4e42819d9d4ef2234fe049aa7648d48eee711e3315f31e77c2a1e871299c67a70b7d17b6937e92e77bfb7801be5928343b952570877ffeecde73efd4a20df84362efacc0c67b5188238d46a1b711bd67f37d8826f49f0dde8b441b42ff89afb2041e7dc75f3b7345729d3cdb478f6515d15f29e2ebeb1fd14ad82c7fcd9e3dbf570a5c30226564ec3a0105a8223dd4448a0e2a3245ac11f291c276cdd4cc99296f8518e09db177f2fc513ac94776421f0a25ebe74ae210f573f5fd7ce9b9188141acc5fac1e30032f40021256545ae80fc356a2ebaa7b9983289922deb1df7986be147e67b11d7f1269ee3518c46a3918715e03157a384024f193120a0cb5fae84afc05f6e024781bf5456e44af78fbb7e806839da13fef2d7e484807c02359836ddfb4f7f1bef67cd18370d996c844c216cc2db08343a618cb1582324861f30f756e49951e1c3146eb0b4a810e217c3efc310fc0f459f02e96f84a7ca129e6a4bb8a2422859e28d50b25208256b6686fab0220f0b1a9dc21bdb0efafe347a17667d0f3efe1bd17fa6506854ea4cf8434f833ff4f643628de8bfaf011fe3cffbc293fdcf8a6f7ff44258dc3d5d20aed2a15f7d843e0fae924a745c455d8d43e95fcdced0509ad0e39158e35991c6f49f58d3bde94332537a10bf8d279eeccf0f7de845a14d279e68981ffa931569e687ba138d3f7e3f55b106c92a8937372bdffde86f54f07f1f26a98c5256bad18de843ffcde007a24328ec9627594e4121d7455aecdc9e6db3eeacb5d7def62661d74b19ebdb77ef514a2fbd49b01899ab24a97241a25c18f1f4f0775dc8a6f4a195c7df848defc26f88a7666afc88e4f9dfeb737d38bef236a12fe15ff9f95efad0d3ac3cfe2e7de86d5879fc9c4a111bd377e07b3fc1b7e9de64e33df8a77e1ad3774f03bef7d23bb54883e9bbb7017c4f468ae1b17552547e8ac6ee972962eb90c43b126d84cd6a1d9dd6d9ac8d1d2943858d0702b34e3fb68f1579f4a3c99467a391582384c5f22bf82039d1af41b2beefa15da79ea76e1c958671b7dbaef786310c86d96066eac70fa9fa7ec0b339b3d7dacd6ef75e7c6ffb6661549dea1d5644359ea97a8599b08952e6a01ba596da6ddb50bde36b31a1571f112d4e74bd751a078d836641d631ff332253f37db66ddbbc5b4a3374c041eb8040601e1d665ac79469b8fba596d6d661c6c7e70798845530f4523ba72743e8dd0af211d13bda07a963fe777b04e9c7311fb56a52cb9c871f7f279efa3d9b538ba799eebdb7a941628327dae0efde46b4097dd7792f126b4cef7dcdca772fa4bd1d82fce8ecbf438ffb33a2975ee9032defdf229eeeb77c27d2a4fce853c4d326d2907e3e493c5df1447a1b52def43690be85f426d2a78824b1e6c335a21f8d300bfe9e44fa4478a5f59166424d8844a228de6ff47111167d08ccd5cb538a5d33450120672e54fe74cb058050f42fe1377a51850f4f350c4f557a2710875d73d52f17c699f144dc12453f3ca21f2ef4be0bb7941260fb37c21bd17fda0d59c21a3ad503182511bef0c4199983d22073d0e701f9f61b1736f1fd8d904524fad3df7c3ffa4d3c81c499969414f1749fe585b0e8f398ab14441bd23be9299299943fddbf8fc5ef59c49a9168437afc5fcde9f1db98fe7b910d121ad2f7a72bfadb987e5e91667e29372b7ff3bde86f4a7fa3f237a41f3dfe510801203d84ede281f944333cf8497f93f2a397de8c48b24429234c923e3c26219c9792c0491ce3a8955df648e992dd9db877e1734876afce11913f73e6eac2c090d307b9ea229e9249199a0390fd4147dcc9c8ee4a882289ec9e1aa71131de85cb5065689a783138049e797c6b7b07287b300c32818bd02b6a62cc4cf9fb682504902bd7999e837e8792477fa2c473205d67ae7c08dc0d4809b6a2f378cc51fe2927b0f7ccc7380778f499f6c455d47bbcd2516b0aa9ced5c0be4ce9dec56dcf3d139d02a9d27efbee2d0b12ae0b65ee3c6fa7a39df6295d0a89143a8ba36113db57fb5a0af71d276ab18909f0947dce29407bb02c7b7a1f33655f76f42c61ca9f42ef6d842a6f0abb2f81a3f0a4ad84274d7a92c5f998abe6e97cf0b40b08156f90754d2901be9f12de6ccf3dea67ca0a2173bcbab043c0f511d9fed625c8f66f38c6b410546c979692f25dcaf47a9caef6d20b425f7b1ebe037dadaa7cca53f174c5196e7bfb385073b589a72a229919bdfd18f154b9a74979ee2f4cb6f8666b84b4df3852e6666b6ad7e6448c55019e3996002953dfbe02e46a023265df5ad945f672156f48f9ed21e03de9b9d293c2130ddb97fe54451bb62f9d6c203df8a4074b4f0ac113023a9f8264cf329f6a78aaa4f0549f546b409dde996957ab07db3de96bb657218935a4ef386ee58a34deaf88359d78d23cd1c69ff4352a628a6883e4becdfc6dfef634f337f1a45d91c69f249e34b106c91a8937371ff7db4bd6661b27643d5168ff0bb776e1db2e0ca3fe99809338b8a6d3fd5fdabfeaf48e298a7eae4634735364ff1187571d89f2d973d2d92e4a82df61fe3d3bca552e57d682bbbbc390fdeba4d327a5738ad79b5f821e24b07fd5f94cdf6b9dfda018701207262e98131d273d64f0640cdc1c44d40590acfd587fb43fcea7a04bcb43671e53869a9d9db5d6bdd6ead63e37a7bbdb4a47a9d159357b1db475d351331cfd46a1d13cbb675b4ae97c396beda427c511480a4700b37c39299d75ba9d5a6b5dbdb5ce39b5cb8de04e5aa7b66d9bc31083460ca65645ad26cae7bcf61850ed0bd40b31814648747d7851d7692c68e09b82c637ea6ef7d00c985b458304d22ec785762fa5d7250c577b90d7633e7695d5b4a9bda079301b675b70943f1918c7ff771ed55840479de18526a537a5defa12345fcef974ce30c5aedb11305a8377da6a6d754903df2c990461050e32b09725932092a8f003bc65c92488183009a2892174664ae298028bb26412c40b87141867c92408970c41b4701c21474a293176ff1b3ee7747797ee2ea5942ddddd09ee9f524a09be0f6e29a57435b8b6f582f02733dd140ec048802c3f94f2eb0d73d52d5a69b57656da6ab51a4716016ac994bfec1fe4cac71023f8894add2073f40d3028148f981b6208f0f20d61c8c71234e529764bb3e183d576b75a52468281f24bdd884f6e10250288186c1b1dfd05f6c8a2904aa041184c4400c6125e1c6992c78e5da1e5b1b5e0e99cfac30f42d65d7a6103349090810518421471451efb75a3823cb69123b3026390b184144f663fcc80e53cc8653828a488264400230d2f9a6c2105cbadc8fe384976cf228f294d586e7e9029fd8ba364ca04043cc894091025d8b142de5ef37a6ce05cb9eca60519f4d4556106c1c0751fc02398a9a04f3c253328f2fc20cbf77b5c578df4c1a72c8e72d5afc607c1dcac4e236bdf436b65eb3b3bb115dc083c3a8f0c64f115aad56a7d60a7d562f5d3f0ce95cb5cf601579e4f5df5429e5f464c8641812ee371d508faacdd48f609a100f78da1edc38f3824c9136e9860c1119c1a2b628c906c117dd822d367b9220002d8a7117d4a99f850c5934cdf86d783626bad3d42042a6da2ad24327dd0eb41496540c1a3c6154818e1a43229c28751698b359464fa2b33bc2008683421044aa4e184254720c1c1bca092e292c72e458b3cb2f880001606205869a37044b6360a5c641ba515458b3498c8f66196a4f145b66a4091ed92356eb27d92d7c3f20c51b2b56a449d64fa9fd7835e1818178a1843e7092eaae8b18245779029a596897dc1da97630b06c8e30bd9fed40095ed5ffc53846c1f6441b6fff60944800213d9be282626ff608a1d405163c70432f0a22a8181852982471819f27ad828644adf3381138ac0628d58826d950e9c70023a842cb2ed41b62b08018d9c976cff8e200dacf564fa16093ce217cea041b66f871823066badb567b832a53c202284309634111b9246ad62882458fb05b636cc81e4c9422573536881189bc133a4fe10c14b33a38b22e80f235ed60c3146307fe0ecd42566a87102c7a036f394f4f951c40f68022588b82162c81228332882881e22649e9279bc1583320041c4915491640858bc5481bb2c9754d103852a9c3c514513d0c037cb254a807029821222c421609be512254552b25cc203210c8165b9c40c2379e474727f0b592e29030ab793fb4f7f9a7f41145efdc898db836558aefc67a656373623575576635313c73bc58e892338c3e7e651927942d0c4519727e6a896c01a99fe073e7fe91373c0132df0a9becc9b6cefecad4e3c254b027671bc3db97fe6ea5a2153fd3e680d21f78381f3335792d572e589736313c4f1dd020a05136b82f344d7d1cd6783d2a2dccf19e19ef055e7e06c515c2597943184a5638dcfbd72bfc01a711e379fdc4fa7b74791dba5c8fd3dba0d727ffb14b9474f92477742eeef7a24f7f7588b90fbfb0ec9fd7d995c2652a689ab2a155a74172c79ecd89386f2421e3b763384486e1de4d18ba8f2e847b6edc67c62e078dc21aeba3817e7e25c9c8b735f17e7e65cd8d5d98aa0b5345795c9681ce4f57071a61e7155cda93935a773e64ab2603a01a139a8548df6453d2b15d10c000020006315002020100a078442c178344c1365730f14800b718c44705636138943510ec4308aa290310619430800860001646a48a803c14ed500c05468f837c3d47226719493c9397ffbbb18118d88215cf1250e947c270345e927ab7aa18b9f5c481735a3e2c31a04854a86eaf16b6f201153c6189cedf1c4ecc1951dfd8a46bbc6d21dd080a344cdc47e4fbf256b0de53d91078770e85942dbe8b4770ef0f45f0a4383f5228229b9a758a6b23ef26ed768ebdabff29107cbdca8dd815783da298769d13d06b2e3a519a5d02e4437b9c3cc9aed8b187e0dc49521ae840205244377ff4a0420d8e773f7d7fe113e5ea1414bcf891f3e5b2e7d930bdf7cc843f3992e59cfee307732c89d9a3aedd93e5900ac3882dcb5beb41c8eb6a6e601db173ff165ea9b3d7227a4a02541197799be64d6d33c68dbb282b6104ebc3639770705059736da1b2dc6aae45cdecc6b0fb670e0d942d9d438e3e03c8cb3f3ca444039908c3cb6f275109d963b7b3c71949ded5ab0285cded3c8461d67084872216cf15c8367c47d9ff4b4596de56171e515228c5fa297ea2557f2ecb56b26556c4c15af3c166e6cb65b1c1f58991eaa7c9d8f4226af9880b33a799e7279158187b9ccb493778288222cacad7a1196c610764f9e5851b699d56c7763c9c3a713b4ca6c9d849d7154323de9d56c700b54253d82db0609b6ac4fab7b5cc8ff2b1c2c07670fd579aa625e1bd487695ae349a80dfdef0cb4069e8dfe2e6ca825a08424a6f8d2e5c5832b09a11eb46009abdc22b81779ed32679baace2be60af8e21440c6e3835a4c40d6bd5462fa356d9673d0980116325c423d732d0a37151062040ef79cb19173f1ba96b11c58429ca724ec7cad878c3c9c951f2566c958e22fc88e4943c5bdb422c68543ccfb4d83ffb886b465b0b3a8902670baf342fd896aa3c8a1babc9ec9aeb3fdf9013d8d163f7b86fd9b49c09595058eb04c8863a371d8921f1002a58cc152ddbe6f8d55354b1738cd403461b8b1736299e9dc7c45aaa7b875334800ac46a6ff842b40776c791b91b8f56eb3b8ce15da3af6cde2e6c2c03ec324a507d38fc3ffca8a225bc6053859c7003d4be62903bff70b125dfa6aec337704e2d2837e68300f39692058d485a3cb27fd268a5b09ed82c1c7da652fb2db2ad398f273702fe353821c0e23afae8e20ddaf26615604a94c5fd60e23bceb4990352acdd3539a05376c4c66c79bed344586a75daefd42e3728aed4d753e7700a51977c2ed8af9255da899f3eedc43132c987d5290f5122597e2c3f4236dd8cd07c190214368cc482ca357ee0121ae2c3237c7e199a3ea0284cac99963958ed22768cce7ebb88fc0a8dd30439a569f71c220beae908aadcf5c3ae6481361d9e5d0b62e5fb03ea3f35a752c80e8d6d7c2f62e49440eb066252e5c729dcf1a2b87c78789b0c5ff5d51c57e6c0d2be770ce866d2dc8f6471f2759cb1faa99213ed2bbb7262cb24943cadce890893f61a4c86d51decc8600ee1aa2e0640604390b943b6431aef2583205a1d29661beeef6d6bb7fce320bf1175b7ab187d27d1141802975167613a15627ceb2e0fa1792954d5cf85516088b1c318a0e2bf91b942993a0b8be4f90c7b582af5a663e96995f636681897acfb1afdfcc6ab982cffa8c8ba2a97bd21581983123ad52c26b53cbd9f61e4833a9b0f8400ca632b55780781cf9a2dda71b4c4b2f120a694148d4a226e533dd01ace52466d2a61c9e1a8de3eaa38f66d164ef108e49a7ec0fbf30b7a81ed7594bd3ef4140d3ce41d6a54156078635360236ab580cf10542ecf96c991e2716477b7cbb71bed97e5f2e8ddd7f09bd63516f025a77ecc724488f0a9b85c220a5e7b08fe423e85ae957d6ecb08b2832e267ed9e37bb209eba22ac88654d655d316619b08851469ebe3598be390d00da77b17ac5f9370c3821460e53b82b842dd381f99fbf95403f422cddf419207a897fe0504997ed83c8655708b28963eb8594e9b2e9741d82e59a257668ce8963419b3ce038d81a87673d6fffe701ead60593842e73d1b366a7d1ede464620ac8fbd976b2dc2bd512a326665c842edb522928bef3e25169ed24e510ff91704652a8676be6028db262f22632971e4540faa892558aab8eb8834c3b94412cb3d70749c890eb51b5dffd9ef23e811e79453312bd0543f69c2545456020d5df71aa5eac8bf9284399c26efb9d8b5c63e99e93c106021c4eef08110e671c642a25955759d8e842b63c2125f3660c9098fabfc863b41aff3f3b08909d569c975439d39246c92f96c68dae72cdf5fea0a50825e5803d78497428cc4b8cd2c2e1d745186a47f8950d4b71d3c4e1410d337bac69003b275d0dbaf1e00e5da205e566ed09676022a8d453a4a24c79771a03f5cfe419205a074acebed9519865e65c743882cf00b1aad31c628c6076cb9be39b1bbb4c23c93ad8cca6a7f00ba4063d17a5126304ec6546945fa1b1e0be8c110339d98abd1dacf640d5a9cb95c98200b3ff63b3d10a6368efc0a0e69424956e1c033254783e03067c0d9a45b180bbfc59e756a4cef89162e7320d873d4d170441347d68763ddc3542b657817c69ce2927350af7f9bf78b764d30d55e80e251ebf0322b3eabe7d486ae41d1c11a6c9e39555a1d5f5f8d364126b6a55004686153bbc8a061dee1610a6e982dcb0dfae7cffa5d88b1e674547aa9509ac1679a826bcd9a3ed337914eba5b882cc0e71338822006192f01f806762bf13f6456e6dd0334b5e4d7b33d95c78638f1bfce39f1a78bff38b47a14f780ff8fcb427ffb6130885e6d895941f19b60426af64ccaf8eb9b04ce130a5668d30d4695b5f3208c727c9cfc0a25a4e1ad1882f08bd303fd647218941078453259ebc1a987c1315842cc25fe5940458ed857444c52a7838f54b8b0d167a0bb687b42a087296e6c99bf39dd8d295060e2994c38911866173d20a297d4c199d4c9c62dc9cfc3d2d922f5b85a8834efc97d170cf8eac9c1d3c0b601e6dfcb9dd8d8f61c1cd11c924f854d4a13573737efcf5c220f7559f03bc2c2983d8320703ba9f1c74a0e14cb84f9c03cd7061ae317739f608907b3935bc84ceaff4c2a5490e0883c4168d4718fb77cd34b77bc2896d5a9b8952912abfb143dc4025a4ea2ee9e101f41fc3fa6c28a7fc52b1f7060c6cb3ceddd42aef9a87ae7bc82dd392228524001cd75dd87961f8752ae515f181fa816d06eca77686fc1d428301171e4e45a70695948e426e95a04b49eef4cf5a06129004349fc00ba9dc288b99aecd84b64d2faa00e42610b2d958e84997ebf7d77ea099951f283ff5e05fdca2d44bd7719c55207d368a3eb841a14b5c85756e459bc37c75a1ddd2b3b953024cebd7a45330bfc19bd21bceb2278c76af8187df400e65720ba2c20dec283ace3e244fb324f1d9088b692a3db7bb0f56bda748a723d71e2d3bf768b9f8230340c15378c214e58494e06fa49c0c122d2e2c246a7c63443503e5ce6488a13bd9b48f4d6f504449577b9af415f64036098fd884985ff973697bf40b32a017c8d9f61467344f67e3fd2a76c9b014a4ab1d995b81b2d0696cec29b5d4fd136e58ead562fb88081f7fa3c53c9690ab6729c7d21e1e8ff301052bbe18441e3507989eb9c0f384b1d4a052ef74edfd0fa9f7cf6e4cba0bfa1c83b405524d8802dbf3af215fdb172a2ddf20479216c9b9606efd95ba63dc8e9fc9b1f3671e20c68b264a748b57fce376b99dc53a04e85b4343145aefb01926f566ff0385bd57d9cf6a303694e36e7935f32d26fc24832526ef60567c4f662cfe78e1e5f1e755284f444c5f0736dff36cbc315072da7e6318a3f55071da70f25f41900dd32c8cfd2735db88cf7c3431179308c1f3ee2a273782318f000ad2e338e7070455f53d401db05f5f4502c5a6c2e58ec9bbfe76057753368f863b95d1ab1ec75a7833a1f7e5c000f3c4628d2b2bda16a41ab406334fbe54d6153f58f7c8ea77dfd88203cb17cd1d733a15ae83d7016d83b6708d6bf1646f0fc512a90ffd2bb198300eafb6dd38b98bc514878614299bd5d70b6167977f92b2362dadf311a1bba689020fd18d42a68a9451c1a9db545dc22a3fbf32f3371ed508fbcaf234130a81b558c5b3edd9e995bd3bac578282ee99f5438971c042408141c23f5a50f30b1da8178e83332de05e9d67e7121f8342eceb63c028b73ee4d9d9b7f74012224e57ddeeb1c11d04399844044f520f43a804fe2c808b525c4b3eb061e6134e59a8e2c7b2cd1c1b3aa7f88fbf3df6c801c2a3ca5c412046f29d24c1e6afade2a0fb1e0fb8120625692308baef9e9220e42c50dd27fb925ad141f1a21c43cf1351911915af97c6f6d139350804279136acaa0d39b4d3bd63efbf840fdb61da34bee73d473f93c3193d8e8812fa81701638b3874428e295af93df745cc63c9581da7a7fa2131008557a3eda6e3d3b26aa696b16569d6470b835b13a68cec043236b078dee80e9f9aac6c3c13e8df6c26e60336fd29421e68be38d51b7dddd006755a0ee2dd35d4f28fabad06cf0a5cd03164990892337fde7baf132ccb3dc2343ee35927926baed5bb36de0b6371fdb91b9504c1eef1aadb77fa68d4e653625536cdda049690c5ca24a87ce4fecb78ab14c2e8be5470e3ccd272edb7eea120749e8084c00c78dccdfac3258201caa207d26a67a8886a7bc581d9c22f93121d7d01146027ff4c9e1780cc477921abfb9293b70c94cfc8afa549d2d9130ac221b9c3e2dba428e6495a9d731a02813e71b08845af18058ea12dae788ac8b37c81d32b5635e5340f84b263bd028455854dcf05ca53eb85d9d5d25ae2bb8457886f1d443151937204b42ef06c70588b585a1993e46223bd909a16c56e8da641e10d219a330cc0c142b4a0995136f7d0812f888239e29f6ca043d38e97699316b9af9cec0b83f5edab8e25d1a2ad80cf3cd6fb5b100eb603c87800d90601b462cd40982fb0e8f068e0acbd98d5c2dda9e585ec42e82765ca52fa25ccc9c89ca9044ed884666eb5531d03d4728338338f0a0d5438cbe19485c98bc274a5a6452f35bd7d650ac10017a45da15df80d90e4d62302ea56270b602256ffad2ee266ba4462cf4d9798ad74a185e30e952a7aee712cd9366aa9ac5352af67e81bd93d06438ef68c37a4f273fbb7ca5f321b2f760a62692e345c3078ecebde6d2aca9da9030de9e1831e0a1f6cf9bbbae2cff69b7c82af94bbc17bcf348e9264d4a6c2aa3a4be92d68acfec73152ff9e49d4ad9c052a16833fdd8203857bb0450527abdff5365c976d2fc854e28f4412e9b53f8e79502cecff54b0393f5688e9e74d17cde9d68d21fedcf0e4933c3696756c999058e9ec5718332fb4584a3e9833f011bb74422b056cb4980ea2cb9782e45bd485aee5588fd0f18fafc208fd89ceee33782898e1716b60689a35888751079d04d6bd4fbe0838c3420957d660fc117c7da39609bc0ba033d50b2368bb1f9a7f8023946e511d9c01237fed08ca780d61881494bb09132f5d42d2054003fd95db0eeff1f0e3841d3245f75da150e32b6567b59248655e3b82c19f482428c4d5e4d4bc0565dc87042adc1ba08b51680f0c02f8a7d1f7d9a2a67c56276899d5476072b29d9f7e3cd7ac4c37311ec6fc5c316cca6e234b234e650aa48232179eeac52465efde540e8ccd8f737a4afb56752c2a7b7b96d4208b4a6e0cc295cd17e2688c03466e0efb815b72272805965f1f25f4a93216970ca648b15d11a8a89d14f9250aa30a68e12698e859795d7e7a4ab37885e2f39f9e16eced30da2076d28902fd62c80331cc802a662985950fad6d01f0e641053c8989cc3bfb50a649a567462987224c4ed735f6637d2a620f5b5a6769a3c8ad4ba20064ba467947c68a6b6e13d4584acbe5684358eba51efab425e881e48e745cc4b63937563b6efe024d72a03ed138530dcfbbf4de2e62c7e635e5db58960fbe8b84ccaaded2357457461d44c02acb473e01e5ea7b1c8971461b31d1f1dfa60bb08c2d66be00950ef6cc818c4600b7107ef3544d31e61a30b2226ab7ab2e3a91b25912e841349f76ad072145a3056fb6ec4ca9f073915519e1f1b4d9cbe09846f2b96124036ed7876849fcfb05a9bfaf470cd278d19807575353601f12980d4916487a84c209429db93d301bb0246d8c28689ddd5ecd7709943e79e4d370c6cffd9459974d1a4b9178e09ddb2f2fcd909c33a1f0bdc72bc31afd6e72673ae3b25709807401f3e033eb0141e8043509c994eb38adc00f024bb1686b1e27fc3744a8a1bf7091a23e2179efd7503e656f01ea5c8a9974eece0b78f4e6724db3fd1673196c207debcf650e2e22e343c09498586bd3717577f45aac0959c1f4684a6599092ecd378157af0fc069b99bb9f26541279a95b3d8e40b0fbdbe5b3e27e1c0b2f9bca05346d42f6609638e32789a9b58628019cd3a07cb744b90d991c0810be061cb684b4be1430dc93e4288426f9612d7f216c7a5e85a1589d8fd700af152efd8cc5014bf3bc0f290378318a96b5f52930ac463a316fc1c265338379b78b3d8cee4ee36c6831c0d3384eea8c941cdd78f4e5b1ad930db253f2e8c065ae63910142ab7ef169e63a4250a830d09e90e5f02b26024b240cd95404dcbed3c423a03ffa33771bae3627f7aaf5361d5f1d0fb67b1382bd955b6ac54b663acfa5585a058aa70ac031169f9a10cddce552fe310a622748732a0b2d03b3d8fc791c1f2fa4d1bb19d1c83ec884fa6da9b1af3952a658e2ff2cc538745f56a0e84b9ef667d22ea806d7b4ce68113e2927f88345eb0439faa47883323c885a5249cdaed060d94aba34f034366d03a4f3e7a2194843275aec28995faa2c61398ff5c59e9506d47496594388d8e237b6ab68f6b2d70627599db11c1b5f68a40da1fde83c93fcbfbab304107b1207d2d48793ee91936124d0f67186bfd8600c861444f3b264bac2cf5e9d0107efa5938388a56a9ba379f0e726c9dbb58c31d334e00d024a352a75770b6d2dc3236f539c85dd9f93c42fced6c403aae41540837b127ecdc96cd5c89b9c689e66320a973a7be88d4b1d2487b36d3c81f4d2d9de28b90871795c1db74589487128c7f171b831c1ee8a0e6677860e2e0c20828cb99874431557b8c5f1e4ccdfdfafe1fb969b9311c9cf88f649b822ec4604644baf3465314c74a40cd0a886d9808735f86a9e3c05511d85e302f5cbbdb49b7261c07b9a0bdd0900add0a694d5222655dd1e7965f8f2c962654320e54499eb19cc6c702b0d19edf1b82913cef8d6b85a533ba165c2799e1b5713319ea05ae1802bd15e7f2e83f953dd4f9f59e13813e0661d60cc5cad0378235aad79ce57f72de1c450eca446626f7a1cbd49b197b94f12da9a1512b2c6a7d718bf51b9ee6064a465f2a1b9f7879d9006b9145c32daa3f726c69c69263a1922bab4384d2080251ea6b819bab594f61447589cb011cc8f1b4c8744fd06994140b0cec314a885f48179c071c1ccd2ba947831cc85cea38c9f706f23875c377b98a8714861309026b58b2609bf6120ac731a4e53d1dfba34c2929289db3efa2b7c82ac1bc3a21be20b85cb68158512f93c391e6d7b9f0d93a983d0212b7418daca795b82312711927022df7a665175fe1fb4592b9e005c8981a6c482e8e48b227b01c4669468be15149577fe423a6c38791eb03156216a1fa33cc0c2846012692a924034fd388475700d71f2b1c4cbd13e13fd68de593c2b4237a1e37eb5295cf1a44f74d7af24d40edb4a57f189d226aab09b513b17d2216bc45e084bcb88c248ab7045786495f409200addb056bb70367c045b3711314239622c0e55ea5523ad28dd370d858d1051427d26b4980f2cf368f1b4cf60248616adcc5527591a0f6a7247fa2971043ecca31ef87adf30ddb750516b5549d67031085c5842d5e0ddd5e0b0755fe130ff7997a2a9af94a5983ab0390b677dd8f9b2510a78f46f931d72f2bbde84c283091da66594e7a0c8c68f098b8ea3bc930b5435d630883085d833ae7b4dea7b5f7d820f9d208bb460bf38e20244eccbf88ad9ee39b51f39372922f85c77dd5a5c096386ff3e880abeb2e13efb76aba64e2c8a7bb9aadd5e9e2284da39fc28bf9cc7cac4b6d75d39380315d14176f3a4c1644e0ccbc0c629688cff68ca4a8892c50940efa0c4ace1ca12f01c485cf3bd1499ebe69a4977ed443f56734ec94656f780cd8acd484ab4419dd6209d1bd1200d26e2e61ad3ee3e807cc2fbb027e762ad9b8bf8c3ce89ff82af02b160aaff360a458a08a54744e11bf43d0dcab21a7b29f8f5e9605aa68fadb6b1df372288208dbcd4123b50f8a3a94e09e82206845d3440a003c18552023b69ba862d4e68f97d97c8e43384450ff0da778ae86aa4ad6411206203992d9515650476f59a9afd6b51a0324acb71ca0ab429196c756a7f5489c802639835c7357d673b01d956870616ab3ac328a19817a5b057551dc38020398600ae0bf8c4ee0adf742602010216808b7b3bd5d013e749941353d2fba518486901b1ee95374af6a20df5e69f1ae9b2891b9cc414a1e101346f7f9fb5d48e2ea01a922bb31efd6da515024329b43f1f7a4d72b8e4ffe6e00809f0accfc1374f0af0e5fc870e24bc34f9712bae9148ab31544f1be86cdaf7217014906780d723955d6d6c2fd5b1c6c4fcc1c5690529ba495ee8df3ea142d8159850065509298d46b3200924034b3c63d06c4e45edf44070387ad5d8757bbd02d08319c8ac53febc3c2e2228c24b85d12c4bdb2e04c69114576769ddfa34571a8d2beb8e8107e6e1d8156fc48de2a1d539641b86be6c166c5779ec20e920bc62efffd60601b8fd99085f3862b1476d77ea60ee46eadf7cb27712f0cf953ebd759de20f2021e55addd812660f9e9a51f74292bd07aa6fec6d585fcb39bb829bd3ccf1abb6584e43bcc646a3738563e1dea4e52eaaa8517bb64234c5fe1a142626f189a11ed951e4f37cd3923c6cda82851e6c30c531e310db69dc71dc8f7c0eae83c962e7099c85872f3b0bd15a7004377f2d674175dc906dbdb361e226c4cd401a6ce48104fa20174c9459464620cdcde5165d407adc8808482de0e2069263c952a145d8809a3cdbd826572bbd52a933d97081ab5f2aa93e9a3a79dca89beefc08eb05e7bc6ef560140638a674971cc594e41d569ca6fba5964796468458c677ca4dd15ce427832c27edc1810c5aef817c10a25218012d8b4ba3527ad599715b615a94e598282ffd206669e84e0d5282dc159d1f3d3d4a482a13ff7bbddcd7a7e7f6704245d70ce25f40ae1dafa50280e7c43285ec2b3e2bd8f96c673c161ee195a574bfdc30c627fd5e4a678bd9431c744efcf0fa0c9a4ef8119949a09aa8d9d97f9ddade47479ad8afe06ef8bb4ed17466594cf6a7dd631270638129f492099cf649146fc694dbdca019d03bf70be2cfeb0266a13fe94fffc20b02083dc4c6a41b44d39cd67bfe6b185863ec7b07c1cc82e9c181d0068897164e0714b732d8382fa42fe934d756f30c26dd207218bc4d2fe5701d11e6705fd5f5dd6beaca29a31d03b589f255d7493d5cae6368d41c54d779a21d9f6aece99240b0daf5418757c6960bfd49f0785d202e741c954e7b57cd0c7d1c61d1102580a00a899d54cc46e634d7c7ba8366ecd38b3d74476a98213ea5c322a821a98fcddc1d14461f8176138ca604220ff164edbf5c57652533ec65485877aa7b14a11f6ce8de70453e933f8b0ca8e89119903516d0fc23ad0c349db001f3f7ca88bb792a8ef4cdb72c7a7da39783bcb54b105d3bd496bc0cd180b8ef0954921dc240e612f23251eed8e70ad6047fa79328d1ee94a0d3038bb58d78f1bce28ba6ca3c168bc37e32c7e9499766aa50f2364d9816bcd88737466b9cba987357a2ce848a892aeacf1d43203ecf51a57288fa58a7d6e0d556f9dc207897d680502cf4d28438bfa5c42459a6dac85d3a828d9c0edb0eeb5c4572ffaa9334f15da4e7ae2808ffa0c9fdd155facf6b96435286201e6bb7c3a8ff1fccc7b5bd201b4bc987603e88f8ac584b6490d0d71565f8b810e01c9a97222c6069be930fb083156ab787dedc2bdfcb216b7db190f8bf3dc88a1924e3423fce2665ef9c279fbbf20b8d1661e14f6e91a832ebd9e9e7c318dbde0b97f9a026bca4913bc735d45fcbeb464dee8e41ec6df8fa107fc32be19fcb5fa5fb1f05f4839be87e6def48e20bb1ffc615f81b920161636f7732807bb5023de18d9a99248e02f052da9498caf49a3d0532be97a26c13b4b5c4745231e1144ca9dbb015d0f497fd33c4e007d99458cbb39f1cc098cb7c0011be1d786a4949129c11b4d15dda96f699f4fbda3fb31061290b9f239c9cdb13c070dee4e84e793e470894b38c17d758833db1e6b1905c729d4a262778499f3c38f2e9af7e2a919badf9d631bc8635cfa99ce61b350b5ef03929dda05aa0b4864426c21f110d37241a7354cc950592837b551012398bb31050cbaf7923fc5e54323118884aa12d9d9026ef05a69ca7c05a43b8495a5e60628f4cad46bb6bdc7c67bba815ad40dfe8e653a75901dfe1444aa0cfc0a9d75b54f8c3c823d64702a473e166204acd32e427ba0fcea7a9cfdbd30e40211f565579cfb6e934a65cc724c58ac89b4597bf2ba00d74a53211f8372cc0d13844d0c81aad607db35a69b823cbc00f61ce2096994f43e26260eeb2b8e73df9db00a5935256fba62ea55f5c1a39427cc9e4415dc536c742a04bece1fa9144b295a900690355086100f83883774aa05f46baf7f288d813f8aae87ac43d5d52eede850d303908f69fc554045d97807d404c20bf25b4c881673fbd61e8d0974c8ace38c46c982d817198402ca645b64d6c371cf7a4fbd0c4606720bf2af842ce414da12936cbe58cbc4d697808d9bc1a68106b7bd6672b27685426402d2b8cf97f0dcdc3e44157b2619d1ab6a309aa12ba6a24c7ce7e800b06347ede577d956609a8541db4be19ba0f53c360ec280b89935a476592eb5d6ebcfbcbe8953bf22e2d539fbc2915b09e2f5c59f970c5d5c2563fe5dd33b1bf626b373a13da952d2004aaffa839ed0a3ccb7badfc0dba07ffbfc97bc645bf5385f3e9a02ad22922ec1f7d280583d448b2b00523efc3c18572f30acd9228904cdbb093b5b1ba6bd9c666e7011b7dba40de668996527869203a9574348fbf94d86e7d31f0f7d9dd440b64573e8750d429912bf2445e3be4ddcf442a20624fde06e3ac25aa58376e84c44ac55db37aac764bb45df99e2af5f100e90573851bd6de207e8d4fde1d1b966cf4727d306731599d58a9409500d23b9c722293774d87ea521d27371aa36cf2be6999aa10f585e35360a8e4adf3bab074f266e0cca4ed8ca789434b77ec7018644111c7011627ba562b4ca91a8267dd80ec78d1abc6a5df5b827c48a5b0fe76b7eefdb3d793a579bb3e3460df601c305d3a4e00bfe6bdc852d46e6d5c801ae494bf3cfa37bafbf57bb8aab29de305d44ee2a0443901a390be1d2ecadfe0c96cde36bf5bb76973044ff4062cf82d25dfe289432d7c3307ebf1e6072c25a52fefbca369bd4915ad808f81993b3683a9da148b812f0ea0e6f3368137ba4d0bdcf9a0c6a4702862d4dd826e661ae074a2b6811d4ec93e724b196b5ed95be008cff337835c29d24374cf606d15cc0439b8366ea700cee2da178fdce2a74e7ca4a0a5674821d43197925f685f1788b4769140cb979b8a936c560e4d4969d48a2a22aa86238df7731621ea6ad4c68d38739a3b9bfb998a1986435ef06a260674aa4171dd7dfca27a8030b3082770cbc6be4386111de4945e548639a8e4b3f12e620b9702f2968901a30885078d934ae441acf3e21bc6c3d2ceb725261ad889e814208481ac8ce8069cc2f124eeec9c709a1c349c404f8b14b2767fd1a860c7be00fb99dc42d0cb9dd806b7fe5e052818469df25d986d6170b3f27db5c860603009c67ddbc235460383995d1f2de48fb2dadbb4dece3e12b0e4a99d42e2bc0d1ee19ac3bc9fb86a99d03033a97320cfe8bab5d4b58d5b0d1ff439bd949af1750f2a0877319f5b4bc3b88710fb4e459a36aa21d604adecf02c6bed73d11f30888b0b9d66f369ac25e12b1a25fb29a010974242168beb43651bb3faa1e4dbd160926770020b13a74552a1844f7d0c533785fb418a2b4b5aa0c21fedda544f1831b6f95d7f1f26612ef87b3f4218263e040375bcbe12f6a00590d4ba240c0871e5434b10647579e180cb2c331014c6554670e6d530ee8f37b0c020c75508a56f9520fca6945ea2f7a994267b23a44d12fe5d4405b72aa95e8b7cbd7910acae684ae14680c9589026612ca2c9e9805fe17a00a0f102a1f86d64adb1e1a52761b00085b9615c8f5c94d3d4a5931bd8af4bc26b2b7ba1feb26d1ede59704b468b6b032f1f26a15ae7021a5037e07c60748bad151aa105f0e1b17b83e5752df21d563533223c66bfdf929ca78c9d399272eb3b8c9823e7d8faeac8ada8897ddd15500a4afffaa405691da4bfa9a3211e0ebdf3855c8d596a8fa8a9367880a7470b6379fc1a4754486068b8bea1060f17a43c6cf02c274f8784dd966b90b29e27a8103a26373712367b2a1a82a6320fe137bcf1611ce6a1c3350fe1541e8893c9e63240d183ba65855b165be6819f5d5df5d05323c9df38e9a4eeff57581a7ab8f100ced40bc4769ee4dd793e317bbe41bfad1429a18776b4c40630893a87ed381e31a209bf0cc0733074f25fa62c5177e351bc1bbf67da819cc5d492a14ccb7c7faabf65c53d463de18090efc6742f66711f5bcbe1e59e71e043b237be4ded60d51d1406ca8e615eff64c677657eb9771b53af3fc12d26138031be6dcf8568d03e2b8d14563f81da160eb3ba2695ae0b013e2a35760729f4af90cedfc272778021eea5d0323a5b20464e665246141de29b09a84b3a9c2b0c8c1e1d3a3db6545af5c83a0c8d9f6edae8030a74d04bd0542e3597201012bb3c048260ccfd089ad038e700c840335d78a1f539dfe1a50c90407266ebfb689753112c0c6e214ae22a49180145386da21cbc4e27a4fec74d36f5a7363303303bc14d2b2c2cde2ea0f9c861aca56cb108d3c9e488f88abc9e53d3be63b91405e3b8aa63110604b7300ac9b1318b6d858b991cf6aa2ae9f6a24760037ee4d3264d01789c8e2e90a0ffe6c1b58acaaa395796d441b233c6c473aa464dc9c5591c34a422ccfd9a760bc6d7dbf1780c6141591c0230fa474668e60f62479379cb78a87af3cf66ba0132bb431159a3e129e8ece206278efbe3dd372a7c9f340e453373021504ce311ba733a4c789d35835011f471f5faf8222332088c71c4ba503814f4851ecb9ec51db8b832f452b9db80060918404cbd35146e221e870813b92b8bdbf4081ee19bd6c723588d4514402253b3c39970239e3c7f260dfa520a14fe2d45dff3bc11dad08886d61246592b83e645501e7639903d019e38552762459ba5d9b6801b8ced71fe2dd5dad5c40e02b85c06172b04118d251f375ad31dcbd17c20c3e0b14c0f6855beef5621fe2a5d083d580f33eb9ff6e944a126383251e401827f5cdd20026083f57a187e75cff9ec32030dc0d663b391a603b39a11391e3d6083541e2c76844e9e226877628511c43a6d08178aec8626107f74dc4c04cf188ab2574115717762c92d454aa90297190148ef2806154af03fefd9f84916be42f4488e61bfb48c4998f11eca1399e082252cb17dcf809519a82bea074c20b4341cf155e67b8a4f2c24fa25b1c9e4a40fadf5c201a48b0b41e94589fa2832b0c33ef2248d27ff7ad0b87cf37e231aa16008fd3854b00a454fa8005a92ab89c4ff0a8d907f2c12fc39ec1ca56c5dcdf6f2dac8b7ec49c159b78e12e2e621b91866e6743070a1bba93d0ba8f1ec8c3bf92b9f5ca0108bfb3a92d4eac71e0a860cca62c60e69586535a83583e11e1142c6e3d6aa4c1890fee49082795e150f5d7c61510bb0a957c1cea26e39d9f050973568a0b047e5bd67d81a571c93fd6a681115022839084d403e0f30e1b3d7bc58467772516704b808269c737721729d6b5b14e98fc8a1027cc2438b24e20c49fc30e5b9174a801d2d6c1d1e24cd50abf416db5002766cfd7660b8167a2e27bf22f1b9a39d3d45b0881913c62b3602c09fb3cfe1208a25a22e6bebed9d59d4a9d5d99dc01b1c78585ef832a452bdf1a8a35f6c8a9bba0427cb4017fdb120635a28de7f60312463f11443fd250fe26fbcf0a9f808e33c05010294d511514d116b3faab2b7d1a53c8fd40bd5b00f15b3f958226f17d9bed006284612639b93fa80edaaf5bf433768117d433862ec234e3d0304cd648ac9c201f0d7a7f8b0ec99d88d8df415935085fd1c940888033e3351050c107e503185464ab420efbf55bf0505f4f7249befe521eb0d999a911cec69d305d2994276fe8ab9a279b5189fe97332c4950e7570f7f2ef7de9798d30356362d903238ba804dd2bd3229000b878779d782fb4ef8b5586d055aa056ed0e64aebcc4a4234b682a891247127082cd5006f994c054fb947b3aeaec2d913acaa7d81fd08ea0517796deb021ee8aa003a08e712aaf62ffbcf6892f6d575e09238b68b45a29da47890ea9890739545288b885d9b243d989b0cd9456206d649c1823276006abe02adffd76454564b0dc0668588c2741609d3c95de5a24176905c20abb4c025c3e4b1a73ab760f717022180956a8b94c41cf18490d6943d76dd549596439c3ac836085c4b6bd42a72c2178bb82d5e4a2ca227a32cd4735360090f4cb8fd8a78506d338d30f8f6641e5a64323f3ad9450e42b548b4c9cd3fcdcf9557c0b41512f3c5c7b26aa389c5f7614d1edfeab8aba729e856e7170b1a5a62b7adcd53f4cd0ebcdfe0bf09e09becb116ddd5b2b20c3daf9c2a481087224eb9498b02d6e27bba4de0af7032f4a862b6bd23f5bb4ee939a4a57605ff4d69556d0307a76fe9103db521174a5af91f32c4edae49bac5b48e64521bbb2311d4635b434ea2fe62e9ae69b4e7120e59b2a8f38f06de3aa8e9e70fa220027d2b644ba298cf28872e1377b33dbeae8d74c4bc21107e90b41f27dc398f181595f3d72817f6bffc3747e9dd9fa6da6677c34783dcd8a162d1a50e852f031b2488e24973ae3089d874b7165ee303f395b151f48585bfa0afe74633e290a3629793c705d5f9f9769c913385c7c2035a839f6ea5b2088d08766dedefa4fd7b599ac8fb0eb2858dfa6467be4c63a9135f983be423412acf5c2693411d4738e7fc08d69f7459a43cf7d39ba09c3dea105f39f7b9897c75b2524fec93bc311f440b77c856cd7b599d6613dc14fe3afa3e8923db54e40984863618c401a17bd551c330306e9b69c48b76833424304bd1d611f09e54409970305b80ee296645301d353905c61e819a368738bec77f2cf0865b01c100bb30df916d258ca437de2bdb2f0ee1794b037e8ea58d19b7bd4424bee573dc375606b55053272ee2b4cd29dc151a1f532beddfc145649da6d0af328f0b83e5782c318ab952c8d20e7700c93f1979f860b9c27f75e42e373416f2cc7653fa7112a2375ba188758449d61e635e87c258f455a95780ac25f485cac403bb4baad06942927b47c37c79be2a4fc13304dfeacd7e6ce35393e05084aa7a8493199f16a9387906c87789f2f32523ecc3d9800c5d8018f09b90942cbb0a007ffbd54ab415b4cd6e7f8a9e332ac87017c380b0755bdf45d5fda0a97a2933035f009e33c8d299aa6d76ab197cfc48e971bbc2ebf9d28d194bbae33d0784377334363298932c36bc153f87f82bb97be8559dd1bdbd7b4125f1ade2454e6c4266e82cf98dc527afcb118b08e62996bc901a2512970d5750cd9f2b05a7b5dc8d83006a9e8b5a8227a34e73833bb152ddb522ae8fd8b0e1241ecce62030eca52fb04dc90cf3f094afb3704116af9cbd512963ba762e52c90b821fb8f84f3e05846af3204513d58356ec42f6e1365cf3ddadebc207bda15441b6a9c2c62a6f3ea8b048223879e9a7660ed5d8cd7dbd30419f65843b7a60f024972fb04fc989ffe1c5df3e3ae38da64582ba9e47e47eb3ebf6ad1ccfdb2eb43e5117122a748e5372e5b61cc686b38193bee840573ed3f48f48c68036a830088e94a4a308d33150fd902293d420ca35112708fc30c75f9685940447e47428d695a0bfdb4c5ad64021da6d11c928ce1d95b89d58b0313d788112833eba42705db3faf0f231315bb9486906d3e49e6b42b3dbc8a057c696cd145900700a9cf59f75e36e2728812477da3b044962d7a86dcc557c859a176f50afdd9e0498c8920abb87b7ea2b6e5068a6a8c81c3e8132345b63f455fd813e9a9838353f504a90f628f14916c597491a916c97b4f2154a3f4e0d4ad0ff04c95091286c4e8899003bb4b828f89b627e7f63fa8477bae14d8a087186fdb08d492a4778749c4cce1d0a1b6667e91b8d0494471be65f7c9d78c2c88b3f9b116e1a0cccc4f6b26aa62aa92d0afa7718d2e6324e309c624b0a00b8940078fd1dc0568e323a1d283a876f485cfe9cf481923d373293619c2db5e21ad8d432c92cda7f11d0d49b2f2ef8b14a7ad5a145f6056629018aaa82ad727844eab58b61dfff3b9d22887ec2088740e849549b3325812537784b8fc235bd2f94886edc3371b651a4e724a3a3860f6337a68fc451493279f099f2725009e1c83a86660622d200f9710c308c9ab602c74c2257062514efcdf418058621986cd780e5d664355ca08865df9ab2ca7a9e3824db669f73f2a7d9d7d61b24ec7e5f2c17ad8963f15658e9d79f2248a6c19c893bd02fd98a2d6dc85df5b7507e28bb39c26e9ecb99dcde3b01ee73ec19e4ec1e68c2f7621ed7a99354d46de6527e098779dc2711467e666eee0190ed28ddd4a5684c8cadecf9dac58a0661b3335e34c8a1cb853003664ab5325fdcbdf8c52abd2718b0285eca85b8689a9cbab6d693cda8e22f805bb0a994bc965c3635348b85a5a81f848b96d1b69e1464f45953821322056a3649e56172b0999ead532243638f67d7ad1781c94eb667993f6d9b5e8b229fb97931eebf41018f6a5ab4a951321af07dcd6951911c96939edbdc59d1082e412cde414fa4f4c3965fdccfca79982bb627ded81a757716b9f5eec31f02cbbe80ab6e49e6c37b33dd0702dd7b945d3fc622bce2755030e62fa385b03cfcb81bd694d91ba37bae4001c54f9cc0504f6e119c09a941c71ce897aa6f4164b7cb451244ea4dd680b3c3c42e6383ec4292839535b02a7120353f805e1bf423df0d2af97bfade81ac3303db59b1c43c1185ec370ba7bec25ecf693d8ed9f1703ecc8389b73c4ed7d587d82899972915f22cb6f04e8e144a870a02517e0db5426b041e905494f9aae1156b6832614845d08370983733da03e4a7eb7493618e98a42d38c9454eb8a840afb1cf6bbc86796666cb6df52e91b196f180322eeb4930b8b738f0815f502c6626597b2aa233b1d2ad11bb96fd112e810d5ae8ae30ae5af7062a9689bd62c4dcb66f3ff0040c60737cc7dde05266671c00f3b3c28b52f6cac3c9e487859559a73fb1a4b7696f43ac22afb49cc196da2b47433f9ec78465c278f3ddee94692a0c7b3355023f87d46a288076dcd80c44179a347f9e0edc13bdff1f8b20161622b6941842144b38ebfcb66f44411bf8f5b6b3297774342639762a10e554d6b38af93bf4ce93b7b6c0286decf894b8fd27509b5c4f7d189f854c9a35bf58cfbea952cdc71f279c9d7bc8b4c0804d70a81e124f745bfee4640a100e188db82539dc049796f5c56017bf73d798f089b7ae0adc5879c1c7f5059336dcc2bb7a78a5c658036909b67ec74e539ea87201b8061d3b266fd8b82777b07346310bfe19e5a64b592bcceeb9782a9351eb32770e3d20ca061d5f22c0ce3d651e89c968aa54c315856797174cfd7f9608d3bd5d791e2e270ced6d29de1b53e45fb39e0b3ae94e496270cc127feb34e6bd54bc6a1004d26104ba8bf546500998601c2ce9550c0dd68360b902659c044c445c653a349cc80e0749146efea5d0a1e981ac04f8c1e1b1a0ad7cbdc97d4015e88002133393d735c1721543098eb2ed7c5c48b6c1ed2fa88343cfe7fa81073c82d04f1f9bdb82954e10d61f09f7af4b15344523883c3c240b7670d2e0868dcc471e00dc6f82c427a90fd4acd2d449f9f4ba37a6e1ae1545cba75f05ff3320af0bbccfb2f76a07c18b4ee4b434e9f8050054e6f10f0abe78292db4fc686705600cbc21fd519468210080f78fc239cdec31dd26545888ac36c9f81b78e633829e555c08ddadac5075d81a798e5eba44cbf2c1464b59263fd0429f6047f1592cd5453da4a4557f9413fb33686e8033d6c0e2ee32320497faea3f824eb060377e4492e08b6fdcccb2a5476a81644a8928918344b688b5f1ec7c5648f2037867f43a8166b15e3cb2208564bc838c7bc872a9682d8655ffb0162f64d5b9b344bdc1baf0d256b519970c07189e11b1a2f5b9d2a1889606dc25fe2e6e46d09ecc96c1e0f7a59e5b330c9a7e092e7ecd59a2329b82d860d05f728f1ef217a2ccc97efdff9b2d39f445969fe2a6ec3ac91a00a16f25abfb7622758a3fdd40f8b6605336de3b024d0e1b4fd83012f4b6f146b252a15d63b40adf100d15aa2965db1e61a6e1be2b8654695b3ad786134e4bc14fc33390ba44734c2f2ff270885e111d33b8e089370b6377ebd34fb86c0d4f200b5f3cc0461f01518641465f0aa365b8ecdf6900bf53f97cc0e71e880e6f303591db968fa7e53fbd594816ff8d81b00a8d3ca0ee80c72466a261e08267cdb35b8885f125d8bbcb943a707dbe12ee1956b393eca2ee1cc25162ae4a4c0ca7f97a2b174d6bfff8ee8596749f9fc50b25f78d42514985bf4dd4ddeb6901ce1334e32285b9e440ff60f94b4c0935471550a38628e1224caf743c92305cdf2e91850684ef79cce409393ed9ee440c9a40f7b3aa9a863b86781cc0c2f21630a9a1f0851a240cd87bf9ed48e06c2ea9fe2925cee826a45a361116d41b6eb34a42831b2bcf3e2c5f8f9fc2bc134500122a6f3906d5a1444c49455d41b411b0384f00a3008723b462331d1608268cf03ec10847a3a64f7dde90f38a7f8d6a9fe61b18691c2c95bd55c6369a4cc0d59f440a0f4cf826da827b857803cf150592eb54bc85aa4b6a83664c89f9234e21c3aa27657614dad133f081a9aedd898b067c2d6a9290603102c62ea35b7268999345b4dc19fd84027f4183223432e69f253de6198501a2c3a942950d391e34d29020ccd7e42c4cf171b30b07bb97387ecb659a3feccdae4782653618df2026da4b18d3fee8e908f7955a858f20e39f0757020969ca4cfaf203f10d9f603400a72bf679ddf1ae1987628f1a5d9106d3eda55419f830eb7eeb8d7c08a8002ff88f06ae535da4550e0a3bf9d9cd040ca4fbb8acabd1a73a1adb336c36af162911c11b247225042a0a2bafa668800792c0f4b7b13838077106e9fd0a842f774e18e14b255154fb3924ed01ee13b2cd114942d9120105978dd8e3f4036e22cdb4237f6929b0cae4a3136d6f927c4194bdef5ddda90c9cca168ed79511917331c81933b7333dde90a23d62325e278c276e7313b4106cff00e4be7913eba8f194c6ebe24f2cc8090d6ef16099fba3fdb247ab02ae02edb83eb86ff3b455d3ed630a76ee0e308dd161be33a2e4a74276af4b0a3387bbac9c19c68e21339988360833f15e6b52d260ebc3c4575c2423c81c6fb512c421abf4d2f2921923418af71d75bc2022a07a8cad01247e9c4a4ee4a5a733b8e41a24a815880c95e0474defc219bf8abf4d04ae63c9bed21320d7269b2ca9fc41b8961bfaa567ca6d19b2ecb8799860e29e093f5bfb0b09e5e23822b16b4c7b3145c2e3df531d6bb6295a5b19c349ffd2480a69d7111708b9b9aef9150abca8b6def4baefebc4555b6e469b6a939682c34b49857dba1858598a4f84bd783d99bff1745cb08ececc0765bb4c6982c954e51b5f85ce3ba5cda2222f5640694aba67da6844c8b2c1e28d90b310c47ba570e037d690869d838e9429daba42d38118d6ef0deba4ad939e0589f6eba81575402f41cd595c0faa937a7993ee48c4070c71966c61d9d3050cbd6dbb0f29e8281d68227e2937636ef459490ba08e2b6f9030b3e85d181bf544415537bc70b495a0895cb216b12bde296876942818cdc4aa40cf0068960be0168040152f76cf91a0b2bef831441fb9463f6ab47bf0bf8a49f8813252a13fee8ea4cf093614218460f02641c66a6ade7f1e0e4803c2539ce8de5d63b65db31374137e3234e51e788126397e14b709ef26d78fafbdb634f600b825f2a52052a7e85bd0ab80a7ed413872a9b4d5fbb39e3de93c5851d7a2b80e60d483898d35c89b55d2dd0360c16666030a04343ed47208951c3ba1c118043a8a2a4e9a80f50951520bc701e0a3fc3d98ce21e6166a19c5f202ec4261189c1a1bc64a8f1e7403fdce2b500aefc11122089faf5c4b60c8533c9fd39ac57df4cbb635d72f5c8525f76b267f5455a16152bfb78b0f4f0e710c0801d463efa2aa621065c004e5f427a6242fae288ce6b045f301da8a21a343395723e75646e2445072c208f730904d0abc640e4bf911e43fb55fa9916bea6a0dd45c9ee99b65601c003a00b820864b9b1b7892ca21927cb87a8b32cc3a3292c819850a17665e14802e2ed7efbfc6b81529cad4f07b996daa82777131f36517eb0828fd53d725f05ffea47fcd9fde3ee2679e94e761829384de178fe9f609b16af7f67b408603dfa4e3f1dce0c44ee35f4d9292d44d512034c8391311683285cbe3f85601ba43552ea2a70d2e11114ad3866c82d029a119a74c7d6025645218b7506c43701812d48e2c0eba1257e401eeb0095010756626ea166e055a286cba7e1dd040f5ad1dedb127df0c0db2113ab51521fe91f0732aeac5debbd232303d0915f298a9ff626e7386ab13a46720f42bf5bc0c0ec6a4e3e45e006c6315e75c35b58635fc57f67c1bf75c9d9beb9e5829f0a7f643a14d73d2ff09271fd6e1070737e35854f000ef721fc6b13fc53a9b404f0fcd043ce450bce9c78bc6e18221eaca0d83046bd21e00b501e39738464bb031842d364e10a613303667789e9aa28f88c134ee496bca3cf5445bbb2ad51c67577401238a94f243f118327769d5ccd8e74371524b7a1676729c0a404d895872a4b2ada05c41ed1ccde5190703870b432c000dac5cd8a5ebcef06190012e001c667c205887636d952f59ff657169c6e093373e5b75d9927ea5309a4ca39eda92ec2923034b65436a6ba66d054f69e35cb5471de1659579cc1bb92f1ab43c8d010c4cc4c7413ed7da2431b333e5ebb1635b026fd313b713b5832366b93f3f19f33c5a8ac4ce11095db8638e29cd22be952bffbc5510943f5bb23885103c15e9bb2ce0e6f36b5c0a1cb29caa730ffc032d30e0347119eeed441909a3489da6212acada8c324825f9385c3b5f50546ee49207db0aef6f84bb9fcc0475971e429809e4c12000b07eb5a1b4cac365e507fb5a3ccff5ba9f9ad2e47b9077ee3e92f610955d1633448b1d9fc89be5e10d01d71c0575513141bdb3986b474a7ead04e3d34f86ae9ac4c96766ba3c8d3b8803ef4b808bd07db69a6ab8fc46db117bc526f971ced343eba7248fb719a6b8b77e5bf23a92116b6d28559ce475257b8b0af31abec2911d13262926b853c49eb4d4c1e3d6a04c1be3b99967abbe717579846c4aff90e63771f5c56ac01a21665482e91e7152601229c669f190e865a1928fadf9aa10a06d1cf492604a22283b22104802db4dbbe111cd7f90b531dfbe1e677e85697469e0fee539a9cc905c1a2c3726dfc3e6e06e9df8ee01267d0ab6b1cf7532d7531027482e3fea57805dca855022f07075cf3292eaf048a09a4c543f9c1a75de85df7549965328e6c0c2546dcd53c87694ddd489fb1597bdb3bc91dbf9ef2bb20fa0c7b350d553736366612a7e86144cd7b27b69c5269ce00ef75468d3be5d777b59c5e16ceb83ae1f556d29ebb73bc089e32264e21476fb6c85d11c61bc9445c6df553931f52f1b6425fec743431623971de8f257bd58c26a27408f4cc141c9fa871b861dd01dfa6c0b595fa7e5c64ec33bbce283b5950fbf7295ded209e12bd0f965e85b7b003015b06fd9023b476e58ea7e0828147a56ffaec2462792c87e81f2031ca400b120062e23833d7e3c12deccde7b60982a7b419bd0cdd11a89a2f31e2138eb6c85cb17523c451440205ee90ad689b5a63a71077c1a24d3503ae2c102305550ece73b9996a76c69a1eca9d5132e46ada21b7445c32d1d1658c7428ac504e422919762c141339357dde23cbf1fda13c7501b1d01374814e8db4adf6624b68872ab6a9a308d740b02ab2e453ef015181d1f08b177b1322f8a223064c841455f1c3eb002157f2bb1dd8ebaf23d4d1be0d434d6db88c1eea506c4401f335ae77f130a65601cc34629b36d3f364377f3f960c0310be78e88fdbe9c453bf9a01d727b3e9a3bccd83a0e71bfb4e387e4266e9889683d82c0c46365c964adb9a1e9c630c69139c1baa6bfe33ad709a62c78a97b86565ec32401f22f41241b69b2d53d478fc3f0781e666ca295deec41da885bc3a863b82f2d43c3705dfef82efc7989dce5b123dba7e29fe0a3e184c862d230292c5a07fecdbff307d634cb0b0b25a9549bac056c340d671b7c487297b88cc5d4b926ac7ad9a8a03e0252e8c6bcff6326d3b1ea1a0aa10d6398b312ce224a014f085ea31b6229e0d5a2a36ddbdbd91208a47e40c01851b2c609096ff33e052913b52fe9acb0037e61429234643ea6e0301917563106cf023e7ea8594b42af4df3f50c6cbad1aa8c2ccaa3f5ea4d324482d768b7888d2fe9aa3cdded3c95b88478b62e6630553dfea294eee0fcde2e2cce097ff8c8b5b41205706068be130b54943e4a7224f54cefb68fb00783c0064a16d1f29980c87f9672d88f14b01846354c877e566b5c15f2941fbb18a72b19278c45b3a2ec60341ee8c885cae1f583b689c4526bfed87f03c0a72da1366183b89efc6e540cb0e413f3962f1009061e1ad7b30ea3cf4ba1077a8f879f391894f3fd09175e3864f636448d6164affbf95194b4ae143f2aa0dd79a13309fc97609128475a05922356ec2b2811b63d036165bfdf826a1ceb86e7b1a8a90b6d3481198b8167995210272e948dbafb8be7027fc5c892d0ef6a7c1efc3ff352cf1ac6864af5852cd0e8a8a400c9a1df4563c05e0629bea40505bbd4c48dc46b2222c19c68a1617766f5626c91d28fb0b926eb70b64fd85ec4a0d881daa166999ce954709f8bd4e173e355c86e3c338fca0677e028d9a4786103e125993ed07f32229aba4ada76f54d607a4b06ddc5b0ec842c65a9298938bfa80c42437a8ff45ef73151d519523b29c9949aa76e0e271472bd576bda6f200579e7ac444418c41ec68306e4ccaa52c8abe8a929129a4489c3c2fc6fc4b31868257037639ccfb9dcf2ad81de146f2271ef77b81e8a9eed2bb1ac932e7b3e6b2004f85126316d585f64e2e52a90bdbd1fa63169d830959956afb6fd2c8aa8148535b53d1693252662c558b86c88beeb689cd83bab282141a168bacc3fd2070b35e41cc8d752b7e535f843dd4e6bfb558b93cc766a54fdd680922b21b801def33d0f57804b5632770965a6c61843bad43320f38b1ff548ad6da87d1b9ecee70d7560caedfbd23b465ac003bb844c95d5f93e7ab153d48935868cf7c4dbed9a9a22ba867ee450b586310d9e25ec1bc65966e92e644347a6524560a60e42221fd5c246c82276f865f5174939c16965ae9547106e888284ead74f9af4d298228a3f4ee1ed28ca36e8625af2e36d83b006efb03a29dfa5c815fffd8a048ee89c78de8006cb7c671307ecff4435fb0b4981c782499995b3a5824aa272049bc0bc2e48c879b33658c8d9998f7746ba624aa40b21dd215348de540fe469b629447b1828465a6b02d296ffac9fbbfd32a78fe51f648c87200d2221e23457500455dfb3caf03cc0ce4ce571b429100f3fd4b9a702bb2ffbc3134519deffc9e11a5ab701e79d0211f53deb5be536fa65041319ed3555514b1565a0a580486f82171a3eda01ace9afd3e67257796170126fcbfdbd28ceed2183559a87ab6bb5698418451545c60893191ab688090634dfcae4f4ab0fd7dc2ab13fc904c12eecc704341a4e84fe6302075b5499a4cd45e87cfbc12337577057bfda03c5863c6ee7c228fb65adb5ccf6e46ac2ddc5d535d93146681b390cf49271549163df0c4745decce5010c919b3ca27b6ea9e08feb9815b9dc5ff1146d7508996ef92d508e8ff231a7d0328cb3168f55784f54878cf7cd4124f7518311c4275b38633bb61ee387b89872fa534a8808e0a7187e1d9ae51232625fb08b645b779e8e20a673814cbd96c6a7b8bb3908bf1a912b31642019e3691ffc07a69c8a00b16bea3c080dea89e592f50b1f740de1ee14ebde902494674269b4ff20063bdbbb7a4530435990b75ceed7b891b478d608915a1e46610f28ba7426f43b952a1959bf1f4d237097e829b771acf247928836d1123bba85cda19b7b9762254a78e6d9efadb2f3868cf31194477e06fcdbfd3555e58913ee3baffa2f670ceef238179bf21fa7e23fc716913bd2bc8ac35b85e3b22c584e1f4f48091c3ce954937a755bf3863cf40423527845cbc45360fe8e695792f39028a0ea7c65f63ff58e321a0638baf56e4bf46313da0b7e6d3297baf4099b52015072c977656fd140001e74e79d5e9f2bc473ad5262d670ad4727a55e7dbb3de0309c84a92ddea04923c26045990008f720e105df67608c7b767a64eb5f9b9f175bd141de216f3d357f7bbc52038cb8b4e422b0d141e098b7d125438af722cfdd7ad3cd05b1d48d111e8434fad390cd33934ed8176a101a9873d5d7c0896f7fa55a620ccf31c082cfcd8622cced571bbff0f35bdae049b652e234ac39669bd594773668ba08feb9f7c3c095ed506759eacb18e46c4149531d5b323b9e435f82e893c74d7fa1ee47561544fe9b0fe7585b7f83452b4530e91d83968eecc13e9518d2c0e3238900017fc17924782d1c36d4ce6f774317374867fcb05eabdfb561e15db3278d5f32b581baedc0565195248166894678183c702d5691b652e1a10ec0b3af12dbb9fc051b14fecf5cd93846e8220c0cdeaa59ed9c050d55c7090b72ee3fc574b619eb029885ad4873a3e231b111180d85a27920fe760438a4a04438936706d946ae9d56e3fd27f69ab0fe32f0300eaf85f3f310ab561b95f78bc5e0094245f6311bf554e7853f541f7fb68ba3f83ce22daa40407a812775dabf08a488f3b8f47fd6b977cb825a7232d9434eca5f669e9b82c2b8d1889299328173c387b83fe2f979104ada391b35c8b65c912124b9ffc5d29c49b735ca61323c7a4de272d084406acee79f2d77c74ae3e55be6b3c8f10136ec4fe477839ddb7ac11e3703b8af3aead0aad2951aa78d99ab395212cbeb1b7198d0a14df4bfaa3e0e40751434292a59efb5db3336e54a827658b1a2dd15976b26e3845f1d10c6f933c52a146496591a641d9c893d12185f696cd54719c36c1312a626c2d2d8c5e6c4a4e69dc4002047621925dcf010def04ef220315bdc34a5db55a6498513fccc42c80f263beb043412181fd2cf818809167b4f118b1b7110c4b26a95a101114f0451461c7631dd37d91c9566109f6ad35e8de923b6b0d8e4abbe9928441c47d85d07e9b02ba49e806c11435ade71ac4d256fc52aa61e720485c8ae57290d50ab33c8dcf42d25f9151806385501ac03ec7b9c0e3a2026698e725f72a7351e9f45da5c711a45195de007057a5c296dc815aae4a45072ae8b72aff13f8b805cda3aa5655df284f0fc8bc461d52e5a06855b1402358e825eeeac27716efc7a82eb41d6bb4d3ea54a62a5ba9e6010b09c096372ed80ad49152aa02f9a94f29a27c0336a3ba621667b21092096aebe6d9ac6566d2d6bc06e9a340a16f6b3fe3776da0f1773af4d001602ea14a4936bb9dc5f5a3e251aedd75db414b36fc2840607ebc453b76c16bd6458515985ff949962e6196e778b94c9b958cbb6e83aa467f46448371cf04cc5872799414b485e161c294c2553c9395b445861a5690eacd00a818aabcd2ac609728eac799694977f2772a494a086aee585fde87ad20e4ac187fc71346afc93490f2297921ad0a7509caf7d8c9b5438859dc1eb5a845bfe7dc01eeeaa6ae067f35282d9414401e539b19b64d9b6ecc22e86df54439d0cb5797c8f6605a43f5a8c0f09926099670f1360c3e053d7e61c8021c451a220f0c38205f19a68e25ad22a71114c1e7eb7463021d34606927f12c3f13d87fee3e9659e2f42eb9decfe4989a2fe596d515f9fc44ee57363010e07c0a623da566564d37a3ec139a2b70987cea96914b94d581abff3bd1e54c8277f6058aaa99332f6c2756a1c915900586bb41405b923ca644f807e684354b02e262bc36a1369bff623019173510cbf25e04613042977e5545ada0c456bec4c7394dda8b73e6c7c1546dd5be9f2747c3329573dbcfbe35f7d1ac0954cfb01f99d65ea1e407834c7867f00cd43ab4697cfc344765f5c810bcebc81b2979441f397e4ba420506725373bd00e42a9bd64c6423d6b4128ec26a013662c8f68d5511197588c0c6b7c3a254e4311beb20e89a34e923fc2b2b06e814f3184393d8ea7e02acc6b1440db93a901b9172650c7533c1fd9ba810cdd18d4748a2618c503da72f1effc7c7f2ff775af914bfcc1018294445655597e2f8f5133bef6057e5bc19e376aebfe5117a94831a907f52373374b02c721abd3832bc98adb7c0d2bdec7593fe48ff8affa64e20a081f90f29685327d7bb0227b770d304b2f80bd2941980544dcbd4866e2cd341395fb673d3c130093cf820f52ed5442b00f7c60a2bebb4ef59cb386704ea51e66898e9846bc887d3a6424d15683d34ee93508681cc12fc2a6c193bb1bf613afe758d0037959dc225642dd8ae3c1429b133e87cb0f0d6cf1680aff652aba93278a992b6b0b9fe34f34912c2ef26438ee32722f51a43a6ccacb6a822ced915390cd32cdc386b06b43af0c480a6f2d294fdc5c2af757e3e5bee91be9458c62221c3afe07c3abbc023e5d01804a80475182b61a473d022d3b34714c9344283f65c8959621c59fa540316d98c06fb6aa779a977c51a169667fe6781759b75c479335a9f03ad9e941082a25e299a56d0ad68c79a6d49cc433be724ad9723af29c8590ee449cba2e53b47a7f09f48092821e2dabf3e09f6761b63213969bfa9e18614a6464eb7b08c5db79338a29443659f4239948dc3bdb22579496e139783b87c6249d1d1e79133696e8c2dcdff9004a3200343aad3e821f49ab93c54a0c6f1867f9d62867cf3613557730d7dc9a8cd1706e6ce351118513122b76aa38496a96cb9b9f7bd7d812731137acee41b28ef09d02dd760d4d5de2d64cfc4aaa142f9b091a39fffb78f7aa3a298899c012aafc08a4d76a1e816d4292aef3be48c2fe19bbe51dffb2cfdd6def0275c2116ec5688e8165fb5e42a1d39979505158202b0118fc961fe72596099bc62b3d560803f5bc729232e2090a026c2d3d99564dd9b3d787d89b0945567e3df233855ce982625992e8f8c39aa707f9ca0825d4b6f53f774810e0c1dfc85b641a193073d8912cc68541be24130559ae272e5189ff279650eb10be04afa2c01f2ba0db9f4e7ab0fb78a1b10eb8c2be402e22f94aa196dd1f6ac6fe34ea8dbacd5e6b637d34febff64a48c9ec1eccd74e2a596681ec7ede48e730e5da9c8fa57e2ff026941de38fa35c988b9f91aadbee359aa8c81a4dc8666e2618a103d44c9509b8924a1355a32a374e4cc847430a98353ea9a7cf4f3d917448ef48b307a2f1280dd28957e7f0db21a02f4f038a2642aece76b2d3d92a1aa76bd7b17975b3d3a3e7f553bd0aa74e9e14d743c9c2a05e4c89bd922f76bdab44b886bb948e2f2654cd45aaf8160a67d35f9873556c9bb2f4c642e241cd9bd4a41e6247f0cbc2143ff142c9a3d81a654d450443227c50d3a6ab3ff063754ebc43c07659296e36f513b994ea543c08124cc2c037f1d51437e61e670e06925dfcdf14e45c9a9aef4fc0a826bd1654c912c4e77550e96a035b0bbec7d6738db8644948eb00106345b4bb93abb93b7fbb3d1f100d394f033628b524f2b1ab55c2c613e069ae6c8240b35a58a3c7c1c7d761265ff4b930d839a677b29fff3971f1d92b415e36b18c540421760d2a0e1300b72dbe814f4024c0fb9b048436688863a6a246b06bbfbe290757950fc173e353eb5de792a3868ec2a0e590af6b6376bfa1a05433da3d3eda19f6991f7a821e24ec3a766e3991929d594068716b92cfaba33672ae69d70dc19ac1cb1d9959a66397ce00a95a97cff4a95f96f3325ec077d171ec8e25c09cacf771b21a0da96a8322b16b45dd7b51c5e2ef2bd2ca1f422cdfbf9e2ebd5fc7085cbdaed775621c2da58339da946e39175ae97730704d23d3f1676260663c76acb7255305dc9d9666a4f569f16ac6b1a9c568164b487d4d3479b93e410429d53d4da88442c4ae75ff17b4f045d54968c89482adf3548266a61b4cbc947b616444da401e7ef41108b83f56e3f4db980390053a0a09934e629f80bad655039c6a36f49946f4eab03f94fb46cfd857103380e75f07d33c465215b747c28b2f1631641663f12129f8ed3e0e635b28d883082445eb0f8b140d49381b56965cb880e952e0642d9fc1bdb070ffe3c09ddcefc6bb10a75664752e6249ff6ebe142bae213c004c7d29b5a31225c30a648ed0e12a0174eeebe8bf25a7cb5a75c23fc1229bebc45fe3c5fdb826c82c4a65f947995f085f17d7b11847d94714685694bf9672f95478b953c60bba4eb7031e288983e02b3e7a58c5d4aec110599d42b08242695104d2d2a12598c70276e7153974564d8858894a8ef64bdf73689c5feaf367a2819e3124eeb9edaa6c72c0a4acdb01e634ec5795a381303cdaf9d5755122baefda1561fa6a3f125ac3435ba7c069638b813c2bbd6666516a79d907e321f16c1101119301a76526113f46422b62f86100593f43b0e54ec98d04e094eb44f10e256475aedd211cbbaacc2936c2ddd4e35318b8761ff62855dcd50ee79fc938436afaebc18c033744193717eeafb1e0b1efcaa2c1be43f4950ea09a6021e45030c24f938fb0ac1b6a396aea08e1640444031a3d4e745b305616a703a970d4e139f6cca9ddcb006e6eab4d443dde3063b2d97f08ce30acaad56061c17f02ee709cf33eadb7030b56f9353100e67958fd7f29d701d7d9fd2fb79f000c612cf37b69caf27443ffb790b6f7de5b4a29b74c3205100745073507372ce9133697cc1b22397367baa8ec6e9774b98b2940c1f3bbeeee2f1181475193ae99d2a47465221d7344a7ec3715f4bb880d274b4e163859332583902d1464ef314f4c30ab83f274b9666a0ed127ff235e73165982e54a8204b904582ed144f67f42ba264b9bacc9aa55e77b62e62c5c9f1ae9bae966407878686e4a42e0d07f550958235921eddb4220db0c70175658d57151b4028f281da7d134adebbaae5b02d73c967201a428f1da8fb525e53788444b05ed5f93e88a8286b1efad8e89ecb7d4313e6fcf940e7df29ffe289a59f7cecd66401cc6eb24ce6b27b644c62da1bbeebaebeebedd7dbbebaebbeeee6b4dd6b65c312638b01b9d252fbb496fb5a6e7a98cb028f4792a232c0a7d4078ac395e91541d25d5beec94e8fdeff6cdc34c8942d927ff2d6814e412a432c2eda9e628c461cf932874ff3cd5f612dc36cb6ddcc6d5d8efb6cdbe8c7bf66edbddfe76f3ce3befbc77db6878748ce77e39cc765bad56d7e5b46e5c382f2348629c978ce8b68de6a553b794fd5de81d20e08a2d188157aea861e80dbf6c7277df2ab5bf5d91e37662221efb44ad3339a4faa85faeb5d65aabbc3536c122c223acb7b1a9438e5ceffd735f51a9b52d178ef5a2eb1f2f5862861949a8b1eeb66d6f64090aac699abb865b5802975e7f5bf7e2596db27f0b47f0586db24c6c0335900b33d05b38fba7ead820fb4fb92511b1c063b5a920a824a83635047504d55593c80e05aeae4d5a9d071f50b6407da192b1d5c7bd382f4f0963f0a8540ee32ce41f6838404f03c9e88b8b9880e7cf39ef3bc1a3ca61281387d1542a55ad9589ae7f5861051326c098c053467d6517b984c925f246129139ae4ed4c94f075fadfc4cadb89452686121adb894526861218dc0c09d47c9a24c76f2e775dc76ad1187a939481c46472a19bde8fb13bde68b44229108e71612caa5746f0a18b7944a2cffcd23a2b4294329925224fa4e244552762351d77dd7755d47cada489b235b452f419194527658a45d14eea1f1cbb848c4bd08dcc1a37c52f4f2bb4e14b68b7287e6e98e11fdf859047a29d3949ec0328fffe908bd484728c4f585471c043c4a56163d4c88a5a242652085855c20c5a12f6a6403690e129d1d5a5f234fa106dd4de93f0c06bbb00b9330182e0d4144cff46aad572405131e0c01461e514bb03fbda267eace949def4d7c34f63b6a9f52ed5d93bee649fe04298f3da3eb1f56c09c68148a2c6b509a648dbefc348d6a1ad5341afea09aa65177cf3dcc2cbf731d0110155b44f1b8000c2eb4935e62777234fad5d03ae66b8f3bc6696ca630a62c44e053a7684c7497f23da4b18ecd934b4d6bc7fde2a51860fb14fc21b54929a5b169414a9fc40087540bacf21d60aa831e348d55d15634cc7ca73d940bdc3132fb6bb3450aa33b0e534551bc97b65cfd82f3f26cd0f58f1ba0326cca90fdf840d1344dbb37df80a1c465621de39452ed1ed1313df8e0a163bcec52b2bfa4c1c70e3e78e0c144471f2e3a0f32323cfefc6af87e4850ab9aa6696f35cfe3b53f3aa4c0fe2f7f58a103224ac889324409ac2f640ee30ec3c21d629bd8a0ec6f99d829b6a7b51b8cc2ef041ee5b1249778bd9cc09bf54a1de3ddf54a2ea55cda228ac368b6be5b33b2db31ae8d66a4c5be6c8e8b26edbbef956b2104ead7dfc220f66f58b24c8094581e2b73f16a2c32c0a395591e4b33c47efdaec745b74eb25bd93cb9f632e2e213f8b3d622c68b49f6d7b4971358fe685f9595bd7eaf24506de689e6befd5e495094775c7499e5a9b6c7c660365f032a92efaf01a2bf169ae83b01cf1fad6c562bc359768c111a6465fde24fd1e894bda24ffea8d309045d5cf24883ac8c06cd2c433bc5453bc4b2ac8d95b58b54e6a2d3202bf37a9c38cc7c2bcbfe543653d4e527f930988e4e4e8efc91a2acccca6e5a825698e0830797911f76902c9c19fdf141e597a9063af573878ef1ec5204d9df47c7947e346da632f073b3bff417b7c0b93bf6ffc5cfcc61e81487d17e7e7c54176e59266a6bf3d9b61e3e5a383b5c40dadc046d3e3dba0db75c928b000a5224b1128200564e16abef03e9944aedb66ddbb655cf744ab5214919a894caa269f4cba43329fa45fb1f5b05c29116b14063a061683852232ad5a8aad4be01fae45fbae296543ed4af8f4f8feda6be7662b5b509a1eb1cfd3c7a48798109b4ecbecd85b2cbe0c917fcbba6634000410d56426c0e0d56ddf79740183c86395fca50ba200c528601f40bfe3105f0b2a3fac59f650613e871df9f8712c2911a3942f6ef1b8eb4c810b27f935184da75007df26fd487e1f7dd7e0f0f993790b6407a435d14c7c5d74ed07644a7823b13dde6af3c04fc496110d1fbaf84fe41f0ca0acf8d27bd8cd3cc14e96fbcf6a42fa1b1b272430574f911b8f218acf1225085e7b1e96c78af7d0478d87821f00ac76b341de3d268e4f6d011d3ab4853177a4fe5738026cffb6e7a9d273ffa2db9d0a76222d9208535a6af51513179bff2f84d2ba14987959f6fe2fec6fb9b7604278d66c65714aca00f17b5670125204fda87cac8da10fc8b40bf683cbc0f812cdccb8f723f84f4defbca865842ae4349199c553ffa5dba1f9a6cde61b2f66b589e7b1beef04815ecbc0226a151917111d52fdabbb4009b74e05abe829ee547b3f21e18c4df7b0e0ca2f168d9aac034336012fb1ce89f4987effb5656c0ef49d4863bfcbd99574013054df4fb1e9e6c89465ac7639e7a6caa8b56c05373aa4eeda94faa92ca539d54585da2ed747f48e89833a40c59744dd2391de342f6af483a46968810ab6174d1acba8328b4930ff058739078cda19436cdfe9daa4dd49c9aa38535070cdc2b393be3c8184f56238dc9cee1232d4861fde2afc467de3b4324b2ead41c172b8bc6589da94ecc0c19e5a13dd4a7e6c0ba9d9aa393e330daa4af3c9672a9e6d41c4a59bc2074fd63272728080994306abd9921b3e4009fa0b08266b9c4e9182a95c8242ec8fed84b3d98967aee2df56099476c8514aeec6343b1914cb21552d864ff1f3c0b5603e4063aa67e056566990277cb1478663944d34f400e34833bc0f69b121c67284731853c364fa9c706319382802bb8e5fe5aa4c063cd1987ced383c43224cbbf1b689652f278025012d62f5b14cc83860cec9255a9b52e1c110cbafe018319d00c094de84f4b560bb6e4468748ce8e8b7a4ab2e69c252ff0ecb8af127116601cd96b0d5d661b5b539dc45831560c08decabe7f0e5d43dfd03272fbb1c5b81f731945bfe0af7a229dc82966c8fe2e7774b083a9c6aad51522a2eb1f504c396306e575c64f1da263adb53dbb51f35e8c4b2551dca8c7a3c7055224a740cbb075bf5899effe86360cc75f755ee8bbb0266c01111bac6a84847056d2d5c411abee815875d6f391a3834614ca1c930c43a1f442f952d9c1ede274959a6099c7fe6ae4142e668083558d90fa049d557b0c35426a4061e5c9d7cdaa7b4d2586db8567dd26334df6e50f341fe942d6afb8d064c3bbf2fce4aff50bb0fb83b6baaa8e0b092ee0f961fd2829c28c9ef123074d7c8028173556eb9c95c5aaac7972d64cd127340a506b0beca326e0f159dd735d585997c2ec1646c91ed22972888b95c58325fdca9a290af4c97f2cd91cc9fe0e032c4ac1748c3ef99b71d1a052a84fbf7ca5d6deb87036276c8ec003d43a824e1541776bda8e77534397b4f05a6b490b1c9a808f24424a19b826640b640a901822c4ad42dcd5f6236a4a967c8172883e790c0518a509720f60eb028b60e011955d8612270b3c36cfc809784469538713421a3528fbe6da36e97ac99a1889e1c098e46cddd2e5f2ae3b142af6bf5dd085ef3c49974f918ee9bbe191267d66f5b9b6be7ce108eb579de8fd622033250ab7d0f5eeec475814fabc0edf2bc238542a7dff9e8842ddf6bbcdd0b95cae1b3fe1bc8ce420d109dadc2ba2eb1f55b096b0842551d2b0d134bf712cb0cde3a5940a200a4d6aa797367f7e7c505a6dac4e106e7a80644da8eadefbf7efdf99fa79fd711e9fd257c9d0a06a99fd7450f9d9e09fc8c72a29e3859a7d5685f045144ddb418265a963be203a8502129215119560674102b3b4304b1298a50498e508dc9f4a5609a25147cca811cd5aabc307e98304477994fb5b80cc341fe8cde58ed1b3d9a60a9b479b332094e257f7eac1224a13584d68c2841f314441b2191a204376e0d0dd6d677650a59942a1505f0d55e0953ca2b2b5d65a54c7d8f71f40a76c40c950331d93923b1c469be91727fcbb81a4051e2f093f018f2da33d5536732fce4b740431bafbf6eda46bf77eadb9079b7bb2a40a50308b0cc7fb77524d2bc530fd520c4bd3c885470ad3fe61f3da5702bbd242e1959dd28b553490bc039472b4bcdf8e67aa46ba60096088b112429d90825512f91254a902cff6be2e9c7b6ba52f4a0430bac324120e8398de9f64b241228d56567e345a1991482bf84320c9bb716fbc1078a5c2874292e5bbeede1a2ebf02a8f26058a384c3d6b85cbd210a79d78e4c96cafb752e2a7f4393adc15223ac5171e95cc015975701838c7e6534725959a9f12ba377f9518d0f82dff42e2bf579a8bce9798cbe46129a1b23d3abbcca87c0203a985ec5149aec876ad4f8d1d7084d3a847e8642937d11e9fd4da4d064490f815028fc1a151708905ef4225258b3128afc473fba110e1982e387a42022895a4a211c3842a11ad6b20080157280218e0700287a16c0d00aa0cb83218effec57637b15c021a11771f5862864ede8fda3f6a97dfaa157e146a886dee56d68ea429a9591fd1ba63008e94dd6da7047e86f84352e1ffa1a151b58147a0dc56d2ae0e883985ee55dc0202b3f7a0cd624d94152799335e13008e9fd475f83df149a6cb863e555482aa3efcf74c124342e3f5201456090243b482ffa203834d99f3ffad187c020a4d074431bee983f0a4dd45fe4efa2f22152484585347a2c12915ec643a49551af429cbbc470adb56b5bb183a08c9bfb5e914e80fd677670f7a15a6bad5e4dcb94d061ad6aee0be1a6ac92d0e741caf0ddd03fe46a031dedd30722ef60c3235c2883838bfe93829d37b08252fb421f0a6be42c09123aad15f7df6b1f4d88061ff3e4ff813c80b88abeaf7a28955a8baf77460411406e5c30dadd4dbb1bc797fbcec8b2e71d27521770a00179743328c03444892e3681a50b3ca3c063cba8d633b5deb8a8db220435cfcc873409923f728aecb12dd9ba51b554dd9acca32a870896f554da7b5ee0963caa54383e920ff02865513cc5c33cf9e08c2c5a861de40bde31f54b44b00f998281689c687eff86b2fbf7d371654cee0dbe4dc0363471dfb973c9e493dfbd9cc795bcc0348f2a95013a25af902a6943297b1973f15ed2b6495828775c3cc900cb664adedb92212195e8241a050da382869932904772e827d9868b5e32c2e6f0bcf03f8b2eca8c9041b6e1287bb2c3801a51269ace3b9e07ff227709dc846cc9aa139fe1b3f7862345b2022099ecdaaf5f8ce4e020121388c062a3691aed711867e1fa3ca14ee8ac12a13f1aed9961d9992d60afb439efb7803488ce40fa034ae9937f575610338f743602e5aa6566a6b048d4580e414616372b96ef4a6260f92c604dcbb3b480423857170d447b6a84682558c12a09f74250ad20965825b14fc7e89800b07c8c4af1da6a7996ef31a98f8b3d5860db32fa9a96af096b46bff2534e0d88d637436993e5b780547a5de8bba626c98e9667096b58be2534e1ef554dcb9bb00b88570808d8178e321e8f1ea10e12c8949973caf639cc1972213803f270d11da86390d0a9e94b982e25c6e902d96b933553f6097df2bf2228c295ef8d12b4c705b4a75fec947e09298f38ff8214880681b407ec91bdba60e711fdc9026ba178051ec56f86f6703f1c90c34cda437b680fbd61b151094234e575efbdf7de7befed69656fcdc0bddb87a97f84f5ab4e14fa3c51e87ede9da1dbb6ee84f33292f3ba503869dd7bfb3687455fc785f85e51a78205bef304c4eb9c9f7cae137d2b89428df986e35f0be4c685f332d2babe795162e1fad86022c2404bf48ada05bca288f4033cbf94a9f6251d1ecff344214f14027b70e791fa48b91a550ef384fe504a39954a7a9ee7799e28240a799deafb68ebc68563244747c9eda2eb019235e942dfa7033caa787a4ed5544dd5f875481a52bace645ca4dae916bdd1260e739fa763bcfbd18693f24879f29ca12f44bf63bce3549ee7f3bae9fa87154880e8b7ec089edcb223c8c84dc305c895cce51a8225f549addc56a9ca102ea026f703acfd886ac04cc7a8909d08dd61d8ff320e2c2f96788adb50d65a231801cb3c96b44f870f3948189e8628326e289b39c02e71a8343346c0f34717b277f7c864cb2a9db1d68513e48363ddcd4925dc8ecf66403e7c39eebac8d1ef997a2c65d098c8fe3660301a02e6414e71e68633d213f00d22f0f6f5ce994bed7dcc7d1e07e27ef96e290658fb113711bc7d7df7388e03af782b076e14dc3c0b1ef1aa17d6d499cc11a390019118b7508016af00fa8586a9dc73e1488db8ad97dbba8eb66e705efd324a814d776f4153b61e2a55a7aa74f3ba0d54f53cd994463ae5023eb64f43099b11aa3f9da252b5fbf8f4e0b82ca24401e2017a62330675f965607f4a29a5657cc77ca42d70bbf8e9900790511d4115c3a34ac644a552d5289811034ac22b093029add96c369bcd6674677ab7d6ad53740c32302d9181775c74a73e45e0f167fd3345653787060681c567028f5406f68b7f2a9427ff01b490ddfbc58be0ce34f6057e18a51427cba7f27594fc3f27860aa5744ef9b714c393524aa96f57149ba94d140353080377398530b069cbdf178a62453085b9f8ea18f93968d17f8aec3f6a3cd508a7cfedb8d830dc14cd5541a7e8903062f4a888227b05e5733b0e438368919ba24362f4a8a09dd4b6a822cf0e89f9ea171fa447c5f78b166a3ca258147215c5b4f9d3866aaf12e37e3a7a4367406edfbe46e025e4e3d8e40de413b289521179c4e90c3cf60c880df26912291f439ee07be90f904e8e2f83ad7d1f6894bcc0252ff0758ee3b696bc7d0d6832b27d2033f54e41fbd2befd74d80d3cc2bd0f87b95c28ebd7ed86352e72712282e7cb68d53e1683ce6a6c80f48bffd6047f1e3be62ac03223326254bb3e7241f703f464892c6644e24cc90da49dec8041852279ad79e839dc5b0684cbd9d3f9c060b19f284b7c767a80645476f7bd18fffc883e76a48f99ba17e352e95f147157120377220a976aba07615c2165552384654707abef85502db85825915f7ae23054746a06d63101c8f38bb905cf15d99fb660238be5b17fda63182591ecb6db7edd5aed11eb20575fe81c00226fdc73ff8117c4f3c47d0772df516fc2f084e152090aec59c2eaa67d0d35dca89c4026915944a768187df24f92040a28f2d83f63ff30917d90799cb0fee917a74e3625f0d499392e8a50664ece409ffc7d7cc0b28c090c06f3d97c04c341501fffd7be057c37dc66c1db2ffe7fe757051e5bc68007ccdc9043107ea6eeed189f2feb712293cd509fab056d2a522abae0ee14c7690025d54a13b83d17af67ee097814a9562b115af69f73a68608a15a79cfbaab9519c62d8babf67e14e5269d80478f0ef4e8a161e87fdc6b5a8b1bb2f2da53c00c8e0727c563f158429c058f78df59fb3b7a78f49829d36b3919354f1af726d023514ae9879aa9518552f198010ffecad7846190243b6a3cf8414c1f3e7e202a0e4d9735532ba1e9d6f8bac2caca8a8a8a2bcb4fc768641afd0a614d8d1fbd0547cfc9d5bef6e1d7004d3a681f6a1f86f3c137ed980ffe7c3034dd77f9212afc101b3fa4c697447348a9860d155c4c37704cd6b4a9ef3a2b5f47aff2d10c49e15b589ea4b232e2629d41f3545f05d46cb4560ba8bde62cd75f61e5fa2cae5c3f85d1fc99a72a7342f99a3fdacf5f696dbe82182b2d8ee3e64f90e6d28c44d15a401a4bc399712d7f7ea464b1582c16ebc663b1244bb274e8de85b303284173e3b8ee054d32f5ac45a9e41155ea8248095eb0aa11b202153e2bef856860b456dfa3d0e8948f799a411d434b43602d881c24c5068ff327f6235f1e83c7d04929bfbebef9e3a2bf4b0b77ee7972805cdd7992e136ca7635799c98417336531ff795bb5f830ddbc5bafda552ba5cfce6cffc911aa5ef8173bea808ee420e49924ed5227e24eb47b27e244bb2e65689f48bff090798a3f9a1e69ac31113113f85f367eee820573ea4e4c08fde40c3d4ffb1d3e04ad7d699993a42b2fac57ffecc1c869be230dbcfcf4fd7adb45aa02033c3430d0e34f844e17162657a7a7a7a7a7a7a7a7ab4c0328fd75a6bad160299732be00ba76146260c3c7e116ac4e91763a054b487a7492c26b39d8106cfeb95c3e30489cc48ac89ceceeb8531c618ef88ee3e3220531507b262e1041d2461a6879d99a712ae33345e9c800b18ac84b81258acb897dda05ffc65586132ec4dbda937759b52c986db30e9855fdeebbab0409b137ed9fa7abdbe3028fda7de9c937677cdf10176ea7283e2f2a7e898a654f4c9ff8a2df0173416fb5aab1384d003d94c67f664f652c2b5a95dab0c7d8bf04865851422ada8fc8f4a252c6a771b4566461a61844dceea14857bf14c9c55a704afcd5319ad6051a8b6564a2ab535aa2d516d856aab7a9ee7dd5bb98feb7ae5b100579d79825558f6af3a4f7a82fd455b60961ae0fb2d3081efdb6f019eab1330fdb1b67ce87ed1fe871e6caedf81996b38d6efc1762ec01e9859fbb05df4c21187f52634692117561c17bd9341a144d1e6b17d424ab2d76aa4e2d496c3cc595df5660e8137fae9c81cd883e44c5c0f326fb5555b371d53d32f26e854903ef9e7c871e3060b4b9ecd10c80cf00dc72d6b3ff64cbe9d8536485b81d5b414502184179ba6fd08e6b167f2cb8186be8637d0afffd94043d3e7987dfd10187a2ad61baf2d27f0b350500059d84cf9cb2ae999e34ca9add70154aa9e550ac4da1b17ceb5f1dc058b19a5b476775795ea8b580770cb6437f5a59c5f13204383d770fc5c47941671247b26c0fe77de5b7f7b1a56f0079a2fbd99ca6fc959f0befc81eaa836fca537e0884214a290ef91ef81f0a8aa54a55259dbf9a60429dd4d4b39e895f4232dc1f33b77ff743c10d56ead2fcd27ca143c68f824c186fee0de1bef73010176ed768c6b14c6041e3fd31ce24c717d67e87edbac19b56b95557677cbda3c9871b11262b928b2badf179c80c7d0ad7d5dc109f4884088c70ff0888241f555cae3c68563a510c5aa0843752fe518b2bf8d8e91b4de24f0bbe8271eec353418c69de156514c478d2260ed671c469bf3ce8d7eed50c6c51920acd5d078ca94fa85e2c8c1e3c78eb07e3573f80cf3e9bf8872987e6ad2fe9a344a7f7b028b22102e758c690132d77e4a9ff05458adb0d84f94253e3b3d40b20a8389a2288aa228ce548ffb0f96ba994769e3ee5e053b6b579c295fa150a2289e8a804709d3644cca602528601cb90bbbf742930edf77df77a61d212fd5519ef822090f6070054fd0e904b8fb20dc7bd793e07f0f20d2061684a39aa4cebdf722e0de7b20b29432f0a48484d54829484021a2b5124280339270df9f0ed90547df64837cfbf281c8f5d3e1830d4df7db24bfb37d2032a90778c4365ccc028fa51cefa29398e0f1337dedbb01671a1ee15eba4ab93f1156994898571ed10d46afd9cc6d3c4789bfa6b8cb9138cb6fe86cd6d3c3e386c74cfdf7f43881b7fcd6aae4f17fd63107c83e65e6e28c87bf0f1f723061198ef22567ceb23173aa8a40a7a414d4e904822e2ea3d1cc91b8e8d223c063c622e230da6c36ab75f4ea7040c608827cba5b6bedba53245487bea811298028f0bd3796052005a671511b618147fad274b4c8fe74a7631a63796593a08bac8556606dde7b9d50e3556be5669d4d97d329e98674afeccf4de95c1d928ed5dd64ffdaddddad421a587af7b7a7aeec54094fd6cdb30a69602a57d5037d95c215df81a61d0fc48a93d229dae2665d8eb84476da2ad21d31764364ef82c8fe14059de2ae12f848e96d909d837131cef301be216dfdc032e7eae65cadc9b9688b73b564ea7e13d95f94d331f5dbe756afebc08ed5d9844088cdea865d6b9eba225dabcb5122774ba41006e6f2d8b964485b2d32b899fcf17e36a2c0da8f9c2b3b15b4d53e35dc6267e0919b6196c354cacdb81937b3b6c62be4d34ceebd7dfbdeab69da275f966aa9869517e0b1f44ef0b5a56d73e1bc8ce8d4189d01a1d7529626987ba741cd39afbd5e89cc66019efda8344df8053decd0080000000153150000200c080583018168442c57e5241f14000d6d8a4676503817c8a3490ec4280842c618830c010401000c9001a2c2b014aa92260c6fb0a3f46e32b7fdb5d5c2ef3cb7928effe3d28d08e0070877cdfd394f2e05e8a2948d9bf96a2c2232d2912957a8aad31a8c88fcdf3312382cfc34e1781716d284e84c852895a1d650e28e660a92e9a252c3063a9b8a009c5d79c5606a237ca84c2802481f6c8924162af5e14b82114d0c9ad6091128a9681584d659aa5fef7c1d51fa2bf01c74b93359a0a951f497fbabf10f08795fd464c05ccd8efd342e827fb2cf4b3a535d4b5f5c8c1a01ef07f131c38b3c21d030a635cfa9bf20d823c63d282aeaf7e894cf1adaa94ba46fac53438c6b2c4dcc5177f2e89887dab0342313d3e0bc939f74943bc925d23afe5e79e9a517f35e3c4a9a49de71b522eaf8a5634095f740e147e1bcb21877f0180a37467e668f3da129980b4f6e844bbe6c1c6bb3be089406822c6e12c54f5e158fbfa0642e8516de6d848b567c0c655a8964eca19b2a6141478006599f17023a663365ca222ef09da76203f477107cc3c13a14cfe2f8f9b3204b343e101c8e1dc2b02c97d95a52a3d9126b7b6cea6ee630243d011f7e12dae4914b857ee1f89484c166b483610ce045d0a24cf7a139216303cf0ef2b034cdbc19fd0c817d4708fa06738093570413a27f8d5828158653a4d35e1e26bf9a8153cf90b5985e976c579d09a35728044e3868c70d12609d334fa134cf6fc6ca89ab01697397e18fc1592013b0d15ee3ce8db61ee17671c236100898f96d57631029a4e59e320120f089d503e68957470d69728cd4b91c832f34101598875fd36ebd2564cc1ab919a33fd9da03be6eee82be75529d91deb7a69ebf6838e736c3d5f3811468c57a4c815a4184c0f098d0fede963dcf89c71d6f5fefe2c9bf7733c74f5b40ae527dab0daf46f5a45c28983ca41fea7bed10d19159d061ccb97e160094643865b239b3a9c488dbbb482c45e2d2c248f43a624d570763075ce4f8c62ca4425a8807c6b91a7e5b26d7364389544ea1df5332df3243d661eac255302fccaca6ec5207a69abdce88e72308f309883bf930a4b41ee6e188259c1eeca9805ceeb3c064b3ae547b42f2fd353e4b7e2551b68e67bc03d8c18a9bfe22dd5e71852c66a38ca7f71d2fb39dd69ede947dfa821752460ac7fc92f29cb563b0246585591d2a0a7f807507680d0828dbca2e51843f0160871ef9eb5e26db1ca2a9cee8a124074c904370a69fad2dbfb580e9a75bc126495b00a2f95ac5669b18f1e47a5a83bde1e7e92fa592c1a010fd1550ba850bb899d79e6ea7271030eea3bef53403288662ac428de833f1c28c358fd61cdc29f25cc1beff55a082dbbf38fc7eeda1741799302cad803109f600d0b6236100f062079aa0cce61de73348886f47ebf94dc17a9ff903d6acb0fda006134f8898b8ef523b01e03778e91d2203f9043bf956a9a9812a10cb44d89900454854beb1333b0ecd7f72d32d06559aa914d117a0369c2621bfb1c1e48194ae8c02f8d26e78ccfa73faac5d3e9b0eeec09127afa9002cf5e90ae0fe47455633fddec7d303d1d2d4b79b73737b27c51cb751a06662c4a8e5049bc69c48e56a030e8b08948acc2d622c2cf44cfbc4524e2c1ad9bad6539f269fb95ac09432893c1294b4e7bb3ee357306cbbda1426350fb78f9d9f607a839371fa8917fe0746051c90b87ad46a68fc9d63d6c05efe541ea25e5982e04f49244c6ec0f9c27c66f0d2d55c3642768ed024a8085fe4f7ba39da50cc68bbc5682fc08306660e0d8cf0668c9db85417cb6256270d083a5fc64464bb57f4aa8b13ceb0407bac51f008c5e38a77dfa7da3bceb81dd678a8944ccb9e932173fc2d6456bf8cc2154d5c84192cbe2aa21285596baadf6b18a59d7c665a180f2e9fb3070a38a90482c547789017c3f72b26c08cc1cfd9febd6ebd8b2d0ed23b49376b98696a7b134435d57bc23328c553329b913e617315dfdf7aee15a2b0fc780ba9ea45b0af8ecda79762fef77737b159c048fd6e3ee8d296574d62b8b4c1ad28a4a03c397e0f1b2263336b41371b543d79d44e9c23ecda659e06742568db9e265b3d51bed50657caa7a68f56e32d27c33b1cc3554acf3f7b4607e56e291fc30d83c1f181d1b4b40fa9e2132e35dc18081bf66087dfefcff852cd73e51a811c1467e9c58ac6089ac656c45fa6e2906cbe2bbddbf9dce69d1e6ed80cae4ea670f3c34acd8685c365f80b2ed7fe3d82ce91bcc91edb8de197a1541d10110571bff5267c6c8669b5d49986a37060606b2325267099637f84c23dd8188052e037ba4700d85bcc717f0dcce5fc75ffd55e9b475645f05970434548bb08f2fe5660620481b27ab91baeb3e4ce84cc8e60349ce60d0f6d826d17c267042a05bd8a1640bedd0fa642f2e5a2121369f7f9a302c11947c8ed68dc00e413f9af94d7c801daf3f1d4f9bcd961f09ed405089a78276050ac22232526d914f75d10f37b14dcfcd76c7f1ebbda7f4328a1b34ebf914ea285aea2b2dfcbf76dd6ca6a7951aabdeaac889cbc353893a861ec24309558e9a4c77941378c219c38a3d592ddca464d97edf9db34b36289431904218fda2ffe3382ecc27c84e4fc5f18a1ee94fa64e6f389df56c331722af7526067589ee853fe569d172318328099331a910001b29de45b75861b4f0f670db529e314b582b15ee63d1ebecbd317c2d88164aa6f7240ae7b80ac56e981347d998980407685689abe988f638ed42adb0e0a94192d52b6aad894bdae1cec7f34b9b79853cb5d17c0317f689a1414aed99f84579979c68fcfada52e4e04498d0959950f6168db1273941001ce55f72c09b106b32900be3a9abbd04b99d2f9b3f071acb3816cc2ed696d1e5181b57382d32dbdf1738db9162aad542d94ec314909181a12f60c599070d39b28098c8ac4f0254813ff25c6e758396875a4703555bd813151abbc40490d68bc301d42ede051f6692c7f27795c6db71b2c9bc68cce57a7ef9696ba7da79c7a03cbf633ddb12564c19fec9edc549b672bb31abbc236f3cb582b9a26ac5249e7f3bce60b841ee311518dde1cee8fea1039efb95eb82274fa2b260db17ff0a707070747c5f4ee482bac63a81768067f31e8e8be39cecde5d22d64d54e7da2c380158f6c6bc63c81cc4d033ed41464c656d99a58c9bea14fea27b9e6d0baaeafe2625a8b1c78ad9987599637b525bd1f7306c9edec15348386364545c33e3a6208c2fbd777dcab0213d879bbf53ae50d90a9045dc70c5bcc034cad57809398c3816d4ecff01e4fd10ddf3a70bf17ba4d6b881278b456e71068dc697c315092845bb5a299a134ada504bc7f9aba09fc1107828e9720d1c6d3ada61763417ba04ae83c26000462b58a2f1c192102540648afb70c2852ba1646b5b526cdf5666997961814dfe9df68b40e974287f64f14c35cfcab16b6759da241746e4f4de15892759bb1dedcb8e54cc0f562116e79938f68cffcbf3ece153b9116f2eee42e0db3dbcbc9411db955cb30e8fd143217726a505334d4d2b78326d300b3ad216d5e77283a870ce3e1dc1b8a290564bccb5e87367e0ed882e9198e18d320b0ac10c504289f3f640abba9d25906d23caec1b9b69ddcb060f2514997079020c4c41be1aeadcc38c0aba5170b5d794a0b25664c2c1028a2719ad420b2311c3a75218aac2817496202df099ee05dd72144c5310b50d0d0814d901b2fcec1d020cb8c0f7adbb151658fb26219ac760ebdb6a6c3631af688663157574491802ceebaf4313b27aad06d51d31fffa9518ff06b005c1929ea993be72bef8138c57b1b31adddf4ea5ca24bad4b56d70943117d664956711f2a642bda9ad8c89c8cabaf52e2246b6f8889c30b04e70add7b6f66d5dc94dbcc77ee77204aae6a02d122472e0b964c4ca775595b447636087adbb96a4df7353f1b772a939b1d2c93ed0439e787bd5879a1781c58adc22982402b9df4b5293467a03af6274a4c6101373ab1a24e2ab2ad79e93af3db5dfeffe38f896261546107116392f1a7aebb14c63b51a59a8960aa458246699eb08dfa34d904b8247ff9f58dcb9ada26cd35149add888affcc15d8d066d7313ef195b34162e32ac4c0dff27c13f86e36147c312523f4ec1aa9cc38d2562940e568908cc020b8d3f2f274652abebc1040f767d2832f7701f111495e76a18220d62bf04c08b91752826563529ecda311758264b32a93976b902242d1de590e5f02e2bb4a30ed55e180aa51e23a7f40e1841fe388eb09142368850ccc127df7b20a23dc21318750a4c3e127c8f0e3a0ad9e0fb7c3b569c2f6232886e8354af9c7e2e55a6b26849d47c0bd7f481ecfcbd230c186ebb39ff1e77c443ef05c295490a155386329b04ae60c763e2f0641922657d07672719563621dce877bc512582a3cff94165395a62a89fc0bac47bad848051af9840d86072df08de7848dca306245f7d11bf4525a581d6c2ee16509d0d660c2d0b6ef22bf7b5ba0142922036a112b901d6a78e27ad15434015b2cabdc596cf82ecd91adcc5cdc56c4df325ac95331b418c987520ea2632be35016764f5d484382f53f6e265709ba11322f423f7a606843e3098db20d564f7a9bbcad6560e4f18a8bb39c27dcd870e576ff44cf898413223ae98518fabacc2d89ac7ad48960a9856129f0c7a9d3c439ddc7ad2c551239f27989bccf92ef092871abe904f5eab7b51c6c2ae50134e6cf384a5d40eca168a22b4ab6541d585678a4f6e415c4c089e26c15965f8e7830354b6139d634ec55aabbdbdb10f859e55cc7fc316407c7b20c237eb4fe4b02ef9b399ff96eee026927a0dc34199119174cd0e49a0e179ff07d944b650432e4708c73bcff9a6c8d915d7dbd34beb1fb0476d34781a8f352c4c231513350c920c9586e3a4b4bcc55777f336cfe6448fd1b77e6985f5274b299747eb2b0f20abbef221de42d9f3983a0b708848e8f371bb7a2c8511a27c68d3fd8411cb2d92afaa2e6f51827b08df6b8a236e9d2fe7fcede03530adcc0f37e720cc119414cccc9b289c4c5c12eed6192daae8021760e3332981e31839a9714d021c5348c370d836bb722ae3c62df41f0e8f87fbfe5f90a594f15009baf32eec5b0d50d9ef2f945a1c99f2f93978787c2a1a357fb317598480318e54bf14019f4e673247387234e8900705c3132679604e782e5ef183b9e3ce9a5f896168745ec2b1c3ccb887feef67d5e0aa72e07461f9476bff006b0575117d2a89da0654bd766eb8bcea7232c20d4f83fc6e38dde5775d3ad31fbe0a023e1f088437a4cdf1ac5285c4210e13873e059d96dc9a1baeb9f3403b042b01e86da60b8ef26437f02a05e3e37e8ad51d4f788ce58e3fcb0f9abe3894b1f56ee08e04ec6216881a13bd8e4860a7737d6a24181be215cb3cf84e9bc55d133aaddd8c150b9a5ad2b2323378a5f0d024a12ded8ba03802d58aa9a867a13798ec288a3cacf304444239a410b10bc12ea91d6bbbbbc91ee68b1ee3ebb3b39dec0a9ce76ae9617a9c0899366664a8b544e86e18b6cc3461ace7eade0875325416ca31a5e41a02c231129fe1dffce65437d876f47bf4988b3569e4d6412d5dbfa4f50bc89bfc250a2aec51a7aaf1c17815bfb2886fc876f5c143e4705ca9f4283301432f8701acfb251c07769c1a8fb052b7ab3ae5eaba4d2e9add15105fb705d3cfc09afc22eb95ac9381860fb6d43da53569b39fb23032fac01408c03d02cffd90638d94e80acf71c4c376d39343f41881dab790dcad9c0018479a42066c74f76808b359991f23f4ba6e48edbbb1d20efbb0a222468f483225ef8375ad5c48bef2856d377820a9c40e89b3a2eb307d08369993b0c3dfb7bb313c73e8f154782254e871e194a942884e6e2d469f5d4c064c29b3822cd2680fa10a2c1beb208915bbb4cc6ebed22ccf67f22798a391791604f02859a6ca368251781246b708bd40a355da6d9e1d7c639ea5c675d634220a2fcddbeaf4aefcb3097dc2c8b4ca8d54dd0e07bc14c368c2aeb9f1194f8734773e567161eb8e43aab90e835ead131a6e5cd4ad2e3dc5c332e767e811998c991025f57022d4067baf5beeee556205eef41ab548cedd642bc8fda003a9ee0de638c968050632e4f7b76278035f09a02f82533741f92bb1b752ea91a7058e74150efe37305b2801255be667dc405a97e37c17e1ca42bd0872e70563ea23767963bbba085ec50bc9a960947dec1111c22f494486aec0958728dfbe2aee9dff85083849280731dc95b882a995e48296420e421141978bba8d4a2c6624bed78946a555a88364892692f8a3b1982312837f6ae10c4fa491bf87e2715106410a30e87e74295c58b2625487c41480aad90052dbf3e920165c819480bdb39c8c07df76b81304b48fb512b837c58bc31d2f305dce1230ce4d4083dff77a5e83b5930a571f50a9bedb75f663b08608e911877798e62e72d2c02fe2c367b3032d3d0ad1606cc536f4e7d6c4d855fd2aaa706837f8b5cb68e4c603de4a02f35f8b3c6f61b7ad7e89a40d778dfb1ab072e077e9d2d6db0656ed9f8f18f8449ecb081124efb4640357b02156d38f2fc5ec6bab8653fb18955f9b0b6721406a40b422ec9ea2712682a5fdd5709fb24f5bcf214607d721f7703e5ba5b664b32bbaea590f8b86e29a19c5ec315a963e6e5c3209758c7a279138230b4978f3ac4d95e7b5387a182fc40041602396862af6373d6759ca628945a21b665245ad4e463bc719690bc82e7e83c9a3ae7a856549f2ac9d2e0ed5d6c944380f596f2ad914fd2ac1ab5738c968e20930b8356d5b88c8cef0641f6d2b0bd0282363085037698ac3fced0668bf845676e51aeaec2704181bcb45f056a80c6790220d63f49d470c7a8559f018fda33d1968d65ade2e1f72f6bb0504cf24814b19649608462dad72960b610e740fb6508a46ee471a86162366a5597440dd5f2ba86d07035c54ccaf36cd5a828222b20e536123eb20be25f44d1660318e93aa229eee80b58f4ff5f657092a02fb538015bffcaed74c4e99a4414894aef17648cf587f9d20af7e240a5173e208556ec4d391218c10f574fb72a4872aef3e975ce55d4a09f04218c5b16d23e5a629bbab19c5c6e821a6d704562f0f87513a5fed56e0175f3d18bcc0a736c268978736dbffd1167839620f9adda03f8719ee24f151f267b5d83d9a8a35778e28fc17c0f373d6ed7f2134ab5783e2bd09181287660ccc5cc671df0df0cb29ba1c8afba4ad32a2eb4ffb8b5d608d3115e65d008d87dd89ca0f501b8ab9211115dbd42c4395b73fc97bed177b7d9475eab4757bb98629b5a11c2965a45b5c9c221461fca3fe7c5fc0844b474c5ef411a95c2c3d5ea1d44d801284b9d50384f3b76f529ac1732931907ded1c5399b90b3b9bbaa2c670735290d28a1ce1fc6771b8bea3d31984620d5b9ce40a203e6406f9b2b2c5098cf88bbe35940383151b0a01f06ec79d02f0592d09119b7a4231468b3c5eaff68274d1f4263a342f2b4dc3169de0a4763389654c65c366c7584beab9d8d394780d814357223c1afed253948b0c584474773d678eb0032fcd9eab1521069b799f9ba75a9f1b4764fcee8bd5c2bfdcf90778146c81409e12615e3d7c2a33e54839b12616526e1edc308d6b71e2c708535e6529841173223c968f4f5e3cec9942536034bc9b42f76e3891d5b01da36aaabc287b35fc063b74473d19fcb8a40da34ae26520580a2c6676fcaf8d8c5f95a25917dea6e46dfb140e6a371238efa0df45cdbe20fbaf1d5f65e393ce6ebfcdee3273c47b6c1838f07cdbbb270e6e74a4bdbace398d3750f1d59e10cdfedc07d9ef68e25a6ad6bfa908fdc76e075b06e03e33c34ba25c7941161aada92db9bb73cb5e2e2f8b3c7edb14a5cab74d05f4c8b19726a20e5156667acd34cbbe40178f8f261431761845d5bb32b4c159c56f7067506b5d1ae698230c53f5179e3ddd8199a1d366e621a8760ef4e242c1a049cd7f6c883bef4294c95884777caeb38aacb3646dc74bc6d5833062be2280a7d733587366da3319083532e978ac0ab5e9fe393862fd598f29a44f347e1000a6449ff1c6d28c617d7f13d0627eb6a888bf0eee02e4218d2b7a2e67ade3eca1fa0d48f1d73b61bba90eb54bf95ce8191990fd75d06b0cde7b08742dab719644d8b7eddf32c4877a3ff82858790fa29363c314423c5137194cd793066be4c2fd7a708f0ab1a9cb12c620804f2914c175445069fb779d10b6e504813f762856f0973d4ba3c7ad20841b50a6676178b898123776cac9c61db4082e03d738599c7bc2ff85947a28f757c8f4d3de024e19753e7e3333130cc33fe3fd2e9faf7401cce220ee530d42d0ac3e2a8e6f253f94e2c366d609ae6d805a49c9f956c1f3352c9ccd47a5723fd270733d282a2af1e2820185df9a0ea0a8880acf90c8b4c1c5d45c9c492c54c400b5f21238c48064d02ea22c8f1b18d0b82643684b17ef1229d671fc54c1227fbdfb0945ea8def6f514732b9141d8437db6125139a2636767ff1a84a145454d92c4025373f2cd3ed6bab8f9f003a74986c29aff4b9e964e90dc9120f2c9841b148a7ead25d113303e448c8938fd7750965a91ddf0306b92c6b92e46b81c35ece9dfd859624e4dd91fa25b79b9ff002e3c8a2be7db2c3e458efd4c8b989ae1b05bb0401f8eee3e5b1832635b78ad87ac8ac72d84ed66e312a7676c5b2471ef1fb8fe987ad0a770cfdf7abf0a54b6c34860f16599f8e18277379f39b8541676e839966b41ab6c942f74c3e3412adec9d08984162d59c813756ef7b4304e7ba0d93627b47596ab4c13dedf952b483fd281ee11d0f7f86e8aecc260e7fc75d9fffbc1216c14e13a04f175a674662decf532466b13bd5e181a3d4e3dd24b8d039c85cf6f04a039d881417bb6bb8796baaf2afaf87d551ddb656865d435501997509549fa243f6dab41a3c3d24553b96522c832439a0b778d0b66fa0fc435646246b3488b0e9961ce2e731d191cea6bcebb4eadb1126b7fe2b1470ecbb4003369b9b2062e3f881707cbfba2d9d5021cb49214a32b45b154aab308283273dbc51f2337db627ec042075aef3a9deb6b61066c9bb89f8b1bd08afdb61ade52cb87e3b2d07e7a39bc5b9e5380bb69853bdd9458138acf3af36bf6882da3b4e81b32cca97eb9b5ca0490d0df104e9f9f3d52cc3d8f0924824ec5c98807bfcc6169e5eb6ec9ebf61dc512e8a4d358e0c4fd212d02ed025a6cd5b3a088c25ce6a0b1674fa48a3072886a23527d187d014b699b2d3402156a7ec15530f51ec5546902f4be6109b4138068568f52dcd7e7070188c56ec2666207fea8c54d0dd742f22151b59a459d2ab02609898bc5529f46411f0d8c86431d616737f995d2de863d9968855ea1935a9ddf178a165cfa037fc117b11f0418b8cb9fdf7f339be1b67546df21de9778620cc9ee14b10b6ce0595a8e358983d9be3bbc4a0996251c36440a69d090ce4f44803e0f8306ee8585d5d8022785c542f84cc8f126a7ef1ee810779e2993d638079c8bbc7755a71c11412edf37f7e23b38f85b2d37c561a41ef60eae49f19b2eaade683c059a9431f44e0f66741161bde4db951b424e6a11c4cd178d43cbf60ac8179925ec366d3816033b0b615223806c07d81c9688c7dd9d5288765824b5a54d06bce73326c44cca6e42a6a573c4c8615009054d057838fcaf9da44d83dcdd618038e66282460f5b5ae5427a812a7cc9a8aa02e30857cbcbc8805f9346846c1cb9a3b02143a186e14e430656a953f1c3dc2278e7f69c58ef9782ddb0d48f17d3193f108755e0311c29e0afd810a8096efb9a31d2adc008e020474e740ae2808e2defcc872d51bb94ec3f6a8bc23bc4c05066f3f2b4965009049186732a063ecfb89c0845788edfc7f4bd40f1c3249d7fb6714e15480b4bb898ffa05539cea453515638a3c1a3b65bb62ffcc39238022c7ba158f1435bb317069a389d56cdd153ddd4e2292c0704c5109e5fc62751139a8bce5dfca23386ddeb81c40fcaa715c985aa8170f28d11a9e10c575fd64edb55c11311734a374a120dd431ffe226a94731dac4553128635ffc077959c0c8064e0d34ae1134bb496f0044a9f4aad88490413274af1e7fc027407b911d58b1583d7b6fa497e19f041d8c0973f122c513fa46e4c792c5f703151d409736a8c6c47e53c7f2afbd9acd8858e611f05546945b04d0c7d4893eb4de30197227236357571a4bf62ff7774405c5fa5093dc4e078908560b12d14963b54e4a56bec89a9dc4b25f546ab2f48491429adc490eaea1f29ef2729f55f83f51199d2cf18ae8786d4e60d5049186e288bee720d8e82d18f527d7e4801917e69e614823ced046ba418ad14e3ce735307c1d42a6307c6232b754776925b1839c03d451cb5f44017caaa7a8c926bc71812858f4ab9076a43d450c9b48dcaf4d714c8dc06faca43e56e3a37f539194545818d3d0ca62665b8089ee51a40e86e45ff578989ed533887981bfe1e56e58f0bddff051db94441d405d04a01f9a82f512ca1a898e46ab4672b554f777e879b083c8377a92b4f803b49873770810d66199cf39e4ecde18b43e5cc80934ad677c227a2ae34a9ea6a8dd81fc4e4e8949ab5072614ea22253485b1047b4158a2408b82003feddc80de31f44609da7e0d9ed1d2d2352b59977d4002c1938ec43781b50f0163d4b21b052b01154ab4edeb42485375543b368bf5c9cdb70e31d72a3d752008a88edefdd256787393bdcab20398e94437ad4e93610502ee89855aad2dddeaaaa33fb08df79a45897091b357c964fa270aa5dff72ff40d9d6f22a93c11d7e0b651219fa6002ad9877880e4984a032c2b7f2d87f4b15fadb086b4828a151198249df02d9cdf0376e53615b7a5514c32fe636c3a1a89ad8a68b1e6d23c631a28bcad1d89c0c99b26fe163962bd156bb602957520758210d8fcbd3ef7459eb98ffc38e499ad5c91af35157df31f8e109243258d6bb39873f7da2c661946bc96fa203926aa529d4a9be3d6627d23d4a15f072ebccecee04bccd9bebead07137916a2a8b441ef98865c1e8b1d3629e9e0d3e57830b9b3d3c6239e9187cb1b7b3581ae0f77ca2e6d0e6c54c09374d7e5a4e29d1dd9ea0540a825f4da2daeaf88465dbfb40b50e4d10c30362577b73e9dd1b15f5abcbbdc0c1cf50301a9c6914a8dfe4651f3434db3f3d588c7a2d9fef58f36632ec8a37a17ce77fc24125b33252f3a16c2dfa7b425075bff4e669f140b12880a5ff7ea14acdacd74322cb66d26ca20a7c383a2a3e3c330e9054b6191ad618fb6bbdfcd27041b8b468458b907cd63fd110c50f86e421cba88520a35052067f151c157ecaeb1824fa75758c7690ee039ba2c51836d3e3a40a868bb642e27eb152ee8a37c6aca27d2fac13fb20398a888946ac4532f1a6fa77a157fd5853e8df361157aedf3be635d56c852565c1233125b7262058a1097361a7cbc2198981e8e53f475c21c7f198293e0ed0271f59b46022f885c155ecacf38fde32c74bc0cf431c2263e5912137dbeeea4800eb1351b35e71ff5ca6c007b223bd68660791e475a6ad995f68d2098578f6ceb0996cd979b16086bf2da6c5cebb1bf52236c58b1b3b14cde905bf3b5ad3396f8320ac14aa2133571830d9f9b19e46c24db57f5af773cbf5e6e45e490adbb40ac5c0241f4b231301c95dda965719a3520bea725f26f407eb58155ad4cee9314a82ef171d87015f967706cfe2cb36b39c1a4707049df9d2fe3cb8adab080cea884c4ae8d49e249296f3b02d5f19b352d0642054b53320720634e4d6fa9fc01b1749edfd8bbaa4b629ea520b277edb609f5ba1c0647e78ce936f17160be0d19ce72624ad050535247b9d166d750ae07f60a6bdfdc301027a230c2436109f397042804eaaf8651ac76b693390fafe78f207fa90b0a34554432b17912dbbadb015d7e0cb7b027f6713a396a63315299d5ad679193874ae592d58fadf57348c4bc1658fde092e2469919b058eff18105403e2a6b4123b20f6303b988a893f6492d1e79637bd0f03890150c6709af052a0ec57de264870fa739c9ae560f614364200ebcbd1b46032bf036261b29eee2fce97b633af89b24d80c04c672da60ecf3a4279999c0fbd7fee0202ddd59b9173dd9712ac5351d799b3012a16e2be211a3f02aa22f80d0d37f992e569dd20f626df0e0141ea111f2ad90116b8dfcad7dccc417de0d2b959867b7479794bb3cad571c9e86c91157090108a6df91cbcde3fd7bee0850cc43c45f80bf01755d10f597f0a275a3e3f3f24de9fe9cf1dfd7c458147a5890f17ca4e066819f20f59ce001453ef7014d41866848fa51b3676373d1318579510880a91a1bb6055ab64e0cc7d8824f6fa0f074cbfbedc7a624d06ccb64631ff6e4e8d218f9a61ada2b2ec340955f48a50882d6cedf2cea869acd90da82a7e06db8072e65ade6e003c28e76dba16ba24d1bc083a0997ada330dda4bced3f1a61e7ae12b38b46e0a64f68b3220383fb013bf5c935138012155c9cecb65f23a49064a601cb35887e3888a5c9d09263b0beb37c60a5bcbafbd92a71a0d084589031a07a7fc819dc5060cc312b8b264ce2f62b52818afecbcb5246ad519aeac3c266c256d8ad882f9a4a23e989b16ab73b945568d60b2e85374e20c73e9acb8b43e18fa611e9a9d464ebbab338579d8b3def2ec6b6aac02a32bb6bba4dc3bd7133f5a8e257315d628500d7324062de55911b4d82302a356b17ed01203293dbb6cb4768bc3ef9bbf59a7ce3e88b0dc79618ed2fae62aca117943505c42da5eff7d2ef3f3173753091d926482503765616d75191c1b2beba90cbae46c93e6c44975083fc457c19e6ed87e60e98fd46baee63b0a16ea2d06fc781903437334023a3735862fdc9b961b0008a2d15ffe1f86815cd518595ff82edc7bb1a214e30ce2c09df4396fdd34e3538a4cf8b296025700cb1fc1b778742ffa32f99c7dfbb08c3c3da4542ea10db9ffdc7451425e416dd90caf5bab5e69973403dc0911ca3d5e1d20a39f3777ae7330b9e08e17cbbce50a54ac7f440277cf60adb9e0c77394ac911f5689db91141ad42b3be00dc1cf6d3bf8cecbfaaf5df18929430a6cc52a252f8286d6b66c08c313af45e1629a1f3046809ab231e6538935f3db8e88f4f9649a1abfdf294d0a9744f379c62d732cfc45e80c32733f843ddf70892613a1bebec1d319b55c3b7d2c607c43b128cea13250e74e98d25a02be7abb0e860ade8e3c59a8a94e68dfceeece6c53a7487d4695e8ceb074c39757abbcb4c4be65a589ea44554005114dd5cf1f802ab9f66a65960a2ccf2e394a9f3cf4416cadb350b5457b3269cdad939f76deba92ea03fa82dfed7a94312bbf0f589460f72511ec4cd355a0dbd9c3c5becaa34370f3448d56ebb8348ff380454c5d7a26cf30ace53b7ec6c78e9c5f816efc951adf2cec77641637b7d2d9a2f64d451b30961f69f0060ca0f74f15753f1e23c4687db22bac7cc6c63c52415b637d7174a596843f19e27d248f6470c0ff38e0a0312b0748f51292a83a950d0eabe690d904b10b3108be12dd28f0ce56b63b25624ac73aeaf3660a377b2315d0885115a3116a31728ea9f347375f37f196a8b67d7e0604059a1263f7c2c0b3f09d236467627e1d51c77574968b8f553324ecbce91607bb54a503d1eeb12721e3818b54291978dabae196ce071d4e3070bb4f5474f68c46e638f8629852d0221f034da7cf3cceef153293a1aa38581030173f167d29f560af1b87de5c682f29296921e9ed208e47a80e71a75a00abe6510a6020a604040e7a15966ecddc81847b803522f033eae1c28e13ec1df1c8d130e68ca521044ec1f08d02a80ac39b8f6788ad03fe3877dfe9c2098d1f59961376ed706c47e40787884e561bdd2f7f6ab1b6926841008a0b5d5f78c98c8f4144674c7408d0e842d0d0b30541e164501c396f714f9e746f8aacb217b0281ced885691ed630a0c826261ea9c3b1bf37339fe831a3b399ee75a7231e59173f5f67ffedb5154ffb62fefe0d53224004f072fac656f85745a0b010ee4dbc907de8f31bdf001d68ca2c3d8784b61389750ef43d01cc7fd1c1171a778147c3e186627101cd01617447f8e2e62f78d6b9d1eca60662e79fb2efce643d9e60293ec8fde9391870a0be5e0e2052a700119411b8d2a366f4cb0d025fc29c16a6776383df4e82dace6557290f350dc04c3063c487a04f8b992628ece18293ff3472aef93eca9bc58731b3e7383c7f48129b0520c84e3cc8e2d3a10dea4658d8990378a9577cbffcb048d6c6e1a398698939cd4080780d5f7a8df366fba1c40c041640fc4d4525207c543c0e5f8c9733fe39dfa09962c1a5577d70ec2b1630b779e45f4b22e49487ddb6d364d590b5410f70da30c0d652c2f871bd0220931cc8236da03a865ce362c4629e94850d3c4a624298d5b912c3b16624ea94b34e5b823a93ba69fce2522a2d7ff457eb3d9445488e0ce1c3515acf715a49941443fdd06be8c1aa35e3c0e6a0d224075f696a816f91097d47557ea356ef0493a7461e9094636cf0f2838e42dc2d27ff8ec5dd8c22e1d1f4af70574f0388db6d1ef68c8be5dd6427b2ff590014fbb88b50d86ecaadf5a558fcc11e75c4931f61ccb86fd069c124f18df6bed8eacfb1830b5332c34b313b05b6642d8916437c87ddc247d015da9d78dabd8157d3944cdf0f26e52aa1151cb9ed1da8902d99de4f2ac371394ccc3622b0c209b8fbef262f6620daf223c6629e1e9cca8b7798c02583ae13c092b0041af45097511cfae709173d0f562a20e5d140290800440fd0054dadb774f385487b34c7aa0ec7e4fcbf9705eb944b692948c1831b01136667a8fcde813869c019f834dc06834e696e80189e30d0ff0f63ec8133363eba4ece7c02bc89083f8cd760128a074eeec90ceb26d3a600ed7d7875d2fcf7dae9cbb3f91eb4a0eed06e68badc19434b7746f59acd0e555ca1394c34e3220dca6648e402bb699d2183176bc5ed2c81241604c062a1e6ff1f8207cce9ce01910843e982cad9afa2422f9890a9f2479a2e83dba55c763921147fc5286926330320e614cca6de3f77a28017e8887f5e122fd906746df94998bdee77cb6a6f4d168f243fa9f3a9a62a6a689fcdb8249e0819b78534dbe559448ba0517bd17445c0b2bcc6043dc45bf96162488dc30376ddbd4e2f8237e16c04450a60bf0ca6099d86efd6b45fd114b3a6d7209d8e67dac4f6e44be0252187576558d8bcbeecb7c7d3e46abd1e620b20fc39a96b66d34594c3861c27d4d29b440e8be7d5bcbb5213d19e0d1dbc4a84313447ede5d3fd619f00c578385b06a09844630513bf697a28826c87a2b8bb25ae7f58160d7b6953112b62bdf471c4438f8594528e9bc605409fc5f9a88a2d1915feab498c225571c51d0665a84002286a41a11e817ab5c000b6f7f14cd801f0e50e97c7e9bf931150d0b894c461c97a142f7dd0f42e77f7559da338537a84bfc632e310994e1f06f4f4e662ab404699035ad10ccbcf672ded5d81d168fb246705bd73e47adea041f359b9d89066d84d085b222b70b8760cd2ccd9024018d3a3db475c709f1c39ad13f44c0734fd5fd726c2681e3c1173d93197f9ae8084bd01575bfdd9e5cab6bae05cab341de4ff1ff65d57da11d54da13f1b5d3dc96a424a4cd03874b9c957475974590c213d5449ca066605f8e6b1bb80c614959723aea30ddaaaec040b54cf7133831240898946cfd908be82d65bda7663d34b720c7dc5e84888d485027c4b10497fdc6621565805b8705e9d230860d629389b33c430d6901b8bd8298dd6797568aafe5bbbdacdb6b8dbb3a88d05a69479c41fea17ac03d0afdb6aa4e99e3d1e3dd5dae997aaa8232ac9c4bea1a115d29b1ac2c0433550bbc8596ba66e0100eefd6d5f2c69a08f0ec9d7629d212bccb98a73c9bc19250a556b7090714431a9aa294e5d17a23b35560a30a6bb272f80bc2a9b68becac23bc3a0ac430ba8e61aa9fb0aba87f116a5b64dc6eb777f1b358346fa68a069f27a1eb4ad7389623f22de3fff7a1d5dc35d445a93675fa51d6f0e33d44b7fa8cd5ceb644f7c60d76dda534c0004474b777deccc8629ea4522ea36023810eedd645502c7f9607b8016534d4d186fcfe6175a1471c780f1387f6ef3b17aa680cbbc2fb9dfe9e03d3337af4268f7ee3f46b649a93e1c63f6c515b852d6b2eec53a356fab90db1df8a9bb49afb3e67d2cca1179caea74fa8d99ddc4c68b4aa83cc76eea9baa391fc3be733207b80ed9b1723b89b3414cda4debed73b6bbc64812878bb23cf272ed9d6de5e7d244d505355702402937ba19330c581c6097be0cf99c26140420268f111e599daba472c8cb0a9f7562c83383665fba9b22269a7d15b97a7eb6c603b290addfdc5ef16047b5f93d8596f2299c1408a0acb359186ea5278e469451cd842ff54f277c468ab8b67173bfe87269735d325b237bb37d740dcb886183ac49fcca578a71aea9233a98a3d8fc28b103223d3424870321f7bc96454ef57c0e0ef8439e3138ccee82686d6971c22b115c3d82118440ed1bc5a86d47bbdc2ce934c2ac9843e092f0f9eb1bec366a5ad4f3860b769ebaee7229ed2de4eebf58468d9b3cb378fcd49199ee5c416a400bd63dcc53a91bb83ca1630f164d1d07b7655814ab16b8015426dd8699e8f90e5764af7795b6a6557c612a03be441a7be411bec863c6b03a3fa8420a3e52079b01f208ad9d9e69abdee49bb39d6ec16ec7300c49ca98a9f083da7b78de4f2e599c6281e606bb619cbdfea41b789c687742724afb766124da14ae7b063ac19a061a4aef3a06fd04e79e74320aa216d795f93e1dd97b92ca10a0f47ce80501a76472b8374b54326f8e6cfc89072087a25c732bca179c2f1dd18b7bef18a41819925ec3bd632add6779b07e6eec4aa70b6cd52128c3ac039c7ceffd0459e5f1aba1d7204ce393867e43af164f983ebd7e263c10d8ef8b6572615007270d6e56e7043a510daed342d1817a4b9ee667d8795c3b416ad54f469dec700f0d4a63af68d0f6d117f72e502358f666c407a5b363b2d0786f0174dd2a55957444c1e1f0523c41b1a901eaaefdaf6f505259ab4ad7b50bd9c364a3293f2fa0e9ccbeddd4e752f42deb07d9047975b585c1677db1d357d8ca56ab8e2d9d364f1fdd813f7fa39a830fe59fe6b1b650e05b26f0274a0d94e28f97d68e328c3a880f9fdf5bcd1a1a4292dbfc444da76e4436fa9c762d24ee9574c6c9648a041970b95dd1085a3e99d5b3e165a3b79962a521cb69f1999cca7d12522de55868a65b8815e3739d0c738a1ed7d47320cf3c03c2e8abf491284a3bf5fd9d4ee38392fe39a850a1f1694e2e820182402bf6a735bc3c4d65c2271e6ad291dea5a1ee2c34a88c1d030103aa4caa52424b5b5760746ca528278931782a2b90f624b81a439c370a00cce12390c7f013ec8b08a53b0153602d2b60b8a297852cca02e9413f5e04cea63fc46e8fb7bc6222f8c3369bc0243c4f5778d71a0dcb4fa039e39817f25688b390c2c909eda90b38885777f042f33085160a5ebd53aab094ebaba42a9c50f77eaecc93b89169f0854a66d5ba6378ef03a627ccbd5a2fd5767581645e5d2dcd463668651123a463d0c29ba0b9e37719bec3f4aeb959b8972ca11cd8d5003c074029b0617164302ca3dc5b75d97cd405e6e831991bd7d6e9d2a980db7e4c34d03962a456a0808ce939544da155338dea171b021c1a0aff2e34792b35396c2f44a200b8b793583f65e14e47656b2fd9f4f4d4661bcd71f8b8110071684fb3b747b6a529b9996ac9fde599c8342f247b4b4fa25c6c578c244cbd8afda691ce423f6aec8380fb9345fdd568ed244478a1439d455fef7a5a3e600f9026e0d372adfe807b6d58568dc9bfab7613081a158017d6aaf7fe61ed235c0ab52e4d12acd4c544643120d90cf8079f5c65dab20662d7977085b7f79e369b29eb65fe350ac9547a3e787985ab864435c477a68130284ea7a7a8a3747b3bbbd308a9aa488a5e28f78b6a631058cd4d3e0639701d3b9f875511d24123b28e33914e7249c970691dc4aa6b69cc8a535a3001a0d3e699be54a4459c6e785af82324f1728a5a8a230ad914b710ed1955ddda51d46e127748ff65e42711d9babb900baf72e9863b52ef17b0786094004959fdb1ae1c047157f793e0c6f28ab530dfd11caceb0b1ab56b84b849259e23e4a337b33f94a8f0ae6fe59530441f3035e36174376a477807daecca1a1fb66e170fb207e68fa73abf508fba5f9c517c7aeecc02c9f04cda2e4cd67e99da8ea9dc0ece26c30df4cb4ef222f98ada444efe5723a35a4360e94bf079afa5e204c6cb8da4168aeb3d867cd223ae67343539ac67ea0017ddeea17c74f239fcbcf621a8c6d691713d2c0fef11372869f585693c8960894b5c683a9076844977432fa301088a54891b803e0e4749174a7c41c9cf36aa33fdc8ce25b869a8b244476150ab3f2f64c563f66b47d792b934a02fa17326d0ac0d6820bf797912803d3c62f151598d4277a35880cf3be69ac9ec76490c4717441492ac12689a7f289c9f303b550acfa6f70240675c5d36ac5007d5566c4adc6d460049d1dfdf4f432b908f7320c6a84294fe3fc594164e090f5fac2a23e59e8bed6d553311ccf80b8525b566e131596b9d7141e26191173fdd8a65647ced196f91fb874a5d39858ec22e677ec6bc28294aa72cfa32a23dad735be0269afa650f78d9c7872d5b9c767d3af1e99de8b00af5460e135d899f41c0203e4f5e25fff4ef011a757bda2586eae5ee3418878379bc9295596c83c11977ffd3c323fab9d383b64f1ce12e4840b48dec96556d163a0e02b6797b39ce2c9004d435270ae78548c57fc5bf69d90f00fa630b4696c20de6b3857b85bfcbb31d3622348735f64458298d08eb7f894beae7563bf575619afcefa5e810230d06a5254bb719ab081e2284b8a07a4936068fa10f3a924d4421709b425155bd1be5de60c0c89ce7853e5bad2c74f69d6bab2c2b687122f479fd699f1a36b5b53a99120640d8a6399c53ad69634063105606428fd1780fff359a3adf86bfb9dcdd0d30077b0281720f41214bf1dd8d0fa30f8ddef1aa37f4fac34e3855da2bfbf00327138ed2707c0bcc4bfe873611be59525c4f2fdd6dabcfc407d9d75a6e26d0dbcdcd153b8836a8b3cdf8f9be3273d10f3f86097e1af2e64785710f1d37379dd5030957d6b8455b0f36e283c457145ad7905a85065eb8d137a3728f1d636fc3ab2b53eb3ccb673056be1a090862f12cd68469c322c7120bfd2da0bbb8f5cdd1cb33ce13d1414177a45a8a4aaeeb12a5124ee618fb943a8fe20ae63b2519c1de69955dffe563e8817112d082fe80ac273e4e01b7f963c2fbc1aea334b8f4ae4d310975120a5630e452cdae0f57824073c68caa310c6f53fe19cbd3ac9efd5ba8c9c7d342aaa78a873ae6c1ca52abbb90a1548db244c70133ebe6a352fd7ea92eb15b4e85eb5abfd65d4690e309320b06dadfd25d60f537e442deab74946cbde11bc8776e3160ce73fcedf40fdaa2eb5cd290863bf88daabe7f8ed4249fbebbd9bca3c8129526c4f46923330086aa9f1df639522236f8fd75be390cf5a267c7bf5ac7badefa4ec8a19f62fa149be9304e3911d3593725c4c929df4ca739fb9ab4eca3fab7f58b5a95e11dbfb36eacfded185ffc689998be6fca869ec44629c54c8fbe6514d2df095a85ad8f3eb75d8981b9997eebdca74437ead3c07f7ec3e8640713e79d34a45e9a9258efaadf7eadaef1413247585dc12bb63060ad6f5fc7e837feb5ce3faca94335fce02c2467a73ad871bb89d526f9a0a015094ae23263a425d49cacef9abb3a33d33c9ecdfe429866667bea9c6fbbdef57300fbd02916e7a4a4fe7a9e873ce4840c522688a8cea7c7713b67bbea5e7a66c972c308ed24fb8fe724a1431c8bd48781189880c1bba2dc8b38a0699c583f522a4d11758bf36034c0783bb82015545fc370110973d5f2fab75c179ef5c9700769140d14cf400c6f01a26ed06dea2bb08a646b902e14917580428400510c98698bf7adad69dc7162112ade79b129e66b3c3b50f60a706a83d9ec45b6061f6e907cb6f6f1bb2ae93602a4ef70de5a537a0a156f7c4efef8cfc466d41105abce8a754b2fe596a22838c2cf764ead7dbe14c787d25e3303cda1569292b2b8a7df8c35cec12b05c42780368d3b9b0515839d3ad2338280571df51cc4a90bf7ee2fdebc60daaa1d9a97e48f25f03f9d0ae9d0bf989b05a21aee8e94b4edbb491fc409c287b11534b177e615ad161390fae48469cac5d216a0e9a864f8f6fdb47472197fab95690099ec842135ba62e1c6790e8a49c147c2eb77f7af41efaf467b8dd5f4ae27dfdfaf04d103f2268d1afe400bacbb7a6abdc230203face502a8e6926a2248c73281dd782bb427ac13f2926acb77811d41339751c3745859d53596925a7590a8e72a0c0f5d486d19c15b3455c2744e731b100e0a3d2ad205052427c4881da8df17416a350ab52c2f40108b8fb8eb51b80c31bccdc60dae8d8ea5cbf2d233d6a195d8596f3a5d82b6679857cc87e2265903150aeb3ed59d9e663731524692949d0ed0bd09c838681f801442312a4430d7583a39016a8196aef917d4c27e3578e3a07296dd4f7bbb79ab452d78f3c64c3157d54ac5efc61b3f1a87be85037c35e21d8a5ba322c4cd02f23e3f889ca14a0af3184c52472af9b93edd155b89e330ae076f76851aec6d6f056479fa2fd11c8701914bdbd7dc67e92d0f85f314529b909ec0d82de1c7a8778f2095ffbba154a9a79402ef2a752a75864e99bc4db1aac4bebe011b7632a139fdcc194e36965bbd51af9c8614155c8f122443327db4f1ad20e5605beac47c02461a0979f9bf699308531c4040de1759e72a9b952db28d503cc141995a7e3129dcaaeb218711d27aabd076ea08c96d83e2d9f47eaa9157c48c9a1eb9065248843de9c7e4106a8131ce9aef6b6294d1ab9d3ea9ce4b8c83380ef23e81c7cabac7ca62772debc5d97463bb15590fa99c5cee68330110cba7e8b3752539eddbdfcb06ea510b18405a885c40ea86198cd9a85a712c1c3d3c3b9efa9bdcfd190400e104137015b6d62a6b8c0650dd7a20e87177a293ab8a30ad7988a9925a74dde6868d42f0c95fdd7d1b7c4d7c47edf70084ddd3b2c5170aa2acdb46c10ca4b32ceacbd62e2a089e27c23ac13fb6c8119aeeab767d17f9d40d7cd4f541973a2ae9956682c3b99a9a621a84c8c615ef95c6aabfaf848febee079d4e8c735d3033b5b1f9e1ab9e2153e00c64d510f98ee75e7274d82cd26d78668a44c324fd9b0aa4c3f8183d06aad7d280193deff51a72cc082949a86fc8ef5e55e9bd4ebc98186ca1f81dd355e20227d88df98fa9748242233309635734b107e9b12bb94d026e452dd741462ed090135c6ddc211ab1ee20dbf65685a394fe3dc8c2a67c800938d7e649b51d8eb39665e5108bbd673d076e292c7c86aae46e79f23c84c2ce68d395dcded25dbe2035004f5d04da9d6d00139ca0b71f416178adaa776a0b573d6a20683de1d89b28b40f6e73cdafba8bfd9a62dba9ff896741ca8246bd68a1a438152529af63429676d3e2a6db4423bf5b0f06672e559b0439ce31e6596ad3949240554e633d0ba82fd108d9de000243723a5ede72a055d3e9eb23fb29921ac9dcfc32ea51c2304b2055b6f25f63d159984e17f0202f3f8986a2fcf8b0111bf0543bcab5ec47ac245a76f5a9cf6602ef8e8cdf1253e01fdcad8ece03d4bf88f90b55ed94fffbd1c42dd27a16ed1fbf2e851b126e1dcb1185d6a7f94c80fc77d6ce91c9a21cc74c8e235c440ab3f7ff0eb7c862768a86c6da548f8f210399f86126dfab97a10f33979c5c193069dd0f3af063e8d6f6cb2ecbf4ee2161c7321a71908deaeeb1fac56e735ab7eb6e16048392477ceb1b11544bbc97c6b93a2b0a568973ba7f797750d1366a74c01dc84cbb184cddf87d1519651a304c4a02b965ec690d3c586bc1f8df4790f58e78b832c83ca258430d108e44f4127d5eee320013eb8559d67eff02b7250837c3d7cdb2e9cdb2be1e577ff1b242453e86edd25de1323231a389e7fe131ef78c8e8cf3bb4a532f64a4fece35d74fb22c2b880571ae4a159badff54577175c274f940b7f43b69f4e3247cd8c1700636aba6f0eabe55f623fd124818952e5eccba595c082f9d8770cc33b553a8fa268849b129c2689f338c004814fa1b7aa13bcd9ee8fde20dfba0c24358419e1c987ca6a49fc90640eb355faef230d4bf3a3dc12e3fad9247a82bd8d3f1f1079b8a73e4ed79268bc30768aa2c70705a62c236e42c81a48f7e8f2869e9d16f3454906f6443ccf91fa7f984e28c6de2639db3d1530713643b11741cb0f515f48dfe8ea150a525b1964743d9df2339bade80cb2c0ca6fda17dbca723c479df5cb8969d6f568c8564af4a8d19373da8e1859bad6388ab644a158806602334f95b9dd4fdd8cb63022b8e094a96e83def94f9185b852690a0897e01d4427ac31a36ec42b70d3f19c3f18d655fdba5fee2fe550f933ad3a54c3f5f0a857304fe3c06f40b8572568c3b53429abe3141a702d410e6884e6dfb3843fda01f567fbdf00c48cb856a9d48baf27889db8c4811f07cebd7c0151c3e7f3f87ffcce0a3273a354942aed1a83b8404e8741caa10b26f7cc3fbcf821bc10a07c43ec163f908f42e2b9c4430f84f69b27249d52ca25d9983302f026b6c135a7f5ead8e3a267d7d45da7ffae47647beceff9d89815326993c01e55803766f75caff8e725235a369d3972d43fddf6799c6c75daa602c51b31b3b945d6872dad92d074c9de5a8099ac993fd4ad4c3cd11161deca3d867efcdce3c4243a18ef80eb3059df0f890b2827c388b3feddbbd93f0ef22c92c15704a8a615586172855a5dee473c1284a2ac3e89cd049bfb59e0975e9b9cb002f3aac11741859d638c49969e49b16f4654c4a644e25b61392bc2706e0a7aa09e31acb2ce5f3377d47699a0c417683acb4788177bc2508bc3129baf7403956ee8ab99c0a123cf91a85f6f506ec814bb55664d0321924dd294d3020e363eaf1a9d03a8523172b16eae52e7319cb83a5c44bee7cf748b29f9672a93393ce1399d7265ebda90e2ea73cbfa9dcf15299cd52a7ae14f002fe5df21fafbc2f59758db40175946c08eac162c3fed3e906b06292e9a98698ee283645b84ddb5563531e7d3a5308732312d42eeeb8e635996eceb9c98bbb8cbc915e5424d2e852b0be84932d89a20cb8aca2e4450f8fef5964960202c56979bd2d76b1285ada7f699c444a84494405f46aa9ed7dc61278ad1ef7e2fcd8336cd0b79153a01a29cb93500cdb559c94271dd06856fd5f6d9812e9d240214f3941b85712de6b8944cd5cc638e181571f85342a0d36f58411b0e81fd502bb107ae85f2d12c7a9f93f7d81ee02a2e38fd972203398aca66118bc8408bc125fc7044f3941365adb22f7301d1b360d496dccc7a100ed98687d051b72019c814bd227e5015805f9294578c39eedba15acde417979f99dbcb189a57925a78ae7277f0e1ba777f8f8cadd223b251dfda3729390d665360b2c1ee7a7d1329f28f3853c8d564240cceaa1d1644f88df681cc116482aacc59cb0c6fa51792848604f0da64c414d00164051c0793490273c160563529274a651bb8accead7b36672d0578f4bc21b8985e79d4c5cc513ae045368b853f9543c14407e5db9ca48d1bda8c4afa2af5aff2905da8461d210330e85274126de2dd60b554732f43ee8a38b626c83980f438d8877d95660c7484f21a2057fd2c4b994d4515e0b679828a3c4d194859d49a79c01307c1f7af496865c1ef8eca8ec0b2b27af9beeb18023edcd5106900b357531728fb3d6664ab00fa907ae271163c497c1b4cce1dedf43c53ae0cdfd4299c30a6a94e5fe57f6fa250e5ce0e1004b83d7bc13470e8a0d9ac358657cf0afd7b2effeb68ee70cb566ae7eb35eed908a17124a80651df61f41ecd4f807c224007091a9a5dd4c80f0bb52988330540a4f69c3495ec818074615e5f5780828de4817ad2853933c248c8a746468b2cf77438fa29d59250bc880d0b4b581cb59e66393aa3863af4353a182ef204e8a03f22bfa837f2fe1bca8d07c8189b09ac7d64a2b23f43b5b45ff272d00eefd542fde8095f7ec2f18dcf02e1ca8785b63b108ee30e493e0b0bf58eb604156dbd5a31bfcb28e33dcc180a295cfd29a42d225eff3e5843dc74f5936ff9159e4c60ffa9cb032ebc195ec18c387ecaf8276704ffc8ee9c3c4457141ea8f4aa368cd1216abd76640d3a78499850006e82b7d64e80967c2a3c7b0f21949e9216c8442b668532f3ca22e1c7ef379c0f91ae4dcb305ec0d44716922622870acc851cf84c36efb839bb31338aa6ea67f8fae9e52a6c5ea9afafe0afc1bcc2dc2253c644c97297b9050a0fc541bec0097d4a2142cb08329adb4f8e789bf353afd15823c21331f0e3161803fdb308da6ed76764d995d03ba1268f3de72488b8703dc212ebacff15bdb3c5683dced1215e6432acbb6cdf7c0c28f41b1f56a01fd550da60d4375ffe23dd40f1b07469445e6533b85fe94b585ac332d13d875b85c63fa085a4778a61784161b9d0413a8d85a8ffeadad7bcc3e8c681aff16f1552f3368314fe244fe572802d81446de3d0cab7a1c056aa2e69c58412787695dbf32091d09641b24c12d6256c169f1395e5aa25ae4a61ab663f9f650e18a06f20633562e7133c8797648574ce66987a53a0c4d8a31586f2561ef7b23953ef7ffdd82a5600f37a041d5d3488cab0a13c40122f59c2fe1affd91b9b57206a193255c8256ba5bb11085aa310918ab303cb37efb8f478aa434260e6ad3d005db37fc1cfad4a35ed7fd4fdebd28cae8fc92efbf14f55ed67f56b8f3c9381f8b48dd7bd22035f6d640d3ae898a060a4113ff7d727ea1fa9594c10848669400f9c96d78ec931dc4e267e9d5447b60c6b9dc88e7132493144537ec23132f9f9b83e4111e1d062e5cad5e265d6e8ca0aa7fbe8da45ebe974c5b0372803d97933b615aef262766f791b11e86d6f0213b10fcd90ad0c7e1ab2c3f7a388f71a90144a89a1d5e5fbfa9501ae050a725d170a2f567aee0817a7fe425a77d2457c434a3948af0080f04943396eb820afbf9c004450c2899136cc89162c517ec2265cefa49c9229903b7d4b00a4af4221fa1cd84701991096c95d3a13a470354d90833959a959c269a896040cd7dc467ab0ed52c290600e43b4411fc681f14a11abfb67e313a291456ef939dc7b0d90260f2bac8f112cfc4f9b0c51fb0faac1308a60dd95df4ae716ed89bb52361584928c218f8dfd7f8129261896a4abd676c0cc58f402c166bc3ca6348c286f0a6da21b875029d36eb912008393b21f6b30860f842385fa447e905326959f0d75856c4c004cdbe1c607a5798779c4f78f28693e0aa6b1f63065f51ecb768c5d7f8e557a627e0ff37923138851a40e77d7f7afbf61bf6d0ea3a175da8247f131d50905e6d1240cb970f07e37a765c0f341695b0234302d769de3c93803d12a7bc927ca158e745f456be687ea9a408ecc84b0d0af5d813105c78b465b1f10e092708577d79471c6fe4e8b76fb02cbc0437b62a088099818dd13a951d3a94521140949a8f2cad08214e9da298f822da084081837a205c1d845cc6ae30b6254f65472423f5fbd491ad07a4f1b222d2d2fd7be7f64c85678c60d6cfc66385334658fea8163e78e170223a1ce1d908a1d30141871d21f50a2a89f936a523951d3e8c30721581a9eb55c271c308889e600b138b18bb781c2c977fd30c5708162e4daae54d58be3a043727cbb028b7126405cd5403528ccd4a13989acdd8357a22c98eb8440111e2b9cac15be60762380b22cf815841b9184a4e15a16fcdc8661729360851644f94a3625ab8020c943ee8c161c16d3279767017dd43db8e92255b5c53a01357f52c8d48f369a6233c4155764e5750688a28be6fa1ba6fa8677e10e38fb6d83b78da517850a751dcf1344dedec60844449d35f260ba3a61c8fe4439b05ba8a1d9be38d293000c33cf30e0d63d007fc72c074c2f0bb610eaac5b6053c0da9e79600b737885e4baaacec09c5a8ded12c5365333b96cb42a28b6e4ce141f21bd517ae7114f1e2246a7481e4a1d814f3b63b79408dfae18c76cf33271608c814042bca264c8d079b1abd11c87da9310d68e5bb059400ca136071ba54100d068df5408a770c299012fd461fe316314734ede77b6e7d9a6f6684b774440eff47bda7c076179fccf62819527426b9e7bbf73e5b4a4ce0b409390baab31d061f9fa356b48a76ff7fd5c11792fe3c6f0c5189485020e6a2d860dba1281ac3a7e7c413e787c714744d69fb732706d879a27d7c20c3fab0e4c5c67b2cf0be393be4394df7c1f7047236b7c4face3027b3e0388865c1d02fa135ca0340b0e90f0a84c04410cc6781169b9feb7e074a6a10b40c98f2fa84107141c2b5e2ed7a9e040adb66337962005139c4ed93d2ad0a4bed5b332a7020d0b8d7448fdd3cb5b7ad19e37594ed6273db60e1934f3fcdf2175cc50e9483a48939ce4dec81a5a6af823f8c16eab952fc8429e980a1c3678770c59bd6d0c25f56027bafc1e5804f6a00c818ead5811cb3f8ebebb739d9821027606109a033e45403fe96738a2bbe03ff60553d837819678bf9d67c239b771319efde34df124496e213e119b20f2163abd7087580e923ccb673d0e19e28f0298280d505b499d52b185491c250b31e74b2c37b043072193fc5f585c8a0182fdf83f06cf6363c60200a26d0e42ca85a168a8adf02374679cdf81ea8974172a5f25de3474cfdbec145be78f67d7c76f0d117288316d1778199de82931bd9bcb41829653a6d067ffe8e529c1264edaf4cb454a66e219d5aeac88979cbfa2f9e3fd187a7c640a73dda5b633722bf34bb5983bbe083fe0c3cc288da1a77bb0d8cfbba1990eab318cd0dcabdeaa65a14f48d62b90a7726ea04a389b30eda3cead9e3a8a904df164725a805ae1b077f94fae436f356720598c86ebf2e861572fe79c3bfbe85888af86768617226420fe73c4a57eb08f3c9f32f2bb5ee9b0b13b805266e44d80ca3de950c80ca1f3ce902fab5ed585c30d61da703e974f3b5dc4cbc6c17c9b0766b0b712e4edd8540cc76f2a9951c097a7675121c275ee2840012d3a1dad00384b686804ff46b1110c26bbe19f1b686ca0ad6834f217f94a18cf759375d38b86621b8c9de524a29a59449065f058a057c055a060bfdd5e8d8b6a60d217b7797d841b7bb63e807b8718a3635e3c0d2487dc2dc7f71850ebd0c0dfd6009b952da1416631c71dcc9b64a5dbe707cf88f0338c816e2264cc7891585e14e66096122b41824498b4b1097a125e4a12d19ccc9232d7bab655bb6354fdabe7ea1f5486bcdd3a8cbb6e8cfe6b72e6973a9481b9bf3cb70a169f0ebb071d7024b47e9d9966db95aaeac8bd6eaa66386122df74b4b287ac8979efbd35068bb3f6d5bb52302c59f88f6a3df3a1a76b61f759d8fad8b5dce34d91407442b477e0f770e06f3305d0f6992bf5d49a5b678b1a91c2bfc71a4679d9c221da7492a81841f96a04a5068e7ecfb765ff3b8edf0d40edb9b27bb4334c937b2e57f3553889b245bda54c6604e96b196b45e59beb89137373737574c79d18a830a37318a2d29a01569203fec119e4474f98d7bbb186b5c1914116daa0711776e1082ff7327dbf6156c7964da30055bead17e7b1ab4df6edc6f76922b95da7b7f7b1c89710f8661818f53cf32d35a6badc5580a7d4f829b6ce958055a85e4f790aeb33a3cda8f1e47e2745a0cfef3726e457a73bb90f43a1ebf6dc744c371bf575bfd8cb4d0ac7dfcf84fd3d2f9dd0b7447e3cdcdcdeac7767142cb8996939f1d41274590764cf562a3b56e3d7a5e8c999b73cacce1e4703735d3b423e20c9166fc68b9254ae3dc69ec6baf032af37a502d0951f8bd68c3664b94fc9b2ce3848e353ade2415d1d5b8e7193811ba94b988b2ef0573115583843ccff359fda8b4a891589aa6699aa6699aa669358bb0c27ca494158661d68855a9a4aa0b23f1a45fbe26b524244d5559f3a43b16cb7d6b2abdd23f1f1765cbd77ee4a9aa26464193bd64c334955e693f5bbed6831f07ef42a5f9486db559166cf9964e2da54459d53c69aaa9a9542ad5c45853799c94f41445ea8614416df861fcab2a6e9d8c4a536df9aa9cbdc767c52235a1d65abbd0547a2115f7de4ba4c95c1c6dd47f4185ba44fa7dc1457ff85a6c99dc1bb5744ae99c33477a3da4a793b31386e07cfc76d351398c234fb9a380fc31146323d9020c9e0b355c37eab53b186b43a074e6882ef926eb1416a538c6084de9acd5278ad3a68eef11a2920a15e325a3217cd5cba69141ee2a5f01d1a6d623a2275f93eccd1138b67c05444f6298eec35bd75d6f7f3548d3aeb6a4e755515952ca1a145491a841d85a9f950e24c74b628c38e648c22d30c618632dc35a1687887e0cd924d15a29f8c9deb4adb32bcdaeb219f2ed10be3f72c6d7feb084b0cca6588d01314fa3c9bef7a5c9bdcccf90f6104f32688768735fe663de4ad70fac59828142ce282b057922fd49bf10914621fdcc6bdd0c6d1229113449d619f98fba76cd8681cc92d659986ef31490ad1b75584b29256bbe5e00f86f863228003352a0a1abd20cb90070a40700a73f052ee667702fbee3669e8693798e93f1252e463683a62483649074c918ee05a7cd7086f3449d7ecac847592a87f1d09fdf074d8e354f330e9b2697e1a4ca5fd3c4712f663a2f9226fbb6e3d912c7fc4501c65b94aba3b930de07e961fc7d18fa4b4362589f0c922d4bf32810bde6698631fc5e6a6b24ce5133c458eb29a38aa6ab7922d99f5a4c224b7a1f344adb195a1b13d30dd141d35c4461ce77e6b0e63a6652b13fb7481b27c06bdb7f4d93b5334653b487ae288b054e3f01b8985f81eb5e058e1b00890bc0cfe06870f6a457d0b6ffcda16ded04a7cbb52d1d658e09fdcbd9c7f4f57cd2ec68275f4af4dd5323d1d74fc37cd27c3d9f887efa32a264e72c6d34227134fe311f69a04f9a7812b1251faace5c95669748c3fee5664c7af649dcc4c24df6f55cc2b61309b3cb0c33c724e631c7449362be6e3968b22d3fae73256d6e8743f73c31cf7dee68b24e0786fdf9f3a283a2f36f692ee9ef8b6e08d7114121d82998920998e0364ff304f31a57da777f35524a19edfb04025f73c8feb597c7fcfa3ab4eedecfbe5aee0aa9fbab014110a4375b238020086a5e220df9a00f982eceadf34163b10d78079c19903be190b4b159a44d052738c17b573f308866a6e857cb5b2b48793d01b30451c1ad562aa5f9e81c15a28db8f1bb2a253daf081affe7a924b82d42b4a959441b2a5b40419b7b13b6fc68bbaf26c1a20483bd469aa73a1a4b7317e55f6e84718771a7354869ce155947839fc6c7472d3b4091822b58a8acd34c34347443a07cd387172a7b0dc86c265947c49ba6ae344dde9a3e94ba9b05f0b85059979353a97d204431c742d2e6b65aad9c7f58422f182539e79c73ce3967e7b6e058e533ceb2d405922b0021f1168fb35c4a8fff648c71ce39679a475afe12111aefefe77b3ab8b13fdfcd96d1c67cf92335941afa9100067e4ca00243d5d6fb3f524319a752a9ec4a1248f72620da8872c4d2f23d76b9eb318f79cc631ef3985f2974374b76cb71a56441221990ffc630be79490bec01a88a0aa4907a287885de7804473773ce1e7cf30efb4db6e5f0b8ff0a1059ec2f8229209105f6ba924367679a886424ba99a626f4575f334b0fe6bc5b8e49e9cd151f196c47404582ce9b9b9b5a7db496b5d6622c458dc1f045d38f56d2d8f726b653d9b6c8da540c487fcfc513fefb968b3470d7b560802a05b5d65a6badad7fefeac746516b18fa44d7c200d3c8965f8464adb5561d25d0d3078dff3ee5c19dce3485ee658b2d65eb441bd565f66b86ce63591c3644858eaf4aadcf4a0b25a49e305d95ee589b5202c8622c4774a4f147a9b40cc018df0b8424671d73ce39e7f803480daee5780475fc06477a30febb799891cdafe9fcf901649e6262bc0c870dbd483226172d07838bf1233dc9c570ddd6e1dc3992dc4327477a11ccb225ad17528322e38aabba42bd5297fcd4a06aa5b6aa146badb596156d6cbbfef86cf9f507bdbf9ab5e41389c26a75af8ceb8816839c80c70a202ba8d894c63c580848d31c4f190831a538d1093a76a05d281e380ed0e1c23fc0345614863b390be292b3bf5e3aa557e9557a955ea5eb598e66a6da897627baee92134df75772a2e52c451b52ebcd7fcb4010d342a20d1cdc0e74dc41e33755a167909572eb13e9b09af93215934fc057967542a40b789240c50818eaabc991bb183fd0da9683a342836086780a810b111ed1e23c60e1ace8283daf8bdea17db60fc84f13c48648e4dad9e3a7e191edacc35a1779648f9f6e3beece3f371eb8cb37e7584c48d6d21c66e8628ca30bc776b15ad8980dc3275dd854165dc0f02508550cb90b2112a10ed522586badeb75c5e5c211baa9ec8345bdd28221a4400d29b2813178a2c40c27527a9eec001683074a7a60028adbacb0fd6b70c8131eb9bbd7881d638c31c6fe55478c95650272d30f349eabd57fda4d5168f7ae9bb1a2ed6b1267d13dd5bb987b384228e54a2ef12ddc8b54c91f8f499e0c04b36d94b91006e709631c31dd465b8757a1133fbd34c26d2099d8f2e5113f01c1c23df41bb44949891ec20425c9832361cb87e183fe3c8485188761a45184fefcbbf920ad592e3da1473bfb2c8afede87c9e8bd95fda86bd26a659d17653dc85e78d11e461ad2bb84a9941749cf8abfc030ba2e1004881274c618cc41140f1c7c33571623afc5eea9d0c68ac2307451e989992283653069237b7e322f2a2da5f9644459d195d20704bdea45a1e5fe3c0f856cca7b46345d0b15be45dad8cff2cfcbdd0c964206bb2bc85edeffbcec2f77b766ffcb605916f154c1098b36462f3fd3126f682f3fab22665c6256846893bf0e75b1e58b8b8b414d9569e1322abcc6962cccbc6430192946ca6091c615fdb7ab2ee38515facb60ae6c28cb223da98280456d5d05a7493e8c95fe32188988b405ce6071db01a382c130a949ce3e3e736e32586ba5f6f2b519f1148138e4a552c9023fbe682d649e205384d1e6dad81b31780d0c1bc279883f6bcc29c61b6decd7ff64fd196dee57afd65ae98c619b585e8bb36439dc19f100cb888a321890d56ae5e37885639c01a554ca690a6bc5f111c05cb009fb69e271d50d1c5e23a6220d18bee88751d99f5dc5a01a768048afc66456c30e10e945576582cdb5b1592c2b014d6289b04d6c145896615e958835fc876eb01d070c88a6b9a858d876031211c63e38cce0ddd8256ac1e2425ff7876bad3340fa7bbb03046bce9603e3ee04da7647e8d10212b0874e8ea927461a338763ffce851f000b3718865a7f097c4130276796100bb45a352774b6bf1276c2090de3841e65332fd05f8c813e485c10d25f8d0b36d05fcd1e494fba9084fe6a6eb8dd65ace84f576aadcd41e8d4bd37c61bbd6c4fd967a79244138850453010a440653508903609905ba6948234bd8835e4c7e44eff40b7b0cd68aff57e583806491cc1085491db858725e4a363060fbace193ce85b6f464c1c47960b8411fd315422848a02171dc4b518bb20f47308d49f5c10faf6a9ffcf907d34e95dafa45da45174a9d32f95a0c5202900b9f470595283607d6c4c884fdc2dc07c12211cc8eeed61fe7b2111467b2ab4618cef8c2beece3119bd96363c32786659357dd15f74c560df41108b0991dbebed70e40ecc66b72938f52fb7811c5ec35b8ed7fcafc76386952b8ed87e39bc63c8116bc8c79c8e4843e258213d28b1eab215a607b0207c802a52bd5c4125672fd2904c348f62d962eba4237de548d39ec62b0f8a28d193dec5b1c42a51a342c3e6c9778c52f2295bca48d31074dc3c23d42d876bd3aad05f84c954a13f5f5d98cc61ba3faff4446f9fb92f863bffe5be08eebcdafe3273b5a3c94f933b2de3450b5173a8bf08cb4f722b67ef0b908c61589973d2494b11c7d2132ddd84454ffcd6da1660401f733c7896f69ce1f59a5d2c592165c8085c30b95e7aa2edfe4a343e9a53c747136dead1777b8007716ed63aeded7c48d3e5222a4f89bd96d0a15348ad3ea31fdf5b6af59297764df65f5df394751963ed72d520272a2dad6cb82109adb57071efd39929c53f4d4d4a4af410ee1ea3a36244f9a663dbb9db6140099658e1417d8fdf39bbfdd2792f9d35f4fdc31a29d1e200b6fc1754e8eaf87661b773ff7b1c6ddfdf378a7fcf4d07c5fe9fbef75a6be7b6f6a5c51c934cb59aa3236de2085f8b310c0aaaac5582afd8e4b922adc82239543d7a1d7d841955a75182d1060e79e505d658a969933e6e9aa675252b4b45f235346528b9c0f0492b1220632c482d641823de62bc233ca2d70b135dc47a50da1cc58a886414898474d1219e82c2e50a0aa6487aa3d73ad2a8c319399552649004ca3e462b7b66ceb81ca494409186d41ee8d36157ac35d823439c59b9db656b73549a27d7d2850518cea70022082214bd9d8c31a13f87ed68e3326553557e43a6acc0c085f6af4f5fc317e6447b098c3a1a2a019ced472e41f95af5c89e07d8f040ac7d0982395829654d0db2668391869435b2a646d648b0664b296135121cca024a50823eab174459caa852aba439cbb2999db7fc1a6a7c84e7e74f65f0b734f5b91ce4ae3b86536b47404da53f7c56545844429cf564480edee34b3ce548f208c60b4d82d946305e6812ccb6d1407f563553fb3e0c201d6396e9441b71ff20da191311dda069acd10cdcddddc3a2e766ab464d2d3d2b9e82524a4b2ddf7c7a94ca53c31d974bf3d9aa7474621776616baddc7438a1b50b37d0d12d16fdc5f04b388a2fb2a1d29b58bc526b7313241811a55222e0723b11757fd0eea666a866884efaa3561f221f6831888ba5839f233beae0c727db2f2c925a7d7ec614edf5b4036472bf723cd089f7bdf6b8af824ece12ff95c61c6b572b78029105ad055f31ca7385c84a58346441100b919ed46e31c6f2f7ac3215b0f1500c4b15a82145669e5082dabe082e220a148c4301bea28dd9454bf3b18c3927c703edbe58250c776acd41162f9d1f14f011899c27c2a2171d108b2bd65a293c47144d21c21422f84c81a272dbde20902a00110a3f0d969e34c9143c490de709bf772f50cfc7101941a8abc50de8d8c4113f4d1801b41d25b744540d11805822068b732489fd45588f9c24fa8be02bbe7498d01386d246ae96c82d7a543f325685f095a9544aee5a6bad3294b179ba2fc39c694241a6f6e7436ca9234d4de8f99f9461ac280c436b61f47cf971ffff9c5f333f64891ea3b59ecdd8ce1d6d6c31b868d06d384f6ee33f34e455d7575d5f7579d5e55597abbadcca655d205aa57b740ce31fb7b85fc842e81aafba5cd4b3d5bb77f57357d005a594723c74d66a8134ec18471cddbde2fff0fe6ab1c5dd97599c618b010bc41a7cc72fdb8e126f818fe889f10adff9c3120222b560bc6ccbdad60492362b6c29f3f56482334b906db58282828282828482bca020eb414199ed9cc6473684660689d21ee6479f7543665c00eb821a520446092828f68b44222fa8ec7540690fd3b96ad4f9aa8ac7099b58ee6c451bbf2b6ce600369598c19cad20ce59910611d1241fa806bbc9a6d527744c1285a84cf0e307cc56b6ab14fd1567da77dfd7761ee442392c1424a6548122a81524d49aadd9ba1786ce0248a5ea09a2e20384a425b45a7255aaab65579b4fe86d7fde135af3e4d35cefbdf75a4be7f59ed07a7f5ea6659ea99c3810dca4c484dbc008250e336de1d540d3af1b0f1abaedc06f6de63da149486c8fca85593f25adf295b3a4d7f21af2fd070897ce7b319d1508ec5a8c7f58da4aad1e79dc8db84a35b71c4c728de71b7f9398644ed5c72da355c5a2145459a9505a15fac2d41cc4096869aba91cadb6a3a98f77f5b19251691d56243daa9aad63adcf0aa6c8da1868f71b33436840b4e101bd8078c33b0fe03d71441b130047de3b26b6dedc8b811063a4910aa1cf42e9619452cac99d2494db13ad2385a6af4dc383f4dafef8f14feb3128db76ba46874e21b5fa602ff7de7bff0687adf7de7baf0cdef5b015d26296f9dfd410221ac1a468812e98880484044352ab6cc301370db07107f9dedce0584c48fe6109651cd45af1adf8f2008278ca5ebe90d38de9eb5d8c11305163ad5e3dde8f771b6959c6771b6959c65e13748c315eac8d7236aa5a96f1ad3a62955aebb3aa126bc15788ac8445435b403047c8a300cd39698efe216214b0e0055bbe1be17443b4f1c29651f6e00425b815d1a7880e02dd405b91349994fec2fe1cdc824f591ee50ee31c797b6a4fcfec2a117a7a1b7f7de939a8c16b1f67e20d781b5bdbc3ad70342f23b44e8e8391680322b881031f20c2a51cf0822098b3b7fa6109692eaecb5a7bed75776badb536b4a14f4d8de7954a5ab6fa919e57e345b4200912a8214570002107311414ff2235422c014441d1febbb9b7c7cb09f495f1d2ae589655ddddbffa8ffe721a88547610ffd13359b263134c7cf6e73b3601832ddbea591abd77961583774dd995f42c00a868fb3c6215db7696959a272b1383af941830d037e802490f0422fd278017306ce8a9b93dc6292e9afcfd61741fd6fe3a747d02d89f0d6dab7611dc309d776f5b587aeb722bcb1ad5ac851363ad4ba5ffd0f37c7f1174770fda2eb45dcaf6ee5eaa028d3428c5617661adb536c7074d048a7d22323ec61329fdcc570f67473cf90ed1880c29283e66bef44462bc8c2732f3a5f760f61741b9d1f8d320e3633c0da59f799711e36de7a3f4334291ca5697b06aeaaaaaab3c15627c230aca7d979ca7760c9ff11e4b14c62d6e5de52918902f36b415e3eb8a91023092f38c295aee9c73cef663c63737168b98908cb9589a31a6d071db67c2b5ec955ff8a56519cf9971c6b60ae9b959504aafa5d76e38c88fedd7cc10e7bcf6da584c48ad1706442426e82ccbb218ee6442527a36134df267666cf023de819c92a804ce98e5a853330000000400f3140000180c0805830171483c261a2f6b7c14000c657c4a76543819ca834990a4380882206390220010030000042840544256006c329725bd4eafc9c4794687f9476ce61311dd7c09ad449e05fcd37221df7c6fcf279e12dc8aa9296282ba35714db578229f2bdae7dca816aeddfcb13e394ba1dd734b93072e652a70e5480915a04f8e05b57af9fa0cd2238c20f0f814f208580eba18c4154e7ebb15125d00f1826d8f7aa3838004b32b120e26d75eb8bef2b0ca4295cb2cf1119e15db4920a9be607fbe00986f5b84aabb335fc2a4345e7197fa0c4feebda9789206a74d46889e8af5c513b54699af4849f894f239c50c54830ebad2d594c3fd1319462af5a661f6ccb29edecdc9446f5a927e50f16e3fd046156da08954c282f6f43c93b69801e8c4488fcb889e2906deeb976db8acd6cfb331d06a1b6bd6cacd79e126aa371773eb93487300f4bab92ac9a28d217567e34b28d5c107b4221088c3b1b7c3d84062c71f854e4c69e6d98fcae46437e166aed17aa92191a16d87cd1d8eb6619d443a2d58236f3d2f6a57b1038094b16d13b92a823eb0400c4dc1578cfd48f9880d250e53d5fa205728491585a471f1cdce4942d3ab74975d8bdb5f6ac929c9231ce5cc45f90b4811726209a0f518b96bf8db1cf6d1d7e664832e6053c40cc657f81cac3550eb0e9e767cc0055ae4cd54102cf4a193d0fddc04bba0f974f605400f27f723c3320646a5c47f101c7fffd6dae538f907528909501fd81171aab19d41214e4591746e70ada31d8b9b38659ac58785331eab50ddb4d26a1f20536f1b0def006b4617cc5e854feb80deb337b34fc8b2ed4b6ad4ea347b9530bb79135d7232877d1a7af24a9d3c20e840e476c0f5124d278449c3902061db8f9d8136d74e2c71e72d73f7ff5c08ea2651c11f8377fcee45110ad8d958ed479e540948ae6d9babaab4166c961a4991328f69623c2a223b6757e7963d54e119a36f0943ec9c9665f8b4ebe6a432843004012b8497b8dc7316d132ac9a9621841fc4350c38738753cbb0b711979b363e9f2ac4e50ee11e79bec9e1dd320d690543e3ddaef55ac0f9e965af132d93b7a94d9a7bc9f01e9b7b329f5a376587c412128719e2e0cf776165cb8e555ccadb09e840ac632ad4905988dc5cbd2c6cc8cc238e8da4f44f1c90d928631ccb3c976d70a661668481e44bf5d25715a8d663971bda4bb2104bc80547b4cc908197132957e08138e961bb83cf5ff7b018edfbfa334d809e49c9a0529f2e78369c7174ea2e12157e0c705394ac90e5c99a8319c0c2f4ae4e3ed6bfcd4b5c951e9a77754bc3039e364d5cfdec860a53842b8a69abcf954fd07d21190a5c0dddb9e00d136a81a15e0d5b55025884ecf59a9a875bdc6b57227237a3611f2eba88bbed524701b4c3f769f3706b473b208c5b13023c5cc6971e6e6aeef1872ed34ea44b1cf24b2b3a499b74b8d1d87ee2c30c171341a8df5397649e84eb36e001e3ccf5988aa98da90e097cd09dbfc01382ab0649f0dd2fdec68d6a4e20b8175429cd17e67bc903f7dd914a5823d9d5b21b90c8f369599f0e3d66c6c34062de645d305341e8f1fad296cc89e130132d27ad7ced09b87469f363dae6442c9eedd250f46259c255d2198d7d69f3dce260fdd0619afd7164f9c3eaf89ab9cad076f09a1b08126861ff608267344b39106efaf38a4b5e02083d71b77ae6e9e1009425cc9ea72030d15d625f615a241ead1ae8aec192d4f0bbb23f072f5cda3464b5f6a2201ca4bd134dc373e4f56ee2e1f98e1bd7d293f550873bf9926f8f221c8488a748d3bc3381bf20f9084266841a4baba1e1418a78453d5b9596a2db78da859b2abc5d52727dd3ef3e3ed0c0771bac60f295b699450ff57c596e88185152180a6865b45d81eaa9152034295afe09cf6c50e1ff4640646a1124344eab3176d7dff5ecc56b66664f20ffed3e62186706a727784d8c815ccf29b4a15860df6afbea725bdc10e492a7f59f2f239d4182f29f2e8fcff07825049df9725e865ed97954c1772710d01636c97eb9b8118e29a0e90ce49e602df8d1d3243633ad7b29165b2abce428dd1a12ea07a380d0f021d374f010a96cdc65b5450c03ab3f37f38e6fecfbd2be0b3dfbee212251c2ce4122aa7acaeb6c40328e5f92e5a7a9c8452f2abff72cb662bb56fe006aa4694bc9a3e06e2c64e90f42499e130084f432a1b3eaa56fa1a1404865f04086b28743120fddd3a7bba3008c818cf89575984df2c063a632725f7469a45d9f86415c64364230ac0105f16304a48bd78e1f6018e439b21e4d73cafe596c381032fa3a168da7248759addddf01405e37c46a60afa4a06c503d0166a3103ddca320632f0b0d3f6a256d179b7dad605407eae8408c063f699bc9d2c485e5d16f4504ea23c7325716170f7deda07eb09b13e53dfc17092415d0b376342f55a99f210842572be87c6436aeabe94cf9eb59295c995de11db00cf6c6af00f439bfc97cd317d0707b5ad77a29e2cea1031b6599722daffc2d608f11f38a0fb452935ccc45b3e8a282c618e071fd152709e079563adbeb7b235730fc56b415ac8f53cceeae53d43508b056cb38cf8767092506c2f9c7b76d2f75033a91ed1c381af40ff4111c8a56aaa5e9a1a4e70cd5230e84c88da4de8dec43ffb2627ffd2a0a08e198fb0077cc3b78063558bc3879390790cfc6fee8a71126695afe97a03afd395a7301c7d792e26882263dd3c26dcf717c7bcccda34d328d2947e4ac2a7650c589a1e264a8e934c85f7b82598e93d7760f05927c1d1ba57a73d56ffec33e97d9f8fd1447d27216ae115a722ad3fdc4368eedabc9dc40d926d710742f806cfbb6468ad74a72a6840e2e5fff9664a2b6a45c21a920285d2a50a14867da831e6ddaecfdb30b80851a05b0ac6dc02a1fd05bdb3b7cd27e9b8a7a75d3f65cf9bd5180c1645ac0e774ab5188c54527bd7762224be0b9ac25835b91ded68c42c954af939920ee7bfeb551889acf1bce280f9e0aeb25db822d25b4d68f8a8b53dc3a5d9a4aea6641ff2287eb5369673d442ef88396a8af99e93bbcb244a1d039acf5c826981de821fc6aea3b8a67a53f6dac5901a6f28363905dba3c949604ed7236a3644a9b6d1017eb1cd8e941c86abca2d1136fc821a41954d0d87d335449ecff67ec623fb9c029f53f32f3be2d11360e633f706d2748a607f485e09e49feecd9b387bae6a92476177de7c97c7132ef3c69324de075c9dd9b142f2282e4f3498dc8b5fc493174950abd0524f74c1ade4b5e0a8a5bc6294e847c82d5b60a13279663708bfeb6f3a429086df4d9c13f4725b0bfd9196f775df4c6c72a7383e4d3b9d0e13d4e0a704af5571a52e8ad52c589fe7e168b567059b2360bd1c0b8cdf32d6776e5476e838e0ff0532eb337698be3de055887b4fe0135909a6cc3a37ecde764abc9770855866792ba91266219cf00dec127a88f34460088d903ee41fa62c7e78d0257fde0345a11fd5488581550adc0e3f2b3d51376b0200476b0d9a9e2de14b9f0f500016552d07028b0aaea8010e2341bb027c5d4115515df827059812ae8f429a8459aa92ba084fb0286b73d4f08c42b54d3a06fee2e7c0e20fb8f6233f46a6599907549abf1e2d46620c6c472b7024d0f101ddf1f9d937311e523184d2f0c9311129572099bfd5c524a34dfb77abfba45b8c459f98d239ff8379f318db86326c12e279f8e14fe439a39b8a6dd69361d1757715fcd744fd822ebef2f6c40764589ef029db83e336a538cd5ae5115d0c5b3123da7cd88f128eab42de9428920172dbf7b674f3358cfe3eff148a66146541ff940a1691478990c0a61ea228fc84a9414e0a5137657899fe640308f21b664f15ec30f0a32efc7962da7480bc98af614d93c1296ac7b1ac0b31bb023516b75c0ecd05cf883a5078e04c7f85fd243902072b81068fd06a611346c242e29cf47a82d61201d52c7474f49d725b3840a3cb0b23996fdfe6fbffa6dbfd72e49e32ff39120d2524d580ae5e7ba4e3d965f3ba3cb2fb6da0cc6ef36e27d272a01feedf772784e226cd4710bb89057f939c5883ef683f37e19d3cd4f0699039a78cafab59e444190f1fb27ea65e435f0118b0b966dcf06d0305bb8686148299b7583169e096826058c52e9bb3894d71c2abfa4908627feaae5cca99c969c84c991ea196664258bb2b66738d740b8ab9acdbe4ce64f4095fbc56f19278b3028065447f6654e2b755c7db12dfa602384ef5fdb9dc730dc1089552115b44382c2cce240b7bb0fa040b492b4568f9a615e306dfcff884e34ab7d253896b31b0a77e368eb5010467446f5f90dceddef12090daa89b87b05227b35898861fffc2a76dfbd41612a8b6589148890c3c09f60a65118f53436c008d17544dac7200e02d358745a42ee97295cb9ffcd8a16e260c71faa9ee15af6d5154cb476459cda72fa8472f6de8569e612a191cccaa30e13e93c9164e13c5981fa78704ae3055af0e5a279326c60de2f2259a5703db4913a213a46a86093b138110e2512ac71f9bdc7f62c0312ff1934c9f020a3637e71cadfcf0d4f87e326a0fa12cfd6bcc6f3c68d3dbbf8431cac487a98ff4ea16bb49797060b28bb921c6c37ccef53742165da7295168ec3bb017a48b5af106f3dec998e2078a6443532e22dd612337a1e68b981016b43928c8f7b0943df4e6e4844d351a7c9cddef5ad4ecf7821e082b0c4fa581fba7c2f31317d511f4736427bee828f89a5be1f39255ee5dfffdec75cc21529f94088ef0a216ff068194d314057047b9c96f41b2dd030eeeb941f4b621d893b4dde927982b7f346135f33c7c6087834e33829c710c46c1f95e916a15326472a55afa8daa46451a41cdb349c36f552963d8303273a8d05c82b3acc087b310aabfd214b18a698a5c59346bb30d95b10104fe3ac7957858b66a70699f21246393118c0767fbccb86a65505f24905aba433b1d56f91e4e9df4aae3d62eab3f77cf1ce709aa23aa07c4813d48df9c21e47cd9505a34afc9e18da98a2a0d2275d40bd5b72373036440f983a11ce43253d6253a3cea077d23030a00a9546c7dd21789d9511cb1cfc961abb2c417ee0b22e0bd76742967fec334a5d59450595b6760ca482c7a916451749d0035f0f0db8c1a712805d0a31db3c884d58d706ab83f98b76a3a79fe4a193e8d12d20677ffae242294960dfdc53d1a782d6432942033fbcdca4734e6df5bef4e0c7f21c6756b172cddddca64e742b51827428545427d5b8e57990b390fe42a1253130738df5b8343cf7d69a40ed0107d9592747e15b5e93f6dc03db210bd7f554e4f089452c58a45e8c7d94004bb10ebc67330ebc9e0f404616dc468a998564f199572026ca19ecf524000dda488672c023402568168119ccb780019625ad5983e8e69327353830c2c348c742fa7bd2a8265978c4616007b498a25a52693923bf4c888d80629566ea648041befbcd5b4b7a3eff63bf0f84b696c41da5d3bc97f55993b6bb8fa70e8cf5efd81a62571c79a6030f2ff409081668adea2fb1d70383902e183d81d22354a7cee062f5d47fbe941b1e86b3498303191e7033272743a10e3be4d47a99b3a207b342c00b4093f9f3b4f7e218f935bfbd8f59897f99630ab3712ecad127687df435d04270778e2bdd62363735618cbb09d364f69360f0334431d2fd9ac8e35d919788907b915c3263b947a760e75c3d800c06b1dda2d777c917405b0f62b4be2708f7e39316ce4ddf809a96948ff20df4221a4e65bfb00f894c787cf3d34637dd43cd55e42f06dc4f48438e1294cf52a26dd9c5e55b838d1c697f449be7eb91dac120efae1db48198237617e7c72d2b390a34cda96525fff44524f30d2099b7b616bc307d117780798105d292c2052b13ab1d61857450ee5fb77df447652eaca40152b299b83a3b4ca5d090c79d728c1f2ceb414b8778ba3abd8efe08b72dadf3b57c65f15195f995be764d7a64be92ef012dc1e62b23e885d373b4f2d0a457d7fcf83848059f32a4de52b247300787dfd2dc78005f6f65bbb2d35f0363e7095de68860c1a4733c5eb6b5fdd869287a99792092515649bd39ba0b6e6510912e4fcf4ab8ed4dfb786c344bff65a4113f9ebe49a3b800494e30d30575eed536a711ce04ed05f48d4b8d24c9ae93aad136828e90bff4daee52412fa35ff1a6d316c95936c90c79eb597a23ed2fca84206db3460657ec4e18850ccd3a6b12d5484017bccad91eb0d0e47477fe3e95defb43d5a3cf7000063dd88141c88e53596c73cb5acf0fa2e6d9686003d4453b5bc5facf2bb1e52bf37f6ad3bb29ca00256dcc0a9f5f458e4281482549fc358eb0034c85a28be75619d4fed60ea5b73ddd37769deac60243f0768738870afd4a1d1d07e2638b217bf3c00b7ab41e5f841854cdf8647993e2c879ae318ba00733000d7875051285561997da6ee48ca002be5734284dae74d105f38316a4538c4256316a9e017f1500af3fa61c3a1c3b8e698769bd9ccd1dec1e745b718867f7aa020c7a555335f4640aa129e59857c539e326fe3c5965e20f0575150bde2d5494f912f7fca240c18d3ea8bc5a92c0a3999f1a6608ba4a4ae9e4185fabc37c2f5b18e8da1d95657c7962c4651c79ff164112051fb885cd3f2b640350d242232380b366b496c807fc08b5dc789e363a0bd10331f73c67ef58cc3ccd5facdf5c4e92f11e93cdfbbbe76e3b2c16768a69a77c790cb1d14118ebbab49128a278c83dbd923002a24c73cd0e398085029b34d8030555c466fd81899c37443c58f009a97411af7c697eb0657620148059bec51e45534389b5ff45c398bee514b6ff5c6f56b96c94ab683a6124c42796347178d57b89e5579d864686157eb3b83ea7d598eb01e7851797d0e91a782bbbe2cf8374278143a78cfa556e1612d5cbca870bc3017540124ad8db557bca3c63068b996859bb37ecb50f51d6483a5cba2f79af592f0c5cc320555959ca5a920269032a2bd565b01ab0c9d7e6c62ae0387f02169954c17ac50c07565aabec1d599bc864085ee83df0f2a13c14879509b4eb66a87661976588b880d712c742ca9c27ae8bf91e2aa32e623dc56cb3a24c1ab0fa4257e20387b17ac8794e7b6588de2206074217e2c7dc837c45d9b022704f0f3022f091025e2ec7d90e0809520dd647b997040461df0bbae69f26e247844f6c80f04242f24f3fbc700d87838eaaed35556b0754b35a1e7c68640eb99b1bc9da003a027d4308dc3a1222ba64d9f5879a5ca4acd08776e47de76a2024428acf24fc858deca16c1a295852974b7aa51752cfff55a94c905904b44d0b11a5bc7796769c4b79fc2faaf3cfc2f33f22be00ed116a589af609f1970f4c501d369d525588f265188283503f07862c05ffbe4ede30f01f18013be03dd9aedc3ac590cff4c37c5a284c01f8d72262646bc46e38d612a526af509166e2e69e73aeae68fb960c52ac92bbbd884be7dbbe33077908f4073c232e9542967a8581eb90dc19a5a91808af7befbabb0bd97eddea155109de5e522b86d31627c88dea0c6bb78289202ebd1b7e8614e4f6337b551a33f25b4fb3a64be0aaac9c68ef66b4ec97c1cc3da6f14b453816c1970cb1e966867c9e0ebd1d44df9f089b33f56cb5b2c0092ecf30901ab1f994fbcc623548e0f17cac578b758beba1388488df5d28bd192b0901ff6ed9ae72422b14df347780689620e950da1b6087040a90574c393ad64bbdb923c16fd7e6f12acf238a75ba5e750a2c6c06c17f7bccfce268a50b48b76c0f906c5016cf990975810ad7878edbe361394163c9067312c6a244767ec47e406df021472a919304e880c49bda75074fcc09f5d37a68d051a5ce2ae550eef1982f08066abb1b1462280f22c4765a95af5dd114ca9065413c612843a54fcc4127c3c022db656f2eca2b08c6ce33c8f6394e05a73cb64f11d9ae4590c776bda8d73bafbd3026747a803d361ca49dcbc9578a49d99a0d15e6c8aaadc6329b0f6b1ad46eafc4d6ff38fc0ee96217a2fa9b5fca734da7c494e8aed08d54b8009df4a7df665e0041adec02954ae0416e60dbfdea07fa0915126ffac8073a2eb44093016b792c23da7b5def930daf2f4d0ad6adec7e4dcdf3ddfaf3c08de5182eed9d3e6be35acbb7a5f243899dfc40c73696893219d8de34e56c96cff3578491fe9585977f871d6afc0a87ffcbeb5610097db4fff5ef9aa2df1d92c4ce5314b3e7d30710b46b98dd85922fcab52132a981af87b20b1b11d916fc112f901bc43cdaebc8b56e160d00fd2e491b896298e71f1f6589311baa1d82c1bc69243e7a38f2398cf84249d61ec6b790f8f36b157dc9f78ac296458d5fca03c2c5e127664678be4577122242358b90de94804991026e257358c85f59a63e6e574f3d28ea166a84872f0da8beca9b05b5ee655f99900e60b8a621165d7ddf956e29dcb864c280199b981709ecb9652bc932f5a75a057bab5b62038bfaf512c7836b04d140e0ff3b47d55e436a9019271509182b6915390d09ede96442e9771c9a4b0d2729f97a715fa46073b982d25d9f452838143be96ad7bd2744b94044a66e2c35b14bc2daeadc9d9015acb487668d3d707b96aa14aad66387f8d6cf5a027fff438c3b5663a02bfedbd0817610edb748c886ac0ff0e23b5ad7c917cf389b3088c3f5f134d00f61986f591d31167805b6c3e8751471742717dcf04b6929c3f82fe91fdd539aa9f6d2b5edb353208107534e01497e87615fd3529c540733e7077c32dc78db6fb285424e5d5fe7d2261b420418f02af1a5f92b1d840cb4b4bbf13d2f8944b6a5a0c420beb1ce2ec7988a7090e9a03ad5e3c273ecc889707c84afd5d9b849170f6a3cf01566c3309f8195e869487bda58f200adc3badf85c32f740c8544dac5dc8194c2581c1550363babc0d5b3767dd7ec5ef1a4de8a344275da7676841c728a73b84ae96feb68063bee169fc0c5d017c31220185bbaa32ae59ae3a92d0eb74b9ddd6a2371caa93b3e8c561ee4b069530bbfffbe93213b4d1ef8fb00511b811dff70cd168ee00e68f7f9f3d6eaf7bb9a11d128b16e8df0cfa1a04ef11816cc120dade9739c14c6d66520005822bb1b8f2493b19cfb95a8a37b8f1c7426b79406a2df200d4194a11fc7f1132bde41c62f3adb74951ee7cf493070cde1a6dcbc3d85aa377c7cccdb59483b214f56569bd89140d6fd7111d220b101ee989aa8f6e523f414371de38614f8d07dfa50f9ac9e7899fcf7a87f393f050e1293b422de5fe9c40f231159903e382a1a8c875979495026bb4f2693260e9c9283a9903592ac833b9f739bfdae68745998770c0217bc308a175db573525c2cda576447c0e9b2eaac5aa5aa2404af69189d508ee9355c266dc0b83b4cca9f30b881c2b0996dea87215756e0f50606eaa9dcf61f2b1e8794645c21c49500189665f1146db34ae33acf99b0e98ec4f7cd2fc49c772afe409bbe5e5e7951153b9e933d1bff346e5806cd464be5dfb84388fd1832cd8a7a08bfb55a6422d2fb24f360929bbf695b63d40b750d52778371a35735d3f79b77109c628db94ebb5b39bf7552aae299c8b1a66bc7612ce8f2fea4e0d3b2f5003e12f95ec130138ac8327945c3dafc0cfcb19d2a439624dab49f211e06870d829d896cf7c922152283494cd13e786d0947f955f8ae7ed6e26e659ce60a9594f74becd1505955d140eb7b3f7c1614dadd0f618af8e1cbaec35387271a76ea32ea086f2087f276c5833b761411ef53d237476b9a49e7144551791435602ccef562a97040bd6acd5980248e04698423094dafa7d7503b9b37b0c7c391c05e2890d1d41bbcf3351da9a67605cfa54e10c3b895c990ead14d409d52bd70c07cb7be6159aaca5feb7b242bd0ea916a6b0fc13c52ff242ed6a9ac43f6efd0540fd1af57d68587894d8a2bd8614ab60f86abaaa5b2ac501b67bcb3ec201cd0561499289ff43ea8ba8e226b8aa45ec39184a5ad2f0b122f22adcf6b499790bacebd5d20a3ef1e73248de57b888643cfbfb62e1407610053c91291adcece7c637a78ba8a7b906eb8a05db1688dcbff23dbc452920a974fff38edccdc5adadfa29929ad4ea551a9d74eccd32b19104b4bdec344a3ce14adf3ed9ceba30b032e70149b24d0c80635a7283e844acc208f2f24ed7ff5170ece65bd9e421997780cb1be890ede45559701175168bf0aef52676c130d598a0a9a8c1c4df078a7f6c3ea5928257390c6863fd418582833070cce14ab54293969ab733a7c8e0a5b8a3458454d34dee00ad4f79ee7ce84f6f9448d713706cde2b4ce8675b9985162b9d684d3622abdce6d8d9791cdf7f1329cf9cedd9a4c36df1dcdeb47d5bc91744876acefe0b44be9df7cb0fa429c450f0a37431e6077ff999fca5547e2a4dd0f7444ed1e9f4565b801747c84b6d8c95bc1510ec9a296f32b575bc1eff1499666b0749bd98de672350ed5e48aa0153dccc9e701b48a0efa3a6702cafee83956a08cbbc942a24866780021dfce87fc9e1dafbb9d6a64c8c3bfec9d35dabbc64a42d2cc55fcb2f7fdf9882bc046aa647bb7576275ac877657efd565574e436c5c7abfc1a4de63fae3f4a12d9a11cc824ba577ca7f08777b4e266916fef16e1d17f70cde063eeff1282952533889bfdf383d7472423222e685e3fc4e945f7d1416afe6ce9b47ba79ca0bb9eb640d6c0e9b77a219e65ea3bfcdfe19a748089d43dcd98518af565bac02438f118da249f402f9b39519546d70a6a3b49f2d7c28f9bdfe50c665d6cf75c12c11e066123d10432590a741667ce1542ac25f938dcacd522b242e5821f2cbae5adac70ba6d06e3010960598ce5c428a60266bc8ec1b2d62c4fa859c930a3474cba2565b514d8af5bb9fcd19377e2b2d68a75f8b5e6c84c5ca16b2c51f961938a6ea26261d6efc49c72e41abbe41b02beb52c95bbd52438f0e041415f58dd6000ccb668d03c426c744f2d3f4ddefd5091bf56473166328a9f1cda2d3409b74a23c7df5151c15840e36ad5ff3fa27f8d983ae7bc4b37a019c64cb2ee73e396a8dc7eb7ac7dd03ae7c9a342d298ae192343df4c168774983988034f6275e5b18c29421fed0b54c4920714bdc4bfa74f17b880bf06336f134a21eda48adb165d2f7ab262936070db0e591ac69d2d7589274ac555bad5cc4106a59ab998b7fcb72fcf74c11953a84850f4537113eb5adf4a5aa9ea9e6e1959a9db9bc5c96be060c50dd8c971dc034d10b38fbd49ec53d73d94e623999d4c2907d5ba564dcd9f14ad91fc700f0435c2c8998745cff97e35334cd9632e47ec9231cb62839efb0ef46124f14ee303ff9cb5ec9dfd66444adcf2ba14f0250c67c26646ada42a5ce1e2ad8c5cef6224bc33e1cb01bfbd5f490a105b6711f2f5c8783582914f1266b026c1cd5f61b222ef8060f5fcb80c79895895b807bd6c869553fe30569199b1373957631fd97b321e22bf379a07e62021add7299640ca8e5feeab0a7de25269877780ce323006c542ca16f10ad502c927890146bcaf699299acc07cc759e86b676eaee54fafad1a1cdc1d5b2a3149230393c653ed2d2173161f29724ae9da8d78c653e3db0c582bdbaa8418199cfe291996f38ea9eab8c0bbaa796e6663e870106c31696bd1dd6075685326ccda21a6ef6d424804bbd9b6eb41fafedd4301338c852f55a70601b20b585a5c668ed6917c6f3d2a29286a4f8ea3d5a01faeca4d51042c4505435a92a6d7c3be623f04a48fd169131cc9480474cdb0064bf394e96943a5d53611a7a46b37ad8d2aa91b4237424872fab400d1f420899d3b47b7f626ca9f33c842eff6523679c4f9a6a2a8f3c0a1952ee9475fb978d25c2c253a9c297037270839da98ec33256460c90d251c53bdd15356816ba183071ea6b149a0a737b73f8c98ec98902d77c3c1ce04215d2e296c8bb421e3eed3aa09ef512ac2c6baeef01d95f5e9fc813be2d0ca54c5f8792168f03af4f5a42dcfaa2b46905b2a4285a93a6882c5485f547fdffabe0060628d38bbb89cb15bbc1eceac48193388db34964ced82ea0a62ae4d6b226ed11e30636dfc366debfc97b6da455ea39509ed44d3de86e076a2adc4e3736307b32b593111c80d390c24d9f2cb4225aada423258d8087210728999d0d9d9808653fe42b5526866754ca3939fa6bcace89181536f1061a186ded668dcb2a391d5041e17284245c552435403f2ee5a5b00a2bd713abb13fb699d76947b4ee7905c07dc813315468e06eb855ce80f4591a4b5c61b8be4eafa01b7dab89b404afd7fc601f86ce4e8ae53cafca477e93a36e5c47afc7fe0e1884d1939015be85f06d6a529adaffc3ee991a758a13208edddfec4c7deca8a5541c90106bfc5c3f4200863e541b3f62d74fa6ceae6e72dadc8e306a8572c640c2065298fdbb24aa831d1cfa1786efd62cc42648b400d6560823b948619a7f03f3b22c9f04ae766c35b33b570ef33060a36bcf1aca0efdf3afec6b3e7b8305867c2313d8d40acab2eef5caa5ac0ae4ee8a8ec633f00e2790f37eb36a45554435399eb5d2a5b064f0f33ab7b4915acd2fe0a89c8ce29e92b1810d4c489fbea0da523a46749f211cf5b0a922d6df384f491549df7cd659376aaaba17695eb8a26a29b1adb87f92e05255747d00b3264d7c9d4e6faf697c7a980512b79324ee371acf729a466f4481ed34b8db236bb1e1615429b0421831b80286ea40308a899696cadacad98ab59d43a826b3318a34ddbabd1ba337a8bb41ce7aac5e86de571d87e1c91290bad4aa7e5d034e025978ae14de45f7c1aa9f8d13b836dbd3b8757ba8887d30f9953229644c8dd154ef7bba045aafa72c5f1985949175d040c18912c7d9321dcd4bd204442979bc8748c200be23048798a505cff4ad10f0bb6d860a57e31e73077cb4f4d1d9413c398ac286f14180a17701c1a17b1953c7e5b92fbe0b216c482af12b8bab4905db3aad22908b40abc13c567a4fd89465c85d777ef862b1846307750791d7bf85b4904ef84f60d0468b0bb6daf8a462114ed4efc507f8788530f95d5fd8b36e86d4518794ad09c2a8afd7eec28bcec02a99fb5155cf3d1bb0b1ace063f28dba9e402bd2fe2596d562c882fbfc2b7f761a07e45746ae6461ffeedf956c29c4facf2bad69e4c88946f01b6623d6b0650ae01bd8de54945ee626c583980d6ebf71552019362031122a6ff5825b497636b31374ece3dbd42cd51979e5ee2a2fe8e67d2c598a3f23849c641c0f73b0641d4d2c92f5cd022b9900d1ea229397cd3e740e44d8770430dd6b0d25c5192e49c5b62876f7864787031bc4f205946e9c255d91de3ef42e96dc6d35675222537e7d3a0f3ff52644dcd94f992b56110dc8c35e645a46da001d75baad411e05fc4a0bc201f5cae0b4b8f5b7474efed4c9f6b0675aa161e362225add85e6ad5a054891df5beea98794dee606c029a937b84aa77ea8e37139eb152b99db73697e3af58a1cc6be18949e514097452c6a756d1474c2c6a5278795d4d79397972cb972b366a9dac2d5eebc4610359317a74048553be44462c1d494c3d423c07ea9c98e489d02a64e1753a36fd18c93f343d8685c92550ec021b8315887c50dc1a07a8a1b014c052360f57013a4765434661648e8560730881094fa6179593bc8c065d38f4a6fba3398e10acba88bc2a9525ed8aae6ce013b3091970e89cdc47ccc93622a007e2bc00db2838d101afad7c74a63364bbf9a0dae24d2bfbe812ca3b7903b79f306ef8b41707feb22aa920cfd334a286f35b021bff924faa519780cb4024f4bb8d448631190b05814c6cf0850d000a354c929ba6e75f997728c6755d310e64616f15e1dcb2a8c2ecd54dfe06a6d71b746fffe72a03dda662142d8fca5b131ceb9ed2f3d977058c01875e8cf007a0cca55038bd8184d2b6b225435c6adccf8027c8b73c0945d960a4dfd122de7ad5aa617f9a5d12315f7140b8cf9f141f769f200503ebc30df5fe8d595678c592187c6daaa8893bb603d47a710e50d4f3b2d137ded2b8d36be5d84acd7f334cec49e1961d4500711f475e7ea740e76ce7e26b8e3675e0b8c98e11a7785146a20117f7704cddff628a8a1ce737f5bfc3879476b109fcd490af0b4807dcbe6fd21732c545f666c18b64ed2a91f148334d4640f62708f3790a113ed641b9385243ae87c89fc68beea0fb240fcc5e608dde5242393a5dcd3e12eca74499509b14492618428c9402595cf93e311c97e9420e557104af13307c15107cab14afd8f363d19bbcf3b19edb84c2ad0067bf6c243ef630caa9565926d1669606b7c67438904f679c3b88c036278e1d8ea0e87715d3ec0674304c1a40acd75478ded3f598c06db26292cf9723af457958a47dd87ff01f0c9a3cf2b3ce3a09d71814c3c40e24c430f8d54b5d78776a97f053887b2fe5591ef1d0f430fcdeb370fc5ce099f687bec093d5452b2784dc0f9ac47c3394a12e51e196bcff26810306398bd4ce46b257c48b583fe0e60fa3b25926854c7ee2892c04a3832b56f593ca8de06a63a6da5d6e0b5b5839b50752234369d88d4c0422397f4284762f55c27ef616d23bb6d60a83a84a1a2c3ce491b13d7ebbb07be40c7047b8658666a825130f4d80e62a1641b57f9d05b489cb1b2bc8274dd6ce6eb6cbd55be7795cd40eb20934dcf40ba408c818a74ec58637ab6e5ea5699089511cb94e48dca449abbc7e793cc18e63291247e1f11b4f7211fd66232bfb3b288d239f86f9b879c2732119db738a4f5a24b004b536afdeb65c481758ee5a7b3ce414790aaf084c3ef1bb7490935e08d39dcff4ba2f4cb262555fc7232228bd73ad8b487cd511faa2aa2b761aca732bfc4c91f7d47c88032b2f9c0953467895c4af106b6e9925c810a50d2c9e57f0b44dc0d3d4eee7779b22a140d48b6689761491ed0b990f832412671fe183cf342bc132fa020a92f89bcf9b7205918199d0d16fecf0d0d1fe1795650a6484252977c64ca0facade113ca59c14769565c89cdbbe79f7d4476c3a31e40fab04665bde392ccc1f1bdb2ff39114dc0336809d35d52e15e31523cd75c28ca3d19e32e460613c8bccdbee1a91f3763977217b2a85e9126c812f12e09d8458f7febe799fe4a20940625addd6b5f3585d1a3e089aca4da0cc32d93d8f3c2a4614d107725027da573afe5ab7a42d672d3049d9e27f4f9538356ca6eb0187044a1efcd84e36cce25fbffe6e2f32643624cbfcc4e58c9686d11ed010d4c80d7ae91d2635029a0accac9768fbf6e92ac461aeff8427d180e51f8cfa13044cfc005f7db16bd39d3998e234ccefb985cb464184b87ddf797b5899911a5f26dd43e5263aa20b570b12a65beeebe3d26738da123945a0bd15cd30e2c0be48e175b6a55492878ca3c4928968d22151d6681cc2b10498227b7c6607d2934edd6346c34216c62b12ab517c87995fb4ab23614a3352362d4a150e2590de05ea752692a70fedc71e3fc670b875194e080fd4504af1a77afbe3e31766a3b1cae380b32a30b49ddbfa846c9f20b8a14d68f84250a7d0a3f966826b580507d6ad884a6f28e980c5cb859f9191aebb94846ffd73f116b44cf74d065ff323f0c74d6a3a12144ff5f9a955afeacefd19f4c2b971d0c79eb614b300a859ac5bf634759685e404a525c921a07346517814153e841e3c5ef373770725d278a92ff32580fb8d6a65564fd482471e374390fe3ba8ab8aa4946916a655fa78e426e359b31de093da44986bb1be7f8af754521f7bf979f09cfc4737989d04f01378cee496fcecbf3b69105ecb03f86809f16c0e2045c4750941419b97d9e0bbda38af4ba088e822bef5c9f2b5f96944a9b82beff2c5cfbff45c9e9562b0ed4f4dc137a4acf5591a71b2a29f6f8d43c51a5df74e3d400d752514fdc42da152d968838738fee54419faf7aca6e624e4116a4342fc082544c5ca9f3b9d507cfea0f7042b4621c5538e6f851d240360fd73663bc5e551ee367303685e0a66a21443c4bdafa5891598bb4f59718f20144c5effa60181908cb8741d39e969396a79518efd31eba6664c68bba1e1b87c04c60210c5a727f09b655532276e959931a7b4bdd4b3980b93649d3b004df3b1a8bd9c143460a7d519bc8ad066ab564bc312805325c8044d37a704dd2b14ca97072baa80259855c1ef13014adf9751a3d1da565a337a66993340b1d9bde0ff1930f51e1465a4439ecc67cb423accd03e7cfbf32e862d1adabde06a9686b6ef098cd120d6df1d97c710e076c41e20d729e0df5eed013aa0371cccd66e33ba2092c3c0acca4405d6e38067e50f4e1e4c614455a19f147094116f3a93a4c8ab9730ee7c669d3d585bc69ac20fe7fb309b1fa00cf9a95fe4d52de6dd84f65f880d9bfad495269721c59c16d08742e35e9713568594732b26d2c891b359e7b09ec2d1941405deac5fb7faccc7e694a29344f848320ad46c425b7ff2d613fe197a7180912b5b75a1ea2f4d6d7d69da28affcf8485a78eb1d63247ed5931a7934c78ef32c82cbf1d1e60c12f5ba8b3f1a09da752e8be1453765d7ceee544fed08b74ef54c52444363a6b1ce6485ec0b5087a40d002f4809b85d454096e49a24a945c285af7e7e14921201119535989cf93cd04c3f0d67f3ac584135c10088e66c121aa40f1a0741367537b019c5a187b9197f5f06458dbfe26894ea62a19dab4ae9be3a55311e11a3ee53b2c563e83bdc23ff05ad48ffe4764a033633afea13ed3d9b824825865521a6eecb046d3639b5bc49b0578340d7cb5a6113f716c2fa2e273947b1566d0a7170de60421ca56654ef1794c03197b8c884acb82512b366151db5b4de75320ffd6edb41aea1f43da7ccf58f3393ac8a2a2233d950a6c82a30d8a0763140c06d4b6d70ee37b493231355cbeb30ecc2ff43424923ee4f8b3bbb46efe8496505898ba07cb598d18fb59dbb4b46719af1bfcc7ea474dbac6bbc1ebb2507a2871c10485b6c70968e56f1c8395b0b60d0ad22b6127708695ff87ca14396452f7ae7a097aec8896c381e4bc811b6c7eaaf1e25700c699737d34951cf6c68547d7fbbc94775b6f2c1ed791ecb6c692d7df811010902f06e50b9709594677fd0d435d0ab903dc2078047442d61dbeeedf34fb04971a944b00ad259fc705faa4549c2d1ae7b5b84f3da41b42b2adf0d8d72fc8d7bd1b083b7234642dd00c79afa1e503cd351f06abf4ed24de84b54c7dc7c793687d98963d75515cccd20d44a51dabebd303afcba44c0d5595e0c98a7ede19c5620398cbede282c674f664b87532d51ace018289b2977d1d0c8e33560e4807f7787c9e11b35bfaacab00b6e6c3074cebb65780c1f8fc9ea934070395a2868d27f3ef5185b32950e936cd3004f1b364184a628fb37e040b01fafd8f301055dc843a3a21ebcabce7b5f951e1bd24a0f5076dcbd3f10438f1e3693d30513d826a0fb1f16cde2cc78f278e0f809967d6367e73ba56055690efe31748de5ad6a230a8eeaf60439d2c22ea3f546c3c746bd1fd822f8a102582410ea9ace2d94eca1837e01cebab4734afd74a7404d069b8a0101359aa97552fc563c78e6d3a37fbb6f9a73dc9d27b08a4a9db52ea25db5178a0b979fd238bfc0995e8d985027afed68b2912ac29e07c88e3f2a9c6a449723ac3b73ef867232711620c6dbfe133fe358cca442bcb82857a04bb97993e7a41d9af62601fe6e458fe8ccfc5e67eedf67bbe61edf2523be4f3f9997ab9da0da78286450021ccffe4e1c3c851be0c6dae5f8f27002580b4faf9421f933228cd8b0b33589a3b242e7d649b294ffd9c9bbae7d92085b08a7a5d3c2ae1c5f662718a10676198fd02ca4e005ab07f1641e563d4e7b1ae6ac53a8dace30188840f946c402fe48e9bdbd1e6c27073f9ae30b1407304156c655e19323c04bdcd16b4e60d8779f9d782722cecd5da15a646193d5f6294a50a9c0dbd2b476741db2667ee2d294b2a0b8ebf72e6f2a9a0fe5438cb9e4aff72f898fc1340256c1149b4a9da2b4c5cd48408afe39291b5584aa056e19ad2baf0a8bf6517e9d8dbeac7c9ea4497cc1c6cb1ce59636c13bca7a1553259b578f16846e190201ec2e40ca1ab547556e99421f5c7413fa03769850604a09298e9a015480ab679ea9f5a3e219c8bf9ae117e1c8e2251584a62486e4fce03d0dd68678488b046473c7efa1930e4e0293048432313792158ab48c151681a9cb22c52dfb35cd59892446b519ed81b039634813785d7d4b2b52266b7ab42a1b71b0cc94253c0ce888cb9192d13c627e0c46e5f9cd5119f2b82111faaadba405943b1f76da264b8d320b80c2bf83cc50d303456b02044ceded127bcfeacf8c4584ffbb8dea447cf5675efeb57e2ea178c47dd1892eaaa4352cbaf27d590e798d652aa757039c98439f7dc019fc5536e2976614b8de7bf378016de70a8386a1bfdb71800b5e9731999960ab31d5e59a2aab2bd404f85a6d05c0152a0f5676b65e20c7b3ccad84d1633dd21373e71356c079e8e5910f77a5e0fc44f55f04fd89882b6c6fbb3ea61586b3b3873552de643bf6c803451c360d036cff82de6ec8bb029238051de8b4d707e01a349f4f982bd1a03df82d12399b2aaa37648b6e80e0ce2ffd6a34a097268b649804317eaaa213c15f791d946b664dde4234656a03ea570d1305847e03e231a23ab481b786a86c5d40b243b4964aa82bcec0743d1905f1980b006c11986f2f2fc00e31da2d22600326a31db2d7e9bebe9a8cb78d487179d1e9dbc5f48c041b45771a06935125c52ecfe90ccc9c298ea727a9149a3ecc691305236ba7d9a7e4fc19e7b9fbc26eec6d7341f3189e62dc8c2deee6e80525b08e090a5bd7ebcb20f143fd509d7e063987b01faff99ea27062bda2c15e291ccb49c32edd71967f5c5f22863b7b5b37e42f519e0f666ac6fa305be3ea5c44890d6cc78c368499e62f3aadb147f782e94f40712e8437dbcba3bdb67e1043758888ca2be817d6bf8827b6ee368ae77d3d8f53d49ae68c7187c4fe925b608a5ce4134b9e037c77d882a70dbc16f60a5b6df7e677dee26e673cdfd54d7af19a656e556fb5ba3883d66df912eb0c01131ca2be6acaa26c84278408920536a1f4871e72653ca06bbdd74b0242b176951bbaab7f0e1f71e43485bf34948129655cab21d188411a5b473f40fcb404fd30568ecdcc56402993a79adbf30a2a20cdc71a045bb673f91ef5a4e8767892f2a5cf94111eb89fa34c5029b5c2cfd9372c6d2bbec2f73ec3332963fd8a80f70685cee4d707e0aa0af3b0910ebbe2e49690d278e8a79b43005beaee7fd6aec45d7168654cc99a5c9561ac5e03fa9d21b5c80b18339bc34ce2350b310b76c361f587bf4c7c95ce08a426a535d408859104ed2c6a8120f9bc2f1e5059d2469a7aecc23c31611261198891d5dbb2619c2b50ed0ed03841b568f8fcbbec127c020257880ad30deca9379f00825ac9fead5fa2992389c1ed7ef3f19edca5f7dacf2bc05df3e761ea4f1145d7033cc85bac55a4fa98816168c03d25b387b4a19e2da24a8fc66a1b341754579dcc50a69c4c32da4deeefce179da181109e0d22b293ae02577c4265f309a7c9f7641c67f634316feaa2507b465a076ff881ee208b106b3efe81e901de5706b62adabd0fe991f31ca8c74c7c2e984e6435df13bca58cc91c258269893a47bbdf6c7650d5ce37b50f17ca52fd466a55c70e908fccc4a3aaef30321fece308aa8df704573928370deb82a8a04988849cdbb6d16e6719c609198304a3eaf42bbe832193e7c6dcf41e377b64297cec1afbe421827c1212e9c7cee6d85d9a0d6022191151d2497bcdad1010433dbe7ed39183299296d8d235755f1059ef2849d28124cf91da5e7ff0b54f6e5c3ee5748d749c72354314804ddf56d4f60e48028d1a9c2d454180e09c01a3530ab5f931f0943df2b85555b6128de8bb466636395c395ad46a85f0a869e9eb2fff3fa2514e99eb7aacb893700b02af42942b4f2e1bdeb8a8146b007fe09d3de104829d252a2f0284514c4ae6b7158f116931813e6963079fec016569d79d33a0f5610d4fb130f8c40155a8cc0fd68aefe4d10a6bbfeb8c9f0314c2c5ed18d78f621e93e1e0f8f285bf5b0d57c81c6700a76da650dc611d232bfb20c1667148a66031384f23ca8daf1eb01c6ab0b5cca2578f4450095a500afe148680cb912fd37bcbaabe0ded6d7647c7880a202fc5779f718147463f69a05e21c1303eaec50d7668eb860c3e27929ea5ccd8ffe81e3d2a87d2a0d2d1580b8499e766fa83a5a554f237c90a77ed009fc77cc517c01a9e02b4c443879c7fa41276499a27d27394edd6ad38dbfc3639e0ee3b4b1ae041342a2bb8f71a4da87e12d0406eaef9cd5d2cadf6508877a281712fe37ffaa6d46b8ac1c6a9db563031890bbe57db034edfad54ba98a1e55a587e37726e0288b3b58aebed7d51d9acd4bd9387af84aecc1e244c32b5afdf51d5f0071c2ccb0324737e5511b370dbe4be6f07317a686cb9fe9b55502c3d5ce9a7137f9a8cb86197922eeade8a76ece014a02a1a5e3ced4211fb0afd5dfbcf751783954f8cd0d6bc65253efe3c528d572fbe1a4393e00eef57ab9c6495cb235cb0545dc202c05f62f40f6a487fc05eea300e483a5933c2f5271061b5216adb92dd9adeb4db0befeec75359e16861856dff06b2673f5df6b0cdb83f2aab2fabbd8479e0322d2b36be5e79a5d0148c4c795d7db97da78216258a25699c5a61ce050353203a3c51db27f27b8a9e2202ac6dc8b1ef362b09645d8610ce2661cd92cebc9f37ef5ee0e3b29a96da699121fd2223aab8d9fbf61ae544c037a20da18c1d0b60b260ef17749bf2fbf7845b815b2f9fd8693c1f3c441db41b3967c6b31a635dedeacba0fa96aa8ed6df488c6c0de6af13430ef40090f3d0b2d84b622a742c904aef45e193ec5e5efa6f850a5401885224d7827fd664b7f98e90798930beb8c0b18331751596a6520598bde09cab89dff3feb9348c70e3744e1aa7210ba8dc60c2b98d52b99b3074d57c869f7b3caa2f85160d5ec6df28b8aba7a63b3af935c14c9a48050b61748947a038ea6eed8844d9817ea55fd5668ea8ad81cd27ba123c870695adc8c12b3fd2397d5af299a690d101ea21456d31825972549d55015041d4861795e63338a33fdf6afbd9f2b037f178941f5151a5d9856ebc92f3c375af047462156f31ff9c78b8221595b300cc2fb5f0b39407d09a727d080e66521d83eae04eb447387c98c81054258ead06bba8c0fdb3d32a26624c1e54b1e4c7f06168cc9778703d10d3ddc2c92a5336b61f39140e018de82b281aa27411fb80a33921df462626a52915d41dd8391340003f052dc326aefa0cc15a503bdb9097eb2b11065181c0e3052862ae3ad8a1339f07b5128eaf0967a3fbba390e25b6a25bc7a1c5daa1a8f608c48f8849b8ac61d6499d8409716a03e891f92853fd4ca8b0755657a31e6113636bbec8ed9f4aea9496acab42ec816415d8b51466e2feec570207465b9c007435ead5c83556ba00a15f9c4b0ae2a15f1f8697cf87ce95804df298cbe258b42ba15709de047c858c6a09ebefb71f516fb0afabb8086d06b1fac9f2dc0cb8869fdd352bafa275bc7c3c1a506ca6d6f72b2af26cf06e13a7271af5baa2c0cc144a839827ecf357cb5b5a5bcaa106ec68a97ad8219a249b6f580c83a997b52504aee913a7bee000479dc23336da46ede05d76f9676c2318bf71dc05f5159b3e06f869ece01175d8ab05d56717279432db68b48a022fdbe8cc9bdb09f5a1f3540a0e8f569f3ba82b6bc3b084fe619d43bdb3ff70effc39b7f12128be448cf81836693f2801fcdf5a93f1d7305d3413b920f32a47ab624f5f9555ade2eb1bbf40d912fc1f24b728d1f9de598fcc0a68e40071c8016b648d714f44a6d08a08ff031504923162197954eaea896c6f03c6b08abd0a326208554532d30d21780287b4454de3e29b1f5e9586d7e46e91892521d17138df3270d10036c698a48c32413d29a650cc82de3bc49438c232b55326c7fb07ee8ccf9860e5f8ce9ee21807907cbcf75ae370b02739f43680e6384a3f0a66f5f5af4982caea7ab579eadbe834d101ea9f429944d372083b341a166e0233e13499aa4a871438d7b7098979acfe25c62a7bc39fe27d8b8de6ca48db86b19642c3c04748acc94a034bfee15caad757e4915acf81474078823da2d98c43079eb8e6fb58aecf429d3e1cec9e7462e30898faa4579538d12d654b93ef4edecccd17ab89ad88fb43b5cb1e8fb819daba488b1ddb827729c6a379e700506693dbc951aa2cb4cc58955a5ba05f4ed7397f54971d57838aeaf919f222701105e4ae7dd6e08287cad5b7e2d247cf93332b8bdc583bb9c524a8bd555a9f41e25e102b414468d7437e008121e472b33c1edaa05b637a7fa5569f72cd2f90e92f4b29c2002945a11f87fece088fa7c26bc61ec5effa43298567cf7de9f69eb7d59ec4f30171bc3fcbf072007cc3e7f910c7dd157e51b8bcd3b4552fef09933ec0302b31d5dda2c0661c9dcda9c7850733c2dca7f4022f1bf56900b60effe34693959ae49cc72775a8ce735f26631632b4a8f782ae847e77285d23f1975be6436ce02fdbd4cb00a8cd659926656fd2d039288afb73c3b6ff0234189ec0cb60953cb5e4ddf67d4ded3ac3dabf40f2a2400e529d7f09a812e98fd8bcd636ec4e46c728694495862898393250b9725af80c1d77603951b51f78962db3fdbfa53a1e1a06ce5609792ad314f623e37b8c1b279a8c57bf6b710e9f60cd46877462b1540bbd4ebdba32201d16480c1c8c796aa61dd6d97f84febaac548940d061678994fd0ab75974607efaf3e89748c940ca284422df47d5d8b8943b2a45e40b58159ecbd414a84e6451ea7dc6452afa3ba637af4b4ce2f0c0682ca917ec2e84bc8a8e00b70ca300ea65740f5a8f45f9dda6a054eb580fac07433ba5f8d1abd3355c9c695f296b015c9b5ef71557609b7c81ac1bd936ab31b15f024ce76d9ad93a2ed62e4f671b0bbac758d60332ac3bee7f6c3d3439597611f0d17dfa5e9268a16f609ef33864772ffcfc311a868055a75a25cf9c151347dfd3730c1373e3db8bc3ac7d729ef6501a341beab2d6ff9f56a1b85ea2e3c29cd3b72860ab03f39438bfd09c3812883288d7d19afee3cd1d080b147d0f1af7f18783734d14c219d191b643b01c4ed30b64f1f0fd8d0db0368131ad73464dad6ea036e3c9e71f4938542f4c5d9136d4204b05ba279c4db20f75be4d1a62731563e0fcc9f8a851a4126d40be2a9c2b61802fef156383f16e649a39d45c16e3d33e92bfb3bc3f94d0ba0b66db42a9a218ea28c942ec6653450d1f34c9c17a9728fc576e9bc5b73788d6c1b87dc75c3bd3aa2dfe22333eb378a2c23bda0922e4e065125a850fd1d02d5a65fef77ee21206fee3e306c2b1b560854b6c8ecb0a85baa433baadc156c5f8fb8132d74465c2d1fac38ab5be2b14a16a520b80dce812a1242c2f2b31a9748ee07c80013728101ef27b8341672bead7c1e099ae236e4b9537c4ff2662b50a9234ee344a43c05b5029409209775a646625313856c397242a664481839611d29d0454c7f3cace09bb0ad63d8dc93891ff5f86266e525e9c218ccb7f65813a5b7220f7c795705557e800552eb0f3648e59abe12585095f0486ba82cb6ed93d0eb66ec20e6f8653efd0958a558c787b94b582a5e13f25e5eae32655bc1d280cf1a7ffdbf8600e68caf21b401e12c9209342226de26843e428be653ed75fc96ff7e4db19033c154f53bb6801ad3895ce3f68c94e545a6bdd5dc8f665d98fa82c6daba53c9f76c2abdb86c8f7b52d7f859b62abff61d9b3874f7e2cf40cac4c7265bcd0bfc4c643c9e4c22124e08c6f847c56a35daf86162e96de0763839ab94832568fca545f87c4ac120d2252d3f9085c19d5ee2b6fd249f0d51eb7f17542285c68dbc5f9dffc1e796ba0f3e9d2157597a4c9bb4070408f9226c369d7009c24dce750e25e8b71eeff4eefeeeaa1b9097f808488784652779f248f215a2ba4bbac9e451a2b74e459ee97194def2002f7e2c7b6be5960909dc445525b7fe55fdfa8432407d4648dcc72361c8db29720828fe0e0183895d54a595037c5007cbbd833bb83a4476034838e7cbbb24758e881b5a5d366c279f51815095d44668b151b030c94fa731d33eaee30ae621ad093920a8b68004071a573f6e25480ad15cd71ba259ca06cbbaf357f87afdc9dad71f02d4417868fc5f0f825e3c0b855a2c4f6103ea033dcda0acd60b604803f90d1572024070aefedbb2e5700529aac10d8f8703e680f7674847e7af424c869807843a92418c6cc464c6a850bc8a13ccadf143297e1d76e871101f19686115640a4073dfc0b824bacdaa0600a274232b696b29a144548c3a7b2ff0fd916d8acb0ce10a9c16fe0b1c517ee6ed248e64bb45d3c4bb119e7b2d8e111f1e19d67094a17b8588d7d053ad5da02b687eeed67d59605535deb577650157d5b4aebdd022352ded894647d95de1a0dc6b55636db31cf40df8ce501b8891231e405115d7a828ad6efcbb9680297f5c00e3eb855e7a0c2fd5ffc180150ea4a3c899245a91f939c627899b23f14c433df2e8460627140538c0114b3aa591b690844ab729840e8a6f46ebc6067a0aa7bcd1e12ac6ac1047d48d8e8d02d783d040243905117aa91d0b3da658f36b5568a72751136e8b2e0727b0ee89b99dfa107b7c816dce7b4a03bf41f503165701ac319f2b7980479194fe00f9b4c93a88d0d4612364bb465d8f662b2bb6557199af67d88705ed043434e43915854ba0589447a9f32cf0cb4cd08e53a013f2c042f8ab8a6c8749581f249ec05d5a51d66cb87c3321f4db7897dbb7ae4812149f22cf62e6741864c56d19c0051f3e46a4acc1156b73182a00ca0433a1283e8afc66edd2328bfb3e4275488dca19f659a54346b31211a6c0bda0e7daed138e10c92404d7c3052c2db3b33e01a97de67e14c296f048e498b1f4fa70694b245e15a9a70c35a896edd81504f82ff0afa9a8e56ddac92a02b9b626d818f2662c0a6be421693327c8f3b94634cc25241c015b1a436ef4e80b85f54cfccfa99a92ab930140ebedaf2754622a8c4f522948e827238ca5c174f729460631c79a0e3c89dd5c6496692aa89b463b9ed88df911c80734153f5ed8bcd9977842c3e3cd020b695933d0c59ab3f24938b600c45dacb95096454352d404c9328ed06396aca9307ebd6c3c30e4b03dd6540714bc23cba09a944940ea3ee4b292179b8da2e3dc3d7b60b99658c40996cb7585a7e264644aa3a2dffe6483b8de75bff63efe29a914af7c0d3e02b5f9a51910dffe098bd1e563407875c1a4a37fbf8a1158cbd841a945c45a429e310e357d9cb21cc48b8b5207213d01126b883d363221bf6c724ef0a1a11f7d9b861464e1a4a86b1788c15f41b508051ab27c7aa01aca5e3ac3a75cce92f3fb53d3f715e1af035bd0b6689ff074895c02d8f452c25327e088261e27218feb0146e537a8bf91e837832efc226477cc4f6ecd85e92abc71bd815a3b330492c0f9c73647104b2cecc6b2a76240207a01ecfc027ab8e9595c3018d6a803e9930e4b953b4c596fb74ff5422e4949583c3b424854ab148d772a38b83340a409217dda117218d5c3107efcd808ba1f36c08f7f2bef4718ab2aa3f7a5c8ad0f8645ebc7ec0a4ef32715297a7942f6de5b4a29a54c52067a058b05a105ffb18f7dec63ff1314f177983eb6d882a21d2261ea638c31c616d30ef62c983314e90500e428bba0099063b2a4903133c6d21af790b51e1e0042b798b2fd674cbef87fe2f73316f39c6b562628741287f4e9eeee35eeee6fa79492524a29a5a94b5b3e9b44412ba2c4430fb71546a9f33d7c74b04489fb0a7e0f1a7219cb4862d90891eddf820f5acc47f2986f28ce189aba68cbc31a8ab668ce5a7fdf7fd89a24f0def324e87ce7bde729d011676acfd3a4c94c8cdb3fab3cef3d09baefbcad5a68faa4f776f71d201ed034fda7859ea0988f5896c3e480bfbef7b0b3cbce9cb5b63eb69cd723e2b0a7687f079bc3fc9a3bbcdd6dcb01fffc39e705ed8e3c7a38f79cd35231ef3c7ae8ac4d5b5df71d90070fb54ad92833d7e86d099d575915cb2a1680b0e2052628c91207169934c976cac4096d65d5d8b951a9b2eade94aa86eb8304d6e9846a2949b168461c954d3e9d6ab5b586dd2966fae898b866122444989079c89ca79951f984d21f10f97a37e76ebbd12bdf4d0ed3567cc18f6350d7fb39ffcd1b68237fde597fb4675b73b6b65e59c6dbb6c261a9e28a2a598c51eac193986249119188e4e3870c31c0648eab89b5d6a668907d185321fa0ad1765ba9919db6685f39b32bf35024cad982315829dbbabf8c89bd44f245f47a128389ae8ccaaeeccaec4ba4442412754ab0f625239365dc6f34b769a0fd1b504412b4db2a730369dddddddd3f1c36674aad0d293167be77e508c6f3d33f98fefd4053c7d6450433f452c10c629aa08b79edcc81df1f883761d81e88e7cd20c4a6c94cc903ef114260e288922c15a96f65647e0e94e7dfef079ace1df627a86ed9b1819b3bb699058f19ba13ae59d98cabd40e7367d1824ee6c0035918a73056a9eb03c65862399b4d9488a672d6fafbfec35094b3d6dff73fdabe1b551f16682fc53cc834b90f598cdd81f2f6dc8b9256d241479e2684f12af9cb90e8c84b24d2fc18418b73c6c32442064458dd6f28140a859a492fc044552f809dc918e9a2cd1c3f5b2d41d0d5431b831291eb059cb085e38887cf3a690288a1e7cf9487d2c339a5c4f0c20b3870dcb8e1dedebc4ea7339f13913068f7045310a2e7a31c464aba39937eddb0dfb77df73770ef75b46ece68c855a829691f82d543fb0c98a894fecd02d49e390d943051f8ce72ae5961a711066bb66c39452a0a26f7de7b53f882510c41a4c4430f9d21180155f10224482939c9c969e2a49c208edb5c9d239d94b22aa9619d2101906618fac1ffabb5d68a5f8787734a1a42a9ae95b44b45adb5d609846a8c21947a38c009c2a0952e0bd9a58649b428da220a7e1b68008d45fa8abcd21ed6e61858128ed7e93161ebbdac9cb3ccd20604bcd4799ff9cc673eeb3a949e76ce39e7df19e4bb749a333c78109923042310b2fd69105ae333a7d191d7d16dd6563ad2ebbc0edf42bef863d00e1efa8c8ebc54729a474df4049aa50e5e627252eaa10e512a72bf04a50878a903eaf040323c7ab8b61c3d9d509c30913597e23427e453993978f030fb6c4647526ba75586fc7dd01f9059c6361e28b2c4556bade53acf8ad759c99e8ed7717947be40a873fa046bb6f4524c73feb23eb910eddb56217a5a8ba4a593c8110f0983229d84b6a871c7711bbf39325572e792779ca73695504d73200f2998342ce3b8666baa3a0c9826d39ea0f4500440e6fc219740c2d417e27885230ba393398caa23a08ef0a2c1685a96e7933c55aaa9b21b0aba6e1728e8f98ea7ca51bea24e7b91312c5be4274a6b3a44bf8586070db90b14b44ac6dc11063ce439202061f01809c8177f778182ceb5869caddb3c7078e2a1894486fcc5d9924186186278e1051c1b2c0a5a9caa4c35a511032dce9664823ab2efcc3173083202a65bad9a07c89c6de5846182fa7b6fc2b580c912a80d4ab32629e0e3cd495d4ef9532e9922e7c696d38bc27618dd01ae9a5693f1c855a93a1564c8557881dbf7de95cab25055aa239cd860f06c42c2e4d750cc273e40f77c5176214a2afb87073460c1d51c2d1222d26baa547a46107475ce082d4e55e8211a5d5f14b1e052f4b5aa1a97e7879b47cf9c14b55aad56ab01c1585583ea42860ca2608cb19c41a3e59fa0ab16df5dad75cec9029225ee5b4096666b203ba32b797a828e1b48b280bc3403344b2d3c4c2a80d881092ae73d8902c5113977094b4a453adf8388081f302915e9deed94c7d8daae6b6991f11f8cadc5d6d27cb72d5f6aade761db4daf034a0f413a78788e8c995dc8113599be408161845759b9b0e98432c25afc568aa55919a0294bb5a5625046870b578ab12cb5d818be7985030f89193bc3213575cc8f8bcc85a67748d63f66c875551e21b42867ffffd7647f88edef72d559e794d1c10139c23f8503f20583e23d897187a041c8a5c5b7f5de948a0573e1388ee338163772389c8ab3d9dc3df57af988a3f190bf7727c61c0d1172d4712819334f983b71a7ac5ae14e74945146ec20db5fca2696f92b66a7d0db8bfee282c811893bc998293926b82192238206bc3790bb912f270f3f1277daaedd3667e25bf88b3badacd4384c3e9d38ce25088c65be793ee868f3216534c3c8cdf3d139627e970869062418b4e053c1fc3e6f7bee3befc58f34b10680c897890a41d741c1f6ef308d0571f0e121c907beb51a909c6b562bec1d23f6fbac7d1468fa13fcb2187e3e77fb7ddfbd2e20a078342f06efde9b3299e8486a90d4f5ca170f71edb3f260b6e6a107a3a32e67ad3dd8ee6299abde180aa253759ec9b3d92e769d6adb388c4a8bb6e6559131b127c81cd7051286918e3ce03579df81e27b3650d4e235895dec7ae0b5912ffe1f25347db153b56e1452b4aeb88184b93a9030b6256bd9239ae8541e285a231b0909b38484c9dfa970e696396ff4c6ed75e207db57c891b5f1901199c30e91304c198337effd2df73a38b2a7f8d99b9b2d7e48ecf9a245628bdffebe4ec7ebb82d639712598e47639102bf9e60972b744729b518e450d05cb0a234b1c11835a022a734c36d2d00119300520e04c030aed46a12be241229678b99c8b9f3f9c2ddafaa26e75c699dcc2107359a6c8aea8b7b254d61097d535842cfaf610350149d3d50145d97d09e2d66a7c1e7d38ebd7fedb55dce3278e87f5f24ddcfd7e69011f769c07b5e1974907e766aa8d7e294aaa6a362dbb64dce6628f95d07eaec54ce2bf344297530af6c31d3a811d74a0d26db14910fdb6489a14f305b8dcf9f41b64dcae0bdbf8f91074e56963378bf81b4ed27284e1b71de6cdba4d250378b8e9c882311b54f96bf66153eca17ff188811dbaedd363c839cb63ce3b68c6b56382ece5794a470beefc362c70d1edaeff3f6e4417bf4f0f0c4c3be286137580bf6f0d045546465cca499801c4d2164c8bf334f3360f3c4c3bc290fa52b36c5ce1e8e86b16183053f7ef210e5218f1527aced116a4f79337f318d6336a6e90cdb1f033e66084187b2d0fec59eef5f58408ec2fa0f08f76708dada2cf6fcd8a461c0478f970c0e74c4010490443c3619b3b5c7bd3a0a9dcca106a724b092d08465b170514a31c5dff7c95a0a4768df186f7f9f4e3ce7c47352fc348b95d28cb1f8c3b618d1a265b5589f8c99469eb0b72256b0832d86e2e7006e537cbf2fe79a95abc3ca39cb2c65f2b7750370e2541b4bde0c1add83476184204adecbd0d1ff4b76834c03402c5ae879ebdf9fdcc671d407e08242c6d16dce074cd0090f3c7da9b3523ce46f67498a68c7183760264300ab25369851940dc6d8a2a479ae1aa876cea1c99cb92d958e0364ced3f9acb0e57a6d5b4a55b3b2f134e1c2184b3cbd5ab79c73cef934338b5efb4e703ebc2e0312cfb0e51c9a7fc3e28c8849793d2191b2d49ef232945aab83fe6d2545a9b6d62aed9cd67e8ed073c8d71b9debb4f32dca6140bfd71a31c53c0039517c4625167b11eda13fb353c38cc3d821331b1134dbf589a3e9d3f6d7265a37c3d1b82a26202c8d8e384be3681c8da371348e36e387209020c1c963962d5ed049228400bcc4207701a8b596525a53e3915db09634499decaa090cb6385d19b5a407335b9c4deea962b1fdab87c44fd006fdb99aa4098a739c77aa2eca4355d6206da1082dce93ec649a81a19fc3073370d5ac5448748de2e160db36b9c94992ef7314826c902f0bc8c20adbb50085a621b8a9175bb88c18cad7c5a0285d9bb4937af06f3985e3a2e5254c54ce2f99c9d1193a418bf225c3a3010ec34510b015d786f825835ae1b8262a5b71738ef5484d2ca6ad5d4062c0616c7d0b5cdab4354b93b16e039cadb4094ab8df9198650248a8b9f12c46206d23b76d1e1633960e40036e7c444afe05ad9fb04fb866c75251efaab50ea90ba52ea30bcb25e692e372c405b6fd5d6e5c5e2e515c5a2e4ab63fad34461a238d91c6c8593adddb9dcfa55dba7e476394317e3fa3879f247cc60fcb4321681b346e760b8d11004900e002801270caf60769a024db1fe45a21c90a48244c76c918dbe16c57c18bedafc24cc6cc7741b2fd5d5a2e445c8cd86e8b90a3cf6891a031ca9724b4f8a9b1c0032d7ec615884898959a154619d3ad2cb1c2cd5e6942851ba38ce19e8589ed2f63ac1246b6685d3266fef8b9913136255f8a4818bb0219fa67b418bb8c2e23c62e23fdac7c650909f369e233ae34f1a92d61d31899c8ff597d9ab03346c6fae2a756b72dd218b76715a07cc61b446a3746171aa3cb783750859845b98c32c6b22435c997daa28428b7f862a3e48b73a9edcf112143ff2a5aea131685922fd3655ca1b5028ecbe832ba8caa9a102663acd553beb2c56cad552253b15b752299e8006b6c1b0e7c12089a82775cfdca359be190aac254739e32585ab4ab171d4d9692bccaabbccaabbcca2bafb5ae6cb6ac4b3b95665c8414d5bdee5fab65f942a70fb2e6a66f882462bb07594942d76af76bcfc3359a32d3d064c672d63ae642145a7cd7b5b55a0d6396ee055666cea96bd8e024169ad1f45f32b29ccde4a22efaa255a14d665446a950188d9263b11ccb33e63370efd22e57b8c1b9a2b3598dfd2096632a558eed0c45e6988c99b11c8bc9c8189ac40639a23b98217feafaac78512aa84bbe3c99b90502842ec09095a0e9e7d87402e583b960b0272e97ab6685b399bc2f30c65882240c0c255edaf378bcd72fbe07e241be9abce024bd00f4a7dc59d25b6b67beeca4573b3b30ce201b366491931dcb04a434e13ad00ff0b717e52cfff036aeb1b7af2091033b5b0288a16bc82b90884106974c61dadeb9c1f33768ef57de3b3cf463d0c57ac5d3f170cbea3df1ad59754b382ee74c29f5842fd769082168648cfd5edab55b296ece93ebc4e1cb71d58b3c45cbb8adeb5c4a8e70efbdf7e6178908e967c88fb117f7b284a1c5ee0423841cb1bc7f472363e6bba04b62fb65d12b9e6ddbb6df3c2b60cea76b3d5bc6a7bbad64cc81e2f474b8ce5be1386e5be1386e5be1386ed35f4bdab3d2e13caee338ce933dbd7204d838b26239476037af282d2578ce99fa7213dbdd5a3b23081e343467483e626851c2747091918de4a305100f8cd3240245e334d1b8af1d8ffb69296bde5efcb62c61ce719b13dd7bc061eaa8036b05a7a9f519ab8645e0023c245001ccc514e19b612b506c9bac5bc7db3e219fd7f1604f3c741a30d0f2e64b691a877952cad123d114e9edbd96769299e04c579ddb565522983f00b976ab6d422c94fc6ad26ab5b8158eeb498dec64273b29a5ccb2939deca49432638cf1f453a699669a73ce9decba558d21baaeebbaaeebbaaeebe45311e5464986248c0564d88210babefdaeeb501dca43fc62873a75b686c12642322d76396bad013aea50a7ee44eb58dd898692d0180cc1405b2a1e7a47471c6dfbd9d16c9a861c831daa3bc9b47db13b7527293bd1d146db404ba32d43b4d89df09d4fc4c846225f3a5460f7de2ddf2d2781d22d6f3590ae75a954abd7139b36405506aa39a02aa5ba8d22dab7e8b21a606d8552a03dd796a653d6c99bc755ef358769797fafe2f2787e06f80145ed9e9701aa583c2c2c9f4155b8597e82e2b780a4872c5f459be5755016907d0d12716c918ea398bdda12f5165d07bbe7e7bcdd684dc9d934833f70dc684de1e22461746465b515d656585b616d85b515d65668a38cadf932682eb80b4d6c32cd5a5b6d9d5f8d975f0389ded1f23abc73791d2eef111f5196046b4441652a10a1c59ca33fe7388ccc4367c108fd81428b3f62d8f357088296b5f6cc57a35323cb8b568a7ed152715b65b6c5f9ea4173beca3cbd3d906a1a1d61d8bde37cdd71beee385f779caf3bced71de7eb355f17c44daa49835c402eef9d1d57863cef9e17b3e745ed7971822815a7b42357051a083d55aaacefa82f08fea03f35d0e20e77b668543cac59a17178b827f83e68f1c51f385cc042cb7d5950a247dcf14ea03b2f52da1da94be9bdf8e110fe7c4b3d901364acfc9cd5ca78b903dd323c55e81c3620e37f4b19bf22e6d9f697f15a566bed197f8313c5166995181d76f800def5599e8586cc7e5df9f9d2a1de1de896f15df570a0a3f9f2b4d0e2dc1f920c3744317ce10b9fc7a1bf1b9efe64af5adbf2ba5ed9f23abc82f4a7e56967c7ca772bb5e527dd2d3f3b0c902d5b460b7859f7e68e4fb4285f9b29969fe37214b47847f187a87b4ac5294dbed8eaaf930d5905ea65a22e25af25af269698b678a36cbfb65297c354196c771a1dcdd76cf2ba230b516891f4816e0b44f284d0f6be486915a4491d3290be1bef211dbde0a15befb52cb42529a832b36488992543105162736da534d36638a8888c83712e1dd7945996a065a82b08f39a4cd65e131d392180182653c773476a63b766db7878673ce4a94b4343dddcdff18e5b9eabbb8403a789bb4f6eecc23cbc30fba188c46d3abaae9680f30e0d3e524881dd1b86f7be20f28ed036ee4b31ef0c027d373c0c3f120e5b2f8ecf7031ae59d9c06e16d79573189e4e2d10d1a79cb9ef9e9e6e901b1a8290258690a3eef33562fbd7eb7544d0f774b2b54f165ab435dd6da1bdefac82c8989cb9138dd869f19d175abca74f179a0445ec93c0766a00c11b3aef01e54c53a72108241a6087bb92eca619f5459d4223e86c6bcefa9ec28cc370db6a5638ae1ddc7bafa41d05c9bff7de7b2fe80373eb307fc8970e540143873943be5b7ed2f5813a68fc309be180f12cc7da1a106ee328e536cb6dd3d6449f3f833c7af0f05024b2b6c65620299514d95a9903282940115ad2b495c96416caa41bf734cc4d5f763eb0c37b1ae64e42e7570c87fc1da3a349ab2fd68bf562bd582fd68bf5baac0a4e2997551f0c6d50efcc3d5d9a8bbaa9abf270756deee8a1a92644036d6dbd29554679637c38725eb9817e960aaa90f89d4ab135df948a0948e0689b561bb5da9785d9da9db14fa8a5515b65539a5a82039ced3d1c46b42f98c8cd367dba042767444b74ce269bda279b3ad9e26783a8d09d6dbdd1ebc8e877d9684cdf4d678ecd76e67733c68bbd1935d0b9b363fe8c21fa5eda07ee4f8b6d116ac020904fb6776a70f981162d6b8af2136a59f6354594abd9666c33b6d8666cb1cdd8e6bb813622f40db940cb3c4d574c1fd30f8ba02bb52f2e96031b5956e7697d8a6dcea65f3ba0222cd6b4a50b0241deb6764054bb77eccbb2ecababf8da17b5576c7a83ced7e19576be4afaaa1c2d0521f76e99854ade5ebeae95912df13ccfcb4273dbdf781cdba7bbf752bcaed3b9611df1e6e58176d1389ac3f8ea86ab42056563a2b9370a351a4e675f1a1d655a0d542c18f7de19ebca74c44d91217f4e0c134703438bfac4d1f4c95734e49fb3d6b499293278dedfca2c1832e4230fa82dcd53c5bd343705de99ee895b9a3ed151674486fc9124d9de31d9dec19ce858f245eb16cb43cdca596ba9836822f410cd449d6da8b40e38e518aa110000410013150000200c080583e170403420962c9c7c14800c5f744e7460409709c45190a33888a220638c32000003002100881015ca063812f0ce467ec3d87239c699398997b48f4510f6629059760e1685ed6328d98c10063b159d1e59edd12711a2d9ff10acd8464ae59f160752e116387c55d5732f6735de722ccd76cb347909efe491a9104416ce3460bbffb1457fe410dd5f3cababdb3039e97b56d0d88326031b0ba0b469ac019ba00c12d38f3d147b09825a574aea93efff4eca7219e43a20e0ba8413feb017b0bb499bc23e95562110d915461055c016b6e03592aa977e827ea24b5add791792fe13f19494a94b4730d65f5437cb6ba592ad050ad711422e74dc4fbcac0da1cc3705e2de4edce861ff84559b590acb149c021564076b0add70b0b0216a7d61d3d18861830e9c82a9c2151833b48653c0ddccb6ba584b17a672f3e8edc86618267f77537bb10ab088eb4be2ddcae2c2ac33f0eb37d03b1ec432b12637812b030edce7b294f5a391aa483b5baec777e134199c125510c855cce4646ffaf918fef36fe6356e21a7ba7b190f59a5957cc0bf541bd23667aa704a356bc92a43eee5ea174de34e90ff60080c2d9fb1e5f512f57ddcc2fae46b9e8e6f6a3c44a6a21c5b94505ba28704bae1949f0e1b7ba608eb97cfaae95f737e6554741bed0102f527deb2fac199df53de3502eb4a5a453da781704cd7e49aa349afdc2db17eb6562f64a882b62ccf8799c663bca81242c0533ef476a4a30d29a774cd14fcf51c5c61b52c15a00fb57cd3273564aaf624998ec8d32355156831607176918520262eed5b1c741becd419e86ac85500fee571bec7870534e440b0c087c631439e12d420b1df0a629f210b3fdc052132ce16af60418d7aef2951a851d7203417d7383222755404b767f7a76921a4bf72a060930db7f29ae04afaf0bca0159ed9c3a388042b707a8ddc01ce57c382bea7e7e8bb938eff95bf1f2119b89ef14f3508ddea863b0a28313a79201b727fe221926655b51cbdcc30113215f5b289c465fa3dd7a241c82488d9d36f0f53139ad55a170f1a387af962fdd7df53c22f8571b191e1f2cfc0dc427e4662daf1b199b0e87a81855bdf95b223e279d8f5fa335abd726eac01b4a3e34b1994defbdc8caa7441f394c3857f8b6fead0a0dac1c794a7158b254a8016711c77ce0c68a90d13e67fc57b40c1c1ec1be2b2df93e6137e74814f256c678d96e8fa455ceb7e0a27bd0e774e1af45cb73aca83949d66b78fc93ea0df65e59ce6b2d75d53f92eeb373832689c72365e4e054f845c8081ee1d563868d3d3700085ae869d9f5e13b18213c60bf0081acbd221561cdee47c26487c8d2efc4b6037bbd15c9b034ad3fe52aa48e992d92deba8c8a5020689022c906c973355af16112335886840ce1fa18a94deae144ea8738db7d8c59a5c017ab517b8a80704a110606f5f5c90a5b465d16489238ba4615ea36e43d860a58a940be9cdafd4300e0fc3382395e30155a4f41d0ae037fb91f2ec3d3520e2e246306fd19e80f207d8bb838e43e9f3b55eb14e235f0b47936d43ba6d4480c28fe6e5348548a923ae6f7441e6c09a0fd611e429d0dab24ec34c7b6b08f7985d17d7889e2c38a07d8ff4b2d2142e2fa36b48e9a491d02b054b84cdc15951d94ec7afc66e9b8a7525bec02b6222a593cf0ebc53b825ac902761a6551ddc9a129f393ff426e149d227d121f24e186c0319f92e6ff4a10753829c2187fe6bd2c43b90b94b78581000257894da9bfbe97c189cadad17a10639ddb4fdae50c10c2c0ad80ed7ce6f9396aab9c9d33c544c856fba7666707facb6c9838653db996704af58ed49ab9d7659387122fcc9981ce012a00446b86a2447e5c557391ce5109265b94b739c33b4a6038778eee2f1bb056d70bb921c3ba34b56f869a0b86eec864356c98414a928c4d749ae7a126a50734675a72c2bc19739ecec321e167c28cf8d5888b81c597c0f90d58279cef4f654c8f66a4a6ddfc27ca7420aa0d30d00e909b3e8a1cf9f3830a0382ca878d2a0e125a41e8d6fc09eb239924287a4336dc9b77fb287fde5144910a17eba3535aeed08fe7ba2cf93acc3a2d5fa254dc9442b67fda49e1fb2d096f8cb0e09e1c9af709c34062131875740b473afc4ba864e1d405c3385f3849b6f7bdf8a4964f41009c79891447a889aa28dc34db24d3c303f8fe3682db6713dc4f074d6e2ba3559b9bfb244f277945f02c34130a59ecb836487ccc1434bb65ac5d68998791b25a82743892c87f1e66d7e48d18d261d17fd432c711bdbcdf4bfcb52f0ff2b44186aacc01a9fbc41c428a4dc2dff305522c9e3dd7bdf76f8b1129a19737d520ac94ed9e45490bf2b7de22798cad185615a8b9907d09cb496ac27027ec4fda58b48fab036876fa36fa24a363dadd053ea7044c161d11dbc22823fa486094d0ebb4f9ecc51dc4517fb15b387aad41408875a72229263d9021c59270b88a1e29f240c8ea5c13fa1bd395017bfe98aa2006f7874504eeefa4711e101bea1ba30ccebbc662adf62c0929d054b26b0627143560555b9ceebaae019e5455113989af953da40a73d538d53f4c1e47671bb406c77d9c0d75d636dc15fe1fac3b3ade64f330b637fff1634c8064ede1c814a4ef81a4d43814e012e666d684c6869caac1a043b4903ae834d3ab7418deb36fbd5145b51d5c2b08330664e7a706c37f4bedafd5d7a10a8f5737093446ba891fdb9d7de54f4ac86f72263aff68b93d63e2dc617001ed980a26ac7b1b2e62fb87fe714cc1cc363f9399efdbac96cac6cd69f7247004816ceffb456ab9ca800a89bcb696ce5f44f699435be4a250007b80c2fc35bfba5a2920425f6e5d2f8cda4e0bca0a61d506d20e568fa58190c14e326797e59feedfaf532e0da795c33d54c214291f92893193a524f089f2beb727603bb1b5ae80452c4611b93fba1ecb89074c1085daf8353af825f7e7975d4417f8ac11b3d28d42f966c8c54dccacc4ea94c2444a67720117cef1c76c7579674386e7467f03f7ce6718f9e29a250bbe01f6635a01e229d0c8d7279c60dda9b5bf4e9ccd8f74b0beab6f1cad42604e2e9a5741c94040f61a5521e0d251abeb1470bec1ec60c35f3e84fe79a4639c659bf8e23f6fc0b4dbebd8a782fdb387051112b79a191450542b7632c35435b5c761ac920b1d016a66e4462b09a46583c2a0d66f13f871fd4b86c3c8bfcec416d1ba928c25ab63a25246c633a49264c8c88a56d314294bee6cdbbe2f1f7e710b6a9a5ac93042ba48160b3c3dde639b3aa6a4c2a62a1dc23fdef64ba8b40b8c37a805dab7983d2aa945102b96ad2a575748aedc35c2cd30cbe66b55a7f85f57416ce7ae09fc0bbcd084d0a53255c35672b0200644c8fa9dc7f51835e571b25767c6c9a91d933a6569c2c6e791fdbb71afcbf03a41fe590dd898c5299ad123b28e637c44865515ea02f140a37b3cba16a941b454f83e62352fef469a38ac5b6b1ca5e9079b12b924504a37b743d756f59f8eb2d1266b9300fa8ebcdf7dac6bd483d43623a55cc418962e3be9c32b24c1f4200b69c2435c3fb5a444d78a79c124f46e07472d141bc48abf0740b85c2f95a16c441f419522204ca346750ef5ebf78d52ad34a110178863c121c9515b435db2c8aa83c63aeeda0feb2a3d71ee12ca71ea60e566bdf7ab4f8950d48e9d7be36f0cf1fe047c7cc079bf5a0655fc0a54f47f66d0ef87c3a697e3f8fee183a3ba68f23187597f64ad09280f5f6f117ef0b0cd6b1438bee398ba47fa0f911b1828f27c5b7a2e21f706f72334db752a0128f8b43b8ad208a71ae107f2c26d803dcb31d19f4800fbce5f83d1674f6c485aba05122398890041320fbd7c4cf1a158513fc3e744767986002820a19c5344b4d565c22852af688038bb01a654afe2c0de9193c82cf9548b6d850b1dda50e1c4e249efcce0a501d953742bfc52a3b189de008394a7c8684575393bf3c83acf0b1c45f49eb035663a8100f5bd6a1cedfdd0f08bd61f0af57598c1fb4e7247b63a065d88ee8de0218af05a0fdd592655524ada1c894455b212c3493bc950579df26b860c2be95edf68cbc03c944e706ae46dd32b7848eb031059c298db8a9997897175196e97c157f12a9278e332fb21e005c6093d1ee2008116a041e97849b687a70c2d62c1cbd82d7207f1e79f61ad062cd9a684ee5328cd1f0ed92a460e4df7f1c5623586a91e74420a9526680dcd13116cbaed7d03ea75db48d827f37886fe2f2a7355da344280c3ac39fd73fef482b139f5bb1025abeba2a32551f63ded78540e0f9d10a636e84846da9e93ed57598830059a3ea374c14d3419ddd831f8f2a7a572f125845e99654177a29e7d085fbb8d1031d307a7a1148bc4cb444faaf870dc65dda1d5fb41e88837e85fce77d318d2f453251651f8d25444eb8353fa330ab274406b1a2999e0c2e1a8946f77240b95fb3db5ba6c3907b135d35c28cf61e6e4462a0bd317889d7ab89ff3476c316a2496b5b22b041bd665b03a938db6c7ce7fc81d9f00e4b00d4c0cbf3f21a88a8e70d1ae65de5f8a3211a6a8f164ce02fc97acac834d9ac97bf419d3ebfb6c47dd895cefad3120b65f70abc30b3ff91762d5fddda01540b317a09c37b21822ae11c93b922c1ed1dc0f364135f2b3af67feb37cadb9c35bcb870bc429ed444626a74a764436e05a65ada04669b6c5d6a2916772b1c2795f12535793613e6446a5c899aaa02154164e52c8b6a02269c81a58e5522a9021a78a02748d458b33eeec407a7886f8093029a38073b9f5dbca59e677f1c71965a920dd2f84187bc01bf0177fb1ca9315098531cbc816005910b3d0df9a2970cc681c593115e2b99cf3a62a87354aabf25da1a50a08ff810636a256e1d0a398e133ec89692ebc044c3abff1ed43b1e5a6ed642e06c0eb80b3ff2b11fd2d46530d31131862480e05e7b57c792b0e9c2c81139c6e129edaeba88afd1fe4a78d3580018e213b93a223573fa33989dd11f82db4d4f24b76d701ca21e44420a1a6441dabe6753c81c4ab57b765b157443282e427e9dffac5269b8a0c59a24765630c957e01b807c40fa6346be6dcdf1ad7b811db1c59efb957cbbf99b924e2e2ad41620fd7625e38a5df24073093b23ccf52e5ff483b0b3e8ff089a20d8cd6067d1f739c6537e98eb02bbdf3c52415b0a07a21e67ad9e43107d0f53c249a2dc83a274591eb249f6db77d73a326fd47f8c0e706dd59b007d3f178ef4f29f7bd023f402c31ab3316bba807819c012beffb80a95c5a5fe587b4cf9a5e82545d8fb31755de310aa704a093811cdf3bf53bf82c8cb58956d8d0f2811111f53d91d755851b21c075bee497c6bbd6fce0946e9f00fac72110eae75c6cb28b0a32071d6600ab0db660c713ae35be0b5a95a40fb2afe4242dbb1a2ce90f9ffa7e77a35a1e57a3b3d2d48462118a540806b451b4c0063092b5b53566aaad01caeef5132785d0c11fa0e87e70bee68b2c19c139c97f9839afe0621ccdd734cab0850a81657b96cee2453cd34760ea2f44224e6034ec22d8b201bfb3b80eae26100f1d9fa0f11bc630526e5d62d25264c27ef1d4b7efb336c09bdeb22a2d9ff0e8f5c5c807d128f4c4e444542e2e5d227947470f72fea739055e9795cf585a311eea248df3759172388e4c12fa7c6ce54b6f4ce5de93a3bbcd3c55f53311d8aaf7a1f18b936ed199d4ab71f2f9f4be230c92fdbca4027bac783249cf89942353e51b5b6765829f602c0f29f0638383d2ef3c0172a4a42aac42268f0b22cad30c8654b48772dd76df7b685214db7a31d473d002e33a79e33933246de92614853a1c21742a26e74e037ca539d2dce528819ad2642c65f15cd8c1537001f735d603cc2cd9952a159dcd5dc59da0422c120cdb904f8bb0795c18510eb5e0aa7c85cfa4602314374821feeccd2a95748c4a19a728eacceafb41d3956980909221087dbef2448f529c039e0c65a381d4a14873bac6dbbfecba0239e9a19a39e6c379ad9220216c5a80e20ae26a1dc702147b3681b4c8a8fb4142b62f68d25dc40cc263ccdac2675be8957006611f1915e281806ac23a8fa28ea83819ecf8fabc943292c20fd17284348c57e624202619d13f4fd7f2453f95c33525f3086c7fbdef606a22c2c119f6b3ffc884fd5da9af8563e7ac1e3fcd04d89ff3dd4a6c74e224e0f245f820add0e8c6f41bd5b30619abc9dac252638968d929f98f7402e34018f814467a9091685073888f98c8206721099ac65c30a1414524001ba979392b778bb801c735a4645205414f87b2bca6584440174f3c10bdbf880391392167f13d86ec423329096e37c7f4129d194500ead3003dde9a128c030634d91bb0f56bf4613e11142d83a0a286401cf865a092e9129aa6990416c85f7a1d8ce52c974c0af4cd4273d0643c4a031cede65a316aa963e18bf67ecf2b1d5c3db52d418ee1ef9bc8ee095efe2191da1cf0c4a8aa840283fc6214030aa6c348ca74fe99570fb5d227e9199efdb00c20dadf638f7347939abfbb1d9a953e826c52fc892df6f60745d6014bbf07c8b5fcc590bb42495b7d2ca0dc506b145a6111591b8c1ae42b0f0e516b0ffd68dece91661012e126837df8719a8cef9869e91b258333cc58d3d10ce768097d0cf05b47dff084b2e22da653c1949e1a6f3b063236469cba5020842f73eab95b031fdbd3f5270c8c25685f3a4da9165a894ad63ff345b8579c0b66e2e37b69a4348bbb4ec2b8584e24be1a92ab6d0c97576038c3107ae46c4d7de261b1e555e08286e113df410851b95e1a3d2f380d30c364493e64fe8c45351e2355a0a255e983ff392dbca4a564e6c9cf92a7a0a25bc19b8a2206cf5068c5e5e2e9952ab13991bd045a0202b87ccb56423422197527d959d4a49ee4c5aefa01a82b172751d2567a572b30b42b2d60b6966cfe24da0b93e3521b1ca733c4abdfa6d505850fc5444838add22f1c558045324f581f9125bb34190db992795f32a770777b941698973b4a74153c0b1545bab40353ff9ad7b10b1949dbc82c2bd34a1dcc268720c83243af05d5fce028b2807206d7d91eb14fbe6bfb9e911f2e8a806dcbaabf3dce4197a9b9f937f00ac1e41568ff43186110d8fee7c3571786a9ef2785520f0988e6949b8c8357e20641d116d1c65ecdfb0b8584d92798cb485752ad8c026fc550f1c5f1099a7e80e40589c896c6fd6378d125d5b931359d6d1c2754985e8803646e5e0e1d4ec0250659a8687dda2d94b1999be60d061087ee9f267b546ad92148d3abc36775e71d3d8012175d8c0ba94fa5dd9018325db4c62533fa43493e4b14d5f7a6c1b3d5f72c8fbe49b567fa89c56f80acd6930994b01d78ea22d7d7f9448d4a50431fd094a2d7693c4d489b1ae877bd1a19c9285d31e9581efbd8618b0caab1f0d7a06b59ae23b0745bcff3dfdd1ef2ca03fb12b59856a35451b8b4f8add7318a4a8a7741a806eac108f9113caad47d4f6de9351343ddd49c87307c58c819b352f606e25ebed7113824b66c403b4c2c8a012f5edfecc434d7bda7ffd01e95a6dc4853d25bb8e18d42aef143dbdb0ab50bf5bcfba0b14e8143e45f0b3bd166491e4cf2851ae00588c324c7ff7ff52dfdbf102f731706d99fc6e61e93752a6568f6e34f05177a1db8356cd6309d3dd5143a7ee0e0155924ce07bcd4a85359834cae2d23886d012e7d09befa844279509e6508fddcd0a2d19ef91b2bdd6fdac364b10d3d20ac298cc13b6a6892bfdeb1de6f694274378b13f12a480c67c501205e575cf42b8fbc739ee2a43bf72c1fd5ee3ff9f440284766b4372c52eea815024aa1618551c01b888b20954f8e9f8fce4df82b4d765b5b7d2210137f3435395ec4936de24900d84ee57b37957a64e94ebcddb2299b19207896d026fd64691bb978c5267b2ba9b6afd6f999a7c7607837f2ae2f920470b5df4e94c1bbc45736a78216d3b9c202df853658e1b250a411e73742643f392ea17267c587bfb44ce1a1932f199004b692dc4f74413018ad7c0fe420a6202824b68dd034273850d799e24bde06973191705684f77bde6578c7b9e3692335917b47c947e61a585f5e266826f862a829c1ea0c383b5e4f9ec17439dc74689a3f7ff19fed2abd115a1c44c50d495d8c9f5774407aa435a0208672967b5d38f858f0cc425d8dafc435099e9fee238c91966ad5037d79bcdad8adb2c5309e6e9c140f80869d92cd17f54074357750b36dc344b7c4d71a50431b075a3c40edfbd484535e3d6e560486bdc19bf4f409f9700e62324b3d93d253150dc0dfe2800e0cf36211161ab9c0651d3097843eeda264d4a0a03c498096f44450ef0f23d270e26f42686c51a7f4d27b23049067d0a0a170274a7a01fdec426604d0d4b2313478ae3d44d6bb06e8178dcac49d6fd27cf0d57740be06dbc7f8182da79b7e32624b0505b41a1b4b3e9f0011266f69ea5cee5517f4b026df799db94b087a29692095e9e4084a6d822577ca26f63dce268ffa718408fa5cae2e32e0fb04a3405dad90133754c58dbfd478230863fa992e0ee940458db79c0ffb3f774822a69bc00aa39f303b46b7dfe21153f19fe5312cf79b8471985230b5025ed0b672cdece175dd714912e49094ca07e5040b92b573066e6caefd6dee0a54e2d7b5fe15fe3d650d86b062270c8f69982c5f8abc7483a952d432cca4323966eefd94781cbe522f9c72583a0b00872126c6a7af7a3baca82ac35fa26c75cc7da06aa6aedf56acde7f8afa5740353775e28daaf23b5d40d3ac6cc2d340fad0b4f733b9d64c709f0ac8a2b50d9db6e8e612f02f26e494a077dc5455c6192663099e659a1104d9a7819ae89167d9bebc5857daf1b88aa943aa3535e72391428cb95489a67ed93e6b9d8a7dc7e4b8bdcecdbe79ee21189b6abaa08de0ea299301ea35f9fd18da0dd37100b38f2947ee483ecb3231adb29621a22581c34b6945741aa2c6a0150826260ba3742786804b3abb350576cb57f50e9dbdb9dbfea6d8eda57446540e8d475a7c3ff59511ed30f99602f0c42a5ba227d4ebda77cf11685eb119c62acc9ebc93fd3373e33fe7ad6cad94bb66fd197786e1cb390e753ff1638b29ea953213dccdd1af08d4a5d8fc468e6a9b8da4dbf603ae264eca8cdb57ae6ce64915af0eea80f4003e373c191d8779be4a8977629a0109326ca03d4b42a4c4f12da3166dfa45f95263b9d14fff9b6224fc7a825a4c5ba962f88a5811b455b0d3270c50a346509dfa0635c7212193e5e9da479a47a66a21850d316c2a075876d231d726c8d8da3d3244fc22c185dce7abe78b5e6bb01c0aca73e8be2a6a7548d2f4807c91338c194acdfd5ab89952041a7b231982e06f9806d5c08ecac6df6ea1aa3f41faf43e08b2dec6307f783cd9319cbd30e32e8a7f02a9c9f56a6334374664cf398f7988e6d936876007f3cb16dd0110f2d72d415d312faafeb0b99a30c127b96a3a19b307bc12dc14dcca67debeb24b5626f622052079ae38c9b8479acfbd523b3088ecf586d05026af701aad51955e82ba3e35f6751dded4604da95606863a317fae0be5b368bc7194de0b2a57d202c5fa08cc6ac09ec1f9f71a733bb37b3e3317964b107f25eb160f1511d53474c30745e53d8069c40261b88d1d1a23dfba87e03d089f711a44810d260e5638f733e563883e0b9b813d007bcec89de2001b578d380e00a22a0c3a5da75284317d282a38a3294abf18c4ba325d73678a702a87d255dd2eb6af34de62637e7a337e9b3aafdc64679bf514c8c02a21c4b600b3d1e4ccf5f393e1dd1bc49d009bb439c25b2ddcfb008a8734f4379cbbf89f46fcb1d1a701c00e61f07e09b21e40e0965960a5fe8165d715953c51c2ff24c898de153b949cb9ad59afe35ff13f470f1e9af2c1cb4dbcc51bf662d74070404a99386a70c4ab2b2a22d499016eca4ecca05a03d2d56d7a632fb44d280b2768e69f08a34fb71ebcaf58ab289e7ded07170a3a5123fbc568747c1bd19658ca89617f3a6e3a668355f8598d35b8c9ceb32a41b13ebf4bd426e6f50bc5b647c5abc991052fa9b8cf6e32f6d2d8fe6be6c7270ad5a7372529579550121d38ba868a65d4ce861563dd2986d3743ff9be24c71e308d7920842069357f34149ea1c685efd104bb5d33545c169e1dcf82e043bf48c72b5da09adff405ebf61e22c2bd5646beef3bd59b04908ca8d157d52844b48110b0d684a288753f214805df9619b0887e9ea3ae0f0b56ec9fd104ba0442eb482da78270cfd3bfcc65a298d5c3afa5ce0e7d52fcf0d025904dd8729025dc137b0d62f47d65d81c851a6d95d9f53f0fa80eaa307a028d3fc3dd6c8bcff24418ccb301fd6c77a0c90c057ad58e6be97ef0b68edf7d6bacf3e0de9209a1a62f4e1a3e72a1861e6de4d2a5cb076983ff8fad204890c531b6599b995c7ad9151d17d60cc0348d151d1a28cca1d96284886393a25e9aa59e7d253f54a1973519a955fcd479393bd74820345521d657a1086277fe9ea187de7b8cb370687184717c46ff6ceff33e008cbc6e4b9bbf2b89a433c1e77db763a9f32e8a01ebabb1064ef7c175f9ad257a22f258f00329dc20786a5314efc822c5fa758d7b4fe9e07511bac7e0a7133f4561362b57eb40e06b485a19d8ae700606a026418858e3f7a08c41ce202dc6c8039144737863543e87de39a7bac6d28b2093507903a0b139b1653e9c5dfd996660fd100d99d357ad8388f797eca09c7f88dc693d343e4832a79163ef078d0931abad5c0b00bb093d4a200a167585704436d5da0491c18928841501502d56b72413094cfe22e9da35e1880022702e08de16839e6fed3dcc0b1168493b91bd86a85c9fcddd855761727c8a636160edd641b56a601c1d004f22c42a54815f3a1101cd0e729106ead29b856707e621b3a9f699804f0c89c889953b281dba0d1741c4fcaf944e11b61e63db06699269d6cd1cd28768633e60596db6ffdfceb8cf9b77d41856cd185b5958dff855b67f39c2a37aa1f5dcc1b656a62afe034f304b51f94f3847ce73e53aefdaf304ab1fc724e6bac7529dec5afefbc800d2fb054a390befba4ce18cfb2ef5c75cac8f856fbf88ebadbfdceaaabd4a6a3fbb17d72baa8090b464ba60dd6902a404e65d676ad00e0447d819e2be19d7e8dad26150525a06a0f8a04a6b7c2e116e8884ee923f471569bec3af4210115e090026c80b84437792ea12fe29f5f08d16ff74d6defa5f372f3737054557ca79d0531185d17f990803b210fe26851cec60832841ce3c690ac4f9c7c53ea88d173a2b8ff53a47164af35b16b6ef25b7a003d93bae123d64443223c686a95903cba6cbddc5cc702c277110591560307f479b1d1a32bb0c9170ef23179ab75439ef834b164c4a3e71c9d71854e65e99a3c85c9489593508a76815b14bdf8a7da4bcd64eec94baa08da4dfef88be94d92b46e8e0a7d3e9c60a598bc200ed34fea73b8fbca9957de4006b07e8625907fc6e12d917f745f0b5c7d1e22dac1defa13a89195dcd0987c097ad25c919239c28092c3078d0e355006ea8c8f8ef617e79570655e847d76e148eaacd75c0906ad5b783d3e0fff3636fcb6504f508ea7b82145096461c958fa71f2560aa4b6fab13a78081007a8e6fb42f634078f08c1985310c978b04dcfa0105df593c0cdb8b42af2ad0e59cdc0f254a711f0ebe9a15308a5bc26846c0b2db2468b54e27846870743c22918008fb2fe0643789b461058b2c043186e24e777685b218f9150c6e962914780718306a47a7f0622762d47b1c20ccf1386adef216ca3b0efc12902f7ae6bb851cd3acb66bdd538eab75b3061232f7771c7c0e3feed3002f03d49df8c8d3b8f0714ae5a4317e44621f3d775703df6cfeb0865f1d81a8bc6eab1a8e17e41148bd336c073379a2043ab60cbc138dcc1b9890a2a8f148c156fff54d9ebbd20cc0db6804a99af16d226eda1b67bb106a7afaadedbaac017405d927bc1bd1e0927d4b80387554843852fb7e9d8504e2dd3e30794d3cb117c914f97b2e0bf850115a8fe67383207ca6bdb9b615a0146cebd20b6f3ffa016b0f7789350ce0c407012dd45eac9f456d4ba8e68497e17e17d1288ddc8a501c52b62a2849906b0dd84fff8e73959c39a197e7042d3870b846e056498237d5227bd2bcb6c31f7f460070e5195f31263b8348c209b497fee87ff259691f38516a8d9d0b26a88bcb0e937530d6b7c526d8457208f586958dcbbff089d30c39e13890c23def6f82009ce4685ba4dbf306a62e56cd3381ae14a66282f0816cd57f7e53965073f858bf7bd898cfd29215c4f19d6454026566f0b25d0c75e9aceac85c1daba9996a708c211a28f23a6b2962327edff83aec9df61225cb6248ffc1dc8c394444afb8b25283bc121b69c09d4e0c5838b588fb7fa1ff8e0bdd641451135951430fe6429e4005dfd8be2e18ed985d6fbc9b2759504d1c54614bcef1bd44c1ae4b556adbfc026b22575b35fba80ba56a49b96ae09031247e987f06056ecd3020efd28956757459f5168c5843d86f02e5648423b5bb61987a9d9229c77c0ec9b968cb90825c42a679076bcb84b1a2b7d77820eb1568f837852b511fe2c72f4eb7cb06a031d88366d610860a6ff544e1ffaf9469443f78b5dbd7ca90b81e9ba714aed374de0a682782ee8c7c995270b3338306b7ddf249122c36e2fc5b50054ef9440be7d56803eaf291f126527f3c15155219021a1509c59a2e5ade4f16ede6653d1f96c46a41c8064f99a4608940c1b3505c9caa59faf1384fb6e625d3526f254dc824cd6d12d60f4cdfe6188a8f3baa70c204dc136e9273a433fe9c4c3228df4059d9b2c5342b6d2158c103f80410ac69de72745900a1ce7b405e940f076d1a3c79cf0ef5c0487abc3e09a53801ca3b9826f60229e3db77af2cf7ff96d6659f799ecb1ae4730fc800a6de542022f4ffb85c17bf5e49b9016cafab39911754fd093e1d53e3af7574b57353df1b22a9d82057067e82cb043a434877a201c45d915c5802a48cf2023b621b1602b4905a4d139473d23ea93e56f8f7faa8a6765f0964848144464384e8785801d8724eea1f438a67d462531196749ce9bfdb8271f01e8a197ec9f3d5018109a7934a1f96a66bf0ac94fb6fa37d160280b0dc08243fe533d05ef93fd8140242765ca3824ecd2ff2e35ff6d64160e4a64020a21ae6e2a4e5f4fe231f2d221f69db3d5c327777ce7363fa9fbef01da01723cb77c462471c0499d85c98a8a2279ab3d1da223168aa624388948817b70061060d339452452ea051695cac7be79d7a85b662b1b788d1a130d5078c32622a6503c284ac0b90d5a6aba42cdf230ab44917bb4258704d16e0ac85e30efaec82b8e4cbd654db059b959cf5e1d9b6d237172a5460c908d0a3734fc0e0108782be6cfd58b75b6bfef91e006ff2b035bbf52acbdec3d6856d8fe0ea8038818a0ba89ed62449fe58f543355c37f15d8591a8fd8f38ae971e08a69e099a35e6b7d607ccf4ef300793cb1b8e5fb32f004a404b702f3b8495a01d113a1bb8327e8d56836fa91b02e1e92063fe258bbc71a73b02889f902e32b223ad1fe4e4453b2c4916551473dea9843ae59e364134de0adcaa58920fbcf3137774b8c62aa315a850e2b125bc031f86241aa4f47efcd5a8cf126a5bccc576c7041e635bad847d72ef5c4be36a5e8e266a18b5b34179acb4c95e01f9390fbccab87e1f8346d041ed0c3ecc5f27bedc55140b0c97e6a15edf896d78b2374e320200a47da0a9aee3b66e03ec8ba78bc585b85b7aa5be68de144d2dc31dc79e199e21642e1ddc9e3de34c60544b136f7e3c5c2661339ad8ee6e204b512cfacb5b6aae5c1880aa2e3d47f6bff1839d5ce1098444af69b3017d6c5a0a289916173c34595f89b32bee3c5c8c20ecf369e95ae6437dac7b09719284bbeb91fa12dd1901335f3647d67cc68da251cad0d2f06bd2d37fabe72acd0f8ce1e74aabd225e34b3fe50c8745b08ade0fa2afebb01aae882831d182e7670d39993f4e00101d84fd35b1ad15c3ff45324dce23761c67da76dc76bb99e570bb4e731b477d9c8c0d73b6e84a5a7a8b4a2dbf23715c50ee6226e3e931e32071451d49245b01eafd713effd6760c8746777b9e15bd23b9d7712e51bf5a54f0630621aa830206b46d81d543ec9eca824520453abcf635537ece9663e5f4fe3e82515cd52e9f12ac1205943c2992cd77097a895cf815806b80e9011894087b1502cc3078793ed5806bc54cb61b0113b198f2f1d5f6ff87b7a283e308999be6319b63128dbb8e56b3f7ec6b54e25c8e1c7186923c5bfc0c36f36afcb4198d79b366fc5b957e365dfc4fb03d8fb26ce43651f57ecef5e38b388ac7992fb6176d90bdb33f461a0b27bc9268fa3103137750c6ed4a76b2428912193e4897f269703fea5ebf7a3cb05be0bdc444a5a3937a9adfcb01149790e9c3314610e94f11406a748848be652cf1cb46c1e67452642076684999233871b6cfdc69ba02d24ba3366538a9a44cc052f50e9e825b6457ae7586a5f554c1275cef77b0fab5a0ebe26eae47ded3099c8562aaf56a78b78db4f231caf74ace5317833be84d2aa16eccfa1749328d2e73eafb4f815d6490c3dee3d5d8c37e87321ad9045587fa1eec21f43d3f9488400ac39eb5803921671a6e224c1e67c7b3759f61ec257917bf61f8e643e85fa05e199dcf1f76a043fdda4d19068c4326cc71b464d667d752143964bee6af13114fd04690b3a5d572e3a209565559698a0a745adc3a327f5b4de68d39184c0fbe331d0800b406061199a31d95fb11699a41a7d43a256ea8b499b9015574b3944c48008a9799186dac7a6b2f905b288463231d38112e94508ad68cd76e355482d2409b1141604c92995afad1c0bda95e07b0a97d30bcf61371a01b8042de20287f2cb91628bf2e6c3a3c3a4e15c2d6c9acddb05d26460baf0c9e68daf4c29027a63df9b6f8d80cda300f4450255427c2d26785bef675e1fbae1971b0518617da8c0008e3d7e47f59122f9adba2fa2973819e9e44300cf5b9d28636a42bf26202cffe9026410b326a0bc8dcb4c07ae1bf5e329b7264860f55dea096b0272387ab996f9f2da0b305ee727417574f50630ac448fde7659f71d6284070de4d261c4174e7b25d390f77a040b04f0904df12e02692c8cacc0457e716a4a4d6299a3b991806de68ccec0206435309b6c326e6683b22c52dfb8149608e043f6e9b4cf5a6a1876a732ffc58a615208d17a3bf3dee7b5671951610ee50aa1041e2f2c325771a8013dd2559724452b59d7f3411b1668d5dd8b73587909ec5332f8a4bf57d3bfc19ebb663b7044c50bd5f32b82798c664323be378edadf27858e5c47ed5e76b276bd259332d2bf641495b189b9bd0cc56a691da8d549af903fe3882070adb5437e63f6e1308e9c0b6070a4f73af4e98a7018cca05c0ec7bceb565d281f832832daa84c2d4b4943bbd02b6d844ddb8e96a0c357bd8d7f1f4df515080edfafd04f17c4ec37f5581e5c6b791f3803ab88eb0ed816fb179b14be0e290c2c7a0e85c842c831693fc4024167900da8ca059f625f15f1373dbe9370b2d3605a4648c449d4084b8e17ccb5538f90be20f85a7c89c9c7c7aa4465bc52d9e223fdefb62a22e16e3378d8dc7fbee462c2fe7324137e9468717d996b254054c9cc90ac46cba1ce9b01909e9b5c652466bcf1bfa623cd10d7d666714939cbaedd05bca1ae39d2d8b871ee510191eea2df5c595bbf5e1019adfe840700205e925a3f58f931e5ea9f44240cb427015c0d44e07d27a0c457223843603980f8d12e86b2f8b51a638ec324ae7c1cc664fdff8280a2a5a3b55e26779fe86a3dc42f3d0752ea214ca60202e387d17fe0c8d09f2f0f1556e138d7ebeb27e2e4d6e7316a983e2fbb2734ba4fa081271d3db566dfb9fa5c8199fe4fa172e4ccfa1eb68d101882f5907041609b25b0d35dd23b0358cd405c5bdc04be6a5f83e0b93a7fe510893aa12a848cf7f7c57fb60501fb97a39a0aed4d88cb2dc00070103817f48ad95602e655e4d0d44a415672b3bdfb3c3fbf3eeeabbf5bf78f345cd9538a7c0ceb26fdeb1f208e125dba6005c58ed36f20464a9f73ae0717a3d8d3819fca385e4af6f80806ac0f044bbc808a05c57fe49c4adc3de860231424bce12046c876dcf745a6abc0e9c03a087dadda837a58ed7a214695beb999860cab8e6082169c7f641b350e6438d50458d9a39013b938ab394adc03b79b8ef97702059e64c16714042009c640968063970e3fb85cad2ff6f345ac8e6d0eb47ca246b5df934492cc85a57803530b2ef766d9f416358e891537c010ed9e96e8ae87b415b7c62dcd2f598625a7a36820edb43dc355285587562bad08aa1154f175f95aa0b12a32f46f971dc1dfe00de101e405ffbb390adc1f69150c960bb7572917b30b73f5f6f18d34c810fed12d3622c69300d91ef8bd41697e8e76d9beffbf15222edcb922d639ebd144712d6ae7274d67a61bbe2ea258637845c7c17e04ee31219eadbc8a283c79a8e15b259e63cfe9d8c1f58639e819c2e9d0df69fd2cae6739d8674919b656a734d15fb42928507cc09a6e5550fdeca4426cc9852be7f3b09e3f36137557bcb658cfbee7bb5c1b39a241e572c7693d6daf0819d15346acce02c85ab23d256bea97feef9e995f61aba53ad9fccd54440b374b00a1a8562e0f0a3046435c1734fc71409eba6d8398205362acff8f5b943e69678f21068f72756666322c5edfdaa6b704e517493512b524e741884dd1c21bdb07968f6ff9930e8b613c0ea557b126064de20e87cbca39941ad89cda6d0210e43db655518cb6ae4704909bdbaa23117aaa824d586cfb3f950ec05b65876a6e47c2ba9dfe202289a22a31c81189d1e15b74c9fd0c7d7b63fe33b6e646f6bc982e7aa3b4476fdf5bc35b3c5bc2ad94b3da90cc2b7c661520562daf0bc1671e77ad86b4184d97aa7504da786cdcecdf1609a780d24558cd02874c3100b0316f0082086008c3b2f24b82b828018aa3c0fdf971e298a5e93a7ca27b1189ff20a638489a4d1b3484a663e28d000f9b3050d5f38447ace7c9caf50c87019d3604fa1f13a0a1c6282cbf527f1f9b81e99e1144f2e979afc011d5818d42f20ec009beac7e6dff00d0d02b37c42fdbe51c626532974965629bb524dba0e145362c9e708a0828b9d9e1beda8b7974c2200720d1f2dc0d79b9635ff58484ea92d3dfe12635a5b1db73ae37097472ed0ec97a7dfd404e50d5e30fb01faccb1945e5c72104e4f5ec486a13ef94bd4af46464ab064ca6790b561460b77d491666c16fd6dde829725bde6cede895dd3a6d2d89678eb61d6745f6caee4bbc79da0d82bce4a40c2c1f848bf8cd6439ebe552907694210a6ce2a90345edc060bf5305589e7a1268f85afadc07a74e39d13ed806c1c980693ed2232d226991cff7ac555f20fde22da84f24c095b8a8a4a8ebf0420adf1213bb8e53a3c2f4c316503b8f812545e5d98df522ce7370f2db04f56f9780f5359f80be1f5b8e5bf34b5d873e3e201318f2d44bd71ae04466663be46252129341bcd61223456440c269a3c652da4953ee33762e2622c9eb3c22ebab14918f46a20be55d635c5f8c32edc37b4f0ef3cf55ed3da210c66190974548e81510c247afde322072b9e3bc4578cad29d88fae32b6dbb495e2ef9b728bffce48a83758e94b3ea5ec800c71d1c3e8cc67948587aa764a63f784198d90cd473be8bc3dccbc79b50a5fcf174d5f209ad48192e5ff1d775fb7ab1df158fa8c2d610a04c0e8e46ee37b62b367e685b9d5539552516cc1ea13d3cd0fd1739f50cea2ec82724707ea85b8fb5256e8d26a768d912f3ad3b655317b2fd8673119446204893c8d10ab106a40a417ff488fb06288ee9a6b4ef1914eb1630642a8080bd9daf0fd4c3635aa816cf05bad3ee3fbe763799ce3338ba334457bf6b6a224d7d2c4f87a7233e279cac253b134746b6d6f3f5862fdd88ed7ef10797d5e0b63271d9ee2f008117919494fb8c63e18038270b1e579a256008ba67e633dc9f884b1d53cd66cd42ef8040c35669d9c46eda6e76183059de0114ad4d6922e26f471cc30b64e7728d7ac9d9d9849efd0f3b26d372216b7f7381d1de57f492f7b05c69a286d362043f64e24baec47dcc29c34f7f33c06f75b1425f4b2b11086816b27bbabed9549960afa1ea8d12bba2cf2f7740bc56b40631142b3be7d4fccf21ff042b09d2d7601cba8d4539d3f3cf6c14b6ef9a7267f6f13656a09e3f1a711d8e77a7efb36cf18c438fc41380a150188df80721a709b87e6043d0dad2be5a10d17a4afcccf9637d670c6684929bbeba0a636cc02ee4254b479f5de3138ff88d67e3cbb902a50b3d2d4e59a2098dbb574377cd4cdb491aa6527128ca02a0170b30a8ec8e01fefd4ee48e7211391cffa43ce186186844d293c3394ce32cfe887270ba94f228fd4b09d76b0c2e8df3a17f27186c069fea0998c6353ff2a174090f20722d16f3effa0d7be0eb6fb47b0aa83dbe191a1d4d589a27fa2e682df24ac4dc6473acc2ba9ea871eb2f4188ecc609b5c609a6f1235dcde88c30158cf7d665d2bb67107b56eb456ae9d89478896804320901fe6c1782ca0082d8c12bb13fef0186fd9ad4007c3ad3ff3a5911d7dbe23a24db07992d77f2d00f5d136e555962a25ec9a7454a1d0a2b6179ac504f8688d9214a3fa0b017370d677b55dd8df9a995ac103c53ced2654854401d10b423a65dc9a62cfcff5852e2b96521e6f4219a861215552840ec9371b8d5d5620df9eaa276216c72a52877920e19edab9a9ca86cda80ee68654c5166e35bd14558c2d819edb370481e1755b5f1489972efd8880d229991d41de9c08a0f16945ae9a18630a9c289fdd38767dca532788a2f4a8b747ce000d641d49811823d6d6ab1c1a99ff6d6a9078248e15411b2741d85fc4d96fe660483ad286cd4a4a4c454160149fc5950deb97a3e71f94814326be10db23dfba2f28b6f23ce1ae6dfd8be4e592171a36620fb4f764a64d25f33d5676656aaf4397f42abbaebe2c314989697d293b0043c9040033f589a639751fc10e6c52a30fd5c430d1b980c882e212ec08cc884809fe54d9cf784102c6494fffa04d94d679ec5668821f6358378a65f4c2a618333769b80ab0b6773110e67d3dbd7dcd1992b9d68fb2933ce18e182af519eddc322a38baacfd56cb5a20a7aff3b08b1a7ac8255df02d5b098b1a666ba08891196e4148792b672795520a67c1b64554f07336310e022c4cd25fa8b91a67884c64edd3ec5682d407bc509d2545c351ce4dbcd75eba0db830c74dd3f6cc62da9af59514ea4ce6d9b7a53c02a60800c0503f2e15e81978d8d44d76e0939d6cbb0f729cf98d195a07b7ce53349076c73e8ade0af187ab1fe73ff4790271814d0e2ba76e46e0ef956092fd22a038f7e659239f41d0fd5859b76be498f84bbb7b8009b3b21a5e64b19e221710c529a162d81666ebe8588e69fb40bf277c87e1ae3014893cdafaa0551d04b285dffa1802470ad3830e3d07dd6732747ec666eae59fac78fa8a29a6e4eb7c006d07dd9b41a982d9b1c6b302637b7955070031c5e171e97d3814c886628d167420ee5465bf4c52c85eb002f441e258c7518c5dc39d8de1671081335b9aecedf74141968b6c38cd39e2d1ccb46484911c4cc5c7e9e4aceed48dcdb1ec3c21cc783bc040eefc7b4e77d5c51cda2f24d0fd491447669378469d1162615d762e9ea2a81cbdc0319850a565fa3616d27a57322c7587342908dc6da12b5f54026bfd6f3183c82d117198621a94e6a4e525228d6a2a4535b80f6c4c645d9381daca64d760005b31c2dec4e1731ce11dd71320827bbc6389b6a28bdd09446db49b3af1aac15fff8ac2f08281e0cd720bc3b2e38376ee01fd37758ddd9ea74014298a2b7fe086c9981c2999440c67e69be62ec000287515ad953d1deb1d72746f4294f1df785c041d6c9f21ec1242d019d92a79f5dc8ac575867b1a61f1503e3525e9df015e7adc094087b1118c189036bd0e7079801637c11409d4e53dc0880f9d44bb851e19d7047f05ce4f71341af43db4e53eac1e664511560b0cc887a14d79e273124e4e5431c50daabdf506d44acf5ddc4f4365228d3af6d3c20dee20f583c68e4d91beec6c48c1df3cb843cfbb322a6f375e4ac09fff92dd3095490f4d04ccbf61ba92d68800dff32f424a949ad5129987a4606297b1fa6de7d211956eb6d45c5c6f9d171710a45ac5ffa00afbd0e4adb9cbd5e58a343d76e9c3d0fe031ec36fb9af08a5d7c8145e9ca54df2d69ef152f3eeb4924626044030e45b06a374cd54c79e041b7e84d942e71d8b451aa739683c2a817cd8ea83a5e717a1845524104bf958ef65e807f9052de41e7060801b7d52a94f0ee04130f9abf12fb012657655bc2bae979d2dd009893fb195a8e88507e2d3cb8d3190741e125c3f82174d1d38b91adfabab0812721209b9d107c7f441082df0cf8c4b8632bf66dc18ab0a46df041a2ef9c55896a4072a1fc8323e45c52df25aec0aac9c520056460ab0c370d8594a9ca9182e3c0d9725199fc439f361e2ea8f4adcaaeaa81f7c4aaf25891fef0c760ebe06c99ef8342b865ecab5132cbea6cad177bee8cb8027db38158546c5b4a7c3960c7a503671d2bf72982814cb152dfeba15b10dcddcb3d348ea0d2aeec880ae16c067f68fbed4dd5b227de1e719756316fa432f91dd170c13d87b81a5cfac5cc5ca4c5e79e312348ec49d1e5bc843a21cbd4e1b6f06732123b922cb8a234904b459788bf5626e1bea6315e556386484231a8d3ce1de1e4e190a0d9754c385be082c51a65034d6ba19ed21a105bca423c2d0e009af1cb7a711d5f847ba4f5639ffad2c6e95067abe0bcae81a27c3b79c66c5924210ca6aa8cc9e4d432ae25e6d316ef12dbd78bb891ee838c814e1eaff065e1598289e96be27ded9961aad0bec02d6496756f2f6071c3d7b6c6a803be07da37ca09bad0a01d450d360cff7c713e91c06a4c4644d36c5f5db58f6e657974e7309b547c0711e4da73e527d9500f1a69e0b3c96e14359a39ce1148700e9e9882ed4f2ec6eb0686f5c0187128c852b604edd002cbf71d3e13081756c665f0f91e7cdae2aa9c53fbc8a1b68c8f9953d433c5f4675d35a6b1f12b95c268862a26d9460383a499e5ef3069d884c099e8f3f853fc268dc2560904e1321043a634472d689d9967feb7fae2dfb83ab2c54d192e8a5a9463d8dcf4acae9fc8ee2537322163c83cf08c5d4f2b9239f49dd7b7cd9efcc60f60db0761172e88f85a724881708b84129c1306cdcc41ef1cc44633f79f6d95305a3d57a73db3c80e5622423fce6727b3281bc0a5c4d90b42e5f77f5a1af859e4d7ee11b0f1b39872b7da86595181569b76569431e82c6e7d727051eb9bbd41e951ddf7f8e94652d6aa058f0243834152c0cd41e533dd4c2577ecadcadac8862d3f09e603836ff78a33dfc6412e55d895ea7c093ba7be1965941404a0106c4270ef9c8a0e1d8bc69e1b41b9e76fd8480ff87b3f5b0f8aae9894ff56380c68eb0ba2ad6b0858f3fc8c4756a86c8e42407a5254d82af82c768a51482320f87c8be3b7e104ea58703c4f989d8f722d73b627e98fa82713fa3f313712380b4036f8b5c1c83105ce8510558d108019d3ae7d4142804112f44bf920c9027412586558438587df40399b06c46aff7f9e8006cd1fef5b4b0b110917966b8740e02cdc3ba466f9b4e854bf51db3ce5aa99a61c35ac578890d67bfdb5ce64b824b0cb42dbb54bde47be20656055ea3a7a9c60338691b6b869d3c9d52901498fdeab7eb08df0c8f08c116572048deb9e9b71326adc3ddf0152c06f6211f3dc0d97e00570846247c78a01662f22feadd831da4d529d83a48bbdc20b0143011b588b1da6465a6f7a588c49d63f471af6b8c154126af8cd3e424df5affaec33a4cc32ef53009dbcd1013ed73fe4048fb6ea251d711e06a0379824bed104557918c90566437b0c4f85546219cdbc0e3402713bb90dd5d7a2e62d30b7a854779a74da269cf0c3951f5f2772428d37deb44c50797ac159bfee1174cec664b73026be37b2bed9e1b339df2575406432b957e426f5eeda5538d28ec2d5220b25c9f06f764358d1293aaeef851cebe8be503a57a19d5117ae080c8b962185d05ca3413c3ded5ed67247c9b64dee12196f33056977eb18c5ab325eaee15c660798cb949f7cb8768c4764a5ecf98245c544a19eab2681d8b120731aa3c8ea175db70030275068ed4df8a26c6211ee68aa86c7230cb9b03f553b4b57ac157e87850a158a592d968b7472b06e7b6548b841c24169b6d8085bc3840c2e6f048ee02342cf9328a17c283b5d8cfc893f940b9b12b4e674bdcb5668ccf9c8238847ca3ae65cfa8272c98144504c64c43ec684d0272d164e60c851911b4e78d100abddc13cd7113bfdb64b6ba7876de4414d57483ab41af0c5079774995970bffe2e7f197b3001e0e794772c32c8894c007f6ef8a8db80008e492082cafd31092a23b3c70c6bf1198260aae24b0000dd58784e81ebefc10aea5451b1dcd91e8fd345d181eb94ad24a98018f8021700911ec5bec851bf8f5362f2a915aae25795cd80d7c5e85ce4c51e82cb76f72006ba487fc3cbb5790f457e724f7e605f0b6fbdc189b759347abe52becae47cade498c42d9f8c44332a3f08bf05d89cd30cea525599a796522a1ab841bb5e7f0fc6cfaacf8b7c5d9b79f24b6aa1bb4f090d3808fdf0fa2247dd14ec97cfbfcfd2f7697126c6a84a2f20782324ba694bc595c760ac5d066f9966d2911a0b9f5142182570dec06590ab8f9d1de44d929c287c73228865b1ecbee1d8c662cbeda52bb05ff11c738b421e1048bd6a25367882753c71ef9de759504c2c16d9c4f470aa678ab7e86e98262fd6a2f32ab6f599d9e08968a00302f6b35d18778533a82ebdcb5bf43d71c95a67423077046ddc32d850949cee9c03cf06860e75c6bd3b0ca5fc2c65c031b1c50ee1e3885f37d48ad988b164853528970f3db4565a150dd5d7dcbf8541a934b89ae5b06b92af86d8783ff474ef9c13b8d4684e5a37a6675823b801d346341ad471c6ccb936eb6506eb7e71a860b3a8dc76efa6d5db1ab5e404920cf1243058abe211f94c123238d05f5a838c72bb2c5bbdbb72c4201c0e0eb9b35038b9e989fead6ba1b9c911768fab0aa180eece4a4aba7da92820eb4d6af3bd5e2eaf2efaffa5abf2485fb272c80c09e1d6ee0451b6c0545df4ee42d62b6f1eeaccdd045654360d3d27fa00f356fb09c5237e138f6113e9eeff1c196c2ae203196a07a834b75802c921f43e207f8665c82dd09ab42b82f0c49f80ad20ed44d12700ceccf67d9b9b5f6fcfcccac904d8ba6205012fb2c7940800972bc4acd0c831e0889fc2eec05141c284a63775c552526bf67ede0f86a31fc24caa7336e2a594c92f3cb37d91d7f75bd487524b3a9be344adb076d177a5b4175f10a12fac385a29197b47dcb29df6caab1947d82709e8aa8a255088f1b4486be9c1803bcfdf5082582ab4e7c76d16d8666e9e569d6a35a8985ce20d8f7042a414823ea7e21ce871fd5e30c1f121627e966d609b487ba3bd5d28ad94804f10f7d590fb3b1598bb3f2ab1950bab7f41a4abd55024cba9133387f2042ab26a074b40b9d529d8086de5468f4d22066dc5efa59072b8460ec025179912f7b7edb7c84a8ad4a4b79bad3f8fd83fe840c70f8bc15aa23087491671993d069478c89d8183123e2c7016d7c39de1dff9209f889172f0ae78a1f963190b4e66452ba893dd9b44be7777c536dcc8681d7b69238874dd15a478d0644e87e7be9a19dbb89dd850a8eecdb86f39addffca7418b445ead342cd34b4864e3b84adbba5178e7de7bd9160d20cd320dfc361a621670998629674632679ead157d8df8f91e520a6030180389b758321f02e96545d4f5f2a48379460edfabe1e039ca84671923646f360530eb75043bc472da4182044e7a0b35eb520f777477167be08fe6393cc684a4b159c60f5e3e8db8be29653f8440a65241eb7e3d073ac88b4a93426ed33cc3bc66d052416a5149a09b17ec49d7b006ebeb8954fa93e57480da97cb4c9e705d52d51e43c9212b9f9e014cf5bbe36d4ad22125a1a64d44b53cdf262ec965f75096cf14e4992a259e9f067c9d75a2669a28ad9d16511166f94bbb295a14dfcee244abfbab1827d723e435c2659528fd8a56f4885b67ed98d1342a1e5062d942b84189b6ecc992877f77f299282690dde287be9572c4a1f4f904340cc795148af4de37ab73cfa181e83f6adc53b68dc140e78d118a287bb03261e36b854b02b72c40c76cf7ca08e9dc23a99e6b9156d495340e38567854467eafa6c45d058516c9349d3ff013a23dcd0f2adf54993bb22bb3ada54c752e77503f14908299c29f22ef954becd77c39e40f91c985b73854bdb62345109d40ceaf430c409aa5ed41d082343432bda9f19c02fe2b15591f3501cd2deab30960820bac495f78a280f6f04b1fc6601fb3e9368d681fab9e72217ec62c95964bada63f0317e3108816276f00d4f7c088a94d9d0e4511cde4728b1a428bd9c3e598f39ac1da919530ec7050114e6a8a904da4dc4b2a6be8465532760b4500d2f24046d563396e4d4da6575420c4ad3b1c0d6fbf241d31ee8b34e5b31173fc5f9d9b87f2037f82a7a3e5d07d02962cdf72f68abc752bb2044fc376676a1107221d24e70a6fc2558b7f0f644ee99c30310168959160e88526cb01e2101edde4e1a7d471b803105ea92ac9941bc2928c4ef31b2e0c8bd524c0154ab3cc112f070999114c60c43dd1e3534c8680fe72d3ee61a1fe3fb9a4e1eeb4708278fb4ac09eb00c46e51d6309b55a78d4ffe2ce08beeb0f673afbbfe6c79f91f03fca4bedfa79867b77420c711169d42f76ce95248908b2b7d75a6b3538d0ff52e0be724c1827dcdda4e853724a21c67e9a6619f712e0c89ac887011773dd5263b3aae40340cec04e267ed3110a5700f5b3068fa451240cd83380f35c67e927535da2cd790b0760d41676b73fb74b9904e84b978282cf16797acf4b3e707fb0c91463c153a6b9c15ac01bfea94c2fcfa915239e6d61660613bd6943bf460ffc6807f78b9962a68eb2f2703ab60bf748aa94ad53524cd76a062e782e17adb08c542890131908c37dc761ccbe26fdd931173291129061dc82ce72b1428bb7d27d713a42590e24b12a5b24de8648f9b757c1301038e093c4d633e2655c70a62ddd7aaee004409481a646fee4a07f01262461f722f1c7e5e9213d1119c575a9263b128d6ab542598475f84b188f6ebea2c67342d2572d1eaeb9a8a3a1192fd60be1e3b619b5a5d31284b16c1df96f2335aa766ebd0253025ecf10affdbc333783c05fc72d94acc66995aab583526a7f01640749c5ff449ec91eb3c462abc14b5d8554bf7d711594e46a52219c3a98333168da9e4d72d0b8b01ebda5a1c862cabf3c361d7e1c68f678947ff961ea111cdba3a47b293c0aa1f3f380535e202bd744b9174fe44d3c26b15298a111917de069a586bd35f4f01b96db7366d1db740719fe2cf6f869346ea08d69f106624b6dbdccd580f1c547ef9d3f67b2b58652aefa7d467c615befa835b35494ede8cf1471a83948857cd1a297ee8477060cd94762a25643aabd722965e549a43e65e783994f5c621b7e4e5f969248357dddbaab55442f2ae4c1cc1cb601dc28c0f830196101b95d50e53910c69459e28b6dbee899c70a5927d626a6e98a5f6f45b5cf436c35ac06c36433ed9027581eac3d70c9c399050d826a0732399479c6b8c21e4d6232b508ab2561e6a8c32d3089a854d4f03440b9ed8bea05831a3aa2fd4a11c08bcb980eae98d979031c86ea0500f0570d39c79ed532b2c16b7cd7faf5a648b1d6438e4623c5455e172cf716abc9af2fcc06eb0f4995af1a26430d832efd030170d9d288422a44f286cd7f30de117cc17a1f6050a85755f6cdd491125ae7a236ecfc33293ca6906dc495aef080e3722e4e51db69f4434b6c7ab58a431eff2b08f05626f9f53adfba7319c8888cc6c29c821dadf6927db0d8c1528e14a118ae7e824414f757f4d05cfcc1ae0d14c9474a54615dd1b83a15540b3935cb2cf63c31ad80046303336dfd8c029d4796145e593f3be1908167d672217b977a85d61c272fc4f9f5b852d384bf84425c02ae46efcfc91355f7505f6f1e39c11ae53caf74b96cea99cec417cf85db704c8e98ffc2401cb532e8a51717ed62dc8046f7f47de29903f330cb0a78d2a2ae3dcb6d44e1989a22567055775487a0228c7104c832d6dcff0992a76e1de2dea54ade368b6bb9070c831b480a03b4ae03aa8a92805a30923a4a07c266a9d1d48d2f32cfd10bce09c13a3efb635496999d64246f382f07946e4ab130ce9d9c1245051ed259f461980b1440b0bb3be0f1a800f5f9ec1b8ee519bc26f0cd3e0a466d168db55f1242c8de5b6e29654a2905dc07d107e4079a03667b316643d08f5e8d7f04c6f3c71b6ec118c3e41947430c6192f7a63d5742b18ffb23862b508cddd78394446a58f7ab9c2ed4bf1f004ae83e9f80b0e49ed61874bfb5bd7f8f0b3deb83ab7f90dde1f7d3fb6651fdc436a4a0b1867f0196677bbcc66f14d56d5afe27af614e09d59effe3519d6784df7f1cff1cfd113899c7c1d1bc089cea6fb8d4b338d4dfe066de863bfd9e7cfab9756d2be7f95eebe89ca9a594520d56831b00e7f8af0e50fd974ff87c543f096075bcb53adee265c9c9aff16b715523a564a30302a279fa40aa9779ee58b283c1b4bd7faa8cad63b1d7bcb3787b21f465be46974495f222f3fef1e536c3b1f8b79ff9d3ccb3b88b61fb19560ca63fbde94f1c0bfbed538fe2580ad83ef52cac8b61fb5411ee58fa78aa3fcaec6040bd0cc7d23415c7d2683896d62d605da80e0828f540320f6402a20fb4fd894b0fb7820c9ee38fe22860f2a496e7782a2985d49ea790aa77b1a4f637f6524866cd186a12b44d92f0d730e95aab470f0d35fcf05516d73099424a21f5ce1a3109aafe292ebd5353fd6f4e4108505b6a9af6bb3e56ab23bb0f7bf8f26773dfc47e4fd28857d9bffdfc909b754ffd74a8c6cfec1a4b52c003a41e6ce857ddd76a8d11f046e886ece790900c3e4b01f2e1b3962584b59d100937c8da37c295657a21cf75ff86d4cf871c6b3b96a95340f6d80bc91efbfd1ba26c87fd0d51b64ee6e96bcf25d8d79e93d89dedb5672206c1f2a85e8b4255dcc6d1f5d6a43da784a2dea43d03f50e6b385e5b4d6b72a34961fdc7442b6d040e3e0ece5f048ee66fb8996771357f8353bdcd69046e5d2c1b1ab4d7bcd0a0a13a7e993a24daba361bb4dfa449250495a705b00bfbad3182ee6f2a2134eddba3aaf1b03adaef498593c6415bb780750101d13c7ca099f7d7fe7ff4ced69ef79cc75fd31e06e7493dd4bec5f2ac530703ed58a68e6512024d9f84e6e19b64ba2433efffe36210ac8655ed595bcd467b198e4f5035f842641e7649a26c9f047b99df3a21f4bd4b92ea581b7d8c636d1d4b01d9631fc3fc547783ff7cacbb218a10fff937c0ad7d7ad358487b95f635b497d19e46fb1aed6d70daba34af3dedb7eedbd3b4f788e8fef755839fbd0cfeae27d86b4f9d67beb6385a37844a897d2262eb5447e8bdbbdbddeddd108d6d7158f66e6c5fadd6c74a87bdc3bf5a7db16234b8cad5aad50c815efc9fa946864f40e0d04f40f6d73b3ea18d027cae43bcd904eff80990fdf55d6293c9e1a774370604433885f243df240e42354e61a5139065ed7b85cfddb209f0893061288cd20b1889029cb383a047d34d8d02f36242788cfe9c695ec06872ea20899584ead6fe125b6a7910c2185534c20ae16f186c16dc856ad01116d9452c043e8db969ceef8751e80aabc7a315d03501360edd8c42d462c623cee98f573077511bcb82c266142426b52430f37752aa5add38ce92557b2df0a048f55feafe5ac17ac71750d48f3661250a29acd0a1458a2eeaf71e0f527c4142181aeb5e9142a946dd2b55bcba6c3b24044b60208131069211105d96c008428a0db60885390ae345fae0bf418c089d79c89388448184422b91dea150240a76a704159bb06554df58dba6b9bbbbbbfba64989adab3564d909836075fcf985c4739c65b852ae5dadac42094dbdd0046593804279eac4fb3f6a4fa4774e3b935ddc12e9be15e6330b628944f5e1cfef449c471e2965894a340ccec340708ef3b09e124c44f5bfc105e54964897e12ca5196ea502413478e791f4e85cfcc3d179a7afa342aa68c708a637f94bb1386d29e13f90065ee5e72f204abe37209890495ea2e9fa8fe5056678608fac9ecdd938cb43f91de913d482103a5eada92eabf1f03e554e84afcae11f16ce27837442ad9d008ed07b9bb4f9e43eb4386c37e6ba1ee1b5575d3ce0c4f17e1547f212c8296b450bbfb4f4c4626a9ca30f6932bb22c2dd0aacb5afd3a69a67e9dd43ae09cfe65aebd589dfe16f36a6ff53e8dc4a5bd2cedf51113506cc0047c1d7169b24493e44b628cba288240b5e1cbfb2d33652720ab77ee54e7b3bb4fee6dd8c66d389b67eef704847b9fbe21c2e3789fb6e1a5cb942a4ee453a04861028a17eba3db584fe8f4292386f35042f9fd3f9a316a3fd14c0e9b4a3dd708837e3449153e4d127da649fa9c27e19d83531856e7786b57ef5c69756c48413f4804abac8f1bac8f0b70f5ef158f2fc12a0e219118f4f3a529b5bbf7695fda1ea7c6ef8e87537aa727563dcf025e592cf8cf9fdd11afce04c75a82e678ef372568c4a2c62b6a090f80cff1de679c8b69cfe35c8433285717d39e0ea784c8eb28f224e85d3a4f743ed6c17d3f55870e205b75b87565bfabc30f89a60e07b14c191d9fbd0ed7a123e3d7c1f9942de374bc0dd91bf10a24eb8a607548f63c7e4f2e64dd10fe5979e4e0f72507e2018150b21310e804022d814110a8bdf625f87231edb52fb1a238f744e7b73d2de0958ca0a4d3417716f41a6b9525aa02ac70755cc71ff1aaa3fbb82b82d51ccfa33be23547099d03a0f3292720ac25688ece99702895338342711e5fc2e9be99d37db346f7d1baa3fb5695848ec8899cc8219118076aaf9f0343e77f9088a877bcdff1cd100bcc028fe096dec9f873703b3a235e5dc767dcd68d49e0e6e3e8e098e3bac3b7eae8bccfb2ce888fd13bee15c1aaff11affe42fbd324f58eebf8790282f3f35404488e4f81ab0e8f777c0a5cbdf7e917582ccc21357e7a1c24da5104ad402c300b091c3c423a75ddcc8ea02ea573283339d0edbf5ee23858060747e020161c1ccc028fe00d0703d0bf3d08dd610f9074cfb95a6d1610426feeaf7b42dddd1eabb3efb9bbbb3bb7daeb02faf343b84167870ee1c464f41740a8028f0aa3c71290a0fef16184533677ff119650ff7dc064e639e7c3495738b567efcc6e7aafe4bdd971e86af882cdddbdc5c1eadd5cbb19ea1021842db07ce8515946d9c24f8db1fb60ada147e5875a7c9c1076dfbe74779f76c7a96bda9cfd49462aeefe081176f7ad2084f0a17bf7ff488650a07ea652f479c861843f218c3395da8a4205d9223fd2a53408218c8f42fda21e729fa9a22087fac915f19f1630d521a89fbfe1cce74cd3b2149c1f3bd47b314666ce344d3b6df053af71964aa5521042f827769fee98e309c8293e8afb5635facfa74f3bd830c6148a937fca4cd996695996650f3ff36afc19040163c68ca9903b99468547b84e54cba0e0fb539f91f8198929a43aba40b269650a2f957fdb13902ccb789be9671ca521cbb2cfbae959cc62f6dfc799a7794c3e0d37c3e5641dcb94bd4fea3df5a9d47fabfaefab4a3bfee99ea57e53dc4c7d0a48aa9bed699feabe9ff3d479f7ad6ae6e31bf741ad9b108312460821848eea298354dd4fed8effeef06fd190931e3f64387a927a1eea8871ad20da8af0877c0628eb5a96416dcc06582316b12d8a58672456d81d611610d0b1e2ffd4e83238a370c326f4cf5904e4f424053fc61863c45041688591fb68c560f711a9a86e08f6f0b713b7d5b9f7dadb2259b7683ae138374317a41ba59bda1c8c1df6dbca9b9eade977378dfff419cbbb15b61220ccd0e9874ea7a1d3d06968f7b5af937f84727ac9b113fef63c78f2dff8143b2b58b80825697bb18bf1e5a37e5ba6015faca038b6d2a307471845bd83fa8875b03d1fe745aadd3275dfdcba8f6addb7cabaefbdd6d7c3c305bd2b85b34d9fd8983163bca8f2a591c8023666cc98a42a53880f7f8f1c8155764362373b13d753cf6481f50e225a53d7c8092f395054173837a0292a869c8882074e4061e4841427a078ceaa565b84ddb0bb7777174ea1fc11a7b9bb7be3c0a9f2cc165537e76ed45c9d9e9387364946082536e1ccfcc6732fc30833a9f58d99d9dcc3c7e7bb973f31b9dca8d8f9f0fa8050e3cd07eeacf4591d3e0d61dba23beceeeeeeeec141c769cf7377779feedd1d9fd014c09d1b1adbc6f5d0513f969752b5b72febc79a6c454a9e4c5b9097895ab665dab699b424d92908949981ee30721014c2eda7c19330942788eb45cf366ea0c2776ce3fafa568312b3dc0ea3c466a66da6132a254fa64d4b5199a8655ba66d9b49cb646c647667684c3172da7f8b498b5b2fe6a8f101fb510f42639abd13d75b1febc3df447b47fb39b5f5e2a36ca82ea776a47a94356a406e35985c2bdd4e7440d58be4397de264242506d51f7af59c67e5a5c287d03b6ff579efc52aed4bdf0412c70e4b04aaf13fbed73bcec4161f5e31c698a28184372958c10152404685464d4851210400528ca2831a7fc608446a07721345118c89611866840ed00b2f320920fc0b21cf591530c13245d00b3a10328a720586bde005946c8915af48f0425575af5041858e2639d8a1036aaa7b858a1e7458a808b345961d7604218b0f57b46cf12920fc1b64a3db0e39c112315e62347901e10a32baec28824e2e3845502c0b0ed09919901003287294e1840e2d9c3c690209127c40675d23274c72888062758d9c085db13584ddfdb57737cfc6baae8e84eddd1dbdbba5d772f7eeee5ee1a8bbbbbbbbdddbdd677b7767eeeeefd07b3565e376984539258661927f6f7ea04cfbff25f438b39869b0a579ce33bf559fa747cb0a505700741523eddaf7a147d3894fa8e5687b914f51a6fd8d1ee8ee4a2eeeeebabbb77bde30f2e73ac0dd85b20474773746087b402fc618238d313a74083f092184d07bea76d12403c4ddd0cb863061b743092726a310134eb8ddc229c484136232a6012726a310326213ca88a511a58c981070ca28c48413a691069c424c382126631a7062320a41a3645b1cacdba17c69dc66446a9639845046c62633079839c6283138f422e28502af75187af40f234ac02a94ff6a22c3d11318e2901143432c5f4db6d486ddc7599af4effaafb2ecc9733e3d3d3f4f2af4ee8e177d603c1417057e3d99455586188a35a17f4b1676017c319173d24c1910e6186a02cb8b0ba433cc50f064c834ac172740bc31b364fe8da2628fbd3c01c1268f016a2401076aa4418dbb33801394589ea618431b74e1c1115c348d94787d592daa943fb9d0aff599867210802a93f0a1cad5ebf57a3581104208af28a2065bf4f00a011a492eb8a542082184b05bcdfc807ead75718b597583c3833b50bf1e70b770a972bb48b9624490521ab14532135572952294a8f261ef4cba7acfc88827557e8fcf0a308c604a952f030d5daa7c0a10f141958fa488335e6182a254f946239032244495cf477ca9728d90a0419546433f54c9453f54a130a9c27ebd5e2f2116c1077438451d4450397160ced9ea9646f403a6c45066d4834cc2cbbc824924013644183cc0253944108070389320f29c050a810b4a606122021786948c8860e2032e90e0b13e65d1ea160e152d41240051139322b49060470bb4b0808a162b24a880ceba57b458519dfcc0835b6120c5171233590ae8f77740772ce89dbfe91dc05240ea51cf825d0ca96e3d67fb7e560c5deb86e85ad30bf137fdc602578601f593932e2014e7798e179f392433a01cc4afa8fd02d6a5753744c13e861c434d188d719d5c2b44fb1f17d609e93f994c26d909d992d0eec7b54dce5d7c6229c05f7b07f807f0d785f8e10cc9557caa03d4efc6cad1529535a0419557ec7034a5ca193056f850032b7050a59c09431f474b962a1fca255a64b66b8ab4b4a00a332a5c2657b22c5d809044338b10e211564510100c4042a80a228482aa586208061c7154c50c983060e85545172360c00892260f584719a3dc2b3f90026ba42baad2a97be50747f47da83a17a42d7d94e5bdbbc6d24134f1ef7d49f5f7253ad0ef71fcbf9a40a9fa9f204b12eede6321dc5ace43c3b62dedf95404c8fc14b8622fb34f812b112cf256de82af89a2a795e9f5e20ebedaf30a8920d13c751f357519e755bcc8ad3816cfe2441116412221fe26def742cd424413a37215ffb3eef388daf3779a77acfba60c751e1aff1923a68c13ca04c74244142a9ddaf482a2caa89a6ff535b89aa5a1c6eecbde48aca86fae339befd3220441e76fea4ff1bbbbbb519d35973d2a4619971845890004da3f7f67688f7fc8fc6dcf34c3add00294e16890400d44ba9ef638e703f4e4e3a93fbd4f9fb814c7f22df529102c497dfcdebe4bfdfcddb4d4776fa9674e3d3c0149d1984040f33e3db7b5d75e888b344d4e3b75dd355435b17f7e0dae865371fdd9c71390d36f274e33714662d53606d11a3bb1a07da4e9788aa491d21e13fc2d16d509487794de486eb5c488da910afa3d0faf87bbeb5134d3a80fac0f67951750d0cf54dd43200597ba57c818aa01a86b24051337b05b3db752515854f937d42b6d1962c9480a23aa967d775f8fda3944a83575ffc45f7dc8d03ba6dfed64686f59e80a5767bbaf067f9fc64ebf2717b67b727aed7d1ac973f827dd9078bb2ff3fd39bd39ae0786eaba4ae770134d9127206d12837e4d5499a877aaf44eef8cd13b5f4f2b89e99d0f12557e72ea2edd7dfc7197ea12db3094407a418d1f6b7026aa7f3cb1b061288154a546d8537aa77b12f49c18eaff3594cadf75807a237552a784424ec55e1ac9959c07be9cc710d31e7f7b3d3f9aa705e85a210829d5f909fdbc16b8154c8054bdfbda4b0f6e99faf4e48887d5fb9c184a450b882d6aa52076231194f41da03b23f515cc7ca0df16f924807b557dd8bb7d8d91a5bab795a2ea5dc5bb266a0f28cb01f5207fb5e73922a0de847ea6128e68bb5011db0e31bab22565250a1259e0ec18909bd93df6f6a2951c56a9c6e701bb5fed807e3d35c6f789cf92b227fe0f2c7e02e26f8c3146b9adde89336812468ddf233636c2127dc529b61d120551108e82202508c9438ff5015b3dd6c7fc7d245e0fc0d81b1880d2605545dd6fc00918781866075833303d605dd6319bfeb3a81105bec1d9f5589d78020b389b131fc5c5162aa7da9cf8262ebee3cc005b55840d7929c308063f3c218aa206318b25a8482b4e20a59432ee30bba316c8e054850ca4f4f0c564115c513f8fc70fb6adae11152f8000b14e0c2a5b761c5159d7888a961d6450898111152a58c0ed8a0eb85851294195a96b44258827b61d92654b982661a6c42ffc36ecf32fcef7b5fdfddbe797923f49ec2ae0cd15d8d581459254cc8b78c59ce32a5064b3ad5c8122a6d5e9dfd599ed417eece14b96cc18f4295c7c1b9899bb21108b7fc46bec3e5f9cf6625b1cb844bf9f93d2cf6b0faaa2e47662179ff5d9a35e7ee4248d31a2663e8bd94cf6524bbd4f4738c3eac6aa06d27c8d0bf1258a66094af3ac8f9c05bcc67a83f5280e4636e2b79b9bb7e1b6ca1bbed141bd0df7fd541b1b1b978adb8a925c11d52f8a8f1889b9b497c45b548faa5145950ae553ea86e25436a050a877543744feac4ef3acc88aac48f337ba6d6fd5f1a0e970bae7cca01f1fc19f93d2d5eadff336e6930a2e040df151ef7cbda4091bc143f0790be42eeca4c25775df4f93aa7ab92d2704ea3c370fc3d02f478d5ff3db1ecbe6b77e4662653d7d3ea2f93929bde176cbeac05d9d9a8ef51f37398246bada3ceb371b6e45bfa036ff511554ddaa3dc8eaa84dc702ab5b1557c37a71e6c05009590f6f3ce4d23b360f9f937a67f5f0b94befd87858e3a1eae1b3d2167fc5dde88c7845d9c8b7516d3866715c6fa0b6dab05e1504f52a5567c43ba87750ac1851a8467d2fe91dd4431b1bab4f81ab0debc6a7c095f53e2dabea59dc0d0ec7b3e178ac6cd4e07a7c54dd8fa882f0551d1fb5076772a0341dfc196e06190ea73df8944b713db89e1f3e2bb420448669e2a3de59b8ed3184ae1612e1b5f1fb7e0afc027c668e0cbaef5d8f1ffcfedd11afdbf524a01ee1f57f38ddddfdc4a6226272dff5fce8a9fc3fd647aa4a77a6964ce8e3aca3687bfc2a1f2c969ed52a95b4645b9c1979aec43e05aeac2714fe9e820cb18057160bfdfdf4736450ee7aba1e1e8f16f7a3bd0470000677187aa77fb99618d4ffc3c1e99d7dff652f8173a61650ed0b6a02ba45f533a1f61f71eea6bdad05f47b6f2b1c5377570c47f81c6177c42b7746648d2f9f65c486c487cf2fb92df2294804d36060a112442da12e162a4e2a15a06a425d23a2312a6c1ea028f08d78758edd11afb033222b7ffc2ef033b3c45ee008a97b609bbdb3fb10426f3a970772ff300eddddc3b6cb03fdb7db5de82c25969bb78038babc775fac3598ea0db6f5411d42081d42082384d03b963783b1b1831a7f4bd9e8c231c6d81dcbbb1450b5bb5d1d6e252db14d4a39b1aeb7d8dce4ddc7a3ba2c0109ba0fdf2174251bdc18639c9ee3261b3ba0fb8fe3f19b33fefc9dbb1b318f99bbb73afc3e0de1dc186334ad8c11b6331a2b19ae8c74ee62bb302e779fa97ad2b638322efc85cbd0979c9379d1e51c6c232ca13b6df0ea786a7733191b8edc6020842ce572df43ec2106a1c619cfce210f107e2ba8a32e96a030ea56170b07803863b5288285280209e682082d588822b6fd5ab5a7eea07eab3a3d9fe6812ac460053af0e009a03126708151f9293311db3a8f0d31bc78b96e80c0882fafe93cb2630991d9cbff7169a9ff71c9fc8f8be67f5c35ffe3aaf13faef9b34b82752c21d8e9b1ff71cdff41fd8f8bfeb854fb356c1851fe1a6ee539fc2a8eeef044d0ef7b5a4bf46bade03960a8899301862754e328e039ccff61e8b7493169b328c5072332e87de2f8092f4c8a5c590f310a5cf98d1059254602d21d921a282863711e5633abe7f7cff95a9784d5affdba66c7ea2459c7ea0e06d38f8b9d393ee238299b016d281ed110d02b0aba566ab0b4c186d04d2f1db65486debb81516a5643affc9ca577160b1050e5e7a3de91a90dd43cdbd1625122665d4322a81f2b0135513f1653f9378d253542f7da801e1461dc8ae1a48c2297e4d6d5fc5bf9bb5bc21c14d4413816255dd4ee987d0ace82b0f44054651af0250b0ff50c0ab6c5f95e66c6b98309bc7081050f30ca1c044168629816b50cce6d5707a3b24b01bec669fe3fae2de3340e72dfaa623854c93d4b4896699cd669ffe3fa71f978111e33664c1a557ed45e58d5225c65f771b5c0ea21a6b49a13db814ac815597fcc3b19b95921376b1684ba452e4924a38922170ea73192f4162f9ab8706801b1f47245a1edb119564071e1604210907200c1745972e160021a2a20726d9ff0996074018d5c12f6419825170ebef3074e90a0b8e012683469cf034010526a810d9e3841113780f2526206563ad0250b145e04135b601973c5920e5828a103970cf8a00653ec808a2cbcf4106d0083194b5c714610b0e440a98bd59204144864f9c1103250e22e38092aa63842e30a125b22171fc8b2022856c045090a601091941031020f50114612537c11b7204207465d682941142330236af14c3063f12848dbde96b66186c24c552b2e44f533a9e8aaeb5ee1010ade7b0b18638c7d02321feeeeaf9b70eaded46d75cf0f9f04ac70f24e021414b926e8d7529240e7784703460535f9d7f261ee568f1eac052697940abfbdce1ef2c3771e96c7a548884108619775939ae4475f94e2d1e1872d55efd29e27ad8e63f11c7fe1ab3c0aaa5fe6a5ba6b9c07e8278fbcc8a33529750ecc450476777721dcdd5ddf2e637717eeeeaebb60dba43182ea1a899952dbc8aaf97f986dd854d8bac40775d59e505d715c65faf74457474afd6e6ee040d7888ba1faad6e5657be2c5502d4bd224650e542a8dad435423aa26ea98fffb73d0579827538c8c7bebb13e247f16fae5feded1b9980bf077dbfbaf68bc585eef7cbbbaf83fcd47efece61dbde767f987fd8f8c18eb009c00a271cc50baad4fe4c750b56b209800a0c0b6323931333a86dbb6967987677655e98843142e9bbb3777677a7bb7f3e31cf73d6dd3377775f775f2c8d6c17b6bb8a8e8938bed0ec0b9d15c7178a551c5fa8ac38bed058717ca1b0d23138bed0ae4c02ba8fe30be5ca38bed0adeceebebbebeebebbbb73dfdddd555445d30323f417eb8add5dc8ccdf6cd52b283fbbe68b81daa92f304a2c72bb0a4a2929f48ea6f6963bc696587cd875e43e19b9af3593545177991c380787517a09d59f84eacfcb9b038c92fbbcc6126ae43e126a845fa109665a7c0c54d8a19c90d25a9e6c5bad0abef67beaf8f57a3116a61d8d43e23944c2c8d8e470b13727be6b47daa4711916d8c78f2ea15c150413c17885602298ae104c04532318efb23d41762e29a58440f54cfb6cb54263b526943b37f14432f94155836a6212c61ee7c9f8f57aed0ecbc33f2c132d0b834918fd488a1f61711af8a8e9aa5f5bedd70868aa466b29351e68496986269f369573d3b46d297d4fa3147a804f27931697b0466e0619caf01ab9165680f247193d5a65b4e4a908570ad88048194a260e499fd08f9d180dbaae88cdcc9a4ce65f41a6d353315acd9642b23a9cc9d87039ad1e55cd4c268e4ecf312393b1e12adc22248f6466ddc464845a90ac4e67cc1c6c6f91206955a6cdb91dbd338e1fb9dd1cc813c9d4b46db58525d816e76b6e874836a7dfcb796e6523e34355f77fd63b24564ce80f3b4849925239a986667980a2c4efc07469b04a4e023424d540012f5e252704861964905c027c8a5a58e1478f165150e33ab0724531424408bb27cce66d0d15bb88cdcc9a4ca6c67936eafd6b9b89d7c7a6ea720daaeecfd9d3cae16c32550daa1acf962626233cd5a05abb5ee56c66b6cc52b0249692b4a37e2c25698714b4ea1d922c94b9b58aaa496da99a16aa1963db21465a2c0d61e88c2086f02ac3956a19ab14c64ffdf62ff053fb5fe88ead34f11c9ea2e441b4c7479ce44a47b052f5f8fb5e64a118858228aa22542fca82288b1b54676e17788743b09ee7ec0e2f65b258edf79f3530d7830a1affbb69f5a8310507cd1585251f22d55854ad08e56c0bcd037b05a002f078cfc7480b24ea1a69b1a4fa27a07758fc3295a6feb8dcc5dd9a96e784a133a0bc60c91656a070f1fc003d91f4840b2c72d0e284cb9f4f334e280bb110a320df9f81609ef9d87f4c84c7ff184a9035c159d81c2c6858475d8108fa3152f5d22318511b60fd18a9569e9ccd11fa54cdce4a3150490c4208a39432be00ebec20354d259482a11cdb37d73c3aca4f6ef2ec7dbe6f96da9aa856abe5ae753ee7142cd0018018aaffec72ac4e8c0e8010f689b12d4cfe9f2afe67aa2be3c907ca368428ffe6b015666ef162c5162b15c2ef1921c02d4338d307bae2d5c4c207269101508830274d6092ac2202df09e793242f9db3f59b148b1a046182212cc008410996b0586af244880743d09bba461ee052bff71e87a7ae510f5ebef5daf5de65e685cddd107a2ffbc22ce0b707659ce17284ac14f8ffe1bfdc016b1db0d8e1c9154b6378d14106a5758dae40a25760e9a235a8b4cdd74439cbd09000000000f314002020100c07442291382c9a2872acfd14000c748c44725a2e1a49b324c85114649021c610020c00061800804c51cd3608f8454be9b6dc9c8c32c9c2cbffc9021d1e6d7e272bdc10fbc851c87304a94bac24d47ff6e7bf16690161dbfebe0292150bd1f3253c2a1d4af056114f4b7fdfca17487b1c4edb6de2d16865bf950f89044ed8a8bb2c665d412730cbbb7b1806466544251c2f6a846d25bbc63056df68146ea43597d278086a937bf20ab5440627f27701783c3560144759347cb0284aac7a963e47c732dac2900241abf6566ba8835e4912dca0179eab0867dd628791b2ba0768afd6832fde49889e4965d4f06f7974f5c938c13b893d64fa03a30d13a1839b25a48f5f336819a456648ffcdbd098f64bee005cc76cb04cd841ad8a165cdfb28fa8e3be1572907e8af07266bca2aef898368301dbf6b07cef0dddd2fc8100c898dcc4b130cbf4820b92f01c648172355e90c88e5fae7f45b1938f6058b4571d1d95534ab89a3137b5f85f548bcd522a8ed970739430d482cd284317d4449ebc304072d2659ee9d42a4ed97170d324085a62e744de47adddd34d22d126d389cdf009a2ab0a67e7b830f1bdd369f876c6241d4ecaa977e07ca0bb6e67c6133cd6e386c072e62921c94a6f5b9b5b752f4f9e8420661ea851dd2df887721a72e4d92996eaee47f2eb42f2af2affa9aa5e3aed091d2d86931166d5ea784fd7c7a3aeb5d2b5673827dad6a883ed5a2b06f69117c5153e97bc0603a82a2c1595ac85e098a2960456f12ae8c9eb29821eb12cdcede45bd3cc126eb93737498b650e6000dabdf4b7f0fc544aa28c83cdc08b682d142856e1ca873b54b2a8f0942444c25077acc2c02eec20708c45f61b778592ea2e943691e296f5b9cd18750995544771760409c19a5b1f4ae08b0d64ba23c513d491a028e7b60b8c87f43ce582ade1c211afc6c96ae087a908187d88dfe3ba4e771828be6e9764c0bc5e5294e2babc772e05ddb0dc3da698510575bb785664620b0551f21328ced70ec940f0d3ff1a2390f568ab6c4f6c2f5ae56ec05a922916f143fcf4ae9e13c6390350ca853b18f6b1117577378e1b9cc4186536db8c6eca6bad3208d2bc8231ea8e6aa28de1148896d1cca74c578bff01fb90fe4d4f7401fe4646ba15734a3d2170230be93f11cf6af6a2200d7214407606a6648b8e92c20d357ac90bde14b575562db0c36ea5aa1394a3f4528a625e960146f47eecb8d176df996db4837e128a2b3d7ede29352e6b9da283760e8f9bbade56a0651a468a9419545fd5f04a06aeadd5c94d5b28f491f922fc45d563678156b753726447b12d7c9b02409acc4177ed0ff62bec0daad9cd8d5908e1e3264ccd5db207db66edb602f8b7e0708d147a1b9b3892634595424f7f8a61f552e683de03902b26470a8a5b33b740ee7254615da9dda6e6c547ad3ea29a5fba9555ed5d1a8a57a0b19c23a46c14b1758f8ebd4b7f619878c655644b869675440a862f891290989804325b6d51dcf2b750a51ac03998a67faa21a6da1f602c6f929d17229369574a3bdf18c15148ce48e71cea1cdc9d1aa80d98f45e11a0bccf9c9ef971773dd2a082906dd3986721e2901ec30ba5ee330f1bcd6b916ff6358e48401ba4c4d836e0b8d0950f22412f9ed7478c4ddad921c95489e1efb501ef2436a3137a7fe98b5e561e52924e104a49a7c68b928f1027e57e2ef6a5da2d08e6f0aa4473c88fcd617706824f2d8dbf940a586c743fa327238664f2d6108046b1d5357cb8d9e93d3e56166d9f9fc37eecea8bbff1b8e0d0e3198da19609d06acd930f17b767b8919caf1eaca55ad74fd38fbae059e6e046efe94587e003d10336bbc1a64d3e99b71b9239137c68379c4c12008bf812bf8954998c4c16ea5daf8513b8f609e19bfbfbe21701eada1eb1e9c5e956d43d2353fb33e9a884a912c24a8016a1fbb988da2745315d960086463e4306b65c2b1bfd90853858a5acacf1be93fcf125ac9d9cd552cc0431d725065044bd072b7143bc433b3e2d735ef4d0d67b8bdfc6ab7dd02d2e86a82c9b912be7245f629c4d6a83041d40629709cd87b7efa90b8aff3fd65f3ff7ecd6015d1cfa92a29638e1c195e2ae6fde63d9443777dfd25872825a0bc1aece77c6c9f4098583868338aed3b474269010381ac0196660036089821747fa02c0bbabeba3c0adc3ba5518a6e07ea686582bceb2f79ec585e12407cec6d3ce987c95b5016c23e92edb45f4a18280715812e5f6cd7e5fc43595e49a3c0802bd88311d503cf7637fd4c6492e1462b7df2528bbe40dd129c6147a1bd7a26e03edd6023d016f02adb568df44bc95cf64491fc76b5dcfa525a5bad157a78554faf9633b16be9f150da24877bba625c6b937074ab177efb1c3a77336a30f1dd25dae9dafc46b3e611c392e97c176c0ae4084663124b8c7622cabfcd29cb900b1404cc44a45c5ce2ad130af2e0a5e4b7b995981082b2cd478c5f5696153723cca173725ee6126368f820c8a349a7b889e3c9335108f058e45def14a31ae6bc9f12bb7ae101aea6c86fff41ca215d44e78ba5eb377b97ff4433be5ed6a536c99cf9223f0d6482b0817e9e1fb5811cea57ba61cad12fed75649fb4f18c1d2a11cf9c82fa6e8b7463a985c599cc5f38ba07cf7f271147398c91b1a84c8a2490599b79f95fe176cc37f517f9b873e96bb6e0ba75333b7a56fcfa436a70e7c51eb60967fc80601855f4d3db32a50f69446d425db4dcdc177aae3a40080e6b62c072ff860ddec901ac16aaee8416f17e241375fab53e772191944c59f62f26efe5653f04a202471173cea2ad3309025edb94cd30dd262ba82df554ce120f99f331efee3d31ddb648bf935acde1716f331ac1693c9eccb0cab74effb692203c55843a3a17e60883aacc8f89744d42b83aa5e89d51373d800389ec870c077dbaab4bbb378f90b388da8ff980e41ccf035739edf45b92448ba5e6b692cc7076d0fa4b457318525c8a406ce4cb3cb58fb13293c230a2d4f1f30fc5e8e006786a7787dcaf1462ddb68218edf353dd716afbc62599a73d04ff3003716875ed3035a50904db6495187bfc809f92042da2f8447827d038e7987523b54dccd2704b0cd6088ad09a2a46881d1207886a36aa679954243181cc844606dd2861a15e6c27e702a66b05ddeb24fa29e75e78abb1322de297a276fc43741871d8e34c9631acfee654cb7794acd25ac770b53e42a531404dc8329ac1212adec2c2bce331696fec93beb76785cfaeb0a631bf5aa1696d7d812f354ff18b1ac4ffa4516639846bbf52f51893b66d55af1efd903e986afb255c4d881b58294fdf50990005477e8a72b5d607538fc6d2f54c9ee0a4cb9e75069d19117c4ea5bb7ebcf99964b7ad8174aa10b91f2d9929515fb094f10decd513f24d9ee1980de659aed5bbd3068f5fb69ccaf19b1b47b38bf968cfb667ecd7d96363986f350867a090b716babd598a174d81506d14f7e601ea9398763bf3f4bd7895e591a32b4a4615859b308c728211ab59b6569ee69b6099cb8ceac7a59a4420c6694ec32202273ab5e27e14a9cd6de8d669034b60c6193eefe1c86b5845513da624e2a67eb678f309737e81f6f9915c855335b97536ef0816e2db43390e020601d82c49685584f9198e723700b48ec723165e5bd2b8f5e5b309141ca9a9f1b8b9f6b419a97cfb473942d3caa6b0b5827683c01cdb8f5b1a34c8206363498e98f967d3705076c68ad22ad87c115799faf041b4781d0eee30bee63cf47bbcb91c213aa01b49ebd283c6d3801fd23b0db52a274a7988798101870b1b98fe17d0cbeee734738cd20ca4e40cbdd63b562b551a7276870815098f6e64cc5f2a03af4421ee96a95dab9579b3733054afe58af238288e2956560c9c5c26a8fc3dd10f1f748eccaacc9912a30c283c4eb8449ec8ed1321f977a6f8760a5bc8a6aab37bd87416327d5fac3e306ed073e6e7a13706b92c5ca9fd8addcedb0954409bb1adc7f1a1d6d0fadbd071844c8bc1175da4668f7d6cfe4dd6fd2eb8193da43dd80328d439c2b7900a84df622d9f31f91a9b798dbcc96b531c7ebdb3b9f212dd286f37581e234a028ef5f2a9795e266a4266b80d89281fef6f1f4693e5d66fe62b314ef4518258e128dfede6e9e9504e741c35f1cab6d2cb652ba7ec4365969df54e78cd7883b3d4f1df55f2980ea6ef491f79f81c8ba23779c7f776cd369f576bb380c7c9c87fc0bf934d8585de73244eca9a01971733e8290bf69847b1198608d4f252b01537cd771490f9db6500bef2dce30063ec6a68e313e1aa89c8fce4d80be9318dcbc267caa40cf27230edb3ce06b4acedc85cb030e7d565b31c13b5e8fc88282ded2bf360d696001ef9f8d069061d8892bd6dc14419f7f543f4deea65c6ff9952afa86d86f7219d5e2cafe05a5207851d1ac8bedb2a40cf6bc7f6935c6c50f07943b842c8e4f7aa5e3c460077d17a65468534e1425db977f650ec11fe637018debaee59abb4e75f015771c3c04949f4c5d04b283450d57067235bbc5072b33f95706bc0948f40137b30e0a5769191a58d7cc953d9c667c33f27fb6b6b1c2a102dcc4dc1bcfe65ece08bf89c1295c30b67ffb1b28affdda6bd6eb1293df2293d6a3dcc6384b73bedd7c4e6b95f92802094fe0f3ef0252ff68c4a8a77a97020d9236b8da15f2b2322260713f99f5102baed1243729fe7a5cc8c5f8c51b317ecd20fa2332f1923f4a6ac50c3a8f6eab34659b705e76ed66cb15b395733193ac73b3e33dbcd4f47313bf3bbac0f98595084864315b569ea4ba0fb97aca7aaf0f4267d1bb24d2458a5fbfdeb70f6df5af0c061870088fd7c820110f9491e825be900a4e48419daf95778a00850ec05ab6a0f3370f118a81cb971fdf82c8daa695aeb962da9b1510442ba0000addc3e34e9b9bd147a1b6013d7f87280b32f3ff611221f1ac0a74c08156a3c1708b92a34e54225de76a00c4f40e2fb4b0e4ebea58e7ce2276d9527e644408195a07e7896d053a7b247dc3826fc733b80221082aa34e3a872ea31f89fa407265660cfee9df8eb8c62b95e874038799b1075b41e1b86554af7c3ea6ce58b834c5079377bc221e9813065fee06991945b100633ee44465cb44698354836503880b1706524746a8243da50e7714b1a1c9bc206a9265469c7c68384d4a928d58836c610fa2db4af209334e9121d093b958734ab06ebbf04b2b3bfb9982079c3c00fcdf043c27fffd52e6f71b1f98015e6ffdcd45a03cad677b6006ce4820bd042d34b06db01e0304ce8ac401456f957da10fb54a57093a4c6eeb650a14cc1888158c71069fb1fba720c7d6da01faddcad804323ad1161e0564c882e25aafbdc6ebda98563b9eba820a54a8bb70186802fa2e32a3dd33a8eb9649eda651ad5b1f1bc5766894145991448863a70c47951538aafa8d95614a7d3c47717a56877627f72200bfff8bce919170eca39281b0d93814fc7e01f1e258dbd0014301b61160a78f328028fbadd6b4b05dd9bf95893cb4b768229e217455c450b42910e88fa59dd5f7fa4afa0ba8ec5c4e1cbbaa3240b22406474520d2adfd8956b1b6c6cb1da4f38049a061a61e30061d5bff3a83702c0fb5e43ae3f5743df472643814b6a41564fb3f47112a3d39ccb2c105969cba7b722447c4f98a9cb352a1aae4e033543b51fa198c9664de6e58bc9bef12f11663c0f8402fbd837868788d9ede770ec77c05b579c96d1278ace364ac220e9bd82740c3edab123943e6aaa84eb91dde306d5ed2b4dbfe0e8303e0ac584132596510079d1ba3b002e0f4035f21e7b3822a1e69e73cabcfa16892e4534a8327d1da95d5dbf105f074a5301ea81a25a47215e3f4d97c023142c73b464c0bc00de2738da146e952c1991af025206633228cd8341adc50ae6bfbdff6521ea2c6af91b9cd615e314242df048a40c3ce197a2263fec00fca30a4dd2b639a8a1178ed7bc7e43aac299d5128903eedf32dbe6f89136a69a040f320acac995a771485645c410199fce88f2caa3b9cdf7a2482173c06bd6b5e7b8dbb0e8c303508d1c4392ed5d9fd7a1d1a7e88360b42fcd5446458cfbcff3807eae61595940799e6caa330705aca4d764e7d015057082fe6448e3007133417282aa54c88037e0447aabbc9515bbbe0522128e4e83347e6483cb9fa13d26292b2336cc1243941a3b2e2b25b61be552287ad5e9a205b61b52c1e05d0e70235427a00a56e3731a0676589a077bf03ef0fe5b672d0884ca8c9eda31673ce4f58890c2d9cf729e0dfd32a6e4d7497712b853d873e0164f220ac8d0e232108a009faf5208b9f83c688a9c0da2b5d4b6ce982be7efde272a5b8cda1841977cd7de5514c8d9571807a7c6de0d9d570ea1eb32e42a8075ae390c8e7c31177ec965b9d719dbe56cac89fa402b09278fdb4c2edbd77d8fdddb0efbdc2fef7cabdcf5383ef8d5ce833e3a298e12ef4aafc886b0f16106167aecf760a6ca1b1dbee4c23d8c29b650904f0772d5452294f0cd89ca57e9619074a28cb5828187340f02419ef270c2ac48cccbf16db4989c341ee589aa4d242d793ce6280b9594684084826d84bed924ec332a745994fbf1508564bf02404353fb0c667f7c8b87ce5b4edea913b365dbc047de59c5ba20559d606987a1694ce5bb8b9d13dd65db0c3e06f62a4cfb75e6692e3e50f84d3fbd0f437d9a571c98adada0fd6e08d4099b41048ba0f76f014fbe2a8247b26a78d2af14d442dfbda7fb49168510234d6c39fc8ff3f74beb6e22bdca555a05c996d1b0618d00728eab2f92c8c436115c83af7b20c54754dda65de0e9566f0d827d8a2019ae12e7218e5f320197159d8b986272e5b798d78e20674a72409a4073e128fa596df3ac81c4a686256593e8faf083c33d9f3ce99501342140836612d25ac55093b2abff5eae0c4b435a42effcad9c861b89d605d1bb145de6ac3af20f5708b930c949ae2f4d52e1dd6b97cd7baa248292fdbc4ccc217e8916d7a7c072ae6816c39cec40eaa22241c2bc60d50647221ae95675d6e1001f600b32f5bffcc5f6aabd66956e1e2af12ae4c6f48b58d3a207334c0687d4d9031df7b2892c5248ff694e9a2002b830b9d4d8b5b7685fce6e22e55f8fea77b617b1b436a0f60daa9055874d914f5bd3118c9fb30b6c06d774f3811528d8be0c18c7b71629e70f284546440670c3f22293b361ca90c334c33c1a5c54593a224628b4199c0b7b4e3af27ae3013c70e8f1aaa84b4c58ae27b1c104fa7d95b2ccae1adb9e3aef915e377e1c40b341942dcb93bd982e56d2bd5d0306c3e233156c519c3a57296b0b0a4005f671bb855a74db4553f856544ded289edeff67431c2f5acebedca845759d31d207cf70970ef0b65c703df4a61dce48070d50935366a88397445a4146a5e88f9b4eb03a9580cc099213defba8ab2443ad8fb9f6717461b95ee9e35252648a4c3cea63df1de4009d471c463f9887fa88f2b315a14d0320856adfcb08b3be40a57963cd13c321e3959d0ae8fa4a053251caaedfa6d072f4ebfb7e288758c5d659e86f3f8741f5e2d9ec226c7aef8dc895c3d582cb076147528fcc8dec1ec25a14a7d6cd9f67951dc63e822fc4b46bd1912e4264c033ace7db3905d9ba59a1a13efd1729745bf0a3d7e4254c50c56124f9cceb2f00e4a666dd0a3d665a45b4123fe9d510462b105a72973775ec9d77832fc9a1ddaf4d2517214e83d6b3020cc9d6149827d928b35410de88b7e8a4d8f0a5936fbe1d552c37322f596e3fe136f203dc1443bd7a586430c8fa92505bd51bde3466459554eddbfa3157600c153d78bde71268b3e709b8c007d3113021e6570aaaec7489af1b233c7c99e2730d3e20e81781b53aeb63da24245b4c93e816f440f4aebf0d017815c55d2e852f601c95f16ac2c9bc72a9f2626e85941e08237c8b72683208053e555a6a6991213d80e99b79e2d6e0c7afd7dfd216381cbe4759ba27213ef2f8916172a192ddebe8fec85011d5ee691e85cf04f3e53da0297f0c500eb3b9f457fd800c0153ced1ad9a4c5e416a67efaf250528af9262b654e93d3ae592228a22d8d29a683e3745be9031a2f000e3a45a3117a3c78d6850426655f5689a5361022e40c0a48662e95b2a6968567544bb53a7823729b8ed014d453211d735719df488878da265fb9aebda4dc99629fbe0cf10f0765954d861d47f05ea722e66599ab5b97bd6b1640e481ad2934a4ef3d06abfdaee983b50e6e80dd95ea4a7b7ad25af0b98884fcd8f56f484ecfb9d9cd2ac5363d0425c9da9ae931388d5370ee66d4c17fe0d0ccde55ca4de609c2d40b36914a6a36adee5a9ea95f9ea90a766c3f9e1f4d23903b06a00c6274011e1dd4a5271097e188ca04babfcda9ff9f440af58c80b3b641b203c8d489288981181ac01d8300aaba32fdef9cf3121a6e7499a33ca872903b4e33b595edd9f4ca57e483a3f19e3047563ea664a95385875b50f63ec22f463f1303d498234d558f4614ccbb991211318966748bc67afce0ba8969badd6ccac4f68d458e2db9df4caa4396affb7164022c3dcaf9cabac5a450f4ad95b6d7c87fc7de708606f8a3f2e2d774862f3b56c4d84830f227eb6ebfe42458d8580750912d14af4c90f4fdd224b559a6f7b8735f6f44823699abf52594bb934f24c87d6a20ff562b1d59d0362418c8d53cbfa6d914a6a3b7aecfcb118a4bf730e50fa0522c842c308e6be0155433e233ec8e1668fac4d499f8a9b2f09d8e2119392bbe052917b80b51b1d2df848630ec76d9b8714238cef34b87d82c3556051826d6c81f4d03e9cb87d0e84d1362816ad5d2092f46ccdce07a21a908f9c19425b3e2d9f20b091bc8382a253acbec0b2998f5a005760c7ab120bbad796df45d78a5411d9582da02e3a271ebd2ddc37d7590cdb2d48f4d4fde4ec561175677840e05e3f93927233d380f6324b705c759dba8657fc88c96f2f60349fad9e1bbd17ac54290ea413b638416acb8c2821010328ab1d1befa98f21690f2ab9c0f362d216b6b332b334d8083fcfd69e389c47474de9c103a2468308d35d09884d1241c4f9893c0b1828ab3dabec85337c7a28e06248b29d553e5212a75a29c0c4ca550b5d1c9f9a6d987902d5fd2d5507209adbe924d1b75c888a30ecb1d50c2924163224edecd646ae0642850c1371a69d6ff092d7d330fe59750494c0e8ae7965cf9dd69a755ab4c71838978c817e70d37c12f8e7c2dbe98f1bac531c143e52792f3cb1f57e764e310ffda01788153275e0175aa151b27c59ddd65d7b63f530e9f72be6e4badfe808a73f680745b02540a34828a2fc8672ac8813d6ba84ba38a0bf76b3ffac82694a077a1afd93377a14456f36c73fedd1b02b76eb752da4468d0266a401d1ac165e0e87c559ccc528c60477c2c31ac5682bf779c08a803e99411220a0a76df22f2752c9acf18c0389b4cad8e65dfc584deddf1ee702d62db6b7adac18480e5e6a01321f098d88611af998654459a31d1bcac5f214c903033e33490f342e47d2cf68c0cd10233a6341fd2e89988fb323ad7ee9a5f397683b0b514198ca192a7be0b83b9b7dcc3ed0e75a6746e32d910acb8fd6e3979a60c2ce4a5f263cd8bc7e7ec1e71e2ee10fc8f8b031b57203d56b8a8e107b7591702557409a31d5fbf43c78daa2cf75d4854ae87f703d82959bdf90fcb72b232982b5933503277131ec3d1c0a2241cd236b3c79792c57bd056311cad1d115c063e4c76efc8d8073151334046feec5988ed783bd8623fd244e89b2e4cc827497e5e9a9abc2074b5250e1d5a2d839f10e1a1977dfd86609e1186616a5917f3a2c2ca064390064f31fb3afbadcf5dfbfcb913ca48df55116f30bb26a688696a5954512c6a25258e8b952d02b5e1d6c2c86b70aaea025e13a50382531558831c266a520579b4cc71fb299c5ac9a86d48107731849814d641aa312828ab3bfd7163589f925379e69b839ff837b07a4b8426a77ae1c9a48a51e4a5fda99366425d7cf4b1f56ca4a88f0384cbc1bd763d18d3b0f80b8fdfeb92fcfa620bd0de5401f462259100c8320d5940c3694a98f41336f914709a34c8a664d6f686f546cde6f8bd95ce4d476c7dabcda0dde2d4a19bd9f9874e6b418c537515dfe875a85856422df49dfe10f9eb2b50fd82af8030ebc3a8e7178da63ab975edf25c012363aeffd793553b66686468d0bf548ec40977d836cb83b3371dc1af0242d2dbe676bea7595ba2d6a99481a7ccda1b3ce28239bdef8c98ad26e849c2dae63b146a5750511ce690c59e283df883efd9be8ebfc666075707ab68905633e5e284b9a5d736d989ae9418ff03a154fbeaa309fe2513320917fadbb8297a6a9b54dbc924544080f31e7c60d704292546e11851162360dc017aaab0e858951d754a7f87dde83eece56eeca424f981a541540b8ab9232c820b61a251e8debadd94bbe267a2d291feb46eded4211664e6a9a6de4712284373610c0a430ef71437adf97d1d2c8ac8e8d84d4bb42926503f48377292a6b6c22b83c343050a101848d8f5a2e53a51e5a767bb0826c372c17fd6bccaf4d13a9cdde79e727707104abe78f6567b78b05461c9b954ca3761ca4b284aa4658398936df26f6036c7f3faf8958150401364223963b6aad3b19e735d00e86ad32548bec8f6407e3663637d45076e901dc78e7853af52d5ae7cb61a7f478db22882ac54d9aee308d31809f0c5909e48a01b2001cedd50209027192564b64e5ab8757ed954ac36dba988704e5d967baea43f822db64aa0d7c653e06234e6bd48f07447b4458739bc3b319a4e4619fb2e0d7ee83586432a7adaf43f5c375182d695d2ce65dae0cf90dda4d9f4cfbf2dbfce631f02a416370397b7ab6cdbd2c4f5739c57931c04ac7256eab71d49a934a9f2aff45aa7ca4ce01ec10b04fbfa00562264399987c1f505844ca0a6f7ca9ad51168a29dcfbed68a75c0eb8eb95724272c6ff59a9b863e4ac5021b49d2812915b5774f1a8e2eeff3422fe7fd43beb344488c51e40ec2c5cbdc237b4a65aac2dd4e3c1230a7155530536ca4b38063b24e1d89539418d067fcfda106b920dd2d71a679005637f8213cc732c6ba65e26ff38264561208d6b6d203ae2650cdbccdd1953348ae56545d0c57575c246465f589a44a7ed101fe6f56a7db464206f66e565e978d095d65e0e420ba209115745ef13b8dd621a6251d38d90f368b5488bf91ebc53941c627934173faf655789b4813cbd518a2799c92cc6255d08708372bc46eca68dbf21ec6126981346787d72b3e4878f0873e2d3e40915a5682c38eb61278892f5e0b056e402347672136995ca32ca5c19a3cface2d1e99bd5268e7b4912c08127b45940ea3f8ef6c80de1b82fd8c70bc5a4c70bc610d8fa77bc6aae49e9ddc3d35356adec7413de782c786b0b5b02b8870ce42651dd2c08774c69b184b488ed54c6d01a78d0f5a976aa91999307aee834b4fef1822769066b2b48c5089b50e7d5f75d703c9d13ae7f2938e4d95ed52c4fb68be6b57055ee646d4619ceeeef7ba5719bca86b2b8a014395994fd3861fa74b99cd5bb153f69a14f099e1c5236a64a4852a13e4749070fc916cb7cda8152378c80d117ccb52cd37cf21c97982ef4edf31449ed0ab4b09c1c5ec2f4ca538b57f6547fc4e5d565af94ee383d74b23aee29001b092c1eff3b306e8e640fd4e65b5c9f3eca9aea7a4cffed62151007ebb2b7522eeb4b44c078299703771efee6123caf304f98db0c1c67924c984da0f145c1ab2522932ff2239b4dfc1cbdd4b4d254d2cad0481beb0ff12a97075d4d5eccca930fd00d026053786c350b9c7d675502338de89267108abd0c3d2c6dcc8e304c65165cccf785ffc3c070d96ed70bd0ca9631a7c98412c2d8033501057b06770ef5d70382582343a8063727bcdb74df3ea333b96c292613cb6dedac033be74a8a88dada16c9e645ea20eda6d57945e5e438c8ecd5feb2cd5faf44867596898855b993dc687fe4c76ee96c7e557df061ac6a3af65dfb5e2df9864de23718387355758df41c1c89fe7a66f53122ec5de1f0795a8f90e9b75b991ff74e3d16f9387f97e40aef12ee9f677b999ae0a552ba4e67da4b0db0474b0a55b33208dbb70fef69a6edbcc9d659aa6f2006ae2315f2e05ff574fc701ac15e8538b850ca6c177f60e0c914fa4c7b1f5d8b5aee97c7be3ee6771aae855770b8efef4f6570ae4424f6333e03de42980f0effea7dedb395c02407a037fe6b6ad8ba7ee00a9d4275ab824239767ff405de3912d4433b4d97d84bd3e76cfd635b279585254404abb2b3e60af7499ba833d17a69fdb284ffa47aed44fb2629078eeaf5be7993658db4bf7cae94c66985ba2fc27b3427e03eb7ee261c90dd7a890c1f517974d9d87f295340e7b83df180dc3acce6d378d7d4dd76ef36e01da2b68d550a6ba71066796e23098c99eba85bdf222a237029dfac40d3f7a8f7510597236fe658ef7eafc1544b742a0574c10d433ca554018960043345f0581dbf837e94b6843f86f8261f580055733c9ff18f6cb16cc0e5e8d7278ae77bd9eac16dfaaf4fe6276223e8e5d0608f39d4c0ada464175139022de52d0bef1c1b578d073cddaa1a8f3da02476c1400b7f4afc9db69786efd90bbaa6ad795d537b97f735f25683d2ca79334b53d20ad3d57518207059df7d67488fc76e6a9c19188732f59c61db2cd2bc833f91a8bd8daabe4a3f6625f205f5dada1e8e83f4ea098b2294c2d4976038b4e8458181b02b3d5984afd439dbb386722d9b64c39748552ffb04b1d3c41718d86430ed53fac71335e584970787d0e611d74c8c94d3865cff01bb1cf192ab19ffa87d4be870c78186d6b1f0c002a1bf6773f7f2f5b5941e88451ff789e767d98505747e3f5a722f58fe9fa555984aebf7d4b52445e9e9f4f2e300ff50f687185bd0f4b35344a48540f8d8b7081e9c8f7398e1121ce1e7898aa7638fde9f13c86dd17d98fe11c04250f240e413f39ae6545be379316176ce96f17a53e54e291161e81b7de555b18feea866b98276fe735507fa50471f6cc21db3ae4569169c8883c2693c862a7ee134d655b4165be7b5fc519dadd37b3eba77611d63ce05dfa95f455342b40de563e84573c84bd5522f025e4ecd24867fddeb4ae14ff1cd81e2279141218a00056e1e8ddc8e311fe5fe2b8d5c4e7692e3c58b164be28b9e9a0ad695a9560b8cdb672f82701f810e48a1741425ce4bfccb71a355ff5c63149dbe0956db6dc33bb8c0e91e94ffd846725f86d34272b82807651eac56d89c6cad05fa7085432e074f5e0570c035ab2b611ed482771dc8630712e22cc8d9dcbed5cb264c8d5d5d183ca568b1a212904d51b5d7059ea5822a0440592c5ee79aaa7392af5773764daf377caa82e45cd732c2fbdc8c20c6562b6ad8a2990a38eb56195dba0143c56ea3091e34886f1802255c50bd6ee4bfb543ede6487e10d1f437260b704cc24a718f7ee619eb098fc7ffec117932df5822e2ca2c43fbcb946a0bf96c1ad321bac3eb06a31f5b3217a9eeaa24170994039e237d01b4a45c33739e749741b93ae2307d3ad22335c5689a38aa2d7a1a03dd18443cd791b609d3c67a285dde97e1e29fe82c3caa48f4a5b4afa1450089bdd9a50908d5a1886d31db0df50e7a50ebbf1579b900a2a7b410f7f8fcfa2f4b2cd9228130e4d73a5f55f78ec2df04567798a99160353a4ace0102cbe0d31e327fb8d81accbe0f49d7220fb5047af0ee61b348f50f8717c6119c0fd1023b8765a09f3de5d5f47d764f2fbd3c0eea16cbc879e856d044a18a6d501dc0a1193bf7cfbaee31a163448d8b1a8e5d60b1131e852ab31b79dc65cac4f8ef221d249934b4c535562be9aeaea05d35d3e27adb2ece372a007332b26e6901942d6a33bff588780d64d415114631330cce4667d6414c07e2b543a921827f00d7ff5ce291e9906416c22f3b6b580202063835e7eba9471a5efa58c9e0beda225242a7828f87177462900669b980d3ca9b2f0a217f8cc23f02be60094397fa23252556b081e1ccc20b31988135f79c49b186d1bb3acecec6293a9e42beeb056d0c0cbf7645ea0cf21f6282ba312602753c3a0ab8bc41ef4fb7bc90fc673aac16bef8287b43ca03cab9157fbf87008db3d505a38562ccd79f2da72602b76127e977dde2b8c4633eb2d338fefc5cb483f377b5b64827f1526d4c3d22d2cceb9243f2057211d17aa112b14a249b8e5b2aaa860830d8687265e94aa80b8f47b87f1bf6c78585f6153e1ecf013875316234f615ad03c1354945f405d071932fc7a9830107f75eefab9008cddcab1adf6af363411c06e9840eff02ce0e90a4797c20e84af552f63cfc5c083eea33ce3dcfc2686a508443ea705fad58006b99ad18aee5b6af085f7aefdb3326eaa6572a1511915169634e95559e9f51344e43793224a2909f329fd5ac106c87356aa92a6521366cf8ee77b968992a8944ed698d45b80642a3b7d1f629f33a1b6327c67c52fbfe2b8b03c2918c5cb16b0e857588df785c0976cc05cc6e7216829fd2c7f1d8643832b0aa5c5a35057a81d1d422286eb30f72b2c56833200579884f186897ee6deed22ec0491004823f7f6ed38038d6800645803f0a4ef2c8b774c21fd103c95c00c927625b4a4572ee71e84800cdf852eee7b46ce2e00fd5111e0c9764b0578ed8f8d5beda1f062f8bf8988316af4120868582082ea913007f6489451e95fc5dd203a663a881115b3bcf748082b21624f086daddad81a7d2171174d9acd10820f0229500858cd3be01b28ccae4c2c00715d06a0c2dcc06818b0f6c844af7477b2ea904b5cba4cefcf36832e0754e64d971f6025ece8f6c920ac243d28049d481ca4a0d6a6906539a761719999090378178a4fa0d4f71e22c9b74268b96cfc51234f7c457c90f52099e323664e5afbe47fca7067f556139ad9a6a441d99e30b8fedd4b81d095cf9bd00e7e812d2e3bf0c6ac8e1d3c584401500bd54b115cbc4f5d70ccdc8c5dd217df7f682b3a2b862cbe2acdd3c345d1720f38810faa1bbef85098a7a45391c0256cea3e53c6c960ce3fd19485deb2238cdea71fee1654f2480a6a3e5bda8d033f1631c1922f33ce8dc7c42306c74c125c9cfc5c712fe5ca1a0c70e7e4799cd1e0574a0742201009bccced13d948cde8a446cef0ea5579066673de9666edb0779669f9e2294ece1c72839fee01593b4f37c8122a00923308b39e2acbcb8c0eb3f3f37c5eba9534558d1e6163fbc668cbaf9222177ada3e590156639515868cfeebc23622411e56e9925ba9da66c60711439415227f56591f0f80cbe77d76492ed57e1d344275f1f0cf0b54f50e80f56637934d21fb81518e51f717030c6a310124a992ff559098540e23ad5efcb99c50f5ba59024ea5c00d72cec3b9aa6114ffeb026470e88d65eb5de2ea3ebc60196378a5fb56f89a448b4ac8ebb0299fe2ca71049ae0ab64ff42ffe8d0292cdc45e29e87f67f02cdc2045086e82088244079850ba0725be79fcc02ba19f84f3456fe1356d0322c3fcc759804b9b362a22c059ddcce9b2793566dc154cd306309a122d914f4ddaf63546226f2321cbc440bea1374f9de5b33f458a6b92f75d670f08b20b7e0c0f329e140dfb9c77da4fe98cbd65f06d54ddfd8f0a8e04365528be84d78917a384dd34ba4841244f6f5e4c7f28659f36f0c8580dc4003b397eecace0cbe632a6fe3ab200f80aeb5180666b43f13603bf9162bb6c29a13ecde157fb51c308d0c6c7a88c84724de2e74152cc48f299f0415482c1ec96739cf150c23f0a9d51cbd236046c73060a4ecc6432cb340e3f6ca4c77537cdb9d197bf846c508fc395c3adeaf1396b3510aa1fe644bd8ca5dc0802df07a84811ec977e49ee926ea36e71937286aa322e0a09670ae61aa6c9e331115c542d49d471d29a314373a055dc5bbaeb2adf8ddaee2d426b4d78d1fcdbe4614e3fae0178e05a16c79567904c27ea7db6ac6655812cfea96bb91732c754af55e207b6f24b9ec63828b5ca0519e5436dfc81457ca05b8672efa16aab1126240ab5a561a493886c79c84972d94c8bc91615e8620d7b29cbfe422763551bb823c5f6d0ad21ca406f375ed5dd460a341a916943922652187a0adcd917080f7d3667b3f1a55735513ded1f557c6bc84d77968b176a604388a15d30b8a32c27506d46c308d7d9ef3375a9ebde188ec7fc13ee572c469024addd195b27745ffad137def7298fb4c47c863beb112f009778883d84bd459704e9fe2c8fc03b40ff386038a4c22e89a283c28245e19429799531d0e400b70e4aa8d143bb59b962b60a9cdb09985f329e4be3e67bfdc1a63e0888fd4111fac6bd1628c71d12157c512871903f50f63204bc46378612299a2c06b32c6bcb27cd6459bc0dac9bd585d3a76b9bdb00ba697235c1ea1504ac413775eaaba81032e44103d0e2bac974992dc6a5a48a554124bf99b33c5037016709efbac398851bab6e8b0e25297888b65033694442e05e00682b24d27b238d107274e441c30fa5d5055ee4438495a6f0e751a864d6820ff7a30639020f4b96785fc3617ea1d9ffcd880729f2ffb5956d0acd8c56e128879c5757071b9368b7dd94b80db8f30177c95e96f291147dad6ff1493555297a1b0981e73de95485471f2b0e4a2761633e185452c6a558cf345f16dbae88c10f3b01398b076b4d5484da850efab2e7b141fddcb8f0536962c13f22125ac8527ec232f8d35888d7722db6bf1e5cc97c75b732fbacb99113f583007de0e3e3b114b369c916919bbb9704c11041ed6ead298e7d080bf7f5d55b49170f0a6351b666e107d33d41a1352968d55651be929c80da96d7b0ee44668e7f3e710ec161562b5102470c9df96061b4e79700b4c3303af990d3d20d13217fcf1d4cf704beb75935a57eda2c79b28930128faa049a95cfd5432a2e5ed8655f3e244f5e0b03b577741e5e00768ef593ebbcaf8503eed423d574b20ff2a37d40424920c1becb3badc4b3b19bc94a948b976574de0a88434dc6c9ace4749398ad629b4a44cfcdbd87de1d75a9740b541afc1ea20f42cae66d8d83f9e630864d4e09e617cee461112f352d86fd1c082d033902945b59e805b660ef39e47143c375933a7b737b77893e7a4e60376ad010eb416d6849e048c232f02ea6d00fa44c8601d96df8b08595db6cc20e613352d922592106aca727104378d36f9d575f500b9fd941a051899c70ac4880d392778f5759dfedc268b0917275676e8f4518b7a619769ea70b573b87bd6d238927cadaef67917f7e54d2502f3a1f9f93cf1e62e135a91e385e238ec8c62db960498e91cf5a848b9f05add222d6272d2e5732c70d8e33a5d2d45c28bc33a70ab86ca1a58cde381da93f6ff197dbba6a340dd659412e7f90d4275041aa6c33cf9f19400c2ac5d193b22d979e2d3bfcd4ca066ab148ce37d6982742401c77763e3463f92a1dda50c4946bcbb7339a9d26c20ff25f42dff309b8da7ba50ad6b32fa56a5739fa6f470cab299097cd81bcf4ab20a44db8a38672b3358e46325e935593db8187b474294e8b2aed3899e538d4e982796293729ba6719e34554ec7323d02957862f32bd6572a99737b86d74e833e98e3550f7582229f5fc6b20764189de5c2d8b278bc5cd4aa96731433eca12f6ab203f21e885325da5d65e7c2b350275dbe59e450db9e64c7978e65d3f2ff124a636bd921ceac17d64744df6a5b3553a20fcada6d2bde210549584550665aed23e42ce691f258ba1adffd2d7277dea344d8d3ae8a13d608c56d84c5283daac6ae6c9b15d5cbd1a3bea91a57bfb4631d07b1e78f7752fd123ae1ce1d46b1a913bbbf67522d3550d3efb1fe359953e9ff358767d0c5dbbe6be9e4ac1a97e9746997c7e60cf59a940c8232f184a0b221a9ca5d9a3ec0448b1f8753d7af973e6e121c88500867eeb03b8973e245b6528c6252ce10cc8b3c91a731463349f4d79f8654d65918f2e73c7863bff62884966776f24b7d65d0c6d36a1b60b73c48c9b33cd02b94f89badca817fed5117d31bad9aea5ff439db74b2a81cfda33bf2b2f873a8f6e72df320b0ebc5be1b4295ef7ddcd0dec900bbd657f6906c919451c6ce2f8235734225abce4661cb7ad488af179bfe4aeac667089b5d92d63c2cb081e2a4ac61591248ab038e31f72cfa60988b34f4fae096e76fee20a396ae211b11e2c5d706d7d756ff891a5c47a003a90e6a0dd17d175d7c9bef0727efd766695648eb016eb0d81732789f6a41e35d50234e25209739da7c1872451b6b858f7ffef942db4936fbbe3d6c967a1c3715c10b4b0a7b1a8e2abdab58d002a9d202904436381bccc5ac760aa324be30658be52b9328fa94f96622415e8c8132c9f45795abc964603fbb1c84285a2627f241537e401a11aaa324c593c2f3aac520c4241eb08903a85e72d3337d3a7281ee71e9ec7da310f9dfb2f6f8a8993160b84c4a90fada7e93ef7a24ae48d268bf38d993fa23a15ddc55372d2bf23c6ba43aeeac3925402194dabf28b96141726997f6b94a0e4cd996b97d233634ab6ae0379a69d87ecf284b1a5452cffbe2935724817e50d94a9c3baaf803d5dbd0a36b67554131f1b4999ed6df8d854e53609d0501d58e53dfe217cf982e6c6b2145ce4125fec2fbaf89f62d61e5e180d38cecee5f1ec09d2b2a04fd53f616cf59d619441000795a4c0ad6c37aaf31da3f231fdf7fa9c4452f459919b672afa758989daf8a2d48dcb421966e4c1f722672bd75a585500de2c09a0fe8197c523903d82858cd01a053a56aadc9c6ed43421945e9b5255f45dcda260a2214c4f4b03f6394ceac7c97c8b5ce2e61a2ec92f75940067b7894f8a7526763744d8b541d20d4a6957136e11017dc84a2fc53c3fa3a119c5a40400afb635a638159c150bfbab5362aa1a8fc70f4aca4cfaaf8d476861acf720e08006cf95382caa355b5490d60cf8d6e88f792c58de82ad8cc651959535ae17c6634b8cee900b2ad5efcf7d4b53005a48ec452df23f3b5782d92fa9f17917170d588347e15e393ea628f687eec878e16df1fd519eb75755ac40f320a44b31413af47a31662731885a1541baa5be7854b4ab5a212de61a1da5b01feeed41cfb234436be888e2627c0ac0426b90426982ada62b2cfe4d10d38a89051eed0d8cf1aa2f47e2c154b49787b8e12477357333e6ee39bc35b0e17312e93897a221a071be6a2efa3bb68a6c83342727fef2fed5a26a165b473a2eaaf2628f7e8d6b9f91c9d4f45a6df49a8b1a7114c1a1937fca646145f87e7900bf7e236042be0108b8b2f21601c27bc47a06938c602eeac73d5f2d939ba9de9a48ff5ca62c61ad92e93524ce948805a7b5473f7a7c83df6c09d9c9a43b48a9814aaf98ac574d2ce1195eeebfbe2ca9d378b06105f4fdeb5fef866eacf88e135b4cb218614bf3a0300b4a75807ba5c73629541c568861340a98b3290db1f88b8b07f255b880b26f51b8c2f8a0b039c32c396d2dd86cd7ed67ee0ea5560716a34441940325f00243215cfb1de84aa03090bfebf8b7d1bffe3e330c69dd37b53a43956c7a4554e60f882d552fe369c590159a897e2b9eec64e1b1907d1490c82eb30981d607add602b7b6f2fd3d3f32747e01552a0d04ff7a766a2c33d06350b41ff82d8ac5256279992be7c51b0c32f0fa17bc332783b1f035c4b6219bfe8038a5b56275182839c1b7b1712e925f602dd1e0b2127a5f83498b03f48a580dfefe0c2bc040c3222139a07e3ab10db899a35bcb6a60deb24afa8d2285612ef1ce90b45c4d6437df75a549051b6a175b4762a2e862ed864c396f7ffbb77f34b904398ea0cc596f03e95a30137bb07db52a4233a4d3329e3802c014f7d866049f4d1581f1b3b596eaaf5206df7d5bb19c1e152e55bcfbb13e822c9a2419b44f39dd24780797d4daf497333814faee1b2161f0dd37d040a77d608dca042bd28f11d400fb2909dc270006c6cdd9836bb09df680cf66d9e3a783979ee7001b25f78913d814f0d344e53ef86521263bdee2b105d0239ad53a8666141153bfe20f38d338ffb1d05d7e59164be38ba14ca282efc1e7d90c2e3c30cff83a7ccbc99f40aa644776ca8d4218026dfb1427c6a214403d1433425fa3690f4a9ebf9f6f879578cd8a8506a05bd8fe66acbb8799dc14ff2d273098914d5a891cdbcfcdd880a4390318437504f7bb7969514e57e36857d78a98dbb0ee520037075842310fb7fed3400ee6af5a4d96d219227752272860dd4db9dcef922744d52ddc6480f394e1e26b50af4520efa2e436a7968da65580199b5d68c01584e083bb1059c64c56f3602aa832b6727337b5b5bb075dba57199cf9e5108cf460befb386e99dbcec1f6368671b07f365d3e7e63bf8f1b5141d5f3bc18f982a881157799b260ca9ded517ccf9b3bd5d2c944a9ef34cdbd54155ac3e9dc508f8d8236458a0536389723784ecdc874a87236448feb9340aa8062e228463216af81053c072e70998105372431f1d52188232f069e1a5b000bab201e4796ace4f7e3d977ac387303794419ae2064823a5ce900ded856ba7e6bb8d056906c7331df6e13491d32fcf7b168a3349519408205e13a6b94951adcf3c3ab933bee2637926c497ea284f3ae23c39bea69b542f78dbbdaacf58405108f8bab26e48bc02504726cdcb9f5136e425882ad69a5491ed8719599a2cc0c74fb645bd615464e50ff8c5ce6e13168488c468366fe89e21adb07431e736198cc7d342de1c37f5fe2667a2c8eb0b46892d8a367caa6dd08a701c41793d30a48a8bb9e2b671cbec7464e09270e080162c42fd553cf81e2095e2b83ea93a07d18680dc9025b2b021c8230499858bf9cf09bd0c27f95538c3e0030822e58811526cd3ad3a5e8db82113457494bb1d65b977285f8fb5455f1fe889b9432ffda32b1bd4b4d9627416dc4f134fd94975268b00d0e9d01a917ba6989a1a2c1b78e8bc925fbd871721001ee5e4625d5e97184fc894c4e51cee6bdd35db24beadfb640f0e0028b0104cb3931928b95d1bdb20ff6d771a86668214b64f6019f2b4acbd2961d2ec20759a16fa81ef6fab5483e2c61d1cc3b155a6823091a883ec141119b393dbe55d04f6c7325c507192b603b95787353b9f355188a9b5342d07c9d2c367ca30f14e1c7890705267931ce7bc6b95ef8cf3ec2022d266b1d291405c63cb58b0d0301e14b6bb1de494e7b62e400a83965ae31952e1ac70ad3b1c7f41c284b09f8d811bf238a2bdac431f742ef34f0ef35c4a42a3e9759d5c9cc9483a1985c4cac47fd0dbe6580d7770dee8d7e0aae4df44bc05db386b1b7265d8ec8e20a50d3ae51e2bb19d9ed14ed623aa6b231f9e29e9d4101084e834d93af145a7290ec3b55c85583f40447f12470da6b2ab93c381fd6e88e89871e6109ad4e103ab83424c968746f739e44c4764e54457e231034b91794f9593f9c65c715f8d06f5eabc811ad69ad22ffa0f12a84f27f2ace655644b328af564aa9b54e7905f4d38bb1df4129ffce20dab83ff332cc5a88aa857e31e7ae6123424f1e5c9d24618826159263491c86159a739e6ada2dea814f36bc191c892f527002c8d32cd45cdbe5df6ce4b481f5c82b1931c240e01040a0ec9cebe11659f4c46c6cfc87bbd5cfd52365901cc118fa7ec3cd684d5e28b5e5a6960d73cf6b4afac4c99b6d2743f693869bc88d600144c4f4c00ea1acfaf6591878c3468893a61d1908475922f9473c66a29f1325e2f155f1cdc8f07985cb33672769020107b89d2e4e34dd438a0ee62cc68d0609b0d80dd51cf541c4603a1cb2829e0c906b290346819e063470c916f51db4f922aa8a913c7d50eea6e4d0c2edf7d7166e2c56c8a791b7ca8d28f6eadc7ddf943ca0fecb56c353d0004defb6fc19901e1ead25505c12678950b30985537a5ac98d1c51c32311b19af31ddbe8ad899006af2a97f98e785dab8507fbd664ec0ebde03dae61a82468635a7e24ddb639601573914fd44258dbb8be0c0ea86ceb26e3a9fc01f5d42e33e09b11b6541d287719d6ac441d690b21182e13a4c9d1e75e130147d2c02c74f5c5d3a01d968dba3553a6e082bac447af9a075c8acc872e123109011ec35d657062241f4c35a8880acb1b56779121392c6b085840ae8d15aa1ea4b035b2143ffc6708f1bf7fe4d715a4240306da9a759915196a2ea20747289686b94b62f9de047cd0093886514175c61d24859e60442d5260aa6bc8810cabcd16d2666b60dc106356e879d861f286f69ad150916e9e8bafcfefdd79a0d36bb8e50a1c831e4792f90a93c091f80b4658b6296c2ab8712ec442f15a0fe17b5fde1bfc24f64a514b318dadb61d453c74ed0329ac72a7cb299c157803320d3b9879853145e2daf99d866b90a5821e331e0e0151c6e4649262415489ef81dcb90c4eacbbe8d941399f9e129e2d23c3ec44325ad42a809d23700348866ed425da81eeb7cfa5f98511113447d4bd749ad7045f49bf9d893f86f9e433c9a54aa69f0f784848cda0a89fcb7610733e4e15d0545c6abca6a1740453d1d1a7ac1e4c3bb0c303517bc50800f3b73856fe843ce2d12c2db6edc86cf6895ab050fcce1001b80cea1369ec3eecb519ae9de6afff85ba69df48718124202142664c4b8a7f226d1ff119adb9d48e66db2f373b91bfe4d23566d5b1bb85c4efb8478efa6fb3da18dd1fe12964f321c57a9fde78e625060ca85de69fa9869b0a50c27c506f48df69840d3215f9a6d33ec1afd20d173956f373b16f312fe8ca36014310aa4c2206cf9bc831d085e3c1533f52dddb82698423c6a97503684203282c3591f66bd5a4a88d98158ae9f8c8c01e883cfd38edb5c9e2ccc260e88d24a89e02b613447a73e83b1c5825c5be46c2ec1774535eb81ffd377057b4aec643feb02adad28c0bba34aaa2f9625f3466626f0db1afe2fb4037589a6900d6a5153319ce6e8430f830b66ea50577d37269ff886854c6fde2813fa4b8f8124eef8e3a65e2bceca3a94129d94c1414a3cedf97962f1857aff280f60cef7cf558f0827753a126074f436b3088f5e30831e7b334dcc3dcd877578abca48b1b0de7ab34e49024b24daf79c79f8f3271effe790e3a0c91de035f9a01c889bfd4c1c0d2c1bad85374b8303a738921f9b911a8ada411e178cba0a4ce684614401b51f7d881e073d21009fbfc7613d1c4fe10630013510b0c18476dfa7f94e1fa7c69f19ad2931043a070e3aa0cd2e3e44654988a17d05b4c0142d8a9eccef4fe11de1df9958b3fc2cbd669986306d1d3c6230a93e88558e6b055843ab9df55d72a1602ac2879c227427f276b5c11c2c0078fd0470d05f4f63d33488ff6eec25b2d95da407f087c606cea99ba11bdaf3e6f092bed4c21b86ab17738c4380ddbd95b9a6018322b7304651a93b31d6962ed561e46666542a9c60891cabf50981cbe65b31255c924d56393a7320772e6ad6c006a740700f40eb9f036abcf9a65178cdc2169f50b9ad97e57e5e3800e2df933341a94f843608da24ff00b73f5cdc07379fc401eade22053c0202813b9aa43bc1d10b787707a11d88055dfe6c6abd743b4ab7ae2a0a094f5a01c276d55d96cf0ed6179ed9204d1aa6612335fd3d843ad23d8ed53c64af33e3c3c05117ec05577bb05ce963457d4a1017239808c4cbf0cdb9a5e5025f96211f1e161a9f2d00b77557b7c9714340fa89651b00c8e028bc3231d8ee74da2d2b11e25a5c0615403c1c89434bf826d58a057282d2a39760744864077603a939ed665edfd0e296476d276a4509d6a44bbeea5206a8c08c5417d34905515f738a9aa0c3d78dc21b5f5d9284a421c4bf17507dcaa89640b9fc5947f0e0317ea6e63367b543ee19a5816425cb3277da6da522b90ac88ccc4b7164fe48d7aeb6dd8f8c9862477c19b32b1d0e0bd437be8d5a66291fda6ae3413cb2941c89eb2397d91024dd8b1c000e2e741d0381d88acdc63695d9a58e70af5e72abe1a54b38717fc57a519f7f9e87310555f9605326a44754311e25a5b99b88d9488083d0a4833287e6cac4ff3a5f040477198357e8631f15ac5458af88c765c1467d68cf77da814443f5db5f8757010f52da33c2fb62261290671acb10c87c4b2c21d4c6927385925b92da700f5bb6e7097c9884b1a54e57050f5d783aa09e11c0cc43e5bbbd6290fa1e26ea4e3b220997eb6bb8e80a6d181d8b7f83dbb33b304e61c2d8927c958fe5e82d386470434ed45fc607448ba9a1418f71c82c6607b56e4415a90ebdfa8750a18a391365d19f5ad7ac37b79131d3e6a2b126a4d2da55a0d682184029806ac215de6c20ade7af259ab8341ff734a5fc3dd5682b98f17778bb31a7f2d9f9263c55e285d5d264ba4b871fb3b8717348e58e7e23f95bf3259da357eb81a0a108954d922e3d57db86f7a0257ffa65ec6a2222413f892d901d03d96542d9728f1145133af1208f002487ab83af9d1eec63e2557b5752db1f81716ebb6ce9b26678fe8d209f828f6bbf8d299ad5b0ab3d6b82a5b8525270dd567ccbb19a9d042bcc61cce94223876e141e51929fb7b035822878009b8da1899747813701314e0007ca455a0e393d5a933af0256eeae6465653c8c8be268e131b70eab92e8122aab19ffd3508c4c8e4996347256e6a2e8198cd4cc7e717b6035892e785019cac219dd957bec48e6fcb6744472ec90e7794136a5edb4673ce6634de0700f8a8afe0d5c915941c0f8307297cf5991b2ae1e7cd6fd640ec6177e1d03756eab48618ed21ded0b1671503655d289dbc81f3995d6fdf3a106541df601c18041d29b4f0c7492ae537d52b050168002c3289056977ff23fb553d88e32078edd71289107252c12b1e018e05d02e4530fe3d6f89ff520d0e59c580b9bcb3d68e8868ea834af13e60cb15e2a699d2d4b8a910378de232e4816aed227197af9612516b031b92d299a1c0fcb3828b006d2557ebf89db9eef4716eb5d89712d959f74b1c5d2ba49f057fa73c4d5a76e7f40c75fb8c570ef9d3fe8eb5d6a9db129c3d75f3b2bb9b4c179e1621abf5bb395e32b694b8fe7f2a8764b72f237cb6477fbe80722d9f97bc56593f79af73e5d0564d809d1cda42b884a6a8d22a574df84c9d87b206b6295741274b86f15eb7a27c4014d284c3319ce11bf02128abe632c8486c3badf864186c1192e31c50d46c9cbd6f25064affaa75725079557bad8cc11d6ebb280cf2edca2140416defb6b3196597c970da3fc152f6b0576506942fff51cf084834c2dfa1a6b0d099dd023537c129b6514d87934a4f96cc5b650815cea81d263bdced0634410512d3504c49be0f34ce522f212412f8792b0b8329bd3faa1c9b19f08d1f4a1e44d6d5b147ee286b1a1ce57446ed58ff17675160584872f4baa750875de18923f96280474f3fae9114f0bdf663c59483101bd158631145a64a8ba3c556b98214e04d3e24d274497b678a6b44edac2e806fe78bf4a7ec2fb8af68e7c50e2ba6931cafb7fd7f933dd60edf0ec510eb1994e5eafcf5a3c85e6f5334f0517aaeb4f184fc38712433cfd104e7b88d35c78cd6ecbef99a99d45d2043b0f51c275525e2ca55f134876d374363dd7261708564694a4c24f75cd1f0edcaecffab7d9ddaad4428bf6ed3c06fe7f254c5f6fa93143da415708adaa270a406959c3511caec7e72093f378c3968cb1819363b247789074abfd74872e3f8ddaf995d2f9861a951b77afa225b6ba33074a39aed98ebb50e9f7ebcb509e72f1a77cf00aeef0dc68c5ec37d7533d97199e9d9caf53f78f5647e83274c80ca781b303ec29f6cd23960314f532e052d7660c51e342576aa0f59d2ec1bdf86eeff9799719259b3360bfaa2cde647f84ddd485dbd22481912b55f3b980d8d5b26769b65dedeefa85d3ed93022c8552715a16bd165540a711c3152adc43d1b459a3339d94458f74fb7ed6953bfe7c557309f3916b8e7ee9271cb259116954c48cc2a36a0edffd20aa238b5602f2a31c965a62047ba85bde3242d77c80c397c261ac54c75642d2cef69568a99a4a268c4c781e2a984d934199f45fdcdf2c5bb4ddef920e65d56df42cf7edc2f396ebe33fd0fbfd1b76d51094f814a0ffdc042357223743e67c6b36058a7a8f39e3c94178a84fceb1aec103cefaca962859babedbcf2658a35796dae48296d39194b65a3c7e8f73895e65eb7da8a90cf786287c2e462ccd97d34a2ba20fb71c949d41f517308d98925727ad49334a9669def09ff11b5ecc8ca34998954737746cd9e022389082963a83c349417ea372fcf479f24f7578afe8f6e6bcd5ec00d9782e8d77ccadd600a5a811c19844bb00b3a78fa49450386954499f6a0888f2366c46de885b7e7442a6cf7101bc0c3d16f8d88e518c4f9a38e9d79758a9fe7060d6e0777d76fd4ad780a6ba378e0bb9730d44ea50860cf7cd4abf7756f4399da76d30c84aef252ec102e1b74fdc9b7e2192168febe3260bb8cbc19bc143f21b01193516746962df1d97d9d52573e91be3589225260b1a6b20ef5c37540ffa6ad494d47e8df3e7672504a7e5ebc82dee922d75677a57d54a07aeb7020c476e6c27a96712af33bfba8c71f57045541ea608b1839fa0cb6b22b63dc821efcb3c1079c73789aa7804724316927b60d888a105c15a0876e9056751f7de4c928e6f9c71b7e1384577293693c242133259f5fa24e13ebf113463ef54f5ddf8b09509e41e67a91c22a0ef0df144f94976fc3dc6375dad01caa886fd7033d0d7010409da3145663640b980462cc3e9bfbfd16e859cd652286e6e14ba1bb86aa49f904cce1ea009c9e45c580d430814d2e55e8efba555d0320b605ab50c333f1b444fb9c38f6fb8a93fdaca058b5c1b649d889478332df77af36c8accb294f1c49aa01fd6a083bbcd8a43ce6193eed2aba936157526b8880cc13ce0d60fdf8e384b19aee69261697f4c2eed472d93f2f9495434fdd617d80e806922122e161c9921c6ebc6ed7fc5214ada202c07d7e180c541c32b45fa0689d96fd01ae7351a9ae3411721a4a5223e68b048b4787e2c3bcf101ddd1e0ac94f26c2def2fe112c0d163ee00d84e20ab106a052034cb4aa3297548e680cfc4673be31eba4d33e63ff6013cdb12a44a3a358d8ef2514bc349349d02217c8cbaeb24c5cbf8203477d7f39bcb384ecc005a50dc2123fa257c7f160e2db29a792c153041bbdb6d97de2c67af31848099d4a142340ac2f48e8cd213e158c2865394377be569b78b2bf4567e366a431333cf4518986686d8aaa907406ea3ad0530a1f37b009c9c95038620bd3d62a317f0e48ef8d39acfa1904071f6fe946cd7d69e0a9c5ed9d32f14253dd870ed50db6b395f0942b9299035432dff02e32e03fe453e6663739e69feb53e25336fdc274d23009c9997779239b4c937a078cf9a610ebf6e0e38fa5d8e2ba02984fd1db5ea21254d7d736a9058fa44fe2acdc060ffc8ef8fa052d673e2c0d298e48d8b4d98219d7b6f90148bf439265fd03122211858fc1ccb5d8e82db301d0feba90572ae22ab8abf43333e2ac3fe3055fe9d0ef12767f1cc73abe4b4c05024dfc344a4b23ba240ec80d1cb25b71ea504b89ab56533cfa7748e7669d5bb9d47c522f819acbf5cdc8d8ff039c67f48165735957e5cddba1973eaeeab292aa6fbfcdb385ade9bba268c6dbc88067c6e69d7453823c187b7749d1ff0ef9ed756c7545160c2341b0b76662a59a9a6e0534f6966c3037116e854efff1dc391dc603bb3486e614ef885691e9c7443029618fb213dfe2ab17f94320e07f0213abcb595011e063fd743e0f278f6cfe1a6cb773a320e1a094985c3127fc7d20ad40521a02f577cf7dadf633cd12a340fa09bc8a97f121d42a51a6ab9fb19e998bc4a5eef7f68793d6873096d5e33b67fb847d0ead872c70b6b7d1e1feb4147eed9ec26faa212ea96fd852e8018287531fecb3a45249fa254a165799d0e45d7b9cf01e662400367f401cec5f2841bf0d8fde4fbcea783c897d46b6b19a60aba3c92830b274f7f2e53366b02a262e73c32522f5694c2286427001154575935556bc726be561605328b418388acebb14c1bd10967bba31bf4816e0cc2af1b1dcba0fe1606f99c44eb83e8d8ea2cdf63cc5706a70f429113f1dbdfd2a7bcd809589ac2c6be06e4987629a387fba133b8a93c00560a5b5b2bd132b211862ca11edc083261665547a9ea7a304db22ff3fa3c3d529d1db09447da231eb07e3f953cc907b8a4c114a073af45c3616bebb3abba1a99fc2442f227390a8d90fd69ede1f14429f5c0ffff019285455091eadf22a7805284b631a741d79d5295f68b4b23a55701104a923640fef17a4b00c770bea5555677219420619015a02f978800c76a109595ccea6b9a0aa436e255e3bd8d9eae227837e7a0a6f3527657199a45abf161554cf3b424a201d797037ddf23a352bbfa8179472b6c4742edb6cc56b2b92ae48f1fc940505858dec603957fcd48758490502be8d4ac0469aed8e3e28764dfe1d1200c45474f5b7a9971cfd2f37723faaf0d0188feb9bd4565e5dc81c4e5ccbd42285e4b581fb748cfac10e9a8f12d68f12788d3caf1c26372fbcddf26fc5ed9afa250f581785183a64b1d256d82ecbb0e07b92f4b78552309542b65f39c6ac3e24252ac69e835413fae5d364f7ab1b83d023928f766c7ec4280250447e88d0996d7df584adda8304c798428d9b37a036e87f09253dd166843f270e2e08864ba826653f10b37d8025082d125a1f910717c8614cb3477ce90d62221692d4ce6dc2891dec988756e92a6fa0ea9ac7c7cc82be6914948e3be05b4cfed7d36cea2eaed16387d443dd15270d9a39ed5a95d73828d052d24315c576f41c7050f113d2b0f4893ced451f36f5847d78adc7c6ad1561bbbf4ae86ce2bceb1e8b19357095102146590b1972dd4aa8a688c007f31d5605f0ccfd861bb608f1896d9e64c23611e19f1a3e6b5f24c9a094f7d24fcee00ea8d90f432507af3abd181339f88ab9b64bfa5bd965c3bb6251851495e0877121ebe63edb4e20c2521e78f1c17cb6c50aa68668b4200c16fab8697fce5ff3731641ddbd768571cba3a6902d889b92019ea05ded58769b508f864de9a2ab00f9543e6509013cde84f5a44a4c3253b95a105c2c1cc81d0bdb94c0bf23d41891b0bf3def0f3c817d652b9a7634c0964cd54b410409beaf7f34a439dab1b6a38dc4a25b476a97a52dec79a5ac2fa2d0ff922618907b8534cbb3a9b927eff7f4839309cdd2125b52b24591acd634855389879800cb86387a0d3311cc14defd9197020bced826c33fe651a6d0029b8278b32ae4778eb2d934b6888d1f657307c99c9788429027f7040b71fa6766633d8bbf86b63b9b2dca4f93ea3d8d101422d8fa6f98b0cfd5d8b13c30601025de5df381b3b92fd2bc179c4f1587d8e36d2d9fcd53c5c19fca13a44d44b8d090e51b9f22ffb70bad5a0fb0e75e7a622f967333264437d5d54ad02e17d50495871175469c0f0e57c62fb36bb79c33b4922cdf5120178870c314ae7792bd1b6846ef6176d00ddf82e40466eebe8ce0d237e8d687d75b4aae6806031d2c9cef96bb7293fc4012a1ea32f4bf35e0b385b02ec2291bc0c201aad444451250e52c38f414276a3f1e4e3c563bbbbd9ca36fa982eb68df53f96647d9fd328a8ee41e46bb853a2940779400c34a4600bd501286a0164884ebed36f2d2b4c15a0cb8a7ccb2ad7572e0500dd241d09e38fde7a578f7ac75b0b79a33083816168c681707686b3601d359f917cfb9bcf01542cee8b80cc7f1e20aa67e7c2dcf3419e20e019f1a3fd6180989340e903d7b48cd368eb1620c5ec7bbba4b89c5e92a749683c7d40e1d357c51f91da16bce3f2857255f6d4a03df156f78c38b61377ddcd878ab5274891b9b3d5368e05d8c4bc938cf5e0d08949e96d64ed4734995b96e826f7cae171df7b96e6a6d40ecf689b27c03cab292d023541612cd8a23a082c09b4bb6af3a0ab183733f9f02f9e374c504f2305d784988268592c8ff5081140fa8714587ca6505999ea7be3692e3f8e00f5790ee7f42a383800783d589f8eed879cad191dac46e8a052b5d50307d41cdc086c0bf3b5dd057c6229f33bdceb2215460a6673aaf3bd117173f7d85be46b903f9f7e903315c82e3a009c041f58072cd18231c30a913ada7e667efafbb2b9b0674fa9bd748d23e25ced5b1a59180b28eb6d7504e34db6aa42864c9faf9152d22cb46a5380f597f8a2ceef084fc508fd756c2870dcd3c2b04f57241b957a22ee024053b56c9d23542428e10c5933bf720f7fc8bdb3dc1a51990aea8fde0506595ab68fa4becaeb9ee6af45ed9c35a6090cd3c0f3199a51c6548197380ec3c0234627ee5da2cf6c8fbb506ef6abf8ea8f5fbda8b25dc70dca53cedae3d3b020df25dcc104bdb2c4b3fab680a5a6ea7fe0084581ac4e16213be850b7407516b423efe75a19ff53c7219e02f04277824b36c85035682e0aabf1fdba7ee3c8c21a32e475b214fd98e1577d82cbfbe48b5a57aa0292a78d90155aee843e7ccc03f7188144de9ff92a8146763e68cbe17d17e9edcfe6630f614c2a9de8dd70920472c2d8bd7d4c231b39690072393144b55a21014933aca4a3a7e214a526ef433de70f9c3f893558c317849216566c8c0d9bed2c502cd2d2f5b09a8640b43543664099a337f0d81dcc4bb17441d05012c68ce82c76003e7d88c59cd7866820a45b9ab2fecfea30362d4bfdb96cc3b7f96ba9bb64617d45b7ab0a3a54babf670a8b9d1fa347ff81adf8cf3708224451246303b69325197c7b458968447173e89a65a901ccd2338dd4e378bde46c06c3872c1020c56c187d6d96f902adc30a2db9f22d90941bb382abd0e715cf3fcc83aa40ed785a27612a0a9169a6114ef342d886a02518fd05c36744f9a99d42104fa4ef7a454201a16251d8dcd14ff49ef4078779fbc26fa8a956f29f6934999a7ed6749f09f3431ffc311dc0e00687ad8be6819728aadbad3626efc675c885f9c4b793d0699bd88f6d55ff45b6b8d6c4208d9ad1142f6967bef8f0a8c0a440a2d377573eaf41cf6bd99d39fe600207c3a959e61ebfa943e754a3703e134ca3e2d88f6799cf8c3085b25bb448355d4473404213c1f5beee9305bd4d3e571bac522813af7a8e9446c5d9ff879a805d1e22750cede6233c42e3fd93c044bebd29eee625b1ef1c966d4adf325eba33de00d91d9fac9ea7eb23ef3113f6d3e33dd87a9543a4e67a02638383b67f3109c1d2e814de29fa6f386342386e01f19443b0a6bbf341f1a7c06462781346cb090495cc2859a61a7ba46cd70095cc2e45846b90ebb9237079a4ca3053172245e20a824ae1ea6146ad6a54502aa828851810da668129493e35ad870052019c236d81c97891ccf716a05390423d62800c91086f16a11a4002443394ce4b85dc477611d4adb05a6d3820004f3d2fa8b5a10f97955105b0a4032842d102800c91096aa1e54f00e0a403284a3c0c321f8c33b0f7185932151db87a116c45201163b346108c2f14226b00bf57dd449208d2a71f578624c0c40129aab360c2ac58fe88a2495e88a265000a36085a101b8a076f81131b982574cacc85891a58b8610c2f7d7dd8d1b4208312965b7b4810d8f67731d707c42cdb06e494343d3e30dd1bc1df0fdde7b106bec616f29e7a8e708bb64cb117659d3095e5068dfebd1bb461226da3c8a91aed43b832685adde108e5de510576f68b4435c45191d2432e016871824aac20418c21494af4fb877e00cb3640ade01f7b11808e18e4119b81f6d80726284318a4a052f91526ae3003060c211960861890699515144060cb0c0f2b242b96d710330b690820c337eb04617a40e0ce123a282490e2f68b2c9915442136ed88109720a966a60298fb5c00b2c5f532d180296ff09b024724114b03c4d0cb07c0f799c298c80e581b0004ba2179841450817188e61afc8055520e2420aaae0a46752564cfc88aac8821fd4e349c9c1046f9c81815471a5671e9687444d5081257e445530c1f934d10b4455b4a08f458a16f3b4b3cc018646f564a6f9d062ceab8aa7f91ba2812d03eb4fd2cbc22771051357d6537165fd7165fde1dcef270d45e2b69e1b4a5cad2c0b5a0b43cd078c92daef27716541c1d610861d7c84d10a8e39d6e5d0bba1d87a68e00c6518d85aa181adab30ed8c423bf18f0bc349c4022f70e30cad6450ac5b759525d6e476623d221620c1d6611ad146e658d04a7b8105e79319706e293fc409bc9aecd623f072b86edd7a059e0d14221a02b6ac28d089a72165868a467e5cc88f0c2b318d88255e2172c1b99db8f410d4a1a780385827ea6bdde416035b17eab763f51467fb09b4e2c5145087c6c1c3c1baa5851d6660ebf1e6d5948f81ad63570ab6b2f7e5e2e6a6025b8dddc056775f1db3c495755f5ce50e4a23aee295b8b29a495c594ede0e8b4993b8b2bedd5e923b0bb59174925612adc434620df69caa4fe24ca4d236f5b617b1c1c0d6ad7622013590b493d595591ae9b22e2b3166756824336a3b79126da095b66aa41604bbf2adaeb7ba8c388231ecc22bd04a5c59584687a3ebb01f761b4a4c1aaac42a7cf59368d350da490d10a125bcd5c3d9c50855086fe66120423d78330f5f970a5f51e1233e6516949211b0dcfe78b873a3c2671888df7d182a0c4d4a26aaf17ebaa93a9758a460c188c6d83a098481495c3dec047c23a70bfa895f1956c000d351f6ba93e7f02bc30a2618e257861551606a476fc73b569a41d51690e439278c4a133806247a3739f0b3a6402ab4a3efd19b61c96676f4d14562f68eecc4505330a96748a445fdc9be1b437d7f2a9ab87a7fa7d9a17bf4b0f45d56f852a94afa8ba417492f92328c151542a208c78045a7c3216f26bb09c34a377b375ba7194e213a426278dd1b060f16bc161695b3308b38f33e2d6cc205e8c381c4d57b443c56485cbdc3f7f2a352af646088e2ca1594092a90b6c97ea9ae0b880f4262cd85e79340c2d3a38a952b6e5c358f488aa2c7053cbf83756932bb02c3751569f4f98226d87a44f46242a8245b4f713581cc0b99c76c2aaee69c4f68663185de259419349324896f9575acb68dca8a1fcd20b08f3eba75d533f2a3439a9e917fbdc252c5337afc48c583bd8f5dccda54cf5cf3ba2c0a23248956f04416617959f3b126571959532718aaf17da41f6f4ef1908ec4936e7d2912500eccf0a927ceccafda86de131612b2e6490a9c7e9a8f232729deb3354d8446874d9e4fb8c7e613ceef511122ae260f31d40c85e6d0bb41e1794b08cf5b4de693882f0bd633f36d5bd650730a4f6c8a49f19c38ce804cb0e049e5098c82e73c7659425401cf0fd902ceaf0a9e9fbf35847121857b38b1458b6a0403de78e38dbeaaf79773baaa5bc37001131e24426a0655c38f4809150c8513d8c89c39e79cf3ae06d0849ae147a404096220898254f285149a8a284480c2b22cccb2820649b66006319cd88113b30c455041bdc28ad904138ad044133cc05907ee56b203dc444a6a804df8112911c2f9780afcac20fcacaa6403fcb010a8837c3c04a08df5f9fcaa80e31fdc423ccdccc3211260f2e83072d4b8823624a11e2179a2cd8befd10c4f54f9c2cb627d4a396f9d67de92f3d612d69c9772a2b0a8f9f8e54cf97965c7c601a5ef5ac822fa3c13aade97b86ebd2f10f2f33cf27309f9f925ba8897e7baef4bcc2b0fefc2047820101a80081e5b9787d2baaaf7ebaa786cd536f2aade0502e6a42e2576df33ef47e655c50bc4eb19a09c0ee3bdcbc50744b1c46a02176a8042e87ac2075c80890213c506ecb73615f3447dcc13ef4f06460984f0415844dbc41c0861eea109454a2a8913275c91860ccc09aa8452f6243a41152af386de180d9b0847264355961c21870952939cd1abecd9ddb34fd6755d274b8bd14df21c2ce71467a2c47deb17ea33cd7330c4469f6234241af8f20218535dc4c6d1835b69f992065624ad69cd69a5661a6cf3549c6ee0be59060b9e161534984736007eabd5dbd177e6593775236eec4abd2ca1669a49d493cab48269a494793be02d21ae8c8c9e743dbb47645050ce85d96a5352c809ea15218c1d231ab4b18b073be9d6eb395951a5d7253d768fac7aa67948bfee91a77aa62f311febf3d6c41093304af9ba2d2b81dfdb014f236374c2bbb03c8221fc91bd46bfee91d46808d2b17b8484c13c51e3e19c87394fdb99f71de1189c8842e5082890b1f0fb2a6641f8bd205ecfcc0cadc84f2104998f2a1d203ca242fd9471680634e22743515f54f879416074ecf31a45eba35b1f5d6b5dac67208c308a23b2206cdd7e01872451dbac30ac53a91ff6256a4b13e28d0eb51fb26d7ae24cfcfbeac925d7cd3ae6cd32d6a5b2e45581a13298a424087a4410abd74d829051543c47a476e592205e1042b4cc623df3da46c5939d66727b966d17d378e8b728593a69084020608e76573df3707ae63db3a49324255192b5c46a3224add83ed633afadf44c3c86d59a4a5d2e71228b52954866c1f17da506e1288570944b969c62ad41a44a67ce0b8425118e5912e18adf152b7268a04f26cf11961addeeb86a29e59452cafb1e4c0a0c35bfa123642fc13125c12032019109aeb0cc2004cb89276343f366e2274da5897d0921fcaaffb85aad62c72692f4f55e4d05164044db8caece9be97717aaf8f80423019f923aa2a8435cc050e58b3092040c223ac210ee0b0195c41a0cf715aac4bf1e1fd46123594118ea8005cdab333f6f5f46f5b86a2a389b58f72d2c6a4ec15c51a3d03c033de207c3d7df0e1ce094efbdfe7c4674c767af0bbbb0084f710553576f0774a3d14835111452e0fe293510c25272f1440e929841831f11144db05054940a23e445150b691b9cb69936ac61c31af5456758f35d99029110ac74510d923c09a36c3806ea0ad10ca4d42133705ee16e32832c38e7d006894993f8c48ba0a049069113f990f70c99028614dcf30c74a34468d5488648892b1d54221ff2fc86288a081545a5422f66a23882df0d36a8b04752e9b9b2888b22fb1331913fcd07912b898658a9844a5153a82280170b127cbab5e225550850851b54f3cba2f6e592b6d1c0fb43da6603ef4726ef86c78d783f2e8935079822d618e034ef4725b106877701de3bde3ade0478dff03ec4126b66de875762cdea3d80b700de0178cbbc01f0be6ffbfefb708c5863c33bc7fb500acc5bf5c6f17e793f89352eef9637ea7dd824d69cdea6d794debdb9f7611288040625d1361e28e27d206dd3010e1c0319c83e2fd2433cb71b1478ee2c423c3796093cf795209e3b0d093cb7159ee7ae1281e73e0302cf6d0610cf4d45c8734fd979eea2073cf7183f3c3751059e5b8a0fcf3d14e4b9c170c07347d1796e2f803c37941fcffda487e776e2e3b9b3e0e1b99b34e0b999e43cf712fcdc53e03cb710039e5bc9029e3b89029e1bc90ecf1da4c37374e3e6396649c073c4d2e3395eb1798e69d43c472b08788e5572f80f824b2592c915ade30d8c05ee297027914d6416d2897cd22da3e8a0a3d580fbf4027f9a0f0b1c27a29ca85916f5d83c04f7fc1c21821f2b027b84c5341f430e7b8825f21efb33311122ef5b3d43feb49e2144660f914f22456d03894c216289a888101912713f295e44c126dc9f415349b4a1d28c9e4870cb3370a781fb4486bc48c4be777b10b1f087a2665934053ee03d57e9ecbce73bef391127e27d6946ace9795f52893517789f52227f96c8870c1972229eb6d3f32197da4ecf890cb12a2bf46422fe13714fcf909b81f0900f21722831ccf2c10b43223d3d440ce979d47c10714a0411f6bd9ecf887b3e7bfe341f3dc7897128d6bca138462c8a532215eb53e2e081861a83f023c24a2c8b5ed14b5dc05ac0f6584c07d461059f8e212c8f53c01ee04258037c0296e641581c2e015b80f3d81d8f80d5710858021c087bc385d899efd8d57fb002b80f56e6412c00ee007baf63ed81d8ff87b5e13dd81cf76163ce83857903acea3916c7b17d398e4d9d01d6e50bb02d5780457d077bba0ed6f41b5b7a026cf71eb6dec672afb1db1160b5e760b31bb11e78086c112f6233f00fd80d3c5b0cdcc76ae020b01db8119603af80fdf17000fe00fbe3e1015400ead06a7838dcbc81fbef1ad1af8014dc1fa2ddc07d0a088105f7277005f7834803f7256005f779aae07e04cec07d089881fb40089982fb3b0f1803f77f20c27d1f86703f0818b8ef8028b8afe305ee03f9d18313dcf79105eef3d00026b89fb304f7f114b88fc38005280009eeefa0c34d16dc4f0016dcef7105f76dd2c0fd1a2bb88f802ab89f43df0815dc0f4111ee83a0ff81223e3250877805163c6c64f276f40f60a3016ca4b111071b0b60e30e1b75d848000bdd88abfe0d166689abfecccac22b71d51f808502b0300016ca5808806b2195b89a62838563e4b090c84229160e5908060e0ba3bc58e8058412577d1727fd53df642193b85a62e1145088db2c4c125748a0076c11d648073860717aa6bf013ba467fa1ab019b0af673060ab096abec5e101880f4278ac103d6ac0c113ab888878bd9042682405212a707e439fefc1e00753547bbc6991cc3e4dbf9b8bc0e0be6f0c6598c54545d1e04ac8c2c6bbc11a2690568c11bb7edd376f91152e63656173b6954d81ddbe0b9bf3bacfba15f7bb4f780af20896f327e2f8a69453c67f219352df7b6f0cf5bdf71e15dc126adb1045edcf29a9d0276574604a6650bc8c31c62069d5c0e24abe6ecbea2358bee79365d0d8307663ddf0411c610f5134d210d2365d93a04250779190b7a3d3b89e15d2f5057677bd8a7f2f25a56525c98e2c8661d8cdf357f79bf5392d879a80e194f835fc891852a1c4bc52cc07bb0f6177778c11c20b8439a194f2fdc84b297f1ac347268c6088f4c6eb12580450c3ea0823129498578af920bcf94891e98b1adf0da59b418d7f31461957502aa9f18d05bd1ddd59d0f7de4c42954c489de8a0eeee182ca1345084b14a7777cb0821c4b02b561182f26e72c044a9199b41504281d10d0c217c9c126d2ea1a07773b32ccb3e5b80c9a9051c3316239558337f4571e38282e5662c5e4dae2566d02d8c16e0c8022d6842368be2869325f26e340a4bca18638cf11acace788324b46346267c3cee2282d14acdca47309cd84f2c2283a57c66548c6509d3938a72029aa25ec9c6c09ce0792690e4c804b71bd83a4e2401c63e2d9cb3c808cf798db87086f8ba2090c14564b0bc3f114b5985d7fdde6b09a194525e4ad94ea0b1ae6b5ed7bc52a8133f222c5880050a52209f50b1d2a0a4bb70325fd558c1755dd7d58515298333aeebba4ea91c40e957199411c5ffc4091b167eb72cfaee7194d3ba3052ec695dd888da2cb10b858d9e3b36a689186ab2634d0b8ccf52ce4cca5399b5cdb72536a2b70537cdb2ecd9bc75842f9b5bd3ee7865de8e770c0b0bce28fbbd96dd2dd3dd1c0c2abcba271a5450f1041b98c4e4654d2a247659930a2aa80882ccbba1b1492d4752e6dd6018e66305459558ff4d1d64200e5d7320928936ab9e78759d0820b3b22eeb9af8a552bfccbbc98a301fc8404a8f39e79c734606556089cd255c9c21e4032ba0200963a461ce39afb07200ec08b2091836afeb92b28208455e010528b8b07285155450640536b358504861ecd8b32c8ba8891c4461d5543da5ae08d9228b102e820610863a02c2007050496208200963c8f880a8092a88d144952a95841f511364c0b9d6940ca6c07a227222497d144e9c70a814540a3c323c2b125a9f7e863fe01b18fec7c3f0f69138107ef7e823b419a80d36bc1b1b6cc891e3dde4c81113f36e62626060de0d0c8c4af56e542a1c38de0d0e1c2f2fefe6e525957a37a9948bcbbb7171696979372d2d28d4bb41a14ea777733a994cefc6642a95de4da9f476c4ae7b3b62ad1cb76d9a9665949248a31186bd1b0cbbae77735d96f56e2c6bce7733a7946fc74d778cef2646f86ede8e688120b490c016db7f79b98b7d788aa402cf48238c33563046932c35938d1f5abe532fafe3964bf0a0f622312c6198d4d1df61ee7258c271214ea71c27883aa534ca79394ff248406ce144ed96d52e6194b6b18725a8c261ef7b332d3f86d9702fea2d371fb7dc45eb01f5963ed522c75136ffcc1cd786f755910e31e9305675fd616cbea05cf2638c375b6f71c0c9675eb3523870dc9bb1d475c9613bffcc693310d6b45399c5690686250c0fad8871454a8653e01930ca29f0f20a9651469730d14aa70f1761791c4170f04843cd46f04f631f1c8f395ca2fd60fa7b390cc4e1637d52cb6e4bb45b1fc2d6551f02142c6f3a7d3a2e8f2d3b461c2381038b0008b7dc92f27455401e6eb9b4ee92bd351f5edef29e96471b9b4d7dc80ff2f1aa508f3f7d5a15ea2d9f2e2e2e2ad405f25adef2d3adb7d8d3e91c10885f3e9fba3cdaa8f3eebcdcba3e2f6fb93eaa5b3f33bf5c993d6a41341d554cbcb2ef4f631c8fa69b21c681c36626b09cd6d2006ef9219f3ef34f631c372f81e57b9e5a6e8eff696c6520bc04366952ba4dc4a8f24c2e6c02ab982fbd09de21958eb2790846bd351fa5d3f7523e00611e67e8215ed9435e97538b3545699b1c872d7fcfc6457572b9b9e2d35f6e0eb6be64b5e3746c92043f2230b2c0f81181a10453c971daa7ddae599d6dfb3c82bbf776e9956996be723fb1359d79a1b673bd1157f3beb8923ff81d93111b7104ffa06ea075a58aa243a834d389d4d242429daaa9d4d1939427543d691c77544bf78dee68e78680b90ac36a4da5e454d1cb03a3ba1bf7ce665ae7b9b9699fdb5595be9d5eb3aad2bb6b73ce394b976aa777d25f5c3d4ed44cf5dcf5a9efae0feab6084d9e15c5a1e639294f9ff2749252a3526aa729a5466f9e534aedb2e5dbea90b0562a99aa8a47b56d5d3784aab3a56f36d360b60ee5923a8c7d3d93429d6eae5dbd39b5996efe10aa39b59236e7a99654a7d39ca95a9a57cd52d54ca6ce6a360bc1735aeda5aacd6b93bbcac2709607e6aa3ee7b5b9693cb9080dcefe340b3129bb32155bdaa0a5adde7c4c927d33e91cc9871e92ba774b5b95f252ed6752f9513feb9b3a9adeda0fd94b6f79dfdc1723bd49a49ffa99e42e49dc49efd65a6bad358e747992563af726bd3f65777a92cd437ed82eaf9d5ad576ee3463b5aa36eeda49f49a768b54a2ef2e8f362ad5764a275d9fd2b9eb73d2acb499de9f894b579e744ed95f46c9cc646a928944e26e5d3b3dc974f312b82f7fa0a46b5c93fab25b8cdaa48fdee4d1cb3c046feff7b0577ba6bb87eeeeee5bb557bb9db3194d3d727faf9efeda54bab97637a7b4a734ed7df3b146afcfe8a411891e27ca3f4d9248976df3716b87d9a26a9c45af8f3ce9509ec469360fc14ddf567bb5dc711a6b366ff72265d2450084e5297ddb3c84c719aa769cc6a39fa9597a331398f497413c1a411cfc301f12366c89a52650eed466219876d22451524a9a0dc36aed95102c6fde9e1da7e7fc66297758abca6ea86beaee10343d33396a1fcede39ab43952da8a9f920cd465d7edefcf2f743cb4f4ffdedc88b9de3ac05bf6d2fcdb7d4cfeef353dba1e754d987503de643e438ccb9d5eadf36154f8e0b73b94fce6eaf36677fa777a76fdce5ad693afda17e3e3bb5aafaee74b5fab9de5a55af0a08d563cea3eab277370bc1f4d9cd42f0fc96fdda6ce66eba3cdaa8dcdd397dbb3ea777d7a7f4ed3831b34568f0f66933778bd0e0d34b41a04ee9be97fbd3b8e5f2dbcdef6697fbd318b583b299093c396ea3dfb296a89b97c05896693e489f36ce1fb8ed34bb59ce4d6a3acf2e6fd3934837d92c049bde58dbc47c7bdd68b0f4c1d51ed850254a15dd7ad5fd10d33bab65aa772db95495adb84b61f5e6d576a5ea43747708181ad25f767d48a7241317243b074fe9b9ee4abbd92c046f2ea4d251a77a1caf6d13f397ebb29d74bc1d75f30a6f3765cc45be74730a754f37df74eb6df918fb7aa6abdf6c2efdcaae0f1704ea70a7a7a36eea6c863a592060eeeb989b2c4f8e0c08737f3eb8bb5ddaecd5769d8d38b3b97431fa4c2f0220bc7d53653116e62a9be39bcd500896ef2c0fcc639e592062ce599e1c5775a8f5b0bd6ef661522e4253ada60222e630e789b9af612e8feabe9ee1b69b99c0f4ef3e8a49a4337105bf2659087eb7acc63a3794b18514304402de50c6166560d4502aa6ac406b8dab98b1360196a5ba1b8bab9ac55594b8d6c08c261e51e191e0080446c90684fae40f1999b80201a51cd4811fa71300dc3db0f683ca8471cbe1edd88050dfa9d47eec80dfbbcf0cfce07be87729b74e424c133ba034a68978f311fcde0eec8ac4126db02ce24cbc74030912254a309c624e81af8871053f31f02312e309a6314d508941356363e08612b1260da5063eca673d13e11838371437e2ea3ea958514c83bea73900e83e182f8482f426bd49ef53ee3afda2c25f7df5d5d745b20eafebd7755d570a53dab4618ccf2b7cfdba4ef36e4846c02b983e1b005fa7a4872f4aa22412121093ae0e1ffabe58a55a9f32d714421936a882e9a30da660fa68032c987e512d2cae6047a3853a1fe3839a57a75fb50d865d8b922c8ca4082f6a1fd6c9c4d588741d34efc600d8fa693cbd195d494d27d2896530bd8f424caf8eb882d895f2d154a94fc6c2c2143170b40370480d4d60e21a70fc7b107a80c36f480d4e0eb046144050344412030504a879e395a88f480854f02302c30b6c00fc8882a006ae740535939a2015bd9b4c6a822b7a3b9ae082de0ed201aca84d9c8ade8d3c4e63b509a928734fc0fd8b54841b36811bc3198a0e864141f8508a5058703148412c8aaba0f8a906ec22f936e3f268a346786391092acc3183c478130a7cfd208470076b4008619535c88010c2256081d026874873060d9630288407086388868d7ead060d1b314e01801803a08235e59cf20768e05c57270802186410b040adc68f280856c0197e444120838c3174bff7fa3df8221614fc0e5feceeea4511be00852e7473818d6e34d8884f50088150b3d7cfe6146762bdbea89d99c04155560c084fac0706283431c5098ab08431d24083921d98ac1da2a8008ba206969fd5b2e2185144e1085c14fd808c3344b12ccbb2747c8185185f68014b595560527d8104f34117c7e69b04c09249bc81922c2d4e0831243f359c5df144ed5321b8be30823005cbb78ebc4a475edc513e4bac5dbb34229f21c6b28831fe000b8635c08fc80745588915ea82c5145181679048a49f62b6188b62428d2f56c69918a56f6adac6ca79398ec35cf5540caa5930b4646b47e85c564a573d88ee302d56c5d3f298c7dc232d07caa1db765330160a65b6e670af56c6953d71a7b8dabebd72df0e9bb45c75943d823accb3188d4623e8248b2c6c123d03afb2467a0616d13338ae6afb12a89feef297abdaae1024a8b77c89969b9e7a916cdbe16e8dabedd22a6a865960484437e824aee0bb1e8652a056c4c646cdd00951acc96f68bb3dd08976f3cf0e09474d08d44f8f9a102d371da751191027568e9038b5ba8b5541e0e504bd2a39344998c21352e42005323023e7741e6ebc1cd3ad16fb7226cabe1c213c3db122315918050ef50c7c07733a1bcd882be805d4806a34196108f7abc1574e5f360ba34a51f3e9062b6aaafb475a19280bf97292c0d7b3fc130ccf83100c0ffff09505cbefbc29781a716199e122193724df102c0bb3ac33606718c11c19e19cf365b11ae6402848ecb2ba3ba8c2eb7a8710ce571bca96fd1a7b855f4a4a8a021a29e58487cf52f15c39d723d6e2ba4796c8891a134a616c39ad0bc37ae63d68682c3a22516ca463845d9835699348f222d11001e9992804a767a4a8d84b599a1615070a94f9868cb40dc411c230284310ca1b82507ae604b5e72114281b271b07e711d51ca8ad91823e1892af320a276029df830729a59472fae00b2fae80670b18a71e7c210c2f9c60f92b05b178011870c0ee0483b34c167ae0821e64c1032fb0fc5ccd396743014f15a081e79c73ce39e509064b1928686079298fd5d40e7680e5bf8335dcf0c60e3d7490419ff0a4084fe842a88b31728024075b20d2c1101429a05481e5e30d57c0428c8e2d886006175560f9141759b0fc574f5e704556b405132920d085a12db8700104aa5859bda096f023728288e8093390b0a68ec4501ad1030ee180090f57828282506059d64b17b294c10c28c0e0820a39d6cc822dcbb22ccb9239504e41d391c30da848418b1c3879c2490b9ca481a5ec01a710a262b32ccb8a4aa8421670d691c371de814a1633c8220d36a802d10da20454b33ea63f3c7f986e66029b8e3a67f331574745e07a4d1bdd3ca4c508d65c5a5c6e3682ebbb8fec10ac2581ebcda56fef9eb24560ede6d2b97754f7d7483c5cb292442265b67493d529cd8ed3ced9ed9d2565f599d58ce86873922646922489e9df88de911462043e54eca6d06cb4243be9c3e98427976d872f9f5dbab93b616edb4e1b9669759e6e1a4a66dc37246cc02200c2d96976b7d3773667f5dd7bdb3e6f49aec8a4e7acaa7b76aeb4a9ba4b9f3d3bfdc69dda5c044bca497a7daa76ee84b9ed1639e1aa711ab77159b6d12ccb64115c323d576ede2e95eafe7aab26ec74ca62c615c1db67692b956a89e3b0e9a69b8b9c30f7c7653617c95e3a65dc56649ee3b867dca418ce454eb9c88907218a3c2ff420064e383d2ff420064de81a90244a9aa494548a263db5944ef3a6596737b72957abaf7884e0face98c9b4c2a63fd36f3a356d5b47650593c8779ae9a78ec8e58566f5a8bc225c4d3f1d1513935df593e58101022666b5e280845e565093c074cb4974db6b5cd54fcbd5d77aa9ed6c178b2b2dcbb64fba6d5bb6edd06bc770a557be6e1add6aad5d777a557775e8d56e4e02cbeda7ad8d6e8db72b37d356ebf66ada6aed6c9074617ae9b4643356afe45ee34a4e933502e21967e4df0ef992bc71f5d375db4a37996e96783bb783dbb6ad94c44f27f1d3dcd64fcb8a3092444c02ff44c86da169b456ae3bd4eab95b94ab5cd7695d3dd16aadd7aa7555b57d8897ab3e04cc71bcbebbaaed7630dd71dcee52eb6ad76ddb5501f172956a3b0fddba8f68e26aab5dadb5abb5d65abb5abbfafa97217074b556f9f221542f77081cd75469e26aabb5d6396bede654cdab70baab55a5ddf4d3c9a4c51928d1549bcae2f88bad964755fff2cef2e0b8ea9b050247bdea4dc3cd6b93d35440a88ee33c2a9e97cb9d26ae68e2aa25ba6421e2e09e65b4dda7dda0665959a66999a66599a65d2f7ba41a319c3cdaa8f10aee6c44e9755dff61fdba4038cbb45f360b81b34ddbee05200e3af0885aec237b7d64616b9af61fd6b50b84498f361fd16c1602938070bc1780385c27d9ac035ff7452cf8c918ad35a83c96f9bd48c422ef5f52d775a5605e62725c8523b55dbbcba9662d1dfaabf44bbb3bd3a57475e6952e5aad2d2dc789f32d3ee478699b2eb73ee763aebf5c36fce0f2ebaae42f957ccb372c5825af4ecbeb297d77140a757af61fa76799949994a6d2c96432cd592acd92d5fe3459b240586a13755f5cfd99ed5a6e5e4209de5eaf2be3ea9f398e136db83cdaa8d65bdbc9f1797d72bc747d623e4fedbccc71658c4ecc7d30577565eaf22f37a7ae5269ced3c5bdf499ba48bfae1277bae6755dd7755d16cb14c6b4a0c62bb333c808677f99f579da4ed7752653479bb409f580bae9462cb8fbe9742cd8be54bab756964a9fdd71da945b8e1d6591803a91a4336d5e4209ee6e321d8542b9b8984c285b6fca32c9711c976d36036112691ea75be847a52d94509875a77737d90c844d59765541e4b3ff90cf2e103e92d92c04e62cea4f3b59208cba178038e8c05d951b0edcc02df811393103fccee8baeef4d35505e17efa0feea7fbe2ea74205cb259e2d2a510b86402c2d25e00e29065f55aed9c8d58b0fcf3a1655289254b28b9e610152511cb1ca21205869d23e2e8423dd79d76d94bf775366358be74b34a4dddb77a7dfad9ad0d844d361fc1ad9962c76c6adbbbdbd9a9a7e7b2eeea70d9667a7d4b2efb6c0955545a15bd3af5f4dd65907afa7a69c71da72d4e963eebf5d17e22e6aec6d1acb3ce6a7796d52ceb288ff8202581b99b762a77b3c4875a0fa52b9f93c0ddb6dd2caedab4558efba6ed74574aeb6d2f9975afb572efb82a7d3ad975df5eeb39ae727fb138bd75f6e1dad9abcc28a5b26ee7b477d5464c6126a5ace73aab536fb691e2a665b2b323ed122b1946f432d6d4d363b1e674fa2cd668361b692398a3e7e8b5d36cd49d68addab68d6ef72347a3632812464a995c5a22899e523b4f35db9dbd6d7669e95bdbd94e354dda6e38a21f51dab2337a0e427ab54f13ea74665b07e94e6d36f2839645eed26e6fcb9dc2fad14fb56676f4ccd66b04f7474672760b886c6afaf6ccfe48bcbd6d96f747e2d235995a769348dbb5538db469ad699784bd7bbb32d330dad96c0477f2128b35b166eb417b5b194ff5a7faedb55fdfb67b664926db0e00c2aaecd9f6ac745b66dcb9fb7e8e7d848d8ed3dde8da9fa6f9d08f3e1a5d7b965523385eb78a434af9233524b48fb48f364bb3d757eedb394aefeb8cdad131ed07bd196ed908779fecdbb9ecdbb3ed4aa9a3f5a0458947bf227e9a8ade47bb3cbd3cce50553adae5e585daced6c3a6653733417f24c4d8e862efce428cf46c23f8a79f4b4481813e99ec947697523e2b71657e9b99bc79ce6ed6396f763350a6995c348932d5cfd767a7b5d69f34d95dd69dedf4f5597775b64bebe5b37ace66bad5ec56c67d66aaedf4f39d6abb3af4f46625ae287105cbd779ebf529d529846b91299455edf3b50565d2ae297b3dada6acd62d7b3565f574ab524a29e59c96f4ae9b49624de9f353c94dc271875a0f759ebb79bb9b137cfa66bb57eee629846b92a924aeeaada425b8de5c640ad199cd3f6dce8d471b750a6dafb5449af33403cace755b49289b59a6c4952d9b42d9dd66129c8b4ca1115019c1194a5c912d8513924ca196c2092840c11a054d0fa6a7305866585219bc6158edc1f2e2341039e59453ce93899377ced5bc5a11192d933295b9b468afd7b46c72f5da4ef74d6e72939bdcba534db3db4d366bb4da5c6bede13e4f5fad8a7ba7d54dd3ae8abb3a2faee8cd3d5ab5b9d65b44861691a9b7888cccfce6d282ca50a88aaa15556bb53d989b14d60ecb014b7920dccbfb4fa530d4bc525e99b892d12a57ab56ffb45a379b7b6460f03c9d6e4e99ec8b2beef984276a9b13555f6e325daeb348406caa1585b23aa75bff3a9b7bf0ac57fbb4dd4d9d4cedbee51e5cdf599dfa8dcb4564389ded6a456480a688d2d3830c5c2092e941062e2401c3d350419f8c562f4fb97c04cb9b8f60ee53dbe9e4372b933eda21b5b49dae56ed276a8dba6aea18eaf2d6cc74979663b5fb7c67ad77dd33d4487ea4edcc773bda6d9698d3b4775393ddabcd9b0fa66bbf66c761196765e9f308777955f45245df5d45af4ea5ef46f5beb8d2e8113cb7ce749c384ba677d7c774edfa64ef7ea2e972994e765f6abe73694175e74eb98ee3b46d7b776eebb86f1a87d58ad5ac52780497ba9b2ebbbfa632eb6c96785e3b4e94b146dba92b2849d74f9cdacca6fbfc446c7a3efdbdeb26f737adcff6877f6caf9f36279131dcbdd840f19cee2ff6c599ee385dad8f11d7c35b3ef500b1e92201b1f639233c7d5ad34f56c764fabc56a3a90ba50ea8344c17d54d102a452300000020012315002020100a080422915038a2e982d27d14000f85a44e764a168aa32088619441c818430800c4001000011899196c000098097800a1caffe8413427c05c2821e69c8469a34033f1b444a0d3989c73c3a20df00b8a80a80df7e28338c5bfe8179e278aa44a9a9a91810f581b1fc07dd0e54aeae41ab0274dae6636fc136ac2ffd6bc486a55923c9ecbfb5679578d42d9ea7d1a821fc5702348db7609f5b4908e7975bbd54bbcc27dbda8b06d5062b6746eae5d2c377f44fe0493044b60e652072c876bc050c56c42668b310998750effa6674dd3a6d5460795672a73cb96b660b38e394b583b0ebdce04d4b12000a373d3e632b51666ff0574d00f096ab17337dd04e85fa4870b73485dcc64137bd803e921165405bbc159558e38ab2b51f3c4b371c4696c840f664c8b9ce5494dbc01631e658a8fbaa295f4f97180e3514e5843470592b9746fc553506a5f917a4c098a739493c1cc3d5200320adfe4962e64401b1473378b10e485ecb0c74253390689f18312739af9622c195424bfea1b7c7a0d444ad04bdf194061d8bae930fdcc226a780629a68029be881ada70042906e6e861e623dcea7ccc50d12713b34696c6bab86c9d4185fa6d8973aed8212a20e100ad535ef34fe322a774857c9930a61b5d35656f75f1aee8044c2ee9ce1a863b3bf8c58b92af16d31828da12837971206817de67e748d329f2d4e3568de282851fcd0fa93fdd44b2341f4f1fe14b248303f24bf3a8a8e61457d71dc688b7a59fceadb2de058506169faca3037cda03c2cb3be188554bf614a05599a9bf8764cfdd28c77d0c1f0e3266b4ff8a67fea29d020e3c5ab372022172109156dd07bfd9dfb7dbc3a4367b3fdd8bd7cd66ddaa55559fea12d9f20f0e689a3dfee5f7d733fbdfbd096c904cb3ba0fa4d052ab67ab3d45b604b755537d97037a557f314ada66499a31296979a675d1003703fe13255c7d4162423c8f5521e06d86bd00eefed25580dad772b30a30af7e7c80c980fd872667d12a5fc20464019ca8e14fff34d41efbbf065074f97d20761289a7f3ab4e86af7479ef0de5a7a099511130ab961484b14fd81fa0c40ee10b4b6bfc4ef5179ac477db20c705f2c10348ff2cb59511f934324004d09dbaf5e5d1c78fcfc176d046c1d20117a8594f397973a1bfe6bd837c52a9d43729fc202217f4c0b12da5c1bdea667fb77cddfd1bb9157ae03fc96f781c2f859e196aed3bd84201f1440a0a601c889f82704801b970a02009230cf199f5533c4cfa0b40175008fd8716d239663319297c576c25ae6a0999e5bf825727cbf2d748f9facd65bae0e4af213477eb1bb6d8a0a77b08ea7fa0a2f1dfa2314a82dc3f58dfe88f1795c83bbe9a69209425002997205316ab9ef52500f1038cad506a49cf22dce7b18431c80012758a28f728caa926cc083d56b5d8b151e081365836dd1a236f1424dcaacd51e07f7ba26b2286a3a7a3871f34e41e0cb059b0693baaa720e96a01c408a22b63d473140b7cf822d692f5a6542c4148ae20f35a2f400b36c8b18abc02894cea3b1d5d145b2e15b4622ce62bdb60c1b9b77e5991aaaa46793140624a944a52c6099b6f53582b33d1e955c830289cd07abe0507272140a39b4928905f6c81032e707d0406cdd997dcc8b09838b32f1284e2229f5c0e13c9dc0503ae11bee50ff2df9c9d80828a0848f745c36f47c2224b503b75b4711d43192d203e2418fef4f2dc9cae9820d3fe12b70093246e26c160271f4b7b6e22d4c0bc4845189bdef7a51246371c0a86b45c06d95aa00641a7b8aeb57992f919bec008c6941af10c88d13415aed42576f7f50e16613f41170b0b69993f98f6539ef9327f60157ea7ae69a88eb10488a60e247b7ab7697a0b05db71dc526f68a2b12a7ab8eefdd7257f5ff02f0b240b053fb19b1a317918bd39ed872c7b88013f3c52bc0479f52a36784c3839984eba5ba0b9e0a2e955bb1bbab0042aa262cf3eec7e435b63053414241bd84c09a3e308afafdc370f04ee44badf7397fd61e5ad2463d0eb3f32a562443582a6d7b64f3dcf79e235026eb84ed7c0a2f183196f3d50887023e2f59f7447e410a425b5035425746b64a48825b242cb76ef698522c66d68eb4a78b864bc1bb25b30aaeae05c575f83fae004a81b1834adb7e35753a07afdb83e60394fcb4fa522864ede5e83257f3ce9c0d47b536e1b6518d4560ca3c63569faa681a503e4d9e8665e8fa0bc63a936c94e9f301d2006f25a9cb1702eb342c49ca0da16f01ac8a491d22b3e2e15629515218e63b69ed68864a06b1785fc5b88470d777941c6c0f56245df3a1b1e908c0b57bf29722fb66e7f6f0914f9550edc169f9b306231320e85ed3184e7d24954da33dd9389b565df513aa5d73e38dd78935dbbe11872665ed7da93120306123f7e64cc47ea087152a63dac71292fc1dfce03383095f407aea40aef58f9968810c3fa0cb582f4845d3e0f5d44ea6b0f30d8fded39b793ba0dfbd94ddd4c8704f5a04d3a1bed0ff830625fffc3507f6c0d1354cc57b268e72ec8291092e272f2484af7f3fee3c49a0a0629b1cda03bfabc04bf15d13a922f421e8ddd10f7dd67fa6cf345b1ea34480b5c50cdaeba16d3ab4a39f83419d92628eb29600dca6e6125652948d9071266e95bc7e8de7263be0e0b07060b0ed8b7a8465300c6e83157e892a1ec2e09d7343f5c66d7b6cf43682bfcc78bf40154feb1314c2b1843a825b257e5a6f1bb0e20b888a00f7f7ecc680daedfc24b63830be58739dc47b5d226199365dd44a3a358e1bc4d701d2a149cf90b36f5ae6829e2fd4761bd156ee0cfe93d321e6d7ccb82f5c790eb02b81787c6473892b0d8edae501784b3d287cf221761c81d7a7270d84fd9a121200d265774989a0e4d49e36048020371785991d14ccf3901788cce9c7fecbacd77e966779eb9af31a257b6bdcd406049d0b41b0f49284a86a837175dd36f846814e2914a53bcc92182b26540a829a0d2a39035908aa92b9d16606da2daa58db8ead937579407d2c4466a4a728e0ff1b983a8a9170598a6131884a31e32a408adffa66de6ab9121d6a9d21380a51abe42974dc9f20f4f59085de6784291a94814183694fe5e535d63b0c4c264229e05c609a3afddd879a0b69838f444c82946acc9ae91204ad2c1c573d80763c933e6cbb1b41b2a93189c290a04c739538bda7c1f3255565405cbe4a8842749a87f84f12101141a163ab671b9ca4d9a79f754dc30e3acddcc4949bf2eed50a3b882b83589d7ad7967604194dca8d94b05546e8b04115d2d2a98fb70ee7cf06f8f42471f6a561c0539b9510f91a719c16c32e13638939a22db15d8ca0721ef5874a87d58fc0f7f018f427606ab66ff6494beb343bbae594437c329c90ae0b26c68cb24d19cfde8cdbb970e4388cbdc334a32a0653757f64f336186a8a5b457dad62b627af58c0bf282c939b870225ab4ea81ea4f320283b935d776632d822f98cc796e45170503ab6f0a009b1d204ffb0d25406d72b84a4800a42ec2e5dd85d33b49d24c0736cacd350826b68d9222830a0a8d808196657d48a193b1e992ed9c2c7f88d32a6fa7854854f727fa263c0b26fbb2d42c1183f6926ed469e4dd4bc36d452e4243a8ba99b3df2cbbfa4f5d4eb3b34633df35d9c0799d67ddb9b33344a3ff7da8dfbc1a1cc00dfb2a1a042a44328aaadc98474c5787ef8b4567ddc71c80cd9f0f26be827047ce29db705bf2260ba0f164fd8c234dafd3f6052811df9c4e7351216d3a57a03b0440c3c3fad78d88e87691e4bd21fd4d475ef9669f087a38bc1902dd866e5591b400726e323f1ec7cc152a17f1d51d99ea23f56205ecf33eda958ffcd08691add25e247dadd7d12b130201dfe244159841e9615240e2000db977277f4a1171c3d228170d1f37f08833904a5b89e76e0faa8e33989860de8b3c38cf4ff7e5a6a99105009e8e10bd7d9b8af6fe7722f27fa13c0254948d368f7403abdd85ca89d2d539ab50e0fb1c6b77ac79f97e7bf1424790072ec3d3f068d5e4aca9ae84245b58431ea56fdbf0e8d922b60e79c9793d2f7ed0bd98401e4b1add0ebe7caa3489ba2e3d6d8c4afd65505a3bb730ee9e2ec4fcf4b1e5917b9dd173fb7b427bc4cad6c897c2980ae29637e25c7cd146a19bf8a023a5a49ddf6fd0d52a75411ee8bf0fa6066639acc641db5d2caac14ce8fc5b828d6ad64b8c1d776c6abaa6fa5376e914cd5cea8aa7dbd8aa001bd4683677cb84a6ea283f792c4d92728e94172d90ea72ce56199c5de59f07ba8c58d9cda8886a128c3f3461642dcf1f8ed911fb78f7f044a7bd8283cebae693ba54cda6e23f50cef8e79951e06f329133368d9378ac664e1ad37448a124adfe310757193d6842e4744405558665170adb3425058727ec029aa5eeb532c9ce4749ac5ba1dcda4c28ba026b0455a3cba119fb6179933873fcdbb88729d8f1f8d152f91709aca28c48510df1ff78c2c7b4d98b1cffd1312a488134b835683f2c856744feb2a423895a6e4bb6b81d43aba8c73f02ac52f1b0a48f8f459b2d7b42b0f2361e745911acb5ea9f724cf36591be842eaf29b2a424e696a403b8969864044f31ae3ac3ec6e35dd45e5c0282c086f9c5233a1199dcab6ea4421a668c08c33ab93a32c95820ee5314ad38506014baea5d0a8a8b37ae70f4424c74a7e7b291d3609bd7cc666d3c89664f13431fe4de45babe4e17f5485c632c7fc6d73f610f8ba24214ab47a0903a741edb61833c9dd352688c8c6d156a49b9b651053771350671b2f9299018df13c1f364fad40f814d9bbd0e48f532a370869a67726080f43f72dce4a8861ae44260586a5a9abb02315661d8251cef9dcaee36076e6099a225a26197ee67d8533fc0694fccc78381b33fd691589eab960237ff02e3ac4069e5cdd023c3c78a814b44878cf4a1cc7f49831d84d22a186ddfb91bdab2ed83201a74b456d7fa97e95129cc97162e884ce808e1369393c7b3fedc0682059878d6101ec2b52480f311e0c44322031cc0ef2ccfdf6c623dfcbfa078ccf70f7066b5f9e05b5e926d903202ec2d7bbc1e079c5d963f8b1bdd6d51f300dac6b856819059c0a20fb4501dc0e570551dbbe0fe91626c4bc64966e618e25518ffff6e86d2d3eb323529a3e01091029385f7c0a43268bd1772b092dbc358b5db98cd2e622f2bb458670713b81f021b16583ea91d1f95054bb3d5625dba1f3df6f5b58003e28b0d22e3fa400a0c014264bf9476449de57fbce001c95d8599576f6e51523292989eda2bec798c888f8e5f288ad3e0ce3351a16ba43361b576c93ec672d653953fbd57d79706b460fa426d5c34a14219909c10c0e262d741ad0d8f735b5070cf0f5307f8ced1a9e7910c84ca49ae08cc14c1368ff0d0a3ff0ac1d7373f26637e10f599a9bdb1fea8753e63eb87421ec3189f406980185ca6d4ff5e2b3009c04d0d4e8f63775ac106a6f03db2b5b170161e07cb617afe18e6706810a76653d56bf9c84401f171181a31a80b6009c270854718aa9c7272ecd62abb4531528321ff5a36d5952fff38db567817d8807cb041c0f3ce7360a3af2a4edd5c3810b7afccaf670c5518ca3030769392139bb93a913d37dab605956fb0df2474f899f135de11fc7fc776d7dc6e2624a34e070db85e019e78d6fd54aadc58fc138ec2ce8da7933c9d8de402234d3da4869524ed352c03bd6f74fd516a23830c5c1a8a94e48f01c261f59a974ff49a513c873e353f03534fbbccd720ae44225ed6531f038b32ae64c5df0d1c1f3015d849bba7a0dbc6a41bab14dc1c54574dc151678e200a99a1c64e1a10202b5272adca59ec2f89fa8ab435986e03fb5dea8cfefdd350910ab685ddec3a54d09c4be7d28e2454bb91eff7091df0d21d05d7870f7f1beb81cde671d8572e90304dd91104a30ad286ec68a5b1bb6d6a01b6b75b784273a25840f0f21193314c952748a4c8d8fcf462b111b0e2602b406e62e7b999b779bade97f320f41748ce2531bc598aa268ef6464e571a4990b059d0a8c4d30b9dd4fd1ba391b3b060e845abb735a221803d27ccea53f115cd322842ad72216689a517c14bd4cac870369f110d0454ffc84fccf49196b1fa39526665640b714a9b04882d0943f8e9fdc175766ed66e0f8de47500991826e606e513879750e130e81f3e991670e700e1d157568c09a6980d5431a97ec485cb81731e3dd77ac4954b49b84b9b763e9cac8b5d2454abc20050cd129dd90968f322962e5e167d4edb82c8829a8cbd503cde045b332c3bcfa9c20f613b9c9541e82b179a745e85f3de2c1405daac310f87833550f6837fba60d85f9175fa50b8109cfafd0a9c399ec8145db732204e6b0362aaf704288bb8f9beefbb509a3e7ddbb75a180cf3572fafb849a73633393a9d06306a468799b77696733c626573b508c43eb0f2043cb65249c7bef3001a818f9a5c72999a8f988443f4a372a2d648365d7917a318b1b10fcccf9b858d180379aa90f8a848cf6b8c1eb22d9848a9e28f4a9ed71963e6aaf60eb08164981d7eb806ac7498fa0adc40b49ddc7f700a8432828859b5f1a2a150086dcfb84a9bc5c57533d48df22ca2cbc0ae1021b9f813c178a1f92e99357f04a07d069c578e85a97d2fcd3a4cca316323c13d9a9d8ad3b5bbeb96905119392b37062c3a2613804e89b982d8c94b0c25329f556490741967567157592a55084c9419ea3903d1ea5c6a38bb8ac8fa850fe665fc8683cabf6af4e9b5f2d20e9cc4d99f2184b5c78a2fc82009122307619a789510ef8ce3524cf2e8292344e6d78be15bcabe1667ee49b844b4f1419f6e50c705e1b8afd0d983540cddc78308a4c72ec8ed0b90b405699d1fb876a4fbf29ca6dd94b108d202368f74c88fff79f516295e0578e9a107383436268f14cb605bfc60b429b11f414ff6cd4e71b14cecee581b17551d8371e1b3e06ca7515055303f75f382a5dd739d6d7cb60e86eeb8695c94020dad2940edecf25ef488dc43b0b851f5c38e45a6e16cc99333081e814191238718d3b7513c35592850693668b0c0109b50b5e0dfd86aef61a0c1e17fa7c48a4b700a518662dd2d1e1dede046675454cd7bf5809f4185620c498a2ee73f5fb5f79a88086c207986b408a954b5f5860f7558b563b182dc31c82220c39b97dcf1213b59d71e4acd5d474b5f9c55e5660798e82dd70f2999cc6f1c6e301657d5309e77de580f62803562211e09251438f7981c223485690f9af09570641f573f41dd7a223e714da1b771cb87f46f1dae049a8868c4c6cd675f3c34ec9bb2eff48e6e9e776d093c365dd0b7b62c817c5ecfcdff881c5e679c32435fa6a106822084b7740e4b9698920323b309e934bca9693b1546f62682bd43a785d0a71245ad43cbfd79a6c8ee08dc8026b3c606163579c93c259913f7727b21b2a89247e3d61c414e0fee5374f334c4859adf28d90f92e86fca1d8bc1a160e59109a32a8abd5dbf46c0d2d40f7062304655b67254a5b65ce56315dee2940cc3a871824f4c8e4d4601a390ebbf33c5d2505e3d45f60e44e2571ef6f0273953d5a7e932925a091344e71763810a70dd0043c30c999c8c43f56e426548b1f2b4527e664a4983053c2a0fe387dd33153a95310150fc5234674d6a63ff39584048c9e879c5b277a592fddd413ba844bc314e8a872a9a2153d567b0b719c1e8922a9cfa3610a64e8d53b50772585c5aa753e17c3c02c7d24b25ef828de32e41c5cfa958ade3ebd1d230803ac0d7a8edfdfc67b7ecccc6a44caa12155fa7ae86679fc5f851d38c7cb1c2bf64188c7b68ee22084d71c6f2df35d649aa5023c5db819d7e3bb2026b0e439942c44e2a2c2597029ff7b962de765e6b0df68c799cbade72932c69a322f9fe5a33dbd749d8feb36568ef0665507153afb56b8646c58fef19559b651a23ce1b8eef8a9b15311a479d91ffcf5e5389f97c077a7ee89e288d25a58242f37c686fbd26ff0e2305acd5976979847e69b76070f958d8ba3e11fc622d426e7ac3374d362891280c8cd4995a8f3a14a770273e67a903e2fdb9ce762928d1233577419a81a003397d6ef743d626f440ac031aad0beee75e24f60f8e6958bfa8b0759a80b5f07feb14d0b00191629f8be4fa1ba424ff7cd445094f1df8c03e5b884eee5cb9c9c0ac51491764b0cf0d4a13a4e567b7275a68d9ec2ab8066ba908af1cc4aa2767df364ffc8ad55d1c97b7d38947daacc59ee9ef3405716a0cc08b8e3f8236ef84dd94c9abcf3f8a61d269fe8a5b1deabae144433633c86e532eb1cf303269a9cbf10ab3c2b34c29d3bf1e1e7b51ba85f77bbe5206682f31e627c60e6623836b34e9834c0a87067dab1c84497087d9ba7103a7a515513540cf02f3c6b33d82a61d2d3444d9e76d68aa73a84347197a47f52e3611f0ab2292749f314706fbedd640aa8e9f3de4eef80bfa208c291ef24bc44643f65cc7b3beccd18b9876a9029ea26e8b3780a58c70c8cf047eba198f900494096ad234a395c5a2af0acf9ee2ff94cbcf671d2bc00fd498550e582c9e8ea075769b8f49ae848c2b9649b006282efea2f62b93cdd4427c777137572641ff1559d493689c83fa799f0ad2a498a62b9a5e17dd8591afca494ed7ec0976886323d3a53a32f58198064e17c821f0534b88732554bbb2aa244c3fa19fab02e0e388a67e0e74ffbd02dbd9c837539b4f3d607e197f8d0b59fed03240c19625cf0b8d5dfc63f2f316886dbde0e34edc22f9cc51b4d8254098240ff525a31a37518883e96fce53a7a2e396719f3c177ff47564e4682079919049ac231010c2ba11f22e6b8cb05725e4a544d8f5b5d38aac5ef1cacfac7a5f6efc45ef773bad80fe5ba619cca85a46d025e76995dfaa289cf583d23f9e6388d6728deeb6fa354e564287c37e8c67940ae55c2effeac80e6bace7982518e3410cd0757d78f2dcaa7625e6290879d0f74697804d5d48ec8c6de548afdf61c5397a4a9becb91bd93537ed53dd9fc1da359535c12b7b7976a1214eb11103bb7e41b32075cca6f954835f45ef612bc3510a4e18950aeb67343fd4aff41a6b823d933a9c0005de1a0c7fc4c14d66444eb41e788b76aaf5f65fcd9b1376f20bf012aac9ae0ee854f49a8b8670ae2b9ff7f9030c81f2e58957bca0b2f070735ba2cb5d7ae02d982d961bed4f9cfe85248f35583d228e525b8a8c14412508a3e26ef56b50a333d1751ece082c9a9cfb3b730a198479ae441338658abb15eb547b1777f3bfa6de8534237f6068063ef3d02f7095d56038a586281d5a45ac7f48455600119e30ccc90991d6198d34b500003b708e0961bad21cb1db976ff61781e1498e3697a7ee87e4d85c0e881fb666dec49612126d3bb993e47c03f34db4e6e619f1046909fb9e5ff3c0622fb5a75b1bef31d9c078ecfe044648d19f3fc9c00eec5694c543a383847c2a6294c424c65dcf75ab29b14efac24586f7104ba957b3f703d176880cd723b5ca97df162034d1e5de0bbcc7999eb068b04b046e4bc04d1073b0bb5ce882db48fc2f9da84609a097b6aa6f089c18491f89e20a2936840600f6c9ce6b08ec13dd4deb968cbfa840c34206f6d40eaa7a80d2cabe5c402608c82087160d0a6f3668adde051acc730c81b96a706fac28d8f5bcd3f42dd70c2708f09cf294c8d9288f818464c698b12edbe4b1440c961997f25b5635dd668ba20638bf87375c819e93176de582aa63c6454a417cbfc92004dddcfbb36f1da8440ae717e23f84c38d0104dd135755fe3c629fd34c5382ee27299bb426e816c2d7c7d913390c68aca586c5a6272614df4a9724e5da48d924946ade0fb64232fae288cf74b8def90d0156f295cc4bfb2d23b1701424039b29639d3bea01b77055160a4eab48cdb89a0171388a28197a7489717dacfc2db372989bc5b69624c7909e9a8e5cd0c6ab2bbb23009770c0c860b8dd3a048a7f7e85bf5a383ed441041680f7bd92ebc6ba9defdb02ff5fc687cfbe146406871b740f4df3a998c1b5e6cc9fff53f959da68d16b73cb9e796f766080754b6e1da92ae47428b70c616a104e4a808ce3e4c32f345678996a6ad450108e17de4867bc770a9ff31250dd95c52d1026e4aba7b8ecd69c4271a474aae7b96140040dfc055167a347618b8e20b7a8cb8f25c62092a64a36140af0ffe50902121c0dd455127c768154cf6d931075060f4a15c20308b6d91858616cfb7be83f49bead987752abb0d73a74ab1805820974543950faca5c4efb9df068c00d50d75184c403fa1d5ffc189080dc969a2d63d0706cd5f22e2d9475a6086f984e71b7a6d91a28698202252eb835c2363b2161ffe4ae37f6ab76a07f39690c1c0e53dc9cb5fdd9812149bd7fc3cf543813195f4b51f4d3ebcdd6e41c066bcc37439ceb5c85b207f72545fdf1813901ef2194bab81915950acc47374f89a8d7548fc810d8c372c4279c3e0195b7362bd8393e7988bd0f8c7729d03bff49c66a84c05855e033f1a1797f5bedebbde0277bb7d37cd82ff095a6c31318f4d8d3dbcdf02214f6af8fcf82ae0f782f7bf5fadbba9b90341effb13df196966dd51ec269c31a922116ec2e18c0da0f4d232ebfeca801413edb806a43921b8197ae8ed8612d50873501a5010b75dda601e66daad8c71f6b7c67eba9207cf36b4303b299c9dea946b8a409e2fa237da1a3248bb36f00cced9b8710e5b6e490ca3d2cfed6af73328f733b5bdfc03df598393fe75f24b36b356ba27e7260a6a64dc7c62bfbe0e9d310ea25698960e1675ec72e60e4b174b730d8b0aeda5f1a55ec3846e27cb431768d5c2b520af97b6a1eb2de93f999996787d8f6c5ddff703c8cd9390b1ca0a157f66e9c889962068559d229657b275a13448ad3a7d25326b71567f3112cfe2a5f5a88832f896d0f32f9a39e5e983714e2d1d4170774fac80fbfc80909d42d5e7ba102411b2db470ff6b66bf40a560ff5b6b6cc30f8cf9045f646a178441153bb3c6abab25060c1dfeaa78ba38c25a2053f52443f021b9dc6c21a9b9ae310aefffa77da51d90ba17b888a7733cafb7951eb0a2e3925be1811836095bcb86d0279416f6a9086a0711171508bafc03ab2609dca02b343d59a57b4d8cdae2fe42ef953659652844065b438ebbc7d03b96f9e926b416184c1bf2dd7bf3230056ee6d3a1b34e96274db6a8c945086b2b6a3a14ded4a7d02ecc6d32fd09e7d1e58440c4f1c3cc39f298146e4995666b209f59b083c99cd73ce7e86f075f284db944acef61d1b1029a862544031c27960ab219f064b0aae2769b05a6e52cc5b42cd55239262a69d1cdb6315432743e6fcaa4172c0ecb56e9edd77500d316763449b35ab96a32022e1694e4c7d269a72b4643032eed01cf54893eaba560991b8753374209c0438144c3803e6695e5be0a6d3e2669c1deacbfea385db2b9ba3c5f7b5e601d73633da8b06e086cea2b37803f41280fafe8639933063984e6c5137a5b26c7f252aae096721e4742dd18d650c872aa203de88ad82a25eaf002168e3a45666d5494eda5bf1750a6d48de9665ffabd444f4d3e0e188d3cec3ff515709b7cb3b208a9152a9c06cf25669829bf7b7e9972ffee7ec020e064f5c72c2bd5a4b983e4d0055d6c4baa7820db828a4f91c664fa15ab4621335bc41b309aab86ff143d8a81fbb10295c3301e1440bf22638e517264b44f8a96658555c97927aa2405589ef8f207cb7fa30a137a1724c6e8c17521e6b7e826ca3958860240a8c75438d62b1d8a454e2b308118422a420425b12fb3e32b8d12b1169521523f3d046bafb2621e9b69e4b77d01d0472304245988c628c8009e3fee3232502a69cba294d3fb12ceca1f24f45f7e2ae19b5d721b7fc2b0ac74449ab1d97ca4a23f18e11bfa9485270c008cab3c3a2b731d0f0971f9796e9e10fdc76b8b83c71ec48922a577df48473089cb02484c0d19f2426c0083832844bd8223a49425765c8bb36f3280251bb08767df724de3f929124b2b5a3ea637863f41843e8d1f18b8d4b25216745ec636c4033dbfa20edec537866a926a0addcbfd4deb3770e6ba28147e7f935b68535a0dadd1778ea64c4c32863d29e9a17ecf056e0bbd2d426c84b1e515e76dadc1229a207ebe7ccc890f00ad019be2f6247c1291901f11c0fe8790fa2e4dcded323c09adf21f2779824b22a8238c43b80c7840ce787cc3c52972ee19da7423f5bdaf8d2777bdb9408ce426dec4a19091b34a9b1e1e1dc083c30a9bc420b588d6179635152094b88c8ababa355d845487a41ce6b7b321372b7655c6ed94ad565d5d3c142bbf165ca4435b2dfc276e23765f3f3905dffb25dd2312503dda1c5f7ee2079ad3282bb91d289b6902a5df97b166975654a43f528d5750f456fd7ef3506d003a58c0cef0b3c4d3cf5fd0ae22388da3795ceb6b8290107ced4cb62ee80235cbde6790d508be4ad864dd5e5fe468ba86031e9aaf366c822bcde0266c2591acebbb354f99b9b6ff05cb57e3ce60e7a9066a1771b90dfedee07da43cd6c71b5e762c135c8d59982ae0706648b28aaa8607ccb9215b05c742f8d3d2064961b9219d864c357663565f5d92f727d2f384558d84d095ab23707b1ae7818a785d6d23232077cb1ca75236a39b22f56d28528d7cee578a6b203ade6d5b67011824d971a9bc82bc23e0acd45b1b5c6dab0f113b9052ad90768959d4f2bac0e56ba1de7c75d2423f70777bec802fcbd9c4837370f6ca8027383725e7734fd03eb28000c264fcd07265d26c822282a7a1e940d32f3e1a409e9475d1c3aff504ff1411236fb15f09da0080ad2d9faa5500e89cb2ab78543286ef7c6669114150ab860bac2ee9323d5a17869cbf015a9ca115f25d2ee5609fde25de377d1ac15204a97d88710a0c28420ec3fab5c606467243f1676b35606dea499e4bc49e77b10dafe09b98ddae4669c1db4b263a39c2e03610f27a54bb652902494bf0eb4cb47908b654cbad28f23d10683b6b1ad668f19bee2a5b209fd877a204e16755c5445dcd25207a3c95eec8d9da5433f41407511d59bc407c40fb075a8c4a3d2c33aa2dd97618357da88627a4d39c1c590ad544a990b7d42e847c9eb314497339fb44b3432bdc45359f5bdc2d312f228b5b41cc578c726c09b48bf77034617da9acb212fd6cb741e5ad1a17d65a4ac6248b7fdb1316c1503819ad616c62a12379277305c10b2b9a211714a69a794f69f93a809679be5992dfd5aa3fcff80e15c25e5cc0058438df036fd247a760a6f27a42b00908411f0c1967b6a0cfc041d9ad4bc64a195ed134a9945bbc96d33b15210297ff5a803f2afd38f1fad40cbb2aef79279cfc5d697ba8c34b6bace150420ea409cd7a5d0e66beb5c415734954027ccc9fba373ad366f5b93a9ad2ac4565039ca539aa2f8589e7b38803fa7a75447e0d56dd68cd4d8a3abfe9c189c1d4a02d493f6eb229d1064be27164b192b5ea3b9874534475272bae6501e9c11a3267888cb1e2a60448d09502d54cb92e73de7e5a41f23122b5c6a7f8da83c2f86d16f21a14b053833f0730a700e4d62b0312f560424a0aa9df165859517ee45f9a25bf32262c8562fda19992c29c012275c43a1965a622e357c40ea255cc33ab0c1ca60e7244fc0065ca263dd6f45c95fc9f5620b859106c0bb085b825b265f16a0c2383828aa3f5d97321a46f9a31c2314dcc8aa112d5c15e97a47e9708f48c2bc7047240c78d6f01946d58134467917234d0430ea0202100c008d5c68a7205079b88fbe19a3af19f76faa0ead576b2c00d735948602715da3aa09feb104d686a6f7a07e42bc2f77b748fc48a17db5ecb0a3823db0744b87c47732b15e7e6408ae9633dd1d30a747868d766d498ea41d5a8d6f32f5c2e70415404220ea24805289d66565ce0f773bd17936fe792302041bd171f152a36e872688f784a98bb7322bcc28b9cfb69b01cd2317119fef494faa1197c44fcb2aee1f3d18a6dea8bd0e45013e2d6a645bd4f2236836bc0a7a6f6ac40a9f089ce028dba7eba45cda3b01cdede011b54e8869c2ecc14122bc7e6c6489258bc375fbe9d2e5548ca25b35bb14b79bc229205915fb5b21ad41718513738a223d05a07c74dbd8125b2262b05e54511c81ae23341b1438ec546c8fdd2d3a9ebfae039aad67dc25e3eb0df93283658efb1446f3696f957c5e3d47e5cceec50aff753863bdd43b503457b464453fa3faec9eeea8a60c72a06431d60e63eb007efb521afc59271aa3f69642b24a72ab88dca9d627a2bed39231dfd3746125fcaeb797f000e5ee109457d9ecb33707744e0e51f4bb48588cd1dc6a57d12c42339f071d03758b386e10efb2720459bdb50f9ec42fac23a01e819e0d86bd72a7d9af549fda3793dfb5224b3853c46f6be9e5633c53a91bacab2714ff936a33ccc6ce6673cd22a6aca12f1a04dd85b87ec69ee527a9e8a053497782a7051b542c58a938ef9125fac64df95a7d2ba99d9dbab4f957a0c6f5cdf9af00ebcf8cb7e50283e96a3fd20f2d79368ea0c8bc4ed254e2b0f0a80036fd8347019ba6926d64449f9c622ace76c8ba2af52d2377cd1f81eda788f3bfe6593ac93fa211af92ea1593f5a1a0488fa7e9f3c4c23b8558fc0cf966c7811231807e479f2eccda48a62e4f1e09a6a710f32ea4b119d6c8bee8c87b17014d01848e5e2eeeedabdedde1f6a79f31879299e426b3cd10f689545fdaf18dbd16386aaf66a2f539340c7ab1317234036c274da1c1af83811cd559e7467781c82f6f0aa3bd4ac312788358b626ccc06ed0377986c461ac421a3aa24258572401829e97608c9e852b66a8761a77bf84a5e461ae77d941e7964e68144a0abfe3663bc4f2e26679787f0e2d939db6c6085105612899dd5fc613ebee91654ad1c855e2c86cffdcf1ca641297a932ec242c45668cc597c8bede77294927f423e2d9520b30e7142e2f5032264a26a9bae5657f692269c51281f2c469b794383d9ce2d8e47abf75f2706b495e12cbe8834b6150a2cd325b193b4c7f48aae56bba4a6b262473c0bd50511ae8b752a17414b1abe0ed5a298315fe68c0655987edeaf493944f42204542d447483c5aa06bb400b013673a3c75a012bd8935b217032838e3f49dea13809b9d8ad97cc78fae2c1f0b5da9aa8747aca22e5df9528a59baa82b17897e3016d8547685b27d048a48dfa9cd47e169eec8b4c11098e9282dab33262cdc1f776d00aeb8b8b08b2258b7554629e7b45887f242fee209ed41dc9f056a899b30ff8e39f9ea745aff34ce6f0d98a5ebdaf47a56b8e0aaa520e0b82f0155e99ae80ae9bbb7edcceb03db84846e63799794828466d87dec7e9a3fc325df9565710d73f4c083567c8b78f121864bdadaea4a9f8492c5a85e09b449df7a84d86e562ae841b130cab48e04c78f35583ae4fb0c679a065f1208aa4788af023ec8a707a94d072d5c368c0130e02c48d62830bcc5683b0f9249c4c921374a9110b2e13db3796620bffea7da0a919438c16f211b85cea9390257da996cdcd767eed05b292d7038d2a0734ef4852c9990ecf07dbdac18f4954c8552b2c4db37616bab3a19cc5874cbf7ddb95f8d968b1344f705d9c5993745a32021981ff79d90ce58f3d8b7db386e0cc96e607120a321bcc5c5199c2e4ed96c84cb7fa157e1dd358f013ce55ffb7daa31e27ab5aec829bf4a2e2621fe59100d346fae3905e5900647918f99bb992b2a24bd229fd4c5e5eeea88b9d6cb44ba7909b9d08e2b6b35ede243e5f068c61a86714566cec28f268abfdcab370bcd4349b29748a1dd16e5d78d9f373a0c9db456d1e7c50a9ea79e304f30ebbbe1730c799d86e05539709d018ba06187cc2955f0c31defaf578d4b3035054e02abaa3168d69df14db837ff4a5be620ffc00d0876d02c2f2bc2ffb268755f66f1c31d740a72284fe20ed74a13833c1dc681f3710e5a3b340eb207954db1f36f94c1c876a9df1e6a3ad4414a720e75a7e45ace2137467666f12310d6063e902555a2f6554ecc4abff997218906ad2ec68179b6d1f22d6c9dd1027b7768779fe993e9fdd378c05345f3c2526e2430f14a7c14a98c390345e88b39156b09d6359c90171c83c6a063ad35649e36eed1f95e42ffd3352c199bb630d2cf76f7401405663b35e95316fea6b0ec80f14e5ba4f995001d8685b31eeb097a98d20b441f1015eb29e8580c75cfd55ff1d42a2fb717b4990ada575a04fe0ab28f731f8ef2e2ee2c471165ed8760607e5e54225c5b2ada6b53b0b92a6bdcc351b3ddf8020c4d0905b18d4917497fee37a803537a2391dfd6ed7db8e20f3a172640c92752a351a1e375403b43ff9c65c2d9451ea91710cc1e5c2cfb5016a661ca91a9e8572f92db7cb86b9e76c5bf0158f7ec27dfa8e07186c1e593755a5b97f06cb4f1d50ee7ff22e08bc1528c99904ca6f33ca8fdfc6b695e3ecf057f522525e3e549a9c0809a94cd2f7e964e857e866ff652d2289d3d2328aa6ec6e611381939f1a9591d554fc6e4315e69ba638d54580cad5d6a6a8c6f33dcab4aca4c466a2a33210eaf18eab68e42d607742fa5a7b3b47af6a164c08a1cf58c3f947e4517e07368dba70c96d15b2dac68117f817dccb3f200b3f432febae8bf2c7adc5ea755f9bc0b41b98fff26a0a19dacda8371294094b8a458d98c6472e08b9ee0245cc6d0e05f8cd85c754d562a691d54000ea0d009582523ae78170c201e10a500a146965d4ad5709281497c09c9011004a2ff5fd944b2a16e34a7dd21428a1fd37dc97622201f6bae4581f76be2114a73a3f8297ed1de2cefcca66e940718486cd467a063b3ff22053d7195681acf386dfff804e1203cd5893ab9d97fa5545689d68a078002663325156bcdb780c9c5e29fd093c1c18b60ac46fe110208e4e17932bc464f22ae45e14fdd76bf644d79f80b638b9d42b3d0ac5cdc358449969297cb62c7cd1bf90e39610935dd333d74fb7bb013c8f62f72ddaa9ed80cfc0ffee840175bc5beef244e1e011ce000ca18ac445636cab20e99281203dafaac4fba6c8668be594747ce6529018840c0822b85925d1e18e1c6a75a10d6713c6f835ee9c04fc0a07e5c83100f64cb3dafb451eb38187d60c047d46e86ec212491a6e01cda0d13c72fef6ea249c565f66eda08ebf04b6570380b67257940a907692b6edb015229ee9ccd831c3e65ccf8d184ee0a0ff0bcd09f8aff1371451f71dbdfa2f53800f4cc53ca9f36e078fb1ec8a13512e26e8bcd37430748e1007a1d0f008ce0fa4dae4ec544dbab2ba99719805f45e8ef475aaca684fd409da4afe9e07e591f02df2832881e8993e37d9370750580da6ed6c1d051bc526b784d0304ab3235f9884ccf8e67ef45142295142c22e1041395b2d360fed6693cb579fc6571b4e1b93a666f7e0dc24ed957349099f135174f2947eb144d38f497168a82ed92b9f089aac96c1fe6a098769ad90ed4ecdf3f94bd0d4b2543599bd8c19dec8bbb35d81e53aba7b17b285a099eecfc6bd33fbf75fcabd9ab4028cc4336f0d4b1debae90b7b4a775f58fb3b878534d4a6611c72409c9a4b8e42871c0a0d7904b4e481640915a48f863a8eac59312c0229b69afd815cd9cef4eb1f5ea32af290ca7a2a6aaab33ad524ea7939b776b4dd1f325bdf1e553eed4b00d9a5cf22152a592349aa01fdbf8270abf28026acfc7b76ef0c4fd6a2f35668d575ae9c04b8b1c7a37181f12aec36d9a241652cbff29fc48767395c0e95b7a8f3fa318c4f3f242e4b42a02dbced861a6c976990496c8bc1ba63fff91558f2c00d9aa01cf44547b092c48a5927886818f33a4768ef97e3e5360b13cfd52924c02584a36ac74b4c3267711d179ea3d067ef1cc370513f5c54a1422045c52cab0921045e9fce21f329ef29d0434bca93a968735268a7f826f15e6c7881bbb4522d0920a353a05afaea93eb0640ec70d9e59ac50fc50f78575ee26b54dafe0b117edc629a221a7a49fe4823f710506c3f61b416c147cec217073f787d8c4308f6d29c65183e7ef6241804c055075e60a735dca86f61131998a43f707f54b4a4d0de8e3832fbf0514a73cb6d08fff2cf7e1c47ce422b4ee5e120f6d11fbc9ff4fcac5f1977ed89baab6c4faf3dc63ebedd1c83571f7704240e05803979c7ccd7b1781116a0a9b9807ab15de3601c581fdc507fb6639f5720b7578043778667a284c88c076d8b9ec59cf8653c565dfb634c358bc81f949358ad97f979b197a5074d8aa66a3db69e391610668439ab5300e463e175c95b30bd43c0ee7c1a1872434b241d3f1fddca00b926f9b3ef66dd7cbd591fcead3f4852139d216c055434100aedc469ebaa41bc76bad9ca6ecd69fe33897b62c1c4edb388801d79660f8d7e56951e132c1c280dab6372d9f313e0975cc4a54c8ebecce802f48e2d7a5f2a14ff698e51877f79ee43a605ba0f7862fd4fa4f17ef3393e336570acee32f0770ae6f94bb7ec64bfed58377f64a9d2ff47f5e6ca44b7e08442a8ef28eb4a6d219644f3f04d2d95aaef39e81e60bc37d63a8b5823bdb2b5e4f512dfc5384cb157e55eb8b7a8a0ca40e3123fccf3383cfa2a3d7df8b204f368e49e4b8573f667478e46d3fb1e9c6d496f51bd3f32b3a9f9f0984f08c55cbd0086ec38850fa9d5b77cc48f7595478e72f157c5db57f578cff00331908f063ff1384b5bf39c198701e2845abd167205cac1c67bbb1b1405bd5683a7e403e76773177ab89a0e25d2f4f377973ad16dedbfaba66ca32289edb36814bf00b46c7706de844970a104f55720f2adffe67e8c60f7e1606676b6ef24b3921cc0f2a826af0fb04fcc4678029e94cabce070bb55bed79e265ff8fc3aaeb1e9a251618fb46336ccd520abacd6b36d804907f4f2456197f4a3e07293a29674dec22c13b09b216cd606822104160ce31b570c42c8ad5a855db44922fcdbb7a2f93bdabafe8d786a6c2c71f9a1aeb7070f5e5af63e73f871fdbd192c49c29957409337628e4235317cf330f4c6b60f951511ef3ff1d6c56e55fef916e711b3d259190a68cc886eb8a8afc35a253446f2da058d08c3ee9347a0269c159b2310d11d2a8e597924e53546c9558a9a48e841945f0ef1510335ba163839cf9f342c2e99cdb2305117680d134c2b989500904c0a3e047d999bc5b7c8aac93e5fb847ade21c19d6352ad79ca322343d6131fbb8eb1d59afa81de6d46ac8d5ce26f70e1a9ae90aa92dca139f664095ddc16d992bc69a926b8be51f2141da82b6f2c5f7bd302a4f34cf2d6ada6aa0e246c20a3d95bfdd960315e00bf117e51aba27c94bf998bb49bf6b6576684d1701e2246d1357d4493d080d02afb66d7333684eb6ebfcb61d3753dacd05691db2337c883ed3324c2e019982ff0e6b07313a9aff6e7899f7f916247edea9d751567905a32f48ec04b394133d48ff1ed9e59d719064167283fc4f9b8b08dc1cef1a40b834421c47da3a83c107ea766b669eaf062b9ef48b8bae6221c66272ec75678af73c5c73e35aa03de91e0a603e1416329bec4f30a342dead34db87c4a96ed8e7f1f97c181c6de162c44b75a6d80433af204b68232e2e7676101a70bd5b00ce0039a5284210eef05f5d02416ff3eb9b31f5f771804b923448d1bac7c8611278666798e3c754310b3ac8bbb16ae399c1ab28097c70505b6c0a1e9d7eeaafbdc22e800ce9297225e935cd95106e82a68a2c7ff98c54dd8669794720cf73f0632974b3dfc4394e45906c8d807ca608d4edfbec1ea9863deb727a89afe7027c3effe06aaf9ec2aeccfb90aaca0e46a30c37893f70e74763ba38220ed070fc62c994d57ba58d2319fccab90edf49e6eed88dcf754895665ee6582644e64d19856ec8ab919b52affa866900bba3bd9622f66cb919b4d90278119e2ed4e95a222b28363d9648243a92f1114c65eae7704f1d25c64211bf8580851fbc8be43dae467c998c556aa7d0d278edde768a59d2cd550695f67aa47b9ee86056f5a96140be78365eb13b60c36a3612e5ae8895d097ac5b9652f76f1025d0709f6ac34ba99ec32173e8d94cca07c89f90aacf78f1589fda58331577966d0f27b8b9b06527ded76174dfdd77601744bf7b91d15c28fd7c129ebb5e77a4338aa28b5b89d859eadb8e638a1db242a03444de727c953fa128f829192a6f423819b1221b9d13b2b8a56412c0dedd802695804fe21cfe0300a38a63f4c34dd8a19183d18a61a447bedf8e822b076f9b2cf3fbf41119ac0151c6a679fa4469b4a43a59c4a30d55e9bb137e1e18f088ad774a1f00dc1ce3715aae8dd591c176eb2a9d4e6493b5f397478092ecf31fe7f1257e0eeb97a0eafe8c165bff237aca7d0d4a5b3fa1df05d4b4c8adfe5d2b24ede7072090c3e7735d77e6588e4dab1e12bea3dfbaca032a942b9df858c48172f809b42ce2eaaaf7e5b572c183254f8c196554d17db8b991d4aafba356173be7e68beb63cfb2265b81711b0aa330d4de0b1b354342927d9055138c3cb76943298fd044cc9389c4f1c1d30cbaa46327e2bc818c1d65277093d76c04756c7287389be7ddf497c32f3f8bf2fd98720653a6ed50a161fed227f7696fd6d5f9b9af06493db3df98ee318e7a19ddd1c77156cc19527dd925c113d9559c116b2cdf95c0152eb39030a9611a5bd48ae476364c05d164990ccc4abacef47a9bd8dd8d54aeb9ce25ae539abb5c0175d522ce3d6889a4490968da421271d089a16ab125ed840625df0cd3d2ba64b522db8e9a76c0e442a7e3d5e5839405a0c5466ea691b9929387d3f8d9a26fd5c27adf76cca0455d49f38491b8124c36222f985cc0fd0d71bc92d7c0e1e3d1f19cc02047b7b4008992f2547865fbadf806c9e99e469bbe32693fe495ef82532f7c45c300de8c0b6700fcd79e8f12c10bb8f9268c1958508f868d3ae9bcc8145fb120b6d50f4e23e001c018cae1592b82efc562093bc6cdd850c3bb1319e6856382dbfb42322ddc04871bb3c1e726e668256658211be854518806bf9b43ab7f3237d647689979f6e6082c765e39ae5497824b20c7e2fa4e98558e426463d1a1c4c5f581424ef7fd301c3f5231de6eda8e7b744c1dc7206473b9ca3a047599180254130ef6e74b07ff62b31f6c8ef44cbc825290007d540e5cb6cf7f6034326b8737336fbfdd496503073fea9305bd23f310b3e6347261a00283fa9dba0485c8efca35deb4c9662f84d3c675c2b74c45d97a98c7b297683416c07f2023e3915e5cfabf229c5e22542f616b2efe2166b244f3c541201de46ee2fdf6436d18174d9eb320e28fb1af9f3a70eb4588a8e614d470ede15cfb08c3d8f8fe4a0e24409f2c18c713239a0ae17499e19c17227eb22c61f3cf387bd17b254108a47330361ff7df894b44bc04e886b8502ecc579e8c3d6d4ca19b341fa4954d2ab6b46da6b9611d966c7d121bd331beeede1114d67e94096cefe4021335ae074f56f286cad21f75aaf22b7666e5dcd56948c572035acb0197b376687bc46098cc63eea82515771fa3752356b174ff05c5c6553a9fe12f36ba3909b8081345b4d5286c05faefc8c7a2d1b5950521c9ee3c162cf3d834708e973a0f86036df4b8d5cbb3d899f99fe17560fef5d657700cde4e567970538a909ffd73b887db01b8c1a90dc10f9d064e77cb80cbea1c6c7cc10b1a5e9e721f0e71843e3a91e8bb2171ed47d31ad3fb9e79166e96bb5f609f7ff4a4ad82c3118ae4ec04e2d7815fe606759d98141ed5307b8559772df8630f3e7da371acd058c586ed2ff184d2a0c41d1b1bf940ea0016110a18aec7d5b40739f954346d1cd8f42fa1f92d3c5261d878d214c877b10fd146a44e1fbf717804321b46b3a416b29c9612b494e6a202679180cfdc61ca5f8bf7f1c62e8ace45ea3313bd36e4acd3a242284110adc27aa40d1a72549cf6f416bf0c79d978485e06ba0b8a41d9c433e641719adc8422102497ec1f93d66c51a29498bb50f80a8a9212d431aef20aa0b1e366f198e940c62ba00335108f419e9698183bae44dacf67a5e64973698f7b5a087893ab568462d110ac7a4ff2d316649e5b7fbeed0107ccddab614925f079b90f1bbca26cb4a3afcfd1f13d688527a6bba0f9900bcf0483a57340776dfca9489020efa9c81196bf8b25e23bff8c20cd8ea4633cbb8217695f4cdcfe36b8106e10832b52ce0d6cda1738613b3aad65fda0ce57d4b4006cf7cc5cffbe9a92870623c75a6b90759aaf1035b6fb81f1b3054289465950883d02125a7748b9e26a826381a0226b6deb276aceb2464f68f328ea4ee2b4e6473453142ec6c58f8d59521241d287b3cdacd2875ff2711fdad43dd0410f09086dacd530e31a5ed630e97de4f333e310d0d60c724d6f6dc4def9a043f7b43d9852c9c258d717d400ad6a93f0fbab679d126956db744263d9d6d8c684f576caf1b9513e900a56b14312df92999223361b06efbe4eb554c401c8bfcee7480271e788a03bc2b51906dc347a4039e9c123f8137f6e3082188c367c2a63b44528c879c319cc1490136bf29d0ae9f4cdf0f87cb3e285804b634d939180ab1f2ea6d84fe014e3ffd9d0c627af226b2b6a613c8a1a3d183cc4e39b4727da8137178a392602821c3b1ddf4b3e7e300674154be30168562fa17221dba2db200a014179f210eb0908e90fbf2f8c4beee88b1501396873d2e8b9fa4ed41b1b3a004958fdc4a367cb11dde9b4a427bcfb2304865a5cfcc0cb314e9c0ecde73b52ce3e3a71dfb219988fa47abcd2f24c23048be4c6639d9f68e8e083c476b07dd574b854bf89064fb3c3f8234bf894e5b969f0bfd9dc2ce1d24ce45ae229ce88c118339ed0355012198c948cafc855a8af2bed2b8696b761d74d457b99a0f0491c9852daa1046ae26a13161a343fa926702a935d16bda439dfccf586b80168043166a08abc103d122105c74a98979d3da46f7567851d2ea0593ff74f36fcb9b93cfc650e1e504c78a1be234dc70268656e21c72eba4a2d483f847bbd61cb1378b403c1ed5907653ed95a055142237cfcf894a9d72e1bfb85cda3894ab03a711cd0aa09b99a52485845ab9dae9d6aef4e61f128035d3174de3b573ac2898e0d85f7b1729876f4f24f63538952be4c61640a0baa052e2bcbbb153dc2560eec4230130af979fe7028bd0cf7303d61dfaf650df2b47d9b5398b07ef2308d65d259fb1da6e51c0e2464382c61ae1a68877182c6189f9a84a2e48d7aaca4d6642bf51026aa8d341321a21a6f95b839b1fa3584cd0d0cde9aaa6e855ee7f34b855a7b3a69d8181ea82b0af0c491517e749d80c4b9c0bbd544818232613d49af55cb54896df630472315dfe115143aa32545ea1cfcc707002e1c467309c047e93786e7d5388bbdcfa83a4663aeaafb5a9f04a739e69d9cdb254d7da8c19c153cfe69db28f86424cfdc8400693ec4b5b637349984a71f3f9e0ee430c5df2cc5c9dd7ec0194677f3059af5f71d159496c3e42b272eacb5fe35c9d94e99ee0c8ee855a788765f5ec865c0f20127c384a9ca9de9924b6c4e83f65768e1f48298da103869192bfaf7a1d562b93063c656d187726ec10e4b073527c481325ac46885b197bc47f92ab13410be54c78ecf753288e5c1e3565e0819fe905c6cb119ebe2823548f9260c85934aed2184f11e5305d7d00009d9cc591bebfec084eea7da45bd73bd7293d198b405a0666f481ddac2122369e9776fef7bbe54479282917eaeda1fb4c9ee4d12aaf9397b8178e3afde3f257e9c60e96922fb0206a586b91c8b7f99ef14adf406106d51795f6483cb945feb2b1e32d31ac8b3f265b736952a0b9f1686b285e90882b2b9532f83349e9def65d8221549a23ae26dbca785501665b2d6958e428a553575c401b42af09804c83f8b745bbe9b5f6ea6069df418419cf225c3bceeaa861d293e1bb3081f0af3416396629880a6ad45962afc382aae89bcef17656ef27355ea1a39aea6ee225174eb8d1015a326b4a44a35224a397f8401885e5f7f823ae0743f564d7add86979f0e827c4d655a523f4326919c24f0d249e9ad66049cc87cc854d151b2b430190148b8400c8ccb55f2f9d84aa729411367fad5fcb429715698df3b76ca9812caf6878d0ee0ade170b5eea713ba13c6c4ee34a4cb57805f1ddebd41ea9cb8167399b6b95569ca3f4bb4e6ea4a8f1e1da3104a64a7a5f0e21b06433c9e27c98293aec0e82651a51221c75a89a3ac9324e511948f907c04f63a000274580348ab2af37e6b200f60155240cb5415b0a4a59aa778b2acf18c7bdf5c519b4b419d48e4218e829e9879744bad151b4f4972403c75f3b353e9d8b9adfb3a40a46db7c120fff72285ac8c8fd18982c33438af89cd335924be743f16406f019c805c90896d01ffbb4171810b72ef44f6f6a93ce5b44f6716ed669a0f5d66c174a04b9fdaad6380c258703064f581d0751d995788e4f55c0035c8355e30e8c641185c6cbf2afeff8dc51e360bab4b6acee7b23b65c5d425b824bd352a067117321a8d7542539033707d74905aca2459f0a491222a8546c19b0d32791fc653daff0585c91e12cea5ef0c6675d093c7dd7c7ef58e6c97e673126990cf9a04d26d794c81e07b0b03ed56166fce22df7a35cb7a12c799c57231c766af9ff6b8c483ca53164faa395341e07f48dc1d42d0262f2d860fcfe92f00c9fdc4e2dcc25c5d05077586224a36782155b1c2cc96e387030a5de8f78ed255285d6a68b55747b9f06a0c5d6f523e4aa485fc66691a71c1ef2ff6eb010aff5b037e73c0310a1ee23c2a46d00c0ca8835922f22c60584a995a06949d8b03a29c8496ebdadb7cee8c3d2c6cc16444ab2148040210c3ab539f9e28634fd14df6689187cc5b3a219c8834af989535b6ef46410caba6158d27869dad09cdf3a93c73e7ebb7d45059b52a1b79b0b29a38bedca119f421bc75662d13a346a8082e1526185d7ebb9847af554034ddcbbbf751df64520eb79a5c646df0bd7c6efbe9a718e6f9590945e95ddc7a01b6a1fe084c5b8c8dd410edbc00d72a31b5defca675256b796ea722ffacbcb0e7b24b24bb874583105036621939627974e4a78988c530f50f01eb1b3c3d5946691f687de009ff2ebdc4b849c9541b1050f10e141806685db01313361041f90c7c2bcd4a941efde8c72c31e726ffaba0aa47920540764325e59cb06e29bcde69bd21545f006bd612762b7e8348cfc99ad7d7541185b5f751b0c075f7ee99f18480fb6335a4b5d2b91081c6aa8fb046f8e482ac0c845c1571a285097ac85838a0d0701a5e6cda91fe523e8511a031bfd056a8487f2252fd1757220096ae56a5e861310c338e65f42c8c532673c0a2fdd4289d1773119929cc395644bf0db91e1959e7fa4452b32ff197b831e6ad901fcc730cc22ffd6829f9f9494d7e08a3a53cce8a635d0c2eaccb390a8bff90bf8504110d0901c6e2a30961ec2fbd551a22f60375af09f4a53b652784316b2fa7460a8c64a47672a618ae3f534459e2a7a8c35d836f624a21e2d8cc7d3aa66cf0824aee7560934ee29bda06c89543b93ab1a1733dac7300be1160f26326a10cfb2ba36f0eacbe81db8b80412f7d28cddd5ae2ec108df7b846d80dcdfbfb75ba2ee146be81d5318aad4b94fabb439c4f161ce28526a0a362718eb922a2a9f66678275f5f61fd34324a8318e73f502632b827036b64f202079b2ea598a442c284e526e2505fc54af71608ec1bf9b6e9ee3a675867897f8a6d4b322739c8258deb074dccf78118aa44639f5eafdc53ee4570f605677f1b450db9418cd3d3760d602560ac8693876c0be9997676aff8ca5a4b2523eb6dbf5a1331d17504ba41e6b096c8c9e4a8522cf586726de5ca543b328af521f492b5a998fdf1af88b985f32bb62726e44157c615b13d1cb7ae11e11f3f95cf4ac871fc5a1c4180416e1be157ffa6b03e1a601a983b3771dd35f0c8fb92268bd5fafe54b3d0e8597c958ed03f31bfcda46f071937e5ed4bf71c3935fafcb98d2d885825d62b2666e39cfebf1f42cc8b7dc0c0fc0d41cec96457b5dca8dfccae742586b96c97dee2f76fa5381c4a786f39c29347856cd148a7dd68453a596086e538943294f62bf3d9beb1791b735918038110c37c70c40b152c35a97fbaa7474323cc1262fb445e6ccd905db15dc67809977eab329b0da1a90d08ab9ac8667f925220563a5ae819bbe9e7c28a993587684ba5d168223f666b45e5c3550fcc842a4cb35758024ab8259eb1a4bc041d4147eaab5b79f948550abc2228404467d44dce8efa00e33b0a33472c9e2c5600eb7792c1ae3d6d523a6ca3e236536b67b047adb96c0f248640568f26be9cedf947df161c44f7e16069e54de659010d5e33f3bea30ea42726dbe1522c8e998c33fa6071979a244a710b4aa3b988826d2581e4aae2f4a41a74cbd806616506540f1e57d77117a537f63afd89eee75c9c1ed0b7180f5a192900b98dc165063d45ffa92b2c1afc4408b209905ccbe0d3140d89a29a96f01508fd6033fc64d3020ec25c3db2951f178e89f7fca005729da26b932efa7a975a3f6e0da0969e88a81799b6348834fa00c96b80ecc3041fa9d0e859111a6258dae80242cf7ca5018e1f978ed31019c1f9c87effcfa259bcd9992964608a693e28df496ca4c316104e46e8e6e5ffbe035b5e5b56d0c306e6dc33c9408bf30d638e154d92b4bf367a190ea9ed516e655c763a0802eaf4378f9a59871692bb122f689bae826287a330175b16813ac5337a2a93266ec707f950416dd7877e18e85507397730ed25e8d04cf075f749f59c34c10463dc3a31dff6b9468484592821520dbe95172d56be8268a200db2f5e33df93e69a2c4fdfd16f3a48eb408be14c79f0ceb31eb4964787965bfbd09004cf9ee5f8e4df6a6cc91504ef4e611f2a51b59896132bc41dd7d43c98f0f0856d6aadd510eb1dc1ba54fad2976846ecb883ac51d72a957117c959a640607f36b1c01eb7cf802fb9494f7753cde3b8b31f34e96a24167cc11d963f1babc3a4bdcaa321c3bf89e0763770dd7c628f5626b1a083140aa8d486673fb1d1605ff30c39ade3e5b1af127b2e8b2636633b5fae66905acd8ccf7423048c97a86b483d1c3621fe9718bee26240a4c0705af3a9b23f4125c55856236d62e6aad0d108ec07b6aa012f3ad879ad58bebde8de1dd3c1e73f9fd0a7bfeaa7d1b135467593818afc6afa94cfb58a1a291ad60da21e7a1901ee97565d451c26b551711fa7f01d7c0a070e6208105c8a84e1cda2d1fbade0f11ff2c1b8fa63267251afbc0e847e5a84c2cbdb9185f0337b2855fa0408aac7154cfcda201c308bf8ebead3c7baf877842fc41f04b8280256d032cfdc762b7f58ec2381b83ce2193db47c34fc15c18bb891d6788cb55a615cd33a08efa31cdf224a581a92d3b3bfecfdf3299a9394ace87e8278ad09384b18ad0a4384bf9e540d05471ae580e0d513b2e8f646a6cf75192087f455a6ec8b107d69444a7b8f05bf626264c92dc2b19afb8b9bec900b8addc8982a83f30c4753f93cae67b3efeca9da6d17a7d7504d2058e92703993f181e11f49aa9378cbc86d0ae92a68e13bb2a0fca95f4b6b7a263fb0929e498467719afcbca37f3ad0b21faaf3e282ef6fe101243febd9af5f57fc403f8ddfa6d73d135c529972bad3547c698f7f8a67a77318657eaa1a0a122710a8b353154927d963524a865062cccd3eb86c04602618bbe0778ab5885d88c44025446e01c703aa9568990f4467ced40e38c04c7037922ecc224425d3312d568ce5c5f8608d8d4b6c3a24a8835a02e91c18988d5aa28ee5ba5995d4602ac4dfa20d6cdfbf9fc9e704299f8066a66b817a49dd3668d92bd906d95c3c4541da6e0cba507d31cdc11ba3296d64fd8a7c506b063618ab5d95d4fab6c8b60e0b954625dcdfb73d220400af1badd209039448c76838db9a5d80ca0d335122c28c0ac01d07a1950dfeebe8295486d42f285eb48cd39c283f51e18e96777c57f297ebc0693f4b4dc793a6dcfb50107511843009ca8f0a6682138d25baa21a8c7164409965c6c93b2681c0914f167624714ef7e231318bedfd7320c0a39a5ac413d1a15a58d6d1c98cf24ee0b8076964be6a6d0e0433810fdd6186b21f35e9e4c0af84d4ab21f8730f0f420d0c6d3d05c5ecbd93f1d551da4d6b2a8c1604d1bd9b87264dcbbd3574cd996f4696df8c2ab806573787f01112cc5cd63757cfd54af6a33aa50347ed913118a117e7e7aa2114d08731bbd48255935825a028ac17d790738478f9238624eda18b8d9c755967392255362c59d4d286fa32eb609768542a1b3b5178625384795032d4433a47d2a900e8fb4737510b55c4589b31da74883b1dda1dc98aab4b80e27f8e178c4441babbd31b7ec7fe19e9a644d05898ebe61b0f2a81fec32ad3565669be0c13efd137add19333f94b1fa1acc04cae4b6e76c66d44039c3b7171579dd45a70230c7c7556750e6f182416b1e5f93926833ec7772d734a4ce78aab5e6549d03252309ac26e7f7cbe07c60166fe1e735885904d448ffa88d1bdcbb209cada743e5995447fa7978c4169247809d19f8eb515ae6988fbdbd455f25ab6e35645baf90f7e7a8a51c943085c47165c699bf7bdd9c1c9266a97a55a0f179b5afe7c2cf61c9a80b947c9acae8de1711ec53987d2a69d8e20a485255a3e982444564e8825d2cf94777cfa767bcdb2e8c2795d160b70559a16870b9d0eb8dbd80b94f7155a4be3cd1881db07bbc3ba9395429aae29bd8638362cb8082f980df95445ba0538e2abdeeba462a279e62c249550529759cd3ae5b953eff6c452045e105dd3e14d3bb69e224f833bfead754b2633ec4d04c51b18974d47cfcd1fa92d2b5668f5781f5d71f989964a60aa79b985c56c04d6896de1fb7d621c0a65b013f947e6eeb0caf094cdbe40660801f569b9e7fa890fc16e8754ab8426ed5d1a2c731cd19346658f89acd3625b42313beb502c99878ea36f2068363e63ea16ddaabc9be59058a42c01e6528fe60abd89862c4361240b42d1c44004e884dbbd0c025a7c6b94882cc4b47a6d1e622945d28ba2c1a1205d2ee7df93d70e4889319f9bd4bdb9a46817539f119fbaef6c74d4c6ae85bcb7abbd5f0b9b01be235ebac83afa5b50cca802eb7ce0a5b0f6be95b35110d48c0037fa5d4dc9f00d780fb743891a51872f3299289e4de08289fef7d45acdb01ff163acd25492ddfca4aab9705e82922bf5c99a05064bf563efd21bd2eae7a743c31a07ccace19c8d6f01f63d744cf120c9282a3ce38b7848bddccbb399ed598408d8f6df8629b4b3da311505d65515baccefc7075a23346d7ff96e9c59047fe40cc10959d3fb881722dd3e1c64b4f36789814d24fdabb91e6948f76f0e0151c152f386cc41b1a64251b5a5bc7ef24a800b10afb72b003a5ab6164b8fef4c61655f484e2a500f3ff2bb36480caacadbbfefe7162dea9ce46240c8dcfe69f1e1f21a83c04a0b9c7bf1e3adcf6d2b296ed606b0049f7fbb961b3448d27e80a29857f83f4b9cffd5bc4652d2f4c668f5f5036c70dbc76689ae81503b879928dae0e1dc973d8a0b67d6981e468373176a30fbdf12e5003441ddee6a21bf3e18d950ca033b7d07d821a894628330689cdfe5518f68fc88bfc158146f787aaf8df8a3cff5efc1f40c9fd432c1da01d27c044ea0fa2728bee552368625b66a961e62953a3898a49facd0796da9daa4a1d28bd4b07aed7335cf3c46013dd1001e9dd6d6c05fcaf14dbfd7d521cf58bd79f409fb42b96194d27bb30296b87e0fedbe97b58c830f3b76797b170a27cb4998a6b0770a257727c10b5b4354e54a0520882c7f9420e68ea2292d29991790bc09f675abe7333330fbecd54c9f16ab67972ca9bfbf846948b2f154bcf8609ba0fa5e8fa4d44e08c948a7bc58eec1876ef21928002c008ad0330425b863352578db311feffa37724c008a5741a4e851e94937e8966bc48b147b785071b40b85365861b77bcbd8a2b89793bf7c1bdff1a019092b299df887c4ad137be469e9d26d0169fb284689808f57622f225a1a47013aa8b348ebdbd39d7de9f59e39345368120537a81337c7f08c5893e4bc4042e9e7c4f7012b120c51457d667cba77214f1392861dad4e0c53db63d14d83eb82eab6ca7164ee2741dafb251540b225f9cd8b63c8fb1f42b4fa9602fc78af1e6c25e0c5b2546f0128a1c2ed8cb18abbea96e8dfbfe2228893fb5feab04b39a8d4e296c2ee3ba4bce6c925a3d4057c98acf0a4764b00806198cfe214b6f335b83a5a142236b98e5b7c5fd85f5deac021d75e9ff6af7f8abc0ab61e2f4842385c27e873ed076da33d3fa7224d7a485ff5b3a98ecd8c004062ddb672cf1158530948114f69d5d090d9830112afeb3b96eacd53322596ab934002986f65c7f6891c7008cc380c775f79d5b0c8a44792460ba5abf40b6be28deac3c811df70cf3c729cdf49734411d7aedea10620b2f99be6844379f01ba72b4895cb4d8c701226491f25beb123f45b7cffc3ad12801cf15c475722e1281cf600d766264b74aa2d06cc90b373e7d8a237de28062e2e713399a989200fa1670c09c8a989c19e8c880b7613e58916b71dcf06b557fd99c8110ccd74946cb5c489f92e00650ef76585b91b6667bfa40c455f3a0856cfcc875184fbb653bef821cb0de285d669d380482bdfdf8e83f305de38630c6d7a9f75fb13fb1ade67fef5a3032f846944fc6012b0cc932dbb447f74b8845642c0cb2edecd48b765036bce474ecf44ffae7cebcb68648caf3853772fe7c2f6dac37fd63d60a535d659901a5bd06012247b8b9eb461f7be3ae7a7da8246b971670ae8484dd72e0d61000047742aaebda4498f34be5106d165c0e7f967cc4e03e7dafc8d250e82e60ba94f4ffe0f6f3ba98f348eb119b4ac163627fdc80a8a587ee44bc3234a3fc9034ca3777d819d2a7c771fca131e6028237532f2245590adab68c1c0599af87b0075114b91691be98731e620d3ee13647c97fa2a47f268615412fab1f61ab1053e1a110ba09ba37d7b3165c424483a2cfce6695d0b7238efe204ae28340c399f4419c676ecef986fd19ad8a12d618ab21f8acd0cca88eadaf904079a21271a8624c1bfa9d9a153e8b91ee4b84b052088641eb0accdcbbfa91801f315616baa86f4f2cac6e6d4c7ccd3925943e6df6227e985a1b47e2a01cd91a858118fed5196c14819c620799a542a218e6192f691186966e58dee9794f91ec60f50c19b383d4180d7d88715152d577bbfac5e60dc3bec27ae0d467accf6842393e9dd69efa391f73bfaac326df6578426c52a2653d78056f1229ad87ea75272834fc8c0142e8712c26c4102689f5143e5cad9378084d0e5d3c8d0bac86616b819ba368425893aa289e048d2ddca9915eec0c884dfde91baa412e479d9136f44e2e3fa25312337be39b5b707c51c09d9964499688857bdc2d396333f3c826166f6efb13158f15d0dd8a892394b8aec3d0675dc1ab3a46a2394fb851adc8bf2eedb6b04baa693c8fe2b77b8d03a6e6308e7edc44ef13a0cdee52883eef2137c25dd8ad56aa099b2f99cf1e7d54cadd6d5717eb17c8add78d5d6f6d3f6a214292bc77273375dfcddf4652f2e6320716ddb46d809e9556c80fbc96fe39b94090eb7edd2949dc6596dcbe9094242a089f27d692698dcc1c8bf7909aad288ea7763551a617803c7f1018e43f1f60716106a3c5cccbfdc012d00a8f3a8f3238604dd82848e9bbf9bafc0784c68e11a8d2ea4e9e608c16326bdba1f60929c0591bb19d13e6540eb1c508fd59984a20daebc9a75cf2c0633302f0b212132ae277f80baca03137d854aab8ca56e0507ff34d49fc1709d234f8108259a0e45e47b86efb3c065b706fcf867e4fbe942da42176f0bd0cb234047fb4e7204acbac5c61466f852d2c524fae7747ffe2a3205c01bc2267f6975097713ef1e1a7407784a17e87c39b7e34a2b89717d0d1c91363a6c27b35045b60937d26eddb658db8f288a9fada1f97df26b6f6287b01c89db30ba28a72d8147719ce62d6518cf492553ac3b6fb4bad052ca8d9640ddf379ba6fc69818940a583e410100dd50abf4f8aeec2d7d5fca9467db95e797fd4b492022cb184ba5ba54c24b1ebe2e2d0625de5c08b494e1457b99e03d9fdee8ee54df998573a2714da408ea020a4f92282bf177eb506accea51151b92a18409b70ef807a1b08fe416f6e89e15695a35b45de0192711a5deea6e2d9fcbd05bea3c66822b0462cb226fe9691f44dc60b7dd18c9921f84b15399488f1a3af1040edb4410300f286bfa08954064faa250224bffcc413f77d2e43b10151b89f5f39e0fde40d48e583c4bc7d04edf5e998416107426172ede45c82b987ecadd6a0337dc52328e5ecd4fdf1f0b31aea062450d433a4c1690d9b358f70c234526d29117b2b183bc4df3d31863889962851d79282837c2fe810bcb1c6a8d3fc051f407fe1a47c3d3b7a3d5206351530b5da15990a25b608691e5f05b8872d243cde89a16acc8b7e0177b342f1c0ff210fba93936b5aac0148cd04636eeafc0e837276eb861542afd085d4f3fce0cff799512b719df343e120748d807381d782ebd80540a8c736fa4b03366b1edb8c8d8af9d58c3104fbcb85def0655cc9f1dadabfe543dc253bdcb52403d0f64ccd801bd10735272d18d2129bb8eb08310b9a7b0577e057c411ef7e600effb395be8fc8949545a7f00cd8d63b2149cde49e3444531ae335eeb2574061749111b683f92f84028047ea89c7278e4f517c77e26deb9d3141dab2744deb5917a8a1d62da9907ce785d5d0d95c50942073bf987fd1bcf65733f1cf55b63cc877cd54277d22de84f36020c5fcb3baa332ca2dd406046a2e03a359201a56a503d91b5beb1f218695c4f48bfae36fa0d33ba0cc7899017518cb8530c42f76c7c2b1da1c30a84c1513e54c840170000f105565e9d8526d2f78e9609e00d55942422ee77b261e7d4208917bcbbdf7de5b4a29939401be09260a8f093c12676bc91cf56b2a85f10a7b653cba0e7147afad2571b830628efadd4e8a7335c175eaf670fde51727309d2a19f4d2aeb52097d74c23af9158aa06f0f5e5906cc926614757e17f2a85f164ad563d9c73bd3cac505ca6be14cc45d1b572ae38535dbf38813b0f6bfdadfe066543720e686619c69b0bf202504ea69bac9ed9936518a7521fd6e73e70462c86fe16142235914c0b2182b57f8c399ce3c8d0d53fbb3e5e6397860c8cbd7f7d19e43577005f9fe60978333180d75e7b998550c924c69b585f86ce5d3bc5b9a68c0c74ba94a17a5d6ec9a1bafb1278d20de85236adfe0040c9c465ea67f51d942d5036f1b07248f339d754c9a09aa279877a732e5d793cac3fdfbfebd1e112881fa19d2b90746cf5408ac63ab67a10054d5994e09dd1ffc165363461c75d90661c08520fb34dd3deb5169b372d123d6cb139c6504e4e2c4af0e34659b8911bf1a4e00f50dfbea4417e2581933d9568ff188678cc085249e7a4732ad1d2089c3ff7d530c315624c4c18c619e959c6cd222ee5169c7d0bfa8852089d0255a065b6f1b0be04a526409ca93be2cc153bba0692de188a968fbdc687a9a791de6111a667a6122c018e2d2b5a9aead8b262486f1b5d7f0701e24dd4b5d469ff783580e7bbfee135b165c58faebfe306af99babe673b7cafd93413a45181aef551b528085d5d32a239052e7e8cf90107b11fb77da11e222db5944674cc5b5eec23e803b5e12bb2b16fc9d934967bf874fc98044da3779ca2b7fd685f257d2c2824d3b5e6181f9456985bc7a152597407bbe879f546596badd586d62b3b6ed3fc070577d0e0d0e1a10d8f04e46024c31378a7a8a7bcc665244392e21f86f62a92b4a3b410f4bd7e94d79f5e975abae7c00275b2060c060863315ee33fdfc50b507f62f126eaf9b48658c1ac7e4068139282ed444064230a8e4f411d0b14ddbfe5795fea42c0ebbaefba94de367d371515d309a5f2dd7a730e34b277bf93f73d7defc32d9fe7795e0e72faef6442a9a8a8a8789e8af77da1e75d7abfcffbcf33997e973ebee7a1de0331febeef7b151515952fefd2e357f914b843e93d14fea84f26223405d2b85e87c1fb77eb52208defc0cd430e34726ad32196cea0dde774d90e819e797b6f7a1e137f0e7d9cb187f873bac7ef6df4bdcfa1391ddeb66de5d33ed48a0ac7f2d1f7380aaaacccbcbda743a4ee9e76b9a5c7f6dde7745f02f7d6e1af739b5e4b0fd3973ec794634e97e9ec4e777eed3690c89c2a288ee55bf93efc61cfdbb4eef17b9fd66d9e663269defd1cef2f9db9343fe784414e95b5e47839e69c7267023bcf3bd10ef3a04d6ffad4671ef3aa9cbaae45fb9567e93e1630e794537aef35b0c7e97a2ae0c974e2e26d31fdfdd37ba00c0110ef82404aefbd09ec51c2ffe1f9b5f4f09e7e8e47734e97739e3bf010023a319215156c2ad17827d4c6b282535f6bad95abb57adff7b5ab1fc7715dd7d55a6b7d0f7b2a55c5ab28140a85c234a592c9a400ef4d5d4bc9b452a346665131799e874d2d28940a0a871e0e94c6f3becff33c1c58b4d8baeebb6edbba6ec564525941953ec5627a6edbb615ec6df7c19de92ece7cdb57fa5bda3abc43a0b7ee7e8d7126ce7c5b096fa5d2df6f2b11999bca966231ad984c26538d4fc11f8046d6c32bd1409f0688031c6768bcf1eee944e3cc9c28140aeb2fc69bd27b2b5ede444a608c3397072d042c9ffa186fb4542e3dcb4ade24d05e2ecd94f2268251a76edb360fc7f7b6eefed7fdcdb6191db9e225187031664b9fbb4d90a469de9e4773adb57ea8ae6341e11595aefef7d76214e53e08d0f8d47f7fb97c4fa7ef5e930992eed7e2e51ce2943141d23641d27732e1ffe44a7f7275316641ada874a8aebbddf56e77bddb61aff4b194f21e5dca5ffe52ef3d53c6444d60296fb9ca3485402acb955cd5bad2df0c6760b9f2fefb4e600e3452499e5cd59a0269fcf7fd0573a091f274e4ca4be52b5724789500499b2049c7cff00744164c90ab0f882cc2f051f1af88f39690470f8c3168ea5ee2ac2f79e3dcb2a16afdfc9dc0ad43f34d1a1d97a3c14d1b1698a7a1f134dba456dec6db3c0f4771d82f10d4631f728a363d6e399932fe161f5f46755fe9fbde47d45f7e39bde9bfd27f2d8fefe937c6258c5bc014e8628a32b444bf1ae036ddb0f22714ae9fa2e1f2a8d27f8fca328c53a9ff1d6adc52ca3de414fddf9b1e3f77ca2d39a753a69cece2ed9e87b7fc88faf43ea23e6595afe1a3e54b7fca699153b4bcdd9fee83b1e5554ca6ef4cbfb5e09075423cbabcb32d9e220e1a65c22bcfc3512e2ba71c24f5f84d205d49a56068d8f05868641ecec282f1e92dce2cf684a78d0d4763a3a37bee7d22f72ae0c641abfcf48d474bde4574cbe31b8ad4f8afc67fcfcdae6eeff2f528a2bfdc92f3fdcbfbf872cc17d1f2d660327dbc25f06bfcfe6d337d090c716801ef88c4834b6ee1a2aaf23f294565ca92434ab9efb8dc458eebbac7387084e19b4ca67a32994aff187532bd3f484b8ffdd775dde3a0518fc226f0ab4fc1ef4fa0e95d7fe02e651d1add75ddc560144c39ed3f39659ba008f73c2607527f71189e1fda84d24ea50f73d229f5f17dad99ee7b33adb4d24a2bad343f80943efac05f7fd6bcef73a6ef7324ea5eedded3bdf796f087bfeffbf0874d5bc766ab41bbaf827592d2d3025450a92ef270eebfbf1708f7de570adef7b68dbe97deeff3beefe96fe0feb69794d247510efcbe8217fc3cea518f7ad4a3f4b70b6e11fcbcbcc2b2f2e1f7f096f70f7dff87e67e7f8f51ae94756c2ccd41503a369afeb5d1a64c69d054773a9d4edb96aff77937c7358e52cafdfda1f14b1a0f35c528af51d5a8404ca62fe54b534fa72f959ad44c9fc7a41d4bde291a9a30d455e55d5a6c50600d4e5e20367e7d9c4e6fa26f92d587f7f404620f6b6c6293a3e9d8cc4dd370de453e1dbabe0e1a1a1c38c23026c645d39409a5a956038c2e43a9e9ab01c61fda03756cf47d1cb7f7df3ec8d4369f37e77adecdb99e5751f5794cef477741cfb18f2fd7ad632381b8c4f77bca3d955cde3a3634dfbc756c4c50f423260846d8c026260846d480c55d500277af774bb7ab194ba7b26242d5bff7aa7897e2fb5fe974efe5bc2f7925ee6eee7ea7fb3c9cbb2795ab724d2814eaa26ee9a22e57f2bc54a9e43d4e81d469a07fba93dbee5622328310995a05e3bc3791a9ab0706f12a0637d638155d954a9d5053e5721cb7fd05557e037354ee7fe009dc21f84a799b3291f95db09453caf7bb5e0824e6e136dc7579f380b77f0fbbafe04d811d902d6322f463d1502c2b5cf7dbd675bfc2e275bf01b9fffd967373fdbe84b7ffb6af6febe6416ff8690bfefbdd8673cecd9b07ddfd97b7af0377f7a52e13a1fa5bf98eea6ea55b41b17cfd8e5339b19c4edb69ebbaab6ddf9db4a774cbdfedb44e7b0cce8d75bdf95eae14e7f4ba4dd3eedfef31117a1ff54188508dfa6d4a81d994f9f22642750d397858c37f8cb33fc2f2e54a0e2123f7bf6f68b955b4fcad434bcfa16550cc517fcfe870b5944fa5949f92e04b162ecfd140c14598cc8fa00cba2d32f79031cb6e98e10c9cfdbc35c83cef0d45742641a9b9094e5048d5590e3dacabea2e93d98f208d4bd1f667146db919b3b5cf715d777bb8b6d65a3bf5b4d66bc9b15abe0974cc34a4d5c330a49f9af56d6df90089de610c758845b1284aec35fe8fbdd484d65a2bad94524a29fd4ae9bb48c194524a29ad9522c162898e2d2c946897ae1fb54b1dbde6f5ce6ccc7cb0d2b1e5831ded57c6b83793963564bc915a6a51a67ead9e5b599ca9efa2055c3fcecc8626071d5cda1c6190cd29cde0227db911bda400c79650928e2d2124cd799732daa1f9a043b968af1e1d36f14666614a0ceb09a24cedd1f2b74a55c1bd214a1292874d340a95376569caa3934ca6bca74bb7a0e02a2262a231ce7b22d151b4e7449a0504a1202025baebf2f6952e3a03e9e53ad29b14d23289c65c5392905e594cd2363ad115098da6d97670cca6e76f4ec747e1643247a44388a11162282917516652571534fd420145ea90deb4a52515a2494495cd037ed31a38e037c541037e53297070d3fbcf2b44150580fca64618f09b06b180dfb4881bfed44554c9950dbf27180af83d9d90f37b92f1c371145125817cfc9e54f4f83db1a8e1f70c4202bc248b10f07bb6e000bf6712faf7ac018ff7c4882adf31c06f37a300bffd0a04f83d8decf04f8ba87216ce6f27c2cd6fef6200bf1d0c9bf7212752fdf6266a7e7b1434fc762a74f8d5425479d20cbf1d0502f8ed2b08c06f6f018d7b11e7e7f82dc300c06f29c6cc6f6986c6e15cf85b3a91f92d89a05d6aa15d56a1fda51451355b5366c6c8265e9048a82652f6feb227de682efc96434814688f5a8855d014c994992ebfe32b8611bdc8892a2aa4f323de60dff204d04e83f619140ded25ed37a2f69a3236337b40de9903f2c60db0b1d1530848de1903f2c60bc837e40da321b121ef4c0179e39cbc531a123dffc70a68aa32241f79673df2c6350021e9f909c81b46672d04e49d1d206facf37c1eb26867aa321f03e49d15206f4c809dcc47cfdfb1c39a2a2c0927efec86c5b2c91b466344aabcb39abc310d44447abe8ebc61346b86bc3301e48d0390776a3e4dde301adb9932f373e49d01206f3ce383236f186d8b2cd094992f43de590cad56919e1fb660c83b7b216f7c6322c5e40da3ed8a0a4d5575b990374c460222792430796736f2c62f54c8850ae95983a6f69aaada92374c2a8583f4fc14cd58f2ceb04aae79c368ce04c3a7304d42939c84965044d44a4a8a33d2b5096b48b42934208da5f94c27d349094923425b693b4940386b6550c85c59514634879843c41999f95c1104c47abde28cf492b217643dd92adb191a8a331223c2cac05e980b2b721ff7b9a0eb8e0504a120202952386c079301d683ad8a8ae28cfcade80ca4976bc912cd025923d89615b241b227cec8d7995d5926ac8f45627ba0e860ae294948af1f71c6b50d4a02514b487bc599a989b1ada0d88cb0aee0a3cdd0f35fa0c0feb207e89abe760c692a1dbf43ed181c389a100d375c2673b6a99439ebb403a1d9e9cb13d8ffa5bd6c34a11d002d7f6e3bad243da310929e3368f95bf3010d8d183ae28d6f1a74f41ab9e386225b87964f2306a6481ecadf881a2025e0ea11f2d178faf4cc091c3dc461d24cd58cd43db4e1d3feae16970a1d4755bcc9b4cff71883a692863207fdf89c04a57670c6b0c6b03eccb3e8fae91acad65092ce526e81a5a43834fdddfd805b7a541d3d945ae6ad1381c81e8ae8d94376d148ef4c6f1c7a080fe9cb0df044a2f37a05b15b83db7bc3edf18e1dc1c598ddf5e8fa5cb4dfc7d7c155381f9f025e831f136518a752e1a6d1b367ca7833faa4d56299b671ddf53e5ca2429a3ba154565852346ab4b8bcd8807910fbd79c0b9d0b37e7c6c7c5c474939565acc9626101e680b825cebdd0e1801cd194295a1204047459588037b71ac255385f81e20de7e28eacb5f685b736062bf3d65a6bc3b7d6c6fe5b6bad85796b5536bfb5d65af0adadb12e6fadb5b6e5ada5c1da786badb52f6fad0e9b7a6badb52c6fed0cb6c65b6bada5f1d60ac0a2de5a6bede9ad0d805d796badb52a6f2d8d35bdb5d6daedadcd615f2eb1d6ca2300b0d65a6b676ce92d7e6badb538acb5d65aeead0cd65a1b63adf7d65a6b1f756bb02edc80c1465543838e190410009a1c0098c121c30b312fc4c4a02213c2f0c28d18174e0ff3a60cbefe05f32ab9742d9bcbd6b26dd806f7b26d9bcbd6c2fa521bcbeac7aedeab4123c57251383859d4a95bc1810a8ac599ecb6fab1abd56a9338c0557b659bbf747d79eb286b6db9a4618cdd7219cd3c63ccb336f36b33d79ed777a4a9baf9fa5632914238e05c4d99ea8a37f3c755f34595d0259489be4f7dbc26e6efd324220ee591f94d65a0efd324f126fcfb74c75574b55ad19e0bc315220efda9f93db390146f608c5c4559ac231614569422afb1d145c4a14334fc9e4970126fc02057d1564ba8d56a112df19a8f22e2d0231dbfa70ef4fd09146f5afed22c89beaff93395e8fbb3c76b6afcfdb98288537966f83d89d0f705c95575b54a5acd9dd55c41f11a1701fcf6315ef186a589ab2a8be58465c43a6a79cd8a1611a70e05e0b7036128ded060b9aab65a40ada09bfafb3e8388538f687efb12fabefbc49bd3dfd7cb87f02349f4cdb410712c4f8edf728a9478a3e272955dad5e2ba48bf222e2d81f00fc965fe8fbb228ded8bf96c51a6235b9f3ef4b29228e1d9239eacc6f3985be2f97c41bd3df97485c655b2de9d3625d1cbfe511fabe2c22e2d82322aeb25264b8cf818883f1fc7d1ebc66fbfb3af1067b61d77d1c5c85c5f03b0e41dfcf8938d88fcc513f0eb176e8d0f771b80a63dde035dadfff116fe8df0fbdc6fb0b83be9f7f4f7dff46c4c18662e28dfffdcc55586bcad4bf4f65c4c18e648efaf763bcf9fefe0bb7862ba4e96aaa38a02953df85d58dd58fc4e194d4fcb0a68a5b51168b35247138160d43ba6eaf57ebd57ad12389c3f1e8a047ba3e7d4dd5d66ad1578bbe5af4c52371b6a319785653b5b1582bd68ab50d09e047d76dc55ab158431267fb09c090aedaebd57ab55e2d5dbf1e499c8d87a61ee9aab55af5d5aaaf567df1481ced2807cf6aaa34166bc55ab1563f12471b02c08faeda8ac5620d491ced6766a83555d9ebd57ab55e471247e3c1618f74cd5a2dfb6ad9178fc4c98e64e0594d55c662ad582bd6ea47e2644331fcb0a62a5b652b56b662e9fad890c4c97ee40b43ba625986b196ae1f037247471227e3913968ce2f93b7d79fe1070310a7e4857c23bb903350fd1b309e0d6ec5e258ba7e0c78ffc5f1c0bc6cbc5e1c8faeef424b57a375d4d2aad16a1de9faf98573d958432d1babc6c6da5843ba3ec8b2ad6cabed87655bad6cabbbadea3f0d2df5da78585e2baffbda78747d985396b58e5ab795b58e747d1b2a184a630d9d34d6d558196b48d77fb1766ada8fb6d256daea47d77731d552f6d278ba9dd7eba5f14c2d9560aaf72cca5a4759ab355b47ba3eb7b560d24857230f594319ceaca11a747e9d9268f5f33b45b355967f5c735e0a733d347c087b65012baff2a8d3cbc7e135a6974fe335a597f8a5773beee5df80430e3a48c0553fa5e61788a669423b3c944853e5021286b9902550ce71ca6019b3f12d36be85be0fbd744ac7d61091e668f702c2fc04b57f107c0a32f1f5adfdae7b0fbcff7d2514787a1510f52ba04a0a64791a60ea6b8034dec11adf02c23c0f97402fbf531a04651497c19ede1e9886794934ffb1f92fd9256fdc925b409897ba46b6026f89e449dabffc9e43367e4f2db4cbef890409f6dc0b28b50db0071e5adee5e90562e35b7edaf896e7bc7bb1c1c6b73c0f7f69017d90fae55d8a4f1e186ff1243c553b44197fa424df710123cd3c7c01ab76016bd0be059451640dec69609f029dc743ec59405f813e8487d8ab80de8302fd043a124f023a06fdc743ec3fd059ae0474200fb1ef822ce84c847cc8c3d683dec4dd49e649b3c86bb4d7f4b30ec480874e35a5f5b7a460d4b61a6447d5dca97f75ea1da5ee6ee447ee49424340b5761e1578673ea84b5046f1f03dc9a520798821cd6ce364d41805ed6dc932a9c3430f31f9f204c69e8ba5ce439abd443a22cd882a3ce515de88c682a0d8951ffd7aa6a125170f2bc6bd44925192e28df6d8cb2bd48895521e625fab7cad071eb46bd1865a310ca3e12f550069ecb91f519522c280045c65faad03470bbbf101efe0116b684da5894f8088e3542bd1d8fb8f87dc739cb53e7afbbb7db7bd9765f73ffcfe53def72ca5f4dd7fb4f657d3de3ba2b39f42403a5b82287ba7c18e7e21a4eedaee72d78e942694f5457bb6660f862306e5ae9b679773fe2cc7dc7017977539e6e6c020432917eee7ae14ba3389a66ae5b19944c3d34ead643f52c9192a7b147ccad9ef6ce3ee7ddff0b66ddef6dfe645d7b6bdcdb66ddbb66ddb76e302d9ba6ddbbeedbbee7639c75c201b9777f660bc40fcc36e82f439b06ea0d45036894dd9f9ce2a08f0677074169c439389cbf8640105cd24620eec2b387fc0e9e361923883bd064e247ee42f19680c8acb607fa4688828ae39b5a9cdd99a5a9b32d86bdacb88335b3207f6dac778d3bde67d0f9ff6de9febbce67714e27eefd0710f40dfa7f9eee3fb7db1a8752f8ebe3f8078df26de741fd27c987a9cbaf7defb7dbe40ee77efc5d8f71bff07737370f641ead286fd737777777777777fb935b80752c043ec8776740c3ab6b270a2b9994e824e34f39c5eddb5a9f6bf407cba7b8dae1a14f4239a8ea69335ccdaca3205606e8ecc3e485df30e18787913c2e0bab93353d38f5c41b3457952499c1ea14368eca71622f6534abce95e25897ccf295ee318941486ede9e47ef6dbfb0c7be904e79d51c0867f16247b6f864e08954e64148dbd7f8ce22116639ea193e0d41b182591a671af6d1af7b2bd36a4b7f7e76a3a09ce0ce354f83030eeeeee33471b17087d7fb936b8a624924444be93612c89249196399bae08e57289414ad2180dd55cd3b4cc6bb6ad87b6651f86548791c65ec7cdb9a1a5130fb19713604e4767b137817207a4600577104204eb0bc419ec2b1073603435553aee72974b4a6332cb1e969b33b344c2b97d1b8913ed267124e035f4fde57219ec67b6652e2ec7a3d7cacdb1592cd1aa6eb3139c3aeb3a4def01cc49345b8e697dd36f9ad3ef10f5fb5556587efe00224edc387a3e0b385b2e83c9a860544a46066b34b41dad4ffbf9dbdbb3857db77273bcec83d49ff6a90b44fb9b7d90da5d1e62db5d44361a7b9a2fb2ac69da7d1fa8cebe874f676f9f8b794ef0650b3cffe88d7c429a0f538fb19f1fe7ecfe02d9f28e39b38cf9a1d3b3a4484af119f2d710404e92986e0d36031f758164591ec9db5f22f1913ef3b7fdb9c33341d9e321f6a59b633d1b9a897df89f4a61dc7ae101b62fb9e724ebbd096dba40b2f7eeb1973f9255f2e6c538950abbd99aad56f6dd6fff2ecb9e9bbd9be3d907c971a044b25120ce60cfc37dc779bc863e863d67bb1dd810529398a4314cae3416856cbc46fbf8344ab8b4ce267106fb09ce9687d8bf5081ed4b4c461957bcc91efba741a3549a9eb74e8c6ef1816aff1e3eedd9679f79cdce9ecbddf6c737677bcf41b82c9164591e71d9237bbc267b0c49e659269d5060aa6c5cc65f286b61222debd137e7be671f648fcc3f033d9088d43763e0fa74a00e7003370dda775c9f2d9bf8f1f191401ac3b0ce779cc7572f5c1b3637310dd3dc35c11db6171be0d9c4672bde448df9088273102eefe021f644a4de3206688c3005bc667bec31b083d748220f311dda965e684c3a913e53a5c365fc776443b849cac9632f89fcbbcc5d52318f3d57d36dd504e2c087ac07a9b3a7992a3f7219ec312c8ac63097a2318c8708c3fc6dce3cc45e088d1a7b97c6b69b33b30f5267197b88bde7ce432c06cb412810e74460605fda97f6e57f174bf468b1d2f35f7ec05c144d9d529ddb23fb58e5f69203ec3f99b84a22314a39c14d26fd3945bc51624a11713c89cc419f664f7f2e893775aa3cc995d22420418e59294666f7f1707bd2bd0bb83747be7773e4db6c335077732468c15df5b4d6661c1ece4cc1091465e80769429ace96bf74f7c9ce8a590a9c14347dbce6c7559ed7d88f3a88f4a0ed29a745bce9ee77f2e62efb4beaed2e40fe96efaf97481e42f12497e2329e844d179274e9d3e58a026f4fd2ae57793f5df3c86526509cda039a2a2f034d8c676afe87312fc141dce5217d2292fef622cae335db8b34a5ab7813551e3465e80b416945a1f469c0c0db8bbc28ba3c7a74f7a08f994d98e4dcd073894705f6e7e63cf2906ecaa3e97ba4d31567e807e120f389c8a4e9e33b5e13c43fc9a5780d4fbcc19efe4441bcd99efb6d7b0b6e2e6fe92fcd81dbdf5f37c71d8a87f4fd250abc1d48534adf5f0e65fe64024e210fe9a44253cf73c93c72fbd2255d7b767389d337fa98940b46753feee3588f6c69fa0ee43594fe10288fc81e0d9c41e0049a4be20c7d99345593897b128933a58839e83b4935c1944e1167e86f5742d3e7689ae0357b4e57bc0923def807992fb0874fbf7d6def02fc65174bf878e72e7fce2c8fd86e6bda39e954f678487f1a790d0e0ffda72bfc1476d1ff23bce7cb97f428dec4296717238d2b7784d07a00e7d14ee3a19c59d6f4609f87a7048c05e921c80e7ffa58487d8633f510082e626d2b8eb484a7fd1db1a52da519bce1477dfab4f628a22bfde135914604a34c9c60a4128b39524a69a458a6482f46a4773e27ad5347daca6247bffd1f5e63eda76696a528d882d19081e94f2c12d52db867ba844af9cf1863a432888b311c9dcfc509c6cd692fa23dd34c63d3011b1d849b3fb8484bd843d4ef58145f7b1de28d7d93fc127ed1f23f2fcac8bf8f3a819987b48b33dd4f1006fd3aa5ef7fe0cd42a4ee72ca45c746c7f086d6410ab8be0c22de046db944d7af16dc34537a9cd37a54472d97481eaf0947a0d47f13029a6f844ec57c042ec69b180930699435150363a452d34ccfec4a5419a2c0f14950a3fd8ed6ce39b1d20c70c478cc19a7cc3a5dab86338b19f63c3cc618e3670f33b5a555eb843a7a18670da4bb8b87f29d3a75f748edb5e1d3d4517ace1f70f169adb556d9050884e56f5cb7c45e6252caad43df8a6a7f827166945297506cad59866173d65a6dad5698224e4a33fbf2b10cc3b09c9969a55da61915a2cc6ced30bf019685493b40a383ccefba29b3d7a1f1973230f651bb06663a4e557681f820b5cc34778046d74c732633e92ae08470d4f3b7ce268482983bb009592987b89af6368cb0f63ca6966d1e25f328d8d6f1287366990d59963d9681366a6c4e3338ce5f8e94fd452995944eec5252da7533fb8f74251473697f162a82fcd629c1107a66372b95b2f3cce0902106991b607621c606ccb7b8bcb0a468d45851419d4c2500cce0902106991b312e64f0616cbcb8b4d4a091625951419d4ca50980ad83c120f2a92c65fa251b46583e279dc86b705e2903cbc71fa31777c28f30bc4044e4e18e279d814def3b1efa3b8f87315c81b72769af35c338b2187ee3fcdb8626fc17b00e53196885a68cab6cf6e29e4463abb1b56c3b1b0bb7c2a9703e53c63ba129e3df3d75026fffd1f2ef57211e2d7f889d1dd1f267f2c649b47c1c594846d1f263a82e99ac44cb0ff3ce60c81b33d1f25fc83b35a4e5dfc8fb63f20ee5bb90378d91969ff3b6d1dbee687f2b34e583796747b4fccf1bc358d754edd8c83b25ff256fec625d4db4fc96bcb31a79631a79a7740a8c3e422c79a7a47c95bc332da58ca2776afb117dc1ed9d27ed98a1a32d797eb63ce2d14e1484cdc89627b8cc6b82d0a760901989b4f69c1664cebca5265d6ad87c1fd8b42fc139354dd389441a7b7fcc06edb79f20a781ceb5d8301f7b1f93cb5b7b1f24f645b47dcd3e8f89c93a37597b3c800525645046144f9238627d6e582ce89982c48b750259bf98018a271c11a28a27a078c27c81075440e485113ef0c10f4d581908f1338a40018429bc605544153428432e2104139e782186148a68c04406118b26a09cc1ea01909128cc203c5a41159a4c31638a2425844c01c2c918647c2146154ea86248102b6001175888a20a3292309718b28218745105245ef418995c082992833384f0842d9e28e287212401658a14422c71042e8c9c90644864c21856c0c0084f4c114612720657b002094124f9a000480b48cc1f86382144851122a420841196e058902189229a58a2032a9418828d01154418630c263839c2b5040cea0f428e68c20f5820d1808a319e58248654240c89c010aaf8810b21ae306ac10a760c410ad70d82b0c20c2a0031796480420997100f8448820b90d48842042728b104194801847d0111420070e48814e0200922b68822ad105204a42a3c918112640491c554c1101c4b6c01084514918493266508894a18b20492a32c4871c6121e30ac0b6880851e40218c188cd16a01d5c1901be4608c33be40a28a32640d844c255224ad945082082a0449a10543a810c5055b2821828b1df8e0c8905a54e48a1b208101144318c38926ec114f3c7105142694e1044a8f114354462469c2c80ba2d8b1c2169165f0832410818ba11e2d82008116468cb084154a7005cd1ee000410a404059b2832865f44c200c244b08828827b870c21221a45e31442621e4c50816984811042db290031608f901124251504213284140b02b1822861867a4800a4a60f18217f89421456a5046d0123f419002839d59c4100b9471440d8c70c2063748c20eb1002370418327b89ed8c214130921518a108060853090a0a8c2052a18326330e4fb02690a275853b4e02504088e48e1420a0ea40051c106d14312843084a231c8c8028b79058ac583292e08c2115b2461b55214c5083fa002105238b14008a955e4200420c8a0c2094d40e1029b82280422dce310c701846536e3167aa7b467fed89d02592dbff6445526bf3e902ed2f231954bcbbc89504d7faa6a10512688228a4002893a032d7fd719b0f46a5a3d735dc51999b74e05d252c6e898ebc386b69902c5999a69ce504460f93e9b00390737d00313ab3f8056c12c6f12e8ec2b68f3a67b03d3e506629ca9afb3ccb31ea6ce28c884863d135be6e1daac73fa675f1f7bc7dcb33a97e878b10cb442dc730f98e720f5334dfd1ff3a1e61e30ed7f86c5f649365f4818f6644a77cd39e7943fa704bf9873ce297f4ee960a0b23925cd93d4139f73ce297f4ee9ae39e79c53fa93300be79c7352ea4f422a4497908aa1ef531e61ce39a7fc39a53f9973cee92e776d5ddc00092ed79c73ce297d0973ce39a7f427b3ce25b851d2163ad06ee48a530ed1c008ed492ee95fcc39e7943fa7ec9630e57439e79c534e777faa3db7d820e7131a951b74e1040d6a06249a400165046405165700216946fc0801e9490f10a0c0d3f3a4e525099a42eb49147729494194272eb4062e464d2e1322284d9e6c42318c2c80d8849cd0a8d018f94cc11048381151f7041dc0201265d306088a2547003d29e28ec00324454fb0f85c57fc10b1f82295a5b22991280d8a084222596c8d409813205d017aa1e354548426e8e8f001460f2962042cc38cea0bc80527a8af181a6324793097941ec96381a40f51135a3e79695098c8c1eb897cd1255968225f4f70b0d0200a143a388ce6ca8b00c509e6ea8957220e46d7c50dba70a203239b4671c8e3d0132a44c1702332676ec1c88e1bf922e53a29a3904693272cd1098d885449a47aa16363fa09c2113a36469cc70fc1cece8e111d6fbc02d74f794dd48ff21aaf44266db1417e2622f5cc5b82e1b4f34c64ea9c8c0866033665ca14673d373b0c7031ce89f9a599ba158490de42c14c2600514666074849416f4ca3cbb3f01916a38d25d0506b8760c518466a06aef0594113ac904209260e60a568fb3865716402184144f102244cf8210b298db5e8d8d2a206faead8d20289de585218703146088d280f3d2ab0d4e1218e33f669e83633c218883396021eda7fa1026f4ce511fb41a2110f53c54367031147023247bcc9de3eb6cf65a0744920a908e90b2d7fc7275acaa7b63ed5f6a58f11f7a739d2c41adfc64a31e0118aa651727cee02a139461a297da4a41d5c46b2b4747712cdd0348a81e9eb10bd68cdd9b2d9bf44a22eeaca39d0cf39070f8b3c943f5d53c52308525c266a29049e7c43a691d29ca7c041d57a4d945428eaa178a385cc284ba32ccc522025afedbc82d4fe9e3d09a73e9c49da3593a68a0605bd00e15690d7b896dfa2320805f25052d64ca2ac4f92e24851240d1898b2a8120ac484d7c4555e9646d28987b28987923e47a7140f9368f94e7f531ae4354ca890d7d82050e24df6f22919f146d330706f79cb8c6a6c067928e95bf0a5140fe51462f2ba0a71bd67d2152616a48abaa6cceb074985d0921aa1e58eee616e61c73555948a28231f0b2d3f081449cb236899a4e57397066901cb20ea925f79bc66cf20ed3a4ae2a357d26390d730993f9dcca279042da5243569c54894774e24fdfaf2e712c96408a157e8faa21491965ef3136fa28e519858a2e34f1a17a640e27f8b0d5207a1ef72884c0429de24f19aa869a5914a2a773ca4f4a9a6d123f5387f561bc4a70e71263e954bb494ac2d595a7ae08783de3a91284bff13784f821ecff346b0925909878798fced33694ad9c1c1c31867fdfb1b86d8a57ca6f4992d2418360c72a73696122925f70d0d0aa97a675ad68ce3b405de72455d2e235f621c94d2f7a1ae982357792ffd6713979eef81ef319b42d1f27b709841e34f1ca4c77828a5fb739148269138f3e90433990387d68e42299b9a71c821ded08cba8e33be8be85a3395348a6b5ea3b97c84794d83d17ed36076c05ece24aff19246ea5902a620a8a4cc3785490d159508000000b315000030100c870362a1683452044da50714000f7aa0506a521909645110e420a48c310800430000000000008054918d02fed4e83671a449810d034177ffb9ed4b84e3831788131bcd44207a2f8e34143850c146d3913014a0be075dfa3d8ab48f435d1b4185cea710c7dbb995f18b542bb4315dcf0f96934e162610eb8fa34b81ac99f48b51150013ef9fe82d69ba200f413295484b1b76173ece753f5f072d653211fd03e30885e67145a1390dbe31508aade13cbd836ab51f2a27c9caf1c9215dd4e8d2fb4c4918eaf5e13d50cc48a2415b174fa8619e5a6b15072d64abbdad0d82b253e9fb0dc51b81a4358841d6cc1c9a0d99564092d6c0fc2c83ced4a033c8d7f3c19f12c36f391948049e47cd2d53351a2b9ad860a7c13090bc551025e87d728fff34eae1724d5ec3efff12583b8fef0929e92ed3e191784075f3b82391bc0bbea57d9d126f892326d158ec1e1dd6838f2c7541467a8e4aecabe3456f3fa130d541511cf5138d886f6aa9a32cf6819e0f2ca31cfb579abb20f0558314b24740a0f63407438897b730a2ada5044f7979236551938612028e8526d81a9d8140b873887a6612f8ca8460a181c3a7ca219f4bdd107834cf898fb4544b374edbd6e132bf65d97d64e139acd6de9ed9d4ea8ce33c706d00ca1f99415f3dd1519c11b1407637d4b169f57498e1fa704822fc6982e2160e27fe8b3a4dc615aed9ef300f1529568b293a429c15a893628c422267666fc0c8df00f8222a5faefc7df8e6189d7d7e72ec844e23b2071f81bd5d918215b7e009a712550109a161e5c8505416471a41645b70a6bb64424ed5398b001b0706c69c13a45cf42dc92b0d23000cc992170543152e2f010084d8dea8cecd8cdc2a1b95c71a1b0f322219475d68169b1908a88a3f61d61b42a5d227ea586f08b36f9121161807c1988700cbc3528822218c41a2404be583b72a8b617d409dc43a0d72b6291069e117fbd86f38c3147ea37dea593c3fd7484e178337200a5b7b26f81d241a1f85e16d5592af02a43c9d807f71b4eead6a8e0e740593636a99247d123313cafc9367ce3785d42a0a131073c9c8fb8137c71fd96422a6f137cc8454d9378bbe3de7c48f44981da7b8855157fcc73bc858e290a2fb1877df4d1bd6c437eb0c4a7c3b5a6610a75cb0db576904d88e6c43bd4b9be4899019055790a635089de70eb524f197837419ae04e640b91db42e72757623f75ab0d14eb6dd720a7d83913ec741399e9c34a88a06e641f3f673a7f5449f66cc9a6d70460185738cdd0fee9d2e722e0b116e9039b645b7779645baae0f04463f92ebd1fa3e7111cff7eb124b2ae6081f71a4eaf562f77645c2805d7b310c85a0edc779fca604720a4b19a71e00edb19aa38702eb6bc5842ac55f3c00c897a878783c28a6c271236e09687ab006b261879bd6580391de8c0b2decea1d6da13a920e5b38c661a3065bfb7fb3b161716f592e82cec5a181e4c5f3b5df9ac63d703e8f2463e778b1e844b06ff62d7e90aa68e77df1a78534792d3213c0fde12c58182f8270732a5009d5a6da63c998e67cd4e1cb316ca9152432422ce6c5254f9149acc609933681c223dbe2a436433b04f94bc62b47ef33d2dee4f8544cb6aa8f65a648902b921a350a4235129475d027f5309e8aae38e3293bfa5748475d1928a0151cc3c59f10f6515f3b2ac829530bbef65e332392b36249243793eacf69612a785bb5dd1ad5d46caece8e65cc56d26079026f4965f6ade9bf17249eaede84c33c699b2fd28aca694d562a63765e2b8e73a3c50d697914eb1980ccb07d191b7dc2f4d468372e85045c2ddfdceaaedaa3945c9fb91a938339367b62234b31f755b123185d2d61f8c08f30e77ddaed4ccaa833af8846cc7fc4c60aab645f5aa51d6e6305eb5881bdd292763a88f558633556f818d7fcc66332139868eed6487cd070dbafa1e3ad9175f83a5393dd48a037b26f1f84e2b731b227f048da399f485c57dcf37b491f28f1b40c8816b0410c8b7e5d85776eb8d4ca8e0f68c8b1b086a5ef8778ed7191ee725663c5bef209f11446089fd8baa50c453bed8ce2f8d4e5f79d65575d3fabe51de09645804a06ff6d115529502521f68d92666c4725f603048bb4bf095006b1a9003b5bdadb59467e325e70f3ec65ed77bc940d992149413dc00caa95d1ae978dad897309ba03a2d98e43a965ec0da88f323d820ec39c9438ced9416343e6d7f07bc9f0ce086a9fad24616c0e214c135e62edfa985c29acf8432c0c030d76b1ee5f99b1ab628bdb2c04d9811f26101099000c830ff11e75e4e2f6a05c2fc8b6fb9048f0e78f8462b7ad41b23e43cfa10d22d017db67335975bde2b027a25ff01905128de693537d0fd469339209e60e92a84a6237a33bc013afecd93261589292df39081e0b95b6865eba9689a1804c894479ebbbfe83f619bb15529d022f8dd52c4b6eda3de7e27ff50c276df571870e42a155db564fed6244110b262c3205d38f9e2ba66978b177ab0f30c1d9d8f8bfea6fbf5c31d98da6d2c1935403d366f29038b34af5230336abcfe02151b84995bc8893d41e25645bdf01771e2a724340eb1bd9f3a362f5d0fa284caa60d55ecf5cdbd34b7e205cdbe121111ab97914032385deeef405f8254777b9eeb078c2f178819633b664c4577ed2495fca9a17a58a85eef82d0769beeab3de9b5e477730b987752c20dc55b5a23a4b5eea8952d192ce5d4ead7c641eddafddcf0b1eabbe677e3fda01c0a94bf39a31649eccadcbdc5a8789d56ae5bb19699c780d6bd8968b8d099942854fd06f6c913ba106ed56c5e59a4ce2b83b0b7cef74f1beb80466027d55a870b7219ffd3994e6713cfb6368b780aa00977d972baa298080832d2906ac90c6ff0a03343b07363bfca546799b1277be2b80b25cdb9550a77037e5329a5a2a8d5086c19d6c638a68af76a9b7c98d623d19c79e7bdab9eeb328b219d0b44817fb58d0464d86db9b5ba3e555c02cce29cf655142ec335c152663e4cd1a1452c82e70ba338a2f373a89125cb3b6665a32389342fd2d14c5bf32845f0899df839ff3ea1eceff7690a69c4b42f975f9c3ce7f527141f068d0332954b174fb1458af62f523904627c5e32350cbbfc8f5f106c15c97fc47ea5518b6e01601c4b90280ba5e46b389348c7a1d14196f875931d12fd4471187071d6ea4d57ef17a591308307eae524abfc0eaa74ba456f7e550321f9eed30ff85499a22cc1b6d40e57cfc23ffd75e88b6535c0e4ffa3c3e4cf573202c3f180aa05de0fac1a45f87b0dfbbc8346784e62d2df1cb7c3d34c65a4792ae29f0b2fb9091d54b41ae97fcb3917b16cdaa28077cd94a626415b0954a8a7f9a08275f164ad1933e5c10e0f369c066e2f444fdaf6815787a38ff439a8fc0dbfb4232f2b993644c7149a839fdda0f9968ed65361867aad596a55c66d2ee5a263cb898e8312ef85b31a99906663fb20b08887fbb1c0e46ac98eeabc33cbe8608f9825d1814fec15d0f894f046efa704cfcaf605781b7e9304e9ed672771e354f96f3e7a99571ffb3e398e59a15a589d1b5e8f2c62b4dca3b7248ccbcb7e9c303c18eea9ce9b3faf1f37c6e1dde165575592fffebb71e8d1b45ba7f36d9cfd6cd8adcd35ca476454b01275d751a4f56464124951cc53f8b2662457e1bcc52da0537a1fc74499beec389ab10a3e9f968aa247a1c91dd111db452dbf218996768d9aad2e71266679f5e2edf0b5cff9af01376a2851571ddf4f5cf7dc85d4e0b7695cd258f010935663d3828b75ada1b60035e2bfe199157d6c27d90b6419db800dd5626baf3c81ecf72a51132690fe3794e4b44273f3f7b1d696aa98b921afadf92580716d33fd7b994036dee37c31644f8ad9574341b5112312cc1aa9b3eafe77cc26d2e89589d05c21abc6018db1253c46b7d88aecad6a79018fe342f10958afafc08443e510a107b79f5600f814ecf1222be295ee45e233e3d9513e4da3a2c120ecb6385298946e2c08d955e8b594bbd633b406b13084f0a9f699e55bc88aee5d44a6ae2deeeed27490ec8b1a1a37a4f740dd01adac8162a158bf61053c58bc0d915bbf5c58b6c018ec711168ec76c04ca0151d3a0adaf5c43ca8df5a71674e8975a2d968bf42dea1d5b8726fc308064a6b680b2bd1ae224104caeb0eed0f17371e47b229f7e9d281a1c1a0fac69df4b4b1d08748f592b2d1f0a83090eae442fd86a710e4f8e5953485b886b7ca63e4d762bcbfff53f7d99402674de272a0a75f3f49550c263e36c508ed692e69566694a4f074baa3c165f1d3a139a243fbe4b52ea96bd39f04d57b4d25fe67e72c9dba9445389f12ef96d94de700ef78048ee71ec0785b00430a3a09fa4dd321c2431101adb89dbe46118831d21ca3e57e5fa89521ac9e3fcdd7b929ea1e027bf0ac0097afa49ba565b45d9ecaf6bf3fa82433ff13a20a4e8f998add1fa5865af83bdf6d50118eb6d41afb24ab1e27d0ee268ab7840045ce5aa0d8b4e1ba321df388bdd00522ba682b4cdca7872867aa9cee35b50036db071814e7db786f76f402bb1c049bbd1a32da47158ebc923cbf23f80e07c00a808161c7624d8ad3d26ae0c3cec06126c165d8e93e0855272a1d5448a0ab9ca2fb90bfb4ca4106c000d2d4b3f88e27fea600e4d47317d02a718d9fc92c57e436c4a6f5a1700530e4ed0604cc31aeac8a6e12d5381e5841e51017da6fdf611aa2c8116caa1345d0ba24de2187b2b10dd9694050a0cc598048971ba4316fb13e358599b09dc4ed81b01b6aed0e96145098dde2e915a4d58b05e00acfe5f21416ea8de3864436b7a5563877972e89a9e2242230fa186fa4d3f160a4f045dd333e7aad8931a8a862541a1de081e2b2c116fac6f18b1bb7b604147ab909e3f031be5724cddca5025e226456c129d6e621c5fe7500b2c7a85167c280a5a4f7bb825d72f6a7a194940cf706ea8eea67a2a2c98073754e58aa2bf2d42e8e79369572211e987dad16af0dc24e330d10c4defe67b8a1e1f1a955ef66b095242a14b447a0e9be0707d34813a37ef7c2b57138ce21fe265a1aff4e4563f12f32abb05014c90e15e3e68f7e386b87aef0b502853f452fac9410b45211992a86024c275b352e96e9f03e56859cf1cbe600332154facb9c9b10ef564a8d1931e072b472c250b340d7b7aee05016ece8650617b834115cedf94bcd0f45e4d036ad67c57a74e2d6d03059eafa565c0400945186a8f8ed82d14c53a2115b62e9eda4aa947f8f90d22bf21d0d46f03ca357d323112907eb56e110cfd43d2607ad74bf4f70d5b5c5682a68ea6a95cc6c8a0532c29a7905be265e7ca0d4ee7255ecc331be1272b3738cb5d78490790420bf051bcfb07f0940e5535f36f3c45699dd1e7c13562aa7c8f7f9ad502be7ef203900f39f2b1e10f7f05c24581c72dbee0fcce2811b3c8812af3a298afaa93523de8b55799a52ea45ba16f4556fe2a5880fd2fdc969f39bdcf15639bd35ec20d7d0c81aeb4fb87ec1873ee45ae24062c3777fd27f6880b75a3cdd2ac4922f23d123b1e3c53a7202f60e2a82be53e602be3f0f6dbfa373ab6dcd262a85ffc74202dea7e83b3e8ef0304b0f438656f0bfcdc0a72c8cf19a4c07c51eaf6ddb1455975cfc06fe15602ff0fb646363ef24ae70ea95c5e0be9d447767231c4bfc2c07c18168a5c30685755b7ac375e2d70492192f00803f1bdb531e2f1f08b3290ab94cd6846e46ea9d5b3e3b22592d46bcdacd64b7b5982fa328471e86d85b9604b5b2ca30a23359f102eea3b97f80cf160cd515e5e48d2e5fa2f4f6e23eb2d1e46851805faa007815e78a25f3f2355d5c26980792a6029094ef64da4d1e0c8221421d1850f68f2a2406e24ed11ba8d1e52cd1e247540e040538cd6ae0484101f4d9321505990a7fc451d251f1b38567b793784400104b99941b728ce410fe934f6e60136e9a71990cf60890921aad12e081fc0114063f657e4aaa5be0ff1af832dfb381412777e011d2cb08a8d0d0894e9e362f356568e300152f726781a246bcc5717084d53c620033254d705d86875084a1eb6d17d353ac2fa93ade010aa9081c6152c65dc1217157c3ccc1571712ae4615106c022d883eeb87b283740ff5024cc8d41a013d17981c8420c7dc21e5a151dffc316597c0e626cffb4ea15b27158decc3b30bb70d87e22c0f4c16e71de5433d70d6abd57a9f6ac4c5fa0f2f17339188e66e796f1eb23af950d296771b0842c847ef3437505bb98e0dda3dfa338868ce46c8a2d2d2fec4e7a9e91c13c4174c626550116455ccf7a79f2eb7a986b8cf081c27a48da6c8081cffa4c2948c4abdac1ac521080760e3d3c7f416216a4cd0c0614885f83c9b50ce8df7d6758fdd89efd05ae87eb2fdc64602d541953890f264c1a0882dd125549f226cd81b09eb6193c864446c8cf841c6492ca48083fdb73151e8c529f71636e40055ae31fda0096d68a2eb3abd15a116ca3776676c07f33989a3e4dfd0380726b65243f439a199d0844046ebbe8c4ca0cf8254388b176a7d804e30213fc880556f02021f6009169b0656ce7b98f0a6ebbf89508ab2ab8a4dd01940de19074b0cc475128450e7bd9119e20251468d577f217cc48080c0314687772fa7813b9eb52e47f608d1c085cf4acf720f17d57d7fb60cb10b5c2e0a6d2eadc5747164523861e8570582c29be8ce038e2812cf117cb469a1e6b1930f562a603910927432cc86f05aa3948ffc8c79bd36d1a0a15e32660e66c0037110a12537f9b789ced5db7e4add0c25a342fd95b78c507e6b6f1967cd76155fa4399420add22ddce27a18a5a7a80368eb45a0738b5ce083bf31d038e580ea4b4e29f6eab422b4b19adb2adae0a3de4b865f45007c8c79d6d1b02d7c88860fbb0c0b8609af9037c4c9521bed2feb6334fa394f4980159ece328ab6695eddc7b9727a4bb89fcae4629c531def8b0e44b627f40f6177014841de036fca456f9baac5b0e69a5ae62ad17699ecadadf4dec9b82147c4b0f3592e1247f1be0664ce31eb58f21613d95a3e3e9fd6473900c604bc4cfc578315999f5398046dec7c49d6c98ed38b0b1f365dc97566f3ac5161c1abbbdde36b18726c5a7ec00fea2b4f3c1e8db4ea559743c37d783d1b030faabbfd39ecc6d75911a2bd7701927674227dce843c68bfe8352090ad70c781a2b1cd3dbcfddf2b76efa6b89bdcff6282c9d777d74e63b61176869938a0227eed112f34c818582a3b4eff30f57e09dfb02a6feef5c5714f8916d76791269baf8396686259c45a717055a3fc93b44172c5fc45587776c04f4f3fab9afb1b5cbba0e108d07f9a4ab0bb42febca5d467781e7ba3462b43765c6b8493b28125415f0005d47d5e1cdcd70cb60f5e08f8adea5e04a99841e6be0108a538ed0e67e14d3b61e5451095bb1c5b16fca7f77aa3d59acd66a745f8c838ef739c7e77ddff5bfc3a5b592be05de6ba4bc39e80bbbea96f5cf634cf99d2ff59886ec3e2890892e0746e5095fc02ca04fb63a141bb7accb381a16bd479e5cd2981c7b182d2aace81858b52f0e44246c21d045b87f83b2a691a0ac9b02a13713066a7e9e5df0f3e3f0b1b1833073a56c4118c30a090d760bbfe9e535c542cde0a9732576071bfca69cc2e0c9333a7c8217ba259743046e15a2d2b2be49958cc3f72ce3f66055ec4c98b51b8b282a8e54fb60a125f0dd92d253119f62e86035aa2ee1756ab41e678d0c3fc9951879d4a2c23a22f3b0f9d2408c8a980f0f3bce22123264bfa01a30c882940c2b10481b55d176d5ab99a6a9ad957001dd62d744ebae50a30f3ca1a7d27c2742cd0536c4c411b20879e63d9022338caf85f0e92c33b5c3ba351128256e822138088739ec111fe01309890c64a3e5e27f1eb0821ab3048401b4f55dfa01ef6352c28b8b657b5045c7ae5b18d490343204f75e6dc06fa5897721fdcd7a2a541c17602ee58997ba13a621a479cb17fc6d40d80e187bfe4651b66e66b73e6ffeeb5aa6f31036f7de263b56f95bc6800f6a123a12225587d761b35eafe75c057110edad59aba5322f40c3f3fcd87ec9109ba55d86208229bf927009829e2f95a4d8e1f8304299791a256f16a7b0829ef42f02df50d812068e415ff422f637880e8182e5890bd080f1813edb7778ad6c0a8ac3d40fb6aca13c5586bcdc90e28394163fb236eeaec3a23c8baa4d3825943439f3f8300c7552f24497e1bea2b156e5e06228778ce5f1df0138c2a644cfaf01a52743adfd61d27e5a4308a1b9600e1744a82a59232d163aca5f95c2b7dec7dc6d020aeca3df9160bfa00cfbd8d7594fd57a94b234097783ef39fcb100654bbe787fade872655467916098a7c3ecb5a0edf43d37cd582e210d0baf30925ee41a109a7f1c607b6e0a29d87b45b541678c42722edd2a5290d47b737cbe24bee884f5ea691185412a3a0fa074660b4c89c48a428496dd1bf510503a510100ded81e193420f023f4884777e0e856eed055741467af3ae8d5fe4f39e9285dcf59509231cf6ee0ed3e0d15485106cbc7c64eef6d11fc04edf95c8dfd6f00368d7e9ce0019aed2b82c120313f60ead9923acf409ddd6343a3e1c814d7ecbc4f792fa93287d7d8f7374f498cfd8154b91602527729c55920921a34d589dc6a414e6f119b2b52082930b9794e98873c4369892c90ee7510f7c6ce611d1f4422cf5d77fd8746578339abc04e9e4a9a6e053c210b90c683610d663bec8143a488a5af0924c74877c36b7f21a1ad51797b84bb11cf40d5ad3e608e5e7b21a67037f51ba75f6d90e7b31c0744507d77c2dc8a5baf9e4ab0fcafa153d0e5b49eab3900367b0fc6f4b821bdcd3982818bad4a2481b5d4ac47eb497c1dada94c9a0aabbe420df486a119eb6144ecfcb392585cb129ec0986f52be4e0007c52265313acbed82af4f6f0bd4f6025049c28e5d3830366c6305a71ca0b1a05152021b77020dce1c76900e6732016598914bbdfa4253e022af5751130b7e9ba86d30ef79ffd3681e3436cec5787b40ced5df4f93f611415abe848e14fa19b229dbb5ba450696f9db0dd57cd5466400530785794bacdf914b2ada2fa7891eb9c6ff9eef03a0fe473a23a3015e02b7313cafa893f6f640a0f75fe46457f5110c786518ff010de0d8c75781d6ecb8bcee934048f59ca9773940479be716a266ae57f5f221822aaade2f402e64b5a6cc2160b4ed33ae0aa493a68d255fbb388a405f10099e40070373396c5f4d6bff911495d6d12d33a1cfe92759d44d0cc6d11d837c93ab2318cbbeb184138739023b1c19addc391d9787bea68182717923b3422f49c6e6a79abc15e57c6dcefac01a919ddcb947e6f8c118e4e46dcbe23cd6cd136a4c5707f1f1fb660e9015bda639fad83031b41840386b2e8ef6b4b64169f4db409f2f6082a0bc43028eec12f1922b128788af062117ee0136749e82ab0431705fd1ceb7667b7a1b8fb6a24e1a062245a7fbe18b46d06980ea45a1b5f765541ca411fc6e95e72f06d6d3dbd3104cff0d1dfda0edc6d04ee2d542ba7e280fa424b1a7e686d9062cc95d421f6c8bac95389441a5ac2e1af4d550c24ca4aa2f32c09d4c080fc25dd6a33fbdc15d003746ed827c1cd0ac8ad54e1c12f40059fb8b8e54c0fba89a2ab9d3e16a02f2f87f12cfcae65b62392b6f1d90408a3e4189e5ba1b78ab8934ceb03778746b2ae1bc801ca259e5c38dd3e7c80b9c87d8c848eb1d4df969b0395711bfa4a8c1a7dff432eaf1ccd62001612a485b86f7fda2e9d96ae24cd2ced61863ef7baea060bcdc0764cde85fbfc0ca8db208b0f4c1a1d999370a84073e6f6c0fdd8e8f8abadf6b338724a4a755ff7bf7fd9fbed2e3b0d4ee9544dea9356822a746b706c67b4a7385a38ca520cf82f44ca22e3f022fecd5b2178a132002faee5adfb3d3b2d8ad0f4060f05cc31ffacff119d7abe807ced1a3203ec0bebb72874d6158d2d298f8198d76607ab2fbc23a492a55293b73c14c712eea10f14c73caf39a2d70cc475c3d79b1400e2db91351f17e3486323721c5c59f55e991ff22ad2327f8ee05dcc1e37196666f32a671a0f853305019faa888c9d79b23eecf64c1eb6213fb01211ab0c783cbde13caba14493b4c7e38b9fde0cd4b227857c7cbb1184d47879e722d9065eb7c3baa1c6fced6d70d352b8f7596d404f91dd553943ea7dc00d761ff437e646b0288dfd652db0b431a5855e996456da47b5a173a505072aa95faf7a0492ae1a82e4878e405a493fb714cfeb2d92814bfbf8390e48cda8eefc8db9c7554582e9278c8919fb138f4b0dd35df9df18b70f0cac789e2e6bfed3b417f1d61b5a08d59f4a7adede489fde4a029e269cf3e080130e00225c51b8b8fdd260b0d1d25c752d27f9913e7512e0d120c341eb71367a160245039b9907e653124e8d1bee4f30fb35dcd9d906e30419a5756d674b3d4c7696ea0147a92d5acdcd2215b5b9dd456a22fa0743f795b9b9fc8f91be89e171de6070c6e0f305b0ac12d243075167b86684ef1d6a6da2072dadfb1a511f2a3207ce3336a82184a06517d715a80bc41ac8e526dd56f9b61f3213fe41479651873275bc6dce0aa3fbe7ba84d6cbd15ed7e74a39596e3d4a3872b80ed769efe1fe711ca609e4385ca1ce597d9812d2e030fbad0c6eb821a5a78cb609a6191c037feffa1aaf1c5ad5c520b7201579cfc32fb933919d8394706dd778a07762a2437f804411a47357d5440c0f8a5f68f463c65507e51bc2101bd7a8a84436c5c694998ec5e20c48347e53cacafc31f2d45cc9e1fd6554d085db514b79e53af82f0f1ed369e0f74d1248701d634680dcb360e309c2433f06d80acc26b38b19545d9e281d5a80edd4d2e2dd469b8ae37f10160d92981c80a6a3f24e5bad2d949332e60d8ec3a80581d8a1dbf9782750e9b095584399ca887e2907601d8a02df00441139a9b3aa11bd7a1473dbd3f0b8ab29e8a42afd036a7fcf5f0be106fe64b0e2045d41fcc318b59b0e0aa84733089671d0dfe8faa2b069a881f1fc59e163427773c763e59a662637708cd2a3ac67a48f01634448529e2d40e9f94273e91ed8a13418d1b106f0f46f0628642732640cf7b67403f6fa954fa5480658ab689b7b920016f28c6909c863a0a4c36931306aa78c7b97aecf04b17594589ab993729d79864e3faad3406d43896b557f3cc6d736f77c58e494b2c11e54b804538512d4c86d5fce15c53c2cab50b3a7f4f203d122c315715a7007dc904dbffc0b86833343b006e05192e751e1e964a14f8388810faf754434bcd0242f6b2a47296b95c6ca4a8b8af510f15a5fb818bd33f97c3b6c7f0758cef27941a33469a4e85f7b642c59fc2da4aa6e6a178369c2e9fc3faa5aa6cdf36690028360f396e0bba5dac377aa69c08ebf7c3534c435451877896aff3af49fab76643fee5d861cfa494de8f6c3ba4cebde29d04e3a27fa84e931752e7682e47e1035f01d2728cc80cf6901fe3a5045e359269b984d58763b41221c8d85a7646dcd81af1606e4d3964ef5e92ef40ca755807a75e405c5c0fe51a44435db7f9092fcababa0bd4504a39a5f384ac61d2f76429d937d72b916d8ddf1e2a307655f3115cdd615e28bf75bdd3c15983c43ee92dfcca880ab1d5c42489ae0240c882950319fa0c588068ece4618782d1d67c19d6d75092aee0c4645fda19db92b3115120983a131f66472aa84f69167ae64fe3c576956ec2ce83efa660e5456f12ada8d1528a247deb35897a9c642427a2b7a2876e36f44d4b5b334ba84c366be37449de6fae7fa704305136fa43fc70d6b5cade667ee5e2e8e7dda942ecd190619a0d350ddaffb27e745cedba51561be838fa38536112fbfdd7c6dd7b00d866b162576fa518afea46d351c749cb20db1011ae1fc33b05bdb3f0953b73523057aa389238e7fdb195f26e8a8aba786272f63299660d925a8d0654d464fade4ccf2c64345b884be5f61f46a0fcbafd98424aaf8c395c6bd63f189f80e74683091d4a4b80514a10921682b4abba55110401ce13a5ec0b0b40ac56d9403b40dbc60690503b68e4c8d71e41c0d9eaa6ed0de4912ce7fcec6c3bad85e508ac451e0212facb662ebc96ba460ba695f70c8e70a6c37d8aa328a3f11399e47ec5238180a0df57054a7a6368e1667df2161fc80e05a1a375fc44c5fbb65a308fc5f175300771c31c25e13b3ff42b152bd5c6cf4b684458c79e9117abd4167f308b073f698e64c22f39bf9915e0d4364c2738f3121071ccdcf12b4a9a3bad220b40de5989b2c30fd9133cca944c98151c6bfe98074912710da1289469bb620e2f926060d8a0201e06984f16303c382cc9f9fe40a5560c75616a0f727c72529b9c40292b569b2f500cc169eadeba1b4ff30e339727da90534a9ee4e9045b52332fa82ae185331a9d8083fe1eb6f275d0c785a37384a8ff1187099af412077cd0b2cbb00ad5ca81ebd90b5594fdef2d40e93ae239a23e291819bf31e06523208eae572fd65c07d26a857675f69d99dfddc6c4c0096857846ce20705ae5f14a6834c26e87dc504299897db9009e0570a6881721eb29565fdc76f2364e242bd86c68130a015b17b159dee2710563feb0a71eac77b81a671e679939b61e1c65045f3b16133550774383cf0c728981ba1777a64156f7f4249c54735cdd09fc5f3c1a1c59b9c98fe1bcb0302ec92491be7f703ab4a69474dca5e6fd5c14e67569ea3f2a81225da8dff0ea237c5c82bfffb5c2e1aedc6908f6f0e6675c7c8be5bb6a5ffda5193cc37d5b51c4febb96d434642b5287150ac1aa8198b706b498b3386b2dc29748c8b2835ee5f07d004baede79efd095317c000e3674f1ceca3611d4ec88ad7ed101b20d815632fd94b6a1c32b32e0c111a3ff5b0c959da292f619772febc21052847c3fac7416ff62d8c0a2d51ed9a1a56629ac2156027f92bb3bda6f69264d6f709e69839051a9679862aab3c9a11620b2c4c58150cfc9a0cbe242404afbc68128897420d648af5732b8861821063da629dd1fc194e89458f8424f58177602be6006ad21801a00ae3137a2cc09c54b9de34fdf0800328940886ad98b6297749183f814847dac5f4d8f97dd1c3175ffd979a4cfc1edd8f217ecb049c967b984658a9836db20709360947fd97fdc0a541b25a282ae8b7014d95b7a9402e69d2a6c8d561cb31a2e9d62c561601f6ad2074c2b8ef80c251c76fdbcb067818407442986b73959e0fdc63173e30aff902fac318a814779a084e1950ee542bf9cb30b2e2cef161e0fcaf6a82c4cfbda0cd1157284be2c804c42f72ecd71a71d9ffb393f2993cb98204ff3bdad7d24e7e61a5310810f39dd73cfbde2ba24a01e27cbca7cd2301408822a8dd9daed2d41a32d03a9c00506cb9e39a11da10d3f803097da10cd5b629b10ee28c0011fc1971f0ba3938cb8eaa128fb5132b657ce093b0149d95077fb1b45f8a370cf42dbeb13cc25858e5866b4123f4567c1e23427ed45a2a5bf1158bf05c80f260653c38ed2ab25fb7d8ff8331aa0ab215e3988e22b457d2e2bb3359af38201b51cdf056c6f7589a629664390c5d22e46177a5cc32233b7a8cf414c02ddb51fc24ba383616602414f70a2849ab12d1f3de25123a81c91a7dec2eb3e3e0caa7902e2e9bd4db809fe36bcc66ddf9d9b7af82dbbc72dadfbf8889de61321f0c8701db40bf8164afb5501b67b09f02656c13e0d9d20c5b3281d8663f9745863c5e685289daa283cf32ab1a943f64b1b15111bd0cb24efe828eef3fccbffd03b12a24bcaaa82431bd05334f345531bd07f8b93566b290808a1a25b0c0db53bfa722417a4b5183c73c7cf18b4ca320e03b2ee726e444c93ea3f2db0e5f93f57416af06b9d8a16386a0a7eecccf7a2f9bfee69be59d8d19faa4ccf45411df6a3355c9e2be1ccb15e0721a106238e31ec24466169ae6d78e49690cb1028b82b38255437184d143aa2cabca94e73fdb2a263b7f5c56bd4a7b0d831261574645ef07949fc9916368b4cda5f7a3d083ef07e59c0c152cfefb090c14a458342efb7aa0d0130de77fd1f98eb11e6de12e9abad17df7435faf3313259dc02d49ffb48835ae70b44e2a411dc1b8120757e8d86a26bcd37d6309d3095335db1d4efd621dc20a015aad1b0ff3164f46e9f2db621311829528a9d6b4199fc973c1dfb2491ebd15249f280c5ed350d9749685632cbffa9262d8772e70c45762cad7ccff286e0c439aac428931635be8d85769c4ce0fc1ef04b62ffcec935abc295842458511d9477c7b216c5bac061be3a4c9369a8d27a970ddb3adb99c490ff5322bd01d3f16ed4a9f124729dd7d497c2e488414b4622c844796d889980c976aeb6748f3a2a44d0b480941705dfddc9db858698e7761e6892748b8439e17ea5e80b8bc7abc8a7ebcca9c6c1cb41cd7392e280f41c5e14d6308faa235b20fd0d3e805981cc7a8c8df7c220209690c8ac5f14e6a640f1d2df947e7cd29d2e55a1a21094ae817adec21f538ee8f92bf6bb449ad29b1e123c45aa245c49a810a69337dd7348ff4a8f158853093118233c22d29acbfbd59343624bd64569e726f13e38e570f8286c364fb4b98adff8110d5853039a52a92eb0c1550ae93dd61ee6c4ec8780febb360f03edd83ad78ecdc47dc408a4a45a494c6a6f404feb3a3ca4c73b1a56905ca3d6f4263da50862eee95653516f9252c43965cf234d9b3e8957824751fa2047b4324dd2d728e680ce2b25faf600a92127fade74231e225abcc024edf5150da5b4e41ae1be670219ec41a287c7d57a3be7a6de55eeace04320847a24776d95c43827e50ec9f5cddf9545c89fcb7d80c49ef8d6ee53c22035477b5d487bb9fc3e7ef40f956fb63d52df210c9f7956f388c10ae14431ceeb25da4f8230c520c72f478ef86482169561ceed178a59a1ba7a313d5393521944a45ac27305c1bcf45209c25dd25813a012a66371849c89578a4aa16786542c5646ed5ae59c1684d66badb885efa8011eb328b11011a6a31f69956624ea8a06f6771d5e3a1745bb050dbd61e238f455765758e46eb5f76515a3a26ae3777fe2beb340f230cc67d173c3dde62c798307845000170d36352c9e6a9274d16c7b536971aecd34207426876a9beacb1d51c28ed962665fb0c2e5df1c297b0f53438e5ee98549c9328b08ad21ad4ac96aef72011544c758f9a863fe6abe548b4bbce18e4ebfff63b77447ee83f62c0661b6646976a79e91503acbd98fdcb721b45a1693d324e35d82e2140abc03113cb763eae839393838d7312d897c27a4460b52950334a912fffda2745e3aa211e69363a52f4595d01cff89806d36e9c421c7cb565a594225349ea451a785f4e52b3eaebf94837af749c5542f0d7cc6864f22ed2f866bea0f126aed5b5877a8dff0dd816c561464407406701d8ee679ceb0f78d04904fff678519a3d2c815b5a75d0e7e18303a3723aedff9a0799d3b8b2fa43fc2125865d25d161c0449e27abaacbf97bb6e5ed61229d691ff29747f79797a69c5dc70bbbce5904fcf82be78faa643bb35af6ef5ba8daf8388fc7ebdbaca442331b6105d7d85c3774ceca24073656aee19e305a034e62ade9db7dc7983b41f171c219143bbe525c02222d9a988fa35895a34db47afed2f2cf94e2fa975fe45d91ef527df536e949e0a216be5dad96b9914a89cc241d39863af4c2785ef42620fe7f40e143af1646e0555feff0f3821b88d67de05d00d18701a37d535ffc62015c110c34736681285491f490437929c837695f279d8ac5bbfab9b09bd3a9799b1cdd179a3011a4efd83b9f69eb17e5aa274e922897c4f0ebc231cf2a7ce00f27c6ba00eb120409679e2a26545469d762e0a0ce50e6989c180c12f860f1e7acc5f0019f3a214a1b5386fa9f1ac1a7edd28ae6e871a98cc204e158d62303bb7d7cb0bd7b86a809c7cec92404f669679cc7690bc43a992b5b6a4c52a876738e13ce65af33acc6a65ba99de0d6eb59575937ceac155ed3ec9ff8ea6a0512c7be51b567b9384721272ac971948c42fd1c1f6b2e3bb28224edd2ab40f987e1307542008eabd595ff2bc483bbf4e5f15975cc87161a0c097ad9e8746e74e53f04e43daed29c760f82614f051cd0cf40e231d6e3f758c925cd04c548dda48fdbd6da384b1d6294d5ddd9de6486100431ec1b2afe4cf467ca55cc3f852c0af9ce2c654ea4c449b7d927160fc95c81e0ffb7e877f00bb6f8252cb10d9fde0a8dcdd3892f55f3c1c0811b6d5356584b45f7a6646321021dbc2c0d0e02b8d40c584bfeba8048a6ba51f0eaebcd999dec93c8a66009a41e0f458fd09287399f049977e19643fd1be8abc8dbc8d78a62e476dd06e4e4625dac19fb93e34474ceb8f90f8822b6364d5c5996a4e66ecc485a829cb340512740121b5d371c011264fa364472ca52b232a7dd0fd2c4454f7aa45e4223d351167530c515f95f01f6b738a95caacedfbc8ca26368287c3828b46d5a88e27b5db4fc3eac83a02a50370cdc68b2dea9fd187b6f90ae3038f898f84d4dc6008e0c7850db6ecc1cc16e2b158fb87c420b2010ca27d7ef0df0f741a70893b533f549257eb4845e929454bf74d21edf994b6a0a0196e17f65e11083f1ef53a52b2aa65dcc1ccd69d8b4b22c60036e30cf8d35c83c92041319f5936a1a89c65ca812b5ac6220404d65419cd6bd2fd71c6a38b5aa1e0fde464d2b951fa2948567a072eeb092efcb6c1de060395c76da23d0fd4bfbc883b6e8227d5f992b1148d71f904ae56989bb632b5e9c4338055683da631a9ce5ca0d66dadbd6a0529506f543abc1537b1ca5542018c53c769ee54aefd14275fd079200ae544b802dc362c43a0d89ae7d9106224f81a74c0fefac092ce5150dca221751dbb21cd83efba2fa81607c98493d62982039435794e4120444d9283f7e95a8d47e3d8ad6151c646c5324880c08d88af4289515a8986a7979174b536ac44b85b02e070b4a8c6e1ad161b6684dc4c3fba96bb9552fba0cd9b5a6350c29adf25b34a04197f8de463a5d35457c3cb78a4058eb473158984d31184dc5abf2d5dcff296543938b4857bd286b7cca559f6b629d1861e209d70cbb72d53e6ec2c8ff9f8f60c1e02b5a7108eb910903401525065c9a85aa61f391207711029e60b9c40cd1ee99dc01adaa300a857fabf36a9dc8477a7b8ba02bf3b30c31ae0d1b782aea7c149ff2c4570668834fcfb7db1c1e69fdfe3eefc43a849229d318d270c869fffe0ecac310a6cfc160eba5fc75deac1525ed401c2c702a397b98f1e1ca15bf6a4eb1af8a00cef472c56277530d1ac695cebe4f92737b2d7c48aaa81e639f683518d69d009576a68556edcb8feabdc1ee1189d1d7c3e9ea7438b514d754d02447227717ec75b2018f5a79f214548706fc0a542dda21e68c0c10230cd6a2941053512aaf05987866beb02aaa0b6d9703532f75d90591d6795c043f9a12a31da08b819c8b8620b82dc01b5a9ab64c69a9f691639d3dd3591c24bb9e651b6cb202ecbe8fd78edbaf9bf357e234f8331f234a013b839f4a18ea14b36568be843ea2efb695135536dac79444f57047d415fc1352f6ce61f3ff688a38daa1893b04bd11c624224410a8c2a9404860c9cb1ae0533d4139d9b0d6ac35ee348c8fd16ad51bf0880782137f905466a65ab4d73a75e55c2344e822e2e267e9e0aecd955d070985bb3bd6c75d6ef35fe4d6637f815674ba707cb5fb6bdcadaefce24d928679be12ded178c68ee6e1f5172ba920051226fb7929574c4688267b8131d3f7ed5637f494716fe60a670fa0f38f8b422cbc750eb79183e254973b6227cd9ebcce461224d2c77ca3e3284590a9db6c413b83f1c845c3ee6a6f9970f978d4ca165d59b17af159f94a88db33cd6158755963b039d5d9b10b15ed4925831fb316a7cd09d2f472d5a9247975991e734a64eb3a753259adcd05ffb96424732891e86fbe4712e5a6edc35ec95af6fbad29edbf30cac56810bbf43a76200b70e8ab17556469355d3af1ab68fd3548a4bfbe20ad68154fd004387904f90c53921f35bd5bb7c8a7236816cb00aa4a43eaf684eb1c3cdd0a2e91ab63fa73ab04e699f2490ecd4d0e894d008e76d5e1a15746a94dd4a318fbacf487c2918befe27b22e35ae653060a58c966a37fa331fc952bf6b466107ae5ea98f0eefff7246e1f62f8957a5a2ab5c0e58e99152ea0df89378514a04ca0324437f49f4a4721bbbe3b7390c573f23ba2615cd32e7c096969443c4b5e6e06773ee37624b5223550cb4d0ad6ee83152d90afb5f5caedfe8be5f6601b83ff8cc5fb3b5f151c85f8ce52fd08773bf0f92a3b6a2d65c0c99df8ceac445026a8600d3d5b1d9a20415a8462b2f6b3c0549ded09a265e2c0f50053279b84415d9b0e56cc4ae6c582b9252ae85dc17c03aaa8a76e58e1049916cad15b556aae6345618c999abd03a60b62a0da54e73f0d62d2e145d3a1e5dd0bbc011b93d0acc824e79b4fbb4b6c38d2103d11cc5ace1bdcddf329cf01290b0db80f2dd7b7b0ff0130df1aa5c025a4dac2f3d1eea9f8f27e0060666b9a923fd1ecf0fe718d8a603e4ea84fd0298ef306ae131ad89b512c198b2f4f97cfffc303282859d804c8534fabc49ff933982bbc92f181039a53783dce9e6317e586bc1b631c096636de9f164ff249441da360831f615045022ec3544eed0fa5d41cc706f10ff1d28aa0f13e9bf53acfcd342a3ca3f51ebb2a316a875f89e9831c2364758d8bec11c4ae9a944c88403e200d635d8bfa3285afcc22d382dab960cfaae8bf656a2a6545441ad19a51d0794c01c0f3538b7c72091ba4658205b9c880ad918a45d094293a1ef00c75b10450a0dad0a880e83c49102737f1bc6cdb1dd848d9d3e43981010518e77d65370845a9d326a0442b3f0ecbf8a8229966e027809c870e47edb23747e88680206e27eba26f4789d222970892a3dde3ba95b5d8b0c48fbd298b8769cd072b46c728aa35d720a84e82593910c015ef3325d03450c8a827fabc912bb4366a20597468b0a04896e22d2cd7b3f92bef68b569a3bf772158e9854c0389151007bbce3b0b7997da3706437a66eb5aac43bfc9dc8cd421276b8fac33539f7c52c4792796758ccac36adabdecd46acdb4e47da2213eea575909bf2fd60efbbdc622a88bc98f81de4abb058920d832b5c26844a8d096dbaf8e09ac83cc07747e86c5c787bc9c5da5b623da3a995acfbc537942bf11a6ecf4f2857d5edc8b98444797bda9d155a07fb0f5e380570e6b85a3ee76fd03682880615228fab92923b6a55398990604dec6452a8489b8130e74f31c6babed9ddf5b0e0e3b6c765cbe552e86c4c248b7e377df61824a66544702984076579821c9851e9184978c185d2ecc761e83a34faaef4a194f4f4beb36dfe21edaf8b38ce8040dc75e4e021f7713710ea8945772f89c8ed09b683368786fba545d8376c05c9ac89310442d0a2e75489b9958d4ffc7db54a327b1949bc7237683fa38bdb6c3858ae9cc10d7278e34aa0c226dfaf8de4dc21faf84f2d7474f563de471bc9b50745f345a88ccd066689ab990bcfbc89f98fe4c30460be5d79a9ae210cf71903d8e0996b558326d01051fd9c78645eac9fb40a10deba6d24b06e999c42af004d60a54399e37edddec0b7681979d2ead1100bd6e130038ee5fc18fa62ecf56ea793e8593f846a7d39784df39f6e9d199e0b927f72701089bd90954466e0dcc28625c3d38385a5c23a8c23637496227e6f8b3e16dc9524626526bd0dc84a8aeb4b5b7f45420e76f66c3d179bdcb37dd65e17d690a142282aba3acdedc5033bf555bceef220616aa6b618e3a2b9ac75f4517396dc29709af199bdd1a0d730ad578e8a72b4411897e924da49661dc322cc599e507b797e73a2d168de076e92bdf7b9cbd31254330619fb75261359a769f032aed12b5f6c1b1c47d0e85aed79056cda45146eaa673be38283049eb20f25a70e05f7e34fd403913dc9d80a3e482b102c2396b7735c78babe087255b7d91a674ad144629c122d1ab6d50afdc4b97b42499e8f2373f1eee0a47e7bb3af7e89f13cfb0e152d22b4efe8ff68949d8ceec2ed1bf3c7b4c25bc0525708fdfccd94f8fb321277291d57ed7f513ebce24d81b5fa1306b57ba6cee632ea3b38a53e969fa616fa8aabc62540d0672d0552412bca4e481920c13a7b63956153cb26ac2b3d62655d494410d92bb449c3c23bbb00bf33db05b22f3697391ec0361e1fc35e6d7cb665e16f1926d0822600a96d4564b0d185cd3cb5a1a428082bcb027e1bf52d5e5e45222aa5eeb804f3e9c4d8ef301a4eef44166aeaa559b3aaa8acb853ddb4d4d5e8f314fa01228bd8a7db5c9a783078ce03c5311dfc93bdbec141942946d48063952802d8d18813015eb38d037d3313c5be0be4c4a45378661556a39ec5ce5e766080c0f46e42b55399855ba114a147b6392dcc5c0362df29e8a36c9ee2d7ee7b8927cd5d28237f61455d4a5599733ad57d1793174936687e6155c72a99a8a0550016cadbfa2d40c74b284547e24a92d7e668718e3e8ad24f2484de4772dd90e1039e75f8af6ab185324d7d85f0037de27958851084ef5c9a8c00e41f88a2422145064020e02ad408fb2a3c3e761757e20241a09d67600167cc5d8ba932144937e4fedc94ea6a513158556d4100c24f834a5695b6aaed97c0e2d8757859dc27ee93973a93e5be27c44ef2c8928c55fe21f136deaf865d524df04cb367102f2f0687074ad3a61061e81f8494b9f246aafa8df3803080af09b57cdb151895d2f0429b564e04e69cf2adbd487059cfbeb8ad731f2ed6df03aef5dac7b8d54efdec49b7c9c9d2b5eebd7055676fb8d46b1f6ed5d96f7061a75e4efb644cdaf6503d31c7617e958ed455861526ece20ee8a28e5d975042c23fdc1d074ee192eed560bf754ae232cb3315f62b6066179ea4ff583d795765dc9722a80f9c48ed1f01b83d92d60047fbaffc382895480f30c5d89adc941dcf1e74f16557edbc06042dfa469dcffafceecfaf73c5f0cf8de70fb72ed0396667a113bdd2bda9ee5af7886d2d1d1af076d57527661c3648f44f63a04e99786828e13f8d403b31e3b041a27f1a0375cac4434309ff6904da8919870d12fdd318a853261e1a4af84f23d04ecc386c90e89fc6409d32f1d050c27f1a817662c6618344ff3406ea948937142af70490a6ffa7a14050f997cb64b532a45187ae01245c73cd89eca3f29cd857398487564aab3804b4576fe018e519a81c235026901728019ac29343290643cd5d3fa2b25c3e37d0f540abaf0599b1b3d0b7ee961596db126bd1b5dcac55169715d3426fdd2d2bae52ce1e2acf7a10fd715fd74e26d1504e97d61b56a1dc638188b0db2500e394b758a1930495dda59f3262a2ebae40ee01fda06e131ae7510d44431bb3c9d5d79c2a867293cb8f25aec988f992d0582139683d6750d4008ddc346991c44c50b0208be102a45d189ef53fae9e31aeefc4c093359063234e1da3d310a55e5e48724ba64918ca6a1cf3cf16fb9f9658452570ca47335931226a21492f505985501e3f82384c27fc16a3089515b40943b3cd4c3f9dc3818806c79a128d34b54632f0845907b6ef84cfaba4112207470cf27a9cba35784103ad7a4d3e88bac7c4c94dc71d3f3893d96bdb27cf93678758a9563d51eee807b4886a81a5f03775a1f6d29366a273344b39a32e4b28a1fb99af4570462ffdacb07fee52b6f8041b7dee479d78b9d630b3e7a64d2c57756f68e138a585b20e1df9ebc9b08b68e96c4f38750d5596e9afdf26c241433dcacffa1bcc9d614e1ae876487e5be92c257e6ff75c1cded8857bedbc720d4317717400d93a0c456b37b426382d0e0ef26efdc71ea18d03a25199c6a5213636892f39ac0dd2af4cca68a710e2c4da4f9bb21f88d2a086f4af0cd40a94b0d939f36d10aa0a2677c6ba927d181bd9948bb9a68dc3df7492d9287ab67ba303ecf4587a3dc4b579ad5c2f664d0444fc9decc034d2fec6eb3cb55e0057dd2d543900f6bcfd34692e057b1f6bb9640d66c3046729deac63dfc921f5b5f9d7db2630f9e864c9fd97a12cda7959330367666ffa45ec3dbb4774bc37b69a0c41429c4db849fb6a139ab00df79825ca3e9ccde196fd1cee71c6590038cb217fb2e6686dfc633929fd4021f37d5ff07840585896bd4c9acea46eb2914330e8b4e12cedf825c4532707691e4c4e9cf65c6282f83c8b3710b4bc7189ac61099c59548f402de990bd4bbfad37a511cfef2cdce8d66cb11d80bac03ea4e4506f58eccb9abb5c588d7aa73b279a96f4448631c0d8c5c949669497aaff9f49bf4945227e71325287c34be4c80947423b0b8c8a44c2c3660e86193275d1149fdf1d59831023cbbbd9fdc73539704a94d0d2327abf5f1869e3ec2786d099631c0761d6389026f54f56454daea052692fa738f03ad76deaf52dca000b48779f84632eb33c4167168345e5dc1162693e20875b82e10f7844bd79379af10eea7b77b921bb6d81205dfb7ce41505f6841c577327991cd53409e23251c92b5454da1b4320ecb91a08e75e3f9234be0ad562ac0f33a2a0d419c302e84a6273a8b99a57a8f3d573795b8ba81e584a60a2fe356ae8b676c273775d4b8a3b58889d6ec5cd0352d94d58d0fc316b02593ee9106dba35f242104a3f6c34c713963474e989df3e5e6f57615327808633598f18d3331e152d327ddd3493f439eca3f6b8d5e2789fb42b7d348360d03a9d5c2d6475005178368ef4210b8a71c0d626dc931c4c8febd555631c443f557094d23a0268db45322df8ec653dc266d2b172c90105be64dbfb304f3baa047a4c93e3c4403e87caaa0c581a151b0c5f2732ca73e30409f94a43d1280e29218389fc439d971769032182147ba792a1b30d1e9d90fd0499a100b594310952f21f2986aa40781c7a10d1b1dd059462a51e478c469fdac9a87cb167d34c34607742466e13c6d2fa3b210beff499d3f41038629cfa776b00ac2b7a22a0e4d7be19781305523c181eb8a7559096075f5607f2307c8c880908aa1021c718f10fdebce5a4265f9ff02caa3410733192a612f82314e051985dadc3a56c3d615a4b2a90a550c27a6284d87f712042e5fb5b859424ed5dfa94f300a8dc3acb7edafbb1322fcfb8d4d67822ffae7ae3393e6ea1daa2f84ac780de86ffa12a441f9465dab7694f620a3b478b4a0c13be2c1b3f3c01a9d29ae46450c519c9f94c97dae83a9bcdcd01a80927e2760edf349fe023973e737e032c825f88045ed7e58144cef9ff16f4566696ddf0c9779e342d5acdf03983852bd84017abbd49292a6910ac26f7dcc7f50dd0a57cb840db20ff960e7daff39d00fe0782cb1af6fe058475457c037cdb4e3b137f0692290b6bd02a809a082f8accd7685e533b8ddbc53ef08f518b3793f308c21e0a3b1ee0e65d1457bcfe801c9b87df7167f67c0b37df5bbc3e219fa09fa3f84e8bc15a00bec7c6a230e88225a316c8eada5be67ab38334adcbc9c2042bb44e22ad202bd790ed78606e12584e66d5c9214f59e397a1068f1d4004eab19010e2bfb024f223a7fb7afb471dc27595f05fa7357ead82dcec8277218aa63ba200fd4f1203f465bafc0a2b2a94401e547ac3754327fa0ce90cd6a520b605d89b0533308047c374794bf80220c94d0105fb1c09488ff37d7812a5ee4dc759f177b1d4c2913c144e235d0cf0fdddb6efbe27709eb5447d0b0d6a9ddb724a7071560f8e5a0c04f9f8964e47375ddbaa365849b66949072b700171af76da50558368c47d604a3eb67965e315edb6baab7cf7c606a7c05253a5dbe0ccc1004eee8105232454fe53fc5a8119040dcc309d92584d76fee0b1ae3066f823b5f5c62a4efa0a642597bc465bc0a47dbb90f76b41465aa0cf965ff4cff405672a28df124cdbe8e8b19a6070683a6d1bad63bd6b8a66a50b08722cc0056abfbff8db2bff614aa4020beba67f178849f14d8e0f6ad7e284ef435314524631d87ae4693b586902bfc3b5b7c83554c31cb69cc65ddc1892938a89a4ca4d49c534831cc4f16403ab3fbc73fed0aac280815e0957630d3ebe46867ceb43e9c763d4bb38ae754b5c7ac4f70632fec096bed48b90645ea183beaa9f2ac5fa7bc0c68b378dc7e9fa5764283a5974b058e1e8e189d00f49352fd2106963a5ae4c77c7249420562ad2197d5617b1c5349750acf17854af8c05e988444f2aef0e0a9d1c762e6778f66c3a642144b8628d86572ead4896e8733b5f52a6b8e500aa84002de274864505cf8b533471062ea1b0212c9d195ba56c229134950309361ffc238931e3141136f303fce8857a0b164410291acfeb440cae847220928ee89824e47cf5e4088ffe790138313bc7ca22ca5bf8b01700ab2f6fa13e54423051280d7506f28cc38a32801ef494d4c67008092227c53a84d1e7ee529e2ab865680d5b8a47bdf3eb44f788257056ca9fadfb4ee74666913325e8495aaf1a8c3e7ae116d8c570aeb36e2f73d4f4be22799333840cf46ea88d68b212f94021c129a9a652c932aa077f1d99804302c237b111c1ec8c827f0242f6484bac13b4fd3fbadb9a474a01e59465a93d80e5af5b944bf8f00450d3d60496e04b977afe860f2b802ab59e200439e974e54805a83389f9cfef76588deecc7df0069e7055800b65b96b864770ae37da2ab9c7451dc260b40e46214a952683eb69527252668a35d34504243188d0d63ffc0379f8b1ff5f46f0437d860d7b41f416c4a56b818a8b5fdf1eebfb21b52bf32d9242d22e54b64b4df9b8c9d601b72d80dc47f3031b16702c892f9f867aed059dbbf7e9ddb41c6fdd98565d43374b2685931f997b3f0cc75d95da7372f4b19e1833efae29b67559bcb2eb8f60baa150ea387634695b20de77cf8ca9a51ea1a3890461b7b55543898e0d05d023bf5387d48599e5274068a2b2973a017a83faaee06f0099b320f34d7f501027146f8baf3f5bf2a03d496fe23df68ca81f8d23706fad015015be92a3ae25de1b272385420ab18832ec21c9356fd36876ec0d4c4998046406579a5812f546f29c15702d7f1769bc5bfc35c6f1f97dfa37349e94cd2012d4cbd110e53c2ad5c9f6b50780d74dd43234255e60174709db0f3333db225f1b0d62804bf225c2c1ff4eb19d3baf4b9be613da30d8e4704f66bf09d45bf16ad04c07748ef3d09e4964773c5b327370a2dacbf65a49f84b77a0a031ac71f0418316ab0b9d8f63857471984a0eb52a1412aa3964cefdb6f6f6bc02b59881757a56ed13b02e72119bdd655f880e6ccc32bb9704a5dc106e92a5c0554c111a6366415fcd29d2068853ec1359ab815e158f5ec33732a3ef7e5b9ce847a970158d9328836e8b33ceb457d151540f562f7d200eeb6bbbebf5844bf7a471b3630abee77af54b18fa95648023bd5dadc1a06bdd59a89717cbf5f4f87be3bfe48933b27df46f7704523d1f9d40ca4f320227910606cbc0735f12eaf53793d9bf4ffe8cf9fcb3be7e19ba2a06c7044f405be8fe85df92d1d34a005ca1f4449bfde8806f0ae215307f5ce8a5903bc23668fba5c2a6a9e90a2bf20d0cbd30f5d736eb1b3f61f8652e1d0ec960e70ea580d8ff830d05685264442a5dbd2c13e27d4d6ff1251ff5d14584b1308513ec94482be46231ffb3e75580e68422ba7729f210cc2445550c2cb6964b37604f4699046a0e08f3428fefd3f00c975601ee6033491c9b599b1c1f9aa75309d36cc008a1c00ee2834d7bac94dec9ff1dc8efef61e58f06aec4cbd9a75fe7c85377cff86bee81c0e3eb192706451ababd3810b9d51282c0269c613424e4bc526ae70d0c70844729b013751e54fc66efb79ef11b12a9d43454708b2198453303f06dd172ce2dfd03afda26e3c5b1d9346ba8e6c88f19c5f08089947ff194cacf12baab1583321c7ea8fa9b291d98e6824f24255c58abc653953e68b467afc14806a97853dbe9a437129281cd9058fb3248ef21b1b70f1894204e18383349c4180e42d7b40ce3023ede7e72c0cf49b31ed007929a680d63fb4ae9f909c2d963e328b5dc82ce29608b1f89e876ad2652633186552f136f88f6beb17929b400716b4c8aa05c134bb135b937f52838919b22e69f063ac3dda733b64cc22c0ffb6310565230f5866570b548ce89c3f036ac7afa7e84718424956c29c307167c068623560e7a9459c4afe08508b3201ee470b0c8b0425dfd68b87b713cf5243108153330767496be0aa4adf09baf6ed9648dbfb33e79190458c435d3df7824c375063099d7bd961afec55ef9ff60d2650af7ebb5595e5094bd9a3a340e0a587d624b2437a1f917921c9612ccb93ebb91e46b923af578575a204afed8db785deae294726e331afb953e6f24d7c76381be6923ab1b0834bb2e6fceb2193d3d0776dd73f2e8f5f2d3adc04a129df6b9a3ddf554c248274cbdac23e814b4bd488dc4c360b4dfbc6dd05be3c82ecfd9319063da9f5e271ce4fc3933e8427fe719c1e3560a531653de8408731bb8b9ae18731b60c0429c5aab9932e68d391d4a681e6c1b99d87038999fecd11278f56b50d4d0c7ff69a1934d78c237242f49673993742bafe1062eca70385675b8ce84f83870484db292b00d4c163eb8dc99d29757f593b22e80fe74cb78873e7ef5d8bdee493388485412e24f7b301a51b0d581292634f25224cd1bfd26b9de45af7e7b182dc695907b808f05af977a97070efd63a92b80565eb1893d35b38035b61095e95462d04a294b6fb368b4903570d56f6c4180417de070fc86ae7f13b4572009cbc06702d6ef18b256ffe8f28a7ca63b8b51ab73152b9fdc2019aeeca69e129162ffe70a8e93a2d5bd3cedbfb2e1ece5e2aaaf51bfc9e5ff118a6492ebeaee0524c4fe8a634fcbadfcf5911aee6870ddfe9a9dbc91e4f0cc0228d626506d4112be78ce76c7f082dd30926b668cd2463c3ee7f4c8e886e1b7784b9b9c64842339c7980014049aa65e140fed89c33eb30615851b32b41a027d8667d84390f7b2e61e07419f6eec5029191d3434cc9cda99ad99961ad9d802c9d6e205b602974445674924a2d9fe0c9170b48d59147cfc57a0ae3b6d744381ab2d0cbb6f33a230e266fe34e2aecfa40550614f3df6a1cc9a702470d089d4a925fd3d6813c52ef7b8bd03e72882dcc0913f74dfc8c1aa3164e396436fc861e55ad8c36433e97143a56fc868409fe0b281786d84cde71e0ad141893d21fc42745467d486c6fda577eb9c51354488f666f4f05e5c80ec44a306c8d2926e2a4c8673cfc2403dccdd10cde6f3033a7e268195c1c075c3aaa5b00221acf25a8866485e85eb8b432776a5abbad0079ce7678fc26803113d5af6bca86ff0384b5051b441e807a13740786b61afb41873423441965e685bf585ebd9290fadc90364e39343b4996fe8240f15c5d543dcd0c6f8ddf79428764349b528f46d7f643991b555d4542b278b789a3f7446b295f639a322f57705a8358a8e2f400077c0f863855ed123a417088a5b8eb648ede71ff215ab25789fbfaa958570c3be90e4bb8b64d4de0632a32a6a0f7df4e03eb35611aaad09582f672fb7e612b2df61d1a47d3d5bc9e1e8a9819b2032dacb679d225cab7df6bf0523c7987d8b504315ed01d3a45e864899ea24a32ff195ae5fa4514267885b89f08eff48aba70b981bb7d31ac913154ca405832652d6541a48d0f6e133557450e29c00fba0b50724d5156150bf3b57cda53847f326a40513d30caa0452e2ce88dc88da3944143412df78298a589422e3a27c3dead8268d6920c74404c4d4ab7c360a8c3bdc072f377a30e1e89bec1d83345855a6cbddb12ff22d81af2529fc9cb09907b97489dc26bc9689c7929b9d89db566bc7d2b0cb6269228329be6f5c7bab0a9c1d3370b974d547bea7b1638b26b2731debaff9e9435bd3a70b23dc103de933194782a44d3adba3d66c3bb47d9af847b1470de490e0fb3aefaf96283c5996a84b9fbb1471d96be072b0533203676c3253dd4c2043baef850bc8ae121e94b7e08e471ae5c9fc974b61a1924902771f657dcc91cabe0039a3b89d481588acb7a0684996e62f7536f2896601205d4a670ad3d2f4f7f4265a773ce2bd5bb9e1060f1437a6960bcb76e56f4cb8fe752f1bcadde1c7fc5927d7799fb75ccbf14e80a606695e4616215289f9fe928599221062c799bb148431a99ffd0f0dbce5c03ac3250b512d885f1fdcde663ac716cd77b62ef588851f33c38314f1ec959a0c91e7a77e7288c2adcdc4295cd4073b6d7cae4e25bd80670acf70f1f1975cad51d07c77a5b195197bf46e6fc9dc92c60e030fb0b9099a16e9ca6819766df64923f6cf4cd18ea2f200fc00826e568ad0401c981791d215902a8b170dcdc4b94746d971dd2d10e057d387d678c6bd1c0fdd22d25c60225a86e1d0ff7aeb73ddeb7feea484cf38043c9d8bc0adf6f1f1338f54ff9fe442a14f6823e4db616661925915e8611b828ebf421abb6c0ca07dc612c0e6addd971f253aa7139e07abfba039b21eb32f4644ec61720085d07c1cc80ecf7358b044c9b7a6a8e4aef88b8ceb1b2adc0c54fada3b5a5065b880bf017a5a418a4e68c0dbf293cf9db674ebfed48d79dcaa94716a62b3c639613ab052b7255d3d09b353a209c6621da317d072c37319e9c8410f986523a58cc21610b81992b95cff5a9d28f9c504f29c4b2dd5690b9c9c2f9931cc1266a3e60583c6088f627fa2408ab0a12044e526b32f5e7f4f895add90886fb584699c877b541bc4cf7ff93587799440c0f93b9cf58395112e70782219be666e6ea151eecfe92cc701d2fde33b2e8690f85e68be5e7a959ef8f160761cc106cd2cda24799e30c753b83cf432667e7b89a4d6c046feffc54802990aa464019eb19c2b5c81f649705c869a0cbc6a90bf1291609768990d725ead144c34764c717abb8c030ada40238035d77433a9b4250e05392791a373ffc2016a17d0eb7e251449688a3d4e965de7e9e0a3eb4131f55a69a4476765465fb9a96206d94bc7badb00285b829e2b883a333681fcc64995ea2ee094017938990595de7602586fb4a06c0360899f2bbc82f8ff216f34b6e4129c10988d7242e66a0e5bcbeae00341cd639dd50ba038c466b075d8ddd4a18392e0da291d799d65b3b46363e73823250ea9b89b834cb270304915fbcbf03ff01f87717d0ecb2fc174219e53cb006754acebd98ae6b50cf25e72c5d2d935782f34c9314ce130a4ba7ea500aaeec957dbab5adab4f1de1d52b7cc6ee82a6f8901348cb45e628feb42c3e8170a8b25ffc04bf4cd70a388889fff238e612446fbac18fc861b3c5172647f7894659a8d026977caf540e685dbb2aea0a982abe8c7a3047de55d98ac3b76f37c4e0024fa5be2e6eb0810c6ab2ffeedb0a7fb345e873005d8152633400341c6745bf1595fdb55b80494d2410c46f14ea93436f8b2509a4c41342e59bb0b6bd9274c2a2c27adc5bd488f798a2fd5fbc5810105328c647e0519c60e4ea30af901d04ec386af46f66ea45923c9be607685cd1bad650bcec24cee170f89b96a89ac2f0e20d8f060a6bbca21cf5d83b416d25a1169bd948926ce12ac87602f586c2e6b91caf39f74cfe2eef5553a141718bfc30593b55301f3e2422fad34f3f91036e78b926025269351946deb1790ee648a86b8a9397229c22d527be3aebfb5a227a88d77c988e6b524018bcd928419eebaf218d3717388fb3bd59394c360dbce875373bc13183c39f949ae73884a68375b04ce5f6df09ca00db3f9a69cd7f9583a6e7ebd0efca3c1c7eabc6abd3f30540c8238448b057733b9297194630572f9d6c1988f21980ab22c6b6ee34017283457803ea1ef523078d0cc32f5fc0ceb693384499a62ec4503d28d56d9f09c7b16ed09391f7d10af2de788de586cf01e86e71b956144b5de29636efb42be3bd5baf1f274f74eaaafe0bca9e04122366b9967f716b4f1980124c37973ccd5ac0d7ebfd24ddaa796aaa868611ed46d0c834c634ce652411bc3fefd6f32c1f4569051b68080d7703c532f12e8c3e3f218ebbb81f817b89e7dde515581fc8b3c21f86403862fc4222f570fde6dd7884709fba8da155fd0fdac0739b075b573ee92589018bd4121b0ebef575ab90ff81c924445217c9687d1984da5cd858c177ec6fb729368836d36e34414616470fbd829417a6aa0d6eee0ed43a45724595e28389dcda238d6a029b97c4c722ce95d440949b89f4767ee4368de60b6a2cd3af4adcf6abfc3141592f20b08fa93f4266cb65e3ef4c73eabe4c014fe9f94b01d2bad4db6fd9f3070b443bf2305c86861626c3dba0209f51d822393476b9e706985ec1f81cec48fe32278b2fdab6f16bebe93bd37a0917eaf1300824a101b6de7232140516176f2e241449c74d3521a0b8f443123247269a4caab5d585b93c1c3419ba59509fd6bbf101a68553e15b771f8d2f5172ebe72f8e28c7c82855a858e3fa1c0c576e00376e5832584f7601342c10411392e6e2bd896195eb602820285ccf8056473230456fbd08b550b151e768639183f5d241c745b98aaae4a30129feda2391bdb59583050300cfd39b13e0ac5485081542be9adc906e83dd41f563e1a5eca3e8a9badd64535aceb8ca42694c7d71af485571028bff08d23f71e43c162bf288d4fc7d2accf97cbc99f7b75e9bfc4157accea098c6a74e48be33fa05cb71088200a792edf045651be6db91310f6791efe4507590af14f20f9f587fcf93772f4a56468dc52b03c1aedcec294126ed9a0a93fc833b4dfdf5dd3692c7a123181198397614e4a1ea0d14ec89908d21bbc6fc61f4c0f90cf8379b12c8ad217cd98dbbd7383fc854564ba03214c2fb54a63d86c48486e904040729abd26453e2abb7a49e64f8ae4d59a01fb8c42f8984c259a7d2a942a1c897d5c146993066b72eb07228f2670d85fa9b0624ed39d2eedeb705c065652005c10a971df690fb4f28bb87a9dd3ecd2125772da9bc569acbbc149ecacf7194fc457b017777befcdce86637be8c07108e149027624d5a152427c1c503d4d8c2f1332fc1bc98e883fe3a9c269ee4647acd306d04f4ae80f99f1a79de6bc05c6a4e61aaa93a851398b67ff0677a1f0ff0d35174822148ee77cbd43e3108126ff29e988b66b78d8e7264cdd9ef88c5dd322c72da500a07f8dcbb54369840d14dfe7d21658a5de887bcdb5c6337c218fa4efe67c1a3b58830ff5d4414c58e1443dc93cc8a2a79e4f07a3d7e25f6869a926c051c5242f3dc2214360cfe65fd8590687770fbb7712a9c0b9b3e231ecc077be681c5343593fe431f0a898d908cfd1bbe9f9cc473def0abaf5b2b198185dda83f9ed132e57994e17624ddfe7b036540a2fdaf422325a9b6941d39f2e8d7a56d86ec4937365d83c86027e833540179db9717a408dfac4edd7524312e74e71faf10f538824ba3ce57d6b91ded36c1c057a093dec847fcaf6045465c72d83cea6955c7bc34b366c349f2881023e0162a4af1427ee25f69a8d955c248a18db7ca76a86d312ae0c24f54388807459f8b2ee2bfdc017cac5eaeb552c8b91df0be44a24856f2b827a1e4db8404c0be5da1f36029f75f11e1b419737a04bc9ea46c08ebd102b246d1ff9a4a05ff229255c5fbddf521a6ae9c793a0c0586e14404e086cc7f120df9c0d4fc7c4ea12e2707329f2f15ce0bebe249d6e3eae61011773b6601a7139ff3f8c45af17753e85b01a611e366a59d351008a25be815385ec00150085fcd5c0f6bb645c248ed47c5e81752813e1349831df03754c837041f1f7614e199705b80fa3e28163c45e04eadfc68f56201c16a5035dc279f2724a8e0beec8358352f6f8983c21c7354bc971820a9d318fa73efef214229c5cb02e080028c828fb6c34fbcf32439d18f83b4f71b36304d80f7211c6a947b3259f1049c8de726fb9a59432a5147c08c408d508f4af8f25cc66369b19f6594b1152a985639dcce23cbe5b5f92fccb6aefaf69da6b6e83d21eba8d494713baa8677333bbf93a94896b267ce54f9d5cfacd5dd763f570951823175d1e2e925cb4dddca08098b4a00279938cfeeb9f67e36f8af18b3c9b1b7c15df67c7efaab41a6ca1ea9b0fe6924b49eed6c7dfe87a501c6b89daf7721cbf2159cff29aa1cb874b41f937d771164bae11f748dfce87b2d882bc0f318dbf6541ed54908821d17520cf6a514c95d7d80aaf5c8150e64a9622655e6361cebe64f79c3ea70e256a575131da53a13db399cd6caa5437cb78e44792ff953dc6f1cc89a58660af7d10ecda5ef3c73827655986659836ea39e29a09bb4ac29f5c3783511987703cf3b5a753cb3ec835e96f9f699c7cba699af6a78b39515175063960506641e1d71f7d8e30eae86f8c341e29fd29373fe3307bf9bc6e609406790fb3af1f24fb5aa9f336f2b9230e89dfcd4ea07b50fa94bb3ee3d806342a940c79d4d109fa68d4a8dce66771cba8e6cccf9f25e4f1bb9ebffd66be1eb672999b5099552d5cb3831fe55428787b32d3644c3f7b1fa8e5b77a1f4efc6c9460cf6f1529bf15912598bdd98159d2670928cbf0684f5b43515abbd4fd4a4adb37fbe46c0f3384da4ede0a85447532faae76f79c3d4918d6b9ffd49ce081ff30dbf5c560a6d4ecfddd09b6e11f32d7df999cde7f6a90c5afa4e0ba1397f7c9494597df39bd8b55f224be92b9737a9777b14afead6086509d58711412150a74260ee4aa2791889637fdf5bda518e0f2a7df71b1fc56d1eeb4d836597eab2b3a134fa8ce04080b35f3c7795837b92484a511ff6573d68a42fd4b39ff7d14c297bee4b2a71c7b9600be723ece63f8de10e8e41e1f27f7fde39cc7bfbd6f8c4b32d0b1ee9b50888f3d25c52b5ef18a57ace95851072e985ced33bff2ba2ed25f30fb11c96196fdf5937e6f4f4793729cf9b8f1318e273eec1b6366c3f3e3ccc5628cff62743ae94f8637fb96d9f47b653e80f05f2cc22d87ebce971c5f9c073b0df8dc6bf29c6bcc29454a940bff65dfdf1976710f733cefdd1fcc61080f5bbe36a0511f7663ed5198a8f7aeefeeeeeeeea63e8417cd709525421d0650e754dc2c7b9c476911173372719dcfede6634f33ae9ba9255fb9bbd32a5e48b9a1da27d92df39175ac2c7bceba69a4884bbb2234ce486bc0675e8fe358d73373e7c49146c530cb03bf1fa2defc405bfe99e5c5cbd0361cf2d65883e1d3008b993115b3fc062a9b29655fdfd7bbaeebba6cc7ff31f0bf155c3fafebba5e22798d051ac4852d1f754979cd38afc80d060ec27defbd7f6f00f7d98e7f32fff5f2e1c54cf3705ee420301428eabeeb675fdf17bf9f70c221b1ebf11f4a894c27e4bfa772803f3fababfa99e1b20cb7729dc65df44da71d0cd8dd5b400861cba8445fff629cb01b42f8de93b647bbd0ce2b627f7ceed81ffb79623711c3a7cc0ce364666638068490218490992184700819b8f1790af53d43092fa44299f9aff71e5ff2e13f66dba3dd687d0b0abf9ef81f5f486a55ebf6c38256d83abc8518a594524229a594dacf922aa594f25b83b5964a50ca8fd7251f46c8d6bb1e29d46203126be19d1cc6f7d278ef4d0ccbe8d3b6f7de7ba3510e2ed47e52331397eb7befcd96eeeeeef66ef7163f9d5a4e2e1a157e4a727ea38ee7e6e002f74313daefbde79e034b7dd2089b234129a9763b7c4d80b46572f9b99b39d0a8dd6bb28508e58441570e346a57e7d4a613d46b72f973a051e7dde06b5ba8dcefdc5c4bf4c508bfe7718ba9a5545b5a5a5a5a6c8c5aa6c8c105523b490c1264f646353b8cf29ad916a4e916a4b52d48cb96a3381ac1d168c415cb7c6a46bd19c37468534a398e3a9f2ca3daa633a3e3cc53674422d5089fea6adba84723861a19cd9ec58c2cb5d3ba07ff684422dddce003552aa9746682f89541e99c9886ffd4eeee1ec5878aebb6998c1e96729daa5eb785280821841042082184104208218410d6979779c908611e0c0c0c8c378f469dcf9dd32ae100a996341f2d2717f85cdcc5a55d6a2d954ca69696938b0b0c0caa64aaa76ef193e6e23d5d85ba41ddbcf84b47d8d2723ab9b8bcbcc0c0a0504cc4f231934a9d7298013375fe050655b5c7a9d44ba53cd513e694f254aa39a2361d1b5b900d885f9aea143f1b373ae5310f07cc1163e0bfe1ed0e3bc638e3c3b134f511f21e26ea546de72807b9e7cdf2bafef376adc554ed84c3dd5a6badf7ac3a39b620d79d4ce385da85da558d94e38c5ab52d54ff79491536ea7c68b716b2166c2c52089e50d3b6b59663ecbc88e7decabcea847aaf6364547db92f8de1199ef70c33c8512a07793b22aebfdfae88eb1600d27f3a6763bcdd6147ee6e38ea4e50fa3f4ec6ca0000cd29cbd020836a06cdb9ae46006832340d455c388396c30c1a66988135d50604763f0d9b4e7ca8d11093e34aa5ab4952ad740471fbdd61cf8e191a1e3d56ab1c66d46ee632777cafebeb1e983ab08cead0a16d3a74e8d0a16344d2a14347d55132b59c5c5e6050366ea46270e488e1390b001919669011eaf00e800df2baed88b86d77b80165ef57a3c7e8d1633c5d7ff8a89452c6e7a7db96a31694fd15f91755be8830ca6bc2399ff764794d4c6acc13cba80635ed796bcc19d5362923381a3def113f6b1b93f859da6844c5e5270941e1e4f2971c0a1334999eb7c9b360f125fe83250b962b4352be20923224a5d55074503fd14d2e7fec279a8963b9fcef0a8b61e5f2473180f0e12cc5c70d6df7f7208c124af9bc65fb7b10c6282f785dcffb8251caeb9a13cb60963defec9a189665946a1bdcb6e7bd6554d3b66d34225558ebf3ae4daa3048b7a905b6b43cef1693c67c62177e79d118060551a8e78dea9653907e81813030cf1b668e5239b8e54bbacc51a7017e1e59a0edfe9e0e8c51caeb9a139be2f26751e8f2675b1078a3938c524ddbb6113b33f3374722d5e64aee3d59abda92a945336d45ee73f721ae7f572ff7a862dec5e5e5a55fa2dfb6dd0f975d753ab9b868cd348c5250e40148fac2ae83c0976fe1f8d697285e9eb6d6f272499533327a669afabc912ac74d4ee32aec874fbbd14b4a8224526d12e47a2a473a526bfdd1f3f4cf3be2fae9db743448226d3fb249dedd2ce53620efb38f7cbbdf4726d2aab083145cc8279f5c9853caee760ca2a6fb4be802083bd5bd5e8ccc7def3b789fed2e192ec6dfa643310c4361ff1e8498cef5d2ff52c1ee51d9f0a20a3b80549853e8c218d4c24c5425e87711e87664b2591bbe5023d09d9fc520252213b73f3a61c274be849b0e865d5c4f14ea7e1fa3505f11842b2675d804fbf14658cdd876dbc37efbd108c346d8d68e1d21691949a3d9f6f388f6468af8b9a3ede9639f71479060dbc634dca3eb6e87776e3acffff59cae77cfc986147851052885e2bff72a47ffc72189d7fbbde9355ec4f381ee31683993448defddfd3e4aa10e227232a51018624e6fb29d4fbfa01bdf3d201bff9a10a0e55bbe7b4b947a5815d3ed62c4e0f2afd51dac397d37e5f3e348e5b031d60677c448af7173bc8db7dc9227473e85e39fd0b379ad160e2ee66f70f2dab0c10b35e65b3e478e989f3139622c175fcb9ddce0e0c5c1710ddd6bf26e0cc74c6323876557a538be7e73704cdcfe16ee2df194d06c707c6f707d71d81467a4889f1b63a3b0965ed735b2f136fe06c797b67683bbaee5f8ad38aec9756dc09c68dc7450a7d3a905e7cd59ab14325e8b7b52b837f4c24926aef28fa18adaf2d9bf70270f7ae15aae985a2f5ca999bc70958b5e38d28da18adab15eb8d18da18a8a8d5239cc7bfa794fb6d3c03dfd765db8938d9b8ee97a0f3bde02eb76ef31695d09baddeb5e4bbbdd6b5d7f42ddfd3ebe2734c471400509660c5e0a622b9d4f937b5989575627dcfe1195dbbff56bacc5eca702b8fd990cbcea9f4fdddd4916324de703475c77735977bec6752a14d756647cdf6c0523238a1c901a2a31f4c47dffe4c3a9fa8e0108b583d557a8eb3de45c3e6ff07d84efb14ed0ef6997ffd4fe4eae6aac66baf49a0723a51ec134e7b9e9bcee7e8ef17482b34ed89d22c4624e97569bbe7c9da7037c6c94ca01bbf11bda8905aad3ef357e2fac6be8737be0c297a398592979e4cf69595e2cad1c128dfc03028dd367bc46075771acb77aff9899398a1b70e084b82a8bf60607b5ab1927f3efbb5a4f11071d24040a70443ddc1420fe07490cea1610905f5d87b8ade44a1c6bd4be50c8b309e2adfca7c5ecf5348867c39895da16b2eee3ba7e0207164bc6da08a9914157c8b309026e41f84f715140ae4aa3c6b8cabb75c5008b35b4c0620d2d7c4ebb83035ff6e8d3def646ef4d22dc0d9179c30ff16cf811f11a29398b469f84dc54ec34155ef37cce9b1b300c635decf9d90c81794dc7566eb7aeb0582a151428592a5b612b3c704ec3fc542863dc78a4ef89f4efdde72cda3c33812ac88614120166034bed644bb6f8072b6be19038c85a31b72d8c904a06b5c301237471145d972dd982115205f190cca494d29fd86742c85c1efad953ec391246bff44478a0f448744ee99b57d83bf6d5624fc27eb44d6a996930ccd22771a38d592e52509142e644f258c628957d7ded312e05843ef67eb1fadaa732eb43b5fcb64ff9407a4a371e4699fb137e665976fd3402620d259c73fe9cdcc957de52460a2ba20aa431872378de42a15433d1fab8a11f867be15c386e698be1f042ed17638c40e2f7c76feb83e535310289792c53a992469b46b3b805890c055fd64743e135b365c6d4dc0021f4e136386fe5353f17e739518d2c4a9b2a95932b4e6477cbf750aabae137a7b9ea46daae0284da3950d740cf86675efb6b7fedafddaabc6b27b0e571bcc55b1509592ee51f5322e11f6ce565b952eaa857503bf9f433af70d65b3b16166592576592581b5ab1bd36a7a5d49580c027a703a327c203a347a2734656494f233ccb88eb0dc8c3a6b6e5706511853234dbd340f7ca220a572e86d9540e2d0467b93cd4a26c8c4df22ecfb4533bf98fe64f8a2da25c1ee2020aeaf210174137893fbdaeebca90f84de29727fbf933eb995db6c28be5663fbd66daf91deba3824eaf4912bf86b22ac6b7c135f4e3a3f807f6916edc67d943314d1673e5db60957c675e555bdf4a3e8a694ed7399eea441042256da7ba73ca784df6314654fde893a36da6df39bde9b7cdee98bec52a496ddff29c63b24a529b4d3180f4a6f7a1f42dd6644d9ae9495fa4c5d6b7f2233b2d6fb24ad8be558ac86894f2a173ea774eedaac93e490de1a128ce194d57693fff947132ae925faa248c9b97d41ce6400d35d418cd6dd239b1d7306cb451dbd90519522dd3304daba8cc4edbc1216d391ac11c63f48f9c105aa7fd7c6724906ba00df4d57b2417feec772a525099c185ef918a1454a0b85008ed42eb569bfdb2007f1ed13fcb87abdce74750fbca2e804c69232ee47018623deee2e7763da58be7357acaf5f721a609438d191a2282635096e962685dffd9d2aa4264adcb33ff720d4bedb216ebbae4a6ed627c4d8ada65ad3bff46e7b201614119436b8d2eba33b7bfb3b9fd0260026cdcc35bbedf470b57dfca33d2776338cea87d318cc4387e475c4742bdaae1ccddb698bbfd7c36a5dfb63fb94dfdba6d45b73e1bcd57fd9a97b8fa5cb9f932f78d5c324159a69b11e2ac7529b5d9634f318e4150fb66d9d3bc2feecb17c3b2d6ed4aa596205421a4509c5fa894887fc45c7f2a8582d4703bc3e2ceef4a465c8facdb36d5621a21d46e8654ebcef00324e666444ce33223ba7ea46f976ac13723640624cdabfbdb4a86d0e136914ec86dcbf2463ec61282753b2259276dc7c2b8e63a99db3fb6efaf1c8f38ed37cb2f6763b647664807a8484185c99d2d04b4d36a2c88c62b7aad7f8ff18687c76968a86e3c176a5f22b1efe338cb8d5cb3582fc345b75bdeddddf0f1ebf76c3d4d99e54291d6a1bc956b68d4f7dd83e25e335febda82c9cf24914ab5e53f6a94745d970ac1556ee7e3e4f268cf33814c4dfb89e38d6195a3d896511c2f12b7accad37ebe46e2fa6ed9b41d5719bdbf367aafd97e341a31a15a3bd1344dbbaa54a9a2b1d7506ab5694d25a8385ee4d9f8c8b0f814ab3f24a75508b5d0a497ccedac1bc55d671ab56f9d1910f9d1661188f617d771d10d46a5d65b10f91d0d968db0cdfe0bb5877527d62cedb5cc76ac5a327d878d9ebe892b71363612d7cc34d9c34dead01d26ac9bcb13b4fc28b310038acb59a811250b35a0b8f071de0684ab688fb6c64c13df134137b31a4a8ab8aadf0d214b6a2abecf1d822c182205e45df8457478a1cb1b908eabf473a11ba1477f9fcbcfdc4caadb4ee6f6a909e984693a47096a7fd741f20645b87fd9c3de85ba89f36f73475a67bebe81d30a656860a8ef27dc225eb9ce45ae7b7d6fb806855ae7ca04b58b64b065b649d4be26775df3c987a92190a7ed7d1cdf2b21a8b3ff3d2825bc384e2fee0879c955bfe7ad5f70c9f7de83ddcd85da17e7d9247e21f424d78596a7df7340297def3dd208e771abeb4b47a45afaeb2f8c6ea16edbf7d38deb36deb64ca31ad528ed796973f2f2bc8fdf5c1299c3d8bc6484cf8b883e9a472afff37a56a2f645bd55cb394b4ce3ff4e5476d58b409e0b4afa4d6a705eecc279d8d3c7f1e67ec35249cf4de23a129346dba6d31b12df6c43ee93f8e581ff92f8e5c17ef2e58da2625e66d4500b0faa51e130e47e595095a5f60c0fdd6e72841bd5ccd03da1a6d6e408b59b734e0885e47e749f830992e52e29a594725eef3ddcbd8eb872c5bd98e850f72a6a5d508b11005dd6620b2c5a6c11862d88f655931242196459574957d64d0ca3b6abf431b619e48e3490a9cd396d30775cb7baefb5cba49cd4eb716e370f3d2b5efb6e8e268e32f88f741fe93b91441bcc3570b7806a8fcd579fed301c6ac0f7ae7751d73a7b57a6ba1ac7433339310c93b355be0d89e15e97b45106553285da9c38cad0509b1057394f0d8542a1a6a4177744474810be38586a5f37d8860f868100f5e1d889ba9d437a13b77d9db6cbf1819a9aef73e7e3f825377bc96a65e85e6c656af561178661f379bba67cbfe4bb940fafb429f93e57daae6f10af146db5727b3c886783b3e4d5406179b6d2afd4d7102afc37eab4f8cd4d46e2f269384e1fcbae7ff649574d2e35e43de4fa7a406d3ae747b3dd0d35ed1bf36d8777c5d728a55466189238ed35b530b470b888c80e2c252104a70b4170801772272622f288b81857f9c30d554ac2ddf94a0c9eec94fef44a945c4f6951cd32224ecf39258e08d3e3a0e4890fa62ffde66d75304185d0042957fbc66105b1eb41ddf6a1bd7f73ce8ee95b9e88d29f3e9abee5e316443ec61c63c45146ed1b63dd464f440b114f484fc4e94bef5b8a01a72ffdce69a7c59ab41ed4d59e42cdc4a1ae70c6122b3925cd4601f494eb54c46ab06252b3679af938de73e4970968a99aa010d2f0e28e4e9cea5d94b8d82260ae60c1959c27263b93733dbf5225c9919549d5a0eb9f52258d88bc9567a055bceaaf316af6f453512d1ea7a00c351d540f618e249808e67fc1ded1c0a8cc5ed0c7711da83f2364b93dc5caed3f82647e92eba1fcc8f9a680f892c0cb4c13b1f79991ebc6db05d0ed7faf298e2f28e07d6f3becd0b1324df3d5ef8b972fc20b2fcd2b4aab13c3e64ce5f06ea348ed3c698d35d658e3dd6b7e1be9ebe1ed091f4b7de2dfdf137b29636e50ac93aabe86aa188e4f01c8efc77946ae0b1fc765fc29e5bb39f44fc379fb8aa28433ee1945b8b8c0726971860bbac030c22b4a9c313f8025088c43691155062e1fe1eeeeeeb6cc64743decccfc8f1b0bb49b194266e69682d2d67ce6f1649afe0eb201e9eeeeee7eddef7577c30b41409f33333333c708a38c315ac857caa0423d4cc479678032333333db0662cbcddccdcdfce0830fbef79ee5d903cacccccc186824f77d8c1fe3f5daa633fb923d5a6bd7a948e1be0565191daa577d0d3b9e773cddb4b76d2b2a767afcce7bcb6d8afc4e00bca8e10bafb9a18ad710200caf6115f1f03bef56bc66c7efbc93e1350df89df72b5ed3bff30e85db30fb1477c75bcec4ddf127ee8eb3400cb7f1a226e3eeec3cbb1a77e7fdf41477a7a9b83b1de5eeecb4177767a7c3b83bdf4bdce6b576fa89bbb3f316709b57b4c358ee0eab717776f88bbbb3f338b80dfcb9e1eef8b83b3377e765dc0606c5dc9dd3ddd1eece43b7813b3bcfcfc6864703919fe1f9c9f0fc649e1f0074780bc403f2415ec8d3e797808fe1f9bd8fe79e5f0c0e8f03019f03e76d3cbf1bcf2ff5f0e7c1a0e71ef456fe50cfaf003f6e4a355f9f1f89e675d0589adfc1e978de60900e0e42a1e3697c787fea03d77747fbd03a68687e5e1a9b1a42f33a9ee6755824ad43d33ffcf03d707ce30ffdc3777d673e723d709dcfeda1871e38be3f709cc383e33bc37146783c6f3333dceb817b3f708f07f796f0cc479adfe13a1e7fbd941bd7f9dcede94ccfcc44fe19ee51c183eba1919b3912a335c283877f5e1e0df81d7607d7339fe4dd19dbb13572dd063c0f9be4dd0648b7e22a39633b9f3bf3cc05e1c61fbe1b8003beabe101dfad20f01d1701094ce03bec52e0d976f1594f01ae79c53f0109440002dc035697df011cff0f1cef789c37c3f1f05167c7d3d6585c3f6f3b9a87e73076d81e0ec2e5e1df3684548485119787e74d8707cbaef2d65bf933c0769388edea0eb6435d9c67e345403c9bf7b300db4d05d8aedad7c176281f436c5713603b540eb67b21b653dd20b663dd8e8b8070d16b15c11f1ddba12e0e9e63afc5b1077803d8025802701206b57ed80e3500db55d3dfb88ded50354102b03eac0d01a8e1fb996ba8e179d3a9c14a16d79716e196fcf0487cce0ff6498f1e504a8f2857fe0edbf9dc1d3cbe837366c676f157cf839b791edf3c22f3609a196ec7f70624be8ec7793b3855b6e9ac9eae381d2b1dacd26191c0ab523d6d6dc5c1cb9bca42b9920bd97a36bec457f269b0dd9ca12583ed50570c5e49962fe32c1f00d6da0e75dfcfb369287825593ef75846b9f263b01d4a6399b17cec5febd9f4125ec9c7615f8be5c7d8d6b3b100af7e9e0d0ebc929fb21d0a4b25e3cab76151b69b5f5cf9303f2fb6435d172ee8d9c8f84abe435e49d922df1474fd74e557db55f924db4ddf80cc978ff346aaece766c26b5ef18aef65b43d8ec58ba600c17d0f319f1efc9390b536d0d28ab256d6e228648144d62aaaf5bb7eeda9d47cc33e722593e9d94dac6b525d93a99a4ca6d7bcc6f42f5ce5551cba89372ad6736d7ba25688c69d70e8b8e5f2fed485eb4bc46b3497d3bcf4e7a5363584fee9e99f6cf54a133c3b07591ebf6e4e71620d26750137f8792bae2830109dbe60428d2a2e5fc42f720079b0849452ca16054a025015b021001911c69546440104f18b317a40c7c8c17d7f42699787c698c1182ab082e52c2fd080861130694285c91258a8dbe5294d84a10bd544c6edbe1ae109b7ab34a4514797a73441a40ac3104f69c2083330978798d0040c554ef013ce2ab060a80a52eee8f210184ec2504fd3592c24a0b060f2f20a2fe2c7b6e2075d387561094bb0d0820d247e70031410a85861851b56f0a05aa1c576c41551c8504519ab257eb0c5c808549e3051c5cfc80a24c014810728f8810a4e519edc58e20a2fd838016a09206461b262061508377059e20a26e088c285cc1150a400c01150a890aaa26563c94b126d82282a6861421a4960314586285890295d11c6147050850842208616508880eae20463208185900d2084403b020cd41223482df1832f6c8c31c62b8e9039a28a1ac01c11638c118a095c8eb0a2899723a8603a020940f0c236c50a6b1c3145053c98628515b774798a15530840075d74f183a8822a9ea3bce63bc062a1e4cccb4891410d9090524a2e9e208d91c529d4f8f16304922340a25b0006dac5166530d13260c21170080c305c795f13304c411484022ec090c37a1930a470e5e52130c2b8dd476913b0121a8c263a8a7a7ca10b2f2efcba820b1f55a50a173efc276230825e33b30423dcd8c4882554715f26cb07cc3f06c034de8369fc85e84064885eb273e3f0f5b8deb16eb8e96180eb4fdf7c364f6e98c6732014fc791d72aef2ae728885e1fb33e72c63741c570979af244b96215c059deb2628a5af0310c4843e6fe2c2874f5c4057324de61e898f64f26553e4ad60cde88b3c08035695806b1a0a56c187d27a0c65d40ec9753f685ed6392098061e918fe4d2e4d604ff8077886713015fc177d5a804378f3ad1382028c034f025c03db09865d13693ff40fbbfec08924add7a77fddcb824ef6e4fe7233d111e203d129d43b24a3ae7d1f9cebddf384de7217997d247e11379364f660e044202dc033ec65140d334fe316d112e024c13015741696f98660bb5e32addcd0dffc82e13192425bcf01b0aafd12efc0ec36d6c20ea29a2b486be907ed3fce3c66b58ca145e5cf837788d016eb411709503980692a8a829ce8142857eba50181815cafca75477a6837c741d04af7c80d66799ee31e662b8cabb5f696a28b67f7373c5024cc68d12a480b9d96dce48dffafe5898d9fa9529416a5c78bb7e4c1e135dc40516601ad6dda8d22b956aa93e148a0b37435e127ee58a18d68b462aa844806ec74545fc230afc83dfc3709f3de2fe8ade2b6a31346781dbd840d464f88f03f9137d05087f401670fe11af7fe5e27d403c2af792601affd7ef716b0108f217e5fae3f62b5ed3bd24ae7fe745178b639b4e0f596825c13fdc474ed40e158314950cef7aaeacafd464f9790e14847ec4913262ae53d04edc6e256e1719d1f54fe9b9bed745cfb9be975c6f5be96ed8ddbed9e6e5b7ed5f3817eec4b53027bf8d1c006ebd31bc865c53d3304b84074c8f44e798de9ff56c4ceffe769ea47280d14eeb5344894f8ee9e75bf51331f053edeaab6e8306f0fdb83ec805edbb0ac21befb3383f5cefba62952bbe224b00a215011983db69f7bdf758067b271ca6818f450c83539a40d16c209af202312e7c5ee24c5e80e58e5a53824070bb66c185d8d5fa18aff12b5c5882db6931de225ec34354a45cf811f01a1e170e89f707fe11593e9806ba658d50508b3c9b7901b6e12e038d0b8db8f051ef65207d8a71f6bd0208e03e9a2064b841407f2f88b782ff82702b73351b57d3b0ab7db38de9351357e22a47e22297fde3b4df38230778314e993bdfb7213150ca98c29ddae44e38a81d5b09a227035e733d7c245ed32179370ef14abc037238aa422524680fed4009403904e0cb4a9a0a24a88114728a9036601e5096e9b8e3c3e7aeeede0ebb084edcbdddfd3d7f1028cba47c50d25710ca911f1f89ce79f280ebe3774e0a064a8e121828392f86379729a81dea3ee6515d1e2ac2cf25c295cb434428a2b93c4404a1fb9e631b16942637e062053c4002969c67bb1e6d7446e5212238b9f0f9dbddbd901f9b894a65812256459124a62aa2ba331a0462cacc36505187e2ba4a747bc9c9897778fd7bd2a3f7fbdc776883b8e1e444f56901579d9ca87f8d01bf9fc26ea006ea7a32d8cf36e5c718b6dc743a1a7163034911babd15a97523d2c334dd2220eab780abfa7750752444f46c1a4649d450da10217a30ca16418ba0a7b374ad7dbf3bf19a0c889e9ec6e2351d17dd1ea6f9ab7159c07a0497c80e4c01f114104b73539e02e2968b885e3f8aa8892ad08d4696e7824386cec2e3f6d718e0f66f71fb3b6742c33f9886697c038269fae70c6a6b0dc56bb4fb415ed31ad308655d645750413816b0426447887f41bf1be8ad3c831ec6c5cca87d312c07bff0e9c76fa0ac81a493278548d78a42fde3e0e0436e43c4bff02af0ca25f26c68145ff95329d75f4a3ff1aa64217a556ecc4fed5d4812725593a8b8cdbd8b6252bb998512d12f5c259d5c355ce5e3ce2c4ce34f7292e53ab6a476f3ce592b0af5af52352a0833034aa8cdf9cd71b23ff69cd75f97ed1ccb8d516ea48232012a84ce275ff580852512635bb11ed4cb4ed6a23e089f42389ffb854f09425366924a4dca997ba5c1a8a73d9cebc87b11931806dd067b0c7baffd29066238a843b8ea3d5441a1f6f74f12847888f11f858a81cf592ee47cc4bce744c8c95b9d514f4e9c5c9f53e85da14c80cad355f09f9583042c2eb691eb5ed061d0550c73876b0c6191a0b63d626488cb83e4cdcb7646ae988e0583da16baaa0458f670f2c480bc3b194e9d0959664d2aca9a4050ab3717bfe19239b13c2bfdd00aff8891a3c27d900799c36f6585d7f220f9f25d8fdbdf62ea9beee6be6edef854a7bad8c77029ee0667834371305c8680dbb693a8266ac7dc64e0c5763d5c6ca76aa97396eaa6d1ec4a3fb990ebbac9601a7fd2772ad5e8fd63980c2a8c98ca1d8d9ef966341a7d64ddd1cd1d7d01d8e6e606fed13f1a8d5af7e6d974167825d4b5108f4105277cd7425d0b6971bb16aa28d4ab585d0b9161467d1fe4e2d40844acf96a87e44225f4618e104c2d475195dfa1fe4e9becafeb35b7a17f514ec657fe5951ddc1d5a09444af9e73ce2cfbfecb3f9c665c97c10c9b994fa742c8ccf9e0d4ea296b18b4d9d91b6fafe5a7a5d2de14792b9fa6b71aed70fd65536054ed5360d4aead7066d4b65194beb158a9a86eb5c27081c988283d4b275bb2456a95be1ad73596be5d85ddd991be59d656603782d1f02de5a485cdd6d592ad693b9455b5652624c78c30bbc930cbb8953d8e671964dd2e7b1e7ef81ca960a8742eb6443dea508d000000200863140020201008874402c17040224aaaaa3e14000b8f9c4676609cc95192c31832c818034400404400000044a4690321f7ccae0976302acd97d54fee32feb8a62d542d99d189e5df9f2883f747962f2bc4302c4390c228888e3d72ae68a76e5cd1a2b1b1acb0a923dada9b3b1647ec71fd7112ae02ecd33261489d1927f6e3fecde95f7ec896c6558b83dfbf712cd17c02a8bd32e1f095462e377843e7a2a173024cbdc766827e472683ad1b2cfa1da2fee90135339a0696380a0bd12542ac49f2df84e5291a503b8b76f972ee78678814282df7f037fb8095cb9839dd7dc80a9d843eeac112e17984d66e8ec68f7c8150bd988330c1e464af110cd3ee32ae342942c257e5e57035442299ccc6cee902120ce89431b224b908b85bb6e49ff8425db47d0487761090da72df0ca202f474d82db1576dac517a4cdc2543861eb2891a303f9fd699fbf4c1edbd18bdf671e3d9ef1b7fc5507ccfdec751928601877bd34e46671259cf73e11085189f23c79a9663cd8d5ac816623cf2ebe8a574b35d88a5d1f63788178dd8cad05acb665a19f75814d23b423798802e102887a80aeb2e96bdc09f75de5d0e1e4073948b8d1e4a0035e500ca238c1b77e69ed1d2100648384c3d53b6748cdd29f44d1699b3839bab97d96483fdca072c1d75a080ea1c9e614e59e588bed02bd16f5a3439aa4fd1b6247963ddc033f7fd2b05918065efcc8d399ead641144213d924ef3cbc210a890efcc6277247343e4fc2591e49638c121a639b81bede0ad0d51200e80fa0807bcf99807040b818a01a03e92458d9d3a434d096f009dbf4624cb693c2876de28fd801561941c02a873043c634b5e905091908787dc4a144314a0e7a3e99a8a08027feb8ceeea0e94805ff16c258b0c31fe8ad1f13f7d4df5fe58e6aea13444466c26f33a21502e4c43eccb9346b1542afd1ae43e9f67bad045e75a58a9b9e1f79182a194fbdfede23a57ef658604c886f6db743a6a9c1ca2a1f64f45ec7c30fed064be86c81cb28f2a786eb78526f6d56619250620edc2013ee0c0e879fb40b0e5159ef11c29a849ca98630c88a6a9734f66114f281a875d36a4e6b3ea4fc4d6244ac4a848e6568d96fb22c1849d262334af2b5cd8961c35366c78fd4869c663004d78ed44e3a0d5158c8b9e5baad1f95e21381e42870bcd12d1cf33c1819842dc19413fe806284096ad2a568ec2a1be4b667a18880851dae4eb13d6c0e22392f91cd6ecd32a73b9b1295601cf2cc91624631da18c128703d400af41c0f4b9df0f6eab702b1a51ff17c43090dafd296dc4140a073bfebdaa626269fdab5bf55ee015c9e9ab66279b9d9f62013dd0a19ff356c2f028d763ed39a4ab36488fa0b972f2412f5bc907603fc633d51d636d8541df9862840f7b33232ca849d07bcae2bc4fe4dc3a2a05bde666f102f5aa5a0bd9488cbc9b64dd4743b66a8010b8aafa5393d265575257ce4e4d64e319bc2356b4e91ec9e9b9c36a871fa3ec354a644771c5cea3f449481915f55fa20c0c25e2e9286e1b2ab347c025b0ebd52d2d193254dada49098d46f0ddfe6c15e1253c32fca19437c94c927e6d48172b4f086d7d94213aca296642bc0e7fc5027f72cc27d8c9221add97be184695b7f2bb0afe58fa2e0f1b642d0476720003c0a23fa1bf34e60ab769751cb9f2d43bfc82abb9510b5aba7eb582696834e4aa883817d9efde107634fa2c08723adc43067ec16e5dcf123bcf06e33ee4b1d88470108cb4e5b033d2ab0a05091628378701ec4b6a95b72face43fbb685604133a1b4601c8ec3617df01c6563daabde7b38a576838ae12bf20c0f222f902ca4c541f438bce9136a00f3b5480e989c057abbb3534dd0555d442a3520eec923ee19bb6181a0304a88be0e3a1c8045c7d00b2e6932dd336dc7afca2f6c18ef4742541a2abab94e4f9f48d5fd2927bfcaabf07f375c72dcf40f90df1247a91bfee08683e5d94177c641b0ddf328317eb6fcec9b6172df256e0866c67fbfeff03f6840b661776388167f8e0ca57d0e57a5671ca54e71e55a6fe0969b22a69792a2bfafef8c378cb530c53a2c46a837b0e40522a26588b081cc67437414f0f737703bcba1e32ee17ee34923e0001b5bc815006d74910ce97d01e3524b48635eb234978f8eea7b77baa94e48b8ba0f1a99721e9177829e015e27cb1d656a11bf14ae592fb3bc6d3f4c53e2cd0fe7fee28a0ca5bfa8a3a2e23480ff75167421adfa4b14fbc819b35f4f80730e9b103c9e5e4f64491f13e094e125f6f98c169072b8cb7084c5d61a32eb736a2c02b7f6ac7f98abf0d80acfce4c79cd20cbf4479471fd01a3f7cab945459f187c1f8a27a0f952ae08f0664bfc70260ead61db3fa37808e49864752379a84ba9302723cb43f918fa3727a97b0b1fb182766f80ee3fa84f9d40cb0d5623ba93cd73cb90d9195781c3ae11c8933a25fa3d9cca611ee090faa38df52c63cd78520e63fb23c889a95e116e46682e08040138c5b1048f73f20965d8fd35e5ac8620edc37b6faa06c0662504c9a6c0dcc3146537584eacf5111df556b47ada6631587ed18ea57b007f558b0e709701bbd7909683ea337e4c08a823b031d17cb4219891b6c3e1de4a92f797e29a4e500693759438672e3256104cb02a33f91453a52303f85c5a41421a52f3a53c221368c4ed91306b7401ce0d2770bfc0375ec0884c8567d1b2528a4fbc062504af4d8519765f7acd0079ac27f60d688d441c779bb0836c8019ee2aa0c53750b2a4acbe422cb65116f5a6aabeb308b660d46311e7eec916e7d8a6f8f3ea823ad57ec0f485c5739994bd250685d1b230163b9a30419d5520cd069ec0568be213171cba77ec9591e47a68b0f084c7787c895a6c902b340ce73790ac31bb28e2769e4f58339840b5c140f9d31d4216c09c99329d21b66dd46bace1a2616049c81d56610353c8df626367b47009764482c773a19f4ddbf52ab98affadbb66a043ea84bc0d3196106721ef7a0ee6c031c2628d46124a8f3bd87d6a051d40a06fee4c18f7702586c0f186dc7c7a3f53a5cef24c129fc85f6bc0cfc8a514fb6d9c83097b2a981b2d2e7061c69d8b25b0b21ccea53ed65ad1dbd3020b57a09c72280d25611dcef09f055f40a9efc1c8b5b40738b699ea0d95f1a1d0170b0fc88f12285709aff88d269195b74662a9a25209e69007aebcfe833cddda034c88c5c07a132041ff3359c09077e8a7dc4626f291ce2188e5922733c114b5af2e7a602cde0a1ad84e43f6b133755f499120663c1b49a73a79a617687202bfb8f71ddbda15a198da0722109407f9748773e830c99b8319ca2b2591271d651ff31d091d8b4beb1c0fcacbde0e896aa1a6b899521247a354dc75fc9c44139baf3eb48fd6ce5ae785cd849fbb4cc84db4a89651fc8d2c2f82feb1030100f65ef518643b4257a111b2c59d708bf203ec381655427f17436a8b3aa456c5180d723dfe8c0a76aa68a3d23e0da5ed2f963a33b2dad0a823f37b3ae606e666ff28a31d9bb0db671f77e1e0b2119d785dcab68c52df840acc7beb606322a9898ba8f5ba0652d454da580bc4ba681e2fb2459948dae4b9499b0242d20b569564cb25780243e1d69782dc887aaef0e0b56e3c5a40374d69d1ddaf9b3bec9ecdf738fb5d22e3456e7e5d5f97ad449cf6ce20152b61bc09542b15542d1540c2cd9661004bc8b9e8edfbc8b99233005d0caaa94b285375a77848cab5b71e925473bb4fa7ce2fd1693900a9d7c35c00267341924e36120341e5cc037477049522636834fccbbcb13946efbe655f7722850c13b9d667f23a28fb168f807f705299fcee988281fdf82607fc9b20b285134086ad35aecda296d8826fd001d1dd88624de39e8791a2aac1e6662311c0012a35a20659b06677f59ad60c5c8a673ab71a17fc705e0667a017aabceaeaf9cbaa4e7643024d7451269a712bf9a94463cd118ab9e4beae5f8e30c6d0bef50866c777bcb4b7e15edaa53df067a4b9af6af5132eeeb7a6982b81d21ee77ef47e04ddad29325862e7a2017fa3df2656e2a9672b0f69ddc3fcfda4b78e62ae3f4b89e9ab51b8ffc6a0c4e727508c371e7b03c7d9973c3bbc441881fe5947b5796b6687eed79759d780926c2a45ab7013a5cc65645d2198996b29f877a28d86456328a5ab711a2000f1ac240d271a50caaaa9ad58af78627bdf94cd0e52843f82be6615464e003e72b3caa625a43591fb3c89dfad4224b38ccf9d22130f8aa76423e16d7dab6cea416a14b429f27b27c694bcc57229d1fb04c90ba88d315115b087d7b50a1ec5d130f283da2a7866ce79d90f35a43f12a07e7c7922401f714de90b93e4910b5d5bc76c75123649ab7cafb44d2cbc5ee46d6a067752a310c9185c44bc329341edbb056525320ea8cfe701e471d6fc36b39dba059ed3b6ffc40594dd18f9e8a58e6625f26bf4ba9fc16fbb66d6133fdfa75296076d16939073232a5689011704bedd6506d8ecddafc1e8bbbb595007805ae465a6eb86a18eeb82ad2ea5db1e7ebbdfe471cd7d0709d7f19c952b0501d03ce20bc12f9373f16340a1078e3fbaba077dc1901d5a48a8dc5bb45b783668efdb847a19723828bd802b386b56bc957522ab18ff1ada8f0a8fff9a6abc22a2177b54f52d8e8537797d7276f2d643833e3661bf514108df471ec189b09c00524b2cfbce467b60d84a3341fc528bd0a54d74aa0a64b5a058e02f707fd88baa311d4d95e6c7a290ee7f464af9df5247fbcffbeed48ceb3cffce345d35d8ecc5f0a06041ff7beb2494a7eec704f627e79b674f081a322dfcb341e6efe7980845d6a5a2140dcb831278f8aa5b2206d8a43f04d2861032103a893eb5878251b80909653f29cac6a2e1903560c0ebddcbc71c93d997b798791c79c990288829c47ee6f220982735a65cc9139a1b7ce538c51079c597c3a38d42ab0339583d9cf810c4869261173b8758db92dc7ca599ee9c6368bd64a91d6f1202921127ff66471fe88534c92e49dd98871a2f8d0b3d09adaab6fec129ffd1ca99f773ad402ad3f6424cc8b5bbe723a9251bb8e22f410678012bb032210e28b7201f5f9c4624bf13edbd56f930ed666087d0cd4913b7b89551556569b509382b792bec0385665771790124716108e7c3eb72ee630366f42e9bd600ca4481181e508b1693009c859c001b0bb20aa05b63d1fe0aad0040933b3ff51e9e2bd1084ccb4d95b97df58956246eb68a8069e2f88db511f77fd977a967e5459bd344a75f745e5fcd23412987791f803b0814b105a3d0af7d35c4fd0185ebcc9f84786ef78132221869289eae7ec589c83c61b12b0218319f009a2c1dcd7420188af3d7690fe0d83bdca7b0e191225be76b90ec7f245b7906d67bafa42aca5ca2a1c16cdd4ecd25f6f49cd58bd5de9e4ad584998fe5c7696b08a66e0f5e9efba7b4240a316f6d5f72eab448ce4410e0c896dfaa2c9c02363fcf9e15b5e28a6ad79a043327f5bef93626b24e827f58a4bca59138bf784b1b1ec5ca27a2890256e398194bb08ca917730cf7a8177a51e32dbbd230e66fb6f0dc6f819ac3580bf3e65afdbf5f81551330bec6d2063a459100ee73ea9a6568cfad1f4b235bb987482fcbf798415a445a4eb139142974c1dc1402d7d44aad4bfa6149dc8ab7381f6e471af6360a055841be20da62411b78f95f60d3de3e2a6a72e5767820ef146b0e6d3d913f1f47aa2ba956ddd3a93e631731743fe44878d09ea9fe7bb0f4d3d32db26b59a5f44261d169c67996fb9312742d91033d9184bc8ba1eb3b04df915bd418880813e47bc4006a978b017c5dfa664c3747998664431ec96a58e45da6bd64b0ebaedcb5a93b75165f232164e176b1abd132695d0214eee2f80a4f658a73f125a67a75087eb2925c14a4de70fcc734560e24d886ae9e0d987639e84716e327f8981c263907771094069b02338fd281a735bf24299c675de2b6e118ed7d069b106c0378fe1b54c1f239c17ae49a6a05811a9b3ad10a95ad8a148526a2eec8e08b1a157cce344dcdd1bab02504b6d764952dc812817a5537f7698a28057e7eddeccfb6e1fa87792216b1f3a998078bca85948b0ec031acb90dcedd1eb8be18a4d0f65b591f59eb9a8597b88e2e7d0e94af00b2ffc730328a4cfb66187c5cd9de7cf52e450b6c606aae609f29917c6adf274a2f95ed12b346845ee869fc46916685cb03b6773d75d7fab4ea3c13158fe8b06bbde8f082c18c77864cf081df70e589dd60884a8f9cf55015760c05eac329279d281ac4e25830598231403c35e00133343b4f1e1323204800c0871a94d9ee51e5c895519e26822ba245d4aa0543e598f3b83ba1de650dce90026f69df421ab0583a407910288ac60ab78abb5d3c990815b18b211b540a3d9c4f58ffac6e230dc6396c07da5601230b4f487d0a87efe0414ed5d0c6de22b60abad9a30d287d4c9a20321de68fd0a304f430446464b8627dffddce650f0a459353ab79ce9aa43473ff5276789453379f4dc615c8ea442dde244b0737d2805f102e0c08e271f98b2a70c2c3ae772d71efe2419d83f1532e4527e3bd9012674224569bff780a6eb0444380e2eafb4a1c6867b147f69d10b3bad692637409ac25bb1db5e1d1a0354b96bf0d2995a95d50f9a6a194020ea860e5b981601f42f0d66a76fd34e9b7cb51f0d7189a21305161e7a3481530b6d30c11675975ea4ec97947327af8e05ce738e7576fe3530bafcd2125b682ce7ed236cd553f7d172e6212416b1ea8db11ace7c18d274616925e3a936dfd42d2c69927837b53087dd453cf211c6119d3b134070c40b1f01bd0a2c5173b06b2c95edda0501801e1cfb379e09793930feb0ab65f7c1e30f87d36ec810c5c87c84aa7c193e1a9f1cf5318cc395e29d51f695ffc0b120c9d167d09ec68f232241b496aa56885a79d56c34735ff8c9e58c033cf5defbcf44ce0fb7f3735022fde43fa9fe21f963e8679e630c6e11d947b0b0a13af7aa1549c790e4afecf5eb86ab74e237befd855906296a59a4bd883f2d7a907d0725d4bf21f60a5f793e42552088d084ec813300eeefdc44f87e5a6b4687863f351a6eec23d316df5c02118714ae0295ac297b986490d52ad732df8af50b7d9e741b3ae54aba1658f41926c4911a58427396ef372ebd7791b75ed10a87cf2158b687999fdbd73eb3cecfcfbff282c41ea5301a6ef1a2852dd96efb94b9e864752ed5216033895b10e18b021bb151c696e54099d76cb17da93e74d3f085402dad67866ecc8245b08b846826925906095106bc1b40768ef1aa2f39d9e9914c970ae6056812f10205ed9a3883f50444fc03fd9bc4520fa35304c4366c57db67d4af6b4d05232e2c9b956ca9ce0f77a4cd742e016f14c46c58283e7a23459bbbdfe12ac9822d62af6612e6ad2a712ad4482aa5f8a45089a384e2abea15a89a2f0abd20811d9d53683bb6f02305f204545002e9ee13adba216accad9ca9025c77a5f9da0774ebcfc477eea30a3b11d135216abf634af7132544117f3fc5056588055e36c25d1f24bd815c616f52a2db7c28730679d513c0204890d91220fb200d2640f808749ed2e8fe31583025a7c468c3b477574f971cedf8d33a22f4e91bc41e257c29a264a03c7738f8ae3fa701152f203b8a640cdd2c61c66e0ef38c362414ae57144428ae0bf6902f7af9d459bd64294a78df53847b68ebdccc76049cc265eb9875f653f1738ae6ba1b6b015eae75a00a321719f30947c7e6746e21d4e2d2ef14db422b1daa8544ba2e991f2485de348bb973721a550e61306e59bcb8dcae0b8c6190dac88d5cfe242671659173721fccbf6bbb23c30aaa50f82383eac923a0b8cb076ca819ab48f7b48dc3c6458937c254fc8314134b04560317e6f032e337908f63ba535b50e80a10b580ba1e062edf6a1dc876f25e562b2d3327c77cbeefb0672f2682e94e450711d9251740724d99df693061532ad59a90194d28bf195960b2ade0007e44811df02bb48e519d9c6980966e6a35998e6105ca18f5aa33e1f22e15dc6bcdcd4e10e783109b66f1dc0108207f4fe4d14ceebc6ccc93cd8d6ef52839f4422fe804f47b25cccdeef71885928ba8ad8e0572f6ef5850d9b7f5e6a3f0d7a907847212fd23c9bb984c972fcc48be2b0f4a5b3bd938d027753d88bbfff0158448b3e8a614a3d68f86d86f313e78537afd91a140deef94cd71a0951817f7983e83a0b930c59a1baab16645e63dc33c583cd0de64e02a07be9214448b91eadca463b531306e2124876520bc4b5e7072708b4e7ebb04b29be013f7f9feeb707ac9141f7cc0785715d6559cdf858854bb3522f7b506f342e6179d4030ea59cb4711dd4fc3cdeb64734bb16b56abaf4713aa87fc3b0fa5c05d9fc29b9e2b3a399b5c635b521184a4b476b05aca21ef57d9ec71742a7050e095a38459ef38f16a443bd5128b7dec70141c5ee853ec8d782f26349c07227528f00c96efebdff9a28674e975414c6a1b4c1a07e0de75253d1b521e57986e28c273e480afd7e65a0a0845b394f7f940b48fe3a1841abaf723b9289810f4ea457510c1d5b6fdbb6d5742d0fffc9adc0eb80918e8b58e662342d4820e13d3f3a7470bb8577e6f61d05e7443eb22093326a9f598fca44670f06a1b9a8463fde3a53509937184d2069980b3b282286fc97cfa6f1fda6fea06165660501d798a19a1835cf2d493c5f3c2727e4fb0866d1ac1284e506529c095c7f933e5d49224d56dc4a67d013052aa3e3f0277511f7c81c0fd2f52f6da10844638b31a84701f5f430e565bdd711080974406f15c34c74ebc4628b5e09ad55685f84504e0d27e08fd75be0b83c416f63a62b7270808f175118b0388f559f82a15b3441e51921582dc48f57443cfcc8c2087058291282f572299ea9d4bb70913567711c9da4d53b02adab4115f620058322947ac4d58f793f4cbf7bf66d490bc85a8940a88ae6e432eec0aaccb0e2791308e56acd4b046f62bcb0c8137eb3d401f919a0fd1b8de354cdab5214e4263ce8addd41becb42133c0daadb1a22d47ec1cdac862bf8e58c26e608a787739e23794abc912553e42eba900b1925fccda72aad3064542144fc2a607278a0fed2c591fa58114eac62aa7b86fa25ecc95ce86367840bdd76985fcc0bf8a80f987c6a014d7d9daa1fb901974d69230d647f20e64e6a4e0b794366eb07465f437d23a83540f373f1f8d02ac706f46f201e9fbf18d9a2283e203c88df98aed7e76d2e816aef33f69f6da9adc981188540623607e6bcc83c84074ea6be30b8273807dff24ef749d2de7aceb341450e289cafb38ebe6a066298b8e875520b720cb06094bfcb157fa88989dac0db0b288ba6e3f3ac7f356d92d83e6492ba74670419be0974d133faa0c45107496fc62ba9f862fbb8cebe7174e174098e0ad24daebcc55d9f3df21a7f08f8e23d79681137f1acb3fafa794cd58be28da0e3486cc1086a6f2fd4a49779b818b765d8b02e9f473925c9781abcd5454a68abcb60e555f6200e3624fc947a4b27d080e2cff4b6d2a86973c7c6be8de3adfb398f44991aea2f74d8cca2dce0e83bf19f5b4035330ef51622d1f4a1bde2895b3da2b02d1412e09a4c0874a5787c30e9717c54409e73040fa0509d6b990d7387a810a7aaf7a90ac480be4b426891966a1c8c53e9990a0daeb6a11402dbd9746beb4eb331ace48df10ee612fab1bc973fd31d5b580702a7e3ff6b7605cb6b2ef1db46a6dc7309b47d6307793089689bec2ec07077c4e20d071a2e7149652d386932ff3f16493cd3f7f07f54ff6c3a06d9540ae8e047e97740e7f17ca3bf21fc9adac09645463a64106bf9bf93dee3307f8457b729c41b2597299ce15f8da51c3029544f8afb82dd5d8b6ef7ef412de5e04e8fb9f0351ddb7c209b3906ca68903167541da37557320cf440eaf293c6f6f53b73be15de64ffd2fcb0f29b19106070574a13b585d0b5b43e051264809d94ba99ebf610954bc2ac87e463c6c08818e322799a18df25beb3eb0f0cc77e0bf370140cef2314717bc70e909d8d4032a6b11958c95580d863c81dcb25050d33e2aed476c7b900847934b1b1e22fd44c84a494a717b237855b4974ca975c11b01ad70b55c1365a3f65141b5c5c0b92ea693188e71137538be38776cd2bf5476be562a2d14ee490115708a5469788be1c5048084aa10608e885fc8b56f189f066fe5565032943a12ab490df73a731525b91297ff86390869bcd378db33abe222ea9a0b6474c9bf25391436df7e0d82a6ef2ef68408782abc33f2a16f95e7d40af4eae4a1c7695fa061cbc84eb5f6a2b1d9d5763688095031b936d5e26927c42aa410d463752a5e230833f505a45a97f28ddf701321ab1de233b4b0ec17cc51129e74561c1e26ac5ad5f7ab87edc68f6f2f4702922b0ff403507d64e0014ed9896a0154a2ad666bf1f6ac164e29a6a967da525c2c17deb774d738dace012d1fd9c6b0d3b2940e161f1ad4dc2640bea644a87b363248e142a44e09fe3aacf9dd69bd4e2cf9fa39d7fbc234785026b43db9ec1c42661815e15145e215f97d60819fcc20ed0d40b88681bb2d475630e073c3074132760883530f74c1babc0d6bec3935ffa89288208e01040f7dc06b1fa12c816939d2394bee9e8e6e9e639c0c3cf8fa7e3dbe96af97c92795d24f28885f8704c765acf983b752a94d014eacfd11a7d4bbf91ea6021fe468dc9ad6a38ff87d6dacaec7d7082176666d763b951631e798563adb8e82f784b0019ec8916872e71a018ff365cf9f9675646e1294ff21350aaf3f50c2f1d4cb2d7247647dc8c1dde4a98f1cd94311458d0c94eedbc7e118ec8a94ae7ea9fd9054aeaae97e790421a41d7fcdf0e0c86ef59fc7606a7998ddd7abfde7709445c7dc194f383542c6b35ab47514a001aadbba1a2f8354ccc1b7e75cff0a76b32f13a8f65d18b935f2aa56e4451de9fb87ca07f7707e124f1d7c932bf0dd4d40d96d55991c56eb68197fbb9ee7c1b8c11a475043663ae4c7a3bcb90eb616f121de1048049eb7fa3cce111351a27760737418ba4fc2ea310fb4be468ec688f003c091c086ac66fbd9e1b7ffd82818fb33db66bffe9f18ca64f960340e4fc4598fd2c026cbdd0153817aba8f4b26a69c25a640d9753ccced30c8480a2f43f89c71abcc5ab0ed07366ea99118a75afa32a40f0e2ec3b8d4270c5613337a03f20f73fd84cd6a8b9a52b7da9395c9cf3a6386b887cb51640c2ae62aa0d4a703cc343dafb4e88803bc63839bf04d263232defbbf8f50ab814c0fd2c0af5bf251a6503f930d9fcf69398f411966450ebff0efb04c57ac72f213808ea146ce623c2c4ada98ddc27537f2ec474ab0a556cea89dbfa6d6612a0f0e6a80310ee31bb2e06af8e4405827a0acc033a888c70b86725574ce8ecf341bb42e2adbeea965c344e5f4d54bb3b0ed4ee0ce935c06dcadba58be0e4bb1ec39f2060d05a2cd2b1f2acae4cf28be8c2158374395f31e61baca461c1224c47c280f4af64c906394f04ab6c2f275dc14ccf93140dc6b2b15f6912e0142318a641e8272c78605bbbec2548770956c05cfc1d984196e438e0af0a557083aff18504a13d695ae1de775899d830eb1c097962b750b179f7d224b48d76572852908c8d6fef6c58032cd4120ca8e1e05f8e3654304a46c9fb1326a8fcc0ce4e1df02d04bf5f3b0afe4ab7bef27e79e6433ee270541afca3c4b4bb32320dc8008a4bda51b9810ec64d50a65f70f99078105b8914f34f2463e6b267649421ed1076cb513c5032b3a54c4316c67249a013bf0d54d64a15f4b805b055c74cb95b282daaa01716659b61ad7a24d113b6ccda833ae01fb9c8da4c827802e2b99450ed44396144d1233c035fab06eda8a24213b0f512959d77a70c390e66a4f94729b146dfff5f1a71599c8a93f300fbb7ea82ba794cc30ce8d08f12fa52e02e85c0b3661832066076267c1772adc04413dae26aae1fc4f64298cc078429134056299ad6f62c7c93ab0e7501359001235c2682ed3c47624f40d78a0495b6fd4aebac0e6447ab77c726df604abc89576de71c04e7f50fb85a368b2c13f0c2403e288bf6d26cbeb8c37f0a50f481f09d7ded061f1fc5c9c976e250395321df19fd0dd57e0f7bcfb34452088c90a05016c129c5e10ab7426075f03c8e4139cd5ee8f548688f462f28d6dc61b74aa9966e810ab3717e0552685af8941ba0d9423c4fb23827ee2861222d3e10ccdc938281040fc29936004b0e7be4991949084b1af7d9f62ee6780c4c6733f1728bfdfe2d6fdc18df81bded244028340de522fa0ad9ab7cc05f6c3f6ecf77326d889d6ad4777f2a95224c06402258293e9a620e9a134beab58d41a6ea0b668ba33236ea24e6a48079db4a24cbe467194d5d033d45a9d4e382551a6864bacc73d7bc517cf56372a57f39e966e96a435e8e0b2255298e12b4953fe03c96e4d3090ae33f0dc0bbe24e6d127ca75d05e0636277665d7c1dcaf07582c22eee236665c9b048f574aafbd4799a1e3c85039d2c070193828f37a43884bbcd0150e8514881d7a6e00eb736851c5af652553216665db87503f5211678a734248ab8e726d977a35b63c862521fa295d2b48abf5ebe9f06cbb982ce91fc349f5665b5b1baf28201237274d1b9454ec03a6c8dfd08c29b2d7d6c7828046c111d5b5b1d591815d0d950db63726527d7d0d865a1b72c4ed73c6809829b207eda90501411c5a7521f23fbf44bde3a5f8961d9185312660ff5390681ae53ceaac5c3a8b2a4674d62ae32d5f90299d776d37184e0bf8065d09d4720e32fbf6c9f47b0934e7861551f2713a3546b628e33e3e19fbdd16b7ba10eefdc8508a268a49cc5dde9dc019d6268ccf54fd54799c408d84f4378c658e6af828466556c03cc423fe4c8de9beaff0b9e099542a7d634d433b587e90ba4a59f61e6a328e8d3f465530e6d03b5128ce6d73e390cd3f8432866a0d64745c9d0d5e12720aa715780a1a735cf25b5587e7ecc836744c14024503931f6a837a6518d0fe2b18b2f54bd17895701e06a7ed02743f1bbb59b7245b0b90951fbca800b1d02df65b6109e2169a9a9113ded7aff88d8a2f61637ce539b36077a5ffe8e0334c528fd1473f4d47d51a85961657beb4acf45f4193bad2150b40f61bc94a0af4cfe95f386648ca14a169aba6e24e8e1cf772e111d2f46c5350d5463748603fa51605577c4a47618b92ab1da3f2a057bca460520054df519632e6f120be6bf6ef7bad5453a7be06d580003cf8c2aa4ff73cdea67d4167875f9d903e8f6d98896e6b6e14e6b5a689cca2d356878f2466c9464279e168f228309b5b8b3a689ea89701df7a11f2296d976e7d16adb611dba3974b5664591e70ef021abbeb702e8a41cc0ee71e802dc4f676d893ca3680dacf202f26d71d1561339f3ef983e272e962b7658627959a156402021275de3a4252c010f2615d5559bd1b253c6871ae7770d1c34922e39f71319e48789f17229451e650ad1a74374a74848195a52a5c2605314d52dbaa0fa1508b77a15b31a62371755fa2d8c983c4881438a05c7625175fd27e63b1887876943dbd83391c5545f3a4b3a3ef575eace38d8c52ffc39c6ac5b7643257ad4700e367e6fff63bb0f7e75ad64ce962a258cf2396f7c4430037f1fc79e372253963b7c474142ae6c87130bc5c9e2abbd511d9c6a78da9ed2423df49847ac1c7c61d72106a5abec084552bf621973771a1e5d057f4be8ee55ff9936ad86572fc766a9150f58d6f37af290552e96595d44cc30b8a5f11f7f2cf15cd543ba275c6a7297719ca71cec6de9b9956376c88fc6e431210d04c115bff2178f2aa648146ce9cedda43e16d4f3456096b1d053ee3dd158fd40644e45b6f9671614c1fdb64ff0aa1facfc550350541cce691b8c9b46c06a60c70b22ccd9f89c2436a0f09aa5747054909ab6f0d264013c81600461f00c4253b08a955ee6bb411011017468a8db8d6dd34cc540021c15fc0be53bd1a119a8a88c831a8d1d45f9d8d4aa764eb6f2280f57f4931d198968050e812bb388d88a1e9bcce1bf3d5418964d68bb4a72d202760a6d017efbca4d28199484e494e726f35327cd6f5c967bc7d9f6a3d8d3b1cc1f9fe77bb5f7dad7d8627332422286c704eb63d2f3280a9081ac6ffcd3043b14e0669b5dfcc28e39f54639ce84915ae8dcab46a4a13cdabdaa57e4f17bc3ebb877ed44d9c0de617a3fa882c5e48fee72547da7634ca2622e5c874bbba9b3663ca26a70edf1af215f0bfcae243e0cd445c2cab3f62a9896b2a9022114e19ddaf8ff89508146a4d6a914242fa925243ab0960aaedc2a9f10e4d3f667f8a94947d9c50feceeefb76654072666412c33dd9c876d93ef9253072411bba90d97459fec90586a05af52cd9430c4a2745f932a549ee566beafc0dc3cb84676889f25dc5888f006fa7745ca71cb244570dfd77ae0a1f0583f57e1f50ae31daa83f7caf1e65b79717738fe9d16e15404977553381407105ea631a661fb512cfe7bf1846115483beb03d5193d780e056b275821acebacb5b685d875d00143a935485f531704f591580544aa264e0a7a0e2a7420151e63ec7541f0310426e8ba193d078a22d9cfdd771914a258acd015bc560c32625fc2ea432db309def3dc2bdba1cfd392cb8bdf1cc4ada76b9beaacaa5a9cd5b732161a32b2080ab55bc73618863a06f0cd247c98c212ec6a824898c07ab3c5bcf300e6935895e0ed89be46386801cf6c6b4f69238685430960651c9595cb9536415f6560af5b87d333bd215bdf73de833ea6cc20ac61055ad362b1a25096a87934695359ae658909ca91c1d497dfde50d29e018e39fa765d551a2fc8f87acc29f53803d265cdd03fe74b53f0764ecd10e8a209b1182d4a650243d24f7bb667506e5b07f1e858c64981152cefc43b5899a0c26a97857503a53f8956dc0d8281a6b896c1537ab747c9001853ea9367bbc88b152c71eb7a195c32b0c06262678b2d76c301914eaad4bcf46d9337ba82e607a92f86d0cd862f70df9558190a913e5ff079ba6339a6d755782cfa1afc68afc51e2aa1d847e1133a3b958a5bfc5fb99bedd3fa076dba16de26ddb92b967dd0d7e22fa0d1f96bb5b0a42863462fb0f345dad790228399090f1ff449878819b58baef567cd7c42875d1412cd13e5e849aed40e20c01d16808380e55c20b9c2305b5a6a29fbbce60e5f60dc23aceceebfd7d7e92e8bd285e371453b997d0517103f6943d2455b54d234c6b35c3624d4ab0cae229f477f81fad01fe957a433f103b0f4c482ad0055d0313bc21bb95b165efacf43c3c45adc1a657a8f139073052138761bfa819269fdbdbafe60dc4b185c8e1b958bf630b6adf61188a435994c874f76c00102c09598d43ccfe66a593921f9d146364720a709b9ca8b660135b9dba6e0768ce7d0d0273a51915946cccf6fdeb004b05c6f3a4f53b122407f73b8cec46713a9b189a05da9ce9e7403e840c8875ee4d0cec3bc470d783ebe3d456fb6a7173fbf78a0a6e90dc5f870cc761c549128f963c4a534aed711c31606ea8bcaa272a83c7b1aa205f2deec7017d1f9518718bccdd0ba62e30ecf26abb85b07321c42cf0fa776b6411eac171cc86228bbf8fc2c9d60e7aa4f3208a5a3a46517b3dd8dc9754a242289d33b64aa66f67532e9aaeac554d070cd6e7eb79cba264dc818d6357d534e4f543eaed18e3c4a52431c0bd075b12f6023c8c3d62ff920401030b3b651159ba131474897dfce001feae96a4fdce1da9076a57231605cc1bf8243b7f716a834826d0ba9037d047b40132b588871859ce6aa151909c41d22b1a2cfdbd0103674ab226a9085fc79469fa502ebf60f921061921304757115e5b14e322efbb9ad5561fb67460facb841be7b113e8fa8903c808fbabb416acfeedaab1fd8c811ab3739a8dc10fc0b35f74018833c87ede7ef2ece7fb6cf221b9723ba6b16734409068ddf33d414ca301c9add28f055ed3c39c9c3853e1b5abc8d235e67c499165b41c5e881e6b0dec3264cd59b0bdb9a2e050483620866e48d6452eeb31c42f7f7704fe76d0b08ade64fea01c2657c64c5cb50758217243b43345938cd32c096aa0448e13c7274dc2f0fbbba067a96ac4b7b133b3f5c25663f6436c8a4803b4c8ff9b56645e26533e1c79f14246b1a89fe62ee128ec46d6c54077df79dcec064c1c4dd799d7c66c217bb5f5e2cb57c851a9c48a329ddb7ee1e7b4109e5f9cd62cdafc8112fcbf8ac03a40b4ea7e98a5537720f1170d6b85fc960c29f0eb7483bc340de8e4c07a2550d78cdd85a4305777b7f834870145ca3a26e355d865df665935df690e172bb69a53c044deee2b57f607370f011ebe0b0f702bd9978524362c98cc886a69b21fe4c6cac5e10dd2ac9426d6432fd3cafff5363f03db17214bf46c7a971d2dc625102911cd21245c871a68acd3ebe199c2023e4118421da1856798213d2a6e14864a2f5d32b5d2f6360995ac2e3f03c164c25c8d4a0d054927efbf1d3bd4f2a62ff981b05e8f5d6c01a73985048618704c6734e4cb6720c49fbc33c378c2fd7767b4c639c07c3ba39e630e68978e7cda0c130ccce0c0eacc2a6ec64f678a568c0d165c43a90683a2180e8f90f76c42e5ad0a32327e5018438a507539087f74000495cb0d6de08f2878125498fe3fc8137f2779824279a22ed6fb9ae30a9674f21a60152ca69e6a52ea8ffd7c93f3c71342164ed1f9bb13acf1fd32f4449b112d85a0af7ff6c4e99e9e201dc162150cde919e53d655f7f52438f66456f659bb83b553747a92cf27fb63c7f8c2d0a6769ff0dbdf17c34fbc65c522cc84b4628953b1155205036b4f310014cfad405dd410703866174fe4977471a417f8da5e89e1643da186d3737e9dc0a625ce7d977cbd670cf14d4a3a3b4ca11ed628cf8c50f91e61f36640755b6023bea6988e4f8eef132edff624c52a1ddb3b3ee1898118c028cf1d12987eb3025b69e0f5eed6e28aec40a1c1c6e741812cff548a41418dc971180e771a2db861a80da90032581a7d51e85b76037a2f9a3825bae3563049189fd37588d0ab1b9d7bef7d5028ec50d6ee8e710dbb33a7508dbaad2b16a211a0bc768f1c872c23ea2312f53bb84f563ae2591d59f03fe18cbe6f68d5f48608db4727b2da78ed5e760a4143380f39793cd1e440cfa053e221bf07bf4bd43b5a3abb8777abb8df135b4df29ed91f2c59980065d55a1cca8ae57536f9ccbd99c927f22339ed570cff4c0b04f160761b8ba200a7083faba667ae09f0e4940dd1f53f0ea4dd136a62ac24239f63a50d184b84a1eae8edc3541979e29600808c7064c8fb3552d32a43d8f86bbca4b8676efd352a7beea388fd7f8c93e5a78b143019999b8ebd0a18a73501b6e8dc80cd23bede8c8da2bf647118b73412a1888e2a1f9f9ff70ce44f7a1cb3e2e8f398bc435666ebcd46bd35867eb19d3f297e575c2487c5160303412c0f9071beee304da1d0337edbed945a4555444bd8c4fc9ca7a69b939e30dce0202f8c69f82d42718a344910b13af0422222eac8eb1bd9212d5f18a13fa811f7c545226b3a441581ed068325667204ac939e738279b1aae17eec43f5cae504807fa2b12040999fbc705cfbead3ba9e49f6a66ca4e43e6dc94afd885a4fd11571aa09ab30c0821f9fc9ccc9984d0dd13a319b3da38e63c87e6136a6a043cfd3df1e1b814f5cad301b347069c9b8911bc5d7075a6671c6b5052c4c162c4632882a274fd1e335994df5a37e4a90f331105eb3490ca7659808a800b20d4ee9cdd053ec1c175fbeda0383470fdd080a80e663303eeb797d78c15b68b3665549ec08a18388da0558304aafaaab0964d43a47d272dd995a6ad61b82e8e02e16f3f56bd223f914751243f373063f4411e94a2e2b8741070b9ab3ae59b9f485a4057d296b83468e8ae52640e350ee54d64b8cb27799fe6411d51a8e8729ef9f548d54178f14b0487e6416baa17c599de6f9ee40871aaaacbcaf36dba430f415f8f2e1301c14f021c1ab29a5bbaba761b6ee569c496ff933ac80ba2a5e937c82ec1b4df27f72ef86cd28bb56bce54442a9333964d09ac896dc5342958a034aa5b58b3b5385ce6555182a92ec71774990baa707c937c14ba6d5e92844a243ce43b71fea255ca771b85c72b34006ce2a27b826d66562bb63c47e69442300c384b78a416c5df12cd84dbe903d06df52c54b02e831d2ae7184b750f2d1aaf42ff44746dd1784632d61f1ce990ee75f8fb82ea30f2abde331ae5fed4c82a9b65d1db5d3be361a1361194508919dc0893540c408a8e97380a6e8a70f8d06008bbd7af52798c01bd90cd39de4e6e3306922c88faedd7435a8e55ad9237c99b14df3ca2161715117e505e9358f383ea799a8019597d4bb8d77677c0305478e37b2857670cbe5a46c90cdc24f46e505e94ea6f9135cfd84ea566a1c3fd29d1fbdac5258b36a5fa594d79a509c7c9c57af52df5382dcd5e6500e0181dc691eed303832b0a910ca053dd1658246d15e02eeb28866e557a6e9c3f27073951caccb972f77b690424f40271d2fce51dc5255b6478f6d0fd1cff5eb0f170d9956109acbd17677831cdc3f2ef2ed9edd1f938713ef4e6c4e2db9641b9c836e1f2d7d2d519e69b9e42f5b192a9ded5bce1690183e3fecaac80670e3a16e1ab64e695c2ce2738d623dab0801c50af74405252d1130209a292805849b0c7559fb659cc4a2819244427b20d537fcf390a78669954bfc59419f320bfc454ee794c0aa052a1ab1d44a4a7ba11bf699e241a24dff005d2b70bbba386c9c1abaf95133504c6747ac0de07124c866e892ea02962bf745f689410125025f542d6ad8349baaff1ae14213b5dd05d526723c20e50c202ce75c8cb0d98fce807452c9df43a29ef9a75d200db8e23144a26ef18f4f47d6b467a05b54062dc8de548424ede0bf6af4fd5a8d3c7a7a1f49e4ea257ef56a038b36567f2b1c0042eee4190ee4ca5df427c360e5b781b56ceb176d233e95a4c77adcc8d66fea14fdb0bc402a271a07dbabb52f852cbb5a1e1bc0a1a30aee332651bf75ae12fbef6b9a6ddcfb749ff309b167fff5886a1ee9ee01ea41ddc6188b440f8aeb5d5761a2b13a72d40ea9212d807bf81464ddf4a264ca4e56b795b1cd4480ad9416d8b7b011bb7fde01b8129d2ff1cb9171e1d630876fcdfb057e4410f7565a5bcf310bd5402f23ae5164d2aabab1897460b1d513254fe81d8612928ba26eef60abc155aa35fca88da163a9c08e3a76b0f141d1564828e42d30eb94bc053237fd582df3f482d3a70385571b44f6d068b41f5c29b7140b1ce61b9673a70cf5f6699e5fc91f163795d0c8a1f827ffa5395af9025b6b402e28d9f79a4144274f767d202aa67d47ecbe9ec073f684f5ad4db3480e42eb06284a6e60aa517d8d745b0b6a97bb9025278584cf26f130075d4b50c728329308fc07d7cf943b51d90d7f19ccc7dc67dd4d4093860cb700e15c976ec73763c561b9127c05d25762c6e774cc013ff0b07b7a92ed5152abc564a43c3fbd29eb6c8201ab373721afb52c9570294efd878a13bed727bd33a030c12bd150c7997bf383ca3b6647c86f1a714af178e1204554bb5d175e8f2bb82b29bc86687b4c2169d70ab533168bfd639fdfc8e5e586a7620972857c68f412eedfda43043001e321ce7172d97d8f323272e8cd74400219f4da23637b3880ae5dfdd0fb39bb1637985cd2da8dd270853333ba996d2210ee25b9ab0b7d5d0766d828078632fe556709691dc2a6112a0c41ba00ab2154dd22c9f8312daf67d1f94551722315cf23a64a2741582bfd3733bf4b96929bd8793ed1cb2eea3fca53c972fb43801a0ed60bd998b030e800ea339b431f5810402081e294567d3dab51efa91613cb9787aed9ed2b892f49cbd25cfff81a8a3875933aecaccec1d1d2304d876dbd3e1a2a3cda669e847d6a703d7ab122485b45a87867740bf6fdbf3f019b3ce067aa78eddd66b164f43884da2a98816f4cd732ee03a81511f08dd65be4e1ead5686d480bc7df941c20914086a99bf79a89dd7dc0a41c88e450ce57ea23b743ed2c7c6096598e85d77813ef5fa1bd719a7d8175c241bb2e7061dc383a7873f81e59017796b9754e0fe0c493db43515bd861a71fc28e58becbb1c56628abea6f8f81b3c0e2347d811aea75b78e9d3842071b0ad562c712907c431bbf44a3bfc02757cde35310af9cfb743260845f1ab538ec379d757f0401335a3c2ab50df98c7464e5d71b19b17fc9ce60caa9334f18c8a4cb1b9faa91cd92a6a74aac133db115c0bfc4bff453056e5958118abea33ea27396f779eed95c5be483ebfda98bf74dd3006b0a267d3095df9dc29efd589224aa3b50b11bc0c9621708dae0c6e6aa1a51e83b3cc60624fc9809e65b5e1d444955ee427ba1741f452e3dec62c7b4618997b0da3c96630935b371832252595404ff420a0e10809c0c02445138c180a2963a9308c50c4a2731c9b4b2152aa332276da4f58522d7b01b1ea4e36a86431825fce184f62d50d1f943f42b18cfe2da0b32324b102bdd58b433a90f27e7b235550d4811d61c2cd9e12953b702a5df6b119703c5796e73aedf223b112c906d6c7d88234235a344cf2e806e2e3166261fd7e0dc66b939b18cd5d1d57a74790902864f01c0dc823151a692aa47acea45698d81ea5ce0b2836118457d0e66ea40422230c27869ecf7be30378be63179de22783b6b913c94fc9b83138600c2c11bd2283f5b1c6162cf5f8fd38136bd3ce5ce119257096419a52a53ff8efbcff705f4d93bb496ec684da227d73db5eb2aafc379581dcbce01cb916c07d981628644dff7e6c3e698426c706e2dffeb80535ea0a62d16c348d07ff102791a93c5124719764a0cb36d276ea1c44fd95ef6dafa1098be68f0731780be1267a4629bb5dbce955e45bc946edb0fc8bad85be8ba5a614ca11ce5062a5fd91d84e58bad89f2dc638d07671af859b53b16a610812014b7d9f48ef76601833e1f6ff00e224cf0038f26b8eec09f5a63c8767ef823ca80f49e3d234cc8cccdb3af4cfa220bbde75adda67157c29541b97dd853cb32fd2d7d61bdb9ec333c736f731f869b198c6a54f541502e7c4662e55f1b42ea3f7fd2aa434c6ddf0bec849b0b2558d6b434bb077672af0396b9cc35e4ea24fadae195fce64ed9d6af10b57784eb239ee43fe0fb71a040ec5163140ae6a19fb3939e3b1b19a165cebebefffa7edf7fa985a7193d46dea829ed36dfbd357c198caf263ba66a3484f91095b797912b1a108de5f5bbb2ee3d6511e6476c8356fbc9e462a12198c4c12564a79f203ac42b3cb0be5d0a589f5e7d94dd7f23d333afdc0ff3b5c9c1acbb169e3364f6109275522daea8558c59b8976a67febf6d4008815d3dd50cc571d53b0d8e6441b9ccaf43c7023b9348fa7a35c75dc8597d0763d9f1a945e6febc205fa2c6faff22def4cd45127da80605cd03bfe58e7f6a62ce9464456c4d83bcd6b045dfe4d168c0b1a8416aa5d695ef2916deb49a605eecc70ab3de70f8ac24f930c1daeea6b8c9d7fe4738161afd4c6e2795cc044c295fc26415b529651c2b08511f4543d1eda7adaf33bc4e7f917ccfb9c268a06845a452fdcd928d090462350390ddfaa03b3f2e4e2f4b92715db1d03bb2fe4bc675b6024553c3f9ee704e1123e5678890b110e7bdaacf104a91859c56af5dedb5636ecfd8a7c2b3ff8eb4564fb9ef738675ac110f1e091888772ad8bb307273c2c41375617f6566025d89ffe4766c909b43be57378d3a4d908617f53bfa78f618e0ae6eec7d34d89dc4e86d8147fd831f45c8f2320843e59db113833d5da821d47ffa3d3974caf32e3345a096c37db8226362ec2afe7f759dfa070f9665dc3026a7d7cb3d21976f38ac739a04690b768c0b6ce45b802441291d0042e950b19678f9476269b66c9ca45540ffee0a7bc876d366600037a35be9d0b3232b63484c0c388cf1f9d5c2493383ae0a1d73c8d809188acf5365f05a30ced8a43acd7bf0a2f291a76e935ae3eeb94d02969f0883ed1243e29814df16fa2090fea57b4ef92cb3350b5f4cb16536e7d60bb857f41b476f8e81e71e007617a5649d7dbead0dc6e70410431b8d0a8d1c83e339d9b47f666f1b7f26f073c3781809608b9696e91955c8dc28ca72aa19c96c4d14122e1438d1ea23a48f0c58b09fdc87260ec4109a1a16fb3c49bd0b34ecd0283dd8a78d21e3a94aa277fe9182811971c474820011a8463e58cd8443db798c55a4af9147772eef75956e6245607378989e38160018a0b1c6e31c32937b761ed4d401d70024b84ca01d712e09515042c45e11424bc503eb1c347688f412cc1fa45751039b2bd6285a8ff9d5d30ded1b3c84ee70473b5336290be617ad9105534f49daa4c8f05623f918bbb762eb097ce0798530c896ac10d18f6257e48a306beb2908a6d3a7775ea334053e74f011a05c20342a0ae8f34209d9496a7f8e7a932fc6c9bd484abd280df2d52f7c82b01a60d66a3b616bd25e8a647d425383010ab1332b27841f0941a39dcee7eca10736de4b53cca8b12873e64d91472adbc67bfeb281690208371f4467edd7a0716c895f03edd66b52b6bcd4d60e8578255401bb34fe0646697fd597a029b59c7c13c4f7a087cf13cacdfa65e6a5f8848f24d8432f258878dd7be8095ddc298aed6afaa25fba123ee5f92211a65ba6214a12805f2f41824c2fbd3da36c68bc2b7b235c5823945d1314cda34a50afe54338671be2b14e0551bf8d64a06a3625e71364f006e053b3fee14fe48272ce234d8f961bb9138ea0ff221f1b40117d67b1e2a4ffb7964d5a6e793e67eb6220d3cec44af7459bccac5e0b0880165f288aa23b287c0984004a8e87418d81e30a74d0c18012487d83777803399c3173ffb9547d6bd1efcea70bff990c05790a5e4d7b5f675aaa7862f59ad987f6b8a89f93de61a7bd6d8f9c893f1b9e0e8cee3394e668d5c2e35db0277706fbf543de63d8f346147b60dcddb9503ae6062d8295361c8779147ce5df47b46bd9aab709b11ded14961f124ed19473d0ea89935aed42478a16c0f9890e7aaf6220ae85d8be98db63f5004c86c20dfa2355000811a8edfbc96a9d443511f4029d74c7e1805a9168d41e0936a710675d08182ecd31c9d3606c6e7650b2857e0ee1bfe747639ec42ead2dbad4b3a156a7c1dda1ce313db7dfe659e72c4c335f083e2f80dd081022fd4a8bce29ccde9be42dfa05be27ab54b27e51548266dd5b8878aecc24181fe621556890ee18a449f360d949afd15d3146341028eb2a3c1bd61bb35008d369dad89de362a935a757f24292b8a130bc36e9126337b86c2acd2b40b5fcf9fe7873aee6312379c9bf5c336699ed999a5ac6a4c2782592ec194e883f0238c997796ab01ebb7ba751f2f34e1d0ad674980dfaa98b41460cfe8f74ebd142f4a1cd3e5f2754957126792fbd0d5e3ea79da43bd60c5db83efb2ffad441fe0294820ee80f7dd06580dfc9cbb01b671fe0276ca20f901fe70723f39346c167963077fe38e0270b76556df98e10d5502dbe5b1c67003b483880d1ece3c2c1c4f8ca1e296e751f7b235268eb7d84d9e5f86c3fdfccd0edab0860443a19007310c5754d512a73e0bb06e56f1b04ba51c897122b93d20255d0618effed230cba90eea2831ad9941360c9069f6fb98d1e2b69aa01100c72138fcd4a90060f38347a087bec5b802b6d581c06db75f2abd4c0a92dead61b532eb6b8ef4a7bb5f1aa24dff3a82ddd051dcc1ba7c7154389945d8f52925811bc129fbbe82710b6c58089a6d4c09324a53b9b675d2e893edd4575a6d5e6fa84374263c69103726983bb926a74a80974bb63928af439ecc3a8c8d6341107d8abc24383c11fc3162ec0e6b7b620e54da121bab4a691a1233e43d95fb1ea72bd295384e232dcc6d700f665cbe6618b5188232041ecebe170791e641f4d02a5b0d2b2eb88ef5c41ad07c5874257058c75335e87bc91b926305dbc01b6b0171147f905b0e8bd0f8dd5e33e50e7ba3ea9148c4a803538098eb901c18729b4eb107118d754d6118b7ce4797bf792fcf6ec53e90e4781a274ef6011306a95c30ad69a9dffefe3870ebd747dc31c2d9fc0254c2dba38db7f8816a78d676e1762f0c2db5d52738737cfd97080849293bda7aa91abe5b47940bc7e3c31805a2f1668180e321cd7d6842eacbd6c84ed529c681b02c5b4a1a1127dae9ec2f68f65727ec362d24b949a1a6e1d6fb0ea78b9814b8b070c85fa17d1970a9bdb8ceb9e1aeb5dac9b764380337536a9dfb5a5b6ad12698b2e56b7c5244294ecef4fe576322b5859347c615a76970206936505796dd1136701ff82a9d6dac3c60da42080d39d50b3410324093ac96f90e601ad8cd9c6c352a4b29afd2c3e662bf17ac437283c4f2d1c8f1f0edc0d28214581204fd8d4a1fc69057e7aa5a51ec57f6b4b37131ef9d9e8045a88dfee2b8ddfef52d87feeb39587a5370c37a56d389a8c9d7072d0e0b56ecda03b7ca8350f9d341b803728b27e799648d0d79da9ad408184838b6e395f20df24015eb22b9d220a531610d06cf68793bf756fa95ac3eb011e863659828ee45e209272208332a8b30cf7310679c4ac14a4379975c9bc7255647c3e5468f339a8ac5086154096ad0ebb0c8ac65a0e3f0b2814ae8cb6211df7bcff7bbee8ee655005b23afe6afdbe6dfa80f105dc9515427aca99e5f8f66c0078361d04379e3d0791eed86528d477d65692c09c4dda50d1165702323990c6a91ec9f17db28f62ce661489eb1627ac61dd8ef4c8a992d67da4f44de5373715689d5efccf58e6044447105bc8570f8b4f6a12abe9c0b5b28c813b7313b66748fdc4186b85e75e4acc50921207c04187ccd19953388ab03851b6fa49417cff35837e98c62b4720b71c9bdaa345246f097ad045ea532f3b1524c73ee076fdee9adb56e5cbcc045eaaaf635acdd85f94ed51c6117aa105a6aea7e8552614140680dc116fa2c0d4ff78e6e7d73e1d33623c945ada2b714549f54749921cfe4dd96020bd317bdb4d2fe3adc712322cc8efb38d705b06150ae2d5cc862d54ffc6d665526d916a48637cbd727aef16685567ed2da77450c0333b4aaa42a0cfb0137e11f06e687837d877fa263e64cbaea6df38461282e78b345d4652e3c5112cbe15bca04f823881c234648ddb0d2a0f5b13e757c0eae48c5e408298429529d112dadf1349aa932c2172ee6e5ea070c0c5684851a4913e906a89af99082614349feccdd5fd0b22e6de52605c64215c8160abb3eee5929e122f27345e00091399fc98e8f93888ba7ed92807ccb14c679437e9d1cc4d9865b1c2c575d0957797a1c2137834d515d2525db7448bf99b30dd1d9d338b0f548977a222963cf82ed8088540c2fd122a41bc0ab16d4d1e74f052c79ef064a734965daba39f2ccdab92c171059db4c6c75f42ba079071a7494eda5f4d63bac8ef4ee7b30a9ba320078585f7614e6a9ade5c35d832f9353a2581b0f820220b34e2bf03bfecbb335293743525a36ce355c9dcc7eda9333a5d254e07e39d8d357d6a03df188ce47a4cc86a61ca871c150a5ef95625ed68520f1dc3c6b5738cfa795c633a5255053217ff5931c1880fbd4ef584fb996ac5ee84c837c3f4b09e2afa3bc778f3cf5d1285761a634d3824ae786ba2c4bf6177202c8958135734e576b5baf20734acc5cdda68e10497d92f3215c2fcc4169e107b1910ba817f3b0d9b3e412ce30881c80212c53a7aed63a8ff84deaf0408c210b50412ebdaa147a5cfd3ba59396a15ca175a9ea58a386845fa2882281cab59c76cddf5bad9682b88457ef28f17f4a40124504e68d062d5125a54092c5a4b420a7b619dea4e3e34cb75eac6af1b60e6b99c700fd6858552b484a181926df48a79ad941da58a66d12a92082fc5a19de7c4174d03192358b0338105dea3616cb651ed15fdbf96eccbeb90ec9601c36510ccb9f840e08867fe1e5ea49a04b3648c61a9deab76f8d6e5ae9e0f9baf4761aae4eb76ae8a19fdb78ab955546272e0796afb85186b8708bdf13cab03e3339eb0852408d55e0045b50145ecc024bd597389f2255a9bf0e0fc1750784dac4f8f5368e0400558c278a96a21477b2551c966c80d56dd383dd0806d15182be01bcc30fa48699dfb7bbed32a401bc9639cec0fe7caaa2b7b11ebee474325c190c341dbac646c24d0fd6816ce0b640c3a1e1e4adcf594f140e6d22b51ec6d284cb17baa2ea5622fd4c528c80b1062a7b0fa413a5a04a0015ee59522f51b1fcf8dd2e0678a04242ee808b6939d4b2196112913541dfc3ab1b5e5a03a3870b5538bbbca7a9322579f1847e684409c611fa65d8d64e443601219c3954afbe63035d75a9f41fe930a5e5ec5c6779d5d3dc61911bed2e1a915ec12d79fe0af29bbeef49939287fe81d224ca13e881279a00482e404b09c5c69d79fe66a8ba5c91d8d62a3a5e5d945b9aad32a0c3592b664caee6a15ec2301271a697bf30af08622f3cdefa2e6b45180f8b443f6d6ca4125be2fb0ec6455bfcb9bdea6aa5d8e9ed0edbdd84943e47ed11502074e1b6ab079e82352754b988c21d71dd39407a5b556dca2014d5b85f9ab74e1a167c1821f14fdd43041d3e5870b13d021b089ad4cac1427242683465314360e77560f717f4f40e6e3e94656e0d321143f506c48cb8ac9f6e6a746a4b203e74ba3ad08fda6dddc97c1678c6b5f509216946a59f60016a090dcf5f9553da92ac1da1353f145583441f69d6beb7cee41fc5b80dac36513aee2c8e1008ac3702fee6b8b3ba19a19ca7a7891458575bea321919c91ceb2c2176321e6cd706ac20964d7d5e49ddcef76f5ed739a7adc960e49b9df0634877b47c7992b351938608963993f2735e0a5947c30d268e0e06154f25cb5951c064fc1b4933916ed84dd02134a53a16fb12461c1238f89b51215836a661cc7106c88e8e0cac675e156c64ae6bab494d1790b1c00bee2e084f95535fd7845cbd02cb8882f606a55697690df82eb284214ad23caa428ca2bb859740a4245bd5a43302b006be244fb62013ce3cbae9489317a560045eb2058f164c962f87ff245cf38ee636f34ab6630ca3810f7c5924531618895d71e8a2075a4c9736228ed338635b98f95bb77f89a4505b0a473d96a653e2107227a20a5b8d8010f9a0c83b268c159d6a80582193641ce7cc57c230e862ea54c1de9017eb222fbd1a2d7f24e6dc25fc61ffb12437b49d75442f9ee5320754cd40035425b07d7050d548f2513610acd65bbf504a07d2447b1d20f48776ef988721132d1b9f6d1de79a59803cf8700f987649a58785ea24e9552aefa1dbfcaca5af3fe718552f168b535b698fd0bab2e33ec483578cb467fb54589d2b2562c266ec375eddc6681645e632ffd242eca479e9fc4f05a0a308262d7f27b8150e0b7049160277acd14343d01e621a604720bd0fa889c77ca714ec3e849153e1969a91cadd35c5a0cb1bec3a4f9e508f4f60c7c2c67d2beaa30f32d992d6639644aba22b062961f3b66c902a4288849f365d45b1dbb1324333ab84c1b15b50acffd9d56641fc41ea4c9cc2175c56b9461ad255c23e62be7cd074419e6c9591ac8173aa08727e0f9fdabd6ee3f99882bdb44daece702f2e0d3e80b1aaa1831881a673adcb37d455ab3dddc5edf5796a2d6780175d9991c0efecb4b264bbc5d608114e06de9b549ac2535f50f176e083016e468d339a81f05aad73d19e3f8899b04d4b25942c193815971d2e365913a28fc7034bad91e25be8e43022acb9d4f9667646e5b052176d34faff7fc7936b624ee4f4bd56b3387e6b88d673b14709b1b323556132b70552b3bd3cfea302c9a4de8fa69b22e77e936af36e1a8b9a0399083a36a441a625018364b881b4846d0d9fad774ab3b2f0cc82b0d8c4c15aad1b676a21cbe101b079bef62463d90444a9984dc8ca18d7ace29fc7cd042a13adc21a4db9ec3ceb19900127346c818321e36415a7bc084b284ad3a2d3687b0efeff9f3b1a6f7a3a424c474689e0b3c38f36f28d06efd16087f870c2229d9030211bfa2dd7a08ceb43f4def580df6e343955fdd019027ae0ee95028383335a20b93d92ae7f7e0b241b4580eea6a9ca77f905a02d5abf2f43cf0d9c597bfda0ccb580a56a5a8ace0820e676b087d131c56e8c36c209531b0ae443d60f5f99fbca600e04cd751773b20f385d5071d30e84833ea834293eb6f0bd621f909cf9b4a54add698dd86ca57d150b01640b19989116080ae13d2f923d6866b19e8a96aa42f05beafc8f76741f5729bbf9160d08a6010a7728b703e557ed3fae1a42592a440634620d9a1c6ee66ef08e9fe77619ed21f611093af3114368140ca2ec940fec1bde8620fe85051bb013cd4be2267286126c6b8a3a5ea05d54f9cbb448b211348d632a514bf44c25bafb565e13efd242b92f89561ec2be46b5198fe1b47127d561f416909aa6ae70cd97cb865f1ce8f202d93f093ad7e38fa64aff89e87e434167e7f363b0c5f1cc877246fdb3cfa562c83422c08d972c32bc803aad2ed5b3c1769aa238df30d5d6860e0ed5afb6c4fe8147bce3d11c1645481096ca2fa603da53863da502112fe6259a8362ad89c0fe343dbce218b7c2524e593522095620c40776bb9eb712edd7b9347034f6fa13cdd78c19fb0794f14094d794326c0ff041a6780454c056058fd65feefba1823bf84c24da28b91f5ada4b81043437a819654344d55da4d72ddb5739cc6a66860f8daa9564774b2684b9f2d276bb8a7b0e9043241ae54611faed626416866d8337940c64fdb9f0a8a12874405e1be5472c1bbaf3f9c345a3cedcca3d83e567f20e0109a9f84307e82eec4fd137ceb04b14cf8247ea0610a73c6e80800bbc26dce00bf313eff5564173aa05b3c101e94a6cafcf3b6cfc52242b65d85db951e25f206f3bb00b322f45ed26961ada927fcae54803dd4514dd424dd1188d514366b4a980dd2b4a3ce1fb78eecc06701c220527d9e49a1b07230a091d1bbf6aa6bdf11634c2eb85b00f7795df526c2d3e8a12c40be33b070163348c397361e51d8ad2924a0e0cf6f873ed74a6dd601cc652ef6d5b0e120312c1ff8fdc76223c8ec5ca5524b8d66cf991ff5278cb6d2f1661ccd0e00f008ae48f55176035f4ad712b5f427fb4b43c931b8ef0063821a1c9f3ea319583b4730682c66b52d114e3631996dcce9372928ed4fde67953024a941929ea0f3ebf278ed98182eb5c0116b1210e7ed610a8894be9f57ce6f1e1e038a81ff53db854025b551376c93a1c9888ed10408616cbb6a81a3adceb6c2c2368cfb4b54e278edf2a29222e4310b59fd58cd266d420a2510d3d461a65f3bce09b243e021476f928509122d9dee692e426987547ab13632337c8faea2ac3bf885f3f54d75f48daa9db726c4b41836fa9442ad8aa7ad4caf1f9ec3cecde98994e88213cddba1aa24ab7aa7bcb064b413ebcdd925303962e9c5e7cbad0ec7a89ce0ded2c36be15effcf8a71b2cbd7d4ccee2f7ccf2da237c655de7409cd8424cc018e750ea61f44ba56f73afb49935c99c8f67950c05167da6104de81190ed1448cd571165bb2b464aa26cff4d81c571c3a8326c43837bf44d2ded1aedd4c0045e15b4785327ceaa86bf73c4c9fa2c158f4873c3e104413c599b93b9bb7527367b5032d573f752aca849fb1100fe14e5c2f8a99331e872ddb495e822ae991769e198ad5c051d458e93efce8466a0f8046a22673fd88e0ac23b1d88ee7cc28622dd764763d421645081f1b59741165855a6c3626ca3d496cb37f4485d08e81ec1f6247c85d1f2daf1f7fbe91ac96da46f2f1f0ea422a96051c165125e3d9bc988aba3eb7e1afd57e12d2108f14443b185f568c4e1b4f89b06414745ba4d43b5535850f35dc1ab68f9489ee5a9a87e8f752f057a895988f1a42489b5dedcd6579239186cfbbe1cb1ac64710c6eda1b27d0c33d7635a7a2485e830a6139ea1e053d853358e26b82e28f3284c2ce20d7c56634ac373f5a2c8c3a5b294b1aa936d1538ee4f7b67fa7948cd3e1a9b5f78944f33b856611ec3a520e1c191b765eb50a63e0658c207a0f3d0ef2246a82f904119062df24387f7f879497e7edc34d2dbae43d6e376e628e7bd593643b63a083c927d3385e4e186ccec044059eacd11489db266ea181b14877c8b8bccc8987cc0b94d154142d998693aa92cf096058def4078ee143c9c123c61ed40a71697a9614a103d59ef54b65357390914716662230bd2f542a8d1c3ff2fdd732f209f029198bc2de5d3376970d01180b5b1fb92b2536922eda37bd1ad026592290773660a918a8e489e791dceb4b313508c551839b7bb0436ec40d02458bc38845af385a1fdf6214a34fa82037ce56aa60315639809ae6e6223ee5be4df530d1d96d7d9e3ba2d01e1c3961f0f3a17210eb4235923957f0a25ebd231562f4e8380e6f7dc22244b1edb9ecc2d3b223afc285535146cb20b5832f82b67e67ade63b4098dd3bda0a063720428f32ccb944262c1b36caab855487dac35e5995643d72a4edd22cf15157e666264d11f7f2f033290940c14e18b207a322b362c734abaa64bc582224bebc5232249b90a02c02d920b53459d51714ac3609603ea6199836fa2c12dc7425ea28ca80e1826f30304867a6b7d87573f253149b59d11ee14bee41af95b6e5c560655d3f0ab70fb782013b5c604f2fbb67470f96dfe8b59525795a646fda06b44b4d87f04ffde135ecb2411dd371538ef9f0b629d8ebae938ea3b996f4125063613bd75b1301e1a07869b76fc1586a01d09286ad10ba3d4b6178457cdc03bbc5c4e5c292f08912ccc0591b5f2132717343148dc1daf0ca0d738622b222c283b4f228df60b56813fa5ba07ca3a12eec1e1a78c042eb810d53791efc8f3beb814b818a262facafc0dfae7a89e4f58713f94cdfe440382e2929f845fe6d937360e744e996405b4b0ad35c8db9748e04c6666ef307eb5a0c57025a4310c1427ccd4946350588b7014922f63bfa77b96fe1227242723dc54e5e17a68865d4d5f00db4f0415693af65220bd08e08c43f141075995c4144222df53060f47352b04867155e75f76ced424305880317a65457215ceec38f231a49568d0e2af87819aab0770c419d1325588d117574081fb585f38719fb34bc806c6a9bd12c287c337ca6c2cc8bbcca630f0902ae24fa4cb6e783945245bcb5a07975fce87fbe643a018b6181ce3329607e2273e3d455ea2c477f317de3c5991d758857c482c224d8d6501ae08d177b8933f8a7c20d982c5e8d3f5154f1b8d96e8861bbc9af054e9b7d20a5c7cac30b0e52097bc164ae4f9bd82140ae44ddc767b269cca0715dcef4c247da12aaa205d165ea69921ef5ed4146036347b14b81be3bc5a5c5cab536872c5c1c7dcb46d054b5a0ab13babdb7dc2faefac329293f1611a07b55c5f890c3e3886274634c1fdbe4250f2ef1573204a1ef74305ab149389a8c116e8a219a94e62600cff6e428ff8b978a4a0be3a28524cd06031c863f7e071e8db536da39e42c08806252ebc180471fc0059986892b49d0342e30aa6598295208764c740b51bc0c6089f53c8d533c9a4038144e7821c929061474886d8900cf5231272b5b4281d07ffb70bfc8e1d785ace02089831a6a6d435f8649ac9e1f2330e6862459bef5e789f8e5020357e6fb80a0066297dcd2e48a9c5ca8efaa1cabba9dd9b3cd704cbe7687e24c562597ec4c6f92726c7356ab3b4e525bdb7a3257f972f07405aa19ae6a218de2e98c9cbbf0e6c9a653c9318c5897d1472c0c8c7769f1843b43186c1fc2bb91b7851650f28813723e348388f0a663c7263a2592f1ae7c57cb99f3db8adf8b5ebb780c2e53ab9529151e51e2048e441d9b818b5f71b868efe91cdc02b04417a3719689880dbcc1d81d95edfaab343a20c442e38ddee64121141c547708df917cc94b294a70e9cc647c0af26a6256c988d5bd7cafe9e38d081c8093aff1d60a8e02e978a2b97845b26f2e63103695a478c8c2161d0a3f421719414dd87121c498729dff0df521e2658610cec2cbe1b3bfe5c95acd9a30b5628f46a7f2ee6958cf87ad90f991f6f313023908c18e314e6dd86ce8b0fe78213cd2c7ffa52d02aaafa8dd1f354bc6ab8af4d709e318ea6dd03a34a32bca1eefa19a2403853718f03c5f5f899263d8a110a07b07b73313232b56d8a7d47c7dde4156e1870317848348857af58ddc80225744bba24cec5b7d5014fcedba448e80f5b044df26281160aa27d594d07706d4beda1c28778ed61a9c65f2f80d8ad435740d84c085ca761f6312767143ef56c6dfb03928aecd1c3d9f96b085ec6db2e98d12f742bafe36f8a15f8375c148b9e8db6c50ab9b44f7735ddfd3bab6a0437986ef2c060b34320fdfb9ca75800226be20fc08fbf050279d04438da2c4dd1c2d58d593810439c412ef884550e6ff9ca16ab71254b335c02a52be79033700540dff436d6822d2e4ad736f12d4c220689ce9ec8bc7a5e07ca2729bff24db3acf0bce65c90a824f9ad796185ad8feae1833ab54eb9b70e91a3de1e694b0f30b5bc8293bcb1c0eb3e652765135318f0e5595ffe3831804f937d41d6244a5b0cba174058d0f25c73137ff05ec9963becc8273a4cbae3a964f906ea4159db2df79c750ede0cdb08838623e05fe32e36256d86b727610f5ce485a17118ba6d83d1bfdacebfb7f7bf538e962150b250a32552f9a94f633e6c71b75f53b84260571d4d667fd64f3f27063d2d24c4ce54b0f090eb2c8b88b0a8c6ba4d516c2b24452b19bde3d9e689bec579e8110e3ee67948d33d807399a0924a757a51cb582f1cea360081bae38b7b2e278ddcb3d8dfc40a9a387b7dece0adfd9c8a7f41908a8d427c17b1d6595b0603115997541253a59b9865cc6cc8426967a45d321eee93d0f15f07fd83a2094d532b2f3d441c30caaa31672f3451ed2f206f4ab8de7731f6e58bbb633aff33b93bd5a3cae18246a8540c1d9166a222960035b1a4e2fffde623a2d567795b34b529d7eb233121e62cfa3a634e21e0fa9354de13f3ba3d7b834ce44b26424900317789385bd29ba192eab2574ca13616000f9192b1854ef3b0d7aca9ff3721f6097d8f019e2873f58ce7133063b3d18ea24a68b18f618229614056a39b91d0ce5ae651dc0db56e8a18a103a7264d440802aa0013e58f1908e5bf65c3b3ab0692f331fd08eacea6aaa18a00bdc7d054ce4d64d3bad66ee9e1d20a7f24897268765ff137627cdea99e00647c22c3240ec7ea650e27c95aa43fc31a70ec702585a4e23c684c89f54f216c79d2284cec9fcb52f58cbcfb071022a892af658fc091c6b5e4283e2a0a816b681c9c85e2f4566f91ca8bd1e30ef09b57d545764ba580a2fc90f2895382836b37d611f0de88fb2a1d6fa4bff0086e98876c675ab372e3677e37c6ce4dd5d1b16b7f2ab72bbf3ad640ac464abb00816e22a31792c7ab35cc5f9abcef3e95062d0a9afda1b58a51f0265f520f25a54fa8b2dacc6295f8aba87f15c9045325dbe6b30b84e54c47c7a9421159ec3d0aaf0f3da2cc712d76891a5b58bdf9a320b8b34025cbd998a0c12805b0975f8f515d793de942951ac14e9c98caf8ed7de1f25d0d7947edb04ed5c850ec0d798ea332f16edfee3e9a521083b7bef331c4d828f192fbdc52127cc46e0ec097c98e5fea94b20f43dcfd95690ffdb2a5550838b3b8778f7b3a844ca8a876bc9a02c282f3df441bd673a61122b9613c10a89629b4ae8a4e00d5637a50eee43e42882e24985a60a24a3ccbd69e9b52b1a72d9bbfa787a7a6c10e2aa25be3c94e64ee1119eb575fed07d8d53bee49fe6819660f39c13bf740c0520a433e495a37f0782d55f58073a73d3a068f97598a63c5028dd37a9f1b9caa638d32c5dd5b243667e3a6e66c834ffa1ff1301d2f6006d59f69c7773e2c688352d7bc497406fe2bdeac0a8da9107c2dfda867e0fbd459b58cc06dd4059eae5ffdd0d3cc8d23f32eb0df455b92684069e31785ee6c1032c46c4735d8073630d6126c068ac6a0d67b4142bd58d4d58d27440ad3b2cc8a63b278230dce10211ecea66e38c02b0c7ff75fb519484d991753245327ca3f0ce45a328f6ae7d959659f55eff252de5646641c489aa2f07ba0e886097fb5379d917f41c5a1e792cf27f374722e37709d9e795697ab001659c5466b65347bf3227a97abd84e216c793a3acffa6451685d58604e025cb68037fa1b6851c8f03b61a0674d4fc7b04dee327f29e870bf560af3b495316ffcad2541ee8c15a42b7bc97f01746cd8fe122e1bdfd6e412e75ddee9c7f97892d96d6bd6c753ab442acdda456dd777c99605d2d3fc0a4eefd978a76c7720c874965a4ed388de39f4900fa80771343f6aede2910b89db7ebd7a02df8f1bfe523319b60cf28b52d2fb7cf4dbff4649b92d07c939ec5f0d6a5348cbf6b10df0797e34141f514bee887a39727346fa6ba7c65831d6d09f80d50fc1ddf05bbb8f7087fff68d01dcc366e8188e7dea04a7836faac0da831f532f352b5ca062163d6b016c5df4abc77669f8a80805bd9f4d088babdffe4145b747b2d448fad3d73323c3a233510079855f934d37950fd419fef008790d2cf7cc46b03c817d372e167b535558b5d76c626fd7894cca18b84d5e380df3bc84cc39ecd21e8546444e53bdf86eba131e555d4964e191d72fe31ce0cb63db26d958feb00c20c7cba2e53e065ae1607fc299f5010c855b3cbabb3a43466281ac1b42b348e964dae664c1c497b8b5c5a5a6726d4e62c32980c05f7b20df7bc4b67f34ab01f20472603c10fb2cdecd5129ecda9d2fcc903be6b06d138c9026a36ab3aa5636bc819b16e848b2569446789f8c1a408e5baa9f4d9185bd6068cc9809a034dec868b0dcf34a29b4bf82302885855340814f3946f4a103ede4ce71c9cd5b758caae2ae2a9eaae150a5f22fdcd93c71d8bfd898509432781428ac8dc0e105a94c4d7224e187902f86d316e1b1ec822f67abbedb941a4b655129897eff71694f8c4b943a48111230f06b5e4365bd815d3b2acf4e4fc8b55aca74e7d66e25183cac47d829671a5b4709ad844b8028e0c5669000081a1b71b4844897693405b1b1c8986b36b747a71622cb2e2367bd76e270b381a43e83aea79e9b9d050783b01f5c8d5ff6156b2ccc8732abc1e0d6ced5d5257c5403a3f13ba70250996fb9ee75387c504f0518e58482a03496241e1d82d99698648a576116088c8efb731ecea805ecc24e8a67ef6d7509979de8b8f0edc6c6a06aed97d1ab212c35ba2215f3e0cee575e947fd99e2b089aa05af004b96737b5809a9f92147870cc37dcc949bc7bec032acedaceaa63fda2c7fc851289bff410f280beb05a7f206fbaea98eec04245206dd134b2959c32c4265bb680812e7528f1c2014d700fcd033ab29ece7a6d46610bb0e21f612911d8ebaa0014d41b8bbbbb5a6a4d40871c3753110d3edf7fa44ae06991618bd89046ae0cd275ba171da666b9605fec76bbe0cc1ecd1f42923b993b7500116d1c8f5b2cf6c9787b12bd237a1b5c93ea482214173699c358a4f0a462a3223e87be0667e2095b05eb75fd563b35827e848719a6b26fed5a7513909d67d5ed0c1922a85addbbabd16bd5c6f6fc344fccbce86c8785995012942e147b6b01ec97d4473ab06df857f06a74ce314d14e9cb750d8c99c2332279b302dba6aba8d0186cd9f29361d6c4829ec5be18c0c6082b366467857612bc6679cd6a9da2dfb58ab8621fe29ce3036599497abec33144fac42c1150f0e628b36ae1372260dbe3663268f52333989db0c3c10a360fcd2a180bfd127ac3adc733327eb6a20563ffd69ec1f91e237f94394df8b4ea62a34042d7a785c72adc8d8bc64f367b562d61f5225b20ca319f052be1844e56d0e6d006241147de9e324b5015e2ada8b8e8ca95ec19d49cc159f6422ea4298f770158adeb1d0b9f2d110722d6a92c8a5c4d2d708afa2c577c452c805d2a51f5d5abfbac549817c776749c220dfd636c5e43e14f79ad1280c6f702a31c3a0c45cc809870fe06d1a964632cc0ad82a6808cc788a4dad61fc2d8610d8f9234063b1e93f3f64d3d43b8c4ab4beb11250a2c155ecb5c430885a6756c20aacb9ce1f71cafb18e9d3ef6a13f2d116cef53437d434cdb43e97d807f0c2b1352853465fc3cba79c6c2a00bafbccd7f9ffbb257cffda23bd7ad0a2ae6695d2e6bba99bd0f282bb59cfaf9f77464feb86a1dced9834f586b7b99381c020fd932e3a039c87c8b50564982216f1ba33999edb3e21cdabf3894844b9c3e25df9d0147d13c0121c18ba254b07eb9a49515e19fd6b833b0e3f7e3b7bebdd0adce8a116c383c065a8add4ab14faa23b932c190ab1365023932fb3a791bd2f5a710876ebe5a3a296300e3bc848f898c7f69fd05d98c6b16ad9d591cfc614f8af37cec53a0342fdc5a944403e760a468259419f9d78bb0350fa48216b2c719f0d28edad91fbdda89131ecc6dba4e6c6c3c88906c0734135f791d0a9eb86e4c032139c48b36a67aaca655b235e278caeb7d733dd8b8a516ef42e171a268a65378f9618b7529a8ebdc37108049fdf0217498ec0b05c73d083a372f5053c1c044991f6e8d7f5453a6140ab081486cc155681ec4ded9e7a2be4453080e899d0e57fc1656429e9a5f42883e987ec9657c3b12c0027cf016ac183db015dbc6aaa43ab1aa05ffd74433ac1dab744d9c20b9ebcfa4bcf9dcbfebe79ae1a230649e60fd4820a7254e45e83f5993b1f90162d8c0e52731845d8332ee4395fc50cb996956fad060e62145e3e148df7d7d9055e0f43fae901c109b8a395a5668d6346a8ab27f8d35020498f84d40b2681888be42f64b359f894cb2004bdae4d1a72d7b66f12e32adf24376f81f3a9614e673a2080340931f6a68d0288249839b11db3f0ac0d701d61c169ece0c6bf2a0028c80dafbc431e5f71df5d6543a8e657f62596f04d807fd2934c590cab3f9f8aa85b2f86aca054efe4e026127564c35ccf6008765203d8e60b64d30cceb7a4aab2feeef1f6b5ec736d476b1639a33ad23fca158bb928db7d6163ad1ca7aba4db24a2121f0f05afa3af266517244eee33ee1af5e6a88d3a67ac153a0aa3cd16a28ebf72a18665ed2444edd11515fd8d8a66bf436ea46887ca1dc9af519dd8e50ba790c0027c144c4dddfd495d51425d520101a512f3a1ee298176715786bd1bfc4e2faa73a143713f45847ff96c836c76f535babc622f2e9b8018df54396e42dda8a9b016f21ff732ab1e57de1d9b077df4541881bb51de0bcb35d9b1cc163d22d3c5cedd245ff880ebc3926cd736872420df6907f2582807012cae8d4fe3d9f33d7fe113a8b9cf016323e90a179085cb885a692f17d4f9dd357a21366c9ef62b3a25d786e76a76e938d2e8f0c239d25ab6f436aba29b00c57919991353d60ad54cb2e9f8d42797f4faa476c2c446ecfb993e06dc5a03da61a67d5c304e425207ba3ec1b4bd89a2044a5f535ca4e151a1273c6235e4daeecef32b47dfc4ab28c2684a25aa382b33e757ba0220dc9c5f9c38007520e9f89bce2be189081b048266adedb6e6116f020ab0df56552116db36d9724b296592295f08b3078907b7eb29a58ab27d5b8db27d8bb34179ec2f4d4c2c729104ea9756f373948c4a5f524529a36a64c2285511f5d5d0d713e60fe4d5822b6c3114ba1680d022346c398aa1f0a216934ab4a86216fba8c9573a8a40812df65593afa8912aa204c53e6bf2952bb98293c5becee4ab1a4a9490e162354c001484acf2f9c82169cc3499dcdd3f764c58e7f0b54e151b9c93da9ad9d1d5274d3d690dfd2805e143fbd5ccdb20886b6abcbfde0a7ba670da9a9a3f89f6f3f735abefe5aa73cdaa3e8fd27f7f411ed089fff5afd687b7ec7b27f678357cc50738cbda6f35c11d48b1e90a877e3bce31a15e87353dd14ad9e511aca4f63fe3d067e5919577b83571f95ae7eb6c085d3781932111218810b2c2f0260621f85459a13752d04aa5da1b1a6c673bdba984c063e39a04dd296f08a5ab5a41e6aff9b7b39ddbeba5008f8db33efeb2b2192effc0b3258560b4e0932fbf78913572dfbec8208760a2804932c15801a688ceeef982281240a45ac97d7b81101de4bebd808bb6a6dcb727a8b839a27b01038ddcb727b29073827dc3c1d83298fb761404d83b474e72e8accf3b1951ca01f3e1e4be1da13199a42af72dcc4f066b1ca4e2c3bd130213baa424a43c8a80a809a02cc50fccdcade3cbac0921acb0753f34d038e677252bb9c0a39c5d2ab61d377cd727432d548a90b0d0f196b41102a983ca7a6c8a764c982b876dc74a74198490868a80fc4505ca0ea9a3fefc9e09eb7e7e08229830dcd1ee9b35612e390b67277a4c95021ee5cc02d1d106d115a6b6dc00a8e1c194933aac2ce7c357e9c7fb9ee9bee99aa4e98a9ec9640a52411e1308d2fbcfb4a2f9f3569df7017556f73b3c0cfbfacbfbce248e9e78bba7b9410fee4bb1edf7f4784260117ed4173e1bf08cc003e8d39f0d70567fad629edd82ef84fe0fe88cd286f3417ff79e67f6dccfa56fad2f6bfe1a3f84faf7621c86ff2c96ab9354badac45b1356a15c7c43fc21eb5d2c2397ace5fa638e3c86b9869d59ae1cb986305b550e29f1cdffee8e92bc42e640004b07cb597d83356fd0602319268ff24b96dfd9a892f9dfcd51ca21c3a07ba5873ec0602bd6bc29a2af5fda031e735433d2e808577359d610098f398a5cfe9a5656728190f532435213b32e05207254a850b1e206a3264d9a2071ab6292f8c9cd44ee9b971fba2b88f08873289356484a553ff677cb115afaa3ee518fe768296557918a16d57f5d2ac0b3f610997e05792a7db9a2b5b1645a6b77f7d7f7eeaededdffb48ab54b60d145452e4a5dd4455d7462812b964ffadfefa29e0e6f2eecf20f78ab1302f774dd0e97cbd5492a527c468a7c1272bdf4fa0812ab00df2701952593235c8f5f4a29edbed8257112f677f739db6a415d3e9d738a381ebc147d521d1b4592175491e7742470c9a7f678c1d621a1768a9016e6519de242d7755dd7fd40f9a182a73449d20386202e40228468e921072d55f2887f052d420040072d2dd800095c73dfb470296ac1109d25b0cd7d2b134499150c418262cfb3f072dfcaf0406d5bae1cd151e18a6c03293f58b1821fc4b05498e18725703f102141c136b9896410224271852d86301bdcf0979b280625a2e04243152e3ba0808b9526b804c142855764ddacb656df52c548adb5b61629966c20660b1079c438fcd9c0866c4a81cb5de21146e5be217124c90d3a346ce2618328d8e4c3063fe01a2100c002125d44227c0a93c7c761725190e8c2868bb200002e10330400255c8c8891224887872e6210d40518a12e8a929e9499254d215226c90a92dc5012113294c92581f1c9d13c58a176c499aac30ca334c87d1b93452ee5be3171441ef17b9a30946137adb561a4b4e0480021f356cf80a0610dc084b9221a8501228d4d831818cd02400486919bc8c8869fce6db5b6e2806f6e2214a0d1a0086cca4d84822a64c0a5dc4428882208bbdc05ae00059212169c6985323f1ed2a742912b44aee483a423e28b0488108389cc60844604071f19911e5a1022b2029a0486082252840f04b8a01161c24702598e888c59220121686f63266744124ee5268262850c8e919ba809241b54c1a8dc444ca0098998283afa5b6bad9d49706981258f39ac784ef2d84558f2d846fda5004440dc829861899017abc319295d9e1f063992040e3a48616404d782d1892f678ed8a2ca181a6273a2ce10c92f72dfcc982941272b7254e488ed678530b8d90750003139f2411899875cdcbabc207767b5b55a00f8609cfb36e627002ce054930d9a58c19d588f6432590b754c10b9d6472191cbdd6505a3ce650d62c05feedb989b0e164c73dfc620a141122ee5be8d5902cc6d4c9800ccf0cd7d1b538695466788508669a488a20115296e797c2d7895fb26c5131b10c19ffb36858ca504ab72dfa600d2c0093c23f76d0a15dcc81c890965c8059eb96f5d923c2b8d171c32cd7d3b534536a50a0d3765089fdc942e46829ce811046d0a99244053b84862bb516921490f9bec16851136acc818cbf5baaecb017751b513d2893ad0a04406e5a6c30f2f0ce9e0424f1533243d648e9018e990850b3d540ce1c87dc35da961011345413202ce703d66396f751e2f9692421129478ee0a4c460a44711231dc020391264840b38294034201da640729322e4d383852029b420295b7c7a20099af5f09149314ad2c3884c8a14487a1c299a02290a57d891f184586bad3df30961c11821b3cc4fc6b96f6586542f484d88908cac1324d65a6b5b892998706285972356386373f862a626851c1cc9054cb040bf0ca9b5d66ac150b95cc05c511224851b9828810222685d143179f87274b97cc139d2992a55e66c92c72ea2c136cb50c9796c3373c809e82b0d15b4146c46358c89cdff817313d1c0247bb98968a8795fe8a5a10c711624a0d0d0a98b0ba628b31adad10b5f0f32903683164a27a099841cf1a2187db72d66b8506e259f59878221efe705db43d17502439d32ebaed00908cdac1149e6507d2289a3c213d86807ff9550b0f9d37f5f8e6caddbefeeab09332929294db6b6cbde571366b6a209521c655257bf412bb311a3f8639104a7077f823d4e228e0f50c4b140cdcfaff9696bde411fe0685fda8eb9e7a626f2f39f88726dcb3d24858ec636b262455af1cd59df1562ccfacfe1723d6047083db3e53286d1e023e912e96b1d9bbed17fefa7c0d2a69452ca79471615c78b270e372fc6e1f04b180d52ac60cb1122908e880501420b155db820459520a29804845430c392e68a12601173a22d643e45d8ae60c12de6e4be6dc2ae782ffeeeb2de725109492925eac8a3662e8eb548a64d198f7ba18e0cc9fd5548bf50336739caa8bf9b4beee7d1b053ce000d6b1dfd02bf7f01cd807e9dbe6f9c64ff1147ee1b205a8753e41bda6c79494788c39fca584a2969a944c11235599047ca878247f78df134cb6e43e377b85c39c979273464a9b4c34f3467810e907f4b349fecef957e87cfee823cf2c75291ecb22b35c9b0018fa70af228959e478e589af13436430482428c86387a28239451ef14e919ef43a2e027f2b19cf7afb3deb1a935502b2f1e84867945632f91fd75f402fa65026b4eefffd361394cfdf865d4e3882815a438bd94170e0d8562a40ed58f6a365b386178bb5734ec2627718cf846089a7caa9d4e37b4138ca2f08abe118226fbc3c0f91b156ae6af5a431de957ada159fe9589512dc926cc2bbaa14d9877345b52877743bba1e156155c756f5addff56de9756f76745c9502a8443a118198af94aa552a91476e970e82637613344554d15260fcdf8d1465439e951559bb1f2986a06238dc4e15fa240c39029197f3a9d4eb9ec0fa368c2fc61c0b899f92b1cf29b23fd0a7f6896a3c45106c68171a4829126dfd050b39ba30953cd6ec4f047ea40c9240edc84d1106f7232c451460c31bca570a11987a96a530c715975436f31e4af5aa459f2fdc31fa8155a1bf9ab6ed822fbfbab66130682aa3661a19925b254cdf2bf58d1a1be21efc42b18b9d6fc753373560dfdba39d22c7f47cdb2fb511e514645137673743461e16db6d2481daa1f89c3ffe6a828cb9081f12dbb7794553fd9bd34d931c618cfd88b558c6cb3ea7c9343c96e72d9294a967dc637d843d2781aa3312367557ffc00b40f9a25bf66c5a319d00b681dedad4c1815e64c9c8425b990b2e754422ad789f239a594525a5dbaf5d58d4dfdb9b1d2d5dddddd8130ae35efeed3d81581a010eb44e935a8021d51f1f5cb39e79c738b84d5da6c0df5ce7c398982c892e62ffff1176d4929c5d126dbff64b704bbdb5795569b30af5bfd30b0424c14441c618158ae5638800284324cc263db8c5cd255556e94d8e80d153e365b82f97689bdae92ab53c560eb6cb5f592c163db8cbec038f0963c9a30d66cc90993dd41d561b55ce100429717e642dc84a1bc2561d75bf273da02bdb0820df0a2beac455ab0f4708971010b70d725007e0394be069ca31ed92332453928550c0d0d592a5200868aa0214a2ad2375e1c0fec132531949b2889a001e426f2c245be26257cf2e7264a824cfea869822b2a410804a975029d4d3583a001b5f6fd4df56fd5c91e78f60f0107c62039ef7010ac1dc13ef540835c3fb7cea43e9f07701325f125895b96b7a9f7b65b27d75283206890bb92f7d2ed774fed77ad93a9f863f008f2fdca3924f3ee0e0f4b28bdeb5dbfb9e21a39c8f96bcc81d4fdfcf90f78d3b549c16317e1fc35e777708b109f884fc427e213f189f8447c223e119f884fc427be43258e8f98ad3fbbb8429e2e4435b000c5179a9249a48c3d43c45a6bad4d61859a821121f5b645d592826c051b2406980c01c40b3c1019828cdd21065bc22052a021a5fb9c7352fa4fe031bce1cdf1bc1c1d8c39387056a9c61178b4f1813c2693c9415082df6785c9bb9dad269334758c1a1e97f2b039b4160cbbaecb41392bbca5ce966a89964aa55269964a2597a50064298e1dc82d62379d824e412728fea27fea3f0939ec34c4731a9a62a6b1e4ce052c7f3c0d9d864e43a7217f7d738aa7a1be711acaa7a1de691a47537a68a4ec20b5beac3d6ccc7e83dd537b3db7a13eb37c27f0e81378f88a021dab0f4ad9c3c6e89c52ce29de2c451c1f34569fc6aa0804851815efaa4a1933a41362c516e9be7546559109872cafee0dc51618360705146a83e2094f280a15bceb97a38a031da0ca26282077df38e56aee5aff44c6ab7b6b2024a6e65d53a9543bee81e39473560c3ee941ee886ab45c5f9ec8ccb06288d16cd521da8117281dcd96fd4b0119ab43b375ff932d057057a30064b486ad866da6647da3fb942c7b976ac610e492ad6f74df5d998c85fc811b76a7dcc98cb3aebcb7bb4754e452b793a9223246fe1a4fb9239cbfc6539a9497542adf13197f55a00a5bce5f66fc552aa5397d391d91507afb2731feaae208f26b3d3ae1fce562049c6577e458b99c6539b8b2a87746e8af7f9a95667dc316e0063ca60ac004fbaf0a0084fb3fe993569bddbf74d43b35db2f19f50e2adb3f9566bd132346eea2191925d437ece7cc00cbf2982ae2f169d0228e07f54928d95816849a55fd6317ad6c38cbab7ba7684432e4bcab0d578ede62c35fcd418e099b30fa3968f302c671c08c9ccbf7c7ce77b6eee77096fd6e55322a7d71960864268b93007cd377a5ff1e145326f1ce56f789ab6a942a9a2dfb58962d96f9ab66fb784850b68f67fe02b37d2c84af38ace6ec632766634e1eb10c28db2a79c441d9764537275c90474c255b1a1b312ddbf702ce52a97068dc9c9c193368d0a851e37fb50a4526f845269d08254c186ea4d92e936c41fa745f5d1dc1a3b4cd58e37c405f7e6769eb9dfbfe53680a55b917e32b6dd247ea9057e4159fecb1ef9a242da8260414649b57862695297445b2c0a9d738297d49048242cc13696db67cc0100832b3099d647f87dbbaa240ae33a929fbf7657f11668bc9fdd586e5cf4c935287335826110d71b95f4221612f64cb1f256133375bf2d5393e9b21f50cf4591058fe472795b12ed110312e1862825cb10c204985e12d5e1b5cdac10e331ca67c7901952b313a6999d21799524a698d14304535979b6e926bad8f53c892eb872f642215a0c895556fc0c206238e48b18508180b6589101bb80821835780040994ad4cff9ad121d3af78881213986aadb5d22092cd32fd795d2e4ff38296175429728d1b4c6504a0029673ae8e6c734ea05aab6cce778265fefaece3ff09925632ce9247f904cf682652df702ace9c3871ce72ff5615ecefee2bd8d1467cb39dc035f73b1415307d997a197bcd4fadacc7a8e84252f420988cefb7216132c406784bbea418436c6fa99cc0336709c509328f6dab53404b9fde8bb105b24156969a1fe4acf929d10239ab2255a49ac65fa84ffd34001a4c1fc523f5f46d502b8c5a9d50ab1ad40afcaf9a50a90e066af5e2539f5a7d6e9087d2fac6fcfcf9ea2b79ffcd8ed6fadffdecab6a7a5a1d8012abfd0d6418ab13647eb11a6b973cdf6635d6139c5623bd62a45d323dc114185c00c5c4adb42499e213c7799b810d30083383e6cc71d6761ef417e85e8c2d50ae4815c966b1376b7356cb09fed183ec0c561013833cbfa2c15656919c355b55f07891b2bf0738dba754ec89f1e3acd58ed99a6f2bad398b36bd30ec9b632871e636dfc9077384f9a3e421932c8e07fdf579f4d7203c286f498a3d29f02b09934797c9de80c79b77f8beaf6175fce53ddbe994f56bfd7be5acb56da5558739bddc363fe59c92fe8bff7dc3e50db27abb3776f71aea5d7c1fdde977779fd3bbbb59ceea3fc980a5bbbbd70a0359ebb5f536cbd25b279d975edad94ae9ed6c8da1a56c29ab746aa9fcd6b1d445da37baae3eebd64aeda49387f77cf5ab7e975b7a2f1f574fa4d4edfccf9abad6b4933ba5d359e77ce9934ee9758e40a9ff671747d7cb9ff53a54647dd6999352255feb5c1c1fdddbb722107c3b1187021d0b674be25802cb783bd68943648c888cd9f7e995cad00465591b52e9acf96bf690e50f91456d082f4ef2d7994420c15f7d433394e59720ab90bc698194a5fc5b8b5c90d1649147b9a491e4900ef460769dc9821f481dde48362a8b95a5947947cffd2b029131fb41625ef31ce87ef73e6ed7bdd7956257c471b1e70b1293669c25bde640b325345bf21dc959f259437894485a60ffd16b35281da3ab11fb905c12b329c223ce7d84307ff8cbf290e56fa0779a4e11e6c4e1449835b7972443701cb865221bd7410e2678cc3165a619dc56ede7a40e9ae553f9df04ca2228cb935c161a51fea6e99685508e9123e030184864b2ec6844e431472e8ba43c7696b791e5d3e976f59dc9d9688ee6fc65864c9631a0386c460b918598a214f2e8b59c10483ee4d19b08b1432ed3e92da9a4c2e0f9267cdd46a5866a48d5372c7c328c3c5f8553997158985365f157dfcea4f16294a7ec863caa8e72372c80c8a38a8cea96e753e9a9da29e72edd671d0d5c0daf9556876a16879584ea0f0e626a931a5485ea152a1d85e4af51359492a1d2a4869470b7841b554d54405c6eba509c599dd5220dc337481ff29cb8873c277692e7ac5982805a1ab8be313b14d28dac045beaacd2fc35a290aa4ffda94729a01450efd49f2a26797e8b630d2b4d524df21c6f8af2ec12945338e449554329269faa15e1ee9349f9842bd6a0aa6ea5bae2ac3aa3813be54e66301086e2302c744a830394120efb601aaee1265856c28d75562253324357fe3470bdd34675362bb532548ffa4b2b55d06ca198a0804e39cfcaeca6a86fa46aab546db6a66a4865a561a69faf1aea1d99a7aa4b9e2aa2ac0a22cf47214d9849547d61581251489e6a088544438a3c270d1caa081e53b5a13c5bae543ef48d99aae599aaa596f8ab894af025cf4f01f92b469e9fbaa5bc38ac02a59ad4f2540d5119caf3e71151096490c7942dcf7b44cb636a4b2a28cfaf54aa86fc359e72367f8d2a1f5457fc35bf3cc9a32a4b9e72e57fcae5f92a1f7ac77fd6b0590f9b38bd9dd3db65e1c55fe3bdd7bbeb649ce5eeeeeed45dac649c356f6650b7cc9e2a2893de18d1aa52a13a75eaddb542f0e8baf96bac64f27c1815e325574a694edf905f43640524cafc0064f91f00a94352daf24ad6b5a9001541b2cc9f479697187e502cfc01c960cb34511665d9f057df64e025e70dc8e7a096e5106b93c118398319f2d85fe8745a571dfbc06752525e79b3318787b92e053a9f57fafa324709ae1fac9edf110a61a02c83d0f2d8485d7726b4e967d4f078337dc9af2fbbcec954b007489018182456f3e3eda9017b401c0bbc78f96310704582f9404e0f7ecd0ac702b3635fb2e9ed8a04271fa79fe21d6f2e597ff90d5ec0e6f1dfd9ea6868c90dbb20307dce0b4f0f38420072df7262f2155bb2e97b6a4420d2823d6009fea3f4717dbcf81a11c8e95f8877b62af8812757fed6e6b1cce602f36b7e06101eef28c11509c0c7019e33dddda797dc1c4cff2a36b5d3e79c1235e7bbdf1b864d94bbd656eef672d36c824c3ac1468bf449abedae57fa6c3cef7e66c86420f4d2414ec3746c70607ffce81b38433cead94a6dedba1f954ef09467f75b6c593207a81c1d1bf70b16e3e3bb77d83a6d67bfbdf3c2747ba7a683c808c8ad863dec57dda599e8f7a0fb87edc7d7a31f474747f4074a05958ab5119283850819715cde653ae99cd3a98db675b4ebf27c7bebf7954c603522a594b3a994ddca25ce396fb6e9fc1a9d0d9d4e9438da4dac4e7e8eb3fab110967fe95dc939ab133ce79c14245369a5f7defb750cc1abd4744550f2bc2f270c3fcf560a7625dae75df975de7bd9337ddd07626aadadb42b7d261a46f180e59b3ce95defe5b52f6fc9ab515a8bd44aa5b42fa5d3689133b269d7b6ddf5759958a5ff3cd31581b7eaa6404c3961484da2d43161a7af798fa6c3b2e1e22007abe79f26d23a5a51187be0ab23987ed7d4d4cf745a796d05d4e360128cda014bb0547adac966954a23c8dd53aff49de9360e4781e765bb7768199ad3fc67e53567390dacc1126297a4fd2c91a5fc30061978cb63e7f2d8666240923b314449c0e0c30f1430eaaf551e4d79f698b3258f3a4faf913c1fcf1778c8f3052af224faf14109953ae6933737e8528650be1f7414d97b1e9d717f5e419ed37f6de4c40b4fb8745124896e30f9de315d45aed2351da573681bc2221a0fd12b68287eff06f94b66dacca1757496f15ea192ef7592efaf66c0f76dadc6f4cd1943c662ac707c843d3c665fc6c7f850042267493a2011c57e61128be27d90d8374d1debbee560c3123120289890c4a2d83c0a74c8865814ef477c34613d17976f6e5e20dba9b664e8766ff9fe0b2333c86b697504779f298f3f7320c8d38333dfbe0cb1e266eb7eb7c2991f43ac39a4d9ba33dcbd4d19522edf5b94ef788d8ef2fd1b74616858f737f2fdebe32fd3dfbf347fd5fcfdfbd33bfef7daee98736de8c43b4ba1c4f194475b5b5959dfb0422c2ddf1faf0cf9deaff568b6eeecd6a31aa661ae7ad43b12cd0b71c457e42b8e558a7c672e248267d01624b7767f69b375bf410bd8bfb3d9ba3f7333f779a6d90e18c68fd336618d2fc8e3ffad8ee0f1ce40f87e7cf1251b382c67ddefecc1279a3065f860f954bc3f6d3667dd7790e7de7481bfbfcea27f453ab4faf2474d9f24df1f5bf9d6bac8ca036727028972d1581142452ed6897716c08a28b258c754984949b128fee37580cc126c6751bf16c859f73fd1d69c75efbf90b9eebf589d20ef97d03ba5bfdf33ef5f6c12472c8ee1fdcf66d53357ff5e59bedf3be037f1d6b52bbbc45bf7bb75d8191ac7fd7195bb86be717f04c04d17b8e6f1691edf86bd73d30596b9b4bab3be716bb3753f0c31be1f70d6b51145e0acfb2538ab3ac163e74450c2acbe6bc2eeac5bf7ef1783076c6b54f27dbbc45fe0dfb74da40eff6b9be4fb350faeec1267dd9a1a0f3083a2adf58dfb2b19f0fd3b93e12cdf9f2d265f677936615e7104194233bab8b725687b07a66f5fae7ace9b2eb0fcfe0e9c80cc064063ff033553ebe4fbc673c9f7d95a03cf29b268184a514ad93a13565f8ad85dde29ddddbb9212e9935a5bbb6dd7d15bbb7a05a7d875775ecfbd9e2d1ec905c679b5d3f94fc13869a494523a65e7f624431ebbbbfb525aa7cd0a271970d2e8c249b969b7cd0a58e2ebe49b2f2b753b6935d9ee7aa55a6b7777b7ce3951537eadb57ad433cd3b7bae1a7f5d347146ca33529e81e18c9467a43cc3050c67a43cd30417357cb97a77daee922002aebbdd067e5ca09aacc99aacc95adff0b76008465ea9fae8292a7d34020fe0f16676e5d0f19c2ff7a31c7bad43fe481cabd2ca09cb5be22c7f11c81fa943ce206b35fcc81a35511d673d0692b5daad29791e5048f1b5f98bf314cadf0926693299ac08163645c0848d3342cb63e7da4ca799b0dee216c4823357cacc90242629ed881619ca2b25159f2a1297a50160a0855198590a51144193e45122d5b28da48deee33f35a0202443e4d185b27c213d4b911bb5d0431efd283b99299bb32cafe43cce9f59cb73c9389b64c9441e5119c6771019c6537f8919068c16a2c830fe05c8034326cb2fde06e47961b344b6790cf2d860fc279007e39c7c42b2433e7d0dc873aaa97910e4a9c1a00f11197c13c8039a4cb20468881c1133fd07f298be2351e4ef4b20cf377ab961a5f7409e524ef63cef312e7b4752903d2326c8de5f90c77bd1c002946f91335d734122cb5689222ce4d7c422cb74677625370c4fa10c43d614318362ad7d6bad25c18c0b541861044b8e8598a52e641b432e5b6badb52c94d191a9162c70c956005df0889f851364fbd727c967adb5d6ba581022c415d77a77addfef2c3b3982b5ddea9d35ddff9dc5f2eaef3f821559ce9a9665edd875f6bee86004827c6b51bbef372346e27a0747ae2f73bd63a6e504f64ee8fe031227735f9c559f8ccce19c55533290b1dad2481ea1c15e7d3954c28e1f13067eadd7266b1d5d1587bfb00bb6b9bb60991bd737ea874d60f07b0231555101162a319388674be2dc2749ad2c21f0c8c2e9a1dfd947f6957d21d96be3701b5a0ce49cd1965b602952ea3fa5fc2965be4eb0fff7620c9631e624831c424598b398cff29ce19ff827029eeca8d4ed7536390915d148008020016315002020100c88c4228140304c4355953d14800b6f8a427256329a88a34990a3200a628c218610620801c620028c61c8880a046425625ea82148540a432d2cc27522749e572d8688409ae5063d1b5250cec8cfde169de32c92a227a03e09e2cb50b1a39589c984a4589552a04e4271ee854bf8e5d55090b5ee4da62201658f180da186b4ee19b7c0554ddc3c68393638ed5e0a6077bae3678e1914e63c91364210a69dcbad1586197febae8d5b54cd18593bca0d2ab3864be07a91022be3033a79813343ee671f4a45c273be51481407db1b2c81ee0de913b54b33e32ef52b104cce1350fb29a7584c0066dabfc52c32cc4b236c1c2fc969c0d2b9f14012a1397061ceeac80b0c3ee31c9def71e856d28c423cf4a78386907137594cd9b8cf90a1616436d963ffab19c15910b7aa630f3815f481731809aa6482f7c5c8b17d1d68e1f0dc936e3f1a0575199c9e92ca2e5bd0f5a1b19f8cf59bfc078d4a65103b05ae36bc9da68db42497718f8b89d1038dfbb1306b3c1bb377593ce44763f906cc0439b619cef1b233a3f2963e95aa7d62f483218b931a446857175ceb714bf754aced4a89b767dfae24632370d712709b424d7f05614c510d84a726328f2ff949ee5def49eafa9b202e39f341d522cd84b23c90352880f6fa3114b5e4082d4346a34ef1c1efe7231dd5a5b4a5eae21a7e2948312daad9dca4efb6e44360687b8ec5b50648f10b2deca2b0fbf338f4525dad70f14d9684a1487ab9dc7d66c48b7412bf640c961d79cd219d8ee436a2bf8e2af48b1d59915974676b7f9723d024dd7ab6845421d361b02ee62910b275edf83ea831bb45c880ec4cbba5d06cb21ad216a99be601510dd00f19cdd6399c489d4ada0252970863ce52309264ed1b8a4151d92ed1476d08bf7a346f2330bafc078b76bf3241c0a95eb829c0fbd5be25a52b86d209b05391e27d120ad844ac75668957c212790d94e17088f382e06a95e29feaea4718799c37ce03c1f8de05a00049d4909523496cf710f109300242563d946f3a9e902a724176622942cfdc4aa3e8b4c7b76a17fcf344a91dae4d0e7000e065aa97c023aa9aa154fb186d00e26bb86eb00cfd8d3b4f1d38d4a97f3f7daba3ad8b2e465f522b56094bcd8c5bebeb658b6b7564aacaa4aa3d6a065e5215064cc6b259925fcb8df422da0c59b76fe4eb4480f2dc48afd9d62389218c36b9938430f565b0d4ef0303b4e279775cccebedbafc3b0aab5ecdc201cfce7f36252fa9dcf427008d5d34a17648bba7d3226d8207ca31ac7863a3ad4678c70879616f4074e0f2da1ce366ebff942b5588136b9bce15a70330a6e872abbd3522defd55d186030b13d640c14175793c782013dea215b89f8dcab77fc4a2be1e09381e8e1c750e5beec8e4ca4597da9427c0b0078f38f0e43f76c41a4c9b28fd2f40a46bfded002d2dcea6b09032e2be27c25734f5a768e41f7851461aeb75c2f84455752f7ee0bc4dc8d7d2680e3a80970206c034a6408478436703cc5da947fc68720921d17ec3b31b55148a01228377d6fe364e0b0cbcad62a120c6fa4a39db4a3c7c3ebdbde8a9a685e0f4502082d85d739819838acc7e61f2dfeeac5f2581938960db302552a2f52b14ea6b773a162f392ad6373bca49730d2729182e103879049cd9bf798c8d9406dc25611979837d53f3abce1cece1e9d42d9e69c09ba3290c2ec45b875e0153f4cae0e0b0ea301be1e2a6be7bfb0cde3caf50486177b905570d51e4e90d4da4d48775bcd7c5726d86c79e360d53ac8eca3cce359b670a3c6752f556566ea7cb416d6ce6ab08b68612a64544ab2ef5e22d1590416d1179248e56e7e209388ec854dd202ca60c68209cf5bda957bcffed1636038ce731769acaffe345c0739d95ba76b1b6a060e76c2a776eac44b2c07ec4c4ed020e1557faf234f4e08a600c2e05a72ee213e43eb2e5bc5cb4b9d492fca925dee29cad16a6bf1e499762a0e7bf658fe39e3ed7a5e79602cef023ed687acc88238db69960a18af3f2fa5dfd488d3a68f675a1a8591e8db824d3c1a0613d004bc8804483801b4ac8731132b049441ca1678a3678c59e4e52b07826388d72b1f4793e70cb2148d52eed41d820ba95445c02d5a40e21c7a62876477e1b7bde754943c9a4dfaa14d7d30ea4ed4ff920de7a07345c1524f00ce4c39c9c01f4eb824141b45248614d37f3c5ac4300e65d8705640aeacb92d39f2a3fc57d2c4f3700bb680c51e6aea8404e07f1cc772957cd23f349a0100410fcbed6138035dd6e1c1ee282295304aacc652187b5a448d0f6f4e6ad835521a1c957031bfd926cbbcf47f3d1d73a05f31037cef646235b70ddd42c03b57b3a4c8cf49d06d8c0129836ac5df5eeb5dcb15a9b3d89ce71035e4a657abb09f32b1502b6e32b2b6f7c31751bd4213a367a340eca36a497ea45a3786021820de27d9c74428370ab110aa2839a2d5f810396952f5f6e46140fd6e13820103737806403bd03abea76a473991c414d8a31664b0957c147dd12175cc1b9e4046bc777cd9095d7ced14dca3cbd418dd628bac2e1fa4e540554baa754f4d5188f04a7a287f9d648ce8cb52b91459ae4221cc4e39de593d72d587aaca2beaed99e7ac2ff1739027b6286ece2629b999d3162810e9b522e53a8a1b979542aade73e6cda35ae2441b26c3e8922c06f3cec16a10c1b91bf6ac01e7da8fab1e49a1d40e94b376c63eb504b8b6c1a097c96b424e0b378d63a0c61430d2161fa6393ae6420501e3a95476922e18972278a7f733143408550e70ad14680c0ea6db4188073bf3398cfd460a204cf6982d691486ab2c3ae34a45ae2348a10c71c7811b8d29b2317375843c20a66bd17c58b144d4111ee89e61e429e92b4e19410710caf32c4113e16d0b96624f5132138627537ae18be47c68d780dfc6c07a1a7064a9eb06132ba19a41a470c694431f5a8df9909f01a8e8b77c8c835c2b6a9d1754d1f6e515fa090e90bb828067f97f11fa4e5563913659bbe744ec7e72600be0b4a102f51232532a1109c61ac9b40b8074d66b68dfcd7ed229046659e33406681e7147cb5aaf267f1fe8b248c015f1d0dbcfdf7eba6d97979776b38bfbbaa1e798c169ecc1654989480e0cc958d1f6e3e1022af836eb49949c5bd2a123698b8b346a1267297652e660cd7592a751341a7803ac04856c9493fed652bfecd3a009eaaec8f6fa56c16ec31acc0f5a390871ca9c5cf459c60c0e76f3706432e8275826701b4433881a1e1df2146d67414950e54d87d4aba6e11a22b1dd59ff18205fe7d9c3b65ef0d7461f3384e8782cadcd38bc49883f5fae28d48727b0e0b5f9fb632f5c5c80499a220627c825ffa4813da5a79a678e5d484cd238b5789559718c29217f0c4716087484c51e9aa64721605d322517dcebfb848f44ab08f7eefb2703ee8c5cb80f6cf59fdfec5064bea5ca62dc56b44abfa338a3ec676319a4474d142b544ec9495e1031ba1e6e06ef64f24c96e039f83943e1b77385f3f43d9fbaa152b999166816005559c93bafccd9210615489fdbe86001c26a9d4e9482354c8595d2b15b70af051cc39ad8247ecdc7f0815bb066ec99d20e73ca6fb6f79ffc301655a2169aa8c804f8ed31792dda3693ac7edd7b83b99aeae3f3923b5654968651988de6a170e73c893495b20e3151182f9d1c508f318b2ad74fde1ae18ed217d9ba2bf9bd8249d953f0a8555e169a23c550b27514569d4352f78475641fe872c4b4e750751a680540ecbe35dca8205d7dc17361dc673810f57567b884776ef68b0e7963e309875db5ac1d48dce18ba718c1cb40b4a117614978984daa74071d8ac6ca986154a197f4d4628a908df546180b6246b8aa0b46af972ff1531e5cbb09ea42a5cc3ca38072e813b08a10e7adcb719165d1f4e0164bc46f243f9858d74c5d0b7fb451c0c972cca2462845f839cf646911d12f25d033a4ce5642d72adf907d759ca4ec8b281a304dcff168ba2432f66e46e115508e11831c36d7269539494b0ea213652b2a74cf66f6638807c4aa49709fe0f092fc8d67c1eb3f12600a410805eaaf16f9aac4fe4367316830a4dc699e8465142d80ff53f1dafd508e6440893ff82bc6315bfdc30a848322f8338915605ae182839f51f9006ce201e2cc74769736c94e0f36cda5c91f4198e90c69b09ea9ca796029cc6031b09006facdbc1244a2d56b9cc495c2ccb3121f164e688e8ae6663e5369a826c8630cffefe3d9aaf56e482f4d1098d0cd2842bd6d78a6289b5a40202106e42f481cbca46c184fa83bc888b0d0522f9b05c81e14a24930540b206b489b8adf50ce7938675b9342963df52bad51e871a432e38eeff1b7c3469efa1c491fb31cfc643ba8f423ec4e7e970499fa054596b8b28e56078271d93a5965b19a3f26e4bd888d619ad188fc6790cc943024bad6237ab10d546c45db83984b0ad27057f4ea9b7f4e9ce166a77e474cf46d69cbcb687a3519fae159c756200238553363c4a8bf650769fc8bc345e86cae302e05c9934aa7962751d88e709124d6d8c3da2127a310948ec82363ff7cd48f7f94009086eef93806f6c1f0d46e83e26d7b931a988386898cbe6c88b9e2341cd03e2053102bb5984079d2b34f8b9ce67a6af827239c81526239f62d043469ae4c412a85ecc28b07c4fb5fab6dd0c0a338149658854f47040b56efd97106bdc07f3020929292454402c9461bc315953378d5dc8cadc3afa0d3d04b346832c3e9535099a3dab9e742dfd70da9a48f62939ca426c6e97f9c72363df3d09dc587e8c3e452f92accfd8e41452014ce8385c25386f5b84ef6458f2d4f2218777c927015f3959618ba3dd14d75cba5d8f0dcc2c680200d90b414d0917f2115481748f855a3dadc2be64d56d74715070fb26a48f298748865dfed07ad27f44d390b5c418ea9169a0ba67e4142c9b7dfe71a054f557f6c2fcb8c0ad5c5257029a76057c75658da60cb811817cdf254575687b5c00bd6b2aad6f9e02cb380bffd253ab7cddd754e81083181053d1323dd7932680d6b9d7a8d72d5898d01bc0a89bfa30e78cc10a912a6208980939c9505f9d797832e62a847a151be262e680c2e2a167585f0023373e775c89026765a8afee3c7b92a335d69b31a1efb387f28a3e4c96cb6801b3a418f61bbe6f64bcb3aedcabb09433218c5dc18af4bf3d0a675a5e332057a801e4d945fee3978b368646288fcaeb54431d57d648f3c5b19867558f3c6093d4f9232ab97f8484dfe67f936a2cd9281e9601ac35c9fa7584af8013c3e861138b7767de506e701f38a998f0aabbb08af8829835a4660e9f0acc3479830f1bfd42005c93322ead07c882dbe8000ceb71c353cf5637285291a25e8eac98f07344371a39997f0c2c9c1b9f391b1e4ca43ff62a5d8a0a540bac3eaf0feb7902435b33c603588f1046c84df50ed293e8c36f4b39455151b1d344d0cedd594c9ef08a08a944f98f4837fc41296076e986bc1080d933224a3008840a854f514f68734756fe7785f6006087a864819a3a7893b3c80e3e6532c04e177a0370e3b3cc03324d149b070d4a2c23096eda298564a14297270afd20ddd3cc6f06f1242b7c0bedeff7b48a8ce08e9bb849048adb4156d50fe5429121d0c53aff8c2e52b965d97d6906c1d5304b4a7e7fd19a02857d9047fee43ed436b2818cc62bb0821ae90b361eed81406a037f49da4f69544c8e8202e982c174906c9c443e729027869c81f5662d9a410e5823a2b965c00b412e0464f281554898a3bafb199ef5709296b11e87e93086d2785749f0c7860f4b48eceb05a14e0b8a97220aab35d1135e419414ebf4708b9a4ab119b85c3a9996422ee49571e58dac0b3ebfad55b91b538ee661c69c97a91b194631cdec8122201e689531754ff1e6304bf1a3d9955e8591bc6685d701f4068591fa968748ec0d8093d22112e4f5a4efd915a3e06dce220a86627154d12bd5704a2675e465bd5f7ff6d156705fba7f5a364fb3bd0ed2a16cc8c513c2c56b891284d6ba4e0629ae2ebc515d1e0e22c47c5ad1dfe4189370c5046b71354a6fee099d83f189691928a7aebd1543259fc0fc4008dc0a9f182fce50a0f02820dc2eb328792f9ed224341d9a64fdf635bab92581c8d59882c22beda27e151daaedbb405de0ea23da0b656ee2927371be8d0c4814d8e74995859991a91ea766a86ffd5fad3d0e3557de994f22fa0f86935c0ee9d109c1ba5024dc841664d0415281fcf25d4e2d0538711080e3f6a56859379258dba551290283e5201050b0f285250b80662bed0419a9ac9ebd9f57d3be558b0ec586d187e13cd78c00a92c1c11392609a5a4b68347faa3d40b9c3cf70c687ed42d09251d3b7c9b6a77c9d5d641eba8de49638778e2525ac767949444cb2d0c3e4f9c4e3b27129f6e1c61924a15ae82302d835e047fa5a66f0224b973d104e4343931c37974157e85fd9d118e80dc684140f45c6862729d4bf05555abed1f62af6bf7dc2415fa5cd81399e8f30354dfb223801301b85f88a48d3dc9c1b9e4ecdd84b96efe3e39692eaa38ba514da6ab78e1b32fa5e92948fe3627ea0dd54fd68220e3a0560e5073a9866eb3400c47a7dd79796ddb4e5c94d072289ba5ddf31077328f6bfde3119d3b7e18a041f0884cf6bfa1dcf1e2fe2b9f0d8bfcce3b95e111fdc95784e0006e9dec0c1f40f2e59b77f6e204f2566bb0198a46ba189cb6a825c966fc313098a06cec1cbc8072591cc370e13292bc330eb3ee1f5a7ab67166040fa904162848b009eeec68f5bf6ee80b342b1a863828d909f07cafcae73c996c1f90a457a666901bc2083c30a9eab48683a8f89df467542333175555804a8abef903636a36426ef1f5e01fd781e35bd4cfe56da59503c5379d6b040c4b64eb2de916f29af2cab5b72d786445ab404346c90abd5d10d1fb1038216d6e6c85d1ea5f00a43a703209b3bd9503304f9e1e4a3b594b0ff2079d7c270de58bf728f1c6349f1c70a90f2dbe7408119c14a540fc8d9c4849d19549deb94fb11948c05183df7f5b2273c19e0f92dec55de05a2547b27e2da9b11db62a376772c738f3457631a78c083b3fdacb80b4bc40cbbdd5a104e0e9fb645b4c9c84b13c1d0ee63803fa01d54e6aef4bc1e5a34b9f33af8474de0c0c5bc2d15eadd9548aba07a57786d62e0647e6fe27f3e902ff52e2d2811990ab5af0f1559263905ac44a55e730f9a6e71ccc1f63de31ffb75af5a71cb683f2ba74f97f7b762036f78018a58124331140fc924991f6051c66ba78e324d7017634731db23cd2e57f35387ddd88711aaeb8ae44abd8166d7447a39ff7869c68a91f17bd2d8894cc0b91667440c1bf420c5377df1659c390da1af85dda88d83ec6061490d620e69cb6cd5529a2a8dc8613be0375d5cb9576735188dad800aa1f18fdfda5a082c63d25c0904c99915c6c7a427b59f60af3c9f90267ae9f051e91bca661a2f3a3ae77cfb31d23a05e2b278c3903c3a156de9ec5ed5200bd1e0636f0a1d27e457e652a537965a9af5329837bff565dc62972120e356f4ba84d5b8631bd8dd7adb7880f656209009265510812532d3dae1eb43fa0380873e2febb54231aa2421ae4b44554d47ddead34fe68106ae591cdf2def5a9e8f9fd4628b78782f61b61ea84e1d8925dea82543da8240da606ee8b3ae0f2c14e6dbe75446a23510ba9da24d4328dca276a5a0f6d7efb8d656853e570f0be1e8cbdbf1ea7cec3860d032372efdf8d9b51ff2b73d7a397c2e3bb303e5cbba4812273eb6bb6f7c0e6787c5a8bd9ca40d29ae7f6923a64bf18873fb32a11fb0f88ca91059c8d1623e1b4463759895b94ed9605b2c08fdd988084240eb5140a26058635a323f5af32bc763864c7a958e0463e81aa06d5c5b59a0f99feac27c48620a9ca28987a5c7fde6b4787515cd395d2b0eee907fb4f222078c546936e8b7aecda1dacc5aa75881152e0322879004d16882615cd7b324899d630a0f58765ad55973829ef51d05a5c6c21ac623a2324c999b956b79768ef1d925a820cecc20f8eb39be3e792b915264d4999acbe926f90b35ad2841fd19cec995c254115f13005d51d108d81db8e5b331d4e7669196165ba972740a742b6e2c8c1541123815a08504af3b29739c2ae020039303f21fb468f910992183d3bcd55a049460c93c83fac1401cac772f9e782a137de59ef37f7bb760015062170dc60d8bed6a54e82f26feedf31c8bbd27c3b7a1a3bbcb94575955700e39b264a5219683b19ca7bed5dc64e10b09ed6f30ea4b30eace8f44d0f4ff1e0e6eb5bc1cc3b2da7d3d3fa84f321d1be55bf606afbcb458c070bc0721c44102f97b1354e9138306cb6a60d4db3de77fda334e6b903ebd7e0f49b402fca141b34d4711503af8bc91a027316bbed578967db39fe6dbf9e2beb0c8208e9af9775f848cd86db2badf27ac9e7a286a9e0221102fd59c1409f56766453efaba4fbb61e0797b7c3d30c5667408b51c046a116fb2267294a224bf566d752a5494cd49b482628f48545bdc852e685a409c172c03d08e94248930d683feabc0aa3111e9fe69cc94ade517d542ea34cb2943100ddf8924bd71a2519f593a71a0b70ef2faccb0b0c6c34dffcd9ac14d128bd6a02994e1feb6790d69f41d5c313f421d51c334cb357e1278803fa84e108b8096914d958c572767f953c43ab87cb36132179d733822a62b4296bdf1c0906b943b28b088a9ad843efd6054dd55141f190f435ad54803bf0b274bfefdb92b37e62768250019852f7bbc5c2c6ba31d8410f41c62dc8ac1a7803ede7148823f213f176fde0dd47da28f8e81e4b2bc53143ca4b9b143d411598bba2ce093dc52dd37033b4f7060d8477fd5b179e4652399e0ed04df44ce8b686b5996353630b8b5e523f93682e4029a2701f581cfa1ee26ad2fbd0a2e10c76fd4376d2367c284a13fe32af72ed48039f8a562419d9558c32913ee02667f8c3dabf4e3c78f47138acc0824a6c61189d7e3525d3ca53c58eb352f8e68ea049e7f6bffd2a3529f82aa1b29113895cbccc518ced6aeca6a0c1f2a57305aedd7f6ce297eca6eb557f4c84ed037811c05a03a8e34600f79669bb104ece663a4e19ab07d6355d8a30b99679c2833b0159c6aba7d1e8c0d0c1a7e49602b7ca73df51b2a32945a78f9725dacf980ca1c3a51f4c4e4db321789ff0c537fe9ee1eebc89bfac2e66a41b1f5700d661b411bb929cde5386237ea1d8e91faa350c35bca845e90da94371c95f19ffe30454b2b2a413719192746a32c9ad43fcc5c3497238f4202d01d561a0a4e947ca075e61b1b981f0654ef6b0ebd86c6cf35931c507cb9b872efd496577019da2429176f10da2984860b427276c33234c60db9fad97ca8776359747215121ed9da68c8a76ff7d918c3b8325e89b64b2f0e93d6e6438fed20b6c967e2c933231f555bd89135cc9741e5c5b9dd29db9921dc34c755b330f3045a8b921c5c2f5762c221f41a93ce655ac5b474fd7388831ad1433b1a4ba6b9a15e339d930463f1418b5c2efdd184426a58fcc61f53216acee89164de0fd42f4fdf5590650beff347845920a8b5ef79933f26914a7029b07d0362cb799dbf6ce7902bbb561b59f9225852a81ce6d6d58344a12c8368b927955576ac3baf8fbcaddeeab1fae8376d4373cbcc8aa7dafe4615a36a8516618c7437ae345f96ac0cb086d0a9c5bbdb03e3e0a0e57ce96486c4fd5ec26b2aa57287ceb2d7b1bac64b98ce032b003ebe6d827abc578baf3b648b0ef12243748e938675b40b29c5ed243c62b5380c248d214aad9cb57ae5f19707e6cd553959e347b19438ae23d56e6a4eb02bdc9f0c203985c0d797de9c80bcdc98b3f4fdc1bc1d0a1a9234d9c208646561069123c795d2c0ec1e5a0757ca5f3aa3c44e0e49de9fe3b34c3b71daa88948c8087e182c013479c2e405d9bdb809c418bfbcf8ced370a4308e92632f2c57f4840507e81c4db84053491154b36374514cea9aaf07347350e6b46c369422e04554ab708b811ffc2b0b256713495991b921d3111b84cd69e9ed70bc0c6ec3dbe77eb6c8829ce4cbc73db1f17d6a4a351befcb5d3f3b50ee514202954ee1d2f8c35104a2ec93093e9e0daad7e922aac15d1df110336e8f12bb6fa23aa46f819e8c256ce14bfaa111cb1aeed361beb32956a72b7c4d5c064cd34aa53a43c07fe57f08cfe6da301c5530d1751b72daef8ea0f1ef7e8f095ecb1d0f661cfc578b258773938dc27cee70d67526ef88ffc19df6672310c20511b8f6422cfbcd4287c0e8fd2bb5f8c0858b2fdebcd8efef166931eb2c6bcb52697d056abd6e5fce06e49319a6556c9a4e915fee1b72b3efdf1cf8c69af84fcc4d59ad4b8415e1e9d7917ccbc2c1a46a509a587500f624a37b5473e0248f43533acd900d548cd0f10a2b3cc8f4c59ebc4ee4672be59ad8cd83e465fc5d133d5a7d91aa8912cd493b5848e45994f796cce21ed3501b0e8a9ade0d04d14499b9238ab7344964f76f909542ed8d576cca41350a6f7530d1cb99fea5d3c2e483a8589a6685a8787897daba6ddc86902c2ecd40e8013fe476d6daab7a3e09814d5d8b56ef76fb5ceb1262bca51ab8facf6f3c6cf5c9af53df69211c6374d85c4c25d1e82ed9608aaa742002d12126d228f25093c0473450eb333b79ff78ad09717d5725dd238d79e9d1b649f04d905af26442143e152fac6565f53701bd02aa1cb84f56e8b1c6bf0eb99c4cc56a160040ab349d2e83be7bb2da2b2307f4c68f7bb2bca5ff276684fc47723f5d9f31e964e9f819eae7f40cb1312c7472f203a0720129fcd21c905a4ff8805b20e8b5e8fb119d207fbec14497238fc83b7d271870c5839269b89622f7ff78dd06526c4e1fba4ba9833997c52bda6a41a58beded38a15a19da9b404ca2a0059a3c7725ecf42f82d4de7706a1d26d55234e01b93704d17a60675e994a03edd764e5dee5c268a46035987205786e0832357f1acbab1e76640762599b2158a3caaea3a87c39ffc6135290b7f60c8825671786670b0dac352c9c2861292bcccc8907bee3040fd2ca2632ea431c1ff95bccddaaf7acb63e99d9375955c6c8676e9922a6fe7ea2d3ed682a1574dabe890c901213308255a82d612c0a096b8837dd3e5733cd870356ec4c403a9c15281e3f79b6e00870662e96313360659cded85596f23a0063f16650a7fc400ef2f8f5f1b5934097888885a42a9e1e4b07d009db997e77874fccceae4d081a3d97dcf9a6c118e136691675a8f6ddbcfd12d92c919bd4bd9f583947eceefd3cf401e6e9821c7702ce4ff58fdfba99aeba92861691870bdbafc9c464ccc16a7f36fc7fcb7bf3d434ad08f8e9e0feb9b0120bb1cff762d0ceadd5102b818de24e9c20124c29c980a81249dd037b3d42a8192805b8be65bde50281bb3b63c060d6c497cef37a70936a473e4857b63a99c9b7f72642e311723d9549170974c2083b4afbb6876c1dc1d420fc2ce21d1f42fa4c6effe6c2e4c5d90f9359e236fb44b784004962118221e6661b6636b580dfbc8ba8b3b2e617241e3cdeea2838a80391d93430c2f26b0aa716d7758bc2b6a0783570c0e0a5ca4772f10be49b800dd37d94dd3602fcbcf3b0abe1840111ad2f3cdef920ebdf1478879cb9e14f614743ae0c92a52e6fd352de9984de48e1bd392162e2fa44a86304c7ad14b4b7af57d2b0da53a5c534bc28af1de35afb07682859886978fd9c6221a5749592cef20157d8be6a8171a62875438ee69d03318367a3596c007f67e4cce8bce07a944e7a498e692faed22d9334098289f79eabb95fd57537a85f59d359e90a0244586d09788182ca0f013e96c79ebeb549dbe9efeed432424e8267e7a0ef985dc288007092f0d8e86c0d7d7b1f1812ebdfa711e583f3059a0bc03e0aa66753b8f57bb22a407e0889824dbe179700bd7f9847d82455908911566f40fb0ba502bfe65342b47fe4a565e7437293d1acc692f20c22e71a6c5603be9a90866946fc7771b2a82cbc2a385dcfbb1b74b24fe8b816bdf4ef8faf67632a2814ffb6adf84b1b2ea79c033a6d023fa42b10ca08145d5dda39beb169c7d5b9b081a52cb89f25e080e0d6ffbb8797e139013713b36c2696c6e47beea6f625ecd8dea07ccdf4ebbe926abed2532105cb47f57ecc2f91aed981f7bfa3b7aa9f24e4d8b676701972dc62dc8fb186a040249504837ef6a96adb360848bbb041f137fbe46e3c3158e5c7cd48798e018b8b5c141362c5112d8879723b9436b1f9c534d8d54dc547a9a9f92e2c694e2299db55219097c9673036efe3bc459651aff10189c799160860ab9a49da932c0ba0390740027d488553131f8296bcee751b14b7ee730a2a8aea4928ce2e05a850b12e75e5495040d7b39942d5c1df52f223b161bbd1abe8a990572687a21c21466fbf0072f4cc3d7db1a5751bc6ce382d1a150f93a803318df07c3dcb91b958295a20abde6c248b7f7d3d8b99a28ab666d313f58783e3439449308d3dcc80b80ce029be163f6c27c33177a006a67deb2374abd84bd92cfb1121807f08536221c4c2288169a141592414852a33197a0ece91a1e2b9da6190e2cb8be69599725b86f2f805a379fb66c6d9014d5960c3ef157e54f03749cb68a4eb333f7bf08998a0650f07b25b0dbadfb7da051955494a196a04b153296fcd2aa8cb6dbff430bbbfe0f5bc155b4c07f8748c8342b09ed09a764409e02d793fe6acf34931456ad19833961a1be677ccf35658ff31754b70c717d11aaa1b113681fb11a67e022c78f51054e5cbac4bd73a07b54c5a11b8ab90c45c914d965f754040e18a334a49cc94f17c2d345948cbf9a6f63823731ed47e5e730c5fedc4993bb1c1e3fe7284f8ea68846bc26dce700291b696755278065192c7e0bd44b22753c1539c7b6efb400e60c9547866b745df8868875e3577eb1db95f5d40b9a9c4948c1b58ab809b46fa2e7e3aef582d2f8b4822a4df9911b202d49981690160d70940e866002918170aaa2b240772aaa521c9e4b827f271d9d65d95cb1307a1d6ec7e1f5179a077a239e8285a748c9157f94072951dd34752e7961b36e379a3afd9cffbe38a20ad158f5e846e4ebb44eaa379a08ee41434d19b8f2e19b87485a308a5961f758d468e780887d40a65ec9fda58ce2bcd076c0b44cd38f64c2ce98456744bd86f8921f01d85a658517a4779c6fe6304342491032a6580b482c32e58f7f61eda8e89ec5f4833cc56b9bcc82098897e190782fc81bfc4c612d9923ba7f720a5245e6e41445096334ab39fcb485cc46b4336c6acb4ef45562c4ffc25e8888303d9d67d43770c167ec43f6af177cf4a94a9100055c762adc0369394e81ded3a4d62db8d91e2f33ef4622d23fe8a3c0e6c694dd806a8d7ef27cf6b5198176e06699b44cc86ed30ff6e917c94ae73e0669205357dc5320126721d2af81bba6dee1e3f7f57c477bd86168ad50ecce5fb958e715c42d1e5de3a00781fbf10ed69e124802a5852e9a1fc797966c55afcb9a3c0828e448ca8a6fa664ad95d6c35089bf41f5710f587391e5aceb7c6f96ecfd048a5b405d7e5fc0ae482df7655535ce9833621b7d12617d9985d944c5a8024ec95c29f92812570603703e00bdf245966111c48794d5ced6bc16a72e573a74c6da2058d5c2f5ae1ef063b268909dfbc184f5a8fedcd6e84181c6f8165f865e50ec55e96a82cfa1ad2eebb05a19429392cc475b2261c45fa282b65afdf2325a89f1920402f9066493d0beb3f7b9a1c037df2bcbc634f83cd4c49e392b5267047e1fa0525b9ab851939060f7d946b6bad8a11b0be5ce9c0a02cb0b35dfb0515d275ad01f5b3df370aad8164d6a8ea14f717a4d681d7ef426c9603cf4140802317bc40595b211957a91da811f0f1491f2fa06926b7f96fdaf1be8b59cabd60f1248d28e04d9ea92bcda57348abb0550b8a0f63ca076685dd4afa7b51f43eb5a60f06ac2ce36c906109f67b7f3eb8138f0fbcec3db61c9359cb9dcabb141bf7b27a4a538a79a4b68b189ca84d5011d5837ef78436f441c30eda190d428af8a87984882c25c1e7e1647f49245a11fce2d45cc762e8c8f795b2cdfdb485b619333c113e3cc86fa6eacfac6cb7eb645757dfa6c9be7142110462c720df6a903b113ff1b9cb00dc6e78487ff0ec510e496e0e7982658cbd157f76b781f6ca7feadb33f84db44aa12ba889962f2b87bdee8d68d1c1abec61ffb2cff66cff25e20df175d57faa71f5037abebbed9eb61a9ebc407a60ab952f09cf20cd2ba94dc239e86c44747817f6a8638eb5eb9a2f192d6ba660bbf2ca2e530598331cea3fbf30357093a32e1e54b89e5a6a1bc953339d92a8a8b0876f92d616b209ceaf415abca99d319d24bb32014b31b466e37c36c3f1748986bc097ad9ab4da866bb9fad7f7c04713923a6d8a5e454fbc6892796bd4f498c0f5c3910d09e9f812b1dcc64c7047efbeff172caffd5dfb99d67b0e52ca43352824acffd7bbbc415054f9965e982bec0d632df7f9275c7a0134cb3fb0b28e9d8a431b36249c858a00c7498f7e15820cb50a3c3546568fc98cbf6119b2d6a51d02106789ec205dbad1c4d6c093e861061ff33a1f5a146d8047e01ed31399ee6b684ba2b2d5d5c17d8cc077b6d3c87cde33575697735d7ed147c28e7394432571c0a000e17393f2df07bdf7932f8465d62e9083b19f9920eedeb65b3461f66e4f6a91c26b5162ca50624cecb7cf8be13a8f254b22720e1ea370050353dfb5e9d653742b9ff3c2128e6078c842092bfc28306e13c7dd001624ff552f779b37c6ad86fadaf4cfaec1c14e48a6acc86faff7f1183e99ef15c0b9141628d22925f95c6700efdd857add7d341cb6c08e658d9cf7753d2c8c61116623d9078019155841afbd04e8c07660fe5b230a89edc11ebc471bf58ffc850bcd0c58f34cc978c014c9df9e288561e1bab170d7d832fe5b288f25afc7a04eae45e9ead71aa08f8d18e0c2b8845a1302541e36b080090ffa52b44f011fc450ddd6e72abd70b6e9d4d1200d25b456fada2fa1b0e106931b42af3a66971ea40422652d72134bb0249477b1dc381b662944f5715d6c8edbefbdc1987bb514ff408f2b0955aad49d66c515d4945d48e41136b82be3a923ca9c313c3ed43f0c0f9c504c74d89b9c8a84149433e61724d142507fb70fc9d239ac80b7adc28751bd189c283265a98e5cf43bf2df7da7dd6329630e0013e360d0c6a7efa9ff309ee011a3621c36631a0e2a3831fa8b7a3e815233ab6e98e9c9dfde1303b49b46e8192e70bf55a28f12cf2cab6a5209064efdc3881134ceb89e2e442c52443e3f048bf8329a57dc0d1b0f48349fd57d5272171e4542a28f936e4869c94ed7cab818ed1a027f4f4d223a171a81f211ccbf16032d5b43eabcfe00e7cbad0eb99eb83c70210beaf900d72f6c70358aa1619cdc36c91ea9c6b60e7be9d00270b866135264ddbfb3c383c26687461aed8471fc6bfd12b4f3243863ae33915ee67929a1879b2abfb9a2a4a8b5bf3a2da0ef28a90d43d95fb31e7746391cd422729340ae1ebf73e7361d1d0495006b76f9b920f513efcc6e0324153e7f6e0cceccfe40e56a127bc6edc29c9b948bad2d9984929e9cbb810b5da96762098330dcf5af4c1b0df5f9d08dd5f1c0f49d276292ff314ffdb38858a164b3935ad9021803b5d214967c1768fc6a98f4ff5f7be30928871f81428295ed5e951367f93e3b37cc7d581065d46c58e22404ef20a284ae112807fd6638e588a845dd85c4428f766bf160a259ae6499660eb663e8753ad801aa88c89b84d26b0628cdfe5a99a1903128a2f3c2726395fa2241f88ab0d2cc8d442dca57e8723469b0898a9d92b7288e20dcfc750470a1788b6119d8751e2278458d850abb408abac7d9d625b90c76504ad01b4ffee367a9e6d2873ae3121897d1d449d43a4a1ab286b6ce0deab361e0e9df651e4c934dfd9847991167542fbd7c13e84bbaa5e18a5c1df101758ba7c4a14ad24e6e7f138c7dbfa76208086d419b0d0687247ac50c395247ede5f93c0903a8703f8e24805fc38660267a1e9dc829d6c2fd4ff480366912948c02f86b86a1242abf468afedd4089d12835ca7647ed6c418003038d5c955d7cb227c001c45909dab5e68ad95e32f2f3187b0a97202228ad23ee2d530a96e3ed5a301dd5b0a825fe228851d3662d6b1016120450174f1f3f59324a2c9d6844ad9d8ce681a6ac15fd3fb0dd82e4aeca04ba306a577ff8db66cfd0029cdb03dd92a9b7cc303f2e91cf8fe285a7fc26931e1c31ce808a79999753e4312bc8d31d1d24103e264c0ce03031297d691d2c6a5080483fac539a1b5b0a054a11e55bfb2ee90d3d3c7f2aa422577307074ff788c1ae71683440676f013a083fe0d1c87a211ebac3c649f0c3db452615e935e6c89d6240b6876b682ca68d840d72dc132ba2feac2370da66288f6f96d2670467cfa6f0e9203e681d3d09eca5dcb5d27c5ce990eeb434ef6fbdda95ebd5da47d452984871602cff3fee9480b8fef301581e710c98be160a4d6b341d6db74093105745b28e9c19165452a9a6171220716c9bc0c4749ceca2da025150c8dfe47e29ff075d312f9096935610b35cf4f1839282f82f0891df103001d552fdd3ee6496a8f043db62ac23cf3fc2f012786cb851b7abd306c041d4c03f6850c52929dc9e418e0371f784e2014cc5c7e0cf40c3c04044ff3562e524ef335556acec4bd08b97911996f032bcf397f050938decc6345fac6b2f4ce3e4db77defbbc512d0a29bcf91f6bc9bb869f09de5a3d99d13d1c5a7728ae4798bc9c91fb9b2acb7e61bfb8d1f4d19a7f52e90bcbbb8eec0c55941b39e3df7da8d57a74734a01d7bc51cc7aa2621ddb84ffa7e47557c415fcbde01b835702ec1c6035fe18d89cdf8bd749b203eeb63525c6ca16495324c065f7e919339e31074c57b8dad055e99795af5ebc96d934f2bdd1fda4d624f50b97dc521a643fa4c1a0c35faa35420480e7a9f4506e1732dd0ed763240edfd66b7469a59fa29fc353abf7636a1fd126cb8c0b7f0e73b4b06d8a8361272bd7db5140ddc02d6b5df5b478bda1800a8ccbbbe1a77d6bfe7d46f191359386cabc37240bfbbde2ec34136aa1170718042daebecea14834106af723b093d34c36161eaebc65f510f278cd5c481704d20c7213039be7335c082c19c97d4ef128546ee379185c51d52b9eff26f9db2d59917d7809d1b624017900ad953e7f62fa44ceb9e1842b4120c3727941baf9747fa5c87b551af876e24c5de07261cb7c1d0fdc8ab37e05e8e2a50de90b6b2e987508201afea35836768da2dd5de0f61bfa869c1f62fbc4534550cb61ab105291e6e29373f87f90b15836d75e04a2984514b190d16cdbc316d4b7a6ae099ba3d4d6eaa54f5b495dd22b1ed98243d37264f87e7fdc1c6d3a9b3cabac75a3fae93946f1af4415a8fe3b9b1386ee7a4089cbf522f4a79bdf8d3d3fd38a056ec331b22b80fa6a51b16c7b1f9a7da9e8c2bae84199928066f79c6c4ce1ee97a4c88f526430ee21735456e01cdda347046b5251a8d9bc3ec0903a784c99d7c92f36a6bb22ba1394ef3e4deaec1d4583679b2bbd08bde24d15a09b4ff33f4c1ebab46f3eb93e8ed9f5aa562e70e31cdc164d3d666d4c9a33b9be0355635de0c1ec76bddc3bb714f6eaee81ad4d7713a57dea5bcf8cf8a0ba83a32b163ba4fef15be2d66c39a043b1d98e626f7f5eba5f6ed008cf76a515b76f42040f11e871ea41e4d56914299e14fc58ede3957f8cc74aa7997019ac4c0c0e6bcfb47082ba41cd1f7209f483fe8bee559be59b00648fd8e39346c78525d39a0f556ba51e376693b7d3463247080d7bacfcea43bdada58cdd066716902fdb3eb7eec16e570a584374504d85266388f2499288aba32524c592168fc3112de25eb8a8ef9085992e2e3303d81ed7d8c276178442101f06d70d72ef894f64211051fae91f496a020a337e55fde5e66cdf372d5d99425a5ff1b6289067e18e5833eeec68748b9e4f59516864580b61f2bd41eeed0aed9fb6b1b80d2e3e28ae255a8a0aa7525d68a1317a2682dc2a90c9cf52bb58b4c5aa27f787b215a6052d6f834242291599ff2b34b4153063cbf458292ac2c2db51d62f65e939991da150d85de9e6073b34fece238b94d8e57b4c014568a93c5d35652abffe49e916b588e73cc2f29ac4aba8a330c31e43674583c295e52a7cd60828583fa516efadf72bfdc5c6c80f02df6ba459732d27c24860b658b7336ffa531e30427fc3d4111f3a7a14c1bfb98837fa2a2e5222ea36ecce41f31de23ace2ed4871521cdc53b511457acbd69fa15136542ed44c76326b4dd9118334910bcd0b1c9b01a9a0311ce8e3f59b0f993037f0e84982eb7521c815ee3b0325e58323aa8662efeaa1ffe764c2c09d638ee96287e203ed25c6ec425c2c6d3c432cf53021beb8701f00626d705a056e50cc9ae2b9295b5a658cadcb49b8432be640baff58d561f54701c1f1701ec82cd550ab446210d80345310bb34195c3e801a85406bd44ec82d9b50fb0af614a0cf4aa008d5b7f37215042c534c599c80b46bfd99cc12937d7cc5a866f79d5a076ae9b12b87263249ad815fa930487227c62740cc43e0e9fa9ef2dedd28e47427140af5fd82918e4450957a37644812d50a4fd5fde92f27fbb24a8bcd52be2f3138a3533fc14c0b4fe73473b7d3cc5048b51d34213545cee18f3916085f579937c53ae5cdd450de048833e2f7303a579da07b95392e0fb749c9e24b38687bf7106069b232c5234cef4c5b44bf55bc9fb2ba62024ea5410ca7a18c842201bc87ad167af50d12dec97dd308d2193b3ecaaf279967811efb893d1663fab395a9db436c3f4a95083250280761c1dd7d383b39589ec2f755fbf8819ce272676f3688bbaba01a605888e269cf307cb067fadc4d955c960ac7cf382318f86834ee8401dfc156fca7798cd1062af43680002d31f5f789eb1c4118954c2a9d539609e40f2935676586859dd73035ebcc3208b3022a1c7d116e94e1f615e3aba3147afba508a719db96400d4a7d3b3b3419e409873b3bd10dc0ec898f6f6846737a6d593fd3beb0523ba2dafc48d79b4f3e35ff09f05ed783382eeb4f6ce81b5f403c5bc198a4b359034ddb2b7c336673b6986fe1bcb0af7fe2bc82f9e7f0d0b448730da3583d82275a887664e61636175db2435be7e85e5fd9c45bdf9988b9645e062946068528f2a5e2631a6e7fb296c89812eb787ada673cbc504757b54e5f4da9f122c0e7342f889a8948aa689ec64f98a94f34f64aab590e90412e9554e3f8b32b40e4775513e333fd7bc77568473c3221eb2b3a09f37dc73d503ec151e42b7ee4199e2242c8828642210b48321f96ce35f1d0d1508ed195c4a45106a52712603725f8a6ed87afbaa0803c513bb305b95c4122e59e13a135ceb29e2aca88ca0c96b047a2dbe70966c417830c6ee1f9d13682db9a90e2fa30beb5f3e7d85baa014f5af18c761dfce0a3f96271f618867a88cbd63be01c87337821b36a2f419a48a05f0a789baa69683369d2aaac43fd27a725a6d7d44db382883b65387b668adda1e95451e5419e4a04af7373c905fc6098a89d041de748e62c72bb8d91f1a9953cc88c7cdb5413576162673ec2db8cc16bce79b8b74ceeadaa5330d0d7be8a4d3b3aac0db85a0d7be6ba47910b3c53a78d82a4dba9c9172ab73585ffb7868a9240863ec9cdbf57833203193417d32d7c2bfee2758198f448a6a670fea9a1bbe635ecf513ef4de2291de2de6750185a69bd0eed152c40d2589fd7cb34dffb497fd4296bbd8991a2167b12e97b3e01b9b4aa26b79df4347abd724e5379c15249012ca1229a38e7280ce54b804b5c20ed010c60172afec664344fccbc72a4012746ea7de315cd670cee599e137b9c96480039c51c5dba8e9a46067d9232ef3a18ae20c4250690cba1d4781dc7e75bb48fbe0e4b61e2e9e31ab3615ee3fc530afef1f488f8ff0302530710d61d51c46be811f7f92f3ee4e4ea43d8cf39ca256b461107d23b1e16803ece874566cc3506cbdbe440d017f88ed52df11b56b70145cad6b95854cc497be854840f975ac04524a48b868cb94ee4777325b0e3f4401080c949ef1625d1804d7c02435ff1ebb349c7fd1251ce76cba32689f29b6ac4415222c0d301f37b300ee3963468f8744063a427303e8d7f6874dd9bf35df80744f47fd40af7d0efa1d630595d966415bfdf73f93902bbe04e488921c53486eda7eecc0655b7eec6612d943552d83112d9d92ba24c8d984b5f0916d7a9b0842afad911b4df22b6c7c705cda803ec2d9554a6c534e87441e02c3cd126b89af3b4514e80f41f735f109003d292d9ad6fb837903efea0df49ee930fa2af2f310a5f0f8a3c9ba0eb6746dcee925efc928a83d210f4cfa5ec2c995a6f53cdb1c7ac34e53f979b410ab7b1b7072647415ff2256a7acbe59f0ac6d18bd2d1534897537d5e1cd6e4d84d3a0ac6aec2fd56e4c40c7b1d2b72ba49612f6ced37606bf1a9b8fe1050fc914595208f85e1367b40dfd6d0a0e81d38fdd028a3b717d0818d327700471dc0eee21d39f392b615391b8346911351a70d1041ef5ae01651a3d3a0aeafbfa2ad4ec56205475bcb91af379f8870dd0816af82568f2456b51a1cc1dadd56b3c0be882c058cb24dae8a4364c6df8fbe55d70d664090a715bf6b6995a368ae6190e4db6f2630a3867c4538b4c06efe67254a416defeba2ca0d0af1f3224cde2c3bb5da067fa88a006a9413f3ed48f4da3f9030bad7984b48cd51a9ec9bab400cdf7710591e82fcda13f97aa7a985b5dbca603c2c276e9147403596e701ff6ba2c384f878c9d8f68714bf83ad61a7e873990b98cb886d04155c57ec0608aca6da74034c95d97c24aeb98f4afa04ab893e816233b955b5c3dc7e0cd4e0a0e10c5457b867a0a97e69df78b8b7df07284c6fff4a7924bd76d93a170ff33597d91a7a181a347522104c38cc934fd7c7732baa9f3194331744fb1cd6091e4c8865a93fa27e902af01d271012d057b99a5431d4d76be54468b07e501472578de40da6acebaba9f54c15bd202366b90de036010b6fe76099e9c39604531bb8665d976d2adbdd75227424559dbac9ce89d35a19888479268e0f5bed2158ca4da9c6147730dcf70f44909f6fb203497bb7c80bc8c573dd094d08f75a42404d7949530fcf8ae46117c3e99cb324ebdc25c5f5255fc461f7b552e2b85547ad39f286acda8c87f8f0dcf7f144d7cdc1d9e622f58870ea8bd74fbc093d6104ca663a830dd391dbe10917d5266ba6cd396ced8f71795d69735e7893381c4b3749d6f9c84a455749adf78f57ae7b07f13e071eb35954a07b57c21cb7a08856a799f2eb23ccbb3ed10a7ab4bedd954096010f02c47895a10a6cfa15d0d3f69059422ef36697b5de26104e2fdbd1306afaf1628e90ef5a261b14d7abddb4cb2b0196af2fab60028ca9f95b0b3b22de6eed4825260482da170210433781e34a281d33cc3ac113bbf3a59ae2c9c40392d98a18dedce38e5993f8b218a2bf491b886076a3a992228708998149ab136dcb5ab52d0cc24d236a81065c7b3de1d54dfb248657d08b546716decb043c0f41824a1ff1323da6dbc994714ee5c4d14a937a547e5c59877552bcf143929219c41550f0224fd8c2b68ee6abccc68aa81bfcfab3982cd5aa66c79755e96064c7916c37b8a45c03b5955a894e4b0af9b6b6ca8638da260b49fa0313c1dd50374339869a2ef9d32642744a2d74a9175b9609d108e6bc3ecd658cbdb93e872c25cb7b087b8facf546ca3349020477623f34fad80f35a12416d27bdd99d45ba570a6805ebcaee05a50eb9f8a90d4d7dee8373c195515d2012e9e598847f4a31f9e0dc085167466ecab2e5e6fb968c96fa2596b279b269a36f10c2ebf7013f199cb074ca44faedce344fcb52c006f4eb7c7c025528641443c70d96f09209fe83fcd1827872f6a05d0a7e25274f34b93799c691750bbbda884773b9d15db47970df21488fd04a94d80b34628affc2bb08b7adc4df2ff7e7367959d231ce17a0ce8301795a8f780cbbfcb52ae807ee40ade08f01a35f13213d17c0bedc74029096e672f759680aaf4d7c2fa8e14d07187c9029927f747cc94fc6aedf60ba2d28a844c11b2c13a5d72a039a9da3821b306cab1cbd4cc3f5d542ffb1935d8bbfaa7af64ceb300dc7784f903b9ad470c43f9404070763e02be1311ce9822695cf22eb021e6f33006b65d5bb2fdec712c01f6d39bce03e66b24c19de71c245995bab9a0fb739449ddd9c88d08de9a81d458071848904f39af692242a3cf137130938697a7911b40ef641dc3d1c43fcffead31534e0d837e65a6ac869a32260ec124d1a2c92534e1621316bd431ef75d49810734f97071b54658e68565af65182d9eb20472c4a2b7a8283c82410de83990d6190d291636f4ad7365e83c1a58ebbcc975c296e8779135d6d057296dee849b7a23e1e9455acff97905ff3b7b8012ead482d4b8656ae4fdc82b4efc0d8c9c1c91146c5750f029d9506f58dc85501ec68bbbcc810f8fcb0a69012fd4f06b9b104fd75959fa0d08d22707fa9a49ad8dc1a5a15935bda9177a91128e3755f3fcde4ecb251d919e393577d05fcf5ecc07284be7f9ccd3bc41e070f731c0b11e8a52a50d17710747138fc5a2671a956b239488ab64266704486729b25706b1c72a913dc5dd15c787b454d2db7c898a834547a9b7b2d7536a88b2851a7ad8440822fc06f503a8a9a250e018ac520f796c5a2585239431514d97d2ba0145d52570ea9b35ebb3c84647cc6008f626047372fbb5e4196ef7668b281d869a364d69741bb8b208a7ea17b5ecb89947ba90def23e4ba50cf795353e79d0e197aa22fad64721f1e0eb64b5ff639b288ecdabc94a9eed30f309160695f75767193ed8cc0a64d8e8b8352b94b19346e7748514557cb97d97f15707d21bf437accb527dec5c39e916a9fa18550b646a2817bcbbe481b33d41a91f6b4c4a3de0b3d2a0f2ac0655040e34d0481c06d74c2c83b73d380665abf878149b7f70a5518f0132956b78bf15c91965d45bfe6c92a0be5d6ac6ae747e43ce9d6ffdbe1c085279160d688a57968bdfcce73e3b24835642b43b4fcd36afb3c5988a0c70568015419eb5111cc90b6fa3c81052ad618b5ce4087df09433ce57c5e2914dbd7204f24f8d7c299752019d76fa0a41d7a258e77f10fb01349039290af478844dac20525164d4853dd3692741a7ab08429c89e37386d31f8fead231bcb10ee7934337afc76eb63865d872b9579c6b1a9bfdabdf1a81274e41fa6259c897a15f113bed9cbed7335e93adb839ceb6e87158043f0b5dbf061d2d4510ea47663f71d6ac8c3d96910a24bff3f3c6cdb371c86ec5b2b9636b8f65e928669613ebf69711e78fadbf6f1184d0e46d35b92b78d770d8a07c2657bf4dcd0b1b6012e32a038b3efe2c0c6b6cf0b7973c83a866471ace0cb5cfce4516c0a997947a49c6e974ba1f15c7570eff68c99a5ce6e91af9271fee24ab9b390060c9113c43737b872ec9ca642cc0d30f06c868b0383cb380e4bc04d55d9c65704a63f48655ac98ce221865ac2cf87c5cd95b0f94b504d2855902a0086b7fc0656655f2c86ea838016ebade5672c773ec15124859764a341bc89286e04c260d0e59c3fe73b94ba12bf70f41ec66a4f2984f51dd73cd62707383b718ce77bbfd577a9cc7c4428ee8170dff4f6f42581c7f6a73353fa60bb6c4cd0e0d50d2f86aa6e669bc27f13c6bb92646f3a990bbf4f8e93747f471d4b7f1d8c2b2f277f19209b86e62f5442f387a781a65401e270b40effc43f4544cd85474825fcdd5e31c08390bf1a2c729e57520fa68d85b9889c530031fd1f7c423756c36d2a7c1557fed5b38c4191ca86fdf741f6826d2eeeba47a1e7d7e2a594fbc343cbe3f02d2a657c10d041ae0ca13306a50489cb40c922e92b87348d2975b3e8e45683fb9f4b36f2d11403a6bf949bc1daa04cfe72bf428cc340c6154b4f71779002a9901914828697a2dbf9146ec007f73aabd78ff80e4219da022e17e4255772fb4872c752a5aefa82efb348780ff8002b381f2ac9e17f547b3840c75274f8ba4408c0ca0d9d6f3edacbf10d5e0144f9b3830395b2b4a42f2ee786e31a291c381eb416d623ca684324cb0262d48bc6b6c8c4a31571a71c51f6681766067ccb0c7ab9e15e9e676cc576908d508b1b87b55603379e60fea58d2757bc8c780f40a5ec29feb4d2c740998e64dd6fd0c12c39b58266687478620594963d4ccab6ce32e9deeccbd42ecbf0bff7de332d60a4b0ade75fbedaaed1cca7a9f9ae0bc13a7c41e95a25dade74a620edc5c8e349863ef37bd8e5e0be4d799a4ef6ca4c796b605263d1e989c5c76dbf32bc8b3c4a9db8724fed1ce74c8188a2a8743959acd7c88c8bed387f3d54bf40f5da1cf8d1f0476777448751fc52830ee94dbb4eee1c096ef02b04c7899b32bfd9206d277bc661a212bb14b11a33168f1f1c6ed3410ca4da9b36a70ce0b803c993bf8938f05124330d0e30425e24825f16021380f2c496cdbe13170a057a4336a03cdda442e82b86804ed0f7b4d7bd269bc615a297dc34c80fea3c3c0a4437c512b004d8bb833c3975e2a8717e2ddca0ac7d26d52b3148bbf443c1a2c92a44d58b147a11c588fa56f01519561a204a0505255c147896bc3f49481a191e419c5fe8d7d90bcdc3d28f0f03f97392c7829552b655c1c5c90fe23658a437f6ee571e1d4caa920a6123d26e500487faebd9104362f41b6a2e835899a4d09be5d6cd461a1a23d5d1962515c7a27323872ce67072276e9d9067ef8e7578b108fdb16e87d5ec98b998f9b057c931fcc02d8e804ea08273a45d965a04add9d22f1be9e92996856a5c2fff0a83da1690031106d59b057947860feec3bd5e96ee8af641a8b4b577fccd45d879739b8f7d6e02d164e4b52e759c62f01b288b538c888ad0c11b8fbb74806f6853bd85f72e2fbff245e499cf3779d4a0a2fd8b7dafbf3fe494a2246a513da683b4307b1106e316ae77261e4d4e0a0e6bd961d33a5ddb5ec74923eaea3cbc5fc0d438527946350f3d2ea8200ca4b85461d64d5eff9185d1996e02c22e16b279c3d36b4effcc79d19e4afe8f432abe35df4645fe5803206a2e7d4b4762196acf6a91eb9a671f9331921ad791b4b5136e7046ea0dcfc105bab6bc55cae937468d6b28ba10569d30f5219ae45a7b054d14e512de1ed8baddafea1e02b9d0266ad613d1834225a51b4c3353f51aa66b402137bf5f28ea27ec603c62b46f249acd4016ef977019fe0bbad9ecd5b60b26a74879256a5821337d851bbfc944a15d17d5dfd2bc100c71a8f53a89e4e005facd3825f88753a11e27521bec8be315c065487051db1901b60ad581ccba2d4b2ac4f1e40b15876ecf119a2e10a908cecf7d3f5a78edef389db97181cd87eccf65f1adb8c39a9914f10b04a68a390ed477f2914e8d283d496bf197e75696a149cde9f6785e2fd5be8c55569ae3f3118ac274288af3380a139bc16890daf3173dc62e1486429ee3f8c0c01478a69eab0ae097132bdcfc2885cddab202187353a60d7a2f67365113b4f164fab6a5e52a28e72d2237e61999e6adb56539442692196ff7dcf5b8ee156f04b6890f1bc462ab234578b6c6b049822816be1cee9d456984619231749b19e522c93043039bdecebbc10acf3ca52f2bccf851e55a5bd5ae5fc8072fbfd3c3227fb8568c7310ba77c0dc2e3f65b9eec04652e4d0dc5a80773a0190ab9066d74fd6f227930c53bcb080dc1e5e03de2c6eeabd61f8130e47ee4a66ca15798cca70e20c2e30e2a877f32452078b54a2c13fae97a3b0a7c83b351bf983034637b5af3417d82e015fc45cd88ffaec24298ea64eb1f067a8e2a443519ecf8b340c885a6164244d572db2e5bde86144d149cac25583fad12a0df32256ba17a25d6f4cdc69bc18adaefc51b56b12586858d47e8458f6f3d55c209b822d60ae46ba4e60f2ee7f557109855b77517538a2a95c8d593df3ae400a79f87568f8acfdaba22edd471bd9d6c093928e754c5153742cab88f052004321acf9ac206a567290e693e3e2ef00b98ab87ef536c707dd253349f8b88fe00059cb93db7c4e8739b6b60fd4c3c61312e55a3c1a8635584727de28ba1d7649d005f56e652c07ab195fbe25b01a65e89388d5f1ec3c45ab3f586d86b5a82438c482d62db1be945390f5e82fe78ef8ced828d9443484a25b92de5cc4577782d19d35a8b30b4e2b622b55cd157eab5cc8512c9ced883737d47dc55a66331add463596ec78c594289dc3b23067699172a1ac75a9456755b1e458ce0adda8205abe2b96f8964eaade0988ada2e0e6c950480c1999d7098fe3e2227e0e7d4e1417c6c7ed793c5a0ced5c29d5ac703f6db0ea4b180f6d0fe38f55940702a332c3170d80c931045bc1840acb89c75003bef15631dbf584eb575ebab24d2eb3b9566835ff7a92f1d2e48e5e9ca2718adfe116b6905acf0dbc3d08d1f30dc761fba6275005ba755ae3f17611b82bda7556e0cc05382c07bab89bfb7b545a265a7c90076efed29f516995fe6c42bbbe68d74144ef70b104f69764ef844016dc51a061facb24efc7f83c8039da7139fd19677ad6fb7187cb0c8da8a419950b95640388d8653ea97b7f61650f208a0443c4b4d2b1d173eda24980e1c49a188f082fc078442317994180ab95e0b675a1cdc3a998517fc6572d0582836bcaaca222ce3a0e632159858c195ac7140b36d4ae5ef4d507269da3c22b39af7cd1f688602aec11a5d9f9b88c31739f4f323ad6d948a18d9a34d723c42b6d2410c9cd0f96efba0ab98b9e06705b59dd5de61b6c0f53b2b6d295d04aa89722b8e824a303d14eb65f40195ce8968a4d47308886608c93ca3bb898a7176f7f6d8ea706e2b050ab3629b729d54b6b9b37359a8b5afbef79db91eb51d0fe2b3bd136a859985c69cbe8cba65cf1c1157fd1356d6787a0cbaca4d1636d4b51c6cc7fef6c03cc4c8e71c57c9a33378a69fc270cfd25e1a81db8efa5dd89d6598a22d1a83ac79b5130da9ae1e2db5414132e43450068b06812610e428cfe2c47623ae18d685b993c49602639d0409002100a98eade2da1e2b6f8dcbda5c3a733ad162f2348c325fa2278710c8155bfd29ef37fe4b29079f73bd5eba8ccb01fb518bd1b26a11b43a5f4d299324565095486c015bacacec58588a7b5ee59d20c46fab4864462525c142625059bf574e7b5091bc97222b5d2833f5fd7073fa02152ff6740122985a4d2bbcf99815eba4dea3fabfb99d0c8f12999cfc3cb131b9f0885138f4692f73d5bfb36dae35ca651c609c03f04b76d551cfd37b5c2727f001010461046a19539e5a2056324e07f165cc5683b76c432f2587d16e3ece154649619e767972f18baa5f7b8cd09c283c4f5f0618998121ea26e24d2c0c4000001fdb92485da4eae66c094269f168b3d1fd22978c4d36d4c17e0bc14df6de726f29539229db09bf09ac0949b757b1dbaed877452723446576414873742b253333333333334766e60c0a308ca4bf2935be373bd06d8f63c8f86c798667131163f7b70ecee694ed38c44dca6ddb9866364e3e1ddd7832baf1b51d2a7fec78b272994f52878e6fbae6e91f962a6712b903f8eeeefebee5e57c399fdf530d7acd41a2e698a086348c2ccb34cb514a29fb0956e2127b7cc1389c840592965896232c0d5ab9fc272b6ae4a12084aa044d01f289309e264c1afc095667f14f25491a647a240233c8108391222e0869a14129a5d36489ed72661addb8cee4c59c2a4a668686460d1ba99a1b2a1b1c3974fc670170b30a800040962916d1ad124cecae01e0f0787e1d77112073a188916e752dd30c1d81239da45ba8e7e767d2ad99679a671acf359e6d3ca79e6b9e3fb2ead9e6f9f43c9febf3c7a26ee178cef1fcd1a85bff0c80e79be78f59bab57a0ec0b3009ec1e78f5874ebd3c1daf1fcf10bee61c27309f663ce09293c0a3bbec96009cffa2283253cef74091d00bd21f2b25e00de0b7d4db05c02cb863dd77e7c1e041080f7c30640c767c3a0b5df975ad94400fc686e524704f05500d02409c067b255c9eaa39f89c9cd27df3601807d1d9ffd6cc873757cfccfe10d91578795392ca534272e8c30589f6bd1e92ba2e262e54e176e2419a93e21355860b9f1b590423aaaf9766c68e9c992fa7c3058bf863764c7c6a743c3470b353e1e343a42687c39333c5ca0f97630585fe69473eb0419ac8fda6124852fc5acfa287cf5ab37448231e47c9459f54ff89859a77ae4ce67b07e8c37a4ded3736d82aaef9deac9863c03f8703ed38f22a914c8e0dc61e4fa73600c31df6f3732789f0dfd194c5f4ab389c0751a06271fb9fef1b9e90d99db949247d21e137aa60ad47b185fb42b224da422ae098c1ac6a599999f518a5f74b33f144ae6a5cbbca4f7f4cdc8d4f7efcfbfcb399ddebf25eef2b98282bdf8fb33edb8fd364dd4b0fff461876e93ecb83136269d6c440a02c9bffbd4335af12f1a4da96107c598d571c4d19d61d6adac4ab7b46e65dd0d8f8c1ad25b64a55d2957cdd77c3e57b6c7e15f57e8472ffb2ef6276fcde7a3fa1a99fda6faaec87ccd87c3bf6a6abe2b3331fd5dce0f1efd49d4a36cd8733be7e63458ff543f3af3d1d40665bca8a7d741a5ce74adcf5363555fad911b5ff33596e74655c9b467c3afaaafe755f3f5bc545f0bd10153a99a1b3a457c72581cb63aebf42aee247c3a9d7ec7e9c77c61126ac6e52d5b146dd922e8e2a00a1640381a1a3d4532a87f77a1fec6576dbcaac6e750d9a8615530d43c8e7780ea735827375ef538ac932b4e6cbee6f9558343f5ddf8aab3505ff3d97cf5431e3b7efa92b012ea847aee72519606fdfa79cf650f451b74ef87cccb2bf3a9fc65befecca7f29ff9c6f2a9fc558fe36b3e957fcde7789b4fe56ff33afec6a7f21d33a837febf8d3ac85d387e7e0bb92bc7cfefa159f3aa9fdf53ba35f3f31ba85b323fa7cdcf7f1d393e1ca83fd9dc50d57cec278f19e7d45fc8f38286b2d2fb917d7fa6a7a936e42eb7a25032af3abdea7b5e353f23638bf8d8fc8d579d5e6579aec83c8f8d559dbee71524635596e786559d6c119ff93daf1e72d6acb1d57724d51c8fe3ff9fe78a11d5db3ccf152335af7a9e2b46747ccdf35c3172e3dff21c71d6fc1b6f6379ae18b1f91b96a78955d5581e1df64356626730cfaf1b5665abb3eaf3ab6666c981a3e7d6477d4958a97e472dade9d4bdf14d822997b76c01ab97b72479b95d34d57c3daf1bf36d3e1e3ef5c6d7a8be9e57d7269bafe775e3eb79a9bef8aaa9b19dfde933c57496bee963d2cf1e675543b68fbfcdef201a9caf7d5de5eba006e7a73e19a51ac6a50e9ab363339dc38bcc09b340834fe8671a615263a4c4d0611d1974b8e5cf3d5062b932c0ac185a7193ef134fe832c034ccf2c9b2f761135396df9d32a39f0fac2403f15b88db8f824eca5d30302bfe162856601d9da9e305c541951fce8a592cc3171800deb00361cf9d364636d2be44e6496d582f337bf631993d69e43e7616922961d0f10dfdd046da7ead064db40fa442b4519742927c66660d08466071678a9a6c7ea02d81094283f27350e58753c8a6f044cdee049a42dca3bb0c06f7a871fb39214ac394e4c9d86da11adc30a7883037f431a550b71c084b97b9a11921b6fca0b4e587a4c8858a29870a2cf18b51aa4b7d33f53bed8d51517ffaede99b6c6ecbfbc83d625e66dc2f43b35465c228641a227ea1947f2302bdcc12f5521df64f956e3cca8cb2a24c2815548128b744bd44201a1a9aa7914383c6b3f3332b3e8d19d4c7ef44e30b9fe60b39d60536140b2390cce7cf9e0be92717f5d223e2498085b928948db0069ba7c93701c6e9d721821a3299377e016c7c4725dd6a5e9a00f708c2d7ff6d7caa0d0a9a5afd6d7c32342b861a43d4b0af67dbc653a92068c14284293c0dfae046fe9278c6cd9ec68cfa57db01529feb220043c58b94a50c4a971b623920f500c4938f02f270bd7fc8a05cee77fac9f5257e2dd04f2e674327616e927ee276dbb6144fb3fa6993067b53e26ee4d139b7dfc6876a0344cdbe8d4a8db65fa78baa08d4ad39e5f6c7a36e69f1015344bdddb14b98206eccd2a45b7de5f67f21d252eddc16906ed7a0c6fff865e3e397918d2a6436b549a794926a195b9796efccdc99bf3b9fe75f2493937c57bac5a28312b483a0970d2c64c144ec458bac349815c18c384ee9568a8a8a707811fa2216f54b97ee2e3597d3c6a525d1cbf56158152983c2182a2a320ab2423f9503b6a7bfd90e744fff2fa5b5364c36aa013fc0828a2016dcfed03bf914a9025143ff61972c626f49267cc8210a25a624c128b8fddf113574585fefdba3dc761e6efb0f31e616e6b086817156fb9541ee92300983d5e852b9dfdc3ee11e9286a6a16fd8b0278cd3448cd32f8b6491b4228da4920443629141528b449249f20b7914d4ad5012492198acd2af4922eed1d77d3aa60787b92b0eb5eccdf2c417db39a70f90519629b020868ab0045d58b7c21803f281c56451944541957bb0136a3b401f87f8a26f55fefca25d6f106a83378039ec6f8831b36c82915e3520af04f1e28b06e681105edc2883d0460446d7b9b8fe340828d7bf063183eb9f126209978d23da3b50110cdd1c58b0459c215c29b31d5ae0f406882ce814710609756bce2c736a993be01ed963a9566610edfa0250b9f1270fcc828f78427ffc3905bb786611831b670d6eb43fe67b37dd5b40f6d2aac4d8d15b68d085f61159b80c860e788002dcde619cfe1c70324a7d2726675246468c7ce6cf80220bd2d2a578420edc235afa03c6710abbfcdc5c7572288d5ebe859c15e4c55bc8ffdfddddbda452b5ba096ae8b09b01f9900626cc8060e817fd1b5ecc04e6baf7999062ee32257da54e83bca16702f349a97429b2e041f103eee149c138fe5e4ca64b0d3d2477b1a74c48d73fe46ef02b855d26664516229f00855b1ee09674985311bafe8a227ebf628c361574ee3e8378efeeceec835b0154621003002c43c818d1a58e6f4297974bbf5b59914fe7bcf45747eecae8b3b8d430ae9e308b3e6711ba3797554ba896a8d299544b54f7d50f33b6a69cc55567d16751516786bae50ae36760ee7221398b3ea516096906f68951435718977ee842baab954fb7e8bbe8bb90dce5a2b4562418f885da5c45ee92799af26e6a8ccddd5c4597b2dc8634f7a30d6e6f92f94ccddab655145ec1b8070b97fe0a88c6d35fd1151197ae7eb8f4573c5cba3a5a215dfaac1c5499a779ce0be25db72b18e3d04fcda0ce582757ead3b0918dcc5855f7fc92b12aafd6080dabeaec2bc759f469accaad03b497b14eae1891f9ec9dccbcf60ec89cc87cf6fcda695696ea82b96b88d2eab9603bcea23ff3d5e84cde0f150cdacbbc11cd48f645b6edc308f38800e06e7406e62caa5aa266aa25ea64a9a0863d97fb7006c6bdc3be6d6606d620eba872276f7bff549b5dad7c1887feaac61375c678355a5067c77d16a0b9dcbbf782642276398bc433d9213e0374e96f56e59133b279de8fcd16317d327c317841391b0193f783b33334483f3b01fdee9bf169905649d24796fc554a98344869d0a5602e652ed123925deee3ca875b0135487fb32b5883740676e9872bd8a53f03eb563f7d971799a3beb45b4892d0dc97de812c62d79f8958ac5b959ca797085d7f0dfecce506d1ae3fb37fbcfdb9d398a840799ba4f0b6e106f84df052e3b37f77fcfe6ccb19f6872c39d52d4d1da5636e713451f769e3831adfa537476e0ce6ee6e7e2d0872ce19a7cca6f4ccdd3deb418d3f3399691e397ea9f141c9a365399a0b726c3c547881eb1f65b6450f03336e1a8809b0e9316f18bdf8ee92ddcc833a339969aeb14d8a03a2c6b7e11e5ae683a669da3783da0d51dbe5e7b73dede5d75d08b02b6e1b0a5553f37d37e42ede2ea30e5a6857ea003b9185edfd5f299dc8c2667dd0945b669c4c6a9ae723b2c0a9dac5c7f5cc2e0112b5dfe91e2a25d53eaa71ddcb5767796c7871360a65fef38b45308ebffcb2222388e013fcfd093029b8fe57ae97e0fa7f34f0df864ac8a1841faa89c854848019d44b542eb1a7fd4e5f914b4b9bd7ee6cfaf6f54b2eb98b97424f2eb177db2d25da5ebe361a46fce1b527e79cb3bf29d4e010f58c1ad28f06734882519556b8fd32708f68234308aacdc7e0aeccd6d4771196961adad0cbde8dc14404472d26ec91618618946c2aac8a6efb6ee7fdd371d6f6f2cb71d6d6dd18a26a1fe6444d568063d011eeb1c2dd3e49fcb91b9f71375309eafced9374cbfbed9574cbf4db3369d22dfadbf3748b83d54dc7e634d8c4b757e22ef9dbc7edb7b86dda26f34ee4a3de89bfccc7ef3253a6518059dbf311c6d93e3583eae44acc3b41bd7c272aed7962ac119977abd22c513f8de599b129676def3496e78ae967ec15ee3f5a31bdf6cdeb1e11558c05d2b7a734b87d2c6a707bbedc6b9ff4ee5683ead0ddb6d73eac4177031bdc1ebc9b67ca6883dae59e72946544ddb8375deeda24f31d71d6e6250a31cef6dcd7ddc87d7e8fb82bc759db53baa552ff2018e6dc1918677b2e49839b9206b7e7ec9106b7edf966b348aa116dee28ebe6ade671f00ef758e1666fc33dfa662adc0ce766dee5cea8b5c1ecddc52c847bf0ad2cad8a3ebfe4bb55514bd4ef1f3f4c05d12e7d4a6d584335000841d8940eeafc307502eaba8eceee1dd9679c9eb167ed5c3aea1e594acdbda567ccce724a6f31bb6b3e78e44476652fadfbce9c314677778f31d2dc18bdd21863643e41e4ebed72bb998f1e770557eb7ad8dcddb4cbb73fca1db71e5c6a5141c933338d4eb945e73866329b393c743c27a7ab1229e5cff099cca616d9b4d1a24ad905a16bdf62cd42661a9d7493734e77f926ee56e8e3f2f3e89de9ddca7e73570ecdc9e19183028393c8f58f59f3b5f98dc20b37cbb2ff213f66669aadb26db298312d68658288635a42c6e232c1040aa6abb48415766d53a86881040cb6c42f11849432e84a8c4c2df1e4cef7286028f1812ba1b8522a9174a511962b4b28e30464d45831ba3144dd2e67b4a84d95f2609a2263ec22fd272ef6c9767fff53dbd9cd6a60df18a26a9787a85cbf89a8c68f6d84871a4311236af82f854cd9b30c6bae0ea559add3fa11265f6a1325a00e6aeca6d2f14db4417c1590be1c3f3ee156aa8ba83aed8b30c689af8ab1f10983f123ada9d4f6a5baad540731d17fe854fd7c59663f38410e2d3faa314e730fbe4374b2fda7f7ec96eeedde73b60f41894ecaf6f6381947cafed349ca67e9d22d964e156f989bf8391d61450e244c9003093350d1072828892950564490c327892e6e376f123ae820a1053c62e94a5980ebcf474c6931aeeca2a604954566e4f0e0448a1a200b95156437454277fe340196841b57bea452e670849452b650b8338b1cc82d443834813402a1986f0efd2004a3d7e9e357f7830727ae89365185be5cf9e2c66bc3493a3e9454b9fd4c581671d7579952aaf36318708a1ab29726483c4c3e173ca9d3e00e0e206a188b74765ce816cb30038a8a9dd7b9f35d27076c67a7416fbfa1218dc95d8aea1feaf8d8699088bf6a8894dfd3b96a48fce93e1af4e9993e264d224c4883e1d38fe6f2a0a8a85e5c8619b213dcfe24ee257a51126388bc34f1eadf1162634a41a78548ebcb53b3148bc85fca5fd459fe27266a18611d12516e8822c2fc3306c378a3fcf8d1dc183454c528045858a85b4250c515bb8db2b1a586ab188f1786166418117ba1227d9a58eb8d317db49dbcfd2b2fee9af9f6aa578356a919d4286d306b50c395122b2556409bed6c8d2b20776532d4b9e12a16a6c215d06acb6d9dd5d1b7c2b2d241440df2f225898b5183dd55bc7c49e2d260bb8c0da67f8876e9d32d4f045dfa040c54ca5652fe0ac85d2b23ba326a7075d445cd3e5c19dd1596d5d18dee5746bdc2d2adccfbd199ba1f2a18687ee61d40336379ae18997999e7e17e934fab26f3993ed37b9ee7b9d073332f634f05c3cccb7c0c3356c6c6c0cecab40f57316d65f46e6516a4cb5bb21cddd3e52d598eb8b1b5c2d260bf8c5399ef8a7c999f79f6dc06355cc1c0917b44bbc2c238fdd1ae8c9ea8d4c65f19dddebe78635052f4126494f43a528a60848e3a8c41415de2120c68a8288674bb0b6c26a88ad06aca8f22291ceaca8bb38238c85760ee2ab6025a01754b4ee92add12f2fed550b7e60b6effaa08ee116f5bba8ab91b71b745a20d574932c44069ada9556c9ba14b9218ed91a58b0273c31512bf506064ec2a166d6ca9ab18f760e1f6af90b84776fb5758744b259f5749dd8ad602345789642276e35389018fdb262bf8563122ab2e32673c3174c3556c35a5c1560df1974cac826e07897705e4b3e527164da88fab90a204b0d7cc29566766fcc399a0dbbf8aad806e10a08c2a0393815dbe610c5ac55450a350641dd5b0276805d4608338a8e10ac8061070007bad80ba65019aeb11914cb8e0ba45e243ba36a13e6f150b5a05b2724b93ba8b5fdc524b4e08ec9ad30cb7f3a8b3e966cc23c6692039eeb6c438f3a883cd22c8dfdcb315e896017149ee1f9e2297e43e83c718ab47daa423a54990b6372a9320a59ca954ad5a26df67149c6c662798405d54e1c6141884ad907131ee0afe3914855b1c5283dc977d80597d84d4ad0c88bb825b991406b9a32377713de084707b1e6d1f9e322e69e39236190bd44b81dcd5355c1fe2a60ca85bcde0fcce38403fc06967d02c46dba877969d3aebbac70d469e9a0d57b89d01015d1c3703f254cafd497f9f6049b767129dc25e2973e57357becff4973edee950e387e93aee967bd86dea2f04c0751d2a07922c0f357ef333737fd29f98b132cb19e5323fa59abbb7661406a5bbbbcfa099c54c29a57466e61974d94ea02e95a2344ea9f1278c71d81dc866c543c9a99f73c6e8524a2981ae9c4797fdba9492a594d22d87439665df8c534ad532a51c23ea20c770771da68d8c33bf6d9031c6b8c4185a30c718612ea5ebc0487a6acea221252945264a061d4ab9c7a2212529456e93f222dac559e18a62456418fd20c7ad2e3fc628614ec8073b9be8a5e217ff238d57bfb4b41ba54046396ecc12e3f4db2835b2cb18b7dc11e3f49cecda01461797853bb2823baa933be28e6e3f77c43df81493488091f305b08cbe94d4aa2451e59869355682248c6e4f302128c2a7eb4c9c476483e3779a86cfd390625b4db3ba4c23ccb94a3c59f333f077848344a0c1fe7895a0be511f521994c90b7b54b6165d2edbe0f2162d60b76b93ea930df6dff8f87e616a7c971e2bfcaed7405dff8d5d9de3fd29f748bd3f8f8b64863c762af7733e7b44e67339a0d478391bcad7fca5c72cfea671f969d4e0b7f1ecfc35c727ad8971383e8dafc6177697b097da4b19b75f26d1b96c8fcc108106dbeb241d6ac849fd9de601f1aff952cf9f8defbe58f369df75d11be2cf1f5fa6f135d806999f0a88c797bd8eb361b9e79049fbed28cd17c60f24d961f3f44f1f92181ccfd7fbc2243c4cdf0cee927c3ba21cbfd3ceccdc3dc77da1e9725c6799348bb34aaea0d9703cfd54fcf2f2db7c2a7e7ed9c8ce48bb9834cb54240677f14b02c14612e578ed2302fa578e6fa177727c4c9ad54ab084dde5f6cde37023df21a5cdc7a459fddc8547271d51c34eea309a71fbc34e126a25a5a42424a458ece8a85b4b7f631187fa1b4bbbf8e5aa53da155f1d447f5be958743b8b127771b7da8c2f60dc168a40ce608e62d6bf34d8ed368c309d065b47dac8028686076a9853695851c39cda2d77ddf47b0f4960f8697051c33874f9999999999999999999999999999999999999993932333733471b3ecb24742fc45711e1f7778ba49f6dea767508bff7c4d8a4e39b259bebe5ae701969084137fb41c4756bfbfebe3ca755d1cf3e5ef9d376d0abab342bcaf963ca4f49bf8a887b3fdade9063b407242e0dc6a07893f311048de61552353fdeb0eb73fc4943c307a4b1057bdcef382be685748b6adab6cd39e7a4a17fd26f8e86dd27d13ee627f58668dbb7444b427ffbe9693fb5d349fb16884424db6fefd647770a69b7b7b7b7b7b7b77f77efdd9fb68f393d7d2131f5f36c944ddd24eba4c9523468b7b5d3fc92d08f79cdfb715aa22d6972a910be9cedda24a45b426cb823e48ada2d6ccf1edd2c9224d96b2fb397bf232433d1c0a1168941faa0915441159197403e975ff2a3be3fdbc266d42512d51ded6aa15921c742f0829ed376a7c1d8e526e965a674b38a7b44dd4f25dcc7effe2c301f09fd96a6e9fd20eaa46c4e72f2055d6ecde52d2418bad19b5605a4efe5daa76dc3aea87fe5f4971e917e6a55d4e4114be62e3dd543d99698a6699a2663d46ce851a399d3d6af39f2399a4a247dbaec07301cc74d26fd724a1a9723c7d9693241ce871cf31e3620f439be9e64c79d4f3f24997c20e47cc8b1ceaafc8deadf30c7e8861ccb4965230002a88754401a8b191556696c523d445ffe508548d35863ad63993d7b9232692231be6655fef2deed0a0fc4a791440da3172fe28211c3d87157fcc8a55dfcaa561a8b96f8118b1883c15e212331e9aaa45bcdaf20627c55b9b1ad279520473ec7b2507a99d383c310aee03285183b64914196022a3b6c5c84d97105169d2bc2c0c20559b4e0ca9ca94314a839e79c31086daef442caa75b9094aedc72e54a2b7eaeb482065508e1cad77274721c06528aa099261a1b2a74b85252a1832bab78ae4205441883054708821098c8b0ece0058a670a4936373b56b8218f2b7d4471450fa460420a30aefc14962bff412d595cf93950aedc3245962b9fbfc0c10a2c3c4461842f8040410f31ef070f5510eee2296210030215502c010519df42b7e4cf2901a20f7491821f96ba78e2353326eea4a2833be79c7342a1b1b9e972c31d4ff480062d88c205425cf929172471e5833129393da0b0e89e4ff1a311757bbe165c126f0d8c93c96f2f01aaef41c37c2d014ded9269992cd1349b01e7fb35b8ca5fdaf8452eb059f15908f75882811e9ddb39ddfd93ca3525e5f57f52e7372bdad8745fff78308e8f606660fe7ce618ee58a2011ba4db70be330d95a3402aba600ea8e3a35b3444514596db4f73c3e3cecf6c0d7edd25e3c4975fc000e986f4b7f8e2ba9f9c526e7267ce0d0fee4187644fe90bd96f2fa9a673e7d790ddf935f89d9f971a739a081d3f6b1f84ade4c8ccdbfbf317c3dce8c567fa5d5167f46f1175460d6bf5548e527cc781a6691af7dd493524fef63448d5906891d0d0577bcd128996fa0389977e4598df5784fa15a1fa534ef31e482441cd96b899913f7d8d63666636317b1cc7b1adc1af67fa68fc2e26e6b998986de3b82c66cb521cf8d964bf75599665d9b66ddffc1a35cd7ace26d42e67a6d18deb4c5ecca9a264666868d4b091aab9a1b2c19143c77f160037ab000800649560c20903508107ebd35142b7709e779880420e0152c031e14b30a104134a6095f0e00e134c2841051ea000fe46069b003c8b0029a09073c20076340d8c7bb070fd8b18894106f992a92a93d244e90aaaf6d12059e934b6d42e9a544b54f909f8f116602fb1bb79517d077882ba55a9cf4ad7734e5e64195dbc323acb83482b2dd075dcbda3bbbb1becee9ca933dd6577bb7b3663dddded1efdd40473744d3a7f64a61a38a54fe9daf77f2bd5b8e72db5d54ae57f83cf2f9f3ee3c43731ffd430cc1973981ad97f503eb5419e5f68a2eef373dacd29bd054920830c32c820830c2dcc9753eea29e4d3946cc0521d1d4e08f315c908a39318489054198585014e33385054dcc68af3062b931de4c1f4ef4c0892468ee0a9498885d198ba56e8de00a90648c38a5002284c0e707e6030d76f0ca94b819971d847033ed665996652729fa15612055d085d2d109ae5c01ec4a1342c0c3d48419377b996d5101d2cd3229a5e42ba594326e71431a9b9b652980dd2c055bdcac09236e160518642469b20c98d4be644028a38b6b9c56c5143080d2832513644142c66860048e06411d1948fdda0c967c0ca1a889606ea1c150cb74b57fb04139044cd09c3bcd399b1701d8c013607861042e21b8e1064a5ce10410f15ac9218a1b5a504515439050f0c05980d102a6059016412f14f9fc60083e413e54a6103a6941147481299498c2840f928ed0032d5aa840c60a2db610414401769480280c2f39a87206182422f880083f68d9ccb29b655996c162db167df012fbc00b3aaa6533a3cf3d1849ca20072a78a0041551c620c12b6b2e6ec605194688415b04f48608548488a09a444b29f2201449d1924a70c5c70a33823ca00da16d190336a58b536ad3344ddb5ea08496ab695750e9c1dce1055308793b44215ea0458b27c587ca8ca13cc6108e18821620caf0c10d99145bf430865b3145131ed83609e0c008247832850a2313645158e1c3185ae8b0d9e782053a5c4d83b26d488848ca810a6640c58a1119145680a00519174e9c1194ddf0af69dae96a9aa6695e26025c0006361110039a7393a07ccd0a2d34f0404d559a9ad52c82008c0d40506b7db9834e96659996655986022ecde22f2818358cd49747410826008b4fb358d39933a8088e84333e4029a5946a4808a159a154842a5a14445b16511849f1818c54e3ef176e3034b78f7e375a16bb9a942138cba4a6695a0f9a16d3a588b90b2da424c92d5f8c76903aa89994cfcdafeee2ec3b4bbe949af613bb9ad645e96a6fa369d994525a6dcb0f193f643c7714971ea5048917882ec6da2de90db52be3748c67cc20a5337feedf21a05e0c71d481e824cfb8f2bf8a13327fa364746516d48719c416198009c3872c07daad25fc0538d99b6635189d25fdc3bf296243ca4520f13bff1c9be3db6f969a3ec6f427a293c9342925aadf8199c730c53d8a7296b3e10c97db3a2d7ca7fed9174e1ecd0ab98b0f35ac37edfa7834eb3ec849a921ea7bd970e87ea25024fb9d961f330a92dff93d5cddf8939b15ff47fecf0fb79c5202e11f676650f9679efb38ab664d0be057fdce64d242cffb189aa7799485827a9e9e172a8bdbfd921866490c73ddbfabdd77ddc97a9d5d323f8c41c52f82b22894fd91799a18bb647ef7d44434f3739399b15150ff23837af9853d46975a192831cceb4af628cd6271e3b72541ed9ff3511f575106857a99f83fa8d48fccffa0beba4bc65667b1f744c7ee8a36373b2acd8951b85c696eaa6616b9261b26c9b94896701f52f97c3728fe3c3d2f7ff971c0dfb5d7fcfd7f7a5e6e7fb2d72c5f6e239a9f4d1bc5ff47bedbc8ec3ffe3f3f6e7ba60db3a710cedf99be68136eb608941ed80b0a0ef1e5bdf73bfd4ad97cc7989ea7e765a23654723b8b8489bc4bb40fb9afc12f11074c9f79454cd6f43f3d2f93fd39bd67ed12ed2951cc6b5f664384c58682807c6e78f282c2615e4035af181bc5f46eb29604d55f7e94d4ebc7f4de7bf24d96bd7a4ade90937dfc721ec6428724fcbc6c9037f879ed645590604a0a5e364c293078cdcf2c0f2bfd98008a970d5304615ed372ab10eeb8f1adca01f3b59f57b22f88503980bef6d4ea7024c46bbe66b3b689a9aa3232a9f3b0145550c0c3cb06f981d7fc9e57ab007aa0465b2512ba23c6798f72ce8e3a246d77333a66a1ce89647a9c48e6d4a63691ccef213de5956dea762d9b31d3b2f98599966959f6dacf0f49f6fd31d36436b329352b3131313131313131679c50322694e9654c325eb5319e49668a3ff71ce97b0c724343338977ceeca7d5be9bfcccccdb9d282a9e08e3deb84cc51349dda2af69da4e914da3ffee92f92cc6337d3dd9acfbec33cf66a6ef76ba08cd6636777a4693534a298d48e8a4ddfaa4a651bf31f693a6261d35a85fa4b322918578b337926d947ad9da5b42fb2803a01b9fdb2203a1fbb77f3637a839e9b28f868c49bceedfd19734cce9eff69c7fea539fda869252cb7f277bcc12b731a36a1fafe923708402dc43eb9ff4431d946efff375ea676ad07bd4571b5c5dd44ed7f0d640b36fcf6888f744c3ed7ad6d42035756765ec8edf52fbd8adb6da2767648fc970745139721cbd1c3bf693d82e7d877bf8f5f86daf7ddaf717f67c4b4ed7eb4f45a491dcdeac44425ff04c8cf351a3ca3b918578e7b730a946a5e742cfad21a2900046fe4b29a59452dec82e8eba30bafe3b746ea896ebee21bd3c57fecf94f39d45c12aa368ff9369d994f267bce22f83a21bde445444991a74cba8068871d42d55fc7ebe59b2dc7e8e45d900318e1ae42b7bbc650dacf8b2c4189c0214263a822e621184da1f6fba4583fc25310cb8a35bdbbbfb7079c7d9f063be7813e05a421bf7528ce4947ef29a3ea2d373a797df121b60578bddd093eacdbe99fde55e4aceaab89fd6f426eb489ca5f474e97bef495f2cf917d814a1228cb22071e912860473fa7cae98a47c22f6763151a8dfc45bba5872d3e611712d0dd2c47c7c37af16a1861eeb207cb90f12fb6e7c42d81169224e6e677a7f930d9b48665d8b0d6b88378c37fbdb85d2edd74e1f9fbed056db82717cb3dae7480d3ac73963a8fcec732e0d3ab9525a4f621c7f256ae8b158b7b420758b83e8954ed332291d51d7df9d80c406c232ecb926cb0c02c99131763346d059f1c10883fbeff4bbb41e84bb0e838eb3e2ebcc4ca3b9a1ce852148f4dad9dddde795ff030341b83b6d10ee4a4b8144c6891f8bf8fcfc500ea3e60189577e77e2bb7940b6ef388e1d2325e7c9ef4e3fb6059c60d0aefcce63cff33c2f368d914f2de5d8b5cb9969948b990f645a2ede9e19b71a6c4137be94f93b0d5464a53cba4534e845d78718c7819ce5bd20aff4a0302b9a560b72d697430d3de8ba077915a16ec5cda88bc0494349dd4a4dc9719f06db8cee2fdd6134974ef2a13d4f2ecdeaff828251c3487d3123f3b99d4db9366eb43389003ac0322a3c707f66e36a5f0a506a987910fe33a84a3714832e052835ac578649a6d1a50d72208558edaf6e741fd0d4dd5de8b9fd32747fd331b3b889bffc9ff90440216415588526526fb4a1929fecfd7fa6747ff993d91f577243fef8d30e41dd282d330afc8a1e914884def836b052d1193f5cc0884112aebc78aec4ef8936c89e533e29dc9d7bf4a1e31baae9683e765c35622d748bb51c79914adc85c3d0b209eee0bee7453fd57c393f1a8cd0df2c0fb50b787e094951bbd32ac8e7978ecc01cb80b91872e83ac7cb387077ff6e18635d866211c65de47317d95646cb1ea550b432a881bae590f440c7190e14d450e7eae8e848d927dc237c427f8873638c66196b5acf9106fb3bd260c72349f8234019317696659de9c439e79c73ce199b1e79f6fc2f270775fe921a97c9dde92ea74b2502a2afad08f73bcda35b3bc0ff5a5fc747c75ff7013d9418e6b5596e56f48f05c56e844977295dee52ba4b194b50a34540cfe57762859f5f57d8f292bfde36d8c2c5c7015d17846f4c7d36548ec115415c8ec11541770c2e5dc4e0a283f9cc2c1217b1a4f97142c8b83262eee29492bac52d71c12d0e08314ec95df30553064af7e48f743b895bea0fa857a8144ed6743d0915cd8800000000c314002020100c078402814830209465d17614800c7c98467c58a04ab32888719842c818430000100010010181a16900005058d91dd36e3b8e13d108e51ec42bee22cdae14cd50b913ec1749ace92bc43c02228a8da08e97747213088ab01f20cb1d70574575fc97f5115c42ea4b0ea3cbc2550a3c690b7dc5d33cb1e7d0646dc26d05ce9f74244994d7c60d28be264d9218205e2d7b074fccde5d8d15a740216591d4e8f97274e313889aa8986e5b4ea25799a6be80b44be7792d84a3915f822ee6ae17d72ee97d88450972883fcc1534cb837b706471f4f75b517de6fd33464b3d79b9d670416f7b137a578413d97809452d7170238f4bf6057b9d71a11b06814797ec6545544393f855e3a378dd105729a6820760b6605faa45dc4e5e5ab518e4acad2e468a930cfa1458d051932248a571af3dbc92a7b41105d8b892cf76a04d844d9b19024e71822196c538a4fdc3bbaf96d5f083cee9f44f8c6a19cb181fa43002f213b7da5c2d3903079209889514e3ce9c98d854217e07cc1b605a178d4517ccaac3f19d26eea56a9c47ada942e0ef91959805bd354ffb8a43fe8aff63756ef30632e72250a6ba98bc6bf393c9f6eca47c7382373123ed95790c8a2389f93e99a913e9d6216c3eafc74bfaabf8cccb7be1c8129866aab073dc34714e05aaa1d83cd0a34e0ba04e21c43a7c81ce6d9e63f02600475cf3c39e2fc44d81a78eabe8349a6699601ec7015fd17fcff4fa9e35a34f893acd1263fc7b64c860dee7d5620416a16c8dd40bd4288e14b125778119441fbc16c816f4171df92e9983523abdc2a0855c68ef75cc837d7cdb9f59f3496d536ac5ef0ea7e6bff5bb09f5de802b5378611919a4093f0ec74a76f9db1f316fc9e26c1146dccae8149f96ad681593c7e75b12f982f69c203d6b0c1f9a3905daff88221d5294c8e4ceed15256822ad7eb5837f040d4ca6a66d87ec6e846669a643a386f274fbef5b4b5c059b85568d4127fb4a81159aa7d3ad4ca9491ba167500d81d6e4062cf09501811a8b8264929f04e8d802188d37173791d86e3b53e73a815be7d0629dd7bacc1b8e94bcacdba2d54dbc7a1906857421aaa3b539107f08e628ce191d84215a75b7aa0544d6da8eacf6b033bdbdefeb6733d33a02b6d7a3ca502869e1386d012800ec84ee6a64077b2664e7a6b6c3aa66156b2b0175b4718dec488e167bb48d9caeac31e111d773bd2c1c8d6b21965c1a1c51cb0133f1eab99caf82c978d1e93fd0907e429adb8b5e2ff5757cc7f160cdc03dc4fe6bfda340923976124af1e9eceb407785d1f5946f3db1995e2f996d74000cc4b01dc036ea39e573877542b9fd014b2f3a2a3468abb7d84ad97fa5a757e84f679670be8f23e8c7cf02c3a7fca669715b194e147f5f2ce5043ed79d86835e250e686f1efd3b5d77cf85d511359cc5a00d780874d910344928990083520681c352a4698e411335a0f7bd160f2d960b2ceb70e45e6b911fe0097627e21000fa500b2009c046900a840c05fba266f33ee81b6d7927c21c39eeaa295c30afc25da37a26b2685632d7f83bd68a2469245173e5824e2d6d418458646b343f1f5f7ade65d635d6630dd95a3793fab0351130399ddebb28db2177eeb8568b1f1c5781a9db4761bf7413e106ffa16d8756ad699a2767adcfbdfeaf18ef22b5720a53691bb4a94b5feb42e47542bc34fa86e77ed921bc2137d3bf0354aef74a15fea4b921fc0701a5aafac606e6da540c66093e8d0e27bbf3ae5dedcca492dd71d00cafafaa5503726951f42928060217e2ec055f9781c8e4ccb33074447695ac03138dd29569ac62a5331dab163ced1ede7d2ff9bc1f2fb122e50560f15f3bdb3a4d848c3a10538b4b3c39678b547309932106878f73d9149b166dc1632fda1478e3d7ac93f9b636c698a8e36e5fc3e250472abfdf438f05251f79c628b911ae589c277d6725cd0c14ab5db93b87908b74b8d7c27d95e71f203e82d1d8e440739de3d8ecd39358d10ddd92137c32275cec2f21937c09322f78529d06812d32048f961398dff2b959fa8627c5e71a056be18c5c4a7cb9c782ac1f1619c36a0c9543d898310920d4137701e0eec2fc10958b9e70453de9027b3897b2832472a0f22f164c8b5070026057ee8c2c30d63fb150a02a27407f0950624fb61b558d65828dd9592c0d28793d1fcdc7a23b9da55957c9da70bd1430a49fe2300a4c160c6f91b396fc9bc5ea582eff6e9431d6c04223c5c266f8ea9317a9f002921d1c78f62fab13944143f001cc2376b4e4c7cfcf104a65dd0406d22eaebd2a765a19b34c4356016fb683908f4db6ae3d419b0d033d19e38605d85427f7d9e586b41787e6a3bd4f3a8cc3e5716d90cd03992f0ad642468578bea150f4c0838663c976d830bb6aba4796fe21ff7c480d0f2b326e0ee844ebaa3eee9c5619f8840f44f6f951256081f4b1970b17a24e2fbc0ffb8c23be0d4055a3c6c1e42b7ef4d3e996bbcfba0111815f15c5fa92ec29c13d9978ab363fac5de8563fa4c1936192f12bc1ca1172e9523f8259c00f910c25066148e175a9a54e9748201b94cbfd57c49f5b52a106e8e9f8346579aae37d2c2881418df48f4f98971b8ffc99f668b0a8c1ac2a1f451e222a88f0437ed5c5062d281d67c14cdd02696914f09728e7a38d43d179c38871aeec56d44bb56c37771fabba95868f72650eb4f150ddcfe1b79a87dfec383ac6d91a7494f85e31f749d1f3d8a1a2d81993f020499dee3eb8fb8d5760acdb25d72e136ee9858b18b12ada2c46cdd6b37dfc722ec92d31342d8e2cb43ef3c77d5610bd4712cd6ab2a393b956a2cf20bb450bc044bc1a4b0be02c542ac6de68a9a669c44b96791c6e8ce0856d0a62feabfafdc408691ac68bb3c061fe121910bec72c03001793eda2871db6f5aad41bbf118084b80f0ce41195a1090f3136e9cd33defe7e0cb8f68ffbcaab965e8aa9eae6b59a0ca74c70e6de45cadfee87522c8bc6d1031a223a5390ec87c4be63ca1a65fa885412dbacbc8765e390ea00d4d3fe077798970e86cf77598b35080ce655a34d7b7f8043f562f21f0db971bf89b014d4d7878968489195289c014a2e57e5f59507e1b930a4db2892d51f0aa7bc7272720fdeee5254f4cd6dbc6bc88efb24e5f95c1c2b2e8942aace1032cc09d5a967a19023f7022b239cb1c11c0bc257a3bcd442092d6f2a8d28dd30a3462f0eab0c892e8cfa0288b0383dead23f0c21a08f85fbc3756630b931439d3a919c3f2c96015994a0f3aa4c63f40364786632fc9701b992345b52c882eaa5cd6a8076817b39b117a65e1f4ef9cb8ce04b8267efabfda8584d99d600678246b6a4642e8b4c91e4ed028ccab5391b9894a63f2f34d6c168372ba326e88fffd1906ce0fc2a7bbbec702e73f5a8d46c87730108bb5d3b8d3af37616727ecf635f3ec937b2eb7dc05d99fe97af370ab8ee57885fb8dc9378ef9b5f75dac2c1f38d425baf99976ba00d3445758d997937fa3a5303de2036fb7db1f1d773f278e5f0e2ad8e20abb6e80371cb7cedb0c5d20d8432a67d410087b493c2fd2b2c20e943c82a0b1448dad0bb0ea1e365d0789813488d10be7612a036072c15f81e12f04b65c52883682d9518dcfc5aad9f6b0649319eb71426ad8c1d02c5fedb27e6dfd3a2d6bb45d5c417496d919cb46464503d0d16dc325fe2f3593ce998100b170ce19be798c581c484364655b899be2cdcf314e51a029db48de26d16072f479000c4e21cbddaf7d4f9171d3a3d81d07675e427a0ca4d166737b7acd2f64faf154bf5a38334281adf38ea934c6d33b3e913bf404fbbc9efc7c4e82a0b2c83bd081540b2e931709d2de0fe1b8487f87dce42e7e859cfa9cddbec27bcdc481d86eed02db60640b12c4703080e1b0926b631e2c008fe030bd6239b9f6b6172a78a34de6896c64bd324dbb582b0fb6c8ab9c3193e24252a19ed1d7df26fafce47aa0eb35c55e889c38c5171bbbca0a1b9cb65f0a08ca070ebe13bd5f7fa4b9ef8c134593afdc02c3e4c1eb7ccce78d5936a3c347d25ccb02d31839b0df347bdfe53cb2c481561a53f4615a90167824f9ee4368c7e32be3ccc2c4651ca90199a32838ce8f1328399c0b3b8852d42b78ed8464c516223a8e5955d877aa1a28f655e5816d2a117415a6632c002b0b9578839eb1a9a1b70bdd5e1d30f1073533a5cf9ef9aabe943561962d7b38ec124c5cf5c9d9d17b90bc3568e5680cc82019200005e9e2034fbec8d86a862d60e0d7acf0a0de86308c97e5c408405427fe01fddea0548319120459abd4ddf830e601aa6a7367f4eeee7b99cb75d6fa2fad335d8014c7341e081d52ce4aebbbc82960da39dd5633aeb1590149fc009395e8e7101aca4248e7d11ad6c2eca88f39844a363ce50b52d597204535f5a92394e0c10a45c4655af8c0c5c686457ab9518a812cb68a641e4d027b730c547533faae97d3623c3dbfbd915b69220dea4039a1819a78a915349d9cbd27bd0a6fa3545ff0fec533f3d848faeeb0540f286467fe71a24a3996888df90729a5c0b3676279925571352b718157416e446ffd7dfd416b27630af515e697dcc0dd23f8c706ab325c084a8991b92e5e186f0f9494361a843f928d840191fadd5285192a203a0d79c3d965a5ca20b0a20720bc13de2dff3c1d5ab21c184922a5ee9649a86c8ad047cc2008c919846af6249fa023165bf14a065eba32970e3306c7cc0319eb91c343616707045544412acd500ee5a037ed1281a2f8b18c29af700f76cf6f60102bc770840cdfe5739e9bd09475ecead0f20d78cc05328f7726c840e28535d4593ac05f1795596e05fd92e73b09340fc71f06c0dd241a5a5298f3eab530a030e9972a8b9f2c7cb78f4819f72abfe057f020ef5c7f67acfd3164f667039d17b812af9b098037946d3fc5f0d83ce098520fe6b91105e70148a02b13f376dafe14c825f8c520b0d87643b0d3281b989dd1e9df99b0ecbbf886eb212031cddf5e073ebcd458e628ae628cbdc026265b95182d28ebdfa0a8df7736efc7e2316a6fd645fb066e552bb1bdf1b6b1fa8ade2f83ed6286d4671a5519e3b5c298ebec2a97da3e259e9afcfc15c9672f566317c13f28f0be82a3a89fa5f8a4fe4a6b0a2af342d0bd892323ba9c9d87114760e19802966d26b5fc80d0b074b691d29a98f0e24a2801254bb664a34e9addc42c8d4511f32380ccf138f302c3dac799df7e59c8480d9c690fbcfc3b678cad2286a2881b1dd29fa32f0eb9f072cdd9cde89be1521da7d5b17b6358ce6de6a0200131e4331c98779e1bd3fc6870001942d5d9e9af5525651af9eeba02dd2f2a808b866f9710d800fede2a073439f4c3a2baba9472999a690baf27e0e5193ad5007f799a69aa7ab4b689ba4ae687161ea0f0e5bd6bcd4d1200ed503fa032bf864ae6fda0d85d008095f1e36d6f01a86ac52693425d7d0769156efa0f75198a802ce958855d6865e5b123b50a4785bde98cd7ec1f3c733db8038ef437560fcc0fe023125862031c884867fbfecf5d00bae7f873e2a22cb94e2acf3198f330eaf8beac075499f76b3d67daa631426034286f16d0eb15601f551bf3156a1c13d4454ecd8a1137367760b00565920806e1301fe839c04122b777bcc08ae33026b535442bdf01e1bc16fe20a8145662c78e2cadfd5aa48982281f46565ac7f785e8e786f0575700299430b90bcbbab622a5c18670069bed3ef591fee3975ada79aec20f27732d02b5afd63db06eb7a951277203389a71c1a38ec9d8c5ca930e9bbbeb0bee4e5d2098e8418ab95b461bb04a412a590c5f0a446fd082837d58a49ac1ce1401185f5174d1332d5b32bf6afd4922e53d9444c07d9eca34632c7d9fe6b1063f9baa0515f449d03dc99cda75d902b3179cb516419c3d87b21bdc000344f3bd2afa59ddc1b6f7629723108564200179ae8f300c7b29ec145ab80b84619e7e47f67557780d3055042da8c4a1d7ac94b7fee28d9485b70b856a86c4c5911622f4be5f20e86b0240a42c22fe56e3718a5bbebde77bd02518dd9321fc55f8d0cab15356cd2a4e145d75ca95e620cd6017e57082e2da04a240a3d2bf70c17e4caaa3ea762b8f3995070df2671f19b85114e37fd6fa225d72165c445c6a47477560a5cbf101ee9660201b60d17683ae5146c892847b208ecc3975fea473ecbcd5f09a519204d6b506f90e11c73e296196d842f1b9cf622dd1202d5b894e58da826b51d42d13e026f01b203d59460a42a2bd09ac42eec1255a0c259e7b7dbae67000b50c77a22e53566a5a4f4d909035128df85bb3f3b7f6e450dafcbe1197d41e658cb58ecf97767a8d9cabf6cdf082531ab63fb38aaa22e9331a3a71ce2b65064ce3a2f20ce4c07a515d64c6c8d943618a95190f57b44814ce27a7a6a5392723e58622759dccb0c387f99e18fad48cd0ce816e86bac27c58060c432703a328bb4a649323930fbdc9bc83c8546e2e4747b66008fc522257cab8486de127e9cf38d63ff401c4d3cbec357fd5bc62d2034f20a3be9dd08b31c1387b7fb0d0c6f4482c0a5e9dc8caf9c0f3840d812d3f0868be70f1d113d3ea91f37bccdaa2289a906fc7f2d8637a5a2021f00849c2a8df60ba5088803f66fb644a125231fe3fba43eeb61336d7ed99c5baa145c7657818260ce8821ce80cbd49998f618400e0bd206fcb4247a590f8822986d601e70245dbcf93675a88ef41925c21f329373ea286023526d5b7c9fd752e0b1a1544c314392f697f086dbeb6c84834b270c25be694ba0599423931852a15b80944df45b79ddf00aeff7739ff560ea4a9eddf2d8c41f3936090b454fb7e8394ae6ea082b740f4f87d18d39d48b188fa78f64629a18ba0e0731767402ddb5aef6c16c5500461c8f58770ce8656cb51fadb1013a08f831db2d30a5822aaca664dfb39c8cd6f3c40304d489473320be9f719a92b0a312e943d95358f2a33d6c09e5c3b19b2682a8baff2190cb7b3aabcfc3d00ea8cb3f9a1e0f16d302f79064aed9d77e0f65ca74e636d3f820b08f91b2c1e81905c195f3961cf4773f3285e14b7f197524afdf1b684362faa8298800b5762085b2d60e563cc7022585843c25110bcfe069a68eac29763e14c7c2a644a1546d0f26d6730e57ec70d2be489d00630617c7859c31caa849a8d81ba42a882ea875e02c24cdb91722cf2cdfd208706fc622874e3a1c9d55b474ca5daf0c49c8c44082153e1878e8f70816d5703e4fc32b3537db57b7df1ae54f53274e1fc38966e28c855ee632bd995e94b907635397b106bf4391fd823db690edcc42d48e1b1b25c92706d67f67f3832be813b6b8bc9b63f75f0a17d3f1aef4602670b9d08886b1ed09b7390e6fa4dcab2e64f2b60b6e7669c3efa2e116aecf3dac2b22bad73126e939a60c041498576ac07466677ce35887d70598b44425e5f7e286199378edd525379c711a69c624f7090233a9677ba72d8f345c070737eae7006db51503b2c010022735feec4fc35c4167b94c3bbc3f5ff3faa2ab20a1967d1b2abb73e4ef580a6c2ab8d56492365f9cc7ac0abff3c6b3461d974a0a16248ad2d8b7999d4abd971b04f55a0f055980ca14decc82f962c23d2106a3ead277cad5758fc9691842c23b793315d75f54e3b125992cdf9bca3b308e7a353f5195b4bbd2f6c00b79a31aa435986bd3c64c431ede75f630805723a3f1503ac0950e2fef74455f0d5a678b89ad0cd0ad801c2b8a71594fd378dc30741127f64a61054c28227ee074489658886bb33a4ca476538152a2a336ded0b60b73c2cc3d70f844dc9a1cb44810df64c2c71933f420eaf50935685def4299f6c33dd3be4bd89d7cbc084410546877725d0ec89a9ab3b7363ed53ca11877da5c7e7c177e5d2602d3340c1f4da30d3189297f419ba3b7d4147ed60148e86f833662c15253cd488aec3bc04efb2b961b2390323575390fdf72d4fc576e6aea584afa128670af2a3ca7a65763f1e300b46aa30ce855c7d9275ed34f33160114a96fd228d914365280678dc66bca597be779d2fa5c5b095581c8da44a5312519f7c93723b156cf4e37fe99f9c18b840293a06c7a3f1d5c43120a475ad752ecad7ad7352de1374c8b81792f6e9b52a4bd71a219ee991a01758c3237b3a98c858c08d60b79c6194ba751133ed451aa6cfc6da7f7f5e0a8fd5543d052a6e5d387038a1aab51d8f2cd48a149c8559c560c43757089af8e6d9a177fb89d7172265f89b2706f54f819dbf31766e39312a5cb9084aae0f3546afae88dbb9cdb7a12588cc4b1e08d49287d333af4d8d480f3d7097bdc5bc0633a1a158b111ebf05bc626b99641c4f786c229094b0a67aa42e5bd065d8c6c12647cd479ce42f5054dcbf3bce687cafe816a817d7489787a4ddb512412f992d0c3f308ba6356d7e502717bff868b0ea24b521986195cd471e75ebf3a0a00cc1d1ac367332d03bf4ff429775f7ae7123d9500b3a81d1ae959515e5e392aaa3d87282e13748b80a83c7b83feaf99f760fd7f7a2040a4447483361b7dd6a4374b009569fafae5154ccb76bb9b745dc2e98e19c1e61a964a0cd4487ca0e5e49b47b348a4fcb191aaf215e8cda961b911e8c0d0c3f07fae86661e80fe7d2e008ec1756d08fdccd67418a0b30238329ed87a9385cdda4c86c73813de4e5065b352e4d68297e8b5d9581fd95d01b1713e1a34fab9e24b0cb02f7f36d269c53af5c10b83b8f8efcc5b37462b4a3bd0fd8318b753480318d489cc7dfec30b232a84aae6739345f2c2222ad1e87f48dae2ea828322295ab351dae890588b4217e5ec93d1b6a078969754866fdc17a8c71672feb944bd1a49a0589409af614cc51b08b17670a4890634eee86688c5fcc31130ec750abb7c80a96087516996a5b90b33fc57d2bdb2b27321f11bd0831809587041836e2e22d17440df69d7f4c8f746aa9d6b426768104ccb00bb4f0b27ea2f363541b00958fbe495338c227a0871d50c183814fdf68ba822d5f82234a09705c7065c772f6a3fe33fd164005fdc6f765cb1a45724d1da5e490fe2b962ba0ec2a93a2cf06ff86dbaf2116fa0795c90a029cf606d54ece91bbbde61f9c4611c01da723b8a1c80795636e0498c082ca9c5b41511f7d97a6911d9148cf1328d8c524417f34d872119b949e6336b11b25ac17d3a05277f40d7b66daec4948ad8e6f95a073c24f90989e2c60814b0867de2e5f6b8e1b986b6ad2e7d020cc1339d9e68045d7be567434de52f9ba9d2e8352c8968995283767b3e9b8ac3907eb83555a8d11efa418824f49dd8094820df139b35f9fa99927b0779a51448d09891d7ca680154599375137f2748dabbb03e236f9ef9bf826641fba221c217e29b78fefc32e892690354dcd16b5b89b309669c1d40dee0ea7a415b63a5061f6f69039df34d9336187e2b0ea6e87a11bcbe28ebf44b77fd263807f9ed5ad35878e82beca71f2328a886233bc9621c19306a15e90effda6f92cfa874cce691828b9cf29ef6e68e0df1b4f97864d4689c5bac8962743130b4bbc5a232128d6e0f9aebab07acae70bce9c39c0aa4f7df0b66688e0244009e1c01213dd99f9d86b0ca1eee17ca1bbdea8999f396698d177c351c7f7ee50fef5cfd0231a1adcbdcf0a661e4f61a70ac2f51ae5ac4e72f8a30d900c15ee85a0b21a490a42537feb222a887499e7fe42080ad731668ac868731af4ac264c8f3e8e9e094c3e5e5460f42189abf0c65c5334d8895e0778503ad8234903ee2996412c5c5f60a5bcb2e66bdd8992c841606b815ad09c805911580c08452122c641965ddcc6b3e58b595a100875db5ab6cc565bad49f3bc080869ed79f890d411173e847583de175f9fa6b48ffa21ea1dfb85c5ee8e7f41a277b13ee3d2a44eaf8a3a84462bfd1897c2e3b4150a82f618abd564c00be703e9390a4eb2c523cd275a3247fda0a0fe342edaf00bdb1292d6a44dcd8ca5f8afa9ba049fdb3e034afdd8bc514a257931c7fd4ae4836c4140f28a08ff18ee87c0221063391003196ea181000a2c36e328d858ce23ac50c3016f7e3e7d0ab03fbdab9d863b87eb4e9d4cdd0e16d00b3703036bcc13d5d1a30b67275b1582651bdced638f485d3d5a5ee42e946c8e81b4320206ae86e3539d586df5442ffaf16b6b8183b8b4498caecb1ec46d9496073a035074d12f7dc7d9f589046dd02d9c10b4b0b0a19c039d8d2ca4db0dd7f4fb610705c2a14622acfde17d18d34fa1a4fe53809a4105897a3974a0ac57c51c7cdb02336de360e02ae208a84582d562047feddcbdd7e2549cfe2606df1620e84ea521264e249a99127b4514e62a514e7e80b1888f2dcf37a9512f0ff53797438f6c8240f7e6f63b26d137758297cd750a13a674e029f5e06b70dec17d6e732f82dd1926a862efeac82f86309f02bc4e93d03c0613ce9c85bf6ac23ece47c9130c222acbcc2c1b56e6b20dd1f93d6d96b811fba8077e8884c7235ef30a43a67c4f90f9340386e6e0ab27b87570c804ccc1121b46be6638125f866b5d3a41200d6b413270bbaaf71bfcf6457a6333ab79fb2d1e6e5021481bd6d685b453567b282a847de3190fe02ded12f7c66f21ce9e41cb807bfb9b43a8d5c4ec2d1ff310b4137b3503c5aab02cbb378317ad5a693c568cccc212058cb9aa58d3b2c54e0c8bffd2dfcb839e9ed9853b44a9b85902318ef6ae03649d10eaf5ca5728303857d6a286deeb79557750792c7eaca52677ed4aaea821c052533176cc158436e6b1dda2ba223b63d0a5959a87026783daecc153b213e8bc0b01a3370192a6c5a5c6c687c50518435e80ba149e934df94fdcd419c3bd5b483aeb65d4934eafd226456e2ba6f66aecb1141cfd751b7c8759597862cf79fdc887ffac9f933662810087ccce553b8d32b3d363291e2effbda1405aa36ca84d3f91774106605d9b38ca8a30cedd81ca571c435d29ae54b5f844ec519f65838b3fd0258601d7e021f9d8835afbbdc53f943294cfe2f0ce3f00aeb5ee3b5c1a99ad066824d8e0b1200f6c8eb117ad3f4caf144dc0c8905b2a53c288bf4d34457e537f8d22a10fdc01e524ef24d716f06b60a40cec8d107faa6cdf63426b593196b23d863d7085276efa3bd7d7f8c27372096f12e7cf1ea3342d7572118fc8133de6fccf47dfa04957190090cc7d7be786cba8861c9dcef30be7ebc0b924c90ead271eba6e1c398b2316d9f1870a9e16e16356b3d065e8a5b693eaca17c5f944416a7ebc5af3a5231a7aba838172435a2115e6725dcdcb8d4e8f02c028d06be2eb0290a5d0c0bc194b6db6bd6c8c3de787db9568feff965351a4fc5383439dd2cd008ca55c800841034a49632ac4bdebff7e265f67ca66b49169ca7cdd47f6ee836bc9a41f5a4dbc5b93422e20c1a07fa414922bb08c29d12f7cdcf950e26cc9887443f38233a1c6de324924ba10be596f2804b27a1b4ac651eb7363238fa8178989c09515e1128262d2e2e087ccdf7b6f2af3cada769ac7e70354dffcbe41d2b1000d148e9d9525c9da164402be5e8d43e7bed259adc5d79765107204ac30169c630614df16353da1b92b6d38708310b93a62c6c0cae42f2f65f6612f04d1d382485e3d1bf19841941e70626c98545fa1985c479f571605f55f40d9a662a7b3d47e4fd815963ea970d72c9676e9d9a266f5a9555ec75de1c245a9ed4f44af02c616b517cff94c5139b4771a6f32d1136f6421a89ffcfba0742044afff5e0fe049af9942f1368998de3b9a22046e3800ca45098c886d8d88d78bb42c23ff8e371e836985f55f2dd4c5a97f9c54b82fec5a08191eef575ae83e040861f2a337218bda815ac085c2cf171788a56c4731bef1c82bb909be5e45be6615492b350a5cacd0ce1e2001153d8a203c5de2c6999933d839cd2b5f632776c6015ad90829b26f5035f925223ddb6ba77bc13fe5636baadf643036c03c194d884e75def9ee02267039f44a58c4fc108482e42df00dfdfd5fc9aabf2856d5b31e6b6cdc3b1d82a0087022c16bd7705683cfca89c7ebffd832b6f090ad560f6fe6e7b38300a133255265170d00965986ea38aed1647c630108ea9acb0832562bb22090d9911deb2802f87958d2a41585bf8142f787d4e725d77ce8ff56ad814654cdf966062d16fd188411021d58a0cae8dbd0245ce87749beb7431b56bdede22b664da10f894fc4da8366e8afc30644db4521a96dfe7b62813a1131296d4c5fb8e37452bc9b76328a2f2b7df394c0276e4778f4196ce22dbeaa38bff4a8dea00eb0f0ece86c52e11257138fd2069bbe2ab8de8aaa804902d39e846c2372304ae56ab73be63b4143e64977be0bb818bd4072dfb130d19d625ca4c240923c1e80e1d9ed2d85b7a95562503c878cbaea8d922dc732c798167110c28f065cc6ba202a3a4d180c6387e30ce8d47c8368af7575dc0a804148d0ccd89db83c8d71e1a05ed3bb4e44819795a85bde68c4318629fdd408b4db985a077fe24965c49dd30868b68d02e724d5de682663292057a11dcd688067b111c52fb256e512494f585652b4f4247d5614a311a87424a7e30ba255da4a176d89a97d2987d55df9be0d41176ecd8a5e21125329b8fda00c3cb398ab90f6531efd0d42405b9d4a09aaaac68908cc0ec1ca4df1b2ece475b6c5ac0ccb2921c3ec42087c7a5f8d3ac0737b221204b66fbeae34dacd9d4dee8f99c9878df6c6d233886deced66928361c59e5ca33b33e0535e2b4b336a90967466f78b2089f03305b916d572e7aa7ecaf1ac5496a6f4df898d439ad0c10c362a265e20e10c8389db3b03f4a3a973638a908e67bccdcf0129661db1c8540c1f1e2942bb09663f1ce614f529521c559b03ca7ec744cea4f5e4dcb60ceb6e1ff4bf04ac9c1081ced233f249582162cc0df7dd076c5e6e680c994f370be1917ddc9a79e6315ec6c1f8d599b2fc068230f1b9b09c81c92a02c3912df0b05116d74408bef8918b170436568d57ba24d3e72a23c1b956fa7edc55b49edbb6e017ca70b85250505aea8b3b9a4d3b00170f13b8b1bcde4eb3014eafc1106dfb6d0e6b299ae97f01d7d9fa5c806600ce3a173f57e8df5cc1881e9ba22084181e86ebd69656e1048b45e77bca2d37234f0ace3b7a9776c1aac3f9428c868f59f522537e667c1284548fb66cab6d3953b10c9569f9996f597aca34de9fabac04ca72eef2fcf55d2e0d5e0eb19cfb9e3882c970521e614638a6d0071dfcb91fda5aa1fe8a9604ecdb1d59c0b7f9c41bb98cb6e82b16dd5ce2baa436958ba690965bde70de37908959604b6c3aae532550a0b917424aec9cd82d133f685e100fee44a53c3916dccfef9c022da0b2c4d5548f727bfcf1027ab3f9cd8e715330039af6550ce755aa866fb75e7f83ae4ea05e23d9a370c8a5f06c99c1e77777b442a5eb4aaea99d562e5b6e97a7fa600b64fac3b607e2b92438ceaff6e828c5224a57bd4aedb0cb21c7c09a638d61c95582958ee50a4814391110fc15b9ce046187426050b0a8ab188362701cefb2227afcd6e7cc8cfa4b76485a1fa05014412e1a2d1672daab5fc380ac4f457ac698ad4b40e796e37b9456465c1b04dcf97e68e1a228ccbd3b403fb4c4f54bc8054370d309339a4511829c8261bccbf0053176a4881241146986557b00d1c9485f163a300ec55652e04f77a48d06874f5cb533528ed60e9854aad8a86a124ba3708bd0d65d003fae32222fd30a3e48229d9defd7278e10156116d0ac4269a9ef8fc075e012a57a2a973c6d050728304e94f7cbfaaf9d8fe72cff2a4a18ffbf8d80c67bfe9e44b38799bd2d127c02cbe4be4b5c655ebf790f294b78c24182c2676df1ab80338750a380243d87fe890aed71ec630ca93a6483951a8ab6770a0b8bd22b91c0234e26ff00b3c1e091b620adedbf0bc412af6f628d88b145ef658cea7c590c0703346fe742b11854cceb94574f6de9adbe38027b2e478391011ec9958f596265e72fd0e17744578b28ee6a5cabf361875f021925586ff712873220535086f2bb46db8697bcc99f85d23df24617fffd1a1f3b0970c52460dfb2aa5d1e8c13aa84bd4caa72a2ee838387f8138a90de3cc873393a56aa5149a3f57c49a686cec9484371a4aea0dd31202062fd995c17c04a370182c471b94d63fb3f56864e8e353b974f02d03c2cf6a9b9d3a9e8cfeb24e0bbccc2db23dbcd37b20005b7f3a9e5160c09052361524a6e88964b73c2d3cd9bb60cb53ce2bb252f1cfed138ddb4eda52a023551b1d3bb019c00162cd3f2402100dfeec7448968ecd51c8b6180099bae90023746df82e96c13dac82219c5f917a36945f62032701ea945ba94d88309c312c62ac497bd681fde8fbe414d02efc1ed8856f5a9099ca917ead5325e10f5a8e6497f37f27c33c7436a8752170ec85958fc3de01694216f251052fd6802fdf3d822fc8cae26c2ba707607651b4f933a6e7fc6e1ba488705c3a325166652a8891859e89b2df7fea58ffb7bb099799d4cc54a344ac52a5cda47d8269cf76142fc974b7e1c90a6bb598ade5ff62fc6509c8c41ff1680c8f0791096361d8a32c9a6e15ef475cc7054202af17e52c86f800d8edb581c704acbb86a168e0a5aaf62a334257968a771ffc5e35a0594a24ba7cd34f3071e41fc05883d0a0d6258e6acec198360f0fbccc2f9032a69b00ab9bac5258ec685ab64b75739ace2a6d4fd10b1af016878d1e8ac4ef581760b90b86e8cec1bf447834235e77d6fad21cbc1b10937494bcbde6e49f727b1eeb313b651f7f73f3a864784e2aa650f210ac59a5c953958f0c2c4aa4804388f2d73a4699b46d281f99134deb88ca782cf4501b9e2a78dd8308e0b1f4023021640c1b9fb260b35e3e79ecdddba3886fbc4cb441c4ca3a8f5d4f5c1056a2c9b27f7c70bfdf41998c6c3c454905f785a391aae76067f05575ecc3a4af8fb27fcffce7d00cbe307da7598d5476d55415fdc22860733f291014b502b3e837dea7fce6a6e51fbe3621bb4b82cc44d0385878686fb2d5cafa96271b63401eb914f417f052f782faaa0db9507df8d79d2080a232020d7280cd7f8eb9cf41df5ce0f3714ff98b6860d50204caebfef247e9cf51c48ecfe1b6f20da88ac374082b7ba995962bda7d41d350baffa9eba01a9fc0ff725685fa80b52afdf06c85eb7e764055f8e119c8aba5af53bd643aec7a9f382e4723e9990e0de699deccaf380dfab2bb82da151f6ae85ab546ccbeafac03765a7457462ce277a434f1931a5c68688420213204ae1efd2f0f45ab27b3687298080ee8e5c03d66fb9de62b7953c4b81eab29101ea5c768b819da455024c66bccf1473b1486b7b2144313dcdda1678665e1b7cf698988ba5176f7688a45ddc54e0f7d12e062d21d813c45cad9b523f5b05201b31d39a265b285e356b9c7c9b53627eaaa8167c0dab1218abd920a6cae33230808442f019db8190522b2fb8caba2785655571e976d72f68c474ba32197e1c2df56240a0adc336bdfbe109aa9ff5fb72d0a049db0e75cf8a9ec154a6d38509ddc3f4a71b68118057367a9a84d58770adebd5ffadebf0326211a7a642754b08f0254d6daadab22efc6efa4c3c77b6f9fe187742d7e97b0862856ca3ca3aab1ab119c1e5caf44e283d070d349014061f9e4db6851f9a054c509aa37458e467bf64894b2d9121018459e141b90813594d68200b199e6fd02e235f0e037fb38dfa953a87a9be2c36f08b6e1d0d72b6991382cc01124039366226e0e2ae0c01602919d846a99eb0feb3ba63debcf32ef28672b5ae3f9b2f0ce8390acefa0a363f76c1219cc74282e5c4770bdbc5992cccabaf7f475543c4ff3c2100fea1c43eba7c848a08068620eba108ae4101e9eb9c5c6c3733b06068ff3beae3c02b1755c03b068961363753e97225d8f65a34d77ff42747f25372f7e276d5977b80d071ea260ca674cf4ce622cbd8ee70bc31c2d2b7694082aa3405508a75a8b849162d84d7e82112e5a50418291744f6d9ef506103f7e3b0e6ec397a4f816bd5da0f2b1a8bc0a8a14b296ac204866d3267174de0ed2a2e2905c96d693f2a08cbd163696ad038e79e93c2859c9f79fda50d13410b7bea8963e6447f2258422f57e117eb62e33023b825518ccd654916a93168ae6cce5fdb80e8e6ddd68321fa285c24bfa242078b6f028477302c2aae4f17af612a53d1e7f345e4aaaad7d4a915a218b7538309edaaed6786c5c44fc2b14aa4409ad99cb70a48e492c8fc1ff698aab2d2a56e66958c8ec1cbcbaf1edf4b2148384604a2081c50ec4236032b456a0652f4291c5176d66ecab76ab9e65cad6e668467da8875ffe8145971cb6f05c554722dae5f686a95ba1b0f7f25fce89c0125a331b1888e8003e4f8a75a2275299732af1d2a18aaac1d4a18724be33a945637f62faa4b6ecebf3fcc8486dfd103f5164f74f8af5bba9ac56f9e5c797807831a645c61432e9f0e5bf1dde67340827c3cd1ec4bc70a4a7db857b22e87c01c781378bba81f99fe1ae0da4d9ef2ad33e32696fdfb40283392d94c9f3c82d23d6797913307786effd23214ff37b193d9a80b0ab889b34de79100d32a73930f500a0ff53e7e3df78f402a556a39d76e716b421b378e938e97af9286a8bccdd05e925404cc57df2ff127bb88bbd5f2aaefb75def67322b788d1a23061159d5f230de6316586a9b0d9129190bedfb900c1c338e819222ca7d1d59c257582c94831463457363810ea411ca00dcd04d9881d960a6551b7c33942bb1a2a049b567bd4e7dbe7b0da98265eb25f77979be4e3e87d7cfe7713ab95c5e2797cfe9e572b8ba9c3c57979be7e8f3735c5d5e8eaf5746b44e6688563106d164d3d2795afe36cafc92ca827ce9b48437e98b03a8cdd0a4b7348155afa42bb2297be7de7bad4674818ab40735c46654637dd2df2ec5db1fb6bf925d750992b201f51edd55bfd68be44fbcc43a2530010b42789a58b266f85ae8d6a1513eeba1f77a579435fb39e5e061e0dff283cc0eac9de7445de7369c7c1dc3f66f5e7fce73e242be6ae467c6aba3484eed12644a15fb70078b7ff8167b39adfb424ba04ba0d3bf62f40d8e79baba900e4e8648b6ddfc82f41ac3cad4f4d84ddf55892e805716f4effcc53002bc51adf4f4aad0bc5c8edb5bd2a5d0dedc3a10e27b3f581e8911f35b1561eb87428dddbd55865099981eeb601c1f1207d03980e99c17a2495efc447ef8f9bcacc4b36977812185175dde4d98cbc7f7288fd39ec503f71054756bb5219e3ffb4ca27a386e9ff5b385d500abc732701ce587794936d6f1662844fc1bcf4c114d7dbf404660b00f0449814409e387eedc59be9f7bc69743fd24d29d904b231f26598b7928303b15b40c30eae606f1f489d3f04c79cfe2ba7048031fb6d47aad9af4ab43a81e77b87107f5dbe91bc15a579e86a0f0403ca52d3bec48a60fe4d282fd7f55f058aa2ff9821c5eb82ffd918f2f2cadc28ef481a44ea8efadf8828ed1b5654c801c94e610aca1c272f7b87ca280a2a0f43a9e777820815e79c0b8f452b71312b53d576c9de824b4141ea51c0e720187e1f473aac5d26660907f148f5ca7662026a94beee8ab17f02f4756da98c902552e8a467f9ac3374b55792ec4ca726e16b95b1608ce46cc8d8e325f85a9a2dca3f0e343883a04cbab9bc86b99a0f4903789cb7879475620ff77588f6c11a534a0d29a095bc6e6ad58c7768f284b9a1542d99799f128c146097379833d8c1b91089566f23f6d2811420d4af043ad54fbd95822a205d938b0b78d4dd04fdea3e87fe0630043ee1b61bee0655a145135608aab1c3f1a60186980820007655677c13779097a3f18206693dad686e3f3d8e7aca6e0e85e23b2021547f89366d08b02a86bc3d2f3411f8d2916d50503c459769b08fd1b125ec6d2d5f714b7d584cd868705c40d18542361293e920e2c6bd8f7caa3cb7a76cffd17b99f1a4cbbcd26291afdd39fa1331c1b2be22395d71f0a3cc0e932fc69933b2e25b2c261785284ff03d863cc49c72678c3507e5d17dc21766706742fd301583188bdc335771a3ab8a330cb2f44c515a2c503905356efae6219712312b902e8b91a1a71d74f0504586ecbde69e2885da43fc3b46a75a09d4bf1479592384913c0376005259fb875a82f621dec808d127ac99f64537a2cb2ee4fdc5cd4147986786945aa89d0e94235a2ff7e168fa4a6de7568ea4581cbfc3709c9a8eb5a41b3ff8ad50da7f9f34901c99871f8b790921b67612991b63e15b1d9ffe0b29814f6d52ea1839031f0e3f3b82087c0e0868c650503317c61a5fb64cff42541473550f82c7a43137c576d750eae9b8722a90847df2f03da6f9c76131afef90da4efd21524349ce1eef24b90d9b9b89b9b52a4a612ef76b3fbd25ca70925e5855e039493306924efa39f54ae6996f0b0ff71cf21514b34412825bfb3338149f04c8c4408449a2a03308a08d863a1fa193f1fa0ca2c3e949f3e2da073966c2778f491be9730312263ccd2a4ada104641c4da7185dd0b71062b1d8a58e95d5de37622d6518865346f391e8d34e0c7266035acd2352fa5b9f0e4550adc5f57f7e12103d7668222333993bfd94b69f93f5a59ccae143b073e0bbab9d0177754bde25204cb9a00983880f8223c9bf74800093e8720946bff58cb844fadad01ea524840359c92893c658a83a11fee26880ae674b148884047378010ec5e7047bff49351ec7106793974fd5b6749c2e2044bd955b8db0b947fc4751c6eec0780f458619e69bf20e703dd67ed7e506f3729ce530df681fd48cd63e315d2a4fa3a43e6816de9ba1312bcc85594b85e75c696ff3d8769b396ef52fc38bdc8777aa02a803ac6a116d020919bf613ec16db3c59178c1427c26ab6ada02c2f060b11aeeb431eeea931b610324b5ab48b5e1b8b69f20142fc48cfb563e8c1b2b14b4577c6f304afe8a5b69f18f49550bf4a42b9d9856ae12ae9010d7cd7d796dc75a2a71b4924f3d5c9b452d3fa138b9972ceab3f1300559df9d713e9ad3956f8f8afd5a974e66953781bd02ba627837504f6277dcd17feea5b46f14a91226111d508e34f6e07320a98838b7ccb21c3bafe84466317cde00fbb7e04273c5e403c95b14735a0c2448a4a2d670b70af5789980de94fecb53ed4a724540d1f35c2f9a3a99530f4bb378507a42a292e9d0b08641cb4e5b1307a3d43405b3de3367bf9ff0766cdc473d9b910c068ee8acb1417411d946e86630a5e1e481f6dda12c6cb1686441dba94642f248c6d6b3b2e375f8999a7070c44e126015baad64b251f9125d6d78c353e56cca93583371ab27d9ae3bbbe36181c2061116822cb210d56921f8d7b420118c6b6d561dedfbb5caa63e29b8312bef502da4780b418975b99d997f22d6acee7d9aa1c4c4de7e0760ea794f9544a2e001b3ce18c49810544d9e27b5c13313c8858b82010fb93d595c342bf75676084647fece4e7a85d2bf14d765c8beef4326aa6ca715de25e3b150a1a462ce034d59508b5c84b6f11e260a5fcf694549b33ed946f1570e4b854508a339fbe7b3389c45e1b101383d7c485440eb4fdbcd4bb5d10967e11160122402fb7ff1b0cf1507abb7291aac95d22ab1b0e6380125792e39b4b03aa88e7c5d7e17cbf0d3be8177e8dba50a872c24aef3b6fd4df8451c05df8a93c0223a5ff31b501e6c53bb6840562ae3de93a642f800c2bda85d35d474e0616ade3867e2354e3d087df2af841a6109c380c466934941ed8e17c5d82bb55650f1d031d606d1f171634ec8d910054fbf15697628c794fccdde971b33dd3c36d48fe4e41fa2710673dda872d975f7317cc8d26ea7a0236f8cba53eca77445f4d82155892d6714e7b6311b473dfd2fd30886304a714fff16135b52e97446bc11bfb0b1c3444cee897189e5f46449ce4ccf4aca66750abb15b57086ef7bfc7d9be11f264f7257a84ad14574dd18f05f0deaa2c88b50a3d6ad7db87eb990c5ae67591c55d6ef73ed7d672ff1fb802b9376b9449ddec6342ce9e1fe523885b8a46046ca681901dee8120273affccabb82d7ec85994ce264e273c8bdee7f0b212ce02812783680ce6948fe5e8d203e4ae9ad6f0d4b40a4f76ce0c072cc581d5435ee1da1f34e19d8541da515047613bf5585d65d46209d94b51e70e3cfafc9dde4b19d7c9b89fc32fc354144b8f422411d6be29a44f72ccbb76a9a4a69645dd35c3948a54f8754c45a5bcd1c633f2211cdbed9f2ca182544f0a8cf7c974f286024c96bc2396c9249a609a0c0b8d60cc75b9cdca85945b65c14d0a12f8c0c6bf54d700c220a1b580fce61692d04f59a10b889100612c12e10b7a2fbbf2f2698930e26f1b674b2c10f31384c4d25d7148958915c41de39d9521b00e2e52caebe346cbe3978d552df3b335133f5fb1b023ffe23a7308ca47df940bdf3565048c21096d92b1c84fef34ac2358e8eac75b4b5dc035179d541dbfd06b43bd4d42e7223c93250c6102cfcc3b8b8427ce5e3feb1010edd49da6749985438978cf55ae2afc53070fbcda5fc602823fed73866e9c2e873367cc4988d1655d188ce03a3b1b8b92b8659096a939ca8150456b44af6ae7282b6082bee75c0898b2811ead615bb9f5502a0ce57aeff94f47352bff41f300c631880d01706c2f1814539a00ff8303f5d0b555497bc6575271dc3f82eff4f58086fe00843a57fd93e4ed1e6ff5d0ee8076dd0ea875d7a2f8ef8d3dce08e4d08a7d6b0be093e301150289e0424cc8ea23d8c112ef8741996300202c62ab79bdc4ca8d0cf87e6125bad2a23d6ff23122de2b1bde7953bedf6908fc06229dbf3e088394a2d8b2d32ca562dd1a55cc16850384713ba89afbe8220ec320eb243895fb55cc1ea4e42e134f10967365deae2c264f8290a821498908d2e0a1eb0514432a033a00098ca2a584e2d62c96dd89785b1cba1f826b764529049b9ac5c3f237680ee75df344665f8b195900d37ff00bf9602eb2baa0cb81715637f43b9b3eb0e7fe1ebb327d3f3bdd9c3955b798d0084068e7a62ef2ca03aba73073c99cace51440bfe9b3d31b53a1223815f48a88fa2a062b6bebc289fac03a9ff0116056adad7efad35f81bdfb72cfc16fbef80cb190129f7baa418af6dd43b2aebe034d5f105433d0c6afa647f01e72eefff6a8c0437f73735f16f6176f3e9d32c31258fb918458805b3e5b95b71d167f07e2c6d1704bcc137a6e65234c6bd0d6f78a6800cd1d38f2e96127974d3c230c3ac08a6d56c9760122d683ffe8dffa9a5b4ed1dcff1d6d5ad38d8a3328d0470102b7c49b7191aa7cd24d0d6718edcd2481750e36b674ea9e57cb25549dd9d06f896069f5992b16fb2b117b0b95726f7326e55ad88246d8d9e9060ca1c970c0337479de73e149161c70ea41645d159e7d58522da38d25d46ea4175d871e91f37a29f192b1b629fb075d0e37a12e1abd973771ca4b67b447c224fac59884ce1a2337a9598d2e649b77a3b79817215dd2e509ced74ea19ea1f0296501093f9c88e674c5404b4301ccf510514478fc27dddd738ea1742b25fdcf83e1c352650023b5b9c2d0a17ad7ee9ee51b2155586a23cf67b75339f21de4146123e1296792af4b54a47edb60151c3c4e5c3c03b1df863127dedcb7e3ec842914a9f1639d8adb78766c97118587c1638c3f396bf30445e30ec7f48a0c364fe5dd2dc75ff9df8edf47209560d7fab679234b98702638b737db50705f94f865f70d23b941b792355ed051ccc0f2e1f3e356d59f1db8661893c0061e8d2e5b347c14564de0b8abbf0cb0fd106e2d18e3f7ced3cdd7c17f995052a028af98eeaf148a409802c53daa8926b36720c4e32df1d6ec43b2e8b6360eeab78ab6ec2df221816b354aeb1005f8392055af855bb168dbf0770372b08884fd889da4ecff90f2f52950a7902df8245d16880a74b18efa94ec0df28bbaaefcec6cfa758d7980fad017c7dac095cd8a9023b4879a2f46537cc4a23e0e1cc7c068374f7cbc1c6d90cce30bc577a08e478517636437a9ec33100733f9216787722c064d9ccb44b153ccdd17f109b3da4d8a63250d779c7ff984c02ce074391ab762e00f0802a096027269363e8010db74880a333bb30438db0d17885308c40dc207cfc0575bfa72ed408b601d0fc511d4dd017ed0460f76c27b4927920c7a0e5d2a0fe52bf87ef1dfee71e479396add2ac7484f86601dad4719e8e8c9b479cf08c61aa190f4262db1206eb5d8aee65d88c6418a741666a8e0ab574288cf5e98677810b80ce5740e8cbd8543d097abed07d91363f230484bfeec4f45e525fb164487fa15bd1788bdc58d8d45d0f0b44fac94678a5727fb2be99a20164382325df66bca9f6a1db299bd80fac9dc3783f7bab7c9e44fafb867c75276c64c3d9239529f3192f2bec09fdb3b98ad594aa8c59906f16a9c23d4f6f640c562d363ff0c2cd357009e26ffca308fc7765942735666d8bc1d77c819756d68733f0a1de747c1a1eed5f840bc032d1b6eebe351ffdc3662b1808d1947aed296775efc3ff2336da4c8025a61e8aec08935ea58bc7c0b3ce251d0c30b5db5084201276abd34b398e588d923a0260b2d9503d4b60b876e01daf166b22e41ea1a850b7b83f974e608c09243ce9c4c78b429069f35e79ef777cd6934914e75b2ebb930f78dde458450363396dd7063aa72192fce0edd55ebfa986900dc92a372f0339809135bc8cb0559136cf04776a469cb106c8be23841050ae1e3ebdddb9405496f6bcfaed01ad7efa19b36b1ec645d7d06ef00b9a95c2a600e06c68a8bfbed01a24bb5250a763df61110be85d4d849a1d31a583e1a2e5feee402c912f234150345174f700244f30f35a6286e35b46b9cd407961bd273fc4d70876addfe80f11969c0d1b579cea3021b5a743dccf2853ab03dc7c103dc55a25e23019657fa617472ba5b796bc688316415d191a9a2298337e80b989f49171e2ed08736719b08f71f0503274c86638f32a6cbdbc9ec982667c2a6819891cf8601e78d25aa793366ffbc73d2350068ca5673b0298239f74c0bebe570df954b7a84b75a3ee2ac9764b542ceba5d4b086677622822b89886ac8abdbc33e93c7e7a8f93fb13a20cb224b319621d907a8e781c984def4f8b2c25ace66aa8cff9a4c760a4b67c35440ffdc0e2d93c320cb77556ee6c4d3e0339a72edfea80a262e33d28b9baeb95de41ba48198141a3e2151b0138242d47404d54b7d8194e12e4edde81a30be6e5944192e7ec268218609a68e6d6b747b54ae7fb4e7d67d4e21680405cc619e2f670a61c55f346ec5370c8569800d1ace5bf29771235e1ae807400f7a4e759ad6138325be5140af4ab7ed066ab8f6ea2a7ee959e76fdc808af019245db6462112cc29152ccd01ac9cbf82d5bdfa6a919d181f777626b5a7b4f76e3fb3fab2fe1f3651449e1a9314243db7185b8d717ac5404a26a27a6f326da123a620bd3883772146d75be0790e731a0399dbb2b675d15bcb49738f9c0e8bf70a00ff1262a28103f28cf2e34a8e44554364d97a24ba6c3cac276372c34d05fe92f3f058f7b42cd86d804d7186d188e300dbb1d488c479ad00058b4050ddbaeeda20eb84bc528def2d3be2328196956cc02433a31afed9209faaf6c3754c6c6773a5751dff7f2bfeb44cbb60b2641f55723722b9621b7323830004677e14ebcba76c0549d0e9725868940764ec0bffd7628b601315b0c4e98f65dccffe7b7035821594954b5161262d325e2b6d262e229ad8449ef897abcc1beabb82b09685ae2d3e0749f603d0ccc2deb25b70d70c477fc9ef4c0be417283fd798447c7dcb70306f451d6fc7a1546fe96edd4c4cf6720daf21ce8abe37c0c573d5b486df55023bf2d0e2541b50b61b5fb11ceac6c2a4c80c89abd91379d1fde485862a18e025cff715283e9c5617b145255bd67b0f98e05249ace0d3b74cddf00eeb48a8c221d6430fa312fbabe8b22a13a4bd5944815c9a5e29eecf2f61ed5d57faaa941c7d3ab700cb9ba4649e237fe00095ab4c9c7774b867f6f04025765b53722040db0b81316ba4b4f72d16ed4c8fb058b22af8b4f52fb2af00f5548230c75e440e85a5f744d143ad8138941d5c8610ad1d2aec590fea3d06530db8f5b810252bf800ca0241cd38231ca692359004288cf2cb25c396ef19c8e60e974b62c02d2dba8df7f1949f266bc8f93f10ebb8fa455328540475a93434668b70ce3662337f40c26017aa87074adbd97c7850580bef45b702802fe2ea5074899fbf2c7bf382d26dace5fcafab16ac429f930cb9d4f0de814d78ccb216adbb8bfe8375e5c56341036c446adaa71d8392c496fab96377c958f67d1ea3b0d195393deab235d3aa0c8834407ba14dbb41d13059eee6485e41b4034e5f1d2518316ed590a8ca69f34a95da7e5530b118002a83250e54ba8d2eae029d56333df2aeecc8e59c1e34ec9fa1d307838cd9e158d898a02c31d7191a37c892292e59625b872459ed3d5853b81e3c0c3b0219bbc98deabb19e92601195c648fe9b7076ecefdc097d2f8416505d7b0674453748a52f880cff251c550f057e968a8eda6d179d05270de1e3ee90892ce932d3d3d839e9b91dcd14ea93c2fcb83c5bc9e69a014e37c81e2b3369c5046da2b6fc1810c696579c1f3946015ea7ec656e46694be3897ce59925170dca049f4cda1f5d63588b7ecd9aab18b43907570240d23b3476cf5ab9dbd8289961d08968845b75c7dad8ebf0dd506eaf595652f952bc061b5f4bc09c14dca4d3c644218947ea0f9672ebf1dd4c76ecb258b1f8c31124cf6933adae02f70a78c02056e23b705c1359cd06d6c3a4ef811f4bc9536dac637c6f0162f61575c0ce82b8fb9791e03b6572647e39631ea5295c9a827938a77a01c7e906c7d2d092f1a6521e77c4c7558939f497a35a7e3028874aaa8211a96631523d90a8e21d10c6beeeee52a0b9d41734ef293061723d6ac83246582b81370c14c8312beb9ad69599577afa707f2de726fd6ed698debb6815c134ad2c72b2ae3d3d40d06149339242e7ed8ce0383feffd4cd34133d658612999be37089960a95339e62c3d5baed31217e3ffa0657165d3a6f7de715c140f01b859b8cc6b739538938745c577e50206b9708ce2aa50feae3fc1efd35cc7133fb7c7c16cb890c4ebd21ae344883c390a013a2564640cc7731022287caf2f128d6097ed28164b50a78087409522b2940b4e98abd233a07885d5cd64a7276653483da40b2453ccc8033cf1041d570a543a199dcd7dba2983666160bf1f35e44497810ac23bbc643e14b40e1759291cd1be10865af890af4dca6fac986983f21fb7d2a46ea4274e1baa19ff1f794f8c56083e9c09a071966150715afac06697f2a029d09759f01d8b56e99711e1d88562540f2d9d8434dbca9036d217ea0eaf1da33edc691c31c7651922e6db0893e84c346255717a5a31b9e013887f04b110b9038a390aaa641b70014760ca1c98174fe536c4673f9eeaa95a2303bb01cad29f639d81b7ba7079081b0917c79a605830e36ad00419a70d399cc715cfebe0129b3642e4fd96421287413b2cce07ea5e3a7293e4682c1de1a84d41fb15c35080196f2aefb40c987627d0cacd78c3af05f19d354866e4ecad91f500652c3b1f68629362a85782e0eac1e5bc62dbe4dac011cc0b83dbb42c25f5bdc6f2e58f935dbdbf593e68000d4808dba6b71eaf1c99ecbc846177216c2e305cc0ba91ca77b652c353197798ea1131a0234d5931880e4677b6996e6b8cb1629281b997a49507518177cc4da8aabf4ee373bf062ce0a233367b7a2d4ac53539645662f6b360212828cde263b464b33760d128a96298028c9ce41a600d7f0357274925b10bf9943d339161bf1964807d82d28ebffec28bfcc80a30bf9cdfec70ad9469606b56fdd4a42d33c9c25c8009c9521bcaaa4fa2e00ea6a52715301457460b5e05a620d6e3d1f06f59566d044073136c055c3d05513cd06c4dce7ca070b13ffa4e619832d0453f4251d49d00da337db42a8e00f384bc856cc81836717a17eb0a485243a492e1165cc524b09246487ad5c0cc47051b70dc16fa59ff5881f29df487827a9218f6be6584109fc1e5ab52590dbe472f7bbd77e3f80aca1fd6e3bef77d79de33df45d3e95bbbf45586795bb10ac38d81c0155dc5ebdd0cbcc8890f62955f9d4d7814cc726e0ee93408b3a2a0c87e9471fd29d4318534cafb3f18f84a2fc1045753f631eba66978ff38e1bdf32801ade58d1a95f19e29414d9b0b5a25af920bf9b60d467a0a9d3b96be0870fa2ef3285b0d164d21ff9d06b4b4c75f5fe1d0981f857c17744024bfa900cd6625b6b56c4806161108192998b6e89c07e8ae88f897bff515e1e328671b21fb4754e75aed370d615ed14b32143d13b07e75ac3cc7f6fe49b40bb3d9d69d11d48717cbfa5f24a44eb56671b45afdd8931af72aad916fd425df1ac400823534ca2f6776bf06707e30f8931d647733036eb257759d0849c302f62ba2721c6376859dd1fb4d53a6a7a53cd1924e36398fa090dbaa62875bed33b9a4f0bb07e2141fbd28e11949f1223443f53be66b47cdaad481b79273955beaeb12fdbeb74b14412e67df92c17c5cb8c773103d717f42ebcb081ddd2808e9af4e12c935b2d8db84e999aaca8a38493a1e99774a7ac078432f7a0c98cd6301ae98cccca8a2d6801196ef1684e661e9c18a84905c6d453316e0b7db000817b97dbb245cb87e6d70688041265adb7dbc36031f87b2a6dbff9fee200e7bdb9a1d8fa36cc837fe4110c5f94cc89ff3dafc1a281cfc923205707b04214cc38bd536de6cd8577470cfcf0288827371675ebb244abdd1858347adb52ca84cbe920288040884dcea6ae2e8f88c5f4c4308524744b0c2880cc09b3e410f48e2b2722d045e782e2b9ab02b53a9b71fd320c94a6ea9d10308d1a4ecfe48bbd67d45b3060f0227bfae11761e563b89e67c5883eb4d21ca37603645debec18505effc665c65f456af7689f879ca95bcb3f69e24e31b87c9ae27a43271fddda92c40c33c1fd15256db45061847e9605881c4052f620bf3212dafc2389fcf970cf7c333a58a9340309a6e3bd74acab17850309287581ba8cc628171ec98a5531840d2216a07c084856303807bba2a4bc8aa95849d7fc918c30454af3b8c10a2cf3d40b2675bb1d5e9893c3a2f8dcf80d5668d9017adb17fbed00d21d456c5e5732fb8aa0a0274df69904d90086ba58cbece3b652b1528c208a710fe4b1b62987c6aaee3937e33570fc7170e9584c77d127a538512f8760cb2c4b4a0f62db36a315c1ad318a447df64c418aa38f9dba463415bb4671515734c62c23265f1679a0581387a18ce82272733669eaeaeb4513202e02690d63f6afb2475ddbb2f108a36faf52fc9ac74f7119a7cba753e9136f1ef4d8466de8a0ec23eddaf9b240dce6cd3d86ade71cec4a3cd54ac57151696d10d9be1c3b9dad7d2140b274b69bb3a9ecda31da49881d742452e39e653f64022211235b7944f52cb96987ac32e4e20badb139de571acb831f2ec241e13e4d7a223087d871f88213792684b4bd64bbb02c30ff355fb5f2217d8491dcc8b70dc24ac39f6061680d1cf8b00a53b23c6fdd44dd013cfa07c2d4ea8b6ad9d705c007edb16511161d3edf233e562c12a101f8b00087c211afd1dfbf41f481738018a758cb1e14c46b08a4b7bf590792d2d427d2e02377a483b50e1c890d37f3c7e13020e80f7ae3b552457630364c2ca60dd90b487c04ba06e8786a1e3f6c1066492ff9cf0b8b2c8d8415a90f816079d7c21ad60f55ee16a419e22629d96c2ce0d6d848eb4b9c647a222e61588a4942749709a71bb2195a8392c17314ed06dfb5d38b851a5b0a8d7cd0f1098e049a9704f77c302b5c315a60dcf38118bccef35c02808383b7b290aafa2cf13098f96708bc0482b1cc27dc085e1fb6770da27926ec61912aaa210cf54b00fb5e90cc07fea7dad67f8b086419112600692f188dc203b208160633d9fddc3c25eec351ec098dae8b33d641112036a1bd47c9482ab18039b87416c8072905ea3d1eb8f1fe8c2ebfc2698b49a09a46b0b1c112bcef61f32212307194ce5557b02755d576475a7c151cddf399bf8aa11db0ac735cda52253041588eaba418a3b4b82852ad95c6e19c1bcda3fbff25fcc57db17fce418bfff7f95d7b18b00012f28365f95a916b26f049420b14dfa639fb83c01b68f39db6ea7f4750ce8570350601c1cb6a7f9d2876b9984863b82fd4c6216d43f13c5ce504f49a92b9012bba0d0f96c57d5e49d54389248579dfde21b1fabb3b4dcaa9962d24adb42c97926ce1c8b913125df06077d4b11cd0173aeb6585ac2b7af343d1793d7280e2ad397360436ef0ff4d0bf3ee7eb8660ce1c8b91184407ec8ee130889f8bbc3848a3cb1865b10a348fa9d19b3ce0ba95f7e2210dd393a7a30d39ed9090118f407712df35608bb2f92f4aa0fef3cebd1c8a9dbaa16501101a5c5b2240d862bed75ffb626791c265224e82f630414d4632e31b6a022928c88eca9107ef35a3962fba220008bc0a68ae1516ebcebc374c42850a849c2a7f8011e55e0ae9004062112c1734cd3c3b6e9df6043caf5ab17ac00b0119c5045e04d4050ce69660d4d8de8604d51880f3107aa620ae0b888a61c2b4e700a5084d994b20f26be13fca1c7561293eb41d7cbde89ef6580231b748dc5a9561f4b80a437cf0cb7df86a37aa0b0cca6ffe66f5d2da5124bfdb6f5d1fd95a51d3456e7975169a0b0a2670c0f996ee59b054a374cf74f4fbed362bfcffb3adc3eb15534551e325bc543b7e2c21a1201c0165d7944f42ff01cdaf2e3d16e76ac6830843d204dd509ea41b8d3e7edfba465d3f111156c7c6b855b74a4b87b9974e5d676810d99fc3ebf12837b88b6fcc63d8debce41faa85080179a810523dc9722599ed6b2ee4937afe6fb54c3ae88116a5a4db4865344c2c0816f715f2b9adb4a2b4a58b73a1bca4936f24c68a11fb6577160d12e8d6a71e0c6b7dccacacd4dad6c6e2aad2c61dd47222bb91be20a459705b9a436631967b429cf4de189e2d28ac35ca2e891b2d9720d2c0b80baa171f375bbb6296025ccddf20c5917c58d24358484ed3ce0995277b61273a315a81b5b91b913af1824e5bd794a3b13e4796807b7403f54888dcfdcd4f9fd6c59c872242d6dae942199e37dfd03f7e9f7f8fefd3ecfa7d7ebfbf4fa3dbf5e8fd7d7d3f7fa7afb1e7f7fcfebebebf9fd1abf70d8aabbaebc58446de512c838dc1e6ca326aa852d7590cde68fe63b8e016a5c744572b7c921f870ee9498f8a289910a3d8a433ee90d2a9ea773297d493179ccb9aa9033555e3d7769d57b7e23adb7cc51a39b944e0daa9bd2ace99f0b77da9f341589531dfcfd5661c029b7f1120974a4b7bc2cee706ad19129a76d278e9306aded3af4daa28b40f81b873af20d0acfdf459061798db72f702b57d3b51f6b9f9b5e90af2b075bf7b46b0a77109ba81c6cb99829fe8d46dc1d9d52ea548206c4fdfb839c01e19c1770afa0035704ff385b54c3d195216cca4d5d5ae3e5cc52b91511e61de458258294562c35d3dcca1d0573aad087283ca27eda542d244c6fb1d70a2a63429e7b3918e651aa29b6bf9ce7c789d15b9cbbbbdd53805d539535cc442a3a5361cbff0b6588b198dc961bca68c6615060775b9e8a409cb0768ddcbb49619e8e3a214f0d6267abad5baa86d7cee84269f67b1e24d5d7858902733360fe7359d88567ae2b2d78d1ef5231b108c0788b79448cb9fd652683af13f30e9216be508a9a22f0c1af6ed867710741ce38edabd91ff0cb1f6f6ceef6ff118da2af5d8cc780be236c04d0dac8397a7a296357dd70978b13e82f497509c905679d6186bd0b80bb8fad33e74fef72ce6332e035f7a7cc9180d5090d9408c3cdb85feac1e1e51e43e4fbab255fdcfe3d486b678c7b32a023d0d4d3dd5b7d0276be7ed4ed83a69663d0f75f3f56d59fca89155d3c8b46cd066e6aabc194ea9bbc94f2bae0c9a3da19a0e5a7807d1ad4fa940f3b74ac045eb16973e102dcedea62172da5a79039c6192bde46bd59bb9708e3df56ebe94b015ea14d64d6304ac191f0a5356c098e60f463454405493258df7d9ec792a0921445a18211d4be328535c0f82c8ec1a0172336ae822d136002009355f417bf44aa6e0a21ec9116fefd0a3980cbcbf665235aadd5e806fbc895690015eb2b27a1a1ebfd264e04863547bc7c0fc6663e4233253b7e1e374e53b480d3195655293aa86e51fddd2955aed903658d5a8ec25e0303806d8f699a2d1fc753c775d9011b668d1c9aa01abf330e8ab53f6b9bfb089bb35c4c9ad11df9f55c087ee3f13aff213c4b7b30ff14c96db89fa00a01772f243fe1516e9c71308ae9c849149a2cfc920f5b76ee52142cdfd30428e7cf9a2da209ac87cf28e8602e76ca856316a3e595164ad5d87206b241dd922d7da3245246d976368819796ad3068a640ca5b6dcadc9ce8628ed9453a8df30b667968a7c608967c1302c06c7ad05f760bb20f9d71469afedff5ad93af0e734cec9394dba740343ab86446b41e2e50496f8745727cdd9d2c7d90c4c847d8445b6afe7a6d756f9209d2e32dc4e6d668804766a93c3a8ce490a9f4e18bed7509787819a56785dff160cdf9ce0de2b24e1924f4a5495978de2e4cabd6458d91be1024992e064cb21bc8e2cdcf40bc02e87631708f6f7f34cec709375a57f45858cc4d8f5ecd7ba383ef567d7c095ffe8b51c6ef1b6231923c8bf902e084adae804ead66583f37db0bc11742322a48fdcada6b4f09a3279cce2117568900029a313f56acd12a830c4bbca3f59f508c35b1e16c198fdd21617de877a2b6c37a4c75729b6cef9d5d4ab93ff33f72b67501637692fe94ae9222602f6529f022d1e93bd63fc55e67a4f5a5da3b43bce76663faf8df42dcc287cbbfc31275cd89349df2f70d94e6c1d48da2f4a05a087f9466e327ac73582d38418af3511de35d1b7e8cd4a51b476059f8c759f451393369c7ac20285c7117c25e5988309e9ad0790bc2110a757f93af52e3a8b6e87fdf60bc6f18e493e32b730e8881bb01c454d3331784312be51019c44cca57080a5c9a2320313c30af34f7c96f14b6dd7c4dae712c2dd26dfda84836c3992425630c5ff0fe72195aa9212d76c519660cb13af1db56a69032057f31678b73019463fc70c0c7e98c4756f68f201d380673704be3ab7cfb2d63f6fd705127b1960df52e763b437522343c60f6cf8322b3f41dc028bb40a507a4cc528b781dcaf1ceca43c414cc4f37e5b0e43efa80144e640d4c99ee08fc147b6da51afb7b385c683edef08ce49503a91f27297af2249156e8fa47e1bf7a0f58e2c6bd1e574f9aa4b88f632c54305fda67154adb9c2807fa42ec7d0e46f4843ab96ca3885d6696ee5452ffff0f0bbadd4badb5bd045042a1e69f37c63a66146b8d7994d43e94f9e24f6dad3623610db699926f5e4358627093150c9aba8d6e2f52715f2d21a79a955899dca26d3e0d224dab0c7f8a9a49b47d235ecfc6c7fa7a00ead3e87e4f3a7a41cb403b1f28c390cb39ada7684eed12d0d130be7cdb1b797cdb5a2a0ac3722b0856ee8f2aca1a13c819d46656c0958ceb922e5ae4882c1857cd09b0d6a084d2d5358ea11712321467ff8b820215c64e7cf3b0a1255dbfc54f3ae908a4f86de5bb084798ba079e178ed56aea9455930d98ee07ca517d3a1dad0803514895b8540633d2d21804423654f7c476c5150902f4dfe0f0b5e1367526d90ec7e11f184025096b745cce1962490349ad4a8320f86433f8e0ca58134bd45395a666c953b4b3cd9cf226932fd065945278359512fbbbe349292a5b620b751b19b51a50edcb9946b59fc0d008f240c5a33985ad8ed9a93f8f3e355b62fbd7ab0877684f2d5a4fc4f5b3472189a45a2f806034fdea274518c0f38caad0a9f247701841e2ac13db504cbfa283adf83092621db4743e61d425d5d464621fe6133818044c9da2b0deb916783713a0dbb868cad64361a4a1dfa2fc4a935fa254af0b9af155de6d5b41e094af33109a958da5fa077e2f8af526f1906173a54cc0033e87a4487d2f5c3fd4741eb6a94f2d2ec6aa324f48617f754f09e9fb7e6a11db99d63672c6e235fa5ef8ed829372231bc5df3c0b0bba747e99d909347a2f786c59bda2975c24adf78a10acbc4ccaf622ff2bdf5c3b4b79caae1c334aad3dd4614868116998caf6165f3099278a2fe88c68124502de0000fc125fcf5ddc4e3b3614313787a5115faac0afa8264d13faade766813e5d7b9a88a4ef400dcb538cebddaa2800283c5a7a8580e3f8e75d7ab2bdac01d9ee4ad50f127db59a2916c08c048ed7f286f7dbd3a0d14ab011fe26dafd096b904848d80997136e8557e010e675bade62cfbc14371acae3cc9b03d9dc9ab473420532bd35cbd4146da258ede76309a3cfc0cd260e118805ac96a70f2d4a18b01fe1b9ec1c768893df9279b104df65ab4b23b1681f97585585ca5da442bf54aa88da97227d8187adae315893efb800fd553c844519fd3a37c1c551b86c971cd0591b23999a5c174c05c2687b49a79e3c1a70c09af19f46fec1cd838d372ee8c000a39498608c017d3478bec02bf4151f11bc6b17e11b979ab04dbc6b80b6b4abda3a8e511a9bf04ca684ffbe24084c0c55e4e140b322981aa34a4c02d4d73e570904358183c76361a752684101ea31af99911047d23d271108ecd3a30ea457b383892e0b73e46166fd1969bbb39e991a07b1b512eb210322882ea091d8d649bf2904c58e9b57195e834275eacccffc5768b1f64533af73c08956eaaf481326df3b738be3023986eb6639de0f48239b970006c3edad861a2fa3f5ed53b7b708b7dbf963983a71340a116cf43a7ad5ed04794ff08980e90df79e996e7389b048a13cc7769ed4005f9f77c473b986568c6808464694c1a3070c706064578e25e8df64a96b5e47f6b136c9a4f743f3bb624340d745e73090735a99d6f229148d1b37a847030c44857410cdbc2030561027979899bdd5b024378b504aac6ee99c737ef300f5cadfa7930e957a99030627d7aef8e7f6ef4b7409aec5beea275b1d9f2823477e4da7d2f31acdc51816ebea2e0cd97017321e01b304f47079bb4afab2173b65644d411a247c81a77e90940b19aba3c0be2ab131231ea6b44c90c7d56c58932be41fb583a14992c0bd7aa15278893bf3982392c14993669c6a5565c21c60d7fae1538ad21d0cb681325e3e16229071f7fe77699c1420ed20681f0cd522cf32a5a5c79026dd1ef81f2ce426e4a14489d43a6ba9c23a5878732b4b0f69a7852c60a46aaa38f0b9bd1d838ef1103577dc34e3bac0b5f2dea63a6a838064d9bb62a34fa581c373afd8dcee7b744f8d6450a1eba1af30e90ad20244e4a36ab6cda315812f7d014d7cf541fb1acd0e9fc534d413fdb16f0f3048f08a0d5e4fa4b5e4a4ac467bf782793d0a0b9af459c033f2f7880f20b3e860e722aba0437fd82a9058ce41dced3deea2d694b158893d59912fb9fa94f7f73ebc62f725b59e480df5b01a4c6b24b661972b6a3fceed1b2539873b665d022b02bb29ddecc05c267aff61701f62331d607ac78363a00d33a2d97da0f942049cd1d328c99d0efbf91f4f66fc8a4fa17bb8488c8d538d7848d342fdde978ab8b22a14e82346324edc8664076458018aeb6d143c043a1449dbbf35f073c9fc6b269cb0ffb460262211ae4033e7ed2b36d3bacd573561a45df984b0a027b91f84dc022ecb959c44a8f59606d3536427316ee6f61239e91729f151c0bb29e76f7a8e798c1837b2d5e5f1810d32d8f793db35395cf4076a7f5e077edda8f95c9d36addc8335de063014c19d3e06490890c71007e09d1a524e75f01726ca7ae5e7ada8e670fac5f54970a16ccb7919b43213801720b3857bf601c67c33b93a0d440289ba3aaf2449ae3ec8bd8c31c08e629d3d05b9ae00d85289529d7ef7c5e6f5dacc51fde0b1654ffe27cf3309e65b9602ac168e582f8bd8e0f1dc97a895aced11963aea299bb8fe234c75fcad5927dfec2a7a43c0cbe9d6dce4621c53a155d60100edf1315a2a3d16315f7593b784bb97f384ae0718c886c92e09070995cf04c94a9482bd4d72bc38f08a70a73ac5930ae4b3e3bc3dc161d12bb53f5f09c70b34dd680ff4901223258d90a55a4cecc43a5517226541c5e31b3b866c24967bffe1ac60bb59f4ee4de84acf7d3c9d9c24f1cba8115bb349fe069b38b4180c2ed986cfcf024369b5f31451c73883c86be3fb31c994ba7a8b673d9ed12d39c1b24da7b47f9e45e00d93437571a73cb1a5be5c6beff919d432a7348f6c47bb3f33e62e765bd84b4bbf903123900258673abbce5bbbe9c39a032c3a78ba55177ccd01d930323b69ed01f400b4cef0762224d63354a51867f58a96703fa4385fc2a419ade0768d2fe6de8052eabce096dd3f806f10873813a7b2a6f771b12ab32eafa44397b4c3175e800ad99d41747f4d15922d6c8795bcd76268aa2c8a4b7eeb72fa6fa43728f2e45f9a50eb3c9d4b196bb10c37b93ca3e8e9f92e6388fd0e958f6bfa75150bc62b74ee974504b8d845f953ef0568c807fc832bed7f7e576246065a7ff4a5a745990c8a815bf523d594f20fb34464f0e3e83e81b65eb915699b9acb53ddc839c37ffc064b750589ad79492760dd31cdb519ef652ef924784145741858b94bce1aeba50165d385c01b6a269233bb23a8cd6049e03372687c19c9660e3378b26cb56cf3804e72236b048a38b314bfba1a8648caafc8d2f63c47a184fbb2bec8009db5a5e9ce660e74f783965f44dbc13a6bd1ec9a298382c4d21beeffacc7c3c5f7927cb2b4b926d41616f5f8198c28270e27fbe82733389223433ff892cc25a35b903ef1db18e694d656333df81544ff51961800f244d630e49ea5efaec9bca4f47efedc4b5e30f69ab6bb714707a33dc460a8b1131f46ea72f56a4f708d66b9d01819f269f16647a620741849cf4498b41aec0e19d3e9470f6ca808a828ecb458bd16e57001e466abe15d12760689186b9e30687a615cd3b66860996b843d6db762c8598888b101ac0950cb6d4e682767b4db4ca77f0812a522597fe96ef691866513b420446671d57509dee64090f31780fb01c1f0c97ef8091afccf1ad673bf5d16dab79d0e8aa38feb8d843fcad3dff4f93fc7f5574f7531fe2636eb9b87339b64e425723f05bdaabe52a81360387f982a6fc4c52a3f22b1a39d2e5ced81414b58c70ea5ebf0b96c49be25bafc6cd27b60f9c4596465915f468bd30da3a407115ec7e3683b9bc81cd05c1e553c097e2f311b19636843115860deb16d9d8008c029cb72236e159af8c3469d9c3cb1a5820039a1c01c564da4b1b31ba7f1ad8f3ed269ca8494e3e17741a0d036898a6fefbb2e5b803965da6c6a30f15982c3c5e88ff2faee740f9820638ff95212055304e0a05a053e1bd1ad7941220181865b833632b3cd1bdaacd3b0dce532ba7db6675d1103226e831774a018817e56cd71445c10cccc359dbb679f5e3b98f6e9be709bafedad4e3f08e1e3fe9471dde5ebfef908752712f32d4f9841773beb470deddc947b41b89b4820775f970cdf265cc31ae116a4540f151c59cd0fd5c911afb319b5496618b6a6b54b82a49b5c949068c66d3e0922671229e65069aa9693899d1ec1a1b69241343f49ebda1b7ebb6d0bda801da0ed4f82d75a284090dad1aaeb580519cae9d30ca8157ec23877803c315df391f01744456adc30b14248e1962c4152d2bc8f65708a059430c22316ad5b5e04c69bed9592831c750e4bdf8757d6c806eebc2f5915c5d1449191d210c396147d9a7cc79b27808185b5a6098a969233a2e3b4d11dae8808c38200ee48aaefe1c1c69cb696bcf2a22a1187f1bde785045bd106762b6be2a2ec64694d69c2fd53b146ea72ba8a2befbabb29273d1ec221131222b2733f3b22ff9352b8552047efad76b033053544452dc2b092252d4cf9e951ca16621e5dbe6a8ede1732c036f6a0334ff1ddb42b2cb29863c1b7bf00ee504f1d577447a682ba73272660f66ad9f4ea633d9b68c20dfa93e5644ae4a2391f64ac8ea368b3a79b774e2c6ca2b917e5c88dcef21baae57df392b778adc47079a6acc7e91a52faff7993237b09957486bea66ace661b3a3572b2358dd76245d29bb5c3a026ae6a84cff3af94da78dba152f65b2447993565272dfff68361371912482615ed36a5e3ffa8ae06f89abcff0085627dc2e7f48b2855add9e0b0ccdc24bbd9d9ce82615819eeaf34b7a632f1a5801748a01da2215405c608c5c5607fb1ccc82ec6077167bff0d246ba7ce9db93579a8c31eb36196b062b1d7fc7f7efd7d8eff9c77d579e2a3d5d1814f63273e7a0d99f821498550ae08770bfc34b4747ac4bebcae53129a39d8aa41a3a47258b95364dbfe3bea03f003e203254630f9f8a2f2709464a6587179c7eeee3e55cc19a68cef891a9cef9cdcdd5bf470ee4277f71fd22dc20ea9795dce6fd34f56c38220ff21ec6d590f870a01873d9c1011c54c2773f5567d3846b168b4808c39963c4647b2640f942db243f6fe1642b80f00ee7739277da9fc40591a37349f406a7c1298ce0f5382b4feeeeeee1b360c7dfd80175ca09b2b1d0e373e2f1c95c5ec606a9b86fbffff1c636a439178428eb2f60386c58c7e1132f0cad015a75054f41889f8e99aa6692d4326f4598086a0d773eeee4ea165c9f9088bc9060d122788c88b86701378cb39e7bc575ace39671496d486128b46a45f4051badf768ec297ad6e2054ae29a0d22ddda8d812b6c49abc0d2f8aa8de17ed6cc8765aefd8dddd570c531b3a43932dac386ede8f02f86fa9816a6670ff2be601a512e063c93b2a99c8ba314c4548495dddf0ea0f6cdcc657f80a5f214c6da88b601260ed4b0b14154c8bbf25bfaeeb0ab4e2c3b9fbffa7f8811d3c9091a5fe5e748212eb4acf20d72d8b65d992185a443cc2fd47d8a538b219a1a3217122e3876ca4497114a9c465a56965848d201f32e6e8a2e36cf68f79c4115d553496822ea41619dd1257813f30320355f5c3d84362f2b6c80ed91b6881d0c5102f04562e2648b86f321a33d40b071616980d1dde540e1a298ffe744dd334aa7f7aab360720810243c9b9e4f0212356c50324a1ba7949e897731749ce4a374822d0622acc8848e8c38d60ba8259321363b9a5469665513ec6824383b6622c3bc489795b64876ce79163eef8b81bd330c61823cda43694663dea646d675b40d2b418d7ee3e632072bcf8622246b1c80c3cf6c479d36858e5724b6a531bea0e7186a499cde2c444c1f911f5e2e8e063a3c84707ca16d921ee44baa40a0344b8ec3d106e911db2b770c941bdd1ce38307494c3a2e4e4977420fcda78772a04d0c0c3e2ccc2b9e7520b4ae3572be301a03695930345e96524e83fc920c9fafe2917c62440d17c814e3da8145fe21029dd086e911db277ceb1aa37cbb1b616a068717542274ac84b754bfc64a396e333b7fbf63d9b01b8ffffaf01b304b4d10dbf72b197e6cdebbaa6695a7390fb9a7a4ad9905469f2692657b00b219fdeeacff6ada850b2c5fd463190ae07d0b4ff7fdeaf6bffffdf10aa36743d8ad06aff21ab65bbe31d3bd6e025aa36747567f28ce0dcdbedee7e4c6d687267035ecced3d29c535c5f802862d84098946787409061a10a3941d587800a648795aba527528b95e19c856963afb073d8afb99725e811697f31dfbef28b5a14c505699c24f4bc45b1aef79f25a918ddabca90d75ae4f4d55cb6093b5458a5eec5c50e4a2aceab106f59619fff920fbab7339b778ee2995404c26c34e990ca5302264e1adffff3b96d8472dfa234adc7f09f0015b206014e128c1384951d850f16a2980077235612f5c345b9df4a5c6112b56a4cc50b4ccc18e1479ad886af2e14fa2a41839894605bfec3aa8144e88eeee6dcabcc16235260c680d331ae1184307aa202fe6548d2ccbbeb8bb3b4a94d4e1dc9db8a8c4e6c4d857cf9f1a85a90d6521168dc8a76054fe671c5cff68a66c57976a03643146d41ce12371777777ffffff87c08a89ad1e2ac066ec7062516cd9371c41297479c517d06a4d314c65a5bfe1cd694216bfa50ca21525be59d3e9eeaebb4078029b1e2b184641121e3e6309616812260382189584c2a848974a7de554bd0cc04642abcc99a0031d0a76c34b8792a60e783e0ae040c44b4d081266cfa4e74c49a49efac382c9dd1212c054f2b9e81079b0b1a47ba022fcb9f891f9624bd586aebd5cf3ffffff238aaa0d5ddda7e69c73eec195da50b62764d1c0454ce6be9cae3aa80173c2ec9c86706436046054b8374c8cf0585272d11574777fd1a536b475873334c70a2f49f7c14a62f5b95e37218fafea087934c362ffff3791a90d55ae199a4b5d4b8281e3611166d88e0f95c9b64c2693c5daa752aa3674ddbd2e44a381d0f14b6826c36436633667becd2dd51674894385548e963e106c90fa82812c02facac03d09e74d221030439ca14baa453385cae9c699f4cf145dd334ad7b5e06b0830b47b3446fe843939e3c7158c59e06eeff97b30a0fb99cf1cd370dfd0351b5a1abca733a712851cbeb14be637777d761531bda5b27e808f5094cbc68786a4e7c6dc578785cdc1a313fa9d1809fa1241d4d15289ecb68be4b272e2a879e6a43d79dba9e58e5dc87542823b22ceb014d85389479a3139610772c46c4a1414ac51217bfffcbb26ccaffffffff3f1ae434c4fd1771cfa6eb66331cf4dc2999cd5cf71dbbbbfb10d713e7fec50253f5f105a36509064d650c431417483b9bbd524f90dfecb7f7eaf8ff7f0631b5a14563851948bc1da0e262a7c90351865206af86e15ef65343a7ba5a87d7f339370f478cc143522b7fffff3c60bb6f9e449334a90d3d26b385e44ece3e9464f27e608c310c546a43adb42ac07ce92a7468ff8689449fcc55665cce3967d72fb87e21c57da72a1795908865d8e9c940e8a0d52937d02d35de60d43505dce178a76cbefd20d54af9a0d5d0d493004245ce0a89c8a8c9639c306a92916920479025c1f54a25653a6fef1dbbbbbb6b1094b37b49ac0a2ab5a15618439556cd17b525747563668575241b312eb041e5a6281bbd50a469baa6695aef3c49dcddb370e84bd2c3b96741e0ed98a635793e127e39a7bbe523d1201d9192ba86b12c507222c1faf1b43c96d20d4d9f192f5cd6b037b5a14e0c61cfdaee64c734eda70b98754dd3b456e172aaf888404bcd6f5764ad50188dda52e0191f84ae7e7c1c9da4eecf4ccc8319262db905d2dd3d83513167df3d954f16abf2b1617e1d892dfc86cb0b094ec394aa0dfd116249bbf2501a233ac49ce018ca69d9786d74bc7803398c3f3da8f0fbffff07a93871ff31b3183e763880f1d02809f2aa154e4de5babbbbbf327775dddd51dad486bac399bc010a4dce38c613b4d7c873e231979c7339fb8a9c6b807b8a6ec68568863f240b3c22804b3fc25d8e9110120bd5cbb22cf051a1e74be5e260578b1a2e390f20353e1f6a5a0e3d31fd71a9e1f86a2572878b09990e421ca772aa7012be392315486a6edf308cccc28f5d7b11c24c04754dd3b456db8dfe4c69da9a73ed6d4a01870548c4ed2b4b81846e2c2817011293a1251e2a28c1291cdf69e9027979b1c002a6aabc843327a6863072b050a541484cee7bafffffbfc592da506231c396b1fdcf455c2c21d6f7c7ffff4bd586ae2c59d86226f4768bec90bdff77cef67df6ff3f91d30af78f23870b2c2813af131352319c4ccc3418d00f6ac3d153b11775cc49372d5efbff1faaa7dad0f53f258aca12ce662a8d148b7b2229ddcb960fb4a70713a90373f9a3c31217d6168a727499c9bf2db243f62ec19255cdc98f1b164d0e55839772efeeeece046282eeb2f0063b2efdb91839dfc5762ab10b2348a49294bd6111d4feff591cfaea96b87f16f7b6bcb9d76587fbdd16d9217b0379fbe629500b244e35f6c46bf250668d17ca84d5549007cf0c620da927664a45c5c498094db92eeab293da50a60697a35c937dd1403d30a2c95ab9429f3177777fe2d020de0ece5d07c7dbb10b2f554b720160cd71a5ca053b7ac1c35681a04dddb0c7682595a269cb8972254105528552c512638cb10c556a43b32ec870b13de1050f2cab019c333c983051e49ed49e12321e132dff257acb862ae0726f2184f812a113d18a70dff7028c159d158a4f9fae699ad6dfbabb6b38faca1a90743a3703022ff38046ca8f02105e17332e24c0709ed29b26560c1b062059aef09e90ca1a48a7412385b654e61cb3a90ded0959882e8257a2a71eeeeddbba938100b5d1ef02563186bc7c5d264e583b4ca798984a960ad70abbd25b11aeb09088acfffeff6f74531b3a9ca199603cbac8ef30c678c53cbb1501bfe1ffffff65403b4c9cbbfffffff39a688a71041fbac08e6cd0c8613ada2d8b766f30c68b51bd0dee9bc52ddfccddddfdffffbf8543e615b1059e51cb5ab51dde1050132117032497b30f8497339397736edfdea5a604ea9aa669edbf09f890a070eddc8c50fa13914e67bc00cde94006862b8651a725dd35e15ce10c52ec43e0e0d813d4c5b3343573e46a26b1582e00800103c63b76777777777726d68b73777763179e6f4ed7344d6b59f096f1ff3f18abdad0ffff3bea8dd6a8e5683684604415f6b4c23b7992256f2042ce1db24576c8deb8cd09187122e686ca84f3240d01b414f38edddd5d47e842d586ae3b04b7adebce96397bf3d86efcce582623fc66b37f6b04fd54920fffff2874a90d6ddd219e806246840794c19cdc54a60e57b84346b85efe8edd867377770d31b272765dce39e730a53614ca4aab42ce97ae75952e6eb1201bae7675510090a3dc314de3e5fcff2429d4a8e24b0030b0c90df560bc52e8b45684404ea2bb3b3a44a48ab9618189d776dd4c6a43698e147449bc7d3ea76b9aa6758bc291b91851d6ab69395dd334ad5ba6627adc206959693c577a8648b046a9a4ec0704c285804a0471f026f379551bbab668c9ef77c4edffbfd007c618e35d32b5a13bcc23a69fb083facf6b18ee7d3b8aabcad5490c9966b12cbb228b2171a8508e185258a20d662119ca1b5e10118715565ecb1e3632b629b3eeca16d9217bbb3bc4fe72f0b8df7843fca1c0f0d89989eabaaab9d1af02a4615166c8492474741d44309402705e155328195f903269703915538106fc5ca39f124b3b55e98b2c23959ac164b9538011959a535fb024b026251fc9a8e60eabe707301528501d7eb11e3d2bc40ff21f42d442957b1bb3b02bbeca818b948c871d10522f3c3c87cdccd06d4654d452fa16e56154e20d2183a4d19195ab9a11e576f866b3d47d79289d5878a76b9aa675ba5399485aafa6c5388e295d664e0153b6631908656a4397ef0410cefdffffefeeeebc181404dd1418ac1d3f2e321b93db053b4442cedd3d7b8e10063067dec8feffd779551bbab6de1aa9681d00e5f961ebd9f4d3c2b1586c662c4a5fccf9ffdfc65042548072046e3c6c531bea56180e6b9aa66b9aa6b5abb7cc047d7158b06696d70e0d20bf6221a000db58d1dda96df0f6ffcf8289591c61164c18e7f5dddddd8780efff0f2cc1c053740c9e70365f24b158ebfba7218ca90d452a9718438817e314d57d4bf41cd59195410717dbcbb043d8812e660d143835323332706c8273102e1c17aa96052d0b5b215c2f595320356cd1f543427610c311c385555a044663c47292ebe1c046c9e4050e1408a02ea64c4c5a41c4d3b7c595f6c02173775fc195916c46f66a464821ce7fa89009e490a76b9aa6352e518fceae594aa146516dffff4b8072ce1f5a41aea50be4654bf63284a24524849a168224a3ce4c521353cfad4ea85c5074a2186c512abcaeb977777757dbbdbeffffbf06452cc63a5dd334ad5be016638cf1d532b5a1aff34995a5e18a4b0316ab959bcdba9a807acb9cd67fb7008726b5a1c7e4ce041ca68ba4608c31c6ef40e7017964433b4caf6b9aa6f5530db70bfda1d16313c6e1c331448a2474d5f2b2697824e717230f825eb0230510e630a810139276a8642c9f37e7046a01d31904184104511ccb2341761a00148008118e9cc0846cd430140986e1a0380c0685c24000180006830181300c0931100b53590a5b580725011bf41843e75abbabb6c695f9c0bccf6c3a1b690310c82e6202a01bb28aa43c4accdf2aa4c6e5b0ed5d07533947bde54a837d3c8d83371082d0eef408bd1211553f202b7894468e5c6a53cf5c5fe98406346e9c90bc57cfa0831fd2892b8b4b2138d5dfbe1be17d56fb60d8bb438c3d14b2e3b1fca45a81225b54d15be458f2747867a949abe10e7ee1c900a0f22a6a0b066301f120b08d56f8a186d65aae239e30537e7de0377e34459e9ad5a9f4943cdceae3144b0dba67df4d5bdbf8d9d10e5dcb1fa60fdbc248733172a8bfb0545fab78169d0006d2440a26803809effbf1bd3fa77514ca62505460b40294724b6bf38884a236024db745f4ecce24126989fc407d22b6596ac89f3cd4e9e2b4ad7c1ab887ebdd0392780bc2d57f1cbe6a9d6bdd827336c0ed183e4a1e3c3949f26006399bb16fcc43f1c63568a1d35e145d0b447fc898d77397973f6c2a1341630775eba94bc2dc8a26841005ef28a43b0202a7b562526f5a2f27f0628d692dc5006f4191303e6bf4ad8506a5e0e9a6a89e3c5a7e2682dad48289f0bd8aa829edf5b2f42967394e0b89290872f7bea044d8056b6858cf4bb2250fea4128d0642276e7b20c6d66d57f1c5fb13b59ced22d70bd550f29413843916094249a5ef954361ce833d0d1faac68e5358ed95b5fab3dc7b9a2b62246bf04ed41b2e8aa186c053e7e20ff2b0039f82a066c531543d713e43d5b500988744cf82b2074f53fa00bdfec6a8cabfc0d5dbe5c743e46812dce9d51b8f67189e21a764d9e85078baea8b0383f6761e24a17873a7789cfa2f3cb29cdef874efd6df9a58b7027a53a8ef4db6e44bd2b4552977d88d666f37d3024ee5703ff4a423e2ec355e29b453527070314cd6de32749d9496654899d28c57df488b00b3d4b9bc15a043509ce826d9934fe6bda008b970c316aadc6d02ce079a8f1236d722e6302897162b4477e3f0979b9c38b5ead4ec3af11b347afd6dfa2032c08927acc51be3402634ad56650a3b8ac1db700eb3260ab8ee8275c4c08ffb1c4302f9f70a2841594f98607c0f3d2c27095285201123450047a214e9ffb016f00702c45bedeaef5323cc7a7218e3505d87c6197f49ae683c9aba20f81bef00f87f44cd69e934eee46b7f10a674c4151c347064643890f69c7c94c38bb9b47ea277801e1a0e5915f179dc722732498ec6fafa4058da423261a6db5c47f62363eddcdeb89ae0e18a38f1a6defdc0aaaf0a2bd050c1f6ea53021b7a9c003af56f3be4234ddfba33e90467c55041da65bdd701afe91d1f64b570f4fa2dbef767c2c8773c8014e0d014b23765064278af486db9d79c1d7685b42af499b9ed6c70b0e30aa07e18bc3e99fc76946d0c18b968186ee45c4a99557ecbc86c2e52bc48a15fd73fd571547d85eb47fbe6feb5cd04f5a8e6b7045523093d3e2d109a78ad7adaf909b41687d8b71da5d206d11d63dd3f08644d0a08e8d2d3c473040a882420fbc0472cb63a845f289e306af0147933e9f5bb3e36bd159e53e9e4ff12a1264a2ec7608fb546d2cc1b189a6c22b07a0d5d4aa9adec3665b1334721d41cc7bbecf0553cdfd7394bc95e73f18aa0957a6f70acf34424bf957e078d324cd47a70e0659ef532a367dfafb926a03bbd86570d3856352722de5b3b6afa5f9566f78164d316c1f8c4735d3845d8d648023b3a867bcc3a3a8c11c0f38e9be054197708dfc39685ebdcc174374fafa458c05e07bd3808cb692519744268e89297c7adc92702d6defee1e823620bce2d58d533b8028c353b8c29247822b88315415d7967c6fb7be49874b618149dc0893d742cc509018ace4aff1fd652d19659c7cc2417b68454f1552a24ade714641456139443054d40f7b7cbdf52c2d59befe9706e899b5124e4cc7edb0c4bc35a9c06874ce8fbd4ad826d7c3ef99f08eada6461187dbf8855cc1e644aeef660d38139749e537684b2c2c28512a1da1e9fb8e6621078b07b1e4da7fee1c6621db03a85156a6d6d95727def3964cd18abfc1ae58cd789cf9504a7212d275c1ae97d4d318fdc26fab43f2364a486d2db69d807e69d3ce3bbc1177d9f162ead3bf326a78a2d15f44868659f8342a6e2b87b681953a7db353d9cc4a7aa55a71e2fd31ffecde2ecc51339096798fff03bd23972235b73de210e8934d531ad36d3f7e2b060e50aa51c69574459f62c5bb142b9cc8a4641830588a639a9cc63848be9a30d7a1c27fe83c25238dc6d8b57e13082115d3bd408e4c9bcaefffd0a7c4fe09b34da543931b0470a5f297230a2794a60d998cdf9a1e10146de6eaeed531a6c71a459cb158e87d22cf721b10e8a084338e1163d241dd781bb4919fe9f658b8d55e24bc4dee11502948e0f5d063b38478eb8ec5c8a9ca7dc7e133c9ad139622fa31ed436678129a0fc5bcac1a6b57e215094f07cd0e0faae6553424308b90b9d3c90c4b154c733f49bf06e6be8329c87fcffd61bbaa79e5702e790876c1683c16c220360cb14ea5d1d2a3be7915529319d1ad0d245f0513b7908ed6c11422ddf84694a071b4439434cd92d3ad6c99173d445bcb84efc70081c22b0a41b18fd41d5a43ec2d669fca9605cf6a43b0b6d6bfe7343eb5a013083ee73175a91da640420404bc20ec91e3fac69ef452a7234c21c0b3e0e43130e5796f76545ea3aacba3a8f20561e80d1ea34f0bfbe62bbdd80c11269053e45be362dbec787e56877449b9b3f3694c8b06c47168ad346152941ca00b4bd8527460ebd564435fe7533c71b711451e6874b2e42a431e14a3bd7073b6b5b282a118e939705bf3f56ad5413cd9f0da4b442dc6fc5e81688295f25fc5bcb082f25582443965bc4cb2e7741fa3234d3d26a569f2cf2fa7fc0db411c526730d6ba76fb15f749dd274c820ce60ec9316ba198058f1c2352d9679f9c289268c208702d9a67d2d888bdaff517ec88561414d8ae9309e4124cc1b345a2bc88d5bfc63bd7200303d4c8ff877967cc1b0eb969b4912c953084485c4c42c84bb29a813310e0a128ae8c26f35db338dc49e5ed3388f2139c958df0a78109163e13fc6072b18324c6be387f4ae62f4b3b72d5363d82078c7c88f1bd769576bb4477472f0f44c51537edac54887193f014ddd3c78cbceabe1ca81af069b09dba06d434edbe3636d399d243123750ab9ed755243d3379be320352a9ea6c5a97e54da78c4309f4dd067f44615885622b84646402eca7010ef05ef0289874bd92bdf25b9a4f6273e3dc1fbb03cec26b8aabe2e42e6ee3392dc8fba25c9a429f2c77af059595bd1937a413f8f0c233601623762c275d904ac10aaa9e34cdb84a531d7c86e6820a51415351e005cc52fb84615ff7cefdbd77809ffbf1e944a3c434905dee7a6be8a44ba045edf4ea12e789ab5e7aea8437c51888ceb07c44d14a9c8a5b133c0ce3c883c313a1b57406d89d9bcf35112c4da0f0b73468be26ad098840a5501df927f19fd9dd226cae1290ce14d513eff74ef09f0a46c91d5a9780cc68676d06ca2cb699b17acdaf383803bbef79610cc4950fe7b8ea42b4b7f677146d31ec03221ab272f79d9a1721612621fca2515a2b9827a9a9790a58b152d8490a464183080844639072892d0f8b6a90a2d8a050e138e542014d7ccba5a8bfd7cde6aecd32f2e4aeb961228795375925698d3a048416bdba7f6a579f8995817e2670fa8a5b68e7512c5ee5f16d6fdab8757db719fb4228f1ba0ad5181965a6f26f88704cd3a0a8ebaa6f290a027868c2a3d6873dbdc710278143857718cea244176106791140b027a625da5b1dfaba02ee030f25b0722a95aa74ec1b46486f17a57dd6a6d2aa7117de1a3179ec4054091140a08cdc7c1bc709894f9d1ee24b5088c659eab6931e36ec47c39a4c78bdfe2642d759c19d2b78b2d00360ca37b7b37708fc64bd083e27423e5c529d728a9f5e294143e66d7471aa11d7d1cb6375c93e255021920da05dac2dac96fb593f1eada1265e45a9da02b388f7982ce215f8bf8ec778cceff7f82996c89767500cc9e91b02b428d41c627fdefd7b12733129d37e567de3e3eb5cf1f9f88181e1941023d0339b20c99ef09fbd712c622f0d9e30c8c6e36e5f55a3c72f2528558a1b987309cafb9a800d1ed6558caec2bf77c019f8997f3682605f7ef549873cc460a1cfd83689f613e2318dca362483c61506d937f133f4b80318d229e1435c3407d2696de752a58db87e929fd7c20a188f0122759bfb66b2a73446cc834285bb9dbb453bc4e012409bb79382e11814f179b8986c704c29990dc6d6afe19b3081f05039c24851d89af1ff04c5ed97eb187000cd622deda400d2f7edf6ccf3eeb7d0437f4559e9a6a4b8f47765f97cb1133f2d0bd16d209093ee11a42806e636f3ef239ff995ad949c6649b02d7d4d7abdf58ca529901cb9a8ec0c020d1b2134e4319d367c35353cc4a9c0590295a5a9af3049c34102c69ef0cba4900956fe372030a82a73c6370f3bff6896a686231edd88dd703ee24aae65a4f957140c5f8f831bd08d626c8a6d4e2bf4c094176384a2bb74b81702d01108bba6e1de127a4f5dd023511976820b706b751f56bc6ff2c848fc0611bcf8e09b9786c935040bbc0f2e71d1a0b37b32b10727a10db458018d22dd9b2cbd08599720407cf6d776e6a41f9b6ed6ba884f7eb13be089cbbb99219ca1730a18d88984c89e6f56ab269815a078a715a1b5c6393bc70991788dd60f38b6b8954b40f36c2ef0f1c086a8d14a8015f2e118c916de3cfa736a5eefcc5268f48290f6c28b341152744fca9413f1d7972b2b5f96c72440eef835ba491fedfa1729ba1b010aafb39846fe78993ed06413560db0c662da84c212877f48fa312e625380bac82c60195a61bb5565802449846f9a686869a788abc1f7f350744ac46b52ff2e62a2601d8793fce3541b4f696548eaf80d25accc646d53027d938ab8060deceef169e5bff163ed06a67e9f84a3667b5b8f78b2f5b6d56a043a4d2097e202e2ba5a9e1a9cb9341715ebfbb6ee904b64f7170b85067d14301bcc7e4a328216faf35d3584437cb0f9875da15d1e7e8be622783a4a40b2c4e2e8a6b103165f6487ea191b8a38653fca638303d88a319b7ceee718ee2de2ddfd355888015d392675bd90069c522967cea9d5bbd4fc3aa1729e6f1e944254c2a60cd161942c91dfc7ae984cb210f854f4059f10516ec40284738930aee63cbb3e34879b12994698a73b9b6c65f71b0069caf6d60e969c23003546df85d7beff32c3523c1df23efd9ce6a0544a74ad66b2bf701b85f964bffb3a67cc5a2bb430cee1e80489fef82c91dab8caa7a11823f3359a1bcb14e7b2c4bce7bd594bc6c1d2143f5c1ec8dbcceba50d39997b2a6206249a322b586879018b3d2df6c85cda3ad9d836d5514af30cdc4a667bb12773f74350156564a66c715377ad530dfefbd99b7aab8a8d339768187bb29bfab513bb528a34c41b035fc66c096aeb37bcca027958632ac112863ad56f809fb8a732c980042992b127c6a04e321ea5a05e1ce3e101bd75c5f877e49fec6b012d8367f28e51bda5f49e8b107e098007b87df4acbb3bcd59087091284798df4a5cf69d0d09564c6f7da5db39a25f7dc6dc45cd1add6980f4ac9dcdc326ef1ffa92ac9969e3e309a82d7912712f7d8ece23964007297ab85c283f8749b4683c90f37a440ca258738718217ad387846e0ff40b7ee71e7b6435e31f7e8d2e635c585b53f342b18c7f059e99599c3c46be53a0cc314012e96d67ffbc8adb1e10583128031f4e829f6645455345d898bb261a6a7fb2b5016928ad50ef4cca8e995173db0c19907f6873b15fa62e54e23763152f244cc36ef174983e58a45fd8470de1efe3351cd6523e366fc29da59ee90e03e84e7c80aba6b7505c7f55521e0fc1a61e4647a2fe424faf6b1f77c095bd7e7bb3f3002de380e1dc47ae846e1fbec84c3532bd698823cf717d20be6b9119b0009b4555ec593e38cfd27867f40b390cc9545f008afb316f2ae3ea79939860843835f324f5b83eeb3db7d52ae7447bdb607d1838e595a772b238c719ec229962144720ed4fb81e8dc1a3f3c38b5a05ba9be19eb2be938e5d705e7b1254e7ad17b4d29c78b0bcea71d8ce7e5ab00a589d1207c846ee6ad03c54934719acea9c4c30508dddea44155ef0ae175ee40a686faf766e2326e1d7583d9ff560c1d25e2c2a7a6704c439f4626bd98f56314e9a4837ac1363d89535af62f6827f477aa5c9bc8ee31fe3fdb23675bcda0f99e384afc05ef00035718660aa7b14ea05d4942ee1fd8453c1a7b28074cce28bf7d4dd4aed34ad0661203a23451611f6a10def3e26837ca13280dd16cc7be69cee57c88485362aa588c658be924698d453e8ff5263a7be2b5c373dff47881342ff713f76e8dc273394bdd64f5082b2034f8f9f88d9fef98274b9a36d408ba1d421724e169d2f937a13a310bb8054932f70711fe7c029eeab352f0d18b32104924eab6fb941d746c9049d3b6b9b34fdadd076e35056da2439a6b289667e1dbead1a0c41e1aec5cb714822ff93e169c3749d6eb458516a323508f5ded92cf5a7159e3585c361082ad0e32d1a5e6b9646fda2ef33a0a7af39692b01d838f93dd62b21e0a036f7488567c17628517d179e1c28a4acfc304f0169b0d649785ceec633ff797802cc956fc1931047657914337cf98f60dc2920904996989753ab1dbd02deb88abffe1ec2aaabf5e7772334b69610347380ec2c1f38a16e83622f6763047b7de1c78e85f78b46f16369fb09d57d60038cd633fe82045f80fd8a09949438d1813a0d162477b96ea79cdeaca2a3d21428f0410c082d11856fe7d43c422ed31c1913c3452411368aaaf5370a6d19408605487ad0b782a9ea5bfbb0b76a628ad3cdbf6005defd1a2fe41755efa84654e97e7a9614d11d2f1cc874b579df335ba8645473778c4f2b498a801287ac035cbbf20f0e3f063a0161d2a0197e6e0f09f42151bd7d665561b1924a3657f9a27ebaea480551ea1ec693c8a77f5921009c274c8db5e63e59635a26d2cf8073c78d6f1d2f86d41eb28f0a1c21291a049950d3923520d9e3bb71975295ec25ff097fe8a27ba461c7e7165b1ebb07c5aad5e90976fab066ce8537b3ac3301325ffc95e65695d219681df4e6f7a184685c20929d88178c18b4620b72e66ece90d0cb0d2266e809692a4b91aa1f7a689137f49b538e18d7fe36ac45fd17f63ed0c893452a7c8280e8f7857d8e4b3fa5c1d98738335419be7f632afe03ed3accf9a11c838d9c5081250a0b3c20a2c66e7169c1b8a4231e2b849f9a3b88f43da143193e5b43bb285239face11a4435c482166fa93684b57c5b3f2f0a5775b51514babf0001996ba3041c6d920e944d5ced3ee23a451c6647cb922a4726802147b974eb1d41b6deb22ba3d95474612661a5522de0ad02edcfe39ad6612e92482cb80f36426a18d1c7b8b83817626e6e5102182336c01a0a8fb9d669386c242bd0c1cd00c01395a0ba78b5e59c09e83daf91dcd16a28253a4dd10025215173b022a643b91018ed5f3fb597bd8139f708294713e06db14a73aa973bda689cc98233a2edc7fccb13011016f6f4e73eb0f31d035d8ae3b54535416641ad49dd1c6b82426ee70752577d014187189f36983be2a8b2bf7381ee6ef4ee33267dbc03a8dd15138d87d0fa588823fecfecfa835c094fbb7b265dbe0671faec6e70db963d75419f5467d51761509a30b978b64cff4b089686851fc451750884610ce45f86f32d61852febf9b3256676f4604cf9cfd21c4f221fd49bb416e9414bb28054d91f88e110c9330cc38515355431b0bbd20000a24938a0361b5c5902c168e9c8e26b603ab291025422406953c5ae828b4cee1ea6f21db6b243a13e2640e8d04cffe0ef838e27c155fbcc8f99e2671f7f10be83d62fcc02bb29dda51ca9173a100273ffaaf9b8c48e721a294218bba84932f305f0d70b45e606659a4d7ec269bd60530cc96af66a699843600caa28cbd6b9cdb444f376529ee9f2701fff96e7d0e5de1cf2f61c86f086a4f7b9328609f06426c1870e001b89012b4e0e2231f0a2d456d2d5eb9844dfc145c7d60248fbae54927b1106f0e28911664ac12e0eed7d2b1e8e52c958587e85ff7923c62499a8e260081a85e09f0c263387cb0c49918db6a0a2eef86fb4925b47ddd1e36a2992d107ea4589ae0861229949a28b7eaa19fa2f0cc1c723f17ca4e91d884c6434023a197f06316ae9e0d2a3cf7db43cc1a9f2b2c7bfe8b2db40d3d79c7afc987da7f5e4cb06173fded45150cb65bd38db071509884a5c969efafd4f5ca02684dc663b7e41ce37cbf8757c0f5edbbdc965d67f529252929debbd0c8b4848fb241b49689c0f17c31230fdfec3015b2ef86d46f8a214da64963d60ef04b3e4f134022d99ca1473ca24ecd3e89014ac84b66533d4b83996ccab15a000706e7beff30cb8a5e19123b1a70d3e1ad02f2bbf1562eef53001a0b608b4f605eef2673352594a16f050afddf2066df2a280e9faffb60aa65b76b1409890826b6d5f5162f7c98b520a4fe8afc458a79da2e82348a9f2c875393d05dd25046c5f8b4723159bc87231603c65f681d0bf7c534caabb1219111381e0e561a4a250bd9ebd27c95a3a2eae03ea82d02d2ff8493fb4d7320d27a2f6624dab3ce7ec33d75a19e652b8746f85cfb2a8eeb616895decadc7b5b4ade65d19900825ea1d7d8798520f20d504ee274385430c4e5d677d8167edc397d3d2c8019ff2c9c4124bc5dac42edfa4314be532db7f5a2f2b3fc5d95c299e4218dc7a609922f823022aa582b65de1bfcfca8ea1fcb381054c6feb3de1e005b27465e7524d565d377317beb99d5c36f5d8fadf0d4141737c49bf8d66255c65198568716e6817d6a3cd36235bd587296427dc98de67ade3e8bbe5f7a2814ab4077daa919be6d107c5dda2292fd57a55a590e8541cb22cd8370d381512a34d97d6e8cb35470cc0ad2b8985aca9d1410861c62861708b07fb524ff46891364e729e21084cd757eb4521a8e52b68515ae3ceed9f9fcf27152bc044817064bf3959c1863b60327e8c78281a7f380ee76ed3a6f78b5864b73645b94dfe62f3e73206b91e387dc0af96705eb61d641f09df2c93cc2d8d0307e46567c644c26b8192b0eb12473f75743a42a2bad6d7f87aaf9d0387575a94c9fd7e3a79636886e60c0d8430b4957ec5156d26c27619dd903d33b62cfbc0db81c67edcd15dfb847fc74a40de540296ad68b1bd66445dd6eb1a7ab449d8d3483609f1b4fe7faf6607b4d62661283b4684dc8450f5f141822ec15e3c40b65285c4a82f19f71be7547f2c6d0246abc36c33d0365cc2ae2735b7b540467c43e49203916da0f4bb0ea313256f1d8412fec6e8df3688147ed5002f20ab0863cbbb5f255014cffbb29e1108bea7cd588573abda17252e52a6de380fa8c5661c7a0391fcf2f187989623341898d50416d2ee94736c159d948e3732eb1be3af432aa6a6539560e23a8a93ee66f8c0f5064d2bf24ee1e8ebd5441a2986ecc21e93d48fef5e725e4de3e3474cd23d298b0208cb9b6035c4cc25403cbaa8d596ff4288d69c16456de5b3809016c51da0abb00923ba01f3ee3b15568d2ae645982cca5a2cf85c7bb0ad9f8c98b123ff526e49cb8a85ad6e7323198219e04d9a5f02a2fc17cc64dcd6bb15e2b47243a7b15c47880fda68a67524d414ea3579e05b1650347399b9079a8bc4f65d73854a2f68a687ed5af102545d5fedf217046df4eacd77b80463fbbf4d33cdda2197d754328771e97ab289fe22ed2057d2fe32db153dd52a51f393ba50478569159d39a9e87f457e737ac4b4f733ae9b5aeb8b83659cec8134580f44075c120b1d6856b8f89a1304c0b49a4ee4609284b9154d0821ee0a67fd25141791a99eb9427e3ca7d7372a49076e410afbb5639460a512e9fb3a61fe9aeb81bf013ecad08e904c8fd41891042ce0540529b119d20c1af5b71d8b8e934978cad61fff9abbcbfd959a5cb285426bb09768a8bedb3c7ac75382a7213621b68a32627d5c0793eb149656a50c9af1956c6fbb0ae6482686a2c3e8d480bc9295921a36496f30203db7a74c2ef91a5e95e8eec38e1a3841527322e88a519f1af8353418386b01574a522d4aa0978ed013cbd52143df005411a7c2a6bbbb14b60de0923a5705c818dd735a1fe3bb9d81b86c9831393a0fe100b68807e8ca5f2027d5cef953ee0f45834c18763b7d353382c6a973bc68de5279996b29204cc226de3ed14891e691cd20bdde9843939040ed944217c60c535142e25374730be0218495ab7d96208821302ee84002611045cb969b40d280e4432be9ee99ee4ca28a7c5f4d29ad022cf38c865d450274c52a48dd4b0a66410dd0f56e421d02bff8cbf979d54647e5f03aff10500a63e520c884429c8306f3c5bedf564acc1c34a9df391c958f44c94493aae1eeed0d677cf5a65dd730cd10055676613f52c5e247f2725da314e8d608f6e716cbfb20d682418a15a952dfe9643175375f47f694e7ba32652275c3dada63348ec91e1924186d133b51daa796b824670c459bbe2dde87944bd4490e0eacf2d9599083c26b68e35285140ebb9801f4494794b6a66ca58b39c64c167ebf1084b4507c1122c1563cd99a63adff988bcf4f672eff6339c107cf9c1da37e4b6684586a66c515b8cce572c29a0f66049e0f0d000bb8c918f8627d45a574135d8e5884dafb81f42ca387192d1fd24064f72977cbba604c34fefc5477260d8f6fa9436c90768d532570851c8387fe91b0e67265a2e2df1a3767700559c3412e9615613c322ee9ee0f18f39cf4ede2ac2cda7bfec43244dc05d87a1287093936b667992ca79b15bfce688e8d5d2c2765677eff841efd088cb8ffc6729a8a069430d60791b875ff38121db9f4ec558987d9ba704b83aedafdf86d1ba110bbbd3b720abde9cfe3c13b8e51b2033c691552b69d59b4af0d52eb627d15e553f39813a1eb26aa8f4070a670fbc31a2a519fa1075f26d7327774de8baab7f3fbc736851a36aeb95bd51319fbdf6e51a218261b9ba5dc3f1bfc19c0b5d062cd7bd28d7cbc646affd1efd35396de383b5062ac6ff92e243cb07d7eb7b8e91c83f1ac91662c1a2f25ec378dff01d56f5ab33eb4fb49df78f1763b2ccc417a5439b78539b2cb00f8b39e83c8346fcf264ca57dbc1ac44b238579661982b1802aca017ef507189bf0db484206a4f8253b2683756cb2aed559f6422eef23692f76a4e4185a825c99cd53067b09440d9fcffe9d1115adbe0579c910fab65b6aecf2d6549399a8601dfde11fe0090001eb6f86ff2f4c1a52ed8a5f35da14d9a6a11e4210c62e270af236865552e345906a2a312d2962039b8bde3c82a246065e32c6927d5df3678b9bf6ebecb1d007fd7f310c94af484cc6bbbc12db61d6a3a9931f28e022395b12b1982e03a55fb30b9c64444271d2448f259e3a9a06c6b788ab17bb1a8a24a70bc82acf4f2443c3ba4789a6f4bde5d045749f5c3f5d10988a830e7d742416d655358d634cde270057814375245a4f788460d86c916c922adc108a6656ae387149728f48b7f7bc5f3491fec8ce1983ee9198a12938bc47377b18b1c7722d665dbd961c4af4f304026b0205378a69e8bca8c6931cf82cc704e6b7c76f9b4c661dab52d99ccb3316551e2c27aca2023a42a6f4ed00a89aa9d3751afd085a6bd8bf6decee64dc40ad2999bc53ea1fcee3ce2b3ff8e0ba80fa63ce5e510ce6c7582eaf9c366959346a748d9c4bff50e14a73744eb44557ffe4136ba943595fdc3d529455906a9a6c5d52606b670b7f73e231be17f3b85d295b0b5d7d5be4452fb17f26fdf1aeb4b91fcefdc3c345200a92c560bff0530bd895bb29fc019f8907678b6740df3eb78432f0734922644e016ae408335970ce99cd01abf596b3b4dceb501c37c8d9437cd3527608bf4911cf39502badd3550d8d75f952238b9a4103f8b80cb66542e36276a17232a97531a37165fd68fb497eda574ad86376f99ca4e8b6db53f551c63950924c22e8931b0317032303fbc6bcce54da460708841bc419801d1c836130ec1b319a0e5b6497f209d4e25624214db5cbf50086058b159022738d96ece6801a66888881a5c2c60f9c222acf11151ff4de2d7b3b0bae6602221b0ad1ecb616290a9d32b94d1663fd33b225c3311806c33fa57cc52225d72b5b73d7a303c0bd88e377bbffff3d9d75a602114f7ac6b7897d99e2dc4018901cb252497144f393d573aaf458b2b8686ccdeabaa25db12c2e8965710cd4a921bcffff3d3806c360989ddb655414c88009c11245223920a75350790374775729b233f5c5b11e80530070efaebbbb83c0e3b8b7fb4c7bdf7fbbffff3e76a6be33bb024101e2eebe7be2d2cedac1311806c32d7d458444e68669c554c3d87c0ae2bcbbeeee7e543f4ddc57a8e8a13f24a78e3f3c6b2b46bbe5c24c0032842ff05c5cdbd46da3e2fceebabb3bf304d2c4dd1641d08fd76d19f9cdfcfff7dc01587c82304cf4844a0f7c65317125a89fa99998150ad7993a2cba1b84c738f77ad5c0b1afb82496c5f109471931c02144a39448ee4550f209b90d8ec130189e577545d03712a4857699c1bd7083b5630200a51d172e4ab509b77670fa1dedc8f8bc00deb849ba0a3e4f4d7bf55c672a95747bb8ca8add6faa88618ea4e55d4649db8aa287e7262b3a549c0a6094dc5122d6ccb9fc2ae99f2ffeffcff9d899fafe4c6b6b1c4477848e4b62591c1b33e87404487deb0ee78d755dd7759d96eb4c5d727a5249393865bd0636966eea66fee5bddb161e854cab1ea46e0fb860e0800706ba9b5ac1b888cca8a2fa1d9014f45b6ca4b58498459044286236043184310432c472c7bc206f51913774d66a35191f9aa8f58ce2d075b2766c454d313a2d1959521a1f72d41315c047e5f6f29636a6798bd6a849bbbbf75e23e7dc76604edd7b6bad6b77700c86c170ad73616fe26b736b2e3775343696e1c0c5ec2df3f4da718b4b62591cab4f3ae41e4fdd08dc950b91be3148e4e41117325a642aa8135a2d6ec56217c38ab01cbacfefaebbbb07d999aabb80c34a4c56d68daae68938e502a4fe35b548b2ed709bc34eddc2ce4116f8e0f7425013929c9c59719e20a4dae9c72b420e2b4318567c6775068932b38403f393d5db82edcdcc40081f290cb4049dc2e56523919eeb9b0a382948a2163c1d2faff21fe821ab64aafdff03ff69035c96e06856b58c4132f0e2925816c74a50b9fff516bfefeffefffb38ae3335e9c147cd6b7d801e1c905d8e16bd35954b1a6568043006d7992a1cba1b8cc5f8ff75ffbfebb95a2c4368b1440226cfb38ba1360909e9ded879efbd9f88eb4c3522974b4e1c9e9eee74004027e01348059402b382b6e0ec3263ecb0ac29b975a6fa4e527e2bedbe4cffff71be4f7804bf7edf4c0435b4d2d4f164f5e2683d921e55d5c4eeee4deb4c7542a3ca9f245486726944c4f62049214569add5a84827b9448007c760180cbb3cd58aea0a69808cc542c0beb5c8a5eb4a679da9402fca15118e79551bf51616440e1fa61f42104335b30d19aa0972aee68fd1021ee60816a38e1a42445a2011f23de51fc1f4e608a6de4a7347ac2bd4445de6a4abcbaa3d96568b521e5337800cf5094ab121e67c0a8c920622227d4699bed6ba9a54b916a86e3881b42c5e5aa2a9ec8260a336e7703422a77b420485a1783748129febb8b4ce54a74dc2f1b9b72b093d5f4a2e863055519d179843294b4a2f5c36924c4cdd38d3f15dd7758d9ceb4c854647309ad672be1196bf97ae69d8da4445eaa977536e262e896571ec2237e082db7befdd814aea1d6eb26cb377c0a1dd690864d4372562805835eb900709a82b841c34488eb1f093a5031ef1884929ba668c2ba9452d96f9d4fcdb3e67f1f2f97f7bfb23b7a5cec09bd593975f100d39066a1451f4dc829179989bdecd5d5675c80b2b15371f64c83c5d389456aa5ee6d1e70a7614d43c53ea1bc33aca66c2682988e6b7b73b86ddaa73df2f428bd1e274456d45ce7dffbfeffbbeef52e5f53570aef057636e1825ef85c20db1168563a9f66c794b797ebdfe8b2c26fff4f2dd757777a9a4893bed5448183bf3de5d77775f1e6b137777779b33deead2c40cc37cd858dafda613b74518c67bbdfe71300b2a68e4aba39a69d2cd56118a1e95483149bb3d0d2c8f5227659ccdbb41cd4b948b56ef66a5ea28c65d5ab5bb5ae792db21178f709da9c3ed81a7b837dd52b1f81025476364762ee8928dbd7724c82cc5dc6f2b0d2870ea9ba75722def7dfeeffff4951edbacf645ac19b5f284843e7315d4dcf2b9ac9e618ae33b5784cd64d4e10724035189af13cfaaa822fbc8e4712e6d104f3ff3fc3707177ef29ae33f598dc1e7aead87f782eaad0526849c80986f6ff5fd7d6995ae7deda07c76e2f04b4687248d02c259c5c4064f050b93aa1075b9d1c044b4199f6ffdfb4ce54270c280c231a8b552002d1949a117de1598bb4c8b9bbffffbffef5bb921942bf159d043de58a2768a8b8515b054969d081f503e339a328666d42bad1fc549332b7554344e5a28aa142c6755df769baced45acef70b8200257c0d60980cc760180cfbdc32b51878ae38c2d17ab11bc261e3c75542d9e0660801f67e803e5d0b979212ae98a43d2b3a5eb4e85162ed2490c3c4a900a928773f1c49aa77d7dddd956c26eeeef4af1dd66ab5103f13152944f417cb5eb75c0aa755d41695d10fac6ff16500e66c9944de2990829019e464821aa3343782318d26976955babda1b2707c5401cd6062f991e8f8f686465f8a29ba9594cf1107b82ac2d9fb2a6acbe068353319cb7071492c8b63778675aeebba46b575a6e67cbfa070b8c1a898e346dd67b6e598c40530c2cf8d5c8f94ac1043abace4443455730c5bdeca73c9a867f8f80db892a033ad0175849660627c92413c70570b26be13b3a3b52b18e8bd7b7bc3f4e27729b954c330193806c360d8bdb1b9552a7c657777a51839a6aa822750e444cd3d66682b93168169f3c678e712bd1f096d85c6329eeaab71a9a450b1a215e204ef71cd14f40c4d32ba03881ca40864c38545a4428806e909854e29e2f663e8c462b2aa590099c4ad1e740cdd77647677f7119dab6b9bbd9c0d83cd736cb41be3ee5e2cae33f5b847282663eeeeb81e2d94130a0a15859adaa87909d0755dd7755fdedddd9de73d6823c7e33159c3b1bf0da1dddddd91769f010b322a52ca5e8f560e1d8b1e513f9e7622817ebe2cace47e4c3e304b1b3657898dc2c54b0dd4b3d9b3834997b322e3a424e374b1b141a4eb4ccd8245b44b22748a7c54f365905d2eb95c7b634e25794edb8dc7909b09da49b37203a4c930e5bddbfdffb721ae33d58844b1598ec091c84be315909f662fcf1186790b1c836130ccce6c8d9f4c5b95d2612cebb1340d1c49fdffcf927b73efbabb7bd20e6de2eeee8e63cae0012904eb45511409d957ab1c35e8d874661ddafdffffdfd64a0da58a5247a9a4542dd5f4ca6a8d9a8bc6108913126fe404a2a51436c7173249df8b7917c47aeb1e70c129bb2f0b9dd7994adbe8001151a046ac94f77ddff77d71e4ff9bebd331d5a8df6310c42206b248d5937e588b4a544180bcefffff6f84b233f57579f3ebb533bf5e447b4ec0755b3041215b3f4bc3aa96181ff037d79110a808a20e1b90d3b4f63ce58a760b478fbb7b929da9ef4d56232aaf4924901ba7f25a079a6a59030c1f8ddb0c264704c1b0eb60637c9a39a11243a32d428247d22491b28b0bf0e143a29ec9e530d7104a23f075dfffd17a9da94d4e6814253a7d9aebbaaeeb12c170acdf5d7777674a194ddca78cec94100b53fcffefcb5a67aacd65865de8580c6fc9245bf2bec525b12cbe3dd1eb8c4b4d424778d4f33b1ea016cf1792b8ce54e3de8044c67039dcdd5dc6b6ced4f9448616a0ca868595140c5c9128664b8dbbeb0a580a5d2348259732cc700c86c130c9ac0145799499ea2fd8eca98194f4a1e867103d3806c360f8ff77ce96363aa4e7a1aa78a3bdefbfddffff1ba075a612dd931b630c8aa4c630eff0f109f1d1d4f32da6ed157f712915a7b18c753a2e8965716ccca0d3b95c40d999fac210c52c87e411868dccaece15426de88e7b77dddd3d775c676ab26eda1b72ce12999a0064805e76b4ffff1a3b53df58d6e2fe6f3ff35c51c996a736578e4597c755770865a4136a05e3ca852accad33d5e741f8a35d3fa2f2bcf7de1b06baced4e80698692db781f639adc6466536fd5cbcd959119522092bc88d464ce997f7ae616395584422d2dd8363300c86ff7136110cc070a2c080e2581d1ca7e6d1494ac4733d9135ce0a42ad95288c8a1d49a8ab1cab0b35161b76aaf4b6c425b12c8e75b42d7befbd7f4beb4c757a5249fde497e52733360d6eec4f0730c75e51cab4f173a30c520308005096110e5a90bca08d8a548e34c690206d0b63d992cf8d4b62591cdb1aa0919399ad0c729da9cb1d8fa9a844eddde7c6806901d31968040d046124cfd31a63001480050b6688b87c6c0c29168705e2a040140086c240001808060201614020280800c2c3c1c19aae0123b67dfe030157e8175db09e76febe1cc103203d542f555acb36ac63b837027b59fb96f902df068ff0615ba425596211291fb688198548ae5ae1450c0e664e936563eaf6aa252c5e379082fff2a11531005ccd0d4e6856b5e8d0b1f81f26a88893f9d399d29e4ddb4635eda05312a4a6289fecfbe00f808eed5841b6e782a17ffed64872af32ab00cd82b0e51fd3208bc6e290aad429aaad1c15a73dc605ca2ee3bd48ebc285da3566c3f683d0c655d164a3dccb75d08de0de7516edb8bb52a07c70a6fb615485218734a6753d86477ace12411c81bcd59b459e48baaa7708a942de54ece14a1341b2d494b0a22c75b909bba791986d521e01323f525e01e859fc726d6ba9195947eb87c3a23f33e4e48c1f1997a3271d22b8102a6c621c152378d129b745ce285bf5090f3b089b19a51e329893bd2b6ffc8a742a2fa5007818b5a5aa802bb412033a090212bd01d80db6a954a6c6e2676c4a07bb58205e5d33a3130836c55b4e8823db67941fd7bf3e583cfeed7de49f2b2b02096edbed7bf146646a48907ea9307d80f418a958939d2dc1e0ebec775a3a171b257f816811a52b0deaa3a178b0be6ef335dab53c41cc5b6fea9ea2b8d24ff80d68e3008258d7560b9760e3be2e408f7f700811e335d304b090de9fc028e44878110469b9fc2c750f02645074dd7f5b5899af8f1cb22345ab2f205b3fe1af3a19f49d5ddeda723fa58679ae59ef47129e49d5981e9d939ead65f356b1d9805d2074956f5ab4b74a3a09c30b0e3506541b4bb4d884e7605f37cbd5ff0ee0586157012074552b29f8d9272df1ce9e6f46617536accdb43b285e88a33547e2421929a1665b8d4fa2a9969910ef0051035cc15cceabad4192586ea7957f3f3e6dbb2402632919713f3c7921e510c9b87f2657e8e3c2d8a6a32452ad2db6a36205273ae736a24be2d1a5523d4e6d08446105739a9f359c09e5dc95264dd90cabf320eec572fb7c51c14f0033e06aab9a75471b56019cc8cb0509bc3fcbb704e35ea74ebf936b02c12c7b925b1d678c4c05d98b8d374b418c4cf93c4e4eedd2bc5921a19a6711069486661cdf7c8fbd59b107cc0c42ef393c5f0398d6c478feb233cd02019906b595cd70945ac6e2d82a5975a2df8edeff5c468fa817e3fd2de14a91379db9afbd468526620abf865f5cee6158d28531c663bd82d006ba2038521b74029ae1d43ca91258abba45528db2006a33227dddfc28e5ac5a3969c2fe66955ce2863a92fecf3b4a680ec84527c0a73449349b6392814f5a1492161f764f731ebe2634db89610cd85d3a78b04d382072f42f1809fe9825505328b59758023099ac2bcef255a046d1073044afccb2362c6250d08ef2439c78f3acd0912d4991705a0af86c40536e920959daa6e74eaf1435ba0619778ee8a5db16e70c8d8f3cd43e8bf32f76f23153aa3e42962b0b0662fe8f7de0a1c421781e27ec2dcdb1ffe13fb4fe5f39d0ee785101181f388f85468c7d637d13deb4db908d80fbe661e457d959a624b70a9bceca7c4e6414e32950ed38a5e59f58f1c1222753a7792cdda3bcc01ddabcc79c08762a9b03c6985fd171346f1f0a5be71d310b30de5bd14f495705bbe5923c7045fcf410dbb1c6f632b85d48be3c82a3220a6eca09437d00bd4373feba2cf43289b14a1125aca2419959ce97b7a3988d81cff7b5d16823113a6d1416b0c3fcb0103249758fa19dcf3a328884b0b0577219b451a08db02e5f412c229b1925e04175971072a7e0e43928a04426085bfc771a7144731fda477fa340955949579d206f68c28fe89cd833b90da15605c8994643a4fcbc7ff7d375108d5a7c5d0ac96d91265546200624164a08913a38055fc4f876dbf0285a0f4a4d7fa8f3b6e68f5e7dafdc0d8ceacbd74b2cb1dba51e6eaeb2bb99770829de17bae29e91c5e4b9bd00525718616d80d63de3186c9dc8d09bcd1d75504d827d3e2df5e5f840ba5547b079b633e1d0ecd5f05d9d7aec738cfd567ce6d9a20a3f01c6ab2e412a44d360ad41f16c8cd42580319e0ffee46bbe56cec141d88eb2f01b1a8abf16b154d4880ce7e3ae302bc088300a95f13b98096bc2a993d5ea9cd80346364943422546318204231af64738941158054ebc8e96b9bdd02f3980bfb02d64728c86ee4193a3417305aa0a90d22b4d31358af8dd7a2ff850473c2bdd09748ceb6ec6c1e70db76b449bf9d5d327495f814007b756b0c1f99496b8b7ab751d024ee9ff871af05d5735e188c950f826e1724e173a155019315ef7df578da4e06db1d5e0892739a68fb6ae6ef11f47632d3a5218885a5b1eb045d464b6136c014da7f94329115e7630c4087268e8014aa5506f7eb6cc74cd817ed0049b3e58fdc9b9d89f997c61bc3a4df95bdbbe561d22f0b63c2fa5cd62e05e6cfde81c24228e4733009ee67afa1a60b79f7856e6047687c85ec9cae867f8f81dbba3c9fa897a87b9d9bca1ae62043144b2a84409284e8173e900b0853c3598b70162c334882eb935808e60610dfa55486b987a2dc7b918773c07cf487b84fc816d1613a732aacb27d544c633103b46484f85e34050709447840c21e6cd67506c9b5869c31d4ea7496e3c138046c7b4ea86ddd3b8323c6ce099d806a2725662dfc16f1bf3550650952a3d3c2cb5648b6fd9b009594415a501ef09b5f21efc842a5e44705c4f7cc1f099e20129240e681a0679ac30994b4fe6807c63b89207bc7cf479b1bb8ed8d82580612920570a455f54040d3bfc2b60619fd3455f9d58a6b5b8dd6e51d1f026400498e0783a08022f16b588fda26bcf459f06b512f93e4267d5042de3b2ffeaf175bdf4e20820a4084e8412886047050715401f20b2308931cd169e082b7672b7a5f5eb4e1de00a54a0ffb626a80a9ff8636f119330710c98b7cab179c5b6821d11ccb257ce59c433e8c5445842606cfd3a9aea1601ea192efd61e8cfe07413d0960fc79a732b3761b6764e9f277b81262d8c0d43bba3bdbcf47ca7d4d6788f3a5427c2ea064827dcb6b47aef1cac7f870ea9c421e01dd1368e777e7a98f90a068799f0eb7071de8fa1832aaf8d2b748745f9c86843fa209dd6db580804db250a3e7c9b51b29f7ecb2bf2311f05656b47d622f5cfba6ad2b3e9d2454aa7e37c9e851eedd493b0ba92754a381b21ad12eee0dc6d4b155c1f8f9fb6f19c307aa482cec2a53e1ed5e04aa6756f26588684b50beebaaebd97425c6e2ed6d3b84a0b5586242bb003810415d251c10215dce16d007383181375f9546069813aad249b278c307b4fe5ab365769a86e972e1e7c7aedc76a493032be0bbe7fe51d6b545d031c6a94fb6a96e0c677d0e64588b47e298e26bc394d9e134725585d1e55f3972d46b8bd142ace0484a6852041a9232714c65eaface05b3325153a1ad108cae512dbef4c951475d1b4e172f8ffcc59c6d702efe4c1501a7d51434fdb8f928cf5505f3f581d9dd1bad17b6ce532a821a2124e125c3342a62b709d1a7b2bd5899adaece01677180eb2516c87a60483a68e9141ec824058642069c949ec6433e29d16a1f9dc63322ba7ec8c3c2415e4e94ca66e975b088df76d8a21279c0d875ec19310458400cde80cc7fb4e3cb90a429cf79ecd32679e9abd5a92cfc3b1616d2f9591d6293e368c700e9bd376785a9ae1e6c467cc0f2e3dea9c7693c29b9489ae8d1a446672069c7af7462eb90d96604789adc319635d53d33f41762ccd095d855acc129f94332e127c9b80578a2bb70c04851f811994b850a10211c41141421145db6efb53239a7a23671318744e0143d11648305c8fa45c03d3e4ec32bb771d9d936ea5dd42afcc8a6eeb574e040646002d0255f83031e0003fa5dbc3465064806ca0ba4288d5be2e2159632c5bfb2731679e4254e9265ad0820bed08d6d381a1505a66f78aa75caf5c882f26f6b1dd3c36e1a25c7141f8a5cbbfcfab32bd1c5d086d06b9be1d693cf56fb80af3febcc283ff09f26845c2983286349020f40240337cafb329ce164920cd8bd88ea3fdb17763794485e7542733a52af55beef81858d63c7514facd1c5936639a092268454a5bc2952594cac49a5df9cf31c7ba8588bca1dde222a101d815344c26b59675b55752c26aad569f9763d52d791447d5df5bacce9b995fb008c0d3a010dc785417b3ce0c042d94bf224b1e964cddb91b14d51864c0047b143c564fe2f5a119af9da18e41d9b1db5fdd69ecaa648bb39e60e2b16126090df633bc99509be28bb5c9833e5ada8cee707ccb6eb1935b8e2a6140c4b4ac76d29076dbed3365cc8b2eb74a20ee5720006b04885a910650a2e6371587572d686c8b509ae5ce97e26a8a4c3797292a4c3127d37a2ac2889f4257f5d54da0a3a5c7affed9a4a78c2cc67bcaeed300348ca5ce9411c7b5a83f30d7b4779d4e70a7d454b3578ba3989bfe9003de0bde3c272f379208990b3d1610702c6fe126dd39fcc282648d384b3b6ba2fea61a4409f1fc20d572b37b96baa8b4a81a8443149f94db8071c8a2d8adb482d2acc27042989d5081264b8cb40ab0457c53bc8ece54f12aa0d5a5eeea2fba6cde0844fa08ac371100c361b27916ace83c699bbc24a86d74466b141252bf22d3091f745701d12b3375cd779e8a017d61db8bf6b72c2c824cf2f37b9a86099ed4d6ecc8d60bce594ef9f7b572eb7af6b46cfea143097af1a419defe382e75a07d2338af80bda215112e763a3fac5a7a6a511624c0e196e67ab8f87078215bd929d32c2840d59acc32dc589d06980095fa944439cd9fd8bb74890a2f11fb215b105c6dada74a0b90b96b2e4cccabd63e596df19af33ef68a54e0e9dda1b31a4f377c8c02eb0cb56f0bd2d7584ecca117605cbae94b268af5de8143c8a59c2194856548f4df34ee2db914afed6b1dc4bb6ce8d031a22ec1b4a1d4a6e159a631de1575db3f1825bc3c977b70a3ea76497b451e71022824ff0f7ee80e05751a255455f0b1adc4375e526b8c8f2b20e79b8e0d43dae60b9e215d463fed4f4d8c957fcac8e46729d5857447da071a171d70ff1c33286b1e315daf43dbb6ce51403c44e8f92d2ffa4dc2cb1dda536a53047cffef7124213e5f92e1f3e99a6f7354f42070dbf8735ad904094e79da65a5afb1eee23b3c693e7c170f86b814d5d452b97f003d8e69978e4eaeb1842adff62c817aeeeb5bb17ca1e6629f3822a2939760a455687543f07acb403c335f41f4914c8628daff6da43dd7bfefc7acd12f7b5fae062178744c52258b9841d90520d5811f4e9a2bed95278ba63e82220162f04406dbbdbcc5837171a892d86fa51757380ae880082e78ade93551ad4fddfc3cd5106da013a78e55a0c3707a721b4090d68fe3fcc5123d7043dd1b38a6fe7692725af45eae564188826b60424230d3521bd9d96210d1890c337f500e7eb25759e180383ed2a2f55b7eab5b8c1bd307b5a33dd983f246b79623778388674b2cb53562dc1453b0a29d17fe90bf46971164c8af6bf3ff12f5bab6867f2297a6a93a317d1ab5666dfa612ad6464021932d0f054946b587429a55e6421042c4a9de63ab824bc55bd6f7508980204b945f05b3b652f66e7fd053bde4197a814964e0603c2253de620d6718d44a45ed1275957e0c5d0c46b8fdac2ebfe88c97264af97bcfd1e375ede3a6210c4cd1d0c84b04d4070549c89c36aa77cb91cc5590a1eb5ffb416625a002dbb9e5776ee5b150042e1dfaeeb67b81e6fcd13a984ab8eb31861c6987484d3a13372f8b3ab45bf90f4bd8a45e0a1a4461877b94a02a526106173bb9d064119d37b82e04682fa522a64bd5b9c32942a6ab807c41a56e4f60d3da35518cc5791ae19602570c886ec4c2f5950bdadc57aaa1c0c871b238100fba0733e6adf2492ccb5b1a811224ab2dff997b27561b64c8f643edbe54985cfb50d849750ad512df58ea00588ae3a1c2e2cf81984ba8d4c82f5bb302c3394df27a87299f43760ca52518bf63b0a001c44c062dc78bb52d46a41dc2154ace61da57215c15fe20b4a54aa88de434f27a402920b0c6ba202d09410a60419ae35351b932fd40221eeb372302da0b6a1652e5afc0d1126eba43df39884ff81260d2c6aabadcef7777704b9108acd626894001d039bcdc08def0bd271300e6fabd395ab67f79467247505490069325bef69fd049dd3bb5607575b6f403dc4c90fbb0718f320f0915e80f75db45a349b3a58d729f04442808f28cdce520cdf0e3935d9f3140d98c7c9d9f64438739afab17052e12148b974734b54e494fecb2a842e7a3a8dc7f749b99dc039199ba92c032a9a52c9ff09f5d3b3a50c3611457a982b8d37704c49a226853f6f6ecc85a8c6f3380769d80cc9ae39b473dd910fccf021849658dd88add9b70e7c2134e00dce5b3faa088109c5254b906b66cd7e8e54360cae6a9a670fc9bf20fd226f16e041b79a74ecc1b42fd7a46f2d9d5dd4cd1e2d912a8c67c29da3419563ecb33bbe6a82d68e12e5a1c368816260fb91c3c69ab2145950e9dbb61ff7edf3c419e1f5cf469a479611dcd67646b59cef52155c3fac91c55ded4cae1be0e9d606c409f705def241d98e4d0c74511822cb47c8209f2112830f07db3ddf4759410a0057a28a6c228477367fba9642044c317d433f5129411dea5b7bb5d212d1688e9a345865b36d5b7a4c835589855dd3e27963cbeb21f7d4b8b9ff78b886a27ffa33dcb04361e5a6822c45fb337bc4089f95991d2f6edff5954cddbb6d0f489ad9e7f6cff16d99f7d3080ae8fb41dd1fb56ebaa403a2085f7ae6079f4a95b922c36c16643fa2fa9ae0383d419d6645b7f9874e0bcb46b551661a461379a9ab82c92a101085cfaadff8cbc78e40d855da2707dbe4fde4a318efbee93db666bcc7ea715dedc3c85cd3812cca6918f0d9983dac062fc37077904f0d02a6a47b0f561b6a9a9cb1344bca608d6d47b90aac5f63c69d69ed384c1ca68e1d6ed3701bec48d35dda1417b6bee97a6cc7f6447bbe07eb1f22946a2109cab8f4923d54b196170796a1fbef564ba192ed42e74831d6a50c5b8950b4118e4318d8ed225ca923a0836b4be8024f98a821b663528233d02b11ee93baafa9521b63b3657daca84050c6a19f15816923a344e20127269e4a0deed5117f0c97bc46914d1e3d394719e36f301669f43eb77f69cb3c110cc086b151419a38c287170a7cf8905f434cc255a1f918be5df899ff7d50a8d9a1e84c09643a598b771f9bcabdf8d56952b909799e2fa20189755ebdd552c38f03028324a317662d2859e2734b00d604c2d218f83015d326fbe3217b105e612d9d48cc913d804d8749f5da40078cee4948f5eaa84aff9e0c126058166eb42f8f39e9cc7451cd621bfa96700ebb331843440ad7f5d4d651b9b9c89717d03ad9c59cab237e22a9b9ffb7f453fd7ca13c8e3306b303f54fca94917b23501945c4015040e12ec5b0520388aa689865b5e655474fb3f0e34d04046540ea2be48a8750f225c3d5c4e123abf4845d01fbe52efdd17347dfb0d49445063a896b8befd1121d11ae719c5e50edeb49baa59c2c6018fec4d6c0186ce9991466e411b7ab288a278317dd734986882aba3bb50f2fb5ed67b56a7a2925d51a1a019b91e1fa29737a682d76a43e222dabdcd41ccc056489d80e189969b055935adf8b03c1fdcc37fc8ac607849ef09b71f8dc8229875059b357e49178fa1516d28bfd0dd915f2e888722fe6863710511b5d3e670785e7808a3e6e0b275cb20b370e6482750042184d42db243c5456285300d67632ca5c4170877f07546a40b1ff313b3ebf9e8658dab987f21abc0f398e0ff3c876eaf1fd2a535cc8a4570fcd00bc6c1548e30400794d1e4137dc51b3969c9bdbe5f2019b0b4db80f18a6b2124684c257e3baf898b63596e52a26f286c4adf00bddd47caf4c60ff347c61f990f929b5bf580f1947d61452df19b9d329c870e2f984d35a26a097ddd805f7a82f97cd0fe0946225f180f7153a42c5f3e1fccae6213ab8bfbf9d03d4572c5cea5c88c236b9a95c3e12d64567946a681579aa001dfdac7fe3cdf9b3cd4b8d05cdff1a062ec6afb1d9aa2bb7d31078b8a90f4dad92c7f85717ad7ac4c361d68a5813ec6ac5d7123725ead0e46c2aa1abe29701569894058488bdfbffbd74a5426004bf0698ac921213400b3c9965f3bf6f17b491f5bd48d66db972c9ab05cd896a7a85c9060f32f15c7210f251ae7fa07d60a86def5e30a904e9ed64f40db4bf4832bc89aee837a29443363d37739f4b8e8a80b15072b057cfc5cb855f960e3e73b26673357b7f009e9a5ea3f251710d8f91b9bab13c6b28754f33a4e546fdca7478eb33eb619d836395bcb481fbae33da42a6b241effa37a61561b5f801e59dfdf8c178fc08672eca75d8b17f6194e45a8dbfd8197a97818ec9bd021fffc1d84e987e736e7ab14a2d9ab23a1f1f4365e1a2d8676ad079024047da0e2f40bee00c7a55e362c23d5f3e445ddc411cd3455638ace66b34ee565f3fc7bde2386c60f6a07c25ae7b9059fd7df0c6bdb44fd021f3d7712bc355dad8d342a147b60702e458250575898022c3d4a9a7309a94f2535873f1cbaba04b69080c644b7784909abe07f8031ddb2aeb0879c29a25e534b01c038d820f0d769f8562547eae887a9fcb4ff9f323aadf428245a7c5d27292a0f9b613979b8b739ad0730a5e48b13804eaaad0f83440b836c0c95852b377ea3126ea9ddc96fb959bea3ef85bcb3b044c23c146bf6100fac96493884cfa40572889d28a35ae91a4a777431290f038a14a58f9cb8a4f6fb8506b74067f649339be0080c497677cda17603cbb1e22336e04ea9173eb8dfd346246e57948265e0c7338213c588c63c54ab7bb200cd0b4d71ef73676b3474b803c9811300325fed6dbc7961956516bcdec8b4d611e9b35000f9458a9c37aef57b6d5420b12dec06a892c5e06fa1600392fa8332b328c73e0d9e7c5bfa0f481fc81e1c1d8cc7458608f3163242dc20d2b7917a84742556e859677901785333971a02608c69773b5aa2f4bdb19a5b3f23cc67c56162b5f6ba4cacf137fa91617b5524fb7edfd8a1eecff652989dee9dcc458d4d80201ad570f10d87d6c8e9dabf9c83b3eceda9bac7fec88a8968a956efcb477e65819d3ed84b427fe47a7042eb6e1c4c6dbca33ad28d7184a67268cede08bf670546c50008840c228404ff87c9e245cca242f2b7fc6de76b61368842c6a29061086de61b081226e1da959f597d09e538767d4d119597cfe264d92274ddb927d22b52e6362c5f4fcb7ac04b627526e6dc04f692304c723f3fbf1d2a75c2bf479bbdce1e6a415a306037c0fab30fbe48308e8d55279dbde830066b89c6287488a58caa40041fbeda5e263c1ceb33c4f0c134d100009d741fd2b574708bb0bd2e2289efd7e1367dc53bd1141da2bd53cbbfa5371e3c6b1d24b55841a069a6ca0401a80ac5a8b36a9d2cd782100d028fda84b1d947d76759448a38cc49289208820a7154909420ad2c958bb95ba6c264f6f7a3815e7e13ed22467215976b21cc3dd3a88a5aaf77842606831044d837303713a1468afea1cfd41135b6544b89aedb76c982c1747451592950b84850ba89c24c97511d458b9aaa84035c5b368ec5937f85e7db8606c9cf24e1011d18db16ea02df404b98067701f5453096efbce456addec3e2f9be5d1560ce9ffd925bd326b8a44466f08da6410d957233ec05d7ba19e2c539ff9b3b2347fcd70c915022bb5a2a9e2e7fce484ffe303df4d33c3201ed4b5221d7f22f66d2d8363b1be160d36f8f8cc27a22e829fc4ca84546f41b5ce222fea657d18f9b4fc5d4c808977e1db088fa855a373a2a7375cc7b06242abf0683a588a62d7880da4305cecd7485fa96cad911dc7c158aaa268e774ebc269b444f1d8e6ea1041639e19d4a293cba812d942d8cb6559324f40cbba0aad688495cb315b748b7178c8e2f77ee460921d8d7df395bf19f6239f1f1e1daa5f96eb960d35fe1e8e1852fd969f834e7601269f2298e332e34a9f8aad38d18cf271c8a1995e42702fa90321f34250392125d922c9900a4380d86cf9c3c99d76ca714d009f94be04bf7b9916cbba7da2af082e5145c59c6cdcb25df112f1006859a28e5b7a814dad04dcf20124df66a17e2745161f3a8afc4b56232868566cadd41d6756640c0b7ad50a6c6a7a8359f886f5464a802a2e58bdfcf680f941a78ed015d50347a58cddbce3430db18d487d71aa44147e717ea2d0b2398be2bb0ea9572ac35f26a62a6db7c0f9815ba0f619809786d3ac5656e54661a922bdb9a65c85dd35c27b6b2d54d5d24e6a144d6120e4eb0bbdfe824749d4db2085685a98672794afd00bc0adeac77f5e54e83c4edcadab2057d4d02cbc728dda48a6c040c03aa52f27c5e304c429b0e75cc69f62d8e45c71acad7aa95b8b01647ed73b11d03e27bb0fdc806ae6eb50e66bb174fc83ec375aae09ac389c15d15a6dba50a287d6a33e8ab71d165652a844ae7a276c6d54a5a98603918361112d2f6eeb6f7967b4b2965a80866075707e8fd4b45cda9b5f452516cf554f8ece9d893d9630fd3eec7ec516a8f539876ff4d0cce5ef25229f69c0aac9cea2cab9289281d0555c798b3e5d44cd29dd1c5f6187569f70160f6807cec9547945325552925325d5b59e5d2ee47457df9424575adac7a0a4a8dbd14941a7ba089414cff749ca52b5fb3c6dc2b36e64ad4ec111f35797c319de4a5d245efdbf041df4fcba97e9f44cd0c6ed847f0593bd72d2c27561b3ba3b33ac86e3fbd3d9dd151e23deec8fb1b408977d833d9cb5a775a68570b4653e3a600f8da57cdc60d1c38395ab474af5b810df4e8e08729bb8220465c9aaa4457da95323b017b7974c05a44fcb18812793278b2c85c9c81e7961c98b5288a680d672e621abeb7b30af1a907b6815b639a2da9e08d70c51b414a087c00a96802053df4e953cbb4a6c014d555d1112446ac8053ae4cc11282a275af3c13846a08913a7a512c5d942841855d5492ffa61924d43051a3241fd929675de20a07254808810f534c5805165e4c52b2008860e1862d54a28c92c214ae0c8144ee63a1441815c2dcc002ce036194f18a1124cc338104de1113ddd52bef288a88ef16daeffb6870320380161b5a9081447fbdf26c98d245b34eb0410992effbbeaf26ca0612986857af3c2c51748be5044a645f0c30ba34a206075d0a118306ad7be561c101001ad033bdf2b050e161b044e140603132830a5d52c1a4c95e794d554eb49944c96beaf50ff77ddff77d9f130deb95d7d483928ef5ca6b9a818340b3e895d7144506145aec95d7e424469296590100259e88a1c297222dd32baf0621aad031bdf26ac052b3026df6caaba18a58793540097be5d5c0a493bdf26a98d253bd85acd886efff541f38b065c94d84cf8a0f229712f076b71f11850f9c7085bb896077d8220586db7773cc6eb5b17f7d70a184dd6d27ca0f4a3bdc8dfcf0fd70ebbb4354383cddeeae3f15891856b0819b08a0104d6edfcd619fcc25de3320f8c7c2e0e584266e2294533ce084133711c22e23b8e1fff88fbd92c584146e228c59a6b8611ed66c91fc0004d1edee7a13e1b3f70938261947f2c811163a5ce12b846a6ea8f735521efd9a7f3d75f4b972513b38f181126e5812850dd3830a72a81f4802aa883eb54c6bf0035f98e8084a42821b5830526197a5e866e1f28309352e764525a8a1088a0b2bb032c5030aec0f255745a032dec12a013b84192a3a424a4a80962a4c089001257053a448222a49d5f5818b152c7c4b63ce391f6008378eb9c81a15e584647031328e29a03261ec3962829c0b47b25c212244c1291ce2861d8e8461182240cc45aef2c1308761188621171250f53094a24f2dd3550b5d2837893eb54c6b1f907cf1a14a49099ea40873619ae05e542f3c22e2ee70a48d7a5a06856b8413f4a9655a0f6d398242edf2d0f483879d1e4159d4ca48601056248d01e852d5e50a0a0745b4043f555c91ffb42c29893eb54cebf0c8375595735824cc60ce39e71114b1cbf50046c7c52aa1a50929b52948a12cb90aa35a05ea900443e9a093d49c735e0242133740e9724505a3295d82d89910e5ad972a2f571a6452da2c554b729420880d78d149d1035193add51c28e69c73ce4e94be255fcb4b39013c5cce4c3e294646a01008a20085131390e04b114f849820828b131804b94bab3aa5a5f107089ad022af6546a614893265842dbc231184277c450cd9293a054c51121fa06589172857985c8142a4444913ae18a07421024b0c530c7184adc20823a48802c2b00443130ca93e73cef908cc55c011a2d89247bfe69ff7b4e42b626af00129a11f505075a44f2dd33a1bb9539e8c581166ca4b0c2830e1e504a824a8f8410a20c0ec9aa8013432a51466a9080f74a08528b7103cd2c30f8826968c3c98c110044190f7746915aa2735a501af4acc5270028ea8ca3967a21b4255a438e2f4c211302f98a0030ae0104c8c72ce79898823c188893eb54c6b13904c4423962ead36ed9ea07a083042ea0806710ced135c2eadf2a2be50f978c24a044ba2228f7ecd7f5854f464f7200e87c329b176bd725181b7eb2d7ca8a105a4274f68f14078346a39c191f02843e5bc245f2c4f47285c21bc5ca5608950180ab193ea61d8a4fe48a19773ce4660d052121eaec4a0a4072b8cc2275060b4d41f4c4b62118be585a9498739e79c73d11272031d9e84c20ce69c73064208a89e33134cb45b828baa09762418c5b55b943af03109433049965a12da720401c0904001a584ab198a40828313bb2ab425e584852f3320e154e4c230841243401175c513609c4041820a3810a1e4059513400181c40121154640aa4c4a44e2186630e79c3317a52f3d67218488b09a4ad214285494aca043e8444b110a422071f4744493a38a2b5d8c5e58c2cb124d8ab4b01d3841154b1811049215ee095b76d040cd92cba2cba29465e9ca9784cb790987c6a3ef87144d2e8ce10ab94bab3aa5a5a60d56d8bdc0125f7cc22a8af219c18992441522a529519ad0402554859baa98e853cbb40ec396922872ceb94b0abc9e73ce391b11f1ed723bdd4e69b7b46bdaed764f3b289149c7a4c4b4c4d4c4b433411445511473188661180aa124e79c99a8c2b42a5a292165895e124518854dae585da84858024219e953cbb44e2105a0388657ca974bab545607901266e800baa2b056032211455114c52f1f7d0d3402d3f0846955cc61872d552ae878325c24687002a4c18aa82a3df9a1c991100a8f7ecdff14649873ce39a7708b1441c20a91426e8af5e8d7fc4b11eaf2f7c90a74e9296a783c21ac202249120b55809092c210294be45e68b25465370226242431cca10e56e00f1dc2e8302c0206214315f0280cc724df062a10e59cf357f5352193208a1efd9a0f432358ea4ba2bab46a951446b73074b650f468ce47562a6726610673ce39ffd084aee78c7b64127d6a99d639491442946650628ad50ab02c718b90c2491351b21461ae86ae8aae8e72ceb9487ee185175e7857979d14c8448b69348e3927197fb85ad2a546d15d5a555a027f44697aa3a25c94024dc30b5128d0203484069ee044e02505768319a672d1388ee36803d3a555272d5c7808b0212ad73e231f06d896635e03c97c2ce6f5fbc4bce6e929f34056629ff5c7de477f0cf64056ec03c5def5292ae3f961db1ac96c8b8bd915d35cef137b1707b2721fc8f5b09771203dfbe172c5fef5a9c5bddeec99fd707dec7d5c1fe397fbe897f10f300d7fd0edb5679787e013fbd76f506f1df09f18af981674fb7ad31fe3f7ebcdf56995f28169987573bdc697f7fbfdde5d314f85d4c85cdaf2ed8ee9a079809a44ad36a0ad34f04180ef13884df3b6cc169f19a0f5f679b4788df5d624ff92bc5e34b54e1d3fabd56b087689c92ed51d0cd531c6ac2df69b831eb955b2ba8ba236688bc5f255555e9aa523514994e000ae66df42daa9dfb74e1c84f7cf2957ee4b60e700d3eec7afdd0d1921f19638fd40e29d017edb630df0f7b8e8c338a2abbde1904aabc5b50edff6304293a74b7b709ff5f6b29ef5a9902349fd96575f14973fbb0ffba09b6bcf2eff7b61b10fba91ac6d9af835c0ef83c8cd19c2ef83753ac6613ac66fdaa88e7f87be287e175590b91457d0260fdb673f5aef7a9fd6bbf88f15fb31eea3f58801cb65a3b3eedb2fb707f7b1b94b93cf7ad46e3e8fda4d9e7b6021f72f607bf9e363d65f168bf35c725369bdecda5a3f6a706962c77ff6b828fe16b4c8458e7640db6731258118c4207e107fc7b15e794656442655667ae53129220394198e9ec4c0032e4a8b114878496890e18ac5414a0ae7d35a5b8d2d683f6bad0e189dc3846b351aea2be854ec52603e3c2ed127e61ab522811e888e3e1a1863fc551445f0bec839483f11639c7ee9778b82d169ddf1e05c70735231fd78294eaf3c2556f4f43cd2f73f285ff96d03e02f8421bacfaacd7d16f50677f0490c02be224ccfb89ef9056ecf9c4545ef83ff91165f8b5bf8ac3677960188f9dde806f43d824784e315b9eaa4eb7e8d3dcfadd6a6dfd19a8e7ed78be6577c5956b42efbb230fee2e9595de2d774d221b97f8fefb6a0ae96a7620f51b456bb798300e30e01677636daa0bfd65d2dfb10bbe1912253245802adac13680b1757496bafd9835229bf4f83b24cd61c963da2288ee3c862b148d2666b6d69f2f83a589a668ff964abf5b5cc1efda4cb65f6b49ed425cb149f7ce1afc2c01c8a230b465ab3e5d22f16ad6d3b2992db76d2dcb693db76122c6b277589baa0ed932f13043207a92bfa905a79dd2565a4a32f1aba6018d0aa57312b611bcd57f26b7dac846d77aa09db587c7dbcc3b6d8d7c7396c3bbfcefca5a2a2b73e6e52732eee525d1bc661a3dbbb39e2d7d6d7bf52f7cb9dba39e5d7212b60cccb4028ecfa5ab6769589719525092b611ddc5466a6ae024ac16a4f2c1ca65d8dbd518a64512b8b328f76b43d9725de178604cb8d34a5edb5e38d5930a4decd81256100a3df20620adb7459d56f79d565bb0682ae12efaf6b311cc77bf106fbb94ba81ea6d1fc93d1458f722552b925e9621dceb9aa10e91829502a144996c874efc5b747727149d7ed8b238cecad2da39255595d85311261bb1ca6352de9922e0d56458c895b2625fb22a39255c98e700eb6045382e560b9b257d954ec1cc916256bdb6ebbcb76bc4d91a9967199089402a7aa4ea96a536589a90909a7a87e519aab2aa92f542d9c5d0cc191647dbce42db3a7fc96c9e3ebe393680b248ccc4b5679a90595d893f763cc9ef03fdb6725deae7ef674494ae09fdfd87bf142ebdec3caf945131afcbc85b076bcc4fbd5c91287d1294bb4a7636f1cc5a9b137f6442951e9a25596989af0908844159d2eed3e28055e8155a014283543de377bc6fffcbb445bd02928c5e31c2ac170469759a2e6d7caaae42c5e2a89433d059940a56a032e8155c017c00dccacd0efcf68762e4689778c058d380a5574c45d3ce672333a2291a949741277b4d29a3c64bac8c5a51cb6895a3efd53fcf898cb44e055c681b30d4a8d53a31411b6815457acc2b6b10ad37037670c4115aa39635445ef8356fd128d3db14a6fdb4d19adda6966e6b05c00ca00983de0c380d2346a94e22e754955caa58b5ea6b36bc1465f3535f6a0b0ed4b4c0f6df8907fec8146ddb27277c538c8bbb6b34689f7ac933725de349db5a9c41edc546868b808750940f4b75a89378b0e6e2ab1ffb868a3c47ba69361987b6048e3f839ff0b2b9d5f485e82e960b98bc258baba3963063f8f3825deb24eb6ca96d9037e71953848d0cf734d9387d8473ee218d2292c97c3b6d7eb4ac469a213664475a9d26b35d432319011d2292c97334f459a0d3661d21683c5c808a0449334da42e6333af0c75edd295958cde8c6de8c6eeccde8664c0c627ae62caa40a99b13c6f2a88b52fab244d564b57bfa32428954333a906acc615b59a5641a75a5d3982bb58c4b259731c7dbf51bf5547e19a1c62fbab177519a52490cc7a899d913f2b1178a2758b2461247d9aa1d4dd22dcccc5d10c3b17773c6a8b2ac726d333a4cbb333a26fdf1b4743a314f4b2d2597a792d7ef0c542fa3667ae597f18b0edb64322b2559183dd45434a33b9a798a4182ea3149bd7e6149b05c6cc3905e642e9b62228fe44c8f6d18120cb367e4b05c6995c14c720d8e214b00e0a632fb6ff620efcef68c0ed3eed36c510ad37417bd3b2b1d500a943a99aae87afa9dc506ab3678eeb2b74b294cbba01478a74aa86a735fdc65ae442a7565d20def537b1bfcc74acdffccf85a0df7a9bd8db7c17fd0af05ddd488b16bbc8c5dfb19fbe6d16de369d8d8d8d07819fc077d1aff33e36d3e48c607c5781fdac778fc312c7819fc47c65bf03f319ef64137f2c6d8385ec6bef13336cea33bc7e7a87dd00da7c6fbdc7c8db75fc3c6d7f80ffa36fe67c6df7cd0edc69ed9bff141371cbbc6d7dea7c6d7de7eadf637f88f8caffd4f8caff141366a346e6ad894e0e7a24ebb8b36551bdcbb50a590b61ed040c78f9dfe718bc77f753a2c92b54fd806e3f1dbaad9631aa317e925ba395d12cd09f4edb277f11f147e548bcee0a3e09fa815f014c55e5dec1afb980d7bac9b59abab36989c79f5d4eace3d63bdec4fd99f3f637120b23f67405c3ccdbb789ab77bc66719b0debe9de9ec30a53afe6bf6b0380f0daa839e790c7bec22bd531db3be83993d63f1107c661ef67826ad53339fd65e0fd9bbb0dc62a9347097ba639baacd0cf5d6506d338fff2e591db78abd9101ffcda1da608fd319fc2e64269599a7d9f6c99e5464fe9a0cd03317eaf5e3c615cdff3bacb4fc16c9f5160adb621e37613bdaa65bc5eab048d6c56b9e8a1dc676555afe173bbf6daa3b30aa4dfe1d176fdd2a1db7e0f6e9ea6ed2c5611a7e9a7d8d4e19fe996d77d6a90ad3f0d3550feb2d11b6d91ea661ab033fc6b65ba21bc9e2b6a9daa49768cc418bdce288d87b5d41aeeb8a81ac7f77f0e87c29a475e4f4fb177f07d8160001541d38f6e6d2a8f1356cb3e0519dcdd3f28fe53d923141a7d7a8d75288cec5f10ffbaa5d302ecec5bf987d8baf95e66b8da931fe0078dd2a1c7b467e8eafb71b371ee781e0f81c381e07c703c5f81b5f6f8ff3f546d6f0d98f1c8ff340723c0ece03cdf81c1c08cee7f81c1c087d1c5e6f249fa5b60aa8b39ef3aadf5c48b5b9ffbb831b1beda94ebf2f787ad3edbbe0e94d0b3ee329fa7ff2199e9e97a75a7cb54627b4c9ed12b74a340de8d42ab1442330426a3d6fdb6b366cd8a8d56a36bede2cd8334cdb33cc673f68340b2cb0e081623cedebade6a761636343037d1ae8d378a0196ff3f55663cfece3f87abbd9377fe381d4781c1c48c6d7f81b1cc88a8f8caff14031fee6ebedc4b13a04506fee9fdd9e3a7076f00460778069f769ec1eb5fdc1cdb6b16dec7aabed7abbd9f55663d79bcdae371abbdec25d7b0ec0aeb7aa63c1b6b40dead419788b5dc68e21c22b0800b7f5547535b84717b546d5e6fe1d22ba57483fa93bb58b4875078ca1eee4266c73d90f32c4dedc1eecefad7600447f2b3fb51de8f7ad0c9600e52b69d7aeb772d75bae37b0deee5984d6f715fbf2d5c1cd9919207f06690e527dc8cd0f72139c8d33d7c366230752befef2b5cc684475b8b8968b6ced19f83ae69e813c041ff35bbf41bdd5f80f6a7ebdb94c5e6fa559be7949a83b2ae842f51aa93749bd52ea8ed531e432a936f39ed0efc76cd9d6db5ed99e9dc2b4ebdab6c9c6506d8eac4ea9a7e443ac0edba4dedc7f526dea2def9b19e4266e31ccdc1a8d39e88fe35b9f5841ac4bbac043158eb7a4043658108760ad07aa0d7e8ba53ae0daacd3a5e1eff582f00f4cd0a96d02a9901f601bc975300dbf28e2aa29bd2075c71c1f57282020f1c90762fdf8df97f0a517a057de901612887cf181c667fdf740c6673dcf159f7c20567cc81f1f08eb47fe63afb080a162e946f213d3ea54145ca66ef566c57ebdb1760f4cc33fee7ac32fa46ae976f36c9d2ddaf2ecb8b62197865bc8529db456d1e0e7e9816df586a142283af31abad3f6bf7d81850aa178886228f7ca73b24216fbe5dbfd755753eda297c645edfe3a0981a1fafa77fa7d0eea8e8d61dbebef799fe81705fde65d83d0f5a260906ad34f23b40cf6321ff37a1f18aff825c3455e65a6943bd5e925dad3ef56b663bb561a6c9bbcda6d6fe5a3b55afad8442d7ad19a94ae0fdbaf1d04db5af8d617a2d3534da6a5e62991aedf6ea56eade5c15abb4008bbe6d5f53abdf5f6c9d6aeb9488176bde981f9f53d30bffc6a1ec02c3795d79b4fe3da5eff123b8a6de2edd620e3174df23f7b9f9e9a44f24465f45484166cf18731c6d8eef8762861610b92c5574488541bfc248b256d7b5aaf582c692275c724bffc8b638adb47b0f3b070fe92dce207d506638c2b385ae98f3b690ba588ce620bdacf5a8b7b68c0d3710244c72928f172ba28be4dd506bfbebca65e5217c5423abd4d521d8b4d34a4a8a423afcbf5fa35ff7105ddcfe0c73e08e40f82dce7f531fef3fa1f6c73dd6bdaa56aa3ab3aabe312756cedddf9490c83c91e16f3aed8e7980cff81f1ea8ad9b52ddb159bb31f2e57ec5d7fb98fec5ffce7f5b2b7a64665fc473fac1623bff2ee5477d8cbce1fd9bbb8365f9fffeaf789bde63f56eeffc43e267bd8a95f86af0567b6e82cb8a9eec0e8f8efaeee90f8d45760083af6d2f1162710a050fba9e3b1da6e13a6612bf6cd17eb4ef9e6931edc27dffcb4d64d21b5eec2096d3bf9217c3db54b576775884afd7ea92b42db47d2d4ef97d876ef7deded2aadd34567f7f5bb3ef64064af63fa65f9635f6f7cf6e3f5b107f2fa188f3d50c5b4170712fbd7bf38500cb7bbdbe5e990aff7d88a97ba85b2d6325df472eb7451fce593227ec15e2f58352bb6c5defc0fbdf29ae0765f094bf6828b5e1a3d6cf6a0c7cdc95cb45914ebe6b9b6823c17f4b8165b6bed051a581c9c9b53cf4fb45f6bec0c38b22e5738200e8e1645dd8f70a80106298eaa929ee0a2848ad0ee68892eb5988a5d0acc919eb924052eb82b46704c4c80a4e5c91095bad33285520dbfdd557c31063f90c76405b523c0d205fde12bae002b3a6220cce0fb4410f7308310c41f2276b0dae0cf690640b327dc17b85d1c470e02ee22ffaa4d0962f0f5efab82ac35325d742a769006596bbef2b292e87447261f3fd9e212e0e703f2f19f3438a8d0a98feec1fd7acff3ac3662aff54be212ca2fc1fc5b0a21798b4b133b9939c8f5454ff16226ea8bb21a9d1d3c3a3a5d87b41b48ffeb5d9b03b99ea9b33ead40d05fb3c7c75009ae877d09fa5f5fb1edf5401c48ff8b575ecd04b0de7c7dd5ffe2305e6f24abd56ae9ece0e960c805355e4f8aaa5573c1b581622f7bbd815eaf61ef7a06bc5e3fcf956d20188f6d2b3e2faeff2ca25dfcf59acf2ef781e977fd4cbbbe07cdf1b5cb345b66abd5d2d131cdcd22f96cfcda59a77e5c794510f4e0c42e49133a0c718513e9c261922e894e6b2f888ea33a37a7e68c2f23737144a7fa7be633038850a4830f8aa2d6e7f9d70e7145955e87b802a9cfe875082b52d0bf55b250b462119f389ceae3ae5d6603c5bccccb3690159f18aed3d59d1b1dcb3e0b9618fa26653b88687532bbde64322f93619b0caf986683609ace3e480671bd05ab1d31b03f3eb641f47992a0d5b1be57f2f47bc53bea0ef9f807506d768a0ec9ad0ea541eb6e4e6a898e6c07d876cac4fca7f50a9f7b665773837a1b92bdccb3769591d1b939b67f3d842f9ceaac6d7b100eb04df6f88d90c04079e20628aa6ef8abcc3340c66538036278c5b4cb239ceab21f3715d9d3b836d9e347fbc55f1b2fb72c6891ffa91be2841a01140d29290ec6cbfa2b0ea4a4cab45e29bd5073742e4ac4eaa855389041d144b04d3c5bd0e3b3de2e897609db25915ba56a434447151d4ca4cbfcca5e3929d9edb0b88b12e12e6a7196c87eb0895cd47e2af2ee120fbe18ca3e5d14d79dfcf81b50773888c0cd191f2fa0ead861593c7e2296484bcdc932e124239b539187a7dae0274bcb5377ccb402415de6c74f6b7de6679e7cb15f3c6bcf0c6059ef62cf7ec0f8173f8be14060fc8b19907f17ffefe2ad59cd04583ecb20f6f66d983ee47610c21efba07e2ad176df6a036357a00704db6117d7738778d88b42e929d993768a7fbde1988711c3673ffe613c907f181cc88a0f8b87f14034ff30feff39108b875161fc7e20ff9c03cdfe7f73202b3eb37f0ed4e26184a936a20c149dd61ecf0d82b5786a34fd7e16a1cd8e5f4f84bb433787fc57eab8856d15aec76f83a861ea8ef9c4a5eec05c9fda2b66583d988ead09527b84b64ffdb652a07e4d1ef62c42cbc8fc2973f29901ce8f791e27af179d919179f1633ea88f2fb3c7bf1795f10e2ebabf2de4a2609a63ecc9385b67efb8a8cd458003075822222f768b8d7417506ff0e377c2f8d3137f03aa4d1659ec7a0b526df0835f6f49e66a23244e4a987a7a5e79421a85375deb8ef83524adb5f6da0ce4bacd8051b7008ec47d1f8661f8610882bd025f555d143f99815cbf6fed6b25da0a01a73eb0aaa8e3278b6e4e15b6d95b357f8437d65b12f454572cdafec837dccd99c2cfc24655f956cd0c46fc22afa190ce202a84068d2e7a49710ac63a3347fa7b8b633dc618638c3166b1a471f7d1efa73a250d36e8c07462308bdce230fe90a727883f8cf11069ff7bcb810f6c33ffab3ad5e6bb3dd5e95f4f7574ca1df77b5b74d1cf96562d33471a7cfbfaa2b8f7e10a02c404b2e2e3aab7ef8bfd57abfeac346cf6afd6b39ed608d33e1646daf6fbfd85f2816de7572dce07a67d5fc6ea50ffde8e50d1ef39f8be1779aabfd14a5b5e75e2cd23585aa2c5c909dd9228271cc65e35d13d6e0e36a9b89ee7d6d4f0931ad4ea8ef8f86d549b45c154add66bb7c9137546c761c77f9bb0add6fbc29d8242c7f88ed031eea13fe8861f6580ebf5fbb4fef5f65fae16af254b9cc236ace1b9764aacfa34ba44a28c0bda4af57ed097a768b74617db34b85450588bdc4e5dde63ca661b666acaa6ff589ff62a080d72748bb68f5f46e425774de4acf4ae634c2215d1699dea1ddc1c2ab01cb6c1780dbf8f992ddade506db5aa506fce1175e7a35177f049840ea2631eac159307f6310f148b79f071b00f1f3fa06c0e48f6b1078a79d8839fdadcecbe8fec63ef1333bb1c480c87c5b8c6c17202a65bbd5921754ee8f8d319dd7e8caac39a506ff08bb298b75f53773e9bcba1dd03b47685aee15c14d7eee3829d47d8ef016074f26d0ee7a672aeb7db83fbae272fe9da7af328dffeeb3378cb6baacdeb83ac4dbffee2a910b46bfbac0fea98343bb83925afd716d59def4f3b54c390e4aedd1cd65ba49acdd5caafd77478b0cd5d7494418b1c7d1ff4ddb54c10c5c7d9da594e745aabba0ecf05b787cdf5e6a72d7aaa93d6a4347aaad35d7fc507b76eed7a692017ef77d11b0b771db0a683343af8a3135ddf0e61fd65b1eab358fae6b058b5b22a6d7c2bd6ff6b47b1dfcb897c20d6303f697dd2b1f7330e09954163460c9b9b1a377b46d6d833f2e6e6c9bfe13f5648ee73f3b51b1b1f547b1b019a90a8544db695350b95aa9101000063150020281006060322d178380d4210a67e148009749a46724e1a0e834110c3300a621800100000010010001001842908517210001e7060ca8f234793e1e5884db2cb01a15b8871cc878736a820f7a1bc7aab9787a6cff8ac531887f0237aa1427cf6cc3fcefe0efdb3790d4c0719d26e6e5c31b191b72f2aac808de794e60dce17000339f2ce58a61bbb75e3d705c89c2844378afc81ca8c337e8fb01621b88eaa549f3b35bff60b1666aac12d2daa1490f7a12f92b89660689ad158e578ee041c9f0d26343afdbc96b2fa8f54753e2057066cd83a79d02ae5cccdb9a787ab7c5fe2e1309148d1be2ee317d8f6f9ae1ff082fe00ec5fa6ae886ac36002b79838ba64ec1814587f42713c128d0e05bb58107ff06a9770aa65720b541c69c00f5f2e300c133aa181bc466d0eac7e98db478e62a9657710cfa2cfdb4bcb4d436dcba521cb3d0d69149a567d7f4e5db6102f349213f8e2ce4981334c34157dbe929fd6e46c31d5f87ff2d0ad352953ddc4d5081d99d57f5c5ea395dbd85740a3805fbe0fbedc6ebaaba626c72536333975827543ec81e84641a185c253c6e812a0de06b656abe7e7405c3ee107d9dfd18fc528ce33ce19ba1526c37d8c0f343f80026f426622c7536e08d6ca501bddd46f05110b5bba184da04eee3c5c17050b69eb7e9aa9827d2ec8e4c63124b4f61b0eb1912cbfb3870a60c2ce70f3a1bb021734f8b8e980bbb1d2c9d818216ed378b942c1fbc672140b7d097107fc0a8d47e042dc3e8a0ef4715d19d2cd934ecb5f602ed32ee3cbcab08cfafba01b737369803849902197d4e33d14932c8ae0d8cf7e7a0c66adf10c77f2f5f4d2392fc9203dce45fd8f7baea2e98a73ac53c568ce16689aa6c622cf8c9479d5cb12394a46b40845c9ad65b5fc009c402267b0643190f01f59cec6aa12b9890dbbe4258f6123b744087e197a49284d9012bcb49debf9e3f25599c20a8e039150edb2f83fa0f3a58f1ee20fcc924063c9d5f2e528c18810849b1c9210fbe37d1b626040ea56a351772b291cee0ecac2dcff9b35b87450120334a801a87fa182d9c9e97d1a185160bc75351e9272b8bf03962b84177537c3efc2bcfab3a7be7a86e6efb0bdbad59cc54b9bf56866c11e719f588a7a4864373ad26435284fd4ebfee0242536e08881de7104e8621b0e28243ef0882d934b071a9c31e31b4095ecf7fc1d2dc1c817d090aa53d97fd2963c3027f3a6b5afd105309f2bbd92a094cffca10a0a9add1093868dfb9183cf2798cb3814bb2ad5baaf109c96154115465a888adcc143eb816c76ca0a14e373028f6aba6ee0bc0374e4e27bb4b7d71e3430ed62b03d27b43ca648fe73ff97dfee491442bffd40a073483282df81810fd22f99b13968ef706dd534aa7b1ef1ff4040b3565d6900e555c7123d28172c1d40f01058cf6fc6f972268904d3cc9c168689b737fccdc037db4813f5b109a2effb6c8a803bc210ce9aabaaf74cafd01f9b63201d20d007b0260b140cc00ef403081f2c21b5fa0e1c76f5d22b6bd5a5c003e18fedcfe728cb0113c7166b55c82da5ab4004361750ee870882ec77df6f9e874080d9e199168c560f75c66b6af9ec286107465e87e14214910a7a126d404629201d9ae0dbd167e030f06611cade9692edfd80ba201b407179bc8b9f64a0b93cc8ce13e54a72b2937f9124db4d1e4ccf9416da4c29fdbe5875d875367b8bea7f8a0c48bcc72b990b5c1ae86439bb9cb166df44ecf27548fbe98c2376c55ee0c69b42d8b956f5da6da6404acecba2e39168d8a9f0887595cc8ce47394c66582fcd516db2ec0a6da510afbd3e575c671b00f75f3b6dc82527623db658778ec0f489305f201934ab397322b03f03bba321cc09041785658b6f4707a55e83515535d41ab38687bc0842f1aa6be20615dbe6fd9914dcdaf0dc6e62b8249537bd30dca07c0afa30dfbce058ca051656c6fe878599ea844a395149b26fb442381e98f375e9cd7a4239e865c2fe3a9c13131cbc51f7505884e716ff2a055c5c00032087459d4aeaf45cef987e3a8c90057ee5b9e03b22735405324ff3112554596357fbbe1283f45a157719941b140b0e7e1bcfa8c42a8a660dc679ab75f6d58ffaec81103d64228a6f71bd0536e1d47cc063c42c883988e125af7efcedfbcb951dc22623fcd09ffc22ebf4eebf546daf489af873d189b9bb61688eae84bf545fd08f93f883e3b7d2820ef46e294e123a8be355ad6590a714d12b56c89d8fb73379c4cfe980f756003b028108d604984ad5a996116d01313fba007929a199ddcf55a645aea0e6852ef7e3abbe0699cdb758de3dacb29fc8dce559781f4d55336023c4695f621e3d2079b177ffda73a14f3f2ec2639e770afa3df08eaa0e25d85a6e0a562b0bbb194b05e76c9763ee368a844d1ae0b9afeee2b095df9ec19c8a5888369d9f592e6c3362048a57d4dc0531b6bdf7533e132701095b361417a23053db9c6266ceb3b82ba7fb5223f121f756b89e7392d0963da0b4e0f804f098d99bd1fb1504c786926508738d4237f2474e41f78c9e97ed06650093767ddb6d8b0ebc97bfa55e405b98b0a9ae0e605345bea3a5e0df083c4421d371316e240251c1e38cb7e137fb9012de912981bede9253ce7dd15bcd616350b9c9e60414371cc544a9321344852323930f1f6afed2995e520396e5af125b0d5958815299c284b33c7aa25de051361b1c40e0f76efe7a428742a2b38bcdfdd3c628b6aec71b863a0229a4e9b64b6a38221a814dd1c86994645b7710f85fd4932872c3fc939c35939e8ffa9eace901a36ae0565df0a8d345db2495e192808b33e5443f54524fcb38ab74cc4057c7fa5056fc11adccbfe6ee105764ab39fbd6deb94beb163ed01869cad2225e915c580cb6087bda4626906a107f8e27c955956a0b0fd8a0a36a6e3e113a3a5cce8cc65a44dfa0e912c14dd9b653f199cc9ab117bdac93bb6354c0c34e43b9220720b8330dbe110d9a4660ef80c5596a32538f83a969376fc81c042c53e5f5c51db07949f1dd9047953e0d96b568d557a630990e8e433ec25a4d09f933ef1f7a3572254ef168cc5caa4b053285b703eb717fcf85ced988866dc3ed1e0c477981604cfcb2a020c94f8df3b403e452fc750de0b2bf111edafaf0576f76286c014ce0be3d966f49c549960fb598edffb9d166d64acecb16efb364512ef1cf4363aeaa52bf8c83f251998f346126e4fc3b1ee456f0adc7e42e33250c40673aadcb4c743f2b8d2edc449f972d8aa86fcc3ed807d0732a55e50961b4af2c0287fe5c01ddffddc7709305f97559d58f2a7060166de53452064bb3279dd30dc4df83408784fccbdf6095b934d30755e2519d1feb93b659a2a04dfcfd965dcc40c3bc0743730345e5bdb9db425fe174280d530af7dd07f7dd91c005396c0b43cb2669b7ea9ea85cc4b0facbdceaccb00046e8986f706558f9ff9dcd3ff28a1d04aa4931850d501e0c811511f9f52f778b20c677361df131b04beec49d64433bbda342b9fbbc55eb61e5439c8567728964a5ad1fe18bda0e5a96795886dc4cab636adf232085705389ec05eb2f06f27078d96b5083d5fc061a9ae2f277dc0cb7b80ba5ec88880ad4f5ccf7f139a00a3791ad7af5b334614d45bb11d90c7f79482744d7f671b0809a35cc1819264c5990e59ec7f8e63e8695f52677cde66a9d031fc9733184611b62c63afd1f6ff248cecdc593256cf566fbec08cb8b390fef37b1fa742646b6ff32ea9d2372ea2ab9f10c560f4632775929262d016d894c081c869874df861c90a71f302880e1eb4f56970ebc99b9387b8ce2681f19fb49d1c368bf80357e0d39cfb0679566f77d0903e2e05aa8f21d46ebf4a1b0417fb7c6bcf5302ff1f13a7eb8a73a32325153a07bec5974222afb9a3d8c3a486da393e55364105fb256420ac7a23fce9ee9edaf78eac8dad2f601611ff4e1bbc840651bdb4df02a5cc28152ef48650005df7a438d31819981f7d94c9e3e330b0e59423618444bcb95350310802ac65a9c72af5a6b08ecd7228eacfa78b50cf7317ed868f56983b13042649b634542c131c01155584c62d86aae480def9f7104086c968ace04456494cf00bf0f4c4d85bf36efa23352f9720fa5d74ad7a73de56b6ae44d1b9a8fd59541eec1b23ee456db8c6cb5d8d4ae00537122388a4a9f502e0de28ec569fa32725c7077a19d6d65cb8cd768cb8976b9964286b0284794c63ae631bda2206287fdbc48d0f1657893df6ad21878c741314a09580a5cf558be15765df011ab0abc3b97a1df80235e80566bfab163c10f7548aa6f45725a43d29190f95562bc4518857c37ab0c61ed543bd541aee2c559ca7ab984a6cd4501250b166c041e801b3388ee5f76dfbff32876f635dc968b0fb0424666b453df63ea18d7aec17077886720abc2827f95b0e03a956391ff24c7179afd2d154df6fb9a6fd323a8a63977ed131817a2ae78f8074826ffb210469b0e0d28de338c15e57e446170f84fa24154c7d87a1e159ff2b3d22f1a903ca5be76adb983e2c945f3426d2176545d5afcea9e6576be437ed6e0d4b41419d42000fc21595dc124a805d0ea1229fad7dbb4ab00ab6c2f8cb007b3d12e57464e8413c293074cdccbcba1f710a9a1ee68e8483825f13e23083bc01c4e1eb46b40ebae5becb2d7c5d534562578d68259e1a62c8e53054ff3d670ee22964eab6aa7848bbea21e8c21b3ace85431b1c6047669ab40056b7453e14511c68627814d00c56d10d543e0862a06d4ba31bc10d4ae888b809aa4c84ba230392477a17035bfdd5fa4e8721c1d55daddba333c454db19226b3eb8a52ea5bef476a2922701f7170cfa8a95adb9a30ad2678e0ece49c2c21dc40af220ea7c3cb6970742778229db0efbe9510955aee0fcb88bdeaf9ecb4ecf401179179d060049d0019d86662420a1997ed49da7e2c5da17bfa02b1de52d5163f2aeaa250bd3116145d610e807bb8647a908f259ba7452859a780d683e3298b1c0c80347434317391df63bdd37dc51a69cf89788eb927ce9887f3c26c9283fb49682f9a046b5f7a87b1b3767478431a62ed33a04f2f7abf79892c4232ce5a0803d907168f5778c8cdbbffc1a86bb5f350a761d20cefa9ac78057e3dad80f301b8c9f5f1f86f5bf998cff09900004aafcb766e1ab7a8a0cf71523613e0e928f041ac04533fce7205f3d283c8bd1e3ab936d0836af18c0ead5f340f0561657867e26edcf5ecbd0339a905efacc4b35326e0939efb320574a8269174876d045547dac11cf23877046d2bdf7ec3dc014819fdac996dcd68a60c894035b2bff220c053511ed741dd5eb4c5b134267a15f5ca239f907c2b26a688213145bef922774eb3d6e82baa907f34bd6ffb4f4542d65ad622ae99af3eea433c0063bae3297087eb5587808bdeaef19f6ac024e2430d3b453233a4d05d9a74adc95ddcda7ab660f276bc36d924ff47f8fb6fd9246cba9361d2070755c28020b6a52b9ec5681d247b6a14622e88ba1be5ccb3d4025d51ea847e65d5cd90a79bc9b9b6ea1b23090f6ec84c24218e8cf5b8095a270ba67fbcba4fb2871ce1fb075c7db19d2918b9386319550d8fe45a3ce5707e8fd305b09c998f8c568719d66c0f4019147496c6dc32a8cdec4902078c7d13feb4823fa5c907f660e016f7df179fbccfc487e8907c6347e1a22dfd3aa930f335490e1e286bad4dfd257db854bc071576e3ae5bedc1a8ad995ee5fbe25d4c9e05c877e8e0c0d00d05745db08003c4e3fe9e419982130c0520060e9f5e4f4689e246a6df7a10e30c01d3ae7fc270d91c7f344afdbc40ba34302cb59ad33aec6d0ae2c8d8bdaa3244aa024bfb765293a9e1f7fab75e29c452b1eba2803ad9d5dd862ea5c50c52f6457321201c6dc323f74c4ee4750407dba2a24bf4c9f6dfbda3dd4a24b93df61118e5434056626415fd7055ac1c71903db1b2b08c66be1b22baf3b2f9b065d6a2ec45a53931c3c782c7eefcc61ecf93abfa51668f061bbf0f8ef096d1807c9080812b2daa9f680b34343c898ee635008cff4bf5e80a852c58b84dd5b4b6b0130b67739f12707a636be68923b4499876b1b662a35c00b05ac20f5dc5b16673c9b885f9c27231fb35e3e54dcdf996e864d820ed9197433a96c99c36430e017fa256137154b83831324c50d7720ce34e4fed618cd1a30609b8c8bc3ae4c9bb70e103dbd44cc03dbd641b343ba9f75992b0565b60e48a7753fe6bce30830b840f971327ca2ed53cd253fedea2fbcd95a5186b70f49da943d73fa0ca91f02b2e3b9f99387fc6baf7dc7fd46359624aebe6e97261036c2d43342b252ba042ebaec9292ab4bdfadd04e1f877ff2d021018e9fc376be3eeb5a17c88194e2d7aedae7e12121537b017e446360a2447aab3d44454f273c70206c89ab62f692918b196e40748d2dc61015375810692a7e25126396f05c16cfc3fcfb1870a2fb7668cbe4523b7a78652d8d19b45504784b7c060435dca378e692c110b6ad95ba35388df9b967279d32e3e56d48a66c8e8cee05514e6033027781da317c3a698d7b0b5dcea80334a232f342472c95a6685cff919133157a79a49c0a37c2f739bb8ce0992d7706c7e4c23be3ef70de563ca59f16c351c9a2e783c36f15fde2e1153574c3cd7ed3d233e69bfafbddbc0d77bb3a4357c82fa47715be43aff65588f4a015e2c4aa4178e79d08c0fb965777a8328993c2edf64dd0518dde233e8fbaf26e975c632e64c1090f32df4d46506e2360431beecb6fe41f282ce36a2be3549f11f38cfdef6cb79bbd8c17b5061c81fd47d69bb4795299df07cd97ad9bb263aede136386b1d9468f56e8a9fcce793a49fc33ebf84cac2513a690d07c5710d99bf2dc3c74aa1da1b9275aae89b4d72f2a736d5f0bad014ea2178b5256fbc716c4850b85326a5433b6908f41a762043fcd9743e6ca0e0002442a66d5df5470e8a8a36b26bc41b85ea6381ea37289dcf031d90911f679fa5e48c5c846337b87df389d1703ca0dfde116faf6d924b66e9138195f4a8b1df2acae6ef4fbfb47766edde5d924b872aa4ebc3888271142798fc138fa5d0143d9756ec444cd59c0578f69729786c80a362fa8c546e6f5a166b7118f254715cc264ddee5cde90d8985ebcee0020d21ac463cb12d65abb47955e45edee576207ea3b81dc4d801c01266d1ed24c391f36d07e5fd963910eeda9f4b3751439182cd6f54d3271d91a9375d1daacea59784553d675d0d0c53197bcae898b4b357bc287e1f3f83a5f6d2132d6ee5edd35c8f8871bc5521ae8d8b48777059257d48d604dbb9ba6a72f3ee5a9ce43fcf86c2bf2187b4a55cd2592d8cddd4c9b90d5a379b130c3509bed148e46b4aa220099c58a29ce67737b129e2f2deed7172ba9ad6927f87be1e293c9de6923415cff7d999d5345924e3d2a46b37e3f7e2a20342f4a675c2d1bdc842d30dc6f6dcdea6edec89a0497479ed5de13b3d59a149a00d2a4f365cc777f938dc96b80de399090c15c1ec0c39ec515622f04b4df70752c49907da47b3a1f0ab905849401a5e1fa96d8cdecad5c4292f153054816721b2eb18c492842b23f75e45de50534da8076c898eb9c34d6df7a7c6946b8e504fe3731416a3bd2b5bfea186a44446a5c30f0e0a556c28e4f060a88fa418db14bd1b938544e89369186a0943f47d4a325e266e135e4a978589316facf74f6cce93533b40704b5814a62e86b125d300cd81e24b1530e8edeb80c9faf4f711b694a1b1d3fddd06ebc7cedfd231ea671f7af2a9634498cf23be9abf57a6eef63dc405d52b2f6587eb1d59d1430d3e8c0be2d4da9768e969fe57cfd5b3775b31c3e2d3ee15509656fd9bba5d294200e817745614ad409e4fc995b677ff12cffd7e8fd64dd4ef78a8c192d09f7a035cbca4f21a67d0815b3f1d0c6a6148f404933ba7faed74f2ffda3f1d5f7effa08029897eef089587b6d680d18cd6aeb7f9690f8d6811917a4461ce7e304646d6975f77e31aac44bdfeee8b799dcafaa6e4f2d6b8394a27e082fb7ad434b0ec13c7b7f75ed781c195bb1eeab43e40931adbd19172aa5b631029494ff39dff97cabb8e4cc87c2c3d7d0fe550323f8064841659021c2c4271089e999877a2a2c222341cd08c0fcdc0ed8127e5adaba020ced669007216551f35d99c990294375756c6cde39edee66cb7cbcb2a48b3a36e483652b9e0718c587fbdace0caf1010d5c310faf47c19dbc55f1581a09ff17cc8145b480d381490f215442ea2e62d161e2460909daba79f045514ff1185751eb08485b78ef1233a00a870225bf3a5071dc54b6561b4a979d527ba74f27751730fe3e33e24267fb7dbe7cc00ee2903ef9c03dbbfd62e334b312ed70bb37fa148e8c3761dc515711a4a09ba437be4695a244002dfe4b9522cad5ffc080523d13ae1aec647d2cab7f778a1276fd0b274de63c82f51b80786f93091023b7aac56890902c15adf34b9a7774f945b3cc846a4e188f9eb88f28740bdcd2d339d52ea024474ad536763c32e3caa826203c781edfeeeda708dfdc98480855b38975500b294a421d2c3782a73023461c4a0a32ae0389b2e483b658e911190b4ce41c583c5dc0359e03c36971412c6684bbc7d803487a8f4af35d2cf1c68617e8f714cf9a2a60e4c9ecd1f61f36e2c406abb5a27ea2bd714d746b0977d73c9a9d83e7b0fb60b287870765ff941749eafc9d77e3e2250e07a1139f4adfc23ffe3de06fe0cb9706e880be64de4d6b1e701325cf82c0086979b0410cb87b01e067fe6e77e90148081d700172714830036b18ca49ea65fa4b3e1da8434706dccc32095e30b3c99a77bb1129c8ae85a9775571ad03cbbf1cf51ee6498d2b2441e8aec443051864e4d0f1fc0ecefc9bb3b6d20595c8bffeded20a70f2c7df87e5a619c1600769b4f2a3fb7e46c546c6a0ecef22ff8513e0e745c2322ec61b61176d2c03e53cd1565fccfb547095b3dbb779d1e701468806c34b763aeb52c661abdc26711f293b4f6083e8d61278c326be5a9c0350b08cc3c1c7654411d28305b3c4aa62e8a7a80fda9eee50cd467e5f5f19aa0becc24148c1fcdba456ee52fdd6b83320d89e33b42b0df65af9a8ada75aca80338a258ea10aa157bfcb0188c01bedaebbf1021ecfeb7909e7a913933912c275c2a0d33779db0bae25096a57d15ffe2e75294d1d4c39de013dfc8dd471256dce898929c0abe3cd91c86dbf0e5629ce84c88b1b1d3d12c78381a1c657188b7139d3d3e14cb90e980b6c44f38afae88546f1b5aa9b0bc699bf4b77bb9418effd69ff3c31ccf3dc20fb2098f5b8a1151d968e281f7c410e90523980649888bcce8bf0c6d62caa780eeadf9416b21d15da473d02356c4d083e6c00b7fdee13d2fb92508ecfae8029fa352bb80e609ccf2464f1cbf8389676a81c4489d3244f038e2f4056a2fb3691969d9802623e5134ddea92a567420aea4f2a22ca70fadad56b945aa4226bdd15b75e58885caaffeb5f7dadd217351a2c00fe89a08bdcf42a81b79295209cf73f8df43ba55dd809521d013c7e2958f13970c4c17e0dbd372a395a399a02b28c29cd5c38fafc4ab65be1f7c599ab1fbb373a2d316b74448c6274fc80b61c98b4ba34ca98c5ec88685f048b074f38278c1a6cd0f186b28a3f6190fb73738d0c74b7e368453a553cbc7c97b6eb08573ff28bfd8ed65a677e4e42f78896445d8cc7b5263e03ab08de252b287153b1c546cdd3c04897b7f60f246b1e9cacd82c8ecd4c56ed084740b2933e9efa3c194fb145b6b646e498a97ac9e2e9f82080c3692086bb3884005d19f19611674bef0977eeb09dcc29416a4319518693fb15b653e9b872787e41b308e0d93f3cb4f04c7b86e5fd4fddb1f919c1b18e7fb4d829af13e300f085c9c140c1d6aa2e441f6df00eb890a872590167f86e1b5aa1dc8da60141d8eab6e1f9818f4c92c5c81630686109896d2bba905eab04f2fd82413471273a72c3bf0b05c902e80a1d47bd62d328e77d142bdf15d83831bbe87f7ba96fa85a3b28126552490c4c7eb23c7b34f8f3c2d473c3a27ed28fb9f519732e9e456b0d661cb559b60e9c029ba68a7572c9894aa6e377d1c81dde4e5f8bc181c359bc1b67c15884b98b46fc881e6fe4156324c1b48a487ebafacd26a8b5131f15ab68646b7fff35dcb9fe6d7e766394e437a5443549a53b06826bc806277548113eb086d2e94c3467b9afb66c907850740916d8888b41bb21f9484f6b5c7d42828446d7f524f292fb26f914f3ac5904dfd3f736abbdd4b3fbc743647501593b8c4aeefa433fe51c681cc15fda62aac5a6ed53cebc71dfa5a861573d750c52a4325d14aafd03dafc209f823c72764707cd85acb8f8c56f5a154e24d8e5d01c0d6fd70d6d84180bfd273c0e859939e80b8f235f864bb46f6b4f5f4d705c86a6c933487a5c3becb8c9883c5b29cad156b176a4c49deba834836960c022d95ec055252350945d185cadeadf6ab5c315c380f4531f5d4ef6ba62001d0e6417c280ba5831b43394cff1d1d651400076743df608e89f096e31d4af6931e16ad35e451b5ac0870990f79c678ed0af682aa1a884276357d68c2b2628c5c5c0228fff6ab1d421787603a7cb3b6dc3bec17b51ce9531a37c7bc1d207804e35bdbbdb2e9d9073c41a3fa210678629047c0273093c84930f64bf9edb3644e910dc1b29e11b64b0edea28a6243ccf2019025835ef958c10c2a246b2f433812185ab9d30452c613941b8c6c0a371a8cf2fc1f6fa3afb88a898ac931189a840ea2df45cac378d62c9b0cc588803446f7171c93c174e1755963d3e44e39647be5f7bbf3b9ce421c6b28ba4a434f216cfe08b4673649ed09c607909c0e14f209d453a8c125b3de4f723aef0347b27741d78300f9b198aaa234d82c1c9c445a4c03c4a571761ad963ea080c1681e46086a2f55b8059c6ed96e791d9da67b77f9909c018683a993379948f39e7cb446866382f232cb65c91f73e7a1ac2c4da63a1dbf89b7a23b96381ee9253becac6a33afbcfd253c2103e2f87bc8fd4db7a8f72192b6e9c3b026bede141d00b80335cdb61cd5152b4b07ab24d68ff218648aed0a58852616d3d351c421337d35412be2418df8ed0c764a39d26c02f709fb6214b275f206d46c3d153260b13e6c9aef6068c7a1a27e6edeb83225bee5b1f9dcc462e17bbbfeb3e70712ffe2eb0b840581f617316452c8ae3f68eaa5bdac0d55f8abf789d83ced6281f04d42a7fda5f5e46801c3ad5318d0a276191d1e6be03f9ec9785a8d0b770f34923d4546bc51b3353988dfc3209f5d602cb8cf0156d0d24bd09c5014556fe8d74fe3c16d1b77c1b9bd8be2d1f6be388401f455fc01438e470e56a89ae6deec7f036524d74ca7f39e329281fa45f5b9bbb49172895c2a5d0839ada8d33a64c97996a63f3b60c8b19625dce81a613bad724a197fccf49af99ce963f79248c153c17b012199994a9b84ad6be6dd337caefa7993635e7113b953742aa3200a8cc7c6b78b8e8eb094bb62bd476cbd1237e4ad08e49cbafd6f2534bd4335f2043d651144710823d97295bdbe8d2fa04750c4a8826f2089437462f2313b34ca7c04b549a6a68030df1f68dc6f48c37817e0b5a772a1bdb9610478d96207dcac1f0ad826bdc903240fd550d770b03409e537b012c503d3d4cf38f7335c2d5f0519cd2df298599259f6b2ec04e2405eee1c5f992a8fe1ef237da856aa50c91979a6eb7b7729b406073496456037af5c4925e1635cce5cb0e228aa1ac85ba8b8dc058c38773ca23f88e61d3a8e71497c36ee8e40517047bbd8d6b3cea5ba5600f6617a342b542e8372e748366e2645cd250efaf1749144370043347929939db5c14e6526f2929799deb893acbcdf8116fbf940797d6bf2822fd516823dca62a2130b136fa8c140f067a5e4619962286a0331332aa304be5120e0a663bbdcc27b1681171f9772c7a22158e65a42cb21f9439abd2e0ef1c636b8bf45ce467e18ca260db2c9f6626116c7ab4b169d9fc6b27d70dc62c31eda6ddcc200e6af63620c3180f092d808108f0b127036d5ce43c608770996e8229425db9206a235eee85b3971e6f89520c7f2a2b2d211de25131090ed8af5d0d12f8dd6b37713af119cbde6a3693367071b534a05b776c677c5f591df38c9ebcdbbc640c5edcfbeccece7c62d0f983f9ae7a6365b4acc3fbea6bfd4006288e4821b9e06823f4642b955314d3e07f5f7df9ac0afeb95fb44efd621a74234aad99398738ec0b9b6d07dbf98bd2d264b43c91c824914361faa51e41266e6f4855c8e8bff63730693a396b624592c0e8828375af3445eac7475e87223585967ffd2f5eccff425f9b5c287cc0d7a6b20a849856eeeef1b211c948568397665bf42589a0699ea039a92c5aac9b6a33171ca8e38cb517e08a8d8252a4586d04bbaef5c96e525654f89e40135837cbcb8ea9c8511fd3aadaed392c6f0808706739cac8377a525ead2decd5e937558c82b30bbd25e802d743f3ceca5a34493750842611d31ed9f09b686d764891d5ff6c0d908f3c69b69514be1c8caa016bc81ab61a7e192b32c614a1c2ac079d1bc6f44909bfe6ac641c357fcbedc58da994ab5bdb8ca2545e4978fcb308cabd3562fdd4b2c0970d9184c17760fc1c1d09c74543a45221e1151bd28400f238e67b680efc078641509c472b0dcb229b9d578df6f11a95f94913725a1060f75c1d6c47fba2723dd033f7d80280900c07465d959678b601c2d82732205130d5f322feab01613a8f17bb418d3f4910797b7b1c11fb1d1413bf0af3a04616888455eb71db0d5d50faa2ae7e56eff9e23499bb7658b40ba973acda776315dd5813178ae35f0547c6ad5aa2936ceac2cce017043601d8eae99d52da7eac0823f2cb9098ed0d592f1d3c2db504be70ed17671ec483694c55dd6f8dcb50597ea74cf8a8f101eaf88f676f75afa0ea7f71887770df1788b446fbddbe09bd9a9d4e7d7e46ebe115f19bd9f4c17b15924472bcd1e8ba016a12b3e2a9ffc63e51a188381d4ada91f2890230ec37b07adb178392c3a22816d0171028b835fb52fa35164e383fab2806671fdb5269b6991a58dad99828c88966a2bccc65be6347b9773195f81a33064581afd1a7336464b23e4920349ba89155186c4030a74aaf5cd912a5eb6499d404a7647f73da0b5540876fae8a4fda4764c08de98430eebee85ba1df7387983eb1dd89edc98987b40b1233a4c0db32b20655e48a8b865a5072023a874d6f630d816a0d24796d926cbd2c81df28d76591f58b74e91fbd413bbf5356ad88fdeb8bdaa90e6f49a1e1431b8d6d35cc79a1d68af1032b1239379a40e4cec13e6d27238137472e4f8235d6a3257960d16d7fe4da35ee9adbd75426d1cd604fcd06075520e6a628da360a9918e55c742cda98b3e4226772dc8f7353bef44bca4f8fb735978f3b1a572ae877bf8a65a229d419c5ad20969a2a9f1e51b05c0ecb9b514326b8f38f075f02c2e7ddef582c1a1649f5c93d8cefa0c5c0b2c188da13908872eb1989ed1e193d680d250d5eff19a95e500628deaf5a4fca17932888114e9fc6796d3b351412a0bdc504f01ccb40a20af92c2168f77e224c5a188719393c3c8212b8e29ce7910cd3177d87a07cd40048ad47373bc2c435703306042ceb3a0636e896a868e79d30b81ff8511bca0c2cc4402008043a4b2761d0b392af12c143628dd07a2cc8ded8cae14cafe49e0d16fa9ba008011bb484654b1d8b6b9e5d1f20197b8faded5528c9fed8f565794b73d070c1a643c2893f2c7355f0f7a20dc650f7b97c55a3db03fe9e7ea300457b59c4e027ad8f4dc6b1e39569250715dea286d002cd0dd97d01d765a6233993ad6655f0b5bd1f1417f228e2bb4a283510ee0e541f0c900b5ed5263377abdc1ead1f74602ebdda58a870249c4725d96353bb2058dc01e0101af349ca27b3b9a0c1445a3505ef16e4bb242ec0e72cfd3a3b6b53116105b1896a1c3c7b94c403c45cb15e0702551c4f6bf9dcb39ad71387ab8c2886285647880bed5a44f8d1ac0ec0a37facfcf34c165bc2d933ebe377a84c89a421392d4c34c4f689b8fede04aa67c4f3fa87cb57ec12527f6b4021e7b989595152b224d61cf5b97e20b7ac692ec7ef4c7b63900a0ebd8e4c87a51918546753acf550be3b68b868e4760a84fa92e044c24d15f63cc4b192be3d1d62d7f35a8b561ff4db86b20bcf01d56a728d0a6260a201095fa6845afe759f60ba2328c68cf72d73cfb5208eb5edbb77a94ae8892a804828717e72c5c8c6d8f1bbcc018ac58cf3519205fde165c3d54b54d1a30ea41cacb7ea243f07bf14e274a9cc1c4902d020ca6347e07a82c7a9184a567f46ae51f54868a644e3355c99ddbe89867e53649020d4930fd7189359ee02f07d9c73a02c6f851759023068e4c341238de910625a3cb6a25f7f72db7afe3cfb8b7151d0e0388a76642716ee22e14b32229bc2303a9f1b75b702f5ba4d704f481caa245b58ded2491d4df7c81424c0cba42ff7d64575e3644a9dcd5da3edd9baf90bd16b13c387fc19841d3d150d79ebd08cd3a43a081a272d41bb2bdd586ebda907d85e6b529b5515093d27fd038eee8a4218bf940facc4722b909e4aedde27c8ce689aec395610fbe1d98800bd1c2f02945e19be1f6bd4ac16eb3e8c3c6bc3468f9332a65f36cc3e11f9cf1047fa6f2eba211397c8d9a92c6375641a9efa6c0591f4e0dd00f1e63422c671c1b6380022ef421ac6b3a90ae3ec06f4ca0ebce88d769a86e9929330e555960ab58a9d8585de41b77babadf9a879d853e86b5058c7519adc59f3ac8d416bab44ebeb5b85a962cd675ec19df96c895de8819be6231cd3350f32695cf97325aad4e75d2ed34a7fac81ad7d7d370f30c11a205ddceb0ff38f44a06138812c31de96fffc7a5de22c6048986ad9a3f9da4de0c843e96561be32af1a856a5f4391dc56e60f89e650ab25ea9123a69158d7206b6dfbcace640e7c416908a1dc8c10e18c6281ee0bd5d711d6bd783cbade3375266718b76e217acf8d731484c15ff35dfed800710b28cb4ffdcc087d0b92086f3ba2f1d88494750b1944eed946e6f7caa1323c235cf31a5c352de71d057ad40605f634c39476885f0980e17a9eab13a4c3dc6f5e065cc660be854b2d5eae4612a7fdeeced53bb170a7c4eb28ccb82c3e0897a9f3838e2538792f924cfaee444d5a67d52b7bc43e2e6a17dda4fc2a0d458942811bef34fc86688091fb2265304d59ee469cc5f691932ebffb7804553835d8b4c0842b615d4b47d81ae428b2fb07dad5bf4bd772a4fb726272af9a008fd981c6a19c83d0c5fb11a6e652893bb9b1cd14211616e79d2fc074453a340d0aa5d3b9abde37e95811a3c53d85260573266a69306d8b8dc050a82426380b721b81d93605149085c93871c65fe7cd2cf9dc58787bf1b673c3749473d4f75036a42c115f015c19436d894df4b90e600613a485ca7d6175e75899ff9411b7216105010874b021abf08f4fc79036bce490447dd39dddd696e8362853a7c63c801f082c82191397c26189353b411420b71fbafc5aeac950633d157b772adb8b2030d37928f921f02b405496918098888d574418d934a22e4cf3d5be303a6f80c2ab59f229a6b9a2f592640c93a7f18e316a8dc2a8731662a463563c1a7aa0dd5b817dec50b9e2430154c47bd539d73973f86d664505cf20dae4888a0e90e2af4477e0c4081760706382eb877d782e11e712b89bd7d98500069e8889476d542a2031df491c4d05052e2c62d0ceff9b22835bf4d2fcd74abf4451387f51ec787adf91f51cd92ed3658d9c3d6d180d270c7708db3f0dd2e1746569cc264b4ab4ac76fb612927e023cb0ca1a40f6505f3ee02b3860e59ebc54304b80c13e2f94d11d5377d7a1aa35ef2b5aa806a327a77847d8c6a0a2147e5174949480bdca4aec7c7d9bc95e1fb329ba448d6f26be721469993393e54c40d189b5935d7d1590b07ea686fcda3f41ca172719d6a036465b19216c6970e193888ca7c948fb490b2dc6f84f1e2b042a13a92ee0dab266494dd6491eeda79b73426262e8e9e7eff2128f855cb9b1423c92a2771be5bfd4c6682ed22cf00599ed9526d9c5c1a46a02212909c0bba436c0010fd96e3444014bca8afee3abbf9a8f877a420453fb5527d04dbabe6916a3e6bda01c648a61627e5e64f02d6df667bb55d0ce4dc5fea650fbced509e3592ada6134836542b569470133fad022b3e1e1a5ae36fe9acf203d76128924017989371a3b5282b4804f8acb1fac8881c9f53df0782450ee7f0161565900ef0c3b6c3b3038721afbee6091a7cc820189e77ae76658777ed6e6741e9ff350151f8cf36c9b8a9fd61b3de884ff5c72d10b0a3cba0edb6ca0d6890a9ea83b4e7662408ea6c986d84caf0938a253ff62eaacbbe6bb6b44738b268f8b15f559114ae460ec5e3c6fbfa76d3fa891e337c7d6c232f8eabd34b88486ce997cd842d74664de309b78420ed3b4623c1ca0ac28f3f8ac832b4fc9c08c6dbb9e2d50d8b102cd7ae24c64a44f1a4bb7f3fa3c59bad44ca8ab2fa497a645d9b9fb939d0e0187239cb211be1220f10b675ea8063af5001bfd33a460b018b63c23c93608034e11705ac2b56029418e8c20012360f825d718aa18f455e7aa3d2731fb25d2305db76bf131f9c4d494e4b00dabe32eec85e6d828ec8b6352c90a267829d4f6ea8ae09b02d639d63130c6d3d4b04b1a9a3efaaefdae842e14aeb01897af1c73bee0320e2fa0a36501078b21c13b3c5d4ba7856d9891505133247694d2e8617c4e8b2c38676b85c10172aea8ed3c58d333bce71c01ab358fceaadb515c1c540daad62eb05376b0db2c7d020715c945ae02f7a7fc9f8a70e5d2f18e5d118a29b603a637990e4a9dd94a5e8819a3230fb25292a2a68d758956be862295e4d3a3e5a8db6de52227447d944385d482a7f2a8395f0aeaefb85f7f5d400d604451a972d9138d976195e20dce6d9122613588b3bccd383bebfd509eef9fcb12db2ca0130188528c577b3f7354c8c58a5c1e35ab4b794e2746ea455a8a899dc3fc80c96b26e520cddc7b845b7b61ddc0cbc596831556703022792e640d54b668d6ca36d81ef8a5202c32fc148ecd2a376fb579c7245ae8effd66d47d98944229fa16b1ad0d9da85ee2fa2f5640950c8a1e66a0aba916c880af253b8b7d1f1b46288f4a4636ba77f91773fd22c46d544277ee68c800ac12538a30289fd0c583fff0c5299292ff1f5e540762213a582c04c8f75911c76d38d35122c99ba26105817e2e0cbd1666684d7edabe716aecc93be42b986d2caf60bb0be10fd1ac1e62f30d274d282d6469b09f9b2a4871e5ed53776c5dd9a999d3f6c1b2a9ba90f71ed1000829d3cb186c4b1bfa5cdb89965eb4650eac383f43ec27cafaa00563b1f3ff68b0e0647edd4250db31f7c04eb4e4659cc085ccaef13d4a4b3e0b078803975d893ce472a201a5312ff96577181d9e928022149d709d8b1596300055f178965c391a96157dfc2f24cd80d2a75559ebc34773fe9b77658df8645e4af0c6ca910f0cb3defcfe66c3c91ee55910fd11b4793de97505f69bc7faa42834113744345798b53499a2ccc3ae306bc45e55d8a8594833156655acbb0959171648c26e0dd6b2a74c0c3217e2b125818bd790d28eaa27f9e0647248d5f29b261d878e2ddac051c09584680e995a0ca934c947b6392e0589776094e109d70a7ea52bd3a5845cc9eaa707b6e3cbb3762b089e8d940a782d08c71b120a5169214f6e39822909aeb70d361e34765e1091f6961dc7021c14f0b8043bb9af788b60b8a7c586597e3917f6bd6dfb10eb0199b78f6f05578275fbdbcd2347b71cd0fc78a87a55a6493383da65303f02285a03ebd5fb4b325c457b95a67c0790cae508ca71f9d8375dad3dfc0ba158733a942163bd1b90104d89441b44d19d410b3dec1a184e168bb2f828806f2fac4800aacb4a847a1db56567f3866135a77a16112ce53bbe8a893081e5e41ee7fd2cb31b5b381d9fd3c6ca2d8e52ce7f61f3f4a62ea2dda7a584e6d958df4d0352ee9ec4ac8ea2c3a5743b0b133d804016815950e891766e9c65f814da51d8c6052389177327ad95b3643a57452f271b58081dda480a17353eb65bff7f071cfae9c42db1ad15cb8d7d5c0bbdc9f573d5e63fc74a6ed5bf4c24e70f678ddd444e9be1942ab81e53ad86c2188a62d3d37cd79553dc57fb3dacc1829b602d6ed0a5ff7be62cf1512fea6b02bb82e8bf3f8bfc461d0e713944606e6818b9aa50e1a4bbd856e2bb38262eaf4ca180b37b8a298e635cdb706bb8965850434bdf40ef11c008b9bfdf2b33d1df7688bb04e753876afc834a2f681fd688094b19f5542cee90cfffa1a7ba2b8084358feae65d37d34e8299cb14bfe78489f6da7a4d0d9b73e3300f4fef9edea1bb54efe3c36fabe2ec531b0dd0d5c650472a902a945027bd2912ce4459ade8471c18726a15691b739dd7c39492df270d2388822baa1784088228a499138b2f2222150d51401edd27361f11fa1b209f4991c3dae93402e36b3d623f9854f57e81e17f9cb581a8a455ce7b63cc710c37cee7cb718b2b5057f09642a25f51da288140bc6130e9c4ce8c1ba7b75f79d051116f5a172276efc3468840ecde441afd95a5cbb8d6db8de7a11f98853b710a7aa38450a002fad7061d3fd69ab8e30165c2d773f3d0831e7218dc5c9bdeffd2b002ceaabd30c648517c101155a7c044ebb1a85d2f00284a695e3809128bda847cfc2d86c67236334beef283cb4045c7444676b143a0ce41b260631ef4b02d393e44a2f2334148401f9ecfe1c1eb4a07445ca071279a76200b51424ce259b0b24422a92f14226e68afb2566ae20cf188d5d8d6468b76608a36e70ef6ce312c817eac09d0b6fa5228381cd39766c7f9a0dedb455eb26bc6e507283602eb0a451567ccea268fb48049d0f242b8cbbf72ad7661c2d719d0ce89d86f2e82bb6d41401bc1bbba25a1c31ed69ad319416f459c8ee2627c4d76e56d8343229132cdcdb8ca6c5359d2dace672e3bdedaec5d3a3ea7052a3f47aefce503faeccfb8837363b387e648282640b4d7d2affcc95ccd550144806b3ab8492d08d1b5ab7fe85a8c94aa9413e7b6a9b863165bb3ef241290c592a74d49765fcfda482475400739db3fca44073ef52807f4254669013fb9c7ba5fa4f89570c6741a5c4ab498262e48e6a18f053b01f957caba76ee1b4c059846780fa38f4e35abbe4dec0b859d983a9f0c26b37ec65c6de270e2266dc99743ea7152b12325c7bea1e47577b98b8047c200c6fcfc06f2eb9c583b1cb4bd6e9fe3342e22f44c9395163c66a0a65b60816cd0a4a6451c5681a43119b72a9c6a7444b7a75f7ed3ee72e00fe8e5f73e77d211e200ac83b8bb33097fa2f072e9de3b20c22b6c9a1ae51b8b76375f1c05d6771b8d25e3094cf95450a4ebc4e7500404906cf6939405b8559a7528e97b9bf54924dfa9e3cbfffc4249d034509da2295c3ae2046a5a4eb589695ba0f715756e0bb62a1ae5ed354bd8396127957e448d566e200574b4a91220151f800a213a4c0a338c1882810042a0b29be44e6da81e7ad3a7e6c2b9bab81dea57e243a1df381e804eefce3ed7487cf07a9a50dce6c8a8e218ff4afcd825b9c3ec5e989d149ecaa015712345ac52d00bcb449a2e32529b2e83481eda9e3e096dad3848902d38f4dfdbcee58c08f4db2bdd53e48b9c26c4d83616bf1c5393b167e46e3974b9ba6185fc3f7afa9058ef7f32d7b4a70b940c368a243f8fd46f3b4b50d97cfc031bf8f8c0890ceb20586233eebd041c8b037b903a3c72c28c325935211d9cd8c9f50f5a9f1dba3ce8464a158a5ba4fe1e99fada8437e8eea56b95283c9a9172fc2467e4cfb9cffad5b6ee5c45a925cc5a804cd462bd651773116f5bccc6706d4c3c511ddf9de2ae97aae409bed64d00508f4c16694d9fe3a3af9563003f0d748b1aae6385a685e3daf4352effbe42e17f48fec9f2b46cb753c80059b630c88caa81e4255bd29b35a7008c85dedc2fc5ca13dc1788d8560be76b78080e4d5cd06145368117373a95a09801f8ed0523d872f9fe8ea62ab804af08f90843ba6d22abb614635c3d7ec9747aa3c7383d040d45c64d8fd85b96d02ec61029b1d3618484a4e6fcebc11d36d113751591b052464179806ed7bafacfc8b85278c5e83e25145af13e94dc00d57f0a62dedfddd3e3aa884a2b3e5db8eae829cae38dec61d0c6cb9d133773d6f0e4b1beaacd15c560c6b510b53eb04a61260e0fff4171370861120146a76a08e7f24f3102b4fdcd071031bd58afa1aaa3f4fd179f835d27d23b2ea8c274a49bd2d76a43d5902a22e09397c5d101bf92f7d005f65a421760178742fc5bc8b011d8e78db75d3d57ff0fd94dd5ed44430ae9b05103dcb266798825c836a9c9434a2567b8357dc7d8c65fdce74d78968db88165be2e65010c089d899b01a8e9ff4d416a686e96628aedb0c17202974cecfbb2c5b1b51f01255fc38f18359fbeb179fb2014f2f280eda145a20a1ec16c0d3842c17f467958982c50c89b6510c7e67a5c1311cdcfa63c7557c92c47040850bf7ab188923f6561e60a52f80d7a2911b11f2888f58e32f8b3c0d7e3832171908088b9f59e069ee9bb9e4438b43fd197e6c035b6b95d66d3fa6e83abf9ce71ee69b3be2a420d5a9e949acfda3270a043fe78fd7c572c054a21265111e2aba19b5499246df21b3c6689e5bd7306aadccac04b002623319e9517ec0a4518a46e65fbebc773cdfd58789c825dc797cee9087eb564a2422c7c0c2c44cf298c514969cd106c3f104db9685ae500c4ee18b4512cad3f225426aaaccdeadfe063567edc0e91817c3e0e366b6bab3c3521b0aba7d71a4e5646f3f598a561a73ca8ccaa95d275d0180bfb1074e01d6bd8a601d9a93ae7ae334dc1549cd9aa645a07643fcb7be6fed82ea1c074dc87b6d12011d9e54ae4fe8a525227f5df9c83a2ab91e8a9f5ce84f189d4a5db73081b66995d3a15d7c66edee97b6727313e731ae78e20f35afd0e254742fae83e3d445759438970cf05d022a1d9dd52556487b2492a7ac1b22533a894c562e7e3dbfc6c76a8b221d0b1f00c2cf1fed714ce054ea185dea247325e54fef412a8d062549355b864c8f7a8d0a08ffd39d726ab482182b046c8587b9145cb53358703c8e7405a4c5453eec57c6231e8f7f4aa002d23bac42fc991eecd92ae51d255ef682fa32928548e93c5297ddae339d779019b22a99482ecfc604b6fc754fbb90a51005b1b254660197d9a21fae421f6082006ab24d2f65ff34ee73b057c53d9da5446f1648c6786a8e52b770d459a596e1d84352243aa46baeb6eb85625240ce40bd2d16f5e27753e527a1f922dd72c63df8ac3ad08e596486811cd900b2864eb7f1bc04056f3d496bd8ad2409c05b0ab60e432a07a6a8b0602cf45d987e367e27861583a241f80c920a69036cb1aef9cc7f2025c4494a888313db5792a6f8ac0c93fe3756dab91afd8703b6d814cce54e02ab0aa42bb138ddbcddea8d478a8e10b521cf41f234277bb6a497e56fb967e0195e13250eea5e397f3375f83d1be19dcad94a35d6049c29cfb097a5da092cd7eec11c6aa35153be76c5df8a4a4fde4cb42347b548244abca4e98e4297c7727eed6d5ac2f9dc801f43efaaf230806b546758a61c9c05c402a80d45a2e3733cce1204f8119d234f1ab948e2754e66c17e6c3836ef4cc8825dd355898805ceeb782892bae2301928b6e1b14eb2a2ba865806459e2d20a4ab8e5a3be91a8f43a745ff08031dcff407ab1c59236ea2614e3d1899b1e62fa70b9aa2d39948431e3eb99cf5e36e8ab4290bc36611ef22ad1058c878fb226ce932acc4aa6d3dfbe1d1d8338ab46bbc768d844a771b3c9399436d4d56730f8f3813ed13447ccd0ad78503c2f83ef68b8dbff7c8c4fcbcfaf11521333b30d233d4dad2cc39f9049ff1a65d17077f7d339b97871cd4905893b167e683e00ad8944c580caed665d90b8791f7960999a67515f5686dfc26d2b111d8a1efa569d02a0e5017b5352bbf885b83fc4568b2066fd37d751263eb2c66736743d369c6a6fb774a4e4fbe0571f5f6d0d2cacd9bb4fa817b6586ed417b9288232bbb301fa159773cb500a0cb0e6096ebcf837ef8e948618a65b2ad4527b7169c6bab5db5a6a51c96badbbabf52146aab685c9e44b12445fed0ed7ca88d978227fcc8360936170d148e20b14ef84fc66f5534388243bebd9934c53e0113f07e6466aaaaa675460122f69918d5d1f094a7502386c845ae85a13b4128661196c2a338051a73ad3a42b8daf5340701413d3bcc49ddc3680fc8ecbb47e63c5cb53dcd8f18a7c7511d01c19eb2ef2688bfb5d20a65a4e4bd8b102afc073fcd736990769d38614cce76b51c6128e6410bb7ee36bc517b2fd1b9508696a541f8b9b90f11f80a05574714824f0a75691c77008d25b08a60f0083940808003dc9c9ffa68d7652a65b94b44ffe961582121c5ae16803fe1a2e63be0a73e0a3d5579b3ac028cbadb2f41222ef4e93c10668d21150fb94b47baededdd19405431aa172a4350b510aafc838a510f4f9da7500df58023a830a29dcc50ba4015b7b0ccd8732d9037264bcef92a4628f7e207dd52947e663d7fb9b50a0740c0ff4f89799c6254f24222bd5d7720475168ad2f45b1c20025f83535df8174af0926c5d8400790ebc02c641142538a0d52645409af89f270231fe2246b4df627ac1e692f97fc98a53e8ce13a5400a70701fd91c49746685a959403088520146004d736e7e6a42480292742ff0201f69c500f9f8ec6d35baf357f4ba261527a3d0aab970049d3a561487925a376a5a37f85ded1dd0d950a439b84cb39b9fbfc2be65cc7290558fdbb35dc4b8e5e29cd7f17522b2ea38c988b7dec0a70127cc0401d4d2a379a6b6a203656e06cab124270ebf9744ed272d3ca0294976cfdb8a765f5fb9f120f91fcf1fcbfd764441374f93237466788a8eaaaf9f8c8eb9cf6fae134faab1588a24eab64619b1e2482e8c42d0ae0b838c91a8eb26610042ffddc627555dce74f166d32ee30d3e6148acce5d426ddb8caf493f8f330fae8eb02646cd08c1c7f34867d4ac088c38d146e9111b8c4f88cabffb81f0142b3ed209661676755a3caaf89cf90d802c1acbb2f8fd4e86709d3ece5f2bc60370b4909cb8358fdc8fe0d005b991bcd9b40b81ade1cf7bdbcc269387f7b596f41210d88e8bac3b70dca50c68324097f985984aaff48872c4845d59dbe2a0caa546e5c354c2e4bc30b77f06d8acae03ff0f556e4bbd7f41f1ef8243a41fd46c5ac02e36081d84bdcc08ed63f40fd2330180ae63c06f59013d5cd893a04a006733c872251fce8c3b53166554e90e5fc5313889020235d37ffe043620a991fcefea23b51e8152297a9783f677bd273e9965f94f47220a2068a5e30dc9726559f1a85906da883db02a0e54edd6804a311f8b6e01336be600d8ab8ae63be81c9e55afeb5be24895424c1cdead447879a09e7393ba076d0954b4fa8ce5e86eddd88db734939c2faca8966c2553515c497d7a6fd17dbfb2268980301b98fdf1db5ca0303e5af5228932833d57a870781837d9c5b3850efcd0ec346f843ae6464888060c03eb15ff171923b1f831338e99dd6c3f968a615ca3bb9daf0978fc4251085df154b3cbfddff0ef12a380521994efc27b2b43aa5805b527bc686d262a9fca7db0e2eb24f2dea1c9d837e8c62b8d21ab7edad8531f8dafd29548696920e286d7678e7e21952f72bc1c64528d955771c72526b7c56c7b59984d2e6d18984ca419e4d44178a365282a5bcc252d06a1a5c42a86b65d7aeb6bcee24b15e8d3b9032c26030a227e6c5a30d6556d0e79b82fbe1a45a6e3fcc81e5759e8c49b5825f40fca90eae83efcce8e50f7ba83fb21895d2c66c6d639007ef8f745448cd7e772d0273f18292beb0f20941e9eb8b604ea950496ec1a3c566d51dbddbdb27bcb94920c070783068c06351e70678bb286a3c608b8481cfcb7f0250e52145dfeb605727327bd406edc5de5622f9343c79056a62317638da98bb5a640d29ae206771cc0c5544b9edc7136f7bb1c0bae2010a494880c90d03384084527982c249841caaba37c53a28a2d366a0a6e10f8122710a9e045173d45dc11044ac26740440642e2a55c10c9972048690c3582c8508b081727284249114e98f822a8670a2023526881c895833fbfcca1699e23478b8d75cf780e4f42044bb4200855b6280541262620c202892e885ca10b1a94529a1245191919993094e84efe528a5f5459019fd6164b88000262b59c7dbabb3bc74852f9c7d425a207ae8330b0c8e2055e1ca1a70a404218c1833b824c5c3c451879addcbbbb7bbaa790a8232d62e48e3fdb9fba10300cc3304cdbb68d6e5ab6611bc5b40cc3fc9b092341bc8810820ed806cc48e34a17295f1aa1caa41ef5c35c0c2184440db0b063c409581085eb07224b56444c2d18b5dcc69c73ce5aebac734e2ab967f0d4d1bb4d8e60e28ecf2df70114954a941295ff002560b24a01921ea80d0f210e0c315405d617464728016212461743b87841123a434e00c6d1117704819260d213051b6032a48b76dab7a6f16baf3df633cd3c0da3d97e4dd3b2771ed6e1c93a0dc317c36c78c0ecf4bc70e072a7154180b1d9a0ba5c7ff92f9d521074b9b308d01dbfbd795087d4a1ea148b233a00a2558489098e68c5b8b2c9102198e0eea6db4629dd3aaf6d70b68e6efd34dcd1a2a3baed71bae7bcdf5e47f7dcf6deebd8deb3379dd752d572481da5914d6734d3a8c66d19c618512da2de77250b8085b300598b7004757ebf4a2be2fbc3e14396651388d7ce926ccac973ca262218ba28463cc4ca9b8ce0498b0877e4224fa789089a10042e2099edcd4dcaa81dbf079bd0478bacda1edc420a0ad15a44846eb9101da1886812a58a88b2dbaf4dcfa9d0b9a353a173b51f1886bdd6acc4ffb48e4eb5981da517d8e54f8779bbbfecb590eb235a08b604fd80b24526ea9fb63f9aa8899a687ba24efed6129dee771969d46f933dc6c504692ef411f6c0420c388671debb8df738dc7f46fc58b863028d72efbbc7f99e7b1cefbbefb9d7e1fdf7bdd7bdf77d96c6b044c5764c40ded8de9f0212860052f41f80ace1df7154b32951a6256256f02011c4d27994f81019d33eee3cf2c60df2c6bcbe3d8b054128f0f7d676c24e98c5498273c2e8ebe0fefbcfe274f62455df732f55231f6198169eb0d75eaa9c86d5e224a9e15e7b1c6a4fd8bf0eed3b8bc39d30dbbd54d153cd73afd9136669be4d89ea2be76911f5439d3f3a8f768481e13cbee239ea97f3b490f3bc9ca75f29e7699f19501c5c71fdf9c85f097a749bf0f8e1fac0e514d6eced06b3e79c73ce39bbcfe4aad8ef903798331dda833b648de9b6e7cc5c4c880200d73f0134352c5aa81a02589ed466ca79dfde7fb71b398ee338aee3e410d775dd776caaa2f6b364974ec256b2063fb64200878180c688b22fccc180cecbb81c9b15bf45cd9ab08912419574a80e81431c10dd8f8d2321f2eb6726705a3c85901b79638230e024ec04098a904792c3ed6d348c3708c6009bd40189f277d3c7a8317d8caf5979f0e57762abc3f4316e92d4c4789607eda95faa5862b41d73ae98f2ddaba0a0368802cf4bf90ef3c2945a554a2515149594cd2b851525f4615eaf8b513af98e108383bcc1bf0b65421bb286ff4a3893da523fb4099d74e929726254c445b2cb34cd63218f91aa8f5565b68f871d5ad4ef570f3f76d1b53cc4ab7dabd5fa7068c142feb1aa0db7b4e8362db696ee9e91b267225e314f8baea38d20011d0289f29dd6691d9ed6f1913766f6232fc9747ae542744e3a9edaede99f6a9eda9b2423100fabe8c340c58f8a5a1cd151fef4370b3aca7560a0e247c5fd1680279c95115fa30cbb665bf2248d3837b3ec4393836808fbc14fca954d5649a882081f2244708208ed1e1257aa50e56c15c68285f71ed33e3e1ed343f56a6e4fb40b4ff46504400b55fb99ceb81eccdaffd5e4c8b65b42bda46364ab8568be6be40b7bc851dd8f4f8b1e1a51c71e3a6a1879c50f4558344cbb7c7e0cc9c6ea37b8e40d6ea2ecfa7fac4a9da89d651d2266910b9ebcdc1d9ffa9ccd1989bfe34fcb5c6600ed1a6ad1c52775b2e51c333394dc143a177b2d26432d1ee2d6bcf20975761655db216f78f72ebdb82e9740b5d89efb9aed39fa9dd5b8df5e0767adf644cd6ca5a067e1c5931e1854e14ce45aa9426555f6271ee4f3db13ff287f50840ef77cec158a0a6651fb763cdedcccdac81afe7db7272a661fcc02f8820208971157304192101889e1ca264758d1c5e9ca26439edc117c41122e9fd60ac08801158a8a585204308a2862832da64084cf8e09282942094552c0c1cf0a0b2b222878e932d69e928a5c24c0084a88e8c0063e4e8c60410c8478b23d0105911ea3a21a1b3b76d0b876d45aeb0e9a1a174dcd0e9a9a1da916d945b383f975c7f72a65a28ef416d9c085c416485ad0d3013d4e19f8dee3bef0fe7c44de6027e40f969597b214f291907f423602fe8861c798153bf214d7556c0a27a115e4c6b7a3084595b652941255320b4f268e4966d6b4c7306ccaef0894df9a261faca6a19a651688beb494d6c005403c4eed47ec4ffccd5ea466ce55742b2975787808248db384018014fdbbef539ee6d993c24f02c08a298fe1218fe42be54a3d28dbab90dd3f5f56b145f1bb6e0c33f9c0b74a51a76ceda0084db05085c9d8cfe777de50846af6fe403cafa2f6c4f6c4bf65fe637dccd2eee94a3fb7b9542a955646d26358c51d246394e9ba9f5f0c464df75e67339aa3c29e850755c651fd5d5a15dd55a948c9a76132ef0781a8a8fece5e7a4c26692701ceca64db135513b350bda945fb4b1e8e6a5a2b08fe8b622a55c4c363c0fa20cbbc8e5cc7797cd53cdce2c0530bd415146b37814fe96f402485a10b357b2c956a98b6d1284fb5f8dfcf74b779d7a60e47203fee7cba7d27bbdecd8e3feeb43de823803e47bb1b192c46aa6ffdc9f8b463aa4599a1ca366414309f36aa3bc8b4d130cd1ca42595fd33fd2efda56c5c0145a4b66c512956ec739f57e189bf7befb9f0d480eebd3fb1e57efb930eeeb7e7ac901c8e2aba15d39efb53f6a4cf516df6847ddffd49c7f7dd7ff6a4d95cfeef4f19e96bb82751cdd67ccf3d676f3efbc3621996e5085dcca399a1e198a52e963a69effdf65c78d2ac0ecf9eb4ff3e47b57df7dc9f3a7ba296fe49b3a70678ff7d8da7fd8d663d7b93a3e23803a98bd991e6662e34d8c7c3494ecc9ef88f9a572b4cde90d75ba9db605d69bd1d91f22efb96569def5d169a5a6c9006e9db43be3635f9da6bcfb2eaa07db6853da473f475d8a82625fd3e0b81ba37754cf7fd75deea3113b3528a2abf25c311f0126696d10d653f8f1ef86d1a06857d583e5a9799e51308486149cf4ae65c69c4485a64398a5fb55551db563a044fb5d852aae4c004c30ebe8b482395851bc06e8f7003d865a14f0a290de9b3843db8efbc4f795298f25d178e7ffa4ec6c8f8b1767f0a65842f8452a24af2575e25ec217fe53b1943454525087663d851fe06f8aabc6925547919ca6b4a09c7bf245a51ecf7fd8c7721f7a490fb2f94cf75210786a08b48a3c5168bea4441a18e20d8a08cd134881a42509b498b5ba83d64bbd52215aa64cbdfae0fb487637245d47e9414dddddd30e872f8a1e6987955f93c0446102600ca341ed76edb6647f99a9426aac90c6328101134c49113a82dec108df81093502255a872012b4019a95f4ce07bb69c485032b30c6c10ac55d32a686a11b41375a4caefe74112a018415526b5040a9c2b41ed47f5c89b54adee034c4af953ce39e7c430ed352929c534d10755bec402183c4804010845c4d10a5cc41d343b7031a1453b5d0a1729bf01cf0e0b3e2d14c1ca29321e57a634d1851458978b3007b5c8cf3ffcc3410d23435ef9b0f888444d71814eba747f8c1630a1cae7f7808b73c8215b29991654ee1f9e4031f2c52c3885254e4c40a243a93c4d6e9a58a6d1edb9ce9b1f0905a5d69237974a95562e954a12eb6e53ad9ee7cdc9cc3c794eaff664e65929db2a3ad1d23263060c308831c4f08f1286e08723862c6adb1a4250658bd2d2d0a94f432747087e66f259ca2a5b2e3fe50277812b265f4a8985923ea1ca679e4a93a8d44ad42a031d7577a7947d9b4fe71c00b59112dd65ce39354d7307e74f9f9aa66931b0d4585380cfbef3a72744c3c8676666770e3b091bf7fdfdb339ffe79c73ce59a74f6f55536db1634451bd87e0da53c1ead1b48dcb9ff2841ae3a2929fe21433cb2aa7753b5636a5b89f7a1150466ca5c38cd695df894ed491fa9c2d2d8a97c796fb2e2d18c6184a8bff9cef1836678b4b8b528796cb727240a823e58e2869b13921568b5feaa923c7e258dc0f1784a4ca1fb99fdb9c0f2785121900a538216abf0eaaa474891bac88d4600a9739453be7f4e973ce6fa9a81430115efe43808b67ac822d365bb0c506354daae80daa3769aa5f9049c93252643a81dcdc7ece4256717bcf17474d8800bd9cac5a448c7064c80e5c5b60f556472561b66bbe729f5a6b651f5e15e1d5f3c5584708eff08a77deab74a4977fbe98190694596cba4d711122828aa0011418535a2b087eed7846d6687f4e808d0d8f229b5a6bb5e1d143118f1e6c78f460d334398a78b46c228b7c34ccd8b2494d0f66c3c8cc6b14f652c382a669cc188e21cc6020b8d5991c727833fdf18072b31f52abdf0e15c3b0a742d4666cfc0003a68ecef56779836358d6ef6d7de80f422fcb1a8e65ad691688bbc546213343d24997ce9b1db3c3bd7c30a31a4a8a012e5ee1788543d1ea8ae722d5520a0f0719b95c292a5acaabfc4efdd2934cf6c42bf6c4a6af4979934a4a4a452185acd2b6af9b21720d659582f4cbc95af3a2f3e4b794e19f19f74d69ad20f82f8aa9d4f5221a21434457300f4d6e9bff426e6cb821ef639ecbe0d050076a606bdffdcef7dea30c790cfffc0cfd0cfd0c4d4b93a3e2ec69665fd37da67df7d3d678df0facda1e2564559ffabdcf5175e1a9ed37cae7a83a86d1ae3f1fc568357172ddbde52b90dc775fc37d87626f48cf7ddb9aec339c2435247b6aefbf10877ada7ba71ada7dd77561ca5f46e847aaf8e78725b459906a52b55951c12ec7dbd3c26bae9eb0a7d3a7ac731dd6d1611d1af66957511612e5eacf321d8f29f1e6aa1e07b1d191ebe53292f9643eefb7af2c968be562b12bb3349d3d65df65ddd790befb9e646f92d4907efb9bee513e4bf9147bb33da954f981a0aa24d9779976f93bd1944ad4d6943ec5de90be644f5afd9aeeebf7dd6bb66693a5afa9f46f505eaa6aeadf90beda93e6bc2961c40fd7e5f24dd4f151bc166768781c1909316ba853a28c987567042395949f692977d460a4662b4d541a79838df888a1c0968db2cf9e3f1aefd4cf5f0a1b95bef7775552e5faa4df41f9ef4b3c3c14fc4e6d6954eca95f25c5aaa8785f0a59c53f822c52c8411cc402681e0fd27ee4a0ef449362bbe93189549ff4a1fc87ddf9a5fcfc70a4684c52423652d2422df210b7ba1f99e396136a933ee5757c342adf2a211b85bdb2a2721151f73b279a53db4fb137495ae53bc5de54476d6ffa1c9516ce4b3d46e5b7edbf10a78493843e4eca93be5b5149f995edb5d2ab9c1a90f2a4af49b1a4a7b6a664fd66a1e90b41314cf1b4a48a797c7ebcea286f6dfd51315598c8a8c148a5dd7b3fd33de4319e8b3d100a7294719dedbb9526eaf81fcd0f470df51512e53f6e05f89e7e277e07485545918e6a144fa54f719cf87f042965249457499144dd911aa3f585dfb3fc0e49aa3af67ac863f8a5e91031cff013c5908e0ac59ef8b3aecfdec4b05cc4aef00756716f0a59d5f298eea156165629650ff5b7dc56d17c590440d6f75e826c285c1f5d87f4335dc3fe09dba759611769b1ab218a91c72e72fdb5e73f02bb3c06ace08b35255d2a77ce5647f9dcaca8d8ac0149e577528ed69f93218c60b8b2494f0f58444d34eb40dddddddddd336c76a80485c43cd22dbba5ec96dd537e7373338b6016d5605332a5b2c3146047883b584d9943142911b011524a91a3cbd1b5dc0811a5d1bde9519f714caf829324e56372009131a28dbcf1e231a62cd08d6b17a255267ba24951c94a2529a5accff2ab2529bff4b54ac9a5147a293882dfa3388a9b28e426b379f00ab07626844e729ffc732e5bf9e44646e132a2147143eaa45a8fed330c87f4dfb35c512d20af7cb9fd33f2c646d242f6157555e5952a923dd1787faaf95e7eed38aeeb3adb230876b7aff972dc6f99ccb22f7b4f93a10fb3b99bbb99a646c651bdf5e08a2abfb9ce825c53a4616326871c3336642bc78c0db14e900a37b5682f6a15b4d1a26351a5a5d25d9d06f8f2ffc84b70643fe40dbf520a71311fa47c85bc444600b47047d066c584d477d83333bf1602712b320c61d06898f1ed6fa3e6c39bf1aada4b49431fded52c0d398e9337072825557ea7e60aa2f0226621568c286a3de26ad2623b91cb5d44ee9260c868b9e520ff6d893ab972e145fe830e6b6961df7561f61ac8b9f4c779b7df68531eb8d75e07ceca16376a47997339d33029be5b208412e9dc1a054f46d4510e25a0415aa4ca163bd06376704ff9cbc732eb9452cfa8539a43a25c52f7ac3ad8e23d7f65931e23779444ecfe5313a2a349d4ec4db68294524a6f3acfde78ff594abf93923bed309f7b1de6733ec02bedd892520af47d9a4ba358805a55f9eea5e6125eec106184f9ec415a74df411dc5eb310c51479155fc60101b1f3f84340cf63898998072d5f6bc70e4f7fcbdef31d35450a173b7e7ee3f2fc93fa1ec348ca9c5138a45405f141b1f47aeff8f86215d7fe6d9993f3ebe43574f34896120973779c2c8f51782c2495163e2fa7b46ea288d6c667de99c68238aa378dd46d65842e52c8f1d282ed451ba687c60921de9d3cfc6207e7987eeb7ef8f01dbb367eb5b15543934f4badb77dccb169f72320ce277dbec0f1f349b37488b2e048bfa2dd640822a59dc0f2936619448d5a2ca1b69c11a54a5e42d300cc3304c629f6158c6853b49b48cdbe416524a29178e41e6f61af65cb803c4ab92f067729399b441260f06c832db833f1b01f71d952dedb34cb340dcc703674d8d3ac99f57da6ae46a2f892abffd190b230d137cfde76d4bbbc043ba296f60179c21573039838c21d5d87ec4810057f6e04a898450d250ca6c0916ce1b05b8fbffbfadc0f5e779fd9bcf80bf73879f92e7cce6c4583649cbc91aebc911bab206a11997128b668244c9922359f7749136d23b5817603c7122515246269572774a291fa13db4c89546ae9c3bde05184f7a68f93930a58e51eaee9e6173baa308e132939a94dacca6cf39312cd3e8d4268d2b3f9ba639273b33337363453a29c797f2479939b339df7b667e9ab2867cbe7da584c9b0e9fa59e9f4b72e4bf9dd4b28556278c34104018a1fb0542fdfbd843720e0151155a800f0372008adb013840af535fcf74cf9d2974aa50e4bef3160904183e9677a4509555efb94dfd32875421d5da777787e5062787e67b0438da78b872e61a76c51ff1b736d51475fb58c4d74b9b1b8fcf6f99d5b9e6578fe266af9aea525f4975f10bf3b60618411461677860ce37fc94eff127eac8a62192f3c16bef002367f0c825d0dfb0dc341a7ed7ec64fe1e8433e526cd4e2ab6708f68c82d195a0b75454e96fef467c68b0bef2222d72490955e5579efef6b463d1b6ceceb0bd7f38b64c86cf66f88e5297e167dabe84277f1bfee567783a6df3c5f0b4d906d8f02f7f72abc306fbf2355eacf1e2d710c5903aaa1b7d80f7f34f86c73a203377bee9dd64fa961f10d9ba6ec7993b6d0fd3d3f033dd08303d0d3d5f5c2708d64d20da056200ec6576ee958085845730ac35718b1a06fb8ee42412c923bd874062c0308fbb10434d053d00420bca3c5f368264d8b4716787d3f6cadba708d13d5d965668b991245ccef255125fdcd185be1613ff7124977ffacfca757a15c3939f0e34bce93b347d0744a345fc1cd57cfaf2e2d7bcbc686f92f8df9cfa6bb8ad7979f1457b237e0d7b23638772bcd81c9576c38f72c82639bd54d9f0a3cce5eed18d61f33b6e86dc67e129ec917dbd2de11804bb8186b5d12b1f0ecfa648aff2e1e0def4e1f0de14929e06ef49df7121cb6aa85574f4d3aea0da22327a3508409f6110be5393c1fe0c9df5015e19e8959f0c2ce13883f591ba32bcfd1943d4175ec6772f84235f0dc46468d6853f1c324ee19f5c5e7e38c2cfe9977ea29de97de5312fffc2c93771a4b9e0cf70037cc37074b1282f23e43ba3893aa6085d7e19de866f437ac3f024037f1fba0ce1c8b7ed0e5aeb621fbebcd35d444546afa3a397511191ab7f3a8825d41a1a6a09b13ae875d43acdd32b9fa3576bc8455464645444e41a6af18a7df88783584242ac1769f4b2e1061ee6619da3574a46b66eb0217c91df0eed42f99cd4edae61c30da10d618d50740b44bb23df0ca46e67479a3bd3f6b73003a9eb1f0e6b7da4eebffc70fc87618fb7a71d546ebf4a0f94f7d37c218ee2697da879791bde070748d50f47f1fb00a47b074895f836d89b1b1b47f1efb0394e6df8b1de10da30caa397972a1a3f4aa31a2f55228bd6beaf1cf410e53b44f91ae18986c69f3aeb00a9a2a17af9930e56bd3cab5e2cf3388a73541b8a10cac710b692216aff8c8661c68c193366cc980143c8338c00bd7ca712c60871b0bcf0624ae6b7d79e6bacb5de1a3c590db32f846390ecb2bce9e587031c65eb9af857e44a1739d8d6f4d3f4a61f53265fb198bec3959fe108b27c7f385658be636f25e41b83c5da76d277a58b8edc9f9f6612f692b05b28b65961afc22e12be40676c56ffe8f84ec364fc0008bba771e0af21e457e3c08f0a3d2eaa91869930cdbf2273fb573e1e528e5c8144fbd08b85ecd33e2d8afff2dd32d7df578ee2ecf6fb68b1ba4e143aebe341fae088dbb67dd86714efe82b77b5b8838af9e0f2b793ee27f286f467efa261bc5ea798af7cd5ed48827ad53e3d7d74f9f9d4df3accda94b05830b75827e8e8c788574547a94f69cf2bef9e9ccd40ea6e76a4b9da7748d92887bc6d491f0f1f08238c305c57b3982786322c218b96ea25942a962baabdfcce99137ebd8fd4edf71f7d18cda0426d23db462df2f798965f5dc4f0aa6ee4e58b74015e5e9edf9134cc1824bb403caf12ff481740b4e2b34fc360f6d4fffed330410d33edc99f5eb75dd422f746032b862ce17a93e97a09db49d81b0ddc1e81c8a89d18f1ab8ba6a8cf6fc51144eee83f97b9a8457e2e4a69d1d015300203c241cb8fd7ebf57abdb4d798eb5eafd7ebf57afd78310fabe50296f6da8fcceae8cf34a93b21fcda4aef23fb5cf96a1ea397cc8bc8135144ef517e67fb12bf3c86a8755e1cd7d913a358e928cfe224c149a97fc37df7ac8d5b16a7da9bedbd47b1cc729493e87f5d92ee202e17c46d9e4b2f0de27658a66194a4dd2eac23b36cf6fe5ae8b13c26250a892c9125b24496c8326209b586888a8ca815ad1041ac3d213c1e60b369e53b9cf6a8e44d7745bd6434320200009314000020100805c341d1703420d176acef0114800a769c487a589a4a645192e3484c19430c2104100000000800cdc8087600182441b004c98da248b62d8aa5a8b148b49afb95321df070e5c15cf422f9c1be91cab235b29e438f13149f61c748c21bcc85b2acd24753d303ba35e43741d0a445d8f4c1a948cf2c122d624100db97f89486f31de948ccb87de1bac978a916c265383296dc7cae9af58bcc7b6ae59367a18e38a412c8733a17a5c635820366acdec1139fbf44dae262a8370882d70ddd6e0823a0540ff42b69c6c5b3e11b3f488470085a57343e344f868253ac582e8d0ffb5722f49ed9516c80c71e658d5322565998be3d2ecd7b0817b223846096bdac1062450334cb9a7241de62b34af70af1e49363b2916271f9779ebbcd3a986dddb7d511073b1990c508987896993c891d2da5240ac6f975b8b385fe56b6f9279cc46c0bad24e985418070324bf313955555fcdcf6440c576cd3c3b05d2780892a32e1011230e5ee5e92e7de30c6653a9dd503fa588591dfb6b624f2971e8ffe271766ac3db6d26d5bcf28481b3669b1403457e443d1aaac91ecfe42c692c309b08e57febf4b17840f575523654fd792cc7d10a375bfcccadd94946b8358381ff1fa747eed43563f399918b9eaac8230e8ea88f3d44ad2de264b85c22949686b98fc289e540a63b6e787830b41f0955aaaf98ba69827ca6211a72362698fec2838ada5f9bd248fd588f36956e5673a62a2dfb50dc1fac1a21c6879af4f6c78dfc590b90d87753080297297822543b1d1b146555b23a3d103f48c539ecc7b5e88532edc6250b935e5bc531b598e5041a486b0d75940094976847470daafca48231f80237d2b55df6621c5206a9862aa2add0a8711539ea8da464adbbdda875a7858efa3ef9bc72e98fe001e5b8f5a6ef0a153fed70437c017b650a6d851c42ee521b88ee2e5f595d5519cc5ca87a5f39385173229ccfc5cd21be6028c4cc8e444cd2e9faf0a2f774b06374530e0cf5737007b4b03b81f36f28101598c4cbfb6da421c4c265728462c2b08ff1a0d9f10a858c663e950d9a8e9af1fd9a72f72fbb3816451fc630d2a673f87f7e0ac9dffee5604e966f0c8e708c39b32aa9a87d7a1d431930ed06982ff82f200c10d53a1f368271dcd01552769d180363fb619058cb8fc97d0f47e077018d58f93120e71e03f73fdfa4611a0b5f8a073e70a4b49e4a57668f14a676774ef585a8e710915d0191aecba24e5687910e3aaa8618ccf63c3fd104a4f7030e1efc0ff885b494ff46f73dabfcb573810e967fe86dc7323283d53c91083c9cd1585034d93f498cf6f67621fe0eb992e8fc1871c039aeeedcc96a1099049b9b3d06a3ca027736a0b2972c3b2ef99be9b5b965119b04ec03ee9f4c5ee74a2883c05b8459e71856015914fb16b86a53cb83622d36808338732217a0121847426d6b37fc80e6b2a39c5b542c4169a6eb605cb6d6cfccf7006c2a4b3f9100c2d8c7968e06beaaae362c6c309e06ec310544e9124fc98720a4bf0176a80e2ea3fec87640c46d4855d5ee6547c5a5255c60558827182844f0cec7b4752e55e65b0385775aae5290ee4fef55faf655d96aa12f5eb64d0562c8fb315745d20d566fbd958637d98108f1954005db5785e302b980ab68be0210c929d85025cc690c88344b807ed5d21c9b786166011b0887f17cf159b8342b9002a839f7ee257e23771d4df9d01016881d5fc7884881ba35598017762ba99cb72979885fcee6e634a643205733abc18feb519f2bb519249fdadf0ed48d5949ce2f6b07811eb30d338ee53e62f42f547907d7b3b3ca8a5b2fe5205c03a1ccd50f1a60b903c56f1b08838cd24fc557620e2ea6f9cb2ecd59b05c6241f8d21ad4c7c0451c34bdccdb00e87532520578094d4e6e8863a1e0ae0cd9d2942de493a1fc4e6a864ff2a56c399f132e6035b86fba790082b1a27f9c9b854e828303550333e6629038ea0eee9b38e25a1a4ffef07aa350a63650f4fb993ee14a8aee5f3a79c84a53df839515d67700d0f2eb0b154d35b34af5815a0d42245e6f90ebdc23180a0fe3f8f19138044caba245260d25893285aa10599ca9a200d52f64474dfb639260a53fa1747cba7806c0c2e3734bafe470ddb864e7223e12703655333c09605788a0adeda2e56a9d0d87daf9216b299bc0588642249ca0e21c94a315382a855982e5a55c1b028cfd08d388e7dba17887accf62fa4ebaa6d65550d8bfe96449eda3e1ecac400fb9edd90c345b821ac4353e8396dd7e0ba61283e78b60fcf64062bd8355264bcc552eb4fa1d6530e676664c58eb0f6b3c05d2ce565579212a6da65c170de14982636a24d98bc476c0a695f93132a281464c73990aaa039f83b036869cf0224b0d6519475baafa99554db04b480af3d00090599336e31388b8e4428c5b94aa736065c53f8ac5a22b5fa5eb1e683dc3d518ef9b3cab9486120528c92895133b1e39589ae374d280720143f59bed48c59068408a99292fcd51c5f40d28f03948f9e72e95a807969b9d4d94621385845694e8dd90416163475b5de4644e01009b0e2ad1ee37e6ab4673b7bbf9959d0a7ed1ebe62518af508222d9d6a3fdb36381d442db14ce03e4dfc8fa78fb5f22b814812a928f3283d2837ad5c67d8495cedbab9c963d439ce0968438cf040931b88dba7e23405e5fd69d24e3113c98773bbee5b956e4eb621676214ec085158460c7512d87c64b0f2fa0696b8e381db15b05f996816d14cf11a14d39960ba3220aec5e8d99dd16e9560920143264c4e70d5ae0d0df80c5caa854959a3180b76d4fd152fc7f9fc2e411bb0b4919eb5d72578d94c454886c3abbab7697138f6a1adebc054396c003074bcf229418f736d50d75a9ca3424e33c35c9571076263c41c5c393b02e8afa98170ebccd1aaa37fbb17b653f6274836318d1f489300dbb494fa3a883b422e1b730207d5cbffe13175bf2d36d005222cb99d0d43a760e71d7de80ef7f0653aebe42d5bec2445f48f90d2f8822c15b0662d89406c8ad32fe047ef12a6841bd9f358a54b738d097fc998390624bac334437432f74417b19a84639a2fd2a48b186740397b7eb850277ed32339c4fe67f02083fcff500704d5d0ac931611f026404f6d9007b1e1332cba0a32bc3ea691c0c424d30764fa3e432b0b2042fc28c9c493e15a0698ee7c7684b0fa99bb1ef09ae1176a065e78be067f7f591f373ad9f29de83b1d2442846ccf8265ec7e9a3625786fa920a15967dbf0b16ad8dfbbd293447bd7b29ab960410229691c5120a4ac5bce9311aeba1df1980b28cd63ba3cad60d66b3ce01d300c9c4142065b8402b516a25e810c91300e112b49f069fd801b1b85a5c0d58a4748f0bb6673d485a28aa066bdc452427ad8b68fb243f742eda43485eeae73fb9b0cdac2517d0db53b6722d27a2fbba9fbf77e623437e7b72c37dce92429447ad724ac1f2a72ab52d6ad19b9b2b7c4509f9d6bd4189c3ebec03265550c7781179d67f452e11622f9165b3f9b508e54c0baabede6d20592e8ef3fe72768db5112dc77cff5bc608f4a7144646c32ad95ffc8259e171655692bdebeb734c1aac664d4638aa00aacc897578078d51cdbc9435436e23e7b6026b378a75cc0ef0285b7646b5226b2847f845bebf7e69089b2a77622eab50ac8f1f3de8bf4524c3dde1b4084511b1ed25b10485c3c96ffc4176d3459af6fa9999f372144b77c1aaf423e35bee1c38e673eaf3b51ddfe67ccf1d5e3682609e18f17a1ba06f6579efac242b31ebb9ef9f32b888393d050996481bbd94e9945d304d3888391b55b230db575ae67d71399b2c851d1cd3441612a741099ade38c17f0605f1783b0f831175c19723f18fc0519fe709262b2b01eed083d51fefc5989a0d0f634c7efc9b1d1d1640672fa84b10dededdbc7e1e3630bff5bbf042c3fff4a5983eb2290996da1c29a4e14d98e10852c71a9a90f516ff5c03c506a304d1ac1e123a9fd1a16d901b90180000bb2ad10d23dea10da0c584ba60af5dc83478523d020dbe0a974bb27780df295c0fd903b9bd633e657208608f4e2d2943d248a00c981e2644b697dd6b4b02f8cf11df7990cf23d659819358a7e55a79686c915b16b86283e940fedd584326fc54134401684f54374792a15f19c6ad9dfe841637bc3e24ee4744eedf0be26ca55f507dbd6ea7d156b41d8631ff87e2a8dbaea100b44db2ce605de43c5290c01e54a771678d92e1b85a106be42cdeb38e795d9a860b7c6d0b56476a959a36c8bcc30db08cd0f6001696ffbaeb1cabe0ac4853dd4cea7316d9ce98bcde2ca76c04731c44a241651d6c4a3a74d791784713f47f8a4b7f1ea4db078d58eecc37e3359fd8fc40714c425106954a3af27432d671c6fc3c6a33131040316ba17a91e2c66c87c5061f240fc88cc4fc08872e814381ee6c952592f2b4435f20dd5680ff35199669d74b092f53529541da42e5fdf952f040c5e2c3ccd11901ced00b28a01ecde61d5ca56163f07cd18c1ea013901079e5d13b5867ad5bd8164a219aed6bfb8f52ca5333a8091227753a0277c87ac9da6cb38025e0e301824a7908e9ad472d67cb338489a9960e5a9428d0df1441073783a6b5859170272080433590ff328f64b82f019fef736a4a9dc8825a7f7f7ce413f419c90c01e01562fd71f763dc22e23715c9c61db85b1f6b87251898dc413fa6d9d4af2534f57039225ace8184d7e9903733570f28d96c4c0da7ad81c81dfbc4ec13543764692d59243b419dc64ff68e8f142283c98c33727b37b2c20e3ff7617f8ed15d2b76c093e0234683d4fdd2c049ab8c8d339d52c4a6bbbca5926acbaaf7f6e268f649357d9a100871ff6042e6bb6c503a4c9ba4c08ff2f2af85d16a1a415753967f3728d6c4cd1964b5ac4f82143a45204fde9f2dc112b8569ea02e168f650610044790cb6fe276b1d2c0ad7039df40c3375bb79fa993f30e6d4a056853859ead928453d4849fce0a0bd4f28218b4437bd5e3a63ca4f32af9fa1d0333f64f2595382040873231c14bcca3cb3158755424910b09cd3a84129a1d6284c5b0b834d964882292d94391b1d2547e230fdc5d0043b70a65a61c5b58947f8804b25d0ccebec840cf2561ba01cb8e8789a0d1d3435571574dba56d2aedc943307e0eac61b99cea495cab8eecf0eb2457fc304bb81059532307c0a219641799387fa5751d9f77df1777649c989643e144627cb506c33b47a3427a11edb371b19346f754a1465843ae8457e2464483e0402fe34c62a7deaf78124dc7daf47fde3100311419304eaa82aa4dae7ba97c039c41241051cc3f3ec381937eb4ad5834b51d392b5ef67e9a6ea0a89b5c0ef7e3d25821b7794aa5c511d850a2c42474abfaee8539cd661c1e5f2caa4c5e12d932016267f2e32ec154298cb95c7000e4d4725b3c813e051d0e05ff53c080aac0e94205d5e44a2604b8d2baf7fe6c1a75b6cdb9df1c0579fdb14880fe9991253bb40d8d5e4929418666304aea96ded23c5143c98d681fcac2d3f7363652c75a59026e928bd6424ddef2d0f9ee0754cd1cfa7cf0ee1764574acd8da6726a9c62e4ac6247a587af136ca6059b5d038d71e584b742728c4252b7bee0e6e25ede342dabbc722aa48e99039cbd07cff46d44a7050a2462000d54793f0c0968b0742d632d87521180001ad53e3c32a41294e70cb42e808e6b864c4aaf973ccc26cb0323644e03ca1a759c163ffc8d903c2c3a1478b66a5c4499b4169d5b613b39d0b02eb274ecbbccabc3be01e2546ba04583bc74484b3e956dfa96579d2e37768ae7a1eb9702d495fa08251037257fbdc7c656e64a31f860064ece85866398e2a0a6bd98b7d0036d87a64481ae62e1910c588974b135244966d22c03cd4d6699c5e2a5821c2c291038878f0fe2dc7003e0f8181f14ab403b46d62092b408455ee8461531428b0d13fa192888658c1514349c7c984adf46d9c65cb1c3840339b9510c89e21301163724370ed0d31607c99a46a3ac31f72a265ff5845480d15d4c82d849a4db00fb8a4cb045824b60f36c13b3b0cb9047a53caead371a7c7fb2c8a86b1371356d4a5754e6dc46db1689469d5081faa054054f698b94e164fcc727a77258b4e217e612b490a26a42c28961a412e67ecce07135ecd2ea2da22c0de08fc1fb162a1671f5a442b90babea1dadfb7dee6300187b8ca4c56415c3a01245f54e2c6dc7da3c5e2e9c11f6fa87ddf5c3d49fcc6a04f6a580c4f52e56a49bd6f2332fbfe68720dd795300d9cd0d257272903c58bccf04a4a0aaa82a9e92927e8a53153d8ee15feaa354365925cfa557d0ed213ac51784ac042967dbe2852563b167fcb061cd81121a4de16bea383c3dc340e99a6df3746394c2fbcae8ec1b8da3fa37e3a640fcaff7f14e32236445ec9c89dbb8d10a354ba0443c55cc3f3729380a6570fd30680ea99c7b168a1c9160ee009366eefd1dee174a45dc3ca7ccc5f0d1d1907b585c0eb24fbfa3b1dec35f319df9c377f733dd736027252d52d2a4c0581bdff0abddcb13a7e2a3a8f181020c6d95263119dfeb59e14def650c1aa603c5fd0f5d1d5dd362131f42f4fd63b7417b1a6c7119757e822a5a1ad33dda18afa686e651544f2d0ad474e66626f54371caaecadcb469095bdddb204826f921f4185959d3fbdd7bcff658801ea612d8227be7ddb15b73788949e31e208a0379b8a94e11bb698bbb276e72d158ccffffce5ad35b36689127d1a0ed25aee1724c3487d3b73a13d5b642c90d2d43cf15c3ea55504aa0ed1482e2ffd4174c1b50535a3f6e85fcaaee16e162a448e5e083a343d10cac3bb868f358be7d5630c2a5b7598a06589b5bd148e7bba63415809070a54573d0d7b9a4ee8d468d58422d680c2408770b27a0224e9f0ea560dc9c3bbd5fc21f3bb354324eaca61ba48fbc7980e1f8fc8ec957ee873cf919e2c858434e7b3e4fe710daf07ab263f0fbc03bc711d0a560fa2d14a5dd82d1bf9830e4ff41724bae4849b2eb0c95326956422aab488a0835054b344de4fe5f92f99cbf98703be2f1230dc0ec535571a3f8d14db669656bfd01e2136acc3f095eedd4ce0b68560f3e9144fdc7e542abce59916804707241c2cf4300b2ed3c8ee07a84bb175e63541afc93600500626cdd3e70836ef5d7f68bbe80aba7020ad065fa42d3c7130a5bee7240a58340539abe45c1c2f6e087373f8c4b3dc282ba93274ef2bf10211f504a903e679100b494d5efb9acef81565d34085e4a32e311ad9614468880aad286cf092737191e5736931fa4a4da502c16470335f6c0ad4e6f6495d71c82ac3530d6c1b0091725a2134d3d04da4a4ec074c1f86a8afa57eb898469f104482e90cccfaf73feacd41fd1b9fa3ecbffb7ed77d1158c31942e46fb29d3c2bdbf4f6cf3c598146c84b07fb4ffd0e87fd33a82453d2ff8612a0ee0d55dcd0949525b151000e41362a93c4e94ebd712ca4df295d5567b5e6c6d60d246f355c6800be6480bea2911e6281d073377d893c7341d36c744fd37ccfe1c1787edddf18e76e342c3b24e0dc5f3e68f01786bb2312f225f7f96d294c5462a565fd3cae8c6645cd2dabfc246f98d9cc602565fe2ea48861e0c51b975fb71aba4da46dd98f9e448731350522c4abf7d90adad0c300306829670fdd60d63a82f6fedba8da18eb31d2f26551dde6817456adb6e9815ae4f3456c96c3e5a337711ad6ab64d7a4dcfbcf76b60949bb409a85539a7345dc6a57146bf1a1a74213100ee35c726cc310e194459c97ffb3842abc5fc0f41eb693acf5da5e3b89f7f27655406e9e51c6b0240cdaf175ab1f2f6afdf57a3f9e5649a3949ed1974e5da5872f293b3eeec930467e48ec4c56b8b69bd188aa30698067909d766a94b8bcf50c4dc84d3f6e711dce5eadf1b5bd837388d4e11242253490683754816ed0bb08beee67509b927b767751197d0a3cf0425666519c196e87b82e61bcb9e24463be009d0e64f5496c196d90477695705833b3185d4815e6e24e5ab326f9984af16c61769882d4bc464ce3ed359de668acb8f61b04bf449c9a81b4ec0cd36d549f82b36e363577906921ddc02459c937795d3d2a4670a4844c40d786e4b10cfa0425e1a457d42deba4cb454d8b192f1ceb01b9dadd752d49b72b64f55bd6c700aa58d090e817998ca2e180146372c3cdf1eb49bf0f99c11fa923b1def54d380d1b663c96df8a98189596840b17f7ab164b06f849285d9deae7f87b370d110b0eaa11ec19f8e969d53cd9d49703481086c462713160004b51a3c3bcaa7d745e288eea4bfc886c81296a1ab96d1acd7828f2e3df291491e4aa64d1811efe439ae7536602705ba93c63cbe24ddb59092216f7378e0033b8cac95f7ec1dc83abb91f92187ccce987e7fb18984d119548607afa39880fb4d4f80463e37f2476b803821e4df110e776aac31628f398d877ed7ada77865bf78ba29e2cb53b48ae11683296a92534c9ff79c29dc8e06df824831f028db41381c9c0157a36ed8c7b057815fc639cabe07ee4f7b07587d519c6bfb75df6c51dce18559198bcc5a342c29786aad8b6ddb3981bb6b9c993d78c3693b1c05496fe328d669c332b06a4eec74548cd6ea2ccb55fd734514722ba90248adce6882455c51b51dc140ad21ab2028ec816f368a0c7bf2b9a8f32035cebd682d028d3b2219add54007684473a49d523286656c80d7d1f0efd0567e83f325bed64cb666f17d96baddf5a4dd83b7bff7fa604792e65221db60a074dabfbe95057b0cff65e37ca019f9e93ce8e6dd088882699302ef700695d153cc57446c0eb64f6f6d61f5930337975e4c324ab457a8501b6a48ccfe445d22a2d6f15a046404ea5cb3b87450df3b2214b0f2ba0da881af61ae5b4011d30284c770a0d16dc05ab80ca64c244580595da477039e5f34d382e51687ebf45e47afce54e130dfa91b1dbab875a5b9e6819462d42ea92b25eb0074a5ddd03dcdd5d887962f4bcb37d66377d2e6a05243bb0342b73529f650591408b877bf493cdaa35aa9e9d215c2d5b51148602e6ef0cab799edfa790578b1d1a97983ab94b97217078a48251c7db1d091684d911e9b29c77c6dec80066c0c335fc856159fb0550eb28e89461088347ae9bbdf87107c83f07adb9f5142317a0910ac036e463e4b7b70fc20b3f6616de6d097187ac36789f2d4fc463517faa89c20ab53460f66f85700593798e429cea70dfe757cc2351be0bb62645bd1eff99bee492d00c1cbdaa9fa27fd897e59590ab9d7e99a353aa436b8e6b668bd8bd64070be78691d6e22c0d7159e431eb8ff1cbfbb69d332f151744d4419e96a501b8001f0c6258a8c157f8bd3614da86e41cbef0d5ec06993ee3b32d20ddff4fce557d1444b7f81fbbf7dda9e38e33ad8e5fbfbc59aa77863da368832fd68bf5abd9af2b8453cf59c17e5b16f9a6f9af50283cd1c4c0e0db15c33eaf26060a6ae0e1d228fd7a9e5af181178d2d0fec2aba475cba6b9398287bac80902094fc269e4fb5745a2a7e60e5c78630c5214679cd2e5ddf8fce8b40f041075a7a1561b5f6680aad4384aca803a921015c652150a5883b9c06fca220227711748235896d87e31d930cef51e51078885d20b37d49add42b47a8ce7ee77a9ccfd2c6acfee382a8d5f5edba4cb73111b1eca4aa853e2ef4ec6335b74f56467f2c0241101b1efbb1092e58db85e43370e5f3ec16eb7fa4abd2347276899c3058f3d8c55556766f122b334d415602c1cf63b0c713c90c581618c52620d9a6dc9a438c98bf8e301e9b093858dd7e4d13a83dd48aa24c0564131177a00129774a960e8a77f5b76f9a2bb8e6816cc53fb866bfadb45d3c4e8b7b8383889cdeae41479a6782aa127de0d79149fe8795a7d036394e0f0492e1119b7a4d219b7809630a9bae3d16499d75fa6552bf49a394d9cbdfe57dcd534c6fcfb1e6f982c2028c01d6732f5b84ea6372d5581bc1c80f8f22097cb6b18ad2015db4ac46796cb1eda4fc15794254f7b0d81ad94e0181a5ce1507d5865feeb1763f644b60e9a195576ae02f0b2bc6144f0cc3d927bba5bd65f48f85c467de209253d8e4607a15b6dde23ea026310abf3ed46ee5c71b079e7c3032009a6ce3ba22e59c00e99babc1f27494ba573e11ad94f99bc312e59ffdf247da66b67c025562b4fdec2b26a4c1bfdfe09f1a7158b8e749e054c6640fa656560d4d0752c40acab2cd6e9d8f7d848742b818367513ff5f2d7b5191f535896ac74189b61f4fc7407b0e972f77c48cc6fa4982d046e03cf5bdb7b3c4382282aa96190a4d58e2a38bca920402ac204c91c0592b06e14276b8afe26a09f24136949675a27bd534e822b4fe5a89cbc84ed2655a6a9c28c4197f391c39b450d51fb6587d6760c96c88ee0d9865e3111a0493b44c30b303b12c0d8bf3b9088217bd96d663eb637727bc188b0381d9aa25918b91fcb68b40cd2281ac5e82968bdfc9e8c6470b28a2dddd86ff5d0d4b83abc2ceb6576f3082dfe56872ce30693fb5914bbd000f22cad91dca535fe981d7aed33357d69b69edb96e7d237ad535f1f668e34c78f242e19155e373c58714c4e52c77bb9249762ab78ae7fe0d0a42476c45cff5ddf1244baa280c6d5c799a53b1fe48e6c40fcce07d644a41a86b751bc1333e0e42a29e3262e83cd79269cb432a038ced6bb2e088eb8f5f077344278c8c1b7825088e88ee0c1a6fdd90962b004df0139b6d5b1cbb5afc4b98a0392eefb0853ae6c8ce41a1c2878dd2dfbdd9689cbe489a592e4e2c0a1b2f8fb1e246a8d01e34391c35d9e398d2021686816038bab3885908077bd2d34fdd06226dd2f9b0b9ea515b64841f012f0fc954147b05b9ea7417ef0cfebb8b16233e16cdc2c74a8b3296440be54ac5c2b48cec5cd3e16ce4ff616c3994b44d02c7d95186585a15432b162856750639048785f777f14b4bb447bc50b646168c43d2fecbad35b921b4323845ae21f8c159d7c79641e8297183e05f0e2a0980d321630b317ce6511a15aea79281fb2421eb835f896f4ce3e7dbc92ea702678f676828a9bfb14ef42c934475c76f51d420cc5d749b638164fa0663dbfc11042555dcc494d7b91918fb5c7f9534df11e02fab3ba553e36b7c7821e0a46f4c5499400e6ecbc356e15c99b4ed04b3169a8bb91bf9ae11221a206be3564438a27f5e5420227a1e3e4048144ac4b3bdf3909f8ba4b23b1689e94dc94d38d5084ddbe5d50feda1f289a7d19d25e410070392a2deaa8685f9b6fcfc5a0612608829736725ee4c67953fe94506e35baea4e58a019603eed6b88d7e8c09099ea1fe11d2e859a47e99e95d10bad335214348073a3ebed91c22946c8b77e4c134954e863413c7007133eaa779488359afdacfdf8871974d653f910bd2f6f673811a590075d2826dbee34c304cddced43f3e1074cb0235bd704265384f8f002008209c6aeb7e911ef7206e284b18b012f3dd5c21126685a8e1970a33d0e36235005ebc55dbe717118d43687ae92bcde045a281e0c0e385ad7d52985333fe6f0b6046cb737cab739174e84ab6d448b1a829c5d1208fae256de776023c4712c82d1b28f24604602b6cf07767f1670f15acea0c70479787f92247bdf013770546626324c0d8714a5889c955acb54462d8da51953d7d61aa6417c7e0c94b7316c05f2479bdb09a4d722d860fbf1666a5068d161cc959bff61682a022f1122d97d1a54eeb3206fab77ba92224f64d260308731f4dbf58a1e5e3f9a0752b649924d060b725830495d6c1bf91a1a3bc068ad4b42a9777a43bce10a1817a3438d1e1e06f7c23601d09291a8b02e340ae7e14cd715134984d0736f7c1e04c83434a2ae672979f33792d7f2580741012a4192f3add55b442592c4fa2ddd4697cedd08f9e76fc0ed2edfe6e2139c2f87d02361308228faa113e4475e308f5a63da2b9f39ed315cc2d59fc417202973b678ffcb4854e40af663b0427b036a11f32ccca609586dc8593621255e5a85474cd7ddc519aad837b26eb2d9f79f9f2749d8510e4f4cf423d8c312159e4dd85331fb8b3f2c89272eb6154f7c8147707b3ca19bbaded6c51a5322f81535cb0094ea00cb1a25f7863e90f3ecc16fc4bbc500548342a2ed9b40c89c3104fd7e27c353a96ee6ab3e34eedb13750749b98e1aef7c9f6ae96a57e2a0f408125bb2b3db534aea7982a4e026950b6c5d60b3da3865728851bf89b911ad4fae15d9033c858cc29ba37ca5283fb580dc2e9b9791974d58be8a69ee59bc33a1b761bcda116b36111743eee43872fb3cd2c8dd1e7ec348142df1c61b75aec42ea7b6c354f2d940064961565bc349c82843f1749dac83fe6cb40ca40849ec786a4e2e7521fb3405833d9c51e56cad7f6b7d8782d359d2bf591e629e0faf0ad660f069175e0e4d1f905e28d3b9d9d2a2daed1e3c4a56ea02caaefc7c33c05c2c768d04ecd26ac9872c225335d37e26b9be66951c2468854f091ee4c569d129816edcbd38092d84599a1919b2a9c422e9432145c4d0fa9f3c402837ce757d2cce431d3f330aeed24e9c96ac3817e02a36b8bd787857eb8ac2add06f7ff5e458fc574c2242ad7dad2443e688ae1138281789a9d21d654c689caf4a6913d75b471af2348f2531c2fa4d6eac406b70559c48f6c3b2092157494c5e723e28834c28d0b9b14007640375d4453d65eca40e7f48868049973d3dc754a11913f14df421d3583feb5fa5eda620fb1cdc6aa89c2d1b58a688f054acdd00c5270b31da9e973bcf74e044198604c4a3753fcf8de11c92a2b42f9974cd8a4300d1a6ec47611f2238ed2ae407e48bec3d5fdb682479ab5595c52fbf646947d20a88f05707dba370b356b2edf6eda1d872ae6645fd25e10909e4675fde81503794bc219fddc619d9274cfc0bab8c612a9225c6f11394d7e095e56c04d386747a86db9009b7f2148e7a7152153875e5e3e399bca0341419448024ef46c8ad989501ce65f8559d7366734c621ee29e34cebda786e8e4e031bca51e21bad831425e5969d63d7c7f9c4973ee335653bfec7f6c4a98223bde8e750e306baca600916e157c2762ee389c13478f62f7880f893ec322013b1fdebd3fac6a3645fe90107f56b3b55b2689cd928702eb2cc2af7757cb5b259c672f4a2e7f1a1ec57420d068cdb2ad358b5137f0bc4e41cf6af5bb59340d08d6351c89bc90029c69d78ee1293fa0e3440e7bb82bd74002b710c9c8a35cb113ebd7ed85306664b087e9c8870c2ac5527b7ea68b75390b9ea002f138037c044798397585b455d994a640856b05da4da55609456fa932a6e2eb037b68c14a75985d4d4ea47aa7bdf6ae0aaca9e7513ecf38c77dce9b7a045c478a4857bc2cace99dd8234851994b3509bc534c0c208868056d4662b35233ccb4d1a26c25a71a68fc7fd21b0bc2ad0dcc44c8fc2f8bddcdceeda1ee25d483b28fe20740a59716bbafaf3125f766c68915bde0779eb3ca2e03828b85d857596f344f2b5b8566806c850d9f78c2328eaf93964751a08dc02950078b4e05750ca924fc35746117e88c14d1be9ac7c1628445bf6b515426427f494b9b82f72f74349ad1fd242672951c2b020a6702e83a1f715c3358a933213f534681526946d08ffc180268ff48a015f094c2cfbeb311d13cf7c8010bd3d61c66ee15897dc91743b2757d036bf2343fc8a64d014de1c2ded1187a75312bc2ccae01d2cb58e0aded867f6cb7e46e63f0b98fa80d2213181a76301742f04d7909f66b0528b904d57c486f4b2f826ade02d147dd5c5748de205b710fc0aa22c74d00dd327bac8a953f5fa76c380c43665c5e304488a1a91d64c4540f79f969427bec25afe7007b13a0991f0a3b76ed52ec59ce505d00faa8ae0db3d659c209087621dd1f0da8dd7c4ef5ea49667d2fb9f5bcbc6586f28221ad8f83e59b5c6e458fa9389c6d274429de404811c6d4810cfe0625fd3a245670c5faf2f16b69bd4014c35fbb368756e5397887e502c3ab7094fb90f5e2d364de5aa6c1461a9e0c2b9edf97c87437e61e652f4df38c6f6bd934d7a0f226ddda96c458e9e367f4c37145de7f3ef7716bd5527eff79da9ebf38c2a207af41c25e732e04748502d3dd0e95b43db8ae4011c85907bc0a357a388e7cfc5d7e3d21b452e02cf155dc8c9766fba76b77d16a101415eeb23166cee650fd2c8c20a4e57198dbfff47d0f9bd5ab4b78535944f828e8ddc47c15f7c8801355f4a2237b1a056571eaeaa32647f1d89ff5a73e414a5ec9f44247833f588501287174d2e12af0a6e6e4d16a4bf782585fb53d58885c08f8d562f5d760bb91e01f3ea095682cbb13f0b6b35bcff95da3170103728737b83e7ebbde36b7d3dd1597c5d03dce93e22f3d7ba31226f70778aa20d4d580026297947a2a60e4ae516d5543b2f3eba74c6d00c59dc392790c61129382b70a31f6489ee1074c742d1c72ead311d44b96187db790c82f31b5b59118bcd1533dded30deb6f22fa9bbe6c2feb07b43c9e20fb0d481c1e1e735529a39b8e18fdfd2aa86871fb60cdc2d7359034d46d95d00b6dd41bda9f62a9459dc8c3396ac21778a71fd94fc17f3ebd1a501b1b4979baa0fa57476895c774bb478b15e36876767229cb1c60165aba275f4241d3712a6709410710f79f98c723d31b41f569f1158fd5298a2881341a0895ec018b1ce11ee4a8cd54d4d8391923b3647f7662ca697cc5e4e7a338600369e38e8b164a434897005cd20d19c417f73cba8f034730586c09bd59793029e1fbe9ebbbc8c4d290d0bd5018702754ad23a4d94705e5182fe3f04c335e3bd2f2f7e5d3ef2fc7fc02f8adeb9e89687ec6aa45114a2782faafa69a932656d4c3877f81c79180df89b0cdd27a133d9f29634fa6bc743bcc0b0632d02ec29344269f3ca90587ccad0f95e173a7b08b47c16b289a086e8e5a267cf2edff3d574032cd2b18ba6814a30e840f2531662843d983fe5acfd46cf4f98052520b1ed4d4c3b993a4adf63e6377b1bdbfe9c33f6caa2ef61acffc5d3791492fabcab904954af7c9173951e3cbfe6e97c6c215d88cf85696d7d7a9a40416ab5b08a836d7127885f66b08bac5e7ebfe8e770d2c42403daf8981aa4630a9efbd01ee1508f507d852c36c98e3cceacbca59a273e50b355f906520ea5f88088f57f81c8f493ccadbc4b5d8e44961687e9db62a63a5fafab09aed113cf5b3f5b442aeb8db0defa25a9cdd39394da32816f9f866a7386b717a396cdaee3de84f3b6d99d155610c05cdca257c715c701169d99c8e9d55f641a6b9e7842ea75ae774ed20ad6eeb309cc3f00ca6ae3388061a24dd6e08f27fb08bb1f107b5f716e17f67a6f7e2079345ff7f26a9f94d6ad4155364bd6aee126aa80761e828f1a354a7b239328198a3e27c535077e9f174101cca8d8c93538859a478abce0d69aed2352427d347ff1002fc13478cd76285e3b627829fb42f72aba821122b4abafebbaf7b4cf5770c1ae6e9e6f48519493752dfb506c2372e2d25ed97b08805ce503fe36d1a61ad3157cf2ca5f8f1ca19e3f6e102b6c21319be3bd4ac8e089272af2b4546189f2386088957448812eb43ddcc860764fd1d27a60c2d2918ab81e3aae47c3bcb0675f4bd8944398e1cc52f650c535e282177a29cb57afaf68159de60a6f83f8be76e293f86d1024f875bb73f385abdbaccabbe293077e85732891b2727c50f5ab9c5b3dbff441b2c6096b6f210f9cd46d44e408d795b1f2439a2abd522123109e09da4bf94f3cfbc3d98e8afe28f5c00d0178060609f41f9e2f594000606ddc808428e16ee954c60b83dfcd3afc2ff671065be7a62998a5fbbe98c808f6f5f01c162eb73fbb94c95ab7292938e588336e3a76649b81b2c2c5e58620b8822d671d8444f8ed7856cdc0418190b48978f07c65198909790a49f7d132f4cb08493dd959bb54cf5c1abfcb010c19419f089a88b4975faa0fbe294c1a92486ae476ebf858b5bda46c7e2f3d2ec1b62cb8255e69b8c3c463f0e4b135ed0cebda85329b4af49c3d712b5041c5de25d97285041d3df2985007d2e7157222891f965816c40c913f8d9b89f61e919c34b007be7a725c673698060b88b81867b7fabd548b37214ec0b1aff308ad916be052be2e521f650d3ef5d265749ff43944a8369ab19b0f38b41c5f34e1cb7296f93e1868a7f780054f57950cdb26dc58b8ade63e453ab945569a2caebb7c942b463ac74a988c055d3a628b63dce0a89e2b08d1686f0e838769aa450c1f246870972d1b90109a0c34cbc82b86f9861900e278d3e96d6ac4060e2c6d81c8f665da69f12de84f13ff959e4b5dc59288e643fe3d0453d0e3e5358e61f0cffed3aa5b074e11f9382568d7f716fcea728fb00b2be971a25f3ed62548cafc655db2a764a1c4fbeec7e7de6941cbca786fd4ec6509f87e4f5544d1761558431d927fb53a4e670009948c017db101156037c6b2da8fa69a228d962509095222624e2ebfed11ac01dfd5e1391865e6e82d9af42e18144baae540d21fe6a7c821bea880c858adfa9efb0a950f7f63fcb18fc1850897e6fc6023aec9388b10443c4c4b8e660bd926397f0411f1dfe331af408e2d90a00f05186c57bba8c72ef13fe553ef7ba37e8a5223e4cde6ea900c73f9d3a68e8dbc8f29937c67253ec627f0c058eea125ab124479cec91e9676d3d4c2c3bf15e59964a59bf9f9e86e8ed884ff8a412020f84fb7af53a9558b52765538736e558635305deadd104dadb95b1eb312f5450992064979607fa9258a269b8f8652b73bd25ba039cb3bc680be7f17abe9bc4959bab859efa38ff14b8164093ac1a37788b6cbd9e085fea1f8f318d8916aee0c9f60e4f20c18ddaf8a52319b98c01356955a8a7c19123349e9e2c15126c47e04daa2b64ee39cf650a26cad22dfafab16c2ffd7cb29639d241d090ffd16327647a91a4e2b73ebf22522ce255e6500aadbff58ce5f24e555607a9d5d11da54d64350f0e71d7190f13c0964679f688faf5b8bc5f1af6de093c99afe3196255170dd8bf5bb1daf75f89d874a5a4b0eb177ebfb03d69622d33225d6ba29a6ad4f285b8f6b71bc9538266e5e6679d528b321a274d0d2cfb9be0858cdc4cad8938ff76e604fc30a636c80fec66e66c0a4e913d05c54d7f72bb6f7ae72edeae08770f512c2c3559d7c96a24059741c0a0ec815a615a5436c8b05adb8fd8b67283b7b65feaabe4c559a361c733990346850f250e04182be49eb187ba2edb4557ba998a0ebeb7652012678da78075065689315311c5ac9d06f9a259549f9f1a5c814f3b852116ad05bb531ecf5e034b6e3d9a383cbc0354cd72747d3d30732d62666df306195b2d632c06970d8592b07f1c8e575937ed6487bec77575644b75efde3177b20b06a8d4f3376f81e4dc810b58ce94e0c2d5010c24319ebfeabd2bbcf8d5418e7217f9b2ce9a9e0a04957410e6a6854c01d14e202d899ee7e7fbfbacfd0a0fbafe01ab0bd26f65b8e2e4f4bab6db086e30094f74dd2383da33dc96c5bf512a2431c7ebaa8e11b8342c1268009163b59f7a4293513122f7abf075b82ccb60dabdf175d6039b636ae729fa6b4b7ac7287cb6dff1254a95cbfe61e679ac86760747606f5cd53b44e27bcbb1e166247272a63a2df29f81f7435d9757d8efa25aec9cae9724e1e6f2ba3523228997fcfa89296f93890191b30221cbf682eec120a7e9355c8e452127134cecafa2c578925f17677f43d48b6b006ceb26b4f889df708f0cf195350372664d21a0029d31d4d109e076f8ef01cf9c903895f0c430f33508fb9bf9057bb036b9294cf928db6dd8a84ad03920da1a8836e91fed42187e7617c34f8dccb6ff1e58bb92fc810a92d4e09ef87b96a7129c0bdec425fb9ab5c9a00a7d298560fbedae4d5cb83f35eb140e1159ee0ceabc463bf17e2bab016c96364a00db39b61dfaaba0e7d21743da30401275270dc08d12109126625eab25974657475adb8ace9158480fb8244f95701e3a04ade39e4a8383286cf313c764af6e823cc3aac9751823ea13b714514e61920c8264a536a917854ba97fcef1d1c6c4ccd5e7b8b9bc6d6e069ec60d012fa83a4d31520bbbecb61d24b4b2577c1918d8b6a8f51e5466105f37f53929fd65aca14906e356f6561bd7b844681f30c642ca06ecd31d1c6f024f48c944cebb77aa6888b4e2d2738f8242c5bef938e6dcee5338b28f2f1b88f06736d86417a5953042ea9effd0f4eb963676368afac5f2eea25d1a91c98697a0f43a61b648aa14a7313943e5b024d110b57b6aea5331741b25918f9f8adf99e78d46f23c61dfcf0499e30859760410f8512d2eea384822f4183923c4e348ccf24764443c296a47a56e3a5f91d0c82568cf99a108f076b815ddc1f1eb0e438b3ecca681a104c4980e00f5e622fff9628732e26c84353c549d1d204e02fb6a3183e9609d1a3597c368643ec0c53d0f5dd3588bcc4e3b39d8be16a6016a1cc77245e4a251129a6e2bd7202dac2ca6822388d0f23c9378d3aa690245360dae3876b6715e65a0fa717f42200c2d37681b44703299ed987cf333cc02e3669cbdc93bf4e79f4519d5bf997b6fd682ef03e81e3cc3d188431f1a46a5c02f1accb60053e9ca7d828f0b99abdb16a012c8f76c8c2487b7cbda000dd4dd8c70244c5353b46e8759021de70aab1a750b078d11d9abf0dfc555f3d70e07d263a4b38ad89811a6360df6c5b8973311720143ad3b28f8facfad03a3c243f75f299cebb9a5c0a7499afd0371d8fbcc5743eac01afbd73593995bddad4771503214a925cfb80e28c83eb07ec76ad24d128c041d680acb27039ec485c42d28868c10cd3bccef43d19a817f2ba3107ca786fc2f299163e767312f9af907de09985fb2b01195994c87356921667c0f891d2caed5fb43211236188345c146fb7b50df3de87b7b6f4201d7919f4291110a223b97f04b221289caace058f7051aa946a2abbde6835e05ca6c1f46da3227c57d4c5d915124eb4a721e77ea8221210a79c66f68096e293d4ccb95a0368e96a63d66046d25c387c0a4bbe37903c2fe91d1d0ef14a57d539cecfb9a826c4a09d8dcaee3e6ffa4cafccb7fd43a60cfcbd8af0ec7054526f03f904c14ed4f50ca4cbce331ad456feb64c581d8859dc491bf01eb602a2a1589afdefbfd54c1df0ece9b63277ad0bec082f35d444d2fcfdd8c9f4a34a44870fd4252c42a0b44823fe212bf0cdc7289903ea776165775926c6b60d8b58c46664cec84ebeca4a2a92bcc82ac9946efb4094878bfa493cf7091c7d499abc9707db8aaa0a5b7391bcc5291af8f7155e29366eea938bd0c9f4a95449fb8207273bd28224a9a2ee032a9ffe8dee068cf5e4966c2e91d8e93c7722ec010e0a0677aea2750f91537de26cab85b95f09aac1471ccf8a67412fcf2e3aebf90eea5d60eb3002edd185883185dbbe450853b80a6106bad35704b5121056d5e9c09a6d66f688073e4ce60586af5243a28e99abd1a750312a641de29d128a9beea15514997cf89258e91c627adb607b2440109fb3655841de0ce38801686aac058852a89493a6e9d05887ca5f44052c8b55c4d388b3d4669f230bd8d4584395c853bcf2bb2be56db18e0a4f833f15b0406e3890d174e64a8a75e38e342b1a92a1693423c6a61e78c2ee8e9608682250a3eb0d1e1a32e0387db624817272b6164fb8daab66682ba160365df2e79f8068ea12eabac020b424ac3aa0f8c3e264048b7855e0c68dcc8dbb550010ab469c2762f072de1e74794ea27610432091528cb2e34fd42329061d717baeb4288dacf9809479d4dfb8d07dae00c0ac77e35bd3228c26ec5d623fec08d66e80fb4cb7680695f6b082cc95f4fecd7a1bb9792788c2d741f99fbc25a3ad07658ac69d27b15cd7e21c553eabd5b7c1711d0c6e0f2ce2b05c0d7bb38d72bfff6861855bc26431f52394e1b794e1090ba1b01b74233e0a3401632c383da107251ea1d791afcc09fa8403acc75193b6826a562081deb3df61528ebf79c99e0bc13efdb988289f4d2b8267a1b37068d00994ff1a6f037a610a03f89870c1e62600e491c6793380d28fb6920f37042624b4ab3b6ee02b780ec1d8f6f54564feb23add1238981ef53e0270460484c4c465731b6fb9d1856ce044288efee042b2205baedafc6921cf174c368a9a582a57df77253987a4cdf8002e12399ab6e4b3573f11b8cfee5bd5351c898ac9b7754c2ce7a96b47a09a99544ed7ab77f0840bd94dff59c9ee50315d6f27c7e297f623dca2bc16363eda769ce4e798f27026e4406e623a7fd32700dedc6bc4fe74e3cebda5a61f251aa2a97e8e2d958a412bbbdde8b64931f32036699cfed10033a3f404fc1ba7dc4e23b29ff76b46226c56e3641efa05c9e138cfaedd0c4922a8a17af340bdfd826e230b40da18e16e63ece07ed5aecef2d05340ab61ff240342013d007a4413e520c81ba0d130883aa831da9dd9a8c401a7703d689e08c2211e22d892fb1bfa341bc5817604bc7ae4850879376d01f43b702d30889100c628798e3700d94130af2821cf474105fb661c8055c591f8773524001e2f2e2a7ddc61fe30fd48af1a08436c9f9c69aa4c95534a918308455f6996483c96817f26f8b7f9c65dc8a4f7a7500b30cda774ba17f6e1c9f36e5ff8ad84aa3c6c3f6716c93e2592452ee11e337e217532e558a1a44b814fca519df5669b5c1fb0b38e746d083829c37536c7fb9c68ba9aa88a8a95e1a0a7fd94e13d37cbcc65dc5001cc5b56c3ee14f039e84e837ebbd365260616b6a92c529ef4a8d0c570584cdc3e5ec27af74454b0bdc710a42887bbac8b82d869c337733ff36d97f790540f3063d9824956820d20c010ddf4ec8215cfcc2db371788078ba0135f5b711a7034e35f4921665556f9e20f23489d83663d0068edfc026b34ddc2bb1a867870c37dd409fe6d77db4032c482c62b4e464a2c2e247104c5ac8b7b8d77eca7c70bf5fec396a5105170fa7d2b221ee080683024e0413274b60256833a749e082c0735d11c9ccb17cd71eccff104f01d9c0fd54311653551a025379bf6dc7b33970caa6693e82668a320d79eafbec5894b682e32a038c7cb4f5d17526e5a3d8e4344b7e8f4934269cee47ec8d577b9394cea0f909e1cbee48fccd2ead5c9a581e5b8a6e86f4b57d8fe98ee294f7fdd732d6b757398e8de40b3d4773a83ed7d2691281d4d3f714329ad42bedca425a79991eeeb8f61ff012b47723e586cf846c85ab079ea5946f6196e9af443989c7469e819849f31af1c2b641c309b5325c14772366b98cd2a82e1738f18f113ff08a067c21f1f07d15544ccbb98e6c52905a4b7e9051aa64fcf48a375b181230afe1aaab877ac9156628bced312dfa4c3a6c5285d2d4184f3cfdeac86842963c986e57029c6c8135ab6d2dc994679ca6fddea366c900786b4725d7cfe7c5e9a5594856c821d31b65d7bc1391a0c09df7fab113500dc080de686964aa170d3645a97cda7454fd298a5e769ef48a9b09e001b77003a38266981f938c954abc9b1183f8899e16c90cf5f6fee7f89aea92043ec1e1fbda17f776169f780b10bb41f05379c97b560b99f1444d5781b8ccf500e04c214b86d5cd6db28ba7bfa2599e8b6bf236f8cc05582999570b32966ce756f3cd1c1f5f5a99ffe4f89fa0cdf49bc9fe84a04ea9edd1985ac1603eeeeb04854b89d9701160f977bcd85afdc2dd5ab4116241a373b22104bf1b55f8f2cabcfb8d4ea49c6fae0d6485355f2e3d2dd77922bcc75472b9f7f1f5b8d4801a8087d87fc39a9fd164017a1094fe79377cfcada3204b9f488765ee8cd690656be1cf56d747a56d02e4817aa5ef7567e8dfbc4d224bcc3580f0d9e277f3a98f6013b5e39d536aead77ef79ee44f64e8d51aa07f5779a90edb457502ebd81e696bfd0eb0ab2f86d2366bbd3350f81fcf5a45e3bd436989467ba98aa7ede2ec704cbba7202963ccc8d393d65bff8772c7b91ea19bc21096c2e131ec2c23d00a76e58a310c4387726c12f9687b001fcf8cd9510edc85f64f018a40f6a1dc65bed19aa44a30e5cf2f190984b59d8dddab1d44beded859bd823639a8bb79e83c882e260ca30b5dee86950a1e8df32d9ea8b89c57a489572709711a429fe2c9533dd0d4e879de5a241e55a523df1b35ed2d8d5d4f12540c175ba07ca017bd3e5165806d02fe6af20ddaa5d53e51643d2daceb249d1f516386f2f3d231ed380eba71d664b3c832d015a3012fd15ab8db4a43370f1c2817fa996d19b2a780080f9627d0788a48e26bdd31f44968894cb94c8aa34fb6198bff8bcae73c70d7b7a1a1343e2379f6ee09f43ef3b228c037320c5f43199c8b2872f594a3ace929a85687cf1f7230c6e3c62e0b10cf8e9aa354afcedbe9b6f6fd91fe8b9788b5028fdeb6ff9b5188281f150c70c621c09304a72d6f454a2dc962728d6e2e8dbefe77856f0cfda5156b14cabdedd0630a0ade6c191a903764962dc953ae8be92c70812912e0cef254e833e16783cb7592f2f2e800f7f8276d888a86b3a87c247fde4ea2410fa151b611474125a0c985174a4589c156789369d473a5b1b8b8d003c771aab9c3d1dc7727074ac946c67a2289618424d63a1a741e4b265f5af3720789ad8529216fb90f95f4744bd6cc261cb895bf2d992c3cf1efef82f390fc593bdf43809b0ea92bcc97b17d8ccd820e6d3f441550b41742a7d27a5dcb58b2536e760e9b297d6378638d490adb3a6ca7d80854bb7b20225a416af286f1cc862f36566d3c4f5a7f061e29b42172c28ba99a5f626458c202b4f72a7d930ab584e35f17c4009ed6b3918085eaff456d1bbf6096519ef59fdc9df23a5d6b70ea026e022aec9dec93959aac81e223c5c003bc3731404f4376561e8bddc4f4d8985f98eed5b6744d19be13ae1cf69b078e6b893e407898710a037bf179b864fd1c91dfe6a42b12abdf5f928b10905abafca931d9a1248e8c8d078a8b44cce676471c6c3e19212015a09fd9c231e886b15f9a1c564d5223ea03a448fb71b8dd0797666ecc797b7f846c27a28a5733d8f5aba12ded66d134c092c9945a35732d68d56f60faa14c1464b1d3e6358791e65ccde82b2ba74b05393d8d722010090948d2f412e80d33354472e906f61cfd825f5f1cdc5c14845f91f2b1f4fa1d67ff2cf8212a240b77d238594be8896ea2e03c09c246e97b77a3b180c0c3c26373b3e354f12faeb72aabad4c88021b5ea84947ea31bcc895659501c6a39a3cb537fa7fedc0b3c38abafe63a307f10a192360375d953168470d67292a7a6563a42b2dbe913364487e462881f97392637ce4980dd5966a2b5a3ca3675d5665de672b8f68fac535b8ac6b10cc4531c039710476a9c306f10eb8fb7dd199b3057ff95e84ddc0122f02ec322ffdd3e4f77139afd3f01d18c6b8456a34c793f758a3a6ac3afd018ee9ba4877a69464ceb62b28f5ee17e321e6d70d99a92a2e33f06463a2fd0a8ebfba7ba7fc6cc80332c959b5a96bce7969eebcf46c20308b8fc38b77deb0da08176654bdf203ebe5c8b1aa862d7ec4593dff3d848a30d2d823ff2ca704eb4e0b1da82d07bd1edce160d72fda76e6f49ddf60ced1a69f232987667bdcbb0df4d92e7ca083b8c808da032208430cdd6bfa0f0ffc21989be8244ecec1d5cfd6c33a27fae1ead61bb1513aa47b416cbb75c7d54f75a724d87df9118cfe4882f6f0c7123fda9d831fee3ac73e2227940b5c4c2a5ef7b58969d08160c809f7f0a2049a8574f3a32dba72903c07452cd20b358ce9f6794316e294c8000e4de73688a4398e2134531e606009fd216e0524b9d861e7fb5639fab3a970833c0a7fe1a534a7bfcd75070ec06903fb88eb2fe4b2dcf06b288f4ab10fba74a3d7c8794fd17962d53719c21685274e47d3658feb7ff437b2400c156c97f1e8c7198f160e3524707186167bba2317b134b4cff1549b867e74d27141550f669dba8201bb498a6c0f82f31c8c906a1238f19c5002714550e7bc808482c41397e2791c7783f00041f022d2a7662737971efb3fdf94c30055b64122795935a31a04a9b8524f4a592217b45761fff09615413a5fa21c9164327b4ab331a9e303ec550e3220b54b98c5ce4544c566756bb0af560ee05b46b2131afa6c00d13e0d3922c7f6648350e8ce9587479db97226663e2d3421d2f2ce1f0dc7839d20d4b2a5e4445d2b1cbcc5212814060a0246f73e0afb21de616f9174e240549afac89ee484e634388267fe3bae8caf6f4c620eb28149acd42d1dcd5f35202715ab09904290b194f86c77145e8a3288290a76cfc09bf87929c34041c6ad96926e47233b5e3614580243beec89d1b4c7fbe1e2a261d4f3332583f8ab6964f933f8a0c3b41a3254d1c4cacb0504b66ad002b0b08fbff746859bf0f49c7141c1db15c30d1068289caf9848a20bbac1ee630ed12ccc337686f5d726ce3eab620844f429bfb0b01b7bc152693c2fcd74fa31d8fe1b6ed1dfb8816d83c6c310b4e732b7dffea46f4fa7caf7455fab292816daf5654fb64e4ccf25fd3d50a5760010f36441d25c6f39b95bdf0ba81b3b0920377ee9d8370a525c4e9d472dc6a3509c018a031672a7bf659fcde2f6d9e38625f6cb508a62881c5a5cbe6e6878493316cf1469fbe3faa202d4f0759f1bbaaaf3914f7b62c7c4855786d60c1021ac96957b10dd563c7610e3e867eb2716998d654dd382b33040a3185746a7d948d6bc587840817de71d71d88b366053728a3779475bdd80331dc30e1dc8bd5ead94a8411e755cd69409465a355a5be620620ae5e1f51a7075b88af88483970c6907bf41c14da1311b629b77660f21e2bb75e450115d22472889c52f77f82115fb03677732fa112355c7342a44122a1039f5b464b258af6523b56c8701d3dfac69a9a8842e551688ad653b3d512188e5ccdff9d635584447fdb045cb80b12c8fbaa566ffff901d4e05015213d270d2ab9c0e59c4dbc65829f41b849e1f0cbccacac69c04d5787a5a7528981fc4140ca5344b7d2b5f9675766d3a12407dc11daab3006bd38a78a65d60e9004dd3dd2c5d29a98641b2f32559270f71eab4a0e14b55efb016ae7d23a2aefa4ca2e6bea74b1449af1b80197b421c35f9918542bcb130b23062edfd431ead0a2beeedd100d09ed0a57e131a30d87b6c5b0b8949b59e6836b68772611b8d9132edbf1fd3c94e0235a3c444d93a36c60da6d5e2328ef1cdf384ff5578d50b1efa74292d0af5670f73c161025892c42e21d5d55ba456c8a9f43d7c4e68de8100f6616fc83ded160ceaae005e5e6e6544a3e1529de3b6a86f8ce2d169f9a914d2adc9623975263b1e7eed3534fb9bf9b455262beca5a10ff90f959a57950379f832fa57928d43479c16921ab6ec650f0661f1ee5fe701c40dc4260691dcaa2eea9785c74d707395aa469b4f8e6403af327459abcbdb0167ab7e70d843207eae85dae5e888e5fdaa8e2a8922323ba282ca031d14d6144b83f679f8376fab42f1176a53236cdb9c2b3d8c8df69e0432475517a783466f331c156c25a3fe75a88cfc07c7576e2d628093dfa78db36f1e39781dd14a4909b0cd72bc89ebcf1f783634256d5a80026109380ce757534108c7e324de663d73648eb167a8b1e249263c53c26282b39c73c943ba3dfff7a3011f348ac4b07d21e7394ff388a8d54e8c743c27372f0354470fce0f96fa15c800ff3da0a57ca852cc01b149286cf403c660334e2762866fe607bd81ebc05512c18751fda12ae4a5b65fd9aeb62122f18bb9ee1f8b66c9e7e35b21cd0aaa5aaf78f45e73ef7f5ac39bc1b0d54710e718c441f22449da29d54b0d3713729b8aaf2d62eb479644f543bff03f34a8c9ba0496721581a7d47e4d4a2a9661dcc41c5da35a47b945f5d69325ce4fac2b8118c8faf7f1d59ccfb762b408f99821cddf2b0bb43366b1afb4fc1683c6d7e48aa59afe33719b79751bf9cd5494576c29f567e5b93b7b332c2321d67b26ca5d8d1b0a13db2454926b97a06c453fce58a6bfb5908529acaeb289412c7df85d8d35e050b6785ba37a3bc0fdbcfd744973f9dc33f5559fab18165961a019a2fa42d16ba499a891bfc4ae8487f30011f3f776a83bb52afdde0dcf6ca72cb735c53efd3b60dc8f0e862aa12946e39773ff9bf79c02dd2c2274ed0a9177337be89431588bdef523e4a31a0b2cbdc4ad3940be8d933a5b6c3dd4d960b99907c04467adf6a7ce78f64cda4004f3f66d20d97e64c8d156d1b0bfa65ef6231fc18391bc166219940d13a3d97e6eff25c037ead2ebd9b676df09bae1e88ea6c42b434b6618b0896671aaa499e319e2da268fa7ea16880553d1c37db1d735f9502403f7b4d892fc90bbba5cee9de5f11af926740d8c4bf266659c96ab59cf3db33566915937f7a5d0a02da262944ed1e4ed84ad3c410af8a7053edc97d5c72c013853b36d88a5c20a68c93f573f0c583d9b6bb5619193ba452764ade7419ac00636314a66bc2d20d8d2674891c2be32f4659cda48149a9070fec1f82666821f38efdda66682863410cc0ef4d299e1e9f95ebc0a2adc622560281686afad4f42c478982cf99f2c83bb09796f4a62709fccd039ade4698551040cb6c3aa1504902331a6c39f5b25148104d36a2074406a77d2a8d1567d02443a3e6d86553f90729b77b4cb16a8bfc5384fbb228017f43cadeb7a2c5e3e3686b6fc4e4c297cc1d8f7f14b197b42de59652262903fa097b09f4085f6d6ed66cd6e4f19aabb92a93d99ccd793959cebb4d20201f9f30fc97c930f66eda3f48cfa7342b2b2b2b97cbe598989898eeeddeee4dfbc3f0364b26c3d866697f18bc2c1b1d7c6a9d73d639c46914f69276f6babcd707f3de7d5f61254cf930b00fdcf12a56645e06dc711eff2af746e9303106f1ded39e50d849e1d8cdc1569cdee10036336fd7755dece0837c4a2967fde6f5f87ee549aee44b4e8b334e4ea35a9e9cc6c1c7772e0ee5514ee57d74d5422f92567eb16492d7ee126ebad2126594cb21afc95b848d90e4c5c25ea0b6fc2aaa268768a21d2525a5982b4da259346f1e7ad224b2494c22a1e83e7edffc5b3689268fffffbe58b67ffbe80985a374a324a1666d424d4a2489668dee8b89e816cd02299617adca01587f809508ac45146af2f8579761258da49d5e2d5dc17ce47c055e7ddeb747de9847deb21d79bf4ede614ede3e9142e1e47d6fa05c194afbcf2b1d99c8b321aa21a24a97266f4ca1a03e0a259327cd5bf6417d0fe39e24022a1f82c95b045bd20a49cf2fe9cb7b04547268045bd10ac9ab5a2cad1c48590b7e4a474ae79c538bfcf9f7de59e752d2c44574918212f45d4fb0ec4144458214e017bc7296c0f2b7cf972103310bbd6dd8303d27b83d3db74b4fab5d35f51705f7fc5dc129b578fa763aefe9db4d4dc1aa2db69ebe16ecaaf6aaabaeeeee4c3acedf9d53fbd35a9bed6bef7ed7ffeebd13a49ff6bc69d03633f9f4fced57b4bffd2e4c682ea1a4fd2dec5fde57c1ed55b4cf5fd2b14a49ad628c732b06b78a31c69f5352cf365809f3e1b9c0f27be8802505a2849d8b8e392c60526b0cf28b022ed7872f677c81fa52692ec69ca65704453af2a0c24cdc8b8eafe8814d629cb4bbd69bbf0596461e7a4ce00f762d1c38268de491bcb581756e32365e93d657223bdbbd8ed37c76d7c2bc605e2f0ff62ffae938cd757418984c6390d70b9637083e70c2845c1f5fb3cb498249ff12675bb0fc7945ef7d496b77f19c73ce79fde9bf1cbc59e606f46cc39513890e8a2e37745ce4e4106b95545e0b886217518490e3890db6aeac7250b8610ba2d65aab0d4a338081d6962ba4ac234a9025089a2c5790b254c5e4b2c420ca14234685c7245d80428e2caab290030b95ed0245133707851447f5c3dff9ffc208334e80c69437ca20c28ae1c5afe1c5535195a9578c34eaeef53b29e72d4aedbaaeeb9ed0c14b61062638810ba6183a82b2516794e1c101e509203ea62b4366f0188ac3c995a6293686000307f9c41345dc2794e8a17e35a2e9ab7243b625c0a10987ffff1d1a297abf0fec0629e58cf16a3a7f9075b5ebea11633081054b1532100267c368bae1956b2a32bae9e2147336ff7ac1dc08b33ffd37461dd7e6a3cb7b794dc70c4dac06c7622823db1468018338c6a406fc700662e0fd68a001690c65f0479998973f23833fcae0bc43a06362b20e981c3405039380af1cd4230538c908f50bfe92388fc36a0e4a03e38fe1fd2993c59a691758078e987b4fc42f4653b038e3881eb068018618316e83cd8b2a3c4c39d1458cac2f8cb878dd14a32bba2e7230f50616606c51c9620616ca89986ad4e334461b5d6630061854582facdc4e0533ae882a9203eb8a14b68b1890aea6f8c1e98c2a52b003d2ab13c3488a574476d1e84975a36802176fdcb044953178b8c27261e4c473a3ca839436ae2cc30c1a1a9db2458a17788a4bb1e29346dd1c52acc4829046c82d529ec0ba29524a8aab934651b0646e4325892e529648e3a88ae512658d3a25268ac98cad2a8cb66ed822ca18319bf42103a321b0aeb66061458b2861504aa90cc7205f0eb1700e116f0046171fcac8dac18b2e5944b10263e9724a14251a8c748fc2c872258aad8b0aec539424ba2da06ce5d0681053046e5c599165ea091c54582ca0b441e99c780bcf453107134c494edca05960c0a4119018565a08614b220c352c142b3075ca955078b041728520c0520988d2704a228c2b5b86ea942b7230038c2b387ab022841628363aa5fb940900e1060a5ed0c4165c1056c4e149244e40656103ca17600c5571b3312c86961d6e68cc18753adca266289d530b1d432af8020928504051b25460a13192549278d52072a47ce1840d36dab8810ed6c9ba5101d658e28b195855ccc84d71f34147a557dc866c1744f51a0051031715f6ceaff83843d8e2e9e9c90d281e5860a5c872c96250b15a854f6122063c8421f5c40e57d8288068c16b4af72912882e7ad068104ea569e6a36f5da194d2188ee9a2b3a2e2507483274fa8308205442d6802c288afd65a6bad5d5c4182249694c2b0c205926ab3e85aeb03d55a2bcf096e2c32715bd8a0340503a422b8c0c189140bc5176f5281830555457461822d8a9426a0050caa9c968478e3064f3c510396461838090bb280228a0c68f0f402cbf484aab35d8a3119510daaa939d0b0d272461355e975040e681441cd400a24279e8421732bb612bb1d9e70b1479e8062102ff096e9ceaba22e40046e0b2d2a737429a389275aae5b91633c99a24e893e97aec04ce91ec4132a2e1aeda644173c91528bc8ce084f272e0083073592c0820b16396a605b386a5aa3488fc3d2e84f3bf483154d8fa14f62c70de9cb0e34888194dbd20aaa5b7113c0541b7ea0224513d1961690a16599f0c255271055c0b016383200cb0735709092038d2d24f8a1c9a795f903131e15291cf10489398894c0a1882b3f2871dda81383628164bb299e002836a86a30b5c45015a51f8cae91dbf004175a6841438e2a2ab862ad14bd011344bc420609892c5ab26ca19554a5680b365a22450a7008620a252bbe58a2288a8ba511454837ee799e97f7bd32d62a7cb0c18c4b231f0c24dd400e28a8b690208d242fb68a569f301e68fe20a20b568e07216e6128010334d09079151268d626952e5b9c10b9a185644b42531a03864ca448e66441340216a50b0ca2c0a8b20505160932ba22d2082b0a2756a8608e147479b2388f438c4be515b10c2b3034da492a415253a2487d7183e206547c00423625e6dea8abe927715c060f38b4d8e1ca961560810612bb83540f5a3a349338858636a251ce49a99637ce18239d14c9e39cb18b92d27ce3c7a71871d377a54f1be79cd3bd5cdf9a439e47b99453b9957d0904e4e3134e0178918e8fe565cb876c9414955567adcb262d31ca64316f6ba57b8c4f69b5361be988a4e34cd2b1288627587e0b3d1e4677f729b0fc283d8784dcc919aa68f3d5c4686664700c8cebf86c2e0cec7bb9bc2b659f0e180934823ee5527766281d5f89c9e9e95e4a9dc86f7e84b35731da749c9452aaa4e3e36ad6b5dd3be5bdf74e4a299d382098f143df1aaded2ab536d3fc63478d9e303dbfc69af73fbe9c5dd9cbd1ce9a8c3416c989dae7f4bc0a2a82d042ffd0f1e30ffd5728a5344819e2e3e1fd5debc459f07c2a3c7fceb75df552a594d2e5ca4b4d5a92baa17ab1575d4e39addee572d7bbcb25a71c9a585eb662f0ea72ca29a72b4ed05daefad473af9b33668798dd5dbabbbb94d2dddda5bbbbbb4b6a9371f162c41f94e622d1a76f4a29f5392fad9ad61a033ee4b5ae4271f15abd9a3cdd4b2aa9282e5a9a962492342ac2f212b73a2239e4b5ae7b189c06fb8e4aeac8901e9dd897d47d259a351ff2a28bc1dc49ab57eaa1c4a32ae9ee3b28f94b57be4ede5816713aa8a82e4bbe2cef4e4b7754d6a63b391479e4db40d540c572f7f56ad662e888e64c87751573f7b01d579a47b41cd2d564f19033404818980c96a18931c69aa7711a9aa7a9a1a9a9f922e8efe0fcbeeffb093699f20362025c9f765f9f9c16b94039cdf5d2e3e2b45b715ea896d3622f9f6e39cd56879c36f3f22b91d36a5e7e2dc2312fbf1ec1f6a73d2fba5eaf04f6cd1ad0ad62a04b399587555758a06779d1629a35df925ff6dc1ad8e70c4be5e2a1a45bd556872a512dba25e919a8de9f964f41cf51ad15e0992b547df250fef34c917f73b78d57dcd995a9fe741d996c4a4a698d612ceb7ebfa281d4b1a68ed9afbc9881fa1510a629e38471bff22b261fa8b4ee232a0bce471a598020228b4d5e28b2a4df308ac4e0e1dd2cb068fa964a09e0a0c11b666c612be24b1952dea041a3ab41a0b0697aadb56f9f622b91d0f60905505c65b16544d30d482c19da4289425bfb40d6567986a61f9fb072f7d5f2fe20c33da614a1139349f1e43c116a0529723c644cb79c78e96582cb0a4c44edc04b4f43e04461d3593a43ca4d16a59c25ac23d911ced0141d505cdd0c81b361c2c9b05041448d134e3ab08c0125d6f46483c5ea09cd95ac1a2c6f48998922177302458689a689208ad06ae20920568802d7c493d10a4e543521b5c292ad092b29474dc4f143961343b8154800e544929193134e472b6481722237c40a501c39c106d20a4fd8989cdcb298a64059a1891c53952953283159a1848d098d2a2b60817a62488915a6c8fa59185fbfc709bcf1f4404729275efcc95adb597b7f663ca777abb5b63ab556ca18adb5d6facb7e3fe39cae1748ef7c5a1ace9afde8f33e40160c9a3c8efd7fd24a6d377fd6229208959b721bbd08122186a1fd7bf8ce06c52051098f417ecf6e533d2307961f279ee34a192738c618638c31463c6767abc80c55ba6de49cb3ce3aadeee8d45eebac162654ddbeeeac1d15a2738f521983dcbf5e8e31c895924e710d47ad594a094775bdaaeb0695f2f0baf5edd2ed5c7a2c425f7e916e5b1d8158901ff8c78ff5ad6b9aa3a5e00b1ec6e03ceeef1fa55aa83e3e7ac69f608f87a1fd3e5e1abeb2fb020c1deca3c5ba9776b5eb2a076260191da5ae9040efdf19ba42c413f67494ba028503a32b4eb09296eeaa94524b29063cc4618b8368a7095b1da594ae42a5aadfb192a5f7fb745d7c28c38ff165f2822956b035c70f54bea06470b99288ca0f301c1530716bc8073c050c122cc04a40f12d9104eccae382a6b78ea6f9e884a60980a6a159c20d4df332283e76b9c9c8e8ada3657e47cb10d132328f958843cbbc4c8b96f9775a944aa2c115347ba5f1c7c084f0a763627ac7748c948e914ac20b1da3c4113a660631eb49f3d0302ee80b892268b87871efc5d6fed05b47db1fdadac758688b33a2428490ed8e88d2751e71d3f1c64821af4c1f216bad57a0ba2883e82a8a8c1520a952bad64ed75aab9433304032254130828a074688a1e97b30212aab3d60e98a54024ddfc284e8f5a9508090e2ea86f4a8b18aae654815b185c4a4eb7f58651ed6a794524abb809206a594d25a46ad44d8740575ad8f91d0558a883874fd2ccac0214a0549b4808c1cec183720accf100ff48e0d11c50efaf804322f608a68b04c08a728f805b71921c08012d306948c1029b8c128e117449912e2063ca4c0c4950e443ce1989a2852a10d5b15505488c1511852aed0f04105ac273680b8923ad2eac18683910a2f780aa2480518dc92d8410537aaa486b85294759b3c11cbac5c4da92a32b8b19ab5abb573c2311dc798238a080cd3718c39aa76b4e0191dc798c38d2730d6718c39e6e8a46c40745d4c568322e7894617096f590d969ca772e0025b117a3f0b2420aaf245f63ba08e523639ae5851b378c59d38bcd8e6276b8ab00364373212aa4a7e117926d484ca9a505031480122929a7f491b22cffc1db280985bf69367febd18cb64ffe1ace9fdbaa6c1c0148841a64c15a66fb58409a550f3378def5e8ce50cf2d7a534f4018a3d0d0cec93cd4c23936f4c86c9b04c43a7bbafe076282ba379632f0c7d7ceafb15b29d4d8e729e59abc04e7d5620f2cca7c19c2fa198a1674d8661f2c4c8c0bb478f58c4ff36e3304ae06e3556263e936ef9fc5e2bae7f5d3048cb2ee7dca7a1d337067ad1d9bccf8aab04f9f72d2883f43c6b6df5f296f63b99bb2a68aecba2fb1cfa1189bd2103c797ee3379e6cb9f5986797038fec63959c66d49d4f59f6cf70eeed741bace0f9a39fe3474fa7397d205b8faa260f793daefacfd2551db2c840679d3eeebbdde163a3d8b4843a72d189154e1858c456c56663ec8af2bf4017aef6f0c0cecab385798bc7f873eaefab4f3e9d73d979e9cd386e1a4d23dd35067728e4b29bf2be3d687ce0430347238aab5d65a431c253063054b344022cb9e208a2732515061230643383175b1a24a0fd60469784d6d244d1a833966004713eebb8287ae69a9de80c50c95a62760a888f1ad11078d91d218a5554a29e527a794726ef14a0188123e2260d2f3e9ac0a2c9f32f19ca66fd478a3bb74e965af9e276f76cfdd5d26bbd77b9a3dcff3269697ad185c26cbee3e671239e79c93d2e6b725715a4ae939dd71f19042794ed328b1a571c73a01473867f599021ab5b6db942e9374fafefb3e49743bc2b9a2cc0695f362787d361096e1628c9452fa5198b4535e74ca1454c919e3cd8f70324b6ab92dc87b40e54459256f3a242e66c55cda748c53331fa16011484777f2a7486fcefb82f9f396e9daec1177e4383fc4c9db6703e98993d974d86c319abc65fe1763bf30d9366b8ea3389c0de7a2366aa3b6a7a7a7a7f7798a4fa10f106ee2266ee2a66ddaaaaaaaaa9eee7d7a72dcac51dce4f1c7385cc5c9701e3ac5698aa3a0a4b97a7918e9c55f8c917e4de65ce343e0b9700c8ce7f2603039041ae6611f0393a39615fcf80bf6b4beb83e6aefbda74ea31e7a395ea22f4b7c81712bf58a3bdbcbd2fe2f204ee05d8db427f995d7e2a4a2994a6fcfca51c233f2bc9b1958fef6b2aa9117afd55c6e2b5787a894d76a5616a5b2cac2d2fed4c86bdded46916e34e9b6a49d3669a75a288dd2fed38bd7ba3bb7fca794d73a2b2ced3f9bbc66af16ccc52dd3e4f167ea611ae2ef5ebc6673f568d63c990e8e799677c3c594b47763f29ab4f73ce90ae5dd9ac0f2bd5cad59b666d5acdbac79b7dbcdbbddbcdbef0f43ef76f36edd2d376b372b2b9795cbca9ab59bcb7559b92e2bd765dd66ed3231dd986e4c4cb3766f93e7c6c4c4a43d44c0047c842d51c0bbf0416e75cffffc3c0c4ce8fe64ddf3ae9f7781f78b1c79017cd03c02464d048c5a01e06612b3d0097817be06ee1a8cfccf13015d2ecc3e0160f410e8efec8d804dac76e5fd939b587ddfb13c9cfd0c0bfc3ad2d469f25047801fc00d303579e8b380358f02fc96691e403dbf7d7678e4f7eb1e417a78d0e3831e15d703854fe155f8d71f4d1efaa009bfaf064f0009f05ba6c1ff48c803c825fcbe3a7ff4dae73479e8e7117ecb96fcc65ac9efab5d559387be8f8fbe65497e63bd23c2efab773eface5326700b797b929e7df82fa7d9d3d92320ef3bfb03e48d676f809793a6ff9a9a3d0b74f62bbca6349d7d015eb3d97f307b0f661f64f647f2fed9ffe41dcebe276f9fd9bbf206d25ab3d9ec51781d7d4eb39664f604c85b36fb13f2c6b33721ef3bfb12f2beb31f40de78f6247c4e9afe055d55ae357b3afb11f296cd7e49de78f64a5c559ace5e68f649b29ec1602584f0d143a0bcdd4acf1e065b1242feaa3ca45fc3d4b34702c6b4063faa15c420f43f15c40fe8f7800909207f531ed2076d80a38701c83b049af6fb9bfa174ca8f6453ec284887c840915f9081332f2416ec16bafb5d6ebf923f7c811ac8ff41cf90b36893d37040b7ad6b3d6ba7efe7ad7de9ffbdecf4798d0cf07f996873404f087fe11fa46c0da53840858b578481f08ac35b042ad81a72dbb9687332c785f230f1663f390d6240f6955ca469a7ab0bda367bf0da0699b054dfbf9dbb387e8fb2f0fb604a65dd982aecf0103c36ccf07f94fdef7631ec394dce77917683f68c63019a2bd1f327b20e0961ac85718094240a9abcc472de43b1809f867669ebeabca695848369ad1c09a487d412f06a16f13033c7b20ff4d5100e47d41c83e79cb2a6e7e809b1ee42079cb80f4e819087b0f8c9a07643244771f82db933a0067901c80db7f80dbb9ec8033501fe0dec9e08e5c407047ab07b71cea016e99c403dcd26a07b87d48079c81e6807b0707dc91cb0db8a3950cdc724807b86592b41a8a7d479a3e0d48c3d4f865f25e127513abf15b21f28144eaf0124b1dde8381e578e4b41cfa3b1f98635f6afb5207503af90e264491bc3695a4e9127dbf72ac98ae539e6b84a8bdccc473ba3e0c56c2d4a1e848579f9a357a9fbe9ec2d8dc88d26f2ac3b63cf4b63e35e8bbfe662f874dd80387803e67d0230ef44a61d6be33220ffd34a6d8d0f465a029a5f49b8a41685013d80958939c8752bab136e1f737a5e9081ed2d7b9c16988f26eba83e9c4f2762f3af638cf45cb2be729bdc9d1c39cbc9d49d3b731306a1cf0739e8217702f5a06fb398ff3364a1a98994f07a594e2dcd0ef6f6c70fee62978738373f3363836363637368f033699372f6570e8534af39d4444f2be0c4ee5326142f549cbab3251270fbb260fbbca9423f2f0afd6bef32e5da6db749d9cf67df757cb7dba5c9c36f3dd5fa81be53499effee6ae94d368bebb9a87d6e4e99ec78edf1d5185f21087e6e0e0dcbc47a92c5a7a4677df29754cb33644ab9a7ad0dd774e4ed3d27dc7c56b20e03aa321dd7d77d425758f73436127485d2f2d6be9ce86de2d0fbb0ec9c3ee6f4017d81575466077e461f733600776499d524703764c1e767faf64dfc91e2777ffba799b9becd9ae9687332c52871038e307328571fe86c96937df7d6d721ace773d66ed6b7e873a169b89c562ddc76cdea19c877eee4e61fa339946bf26efd095b40d48417f721efa3d4077721efa38a037794897e4dc6467eaa27b6829ec65e0ee9a74f73cc0edb93d67a03a06ee0a55b5ec2aa5bbc7e09681c9d4b1bff9d83b087b1d50c7c3ee73c09ddfc3aec3f908b338f2a5952f25d531f00253dfe497b5dfbf3efa65eb7a0a5e20e6b40cdfbba2b0d2327ff3b11ea628681fe771f2dec0d4346f1ddfc46a9ccff9083b41c7d730354e53c6790ae274301464fee65fdee7b025aeff6664331fe41d91875dece9cf1becb7fd4964c13c6f45ae2778763f73ba58def66fece7fcbeb9b17ff3371ffb20ef6e4ec3f9ee6feecd0d51e4c179fa2f1cb0bb811d9187ddc7c0aec83efd0b13a2ffc14cb041c7ba180c1e76600b6ee08ec869ddd5d25d11cc7757eb7ec784bbaff9d853d0daa7a0fd9bc7c1c989814dac8eed1aa68ee526728ea08973f3b8e69bc83996d83c9df91b306a990ed006dc354c6d7fe66bc0263637b19ae66b989a26530f6772fc3e687ea0f732e07bd83d06651e761f0376fb6ae5dccffb57cc699b6feebaee6df7ddf79801de9368de9cb63da2d9c9f76e37dea34a0f4b4c40e02a8d454c8841809481a5def1ea2d1069414e0126b1084d841856136290fa229c10e3e703a6efae1dafa628306bb55edde6b710ebd75a6bfd0da42b926ac11cfb31a77ba9bb778139dd4724393681ebdf7a651f478137d655de48805fd7b7b9d6fa32a66e8b57dcd91dd3f524cccbc6cc3badb59dfdd97578523ae7906064014c1203a600b6f08287315060c619165bff159bb2bc78a8e55bd19d2693873c532693eb46afc707ebca2ad6292c0ffdafacaa2ad5cc754ace39239387fe9b06d75158c6649d528783890377dfe1b0340583ead60c546375c1fbb5d31e1f6b46a474ce499fdcbd830962c99796ae8e354ae53cf5ad9cb09ebc40d1addcd05451d5ae46ba4ed9c000d7e94c34ba62b9965add4a577ff22829e90e363d1f7ff73d9ebe5eafd824ba5ca0573dcff362f4cfde44cfb2baa2f1d240e9c556116b8a8a52ea45fa519f6a32bfc0b5e665f6d532f356a76291217a7ea5a24c609b1def27f8f33dcbbd38adc74f1ebfe3a7cecfab1dcafe4bc2bcce05562c0f41b05281d50aac57350be40156adaa0376360f73bc5ca7d6986101efd0cd27d311fb0ad6a9786d791ebd8649d27b6edfd2f363e00c1456a7768fde3e05ee9ba4e76318590c1843c279388d3c9cd5eb5e89a4ae7f45e1d76bfe7c581486cd2c8b55e6fec5e54a05d62922f01681f7e6a191871ece3be461975a8d1c69e2e6b466e8f973a9d65a2fedea14adb94e5124353d248d171713b89a2cddbd7bfc88c0d1c2e8f8027b464ebb47481ece4b7ac9586488fdfb2f136cd02e97d4344bb226e7e9bed3a2bb7fd124e14fa70a03cda2e097f71fee9df6faeebb28a7c57cf75dce69f8bbbf2f3a3595cb41413d3d3939c9246db13cecba305243dfee619f5bf0b0fbcfa51e06c460cc9327b95e95c8b978ad2a79911b39129697adfebb52b1c1e050c4e5bdd0420c305431815120ce74805c16527801f9aed328cf179e2f3c5f7a74827438345d8f62102f3ea10ca684ea09840558feabe70b97c041be22bdeb91bb2dde1c92ae55221f64ee40d480c955a2e944390ffd3d80095d290ffde6b4ff073edf0e9f2df2f89743acdddce783f6c779dd7073473462bc3ef880a481f767d3f1e93ec6ff6c5ab67a84350e4c490f5d715558feae375a3e203808009000d01152a9d4a35a44ac7db6cfa684769b8762d87476e4e0dcc874d8d4c468666470a703c3343d4f01e20496ffcaa935e7523ea3fda7cd69b116a7b29cca69512a0a2977722ccfdaaeb5e710ae343a396d7b94f6777f8f92ba26a1b77339616a03b8f1a4c46a27cac2a1fc7f69d19f9afafff7dc3ffdfd39f3a3ae1d769f97d1ee06afb8b3af4d7b7525af8f2f96c9708e5cbaee8acb91965b13d192cdbd2265ad21bf8eda5b6fd6c96ab14f968b85f230ca43af376f05fe69bfb62ac78ea1e7e8eed2dfc38aa915e931acb31fc812aebfefadb5d65a6bad33cb15949c36974c26a41094a404494c48c19ea1e5bf10e5773dcb74099a312ca5ac99090c2f5477f74b03a517c71652f050babbbbbb9be0a150cd49a0f0fedff11e39a5e5749f59e6a19431c15079bdbc498b377918957cc9c328b32b79a863bbf7adb51f342de8fdad31c829b5d67a2ecf733ee5a22f2112d644875722b5907fb9473dd04a1d3ec8ab6a3e05c302be011f19c024a6ed7dd7b5765f9de43d90494c4992277281989621c91371c007390d11b88387f90e3e279c08fb3585dbdf777497344dc222a7757494c2a2494b5de1a4a3d4154a427494dae2455f24af0d611132f3d4c8ffdca38b7471b019bda9541445ba7bcf993cef635f0720cc77f0b48f3016b0cd66b321914e7cbc12a9691fe4f6de6e9187f412d96bf3906e79486d9f170fbf2cab2b0f29bdd82a625179483deffedcfc4d359948b3277c71f7e81eb9aae490cfad28c6f643e461cc90873f39c6f6f321d924e10ff793bfa3189bd3963cfd9821a73de0e9c710394d84a71f5314739bb521e944c8d38f3972da0b09e734a108c68f3c9c728f924ffa013de721fd1918093bfff393734a9891e1e785c8c096087921ff9ac230128cfc8e8f8109edc8bbc9cc1ba9b2d96c7a267fb6979687f48580afad37f0be475a3b3ece998f5746f636fff3354ffbfdc96a64329b1f598d0d289bc1c6c6e6776cb20c3f7ff58e8f0f721bf0e76b40d9d730b5ccc7efe41aa6f691ad4827496efdbd0f7df4e7a4ffc70ff910fe83f7e083fc8e9f79003c08eff33a9ff3387ff3b2dff99a8f07789b37f242dec73ff8ff3cdefbfbf6757c81939c2673505a8a61729a92a71fd3e434a1a72f874008fc47f551990328240efcf33287974372c8041bf4cfd04fb6591ed21c402b71c8fb0e797943de58cf427869cb5ba6636cc8fbea9811e48d758c08f296e99810e40da45d20c8db47bb3e9077a85d1ec8fbb5ab0379cbb48b037963edaac1755d1bc85ba6250d79632d352067c8fb36c940fe3090b74cc85f206fac8dbc05f2be9a878749de327d4486bcb13e92f7d5478e54206f99eea140de58f74c20efab7b7a9e3281fd07f0afa3222f81bcaf2ef23ff2be11c81beb223f246fac80bc65bac887905f4e48f20779df04640f5ac85ba6f107b947b316009d37de38286f99ae0f80bc653110f27e9fbc430eb24ede3e61be47405e00795f0dc485bcb106f23708c85ba681bcacf607c8fbeadadbe47d0d9037d6b5af61216f99aefdce0a795f2df346f2be05c842f2c62ae42dd332efe373eaf154c7a790c1bc6528e48d750f02641e9fd30979cbb40e13f22d21dbd70f8823a40658848f7ac9bfe4b70494da0646c24bc7276128003d0924003d7d1b98d0922cc24798900830a118807e72c5d92da7c99efeb539ed9ffe1d721aced3bf443c9ed63c7dcbc542396de7e9db28a709799a91a76fe9db29a7fd3c7d4be5b41d4fdf5639cde6e95b2b7b65b19c063ebd235c4d1efa23b8967dfb4aa413f03acf7d21107b783f07742e38a05bd9c0846ade06d64488876c87cd0e233e7ede881123467e8cfcfc783bd75aeb12f29e15e24d211f61424268997a783f09b8634940222f04f4a51fd09d768c80cee4a17d1fa037ed005d8b0de84f501eda07418ff2d0beccfe835e659f87fd1ad0b36cbe245e0ef20e6ceee02f98e4836607202c0610e81ddc9ed443a606a4e2220300b727c52469fa234000dcb7e7084f275d31b307003d092200c56042f593802f7c0720ec1d00d20610f99bb7c4e92b8b74eeefd8fdfd697befcb228f4e0f6452b5e7f5e40bc4b42b6f269a494c2fe085b7200cff8209c14083eb05fc2be76a01a5b45f5aae2ba7d14f8bd3624f257ddff29a2399459abab0346ddad23d74946aa2d23b5c7a53fdf33dffeaf1f540f2f9a5819c817772c0c09fdef4c747631157847d579a9e115d47a926264ddd2acb951c1dc04e98510681a3545394eedec322c955a524b5c56afbaeb89ae434e9b428b585c869514a0bd5ae4bfac3d2f45d8bfec45806f651639a0f0690ea068051cfc016f00c001d6b3389e905e417323541f7bc2b88e779aefbde057b40196e663264870bb604e687fc0c1cf212c04798d00cfa69b83ae883dcb33c8b767f7ffafe7dea34217f1f3bad277695e5c6155696cb1580f7aaa7f77dcaabd4c0f7b74f51d11f3f5ce03641d3e20cdc54cf5ef3eb71d89222ae3bfbd97d216fc4c8ff805bea9fb781a180fffe87f41d392d3a6d86f33086a0ef8fbe417eeca8d117a6ef54d5f73e8d458efccdfb75f4c25de1fbfb75f4427ae14400a387b39c434208fff351cffe08186310235f03432184fff96fcac85322dac80701411b790f8cfc07469e8891f731f220187900fc8429017a23477a401a9890ab276fa98fe4fb4173f6f303460df4f346be48ed7bdec84fada7a6a6a6c6c6c6c626880e0f747ca083880e1f1d20e800808e6f4a874c2693dddcdcdcf4e0e0e0e0e4e4e4e4e8e8e8e83c07ff7204f8017cf606f8170b2bccbe00ff4d0100041f2279fffd0ff20eef7b90b78fbeb30ff24da990c2ec5120c0c7593b61f6267c9c250c60f6247c8f8bfa084b5c5989d0c79984ead98bf02ffa2fa417ce691126f4d3d3f33342d43d994984d2f77dc04a8041729281be40a63012904647180a3924b80ee15d87f0443ec861b02544fef57ac54875912546fee71db6a4f6f789805b6a22ef820b7f04dc521f792cb50bff8a2ff9cdb4c0fb9bfab69cb6ef91a64fff9bba17e3d751071f63edd5810b8f9b35e9e4e90eff01d17bf07106794904ca1da493ef656028e02ff232b0138e7c08ffa25fa31fa854cdd6553949d1d800000000c315000030140c074422816096e5799ee23d14800e69904a725c341c09a320c76114840c32001002000106100040a6c88804a0f2c95545adcafa285730a021c406f1217bcea3eea8eb15b53560d6d821643e5daed7c6ab7fa5eac793b9883e9687545f53a40f41c6abb5940398b03a600fd653d79f559e8398738d1dd97154910c2a26a881defc2c11dd04a2ace7653b7bc15f7c57b022b4a93e62fa62db7f32036ac62f50a5bff16881251098285790ea034c8e20fc37247de82220a1ea0f139058a1ebb74ad5d69beab4aacb6085c9a1ca0b6a7e15c380f69b7acbb04967717962c23eba43635c8fc8cd3efad59787533233b0be1a7d0b159684831670ad4f4db8e303a8d251067f515891cc1e51c7cd271ee05f386792f56fa1b4bca58930f9efac8b1009bd4ba3764984450dcbb2263e1fece6c482c475818dbb5ca3eb5352717dce44db6b670b32eb0c92331022e23e7097a167591c7bf5c9f36cf52132fe37c3a0e6e76ebda51aa1e23508cf37c1ef830ae4ca7d50b516442fda58a9786bace03518ab0f75363d6ac571fecdbc5eb1b44300ad9d3a9fcd446dec15b0b02a82e31cdb2cb7367ca177fa10caf4c8ba04b11fa74ba21cc56054855597ef6dcfa2099352ae54a29bc87ce552aec40ac1701d55c5f144dc1164aeb619e95002b9aa334a9dafefcd1c276fbdd2b42b349ef66c8b0857b62ad1a56da03f4a564d0b0086d37aa2e9a2cb9648732303d030ee1ce57ee3283cace4d78f657f46a041974263856851bf5f397d8cc607f6a9424c01ca3767ca5d0cf2e1a52f7652adb938e792d94df35b42a183b3cf2483877ac0d7639772fa2c27a46065e3a760d571a860b5f155b08ae8ec0350848fe7cbe750c4bcbd58715d3e2b0f565538387eae64498241e63d091a39c48a76497daa85ca225e9506165821af1db6a0952cc9b999b1a5805525c12673097d2eccc2ff414d5f7778eab3c778f0541020d8faaf3d2d2cb77babae71ee46a7e2fcd9c9b4f03706db2dc51c86cac2be54a40a35463b30108bf5729fe0cd484bec693cd7a93a0f09f60ac6becdd72120e1bbb2542ed46d12d3155136251ee79e319cb51006982959d09c6c771e61903d1256061208d52fd188d5b7d533e1d715ef97467c04a0f29fd9221e44fb41c38a4613cd6797b280c30587edbaa6451d76df161f3163100245e5a48f8b6e7ddd0db92ea1be71eade1c270d07bba08d753b54145bbab8b5f7aa1d50fabf38ee413e527c1fbe7bd4939d47a60c83ac13e7ae76842dec8c7284000fc8e6560110571bf1a7f2ad898ea2b4aba7af5a5013973611a101e70f4abe956e6f9762093c2d5c6867aed695f8917c247356025cb04a4efaabaef48e8b4e5eb2b69b009198fe00dd36683e7fce1a7dadd57fa68d1ab194bab71c58fa787c9832b2b2fccf325f6c32ffe97bb8994addc1bf7ac1e1dfe3c43ff932af31fe9d02109e389ffad802388ecb844efb97323b684579a02e42e78128b79d45086666fd2ccd52d9866b6a7137e3baf2fa8168f890de71426fc7ac2d53b979686f64d351458eda28815b16d7c5485f5552e9e5092e98e38dc71d962ce9f14d9b83cc476da52b260e90231ddeaab6e930ae71f6c1f6fe550633a31833c4f700148463d89066510051ead24abb3c3ab7c9f828b471aee086b4dddad4112355d80de0b359a3661feab512003b83c8a6b3d8d57473d01484fc5a094e9d8bce7ba6442422a9e626cb8c14c04772fb03644b8b85499a5b374b023e7c8cd6c0a3c2e6c5349bf8734af465fdc667d9a8eae07143cdfe56be52c29627c174466c68c0d88b388cceeae28f02ba66340a5e936b46adde789897a15465c47ae40e356e6d2dcb7c4be2d58c5ae530fdfb85b3041e3e6a551246782ff4299905ff49c4aec646d175a125337669c88852423b0546e43615cfd406ab393875b479d950e3a783bda916d9c2233c160c0f6d16b1863b163987d84ed8773e803b72de26368773e4dbba44ade1c73ed3028d7befc30ea763987011948cc06532eed587add431dcde17167f6c65e901e55d1e1e706fd5b851a0674e4dcf369dbd4f1826057ad4f8391fba2fdae21f0ce48f79e9793e950133ed60149ecbbf8c5a1ff85ee2bac19fcc5599c2a22a223c18703c9428729968fed46431a6dd184c81784d7cf5f47bdbef3e817f69009e02fd82a17de89840c8ba0042f001931754c474f1bcc50bfa41f616de8c16d43eb4b0bf64b7b557dfbceb18afb172b9578f05efb56bb9966dd1fba14f6a5cea75f8b2e032b3fbe485997c13c4b4fb9cccc7f200bea65475f1c6d83a0138c20622bb741b16e3992398feee5473b5062a8577fc7aac03ac475fd9909f348f7c08f4b2a7326cc48bd09260480b3d3f4dbc9645eb202cb53b32e4c75204a706a45542d4d07c6ccc397a6d893551175d6ae736a96600386c650dddde81723d105f981e4505fde932904b6b55c5bec3a42912c122ea37decb22707c9e6a1db5917dfb0b214615d746b1a3c963324f889ad7096e59c755745ee41c7f82a759b9df55d58e7d015776232f83f4270da0f68ce49806206a2957e655e6ac123bdb0025314add7217700a71fa156fc35c0f80adc1b0d5163695ee9899b43cb9a28559ee236ae341695b99576e0cdad8f80aa82a0b8225ddaaa874f68e16185135b0f7b1a674b646ce071cc608aeed08277b8bb7965cd4ed4f8e394d70be190822378baa6ad716a0fc3fe8f8822774c8cb3d5c948dd2a8185a9907ede15788173f6fc078da67a800325686bcc94dbee522c49d50075ff33328940f66944c86c363151de21d3bb768a3d72f8897def2f3a1fc3465c25aabef4359af779329d1ee25ee147d487e2d86f65bc1e6fcf82194ba85b45b7aab2c727da7835931f731a29d2a1f1302b76da79441b8b1f5a36099fa239b035b302930f3c92fe19aa768323331b5820ae36e908e669eb7f7daf1cb9564d548bd460b6d149b1badbed13e1c41e4c834473ce9285f479f3b228547d93cfa5c8f10f808ab8f7cd18ff6ffe81190ea2790ba03c94c90b86290fc0ed21521b138213916d21143620936a40422d22645921c18697323e5f848f829927298a49a29a9474be284493a68d2e74dfa1f3b29d327d52194ba45e97b951c764ad619753d10a86e70cad470653a42131f62193e5c46f3cb18193335cd4c51d40c227a258f7cf3adb73dd55d1c1b68d0aca7f52da1b042f564d21721add4c7079bc55e938ff2002b00e734de4cbc3ae1f7eeb4df007b3efebfd6ba9eeb588f8ca551117ca7b7111d61cb708a0e30159c0d539b94c6294f8b0389481c76334f61a248edb88cceb4150b4af6645055e3a0de5d9f795b27dc1595618e51d814a256af91b699eeebaea4582b23400abfe40d2a713e9a9a285a97d1a5a0cabab46b0298bc8cd2234326c5783629c3ac930aa57449557e3764d3ffe8af36d30c86c44d0b4116e1b737fbbb804572e3b22da0d88baaf760605117853d890202dbfdb68f2d27550179024d3bdc4de3f7df160452a16d9a30ef1a8b638a2976f65caab8d67b1b9914554b72d44b61ee258faa4fe052e10698cdb0d4d1cbf2b27c7e5e0afaae2796916adeff1b8782aa93e5a14c503868c382909ff1ab44c283a2b6da01e2781dcfa9aafdb453546def40db0e832c6107ec7cf4ed25b6f69e42a2ef8190c2d92e95aa7b1fa1337df80714958e233c68f126bafcc03775a8d9cccf242b92f409648d89f1916e47edeb463a5070af1d40830980a6c0120899f7c4dd3b308ae5a025c633744850589a9d881964613d0e4528a05643021df5b8e40032c72bfee2d5d8687564c92443624d1a4017cb683d0ace2b8f13b0a5247937747437fd2c722103d4ec0b44e1ff78cfcd5756363f219719b60991cba0700d8fa5245188dee4c4b420315c80e680ba851acc51fa25d85fbc4a93ec2d8bcbf9d0156a24f11342e61f65fc32424270f9cd80b4f60a91d58c79cce89ab960a49e597f72fd2221d067f5667bbf80900c929ab279533b130dd473b1e826f7c31eae73c793837141b190fa38172300b4ac7a6be85dc5fef164274838acd58caa5795b54beb0286830384cc96ac053fd6aecad4e66b77020fdcf3b13f7fd29fb0d9ee644d3bc7a75d55b4a521b542d497a9327d4f3ebb5090fc3b8afc5427dc67b42947ff046f6e32efde7393ebf09dfcc9d453af0f3fd52c9f96dc1fffbf42a7e1074ff07d0fd345e5c9f59dcc116c118c4e6c7bafbc18348ebc8855335a46562a6255baac9034de5bc1f07bb398b529f08684970d27ebd3a1f444c353307625de40c2c0cefb4dcdb7909a14a0066787a01c50f6fb9369c22857b72b3087c5574a8fa1a3fd8c01612c2080f8e893298c09c48276dbb21d8b78abd91fe9476ceaca525e91c767730e2a81d655c109a858563b9bfda5ac88ca2cb614937979ffa64053d55e5d5b154ca9ab61861e1dffa5e4a425187605a273ad3499027196e124fe8d5315951314a873e2bae974c6add3cc76b2349714fa3c4b54637f87eb97571b5d86577c129e2fc3178c55a414350a4c8bd8c97bb90232098c1d3f94ff49591e7f2fd71aefc4fc00f33a4696fb4fcd32560f7905745702b7ed55fb5d45a83c664da8bcdd39ef6856a432c5896c27d11172f0e8664c617b81d68709fd7f81c4146e47388088223435110c6d09dc9f84a2c08921137137b5bd43ad0f869a24f8232293bb0f795ef07e987930c1c5e3e9fd8214c37088d15371442d5e7da04fa83e4c67e1d89571a0ab6f1a0e31f9451ffa67b22613427b4ab7e74a4f3bd387c013dbbab7e7e84512ed6ef9c46623729106c98ad05c06cd4a04bb390ceb624e97308926ee2429dcc423c1454934d4eba2e3b5c2290d8c533e8bef697adce5a44a91ed03a9329a61b229cb074548f602000776a13ca80bea8438a06ea82bc2dad515528363e5d35de697c0aed23c9aca088f0c73852610acd900e8a174b776c1234d86e604400e6ea75096399a893bc90d40e1cb9194567cb49d4a84e79f84aa89f0553c0c888f6368c7f20987b75f356e1f8d3d23f654de05b62922457ca86e181c261825761985f2468345ce913ffac38d3c790c2a6ac6dd64fdd7ca1a95ccdb9446b158e26c0e8c747d4e7202512c1208f0edb6ecc3fc1bf61edd1aa89d27baffec0358382b0dc8e05e8e9b010bb8fc8038e090a034d14b940c26144ad41615c6d06dd789920429c1423b032ea0cc7825dc80c66f993aaed20f3cc9d953d375de41f424d77aace160fcd8d010004e6434bcdafc9d2340dc247324f643dc9a215a2aa2bd3f0f2c91e92628e1a254b6016a68f0ca5e9e0073c899a30fe11059db901db29b3f6d301f079d2953a1c0171384e756a0a125ef16d4e0973723e40b7397a18216c1ed55c540ead13c65438db10fa953bf16b50841fcd9a321e1297da3918e8c6177b8e05429faec1c6341fea07ea001340a07afc0352e32b6b42d64880aa7db2f19287f32610d32856ffdd7d02912256bd64b2fe0bade78ebeca8cca72d51a011481d42a2377416589742d9535f560d88be5761556a4662f3e900d15d342ab78ca3b1a4209ade193501886e504ff05d88c4be94a2691b19ed3bd9d1c55fb3a341752a8e76a7daeeb2a7a6370fc8ae096d197d9a10b525aa9d8cde1c447d57ed0332baf391d385f3baad2495d22ba3bbef46468357e94c4c229b6a4d34327a2c546b8553342227a3b542f0e7298156b3b604e2c9e86aef2da3d7ca380396ee44a9d9e693d1e997e99b46c4a1bd87ba349aa1a2ea25e6cd01c35d2e38b12e3fe778d54046e8191ce0bbff57eb601de11e5b8946085284212042a0376dd9865e32e4f1f7ed639045401ffcca62423708fff9b898c06fd410899378013ab0d970cd0150db581b623c6716bdd382b92c4274030742a4f010e6e2657be9bd7354b57db75a6fefffbc594b897431d4c08ed5354e6341634589b296b2bbf3cda1411fbd6582766bfb8ab02e9fa2f6b246980552029b0e096377c6442e10598561b4e3fa8ea77fd90e6c42ea63b24ba77a520e5e018af8fb13d2c0b4f0f1bfde60fe18723131faf3c3211a9de91a287da7bc6fd54cb1eabe1e952ff7c0755f2beed2075fc1e50b43deef3e11c7cc7dad102fdba1b53233a0d725c98a3d3c11f48df86eaa76fc90581929db9d59d2033be3fb58def7fef0a3deed16ef8fe028e9fb0122e1f6a32cb565a620dbbe10a53197cff9c21f9f7dfcfbe519f251451084fc642c035a2a899e1223c565109017e974fe99ec7fef5df4a33554e26d561300a88a782041f1169e715bee77195df8957b5c89cf4de292da70984938e115046a69d0a56d6514ac791dbefc01c278d56a6e0d5c64ef9abdbd57a52a8da8e96e454a9a2751b10e48b93a0140d1ed0dad805726a1c278aecfb735f695bb5c6c8d9f872e22f8b707e8c790317422aba2ea540daa2bda0d1e847f0838638238dc1589ba10d05efe7e1254e209a4d9423c37f74c2508290603a8b4797478652c090a3dd33a2a932d3632e1a5983835f74c0457d79f19b5c8269202b3a2271c2ec77fc71f6c7cbd4c53505aff031a917839cd6142f91f90124a939c7f505daa31397c561c3dccc546f5f3fdb945184a7a4123c1b181b4b4a903f40b8e181f2b685c2dc88e1a421e20ba162170c5b4f075248d6c725a38d6983d7da07ce947a5e0718b66a2b507970fa3d68c7cc9384333ad01ec451aca0c8d1da56b8ebd342c41c559c2d01cfdaa330a30bab514c1cedf9f9245d45f482ea82f4a85fd5d78a4bdf847ec3a7deaf115bcc877ef8e876c6710fda43120420847a65c8278496e456298a94d5f9cad66a24e6f4f502dbba11c4b0f06150b122e85a942489186cce3cb8f026f1aa0be9a9f48071af7d6af75aea1a1bf51f6c0f310bfb0146c2789eeee90ca01308ac97976adb800ae6c73e5749ebe5addb6bf07e9840e3740a91ec8f0d05faadee92985135c0a5060f32e17a84f2e82190ab28862accb03f4615de6d59711557bf4e017e2a82c6977eb4f961e0c785caedbb70acea4c7b98ca242f18851102ef02e85644dcd82b792879b6ae9c3b2c1a91baaec4dde3204c8b6e745806c2d254fce09b914b4bbdbe6e093f258a6618b0716c28e4ec1c55d03439b70ddb03f2c7388432d36b0d46e02a1a1178a9a7a89e03e77b58ab0cbe63389ae24b51c2a3fc8a87d19bb166acfb3df15a3b9499ea11ec07ef0950f17eedf33ebed7b50c5fb0da7f23938786246581e556c108bad55d3f6bd707a123061bced4658ba1e8c0c760834e2b91655b571658e57378a7057d85ca22f6f759da233e63cccad9f0d82b02934a33da64628190a1111f4ac87c40eec42872dce2c2b0084e11108f025c660923160dbc2f0368700db6698f44e23f0cba2f5d0e0f3a5e5c585d2f2d92f08d95caa2275e476ac85beeb45e6904449a893c818d0b775baabeac45b4bf864098579efb3f90df1a2da39d838a660dc169d3c972392f6c3bfd02dd9799d61d165837199498b35b3510ffd7553d00b4ace278e962a12dadad7c6c81cb33f969ccbf00061339cc066f415ac3001986e9f86121175a62d5c9cda6723ddab1860aa57f2f97e943404c64d9fccf8fc778f66e7b629a3ef9d26bcf1763b7e94e372fbe9b26961b5cf2428ca6f81fa825850d037bee0f8c4713cb4d8e52b9d19cc2620454c950f57a6c761802b8b26cbc85090e90453fb6501c94ca94d69329961b782ee6accbafa71f3ca5c44e932c8f68780217d162c32002b3c8be4c2b500ebd76765450f2f2ca5525d8b24aef4e3f41edbaad5a3c1b738326f5a24f174db9e4754479fced67fc1059acbd39f2aff0ef2a22580c61bef9a846386bc28577b5ebca872d185c70e55ae586e45eeacd0f6db360b761400ab08ed41bfb8321a5a8e6a81af7ea3f91733b54308e04c44c6eea48008337ee551dc8f0667e4e19a20a971f7e3dbd1337a0985a5f609a72bcc7c6c8a9e36a34e253b941a3a407fa4d266d84bc66b3a25681f40a597ff0e88111301de0972a95f6ab955a038f062f4158c4d25ea647bddfaa9b2650cbaacd280779d7c55f910c28705a672021521470912b44efae412b23dee2987846db96930757db192d9851976c2c86d00352445388e6e6a4c9b295d4874c4b481f7b3c21b1953f7db922bed34936d2a863c078bd6d03fbdfc8d2e76f9feaccc16fda3abddc4e1805370a32deb420f1a35bf86a5a2b54f3e5550e79c1c6fa376207f3682f2ef25436b73d325b6b91e3a29fe6cda7ff51109893dec191845b3544fed305f724b00e1da152067680ea69d0b4d394aee151c8fc4adf0b5543b2605711577dd09814503512c5da030add5e05d5e524b2c227b57ad018446a84f7e2c54ae6fbe3efa87555eb2d4f191751ad9e1d747c1a53622af3d7172d46cd69098b8d51dc5af0a30dacd0e99e1b4c507b78da5f33ff27b0f997e22cf232bfa525cb046782dab2eafe0820a2c41477fa90a3ca4b5dc9a87ecbceea4d59be281d1c582a1ff6250270412a0ec26a6f908ef11100001988850a390c083430a48cbd2dc9c6121b623e139caa2e08c7931f2c915b8c0916c7a14245760d94f51dfac491fbf056ad70a7716e446d817a2496e4b536b547647556aa6adc0997f95a2ada9203fab345561f63151ed5a94976d05637bb08e8a8714fd0b445bed7d9611140193cdd32a710d37ddc394919982f0aec9c6170b9610a055344608d4d10e1426f74a3c88af770efe604a6e272c2fd8f57ba77176123efa2a79647a3618a1966699fa56ea7d7e0024ef41938e4726cc7ae7e3548e834f68a41668eb6ba109df86fe0aff85d9bed041810bb122cb3e5d2e05b22df1effeb43fd251aa7b91ca587174c8c18a70bcbd9265caf28177cb0bb5a19443fbae5bf9ac43ae258e138e5f28ed14c7630c21e7051698097d6ec01f4682d840b0b0551e67fd0fe9fdbbf7924d6efaa69c0c35f793e626927ba3e97604181b7311f32067b17ef35f5aa5b75ad9af259aee0eaeabc71856050f74120b32a3ab4b16e9f91c77fe7b7b95cb852670a8ac91f72344e902416cf1e106664f1bacfd27b2c38ff8bddfa82be2cb2476426ff308c7159db07125370f28c80f5dbe81be68069fd0bf714b357463e77ab71cc7751517591e5a50aecc24fba30687a62b10328fee58b47bb94d48cf799c5bd363a47bbfd5c3d0a07b981402b3b83614d1eee95c25dfc1b3ff1f2124824b31fb641ea6c7fa606380f8dc3e21a0e9a0c278c81fbbce5e4338c3ddaf0d06375b0fd624c09875350936c9ad08d21eaf7a9bab281a6c7d2094740303706203a001c392019c4f67122891048318617ccc4815777e122047343bfa1260c811fb8401ada354ea89a960b79b59a579c07e1c0fcfb7f381ceba0a521b32c534f9df71d3554b98902338ae7ccbd2c61a903aa2fd671eb4b2078f755a0641fe9c74348b717e1036501c6e61bc560295c06641e939ebccf4e9b6021aa39991f6a2193fc73b44739008cdb0760b81542a45b343280e2f1789661cdc282cd333b5a1915b452ff55c1f961796737d423454681c070df4b1677afafa83dcb0a64b5abdbba1088b5a32b851155ac66415cfa4dad193d3c4b8f436b14f1647f44abda664d69c7d17892c6bcd7759164f9a76ebb8059c3dcbca6bb9c07f55bda702befffcfdb885fb1241ec46a7cd58a6e9c09edc8b23fb111856433d4240bc843e1af5d303d03d98aa4192022ed6c0d40e15ffdbdae9925d3221b8c150e7b564eebef86d744924fc7a8c2e41b226d79025ead1c5e6d6ebc80a6a6960a1e2f146c0510c26137cff2b7c9da443f62901b1c1a6b0c4e5a72b8a415adbb21788e6881e1454d53de20310851efbe96e30ce40ac03432bd1494f9e004ce321a86288160bcc558007fc2e346715d8a02f68744dc97cea3b271e24189847b4aeb40233d860b887a0c938c9276b78b3b2def329b314594ed5a18d94cce2ec4241c7f7112fdb5429b85573c23af332712c8d86265c073ed730453ca33c90d2f5b50b95f9f1204c9ae2094333438ec51cb2810404dac3429c7ae0d58c3e87aa01f7dcb09e6b46f2e8ae484e03f241cb3e9d2dbbe62d7beea282572cad5bc21c649601098e92c7d5564fdfefc663f7edd8e4614f7d935f9f2859001d362cb974d9e20dc918e3ac7a83f50894dc887e039b8734d758203cd719ef8df58074d9645fe155ee4c97718879d4ca43a96bf39905af2b6d6fe0e990552e8db98e8e6e0a874708b3339a7a00d4f4584ee1dc8362fc44055fbd0d23e5fb5efd477dcdecf703f244ace93d503e6ef84d87e11c8f430202c811307dafa258b76d7f7be674d3dd336fc15362c39b16fe6c2cd71a8306fe9dc9bbe5949a2c40df1278802311b99ccae5740674f330121a029d6c63e9bd291be89e75ba17ea095d504f9ee3d66df174e9a51b673f8c832d0f0090b453a0fe8f941f92687a1e92284b5043042f86132270118bde1412475a69c68e75513b90601a0e018f43caa0500dd6692b5c2aef91fbd59402993797c69a871cc2762610be69b3a662ef1bcffaaeda2bcffa3e88a67227060c75016d3a918c54a704f72c415f400f9025211f0eea83cfb03764c703a58f353305a8fb3de9f1b6642314df27da84a2781998015516012b56a35d9329c102ac04f7a7b6ecd719ed2a246be0fc4d2d4274fb437b7f2ba986624b973a65c1a75b6b03f43bd2e1303f8862b4a4cf317887e9fed504a0fb878bd1f7bd9c638fac9fe90df0314b4a88b27d181667b64420301dcc1e81b9987a5a6a83627e782c98fd1f070a28d70e4446bfddc01d151ec014dababdc1752a0800da1c3542b5d1e1dfa1ce00449764f652d9f8a92ff1fef66e81c91c0922c7220122180b981c98cc79562f2f9945b4fcf29359be2583a4fbebb73a0b2e38927ff345cda9590c751a2c7ae8cd156e9ab16257dd5451a3432333a2d6100bab78f00a80a560059c8f60b1401106b0f8ab4aac685984c358d556e0fecb4ef7315bdf39e9a5a5d99cc18c0bee634b9179b0d6aadc2beec7b315f066bb0a87573a62ff6f8eb028dd1e47b46b27833cbf698bfec610c40384c5f2eaf3c9691f8fe7551831ffb8b2068fe7f349ac87e89be487b6a6ef1cdf6dd59d1b091fb227dd762ee8812bdb9c1b6dfe995e0e3fd59ddcd587ca36af494cefbd16ea429e674d757fe977fd5c7a381d34e5b8c9f5f6cfc8c7d267290c7ec088ea45971043d1814597c89371543d293a06c1967ab898b0cfec3a29732c4479bacf7b05b7d134ca743db6d559132bb2f3e2ed91a266de68f8aaae072e9a0cf1cd96777bf974a084f9d7a5ba9724d15f3053073aa1bedf00b158e544f1d59d9d81ce96f8ae59c99a8fdac989cff3cc67062029031bcfa670f6ce54a33868ab9407e3d41c115a9332dc2cc566510edb6f5d4fff064bc9e1b66f53e014d1e39e53ba04a39cc2ce886a8344b535f18f549e306e9928f4f73c7a944f49f281d0a72b39ffe3d8f3e42bee56b780fb85398e2d6c4d56cd739ca41ee8aefcc064b7cca4083baa7e5ea5ea5ae3a8e7ce7d479fdfde68ce3eef1918c491fbf03d3c85dbf23624e9d40c7877dcb49a92e35f783d6fbf7088deb6258b7c72686e877c3bc4765f3488b60cb26d6bc72127d18516e10934c015537ed3f2af831f9ec8f2d9d3c41786081a893da6b91cc3f604520b47b9aefa8b54e64916e4c0e6e8e94cbe80488b1ed8ba403105e416106cfa0c2d83f9e14ab2e68ed59887ae4dfdffb71ac191d9991171f41e6b5e8d1b983904868694d189e6bfb7e266ccce25d4b65a365fc2156f929ca78747b913b77971b1a0d3248fbebd58827f152cdc5316fab2042e2b5b30c3cb7078ad566b48f165d3fc6e25d5f1cd1af267902e502a0b62670e016c88fb5c1ff4b65506a69e20bd2668a4878e10c5e4d6d5cf29cecd888e180ed70e08e3e9a5f5394adcbeeb7d4a693d6fdb26e6c5d3ff593e8a5eca8f99e0bc85792df7ff4c2acce1efb1cac7d8931924013d8749d4a3314d99866319aab354c4f6ec03ee9512c01c563852431e3a9272234146f61795e966c9abe451c6a00686db55947300fdc65ec463dccc2be4d44de62ed52129c4ffc2e4b2bc312c860b6dc8fa3b58c9ed9acd42b897b2a7055f69ef2ee8852ac20c2587f87ef0308fe68a36b3a9218c7217ee12513c3575565092e27334b9f6958761d3d5fd2bd23b2adb3713624e638ac97d59bf02b3d5b3119f4cea19111349b0283be8f253fa9310c795423e66cfee2812cc09e1a2faf7973175f9d43d41a0386e4c77033b9a43baa9496828c0943ce03bc5af3dcce361d340a9cda319b4472bbb1df4e37ecc0c8aa05547447504725cf3cfa0ba421a52a9790dd7437531be2ad259efa5eb5d208b87da056ec608c15bf4755b19132131fefbbdfedf0a363f5d701f161554a1d998ae9af794a6aa26d47e5f3ead6c97bc8fc87b34fc9e636b0275c38aa79578126cc07cad65b9003868fd2c76d9a81eb081c375ad53180704de5515a02dcdd99dae4d51113e7526e50bed7285f283aed990eab23f23b8bb494b40127f4dfad432942f74db15ea07a2460daba88d1e08e85e125a54064f41faf64cb5d7a0e73ddc96596a449629110374389009c6fa92f8b69c4a6cc35823236ad870d84b0e8b5743f70d4e2831d695f437304686af9df5a0139786cb371823869b4d5ca84bee6b48440c9f39ea4537ee0cc7352ca2845bbbaa38604009b33f4fd10bb7c39f36ba3e0096210640f7c685bf1c4e5fe31bcba57d91bd512e6c17be9d040dda770fe5983abbe48166fa7ca375f05a2625095822c792602fb496152643ec9f5c83e98de83dc53a466cb4b7fea1858e8aa9d7a7e21e32f0c79eb3cc64ad4c18e039e008c5e7738b7b03268ca650f2b4ee3fc91ad94cfc6481aa2cd62557aded046e6d7de9f948652291e4e8acb24f820f72a747db858d2c2649a8a0974977aed4ec5d2129c8d8e015392bf52c94711c3429fe1ff23c7398546565adfcf74c2413e43bd21bab8e41be394c896d0f59df6d7b6d836457e56f6317d27957eee817ce6089a8eb77cdd5431506eca519906bc7aabf47acf646ba9d9d82de0feebab1c467d4c5d06a5db86de202c6c8aa1ac5fd53414bcfe9f80897cee60d2d368fd76bb48980a71350a6f19f472f110b4d55928402f2a7f1ae1e6b0d117ca108f385af64d6616eac0221e47638bc78f08540c85044f2f1380d44116056fbcad58a6f685b714ea29b6783314bfff72b65ceb5b72b444b6d84462c075a1682d806bd11ad9ebcacac0ac5231133dbb4937b081731b3d69d8b71dc9878cd483cba66d36f5fdd6763103031dbe8fb907267b5124f6b536dc87c5afced1a32f769e4530c57b3167052a45121ae2a2cb97ea5e3261e00459b7502d57dab7e199db4a0cef41112a20981769f4e2764fcff6011ee9c784c0e84054a17d50f7195eceba51ef2d3e1da7f4e0e2bdeccaf681c9f101e6980a59995dcaa31d140d99a0b4212e379780d36ae00c1b3cb9ef436259aa0882f139e904913c6bad986ed94e6443b6256160d2c1e408bd8ccc2c2f643b0bb9d5374433427c3cfd12b716a712a3dd666529cc838810b9bd115a5505a103b88adf6ed301a1e3150a4106aaa1d0369ae824678fa8b47446321f27e5ef7d83715a341e24128be0fcc8c63691d386f9bda05c64dce1d048f5dbd0fade0351706e3eef2a5e48897b7fe2acfd67655281d226b7f60cd09ef5863026c30e991abde5f387f5287eaf471f5413cd8586c9f82bcd70b37e062ec7c48a72f9447c50e768f230a4f6b6f5a4d1b41379afb5fc4e1a9fa9d0cb8735faa636fc1b9ca48766ea83024d87708ff830a3a40548feb7a9daf271706db03d9a9e17be4a4247ffef6cee34cc765627538dfaea567d1259592ac9058ee4bea132ab3800d9056854871790c529469fcb12ed0a946aa4ace71ddc406949c78840d5adbe6d517a04a509c74fac5c4898f40e6e4bea9bda102bb1968b04331c980dfd11bd03a355b446cabfa20ee4e522c3d8507d913c37fecd7439784611384001d0a2f762adcf3964b5b8e0fa5ab8bbf751a556a265e337be4545db7db260293305c6d913f4890df885e73faf3eb9d37fe6c749724ae673771f0c870d0a00ad98de906cdfbee768b146639216296bb9302aadf05bcd9abb28db9f0c2cfa7918c8f51c92ed18f2a3c0c1a6b5bb6bee6243682e7fd59df198b0b4c2199cf78ca5f0df921324d965eb0909e028970d1c091cb1e81fb26cf8a980e29a22fe7858f9dbdfb74439ac6e8fe08157bd683d1a5314ab5f253c8ff821134b604881a734e004b5f347fc52a6a6ca467f6188d494dbad537a9d12b985c5ff86140ce3c957996ad8b441132aa30b412f3fa16d181af4aaf9163fc3f9580a3880397f723088e51827d189c1511126a66c9909a03671c49e86089a04db1f43705882844c1dfb2053129da720108327a6422c5a25de237ae950ef18801682b9e09befca21e9591ab683a16dc3aab85993d8f3c03b77dca3d37755e376d4f0944eedc54c53fa7f6baf8d76b333ecc21fc515383c9b55b3728949c4cf6aa420083878cd6d0261c4b3d11f1393b930616a7ac2bcb6ce55c5736a70f12a32e5efe42c94128dc8a6f50caf99e5bd7859b8a736b817d392ea75316f6aa5aee8f38c9dbe0dfc490b11eacf15b29031685487dd65adb92417ed912aa98cfdc7e3932bba483ce3a2181a1e41a0f4a32fcd262a0722b941cc3fd0f8531124a2e07f22210e7591875958c297bf86d38c929ce8755f710af2c98b31751d5dcf396bda2482d2c8389d50ec2c3042239560cbe0bf978eb606987d26d83589df921f02c00f69dff23278d836912044172df73c91d2041724544c77b48aeb8488cdc99fc8ef4ae882a4c2a446eb140871027395c6adcafd5319c20e100e616013ba113940ce163aa5117cda63a3de2e8fa867e80fe6433a57bccf11f72492c48e40599b2fdade1da5e8acc97e4843cb65442b99eb511d4394966c83b4ac2586434a8e1e49e221c92d3481bea8ca8a50fa2d5b90c4fa5cb0b331abb8b6cd145cb0a3eee23bf403281f07783c9e2b84b113b96851a05383fb7c38aa1d09185065c8312f53b07ef1b33393809d80efeed8eefbcf8d1cab688a5e94f01ad61d35915ded55e93600e236f65be667aa757621e82c6ba62677b503bb32756d470206920157558aa6839d4b592fb98e8067643ae8c0f7c903eaa4c0ab2b9bfb27e15a054a4a5b4922561fd703487e59681f3d06859bbb0523262c5df18dea781cdd283f081f803ab3fe4a81270cb5fa931bd53ee30bfde82444a7a9f51839cbc15e3946ad046caa35ba368985a7b1cfb2c680099cf388712d3209bc7e5c4a72008f4577f92b723b940c9f5f680885ca2641e331ad5a0add6d3323ba3c2f4eb3c131d44985c79b8547c575534b518569dc97103ee4aa5d819902c5a273f1b27a2a764689ac85fd55b914f78e661cddf1b96070dedb9e97457542e017aef0d1b663129eb69945e0507cc91537eb7fa36a7d896e478675225449a78f652867ed489c37dfa387ce8008d2ef50055ef84ed4dc8547af2293c3891c9a1bc0754657a7e46fe80e4404f1fc384272229a9fa1cee3791a2e4f45bf8c20d34b4d0832a05dbf71bc3123b95dea2af70a2e440b1c4802a5f3c6aa09357e1a789114a543f84e74dce5412f221ec3c818aedb3d121a904c769dba29692b6104719ad313280e678e89b9b25a2df8f073247dc317660489e369844a18a08218be505e4423dea0c3b42a4839ea03be8f192294bb422f2d758f4c80ccbd87d4637797a34f8401a019e459fae2374a9a85752389012693af215487d4b457859189168e611c8326b02360aec4bf069d4a98d5d257008447b87d0f009be9e94815a7fa2ee94096a588feb1e7fba8c900180d0613ab26870ab24a4a8b67b43fec0576146e050685671031886597287534d0449af26a021972df1489c451884dd9593cb8db8dc1897ab38810558bac5622b3cdebf9d73c07714be69799df7a1833051a2d51a07548289d2f13f6562e9938855bf274e75409d204b63b6b812cfc1e21c8052ca0c76069c6f0ed0ec1d3296db0af8a5d6b09816462366266ab43af4bdaa25bb61d7206fe149bf82c46fc07399d19e8ec1e5fa9d72a7e0abc0dc93cf86acf5131545faec04d716d97590542de8ee47b1d3aa4c6b94847b8dde153cc8c12b218576fbbb7b9aff93ff2cfd9a4726e3652070244664b3747671dbb932c113de57f57ad83534b802e5d79bd5d2b2b7625abbd5b307f8ad4b86c2eaa991cca096b865660e297d92a60fae61937608130073d9b9c7ff555fd852083ba951a2a36b71d52db734fd5857220538c9d1582589c0fdfef827b25ba5ec5025689b40b53a7b185fa5263585112db56deac83fddaf5f1c4ad548a223efc560268d6c35b4762e607027bb8ed6031859b28f35d0723bea1f34d7cf32352db1a23ecbf5b73b641165ecbdf566ffd58c93a7291045d321770418ccdea547b0f6b7aa26346bb3a9a73f432a3a2b79388034f6eeba0b7da24196293d18b25f381682b371e74d50cdadd6ff7ecd1c21ed68848e783c1da9c3bde26d5106ba69cf566a6f5eaf2aeeb2941c0af5901b8d616501acacc12b55bc1502f01ce2b8d4acc1c0a7620e3907ab648431f6243c3787c17c8d0710cf17e586cf3225099d8979d0bfe44764b5bd088c66bbf07837fb2584fd7016471617fea13da696f11db22062317a77a4125764acbb99a4cab0d4947dc0e3c1de1beaafa758cafa5d435ef2bd7a4685ede7e80a4a1287fc3cc0548167734b8024282072ab76357cae431001614c841b7b1d1dd46ff8b6af63acccafe963b2a5168bd28f164927922c407006fe2c7d52bbe2a3a5ede839c2a7543a66813223a12e31b84009234c5583942da53aa3422ffbe6d5249941f0fad5ea995b8fa1b9abf9312fb9babf668c6ee14bbe522ba81eb71c92a8ade59568a13b78cdcb43473ad09d0a26dae4b22eab986669737d557b95a9a0f5fe989d026f6aa0efd8967b11de55f45fd1c84f0bc1ca9ac1cdfc8770cdd7a1c6a282bebbcc1b35024d5849c6443fd6ed92587b3307ffa0c138b7b1eaa1831b73ea182505d0462d274a9803acf0ca5ca66ee544223141469de5f3ecdd2e36a73124782157213fbbf33f24ea899a3b2f7e4ea4c29ca8707a027d593531d13b249b5030b9644afef0bc81f894d923f4d4a91237100c6279a5dd6b1279103a93752690ba40d17ab5f12d6a7b6e6b89aa81043dd6219edd257a5f140d3ad0d28378f1368d49763beb97540181abd9dd9cc5136c51da42f4fdd9210a6d4cc7828473b277342f86eeee1814a2ec072f773bda885ea06c2770014a28869414c721375e856805783cfd5dadd57253cc1c484a75bb72f8ddc545fa197a73c8fa79a45143ecf811e76efaa432efe8c9ca38b49691215adf6ace334474f7f7122280da6cd2880809520a693c933b86433b75fb51b7eb91c918895a3f843f643b87ddab5bb821edc38b4fd411ee25aa13ff73cc0f20770cff1b2a516b5a024d6455e0f00023633c1a9b2f08534e107c2afd5f044ac3b4c5471626c3708b237fcff98771d2cdf29fe4634d6093d8892624a6dfb7e9d5836b6597b8bd0ef849c4dea5a72fa87bf8f22eec8bfdb1bc4f133018dcc6eb98b2328e17eff85a2d9a25059f87abd41594e05b1c6d3419db6bcf1f04c53fef189dc93223da0c0fb06b1ab1dc85488c8b16b3f2d3474f246c8d7e72c3149da07a46aa4ddbe6d20d286e922f2299df5551538058dced82aa252f5aa2d0c52e4486c9451d2844e258462888ccfc0a8c5d700c6acfc5d6404c4c17d8e48c29f860419218556d1efd954a329c9c7bc5bc15e4f674bb9678ce389b3449c5e67bbb4da8fe99c11e95f18fcc91e3360b5491711ebf89f6c30a72c394b3abc64b41e237eb9372b624407cdca595853bcea81b4236b0ce594328e1022d15977877b2622a9dc52335fcfd0b04f20ff8d0291d9fc8aea613c21a0f498a78c00b2c5ada5d96294f63c8d5f0b35096ffcf9a38e6ec894619d59612aa1f01d5438fb566d3bceeaca3426dcdf30c69d3f8ad361c09b74e029c1bede64e1662f0a6c3102448a1e0446e52afe6e9359a5152f03bc904e9f389c6ee2967bbd8edaf1ba33267f29badd0987073a343afb8e36b1bc9e48e8655c558a34119f9ec8c2ddd21b3a542a144519a7a739190f15e0a9ec21b1042cac13b2d12ffdfd708fa684c4c5ed0cf1a9ce9807d8ac981d7d6f29a51b9b5a2f371244aaa675ebb5be3e5c53632db81b29166841dfbcc3d54d392838c0d1d44fe515856e81749f530c57d81ae8a6a055d27b6b5b36197c1d311a2f093f0050d20abb0db9090aaae8f43eb199341c8aaeb3056340f81bf97809416aa6e2fd3531668b7f84a4f6f6521b0dbccba3d88060c11d24c244cb9f07424a775b5ca24ad41648ecc9d0c08e26f29736f90d645d15752dce8935cf20ffabc4d6248e8da842c52b2aacc84843c49616b2510cfde6c8129494cdeee9c688e10ea50dbb7a6369d5aad2d6b0e70b7d6e34a5aad380f8f684e0f0157179514c3a5f70a4251f5543fd7a0938c0994c762461d07b85996b6fa521847a67eb8654efd620b279f2a334c245ec2ad33ee74f95af508bb452c3a870d2c33477714f0034db8283a6727b6a6ee1bb845fba02ed6963ede9ca608f3244aa29d04275b1a9907c6207b1680057ae4a200562e84e809c7dc8b3d463475c3b86a73090cc937dcc39ded51c3c5c21b207a6511a483e8f25f04e0ea753ffb8aed692acfeec3834219840f9fddf6e0dab35677cfe024910b4a820613d86ac03222e0769b73eda164b967b89cc9a630abf47b466bbea1b33f5e0cb85d0a48cc5d7ddb619845d4a46fab274849016391b05e341e3f6bdcf8d2d00235c5be94bf5de49926d1ddad708de20f98b5db7b210fb7a6bda1c0c11378af70e1f85f02866d4417c78f52eeba9371733fc27693139547a280ad8279f63038b1643038c7da66b538653c0427d2f0c8dbc93e883bd356b926c3f12aedfb1880bd92c24ae5b7876f347cefd928eee64d7e4ff106ab576cddcf99eadf7d85320392d9af1850ca0af41babaeca9081d9c14f2d42dca92e1d96d76a23fbaaf78f9ebabb0b7af78994e4b50147d18de246ebb5eae5b8f3c479771349e69077fa0fd610c396d8a1992890a4ec72177116d1febb7eedbe13b0d90b7d09885f9534944e705dd9819ebe3dad0adcdd0983f8a9b74047df62a0bf5bcd4550760a5675e09cf0c754f9e447a72f470020727ce2931409d67bb59ab0ca347fbd6a77cb364ddcfe56e95d73248b491ebcd266e5a8dc8beb3ea2e327e1d58477ba0ffbb3fff5cb1f7a65f4b808a3f05634d6f9d23eeae7f144603658d5476805ac9d51b3ecce218f276752224f64a547ac896b8cfd944489abb84f1bf2f93d47d88b1f218e4bdf34258ede7f3c64891321e71e37d5da815c4fbc5ff7412841578a0c09e38b5de6ffad87b14a2aba02c3e164a0fd985573d9b6c4da174fa0f60bec0540f6b9eea738ce5d8d226340613fc7e2061ce0a7a50387b745a573c76f74146624b17fe62c9b860ddaff0883132a2c9a20cdb02b090a76c7aa75836f07003cf4fae037510a6a245ddf5a0c70bd4604cf4d11006e49243738ccbf2b865ac9c862aec989879b446ecacfab8ae126abd2500bb8e5c5b0293a83cb557d968c05548ddb843655e7baa7ba8f3c5c9b486d52b83b29f263310652678b87b873e4d95eb4adcbe3e7b9352b8aef68e26e6e9b94962c8d0ae244c6da4fa2b2a55020ab7450cf398846b772280589114fdf2b04231883f861a1fdefcb477b8f49a00f492067e8df91852ca12b98f6d59dd97817ba5ffc9e51a0c3a779c56d594a963cf15755410d57a6d0c5eede795791482ba2b72c9c6b32cef613e4c1e072d485eb110cf5bfbfc84994677f673ef94cf17ea97924a442341863a94904aa0e086ad7f0f15c0bad35142181a7d6800a82463a5b5e361bb64e88a130f12090f72031bc3cf69d09031b1ee4c6e65444cbb958e6c4670c1e02005222f54e6812d1fc93bd81162c5388df424a5c109f3051d175f825205f02020cd738aeda6a87d5d87e49ae1545576b4634d878ec26d8e5a03f425436fba4f955cc94455087b0114612480de79a294cbd0397a6df71e01c4fdd487961cb336eae158301f60cebd748a0ff76fcaa28af45a980d6eba8b28b079521ef987cf545f40716fcf41c9ca10b572dcef09518ce1ada0578f044c64197cc01e74dc423f8f07644ffe2671ccd82ea193ef8d9423c9c10caa9457bfcccc5acb47017e180be6b24503809a9b3bfc3536e29fdbd9c2cf7044b70af0571a1973a09fc794057f1bf8a01fb20e322eb8ba2606e0cb49f65d3354abd7444bce1586849e1f598f09cf518f01ef69c1a5faf099164fa1da98570a72cb9026cf8443dc449c3fe8437a7c38dffe1cef971ef0ff839cd70172465a83f7b2342f3bb36b4b074de47f970b0ec1277186bdede4944d21f4875c3e086c0d4beaa6a04927649fc27e0b52aaceb1559de7c68177f985445ecd0b29c5279ae9845c043796cfe0e90af290a40afd473c0de2cd2cc8bf165d8cf7be73387f323514c98852a95cbcb4e254e1cdd2f2478bcef8e6e3d2d020266a31219519a7fc3818ae40b0c4293c8dd0df283df55039810ab64cbd2c93ae362ab439425a48082ebcc477cfd5a4e4887bb800ad37afb9d37ca07a82acff1e3b2e134bb57eba203b06c3b90fa9f8444467242ab4053846ec167973d4e80ef6b04097ef38ff6ec299f65f02a83cea38f895b99f55b00cdb82a4481fda7aad39b599655b74928b0b3ae9e04f746e40a4e9f6f529c8aa462d67c167130b5cfb701f0ad2c1d2227d45fe2582df3d55f99699d91823a8386196651f6a1a9960ccb2333a2e0a6a663cd5c9f9d846ead5ac59be5a374e8879232220fff3fe5fdd84dae653f02e2ec3d1701c52da0e4f33e9de0067d3e1eb4f3b06ce44380ca3703289c977f3a49f34083da0f9732635d644371c6ae0c60b124d616a5219bfcf49e44c064abee66959e542a8a28ab54b54c1302ac48416e38605226afa43a52d17845f320b9638cc512e771a39d9d2c94d76f02af050f71839d543143a35d96c81f26a66fc1731907d0fb875b73c37845dd541895cca8de2d260572a4a50917a3fe7795b2c2715db1c65c9c6685e4397252c02e4e3a0436340f11a4f8f0a45fc69b3fdbe572b5ae6cb31c1587b7f68bf206d5cecc7cafac9c9614a924f09030d165439b895b8dbdadbbda03e5d2681d9f94fafafa0551509111d643f0d059d259deb3ab299d19caf9ccb2755b769f72c7b8fc0026517986ee722696c7f959c201d8b7032293c5a1c2166f3fd7cd8adc846af05de93a1d990af00bdb369d0ef74cb535744aea5436703d59485a1bdd4bb4169eb8517a1561492a963af0aced6eeb7615d424bca7b715a4cfc23c3c9a4293ea9fbc28b43fbeaee29a1e22495b60cf8be7e3a98254553e4c93644fe436a2b6c49427583ff4761d38c4dec8b8209d14e4713c54070e56471c8431416891f85a7903d75a3ea1a331cc281fcd987edabfe8e445163382398fe8d6d6238322254a38a2947a7079a441b4973ddc7b60cb7aa7397436285175ee394713d38bb15b88776a1780504b32d9129031b50198d35ea01096a1be097275bfcded302718f9eb62900c00b321cbf644e1c892165900da1848a64719295aae4ebcf1319a6da7eaab6264afc44159a2507539abb379ddbec2dd96f9586a3ffd52e0dc5b132aff5f8529cebe2e99c883710e0147672aab48fd8a1588bf44f37386c2a5faf110e3fa69a1e69220c920cb2e36c88b2d6fd339b8f0d1ae5908fadc217faa1e05b3103c8c17fbaae37519613a3611aaaa4969133afaffec7b43eaaa5733aaa1a4e6aebf2eb2f131ba465eaf43af85e7696130565ae375421ab4e41da8b6d0b78ad80bf455f6d019027ace57095d714cdcbeda99e94012ecb153528d671fabcde51a71c646abe21cd9e71615155314e7461c1dda4555fe028d2060024e23c24809f8e7c289215b3ffc571f99196c8683ad9ee8eb291a1463496415bba7e4ec3ec188cbb5ea5c158dc6a9fdc99126bed2e9cce54db1c88e19552518c37aed1dc90e40a555d88e775908315203b23e7038297e4bc5c36da9e4b77de8a1f198590ee3d3b61faeadb9e21f0c6dc6b3f5b7e6ca780d8884d7499e24c678104643158b68b0fe1211c9ec80d9dc20268b8b3ec6039c4d3f18eeaba085191c2893319b3f74d19233418028332631463af3a681e972c64379df039c98f5612d892f04a65bfca4fff57f99982866884dd9d009685ebbc634c25f86b737e9a9fdccf5d8cf495bd4c3f8d4f25ed067a067327cd4ed67cd692b96c4632f0408dda114281cf45f3d3ccf6ac4532531593bcc4fc439fdac033b787c86dbb83c9d1e2bf4ad4ec01a9f9d949a7b8ce34c78c480caf9d4f5571804386d31abb7e71915d3abade73c7d037994aab009ed21e8aa48dea3d71ad0feae94b4ae7ea26d84848b5a7ac673dc0b392fb42ad7db34bbb45e7a64269b391d59b62b272242039bf132b0e3400eacf86e00f5501aacb4c655f9478a2adbb07fce1a6562aa7b404bf0ba16c227c6337e25ac2666b0f0e139b3714c2ab604d5e55196f861a37dc0fdcde863ab631ab60570fa6aa43481f2310e9b9c25334e2007008706c168607cc67080fc524d04f976bcc0f33b6a0e660171d94842553b41abe99b99fb1cc514bfcd7077b3cc11b7e481d8225cf8f78d6799df6daf5d0122093a60d9d061edf0c478498cf6bb96159af7398a91de6d9955313c79a699679c3cf73869045669f6f06f27d5b8c66a280f6a0263e7685f6a137d7c55d348e93ce6672a71f340f7d2c7e4f19a4a4ea562cffc9bc335a00e821a5473e7dc40ba28b147c75fc821f4b01968622a7b9454e44d03262979f32d1cd5ebfecc2bd34090b98024d92a4b0829deba2643c8e55f9cfd8eaaa8a5a0f474299e61a113c38d0254a22a92f8e74137a24e4e45cbba3e2d12d87c9e3e726d4350a39ff9f0cbd29ec4993aec3b491e6f6540578377c4a97d2cc885f2da417e669842c5e0dd96c5ddb12547667ba85098f97262abb11a1e3db75b6ac8d97923a51b58ffd53525d71125d569a9eb0edf962f2088a60cc8d4a66832c18bb58d98ad4f86a6dcaea3461c11695f1945a9b05a6de0b692ba557b2feaa5bf710dbe489f877410d4360f5c78d306c16e8e01f08fbe169a0e4330d9f0a2fc293b45e69882ea77cd29ce06c681d2675f3bf38c959a5644c051cfc9fb1d5f33bf50cf0a4630e906d75c03c17a9984360305b4a1826d6de4a6a057f570d497687102487ef4b1667682b49b4a4992c18d309fd4d2b2ae3539ec9563b7cf2ae5637652a981177600ca4bd4285ae5c3cf0c8bed4f4151c82d2ecc8330e0a661a548c797f3477ff1e08786252f6925874c1b21b1d0353dcb125ef90a0656a2b5662e114e997dd61c52dc4bec248809fc27dee1ce833b8b9c50b8e66f96e238054468459014239171db08bf9b4fec093e90081bbb48d1c0a4729b35d4042dc47c929d06f57a07fd2181b9461bc95917e9bf9217e30fccf5ab2891ef28496b71d83e3696784d9aa0c2343544ce8d250ecbe953dbd3e9a2c771b007d76c4700cdbfac6d0f975981f14e47706d7e37c0b6976dbb2e6c901751876de6246616443c5f638cb193c5ab578cc36645a983bcb42a348b5b7a177e6b97841b0e1247496c40fcbf4eadd38a76e560f1067b0da8838ad67b162c50875694edeb93aaca3e1b2a79eb748cd1efd357e8e1347b7eb9c5168af4b20ecb41e88721c602f133eff012b4a4e3f98873d552b680da11c4356a448c5f062c1248ee9b40e8bf35d4bde6243fb431354b30827993fb2d5e2e624fac6fe4cf732114b071eac3adb7a5b40051f985a3454ff0dbdc0b2423e9b1ffba4501010c0d95f508d8c5e529d8ebdba1a7022842f4dbd3d9135ab76e851f602757caf40c6601d6d0cfc70f8ff218721bac1f46c1fc6f1acdf297710b86a2120a726d0aa06a7557f5cccb90b35f88806ede0f6bc356c2215774b6bb4bde3753691ae700b06d6ccdc8c4591bf8786e51518b94ebec8f365fb38780ba67f18d40957562a797c758f704926a5619bba548cd0eefbe1ac6d8032bd94256c3939d2ee5f30bba845ecd0df1034d6f4864b772ab49cee3bd3c154eb2a0c3b50e6d942b4c50d86147380d183ad909faed51d886e58511320e6e120ef1db649b30afa8b37259f62ec4a94c2bffc2d82912d8816a34e28b182db11846f1a7d1ae6cab4a39a035d3fa7316b9cd56a73fa5c1fc790ee19bcac8a70ad2e543e6cf232420ec88d1053a4ba3e179f3f5a3a81b85a3f1b665d14e691248af3c4a32ad066c0b850dc0fadabe9f244132a8381c48f8097b7171a8fb878527064c65fc3f1702b2c690210efa3279801fb7d7ffdd4d8a1c2a94811fe45d6fedd102147528a0a133961731f13faca19f2d263978095b0bfdba8729c33e76e367d379983d79a77166c453e08487c1cdb5952019afb545e83d09de0a3fcba9222d42f4184a7268c92959fdf5f4dcd80150a6a056af541469a503e46673deae1249cb3e962abbd5fa40a4e13c2093ed574d9e3c6a7eb96ee40cb3699ca79c265363b15d4d663eb6db5b0a95178e6bc92089f2825192b5219cb4b2861afc375a7da75b5a4f55407ad4f9da4935556c5c9ca4f233b024131ffca0bbd657bc2e5792ba9c0b2e5e95f6996b350e16ad74dfcb959539888531942cd129388a2c63b49d8b53b908865eb7530f1fc50411a968d0e1388724559a4580ca0e3b0effcc4bd911c9701451019079ce48dc4f2f5ac1fb2ab0f3429f066a2dffc58d4ccd587b98d9b97000323bf1835b6343a65080461941fc2d44eec44f788e1da99cd345e1a1e3977fa39aba94b9c6be56dc93e2bc24a50253396e41bf1e87865b4d8da5052e9c3ec1248fb6308cd4913ea8a2e8771f9cd6cd2a8a66c528b15df19975445f2e55eec96cde46cb3d8670c8cd482b5040b804dca20be3bb4a21b9477d2b486769b58a51b735e8538f46555b08256b9f0042f7f5c0c810ddaa67694413bb93544ad5650d43adf657a26621a3c72a3be2fa90a209d4fc97a43fba44a720fa3faee552a5c06d40f19357e8320244915daed7b114ea90ad6e2c33375afc823c0a1e4ea27a3276c4269fb99686cb071c6f7c15a7bc455d797fc87ce02de1209262ab398709cb557535739ad340ed175668b86b3053fb952e0ed29e5eb3908926b8445c8ec8e33cf474907a5f7254728f90625fcc1c18ded2d1be2b5dbd305cae8b9213349f1b5a3116ac9679356b6d4bffdb8e961277c46a3abd12e7d4fbd2d0acb4c1e9cbcd6e239eabf45e7f2b8b367e5dc76612b8175e73fd61565661e42d3e24da58498fc3c6e4d6167931eca8da8077f32e02c6d7432a45d914102447ff540eab0aa6b9889dd514dd69cf4302290b0b8e4b733c0875fe23e6aa3dd4c0506c94286a08db913d0da85fd2e284b8d63f72c2103bcabb738461d20a844c3c98f10b220a9c0f0da9aa95568b58d08ce1bc9a28e8344aa5186600a99a4b91818ccd838c31a8ff9b2552dbd14848a578f71e951412a5acffd8d66c46c0480415529eb6c061a1d6865dc9f4412e023cb0bb8ed76d0724c0f1a09bc9a440962e2d834bf80257fe66bb28dde9dffe052bf70eaad2d6395a5e6a662d2632c298374f447e88888c05ac043194be49e270363a652390765c93073f3711e1937bc62319ea04c3796d1cc3ffe64d2c71c02b82c324a25ce3447337993565c4b9ffef66c885a8d15eeca521646de0e328bc9a8ad4b6abb25ebb7d6be666c0434c6665f10026d48936603b692ca74132634ff09162ecfbc841f1fa67eee4443b9e3ab30cb116459d2b8705a10c4a9f4fa83415f4247441526328123e8fe154bd1d48eaa4f465a46126935a81c261df3bef848f9fa6daf4a5b9128804951ae7d8158efd3a0723acbbb4e8fa9f34408369eb974dcc5f98d112ffb0b213ec9d954999381f2447eea89360823a60f476f94c16dd8f7d595a5ef15d7afd36848c2db5cc339e0c61e66f32ad319e8a18a1bf9d581277af43386f7de24b1a2c0b0604658a01b495acbb739cf11f4ef1e8f00e9830c222b06c3a9004573d65239a95f26e3890c9aaa065ce4c36818e083a9a66593dc9fc1de2e6fe7f1c1bd1aaff5966e9ffd7b9529c89ea14e6e6d4346618b224244d627e811391c3eab6a3113c67f8808537c507056b892f47fe4040f0886307d572efefa84a24383a7e90a709ebcbb1232c8fffd35f0fec0961013e89618f6b66d66370492cc8c7ae6bc4f08176c5e577f65d4f1c3759e3ea3bad7a039d054cfb76f5f57aedeb2fdfed910e750de98764237b0d791e1b5eed0d41aa240eba48dde66677ec3ccad544e4e7822f05031ad099ba0ad48ed86f35fdc4494fb32ec8d954ff4ad38492a964caa90e0ce7b9022dd10821e3756605222d3e440979a38a92a4e46c1aa99fa4e388e73d3a0e8af33dae060a0b9f54912f17d6df0e49a8c58966cea3bcc8d204cf62b020c5648fcbece2dc29c9ea3a5b4dce540083ab1fe95250cd0b7505d3bd3ac9522777cb33bd09cdc5a70bb1943869c4ca2143cf6db85d068eda7294b927185bd09cc116ebcf8ca424796cd39ea9369f99809fb75f024441271f62c92d211dce283acc15fb0b6ba9f28737600b7bd0d5b856b8b00049c59e4b2ee711ed586377c65a99836da74c99fd74f317ddb5c67a1e1252b4b2563120ba1f1d31fc3f68f56e2b28b3c103ffab08e916417bd2285835c73702f51a4169a03dbb17bd5981f49187241ace054401729079caf3f758c895bc152ded65504cec413bebd395832fe4ee0d9815227c7959b3355b1088d44e40fd6b3bef70233f3a26924ad373b879154b123839458b47699853fc300d94c2de97ce8fd5122859e90880a863651d76c66c7161477bc763def95eaa941fc3ea4171bbf36b6806c9816141a4d83ea445b5a404f5ac7dc043ac9ad54dd11662b9beba4b43a185ec0c4f1fee3d4e6a35131d57082affc75301165474cae43d7b16810d869f8cd11d9ce95b56cdafdf279e68bb7d31af1548485f9896ea8bc77ea08e5ce00e9c9eb888d1761de11f52d2ddc42b35c8d1e637d319f51f8ee56555ae8f81b914503d9bf6ea6ddce08d853d68d32338ca3dd43bf3b9ca4e70bc13f49c194258cddfbdce5361b5b813eba6b8235c17ec705124c05da6e6568b0355a769d2f4fedc7209639086a192b165bfbd20120735eb33bc18038a1b9522b97902312f8c474fb70284dbbb8735f9ecf0dcfda8e198c8e6d618f1f188d6521973b223dc342ba20c613ec35b25361506068d762b624427d1c8cf41f75a1950715ec27e59bab5d30f91976b735be38011259ba122fc8da81c0ee4d137d3ab0e4ddc1a3d2c2e98646b0213001c3a3b0f4ca5a2c851355fa12295b7b37d5a9b005e0c28570b04abfc86a4d98630347b4a39a18fc3c7c692f5cbcb9b346e429474b904895e212a0b285d157a7dee1334686a0c6622ce394f4e342ade1ad044f2aea2b60229129ea33fade07a43bef320bb53998cfe62a2cc90b93d26fe0079806222af3070aad7714f1c16155d151cbc4b199796169645f797e5fdf50c19293181d3f0d9fd111d17f192180fe87cc2530aa274935afad92f6991e85a09ec9179b595d136788f2de29670918b2d09a50247d751442512276d612617888fdb1a309a9992fe2ee408f1ed0840b5b89929659c3b82e399c3d6be7e349e69389b02e58e6a8ba117859710d7b33d3ee3b87e7c965126e201db7a324501db1a6bf3261b827f06dbba927e2a233bfbf158eb1f21ea517c8f4fc38d54132b063889627eaa11a10693792105095ee748d493f1ccb9dddb5c8ddb6ed94ec53927b069dc1c0b1dbda5c81c3805df5fc85c009ea4818d148329cd760f49dd93d9d18fec4b330ca262ce634c8707764b78df269f93d0a6365ba282e75cb8275d8f8675738b080fffb175e9b0b7ccb517718bcab4299072e6345b07291f93cfb43217c48786cd6bfe394ad7438a1337be8a6931959116440808b554bc09b9a367be61b0c54c3a39dc09657f7e312130eb190c99e08132593b099ffde507f2f810a993b9277e12ed7ef4a99783457ef1dc1661538ee319949473e3a77c5580d5617d74ee1eead36098da561b1c881aeb2eab793e9b4af4f8d94a42df911fa1d715a33639e728282d782ad24456e231c0411a89c6ddd0876f491a94d4b82c67acaab9ce8634739859b7227244294be72b8c8ad11fd5c1f470708d5b0a9b1f8b02c3fd7a5c1495b97b539b5b827b041127fc67a0a4de42ee1da217c4f696df32ee2527fb58a92dee957699d41092ae07e9d6b05e10d9bf7c63ac1739edb32c45e5bf41b232e6da2ae008f3579fc2c5078be3c76c755a40113fcf5a882c41d9d9b62b1afdf25420e18ac80e2826ebf40bf96128eaf5a1fb3cf85a49f1a576e24613254f7fac0826a6310ee6921f742598dc5ee84b2fb527ec47c52aa0cd6298363d66e8c05d1cd4a8d8083dfbfdbed231490d62e49a381d91f3d14e3877320b4a038d81830e201ddaec91e628d6d02040d9d3e47f276121a6926449cb915401adb8cb0dc96f9a2b3c814e901a9ab44142456bc1da4f8f833b8b10710cf647dfb95c78552c1fbfa222e3f9c0451264021dea65c68a41e87ce2027d8e773f76b26904710ce865ed216bc38622c14d18fc4a248ef3da49ce416b1549738a18c16a48c6c910667f511a550d02ba1d7e0339c3a8f8a116cfa93d60969c0fdb8fe663c1b26059ceefc892dbae83cca22a9e14f2a775b82f93cea321ecd5b440711ff18b22416cbc4181ad6202664969961f696a4cb0feed6ad2ef367218ca463e7c98be3fb87ba19f0c13a1c474b279c4e860937030be14de55e4520600d878b2bdc57b94793e88cb8efda84c7603e927d5fbe358d44edf39f2288c5143cbe7c7f1ba4d136935d2556dbee0156533f4704ba8091ffe7a0c9adc48659496b8a4ad02903870250a8e4a612feca82d151e907ee47d4a185e89b6f88565f3c71b987994b8562eb0049687823f76b48884543988981a83e2ef37a355414ade8c512991700a71d66506ce48d6800b0c03713c30d1d296a2baf7bbf0c34049dcae870a16e96718bd92a6f3cdd581ed5729c5ab04a48929155bdca349043cc902535e6a88b4cf9ba438cec2b154bd8e348d53b293902306841c40646f200f9547cbad4c0f81552fa09607f3632935965fc38c0506e8f231701fd76f90faa16213dbf02876b856febb5ca618f0805af0a8014758a6c505351a1bb2bf9b3c1b36a5e69bcd6ce97caedf40e98cab71bb73f10e105a31c70bd472cbe9e6349f1326b6243b29990527aa71e20d397bb482f89e98a4aaca251f3fd1230837e8469f5f0640d02fe8f26289897ef172303da6ed5350376ee95b3dd1a980c154b84aadabcbdcbd783ba0ce7b55221f6878bdd97e21386af5e8e9cb3d795f1f5499fc2761f015366a86db3af49b6849428f58924c9c190eeb61bae52e5c205387d1089b9097c0cd22929bfc2be427416307fba39381df510b6338ab4291a609849becd2008df748589e9a4b902e305dc58cbef567c2ef6696591a608044ef77a29959c20d9479c9c7c9ab4c2915ba1a5955a3bdde90979bab01b85e58808ae57f2b8a279d2ceb91baede0347cace8428f0e9c4e371d222f20ec5eeb8ccf88c9680e7ebb883be6dcedfe7bcb5df4ac79c130a7c7c87c382578587a6ca4870dda59d24dcfecc0e038d38c66f01220989b8cc1a64dc64983196a00f5151a9fa4cbef1cf243827c9ea2d5dd33417488c76332e18157d52971c812007c74634006699f428d9291da9627364ba2eb09900623812c36f4b5b133581ae18b56029cbbe89694d9c8ea8b5517dc0838bf2a5f75614e0e6262ce71cf71198604e9e42fbc5a7a8cf2da06b88e19f3add24f73062348b1332de96539f54a16c446d4c46c9655359bd6893108b81c71477ca04e9482414be44103ef1d99a2dc7689ec9d21f1b6c1224b8e21313a03518d46dc1595160fb26a6e75849a87b20b5c5b03da69ea7a59305656a503a51250d3fb0e262b8e3157307a94ae07cb07e572a41aa14711be13f5d66c925164d67c6655df969bf5901e9d07080cf269470444d17c2b7426a923b695804bfe532e97cb86f57cfb446eb2f7265b6e29654a4906d5071a075f07f5b23cc688fdc471b5ff86e0b8f5b99ebeda7fdba3bc0ed6f0d3ad87f63cd57e7c6d40b4abc140bee2468fc53d04c7c59eb39fcd9d5f4f5fec371bc9e01734ecb35fba260fca4ba7f43e1070f7e913c195f2ca78e98fec5e3692c12c4c2b952e04c04fc76f94c1ced8878a720e3e0e43088473b86eb978a385d0db0044eabda2450426784927c32f34d085d70415e6780c6cc04429e7879947a368ab56adcaae1d0b20e2fad7e0d3382e43dfc0d610827cf44d854a47dc0f42190214f79a38fae652badee47e09680fceb40a09b5b56e32518c68d590fb20832d043560072a6c052129084b42907261ab092957e9c2561326b83efa06b69838b9f165e81b947c3803e48f830e48fc7dd34905b93bb52d7d9a0ad26ebb5490f9a907c09c697d8e76e6d3bf9e73287d7e00cc09ea2f52845a95d3c4ef6e418d1c399c26ba9328478072fcdb9f5f0241821c227992ec72c21b0f6e00f4e6d7400a900bae89be29c36c2a06edb1efa13d667f6ef7c7426e7bdbc30d7a3f179adee465ac45a6943d9f8f855cfeece1f673e1ea62f2f9f2883fedd753223b11584bc295a9c3742f2e3f9836a22b711c57c2bafc4649edc39d5964587b52dfb80f330b78e347a0aabfe7bdd1a47e7ee4f2db10af1042bc80061d85b8ec9e5ff721ba0f3e5c27729ceb341f12dd69b32a7d63e3f64f9fd3681a1545399166139692244633a9c8288912d66c3291665291cb39a7943e251417a22654ac44434ab548c38c862ad19012ed9391ecbc27bfa49717c92bca4814aff83bfa92d14e7ef74e98d190660475b03f67f28bc699494ed350c7152fa1231790912a4b6a4ca599e438991a5ad054d28c4c28da91b9a4cd2a465c40470861463e74a3499dff61bd22811492362edc78b85c7933d6a452dfbcdcfe1b4cd4f99f0fbd5c99e4448e637acde43991d3b0c9e451a7a12bb16f62ab62e3c4d6b43a1f7ee7dffdcb26c3cf65f63aa7e1fa97def841fdea17bd683e34145724a85ff58825093a9a6f52390d3f6624734d9e0e9891e3f8d0d0507b8c0a777ab5553798a81f667433e7e6d4c53c0ad3311c1bc7876e6e3051bfa8f9cfd5048892ad76a85f23b57411cb0a8a876ee54e17fe6a87da487db3a53a70638b4609b2420c6cba224908d083ea0fa5a5adf29ccfdd3bcd3f3a141a8d261619fe911f5258734307d7e53232d8344e9c096c496dc2cd0bab8022e90abd10bb29600084a0345a5e04a144165008400e5e688104184421850eae2450b1c452117e618b0746bcdddd3d761a9123841046da1042e8300265304a2923c39663ac545354386ca6d8c87453ba999ff21a9d425bea940a618035fd30c0e0022a54a850a14285998abf278938d8c62601397270fb8cffaf542aef96286b95e924944a604cfbf209e10721843042389d36d562c4660f669841699065cfcf1a6cb188b83d7d63ec6e8feda91f57da2f03973f327b91c9793996b95657403057589a2b2c20889165d381103a6cd4113666a6b968d976d25eb853f5224669dd0a8a458351096ed1606cb4b848298dba18cd61abd89d4589ca2997494163156e4008b556f94729a9bb0a5af4528837b478438ba81cdad3eca603df03c094d2dddda574970e3f0b42e550b9576042e547e52000010c60002ad411953fba4a95322aa38c0e89bbbb3b0e2a3f6c870f5b344efdb86ebf0c780f3e0821844010c62ebe4038a774b9e6b4e17eb540880262675de84a587850f9230b0a48ce6be59ad388662694966951166d5acc4eefeeeed1e864d44d22961d547eb9b94714d074afd4330857b0ba86d358d790976c211410c39a195fa64b171fd6c84c07183d498c28a015c8400139843206a653319b0e7c97819fda74e0bbcbc8581a3c79420315283d3550599a50929292c0381a8b95040515224419653cc3731c872754826066fe828a1390cc66b1b021166b5e6dd4454a3ac9199d04a6897a28262625d3791b69a1164ac1a583ba815250c1066435aa70156c88c503962417438902851b5a82c59a170ba949124a4967242591740512b7c42d714b49a6282491c4c256800d6140409c46c258707b482625b14091441252121236e4a4098b098b0a8b1b4a82c54a6242091525492c6a9444126b562e22b2c1498cce304ac286b830adc1c2380808c888100f11406605ea73c30af2a2a1420315283d3550599a49496608098214835fb7dda613b1a1a42b90b0212754409c66b1b260b1582b88c10d35ab997053b8256e4963a2b134d66d52804d07c9e4968ac01202c4e196b42792a891290adc1237a571a6ed161236840d61477c013b58f392accb53fd19cf721c99d42f59492ca525549b336c6c0cd0325d67800370cb01645a80d811880d69acdbafb134268d239dc8a42faa9624bf02cd0475d14527572e7cf8cd389288e510cc38d0694cf793449a91265c1165e8c287d085645061237160e6c09ccea9552ac36ed6214bfd6068e10e8761548ddaf008b24c83d5bd219e04da1e3297722b5381a6ea910cceccbf6b14d2be495dd83737582e24a51129d4ae32c2883aaf8c62a64cdb4e5c45adb0b4c8d8d091eab40b7f2261a52a4b303231309c8484911829262625d3a55e52704941051b2b80a1a3e5c2159ed48f22b912160f5892b8e0f64f6999b5c21735890b8b920e66e54e3672245c34d4dd0b0a122e4a1c092749129302004a2605ed42288588720080a632a2ced02b281277e1532a204e03d12c6e0f35d08d063a723f49746a20a321a1db4044109d903c6d83cf7c64a8634142009a4a0610ead0ae13694037d420a4096d48188807a02ac1fd245106149efcb92bef1e8b1af7fa540cfed7c3fca5d3bdf4608b74f7c75e7a9f3f77fde74fa720e25e2fa73072b3f7eeddb3f1d23bc99f7ebd6f3dae6779eab13ccae3c9beecb95ff152ddc3ebf2f1eb472fd5fdcbc36b3279a918b287f9ec616caab33c7eeecbd77ff9fa3566ebe1bef22edecadbf0beede9b7783ca8ffb92cf6cb9e529ff178e857cb7998e6f1b89ea688f01a1dc01ca3182f5da7182b5d77f720aca11b037e96ace85f5b03e2f3887fbd7bd1469f533071f9e1c75fc987ef1eeb3c8cef363e0412ede793e211ef8eee8dc80d4123c801e842a882d1f2c0774bc4e77e7e61d7a6245a5a1a7bad25888ad59656ad8aa8f165b45680d0e7f4fbd35640b774d1f432eb4d674aa07ffb07f46ff6e76ade87bdbc3ef37eaec98349b7c7efe5537e97c1652cbfe3c95a80e4cb6226d392fafdabe62a07f5fbeb8c31cdae0a84bff9aef7f7b180bea1df109bf7216a9d7f4dbb3a52e1651b213d4188740165f085aaf96066b63b58506b701eda7b8eab41a4204e6bd7fd027c505a6bf7afb29132361f8135fdab263ab8f2416d6e6e9e5744ee874f3525ea0d3ef7aa6105957b5ad5da855c438f7b32adea6ea544fd3e86919232c8472a6c4941c4f59ef3afff0175f0e5f9570d2fe00475f077f15c3f63d4f887fcf9198b477f45a66fe6d095ffcd6f79b9f2dffcd3d3b7f1bc019949908a6ea6cd4d67e5a9575f86fbf90c61cd77bd53496db66933dbc6e3e7a25e26fbf9836e1fbdd4cab33cbca696b7e17d33b5f2a918587e7b96df7e7bb805d18173842034c047dfdf85c543fd8ac7e3e7a2ac8b473d1ece9e3c9ecdc2565dcccbd12ab69f36a3375f833a3a90fa11e3ad7d295fc903320102ba5412e1356c20029780806ecfca35bdf768d704a4864b6d2002c36d58737dcfbc980dd8f74c2016b894c88d0bc36558733db510ae361ef1e767d8e663c78570f5cd8f1a0e086bbe93ce0f588303ffb43405fa9869598c317e5a4fbc2d1fb2220c193713ee4f95dec8dc184df34fa7d73ece64f174e2e4499e7ea583fad1ebc12be90c4befe8df0e464b0a23f5b9f8a33dbddaf5966bbfeb25f7d8bbdc74b8eaf574e422b7692e7ba4ec1f8e5d0b4a29a5f4a2f4b12cd3918f7912c3306c7af3b16969ab2e29af992bff9a266f033397273e7dc99a5d05a1c25649cb269e3c741d11947633334431ceac84e06f4551745dd88a4208d485ad28846e17a34892821cf8e3a499e8dc2101f285cc2312aadcaf5e2f9000e5fab7344ee7f8aa07b53f421b6602094a2e6c1da1c93dc085ad2304712d8001a65167d5830a5bc57c79b155f2572aa83d563ba8f20bb223848ba87d61eb08476e9c22839da93c9e735e2ddd37e5f8598e8ef2f673c691080cb16364284f1dac812f87c89887ca10e270c32bda85a6a209bc5925a95fbdb5f3d50d3a3f42d01180580af919c59e2ec5cbeeeeee9fcd8df663fb5d0e2fc3cb1f97fa263e534f061fbe82355d7da83438a5b576ddbf2adac47e1bf76ad14c12ba7f618b085014a1cab5b9b05584225c2896ee0a17b69ef8e2f267543e757fe83198ae5f2f85c0eb3cf050dc7420f566bcaf31caa8563f547e68439b067e4378a37b2d5ea523401535b0a2cb215fdad8ac80d8c2d99bdddd3d5ee76e2eda598b1510cdce1c8d26f65f7692b9d071561e3ead5088776519db2fde28849fce8f89e0313d0e97bd2fa3ccf17dbe57ca93c5ec4ddbb36ff6eb6abf9ea61f47a696277bd3471929cb1f1f1ce66426e27ef27b9ac71f871bbdcf2f7f9c965f3ee5a71f1f993cf137205f73d97fd8cfb769d4ccf6f4bd6c4f7f989d73feb7fdfc4923c79fd68b36657afaf2871016e217e24febf1439d78e23b5fa611657bfaceaf74c6aa4d1b9f9a361d2ccb3c689a9917a3330bf1db5bf9cdd3380f9b5008b3895e4f999a2c4ffcece9675ecbe561be3c49f69b599ef8f3f91d673eb51ff3c7a7ded7e392be346db685277c3d7eb3978ffd4a8f7fd0c9953f33fbb1e4815f60faa6c7b08f9b0e363d28ef35638cf15ed3320fcc828c75074a57bbfc2c8b8c60745db8b0d564e936615dd585ad264437834c5461ab09d2cdaeb6745909ea405d5fe3c28509f813ecef17928ae93ccb340cc33013a418a66930cf18b5f4e5ef68766aedd7ceeebeb963a6cfff1b82c331cba37dd87f6ebf28e78f0f0e375cc95f91ebbfc3e537fff2785c1e878b4928e394fb4dc62c8fbc7efabbf0f7f4f577f9b874e7154a158bcb2c68841a6cd8ceebc217bfcb7b17ab06c7f99ad1cd64ddfb602c664d7ffd1c82f994fd5e62ec573b97d800f96ebf1ff21d08bfe0cf167bff6296eef575ebc1ef96c7dfe5b90dc865bf17ce6ef6a5b343cedff17f3196937fda7af0f360f6e38da5fccc520b63fdbb17cbb1ffa66d3a57d1cd34794d53737fcffde106445e7f1766e18b527ac8ef9f9ea3bec5bb58bcd3b337abf7bd7830c7d0cb8d35ce401df4c2f7d1372b0f519fc3716a709af894c2a5fb62a43d7f3617c318ab9647bef61819fcc2f7d9b4bf9d7c3dbff6195f8fc989f1cbc7e4a7e85f3fbf06237f79a901cfaba4fa33cd3d7c5a15501f42f89aefb07df63b9c5e7bde76369b59e8343b27bbc6cd5a739d2041db673beca0d96a2bd6548c6c0ba0eba5164b77be94f107c87c29b1ef1137cdfb7c14c0fdf57303321f7efedbcfe73ca1cfe17c14c0591fd82ec0f7e11e07d82ef4c376e10464be343df4b46f7fce83391d1fd3aeefe93b3fd36c018d2ae5253d1231bfb718ba9cc178a177cfe691cfdf1e81b0b18982521b9ed163f42628e8da4177628510cfc41863cbc916379a2027465f1dc189132e7761cb491852644a361c5f5cf75893eb398f3a0d6689f806ba3bed90ee6ad7f617db95111ebbae9b169e409f5ef4f2be5a899f50a88ada5941712ae580f8fe12e8fee553d7d3f7972f823ada417dcb17a9ef73b4c37d8bf55979ee7d58fef42f5e6afecbc31cf752d35f02a87fb1b6c8cbfbc31ca3bbfdf545561ef5ee1579f9940358befe0c2b8f7af65ebc23af08cb578f4257e1c256129270680ef4c0f659286597e673c4dc4f0ec723800b5b592c5d2744774b39c0bffe0c2f8f7aead07e3435c34ab53e47f45976561e657d3867056e41824ecfd57039c01ff533bcb0eca03e5a9f954759ea346cbf219d6f3168df7fa582d87878775cbe857a29d3efc447fd8e7ffd9513f5cbc1572bc21579f953f7e21d657ff28a9cdec6765dd7d55df49f3a13e1eb2fec790342c4ef6577b8a79de7a35d9ec5aa9c46bad8a37e1bb6c8d1cee9b9165be414246807169ba22b36753deae3ef70b229d3a7a8ddd9a9ef9c4d99ac03501f511fbfbe7f4a02f5fdabfd2ae7a1fee4558ec3b86aed09e65c3d9185350a07ac823082622e6c61f1c5c52e6c2561088c2f32961563e8b00410329cf925e0421c8d4373aca8e28a18a3ad31c69615516e8c3fd3be8262162509d14baeafcbfe4d19bc9efbf67c8e76b42cebcf1eb33ba777ebc37f7aedb7b6b5e2088a6fb2fe5fed9777b1f12f6fe37d8e765abe9f3ffe0e7f8c3bddbbf5f1ef6c10eb73b4e3f26c7d6c9ce67a977fb12ed66707dbb0f179a7b9dee4659ba7599f23ec7db4373d6677b83f591f1e729aebb9e767ab599f1a9c26b36d7d38b343fd6c7d7c8e76f8dbfaf0b3f5b180d35cafbdcf571bd4c31ca8d47f7d0b6a5498b3b2c33916cfe76827fb15ebc339d9738ff28a686ffaea1539dad12c1739cdf5a62fd2821a755e9f594ee234d7e308d26c119fa307c01cf9b6887c9d2041577c910474e5c32d1564728efc99cbf230cbfba2c1135b3c115b8b9938b37a82ba93d30655cf71524aeeb3dfe19f63e3393db7226788b1f2743a9d9ee338aea24e9fca7e06984ffd0c321ff35cad94a26c2ab329bb234325979db8d373dc89e352a8df3971deb771dfe9c47119f73b7ae3388ee3388ee3382e559f3a4eccd7cf74b89f21e6bb1b2d8c55fde5380e2605536bb51fadd5b4652ba8adc5db4959e83430cfb2e23960b3df906edb388e4b6d8ffad3a7bc9887f1649ef33ea6e1cacd73404cea4fde8e8c85a95d853196b3df902edbe1d22c57d070b318b9ab5eabfd6890a7b769557d196bacdd0572ea5a55edb6c1d8aaa2c58442aab1405a89f86b12b7bed6aac2881bdfc6ca47aefec97e43bad3b6a538fb036561ab4e9fd9d3c797dbaf9c7eb352561a640af5d9e9b4d98f861d7e5aa97648a77d1dd2dd7ab243ba215dad2f2e2d365a5a5a5a5648387204f5ee2b2b4f1d07a6b339d9d418182fda6e4837a46b551174b3afdd47c33d3d749c9867a931f5cad3730fe3d130a4abd5fb68f8b10de9867434c02a6a50c511b7bb1fe0cb3690418ba835442f6cb55a2da368e48822547e2de367af07bc9065848cdbf595e41b172d2aa4dcae55bee9b8c3e7161555e2852d2accf0fbe1f0fd5cb7ab56c18f42069b664fe1cf5cd50d75d875a5a7c871eeaeca32cdbbe6c5e4dd3c98ebdefc980bcbb29e8f615b0cbc469c89f7724fd3348f91a09a56bd1699eb1dacf14fa2c637cdcb69bf77843351eb590497e7becc7e3337a3327dc3bd6ce91b14a5365eb2bc665740a81f64b5602fdf876a65d3372c2f1f47df7c2c2f3fc74b1788b5b8bcbb68ef436cae66c36bf1e265f13494075b553dced3fee469d4fbb2f799abedf0acb6aabad556d8d1c8e0cc6529f320f38f59b5a01255ee5451ffd938bc46b051dfc8efedf9325dd7352f4b3d2230cc49bdc9cc7cd1d7344da3da4f3a4d3ca8dd549e4c9d56cbb4f9d2e7ae2edbef7a138e7b997ef3be9fed33cd9bd49a1e5e3d7d35136c95c92434b45252e1571fdee42f13cd6497873d0db16f32ed667b9ebf79ab25448eb352b4a269b6a555b3b6eaa2de90eececabcf9e8209f4a5bb54485b53725247cd3b30799994da6cfa067d6e4f15c4f9f5eefcf3dc4a9382815ca7baff3564b6a3ff69c5769067fd35a2ecc4ef6fa1dbe795f77b3d7acc98397abbda6dc3ade00ceb8746511fc095730a8735e734e29e58c4b530e65cf5e3314d22a8e91c977aa9f872eb3ee8ece600b91b25bcac6e1fbb97003f2c337c86ee63b3946c1899611945cd9d39f7fec18698cf171d0914bfe97ffb42d1f6e402219cc42ffec494593298070b3d61a8773bcbdb8e4f1272eb5aabf6fda462432f9531c71fdcca08f1d176e0db01d708ed223723d46a402d114245ae74197dc98fbe3822bb990d0afd73e7bf1e4bb0490098c02881fe60f1dc4c2003f9000082180f8013ac1041bf1132a900b180610430061f383143643d0099b1400810415233e8713c65803850a59dbe1715a9ac6658ceff26394dc4e649089babb61f76dcb5db0d090b2bafd4127b75f8666a101743ba799dc5ea2dace69fa75aacbf7afccf3d2c69b68aba751f99ba7dc74648cae04c5cfcf9899218422b84c7bd371f959dc6490970814b09e0f1dfbe77e08b8d0c6002a1aefc267e6cbcde3a76fecfe9f25cd13bfb93e452671889fcb9776b9d67f035e8ade4ccd52e56a3fe621e313e6e7c6e1f6f36519aaa408a20d533e4316643ffbc7e8c17bfd88d7cb5f12b9f8d9176bdfc418e40fff683fb7b523d4012fac81ffe3dc4148f97333b93580d76016fa636bfc427669d4fb40ff885a0d136a6c0975d06f4f25b718e6cb8b6af2037de9679846d923fb49bebce66f3fe6fb43ee81044dddb8d1d7a87cbf1bf4de803ae0e5cba6061d35843ec898b963a1c26756d54ca9fc39dc3d462f40ddd13b7a04590d4c21c61863fc9a34ead77532ff33fccc9257366b643cf8c2f76b05127c0e6d17e6f7e0fb84eacf3d643cf812a0c2ab63c718e3f7d57534b53f352ded6aaca8f2a31f25535518b301b402fa1b87db0aa03223200b408531833311d6605167aa7c19001061956a9f90f1e0eba1b2af30727dddd6d8a07ed5ffdd2d92a6f6460d3aba1e7b8a7910892bd401dda6fcf9cafbcdca54c852a841474c82cf81ed420278a072e4f2c35394d1cea85fad2d9dcc47813225083d8156f5efb4aa3f48ab6ad0d81132010bcc29fd9f64b01db60bce4ee5ec07d25fd384eade5cd304779749b9bb7b4d1a9dcccfa8622a1a194c57e1c399bd540dd41cd52cb9cc506a03474bd7b1ecac541cf6c216135670610a198414150131a43061e8f2ad2142fd9a21d4ef359bbef9725ca63e5cfe191c27687705b87b0e52fdb0c504a10b7f9c2730c475bd7c29ffe766dc05a1aa325f97dc6210c1957f5d1ef9fec5aff3877caf7d7f26b71019aac2586b922ad733b20533a45cd8620294fba96e7f012e6c316189ace688da37f0d69851bf678bc46ff81989d0e7b83d552a36eace2cbc0a478d13eaa752ad6c70e4d0581e84ebb0c6775ae52f43abfc7db4cabf868a0c4176a46703dfee66ee98d57e7e2530321e7c4d155e190fbe58751bb0a34d6494d60aaf1a74242d093ea76b17bce509758a8c7f4a1217b69a90e4e2b8b065861a176e3fe6b5b3421832b904659545af414751be6d29a9045dd89a32a5005767a655f2655a25bf6b95fc9a343a999f516541973d1bf8c68f16c97c1609865a54886ef4606b0a933b2dd7a0230f3a62d94119ac41471d74041f76dddd3f5e625183035885a6c5942dfb254b29db72d43c496d691aff8a84ca3a72c6e798fad1d16e40bb3cd5cdf09fac34bee06adfcce72d06ff113ff677773f4fb445b0b920f539adcc4195efee13b3745aa05d6e3a17a77ef4db0fc81b6db4f1235e6b1593fad1cbe3cc47b887d65212a70b5b4b33b8fcd5366c814b4c562e6c2db5a464b033f72123e23565f4e69f0a5b4b4131ee20839dc90b596750713b99acc6a8b256b4c30555c04068e9c88833a250c60f645401843290c8d8a248690d20cc58e2451269e0000a6528a5a0052d327e40060fc820bafdad127255dcbdbb0f51c140010612b47b072e28a208151441050a8e2892410d94a8b1548231988ca1c41835b830feace0891250e8f003922aa248638d172c6982134204d1851663383182c613c600628c1e964c1923680a1967482981942755a2401192528594286a7a78a26607e804b4a2074eace0074be8d08512d7136c58b25a6234b9fd332bed72c2859095c820e4a20cf6cde7198437fdd16fbc6de8eb6b74ecbeddddd64b1084f74210598c1e5c485c0d498d0e353a0059628423906086112c88e2a22205062b529238f24c86d8a1ca14159831744d9192824b4a1046a8444912034acd0f5713a43429414d901825108308b244f04b80024a16500063094e7448632ec18b2570a1061a68f097801a805b33730900801754cc42ffe7ddd8b4aab74fbe108459e87f805f786f0062a01c9ce3f65f0fe0aa22408d2c21dcd0379c05543511dccc055371bb9be016dc7eb6c1a2fe754b84df068bca83990ba8838bfa855e7f11e2380f69fcfdbf971b70e51f3d18e0ca770061412ca594466495524ac983058342198218506ac08230a0f45044185072301206eac256184b617cd147541df813195cf87d54fbb30b5b4f86b8f0db06355ed87a12c4850f75f00f114d409941144480a2648a194786e435afebba2e2b9420441150b688a24a1113b2d8a01801e312451103358ca050c5939c6be95e5f91eef585143c7c9346c191264e34998115579461c40a84f05518f08a256968c10314318e9ab8c8f0810a56604ca9dd44cb0d7cb0a9ddbf4a468f2b33ba80c1aa09f57461ab8b23f7ab2b2a5df420bb08badfdb2cc1dc10d26c1da8ce106e90f6f7671db59f4d0e1acef0713571580381cd939066bbb203d71faaa4c7ac4d4136ca8822a394416e87d8545965adb54509494bb0e9aa74f9fec40f515eb0831152300323ae31bed001fbc2885094525e325e52964c6898002e6087241d0cf1831f5a80861b41895282fe55315ecf0fa5174c2ed7f2820a150cb1f9ff192500e1de6022810246b3174974c124ca1753c068298148093f3c79f24409890b2ebcb8800cba287aa28c35b610e38aa2a4d483129430022535ba5052e282b585145bd43c09b2412b8c229030019b800ba41438a9ad2d76b045122db2c8c28baad424f597dfc3edcfede9f1c8ff78e466facce41a6ff34dec574f5fccfa673e30badcb62c7bf83ea369a7d3c36fc66287e3fc2aa9dae0389d34ed619e70a884ed765539ea949a1900000000a314000020100a888442b150381a88b21a7d14000c8c9c40724a998aa32488511463103286100300200400430c1999a9a11a00ef8310bde74b3e7a24ad1b7558a53ee2de80beea235d13dd21a01e0816f57c249d5b4b749f633b28fde803fd99d6f568a4121fdd6bad10510f10ea3d847a22d66b88d44b8816ea7d109d63219a0f8add2e5cc90f86bb39fbb515bd22ed80dc251b278aed6407bf7ec0d3cbe27bb53b7e7740a56edc5dc9d81b03e3b0db90aeb13b5ede9a78cbe3d5898c2972f1130a5e66116a89162576e6e48c63c671c0adf48f14a7b84b6ab5e8690836d0a1860c0ad0127b00e8b8b5bf37612c666eccaf2f2575b4550a032a627853fb2b2417c09e10222819990bc45ffa813ede3eb639bbf45eb37c3378c69b0ffbc654435b8d57f65cebc753cd6d859d98260dd61b22e045b18fcc8a29a04cbcf0aa09dd3fb581ca28339c1f7bf683fef502daad84b5962b403d7c32b4ae247c9f30d0d1e7af6cb9c1458cc2820ac0515981b62f866cc002b17a1ba074e80427a222edf5000319d33cdaa0f188b3c8ecd03f9c9ced4cd9e279ea2c7a696612fd93bd43e0d3f644da914cc4e186df20591d6bc658e80db832706df70fe790f6dd9317277ff39fa13d0ec8794d1c28bd2aad9dd2f90c76f0bccfe52d78eba6250171bcc67a322b4921ac80b9cfb0715f437c453e2ab3b96f5481806030d40be0af443973fb4598a1d4c4865509b060d8d9acaeed8254931d8d7e5281d3178f6db0dbf93362bdeba4b1f547be24e23dbde7895fa8e3848908c71f972e180f9aa9fe553601d1abd279e4e0f60985bd2b56b15a097683e648272e0a4a72007a2cb2140dfe290880f4ffbdae5b0c06e3780378528db598ce77a818dd5612975762e4c96e79ddbc929a3306a1792ff2fecde267268f6dd7abccc11ed4c3f029b4580893f0b3d5736005d2593252b93963ef7d436b6f75c071c24c1e14e02c921a9d690236768d5ec96e6a23a48260ea89b8451f086f95de8852350b9e0a8d2c1e28a565c7530c016c99bcd390113d6363df5d7f347a6ba15c411a5f87d4034f3bb43c194abf57e7d54e61288c0829eff79a4e9385e2938129790dc226a08f293b6c906a132f80a0035fe0058c223de15c20ab3ba1db4e64ff4822c4dccc1f0b6a5128f69de9808a04da5336e16338aba943715fb3b2c0184ca9da04ea4de5a04f86083eac2e871a48f3fdd65e6dcd8c1e4a5c6bba342e98775f34602841051a28b8f00dad0437e1c138252628004d55411827b85011c466a84ee705a5939d8c70a46b3386b9599cd1426e2911b0b3ada88ba2d13dbc2dc00fcf087b07638ac8e9120de114d14509b54318bacc5d94bc2245c868bbd62956522e506f368533e9b6eda8493c07f0f46f8d48e228135b0799cf1c3236118a8a886a384cdcdef119b07db1911782236d166ee3129f4e3823f1050c32023348dc876179d7b5c708dcabf58ad08a1ac1e187eff26a6d525140fc2ad96fa3b14071f935daca14e3e8cdbeb141b5dbb013c9764c710c21538169a105f6f5936938397d7c1c24c884e9455e38454e64690a991177070c34317b5a82784d65b2091c6532b499e47d959a07708f3a5bffa76b18867b99c58e9149aafd9694a63f85134622b80a477e7dc07ba3f165bc6389f4c22855717059dd462250359743a435fdd80cbc870dc8530e826ad26c1618b82b2c2c133b86ac32c001adbd96bb45f8fc2c9209c19b0450a7140ade17eb1a80589777d30155662c914f719556a56165be9ba894bc34b8bc5716374c84db14230e56aa274d1aae90d2018110f034af439502d530e88f709ae67e3604541fc37b4bc87e6b1b50a345ca60feef673720f6339d5b8c2900af3d9fd0041aad36f0891fa58d613cd9bd8a342f30b571eb0cb4acab4db9e22bd5baae98a294ad1babd4947abe235da9b2e72b49814273988d6423204e890f90bc9b9574f0e719843f218f8f18e85adb4ff73003b253ad2a111a4b047ef5d3142e372656019cfc4c37dce8e97cb86d9eae8c8f73cbc49ac8adaa76b483fbc2c9894eadf0f6ba043a998e94c8ed1638fc4a6df40d822c053ff72f4de1840a5223b6163b0928c09187d06da4e33e9d472f0069283f0bfeab64578a4a2a9c224f5000be1f11a52d763f33244c9851882963b159bad405722f90d1b7df3717e881c18ee31d8a3b5cb7ec81091ce5b244c693e32135e61e5eca525d78aa9adbae6542eab34cf446b4fd6cf5c6ec1b3f9348054f70801136834d43dd3711c88ed8a0dd92319c2b76127b47eada7936e6254b01ae53fd91059a5f720d0c196024ec48a8767493071cab80376b989b9fc6bfa96c41a9ccd1d2a7f1be8a85ccd92e3ded0e16f4a785657967c498b94e6568cabd11c01f88e54306fb18e4a5c5fa02bfbafaefdee7c51ba9f1ca69f7932b3c56d26b4ff7c01ad0082e48c51b391d2c71052c2635690c6ffc6fa6f8d1b692715bfa002b9b86b0204c0a054181730a8707a7367e8c4e71ec99b8ed3455a3b44b46668c3bebc562e4319b6242a3ada82f4643cc6c37f8211226d996213c7da75c5c47754ed6d82f8a20fbf50f04284c55778f1d623ccbcf4686aebd2e201afc232f6ce0f2631c1364e5c4075c97f9288ac222d4ca7e0467ab2510f7d6837335c87e6a3fbb3318068228c36ec90425848924ca1e4e3ee6d7210062d63d3dc13d5800fe2b102226a941cc076bcfd62a5ed3f6c8874f60b8383e38c6f7e1db194a1e80acb5927665c651d8bb9b79596a8193adab73a083c62bf7372ecd2b08355688fc2aba9cdc766aa38a8f1ea07fc4c0ec8553e3583e7a9b9edad8d63cf80af030d0c40e21c3882ffac2f532a54f478b23da12e757235e5d3f61ba164749bba03a08c66b28f024bd4615732236410f9483e0afe72d60e597a95bb68e83bde419871477f38009a47113c5af86dc4f5503ab288514522629b5c63d059cf94d09127a53bdec154ffa3bb828e4443ce5edfb67d62a03eb649fc527a028c50550f42e369c38543bf91929921ebc50cc07f30f45774046aa72367b8e05e6f812a03054239d6d68b0147ebe8cd4267a19f33ca36c7069e639e8134a24bb382c36285db6fc11bb57110f247d1ec8c171efbd1fa9fa14658f684256f82607d407680ca3cbb8a06fda13c60923389240cf98ad7f3a9536873c9f9760c23b2d7f80ed8f81eae598d849bcf8f7134ce30215c72ca0e415173fa94e2efd226f479657c0fe75cdf8769455a092ae08f3fb366eae8264f728aab856be76595d23362d8066e1a6a2a8a10c3d869eb2aba4369a22b84bd67cf44b9b415d4a9d645c449586f9ad1f53b07d8725a2837ab32e608f53b66007825ed2db35a4ddacd03b1e83c5899d49fac00e5b868f3ea1c901683afba7465932d8f2e7966005a5d02af4079da88746607771b2e1ae139d98f29ff4c5732f280840bce870d0d5ebc2be8602c049c82d04fbb4f796fd5e1464bae39df0d392ef0a6e6de7cd81d782852f9a1d8560eddec9c7a44c9453bee839c453bf262ef9d9b71fd4c3a4611c5b09734194d8662ab92b2f32539786942d558d97880ae4e75005f425b7ac58b921db1855fb8da34dad254a1b86c327033e1cc6886a3604e8c6c3f6f5764b666432d008d35143590c8a4a7c512ac32b4f50f12f581157fccb46fd267ce676ed35c10f69ba244bfc7be0114601ff6cb9710298a7625fe3974b64c2ba30371537d0a4331e91f9f5217a0b82001e66a599501a2be5862878b40a8281c3f5c3fe191882f34c5e4879eca48691f72e1f4b51095cf60c4dfade37c2b91ea63de6de7a244cab23006233d4dd97ee5da502197daf9ce2b4afd9e3beec2b12da39fa2224fdbc15d2500f37970409c9c4b91f68062b54bd10340560ea26e0795c7122c42978b29da796943f38330338a7e43e882f53797a27970a2ae7cdbff41c6ed98041d2515543e4cc31132a618a2f893d1dc8288ac457ee6d023a274c26346ad525f09bff76e963bee7043bbbb01ebed8bc3c5ce0d2a7b1b0ea9310208f470c814095467e060418f0b33bfa976a693066a3c7edc5327888858e4a6cdcbf597336612e3533f9879843d2c46196d86193d4c88e5816e16baaa8ef65dd80e8fbb9ed49b5903b0a06ed0ef4c814847d74358c5e22229801c99d1ec14ebd4245d07961545801e068f1c883c08c35de3d8c44a452974cbaafe3204d44dbd14be585419385ee723c5e6143db6abc91fc9889662a838f044b86ad128fc38b3070419c3c50e285b4cfe539d28f44a0b0fb2e81555196c5765d6d3ed8085b52a678a95c471e2f380dae0cfe169fc13074f70056c38fb23918d0c080c0f9aedc0f9b5c1355867c7c7cc20e210bf3bcc77fed2077d2fd2177da5ad5d3b49626880860d5baca6eea1b330b8a357b9f9e2c84e301e24bcf39962f76e8d4dcf3a3f44ff7721c4155d1b4e9874ffb360fd9ce24c37a151b4ecc249a8437b74e6d9523730cbb97c73766083a0d8dc2e61811eecb66786d33ae26ee500ac81cb3251049a0405c581de9a773fc74e4b36d3807295da1f8723e03ecccf780d5687053b669aca9b2ea71a0c31dd6e1e8b84df621e9983404299c9f4690314ac89b0df77cfc92522d3c349517bf419499d114b25f8a155d7ce83943d41f10b4d16abbc3791e23b2da64be746b2878f46e204ee435bac07154d2ec38d523c2776331dc42dfab145ef9678eab79dbeb297b22011ed6e281a9649b523fd3a90765a5f9bac5fa4df523fb3b77d92972f0ac9d88edeb07d22db0ad47aacbc8aed0ce758c19995f850a9d8550c5aee003427386d0442f023e244c71779d66953fc91dfa81e3667a7caa4479eb798d331b42b950098cd76b93606524420fc56b59088a748a47ff3c12a2a18532fe7f44c531f4932d8df51277a6937573815f206bbbac8982d02b891812e95206e798f8c124f268342e43e7a61e9c11c4f322986157c614d2a47f834b223526af9d5148dbedb101346244972be687beba04dbc186431c36746b6fa12ffe650d977de3bee555ca7c69808cafbeb51a89bed1fd938ff52632ee5f0a5e00e27b370f46c328ac59c71e7241e5aea5fd294185e4ea199da56ec1445560328db5390c1db5194cab44f3887783d9f609a76906481a239eca682e0d39661614d87a766cd86574eb4d3a947742b7c9754c6f0302d26d816cbe3461cc8d9a4edaa0e22c7ccf5a9f7a39f85a390730a68469c33048dc7e4bc4d8ba38bb5adc9a261e031e4e85622cd756a0ccecb5325ade31b00cb141d12b5c7ec5b766a7ef37767eac19078fe11f73788d0b0c00453f5f1b927dae58d5fa9f90d3524ad98ef730dcd4bd7647dc842657aae841cba987e65921e9e5728ddb2aa607f246a4c9dcb6c60a4489d00bdd2f45b3e3a177eb2f72b32e7dbdd45a3519ae25ef6397dca870c8e386e8cd3512e13062798eec37b84a1150b0e5697cc16bd735e867e38d0f5bbe07a334b48c63db9e3dc6cdbedfad9787fbbc1a4a1e3f41ee563562181d87aa9c55d55bc8da557c294f57eebf6e71fd06614c82a65b225ea8f88f8d760eb2b60d297e58e3a69c27a6b12340f668cccb28164ff180632b7479871a8ff8a8a4ea9000f798072ffca2b93f1350168a49b1eeb10ce7ef4f9608b05cd3735090966092d1c150552bd9d7da4b957e08519c2f138802ca853a588c2dea50ac255693b28a293b6046af985ac4dbe073c7d47947f11e62409eb7c5f527a830c314a3a58cfe359d3fd11881fa42a8fff8c8a12cf2ae1f1f731378b2b368719962dcce5f9ff3520f5f27c9952e1a1d9df10b383a378ca9f50ef54d2fbee00169271b07352cc78ac81fb3852b0e5561516bf3d6dbaa62b160dd13bd40e2b5f311cd7ddfa1ff9ed8edaa90902fc57f1b79b7496581b4fbbd3b4ce29b7092d7ab637ff83b14469913eb7b0b00dc2f6cc3993e10e666f11f60b64de7936cc95a7c08a138f9ee9da4e0bbcdc59c0605a25b1d008b457d7ef791f5d8c3f566ff96e2dadcd18801d44325a57588d748f6bc29a5db08721a7baaa4b0c382c05b446e060734dfbe5aa34a0111b02a7dbb82624a4466a83700f7c351ce045d90ae21ec6635adb35319c9168492b602ac63e4ae236db361e8546a818646c5acecae4262de16f48f56e3feabacc6c93c59866f364f3528e68796ebec45bac17538189612862b2338da27b54b93b9abda72da8e8080ce03b098704e6cea4638125300cbc6805b75146e6793cb45f7aa7f23691a4472b4704305be051076d447c12bdae68f880cb408f6bc59575cb76eed1048a81bb93410591a2ded7194c39f81ab2461a9dbfee8ff51d52fed46e9445c30de51f1d7f1bc1dba444d75bef6111f63e1c4cbb5c52786ad32da2c64738603d8336bcdac5183a3d2a802b8ac0ad7dd707845c513887c8e62d0320ae7b892bb0c282c57ae0bbc3fcc5770db665ab2b812739189d5289d6401271bc8944eb69f42630d28f9e9d2d0cceb553f60198a835da8ff8bfd07f6eb8a45b366cfc1c7a029253ec0a5243716908452ee19cbaf728936d5abfe43f3accbf79e01a6a40f67101575f8ec7cdaf328f11586dcda69885d22358936d4a1710b153b2500827cfd7960cf723f6ad30675d784286bda4cda05c5ba975c08b7aca448fa86c3c2bd1ce79a507c0d736c4178e91b17351ea53dd0683525e64417076e11a91f792aa17e6af5eea4f83a2f2b9472dc9aa9f36ca6f405d8e3c134f551ef4e0dbb1e066dcd420f6102ec96a5af82ccc65c9805f4de48c8f48e9ecc43ffeb1ae855a128b8d9e15b54112ce7a64745e1bad8b888203ac0da0f8924a95979793f3630d3ae84b012c9c747bbb0887a8ee4ad904ae1992ac907e0a70e35b4c6907c044b9fa56fe8a2ab7fa21dc18e9c326e0e560d3e81161c1a6f58d55ac3347a0ded787f15a3f5cd83840f6c7522e0fdc50c32b0d2f400b390811b74cc40805d30f691a632f0b8903354cd6f607acbe190959bc8e1775e8d6c4ea0092384c7c05a959b1c716f880e631fe31f090022a0d983a9434276b0ebdeaa9532915b4ab4da92f40cdebbbcc417aeb93f36bbd2c99d30d22c921b68054fccbd71c3fc95a3f53b4ef9c875e7c6581799e83f0ac519a19909eb2b1d5b5625657f9d6e020b8a5421010def8aa4805e0ec423fb31ebd4de9a787c5ba9da61a927aec5b970e7639dc056dc3a56225eb8d4aeb7fba91b7a28e8c78b1711fdca95dbcf5b5c7833d020bdef1f80e751b22dde4fbd313cfc8e95c999a6dddb77cca0f6622f04298b2fb4a001316fb31663f8d695ad15de2617152f9d33f782d240fb7890f98e4e91533dc919f13fdcbacb7bdad75d6a92504a0e18ee425adee1823788876630e550aab7bbf5b3e3882f7324ea909d6d2be80ffebbbb0671cb2a8473b398132a65f96c0044861f94dbd42fa7abb298a67ada59234960027c6411efcc14781dba6c7300ba395d621c1be9fc1bc462e7b90f25f8f7591aaa6a900bda24b1199647ccc5816e641c18a6990059d15d2d10df2844286b800dbfc9474df21f57ad689c4757c401c63a6b6f953cfd42cc3da00285ca3c56d9233c165b7e06ebd612ac723be6ea4c9eac710c4d190225f8ebda19f8f5dd5db01671ee741a0865d695051dd11ca62944039168052cb9d5e10f0240663c7a5b43ad24472921b0729fbb6e20d968aaccc65cd7ab6e99922151a3b8a1ef26eaa1c9bf27ebf687fadc36a69ca3ee6a3080804acb5c87535c8bf94646784677bd7264ba8ea3546140d5ba4014b3a503a044a71fe113c35220bd3f0e7b627f9a8475f9055297ab0f9284c85c704de714309203a107e5f55db234f701c15f5c3a127fb2ce858a139ca96e676da7e25f049d4370c9408ad6bba10d049c1a84590ec175e5aaf8b2883e8b3f70b2643ee278dd5b2b12624612766881e7228bbc7adc5803f49a4501d0dddfdc7590c741f3a0ce77db3be75738956f4a2ea9a80592aaaf5e3cd2995181003f1008a32157d76ace2550fdc334e03603d19f8cfef8952e3b4662bb93c7dcd24a0c1fd1894f66266ed1af013f213b428aba0cb350921f0620e92f2d10b92860a9623033b4164c1e7e9c19a6c3ad80baf4237c1e241d8463af988903443d3e1330f17ba8c70d00c52e36436429d3e6de254a8e1d11b194ae09f3b35ff0ecff487065d83fdcf9a9b01f737e3462c46cc6874f58b7a791f0692136bdcdffb2427385bacd77de2b157dceeee36a91c1bd7775ccba39852bd85db846461a4e80fe8340a0b185cb6a35b9ac407993da0594dcd087296cfaa34caa2d155588ebb5ede50e4a0e96cc92398d076a2134afd311fa3b1f55af54c8d420dae4cb407e3ed75868ad6a6f2650e53d82f03743a7318541c7c77846871075c1504a623fcc3b6b18dc368d8d043cf8799762b3770ce37ec36ac2eafdb495b6528692b90f15d78ebbefc8ab01a8c968440ae0218276d9a1bb03bfc0089f0e5b6f1a1169c4b9cf746b1cf183d03c549108e274b8053229395b63b53c92480400b356e424e315b24d068fade09b515cc2fc705ba5f0bcb989566f12881b05a73fe3e98f03802db2ee8481cd3a72e7209d0ddc6bc99ec77e4f4c280f90cfd2e0278bc02c0298ef810beab7bbeb97f31487c01df84573b1c6d1550c7870d5eee2df7f259ce0d12eb148b1ee29d17fcb55dde7a6250da28ed2a79c7d40f8943a048ee79b48a46b14546d08c5776dcb1da528c1d48e4fcd6953354b453d983ab02b1adc395f246caffed2382f8894593950f5ea1d67adc927c4423574a17cfd1cf0e5a2bb78a8d340ea87efb3b43a155c6e3e258e64e32904b5a0cd80737f757ee73025b72b7c0c009f61a6c3d812b4dc025d93e2e013d17f9a426756963749fa0eaa4ee7c8a70eae839d74fdb38ff1d670b275044a1de73b311486d9a0f20f215fc1833ef8833b92a6aa69052a9385be1bd1694a5af42746ce4ef72b897f6f5307153b1c3d52d43c4d8b828bb1a46f7cb48ac5feabc440c48b7dcd1829c6ad4b1b2cf130af9ff189253b0c443c3150b5b518571f40fcaad884c596d906008a7058990710a5f5ca04d8520cef88c5e4fd8b43e7abe29148ef794bd094919f3d15b7c5e5d86364db52ac4ed768746f2f2e663b252fd9fd3188f94e7f2e9faa4da32385606fdb6dadebdb5d0cb4f36462b51c7e0b1a8be2a33b9f04a3ced3341c3e5f19db82ec80ae15dcb095f4a33e8e8a7273532036c58b4c18321fc86898ee1aec7bbe692dad413341c81c4ced20cb3a40f90319a663436947ea1de88f1e6ee80b9866caa7bb0b5fcdd35fbd7d169cd83b15fdedb07e8f66613e930d6178d6b9216e925200f8bcd9648268880cba40776fb0b6cf0e34ccbdec970c9c9ab37f633f6846b3f422bd915eeccb9b4282a0e62d2a963dd2e0540f7aa2b71cf3c042126393a7561449c937249933343525c3de694d00a6ad6dd6854217fc85668626926006db1374dfd3b2712b1a0f8387c65646c41a5169a3f60da606f0e56c17294b8ac70031d67b86fa8846db52cbb81a1d87f6e426ac575e99aeab60197877fa862f365631188086ea45bc74c690408716d8fe54a267154b1f6214b42882daf04ff8f970ab157713f5496e76e208cf14c2e648fa9399005a7340ec22d75333545d4bd5d10195055a03d6294dc3927378ff9e09cec98f2245c7318194074cea961a72daed8aea19305286363ae76fbca77b8593b833e4a370c4584472a8ed36e323ff6f11f6a01e0b18d5ff760b72c827a10cbc835a5344ec50be97ee3869cc5bec3fc0c181035d566d973f9b77bf47a6236e54b0a66ba3a3b4e136efb78d717e61115bc853a23481f85b65e5a755aec171f33e33b00a138d1a6998fc363643f20269f84677dcd62f0737a3b1a650f3f306f59190dcd76d4148fe76363b56f5708f16d86cf6d15adb719206e242f8df6c6257c8a16e4b6b61fd70a841aea8a9f588cfea96f6ba084d1ab81073be9dc1746b9a2e2839a864065b5757c8b4cdbe7347183a89b7eb43aa6ef6dfa9191241d5df20d2366258a9917646e43454a2a6b014d0aacad05d0f9b3412e25fcbcc1f12268640163094c3a5fddde96e3649d6d7bc1372718060d0de4439ffb5454978c931bdca738b59c24d66644fd7296241104880ddd47b3f81772de78a3919386bcf87ce5481f71aabed0016b5e9caf8c0d6904867804605f122f901b0553b24c883a5bef2bff74b9e2c75cd65e1343c9deaa03971c087af69497ed4a939138a15e0b0d6dc647b491a5c34dc07b3de5763e31d09afadd6bac5ea8e0d3f44ecb16f8e7b1a3a05d93469f1fcce2470fe9b6ec4e697c34344169a6e9d1147bf400d67f9c23ee7d57a3c75bbd5124da08989386413074cfd16a22c48f7b42d1416066ab454a177c61faac7a3225f740ab01d2e7aa86e2aa1956ca25c2f041ab604f974c5ee4c664cfd251b3aa5fdedfd37d79a37b5f01143066d6cbcae520b5453c18928557c9491df5c792b00a32d2a66204ddc101959ae7610b52204d2949b2de0e07c52d8aabc176bd809138a0da2a3f4d5f58b9c53bf456ba2513b975829656acbd10c762ede3e15b39482895d2de9f2a357752acadf9bcedeafe62ea9cc4486d0c2b9c5936ff4d9025f0aa4c3d99b0919e7a55009570d6e8c787fdab48fce44f2c82f5b8240da7e9c151132d5a44d3231d74901a2fe5e90ac4caa47b3dc3841c601a464cb7eabd744a9fab38c9e98fe473c1a9ebb482c550842c6e48a9cdf2418f00e329deab36422d1049109889714e61c056187e7a660ad53b2dc9fe86610891d459b7b11f16862aa451535289144fa9db1f8547507287f470382af90279954bd3974ed83760ad35f47836090839f58731ce409450b57e4aecd39a7ccb24c9445c70db08a47ba8bd57a8e260f3f4ef11568a24e4c44d0b63f11c0998df0a6e640d877e4d428ebf0e763a02f5d78824516723499c141debdb83cde26276f6f87603573064e3e2d352f703071be8a3249a0834c64ed6e63cb50ce7bd7b9682050a92398dccf9442b51cec1d9c32758807b63decb1e1d5435abbd12a6b036513e5015c211100a156fa2ef1fb40470b2263e0c2fb7650883fd67021afbf9ddd974816800fba55d328fa7f97d4381c58340e185e1d45dc03cc9737c6504de2ac435a4ccfb98ccd13bd12d178c31a1d64f7f83f6712467c972a65c3899677d7a09836d43273e5b003d7e8b271ecb04a0acd94e25030a549d0012c6baf75f35e26c15441b3e0ed02bc3a48e065f69ff920934235e23829a3c32c0fddd6c4c100f6530862d494d9d77123fd047cc696bd49e63a7b939bc2ddc2dbb3a187485ab875322ad6863475c1f6e25bb01a7407d7aa3c1fa314c6591f25e1f10ceb7800667748fd7bb82259e1acf3bf2426c27fdea0f5329459c9c453e5cb9ef40307dbf297285c25cf0509cdffa1d69d14dd670e9993b3925c16aceef75789103c931cf6114d830711df90a63cd7ec242d9e098a5a51747f19236ee88f3acd41ca2e9f3da2f4ef55828dc613a62d1bf18860e2df25c0a6aadc53bfe106e02a7f5526420a4e811b4784e9a2548a44f06e91934d5d6fdbb931f387064e0e1a588d8bb995039c8123ea60ef14ed3cccf4d7a0a283364eb1baa466a54868800a5698789e64e056c1c3a29067a105bd87d49bb826117991f79525cc8184217ea450576175b3563685b1f0d63448d3aaa7ecdb2fd09a505ee42949f1655295b46a268ee0c1b9219db378d8d44172aa364aca9a9cdffde46ca1851cfda892424d278328c75d0bbbc2debd035a9936401af2cc16b2128a293800bc681497e55d9081e03a77a1faaea74135c6d2e5a42f234c67c507099dd8c1bfc9bc24b3490dce8d6e3b3213aeeea1b4f28a078a5eab9a889e67058923bd6fcea9c62573483f75800304026d6b561230e3ffb54db822d9965c622bb356bc924813b1584b821b0fe051e09c88bca23ab68710b8aa662aec06a4c1cc0a3f88873ebb2368e7d9367a9ec3ecc076761335b91406c4179328ad039a21fbb3757c7f93c080726318f688095b932af3e1cd8a37af93b0ed67541565054ff27d827100f5f8e343cc755e69b86f338995930fc83a6747245d286816b5319a1c2d277b6b862556171b2a1ee62d1d6ac73098e31e73a8811a7511f2047d64296d9fd3b703fba3669252d19dd84d08b0e3bec8e3df40d45b6df3caa9038d0ecc0d65750ad8897ca4345fd4927d3aedc849dc07881ea7f386fae60709a3d346411388389ed5d7111dee7fe5a0b0e6a9c11e9b2395d2e04b48f2093151d3ffc33d7608ee9aa3135a76b5bd50f6daf5fee51c7d60498b3800712c57c014b3f2cd83be271f99ba1ee74f574e34af1398c7b489b2cbcf5f12ca711eafa24eb55f8f7afb78d74a8343f8151984e1a05c8562dda3bfaddcf1ab56ecf362dd026011ea0ec6ca84c31efd58472604da551818b03d8ccc27e0c823cf1e3032f90c3ff38d40673927b1e2ca9fe3ca40962c9b8b9f31cc231cfc5f43eae2c218f44b21d23fe4f9e45af045fdcbbc3f1a45cb16071698d86de73be46dc451e03cf6c6cf459b1cc6ba358c9c1762c2e05ad064124cbbadbbbb2a6943aba2978f36fda3f99c59ce253093f063692e4b46d8f1a177366b64a808ebab40922a88d4467850c4c54d5f3bd08b1800506f4eb0d3b137e3a6fd669a309ae57b163cb80a4506f74a0784c34f41505e52c498a7834a7dfdc969f5fc73d5433d4277a061c4afddf3af9512f8bf314ed9e5d6bdf55ed8f522da49dd1f4874756142fd0478acb5e8a82c43b09d11b6d5431256957470708f3185f4928745ea693a211484d7a4482d3a69debeed477f2acdb6af77883c4328274fb775d187b1cf04fb572a394cc538f22044ecea8d7a882d0ce6a35ad6fa197d9d725a45a251848563f3b49b4a55da52835545d7ebbc27c0782d3e188808f9e592bbf1720a5809010f853e4404ce1e4a7787b02b8b6d8a297f343cb4a9c6307c8941880e0b9b969df2f14985a8274a9927862ea626e5cabf69244fdc984ac5b64ce396ddf06f0d997d6a81753fede92ef6778a4a876b908d08462b3711dfd85b5ca22323fff380490630a7c0a102c66c8ef898ac5ba6e195b21909a2e8afb1d36accc5893879400a51f64eb82100e5979fb78b3b7deaf58ca737fa5aa9a914a04d58d2e3ffbd1b32440d5dec28454cb8f803dda8e0840cc649fec3653709eab9491f5b9a9bd857bead474197cff840f69fda33520cce67889ce0105c410ae41f2456c2cde50f9e514c7331afef3bf1921b03e0bc1f2435d07663233364a7b6928dbacd8144b81a8aa50e064ee425ac103513ac853b38f3c77cfc106f74cafa106a0a832da6a589cc5754025585f03868c81e332b329fd9bfd3c320cdba4bfbf67bd73b36aa882b7ed35d0fbf54b424ff71ef04af32ceb01c2714244efc64d5d487f89f3c5fff09129022b76d7ed169a3c90aa742753c223c9bc6482589f456c4dee073a8c631ffd5a81d109c32e2afe0986670643d49a1571adf390f24adb2f8c2bf5667bffec8cfddb410b9fa0ee7ae71dc46dce4c6bba41596ca1214101362dca6da0831642902cdc9325c5844548d46497025942f908c8a09a7d6147e30a135450c16355fca4c0368bd5f5197300df99b807598bb27c62b38d407774122e0752b3296f74160c28bbd344e6703df4c87bb2202d443a394391f07b4ec0bcd489b96355d282ded153c707f4b93146f4e8143605de2a208780d4894530c70877eb251f9e816938a2564f7828f5774f2b31a1be1648b87ce8abd4d91fdd6b4b6f00ce0e25c26a3b57fe5991ede3fd821769922355ecf34762577be0228896ea779f0f9bdb8c4d9314c554186638f4bfe275cadde43391bcecfed7146fc5abec1d58ce1147eb1fd65db3538f9f82c1376d52f3bb9597a9a06af3441b076d9b75a6e4129607ac3352780a679706f7e3fe6a48dad2c324733f91600cf9fb980c92639dd71ab7678f4d9c98aa35f24313fbf07d974490a85daf7a00c616bcf318cebae092f495e6553a198f83fb2f2d9e3ef4390c55cde2345bdc903973f7e4a316a892824cd7a9376c036acfc812a99c2cbac3e1da08492fd013990bcbb4345ae7b51fe0b2afaf9208ec6caadb0dbc9df4d9bd5f67dab0b93e9e1ee5cb19b21053503a23fa2095cea3a62c6f392ca843f085786c4c887cb1cc7ecf9faca8a8ecac529a5ebf8a8c919f5a49ddb8852bd223f700b502d8ff5fbe0a3f6d7239b0014cd65f286500c379a384a474b053e07f4a8b6d9afa89e991eec53c26d4add7243f9bd5ff4158e2a1ca1bf3a1545c9b0636d7ed2a2c5760b20213d1ff6743a2b89506fa1cffcda46e3b977f5c354848d040cdbf0c495cd9d1f02f05300d26d4ac3539f5b6102fdb22f43e10ba6654fe53b10d7ccb3e0b309928f3ecb58e58d95cb0e5ea46c36a30993525da78595d804202c298587da25922e056998605a8f0d6c1fe73aa66dbd886068f417c9c5b20a7cb9693d9ce7cbca4e9aaf74f0d7ab5459879a2822bc257cf01f841f5f5e0f4c780ebd2e9a7db271ac4b8fedb00a9c47190778b0722d6eccc5f9a83048151dd80ec882ca883a788cbbc9b3f5188296e101f8a4dec0c71c4e63c553d64f3056efb1ae86967a72a35e3bc0550fd6c70cd2701a426de55fcc145414e1f5dab09de33f5e0b13ad047b129a7e6638ee5760f4d37f6df352a188b69cd996b11f2b72671109f7d0dba7df0d9914fe59ed2122f0e80832562d6122c21ec799ba6c67de4a146ac6e1f0d36d6cd1650fa04d65a35cfabd333a29501636241ee3eb2f6ae16968ae26189f141ff9fba84aafaa3f7be7cbccc8a538458c428f0a2a0b510bb73250d1657830463273534692fe8f4ad866e068c1269da0147ac7e64b846b58d1a161c3f0c00fc4cb64ba35cc29395eb4ee30a1fd156adab79f0796e37ef74dc8c59de0541ded5e4d5e8033c83a39c93d9fa2560fc14fe7455f862e5115abcbf3ddc7f5a42c9f38b0583bcf1fcb9706a0dc269c73c94005d4a0778d0087803fac04041fcd88a9bc008422a770b32069e35641dc54ff63adfc455c8884b5864710410320f7fb7bcf37779236a3a92ed7ed5317eac85c60acecf259fa2ac0a6c64cec57954768d874f359886307681ce251012bfc48d9521659105c1e30bbad84cfd603d57426d1cb14c0a21d5065bc1e9ee3ff0a2c202ffb1a20a754d043b5249e26c21945750d3c2d4f51d0c8eaa0515fe3a160b48caeb40f79d26e0594aa77db804fdbc6b807db46806d6b2d8ff36b157cbe23e7801e6b0e2ed10ab45cb45b1216b5d95cc32b7c3191fb96e112366362d87292d8b52b71f86a2dd6ffb4ba0e712704dfb507c9f0b091748c10a6e7ba20cb748a79c9a8fdb5795827b0857631ec4c791ea2f303b116bec9faf33af287b2afffe26a6899a99328a95ac52a75b3b7424b36966054ad55b443cb8c1299501af1e8f769a12c2854942c847f03428e1b06ba3ca310a234aa8f0456f636b683c0eb186f4e25f2579584174662c00721aa7d85a3f2302e9e2fa911d645d301e1a95f2a2881dad169723628fc75832cf74830029a1f9927dd3369d436a2ceec345d914078e7333474c2150fe1176157b659115dd1c70cfaad103063a89b624b09f017300430fe9e7ccce46060d7238619ec9c18ff3f7699c98f51ee70fde54809c149264a780ea500a247cfca5cdae2b01d62f9235cd50b958d215e0fd48edf9b19b8ae46dd8eb0ff6b5110212519e709ed076172e7a9c9f26c20830d400ce2a01cc79659b82cc875b8e4afed398200354260b9dacd547ce0db9a4836022f80a14c7a3e3d24506d5f9dea528300c10fd9fb9b209768a91dc34b2e20134185fa6281b3ed3a14059fbf63eb06b522b763fccecccd6c422b8065295813c8a3d35b20809ec25de00188a6987c373d98806cc7fef63ff687226d3264000918a95610a493a6734ed4aaa37a1c14ebc90700a62c4eebefe1e1331130b6525bee261bf657df48a0cfc1f5a873f7d60bb1d8306d5470939ea8bbbc07ed1160998528d2e16b5666f4dfb58c71f1e76eea323e03a2cb453c04c05807ddd15ecdfe2be54c507ed9160942f9012990c944ee5361a34ce3cc22b8c10021f2fc901915d7721055a5188ecd1ff3431a89e45fb63cb9bc2f5d21b603f43868b76113c96763b6fafae99124d48874730812caea9d72e5fe20cbd386a665ea193795f250a202e39832d5b3eb74daacb4af3a68fd6c21dee9cedf8cbdde8337e98bf0d7fd58624b8dd6f5596a87c1887bc5cbfb3158c4c025fd3404111e4ec6e03ae164fcb5b854413d365c1cb21922e275b13d5a0b1d7dabb13457cbc753c4b60522260a83403da48c309ffd8289ecb91e5a7904f9238597140d8dc77097706f03c532fe045cd52c4cd58bebfe6552639a3b07963128c7d973bd35f1f842dfc3fd3ee3aaa18e03bbd5025302c0fecdd23bd71f1e1a72f43f444a5e90ee6f022022aee4e0fd6d03643ae17286eadaa0b3d562f7760cad7968d74c3105b79922b4565ac3d2b994fc00c5793de346842141fce1370459af931acf46f11b2dc0a4f11f998df144e93399b8cbc8696b85c5ad3be38c38deeb364e03f6b37a1d03d50ace0ea4c91f3dfbffa375f78a22cbc8d0dc09e97d80c7588d13910e52dff1c79d857e565ce48323c9b750f151efa3a90f49687a8d89dbc3eb0fd954dfafbbba764f42e574caab47916b785e9f8278538da41d915487e330e0d4265b279528ddd3e0a8bc9fb3fdfcc2a5be2054eae7a9afb73688f4464c7f666dca09b06445dd0748d77cd608e5b15885fd33b7dfbbf4697aaf4f5502959e3d30cd2120b12e64e88a6854d00d9c324ad532d4386bd77cbeb8b1f3792d36c54798ebbe629d754410a0cf9997442bed4fe00de774f59d33c9457be0d1bf991ae83379632df45cb8479d79ed9863de0f25d2a618ad3fd2bdd67f493af5c995020d42c627f308b67f21fa8a9bfc12c3a06851aea7fac2f958d047e80bb24d4d35184e67db70f3073dc4b5e989e0bb1e740f953b383f169e4058dc7adae514ef16373df47e2b1eabe21fe49c7f80b3280d12dc44b1b595bb41cbe0089a169772741acf44417a56d725525dd3dd8815af8b35a9a691cd0ea0918dc369b09b68bfa828b7fa70064fa017e51b65a390828527c23bf4e5c750f0a5ac3000a07a5e5b4ea17ae4e61d7794d5e746e7067eff5bbbbd6b5a70d0c351276ec609f35146a1174cc6dfbb6e0f3503b774b9fc903d7e83dd7cdd56114e0d43de5275599d8feead4c20c33c44e0ae58fe9e49376fe2f4ec935540ec404cd5dcc10e239b256dec6a8e32207f5a4f8e68a10934eef3d2f899d19c6f282bf9c240ec3c8c4bd55bdbdfe6c4273818b9d2b399911e1a4f462a74f0663adf79760988f02caade9da1a42a1952a0c5e476626b06218197acecf9b1efbe57ba7eb82a42024b519d0c54d3187637c70bcfb5e98a0d0e57398b38e00b63244e33086da40458d37de9ca01e2fa4fa561a198e0b4631910c87a6cc483b054065b0d1407484fe1655fbf1bcc7d0e77429c067e6eb1324c96f2465d09e9941736c7963b895621065ba37748883b63e7d734c9b43061f043293140978481b802d78c71213160a0cc2cf6f39ac42547790dec9b2e6e62ba62a7ad1a6a642ca6f2830a630ec0e8d84184d47d22fced0823d3e6eb8ee24200552b94eb95622cf7567abdcfcd3d948e440acc0c6581c7ec5f383af7e8c095997ea7eb304f7f0de140816da8d06c8ad6a952c5c8974383f5811f03527330357eb28610e1cb8faa4854cd67a6baaa453ca4328dbe02fbc6b60295c46a8b0e50b6716bd49ea4aae3c858372193ebfa23c94c7f28fa2cc989b89952d9a6713be9da0a100f98b3a39910b5a6960d9e3916b9f04ae8509c8991bef8a93595f9c5c2cad569c170dcf2d0bf124964a8b4caf0dba34531b4e5917fd29a9732df7c089bdf905daff5adb4e886ffaba9561f64dfc1df8400d258fcc91ef187885ebf79606bae0a633b2026270d39b0753cf004394a7c628a5dccc6f944eecaec34f92de9f9b12c4054e881f4aecfae1d3c04789220113fdeb2fa0419cb2953a8be440365410ddc22b32a26bff3c9022a4737baa9f73327903e783cc5e482be47947f01eb9d632f6e81311143b3c8fa9431c170f861d4f612943ab19239a8e66a92894d8e900da8c1ef691527d8b502b43ddd49da9ef894d028197f93cd841f054a61a3deaadb0f7eba0df2216727b5e7ae862f8ed1e389e2728481112b3bc2ed5999d5862a601b190a2f8ccc5c91c5835ea87f26f083410fb49d5c9110b1a72fdcaae5ce170408b51cd43803b06848d9f1a15f3e82af1ad0d605e4b2a0f92de2c2aedc6e7b79d162170064b257d254f1f03d14cc7114ee616d8be874c734fff344ae529474ff95e0e311f788d656bca671c446b7c44308d50accaaf41e777ec4a89b8ec4c5f606b790d6cfdf12151b76b4e4c20631bd9537894a5b0d4106c3779440ca76e98b41376122494906dc914a0719e1eb4e9345d1271ab3c827b426323363b5191dd4b2bd5559c26b6ff831e21e75f0381a451d08102889695517a114ebdeb313f03d98a70e7188c0a7f84d0ec113d1a2ebc741538727c9311b071ae9ad04a3059685adfcc33194529a9a31ebd47e954459629d0e44dea045b8727c45cf86951202d418f112b87c1a5a367418f012692c677e7827aa7009ea36e94d338684ae69b1b4c3ff3a3771802338c0bc6d248b25f194e31eb1e4aa1048717513ccb39648a8cba37fd2672d2bd669f188978844523b0a21d0a57885bd42407db1757e748540c48d96407ee2e8bf638a795de24393ec37017a77080c7240868b6d4736c960851f88c040752d1c6dddaf125535cb4c2425cd6acf764f7e66fb637f83b45679836d5210ab125eb64b9efd9234e6268da22adf813805cf08dcb892ed402e8bd9eb17acc0380dedf0b460ca9da01fc48e1e3c4ca68a8fb63e3a7d9bea33bde011ea1dda5209db19be0ede8d08ceeef0b2b18e61e48107471d0828bb277a2579dcef974f104bd43ba03a8bf237be31171e8ba3ae13fc05fff9b406d715a38826e45675307c0d9d0b11e3a422c9e40b0346af853e46f0223e963f15c8835f161b9063b621bd25052a7764b3a854554362952c7f481a144b1d01bffc2a8cad409e12a3402b1ad03b6626b7211a5f6afb12c06594f0401d60502cdc2caa5600c2ee7d150b3ecf06f4e96cb342de12a29a41da5af3ca7beb5a81716b3c39c1900aed2b379de44cc109bca5e414c2b9f673969cb216b6d4a2664cf0dafb6474c39232a25e456f8db81af286ed46f3c6af28cc5b1bcf9fa05774733d03e0ba54e6d6facbecb24835347daebce8ca21b06364bcaf91bebfb1498166de8418b0820424f13d5a9e0793c9894ea16e5fadccb3604d93007515f1119b5d656384e8ebe6e2c2536658d00e73bd882fab109f3fe361f7deb4131b68c7524bdb496bbe2105c19f5c0e5bf2b01b66724bc250eb04fb3ec77e1d0a84bab9ce6e8993a58576af3db81ce6d0ea041c3bd15df0a18834d503afd0388e1a6a30ba64aef167c47c251d3b9b97e356451979aa8eb5f14ab5a035a96d352d20c42158cb0efd772b163439080da4c4322920d04082fb9d63d24fe1b697a8d2cfb15adbbdd4747ad7e288e0b4a244f5e5d3898cab71b1fa29648841b551ef545850b96dd094e127fa9b6dbb723f952b63d8344623d26d5a8441429d002a4b6e138146370e7c70c9cb6df0ac356ce2fd185e43085ccb2099318ae3952985320a5f52b0e3b00270753aca2ed5d915bc664efaf274ff5c2f3f1033d939bcb003269dbe1098fb00288dc8e34c34fd63260335aab93e508b95e0bed499df679a15b66be8f1abd2ba7d10f1a035eea5ed91a585953a48506af760d416f2390088e7f4b799ced9f610d57209a75d32b8c0d4c26cc606c292677c18d91a051827f21346269f135da6c475b57908eaa5e6d2965a6368ad481ee0206119d6ec51293ea0d1c4b88c7fbf8e5d0fb53d55916e2285074bd3fe0b1d416ab540c2049b6838136e953ee3a21184e9d8aff1cfcdf7cbac46b77d0fcf9297e3bbc1fb8679c97528eb667006ab1f81ce2a2a8c6ac622bef1a9b81bee56ab9bf050653424260ab7b175c94539accfd8e638e107d7bde13d1b10455214df9c221d3c001bcc00f896bdcf22d1e96d6d01841264ca215b0be53936b84780c6dfb6472cfa2513df01f9a0b47c3729654306148df6725840a6f32f399e17a89d8caf63be8b0f71aed7ed8fa6521d75ee24f58cdaafd3d49d1411b0ff6effdd2ae72174446b32921892716ab9b9e4612701ad956f2edb8188bd8b8a361ab91994b675a3619d85fc32bcde5387e2a6ee39ef0fad87a615ba361374e30d952a6cdc01e3805bb2d0cc115145768309a5df6f91cdba130ca0a0631d9b167ce697a3a7299e197e07235452afbb62f9f401fde604e688676d7b97072034b9471891295b804bffb2f78ef3105ec4b3ca768fc5b21b1234a014f12ce843af60c5b344e331406cd01df4d09491d92d2d2aff634dd2a53e59ae5f9bf9fc0bdbcc0fc92315d5b24e37659e7614316d2f873b365cb3fd98a18ed4907e5cfd9d0ae90d1a57885a7480a16dd903be5accf55bc37ea7dfb1fa167f395b168a596fd821b312448a1c8c05b2a1ca33facf843996fe182bf06bf0c12678546fe5abb362ab16d6fa9abaab74a5fc65557c583dde5162c40cd6380e7e8f608ca4f0ffa444f8bc3c7cee8a2211d67880b0a78090f0c88c6064cd0944262fdab97db026aa467a4b413aa249a3d2a4cee7760b93691599ecca4811ad687c81c2a11df88d44b4ff52211fd6fc9b1f0e8e8fee4ee5b663921fd64d94c3a322ee1d9aa3aafe2c35576f71a83ad8a2d8fe65bbc2e906b80d7bd549dd34478dfef3573ca44e86ec3f90d7fca6cdb3e47ac97fff6314280f9942741c72cef4f83caef47f15e9e9517dba9595286362469542f864cce17de1b2475f04752c3e09a2831dd9aca7af10eb91c9de2a49e70d5b5a55f99f603b3c656d6f56c42a9e42792418185f215724ba0127a1b9a0801c7d0d1e7d050ee7f32f24b658f08d8f85be460fe8ca7377a140b59f8d143a6ea33e4326c231b003219d0a4b111fabbc16e317ea3632f58746e9184ebf6c1adaa988128575c95d6dc2003271c0d95944134ce2c5e07100e6d7afd7a7a59bba02eca4fa4ac2022374be200839485aed9cd83a109aedbd18bda442858b4f80cd8b19ffd39d2828d31881ef67b872034377ff66639ad42abd6fa66a8a2979fbe83ed4acd036e1e4104c4f124ece7964b06c10f315441e3dea706d449e2175c28991398aa55952f59776dfffd50e9e72e1f8d4907ea756e6ab90ec94adb6d42249500d8749a6cf8606e6a47c3affd1a9e3122560b27166d781f72a2261744599c7b19acf8615c6179b417ae61cbcd5cea1cd52b6e8d76bb654981787756c609d4082dae7c8986f0495845424777a0bb70c2165a44616d1424b7e898a898018063002c0fb749e810f4c5f2088ad3147a4b227935cede5c2b78477afff7897d5c88635343c81aea6b1d1678f69d670a085bae9476af0242abe67fa71749026f458a034d8256b73dc9652b100a255d0e20e89629498891b861e2be165c5a7076da15ce90dafdef392cb30387754142b94192f3e4d2377b6cc75d820297c15698c9feaf4e4f75ade249d6ecd15cd6849e84d6a9d5841db45a0fe5730822ea3ed79718ab048121504a3a0a862105fc1096b31d9f42e23287a0aee4c637518c180f090c2041411aa6975586580d88e084b7fcfa8c993bd3537d62d8fa411b0be36a06a687388f4d79f056036dbe1a2d3ace3533e3e087ccef94e6cdd2f64f8802a5af41c8ceeb4afb2d5ea68e4890586bcc67c72b2ce50c259f8796e1854805143a84981e142d9e5310c47f455cdfb019db2f1decc02e8960f9d23bf98c044a3750476ced7265bb5a581b07e53a42959b88be744fa754283733f5ea93f6bc3387831d3a454b87bfcb71a365e39c1e5266bd1c89e25d663232fa6a77d2c0f6d774cd73262c75c690e7b8db516348a2f93f99b652f711eeea23e0118b2a3b20f165bdf7d29167f2be72eb1cd672b2fedf493d6d955f84603b6270206ff9b07dcd7d39ef29026401216e0514c34459cd2a1a77efad99f168bdc3caa02a0bf2c3365823e7f0fc89851d996218bf4ca41fb0bda70582d86ad539509fd52e65f33b5829a4f61945a01341130f96adf50ab801b982c23a369fdc2cbb9bd24119f40beb22711c7ac6b5297101e42d8a450e35e2c57541afa235ab30b170a26a648a2baa12dc294ddc425eb97029367350f22459d004daa1889adf409ece6d83d689561771076bf86f51922b4cfb59e0371d8a569ee861f3630ede028e18becae80307202cec9e53e357fac0607d7f20eac5766a9a7978170121d7a57b9d583f0f2dc9347e996818cb5a13e646d14b5408e2a52f2fcf3519971e6e2b67d1ccb8e15c8338422f6a26a17ba055bff7aae48a78e5feadea7de8d1fb039af5853d037e92d7052a46e2cb7eccf310758de3e7c2b98c016713305351ca59a1292ed220181f390657706f8f8368c27c0b1e6b5b4f5810bf4fe41013e59b833d093820c42b6631e0f84c9867e086081ea60d9c92da2259b9b2ce523b3f6e377589b0ecd150814d4687d8e7daccdb85f500726d8cf1fbb682253c4437b698e9119fef7b2fbb2fbf7afa729d41666c50251986c1ec998991728adf5c588ad07efafc97edab7adbd8ded9e86950aa951049176f8aee5dbd878e25810acdff94a55c28e6a4ad3fdee9aa94389c4c99ea99b46762208c9ab7129a873ad2b7a1603c588f23ec78bd05288f12158f4ec89a7bc5f2e95156c333d2084ea373594c1cd12a0ae333ed07265165fedbf2ffd4ba50daab76f047e44716d822b1b7ff411775fd65c363d839db507fdb8973bef8071c0cc9af804a2a88f2c6e38087c175635706b9a238f6a561f7f73c4519f8465076d7124ff3f4e3f9bdc3517fe2a499683fc78aa8be50e153ddbb8c03c2b004dbe2d15ed81b385ba1026cb2b9ebc576807a2aa9008cdcb800fb85864f6b59181d1ea5fa9f110e3b6b8b2fd0afc167ae360439dff37f5e4ebeeb6d6ac4c66c10c3c34ee0929d1fb13498f2cb83a1ff7f832b47744c090f401067505deead476f2caec0b8c3c1f2fca20aa25701f94ce81520dce03477cf4e77356ad2f7510d8318670b56215811d657638f41f8759104d1944a0fbb1b11c3594496f682b50a886dd80d738c6879bbfcb34800308b5802920939103d06faf67a48f377fffeeb44bed1858d73e8f4a3c9ea7fd792faf596d0f4cd25e69d66a39fb29edb88211b0caac62463f038e166e7d27163b3f1240f1940c42cc3c68084d50bd06102bbef6eacd2fddc6cebc49f018e08b2a627eeb501220498f9f9cc5b5acd22bbd66354f2cd6f4a37c2b0df7fddfb0db712ed26d8e1c622ccfcb14ed6b44927e0d8c5e31ac7ed34facf00953b61584b1838a999faf7e0bf4b20f0e80fcc7c85a8c5bf5f352dd1e5fd5ffe3b86382fe665b305887da786960662cfa7dde5df5d0311d9fd9897266f0c43e10f8996b7fb89a836f95f895fd4c91d2f4e49dacf31fd5c75010c9623e91a23b74fa8ad2678275f0da35a94f60b1513ae94bae51a3d3acbd81a451a9ffded6112d7551c3e2322e174eb955ecd12d0db3475325ee30afddada2b40c2abde081f44a4d4963e04af4c0501d7af82fdb5d3b0496d1daa51f2eed017f49ffc2b355f3b2bc05dc63e8b0b50384b37bc2eab388645df729cf0bd0aacfd46bb451e6f6ee47c123f5582a7a703991796312fa1ab4e7c25609f130777bf10e1e6ee2cdb02c5e6973f583e95060801df9bc40869ad8da1ab5cb52e440eb567a5e18e3366f687f8838082f7531614ea2bc194003164a1ffcb0200aadba9e86283ff7f34113b77cdaa212895bf5697596a687af49f758d8f391424505305a75aa03e5a0d90d95a5ebde5dd7075fd07471ed0e99bdf79d5c77b7970d2af62379179ccd2888ba9d29b1da7c6c556df26f1374861be6b1c09a257b4fe9723253733536a2214d536f0594af0c90ed632c304a04210491c8737bdfd84716c2cb6771541778c634301d91ad8bb1a80914761f003c200d032fdaafc64d304af54b97e1eda831ec2b9ad122d96cd2dc99c9c92520a28fa2b8e5df5d7dcbb5912b6e168e83b1b5d0ccf10a8b7469af4c0072aecf58f1ab18273cbee53db785dc149f7473792149ce59def6a21b1ac8b0c40ef9064f6bcd0d43e756b31c36f952e96b5af441d27461ed50273cc1eb689705a6513764919a213b41ebcf0582e671943d7b1f6dc94b00d6d766ee795417e9f75a297519e8015fe732830676f1ff13380b4b7c2a48b10c5aa6275643262d5eaca7632bcb34c6c186a96436b199e39ebaf25547eda98968fe94efea073d258473abf84126e15648034bf4dc6206e42e60ac5730b17907ba0c3ea4a88e297656e88b84ea612b35a4d0af8aba8cfcfbba6e7abd32e6c41d34ee03537bf4ac97fab64ba5785f059612eea6901f7a3ed2f16c7b9ca2b1b58215cbd7bf7c7705ae4d4498bd2af919a8d7b078f71e58f9c77f79e0d4807e4a67bf29000ef00e423d74dfe7987be10b4331720058e3d72b20cd3ebc32ec7af049e7be54b4c535b363c4df5b6f67a45e642b41bc99959b12fb1b58ff5109c8a04c02069c3e98afb27a043a66987c9d30671cca72472777f2bc6c5bd7ef87bbb649e7c33a5dfa76087127090056ae74bdcabddd7f74590b51acb014b2f6440654b0c41613b273081e063af8fbac96dad6a5fa0c2b7aec006e4200896a7e9b6fcc517245705d15f252834f11abe3b17415a0c78417a511d7db06f0264215fc920308c3d549c6163608686951e09ecfc57f7824fb1ff58c71cf4fc66ac12477ab920cd1910c209f08859cd45570f60921252d10cf6a6b3571614a25cb54566c543daee27055c089b43b63bd10ea82728c2c6040c82b78ef049a93912715f4adc53a2593105f89869fa341020666998f5f50d22aa1edda0688d0deadfede718d6ba4267790e88baca58d56318417b56741242d6446919fa129fc92731d2f5d0c305264096332d63e3a33a70e209162d6a0af5e5140dcd06d6deeff301d4129c364c0c87585a95dc327125046f0ca534695ed38e1638e738c1aa6393808fa6643a0b781807f757b3b9d884b0db577731d72b1513ba016b8b68afa661d11beb8d16cabc189ff18027ae45146836348856b6773f10159f513242a3205aa8edc96470ac4738467c917512f8bf787a137c6a72d0968a9aca6830f1f28e359e4fcc55020222aea39d38a1cf8d84ba9cdbfc40ae09b4ebac5b7548a066146f4f136ac60f0f405b0c132f9d14d74af270a2f0411c74ffda36229c198025789b36a1f0a15b9b35f54fc8fcf634d1b4232e1905f49f308c96c1b50e73d85136d3632eba0e5006decd1390f1ba0cc70e813f8dc0a8d5ec55e733ff359377fc69c3cee99b458994cc8e24fdb2aaafd67d3f868176e0008349c3b3f946e93aef7bdebe734e9550acd9492a769fc6a8e0c61af031436b735f8e6db67d365c0cb193a40316d490f2910cae0ae885759be82e252a4d33019541fcdd8a0044371a67ca64d3d72d92febe87b9d0ff146d591bd3427d3f01611cef7ca3533ca3aed14aed4dbd445c45e434ab5a3f1fb68c3409efbe182c2b1081ce897aef994949cf3aad3d875985f3b1b68575605b9b223eee7b024548117f0ee07eef5bcd3a77a206a5e31b89fbda7854410002ddca63812df489e17d5eb0f60454e6c61226b5f9325ee279f73c2f482533d833252ff3b10ae781b33eea7cec97666b3b7314ddcaf638730a2e4926606d3792fabb1cdee67c6b5626335f3c90983aee2c825da85e641ea8a2323ae9d15222cc963a76b5f56bf87d5f6697ae770cbfd3436609b791c47ac5a12c55b1dd6b1b91601641b948e288c029a82cd7fb27424f757ae8ac1fd5cfc5b837d146411cd7547e9cbc3a670b009ba2d409a20de585000b1081de9e41a6c5f6a29bf4c2630bdb31f81a792544deef91e78f01e0977e9ad5444c8b4727ea6c6cd57889b2407656e502ad836775052b21d8ad1e1b161bf0e4ad56ead150ebbf5f790a75ae5c76f18414f335fe44219da5af21308f15258259f98f6ae2adfda9493bbbd2dc980bbe57a3edacc8111358cb30eded8846da281b9dfe5e5b888e108d49ceefdfa2503a462da11658b0580e5898c288458c711e3a461e76991a1996767889e79599627ba54ca71ee9a2a8cafdc7088ef36631c543be866c457a82739f6f44f50900237e3a4caa36fa8da6cb2b6cb49717a3927998921beced4ad02bd610cec6f79b1917e355b6721ae7f722d5ec24605fefb310546e83cc4c4405d1fc89e2020c3c297bd48026d3375a9756837471dc37a31160130846b8e5d1179b2e1aac7391c1203c784adccbd22b41ec846e7b11efa8e582a16f48b313c334cb53f3cfef5ffed8f88cb52c28520800c7e1e34c3ece142d44459916e0a3db46271ab07717f8e25c22df3bd644e2f65971f4eb657d125e4fbb605a2bf2830a90a3c0a8569ea4a82b19344345d73f266aa09902310c21354a941d2f6a173b99b69f21e167832af24f648b1ab1b057e48c0691cda830e07daaaa15e67f68811816ed31b49f4894d0314b9e9104084e1a75deef27c100853c84c97c587883fc8de10185ce4e1a14373a86fa9f343b3e054f7f44ea252c38be0d3c71e5ec5d247761c4dceed0f9bc62538d8f61a18c4e0b276591c108383d7e04906b2c136ca46db543d2e6be2eb04a3f4af4011bbbcb37819bbcbb696b28b6c82676a7b36ecf5315c0e84e585918e0a0eaeabe30aace41fd527bd12255ec0dd01ed90b1da7261580ac991c2607c88a41aac06d2aea933d13336550ed91248ae38abd6fb86e90496e9a2c326c99f135147c6147ccd59279e51aa30ffca6d921f04ddf79b2a933d97946735c3be64ab29b5d17b08ef1c08565716913790f330474095c8255ec4856a8b843f20a73b0d59e201586d470c46fbc62786c14ab0337efb214bf7b54f5350874a32650913ca17ce6dd34cc9a6ad0a618c6593b66f2e3ff8b8529539a0b2672ab0983b8e08703ca50e5763ea58897d5c2ff54d79db897c453248e3bc7580d065ab8c525015e286fc7534da58f91c06863086dc407127ac4a48a9121fd259e4cac1c7035f121f5efa2b526850181e1d0bf59f4bc137d6a0422cd54140dbe8553a6845a425b68ad7b385683dc8e6c8c533482acf77a1e796f9f044152f9d60adc2c117a860227851f7c5d0320bb5c9dbf6de856d817b9d2f83e63f37e3ddbe0b2852744c67c286c9acc752d5d2794e50c4c59fb4055ffa4809c92462fc6e0fa00bf7ac5ff50223ce377a802da08d7c1850f65a62de76aea3a32247bb44cfbdc167f01d925af2524d6c593890d5fbced5e78c31b9cc7974ace2bd9467bb4633dfb8ff10845653c4761696dabe01479300c174a92db5eb8e5943b094f912ad7b7a67f702564b147a247d30f35b422a0d6fba2d64bdb281c2bbd5d61357439b542a7f0c31a80157387324d9a10c1ee649c85f15141e584d07bc7401ba0ffd3b5950cca4d50672ae15156659a65966d55ea999551db1e0b24b9f8d444599445411906d5a9d482c980a00004d934ab818f5844e3fb1870970b00dfde81e30e8f0c0c770eceb6d124b53246127b7a1ebc76e914b76ca24534a2905cd03f80347035f3bcace85facaaed5c22afd9942b59e903e54413a3f040d9d32827a3e2ff542e63ecfa36b406f1fa73867a0253f7b8d734e75051301547c88f61110f8d3a148ff8828ca3f288a7e5a08fd7405e9be5d7fc47a8dde14d1d8bbd220f65c0ce9a2ca94a8e495566512d29622025570d0275969de1e433e438a7c98fc6cf2db958789a8a4f7ed4d5df55ce49c3558467ef171efbd79ef2dd1a5e9c6300c439de8d3a35296491144a90922a868696969294bb1fd73097bf80c71717171912061f5795b7d9890220f6f7b59bee49da0b5175484a45d26f876eda92b5c14afd404080707c6598902e19c80706f3de9d115dbe9a3eb6b0add2aa1d0a5a593c4dae3d37dbbf6087d966f579e2958ecedf4826c0444d1671f751031a2587f5afc74fd174b444c51109576ed69fb7cadc7e7f5b26fd79edfff76ede1fae2b76bcf150e47903aa5be221b623eb6a4b8b35f27cb53beee8fede9057adfbd78200da1e5c8cc443434b317eb01ff31e9499f01e64fc0a1b7bed4c0fe183b83ef0e46c727c0e8cc9b09ffe6706747de07c69483bed919072e2be040c98b81f9d863b0438ad5c7ddf7b08f6188f75b2d5a2cda8f2fc636725bbfeb0c88f65b185e998660f6ddfda3a570f1ff7d9d4d92186edad71959f41fdb3e0eff3a1390238bcefe970286bbf3711ef0afc73be56e8568f10eb922687269189308921ae59c73ce77444b8d5c4017b4ae5e80a4264d4a584d5a9cf51f921a45b547c6dba2fbcad41d0b888001947a4105be281501bed3e73b0b014d1580cfc487ad8b65a798dd2196c91562873cf121dd301a9fed51c386eaa3aa611ed58901533e55bd6251e75451856a818f85daa47ae0b36b03ae929b448a1ae313d3a03ed9b5bb891c2dddb852a4bad0a18a50b5c2351f08354ec56c6c47b8cc6048698af185b4e45ba14af974a836cd4be53f3b724138fcd2e2903a0c200d4cabfde27083ae90afc825ba3cac13232a0a33d54a15ab8284bc4c643d17456767525703968fa94d555265f82e1138dded606dd8330ab6c806bb2e55007c96478c9e7ac788e470f15d3238158a0afa2c0e0be47ad811a71ea9540ce0db51bfd2487ca02ac077c4c792dba38dcc5ab9686faa65b34f2c953b5443d59cf3a00e07c661eb47cd527f3f54af1df7c468c9f495a9b6899c4a8104df08abc448cdc06783d49061363675438509161d04b83922a61e2030d4fbe2845b96a1ee381d4720083076d96ed2ce6793d82539d4140ef005511fe0eb5c706b90539515f58a6a67bc4951e5c07c9746085be5003e26eadc8e0be134e3735343204a78a440e1d1055661bbf87b879c8825272acc003cea9b717ffc541bc6a526c0076583da44e50538c012ec6750607d8522eba538247cbb86780aa164cbca521ae0dd400f5b0e26a1b828482ae4fee367215365fe767d4203018213190d1a2bbc7ab4f7301e1cf141ae75d618120b14715e45daba8fa70ffaa929e88968bc329ada8c2d02959ef69a889118087e54aaa62c4129d1e6030459086235127bcaf104c6d4ad19c6f87e60811b476d5561439cc4e031232c4c46c92b5fc6174ca34380df018f95c9695daa4abfecda526483f631313c8cf73d866e4691155f99b48ad218bb89e7b77cbb3241094a7f2b061830d29cd7a5a5a50dbfdf9bdc8f2b486a274805bd030eed6bb8b4bef7b7eb92d00c7defbdf7de7befd51e02d826992d5cc6978b318dcb843b8a7c93f9768ec3de6dccf5d7c6580db0cd112aa0446a557afba28eb4904352035df6e6764b5b9463bf58df6cf610fbe75ddb3198b5f6f7de7b41cfbbd6767b775859be649db3d2d952859c73ce39b3284133a252e7388528cd408bca185f83ab929412d3099fa618e40c5e4a97f48255a9e7e76fd70f57fea905576e31712a7246395b73a06633c47e2a3c4057a4b832950e3961a967081f349c1e3ef0a049e4502527238e240129b1e3641b3b7f5e345accb8423fa0429b9e4e261d4e200f45531e7a6953d0a4274cd69e0841d9cc3ea871d2003bc285c66539993897409d4a3e4475d88036e9f0534525edb9a12a94a03d43ce9d1e278f1bbf1088bc50db4277aa509f11a7d5d2092209094452d0112b285c14d4c392146a27941f3f706810438b8102b19881424cea146a3a977ce80b75280552774e2771369a9419c942439fe87041e304d2d5f601da43850e12a70b10285412fae4233a57f87ac2a4b8b50521190a72b6ad676428d6d79c8b330716ca55e24a88b3cac3170723161c7c502073e80d28674f9293280dfdc0038a0d2932388070c6d0f271a28608d484128a04e9080e09e8ec50e52c7b83c1864a1101f3710e2943a9c2d01230cea21567102b7448d40fd3d811872047426e57d0187048989c28721239a3ca813a9971f53b570fe252a0ead48f9311556a83062b1b784e35b9244e461c3103822ed901c25811af13478b1757a817d5d97b4a853a8828322ac36f57a35e08733d3754091b9a42cde7ecaca1e39c328646f9428fb8ce33ad73435591a8a02634844a56442457d44341983bb9dce6d8521f35df198aa4236d6cedab8beb1cd2caaa4265443135a51ad4138c88e854897ae8893914855b5ac4d6a4e6c1990d1d678bb1f3c6d71817ba41eb4755ba1385a2351951d31e0d44a8150dbd26734a6e466c278fdad3192a45c7d4d8a9e10b05d7142d13556151e75b13ea817a35442462a8877698ebe106832d84dae9757642e9a03226f795830bada2f556751e45a1424d24541d4244288f50efdc317772704b79d870a89d54ce501e3a98c6d2a06d2b1558da6ae29722a9125afbdae31372e0786d30861c1c9ebd0e0effa39db91e7b0dda805e6f7cf5d59e07769203ed718d36b1a84b3b737d36f5cd31b8df2dd7eb34adccdee21bd0ab95ba7badfbb5dd66df7cbfd5378e4a8a2ae95fbfa97cfef5fbeddb9fe1ea0fe0dbd504d2cfb9be7bb1df7defbd7c37fa7eb7ed3cbca1277d8efee38b38615b3b437abed3edbe83f95cf47bd73b79e1fabce381a18efed704499bedefbddc6bd266f3f6defce666d08b97acb97e9b3b7b6b41e69ae08e2723a669254ecbf7dd07f645bff5ed177748257dfbad0f89225ff4a11765300d8fc5f3ca30345d4251b71b7d28fa70378e16e6b3ec783b5e065dc8db2d5f47ffd1e7e80fbe8c135e40b025c31fcd90c593bbde42dae8bc688e38a6a5ef8d0127049ff43afa6f91657b96ab499bd0ebbc48ea48516b109aa267b1208ae4387a51b7e39e452477305fb7b39e85244dabf39ab4d1ed3a8ec131e1064d2be37bc0fef5535bdffe0c5f6cd918b470bdd822ca609a8b2d06bd0cc6bbedafbdc1fe7ade77dbeb1b1ee8b5e775c01b3fc63b1e68de5c8f714e3225f5297cbb4aadfdd5c44e89255f06c3f63cee37dfde5a0a397b23296f062dcc97b133d6efbc8a0831d6a4052c3adddd8d9e05677283edc76be637317b0b7321e77eee53b4124bf5f8dcebd2bef63adc405fb080b456e7fbe875f4b7d68b38d74667726f4d9dfb479377b379218b3b1bea7820f7bd669b3260ceb5e3cd46f24df6a3a580bdf5a4a500e2b4fc6de2ecb5cefd3803786f969877fe1641db07fd4dfbf97af8ad23aec496ee45dee5a40621cefdd6ebe87f3d4ecbbfa617b9a9737f68f2f23575eeb7262ffb161ee831d494bf03ec43cf438f6fb8b376067f9e773cd0e7dc1ffa1c9a37a1c79eef4af0ed8e17fa4cd6841e7b51ef78f7eb4ee2b4fc0eac9de185dece704072807d086a9dab73c96e5a50c37df639f7ef1bec73ee0771eed754da7324edfb3a02ea77bfb5ef3131208602fc6b5e5041eaa44cb3cf384af067d01e207b9aebb5cccf1564996e69b4df1bb41cdc10d4d8c4a502e24acf1bf504325cf366fbee2d8ed1be7b90acd9beebdccf4d1ed6b1c1fe06ccb9db8668310dcefd474a9efea6cefdd9ec2d76e6fa164bc17a094040d087868aa2a1d856282239d6105a2bd41ac22b35bba1eb0538ac6c7559fde09a9b838302da4a742f4c09102c6428ec062d610d3cf050e942e214452a4a928425bd706869efdd8be2fbed6f18bd282310770365b716416b347a7af3bd39e79c739f823e7c404c413be3d11545a56605c5880907f5174fca68300d69a2f5248b84ce3a2154be942e6599014595206255bc707c00d496050534836f09d9ad1223d692de1dc152941765476c4e3e4e76a07493ac9fd01292a3a0ebc374cf7e56a0cd244b2c08d710e29c0b69291122e4b4f7de7b6fce39e73c0a6e45571113ee4b9824b9fdb0b286a4adc5c0d1d97c6057822544288713d192105c0929333e983d0149d29364a119d5105a5ad35a0369f4d6b48c641abdcb9738e0b55ee79cf370efbdf7de9c73ce79c8f7de7b6fce39e7dca7baaabca6950662d1e87918ef2d68035276436b48881548f8de7befddb2a10a2dacc95aefea48909613513682e5040b8a904c99d414908629208214a9c1b1760c8571ce39e77befbdf7da5757971c10166c57716a596d9f1b1d952e651946f140ab0deec84bae0227f2b92f817c9c952408e49c73cef7de7befbdd19868ac293d4c7707e6e3885a8f0cc6af0fd1a2ca5b3c1bc09e8645c587c92beb86d15d61e528e59c73cef9de7bef1df2b0e4210ff916e23ce421973952640a0c1e332a16157817f239afc1bdd6601a1ae1ad75f69380123dc89a951594002aedb5a570e5a3e2ed5b1545bef5fc6aeb5f6fafa4fe043b633969c15e9b2a29bfc7343c17983e825ce779a10db7e1de5e7b7739477b30b4b1b17e9336a6d699b4607757837ca7613e4872707df63a7b174c63ed0b9dce873a9d0f39f79dac02ded8c3ce411d2737c835a1a903433f5ec07f63ee2f59d37967eae3fd619aee3917fb7c7f6e2a20aeb4dc6350f71a6e760b3e6981e30f823fd0f7ab9f52f63ced73df99b8ef3e7b3045d907fda660873b74a120a460025d4a182f19a6c9df0280bc707f9f77dd3d9e20c24df7a08f406e40d67453e398debbfd3a1c234220737137bec0a41948800218f800097c909c4adc2d4c1300901c7f63d85f46ec6fbae7e325c3349adce0ae29da7435dd736fc972acd9266866acafcd20cbfdb528956028b6be5dad7a585981597cfb5aa27879e2c7d6d4787741b498cac79e97e13b7dbc5a157d8cc3bfb533d9da19ec7370f8b738069bbceb77bcf0739fafcdf69867b836d65f0fda1e32653062135c30484beee237b8ffeef7452e330003d9e2d44889c1c719ec1d2fc500de6bca580c68a003d95f006a502381205abc9640fb76a50a8e97a8e42a1d4f4286684a020003180000180c0806055112e42086e95a7914000750ac3254321c5a320a440251300c06034110c03008000010000000c3200c0862145bfda534b080e51c6f210c4adedd17572b6c393c77f971146fb6fddb9d2796a5f618ccb46893278edf536c322c7826f928758c6c1fb80bafc895b37d95cf05fb5894d744cc5429be83b77b635ea4be3c584d2e6e11b6c04ae7b5069936c71629140a05e692c464913e094136233c72b6ad02b1e5a7dc277510ccb2141ca9165e4c7165e216678951d3e27f1085de6b15bce084d33e616be40862e0a958d4a4248fb9410809af7520ff7dc74c02c4a5d848ce61fdf90d95d6a70e6937f83eda9c7ef17ec6dd33e89140a6c189832bd03b7843fbc8c23cf05e19e1901b118d8e30b1bdba04ee9c912b66bea05892c9a6fdc89f19c8ebd56a8bc5b5a4a3910c04ba138310d8369f1b51cf3812637205e24492b843af768d6dde6912c038706ff347538158fd225236667384d364ec3cca6a84809d00c4168050fbe6ac3979648d6e85db0025e062f4695b720614ba8513088cb32b2e3401b77ae74340b1b457685763057cc713ba73b4aad5f890795258d6b91cc7e921e644d679d38a1620aec9f7ed5bcfbc0a1c1e1a881d4378557d5bac7063bdab0888d6fb77055eeca8a27c22a62a5ef598a82118359041d1c78c0a808699f55197652e02d184d4fcec18c864e3fdff3e9ccef93092b6582502b2e235919f4a23d5cfc2ea22a1bb1f0a16368470f0c7c1a1d4305495e2fdd6c9b232b5881fa1ea238b96327e1d58a7b15fd8d0c02fe876804152cad0ea27abb2ec913b40767b92adc77930ea43755908fbd7c1ee757d9c4c0d9710f4577206050597d9a87382284f9c1375694399048d66ce1e0eea43f4488245f93120ee4c4936037c8be9eb8d10826f9b03c22f693bd819bca44eecb8ca2a6749aab42d498789b24f4a5573ed0b1e8d7e93cc8c6a3f1815a59e162ac40a1010112b80ddcb0ae66ce44549f2583ae69272c4f51db74ec9c3c75f7fdb31ab7a6d51d5505779be2473ca9db801ec2f45fd8c4843f1de8bf1054d93e7e453494443456052b40fa4034a2181c2db8acbc09ae80b070403beb0a98b1cb88efcfc2e420d18126a7179db1b6c8ac2326d5dab9549efbd3ffff1cfaf20bc6609ec2dd44daf0adea2004175f44232f8153407a4dd9d46c80cdd70f014f3bdf3c41671481e1800aec6cbaf1ed4035de151e9cf8e7b110c6b3eaaea2c0e26e9df03ae7f560c7b4fa75c535dad59fb427d0ec9c36bceeb1a420ca49353ce1553f37b995525b0e7c8b2ef59551cd9f8bc1038cc2875dd9d61e03d79e21783ea0cab181df05b2b7e6c109da41c57db9ab351e974620e3e9ac7d50a41597e16688bdcb06a208fd40e4617714508a14cf9162f72878d1017ae455dcead7ab20917cd809b896557f8475c3cb678d7f2c6f93135de698eddf22bbcb5178b21bcf348620d5f61d8336a6d6828669cebcbbe9f15f70b3e02a5ad70790b6cc659ae8295e54a257f931a7f2911bbcb1c4c20e840ae63940761484cc8b60e775cb80ff2c95146327a0acac1abfa3ce30a09e7436ec83f7817777e2b50994dc4892f14e0205796e6c6993c323278025967961ca3b6691d524aadb3d087fae21bcead841a5bf26eff3b42a6cbe00b969e625420b94c0ff137f80f30a1d361fb5f0bf751ec4edebf4d20ce59acf8a9387755730fd595212911017216aa455711646c22e80fe36dfa04846732f3aa113a9e2eb691fb06874dd0791e159979d0e894074dc69d688a6ee205a5920ac76ad497a03c2040a3aa68bd91cbc6570a5e9a6f13d39c44cd1e28c80fc9fecbc534b62fa6006a478614855bdd54a93c9faa0faca3687101ddaa7c06264686ca37254659667699eac7ddc09316ad4fe037123e83c935db628e09bcfd19c941989e566faceae5e234ce661e599b4c9c6ae01f59267d2cbb6e691d6deb5d0f98d886c526463b2a55990d842f19e529956901580bb487c5c1ac0562f2f77c8ad5957f68c90d12615d86d36dad7f95649cc1c590ce4769abd0406b33646505ca856478a09d7bb6aadcc86ffba385e5d9ab734f05e2a8f05ae633873c232ea2507f7f235f3e8842da3a26b2c51d05f73c2ef238e2c3f42de262e4c494e196215811a0e12862763c8d92283857cbdd9ac681abba0899b9e8079446ee6ec7b5af9c09977e3b10ec6ea4de8a8de1d873bf7c680ee1d20b66c6911a981f04d34cc117d8821d919f051467c3be54ed41248248eac688eecbadfd098f6696d6490a8608ed458683dd4e21bcd75848ea6ac525082157839cb43f1ec04c7d034d377be718b06c4425753a80f4026995165d5d098f7d0ad9abd47f1ea825ec3f6bf38a133e036f07251ad5db9ea31e33675eb4c87e6588ee1a2ca389fead5816a4902f1b7fbc0bc95c4a0190854adf91a65aa625fdb766440411707e7c4945402491db18af03c2e7454badf09edb2e84be4d7d5213946c9e7e286b4abbad905a608e46f192d273e59d8747a04c1bc3c0d4c755ea091ff91c2ec03194bd5cf6a6b7f17f7458131758b82d333925eea4cc96036ada306e58676fbec40037ac1adbf7fb3bcccd04a3d646fa29e5a22680d2c285c7262e545affe84a8d1707c5149f5c08871b7603ed086d88ace5b1ec49b71713a0c9602c74b9ffc16d9a643aa2b8804b19809041ce5d767b6bb6b6d753e731d785c272c9f6d986a9a4f444f5b22d31033e17001d7defb4b72779f89668ea886be5b855aa22e472fbc1db3f73537acd07e17381022a88df9a14f18ddc306b88c3732a2c02f3610073d8ea01aa0fd8d826f6da6a0fb23b76ecc4ee7a70bf969a8ce3bf129df3c6033e3c99602ce37c98540023485408ed1572672eb355c6257068852cf0a29d93ebb16d5db7b0b7f5c8a35e3cd07b18b49a450bb45cf1c371b39acc103e505f6eb886d11406d183efa034059a0a5f4b0621cb28c442f9c78cbfeacd1c9847add4da1cd73c1b5300bc6559534fcf124f9b6409082fe7bfad6a2eadd79b2d41fde05108243e85ab27b2759f84eb28442f6e0887b83e93c0c90023671eae06cbef598d9f25d5902a813c76b0f99da43bb6b05e5a8504c4bc7279a7023d4b20b10896d7e50b9d82f14b81ad4e265a42150a2ed9d276763b107799cd99d904d2d3bbcdb2eda756ed68cd35aadf116fe0c0fd20e55866a88a8e063610ce5f3ea60db0c67d3373c3805b37d445a68c844c0b62b5e84799b650edd70d1caa25b1af68416d26cbba1d3023d82ab862074cee321676aaccc2825b196c15f423c70547ec27f07d04e06b49991da0fac37712ac76edb1a381c8a14899c22b787f69383bea5ab79526b9a9afd550fbdccdaaeadb86e832011e1a1a42f7e341d9b559e99f9cd862339423e6895b0817205bbe38e977406f9e98cd101b4e7b24c70e3b433a8454abba0ac57a56ab861a3985abacb1fcfb9980c7e57db0f81f7bc78e2568d8913a3f4fdb899c3d81a5177e748cc47310f5088f8480ad256c2407357e6f62400a3a2db000c92b24ee1a017e690025004504d7fd2126dd12ae6f162fbaa0b9dcd7756aa863cc6d970341a2fb13716006e673f5c79a3e2b92c60e423a9f9845ff9329393bf241cad6a98b6388e8ee5ee0bdbcc4b4ccaa887b82ce41587b0c1e7573aaef27ef2120afee6da54225563ee1a455c7746cebe4b8761e063a4a2a5064d87c686617d43a9387481e4319b414e3305b7a7ed891df191e960449b691cd2f136f1bbd1f6d81dd2e4738100ae0d2d20ea63a529ec6a9175a74d43b90d5acc2c3cad73858cf2a7335cfa1e0a2df20a82f199a2d41de5c613e529c1336c81bce95de5663b2a697e99032186f61955c820c4cd76a85029b2f4d7a3f8c0e5019536dc967eebc13ba8288e7d3062367cb0da1b1169bbaee80cadcc21c7c69b888cc210e7c62a9111ac1a13a72f541e5ac30b6f6327ae29b84384e9a959cf641518e62fdc9d51c160e320ce843014ac91787d2ca9e7bc4c03fb24dff5ff597cc915fb496f66b9acbdb5677ee312b6e98f408f000d8c0c042a42c8eb4d33a89852f482f2885880ca85a8e02c33088d6184d48a8f01c9b781f094ce8bad8a3a534a1abf696efffcf5698c37a7370c9bd4de216be70120d56987d6cb126ff25589fc334dfedd2fc550b9d8a712ccdfc18d29aec7954fce7dfafea5c20d283a5062b11cef388860e0f186658ecf14feabab44029b6bd6f0c47e075d53382c47a4b5f2c8a17481a2e917a261054dc6fb557569b68af35143fdba13f3f3ec49a6c5594bbff568cad844396c1e09413e77bac68b92d4d82f3c929c385d0f42825401f667c452d8e942931b368d28b7ecf3f530ec7baf66d1a6b6417aa5edf1500cbd0a997ac961942d467051df975650a2697bcddda2eb883e0cad1c70eda5b7dc209b28118df3a19b8131d2b509a926543bef4194b41e216f3451a25b9cf5b2dc330ecdb7a425a8a5fa143d7f421140df7fb8b0e895456b950cc9915fe9ab39e5efdca9fbedd77180203f4f65d15c704847443a8d19ee6543d59504af6b049a81f5ca643d45054f9744d8a0ac54186d37927e391309105816d1dc0eb79c5a8700d80aabb91b303e1e8320d59dbda662e9e9ccd793c929a3fe6e06ed3bb4755af1ab3f9438b3b07594e431734e2199be19447b406254e5ad2eedf41712ab18b2fe90eb83d0dec0028cc97d27632192ba16f377b6bea07f47c48535c714b4ce58ff290987058c37220187a0d099f180740079e3aec72778498a7c70693a1c29344343d0fe9198e2e71fcc489a10d8ce2d85861dc1135f2781f18f239bb06fafba6ad7a2e82215c2fda24fc9b9b40c8178822f2fe28fd266f82db0ae0d0f944b8395f9f290d920c50d91f1a3fb37ee90d01de621be0c2ceea80736aa417cf8f17b45f2c5dbe22f8073985d82a84c563f9691e70aab90ecf03175e6c0eefecfe0ce1062cca349eb7a4e2efc73ee78607c01fd38643bf039864fc4e485d3a84ccea59fb2a157859c619fe579289cb810114e0db09f556b7a193df543ea35b6a69b629c5533785e8b788920869ff59cf9491c98c19a198c73f5dd9e5cc1203e1acc132cf8c5b9b3754ee13bdda1f9a1d881af81128947ce0bf100fc999271448f484972de3291d95a27efa64b4ed93e350b5dc327e32aceaa12ba218c0a622311b9164abb161db713c63d7905c2b29be5bfd15cb874aa6cc9f35dfa9e3c5ff1dc5dff6776eb5f047af1730b572f6eaa631a817ee0e132dea5d904e3ef305296b4c75ab7912facea2987c3616e89ef3f12d1e0bba06468ec30a9a954d3fc3ed2b92bcf9e87f810a016afdae1ae273804cd9ce232768c21ac78bceb1aa12a64a73e523742dbf001457f123f84c53b36477e1ec680b441917b450728d2436d497a39515b7dcc055aa274b9f17e823cc1c0ace007f053b8720fa4f55793fe0187bef9418f50b837427cec5d22730f35a85fa5e7e0f432e97b8a3ea5835de7c56a250ced9f9c069b3439ff982debc7cb65276aa73dc1bb52d3c7b290f6807e1a51e3a2ef7cad369f59bfb7efa78db0002bf721fe8dde8e6a9d670218084fc8b68221af4314c44be9dd1170aaddf4913398e19f64a660b03664c3a00fcb266bb911ff8cb4617a20014f575fcfe980264747f91e4c399edc813f341c3964737f64c56feae628e313771302abf64278c71d028357c6761f34db48ac142887b052832786cfa43f050c59efab226f8e7c77d59ec380bd66d54dcc49d2d8e12eebb124f93903a80c2ab6edae1706c69eccd30f100b582b5c13a51ce1d572b04f0fa108f1d0f1cf00b9d5906a881621a6988cf083fdb282db6c1811e16b3c5d33abc8609f032f2defe46cc77e6a5d03e6fc4a3f0ba8b85323eacd6499b1b2c1dc2340d2ab447eb52a06b4d6799938b18194b4849b9745193e4fbbd31b520ef800483c02a8f28da2021a5f3d5410ce2a536a1a8942b067b8fd5fa92aaa0fe61f9f4ef0f2d452acbe11988858c85db9c53aed7b3db0c72a58db5263822ce03e5c104dc0d503e7742cfb86dbb57c330d5f5c5bc6f54f494cde8ebde1da2f83d8f544731819f39d5605ef3c4bdd6060710674966209c80292f96e4aafcd144c502ac35045f182aa3584400b679ecd35b2f37eee63337c4ca1a20e4741703fcc8664c521dc1197dfe37c6b274d0a5c742ad06c66f30e0c4b380c35176159a74aa29af31f903978ff8267615e9c0fad0bad802228fee39ac90ee4eae1b8e435d5f01d16e76b30b82e61b51b7b8e916984829ee0eae4466eb379a0891039af2d6ad1377e71e33d5df70fe3990811971ffd2897657e4d7121e1199adcd3e897136b7b9216a38e6644a4afd7ae28c2cc42d7a0af16a80bd429b073b88761b42530e35ba3986e729046698479bcb1540478df1ac18c8cb94d0e823f9df6d76dbd3f1bd67954183fca700d01e7c3cc1067c4eadce9435fd004405ca8a632612e192979ec2f9c861c1f5b0eb59a7ec5be69a4a28664164210a0bbb79de0fb4170a6977f9f300809c84678e45b22c464da10b83dc9d8381e4a7b838080d37c5442eb5bc3a7546b6394914994ea892ff129c293f8af12ef6a9752c3b1680612814968274c1a317170cd1784cfbaca66e730d6d51937b2cb6d4b332e09e855df4746860438e46ae438489338b49d2216ab54fdaa12f53ae6680b225a1e8e0b8a093cdf5a8706ee26dc18ae80c7d07039517d84ae285937fc77776ed13b674ccf034bf9e8787e27f57cda6734b79da2751dfc2a35c8e804f68b53fc218d54c32b9a7c854f47468c8c259fe4ffe9df0ce0a5a4e0c7bc4870686a9111f792fc72a319d710ff098d0922be84caa32249959efdbba3bb91d855d5e30b59abeb639659459c3b74dcefe4f65e92664a13da5f408798dada038a0da855b0fb8aa80586d7d63aa1af4f46f41fafa492660af8d8f9831ccd3a6000b656987fa5b9a8d49ec231a01c3401d57e920d3b25efaa13cd33dcaf2f50c5fa04375d79b44cc8c242628696f8a24f5a16b170fce0598da348002a75064994e6f62b17f58f1c6f45698b0bb8d11f69b21dcd789cf97c2bc5d869385462429d9d8148457489e128bbde18061807e284db2595f1cf93b1894f4b6001aa44a1bfeaad42a8b512d941f05f6a1532a66ffc97c1202653daa099dbfe60a5a5c97fb3a4518940328e752958c9aa3f3dc604e481ba90afe856db9c2066823e00f52ca6845a9c69589b819276c475d115d5fa17ae65027aca59bfbe372c29a016282c01bb0537b3b39a27646d83db57fe79c2725aa73284f762ab9670ce170222eb8bc82f17097616173611325448a7cf5cc312ce1187f45dfafe1dd40608b4e3e4b166611c0774768e52b42b7e6bbb10caffb4b1ef91bcafcfef02ae93109f9899fbf18f594594ba9c33b6ca80da1d192f223854e6844e35497d87b60e5164460a1e6326fa06a48be56c609a19fc28783163e0e7b377db80f4e25c38636d5db758d203f92a8b4c07db1887221a72b49aa64b820a01410a318021988ea081c0f4c7402640680288a411801b58ec04cabfa288fb2452c9d1108840a2214054003521d83229a62583e41188040251010a4e4460aa21316a35b0c2ba02540645041cb283020d6120d7b48d66048c575d0a00ce141e80c2ee9d8c9b46170ac220568123644a4ae910101c30b271a8ce65286b0294b3900919a5d86040c2b7c4ca53a82c414b33ea284a62683a1463338164380030c4ce9e344ac036a1c5468b90c49099470201d518a66471085c2127a9098a0466730083460d16320ac29becd205fe36a1bdd0774c25096e44354ea12d3d1908608051e3a0e4d385b20e74a03515dc4690feb234a686a32184e784475e0a2a7491cb1eda2aae57a82d0714c1282148885024208ece0aa8590d0bd9ebcd20bd969168ee2082e3a048e35c5377c14313a093ced6e3014a330023a80ea0918e934a318cd685cc320a80da4043419928014c9194af844654003573d01c55aaa215fd92865314ca51532a74206e35216c49fd202582c926038e111d5812bf1e4ba0815b3c97d60c9d51a099f5973ac714017e159c4c068f1322c63173b307a4eb00f52f1e76c582840410df33e13c8ed3e9c1e29157f5e40b41e65ab7109ed0cafaff71715d4424ca3d80da6d7d86d88c3283dac3740e1b329158ac0fbaec081d293ea7aba6962054c5a24ab32386e2ceacee8e4d194f3a1533e4d17db083dc137b7fc902553f4259f4e6bcaa40d7ba5c5f9b156a9ca4c7df43338c02e02dc97abc67d6cea9ec53bf27a66e0dc3ba0c20dc7096b1fb353918ec7880d87b312cc31f17885f3c67d9b18482798a109cf164e0ee074b217801eaf5a6f0574956505bca02a066995c3edd227318bb55f6b5ecc3b65ac5df1d91e8e3d9b7de6ac3e3bedc99b5621225c1719da023ea26741f6d16c6ed8e25c0160990185f14d739157415f4d3057f5291d6d27d7092ecd73a9e055505867c764e1dccfb598f67f77c6e5e1b07fd72b8c0afad799713838003d9505dcfdd6f3d798a481fba952a7a1579565083240cd6cfe9997eb1e0c7be113651703ad2b43df2a1cd69c748b80de8c65eda2e5008aa89b928df27a4bef0dea548ecc03dfbf16d02177419e6086319ecaf6fde9762ac3e1a3a7f877a7d13c39f69c734dc8d7f1c85a7530522e69a97a1cbea3cd6c61a2edd1eefb519f11decf0cef7e60c61192bb7da58d84f57258a3e02136e5aadee72c666660243b93a5b859853de73113b0600bea081f0b2b595add9b76752ffd55fbfb7cd2e29e00ab89b7ca055883760c9901007aa6bca2152b0cbe3f8f4cdb0164e819a36d820ccc3e114984b9e63f349c82ff1bfcd357f07bb3564a0b376c91e8e52f80f55371512c88a48b3cc5457a496978c78966e0140552f30121a6cea18fcc60b203d46daa5bc00aba065a4c576df1198e423fd559b97c19ebd2ecceae17a988be89c647425e47de6590208b6838be4139d63249f0e1000ab016e74d41089caeb185046caa6a97751c80c2ac5778c928e409c258643b31c607a22c59f08a453d0f733cea6582e040c6433038d296344d06ad716f65dd16cddda5bcdd8851a70fa5edb95a2261c536e266ebaac243ad9ddabf130f80f9d53cdb90b51a846204850866449bf472109c515f0fcca1415d90989bc8c306fce51b74804f7293c89039da96bd550200cb4105e007e2b610a3897f0da786d3b49b7786bbcfa6214db73970dfbf57f74b540207a051075ddbe96924d0580505b7b3c9f4ace69af22acb1246ead53231d5ad82adc0543ccd7790ddb12b17a342fc94e7bf5ca5031e4dc64cb6d29eb7e4c2e080fcb17d823cf3b52eced9540e0ea31f5d8d94264f81d9802454c7da343400c787619a1481d293e2af363fac3a2cfa5369553b75a6e7265df2a18de8bf870db12fb8cc3808d47bafba3cdcc4b61e4c32469d9a1f11c135669d488b12573ea6d849d3190232cac3c6566276ea1a58ca2b573bba376b57bfb7cb1ef934409b3dc655140bc3f39315e0e2357cb329918e293ed745052ec6c376cf879ee7ae7e8bfe7c728cfedc408dde3ae7e7981e0ba5d6892de387245b061ff4c2b88a0bd6732640b22dbe548b3c8cec580fb65daa060e43fef6190d762b1867633e74de7c8cd2bf774c3f55a343f6aed4a24108cc5e72a6285603cdfc961d8b00640e0afbb704d4a12f753ecc10239b8684f81ec02a54a5f1ef1ac3862997bbca96e20182f92ce38127db5ac07ee01b199760d76d073462b67eece5596c5d288781634db17d54296b77a241845eda1063985ee5ceb33ed68eabf5c6a8dfdcf8e58948753fc2723d87ada1d9828eb289ffe639c4f2d808d98a487fddcb2a71f310b904ff1826772380e2f6ca4444fce0e682563f7d9b15620384b62058fc9f1fbb1a583e22b78418415021948ea062f9e19b01e259a00b8871c1adc13e0470e6c33e0c6c3ff30fb061dc87b0a570d789bb62fd005d36e2bc0840479f3bdbc5c72771a08873840e080e104e04c4103421cc42e882e0406e0e11e17e044e0902d2040bc1e2fb8c6c8a888d2330281f99b8a0f28fea2610d389508bfbbc1d02e289b05020164eb94941303eb83b2b1e1fd37921de02a456aa4f387493cfee8e45f5c36bd81a0154f3715a0d4017e73a4e651c3efb3a8cc30f3f6e2de3c771c788b6101e8428088a21101561c5e2735dbb38ff21897e9461a146e06284d0fef37648215e08e8812be67bcd59e2c4b0492e671df1361142d90fcc153662e5df0723a796f233762ac438c252805838ea00ed23fb607518d28fdcb9a3d40fd7cad2509f42f025566900f8c7c2e251dce9285f3e3772db527f44ae56100b1e7378e75b3e6277cae526b7116a038e486afe6c8d5ae807068ffb92f8e2ec9621461114205041e0020850ea1db7fac7cfdb19806009f10921e28816954fe2781e2104391f60dc5ae6580d136cfadd16118e20428009482ebd512d6d01b002d5085867d600f4d0c81192c40ee3e1230c17d4fb415d41406a01ee80ca04f8a43659440ec40688664156c46f9921bc103f02096fd6ea1b4448d23a4c28f768cd10d28144a7054d6c57876001fa58b68788512330521fae668dd844781ba237be8fa8966ac49fe24f9d0ea8f7933600015d64eef84007fa20b77910f920b611c78e888aff63221754fd19395d2158883e7dba2b3c1fc485469c23501fb156ffb957bb483f2f878c78444086a04598227441708790138111f9a1694c210a419882d045f8fc6f521550b5aa8d20002575e7e11310d15c1666c78103e4b49c994652e2a979c4dd2544639a6ff44d4b7d45a5d2ef30fa1fbe9ca18e8fe9d62322aecb677134051de5f5eee77955b17d3f66053cdfd25c6ee1edb8a3a9b5fcdcd851ae7ec4b4ae11558c3f46832fc4055c5651f30ee28e407c5bc4e6de67d464055da8a83bbc7bfd8c69b08ae85c6c5cbcca5597e46c0cea0e116347607c1f914d8d188fa040782ac273e5a73a2c0d97579aa76064947286e123b690881310fa208c0b6185f319dc1440c417719c91cfe1e403c1c2fa19c57d11f345047e43d056c3f871b00a3216cb6eef3169ad280ee546300223ff69d6557efe743463c4b42200f53ea26e8dd831286819dcbbb1be1ff4168a38036db7a342b058f512638199be7b74ff4c1dd08194bab43a1fb4e8dff1caef582a979771bda111a078131bf1720764bb928449873859de918c9010e728d220d2581c3fff3ae11c3e78b4b7c081eef2850ffbf97fac5b3350923e333465a1b4b61a53e24cd3ae4fe1676d12885d08e8425cb89fa15300115e04c6e873a2a937a28acb676d3401bae8ee8cb8ae7c7a471611189b0fbfee14c68f43f658bf4c9c02eace5d5e605092596d0e55282749237368292435899857b8ee5a1774ef7a88eea7c3b74600de34544e02b615bdfd426c38f850db3563a822ed32b121010800100200880c57d95c6061740fb32de730f68d6d8490ec78dcde6ce9afedeeee2da5943249290303061806a3053a2c396cacb866987e00d150f971842d6d6badb53afc30c2c49931d24959c18832031a27e48cef488e08c810313c2065093a1836702820c1d6430dda8f0d990d68d046d4907f10420cfc0313365c52c60c4b9ae00627593ba48b06320827883c62df3d83c82254c04155c21c62524a29a594524a29a594524a29a594524a29a594524a29a594bed3ea8918d835acb07a7251290178c8d0efba75b7ab6fc686afc71823eff02df1899f928f874fc8477e27f8ae8f1f6c8f167c3323f860f089af828f870f323c0a1d2dbca3099c6c47131ada87066badb5d6ba8f0e8e0f0e327c6ec4f061c5b0d6da19d527537e3e49dcf4589f2446c06edd7508212373ab03890c9d82ef0606ceb9e30c76f4f935010c9fda77e48053dd6774be195fd00e24761125f01a9a1736a0b7fdf9d54c77ede7cb78cd66c1b9dd8237b8cfc01b38a615dc77a03e80feed7219981f8669450fd6c66e3aad7bf745b062cb32d29e1978837bcd850e7e7bd3b82bda1a68674ce7edaa7fab73d26a3daded0d1c5518976d597418cfce7af957a83afce68a0cd4b683ddde40cd755757ebe1e7c04f7c07b76d435b4fa2fc74e710657f59c547827c8c404f66d4e93e67d83c6e78e4f0de713e3c78e0d1021e3ee41d6c3336a816cf392d0f1e4074d643c583c9e691648b9a478cd37a8cee6ead7603c618e7cc62c1366559a6693d603d48cf078edff488897cece063679bea494ca13faf7b06f100428f1e497cc04024127d9f0f1d1cd827ac6da60694ee68c26b42838f8e0f0e377c5839e7acb50fe9c363e3344dd336ce07890face32818e493848c6d4688af42b80e24964e30083a7a7083714ecea3c626d89183e661471a8960c78e2d826f06e918da0183fd8d483b5aa0378dcbb22cd3b61dad1d403517d9665e17cfc860c91861065bfcfe07c7163f093ab6f8fd0d3e5bfc8f063d68f89989e1ab7b06e90012a483bcf9b9ed3f0a1dad2dbe8cd5a1df4c992d9bfac06aa18ec835d0e047d3a01523081ae41801ea860ed271021d34580c03aa359308a1244315c653350f1f0ed34f6dc91cd9f3eb6aa86acae4bb31cdd859abd6d0713c32028d448c422325a98ec681c441fee824df9089c9cd9e65c64fc40309a0c25c60a3ba517ae33abbbefb687176fd7b534fd507478bf4c191b3c69191da8683721bc7711cd7f9d0aeef792972173ab127275ee989462dcf4ab43b3adf77a26379767d14bb4ad9d9f5473a244b2279a5249ac144eb6acd14f9445ba68c5a1668d7275958c9ba6cab9eeaa6a9aeaa4ddb6beff54aef46e2485b49bc37bbbe8acac455d12ad9f557ec108b6561f14a594a5c695371d0db1556915425d45471ecfa2bac7af2ce86eedbc2e3725d5cbc5297706585524a291575c6b6ae6ea633b66e5b5ab8baaaabb22ccb126f6539549665595eac5f5eb4d65a6b527fae9138d365395496655992648b244992d4d9d699604296655996d55a6142bb8e592b87cab2d4ca3223c9164992e4e53ad1490a0896a4a6699aa64d407f1da7392f874aaef4b22cc916c9914e9224b8c56242b1582c163b4119954c2c2794a40c11bb8e76925d99c864ba2ccbb2245b244992d88e761c473bc66242b1582c1663b170b0582c166ba6c867627139f16185551a928c8c8c8ccc5d4d20368ee3389223499224299ecaf005bb458fd515f75a7f9fc9f4a70df37afa3799aa9fbca8bfec96a59ddcd57757a2bbf2eeaabb5a2c1b2acbb22c77fd9bf958dfb64496f42cd959d22da9e94adad1eabcc88923171402c8b414ea621ed362594c638e4557ac4ab3e160b1582cbab9ca6faa168a1c178aa3910e451717142804b0c50b135dd5ed1b5e948d4fc42a183e31e989cc6b69b12dfd6e7fb40233b639a7bdf5e9aea1188215501c9c841c3966e020a30efde02689010655a288ba838b7590a3068d9c334e8e1c44a801e3fc32790924288500c4832708425490041a2740410406126a608c31c638e79c73d6379e73ce39638c31c64572ce39e78c31c618bf4ca6535d33dca082040ccf39e79c31c618e321434962b8c1becc2d02262307216ae0d50d75e80737490c421928868b9d9f1d372091c4119650c11221328e22352a12395e2003074bd250a48922465004960225396e721851430149fcf030d2c40e866c348103a68d86cb0c5c280d38b66d83d9b88e821c8a099e5c3b307f72e99840a5992e1f7fbd5d091bea864a5b2591186618997010c92182830d2232204203223f1011824811448240a489222f8ae4145915c951c44891218a04a18812233318194f60e405358cf8300264248991252e18ae172b38c86aa0af5de810416389ca488c192f5020f399fe4fee7e6388903de415832140438c18a2840c93214a7a68ddf0b448d0caa11583adf70c6aede03537307e450ff97bd02f7efe26aff19aecb9af9b03572b2aa8e1150ada5d416e73e00dddc01eea6fd6cbe14c008e5eb1bda69d76f7660ec31b5bb842a51dae60b6393083373478630b41faaee1396988f3ce608a7ad2a0ef2ddbb2a9334f84613bde1c98c2612ae87bdb26573d11860adadf389dc2e5a00b30a8baa93d176893ddc2816dc38d71d89cb53176ebd6baf5b7486cedc1c1aa3c39e79c73ce39e77c3136408a7216cc6c9679a599f6b005c529a4bb94cd348db360a6eda4408ee32cd879222b1279a5226eeb3c8fb3a048c459f0fb5cdbff44b47d275d0ac53fc57f84c259701b75a951c5b1dd569eedbfa9742913673b1bba57eaca8a75bab2daf6950cd59baa1a1a2a5d2d2058ab45d21dca43575487ea0c9553482805ed6c3028ce560a14bb14c54ff70da70673a6691bd7695de795761db7759e27f2b84f139da0a0a4a070232d85542aa99438d38ab6b2e295aeac702a2b2c2c2d2c9ccb8bf6f2e295bebc702d9dcdcb8913269ce01ed440d02b05350a1450482105ce822a9cece9e4959e42ee3b1bba2d784297a29bbe055174a9133814ba14dd296c29a4e095a6a03d14b4d7d262e350d4c0c65f61db8622fdf9f3677a9039c28f2131a0f407ba1520e713bfcfdd5e8ca9cf89f1b4a0a5bf438f0c4a7b060dd94119697c9e3c3f9d48364d8d619efc457f3169aa8ac5a467689544a8e2388c6aaab8b0977d6ddc3146daf8af8db1de184ef5497365cc93ffcd6e2c86499365649c5a71bc266bfd7d9e2b8e67161c19f4fdc53c5177318f397bb7d361908bc9103b9d8c5369ba1adc69e8939834f7c819e38f62c1777222128944227d635e73225461fc89d0425f12d3d09fb67863db4599dcfef564c6c8278ac6edd6078f9c2af23bed6a08d59a593b7fce5d673b931f3225f984aaa88ddbb5318796055698ab40b1026dfa62a36e3efa9835559cd8b3a28c5f4e4e6b25848916ccbc2048880c2139ec6fcf202134a0725039a81c540e2a079583ca41e5a07250393efa5896744557e284c1726a388471bc24c902050305a32c491205e3a33fb5c6396c28140a8542a15028140a8542a15028140a8542a15028140a8542a15028140a45abee521387adfe56419bafb3fe001f8d5c5cbe8f8515d958166e64906113b1b0298e43cdf089a3ae004b3efb9676365a573ba7cebcfba2b96767d322dbf6e9b649668430e75b141273522ecf98faa82472fdd966ada9991383387a05c67605be3774413491f0d1f69c31415841f2e2024a29a52ee7619b51a2a6c6be9def9d03e88b3d7fdb2a473b162df86f70f40a8da357e49fa008430b55b5427f06c248b142ec80ddf75b5ad0d5bea187220c798516f1b7b4d0360e5d10ed1bded02bb86acf1716c836f383397f85ea417a583083a82075daba679b01c24c122df531407f7e0d0bb0e46b69417f3e0d5d6c1794ae48b15147dceb430b4690901ccfe19e414192d85ece16bf2782e343bc70199aefbd3c82b000df7b83a860df7b2d1282a4e05104d9d9e2cb78d09529c257035984205f12f29e414162f831e1c48b4b0bcb8a49a5441a612652504e8610791db76999cef85a6722a815abd347123e96fccc70776b7f7ab8149fce7b7939f8e9c10f114e7e94a0e011a478383f4a401aed19f4438752ca9e413f72a8fc70997e00adfc3862341a91483f94b470382e9ececbb7026aa2a67aa22090232f2f2f2f274e0019222ced1904a43c810403050a0a50e801050e45c702050a145d0a4401858e85b30089fda860e228f883113f080100a43d837e6022009c0c0170348834418c69cf2072001c054d04e02819a4420a28a0382104df84132f27efc4c636e30324413e5c7b06f970edba436d18e28591b6dffb48a2860a3e96d848e167c60c28f4f8b1b1a78f8d135e34c21ce4803d98f13f448861c28f929c132380f18243c3a504325a74089fb25fdfc5b62df7f1e35003374c693ba5edaa846dd649694c47102e202c2296d82ca6d46d0c0794525adda5c4555a6bedc5234ece39eb0c881e20569aa66ddbf5e98080654a6ca819747385d2206e805842291064103ad38dd89eca706d6ecfa0170f9bfea75746a617ec159b73fa9cb3c9fcd9912638a23e5be444fd52027c11a1de1936940c52d39d7ba9b66883601244925d8300c2c551c2b5f75a120b94a0413241021ae38a9bd9b0afcfe00832eeb5f4de7b6748d93308082482d8410ceeb43a8da17850c85c2f02c5c3ba976544a7da558573a333aa706eae8aded6252febfa5c1c9755b77147876735eee88cae162671e97fefc517bf654d1cf0604f6d87ad7fd22582ec9927761b3aecf974ce6761aad8beda1bc35728df52dfd8c5e38e0ee6c12b3ce21dac83c769375cae7a7870b0563d3c2b8ee3388ee3380e8649ddc240bb7e8661d8855bf55431996f54b8c44af010d65d8ab4eae1c1c15af5f0acb8ce6edb76b7ede9deaed62b8d07c7aebfb17a78eaa9669d0d27c4c53818878403e260d3daf9b3b3d66e769b5a86715968d7ef72cccb48767d11503dd5dcc3a37168d6aa87a78ad98dcada4d97ddcdaeefa9445a891ed2658ab4b3df66ad19d0aeef19cc3357d6aaa79a71d90bcd5c69a479767dd2aa9eea0b768bda38456d47d399a136d246871963548b69312da6c5b49816d3dccd48d3d6466d1cb5916a2bb565c225bd1999915ea3573a23c38cccc88d8e3be5aaec2959a54f0983c160301865e1e64ad62b5fad7499bfcf64fa3f9d36c597d377d39e29a57aa557abbc72b0a5246d9d61fa73cf59b359aff4ca6b38d8f7994cff27c779e52baaf1c525fe4c342335a5d46d86c160305849b775d06593a805e7a4a4ad514aaf56c1b4100683c168e9d9ad86dd622e5f4d3ba69be36b379d3f585ec5b88d357110db411be91219595ba50dd18fd875730ad2bd817303e9b634d45d8ab4dd5aafe39c628d8371300ee671b08e83711c2c14ebeab4450eb6eb6bda37967b5a879a481b6dce3abfd7e5e772a865e4aeef98fbe9359a0e453a6efab9d365be98d3b4de361c6e780bc5f005bab3909bb9c1276e2cf78d455ffcd3a97e5e798d7b5e795eb90dc5555df5b0caea5356b2c4a4d3a74ab4ea1bc9ba43ba34ec4362c2231ebd868eab18ed89b1623ef493d0e567523d8eca6b6434f9b94cb057954a9947da9d0a042adce4ebd1f1021f1e6496c4c007d68e0fc827c3e7f2711171fd4cd88a96951c458fb5b4206dcbdaa26579e004bed63df103266c5aa6ad2782e04f3e91d75d4f0c01883d510461f644184e083714f45d506a5d2eb4a5b2f88a3589a395a74f575305cbd3a7e554d13255b83c7d1fa78a97a7efb1a9e2c4a79d709d27caf40e5b7bf15b62fb9f003d7602b4ff028ebe255cb6174f5adbff05b4ef02924e5a2ddc8b2836b6bf0b68bf052cd960e95e443962fbdb57413962c5fb15d0f42c293e6cd1af6c2b950b9b3a6b0f56da26908519435f05a4ab1943bf04d272c6d02781959c31f447a08f338674f2e27da1c1668ca3bc4835d58cd95629795ba5581f4e4051b3c1f6ff40d1fa204e1b8854874d8bb0e973a05883780de7c1a6355fd8b612c1a60abdadf4dcdbea8e5ce826c455d5f7b192be9ab1925ab0b4e79d7886d379b0e97b6cc650d065832dbb822c7b659b36a8b2fdb7195355d90a4ad554715fefdbfda5e177e0e680cd8974fbbfecfbf9c5fbc263cd18d75430d216a950397ce268049b2ababf2ce545d9d98b2c25cb6ac638698542c127b29056db84157d3a52913607cebd8934965264d1e105bac591a8a944eb03e99ab0513bba786c3b6d897965715f716bf2abb20bd0c4672b6baa28ed19e6abda9345dad3b2306c9b759b5f6d37e79c3d32295658000b1138024484658d3e4e5b4a69ad2fb032295658000bad2340b1d1c7696bed05ecbd14b0806b92296460f8266963c6169f021798800578d09cf8a5586101280460809f47b68fa38fd3d9681ac5a0922ea69156838955ba04f4375a9dda149b7a283369f5eaf6decbd98b33a775d659b669dbc775369ee7719d27b239392975a91415539722712ba593ce064c49e96c461cc9be9748a592575a022f754fc4c0f6b0c2406be7f42dd49ab57ebdb351d939772cb496e59cb396b3cd39e79ce96c69aef88a197080f591668852b9ebd499a55345fe9fbfdd17178664674bee0bcde5e0cbce40af74798da7c461aa08c7e5955ee9959ea2c3925dbdd2616acaaadcf54bad5a222b0d2e25a925a15a22a296806a28968e88294cca4a73872a8d5552691c5fac021d2703b52315a6869aab9e5cda917aaab01953df2b5dbb8a17567a439e128f49a5116153c52cf18f12b9eb152d8f3ddffae8d8e2d4818f41767d711b29f8b2b5d16b3cd22347cff3488c5ff4488c52842c88476a234a99427ae4ae5fd2298d95c653c81432854c2153c81472d74f4969a5b82a0dd6da71664c697b5822636cf6fdeffd497f529feeb9b0bb0b85c347dd450f88ed7fef4fd1aa86eddad40601daa5a81ea53326256a79407efcf9bb5dea041504767da24dd946bed18e8ffea419add9d49a57ff862d2deed74f5d0ed4d0c5b63bb64d3443f1b2b6773678fbec8aeaf1d974b4fb5a3bd0dd3b6baded7ebb1c07de7befed30c618e30e25e4d33e67634c936525f3aa84d1d584a1847cf8ebd67df6a92e6c69b1b9edb3ecf5cef4bbd82d58bb7ef6b3e3c216eebb6fc9dec5ee420d70a1cdcbdec22cb6eb67a1cdcbd6a15be768268444abbda3d7a83cbd3126cdcfd8f4ef2aa494524d7b96c354b29eea1d324f357355ff3be709e3ed8a19b8acad5bf059ab5202a7c3b0c82131e6e9541f0224510e260c7e51875fd4b160e14686d2cb401a7fbbb4ba9d24d24fffadaa98dec58a52e955de5f45e54d6108565ee54360fad2bb58b10292c6e930a31fdf7d52e8026d42c2992a7cd24f791d367d9413b07b1192a922e6352a5fa7733f27cd09f354df83ed3a0245d28e091b3f0a78128aa418dbb72814453910891a4c048a2450fc006c67e0b22e6b67bfab0993bfc698a7fcf54fc8337f16e6174f779c30f94be09cf9bdb3c9f935688bf8fc7338fdb220b146751b82fa81fba08cf9ed779a9fec7a7bf6fcbb9a35decfbf33e61d670d8700fae10b1bf8c42b634f2fbcb12e7cc105dac47dfa6adb7eb3997e8e9ba1e3cc18872180e8316ad0a733741c9ca922ef793f832ffb4e98fa5a3f7e511bedffb63576f548d17822546b2a508589514a2b15459508165134eefaa251a45369ee57fb6185b90a65ccaaf6817af9ebe5f5f5f2577dbdfcf5aaaf97bf5eaffa7af9ebf57ad5d7cb5fafd7eb555f2f7fbd5eafd7ab7ab5b9d386362fbb865906db44218a2e0e0bea081969844fd476c43b8a99e79a2afcedb3c46e287a406cfb62b6ad879e6bc6d847e1f05551dbd9f647d16a0754a63aa56e4f27bf2d6461aada68dbb56cdbd005dac46699bb8c8cdb2e95efbcf7de5b5bdc705451407c2247b78b3d3b16b5b6b861fdfa75c6cc98945a6d973ac95edf4e6ba14e7d210de98cc15d4ad4929abb863aabdd02b4adab2d64ece9ae852c4c9122ebeca45d03e6b6a14cad1d04b2d712c8c2e9305d2a4f6badb5f61d603590d2b6fd94469b503d633a51aa050dc3ac4b6d5bcb58d353f3eed7fc370c69930d8375816b27836d5afd89c41b636fd7135d7caa85e55e86ed35ee5be8c2f92d6ca176c73d3f85b7fd940dc6174ccd5d27addaddb7b6d6da7dc17befdd1ac418639cbb14de3ae79c73ce5b5b9665c5626519a27c641d03463bffa63dc6617e1d6e22ba758b2cbcaac94203362f3bff0bce21aea063d0a6c9b6e1c59931f3e2e0bd31a959ad157cd92c78cdd55aa57aeace80df1eea13196bc6544da5f21ab6494d5a7baa3f53fb77dbece735a62cfbcc05185431d0262bb4dfb0573a2dc679128066a0fbcd363b0f4f27ea2d2de8cf0f011d6a87d9b54be56d5bd8af019b48a8e48d3706a9648846000020082317400020180e8984c228c891288b9af714000b5c76406256381ac9a4a16828085210475114638831c600600c300621438405024012b7410cabb72e38b2967b34fcf3751904975d9a7f39225a9ca1c42f682a38d361d92d1a7404c01d79825a3f0a265234eb8ee01ee7bd48e1504e7ae50d3ad591f01ff36d18464fad336be52af1880e41ee380ce8efafc0c8081d128dd4dca008334cbf50c6e420d42ffb6315067d9975ff9232c72bc5ee42179b710f8ffb7a6b8b47ec147570d7383d82a25a2f4995d6e399e4b0cfcfe08004f40004d54f9e6e8e4004aecdb71f215674b9e140555e926ff57576a461bdf19958878c7212bfd7f82792cd896a5018a0ed323ac1c66dd3d3d5ee633010e9dfb63957e1ff21cecb5103e0c932da076368788bfa4433ec824134bdf5368d7b7f9d8b4960743642637d358d7d9768720c0179800fb9d44597e4d13a76e74b6d51a6fd021aaff759763e4e82322ba743c14a2b36bc4f44715f01cf3c7dffa5ebafc80821e2a64e1a9bb294e655ae2023e6901258406f880a7fa847a285217a274c9896085dce04dd13b45ec0472b22f8ccb1890c97f0b115b19236a7b147d12ab75b1a52c2397a96d09b55eff43fa125f8cba668caedbee0d5b2b7f007ebae341b6ffc56e5732605165b50c5db357bb6840a5b418924aeababb975ce7cee2714acabb694df92fa9e4c433058d79bac2d4edfd0c73eb40c1eee6e588132d384d16fbd2ae4eb2d3aa8cc7b65b08c6412b1aa218d93161d1677700830c1c89527da83e9c3c2ea40a62a232aabcd9ad9e50aad69c670d39a7b536dadb9f0295b532951742529b0b3ad3dd502367ef66e9333d2a2e54f615bb1240b621ecb47515e36081f88e83e9b057868660259058870294e112c0e504c5471b4e86228092529ff946eae66e3b14a5232ece7760001ac21543aab0485269c6a17e982948d4b7878665c42e64d6ee876495eb9010083d0e08b8a766cf1012176fe859c8945efd3021f16681f02cefca2e0b18233bb59ed80dd66a4629ff29ab26ddf7ef2daa4456100ae5b0fa0c11e38f64adef66609670e08ac3de4fd4f6f432c7cc6355897c7bad6b1beebc1ebab5c405ca3db189212a8e57268dc4d7425c0c30ccc1d8f593b2bb5676b4cb61c01f2f03a4b51fb2c880fcf00888ecf4ae8502ab8435fa97f3619cf43837d1361bc425904ee4ce3551d0024b0a6ba330519119d6c795a7da6af4512f05522671cb807ee92c8b33c5a7faf8a4c3ca936c45c6cb06865b8e64189c29f788bef0228aa1ea15d4cb4338af508107d43c5233d5582416b98657b8c0dd786cbec5a371d6c5321f930a7022216e8b2fd220a91700a0cf3a2fb5903d58a9db53ec91dd3e23afcda411193cda4ef7a2b6cd3f4be050697a3603352c2396e1ae50e416b3e1d2a7510847707992652b94afef57048aee45b559a1c3fe62c8a02327e4dd69c0358f4bb236064931ee3be37d659842b447ee59a7552028668f86691712cf6613856d9b599c17ca9c39d10e3ee0e5f9eef8b41105f4858437b3c3a5a83a6c9e7de80a3ce3ead6fe4cad1d4d54c692b295fac1c6405d84b69870bb0dd4ad1385ffbb19346afaa41e48f843ed0d7923edb269e376e1d405f58286cb63d2304c8dad0d70e442ba6f60c802d9b30b28cbeb85525640a64599011d0177ca24ce439803001caf8c0576de88b3136930973b5a7d486d27dec81826e1cf57fbe7214672dfc1d2f289866ecb5865f147751baf81ed98c463babd81453c835ebf4ed900a398c988803e7328b84512bdaf3119bf96f7f1f5ae31c8e3dd3088aaf77988f0ff817388306bb971768cae3bcb87f5941e6d90e21811a6f0f0d9510689f46a60b576f7327c4af8fd2705c0c9be921de68bdd8e67e2d647f528628978d36e905338ae888f36d2272f98e624685b235076838ff3a67c8e8c97c3e966902b72b6cb64cf432aba88e78ba2a2d367f6d460be9374cd103fe7a6c33bb8b9896f5d891313dd7012c6b6a758f3b8f114f39c75ad4808e22cb0dc719de9b308d783b6e31b10133937285e1b35763592944470c281f9c8cade5ad24340b7e06f587b06acce5bf9fd2fe9c47360231dbddc27a7b43cb287d1d41f7b8fe1c4c1e74a3032b720d5063e89b70873846bee8c5c9c6fa7920aff465f5c4c6e53eb0c003a146252eaa00ff1acf6843d158e2e227d730a422d1ce9a302b233b283acaf2d1bb486f8a8864af9ca4994ac9049160459b5bbeda799929f696f16642f758d672c8819e5e3d199320cdb2b92906c75e6f83d258cce12416bb51306d5251071ad5d654d2eb70a533530c012e102195b360b5d1a2240250b84ca0c87952af62d164be5f08741c1474d7c37186c5625afb806fa055137a4ad4b3b8e0d000fa1343798362c8ec4461035da8135922610a4626c776dece0dc0a1139a96e37bf5053574a88731771c62c4a96721dbed4ee38230218c09ab9e8428fde51ae81028d6180430453068c0f8f4aabc2fef32a717a985ff64757ac11880533eaa23dacdaa3e839d31dbe01e267d468882523b35c506ca8ae9d20b2ec51b12a27d0629351672fcdb411ad1cdd587a406b5517c2c4108e9b1e747a4f92fdd96c827f18d22b64e83327a5203f773a899754e2353ef6960d3d7e203873eb8834d0988212c647fed9195c1c24ae64183af89b294c834589b5a148fbf470a3fb8129175dceed29a96b246a59519e5961a6da69434db512458ab36da440493e9cf6460d9cf8a2410beedd0182abb06dc2f8bda8bf3ef7b63a9da8658a9e949837d3e3ad12092bb41e11e6559ece220d3d6117aa8a25cba207648b3b316693fcaa59b5867c1ba6232381147ce8f7df520fecb29979b4631763161bd699321a3d0cb4b583343e85b9963e403fe287e71dbe934a34bb36baf8ea4f32577e56f50ea2285477c3a4e2b1449ca652f4c90a5b9fc3c89f8e441118b2bc695c3a0683ce5e2b22f285ed576a8ae591d01e266404e232beee547a8094c484990a9ab73a49b1e32bd6d03ce39ff76ad73f220c9f901b822db204903fc2af8430c9d8948b1e56d91b5a53a31441b6a9c99158cf07c49cc84c1d6904db0093806985702336dc4e07bd2ef4461002823c018217e09f42423431e0f78ecffb9969e803592a4a78911b0c19860d7776abdc79027662e5137afdd516f6d4696ce4937926be42313e3486c434bf903235a92b10448d1bad4091f0899273b8849a262c2b384a108b65e3159fd200e792756858e5fad70d691ee39662823acb51f33646bf0baf91b55f0464728699e1ea530e570ccd708d16366d52c3e562717f853e0f3b54605f34fff1eaf35dd9ea615fd002b8643c238c9db4d78879ebc5cfed852190a9081c069a6b3b83cca2c8741f3d41eda51e083b1676ed960faa4c1405000222234b1bccf1decbb47a12a82232742c3f10340eb6577c2ff4877cf10a0e35a527a503fc43fa155588488af353ea82b78ad1e325e92a07efc84c0c9262c10811bb8548257a81c2704c88516ab59b144b4856266bd788e5587bce44221bf5e21a7afb95e002fd64ece006fb339682d4fe6f9254d6c2d23acb620a9de6ebc5cc769a4d67e6f1e442d1e59d5158305f0ac9aa4a141728b2bddc34c1f83ca5cc8003f93e0fd3e0a83ca4a5f915c68b44fd35b695910e115a583b28b1f40f01d59a02be35700e0e007e84352e65789e888ecd9399ce6c12805cc5278a3418a6a8350d1ba220a602bf4518d2c0990e3a904fd9746825cfa2edb894028383290022ef6851f70a8ecd2a399b64cb83d90f15c7f74b93054169fc2e57fb9912fed1ed51d59b42f6ab144841f01e65626fbb84a0b7fd44e56932ba0246a3115ff19dcc91e7099df6071e2f113f980c5537c2f1453da8830201c75c7812f63b7da4dbbe32b45b5ba3706f9725c14ac441af4d0fc5a3ee04c605c913aa93cd87018f01f1020ee8c1c512eb4f13d1a2f9457ed324719e6b235bc1d842e606a9510f69708ef1ec4c92f93cd96cba094a8f8859ac9657c7cc837952c98d16abc6a96577c71f22a8dc8f850fa20b6d30d447dd193c13e75539d7d799f4dd1511353668100a9307e89fcd1b1f6eb3b7fa15f9395c2fe9c0ea51e0f25dbda44b4d92e71d3f126c7e6b19532679614e6dacec4007e70c507d0d2a01638377a501e6dacc82e2477e21e1e9f1b3ff4c8860d04ca107fb86d9903c6080c323789ed8dae97e09fe6ab0ad924217afec5beb503619b37016af7a73cfed4e331229dbf875752ae05cd66109f2d154951689244e87013ee517f3b61b5b57faadf6e3ba8c1ec847c9b66692c35f466c73aca46dc07fb2ed35844a4940adc0eeb9eb140d255b89d3c33f838da8dda8ded7b38bb91ac3b5957d8680833fa019287024c1e59c2843b5d9c5eb51785cf1211b036115f06852e492fb66da5f1ea05e2134435b392df1ba6dd55301a9dfb743adb09339b0d9468d545c968ff6707efb99e78eccda1fc09b94b65fa8f37f21563242d50541fa744814db6850cbd5ae521966a51055b7c9cea2eaf5c3e4cfc62e6e32f036a3bad416663b9229fedd5553ff8b30049d92bd6020867e5c8705a6f8fef3b7f4804e8d7c84fbb38898b5e992a8012d1e6ae123982a298eebbb0aa11b1ad73cd886bb84879eb412fc69bf28ac0a0924cd271578cb163122920922782fb66552215a009bfa439304844f5b79a6ed43dc6c18478b17e643e4e6025a4b92e3dc647b1e67cc2cd194b53ba4e2126d4cd2dece7851c024a463afdad074b5c410ad2c178eb8965d02bc26900934b42622f3f40d4ce02a2ca84e4418591a5eb75a931d61fd248e3a22dd341db44a5c3350f71d1cb41a77a3b3afbf2858981a526145235a638ea934b0c68dcf252ae78fd4702c98700cb559bf3a76c4e74a7ac557f200bf8a2f5fa73a375d90e7c204c17f13bc5cc02d8d020106601e039cb600b034c80ca5e0445d10191ada4f19f092d8822d57605aed8435d62a0e6e099f8158b3a889500eb1023a8d6d12955cadd1daf42b58a73e2ec80282435863de4850caa63acb52fa11fe67ddef2248af172be08d68d1c7f800a18832cd229136572e6b84f10949ad0208a3e893119e5c0ec248b920e887c0e2c4000feb939b0c6a114e1c236279eaa7a149cca17f12087ed19c103c007e85d8bbeed14a05d1e9aa8c82f46278fe34b663be6883be4c59e75a7a3b419a43318ecbca9af41375fec6acbff5a97e226d6b1140a02e8eefd92eb3a9cf9a75d82268e09336d198932641fb5aba8e9a24c77215e2cb7f732240e5a11b722520235114d10d2d9f0dab4f5b1addb369aa66a0e74189c6f7425421e6afd3813537cdf2b556706c50b5b8d2b680140270c2e7d77ead026254a6c2f85360c05cbd251c3c8f87d8f737e93579280267027c8448a6f4965ef8a5c70d3f629e1e7c8df01701f39eecf3496d21ac4aee72242855169a07113066abf48399c0b03e5da77c8a87bfd25712f47868ee986315350b94273ea99252906db79224cfd47bf0a20e50d9e5a9a53fcff6c919c3d752657b56b126a16a09861fff16347e47aad5e7f9b46d8d99c4af7d8dadd815eec5c6c24e537eb97320646d40209c11819f825b5f8b4cd8e0d8bef517b9ea10be01e7adb7a846baf38640929a1eaf0c53ca10291c5409c4742ff6ef1760ae007b64e5c70c6e2007525cf47254b4b01df3367d00f573e580537deedb0c514e06260bd898d63bff87e496e2162369b7f103e9a10a698a6fab2f1926404515e9508fdbac6a0254f0de78f5b841d291aba3bcf0195b8b889d72ca5c7b12252c949faabb14d78a94e4756b1a8557e8c18c62402f2f928b3540fdf5cac1a3782af2016ddb2c2455ea139258e40ddfd424eae0f36d65b1afc5f3324f2883bf7ad438e3d684cefc73ae1c686392d7b2d4b02f99d908142dfe5d947ee6116c009f3880675a2bd842e7f17e5c2da5e2bc86d594d224852889167e049f921d6f6eddaa3008ccbda49e57645cae8ce8d220721498474af993554fc8d4337a1327086a6ed65b1aab4d4643255dca31d2dafd7bd74cfa4efd5853f5cbe2078350146a9011c7ab288f2be844549963490ed370ab9f74542b28324a7946ef658c140c829c197c7852953bb3671748dd6750c5c04c3ffb3fe3cee64d5d74e6aae7123cb1648b518d22861a04f226831e931601bfca0891b530b4dcdfc5a30133bbb945dea1d11bc5702192320e3327d297f93d8668c50ed6c4647c43f593249053438c58af374edecffef8ebc7cda44238dcd789687825edf47430496951af2f81ebc8651ef322cf4081d73496b2e80ac9c89ce1b2d674c7edc57142e370af33167d2105a8b062688b09533d6e74ac1a3c9c56886d23b51cde1c56321641dfc39cb33505c03eea07e6de2c22b75efbce83e61bd78a535894dc2a27613f437b57e9e05d85a72f4d8ed764534243f7647223717b4e6085d3b7624e673890e85ae1b36675401aac28faaa6482d09e43910451e02033138186def3bdd863c09917f5b76e00ab27a92043f4545df11f11a517aaade7f00a677f4775c68cf089e2d8c5b0699906dc535357f87cd442f7a3ad9b0393c885651d91452961e217ae363a17f6491b629da0aef01cd078ef143bdad18530a99f7d144e0da642067d90ffb4e355811a228921a05e07a750d4b698f3f19db9a9cd25eb228a80d3f6c590a7d313c0817418c6273a7d536a60c45a4364d07367da3638d27284be27530dea3f5f0f7e66ef4831477deef75c2ce94a9a7b672a31ae0f9f91623574227391ec08ddb1d00a601edf510a05b11a8a9b7d6bb7d7160529061947d2fb37fb3de719721fab77a80a8549cf03eb42fd90aa8e97854516791ec07264608b08ace746665192126745a6e16048a5581ad8d1c10bb5d0e584a8b0e9d4dc2d3545e8191655d57a011841b28369d7fbcf741d20070e101f13003d449622090e2ef40d535da16667c730d4a11abb9897f25ef09476dc22e5f91abc22bfae2bb42eff070a77bbfcd87662cd9437c080c7b19221b3b5d5ebdc73e4611864017330c509c6e1afb4284675169deeaefe28754e0634165905a6f44c09f9ed2173081341d8c6da4df60e944483d3ed02114c606faa53b8ca741c2ff7e987da057a9c46bed500d211b5bf12fc88bdba668dc32cdf15b4f50f5c1c3ec12c2680dc33c309593d0a4466cd35860d9a46484fa14cd1dab9b27f454883902b4d2f8de9c96b4e17074f228a9aab5d20acf4af57415c97442d3c6d36660c22641668b0335c602e431940528b7c6c5385fea968735f132e82dfc0684a7ba26043c931f31d6e6b85e2eaef9a064ecd06241dcd2038b6e65683e202f023575cc0e4c6ac4125312ef9062748b889465dcb36d09300dd0cd9cafecb88836fc54a762cec87f18ed5a7a296daabae61d907c8b20c5fdb2ebda4b83708987c16b060e87be5a12f8d33365c390acf92d4af6266134147b8746840bf748ffc9034b002054bf94c9a28663e68ab2d263625b6c074f4626b27c91cb8c81b56d04c98f6500a28d29d9e2a3bce7c6e9fc7649c6d9ca558bc667a04a62449bacbb57a3a47c3939fd6dad9b9409638f4cca13a891c00e1e74060e78a1927732534c583418ea7c16abb2563ddb2ff3d25e311f23baf984130ff888325a30660698e499808b370b412f13fb26c58a0a066a8238c47a4218bd3ec24358b4861c622df20612c2e8a5d081fb0e9a1ac51cf235bc7c495cd5de1b9946d2b284bc5e43ff061106b5dfb6bf1fc313449f27e0734bd82bbee41406f7d6144ee1915ee0aa66c8cbb980b20afb6cea20c51867b033b0bea0e824bd6b9fa5552a827c98b1eaa19beae1767746b29ac2fc9e87a51adc24864cc7065beff63ac16742ce5f3afb656e1206de0c5673b802975130205c73fa982fd59a452292c95aa14572ca77330c479267daa75643c3b1d8466f164bdcec7d8bf2731a369f9626d230c1d863147bbecd32f6b06ec10acc634f8b93b9bd192f75f907f670e90e614379770651b18f351a3e5118890de92e0d8e1828420601371ffd6ce820ad6328cd770322445f2e294d1f41019aa1ae95dc8f2e5d5bb7037b64402b13d0ca085e1503e087cfea9b68fd83990392f11d5312156b1352ac4da080e6d81398c5c000de991d20f8ef0c6528ca6ef1e8070598555e1acf01666806d6b8d1e8fff008b0597687debe4b9cd643cbfa291be989855b022050382a616fe0d3fae97107fb3a038842bc533d92e5b9f7850a8014e53041c710c57700c87a1aadd933c251293c554f0a3e1a449dc0aa4bb11c794a3c2b06506424b35b43b3a87e6c0cb4b6b2f28baa8f517167c4e5e9059b7be6dad86dcd9a2c4954ff8dca1be96b49f0678acd2ffc2cf2610206b5fa646aa47a4949964e85517261b8365c2d3ea60448140dbb1c6d8a185003c7e0b1788a2a916ea1e2a633f41894c6f56e9fa38eda5fec0b0c063fa57b24e11ce895b4a0c6170eeb8ad1d05ee8dcdb8d49df8b2c090b7f8918b6303251559a09356ce21c28e94c984eae122a499c841f314858191b8244a110eb1bb5a46762c8c0ea2370ab8f0964428fb70e07b1ec081c781332125e360a6030f00336f1fc098fce3a50a5fe2dc95616e1465035ae71fd60d0a8614d6fe338aac785d05014195e973265bd69014f24373933969f3997734471c1941c3dc454b75821af0e84e8babed4fc051f2fef5a595083d46faca4acb6e05e9e4559c6cadfd008200a231ef74b8e0062183a92076323a498f9a97148cb1a20044744e67912b7303e2b18245b6dd13a6cf4653a6e2abd498091524cb840c33939b205408b2fb2909c179447550c6d0ab811c42dcf1a1abb0ebabdaaee8cb1c2c7df0dde1bc70ad266eb3efcee42a5db5b9674733c2914d6c8b85023793ef11239383a902009791265990f4f0a229eb0b9559ef42c4878c7eefe2691a684f418350af250625592efa9350fccabca15b04bc2929ea8961f4aa0b3a2229813a96f441ca2546ec0c21f12a203d8c848a314c39a0119e343cca2541d4c5d7d587e4f61969ef36fd5fc12e75ecd40b1fb9b24d0f598a9c20d3cad450cfe89fd7721ddc00e77b0fe20fa56fe0f7ba1c5844a22c90112d53e1bad26e6922c8d1f25c69af59370791fea42947d22c4447d6cacd3d6070cac4d3970a8db89582e8d9113222315218a3a4c0dda1351895ed1a6afd5494fff802235e1a9e6a93d4ee43bf748c8e1fc06bf832746ce9a8785e77f28f89d35a0a527c8c3fa38fd72e161cb3f843d296defe665d35674f06aae4886c54d81dce95be2cf93b1481cc013dce7afa0275f636ec5f3b1b55d9b1e8ac078a696c816ce551a18e6d49acf21533b270427e2cc1698c7aabf4a81fc678de07c9b3d30dbf7608d112eeda3936eae10572d8dbf0ed1421bc8740c51a37e6cb4147ce7fa9958885e9f501df302f57936cbe81c7b501356f7e66138cd85b902043a37fea0d311271b843871bff17054536a7f4b276bfd17434c59bd083e014d4e7013018f2d855aaf4167cf960fcd7512444863020b2b9f160653bac443f7a5ae910563dd2fb104a891e55b3b367178a67d4a756f907faa80bd7cdc20a29eb9744fc2e32341369158cad3c07fab10d89a5b7866cf54acd6d9d3ca54b8c1a02bbb30f9e67ef3ae332ebff659f67be8d063f73ed116d10178dfe360ed17c1d2a52b8e00d6e6565c51dfd0787525b7d79fcbbd5a42c26e3c23d3214f4d01554fb2f3b930a59381517b4c019d3c1524969c904a171ce7ca6e84580d084312e3914441c97b5d9f8c99488bdd969c7c60b91abf0b2958da00884c47dc58f60b150e5bbe7a78b9b5a42b5c6df47106ec72e8b1d10bfe6af91a22e6fe280818f829c2664820b362808687a3bcab6d00eb332a7dbbccf9048f558aaa00f1b1d910ba8ef1b79ae2e1f034f1dfe794e49f51d6a2973e8e6af5f1093f759a70ec10708db1f71ebfacd0a5ad87191f18fb4f85f1bee6933ee0ae880398ea9e4d3cd919124f3da09a61ec23897725ba77b79397bc4ff000cc11f4fdda4c97cdf8af8c23bf2d985e4fb8c49d00dc37c8741be3b5e7eeef3429c44d1faa67471821d87ad402393bdb13de85ef208b144788e4db914f59099902017331b34fa2b324ca927fff4ff35214661641a8996217907d3934cc49247d282bf6ebf088194f1c205c40ee018e9867d6497de4808d7ff268c0b30940168f2b904b13da62202b2d5770a6d55c7040c12df27d91be541933fcd8ffc9a4e0aabda31fa85f6e4c5d56e71a0b973c1102750e7973dde6d00ccd231b83cedc87f81e49317a580d2f742deede56a3534353252705e882696d2226a9305a364b2a96442b1529ca71fa84c1885a193a17fcb32ca56e500bed858c04e51a661ae5d20b15400d66b84ef9f4f5dbd0035c691ac0712df62f9ad7f7a2b1f84c4b96846b00550a9fe5d908106214beb5cdf82d4a4a64414f0691237f3616590e610c4aafe5ff162fadc7ff64024fb07452ff67da75aa09cc4d66d499e882f72ea2826e074ab10f21fc37233f81eb67f1f9855707b4bdd5406e0aa0afbe10b0ea038159b7cb060905baf34b71c16c9b83f8f04a710ca22b7b90e66df179f9f909bc2de0e75ef98bd806fcc7a3c61811cbeb55acd049a78fd8a5c97a9587b8eae69ff1c459a0e449c01008c52fdcb7f8012dd85a8807718d037742e6bf22fd7d5a40e2c8d8bf8ad4c52f0e908df3d0002d36c4009013b0d82284942a496ae8ddc151b2c5d183a451e6a4a7824483ff11ba42f09091c1c53e72015696963b0667ff97a3596f330670e2b251391cd74bd88c487de8c9394a205b7e2a0429456deb9b6e0fc2d8831cd311f90021c30efea16d69ff1b6198c4f2ef9fa1e5ef948f77df711caf462451103c14085c27b7de401556a7ac38e104ab70af2e3b4c92a8f769548f624b04e243e26878f59f025a12dfee721047ce1bd2075c7710dccf4910a5467d8bc27621387345847fd4574ec2d8794f7fa389cb5a6bd03d9bb8b32c8653edefc40951c2adcbf9468f782715570f4ab6942139b6229a3b414504653ffe1ed006343165528ef2b3eab1d64f52f8336af2d2d1ae35385e8b424efafff79c111b48a4fca302a2833bf5bdbce2c6cd8ffa122bd1831e40cb16d650457084351b85673c604193d9af532e336cc9771b7984f0e56ce09cc80920fcb6f5ca51b8ff8503740935c3fc2955b7ec6d1330b6e7ab42d18f25def3d24cb35c726c68ec1cceec6556fc55f841c96d535c4b45c16a02165f077550b103da8ae23abd4d9831306f4cb23b7fda7b88609b0e5c41767f7d76c19fd9d49ad6f23312308b0eaea25ad49a730e23f6e55e45f051b14d95865ee066ee09cd5f5953f24b77718f9b82a2f0c50ad06b6287b7661465b306825a1014655efbfd3c1b6b5e8f18e25bc891331bfd6e757cac54b623a2e11607b9a1b8e5db809668a05afbc5507ffd715795f8afac62fa3eaf5cfdcbaf567e31559fffaeaabada398ab374cd17bbeab380db5b120e34bab9a6ae7ea7d90f795985c779d7104ccc1513cf5cd3ec7edaa78180be462e084ffdedd66766ec3da8d8f52e9855922a0e2684bae91ae5e3ee348f334f30d7b6b746b8eff104acf38c3e7e3ef73ee37ea99129d1bcd625281a1f73dc0438d81e1047feaa83968010002b93330ce383428556ec0fde59c036b0b24ad947f43c5eb99ed35536ee4199ef04a7f83953d3d8b97970a8f779cb4d0c4fdf2003095bb1af4237a9241d5e9f465bd2a6bdb7d3c668453549101f08cef61e4e48f6939501a6234a34f4c30073327a494ca6af763bcfc8fd404c5abbfca94743888233bb7fea6caa2f956f374fd1150abd835e7886d3c3c5d75c5d1469f19ad8ffcb0c9736d65f821a940ccecb5097d57de81f977d86a1337b50f564857b2f425eceae54969afd65a444f2d8da35994ecdea1283723f0545c35621bf84ed2c09aaf5f101d5af78c4f4c19064109ac31cd2f5a16cb6fe754b40c60603b6e94e8fcae7d6a963539c1280c2a5d257c6456bf801a9be0b2c29fa7e9b7715e4175f112e6199db4d772e5cbd1f75b9500ec896e0234054657ceba6a881a71b68235a13490ae5e95160670c8f7f9a3f7d6f9243ffb5fc8f583dfdc33dc6a5bfc95d2badc877003d7c03a097ef01ebc15bfe43c33a691f5fdd301c0bbadf3f691538bb2268ffcc2b4977a505fc9f1c5f9eb9b9bf07e61a795b976454dc6f8c5552c28575438f8623db9b340a0a89e06aee0077c055b0d19f1d37e4967d1b78b2f360ee09c3c1a98f75d56f7023b3d36e980a64d52f10ecf1926473210a0e518bd1062bc3d9d77b08ea586a83602672ebeead332c79ac5473565cc6d90170a3ed113d4136b236029d79e0b9a3f1fc9c750405b9c0c35e965454e338b59f8ebd7c0bb8200f049c741c641ea4f10993e933972bb35164d3df8c14a941f66816b720e6841c077d013b778836485fb17420c262599ffedd9609b60a965eae08a74663e2426bd4221ae942d4890348cde36ab32e8d6e084d091ca3838c25a05e9b87e1237fe6923c1897e0a72e0295d119d0c075641bff1f4be5672e460493d9975c0d29af4bdeb81143b6f9aa3afec080f450453b56d258b64bbba8464a6f10f018bf54c240280ae5e17cc666ce299f00663fca0884be1341ca19e0acc43d3dd0cff2ff65edf444d3cd39636ab9919de3d63f6c84de8fb09fab234313bf1c61f3d00760dd624c2ef553bf3599c32b53637a4706b23b0608990ec903a91295e90e9a132c4e279c9724cf53ceac9c88c8730405341e71a81e09c062cc87cdf848f2e1afe87c1f92468646965118b4b0178c8bc8e9b208811fa020959bd72aec7c3a9b68e011d50598528796e11d4d8cf12df55e1ab8badca422503caec6605b401744d6728a28a058d07eb768ebadec0333e0defaad3990f101166d661bb89852437856b4867cef095f87710ae11f0516d64ba14eec962f43904256c622bb727ddb258c43b4b55998243a9f52901d27e72d328d10aa5c7f990b8cf87f41596bd7fc6f4a085470078d79a15200d42a7a922f1a87ead1cc6744ba4832ef9f72376d76f15ebe5118220fea9c9643ce9acd562f0477c2681ae420b1c048dcea7264cec6279205fd52df69ed8ee64392395def052343e2ff40e4c748790685edbe8806d484a86ec2c61c85a18f0ee15b4ccc26dbe9eb032b70c7a0b2a26cddc90c9d9e3f02775f5dbef993f2cadf676c1fd921878655613609defc0c834cf94de609611004fab03861503a58fd2f4f678b7012336de1254561de1b28a2d2e9129672a9294594adca5c6221336c295b2d544b2191e192785bb3b02ef56a2a191b231ff871a48b1a841764e8dbe8e162fc1f322a4a6e2fdd7bde7e7baa4609e19eca1450030c521d52f87c2652556ae9eb0b1a447cd78b36c6d4381f0eebf2a63a9974e2b3bd137386119e00a5cc9fcb6ef8cbbd436501cbf32127aae860d76d477aae22020f5f9085347f980602582257d90e1cb44c5d9a6a5ad9cc3a579426c78ec6c13de1683845a1645c52f93388bdbb632602ee3cc7250c44ddd1f1c8cb4d12417238cc2d65089dbc1f5988503c092317e5b45f8ffe22ceae679f7308022999de1f318d996218cc31d201755466173ced0fb76ccde28bad462431938ebb746d22546043c783f9ed083dc4752f28e50d1cc66e83fc46f01b6a1428300a4d9c1c35ade5013bf803bc96d45896265aa5069055e3f4709011b829581301d8da3523b200242deba892af796e523ac412731f1be480f54ca61be9000891793dedca383272871dd2d0faf78c9839319894a5318e213d717e5157746402552fe7b2bc61d413a3fd29e67f170ac3e78a07402d4bd9aefb474e324c9c20ff33392a6b7a0be3167ee603a1816518d08644ad92a852eeab4154f3f1c31c292d80c1d7f4574ebf672f39886f2815a509125867ac8eb28f0dc98214cd3657c621ded7937a616cbf504c5ba033e7e4cc8778dd011073cd717174d1b3f6081416ae150b8e1e8273e1a61a46d4fc3067921145f5cb19b7a635f69eb8c0fad0a85a30d29861021bd51799619f7120844ced40b34eda033c0590bcdb0236db33c72f8e70e20e2fa30b399e30e3f526008cef6e54f00e22da4050087215c8f624fde6f15d65091e249c89abc8df488a1168160fc75d40954e14587ea13cc7d79bf10eb4a99720081c8e5cf91faf5dc464e4a5a1ce3e82b02a3ca9e8a1aae28b2db3d1206e03b2592934dc17f8e27bc1382aa7b17195a17f1aa11d33028ff11e2f242bec62ca9d59653b5ab480ccfbcc66b29867c0b22ad4a8f14cc50740095cb58461419a68459a8174dccd672ba0323d087c0ba4467901ab4eb584bbfdf3ba103d9fe15ba8fedbf8edbf0441ccb75d30bd2e3f8fa3732d57f4df76cb2fa17634b9dd5ec25ca79283da8a65f651505bbe23b2143157f00bfb0fd21c082380937ab2b0396fa925b1af4d8202a3d41b7b2bd07347f2f8530f8ca85bc74f7f6fd6148677a6c6aa0b27d91520afc707c8610fb85be92fc02c6db7dfff1f4fde4de2570b5d2079a9fb679f016f5c32af3dbcb6e40bfbed0a020e7ee00f540f5fbbd583b7cf5ede8adba36303b87f7d04d137d853d82e2787b9066fa7c1cf8d70f0af3fba80d3a7bedd03b321fe5f0e93c1f66bbbb671baac12d4d7ed0950d91a3945e39888d6586ec45ebe2da94098e7d7449a88e4a00723068d0dad59c64c651b7b3ba11f10a2c777962ff0c26bbec834bd6fd00622d37fc00a80a0bf412fcdce4aecf64c30a441bc947ec5435074e4f457c4703748dde6dd42825325b26fc1f4e9a5523067ea68ed059b855c694e541cf91f01578c8a512b6b01e9bbf2564ac3ffd8abe673ccd40982fe12781cb197d101dc90510a6a3ffec9ea6f4f29fdbfc5f0c646011946ac01e98abe3250b344fa012d9def2e09cc784fd0278e3dde028ae37efc1ea49a458cd57c70e687d2fdf586cfe313e8b18ff484c27df09f836d9e5d2adb5f25ffbfcb23f4d228c029c1a6ffe8d5820afe5f8335ed958b75e80b959af5138c30dabbb3a9d1b73c4365cc7d127442940f4f05c3ed6e4e2f34daed8af96749b3bfae070730aaf54a64987d2a17f228e6cabce874f13992d10e1a4a01613d52fdec94f6389f234feb71ba4b08a4671575f15482ef2e84f0961053dfb3fd4c77b83bdb0e3cccb6b3a24b7a700d8873dffb39eb982add1400b64d4a6797a997a1ccf4c57caaf610f3b5f55633bcb09933025a1f42be5eb6667cde4a6cb8d75ef38d67ba42722ac95baa43147cd26f668a5cd68d8c0d6a9a5c584cc4d0cb20ffc97a3bdbfb5404181cb2a09ef43a506bc38159096bdf643f2cb88f3e24768d89230fcf7ba1f8b19a97f681407ba9623532f37e2552827803fbfa0cc6118f9651e273ab123809ead2524505290e3e076baba8d858501f1bde4a6fd1bedc58335847d994bca549253bce94483b3dd6e6c47d5a8b4dd82cec5ba9cbc725308e43038085def0167acc10c0c46e9f59dc242f7a475b97a489af42cff780fcd0ba97af82368f51842baa58e90a1556a828d27dc3dfdf2d7d2bba19d74cab5d95c21a563c9657f1823a183addd797e24d366fda78e34d366fb069a35d86bb9d9be95d583d07126d4d608117ca5704501c98b2ec46e886322bcc9cd0749cdecba2f9ea353bbaf4fdbbfa87f480ae9a4abdd2d00103d97575c3f9941f1d3f6a2fb974637a886786013f00ecd05414ca28c2f4dfb1a8f7bde9aca187dc382b3e9fbf8dc0a04be18a5c259a9862d543c360b2d3056ec5213f7019abdb64a2e3258a71b5d9b4aa852827af2a0a05b256d0e9785d3f26cc403a3384f4ff1d786e2a7a5fdea39b48082c54de7d04406340509642782a0bdf779e3f62a1fe807359650c7efc15f435e498a97ef079e5283f3848250e1863f4f835741152474b1b47e88295a160772105f672eb22e596b8d2f0d57dc2c125063424d7605f6e35587b5027a5eefa0e3c788e4167d6348b6c65cfb3a30d69057fe4f94554b83a61a4da56e8af1067683e651e6fec5e8df72366922a1d46a442dcad436732d2425d46ba5bee187dc2e177c0093414f95c0b53b9d625e6376581e5b523be7b66787f026abb4f4c3b0968dec8acdbea8a79eb47fb26bad3f46f9406adbb625c7253f0b5c3c968a716eac509fb9e7992a8d0d2f8bb2d3d5ac25254316d9df37e62c9a78926b1c1fb2391be4c112bd89b88f966244ea0978ef3654e7c483f8deec968aa43dce45b07e09000fe452d93d6767c7c65469b1192615a504ada380734a1406fe80d2741862d0c83e40264a096915c98352dd3b5bfcde75e71c6d380c659423d94315f86163bac6fc4f833323678df887b65324eb8d710f1cc645cc8f4bc008ded5881e2e6c2b8c725051bd55983dae6c23d741fb28d1ac02570c8676b7993a71c991af772cd740bed15bf19c8010596b49b4b62f9256acbc1929daadc23ebfa8900f31e92399898603d9e07ded79122bb7632a4469c830630332417b1694708e75f1ec0d38c5cb211cce66e8e3cc988c6d8344906a91127de68461ee91196a502b094674898b344eabdde3d72ccdc1e158c48186618a4487126d977bf72b279c9277cdf7db5a503ed9056cd68b82fa829ebc16f0e1688a0d7f1ae7920f65820e9b52664a636545b6004d34020d217864ce9eddd86c628c117d560b2fc28844ea798644170e86f26bfc41ba355bfd681e6a93b464e4f6dcdce7e256b6b0615bf5d59976485e04729fbef8404af5cb34d4242e8e4e59e420245d5c0220cf23926004ab77329490a026bee31b5a5f795a4e065a9787825b7a6ff9289766784ee5772d5a8a397b10af3d3637b74ab04aa7fbc53a0423c0316811d70c4ec9346aab6ea7ec5a64e0ba331f3241f2f0d1c07ccae0dce0dceee5b62e364e80d5528cb6e07ad536ebd0fffb48c4d5fe9ec20139ba9f377484d13992755b3a2feb9aeb96645fadfd57960c61b114437416767dac22f06036c05d748a77a7e575b79e44ebed122f5de53923707e3c95813ac9fcb095f61d9bf279753563cb33003e5c2500234d498e1e27dec881ccd8daed73b6f66a1181da293bbcadc19a6a042c64fcd20e3941318935b0d629a23264d2361e58937270643897884dbac881233078b1e1975104807d56ecc34214319ab12012b9faeb481850d85610713aa650889191f53b82026b3b8aa5b4d7cc5fae80531b4ebbf8a028d25f353a6c01a59ec8e2e32a6bd637586948a6a0ec30cdf934c44bc3221884e43842b8a88941247fa778d9e13895a7cc7d332aea6154ac15b60ebd67210f0ee6b9713f5710111b11797b2ccc20dd24a6e1078951980366ba2904217d56ace8645a88cb27c2082cce55859f2a2ff1586bb130e385c97bf2570a06cba5363495c9e4a8e28be3014b35fa80f6839011b262f5652bcb45130c6a31b4e0c45dc22326d0a46e953feac4f0d91846e8897cdce48bca2300518ed853b972b27c6c3a26bb5a932f722266250727dcce679443cd566621c335d994c4d1edafa629b5c294ca79c2c654571aaf79e05ade450af4f0136f8d6f35853efedcacdb63aa4bda18a8500c33e7b1bbdd36eb28af3313e0df1bb3403c990ea7eb97d026c3b478a8c49b86a618f64c9182cd5263299c8d3bbc0ba9e2f77e5012be6773248713ce80d6ed5d698fb4bd2c3cee0b7a7a89730a001ab2dabae30c4cb2205541204e8103880ecc88aefbdfdb3c09e4675051b5e3980afd323124083e0f07a487fdf32bbab0908e0e6f4207d163c58d202eea07a0542d92556b1d06b74893448f911ce51f69caf3ca89269e50268cf0ca5625fd095526a56ceb7bc5ea1deebcc2836f0f8f581548794085da2080eb6572608ef06e57a2beb61221bbd0cadc2e2c28604398c27fe575481ec44ba246e70773048f26b45bcfea8cdd5739ca94a60ae44d8e901a3fec48ce0308aa911bd8580fb16933a0f8b2efe2a8d71b081afe87537ba14b396c878b979b7ca59752bc923dbfe88aca3422279cc2901a148207bb2c74ef685747fcf0db463af0ccb5529e52fb126f1dfc658343800ed90bae57e9833dcef92106a01d6328443fd8aebd6156230081d2601d7049aca04b45a15982b77d859f3df3b611cce33d2889c616ccf884fbf4c8872a8a02e100a5045bccb5bfe8dd8f5a8ff9d6f27d091dea0be08b52de05b38804f38823bdf08d0b2aae0110e655c6ec4f2fdef91e62cf0441830d080631e23203e14d1a8bcc389b44976840740d791b8c050abd5353cdfc03cca502ccdcd99e97df6c4a1802d9e5b86f09026549d32de9ff0e4e8ced50be62bd00dfa997f9f6fc4651553f31f092e6984955345fc4e6d7672807c678c83e30bc585b584bd91b20e8246dd8d209977f890476330e394fa37f17a9225ef230a122db6d090cb4ce0b0f0cb7354434bf9db12573b8447b37f78e85de671298173ff92397a66508ec199a3e6da65a41c1fbe8281aab723e239013c6188b381ba9c97fcc3835c9c7ef2a0c1178c996b9606e3804b7712c65b7277f45f51ba0e089e48ba403bcb628c3160188edbefccc06388502431c8bd4a162a952cb9c2492169ef6b7fc833ac0972c6ede4424f45334d0e4d655d4cb94c7ef120805b0542ce38da843233e7c7f4b50a7fcdc10ea2d9c7dbfe67b293dc1ba6aa58ad78cc508fb8f9185f196b89d9f946f6af15a28f0dabdc8c2071574d93ace0026637b8dd69f2660b661cf011d163c919611478e25bce468598871e710e2d0943bf026cef3c162b1eea2dd09c1fa368dba2971949b94a6319b9d660d6c20cd511e6b1f6acc95fb4a40196badab8d5fb2644449ed3b9f3241e17083512a0ef0e8975313c99b9a3f901de5e068495255651ffb2a482c94f8ff9dadc7e1370c7b474d18d6fdb45499f51b92b6ea2d9c32a0806b5c85f866b8b161bd32fef25952a028e76d4065d319d4f79060635115c23175114967301f3c4223738a1d9eb76426830d1ce4017dd784c05fdaeb0a0a3c9aa2b59bb35463712c0a19b86f1c67b3be96b9ad2852d93c0ef01eb2d1e0b288e24b712ab05bf9590a18b19af8148972c9a7ffa5c84e281eba35fb669d1945db6c5fbb3e7ff1145ddf9b91b307d62aa06cee0b31c96431c72114d41d727f53e8c9ee14159e5237eeef9911b3cc6118cfa8dc247413ca7d7106c609fd1a4e8cd3f3d6d45b4f50ce54b2e2ad8eb8b0fa42e2be62d9c83fb528b85cf3ff85fe6acc8ce997bc05628439275bf453d25c965cea3d86ca15ea7b93ca53548e3a32f894c713c79485914498c78076c6a24de92349eee3cc195405d8f16b2891ca5634b12ff1290c30942a3c869bffd830a21ac3fad70122d9347a745313d98cf77e59a74e90b96316a169134c9c27726051a8bc212ce09a23bfcb3b7e1f29c50aca74aa9401b940f26190563b329c6b1210d31930598c4811b5ab5d01bf7aa9931dbcc10f6c2c95a402da59d69e5746efa5db42bf85039c3f128ce8cabb4c323a2a2b0cf652d93a237398bc7e9b9b836885b1eb28e44dc336408d13dca7ba3366d415183fab3cfd6f98b85ad218ce15874580df99aba9072b606171b63ff295bce6d1ae24b4e5ceb45d4c5b413bc182b11d7c3111863b40e29ee0f0c7cec30dd09d9048abbc28572e1ea55e025d958cec6a1f01755ac1acad15c8d99666b86acc28b5eb2e59fddfaee4c4bb997505bb8c50216eb0c2a0be1f2dc4e89681b57fc4f37afc0e546c9b108c06948562dc154cb2823a8bef68de5adfa1e9609916995b8239bb1c86a1d83535219c803df602ae705585d49689162e002b1063506264fb0eac21951d4a13a3516634911bba3c8169812a90b4e588c80b45059b1585a03766c2263ceddac93d61055288a55b56ed62a55a257b7112bc73d456cfb567457cedf503183a80b23dbfec94a937d4f12f794af344d19c1138f62faf1a28633e829043c604a0a16fa549121daec4516c8c48be1e777ca7e38c2b2c9246e0945f5912b84c9f261f99ae3407cf6c038ba1a08eaba62dd581e0d6ace98d9e7f91726bcea577ee67633220340281fd77712cbe4bf4bea43b95eacb21430efecba1c64fd5226a8e8f05ea9952a263df9f1d263dc182740c1a99fc45f2dc04dfda79be0a1b61594cc4242c23151285fa985fead31642eb2a1f135014ce2f5d5e1a99f6916229b31117cd2aca3302eebd06b44cfc915ec66d2083b15905fe1265475e80eddbf37c94491263566cf86534364210f21b14c98232e76c10316ad419dccbf0c743c56eae8ed96446fa9c083ce585a87b508beec83d8c88ee590e0e099ee96e692ece74adb23180faa1fcbe258fe4fb44e2f56d97e67f842a087a6addccb5d391ab192e568c6dc96a3b6ea6e950af8f5d4de38dc0d91a770c820e77a9ce021908a13ea2a37c25dc6a2c6e63f41974c88f41f1f819a42c31223994430f9c8963501bd261f0051083fa140fe7ba0292db1039009328c884c3d460c0e403b7e02945676cfb583943625aa65d9f0865f3ba470167a06aa16baf6d160584b40c092e4e02b7daa6e3f36c73624170c2de079db72e64fc03f4fbc0e69228f29ae0b6bd26950b1d36e2b066b0f0860679e72d3f933beb649199a74d2c63e4f0c5d36739205fa927620eb95c88c7bd10187d2d634aa015aecd49df36b27d700ece49930b0cb9f30a29a9aa6445acc9e6c4df0e5d7f7141cce7470c65ba95073f7d7bffdf4595694a44d1a6047f25a937a5279c3238a93a5454d33b96117945c2ff4b1675626bd95fac06d77fd786dae6e70c96a26598884cc9bcdd0ef873dd4e1c26846d55c36564c6997484f4f99c056e03bdb0b97fa36c37928ce9f8ab2d34a2a6ed9f12594a99ff836851ceca23b7fa52bddb27c55e625b4903e307b174483b584c534cb4fb6afc68ad5737489c2a40ca51046505a6dca6d7cac963e9f6325900e064bf10290a3a2a7d7777af09aed3aeef55de72da69bd30f5e8752a7a86cd0a9e6d1b8508978b8671d58ea1a34c7fb1ce8aac34b8a67cbd340d03352f7118ee9af107c49cdc142db5aa011d7cadebb6c46365be5e95250f89eb08185d2bdebe2320e366be5169aab1926fe1893c963ec5068f9f142974187a527bf82d42e4bf15d2b5ec5b1797705fe1ec18571f9a9554553ba832647c77b36c652d5bbfbcdc593d8be58b30f0e7d64844fc402c470a4d73f2cfe91756a63e2e69e4ecb567413f89af9fc92e49db40941dee2779bee02e4c5a18f8ea5b706455ab78bfd67fb83ea60b093f4af028630c1881247f9d2e931100ff858859dcdc76e5cbbc1f5a13c346ec7a4cd6648d9d9d0e054e56e3e1651902d2d78b6dea7925946912548568ff687594c242474eb26a6d3ab1ab04c65270f1bec7e88fa8973c9963f54be12014e5045803e243d57bd5717b92d15a0e211c1c755f076e32da260700fce8dfb2952d05bee36592ce32098a8bd849e5b98a3dc0e7ab7292d7ee2b175ab27f7d25e98d20df28a5da2a8c7e6b67eacf7599e93b2ad471a022a4f2b150a1d8edda0b4f8a0ea00217f3404f838489a981c1c664aea258f1a37bdbaa1bdbcacfaa0e12cd72bfdc99a9f8099b0bafad0d8cffaf095732f4c6c2a03aa4176725f50d219a70dea4cd4bbd6b46bdec4b74c9cc7ccf26f3da0dcb03a656cfcb17c6f7f8da8a12e143f602dbb9617f2496e53600da0572cb681011c4638409cc501dc8f4aaaadf7dddbd97e5c87b4d8482693c8613d30df3621442491c8eeeeee1d5907cb06fc06958984a1cf848990d093275028a5749766d0ddea8cbad579d9128fa98af17f4a32e88eb9fa93d65a5fafaa52596bedeb75efbd779b1fc6189752bacf9452b0631e8bbd5e51155530a89b304b290d6b601a749b349bcf9b148c91345660323289ec98638c31965bfe4c9516254b16b25451895a5b159549ed8431300673fb349016905ffb1b59cb4e70426bdc966ed0273891d1cad16c5acb7d821335308d18de5d8b9873ce39e79c734ed29cdbce39e7bdf75ed2fd1afbf2af9473524a6badd55a6bedbdf7defbf3235992158bbd5ea51ab60969acacd0d87be7dd7a686d6a215ff0b40161240c0a2990e4a3003d0fa6908234bd0d2823008f77c86333f85c5e7eadad8141d306da8f34b1f0790363cc027069ebcaae99ff3335066384e0c410a03c41042886a228821451a6a0a25671b3011966d041430d36a47670a003381e803172266ecb03c6c89f89f6865a63b0c6aa4f9216ff44468972d7588dc58e9879ad8006544091c41042843459628225401845ca83ee158b40091325493804526244898b4320253a404a765012021eab4e8e1f5ac90c4a70e2033d018aa2640616e00c287ba843465043adb5562837e02121a051871690c0033d60a01f4062a083e81d7a0a0da4d201e403270192c4c796e4956408ac15c98f243ff75e8c933849b204e826c9d006a46200c7f225891c2fef1a052420f00187899c25949460c8135aa5059a078d24c8061dcac48f1cfb840c5aab14d1e2349830000e7fd3259440e9bc9f8efbf66dfd6ca19451b27413ce2800872f3c7234233e9f7e959bd9228d1b9626180e25a7bb4360cad943862f360c1268ed86a3a1d9e7cab1f03261e0e558e0b8cad16ccf6d74f39e46e31c0a1386bebd17db9aef8623c7829c70ce3967f7db77b6db18c6d4ed723411c6dc194a1fdf2dc39ba6651a950d46a9d14dbed0dff6c6d140f8d2e10b7cb8691c0da5302667dc461fffc6b140ff33b7656e0130f0334773e1b66ddb1625eeb6c71a8c5af7deee36df76bf00e7f686c1d2359a84285015b410abd83fab3c818810e210e8c709d0cf900522efda8f47042b8a406f60850563dc57d1da06f8fcfb793f3066d69ae915561c916a54c1a30da982fcfb7743ee61fa799ad63298e1bba3fd08e50deff6492adcc78f770def24156aee432ea594313b458612c99118a39448842039024910d5a1085611ab22525c16b10122a0d41b0e7f70b42de24947a11f001a813cd0e7c523409a7a8b0cf8f05584f0ded2f282778ce407943424d181e4091304f00080329a00b119ea0f862c418fc84018b284db406b9da187ff17486c808408ef6f028e02f40383d1048c26603401a309184dc068024613309a80d104f7f27eaad6de779f3b183fe8c83d1bab9b0acf5efe4853fc6c771fb9996ebfb89149c382472331168fa51dba6b2c1d1823d6e7ea6ff5737dad7ea6c5eac2b3dfbefc695ff782f4ccc80592e18bcee286cbba298c0fe809cc16af897f024cf7fa5a899f65e1b2f3329d6959ceb2acf34147de752f4362ad3da9ed6c47decabeee106b0fccbd308eb9f0aeb31597f865488cb1d6d385c7ef2e1d6bd5f70a9d22baaff86171f92b7e380bc7aad97af1be22886671930de1f5c2e70b11e34f6dc108626f706f5c90122022a888263a4108a1ca76f89ce76877fa1c8df7f4cb94fedcbb6b9c1685cf4f79c2e777dd4a0acbf62a2b3a6e155f7b265c7b16a0217cf8fc94e9d9a0afd168cfe53db9046ceffda41ac77dfd859f15b89f9be4fd7cede947f23e3f25799b86f6f9f36baf3f4ffdf5ac6d2f435251cdf6deae61796ddb2c3558f64a8aca8a2ea5ebba2e6bcf791ae573ce394fa0e72442844fce86c6339d23fd596b1a7a771bcefd7c5d5b5af4de479f13e9e738ee35a7ad90f13c1f72136888218470ede7e49e7edc53fa32a6f761a07bfb79d7ccd73e722abcf0c3452fdafa399a9f5eedb37c176c38fd9c61fef9f5173e182fd0f37b6df1c965386a8bfb7a0c79f718b8f69002b10bb05ef89153c840058f0fa790610a1e57b8cd4af4929cb0021bf0233b84509222c2084aa03d13d4a0ed9017e828728407478420840c427040881e42e41ce17124e70890233f1c61c19122476e70e4e708d01123ac4f106a983e4fa424087ca63822c30c4768e05d3f55c287c80cd327063ba40f8fca0756830ef571e2b3032268d0943e8410c2ff70bc4c95990dc67b67d763e0f55d2e8d54485105cf413f721932c2ac70fa595a3b2dedea5b3865a07dccd118007719f1174eff7e107f54c2c869e7b4764648695737a9866500a71b93780860a05bda47888fcf4d8c514a9f1f3e3e208c31820a7da37be81c0461069b0327662bf3ae41102588246e4e8093439643c50d470cd5408ba0c885d59e283a1071e083aae0a087aa43af74e61008073f746cc7f1e2041bf407b40e3a47ab34edf9a1ff2f7a8c9830ea614cf7c49846d2f990d2ecc528254d8db837961288949426926a503a63c8f4b34729a595c482ada41af3e5d3ccc05e5aa73665926aef84314a3927a5b53a605e8a6b66b59ca78cb96656bb196f37e32de3b42ee3b42eebec6d9a13752933fe8c108ae2a77840e617254bbec487320425c66324c98f111e23afe823aa64fc3985aa03e44bfc3a38fdfc7281f1173b38fdac43629a7de41f4088d0afaf29236750fb6dbb62713a23fd17b16d0a4d398ee3a8673def7ad9735e1551ca51141051cae7ec79dc8bbc17b53053a8c8137157b7f4d76ad147e5a0725039a81c6aa578f1d88343201e08811df2ac725b7bdc7b9ee771ef79dc7bfaabe9f6f1c7c0b94e3977390e7bd6d6bb71cf795a7b5a73ffd5740f797c91e7719fe27d0aa7f5cb90229d92c2c9a43c9c322b545eb4aff6768f29af92f22b5244dc8f2ed59df79e97e23a4e85ccb5dded674f925f37f5e46562ce393b595fa256a8152aa793524301e9b66dd3bedbbe6b617ab243ad5ab3255bdcd76ac947e5a0725039a89cdab2aea0287c001c0205fd6476ce396b62e0b156ae3eb7e14e79a6cd8de336ae9f7ed4e4875bb76dda7bdb7bdae7903cb630391703afb1f1deee27958cd789bef33afde5a0b6bbb0fdd671e0f9f93bf188253cde9dab2e90cdce53ea8473c239a97a0e7a5329f9b94be5d868ce39ef9e838e4a52ececed73dc963d6de7a0f7c4a385c63879da99e79c734e8ca9bc57deae011953cefa9047f990ca1fbccfcf215b983cd2fbf0e1dd41120e8343a01db078f0e3f200670742f7da0fdb1fd5c82c6b7b779b7b51392d341182f845adeaaca855865ab55adacdb289ca41e5a07282a2c8f045d7543cd39988e526e72985bf1ac821576346b9fb09529e43f6b8e17c2458bcf464072a249cf03c39f948c0b800380442a2c5b3dc2c37233f729b8adcfd7e9677aae7f71ebffe7e7bd1de6a8a77ddde76af5ef695a0d077e7a0fc6ebbcbc0f2c65153fcdaef3635daa69f65f3e7ac3f774dfcfbf66fe6756e9555a5c4d3eba4e22a2c5eebaafe90a6fbd6e6b756e56d5559edcb5efb78eb8e89638cf84fa9134ec42f63e2af9f7e705fcdf631f088bd689fc3cff9e03cd18987c7fd86536c8876977cfb94dd25e7fea4e2f663dc31c628770df7db5bbbb56b1f5ffbf8f4a3467e0cdc7ef2be165fdbb09f7cf08b6d74c9e5c7abfde5bee3dd4f2a7e3f87c418ef9e83762c1f7fbff4f1c41863f94baa68b38ff7db4ddaea8e156ac43fa54e3811651f5b6bfb49c535cdd1a4bcdd35299a4dd1b0a6ed940e73f8bb8703c6767bf1cc6d1cf7d9a79cfbacdda43de1702c638abe2edecf3e8d7e2a0f4f29f972b51ebc06e55875a449bf0b0f871ebc3ae1b57e8cd9771919275ceece65dcf7138f88d25626885bede3a82405b76bb4b8027e0d47dca4cc42180ebc76cd09fe9b83f2c8bdf75d06c6b75d8242e3a8a99a7a95eded2e03e3f16bb8bd2de13a2ed5bd18af7fe2b17dfe532abfe566f249c5359b716bedf30cef138f58c2b52aac4eae0cbdf8fccc3dfddaaa43aa4b9aeed3af44287c1f7ce3f62d0f1326dc001c023101720414fec221d0113e9c890e9e797ed48a67cd7b88adad2dd25a948ffcb17e0ef975c95bded669a79d765a6b5b5a56a0dff232649ca11ba5ba7fdf7eb5a592a22547a3b6e4eed8eeaee3ee2d38adadacb90d0c12a542f9902820bc46832d52a2f2a37c64d40f2b5b5a503911254d23d2d316d2ee9267d48a5b4d53a80a65a15f77909e6eed21a78266f3f67076dfe24740a9503ea444ad72cb6b98c5ca082fa25f1f5b4963bf46ee1e6d6cdcbe568dd0a2dbe845f1b4a07c70fb95f4713ffa32fe11be16dff6a9502af952e7b3d81db368417ac59e7a77173e61396f35555fd284caa9b6d6e8bde4682cf75ad094d12a2d28a7b8575bbc867efcfb90b311bd4dba9fbfbe6a3e7ee12ef3b52b654b50e8ef5f3f7beeab291893bfc6dad878fe97295377c01be0a05d7c3e2a27a2b27dedb347a9266ac5b1b5d6a2726209a3c82208264001eb8106b01f602c2802ac072c0786c3922196e800264304a600c20e4140c941550405508460c9103ac84d4c88baf2e03201ca92d7e51068090f0f254f94c49440a1848a253a967060c90d3bfe5f2c593dd12c18638c914ea809694f34285a94ac23e3641ff2479a5870f85a907c919f575825f184333e0bd72c20f29c94054daaa8685de78c97866e4aeb678f7403ffd5b2faa4f8357bd657d1583b25b7d43e7d1a5be78c71ee976f632dcddcd6868c73aef6f1bd39df7baf8449134bc986120d1a93bcafe93ebfb74b51e86ee717ec454f4aeff3dcba6fcee9514aa9f7b96edd576badd5fb6cb7eeb3d65a6bbdcf77ebbe128ede3eabac58ecf58aaafb1d06dddbed128ec67fb9cf5aa6f136a906e6dd63deedee02e73e6f528dee02d7de86d7e83e3f4db75bf76d78e4f243aedba4eebd27e5b7e1de76a1db3456b8bde1f7f3a6b1d2678bbe8c693b0c3f1cc7cc397543f8a2e717a5252874b72b4e2d0f1367b2a48c55fddc014d96255fa894c92c10104218d594c9ad09c39226ab63798026fb037ca1f47365fdf0f4ad0efd03581dfa3ad2345340581d4eebecc0ee73a636fd790394c99eced4e555fe04927e7405fa4b50f4ffbffc1a24f422bf0274d0b0d1b07d554d98fc34207c79c9dc022084d11bb725578281de368986a570ce39eb6fbbfbedf3b66ddb961f76dbd7cff2ea92a65e5b7cb37ccbb605ce7bfbf2d7d6d4e0c4b7b6667e995fcb9fe5c7f9eff7cad1b09ccb5ba6413fefea922ff1730ac6b89fcb8e9a22c2e3cfcf4e915d88bc54a45444ce39592c4a69adb55a6bad2d15b9454a4562b1521129f107542dd8d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9f96da35157a3fe82934e7ffdb69aac6bad4ff7ee70fb20efa0467f459e5bf4565841b95f792c5fa697bfe6fcd99c9f05fd15a2a73ad3c42a3adae5177d7d4b00f7fa27973bba75a2afbfe06485eee926e9fa91f46f5f497ad310fd96e99639eef3aee15eef1a16cf6d2a5fe8b3c82c58567cfdbca2e2adf0bccddb72d6dd6f9fbd2debac6d581fa1e9774cf36bdad739127d1689441f391af4455abfdeba059f29afbffadd26faaea3e95eb47b5df16e456bd6362de7bae2b5b7a85ff77525f2687ec1094ff994dd71d4d5f6e9afabdb57fdc9bc7db9e777c186d7dfe8d75f70521aa229ede8d771d455476388deeaaa022e0e2ff0f3829e93034a2cc1e36a724009256a6bc9145209ddc47a10eb4190975d88799780f04a40948ef8e9c18fe751ca6d8efbbca77aa60484a6d4ebc1ab04042d015102a2a3a2e42ab9a0f4825210241a229512cb18358df1a9add53e0ddd76d7148f514e5a6ba5f69654a0e54f15d06089bf3e0d262172d993eadbf06cbb80370d1278e45a92d3d99a9c52daa29cd65a5b95536badb578a6d4a2b99c965a5afe0c0a8ac55a7af71a1a12b82581d34e5b1a89120a9a24e104e010280917cf1e94a6fa91525cefdc309660ed4cad58ee4819b38479dbd9d76b2b6f9fe8bba741931620faee6f88b4f6dee748a9ac785a4d03f9f6974b01f2edd6df6a701b967cd0f2a78c89a3b6a4cd7caf9bf363a0369a9c4d32f54a299894d65aabb5d6de7bef2da5a094022ae7d76ddf564a279573d3d68db556914aaa3d3da94e2afad9ee32419cde4b774ca552a913ce2975e2014487f5692a6dc5eb4ef5903af1e82195c251e15615426e450a33805ae58c5ac9977b6394a2ee58827cfaa17c70fa36a2726209740bf1aa05c9975a3a81963fa9cd8461d71666b5b674022dbf435e71c561f52376aa540e7904ba57166bca682ecdc5d25c2ccdc51281e6d288682fcd883459cd47fb91a60c833139a54e3c4e29213a5a4b4788d662b17458407484b486b8b4562987ac9e542c960e0b888e90d6109708582c203a425a435c271e271f9a4b87a5f1e8b080b484682e8d084b739d78b0768fa39d4aa558271e5ad066438bcfaf2d69a275088f71c318318b5b456b1d72fcb8b71209744ee1394b3f744df63567932afb9026fb23679dac9385e0aca9b2fd32a68d5b8b225f86be7ca30d4913fd7c234d37de48538f251db29a6d9bd20efa3ed4867ee888df641f56698abff11e7947e5c412e2fec1ed031da10de59534756da8f24813043ac267be16459a369f9f53d204817420241367c0ca9353d9c6362acf8cbb76177a8cbbf3a0726209b99589dcdbe3b649eeb76d9bd9fe94eafedeeeab086b3cbf7af83d7bc3e3fcdad9902183f06edf6ff298b3fbb8edde7b4acd93aade49b72da87e2ee5a06ba296268c2756c1b8ae7e70fbb53e167d9e6bc244171c7f170463664a30d0f1bbd65a1284c7960beef5f0b873f77ab8fdf945c8d15420bbb2ba20180397a4d090091e3fd3ad16b7397e9a8d2ddeeb4a72342a10f9625d387e176e1f5befa5b5260cbb7eb5e1d6d64f258893db13f67349075d73bf725bf9dbc7d26437942f716f2ad254696ec9175b87701b635651aafbf3e9cf6d83dad47b735635fbf9dd998b1fa5aa8f52414e1fb592a6faf78339471ae374f48af14869dd1a4f8988b6f6c5e3c3b0ed479fd6af9562293a8b5a795a94d242e5a488b417512a540e6ad5fdfd3a940a9513212a07b542a9503958de8e148b9b149b32199362dd0595835205e04707520c95d372431a6a49a1562428a4282d3a4831540e4c6f5f8269912a627945ae94cf415386e5d57577e13d07b13849719ab203a0c3f2ca442cafcc6379752caf1f8231f445aafc34ffdddd45eede028b5451a4e294147371faa51ae84e8a719a897c149cbed649b100042162c427099324bce3a020d40a95e37af1fcd00fc08f864169d2810e7f0e81604ce4db2f7e8c362d4c2e6724be8f45a2bb6ddcdd6d220f9534e18f32e6e466f4df4f639ca1349d529047c8ed9f54f88335f399ef06a7cc8a14ec3dde2529346d519b83447e8a2f629f840e1f8143a02470788e5b29075d83bff2d1cf88479af0ee363069b25b1a19f9485312698abbdb8c5e2523f4f62523b4a755204ac55f09220867d96e5e04b9e031fbbe12c48b148ca1da7716950bcf84a19ff2c109c3e5ef5a052e6230868e44294ebf7403dd472f4e5f38e92e3f3c0715902ff4c5f243a51cc9901ebe267d9b8419614ce10a6ca56e2c22d7ed7048e412b9442e914be4ca309615d80a6c85c94ad08a9395272bb19521c843eaa4178d2174cfdc8c056860867d1d471823238c91f68b40cb4a07b018e1948587d37fc066b9199d77cfa327b588a31f8d9ed442fa962a5554be4fbeb2425dde05c98834d127b948a4974e62142472b1b4a4697bfa2c43585c2c44a4497baa93e07488f43633e4e8497f63f424971fed1ba3273d69c3e0e247db6686dd5d063653beafc0567c87432cf363b11f8bf6b110912f7446ca294087cbbbf85c026ac0e849f80690be450328b8e1e25b5e032e9b6449780db8d8a4b91740c28f9e64f70d12f68874e349dfb2b3cc3ee4b63ae7b4d9731ae41a9739603e20eedc8231f4495f9e49b4e833253dbd2ac8c262ee5e5736673a2f37c369da4e957cd056caacfbede767c365976d199641d9f517b81c7ddeb3f8fae42cdb5a9dced26269759df2f551129cbe087f56c7676f6ee40bd5215fa80c02c2d0efd103071c769072c327f4a3bd9932946ea96da8469616c90563d88710ca64d884a12fdfea6418dd1bd476778105d1371e492e1fdde1500660b8c189aab892a6b9cd4f25669a12123d7ad2f708c817fa39e40b7d926bc2d01f7d70c2905e9cfe28a87444779616a79f61d224990449931369924fa429968726feae225f2694907616c2186967239c4149412cf29198af5ab1e048a63ee5137d19ce709f2b9d2da8e5157f4354bbbf91b2ab6ac274db739fe56638ad5f7e251fb4fcfaf1eb2f0cf1d8c5ede967c3a3b77df775191ebebd8c99b5aaabb67ed0f2ad0ac62a2bbeb8bb8c49e50b0eea6436a45b4fe8fcdbf79cc2d12a1f5eeb469a7448532ae3e4b799116f6c9ff36f30de0ffffc6c7c6d774f055e0bc6c86cf7acca3759474e651cf9228bd03f59836941b13da9c438fefceafd6c789d2f63d27cc3e557ddaa3eb904d31df2f018a13be489b14444e94747bbc997eb44e6fbdadbccc077db9a9598d0f4a72ce54077c8d392830644208504a4a000c8040699204d2f4d52f217ff224d333e11e456595d1410c6b89932d94b1cdeb358afabc76f3323c2bd6140017c18f0671bca04ddd03ed3369c01e3131a7ff63d1b9a3270867c4f47c7d26219946c288b124564eddeedc0e5771a45c78231328b653128d9501645bec8ace2cf63cdfa314a6fce4929a5b50a0909d97befbdf70a090909090909a9a0c2e9e76c3e8d9df5e7d3d4596bbc44949a949a949a949a949a949a949a949a949a949a949a28a1440f9258420928554a48b4fd2b47d70639a19dc01850acf0019fb35b6e851318333d179f71fec098f935355f4b64f8a28f583c7e1e958ad05d25a6b9bc97e6d25c9a4b73e11f6168cad4d48489af52a9c4e6a8253b2730263e0c27b40f4660bd46d8c1073caac45e3c8ec08231515389f148b52f1bb1a80bea2ad6600543a8ab920e4a3a40e2943aa54e2a3bed875245396d9d9f9c76feb57246596bad5bb52f43d669bf59e917e19c754efb906e2a23b4ae1f0c2f6723f318e31769ad914789cac91b7faf75d98f6a57b9cd71f56544be549e25f2512b1c235da251ab5999c89911b01537814320239c702654f5c403e31a6d78de279fcac0a00c8937c8d5e8d9771bd61f35cfdb9f3b0eacb1e7fdfdeccdc4ca922f13887ca93a9f5239f9f5eb32302a5ffbfa493573e2114b909f7d7ac327bc29d12755e4e25b1bcc8e43018d0b2de778b58fbaaa6ac25c7e3fca0867bca60e8fa6c6b88c1bb58a332e30463eac251ddd5d8236393fcb4b3f541e13aa1d9c312a3da1dd683ab4948693e9c018f23b84d1211aa5dee038034e1929b5ef3e1958b65ff6da975f72bb6741321d1853597cdbbda6aa0ef952ff7ed9976da743972656c173cedfe950d7e45b4d6a9f0d97d7d2214d35452682ee35082803a716a409694eb4279a0bc6882f612d88d07a3419bce8ca62b5f2fdb418fcf859ae45d1d1623f682d3665b420208c84b910d1a24793011ee25d57222cd9e2c1c2f836f28052a1722a5e226e70771c4ba0e9f71713a27df907a0d9ce11f94c7c498a9f65199e9148e42388f08f43a023563cc74d9f52549ab47db258a71444774f87dfe7f36b9e939b29f9a0b797290d7f66b7f623a1b49880fec0182e2e222f232b16e85e79b87c27eacfbcc9f8a5dca954a52d18c3c5297552f1d3eb943aa96219876764523973fde4e4e4434e63a058daa8b3ea88b2a256b352fa14b5e2281e2e43ce0fa5e266a89412ced9c2e5f26984b39bdc465b4408489781f19e83f213ce2905b4840f20a1a1938a475297bd77ae5c643c3046bac873b5ba46564774afacdb0aa2a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a767247b40fb3d70c061871d82f4daaa2a18e35ef9598691caae855845afad1b9952c9b3ac98664e9ea7d59467ba598c6be539bb4fe30cc8956ca0a5e6823173f69031e1f14b3eba57178f2cc819999c716555229fa00486307e6a10972f4b40aa0e8c71b98c2f6195498b0c9e18a8148e146739eb148d040000012315000030140c87c4428148308f352d8b0f14000b8b9846624e1909e35914c42808210a8031c00020006000046484b40201ea55c06543b0e0be64b0eaadaba9e8c9937bf8c8708c5746b3fe3e0523f8128960b950c0fe62d6a4b782225248879b80bf4b403e33e71442ff0b0f5c6099ff13724a5d186f1b0cafbcf7e8e052c6a7ecc4a02589b13d4347df46fe843e15ecbc0818c15a247497e944c85a9a7bbbea3cead0245253dd608b08e9577875d1826678a4f1fed46303a11620e56825c22052f142d250692ccadc3ac08c796edfda86977c1e0ce6549ee244657062761900fe8f0d478c03042f0903198136c117ee281137610ddab6e2c9acfb3c5b9ee40e34b2d50757c865baa096a727539e0205df4ca4f83c3b82e796f7cc45b1f0647f1be0949d4ed9019424e1c7c337dc30a07da5e3104cc661301b852d519d41b3c94a41c53fa52ce4ad84320d77fa6de301a87612d7eec68fcff220ad1d864baf807eec1478a96b9df16e6d52891401c7657c200488564e4b90bd2e51b69922017490df6d9aaa257c7aaae1431d55b3505e75f7c89f5fe08919fe961a41f87fd034f3f47116f79b487231c7bf0e967ca89cb9c686057544e84f858936940a78490ece0d13271bdfca4823c90626ce38f43f44f458118e1fd462764afa997fec2377284459ffd71f37208c4cfc39959fda3a69e0540f9b45c0df9650df8bc5b1d5f7b553459f1ac1d2442dadacefeb0afd35d17b54d5f82556c15d6297e6454da53fed5db4658554862c244d8766dc3e2bea6ed237c3d72087c532302a230890cb47fa59f0ed8c209e300272ab66cf92c93ede8197898dcf483a63b1c5c848c6484a51a51abe7b38c28ce025b84f3b32378ca7ed84e58de10b60d4a4c3d6b8d72691b9b3962ae3e592eeab9e2ec4343ddeddd18c92246b99889ba87b5edef8ad685570b68f0e14b805eabb7f9aa853e913c97e3e00d7b5d397d61bddd30cc76acd0622cc13648ad8a91c4098721019a8655f522391201114e06071e0d99232ed784d819142b11f2c32a54d79e158ebac64f6b9110579e5f80b97680beab8a685f9e35c02926a0087e94098df7c228a65b98d19fe9537111da90531649b7bb80044f45ef91ed97baa5c06a4056ae53ff3e65f6ac6014a84fd93e6125ae39c7fd6dc9a7432b6b0f557fd93d4650887ca1f2b35ace131655be593e2cafe53dda30da4e146d84c1a6a670404ccf90e090c5e666db29c4d1f0891d95f189ba3af6a77728d53f6f9a05d0805141e5633365cf30a86c9d9ccc6e86361af8aa69bfffcc35cb64b605ef88218dc9f35891a414f9936c8ac89062c8a2a5a408ab99d11b6aacedb23961c0f2d80617789ce976eb41ed1ecd6799df41a9782a3ff378faf5027051a3ff971fc0d3a35b85096e37f9167ffd87ae0f87dfcd988c89b843bd8fccfcd5a8812e6dd370417cfbb57d35885ae2a7eb38ac7497e13bd15ab5046f9ee4097faa03646753a090b8f1bfd85040b428cc221a3542697ca270a09ae40fa29094d0d712cb240694997be14b4993ba1574a5545d2d1b4ccf002b3e2a8b85e15f08b8d41639a997b33a3d361160b7b7c4b06dc7e4ef4845cef7dd02f7e1c493b4ad27030ac63117862f7fcdf0974527cad21a1160b3112608715284e98bb8e319715a7fd5a9c3956a2ce2e2cc4f04ba5e2cca0f85f1d19a37c68e0b14a2d54c0174370a93bd4b209ab8c2a227e63770584718529e243ace9b107f068d51c3a956a7c679fd4350849909c62d368426ce8d28f5fd8fc8db82e193708e6ccb5e9badc6478cba8ca342fade87666556c0abae05280e4d1bb3b961c12fae71775e7d7bcaca8fb7c57398065f80892c3ff2440a4b6c755bf2a2878772aab509845b1fdb4119df8c5e9f36fd28bd86fece1246c8674a012c0b04eceaba4404c5996f7fffa9b722279c7e268b2beb8f2f67837121d5e09ffa01f2fc5167a28a3ad2fe07777164f02b3e3cccbccc83a98a0edeffffec915a519468c17ec203233221b40d9399c1c3abbb4a593572fffb334a6da030c9dfb53a260e90540d4d836f38acb28fecad22c5faea6ebb2c541cbe3fd55aa75d19ccbe6f4f07e6ca6e2bfdbc5a0d14976ec695b4a00c66c3db28e6bf5ed89de112de7a79551797858e6de3b16318e1082b57f663c562c14fb7d552fa8120c2a571c94ef2596260df0f73075f2d4583210cf6557e8832bddb96332c68e8cb0be5eb6550a3ef3f4dda1101062f02c1f4409f874b038fd36f566de794a7d3a9006982e29536dbc20e29be4d705be497248b6f57335a6e8c8458ad32b42b2770d34b75801fde2afd328b46d78dfefaf4d2b80f776344632d007c6cb8c7240540f15992c8cd639d7badfba7ad955e5c4325ed12702b9c2a3ee9e042744e0a035a4a3804d0960243b7cafed2605d835baa61c909908f2806fe5b16641a016376b6d1115f74a138425f576fcc33a35bb6f3a1a58735799be5f3e9a6179230186fc2f7a4831c6c1b2ca522bb5ccad12893b219a604ef48001b9045e4b68f3ab9cc79a8babb3c31d2332a8b414e6f6cd9221b05d69b1d114f29a6cf6ba8c687289f03a9145c0b7196e5f9c6c1e0213183d440d30f5c543f92860c1be8477d440cf5ccb2989deb9dfbca926287ab12ac094ab26019f79ea8a107cd34305bc3e4f083ed1890b5fc53ac2ffcf1bc6627b92830883af561842be037adf3c22648555468fb44e53f6deb5931bbb2340b7083ea7542fc0a58e20116737273f70cc9342db04cf6ae1887255ce36712caa6732326de53d6bd507e654115ed3aad6dc635cd9446b930ef7d54e609dee9b0da19c32bcb1418e92e8136757e90afd60060e595207cbdf13c312bdeaef5d9d82ee7f8a70ca3d42b6ed11994d05c07def194a3aab0624e2b5bd490eb30da436a4b5ab447e600b2bf281b8e2ae04052108872dca98a9bf18030b66b073239da7614c3165cb014d0dc90bea1ce5d8a835370a0ea03d1a551b629318564bc44627b3779f7a8b8931a8f1f7a8f960b10cedebb83546df96ba1a04cdce8fa127035f0e083eecb923fd05e10a08b69cc50990e82bad324c2ea05e141bcc01614f9d09d21d59152624991d50c1e9e6f13119a83757c25a4f5f1974a316abbd734501366496c770c19ca5d8aa44c97202fae1caf980106d73573fcc04fae68a6f546a03d72e47a9dc332b8294c64d00c0d30b9c5a458f558a7e5c79e3720ea4fa7c70c971e303dc74e9cb0d0371f9f49a5e62d4c0ec11adb937c09976e3c92cb40450bd719ae60121939234d089548288547f80cd2c3233988919161003a9d0e242cd557d17703479c67934f024ba3d236766b8b7078b39cb3624825416386011dc46d31b49c8cdea33f540d750c35c02dc810aa2f1bdb15b510782e54b3c3e9c070c30246068af498016cc43423e835c6210ac5f1c6a791fddb0c9313a522ec400c55fc1f9d4668edc3dfcab1fa31f63eb962b5bfd4cb754408261b5262ea55360d7edcf90d05d16b8c8cda439a306e62f7351d9e02d1dc753cf5427b6d6a0a0b5992371767f79d1be356b93d9f42f74b0cb33fdf2f5253d4974ac27ce6af32380df4c24fe3ac9c05236dfa79770a9157fe3af106ba8dafc843929f2cb962af7f35dd33f845e036582bd3443afc415968af85937c3823b80f39c606c7c6233ce2f8a25f285df4d3bce031a733eb4a8f4337cce6640eb847815ae1b27bdc14a982fa57c60a1271a137cacab05ba53e2ebdccfdc6a6843abecfc6430808a8a33e097149330df10f056b1705a97ffc8d67f010e86f4976b0c003544d7d8e32955da570f77c36b546b7923578feb44e075afe9b87117e19bc54b882348c0c09ff0e827b1ff1ae52e1421c0b909a9c00d80647f9ef5f49b37eea43b81212db0f41a74bb6b90c9a9d4ea6d5f5c397aca8c5619a2810cada3c2dbf1ab79843962d8d2da3066563121ebe1941f1d69123ae3fa506419213ccd67d8690d4cad9c5431f20a79f8dc384459f93f02d682f5e70e10a625575f53adf4196307b37f268560c23cec9a294cb00518d998e2b505347805b7b35c4db8144f5ba95a3e2aec8854e9e64fc9e01d826b6ce20c84330590417bfe60a2c5806ea0b3211c4ff8de40c9a5875c442e3c6f290ce3a12dbeccc809e5b20e5552c34fd816be415c56d54bcebca2db31a1896a25db6bf9948758d2fa079c805d38a0268284a8cbe9120305776991976261d639e6237f7d1089e7f8a8e49d0922b1f715e05c7f5a5089709c1ba346896a5e15a5d06d1d076ed21c9f26c7b4e676fab72270a939b50f719a7d449bfcce4878ddd537c16cf5f0e82c3b80cf7a189744941e05ac02692b575aa7fdb12040cc5914691895d5cd36b0e2c5206c33d8f5b958827c0b7fd99a027b9c0c404ebee7f2608357ed24061ad7cb1911c55b4dd3c4f5a12ea0e6c2a70a013f9893cd5dec85370634574ec98418f317a7dd834e3340ae70aed3e8cec5b62556ece9898a10976a79ffb28539287e13f0c43e917a33063d3fed0c569698781224a4f3509f362518c9c0343a80863f2a46a926e416ac29998cafc9775c1e6c8db191640fd8169a54fc806b282d9f1434ec016a2b10e115dc4416cf86c82f41ff4e563a1431bf2e50ed0a19961f0b4709bc96d9313140f82d83ad507144caec3cf56b94f3fda60f2f41bd25d59b92eaa3b8de140407c82be6b36b6cf3169829d6ce61873913bbe166b90b7cdf207c4d743842b8ef411858049b2fee049c21a58c908afc9619d866e68c0f2a47de35afb585255f6698dc4447824517cca13e53d028c0df62a6166618b6e961fc4e41cfb9249d4c0b34401471e3376a0b480a3aec4152d921688d5d473efbc4c5c201d22679bc6a0366478a0f7b1f36405e35b2f4873a9b108a633309e23907f6648553f87f9945a33a0897d1a6f704764397bc5559d22a8224b2d334b0c31e6b4b0f713b5531db15c06b1bb4b88535099a52682012bdf81f18476db585acc2109f3f0edf1acf1af25be9e37fb340b7edf64bd1a183dadbb54c72d15d272a2aed017e3a69db3c5693f57f64b6233f9280a7914f18a9850ed9c840add41bc2b2f8faf68e89672729a18affaee5df94a0bda81997708a311576319a8dbdd1e89584f5272bd36625cf8b26c9a0fa5bfcc348f70b18bb2377a0d6d89676d7c5707e25470c9c3de0c13f4f730e1d35cb9307bb6bd4a6a6bda8f5152136aa1c41e2468b19d1033ca000f20ee9ab5f84a7d3853dd030185ddfb3b6e56d83ddb5869e0b95408a523bb7faa91325bbe86083a87b5b40c9c7b82ca82948f6d2a42f1cd555df05b3eeda583b48aa0e2ad3ea450184867334c7bd8c6c4d694fef079f7123a9567d6d25774d63b28a455f0cb5ce6049465cb4f3a5f6eedeaa5ef846634c708472fc25126f8dd4253117d6015170731ac1e3b8e4c1e79124b72259b17760566ba2025e69564192ee1ada111a04177b013f0c5381da8f8b31acc370c0ec0e129972db9416b2d09cc92881297c1ddc2ad925fcdd053ed87a58f8840d579c2cdd0f9c501382ba46236d2ed053635ca73b7c83c0a9267c2f249a7173c5b4811664a80be90bf71b17f49e75acb19daab4556a2060de4c91edb637a659a90200933dff7f194d619389c9e5fba90b798fe6d4935471eb3d2368153af2b4dcd5228046659a000f6b32978342f2171e3c97ec0a49a67fc95d770509418e3bbd8fd406883039836fa2cad72b378d84dbb15e616d83bdfb56eee15a6ca8529581ee0d1ebdcb1b5e4830c5eb95e92f6b428e81771e7d13fdf58fa42f86ee6d325589436836fde159cd541d0bb3536fd1140e7ed41ff3ac207005407ad8e8fec4efc28c19fd56e6170319e581c2e8b1166f3f12c0f7510dc560906d05ee9fdab1b6b7c76c8151e03d023f7170d4b1f03cc0b5637d76fb9d7dd9799efc280d9e8e5713c7fe69d658072ac5c60df03441ddf16ca7cacecc815045bcfc9e49f3fa2d2abe563f7c841c26192f6cfab812ebf35636a9080f2fabed5f28a562d048d10ffc70af00fc94c0397d1f8269c6a7bbf9e5804cee8f2204b43780e160561c27118909f376ba66feb7b6b5510ecb125875c831a5cb82664ba761ec8f36a953dd6ad22706dce3df57d4c2b3e56836c8226df8e673f39f0706f15274149d5c3e722a361d29e5bc7b58cd28375038955a10162264217ed4a621e5977dd1bf9561baeddebf56964536a61d67f1a2a64d372075267c9caae77e80f5a05b8ee8c4bff66e0096caf881af7232a8fe9b3c4aad3ee382fd804cf6dac8be692f6a2f5c06d6fbac5af52c30a7023bc79b16ba14cd131ffd20442b4a465b89b471862025f74b9d6e8b03f438bb86f802b031bb29cb6f064fb1a70c1374e5277206d62cfbcdcb832d5d8f916f46cba599b4831e3a80f5a31d582eedcb16b6ee7402638119cba5c4fe06cc9f99b0109946c9e69641640e6e8b0908d0ee6b8c388ffbc0c2a0868e51ef50a8f2719d1c456e813294863c9ad7c3ab9eb40db36c725b3e18367f93901f21f3212b1c624ed99c27b53c4c3b34b7c75def0da124ca7ff35ee526190d199b32e2c00ec6de001bb78ee14b00a3d5337a374ddcda46dea518ad2ecddb9423d4337bedf42bcf7353d7a20d1be1429c88bc5af16e0a0e90f7b3a4cabfc3e1655791d30b55cf9404eddde68ac541caded0a0f23434ffbf2ce8c9eae219412d038b54128358354cbf28173689d5734ce2e7ef71da650a66a09198e064f46ce6a526ca8b0df5a5b03700c8f258a63c9e24ba74f96b636b4319ebf56484b92582296df1abaa08256d1a41dcc586d2076677b1d28a1988c9245bb54a2cdfc8883bfc10874cc98ca1fa02b8aba8d5e8be8f357ed6da439737a18adb3227a50b8d1a7850f03ea224b3096b6c6d1279f70677788cc4f64d39a0b8a5eea4aa264f00b6a97116ac484ae94c3fdc16dd5430ab445f0e690f2ce9419e6ccee947398d4f364782dc59ea48014ec153b5ea63c9a794be79271d5afc2384eca12048d3b38f8c6cb17ed617fa414c16476e45196544d22b10631890944509f1025d1c5f878246ce2e3f33773d08233f7ee16fd0aa3d71bad30731f2eec445aa3ebadc04b5927f17abd2c9f8daa9b9e85ebaab07ee6c00294af572bcb703d307d9d01fa4c4b0e0683df6d913bfd1cece62296b6e82e38019e2c1f10ff3e7e5998c5ef094c6a5cc37618f0b173637ef64f361d23079224bd6349d868c0e823ee564c650fdfbbd0a367fee59eddfdeac38b244c8d0398ee1f18d1026d0a31a5169f6f9139493b3ec6427dff633270b11bcd28fb7ddd556471c0345ddb4a48c69d19aa21ce341b5e452b6686c05d68d8b8622c48c41241d5d509130122ac4250230ac2b8e54d105b33835dafe1253e752832ff7340bfb4bd3390f69221235ccce93a1a10cb7baae093731d0ad91dc882462345e620bc496f5255ffd015189f00e2d72b2182e4b20ad2cd82ff09f4a073696004c6a87ff6a7ef9864333f507cefb3a2060cce27f36815755818029816176825c552bd046145ccff9216d791a8df56655d730fa61f97452344181c3b05555fdd4d055f154d56f4155d72ddbfeacb13d554bd32860d954950f988994c11c37dcc5b33faa3e4e7081124655d9e15bf6923b562dae167d186442e8a90a5ba4bf5b43339cdca7aad9db3d5654f554c3cfc650c7e7aa50d11d6df27e508da6a7570f150d7722069bc43962d08c885720ef1867aa76988a387eb9b57db80900b15aad788a266fa37b84521da6be8a976afeb94192a933a50ceec7013dff47577be503dba4b5cc8a474a783bf9a9dbb1dfa0f965c6a9942fa4408c0cdfcdc898d471eaa2bd96ea588dd46fd21aabc9a051baa3eb987b912ad63aa6efd31855c3265bdc967f8517befa46c58bb065b21a55bd15e3cd7d902387b02e9510f87364d6030d0eb469682c95f9e000de083a8d31a69428f27bc2e45c04e436db7d83b85a4b4c6755b6e3b4bec7a005fd9e8e16f32cdce70a8f184ed33c248c0ff4e30306756488f6060001ba1cd098167ab9f47a1dd53afec73bb9b6580f9910f53abcf645768b079a88891e7900bc7d643ce9713a32a163ce4a9f3f724806435fb7acfd7b6ccee7f5e4359a67b55465d5101750e5375192db0779f60738fa278d5262ad3287bf25e459f4f272fae1f2e82dea80d54fa24608b74943fc07d1aff980d634f8630b2d59e7922dddebc63a77f0d7f4e2e33288702ec6badbe31454c7196d34b994f0a929e91e22934be93e30f20c755de4b7a12ac4eac63f45162e545e8c1eacdbc5140abbbb2db1e7c032d00875456bd344b6e7d15a41154a4ae15e5e28f90b96066f3fa1e196340c340f3091cfebbbfb74e3089f5860a710ec9681e435a6bec933012edc163ee8c4ccc251864e9f54b591d773d47c83583f63228b795b9f3c23c000a9a4967af194d94f92e50eff1b9816c6c4f097a8d2400b9e1f8b52b0597479982c9538747bf58e62a7fee7b176e9ce7ce0c01b971102a22baed72864f83674e8c82b40b98cb37538eba0ed3cf0f407c0739c0db564d23e3b4f2cee3f87f15b7414417e14f880cb51e4adb25eae67881b688b3c55ca1891fe8a7e1c024040c350f5939bd28f740d8315556e15ffffa85d98ed610c3430071b1675ed986df56121e365f422965863d7830c2e51b6dd1db36a83e3a54b09cac49271138b84522ba15a78af585e7956b4312365cc29459afec57257ed0911c03396b770ac599295785377f4a13f54dc582c40aa12f480f039e6d27fefc844a8aef55bc7726e6a1f0bcb278c77e3c4406b2464616e868c2cf562e383824b6511f954dd4bc4ae7fc73f1e7c76704337b64912e4877d2cc66eb8c6874e7b040e1f065b3cac1993c57849f0d0f94b9affe3d9de89695827797ec5ea53b80ff2ace5d48b71aadaa4ba7cdd952d0052308e57aaba85b1b3895c05a13ea0525d155dca09a68e001142cbfa104fc62b87d47a6ddaa76333442887a31c5ad8e4ed9a852cf8683c3ac3c64752bedd15327e5b4ab82952209306214033595c50d6e748b909eb4b8cb241fcc91a8d38f0bcd89ad216b5dff24a659d2904502a251e33865aea3a711343c9fa888ad9398e7daa524aa334843f08f650522f0801ba3a79761175d02262bcdcc6f8342eedafdf8b6a07d9941784ac2645a6fd5fd7da911bb2801988cb524b8383650c618ae3078180d4e88ee6c8c774032f5c46bb104133545a0ca32b488d98c6e741a7549670c8bc731aa144d3fc0d534cea046d4f77a6e11ebac404db1497189d60aa3091e7f461a8dcb9906999e3680b7f923c05cdc4c5436ca97413866c92855419c718e6af5f3b7d8715a28b1735a9e721c318df0170fb5ad49c60013cae3274fad8453618c216cf1416113dfeaf801c0e64ce3435395fa7ed89cc03f76c43b2f958906b62403e8658e7680967bd39a8cf4c6d6f601fe1fa3caf4eac4360ca521b30ff39a0fa52be916c98f8c878d9d02c5e060227227a35f7333372c83b85cd1d71bf17bafab193fbc70d8fedcfa97fecdba873475d977d946c71d57a639a1e98b11ee2a303ef9f4d5bb745e9cb088fe6ca10033f9ab01fba150e51720e59d71d4247c0e3c03349cc73b9c0fef5507f034014bc8c6c286fb600be9d0d28db62dbb91c59d77a1aa37f6ce5ea30cdaba0a997549fc77927b0336b1af18c1cc58b1ac04475830edf1ec3dd03f2573e3d815c9c9f50b6c88d0ce0684230ba817a251f8fab36238049a281a8fa574a1097e61f9d76cd97b8495a88ef48ac2a3748070f05746fb0c801d667d048006fedd20b6b0175b44cdb1e1667b615796e677b737c3b8a12935e5ce2a81a558f2943b2afab1e6925f26c11ab375ec0c6409d9056ef3a16519d3addc018a6e8a51ca5f774467d5dbd9b815693b2ef66e615e9d5bbae83909afd8710b7b93bbc449fa2dbdb99923769f4dbe80a86ca31d25d4272c53e550de8f1b0de2e961a39c0dfa67d588f895373ccf81bfbd58eeeade9588e3dcf88eb041c8d61204f5c6d93ae85464bc0cf48ede6b19e273cf0f5aa625991dd6685d6e38f57b412b4c046a4101a893d75599cb50f1925251f73bfadf37541d1f0e50f5a1f96651a47e3a65b5fb384c445a0c6d37b28d3488f500bd76cecd5021cafb490e5e750ca9afce6cd3255baf5e9385b2d546df878e2650718fffd9342a85b4839e5f4561028211818e21aa9d256b7a0d0c03805b7f5446325202c0a9da1d0c35c670a69c10263f92737998a4573788b3854ff33d018930ca18391b04b95acb64ee84e3dee4c683ceafcde699babc45644d31e6d65f064c0304abc3c72e057c86d045a32f6d7d6a88ab2bdc7537026b3213f351e4f5c087416ca35799c157fdff014b7739c98baf17086bfeba11343dae7821a4d35bac59e67901792f518edbbffc89f21fefdf8e25071921ea622dc71ffededefad9c0093a271baf23f7c22062012b29d44bced6018ae359f8b09c8c815f99067ba08a1600c851350633b5c30c90c9603e70818002b96c9f7808dc038f8a922da52e6a9312f89f260cc1372d728b3b4c76288d946797b7edddd4ea9dd0bf9c5e8f1214cef0e07c59605896a499a6ae7dc8449c43ae86c32aec7e4b5a7b0766f55343f62b4c4dfedb0c956bc6acb2fd66d8802bded133d356c7d1977349a8d6cb6c5d6fc62cb108617944c6ecdb0ba8a22a3246c0da1f9dec15987160d5d0d59e497d96f6153f41e3187d1f0b7b10e05798c90dfc4a76ede9d882b424835e9013b8363f92631e59021f7d1fa09c48719ce31737a45d88ca6d1345f68635cfdac7e6babadde16886c3ea0a1b97c8e589109cee1f445123b707ea972d53cdbc8928fb1b1298792f3fd08fbf71fd2dad47e45a65af25819700c3211be9fbb945206e50f2f64ccad1461a28b4599e7ec5de1468da67f08ef87e3b598447d7678869606eac57229f1c2a6486c9e6f63ed7cec14462f309ea66904ac823e22d1517d1d199ee2515ef0735348915cbb9d9653cbb6e82bab9f29d3834c92dfa967431e962a13118722673ff9d415bbb28546aae84369fd34de6b88fe906d583ad670257358cb3c57846d491e00cecffae442d5b2a292fd06693518aad04b09805982b564c75f22441a365203cc418869e10f3fcafb46a751b5b9be32820589af7be8ee0a035b074199848e6bd0765e60804e931b6b58cc29e7c9e8171c01067fd60aaae86484d173367907d373b7020f063e18a9435d515c62201ec9faab61b6608cb67429202206c60884060a057a918dac74804951d5db21e9c7a25b42ae6cea513024713ebba6600cd94d012dce839f201a4c018579e432add3a72f6c3daab743bad396039755284851100c67f175ab608d6bc52133a7aa70a4b0ecdec845499eb69c5ac0182584234861f90233c945e1d212a85f5102942e85af395f1b44c3f3fb4cdf8690b7a90ec050a7c3e832f3c9858214a07317a30e1ed3aed6452199909e39d4be7aaa362b46ed38253e07ec08462e2c4a8b580c4b7668c9bafcb38ef706f0049820fece89f6c5201eba6e15676348925dd1ca5d73cbb9e07d4b84b0a01ef352f1050c04d61171b93564d2e89ee0d23c308bc21c5868d1a4ea082d7122bbf2c89a10cd091647549cd07685249bf6aa75a9912106d703d686761da182e523e03351868220d829a059b1125976074bce44994beeb61360c64834be8e12bfa53c861969c88959d13c7e4ca96937859e8a3b61cd148c2dc591552c729b0331f871dbfaa0b3f18f11f2e40386b8cfefa58290070ffd8c4295cc83f34c902e309b6b7659832635bd8a1082281ae87ee13521adf007353b93a14f61c8464bc5eedae1820e4461dcffd861efed604d46af090182e854d6acd02995334c1a0062f9d353043e8a375eadb810b220d00fe688a78e7cfc14ffdc53de1b8913b7fc99ede285ddac229947174340ae7f1cbc7863f55e2bc5d0854e2b0c74ee770c44189488a9d4f6352d95f0d39b76e3cafacc16c1cf107a826d5172cc04d2c48503c04e04f0932721ffcc02ffbd317f5f18ae6fc6d881509a41c99c429482c195ab8c60a4dacdaec049c7591acc51cd5766aa54d056d5664274cc155b23120dd52c67c804d3dac995aa2465bdad527b65484785102ebc0533967b5cb6aa511885ab349802415c010ff0377f9af239518832da5526fd503513408b7aec94d38e5d4855010bf9dd897561c5fda6ae03e963e7830ba31188401b8ed021e52e2642ca1dade95109de359bcb90981893a8668c02a64f812f3422b961b94a237b4691331563e2886c28bb965d53b1d8ec9161ab30b89730c16f674157b0a8e6900efc74a1c2ffad5612dc609b37f6456aa804bf48ff7189ebc4e331ac8c507434086a19921ba880bdbae7cc0e1273d8594d51e2c56efaacb9a19ec405500bb997a9d0e54ad3ffe9ebf886beba220b6971a59aee4c3207e952928ff2f700465bd5871ec5be0b74b502bcdb9ae46d950a4ffb617c73bd683c77006f3ced31d2853b2976681244eb5b10ea6f267602260078de9c0c7faa549a1244752ff3500dec6b76db70e9a6101f37afd5d5a6e38cc851522fcacaf6bef5a5b91329151a53e6deb4ce0a04afdd57c57e80329622df6a0f1de1a30af5b1216960f1217133062c21c915d65818eb29b8a22d158e58a33c49150f0bbc0eab016941fe0a78bc2b42b66078e915f0c42d2848df4ba59b33be9cb01e080e5a18de6b8afa80d778347b5318ff1f5462f4d32300265482e977564c87df20a9d42da0c13cad8831ff79b83e1a9d824e6a54c6994d11232890d25364dd6dad8f8a84ab96ae4d39aee14217709bb34f53f15ac542daae9e7b420f1acc69deeb755e58c8423ccc7c864e6426f3868988d6ed6cc50173d0cb140823d2c7ecf539fda29a0ebea6efe9fc5a3365faee8fbf831e04312a95b82d1d6a736d25d5fcdb24efbcc453818d7cbd520137073319d4042731721d86c4afbc8be435709d42101ae140f31c2144c6f4f22b9c4c434c20f8dfa33059ec223fb5641c6487ac7b59c32fbb98d44e2fe947bf71d9eb77015e2fdf0159869f537cf48d27e2cfc29dfe91901520fd1d480eaa18d174aa94ed75e2a00e6d942ee3c7ad65ce7f720d0476667ea638446c14981b641855a4b37184457b295b8ff76f83c817086b9f4647213013991a092c114b8ac51b8cf423450f1a7feaaa6835e5812abb77d9e9992ad6ceecccc84f9629f0c8dbb43f9793650eb6661441b4583a50f72f335a41b8ca6d5a4205dfe25158f041ad43c55530230ff29f0bbb1971f25e77a22603a37e684a57c06f456a9f831c4a447d1a26751a8740ebbea243f205359b8321ed385b1b437ba6c96d07aee89e5b9b14eb065bd582ffcc3fc65497735393c1b8e5e74226e8f2efd665a24b5092ff0ddb2e9e6618d4c3abfa078544c1a5117443e67d75c0626908cc931cd2a9b1a64b01f8a9f32d645ccd6991309d9fb558fde828e08e609da8a2002fccd6c04e00e843e280c142398de66a578fd1510a2782764415009c5a010b005befeba1a01996083c606f1668808def002c8651df3e0d9ae2969fb76dae441a5403467bd2832d68478f984fec266c4fd644d054a84fb16ca0bfd8b3a8e7d938cfdb984bbd792889071b3931194588c5b1db856c3f24fab9f5c40ef770ddc936b8988c426ece2874b2ff244d61681acae53064115bf5f8e6183428482dc99d511c5a26db4231c462b95982b97402386d0c1825868c877f11fe48a21ec4418d4fef9499928597332102ef5ec61fcff87bfd9c880273146fbcce69e41fed6a99ebc9261043cb898c27687414cc6bf91b638429563478f6aac8d132b4c6dadf8eecf45a5a792dfdfcb1756ecd5c957acb02e9afcb477b5754ccd24cdcfb7b6ff57a10f433e26a367d25a7bf31adacb81ed2c65f1f56bbfe092414b128aafa1b0996a541681b371b2d2d9d287c15207089bb9643762c6ba92bd5af3c123bee18ba44f6247d28ff1de483f76166ce52b10f62c9ee1cddaaa415d313da251512c4346b3100e1c13e0774ec99285426b4fbb7a5274c3efa1c2b90abc1f0364d6c47c951a7bac5c9b02707595e063dfbc4b536db65a22f27591967d6cf11c6c2683e298dcecb2a48f789fa817a75fa621df97ef56ee1b09f1562ef588d54b8f76a24503c74fc74a8cfee83198233fae1ecc6e10e77b195c8b0478f84fe6555377a98c0e012c2eab142c33c08449eff484e9af84142b62e4901bb6348c55322370ace6c623742ee1ccfc8e246ba0119923fdcdc92088522efe08147a8be62ce0957d0f39446ce90ee902df3bbe32b6bc1846d2a1a747e1e9b5d41977dbf92f56c170dea3be2dd7199c629016d5cb0a8164c3ffbccd75200eb73ab1751a11316e99a5daaf7a787e79da81dd2c5627ca5f746d74139bbb810b0235e4c2a21d18ed97912653d354ed36afe8bf903eae3d46a01d47ac3193b2bb7c72d4755dd46c6253c804a38320714f0e7a48fba1d1dfc4f499679eb5d43c5be063065ea4442e0c112c8507c8c0027505d32ed37a20f31972dac2f78f927de2ab669447adec9e6d9813e86d0eab8c9add5d41bdc44a283702002b7c85473cd20afd52f34fde73265ec08a6bbcf0257c87f48e5a5e11f7429645aa558cd565842912011ce559561f1c700e2d7a84f803ca370681a52032eafaeb386151cfb5ab58f0939eba034844cb8975f09905109a799309e9bd9dbaec08efe8670ce563ecf8fa59107eb8f7fc313eed1f342b7f97e9fa361db571841356ef2a6edebcdc32d3d57f24fcf86f0d5e796e6dcb0c0b9da1520c48db93e2ef6ff431d44b852c54d9dac04ee8bb944451fd74764abd613d22e5c7f309f8fedf50ae0703f5a012adb75368829466d18ab21f4509bb1fac4b022c188db511ffcaf07bfb6f2a96918310d26637e9a07712732c7b9fd088f9d0943c40da5261fd4840c896d3f8a898864c8cfd4ccd4d8ee7ae463d9de3826f86dca99e35318e1d8e48fb9df4d975c298ff352bfbc7625477962b98c79a815f7a37edac7d573bc6f9c6cca765945acd90bdb7eb066c3f41bb1e52a7d985431c61c1c7ede224aa34044542413fa525fa67bc22210d3d57e6611ef9b7862351fafca23fce4652d2cce058cac58234132765fc3e870d70a49789302833345dee7d9fbe9af5ed22c676f295e98c8d06a1b69dd5821f5b58bf61c37e797591b0d170357997c226fa36eab137b98c5c65f5ab1ea18ea581ef48485a95aa44a6a91701d51403ab511ad949b7d4d2e88f76b078ea7c0e505a5dcb462786f50eda89b90b227da7ad09be98ed5d0bee920b972a8b0fb991dadc023dcb74e275ceaac99889f1984d601d6ab28174bee4f5b097be1808f45663ccb09e5e2cf1955902db34c9efe54e12342e956431481100a8dbdb2f89e341bcafa633f1bc3da4abe3969e1b74e0457b337e696e75921133fb0bd6ba45c4b7b32c30119ba6d0f67530654dc3d026296d403707721e95b8112c05263a03351ac69ff497062ea342533fa0085277409244eeb163db11a6e931b09ac6831421e2c76a76b8a60fb96c4dd2052e64406e06f30d69090f4fd85a3430666887d65a2afa8a03b888d0f6ca1f182881dbaf6062c90c9188c233665f8cd7c75e1904f71ff06560ddfea49447840eaab3bb952fe45660e05f78a559f9159ad5ea2aa1cabd0007ad8ad6973fe35a35d127518131ac9ce912933fad65545696724552d37bb4c35d55afb09585b3bc37c5d6e7960b0114cf1edf6d13d41b9b56741827978c6b980ae0370b1e4ed4821d84f2751da931cc05316a22507a8517806b9fadcaa31a11a1b982617a8137a4bd2441eb4c37a8ba9272e0ab7f31c426388af12d2ac3ffbcd5fd22d282eb5b100ecf7e1e8eb0ef8a257adf683fa2a7d3e38a8dacb931ac43e1953a70776adeeaca2e05825aa555d1381c3fe2312079ce93b09433ff7be9a107ec2a8dee6959e2cb006c83dd754b252e2ae23ad42e7f0df638db129cc91837b3047bb1ef3bba1436d64b25818fab7c00106b50f85b319e73283f60d6501e3e7cc9327e1114aff4ee3dc6789dd58e08390fa75cea1b81e7092f0b227d32a4a574e5f3da4a7c4bd41710f430a46a5c855d987dbb3d9f32b7bd30de8087422ae5b5486f6f318820bc530b10eb16cf01a06bb99c9a5abd6ef8840d787e9f046c5e6b5cd8b5fc4d7c10ffbd46cf838d8e415f891e8128afac16df381ed7173c422d97c0c698c58908de566b7554ab339391fbf31d26c71ec8f0bf147d0fa69b2c2834a8f366e46192817fa791384f56d6a543b9eaf671122591c6801cfa412c9247886c8481fc73732f9cd6f38f2e6565ba18d701c8b5630538e764030690a960436aba51b25eb77585fdb1a8d2e2af556efed32aeea82b1e0eaf0441a693bfc3c1735b9cd58aa53166b78e213f10e27c2674b7a63e47927b211b8f85b1688fd78fdce049afd323b42cd7570d280a82ea3e4ca18ba757890b6926286f4cc3aadfa29028734d93e4c930764d682f54f652ddcc770a3e70157af47cd21444b47b9647c8271079197377609d3f87e38b66cd99c25b403fb441077901db1e1862dcb0c4604715eefb4933a8a73d9e96a6250f807761bddc39a95d10c897404114b6f4f1372a12fb420f92542fd85aa087156d34e6013cc9042ec64ddd0d1ef6ab71c77525c1323397249363184a685b3c4dd43a14b3b1741ea40b474a4f5c78de31695703ca8329475a4759c7585f2c12cac73d72f5d276f07fba341b82cce633ca29608046ab18709ee36026ba4bd6b9359dc6100e487043dfeb4ab670cebac66853b3c99d4e1a8e00e196eb4056679150922d1093bee97bca4447087cfc63651e8c7c01d9e56554f2ec3a107879a9b2beb6ec97fe122a59efe457a4bbcedc1a1664eca2c23676d1bb7c8ed90e3821beb10ca0e3a34944d7141d8f9a922014808ff6d68d84f21467758113bfadce13eb8b013216879fab41f238ea473ec5e5d073c0e1b514a0d532445f9af43170253637e1d6aed3eb199273fae20c8ee7538baf680c85464b3f68707d27344d43c9a0a8ab53d6727ee96383c21e015481a516fc3ea6e0d7fdb97f0f5158aff07a95cd021ae8a63eb8288107438cc4b193e5c2a54d6b581d0e13c5dcd16b7e41cd6ad2386248d4b40bb0d660e0288aa4b6241466cde1c86e4f00068b2f1442a58e634d76b53137dee71534c570564944a71987bb806ea69179c9781ec32b72dddced05b607c4c0277396ca1a043e0150dc486059a68e5cb6ab8882d41e49d35b2766f7d46b601a103c34c1fbd601c8090f82f9e3d92aa73051e948ddb6b5eea89e7001e74e0a5a2a81a4788051e82968e0c106e4b2cf31613609e048be480f73a00415bcea6e1056ca3494c2dec63d802f54df7b1b1fb18117a37c9cde522c5717f121d62b850ec1e5849225ab127bdd452fb52bb9fe918f4093a76c17f3e1c913173f44dd53783984ca5eb320faa0ebe89e3197834038528b7a57c987b4fc5d9e699f06aaecbaa9bad6627f314adc52f488fdc702b44dea5ef7143d1de6af89561a2fd56d6e3968393c7207aad3144e97a7bb75389b166c65260652d217a1b0aed908ea2a2202deab17ad31fb70d5191845c4f64b24de304938c86b41413abe58bfd13a6831ef7a0a3df9166cd798be188757575fddd108f9e473cd1d72ae4215e6735f5fc1a9f1a024fd0b395ff07b9eeecd5c01860cbca7abb64b69f078cf054e8c8236d56e45e38efa609acd97d88517a98eb6b882b71cec6de9a06da5bfa03120fcf125533a3156cbbf00fbd4002becb15c590587dafd87555aca4752b450c52db88092a3829dc804c25cda8f0dbb992d4ec002042796625c431b0f5d4c8481b09dcd850664c22d67d7348fc457c9e244fa47418041646e2403cb60c663b8a14c0daed86383d363f814d3f3531bd21333b3f1630d5da90acc9876b15c5768631741c30b1f784fc5448db524217fba82a9040802d0085a5bdc25fc8cb89565995bd61ba20c2b7ebdca122349da1ca103b04f33f10b0c53cd21714e1db17a8c7f5552e1e569dc19f7f70b1f6ebf9e7388ca03baa153b02fda912ea475f6242b5f9d3d3f9c61c840d80b06a68572716e2e9b904a2ba7d998121ec87681b853ce68732c2abe8cfbad59ea8035659ab6838fc044605cead7df42d5f624cccc45f2b76ca9008f917afb266c4061b5d9510ea8ca5636d52d3cb26d293406b6989276bc89b41f077adc02d35343fd8c8143843da01b4beef44825a318fe4d60f1c58c77deb66ee33705cd6569ab6040fcc3b5ab4bff7fde79ba6dcbf963ed551a547bdc11cac272017963b75c32d8bca6e7a472fa060d9e6e7ce3ef24e6a3b4d5dd1391da6c26a9dd42153df853cb8e1048d41da06eeac333eb9d4be0d4a9dfe642cfa4bec47a973e5463b5c75eb36f5e888382fa586d541dd4dde63940f109c521b8cb9c1d774c6eba56bb641a56eb5dff596a9497dcf449754af2d143b94d7fdd311983c38172cd81956db31f7469b7a61d29d4abb69552e4c598e468ca74f2e777485e99408f25d5b42e8efa2bb7f53d32a63f64f01142c9585c794aa2112e3efca266712ac5deaea50e0c81c616719276aa817c841aba170c46f6524931dc5cafa9922daed2b0a8a29c78334e96bbad10a03f9df24c5759e67c34153cf9befd3f45466577a0b2f59554cec121fbee8253ce6e36b1373083e146542f9b05617417d1c86cc0d0ba8d67b9d79ab5d76f6c5a43d1846d1e5e98660a584de8f8c114a098e4696a34326bbc91f42ba17c502a45786b957fbf91efcf6458e7449f58c13e717b0298f7ae9047ac9925560e0ff5fb70ba802a9a443c53295aae28eda9b70d0c0ddf368051c4dfb0c36bac94d13fb78fdc823d5e035655447d4a8b6e390ab569ad6a34c16fe532bce01bcfd25dd7e18514196c3d35d1dd4e8d790afe853157c71c9a3e3fdd2bf1abfb24bf29dffbb14b129b125a467e0761203a2cbadf09fd5e7d8958af3f37d67e18b47cf3d4856c95c6961fbadfd8b1d5ab2526e0290ea9cb8532b6f5f4b14c50be94384d057b9a04093b297fac4150441a0dadc5fd869a1ef89d88b4ab9b1fc54b61ba4cecf7cf08c9093149cb3eb1fc3cf3243759c5291d1b0f9b4820ea8260d90d00ef83e9d64e3f36b4759b34a7eea00ab073cf87cc77a645ef57ce65084da4636a9d32374a489251df4c11cc03e576369479ddcd117593e11ef3179b40c2c99042a36b965873325cde102882c0bd35e3ddb99c1f637e0481c1614f4c2908acde551fccad4d9e321e506fd771b273740b898e2a7a31cf04f5dce4359a61576c470214524161015ac39ce0546794151d0ab7d4755bc0758edc9382803fecae112214597c51ef0cfb24ac5925bd7fce1949c414de281a59be0204949b134fe8da52b4ab2341c95a577c92cddf168d43d596e3e4d3e64afe7d72aa62021026f3b5b11974eb02f0ccd7aad2e9ebb75282012adc5c42312364ff26c35b56a723b6258d51413f83b51c17b5198a95aff8f656ff1f2adf99f1fcd68baa492ada967b7cb032e3302a70895ddd6ac93b8138ced9c6bdd73e814db971ce6b8d79a16e90ca439604985bbb527bbdd4a6ba252a6dce8ae30bf1b85c2cf62705ba24a04e1ac720d5cb96133b36e848553d19be80f3e247aaaabf1ee0003aeef4afd005c1123d325683f13edf31ad7baec44436c3220326214d58b81c1273e8b8195181f5f905fdf4214017bb12be02db08c817ce70a857e88283182bc0bac13600772e7409fc7c160eb474fcbe325e41cd1afa6b3ee2c633873722cbc6dfdb88e8f37fe991cf53b52ca908d3ff0405275e3e6e8204b1918d87dbe7c70c63891f58cf768a78db25bd252078825ad09a76d74e9f2d6e9ddc2981b6386ef311700221c77eefeb8b526b1f5824b95ea1a73c3d769d8980bc4355a8096431dcf84b48e25739f580f22dbb33b56b9839cbdaa785d9c1d324a6c661d0f2ed766553b6ebea54d899fc7e304cdacd2e55f0972a48d77fb8d1d47d13dde5bfa86b6c1b381b7ad9de41219bf3088cafba14a453e4ec45a9c07a939227a15d32939b9cd2dcee75b9552123d0b8081f3a9eb4e79cab1d2817b989ed6b43cedd8bb959ce951eec8c80d69ae024e0b88a773772d4777ce63e537c9635c7028fb2d9b80942012cd357a6aaaec87bc2f961a48ccf8273cab10bc5e276b08927fbb3b5130b74933a90d6f619b4b3487b01eacad2f118c5431fd4439de48090cdcb2a0bb9a72130dea7f3e73708c7aa92d6e76d994e820c39fe3dd736d87db7a746e52d85cc6c1556245d7cda4a11fad87a32a6b90d18c3aec289c27c156aa5d71bcaa5e0bb7828cae8408b4bfb66cbdbea920420a052ad53849accbe9be85daade041ea34f55a858fe4e9ea68071befd4d80657f227a8af0d7ca49ea46ecb849b4afa8e130acf026e7b7c8fa3fe47f764be7709c3bc55750cabfbb9742c2b551a069168566d8ace44371a885fdd54e4858d7958c045bc64c6889791b9e069dc1eede94dbd85d0565a04428de4f23538358c9a7602859930f68b9b4363cd7f8868bd5a916f1bf451bcba4c1d3786c876561af18621cd4dc053a3ce3d60e02ca6f45fde5951d51188fe8bec0e8003fcd506fc32e7853b2d1fb71e7070a3e3fa140e5844d9b3ad22a21ac2c547d358e7bb452d7c8e7555418ac0e3bdb9f3622bc63e57337a9e21af258420395202178703231593c1da7c8be49cb8e38a7ed459b94bb7a3d8f78308de22fd3394cd2862a277328888f932a4a725a95dcd6cb7ffa546dd4d548bd980bec97e9e934674971c0370534078d0b144194744aae16720e91a31324375385256801e6a48a0c9f59e5de52005185af83b25c5aa58f1d630175277fc5c41a1b294b3b972d701964fc66604d3437a5019183f0359b897ea459e72244ac705491a4d1ba114501e87af32ed2a3b8b3cb126de9df5d29358a437e5b4b0a85bdcc8b4734f5fc3126c87b2090a61de97dc148d40c0231998967730b42fe62f348e04a1d45ee1f1397e75a8a151d2331f61c204c6addbe0156a22858706b43c6c45cfc7716b46fae6759c4eeb14ddea99b629dcb26c04758bb57dc04da88d03d37b60e90fc5f3600b677a0bd41dba3514289015c1f12e3d02025a69edeb7790ea91323123ccf918ce0f908ada4aae631f7646bfd967ef4755a2d4195a1e55e5caa64a702dc97b991ebac2a32273215b368d109fe40cbc1b8dd7e5af8ede634a96dc7bfac22d6a6e92c971fd79819a74367c37259cdf607a78982edf1b4ce0f3b58b9b7e792c29fc6bf837e927a6432d75ba021b2248278cb774f663e2301b69318e6e05d043e023c4e0a1f5b1be0ccda622bdc531419ca48d76f0eda6f780e0c81894d21156e11ce19c4f36a42c5ad6581482458770a55fb2a1861380ae7db304a82ef53853edc284562a843b17d49da7eb48b3aa5b8e435a0b571d6b3ae6ec17a01a04945778bdc0be2f4a1345a5f89258f98ae21336a46034cf04dfbdea5aae17220d408a3a9319703827378830210a6bfe2f2b93ba3e0e1e6b5ed13a8559fd3696c7c5cdf02b2238975ceceb29c6b28233ce25d271198a4a70ee741da4b4630f24397c044a2e5f97a04c04df40a3c3847e8439ac1d2353b2c85abd3e7dc2d5090d58b2ddc5adfc0e481824f3a71db42c0d42ce597cf602478a59fd95c2200bc66507a092637f51cae5501d2b5f44d8b209881e74a3a69cdb4fac34e73ea22e788c8e54eaa90bb9646164d2721dbd315950aaac391cd383ea55714f64962a9d030cfba07641e72f6fe69d5d54ba59606e7a07f4623fb1ad0a95c3d25debc1cd2f41a82d85b1f9f98a66211a70d336ba9dc2340752e03e52be9515780bc8712e64f4fecf69b712869ce4468df67e01fb65937300f592a9bfeda4aaa208ed0141aeaedd072bf737c1a8f12396dc0cd040470f56e384c8262157f2811a68265881a916ee85a712f40b54864d54b4e055260a81b5bc4970078b26ee65603ce85492e70fa3e294cb1f0d6da95080922683689f2e84da028781f798fa1f5ec862a0097c27ef952c01f290ab21ebcb4b3a312ef967ee236cd20ec16dda767447ff7a94b7142f3261b78c0d84047092ae49bc1e95190fae8d519064ad987f621b8f3584531d4ad9727f275a255b597b8d1ff532121bdac9558468508386cd5200e89afb8140ed0cb65687f2e989a91451e37262d08337d2b2e39d37ba1c39a29d1665902d9407ad6132f9bdca2d5af6e81b4d95a47863e364f9127470bb2786b70d4b5f461510757371ef20d3b02baecd153421a86c66a359f0e72b76d74dc83c63e337f04708b44b4a733d575bfc41966af3406d71defe4a00907302f8280c9bd056105d346e16031f0c7cb0b443003eb015c469dcdb1d89cb4ee8d3279354b748754695986899e4fb45e587289f82bd956d63e5948692539e366c99544d13234dc32f26fdb475b5c595b14cc10d283ba694ba96a96b02c00b8445307267768d294f0f5a26dab364e0bc71d11a2c01e785029902b7aab47abbd5cd7dcd98d2155ecdbe063a762e2cb3a28c27b1503f47cc7ccf85e8ff0f695ebf68f8e0727350b24efc66975229d80cc59f0f69d173aa343d73942994afabd3433d77e05a8ccaee8e096ed5031ac3b1734279a0b6592859d41744bc6e21f9bcc0d39c267bd2e424d9cec1f03386ea38c499c5225c6289e5836085a2b7c6074373d5f35783fa8df9e7b0a5f4cf6059aac04d779193102f56c07a6a6eef15bef7b197ea7f6ddf3d6d2abdde15fc5ba12b443d1183b172bf01b8dafe3b8e6750fe66a145249f38459e01a790c784c3e5fd401fd08217450579ab1566615da05282824bb3c349d4f9c6d5697599366c5a9d1294d90bb541d5aa105b36cecb476f9528c9625e9ca402caada370f4ec1844ae59b0ae50db2e7ed3e376a10422e0dae185a23d53eab019dba9f5f02304b6c57809f2d0de56f18c05edd8d8b92bae628fff2f506afb29dded3b0a9bb74fb27ec30440fce7772ae0200a709850102087ac4d3461db2c4bcdc43a2cbee08306e8dfb82b54364de16da543a2df4129bd0b65dd31d4f0e620f4ad60f3433d1cfaf814a872f97ec941f569b911c9aa10f0f2c7b74b5e4dca2f87d2264055d34548f95a0d16e28e2c3a4693845f3e2f806940fb23c99a4d75c40f9641bb7f7df6b2c7690a71a8a1267d7202eb4b2245740dc0c79ddd7304df68c3d4149465e0436e3c8310e0cb09382a84aa46b0ff656a34038087224d31f37b661e1f68aaf0560d93740380ba871e2fc166320db3bb2e76150c487e0a923b722c13bda94a95dd0b3e682712feeab11f9162f2a612908c18ecd7d0117d4fcc567d3a2427767a61fe2d37ff123b789b8552ef850f8d0865ad02681613c20336b3e637f17a7e2dfe7aaae07bedce437fac3b86b89d9ecd21905fb691dd6d43574947fa7f4c3f1cb8d146805f55ed2dd651d478e748d2251548aac067b3d561a1ae6aa7168e50376cdadbc940905abc556c43566ad1cbcc12b88a3ef3740953c795ed283936e3374e9295bfcba37c56cd54c1b2f813af14cf5f359afb14b8a984fb5101b39111bbb362f2ad5e4f1f96a4ed03721b110903c8f101ea11705c526f07de0cf74a9b598021afe9f52809289243fd615c23a3899508558f838110a19f0a96699ba00df4929796ac7fd2b93e15296b0ce7198c7a4b2381fe88c9ce4c6420811905cbb7dfaa315604c7ba676394a32cf3f2016c696dc282cfa1899e6531c2ba657be04d6973f3289a9f1383223b993122e216a375f32a3e7d54c349819a506fc397f89e17e6c04d2f3b5ad6a0df09fdd78eae97d28b711e3836179212fedb36e8e07e513ac927c64a1bb95c0cbf2eb44e1f97f96a94232157efa31c5e39dccfb5c0b8e17ef121d31d5c0f68a14ee70a5054c28ca388068190bc1a5168a70b398263426c3b6119efdad032fe7b7e1f8cf16a39d177ffbafbd0584b956305655fa1c23fd6e6e539be0711c189a46c95cb95a4e84ffa8c25a94e4b254a297d686665662f0c76ab14a157dbe7cf99b7d54e106c67a6e4e9c7d7b126eda0b80a864ef01984fcd54c0c0278c421e5b12da00e6c5d8748a84d3e2a273c299836435123cbb21296015ff70ed3fba09561798dd1a9bbf3983d86ed9027f72bf698671395ab3b76275a4776a5956635d50b55241085c84e833b46dfe5237ef264dfd6b13363c64d1d712b32a14d6f024b24c666bcf12bd7ccf58398fc310da4a51ecb74e7af8524baa719f6c5aea1344617caa8da9614a0b2bc5990a108bb8d99884813c686bc40e40435fc3fcbe3bcbb1a4501e8ce3949c7bb35af658c6ba5342c88c6b85617abbc98c99a878b5503f8443b9fc035adde5ecf6e5d7e9954e41329aa840baa78cdde746447b2cbe3dcd029ae917874a792c836796f6bbbedc40196d7b0731e4fddb7cf3388c998391ed7c2e44192c3ca79b21aa47799cb4f7ca862d78af704a58eadf73bb757ddea7353d54dbf1b2a6ee3042f3a6469d4b31a2bc529559b70e75a09fe6f7c825d197d481258c3288757f32f590e5bf38de6540c1b37d750fb526f65956c4d4cc8c53aee76b7ee9e13bc803381a99633ba56d9f358befe913c341d9156292dcd25916dc02cfe301afc793a63b16a1fa39e4af620784657b2134bb7fdd2e6a0d963ef7af5ba986da1a1ce2219e9a7ba8d6050281aef47536d0fed725d6761b1d7fc92b1c051bc09226f2f2ad6a660e2bd5f280026199dae4e41212d53159441fa9ced434cf210743f49f79328753d639fc059aab807271910036b89153f3e3cac7fdb8c0eabe68ec7e54012e42e61a55b3b78b496684f6a32088fdbdc1319e1553580ad5816283114f13785ad73c5712547623540137b8cdbcc596071cea142aad8505c470f89e17c01e3117094f25d95c204348569d2a6f64edf76a0ecd8ffa75f7362f67cfd613847db4d254898f93a18f1aaaad00572dc7fe7ca9c8ab869c4de71e851a17daedeefcf9222522dfbf0174f5dba9173efe680b30cb197cb4ce16357ca76d72f51a4ca5727eea860ba3d3798719b34aa2a631e7d61560d098bc44d2280e8401ebb97d760cff970253ca954f8c373a04b991d4f3ab59b83731afea323e5242b912fe82051c2dbb669e84f6479555e29471f4c29c90d1284415f4fb7a0888133826d9c269c4134a1c41c5e04256c9e196d0bfb36403da7602e83639fc076de9246dfdb52c563a99cfd4f6f262aa524b7b589f9939a622bf94e36a12dba3179a09b2af8f35be3474fade0268204290cb37238218111149187a649d6354343016e036c60b176b018acfe3e916a6522f6f66440a00d4c581699a1097184a66b091dffef012b51d17989c9deb17ef854a35d4f6a10263c0699162a252a6ebe4fd1153ffd06020ddc17174cdc010f160af0050add8e06850d8290b7cb4f7397ae80ef13aaeac5c1b09f2c046985520d99566857e26a7878d2c0326aa50af36074cd6bae1b8c1d39fc4de89418c7150319c9053f7c80a09172d9716de30ba280a448784854cca01b863f11d5e616be4a9ca80972853f87cbf05ec841c1091f7dde0c2f68084b7557f2a2c67ba00b2e8047cc0e6358ee6c0d1912a1150e7d8f4f5b1c59d4acd28748988dca5ad40f67373322d1d597cbab4828e82ec4bd8ab6e9b408976f046f5ae0ea7fc270eb98352c77dd517cf4ad5d6c36a2a533b7d87cd0240dbc9c644f4d55357af072a8ec3b6baa1b526996eaa36b0c682159702395fef6f20d1e167cd282127c5cd6c1d038f078cca8304b651d1cbfd9b845c1a52f0dbf2ddc72340940e5d733f91a5db04d6919fbf30944707517d06585a8b6803d87ca4ff6f25021ef6ec40f18b5dd10b0261364e385a6c33533fd1d6498a7cdb2aab52946e97fb80f830a70fb38a715192bc748b3f7c6ecb450aac6b0bf3974b974a8ca15fa426a9c3891f667308dddfd6fe3b3cbd44eade08ec2fdab4b5cf6a4bcd317ed04520631c71a4f3426170efe77fa4207031d9378d87cb2e4fa1b73f8d3baab605ef704261070957c90d3727c748d1b8f483d6f7ea50eb69d11283b686a12dc45f151a6e6e84a9d36008528b6e97683a2536a1ec0a9ef58626216e08364553816f4f5f2bc12a1c1acefbf6c08407f3d977b54f6fa7a7bf023293ecf92822e539853b56da43718587d7b3d32f2dd62ddf4eaa53cd505fedd05251354106857361d00bec401bec401bec401bec4097c89e344af5e7100b4c6a3a5ea419482b42d25eb9672b32edd4892dd424817d609b9565c89ea245253976b18a61194c556b13794e4e42071e1350d2318d484ec9d02de150f12e811284520028617d4769a73c2ae4c6004406814303c111a8087638c4619638c31c618e30a9d9200027a8c402683e6dc03954e0004dd853f4620805b4ca724709a41ce0f3c3a4544153e5820f26e19141d08004248f7d20e72a0940526343783259c9440d5a4516e5861830d94c1a8512a3180c02b06b54679820b2749c63046ab84609141b818a31b4576590b24dd5921c83b12041fdd66a8a2c988215548b94e0f9c9082311ac5870dbe27405ad0a9297000c66d21d31c15313f6a5417f4892807001882498aee868418a8413846ab70026e30e466eb930f7cb6383521f5e9e8a8a643094c5a650108fc50822d0cd15d163841a832e8d028048880079a8632d0285a38e2022e6881750fa1036560800d0cb40a470e01cc7882054e9d51503e138af3686f722888150d3bdd6134c11a25446954a382708df2849b29170ea56970291bb8195c0a0eaa479f2080da01a54b4949a14e1cd737745e77cd09810a826b941fa9a6a1e29ae3b8546a47c7d235c771a72e88e350b88ee34e2a261dd771289d0d481ca7e250bae36478a74ea58a59710ed57528271c8ae3ba15ee0b1da7d2290ed59d9ee394741cd7a52875383aae53a13ace0a1dc7a93a4e08ee068e3b752933489d50667036701cc7753eba1a29270e035cc7a93a8eeb4e2fae43ada8ece85a3821295caa8753100ea5eb5037a795aee36468e8700340ddb0009d8eba4675d7010e758a41a53aeed4a908704ee0baebd56ad55c7328aee3b2c0a5743a38ae4b75dd89e372b81a2e856be9baae53f57039ba0ed57136278fe546ca0f9c0c1a70e826c0a5ba1b1c8a3b71dd1d75bec2a1baa3aa7618a78053bfcc80eb2136e84e9c8a43a17032b853145d97c23a713b27aeeb50deb5a8c470298e43b141ddf060c3752baa948ee3380e85e3585cd721e1a4e2543ad4a9c6c17423c79d683815968e4b41e1ba21dd0edd0e9d0ea73e35478353751d2703b53aa1ba1b5dd7712a0e25e3547ae058521d97e266f4e0388ee3707442282c2a1d174b6941e93821b8148e3b751c8a0be274e87c7439742c1d4a97e24e5cc7751c8bd3a163e95050dc2975e2b81edc898be154b8168ee37e703b742b27142e05c5751cc7e238950d5d0d1caae35228ce47c7c29dba1db8d3a9eb501d8af3d1751c0edd0aa7c2a5a03a8ee3589c0edd0aca8943a5a0388eebe19c0d1d29404e40a4b813a7c2a16c702a2a2c962270ecc00500c5759daa43796e55c3862588e33aaee3388ea6515a6c2296e0c218220bed436c008c2e867881c2158e48278840a9095fb4ebe5089db4811f7c92f441236d400b0c20bd58232136a0248c23b963c8d00676e84290ccc1c6c7066cd4f89033ace8d104193df47859e1749ac099410736460674fc0cedc1c8b0030d8c8a6ee60b0fd819b7d101c493192df000f3161efc061afa09008c6858aa01ed2827ba4fdddd37f5c197cd2f717cedc8b25277db7cb5451fda247c3d99e57ca99aacf8a0832614151415d48c141d1495930e2d2e268a605262542b293ba8161a1caa45f542d94e324e2e282f9ca840936a4687a2829a91a1c38e089a568cb44cd4cc0c26ba1d38524a284e0544064d41867c5c9ce8502ba82199303449a1091d5d30c1a5582e3c0c61a243e170a211b91721292086d0a452f170d4a4060d1e029c88305180a61b2a475a6a68a98109500d3105af80a1094856210273c00a45e52423b584324002984841cd50e9c0d1c861620a1c50d141842629624c6046c7921ae282e20355e48bc0a20900a4625680567e502541e940f1d1c40a3640a4892a1860c3caa6898c6fe8003468621965167042060e0dce480ea71f283774985841f1a15a499971ea2144e4a4c30a10189a5650846424a504e1f8015a51096a499a4056d074036a466745c502800cd50acb0fcc111e685a4909da218680a6d46995e25442a856523f543a84f0b08c2a395282542b283764f8a8f4802a52b9a1861c7ec0c1061d29401441fa818995140f2547464e0fa1239416140a0e29d64947a50595c387a0a8a0aca06a5245503b43b8148ed34bca061b9594efe4e3e7878d94151b547a30d153c4b2232506d503aa0755154d3a66a07c5240a47650e90195038d9b930e4d347935dc4976a2419d52038039e2012fb0750422e8620b2c4650c5140758220926bc24fb0f764412229018514a3a1a1240106b2727e6071f02e0281bd4600c2d5c610a4108f10106871b284f78b0830f7840889f20583ad4686151d1400b1684808a0f4c21c5069e60402926478d67810ab892c6288317624468210b30785917073080ca84fc5841a1a2014e7aa818c10b1050c1f2a173430d2c2b292839e050410a92fc342a128010d04f0616608002d0f0050f178c4004552c71c4480f1d1b35a07ed045178c0809a2a382a222c1132c28010724f000040c400319c800038c8a84fcc8d1c291e134864e0c54189e850e0cd414ba26a4bee08ed015a12382ca105a84d0fda0f341a7454782d308ba259412ae078e87141d5239c8b8d1ddd0d5e06a7001408a86ce855ba166742ca9954e2525a54341497528eec471aa9641e384e3f4822694029a50432a1dcea17c818995079a52a916941f8ec0046a0337a81b5aa6b042758026d4908a0d2b39d870a24965081411a71d58b2aa2505286547b572fa616325a583a6942c9a6a48c2844a8f1306b8d0c284a6d4184da9161c88d0d492615ed0a462634687f223559382001435586e4ca00954029a68bcd07839d1b8d4a4d87019a3891410293b28404e344e4052a6683a11ddd4a8565457349d585438a066586e4e1caa0535b3029402026508150eaa159592961a5a6a50b1a16203ca10273334a1c2e1844513292e9a7c50820afde5830e28560b0d950b8a3bd19c7a50472d37a83a94232838508a523566702a96530ad5723a9dba13ca29e5a4b29203ea84a28442038da3151714150a774241ed40d5a0b8941b271c4ca8f090b2a269c6154cb8a85038527c9a4031a1099897f71867988211bcf8411738e0629c2535c0c90f4f10417ad8aa852cd4e458d14841298208a3a2317a200420f0c0009b282630a4024c28820f6e0003158ce00335de0f12183303f0fdc216c248c210845003142ca1c4114988406254440488871d6eb0418b162c3102112891c44b871c6ce561061396b0246c1ae30c61004392226eb0c1a50837b0410c60a082149080010b30c0eb88218e181509f9a00736e0810ba20842c2117c70831ac0e0051e9802010470620b61146108307881162568d2f453e8c74546185180021370508316b0e004206880027ebe8e4852c411a19f1f2c1917193ee8010e3060810634f979840084807e7eb066c8407514a0e0831ee4c0062d60c109480002072ca0891102100af283d563c78d0c0d2ea81e230a5058420e7060831ab48005240081031ab000053471c2cb882441d4786520c350111a3394908393042000c9111b0e28000137a610a88c713a4367861419ba31a45881aaa20341f7010ea7bb39d9701e0bcd098893dbc043970387030587d30dce06ea06ce061500d040c36985a2d13263250387961b2c39acb8a8a0a4a8503a952a953a718d430e3ef4aa253f1893b9d22bd6fcb41fada30edd1c4a4b90aa572d38ac5a68e8ee1f7ac57205198f71ff4971a58ea967ea3f6e575e49fb5c526761014b0a562c5474c37c56e9d36c2ee34180784c10205ee9ec632c4c2b96b01be632eb987abec58cf03caf08a120150e36dda91f30a91cddcd43af56c0687cbd7a3f6729d6dcbc5ae9c08a934a33fee99e6d75fc76ba4ccc7f77b478b5725792f4ac9fa5e3d50a90591fa6572b2b2a6238e832eb7eadecca8cfd67555e9a0a17f87a97f6851fd6fc4741acd2c40edd2a03e87e0c4ad98f3777f74b4a4a8d0aac6b68b828f8b871217eeff8e9f0e163c7470f1f3a3e78f8d8e123c7078e8f1b1f363e7cecececf4d8d1d9e1b1b36327670767e766c766c7478f9d1e3d7ae8f4e0d163478f9c1e383d6e7ad8f4f0a1b3a3d34347478787ce0e9d1c1d1c9d1b1d1b1d1f3c7678f4e0a1c383078f1d3c7278e0f0b8e161c3c3c78e9d1d3d76e8ece0b163c78e9c1d383b6e76d8ecf091b393d32347278747ce8e9c9c1c9c9c9b1c9b1c1f383b383d70747078e0ecc0c9c1c1c1b9c1b1c1f171b373d3e346e786c7cd8e9b9c1b9c9b9b1b9b1b1f363b363d6c746c78d8ecb0c9b1c1b1b9b1b1b189d930d9fc2ac5077cbd70ac353994fdb59f11dd3d832a626526662526094fc207e03eb332b332007777ef6e20ba5b4777cb74372a074a17ceba02f6c40a85090a6d85620483396b6506067356963de8be0293c9b419bdee59f6600ccc59f3412a6558060912e4053fedcb328cc9b142b98162c36772e4f02c7dfed247ab14c3e866a978d0ddde2b5508da31cd63cc1dd3a7e53c12d9ecbd9667a582a2dbf36a77a3f44a35530169190702c46f62fcab2d8279b5348b4636ddedad5251a86aa850dd3231f7a98ce6fa53287faf2466f480ee2ea257a928babb73e8efcaefb66694c75ad7775b3b38378f254f77e3c0a11b9463fee4fcfcbdc8f493e98cfad0f2acfe10fe6e8b361b6dfdc9b6285b9f59a52095d735bb91d23d3fbc5606cad07d848c7ad4743790ee4ed22bd492eec6d7c3df95369e0fcf8666524b9371b5df2d8be14f35cad622e52792eb674c71b55f15ba3627cdcfe278afed999faf15c53129db22fcd316e1afc91f9a1494b52a742d90ccda7b549f4877dff0f3b3fb44b7bb8ff4ea64007cbd1805f3b531d9dd35ba01d0dd3d749fbe709a020d3f82b2e6b07b7f605ea557eb309918515e5b1d59ac0c8ef891603e1f04e5d7ddabeea6d1dd33baa5bb59b80b74f710bdeac455077638e86e67e159471b7399f53c5ab7f985af77e3e1783734f8f32d569383b3f3bd8fd8f4e10347e7fbfe8626b49f171b6999ce6e37633afb5b6367577e5e4da5a1043f94b806dfc74a351e048877f74aa7a4ecd4e855e79d292862876509a3a1579c17ba41d9811b7ac59da0bb6be815f7a483dcc79576b78cee14125cc6d79b36acf9beb6e290f074b70dbde266babb3ee840fc633ec1d1d2b0cb38a631cef4b352ff9a0dffbe4469c3ddadd2ddcdeeb6d12b0e85af974399aabbb9eeaeafbdf7bd4a9f5fef98ff7ab534cb5c3f7c500ca9672a6ff659a539cbf05a99cb4ed5dd39f4aa99badba5570d81eeb6595076bf66fd96e92745f9e1eb7d5f7bd9e4adf92eaef92c08ca9adb953746c1ee4e9d50dddd05d1640828400111951bb6b84246053840e248092f70c97cb0830a2de04fcc8b1476ba00802dc51b43145728020d3085ca0e8c8c066eba00c08d03782711fbf4108412280820454a106a5421012cbd455353ab4f35b0f0054b4a2fa51ce59d8c1f98254e5c11965e724a81294d9a60a243c12ca19ac5a1008542a152ce71dc12e72847f10e09259c0b600995a390a8759eca274fb9ca879c52a714120258a295e2a7160a0cea652905b30489960a4cca513027259d73282f4b2948a050a7d3097542a150a8d3c939194568b43aef1408585a49e7a7ee65c929d542a756ca6fae75aef214ea65898dd65207b302b3048920ae95e22a304a500eb30489160accd2527b2f91c2752e90f1d2390bc7f1c8484289ce53609a3ae75a525e9aa7a5c555505650be22e3a56b82f216e75e925071ae5391e14ba8bc3c1104cfc9575e9a40c1f19cfc892078502897e1ae93732c2fcdc3f2224386afb038141ccf4a931667e984681e95262d2ec3b99724569c5381492204ae15e73c0916ef56327000f516ad2514980fdc3a57c17ce076f2205aab149697262c0e85f3ac78ca4b13199c0c98a69373cec13449428993afc0349d9a40e13c32fc2483885553535313cfc965bc24a1c4c959609a4ede0971729d7ce5050a8e67c5555ea0e078549ce5a5c91341f0ac38141c0f8bb3742f324e327e70088172194ec4c95b3ce5a589ca91257864c024e149acbc24c1c2b2f2a2a2728e27e70cab253d464b05b3f4815be71fb8a11ce5271c429c8e381947286f1947273f75aa15f0742f4f704fa09a40c1f913a99494e78cb14279caa907124828d1f9c995e01ce5488400892650384fcaa5e2295722c557bc619078c27952304828a1f21518289ce7e42a304aa4c0a41c054609158ca7604edeae848aab2c3b98686287133cdc0b141d144da040c1846049104f84604910ada593776f71846547d3aa731627299dea9416e73f24805275fdc3c90f09a05234486dd19d38cf8962c53987059785173a5cfba975ea5e525ab4b3383971810a6500238c968a8a4ad7a756a9da533e12e063013e9ca850d1c57427142a8ba64961d1c59c3c8702abceb94e41d1c9b49f9c6c814ae9e1c5a907e7dd354c2a05812d68783144954249a5a454524ca9148d9d9c24ec00614a59a1b418aa16e3c90e5457a8b0c0828b194052aa14151629289e702a2c52b050350ae5291516adee8b275ea4742b3096b052e2e2c486289a75f25e69f1f622a80546494aca0a8c9215171c0f4ebc4819a033406743143b606a3940181df7040b139c5a291825b4d5a53ce5d483c553304ac456e74a68adce7150c2e48b5607a3e494938495ca555dd7a9542b2aaa2d9cc322c539e74cc0a1704f522a4820f1a28544b5054a094b172b5db4545e9474195870d062f9a2c571471c12293a46877bd2a5a068e1b26871aeea3a94379842a150a81e58b8e8a2eba18b61e9e224c3e2458b73244f3a1d161c342705cb0e5a9c732c60b4386e8b2c4e302c5c340dd7a5f4d0438bcb31c22a8ca6e13c87072b8e6b2e5a9c77ce12c64a14357c51e38baec74eef9c50507694b0e280a85a0581e6420581be424aca6a65c38692e66207c889f313f745eb8b568ba1d519610586c6174c58295971a18a828b56e7349ad0ea56b84889a2bb02185f80e10307630b1a5c8b9314951a3800b878e74734b892ee62b54a51b202400a0d356aa46aa46aa46abcb478b152b272b2c2e2a56b39e974ba56b760e66a8ad6898a16ad8b39ad9c3879b2c2826b29c2aaf3293c6151a1c8f8a901d3e2048b2e4583ea8a954b18a71e1c4f1952a91a30a9540d8ec50b5d0c8b1829ae4f3358c26871d2e99c7288b04275312e376cb0b070292f2bdc6a45038c8c1f4e49ca4a890d252931c2f8a9e12c327eba54aa4b75a90e66a5926184e24ac020a4767431279b2e26072b252c61b44e2c61743a9d9fbca589c50b2c62b4346981a2d371d2e9e0489d5c4584e24a3aaf01939272161b7ec306cec60db7e1ae1b6ec386dfb8e1376090b8b172d28aa259dda9c70d5792d2a2218386cbb071c36dd498a24614352e50e349a773839f541ba8618b6675ae1263e56405814ea7869f7c15c58a021b689d58c210a375ba61c36fb8cb86df804122042947e286db48c1b870701b6e0306091b8e030bca4b8dce95b050a0862d9ae6c4e24a58c25839a9f1b282c02a8a0b74315dcb0d270e47e7371c07b7f18243881b8ec30dc7c15d38dc86e3701b8e72e3c5c64b18505c5c6c784979cb70a951a34657e38506d512ad8e06242798245dcc292546d39cfcc68baaa9c35845b17262c54a4987a164e5e4a7731b4a56add5eab4721c2f38bcd87071711a6a2859a205004791f103006739c1409153c52ae52e28285ea3468d971a68f01a35d0e02800a0c1052645490a0a1a330cf0e4c5490d31689d5c25a54375d7a166a47c48a752d2d24ad2d5e87868c275ce104e0468711a4e00193ec3877429a71e498420c59368711aae92e1337008d1e234dcd5e23464f80cae85b9568aa3ba1a7284b04a5101a3049553c56ac59988a1f2a2846b192928577959a29582d2838b948c165417a830b0740f4a707ce14506bb18546ff3dfa133ba8cfa8faff67e95eed019699f15dfcb785432a5b7dc63cd2aad571e3931d910962d9804fbf998e4c1d7abd9a3a9b406949f0533f51a1d97bcd7d1679536012fd0dd4f91409b2209dd1deb95929fee796d9677fc5e75940550c2021bfdee86c11e8ff2fb58be52744cfd88666501e00c15650db802a2ba9de58f3fdbdaebf6d59fdd0f3fcce028653f5fbff4c99b5f194b19d3bf6cfe5a38cefaf7659fe5ecc19f75c4e2ebca07bff1b3ad7db6b5d77d5ab6195370e993600c94d88af68a768e18cbf9f9f15fda37da5a4825b6e077fbf9dfc764ec639286e6d0dd6eab13e0024e10f2a1ac3e02a189dd41badb252523c57120287b26b546ee83a0ecb1730c5f58da5e768ef893f8beb095557a69a3184efaa2f8b32f4cab48f30429ed132966b257acddaf06daef75cb9426734cda393ebdaefb335925d1fcfba228ef113b4799fca11b12dd64ff3ce187a44a0b4e9bbd3d18670b265d8964654a62e8731fcb2be59547b9fe7d5a15c223f855a12b6949585e7934cea8acda9e7ca5783fd7d1f6605a84691116a96b8294d6839fe63a5a9e9fc990fe3d9a517c8d3c9212bedd11cbbf2e91d2f0cfd187b687f6bd0becf1310a8588dc9008941fbd36631a84454ac3472e2c248632e398e4491ac76e2e777398bb4bba39d17673955b0abb39905beaa4b105fe5765cf7f55d6fb354be4be0c57795dd516dd6aebc59bebc664ef11eb938e847b8c90fc268ff0ed8bc8fe63748eb2ceb094578ad586f4633256e59dd1b082a5740f15e8ee7e81a1bbfb15062c033e94801c70848eeeeea8e000088e00d0022e7a74371784038a307262000c68d1dd1c02acc083cc4d01b1a2bb39199c9608820084c084d6dd5d01025083069ee0430e74d0dda72f60e188125c51030a60a1bb39243e000216369830840674378745cb015c38465005a1ee3e050985706002ddcc08babb1bfa09220a08c881803074f7a90603bac8c204a2d00208ddadaa4004c4e084c03ac390eee6a0f08506205186093ca14777a32c0043a1004d074a9860e3e1d468ec673f7b5b012f08f44b071d1e38414794a13dd0e484947e1d11c511517433d9349edd161179e5914c66546dd66756e9bcd2c6aad183dfed7b191d92571e197145b78d637acb62f84210f918d18411b3fd06d6d792707a10c7f34a5bb5d9f9ea6e1fbabb30ac8cb0d1f87a623826e92209029230f5fdd995a03bd3a49ec4c3cf34094a12547703f5aa8817c8b8106792a13f2d579bbd33311cfd69d948117b2d8bf57a11ad88a0404d4dcd77b1ccfab598d6e874797fbe187eceb2e7b7f26dcdcfb668ca0fb27d51d2941fa4f4d3f60c11ca2b4531bc34fce3924702bfbe6824863708c909ba3bc6677e8bf97df1da10c9ec6e5ac718c7488820e9a1bb85d030bd575b5dd6c78ea91fe9c1eac80962c231a44c32b4b3af476031ee7e44c8911f47568c80d1322ec463fc9bd9af367944841484513d281e1410d44ea36a502fdd2d805e1909d2f87af769cffcfb32d9c883ff6856298b3593ea0f12c6a3a431fdfc2801b922208623283f3b843f8f7895048455120fba1ba9574903e83622c94c11499e968d92682051010902445dac905ced3393c260fe604cc2eed7eceb3f5abb8f613710946395a1dfcf12f48f79959f7ba01c27add159a957f9317dfed91c6348334264a18d48e2cf84629ff11979a588f17ff68afeb159a3fffdfdd02675b70ebd1262052b2196f84bc7257f7d663e1e679534a7b98c843822448c11497ce643fbe5d11e51a15b66dd711da710d1910d564754741b91c427f5229278443d48dce79536518969d2d7acb4c85fcbf455881040be37921fcb647607d7c80346b1f63edb9acf2aa5f92bbecf772c6d463e1475019bf683b9f7d37e0e64e4c8658cde0fc746ecd7fafc4cfd3e2dd37779a5e85a1541d1b8bee89fc7ef99de6df6d6aae8c856db576fad8a56e0389ff6e1b1d545f7944f9b42f2e6f48ae800dd0d9b14e69ebcf2c8a59ce2382b2d52e9d24b5e297eaf1aa6f8ebcfe68f3f2e113285d0b00c9af269af6f49aea3fd5e331cbe9864f8fa99c4f8c317930c5f3f932fd0dad8fcf05259b59f2889feaf8b07df7e69ce4a8b18cd2aa5610926cd4a97f087341709558de252ba555d974aa15028d4e9743a9dba8e53a952aa148a2a854251a1a0a850249edf4f2b1cff3e2dff64994c42c2b3d2225782e3ecefad484796136b4d9d1f1f9aeb878878a4744489f65122ae12127d251cb1e8888f9c241dd7922190dc7c326098695e96495cb374ad2d7ff53c670d2129d5d1cafc637e93618c7b4c96be218a908828b13425adcc34be9127a2470f0a6484088a644909528e8bc991008268329a245afa41120ae198d20c8ea1ebf0c0a1690525f9634bb3390eefdbecff7726fd16fbfb34173282878e1136384490e8469a3febcf6dcabf60cb1665a62f9a5f6d18daef95afcc49478fe50f650b267d4c3feb88416b6359fcef931894f2357ffe579c2d885f364bc32f5b71c50f8aa1c42f0b8ed3862fd9ad5d5a9ed4f67ada7793e0cf172ddbfb4c7015e233e268efec25640a0999423eb7db2fbd6ef76bf6c3740a9942785a7a5f7c4d237072e63f7e8576567985fc4767a5afafd1fc492146807c6f44888ccfc400f9de08c64c3f69af8f8665d0cd7fbf29746d9620687ba690109b181e62b1eecf6b592c9fc994072767ec89c96a475666a4c8f746e68742f8736edd32fda4a7f58072feacf6fba459a54b9fe4c9f4a3a0c8f4332b2d924711539f7c6dac35e5d35a9648ae8fff1edd8c1fe9683e15c7ef33fa6b7b6e37d79f904ab067cabfb42caf3c12477b89fcb53d99f2c4244865ad855363b18c88a27ce5faa128cad7b559b2583835160bcf18e2857e2a1b6283212b1892c510127477b574f6d7338dd1b8f4d05e99ffb5194f69c1eeb60ae28a213bb85219daf93549737c9336503a08529be3299f368367f0fdfca1bc5204e5b8e4314da6b1d51095b37e5ada27ffd6d1e7dfcff59d05ca7a3f578aaff71f056f68beaf651acbf5a948bfbff7677d3c857072461a964141e83085c0af55d27ac4f0064d211a96413f6dcfa4a034c262552a699fbc529cf283843ce96efcfa6bbf57b6532e8156a4611944c33248488a03dd2deb551024ba67e7439055770311c30a8817dded4180b8b36030cf588afe5f95b559e5f7fdb43d0770e288159021d8de67e2b34a6f60b53ee5836eb3e34c634e65b211fbfc2ca334dcdddddc911f5be0ebe178393434b74caf14757af5638925fec326e7081caf92961de3076f553afef04a3c5a5afb7b2444c8ce08e47b23407072467c1f8ff7973e0b7e76886670249a7fbfdaec0ececd285931a80005a2e8c7d58af891c20f49a5337a8d2668346b0be79f5de9ba615bf43f9339c948f8315dfb3dd283313aab2350b6e123dd18b13132abddfbb364f4e3c2adf9e167a1f0b310cef448cfe72ab4c3845ba620cde3dd7182a5cd41507e3ebdda1942a4573dc2684973e995869fa93f38ab147b6bd5238beef6f0185bf550c2d6899333f6e059e960c103c1b761e933b34a33be54e632ebeedd407094f9a4d3f1bbcc3aedcb9207c748ae4fbfdaba3192eb873729be1ecb071f29fc4cbbbb014efa99503c64f3d89a5f6734297c3dbdf9f559e6510c6dcf8c12859f294ecef84c280f27d42a796695d2bed11a9934f648b3390a207fafe4913e9ac55f4abae5a79fc54c3fab100f9bd50e27b497f1cf6623f64c9bd1d05fbc65e9d59f96679e96c37176252dfbbbed8b9276c4da68c70f2fdeb2639c2d98342e91a2d1acb4c8ac7469951383554ece71cf8824d982786656ba5444120f3f0d4b10fb67f951501ce7fc9f8e29cde55eb620f60f6976998fcae8f722a699952ec5cc2a1df6aa9662fc18f6a228690e9b952ec1bc7e8dce64d6fffa7ff56532eb553aa6fef769aeee56400270c8e0acfb5926f1f56e18d2542a731d6d48f3e0d2fd90c5ba6178c3104700cefa6b651f7be125f9e24b14258bf59582d5bec23aa3492c968f1b1e3c702ebe71a2efe74c6dae9fc950e8feac52207176045219fe644b91627f0494b31fba4950c4d4c785671204ca9487c57ac92c7d7478e0fc5f9a6b497edf17d1e1812369493a3c70accdf54b12e4c1c9b149a49b1c9b44b2c9b149241f383689b4836393483d706c124907c7269178e0d824d20e1c9b44cac1b149241c1c9b44b2c1b149241f373689b4736393483d6e6c1249e7c6269178dcd824d28e1b9b44cab9b149249c1b9b44bab9b149241f3689b46393483d6c1249c7269178d824d20e9b44cab149241c9b44bab149241b9b44fa2a337b55e305be1e7ef19633adc935288f0add137c0a74cb1e8874849fdabe6845a30315159515ef1653515159999f330ddf656a300daec19f9d3495cab0c652cfc39f9d35352c2ce64c8b3122d7af7d11fe34978a8aca0a8b25c559e59de5fab59f154d537bf3c311ffa541f2e6e3518ab9febd634fc674a8951fbfba3b00bda251b5379f82a228bdfec71c4b9ae7c74ecba374db177d9693ce2a7b44a5fbb58e48f763e113d50f67f2d2c4177ef067957e75b4f5917072c6a48c2b95b3afd92b8aad5ba6d72a9144f7c53129bf3edbda042d0dffa5b93e5b23ac2c1d2767f4cf997478ecc8c161ba99bff4d9a1afb6e8a3b56a7b8040a23fdb1a8b75fbe4fd6cf8f3b3354273c3f07593fddf64ffb1950e0874f70bc67fe7941ee4fa719bfdf6453e0ac6c6231f02e8e787c7f3fd1a08b63e4c89fe8170ec25e26ab17ca40608e9950e1d3ae7a8f8edc494969df6519acd675cf3f108050a25d3019904b4dbec78264199cf9f5549fb44eb3f569aabfddc669f4f6ff6d10e8104ed75444c12ba1bc7b3f16e6a3f3c4648ae2418d71c151cbedec7eccdd8c6c3a1096dbc9b9a570ade27ea6ed84bb5d3dd467a15d3ddfd77ccf2650ec3757cd59660fe343cfa7c3026ebfbc73ce331f459a583f43acded97bac78db7c3b3a19959b0db881c5e14d194c2353531d1b4d2d4ddd4d45d539f9ada004d8d000474afb44a7743d17d80a656696a62a209014ddd4d4d07686ae207274470447437ac573eccd8e4cdf1706e3c1b9a6ab33746c392e6438a3b0dcba05ef53086ee0f6dd2575be4b2b22af453de99a894b11ca29956212614949502fddc40516c61493b7221bd44fca1acf99362687b58acefa7fd6a3839a390d77d9149864b9f05631794d9e617930c85006192e14771a53733fdebb18c09c1c91981dc3f6292a10d5d350034dc3fc22cd6d267411e21f34591de8c59219636205faf5ea0d0f9fb7bede7d956ec2ea3ee98fad35cfe03f6baf6059b4fc3b45299df9f201d79f0f570a62105c3cff8a6d4dd9c6b88c7a0bb8fba1b55d433999d2ae96e24bd7a89c1d7cb955a31c7b3a1b9f91e1b15e1eb81d271b4e77939f2833359fe9d79b645ee6107a504c70f949fd332b5f9acd25947ff2bfd8fb0c0af3df8aa96e64fe22a6f6635e70487c3dd7033b854772fe9150f3e2dff662c13531ff464e0630f02c4270df1f56858d26858d258ac1d90e8ced7d2b05b9b6958d29cf5f87eedafd7eee347fabf401fa6218b85eb2fd9cc62e131cb9cf45f95a0e43162c77fec8c45e09b3cfa97bdf04d8a184bf03b926933fa3617e88001908e311cefc6c3a1b1b24a691e941fae338a312dcba35677bf7053283f08caa36a29be6f24a9bb8986baf1f56a6a6ae4d7c3c6466653d3c3c687fc9c9bff707ce0ece0a113a3f92c6fc6b111d7e03cdaa5ef695f4da6b3f9342c697564b17e26afcd98c5fa90e63ade1c0890831339d86e98b3609ea57f9619bb9555a1dbb559ce2a8940795f340265786d11c612ecf1a17d598a984e160bbf3e9457866ff208ff10325cbdc29105bedeac9f99be8fe8158ea0fe8cbfbeee67fa0aed95bdbe1771cdf7b59ab7d189e1f0d0d9a123e361237dcc1c9b1e3c7676e4cc893363b11d3b623d7ae0f4903992878f9a2fe3f1d6e098e9e1e91e6a3f75774a77e3a0021c48c064133393aea2d6cf9091110fd20f911f579190100f912221245792bb7e5c3d4643434a45483f424042aea21f1f2177f5fc0880c768a8f583e4f3e36a21fd102915fdec00b9947e7a8a7e9484f84972fd247df47e38161df168097d485d3d2ea50fa96b3e130acafbf5893c18a3981a99557a73d21111cf8d247477115e6424e46af5080d1d1db56e60d15d84f7080109f5fc1c25d1b890fcb88a8c7a6e442001f3f337deafd14c437ac51be28d70756376b74c8c1b5184ffb85a4684908e3ea4aecfd207a83ef8aa0fbefef3836268bf2a04ca8f565be5576d11d1a446dd1d64523ba9d1acd2fbf31ae54f32ba5f33ba3fe523fdb44433e9fa583816cda4abbb817c77fff87c8b559bad4b5569265db34a2b95e1dfeee6317fdaefa7cc92b523cb4addbd6326f38fa034d2dd3eaaa599622b76f7ceac74e9062fba9b47b545ddbd23e7439bd4a7da037070218b1d8d328292012566141db207534e0401e240787df0f59aa03d5d2101949154b74a08194f0f12e4bb98c8c685a080e072eafe69abbb743be84640016e9c2688f7b3f94cbad5102ea19ed651abc78138d3a45d23082fba46105be81a43628608758d206c5d23880c748d20b2e8512387837104176ec7b475078e6743139b344f6feecfa569d03bbc1bef860694f6d25a7d97cea2db13eaee70987ee62b75603c618c2674e3b80e17e5f79aa0f520415c264694df8f4b7ebebeaf2d893461a591dd5a37078631c0187437dc17ba1b3a1c72747734705c681db40e9270927152e9d640136718cad7e29ace068cc93c86dd5d4d77cf978929402f519076d3ee2ed22b3314e1d46a706a2c162886f44545895363b1a8286958acdcab323cd15dffda4f1ced9d655b7bc8d0e4eda8d531890c4362f8d96766c890830c3990a1c56764f24167c5a68f410bddcec2e1836fa9876dc622a5320a8aa184c1c4708ce59fb94d720f26d27c9f3eed6d3018cc7fc800e13ffe815c8703e1ffb2578c077191e6577ef0878c4873cc07caef15c43e5853e37f6d9dd1998cc70b83c1dc931169765b639c09c53437f04a908614bbf43a5e9a5ced95c14019de6aa9d76a459a2f8e59b7d961ffb2170c1461b74c617e29b61646a4d94139e64b6b3030d85350cc141cc35600b80cdce8e6342004c7b43b93311913ad18d4dd4bbd02434d77df30e4e1d9d0d0c4963e9f2a3485c4f006e5d16885e5f346109dd7dda8ee869a8d499f8f6dd17c262afb7bf4c4b37906fb7c9abf47eef94c9674c9fd6363e8364b734cdd73e9e1688bb00c4a52caf60883f291a6b4e04d1e25297561a7bbbb7043176870218c196771d1dd5cc0820b176867599acd675e5cb8e19f9e47cb05212eece86e67cd7877bf2ce95e6a0dbca0041e9855797fdc380d96a0ffc0f16b7f36ff0546a07ba6bb0dd0ddb857614cd1f87ab34aa5f0d1b3551834d88ab5067734dddd0c103aba3b9998ee071f7ae8ee0200f3d2dd390f3b74773ae4d0e1e8ee70e8ee6e747736ba1bba7b080f961fbf5e3010941fed931f48657e1fa1ff9a05418b94eb1d796695626102dd2de4c9a83ff5a7652a6d9e8f90cf28769c29bd3f67eec873c798ccad4a97d198bf52c43399eb7ff78f3c3cbf468f64e8d7caaae5f1963e19f3c74fcbb5e55e2cc7058262debfcdafd97bfb6c76efa70cef4f5be437113bbe5616d2c79e73541aefc178b45fedbd3fa310363bf459fa4c6b89549bad451e8cc949e5d13f90126e314922cc2489aaa5d9caaa90908c02129ae08329fc1474da48a5441e0c2601cfc38c3f4bd0f6457ee5ec6fb645984912e596cd0ee1505e791405252888a1fbf1485de893600ffe7d9b63aa43873f2d531fa1d05beeb9cc3a4c7e0c23839f525ced47435bedf7e0ac3616e31804afccfb59b579327326c738cb733cda246b5daf198d618aafd7842e40109678821760784c8801139e74d778965e29912076d8c0071763b304a376852c16ae966216eb7a1e3042174a30c14a09573493dfaa742524e0092580345f6dd183efa3841f25ec284187125eda6db6fa8c4b9f558aafb7a3c662dd247c1272e8de51c78bb19cf5672d71acf2c19e249923ccb428a77cb158f75fe1c71444af9080a46fe06749e7872175d88f37c3609556f9c1ba9ba95747f002ff8831ada17d9fb374d17fccbff98e5fa3581e8106ddddceca95862f495363842a686ac28fc9083bfa06ded47a0143e84277e3904af0934580e95ba6a0ccd7127901e3450d2fbafdf64bee8eade8acfcd863d365323b842138a0918410c6cffae2ac5291084a1a7fedbe0cd770c6df1b11c22a085404610141103932dca7f7c7256310c397b10d5f59beba3931ae95f4a3b2af1f0365aed2f6353a0b03fe9775735ce45ffa68c6607831c9b09bfbc2a4afdbfd714937e7852e70e171a56196f7b36137b7850f65ede662c085a1852c841f533787856eee0af7f3fd6ab3b79bb342777355b0bd3255d2cd51018c29747352e0a2c0414126065faf26a7f63131bd7c108692a460eba3a2fda8685df9937e5a22fc0f943f497eb64560555afaec50be16944af58e3c5529490ca9047b98c456fea4a04f4a42ba8d3c414c3fef73e5833d3df54523db1789e10dca9f9c0fbecb07293fc62d9bbc9396e911a19c5af821e1c1aadb592eab893bd841bf644c87ea0dfbd35c3b80a2bb7730d4983e48693671f4d50e7ae8b6f799e0697b7430867679e5b5f48a3ab041fbb5321d24e9ceb6ced05ba64a1d0d0f5604ac089ff9697b28ced4abf4f36ed226bd26b1907b3847a6573aa659c9bd6a69967ea9143d7cf9e35e683f71b4d476b17ffe369789f1cf954aec6ff34a1f8f0e4a9aeb672b7a6db9f7978a4c3f416bbf4ca54ddeeb92d61cdb3c8329ce51adc58e5beed55146fb32b561fcd7caee8b7e7d3a8e49c7f48e53d2d8994baf63287358962f980711e23e428ea9bc52143ff04a7a41d1bdf949c7f745bf34d7f7a7cd464bcba0f419dafde9e315e97d507aa6f9431a4a7ce9d3b28bff4b6ffb6bc35b951f3b722f94dfc73c53c7d227fd666858d240391a01a3611974e3f9697b6045d4eeb53deec90bfa7c99e5a499f2693e422eaf3c024109ba6e323a6de8326b04ec699fecc1b022aeedf16013e6b7d8e71e4c9444b2dad19514a44c63cb3d893f5acb8ff318f38c29882993d338ab0ab98741b0956dd13f2873d2088465467934cad648928fede949d5c075f1846e14aa050c6841d6a20cdd58095a6021c4b5408016ae6e07e2312fceca5882550b67e1bff6f3cf082d502dc0420baee0415edc594614d102167437ce34f60af2e2b1d7fc3cb28828f1d0b4004877db2b2e7d16a4c134f31fd39c84b0000656d683ef2ff559faecd0b5f41e650a8a49f3ca59654e9a31b0c21578084aa07705479eb3fce5e9bd926705439cb5821b56d0e2ac1967cd74e0004b9c208c0a3cc0094cc470c2c62b59233e5568d25855b2796cf1a8a0460a22d029f8d142ae2599ab109324f2c4b7f578581279481ef61a3ceb8b499e485dd7c7bdfa5fa5f897e8cd494c92c8bb3d2dcbccc86b635c7ab5d4e7274df26ed2e6b36aafed43fbd9d6b0cbf9d371fed95fef633436a9e7c04fb925d2f3a6ccc76e9228c685d0f8fd6c8db8101a0ffdc1d8687dbe59a57656ed687d5229fac7246de647a57226637efd0662f7268df9cf193c696ce696b10d6570cca431c739661dedbda36db987fd43fb7decca3969cc7f6097ddc058953dee39a60fb6dc731d4dc9936dd1912d9ad91ecd2a9d9427db2226497481b22db2459d22626373e3423c865537a04cdfaa1bfcac3e084adaa7ca117ea6b28cafb5f98f20411c94f5c67b7b5fad9242ab663849240d418e10f5cca020c9c8b1d3c15c01a45f5e5eac08831560b022095608a15ff75f33352efb5b834750bc237ecdd097155878902041ba3925ac586245927696bdf77fbab9bab24255c518aaf88226fc986ac28fc9bec28f29d3f9f77b55fa0a3fa6d7b358e1c754050caab8a28a0d5481848cb34019e3ceca4c3fe3acfba0a5e5c758caebea40f043f7b45fae7fdff6f5f5d9d6d7ebbf6b6537bfe694f3f158c7d72f59f1f592d5c4d7cf23221f098ad6c8df2359ed48f6ea03998ad7a4b149637594fd14ebf89a3feb8b78c4af9fcd51c92b3fc661da10457777cd186770b252820b4c06a00520babb6d4c118612910b6c58823066a0bb4f39d050400e950c1820aea0b8820d3f5001880b60101101ad1fd0c56aa70931967a50c10204a0e8eebe81ba424c375703952c65fed5a67678c0d5588880a341b6168948c4f9933a008637ebe32bdfad75bda00353747bee79961d6862d501a65b77dbe8550790d0bcce28eec04ef7273bb0ea6eda975f360515ba3be9fbda6b3e8b25e2ef8d4c11d41951dd48b183951455482105adbb3116edd73f800107baf8bee6e200adc6c318638cc181220ed874b70b71677d8d26d318376e00068daf5723cab0e6ffe6580dae76033bdddc0cb818c880360577c3132dbadb1af9c7a3ecc9f5c3472a7a222c8fe495473fafb4b5e6cfd9f2329324f2e4c78896f05ee6feb570fc6e4efb24bd1fee71cf669759bf799e6dd12df6fd8b331a734cdd65d6ff99d02c3f96affc20fc77ce56a6211d9a553aed577fa6d0fd3f2a9a3f3f5b234a60b645f3319647f399249137df27a4394bc7de7f1406f37fecac198d55f9cd68cc6fe0fdda8cc560cbab4c66416b7b3c9aa54f5e57c612c80b479a8ca5ccfbfece2aad5539ab3453f71930d7af32bc2f4a9b7bf545b17eadcaa7d9b274222f1cb134e28154e6fa8ee992c777948d38fb8ccc7ef58fcd2a95d94a430fdbbe0e79538252066799fd64fdf1a4056ffff2c35f031f874fcb9e691dad5779bde679c4f5dde62599717d30670aba046742f207a08312c9bd4c65328d715c9359c7a2bd4730a7f16bfd070cf683e51157c67208e634ceca1fdab2cbecac12cfff8a337d9ac4a00472ef06fa8c8d78fe785d3e6770b5f4beed5e098e1f9520d8720fb41753a0c909f7973e99b3f42afd07a8158eb72afdbf6a3faf965621e9394785b9cd3feecd5f92b13a7acdf86d16947249fa8cff5fd9cb24befd92bf4c26499f966673b94795dc9332b7d87fcad06562aacd0ecd2ac59812cde7b145342c834079648be6dbfc48b34a339547bedaa2fbd91ac9b68886f78f6c119e7504f2c9b62863caf4833f5b23b9ca8cab50b545f745516956ed3d3291b024ba554964adcb66876695666b64d6fc928c390bc90809e9c77b8488180d4d06f860400f1e96b6623a9190e6630bf60821cd9e0598c0731d71cf75b8cb817059fea45b0ccaff2428bacd8fada57d3e65cce5fdfcf306d22b437a45cfbb49db0d1cedcdab74e998ce580c4acf238f7b485a442c96cecd28717dfc37539d9bd1f1e3310ce59dd92bba3fcde5b26bf32781bc59a5347fc54a61b3fe7df1b18fe730199f899159201ce7995050ce29c1a7c9af5d7bfbb08c0dc1cbd42dcd264a22f7b0cbaccd7e1f8f33f3636e337520f7b07b7e29be8f5bd916d9fb44e07c6d52b6450fc6e4d30b946dd14d82ef33bf058234274dc95329289359164d4899245118b81f14c0893b878302249147dc140ad043b74765f47ecd93ac9e00c39b34d611b17a820a7b3da9733d41f319228017ba46802cbabd99f1cfe82ceae205448040169d051a20618455d261048105b815229c388313656898b39cc0818be392b54342b74fce7e08cf9f75b43c471c1030fc93e602678026c4e89e3337f87a356238ded458ac2660ed53c5d5e820703a5ee0a0a9c0e5681a704b36f87a4d4a68124253164d53c88032db18f767c1381dbe5a1fdcb2734c9ab72f32e91c939a524b20a1bb1bcb979de3e3d7fc3ada39e29a77fb25b773c4b029d482d93926fda5e39247eaeeb0574a9c414545650517e1a1cd78ec515151597955098aaf57be5614ea9512b3bb3dd17395f4ca5a8f0b04650f7eca2489e6db2c084ac74f65964912f987d4e5c97c4cbaccfa2d8b7f1df6398ddfc0621cf6c11cd76c41ebf3b18cd9de6d7650d21abdf9a319c7ec151d53ec1ffbe169f1cce4fd9a741f6f2e7df4c62c763bddb6b0a4f9f459c556bc81194b90f6c99ff990fad35ca227f3587ef233aed46130b7311094b2d1de62e8ccc792dc9be0d35b66fa5ced376795deee8f42b857ad8ba3cfaff2c149e5ede65a3fd32ba9db6c907b581cfd2b053ddb8a679670a5b29fff559ae49e0cbe31eb36bb63e9bd47637c3e1395dd447b7305ad95d9d6ea95fa1f710f5604f31b9a2298df4011fff599f9b34aec8f25f8b44c6760ffaa16269347318fd681908cc89ca3da1953a90445bf5d394e7014ade81ff36b65d2b1a4dd175d461df6a14d8239a632b2db95d78ae1bbdcbbc925eb78f6b9525961493067fdb88c8a6890181d71c9accf2aad301b10949e1ffffd6a3d337df5b7f90ca6d2ffab46eec1825c448a7e865eaea21f22223f49af222321578f12922ba9c8a8e785f4e353a4248e2eb3e1ecb157ea341953d027c65eff6df9632e93599a9ff26697fe4b32f43fe25eb5d4918adc9bef9832b9876576361fb4d9ba4453a9fd68a4d3be113b7e6cc53b8a33b72bf1fdda945eeb634bfb3095b619a6f76b81dc93a1a9d61f83b47cbb5f7bff250ac638a67ffdab752c7d562de816fbccfddadb2ccd6730683f9bed15fda33451de99cde2ed7e7eab32f44a8768117916722fbc9ffda3a00c5d7ef547505669a68ea5cfcc2a0563a19cf9b5b28fb9cba8c85d494a44b74ceff87d9207c03d1d9f0e8cbf8234d7d16d1cd3f937f0b3f46c410f3f657af7602fb039a5b4e12a3fc4e34ba56e8baacde8f645907c6e31ff3ef5485a475a963f7d87ce11380e824b40cf67955e5b67425d06ba2c32751808d225985febb05f9219e6f76b5ffd6dfec32bf549fbacf8d379c0bbe597494cc3f27e01d92bf59f14c31c3f96c9ec4f793fe471186c8824dc85080122b3f4f19979c4f2192140582c19f84940424a4b1225511077f701388be5fe201543fbd90a83c17e3c00eed93c1d675a477ccb74d27109fd1a055be27f9159a5f27d3007866d971dd8b4f73289c7d8b5d5f3df7ce6c33157aa030c743796b4967b173458420d51e87ebd3c3c1f033236622e05394881c00d1c3837838b2bba3bf9e0cc20859c01a880064e7470f0f55c6cc083074a5c1f7603abf42c6795aaa8a8acc80f566d52c42a2a2a2bd8f6f5fe4d820e4ad7cb8c0186649b8c2d18862a103d132c16b8a8c00c2f350c20720412028098c10f96ae0c6d5f943403d80c80341395fd3ddae19194e4d54c471b93eedd87c932bc16688707c630bec32329c9e77b39f21389f978bf646b1f96594e9bf1a5e34fd0c6781ece3464e11fdc061e4df46a290df6d8ca6a96898179961306fb8c2de81fc3232dbbcda1c43098cc0c8be58a818d19ff95d910d32a69dfe3fc20053f9a4c9b51d0f147c51610191a96412c96cb6fb118ffa868b34b228709710181854fcb324b33b399c9f2b84753a9117b84a92d0bddf1dfbd19f782dc83c1fc16f3fc492e9329ce21ca3006bb8767f2288252a65277cf4708044799289fc6fa50167d2f0a59179effdf8b494c3fd615da9e6a8b4050f6a49a7407fda06149bbe38ccaa62d5a814a165d900214b2f8411634c8c2052e599c200b0d6481812c2ed0a275191f629ce5352ee383fb8c0fce12adcff8e031ee2c37a2889ff6cb629605518c64e1eb3df14cfeafac8e312878820e5460d3bd45770a8e6884b8cd82cefadaebc562dda41e2858e1eb85d7ca681d6b30a6738c29be2002170ef4d039e1095500030c2948e10953a842159ef0042a744d80c2143a29747750784214ba3b2874774d7842d784f996c59a55ba24337e893883a3024c90e4da24cd357fc458e8fa4cca33ff68529e1284a00436cf84de64f47bd9242de7f99a75944d1a9b34f62241029026e5f17c846c92e6f2f2e3bff36db149c1196871b59f77dff6b697b5dc1b3f4ae46511a43c951279544673ad2f8552c4331a13479f349645fa34c6e3552b8e1e1b99607b3fe95f6d185a1905f260305b8d8084805c62af3fc424893c7b9f09917b5efe1c1c984c8fb32833f860cd3d9918211bd83fb6b4b7d86fb1190c8379a518cbafc924f7503388ba2fba3ba563c2fc25eefd27456cb1156d93f26471521e7b5495c09ceda5b9321e7df02f8d6168b5e044b084664271feff29f280041a7f8d82f225fe2f81a07cd5919bb97460a9c79d299274cf0f65ad79610982f285e58bf66519a3656aa3758a1a7a0c2980a400428a1e383005070ad01ce861e9ca99145fa27cdab4388f9696a94d5cba32fccbad34c59cac80c10c5ea49081014d2e369e78d2dd42b87895611563851a366ccc20b7c0a10762f802474c0a826e20ae7a704318dddd583447842acca05d9e0ce95b95b76bc30f2de8c99857f975772ce8ee5620c5119d13bd347f89ffc879d2f0c862fd945fa7824e8a211a6829409155e97e70d6ea5f29586904589081a31474772890428af99af3e7881bc200783a0306562e10740131fa0244b8800d2e70006739aed6412a632e43141304731af7e657ca03739aea32ead73a8d058339cd0c4c46862826c867787ca6f6578c81396ba952b047082277ec3a5ea537105b8731fd0ce27930ff19b5d959a90db437c93d2b131f86619e63a39d5ea9d77f9ae3aba5b9c56864329ba3da2b66fa59d6e8153a6a39a63e846e214c200334271c24408109184d60c70452ed8923cd7de91fb38f5b3435d6357fce960d9f687ea6f32783946782606bfe0d0425cd571ed97efeed8b7c0d04e5f722befd12911379b007a9ccf73f504a19985947d957731361623a623e49afd882c14c70fd521abb56d2fc6b9206829702f16079548566fda942570259eb9af50704659864ad6b0a4951f6dcaf195da349793210b6453ed6759bd2864f548564d788951dddaf7dd1d0b47d91d12de6367bf86bd671cbcb9882209537cf1e04a9042bad4f536db575562bd264d983feb18a29d591ffa6c3e5fc7aff9332c7d265e6dfaf54e696c5981c1b6d16042d907b5e6bb72a0325ed63d58ed3656e3178566991bcf248c64419ce77518002bc249704f8a0bb9d4553930056b52e795e224662faa220a12348f7319548b6db9561382665f93e4f7b982491d2102dd323980ee54f9ad4e75aa0fb59d69aff5d4bc3f2e72fcd8f645d784866547f0883600be3fbd9debec8bc7d118c6d1e5b4938394aa212ce4c5f548526e539aa230dcb20a1bf3328337d517d26f60265a62f220247243c85f2ffb53d7866b3ff5539622c04ca6c5df367f3bf48f6480f8af4baac6bfe6c5917965d23980ee1c716c4b88ef728d7affde0db1749caf82978e50f9ef2832a95b49e6a84ffa3d9824918cf3a5a24fc34337dd1cb24ae4af8f645a88f05938ef087f41e61fcf5b31c0a3f242f9349b21b084a9791ac0af9241999429986a1fdfe1e1505ddf23d32f2479c6164628be62fd9da23c5c6249016e9698202dded554bb3c44c92c8c33eab74c69b79ef334c219324728f36a334bfe5fc571c63f88d6a848adcf311a2984912794fef8b34b1117bf466797d843cfcfc4919a6b1117b1fc592e763fa892948bf3ade40505e1a96365b59ed4ca6add8881de7c84c33385398d8886140e995e6be3846a0c9095ec488f631b799e6fb622b3626c9a26c8bfe816cd16de9a339a97e8d12a992283626559b51b6453ed702f500f188c10b54501179a5f33ddb3a290fe549edd0ddb25d982ce9f6686e37bb7726e8ee94ae04dd1d09ba3b2c9ededcdd8da0bb1341771782eeee8aeece8a76b93d71b941a0aba2bb03414a4745ee9800f48b0bd316ddbff402e567db0a0f2c80c91d6054830d2c80e5621b22045656696bfe9cadf9773caa8523164607ece8c060309fa9d293c137e22dc7f87c98cb4af321cd474c9248662913e3bd78cb2f201c270706bb367f12a8fe4873390ce6323b82a2e3db7dd1c3b16e4fe6f64b317e63b27766b3cf54a559958a5eafd7eb2682d3865a844f6a0fba7f96a89893c5c274663adf861f2e591104e5ebf318a33757cb83452a52577dd1e80582d2be5c429fce584af0af4f9750c625fc0114a31d535005a0140dcac4fcecca216b5d3f6d8fed8bbabb0fe0a3eece035d078e745348d1dd4b50f4bf5e1d521d5d81ee9f5d49ebc9a3a591dd5aa534b25b03423242c3320808c98851517631a25d9438e96e5a6933f0886ea08eaf9176eb39656c7c197de5c74a5eb111bfe694b11a1bf12bd371c9cca7bbbdf0b3d06be6d2cebacd296ff82993bde2df517c81205daa1f4ef9ba31b5ac74af04e576096a6a97200ab44b9014ed12448276096ac118633c135a6fb3de6677b784ea7a9ba8ee89166da659d77721875c42dd2d8a3094235ca616f87af8755ffc68fe10009496afe8f67e32f41f302619f6e0405c8649863dd42c8901e97f5ee34b605d91cbf7452f79ccc3dbf16c686695d7e56bd24d9a24718945015f4f0c3f2619869d11182ed20b4dcbf4ca1a2cda1c24cdd1271c2832b8481b3950318051009600180bba5b0c2f0d26448e178b9563fe772dd07c303cbf9f47ebdefdeacaf525ed88b3aaa5fe365ca5744c25114d7516a6710f9c5539eb8fcf1cfd783099239f118a8161f74a1d2604831dd1380bbb4c2cc63d5ca9cbc818f7de1372efc53babcd82e0d754a12a45fad17c1483298b856598668931ec08e634eec997f4b3184b5fba32bc9fa50d5b105325f75a79bc19069341e233af18180c090c26f3f2192431b050c230ec56e567ead7ca68fde4d717ad0cfc24ebeab1f78978263409ffdca48d09ad4ab9be68e4f2427b204833b6472eae2c3afff5199c1f7b917671cdbeefe2f2e15a75fbbb247dd13e36d525c902dd4dfbe4df204930492b242ff48cb3821871bf56fa2a422663787e0db4f8ef274579bf24f7eeac8f858e5a39689982d6c6602e6532213231406c18cf1e7c8df01117474e9cf5afd7112c63f7fecaa3212e4739b8c5e3354a02ebf64b2fa31678ac97d14cb4f9356334a4bd7729dac2c5075a77dfbe48c672c8ba8e96b0740115d9dcaf55c885e80ced2cb0fed0ed8b30492221359f786924add1d0d0cc2a0dede75126f4c664ae3649c39ecd66b3b26b81747cecd071568eb38c80d1380be78687632afdf1486b533aa621cdf869eed76c06657dd141f9d7415086d8ad95c1e6675006c1322869427076e8dcdcd4007116f5db2f55aba3e708490756f21b4865fd2c274d661abbd2ab742360a2242a62b1604578cbbd9f493cded1def2dfef87a88504e45e951f2843eacdd8fa78746cabc51fcd32b47994560ce9ed5a99cf2a6de836d7db2f591a1665c5ee984912cdaa1db2d675fb2278d6117fcdf4c8943cd6224dc9735f7ed20bdfa7f829aeb6073fc55509734124a9f114ba3fe507e1913300c70497808e07abb30142d23d7da8f0b0ccd29aa47dcc3fdb29824f7b4f2686ad0c7fb6466ee0953fd6baf091d0e62a69472f22219b44ea39824bcf153d14f064625c26c66d5fe4c16cb6c260370e8463180d287fbe6de99309c8b6fbb48cfd9368331a64adebc1af2a4dd068bef451748bf1bd2fa3234093a6656a7b5bced11c085c8640610817435c30240443ae689f116d769f2f81293410861b51c411e0d111035021063c20020c98a24b61cfbb8fdd4e8b6dae740a8139a6327bb3a0949f7f3e94f9fb1af525c7f3da0fb4b4a5cf0ec92c7db89b91309c2149118d178b3bf9d06628420d2a4076f804ad8d161e0e07252e3eccd0a5e82008dc177cba2e573174572b7b9f1b93adad6aab0b0b49b7b3be71da2bda3bafe02306977669dc0ababbb6cbce10ddb4d217ed630bd2e806dba5470e9ae6b3cca70b90c00727f4cbe651be5eb4f97b3dc6f8bb5ba65d74b2f4db2fb9e85cd1dd3233b75f8a41892e3a9e8b8e4bbbcf0f814b8c518e4b8e1bdade27a2da22515e9b0b8f17e5b5b9cd12537984ff81aa12d24d082a81f02f49d7e339edf74f6f53e6fa492d979cd105e70baff9e3ed157e4c38cffaf80608ddb7291f69019566e9d5beed6739329d7f1f869333c2dcb3d9e6e39ecc7af8d4dfe65866fd8e36db8a41b0e51e1eadcdd6a5214cd483c4c73d191094379ef1a824c6671e6560309f3fa3c303c7717e4982312cca9b1dd3948066fd2490023d189355e9c11815cab6e85ada57e523e1fc184b9e29796cd17c8c6d76082f7d762829dba2fc440f8495aa50f831bd667dec0284145c80f8a2bb6bb8c8b4b3ae9539a6443d48685ff831d5dcc4fcffd9d640fbc2f48b69c9e1856e677996b75f3a6dc125c7cde5872f0ee084065c7a68f2e0575d7c6872e9a105dddd2e3e04c0a5871f3de8e01280240460083098d71c06739a6ae49e8c0e1df84af0fbe9ce802cb4f0a402dd7d4a7da1095d82043ce9e67e000201785711824642143d43bae50a0cd880711854bf80d1ddf3f52f1342b795552dbafbbf6aebebc94b5377e3db2fb9bc80fd8284e9eb90ee7ee9a15f2f2dddede260d8d7ed975c1c8beef628ba277de5c7afec48b48b27e9c6f8c19707dd6cba6536bb8d6e997cf075c3d053b2b5f775c390873078f882071ad0b0a4f1304577ff155f5856135d7868eae681d65d2d0f417d8bbd78f06e1e5a70aeaf25e174d9410c2bdbe10b9cebd7de65872cba5faf1d9ef44ffb35f5eb5ad98be9e70e30ecb2c3102c5d76c8a1bb6596f3bee8b2437783815d74104237be568bbebf74adede5a2c393d743d15807b0f18c76d1c1e5a2039076d16146663965fed045871a5c72284377ab7eb8e47002971ca668971c98da6dcea3c883aff7611ad67c98862e38a60b8ea3ee6e677577479d5111b8181475441c18432e3850e1e1eb81348f348f2e38342dd3256b5d2e37b0e8ce588aa2286f24e9ee59a5f3ffb3f7c83dd0d65fb237e698dabebadcb0e1ac710669171b4ebafbc5796cf0e1edbb5ff36399907bb00963611ccfd8869ee537e3985239236bb62ff26618c6decbf76b31500b5450c210495c0ebafba75d66848148055654fbb766c5299ff655d9eb35657ebc642df89a556ab16592e12b632be6d1be6eb197fd5ef9f12b3f7ee5c74c327c89e1f87a31c9f0beea8bb6d2d733a118835fed4b7c8563bd34311c5ff9f10bccf9f592d5c4577e7cfb5e184bf1167be5c736f9f1a49e1fe7c736da85c602ba97d070a101a4bb8e373b7e8aaf0726cd17a94ba42edb17b9cc507291310417194980a0ec11a9cbcbd78a0f8445eaf2449aefbf9dd5ff44eaf2f07d51a499f649a72f5ac79f6f3cf78f64963ede2d5b91e6cfb76a1fa4323bf3d3f1d29521edabcf03c62e3862ec9e0374774ffee72aaf1c6732f071a64fcbe158dfbf52984cb558fe8d81ddbe887ba224c22275f98cf258eb12a9ebfeac1428dba2faa251f8f7a87b19800b8a4ddbe0e0e4b46c124988e9679518bf28845205171429b048337e9b7c8934bff2276ffe6bfbfa126916697e752b432a5b6739a335c9c5526c5f534a49d42433334282b80cd3a43159f6432ca46b94653fe4ee5e930cc099267d756106324899a049102101aadda874d02926c29e251d43684660041000002311003048281a8ec6c311c980526eb70d14000275ba78985099a94912c514428610620000000000000000236a04a00f4da19e635e841852b470772df4109218926ed8ea927039c168548507066047b82d7a747a600295edd01c7b55a7a53e0c735fe06c51c39ce7017fab1565ad040c8387d59dca5dd4a58a1ba8a6d800a6e911e1ef1149000978ae7775381016ab541ae667749d2b1bff14afb07f0aaadc8aa2ebf016c9917093b777d3aa99e69b9ac5279c43c7e37c1d6b50f281085716582abe678f68a408565fa2ffeb806d02fcff7a4deda7da15817c9d26e78f23a5c682565efa6b4556d923489c7133033eb7444b9b198f3b25c93d3edf1e2f415ac5903c7045a29a2e82a843f9bc32507fc17bdc0fbef093a4e5383274ee3853962199aeaae70497e3d59326a7e84cef52898bc3c8f950d9812a5bbbbe19139ccb54f5c9d7a8ca96d01a8dd2e4d9b0f94d8ccafc5d23abbaf832f8c9390f0562a808a6ce753962b27f74d40a0a5021dc845d9642fdfb1864e8b0fc6acb0425106fe48187fe1ca3b4751ebf8deb72706191849e4cdde49b7e96a3012526fa9e9cc1201b740034da6b99e9bf8ddff98ee4f2ffc23b99716aa067a62cc21d33313862d6f91533a036fe4ed3a3098f74f2533d25c49ad0c1b6adae8a426601f846addcf11a0059f6d050b4fbe7f621d33e2facc2a89023bc8dfa045df939799812ed2981677f03aa52e741608c5c3f003a8151d5dadae26d6443d41147077ff2ae19a43ac36d7a6f6b50ae5db32842ca80c28a5b61cc592af6a57f8949d20537b7ae2f1f4db3388652891b8bf1d9e3509f62a4376190d0a331f9235654d21142c62a87ebea2fd5f904bb4a679f751f5e8fd865e875f9afa031e89fce95b2c22e803c4bee782163a1432ce6fd6472059c943283549c63fe0c0361ae508cc62dab4b73ad0c1e9803a61977038953d9084e29723de60e8426aaeaaa8b07e0cb80c2c2cdf3a31864370b0d4d7e1df649068559eaa156537aed24c16b72f0a823c1d522476b3d0d6a37c611525ceae43ae10bc929dafd83efbcb6b5b08d2d1e80026c1c202e7b929c6cde3db7871e7cc303e08581512d0323848b304153fdea1b8e98f382a06869401c9eb0c52c6258b1e0077c9aa9c9fd30e7895c3945b4daa771906f7944a3cc0685dab85bff21b38d21b8fa000c79ba4bc67088e9d3987d2454f5e6eaa916a1d24caab8b3fe145b096671ccf8fb4a6a9071d87da8718949373c47a0f9acbe583a55993396374c4ddf4a21d677ebad358f0c97fb7d2616152433655003c152b74fe2acf0c6141655fbe16e0b66616a5ebc9564ddfed271ccc2a31516cb3210af2186e98022df979efd84febd9dae723374ab38c2d0cdf6c7da9e436f708a2584d5cc2af93dbfb625532c226eb80569f832402c0d52b811111710e1b1e47c7f264666386d4c81cdd8a4248221e93643e43fb4a26330e4d4c7120f367136cf69699a74d07d9d6f82d1d711cdc0d2b065f4939f611bce3d17cb27f233db2323a727c73a50b6e4ab83e8753a899f5c60047eae4773f3ccec0e963a63aa81c0e7098786592960fc8eda186f0c23e1edbb4c3855ecfdfce4b8a93cb7f26926c76df8f468c41aab388e83eb25cb3ef2b8ade4e0e79e11fc5bb3aca0ba4f12b49e1ba28247830024e9d6f6f2fb26163330848c14c3550efcdc07a6d3a40742becf7b1f6e2834bd96e1cafaf782c7aa6a21241d40aba0a090cab193a45d8a05560108bcd6956791294a3ef97b422e86f715aaa4716e84393583a0b508d7c180d48cd70fa1e6ee06de09a4c308068ae56b4f18cf34668ea1bacd423d7309f705a85ed0211ca253f341f7274185eca24328a8eabf0cc4955e4f5d1ba65c0edbd4e06798994af5fca5a5a74ac133fa22d831404f5a4635a3453cd4ee13a4a3d9e208216d99bcfa4ab81a0370dc3ae1a59fdb0b30b6f0f2a32465ad410bf7e8c8677edf7b7c5180ace3a39ad36dc5b670f386dc8d6f516186ec0ac2c6d719c17b7f5916a33e92d5efcae971f7edaba0355f52159c6d12d2cdb9dd59bc8ea131425b31b395b1da7d0703e9ad9ecc5789f3f4f29ed94e2f8d247f14a8548ef9c8b91e0de048411caab47d4e65b65078cced53087e33be196d3cdccd7345dd698c10c21b831f7f6263a43794635c236bf7491888884e88cd0a9794216d87fb69c724d2aae65f489353a1ed9cb13fdbbe960341264e636e0660d2c587c6698c35e33881a98b783e4f7c31432b26fbdb65d751a133ec34d79b8811c58ca1c4640a8fa0b78ade51c7158a12fb2479509070ee44ad86aab6325bafb74e9f3adeebfca8b9c4635a9136189e89e44007f670b70f338b9715bdc1ce32583b0c56dff33aae3a51fbfb0be8e1dc30bd6bd737a596af1bc2c2a2c384cfc97d178004fcfade223ecdddd99f7f2a8be8e8d62f6d240d63e137fff6aa311c1e46dff461d042b0e8be12ad7e7f5eca17dbcf51898c66a524d05b63bede70d092e430c9b9ad4b5967c21aa58a59c4457c897c65eefcec7d69c46f004cb9b1bfb3d5a7972f7794e98b36b6ca3803aabb7f73bc7f7f5ece74540a71159fb9fbd029418d34dceddcebd4a410418f559ff6f02379a38947c64cfe3b9c0cde037462e796d5a9aff7c1325d4f1dd8580fa6ef8cc3ef4da92a323734dcad180450710d2438b832b49c9593ad6870e090f31453eb53248ae865b1f01a3f746354df6aa94647d827aee8f41547d50e7d5b391f3e7b03819f711aa17c53eea91cb3c3aaf9315ce79f25ddfd0e4e86c423b787fc9b3f6f0d5308a501cfd45f3f412265648ab02e5c91434c71eff453e9f28575d3d9348354ea24f4196dd99c1221aaae52d65373457a2524158873e4f347266dbaaefeb6c2f806e30edb9481384f32048e88e0167e6189b120f98071723f0b8027667fdbacfe5655926db60bc188b3fd10286360663c85a6adede76f6300ab3ac656a2db3a5ed7071266a89d794838815078e0d32eddf99e550e98e7a0221cf2092d0a35336059bebe590c3ca7822ccb29469789886af3850bf61edf331562f5e06f1a558280e75e7d9d3743ce01b5d235ca2564f811757394da1feac9649bfe93420210d65230e554a3dec02a41758a02b33a13ba8486a8ce5f8ab70b916c42020ad49902b4b94396b7196078ba3b303ee8ab749e48cd34faae4142b8eceb9adfaa9e7b40300f6247caa7880fb6ed391ea013a8eda0a880769a48aa86917c9ca86ef90686d41bfabcd1a13343432726282223e33daa35ee11991dcab0160c85b8d7e87e27fe80befc67d39e6058cc0235aad35cd6e3185d840515d4d911057e6b7670e9853c5232956da7a2626452a3d8b85bc54fbe650fc6e7e085eadcf76751f23994894be700152270f84db5762595cb4b57e48294d72147bb47cb29eca0149f751f2d5aee6c0b8650428b6dc65df8af4a002dff048734c798cb82c54c5578b3fdd3074153caa7330d3b6283e593ebdef0710e26ad58844a79108119b3638b2556345fc43d2f98e725a37ee8f2f6a3177f887d39d271270a433ddeab90bf6748d20b6c1a752900e11c37ad430ec9f8b7da420ead833b5bb86316c5997d4f3e9975ee983ba60a5b6a9f9acc679945ea3a9fce9b5aa326a2683c9d71833a6b9cbca4e140c40e91cbbdcf032dd7d954beaa705afc5ebb0ff8c8aedbe067fd53d2fe43e59633eeb0c8b7a089f7023018b5b5f85e4a8593cba506759ad27b3223e670a4a0740c128223e34147e412037855168ea4e0e74c33bca351989b1b44771af565a74fbc2fe17077eeb1b2c3023f46476b933a9c885562e870d7d5aae793bbe6ef7b4a6421b92c4e0ba7b72e525b6dcf94b28d348cb207d1f2d9f787b545f854002161e7314bdcaf028fce63cde2991a2ec09337d4989bb9d2f92afc3e66bc217e008a8129876a01ae0dea43076c4f2f777e0af58d667104603271de53cac53cb6826500f81393ab8be9468ed881417d0060080bbf08003e2634f161a57b54058ec1d028acfc4153eda79ca0da8416eb44df0f478d16816887479538d74b07d9c8ec7528c4ce13451d66ab12811dbde8ed376ec536ee7812556b24fb6b773c784528a5c85283963a2dfec0c3e2fd7166c7c5b84bf93473ed7f14783e278c145519c035dabb29f8d1c32750abd33276adb5df4cc58179b3f0c0f978cfc4f936d009326222cb7de1a0e4c717d9f8b366e71e07a0ad17a4d2ec7a7c5ef39f405a2548d9e0a078a16a0c5b83b1e0c77350bc5c69c83442a7c105b2c215cbaad743ec193ea07951abfda48d7b190b28dae2abdb3f298b65f556958b63ffe21f7752f3be9bd7bbbd179dbcb8705c6884117654e4252e8fa5a8d62204bb2031b7a7290bd3825fc07bd35e86788623e5e7ce40fc82d2e299c20b51c157f14a6152c2c80860378232747f1cfdb300a5022720fa8b467897393a42f31fefa0ffe6c3832200949991253de1aaf13f92f093af4c213425e90025941359f8ffe1b7ae043508ced2b417e7114c2e986b21854a004bdc9c269481bbb682380ed663a1c1c8a3c4aab8266d72cc0b83c0a55652b2df6c03b41f36ed73f68fa9f4ebb193a9cafaa8527dacb77fb38cb307abe844ba2d34b1a0d732b80702da7975c6fce677c98e4d28c4bb7acfe65c08148195d556008f16def3bee4b3f2356ad8a019016b93c462a48be1bcb102887feb863b77b1e29d7538d40a82f2c444bc079ad200b4fdf91d9201c033782e6049b4a69dcbb65f40cab692b098945c533633164c7e96e0f19afbf1d953a07feb2e2f672e2ddb7177a0cc5990ecaa1a75318cf42899bd3e6142d54c739dc71cde449242da21c997b2c308e1be9ec9f2bcabefcfcc8866fd7938b9185a1b7c6afd1f7b1fb8517f01478e7835f9cceb7e8accc8116cec4987e168c7d678348d81257d506878ba9e9881b6e1f7e838f8416c878c7b74887d2ce1a168bedc94fd2ec6bf8e64391088937fc02fc4f275316d0bce834a880127cbe4f7dc8ca571dbc81096316a4b4596340637bc032da9050a8a9e4ad81f16d051d11bbe0c2f2eeb148c75be1b4f57ad5e213870b5803268b2f51f00b7b50336104a747effbc8453b9e94831191cc80e09e55050dee113daa37263a0cab76831f3d0329d5cf019b52269f4b11032b687ffaea150cdb150934242d3ec01a10da9b8594655b2482c1db6d00522c5501d458057a8456cc1b8746caf3600bec6ae74939fed979e04d0445716aab7dc064acefb973f4642ee724e7a9662243d0e08e0a147aa261e82c49032835d113ddab791cd6870dadf82b725857c05ea6d0b4143643d713fa4e788dac371f0c286d798bdb97b1e02ed9aa08e3f2c95d9f38cd8a5f3675c29b2ce81a5db38f8998ddbd88244cd13131eb647e2e3db0aca4e4405cf35c7ad87c5e34a045c6074e0fc02ec09f529a1a67ec89c8743783ef1930fa310485f7e12a730e5ba258eae367e9c8d50cf602e03b4d4ccc86e5eeecc5161226b0712b4514275ee5e44aec13fb027730b9e0e8c7ad2c4307920fcb831bb17df7698fdf65e58cfe3605dbe064e7f5c83e6e7adf44993891ca2b7d11cbee93e23828fe2e43798847fb5b2c3d0ffef74db161f9428c1ab8dc44b4703f9abaca2785e59511aa098f6dbfb9b8c8443ee5c0a1a6d1096a727ee1c87331930728770513f709a8c0a1ac98f0ec56f23f3920c6f220b54014aa2c6420c6ab13e0efa7ab875ec354d978ac0a02412007684f9ba4788a0408305c13af65ff192beccd30b5f68f9dbd66130a3cf949e5d1fd928465178eccc0ad4301492dc1d61f402e950346315d805c0f1a7f91047ddfe40bbaa3429540308b90733a60ea5266b6c320abe602f64c079a2e63794d41d29dc2f9b0ba2b2bb7c742730e3d13f2b52a601e3056707e21791873fc23fae8c4669359d393819e59b7c90f980b2d01f11c1766b34cfbecfd10f5ddffaf2476d29e286ef08d1d0d2ae6c56172386b8ddd2d32c74461cd69d4064ee0cf7cf5b8f8f7ef93927413dab0d19c8869654bd59b1ae699c26742ac97bb5c02e6acac75de558be6c6dca76934e3029f02dc4f7fc1c9f04c5084bf85aec69d018623231119dc2762ead1a71286872f5816ff21ee2265460953b3973e4ea91ad5590cbe7c25121273d03548cc63065b13ed17d774caec71c11271645530ba21431cefc0888787ad11200e24b6694cda6f8e3c813f323ab129304e08e75c452d4086409405fa29bf7e56e58347f82a9ae22cccf277f8cf06897d89da1cda383488f05ac201e6730dca48cd5fadfb7ac077e3b4962be684f46de59ad4a027da75a037138c27fbed9878dc1c70e3036e295a4712cd30b4cfac1163502e5bd443ee1df394b44a11c6bf3905c20492e2098846b4c5d636e09b8d43ad108a15c41aedbac27e1662ef24bc6b3abd32d3f61d6c5bd8ac90ba9a817a7b39444a3a4fac751fba3b0d5c05a9212e45f387f688205882ece68dabb2b45d41acd8a972ebb9ed098ce60136624f02776652326d944cf5a2ac8e658723258b4747f8b892424f96cb1f5a8f7ed51996f9827a24c03d12037f2e347f27f690e33ee13a6ca61e0ce4c321b3907ff91319b7132e64899cd4646c9cf005068cdcdff1506c41bbbfb8aa0b399069fbe9fec4e6938e81261680937af79a60bb8ccb136e7fe16e811c362bba603661390a0829f51e09b7c81fa7cf437d50db1482c84525286fce7d92ce4ae084eed355b24116138bb5948e744b2356b9b53f8db44d17784b2febc0770c3fc50fd2082415e061479ec5171f9207477146b3494945b7435ce8840d5739595652e25b7f8fcc909d5d3ec142a81cdb8262e4aa9ccaa50894670488082b705f0831bbc85f9c7a8195a29e2c2a685e26dba781cab2fbdf69467ef165fc1d6385dbef4a38614e6586d543502c809a7e537d6dbd148a41288d67efeaa482715d7c0facae80836864ce7ad74ff5f9bf7caf9fc65dc7f23b5dc77d0f3335d70fada0380da0172e58162ff1c02c0af277e6d41099a4d6126560a7606b26bc864d73d3591a80a1001ad92b38615c5cda0eb3b55be82231734a4ad0bdcbeefd8d37544b5d671e76e848c06eb6b8580e8f857d158c4ce1c13f69e8e78353a6afc046dd0beb4b5541765312bdfbec1fae8988e7597e68279a48359429fb41528ae70beac17bef97b8695025d808b8298be43bab5c5aa9ccd8c336379b3d0ee6520b781a8cba2745f0106d8886e0a21ffc7365f0d832d1e35bb6fd23fe7ecf2382fee204f8dd70cfbbb1e475e5d65cad12f32c4225e4b50b6f21760ae5386360a05ac110013bd0601da9c4774968dfa26186275399af309c7be3114e84a0228a1b0014ee5e19e13daab1356c00a5f5dab1c5daa6b94b707600969bb00d5368ce72d4283607959831f7b0a061e631ec3412a3e0b94e6ffe365ac7bb84014b856cc34ea96886521abd9a8a5b0e50255dc82b46aa0efb952e5445da6bbdb12d3d5bac6192df9f2dfd326883bfca74f6aba28f8c7d5ed6426127a880f2899f91e45f2c180fe0ce5ce2632cbe19249f680b8869a04d6eadcd50f3d2bae1de55a0bed029a493d8c520ed6e52a76884e4d0ceb2bbc063cdfa842325374a7d04c2f96f85a8796ee4b6e438b0c2b9a7e61583f476aee31bc04fe73512080297d1061be34edfbcf606a09dfd908333f6fe227fc3284532df6e4917c9b0a7ad74b414feca19872158587e010963c83de8ca72768de1e9ea19a053022d9e461a6e08e8008e95610e7b9577cc0e770b99a70255b6fb4bd196950be1a44ce0610e3f281ac54a15ff7e59f460a4ee9e8cd26db5e97ad7a19fe119f72da60fc5b6cb2c2f7a83aef94387fece4570590a1524fe165a88abc5176df97df2aa729c4ec7f6ef3c3fdf21979452d2181c3c491a0fd9eb0d9fe7b58ee4cafba2f5c7170303ccc51d842641e40939699cc64e30c4ea7bc3a9f12a9a770d0a028f3b2621d0d316e428aa530e7649c57dd3c5cd257815809293ddf9353e4fda338e04a6a972c34b182dd73255352db3b8f21c9e3ae27863e62f4b3598750f052891f4acd6a44b77eb0b03b3da7cb0da6c6380396b43742c9dc4e19d979762281ab125711345afe7fec2cd1e6482e353e7faa09b9c86a350b4e131d88f02f67452366a802e47326bb39c0a32473d33d91be8a463c456be5bfdbbc78a98799fb027bf156dc9b3e8bf11052d2314fa149e95fb8c49a598771361978c29bb8fec83637a6e3a096ba3950d6bf3761f5af4a239984ad445eec39c7dbddd67b859d2fc064607dbad525ef578f8fca440509523cb9c9c97103c8f1ab69d92ecfa82f80cdb58a97d040af5547d7fe23cd989b4a78702969217e2d0629aedfef07653b10394f316287db8b50e757e8477e7894be44b4bc0790e9b17d5b68439a57033a69eae897e50ec8de36ffcb4b4f13ab8cddea5f518ae1f3509f190851b34cd33f9aae051919765d42663eb10f3ec77f6ba3bb9127445950778bc124eef9a6384de4acde3cdedbf2a02e5084bb29762be69714a60638f6b57e9784fcef4c6690d174bfe13efc3f936a92a6626c9828c4005b10867b5b98df9df25d2711757fc98e4be99a7b85b439e9569e48bcc87a04c6f656444f3415ab35b8a10d702884b3a5ba9417b31717147f880a51c03d77843e7a3894c0f0b419c9a087088c3d774a34b83c541eb798dcbf46bbc604ac40cfc2446fb8ae6807fbc8f59e3f7ef776843ba847b2da9078893994101f217ae1cff9b4ccb91e6d4649e83398070fe89d5b687405e080d1467037623b27360233a72971cb408517c1a49f0345d3a109f8f83f410d707cc083e4dde94b48dc59f1094f1a52820880cc9f0bca1dcedaca341e07f12220fddd8c089277c54ba73a2b07ece40bf67062ea64221882796404d89f444d52133740e63e9f4f70bbb04087b99796ff8a4279c30c6d1e52210dedc2978c79b728881298511cefee399adacdefbd83872aa3231b0386fef145cd44f1dfa931d33132c6b5462f7e608a649741c23f976d9a271a72b207cfb4b99c457f960f4fa365e35efb6060db03a65b446f12a03a26597d179b87e763fbbe93f2464acb9293d10af9961c23a67a93803e0132d24211f67535d2977531fe21d77f8ed8e63c43869a9b3330e87fec20c37dce8f800b2e81619e645eeb66242db51f3ca7724b6d7f06fdd2bb4fc609c8a04c9cb172d0ba7156dcaab83716629530cebe9a432c5a7bd630f9d391d6ec13f5eb51d684b65d798b2d513748414a0d71a6a31796ece64e096fa2b4afa7ecf4f361917b1518aa4de789e62a36eace11338390505d0b35d56833559eb387ef1c6de8dfd771d2c4386306aaabb53afab9809b35f36f022f3813febe619631046d30214c965c3a348e27a94a19e57bf1b58f0278a4755705a5f2ca02fe657849310abfc7a76f330a285758df280ae3bfd62f520bc1dd8b3a0009ab06b1f454987fd8645e37a7bb28cbd0b04b3c87d20580bbcac5c096601c5c62f90981b1696b924c9109458063e1a19d7b03e303cd7ff343b813790db28f6fc60bd19b65cdca0143e60389279eb07750970528dd2cfba7bc64ce00943b04ed3afff85512cd9a337fa6883f1787b0265714302e127c48154fe448de3673142818f5e0a98e84af0929333a8811ddbd875ca8fc44b7b136e49b02c1b477fe372f5fdea0a7c3489ef117d0063719c3be330bee5a368495cf482482626004bd230cfcc5e4b3b63d5220483e6048538a80b02da1c2b60cf34daca121e12e85dedf73bdb1f6430c4499ffa7d3a6f195e5b18c2b7ed0d7a9eb3c8101647bede6b247891f8cf6548682584564354a5b0dabe09fa8571b01a33a8907b00fbdc03f0db5f389a751c7a60f41c33b57a08f7e61fab2a3cb920fa8eba2e7ed728fcc0ad93653b785c69fe20eb0dc15230793e48e1bc0c282453c47e39ff742c4069cb25c23b61bf8ebe0de119ca2277b4e281e18224647744c2f2698c40f48255e853f58dd849729e4e8ea2bdcb0748227620e9a434aa5684325a51671fcab271f7a3d050183f9bff51504e7b5f5dcc1b687673a0750f9170616a8f4b1f43a8264b303646770d1e603c100b95ed83fad83cc7c94da040ccd02f9f3d06f3a74745d977b5608d3734589b126675542e10d92f6c6e724d3fab5da880ed8df04f118f8fc3e43d8f274d9a08c8f810c5be505c77d263de089a052759c84a510e098e647c900a03896b6c9d0423b339d2f1e178e0778bab98f5f568b1c9611fa91f9d75cfdbc6636642371b29b788c0ae7660151c15ad1b809e5c07f498678739b6fea0fe7e89b5b1d279afc312b4013f19c148469e4f342e162fb4685be8484d653061de84ec91aa719692701a233993238463ccf9800aa8737e83d31f4dedbd90c3f3e03b026641c4272a00c135ab408891313d5421d12318959825bee75aeeb98ba2e0bb426ecf9eda6b1f8f30692f4d40b318f5dd41d8f5f112a54226432673afee1d06a468fe5c3b0146450aca654a2bcc31e72cc81de290569387da1b9ba07f65033227ffec94532e5b5900c11970ceb04e3c3a0563395e693ea4f94117dde8d118eba0a5b12b343339e7034843d91b0e784dd2b15f8a9d6db0c78b6e81cd5ae07ba0dd752859edfa2b30a1b3506867bcb5b0ac10b9e77bd3bdfe9b5cd9cad65b799d29e01bc5a2221fbc02512464f0196851a7c32c2cc56a4e194d7106259a64ee263ca04984e739bb9995a235bd0b2ca5cc0241dc5c2b2ec1ef6c36d43f522dd7f669c9c4b5dd2c8671dc4910e52f69069a5beb5ab47582cc328796a11589e336dd15e9d2b0a7ba44177fce448f390eb62d78bc8f7ed99027d4ce849e067f1e4c77c66a9ed3f890d776167a2d2b6e16a94b9f827e4c16430ee479ef964f749d6075d0a4e6f1e8ed9f378c991b67d3a43c2de288da17ae36ac404f31036254af920fb74714749ea2bb65f757f926325424269ef342c64110e646e9eeb680f9b47bdde73d078a9cf888be0b3d1579637ed7079b1bed09e32c9aa61b31224a4e296eefdf0b5c8de233f1be86d84da7fb9284d34e5c1473bc8e2757d9e1abf3cad8327ec9a4f03d34bf69649b7ab10d251581a6b7d0155d45c0953fed443fce6399767d9f41ffd3154b969abe374f6b1b2ce365547c22d0d5aff21fe8000e214e556c6283bcac64507033abf45f587cebe549524968577aab100e17bc0b2702b27585d40d08e183d67c2b8a37c76d13581d8e77d24d83c161e5f034d5e2cbc15e026963e2f64cf40e6391ffa293381f08216c3c5b5f114834021a27489ca8d0c9ffeccc4924a685b306a1814391b6a2a24b5d6425fdc34c79cd6f029cbde4cfb4c684c3b223640b46691a4a15337d4365ccff0c154a922dab4a1bcdf598553fa74767af2b545b24a9384cba5928f7268164c016be83b3ee90d02b62ab83332a29367262d83650020b295ce17a3ee9f71c2866f5c2877f7450a875d14fc95e03ca67c426c60993a28a24c157b976e9129cb05f3876f10aaef934cb7b9306f536fe5dc12e996227c05cac44173c53f5f01f03d0f57e038d656297c495eee333d120845b77c36a69c99cc436531dc4caa54725749d22573bec1c6a8c9b964040f6aa8d514ec48b8e8333800d76954a86174e31a20140b1c75de4bfdb7e70f49228e79757eb03ea263585446fabcdaff120b60163671a13f87d45a40a39c66f42f94c09ec8b3585e931108493502ec74d7909760a1f968ed415a93f9ecc5931a574f060ba945b48541e5f54c3e7909af6ca887f2e9b0a13208044af9e11bc0bed20a863e7efd45b73e4e94dc4772b60971c87c0505e2ac449c9f83df4ce1b3a6bf04c5b13909b0899b2d2b6ebdf858dd7e84c743c818f12e7cfd438389308e14a8f91e863878132b1ca2c70b90f25d71651c352dede2609daa7cd434d19d456a3abb4315e79fe9f81e6d96b28e15d4e8e6c49a93882a1229e4c0d2ac905cd3293d5dc0eb634810a812dbe50e4a921812ed1df6732201d2eb61b641bed765253f02b893cdbad58574a237c0fdf5c58ecacae679118a7856bc5b973baacd8ee6990e77f4ee3ba657363f8ce84c29a38930721d432220be7242ab988c45bc42f046a138bdab7880418f02d345813b81a6c7618ffb9e32e4685b6f8c105fc706dc5dcaf730ad8954b843c4f4b9118cfc7a4ed06adf2048c63290e23ba89c794f365f96194a48ba5a35226269d2f62ef4536d497b39db50a493c9ba270d42e2a19d2dcb71498a4aac84e1c7b20ecb60aa7ec244244b5a8e4fb9b8ff24f578b978c7192ca8f177342cf21509cd0674a28299b948f4f03ad7d2cc6230bda2e55ceca214c84481e5a03eb109945abd16e89c98b458a6df4f64e049527aee15e213bc275716a4418c8ec6b6d668f71d16ef874c2985cfcbc62f65190f87e0c2b8e7963e0355e44018bdc9d2df1afa3a7eb012ecf6be046833c2aa083a639afb76b8a62f41777403e2d41d0d67929f3105e94d9a36d099d8806f7969e3fb332b67ecd6530a35ba060d9e1d60e104cbe06ac13ef0816311d08d030140840252967ed8f3b710eb4de7df6cfcc06f4afb476213be562ff8d3dee98ef1f312c80bab244d935c1cdc73596ec1789a1f25afa9bcb7242c83e96120c1036a63624586b68d58402ddcbb6317c70445b94c10a4eca946f4e6f15fa359e21f1cdb62ffcc820eb15fa1f0ff580ceee42586fd078daa0962c81af8840b09b63656c05a788ee8f0ad70172784457f7a31b6e40dd4660cc89229c7101a797d9a8edcf5c0d41fe80824cf76246c8c03d00e6df3225c1cabd5e81432434529f13962abcfa926e0660e63ec1338d56126fca008d9ad28f9acb2fb9c795a389f47344d3db74ced0c6682df376afd04f2c2cd909ce73d1ccc9f9fabc1606800f3dbe1f86b7c827a3de138339e1970688525f9392df3dcaa542d92e339555457d30599832024e9934088998e6b044296fcfc4554c0cb1e708aa90284c1d65421327048d476218f5ec6e35bcbcdd130fcedc7dbef20e13d6004fd06127d9b431fd056eecd004cfd7e19a2d75a3f8597b2db34f5475a5d29fe2b5ffbe482562c25843cbd8269a64fe2ac1d1a5ade04786a5cb22fc4db34eda2edefb16f12834dcbe3093859be3ed03810ce263c77bf2d096ed2a0be22f32bc011e6d3b4aa6e2a28cc5b5a2e95fe351025b64977fc4ba7d82883ccc1f84a81e101acb7dc90f557dc45d944b8b5b0c01721bbd19087e242e34658d5e8061a896e0c9065ad2d5f98b17a53c1c61ea69761db62a28e2c895dc1af1a7d01c1ddf5e0006e0ac2853bfa80d6d9ec12cdbe3c638c8adfa92f4634e7cc24f9b28b0d7b71ff47ff2f478dbaaf05e6ef3cf3be375682908c73765231de573c615b668ff3452be06aeb2771bcf5fff3dbf489d7ebca2afffe8d286c85bf317503eff0056e80fa0cb56f91223ca1e1bce2d983c3f474327d5ac8aea4fed9e14247d775dfe2120aa893e5dcda2e7866e1a11b6a29b2dfd79345f96dbd898da9ff19eb5caf35c2791abaf9b89d19ce4c6dd336e03bf99be12ca7a78ef1aec3a11550a61400b1887168a1251e3dabf3256e9b35e948b6f12ad7c8073c83454452cfb1dff421987e359b4f875812ef1e5ecbf2b8d9b91bef34b55e2a22693d11bf89aec7c2fdbbc8f70daa22ef3f42a3f6ac3acd86734c00e40e4c6536ec0e74bfe806bf2d54ea4ab4599e38741e0cae01254830cb3175ac755bcc0b107e1177809b7a6bc95805fc2cea5bd6b833cbc765ab16d704bbb39871fef06f37a3e2e05d773fc2ad3d4e57310b8e524be6aaae51b03c09095a8f98cbb79b579716dffbe929676e1d94e23ba9b9547d1e19c0fa576bd0422199e7b5a26cb04e08671a07e5e94f4023ae8c4720429f617429b916402248ef9197de2d21bed871a6b2d82b473ffa11d9353c36af369481d968d21afcebf2edfd2004c4f4acc80a45b3f32a8c9857b1f0b9aef2b576d6a251c373e719d4d8e71f34a3126f0999c57338f8a3173ec7afb19847d9118313a658710f72d160cd60f8b3eceaf8d871fcea04e1a15c98156c6930d5f62885dd61e719009beb5b1b339470a841ce66e9855406d5f513d8d6ae02d4861bfbaa5f96e04954fb5c435e00513ad183f2b8eb9f372c5fb842c8ba99b38b30cf0b8f6fc8e815138fc26693fd6e58c6c8c1a86bf47de49143f1f657fc96e3b55bbe81656f874b90d103a2ef06e54f00316514ccd21d92223706485d8adb12ddcbd13c482900c3775603ff22c05d92844dd3498c48ed2fc4008fe26e33c9f51c611f6eaab4a3dbc5e18b8c1d088793bf4e93b1dd51f44292e060a49b2345a01b90986864a073a98e0d605458901947c61c65130905bef5e35ec8c78646644fe5af490f05d26f92d81e80f32eff6123cc08e27700bdabdcd5d4127fc4e35e11194ae763353e4da7fdd16d84d059f9a73f269c56e4416371a5a60f7d512d3f23bb40b548c0f750bfb5e4334d1eddeccb5ed6856e7283e1ff61edf7e0754f5dae62884f54db2f5e846fd35ec3c9316c79b4e71f5672fd6340829929d6c49d66d41f81c0b46b064716a7ff83cddf34889de3fc45ff66e7702582e58773f51889456b362b36a2d99456cba7955bacbff0f5097cfe38703acc4f15ba76d37983bcd7df5c4aab373f2f05beaaa1f5618289bf74b55f0e5b11acb19a2a094db801e103b49b0ef8cfa4cc30b1e93a61b7ffe5a71cb1eaf790ddbd97ae04cf1835d687133f6ec2f7c3cf465eae1c9d437e0c4db523332616c82a491827d29b05504ab5f85662ee0dfb8eea05adde9a005edec689e3fb8398820eba2a41ca64f3bde5fbbf162075035e80a8813c34cdee0b9a41c7e4af8a5f834ef1264efb3825b1997b8159b5d51cb998746f79cf8c5c929c9fda0e0010fc9f63153a6ba0536790e931be2dec86c1b49bf3a5830cfa168ceb6652da12d58b14ee87e758d13f5aecf32c78e9fd2a6323eed8e9ea7b1be9be3be08295737fc759e1ec5b8532d38be0cb70ffa816d5946afea601b6716f189e0d976be62531e7fa3ebdfc91614873e513f0b6845557902a0dedc51e83bc858a35a3c6cb8ed910f812b38a259df693219b73c8de9baa913a36078c1a0e4132fe034cc0dc3ce70f622c5b08cfd52ab148fb885ebda6a9d58fc0293d505b123f76ea6d700dfe33823e5dc45775571356085fbcb19e94f3de4730eecf9be1c92d9c5df687e3e4a5bb9077d8797e70c7e155379098ef654697976378cc8e73961a018a86afeecbfea3383efd1da39a5daad68d67ac847df7e3b28f4a599f7d86482671c5926fba47b5d7759390b9fa96b178e346e041a936e0b4f0d042421eb59a02d75048f2b40f3d117604840737795c96471a3f109a78528d2a394c8df8640c3f88dc2b5decf65e0df07d713a81373589ebe12a6026c23d362948d13296e43a037016bda69d02df0320f3f4f8bf9bf8c86b1e0395309fdeb860121bf7d1673ca31d35c3da18cb4dad3c973aafe557e39790988319c65da522c533a09bf60825b192e22cc9e7f96ceb87007323fcd5145cdbfa7971fcf47265087e31e4796bd0f3b5435e1adf361c74ca7392586b5ca10b510735251d842bcb06382237f60f93acd2e108c3752489f998dcbeed4ce4953bf5b009d8379e37a975c2e5175c9c75edd0383205d0574ce3ebc03141fe51c91c75478a02dbe42834c7907444a5aad9f459123593dc0898dd961bf84d770dd404677dccb18a05bf8df98c5e380392015735db77200bce7746e676e7e2741b998d7483b6ecd3adbf1e3d6cd3853e50976819f27ac794642299383506bcf24bb3baf4e0548e9e99a70dc233032bac0341f3fc3f94c9717599095b54083b2c572e8399e125654ea9596a2f174beac7cdd6fe9e5bee749946e53a81cfac36570a359ff0b8fee8550ca38bb34decc5b1daf40e16c388c3c5eef92c1f57f31fd16105e978c6fc4e60eaa15b00aff5487618611d0d0905957d183352e1345d647eb3d90c06a2080b9af910553bbe0860a3bf44185c40b0b3d45cb1f32b4c599a93a28b9a32b65f0c51857cca5d45388e7f31597cb16664f060c1609168487415188b2a0f01590d0b2739da4bcd403700e59d1c5ab79198562490f44bc829b9efbd1db5c1c3da2ad72fbd21b103705048e6094ab1c312f8a022c7f549d3670138a63ab0369041e0b779e34a01ae0711f44c165d757704cc36e29b9874f918f3043d9dc426c907a6e0f8bcb6a8970f0683ba3caf8e5b014d2b350aafd21fece09b2916154c475306b0268b01effd391010b2872cb11e9a1e28364daa63bbbf49bed9c436a05b000a38e77d2258e5f6a87976229b4fe533c274f57fd285883c7b6cbc78a7a0be0a8293d228d87b7549dd9dddbc86867e098c2aa7d5c955c116588b4466737fd630b0bad1a01684cbc0ab8b5a944f792ebafe16264f5e8f4f4d532b79c5c7a3c03dd7f06900c1b05132511787ff470ead0fdedca5f43d63ce27973a14e70fd1f9ec3288f3082106a29481dfa48cf08890cfd6d0c9605b28e38893473c28d5504c66f9a33bbbe7c7157be0b224560e2b707402b9d8d972871454d100fa43d71ce654757c2ecc7f36b51ad23e525e4a8f390e4b417c04ec3f26dc5091ec4a9fc2365ab8ddaa702812f74945f2571ce331dceb73f5a904096e1c70a885ebd093faf34495eee6fcf49014231b31af40cd7f791f2ad2115e3f194c0d3d7cafc4d8b7559152cb3151036f507b2514ef9dcf5ab1fdfcd79eb712cf3c38edc7f3aeb96588959eb67d4f981f33a1b0121f37f3fbd205f1566b89ba52befc317f327a2ffd5eb82a7b32eb96d9b1df7bb415640e6f99fc6137b396f2a63265ab3f106cb4ab0bacf1ee0e9635612e208088c559f77688df261551525fbffad1098f6f4fd181711a9df645f43d7e5065ee10989ec5ff1b7e5232cf8ebd523e233fcc3c99a9cfe7d8c16521bd4a16a67fbf845af30b8ec3616960362e9818d0561ff66fbcd35edf840a8ce5932b63ddb1b4efa0ff6fa6a96f538b375899bf363a3148cc9e3f9b7d6761d52f4c80d364cf35cd3ce638be46ad8d46c85bbf4ad19767707903fbb456bf4fa0f05b9e56be1e44210ff2118cf379bbdf8775d8d708d75f48185a728abd12cf2627b9e4251793cbdf1f299c7ce3817b8fcf847b80d539a16d1a2863bc6778b937f687699b70267fdeb9eb92dfbefcd97460f68c0047c93410dc2250fb1ff5b8ef175d2ad6bcb7755105108b5f99719377f7bd1683980793edb0be1e2e74673084381d2a9a37eaade860e1eeeebd8332af52e43087955c1a1538c7860a517947915f0ca60ed8fe2c24e969743241eeaeb569efed296dd296c026017dd76625334b434add133bcc08aecfd0bfbd4ac851a722735e8158c1f5c6ba05170f7d716cc3dafcb4bbd642bfb7baba3c3ef40068f00d26f3073f984aae918b3bb3a463b707a32e711d51a0827fe4a1ff787b437c66da01f0bebdff87ef6b207e15820fa36c8198824f4f8e5573b0c0342cce371318dc4364c05568b17bd8fc0c14de7f2bae85e9e839d0f97695adaa54ca2bc08150e8f2458fec08b5f64d9fdccd5a165df6b5f3f9a1ff63aa15b5b19b39fb86146524b3c0ce8776f8c38f20d384ada943af0b34cfe3ff3d10864a2a8fd683afa3a8eade8bf5b0551550b6877bc24ee1a58088c49aaabf1004c5ff41c0dfdd97eacdc1722f36cbd9a4892c6e76a5922435d8a5a7795219914dad7e1ca1c502019e1260c9015f18a1ead2ea30744785a624c6f65b08cc442f45d9fbf6a7747ebb72c4477e3b3740f9277559ae8d98a97bfc5d0e720fdff671526f6c5344cc2bf1603a3708bb85d7ef818eefc3e885ff21bfd1321c8228df096abccec203c69a2b7495857ff71a4aa82489b133f3741fe5930e6b250345ca93914a41578b19bcd0c49ed26b37dd8578163f1a88f68f327479496e3e36de8b6db52d3faf0722bc3b8badeb6e179a8ee9e7d74dc7df08df239b9f36d251fd7d8305e81cee6c0f2239dd1ab0208d11c6915ad1aabd20219ee1007063a64e5985ade73ca64c459e6148035eeab91473f6e7c57bad7f89c88655e5c16962071fe097c046e3db667bc9206516fcb524d63b53cd9e61cf3bf810ae20bd7390646ba8f61c0c107af0b92918052d7abf6f743a76343cc4db538e4a241b28722ea277a6348f202bbc228f60a16ba03cd1d96218f685de78c0e67dc89fcb2f4fde0b68f599f1398248f7ebf448611fbb7150b1bee6f88332e0321e2c9d53783ebba8e2e169d0607058d19f004cdba27a84b1b3c08fc87b9778fca281f71cd0336642bccdd7d8fc97da6146ecf9ac87af18bb9b74fb2d180c2fe5bf3e3ec2ff5b2db481f4732ca4023a9133bcf49a7807002365a701bb2e5427d9724939cfc088299e3ff5d84f9af0afc13ebd9d38bdfe56ece0f361bd39d09be05161af49769b8d7e83c3cf3cc40ea6ba8346304005602576c65233a3bd164bf8b270aa9f1e36cc39ba0cce762d3df1e678b5619bd81bd90cd2e275a315fb72a2030087e9a2da8f8c3c250f29ce0ae2e64be9ccce96dfaa9b7fee3d70b04d513cd6fbb46633990e70480cb20b6f3cfdb0490c28ef82c8bb16def28f8393a5b437633d1d34d2f1fcfca3dcd01f229299bfb792c3d001d6ed32ff8330a29e851ee62ca55024dccdb3044a02001eb4b486bea007455a0e006c04855b328e6d5eff6676ce475da04f3ba9fe776cfc6fb76c54d9d819e6b5de2ab23cc9702f3b08616f3e8aa50bdb09aecfdd95da32800a8e81c5883336dc415f21b30294747842719f1d38cb29780677e428f48a00d04185dd18d596dd60050f8e94ab8da62c089c9c544a98e7dcfc0768572c46254cd5b849836274302ee9dcd5e7d60b593307725beffb1830c6e41b27600bdacb26d74332b36bbdd6f70455bd570fee2480fdb0587fc7ad92eb328dd03bae3e45d9d016dfe0c0a21d143ed4654ef0214e175eaf17f08af65338c3b6f4b2f5ca16ab8fee8a3fe3f3e16e3d30c44babb56b93c38a1f532ef50b0ab912a6209e4cacfd41c6289d8e3db58b987277ef3365234f44a900b1f162e5ee988f6f4e641b28216096d414181cf2052b9a1d68ee4960ee962e31c73974132457104b0998a915988d7ca11a95de424de381330b539ab94ec6ee7d83b3576cc9b629288abb5da55df4f13a0fbef13a8f000fff2eb1940d57f118339b0beec98204e3d54ca5f3781a2c98dcda21b2356f945f3b84aed9a824b3f9a92b5856301452184f132816c04eb8cc907900ab9cb79f4e7431454185e6413170fba787898e53479aa9ac6360c1aa8716414dbf25203a35304173bcd9f7b0931e0d767443a60924045c8ebd738bc54e4340b851c32883f9a8a4bebe9a28878d396ab92933fc13abe2ead216fd6dbd524573374cab02ffcc66a2fbe3913dd4d42ccc970180803b7ade1c22786af2c108881ab058f5a201fbe2d08e402aa76ed8aad3a58dd87234ccfcc0672d4c9b0490f21fa5775d2118761882ee2b6f6f7c773399ec7157b206f6e92887616f930f986834586c15d37244fe05dd7bf2c0d9dab7f122d2d2b7563f81197577c1ba0d83a9c145f00670d4c78d4d81c0827722a8cd61b2ee39fa614d40d853ffc437c597c7e32f5855974d1e28ad94bbdff1d6c3ea68e9603ccab08f6f1ddf8d75e9a6f98ccfeb213dcce3a9d3dbb4cb077edaed2f733d88620f0e24d35dadbd4881dbfd37c38a787582977192ff73fdf720bd724f2637e068ae736ebd884e5da6b1c5a6be495b9c06fe18f4c6c55a010fdc146a8a3cfa46c0a45137ce8118154100e9a82b9a506f15948ff349dc480d7f18afb56f2fe9f66bacf69230bfb88a7c971042b5a9e6e8a3ea549e748966074bfb2205ed159385c987fe428a38f10bb655f60aa8ade6475ebaf5afd232535cbe0ab18932a8da9fd990eec04145c888602a30d77b642bba67b93f314d6b47dccf3c460e21fc300de745240327588ba2fba1a57a010f88599f7822d2ac4c4e324c57d74c078532bf96533c8124c1110cd1f9be0a8da8658406950395e39fd330b1369b3e733c96a416981622b554f77274fcae9b7cd3bd4e2026d67b25253d5184f2200b1b53c86470ff2aacc6cd934504ff5ce7d56b6fdd7f8ade0bfeedb239e4c511c404ddda11e6acb4dee3f2802b5f080572d1682a6f15357b2d691bcf1aeba762956f762b8d2593c312c25aeb4fc01d51e4efadbbbdd623ef58c99ffe18100898c18a7298fe27207e1533a11d5601ce8d68767e0c85d05eda97413311405dfa7f45624384ca9e2e69b07aa99c4c31f2985d03ec3bdea37686dfcf3c08ee7af3860526b24cdb06bdb02e7d25e4ebfa51b264ec43ef2bae0716956536881bffb730c61e58f3867799336debc15d7d1d5ccb657c183e796720abbf45b9744ec03cc07cd4e89141daab52cd4fc48e7a9865ceb17c5adcbd7713c4bbb027b5fe33ab7ebb90577cbaf46da3f855cc134b5c567799939d8a67c526cbffb8de7a18d8a1d84abf81a62bc3320dcc7c18d33ece83d5fd85b8af92310e412126735f7985ee420c3b18a413618869caa4578745abd8d370c1ba8079eadce564d443bc33bcfa67e297254f79755bd38e5c0e28324fb3ac2a01410cc96e37dd1accf447211883fa89def0e8bef5d92482d3d2b6c3d00081541a4f366da0ce3478d9126d0b1ec418e13c28f633c5f8879be53f63c4650988ff798e448e63cf5fd99937281394a121f8cd8c444a75222ed1b457942353a9e8e22d8fdcef23e8b78d94f319711b83b109142e6646b62c334d84a4da5bcb955b4b29ee5989b0e1d119e9b5d5ec88c7564f73ec0653dade4e84702798e2e1324b6ad2d2a9a2ee21c0eb6f885064f2422efe0f7673e7beff3e9ce00331e536a600b8a50a2820d46a85eba9b8a8cbb81f3fde61181db91636b41036dd075c9e82b9650b942c16e76812d9f38605901bfb1600337beb7ed6fed1798095f6bd992e5d936954971b8405fe1a63c4a61f9304599a46105c76a828f833740681efe7ce02471086d8f600fbe7799599834f892f5fc198a01f75f2ecb13325cae73d76580ba27f685be05d58d8e6b1238588d843282d12444d1af4038c6eeb21e7f44a748f33ca45e88f34326f1ecc513aad91fda6c5d5787ad247fe781082d3e8a61e7d4f5714ed81de6f8d4907b9f6ad272606d8f2f316e8d6a00359842a40951ceb432c1603ba01d5887010cd015e204fc7b003d3d055ad2938303770e25d41455d5112a7287b1a1be32f7923e0ef105532fee33c90224bedc6ee05820f9c1d203dc59feef5266706d7065699f63f0471fd72170e385923f43869a2ce382596c1c601d296fbf1436e751ab9a047cec41aebda5106d65486c2f6909ebb5ac18f9d76a51c80a2649f2be21754ccd8e52847b518e485b666acf77b18ea34f356618162e9a9628738b7539b2214f0b4a04ba6f75b6a93d44ef269f3374f8f70de4062adeced341202e18b0c47d46eb6179d8b052b0665804b0333412d87a577ce61e38312e7deca2693182dbe1ca0d30d5234dbf9cf96cb3dd2841977d4529b61742d95cd9c53983ef6c74956bfe9c4c4f243dad71396346307c754d2b2c2b6c2e29767eb07aaa1aaf81691fd26905de27103e90621e2eb0b8fedf849e35cad7784fa0ecd518de7209c341d8abe67b5dfbf93c562754db39b93bd3a2a3e28f667155ff6d8fd64c4aa1490f1863043eee9b6760840eaa5c3bafa5c2e49ab7267edcf609e114102e2a51d608ac7784b8f214833797f95b5d234d9491fc38c36cabc8c239da6edaf1e0359dbeb73a2e4e7bae0c4258564cbcc545354464daef3dcc44d13ae648ad360a5a83dff89372214c29eafde923bcbcf39a02f768a45b9c91eedeae4429f8d0d287545498e20a06bc9ab11f8b9a484856cad049d4d943caea4ae249187db0f9d89846c88022a3a65ed47dc70f84433846412a269e57fa8f855879d99fd8ec916f31e3db3d75921174aa341a558201f8d448b4c9711e653f371ea8165e20e245b4e9109c3c0acc704de6ac8efdda2ce14a2cb0fb9c290b1c97a1062362cd6be001e80c9b7834931d5ab99a0a18be892fe72f5999f064798467c6a3396c61285666950776e680023a5a54714bae3473ceb2a583d1a599941d7fb168026d475a2fbc1e5e1f0ee4c90f86caf522eb4e4f0acc82e8c0433e368a4c09699d782ca5c1be97d4209f6df0ca32e2b8cd6cc3301096eb3309ced64421ac9312fb34876e3c60e61181ca95d14ddc952269c7960aa13ff2b33f3f2ce6843e264633fad6b406a89ff3836b871af0e4989850bd65446493affe0a661f010277c378a2087ff889edacd052db886332ea22a38df2aac72117d755cab6cce1a911e64af4dc6e8c848133bbc4f5f015ada078fad7f7d9b2f907e0b56bc594716f4f7bf1b59a4b287b48d4d328d5e675d238d1952261999d7aeb0498ee7b370b6bceca5a39198113b2d6af63a10440eb0caeb2b3c62a821b27601f5845da21e7f9746000c17db6d54e5e89173885ee6be695aaa2d3db0bc5f042468104afe3258368726a24d2046934f42a291fda2f1f0cc10dbeca4f526bd7d835976229f27791bee000378c751becc86c72c2920d45eab89eae32a275cf2c4f5946cfa760be440bc22583c5e296fb5f337b983cf2fa5f33f9531641dfc56173a3a528c1e8c09b5201d92f20707c9b266dd0731facd3754695f5f11c72af7712ed39e41a9e3f4f1d7ccb621972b73c3e1d855fd0cb97770ef9c575187e7a006f8c5a8922fe0567eba692b644d53b92802b7038943894745e897aec2dea5c70e95cb5d575581c4994d087ad9ea1ed4768aaacfe78ced1150ac291ba842c88fba1bd787e6134418a5365a9ef601174700bd63b483c8f402164a4880bb878cb2b6d3502d6d65972301f9e62cdb8d630337edcb5c7c5cdf57b6176f9a0726818afcbaa7731ac724c0cbe513c23a5db451a7173b56f0861b214f85eb8ade25604133de29e75b353948254932d9076c79d8b036a7800258a32069b9324f6d7c27334d581901e404900b82c561d96fddadc40b0d040d88462972abac9611a69340a9edefe89cb1c3183ce030013a2e479bb86936ef83a9e68d68fbbecda97dcd9370180592384e81263c8433e36a6d29599213723eeb500d6eb09901a01a4eb92c265d5ccc2f01a304b2ce3de3f7e5f18481eb56a23ebe2d62a063e328b0f0f40df0bd29ef115eaa12153143e26fc4b467d31964b93e749e62a43a5dc3168298728b100b1b80ec6f8b218db07b6a6ed390bd8995f21525cee38962ac591ff9c36b94460e9a3cc488380238310435b5faf928e96d13349cf93d89d2520897ce80fcd194ae528ab782902297ae0f1b2ad16a220d7c6dc21a4d14a1c76e363c973e57ad9a0e60d548bd0206fb8c7b9039d13db8243ebdb00ee74439f7255bd1f4ec21d9cd0e0b6de57b464f1a7196425c1f18c5f541548494c41672b53671b950c252973d8e91b9e3cee09d9d7772270015423c13af1f5d5e26f3f405c842756b8cbc3d85dce19538290af85c553774188dbaf8131978094bef518610e9f7624fa8a84fd8a0278db74ccda9f7dafff5f9d9f237ea02dc5a29ab4b919f9528c393c3de9c164e7cb35ae32272beea0bef233962b32db0e0f16877e8ac823919351a400a1c24450013d0fb925b988fae829ae0e4970c10e9169ea475dfb2e5e6a64ddaa28f54e883ea317c13f57c468e05ecd4f4dff10815c7d3056a04b4b4fc73e0a0c9d1475cab1aca76f54a0e646f8b0735d7b4b6eb5ea0c0528940d31f22abea33e5062c858b8862aecd5bba846aaf1782c06f7738b365e70313ada02b18d54f1360c2263aec1406ab81ab5967e84297d973bc7e5c553bb0180c5ad7636405e370a1a47401cfa71ca718ce08cc01b7e37d55782ebb35bea97efdfcdf1aabdd8b5cc314668723014d488922e9b2c85acb294021740271d2d973b7e98022b973ebe6861c44512a6f7b9fe3ae4896267d0099d730c6074e37ad1c160b3ec77961ab073294e63a919cdc2f78bdba38f8aa6237e277a78007960b3e8996322c753481b8c822afd57a9d2c7663106a31161b80ebe55ce952927cd97c1f715e7da7089f78222323325d19772a3d96953f7eeea1d3a0b40e0fc13161cbb79c16a30951624a95ce5f1a52c2693a207f0bdf9ab9281db04a51b9d5c56b2fa0a29affd0d93d4899a33864d32465ea075d319df2ba953be59c4688fdda411f93da0f6d70ca2233827f906523a7bb9fc35e259d304b1935f45bbfdae89b04468fd7da7992ce611cd16a0a129cb1ecf2e30b6756600f00bb11ad9a333336c19b041282ce866dcdf33f97f01ce908ac3cae53ffab33411a6a87bc29ef3de3748c6c5e52492b9cef6e00997fb87bb3ae9b8e28aaf90b58eddfbcd2800e7084d529e64facf896379b75d5445002d0474673ca73af35f7b2337a999e0127711094fb97bf163cad4816e7297c8dce9f6f5058c45fd547366dd92def29cca68968f7986467d4b16d6f83862d4e4e7f5783aaa3db2aebb1e72d614caf8b4c4d315567f6979ba7e23ad9c0c52c04a4eacc14c78268962ae30eb1074702bfbe997d978f4e90e04e81a9346f17cd755bac0dfe3421bdcf3c76f496a6458f463310b9bd428251c83002b1a0e0a15132d5ce1045fdaa9f29e6a1acd705fad96f29b59a7c8793715d953533a24f38298e1fcb71dcff2c1cbd1efc1a68f7c40ebb1f1e59553d1bb37c89de78c9134a3c07decb4f195770e55b1bd580a124bb05791a403a47aab7affb2674791daa3b3118ba5dd460036470ac5b56d03b5e8d475b814e1328089fb0768c0dc5887d0e25afc63ca3be308d19aa07cd7029901dcc43b6cc0f951a2482032cf8c8df443fb896601360f6dcaa5bfb67576ce896199ba15b2dba4cb04d5aa7240a9ffb64b8380034436109cc791d688f0444d7b0c4b0388108f0e9cc88af3d6887ecfb3ad50702c895ab30c3c4a00d0d6b63b4710dc2ca2d9be693c1407c94adb52c9111661118200bc1f84df3dc80dc7f7fb356219543d3c4928665710d1c7799c9f527d19501addf47c29a60e876b845b70f9170ea13b4ade5283f6dbf02354397b17052eca2e57bd6c329be4ccebc7c5fcf13c1f61a7bdc2a88e20528565754e84ab1e0cd7ee0f5398b6844909f630271b887f9e30ec36f8a5eb4d00d7d2c39190e958b226c20d948e5504496943104b9fb99ef8a45d644ad15847c6a601977f66915b7142bd5310eb79321451fa669c6d017978b615ae7bcee1aafcb18fe6705f61575b8ca872a7bbe253bac4521454f29e2526c0d2c0ec74a23639ad83e0e4221065a5bb25f3d2ca3c9af50f825930cabdf2de45caa81cb12481b829ebfec8c6411a51467de95288f414abab9cf5522f181d3a81e7985029c337d29996d664e988b51d3c8a123ba42cac5dd4543cee78a73c289e2144f5382b7cf875079d3a98328c94e33394b37a46479702b4eb128732bc9956e6b8b243c5652632aa3f38a703308cd23f6103a0f96c9391c0f3ba3e5e9f5f47685455b4c15234e5a0e3cb260da68c47a1894330b7ec3d81273a40ea83aace035e68a9ee6f1cc4eac5c39084aaa8c8999a6a9e1fa57152d02eeaf8e10662233f71e8b90c782036d6ff777712a7b883583848093f716565686e6fe766a35e797f6070f0337f70d5be6e7d1d8c4171093310b636fd76130a6903c797eb0a005c9af212bacd1815daf0f9c777a0d388dcee719a289ecb1e2f5115b2954d01e2234f4c7928323f1d55e80d51b4297dd218f8293aab14c07515ad861f63d92ee8c970401030ffe6cbce41f34bb02cc72b9f1b4fb180147e2e62df55e8534f602f9621d239800ed35bf4ea1c92dfaf72d7d95adf0e64b91556e4e90df226a6e1e0093cd353ffe919910eb4e2a8a5c4029fbb29eaa1adaaeeff729f42ae45c922ad6d7c27e37904902ec0439853692811c6957ea5a61654438615aa6ae5070e114cacf170f0d5511bc3a52a214b6ee97505bad45db8d416e1efe0a1fd388aace07174163e1d67b78180555983b53aaa8b21cd8146647c58582e86327edaabeb101e8a2ce2a6793a35c0f062bf64a851b341905285cb2259c8efc19647a47c3c8f0f920af27f98a295ef08e10a233585c9f57d99c9e67d5fbb96f47310b8c429ddc4e94aa8e61b5f3a859e19f8cf92066b8e1724275d83a86573b39f707ec2ef5346c2f4c53873439abb14a5b524cf4f6c8cc6e6ad17435128a83c489b19dd4a062349addf582374e995e5b5692d783a4ed86953ec171bada22ca10c79e96c6ee5782e841274bf55138d3c725877b8f1379f235d0b13f2924f73741b96598b97b7d3e054d4d112197c08ccfc540ec5788c6f894cccf61dabb0cd92e220eb3f5ee3df26a8d42dccf6fe88b645a91e586cc0154a2c474d8aaf2596deae949efb8d5251ed424ead957107c6f440af1dfa49d6f72ca5b9494e49fff2bdb6f4b449f1c7e7b14a4165dcbc077f521214da4cfeca7ac8383c625bfd6d539f4fb3f6ab31acc7cc96a16a73f679460f99d827a806efb17d930a48fe54e9b18f3cfb94e64c4104bb42be94d7f5984d168a57789ca65c5dbc27acb948d11228231a71592a63c8107830413c4d67fbc05a729fa10749a106fed54b7435c0cfc626ce9f9263fd926e70402037ba325d5ce74940790f5472de23e6a50a30f299976fef0f58f0266f9b953f2ddb9ab75d2290ca18352da45b23767984f00c193d3ab4ec402ab87f2532b8955614cfdc9b01443e54ca2248a512e4e1a79e56983de5c209d6c377850641f1255913ca9b1e6fa146b66017b2fa514984e86cb098ee105b6b354282f3c2656c9fed7a0f0d5699d9a2f4b89e9091ecc9960cb49ed642d30f4d9b522950de4c09959b0a50e2c40404424c4d3e009c693edf3552b06b625b238ab862d600786bcdae727270902a97b5521b650665077fa14f3a4d9901fd4243bd7ca890ae82fc59061b8bde6a2e13a9806ea690b7cd0d5681e568f7203655f6824c0f2822a1c787acce99a6d40c42521c375853bafb7a384a59513a8f94398ae74e896607ed2b0748a9aab7cb14a25cd351b06fe1a55f1ea1187f5b299320b1e5b62350a7d3a81c3a47864bf997818ff41048ebc6687e830bf407df38c0715944acbfacfa1e59755e988547e1f835665c006ee417ee15e2e433ce65855e7d3e497ea73a01ec90033f559475d356f590ea00e003fe154253602cf41d59d2ea79fdb70d2bf89304af27deb740af81d61d0a9a25f3266ecac49fed5f3e36cefd6e9a9435a595e3a26261ebe863f791a2c7e82d3fbb51e39fdc70f78e7c618394befd5d3e810e399d5cfa2c0923937a8bf1e1bd274c356ff81c05d2ac6ef13ef72c12aa202384736c7c608f89c2df1b772c48ee4e84275e0cf54f81d4af1bc4685f2b4f350e59b64f12d93325c160a8af4693593f1c2efd0043c35ade79dcef95744d137a3eb556373f5831c838480ec40b80e77c486596bb834ed483e9951be30c6e081061bd927ced55479d5b74aef064eb13dc808947098e1fa9c9d3f06b6dabae209ca913b919944173214876f64e71fa17e669a17cfd6befde18c7c3a63466629256792adffcb7894059ae8960923e0903d75644ee6e5e89484c58c368dfaffd87725de2555b7615f78966594195a4c3dfbae0293b0401d7ce68b1b695c832b66f20d534c0cda89aebe589c8da148e7e067eb05d248113ac09c0944e42183e468af987407d5956972d7cc8369a3155f6eda986bcc8f00a5177b3dd79abe1d31f175e21c6a5ea4d068b697d938aa4a89f6cf93e1c023461834f755d407e3afe7941fca5693525bca8e5faab1789db73163da483b44fb3e6e3af547cbf35d9eedce34e1dda783ac6d98d2c9b2024f4a4c5a0683531939914a23de8a00b9575bc59c02cd0b32dc6da884f75d457bf7e3c56699e43326c545972c72bfeca24c6410dc924a83c07cbc0f4d2800e7df7d5354aaa0101e8019090710170aed0417b89576c595834d04967ef54822252341842f126a0dd0890ec50fa927837f2ddd9fbd57a0c69b08b846ad8f8b3db51409d15902e1a67b6ec310602e8c82cd30cf4c9ac1c4b19ccbc6049c189947a54abb99b074353255bee62586166a0bb8016a560300de158e702f2bddc2efca83444cb337e2e8b97412a7d8d014ce75981e1ef751028a3c8301a977512c82296d2c1b630d2b485fe00b175f9c3a73baaa4a15f22c3050dec52ee5c9a91a0217f6b406192044c1c549638fe3ead60ad0f4f54e13432a9053096776b8076021505990108e42ca92245577f510f4eef3d600356082310f88bedbc1c3715cdb4f7ffede90980428aaa0fc211cf19ca66f90d4150d85c07bdd87361b1776af9465e73e6b7032d3d17621b72534f204f75aed0300b9d18e99894b1808bc3f38a4c397f5485c6a1adb87074d26e9b5ea6fd7d1e9014bb8ecd15a24430483a6dde13c582536add2524488c428c7ee16b342ca9891676943c94b0a025df56eaf844849205a179bce66d2da0dfe655e238aea77d6a448e23a80ada3965de1b1111e1dd32a1711018e3271e37c5133f2dcb43cade221fdbbc164202100e7a3aff67defee61f53340d512fef460f8174aa30b451846e78a9ae1e7dcd1c7fbcd94039e5831ac6d2a2cddb65b0c8d3056d6305d786e4e3f536cc765e693ea66158bd4df5e9a9f583a8605e05e168a9e01f83e58866ac26f06a557c9b59deb88519d5ae63153b5006082e2c14e7159b65df18cfe63de51dcf16f1c8441b8310d92f2dec59c17fc053a98e61a96627e8e1ca90ccbf2419d88ecb5be58dc83f3ff3d926f40aceb605806cfe1f035a80f72115487a2e7d5f818bf3b7fb4054d4efcffc348bf876ddf9174cf933788be0bb327b2f57cb3ec2a76fec39b84ab693a03039c57fee53ec500703440a445a9333a062186c1ceb48fcff9000c9e5aaf5576f0798be29bc440eee2bb47648d3a2e208ada218e88ac5ba7caa360a73b20cbb729ba426d2f28d7e67871c689d15e81f52e4913c44dad76ce23680509c05261930ff21ce95ebf5b310a178435f7f3b2ea000d5f225a6bd64b6ab0fdbafa63186ff45a9945f1cf21e068e3f73dad12e858993851533670b9cbd15f98636be589cd65a0deeb9757e61f0a221d11eacfd78e9066d96a7f6f688f46c7d2ccca5996f39e74c453f2c8f9b8e4571d071f3803805b66868f84e7bb733c2e7819005539755029e411a07baee0ab4109ee1bc8bbf5cc896da9ebf1caf1497cf56fc2a00c8eedd91d5bd941b652211d7f02aa573001c68c45d5dcffe8334ade181f0699feac133ec8ccca1fafe5ab4f5d028ffa6bec49826a48727b98689fd463d9878c4b6c7ebc02b7ccb3112b21f3c8bfba7a73cffc50a357e018fe97b52197cc600ed3141861f1f9b5e5fc7d52723ca63830d2db2ef9daab53167839008a26f23c0ee2a7d302c14c98e1fc869089c91daeb3f49f280ce143f96d573b977cafa51553257f5d33d9849868019d66bf5b1cb1f58d59d08febad9d1284db9091f1b2b5325e1a15f7e1c56bb48d71bfa05b459a0a4be3061a260bc9b6308d073210bb5fa145fd7d1b331fd35450d41da8ee97bd1d84a4e563e8cc249b6dadf6c0260907d8816608c0820003b853df9500009ce7e33bd097c065a188c30f017cbf988384f1ca7217099fdcff1fb9a6d718b9b2af2091dff4e8206f4147697caf852e6a12187487d4e19f50982c3eeed9646cf7dfb49b1e969b37eea308c8ed016e858331115867370665060cb76d72c1ad1e9045d3000b3f2c65bbae9b3e8ff8c0d8d9a19fcf95ea2e314b6631ba1da094a0d3ba93c77de85f8fc02c64895ee1e1d467fdb9a9a5998f25c5ccbee4345b122b7222303ff5c0a0048654c2d92a09f1253098e736e43309893e6904ac654c5461da85a76035c9723283908b54d0cba76f5dfb7d140c32bab52028c4469c7dd051aa1c650ded18f40ffc974701212a3b362fc994472dddfbd1a0c00d9c43d6d58c32e7bafa535cdf5cc7b17309abb81eb8dcc4d6cdd29ba0492b751a918a63831342e5adb0a5787c10da56212c68ef0b170ead7f4394ad6d7f3fc7dafc8dbb3ef4134e914ec3efe792ab1960f0968db8bbb379c1369403ff85f8964c654a25d1228c420813220bbb395c0d5d77d7396af63f97cc0e0c4a766d34c34359f1885856c691a51020d40a7993aaa568c1363ba063dfc182f7e1401ce0e979da9bb299b8d9f95331c68644fe5124b078c52c1e02447e458b2bf8ebee8dfc8dbd8c997a2e18844fd06fb59dff127ac28e6f86da599f4ce2996f8774ad9588c6a45fc059906c8a8602a70961234186b6dcb4392620a9f6609c0645b64df6f2fb8c48a899543b44ed9f4d961f4a01089814f184b1e42b2de1a4076fd294de9360be77a5b373231faf40cdd38417cc3526fe6f09ed52fe2884f81981c985341209c1b2454888c3d95c97ed38bca11d482c5b0974c411c63aa5afce43d9eca93c1891c707c79c9c1935f1ad12276b48b3bc380f76afa377c1870c98a4380cb267304bd6bc4194a79f20b5cdd4676b3d366862f37286132b4fd0d6da8eb659a35249386413fb6e34fdd2a8ac147c19bee5349ff7fd8717781533d2a62b94cc555a4f585253e0c309e7c03a0b044d94507825d899f4e73de764716d614a8353c7a7c897dedfcc1d5c71feab455c9c230b002010a420412128e01fb19fa7cb54f545a2272125679c297fecab3319646a7a675681c83a14cce91d9cad30558cc9d5f84013448e0122db258f6f662f772d4fb9e53f91a7d7db282fcae9ae2766316d6b234b3b39a2ce728bb055453734e6101191eef7591ab54664d98c4d4a32fe4651f89391ff3fb48ee4860e5a6e803565b9514987f195424ad2c6fa8155a8b96f0b13cc204f49745081a25ea910d5255c6d6403dee7d4bc230eb54a6d8b7abab65c8708ab6e8479c4a7880b38c55af1a1a3b4cd98abffe8d9817e8aa58f0a7d72fadb52f7e2ef32099d78ee74daa4734c11c44ca865e91d678982d61838b57d33118bc877a1f200c5a7c4f65dfc95d9284004b03915ecd07ea7eb39282f354432eba8c2dc1b950fda42d5bc398988f98b9592997807e69b9719f6f31ee426ad1fb6246ae9b0c7ad065e5ca2ef9d38c470fe906d7af62c319a8df6824c6b62accc28a3231a6713cf0f4e9186145a5d3a7bf76b53ba132866dd79225229f46f10d7dd06a609138897d466b2cf938034abf2ccec01235438a87e953028460e91295e960809eb8d245b65ebabb4c7ca5ecaae42b371459606f4e9687ec11d9bf0aaaa736af4ddb77e026ead97500a684a018c16dd3d31e3cd4df0dc7f21c52e0873b6505e8960d1d2a096a96c44341e3e1781dfef35862f6aaaa4122643bd255ec63c648d78adb87f11e56c7223feb019b38203e79c3721c9cfc26d16aae3889542b34571fc34907a470ee7a561bf42a1937a19246669a026c28e0c186e0a54c5c6988aff6d00252d08baa1f0ff06f03149d3aa0c5a17412b825a0dcbc43202674ed4ef8e87d7a05a8d20339845d205a20389c5f46da31134a1a0f375916e9215655f6e2ec66dde2efe663b455bb3d6c5a4da896094d764c213a3bd1b7a49d770a9dd687e9edde89f1ab95e07dd0be03cb862061a1fcb9b8a9b7efcfe90ccec291c0d65d34302e9243ac9ba03dde2dfb5221bd9a0e103416047ec14d90feeb6f4fb65703a15b1831e193e747932b25e91945091e8f26a421e90325b5831ceadff1d21256ae48f67571b73606a7ea07472f9c9267173c1dc9bb428d162c437d3ea12fac1fd621d9844f7c56eac85182b6ef11f9deb94bfe708d2e591a5eef8a794cc3a71b0365d96bb5a5899db4c957e918abc9790d39ad7707bc0f96f3983dd3f4ceb196235f5cf82771f5bffc2878905e6633f0703ccd57715807e976e1d0ecb660b68a6e8e261d92057570b400fc76681974b4d5d89cb97c9c8f7042c4fe7095fe436357e11339cc469dcdc25d2707c87a79a17a6fe71fb4d1817f0f85edd1f2e203e84a7cd6c9a1bfef23b1af760775486446a2679ddcb73b86c293dddd8352468921018f7e3a33a4bae62f64cc3f4508445c2494f1f5110d0e7609b69f8105faf6f8df2fb92193f5a2fbc4b0eafff4b4f90ffb5f58db3959e33e267a032a4d9576d56003107e902e57cea7421636ac0fc305135ea74f3a340483b74adc6065eb23abcf7cbd129ff5ddcc030bf74b16a9491dc7757f9ca5b40dace3db5111f3bfee00f748044c3faee000b069b19c2854c8d8de9118dfe4f9bb2afc3dfd396b027580ee36dc3e83aa455f98974c0d203e3da04e7d725a729fa4da118da2f6298ff6a47a98af72e1fd5bb81dfc9df2fef27d8d35838aa5f2c83b6f2761afd269a92bff7ad3012699b7ede5585a65882d94812ed29f9c3a4e5c8696e386c4b1a8d75ae9bcad2d512dd3bb61fe35c959fa18b47a56f682d9ec114c3e37affe94d97ad2bd559dd8660dd37d301748d8d34841582410b6b26c1054f5ae8995c3b6fc570cbc2a3768090410ad790d9322e68a190db1c034838f55a7c91c1addb71a1185750ab57d2ca70a9122f1d58bed37313d499a3aa2f1785a5806cf11206a8ce91d7998fa9823d2ca773d603d2ebac83911c1fabeb736b01a793b88df8c45a053812d3b127b6528c4048d26c52bbe5d3eea6a3d5b52cd6aea55f1e3f0afeb4a62a7383c3d8630a00e773d3939a105e84c36677b757bba2244d0d88f04f410fa3f42395a027d4bdc1ef1c62cc44837245b443b1fcff599019a9fac0f18bcc7e3916e9b7b7b30cb65f9443babc5747bdcd77c2afa9f5a881a0f56794dfc95f0285ec8e7c1d9e74b77c3e46d24e10434a7e1767dc53e27b0cac542a1523ad656f280b327c9db4a9d7539af6fa71f4d480062f487c322a6298febdf7524b9bfdd9a5e1a55a44ba2b7350be4b9bf8e54b0f84d0b54c98aaae087b0a512a19ddef9fc591e158e4e4a11de1cc5af092744af4ff915aa5c5af9a9aa52374aac89032f32a7535a770e9de3047949cc9cd8c47b33a8e48c84c68340a1536d7b50423999e6a2fbe60e7b03b8d127dae89147b2dd0a48fbbe707dea9d12b52c22fdf2abf19a919da20cd2a4db4198228afcced980be3f3ff8d1cbf733d253b9e6ab450aa859ba73aaeb260c20292b40cb258189aac09dddbfb2dd834b33d40a59bea41cf9f3c225e398757748817e4b5fd9738b58537e08d6062944efbc726554ea1360f3228b1aff56b749ffe5090c080c529f03da0d2ac2d132db0b9ec88d8143c3f2055a07ccafc1bf4b76d13afeaeb61f91bf94b5b1f674364e914cfdf26823a479f3a410d84747650c84722fa4c340724d1869eafbfb6ab2d61db0bbf1a644a0023f7937124f2f077e42dcd7d8b7c7169bb1951fc63f36e174cfec89b89fcadc6e1e7a5176c0de38633bda0e8fbe34f667df518520bc2fb2b372b281f52cf53421fbd3ab4baa3cc6602fea3423cc8d77e9c625c7b97ff5b978fb67369ab1739cfd9e0d370ae41038f6e80278c77645f7d1c000b060b7a0ac1983db5d4f921187a270f916d9790befbb2150ebad671eb2cc9f70af69f50b8a7f11e9e08b84f631c2562490bd6309de4285f914b43a3b1574f6a7fe8fa6d3413ab51fcfa788c1a93037baaae484f05fd4b6260f6018880c634e894f26bcee031a28b415484dc834245424f5a4a3bd188ae6f58c6b941bad997f17d4d36576b7c9b9535eb879d906823615e59677c79d7e5587819b9afa89133ded77454fa4315557982b1bbef0f719f033bfb88774812d7bbe74f92f2005dece37023091d8ba727b76c512e7af4fb8d3110dc4ccc3b3c7d258fbc73bf1707d030d7cf71e1ae65dd2c26d738db7edc392a0690e15ec233dd06d799b4bab25946d78f069365a6388fd0cb0cbbc76e94f83eefd30ea0ff83ebce17f4ec1bcde300f0312ad7738c199cdd2110551181b71bc18408e4652c2e3171d470f327dd4a385a264857727fa93f7624508d2288bca8f5a66833f15137b9421c100564d9f0c02ccaff5074260dd1d98c9d0f9ddf4eb9c71243f5153b01a1abf3baf169d6306bb079cadfb97ec907248efa849f89ed7eb55ce3a06ead766e9a81d6ffec87fea3640ba8c2b96d1867d7188e5c9b50549716a3c31d581b15cc9c9e73bfa9821318a8474594072d33e4ff4c739afb89966ee5f7a4e07ee4976eefd032870e92981957fea353f991fb4359a9f3b50c9109502ff8d24b97c2d943307dbada7cdd8bb5fa5e669953e5a3a5bc25cadecf921d407a61c366c2dcfb834b15f2686c796d21254eb8292039df228fee9514793661da59b5894cb379c528835ebdeaadab1919a0f3970fee5be89bb0fd141d4c58a903ad05ca9dfb32d1c76b6dfd81cdfcf76fbbc8c513c0c93e625378e1f82fc647ca5518bdc26ac55fabc29fd0d26bdde0dd7730b6dea7495db3576974d3903014a7d0cee9f9516e24fe99e571e3a7acc97c59f50b41faea7302dd074b3b236ca7de219f377d7a718615eb9492636df78790671e9a30525964b3caefef7e72d41f08987cb00e816e183356016e22076efb8d8dd93d89e3569c990e639ea88bd591691e0f79cb2f61b39ecb03a4e508c7188d9dd36713ace720753c97c6db793b15f1833283f34e7242f8036a56db146a0d5e03323b6f6c6ee63d84b08932f0acbdb1a1453c1ffedc9bb66cbc78a1e835adb29c097d3ee47cfa2326cd1705f2f8baaf433e557cdf6a2b6771637a112aa23da5586142277f1a3468dcbbe6da19adf699787c2a368e1fa7c065ccf06b85e3d16eb0c8268dbd5e3804df5580b31193fbb2b9d9e2c4f3d0fb156481cdd8acfddbc86182358e398b90260183fc497e65d0a083979e58a80efeb373f79ca097fd0f264a31d2539ca0e3deb8c5936dae66ff66350bf90b8a4abdd19c327936b1bf2f4c7fab2cce688119e442ce637cee44213d757f0419d27faff9b129475b5817fff607237ede5fd2758539cb16ebe3ef1c49e26b5f656476c6ae8c45df2751fe5116f8643648b583e5ae4feb8366e94fdf0f07b6fe24cf2ed02ff514d9bdb3571d1c49c68cce974fbee7c5d88849dd985f0edcc6f9faffc8bd41deac4b757e8ffc11f17d652c549fdf5836c3ec1a69ff05f67f187e71e0dc010306905219419f3bd48625c4fd0a23ddd58dceb9e81673da2f4aff6cb32ae6f8ad2632054053f11662d629a8f40ed69cfb8b24a92fcbee4746243eed5230e4902dbc67a7792017aabdb67d944b8baa649885ab503f97dd88d7e80f76faf273ee57abc92325cf6d4e67abd03847028b4f2207016d1e5a076c570c5d272c33301ed51394b5ff2cef2d80e83a7efbc3cb5d1aa5d31b7562cf27ea317804fa8586528954434bb833744509f76867660dd1259f40165b88872c089028a717c566f649e034f28cf742afc52e0f818048705d026cd29527e4187fb5f01d4e02afade340062be18f4d46f3b0cc8f04aa274698164aac74014c4ca8ca4b6601dd22e9c74ce825dc2d53464f73a4d10943394f94b06c6035049e0fb8d2e9be4ed37479be108ff4e2cd02eb72170baba66f715384f1d23b92b4731c48ad76b3e717a7dd1c5b5ad328803eecf18babcb447160e8ca0d0c8d755feb07f3a1189ed9b8587d6dea8a5173bee46377e8b795649a15de8591fa79e1fc101271b3dd22439c481cf61bcab47e8450dbe9f897409f7b10b2fa180266726df67f404e3acfe5cfd8059bc0d83aebd289bf825944f8a1d285cdc7fd834d326f70d2147be5ed1da7ce1010bb154808504da27b7c3200bdb72deddaf5fed061f4cdfe2319eca6f17af5c0e40d7a25205ca324dd71a1b1dbefa5692ac73a6a978125dbad20608d502059528a7a4b079358b68c5e841d8b69cd0e74fb4b816ea378d18fa980ffbe84be16d85c34688bcb42976ed540494b40b6bfa79096365169b54899c07aa747890ad3cbc365147d4019bddeae79ed2af6ef475a06837cc1638579600f9896d36385c9ef814562c1a6f691e4596906508ce5a461ceaf901cba8c93b2ed92508b13526e5e690a5a99e467dcf575b7e11a31e99cff500df2ea3bb5a4eb439570e5a5e04c7963f1139c32e627977cc290fabdb59675d8b62aeb98ab990a930cba68168e67074720e1e9a4ca68a64258659cf5c5e9bd97c42179e668e11fa8c153f8c43d017fcbd9d82784107d389feea4e31a677b2ce802da90c060f7b9337424094902b7a380a6cb5b0888b815913715b846dcfe143fff18b31a916615d07180d8a63fdfd3c94b3f68b1a4b0354eb6eb5c3f279999e9899c0df4460c80c51307667935b77839e9d6404074a5a6fdc2d88b90a620c64e26bbc25d16ed4538309f3f97fe29aa4f4688bb4fb0f9a8fc7db4c0a74791486f61e53dc7246102eb4fd07117b0f80290ab2ae210bce6c48242e252f964834bb12216436e552a5c9400ec0580951234af6421e021c1911991ac8ec4ef5d9526f950fd8334813b0aa37c12744a3c40d4f0d5451d40f1a46eb810450a5d1dc1df0502994c56b446ec14d27d0340d4c972e373af4cff177f4bb2827b063ebfe66c0b3d413669d94b21345b3c1cb9787cc4c8262cb8369a9f808eee1506825ed0249d48d1b31f57955739326a92b4042c114cc2c1df67c67c093e80ca48fe56a3552d4a376f7cb9ee6ae17d092b651aadccdd95891cb6708cecdce18f7e09ccf04a3fbe60c1513bb6fc1faed5fb035fe8002d06be43cd358e66b6f9926bca7c087a8bdc934388c2e97719958ccd9cc2924ab7dc03484aee702fb9a8a86861f238e2f26ab8e3f6a82d64623d381106b7a1c0ed82e53b49829bbe915b7a725bee9b5d5c332d01b726e0a7ac4e91b01d5c5aaa944bdcac0dc7c908ddd274b1cdbc1be816776923e799f4723d00fccd28b9a9c927fa7a78e260bcdde496215b2ed16f4eaf0379885e5ec62a52781e7c3c924902b5a0cc2edba44ae305a678468d63c89947b3546d37d2392970baf87386dc4d7d6e4e99508d0cdeb2daa3e6e445955d6655579dbecec433aa69f3b96362a569402e948d2a014526465fe0d26798aa3ef91cf58af33a5b9ed718ca9ecf46a593cdbba724e0cad3c98eb1f4ee5b44abcc532c9c13a132ce1bbd05262bd145797eab56616fc35b707702d9eb4852f13ec8eec7294768b6d3eae87c96c3a4cb8d1ab1b3bb93730adfe6410c2e6cd970c6cb23e0e9c26a6d20f1949ed4b6011bd963d5caa2d4346e04d25610542c971e642e9ea1a9d6b148395cc4a55a0e0a314d22d1281ded2aa523da797045c547a9fd1f34cc805c574c5288ba61b297a51b3b7212926358adbb480a10cd8a1a462e4aaa35744707245035054556aa9754d5d04ce884bc0435c2184acb1035f66a9543040c5d63c1a42949c1a60e1ddd97f122388936517ca6e43c3d818291f9c5aeb70236dc420619de5ca371911f1a8b3ea52a8a92a930320ca65a37df21a16b0d01bec6402fbd0353ad43749da614a2f9dd9dd7650ecbe39090f2cd11b4da6a6ad25bcad8cb15aa5b542c8458b36d7edc66d4f7d16bd401ef8203122130915692af66e8b19f9d708a4ec6f66e3f3ad1ba171ae9395b6bec4a60b25e0255dc379d4bb81bc78e8ef12e2cf8ea349aa2ba9815af2c8d8b9693a0c85cb72d016f7a1e1b6631e5775ab720c54c90da8201719091a802bb68f3b3456924e81010f3e39b24be2615bb4a47862e4c1c33c1f5afd9af6ba6b986a277b18457164547a729f502680e4130761eb5a0353496480e1c839dd6a21ab581afd5a455953f9c4c396e684bfe14082d5141b3485ccada344aefc2b484dae3d7b5e8174e02b8d2dd10c30b2a57a8b57dd8e11d0a2787054604c1a714cca36414433874a730955dadcc0aec7707372a1b6d26b7524a297bec87cfd0b8cca71e059f7013f176efd00b1c005f80979c5079d1af02aab6f622bdde7d49af03ed58968f19f47742bee14efc6a2ca440e7fa7553fce5c5a2316012fdca284b55ebaa1216ffbe329684a8bfbe79c77f75c8b91ccd4d983d58c0275a2dd54068865c2fc59eb66c3b90f395858067c3d084b7c6bcf4580fedc1bd4efe3c1579fcc2dccb756d2cdc587e2c8fd895e46ba588c930aae7b8129808303f54f3fb2df2584c1f07e2427e3633883101ccbb579bdeba0f423f7977515a2f07f86c4138b53e89c011fcd2880a75224975138c3a7e039ed05befbee02d586e360ea111df69feb978c1b32f6a84b868914e1d9a2028009b624956ac3ff442838e5b4aa637dea375e00e7283d1d84ef2141b5a1757772486a15ec38c2d1f77362a00eb58ac1240e4bce83057eeebd23154d8f6a9d532bce7b66a4de8ab9171af8e6756e7e0a276d459cf0e79e134084e09cac64c6bbf7d54f89f543e8cc9674247df7b3f1a79862b0bd3297d11139f89d9da6165459fce4dc8961f8e098b681d0ae61d8f6a4f6ad1c5d4f44ff83bd33d5326efcd4abe6ab001d044d38e50e97ce6c0a187710fa4acab08de56c262d07cf50064053307b2600be869c099c5012161c9727419061759f8a1a6f4ad791a2f772b6b1a8e42b3591a32e1ea2fad2400326cd7c5b2cb485bcd635a9a5db6ec0392e6840a0c9ae66e1d04a4480c2bfc458b71992409dc121fe69e1a9f3af6d0af0148e346620dcdade953d30bd912c5e52463e6e06bc510ef2bf88b126e0ce581fa9e91c2104c4e0049f529eec4f36d08b876ba7099b13512c9efc5f390ee040ea57eee30f4b9b855fc3879f30a27185a39cfb6aaeda3bfa0a0713f2256ffd417de71b375ccd3739b7a7b175c4c3c06b6c23e108e20c68c75a7e6762b6b347255f31e461cdca7a9af0a8209fe9888ea6e3654cd432af4dc4441c28c50f43a20bf16113746426680c0ccc1b23aa19819e995e736de9c2a3b240fbb51732825280736c137e47160c3be5a9fd6ba5d054c16e50f25005300f1f58132df1d60606405bac72aa03851316f8b2ec4882c5d50c404f1cf1af62ca0a10c4b7f2227975da9fbef65b79120f21c1cd190c790c7f0113ab9f864ad835996950efa0a5b266b8a2434cbccab179fc1e5149af42269004503bc3aa850f5e8e9d6d9ded50e08ed27711a57c15ba55437fcbe55da8db910ea9d685ceb71668b4e3c12d4e55b87c148aba563354b4b3f12333c02509e864e99c18caaf5348a07251733166949299d853f115ef4052d5f1c9ebd3415f6c3b38af8878ecb3c2278a83132bc48a0161c27a1810df62102400c33a8246d05389a064012b6d90ba46122984f2dbdb38f9917770cf62564f271a019e3e7961799f350286ba1ec364322ff270a887641e7f78ca6fcc7c61d1791cb6b8864d3194e960f8aae0040dc42e35c6b2d671774a50f011a59c24bced70529c1f433a6faad3ccb02112f8b3d55ccdde22516424f175cbaf07599f3c80554f92c93c5eca3a4161b76b87132e8e5c762035afca214a54ac7dccd4b6eb5d2cd2693e26e3eb99471926e3e4ed245e0616937195485b8c3824bf0be30d842c2d55eb8de789b85087efedc4d2b92786d1335a5ba59b1321accdb3a67a31ef7125ab41fa0ecea5c42f6f2cfbba925e4c0a6ee20befd142f9aff1956e1d81b2c5c9c02f8d9225cbe9c47aa9f187bc074484ded9f8cce30ab552bb3626fd480febbf52f0f309fd220e85455901b858d744e86ad541b4c753d8b98a9858a6e4006b408c833468845b9aef7e6192e8e6141e837260c8c33055a158baa5110186c913ae3019497f97ac39af3473f5ff3fe05ae0d3f84e7b1a589f09ad5897b1bd76e24716ff710d93c4a8c10594244353a024dec0d2c775060010d38ae2074d9639d863b6203e4ec9d440c4d309102c70a390aa00a348e4621506f15e4ceaeef1f0d340bc9b95dabfad4e6530342630d32607c1183e5faeea1db01a132a6d47812819001ff42356e40a53c4db536b9dad70afe8584fe8568d86085f81cd4522e582dd4f630daa35bbbe2628b11c8d6cf00a30bfd8cac7dff34ca182335cd1c04881d810001f2e369b65452f7d29150194463034d64fcff108d31c6186306d6c8400bdfd38b24eb26657bc231494da92067558bda39245547aa8cc61f71d61fdf1d651906631763dbb32ea7dacc3cd5d993061266e2dba139d5f59860690dc4b667dbebbf9cfead4bdcd8b9c22cb6fddc6ac7188de5340361bc272bb3aaeee534eb2cfbd6ad8a33d63caeee721e9e27f7f1dde659b9ab99f353ab96abb36cd1dc815635d1dd095c559c4f4d85fbcd5e74dfde7d62ef6ef7f869bbedb85467d96a086b04c71d6d72b76b5eb6e9badb713bccbf9e775cc5d9c9d6eceda1fc4cb94edd6bef1a2bff561eca771ab43fed53750ffb54aeb33806c33198aa3bee3acbfe6d159842d9a9aaa2f9a76f261775b736d52455a3a26074952161741519fda73f2670c2efb736a9ba6baae0ad17b928dfe9aa304f9434ba4f1ecfa67ffc66724ec179d6461d638c3a341875d857eaaa50f3b892dbcd274c534aa96075ad61cbe3d962bdcb3a2cd4525803cf9d797998e6def54ea3362d6dd6e63e4d73ffec79669e6f976b168bdb6e64fed330c0d099ab7188cb50d63854350e49d959ccce60d6ceec153b136a13dd568cc88c2459c2a435de40ef78a382f14692f1468d1f6dfc196d08f17666cbe1aa9bcdfa1421526c6821359911e5755fa1a4cc16c2b4d1cd723929dbd38dea4955ee0905352a1bee96cbcd7c630d3d28f4f4a6b251e80f6eac91646ae186c2e447a11aff3dbda64eb3aff7f4ce66bf9d70149a60a481c28f33fe1c71354919807ea8b1568e322983086ba77d4c97c7b999d3a1c6caed7e3b058eafeb95c1bfa7575d7f3a918c3d8f6409cc111a40ea940b70f9f1a78b931c1d0019da51030920c8ee6cfdbf016213655e6ce285179bd0e1c526f0bcd84412b5170dcbbf685bffa221f1ff3dfe9940d0438297929b7f2915f1af26e2bf9a40fdab09d6bf9a98f0af263efcabc913ff6ad2c5bf6845ffa24971bd7c8809b874ec50c0f582e0c5e3f52f1e47ffe2e1e45f3caafc8bc7f92f1e5efec523857ff180f32f1e4afc8b8715ffe2e1c5bf7a18f0af1e3cfed503e95f3d9cfcab07ee5f3dcc7ff508feab87977ff538f3af1e6ffed543cfbf7a00fa579101ff2a7afdab08827f1531f957d105ff2af2f263011f0a14f5280234c28b80cebc0828ce8b80907811d0152f021a34ba7af8315ff493f5a21fad17fda8f0a21f1a5ef413c48b7e9e28ea21e7ea5d727eef92a3c1bbe48879971c19de2547cebbe4f079979c30de3527c7bbe6f878d71ca377cd51f2ae394b401cf8051af80104022140a6942f4e497a710a9517a76079714a9817a7b479714a9e17a7fc79b1cac68b55462f5631bd58957bb16a8317ab5478b1aace8b557c5ea432e3452a3f5ea4c264141118c929412f4e91f1a214212f4a51f2a214a917a5641f4407dc78e578f3af1c78fe95038a7fe5c8e25f39c6f817918d7f11d97f11dd7f11cdfe4514e55f4417fc8b68ff8b48f82fa20efe4574c2bf8860f817919a04fe5f87a823c7509102619a5e0c23e5c530bb17c3a82f86d9f26298ad17c3c0f06298362f8691f36218235e0cb3e7c53056bc18a68b17c5dc7851ccf8a218202f8a41f2a218262f8a817a518c9517c5f417c590f0a21834639500fc5865881fab20f16315287eac12e8c72a63fc6801022ed71765def5c59a777d41e75d5f14f1ae2fa078d71759fc7f022f2a4755b8fc5805cc8f55cefc780b0e8d55837ea442e3472a397ea4c2e3c7db152a96cad18f54947ea40245c5ea472a5b07510e05c604748c547f7ebccdf8f1e6e3c75bf9e38dc98f37a91f6f577ebc61f0e32d3874430116ac78170b83ded5c28880103f2290c48f0840f1ffa44b6c527ab1c9f66293eec5a6f4c5a62c2f367d79b12985179b6278b12987179b8218bab1c3b5a4e4c5a5262f2e497971e9ca8b4bfbc5a5ac17973eb821ea20127390098011c0bbc030f12e3051bc0b4c16ef02a380776dd178d716f9ae2d06deb545e45d5b4cdeb505f5ae2dab776de1776d61bd6b4bcbbbb64278d79698776db5f0aead35efda02e25d5b4abc6b8b8a776d75f1ffa4cb050800ef02c4c2bb00e9f02e4041bc0bd00088708c07e8d0eaefd2cae05d5a20bc4b2bccbbb4567897969a7769b97997969c7769d979971613efd2c2e25d5a61bc4b8b8c778530f4ae108ade15c203445db6bcd825f862972f2f7619f36297175eec72c3ffeb1013189d9a7e7492f2a313fed1a9ffe8c4c5e9cb8f4e637e7442f3a3539c1f9d8ef8d1698a1f9d04fde854060336c403b438f0a296085ed4827b51cbd58b5a742f6a01bea885cb8b5a487851cb0a2f6a41f3a2161e5ed432c48b5a9678510b9f17b5fc79518b175a14e04a60878e71898a1f97b8f89149e84726a21f9914f89149c88f4c467e646af22353d48f4c557e64d238866efc7f023dc6579e372fe6b1f3629e245ecc03e8c53c5ebc68448d178de8f1a21165d1cb75859e775d71c5bbae18e35d7e6cbccbcf027f80ebc6e718d2e1c2418c77ad117ad71a1def5ad3e35d6b84bc6b0d9277ad69f2ae354def5ae3f4ae35b777add1bd6b0d9677ade1e05d6b4078d71a31ef5a53e65d6bd4bc6b4d0e367a8c13d0f0e3043afc38019c1f2710c08f134861c0d864cb8f4d42f8b1c9981f9ba4f06393176e50c1c1bba830e15d54dcf02e2a8678171579de458513efa2e28affcf41946388eb799143f122f7f322f7e245be801781365e0422f02290c7ff13913ee0e879114e142fc2c9e2453864bcd8c3022ff6a0e4ff71e0807a11c79417715cf0228ede8b38b0bc884383ffdf51e44a63ef4a9bbc2bbdbd2bc5fa7f030ef8272242e00fd061c098a3145f2c79bc580679b12c5f2c2778b18cf26239e5c532bf58a62f965b5e2c4578b134e1c5128617cb352f96725e2c8178b17ce2c532d08b25182f966590a3e84a20011c43070ce140208d7d31cd7d314d9317d34079318dedc534572fa6315f4c83e5c53419bc98c68317d38cf0629a155e4c73e6c53439bc98a6ce100e3d84766a6c297a2a8095911206dc292aa2a5c80e6d434339dc701a63a3ced41456a295541d1c3a2ad8c2518021829eac2242f5746328e620c42684395c8458918bdee77ae84e7b7a8d6c21678b14fe9ada6a20df758b6eacac8358b90b415c6c216a1147d402276a3113b5f811a88e1634024df1811828823469cd020031d83b91c5d11b40b885f50ddb9417f1eb3bca7c4a3930d5599a4a5d6da6fe6d5c0da8ceead9a1ceaabaab9b67831a2da964e1a689e66d4dada267ef674ddf5454ef1d9af27435f70d9d02c6157b1e8a7885972b92442b02fd0e1a387442235a5145147626ac62cb4ef3784d54a1c3cc3a1c5460f9a902fcf8d1e7ceb7d0474b4fafd8e7e85f8429fafcff9d426b6b8a24dfd33bc389cf1e7bf6191af001001f2dffcfa78a4fd2ffabd99a30885258b18214e77e12c50a3a2ba76e5d13a5d5f65c068a41504401c500a01873e635cbc660d76a28a2a0000205d1cfa0917962489c249cb0e1bf9f79d394f43891b4678cffe7273a459b7b5448f5d4feadbf3d44b30c3b49d62fe53cd992d5e9f04c926569328b24eb62f5ace60c652fca9f2c97d254a2151c343134830a26c6d49131e19a51a48c064bc07e50c2cd0c3933684cf1b319ae6fab5b7b1123fafca024b0fe5fcd404d35c5bc7128b5af4da60e72137df284a2dc9ac3d3deb117cda5eea71da2357b7bc6d8e6ae7d0157ae52cdcdb55bb9b261cfff5bb9b2178bf39a0d6c5ec897ce33efcc27b486323500ff3fca8f353c40c39ebfb23b4ccdf5a67d4195732a1aa46888800623354bfc3d3a3a2a8f906c117c9e79872d152bbb3198d5ea4e833f9ef230561354d3536353e3a486a626c7a8e6461a36ff34252b64a94976adecc69060362ba329592137971b6aaca08ee1a04631cc9adaa7ae69ac6a6986fe1f0d9bffcf680d8d97bf29a7cd66382525215f9acd7033fc3003d60c3d64a833cc3e7dcd1cb65c45519dcfa95106550623670c80e6cc0a67accef4888189ffbfdbb75b7b0ceb0cb3eaf04479eed60e3596c97daaeefb6764484bb5d9a476dddb665757a0af67a72b479008b5898e3034f1db59cd664b941c71a225ad3010195f18c4c30b645e485f70fa177698b9f357aeca0cb456ae6e0cff765626aa6f98f3605a433163d5815c1dcdb8feaf0b0470810617707fe5ca363da52bff71d5b690450b28b4e0e4ca952d29f891852658d8f2ffb5ab6e94fbcc9e7d65ac2883662cb3f5a58aea5a99a51502ad40e62f8ed9d27cc299093ecfcc845790b282022ae84153ae835975aba8ee2a9051c1e9ca9595abdbfb6a7ba6928217291020850e5228ffaf5c955c2dcb4c060b3261c8287dca6d99ad9a7f19052350188342d30981feca9515e65fa99eebf03c41eb042e2714d9638296094afa7c69e5ea0ecf287b877de5a9eea1d954573ee4aa35b34e6177989ac3730c0b639c3eeb740c29e60b316538dab7980bc4dc307dfeffca5569e52adb945b344c993069981f426de65dcf3e6b4bf853c29bff2b57a5952b34dfc61284a9e6e14a38fa8df1d69e21bab5e53fd57d35b50fb705fbffab653a1dc1ecb9a656750a3c75180726cd5f3040bd035374516ecd1db4c3f3cc308b06b915949290a646c2966be347127a24b8fe3f072d476d2ecd11debcfe8de05b4738ba9cab5f061915fdf845cf972d3766eaf6ed5d0db35facfe6fca79b62f3f4410e2ffea761988b5cba7cd1d987da99eb2b7876e75e5298d769e9989d68737dbb3c52929fd76563425218da6766dd2683198d26f6725e44b21c809010de1821088feea74776d9a514c567688662d1b20c800821004fbc1023e48d3b52e4dad79378ac92af33ef0e1019dd1031a3cc08d5e12e0850b2f65bcf8feff12d13fde8958353341f956f53924a2729488b5bcb6d33e15e57a63a93b3c4f6b9ebdfec33d14adddf2cc68b65db8e8024497f3ff6f149315b6b21b538159cd3e182ff75b0708e8e0870e72e800ffedd8ca2e57854ffe5fca8f5c3ce0b2c1c8a508971ce316335b40d8f2000703e0e0e42008073e3610628373dca0488325feafeed9b74b57601493954c6b9eb5c30c94dda10afce9287bb5e60d77e8112456eb6ccdce30b6b20b43b22a712c762fac841db1c256eba8d83bc36ad726b6b21bc564657b289a2d8f03f30eabefd4aab97714e3610696f8a7d5ad350f5b1ec71d6b536b2897abf6c46970a501939630fe6fe79c4add96ab4334ddab1d62f59aba72fddb6a4ac392f3edd4fca3c592565b26ad4335ebacbe472d45ff57a7197cf13f9ef232609381d6676085f77472aecba2806b6a75ebf450c7d52c66facef2e5ff9a4fb8310bedffa7fc38d4f3ffb7cc651e87646240185a1b02bfe7e0d0e9ff0a0799c2377f63305b136ef97fb426b4bac2a3312868e543adb37daf3df8e6511e14be6a83d9179cfaffab4a8dc12c41c37403c72c3659c257b76ecc82ad68de6d1edadbdda7a63c38ae83feff66a0e52a901fd73c2b997175d229ba3957bb91b9752b8dbfdddcba2348561a4e8967a3e5b46e987fa30a7c13cda30aeb815628b8f7d0fda4fbba95b1ff18533c290a69142c626011f43726ccbf2b56ba6cd6f566ba187314697806356a75c7a511deeee6d6a13bdb2f589460198171aed6cd30cab195dd219a6dcf16c8034e8d7c109f826bfdcfb09d616c6577e52abad332e59a6ae4477fbbba773c1b35a244a02da05d46b41cd112c521bbe6d6cd6417636c79dcdc3a2bcbd62cb78e669edc9743790e28d4a68aee154baaa74c1de439ee0be25877ef1263630f0349eeb8b2702253e5f4ff547424f02a82214191c0a0187cbd49928fbbd59e723b62b1a93123071359b0b010c588013962fdf8bb9312ca00d5a76d420b6a74c6510d16c1bfd004396d7274a7eab8c9ecdfc63bb7ad465fa0d1d7c4e87bb34488d6448989d0cc47438bb1b7f5cf04c60c2c8212fc0b25fd7f0da108ca18799aaa656bead9aa93e9e1192c79bbafea2ec36ce7aaeda1db44d18c2fb644acb5b3de6559a77ca7753ed568786e9da937f054f9137bedd19112dbc41e29b144ecc65c45b9fdd5ecc53a42d2cd3a57d18cee1f378f8e8e9064474748b61c0afbccbc7b0af7ac53be436df676b573271a20d0e8626a2c48b688c5005b26785b258b01a6b1010d5268c96d6a0aca2ad98d5f092ae65eea4ca99eea2a3f6f9dc7ad9026161bb118dbcbd5cb5355a779ea62242bb3d8f6cde4c8f6ad7bd6c98e8c8059cdb61f21f1741a93e9d60e4377d01c9eb60c62a2daf2201de5b6af7ced6d15e528e73ae552ea6a4bf35457d1ab4d34f39de5ea951bbb25cc5e531ba1bca6270bccc1de6472a6a10afc3d01e6e08dc68eaa1caacefc7fd597aa9d9df5d0b396eaa9fb83ba56bdb19b6e5d769bd33c2575de8439eaff21a0e280ea0ad5d4e7782355122ad87f69673d338d52c078a8bcab46297180eb4dca97293b3dccb0f55ca6c8fcb3f0ffea8f5306d8c0804afafff4f7cb01bb8d00b626ecec8a959ededc6883bd54af1d416202115b5b3a5ae674ad9dba9db1521ed49d57b1b7af6ab64488e4a05eb2b70b27e8fa97a592f8618e0e23d4191c76f0200b54d3ff5baaa8a8f4f783b26f6a5f5f87186578a22ca1d555dd5472a813459ba096eaea46d78b249624a7bcb73b906b2e15d45038c7a5369e4d5d6d1c7de252410e9572533f19aabfbcd34b4fe8b6c29c5e8cee1c85ad69a2dcf6ecd33c9b81f9f670873addabd63d3b993a383ddc59322ea9ff7fdea1c62a62b1f9a48143dc5047c1583d8772ecdba559773b4c33ba752a506319e9eeb3352e35d451fa5047e15213a4df43519d85eb140a4d0ada15dae3542ec5a59ad094441895bc3c52b9de9494a4ae9984c90749aa384e8fb32f667bdece4c7463d972e7caa92a7c729e99698651d238b3df4709aaf8e7a8954950226559ae0e6046394301a207e3ef8e9bf6b1f8fffd630480300ef37e6bd7289712e3858c4bc4c4708387718913dfd3bb3bc243e345c307114aee4c9d3a4b4301396e6a4c826506c9025ac801d7df4e98e3e6eaebfbd465b5eb9ede273c54a8e2727a976a1398831d6bc7cf9c69e6f116fd2fd540e04fab231202fe2d946e448f483a7e667bcf418d9a5b0785a7da029e6a0b82dc77e3523cd5166893330973943047a5d9298b4f0973140ecd3e5cef1aaaffcff8c1d4c05fea24cc517392bea7b7eb46597094ed5156659439b1a59d755b32e152f8d18889f7f5ec349bed76aa77583b2dc4ad77a9c966b54fa58a8aa28a8a32391a8359aaa8285fe754962a2a2afdfd6eca6df69d2304148c311be3034b4ce5863035afea9e8494cbf59cf323c6f800d492ff3f0266b5ffb6dad315a853def840d10c1a49c618876cd1a74eb7d1bf71c43864c828e48e90030116892d3b126caaba97662430fcd366339c92902ff5bcd3554758208ff8821d63740a89148744da483b8eee1cf523dc5f8ced79f6126b9fbad16c4bdf4ecd387bfb6fdda57b67cf3363d9b0258dac218d6c195122af15570c79cd9b806ccfc53ae31c3c8244640a631b0302bb69573e54d5ddca87bc279baf4ea1dc21cacd5577a035352983955a9464c8b282225f9045ec14e1a048d365c2bae7a5d94c67bbdebca71bb31b66f14ce5a8ee3c813c9efeb44ffd7135ebf48d080d4484b09e73b3192e93441420637f9eea669a996a9567699567993b17f3fdd76249afea7ee54a987f56ae626a874d01d3fa7f0b9bfaff0c8319f519ea48a333465448a374fb5435cd401e8f9b683632b70e823eff0f419caf41300204ab916fa7d61ef813833d50a7f600997fc02ad5c1075c43fe64ed2387dcb943cc0c113e39c409480eb1578820744b09b92324cd5f5288d63585f8feafca512149ffff428afe8304d1f3ff5382b0f9970a32c2df54ab1cfd712070ab0ec871e00ce9000b0e38592fac9effbb72285da3dc6ead3b5714ad911689f54102f102c80e249031312bbb3cb2015f033b4806e8900c7821198880811ab65b97f227fc0369812dfe3fc8930be419432e70452eb0c3c711a48f383e84a40f2b3e76903e88e2900a9c53b71b219db1a9295b467575db8ce3eaed66cab72dc2802cb2f5280308b2c79b1e3cb2478cec3183e471048f218f289207022f39e44b04f2b56447a08f2d2d01d78ec4cc51dd7699c53a2bfbca1ebacbdc43cb4eee80da0123b7206f20c914481b49da18a918c9fcc76c483ad6b74d4fac9407453e221b91274a21c51ca44b0ad2758774055d4a48d78e8f31d92236ca343313cc66e628988d2986310ca675c3dcb33e392f49046e20110083c09044e0898e03903a00e97041c72675582175e020e24312f140128940125111fd2073ec21731091830c99e34a0e07c803ba380008f2804e1e60c3910012c70e240e1d8903ca902072e8cc7fccaac74fdee6ea92957135b5321e54550eb43e35036d6fb77b1cca5ad9c6d8a65c6631b6b26b725ff0c67bf6879a5b97755607b17659677b3f1db425d6d8f64dde1044de3053e4c91b48481b5b903670b001246d4cd9104903a238b315cc86722b8bc1ac95b975e8ca7d41732fd919ee1cc83337baa6dc660d9752ce4b775aa346d61022850291425590426548a12c52a8caff1f3d291423694c41d26043d25081861592c614394301e48c37e40c34e40c2c728612f2c9205f08f2bb904f45fe12f94265d029032da3aa0c21329020a304326863001a4385319ac410248699ff8f59d9227629ca16b15157aba8ce7a6265dd0a66b3b2bb754bd916b14cb6885d82d9ac0cc7edb128dbe3278c4be1a4a6d898724d4f4b39ab5a140f47cc48d05a6b67b6261b0e66634b30db6682d9ec5d82d96c2c0a66b3b7e3b0b2588fb265ac33d93286ea136697ec6ca8a35c357774dbbeceb06ce543155bd95df99063d0f7d69d79eb506e6e1d57397a873acb31b0bc14a3c602f22ce0840560b080212fcc3f9ccd469543b2c21c85ee5401aa0292143023014324804b0294061d60509b415983ccff1812cc86e3a6992d572f36b376c256d59d077156a6cf35c55626b338d5fa96ea9cd53b94fb54949b50684a26bab10615692c8b8041d7e84704dcf9cb9342c016974280d277a3ac7dea280760e100eb016607d811869e30ca8431258c1fff6f79bcf78bfb5063ddc0c8008c1b18455f70f1050a5fa45f34e0851d2f522f96bc70e154a341dbcc1cea2825e6d9cc275837776ea8b166b30e1cc690626a6f7ab239769e3ccd2aac1b353d59bed3ba9b76d85063a15dfce982cddf184c77e1fb6f7aaa7561c4d43ae599681624e85fd01d415aff67de09aaf2ff6f7350a84d948b2b2e807031638b365b686d41650b06b4b8f39f96338cad2c26d3292ca7724ed5d355f7dbe8a97d81b608b443201a02951068964517590491c5f9315839eb326b356a0372d9ccca643ac5a801de18603580054404a033ffaf751aad053970b57f0ef067893f6afe90f027e9cf11167dfeef949d85a73c19cad1ac7f6bdf1c08058b2258146141e4078c23fc0ce1e7053fdacff533f4b16e8d98595359243b5b6ab2b28bda90d61fbad5bea2d95ea1e7791faf30e10adcff8de9ac7d5ef1c38a3d3706d3bfb5ebd48a137c2a8d56c508555c5581830a3754602a701480875c016ef479f377a8436d57d5fd3c7daa19d468ce54bbd6e1a0463baab14e3b54b7093b3a3a42e2325eeebedef6a9bbdcb3daa7f6f1d2074a1f1c53d8f97fed536d96144d499b5bcd3929549f1add27fa64ea734d57604ef389e2ffbfc6070d1fe05f9f3ad4f199faffe773f4ff3f4a31e8eff05477696e0e76a3bca5b092e2280a4151dc3199a2d02acf338aa49e3e77d64e815acd67de757d9e99290a5fcf4e4b9056210e0a099e08e38933f7f70414270439b1c4ffd53e27a89c78edc9b347dde3f4ff57766318c37aba6dcc84592a02d021401601a0fe769cea5d132434f18489329890c3c49089a3259c58824c0e9f59a75df7bc846bd8f278c6c0edeb281fe6739bb2754a89028c51828224c6480208350908929881440d48b4800414124374ba02538d73aa50f78cad4cc755aea6d8ca32ba8742be02edf0d4c3829e283df68910a91121622f6f5bacd31588ed5067f98c02a92729aa1a958b4e1940d5008e8e88c2801f8f20c0115e8e508f608008236a30c2ca881a7900e5a121cfd5f772433952fb8ac1ca8716ebd468e5c329f6c630d6bfdcad99d7ded6fd6a427df274969067aa8b2d8feb53b77d5da73c9b2d1accc05b116cbe1721044f1178b4f06880e786870222c0f82bbb269a6f7686791ce5bf7316eb308cf799757a9e79c779e8131156ffffa88d0818117fa70f3007eb7ced8e198cef3859d99dffbbebd967eedd5e6f7662b0836dca9970de3d116a3b3b785c00820460e6ea6e0a003f4d4751dae9aa244bd6a18e421bea2862fcdf21f00cc1e61fc79086d0faff21ae104e08b1831040cb4d2186fc03b3f6d96ea4fbe9de6b3a4d25081382580a222908581037805000106a80b80244d35f9daac3545d751729c604b3e11d9295dd98ceda1de53b07ec186671ec866465d8e21bd626df31dd6c11cb74fb21891fbcfce0e4ff6fbaaaa96eedab1d52b1448810217235568ff2430e75ff74fa44f7ec03d2703dede993d90c07dc6a1d5e2789cea0ff4be70e1d32c0add27142c7ce116404b8d5396486464c3dc7d7db3adbf79c1eff17b8d58ef3f5eca33dd9528e03720c8883449638427cd8e3431e1f541f7a3eb87ab0e29164387d376f636c4fbb53538d71d836f540c281020e1e381cc081bd59627ce3c21ba837473c44c18399ff125361cbe354d65a3bc3311ccc86adcc96b688a5d2366f5367ed9e066e3507dcaad5bf8c6aacac72d432096a946f0a7630c00e7576d8da4129005604c0850068a51ab8556ccb8b71d8e2baba9570c3831b316eb29b263707e800860e2ce880eae02307218c8c2ccf44b3ccdacbe3980ae3181570abdc17c45676a1a8a65859920c0a6e8acd960970ab29e7c92eba31c653dd08d559bf9dcf6cea1fef6dc470a24d0c6dc0b439dbbcd8c86143031b0bd8dc58a3678d96c7764645d76465b8c47dd6cdaca9744d5676316eb2326b710c0966c37636b4b2a6278c2d70abd6d4bf3dc32a47d1deee18b8d5a7bbc332e0c6010a1ccae090010e341c76dcc0c55f8ce3f17ee6d55e8ced50b7c3616b2f6f5b8c9fa47dcf66381c856a20979954be9e9d525a8701b74acb9927bf61a86f3b0c53bb7dead629dbc4023179849b233e38027744f93c2aeb5337cab1d20d342205238646c0be296f9d4ca6b3d03c74f2a49087823c444584518499ffc7312453a65320476d2f71dfc98a6842e249001e3878befc2dfb89a7868788882888b8f32fe412818980808805eee0df6ada3b4b76bcb0f3c70e0a76aad869c04e0d3602b81240d41062fcdf98b532346798c531a0d6a1353b3b71e7e9149b2837f5f01c028621ae0c011b624888208428f3179b318c61420c050127081982d80a62822086806803c406ffd7f6ecd39dea62b38762ed781c7781b6eb61eec38caa2b47d3551d9e67564d549f59ddc0bca3699557952acfa2d13aca373accb19b2dab60e693532ecda57584ba8e53baea78bc8efd5b478ace9da743e62f1d27e756b3786ad5ec634267a8d6e7ef9c373fe7cb9c3da7e8f6fd64ee9c9c0de450c9a1c5f1224e1a7de66df31aa7880f837cf0e3439a37b50f13f8f0c3071c3df0e941ebff6725eeb3190ef7a004270b386de0643808bce973b536b5c692712818f37836d137230f7378e0f190e3a1090f3676e0b3030e3becee3eb3d5bff2eabb4bdccf1cd4355959afe11acc26d3e59bebfc0cc0a00090f91fea023005e566d0a79ce7e68d1b374edecdd0671deafcbfd541f8a40e3afc0bf32f873a396ce56035ec391cfddf3682de447b9b3a3cd559da6c6993a47f6cb0f8ff61e7271b12d844b026d09a19d65cadb177e5436b873a946f9c83b6ecdad43335c8b9f2320e5e7078c281e886216eb0e106dfdfadee5bd66cc8c2063729930db11a9ca8c1861acc1a1aa0c18a1bb35aa7f5cdeab44fc5ea130d9a0606483556a831a3462893e1d20891064b9a5e9a114d1c3461d0384133cef0c30c593358adc3329091014b86990c0d9cd9f37f7390204170361bd519a7334331e489014d0cb9181a80e10918bcdc58ace7783c27c412b118db221663d81d2eedccc318cbda94f360f0f142122f6879c1e985b20a3378cc70f9bf5df7e37addf575d7d5ece3670f12c4666b26e9cdb85017fefc5f17b6384aba30f5a40b437f555c0b7b742fcd2d98f99f6a414aae35c1021716ccbf250b36ca08a00c0865a62e8feb1303b3f6edf2892def69852c5688f37f31b65235279cbd3d897ac2d92754b6282b65b34d4fa0a06a4cf6c9d2edc96905281510a0029affdbd3cd77063ea1d9ccfc04d28e2059613d74f7d0adc2910a6b2f053d9f422d05272990b9f364c8fced319df21fcc0ed14cc6c97f8d8ceb6635a3b007052d9d558d5026240a4efe395a4361e8839a77429fbf29b74770276cfd1de6a0e552274c9920c65f75f776a78dd9608c933143c60889b9420c0962ae8819fa7f2a5bf2e12943b92dc9127e28414c09584af095b0c0d69fd816952d114c156062008323c1bc46b9149335d16c01cc7675aa654fe4085d46b88d30640403bed0f9727e91f28514818f086b44e889c0030076003006005b00f014021821b410825508a216175a3d68f1b45c208401820c204c9120307d00c6076a3ed0e083093c30c0fff7f59cb2322b9688e6ed13b5a65e2f8edd6e36234f567663370cb337549f32a16a8105301be67108acc640e0b56589dad2f3cc4cb688b5c016b1378cee7263d96cf66224accf9cb5572c375577a9fb7a6614669f54351783d96e5a59ca71c77d3d81b6dc1863242bc3bc9d51ed0ba69c86eefcf3c0eadf03d8bf973e9f815ec8fc7735f5e2f45e8a1eabd7baecf92e6f6a5db2ba1c5d74e75f078276b50ed2fc0fd16c6f075b3a70d201ecafa935940e86fe72e973e35287e4b275e302dc53ff5c922e97a2ffa12a35688b9e7fbb85cd96ad2d4eff77cb111a8da624e44b34986eedbab573c0630330362082dc40b8c18cdcc0febfad6970a5c14c8b175ae86859436a09418b94168cf233731ebab33e9932b0197c963b59b864016691ca52244b8f211043e18dc976a50c53c9b0959195aa6fbca046d53403b7108c90470a774225c2587089e008c161b024831064219165c33f952d62ada830c65af3ee8dc154ddbb31589fc9b8ba62a0350fc7db362bc77a80958d044a9090e8d501758faa831a825a815a3e55cce4bb145399660d5b598dec6b9fd29b3a90b400e90f29302dc272e7ffef115bc4def06d36c3615c652ff6f57cde30a622b13c00a402f8e695245992e446e0537730cda9da730aecc113c005f125380a9c73271febbb0fcf9c572cdda2fb07b33d0040d82348ee912562a96c118be448d24db23394efdbf474d39c32a181fea235d40baa0435fa89f117f3b8d5adfddeae5b7bedd7fbf1f8dd20cf27ce2e27fe53ab379672986ec52ae1c48a824523b114b083c18a81150642db870d66cf36d16b245be21815cc8691ec4c26b3cada14701efa6485c7673de77a3ac5d927eb8dd13ba28702d90bd3c3d253ea09f110c02b8207040f03920744e3d168f05063e566339e0dc36cbfe1d894b5b18e979aacecf69a95597cc33153cb64669a7d3059d7ad5d669edce229999d8a05350ab3dd48b7e2ae5b3bb6e8c628c63a9df67a9966cb18cd965430a59daea229711efac479e8ee3c53a783aaca777ae69e3e69bc1cb077eefcd3345bc6b29a9b9a604a269089e9f4af9abb41ff77b727a8a57669747defcebc5b60f7ff25eeead86c52a745ea7cafe352baa2cf838699ccff9319f87fbb516642e235d8eaff6fee8b9c9a9c97bf2b0fe52bafc6d35c02174871010d175cfd5fdef6732508f20a99ffbf33acb3b67af5e60a5fe1b012c78ab6a2c3821f2c48490b8a5840f47f4d9deef9c95eacdd06ee50dddbe736d31d248845f910cdc333a6cb7dc3ecd56be73e55a87790ff80ab3d7be8d6710c4c1dec3ba353c82a69aa78f97fd2aa0aab1facb458a15645ff9fa97c40a5099521557eaa8ca81a5699ff9a576acdd33cddcbe88ffb82165bd92d9fec9da280296da664dd1936770e5b1993d63c9a89725daabb5ecd9c9a735aa7bc1c8ecde37c5cc54570eb9d9fb6b44175d5ddeee89bf06fac6b7d4bba31aec2ecedff49aa3d35aa2f4fc5244510700825789352e79f7355ca96af49312205f67fa7044dd5599a12564d29fdff99b54e79b9a04667335c2ea8519b10586c3ddb8ebfc39caaabcecaaed63d917223f58154506ac81532d3bfad3e208104f70ab6926f5182a284f88bb3d9a8ec50c774f54e67a3a8441541290105029413a81f7fb1ca798a6ddf58ef5098d569a9d33386f179a32050811615ec90ab60e8898927119e929e20782a72cae384c6c9e67400057c285081822a140cf9bfbfa526cb51cb3bba2dd63007735686ae6756fbda349be130cea17c36436ddde21c9a77b919d5b5c2e129bbe7cd963bddf59b728c8d529d42c156fb4828244071020581374ff493049ab068e2816c42d354c55406131a26292493eb5f88b557ede9364a755f75aaf6b5021bd36baac2ace5aa2d7daa2e7bf6d9f3cc39accaeebd3b55db32d5433403750a5cf9b0dc5836a7a5cee9539773166bc7a13aaab3689ed6292fb7ebfbb797ae96864c8de55357abf2f4a9deda9ebf57aeac5c59b4564ba372b466551bfa9d933cb7f71c74e27302e49a7df5a94813fca0f1a1fd40c380a6f4478e34a9d20408a94484121725ae1444e906932d989cc0040a93a1d918b3196653122c40823347742fd548f848111b83a9397767f848ec88595e2498552d0adb1956b38d32d1bc437be8eea5fa07e4328eda7c0489f7a437ba96da0635aae6acbc63a27d2aaa831aedbd544725d949ca20e982241f11f489e0ce2d49125d04e41202904b62580280254b960c5d8c4dad2ab949fa240922891732c98f4c8284840c12c915ff7fc58a2d6dd903af1ba80414d7eba064684400000000000083100000201c140b876452b9683ae2d70014800159b6a868c54696e789cc2985902106810080800004802409009b28617614c99a6ad16a96b749b2388955cfbe407b2bbced21b0db669e7996ea27fb4b91597d29f7cba606efa1b4f5bd08e905bb3c9b4f7c76d9d5e46ce0f7cdf2da92d67791a0fc0365f3a9fba1e990c2929b6355f56bd3fc23e33f88fbfbc1b32710a197948ff4fcfb990d48e5073e1744a38ef0ef21a543162db4b8140ff6c5845f4ff94b8fa2cb83b28473e7696d31ae91cbc9db1b052484e8e5689343ba01435c603271e94b1a0398ea8bc7a6b3127f34eec8798005dbf849896714d431799f3712977efe81b926b886ffaf36a670488796cbde4f2ee5dd3b143ccd8f7f6d9946f6c11f6536c97abecaaa7bd76f721219a2d74ace888ae12df178be43bd68950f2806687e46ee1beaf06cedc9ea7a6f49efc72b69674b0a0e12fd59992431237f3cddc73db49ddfe158df6537a30a3b090685e0be64bd0c3078a80fb71a668edaf9df0016ef7cac2cdd61ef8b481684cf9ac21fbaaa9e375a82730a22c12f82b6196cd49cbcb76d04d25c02deb82eb7df1fffba4a9138f71ec6a10c643c46e7edee71e009c331af6499fa234eb0430c5d9309a5af645339e7a3a7caa19679dec7cb769f4cb2a9427f5ae9f2d83e4e044a5bd79646f6bcf1be36dc56b0110f45b88e791e1874b9ea44803f3c4c4aed700b1c1817f633a81e97bb8fc7095ea5ff9b06c3f603a748734a9b3e10f134c94c2435d53cdc5a6931701704c129285522333496b90059234969158ca6eba2fe427953c6c675f2107a5825f2fe0ae0306d79bb9089d4c15667c6b389cf041a63bcdaa00b775808347ec30fbbd564abddb56599dc627a4a6dd0f8add0490de1f2b9f3cf25d286f4f30cbba3fc5bf7b981500560c254594a6b7f840b078d8a5b85ebc9119744705ae7de4c37b47f9393aa3028df317e9fb448871114c67feab0efab33304a3e36ee594882c6c4aefb3b11ce6f7340cfec569dec3779ad271327a73d386dd097d787e41d0600cbb35ebe0abe96897dce02fcd4c9a689b46fd675cfd8cf4ed99b202d97aa1e62d75afc8831ff3870d1ddaa56479431b875aaaf2e79095290ed2755d918cebe85162612f621d7d4bed9ed314bb1793fd5bd13b60adcd07f8f7e53b9b9e5fedcf44d5ad788709c055f449953a4a564cb1a4904ea3c6c629075ad78b256c36467247a051cde2b77c7f31acd1e3b813243946dcb35180f2d68e1a7a482e55224af1c15e04153e2885b871448bf64c3f2e8611e71252121364e1c606ff780a283027592022c5044397ad07feffe93d8ac89f974b57a6422ded351f728884fb1ac74ef7e54e7b43ef7e47cc4b7cd85eda8e65a0ef2dc12dafc37364c724e0a8178ed955c9a6adeb8ff2518ee68b47838bcc7ed91e452037581e9ed3d011d660484edf24e5dd9821cf739347d041176d60edbd5461b12bc24afe58bc8111ee1854331775be9ae511d9271c4dd3302807658386ad6707fb6ad784a0f3b6bd51041dfc6ec7f9704e59c3a8fe64a7c3ae68b24e7fab466e314a784c762792f5a6753e788520304e606492dbf0dc558fd5eccacb27d18eabc1798cbb400de96f6a95342c2a9e9ce1cf27fff3e79c00e40b57bfd97c36b2d4a6b3d39005a3ede4fc0f13a40de672058bc8e6615ad09fcbd5fca52d16e29728b27ecc0c7dea2fe92e0601224338770444b465305a8d04ac20a1738b85ffa24073b25db38a4b14cd8b72d38e00c81b0620e0d004bbb5fd359eb7ca0edfb52ba6f0016cb97936ff40dcc1e89c749757d4e9647c738bb94d677ffe793bb61a75a5c553a21ecbd78b8232cea78adb35ffd03f71df7f05ba4625bdac2f1a463b42dd0abb020bf26d8abd1be97fd790ff826feb4a91d944fe66c33b13c8f0f09d77d11a8a0234031803c6868ec1a9bdd35f134f998c7c6b7fb4d2741a830160d4ca93fa3b93fa481ad45961e9cc96fd9cdc378ccc40f16921b42d9d352d72c276db2574d346b367eabe73e498aab7382b1c8041a85ed6d14f2a0a7b176d5191b60c3d71adf1e7c2aa5b5f9597763a5f328ab15691ac53117ef530ac058eb81b13e4412fb30cd4862cd0242eb79e565c64c9a06b1f8275ebf8e630d89d9d8e5c796a62b3a0ff9fea1416935736f88f379d3ab84fdfe260d8ef04846648b8f83198cdf034d24bdcde0ef1423b7abe8b1065097df0014dc59da7c2389fea800001ba939e9bfd6d91432484975086a33ea84d497d3be77707f9d63899542894dbe7f9f2ade4c5f438c1ece46a7c60d002ec14f0545ea76dec26cc6206c098103b2c6cf7719660ec19aa783b3b7e90dfb81c2be736f81a1feaa1e799a9028388caa1aed3d1dd1441908f5537a2e73c76c047afacc1de50a0e364ebe8cfd25da07d81d4b7a94c72790e0426eb833d00dd2dd2318c3a28e44d8057abc7bf4fc945a9aeac52fb670e8ec26756b2e4582216939aa12e87f973d4a29eb81fb754d177c1238b1e1fcb8b398d1bb32769027ea165f1584b33969619085623b7ee130810543e088d1b09f62f796ee6d01422289138174c7703bb481ec3bdef8c6fd1df2b3296bdaf16ef20c953b5e48ef33acdbec6e229a3d5dcd78efe5a7c63795d6f3a09ad2ab7de07a2e130f2e571d86e23ce215abf769c8d33066cf5bcf3c0c6e2719544f46f06860bd93e9ddcc6006f93d0ce9ff62f23660e4faacabd16bb02bc9a8148530164ecd3a9c8cc766d5d4d4dd866b33110fa6387c42711602d380b87145f1a163e0660a9fe45ad67d98f60c2db749b7dcf0c7c488728dbc97fd2408e576d5495e9243b375e2b4c6c63eb63152dfd5618b12ab5784c265754d10afffefd6f396dc2e7407f139c44d3f55e682ef65277648e9c20709058c268551e87fda5b0a46ad61609d67f079895f9446070379741f4803626c8007efc091860ca9d8f851a2b91f5f365fac7874d515f0790bef6f74a36c061d76a992b11309a02954c189f2640d1da1c163b19b11d95efdf816f0a64ef9e74565520ee91192bc5090f458b90115efa00a7c4eb79c5c3f2908c4a409782c9d0203082dfa4569ab00a7254fa1e8a05fe59c9c3ceca4c998aa855e1b9f726ecbdb2e507a8b2bad0bc0522800ce1e3d5deba32efc7fb23334ae092173fc6e05361f6ebe5171a818444f9e18125ff59214748ff7b28682febbcf1bbe10b8f0ecfe77fdeba3a4af0cde27c2ef12f81eee8d35a0f4c9fb07129981eadb5add17fd3e62797c37a4ae39e4e0efcbf4326e70f1b24e6e98acb50d86f1e1010f39fced0f57b9f47c0c708d83c231b918246b03ebf68933f9c1240b4f1e71fb5c3b6a739f1d8db49a2bee070c57fa72f2bc28bb6c623725084ffcad1fbde900715a6c1f148dcba77ca366d1d7f12166eefccebe8d1ea751f5b2ae11b073e0c2faf9ca583cf54ea78e883c089338de494e511a18df4e69f6dcd11de5e28736ede42e53e8630e6c4126c4f85027ccf4cc141df81cea5ad43f2b81bf3dec3bcd35d115cdec423d5dbd771cf88e7c31559a5a7281ac7d91a31eec9c0be0019fd526f42946096d46989094db5245a6c68f0286692bc0884172f1e3e09025c2253ac644ab00b3f40ba834706c5c408c47e9fbb2d96e875856f5cd00d2929b3d8998ec1307425b90bd68070b33b55f5fbfbaafd7768cc788e846d17cbccdfeea4903ced1d22fae8008024022137152868d22789b2fb22d7d49456a6a1f3256c737f15af01a451e117d3e0df0de8d26792997eca3854ffd7077ea7ce4b76db31d9f723b5bcfc4c84e3bea481dd050a02c129b8db770429dcb03c8073efb260eba9b6f75b5d968134645533f54846bc6c7488d0e298a419ced7397c8754430e9193030aee765f46eff7f5aa4dc4725eec697bbf57dec5fbe21f6ff4eeba7a5b41f5c481c8c3d394ac07a512eeebe17e5e865dea6ebf317375b5f8077f17bac1b8cbe8ba7a3deae06f15e6d890752270e54dce4cc65b774901475d9cce2eb21b7eea42b07fe2e4b48301f65f5a0724472c6d713922f9710f13836499c6748c25a99a8e9881d13ea277b78ea44cfe8c0cfdbcb36983740f100557930f8713e62d922ffaf17db1c34c77124575bc1232555ab0dca3645cb223c003a4c6382bde02fbb9fc9794f3d74de4b8b0ac085e47570940aa9dabd78adcf7aaa8311895ccca05a52a39cc7c752fb0a921496ff228a71167ad62ff1ae6e3a8d14383e2ac2f9ae00e421d65e0e240c0c4347d5384d5403227b455447e69eb60258c9712bf3c547f953c9f3e756a4228ae4dc0423ea52f946e5dad31f13db2b9dd1ab762b3a1e694411d2693ab5398a03f638b2aa22d6265ebd3023f374a23e5876b1ea9ea792e74a0d3f58d3b130499d49978f31ea85ab1445d3932826ae78dba2de39efe2365d23f42aa7b4b7a555c961ddebfdd5cd923587594ab2a086c6bedf6ef71b34912fa87ab59f6964ca5d261f11f21286d77b5d385ae3c077fe53b8e6399be4774f030c3a574172c90cba40303f6c84d43f925da0ba17fea9e122970f61cfc38248bb38b3cbbe83b5954eebb6483f9bdcbfaa0a0f7914120df87db7f7264e1ff396efe7f77cfb2dd114624c3bb9f70a197371cc47acb9c4fa8bc3e3b31b36c6b2beae38e80d2a117ac144a85ad4a3e7b188955b2b7e6a8d969e0cbbab16046ec67a0a58f23c39c2f58525f47266f8f2efaeb3fd064a39b6eb9e0c8419e6ac22b800672addc90f75e2281d6bbe2ca0472338193b70fa0c123a7671c13137d3e81586db97ff38de9a608e1689f01b0640908ed2f1cc2406739f724807505a777389d53b4eadb8c571d3a6a7847fea871a1b36d3456c7b8f719cfff03a3fb60ff69c4d53b1e970a74ce80ce7ebaac53da2bc30f69611ed2c22b13be44fdc208e4f80dd0a7c23e760a66e956f5830810301d365640b5b6044e886c5bb0b931e1874653036513388562573902eb897125a787dc678e39280a0a9f3a2131823c03cef8fb3714b22cf0182a61190251f0ca7fcd7403455ff205d95168b1489bab52ad8182f174b1810210e988119fe84aab4c2cbe065f8d8bdd3d327756df3acf0742d4e1142cb14123f1fbfa22e09a8c9747d4df30c9973cb4e1a7198c89449e49bfba00f1e2a26bc39bcb994ae3424824c2a80d806df9be859645d4d87bd98f4a3d929af57580101cfe6103d0329e7366d2b242ff7f37b56711069158eb9525673546844cabd6ce17a9ac02648d91f1f1f4419d001d8923ae2c84cefb71d491cfe86600105dd17509c7a978428af9a7db80494d914b965109e1de7e5afb83e1b543baea4aa5f6185470e58173d578aa61deda245c3c2e34852467dd66d3afaaa3f863fe6c720f2bef31dc35a83eae69db6ec426a1c58433f6c79d2f76da03bb60e2f14fa61bb8bd5eed35f7e64caf92be379b238ccee00a5d16092ff704ec1ee9a4ae6f5fa584671cf5896d50040a2baf13d5bcad64f328dcab7d4125122d98f624c7a159b9d83cd579a078ec06c2fd10ebc042c130c681bd8ca089fdbe43a5dab2b55c7def9f3622ff1fa2d820fcafb58ad6b0fc25c39ae8b6f845e570afe8377a8e3ff033e01b7ad6a92b5586f8005eed285ddfac3050891fdf829e35927bfed01f470e75be09f4da06e3f5e47d811a134c283aad0c5d71a813e88c9ba95c6212ed6b1b11271248f50de768d354061a8afbe4811ac7902d347a85a2ffaa6e1ba1031d7b24b92e2ecad38c882f71e96f1dadbbc76f9386a1155d5fb119c55ed0fd1ab1b0081e59a099d5e8e504d201cfb7376f7a3b06121598b8d25f76713c65fcee01df0a91d1debe0ddf67df3f431223d04fcfeec1d1379cf49b32b006cc6e2faa64c26caec4cb1b2a935258e3f9a83390a1d1d155d6c073c79b37f8d084f73f1d2005d73e6f3a3602dc329798e8475cc0a42593ee53d054128a7f2592c8d339580b038b6581ee3ac8ec99631e2eba99966632e413b4285c2b1fcf86d4fe8eaac7f127ce801312f71c1e2c873e06a50e9102c2993d8bd337e81a05e44592b5c9f5df00f0f4d4929136a228d0d9a1de971d82c59bdc6807fa40d1468e37d82d152bd5b6df304cb8d304a4aea25706b6142fe27b1ef414e6f5e7ce8eb2ad732ee6c7e0734836c37e099ac079a503c5935302b967255cec3adf453213887d5907a4e98f24d84e95f93ba60951dfa3eb2a9b51668ed22b4920e4ae3ff0712df5efb96ed39e18aafa51563ef48de8bba5b2acece7d9a9780b89cbab2c9d743c60913640950ab901f60e5f888ff2e6b24278fc686f1cb6b4ea85fc37e384c0d713cc0d6162d2328560ab080957cfeb44e63702adf7ec873afa55ff0c5e941a9e5fd9253501dd9841a8e3bcb222119a81aa54d78fd21f9c0ff22b25da2dc3e7d23d5ffc9e505afd7b6ad2bad9e19985b20459204a40123ba411a19951cce4fac6cbf50c3c1b57f88b162513bd140103343046a0b573b16bfce1db70ccfbbbe435010fde51a902c4399140da94779281c171a8ae34831a4694331c2c5a5413a8526d121a47512556b456cdb8d33aeaffd2f9e1372a8122fb5113a51940d1e3f3b8399eecbb24f3b33361b1f7c823517194fea8a18c9ad2c5066312d6aff9e4440de0e3dd0541fe0e4402ca30630bbdae276d0eac608085652a4eaa1ac93ba3398f2c31a9cda01f9691170f8068148b6fc31a4c8d60e88706971c6c544901671fdb3b64eb498dd0f7480993d10e14b77f18c8af4ecdb76ee5cc73c7d3ebe5db473699f0bc66997a6ad124bc3d2d764ac9a3067a22c0966e8004e2cddcd9ece0d6d8f6bf231f982e1da5809b3b08f4ef6fc637042c3eaecfbbb5d8736fcf4b16403016069bfae06bbb3d25650b2c202e2d4ff7c83166ba33443754bab1324155ab0272910f866f72738b96cb4dc913e02a0983f33878fb4f8263be474c4ba642dbd2598a2bbc25cf884544a77dacecd46e0934e60145155a6c5bafe656c4f9b52e6a3598c4180dd28f1baefd7ecad2f4ae4a5e97e8ed4fc375a6326654dda41ff5e208da402981d9df48bff045f03d69df5079f0cef17d64d1ac278422c900feaa3d6d08bd97c0f20e43a37be1b6578c881d6fdadb502b6a277128ab7fabc09f0c00fb8ea63ef01e6bde2f2b2795de5d45c9394305fed40d8f31bfedc7d40e09576050aa9c54deb0af2cdab3c3563cb6de8fa7e95f467a1a63aae2e2a0f38d4abe22f76e9af9c50def84c4a7a96120c018f496ddc138684bfd7d325661e6bc2aa418b32cfc45a827d25c419733c4ce5a3b8c497ec3f3cd783842ec7ba11fe549b23c179e7234bf0e5be166e55db548e1b16bcaa3588fcfa36209984db2799998ef8c2c5e974eedc4d85a4a39d632b830bff773618d325bc58f3aa186e921ffe08df7efdd0940d268c2745f9b26d2eee212c1d6ee9705288833eefe1d1f608e80e3ad9320a20017f94dce6c9fcc76ba127241fb54ce8a0965b585efe1dd053d4ff70cb8f2e48da08f24db47cf4c933fbc80069f7c3e891675e8fe01ef14dc4fd5e4ec1cb460b8d8753684baf23cc072b1c85983c00b82f2a9ed9ecd3901e4ff3934bc7b6e5b8ef79cb4323262d34671f2c2d91561899060120af50b346ff25a0653816918ce0ae1b88529e9959180f53598025a93c32f076a014f56af4fe379a6b98ae86db417982345f21d719de7193eb2484c1b3c9f8809518d33216a8b30146d081125bf5271fe864492e05bb2404583e35f7e7e1e13afacb2f76a6f8462821574938612e47867d3dd8afb5377afbd433d235a923c4b3dbde6881b9cda72fe08123edc9fafedf55072a6b738b201c532bf9c7b858fac9f6046040dbad5b01bb16f108a86673a94bb3eaa7e0a29aa6ee768faadca7b4dfaf5801d1968fe16f5e88d031c081c7760b582b9f48fe50ac19af6e13dc28ac2886768372909a708f6ac2894a1f28d376a426f2dc1a38fc96f8f3c4fa96da8580b99a79e9e0be48d5605f94bf7e7d2b386756d659e4b4f19a7f3a8568a743149d6a07900e36f55eb541a2b0d70eb62d0b610f68b95d57f6491c32fe268b196a7cb171a46391e90534f0f534b3abf2e4d4d3ca010d58c9fb53352cf9ba0fadde1defaa888db193b6bb0dc0905f1e297e9d09ac4dd8298a91f592dbfc4bde95451e9818a5e6e131c4fb14f98b9c78378d6f2a0ed8c0ce53e245c9ae9fdaf94377219b2be4c3e5be8311f573694ee97beee7db5a05fd5903de4802f63fc103810c8ea8c4ba69a39eb57c0c3d1acb540577a396dec342bdf5fd8a2faaaf085a24e4005d99a25719eb2cd1b7a5d33ac387aea1903734ae106871f67a0239f4d2800c39f35b8299364a526256acb57383ed50e68b6c79c102b8228d7a67f71743182058d7fc9ca55085892dfd0796b3126d47e1db885411b022c24630aeded9ef62eff16893812869bd0a4ae1078d17cf790e528c7b0bba3bad64e2dc0ff0b286972e439f610ca3f5476f12f1264f40ee05478662f2c8f49fc024070e80854d74c750e7c0b2786bf3c3154d184fb6b3de48d1df153cde41149c480e920588dfc9d792e52de917ddcf1fc159a8c4bcd3b1b8d0e190ed3c262a826bdddc3eed21f61c162dc7f20960de643a4f33853f5a1e0dc16d7b9b6ce8dd4728c99ef9e0e672dec38460e7d6f580f2ffec38efcca576e42f7dcd388ffb52372b910570644eb68a502ce9e86de1f333a68f1e40a8c495d2e9af0e301cfc286ee2b7981859b47af9f1c3c8a96407be5f459c2d709734385be7afb04a46d4ecde8b4ae2812d64e2614d6c63cc7375ff6c974fcf83d1e1c6bda5dbf4daa050af02e9e8e25ecbfdb32c5fdcead9f81ff7efeab9e7e35cea33610135629c3799be49e36b4d1db33dff464e14e0d3e1adcece50a8268986a202e1cb11ad1348ef2d00d9a9bad68004384cf6d9bc24b07f56bdda771e90e2c6722adb8cf40fde22c5c7efda7bbea4861a21de2f95b0e9d3ff00da322034c1355e57e7f0833d1520b1aeb900e37a9ada8a3fb2f2de8e0c2aca526c128123221529b1a9273bc34d07741024e68bd08aeef13a107a4560e9c33b49aba004cdc3f23809c93adcafa67db7e48fac874379ab04a6b95c0e2d6855d6fd9ffd7398781d13ac7355ef18f3d39cf35ed79ac91c8e86e10ec1ddd48ff3eb22e4276b2e09b8531ed4b60a8585fc95f0108af0a18021397644eae7f1c234fda439a48f208e86e8362135285f7a0602b81f373c0db04b03387c59f188728979a28f80a527755463257e229e12701e414b06ce63b00d0adcfc98e7611f2eec7d49846427e9c0840c672f5e1814a6b6d69db26f39791aca298a06d042ea4a1b471609ce2e0126118f00734cceb98344bfbaa8945458c559644ca9f62f4184278eb1fe0e3a2df73c0f021ed1c81277e411392692fecf473f5bd60a19e84ad4d9413fe35c808f60e84f3b1ac7b21071b0eecfec034557adf09948609dd90351f00f850dce221202ece4cc0677760231978d4f1b5519a45176991b34c45b2ebca4fdc164d7867e592b690f443ff0e0085f5c872c110f1a1debe433f90ae18b59d18d561a2744a5813a6a61a75bc81eebd894f2e8f124ad55de04aff91dac28e12c3e30a547ebf143e7c00796c67e6b47a93200d003af6fc2db066ba8e0284a0155d3d4e20e998cf3247ca4d612c181a7a521ba811f85c0326f27f39ecee17fc01aa0b6089716a42a33d85dbcda9cbafdc36aedae7395fa8b767f25867422e2ced9be077e982f0da3f009f1be8adfaa03ecb1d3ae248ffa21ab6fc6145931d18a75d6956184fdb229d4c0442f864e1ed9a8fe5400c8485d16f0183978e0e6974e804cc2efe7a69a417938db611d8ee6d7a665b88449ea27de5d3f9c87f337e3a809a541e2254ea0052418d5fe2add59320bb0913ac944fe2de53567af711ae78ac8e6601e9220a9f7f9cf8f2f5d797938f68e8aad44219de40b47a842f3f8a9b0db8d410a4a57edd66e927674029cb21d2a505cc3651521ec9f7afcca31b6a8f92c19f5ff38e469f118e93269208a5bb12712b930e4d45e87931b5681939caf46d8348737d24e28d11c6770f905dbbbf92ffb5fc48033ba72b8b54422708c9dd70f737c4b82da661dbc4c4b0401f2329b7de04bc0206f58bea699ff96cda02cd4c1d50343477ea039df2adee031726fbf262d4feceedbf85fafe42b1a9d0618be1c56a671faf3beade8ce4a1429e55d0e2a918663cd325d1d8ca3f8b75e3676bee259042433829a0674606333e53207d16699993ab0d6528b89e5d9c6814beb0f3182a7dd3fed8a3f74c1ff7da98726223add132b6d5819c9d1630e4286075f622d38b22fa0bfa8cb75d95c5658ad631f59b2b77c5b8ee6a2940ac0b45d525a43f10ba44a8793b8f7c875b3646930321518d2ea1194d31ef877fb213b981187a12b1796748e38ea502c4dae20bc1f6c6f373940c0ec72cda1681601cf09ee64997d21d943ded142ae2436cd7a2150de3f2617d3a948a8097723e33938f49c6a78f985d3f8fc9fb03ce5a25a761b33ae30fbb9bd81c1ef68c3c5c60ad44a5693fbda671201bc3345ca720543bde60c5daea432ab7a159639fd87e586bbd091bbd60f4a801b2735dc98182c9ded8890270ac164a72150e388857053046355a39a1494fde4a3aacad96dda93bf042d2762c39ed094cd19a7eff56f93138533a957a45c40e838c88ddff8dd653d61a8eeb0e24e81cb2277d700341b2c6e00d2f15412a49625a985048c565412120141e3fa2f9fa400e9c8df238422db06e67c830462838fdcb865c9628ce555af6e85acb1ac88bed97678aa70bca53c6e99fabe6914cb166c1ff0a1b5dd0987112636615146910ec929db9d75da72bf63f4a0660343784303096cf83a8e3f59440c7175c579e847a27f23e9e722d750a6421374af1f002211118a36b4bebea32464c78624b41d605b21c84e08e35f31304188f2cf61ec65978806cd356afb084627e2071565b7ada34ac63742fe638a7d52b867f42d954293439d1d84e7eb7aebf4415b62899afab8c75fcfa4df386acc99fb7a032dd1097325df8768049843cd21a1297259f0426e1d7b3911051e29f0e95e4f1e0caae61eb0478cf710da2f4218462adb7ac755374d078cda908ac25b9555ab217ab1096045d54b33eb966ae086817331171546cae8b2808fcfc066a86d2782c68bd45b51f234473668ddf3e6425154402e5c7e6b55f4482820e7e2f6e6102d39923afc1c0f0b816d8a350e62275ec827ed3e5df2800bf71c74b12f06bef0d2d743746689cc484bbd8959bd6b9c29c3ca2b21914eb796644e216da5e9aae3470f19a98b8c9d707f76e312f3ff1b38cf921486f8f1ae9f3131af4e49f54a9bbff9678104139fd86bab173807e1cb51f3e10f629c3f83bce8e10f2a30e9afe46faecdcffaf002cc3803c548cdf2d25f2c428b7e9468dd822c4e724dc54c275d0d4740fb927e2b26b1246a8b5fc7cc108c8eff357f57f080dcd8edde46cdc9fdd5176dc12df885762f5b6e1a4809a815f008c861da23864b88077d80762f31fd8c229d1b897697b7dc1d9c39dba42e142bb6f4c6f66eb4de49dea3833aa57244b6288125fa2691376e93ec0c8a7cf4cf9dfde7be8c89f4494d56282351053dc4c308392e84a2c73dc2e75d96636ba7b17d534df2a6767c81fbaeb354c508d2ffa9faf81146882e3ab47de12a3e03f9e36dea17a1aa0a864646746c794f79ef1f868cd4fef1778c251b393f8a46a031cf644c885cdcc840a64fa5e7cf06cdce03922c06fb60f378b3a3d2d13290b2c8b26aa1bf2fde79784a846e1869e370e7b3c5b5a5597b4a93d9d12db7216afbf94219924419b629f079edf2291e09d5e2bcafce3cd05b67d595864c67517c3decb648eb28e28d429e6034d53ccca4ca91418d321cb6d9f1c93b0cd8efafb83322f86f1d907536f533834cbf61f21929bb8c70d7172a603dbc92e1b1399beaef86405c76b2990584f3f62cd563f1b9a78f30c66799625b353658d3a2245f30792fa5036cc2247cf1279fca8352bef86a6f6e796569c3e6e258002f1a5456d4c17c4a4a51cdec0230612f5584ec2f331741aa82f7fd723c6992c90809c650dd01f248c5675a27a685162c72601c0da77c1c18add790a3e159d7ddbcd947bbbd8156154d009af984a0a15acf29bdff080879ec88bc402a01f650486a0522d184d2f3fbef84ae22e52821320c403f6771e7950012c24a3d5b853135053f567ec848f0b56d55bf531c9d50c50cf135d1f83b6642001f56aed04e4c1b03a5bbac5c4d74cf13e26cb544be6ce99f0f1fa83c9af9c51fe8800dfd085a1a1c131d237a2a93bc2d384e4816f61905ffd3ceb720ed536842996ff5b91fabe77c8993151b6fa1143e644ceca6d39fcaa3ed3c0114bc60fb7f34de4990b2c1e83f3b3e4fb68bec37a3b993177bbf7914ce5abea9cf8c63d128cec0e55740dc15a823353de033a188ba64f1cda66ea2b4b921b6cf0966090249df73cc6aebee309eea4009eba0158b878048334bd0ef0c967e8559c19ed947a2692047263f6a6446b31867fadd53d83170a157d67e8b07e1de1fa3aee95e0adb2b353de23a04edf4dd7493a7c78d74dc93feb39c35056503570accc568b8fb157fc7033dbc6845321c91d34620c8c24508046786773a902c4e4fc1c7900590396a08cd395c2bab42918da02dd93ba62625c243d6bdf2089c8decf56f1572821b54ce897734936a573dcb2953428cebfd813d733244dbb5f13993eb76d55466c36cd9de00685a4eb02df855d753f53da0441ac25d3444ae03527ab2dc14fff0dd7fe5667e25e163b000f59fa69c2a0013fb4f888f00b01828ba148b887ba5d24c8176a6f4d548f63de9e7c96e8ff35b13f85af725d7dc4bec9cb863ffdd1679d632bd2cf8ec9b3e775dc2f6d247ece1aa3406422bf5f20df614cf4bd8c4cb08d12852a2cfeef1459e8212b7eba3dffe3b2435c9589f8f688026e3e9b9452c67913a17c078d172ee46bd5a27c9116fbe7719803912562a53a2053a5ef5cc3e3b920c4c1d0bd3ed681ee1bd74862b111968f9a3a9150777015f05a021362d11e3dad7fa213d57aaf9a380205057c00c649b6a8b26077eda154cace8665c0a7712c4c8b20d3c07c647f16f6a97144184aa58fb3710d2b4ed241fa99eb828b60bb82da98cb71c9190f7fc58570ab3d8ff4d0cff9507dc8a208d8ccfd2cb4a0f4c33c3ebc0b1ca815193ba7e288df75af9e7005523dc20c6217cd887eee32311e612363f6b986374ba41ea3b53aeddba9c85cf366b3d0ae25358575bcaeeee3d8d9f03c00cbe826b0210553a43ff8b502e8d3e3636937e8bc2538789074be028be52d66b703f79831baf108f0b8a9c5890f4dde0fd26906ff043ad572626c58ee4c46d5b36c5e29512e8f4e19fadd9d2c2de8bb439d7f0ce74f0a69d495b770b826688e7194fabbb4d145008a0bd997db48afce432cf8b142a1818e3cd62a5456de8c8077bb7cd16715011df4211ee1eaec11fd51e01ceb5677f9671401735b7a95b614a5a28c9356bbc00e5e6046a36826e7e37d538e6dc9e07cccd93837d22c4c5411b6084248458e26daa001b26351fdc44b2696ce59ba1d42b4bfc226dcf57d1626ba8b2aa5e89775b7db9b332c85aeffac9cb0f91d7a9b9cabec50796c5a3a715c0fbf985530e5fd2921fb1f5f0e21be21f3232c6598abea8c220ca610ba8ff3c9381012673484f2d53f397ede0bc9723016eeb4abda3b6561566b50e8c591e1f50420d8bfffbc0827b3c3c9e3bb141dbd7e4693f4e6bcc3c11abd0536f47ff69792786875db10b3d0c4838a5710aa0eb3cedca31dd0e94356ee04abbbef1200f71a8687e0b1510009ab83d3bc6aec04271e0bcaa559ed01a08cb0ce358415ffad716203c4ff9aac437d09c0fbd46de31193515543801b5b19aa3b878efc430a8a58808f125d2c1e67a93c12674b3835e5e0f7269265687cdd324c10bb4b8b0529609628166f31bf8f70bc826b224a0adfc7f5d2748735566e4b2e2330b96ce386e5260c4ea8f64a3516acd543b812697ff88c273da1dc425da0e678267add9f3dcdb90094cd201a816f4cc844eec16e34e8504a9cc7ed8228683722ae560008a62e442a5d31945e1d9625766e4e2f0c752dd06ef07ed37cdb51d65aee4d63f5c18e1a01b98f88f20c5a51747749553764b21d0cecfc419d7f83551cfb19d39ea73b991d694b81bae8ffc0eb313d4185cefe9f31a13cf42f8b4d30036d0c9304ee6448ac1c53c7d369c83947e859c39e9988c814a18a049993b761493e5e4bdb4c8f7447bd2b8f51eb54bb57ca57938259cc7d6419c4b2c2c6be54d3fdc8fb38b084e11d2ec014aba4b7e2fd5c17958eaf67d7b36cf89064643d0060241f3e490b314f5c7981cc60ebdbeeb935ec94bd762f5ff787581b221db61dbbfc170eea0ed7434ea47c744182afb62669085c34fe83db0dd7cc070239dd42154c5b549ea49634bf45e21d228d8cc91b8151708963032be124bc1813ad317876456e1127f364c2f51ac7867e4deaf3b52ba6954ab7c881c83174652c662164daa8b086801c6a5be9ed6b0eda510ed38a86119e02c279536e3a4149a348180c62c1d8989eb3a9b5a1d9e76f8436194fb6a5c196e07cecb06d0978c5c478c4432ce7e0860c01c93d2a34b00f7e567be42c98b7ff8d7d2cf5f3b4679eba381f10d50b300f573f502d0aeaa1b93e88e577b928adb756494b931739a9bff7b8d6376e9721a0594753bb823f76d7404e281920d242184b66ecc11ebb2bc349a728bed7d911a403a2c7bc08b240c5aad9007304f86ad97e0551d2581f0c70102a45686317802b8b4c1c4da19edcf45d56f2c135988a85a2982b7b1716b5077041f9f94c52d529cd5e4b7177f06275b9cf8814d9334ae45e5266458649038ee9c3b213d4861a7b9913cf3ea6622fa92f9d461f4aa3ee046b8b7deaefde8d6029285740e12ba90f394045af21153061bb679a224f9023cce33f0769c3222007ea2fbd57231a2f007fd35fccb501aaebeb7e3dddc82c47f364eade88496b864df6ac7e3d7ccdd87e33bf694423f7c670b47abc0704e7419c019c9c08f5499a1fb94d8bafc0ae037f972d7b34df856a908b803ce3fccfc0a367ff871646d33f2e54f46fc5770871f2081eb5fc6b6f88aad427be33a9aebb5f3f2741ddd9b1cd2b84a2b930f1f793f42f448f54df94a3a26a79069f6759d9bc5af7ea63a7a4e204f0e9a537b26feff41b8ce402e9753e7642f550919579a09c51a3345e1f66a4a3483873124a0da065d59d23793e10b075d3bbcd6e8266b745e8b95092cb1d66240296edd13f9b930889e4a778af98ce05dbe17c5c4382775e83ab04513d26098344afd7889e8904d0040262f57e7524d492444d95a55764078e45f443d26684cb57d0b18183aa8e2c36036cd270ca819ac5a24b444daf9401d74cd6573e69e2da3d11f0b1d2d1d25fa24baea36dbe80c4c34ecf50ada13b15430ff5bb3c9c6c4c9e6687c23684aaefd74bca3bd5989b995f39726f20e91d5fa0aed88f19aad6efd7a4a31ca0715434a358f621075e58a785dd1e4281d8d3dea7196578b4a965c8dc85725717f5ec95a19ac940020de034188db86165bc4e185360f46cb7af065fb0c2d8c36b33f81a42a512ef4fe83e9a053d7de219f693afa34bd1630f9a334ebaef8b08a093ee84d17ee4f285d2fb8086381fee9fc68fa45c8a52b8ba13f3a2b561371f796d30824d5e085462147628f7fd4d86c7843827a0468bf27ee11f70e62886032f3bdf842623f72e07aab07beb030fe47992b8b65338d99f6dff9c8ec67df992398909b8ec309860ca647ad4fb8521b4b0be89ea8f555c9c4bb918c586b1e3ac911516872a8dc841f33bfe6bc980d725940dfe77bf23e47a1800bc278d54beb88ecf85a72842f02bf98b9c688b988589bb2fcf46f798d02debf51457e8995462f13f469d442f7338428739830f85c52e68c8dfae6f45bbbf9f40ce77639dff99c4fc3f93b9d33e36798f497e79c91d8be45d2bab5187850b6f3313095fc652332c675620a00f4c4087a0d43f142e110db4f3918fe671d9ebc5492e16f9ddad0086d20b15f7f32ea194703175d2ab4c4ad4effb00c78ad77009923065e9d42baca429b17d7b015178f35e05165cb697305f981c773df58f5221351b4b421b0776641f65d3e762e9eed144d7ba4c7e43c009f5f88c12e9a4d43e7cd6fabdd398d273688351a98824f70583d05ef83d2453afd7ef135d1c58e2517f2b08a47ca7705b574a65bf26fc08583101ce875828e08ee680e57c54e85fb212ef9290d713fd831bdafc122c73028f975cf3eb33d0966b97d14c1fb34d5f98ca09f9c15c7900fcd668901eba62222806c185408cd856c485ee44fd3836270ebc38393fe6e912e63c9f40975e845628d0baefc3a42be249605ee0279030751857e4dcab73eff8e0b30056f0cc4c7eeec1efe1861eaa1957c017514e7d792d0c5f314485ba9b90bca6bbb7d1b9f59cbb783e666fe438e7bebdd7142682960180d859e24d11d1a9e737644ee7cd0d8feb647c3a93e807dcae1163073928660bcca3bf6944fc608677596c06526019b92c0aea6d68c75d07f498c2a00e666ba24751c7383cc03062e13f9dbc45f079274f65683f03c06bd70f85703373eb0c70d3f0aad049cb29041efb77cc8ece411f0ec26cb1a680b937d71b01f617ac77dedefd8c4bcc67e19958ec41536802817a0c95924c3eb8908ac07a31532e23051349e115d09cf650a65aeb5ae78c6f528ed1ffcbb0a6962fe9f3584ed24b21345396b51f107dd23d6448ce6ae298a19be72dd941e293c5317e54c8cfcae0efbb09c7abbe2c856c47c93efe57a117f898f32d654114a1e724b99cae2ffa70ded8bb8e122d9d90726411a9148b901e8e4c97f890b1fcf2bc54694c631e4832ce850868cfc00c26b21e1552dfe69579cb99bd834a328f11690ed33a235b2f97c28e940c2ce8508b5c91ec12413d35196449b7db1f13e6b3c427fbac675e65e0bf28fd37f3783671761b61f60dd063d572507732b068e6cdfe303c42c45604c886a45b48c759bf45eefdf197f86c39a7dd05c661f11f06cec744842cf8a2d699e407efc9da301686c638fd72e9c0933289f8c2afb6f411efc9e7d46f92307fa413b975fd436a27afc06a080e624bd1f05e18d664935427a39478dcdcc817e6930583c08cba966110df6c0ffe8c3c6182f06f4cf33ea8e7859f61edfd34ddf2a6a677c3e99182ec9545bc1897884f98de443a7f4f6d0bec25cfe8dff9b92888b0c1bc722e15b2ad8d182d6111df67d214bbded72d2e792ed17374efe78e073a6edfe90f3f2b1e6767d6031dc85a76ddaed64a3bee95f760bcc4b353cd09c5cdc07e5dac7cb01f093582989def186dbeaeb40a8e5b2a28c70b099e0bcdcdf06b76f2103a89d73fe573bb654d6fae133cb6fa05eff14eb63f3bdec30d6e8506e4d5f8077f13f334c924b903ce9566c506eac922684468ef168e8099610f3a2376a84763061798d367c09c91b66c4f26bfc26f8c610aee7294b4ec5cd7860e573a6567b89001d27df9085ad167eb081ec39aecec4551e1ed11b939586db452160989336cde411b1619e38112c664c00b966dd0b6094c2806bf15d705bb5f6cc837ca6020064bf216f822a4229d4956ff4c468d13dcc8ba1450143e72277a6af5ab9ed9215eee565a36649bb8bde85e7851481c72ff1bf863f558ca73993d1a1a6e259226eb02143145e0ed45330c3aa360221f7f2c3dae8116f38072e43c60f71d3f4da453047b6e974abb481f2baca2379b1755a16c32574bc0ae6d4dbf071b1a2aebfbdb1c1f2d98bb4393817f5fa43985867cea8994096c861efa045a159ebfdfa27d4fd80790e4be291453b346a31b60c2f225bc3c1dc3ea7cd4e329baeb263b279737617f96bd75fecbadc8f19be53e2e24821314fbbdce27f080120398ed273735f8cd7fed7651a3d17d6f1f539a0a62fcd987922cbb208f58365eaf1aeae08273109d95974c53932323c3583e02ec3ad41499e29dd09c99b90ff8f070f5a7355b9f8ee033e55cc34ad054f334314824f165067501869a16d3b8aeeb30c836a4a176523db32ab089336255bfc6454a35d097fb00d54b458f15b47a7df7f23ff9d27bd37aaee035affd3d0eacab2d27b67a5d18135ff856ba9ef3f9fb65faf2e0f4bedbe23bc787238b42580f9dfd3f0db3cd2e195eb5084e41215df6f27dd258a6b66f37cd8812ddf81ff542589b7f3cefa097d1ef01edbefbb472a3c4aedff4703f1921d3a78e06b62432691830bb4fa2acdba25903222c731ea81efa9b841c5789c1aee74f85a091187dca30ba740187c301541b1de4e22063cc3797b5906571e3b1251489e15367a512d13647051200aa4b46a307cbe0b5d9635d2ba22d87b1f29ba679bb2dc3b51be0cf4a953dc184252ff008a5e2e0abda644c6df90667bff3ec0bbd619575ae1504700d18f37c32c5180bc18cb2de2fd881f5406148e83df03c22be1be1b4c170f9a7777a441f6d06cbdb54299cd1762fea8b3276674b0cd6cd61e3adfd39ce4a52098986c2d93360275768cc8d104f89505a4b1ae331ea2e84b9b641e920129583947e4bff9523956a81504b422aad27a3da551210da634005f21c26672d0ef2f1f28045d0f18bcc61f972b7c0942b5aea982060adb85029f02f3c12b28b6ec4ac4051b0c7ee08843aa12e779469e24ea6c4ca6926f9a4934e85828c5ced6900866193f9d1d5a3acaca0a3e5171422ea34b90cd3435783235c5b46e8a1d2793f10d3342c796719a5c976a9ab99a321c4ae1f669628e5449868deb6bd308ea9bdd67184cd0ae0fc845c0642beaf4ae995ad232aa15ddcade22036d7824c40c337a19f9334ce0ea2be7efcd6016af6222be48c2918bd559fd4c7511a4478b1eb4cb0eee48840a05f1c4fead265f6727dfe63898d30132c55ba54c989b0294424fe83a577497a4b1fca1ad0a4763a198f80abca1433f3c6dab3f6937c3fb70a5e3a0e712735473836bf95660d85fd357c40345cacd1c796e2821e03dcca508a4e4a4b5e5468d4e56cecbb10480f1b181e61f6ecd8ddb2a3cfade2da4679179b67476c148360e728fce6b60e3dce56cff7ffcd764f4bd9b652e04e3333ad8763650ba4c0d3ef23c627097c4cedb5fe93fcbd6564aeb27b881313637b2b609d20e91064e3d8fde9aec39b0995ace3f5946fa4968e000da43a4fc15441b278b543fae468cb8e81a85e0501d4e186722a1cc1759806ce524a8d60a71c247b76e4590018b6c49cc7eba90319ef0dbb8aaae14631dd80f06efb8ef8a1ab3e6283a3c5109e152a47c955fd12a6d203010b4e1ad1fbe8bf2286e14e3c5a64e1f1aa67678805681f6913e2afc4f6b20a616ee9390d79d87bbceb60595ae3bd9f57be92f9abbe47a18843de3bdcd7df63280e7d8061b51cfc7a23648d2b9dd3b3014cfce5fb5bb70f2e6d7a395de0a6a87b594c823c332a99dd00b5b3898d43e017601c19615722c0f8ecf9ee7db181f78fe240cd8271ad6b02c5c48b848b86fe625373ae2bbbecaa6eb0dec53ef5f2f1c69a7d17b8989cda3637fec969c6e126eaadd4411348e1f44680d8e9abee0d2a2c2db09ce4ea7a8b563787824e6da06df7c38de3de02500d2f5643b310e8ebbf7f3bc0f4cee33f048635a09a568d624e94fb2f983d9ff6c161dace32f2da1da44a63d297b1fd5570b09d6d5d102dbf4c2d1ccc0c3c3f0227633809a130e4b6190970c00f6dc0080621bebfa096fc753665f09810155952916967f4a42968d009400a8de387009ae61230bf09865cda762dc0a09ad0c503cc7f593737ac33add9af5d70fd7c166a0c3b0c95a5af6ef17d349abc196025bdecef249e086e1f6c06633b6f3bd9f3ef4a65ce498fac2c76a33b87b0ff9e2579ddabb7710e17685c418cf2005b755ef0e75b9a31a923b8ed722cf03b7484cb9bd9dd4d77e4080218ebaf224bcaa04314a8279fd354a1ead24d44cf886acfb6876f2961010e2ba6b585307df369ddc4e5b403a594edad8565700fdfd96a9bed2006ff4492d6a73fe97ab5707eac69d5d58622200c73b5e502f28db2b2c1b30a1c777f3f08e401bfce3171f15f89daaff6cfff2fefda6ff681432198003c56922686fccf9cee66316a8efa0d7dea58541e404cbf8229c63e2c845c135d484a641a5b00c403f42b28c70caa59905dc7f3a7826e88a851d077d8e502e85ea6523b699a875c2d6803702372d839b96137ca142be72ddfd61c7c17841305350b59ec5d136be695fd7f39c27abe05cde8e6edeccb91dae4d37b07926bf3fd049f34c6f68da6bee76c5569060d73f3aee5893dfe4025dfd499871825d8616621cb3c3a3fe6289941fa2783fbcf127350fecabd39eeeea9f5a751a5e4d8569cce7f8c720a722b23758e34c642d99d1c19880ffcc11e9f1bab94665557eb6fd5c13f7199bd8111c7a16a9e8e3ddc8f47e9365dc44bbc423c7d04c63462ead73bc8070cffd4638767f7e7133ce08f0e3e705ce710b9045b8c3728e73cc5bea3db94558db5fb4b09c0b8edb01a435079a25ed5cf6643cabdb566bc3003e413ee74eb9f2463baeaf47ea739bf4ac15ffc74c5d76327f9c177f0d67d84cbcb027473481efd4c6d058bd4b852669a2a28ba27a4c1f99ead11a2749c0706c61b82f48d0653864985fc48a0058dc5a47b521792795a199755d4af17d24faa9682b30d379c8f300fb567fbeeae3207a45e3c17c404d89d25df37fc1f3a7f6a4f531e2a43ed6972e686a86dc09d5b58e734097f339751401c28531daeeec26d0e7a1fc29f01d0b644d3eb75450cf64e5ad13b914bc1b9333255e496114869833db619412fa2d32fd6453a4690b2683a9c9e541895d4c5b3951a0cf36befb5c400f84dbbefa9a46efc716bb3f9c63e0418e28dea15052de5dd6bbd87fa6204d7a019fd5f913365bed47711374721aa30d145f5d47c55a4f62265c8111ea2d6f35230336cba2f0b2db41302d5c379f7fe63171894860c6b50fe4316f4206c35094a5e230250b0fe9532addf9f7e8dba62bf996dbc152ee60fc241fb98165672e723d1fad13e0f3d9e1391b11231980f36ff72fc530421a85dcf44f263653de288200ff2f842d0a2c80b5e8a4cc52add027061d00541176d79260628802fc0f64712b4352a3ed94c4868ea4f90a99ded04a47ba2674455a7a6dd5c3a6800ca1fc2ea97058cf7aa9b7b5ff26c233c235136b5db74203575d81c81fa084c90c832846a0a7fc13ffc426012fe7aa2a56a7b95275acb17c8fdff55c57fdb24b135159368d1e3386a427ddb00c523110cc328347bbe0275eb6d03949586955bde7a2d9d48bc5637ad23760469403458d61c737fc35f4fa0ec8686960949b9903dbb457ae7f5fa69806d31141874a24bde759dee36652dd444f6183f3adfb12de10c7fad6cd1fb39a6afd9e09e2a14ffc2eeef80e146a8174fd5edb4a52717c0c32cb25268b7f0c56b8c72cf482ebc5628d63a9a1d177d55fb1bd422dbdeb39743fc4159096f6476199378dfb28476b73f48638706c9708121de46149f9a30cf5eb41984d0d9c110ef3b3108bbcb6c2fa167085594ce182b3d5ede1ad367e7619f3d398e55664ab8f1a7b49efbd4d2d10efe14bc88bc6c40761143d77dafb22b6dd83b6c3b24ea9a2d057c046298bc1a64f9a9676b1a5b7662e64fec9d0fc03601a0a81de43e6b1d566001e0b63ecf419d0f78c862d001e3935c4634b2b91081239113f04b94fb2b0f28057ef64b41e66f6aef94f02d808b434c53f57306e0f3d0ac839bd2bb926da58979e57a2ab04c69b43b1eab0046d1914a7618d79a18cf52d5a35dc7874d8f33e2ea175850ff1e35942e16bc69d11a5259ab3d6b68f577404118121300347aa61e2e5219c2053a7d0d483ef947d5fde169ff1c44b13251663cbcef695f0bf6a5c042be554ca8c69b8c06d0b3cf5fe862d7ec80af00c0702389f4eda0ab606ffed604cf7f1f02d2792290be02af616949f315cdb271d1f652688f320dab800c7fda952e385be0cbf25e48b0a639136ab80287b88dd77be3ac54006c788482b9535da22cec367a25c39fe1e3e302e596cb49b0a8c9395ced01fd53eb61dee84c354b027b6d6f262fff7eb9f57368fcc44d970134580941b07c0636a1274de2fbab904a3756cc02e88f397cdbac861e12881ab1e69f91e3cc0cdf18bac1f0db6c59d06e819cfbe0c2446dd03b5954bbe23d967c443a2eaab131c0d779539eef464e45ffef000ac713a596b3fe83a36b9381f6dd308fef690870b4f153c4555ec6f3fc3d5e4d610d9e5a5dcc6b670609965f3be9af719b0833a83111a02892a7561245fc00ceaa62bde751444dd871824566f21cda608722adacbb2c6eca40906362c86b91d843a40fd326e02ad859d280c62dd41bd314fae5778420bcd740b17125a3a3b033f522e438c0edee517b72ea7ee7e130fb95ebcb73896274610e4823edb5ca5a1a138ffe87d25d273b67c0b0d5a33680c32613267cb28fc4be97bd21dda23f01852e42658b81180a9fa9af14d9ccf69407f2f05c31186c6ea93e09f0f568c11bfe2a0e81d2bb1cbdb4145aa701374348ac05fb6171793e36bf92acc9a829651b0e04ca3e3dfb762838140c00d018dfade9ca09ce10308a4f956d4bffe0b1e849c46eaf0ac11a3b5335eb0c3701e70059760414905e75dc17e72e5a80c8f198caafafc9070f0915eede9a6e76d4f0b20f651ca25e15350bfec8171343039014b582a8a9b71ed70f424c55c89b6f42456096ed713784940cf5d84c60bacf2266d1c56a0ad13eba92df7c2c4266492c3dcf57f78cc13b4adddd927f92bf9575fb4e059508df0a8d72f70416b99724f54e3636edb5185daa4c1a5dfec2a187fba480803c6383b8aab044626624425dd95c74db9bfff113c18f405b544237765c915fd7c9b3f041f6cdfd410dadfd1ee44486f1030cfdb60bf5aaadfe3d11d6a989a585dfdb98afd9d4efadede5f944bb2e9d2061788b1481700dff080906100f7c4d9eb8301b0da9aa4b719c83c086d7643be7149a46a534eef801642713c060c72207e02d83b693902208d326574eecf9a3e02352049b3cb2e0c3127b4039ad860e5f236c0305a252162fe8781e8d119ac64e769514f8dd7ec1bc12e0080c3fd34e128028b0fb30a531988595784323bfd4effc890cb2763bb3be26c976dd7ba1a1fbf2e722804d8acd0aa388de0d2cca325d15914878950bc17c435a97458630626d9778e3f6ab9ea1a30ff39c686a7f406cce422896929ce6f54f6e0b2aa845bf8a837748db57514cf1cd8053e7e5eefeffb883fd494ab8435938ebcd6f6dd3eaf5e9bbc8f5f09133dbbf0a605d3e7335c4d51c08e78ce9e4bd74f8f79dac1beb466ad5ed03b44e1f0b41412203f5c2b581d51affb00f0d77c5c08d90373f632d5ab5d3672ed685293c383bdf0b9851b41c38575c981d740697564b9bb7db4287a3e2bae70589589c126a0974539440310690c2533139080e0467f96f0118a3642c2f1cf8e58a5bfdc08e6c3d9c7527a152e365710ab6a05ab17e3ad2585d448d245c99b336926619fe1f01fa9a4bef4fa3990578284940424f360dec0d20cc22d42e9abf9a7620bfa9219cd629a9bb8b23c4492e6ca96f76a934339b945901a40b3c5ab0879b2db980d6703447af63899cdb84443d202826f9e513c7a2235cd49be5a9c843f86f02393c0f1f51a42c8df08c065ec3e0e77087160d54d9d2c05d6b386d934261c08c0850477acdbd6a58495cd1037488aab38583d39873426dc312cf9948d88969a12e8b51bfd06234ae024bae132ee2666694da33a7dff55a57e4e7bc56773847696267d45615ae843d9ed7f41e89e6de90a0ba9cc166ebac68e67d1b970b64cd204cad53a4649416f2693e32dca5ced0862094ced9cd07a2cddfa26f91f3ff242e6f290040501e88b818ac88c06489b387e603824d8d0d9065c1d7f7bf98f87c5fb62c8a10237aec55ac65eac597580744bf8fd1cee1be3186fb8ae65f52f3f16900f6dcfe09da6932aea103d6ad60d2ccfb944d35072a41c9f4f583c861e23543362e60b64cfabbbbccb3826337e8979c7d781b08c039f503da815c66f3312b81e573695a41971978e9cc57f50c78f81f327ae3386ce339369eddf677998f701f0cbc30612773044c4018a55984bd2075a6d794a45bb77929e090d909e707a641d280e666debb1e26e127a9521416b44685f356c7aa15e8903ff77a05a7c6b11904ce4e2c34a285dd761489e3b41561b9d8f5a80043ac7adb71320eebe019c8edc415cb1f52b8e6e02eac95b8e23e7060ffca6b6e3646e8bb7771ab48d987f18672eda2c9824c6e49625412ab7aa90316f6c783e0e905e5408713f5b20f8ccb95d0117a94cf0fabfb6f2ce95fcc54ce5d897e4593024cd6db1923a648dccf01bf2b73d95b46fe529c93509e658fd6e41a7bfa8d2f364e8119c950d39f3aef1de0c08c630d5ec0ab92144a3e7ba015041669a051aaf094793853569c4282d83c67217e89046ed0376e7dc900d39b4f705ae166073b08e3afcf095a308ae827db008af2265649ce6e96d6d18a3ef702ac060929a7e461c40673a18fb88284929ea9cbc4dbd39e1128a4d71d791b0fa65b6a2349fe4cd71184bd24adef0bfdba13733df10acc5a2b94b8a28d0e06c70bafd9c44340e857dd2bcb77a81e1e20f88d4ed522c25c90f118e4eb371c61c683c6a634558d872074c983408001f327ce24e141f7cf9a489468892297e85861a9a148b158952d466571a3d4d97264b39bc5f6b30bab4f10762fd47820f28da313339f094ef8d87efc12e0f1cb7ab206a218ac23ca5743d0d0092cc50de70f0187a3a41a9f1e535f40932aebb9ac5749d78d0aeed211cfb61a4e8cbed09f22fdc65e28b91e1c03f8e770e47f956ea7ae96db69e4e7fbbea681466fbb8e0a123a2951f81c2deb455dd81edfd2a282a86f920be16686f5856c91784e0853f56d0db2f040efdc3f97f3e51280f1ae14bd5d3e8af58fe2fded15fda51057cbb2813e4a3241c15ff449723a2eaae001937e1f74ed0fa5919f92e5cadd607b125b75558d6f52115e72b1b532b19658764605bcb616dce8da0c751290e168855468efd4263f53fbc60d967d663dbdc13eabc7d17e3c54b1d829edd0dd19451ceb37570e0e547e9c8eab1f5203af4a98240d574774954461c5f6260bed0c9aa908693c6e121bb2a08fdbeaad04f090ef6a1dd8b6e1921092bed370f88b2cba760bd7683f9ef8cf982adfff1630df48c70c2799e33dfef6fde5d9a21ba57aa42ce3e31f15482c1165df1fe2e2019d8d1a03e3488ca0c14718aa8fbdf313d77e27966cf378fb18d6ae30b0456a928df00826c011a760f1639787c5148dd859cd1eb9385c7d24e21b29a9b3960757f613b4ed57afdc75cd1fcfee21526879797793c263e5b6df7d1d17cf8c67e4818bde56add7366ceb95e4f647a83b105ff176dc3d7ab69c3953072dbecf749cc1484f02aee68514af98e0775bf6a53c3d26d6d63b596331866ef578e380362a7f6f77fa5f19c0cc832563fc86fc7fa3a5d5b3a4df9e2eff05e21eb41f6748a8dc4216313a3e8ca704afc7629a49a0a777dc3404815b78f864b23ceb0ee6adb19c1b493041bd3387214a158c604f10a8524285b1c224273b3baf4e2c5d0c8ab60e9391a8551ebe861d67cabdca479dcd951ef46fa97c3e7f3fa7b9ee4acff948771b4ef8bc548062bdb6e1c3e1bf9145af22ecbeb6fb35a81705c3ad4246c023d994855eeda8be51c7fbe3dc1263f3ce8a906aab32f430c1661e676b22f93285652d4e4d9b11a0c71b508eedd020dfa166cc1fca8661b5c4a4e6c3f6dee357d4771f2e14244b383d4d43c48c2c49cb17852b40e0f4661ffc319a0e0164d0c1fcff64918c9bfc1ca4b3b7b6e41807f7fe3ee5272c55b0ac676b5a72d9259a2c2a7fe003b1f75f0f328e9b540d4eaa03857ba4f8f96a9b05d40f8caebdfa1b6b90341d2e9fcf9e8f50a4cffb582db530144258ad672308b2bd5aef9fff946c38563fc06676330137504191595970c535ad27fcb99d6d2095b43e7d272d3b4051c28e667b6859788baeee79125dc8af2e98a08d325c6df6be592166f6cf60ccd937930559a1a5f38bb5795590f1aaf8e315df4e06190603e05fce832d2863234689764abec91b9ff1840875d4dfe7c7fca304e639d820df38264a64286005c3a7a0a8eed7722db57a5c2135d514d5b200e85585b3a56892ae7b49bdbd8af283561e28c32043726ffd644760fb87959e4b4e866119300fc072977461bea403db503c8c93b3ca98a22189dad9ba197169b43de34776983e1e5b66e8f800a4743e85bdbce3ba46e84dd764eadd632ccbc9b4636010d09206e93e877da4210de9d406e129fac9ad8f6ab9cf2a5fc2d3c521496e496d82d0168a99682b45007df3732e17d73adffbfda04ee8b43e5eabfabdb5dc106fb405fd06b6c50d3898d751c98899498a1216c6e2d3a7955bc558716eaacce87964f7efc00785d3f54b7491c977f47e3fb80fd2f94ad5d1f15d6e7d53e2b97c2f63ca4a6cc236c07c20d6c381f4fbd4e74da929b863c58c83b8ca77befd727b4ebcb561ea511f3e495f622ebdaf36daa65c9a43824996afc77d46dcb87ccf8ae4642ce9fc780858e9aa62e8d27a655954da64d12ea6b935b6cfbb4c4c480ae69a4402382538beaebed0d6dde6585bd1ddd4a8755a283128b4b2a823b128705e10318d05a5a53b0d2a8f8adc208de129d7418758a90477cc9133ea9183a047b1bd680c689ec6ad6eba6aed1028c5911fbdd0aacedc58f8d65f17f78c85da85bf1b00a20072958cbdf066730aecb7c3fcd8f2820280767395bf8a88220d9bcfbd5ac4e48607f9709c7a8d2c8aa01709f72d92d3476050dc1c01e48c68bdd12e35d30f445517bbba319cafcdec7bc6faa1c486fabd8a31fd1f0d279c14d1eea936a8c1eae30117d07dd8a1274caf841fa48e4dc6b1aa40e0c4e4706380c64dedbde9330a7190f5e48adc3df61cd83caedadd13cbd040591f6eb158d6eec453e5abd1c0bd64116cbac56cb865e1ab2ec48fdf329c295eb29adaa2bf3e4210598ab41273b3ffbbcebb108d229b7c6b1bcd7e10ec6697511c3a519e1f5f0751231254a8a1c8dbb4d5ea6952aada584e1ef83fe76ab737c5d3f33d018ef29bcc29aaa2d9f86a94f3608510576e7fc331ec6d9163931eaee14e26665f25433de21673f81c5cc57a952a664a278cbb736416189025ae60c761431ea4539375a104d2022f81180bd8efe109c3c8b82dd7ec521913b375a139c609ad96560cad43a01a228763ddc1c1f368dc94537f2d8e305d5db2636769dad01857a70c6992e4e06e075185e19d90e100c967a014ee51a55718c859536a95fb89eb909b0cce0f8faaf14852de6b3408e88e2dd59c49ba7f804b7b121d13288b535e1fc8f7dee0e609ade8565077c42c32df3b83160febd12eff44405607c647fbac70a9e81e686061631391430d0ac83ae27953d10988b5d4c45261040af13529cf6e1c2632512179a7f3bf860c8e32183ff297a307c660533a1fed1d2313b7ec8e5581f6962bb08aaa4d88cd157b5b2c6fd459e7b91066e66b37e369aaa06d5b6938524e9228b30b4fbe5b33b10aff3119a4d27d6c9ca203147e818ac04aab26d20ba979a363532c0435b4e22ee32ef2efae27b22edceb370e5a30d678f1a605d44e935085904fbb3b9f62f6238e531fe5016da5fce77dbcb2dc5d60eec0b75c93ea9e7344f409b69a43e34adb7207578e089b1e83b83f346b3b8f7755b683ad0ecd4f32febbc7fdd1f2daf0fbaada1be30d281bbb3f69f8087871d9b34bf68e2af03aac151ae3c1bb44cfeb50c8c0bbc10a7a1fc0188cf57ded7619f12c8a71dff043c1c1831406504c94146000dfec3cd01c3f8c353770fe89abd69210bed06bef645468dac2e82e98f0cf3d854219900db365eeca16b4e32757592ad8bd6b11d9b3a3820ce80957206830080ff4299ede8f325e1cef515806e8d3bf87908c7b38376f60449768ccce62bfa089ef52a86b856e3b3202244026ddb2a130a2c6649df04ed03f688957f7c23494e88d318fe1c7336a13180c1b65101ff2162d37f4a651a844e293fb9058db192e7f5c02d5bfe4cfa253b789f8f69b2a5ad031b9e1b7355d535b027b47f77f322f58d4c8904cb84eea59bbb6bd563c1e0ed7f70afe934add49ffa3f39994c0f69970726fe62bd1a16de4baee59c74eb223471191a2fca7acb7a0fcf21950c15515a67e91d8e04a3ea555c841645a4c2de21a4f793c62a176d55c2ee3e77f8906c23269aa39e7125515accd3197e5d93e32b9c64b504baacdefe40ab4412f5b44229653072448d90d546053d0102cc32731f07b417aebde4232379288a6fbc100095fbfd71a4042d7adf32d6d98f29b610d301ff9ba7baa91ef9a5cb613005e211cf2574ab7202300de64537e2557c9751ed3b65e4ddcc2f5bccc376095107fc55c304db59ce381a8b2de19fc1ab54117291080f605c538c0cada4a1801f12691f3c55bd02e326933509670ed53222c88b2eab397949804488429b9a783f6054d34f96db06ec354336c1724a17bd39c89e310dd1883f592812bd62005ad737a639903edd5b5d2ba38282bfd5d9a1dc14d1199e09fcc37eb991d83b47a4021520fe48d5dfd8c2eb2fd6bb0eff0247f814b8f482f8d50312d3041d64a966113b1d4fbff10a3be7579c7d23384e843bad5d452fef3022256f706aa36d4a6ca1b264feb5b6f56376a733368ad18f1cbd63c49268900d23b42c5694c17eeb6e3eae45ce6eb3c5f0ccf1bf9f2ea7a366fca61e91c998f3cf450a0b746015d3a4fe4d55b488f2bb38c3168a548300bc0e58e7491b027ca2627c058e1d8cb5dacb7b56e9bf8a0251c2550412ec17d86bbb93b56c07afd8db77fcd2e8d2cf4219839842415b99efef811aa0e75be7013fae42f607d341029052574d315f84d853b95ae4e24cb8478567989c99cc25a3f7f98159e4c861afe6ab11ae1362cc9ee6918e4cc0d87926556ed675ff183becca3f691cd3603980d336934c6e09b437fb0f32c47a3a16f28198839b598413ae3094faf2e38660cb00f15bb9ac29c1d2d3995d2f89d4e151a942518e166adad10fddfb6159a2843441a2f76100b33147d98a62850be611620044dc9c19d31f6d09f2f81882a093aa87a146b3356835df19d9d631f597ec01b52f4306c75e37793937ea1dc54d0538cfab89eb24bc3c69ca1ac3a9b0f82b910303826fa4523eb060d67e628417cbd751defccc333184152694a265e189c08c0d5a370d193ff361ccd4bcaee20810a89c7a38eba6b24c8ece48c22bd7ddea86f08701f7572af8a933e44d4033e164af06b68a5fb2e153cbc159598ea3bac67683ca29c4f5dccdc02e9a1bc832355fcb7e85617fa9814aacdf994e6576014dc0597ae9c1c78f8b0f60652dc17b39b0656d289c191c61d8ef365daf2a0e8226ed57b36a54073773f047805e4cad4c51057b7272b3c967ccf84310b77c9eb31710d6b42e1354c55b7de5eea3f7d7f97e9c381aef4f1896f88f787ffffb992353e5f88ff36e5d96bf5ba737e809c4bdfb183c88184198f2afa7b5f8dba4d4058b028036e35d6be8f549de00733963d653f0d96b37235b6089f97767ccf82f86d0790b4e2a1e1dd23db7ea7b1773c6c911d79a824e63b65059b806e1967a7dde880dfffcaf6b8c43e83e10b6bd65a607cf0666c179ba3d0e9ca27bc6fa0c45a0f4905c93a7e3b45fea0d4c062fe7cae0ae8acbdfd8da13f1dc559d43a84553c3ab68de997b6f06f20cb1ef30a32e3c25085b4ee2c9334d95ae45095f8fd017e0ef7a4a80192a5967eb6456fa5a11fbb490028be9cfab90bb312a9e51f4116730f1f715bd354e1455b19206d4a58a4e85829e5f56174e0f086a3e1f4128625cc7fa94d510092a8fdf7e95d00357375793464c100681b2c3a0d2ef8120082c2ae32aaa1d3c600083862eea48a5f98128a9c23041d5631717f15f3139053e663435ad80705a0828507524d5534ae2ed1e191f0e9a4c5ade8baba3bd4ba1aba4ce52e3c7830c8cef5374686f3b231431ce14e38f98241768a9cbede864e5096b258ad39eee971d900be5e23e7bc1a80164a318fd3fe29da3d217bf61f76dc47ccc86e672aeee88957ac360f1cb79111faa5d6fdec4a2e86cf5bf80f35384bb040d3e8147b7367c5ffa5d8de5a986232730dc70cb5d41356d9a6e5d56c1ca7df9e28a1d7bc8231cb9fbcb504e8a46c32baabe8463011e70c5452690833a7559468cab549668069074aa6438eb44b07f8dbaf5346c4ca4126239641eb74bf116f44664ee6f6c00d7ffae82412e8d5a4c8bbd4c81fddb9ed837abdac9ec8107bc66eb008d808dcec46f022a1339b8f6f6b346bc8bea91f36bb744956c8d2123f5367610365f4f9d061873f5944b47406e8820b325dd638973b30471450e03c3279156fcd1685c0f33a072677514d1096867717cee2f4d5d92f786e455285cf53b60b1808e0d21664013180e0cec97fb08aed8f88a41570e04ff8c89dbd62566742cb4605a7317b99c21ada6db72927a1299c3f4a4f470177c07ddb5bae4f301cd7c58fb0ad8de38f5e11b845ef3c7b2b034e12b83334abd174b94157e969f3086cb30f4083ab4318d530a063cd395b8a57941918a604f389b83d291647a171229d6ccc0b3205269f4d153b787afec31a36735d30fcf4a8b10482084e450aa717c204b890f138cdef849eb2ada92c5d1d3b70c967e54b430d588037d4ffd53f2b398c2599eeefebfab4a391cda2c557a7cdcc2ad52191fbe1173c4ffa2d9b482d6131884ff6b1f0cccd92fc9f2b4b21675a10a590a9f3920ec2c3a313f87d5bbe2f45e00a0d5dff9f23e76bda3a49d97cc0ef388455348261bc65c8645f1cacb773cb4a0a2b627ee406ca219654dcb77760772bcb2bc384b254b62589815563df52624ac8c672946cb16e95b15fea4b00874858e3475b56f8c2c7ceb38f401737ce851208060a524a5b414cf9093e911bc447bd564d2c4c674a4f345999567f7a4093dc0b07782425bfb5d025103335910636582ae74cc5f9f1b870f7584105cb2926b63ffcc96a0ffe9d50e1da6465c7fae087839bbb4188cf87e8c7d040365fd7dfa0aba98b46a2fd5a4487b3757e8ae3bae9d8ff53209eb9b6e815a4073f42acc263b04d106296104e15de77af67e641509c6ed136cf3a162b1e6f34c355409b74de38bc995a6eec0c0d25f85d040952dce0774e80599326d8a6724eeb7314dae9505a2ab13ba89ce76905cfc386fddc4b2b49330d6771a668dfcbfba20010dce22adbae4cd9864bfc0e5bca8e7141b7935c1dbacffb68481c6e14c3d0d7f0141769cc661ea726dd501040a778ef5b7122ce9b9d892a4160b13a39a6692c9fa9c573e2ce8f954d5176ed0bc58641e4bcae5b42a35487bfca418c56aaf42b617ecfe15b5f8a493610dc76ec74ed16ffde8d0d26fa972036752d61e8960d5cfdc3ca89c9b22a58b368f986eba7d4a0df357898c2d5d9e9a380bd53f8a4828df011c106954790d2e660a30941cd76feae3c0e5da7ff7fc1e538d860d509c19d8a6f7d8ceb2bac12b13eefe1212d433a04cddd38e71381154967e6f30398ea0e59fe6c447cf06837102fc405bf82ae87700b9798b401f80a49a3460fed47d78fb3c8e9c20e6f6d41253d92a1c1945f8d45518bbf80b63d66b354672228b4b0d9ec6cff9a204d0f7433c25f3ab431b599d75c2c7f3aeca84ec2749c80819d45b47e48a9fb03956401f8e14af45e121f2ae65d6f39c335dac837b685f80efa6ae282779779fc32df549ed243ff413e9eef6320b5defc28c4a20db89f2c77989402e3181e2b215f39a3dcfebaee16879f199207482cc61cb3910c7c40568c94bbaf6ac5118e561b0a7c3b015c49ffcdea878a7eb75593baa9135643076e4799e4c0beeac139bcd6ffab44a7d7ac6a1b58230d8816986b136942a2042fb68de5ce6980101552626a343e2d7c1fbc54c4da291d338e6e4b8aa96a5e96b64186c14f9a0a2fe95c9e9f130800c468f2449fea54beffa29c1639b8d0cfb57e346343efd5a15a4dac39d3637521faa05ec176915d5e48a85ea632436e4b4babc9d978705e76c716f270679194978b09c826fd29de79f7a7e104f11030d1d60295a0916688ab4b8547b23709ddd468cc38ea516dfbccf8a359f76e1dd04ac94bc597c12d833cfb0ebb5ec74b553f9d684db3e66561eb1d5860c31c602f206ccd2a10ac60f4c98b41b7da3ee91a68cd1f9d8ad7596bd4a4ccc44a54d69167a0a30a3a4ecfef0de9a7137e8d4723926ac26b98b8906e95473fd3973f8857af054c9976e106a25a8a54ee197c892c5e209817bd8c6b192736e4a941309b331ede61db297ac951070a888ccbfd395d78da4c98adb00960af2e4570e8b49d41ab8d3e3434c07ce50e6078d72369e82b19b7a69373f6d5590ee21231e0ab4910332d436fd125513dec4f1ed77922e8e8b1b35483627943ace90ebc760738c04223b53733524a2270b7b0441f3825f4effc211f45567f4473845519efd6bf91f34a9f367ee39cd741555147a75baf6614cff7a234a87b30203f277f673af6e187065c74d817b2e137d9c5ad6d304912a09021478c8e601c6ea401acac2bb024403437d16d495c0972ef191ebdbb06b13cc5907d0549c17e216d0f3854252970a1bb56e089c03815cee97aa5a93c19c970d52edf25d06e4f5536785a5097da7cf768534a5b753bf535b884e3e3008fc384506cde1d430f55ea9f9ad844ca246996b2f9c959a6548fcb14376f2af86d5a356f9323948ca51c1ca5fe02f3018ad2b791b17b2b4bdd0e480ce6b11a9c92cd26fa7f2e66bf3a392f37896fc6d39bb52b01a6ec5d4259c97eb1a2bb69233ac0db8addfe0df077d54582dc1ed503dbf967249384cea332133124e1eb9f5443ed9498cdc8b2b739e39cf9b6be75e60f72be8da20825a81c304362f1e6f00ba06da22c1ce1df952a353663a2b9f67c7160cec3e4b226f029b2fe84e0d966bec06340754b081790a86cc01e3fa29cf7c8a93e9aa691a8c90695539beeb704cae100bd80d97b5f0b8314d52f62ff85298c2c126f2e60aa5954ac43e8664fb7737274f7c94f3c41c0fd8c1c6066a846e11fde01d78adcc2badfcb3e5e6e5ab31709317dee71ac03a6dfb982351abb4085f5b655369e0fae48e40613c43b761b62774163e9cab7bd52799104fc53298bbdca518156f1e0c8a50172d5a11228d5d98d474069afc09a9088e79e0c973006335faa069490062435e5ccfaf1f34ac491da2a4e0cc1f23392ff89eb2f8c2df2a9f89f8476220086ca93d742a592140270c35323e132d24d048e063758917bc69a31d7e5ebdacbee73f42f00b2fb676e69ddc0f7b9644fb22d51a9f407aa8f73b77a42c27405819d094fdb7403e21b3be60406e806278f3db20398b55a09cab381e7d12c6a811648dde6008d0c924d0ec375e293a7f89a3390ab1658d3c0d934aa3b8a7b023536035a2c931dff0f8fa2ffc2506e8a50170fa62041c51b70f1c6bb328a10d7dc481b6ef7cd41438f43d75ab3121635edadf02a97c2989ef72d4195918f6fdd67126b81ca695199483f7f5589d26e50fa05c17e05c6aa458d32fb09ef596d74601e54dc8de4ced1a9550c54fa2fc8f60d40985d33d4ef1867b17d9b376b85781e4376a0ae390355d2f0cd82801bf9d1cfb5a084876bd21c2fefa2a7baafbe7371e2fdce223255d2469bc96b3fafe286bf7cb06d0d9ffa863b8e4a6131fc09667fd99a8ddf0f0638c36e566da7db750d96f6dc8cbe8af81cc427498df010c284d486c5e15c88df3b589caa86e30a252b5564136ab724c4b23b65bd42a104d991b7c1a22d1f6542d98364bd281f779640f399a1ade7e18f9709bf842bfcba6022c10f8aac90798a1ac9c9ec72351a7e15c1244708c7b57afcc46f50b0a04ea7ed0279dbfb85142fa0ae5b3d401d2fc01def6860e0d39dd629ce2d0b1db2533b14ae2f7187c7c024703a8a5cf4e36dbcbd18cf75f2800b281acf58b2325464faa3a935060d483b330270b8453a076804e69d6b77f9044e41ccc94a43a2001e6c0b7998996c0e2c441045683d9343fe368bb9c17dbde3cc56311f840ed2a71132b20f52cf1170c6b8825f7b386ed888a9005c6c947496843dd29733e8236dfee3001c882adf1c577fb2ef49ed739c24db0714f23438d74e972c649d1671ba8b7338197443db4b18ad588e0b46fb8c882587a3fee461d320b3594b06142ed40576fb549d8621c2db68aca86b4aba49c016d39df6a6cc9f6ddb5f7f1b299093443253321be9adb014e71abf96722a7e8d0d922a62b455297c2b78abe680a14f90ffc88977f663e73f4df83d73f4a12c908a4e19cd04b648ee6e61f1434f9023cb35de2e0488acf1cbc1e15c52f00ab9a9ac280d4bb037ea564037bff94681a9fe5114ed66de22cc04b868984386e3248312988f733e189996d071de53ac4fd983530f9b8ee00f00ce3df4b379216a5f0ef64df66d840d747986256f8bc915d9da3486815adb66f8f9f15e0dfa506f2df507996ae142fdbd3fa3908794c7203f1fedb0d9331d646f1049c7a79cbd32e65f7fa55d133440acc6d3675da56692d8dee1d894b36ea9f7de6a63918554695d6c4e8d12992653c36bd2b03e10a483d3a39cc28ae503e2c799264aaa026e978d9c1591cd471a2e4fb058a419727e76269ddc73557bafc80040a2c9164e61be9af1206f6ae831c87e60e1787102297a066153db94adc8d03b09d824b9eec878634b09d26feb3a083b9d30a74cde331d3974f1932083f65e44233d7c15048bb91b1548e389b087d62f50e86565f2c9cddf4819ce24e37365b1030f4c0a21e8bb3d8d24054e465e7a40fce56860f9c3dbc30cea383ceadabfabbb0d1e764a673605803266aa5f3d11408a7ba9c82d083a6c06175f9a9e5118a299a9cd1c6d96bb5a95473768e0de2a8071d5ecd2019004c358cbb031cc730f9daa1884fe140e011eef0e2e6d33075c0902f3c0da514a695311b0b3b227a3091bec2b5c4cf5b9c7af1b77a6ccdfcfe41409fc1467608149c6044e45c3547d1ead0e2e7ba9cd80ca0401225b45e6a0bf4686e6fde104cde7a315c2cbf8b5e59dea0c27109aab6ece456fc60886b9b17214a1b108316683940b1b4415e12d011c646fdb3f9a01cbd0eca1acd08230e3e3d9ee2f43a49ff96523b2ce98b1da7d2794d75be6616ca69c1ce12e0f0195367c0537be3af06e5cf814cba278c7b97db5716c602a5fa3650227fc40e9bf543335fe33534efa13536f0fde8236b3b09e813bcc732a518c7ccfeafb0b4ba06dacdebaa7349053c9b8b229f23660c54564eb14cd013791fa94a403c67c26fddf0f0bbbb1116961fae39a275505086e43735e2016eea894964dcef06ced73fdb009f79b7c3703d3ae7c1e6d72340b032b07c492deed5a2ee9b76ba6fc240006bd2b9f6e9c13ac07d955df3137b5b01e1c5cc17491134abab5097ea3de0726539c835f1d86dca5afbef3b16ed4313ea44031ceed69368962a50922daffbb8da4562801ae695c61220c5f183dffe1f589cf50d0167a6491dfb039456bf6280bffabbdb472d0b8be2c4555d9c99d0e080df68b55bd59fa6f63c4368e132a0ece5785dbb2a40bc63234c9532b3cef67aa2b2976faa867be200407213f24252cda132533fd46ad3ad1c08d4b2b15a13616aa8a611848105afbc9c46f07f33d6dbdbceb99053b4dac569dae4796ffea19c17c81595a2bb04cc6f8ff01c8d9d25f806505eb9a3695b85c70a9fc38989128244f9512b05e16890a09d3752e923e62eacb1b5aa42b5bd127609f36323cf51416255ae0351244b0c3e68545868cfc3045caf0172ed827071a5bc63966228aa52ee94a1be243a6f1786b8d970c3c4fbba62977dac226f86178159f49705c340042c35c04029fb18da5056586016fe91f593c56227cc8fc2992b6766c591d920828d794ee7142b66f7d24320f44b4ac3b963d53239857b59c051736895591e1be58eb1ec41bf830e07f94c0c0c36df5ec0ed592f66e3b24981441705b8ecfc783b62e9ff73a312e4bee32fdd4681adc32b85472d3aaf0971a60e58582f4ce494b8260c6c376b6ad89ef9352d4ccd424d0b612974d0d312e41b6d088b8c35a1a14486e2c4acb3d149aa8e73a8ea954909e1a52ea6fe1aeffbf100eb1e62c85cc27a4a2c7deba2039e1815764ec17586ec668542179c58254fa675417fc49bd48893a1a9028f61c6ee2899a95097e8cd24d91016b43002c0e630bcbb12a7c5240b32ace439afc6ba1a80a819d9b8767a8cbbf7af494a81ebbc05c1437828165fd0a178226423d57666bd6dcf163048a613ec76c1e0444662e0a9f6f31ad29d075a0e868613c5db73fd0208afa64467e8908899d2ef067d3d0ed57550b64b0049da1bca285922a1dddbb0dfb4271680f349d62d33140d2914b37f17156618e1c470abb149be3cd5b830aabadecedd10841f810bebd6ae0c4674ecdf6bdfa06da6a303d273da63417c1099cef36081ab6659959b32834c02cb34d384611c5af819da8783e1a5613710a490f189af34b9693a880cf0cb1ef1171ece54bec4d6de9464c9e3aa8ea2fbcd1fc02b1a867e880c283d816d381b37b51c322f56915cc2559b7f392f3fd5c1553e4c68e77e1f6a83c23dc6d4a2ce2019d035725a2974bbb37124269b95fbd027b998e0b9401e285b0d1686a994eb77633f618536bfacc940d55c3a377c77c1a20a2c79603d054f99088d997f0696a55defa37bacfc037e69e6f8a62eda1d86858833b5820706d32664e61f5cec1f2db30c7faf45ff3614e3ea6363700098c54c719f84035676a18d49cd81a07257b76a539891df14e068b57e670f32d20b13cc5485fa646135f7df2a4bae5869a48f89ac8d1695982e12bd9f3a382ce75bb38909fd98a998894e64b931bdd3fffcb80773de772a0c7e68ddb8e0ec4a9d593414e1cc4a434f1a0a95e5641d5714b94d326c4127000fc391c76d009af8387e8fd252c1d356bebf096f3b32c7ae2d77afcdeacb68d44bf9cce455fa7bc8b1212f50a165320efeb47fd40ed638decd30fc598e77e8dee9eff590287fd8f0c8b6ed4405ae05b052f96692546c41335d850887f1cb8a59b969b5a304b112fa3d17fc4c9dbb528ca31f6418b240a34612af31f32ce29ea23d3246e913308024f0a86c1b0b3bdf9e2b14eb59b2286b03cf1b01ad89b5af2ba9be1199f49d24ce2a029f22dd6a4a928af97d0260a7757295b3b46ac000af4362a0092a62d795216604036f331282ccb922ff3e422aa562e3154c4debb020acbf275b9f1a38c55bbbaf3d829e824a2a102c16949b60d23c1ba213d1d1a40d14ae1e2c25cc19a0a1006fb1254fa3e38ed7618e6638ee325c2dc0f638fd94e7ae43f5551072f6ad635a66d4ef596ba1188b37c117b1dbe2d8af17a35e4d96a77a21538e473a3dc8da30976a6e5066d8b34db921c934696ac379541bf428394b553a0a637363ffe5b9716aaaa10fffb10d2ba5eec13dabdadb4abe8c958dbc15907153197668446b79d06e325c213946e8922b2649dc51a4ebf85eef7b8b8dfe8a38270403827129ec18d2b18dd0299a3c17e1947e36356e207e46f534238b185e0f10745b2d293b02656b96d962a326291f6074d7911ac124a5fe7d142f3c64bf1fa78fd1cd7f11ada52b03f5133aba5be87208f2981e45642f68dfbb388af1068b305847b937272c0a94a10c0fed03f41c2071ce041c21ee0bbeca8edd7a25a7bf20782b7375fafd1ce3be6718a9bcd82ad12a3ebab6a24e4ee2b7f81bb81a6f9555a61efafbd4c8ab5bd5cdc5f7b2e12674c3aa51719a3d53e4ac2d1ff08fd82e6c3ff666150009179a2524fc4efe5269496348cb2880714734f18d23560f2e5883fb894c3f612c0671360d6f5d36a22c631690265641424e7e3d1b78b917c2f3c0ebef75a73d7df40a1740d71b617153c8222a7940103744151bac641910a2b791c519be0b9c4b59f57d978cde25524213e68a1fad7cf7bb150d08fc5b6a3e6c381bd65c14c72cf5508880f1f32f92cb449064303748bd99436a43a1e61312572c85f2127a378312521e7eac1cdc4d5d586e701301bf697ba53f2454dc2706a10fed4f3472b19c66bcffffd1aa5906320c4d75e04cdffeaddada4574d7ca55af3c897e7921a579d58c11400bf23adce37d7b5275f085809815bbfe76d028832de7efd9665d67fabfbac2da2d47b997891a64847e35892b8cdff3b908fa03fd56bf178c2366f1fa1a3289d664ad065853621c39f5a2e8ce0f360dc8bd857954ef86e4617bfd9b03e7e322f6e981a9ad0165e16ac828acca93fd5f0921b7e70365e049298587db6561ac9700744bfb9aacbe991a54105aeb73ceac485d4b4eb402f6119fac27d95aeadbf8b3900aa6cad18d94cc1fbb8660778c9967164457981dfc010dfd1d92d0ab6faa817d1ff794df1d1affa546a972159f9f7fe4942af44d0fbb1f1e2d883ec8fc57ee401e240df8f5480647037e7837c3673c15fbb92a39189beb0e53aa147d3565cab75af5d3dc18bfe45d79d0de61187a90f671d0da20d2fb00199e67b5638586287d68c37eabdd4c6601f8722072812c3002cbbc01975f33bb1b9a879b547e6fe0ff6dd104c28936fb32ccfc1f26034eed2e01b80d81c8abb7881ddcd7074c64a066e72d039080ff1fd714dd4e04d7114caa4fa72e2bfc7fc9b69edb4e7ebc2a8fca81327e963b92418b667ead97782c10283ec9496503e8c11c5302801723c60f5a406ee586d4f2614c9fe4bfd9a5cb0cf7f67fef71010b9f7e18fa113e4ed614a28f080f875717ab2be1290669d87a7a0c782100a1dad9069466425c2c791ebda8ef09771cc264bca3c22eeb99ac6650bdf652cae8d343d3ff142c48471bb370e11b47c88b4c241c27240602c7a36d0217f4a237198bbdf971f4431929dc3a40f7b81976c1f1eaf402501204123e486f23fdd7fdd0ed009c16ae9da36ae0f12f23e19d743b9a963429f20fd84ac771a6c0dd476df209993f5ccb5888cafb296c09a5264e84c09f32f6890636cd9775eca825c7fab0596a6145ed753f662ea8440e01b53989827e2263906d2ec31a18278f696d6cea0a37263de197d282a0f8183e267cc5f68395a002f1c5b977d8dc98b1fa11819790cabc51eb712d980f898265860ac504e5895584635d37605c903497705fb7e840e19f51da9fba9c979e8688564622989adf1ea2f5e1c24a4f108d27a1d0c16e2dfbef3487016a06afafe19ee2206c8e6ffed1258e5d50034139390ae73425aec2cd457e82fcd9250f56c2ae9e19d26c6e2c50619861365dac9e6c00d9a776c83979c851e5c6bd8533f52705aa397264bd02d99638bc57d9185871634358c5db58529735a78169f1398c425479e85849903bb1bb6ed4484bcc75d5095947b8492fd8b53372a21335a43cda790006acb59df2de06926e44590f549b5a5cffadd8e96680304914346ace3d71c59fd76752b5722246c0b4bf42f4a34c55167eb9c12dbb0b5b354a6cf1e33b10eee4cacb862e2fd84ae5c18eee43e840c6b8e7a48c3e2b77c7d5bb437a5b15a838da044ce01edb37d409aeddf8945d779807a5efd96f8dae7b3ab122459d43d041cf8b64bee09576bec35f9c09926bf997cd5e55c422bd6cbbef7d888311cf2b6e4a0cf172f36748d0449848cc90d11c3a6c35ff7ac61bd7ba2d2ff6ecfe1b6a348afa9b0427ef196a503e84558f8947b9fc2d95196a2a6baa00a59f044738bbb2a2e1791e2f9862137b7276bfe36be68d96de1fd079aee5e2457e5e7cdca0f80599f13ab23a4efcbcc52beb2db5c04bcd6ea30b6b00cb2e62d0ddb3a1e839f3adefaa9555bc9ac0168e050f28a52f64cc1145d9e5f013abea1c0a918af97d654ed0e9bbfe00f90c9fec4d0de3ee9d74ea037e92a45d9f354e771bd3f3e09222c314dc23b89b4780bae617159751359366eea79adb6f8a770bc77370ab0284dbd53f86ffdc49877702c8391075a826408a3712ffb8f46b39d97a0e4bc3f0409301ecdc3189c28c48d24531b107c6b4cebd3ce5955df7a13ecf83aa1b7a506ebf0b5cdbc1dd8716a530f4556dbae16c6ea6bf631b90f9f1482ee03fc29ed18b280bfa6cc3a3466367766d2d598631e8b048a4cf664994b73befb1a2e4cda827288daddde68617001becdadd2ffcbeae6f603bf47ca9d017d1ebedfbd595f76395f1c95efc849b9073ae8b669c385b42ef9848d3cf7af202fa410545252c7555738312e81a89102cf4c109e267f48c59c53899e635c52d6bbcb2cb8ae95a02d031f4db00d4dd0fccfe770a2512e238851ac61f23cdffa0221983e912ac9186b0b469fa0ec6b7bf4823f2942de158009d2db78141389ff424f1f697e0ad555757d4ba87b688f0ad112c77e8a1533e6967e5b8492990fbb0d8b1810e3e25fc726ddf3bcdba455152a5669b824fef0df050a37a716d6528f96a52a5880496cb5d54af41eaa2c3ced12092375b94cb9c18d6ac2a103ac42fb79a0f1ea36ec0abb361a81f206cb210ab96ded7f1c379857d83f3e61864c26f9b441112b91ef0a602d7cf0a8764aae93eef642f4f6354e9a3319d3db13248b90c37d8596539f0fe03956b8e39ec11e40ee8f7926c110a26c0ce315d2c53b15b5351a18b427a4e089da37f32da6a1d60d18ba463dbd17a63380c0b28918cf537490849b745d01469bb3bfd3d7ed31a7deb1a607b23d44b6804beab67d46b1bb19beafc124ab91fcef570943764de62b8de48cc1450e82bc881dd6aad05e7ad5a0440261d3ba6c6813d2489b1c1a3d744be78ed07e01e7fbc167123127cf5df007eb85f1f1d8b1cf405834d3a6c47f23df068f0b6982a3b3cb0cd087b2fe695804e44af25eb53125c0749cb38404df3e0e8c96b70311865eea5190c7d6d08e3c4914e07d83bb8a300df7eab3a3fb1b7e89220e79e99a26997fb82431a1b98a9d5a8ed6b0cf57585c46f3ef732b072022319cf096cd5a5fb66e845fe4d6b6bd673dbf5949fbe5430bed11ec40ee5bbc4c4f23791b26507e869b87240f4153540a1d1e2c8462310ee8bb72215844a2eb4275f6e6d0a3e21a5033d1886e593a2b85bd1ec559a0615bc73c6ee4fcb1a552bca86bbdc077bddb1363957745a0043b72670be7fd753367b6f9d030ee01d5cb3d1e5c8763c7679254eda22e6242aff184216d45237728fae096f20bcc704e5475778f2d15bd707f5e61e423c7314ba4edf1946baacca1eba0b7676d5ef260c7707fae2668af70947d46c0127d53af3a61de03a9686b053648a35c90efbaf49915fd103dd6da04f5dbdfa1906c40f11f0b1a787613cf313c569ecf4831b8b21880c11e87a493e2dbb6694ad4eaf9833134733307c702d664f12fa73904aecc79ae5ea43f99262cd2c3230205181b97f00ddd42da6609f8fb30570031f203975502e5abcbfc852fb735bf6f3ec587c899eb4d8969c99be53943908c5743f31d16cedf7ebfcfae3c596765e202796e3ab5b9e107cff0f8d9d6fdf312eb2f7ab079572973f3cb8a6beedcd0ffe71cf2e459f2a163ec6d6f110cdcc88879d27970bc757fe292b071f4526015b5d674acd317de6391e909a399e05b5f19cfeb450f48deb88691484722b481691ca05fdf78ce96bde9ce97b3c9d8d5208bd1caf33f651f071d7ffb139f7ace7ae5b1b26d3ad5d73e0bf597560a739f05766eb2a132e1fd0df08b11c15ec5cfa1b9fac69a725d049a08652060756fb22ce53c7f44d9f67e767ac3caeb80534f48ba9ad7ff878e1edb6d67d06f7afd60e8fa2ff657845be159cb8dd355c5efe40b6d384c39bf57696fc3fb770fbe037c0657cfb04b10369c86b4732bf6767ca2f0b504bae189b97bbe367ef3a3f55f3a763bde7b5d6b44ee88b17a69141eed3edf590acfdf996bf391dc0f1e1dd4b9e8c96a7f666f32193cc43dedf00759ca9a09c31964b78dd57ae22c1e9c38bb75a7a607e22ea6f4498f255fa9ab3389ac71f4ca8fd7ddc2c4d7c17b751070579b4e46477eec41190df3ffdfad9c28ffb7e6ebcadbd25e6cfc301d79cbb377f6f90251ad78a650f3ae2ebbfa65ece2b398785257bf0bd4cc3fb46220b9c3c92b89f7c3b20d9fe9288d43db095d6eaa3bca24fe4a3e69fbf1ed572e7c99b7cfb56513cf64971b9e3ada6d5cbe27c61506e61fe6abd6d4fbe5f715edd17d6f880bf1a9dbf14b5929df4ea0823526ee5e862ddc56a1b0af2284376928fa09c00b99cbe60fe7977cf01be26eec983f4699087e727387caf6f38d3f992ca7903568788d3c6afea90f172ee1435e73ce679505952b8e1f397fe9da9d353f1900dc6ccb904c000c07e00d20004c695dc60833f00660036038b03336cdb3cca1fb9e99803802507d2343c75c7b5b11eaa06f2155b4f7ce79c46d41315fcee8a2b040100a71b8f8546eda0a8bc05c844cf8ada62e475d39263ad2b5bf7fb682270a55dffa80db349b21343d412b926a9df76e277d24e06055fd462efa997e29101f4d55fc1d87ecdd00e643f094399cc39b3eec1c42b60a3fb9fb18742de9e204595dbf50a1b5cc98bc89199b66b66f42c0fa8e5e3f484ffbf4c68662674978c8a90e29913a8b83e7ef5f0ab237d15e7cce0a9d47d7906992e9fc8b60c974cf8182e84361791f9bd0d96652e5cd5080a46f6123278e4fe1560f311172e6a1a315481d2c3d0364d8ae46a6c2ced239145ff2700d43bfd5b1f323baeabeab4efd53b648ea132a739a4068be81717ee2f1fb9b09e8d2d00d934187d0f262432bf86517e7090ba5771d2b49b29dc8a3efc54869105658c2a838ccd6a6cd9a8b5f02c74d0ba12caf57d9fb03c6cc80ba9232a9db9cd5dcec96bc6a0ec00743b7c27b365e0751986f35961b13ac4a19e88b777135d3c6d1f77f64df657929e56c2010a1f39ae0dd7bdf2465ace4e6c8ddb6063d192d7efe7a3fa20148fe99403e866dfcccc2be08bf5b65f21273aab6c2048a42d5fc140946401608cf857d5a36b6ef41b6a49c4b17cebff64d14677d85f797e834b33601340e92f50392338cc640b808cb1d59641c29078863519208350267889b4686c7e8992ceb463ba8592cb2e6d68f45bc6d5e3a7213dea8c6253f6193d30317d410c6f69a146bbff8cc9f9a7a1ad209da756aae2c0cb44e3e899020dfdfceef5cb5a6f7521dc653717dcfefbaf0f758e0aed7e0f191f06ff9b59bd40d67f7519bcfb811700c508731494275b1f385ba922e28d6ca5e6aa0df0fe35627672b2eb48fa0f8dfb26716eb2eb22c9ff6f9dfcf9ae405c056db86b7c032b372967ed61e6a0ff12c8f745e4308a1ca1413973a97310eeb7f1731e1fd16154cba9c89d29b2839116b524340d89982580d3c7e7b8e67b9ce75a55f51d252714a26f733446d93a9e8bbdf0345854722f9bc25653d73adb1ecc1a86f1e003bad622d02a5a1b334008f88f24577f9a1576e86dd9ddf0b78bc1ab4776e0813aee2917cfc7e6f825912253bff29fd9f703ee67cf21c71c6a10e46d826c8e556fc2f42ea0aa8ee69333a389b65cfa7828f510110e199f4bb18caac1f6f69eeb34e907c9dda05b5c74f6a3ff779820157a596262380b9589cfec547ee47eb94a41f3c1d899829e1509b0f6d93c7c177a080b26850bafb19fdcedf2727608322a612d15ff60974be0c31bbf953fbef8ec6bf53af29dd17673a35d4053639a47446a43e33a7ab444093cf67c2e2cbe15eccf17df6fc2d8d80c707cd09997fbcfb16cd69fa6ada10702b866a8e15540bd36ee2e302e44ce07bb0b6f3271bbcfa51db178dfc2b73327ff39db71355c0b757c387eaf7d783b3c7060bdb1abcfc59e9b728ae1246e12602ee1de79100d9b853a91165b32f99fe21a630895a30ec6e699081d625356e70039fc0f79b3c4258193936971a5265d84a725a2d2e1084b0462a2a3335f37b4a9f84436f7156e963b520a7c6bb4be58e4eaceb83c27b16c8123bdd35f23bd40e343ef0e33ef20896ad667819c82e330b48b97024694927226fddb9a3d05dc1372a3570d58c0c67df65da05349afac05fdd563c84a6d7eeb5ad242832768677b3851d0ee8219d8f76f1164312638e1a0784921e661307be5ac66053aaf852de4fae3c10f3c94a7c678cdd7afa9570cf7820f16a22dac341a6442327236bb983c381fd4f6846512e8dfb72862c0d87ce7fce4b1ba421cbc1b091fbfb15df8430b987200dff129d09a48d5a0feac8e869e0deb2415681119257c8bee33cdbc0e16dcbc254b43fa07e699283d9af1e22da6629f9f83435217f5e54da15cd69630ca3a38f4c45b0c3766895348ab820a379a92b92c035fa7abe76e880108f43b1a719ee946e88add2e2b376902c431a9cd1a9145c0c959aade7b44e542ce1cce94a08dbf303ec031e1081352f81d61204e261f3a4cb19138343420721d0d5d733bbc094c6bb30e1af34dfde80e138ebcf36bc7f7497e1fc8fa11320b50b08504b18625194d289f084c04e5f5d6307835919ccd015a00a36c46e02308a0cc6d064c5d14f949e220007f84a90cea729715a95d6395818011369b4e7d35e5f2ce079bff66cece5f39ec71f49ba9b1c900574bda9065217a2a5649b499f2291cb4f204ca997bbe51107049d406701c6764c8f903914857bccc6356431a2ee3c6e9c3745bbc2a8474d58f4d916d42f56e1b293329d1e0ea64a37e80d727adb00aacc2efbd29b92929346a35682556378910cad421e2b76a9301f00cbf0c1c0b365715043465028131e7bc809ccc096403845d248a8e0a15659e2a94163af322bb2775503ce6d5759b2cdbe03fbbf4f9a67273a5e84723ee8146a35e7eeef4cb26a5cdbc4a1e73ee31fc53643e18f322c7ef808f5dbffcf627a7d4905ccc392ff244f2f83ad6d5f71271ccab5ae2c9124f5cddfbd4124696e0710263daeaa4c59ca721b61aa7cc395d4a9faac62ca635ea88221d734ed157e29339e755894de69c228b0f68a2e322999e4c975d994e734edf4d3a735ea2090be998f302c31f4c111c4dde14132e11eaf033c69cdd035dc6d007dc27d3e6968f08563f441a008606f460ceaedb2617227b946900aa01492e9eaef33fa34e059601fe80d89c17cf68f2a6d20e4b395c3edcdfaa7c8870817dfbc2f0e9a0fa6cf071d557f939bc142f856780b7aa2e03293a92798d65697d2057d77d5d177d370467f952e9e3037adffac697217c76f80511c12024488a23398a2328a2bed3e63124e9c1ee3fb8497e3a6d13d721cabcba0f4f28b2ef12d4a93c12783ae5e8f508da52e6bcac3094b164761473764c5c9674bd86c9ac3a3ae6056e9e0ecafc60d56931af2673569dce9c1d4bc7634e4e0d5213df390670435e44d0121960050386a8984481490a9820c1840825a0a084119448554a045982c612212c69322fcf97ca5da2c2f17bdb97ca720c3fd9a1c0965417378b95f24ea691bb10b979f150ffa57770c6ba5a3c50138f3aed90f440a30702cbed4d7b9721ca04fed4189e58947841c9174a9828b1b9ba2751e3d77596f74051498f298e55125392186326f124099d6d8475a1462049e49064ca9c4966302fae87e3298625a68b60910a0900a4d103450f4f0f0d159232b852f426725b63c9d275a435485048265226ddc0f3041e322a1e283c63c513c3b34307347adbb22ccbe24c28df592f57d7c2d2e2238264f92d162b2666f48ddf74715e1c71b89d9e302c608c6a01400bf01640830e11e6bc3a4b1cad174f9efe58962f9db5490f6e4b66248ee0d58923f83da9d391a89bd14546e7081d19727a9083831c26728cc8b101070a57f71b892b06e6f2df879443c404eed084da483944ac31c88be0118edb64d9c4e33481f372248e39aff203d964798941d511284c9674479ea88ef45c24d248132a2355cc7995e058a6c45458a246ae2bb9172b233e1811159941115f6487392f4ffa92b8f94791aa23a0ccebff9b303ca234ab2360688ef8e126ca044b51e6c68b39634c3cc96834c23419674cbcc98d655386cd07e69c3649d8888ce8c19c57d78d467b5b463831e74c6256460461c4e59900bf274f3550ca9a2c6a74660d4b0d8f393729f3ea37d607ab0dca9cb3da4edbde783001fe387c8944a4c99cd7478923088adb64994692880d0d1d73ce6b2c4f3be80bb14e150d142237150d052e6e93fb54cd40602663c0ac64d6a86482647218e283215c5cfe13b9212264c6f290585d901777aa212d454cb95caa22bc282200316188014215e3c5ec5431341011848a882688c0a98898214234afcdfaf1e322c78fefef7d8d90ffe38710cbeaac97abf3a55208911b19ebc78fab5b305ec070303bcccbb2866863082dae6d7de31e4201a31f54a391556942d0c84aab95060318e4d2620149f952397e22e8c387156e713491be7cf111c7d0e2dff2a6cd5d4edb647def952ee506fde974da411f8a4a13a10990a5cc39af4f7e223716866174df585b8959e59e8db8bc4b398e99072e634e199cc59c1397f0104c8e5616473646f6800b860cdc9acad631e7d575610976a351677da05582df8631e72cc7f06f722463b81d6665ed9cb34699b3aa4f64eaa9aa2cbdef8aba31e7d57d2a002c0a3605066241844841489439a72744884b0ad70aae29aa6ba6ba8090a37a4941f5529ad30ac2933e3338968b08baa02a9705b8a80861861031102248885008ac12a2873782cc204819049b73de5cddf3b1c60ac2fa2edd07bb8e1cadabe5012d392d37b00c81c5094b372f7104bf10f559960802b14005c457400c00a486208450055182209808225741ec00441b406c01845701f1a302420057d9c4f7f8f0319616c8a4eb966c1008890b1984950a4befe3a35ae92b3e7ec051fd68e3c7067e24f9817d7cc10715e69c44cccac717958f287cc8f810652c5f2a7df8a0d1b9fc777df00723aa1f74a87e208045466559c0cab10450f930870f5df8e0553e902a1f7a18a1872a7a2852f540d3c3e4410c1e9c543cf4f050ed8046b5c306aa1db81d7850401d735ea9ce7ab95eacb1042feb02fff6c1ebb4531ff4a58b04bbb891b0ae1f720c1a4b17d0c5aa71499535b8582e3138968b0d8c4ecc0e111b981918ee7b7688d890be6fffc9f1e37eb9399a1f13d36f6060b8efe1c25d8a2313203996627c1f6982bc587a9e981a5a625a58c80e7237bc1c4772f77040e3e997a237c5d8c090634caa04636c60ca13e9c7f0cf3915302b04e8ea00d501a0cc7905fd31887480ae3a0036e7b480e4a8d0718da5a06f0d51a94899731660562a5af4bec94ac5664e95192a2915165585aaacabfb5d17370e49a87018a37719990a0707e09064ce692afdefc6529001a250198007950132d0fb6907f18c46a4de77278e06f8510027540578c12e9bf8b1d4b97697f23f289e51fc3e55002227b02a808f1e65b4b0543db4a87ac8cc396566d5e36f9f62b1aced238240db879ed5c2428031087022408f398710c75fdd10655ebffbdfb8ab1b6e78e2877e43e90616abba81c79c1d01b31ac094590de0493580276635803a2729cc898989b981114090ca863154368451d950031b7c65030e550d745435c4e0c8b678ac4bdca46b142d72b47c6a5b624503131a0450f138028f1ff0202b1e46785433bc3143946a061154331c51cdb043007e500500075500ca2a005615001b2a0070010023a800005600c8a112d5e1c5d10af262d77d3a9d8e65f9122459723acba56b39d2e90479d1ea70ba2338961096ce119f2d6e131753bf0422faff7972f394287331e996581cf419439f2d762fd68f0bfc2e5d8784733dec1e3c89969f39812520406625ea2a114e2522221a4025c30f2a194a50c91002196ce697f38304f94db64947872527c8757da38b4bb543573b4255680b55888b2ac4a40add2ab4a39a7354538b6a0ea9668603873138190326062768400c9f18aa3088814318c26f5f5a3aaad3b1585d08fe176bc65a2f9de5d2b51cb146dd67b17eb55e48547747a36fe4c64f8e46dd068168ac4b2c953e425c42803bc87fa5120cf2a82f8ea0b7ff188e2e1d0c130043123000f105297c61065f70f2859a2fece08538bc00032f945ec85e084017c8e80207ba107601892ecc504713ea78328fccd0aaf389d8c9d9d96c4837dbc8d3ee835db58888a954e7c5b28ef8efa554fa74335d6da19610d64c4b572d188be55f3b621d357514a00e0070010a1750c005087041667633442c21ac96aee588e523823a5d77a4d3b184b08ebcfcb83a2e805b2863ceb90530aebf852c906ca1b4059b39e7b5851ede0b3917e4452da831e71773643422058da21666e042164490059e2cf490851bb090032c5081858b051faeaef49f237dd8e27f76391a75d637b258578b98d359dfc8627596f7529ee595fe2e9d462011fcf99bf4f37719738532ae00655e21c99ce4e8f9d25fa18715c0985790173d69fdfc5d5a418bd9ada0e34d2068851ce6dc273ae89857ff70a003ca9c2fe228d261c59c31deb4717efe26d1c132451caa40842a3c6161d255c149158ea882352f265db7c4a2421da694388a325430c29c73f69898d18883deb4c130dc341de4764c0c09c68727140986fb9e2944998293398a3253d0b9ba7ed34d019b73f629dc8013c34f27991b29dc48c146618e28d8200a5a44c18b420d2e2e5df737215b912296d55ddbc5627545364b08ab084b4ef7b9981a642c9718cb45a3361763b968144c0739d2fb53e89f10c7139e709a73ce27e85cddfb584fc8618a9439e509f7534e53660a3665ce399d10c5094f4c712ce9c8380173c217fadf8428be89c769c2936d6a829326d8ccab0939e030c79429ce01c61c4d38aa8b232fe7d03304e7e821c71439c090838b39a71ca7392797430e1ef3eae4f87d9bc4843098509a970bf853211398c03299c063ced9b3043afe2e2d21ca9c313161b869941086129c5082cb9c938341a5154716e29032afae857e72fb90260e1b38b4000719703001879024bcf10d016e97ee497f838421200108091a1210f0860fdea8e20dec461c6e7ce106136e14e1864a1b6368e3491b1368a30d1cd8a842196cb4808d15b051c59cd32299501d1c838204f140e108246ed2038d2f2fa32eeeefe61a4d5db7c3ebda7e144172b45c5e46df0d1b3ba46041ca131ca4905288cc39bb4f763d2d3d2c3d63e97b4a6b2c7d4fd77dcf1a2f58238a35303598a0860ed468801a2f6974210d31d2f049a39af3ea3639d6d070d1309656b72e72fc7c443004f7e7c571145f52612a448343a39ed1c61914382333430e33c4300334c3c811b470041e1c413c82d53f101f1114c1eee5fa404a11c59db6273bcb12f241162b5582a3f86279403cf981947fb3f8327c50c61565746554735e6339a29628cb21587c6a731fecc61e3248408648c645c60eb3f37d348a21c18c46ff349201b5d65a6bad94524a29a514a39ace38bbb6d27097e478c47433e79c539c2a3366cc3937e9858c381e24d243d48844d018fa19d13331923522923945357b664e11cf8ece88f3453b738a1630a74827dc9b3882a96d64c499539433a70867ce79c4f36c7b86e69338ff972794df017bff20cab37ef9c1269fd892126f40ab5492a0b72df15f6288fadb7b3b9419a28b305ecc292a32a7e8883945375305260a9b3945355e1c7144db141199534433a768466632d994dcf0704436223934381bb793b3b3b3719b112444728e7049648e9023497a8d8a31f9f2c6670c63346aa3199d51430bcb9c73daccd0136d8c4f5e298ffb7f9f44422e718ba00934a1446f4d32e69ce454d175ccf06402f9fe5e6c442fb3fb25ac214c7f0759a3cde8c95857f7e547ed12a99d8444f3cf2992614ed10e518848f7e12e77cd9ca2398639671ee7c445a8b67b3246a398dc0c5b7babcd523ba6a592c5ccd9c1b1e788272f46dd707a6fcfd4ecf47451e69763186402cba01d74b1a9ee40c836233383ca116f6a767abcb7675a2e46592e17a358f8378e1f0954b3d3f391404d7c17497f427d8a84f6d4ecf4d4ecf488e00e7552e4fe9ed4d1399d361f8df6efdcd331a710ef74daa3d1e9879230513001a00b0a940fe8c98ca457929a51790112654814e7a30c080412d19522e1018239e71253c5c5c89c2e617061381a71a7af33735484003d5d29f7ab456994ae1475312a881682e8396580c213e60c4972e3324c71c29c54fc3263794a9134a5088e3a1a68017f902c5e8876506119f2c304801600a842058818f3cbd00439e64ca900b151092203f393b24f4252e51c72fcf2a376ac52391acd3931ef1b510982002a40a0a6ca0a13a6ca8f70cab0041994a0e2030a1f1198735653c58749e58707c0918439a78ae564ce794300f4903977b0e6bca1c79c33f098538628e60ced40c5079b998439432d900109b3eb547aa842a50752a5079201944c151e9ea0c283115545872ccc22be0b17539f861a467fabe80004151d3e30e79c3b9ce87307cb0e04a8e850c39cd30053250175a824008d047c31e7b42c223d3a96ef337071f11cf43ca5e84d9e09906724bd923094f1221232874744e23d59b3c9add379ca11a7f4b74dc9c59bffc1237d7b9b4d6e1d4f8e34dd7bb2e6ef8c462a2a0f98738a44100215951ef366aa546274cfc1229b0a0e5a50c12188f449d0fae006c1521c2fcb32919e74f9ff47d1721949cf8417c1cf832724ffe4fd0ff7895c63d9c571e66a61e9e238e303faa42c9ee21fc83fd1e0f23f3d2e1feca09721b570d6d5527eef9163108bf5236ef2847ae9a00c69c4e9e23893da3a23090939537ed49113925d6e2248f87254b1a10473ce1ca68a0d55cc79315962a9d8c0c39c178afce518f298f689678788cd2e37119c1c72b4a940a3d1ff7facf9630dcff7a08e11a5bf6dfe97f3e58c9f78e36b68444ffe3fd2fccf04c8031649cd7c713ceda02f67e7a7fcf6e510f95fcef7503ce208d27c39a43fa178fe6993a4ffbf9c5d6e223cfff7ed6dfee777c21d7104534028206489ba1071a122eac10c3998610b15d19039855cc00a09a4766c31e75491c147e8032a3ba098d334f2f8800df0a43504f651a71da2a912e2c1dcbeab8478cc89ead6688c4a0c5e702af3085f8e40a4b87dc86b865463c8418637aeee97b0c210457aa097b1a3687c78481b2444409c134802c91e1e24ff4848c323e3bd3d13e302438e3561b8696846a31a3a38f68c461cc789be77b074fa6347713115144f6049c650ee571a03030343dec0c0787b06c67bdb1b492bd6df30710c000e2ac071051ca739e7552d21ac9114e1a0e93770cc208f437ad316fb4d17c11f4edc41478c9f0872312d964bb5a8708f9f78b34d3c09e9c13ed27820d0e77bff7590fb4db6a9f43f1c2cc9b1048bf853aae4c8118c114750b44030269e6434aa409df4c6e90dcc8d3a66c7c472e9accb8d5fb991c48dcb8dd9869439af3dfadfc693395fc45164b1da70d2864d1bd69c3da38e25fab0017636a0b07162c39ad7969152c79cd71896142728292c931c53de1a53e6bcd618639e68d678628d2497b88635a7a5861a655c5f0d276ae8392f92c59a5183c7bcc434d09873daa4318339e737ab3474e6bcf6e8d128c1131a32982d172fbde5e2e2b18820d7b94f969b3b838e39cf9072c619a53358408b1ccf30838c798d6319f38d23a963a4f4b78d194accb066c7440971044d60790434e664a2c41225aceb08e4116a195528034a49ce94f1cb18d2592e1d5ca244377ea532784c32a490a1c59ce01f2d3292a04e64f4984698322f2394fe5b46e8a611b07915a18e7097bf0851e607bdaa084e7a11868c5f11e69c93084498f322420b889064ceab2282350429353d3a43e062564358624e12559aca3f042b842d5c17298ee32f4b20e20682d2114238854043106230e7bcca10f5bbb82d977d1304278220240a1b51b2b04ad1f78efabe8fdcc5fb6cefed44b101421df30242911f7021043fd87c70051f74c007353eb8a10760f4200b31247d8276f795fbff6c1ffed2fba43e296265e87131155aa42ed30398d40e63cacd755ffa6c70a6dc5cb9b998181c181e9076f0851d943167c7c4258b393b262e4b3a6b073ad6d577e0430752e6ec9874907349794bba0b4846074fe860880e78cc6b0c2863e8cc943706cbbc3e588951c785591f14630c9218dd9cf312c5e09103293980928327ac1c0c010afd378d39c8615e551851e6f5c308a3140610f3f71b90c341c701cbbec1931b7c3780993660820db0b041111bcc1aa8a00622a881916922432ffeff62751f8c2f809106184fcccbfbf87083220a8c206860060dc0e868c0e31a471fcb7ff0a3ae9fdaa1efba50c6ea3a6b77a79c19dc60067e06a4305432a0810cba96aeebfe837fb448df45cf63a08418b42006a61810f9fe8ffbc3400530d8000c7a6070c30ba258246a4c7d0fc7ba4ea8179ce60b8a985fb0e08b137cb1e48b15284880d205940fc5e6cab146ddcbe8faa8ce7ab946ddcf2e3938969df5ff3eb9a08e59eeca0560b8e089f95d90c40544b460ca05b4ff6fc117f36a81b6c4ad8e8a055ccc12756241c7821e5e40f12289b8821540e12b6882f256908338d25817398a9b0aa2cc39bf0aaa50c1a7021a9482282938cd29a6a0c7f4a7f1c993399fe8cc79fd6ffc4f7acc79a1800428b00205fa0237597ef142c109c698733c59be449de004d8bcbe09a4589609529e096ce6dc259832e7258224efc610d5c723353b3d632f819359021bab04395896d5c51873ceeb7761bd7431648a604f8e8ed5457591000b24e002b53f92eb93be2cfdb738595a3c24d011371f011d2390328227748eecd858e2f6a7f1e439e719810e1775cc7995a853c94514cbe2c2c9bcc6928b245f936de26286936702fc1e20c3030ef0c0cbbcbaf77e186e0fe4e4f8813ea2b77c62624830e44892de9fc6b2034ee67cf91fec40929fbf51bbea40cc16745c9def7c50d7e2721a4b966e0b3078b6d0e29ad9a2546e3164668b1caeee9bec235af460ce79f9cfa345490b0470800c0e60c181221ce8e162d28d461bf43b17936e34f2e52679b764774bca709782ca71244f63c9fd1812cccfdf658c6702fc315f0317d0401119b04206589001243280812f30d06160880b3ce10218b800cd057858e00b0b0059c0c697254876beebb6f53f93eee76f128a8f7d261c4b9b047da92cff0e0abdf72d974d8ea7d097ac5d721dc979b2eb7efe266dd2ffef2df1c6fbcf7a39759f0a595c4ad07ba18c75f16c3d37249c8d06e7c64a624786b4e1e41cb17270acbf4b5d4993051a596421834515b0f80116221609b86207576431270ae422489e4e28ebfb88e0cdd5fd47a5422b458e4ad03a813fff6402bf0b582ac120d06be2ffe6e215242bb0604508ac5062cecb07e5592971b730e9ba252c165986db1b431f938f588518aa48c29cf362d2e58c55a8a00ad29cf34a792ede7f2e9dcc274d289133a144aeaa805651600a05dca080141478a1420a155050d151c1c309119c30e1e4c7490e734e1f8ea4e581466fb7744b76089a401ecbbac26e7d7064bd08a49a00cf1463a8a67041350517531c3185106a481101293c290430afa0511c7dbab8f7cde5e27fb85928b28ba3c7fdd20ffd075d3811457ab22b51df687571f47c145e14178a2c545004018a2673ceb1dca5b87d286e1217519fff1268402581215188c01611401281f944159e78e3092a9ea84e78c18912cc90f3e5c871a36fad30346d9204830421e5e00409628da545de5c63906559a36f7409c71392cb97e3583601852632d004114dd4267654102003024d2a08dc2bc8fafb0ac53d9ebe11261d371a2d39a1becdfaf1e3c705e422c49748273048e692b11e50840788e0015170e5f63fa6850586fb1e078cf17925190764218e95038c38e01b79accb34925fcb8803c60d134a30b1c384e8847af9e1486eff535e6a4a4a8b8b1cad2ed55304c84113b0490eb333919e942a4fa6adb3ca1f7ad28b24e8c34489254ab098484f92b1aeddc48ba3dfa40f8ae31ac5202e824e735ebd0a0a12c0f7661ff6518d33ed7aad94a9ae14c595a64f1b118ac0d5ee8765aa6196f38d3311e42e4671fe93fb74a909255a9cd013fd568c7bde5cb317b3be9469467a51bc41e2c486d5fd557aadd775a7d67f5813dbe77d36eb19c75aff3496f150aa4bd3676120b06998d74f637dadbf56e35e29d3eeb94b71a63d60d33c7fb5befebb1cabdbc364fad6b9ae4f7a8d7194703e0ed8b4ae776fcd539b2dd5347ada649088b2147b72e495894d639ebbd733caebc6346ab50c47099724e5510c7f156b18addb7a7b37d9764633f5be5dbda7b5e63f6d88a0eafdce6af61deb9f476fcf01dab0ac3f8e659ad52cf6698e9532fd7a84dab02ff3bafaddf397719edaa1a559b969fe6a1e9669d6b4537d7329d3cce56f9e638bebded75fcf2df5c8afd38d6d4d3da719c63c5f62c334a6a94777dddab3ded3271368bdd3e6554f69d7a887bf2f5b8d8d1bffacc55f96316f7fbefbec46dc68cd5acf357bedddad8d9f78c34171eb5c57c651c27da60deb1ff51eb31ece99bf9fe723823f1a166ef9f3996adebdb852aeb7b514d79f2dcbbb66acd2ccdf8febaf5a8ca38453a2015bfd74d632ac6bcf6698fb7c5d61e8f9757912dc6cb6358f29c7346f6f766f29d30e72fe942ab328735d29715b1c25dc56dab8b6b57a9a5b4e79f6795a29d3ac347d41f86c1b63faf1ccc3d9877956a3d5624a7c5bc63fbfbd8de14eb5a75837e9373ee2deb92eeff34f2347338e12aefb7db3a761f4d33e7f71ce7a2953929115d29737d7e5499aebea1e3c8dfcbafe55b3b352314a96a75017bd5e0ccb3867add58cf3ad14d35a63cccb9fc616db195f5fcad47371e4c27073cd733147acc1fa9f4612dfbc7bb3cc53af61d6ea8b2bc6384a38cecb1a46335da9a5b46218bb34c3746b8ca9cedb67defbbabd174709c7f7f6598dafd679c5dba3fdeb1847099744b7e9cfeb1efe6af7facbb4d7b86d6354f328bed56abde38d95324d91a5fe9c94b99f93fb6a384ab8cb008c625a5671ad37dfac73be956a566feb39ae58bd1bf3be832377af0f930dbbd7cb9ac534ae7d3867afc49635daadad9e5bae6fd6f292cd5eaeddefc359ce30fb6596542f8e12ce0825dbf5dddaec7d1ee6712dcbb452a6ff67fb13577a1f0d671547094793c4b66b86e9ef769d6946926cdac69df29bb58a77f52a86c4b6338f639c526c37f7a896afebba388ef37e38ce384a38b047cb1ad5b2d6d9d5955a9b31cebe4b77bf7b67f5f338a697e7ba566a7656f005916c38bb98a6e5ad334bada75e29d31fa4ede28c6f9b798c7adc7a9767c328d5faddfef26c31c76a29d39dedb35ea669dd63597fb6daac52ba008ab3fdf2cd346feb77b94617a0936dcfe3ea6fcdf7fa9d7929d33ef2e46874d79ab3fceddec71d1c2c630ccb3eef6699c71b6bacee1cd934cfd332efe2ec55cfdf6e4b996a9a8d78fbc358f3b86259f37cbeb5928a6cdce6dafbcebede358d63adf433c547f8afe3dcafe518df7c3dd3489e68e5b9d9a8b6fbc731ccc374a79cee52a6a791ec14b3d974b57be3ee7dde7bdac57c298fa5a5466c997b967e9f876199f55aef52a65e1c43cef14a69cd56f7d55ea55ecb6886bfcf2b653a967a66f399d7be76ad7b8c617a67a57c5dd76533b23c9d88e48a3586b3b599a6596318cdf4320185e1b5f18d659f59af3bde59f3ec0ac9881572fc7c509e27129e4c60cd4c28d196a62f8866e35ff69a62f7eb757b2fdbef1b39cdc8cc46b37db1ead10f6bccd33993d9f6ae9afd30cc67def5326de39b211bc6be9cb9f769ca31ed555dcaf4e32ca598720f9453c4a6756db5acdb9b51af525c9a3e8b634ce3c8f9901cc783882d6778675cbdca77d7302f2b493d0466fb76d7baceb6e67d18e7af9732e5b21e62fb34d718cb68df58c56ca6a54c35cda34dd3cf7a8fdb6a73e657db52a64123e943abb679fdf9ec71ee71efb1f5bd9429597e247ad374e32fbb7a736ebd5a9a3e0d49de3c9b7dae3bebd563ad7b5cca94ebe2e6c64e6b4e026f3dcb76d634e6332cd3fcfd4a99963eeac491e3c76199159a15d20ac9c80af73d417b47a339c351c219c9369d69a6f6d32acff277372e654aee12e7b0eb2a4ddf85448932715886a38443e26e1a6f0ddbf4db1463f57eb994356aa566676585646485ebb992e5c97a72e41747094784dd72c5b2fb695ae5b9f28b712953d28b75d31fe6519c3f4cdbec3dcb4b99feee9bf864748564c4df2b5845ad5cd75e211959e1ae86a3840b39a12d18f59ff32164e5fa2c2f2c2e5ddcdc1562fc3f827038ab2d9403c2920020751c491d820802840e2b3dfc48808fbfc30f2c56053fefc30705f4d077e0c1d4c30ed4931f478ee55600f5a1c357a27848400e94f3256e07045cccc3019a8c41650f2a3f9b73ff53e1ac5a38e84ab9ea7f76e87125cb0025b94b2005a83f7a883ee0ff810094e50612880198469e0550e90fceea89fbef6203c752c30f1a80e0c1713f66e09a6c930f01a09c8fcf1826000096e8039121e57f5c7694de0748887224c7954d7ccbbc520851c11c216fdaa248c80a3c20001b661a530043a6053ae3ecda4a31172182b4b000090288951f3e7eb07ce881871d14a043027240c001542a1c0cd08300370c400036d440038f1902008039e7ec01448ed98325890c5ed830d380421532b3f4800c421550f9634c1f11e4c2fdc9ebc700ca9c2218847ae8c2bf739b464076217a81e80b1770505c30e712e58aca89092aa650c5a455c2074c9adf6fead5987a633833a76805734e51132a30f124738a2830a70802a22bc64fbc9953c4c54f81e8c9f889371f05a2136ca4f13381c889ce2951017354c0222a60cd9cd3028d46a212cc2992a28b7f5229a5608aba280960aaf86c24dd87210ae78b23981265aa081601cbcd63e249b8f02528829f084210893094f9729c98531482ee734420f8738a3e20a2be39451ee8e015e24853729939451d10479c1ec513778ba9b5c034b5c926383067b5a94d92327f4e51063030e7aca74d9244525c608a2c90c5fc312afb88597b4cbc49bfb13d738aae6822025364451533680cbf930914918421aac687de2e479c1e8e3644e61455a024c7d3488a484ce00e69fc48faded7f888e088b341e0b44992376d9c265bb83d9111e7878f46badfdd5360a24ea61fbe4b9e3fa7888a2972c2c9bc7802a229b09af2454452cc298a82f4454231674e111425b94f738a2440a2429d39451130c27370ec29657689e4c9f148bf019f20fd0f288e47e61439b17dd0c71b0937c8c18e3ac27fd183320d188d6c6a664e511373fe90634d6a46679bf64715e9a22fbf4762078939451078c0f4e458fa9b4604475e8233df93de8626a9496c929b244b8293e4243ac96854814623136ff2ab051a8daa051a8d2ad0686481b8ef89193f1186fb1e72144193376d31e6efd28d69147d378de2ffbf8720123130dcf788a8af63aa4b72eba4fa3853a6fa381313532d4cb54874a5288d4af99f8b5160b5a8189524488298994d38198013483c314353a042a88d100e4261a8f4a0216a4344454f694e312562e24311135041a24517c2400a03e9098c459a731621522274830842f0810fcc59c50426404514524841c60c002c62886a0161893ec42c227eb0441f662a0ba023540022a60b5ae69c2cf01182992db29858cca9337b8a983be84431fbf6e4c5a89c0ac471a79fe3844ace12395d8b35fa466bf479928514347e8de2bee78327990f9eb68f189e4c200e9369c48c5139b2831cce836469040773f6707b1e4fea6cd26f72cbb22ccbb2ecde7befbdf75e6badb5d65a6b6badb5d65a6ba594524a29a514ab58c52a56b18a55ac6215ab58d5344dd3344dd334adb5d65a6bad73ce39e79c73c618638c31c638cbb22ccbb22ccbeebdf7de7befb5d65a6badb5b6d65a6badb5564a29a594520cc3300cc3300ca39aa6699aa6699aa6b5d65a6bad75ce39e79c73ce18638c31c61867599665599665d9bdf7de7befbdd65a6badb5d6d61a17f73d49b6c3025bdd9eb7f6e31fd72ace3ecb62f39963ecfdf7d5cfbb99de2e7660b1ed9c71cc3f9ae1ef525be98e2b360ccbb48e655ecbecc678feacd87caffe6e8f69c7d8bd1797f2d7a31d556c166f9cd59d2dd65faf1986350deca8c06633ac2bee94e79a7d56d319163b28b07dded7acb5d53ade557b98bec00e2a369d59ee39f659d634efcb7096719470a51d4eb6aa61bd5eff65daabd6629ee6764c60bb3dfb4dafd638dffd665dca349bd18cd831c5c63dcf668f61d5b33abb5b9732d5bf525c298e128e668714b5d27cadb516cb19a6b166f1b5956a9b720ff74eb756caf4baae4bcbc8f2b4238aedd28c6d4e717669bdb7fa247640b17d56b33e7bcfda8e695df324b0595a7dd6db6af67accf3700434ed5e4a2dbed8b51986613467f4eafa716b2b563d8d5bdf773cb1714f77c63bc65aee5ca3b59469a9f4dc58deb2c926c3438466bbaeebd2384a38264263a035d3300d6b4d5bacde5b356c69e7d873dff3a7b3ac5f2e860dfbb8bd39730df32c7f5cf3e45d2119715dd715869cb5aaaf9633d6ba529fb3debc6b5fcdba0fe8595aa24ee24da5949221306c9763ea35aa358bb3ebfdbd2efe41d3756194a3fc83a68bf11736ec3756b1c6f9c328debbf61b8e7a61dbbe6b98a6f54f679ee7b5dc73358e126e895017b68b315fe9a5b4db8d5d4d31ad63c3bce7b46a19f599679ef65cd87476fbcdfab3bc772fdbba85cd57ecc3dc7bee554f6718d3c25633de5d671977ea2da694fb9fd1ac908caca47c114d31ca71b03c8161e86f16b6abb16b3f0d53cdbf0fd31a8e6773d644080b9bef99ddd8f3de679d67ec9b59a15991017789e622312a4257d8b0de3bb6be7e9fbe159323577a9f4b75b6c246b16633cdda8bf3f7659ad71a08d1b1edda73adfefb76b61de39fb681501536dab7ef59ef59db7963b697321d3ff1a7b6ce755d973fa5489aa3da522b4254d8acb5147b7567ebd9ebb5ec466b53d8bce6d4cb2eae976bed69a691ace1fec4c3652b850dc35453ce7dcd95734ffba2b071eaf92ccb70ff76a5987693084161a31fa59af3edf9def1b6f9095bf7b5e79ce9ba6dd758c742532cae5a4669ad58b317d3ec6acc6b5bab18fbefc37ade4ed836f6dacdaaf5de775d1a470907146ac2566ff61ed62eb59eceb4ee736c1de3dcd3b4ae3d86693ecb726cbefa8af12f6f5ab1a6bdca844dfbba96b34f6b18eb8fe370fc6eb96b5668566e564846564efbc8759db6a94a115ac266bbe5d9d634ff3c6a77f65daf43b1082961bbd8b658d53e2ddb1e96598da31608c5b1615fa7dedbf87a2cbb38f3fe9422792004c7a65dea658feeac734a3ded29e558104ac2967d35ebcf6a6bafe6f67a161b4108099bf7a8e716bb36f334c33d2b657ab2e4a8735d9804426f6c58c772f6798c729c797adb4b7bdcd8b2fce9ecf96c774aafc530a62d08b5b165b76b1bd78efdc5ba6236c36c6c5aee9ad714676fad47359a224b71bbd48b90946ddf7c79f57cf518d32afe8e5cd7a540d7a531cad14b812c77d7d8b45a29cdbc5fad79aebb3696e2cd758da508962135368fdaea617a5fae2bc6ec97c666bdfeb4d799d5d9cdf00ac98895d34812b9aed348f6ebe21e080ba1b165b47a5c5b8cf1873f4d578c72f4631284ced82aef94e6ddb1cf95f28cf75cd775a5caebca30cad19c2aebf8892066c6e63dec66795f7b7dcd377b6d8ad011367c73c5acc7bacf78a6699bd3ae8bfb4e32b2f2f99d92efebe25caa04c97dc2aa089541961f45729c0e2132b60f6f7b7bef58c51adfd733c2e6e99a312ccb1fd56aee1a2b65aa8bb0d98d39adf6cb32562fc79e089bde99d719ae5d7b98663dce7094700b080d61a37a671df33d5baadd5d33216c9a5a8b59debfbbb37ef3f5d9a49c5010b68b310d635fcdb8c676fd7694cd67eb599c61da2d6637a62f4f0808b752fd652cfbeb75ffb26f40e8075bbfd766375bbeb7c735fc75112ca27d9055add56a2f96310c534da3d57aadb55af5bd5e636e7deec1d6354c6bb453ac77cd38e5211e6c9863d8676bc770f79ad7ed0e360df75a77ef967a8f5baddf9b900e368cf2bd2ff630f5b08f677c8ced669e57ec35cbbbc7b34cc5d8327b337bb9b598a7b5a5be947d36e9ba7c76795da4ef2b353b2bdada8472b069597f588669d87e98c6aa0f63c31a736ab14fc334ac720c071bd556b318e639d62db6ab2d65ba84e74a9ead908c585962dbd7e5c3d243fdebba2e8da38443856e60312cdf2cd358a3f866965a0cb35fa558f32ec576e69123d00e3fce070c438f6b2a64838df36d33edd7b35757ae597d8d846ab06136ab99873f5db1e5f66aa54c7dc77668343a9625a99142606cf6d36e96b3a77dff387671e8411c0f34923ad7457fe8fb68e22a0d4388061bb6da53cf568e698ef7c54a99f6be7b9711c15167bbaedfc91dd4fd094233d838d73edb9a663dca35ee5a065badb5621fa6f99c75ed5697320d51261ba28e5c9736231483cd779de5fd75ec616d2deda54c7f6ad078ca60b06535eb9ad7cab9ffb09bdd52a620c795e412bf5e57be22f4824dc374d69eb631addaf3978fa5a6d9769784bed83e7f316a3d9cb557bf5a7b29538cd64c5f8cb238270941d92cbd36c3eede14eb5ed66c29d31fbe4f37bbaeebba18755dd7d5c5ebba391481900bb69a61def5acdf15a3fad25bca94e4c1e40e37fff8c787bb7b2012c531c551c2c5845ab06dcfebda57b9a63df6ae8759b069765ffd699ff7c76bb6bd179b56b10c7beb33eed5f36e26cb7f318e128e4968055b9661af658cd3fcdded331b5201feb4cc79f79ffdbc4ceb350598e5fbee8ff28f673cb3f409f6bcc69df3fc693ddb0c0ba160cbaed598ef977ed567d8864eb0797b631a53bc7bc5bcaeb18b4326d868df9ff62acd59bd996b9c663b54829c7346bde5b4534ff38f9632bd389f4ca0ed62c3fa57f9c5349db1cf5e2f6be26d481f341aa90c089160d3dee59eeaeabffd5ded650dce8446b0e5af568c5ead7dcd1657ed99003f924b1cc5eb32a1448ca384f3425c6c57eb1ef5e8a61ac7f0e779764322d838ef34fb3eafbd2fd33efe69a1106cdb569ee1da2ff61c0779d1929e872c7928cd64f9ad1602c196694ce39db1ffbeecab9a89137d9829671ac98f4b9d469ef50cb5425af132d48a567de8031bad9fcfb9e7af56cd7aef339a9007360da35ec61edf9b537c6fad43421dd836ef16a3fbd3d8bbd8cd59de62b35d7b58b759fbb887697f67425a6c9856f1d670c79e7b949724a77160d39e57b9ddb76259d57663a20fb99a11096d60b3347b6d7b96697c9734b0ddcf7ed8ebf8cbd47afdfb4a99624a963f031bc53acd1ece5dcb1af39f2f65ee8395fad0db5a08039bc6bd7cefb733cdb7ddd49632c59c37f9d269933e19dde5ee5ca5f988d00536ad52bcbdaaddebed6779f92db0e9ec699ab6d4e3ccd37ca6b32c36ce75c6b3ed3aabd7722d5f2cb68b6537d3cce66cedbd7bdb2bb6caf3e7b9d737b631fff15bb32d64c5a6f9aed5cdbdedbad2baf7af62cbd85f8cd9ed334fb54fc3a54c2dc7f9a03cdf71adc04677aedb736eb1ae65b6ef52a67d9fec15a2c0a6b1be5fd5d473acf12cd752a65cad0951b1658cb39de19b39f7daf7f952a67fec976664f971c8c996352db3db7a5aeefaf3b49fc086bbd6b847f9d555a335dbd0149bb5d9ab3863af6b1fa6f786a4d8f0de9d67ef55cde358e71c8a62c35bc36ec61896b3dd3a772442506cfcf29b6998e71ad77cf35bca34dca48f2f4590ebfb5429e9cb1a4d8702a9c7a8a473c8a63dca9019000080a96900231100202820188bc6232291542ed8853f140002539850b86648174a14298721648c21068c01000010000091915000e5ecb0ff4626970e83086812d5cc55631510672c97e748d960312fde45f95a6384c0ac0088dd687bcf47079012ce4d4f6665dcb16cc35d9334888da27cb7a16ba7c404d77c9a3acf1991f959e8baf19717880d2c03fd098a86f334573789d85e00c4a7dd01351d402ca34a11814e521a1184d8f6f2475302ae3a5120ffe3d299b767b2148e0229eead4ce7ab25e86a9cdd29fc09fffa8a8ba5688067d80471f2e1e3456f93c962dc3123ebb34cfdf18b527358a985130f95fd2fcada79c18749e33e9da47353c6a7fa9492213d26e2d5eab848e5df822339254f629d62b2473806d59350d231bbe9637835636036a7f4aa7b53820b4208026950b9d4ea0e9fde8268e7228c24249a0770727cd47861bbb574394fee7f2d2c000f2e4afc6d055a49531e3a157a5e895af6e0de6735ce4c4328e0d11cf7fcde0c10e9525126cac0f13292edbedab9c6ef17643fe03150c9408d0c4f8b9379280529187214e428b8966197c811a6430b9683bfe0238430e88e74b575c4c39bba9d1652ddaf74a0afb411f495351b4121e83bf7f72b3f306de94056ff4971874ece7f954d3b47652d8bb533ab524b9522175018174ae0fbc33bc087fee32f7b171420ecda3a95c44babf6d64003c0fafe4227ff15df141fe69b09db8c237db3f1421b97607b49fdb111c45e070a9a33b5b7d55d5518bb41cacd6a14510d81bee98511ab3e6950c00b019560f16336c7553b22c8948234616446061d7c9d12db0c58688d39dafbc7b4d03a6218b6f97f960b2f1a0588e103bebcc0c779269a6af5fa6424b565d7eccaedbe8ccde1f9215e753f4612b84197143ac62e828150f80bffba08d46c03cc8b8bbdb35557c30665b9a35815ede81624dc0b3dcab715ea6f2b29830ba6191ab78df43571a81827af758e6975da6db286331dc65a116e90b3d50a85bdc47d75a664ba268928616473c768137aad3fff0e6b6f0afb39c96fd8622821402e85112879723f62de646260d41d7de77c623ce88f250173df3ea71f9a2c3e56ad1fa4ca93ddd6b96fc61a18bcba24ccea1c62a7c4e4e52d8bbf55d2d61bc562b1f46c40806da0b3b72adde8f32c24276d07120f929325d64e50808642ace6d9cd71c370e4010d7a62261b48bf764a78d677d73e0e8a8f96edf076e8ec571122d7ca7d2ca31665961783b54bd6ee53a93ccb2a64a4124ce821c428221e5c98068a86273fa8a9b999f4fd82d9666759cdc1c9f4446d92f33dae1b5a422cfacfcfaa342ac6d0a3f3a799296b8afc99e214ebb6963c188baed1331315aabdad10d860809b4f5ac5212b075b5256a52b50a9defb8e375bdffb9f380e22858f4f06cbc6f6e7211ad3618d31a6488b643753bf9d682a66a3d0523b81b326b531d41b3873a08483b2fad705c9faaabd45d61fda12b35b6254a207c305792098b0a0c71b6abd550e9cf587c29163c8cbba28e16e9568b6a6b1109c86bad23bc6847ef9a8bd82a9b8258a290c478ff1eccbc4f64394c408497b92ad83a6e23695d6e1db91340b866b2e8379320a8311044be961c4471b1734a24cd6a5aee878bc1bffd921abc6d69765f30550ff6ecdecaa76352efa51b60d63dac80aba621ab18f0386c8808016a09861ec36b52236d6c200c42674446344793b0b23d4c083c3b0e958b769955e10e3c3ff39e43b090bafc3764aa81569b85f18d0a0b6563b5d0724258cf80ca0e1557b3ac2300f2a10a09e6151cb898952db4f38e8a3dd9b10f8fe06c1385c513f9201a3a7df0e46e087fb4b60348383e0368df893215976d1475397712ed209a2e5289d8214723e9a3cfc93328aa293b19e14245d2d3ea9f243c727c4d6f7ae408faafea1c22d0d0ecbce8798ce9db0b757c26fa702ca7068b2d2021554aa14709ef499543a41827438918f900aff2384f4263883bd9906e0af8607d6c2dc5dbd47f9f408048733c9651d846172d04e3991714fee580c56053200d5ed50dc75a0b965539aeef74a698f7912311508924c99c8ec973d0301c6360101cbb23f16b460f309548e2949797ebf22e132df47471099ef79e8082ef383b43df42a9f283f213884cd69a0342b795e85e423aea08bc00e4c427bd191272cf4b89ba5d9a12963327b61a727ddc89a687a7e304aad8a1fade59cb5deed1266f77e9d70e29f150e261a419b489ef65a47666845b0e2c64ec20d6d56807d01949259fa32db11e28ff87ebe268e3bab6404ebc11823c5ea914aa784fca39fe9d790aa961ac61e8cef6e0d0cb203a701a4374c902c3666c82043daf577b3367013920125386e6b774533a9939f8b642b3021f811ca6433cb9dbc4212c0ded21ec426c840cb489427db4076b3b194757863ee84657abed4aa09576cd1474640601a4a0e81617be60c8268e6917be744da41ecb61f49b7b669ab0ffeb39e9c4f57a4784b5ed1622f79c5c2e25d8af6019dd077cc2fca54af7b0c0895c0b8d35931410f4cadea0174afcc78222203bb69d5e9ae5fc105389c504785933dd7e0977e64785319406be36695c04f62afca8b2d7631da6361cd6b7ef66d88d0fd19154fc84139b77b35a31e8ad9c6309fa680125c7c62bda8f8165937f2407d435328d7a6c2d303ab03466e538bbd0858184c68d4961c8e7e54f82dbaf4e5db0712144f457c7e5dcc9b0cac6217cd8c016b4ac13871cb095ac021eae0c3c5e1319c731511a55e271a56f727c5140d01dc9a65c560a10e1cf0d4d3317fc638a44f7fc19075108c4a08a54486145096f1054203988fbe0fbe5c1849a943a95a17e233b45d35e242b68e10c91315a80b74c8e333fc3441186bc5bc6c43fa8dbebbe0bc275d4bd80ea688b5efb55327dc0358b1532bf347a24f26406e2c13f719508ee51f4de7a2503cc229dccf5747cb38b3e1af2bae76ed836e3a009dc8ae5407c2ebb188ad1f4fd30150955a1e6188ddfbdfd44a7eaad10d8664211361ffaf4b93cdd17cf47606e1ab7525c33c0fbd023c8ef9c1561f06fce878d37059a794f263bc913594a2b52d58fd19aa6fcaeac5727bb02d7fca45d6bb132f62b4c10d36f6f107ac7bb11ea4f4e7ba240f056698179c0efd5e3d02d19737c1639ab9b0ef2d954820ddb15ec0dcfadff19dcb4d9788a237f5c87e91891eae3cc001155c23917b6dc3ba2b24a2610961a584cca1af093747951411dd1d2d11b5e6b1a4b59869a6882ff49f996e1ba06f35dad6c4a4171751ede0578a0915dc5d5f09f60e85d7a3570608da68a0cb68c6510d64a3ba3c36208495b08b9ba7176d9611aaf4eba9b43dc2b7c1b84ffffb2cd21fcad55c876f9a459a0dbde3a249ea0f19c9823895dcce576523b310206a5a3f08892aaa52929611710fb9330f9c4e790b8759eb7fe003b28824a4103a2429c7a4d9c75460c7654ea5756c3c021d0af29103abb40933adc2981101dba2e0802acbb6a03aa1c575a94c874e1f19e7c30d3add3f44f52c14e7c6dc967bf64cb2dfc30edd7b192213e3076e8d1e87d314ca26b9c83e04abb9409703823a530ab58446b28ba84c3576f6d9516d7da689fcce392999f90c08f5fba6508bbe44ff22b026357eb68edbc514f2e62d74191bbc14436d5c0f93fc03a3f670033d3c15852228f83f4679155f079c8ca6c0246876dcb6402ffd447db43a58294d0d5cc1752b9f0962804b8224058105befbd8459ecb3654093e7894cbae0c167d012290bf16a283c2cdc8a3435ea613489e701a3f9ea47871cf74937b79a1ff8bfde88de3ace2432d875ac208e320ed9c194e139305bd4177f45263a54d46916f4afd5f9d60a5eefcb42ea59c45ff929c0df6720d1d1ca807b5e687af689e744380e7b28a25c5199cd28b4d4a9700df2220bb921c1cbb5cc8505c07d157921f21cd7402e2c1d53606d553add280b9cee292d5d9edce1e691e8e95d6e6f0360a962a308cb9b2347740c1e3940488508cd37e4d74e1d21f5be31a48b2624adad1800295ea14a4b98de56ab80309efc28b12e59d45c46d1c40c4eaa5f7c16b34840027750b52452a4f020b7a0c8130166b077458c9d90d2a429af2a69f9fa06cf57ad0661e1ec631988fdbf529d4e6e068ea40523ae10de8300319e606627abd4f6332c5bb195a607a098122e4cc3fff96222300406211451618f819db3f43939f94926378456582918712425211189bcf72cb7fb09334634163785aea9f503740e9f1d9362c0546d43fbdf1345494813d8f1b9760bc0ce50d71f5821d0a15dd7f8181f77082621f4cd85b26af8afe72a66834b7d616e7e267146cba80220a9b9f8d6b155c62240ee54bde046386add6d1c96c1f38745014514f65fe972102559ceae99d91ad77644765865d0c6c7423cef196fbf101f8784094bd7d5ae43c70628a6956f7eda97be14039faf9afbc797740843354f2da593bfd052976f1a674b9edf01ce618f537fd0efd96f302f0e88823fe7ef985e3998df20bb422d80349a44ddfdd82db679b1d3a9995c42311fbc595982bc9a1d8438b3f30022f90102777f304ae3fa0c3ea862ab293c4fa79fa4e686dd689d41c3f9f5317865b209b0f875f797b3dd915757a905160b891e9ada3dafeeb3a14625eb50f995d44883c1c5787eacdd58279d727905a373d407c8013fd1cea57d85c8b058d3f8126a7068148ba4fbf4cf14b38694e9843e6d8fca16f3cb5efb0d7c376b0c16e7cbdefb0d7c2b428588589bbc77eb2fda67cd75fcf6564775ba3fe8f07f3870dfd94a83735c26d2692de1c214627d5ac111347a30a05e7f8540d534015f35f6fb34b2760a6f264b39c6dee29ca156a91184c585882912de0b7919a1fe4389fcd81a3a912792b4808974d2709d68492c2f0f9c9ca6f6ee6de525c0c2eb8761bc564099b9c8d00af593c447038b3e2c12fc1481d71144b243b7717d5a8df22fbf84758bc511cdd49b7bda67b8b59b79d0aab44dd59b8a0169a9ed19a3fde0293fc7f8a177b937bb9b8328bcb5b3d6eac1677efe7e8ce52331ce4e74b3ab44ff075d4be1bbee573b3a9a37d58ea38e4b0343d374a61cb509483a28b99ad35dc703c98bf77ecc28193882807e0878b463940fc9bb42a675d38eb37d2cac6ae0112a938a6128526d71f4ee61f69ea435775933f5eb56dc15ba1e0402c5519323c2855c310388a525904f87f0e8d1fb14fb5704f0bdd895dd0e7631e9eeb96ebda8f3a76b0e6a7e6a4c43ddd24d3e70f346edd4ba8d7c1b7a3164c1f11dcbd98cb26115e17a8a073c51de777eccf373baacef00337d4ce7f5592bb01ae003c59b0e9773643105167ec6719f55db8d85d36d0a4304871c9d2a0633e378e7dd0ae973b927972baa33b8be82ae4b1fc41673c1f926ba37fc6d5a9c73fdb32ff247ec3578b5c4b625e7c146a1c10096f205c5cbac925addca6bedcb29c23058569dea5a54b8b938f99b19393d6eb0bfb3a49a95f87aee9610eb5391a47a11fb717de3588f4e1c38bf4ad935b23153163a3e61f7e61794e222ee524f515db1a277df7e29a1d0155fcfa2279c0fde1def62fec0a4528b7035d7e80ac0fce00b927710bf82f5bbae29f66062a71e4d93bc6ec43cdb8f2567e7fdf308e4c96c6edd98e585f7aede30a5a5acf6041fd82e1fa7ccfb8dd94958b9f967d5d68aac795877b7122edb66c054797a3b6e80b582db8517b1671cf689ee944c633af54d013276b9445ee32d01020ce8340357e5330b4605b7ebd4607fc0184a4b7cc34b6d631b8cf92a19936b13f63453ac559030563a8c73a37629cb9a02bcd3bf8e0347dcba7b44a4e6d308de92f29d573da71bd1cfc09842e1ce7a42bb25b1ebe1da4fd2c3190a4084e2861b8d25ceb16c0cbe6a526270fab228a12ee3dc19bf8a07f87bc7a3e7ed2f8cc1c2a5ee3809e400ab2073d54ffde57a0fc1c317b600f06af149e16ff78e159c6e654bfe3d035ecb9ed6f55d456e385557a5827a4a866e77904d7cb72ff274b690ebe9a4e9d7b5edc757f2e225ae4e1a700e978762ef910d8cefeed09d6d19b851229824d326531c413b30c78b84c889cf4b9810fd5c348c32f4002269eeaa7c71dfbd573890e11f9dc706c3401444159b4306ff4d539e0babc90186c7845377953fb11807016a570a3d6e679ea5daa71ef085fabc6e399920f937bcb8a5288aff16c4c7d90f1e166e09c18d484779f1460aa3e37259908d20a08c2416eaf85f9bcf324685f7e58303a2f390440dc1d01db261b8242a4c0668b7b874da5870f7abdd60fd198112f1af5cc7c4070e3e8b4bc4fb7cbc79f4f47e2a3a013397b2974d165de6e316af0b223a79f393d2ba99c035dc42cd46e8c83cb65b702465847c95fc5c6f43508bcbbc3f8ca76df4885b1d7084f3bf1335a0531a529eb2623830b9e175f8cf83528d585930c9e9ff1f8719998cacb05dce4f00cabb595bf79ba39285c898330c58fe1708c9850b72ddc5b7358d40cd41c9f3ed7e9e41b7d3bb17a52579aeeac3607b3ead4e769bab4b161a5c5bc92a15b125b6978ecab502924aa11f772763e0f653718d3bb3f99bd454b552bf6bcee127af9c98995665768ed46bf6b12bebb2987eb674dbe5c7b554ba343d3dcf7a9ec9063df87c739a03b6fbbb57f727c33338cc80e028fed249779968369d6d0ea05e82d24fc36d7b29bf1b7c8ececa35f56ac8bcfe5c753ceb4b0de210721a5d97afee6e2ce78a1e3953a68da00a3077470f636a25b1723937998f447ee9c0ec3d3db23823931f4ddccc6039635dfc3f43abda6a8570cc01b21280d23f4b2d210d2f54663f88b17bc7020db1fa87d0cd36b111d0bd9abfe19e43e9eee4dd6021260959e180abcbda852e0d1dd9a193c22ef908f4e2d7d0a718254a8bfa8fa1084ade667951e911bbda934d3d37be51ca7127d9f4aebee68d55ae34cf561828cd9a39363f7e24a911de707c4bc449f827f14c5bab8d60522fcfa5146ff52dbdc6dc15397bd4a310880a643619768ab09bfda6eb82724c344315b7bdf5b7a2a716fad2995214cf8c70135dd6881b3990027da5dad830d02eab9c2c889327b8610a2b35728b5b6705b71d75c401cf9a837fb851e3f98a4b635e9146ed4b833efddd86fd0688364b0de8723d0d020e5b6b057bff0a2059b7589e6fe83c71f9dc7a2fedc80850c61da7d6ac805c046676439d9727f7d02067a740e8b7af303173a9059976dea2f587c11f25fdebf7bf00810a5dba7916b20b1624dba6b5f7f41208f9efcf2fe2ee0c28627d17e2ddd058a296cbe4b5b700f1d77f0dc3bfa72070c267009f76deb2f547c41f358dfbe73c8d171245aad8d27d810624defe05d0adf320c6ed66c73a5adba6c13b1097a2d686b6657734cadd278429aec7577ec6328e38d71baf76e8937e0a300acf46dd223afc1895378f35d6977fd0501f2e1cf7ce75dfb0123f4e149d1f6fa742970d18b34a75bedc3e7e0c71ff2ecf76891f3c083116659dcb7a7ee8517a5e8e6b1f2e6bb1f729c51c86b67edf10b64d8c49ba413e04ae38d6e0acdf4b90567fee6ce99f12ff70f7312d8bd79f78063c690aeb2a634c4641c7516f7d403f021ded0ee238b852705dcba861362028a142db40aa5fd27e933e840e3860fe0d6275b638801b1fa74955e547dab085115612e007c05b2813ec0e13cef5b05dabbf93d35f35e5e5acab37917023ae5d5ed279d26701a1e46efc9467b561734453b5d8dc59d43c6d23eacdef842a0b527589cf7609e3b7fdc4e5c740f4da14e9b85922b34a88313f77ba6cad0204e420f2a670024ed6f6e5ef9409957a89081ffd1078c6e1e7f3fc0685fa6c98ae6673f9117fd0625087bf6a085df8b7585bc218931b4cf615ced7b52988fba908da53e614afd79ae97a4f203e9f047c63491bfe705afe935a4faf74f119b2e2ecaa21ef33bb90aeb33a90ca739ed534cae919eb21aee60fa030fbe3e5ecb01ff7a1e2001b329fe8b1c69e1abf9e04c604000c68b6eb0ecd08a4aa4417d19626a6fb587462e615ed39d1272359ca66e094ccfbce51b3c93deace0b2aee840507260de6aa8c1c1abbf6da2bb008f0a9b2d9f2eeaf7289e26d5e1a551e657a5598c3246505aa9f098bc8ed29d71777c69b6dff1e14a8144891414496a9f64e837dd9ab5c91cd668564a9b23d6a3cd698639aebcd91637f061c0ad8b13d8a8227c80f69d7a6adb8b29f260e3838af68b34a3afdf212a2ad468399243adad16407bd7a7e766865a7b4e418f6a37af664974c207fcbcf19a1d9ef372e09906fca14e66b1a722143fdb443e000683ebe746c418eac78b72e60a20a595dac7ee61a8b4591c092803f56c1b96eeab6bc7c6b30cbb5ed1ccc26848e37f95417889adf1cb7500d43f069ffebaef2cd3cbf3fd773cf744f943d2a9ff1e7587e37f4d1d7ea78ce94ed85a7e4695b428d00822da2007c8e7ec8d00eb3167ac6fb6902c1e7b891c12f4435cac19e82e1dbad7c7b17e085a0c32c89ee072b04e08a099d41fc862c44322bb0529055c624be98466f152103869507d84c6d23fbfee3fe4d245d63a4387a01b68e0806e7e199cd1d847ba5f0d1c7f2f74cbc8c42abc98d9e5739f125b3ea298eb0919a30a2c2b83d1d7867ef4198f984c00d22bab11fd58199e2eb5fb6ea39ce10b8750477f1a82362670fcadec831181238784f852f3787f4aeeb4fea560bf78376d3405ffed1cdda13be0439135087147ea2c3ed99d2a5b987f0af60709582221fccfb010b511f8622e9c1f209b2811679c85ed6b233a5b1bf1e6d2689a0f8d6394addaca3d330701c31ed5f467ddb3554da77fa93a78229c5171613ca6a2802999e94e92a24dec471b6b886617afdd8485b1d50923cd480943c9f9b058d00c6d161c2fa6104b3b1a42208ae2c5b5fede28460792ba5e5f87cbe6006df1714a8a2667f44b8349cff2ffebf82e024f8c0a92983417173b467d20c4bbd691e1044bb9a891cef589ccd9f18c033220f7719086566f04273237f8ffb54852bc333849916fb5b2484b778961d43616678acdf8586ec301ccc4c1042019acc98f8dea5b74c09fd61ab721ba12d97e2627974514b3484dfbf1a9ef81d0c4e0388d6cb4189909ada453ee10323674916199dc3b767e98efc2da8c8d7000164dab94a3cfb03589f75387569e8243e6d9eac299ec533d8a9d65d563bda15f80ac67cdcd8b3461a6ba9d93a57f4a0decf2834c82badb28918116d9f531a423246fed06c2a6c1e2eed07b31d0422c288edd09d38206d92d46138b31a614422bc984d007274faccde7e65dfb82a4b7b6854f159409579868789f582964a790d8f26883a512f85d780c9edc6f1cfbfdc285f0f791b0ca129da6e47d0c6ccd3be18be9f575e49ec231073385f8546c59f8b39f0d297049bbddc2bda36c22e409ef2a7932c330c6ccdeb16adebbc1cf1fc152640d5fa824788b32e71ec10442f2938fc6be398dff7c7743ca49b69b153adadfb0cedc7bb06ce08d20ed0cc2fdf581a8377dc9260dad86e5d3195665283f8eb6fad3ac369390017870b949fac4692e9f84dc07f280fa44fe5747d985ed1ceecbb70cf95d7de5c23c3bc354f2e934f2019922c409f84bae1915344e262a680fe7e465de3c305b1ab6fef46410339b141b64b9027b7e049a7cd08e37774168228a636f6c3f85b08b5d701cdd2904e7e71b93f90a2137b817f056edf67f41da976c4064c5292a7578c4e2c96a6c3214ed18f20f3efd6d560618a45dd042447436a961de8959a613a4baebd969b1d2be078cdb9b6196b08179839a467c7ee86363ba8f0bca2b512cafaab96c007ce6a6d8c84797bc108679e5d3e1efce12f75f881943df59fe654b32b798db1bea1296d7bf337b3621b5424989457d32713797883a2528c4d4a7b003150f6f272626dcccf6cea01b096eb4b705df46715d57d7a264a03b526e99ad1b7ffb9fd682e559235ba96e2d128b594e50ecf46c5b55b49c20d9644ffee444131c6e2750880e3ad082fe8c1056440c136989b530ef7ec0ff3be1ef196267f25b001c96578010f4c6b184007700ef9b800f2c1ccc898386f47d0d487a162bfca293c7a5ec2477399de68cc49b84ae4c639e2d0fe7411f1707130f9f9e065b8f1fa44b81c016d6e74d04dfb4357d8ba3d73b1f161f3b53d7b8864b6a66a0986c81a9cb84b892055d7c22a943dbec0c6e50c125c28909f03bc4faf8682c05f947f7983a7416ce61da209cf82f1f6b80232a4858d0d914b7d2f8fdd19f8556ebbd548cafe71ee0b93b1dab81fd6c4c9794410bcc6c6bece4a48ee3aebe9d79393ea770503d5dc4b046ba2e704f776b92d83e143a7504d70ca6c4dc881d7bf93dca4aa07675dcb56aa260b973106680a1c795a9f4e059e9bece5a58a50220568dd3fb47421557a967f787af298042845a46ef4a4f851a7f87c3e2be4db9bcc216bce559effc798aa5e4e9376b7856d8e48b7a3acde919a45d3defad441006bcc162057ec01b4d45932f347d30970eca5cd531aa927e882601c9fd24e996c2a634c06afe4576f3324045e09bbfaa1e8655a7860ee7ad41c6f3f1184006e77b3b210650888d0fe3af93f0869b8a1edc029d32c49c7c4d23f479f56130218aacab1ca804bde2983c1b187bccc43d1db9514dd2e9f828d962a66ad5e051632ae087f768705b9d7a3149a433bfd37066c0db86efc741c9ca790ec98350dede3ccd1f7a53f4f1331740689e293337aff105b9a0e65a97732f68e50e0b25d37c92281f60121af889edb3c978a6b82ab2622483b14186169d06b2fb2c0536c0b19a86e1de43f144a801d63e0b61b6af6c07744b2bb747a0f968d518519b8c350b1078324c7387f1711e95133bcac7ec4900e9f13d2e1d048f4dd0522e8ea24f923db7946922578d2aa29272a127cc19db3eeb24b6b45555f58f6279a8963673ba2f899f1aa97578a6cc1124c0d154900890b4afc76eb566533151d5a1eff51ed36a68530eb8eecbcb7bb91afe8a83ed2e17c3cbc4bc884764ccb25c257fb34ed6a3ffdc7289d18745cc202c1e21875e1edea6600e2ce87de09bdc0d2de198cfd148a5bbe9c0ae3cde6e2c9b5852aff75bac69baa52289db2846886cec0ec9d6406f041eb94aef7d9299406973491bd77c05364b0779d891a5e281e1c5d8003d37630fd57c91e1c5b81a4419c34f8264b886d7853055f9ad289f4c3f115f29c88dc9c89eed842fbe72c93364d374bc05ffd23a0f90072ae3c20882a60fa2e70c4eb71174a1531b1a0b56b42b53b86546f2921f54ea6164fb758b375af9240e27314f38082242869bde693c98cdc92548db90ab6d7611775278f55b94a7c18038a8108df4e4970eb86a7728bd02e2b073c9802a808c07ab48eff7b6337b2ca9e8c1f0857cee9ec6f4822b063e29840e19093744837cd0b835fdf1f8b4bf5c7bec287527aa1c18f036cf89bc8d58d21218c5b38f64853e34a8287c228c75f70e271bd0a6b9892b7358e4c79ee37d8bef4cc6ecae855d647a7d644995628228cdd615e917419622db01c1473e8d583242f722389ca7783bb48187118bab698cd985498d908adc96d559543ab2830484e448c6b124e5d3442b28e3540a958385d82635066ef98e148f5994772315492bd01b5479df44d18346f52f14d0ae06c4915bc11eefa20d66ba6c73351ca70017b145c6c01375a3ac09ebd1782798dd90b29f4eaf2d5e6d56d9894d48967f66098b3d3c09fa0974f022722f98114abce1a314df98dd312fca9c81a3c9548b29086eb97c5774ca416f304c430716930e3f9531d9589d1e05680f2d6fe442f717a78faa4d667a5cb26a12bff80655be31e58455ca0d38e7ac42ae5a1fc6873aa4961e99f0587ec7a862e4288c6d3141e138234bed218c4e4d66ac44de66b8b2599a164a6a6fbd11164c5231fffd50fc46d509bce90a6a817bd2eb3fd42eef28dca05b4596643ff74a63ef3835970ae61f1cfd9cd033f31e0a426c4f5ea0f8b71c763c52ecbbdc4ef8ede831a135376c9b1140cc302ea410e4267a8c66f870ae5c89e98a0e23eec0e840cb5e222a14d83c9c3058372776fb9bb75856e5a1902394e64eee011db2227beebe0e02ee464027f0a0246f0d25ed6ae02ecb32e86e015f4f842e72e2085d13e04f4d485d6f5b0915d1e25123e451d35ee5af2cbd365253b094e8331ae32ee31f3d289b072ef3fbda9960087efc8011e0c3e4fbd8381987f3ffd31a7fe2d65ffae59c13b4309a6635e4278dc51be01f8bc909dffbfc49e243e2ae02b3ddb6bcf01b66e319afaebb540222144391031fd58d155645acd45c7da3d4937024b53e85033cc21c6b47a02630474f8be41ffdd5a3c84eb6c486766b50f23f1104b27fcb09b4cfe05323416081b10d6255d632f8f5b977be46aefac8a7839d20d633d2f02d1ab32df53705a4d77596e8769c1e104e77dbbdc85086154e3dce5899413e547e66cd08b846c5c5f57ffd00d26b15c303fd59329a120b30300377a6122e2026b25e7a9cbdcd749ed0cbf9ef2c148df79b53ab0638ac2a2b618de3ab544ec42fe3afd60e895fc71067937a0b2dbc721bdb565e54ea79d6580d5df6dc33e97481b33431933b3ed781a82f4d92c98a17b8ee7f31f12811d80c13078ad8c481b27002d6e3bcc423456b4c42e0b388edf9f5800951b728e27daba796378225cd3161d9ed64855b09aadf8de8f2d4dbf48c564d67e8af9ca3aaa8b6eb3898d9ccbdf925892d41daf8c1e02318f5842489ef346bea69b095bed469316c004614424529892202ff51b1080187d5b3c844b4189c85624bc4451aeb26c4ab4b11d11b014b238c189c787300f16e026e41550878f1763c24bd3708574a1bde56c0d9f075afb1f7fb331f98d69bf40c17f1e878e2ac63ddf3af88e648bc2a7c70241271fa2b4528b38097c5ad53908a1c6d06afea7f7f3b85ac557586f88f806dbfb510116f11abfefc1631dfac7e4c4db0ac57d10553c2cf8360c15adb5640a3ee61d4d683758dec17a7528791e3f85d5d1addac8f998887bc32c4ca0d63976dd4864164b82228408f614f258343ffa9b2fb09380ed99ca8b4741d34f74ce97280e5f58a1b7f08156ccf89882b74ac520d46cf36590c7b5bf2e9bfdf414baf1804353418e30428100af507c534b55e4dd4c0f1715927da687d8ddb9c3eccadfeafda531c179534fe4149f19dd45f75483cb923696b25774293b50c8d6a429ea110917f9f47b11e328c5108c956c988e24d276c27248e901043d4009f3e2da6112e5a978c5ce17ddcefd0c66bc926d16a1662e61c27165c2864c23f0a7a033aa50a9703c60a5d2040d8c4ad06a6a8a471786f1b3590a7d02b5856caaa6f0bafa23cdd5d86947ce3225f06d4a7a158305655c296aef478fd783a6cc749a85bbb4b3d9b62585a912d71ab088748bc701c20adcaa4d76c296d763ea1840cd3a631ad846cb519949e23a892f284931a6346946f2508b6b9f594c38a1beee3f2c3a12f98a88b29a592c0475e525d7025c5d744838d281cbbabc918479dab263fe77dbbc23915d5def1af4329aef9a4f03dc5289305bb8f0f33c3340f3a4856003467fe491f6107f798e597cc42f604e8fb41dc160a5bef0f409a416ccce9332380cee59f52e9086fa36c8f10e0354aa4f5ff1f91782299c7a451999cc1c638abffa42e96863f4162adbafe8c03f1fc100989de499e80151ab8d424974b86106a8ce63e5833d03ffe06e84ddbc00ac90c6876b4ba7835fe12b30c6da48c2da3b5fe23f2911ab2e685e551f1df8e2404ab3345752ed430808dad707b99010f8c1423b6fbec9ae421e72dd037f7203382affbbacc3abe74f65e57f13ab2a4e55afe5cae9114288e21aaa2848450b495ac43786df47a890e2cb1ec32e1de385298dd973a77c6ce11857f881ae781f0f43b145ddf9559d6a5e0ec7d711f1667be6dfcf75e2e5571a9b658cceb406d7cfc40d4323bd6df875e7b91ef531aed2dda26114256dbfe35d4ae44e427db9923417d484767c572524b189e16b7c6e6edca07e86532c2a135b6254b88970c48a11daa2d1ec325aca3ac5367b6755cf213f7a4e70f43db04e944c0c700ce6a7dfb0c98c2c3b736e036baf4ed3cc0092c3c0ca1cc286ec8d843f2d06566326b50d10a142dfb44735b744dbaa8b9c7b0d46334c9ad8d343710392506bcb274a21b2d5bd054a8108c8abf4184e093faa4615c885a37bce5108d4cae5d980d984c8ce553e5799a9eb2e8d602b6d04606f5f708aed26afd746399511876897565bf2f83258dbfd1c03c74872801c9adc682a9af64a2765bca207614503e9180513ef74193b5a93352da858888dd8ef1c110ecce223620e9d8bfceb88488c38328700c6ede7edd0afaa7eb85c8d342010794441ded542724ea3225d24c4905f351a0bb717dce770c302e085896c7743e19e700d2e3af2c5fac8d55316263163c07df14490e281df0bb55c889f12cd04dc43e98b0f6643c71a4bf92e7dea9192b8f5ba6f8b03568df8967f60671f5d21b30e94e535635987cce663fc98b6461f98cb62914eeeb8dc73c4ff3a72351f259c1f6cefca1178f523ecfffe88f15a7cf26a4d67fcfad4def8b5b65858a5f080c688f9b236642f6cb52815ac172430aca3e693a53a2d0189a0605bcacf49e4bf36a0d0c8217456de46888a38578c4a1aad4056dc3f4eb04331e79a9d84b665038a4559a0d98ef4c2d58a87ee482e9215260e854893758241ad9496ff4d4300b421608a38df6205dd7b027dd118c772e18eb05c0cdeaf8036ad3576020cbe26021f3d1d53633a6f97879fb61785d27d9f82776dcef93477806de5d7b99671f5e7f92c48fd9e962039759ae5881eb037627858ce7da693a4fd6b36a42faed74b61b922c4e5c926d71b7cf0656888962755612134f6d70e2adb837ce990611cf1d01dcd4e991f4daa389ebb30459b974aeee0c52e89f2d40b42037af6cf10f9e746445573c8ccd19f1a2d61c123f580a27dcbc997e92ffd5fc686da08ec66cbed780169d32e7914a7dc51477bf5d6f4756b89f150c7b154efead1e5a232558c8b23d472bc72931d5a69f89995f81be1528279e87df63934460018ffe190a6d23d91d9fbb5e2f434c38471d7199eafb61159695200a3983d6bb46a8c04225e4c13f61685c411eea1c8602e812845be9345da621c12ec985ee40f060a4aba585122282417540c4bb0e435d1fe25c6073ca21a08d697cf51c145827b8e89f960373542c65c9fe082e28e9c55c2fc4b81de6720a75c6080db6171b76f060470d78cc4c7929ad59738315fa8264e6a3e52bad5d5476409b4a6ccf9c501898e69a6e70156f05397a4aee7aa3e4144606facf42d912d6b1c9c68eb7f35ed5a2695041c610a0fe520a7defcc0700d136c88032aebbf24de1a27a6aabc155dd77e04d861e35af16493bf1afa0018a2e1ce0aebd2d260fe060972c5041a74b89ceb8b974642be5c561eb8fe07910ab83f2ba6fa3211fe904b288e1f967c5cda1b371b681264938db63b50f528bd6a86cdba87351735489ff47b102794552bb1e349f7e19893498e96738f758f57ba36d1086f07a271576855c9459e7b60a29f3b5146564a2289abd2a1e7cba02519b58c4b626e1cc2623f4b7a5d4fe9bf67799cb19a50a257855de1cbf856f82a99bbfc3ba08829f6775324bb4c242f32681e356d2e20f06d95a974c9587c0dedd809dfaa64b4c8dfdad0f9639e178683d8780ffa9dcb431fca8ab8d2e66c9de4c379bf86e6a5f1e60be2073dc8d2bae5c15fd79c240e5040768ee55b41549a246fc649d1d0db36bddd9cf3e44cfce1eff8bdf4eef1216cde531d01d57f980e55b3d786071587c4bea80812a77966108dcb482a0fe230b53a641f2c84f8efe15491ca1ed956e20efd5d009162f9e79a3b69382549d4fec821640cb7fa91cdf489526d445a0003d5d7688ddffbfb4f3b3ae453b0c09081f9953d9ea15d4dca4e5654b4006556da620dafaea3329e7c195d9eccbeefb37493c776f8f348471c2fe4f8ae276a7910db0b224b0bff6646b428cd0bfc43c04868a04d07a7bfbafa121303b8b7d28c345a8e75339a4e9f8ba56d06252684106abdc37c304ba0075b1ae565bf473f44d5a7440343983628a28a28dd37ab2a5a8a1f3940b72e6faaf20a2337097aa29affda329ff4dec97d7aeb2714e7c646d9319b15bb1fe6332feff78aa56288416c16745f56cdcf1a6460857d417a93cadf1ca0792302a664ef54374d06e2af1d51db77492887a44f61b0a88993f4e2bb10f6ce46e44ff8b154d44f4515feccde6434d642d4a18e772c6e03bf744286525adbad9147dc5756884068cb265d36cf6adcebfbd0918367395e58be7a128ee128a18b336b38c2517ac03a253942bf7bd3354f9b6d3a77fb6748e70fb628007c21369d63aa1feb56d6df32970ff236a13acf2a96115f1db5bb143e8a640c258acf66b2a32205440ce282338a73fd859043a80ef436eb331ddc38b79059f07a6730cf313dd7c17b14e82473579b364d7c6100a49ebd365621c7e9880c841708af7a73f8830e8e222cc451bde49bc89742caeec0493ce37a70610d3b5f020532368eaba8eb9fa454fa319a8a6cdea58321dc3a6a9a45287d528b47ca7570e237a2bd741cd031f58dfb36a220d0cedb0a6c947282072b69ccf5361f39a265d0cc5297c2bca9e1f67f4b1e5b397a18d75e577887bfaa736ba1a71196d88dbe178feb0c72ec8159eb9ff7cf7946eabcdd244488613162de1a3eb9819df8e8470a249bb73291301bc25a723511cdab0f05dece2b888d40c26623efab0e193e5dafb6f216206121ae45ef304ba38d7684154dc9f9a31173b51b311e17e91d1a38ca650a94560ccdb5108c807b4f35d87bb8ab35ce26bb6e036ec5ee7ca99f37274c1c0321b895ea26d35d18d9201012f3670eb24f3001dd8537977e25fc6c2a78de0f8cb2d5ba637610eb459e4b8f2d02327978267ff8de3e0fef788418c1643d6fb7bdbede972676d6d767a0bf80539d96ef84732c22a543d2d137aec519c0d48b7f87673eb4b7a96088863ed3c90390c57b061bb0dc001866a8bf5abb4110d42c601ffe0fbbf724db00353102983bd0affc7f83a79b1d57458ec481e1bf021b6a0e8774cf662afe5125b088aa03a9f542e9b52ecf7158ac2b7651db0bc075ac59e908493b85736a3f49b995039c8efdc6dc2dae1bea05d4433bf5c334e90f53f9c3d5040937b7c0fb62a2c7af868d42b2a861767018873b747290499d6a2e6dbce76d17e383004f23b7b8130e2c70a5ef3b49140417301db780457f136e4b828d888ccdd9d84aa47936df099e3860533948d65d2dab0c5892ad4d81981285871383712c4e9d2e59bd74e23dffe4841399b73453c457a707c86fdb3a3b3016b32e6bc7e22ce00ca77353df96f61ef1a615e5b774d4477d5c0c96374e3d85c34731496382dc3a9774f13f6ca72259d9ae884ab873ef3b34180950adada4a617474a2dfdce7cc534db7c479857c8cf0c4356bbe5fb4b518743e3fcd26002113df39f496e7d7bb44660f59c04fbf32431aeeed8b809f6d1f85cf217f789d0dd910f6f08320ea3bae507acb06c3cd82e27367699bddf6006cbd616b5ff97e112bdcf56433b90cdefaad3851fccb3e434d54a18c6e1658bb7152fb7b4ed3bedb5d1727a720cacf2b456fadeef777e573bbcc167b637048e650a03c73f70e7ac86416c9d22fd4ac92eb0abc76c1fee35789ca42ce6aae6473e638833885dbec99bdbb14bde9f1008532c3715cfe4920e558257af77798ac3eb63133d575633c69b7301b6c6cdbe5a71d580aab42e687492013a5b882a05a98872c07922777632a44e403dacb452cf7c1e3e5df0a5104c9c896a4406a020b0ad5cb49966c75628fe7aa59689adbf2f2514c54532a4d5c7a99ac6d9425c61a0a61ab1a58068976e0d0348055a3361fa3c82b3de9c7d28131ca06e25d94da13230dd497ac163b1dbd47a8b96d8080d5ee87d81972d74f8b3ff84f72bff227c756b32faa94754154e6c67a94d3558b0507e4a8a4242002c66ef2c9cdc7a747e280f71bde2d519dbeea393f8261a1cc73e35071039e1055a6bfb89ebd823bfbdb7bc1550f4d854e61a0c47acfb95370eb4f217e0e77281f9a47e1ca73809b5df74e1f9a78f47de8232ee814726978aa7cfa58c693a75aa851596af55411a76a30a2c45754390f5bbced7ed4ff26a157e486d8e47751301b82288d64dbb8cadf25e6680b6e69cab1ff498b979deaa62616769b0e014bcadc61c2ed07040cb7a3725b3a9c34fdaa1be85336e82afa96d28b0230f513253d0b894bf5264bc424f32c2f476c1730e6100ed8a3fd3ce479c3f1a2fb9de963708fdcff0491887aedac2c6334e606f02b10f0db5d12c66d9dd0c573fafbc395bfadef854bef441ef358ca0a8d99a2c8795a5a3c899dd30ad62de4893d8587da89db991c47a224bbdaa42549bf81d5ee249a0e33296ec78bd6cf7dd5e0d0b820cdf3c9faa8620694a32ca1a510830b3a341ba89f1e77f5dcac97df12186d5bc720f8c2d449c34b85aeb7d7772f0946f5032d4173b6ee5e524b6e8517c00c274d00b84db74891c988fe297a01383be495034eb600fa863604b45b663317722b3ec2abc5711b104899754a99fc0284b9dbb3cc0d761188aca02e58350eb458268925b14f0de31ade245b677816ee9bfd735e5de036b770c0a45934aa95086748593de4038ad4efde35b8eff5574499f9bda99e2d1b66bbe8993b265e67957795432f0627a6bb4edee14d109a52610c2b369242ec93e22f999a052955fc15da06cb56db800b3cac4c66766451ea9c7079509f18dc1ff8d9cc9c179b74626b9e16ffd8b58e6856a895a0441244f73bf741b379489aa812dc6db60406b1f4235771b3c5c5f7207f8aaf034e0a57acbaec7cf408aa5b082a27daab61dd39ad1718693e26ebde76dd9b68172e9c9a6e6dd2e3dfbe365190392d05d8289cc10af273a5a18a637dba7417cfb192fd2fba2bb5a7228d1df833c3c063c86c9de58312e2ca241856c1571986ff6109ca1ccc636074d152e202f3c5229a9d83afd48a66a2a50e129bc3694079c210e5b096f1c532bc4208767ab86fa3d41ef20a05152c81b3667673d790f5a688d7128d8976b551fa74293681626e91046693e0cc2ff8a94ff04479ed1f2471e7288d804b8c4c97524d9661eecc524d9052b02c6aa33bfea6c6399784b30ff1e248adf11d9444ebbbb7132060bff57064a4611bda40650ffe86b9b431df0a326ccf1e385edfbd30395298187650263e657027d9c33c5cd52dc09956302ea1e017fa1daf46f1eee1d9456c14ffa9fe9c9b9ecb5f7ade2f621d6abbd0bc1d6b2695d51181be85c59134a001fc3a4ede63d31ab60dd430b62465df21cd977344b7fa74daa244906f86e3854c3b63fb44796bc4f5bbf8afd37f732b0d20014ba21e312f4d6bf80eaec9816abb3521733767d771400a60d8e30297fd30dbd71af17cde74ec33b64af7905acc1c9eeb6cd1676cfa4e95fa275ea49afe04cb31f905707c96931a197947d751b115e8e5856f36de18dcdf39a20799bc8a2e3b1f0964301a6bf2abe566d77bec303b5f34ba3f0447886304be8c39976cf77a92694d9afd372c687f8c9c772d3112ed0590071eaa288e01366ae32a44fdc5e9b20cded56c447b8b45e1da9121f0e6370e7f2c32ad05c44c5d9796b58e856d9ceca9a02d9a36f67494271eb70ace23e501080a518fef3d26b5e9d4714e3f3e09d2ef357ceec0ea992d318743e632327cff166e3bfd9ef1dd298485725f41ae59fb0850745167addc4e94c62a209180087e7eecb826d9b10e48a889772ded053edca3c7ffbb752c9495fdb05c9305fb3f141ce81ffcc6450f5130d59da43d3b6602eac534d3c56de4b143dafaf79f672f9e85ef20be8a964687c57aff86b4b0919ceb3e3ea74745acc65c1d3f0e013c24dc3ed4cd6e983318fb49862a521e28f5350ba112f79ad4fb4eb78199ad18604b9c67c8ab4dec11e7b395d88d681b8c3c67fc7d48c63fd6e01634e612c6f8c049b1bb4c62c195487eeb12b3ac7a45f3ea75b8f332c85877f438e78b5db9e4a1875bbd87eb3714c162c467ea2ac696a4ca3c7267275683a9e2ee6a05b4380e2db138f2c4bbc344a8b876281aa025362becc02289f60d8575ffebc9933d08fc04601edf0c69a197c8e9db3dd4dba6355bbff9d5ee50c20dfd6ed52187db492e6193f1ad02b7e6000b02d31f58f619c59fe3a6a55e61d1ae650fc334a7f3da628543a631c7d723cca65a82e3d05ef7b77370dbbb4305b8c6556f17ec2b56646a851ed8467c6ea82e7e225e7e32237307713b77f78364fbaf294ad48cfcd119913e2184225232664bd38b380fe6f1ae9052eab751bc7d15f122647ef891d9ec257a1c03d6877f1739363d5bf48badbe44c0a6ad52b1ca94c0caaf7a731077cde3ec6d7d220638142d1f433decee47a08c7829ce51278ebeef69b563499d3fced02cf4efd905e0f15ef3ef68614f564af2f19c6d939987867a7a1e3b2653b241537c9e94aff7c95004481c09333a929bf2a7c6dc028b04e441bf6061312ad78e4150af37e0c42c779d7da33d662cfefc14c95f5e4e5a9867dcd86f8b5223f2e923f0c3f74563fede20c80f0a2f9e0135e8da4e91af4bc42bc5805ec69c81b1dbc4fe9992dd81f1474f9fb7f34082854fe187ab75c22193799e259fb1ae3dc3ed840bef0122806f2ba6d1ca3727d457905a8de3e4850945f1befc3ddc7a5cac6ed7224e9aff26f2e9aa9d656948fb700b14be271cef24ba0783149bfd5738bc607f735e42a6f38c68cf78bef79391e34cc986a33f2b428e7b4ffeaca5cb110f2a665800f80ac1edc3b25d1ca8dec026df088288084de2cb48b4f16ab074e6fc6609ccfd5f8a3ef67d90baab5ae1fd9d312b0a2177b7b13f9dc9dc8241893e8710fbbb2b83881026cc1e652c4f0a108cfd19d969391d5883088c2d9efbabb30f7b877d266bf604ccefee00ef8c0b5f5d60f577d613bf516bdee9e2809beac314a8acc324bef60a08639f2dc7b296c658ad7ccdea5da02f64b6cf0c49a23692481b44b05ca5430089aab2f1967f81a72282a79144b947986b5169c9e780d2d10e8f04a959d4abb1f3705495fded1d3647a82f9807343fdf73abcf5ef39dfcf3d3c267eb276a3e438bd32b4c9b62132468716f1320829e672eca697a20a15ecdac2d612bd1d32de9ca4523637630c416a58b6875c3f07ebb8d610832f3b18683935265da1be80a7d35e24a4a5fb03d0f2b2e340ca495d4471e7f5354a0b267d0ea5e528e9d3c34e1cccba102f1db0c6311884f762fd3164723726136a5a4f5059573ee938ee737770f6ea8afb82d6c7f5ec9f4076fbfb63e5dba2da92943e77765d05d47b8694b6a83d36c48d224fe55374bc5679e49974455862477b50e4f6a4635d782b14e70219e544a5b3771507009661ac00fa0c1c9d883ccae6e5c8a2787f541ea22ca1c3942fbc86180eac020fc613c81b603a0419047bf42a3f74f2d5d1a7ccbe9eada3cbc0ef8aa1f8145712ad3cbfe394680491fd6d055ab44b0115d489f2ffd9ccb7a0552eb7d364a9ed58172d2f7da8dedf4c72f169d0a35f2f5aeaf91e06b93d3f96ac73b4153a1ea040d5a5e714162750486f2ef4623c16fb82c57c2e0338f1681f4d62f63f585669bf726ba2aec48c9342314af5c52d106195355b8a296a938aab37144145a9e2f53ede480b4ec60aca8a1097a9aa1d51a2869c0253d081db2135578f689213a0ed46ed8228c57670c83c06b67ea62f9baa8144600fa242fcb379c6649b16f092b615dceb0701d9d2a712dd2353e14c7adb31afdf117794558a99f3648ee579c4106271c3aad1cf05f2344641e0079484abfc7c8b687527708f2db8c7f89030f89f1507869036e309d3b0fd5c0c00aa0f64738047573ff1a6e551fe4929db1fdecec79cbf66e7230c710d4fbabf6bf2455ad7d3e7c7cd6d847adfba72e579b4f59bb91b65c139a43ddd3084d83fb56a2361b052280e4888f28a0928f719843df413af21a032cefe93b9c27413601d75020bb4c24e7bf6be3068a7f9b7e0cea601c7dddbb45de5430e284e6e8747735703ca118010401fb8734fa8f06c568c39ad01a99aa03e5bb4596fa06451f796c7c62979877e4cc976581821ee49b97f844e1f57583da5531b087a9cf221c4b8f951f35bbbbb3ba30b4878f0436711cd4b427d766bdd775be7198708b9611c36eb25152ec9454249721292be0775871994a6762099f350f2adec64391911298ee20f12918c7b6ddd5ea8524b38c7aecd1ab06cce3c646f759dd3bd6f431f323c6821b0829ae141cc0572bfafb4a014f2753e732c90c88a2331d22931017a797547cff825e6ad8fbb4e8adc85e6d7148ef371a68f1dab52e4694aa091b22d4d92ec647ff11fcef1539272f0d13a3c89d8ed55b719690ccb752b46b8986a689514ffc0395ca2c389718d81e4af2cad44e6b29ab181428482f33aed4e54824b6ca359b8cf3b11fc6d82ddded52c696a75d5b7c83f72c4af3d38a45c86616c8b2a265cdded299041af473e662404a8de5135b995fdd75eef6b3809015c0ae7766d0ee7d2318e1a575bf5c7f363e241585ccb919a0aa6a245e29bbfa1c89f53e37cbc91940df806babf7b3a78eddd843faf9145408377276bd7abc89f8e4a247ae97c6b913bfefec2ce6fa4883aad56ab7ef2be4ec026f34f23e4aad8603024d91a4eeaa10c6b4758d66c7f9be53dafbf6305dc063a20f6ba426b792017395fd33cf6e601182db79203b487d740b9f2ecadc599d3078e71df6dc1f430dcf7993e5f9a110d9fb7364258ce965ca9b2e405caecca5482cb2a2cc7585fe1df297f81967b544c87d07c8dc08e306c6fe074946cd2eb9ad87c91c01e44e26f0f8fcbf9b36b0ed86708da114b58501218d49ad969b33f70e092916f88955594b862b57358c79ec637cf6f464122268386c9cbb3883b1eec0cc59c3ac43011182686aaec9125689d83651a6d97d504b63e77fe301d36d99f5508942ebcf50e291d3f18d29784186975321c8b6e70ac903fd66e4f3f45a6f60fc97a3f582e8fe86e0e906c026b0007eb3ff372a52f274c601f9b332b4c92e1230988f1e66eeb7c7cd37d0f6b4b54e739a0a624be0be017dafe1b4ec26f7a68669eb8c1b45f69f731e286edcd83ee91e516a909c4e03d7f0d55b144e6bf9f54e73a4d94183719a79ac10743f830ee73ec5cde2544c37e83794b758ef764df0fa161ddec63dd05a02b7e5fe4415a5bb84937a827e9d91e85d9b117f73f91c9f7059160b897a360e63c9cc567776fe180c1126b5098f9e15b5242c43ae8736748e291b7fd3266c9ef2154da55d2a8f0f5c1a78e826db49cc54a6a552ab472562e3d1c176403619b7c3bd028181f09f669128ede0793b6bb199745300ee4f88412c749c0f03630c0ef76c826b269f846647c8ef357fbeba445b282b096f888e2521185db250322dd503c0db28d9a8cac23eac36f795d5024e109d3f67b766d777ec56ac4ca471522eef3d78809938ecb6bc0261033450daa9692aa941ed5d84de86666daf90db2266ebd30117bf00438b519fc41f3fb189b10001c39c34e3045f01b8ec646cb704ff230ca1283225bcf6624410d84194867b0bcb6bbd1d6cf30d588d00d02f76588ae1075f54703620d42f9b06839c8872e4ff303ee027d52990ca8aa49b10c02abb27704b2f861a13361780b66cf3c3f832dc455c83321f8e75d206483535249801ab8e424ee1cb3f701afbb289a5708464c440272533df34ebe63f815a9e05580d5ca12528b6ebdce63dcb1f443f8850157d79150c38eb250f4dcdf0b4da2f27d69cbd5565e94c0adbab227f2fba2427e9967d37fb1087f837ee2745ce67f11dab633bdb9131c1e23a034d186e171031ea2da850cbc7a65f4ef3281b989878b434ab0f6e22b61cc7112b0a8af36217650aa123bd5b0c7ca36ff2658c5e4fe14aa77db1f2b3a932d6aadacea9433c3b106545cfa530bc8b2a3bfc7fa9ced9ae0c3257325e02c5854fcb334b08e54a90cb8898666b3a4e20ce5b14203d15da92fc5dacb5bc37e07b187fec4d41aed975f92801e4497bf235d9f2db645ede70986f0693c5e705e8783c75a39bf01f149b51e355731ca928121a12ab216cd59bbb35f061b73b84c4018b07184fa13cf354226a9766a4779d2dcb3b3e844466ac6813af2b6ddead5127545e6a4a9c7052f72177a737d8f34417f4ce4bc2f00fd291367642facf17700bced831d5d8713580b0f4460e15d86cf6e961b7e0132a722366d74bb81b0312cd5b8d451651399214a71c478d7ffee71ec1307dad1373cf5523ac28e795ca5a2d97375039e008d10b2e17b803b89ca2da02a02c70dd570c90917676e6fe65a2c81eb350b4e8849ab71314c4f3a7b3d3d9af4fe23d6685ef1e787413e1bd44e145f30ffd4731debe3ae6dce1ef3c0ffcc587718bb11316b1778c344b31a5c0a24f5545c7cc7ea3b578dfa289c9f895a2f60c1d5642309bc30d46b7054e4619895a84896939b681ef8ccb3361a930a57f405b0997fc496f6ee4ee735de936338d76e4c149f766b3554c4bbcdbf64872e97d4e09d7e0dfda146e62c6f1d95e89b1632413fbd13e6dce8fd3391233369f3dc112c469f13e0b43f092d663debbc68df4b69c722af3323105aba15cb4dbb834d82b1db12c19705adfde5cdbba787fe9cf77dc93d5d4d4cebabda3de25986318c875faa1caeb3435a576c620021b325bf58a772cf6d6ae748516c7406afe7713732751289e51d240660f381355efb84c2f8c07bf9be8f254cd8f0e6ca913c754725cb52bc219bbe64aed804bbf4676f981e4018f248ac7949f1ee0eee70a8aec5a1242e520673bc06308453c6f9f726390399b57560bb6d8d84dade40968d417ed0e4bbe50b6eee04ec0709b4c1c662316eb2a6ed1b3898865d8cae6a6e0e3e23c31183e74005d5de5ce55025165d2f2d73a8e3dd3ba5080c541e6dd0b175f86c149bc19a87ebdbd61f9d929bac5ec03910cd2ab201455e2c29441e1f52d15a85ce349d5603daa3b72a7f42a5e35d43c423a596b7bdc22730db429f6d4f880b717fd33f4e2e81fd01e6ab9f5723fe406fc652eab2621aac41ec1ca94cdb520b386eb4c684eafab62eb9bf6d43c79af3351a8a610ede5a3b11aca82428d4a92f8cd90a013edf3fd4ad80f27a04f89e4a93adc40eebbd4a5c83e5af0f389627c2d1b28c778592e783eeda85720e5b534165f3be570ab7d734837df14a3a76f76cee46782c32c8d4d18556bdd2ee737eab731edc34144dc49e5b7a8287ea49a44998092379d4c15320d131d3a2f3525b94ef360b38dde117ef2c350671ebb289e853c1d50eca81aaa870ba91400c22dc3c46cd8435c29e3f7108ee721ef190b1ad755ff77e20dbf0831178d5243edda9c0627ad6067a47dc50de1f1696c7702a32f13e25a357556f968538330d1f76084b5e78c8236f6df06b8b0862d1ab7ed6e1aa6b6385b04e0ba46b6f187f72525fe1999ec0fd0ce63c80cfadc4b39f07bbee5bb072f154bd0b1244248304c85b58ce7832242cdd087bd5239e6e19621e3ccf4a84295d03ccbbd233be80fee1fe546679889bc8a4713cc7dbc97c8489ad9ef002ab384c61813f23289bf4a563bbbcde42e8d723e25fb9404e40212c1e56c92832b18e09c0cecbeb64a142c3103b101e7b385e8c150c79b8026338ad27aee64bc222c1abd9c59dc78225411857b9e0e65b994de491238a6271268a76d0b317189f2d407ec709fe2ecd1fbab00519c5d3a77b740d42b503a915539c17676367c8d938ec5972c0d53a192f39ac1d2c93659cb1f0967d9bac417498b779d794a92386f7bf5146167a91e51e89f807d9b0c9677ee5f5baf4a3b443709326c9ffa5cb5c8b5000a497108792c657b73e4e44c1514d875df22e80ee701370c33cc82d546dfea75a02652339158103f6ab434b1860e3f002e93dd74cf00a767e3faac113b550c0580189c46f16ad47ae6f88b1bfec7319ceca02704494d04b76dc026d8a62ff92369400489337cf139c3c4914b64c6d718cced5ed38978702ae980964ef5c25af0f63180c4206f5857909e1f24e54c447619bd26f9730354aec2b6bcd5a5364bc1c45678cfa76d27e2eca15d707519b7ec12d97c5731143a86fcdc5acbc94d5d0f5b4f63132313d7bfc157856a8825e0468a24b203fa9c2360ad2daf0a2fdc274de0279d94b1a1cf82110d6782392ff067c5bbc9c9d9a651dbc485b8cb3ded13f8274b45754a61ae571685d7322aca7b40d20cb3abf1bccfbc24d3d1db8a0cac4a983cda9032d30e63242fd5b8bfb5d3eafca0a87f4ee668743642ad389ac462dcf24d54ec27f3ab47d958ed55c8948f4e6bbabe4d85fe2796e984e6cc50eaedd35289b8a5eafe64471db29f91e6bcbad866d5a2b7cf5bc2d8d4dd97e32acb7cc84dac0929362357d15522dfee7118cf82befb9ecaf28246112c1da39d65c0e29af2ec4267b12753a115e97e14d2cce25cd0aa7b8ca337f4662003f2ebb5e14ae98b18ea9829a0d59284f62b5ed41ea4e1607e7dee5ff693d4e4180f9bf6cfa34ce3d31c5c998a205296495919d6bb2a54ea133c0d55246c41a24eb1223703fdd05adf90ae14fdf559154254a2f344724b62bc308f396eda02d7ae8257fbdacc93ab33a2ecf4277fb9867b0bda68d4daea52b8e517052400cbfc81461a178028ff9a3145acd23cd00abbe6d2a4cb0d61ab9d22c59036e346479284f964c2ba5e3028df743bb9524ce8c9fe05c00570c7c53967ce9e45b53ccb45139e8380c3f49c1ad150c5180b8d28cea6c3d8f6ef80c78313c0a792dcac0397f0a248510217519b739b4920cdd2da5480f2b9b25f7526f40290bf5bb3bf833cea72e9ef3bb4e617716ac16c85363b492e459b717475307a7734aadea6ca98ab0522c58b1ecd1d9eed81eab75e6a1adedcdde6cdcce195caa1a5a23d293c8126a627eb70c272d654c47b0b5cd74328d89a06c2afee8e93dfbf8f1e75985b38729fa3b05663a06508946ce786dd997aa2587e685a5faf601376ccd9323c35c58110c84112122ac004d03df576a06bf2c30a890740bec4cd506fc79c1183833e96b67d694a834206ce59d0c626bd878949c6e92c869dda08b271c19d9f99621fa8ff47a777835c339485efe0e5196c96c6b9a1702fb2a0b5166c9e8fe1f6cbbed7a45a63dda424e7047a60f584ce1a81631f90d4d6f226eaf93778a4c0c710a24db833651a16d913121438f175db0b632723f14e3fa845806874bd7011b8b935116773903982725ffb537e795914fca03c38efa7e2a2449259d2fc31b06d15fffe900f40c935724320a1ca5d4300a1e1ee689d97af6c14f64ec25b315acf780b43456fdabc3958168c2ead4c1db85ea4317e25a83945c9f7283ca6397bd66c8d18440fbc3987dd63d031901bf9d51f899cf0aa637861e6c738558193a8ddb7ff0187f07d519a4360bf3a3b22f07bfa2f06d406febf128063c0afde37e6b241e032a6f4453b366674cd7aec3401b7857c0c63f7502d08158f25013ca28670560d3ef51806e05739b2705c65b1575e396e22ec23fb506fc79848bc4a526b44c500b4dad7a93cd7cf000e685b486f9ceaaeaeb71f423c38d235879d7ac2f9c695578718000f678165bd5df8715b196af383278f6f122bbbf0bc513e91167aa3e4156599bd219205762fbcbe1674c31a6d05fc073fee9b594c489373671b8c0fe9a901d77cb7a72c76dd7c2c6bd10570f7cba7a6dec7357567b1bccc280388b84ee078217ee862a30e81217913d2aad475398a7516f20a188484d27cd7b6b6e8d0ae5b1f5e195cfa5a07a86a05e8c71d408b289fdd15b77510d8d6c691ba161d7e8743c1b0fd30074c8004481f9985c1eb38d667b90048f526230c4af9894c8f9a65ac907a947051664caf106c8adb69aa3e406952f7c313051e7a1a9912b93d28463f20f166043d65b786e370aaf54b77177168d56019191bba8a037617d7d27782bdfdc8ae9ee23607ada495e866eddb7e04210b066cf7321fad543f0440335f75eb7fdc0d913c8af2c846a12a4bb60c1bc640a6c630d100a83a12746f1171ea8697798ae89fc117dc2af1c09cc58b8caab6a5f99cc89e11017377b6cfd131c706e43a4784d4419b67c1f1390186bee3b6ce1eae9ed8aef23492448b9083e47eb31f3ce6ff8f70c0a3d07053cb2a1e196438393320cf5ce2bdebb81cb053d619b761e7b344454999d2ae30b24a294f0dc736ac0d07698badf5091d620ad6b127cb28e92982f8998116bde8f5b3695addddf3cbd7f08b3fad945361626536c3bf98f0030a82303a2feccd1a9f7ef0b02d4b8c0a0e565394170222504f37c4807b405357a8e02f2247b4b5f24f5bce4cf75a2e18499ac13c0db8285d1a325d696230ebb4e76003ab9a694d16f557149fd42c43a638533236c6e3e41b166a9734ea777431ff873ed86363de6b591156ad1b6e7e85bf3ba2edb39e94c2d633e89cb98b10ac53be5a7c0a34da8fca02950eef4337c6fa9fb3a33c15a7b845ac80022e379d5d9713b4cb4e530dd41fdfa8fcce43d84d3b224983e01b9e911849dd337df8b7f357f155a507d3085ecdd708ac6aee6046c6351d158b7d8c830f1a697a291e1f9dabd58dd1f48dd4b80774016fdc3952c21d42713a0c5e16483b5a897c2a9db1159fa3d3e0d167e53124402608b40be6df1f78b8a0bffead469ad992734fb33f3ac9bbd17d2324157c8925e23c9011642e8a4ab7146141b5e090a40272badc9eb39a817ad46e29f34e8b5bec04f9aff40ce4412a25886e635abef808f336c664946c2f71dc7f0cdd1c1263916ee75a354294ea2ca7acc86e132c57c82ae420d2a5becf3958876df8c1cce6b3f76800ab2563fda866f46e9beb4154754ae64188c815e5cf820151677d35620a1cd0d9cc260ca2c1a099e7550655194c4c3cbabffeb256cd6ce517d4ee439f3e972dc674b0e7287eb3e335e7063dc19aac5b9b4764377eafd5bfecb6cc1009c6e697905e94daf7baecfb0405369d0e4066eb9847f9b41d476a96466d217fea59e61a4241797135042f0034f76bf0e0c55df4e3ca2dff639803415084f997c02e05b11c11bec1c0442eb817c10851e87d231a3477f62d7b5c3cddc6ddb217ad53e338656649fae796dfd7a57c954d855edfd484fd8a655ed9e7823bc9fed3866737f1bbec4321063815b5a5e25195384fcdc433bf545d8068fa4e635d7d34dd36bc764af6485ad3f52650e5e83217df9d6224b7ee8f275e105e29df2f792475d5ed24b9934a34c61881155ce113db35b890743241c763a076254a7ba562893a8e7353e89e60d4698c7f8429dea68fe1626c951a8c3f21f1ab907f6db5f4bf143bace01a1ea7d8d203dac51e9dc3c945944590b9bf42020f457a92d9b3106d8c7d12afa4af0433f2a91bf3891430716f817b58c263c95de7cd3a0160a9a5db9e1bf4748b7db34636dd2a6b47ba5646eeb4a4cff9b079e2e87a0e626e44899df30f2fd0e2de80b9b32132836738f7eb5b800b75e3ba6f6dee2d5a7d2f0c501aa902e8104e8e05f361112076329e234a813de0d85fc85033b97d225538bcf721793f931297d06415b6343a11d3684e00222315bc21161330106bc7a181f2615aea81b222dfde8acb7897f48864f2d426a841989ac9fdfbfe84a335c35a4c720fe1172ce39ab022c055baf68a7ff70c2aaa985d3d760612389bdcd213285f0c11083f75baf1d597b94d9640bdeefab5763230b2a5d10fac3360e3443fad63515d8d5ce9263ee43aedd7dd1a2bb8778a29a1a633a7e9d002aac3d70ab111a3ab608a1d85e263c43ae288c66eb67bd27d4f911f36ddb5c9b5afd7343326c1f435d5d6e2bdf789ab7b271d8c0c2a7903848fd69aef90b29e76ae58baeb1aa6d3575fb3511cc52f66a2fc7b28da7643108759339f9d5bd5d6754b300de5dff8d0785a13c535058c2bc1c19f883a6cc080b33aa507490d514d9819954bcb590287df17294f8a2203876789c5a707ee0c88b1b8ca3c7f6a14238e6533fd64f6b1ed2385351a9bdd90743be0364c6e3399c51a764ca123d38b07fd8f4078a500b637912412db9da72c7b0ef795980c3124660e88abeab135036f38b25d964666a7857156d0b8f24336d38c552c7a2820713230950966c671b1bf8e0a79cd009e36c3a549cac551fa469b7a0723665c314c75cc004427775cad594a11815ce7e783e2fe1df09476b2e2420522f68a48d9405e8f7332435f18ad47ab7cf48916ba9d77af24e726b0d2ede50f2e2ae23960dc8879270020d49985039b5523120a180368ccdd1fcc96f1e7ed3c43ac34b934e52e1d0c23964a2e255b9c2f05abe9cb9b0738b4f55d5288d6475c993891f53839b828e110679b0a5e7ed1bd84773f2e616d89fcb11720f52262342813632264873a1da53ae864c476b488aaec9e3a16def5417d0b460c7dc74e952508ecfaba984e3dee422b60642763e95d7fc4263f70e658e8f9406786b2e953a62fbdad6d1b70a8fd76b3b02b381a8ae4e546a660a5391c7fb24cf3960720cacee9f9eae3fe7024a0cc0367eee2cd3b9f0e02afaadecc12dacd236f69d5e51e8dd246c2441c977a82ba3445993ada419c1462c276d61e37887baba6deaee8552bb71f448881ce6b09d447ebf746fe83d8dd5746904ca787440596480300f23d3fe4136b2a9fa8e36e8c3ead86aa55c2b998e1e76a0821299e2f8d616e6a926e6b30429da796f5bff62ab1a67d828d843da1ff0ec57f203fb94ece1d94b595344fc00663930b34c61ee908db4970f75786c8e3e46959835d2e51221f183ed383073f0f7cc4714d3949de9426eac65a46aeeb8d3dc4f57507033716e4d601fd5fb444334fea08f918db76b935bda3d12d174d322976c0f1d28bda1ce175eb32aa7647970acfd9de213e29c848dcd9b496def9a3fd37a74d8948778a661a0fc3a85a87010087bd9eac05549f2889b6e676ee151c24a56346925ff1c0eaaa5e5e7993345d38baf0b32e6190831efc4244c5af6854582d8d7d190d0999bf672bf36493a159e45268e578771559e00225efe6d0861f480b601fd6c6e01b23979299eac5aa8513be55eb09a552ba3fede808b161de738c019e0afa7a6d2ce91f2b936aa7b971f051a9dca8c078804bdffe95af0b45b9feeaf92f1561a2d131d3f7b35134510f2d64128788e64b417ca73b3b047198d68a5729f94fef799c36b8ce8461ee4a9ac4109fa4dab9c422173316123a186fb09cf6480d2177f2a7a5ba22a72a867e61e436d1cfbfcc71de2388b9d38951d65f6a7c35ae29f5520579edc23eddbbe0a1c0222e0d11f687f9b1439810e68a4850afb41260aeeb7d9c801afb032df5afecd7525401428621c2cf0760fae1332837d48a120706a1a46d7679af979988cbb3a0277eecf393805c6917b408db175d7e7a97a179cf2ae58609e41bb32e4763b436522b71a60175fc6d4dbe2bebfcb0490dc215b1e609ba207873925039d9cc4d33e2a8a9a238953483601ea51bf71fe6838a56829ffd4c9dc7a3fe76118fb41b58cc5ced971f5c87e55b2a928f11929b62631e577b115d773c577e98ca9d901fd56ceeb26e501ba39303146be2dcc0ca8b83c1e117c44fe890ac97b1b0355e76848cee07b21d4676e505d2fc96669675f1189d6a91e83c6356e4702fcd7c4972554cfb195e889d773ef018599794dc42b41d380c35cb75411196133cc5fb908817078220297ec55bb64005b2107d3d6d6c01d29141d0a9d8e0ab83eca420bf1aa2adaf2502123724303f95dd05edd35bbb51f26984d9fb5047e7cc3cd06382bdbdce40c8f367cc581719f888d73dcb472961df54a30d2bf235c3ec000c5bd0e1a212309c5aebdfbf6b4233f1b22b3eae72ed60710a9cae2eeb96cb572bdec31ee035227fa9e0999fec0e225bde4e5b5e2da88da61d54e478d3d9e1bee65b6c5b046164f4a1521606819808acb603c42e47f9ace1e6b4f8aae176c467414f6b2f26af6698cb3f69e53622ce44cd050442cafa370aa581e1f9cf3595337efccc9243d81da38b2e6493095621bfc72138aab9fd6d234f0d4aecdb36fd25ede19dbf15647968488e62b177ea4e24306fe97ea109df6e35a4850151ce498c74402186bee6bd2ad57076cabe180df541442ab757a662073673bb0d002872257584ed18228d617d517772e6a921bca7519cdc2bf5b660d6cf2b1c1e4219e022c8c35a5bb716c2f1b09f08d4ff603bdb1da690eeb0f3354fe228f69bcde131d94189b1bae7bc9b02832c87ee8076932caa42bb8633628db7c09abbe21a96502615b7ae215ff032db8ebf6d0d3fc4590a41357c469a26a6864bef77fa7ada772235841901e2c6514da7616bd0f71e34345aa4511a631c9be07c2c34b427494422c635c38cf9d8cb197c804c72c6301b99015763f8219ad5e0782e9f3f9f18270aac7374db076ee80e8b6cfc2f080c193a5a24686289114ad7552b4fd45580d5d1b7535e8af4a17baae24d799122c38263ed89d00025a85f1bfcfb7dc774e915b7e74cc262b71037086819b23527d30268df8a2f09be07a7bd347a5b49cd73467b9c0f65c1855eb8cd4cc3c5de66d1973b408ac479fee5d2aa1944ca8d813dd2aeb5a7449eebb06647be93e4d9a22a21d479c4a239df0330f60033bdb93a34b947cb0741eb138e156dc7026aa6c155a883f19707f9dff9128f31d2d776a3fb69c5329e475a8d125d1fcb402fc76184e97a6e62ebc3e4cd2bfd03380f3ab7c93bcca2914aeb9176dfac7728d5fdabcd9897d3f750a925281661d128ddacbdea3f2ac9655a191e5d35fcffd8377217ac4f6886cc721501364cdffeb2c28edc5c4e0108d1b0b21edd17534c59d578b85ac282ba2bb2256349276db17abe2fd737d273617b8b7c405e6da6a08fbedd52531301bdcc11d3f16b58bb79b522cbb8272960462ad6c301b7b5d7a69eca2adf2d54dc9aa723313c5d279c3d02b958cb6829edb610d569135c5f8f20a0414b9026b71b60aa192de2c696cc69e745297b4f8d76fdabcfef04640b9429e52101445a035c7e2f1ad4539acc45f85bbfaafcb41b9efe6101303235d1bc8853ab641838f02668b225682c3e09c41f152f5d75e9eb49dd7e8779eaba4e37bf15f1a8802427a6bd8e39e1de89a197b86ccd014443320e4a3d9727910c78fb134cd9ec3ceea72dce210f4ad76188d162e0c5c3c96c85c7b2d6b3821f5047ee28e1f6f69f7b45fc6545573b7e2a5fca957c56206a63cbdf0603fb82041f5cee477923c564ea9af07286ed86e3e943cee5a2d698b2a4333dab1c7229c7491d66feee2e0848eb1120636e62120b2afe077f69d7b263cfd04ff9c4d4b4b4ebf3cb183c709b87de9ff3343b000fc37221fe657cc98e3ce9485356a1e8418609192f7d90983835d4979c9bd0d7a523df3cde629365b0d7759b136bf2ee9b7d062446738d6cfbc3592916fa6eb116055931cd03e37f01945829a34e9071ac774e9662ef637aaa4cb58d56fb1463c542c980b28409c446b7a54552f36deb2de0cdadcb569c21eaab54c4a12b626664fc7b7c15c33dda4e2ab5257bf3f4103d1c70bae78a72c1189ade4a82d6445ea3aee090279f86dfa5f95900eb578e3ecc7f8bedf183306404b0383a0c8de14e97a73c2e57e9bde4fe49ab9a2ee61c3899a92243bcbe433049188b79d56099f6e4517dc35021e1b89ec125167bfabdab78f248f624df6db61d592fbe98c881c301f3bcc3adf31567b5348c481d743905ea0b387f2b401a74d59291760434725db3fd4fc873ee50825da35d539437ab38c5a431cedb06635c9e79d5f9b74e61aec5959fdf01690fbaa7a7d5d45cfb1a9aca0925764b82c8bb0dbc12b1c01b56b16ce10667e52b42b3a5a2600713f7222c85808171a0cb23da9badbb8063fe18a17c3441c5f9c5fba8ed43dbe80007fe2940859f828a943d501105f59765294bcace4a9e30fba35dc9df7284ee6836187c3939027b4e4a142bf9ea49ea8991f80bac89f82121e9972b74ee91e4d6c6fac5f09e0ea48e1496b7e25f8c997f72db4fccdeb838e6acf5c4229e52d7778f8726d37c716b642c125d44b6b1a6b80030e9305a6d855e5fbfc522e7e84baa6180f0e1ab4320fdd5cc51fb3f42594489ebc886056040c449b94a87f875098bb34eba2b8c5220898e10386d6d109b0a3e6a4b7c00e7041130dfec6c0c3bb35aec83c87ed647d0edcafd3529672ff5427dbb4ddb04e4e626b309f7603fd8ccc12d18d9f36badcf107e98b4e42cd0d7e7a88de530c8f96eef6ffc0ee1eaa949f9677fbebcf354b719a0f64f6e06730f54fe30aecf06cbae992e431b52232cd450f7e2b8493ea3176cf508e6a444576332a81306b372f39e3aa2bfcb52ce21194a2027470661d1d034fe5952427df6368177d1a0c14c905fdf3d1ba8ec41c4d8a81cd843d937965284df5883880cba5dcc557090cd532081f34a545cd6454410ac6c49f76605f6b23ca11404896fa8f962b47d831d155201e7ab9a467423edbf3c7fd525d26906ae60ad49055c0eef4af769d5aa8da881810905c7c2738e04ab9ea8a46a743611543bd33c5fe85fb2f7716dbe2f0f14e58260ec6c191aafb5646d43463b69b13d710bafa7371790ec2b02b4895a56fbd0ba63938dc354b32b14a0b44a158d497c7de57f4e735943d7862fafec0cec211e6179132306f4dfef887db77ecdd2434a2c1bfffa211ff4af7913880545f8603d86035d3de414bf8608c447ca742a174d0e40ff708c7c6c067b5600ee58426645b03748d0edbacbe8b5792e1b3d91dea71a9f47a875bb8b37b9868af6f89450e4b5ea9827ec3a9d9817fcbbcfd4304dc86501e223349513e44a7bbd6c70303174f9a7c58049bb91663d7c951bb34b7ade53a3572f4820a9eb7dd6f3b8ef99d302ced5f20cbcd0e8a59c775983fef74f78dc97e883f7ca055dfa40a04e52f5598a292e034743833f68da7ba5d01d2638d1f8d5cdcd1728dffee93c74067eebe5c41db3d5f1a8b3a944dff4b9a6cb7a5c3b4061d7e923f07494d11f8d239839e460c6a605c3e781cd2e4d6422ead9316fc0b025d7c17ca8efd99ff1fd22673d5c9c7c281ece263ed09155db867b515fe840b0b2da3baf735c30d630fd02c12c5774bb6abec974cfc82bbf0f30d40076d310930ea8ab77934d353498d030ca8335ced0349dda6095501be53895e4444db71d774721a61e647471f2959a8bbb3dec2fd68e437d3af57021ca1c12febd5a551abf0d780c38c286ee6c0179a859a1b05ac0b1af7faf0055a9666543fb86da2a0baf954277fd91638d477d9a4d9f464bde6ee4715a07b2a14ebe5994fc8fc398c1655d1ca0a3aadf17a9361d71bab626ffaf204e0c9e909ad5cc989ed901115cb1ad7383d9744290fab5eb8bd22554be226bf6196728d24442fd2b1685d07581c26355c870ea550c1956b6ddbb0d357c3a2647660d751da5aba8ee5400a4e85cb39753213d9272289a3d47a7630f913818a6ddcbdf97ea4fa269999432109aaf249e1f4561b8bfdb2d313791753aacf0c300f1f951e8d21be5180ecf14ec5a668692d82f3274c49e7c9388eff9ec02bb3705845f044387afc1239b3a964ed5bd6f51631ae1fcd512c196c908d8b7e13461dc099e628e7cf72a877f93cb7a6023879cf08a86d154102416080efbf37b4f48da15121ac3ce2e9a13df55067b02954b61dc8cbe2fb0ea118ac1995e7558ffc0c44aa84f749120ed2d5b20130ffbe44baeaa6fa0ddd025b404c2808d77fd6daf0e4017e48e6fac1754f102c86b3b6acbf208c3f0008461f2d1b214ba7bc78bd1cb39780c2d747487759ce8cb1238c6fcbf09475f489b7f3b6e8d9b9ccefcd79618df33ebc2879b035412da9093098358218cfe015e7f81e2669c8b481d6474063a64283d92bcbaba7c2d75c4d567aff9d7896b55ca969c0ca6a70103041d2a2a15bffd1190ef98373c3f07f4c5ea74139df5b2a0301010fb7b2451a80321f0ddad0876b41303e9023b009b13843cc965561820b977b11a69d08a34169065fa06a9eecc6427fde7f36a8dc3e58080a4602bc146a05caef416d3e613b8ef5866bdd9a332bbad95ced5ec6031767ae6d78614ad093fb49a7903952e6efcac5d38029ac9d1c759015c834d292f3c882f0e7bf282753f289e952f53785e8552974837278f1944c18c0d3a8f4f92529d10ef8a7f05d98d602d53a480c3650c788eed4e96415075da71611619b4af653831965502c5ef6e6658df81b56da9d1b1557f63c3d37d36152b19e295e43e24e8aba40db5699360555fa8f85530f0d35019349114047d7b15d84803668848c76029e34bf56fc46db3be11625eb442c3f8c9dc66c6d028797233a6a911755e02265563d15931eed375c7574d833a212219b51d076b31502a105000cbb03805ba204f5228e9e019d2071acb382c8dd0db22402d992a1a4e1b4dc2c88af3d6d80c58a7b1d123286c8dd37122b1ce1984d2c21c38cdfea082479943493f9f73d87813e016d42d5e256fbb5eae0f9ec925ed3d508a0aa1ea889bbbe952b785c4e48876b706e9a2a19b84f8e95006eb8bba52129b02b8aec730b55060960ca38a99f2100e54f64d994a9e88d17710b654db4d3e47d937a66bc99b3a68d0a51d0806c822dff74a515d89a0c32b253670af42cd0dc94e39160b1c4f753a1fe1897da88146f94aafbcbd19212d0305ff09c86a80eb3da9445a6418c7714102f34ad62e1251f285b87f182deb75763913d6f0bb4291312914a7960287f4c54711a4267e2d0c6b3bc822feddb41c21be1c56bb54b439e72afc312ba848368f1ee4510f605d9f66aa28d99b7eec5a568af5cfe17aed2d802789ab1676be11c1c1a11bfbdfc92fd35e0bf80cfb41a36f801a638ab43fb1196db9cd405f38d4422e5a902f403d1d50f7473936be0b2fd96523621393372ad477d699241ed016bb11886c372e726d22048080cd4b9b89e138b5ad0efd103f571de7124f8a5d3cd93dcaaac8696d0c1268ec0ab0651ffefcf8b2141def7936c4bcf68576c9d0c1d3d52839542c9e7a58f76924bd2b0d44c8c78823fe1bc3a51b4e648ebe71aa63b96cdc748308131605133ffcea9247bee13c7c7aac23b8fea6fc2dbf6e7939c3409e948c2afdf8d05f210c4dbc9d61352e6e286f21a4c4ad23ed29764bbe670405bee4b747e2b9e0cd2a8d78e942f82019021552424ae6669abbefb8e1d85e339404626ccb227b038844b483a43dad591d13bcf394f72c85422b99765d18624e062aa0141ee168d137a265848c3293bcee3bbb2cd2b0ffe2c403dc0fbe050b40ecc5203e4f9ea2dcf7c6056f7760a446ef1531af978b53916947c4cb8cb0a40f02c47cb3f3aa86080eaeba42c48e069e4d9f441aee03c4c279d5aea619f7a55c4b6bca9776bbcfde66c336ea41ece31c2138819bfd4e2c97ab85c54d8f7854ae4a3a9cb0f11760c5db7cf796d7505e6ac3e857301fd72142b22e44254a30003ad5f54f2d73d6b7bc1c4852ac1055ad31370f35901385d9b39f614adc3de81ca6dcf2894034b71a9e1889f7a7a151cbde4a53ba7ded688aeecc64018c059c295f0fb89536bd04cd9459644c7b2cd7ce95109682348651895ea2ad0c09f68a4b9a49ed45f5cff54edb88998c5ced3439606684f92f3a21b0807dd280f55de8c8bb1d0a30162557b799512e34f7eab80cca92d2251e7b8d1ee1a91845dfc00ac48354460f7bb858764ff0c10fd9d1c5048fdfb06ef6fa2220cf4fe69ed8f89e726402bef7bb487a9b807dcf63e149ed1e4183274aa2c9a736fa89f6922dad52e4ba00be95cbf403908f9d11b4635c5d16bcd1cfb2daaeba233e8c29c3e436302963193f59fd70289fda14dda8851ac8b2212cf1f6383f2917870a97fd63e0f774d5ab8897b3ed235a16f033242af05fbfffc28de55f027e610aeb3689d6158a203e3fe99296115f866d95c67773e2880b9771a241f1bce386a04dbc90473dca89825f5fc21cf04f22dd18fa8e24fc17a6d05eef23a1500415215809593d7aca03879c4a2792541cfa5796be98ba94a9d4034561d39bd7a9c3bd9c34e4759bee21911bf3b2472d2c572c2602dd067d1a70108f306f8e904ec6482749cb0711e49bdd361a1afd9ab286ea4c701952ead521034f06ed900e583743782ed438ad9b56f8cb99565d2842ee803b1d40819175857799688758bd085a0b82bda3c77f2d04fa422afcb479f692ed302a4568046c2c8cc0590cfd54d264eb45556753d48ed19a2bbde806021810df590a2305a9fc06ed999d3eb316c5f3633737b09390229dd2864d11bef9af74c4b3bcb5d9fc22ed8d3bdd3275318657488f2f55fd374fe0d6c12739a0d763f694b8c1e3b452f32281945cd8ed0756d11285826feb466e7c32a8a996470d1f4092e22e6035a293c45afecb5622d919c95180e4b8b20e03d160e0b6d054fa7691478045d127f54f35ec2521aef050355ca271f2c631b75233860ee6f1806ef6fa39c98553cc6740abedd91037cf7646593bb3cf4aec303e3a18945b30ff2b1e9f52f12fa571143f99a5b4e7dd0d46fc1b9abf9398d87fc0dfd601b6d2c11917414050cc46bcd9b59b369022fa32b98d78fb2127733552f2eef05eec636385d013c6196f2edffb4beb5ec666cbb50369d6d0c4ecb8c8aca77e54f9bf4e2b888bce7cc43de80dd21d4f2ac35de84005636b52804dbbdcecb10d859100916f31e46930ee6d5751575fe6a05c6a1e4a2835afc432a26df3c518a2870e35515a8e42655570a3c471472e2576330b6bc7f2e18e8cd0ca6ba9d7776674b45fcbe42cc44cc89ffdac9092d2377f6549255d0c17493fe1b342061e3e6e644a155b1a8764303d2dc8940a194bd70044dc7c7dbacb8a5ac7412bfa485f86a0e81af03075d41517b2c790a54e015e48b179b2878b05f7b2ef5d6f0317cd56e391a41d5b8b850323d4d8a79a77d68b8dd880c58ffdfc2a8f4569460e9f1aaa062824f23fc53284dd272519e052e01df617c1c878f150481fe006c0e3e33f97cb75118d398b04e2a12b4ec2ca10d8a78c87f1e3a591507b9460231e2b35ee652a3d22b13edb820ca5124bcffe901fdf2fa0582cfc1968eacf30ed3ed6e5d4d81f43d75884ab5f9ef6f4fe5c16572e8fb2c6163e244b595f5ed6c3ef79c8e5ad7db3e74156f586e7e4190c7229e9a0ca02eab062a049fed51bcc355e73ecfec2cf79786ab48158cb0135f7c47d45e868d053c8b9d0567701e802bb1522029584bae9700c5c256ccfcf31e8450efb1f9b7865a232588509ef004494c4fe068cda667f9f4d759d449739cab5c5153697c0f3af8c817d75fb47aa6e08e144d80503830951938fa401175121a5d81142bac58d0a0004fb939e6f787f99b361777036c1f406e27c7fd63d78d41bd5e55d1eb9e05c2e18edc5d8bc7a74bff17f95a2efd99ba6a07d1e63b83d8f9d5bfd6e377bd2766067aeb3c32f00ded9bb6cbb92b59fed31acdb387a964024cc58945366c88c4f940b93a930945c7ec7928422c407890c1da9efd3765ac97e18d7ee5d8325a14abfa88f25880f5c4fffdc6454f12f2c4075151c280dee27f995845c544d9d739eb9b8950ce467862199a18bd9a988c0459f5e70ac31837d74782018fbd5f82f57430e15cfaf7976cb80bc2dc4bdbe09af0ff0a8a7ec21be815bebdc585cd5fbdc10ec412cc87ffd99e7ac2cebdd742875506efd67bf0333cc1311e577c2526e99d509c1b565be149a9af54a25e4c808bae7725ef140805d37f925da885c2ebb1682a9e2c437346a0d3f1d477b7e87b79c5fe2c183297d3fbc9571d09148056ce50884585b9e25292df5114c76522435461fe67ceb68a8ecf70e1f5ff2ce4d3dd05916f6dcdd605aec1cc75925da12410296a20b5946cf8d02ccba3a06ee301c6af6f8b037081c0bcc97c0a4b3782dffd4cb020e6cc5de0d3960ee24850300c3300cc3300cc3300cc330cc0c62f2f80a6565e7cea921084644ae5a725352524a7b3a33f33b7807efe01dbc036ceb993d7501960d150ea40d564c66b895f058be4284182d3c9a554978b429bb673cdf9853a34878ec5615ee667b726c7e844731946afc86c4c85a8c708a64b750d58e2421c533d687b0bbd49a669f223c88cfda317b8e73579d666106111eebe60cae6ee12a4a4f9c3063088f925dd548b672ddcf1f3043080f6ab5ebda42f36f8c7c6146101ec69c2e8f884a0e1f24ab85194078d09e6637a31371ff52112accf8c1c330162eb9dc569c18e9e898e183c7a12fe4fbf83939d2f7e071ff77da488b7cad98193c78f07be1b536f51d3c524f56e735a365e199a103e6543452b624594faf2adfc9697d53764c4566e4e0f1453cb71cf14eb276191d370aad093370d08fae75fae56ac60d1e7bb69f2c1dde3da5ec0766d8e051ed5cb62c6d7d99cf8c1a1013613a233224648fcf8c48f1235b4a7911fb0c1a3ca89826a3844a15579f8c1c29e8822900821b2dd86216c67495885b6849900ac958b0852c1ed6fbb778bb44876fb788c5e3099772c27bda5ce9b680c503fff5cf17f25262555bbce24148bb34616bb5354f5cf1f8e35c0e3984d120a16ac583b6efd9107a2b39c4acb0dc22c7a8878c584bb465554f8bab57f130453658450f975f2b466ea8e2a14996f8887153468eb6400cb648c5032f97ccd59d96732f375eb0052a1e8fef6c98cfb673ae9241c691c147d8e2148f3ba2c414bb9bef41bbaac216a678ecd94387a9ea4921c6b628c56397f655cb48215619842d48f1a8dba7fbc37898b0e3281e6f5beea8d1efa3b76f218a07dba97621f87a9c5f56842d42f128ad84f03987f8fb39dd81e29156cea8125fbdadfc271ea5fab4d7ee6984683df1a87427bfe4a810c3443bf12085a8ee12d593e5e471e25104d74e99420e57fd89b1c5261e788a15fcc25b67b657138f3b67b5465b6c4fe9cb2d32416ccac45b857bc65bb5c51cd33031e6d818130f6223a43ba64cbbbbb9c423cdbfdb0fbe251efe7fd7258bb2939256e2716cf024d6173dcfb808d882128fc4c2a65524939a0fc1b1753589877ab1551d27f37ce91d1d1d1da602622a30309c0547842d24f1e85c52887def6efdec6e0eb688c4438f285b21939ae3d286842d20f138523796a5f0ce212f5b3ce2c185fe988cfd0beb9b32c8f8325a023bd8c2118f27a64ae91f3776421ec7160e325230066b92a200086e28608b463cd25f0b9373fec4d58e110f4cff72f6a486f1202ee2715b9ff8c7e9a5c95d110f3f65980f393f294f9d8887d16b79d1217cca6a41c403cf3ccd48414acc3ac4e9e1d69145ba5244be5c52c85031255a8cc133c463bd0b6bb7163f84cb16e2f14bd0898bf611e218cf8c4d09d92d72cb9a6530ad982ed7ade3413c48f3d46d11726a9bf0d1d1832d04f1d82fdc63d47ee55149201e56a730293e53b7d20b8847b9f1f99376d43a2dfff0382a9f679eddce67a21f1e65f5c6b4f1d1dd89f5e1719abc8f49bee2c3230939ba9bc489e377efe1d179d7dd66a81019737ad8bbccb2aa3245b554c5435c92979f4e1e1e66efdfd45b8f0871f160a49a4ad492ec8a90b4f5542ba7f61c5b2b6deef0289bfec69311bdab68478731610b3b3cca8fe616ed2c639584b7a8c343dd0b29bf4416bf3e8f0e0f3f5cae943b6c48b9b866d8620e8f3dfcfb255a2f25cfb790c3c35ccd2d9553bdacc5e3f03868ce50e79dbbbc3d7078b0996e99dd34b4e4cd1b1e2791d87c65163c2774c3a17215c1345a53228beacb78fb870c612c6bc3633f9fa87b1ba2e4ccb3e1e198da59ae7cf9d2e6890eb658c3a394fa357ffdf33f3c8a5ba8e1415ed8d3f0922c64d37ba360b0451a1e87dc0db1edfc334986068247ae788f1899356dc9779f95b3de3de5d0191e9accaec7b419e5c2648687fe9fab1d3d63fbe86400618b323c9a1c424c2695a9c54c86c761ed77bbd3ed92c6c6a086cc9bb848799776d2f64a97d26aab181ec546c6786af0c8f59710b608c3c39c5b9fb090e91bd22dc0f0f8a2c47f8b133de4a87ce1d15b87ec41d53dc9d95b78e1d1c856656f9d68b1fd2e3cf2381fc92c35170816deb19d25dfa5e2ae69f79ac63c844a6eb105c4653b3422b7b89c64568a41928f498cb40ac716f1c0165a7850a1391f52f53d3734822db2f0e8c6db7e737ccda6e01658787cb24927799b26e90cc7961865dc40cb01061897038c076c7185473bc9efe5e2988c87a9cab085151e546788d92b569427b9a3a3a3836f54d556e1410e12cec3fe3f6f8e5b50e18145e65ab989d08b932da6f0a034f2bb7a474a4b670b29546d31d1d169da55297d0ed2ef9b39bf5b44e1f1b5a71d4d6d31a7f840e1d16cd60ce2d9273cbafc3f6e27793abbe38487e979573f67e98b936fc2838ecbd9f5dcc12e263c8eb1c526a4ed944367090fe2c59c729a18322689121e4444934fae1a423a9384872ef173f7d5e3690a121e862056192e4b2ccbfc088f6316d3ec695761a6628487b13a246ef98e27b9088f3366688ba1ed296f447838ff597b4e2d85aa7a088f4b5d2634a51c2a7b2c8487d59751c75cc6624282f038e36cb4ae20c1520f8407b9659225a325d3fa078f3f6222443f063b6b7df06844639be689def47af020c5d91053a8e8799bf2e0818f58db7acd5508e70e1ef7488c55e6beee16d4c1a3c8909ed3b577799f8307133e55bca49aa63878984d735d2feea8a93778241fbaffab4adaaeb3c1c3dd10a94de921cc5d8347a9fb4e26799d4eb5050d1efde5d4f12d6ce508d92c1ea4f3d4a331248cc665f150afa47436456d4b158b47b9ffcda62579f98564a0052c1e65aedd18d7a35bbe9648d0e2150f439e3c7182e4f3d5cebae2515d788efa1ad2cf4bad7868aeb13a6587a5f30dc7967674182b1e96a73193ebf60d49d762158fa3e4f909b1d4f3e4a9e2c19b6c9efd7a11bb3d158f3af3dc563ac69cb2848a47eeabb2e1dfd3a5774ff1206eb2b3666e27e43405b21122248d94557309315653e76acf15a9ab29c583900cede8d450973ea4785019aa576fe234877e140fae72dbc844cfb92ea2789831e1a52d265a8a43f1f85d2d4cceec152a6740f130eb273a628cb497ffc423ad10955af51efb754f3cea1791d0152c65dc3bf1c02297fdf745ed9039f1702f85490fa33ada6ee2d1f666f6dcfeda9c9a781873687a5ef29b0c33f1b0f37a9265a84bf9154c3cbe8b9eb8ddb256f94b3c08493f75ac8576642df1784bb39d5ccc1d31ec4a3cfef056d9b6d3c6e650e271a649d25663ded9328947492e67049f0b99839278d49e2684d84c9f458bc4e399cdceb1cccb27241e9d9c5ab21861f72af28887bebb65b3392c7c7c1df140cd765e7f2c5579b4110fdb2b3c7f4e15ee6632e2e1d879d6c81f97abb388072b9965b655621b453c4c9f562e5e3f79d824e251d4dbd9e51436f342443cd454e539789857eb1ce2e1f64d4acf512bec37c46397a0bbbe9e9ff2778578f8a15bbc62ce611e1b211ec686cca57997b3c683789c53debb143ba1bf15c4c34a5ad731669970410ac443094b73f7b49f7d22403c7ef9d02793f387cf94053060010970a129d0e20f0f7b54420c9b3666274947470702410b3f3cce161d93a5d7d851a93e3cc83d17c5c3f6857c90065af0e1815ba9f9445dbe9de81e1e79f577081716d619d2431224678c5489ac04f9b20c15835bd64fb2de3e0f8fc7567aef3b58b0533b3a00c0042df0f0288b4b58479d7c6fd61d1e65b8ccf8aba53945b20359434656254a08990962b5413f5f8ec5e7ebf0e0d2ebee2bdf48a80e1d1e9de57389743f933ecee171bca09bd284fec465f9466117b490c38309d31e2ed66437fb3b3af84651a914b488c3e3cfd1fa91d270d314c7d61bf5373ad0020e8f5293248b8c216925cf1b1e574be8c4288d8d1f71c3a3b09426ce8384a8b85f86181ce8e8e8d0363cfa8fa9acb071c343920d8fccb3c376ca7e9d4c5ac383f0dc948a57099f1c353c2e49b7becce9dcd36920645cb76b453295915cb5319ed152a85c6616343cbe300d7d9b7316b94f47c7dea8d4e20c0f2759140b294b8e9498412dab128dcd98334b8f1cea2d3158dc448924025a9481880fc921b26e61729191e2d4e610212a4e9e6f10323c38d794bafe24a60d95586580f5b418c3835839474eaaea74766789e161f2103ee98d67b5c49002b408c3a38db2ccb2993da60de3d8c26280166078a4f12c8714c7c62afd1aa0a2d22f3cbccf216cb25488bc5e0b2ff0a62996f2e99911b22c79b2cbb1a0115b2dbaf030c36c9c8ed118aba8165c7898b3a7f0a12b738a12fe18376e500004373ab4d8c2c34feab1adc6a23c5c5f9c8480165a78609e2b346b0e963c2510e38b7380165978e8396edebd6c3fdb2c8ead15430288852c44dc4ba4535e24c6899a5a6e557e5954c997a0046248600c3128d0d1510231bec81b5a5ce1d16769cb5a485d3391d649a500086e70a18515989cd26d2621c3b422d36b939fc4f9c5f3088ebd1c658c71ae45151eed85687b2925defa440119c8004b8016547824ae21c6f78dfda7508c32540c0d941653789c41acde2bff89a88b638b1830c4c8c1808e8ef227230b5a48e1914c6eddfcb53ee9d90cfc023a3a3a12d0d1f16178714e7345418b283cce9ce73c53acc87410c7d60d2719381d1d9a76026a82165078ac39524a21b1662c261c5bba012d9ef028f8754f885ec9415330a085131e6aec9cff21ba737785634b8c326e9041aa68d184071f73a6fc95e3434bc3b1f52ef0823da005131e796dde943dd5265e65090fb62f56c688641829b8615b6a2ca0ba718a4ad34e801400c10da385121ec58e8f2945bf88b1cd8116497894425d8ebcdcaccac9121f68818487ffeda51fea312bdfbd512dd0e2080f32ec734467c9339f43812fbef0a2e4780b74747474500004377268618407ad7a7bae6bf44beb85876b799ecba2edc2a39f4db9399ba67246b9f05052f6cc793a6a4c31ddc2e3fa0e8f617e412f522d3cf0f89967323d2c77b2f0e083a7b64d21e48b9dc4c243b1689dbe7426d692577818cba2bda79419ce925678f8d1bbd36ec6f9bfb30a8ff3f55bbcca1d82a4930a0f254d8a12cb523ae7710a0f32c5d7ed8f5d9736288587532f129377a75310a3f03082afc7d869443f43283cb44ba67739854f78249e619ddb9bcb73ce090f2b4ce70b8f56d5fd9af058c5ed72b62459c2e498f07082ba6c36dbf534de12c833e17be3fd4a789cee2fc6c8a13e69121e7da79435fcc6889c22e171c6b8f1ef3ac6fcc98ef068632a74b8a6f9b218e181a7c894fa315ba6b18af0e02ef3e9955b7dfe88f0502dbf7c9cb199a081d161200b02308447f1c53455b5a4d0f011c2438ffa9466cdb2dd27088fd45e93494c962dae40789cc2560ac172de10b5ffc183d9afdc1729dda78c0f1efbced54ace10de951e3caa2e0fcdfa1d9b230f1e64d90b12655e3a7f66070f5d36623cafd0493b3a78ac51fb5323847ed7397830a39735ed8ec5cf3878bce974f3db764e29e4068fdd5388613dea01b0c1038bedbf63b1fe52d003508387a36dee61d9cf2ae701a0c1034951d27c0a9114e9328b476b5d1f6a559f1a17593ccec8641bbe3ee9c54a2c1e58949c147a762a4f05168f529890ff1afbc978bfe2f1c6cf7feb38aa166e573cca71bd1fdb9a1892dd8ac757d936f665fdb45e973f2419eb8ead57f1b0f65b2ceac2aa78fc9561af7c3dd72b9c8a87fa1d35c5b3dd549951f14864a62e322a9cb47c8ac751c2761eeb138d934df128b5372d77dabd9d90523ccc9b5cd69b35e6104248f1a8824d0c972a69fe8d8ce261d48e915136c775cf8ae2c18d7fb4e8ec4f63d9503c347d8f08c1726fa717148fe3a6a989dfb296a3fdc4c3cd55671177f5c4831d99499577fbcab4138ff35e5f12f3cf9a3e39f12857659c95ce946be5261e5f8ae97952b07c1aa5261e68548a31724f4276ccc4c3cb9725264ddae71862e261ac9b68bf59beef5ce25184bec9494b65fbb7c4839b88d4514d3a84f855e2e18c485f2ebfc8c91d251eaaa85bfc46fb9cab9bc423f1dfaca2be9daa3a493c0ccbfe8cbaa5bdd145e251b889f98c6369276b90781cd462d48c8d17535f8f787c419288667b9e982e473c38cf21f556e4bc1656231e44d5dc5c214a42be8a110f33aa653efdbd8807d17bad2cc498b3f88a781872cc286f9ba95226118fe47dd32f82c4543b221ee669f609addbb3ec100fdd353cae974b5988706c71a18106b48086211e470f65fe41e386f544a3100f4b2d858e654bc93727847834b32147346ccec1231bc44311b5c84a9f90d1c569c1031a82f0452264e78aba2c391d6804e2914488581e7cb632ef38b6c01023c7e9e800438c1c0c20e3040d40281ab6abaa5ef532e40fa6bebf4c127fb224e687d5d35884a788dc08c7d60d626fa0d187872975ba9a7df3e181687d48b27599f247f6f0c083c673f708652515ebe1e14dec0ccf1bef5d749387c791b367e490daa654a335a0818707a1dc563b5cb61096dee1a105b33c33fe196262767850fb59f67e936a57a80e0f3f723f3a3cda3c9d52e2a61cc94238b656d0396e94f125d88f408e8e0e42630e8f32a43c15c278e6e8df5841e72093c383d99075439857c8d0e0d8225507a0118787c95b2cacdecf4b8c83910230bc60414fc0ac0b1a7078942cae5628db94a4d712dc8d06d078c3c374f37a33911fd257702c7519bd808e8e1c6080d1d14146e7680bd070c383fc0d3fcfeab5081b1c5b37c600c3ef8b2fc600a30b0b581b1ef7654e31672d49e816c71619ef45757488713a3a6640830d0fa64e63d01ccb6fe342630d0f2bc56ab4e85c282fcd021d1d6380e124a0a186c7391297713ae52c250781461a1e574841fe72d77f751a0d0f354ff2ad689269ebdea0718647f97d9fb3b4246574cdf0284a49eefe0fd7efb1400c0574749867811865739431c60968948199b1d87c41828839ca18e30b1a64203b5cd44b563a3ac4301d1d1d1de78631ddd1e145e7d0005b8e32c6d0a21234c650fe49bf41e2a59cb50ac38b2ea3838c5640268286181ed954949863b4e0d8522e34d0002e3a6c0a34c240c54ba15399c907cb8381d728cb9bd32fd429458e70ae1e29e88523e727dbf8701e5238b6b8309b022ec0f00207191d2ae0a26c0ab8202c83461776515997f44857099b66113c59e46c48192900839491820984c180c4000d2e3c944c29e5b9e23c6647041a5b7828ddaee97a271a5a78b899aea2249dcfb1a92fbee82ef646e10d6864e1c1c75bf828cf98ff452c3cb819cf629242b2147108d0b8c2e31f75fd8e689737476858e1d1df77f07091535b2d1a5578105e536affe54bc3a4410565724b54319369991593f459f434d4439ac6141e9fb7e4949f472fb7dd1b95258587a124f54dde09bfd9a611854729588871ce36b8fcad690ee8e820830614081e662edfe6e26191dd5fc35b358639bf0d8d273cb698aa3df3e212e448808d8186131ec6d4699739f1bd53da84479d3597924f9c10bded1c6d0116d060c2c376dd93d8595a19a2b184c793cc2bc7542a9d2a053494f0a8cb52ed65d67e88ae4978107286c759afac9e5c1a4878f0913379da8677f53f07348ef03843e7d10a734f9d27ff39ca281d1d52a0618407eb7f2934b7691acf4cd740a3088f2e99eac75f18bd3c13e1c188a6b06931c6499eac82038d213c887d1ddfa3c87bedfcc5172960404707193484f028c448a2e163e5c66ffc09ba8c2d321a41781c1f63de94cc9cbe34094835d000c216de662d12422458b65984d69c473a6dce9740e3078fac2ac7ffc520394caca3e346e56036d0f0c1a39c37afeddca75dbfb3078f2ada7d68f9f7f10a7381060f1eae7ec4bb883d06183970201a68ece0d1e8a46d8baa461d3dc723011d1d6380910347470705407043063474f030e24c46fcb4a99e42326e501180460e1e4f59fcfee819061a3878786f9662a690d27fea1b3cf2f4b79ddfe7f7cda36183c79b7c53b72fd5d1e145951d68d4e0a1467ef11cab1843c65fe01e68d0e0519b65b656bdf74bdbe661c62c1e4a487e91ab5358e5080362862c1e8644e457db0be9c38c583ca8b71c2576536bf7670c3052d0d141c6002305078b8711f565154436784add1966bce2519f568892adc156f40e00a461862b1eff4afe599f10de7307c7566e2b1ecb66094f22da1b52c69371832c03a408192598c18a477b236da1e6a7c27356f138fe44d0efc9965a7254f15837c386bfe8a4e271d0a095553e75bedda0e2917567edb39cfdd5f4291e87cd15ed3683a6c56c8a87f392a731a75c96d35a8a07b61273a47b39733b49f1f0d46afcb5cb513c3489981d334f5c9e45f13075b3ea4cf86c9060281e86c9af21720e0b3187a078742b2691ec2a5f46ef138f3786cc14591126a4cc138fd2e6deb44e1a154975e271da931462670aa163c589c73ab92742ce59737fdac4c39314356f6f73469134f12832744a3f87348f31138f439d56bc13d39cb2c7c4c32cf997363df3fdd29778d4f96563fc349de5434b3cf29c767aba1aae5d251e5df7b68b07f7ca314a14e1228410dd1561e3c3a3f244b0d0de241ea4b8ee5739766ab77310982189079baec66afe3beec68b1ee30619bd7ca30c31be20838a023322f1e824a7d39c25fe4774c9166640e261dc9bac2fc94e007361c6231e7a841091e33637a5d6d1e18887e131e428335331c982c771c30b2f9c8cbe21461956fa98d188876e652529e5d41893ce8847a63164cc1533fe935ec4838b09af8fa9b41ac38a78e4f113295e1f054070038c1989781c66164daff32df3d9d15175a3cee63003110f53bededb88a72ab93bc443ab8fb3cb1b437b57433c8891e73c2a8ddf5438a3108fd723af646c959d8710ac589c7b956aa65edc2897434ffd7b3988d7376744bc94abc7c4b1250873c892631708d2f4488a775f13c3b1d56390417a0620504fcfa2d1a9433982197fa02cb66ececbf08311f2e221136526b64b464d88be501f7b738763cbaa025d7031012e3420012e16701686170d861846950220b87166f4e151c538791f5623e64cb31866f0e1b1ef48ea97478adea51aefe1c19559d8989ea9e1e233f4f0c054f35acc5b694d7e1c5b61fc1737c408e3463160461e1e49f6989db4f62ce5e3e171a81731c9cb8efb913b3cd00c3ff219113b3c94c821a58cb13c225287475127568c59737de7960e0f6572dd4aba5f8eca1c1ec496ded8c93e49e66e861c1edc6fde0bf2f329a4d754601c8787c1bbf4bbc3cfb62c4898018787f596aec3c3adb7e40d0f2ec5c9c8bcb17337e700175d7011012e3420012ed80d0f525ab6b6d8d0b618d38687b17a25598b7986c829e333c05098c186c765294be6483b1663f6d6f0383df276c434ff9442ae30430d0f2647879c494fed3ad98f23016234200d8f37a7756fbc9efefce11366a0e191e75aa428cb9d5a2e499871860733c97cd2b2c7f69c69418e32c27898e141b0b815914290ecb4c1f0a2bfe8820933caf0587e454d731abb68891e6106191e869463b4710fbb75d1cf21461746983186c7b1e3e2738cdbf9c4d628cc10c34371fb9ccd36fece3f1c5b37b2140333c2f0a072b386cb4aca559e1960789c82c72a3f55ed304d03667ce1e164fe65eddde6cf94171ea69c6347339f57f6ae0b2ebad016cce8c283ca1b627a0c9ba122c554b084195c789c49c2e54bf1cc10276598b18587d27a1635fa3b671621c20c2d3c8ec125cb87f3934f37c131ccc8c263f988a93ec6947afbc718a3af4c05c65878987174e2dd855817c61957786c3168fa4f1ab7c2c3d7a910ddeafbd66a151e26df508b97b3c778e9195478b4d9528ed8f790459f3185c7215dd659cb758d9d33a4f0384944ceb8591e2b3a33a2f0d8d6b355b8a457e0dd8b2f325086170a5800606106141ea4581e269ac783559ef02852d6424cc5ff701a273cd6184d74c3ebc708e1263c982cf136e4bc61a35e263cc81e7ef2678f4b789ce3bcdf13c73c22b460f124863bf9efb9e8c2ea46a57bb154881a8778545e6176d2799bfd5c4da86188479a82548708259bc95a428d423c92adce314cc848a74e884761a66edfa26b984d837894d7e1663a9f201ee8ec5728cf14e13e4ac0faa146201e6a06b3885ec13eead38004b8b04022256a00e2c1774da447e5db4ea1cf400e30c038c2841a7f7814266888de467e860a175d70c145175c70a1010970a175a3f41135fcf0b0c2438ae6e634b12a7d785cb617454a439289910f469acf3985c8df1e1e64fe9f87d4bca1d943c4302920a3861e1e6b9568699a983365c545175c28808b2e4ae0051937ea0d35f2f028c94d0aeb5936556af1f0282a7fd618bbd25cd2eef058e277e45436ed8c8fcbae50c30e0f92fd7886f8f1575b52878797f39bbebe8abd5574789cbff9f543ec18b6b1393c901c914dbed52786550e8fc33a23e4e6260e0f32774a5f39e1db2c85c323d78f1abcdc32dc85def030546fcf7256cdbb9a1b1e75b6b7dd74fe270fb5e161f9c77b8a1939eecf860741d3660fdb0cbda1b386477e534125c75f0d0fac2f22a7d7fc2b95a6e191e6ace953cc9432278f86c71f3be43c1b62ae8afb0c8f3bc795fc13c1abf254b55bc30c0f36652cefab2dc3c394839978a8d5387591c1fa851a64785cf213af2e8364996c8d313cfa18b91834252fc618171a90001774a82186071b2e9b85942e0f86171aa836d408c3e31c42744a2cb71c7ad500c3c30ee6c12b5bcabdfcc2a35a990cf79766a0a3c35f0537cc9320d4f0c243d7dcaf0e9ad3a985886152b05d789ce543e9b5468c2919629c047c592e3ccafce99c1472e7bedb0b25d4d8c2922a3662764b76a4f6eef493162aeb59a8487b3146777468400b35b4f060cc5c762dc20f08438c2f7e50230b0f2b5373ee24f9bd7952030b8fc6e27272cea5af51ac7185879edd19d324b39bb0c410a31010d4b0c2e3d68bd27359fce23755789c3b1397c9dc5cb7b64b4152000437ba06151e8686c8cddea19bc62629d0a400086e78a0c6141ea658af0fe6e19de7ee400d293cd6bcd9dd193e3f3f51781cc5aa6247f15c4183507890e1eb97ea2e89ba77a3c6138e8e8d146ba98cd808d9d3c25b4354d9d3108ef522471937c620a3d606359cf0d8e38ea5dc1d39ad669af030849c8fe79573e57d0aa8c1840721d2ecdb7d4ae1795fc2c32db176d19c63ca9495f0c8e52247e7298f31ac49787065172fd7ccc65b8784076127ecc708b106d438c2231b93bd8c715debb8111e4ce896cfe35162d95f8407d93aa78484cf97b310e18105cbee71e2437854a3617a1d43213cae7c9db63abd75ee9c1a41787856162b6eb0f9ba4f0d203c0e8b20396a56cb293d357ef0d0c52a6a8a4b15f57c0d1f3cd8aecd293a2ee13b5fa3078f7f4663f4ce9f256ebe060f1e646aecbd55eefc97afb18347fa29e213f4d2a8e56be8e0c148a83ca2725e6d7f8d1c3cf498d24af86ce9ec7e0d1c3c90ce5031f5bcdaeed7b8c1e389dcb1ee972d0b7e0d1b3cdc4e49eb7d2235685fa3068f425807cf715248d94d0d1a3cc8bc9a22e4680cabcd2c1e549c858c27b6e963238b0719f24ef486b19847138b0729bad934a47ceba381c5a3e0ee36ff9942becfbce2e1cfb56b45df6ac5dd158fa2458ce5d2d05bb1b7e24169465c8a1267c583b5fbd40aeb70ad7c150f25fc5eaed4fad32945150fb236673a33de854b49c5c39ce262b48a1f378614543cd4506ffb8c6162c895533cda98fd35d7b95ff48a291e4f674966fe1fb3ed5d8a07f329859e4489f4dba47898ae21754ea31deaed513c0cfb1d36c4f5b41a5b140fc653f8c8143625b53a140f3d9a5669a8e9785383e251869af45b492d67a93ff120c374f09464f3c483cb887ae5b1dd3d853bf160d6b28614c2a5fc2e73e251cfc6c8c1423c4f296fe271c5ba7871dd344a644d3cc895e12eab52c8e671261e6a5584f5183e764e08261eb5bd49ca609954477289c772933f986e7e478b58e271250f2d39778a3b7f2bf1208592bcca2b57cd2c251ec59075ca3f7d26bb77120ff7753526ad3adb6a25f1d8ef3d26e5c60c9347e2f18c26abafb442e2a16fcd89e690d222ad8f7814b5345d4ae66f3156473cb28a952f7859bed46a231e04ebc9a9d75e4c4765c483f4cb2f153e9e82a88b78186a697736869a6ca9221e07fd997dcb49c4037591ed28a97daf47c4e39a2cf2112fcdb2928778b0a3f39a69bef28f6988c7494c2ced6de3442f0bf1602b4d3ec9f4398e9484786cc9ba6562a43a6306f1b8b34786be89088911c423f174f277bb39e51d88471f33449a9c45520a01c4a39053ce2859a3d6b47f789c96329f5844f0bca21f1ec7d86f179a4e62c73e3c34a99dccd0ff20413e3cac8d1fa3314c90c9ede18166cd31215762585df4f058275c4eb91ee6e1d1c4f927ff4f2ae5211e1ea51044248ed74a4ce11d1e6d2e3b897423e93c7678b492f4429e7578d8ea712f788c389dd3e1610e234933560a9d95393cec609d2f5f7d7278182a73c2c21c87876fe9a93b6ed68d091c1ee7781e67e53ff784dc1b1ec4546989f36b2147cf0d0f37bf460babe35fe3b5e161ca21c4b5bd0ee9bd63c363bb5497fec89b7eb386c77efad159d2588a460d8f6f93c4aad3cc8b7b1a1ea47e8df6bed1f0e8ccf5574ed2fb6e3bc3234f317c95570c1566333c8cdad831c4c927b596e1619f557866d664789c3e426a9bc929d38de1d167f30cb962a92513c3e34aa1342f2a0bc3f2af99af9619303c528b75995c77c3f55f78b031632fe7168fbf292f3c704fb59727a6d2d34f171ec859d54de427f74a71e1e1eab8554ef95bb35a5b78789e9b2921450e374b0b8f5d763b37de2c3cd8faf4f15635967a58782415329cfc5e67577585479f7aa925b676fb5678543183ecbfe4f5b70a0ff37f481926a9afe65478a81754fba436549f5378ec3947ddef9f8a05a5f0e0f2e6be986ced49237f15dc1040141e06c9a5297c7c79df8d632bf1100280c243b9fcf1cae37d7792706c9d71e04b2be04b17267606013ce1c179c5bdc6deb41d0dc7963142004e787c62dbb691d52b4c0a8e2d1384009af060def4bf2dae052b1dc7d60d2c2e34d0802eba280e747478314602728031811c608071841000131ee474ae7293d2667f1d1d2b780f438c305a5086171d1d1d1d1d1d647c175c74711ed0d131810d7474dce822c77774b817ca0105dcc821c6b9f185bfe9e8c8f16c36e42080253ce8c82337d3614aee52411080121e85aa7c129ab9262b9a84c76127e729dd0e121e5558a6ce933dd867ee088f4374fa82e9c59c2e6e8487712dc36e3091d66415e17104b5ce93ac4ba715223c92ff30b16f6c22aa16820086f0203c63feb6e86a4b910084f0e84ca38c45feb4951cc7d68d85810082f0506ac424498e4e7412c7d68dcf3186ad4000407890ef9df3bc3357697e0602f8c18310d278684edbc1edc7b1459608c0078fcc7223f4e7682b6e9985b1818e0ed30401f4e061f86abeb4418263730880070f2cdb4cf64ccce5135719df00820301ece0f126b3d050a6d3513f02d0c1a3681ea285eb98d52c470039789cc27c78d96d4d678f0070f0e02cb247e97ded101e01dce0415448b6ab416b52fb02b0c1e3fcd65d0ff13e79f602a8c1835871b3cdc592d38b11000d1e5576ddc9d693a98b99c543ad0ed61237a48aa891c543cb96d6193abfa699583cdea07ed155ec3e870c2c1e8ed4e7c40b593579fc150f6b7e6b2e45f8f9b0bbe271c54f1d53b548f6c45bf170df46a34b9c150fe24253a87eabbebd8a87966343d2bff55d54f130a6ec9823732f2624150f32546fe7667d9f51f1e0a292073dd91c72778a47126354e63ec57a544cf120de68b0fc8beb952fc5a36839c2db27ab8c4e8a871a35d5cd52235aae47f1d0d2a79a4d9dd91d16c5232d3d0f3ff1d14cc2a178e8967b4363728afc80e2817d7ce84e8b9552987ce241d6c5f364c12da4ac271e6866dba8874b16d776e2514469b60e69957ee1c4835c2ed3a975e3c478130f66c3332ea4876789261e249b1cd534ebc4dd4c3cc8a2763a952cc50a15130fb36c76ea8def417289472ab162ae98f15fbe251ee7129d387fb3120f3d5c9c5775498907599d9da991f3223e89472daf9155a993792c89c7539772eefc18f5a31889077a71395dea6ff20f241e88a55c99a1d7372c8f7810f7442ea2f5854e1cf17883c70e1bbbf2a6d835e2518ef4ee786a1b55463c4efba79933a4b23b8b789c1bfb53369256f615f12867aa9c634ac74f4c221e56957be4601b221e26d5ac93f71ee261a9977b6a328b9533c4c393ce292f07dbcc5315e2c16825f3e8ffce3715211ec4b9ec97c2cbffb98378983e6bb4201b413c9abc537629fc2ec2403cfe98d692438c7dd7118ead2a1a0400108f3e5d9e60d16bbcfbf387877541234468fa1bf9f8e151903b8baeccdd269d3e3cfe147231826f88673d1f1ec7a8f2d76f9e9a3b660f8fcab23cca5588a5a7d1c3e3586d1d37b64e4a9bc9c3a398e4227db6b6b1327878e0929129f6ae2f95b9c3433d99982cf36e87471d5fc1d6bca72de275786c9197fb93e6dbd43a1d1e06b1b8a99b51f2a5cfe1914c76a898b60c17b91c1e6ac520e9ce2b63e84b1c1ecb9646f009f313ba0287073675f693b7e32555def030e84f844d9cd18a8a1b1e44698e6c8fd09026dd86879abfd63bbf171f69363cccc146cc624aecd45ec383af98a135eff4a286d5f028d2848eceaaf9d4701a1ef74f86d6287aae1546c3c3e4b212727eb3a48ecff0a85fd6d593a8a6e9c40c0fb3dc26a4cf61b2c2a40c8fe35bdab0f59b3ec7840c8fd3c4a0ad396da633328687351a73cc1572849c2262787057b17b11b5247d360c0fb4ac3d86baaf5379c1f070a53c750c49cf3bb45f7894e21e267ab4a8785491251d2f54447e738a07561e5ea927c39ee7f44b803f60c3140fd3ce58f525c8f113c88c808d523cf01dd9cd13632e830d523cf2942c35d7b025b9b1186c8ce2a185cb933af24c082913c583d2f0dd31a49e4a5964b0118ac76973acf8939bb33a04c5a3cb9df54da2b9852885c1c6271e68da08691e327b7eb46d78e2c17d77ee7411c7b1d50202021b9d782421dfa2b735cf69ee011b9c78f4ee31eea7c872af171b9b7898f273a285dc2fe9269a789c25238d5b8af3ba6fe4480119613c59261e4aee781a76ff1f4305c7560bd806264a12ea29697aacb438b6caf0a2902ac361e3128fe2eea5dc4aeef0735be241a69012dfbc5c4d71251ec7a6e0f3192fd3174a3cb654a2f92f9d265d9dc4a3da149aae7553292c493c8e49d2a7a4dc9faa7b241e9a74e8ba0c43e251daa84e95a65b2dcf2de04c808d473c0e27ae62593c4cc7700f6c38e241570c21ca3a94494a49c146231e8da7e0fe97bdd3810d463c1eff7f95d7107bc55ec4e334f792677372c5fe2ef0041b8a78146fe67246a2663d8c63eb4618625c71a181066800176123110fcea27d86dc4163543c477fab7f8b2b8ead16fc096ee410e3dcb8b186838c76000e321a8704de8b1c1a90400eff1c1d1dc5dc782f729471091b87781855ecf376aed968258e2d2ae424d830c483fdebd1509316529e0bf168d37c27dbb99471c2847818bdfa5b4d3759d675108f26a7c858a14a73745482789ce6c522e4835bb011884731fc9c878aca0d05c4831093bc763ffe87c713534e216ee48d9d2e5ab0e187479e42ee67a61c530a7a1f1e584ac59c88bf946b3e3c3ccf39edbdae6bfba322b0b1870735f29ee24d5488b068066ce8e1814c4e4fe46aca15421b7978689e9221b9698b851026d8c0c3c318526629b377fa7c1962a8400c1b7778943112428c1d298e64a4c00e0f2f6ece89bd1c3be64619fe2608c38b6d818d3a3c48573165595275d11bc756aec0061d1ee9a6902e425666cfc4b17529b03187c73d9dc57f836b9f375a90a38c2cc3861caa836cc4e1414b778e71d4ac3ca6e0d8fa2f8c1737c21063bf300fc8830d383cb69429dfbef8a44ee7def0c0c73dac578e1ab73c373cba378ffbd1c2e7ff4c1b1ea667bd0a912ce6c4b0e181b57e5f6af8d7f0f8332b84cb12472b2259051b6a78b8ff51f67dc6263721b091864717917f15fb215e8c25066ca0e1c16469d0ac3c4deb2a9760e30c0f572fff5d08e53e1bb1191e07b3cf1ec23292840c2f980b0d3420c3b05186c719ff453e5bcc7ac990e15125d590b276fd9195313c08b96eccca73c448b2181ea54e44b99869973d68011b6178505ad9d22d43af4b05c3e3e025761e72aac7cc171ec693c939a5d01041f6c2e352fb51cd369a26aa8226a30b0f3e6467c5d81d65f3c385c7963e4be4bfbfd0b1ddc2838dd12f1bb3a2bae35d12e30bac401d056c64e1e1c7cbcad93c3b79593a3a9460030b0fccb5d6525f7f929f706c5571a1810630400561e30a0f3aa6a51ce3caa2ca88638bac0b36acf0c0f6a3ca250f4f77368ead2a3cae60d3f3a962c5bc07eb0a36a8f06827d5abbc77c81e4d1b5328264d7c3bdb7851716c9d400c3170dcf82f8c176678b02185076fd9743e48bc7898e0d8ca283cb4fe20ea7f792382af59b00185472a5f9e3744d6d049c6b1f5d7058e32bce800195f7c91002ebae0828b2eb8e0a20b2ebae022035c6840025c3c90ead30a369ef078afd2dd34b26a4c97369cf030fa7ec7a5c839c5e069c2a31c51b2a6ea79b9ed045d061ac006131edcfdf44994bf8447fa3e7a9529a58d3941800d253c0e9aa43494d567863c098f35c562e6f35c881a23e1419410ad14d772f28a8ff0d02bb3d23f7abcac88111e7fec75cb3ba551d35b8447e9c7a622867d79bf6d10e1d105b98ff14eccb52b17081b43783c23a92c7dccc69a8a0d213c9e14837a8ada9f5837088f7b638ed95944c2e64078f4bfa51595af6d427ef030d2ce9acec478a7a90f1efba46499bb57542dd98307295b49cca521f4f4e3c18348a9c13e7bd6bdcf0e1ee96e4eeb93c23ebfa683472b9a5162cc9d522e95823172f0208ea494b25e556ec9dac0c1c3f89d1f379ba685f8060fe6b34f738cdab0c1c3fab9ceb8b093498f8d1a3cc82de7a9d2621a92c7060d1eee88aff5e7891ea9338b07d152d494e236d35b47160f2d841f99d32079ec583c0e319747fbca782179583cb49c23cc275c4f76ff150fb46ea6d6934632f55df1f827bea73e754f7e7d2b1e58ccdd7489dd937e563c1c4d1ea1dc72c7ed553c8a27395f86b6943aac8a079b5e6bb3480cf9d6a4e2d1ec25cf9c4a1d326a50f1702d78e590c375e7694ef1209bfeedc7ca934a19533c0a49362d91f27879bc148f7332f3e59be698b093e2419bb6e6d0f8d1f1f5513c4e3134455465bb0db9281edde5da74bd79c97c281e4da49f363169330d281e691eab5c56b1aee29f78609e27a2e53abf654f3cbeee301fa1e35a943bf158edf33564d3b89fe5c483103fd7273e476dba89871a7b6b26cf5d8d5734f178b53cc9665bcbcd4a261e76a484a65afd985205138fff7622237bd88caa5ce2c1a7d866956136ab6b8987ea194bc353d4cf66251ee5d8c78e5126850d9b128f53d9da9654aeffae27f150d37a6d4baa4c682d89472131588568329d431d89471ded62883edb2571483cca202393ff5defec473c085b412569d8142eec8807af5359be248d86cb8d7814db3c42fe38ad1d65463cd69453eab0e936529417f138bffce7c51039ca64453c8e39784edb79b4d824e271e49c462c5f08221efaa6f1d490337774c9211e9648e88e1df4630a89211e7f0c6aa366551d355288875bd7713f354288c71b7c3767b2f1888c0ce2b1977ce6b0fd39eab38278147290dd142b7c4d6503f1a025aaa6e59ca12c6401f1b0fb72674df53f35d93f3cfc190f1529fd2d84eb870731132287af9bd8b47d7814a2a710d54279bd46f9f0c026a44a17838767ad7b7874e14b6f6422d265d5c3639df8b28f59cdc3c396adb412354ffc55f1f02805f7ca7f77b535ea1d1efb854b39a5fa42dad40e8f53acf3cd9f429aac691d1ea4785448394554494a87875d2195c856ccfc660e8f35e68a30bab9f19594c3c3e89ebeffe251ecce38e4ae3e2164ab130e8fe35b47bad9bd4c38dff0289f5e38170f633e49373cc8b51fcbf66d3eba6cc38314fb3e7bce0d153ec886075983cb4d9c4d1e39b88647972c96664f51c3838f9f42bed385930ba6e17148bdb190ce22ea8d68783c95fac252e6f1b0e2191e9f7cced51735d48d6886472ed952ac8e17f673caf0e855b7a4a62ee6f893e1419ad4d1fa756b2f3e86c79352cf4577db6417c3834fdf6ad51c413e0ec3c354d9d40e2a1b933d303c0a53d176fdda6dcdfbc2a398ac7f17935b5ef1bcf03057be78ebf19713af0b8fe23d67aa4f9a2ce470e171ea9fec125b264ace161e574a7f133a2dcae45a789899dfdd7183c7d066e1e14bfc91cc325b31685878e81e172f6693fc79b32b3c6e518908f1d3df9459e1e16c6c85fcbfe75859151ea5cbb81027f58cc78530c045175cd005b8e8820bb20017169000175f8c0186174a8587d11a2ebfc5decace141e4c9ace15d19743cc4be171674c76f270315b1f85c71b52460dfdd0b80c141ef5e6f057979ff04833c76ffa62a2cde58407c1bbf37b7fae635c4d789c3574ad4dc896ae2d263cda48de651139a7946a090f733c89581f722d44a584079f2d37f2ea497810aa114f3faa5a2791f020a514215ae7a760e3111e7786ab893944ea8c111e4916e990b44ff37e457838a251b672c831b2a20110e171879adf1ccffe462d43789ce29b3f225e38b6b8020310c2a3d7b89844a3367ef3bb3280203c4a31b9a393e4cd5a1a203c887495a8eb512dd1d930801f3c8871e1d4732ad5181b1f3ccc1ba3125e73ce167b1a06d083c71521caff674d1163a70103e0c1e3c9316a899da7e5618841c2a8404707192710430c1c6268e04b051d1d60a861003b789c3c83c749b89c2e85706c1961b43707888dd160dc7f8e324a56dd18800e1e4cd0e9283d2145b44ec1184c06d918643c069083c7935ad11b27736fd0607f8e323290e3c3f0a2bf681f000e1e464e656c45440d99bc30801b3c8cc9d264e5e5babc181b3cd43933c9647ac9c4528347216fb68b9f429a861b0a03a0c1430916c3670e199143b68c27c366f168ff62446fd1d2df0d0a3564f1b8db463bd436cd7d8763f140a62a6ae445af0981c5c31c6334d2ac92c98aaf78d075b19e53da2b493957d468c5c30a9ab376e2c70929c68a87deff533e169ff29aab7814f4433a79597be98e2a1ea485ccc1e28c86114d2a1ecee85cea665fce92838ac79b45cb36af869b9e9f50e3140fca25ac6af2dca9bc31c5a334cf72570db7e461291e784e9f68a73a17196584d1a478ac2329c6b0ac4a512d8e2dada4408d513c8e139fca73af468ab91c62e4c8f150513caced14c3836cfcbcb1106a84e27134ed97b8da4da910c79659193540f170227fd56a5779875150e3138fca2c568fe6dc9bafe0d8c2e1628cf177821a9e78dcbeedd1e5323289a346271e9bc64faa8678dbbee1c4a38b9dd53246be18a56ee25112ed60fe31a75b734d3c8836b9c43fb26a748363ebc65d116a64e2f1076f9fed9877538738b66eb4d9834b0b1dd4c0c4c330bb696db977ffcd251e74cc64131d4b4b3c9a6bb14a137ab34bac120fea67f6dc3d45d72bf8306e8421067e1815e8e830450d4a3c8adcab49d998facd16a0c624f056978e1bbe35c4b14535a82189c73615324fc8b5390fe36f90412810c623031d1d8a891a91782817626bc4bc13ed765a7de912831a907878be22ff5da59de5df24d478c4838e515f9df528d195cc420d473c2a8d131aeda6e2978d58a8d18807e1d9de555bb27c638a083518f13085c8d7e9f9d7cb582de2f1745009f1a6d3dd948a781436fbece68e5c21ff5554a8918807559a528750729f8c9ba804eea5e2a138180a85426140100c00a2ee7703a3140000000c1c90c6a2d1781ecaba79148004443a304a3030121c1a10141822128983814018100886c1804018100605c2a0704a3c8c62d45e0084bffbc369257a23f999bddb7fd32b21b8fdba2d4880301b99d0b95fa21d49b69c8805bcd0dad6b1085b751399793f2f3e3dc4b466ba7720140fe7df9d8506336420245c729dca8547887bd994cfed1d11e0ef6c0c30189d097068a387b0f838d86ceb5f1fc09d0c2386149bfed580b88266b4c16f4421f8fe091d836d0d922af0dec84ada40c4d08a28297ceae059c005576b40f547b7e9bbdf1ebe9d1ad62af1742e3fb2c78dd726f2b433ed1943239334da0985626ae690e52350436e83a213a414178176776e4d71b65b946aefc6ca1d0e679923c57a891d89bd0d9f10b758ba2d39cf352c03cf055b85c14ab430b86d026a212ace8e862fe1f6267bbf0e4296c785c4800aa28c30122ec74b5c66608de1d39ecad92d204b25326cb0c1a0653788c7c483d7983d092e11e9eddd1b80c43669cc23109514a22ce9ff2125bd799ece94d0fbff04b7674709bd66c95c391db78df6b314d9a87fd228480bfe0b5b930ed49f81397425e29ba576024ff475e825a5d6b78cfad60e391cd3ce2409d551788b73338c9a996b14813c35e2be6307778ee01a5d50de389a6798be7b36b0230d275d6ec7c34560bebbc210b5b2fda213290efef1dff8670a4594d80bb4c987f599ec7d85d60ebfef19be57a2166296f795669f0867d6cb88a071ba3124aaf455c7e428692439b66322b1fad4413dddc423f1f5b8e4d770d4e85db9250fe00366fffbf3e06ad89a9a22c9d4f67632b5a5360cb3617d3b326eeba77f2e1e070e752467ab2faed20a4560ed6a3ec9c104ac44f5749fdfcf7fb8dd4df5197f57002c9d311bd8c6715c675a65aec41d7b742ef815989076b4c52f4873f0b93a9d26546debbed8f8e89e4bd362710229a82b70aa84c3e01a500cb1bc985df1fecfe8558de64f4a589c4e61fea001522436a6cab9e5855e6df63efa0b2e087b6c252be42e8463cd1ee887db54558d72133b987a97548d995e6fead59e8c7345818a84859385f0344aa135af019a5b1338f53170476ec89765c36f913dc7a66806670813a737395ad077688a2ae50bcb389077cabbedc9f3087aa83acd1864eb2be51ac5c9aad7055496680a19eda0c6451f5682439c4d5b43ece66447140e6ed602828a1a4d199e6f581a1405955abf7d3fddf2675e59ce01f0b06128722647d8c348c74e08c050e3e05a381725dfb94541a44d85c1ebde3fae98a5733b4a90b72e9bc4690a153831643de096afa0cadac9b926acb77dfbf5409716bbc0e9b296b325b4f9582ab52c8b719d2885b0f6e1eac6a3d7aba8e21429a35186f2482a9289d4ef5d1f8788a5e026b606bcc4aeac2a45a0e9b53e4b4ddee62fc389e5499d59435c04e717640a6abd34a5427a5336951c738ebd229902d600daee8bed5237aca2c2cdeca2eb021a6f2ad5a230e16196c60f4959fd4114725fa19e7868177d27b8620129bbf6f9bc7ee4e90358453842998f0d7c998579ec462d242d2ab0b7f8379bab7e5f5d68750bc565a318f817d630fffb5fa84f85f05af5871c9a4a15818801faf88a5d21f2c5b40e402df20db2c155d15cf4ff84be0577ef0f288260c80b9050ff8e46bf5ed514da71b7b8fd11a96eb062331df454982b13300cce0aeacc4c1542daf375e308afe9c4cf2e8ed17e62d1adbe29826cd36e9692b3300904d164134342c1671d0135ec4dba01ed6042f54b28c1ae9858dd69431f2abe4c7a5741f4c0735161b268d80a8a184815d9f4c9e8e39ea3dcdb5d3e642e57ddb6ae3b5777dad7a78672916d7daa549766433dec81deac9d7ad223b668539e32bc77ba492f19eb5535ee558dd59db7f594b1dcd8f4ebbe0fc4850950ad68d22daa95ce93cd03c8a8b8fa48408a9aae9e8ce5aad1a818e28bc90282559184eceb53c596a35e29aebb691c6d79d09d3c69965b99d6ed8bfd3a5a70ae1445f77a3f6395affb37fc0e942b3f8dabec24a89e3d69acb8b7d5ab4e324b7d469ffb414b49887dfd7382345ab70bfac5f12214973531fd1244c937fc0a7431ce3b3cab845896f55a757a91cfa89cb0bc58def5abc158ee9e6670fe3495a5a2ee59e4d1333c25ad27d19e56b8c39936db730c035bca14740ad250bea59b0e59b165b41ac92c7ac4eaf48b77ec02e3abe804e8330989f78ddb974e8a06fb078877f6ce1c11c428a23de9e4c1aeb7db0d125ad8d2931547ca71437ff3b8b2e128a99ba05a1718422d4a6228d4c9c607f1b732456b226e4b21c14263a0f0a34054a22b7a5fb8fe58d5dbbef695f7e9390c63932dfefe5981ec9af2179417fb79a24e9c97f803b1107dbf0cf82c40852577ec668f12c31aa3d58dac70c9679e3a5ed6833db7ca2857dd217634ed648fa4b4ec99a5128fb350d72268849135fb74d202c756380073839b7af6dd1457545de570aa18a6d5aa4c7b0059d6083e98115a7d1f9451bd8d250262f166200efc9985c8942708d41d922b27d32c44bbf9d03eb9a67a68be258643437553b5c414733ffb7cdb0301098e315697d2545769da55eedac49c77a5d2b8a9fda799662de09284b8a11019953edf17c03a312a10ece3f0917a0408328773e872f2bf82e8db334f3b7045efd32555b59f86e1836cde924ec0ff7e4024889a7033b71ebf10842af8d7dd1500277a83c502c07915990b9f9535f47fd83c180be24424273ae9f5f924d218da7e3f9442cb4ee1774ebf5075bf837a0bdbdd7c164386b1f8c743bd3bb72ac3e89bf878dd888e6cec38654542c4bc82f93530195883d6870def883f15dcb8c1a335a8b10dadc27e9ac0c08134fa6914117c45626f75e5d8ea068d6cd5dccc92ebbca285ed08a6828259537f8c02d6ea6616873492b28bcc05aea72854a30cdf4cf862c46ababfac98b32608a7bb30b04dc4a1653e714a8b5dd7d2ce181e1ede42151ddaaeb4a5ed45cf511fd58ea6c4bddf8414eaabb757dceb6744fee1b09aaf241d4248879ac14db4cfc7a3367051188dadf154b9edf7c2de4c9a2c9a5bd54c2db644317c396e80f9d75c2b6009b80885d7104e361e1ee07c84dfcdde92ea28c05c72773dc8d340ee254d2b8b6bdfe14e1a70b927d46c50c45818fd19bfda4633e93ba97ccd702ee32e861c153fcc89666f3f380ca758ad0b9e0f9c4a714196dc5381754eca04e172bef91f94d9f3c8d596c6cc2498e6f74df28365b423a4153b5a7765dd063a28d0b9d7931cabcacbdc01b370b5694c3f2ac0af9303dacbe01feb4cb653d48d998567a07c4dab6df5831fd51794edfae43d511523c3118b295660a25fcb2a3bb5be02340c606331dcccbe543a012c660389f6e269210576f2fd568b94606f1aa1699335c06e434ae18613ed3dd023cf732a0f5568594f04a08e278b242dd249ae6d800260275a1fe054d2c789d4b02aa8db56e2231ab2fcb9f760a9852ad6b6f47964975132e29af3dab9fba07ad458b8b52d4f880d005bf42209816e3528df51eb287c7c92dbc9cd7310d92cd437725f4a93c654b1977a560ff164405b6a2dbf473422f4ed9773c962cf38349a50e6e58be6e59890861659845653ad1830b75a958ccc5892416b89a93e4c9b2637761fe66736ec62a37651e299e4279301ed6c2cfe544ae71e43d180166f066d0b165f0c6cf4daecd2c65c7e332cd0597db8cfa6359bfbd884bbcdccddbfd9b028b2f7dac7683b9f1cb28ccf6f335aadb143db58014dd04e0815022dd8c985694a238f5ce4058bb1ab8b96ec18e951fff8df5059d0f576faa7dff26ac8d47c38e87bdc9f0086938158118cece82bbc9f5b70c476230bbb4e7d67de142045600be01d707dbb59cd91e98c1bde80709cbb0e944981e2df18d13a3156c9ff3d9a8c6523c60700c8ec14f9134946db1941d39806d06a176b8a0b187d02ad686fe8420ba6f48304c79c257d152b33ae93fcff972bdd03d73f4bad89f59b6843a340c30ecd68e6c06cddfcc26f723d0c192e116e436bc24e3e43f4aa47f6de5b52342d8638a1145e10151d9a68e062833e0efe19b8737a9fdce80ff7b841e8dd0c440ad713197b4073990431c9a592fe94d6338463f5d9137d219c4569a0d8dc66a2302089713eb731364697f29586730c6d883ff6e39ab4aea47a8533415358e0b3a51afdb2c496c06ceeba9029b6fcafb198a0547bce9cb558c5c0fe3403b819c249ec4afb8a6bb875ce8c5d8806301a97eb4f6a971518a678671b264ef19c86eab20cb21bb342ac9552d4bc7602f6f0cc529cfe628f5993eeca71d2050290c1088cf76595c2d0273a5a6c133991088c9f487fc0ac621578944466769aef36198d935486dcccf2e153cd5dba7001a7f9a85eeab99c823bbcf0d33aab6ff25a5cf90ca3106ec175948e6e38a266009d361e4b0f4fa013b5a3359c8c575480c63818b3700d4aa3ee3f0650b2502ec56334c327d4466b7112db62090da2306ec45553115a013f4b8adc1d19a1019a402e6c425f179c64d8d41bddfb4a59b0100f51e0dc66abb4a9d6ad55d4c332e86aba56ead0e2c99e1c86259ef0d0d4f4d54bafbab676b587558e2b63d3279e13a4f40cc3346e59a8ea8aca910083a4766bfd3d7af7a477342d176530c5ec27b15e3d53ae4657f6bfe4509916a85ce68c14f08cb543de9b50d50595232106a3370e97a40721a5de68f5156cc345da901566cfa8ccd47046316301078389cd45fbe08cf7ac3a52b12f488757867927151dd269f7211b382a76483a4ee0361eca010cfef4520da0505b005c72ae154c29fbab618fad4778831654a9aaf78f12f32e4d76a5abe0310d3bcee4714d410615c74820346e4474ba1f61b85128d2f83f3f364a08676e05f10d8b9728bd28d3f11982bc4b18c66314feae8a22a7d880992a785420bb8e5a737d88ddebbd48724916349bf588357d41868ef40918981dd07bf2255da9c34d7b79c34b5d23a274cd444d82853efb57584a33910d7f0f33a68d3faadcb1ccdc787253b94de79c89daab354daee8253fd370ba46bcb7e3f9f8d5cb53132242816b66ee31fa97d039386851506ec535599c6b8b90cf71ca76f143d3db19df02f5d7d195661e227cc7dac2c9ecb0cdc685119b99d0109922b334acbb114f80d4cece1ba0481befde0116d40cf15159b0a419b8bdeada56f2defe9926d36273d4f3aacba7aac6eed788ae78b8433f373402686fa2c3c1c800de6fafdc003f7c510ca3bf129b33e20b52d705bbb829e161360bb642a0f76b78420ab9a2e19da3edfc70158e20beb286c79c964d2bb75a18eb953e9eea328e080100e6121b5a2215866cdeffcf1c115080e7ae863f6f220d6564d8d003f4232ad323e7db819731405aea1d171acf5594d42831e56a4af3563db3786d6547ca3b7905cce99f6e24372a158cc64be870e71c3cb79c0ed2942ccce83730562ae3ac779dab0d700fa0884c32b203ac03de772ed4c967044c6e8b48cd6a2ebb887aa20ad8dc4bb4c65a06fdc520833c5cd420173c089dc115133d9d42f9a92cebf6fea1586020865c2a81f1b25b8e07085d4ba12d734b3c7d782e71c5ee003c57f0ac9da60a1ebae8eebfcbebb49dea6ed6f5f6329eaea7e6cd7b7f4ff1f77d8f369dbb69bf00c115c68ae080d1067af1ad16eea0619f15f8cd9702ee7f0641bbdf0761cdd02634045ef5ba1f475f7848755e48291b6f464a5c50f4f25d0bc1e08c9f9ff0a130178ce43930ea0cd78469717800a0b9641ede252cb5b4bd85c0600beff3f319830b69f688d4a16085879e75775d21cab736e9fa31cc981306cafc312f8c2e73cac432f3a931e02c0ed58663764c1a46cef067728c16a3cecc982f469ed165569958e6c7c864f4cc4a26657c3232cc3693ca6419ffa4e975b4d401d9cc1693c26c6ca28e6346c3ac65b24c2ce3c46832eb4c9a64d41442693778cc9af164d432a33460152bd8925c1c3b51492765e3734c68aefef8031fdceba2b0e8c76264024dfdf48e66477648b467d6a82952393264a1ff77bd4f5d9bc64da6a971748e78e7d9693b6a8e8e333e599c601a81e34c27e71a030b67d6c975541c08e7ebc87774ce6a27757c388677e726742f9e4467ddc973469d6347e7a8f66c8a42424747df5173b69da8e3c0d13bab9d9c3398f0bcf1a10d807e7e8fec47fa234d887ea12a9c7fc3b45f25d48a6a24ed2d06e213a8accc1cf502848478bf6f30bb23c2ff40466d3b7d345d2694da4b0859f5126d59601d1b28f456eba1c2f06b94d442da153f74c0568b48384d8181fdd316a331e498751b45867dab9100aa3cbbcc569b91356fdcc698c98787210bb6c33d7b676b4bb9810655ffc2c97271c4ae7e246ea1d682a72739b451f4511e68cf6fa079781cfac058dcabbad213647c8e9db0a2ca83a1b08e03d828ba6220281524ba180f1061dec23b757b92700820bbf216716fd57eaee4f1930af117021ad660738303770f21ef58d0d1dba91ab993d69c10e48c1648547f535eae910d1eec99ebe755c571d85f4731554d18f3064b392f38456bdd17983dd03ac403a0ea2f4c5458141abb065ae87e10293d2af5e06859ca435a46d2ac9b85154901e6cbc486822ad3544cd750723783b1b3ccf6b22d890a44228dc389ed9324897b750aca5f0a6e98c335986f14bc9f3e221117c9f57f9f405dd6c9ee771a4eb88fe47fca9e476b380c80f3b573da24203c774d500ac26df0ce79e1c9be44c1d086ef60be9ba27f027de8ab507686d35d3c2e44016eadeec71b69400573c6dba1957262f8321223809c1f5dbac1650b65a1327bec3dfe639f0952fd0f7f6a4d41b2a9b08787580733382dce8351b3a581993377305305a44751a7d66abfd6166fb125164f516967c754e3ee59e3b28616de230ee90305048904962fc8fd9e53a4321e64799d9585590ecc324faa09e16074ad7c2963fa01d6020946482bcacf1d62fdee77fdb828879a48d2555f90436db4c32b0b1bd7646a3ede4a673816214036c3504602bb54e4d419059afac899d7a5a66117b80a5e11a6cd63f28e1833b9fb5f944ecf6aec0d3d60d82dd8647aea7b0ecaf917d27d6e08e874fe97e69a417bfd7d7ee036addda7ccdb69260be239d2e6a61df83166926a87b59d9601f2c159fe562ff7c6d50131d196dbac6c446bad8429bbf2191197e86e45ec379f6621d6689b002a3b34f7f2320b297a40abe853efaf52ae1b70df4606dccda45c83c778d4a3a3ed35540897f3518872c3bb9bc2f195c203da8d0dbb55ce13f632a3c99fe01543c1d38da4160a0fd09486210f04966bc33e0345cd5ad89f3f13112bf852a5583d585084657417b7e03a3b104734790b8719aa983972e87ae29b5b3d4fe85dda954384f50c6dbd880c45afddf50d6ac3f9bb05a8fd045a8d232fdf76ccd52cad4508b65f98d6e4fdb69655859582a5fe8ad50ccb3a74d893ebda8e800c40b6c65226e8b62457ad518cceb695424f683321e8972a70835b3381b44e28376dd04d8047e056f76e1416af07f84f228b7106decb181e6d4bd2f481d2871e734caa6774c08039c61e204d0c15099e29b949a1e5d3913b7bfae4c812f3def92f9b1e0557df0fd541bac641cc32154f0c370938bcd0f99c886b9aceff6716f5e3d37f616b83b425c3940969944e0a994cd477d266140e82157a978c009c8567cdd0a5d0f830e7f311920c75a77eb69686e816162d32ac1eca8d7402c7abbef1ec81a095dd344c8e85dc8bb5a470f110e8719d227b5c2556266b526eb5fc079304c14da7528431e7095f684cc766ef42d42a1312d909012e1a3c77cc2ecdd443c36a4c850805a10fc61617a7b1bb80fd4199ad2b3a9a33ef5f24f5cdd8d59d8b2709fd9f297bee2e72ca77d0ee646c0d8cb9a746712ddf5dc0ddf4d565768817fd5ee8ea6fd522ce0d75a6da81897378e2eb72e8ba7765f1a76b6cb911bb195a7653588c0d65ac88ad624197778033393757f9a8465ac91b11dc1212e713e85ea28b73b607281dfa28bb381f2c449d52fb5f0fd508a9529c98ef0c6f527e404351c104afc1c93cf30fc8e04a62bb6aa31f27940ea1e1c241a2f5ccd07b57a56c2a4dbd8844d64b8150916a894b7c627304521fcbd63574620f330cbf496a90308e0ac989baeff03ce9d3a2316f049558f937a497cd309723a34db980ce4a3578c05874bc584dd4a360cb999068b79f703716b74552cdc3e5718b6eba33f37fc79e94d53874d97b949fbcfed0f04f1e8c13e133855b20e274b19c0c420cc848c32e4c5cac677de424eab911674c98037d8c4724f4b0803fce0ca19c01a8228827785e652c0739479b7185d49d8b169ef034da738b3dafd16dadfe54b3f8d3f23c697f5c18b1795c4a9606ae648b2480089d2af4b2800f2b390be21c1e938013ee574287b4d6cec82ad4dfa2a9dae5e9a4272589ae52c428d831c35657a134301af3b14bf7a2033a24c1e967ad6204fe625d090b9a37afcd9e925e08e4356c649a8087089c12f15416ce3416f88c2c42a4933e58573c46c40c133f776486834913ddb974b46dd6fa6275eab00b249f485274329409c8a86324bb901a2f61c72ae6e3986783b8f805ce937b5300803420e4e09f5000ca098a075af9ccc42412b4c967bc6b7e89ad9d3592eed86adf901809762503fc2cbc5856472f24a8bb7945456aa160ece4882b94dd7cdf21dc1bda739093c73695f9e0c7234a1d0460ce3499322caee02d94b1f566c9cc85fd79dfd148b8c6ed30c3585b6446d2cff75161e92391ed88d1fe610be3fe6d5942560111753e55c035de525d1d7ac62c88f32b8b8e9e5b2aa0edcba4f84113b2f82561002892fa11b136b4f620a7b8dae6ba51e536289b81e3af1ed9631811489ea50c919cd1f0c811f2498d919af15f547803f0610518aacf5c498717f62c54d513c9511dcc8be4e6fb43d7d34de08e96ba514c4f0f6c1875acad8508517a0c8cbda23286c339f97081b102fd8bd336677ba38977fc9fa1c4f5a25174808c77055a98d31d5ee82a047a19695768be461d8f873b89a4db42687516af955378b772400ef44c0efd9dc93cd04b1c6f99f47f486fc13d2179bcae0dd0d1687c90811c57d0ab50fcafbfd03cc2b41826909910a9c05935e092718178db9823a776d95ec4e23e9c557db2f60e1c88d30c5c9e98e663e6af00c9ec2aac44e7fefa1f3eefb242981d921cc11104961792470bcd17d1cbbcc505962d81bb44d61635048e7a4508da5d9ce50ba721f713f75b6fbcbac5be1fb880a8f984756b20791e2f903540da105889f7469e222a2a264f252b677de6f3125a00f3e979b932cc03bb982ba7e17081dab2a46e348b774dd9ad50fa3d27f0f70a900f778d44cf3ec017f439d036d2e9e004db7378bdb977d04bdf5a30bc031d7a28731ec85c042652ad41dc8b7451255fac50b679bdd46b70c176732e852188fc3ccc9e171d365014d3cc627683274f5acb223b3e85b9aefc5aeaa887ca1bc76c0df536be70491fa7649c3ac846835092c3423d6876aa7da75e2e9035648eca10c543fb28e6b56cd54eaa4a40a88e1c84259f1a04318ff43ec7de21fe98d03d358e33ffccdd9b105f5e393c4e49d24d3e1fb049766371a821d62478be203d722af4b4904d4677f0481e45f939553b77c572aee1818ad0716390f4d63136e6b8093cf1c07dcf8e7eb4a56db23c5921c80dff573ca63e04ec2266c6364caf9ef2651821c5acaad7b4d2e199567ffc0d8e6b76fae555abb1279a267b2a4fc5979ea97b9072217749766e60fe68501d8e2999ae770d062ec3a899aedfbeddfd1796c214ec20454dc17c70586120063c7c8e5307bb20db86de8005e696cb243b23406092292dba34a9eb0043e043bee8451d1fd436de1e98b6c36eb40d2bbcc103c86cc4b4e80c949d66b8dce3b2ced0a192ed9e44be6fab6f2f7349cb6bcfab757d134e71ad242a32e34459149f6cba26a6fd30a88ba08fd25c03eee2fd05e0d5531c26900216e70b0b129c8e3f22a22d4fc20a73e4667f165d814602c76dd3379149444c0fc1c08120c561e2fc31de2e645c81f0708c70829b6e68a3813d6dd8d5dd58479da4bbefad20aca59c25d109b06b512a531a09e5546a26b1f2da9cd19f9b09b2b806e05fb95cbb0b1726a37745ce74c3c16a70a3397d93a79820d204ca54adf4c78dbc789812adbc1566de0104fb7d13af43b25a95d493d969de6d242325831a337d57ab897613ae1ab396ac6e0846a785ccfd0ae784b9f4b8e277b8efeb9c53d490f2227d76292a27baec838e80f0a21dbd3d8dda8a6ae3349f988f2e9ea4e915139ed23ed2e12e1948df47347e3b41b92f4ea88a7330f43541a5c2f266df5a670e9d5c3103053ae01b01642c65c127e0a339699ed6d17748f88a8e29416b49847cdf58315a73f5846bbb5b218a67c310817a10c521b310148c08932b4c468229898d2d70cbe426c7ace3d1c4a878717174ba1848294c6ff339c9531f9b3dc93e0c2fc4c5b5c1bb123b4d08cb3c2f227dd58e4ecc97b1ab9bad005d463cdee36bc5aca3a8e1815b60ee4fe7d016656238be25551c0965df609529edaed323b816b8205ebee408088468607e8539a65fec22b66aaa48fc5e8e2bf0de41d7614bae44b2a100076cf1a4709ce935d739dd520696631d7ee4221541acbcc9a5cb7935b442c60c2487980805db854426d1c4d42e0a2652c822cd27d0076074b12bf5d661155e9092826d5e6883b04ac29ff4e14642271e1f537bc38036ae0a904ee95ee3fef99e0e1191209530c80dfcf7358913a3e50372b3282421e2869ce881517d739584601b8f77ac60a09dad4ef029670d5809e9960169763190567ebf753a7e2e9f99898e479a0128c3267f1d53e7ffe846dbec23549b4c9bd01afd26134bbbdd680948857f3949274b77e0847d621fe6c3a3faa4bdc1be30333a0bdb989623d36aaab189596f5b5ed3c054b0e9d9e74da6a6375bd1e2b11f266ba65d5bbfcb35df3299b6dd2ca52cd1fc8f11347705c824a8ff85d7c1f370d2d4e5c4abc02cefb134d3a17e9138fcc04c7458cef4c0d9ea9792a9fc30ceaf2487798c282b9e0d8b9b3460385d989a43f04d14458b3073ee3e17aaccdfd7957f414ce1215738ec7c95ecc1b11045eb3ef8e8ac25a064257589d245a2be4830d14f47d3712b7bf2e54a7665b6cc9b0ee4e26ce4754eafeded9bf732f33576f00a33795135f42513716df77a8691b8b76904843b0a89a8ed209d19926495cc83ff499463059a6c102f74a569199a9e5becc37d61a3ad4e03a37a6879c01606fc29f08964a03e4a2762195eca113fff9ce2a2412587b7f652c7b075337a903b95301e271016431f9d984270ea067bce179a0949522810754369260b9c302202141b8258b9034b93fe85c9aa85aff5e214b0b3f5a2b922d3a66852d21728bae96d50e26dc34e7a89a512954480d00084242b116e1f50d7a6f2a5f458db5deddd29f71305a5ee34d73c1b944fa6c4f52d0e0d4ae1500439b33c062577ae9ff35dfdb9fb7d3d9f4e76237760eb340a400d2273df4b7190d4638a4e376d31e08b12abb7acfd2e24d2e805ad251150014aecb219c32dca3e468760fa6d745044cb4cc6e69f7cca0ea3cc99db66ac4baa08e2ea3936c7438e8d886b84e7772ec1a22cb3704204b596822d9507c898a4ac3150c1e2830c054ca43394b7dde7244158d5ea3ac25ed8ae02a4aa02adbf5527714ede2ee3911008d2b6dd2bab4f10189dfb4423600a34f8c4d87369b17729e26fec91e4b0afbe239f69d22d424208713d93d5ee0af24580b43bd1028a9f1363c4b1cc300c5c370f79092c5787d535811ea5b3ad3cf1eaebb928ad0d09505b07b241da8d7dca39c451bd1a290e6126ab2463a199a6e375f5ada45677b393fa7950149a53dc19522e919c5c919474cf4f8c8f3e4dd3e4b8dcb3d4bae4d44bf0d64225153d26536dc933ce73e374415a935e46ae32c08f57375228ac0ef26161548ae450b8f4edf0feebd01993039ef42f4724c8b904eb9468288f194ec784628bf07834e8ddc1c4d9ffeaf3bd17a2c7653254efeea8dc4e532d3bcc4490e2636987530cea53891bdb582716d74c14ec9359c745f32e7d20c3a45aa8dd919b215c38787be056e8d65e64cdf3622d2a95c40073520443b3edc35a04fc481c03e0485059309c4d2e4407cb984ffbd5e86f85fe99ca1ed93318cad5a17e390beb977428a8d5c63ba27b4b011cc102ee5244710b3b30eeb4d0013cc3333cc33311882c3aa6bf12ea54f3b6056bcd7e37f265da5246cfe9a4ca24df8d292599644ac9e9eeab4d0462a48d9a080e42be1b6c0b490b1e0ba7053f1e0460841802993bd7eec5b4e0310c414821fcfb7cdad7cbe494680218a0ac841002dd1f55757049b72c4e4fd9dba17470b743b9e02d6410e8d16c17f5497f4d2e8b20d042b52cc7cce8cab3a409043afee3ebf51f0181daf8ceaad163d6edff807c31e8bdfcf1b2ab674709217e40fad60b7d7d262f27973e204d6b41fca557eacc4d7c406bd72ebb8e27b4e5cb8d08217b40ab9616a53295f3ac4b3d2057a696f4e6fc924613f380ac8d69639a17e53ec76384e001714ade79fc51f572c877406f6c31f1b28e754fb2036ab7646edc462deeae03faa59e5799fcc427edd001b52e8b5ae775774a35b21042e6809695a6e7a657b3e9b58c1cd0ea99a734cbfa38a0477ef4c52ea15e1b38a0b53e765d6a72e9a39a37a0b478bde0f1e5ac36f56e40876ffda4336b17f5ee362067e483f9795c173c9c3d086103faed74c6a99641f5e942d670d62f677b26a90b51034af5bbf2779d4b033af6465772b51453b7a20119ae758c4283aaf5287506644e27730eb9dd2cea6606a4be4f9b375e0c2ff55306a44ea67bb5e0725eec6b83104206947c613a6939b5dccee41d848c012d5b87d79f255f7c8c8a01f999749e7e9cb9d6823b940b72101206b4e819dbafa3fa98f14cd9430d84800125f4b396f46d797831cbf20b215f40e878bad2357721c40b68b1a47faed064ca5e1750b2a6d44e4b794175b6e8e0e16ab910c2856e7dc3b3ed8b977356215b408da994b2a553b9246e14952d84b481faac52ab5add324a9d336c84b08196df3e7a4bf9e52a8a0aaa11b2063a73dd95d4f2d6ce0a53f6d440a67c3f97e55beb8571a885102dd89932b331d6dc6b4c2e2ef55f7813e77a5e54ca1eca5a3d50be503abee0902c20c7e5a756e2b5b4ab65ca1e1690be59d631b769415c69a5ec29e7f17c85902ba05eaf7f874fa37e3298b2b75e0565d3084903696fb2ddf28ba96ed52beec39c116205c42a759aeedbe59d6c52f6d0409af43b17c5c5f62466ca1eca8a8e3423e40cf466bc7e472dea69198355083103a9579f768d173c534e5540a6af98d4a2ab9d4efa1f42a880da36d328fec27e7fd214106eea9d7a75f0900f2165e0daedc5bc8f3177089102eae5b813332fcb253dd321840c64cb6e3acbb252fa252f4b4814909d95b4952e97162f79cf21040ae8275f539fc46339843c012d67945a88bcb67859b9fc1027a0b518ff1ed53b4de0a44e9971e76252f6d643c640d9e8bbbc6131563c7106214cc0131a842c01252eb4377daa8ccd6af538c81025205e8d998fcaacb1fa09429280cc59629f5ce7b05af0fc878e747874e0878e14460812d0b79d940e3b1a5ed6ef40c70f1d3c7ce50808937ab6ec4d3dbc1a53f6f8428c80962593c1a3ebcfa85bc7514e8f10214540272da617f3c971b1ea4504b4d85adaa805cf2fe6f4870c01255c8f8eaf54997a932142409d99d2a252aa0f09024a4cb8784aa9cef2a57c0c905aa045992a66327a76d7295a20a3f61566ebb26c9693406681723156abcd7c32c73f1059a0ce45fb2cdeb37b54060b20b1407fe9e8327dfb9f7aee3c0204164871f194bff5b2cda87d05525c8b5fbd2d7c949a3ce60802c415284ffbd452634c34e715931c39589078006905ca3777e9f97c19405881ccb2d851efa4d29cfdb50ab4b43985976c7bbb7a54810cdf6caea4566bea41930af4c86dee0cafb3f39f796400410552e7d61d4bdfe699ef4f4eb19c36ede66a2a5320bc77938ee3e7a5aa3ea540bc9678e13be6785599d3060829d0e1a269cbdef868ba4681de9734aaa8d42d893f7101441448a94a76a6cb194fa95628902eaa879795929fe7954081962b75c64a355ad2952501c82790bbf15607ff9cf77f0f1fe909a4fe14ef32e6b871bda1014827d0a76549fbcbf4362790ae36e7fd18a37906c826d07267d768068826d0e5edf26b1d33799d09f47ece0ba7be4a283fc2f0b19840b9cee2379a947956c653f61c450cf7817809b4e0528bd3cc60b39d329640ecaccb92c7cf39575f16942f540f30b212c8dc4c953f36339e43097438ddc9c51693d249bc5276053c4e80d7360099045a7ba697b3294fbce8d206104920eef469497dbed4a9ed8c0442ed34ea541a73c87f297b394ccc848b2d4cbc0081047af58b99f57cea6b17bb007904423cf89734579dc3d7208eb8136ec49d80306211a8d3d9c58c99a3b90c2a021d37cb2d9feabfb8787262adf2c3470f401281cca2d6626bfdf0dd9a0d0108225032b3f692dd219adf49d95b78fc8a41208740e72c0639edb72fc79852f615175b98e4305959f9f1263972982c2238393115c0192086409bccf8e2baa8b4db0d5208e4bb9472f6d4c935f192b2a7a357004208e44bdff951994ef7d58e305652182b6610083b9ddf0593e9d964021041a0b5bf653e8bea2cb89fb2a7f23a547e04021d3ed766f1b28dcb5fc56e8772812282000229344bcf62107f51a9900fe40f08d3d95c6a19a55d00f103f254fa9abe29fffdfdba0f68393c9e166396add785cf81f00169735aeb347d321dcd1ed033e72b937cd0f8da15d7036295cbe95ba8adc65806207940278dea3c54a6964f9b182a5d5001040f686dd3e12b3aaa3ce70ee40eac27b957dff65903c40e88cdeab4c3cb6a3b36ae035ae7f0d55ad789666a41e8807a71ba33ab95bc2c7c2897734089edd77851cefb262d881c90f6ab39cb3289e38096bd4aca8b515ed4f872e08078bdfdad222fb37a654f4e7600f206f4af4ced52376ed03a9f00e206efc63375d3ccaf56bee011464a0e3440da803ea553ce66fe2c87171b5022fef65a166ee3723865efe4e4e4640b931c262130e9620b13c0000508206b40aadc96b4a069275f675a0de8fcb254e5bd2a3dcb2b0d48ffa4c5d29b7fa7cb931313c000c50720684069e1b3e89ec469f460fb0fff80e730c991206740667ba985e78fabffb4470c1033a03f5d77c7d1531d26fda587094e4e70005206a46fca67de8caaa8201032a04d6c7636abd87e57e7a0478e93931cf45051b901c818d0a65667e987e9fbbf031d2b772977af43e5478388011d33bd7acd914f9f65c280d49fe53d1d5efb632318d05a5b49f53425733a198a182a3fec12bf80d896d23dc6a4e405b47e0a934f3975666217501fb3946a6ebcced5817001a93ecb5cd49e83e887c243c72901c816505aea1d0fa7deb5b8cbabf4f8b1c23c40da38ca6eaf741565f11e602c60bc8e05c206b2652dfbc668bf2d45f1d1e3878e84e263457f00b2066237c978953777212f0a8a8f15544b2b6018733c0051037d6eb7de42cd938b262d2063b5798cb2d2943d1430c0f045932e408092f2c3c72f3a00c902d205d3fc82b6389b838f0564a999bd4fea6975bd02ea656d9afd355c4ddb34101f9569f55a68b6af06c40a686132455e279dd387a2d2c31c26103450732f690fb67175e6150620672c7998d32d7b72b553d4078819c88c9aa378ec0852853bd901420594c69341fb47f334e652f6b80099023a4fb3b3f4724bcd596520c74c6a496ffcfce3ec17804801194573aa7549eb5e7521039df751e78967eaf05514902ecaace694514999c35040d6ea6cb772a3d8d015e409282d2ecbccd1c5cb70f1e8a1b2505256c2f061d71b007102caa5d759b80f266fb2d50494c960328fc640c6408b2f2b4595cf0494ac36a565107b7d9a65092851adb533aaf605938228019daeeb63d67399f39b297b7c029204848b26d34be92d7b1663020812d0327f576f16953809204740cb8b2fab9b9596ad5fca1e881110be26a56a5727d6b34540acc6985ebf646b5f2e0d1022a0749f34ade5e4a2f0b40219025aaa6bcf3a4a8580d4f0ed49ebb8315fcb204140d74b532a744bc9d3a511d402a529274e4b5f93711b2d50af5ce5c57a9cb277ae04039805625d7cd4df4ac664cb8aa7b02c96d33188eb4c75bae7d103c56a30805820c35579149fe193a9c350e911c60dce8e01c0c2175eefd87bcba28a53f67ef8fb7895d32d18c02b7a93b15cb9340dd3ca8f1e6080e109e5550cd10cc015e896d574cefff87ad4a66c2bd0ab5d4c5bf9b9cc5acea728cfb1629015c8f03f532fe7fca14a95c30056810e9e1e3e69d09819d524e97519118cac012ddff4b4d65ade93f352c3a5e29fa783bcd28014a7db5ad671ea3e7634203bac765632bb5e56ea33a0c3e3ea072dcf987bcd8096e3e26c77d5ee5ea70ccbbb39bee49b53831132a0f4c4a6de13ee2d9e740c88d382cb2cfb793c1d356240a6add2822b6ff1e30ac380f4701d5cca9c3c77be6040cb9dd483468f25ed4f288c7c0129bb9e566c0c2eab157b01b99adea32b17d305747df09747b55c1346b880cc32e6d3bba9520b1e2583912da063d4db2e2ffa2e7b0290869136105e9b6a2e47f98d75c561840de469a7476f5572c3c81a48bdaa63668b8b9fb58a0c236aa0b390d7ea5cef799a78d6881690aff695a6d6a2d497be198c6461040b695252d8f867492dffaf1d3d94b6317205b4fcd6ab5363bcfc9e9134d0a7de59ff05ad0f6f5b01995a6adaf575653e2934902a3c8c968a793ed9198897b4ca20bf32f7a53365b9488139619870b185c9c9c9c909df2446cc40bde862a94e952e6a29a5ec1d932e40605a305205a47c7135cb6c5a3c4205e46769f59a5b964fe7d874208c1bfc07d4b3e0b0b91899023a3e97c7e0fa8a4a18ea55f6874a8f1583819132d0b16316e475b5964fa63cde8b66c18814d072af8a6b96566b7c4e064acb82684b5a1a7ba8ac60240a68619a4fc5546c9653e9c3a060040a489d4a86bad8b8498b9e951415142f3ce5952005252881a1ca8e1d19839127a0a3e628b5fcf2caead8b51a469c804c9d77e445732e7f65ca5e9231d20494ec792dcfa27ef517eb61640cc4abf818beabee3b8c30019d2775ff85a77a0b9a3c8c2c012d5cc7ff4e7559aa7425a05fb3e7e4afd5ed5b6c879124a0b4ce9c646a9dc7ac0c129069c5e5a4bcf838a7f59123a063ec4ceb7b2d353375da3062046467599452ea7cd9305204f4ec96cc8b9fcdf5e928e78cc1c10811102f9df0b4a249c6b039313204b4c796a5896af935571f110262bf956f4bba653dc69b180902f2d3cb3957bcdc98a54e8f5aa0fc05cda37a4b2aa5a552f6101422b440665399cd51c5cb667f16e898d3c76729f35e5e8f0322b240c9523abeb70bfff27462814eaa0553edad030b747cd231b5d9f2719b57a0545ee6f5c9b4882bd05a54e23dbea597ff6f057a645daed49d175467a5ecf6ca4a0f1f3c507cacac082b96b57bf6d8f2a31d386a126f1222ab40ae16548feabc0b091155204c6f16efdb37d545d3214452817a5f51cfd1f49d74d64105325f77b4d1ec28c37d22a740bb9299a53fe5e2b31f5581882950b6a9a48ebaec154331d67f0ede043c4e70ae1322a540460d3b7361abc4b37cf983d1cb7f0b3544488196a33c61c2568acb7f397e101905e2555d9d7a8e597eaf28109e635ad952e4545ffe059150a093d4797bda360b0aa43e9d5c49a51fff217f02a9dfe3e2dfba9e409d7c7f0e2ffb7131d50974b9cad8a7731a9759750b229c409c6971536f47f92d4f4511d9043ab94cf254efc5d39db1404413c8682e64eb36cbae33355610c9047a538a3771794c203689779d5929f5f4a54938885c0299fb5eb679fdfb1ddd12085766e2fade59bbfa4c728871722246259059904df7afdd5ab68d0e5674e025307f10a10432bc201e435583cd7e700e229340680b2ed8bdbd1c1fb3229240be0acfbc3ad77f4a5724d0f963ae55e26b1a44208194ff1cfa41957ba6fd112821ab540b9b73da2cb53802211b9bf5c9f52a228d40c7cf1ba5ccb2b9a96718b15a7b7b51b31c3f2b3113441681165f6c0b0d6df3d09015812ca539f75ceaec132e35834822905a6a83c6d9f48fab1c83082290b1e937cabc2536ebf510c8acfb362a4f2d97aecd1068b7afdb7159c38a577341a4102861f3ed1b5698bcd4130225372baf99977f47641419045af7de8e69fe92da1e1404ea5c661db4d3849e5a0502e9e26fce9c5a52caf603044ac7f818553df9f7fa7f40c6987ac34e4e7e40867bbd97a70b2fb5180c44fa806ef5724e93b8ecb3151f90991f4f69ec7b4088e7797973ac17135d0fe85c159e957692d1dd95b2b779408b5acaed6e3195147b2c2c8207f466ada949d747fbad53f678f4e8217207b42ad51ef114db1a4f4e4e4e7e6000c610b103520b2f2ae9397ad2abfa19227540b7ded662f7e598e5ba5410a10332d5c4f53eae78b9e780ced7d266c9d6b386881cd0d29d9ed3bbb5a94d8d03bac4f3a7bad7c001f16269de60be5acc67a340e40d28e52bfbdcf5c5ecb36a37a03bfc0b31fda7eabf665386481b503a6b1736a7d669b6f71d88b0015d52067d73a117ba22b206a4d4729ddfd2c9d8f1b58608226a40cb9945adbf97b530ed77b17c8ee5d28096b6ef722ef7fc4a251a90e2df320a33173e4aa97e40e40c8819973633e27dea84226640f8cbfe6647939f59be2c03da5edef98ada8746a915578308195076e3e11f3309d5662844c680d4fad7f23b6dcc1f667372b2bc490e931c2a9fa27e9874b185182ac7c909cac9892844c480141395fae725434c9bb22abff24c0c44c280d2f0abf4c9274d32b62c820145be807ccfe6a27e7965eb1c15f10232e3c7e96cbb2fec679d9c1815fc824817902db7d256adc6b52c4b6888700125f36937b32c6332695a7cd10a9ec816907eaa7cb350d90b226da065469963cc769eb6512988b0813ca969d23c0bd15b9d8e1494df818e95ae82c81a28f1dc4a8cd9c74ef2a3065a9619c59972a5b75eaa05d409d390975d536338b3801e73b15bef8e5840ce8b2a664d98ac5b5d01e9da4aac9e334faf5f1aa871399dcea673324951c810b1025a7ca93d6f95462dc6ab051134904ad33cd76a55a1597efc19a8d5f76d15377ab2313390496eee98498b930d912a205e56d8dfad679e14a1204205a4ac97cb35ab964a6ac129a0b39cb47ae95a7282481948d9964aca132e7f5e951450f2c574ebda855b7b193344c8406997e9379c7851c6144601bd9b451daac2d36e0b14d019f3c49bf29884cbb993935e9982c81390ad5c4757c2b532b18f21e204d4c7a7df54b9d12c6935019dbd320bb6c9bb849e4e4e44c640bfca18f32f34cbda73224c40bed8a2d0bc1defa57f4620b204b4ed67d5fe9eef36eb51ce8e0f224a408b3268cb6f4fea650b4592809626bb2fbc78b3395f24a077d377abcf59f2c23f822c881c0179aff73eed4ad728af490e132e50eeec41c40868553adf53bd655fec1401592f1ed56b8e8a10019956eb6c7c63eade8e4183c81050aa2e4915af5bc646d9c909ca191121a05cae7f8b3a770b184482d0ba7756e5afbe568ab540dbccbf34bf6eaa64450b94df78942ae3e65a579a0542d5dfbe4b62cbc234a2f1624971c9b4a4eca19dca0f1f6d84c402a12dcdf44bf681053aa65461e2d4a6c9d72bd0b95916dfbecfcf7c75057273dea4e329fda0b669054abe976b9757ec9b9d52f6763c188ff2e3bd60932e40e0050f1d5d6c7102ffe11f50e9f14305292841094e4e50547688204700d810c20a74549b63966592615b6715cb2ea63e77c1fd7498b2ca5008510532b7b4a7ccd174c796a940675fed4a9b2ae9528b8a9053a04b0b72ebaf9de5e439299b8313fcd283875953a085eaa9f9552d8d6b580af4eafad5b2634ca72d2705c2d5accaf71c35cfaa4761f4b81b3115196dcd8c5912aa52ea1df59cc48738c073658488021dfa517c3e5b61b2251448d5aa3f5e9f7cf5a705054aa82797fc7335be539f40e8ef77fdc6a82750ba346fce7f5cce974ea0ce5e65dd05d1b06d09e104bad75cf8b049a9b633433681b0dbd352d4633369414da0b5244665ae4d2f956702f9f572eb9823afc57d238460029d5f6d85a9bbdcafe52f815ee952c7e95de5bbf20ab14448259061c655291f55fac564082550de519b96f2cf0ac450e9a20521934078d2139f4f87d352658824d4474824300412e8ce32894df3bf37774f4ec0f0b143c723d0da65f196753c6f68ef08d447a593bd26bd95a56a043a79676d2d2b46a0f47f1a93d2b3c8997c11486537afeb34d907531581f6f2185f548f19dd930884eab85aca252dcfcd2002d961b3a83c4997adb70c39045a94274454b8924acb75ca5e775e7501a56bb5c99aff865d1317d076fb2a337f0773316d01f52dcb26a3c9fdca2cb58158f595e6822aedf2cad940b98ad98ff1954ce5af91867f1d4676a5065a8c52662defcab4be6b01fd3aacd6c24b4a672d9b05b492329debe710575e63012d86ebb9fc827c05f49afecd5dd9a6819e7bf5be52865b7dab1550272a9e45d7fecaf544031d755cf1ad59b629ed19c856a6a7f2859d79ce0cc4794ad93b5d9e29c32a2056f3c95c2eccfeed5440e6975bacbb141ee373534029754a47a5afa5b8be0cb48c255fda51e88bc648a4805ad32f8f49cec7a84b642046b3fca7e95fcc4ff228a0b3a4ada56b33d3d3231490aa59e5ebf6fcd26b8fe409480f6fd551ada6727b499c80da209e1bfc95347f2d491350de1b2b75669c640c1f244c40b68766cd37fd0d799780d4f295cce25deeee7494809665ce4c25af21490252ffb568a639e7c9d5902001a964784d3aca93878eff7130203902ba65392d7c8df25ff80e4b3074fc08c3bc80c408a8d57a6a5e6ab0514052847d4c674f9a743b1f3bc2c811901001f5d95f6b7055dbda539221a0445cb4fe252d21204bc6969eb4e8930401bdbeafa4ccebddbb5f0bb4d83b2a63e7bbcda88516c82863348f7d5451d3320bc486c946b9fb220ba454f5cc980597b3b88a055a2b179a33c74b7d9382056acb57a68eb17a054a76dc0cf73ac7cb47b9026de39dbfb94e2b2d46b502b5cad4ea534275f84fb1022da36cdd58b7dbb24b5a0532a86a19543daa40bb98748e39ab974ba940b8a4b72e2af1d2bb202a50ba1f334bdbf878964e81d2dedaaf79e3acd24d81dadccff8794dd3cabc14286d0d931a46c56e27055a290d1e5eccb217728f0269625f3499759ae6952890ea25d5283da5d62ddc50a065c7b493595577cb0e28d059f64d5e52aad252fd0994cca8ba7f6ba6a57a02fdeab4244e69ad85db74026d71b384e69c9c400b5faacfeb7552fa4da094e7998b97e5780f5513c8171f378ef68bd5ac4ca075698bbf2bedac57830994767b6fad54a745312f81dc6c8d49664137ca165ac2526d25a5f6b212887bf3b029251033f65279e7a4f9c449207e5fce5fd47e9e752789565dfe482cffeb8c2fc4870432c7e8feb62e4bd9cf235022763aba9d9f5a63297b285ee8583c6e3802f95a96a129a26a047a6bb7b54ea9ee9343e2062350eb613334acce2250a7946affca2cb753a90884ebd12c8bd9745831f1ca8d44206338d562729751e6cf1a710311489fbd1f51532fca27dd38043addbf92f164f3b31673c310287725c58b75ea12e24621d02dcbebf35aec6795e1206e100219f2faaf65ceacadff4120fee4e77a69599ab34a10e8954ac7d2320502d9e2d657dc080864cfba8fbbebca6ce93f204c5c6b27173b9b9aed07649457ab547db8b4527d406e677b512669b62fad7c404bbe6ff7d92d2995750fa8f7d75996992dab6a193da063358e4bad3379404be95273f4de5993423c2036dbba6c9b193fabdd0171afb57eaef3a8b14e764099f612cdf1bb0e68496a69d2b53495fa311d50f30cd32463eba561ce5376e774ad9d03f2b43fbf369d3e856ae5803cf9b52feda655c6270e08dbacc2455e7040bc8ea24a7773cbe95637de80d8d6a2f7c6b7aa5d0d0437dc80d4b25dc9f6942d2d5e6eb4e14e6eb00119e6659db3766bc52487490e13931c26623c094c7298e840c77a152e4cc0836fac01e9a29fc7a658ada55476ece85b0143c78f3014dd5003ba857f5ddded59879bef0c37d28094a73f8b3d69aa6cfcdf4f9e968d1b68409db6ccc24bb2bf6e3be70c48d36d6a538bbf2e6768ea70c30cc8fcaec5d2d6c2b62c190c37ca8096eeaa26fda3d271f327b84106a4d45ae27236b1eeb83106846ee60fdb4a3eefca4e1537c480f2b4721ee3fc94878268d205087cec58410e1e3a54b043b9e0e4c4c78e30cc70230c68e5329a693c5d186e8001e1526a52a765aff2f4be803039eaba25bcf57b9e6adcf002528b5f194fca39b170a30b6825e53626cfa4c4639e0b08cd3b1a376a510b37b6801a97bdebaba57831e9db40fd6bf52e95f41733c52bdc6003a5b33fb3ace5f6e9978ac18d35ded6b59fb570d11b6a2083c6d7a79e678a8b49c10d2d20bbfb653636e7e4a597c28d2c20957f166f5a7652731f5ef1a1e3071937b0805e9976e5b510dfb4ca943d14c61fdcb8024a4ba3e7b6ea347b1f3a7ea0f858f1a1e3071837d2409fd47baf95bcdbb86105a4abbcdd602e5fded5b2e243c78f1b68a0a38b557a2f2e794e3a67204bfd88cb599d958d9ab2b77aa0a4ac78caa6ac7808ccde3003b9b2e3d3a6998c4ab9f0e14615d0517dacbb2c6d2aa04cfe0693ef2ceafaf370630a28295f966d498aafd222de1b6e9481cceae33f5bcb920232e952935ac94dffd245067a4e7ea7cef3d955b6a280d4ab71cf47dbef4c0f056486377b17544ef65f9e80f0d0910fffd3dca872023acba89ff4deaa09e8e4b269a68646695ac640cfb92c85beccb5792626a0b43f76c697956eda7a0928d5e0a3baa48feb2c2b01bda75bea55ba64eb9c4d0242f625a933f4830484c63be52aa5f408e896c5bceea66c579e6a0474960fdf78b14cf6638a8072af3d79cae5d1d82711d03ac7e4b224c5330494d09634b958f631bd13027a47b5ee53da8d20207f33c998b3d4a9c7b816685fadcfc533135b971fa105dab4bc63eee6feac6366815aed24e6a4bbde52bb2c909d356da56b799b518d053ae718b7979f1e81055a5495daa63c7db9cb8fbc021d4fbbe98c6a4cd943d9b14304c80148c4882b909fa5df73e999f45d6f055a6c1dffd2cbb2de9acd0ac4e8e71caba39ceb8e57813c2d4bbb87f778f5f22a3f50de87185d78c0dcca59c4882a102f2955dad266a5551c7cc1271223a9409f5c37139953a7b4ac943d1c7c81b2fccd9140711023a840697e71390552c6e0e2fdbccd6755320552e4e45b78ce4b81ce2ec59ddfb7cb2b5b52a053cb2e5b5c0b1bbd4781785d52c60f9319f79c563901005831220ac4067da97ad3a84bfa2e8fa23d464281d6ccb6a66a1b1b7aa7eca11c82026d5a587bcd36ab9c4f20b63369590ba6f560a080e1ff6305e50b30c2487a265d80c003fd239e407f2b1764bb35a99a964ea03cdb09cd7ab5b0d9559c40cb21b342e6445c297d13c8562a93cb72ba3581d4ea39567cb88d466502a95d704957de07e5de8b05b1e0471825383951b1c35f7af0300148630413687f19d36dc6189b5d96b2c7cb55707282b243e920472e8130f760ebf6fe5ade5a02b9d957bd58db2d0bbeb5096080d283914a2075b7980597adead1c50825d0f6e161fe45994e2393407874d93a9b6639aaec92404aa54ec6737f52bb7524126ef274a9bda37fcce91881045a8e864be1e9d15ccb23d0b977ccb5c7b453978a32e208a454266fdd75bf5697a5116869326efacf276ef65e81490e13169870b185c9082350a62db9283dd35c6ecb22101a6b3655aad3f9988e2802fdfa5dd4328bd99bb4d39144a077e33367d7473d8e8858ca2cb8a8baf466b3974320735f92be7273364f1e439c25d5d5eee10cc14821d05abe5467fab4985cba7df8a7f0082190df5267f95777068172593475d7e97edf5641a03ee7b537c5ead462881c180904e2f73329532e0f0864c97619c5abe68b52fd03d2bc5d14f2e29e9c0de50b7f95646e47fc80f2a8fea9e5d8dbd15c7d40ebd0a4749edc17fd94f8809632ee7ff43b2db98ef7807433f90ded24569b540f682963c79ca5b87b25e601612ed57f876f593acde00135f22aa69f33667dfde0911b18b903cad7bffbdfb42c653ed90119ef1d7396a6257b3dd701193daecb61d2430774ccfd8b7a5dbd1c770e486ff9c25b8c715e472307e49bca7dd194dcb42e180764bcd62e6939cba5ec899150ec98ff870e330207d46b17be259db9df4e30565aa503788a87182b2603236fc8931d236ec85f6ecb743136d6ccd8066450571ab7c5dc62fd363ac206f4471d652bdb7a096ce078033aefc7f23ffdc27bbdb801b9f331b54eef2c894bba028e36a02597ef659751734bfab301f982a80717ee355d76770b38d6b0cbb83a692dc9ac0b1c6a40699525ee65394795d2839b06b498fecbde2d8a060e34a0f5b59ebee9dcf4096387c105c010709c01b95b9fc973e8297bc7a40b10d8e981c30cc896d6e5358fe6e1b35347e0280362bd6bf5cf98d9de461138c880d22dca3037e93206b46eb79227574aa9ad8b011daf93d2d52f4a9dfce543e00803623fc826b5fe41a5698e1e708001392eb6957add52258538be802eb13967ed2acdc0e105b490174e9a0ce7b2eb2e0538ba808e626b5566d6a29fce05b4ec691b64b3f439cbf5169025339fe6dc511e39e8c1e30b94151d070e38da40d74bb951988b0de4e95c32b6d4c26fb2d740da7d8c4de9f2af7a8b1a68f94c7a522e7b5c54ba943d9382939393132f78e8f8c231006ec0a105d498da24758cfa32706401614a26dd3e2dba28568505747ec9f46dcca8f3f1ae81e30a48b52d27313f9db5b6121038d2409c87dff09973fd5fa6878a0f45050e2ba03798b655ed9539b5c6c5ead143858b9393b357e04003f1a5a67586befb061c67a034a6741d34665f6d310319ff46e73769fce07d1590abc5cfa73f5b55b8a880f8f49725265c36737c0a68e1639d8bbb16eeb5d9c516262826394c4480a30ca44673d7b294d2b3ddbce0a123a50b95e7824780430a689352c7f4ef5a302d283b7aa8acbc15010e32109f656195b8cedb2e6d14305cf550f1a143bd0a8ae29d5de288024a5f5ee5bea3a9d2300338a080b693fa664e57b60504c8061c4f40fcaabc476dff4f26c7e10474d42fe6d454cb9cbc34011de3e55c9ab9f236268d816e8f519d4be261de75ca1e13902f5e360a9dd51290c1ec45bdbaaf12d04acbf31ff52af5e2799280d6927ad8962dc7d6a941024253c596d8301e35e038022ea8fcac1db3a7d608c7d2fcc95dc6f2d51c8e222033a9be8c41030e22204d292d8bba3c038e21586ebff992c7955a140e21a45adc8e9ffe9fb7c51104b4d8ec69f58aa7ff70d7022f7d3ff7ceeca205c253b52b5d7ab7f30567817457fa4dc7c7bcc83394c8229532ca8f9b5447712c9059cefffb9f594dd77a871258a0a56aa593eb9cb77e5f8152c26373de4925b532b902a5e5bb320b6ea799de56205e0e77f1c15b375456203f7d309939b78b3aa8ab408fa6275d7d97b4b6540523eb2fc5e6659e7c5281cc9974bde8b91d5e1431547eac1d4a508176939fba64bccdc1950fe3d4a1e414c8a83b7d0eaa54c7545a4c81cef679498ba7cd37794a814cad656f920f9a25654881709d546fcc9a749bee72144b72dea63eb731e52c0abf84e6a8a3693f1333148bd53a279de37a5ef58002bd7fff9234e592b2878778a7f2292b1e028b43c927b4956275f23df5274fa0eba47659f09c6bdc559d40cbaeba46d3be61b32827501b57eba4649d0b5fcd2610e2a9d5cb6e8a170f6a022d36798967cf2da6f3101eaba0241328d7a2ca2c56e8d6df9840b8a0a5d13f3d66f19d1fbfc2e782924b2047f5a61397a50e4dba00c1ed104a2c81fcd6d9537a32d7d2b1a02c6625905ac8dac64f2b473c9f9440994e2d9d7e1dfe556736944c0225cb5eca5ddbecc96427e5502209649694cba6edf41c0974942d9eca54e54fcae3078f2f81045ad897732a31616bf692b2779ec70f1ebf258f40ba695107cf2cb32c2b61ca9efea203072d861247a04fb57b16fcb35bceea56a3a411e8a4c39f8caee57f49bbc70c258c40d6ce9e4bf265542b2b2b942c02392e7ffe122a7b32c74a14811ed772a7d5616237df44204793523275cd6a1d23184a1081ee2cc678bae674dbcb1f02e5f2abe75f2d6a36fd0d81cea2ebe6e9ec0b819663945987b7934f5a0b21d06ab3f253eedf415dd220d0e2f94b32ef6afd8bba20d0b2ac56a6976707022dbf98a95f6c71b33a0604c265b1bfef54cfbf96fd034ace2b2da5e1fa0199a5fb55b7aa37e29b3e207ed5b99d7e41309cc7094c72301f90c2a5b70ff3fc5ac6670f0873b5596796759693eb01397ae2793d67a3965d2579406738bda7a547979ea9d7a1d2c502868e941c4a46091e902df8cba7748beb3f2d7e5128b90372e3e494fcf8e559b3d228b103327e70531d5c8b5ada53520764b9727ba5524f07d4c68fdaa7a7340774964947318f7d9ac5960352bb5fa96ffe2c4b33c701293695e9e0727af817030774d78ba3f1a57d79269b42c91bd02de7e0e3d279fe7161943b444694b801a126d793bf2cda6d682130c9610202931cc82487c90772b4012d46a54a87d75a73c35dc206e47ede678cb36ad23d932eb62859035a563dd7a7bac4ab7abf503db658b9324ad480fa2c834761ee39e5c7d1cca1240da8cfb259c7974ffb337972a22568e0ce7b33f98688652839035ad6f35e5d5d8ec2c327275d28310332eb6607d3194ce6a00f576981114aca80ec7c9e35361a6dcc44a3840c88efcef9a4cc4ddd7e780cc88e2f3dbfc48b79e7c50eab502206d49e4b1b4d6f38f15b8501bd19734b5b7cdf9bb5040cc81977157bab74d6b5be80562e8cea10532edba15cd04528f1025268d22dd7ee942de9025a4ef19b9e33b3c7b55c40d9b9f0723c665c95e927946c01996173dccc358691bf0d84ff8fed86edd93bbd174ad840777ecd1693daeeec15164ad6406c0c2f271536a73ec3256a20dee56717836e52f26595a0440b88795397f5aadf9379d42c20b330f24a5cd4f7feb258404b55dd1eeef38cb9ab4aae801abbf7e42e755eaf3c65efe0a0240d74eb66113f2dcb28c434680594cf6779b85861e7da1f2568203f884be1d2b5fa8607a24ac919c8702d6937293d3d9932654f77281d188f1233502a5c50194fb6d67da55c28a9c279d38b9ee9af36a7023a47fdb6f5963a4dbd52f67cf4f8b16274e0164aa680ccb16aa3a88bab3d355c69a3a40ca4e91685bdbfcba21d93b2e7050f1d6c5f28910232bf276576e6a729e5a3f2c3470919779223288942091490a1aa9594cdad16943ce14e6050e2843ba77a50d31c357c67782fb13f73f31c1b17c6733e7c879d4a8f2e6902d2e5a4e15f8e4d4afc65c25032069630012d6fabd65a6e7155ef4ad943e1d16309c87579fb4b7b97d2f9e8a1f281354a94802ea92f54c96c592849024ae7bc39785e554ab8b0184f8246027263dd53c46fe3c6a825941c019d376ab8f4ce1b01d9f3497d6c61b36d8b292902529d9ce6957a4504b4d4d2aacce129d6644ca9503204649693cea7149f5cb99210503266593653eab5b9b019a32408c8ce2acf736f4cf659670924b5406631d3b294f63a5b7e5a20b58c4a632cbbfbf977166871ae4d86a77dcd9843220b74b9ce9fca35ab4661228905b2568ebada5cd1d00f9641020b94bc1df9a8b576342fbd0279e667b341547eccda15679ab62c33beb415c88e32b9a09d95543e3f2b50fa73fbb2a3291d345e05daa5ed8d27d73fed8e2a904aeaece49f35beb6970af498696d415dcbfc9e91a0c284e4140e20314505484a81a2c34707b8780009295ef1e8c1009251388044142b62fc17102009850e1f1d8000092894e41326249ec041d2094e28806413280520d144054832c124985874a0fcf81504905c62e575e8f0d181069058820124952000092526f18347183d54014824f1a3470f951b2491f8f12b283a7c74c00024903000c92352563c2502248e900049234818b10092458891501481b2920844f458092039c4ca0f1e8f8337040aca05480ac10012420c82022482980049202a4002880790fc6105a501247e5851e9f163a547080e40d207141d3e3aa0f25fa8f468010448f8e08517de850548f6b0a287950790e441012478405900c91d4a48ec5000923a7ca17a80917090d02184640ec8ff684253292d5bbc9f440ec813e79d76ce1507747e496aa70b0e681dc6c52d4d9936b9a437207579eb9865932fef9edc80cc7c52f39a49f958f236a05bcbf82b3dc971a5673620734fbe86c6790d88d3f8549fea339bfd6a40c6cb82e620a73420b378f2c9f379d2f41c34a0a5cdbe4c612e933ecf80ec7139de7756275ba866402a975b5c25bf4c976dca804cab762b6596aee53c3220c46597fd74ac7097ae31244bde7e6240696eed2f9707cf59e7c380d68da5b6fcf4a8582d6040af0cd35ef2ee3bc62c5f408b3d573ab6109332b3ac3a88f9298eb0a894f1a52251200c0682a1208a6118989a4700f3120000101416140663d1703832d4a67b1480044f30305636381e2a221a0cc7e2d040100a8502c170200c088401a11808c34090e768ccd60700c72069b044958751ab0ceb036d79b23f65ab1410d6178834c5f91b0a8b39d1f55aca458ea39813257e8d3726ec45999c7cfb589971d1bc029208337f73c06021c464424153ab40822d5fd25d0c58e397c6b7646849b77f407a2fa963c15362e336a05664126c5f5b28876beaaa16d7d3e4d24a80f550941d69aece43753cb624324b203a838ae074b196a6e0b231624cdfca9913058fe6a8ae6759d190b5597d4a4acbc8043ae0b462a0f281fec1d20a390001810d33639c1ca0897fc965237f7f443916b4adbede06226cd368f9534bca7b48ef44e9d2e44aa25b9fc5a54c2231e4c94c4e8a63d4d00ae589345718c867b4255a62925d43ea9b75335e1f40b93729a1570266d1a4ac309a549ade3225e89234e4fba27ac2273c719bb5ea74fb5ea2bc5750a0579efcf02dc245b2533472082e94e803fa07c3e5cf592be58ee7b851895b7743825ca29301d6dd67c45b9e4d8f2cfab14a5bb61490e2c8a600a968b74375adf888f98611b7c4139ca58326f91531caab04daefd008663ab55eb5f11ae7a9d2b71850888dca54ad3520ac08218e3a0a9d85c15330535ecd928da5a186e918aabfc0a1548886f282eb068148b2024c21bd4577eb279411741c46083e885662a8a8e68a7581beb057e4190853257c983d8d539632b07f7f2d40c7d161839ca04dcb48e09384dfbbc3d691995d4facd8098d8c070039b6077b94b816c97393f900551b4f80800a47a79f7af9a69d5a86f9ae7771406fbaf7fec16cfdd7ef7f02a3ef8fe30ab717ae70e3b081c05e5ea0a1e815e5a3bc82be622c6aebf69cd9f51ea32be6860840f04674267b6140305af441a01f33441f4258527cee0f31ee28dc9a7184a1bdae4b5c20580bc461812d7bde3715b22ee6780fbbd9976943778029261b7c3876d42aca527abc2b32223c34212f19ed303ef6165ccdee09c2a083d1ec9cc483a9ab3f5a11a7a716061891cce81f1fedde945c4d5d191ee717fd6291e73f1537aab07054f96a19a1e9a2137fe31a70a3e1f0aabbdc68928589fd30e7cb04ffc289ae067c75a1429c6850f75dc84c509296efb10e4e934162a70e81704af22dc5accf1386797976266bada5d5015469b56e569542cccb9839311c8261d7ab135f2b062ba7d771677d61517a02e0066b99013e449311281c9192d117188371de66a38ba164254c14aa8039a4d54aad72b21ade152d40888ef7f8e875c869fd6dd96dd436f22bb07d50fe31d07e8341dedd903c66294d0716bdc24400bca8a426c597c4ba4b960c4258ee6b55c0b55ea1497aea13a1f03d78615e128563ea8a57e0c5f5a910744b5829a825f27944864bbea9c81992640dc2d6029de6c539a3082bc574089193893df70476b536ac0f4a5f9c0049f130e4b422b54d2b39dc624cd7469e0d5ff1e90dbd44763a7c4644cc8974e2b715f23ca358bb1c200516021632ea91324b125a8f35a37e4c01d58b5175262bfe1904c3e22a2c2f1870e27800ee5af760c424db5b3043748d436a29aeadcdfa81f0d18f06d293cec9b03fd8b951752b25efa400bc07ecd5757f30c81d14ac4e93c4ca8040c3d6c3dc122d8519cbf8f3ccdc7c9f8d4284813fcd4caddc252b21216644752c08205610b0c0504ab94fcef3bb25d46cce6fd47921ac101ae2957023a4f6efc729411045486edeb283bdef16142474c7c95634f21c7435d1814e82ea58da4e5039a0293d60d82c60f2a84e42a82c238238debe85169943300e08282aaf708218a8f87f93c2d4f895706404d1ca7fbcb90571cc64fcbbdc0c68e59919021d68d6703388c30a3c13e36f892a0f6aed6f41e22a5ef141a23deeb0bf72e71882113e6f0867a25250450ec2d6103421900009ce2eab6874b2115e457853106a205c193e4384bd1381439a03bd37eb23f711e4b7e682ddcbbf8f6abcc6f77394778b12ff68de318e1c5312ca7234f8ba28bfac62f30d5b1a31e158e03c058ef993613978e2c32e0e2aef5517affd0034b4e8850ea10b14d72baf7126b1803d6d52eb793c332083474998c38030ecc152c62f717f1a109e203649e49f0d5b156220f0f5707f800a8dbc09d527eadb1a590e20e165983a5e0b239cf96ae5182a84fd10ce45a81204ce4e7c16132656bb0a04a73e3c3652381013e9055199da1d9ec941ad0b240cc10d06119905685302a3b4824a005e2210243bd1e2301bf6bd1953b8658851e5839284dffdf03ebd25d3d73e38750ea4f2d8a59e0b02ade1bbb939e98d4d45a88766e7c0cca08862f1b33a7e75c16d5b2a0cca9c4b0f0732d4fc10c76c1f727fa30d636ee4d1c7c6bbd8ceaf8f9389aef38c308481cfc86672d226fb9677c6c44d1317f702e60646db4c00f17b54ba42bcaef4d680f192fcd3d2a0621ec68dc0925cbc23e3cee036ebd448e64deae3fa87b1be6d439fa4aedbd8bb89d381f09cbd9361ca15443772430ff00c12dbf27d96cadab6e11cbecb1529d3e52df73f0e06824cd55520741fb4e13b166065d460c635aa962dd0f5319586b2dbd2691ba4cc495e0f5005985623ba161b18cd8c01a8719e0e40aedc39f9369894ade21e6b1c552f94cc8e9542a164b0360810a11f0f5457d880ccf39caf973ed4d410408548a34281640412c794e24a165423b704cca728883883f1bd8a9728a106bdfefb3e83f2b1329276c6de85517c3b10633b44eb233a2c98c7f452e0214485ee93d20fdab2d68fd978d3f2957d82460181080dd679705e38fbdc84905146108b1292351f4bc913b7c37bb09b6febc13effb7d9cb2608c9ade754e865ca30c6194cb03f8a4e39c82909964c8e4b43b33646d14ecc51cfe0b5e47e807f629e354ae77f41e0778a6feb83df822c0bf0ccc9cc423768b63e8e09e8c7de47fc27a5c8228969ce750eb676e8eb7244c5241e33e861a82d839f814af07a2b478fb923492388f1ca8d7daa413f351a8ba0eb50285895cff9606dd88d3138c95fa454f4c433074e9a7871d18106962ccade1a8d3013ba8c544f0c7ab248559c058c25963c56ad598d32ad71c57a2b5e450d2e715ba277c94be72daf32738dbfb9574714abeb9d4d50347b67c54c7c9c53fc5b6433573eb067618be070c4189224ce9c56597e703c6b4139329999503c176e9fae247fccf742932303ecad573d565612cc15c5098e5b59a45df1bf91d9609119b5062e3aa66eb99afaa89f023db2b3dc486942367d4848edccfe6b9f44ebb7486d1f26ac80a185dc0c069a30eb56b2a3cb1f1b5cb8a0a58f4fc29f10ff19c13decf510f1a5aee17be6e7c1d39e20c5764e3db0f94406150d01aa6942dc3a16785cc3453e06061f2bb2a8d653da8629c72e2b0bc04293167422b3be70eba8eb4c7734d33d836da05467454220d604923b5bacd9213db0cd09b0a84e983766742c59405f19555f777d4d8c02db285a85f0e04c0300e09bc2294aa2ed6ad394e04b4352a1f312a95dd73a431cd03adc29af0daf8bc1cd9eec64d7bd1247d8137e54da156a77545368aa97775445c51e05b4217cb727438a68bfe0ab7bc0d0f29bc513ebd07ad108e9f08f29f75de452097f5c9b51e46ab525b9beb2130708700ae963248146f45341492bf32def0a6f014bedc290671fe3d5f97163acb15612245f73809ce2c0ec1ee7a766af82ad264e6da8436a76b2e2d40c9d10bab4278518688434b3700c1d7c06820c62d0059481854d3d17ba3cc6c0ffdab6e930d011e7a088d887d162b28ca606f499103b8e463be1ec39362153c3e662369740fbc6f40d659d372437a1a849fa67e355d800b166cb17e8ba0ad10dd3af52273cc233528452c560d0d18eaac59a8784fc9472eb4804f9ab90b67c044bec090d212a4acc202e2826239c3c919698523b379150c12b547b12390b7bc51457319a65b7a8c4708b7408051563794548a9b403374dbd2791959b9d508280e58181beb15946d4c0a0bd44942cfb2cfabbc040ffddb27427f4dab86f3441495b7f9c32edaf50268785061ab5df02061df0008e4d93fb0452693bcad1e6edcdd620da3a0da211c34e1344a0ee10fc5cd6befd059afecda791422990bf40af6e599db85fa0a7bdd905131d8960d6a508389820f68a7a47349ce38a01a60d4bf8d4836250bdd068ff10ecb42e50c8f4439398355d80660c70e9e9d61c8bc1da90d254dbb205c314a1aa2588913ba73e68d72a97a70d930ca1ace857ef8dc8a706548f5df8ec12152d96d0acca4cbb233fd2172e24ce24a0410898df0129b84e21038135520d7985a4dedb7143ba23f74e048cf6d4503856ce51b24af90aa9ed082f53a4db1c2444f99c52d4ec4156068137827d02a7426040652a2b06127e115828ac1676c7905d627b56f1f406f0c525157c267e9143deadc344711a52f8ecadcf6085d784413a646f011e51d4c3ce44990ca24ee4ee325034776a27d1594f97a85fdb2817e06662418681ceec03c106c36cc5abfbb863a316e3e3158cf282f38f99d9d49f666c5e0dcfcf63558d66503f739b7feea1445ff2308130f5396fa3e1a3239b47dc63f0173600aaf5d88ed656d53faef5478beba30194196fa342245c25e3b8a21a725bb7a205698c22eb171e209c5d407a15875a391e62964ed030eb1c5e3c8b1fa446be1bf5bd8f052a7ebf664142b9b3482eaa0d628e90e585c8314325beafd223e1878e46f4a40a458e0d0d23b117629fd09042e314ca4f84e28d350627592c1aea247223faebd02688f273082a4439307416518b843c77883b15756c111488721fff22aa80917d0e1186280e42780a65329453e378cfa4e5452548559e64bd1dc999a89ea1dc26ddd4595a5e774788de3e9d0a4e998b04bd28a718ba4389d4f1cdadb165407279268708df5431f4265d58a65645c5d76003729e2f9de93a19e6ec8581164cec1a5d21a8404f8f9be1029dc748e5a39cfaff662b41b9a0db4104749efe9081395d06dc6872d5d4753be7322db868ae0a3f477b29c8522479c27302182556ce28a35903c0f24035976d49e3608995cd0d756ffba19ae5a6837bf9256711e05555b073856f9d8cea206a08b40ef5e8b614e968b2c9da1a77e732b5940a1e3adceb49267a16e2a502bdd43fb056f7026c85d069d435a32ae73643341f959d437dfdd221b433b8536ca436c861df5c76d918a5077b32d65b3bdb219c29f13a4a0745a1bb7e184490abc522bb94f78a436b6caad074a87740f8317a217792d3833a5d4f70a611e87f18809fb2a49968da37c6202005f34a18529774beb177434ab60e9861f00897b1ad12ef8dd1ebfc946a9f2773064444d0cc02992f5322be1bb12c7b62ed35bd4b5421be24f93a4eb650d583cf85226ba02eba2fb7f2315d18afe335a0e807da35928d6fb01b6fe1636c785fd440af8f969783fe179b941a43e8239a4e18c5ba85a61bccceff2f769683d7e0db02e7de0938dd02247d5b024e0ed53b0ba001730fcc76f753bb5bf95cea6ed21b59b00599039a76c4a8c2aa5ed6489532ea51911aa4806e92e56bf37573d7f3af3e8f39407920998c19ee8c800cbd444c08cd1d51a0a79e0de5bfbb6f353ade79e95cc17600882f2d2713dc4b4f0d0118624b1cbcc60002f41e74b946b24f7bb1d6848d4d522c66eee7e1c53194c101b076e4ee4fa5fb1d18df93500f56edf28ea23ea1d2fee2a136aac02a6c1f8dc7a912fdc068a99acab6280b19639d18a441ec0dbe33d8d569545ae35fb24f7a993dd2bd54110ea02f6964169d10f608ae45f6b45c5c1f4877808c7d8dca71cecc3f7ae128a1d0f38c890ee3ee61730372516df1b439895420070f04d6f08670bc57fb807183bc3bb8148c7d55f42ca52c623c1437d5cc7581053f49b1e057aaf659fa2b8d0689b17f44e3c219416829e197e78f165cc01cc4c1a30112616a2b94fda14969f8142f6d4946216aefff6ed0666076cac5811dd68e7888452a5b02e516669429cbf1c6016993b95cc363022b0eac45b3bc1c2c498b18d3b2b8dba8d56774912afd263d924dff6333047e26411fdd587f83d1730c9f5c046351c6a278d0f2a12bd1712934e7130fcc1031bda6ae427b03b58dd20c9431402c40b293d21347a6168b01fa1d7a07ad63492b0c97afe245831d655cf181f1043ec72bf4c38bd7ff9aa8d0efa3df2dcae8fef5d8804f47382058506e068ad70f713f70a90c9a1af0028847f17a14e05f60a78236dc72ae9b38ea6ee23bea6552d7e00cbd5ada5455c6087b0d3754e6218853458cab44eea51e3efbe698f077b12be0784a0e8a80d4217d04be595c01efa54189a027152e1c247eeb757c84d84c472f96c3fda9675d9c233580878a8fd752953bbc90a0760c7412bf9355fa419b9b0ae8b382d778b86201c80938a1bc61598ec75ad29365955dd6725998fb1b701dcf64f2732259de0a17cb241f16710faa133d24c7f882df183299f9ddb13d3f2f4f66062aa7939b1dd315d9a6bef867e1f306acc2e26cb7c4161513e0c85601f48d3dd174a6afc250390471fd744399400875d427f0b27e71057a66ac6ee0f8822184dd032d488f16504fbd3044650786beeb0ba7776418710d8d32a299f67424ea16c718097476a8bab366ef956a4365b634857ce2e3e1ee157e45d75258e49e1153a45c7075648df889e0ceeae19b9b16055a65ccdd605390c7e3419a58be873419f9a6ce9ccbc19beba5acadf12ae14a4a805567d0f3b77d211e3692617e0cc964802a00f9c478abf71ca3f7841c95eeb5dc99f71493f9e54519cfed0c2ad65cbf18735dd394793f69a236a4c3ee42d5132d8a987f04428fa2dc701694f8c84b4cf4d3f73967be0b0d828010d9ea5a27da00c75e17dd9b42d24b566a941be506ece3fc69299331cc4a324e4e181738e9e2a077cf5e21c21dc6daa537ba4bef48be15306da9e864b2f57657414dd992109a32fb729ed30be71dc40274fec1231f773062eeda30d693d4d811f20816d88364c3e94a7197bc3c842bce1f1f5cc361c2134fe6d826ca7e951e691ba1701719f7d9d36fdac8f35acb1aece78b74b4f77fdc5196523a5d810682b1e9f13623ea72f1c0493e2ec96e39b4b953fa676e8565416161632517ddf7795b4de8fe71170874d59af2d90fea252662db8a9d7b66407c1b48a461a56ccca49dba9c82432f9aa612abfe42c848626e4d4c91dbe7fa1b6a533cba7232ef5f7a00cf3c0defb76dce859ca2ee8d6b96344e8958fa3a59a7a3861a6bc40e42693a0514bb2db68ce20e7c03dc1cdc97aad7231a5f32fc7acce59d6f40848466c7725a451a19c1324b8299fbdf961ffcd42da5dca93c320451e9c70f6b9c97d5dab5f3a5a53324ac45d8626527d6d623eb6bb707c649783291a482ae2720ec03b79dc78eb7da60ea399b69e5879484061c231b6f11d2688f92d8149c63d8137b2e0d89368e39554bfe34754fa2b7fbf40aca09b437b4518df6db0a91f0c0e3e864106720b84a25f9860d73ef8602b10797077c7cb292d2d99c31ac17ba2233709dd9a9566bfb90b1eeaae3cb725c958558c2b640d40d3d64e1fdeee279e83e5e2e419ee684ace273d49831a51a4ea334525f605a83a16b2b25916cd52a8e23babed4b12023b361545ea6b12cc282c08cd895a2998e1ec10ab6505273674094e1edcfe4506fc9746d851bee497c4d1f7de43d1b15cbac9756089435a14325f49227f3d6f2780d37ea587096d0dab20b0320fed5fd578334cabec77af5582d9a68047917a8052bb7ddd8bdd2ec4405365641a20a391e31f3c8ae95211b014c7217fbf9aefd1c2a9adc70fcaa60d8be887141562664afe366a19dba49d99475b2d4113d53f6816a1808301284c807f24c84073dbf6c5f0a7c64b90b4e157a5e44a054958b5e73f9d92d9dc91650742185cfc9ad15230a055c094f4d7075e19d774f0b4726ba6078aa652187f63dc20dfa385902b4112375db6e30ca2ddc28881ebf8cca84c855df62f7448e0b51a1af82ab5d60509255a317499d31c3523fafdb549cb5948a4d0c57504070ab7fe07052fad0da47409ef0db87d6765a21ef47e9e45f69c0f617806ff3931b4071c7721c8d42fa9dc4b53d8ea3945301f8f0c1655eef80d50347bd594f3ea39e159cdb111622bfb8400d17ef1216e7dc49dfe641f0967feeaf742408aade765092e8d694c3530f9b07bd8b331fa8516431d01c091bbc8e97f5a2458d1c83892bf1d6bb0495f002dd73c4ac21efa2ea4d76b10f4005bf6fc446951049d98e6faa43452e86cbcfc80d7f8ab1128874f8a348eb40fc38bd244dd85ea0e574c0c7bc1d6a4ed2c8785e1fce6bf225217c5cf14987e2a37d27dc1423b355ab796a0726706b9e4ee81c82501a98c5fb53952f8bc893d798c401558852c51c3629b0454ac142718c0caf21721330261920e4958f0df414ba158839772d2056d52773c5b20a2e9010bf01cb69de302250455ad82097973e61a0026d103fd39c4450ca5ac9467b88c2b24aaa9b4890a1c5a8800131ce156302816c335033b2c795c0e4f5845be2c82a4c8d5e8850bb8bce3b198f9554e242b337f218df563de9926d7242f45da5c2383c6625861a64aa4a2cbb10320338c42654c006c4de83099e516df9be5ea2e000f7cded438068407f0006ad08b9b1a5fb09c8ab1ff4a2f1c6b42427efa4fb21664b3a7a43782a2d6c12cb4e987e13659c82f2e31eb4728497d36de9a95a27dc70ec023dcd14dd71dd8aa41eb1aa77c88f69b603d110c035f0197bfa2129d201f52274990fb42d13a21f01b1ba8154f187a5a13388951fc88b4ccdc7485c894a16f6bba50b7e9c2d1e05379a57278786f3bda79230615546bbf6e28738992bd5cc00a513b78b41ec35638722b77fdcd506ecd85056686bc1c6c126b4795e99802472aaedaa514e9d84712c13535050254761a9d7b94aada965d302a31209fae0fc2230ed76995f05e21ed26e47d77c2a49db611afcfe236c522a3bf8388ac4ca293ea319452019815346fa559f4e3c52e87c5fe6f220ccc4b4e1828f5bbe4a710844e630d7cc642229b8cc334c29781db8f3dc61422e416d054f79cb4e05a88db1e68eff863e00868b0b056d86afc83dfb640ac311e94016b7996eb17dcf103d2724ae92736fc1fbea9faf685cf3474fc2e142bef35347b74a3ea126e8c4c82eef7333abed61f1fe3aa35a61ec14bc8ac55dc79531c13076bc81a24638f1bb4ab4863d0fba58d4ce27fe0f09c0fa22520a408b5c4badf9780df47d1ad7cba3cfe12b7611839adfc3d6f055987b6bbac009221e741ed1294d8b8c9a9a618d24c16b7b27819fd81ecf7d61498a17a7140745853d5b910955253336394cd3ef00c139e55b580a0df924f61f8d709d2f581fbcf1ea818c3eb7009f997291dd90902e6173b1924e6a7a82a0c13871667e4baa67da373ad05a4469861332a7388888db1c0748afeb46da6b9cede72f0168cbde88120acfa542823744d889ba1cca4ac5b38728d432ddf04b3c19976503a0528969385128fc8ae906cfa09a3fffa9f8c3bda653bbce9447fb7928e33a876b0659836b68e297e28f59413909c93f41814f010cf0fdc9f7e4346bc805be9f7845c0fac0f65c30d4aa094f3479ac34e1605bba38fceb0564a34828ee49a03c9a506878ef802784a39cb9b1cf16e0de9e15e9792bf3c0c5c4d8431f3ff75f9d87c6137ae5a29247aae03aec834511a492344d34778b562282384dd96cfcc22afafc7dc8085aeed046a0d1be11a60c76c4064135614681de18686073f6fbfefc6f0b59682922856b7af11aed7ad6cdb0c4ba0751e698969ffced0e5c39cff4dc8a9a3a3d7021debfc95fcfc29e03bb2f242e6c31e550c4b6f1b3ad4e52c6052e96fd60310e9b8f04139f2bb9967e9c6ce30bc6f0461360a22fddd631895d662cf9ef70e14b24902b9f09308b68ed4f15dc52264d227b6a2fd418105e76af698981faca2c4cbb8f295c744519f8b0e87be400d67860f8f7c147055dda045828d0ad0d145b0c5e66ee00c704a4c84066e6d72d8374dcca3b1c3d06249bfef47b94be0ff0a8633b15e2ade46b2378ccc3d5feb4e1faafaf02830c08743b22956fb7f5bb01a1423ff8b8f2236348e8af35d51564b7bb11791caeb99fba9714fee122bbeb4b1385b8d4d4c37101674dcb87f7a9c4be5e4568b8b3c6c4b62285c8a2f02ea86a2281c9d91a9447890e9f0da9a93a00a2c934ea410959a0c09147ee4b22357f62e5ae3045c7ebf9a7c232134e26ae8896733fd94c5049e3194d8920296762337464183293edb87fd648e469bea976f464b838347444fcb404dd50f59cc5fa284cba1780d0f84f011ad7e00eabb990c3a65898d986c9459cdedc56c4cd08d4ddd829777d0cd0b1a27f30ca8a0b66c637f1e8e56b1d1a0b8f0fb3e55d32ba92277d81956dba34a6659c4f76451403cb981e6133dd6b20ed5404680c78cf70633c1954486639aeb3413bd06317ba90f95a1b1b087e6c5feb69fd06939d440ad08416f118e5aee7c072930aa6bb6327b222dbbb0bb73370cfc9430988d5da33cb877b75bf1689a3420feb711511e4c98893006145406a943d042052e3014aecae4be270715f87ef82a136a47b59bb0d4828ce7aedbd45d3ac8e2314c4f2001193f6116ab83ac0a18cf85b16fb0c070bd3c514676031317b01647368cd18f64f427a40a2fef4c76892201f0a55bc921c150cb9d775b0b25dffb162df25a1e3abc389255bc49f5cb300dab2275a234bf4453d1316aafe7fc2d8a2ee811c0e53820fd808f7f4194da13fea7aa5bafa560b503d123446fa0a546d98498c5f41c65bd69a9edcface6161a5fd45f212d12eb42d741dc95cf95180c91643ae2baf9155252a866c7b63dbe325460beb116da970f180b05e184807e74786ebe580928c72d3203e60ccecf053bda8ec446d7c567e1afe8868fdf630c08a5567e2fcf6b4fcf60149abea0e9d1c5271479b0bcaa018956a0c7dcad09c8aadadd6a13ec7294aff8d844dc02469ba26b0d7a90c16274922242e0e3cb3929c6e30267176042e0dc797b27c748fc2d2dd4d3c9f269cf823dbf51e4bc06913398256fa25a2c34e0020240210dc166e2d4ab34ea2f9ddc85ad5cd67280f44077fd581dd14e42418a4ab5a846981ccb58da5a52dea69556b773ee111f8a4b6049c25d2f2999b9d434ed42c582c2c36bc3a25fd351c03de12c1ad1c9a917e311e057a72a0873137cec9dc1a1c55deb8d3274a5e63d815c595e74d1d2a11aa75bc04a2b1293c9f727ebb100f286de65df16394e5a3a845511fbd098c107c3632775ae1202218046def984bf297574e33683a3559ef4b5669b8a4188a22721296245b4aa7fadf3cf9ed6730f8f558b7591c05bba4c11d37fc759ee4981b3244f2f4d0c4ee24afa8dbdf649948c566aecccf2a9aa465a295159defdbdfb427cd580c392a3d3ad4c748be187510716fc59fe5e1f811bc4285c8615c84d34bc87706b7a28006ef0609da2740bf80810d54b1d68929556363e27807a4cb8cca284a702e8ec60ac724692c5b639660335239ce73794ef9003e9eeded4b10205046198e618b90c80c8df65726dba2deaade5410575eef86083cb25bea4819e30e04ce9f71874d28fbff6146eece46230f026e5a9a9f6b09a9f4057269b91c5d3315d54297c23d71619bcff975eab6fa7bb0111577a8b8a0efae34b099f24ed7f4d19c2f75568246b02d904c432c0b81b61815998721a6f7c56fcc9fb8ad4d04ede0e526f38a3dfa6502877a6d3a53482d9d7d045554c70d959e32000d236ca93a33360015b1223aab6a271342c173174515bf280f8ddd37722fd2697a2a61b19b8b3f0a0605386da62836aefd7bc527763cd2958237bd9607d7bf3dbb514cb4d6ad2be59376d1c1452ebc87351f2071960d99e9708357593d05fad2a154f65e8d169dcfb1894351d38f2a3bf596adf7b3f1527993d41ec25424a9a7b05c482b39e9e66197d68920d97cc76d3d80a3c13fe0a0e492890ff1e412dd320ea8d63467124204c972fe9b831258ab2280dbe9ab58896699d029caa188c7b6ab1dffafa8cbba0299f031bbb41145c305468468165e5db7ebf110803081935bf7d0d4c48b08db29b0bd1e320a8732e7f346cf78ec69932f5bf02d0ad8cca922562962642a8855dbd5b2ee478161d56065b28e4e46d8464a107f92e457b710efdbc44f82a5374db02f6c098e7bd6355028a56eb04b1f65e30aaef2ad811e46150b6c935d5afa5592ec5cfe4aa9037716b0c7781e3636e01c151152b74ee5285f2ab9e122179b5904fb7db5caf09ec1a09cf5d398b90d1eeb31f0cbccde3b1ffc53a282fefb4dbcc76341aaf30a3b4ad46b6d1c9e5d5bf582c69993c795cc11583220b8cc148355a4eaf5557479c09c0461943d0ecf522bc45c83909f9829272ce279d4a5f49abb2a88070c915e58906069cf5673ae7d80812c0ea44c71bc7d05be66d46460abf5fe5ccfaebe01936d026d129a394938a81af4a964b3732ac4d02199309dce0e50482788e9883610a25fc8d25755bc471eccd95cb414598e51b562997262ad1bb3ee651807f0501f62992c962318806dae1e72e9aaf8d3c91032a3694e11959ead24b2742cbc69acb3d0806ca7c0bd450f61ff4a13b20eda0cd266a6b87cd7659e1a20ac3395de9a76c9f9519c2ed5808b3b102c756abfd2c8bac99a6c1a6575285205a80e955e6d6527861cc3909112691957f5f18c521e7fbb75c97688b207a962bbff8eca19f30e0f20732b00e25fcd5cf84dfa06349802baa6dbb076c0706f5c2892a1d2ba02d33fdbd417f8d6cc1e90a8aeaa3836fe82955747e5255c956fc654ba1faaea07c4335c10eca438b2986972c7abaec2db089a7c2928fe51d803206723841564c4e1408c12f47977b82e39d1e6c468b835e5224184055e0ea0c30a7e863b548638666f911c70de839d841d63c640afb9be7f7b76ecd6607f5389c885e30aa029d349d39b382d418059d7b3c38b090138e607b819ab970c33bd6099edbe047a07b7d6e6a88607a625c796ccf29c194f4180422f73c8ef641084d7ce3551e71bd0bad56b3bd26b6c08ed704adf196a51ff60fe361f2eeebbe1e2af0644cd29e399103dfa12d844aad238754f4a7221a354ca73443a49e02003aacd8cc0f4a3345256235e8b667e5f0cca3463e29f6a483a561f94adb071dfe0ff8ada8829a91618643629845f0b2a3e68780db7a3db023965362690b5458fc250cf2ea2b908c806423ce87a269aebf172348f4ce8492a54656f56cd13440e3d4006ea95bd1ac19350f03894c60eb898c68450e37c667a2088966a50004e19a8764e5da1b4fd19badc29041e58a736c106b5144018139dbccb17ff486167605ea12615c682b0fb59a6f3bf1f49f1352d35fa0b66ab3d760ae61b306d7bac221cbf30b41ddd1347da8bb9e6d692f598bafb65e7ea3147510f2a3d42d6cee2ba54ad36ef60a0d502873ec4497209f19c050d921caa46dc4b13845b490036cc41d314915867bd8651f5017c37817fbd749c197b628e9e7f334256221eb72c6aa0cc6f9558f93de858195d0058e25a0e50f9b952fe538aa3fd96442a9a08534b9bc6435ca2e3a5246c87d8292edffc1683329068b7499ed34db82d059e1772b794ae016f5848325012f676a10d1165475d16f9c28b2822c41dee1111c4eb4907a32b66050b150675f56830041335d75a0e23217d8ad138317838c0e8c4a392176d618b906f6ee681a2c1f51044c143c44ac6e943ffe6cca8a187685cca9c039743ce962f6826a6b6dd409405d1506664eb50571193cb248d022fa001182a67094af3635f2ced60d93c4bfa3959fe621bd42cf07a0d15a557895c6ef61f43254eb060109dffbb2bf0619f016f76e3e42b377b4ae0d19af53d317bf25a5f93858c0a2c669a16f91b4bed0505fad6807eba36d7d4587cb3f901d3bf4fea3a7648fc824196a385eaa4bf3246a83f3a35895f95f1ed1fc2ee0b2543feb24baa3fde0196a7afc6a8c4fa72bc5a3b9748ab28e4b400a5a31f4dd95fe576b8a33d7c594acf48f171181a1503200a7b5e1fbe0ab10a1f5f0cf20995a67c13d8b0871293adf4303a8e380c136c2e997578b67605c9227d5f2b2ad29fc6c46fb3aa64784e7e0b5e6f9709f049c0e8dcc9ae08c73674bddea5406004d146c215eb5265bb180d44351a2bd0fd8cbe6b802951f5cb27a0426a816af4fd6375414ccfe8fb25c887ad7a2a58a5d094e78a1009c43f3295bdc35d340b3eb4d69c01027e7a9754362fb51ce3a6afde2e90119f1489e493b84c513ab28e035a974993b0f7c8aa575c0db9ee3bf4973a7a6b8d319d0c16dd79f0de42be4d5c4fc3342cd59b00967ab5903be0d4c3514bd219009e44346e25fc1c8be3e9038d4f44e72fc5d99acbe7dc87a648f4e5e87493ca9e1115b2ce0c5e9d4cf23614ce66b6a534390cdcbccb29e23fcf634db937d9cffbf86353362a5d6758df47d429515687b61d30623f73aec9555c8e5f9edd1f3431000a8bb57696c6e60a757b922f68e246311760f92c03a11880e10c97b92cc7298e231cca7892a5316204dc18beabbe303960c43fc0a446c41e64fcecdc3b3222c506ad5f35254dc8491a9dcb63690ffd8647c145bf54c0a4dd8a80dd3fc6ffa82e8ba97c9a9657178eeb9526d6bf97272e4f7a70114a870534c27adc4ba043849645aa5353ce3e9f082d51cf8b420413c203bfdc021bad4e974d9ec79fd1576c3cd2b5507de6a55e29f1be9005731557e6603480a824063fb7b5fb809dfb69e381474d987e486dea87dfd4ead1f31c2bef9f788001428106b6179f354281fa2c85e437f71500fefee58e5bdc8accaefaac8bac328c52ddecc770b5bc46ee3ea18b61caa189d87c14faac1e0b00a5c6a34474983f135cc6b7f519f756dbaa1657ba9508c6e80522d71382686e21047a248a2b3d90fb828237c051622a94c50857d113fa6785716ba07b4373a7bfaea6956d9092d6962bedcebe25dd23d6fb70d957b1d8dce448b3ca65aa261d80e21b7e4be9b3dc38fa3af2400f53ebae3f93b69cd199732d8aa4da7259c2805571ab025dd5e484bbfb17ca0c9dcd766c6410a7fb13b8bde97de15e2db22c03c58807204695e33550fb51e90b4f20134c1b08863139cbc31cf7fcbc2d11ea64c278dc40c73cd687c1bf1484bf312cf242e57e34e3c3bb8b4706cfd0b6fbe8208745b93782225967347f3c4a42bcfb01ec92024e3b44d40a3960b46439330f0f0f0f0f0f0f8fdc30d0d692d0c8539320934c12c0d8426a27f022539229a514494f67e6f4746602d7c8de840c139f46b00140060b9c0a040b8a89c41231210612f8f39c337f8658debb1d813bcfc153236abab01023b0ffbe559fe465ae0bc110a308fcc40cf9db73d2c144cc0a3188c05af92549317607fde913620c81d192ac934b4c93447a332f053184c0ef7b92e79f29640d1d22c408029f4f738ae393ce34eb4a88010476625a0b7a672d4aff4988f18384eeb3feb4fb20d9773a419b961074ac07e8cd17cb2bf95e1a3d0ff0602ae91c8274d57770488e9431725bd41829bdf23d644f9a64e7a84110dcd0e20b442a6d8b1ec1791143079c727f1bfd59f935213c88910326a60aa674633ee5295f420c1cb07944a6a082f43c7ff1068c5f36917a17028518366063acd5b49b57c4521fc4a8c14176050d9d55eca2ea0a0b24a08b1c3f841834604ba2a5ba5cfbf9d53521c60cd89839f7e753adca9c0cb851d371ed72a64d3177102306acd6c4d7a4ed3d5a1f0b7821060cd8a87e312c5eea8824d3320788f102eed48d6e92634a26356b0710c3059cb4d13f512ccc62364ebf0d1b3d021a294709b6528e121c89d102ce42a5cbbe7da29bfd182c603782c8db947456c157ca6cca2a348a8eb72ad84cc246d5eae51034930ace3f55040bf1ac54b3a860378f1625dbd5631af7147ccedcf5a4793405e3debf1abfdb5476ae147c4ca1c63c7ffbc70f29d8d0e81da9a4ea48b146c108612771d5b295ca8ac6165c1851f01644f05422328afa2414ac77c60b952f07059725e9e32619479e7b3ec1e9cab4f50b2aa5d5f78b0e4ff01554e4f7d7a0bc4bdf0936ad4285548d1442e4bbc051021e7470826fdd6aadfc4c9745b409eeb3e267b7c535c1584949b244ce3da96320800516a523137c4abe2a51acc504bf7154e416895e82cbd60aeac5a396e05c72fee7ba08e2315a09fedcb2839e5a28c1788a7a3b1acc5f2d9b04234a77e50f4adf7892e03d0829217b48d2dcb4916052bade1591f4e61da485013a20c1f5c69c757479edc65c3d82cb39fd9b6b56c994b48ee0d7d35f5b7ea7114cb60afe19acb4a5b95e7430828949b3630ce95b217b16c1888712dd5a118d92bf418722d80d566ad2ffec4bde828e44f0295af5eafe38e8400493da54b4547d9a41c721f8cef19410a6dad1456808be4cfa6648661e82ba0cd05108de3ec9bc2ea5e287b884e0aec24a2591e2fb0451a005179f83468e2db06e2cc01ed0310836e6e4efa223a9147444104cfe11557224895496cca223108ccc22728ea754d7f81ce8800e4070fac4f6aee27afabec8d1c58db7b280099a026526e81c6720c0011a0ce8f8036f3abd6dac2d15e086169de30026e81c5860e1074ec790628a9655fd2964838e3ef041a47e504ba372fb5e014c41071f18a91b4bc913b98379b0c0c2c68b20470e1c376a381758609172948086ef81771f1529b52c24793a1d7a6053f77f0e49f579e043e4cf55d2441d78e054b57deec0efa9b86b9aa2dee57ce9a2c30eacc7d2f1a0377d68f7d481eff4d9f4057553bf668e2cbae0c28b03608105093ae8601d73e0bddab3738bc6a433a7430e9cae203a4f66875039260edc4916797dc13243db0e3870b965e717635de914b1c01bf85cc94d8d57eaf0e0a9a1d5458edec21ca0c30d277b4d95b3a3e94a0f3adae0c8346eb14f9a10338f0d68909e72be8f961c5d6cb1828e3560871a343d75a1d28baadb3c47175c74a481df745d253c823e4d22b5830e3470ea73a385dad75fd7d4a0e30c559834db0cbc8699ee32adde493c65e0f23af33d93f0582a04081d64e0be72b698f669081d63604d86c62094aed7ee62e0bd26ee662ab9123ac2c0e5f54db7b62996903960e07aa404a13bbbc4a46447e8f8021b555c53948687984a62a1c30bfcb779d473c9757481cd92eb397b8c5f6addf82d70e05da1830b9c590a2995daa94c1fe9d80237fed7ee77d617a44123cd091d5a6062473399773fc33253438b58123ab2c07bd29f6424192b69cb792fde0b12608109ea3405a5f984f6db6a685d818f5b93837ccb0e392b7095b194d5e52bed0ba9a16590d05185da3fffa42c15d8db2f194a62eaf735d031052659bed1f964f80509d6d052237448818931e7896399de27af35b44e081d51e0ae4a7475538cfcdff022c716e4071d5040d4f4da598778d1a1e3097cb44d6af3e91f8f215971e87002af9e82a5d3bd8d269a434713d8cb95fc3e3be74fa632810f313c4d0eb1355ea9c0a163095c887124e8c83963a85c098cada6afe476bb172def48021f534fd231c6c8228173b11c2357daa4ab24396ae01170fdfcb134d6d0935e5ce1820e23f03197b64e89beb152ae088cba64eac97d5246525d213a88c096957ecfa942359bee46c710d8f174267a217612aae5438710d8e09f49498db7aabdd71e3a82c0f605192255f2f76dde01043e65d71c3cb5c955fb74fc80d19372291949774ab9d3e1032e8dc9d227a2c94a16567da0a307fcdfe868ca9a549d9369e8e001eba584d21e3a9629e6d20c1d3be0438fb457edade425d7011f345447fa8c2721a4d0d09103c62e48d16984fad2278203466eecac0f69a49ffd37e0625604d7984365d48b1b3a6cc095857df0b6e8a6820e96a1a306dce820bb5427e8e41003860e1a304988d090bcf63f63f00c1d33e09204954f4d4be3291519bc913d990c219645b83ae8880196bbcbf4b45b40d001032ed47d5b9023c94b241d2fe04ac64f974d9b2853590f74b880af24b3b79d9812f629332e74b480d3fb1ec32a5d07c9626da183058c14bd26427f7375b2e4580517627eca633792020c55f0aa2159ed63aaccdae00041016e44600438722000004a80910a2e26914f431c1f157cbefdfbf7bc2f21fb5370b79de65e6fb9248b4cc18eb2ce78ae9ed43d5b0a4ecf27a6684dd55b2b29184b3b41995c4f72ef51709d257a84ac8882516557fa534eea1cc45030692f6b4a13a327d313d3010c5070134ca9acd291d1048c4f70a91b2989e8399ee0b2ad68cc18a3b605189d602b788a1c2547458f162cb0584eb02fb124ab8ebe09bef76c4f8b88a263d46882f18f95ac444c9e69a33032c188fd0495d348f60003137cf668d9458e21c6f25c821f15e59d83101e72d658c22012433fc898febd29024625d8381eab82460dfed969030c4a707bca326635c198049b3af173e47b0d9e3a1892e0cdfdc2b3e7ef49ccb2b88244e08a2cae2010b8228b2bc803aec8e20ae2802bb2b88234e00a0938e08a34c088049f1b6215f485cc5dc91a5a90e02ad9a8f8e5743a088b11301ec14ef4f3fa9abca5d3a886c270049ffb46865eaab5a8b611ac08d3c1d2fe766c432c018311fc7b8b9ab49d52ab5ce0d8e2240163117cefa73a9d90e25fced18d040c456422b8144fd4b64d6c740d9c000c44f022a48788164d045cb4051e603602188760c3f4071949a2b9df641d01c3108c067d95c6bf4e847ebac08101b30dc028043bbab3e8550e3dbae2c51637b4a0b185175d3c17560b83108c5225ab2ba99cabd369107c4a27f43ed32508c64608cf0482bdb5cc6c417d882c9901049f3f7288d24174d357fec07eba28aeee1af4f5c2020c3ff01b4feb3efd4ffc54fac0e76c7742b98bda1bb30a30f8c0299d33952895b3074e45cd29b77bf4ffd86a00861e98a45297f0bddb14eb539600230fecd58e5ae84bc2031ff15b42d0ef775262a9041877608497f8574826bc84ecc086b4cdfad1fa2b0671a0f502461dd84ffa99762b96936be8c0a889a221afe510844cce811521edb655b4ee04a91c583bf556cd9c315e48c919c088031749ad678aa6799f2638f0653d2e22f5047da284018c3770ea6ea983494fa3b3ef06468bd039a7b906cfedc068035b7969959ab27b8e393630326a056daa4cdfc87f0d9cce2f4d53f9e3251d6b686dd1347020d302186ae04363e8aace395f824c1af86f3f1b4da362d7850530d0c09d52ba7fdd6be399c9028c33b09949f73dc6d20a30ccc09f597bd6d30dfd59e902070602e591764a6705953c780481ed0e2d519a1e49568a65070f20b0f144f66b66e50b1b36da0249f0f8015bea572505659e1b3c7cc0f96bbe49c147792ef51559b0c1a307fc26f7b64eadd73b225c78f080718d79da012b4a64d139d4ed8f7630608ce0a103b64764c7942d1a6e9283470eb858d15ad3a25669ac78e0800b26fbfa8455da69d3e3067cda18ae95b6dfbf760f1bf0fe1724e4b6a41af0174da704952a5ae6102878d08089c9b5fb9468dccba719b0e112f37496b8870cd84b31d3eec493470c58936aa663b9ea0103b65277d29073f29d2ed5d0a281b6028f1730318b56d2bd13628ef80d2f4ee0e102ce72a720eb2de947d215173c5ac0a85ad0494b4610428895050f163022f9c63bac264e140b2cf2093256c1b7a789c1b5b65a748c2a18254fff42a9a8b952f6320a3252c1f7248b21aafa6995a81364a0821fcdadcb25d696659f82778b69dcccff3d9f70024a90610a46520efbd0c92e25c5c82805971942a924adad82ccca2005274c6ee9268fb1e44e648c828f9d937b7dba33b5970c51b0ad57a6bb3d2f9bac50404628389db13c7abc9259336e72083240c14e7ef124719446c9b14d21c8f804a353fa9c9737a8af46730c323cc1a6c959bf73505b3a0875e25c373dd9312983136cdd473a2f11faa28bd242c626f84afa53c42443bc810c4df0a5f54f05534a6ee450063232c1e9555271afac24581a0a3230d1c7a046a9a0f2a42f6b6881e006053e070e1c5910eb1a59748d2cb0c0a26b78d7701ae846e7c04b70429ea920ff7c5429650d2d4bf07749568e41ec35866c046454a26450824da624d5a72c39a9104a565ae4b000086e10cb808c49185a6db3fb595c81800618e0000ff822078e11fc08644882cfbf92213abd1a5a39cc202312bc5b5291fc4b7a92ecd6501b363a0235bad0220308061990e02bb228b3a4b954eb7f04f7faa631fcea810c473079fd5583d4d121a97c0d2db302198de03304bb8c51dbce4c8ce07cef645dca2b22428b607474bfd2bae4f9b622f8334f3293c72482fd12fa354b9075254d88e064d2f93786e810ec5bd274a9a26f083e6fc5493e6249c7e417825b73eda015a2a6bf9e10fc765e9295fd20d80e566a9266bd98d448106c87c86c3e3e26db8202c1576ab69c3be5ca9e4480e02ce2e794d24e501dd11fd8a4e993aa538e78defdc0259da47452dffbc0eee7a712b24e09353a1f784b5ff1438699b87bf6c07e6558d0a3c6ebd5a307eee2fae53051e781dd32591ff349cad2693c701d52b8ae598ea76fdf810d22f78b4c56db816fcdf9348d77444baa03a7b2ba5bd42bf4fb74e04ff7df653fdfed9199039be485286213840cb6910327d4fb8a7d480a939a38f0667b213d279714a4060eac9f3a1533f86eeca879033b21894e96d4971b356ee0f265fcb3b2d5b7ccb6810b253a923eaf0b895936a45348c1920a77d7c076dc4ac2478dc8995a35f0ff1a52998ed212529b064e64cb35297549c926450357757a72aaacf94246cfc085c9f4d553db5b57cdc09a10ed9a7d19d838c1cd2a5a88f172c8c09e30cd959244b3db6360445222b9dfb6c7560c4c52932a725493ada48481137fd1ea6697b246ca6be9a544734cfa0227b388902ac5eee4592ff0b9ae64aecdd4d45d768189228299ceadffbf2517f8b8db413753b9c57d0b8cb99e0595d2a2d6470b8c08b18ca03a59e0bff7dc6d64a7a06b2c704a82df7f8ac12bb0a9e9dd5743bc0332acc0ef471ab3cbb00a5ce8a5a5e7cd0bd11e153865caf5b4655a977553e02fc9b4d5efa24a8ba4c0699341458b97a2a28e021baf26683c615e120305b652bd594a7b9d92f6097c88b7e556d7ba56cd097c3edd9fe2675df6a4358191122d9950f7fa90342630f174d0dcc15f82ee2c8149e129c898369a6d5502779164c9378ba56c4d02a7b12d53540509bc67ce1a7235732b750446079dbb16222458a48cc0a7ded688489222b01bd533c5d29aac324b0446b78586105bef744a1982c910021f713bf4c79c6bb30983c009759e93a8ce9f395335522003087c8e272a560e1d42f7f4035e74870e651dcd44e3036e94e5ea5d111294567ac059fa1ddf71cbd1390f1821f49312ad417fd3b50356644e6aa7191b5a8800bf90a103267a8e1ff4353cd59203c624e6ca7797b48d2ce18077f5787e32e7b01ad10d782dad1f53860475db06acc6e8255a444e0d98e4fa290d3811d28e1e13490961d2197049fb285d794732e037ffae5730b73c4bc68015fd94efb34afe908101779743f53488cfc50bf8bc3515964ac4059c6b4a9a2adb022ed3b7e25ff82790c1023606f78da9dd2fa6ef57c1e66870db787255b01d2a29f4c416efdd53c189498f41b7ba674413157c0abd087ad92aba3da76082e86c49778494333ba660844a557b7f3997fa5b0a4eed890c99a2c8c9fb92825bcff8f7e36daab551f0e75d393acdba34c4100513f7ab130a2e4ad093a2272928b837ed903dbe8564e6354a4ff026fd5e43c87cd38d7482f72ced7e4158cace2027d8482a54c6a467b52fc6d8041b3172beece59ec73b4db0a2b2f366881e93885c2678ffa023683d61820d29dcf4ed4910eeb904f7de66c1366e96e0a42795629f054922b34a706229c6ccb30d25b82423fba710d4fc359360abf225b51121c5519104f7e6a959b762d0212491e0f55c45bd3d5da694040946e5684893fa215b0e7a0417d2275bf04b1de2e8388211fa734a513fe586b43682539f2d8d927146b079b35f87169936b365115c98fef39443dfca2b8ae0e3a5f017959ca4263311dc7dec8862724404576e22654e232259c81d827f0b7579c753278861082668d315457c4748092a04a7a35657969c105c4eb5b4171293eaf53106c149d3196f44ae9ab28d203899772e964ae9ce5e0682b1decae239adbd630808568255903149ee0f7c252b8d29fa3bd72b3f30964554e7f9a7254bea035f97548e0e0bf181bfcef99a83ce983fa7f1458e2ef6c08ed674a9eb4b7a60725411092904f1353f0f4c8e989bf5273da8bde081abd3494d64e55a931d0b62dc81bd8a7adb813713fa977db33a703ef2842ab9eb3bb2dbca62b76a0b31e8c06abec73f0fa1b4e714b2458c39b03926e51a438e22c23c07c49003932c9979aa4dd67111fc6f1107ce3e6b4ab5be51346f5fc480039bb2879c4d922acf0fd5d0a28103bd8113bf92a2bd2a2ba3fa458ef76202d780186ee0549e9eb0584a6de03bf37477da94624a0d1bf8ec2106d31a455b76bb06ee83aaf7c53c6bdf8b1ab875d57055350d84bc31af88ba2a061a18d9492cdaa6d3487173065693e8e8bbd529f6db598861064e661b291aa2e99ad06b68758c327026a29bec2ea25588410646c8b7c8223d8a7be963e0f52beffcfc5448dcc4c0755f4f1212e3a8742218b8228b2bca61214618d8ff37554992f36dc7c710030cfc77a9ffb652e954b03821c6176278c1627481bf54224482c5bc0e0b17b8f497638863ea7a9d696102b4808d761c0ed0fae24560c3d8e857408c2df0a5458750c126dd6855530c2d709a17643e59326530531638f9273404252a2cf0a9952737d6e60a6cdaa01b72e9ef53ed5881bf524169da8abeee688c2a3066e5db9d1323c4a002d7b14582bcdc2a3a79a6c0b98b4c93649048814f4a4c69a94f13b2269110230a8c123906ff536a200614d8acbdd096423f5469623c81d3c95e7ebf5da2fad31ec470022fea2a9ffd26f79cd22670933e555a1eb37041108309dceba4a0966fb4cbcfe1c5166623c612f8a44db7de44520d2d74438b942188a104b682fca06267f60b3192c056a403d69e608375d23194faf191f64727f8a8c1f6befe46fb22e0a2bba041727c70a23e36c17ee54ff24f928e39080900061f9ae0f48da72cdad78ee223136c1cb198219fdab8f89cf8c004fb5d5f265659744d870c1f97e05584a6077551f3326d68d15dfc0122a057f8b0041fd9d3f595ba7896d34a301e3d84aa46ab0c4a4909ce73dba98e212d4ad056671ff89844294f6e52a5b981430b6288f89004276b34284d9f544cdae7f0a28bbec147244edd25fc4f977b0c143e20610e42f6d80889a3454df87804abdac9f77a27d9048f061f8ee0f3346868539531af683f1a610c6e79a4688e78f0c108ce36a8a82e7e9afaff8f457099b27490134b648e8a193e14c144d7b8923d7a12c15ba67cb9c3d46709e61ae103116cbd55ea8954495a6e3b848f43b096b464b34a664aa6e9c310dce5aff64b7253e5977c1482ffa41b229b8e13824f7eb2b27aae84f031083689525252104b107cf8bd889e8614632995f011084eaa4735b55521c505042751f463d829bd60152b1a440c1f7f6082e5f7eb7a8931bec90a1f7ee0227b85eec91d6ef1fee8033f49d8c6ceb9d72ffe1f7c60f732eadae7d2223487e4e0630f9cf6a7cd13e4e8ec273db0fb5e166447cf1b4a7e238717c774d16fe36801821b5e24f2898f3c7029f259fce482e2030fece9b20cc93e4bc5c71d58edb11c96eff9795b2d6ed098c2871d2c9d5ffaee3f754e2aab03a34fa37aa55811b72c5c6871e3830e5c0e994f554ef0d23721c5ac96c4b3ac2469564be219161234ab25f1eceac899d592786665c4cc6a49bcaa2265d604c0141f7360437b298ba8594b592f074e65d19f3469d7f4410a848f3830b1ee4b8aec5b912453012cb090c1071cae0831a2580aae21ab55f9f10626e66d53968397e3c30d7cc86e5b22bbe4c8687061021a83f86803f7df77aa91563b85c706c6425353ccba7694fdb10646e975ff4832a4064efd5be37877da485b1a98a0f38e9dc8213470ea32e7e474bdd37a9f810d96b348b6d790983166e044d988e8df9cde6796814da732554517c9c0de9b78d6d0ef630c9cc897c5a39fd0b668137041e3060e6d1354e046045cf02106ceff45f88f8c1bfc4e1f6160cc7c72854afa7d2729f80003ef96367f27593c8d200ba4a780f9029b16e61f7a6232458f1f5ee03d64f0cec973143da11a5a07d1e0a249715100157c7481c9f95d1ee37692a7834ef0c105b64d74a467afce19f38f2d98c27292289a73ca906c1b5b8ce0f5430b7c54bded564f77593b1f59e0a3c760bed63b21288b0f2c9c738f4c275d92f60a9cbe5215926448305589e0c30a6cd4bf208409350e1ba51ef051053ea8ec3189680753e5a0c1452f1a053ea8c06bb40a6271bf34be680a4cd690fa11f2a5d7a02405fe5b3fdfe367149542386e5c3dc20101dc8f28309637f2b677c8916afb1b26c04103471759a4001f5048a7a4cd644ace9da418827e42795b534a22e9a4bf72c2e5b55173699b8dfdd1845454481b35a7ec63b20f2614c574aa9c7582289f2cc1edfc934f54b0145df3a104f6944ae93f2388c6b4a1001658780e2cb0f0c04712f8902a78ef57881a2c0909dc8494baed92d0f61784818f23709e7593b4c4ce63ef31025ba9ba4e787a0d4d3245e025e9661fad5019aff241043ee57a77fba91c9ffc1018d593325f529b4c3c17c29d2d967f50eb471078d3a29e2e4bce3d3a42e303085cf88a14dfcb5816493fd82b29cb075c86084a834c9b74e7b307ac04dd2773dc3b33a678c066d4b439a60d3a72867cec8009b124880a2a59b84a74c075b609b7933f4266cc7ce4807593496db23cfdf55e0d2d1a5fe4e81b5a9cfbc001137d8236ddcb59e08bce91a3f30624f8b0417ed48011bb4cb77ef7be96c7400d2e5a0159941d3e685058dcf89801a7922cf19195ed92954a918bc2870cf8a42f25199ee2a5ec120c38a0ea071f3160533219b9543b8d3297c6165ed010010e1c3674021670c0150e3025f8800117f425b9d71a7f019b7531ba9f24ff4b7db88009f67fe7b97d34892860eb20087080c6013e5ac07a2715f58410f693a235f860015f5a536fb2bf79966cb4e30d045879ac824d0d93646d2a8ad25ca281a38bab47000e0b64202fe0a10a36c4fc3cc63b956f7b2a383dae7741d5860aeea2a7abcb0aba3535a7e0ae7fe3ee04ddd1d514acbd644f22544474ae94824fdf5e11e487789082cf262baee85ec424b4329b80c728d894a145f6a877059d7888824da766eaff9f992e29148c7c8d61917407148cbd77a890e7415bd44f70969fb266ce57196a79821349df4fd60a9dee11ac11f809ae13dc5fee52d183d29b22a88616728273519ff2e8aaaee96c0dad337226f0d8049feda56468f09052e40fe1a1092e64d478917457b34a20904526b874198209dd1f3ca698b9830726b86caaabdcb2b2599cb4c0e312ec6532112fdc735bde070f4bb4a243963409b9d2e286175bd0c081cc0172e04000178578548213211ec56308f315eb0b1e94e0fdabbb2de54b3134ccb618013a8f497042c7e4e7d65c4bb13d24c1ababe5e8916975a954d091c123125ce7a4ead2548578a35348701e4be654d95dbfb3c686c72358cd41bd77f4ea9538312b0068c1c3116c5095546a3d1173b4de084e7f0cf9726a16dd66a9a1754516578ce06d700defa20d4081073c60cd3082bb1892121d7352754ff0e8060da4c5221839499a2ad35839828722523977a604214203073a22782482d39f333c9adafc9d5b430493de2405cb1b72866b73f038041f1a63922055546be418825d5149e4944eae5b5eeae051085e949698e2af4e084e7592a7b28d926d423a08265a3e5116bd3206dd0b82cfd9f2c5e8162b929f23f00804274fafc6ed6225530d10bc0489717b4bf4e7e91e7fe03fa995f776a84b8f993478f8810d2a34c60a2ac5b5df1c1a3cfa40cc5189316e928bf3e003a33592fa7ce5494b92ec81f374b5e62252ee49d94578e881bb90847e911483e413f3f2c069108d6d19c32a473cf0c0c50dd2344d145bfb60c0e30e5c05d39ba236ca850d1bad40f0b003bf125d4bd4efaa07e1d6814b926ba25ed64f4a4d1e746075fff326fbd4419ad6068f39f06a59f485de9cad6dca81770df65617b48995a7068f38706ddd7d418f0e0e6cf0facafbd74a9e375a78bc81af366529349bb8eff6010f37309ebe2b3305112ffbcd3078b4811565e51df26e25cd0b183cd8c0df989c1094aabe0b560d2d23038f35f01749fdb3685878ca45bf0d1a88030f3570d1ca829955b50429aaa115f04803a3ef4175eeffb14c5b2a3cd0e07106d6e4fe6bd0e75d6181045c41812bb2b8c2101e789881cb69da16ba4248a21a44804719eacc493e82331a1e64f83d77b2cf4b3f3971f01803a3e3c7370dcd55c2430caca40942d677b5a66ac2c0c89c96fc53fbfa9b140c7cd06d9f34678df8f90546d86516cfcf5da93b2ff061ca32c51ccdd839f1e80237667263ccde49aa4808e0c1054e9a722dfbcccc3721e8861708c0020b83098f2df01d3477a8e89fe5f0b5c0555bc88a499a055e3c49931d39a53b49b205840716f853cd2cd6797367105d81ef94ae4c58ccb102a31d3f6bcd3a55604df3998ec15390f43715389d258a4c23ee14f8ac29a287a0d6d2ed9402e3a9245d30bf14b4a6a2c05fff98de502aa798443ca0c0c70f93982db94c5348024ff078021b427decb59b14ff6f0f27f0392ce7c97bd16b94bc0617fd0ea804800d3c9ac07f9296ae9eee2d395f0f26703974d8fe5eacdeab40d037fa010be802070e0a7c173820e0b1044e92dc5049b8293729391e4ae0456b788be55393738f07f04802275d72a7b0faf69445677ffa30c003096c862c4d3a9850bd913f02a78334ad29ea87591232029746ff7d537b4ecfbd086ca85a9224b22455192502df2d21a5f57c9bf22c83f018025ba254deb38e1b646f8839c043086c5a0d06a5e0bceb94903985b44d49c179f6cc7b9b96a25d46c15b0621dada1405a744fee4a6fa50f01135c90a522365ff40c1e64f4f51426c0dfe9d4f70b741e63c9e3e4bc81d4f70325f1aef3b4d9dd8e90417d436977d8913ec760e6116692c07f926f850d2f22fd6890c724d2027c7dd94ad6782af31614ae428f2d48d09eef35bf6bfbd2cb1be04ebbe29e99d8c2538d36317cffbb7b2a6127cd0929b52ee4a522f257889f1c37290aa9bd749f01664e7345e694f4525c195752891423412ac86186348a73e6f8e90e03ea614cdfd477ee91ec1259d630a9a3a82cb1aadb26e643c6123384d2e9242e45c6a152378d19226eea417c19669e8584e5a114c1edfbac876f254d289e02c8fd958dceacd2044b04987a4ea3685ba051d8209aa69edf476103a3704637aaf3c936d50a253083e681a4dd58c2104f7a2da379ea4047fcd20181bb9396f9fb4b6d7582108d6bb325fc6131adf9355c406560482bf11aac5c54b407052fdd497ba0d42af7f60342de3a6fba0d49f7e6052cad85bbf294e0cfbc026115d545f5a0b593ef05731dda6e655d3dd1eb8d7ee8f9e15627c4d0f4cce214a72f1dcd2e781491b9210195478e0f39576ae2062eec09bac1c6f6c62ecc07e2ea5230813bf50aa0327315e3e3d1dd878d629fb2ed5a53ccdd01bbbe4c0c83725f404ed15c913076e45a9e1c0954acc0de9b26fe0749970d758f1cc94eb06ee56cf4a5ffe3bfbcf8a367095651673348fa3ca6503237f5c37a556661e770d5cde539d6d62c6da70d5c0e4e45b59279b68fe360d9c5d9a328de6a5ec5b343021087d3245b667e0821ceb0a32ac4d9accc0fea9ec75bac1733095810dc1c5cf45755ff0c9c0a62ff1d40d49abde63e0530c3a5a432e3f252306de538fe508a5daff8681b31054ca985e30703e4aba8fc8cc21f405468a149574de125e412f3039246d5e3ae5a025532bbac0875b2ced0c41bdc9a0da82155c608469d07143740b5ce806f3b0b42d5dd2029bd4fd7f74569be4b3c0660f1d342bbd958f05366cb5a367a858710546650d2295d235ff8cb1c20a8c1c39ea4f761a15761578532d16b2a6ae090d15b8b4493a2fa353e02da5d3f0929b3952e0d2c7dfd16e89023bb6d921ffe4202457ac8002fbaa1625a9afb96dc58a27306a92080b35feb6bb59e104be72774b4c42574e59690213d4872413783761caf49f96a7a025701b649fce7fda397225b0219965a63fbb4d3d098c488ea179cc737eb00209dce998beb4531b847e04f645088b315ce4a61881d7d4a232e5e449534c11387d9f6ce344cbb40c11d8fed2b1efde1c026b5994553aedd9bd9242602b59a8913a9a27951904de244bcc1259753a4c207022f2cfa2a994f6a9fc01df9d47737dca6fa6f701275ea72d899a88fbf7800fb6b1fdbaba1a5a344ca110ace00117636fca7ef91df0415fbe5239a5bd1ce9803b4fd6bd1a5aa4c673c08f674b9a43fd76ece0808b712b9a08218d48ba01af167cb286166dc0a6f6f7a034eb82b0a20655ba7439bd5c1a3032ef4e0ea582d088ce8031999a4404a55739ca80fdbd570b31c638d1c31870324d1659c1cd5e7f187021825f3eb59f9205bd80b5a47c535392152e60f337c34478ac68019f93b0ccb86f7521c70a16b0295390a4377f37d4abe034f4cc6408870d071019cc5005afe96377105dbf6b2ad87c196216f35348362ad84f314b5b226e329d828f94d27608269ea9291875c293ea782918f13849aba990820949338a4adcd041a36074df2bb3c4e8399ba2e04cc815116f73102b43c18b509b8450fe7b2650f0318212a21d84d63c7e824d516477775e8e2b7a8293492bc8dc9b5b31d709eea347f2681a27d8245f44fc0e3a54436e136c56cd90da4a9ae0ab3a6f0aa64c70f69b63eea531df8f09366c5333d7a4dee79760afd2356b825097216f09f65aa45dc4742598689fe9cba25ab018a304bbe9e3498c1227fe6b936043507513e48848355b125ccca4aad4dd48f017c352abc7a8396421c17528a1c646277b7c98f108ce4c82f96d2e1983c511dc89949dd63ae94b6a049b55f4fafb6404ebf7bba55ae7bd61d7d02264063316c1e43831f585c7ce2645f0ad9eb3e913c1c5a0761bb4b8bf88e0f7cbda43a4ded4db21f8f813926a68d5608621b8aaf449ba8e6ecdaa108cd07de579b3c746cc200467a13da7e717bf11b141303a8e5fb264972b82605412ff11f12b104c4e93a46ed7a22b2a80604d8fbaf49fe36dc5ffc0e8244205d97715fff60363bba64f4fe8250c33fac07d72157733cb273da2c50c3e3049585012e2a6f6c0e88ba3520a9eca324f7ae0b24dc5bfd2c4cf6ee5810f32e5ff7417ffca2d3cb09d25f59d091147a675072e5433c7b074ef2eba38ccb0032bb2edab4e439d5d07468425dbaa5ad7aad0818d173f5da8b4bb53ce81ab243c5d3d72604b96e8eee4e2c087e4e993b449cd2738b0e93d8dae51db8c37303a24a43bcded24720357aa57377a169ddfaa36cc60036b4927e61027846c4a6be0d52575eec898bf2735709f6aa23de952aa4769e04bfae6a556d5a4ecc40c34f041d4fec8989372cc19b8a4af3a26292954c4cdc0dbe896e44dfd2b9d3294af2be7b6fc2103a3f535a4a06fc4e3660cec6f922155452f778c18d8947ff1477a5b079375614618f8b03e1dfa73585e060c8c0c754244d017b8d5a0556376bdc0eec5a477a36756624617b84af5f89fe55a9ec20526ed790eef52c233dc02d7bfe279529756cb30430b5c64d537bd4a799e2cf031da49fcf62471c3f3851958e0c223c75cd18bb9bd2b7057b933a6d46e1abb4641ccb002173dd287a054053ef4a3d7c50b69b1a202b749ef77af765b690abc8fe8ca9425e5ff5260946a45bb5a6b70d136b8c002400f664481bb53224a749ab609215fb40d1a65a3af2630030a7cf0922be2b9ebb17b0213b3937a4bfa36c30c27709da3986ccd23e9b37485194de06e54fadc19bb42c821263042ad3e96dcbed2bf49c28c25b015b42a24ed29640fbe121819f7f4055d229ad2d3083392c07d4a13fd1fea5e620609bc66d7a4d12571cc224b987104d6648f79995750a53c24cc30029b332befe5dc4a217e3430a3087c36334b49ae1d811944e04753ce963575fedd8af660c61078ef4c2225f7cdace0f3608610d8fd087eaeb9450917043382c0de272f8bd934a5d2da096600e13c30e3078ccc9e2a783667f880dd979c63141fb5b0b1c5166d5682193d38b299664732d50dcee001577aeabf235c3c179fc36cccd801a3f7472d57babde64c0d2d522198a103ee447afb4efc2d9b580ef80df1636d8eb9713c5f430b3d8def0247098c093370c04851d23c68edb82b4159987103362c95e67e48e955846cc09adc5442d3e50489755561460d1853f77c32c7a073706b060db808e621654cff0cd8be8a9c629fd5376635b40c05da6e304306dc79a84ca2f44f0ca5a5c28c18b0a1c3b34dff88ed8660c0c94c62964707fb11fa0bd8b8d94ee8eb522723c5058c7ef7c82b612644c41670f6e92cf60667b0807deb2b1b25b4498ddd2af8eb4cf5795db4bca40a2eb2564e1194aae75da960844e2a479560a3c29cb3a90b19299b3f82be41434fc12525bd536bc6943a1a680a4e599669889b24960caaa155a5605b4fd4450f3952b0117256f718ad521ce528b88ca9f1830e95e3e7d0133e44f1e4cf514f631c3e42c1a7952022c7d06e25391fa0e05427af6c69648e102cd2828f4ff05ea22d9a028db4a8647145e25028100683c1601483305c68bb00c31308001034220e06c2d1804013b5f5011400044b2a204c2a301a222414162c160906c25028140a06038160200c0884c1e060501c0fa73cb317c52854e37011a6fea8c000700a21990039b006bce78d770cfc7ff7fecf8a1c83eb83b3e04f7cfbe9a34f1026187dc1293211a42921a730e0a04e307de1af1c60d36a22f4277848f8e78ca422104cc818654db818b95d7db180dfdf177995407cbe78b7a13e0194f0d1c1ff63111b3ac403733b685bba013d389bdb05631bbeccc86bf3d31df73a44c36729a247e7e797d01a1c96340b1d08eb00f50da9c132c09d22ae4248e9a7d0802ba7ebfc91837c15d9005d90846f60c32a5506c84139f08080968a2965c538822b29783f8bc69ee81d42fe1c77f487f840fe0da49be85bd2460d9e52eaceb97f1e3c62f25ccc1f1d8bc7ba2be9c673e9c03ff11b60c968f70b0b17047d82ff82a1c1d7c03f30ebe189a06fe322e04a5ebf6f4ff2390c00908771e6d5b42af5c00be1a3ce0914be598393a04a8d8b7673db70b8e3b7d7c0378c126315a9a0990f1b01ac621ced048538342272d5d0472c640b2e351b73fdb8b1e1b3219146b1efa9bd6b8037fa148806a9c7e1d76deed31a8c26882820852ff6a044d32f43805d95afae29a92e235966c92aed6faca48a432efe7d00655c3df845580528e3b946f031c14f1b75c27c1fbc9360bb43b087d4b5c9b0b2172de4440f39c70045641714785ee333f2cfc0b86025e81d388871559e167594480f940f70a6c0f6f259c0dca3f402ab9cd02aa716d791ca4368e0bc600572e3e3265cd32f20e29700dc3eae4ccab0a3e514c89758c4b8c8a2a7de59db33f10bad295694ad4438efbd3fa6a14bbcd62b7739ea35d86b200e83415efbee53e491d3e2f26cc1a30e9e810308bb635cc4b310c45430aa8024472c03cc1d70c375802743e8418de0d4c08a19bf6ca31e14e0fbd517df949de112c8ac6013e5c6d533414c1e50f76ee1f5744371276372e5342562e205c0e014a7367fdef420340c0e7d887a19eab0d04e9117ac6cf823fbffe9c40d7c4f76821969abf122b72f30799982e46410a9c5255a554d11ec205652489279030b28f5345fa764938793756ffee5610ab5172b3adffe9112ab5394ee6f380ad7966b0e0319c398140295e49e963e65b9c9752e0685804707cf9543717980c8b486545579b1b3c04c4a49f2df3a5ca16d9432fbe7c8268dc9d93c0be72c815d0097a09ae04e7f70bb48505c76774b0369b8e16d0d9f271a25d6badd18220efa061c95481b0850b5e4607fd903ca627fd2fa7ce29a3b2ec6a00ee28c6aa8667b1c2043fc2bb688b5e9a590e904b2423862b1c1b77d52f43d6035e944cf973fe27b504ef8daaa71fa724aa2dd69ab719c4167f04fc1d51075b7d7c47101bd005c31045ce4235e1a0e50f5adcdf8db4a6241fbce706239cb147c3cd5ecd6e7e6342998b8a8ce8d96523ffcc51024c5d95719a75d6816349c34ddb05243484a00a0206b10e22a943e805b8b3fa7002a58711a011b2ea907084204881ad070bdf06930c0b454057218caa7a5bf931474270b1d5c9c9efe01e48aab5ee7c807352042c8083503c28f6af39b059506e1633ba2e6c4acae90ddd5ed0f12aa9224c420ca05b912d6a51e2e8078a048c2f7fa0445b178b4931a420bf708226836157e905d0987bc0b3b645058efdcba543261f0993cfac9b9c27340f67a1d40a450b686bdfb1b144c5ee605b675e18eb06a6d9c45171f91fdeb2e3a31cb002f805871c91e832d808c7599b4fb0c2b8cd0675e26d9a3a1f581a3f43c8cb3708b48a397c63b25732bd10247e1c1b365608baee72150312a79070ec48f9cab0023b6ae148dedd129bfc25ed2d8c70baae42a12076ed8060c5276eaac00273b3632995922e43fdb125069b31eed8bafde4649bee9e7fd1188aebe57296e995d7db31196449e5ff8d502305eb29dc717afac4c25833d17c527d5a7c9695f95ca55393b2112d4f44b3b8b0bcc30307a3f8112fd625d28f0546c2d3a8552e8ea9789070b6063add9bb022097816cfe95c44b3f9f04b854328a0fe5d8b90abff44e7006c0150eab9939676b23263ad3279d0edd07ae65766221cda2ed5f4e50fac98b7dea89c98e4c04af968d814bf53bd1c3167548ffac079d4292b215f77704636d1d225c4fc703de2eae1131e98f2c6179449430440e3970fe438290e7cdacd1fb799b630f11a8e7d8a406629cfebd6bf2607705a456a759fda9b1408a33ae47642fca3e0aa81957c965bee1624299f0d62987bf30ee2f2934ec6696d033867e0b19ac24d4edac5e651704a177d1730ee141d389277c20bbe697cc954831c86c60c1461d27340cc0b55c6676a44e1bffbf0a803f48019e289e7974085df1042fbedcd9fddb7c8647f7bdf6dfc3c82c2afdb1e37b11fbde792eb25696820f51c1e07d91fed226a3fa75639ac0252b5fc1e814ec5128d4163ad7102421f0827a593807864eebbc0de62eb91435b30635660959fbf2cc0c2c482070f6d585f2e14db31898565425b63cb7d5bda0d6ba8846c5439ef6dbb27cc5795ce775b61c53eb1558d225e9f4bfc9e3dae7b644c1b16009f6e7073c4c22e7b2ca2f0183ec551c57865f38e0d581304bf95d5ae58d1b7d71d4c92775d515b6aa0e6131dc8f211e38fc525bbaf5282be9824ff08763acdb97500eab36ce541b9c42e9089a1abd23e7a8fa7f97493141d5ad0c2a971a81686761fce6df0049b6c68af1bce3a1c5d1ecd3059ba0e0095f6567de2e7e6b07837fb7dea1f32c6f2d7ca9a2d434d8f16e0380c3fda3f0be120f4d0c1dc5ca86003e330064aedd727da5032d9a4345c8145bea77f89110a2200ff81b304426ddc0b6f287a5271fe91b2a5877cf81c4c4476ff2ce4e6941ffea8e6c96e8d01d14f678111ac64f17e64ffdf2cfb0e090b2b7551bc09a2c51328840b70f3c5a8a49a9e82e6b3b680309582d09e279528c2812c899284fea98ff44ebde8fb1078361393cc44d0ea89d067c60d99ad0c5d2b13417d1c1c263d92efe04c77942c3da10455dc98dbab9945fda1053431e0bf47dd85c3649ce5396cb570e31e362e2664d211cd94902e3a67ede1fc6bd2a3974bc720c15b4610e30348d8bdacdbbfbc27e8088473d245c17bec6fa5afc8681af075186121616004a46e4b73289312a7d029ecc9eccb989943a8ec9b776cf7eca82f9bbe406a01bab3cdb48609007dd6ff481d6f7b132c8344248903aad53f47e369b7f52ff78dea5f44aabd05aaee88bb72fdffbaa678f04ec43f08e98b707192c8f84a5592f1a2fe712dcc3f588a7352859ef9002a0d1c0aeac68fed96a1548f48df8e5a2a962390a27fb42679ee8e9e3f45385eb2d1c1f6663d7590407a0767c4aa2bac953765980fa3cf1ed10d061dae4a4aedc655b41ef220672cc2364dde328c94b0ac37ef3eca80f37a0caf6fe62b5272fe3bdfbc0315d4c542f8888104d5dbc84bca5e5e421c435a631ddae4b95b1dcd8c663420d46cd3d162cfb4d42149f05172d67b3484bcd852a03fc6f5acf54d8964dfdbdf8759234d0fa5f70a89e37ada321bf8ea3714e7f0e2a8ae2d17b6f63a3b641b1e7c16ae17f68628806949141ab0466a3a50c400c6c883fd6c69d2306368961e035e044b92e186b4780660342c6d6ecc520b6af02999c255e9fed4c1c84178965d4938ce72e4fab11d8c2306abb17dd04240e855f1a3f99b3ff841819e421b6f1f8f0d37754571e1a1a2454d08efdb0c79dc4f0d9702727383e7588fe740879b0551233dec1fcb016adbe5600294dc362ff596c8ba3ecbbee9fed7ea8e92691251f7424b0d12a5a105ed6ff5498ad1138ea4bc54cf9fdc46d55097d6e348ec91df150799b986b565f6f31b0f37d55b454bc24a2ba6aed0e8de3d49f241345ef8ab58e41dbf0d052e2c7594a430b2431b97b8194a8176fea2585d227b70910838dfa87c6260d977d16b7c3ba7b543a996a0c8658505ce7f6acc4b4aa67afe8867343a73004fe39bb3c4f8632a8234aee7f218452909f811706cedd1b903e57e517fd0d4e0c41541775a4f337d08cbf3100306c929fca530bbd08f829259af85c1aabb3a40f7821b1b37eec33ce6c58d4832162f06713809743042b200bb943a26c1c9950a829c4b67671675d61741e049e708f7de602af96e0852f715b0609d01ba83f68ce41844a8fc3a4154384c7bbdad29dfbb0c13452b2720070ba2bbf1c694a70551e745c6a06ee102eaddc84d150d70e0ff2753e865284bb5470a0eb4b8b98df4e9189d931fcdb1e2c7f6785c701b9907659a01eff2f60f41cd73d080aed2fc9de3272ea9f0d86e3a07aaffefddfe4984cba9d450404f9cc2251427788e7abf3e263832785f6c4ccaa5aca6d5629abdf7133d5eeb1a9144fb65a5cf3bd1403de55dddc6a3e9f86ed5c4a451cfc051924a0626aa62e310d8ecd93af1830f0dc355f338ed40626d898727470a5b275c5e6d10dc27e3319370adedd594e5a84ce1707e005ecde7080a103680fc79c445cd1086b6771140cb0fe11a084cb931df36438c7e58898334c4a2425e7e5cd51cd0034ff6b483206503167a8fc3a9b716b32a7c49c8112c7d2557e745b3723e60cc8c9b0a7e1c91638b67aa2f612bddb37577da92de22c0191555c7c141a814a245d33e8d42168e563ea09a5bdac4bb89630cbd3a64de1146eeae074621654114063138c1555c2a6550acab0aa6b2d25f7f49103cb7ada78d2b771a5d3575a2b32060a358310a3e31531a2154329179bce0a03799bebe0acad71ab763ac170b129375c5867b15ce5a91b3782cde96f95ba9c1493aea11c8ed7607589fde1d1ff67f80d82a65e3a0e09394a81c8a93960a9bdc8a992a42ba7aab2393a256215db4140829cdb010ffecb90954c0c30f4571ee4f0cf26f83b26dd8b4c795951c445079adca832c739c8444474024b9234ba818cf6bb70220771ec067832343014a3dcc596b4fed2b5e5d20d629ac71c055e7b7ed0ced3b116f5aa337fc776c0628dc2e50c00a7059cd8db864d1b9d42ec52eccb649ee79f456ac74ffd16fb49632f3312023f9fa90be3471048d55e12f585641b23cb6cf7b1af5c3eb9c61b8cb8f362f12f38428f1dadaa5249f1de649d22c0354f8216cbbccfca069086f907284b6484c482e06fb25802abd9bdb54f4abb62da6596bc2e768fcdfe7b1b70f1a6b0c0c158ee5b04457326bea568b73211690854a271bedf76eb4c33b34e425441d6b340ee63a748fd4e4e85a1aa08c522804e24657d744bf573abf63ffd307c2646b2d5978cf87b28df2202358ea5df3ce9b5d1d6e4b189600ee24920c041838ad41d371ca12da86ba943071b1660e10f2cb7474b0331e1f69636873f1528c83010ff97c2338d2d660d2d89007cd773845a12d7217d68c3a2995fdb7c11e31a1aad5e0c643b3a911a2995579de57a34d26c0e18f8c9849523839fbc1dcef97603b39cce36df835ca94e9a19ef144e20e1e1d8b34009fed719a5c64464192f4f178d62258099a2edb1181901059c3c73163e805f2d1136de65931b56b75905dac14d90b33d1ff439ca25a217fba08a3580c8559b9ffd8260e510adbdb0058cbc5317d4829de6e3f4be0becaafd68f8a9d65458e0b92193ea4a3336443b2f0c8f846d1e7c1f1329a4b8caf746aa2650277b5492659a4856c8642da72caae924b4123f50993adf80f23329b6a5c650c65a87b9467c832a277d1c749f860432b0baf0b3923810e09cc3d6a68c7d9d152384922d0cac6326c7cb72201486cd0f87d248fe39c2ebb3624fa6133feeb7ae2601c4d9db9f257a6d634485c8e60806401d6ab4231d9a9c24b13d61310ce692e61bce7e13cdf6607855f77a9526b39176b838633a1a86e30b0107551aa8f6999c3a85063e9bc5fa822224a4d6dc0b2c16ed719b48ff0a9b12979d4480356975cb983f8280458e00714f60ca68eaed351e73b99366974e8c2805b6a340270f2c35916eda76f4a205497fdd5cfe62fe0c1f400f9a5c172e4371a78a1ede8c2c226a559e7454f451f497f4f309ba5c59fb8abc6e7aa96c3e69df9fe609b6d328613e78a8001596e7dbf5e5309aca29253131616553d172899b549409345243e4eb0f522c6eb3547663a0852423b8a04dcedb5a940d0da90b5b4fd2f36e82d4114fc4381f9424d93a7caf8a4692c46a890a8d0e13a8ba088d51a3687c8ea04d707d8ce646b5e54d9fb94213a3ef8dedc322f2a1f73b0c812f9bfc90a2ad371325490649b61af9fc7a70a25e3d46b146a9e23155ce6915177d8b314ef893a936f6b64c553c86c525cfd9dbb296574bce1ac3e2ddac2a21ab9bb34c6ea9d3b598d95de8db6dc64193df7d54d1102d72c6ce26b5c777c3a2cb29c48685f8236896bff0fb8b30cc9c8046007564374f8c6f170ad6c138bd6d60cec56d3a439a99ab93a2e711faf8b6b6dd9ec3a42787053ab445ec73c61ef3418761dc98d55a6f1344295aa5ba17e7cc5d1cb64c66aefb0ac6dc3d2bb0a8f12d5900de6cd8326bae040c1b77133eaaf822cdcc70396a64a57e29568a79c040cab082f241e85bb215bcff834b333eb58b2b0ed8533f626cac790510a947e370e0428e408b4a614b1e42eb3849168584c0835e47bc149869aacb0aa163e9d8ec9a2e93b2fe4755a7a2bb73ac2fd94127e7d8eb5388d28e8cf39231de7606a14d499a440b14ee8ff626cf4eb4cf34235a2bfca38b196649b0872cda69aba385a582f6076a3408fd6acf0f2128be381f4e6cd18c13fb6c1e5762cadb9adf38965dac710adf0edc4f286c2443b7f1395eef42c225791b9cb28de8e136910f1759f3099f74f6e39aed9c30f54900fbd6a33ac9c8cd13114275e236f406e953756fbdf465b6365c51fb53c3eb0dd83fbe6aa5c79f366f31f3d8d7f65b3b6d785ba2867e90b70068f88c6b553184a498a9d43c1fab5c0547f3e98f741c0c645c309394db886cc6c97b08511f3547da72e06dce8bf58126b163ad5a5dab1d1acc75296ce068a3a80e7e2b63babb79091be91088f6ac5d6e78e006d94632f3dde5aa915815a51320a5699e0d4aa10351d0d93801b54109a48a65c474a61406a67fff86944215a00224b5b7a42eec1a381754eb6d50a5fc99da4a6e514c07609d36def897337ac7f81a46bbc6e8dd959ba141b54dbee903551a0e60e4228457a5705540a8120db8758d942e0af0a36c531835449e09448e2b129d18bfb8baba5f9862a20b698783bba11bf7af873f7e186e025448f0d005ea6004173ba471aaf80d4e8062fdfc4f96a5b8a5082c1980851116b1188fdc1bb4c85bf8d666d536f0e4a0065554bd6b915be62029bef47438df2aea97c3decbb075d3d88268d1d1a3baf1d12743371a116ce08dbc2705893aaec0c5af831f5dcb80ae5922843d9ee6b44a42f468a869f77abccf0a869f10fd26b97fa3ae3b2173002738c064f987aab659b9a925f92ba9c211f39e56f3373fa01631e64461a7fcc564f551132226b9b57a9dc3c585a054cad5913ff2b49aa1554201ba73e4bff5ec15050cb63150a9fd32b46f683bbd9b11b3efcb63a3bacbd06c0788e7fd3b8ca533669aa41993fe4e077454caacfdd3547f1e6c368baac8374dfc890e80fb4fe25c2249a2ee6f96934ef8eed39950305d09f4fba17b42da50f4181d639c8982aa0326e38e71716bd06a6586b87b597f8e94c196c46fba2ecde71ce241ac9aa6debc42359ea7c788395f2ce6dfa4e9ea7fc05f0f1aca9edbd9f887fc541152c3c38bdf9bef350a278e4218b75e68044e194546c4f8af514a9d58eec9fe29e7e98b13d1075ac6ade5d4760869007ce7def5a26579baf3881ac9365edb9d3bfff264ff2843338f71ee9c5e8d8ac77b3aba6b8b7d8909d9d7aed874b114212e2275346b0cd66ba4e439276a157dd8a1e59eb86a67f3c449c7138b48aa422893a53ec6a9e48dd897d9a7fe3ac25acebb1f1bc8f3f7680a723ad773ba4b074c00feb607e068b3ac85dae66a3c42bb764dbabb4fa77762f9b1516eb93c95ce0269f47f71740d09ebfc406b90cfd155d0b0309a95af663f40f7a79ab51a0a174111f08c64a6dfb4064fe0c952176a060a52c7a1f82f711f02491793b4c52808b932c962e8190a640b57207cf35b309a2f4838bf60ee8a543cc0db740665b5cab901e007d7b21c0bfee2212bc5c4565661a8f5d0a05e39831ebacf3de7580549e50039a1bc1fbe3bf53ef158b22f15495bca32cf4cc3260d46b1c9c77505fa70cd41e2ba070b3f05c77ce3e48075ced9cae069ea204cdfdb51aea78412c96a1eaa19fb95bc0181c86c17c19952edb4d680e40ca99c2692afd4d85098c3358930dbfaf2520b024b53c8c1645c9ec705ed5f7810178269994fa7a678b23484bb8134c1c5fd2167c3fb8d1e1a5a21ca3436d832caf7000c76a790c72a06bbec03289141093550c19e90d79678fc792e84774eb97cf6b7affc282210645c9f3e68da72179adec35663ab2c83eadf10e30a105226550a4cc6e469c19cea83f5634dfed21de9c94ef79ae3995bc829fa259ad22dc90ec99a4bfbd37648721d69b7b45372cf53df3a690da7b5549ee40293da12885b904a4da9564651e6244392f3248152380900e947c96ed2bdb506728c8d644a124a12270991ccbbe91e2e2136ab7f554a9581297396639239159d388c10af94502a4a064fe6ad3c76f58f18d5733b57a4a90aa8f08b59f9e1742cb34d453ee32131451aff915e0a41126af2ddcab7957eaa5c140e697749a749f795ae957b4df5a96156b1a53243391020c6807f0d0769e9b50f3e00612605ca4bc256f181a7a8b02970b4337754eb2c7cba40f87d7641e6a8f3a758b9b5d954fed13dbb5393318d46781c9ff964bec3d79a3cd50fba1ede66c6045e1bba430e66dbcc719b4fc5f13561048c82af30033fa1c2e2e932fe4943827a847c7c33867245bafaeed69764dc9e4a16bf8b9232d7e43dea4e33a0c458658c9dfa12c0c465a631c6c1d6dd269f9f941ef7c5311c42fe5ba6fca5aa18acce311a0082efa1b014a70a443961c8aa1a5f7aa1e8be18c6bf9f4b8adccc9061fde17a20731566063965601a992de8b2051215985866f2a7f39f9bbd3eccf29377c6ee70c768756688655af471c8f601a63ed9f84909a801a7f6ad49a022a38db18171cdcc3bf4ccc3d3727432bb18f3a8c94f1ea8d11d13f9303ef17c6703425d59dea309679eef802d47237f742f5b0d26a3e7a477cf6b42bc43f2c4a181e290c3cc42deaf2e8989f97d87524b407df31d9e08a66acac4237ffea8c8e595e779d03b64a6021ea775d8f093527c9c1b897a14e86e43e2117b2052b1ee0f7395723d96d888259c5e4ccf08b49556b1355f5923559e7fadc86999d6ac34ff8ddc53945e0266f0bb495f15d6a6e3438a69d0c83d150fcef98b0419e74005d2241358e196c9d3e5054ae0e0298b095f49bf4e024a3eb444c5efb8b2aca9ee80b0be61ececefb476b0afaafc5dc473821ca289beccb9866d79b47b554be122cb2b0a1c232f16bc859e35d45d6412e309174c641e35c4a610c9928edfbf3a41e0d9a0f8505b9e11f3981db17b1e616cc2ba9fa00392c6d95efae4e810b97f08a1cbe5073ed3a811846e42ca3b7bd1d69a0842493de9e95c6eec9b591ef4767b9b9147512cef9970239237b9c818dc13d63568833adaccec00dc6d6cc88799a22b74f0f9d3b7eb6ddae6abee6ae3ee2911b6cd588317490719154ab2f498c0ae053fdfba981a5c22eacba5027e410b3b9bddd8d4e8a2be342f9a64284b91d5f2cf2a42d96f799f01d829f6ca9b36df0472c149e70db26035b4447dd7b06ce433f2062720a0a3ca88d355b54fff3048ceacc407a72c9566547ecf3cb9f195ab5ea909636e9829c0a9a9466d89bd7db21ecb8235908198ec83341d383ea70735b417e81b405689908e5ab646fb2c452e1181a82f72c77e6f8ef3b9f11cbfa8117ecef3acccf8661d190a38e0ea1c0c6c5673f8199a542d3e0215b55faad7c1ce61ec0d1e5348d2d882ca532b0d16d62d3a8084fbc3850ffad63f2357d05b404707e9acf09878f4d8154c63e5dfad892c1aeb5c72b25016ab06d225f0e98bb0b5be7b50b2a98cc8539273fa90dceb37a2ed3161b25468a02fe1532d8103e849ea9fd03dc9de78f55936b8dcc93944898be6f133052f78001ffdf74f0f911cc9ed7a715048284f89843136a50d382a7e03432c5fd81ff248405afcd80a464c8bbe1672bbbe81c2530c003db44a34594e78ca018890df7f0b5e1d8a59311f234e6ba1f43dd12b6569d5349da81b0332e9d5f4b59a98c4fccca5c09fa595f8a9171a6d44f993088492248887dca0256141b3b5ba6a249b74ce1a366d74bd811cda4089c550269095f265e1996ef2f87878d99537eff62bc039952e51e9699298eaee577347c6bccc7dc627ad645ee2849968cdf2e676c5e6dc4c00c1f5ba1d8d91f2c0504b6fbc1b7a3a76cdb9dc1fa9e1986662119c068e8c2638b307ea145e8e2be8fc3d920a499958cf669fa128af7a05130f6254c7b891fdcff7ee54c8b67c6753b5e3f63c7e07ff94e831e922a1858f1402d17d88884cebf794fa93cb1bf9184081398c40b66586187d35f4a3777a360c91600ccf8314118a0ac50fa6b34f9a65f65f6408e5f5f2b71ed9876f19d14d98a10b244ce36a620363468f9851cc32c7909a50e5e3460266d4e5e7f239e731ef53d4721394ce87a2967c897078a188170920d81e36033a3b0092a0d03ba77c1d98100c3342ec888444334483a24bd15809d88c155d4c76346d32a1a2220aa653f4da5444f2c48ea8488848269f649af81a899320c4e65607c29e9fe911fc99e078cde487cb2487e042d7fe22519d443ff4d8d33e051c851b11ee6a340a1fc809bf7403173a303a041d7cce8609f245f8de01f26e8fe6fd90346e2fc04882a5ffb76b8e1ab78164d540db26e4ef256440e826b0ba5fd828561e6b685fc2c2e106170c7029bbf4783c09476f9e4e563ea1cae70ed96c0a058a3acb2e587366addc617f885135aea95c5ad74a23d761ef74270195b3af855698913eb7080fba69e765f6fa8cebdb1d9304638734b4fcbdf97718af1a3a5e385207a5660c23d2541a3b7d68390c5699366e28142cd78f92ab9ca277674cc014d820d0c779aa434b26386035141090ff773f60ad25d382bfebc0958bb95b446173d8805a438087033b14906821efd23502f73ceb8de98780e18f05e387f6b29f5f8d6a8cf2a66811fe64d31554cd85e1dbe5c141bd4daa6922383a3c83253a021a027b0e7bc2f1eba0e5406d038c7b4b985e1005e4544b9a926e88e97056d8b81a714b200148e252c947e4f8bd77c456a034cbcfb134251ded438309c25c3459cc10fa1095825aeba9f80c0655e002ebef9e481375833433e5412b46f4ab3b05a4a07323ad016587efaae93a78fae39b08f813123fca840f673912706755d388d801b943c433b80b4a65763abcb66191dc6c9bde093fd42b6f630d6b65d4ac7b08bc6516f3d489d5a543d1661827fe205151f2c49e5a6f67844e326e731c8c502dbb6cb081633210a43963feae9f0b3c0a2871108d1282b2f75e93f2212ff6a8d95c12f24bb41f5b45a72fcf4646a9cb74f915e6c66194160ef85dd9e9d12c9185163557a19af7530b2373b6b463df47aebdf0748641fb9b594da4b001462f76847c31a70539fa3e22f0933edb98b80bb49ba4ef7e8ea146d6ac13fc1bbab7de5dde04b19f03855d264d9b1c4c2d3c91885d1681210a1f035a8ea98d7be9dea0d9221796120e5e3195d6e21d692d09680baf6b6103bf602872461e8b446e19d497c16669ef9a90ca38701578ec7909d44df940e5c282d5e56c5b1c2596237cf03d1b0a02a3f63192d8294476c7a846659cf2c975cb7797b01ba0c38d58b734da32bc001941495209b26bac1cbaeffa91f89c6540a10e596e3f0ae4078f9db79b0ce9d920fb323ff7c43eac5984d2e298f5f48120f39be6ce170c4d60427999466dc55a78da410e9da79108e18f5ed1b353ba3ac49c5861cf711df535c4844fa6db627604c5c25a53c8c3a18aeb28a69c8e2e3aef4050c2779738cc3d1cb5e6cbd5e36d3e125216cf8b2d110e9dcd4a80877ceb626fc32cf2e3dd91289d7425ec82bbd6a7653a4adf0aba80acb2838d8aded011b22a08acc153e617ff6902881c0309147cbcb314e8d82da5c51bc200a260418aa41473a74c55ef92200b287efba57d1c388764fdb5f493d0ce80debd8e4230a7cd96a2604416f95732ecd839c388c618a07c0c94b81413e4fb3369b2bf9528a495e76218cf839cc1b9f067fae51e52757f5cad08d32c61ed355f1d18f2cd67eae540bc68806c68b7861edd6d8e3d01cb616e9f3d6567b43b36b710040a4c2a9216b3901148308ef8de028a9dd8cd88e4e422db20736be12a70da0b1d9a6d73adb8fa0518343f2321176b4bbae80768045c0dd890ce6b2e004c855684b2802982002a2f9a5e9f6dc578dcaec601c2de1c390c888a18103ba3ee296d56a56cb13bd70d31619aaf5817351d228f9e59c87ac743c9f05021ae08ced6ffbb8a62bd5084b1c2135b59c760b26f99ff0f80a84fb71ab2b0d5f561d41a4a40a659b14303ca703aa94e720566279c480ce0467ce2c79047db4d463cf648e986c837c55008346b57fced17da727df1cb2340f875394550ea9f950a10bb50a65ad5b11a25171edc7a602422f44f005a8881a5299c3b4e0c3cfc455ebd41fb19b0c66438736891e0d9589667956477ab38c8e5accf56f5d112a9b72f79d5435a10ad7db28992efd3e3008660ae0db44179a0a0a86362e182f175c677e5408596fd6f2fa11897de6e085e5a53ac5d52575f357670458ba198da5cd95ea0c38be02ede1132e229c31c82ef69d1022bab63799c278f2d03d2744fce19f637292cee204d100adf5f026848adb5d6906553163d2c8c3f2cde5ae096fa4e396c2d215fc496d29d30957497f2317ed9b40d186c9d419824af0727fa8b7219fdddf4d3411f47fdf5b16f6ef49f58d55c6af8e3b75ffa15441babed8e47309d9305888bd220ef7f9077d3e600428f21a5316fafefd43c3d27d001e675ef8862d6fa75296bcf9ab51d5e28a0cccf6383c6c6e540bcf869726a688b1679e10e60d2182c3fd21a77ad4c9ff4039334dcef4912dba8735b22298c818b77e962ec6975c6375f70883730f3ae6abf8a57392361c29ec451e54c9a0b2bcc7634a4a277bc70e50f0edab91c55e1346c0dde86a28d4597fefe22928d23f5b983f907a4b8d5eb2e3abfcfb6c8c4e462870e24301f55ed23135cd29f79541fca60d8886ddd91f9a484f90a3189067434d570d8a18d0505722a11cfbd78f1612d16ec42b6ad05c55340da9556277f6e62613cf0682e7d25bf9188af37081b3e50c5b8f6f0debd9135932764f44e68824d2ecc9941dc9efc3df6e2bea1300c3ebd6eea16638ffe9dd4307f4483aa6f440ee2fb0fff5739ce331f86212a968b102ca19532ee00264589707554d24062770b6f55a24ca9d97c5dc142804eebf72cb06d4a2ebca15218899ae911ece7b21803565c4d9c8bf7c792b1c86c05d09ff4a4a53502c6caf6d201522a2b14479abd235b95f5a48f34481324520d0499acb8d7630e13ed393e0a082e15b381d535266d755bb1f36709e11b7bc9113238eedfac112feccb1b124c1a0bfb986b5ec1df1cdec3467c6d36b389141cc4b4e7de2c95b91206b6fa56e6c3d5eb46ea1377782f1971717c366d9a336f206089eda64af486c48e20ef7c39b04a9671116b8dd12891eb9642556e35d016589efa36ab4e65434e253b1590809145c26d4f3126a1bb491e4034be9a2c1d4b8422e0c76280917504b748e266e26e66284357adb16e72e6c2543254d645173ceb3af230044fd2fdb2be9ad9dc56f60f0322932b7cab869110515e57f8d1f364f97a3a1df70eb9e02caaa3059512a8078da7582579a7930a2843aa2b0f4e4ec253110470d2dfe5cb12b0f30395d7fa67949888fcad3815c1e158f91e112bf617b165c9715ea0bea09dd7122352e892ea2c1ab71bbca3027e5504060b3660b46439330f0f0f0f0f0f0f0f8f314942fbc42d4899a4ccae780659ca4c292599924cc5c4edb20edc8b909d119fce4c7c3a33f10501d70a380b8f0a8c14f35ffd08d983083157b47a3aa5d423b52cc4a4158dc62a954f65b1a2b16c49a98e68216636ada239a5b9b52fc4a8a26f9117fde25ee7d7492a5a9341c8eb2c2974c451d19fea8d994a9fe7683ac729fa9364cad33a584cd10793a7d9ba2f443121257094a2d91271193dec58c8195234d2b2bba6d89f775fc3318ae632b54798ab1ca2e8b7e2e53f968e5c1dbcc1118a2625139f2726332c7940d187204d53d03ef294fa893ecf98d24a22ea31b227faca2ce51abc3c5e839d6844c38794c2bb4a7e8b83138d4c0f2228576f137d25d92e4288753834d178ab6cc6cfbf8c3f13fc57c91c7935167060a2f3d714be45236f0e618e4bf41b44456a77b5a859b244b3a99378d21827e712aa44236a3a5f7d2c88b82b259a103427a94a133af78563128d8b103bff93327abb65010e49b42149fa8a8ed6ba39b4800438227144d9142afa25897240a251c1532fcbe6eea50b34021e411718b8117461e3be0b6383e3111c8e60bd745e8be59bda42ad0a472392831124e05844a3fcbf426f926f295c4574f13a6a8a66e1532725a2dfccec93644a7220a237ef6ad322f276d6f021dae093fb73fce849a92345e030441f598209d10b675953882e7305f15a3aca76ac8c081c84685de299c8260da2159d95a6dd313b6117446322e692b47892829802d19bec0866a67f3963d291130207201addec9fe449b314747bc7f187462d5b4ff2d8b992c51c7ee843afc4bba7143970f4a1dfd3d27eb984578a48d3c0c18736284d4944d65f1fc9eea1f78a5bad3172d86acb2438f4d05c09ed271b612f38f2d06789fe2e191ae1c0432be17de4b28513c17187ce3386d5f81c2504871dfa3f5d318d19a54db81c75e8b56784c89453c27a4887c69390c1dcf3278f1372cca153cfa462c724377ff81039f4e9a527e98e881d38e2d056e61391720cc1378570c0a14ba9b924c83849f8cef1864ec927592ab5c8a4fce2b9e8c2a8009900d92084c30d5d7638e9251ea4ce65b650a3c1d1067f24a7544f3125896ea1d6020e36b4494de75f6a390be158439f4f0819e73d5fb36fb6505343fb51ad628a9bd7d5f22dd4f2031c69e8522cbdbcded72ba6e540437be2f26413e3f32638ced0e7142d4b493e99632ac97398a1b1f0b794c36716111c656872a969acdc9e83ac97070e32f4573af937708ca151ca2c74caee6be0104397948610cb3aa82a5911121c61685efff3b964cfc8a2a58007684c80030cfdc7af143f687c830b2f15a000c717bcd0cbc811b153501abd3296054717fa6c7acd53ccc8fc5cb650a3a1b0e0e0c2271b2d26d9402a403638b6d0b768cca7f2b382430bfdcff78ae74b3947b24c81230b55a95bcef13f163af11153a87291ab1f8602c715baf41c72fcb32aa5cd47a8017ae0b0422372984f984d264c8baad0cf8ace532a4f85e682dcd7d1a69942a772d613b9d219951829f4994d87d39ee528b41bb2beb8cf899c440b8546c51839b75805a5553ea19913277ae47a4e6893cabb3aa644389ad086f8729592a560e2241c4ce8b3930e95b3e924b5328e2574197276c38506fffc001c4ae84b89c629fffcb6fc93d0767b2c61dafd44bd4742a7bc3c9ee5d918938a5b3063060de303c711bad21c1733e7d808cdef49f052d244074d119a89964987b79012524b84b6b743cc224b66b576089de5ebee6bb6ef97288466de930af158f5f792efc011842e49b518177b5692ca01a18b9d8294517233fc44387ed0be7a8c560b9b93930a870f5a1d4d51917bdbc23f3d68b3acc5939ea492fab24103b9800b13a0630e1e74221f1f3ba3a972eca091a292c5cdfd8d9b646e02870efa8c296e65c6f60ff2dc02470e5a0d6e2acd62501d53e5c041274ef5a26a980fc182100b1c3768334bbc2c6d6a4ae6880dbaa4997de9be9f635e5ae0a881214be4757f9072d0a0fd14f495c8b3c298451354fc3ac6d80b295660c8a2dd10a6fa6e152f7f60c4a29528dae1311318b0e8936a4cdea49167e2984c80f18a4e7b3be5bcada32d27686880e18a3e261dfdfe0b956d0d462b3afd2b6bee712b030c56f429f173bec82a5df1b38a3645cf1939e9fcc57755d144d13cf92c99240d2aa50b3052d1e5ff1c594d55888fa96a01062a5a9dff149d92084966fc146d87e56626dd710186293a9d74624c788f2d49578ae6a275eccc180283149d7b47f2526241c49c1c459ff4a98c31c6674e5768c010451b3692e6e9183a336842d14cfc9c4274fec69c1518a0e84bc5e83d51c3fbe4824f80f1894e894de2f3918206d53dd1ece41893c8fe79af044627fa98e1ada3440e21aa47a3880c6070c22434639021e886792f52408c083036d1ba78b6182db17182f66168a2cbdd27b7945251b73418996862f42e251e83ae4ad241366cd43815d062015a943fc0c044afbd92bd84660d7fc126c0b844a7c23a5ebe24153391126058a27fbde89e2178cc13bd12cd28e15bdab48241892e2ea3484f534ea25359b5ac4db6e709db146048a2d79875ad3cb699fc104e028c48f4d9a489b87f5532e25d24c080443341ae5f5e5455caff11cde9079544122e27d483e188e6fd83ce22a4360a188d68e3e69821f5357810111e6030a209ca4ce6ebaf4180b188267ec90979654cd201188a683b54f485384a441bee59dbab62340621a2b3e0573a572c9535e810fdc5a05573c57039830cd155dcbc90532d447b216acedc2bb2728710bd25cbddd09d611e1f442f595bd67a43458e11449f4418ad27f42419e140b49e66f2324f40343234a6a4f0a5e3967f68749e4859b3f443af723232470f2953d9872ec824a36d6a4986910fcd75873c735a44266f0fad48cf498e7adccf123df49d4b76cc260b2642f2d029bd553adb273c34b2319a72f269cfb174872ec9b8b9c428d9a1d914ba4cd63cc5af43331a3f968a2dc93c4487c64da5dee0ea162e3487b645e4f25d3573e8e5d09568f89afa716882509a67638fe792c3a16d9d93922ffe864ee650f22d4becdfddd08508d918544d98dad0692dd1dea9393f61363441268f9167b237b4064dab245fd2514393ca3be575d2d0550e1ff162661775d1d02695a4e41c646758a3a5d0a749896098a1bfd28e6439289d35896094a1491dfea71d93280b22186468fb74a6656c12ef0fc118437f1ab183279dfbe24330c4d097e787c80eaf973204230ccdc68b4af23cb173856080a19710b3e48f3927991482f1857e649f5885242f74da9b444e122e3dfb2e74ad31a6c95536ff870b8d57680e9db42d74d273d894dbc2fe470b5de66c268457c59cf12c34f244a490920c163acf9774c7a8b942232b8518239b8bff56e8847ecd1a77ae42a72ca63032bf5468ce5487f4acad9d5551bc048c2974ea33739173d53d2a85fe339b4e525946ac1985f385cc4aaa978701853e97a88888a99874ee613ca1d1a4f3891f21dfa5b29806184ee83292d6a484f80acf35a1f71847e5a304613a4ce8573eeb5998f7cb9225341277d3e299ce652aa135912765c8ae9b92d0a4a87e7da552e3558f8446a5ece8d73ee13f47e8d537454e5e32c279a2fc53d27e119a9cb44e8436a8a859a9639365cd109a1d0f1a926cc62e59089d88216772c8244b8583d0c9201b1ae20919740c843657588d31c1c4a99861fca0330b2e2aa852a9211f74319e2166b810dbdd1e349b41b2e859d22985078d8e961b972ca9c8eda0d314f2e57bcc60aad441a7a2f23d29b1b99e1cb43a1bcd37c583833e441eed90d4b9417b398bdcff581f9d6483369ca448217905793e8c1ab4262c79aace3817e477000c1a342beb9621ec678d8f0360167df6d1e369dd3959fe0040169ddefd501ada62e63d165df8072df194679306168d9c5ade9591417f7e45a7fa1753533637775dd1bf68c5ab9456498b025afb09d32621451bde3293f8ac3a106314bd69488cd518e6e348146d86af9f90d93cf37e28da0ae37ef263653c088afee7f74db8040d2a399fe84dfae49da4fd2af89e6847e7dfddee37193bef443b7bfa1da3674e34d6a5ddd14fde44274d44ef27cbd9174db4fef29d93ea33d14f121322f989897e35690e498e97e827454929f3b796689487389b93aa9568a478274b9a7d738a2a259af15e27d1e80e23eb164b844eaa24da902764ce195358fd22d19ae6e7c43831c223098946e5e4a4b5b3fc049d47742a1f5b934bf0a41a47f49683997bca85d8b8119d6e131e613506955c46f4b1bee1347606d7b42ca2b1ca93d5948ce7c628a24b0fd94d44a3746c92b15d4444a3937e4cffa49fa28587e83be5893815e179644374792282687caf10fd76c6cc8e1de27972846884bef4dc991d44bfa93b6cf611427552104d70d14148c89674ca9140b491dbc3347c5c05150144a337c77275ec943ff4875e466bcc24c3a5e7df0f8dbc5c31f16296f2a60f5dc735655d412795b3c687469bb8876acf1492b53df4f143baa9c8eba19113b2a4542aa5889b872e79598829393c349f1725e910b9436fe26da52478c8a155daa19120e29c3e65964c8aead0755a4b904d21c6b0704103dd30460736829c498ae61dda194273c510316c17630e6d9011849e5429250bdaef2201378821873e87cc8990e4a4b896cd20461cfa9c3ae715a51ac4850d0d600c3810e2e64f393cd7458c37347943fc36abec9244c5865a20861b0e2d9f3aa518332c82186de84ff20915c2cf6496ee202fbee8828b0ac460c3a3c4476356d31ddd426d0dedeef855d03e7ba144b688a106940a22a696f3aec84e8c34b46a7d313a57100dfd9bf42ad31cb4208871863ee48b6147fb67c8e8ca0cbd5a126a72266acb46cbd0a5885c31c49c820e8841862e2d07694a54b80805628ca179b9ecf5127d8d2e0a046288a17dc93e5b395bf2592a0c7d902044cc24ac433efe31c0d007398f1674d42b75d3460d2ef00bfdc79c772eac660b3562d780185ee8fa749f2691cb7343880b1b1a4001c4e8423fa3bb31cc58ecd4202e346afd418af08c62f92e6ca4e006b241a38b44e3045f9815d0403752f0058d1a37ee1410630b4d96510df9f3b788cba18007688c208616fa922a5a31448f16d940df05b291c68b0cdce0420148ba305e7cf18018593846072b5de183486b58200616fa3599296c882c317c17e30a8a06955622e794df3841035cd08215ac2086153a21b20835511f49aa71a30b082ce06254a1eba025c34e90416a08a2421b2b787ca5d44fa10f29eec90f0f17e774a4d06528d38ded399b4d8f42134b9f66e5a0317ee550e8c4faeec91cb34a04f113da284aa6dcf59dd0784513b16f12f2e59ad086c61c5bf534c88d24139ae01aa31a4c281d8396d0fe69487942648d41a88426e44c42bca850e9b19284dee2a8d44134c8982712ba369152ced15b820ac12374b221426e76a91056ab184668ab3d06c993724568cb629293fb27421776ab947bf76b8887d029518d5319e3a62344086d49f889ddd13c8c2808bde65569b41015fc03842e6be81c4c89680af9079ddc710f2942add3f441db7a252ac60af244aa0610a3079d882da1b1cbe34513f2a0edc9ef97aabf183bb0190688a1038d9183d554453f5326e33c5ba8650c1cf4feba99a45888c4fc8521c60dba6832a55f83023366701121860d488c1a341aba54f89fe4166a0b405cd8d0401a62d0a0d99867b62fa714ccea98451b2956260bf1c5bbd2218bdc94d412934d5db425166ad0994b34853072621250000310173634b0c6b0e8ddbbba639fe7158d909d3764f93615f4ee8a2e36c6131a5fb6a28997fa2bd6d52f5f58d148d3b369c1eb58456bde164faee7e8997b55f46e4af27f692715ad7ca538d597f9a5cd53012aba10c453b0d2b6d84d323b08749ca2cd089b622d85e0a0c3144d124153c91e6525944e29fa985825fde43f3dee2045a327b4c38e06b10d3a46d1f98b0acf51914f26a9289a7909aa438c7952c643d188afa4626913174d8a1da0d8c36aa8f490f94f74319783c5e50c891f4f7491e365267ea9136d9c581df9cd5392b30e4e34416999a6ce29945bbc893e4365d589b2492f474df459829e1441980c5ab44c347a9358d11443ea56eb071d98e843c6ce4168d6583997a8e3125dcf5be68bf58fd1d394438725da20db651a29ab6548ed529082eba8449f62ff23ac29bd51e4450a68201570810eb27129a044575a7525450e1b2ba21d93e82c48d9caba1b49f4273537fbe5488f5871249acf97a36737c4cd6fe3d001897e5492450eb11b3a1ed19599523abf520ab27bef7044db65ea1e317eccbc25ed68449ffc94f94b081b3a18d16c5ece5e8e29d39845f469c1c2ae78bbe8ca1ca243115d1c8bc163a665a71827a2d19c7d534c2265a9753a10d1e59b85324d210143c72122d061883ec9b5a073bbbce46649143a0a61e7106d9d644692b5c0045e78613a08d1fe6891f1a94fd931883eaba7ec86ee82e8939c6e89a8f1927f0c3b02d1875a9c98a93d790801a28b2062cb857d4f79fc3fb4792dbb55d0ae2972f5431f563aa8591c9dbfec431f7cbb5c6265f9d0c844ed24de67e753b787265bb82c2d26f47a04e9a10fd99c4f4c2e954be279686367520bb264f0d0a90a417eae083a40c71dba70bda43a9c858a6dedd04597d51033af25a4a50efdeb075dd34187247d3af425a6cc7362d6e0fa1c7affd1d10b1a4264433934a64a4711b25172cc89439bc1d363356270e85f763e8e10157a2fd5f1864e871141cb8ee61456baa1d1397fe562e5dc54ec68031b1adda362580d9dcd202a4fe85843f3f139f563d051d7b380dd17c646d0a186563efcbd7fd64a6ffe06173d63c68c19643bd2d0e718f13321c28bb8301a9a20c4448596ceb79271c7199ad911ddb31e53ccd70c6d0ae2a374ce499e9b0f868e32b479469fa718e3e4530e197ad13f79f295d0142c1d43a3f7cabd7464f48f498718ba9470959c424718ba9ec961a3e99042c694143ac0d089247394b518d92139022e48806c9869a10107b4a0e30b9d0c5756b139fec538bd68c18d2e52400399c08b1370f1058d1174c185175e1813d8402aa8d1458d2e68786156f0057678218f20b63c365c1cd1d185664b5c366dc1ad246c3ab8d0c74d42886c3104cd0a756ca155df92f1902a62a1430bed093d5d592d47cb58b2d008fda65d93e83ab0d05b98dd111d254232a18e2b34b1a375a5e78bd1b3cd408715faa02ca514420c8b89b18e2a347fa69f2a7598091d54202be8984263d591426695cc7645081d52c0435cc4c8fbf259ee414714dad4e2c157dd82c61734be0bf48591187440a12d93aa273231469505293034bee0a2e3095dd0b9e6922ce5996990ec704263d6f92a9cf5b0e86842273a8c441da9593f7430a113b27294a45f39d5d21b44c7127acb89339ad9bb6daa2dd46c6800101d4ae8772c4c2e4d8b3cd5b051e3c617dc450dfd8e24f4e9a2c9e2bfb540e84042df23a762c41823a658b458c011facd5fe17c949bf6d53a8cd0a589dcf1355258e769015a68b1002d3420012dbca308bd26d31de4c4707153244213ab640a7ff24397e8d7d03184368e4c122f58940b1d42e882d2297b47d2a729fd2b7404a10308ed558eeb1d7d3455c4b650536202736a4820037b35f68b8e1f7491936e93f99292e5a7f541339b61729299f79c320b9831830a1d3d68dd4336ca6e47fe4f9a3103bbd0c1833668a4244fe8d2ca1f7aa1630755161d74c8411d90636cfcce49938830d13842838e1cac1f2ee67d5d6d025a2c6003df450a6a28e0ce051d3868b3d2b38ab21ed74ed12474dca090f924cf76c44e8db71774d8a0cd4f9e4c4b5b6cc970143a6a40d00eb92c26295b4b8a943dc6905237cc84f073b12233e8a0412745e45bd0a099e2e592058e5974b234c4caa4332e2ac7218b2ec83c3992ec921bc172ba48818d1b348e30073862d1853ea967d963e68f1f166da5a47fd37f2b9bc6385ed101c46e8f070d3a4b1992e7e4a5452d67166d8b0a72723283eae091c5e96dfd3185d763d16fee6a8a95a6ab840c2cdacb722574894a4a7ccc2b5af9cf49269932c94cec8a26c9aca4613777ec0db7a293d6f159f4e57b8999156d9c31512d1f82759057d16e859cff7f5bcc3456451b23aa5290f225a3bea9e893ee98f466d00961b3a868cf82d86b114ba2c73d45af9ae2e1724842b2aaa6685284abccd9bb84ce6529ba4e52438a4ed34cbe7b4cb6c89551b49f4488d6de29e73389a2330f3997ff75ce178ade7d2b4591abd9a90445739ae468e506571ff1135d8acdcc3ca2f3442bfb2932998874a2d9f01f84080be1447fc1c3e25f75ce21b24db41ea3c3449a50e23fa689e65487afd63113ed78fa5f509d12c26598e844b4825ce81c31a74b74adafeda63c4fff966852cc9c8e3aca43c59b830054a2cda2474fbae63031534a74a9744637a8088d9f9b4417cdf22789fe620e5571a5e20044a2092a75b3800bb8308139818d1a14b0800500124d1e1143e4ff1fd15634b1a794521df4e78e6847db3c26a50e91b86944e76625fe620c233a0bc2472b77e96c3ab38826a5fc3fd934e6ae2715d1869cdd42eef6979613d17cffe95ca5f7a35588883e255319cd43087a21db001ca2d11cfa5407693244d7b9fff2f59bfe8ff942b49fa4863ed1c92c5a9c105dd06d72d6972cbbc90ca21d55c99242b482e83ce58a1b9f4074417549f41ce2f1530a882657cc5dc9cb4de6947fe8a35ee4edadd8ea6205c00f6d59c9346199f1ff7f1f9a7829678911bd840ee2436322fb547f6ff6d0eccc5e92244449efb81e5abf8cfc9672cf43a39410b5704289d8d9f1d0a8d88e1e4cb8c68f9b3bf4a2a22f2d0551412e6387e683ce8ddff46871db3a34592e2f63f8920efd6952193931a358509943bf495f62e9a7c8a10badce6d7ac3bc9318874ef9761ced51e7330c87f65255c87b26bb4b86bca18fd139b45c3b557ea649010fd0f000b881a083bb6802d08646071de244137fe13fce862e84a6184dfd644100d6d008d3d0d42372ce9d2235b49735e8114146e306a5a177d1190b7f19b3f2188200a0a1dd2043e88eed0d594a67683b37e9987354fb84c90ced96f20e7f9a452796cad0e5f90ac2aa82c8d02691ad2a9cba84b01943eb1f52b7787ee8a962e8ccf562e7ff9c688887a171131535a517181abd9f2d97e1fd421b52e8a4bfbf173a31b24f73501e23cb5de8f4877d89f1e3429be474731ed32b7d0bad6cd0fd884999a7546aa1b91c334b7ebf64a10d39061d4659b0d0c95c7afe543b4e3ecb15dad00defd2a61fdb3d2bf4992a8278ce27e4e4ae0a5d5b58afd896a3ab42a890124aa8c814daa857497e6e8ce7500aed7ed248397f4c149a3072c48589dcd0cfa0d05c1217f5741e0c017842a39ea3e9f4d0412fc59dd009193f527cbe099d12c94c5d4b57489909fd571ea1d9922e59262f21f398a39e4fe738a120004ae83556640e32f248086f12daed6c5224f426e3e88eba1da1cffa1e2dc94d12b4458cd0e495ef5c77ab08ed04b5321da1a4490c2601024084bee24a1042456f8c091a427fa1f32d73318c752f8446279d5fd24c74f4f6416842f6ceffa5b273df0384b69490393f68fbe4ff8b754cb654f141a756d95269baf7bc3d68c4ca3d66df2ae909f2a0f5a8955993bf3b68247e5221c82473ca4bd1600f0440076db8780d1dd3279afc396877467be69494f3c7240e1a11b2ef05f3cb5fba41632159a788de6d200036685d4e8f0c1743f2f65f83b6e43c4c4fb00240834e5f47164d25747bce2cdab8529d2723358698caa2112682a934af64c4a2dfa4d42568e865c0a2f7f18b173a4119aff882c8a932c2f2292f7507325c613364b4a2f5189344cd17835c32586133742063155d0991d5caa7a63fcbaa0a9b910ae473251321a8d813c838850c5370fd29c5f45fc4543a8e404629fa3dad61a5bb9a31a3c828649082a08c51304a958e9ed172438628faea0fe5c99484284a2914fd8f129f33276512b3078a6637a9363d49aac42022e313edba8cc6909783695001323cd16588698d9f5349d2934ef42147881617d65ae37500199c6883289daae2dd2cb4895e4563d03849a892d4cad0449f9364052dc1cd44a7faa2548ca5e23c2531d1e79398f36e129d5d2c529071892e94760fb11da29a8b2cd167913aaeb14792d0984a7496654d5baeb41845fa04199468553f2451e155e73c49c6241a8b116dfa3789fcfcd338c88b2fc6204312fd96529d475f946f0d8a0433c2c257fbc79de41669e386173220d18ef4df30d9938fe83b8c7b0e56169ff2666e60e091c970442752577f84526a441373bc2cc133f2793e31a25321355b92d80bdea74574b2536911b3a8a6e349117de57cbf20533e659a94883eaebb44b312a9274e88e833c42d25e53d442349a595774992f21aa237efd5d3d1839752a64274217cfc50a2d2455e12211aa9d1df73e56cfd4a1a44133bef9f88a144142d1244e3166793d0e49eaba240f429650e1fcd67b78200d195c9d09d2a5d537cfe0f6de924a621f27297f87e6844b69652aaad71beef4373f23de69df9b890c48776ddb2969bf016a5b3873e08d5aea6924c6a8d1e1a8f99cd52489c13f2c943276764bcac664b423c7868633bf2e7abce1dfaadb0b174e5e7d98f1ddaeddcaa55d92f72f73a34f2e1528edce9d07fc795bf5e9de8253387369be6302375238736678b72264c45d7b089439bb182ccdda7f2879ee1d0bbc53391c286ded0f96565a8889df31676437b96b2e3be48b77c711b3acdd29b82f7e80d77d9d05e4b52423ee7ec11b38636cb7366cfb363b86a6833c790f59269519ed43434eaa6d71f328b9215454317444b4511c9516350cfe0a538bebafe31431f4353e991fa5d7a53862e271573b97c7ef44c863648acb220971c432b1ea2c9af4b317441868958527cad426168936e6a469fbc39ca60e832d4533fc79cd6b57ca16f2b15641ed3a1bc2c5e684ef3cba41c74c4e574a1f3523e29a6a44c79b9d07a2e55219c6bf08d6ea1b59077de3f84064bb1def1fc51f62fcc42974336dfb2de1cd53c2c342f292ca894cdb2abbb422b627734864cacd0fce989de5e323a4248153abda4c4442f19151ae1e6f12b47f4dd189b421b7325fd4dcdcdf19a14bab01a4ef495a2d04eaa60165b82e51c824257de91b2898ea944ff845e736a5bc8a613ba14544a1e63a926f4a77b79b437c2847edf63f4489a25f422ab272571ed318594d0770e4dd57c2ddd949791842ee81262345fb2b8a0c94082cd9071044b66e6ba4c2b7779a72537e5252c54d09b475d54c006ba01011946e84d7a773cd19b17f25484265772cb58d94484b63c3ec7ca7f51bc8286d0c58a2653e6e664f55e08fd85e738def359c9fb20b4114cbe67111d20b422dfcd4235339eee3f685743d85811333ee8c4c5ea13cf29c4bdb807bd9b871445fcd483cb83b6f449f9287262e2da1db42743b4c8313ae8a389d2b144a43272d0256f9390e443ee0fab0c1c745d22a8a5387a535954c60dba3439b94cff4cd4a494618346e95805c99e27722665d4a03f91536ff85f1166491934684d45a69894a423c665165d9414e6c265c7af1665d196f0bd9c3386b16893fb25fd39b6839560d1672b19b2349384bcde2bfa0bfd1bafccf7fb3c57b41b52aa9cdd57ab625ad167b4f4183ec6108498b0a24bd9ddb2cebbe61425ab68e7f4948a6bd0a07354d1ffe8a886144b4527e227469054d53a1a2a50594fa768640a4a08d3cc8d41a668fbb5279812c9644a4bd15a85375f70f1aba9e872e8fe92b2afa545360c8d47b2810f547c9cc26654e0c31436a314eda40e9a7f42102a6c5f981a295a1397e9b3117e135460c60c54c18c1946c350058465f1310aae82c7aa7c8dc7257c88a253a9bb2fc5207b9a310bf808456b61b4e366724fee21c6870f50f423c35384c8793fcfb23c7c7ca2f37c32d752598720623cd18c7ef7d4966d3d65ede1a3138db24c394a588ea5c1e7441fe2df573f76e6e0211f9be88390394263e79a68ad5c3e3493b6a718fbc8449f47291582d2fa97952a3dc20752c6e5e487571e29e1e312cd490ca933a9acb80cda405c9c59e0c3128dc65875e987b897afc439e5cc8ef59883c407253a1329fe58c8d6ea3b4fa295cddfe5f351464f761bf12189fef4c9e69c6aded7868d1a348c0de3452165f88844bbb31ebe2366ff6233351e0924d4f24c26f5c230f878441bf3f87b4c0be141366ad0b851a3860dfec287235a39bdbc3366229468d4f86b4413b78488a4cf67534b5f703102634457492bf3b454ced1750bb545f4a32a7a2c378bb14365111f8a68c36e0a3f49cb7cc59c88de5254f8b8fc1161d494d1fcb9d18f43f4a1c945cf07a59bc96388be7733563215f25188462f5e4485f4dcf8204493f5b53285b2247b928368f4c8f0123f59d4eb101b5bdc282788b6543849390925f11188ae2cb353237ce8cb1840743a7f9fd211b1cc111f7f68552e5c5b7835114da285061c40860f3f7442a8aeb89684e94b99213efa50a9595f3e9d59447cf0a1d9dc416c0842c9f812df433316af59434eedcb29c4871e7a0ff9f9286ad2a0a129f8c843e327848f251d96b9ac2f3ef0d028b1b8dd2174548a31093eeed059e9aa12b952c65225517cd8a117594954b85baaee9dc69fa0868d0674c1450318141f75684fa8e8999ededb2dda071dbab07192c62caf272d9f43bf9194cb09319b5d3372e8f4668a62399cdc0a390e7de69c1343deeace1de1d0a82a4b164344ded0c628a133e49651d1bba1fff512a9d42b2e78a80d6dfef4b0d9a3cf867e62969964534f32cf357431377cf2fea47c62a886f6258f48b122b545917ca4819054d0e1323baff8404333d27c541042452b7a1f67e8e4e9249eba295b280d14a02f886d023eccd095e549d194ac2d7c94a1919a4a45d18ea3f041864edb63c68f65321b949cf03186de4d66ad36a96b3a571f62e8ba53e9e64e4e930b73612ca0888f30f4124e84c66eac887a880f30607d7ca133ef73b324c25ee8458e6cc938fae842af25246913fb3d49c735111f5c68769452ed183b1724ffb1854e881c726f14911e34e6430b6dea1c540cbfa5b4c9fc47169afdf93f096349625c3fb0d0ce494a2268c81b0dfbb842db41b29a6b8aa4d5d2c387159a58953b4be4a435e8977cf8a842a3628a6cc1e573e5873fa8d0a98e3933e2b807c9291f5368aedda4566a5031841429b4dec13bc99072767cf811854e87387a92525fbe7c3ea0d0891c52b499186d619a8f27f41f3794f6efb0134fe5c3094d503a5a4a56f227bcc11f4d68837e1125773d86be7851434df0c184d65323afcabce5359d47376cd4281f4b687fcf623fbf77d264fa50429354e7f309b21d7a32aa858f24f4794b67ee12393ca412099dfc98a2beea294d910b1f47e86312793c53d21783788cd0c453315897b61f45e8b4770cfd8ce59aa2e483089dafaca61ce6fa1842934aa5e095ff7d08a119cf21b4629548a2c72dd45a80ce56f01184aeac336653493c9361207cfca059dfcb3985f07bd92a1f3e683fbb95d0d6a0123e7ad026995ac2e8a9dca66256f8e0413fdb1e4da28a9b28918f1db47a2966db75f53aa73e74d0c4f0bfab32a63f96f391833647517e2ab98b4660e350f08183467b5f5e7b5e3e6ed0ee883d7d115d4c495b804a50e3b1c6870d3addc9d7796619b30699c0bfe0c2046ebee08201c40c1f356884ec8a96533037f95172850f1ab441c7f39c621df164840a1eb368546cf1d8303aa2cc45165d8a8ceef175f488451b5736c48aeb15f27c0f58b4b9e33485dc1d337a660a1eafe87a444a1e235664f4de53f085122d34e00008c4c0c3158d05e14148aed8b3242ec131363450430313f068459739c2c9ce938498ace8f433683f0d19cd25c21bb78a362e64c26c9e184687e8a18a7e5358cf8cd09027a93778a4a2d7f55c6da94a5b87b43c50d156c89ceca0292157a8789ca21921b144c38798f0155374bd1bfac34af6e4ef4ad1784ea1df5bd1b2b8e6418a369bc57eab782afcaaa3e83fddf4cacfb6e54e8aa25322a648ee7c09451bce73eed121e9ecc1f200451bcf7470f9b8179295fc058f4f3449e719c931db21abec8926c4157d27da4e42098bb371c94d3f4e349e3d1a77b5bc33896f136d8c5b1673e45e8c61849a684c08a553ea6c3a622b5ba8b5c0c60d33b5cd4417d3ff3c01ba010163c346021260021398136460c68cd3820726da24443cab7947cc3cf1b8c4175fbcc0c3129dee8a074ba5ad93ea49013c2ad1f98628398f22f46f06081e94388f4934418cc8716a311a908016926874343dffdf3af488441f6337a3e824c52a5520d1e698887539d55934d885118f47f4b11e43661125f170441be3e91f279edb7cdd420d4d0b0d38400be2d188de22a5a0829ccb83114d121f446cf03725522d34e0002d3c16d1bbae67ca99740ca1816ea4c0901b5f0f45b4d982c8b62083580eba47221ab3d81583ba75bc8e37ba8000229a1054c94f396448cf9cc721fa2d93be1e460f4334214e8c14d6743c0ad1c4fd28395f5e66ae2c091e84e8a3682dbf5c0f92ab1a44934a8b4821a9283ac14310fde9b0bc2eab8a989a40f411773333bbbc2b7800a2b5ea10a9c2c9260f138f3ff417fd5aa405d5ba27b72178f8a1cf1f7a49741c1115e53eb4a34b4dc7d8cb830fcde8121b759492b124b8875e4ce7acf4f0a93a82f4d0997f571c9dab7c27de068f3cf4f12f7321c572c8d1e3a151e2bd4f92dccb41546af0b843bbde7a31c888650b310f3b34af29866fcdd5d117e251877b3ba81897ed84071dd4ec187954d6f06a0e4c502a3e6438913c8c481c3ce4508ea3c9b315072455b2a0944a1a3e2170488c10167aaeaf7d2b5bc6e0f18634879ad088397707c986c1c30de5539dee7b1de27b8df068039f5ab2ef0911bc3378b0c17e9f5df594121e6b20096149ae83fc450d9c864db22f04e5a1346ce26445b28ce79c3b7cbaa8d185a1e1b6d81cb9ee225c743d84c7198a78b9112c3465531e35c31fc5f572c9ea892796e1f0b927a2e9a0aa27433a25a1931a43795ec7e3c4f5ce3a3a4125c2430c98feef8aad34f122203cc290eaa096295c317880a178a931db3748b7d08b253cbe50c89510496abda61f273cbc502879319a29d1a754068f2e1897bf23a720a76744447870e11c4b7f25ddd94d786ce1129293d0e0a23475888716ccbfda2682ae485a1a97f0c88256f92946fc0adb3904070f2ca0da4dbeb9cbe6b0160b40273019983103121e5738fc9e0c32a322838715ca3ccf92495585ca523d5ca681060f2a202ec976140dcaf5ac84c714164f1274470ae7eb5130ecaa05218256b040c128a7154e9a9e0ca7113c9e70691f2d39756898283c9c80c8b3a629869b409ef95391425091094f8e9429358acc124e5152688d89516396e0a1049306f98ba3c93c7824e1491d41339784e0818463cc2456902f0bc152f9a898db4a6368887dd181c711ba2cf9ac547c7c26cdb9808711da0d310999498589200b108d1a37681c598147119a4b9dacb3494a2106dd83086ddcdc1b21e5e4d6da09ca093c86d05cfc7f5c8b39e93caa2f900a0c32019b8d139ce010e021842e27ed329d7313fa241e4168749e6769a920ba3af30042a743458bf4b936f9952dd490081e3fe8cd54f9ff785411ba0fbad6aaac494f452bb5076d94a04bccec8b96c983469be766c7df3c229576d096fc2443a5b21cacd341ef39b96628f14f328272d0abe9fca4df73cc31f6386862576ef9a0757216dda04d195376ccf8c58bdba0ed9493f809f978d4a00bda17945bcc038e2aa854f1241251281288c3c16014430164b66e01e31308001038200cc6a2b1609ae7daf80114000450281a423230161e281a14161a168d84a1502018120602e14028200a8443e18020cdf32ded014d4c28059208bdc5c19429d50a97effe23cd1f04452d2b7f00b7bacefb753b8d80ed8d0fb0a9989d231eeee4a6f7fde7ae7356f756c930ce4781763302e899078290fc0a09e95d4e4afe8d709cfd74bf2ed1c03ee68192544be6c069321038992262250eaab6a277a832184e2e722b4c29f6156a900af1a300ea6ec684c61418215ff072e4789b55b5d5425bdde6e6e931a3403627772f54d3bb85489b219b345b9e1efe0b7e62abcf296b7a255a639e859bd2a836e1cd01c03fa7a565293011111c00a8d2783b19a8f926b3681ac14111a128c2357bfe8683bc872384e930231d8ac6e66e31b61642688b30cbf1b934446d753f9fe4a44ec493097b319395c9b8061dc7d81664ec43c3bea25708fdd88a60d1dec6983190491164a9b5b8bbb039638e5959eaca0455269d4f8cf22846650909464763b1b600f84f1b8258d0bba67c76a81452c3a68ec52f738cf7a8b3949fc21dd178c4572b4da66655b19d22a9ba14e4959331178033c8aa1a48247177e0b7b2f38a22ccc8e7be638fe6a399696f91b2a0731f96bc89728b29596b02acf72a47417a2bc15ce9aac71437024497d48a05f4148eeae528310c72c02877dd0f7cb4aeca46d461545316288674baa63c5a962d682c4cae92a26eb3a833ebaee7c72d75bfc7a0459dd03fe6ff8add3ab57e49b17be0dd6da507d48071051ecace84da3ae0b8536cee00d18c69a30f659aebcbd9ee4a77fcf9034ec9b503dec624cfea604754d5d7eec11e73834c1c1078a44176f1940971114abfeb9329bc5dac7cb17ddac1406b51324b4a7660ac9a81147b7261e20a7fa901d89b0ce485d5931a305bf79d88a5ec40274e08ebb083571f3650607edf48f80b9c947315c094a0eaf1321240c00c9d77474c37417c95dfbec3d8b1d5b021248ccca78f19a67f49b23e8386d65f75d8defb314d510b1f4cfb461e97215a2323c5519123bfce2bf6bf2a10eb18229955c8f9c859ef95604d883404d111374e52b237be4d97243454aaec6a27eeb7ca3a7997eeffab2c07923b030c0e8780fb8bb6c831f2d01b3b0c8575569e60c953947dc39aab81ef28c39ffaccdcc9f6d3da6854c11a7c985225a3347145c6c57616c23b0b178640563fa55c7a210d62d3a1a5c71b667739a182dc25570191190b46b74462f87ad84a62e64708fef97e3530961dcd0325548a2c15dbd6de778faea87fe487db7ac331ee56e48d95e12aa0da2476b160b0087f42fd12678a57bbea824f8ff02d73890858640015b32fa83a806b080453947a023e0b1c3e6102c6e5bfb7833e4631429f30fc31f2c2949c378295d68bbafa35f343b79fdbd49598a79b2b63ed0687499a9c4f6f98b112721243ed249ec6e3cdb0359a7808c7e046bff4c0380520e4b9d15be945f71abf02b7b766868dc336341bcd987fb153c3f340fe6935ba0ce709837a00d15cff0785c0e97c0c64a601024595a4f0c3b056e8839e2198efadcc8af6075ad55d53a8035ff6958407cc20c67d21a3f8b947223d2a51077b7da99d19a0150ccbd96656f2481b0260db42fa7e506a3c4cd8dccc8084fb7d80b0b58880a33c41477af664281da5318538a8760058d322ca2aa7727f90c27d201d7d9d602169e64b8d0b689e448c8ade63293dfec39b5a640e0db52e76b72c3bb24ba3499d96d7e155e11244ffabf41a92de23553b51b37d01ee7921d72a91c044aee5438207adb60fc9260b475155773e976900d2224c497223a572dc621a65a6311b2e26ab4bb3d150bc285a6d26e268670c3a4a24dc08687262bd08db41034af769e66ae79510373cd17b7885ec7cdeea31d1e2369741c8f7827175decd368ddf05c1987167d96bcd2d73611585421be7a01e8bde8b398e578d30d1d5f4ae0e49fb1dc1008c554daf87efbafb897a32f2e8e5853a205d45923b62e65c4c1456b5ea73bfdacbe39f45625375578774902c71443f53e4f84a6cd1ee2a9bc601cfd2c8ffef63527b60253ab0a6d06da6ca70c1547ed91e4cbe171ddd0cd54f6200456943398a889161fc15ca010d3eb3227181403f6535c9c073345967492c2a98b47fa76b846b1e81f763bd614035f8629b414469484c84e7a0cc9f7bb349df14b88b5480eda425626a89358e7957d22d2b22d7b0a417d9b223cf07e253ae272bc60e047528781cfe68d2590aa7da8171e175023c4a8cbdf65d8e884399480ce9b3b3083cfb5d5666691b55f446b01b56cf4302d001a8c5e853909231a5e54bf762041e4e0fea498741c2f93130d2293704ce636d11c860b31b3bea9684774a4a5671243590c6c939e15c7ace2cac7a5c51a6c02c35b598bc6819856aeaa97aa4d9231185dbbe38d2deac25633ecc18a655ac15274a67ced2064eeccd0544c1bba7ead86312589541223107c3e99d2dce30fc6b9498bc26fb49786640c90b70a4c7344a5c9292bd3bc26956918a5f72d4cd86a282d6e1449cecf5dec49922d5b9a3db5d26c1d5a658dc65c0557bf583e9da67f63966b226006e16a8a5ec2da3cff31cd1f7490af92a71aa41b0d79e8830134ea167d80ff42b41bf8df502d41cf411b46fb1dc15d7ed30f00922ad75e1d19459ddb6ac098d9f67e9c45f7469b6c5ae80218c37818a23a1cf1f598cd5c0dca5245723f2d139cefc3a291f3d05db9bdb1dbe38b291bd4e824829225b820536442c328f072f8aaabf19d2e19416c536c9a5421593c336dec00b7e5e923aea1855fbc17bbc64d1fd8647b0c2009fa0a85e9b46fd5af78093cf886908788ba225eec5bb5c45368165882c1a82abb94744a67d2af8b61259c310ba3969b27e0a00e8e7822cac3a4db19a5a84877cffe613bb549d46ba7c8579b3d66534d5ea60e2c9a7719201b860e9e352fb53bd88ef399f5ac2986d8cb79d8af08120eebf99cded9a2be0e49d59df2f02917da4644981f86af84bfe02ea293da2e8996bd7c0a0b2cb9e867e6307f47bfdf9318cde8302e8160df78367b20a32131b37094ad43da354b5c2dca86fa9b7fd51c1e616f97dd86d731968ecb5a30e904fe7947fe6eb5ff9d940eba70de61c529c9ae0942286512aa97d679ac6b640880a205ec633cf7296c61028f36c103e8ada2c518b9d2a0b8d6e25fa3ee824bd1894e6696760048d6c1893e1020808b682eed6c01b4865a948d4bdb976c5b31b84c33a41fb453fb8b02e8c05b0604730473e72b292051fc251c1f4b30171a53880089efd4243d7c006c0974b42263d6ffeb88976691617ba169b7f9ecf6b717c1bf58a81c08100904321950f7211239b3e8a3b712be9faa8c6e3874f1b011bf94f269135df43806b965185ac21dd1f1a48ec763a0d7a6634e82e59231dfe440daec826a0f70574accf01caeeabc30dc74973a7d2e0d923fe8b5fe7d57c9c44ac7c4620a201ee1659a169a8ad0b0cb6052ccddc60aa9f7d677f0f2c729b960935791eec22aee741d8960099ff5880a4ff304f2b1e95912140a8d9aacc7a255cd02f662f7c08c976700cce44aa027fe5dc42f0708c73930b93563e8f699e56cfbcd2e38d2d8b4870058fe49ec59cd3a88246b27b272e18ed17b01262ec99f9bbb828baa1140f38790c663f904f2036601a0a28c41bb5273f70b2ae81c29a52ef7523b9139427201505ab893af07c01f627327dbb2b11e3b52af9218b227ef80b3fcb4340e1057e779b9d34d27c5554374cb3729bbd051eb445978043f157e76412cb192b54654e8708f8e837d6ff6f332bc62ef83df63489d89144995e4c6d3b43c91422e2bb6a2224075910f7805d4303a7f55fa98196f4fd6ca2550cc6b06cec1dd241fa47321ff161bb42bd0a89fe708986cc0e084276fec543617c9545927c539ecd2c012e31f63c360d644aa5ea2c50fe723e01863fbfc04b205593c800f77ba7e59b7081c08b87caf55191d010cc4272db1583b57ffc34f088d4ba677cd4d92284498967a18ed3efcc03817626cbbcc75129812be18782c005de39df04c23f5cf9d938109498d1b76df16451024efbd3dbf6666495fd20b1eb36f62ef8c13aec207009c2166db63611e29fcde02214ecfdd6b115ea68cadcb85c9ebd0258e8693cd3783a519579349a00acd880a307d00c7fc2789d3d94b12f4726978411ac1612a10b9a5d1c3ccb07fe9902ab7e6cdff6f953865cf777f589b9141305c2d75cce2d7b2efd88e36dbbe2303216d0a2eaebd6b01943d4e82b05a05f00f71b0a0be33874e06d2c071e5faa78525f8e9162cab89d4d3f68a6129ac0078757eef3820d8c0dc585c0828a9cdf6c8a7595e837190d12c3dd52d797eb0260758d7155f6cd5e2a26ece366139f277a315ce956a6fbc91341e3ee0ae822311e1b17efa3d1191d9d4b57d59587dfd0822342fa4640fa20b9eae77445ad54e048ce06197ff154c8ca1caa8e6749770ba2ab211ae5795e37796fd3f544cf942bdf236fe9f436adc56950145b736cf44a00a000a03e0980d10757216055d8ac92b2f9956a3cc9077f5db1e61dfb6dec39c7d368b5f199d45602fde49873b7759af28e020684679a79c077457d2816cc4d792e3f35573263bbc35d78ea1d338749420eb1651d10156ad2de63184f905e7a05cc396fefa74d7f619462ef33fabc1f734f4d3dd7154d3057ffee5289f68a981b1bb44922f1301e708b730c1734918c0fe8e7d9831e8c5df3adf416119e5066a73ef05d0c122dac8ce8a67bc41d2aea61bb3f848cda0ab2fe75a1d0cd7d9bcb3c16979fac4bdc5f7e287778fb101c3a6808274adb9303813bba0fe7517d2810a84710c1909a20bc1524dd2b3ca2cb53efb242dd5981d8247ff31ca17a92640f911a776c17071328ff985909c1a886726413bd707883516fd3da0301647d04c4322f37e4508e09ca4716519eeb057548abc2878873105600eb6ee28f75e02049ba41688e80155c182f137453f459e2a89ea0a53557958a015c8efeba9c49f257d85d6a3ef270763c758af7c014791dee7d428ff77e77f2c6668a8199715fdeef3006dd285c794f33849a95d3f8fb559e6f37f3b423db5d60b50a00225c5e5478b204b905f73ceb07e615b98b96e3ae05c96f5ceb25daf0175313478eb2927a3cd969d36a38037d9805b4bc9b64e9ad420a51186fc7626a00591ac81c9912713fd6c099b067617f60884e99cf1a61c6fd8ea1f814a4d58f07f1ff54627c15a874c1e858ed5734429232ac41bab9b364ec6b48433082d8e15806712c61bb3897843d5d07e81a23be4d056093d972298d115909b3f0f057a005f4a7a01ebe045e82419ef3697d691d46a540ba9cfa0995729ac82b585019a02eeba4f27cec0c171d2d145f6c01acc21fd4322887e844f428740374327a16ba057d1efd0dbd878e3a694e970981e725a9ef57c920c5546d60fba37acd2923d41f50decf29a372734ac4e1d493826e12d740c343a7117a82c6c2e3e1878ad4a947aa50b20c0eb5d72c8cd90d617c4be44f8c66e3c585dcf5b1c62bb43c651f65abcecee5ad23141ed4208f6a73c23a7665518831d6e814865c8872e9055dd0ee8fb0f5c79c489434c7c7c34b20ca6484d4b335111da8517a4393dc0b10b8f9a77d2050bec687efd477b073f138957178de8d430dad758fcf3bcfa3d73e4cb360ae10287d4439bd13c4ad3e376f746f587e9d20d096076709fc89f68808bba849931c8847151c6729c79a65191d89cc41d4e63e16493685122ea219cc6bd94300e476e00f13bd4807c0b9403c60fbc1092b34832033e903e073195c060fd08c0f027214e013610fa02f40038d2407a4de61cc89342b2ea36226c163905cb0cb95c1e9a8552d368475d840cc89f1cbbb65d897ea9a89b0fb559e9d266be3e38e6edf95a1cad00b7ddca4d9dcdd26ebe466987e00755ed90dcee7b80e47bfee6646552581396d66e740c35824b1195372c2f11c9e03d69133411b1574661b875b3aca99cd8c994d31aebf6fe6024527042eb1f1d2465c36c46033ce9bb11ebc08c20f494c19d70dec6cce1864ad82536583f17b331b639e3796704245e7c263e30b0289e44172685f5b8b6881d66a7f9598421a16e74c70c206c21bd2d660ca1c81d04bbf64b73609c79c0a011e22b4871515744ec2fba6634703bc38030095711a7e5e13cf163d32c947c052b41220c7bc3a86d470af1b12a8b3b1b3c3e73bd12f3b354529c4075e0f8756bc6b1c266fa36eec03f437f62d87a141d0a1618f7c108423cb2dff619418a28c5282c1ebf2e1b38293b3d2519cf4ba94f6c720096b8c4fd5bb54c4af95d59107c439510e5414500334de00c805e72f25b322ee758c2037afcb80f55133156c3d00ed941ce144ebc4cd80f21307424ba07090d60f0891f31cfa7a2386ad0acf6b2f0ca1b577b55cb85c58fb10b1821a767433c2ca0d3bdfa6b39b1a89774eb4fbb23215c383e8d604acb487f9357ecc429a13c697b14e648f18f22294f567c1ecc6072429d1d06fbbb8bf3f21da1407e4b4c9bf88d661b05f81cace3a10e451f436bb3a856e4e3957efbb077645556c99c19ab6e14fa4d991a3ec4f68113130d22b2f1bcbdc3a893b307b407a30845206dd9a3c2599e9d845f72df3ff8453284028450a54703e6d240f1060f55856680fde378132c9b59e19d45cd306a4e1dfd76efeb44302fb564563c2fe6ceb08bdc14ea306df4fdc11e6d6b05b8d12e47040d20f1081b586fda350ee2944b740e79e4fa9945136e9c6124e9293e29429bce803e84ce58a49fd02f5dd4574b980797c6c3403cbed40b263f5addb5a139d59d6fe024bfaf0c8ab6c751e22504a32b0d520639c170bac3b5b37b01547f7813cf7601bafd2d6d2a129f538fd6a24307889ed0e46f3dea9ed83e5800d929f9c12997d02cbc110fa67d868e8d4cbe951768f9657ac892550ef3d7378247bfbbc47de60f38690b06846d33eb4084ad2e3e24de81de96df24d059ee96df21ef8fd36bc215c35b8d51b52bfc78ecadadef68501ca3ebd054f8b6e209d9722f63d5ac9b36eab9e4e4fceec3b058186a29ad78577b9b7a4efbbe144f0486f8bb784ef911135f1664328b6e1f4040fb8c7dd676fbe53a4cb0f0ffe1fb187d8c068de197ddb840c0c7f046f4fe474dbcec323a527bcbe856c5f5fff8487a3798ffab2fe8853afa3b734bf47cac52d95f5b0c0e158000f1dad3dfadfc3c38ab63a01b9faf635640266b67cfc4b98c6a6383fbc43feaf75d15b06898896dd0718d2484559c244b32e9f2b59ed5b21f3fc6f1855886f8d4dbcf9c420753fe5b66206860d35f8d15023872831b730ca5ebd980dc69bcb4d62b26739d4ce98d3d7dc8e87e6337e3a9fd1cd1da2a1a4a1bab39f0998e0779f9ffe9aa87bf949b6045017ad655bd24e6843dbb7b6a79b52dd38020a39199e07587927f39300a5736e3d151c77945eacbfd42ee56f8e227f0932261c23d180124d29635a3f7e1664612910b836d3628a48e7f61916aac9ec39b56a1bdc25f55e7ac1a259a104b140063e508423a5bc64d13b17994464196a5f65933e599f8febcca45470569f1f857a34a672ced48851c61b2be3884626939f0c7feb66f6d642da3bccfde069d142b860be49d5ac34b4bdc6a11b13dc75cfd2ef4d1f5851ef0b2dd860eee674f528650b2ded76e3576d36213da756f6c6731fd8f5d310a650f7e4cf4bd897b63cc98271a235374c92e58e7e723069c89194cbe2c15332d0c5cc9cb6018374c5144f04ae7f30c998a6a70876bca7f6578e72611e286b34d8452c2533d0fd9f0198eff3f84ba8dcb54ec5186da290bb63a4fbbb0f38e1ee13fae7b34766a8f5675cdc18a18e650506281deb70a9e401424ccb6c657d64ba3bfb2b476aa25eea7426768d16b70652b4e268e8d08d072d794d8cc73da45d9827e2a68dc33e6efb7cbbe3059a2fa750c16dff88ba259eca90fa023750826712d01aeae1ac07780daf02664db79e3113b4602982a9a266bb973645af40a658455ba4416e96cab75e8e81369062e1a457e37cfbb6c340c4234c16d5fca57e31d8b8db1b1eff5d866545deea1ffc43336ed01f0491a081076f33f993709b961a7b69525ad1483217aae28d8b8648592ad15a9cb48d597f8341a1630c16af1f1f6c8dd227eacefb4bedcba58cd31672594e4ce7c1cb99d261ebc26d0f1ba9492797a46c418366a98bdd7cd69c7cb6a2ddf176b44c08c466e2ecf9508ace6efbf1c4156e68a26135e2b0c0c8247a49c7d9524535eeeb45319d93c9a1296607471600d9c5bf010ff1fd20cd8bf97079e944b2111022237c545c4ecbe34720dd27a38d9041f7c002c5dc317d3882cd5f507600cabc6999cdccd5390f8da68e42a4472cbec64439325ddafbc521e67f50812818880ee3d3c7b87f5ba9503223058c801488117887bd78f4f12f37116534413b241fc4019feab572b4bef6c8e0339866e220d48b2ad5b1d9348c232c1df8452772263ce043f1a31fb0a65e73a845e625e4e8324d5eba0fe56c9fcd07b17c0c1c65d44a1789ffb83087e52f82ab2e010801f4da8df7d725610bc21edf2072b59786c27e1f223c7e93fe4623f9e25ff3805c315a66f663bfef04b62a62c3422c5d30be0a2ae3bfa1f2b574db0bc5af809ecfbaf545bca074025a7df05b7835c77d7b5c8ad80043c89506491a10f4a5ef21992e6b2da97be36705c30e39fc5c01b305e298803c684445fd01588867e0c5f77a41539b5189e4e3faf8a8cccf50424eb4dd63922a8d6adbdbf8ed0f5f2609a92edaf772aff922108bd470b3f104a9c318d2fd1a206b9414c02c14bbd028dd8786844e4c38de398181de1649a7002196d63109c7b216275a913d123f6c5c1497d50fceec07db5d9ac3dbad5ab93967270588d67088203f604dd417a05a0812307168a9cfa0e89ba21ce49f41a48e8e2203d0c6490b5a9a97a4011e3603e30ad4d9dbfb2a2f9b4b83213e060102e215486383ab32f21d1e4640c6550c88881bfb008ecd2f4cfe04e17aa58c4719f80d5a519b45e24f08d15be8a0a7259ce5964edcb3f2b167b1053b4fcdaa682f9004dd2d1e59850c4d2eed4044de36c984080aaa87ca33ae729321f244d94b6841084b0b74cbe69438a050fdd711f43ed8524516c8481cc9838e1e41a33ee74c4efb888345872804c54f7ecc45a3b719cf289920b758126a4573b435570d049823ac429c00a2358ca2193a4a2a3bf276b06832bb7a40a85115c5ace2c1bdfb18fb45bf1c948b365fd6a547461c3c56fa871aa93d669fb51b271bb8bfee97cbfa5f0f81c3334120db24c8b716cda8c24b3616fff79f24429de5651a6aa9734a40077db8b106529de7a9b573e1c81c67da8c5452a402f02c976705345e1a929d684b9384e992c3876d0dd54f917256ee6b87f3b254537c903cae341e800db55831122a19872b2bb4d308245be8bd2141aeb7f3b97b49ef90987c6cfa07f8f0073ec9bf0b10d1212f47eb64deef0a245ab31c523e3cc8b2b110bcc97e9a8444ec9355582efc2375890e9be81045309ce44ae542925fb3a1ba397d864b1d09e45eb85074c74bf47a034c1077249ee811e611684e046474d899949446f622d875680a39043624724514b2e7c20a8ffe061d285c44e21324de580185d00b24dbe26dc0057b53317e6824dbb516d9a6d954012b451be060a24262eaf4a2418eae39b30edb82b1ecacc6a69bf54ddfa80168c394f29293881a25111d232ef2fb92d1cf9bbd8c7533486b711ce4a47056052183473d7a556b1283c7e465a46466b969546b6c88f8fb4095fe8d08676429e1c460cc8e4aae7a8526b4750b5f7a3c5b6c797c08fc76240241ec97a9dcfda1c567d2fae486097343ae0811084b03f67d4917fec99635565607248be373932ec09915ce3a4d870831ed2c59b530b0d05b46e91cd20322c50fe9f2f7ff99e16c1a8ea63f1b6e135f74763d348456ce68373af0794c75c2e580674b9be55c56529b3e587148b57312346f8316078773f91c7d0db01e1ac6e04e7cb2bc6878a58759c1fc9763142a5f5116fb42556fe89702f8a39fb4c68708c4991731b560acdea7b0d1632ccefc78c0119ac295b0234ee37bd1c07a9d966ef9c07283f386a1fa452e570132d84060ca38ca077e9af325aa6adfa1470049df2c6275a4ede753b32243f931a0b537d7ed11bd9149f27049c1a1e6cd6c55d8839da9de6799314b78479988d9aff3fb803ec87a6354c73f44c8f8fb760887fd4dce6b55aae20d466761230205edd3f4af0ae687e1de5cb1952d2905ae556c69bc5335881df67245c853bfe03bb1ec287e17854f2fa3a0f348e2e93ced8c3742352dcdba42d035b77a1dffa984c1bcfe57a56a8beb05344bda1664b17af205004672a00f3587f8ceb46241998098abdec53112db581f9752041ce10a29ed60fcf6a023a64b6eaa534a894c01f0c3e0d2e624de11a847b5b88624535bebbcdafc583f53a086a6030f4acb292908075079564dbe1bf7ae36935f062d2703381aa8b42e526b61c8d665d15a394f3373e460c8efb3e12641ad22258a88648679232741ae7d52e3682ed1adbe47e2a83910625957a49397297aa6d8a4f4d84cb097e27dba1bd3302745a765d937a4da111b729516d7089f5650f20a43a0d0f4de0d8a64e811ef5df72f158ff25c79358bbb1f99b6b00b2d876a8e21285dfaa232ce4515de0db49ec83d0282e224f830850a61f64644b69e833f4de51bde2742fa168ee37acf62cc3ab0285d3fe45ec0cd30b75b820fd2ea51fbb3db17b766f574b4e5c1e82ecedc7eb87c9c592368043e1e582916c9177ad37b806ca20ac36143526b888a9753889327a62384f9dad3628a4f27bacd3268917b5642229d462a05cc1c254ed71c2a83caa9063882d8428e6a6ea929a6ff07d07b372f00c9e63079ff1211218d537896948c08b04c070d81fc4a3b20f1b66ab9e800eaa1fb36e7123a38b50d2ed68e61e42c9df70cf61f5b1a28c6522c40e5f6a0cd3364d2b50dffb721dca0590fa13e57c5420532b2a6230e810d58be0e740324fb3938ca981e7dfd7b08f2fd169056853e1c8473a001e8ee79b3a988467d9eaf470f30ee073d6cbe78c648b15b832072d1d86e3d1b8e4b7793f651f68b579d262d86c94a69ef40036f452d6d4c6e1be66acef5fa5d4a7027a353d5eadaea9ceeda0dac2e091533284d71ce09dc4bb582259a3c39aeb0539c1fff5e114daed2e7ef0344a0d36f2d56ef4a09d3de3ca2ac850d0f46eab747daf772dbbd278fd266ef2cf948b1f8e2481344beb07d08dbd764df52c55f758f4f55f46aa30aa8b3d33efb75eb9d920cc10eda40110e26682fb9a9a1365ebd141f735ea688a5da50a5c61afd22eb4077c34bc7d0905d5117d608c8720c5369f5267d6dc0bee2fcae1b2d8f675a871835e6108edcee7a1dd8640b23d68d12814cd5141313638ce1400f6f28803e21b221d1f94fa0db278d8d3c2b04da8418c9ed3e129cc2a8b564b71c0326ef0e4098162d1f4e4545252aa9545c2a787a8112d17b9724875574a43dae6910d84ac07d2ca945c63179bab7f3003f14dff149d7336d054bb816fcb5b983592d14b6e05ceeb05a7f06a9ff963d8ce93174be7509bffce571838e429410637bb20a7385022f8cd4e281c8eb2d29ef9265c0d31c9ad74af3bb55cd898a9e071475704c0822dfdca383588ddc62c83ef2001b66b9be8928d0b278d33f9172d764652a7cb3f8034ae10709f04eaadda8ac239ea4292190c7a81bc01b70a98c0b29a6d2ca08e072d4fddaadbf2e274866077c42beafc77b95aa781d295d5ce126499f1a715bb3cdcc8f1fee9c7dcc5f79d26ae43d386dcc818a8909f334030799302a1656c44994042a4ef18b682c73f73a7764817af24891aa2fb2303cff148ba447e6ae57008984089470463b3a0c383b4e73a9e055141b1e95eb6a67c918062a851cfe2d1d954a56bfcf45263283062623974b41b9f8c17607e03accae7c2d4331316268ef094963f4c7ecd7d81f7a18ecdb3047b274acf88decc0c05dc02025dc089993aba36689b636483cc2075c915e9333923ca9ce17d3e78b8bc21fd8bcaf81ca033b52c602887154149ae650b98d3e298bdee8b656c0b2094f9bbd2d482a9154140a6cbb58afd3827d43a69762adbcaf792761981f938e59a44878b06fb42996b15e6b1a05d8a221a07860c29ee50c2ca225b525d08d1b9c915f0c4ad6030e0614bcb2030e982f2ef37fab8fda2577ec0480c5de7c85d36e0a66aee7c13559f6309ef05900450b6cbccc1307c80ee10a416bba058e7e96a5023f7e3043279eb4845dc07d1a5e74006c670d017840fbe2d6783631cafe190f258b4469e47db0310794d58ce22c97217ee0bb8a6a137f8d4ae847d028ae3ea38c7c674f5ee77e3693e988c717a9bb792aab668651e54cce75dfa7e551b480b8884c8a1b243264be9c6382acf8e6be702f7e74253c13af4a139dfdd5d6e0836c3ac273b3d56ed040927c68ac04c76f3a92a61791b27bdc23407a314e425305c5f44803f822d2b23dcffd77008198cbae71d86b5dd2224cf86c834d164bc13a9df48687020cc192188d205fe2054a2bf3f015e52d230a30365f0270d6b412ade95e4f90035993ca0403854fe95da9038a3dea7cdb7174d45fffcee568cee5140d48fd445045b86cf44cee28a82135f424a192f2270214aa50ae3e9544f16c367e24a4bb8ff2f7a080b03c544370861f8bd341613ffba13ca77ac4ba070648dd880e2d0cc76a01d6b507638c38dd534cd8e91fdcf651bfa3be684f24c42bdad2b96e01ea3c60af29221dd80cbf60047cdbcf774cd997929e6221bc9016740d9415cea7328c5043074ad77d57034bf3b6e40393bde00299948d2adcd0f5806376c5fb183a4f6fc2df600b51b483c9cb6cb5aea7730781531efc0b52d39fee679d09fb31b2602516b2d4ef05ac53def9be53b892744430ac14d8f83799e2c6879482c0d561143d7e264405c16737b367afca3cec61e65fc81a8318a3ad3646250bbce25d219728629a9b7174533f021baefbadfb7b0cf35e6de9c043ef655289a140fa607834c43bbf23a080014cd4ac2662b801ea814053e679d24a54f9aa6bfbdcf1c98638fe2da9483fe8388e024ff563752d0abd2cd43c6a9b51b64a0b7bae4da95ae2667eb0b5449ca4a34113e87a84397dbb306b0971405c0a0e83b47cab9ccd80a81e534c03bd323db32385b23556142aa1eddf361a0c29fcc6cb3c2adc73470a3e8d9b36455c684061d12318ea7b557348136e9a1e6353664605e034d7a8d158a86327ec07c85e57c25225997f2b7546a9c4228a73163e2d237f40b5a81b46b29aca51a633a6346be0a29b32f5474ad6d1a8370a51e8e60f7d80019461c906feb045802ba06ac6e5b2c0b2d2ce94edeab65db484d783a00166e3e393f2671b5080926f42e3f2c2a60812d30f88e1001e40e89c3b0a4b6b83ffc75c3e6d93b0d692b89e911eda09045d72688f01b8f549c421727d4a4fee547b03a98cd4a7919cf2459d5d22834428570b99b919e655daff69e79ad6eee5cb7d1c140baeafc5e4fd40d573c04c6cd60cb7220c7e1d7060763168bc1c94da67411cbe3c271b1f87f0dbd9fedea1dcafd3af6d1768dcad4ebfffefc83ee9bec6dc9becc77ea48bf5ae4bde1b9cb4a049472962de2da468db7fa96cc401456b8036d4310f4f26bf060d7f958ffdeb968edbf16008e0c0c31504bd557466d8cb4a3d721658b7496c3494527194e509c35b4652c3b2940f4f35fe4c9ba48100ecbd3ae0e81e1b384c736c7392b8a6c5c0cb23d9974a50d6d5ed82b32f9a73b67bd05044619003faba31e5390d05d1059ea20910ed37ee405e279554a3f9b285e5cca3416ccce812f458d84656d8dddb0eebf0042131ed58e3f330c4a11bf42512919b5412a0e65168721aa701b68c535a3ca5a307134228ea2656faef3bc5b6448f94f127133c8cd59d8740bba45f8dc568064d1a7b3bd59a189edbc99c6a861d275b13fc796f2a04bd3db424f01a34306811e0542346ab30ec23543d481394205871eb0990b7822706fbe70e363cf121a620ca00f9f06e1801c30ac9fd43633b06fa537d856d092e4072874941c820e787157dd47473233824706ad74c61c903aae5207ef915fcbfb8cc42eca37f18ab46208d3107671056229b50c072ae16dc483641cd83c67243d4cc34ea35434960ac115c08214df86f14751f2b48766c8270316f494c812eac402f45cfe2e0b819176c603f74ed60ce94e582c0077956c72e6b6de865f9c1dd1d11aeb338fc7184f19310e37055eb56619ae9655a06be2c53f93a9858871387b31e3268693088fd901684c005fb64593eff8aab07b89d9585ab72c21c11c086d35b77a19a59ab571438182c14e40c4a0e906d8accd1964b496306f26fd8a30aa33d4ea1b691b6688737c0024598069460c81f57079d7e77d3aff22d182ac4dbde706dc2574d10d2b2f164cec19281bab9630632a335508150b075be20c41a5e185e02cb1c335023044c029ee184e00b2f80b4940ef030c30c33cc30c30c33ccc06cb7579495128451152e0312015352a6dd125c245754fd27a154ff49281425f00b950bc20b34ee7c61913589cafb7731f7c27a31ccc1a6d88565a44e32e45c58ee5374a764681d735b582fcfae84445d0c4f0b6bef25fb8839437a9785a5ea53c8e83e641a87856557a2575843c63132526e9c636685b5fe3253a82c69945561ab8cd820ef4e6359a8b0c747e3b029ac1a2a657c5629e4ae4861e9e839e6a8f19ba3b0ddc73cace90a01a0b087a8e7a7127d4d2785004f584472689ade0c31430a019cb08898245d8fdbd1914280262c9d53ce251117212185004c58c2b233786cd0e82285004bd863d2bc29f24a58721e480c2149fc38095ba3ffcd2712d6fec760f3378e907d35bc98792a46584eb6cebc3243d4a914614fdda1d13344d8d4c7fad7eaa19743d8fb5264f28b091f85b05ab41875c3444993206c35bf11723b26b1a80061ed9bcb3e499d92ffc18e3a998afd379cb80fd624c95175be49b17bb0a54721797aee28270ff628996156fd0ef6b9b49a8ed7c1162d432635cbd09c1cecf72027bdbd9c1fe260bf18ab4ff3da87ee066bce5849890e016c60680aab71bcd762d5b4996366171ac769b1af75cc1b34e420293e8bed628afa84ef9c435c164b0ce1f5f3f058ec19a49fa49d69d786c516aa327a101b0db27ec566f951ce9b3a58feaed8b6bce681a54f9a5bb18a6518374164cb32acd8e6427752e3556cd760f2814555b148d294d365998acd1afc5e4e65323ea26253f3b5e8f9d13f8da7d8d3c678f7bd8f52064db16679e5b0f152ec0d2d37aa7f756e48b1f7ee8794b4e162f046b1a3c929a530d9daa828160939458a8f9042ca42b1f8d759aa7a460f03c5da20a5507339d2fd8945bb437268103723c513eb754a9fa5fd08e14eec30f6b266423da4e2c43e950ef4b33e34bf89ade185d43f67febb26d6e935136ba86ac8f01a9858aeb222ce7e89c55104d18a2db10499587ff93f460b914aacf1cc1a672a9f129bc487aa506a12f9492cd270c3aa28893dcba4e73abf3e8cc4d6319286f790d82fe4896097aa62fd2316499ffb1be638627f14bdb39e22ae7a1ab19edc4fccf9a39b1e462cba1226690699c65fc4965639428a22168978f4dd592b7d22b6b30a0da253a483882588ce349075349f436c1f72b206315c8edb104b4e6b9091e6ad8585d84263a88ba39d738a13624b195dc71cd383d852ba0679b720f64eda37957655431d88f557463353aed4a401c45ab9e5a75ec99265feb0c599258fbe212eef8735e5904fdd93cec3dc873d478b631e974358980f7b48c9df9df3b318ddc36a36dd208aa3fba8ea61fd34b98ad166cecfc35ae9ee573b63321d0f9bd704d5bdee90e33becc82f439cb4633da61d969ecf78c3f7442e598755e5632d787f2615e9b0e69fc78b328df18673d8fff6827cf88fc92387a57245eb60bb32f1386c579ef13ef9850fc361f910f37dfadeb09a8feae7a98e879c1b7614e33a1e8fb561b1f58ad9a4b161cf1cc3fa3a7c246159c336913244e96ccaa5a861d5307b0f1c250d6b9ca87955e3374d081af6f4b0ecd279e6869f61877d294d7327b39819f6924ab95f9f2eabcab06588b1953ea6f893618f667fb9e518c3f1ee16c37ae23075e7af8b7f18d6d03531a71a0c6b6ad8d48d527d613f9bf1ad3069df5179618dc9ee269c84c61855177618152665c79daba8b8b0c40e12bb31b88525358c4c9afedcdc6b619f1c73ee45f67ef65958c26c2cf53b1af6070b4bd49a448fd593972b6c1a6f2ef66185a5c74a3cdc36ce5761df8fc6f9b6f306091516f5245f69a229acaba97b12b614d690a931ec694631d75158ba92758c56e5183514b6fb90248314ead2cd4fd83ad766387a9fb5b213d695fc93379d4ddab8097b909c9212d5e3673013b670b8e1c42ae5145dc2be9f362773a4d45309ab4c88e88cd4242c0e5356d49d11f51409ebdc656810f6738ee9119664a271423ef5a0a91196cf60f22b2dc2f29fb6fea2335a4389b0a6e8f57be193c73c8425650ed14f2339e852085b4dec5c2995535e32086b5768e3918d2155202c13324c5c929ca1037fb06a7f486eb08fe4401f6ce171e7e7c369d07ab0c74f9a94373956c68325641c5a3f9dc1566e078b9fa49a902a22a64e07abd7e97dfc2d075b9dd5f7e66e9ad20680833d2c7ce876dc9861ca006eb0c9aa4ce4143a645819800dd6f239df894a2d165d8f8d6326b4583686ccc9633266b1c5fbb160510d592c9e43a50f31331e5d2316fb799a5cb4062c76589aca53f414a7d578c5963bf6178e57ff1cc3156b086962baffbe7cd168c50e2c6d8c9a9311e267c56ad213bf3b7cbeea57b1660c1723e29add7d54b18e45a42499f7613da9d81ff9fa7aa894b27250b18d68fda4cfbcdf38a7582c4b233490109677536cb33926ae3e8275bc144b5a7d06b939b6344e8afda3aac3eeb164e91ec53ad23026c57d28668b62a9e48f23444c89b909c592e591e976cb51cc80624f6311b52b74b0cc7c624f72f126f2cadcce9e5882d8cf568ec989dc891d389c0861232c82cc892d74ed6aae0a7f5d6e62c71191423fce983ea889352f87ef1c25754dccc48e92c58c3cc39ff59858533fd77adc28b6b9c49a3211f385c409de5962bbd3b4a039c6abc95562c997ce3b58d4f1c851623d0f4b1a376199ba496c31431c4958cfe44b629dd4ba4c4562fb7e743d69fa2787c422a13c74e6fc31a61fb146bd2c5feb384975c476396f98031bb15e0abb9bcd18b176bacd9b54cb3cb1456c8e2bda8a4711abd6d6df89c6675a12b1c7c7e12f45828865f5ccd4d18758266da428c9434ad0104b0841ab22a6a4b25521b68dab9ba2e6343b1521f60a1e257a4ed91007b16ec70e6fe829ef13c4b1d285ff4a20b614d7642c84cffd1880d8eb6a73f034918b3fac562973d6c43d188918e0c20f8b84db5331e910f7d387b52f7e08ab111927933db8e0c3a219544ad0f01135c65cec61471fa79ecf631e5d7c70a1871de8c7e025f7512d997f7091873572e65ffd44925013778187b5f45369af7d5cdc61b9897c141a3d044810002bb8b0c3be717ed36158f0dc74012eeab0c6895e556eae022ee8b084ff9fc6f8b0392c5f391f83f4d1b51d59960af80414702187e52eb482c7182a828b386cd3c8e36f44f7e4c75cc0619bb4493fe49cbc610719578a5be9dff80d372c7962c5a60ea3ba5eb7611d5dad7c9681aca40c1b96d988df39aec3f4399a12a02004ea031785740c3488cd986ad853f490f318ff7f3c4ac9818b342cd6b1236f326858268c7ac65831d2aaa736707186358711b9dc591391a10112b08027806986654b7e26c3ac2e6778199614e22ec5314a5d9923c3b2b1c6735dda8f929b8b31ac198544d565a5df3ce9e32980c0f11458406934c08518f68cabc369bedd45188802d2b800c3ea7132467135a6cea4b8f8c25e6be65931784a19243d602170e185f56f33928d24cd18f32eac1d255aaaadd9bd54920eb8e0c2aa0fc47365878cf7825bd8631c45de1472faa4980b2d6ce621c2aa2468dd45cd14e0220be4cca99286f419982420010b98043448c002264121010b9804a5062eb0a02eae80c4de8a1fc92f480a5080145c5881727c198564450609b0880b24900102d470838b2aa46b67b1117d16b8a0c21617f2511b1c835b0909501f708120b898c276397e672e7c296c19fd3932cb65e9d7f303175150248518b7c6c22e37257001853d7cf091903c3de1ecd3cd702f76c2d611677384ac09450c93ea1cc5c62c2270c1841dad2479e8977e3c1e2e96b0a79c3154b48d95b04acab8bf903e797a92b0fec5489f92679063a628c10512168777f1b71d4cfa4147d8634b2df5ac678455eb9257ea9c9f23f9e6a2084bca289b3ccfe6a14858c00226174458c3ad8784e93f84ad574f7eef2e6584bc10d6d31444522e0ac21e6b7a494d62fc6d18109691ab4e261d234770f183356236d776868f1e8710e2c2076b74908e51f8a85170d183bd26ff983a7868a13d0fb64719c32dcd0e96ac4e21c54cab32ce91004742c1850e96289d55d13ef85c485ce4403fcfc1244ee7689e708183356a8e6d90fc3925c79300c759810a42d00217a4e09ca0042d2072061737583b323a4d2ca433fa63706183d53f48c9cee65f4d0a5a5002a8c572d1761be5f0328d8a167b9f5ec8c818f7045343a00217cc6293f960255a8f52c89d8215a80064b184280db9f303ebda42a00217a4600523388cc516524c49f6c1a466947356f00280c5621dbf4f4ea39a7d4e0201bc620fc9b721018e12b86239aba84953f45535c909a0159ba7cc9b83940247810b8a0058b16378f1ff22af588ae5a1809238cad4997254ec3858665db20b299e62ab3cc7e1fc633a889b628f982cc4e6af7c0e2fc536c92e3dacc8733c2996dcef591fcf57fb28b69c4be5a79671cc45b184fc8612d2a1d8462aff6ede550941b1e4cce49dad3fb1c34e0de3133aa44a7b62c92921333adc893d2722e4e306ba29cc89d553561e2fbba8066f623991b44b3712724635b1e7ff358e13d2624433b175e694f61bf5a410c5c42665969116b17de625d6b98cd42497d51869893d644489c3989629566295f9b83719ee841129b196696c64df8d2c8793582d5de84f158ffb25b16546ce7c5717b647629b3ed97f1483c48eea2fc98a75d8658f58ad4a32dedf8c1e64a948ca30a79c2e8dd8614c1afb415fca97c2887d1ae6fd141ca54e9545ec1d19abe520e5bc13456cb5791b36ce29224312b15ee6df6e79a6e80822b6ff0c534638afa89143ec1f1e7e3436764a8821f6db7850f3407e2d5288fd63fa09dd4e41bb22c4f213ac4225bffcf031887562a7e5cf11e582c30862471fbda2e395c3354c20b634e1be37c5ccf3c900020f632924e490f9c39a4954c5ef320c32193f2c9e974f33eaf20a92e9c37a9126d433f80d15193eacb519cea2d457467d0f8b86f8a871a3d80d5d0f9b43c7c0e1fd597d9d87fd5277a42f1b0f3b48b9ae0c4fa25c7d871de8c544ed3471bb1d5607a142f80bfb7f9a3aac93e1a610267aecd3d0616b1c63648ea6984a338735d9c5a025a91c05590efb7648893f575e13c7619f7ab42395f3f446e1b0c5ba5cb3b5248fa26fd8337ae029d3acf9c70d6be50d8f3ddbb0a6cbc7f87250c975b2614996213af0b814d25cc31afde32447a31a96af304fdb99b9f397866d63d5e31083a6c40f0deb3fd89e1462ecc4cfb0979e86e7dbccb04fadcd496d9ca9ad0c46c889f969636458c33b226cd467e86c0cfbe40d1a272696268918b6f0e49f24ddc478240c7b8ab1be42a4e4d702c3be9ee773e3d7ebd51756297fb017f6cac9fc739a883938b80b7bc820327ac76b540de6c2521ba1c7dec29653ca9228a21a72b4b0af7c4e1b72cb73b2b0c4be502184df491a622c2cd7a0e1e752d194bfc27ac1d6cb22d3a3e05b61bd8c0fab18dd0e5661bbff99309afebf4285fd6364d3a138c8299fc23a3be161067ea91496463196a7f2e4688fc2728d337ca3f41002054239f4096be6ab8fdc8d13b69c62cab4fd2183946ec2127e928258cd843d8768214e928d8fb3842d75b4d0879f7186212579f8debb8c1a20093bcaed94b77398ccac06404212ad1ee585590d70842d8698c16495e6f5580d60842d34ecc7c44c4abdaa018ab023873134e5a4488eaa0188b0c5e73cf11f1fe65635c0108c88e13cc5a64258f5a224d9afb89dd220ecfb304cecbc68e549202cf62144c4e8ce9be70fc8d334e328f5c1ba39a5920c2c25d37ab067c74c6921a7c9c283d5f1578a118bd7a81d6c973b495fa54949a88325676d78e4b03a9c832dcab34266cf43fb70b05884d98db0016eb0f9ed59929463b20d60833d43680c571e634cd762d38994ae0e92ca365a6ce59579e26599876c16ebcaa6e4392d8ba56347326f701ba7120b4254585f7e082cb6890b3a9f24afd861e38c924c167a21ae587df36a4a6386dd542bf6524b29793566c619acd84ef4411ecd90f265ac62cb8892a531ca619e54156b8aba0d0d254dc5fa9dec33c61d31464851b18a5485b4611fa3fc2996865f9fb136c596418819220e6ce3538abd3603efa9f8197787147b4a8795cba8c46167145ccdc614c317c55227911c8552cb34144be48ee8f0bee35140a1e97c8ecce84face938c664ce78628f099330fed1f6d289553bc6ad1beb3c937262d308df08b12982a49b587208d1e8e2d4c49a8375f8ba485d6666625b75d8a3298989c51efd68a8d450c297d86ef5fb6c3b33382db17cee0fa9aa5436042bb1677aea483f25b69d1bbfd46f124b8c8f249608b183587d524b466295ce9a114df922e520b145c8a8543b95327dc41a21bf3ba9e57a9823d6b8fbf9444b571ba4116bd478e2386730624b79e3ab8d456cd5d1951eadc62f15b14de4470712652296cc172a55a5c1469488d8f14e0811f2432c0e7b67ce3ca59436c4a23a9b3af1d126b1105b0a676612cd43389e106b9e0693d2245fa906b137d0ccff1947108b6dc8d0f7e381d8bc37dcd56845e80d88bdcc32b4cfdf14eafec39ac14c7ed80f64663facfdd53d292d5a877dd8937d848fe9d3318e0f8b66a7682964f6b0a4e432558baccf8c1eb491cbe4614da1d632aec4491d0f5b4e8b14997285b9dc61cd2ba3214cd80efb8e66d8d761d3d068ef3287473d1db6aebd89701d9ed17358632c7d4621c6fe891c961da9e3b0448f3c9f3b16295238ec937faaf1966fd83cfb1ba8d7633049376ce61976694e1b36d1b08c2c579449b36189136262cccfcd415cc31aa25ff6afeeac04d5b0a38791cbf197862532564cca9d72900f0d4ec59d74ffd919969481afd984bc1033332cb142a70f21ef37cacab0c4b36a301b635856c8b0a694223e0a0bde371943718264dc618a6135fdf03c69ad1f858461898866a912d24c1c0c3b8ca222f131f95cbeb0c3f8c917292f0c63929f4f9d2e2c3dde17e5e3c2be3166f23fd354d916969c41260d39c646450b9b4ad09c9b9b668f2c6c1ef179f77258586a3f3ae3fb1443685c618b8f2e427c2b2c1599f32298c5b8abb087cc948bb5b4cd105261c9b974a4d164a783700acbe44717c57ff21a845258a3928f79a37cd4208cc2962726ff0e857d2648d0dc483ae34f58d55154e6749f24f74e58fdfca61fa627d99bb0e390c93871262c37292f65bc84ed7fc2f243543a54c2be8da18fa586d52409fb57cae89920610b3965f3dc5adec711965f89b90c1d236c6932fe8cbd1761cfd51f428e3b11969c435ce834f1d0f4216c237513736c3c945b087bea184b527ec8116382b06ca474c9bc338c9901829d91c5fc609dd018554829790a7db00713cf0cedf2f1b8077b69c5d97a1adb0bf340fb9061083f77b0448ad1a8526764a10ef6ccccdd73d11cecc1d2a74ebae260f59417fcd23d1af5069b68d97fe9868ab12c800db64a31595207d662138d8f1fad9ea58ed16235796821a76c16cb07d1dc9b7c37844c167b862aa5a9714c7d97582c8dec415a0e6b8c23b0a0e3c15ac6c82b9668de40f357f81042ce157bd2e825b7d5396675ad581a6e0e99a37de3781c2bf699d5f5cf8d55eca131fa4f7e5f5155ac3351638f65879ca662e94ea91e8d57be0d15fb68e5cb79256286d09d62eb8a9e4f1a434737c59aa193a33a8e61ea522c21a61aa768196b52ec17133fa5e419c59a329974c78862079b9529d453e77028b6d5c9b1dfb929920e8a25ba534e131f3d87fe893d48f4f0cfdc13ebd45a0a391d7d8a9d583c79d4cef913cee3c428ecd183bdf42636b9b8e239454d2c36d9bffbc9c4d6296d454729858bc1c496636288e972ec10bcc412f1a6d1fd47873963892daea18665b0f820a6124ba79e904eabe44286123bdaf81ffaa387d8f024facab14b29228925e434163b49065571243691885595ea72c881c45e296a8e681eb185f898320e3a62d5cf99b1316dc41e836418674e466cd53973d137d3d745ec1fb2be1e74a33215b1e7f8b1297a4a111113b18747919d6188271a44ec3b1e1c4594075a1e62df320f1663f633c3107be660dd783fa30c5d21368b93a2e58446b127c45f11b341ec397a6454c304b16887a9a4db29846481d8eed38760e653271640ac5fd231e5287b18ffc3e65b199c6fd845da0f7be8adbf86b19932e9c39e5149c5ea638c49f8b0a3bf0c0d6afb3f5e7bd866cc815e945e0a4b0f7ba418e2ff68a726f3b09f8d478ce77952888755bac3879043a7cdeeb0543eecc8976176d84c728a1baea3a264581df68c34adfce9b005fd7c3639849ce1cf61b34d4d1fd323873de59ea41d3c71d8663a6e2429d5d10e1cb69c4226b3c98a957cc39e36f5a4676ed8d26668e2b037e64b1bf691af4e0f1bd69831136fb66343d6b0cce30a793f58f84b0d7b8786a761cb182f4ce41b0debaa5a4ef1332cf11764e233525e6d8635376ce01b19e7545386ad7187ece64d957b32ac9e77f93a935458790cfb74ac880f736edf6258b31ade3e7450936918560de14953504f2a2618f6b20c3beb3f4ddacddba0c60d291c4ca3061a369c53a315ac3a3fbc8641cee07963faf0861a0e27296d54a434330d8b65ac4d954a46c3921ee4ba7c55f93e83cf90a4fccad0347277ccb07e88ceabaa6a19dc8dc9221faa850c3d8a762be36d3106c32fc3ddf1dd88c5b00739bff028a68bba64184cd65b551f18ba4b7d9e2dbe40085baa8f26cd636e0b2f94d673a7e64ba1f1648b2e64f125df202b565b708198a972904d773bea165b70e52fe3dc7b90e35ab6d00231d7a306975e6b626f9105265599390efe116e81857167f0c053780cecdce20af7af64ed4e56d8417e8aca971954f058159a94c6d46472c3b105158af21f7b2cc314f32da6a05f2e9fd248e1f8b2f4d57f1c6514d87a90ab2a28181b723a5e4912299fb0cc84901bd7cee25d8a13b0896a19393761f59443e679d4b852086102f1c258d8e9de8d6b2ea19378b18e1fe77a5c5182fb69ae27322f9f684930ca878bc142dcd48f04c246a9cd2166f807cf11ea4bcb540deea6ff63844d9335f0cd31c38cd145d8a208fb4cddc4f2be9ca1812ae013902d88c089845892a39d9443e83c642c0f9d777521943966fc98a2240cc2d215c7724fd41063f84038c709923a5db07fb0578afe485ba1ce82c6077b67d49d3f3492ae997bb086c7bb69bdaf3fd43cf827adeaf94ef53bd834c3ad9c399de588ea60e98f5ba7be16d342748b1c1cb5f1924e78f0a12d70b06a0789b7973a91e17983a5ea1a7d384fa91fba2d6cb06a0aaafb19c72bd5a516cba4dc6e181ba48c41082dca88150ee56294cb2c88fd18e1eb3c2e8b25a793a419c272e532166ba7208d3cf467e49082c595d12186f02b96adf031c8dde5fb10a9800057e8115917d919ba6a051f7a5219c38b21ca8a6f3fa4b829fc5ccc2ad2927c3975aea4a02a6a74a6c294a33fb0f3a83d39820a233cea587b39c548bec2f53688914c617857a3cca1521031d4a62e5f9d9214cb9a7ceda4cb9f1d8fe20e315546f7668c8ac214338c9c799aa160cdc2a1c68e910f50ac6b3915435889f0557fc2c8d1a672de134fb8be0cae4e94eac31e23d190724ed45b9d111a9bd8532b4b1c6e4613a677dde718bda3f16522af549fe23208198d89ad4c6c63487f0d2fa824a84b7497a342ce6c091f487a6851520963daf87f3c0e4a146516d3f924ca308caa7e92b82e6598a48ec4294fe7102f8ae419126703bf0dd5a33b7e3f8214f13d12710421544deabb11de7c0c35592280119b87dc0d523c9ddcd459c41ad724d5e3e9c779374411d738cac939f82511cbc646d3b03626fb0c47c492316ee7cda83ec452bf3d293ee89f8aa021f6b0f1472a836d18f35a88519e9826248aa4602321b6ac4b21c41ae7d506b1df787eb81237ee4453103bbe1c6237db71bdcc40943fdde83a0c0826e451cbad3021f7873d7459fcee0efaa1bb92fbb067456864b7231f76f0c032a5897b58bbd2e2a3348d793ad2c3f2e761aaa36485ef97876df3224e2ea6b58d142420000f7b4418b3bc31a21a7977582e43d539d3701332cc0e3bcedcf16127779aba3a68daa3bd693767381df6bc117732a6183fa5d81cc8d191d9f9e5fc4fe4b046b5f4739bccefe171307e7c982125f72c70d8f1e449e9386afa0c9737a036b73ae369c173c39a651b73de20f63ad28625e4f3a01e532e040860c31ef2a44ba426a4ce1ab694ee4da0068365506b19591af67073f1a53a1acc10d988a9caaba27f867d2fc620f10dd71a64cc50c6e39ba33fca259561c9a8e3eb61a4d01d93c11c69fae0b452f73a8635ac727949cce49b9e18ac6cd48da265493d8a860af80404060808c3729a1e2f4ac69ef88d54019f8034010160d82cc614b6cb2c76b4ad0208f8c296633a355e29047861052d500102ba801f400017324b7114322ba41720600b85002d6cd3f863cc7a04062bd8801610908522daac0669f0974200169610c36720296659e9e50908b8c21a39d9512468694f0a02acb03e90add4b9af0adb9d7786d854deb71a1536cb29c944c5b06821ee02044c61a990e3e3bd1d2aefc70202a4b0efdffd2507f171ce5e3c404014b6a9cc557e663b111a00800202a0b0d6c45863214499e59fb045c74175b72c3fe49db078066992e7b8c839a709fb6c547fa6de8fde61c2122d5423ad54f1bcb3847526a36eac57beca51c2b2e919a58816a33c4e12965092267210097ba673b0b72651e311d6e04973d0f4b8ba7223ac633ba23169d132bc08abdd67fc950b517288b0a7789a39c57d8c9243586cec6a1de5fe241a21ac2a6937839de8e64c1096799c71fae4f99001c2d63177e8fcfd2106f5075ba6b4982ca73ed8f34f3d62d80cc3cf1e6cf31d4bf2e6c196ca81e7fa928ff10e160b99dbb8e359a6e860f33c76b7f3b163ca1cec203ce25138f04e1f0e96aff98b1ae672c36fb027c7d77396610835026cb0e4b0b2741967726ab1c7f1dca92ae3a4f0f28a9ab4592c17aec43668b258a63365638314692eb1d87ef284181a65eca4c0627b54315127381ccd2bb64cff69713bcf86892bf68e7fd429ef649c9056ac9ab2328244f748082bb69849e9fd4af90859c5e6bfd1196f279b0651c516cd61aa89b1423e2b159bec26ad0ed251ce42c59e32aadc8d758ab553f587aebc5dab4cb1767aca91f37c6c74299609931ea7c8d111a627c5e2911cc36f0c7310e947b1fa972f8afdd31fa4f37836df876249adfc205e1e143bbe8af9945babf927d6b08dc631ce209e399ed872fe4892b3d3d49d4eec1f7af7d166f4ed39b15d6acadbbbc731dec4ded051a7dc3d4a514d2cb1a1a6ddbd50f16562ab7079f25c98581a3c28c94f3f69f24b7ca97565d13796d834a37ca17c53893d3eed84c75d99364c892574ac867ea2521a9ec41ec3ffa7e53899332c8935a96ade509aeb668dc422197d4ad126eb4e85c41647f441846aca481fb14fc69f6728d7a8928ef8433c34c9343662c9c124724bf3658d8cd86177dc06da9552e616b177baccd59453c4965d9aee3baac8e412b199693c10558f2107119ba4b01bfaea3fa387582a86d0602e37c46686d8a2f4674612531f5921b650cd380709b1afa7c88f56ad265306b1ec6ad09a1411c4e22806b98a5720d69b4a76e927a7370588cdb7e452567fd8d2e41ec9ed87f52698e398696f33461fd6101fbf95310e1ff6bc9291bb2b2f5874f6b0a59fffa30c3a7ad824e74e1fe367d4cee761d528fb1904bfd3fcf1b07c944a1331e6a896bfc31a5151d2bc7248ebedb0c790738819fa3a6c357661b2427fa60f1d3687394ff7672b87670edb9aa965e83161abcb612bf3523bebc738f3382c9627eca7bde1b0e7a4ddf5111e62b2dfb0860f71c31ef453ceb00fe96bc396d144138df24751b361cd8f6c1c33e66c6ed6b0ec95cc38dad849aa1a5647173f44f754f4342c979927f8458a1b346c7219f54cb33ce4ceb0248906318566865542f4838d29c3629e2753a4a9f8294886f5e3e4cec01c07916f0c3bfe14672ef7e6fa62d843947bf465b6410fc392973f43aa0d0cebdcc4b554d917b61852bc512f99f8bdb05d4ea317c32ce6dd85451d793f0ef9bd1b2e6c395338af8876312e5b58f2830f1e42a4d0b568614d6932c71cad42fe2cac5d5e271e828525a95ffe360a1934728535a654fbe12056d834a3dc1c371e37af2aec791a1b3a6c709a2b2aac62a37177f7ac3fc3a7b07772d097f3e452583afa2e4d5fa5c67d14767ce3c0cef250d82e44ac52ad10397a9eb0f83abee87b6877394ed8ae4642f3f6262c9e338c6339a645cb99b0e6a5daaacb0b1ad34bd87f73c61999ec5edc4a581fe6f3e42984afd424617f0ca5e1a9c64c6690b0a38a90c26f0c8fa147d8ebf1e49e3429e5c946d8628c1cbad17a5e938bb06718d343f71a598489b0d6c5d39fcb341a1fc2962639a6447a838d10f68e9e73a99985d16410d6ce7198728f369813089ba846d49e44ba287fb044883432f5370e823ed863ae444edb9f235f0ff63fcfdf7bf2605b4f49f2f63d8ecbed60b9c990d915733da983cd3ac6470cb11c2c571a3e761e073b4e21c5bfbec17e3ad6c0414cb92ce5003658338fc6c50fa9c5fab5b67ad6152d2d5a6ce30f34eef13f4acf62f3d9d048351d6658165bc7da903a54cec08bc5fa403578d4e9cf28b0d83c8364142b798cbf62f38a922bd954c972c5aa167c321ee93a07752bcef1b124e7b362914b353bf52a7620b1347483349b8f2a9659eb1abde811d1938ab5826402a6d82b4d320ebef3413c5d8a8155f9cac73948b1c4cbb07329f562147bc59c3c7ce2edfef8a2582c25dc698e7ccaef8462bf739897e6626be2088a2bcf97c7da147d6295181e2235f973c8399e28c7f0d02924dd3bb14dd88ca5b90c27d6f828de9de41c78b189b56ed524a3460c9aeb923378a18965cc4b53ae94552f32b188c5ca39d97e4ad2680528a0ea0526f6c92ba28dd6fb3bf8f5e212fb4dc8133345dabe9cab18bcb0c47adf716573455e5462eb8a69191b471f255001af20051f022a94d82b2ec43cd363c4189100c78b496cdaeb510ffcce3bcc92586c22874ed76d90f888c412a4f15a90f5b30f1f2496ff8e31a77c3f622880022f1cb1563a938d899d532cc8178dd833c3cd7035060b1e5e3062cbe8e9394d4ab5f062115bde7b14198414954347021cfe42114b4444988efa2d4fed4522caab17ff5248db0b44103e37865c37aa123439bc38c41272f464e17b42cc7224c0d18266149c109c5e410a7e0c436c128e42da98611de7b5102f0ab1c94c68c94395308908b17879d8dc6d90e0c52096d8f7794e1b2599b5c81e5e08629bc91f9988113dbc08c49631beb8320e3e631c092016bfbae8d968457ccc0d1036bcf8c35619d3828688fa617b1c53e6d89f565f921b5ef461fb9442c4fa7cd882464afa4d68497ed6f0620f6be65ab15b7320b9173dec919df23493aa244fcf8b3cac96d26ff0cf14f7d402c10b3c2ca51d2d49ca502a897c87256efe381e33230b1aaa1df67c3c3944ee4d081c055649785187e5c26af2909347021c2c28c101e1051d964c8d29b62aa3d2f6831773702e45a554751a12e050810b42b082830214b8600572d8afcba1671c0b4a503c781187355edad4c4102b1d1f36780187fdc437ea2ae35bed9c00f4e0c51bb6ad7cb45799aa155eb861cd2719ae266da8f0a20d4bc70b92b3b7e10006ace2f0820dfb68f28bc8b95188a3d6b0d44507d91429d3ae230d2fd4b0fd68a464c34d1a769416e1e043f4c394816678818645d3e64e8ae22b9321768625522aa20489b1e9c4f2c20c740c9b49be6f423e1abc28c3e657599662a44fa99a0c7b4e513442723d061e84bcf4331293677821863dcf6f37762761d8c2aaa7fdcac47fb0bfe105188c59697e61a94b873963b0b317e6175e581c57f851471a2b661032bce8c296414a1e1a636383fa7061935bcff321c764200213a830bcd8c292f77b6762936288ff0b2fb4b0df861f5bcf19e48f2bc1f0220b8bc5c5d98ec63f3a8ef3c20b2cec781e5814d93804ac0b2fae509e2032493f4aacb043cb0bb241ad3603130355d8629c9c6617d4c2851754d8632505d1ccaff9bcc9c28b29ac5b3b9a9d2168c44eb5a0042738410a2040627821854dfffe364af5e6cd79155e4461b58fdfa1b687c292e3ab529e077d21ff844da3ef5590af1b0bbf13b6bdcf0f9d51ccbde0376195cd8fbb7e1c8f5a9e09ab5928cb13952186d02f61910c2ea71c16493be72861b393b8a91ba883879f24ac3e7a49aa3348d8aa1e5c2a8dfbe4d939c21229c5b0173aeec146d8829c5de6f2e968781136b313e9f1a413617da0ffb04cf421ec38c50b36297ea93b4258ac4cb673bc83b0a3dc94d25977881005c232b2db912f4a7a247fb07a08c9f038d83ed8c461865bd6289f4cba077bba1c2aab661e6ce331e73b2c7e0eb91dac528e3e2a3eca9ec4e860cb39524685d6c9fd39582292a3d57c29192b0ef6edb862e3971becd529922f7e6183c53b44d2a43dbe97d7628b0c53ca8de930874c8b7d83850c0faf42f867b1e4eb8f5155c7a7cb62eda095516faab1d83444becb3214164bc80ade61fab126455fb14709e9a7275f0ceabb62870d92ad58e2a798ffe88f7d352bd68bf13841e3556c5121443285dee75315eb35d00c82467c9cc7542c293fac68aab3217da85864abd4638c7afa254fb184069e766e4a53eca59ac3e5092a21674ab1864f48dea591628fde8a99cf736e221cc5969b42080d6a516c19c2d7314809c5be29fef3079b249271a0582f53de4495ee137b88a0693288e9b28f27b6dc68f3b191e38d7827160f51ba5337f3610c2756bdffb0331bdbc48e3e6620a3fba0a2c634b1e3f8b973fe78e8155a26f6901ca6f0b486d2996162dd4c12c25a46c3906297d8bb726cd4a1b7c452d52987b8b121525e891d83ed4e7ea21532a6c47e658df3a6929ca84e6251bbfc5ad91c2d7845123b5af3d47539550ead4462b95499aed2d4c9570a24d6c6b9cb6388f1f2e18fd826e7bdbc9876c45ee217f3f2a7c52f1bb1af35d4b01e2e98a43062bfe8d49891832c62b9358d7be9a3886d74a2c7d86022741c47bca32a44ec3395ba2be487d8343a7a089a1a3e850db169c6e321a4c40c211662f98f20bb16579b1b21f63dcdd3b38c416c31435f10ebf9e5f05907629bc9f3d0fa2b233901b14d0a310f24c76420fe61cf193c0c62b9cbbaf3837b399d61a646a4484049d3867e464f397cd86f42587e6c04bb59f7b09cccc846a5f75fc69d15a400026348801ef64b1e76b13f278c4c13186448401e16d91c24e55c0a416388031280872d49de1c292eb3f3ee77c0f143d3d8618f7a7e97e294803a2cc14e82c6cc44c81425800edb07db103f447a7bd42c24600e6b06c9ff915806329d2287c5e7cb1a6c6c8c655602e2b0ed6d374c27ea1b360e873d73bb3baf826fd872de67dce931a8900037ec305e70589981752a4d0afc76908036ec132583d093197863582212c086bd435a6c48f5d1c4336b586cb427bd63a395058f9000356c3a799e9ab557e9b934ac19279eef780c11d3868635f49637dcf50cab370e0b0f43c40cab838b3c16559661f9fa183455c75648001938cdf55dfbb25cbdc7509e4e4e35958a9592003160b1bec385f9cd5b02c2b055744cfd97e9325f1e0c6b978e56dce67c61394ff3f18edc0b4bda953faaf18ff8bb0bdb54a5182b111fa66ab8b059f66e64edf55590b7b0c6cbe599ea206758392dec6725bd1f5e16360bb77bf1308447a3b0708e7cfcafb0839888cf906f633e8f15b6d29826a5709c2aac7266e128edc6e89f0a9b848f168d7b9fc29651a5538c649edb5c0ae60c614b6b8cc20ee2498fcc9d46896928ac725ddd3f214fd8b461ce90133b619f0c1be4a4b3366195becf509b244c1887d95c692e613fdd585ac92f4645aa84bdf26474929c3d219f0432f47590b0579de470910efad379846dc5227f0aba9ae49146d81be4987b152cc2667b129f728879233f220c35799fc6186d08a6b5d030ca877498040861bd86bf21197663f841d8614ec928131016ef6994914894798cf2832dcb63e5e750f1c11ee35427ed189aba931eecc8ecfbe3f6e241d3779bb50fac1dac52316c8879658e9ba183b5a3cb2fd41c6c199c64e8289d370a290138b842026eb0c510c16264a7cbcef904d860bb0e92eb91ce3ce6be16abaf7abaf415c75b3d2ddab5a0c961b3586d43eec9fb1dc1638e2c2e9fbc1a83240f21b1582ce7eec0628f2ae351ff7255795eb1c3dc611753c6903edd15ae83ce35eb5ab1647a7a8d679a158b54aa885d8d5ec51631380a2af153f8b851c5baa172cad214638ca949851e9346780e15c7c63df1692fd456fe14f883c9c042baa9cc147b67d0f9ecb314eb78ef9743d5580d23c5ea29634793141a85a358e7338d6dc5a2c871e646dc782896f814ed413c791cb68282fd49c7e84facd17427831a8d0d42ea891d670ea229bae2cc979db056e4625d9cb061e6e8912b2437b18ec65cf8bf142a2bd4c416d3c6984cc153e3106662f595dc40cbc7c462961ac3d87e67b42fb174889a46735f6c9c9c25081e33e7ff93e8b2129bc6cdf1e92846896d2336c838c6244cb08524d6928e7a933572a647629b90f267a68a39c31a126bc4cf2925e547ec1de3c54ef3b3f941c2c2168e18c510d3a6ae4f8e6bc4dea9d25a8558e9a764c412bfc44f6bd3791c17b1480aa12ea7fdecdd4a11cbec7e4a9fc29108196c81887574b3447d23de5ec621548f69fd732f8ac3106bec0a4f9f772188f4a01da2e434898c10e394bf97121c3488b5523585a3dd9b18fa2d04e176e847895c862f10868cf291089b620204b9a295c7fe7ff8e2536c1863cc3c3fec311d3bac560ce9f33eac12d2754d5a091f8e7ffc191f3bba876d323f24fec77cc39011b6d04391737bd65673cee581da94915069edb1051e8a39c95148ca8da19a2dee50a3fe18a5a31b73daed60cc213c586f8c145307a37ee79bb1e9f09664dfe59573d83bc3ca713e230379bc1cde580de9138ac336527e164f523a79070e7fc4358dfeee0df887cabce1e1862db7f264a49d89d5a8b488e64202a2c161a1b158281284c5e14d66082316188023f2602046611cca54e107148002541c0e182a1e0c10120c060a0a0a140e06000404040a10100c06080806080404040e3a0963d80ee707d446fbc186d2c22a53cc062bf8c675c9484bba79d89fda906f5baafa7940e8ff6115c038b46ab4de51014210b3b51962b936b89828585684ca282300a345b20f862400e87c7940010d8c7b1e920703145e57fea1a6c1edcfc41cd918549bfdb0bc487e1a612234980aa407d46a0da9d998cdc5cfb2fe444ed8c985574b18748b46d63c7b0bbc5f04b3de0063303e01bc95846305d35e040ae9e5da5cfb94fc4534117c4381adae2fa6c860b27338c1edd91c93020ebda2e76508de783b7f0e675c62fe8efbc6163551ab6d36eebcd32689789d7fb39e0b55225c77ac0018015d6ecea2e47fbe1122ded46fdec65c4335abe27fa2d297e434f3e5b41ceb35f0002e3e3c8589db7a0e6f618d9edad2ff13dd1e5a6d28ba9b001582d037a14005a5e1d18ae4f2dd465e50bd89e6b667e7d87d02f2305fee458cdd4577bf7beaeca13243ae370a80d96181e759cdd21647c9ec95812f8acfab39d3a57a26565b1de12a21358a0f1c73e25ec73c9895844fea90dba984bb3638769619a750f25f9da5a80a09d68d321bbb348eedae89565c263b33d75479ae8f6d66c84b571154f26f8a687d0283fefac40eac8b45b4e999ef54ed3e370822f21d079be3e0840b9ef28db2dc0c764c57721579585e184000d8fef07ccc4b405496086fc24dfcce4f50d1ab090207b59c9e1dc88b958a53855d2b78030eebf0d16936a45006ebe795626836a456cfd25a0d29e9dd168966251377fdf0e12c18e86b576755fcff543b4ec0793afdfe03f079c36e9e931682e08989d79c9f44e2a959f674187354f606cc1dbf5db8b5848dcc2c96092a195ed78b10f2673335d1c696899e5a6d106d09afbf0977dddb413d50a21298583fe044c1531dbb4ad2da5e6e75a06f2c035d41205cdbd614b9748751a46ec70f136ebea79eebfa3352d330fa0ac0b7d917a821e14ed2a9da5156abe8210e8af6b4a424258ed5fa757a657f662ed7504251ad4f0db3a7eb193b040b2a0aa6941f124d8e11ee0214e7aa8485e867400ac30e8b968f1eff7b752e97bf67be01ecf15985259bee5bec0d24322d74acab7898ce4685fbfcef2d08e08274dc9c0fe11d6008aee3be81f4efe9ea8a5d7b51395c3a7330024c683f1083a351cdfe59de916c6ae4d7ceabbdeae4254cc478de1c1a83d57b586f52123625f9785a19fcdc12a6aa43e1eb6172af49026163de8dd02496ff37790c5427d4db6dd9ba6d8f768034dd9083d16d444b7cd1ae3e821cb4a5c46b9742fcb04b7fea2cd224f02eb6099ecee5b410bc1b3ff6a0952dd71e6b144bf7bfa59edf8c4f0c02ff87af906ee445f017101a125a328bc10d9a64d16f4b7fdce225e965eecda143c09898690a7bd66a6cb8db122aaa2101c5ab8fc623fb9493528f31165a11451b9663d544f9514492920cb89b074da0ccb52f98f58b985cf66a4e6c02a3ca17e9ef7aac586e502ab6069350b160dc829846f6cbba7e05599cf6884b391924c2de1f4ca2bc38cc31d7610a965a03d88bb908c03b21e598efe22056a4d0a4ca2fd89ed5a0177184f00e3401aec5192aad2a01ae748ad605d7a3d377f1a885fe6151283a4180ae7e935d45ff962e7295fcbba4920601d955eaba5665f717f2b696a85617db4aaa6845810323cff3ae91ba02033cfb02adec65b3d4ff0de536e84bc1532114ac9eede75ea2ae0dd8750939f1ecb358f9577ddd79163c1d75a35e0d2f35043d148d4fabd09edb282ee49e49216d200f492a22d33952e85e2c5ea2ba29ba46753174077513a1ee722666873a9317a8abfddda3defa543be0b171dd730e81d2f0772b216fb6abc67dd2ebb5f7a2aaf75c47fa3221ab6ec0deedc51f1becbebd3ebcf0bb5feff2e0ade331129575f2d6e776e00016e1027a775e6fbed8faadefa3b38385be9b8d270161bd75b55d13ee3d7f716b4435d818bd5ef2cddb4bd4c8f442f53af532bdcff08ad9eeb966ddc1a7edf20aeff91ade820df04a79b78eaa3d96fed87b9e7f4b27375d92487739933dd7eb77d7bd28bdb8d7db4b5190eaf7eafad4b5d58da11b4bbb9323c0d12bf8eff57ae17bff7965ebbae86677d3b7371b334184d87b69bd73c55b67551b3beaaa5b870abab337e8ade73020cb34ce5b8f67eee30615ed2e6fe03e05e8dea717ae778e7bebca19d7573c76eb839298c4eac5c170c1bbfc8fa9653cbf6a6fb957abde7acbf43eaf787708432e105aa9cfcb3afcf91b0f8e7424001f4734a36ee96d643c0c1b1c69466ed3c44c0a7da01aab20da102a5f40937d6b31bc2727bcb1c943b246cd41ff9c1be4c6fb5362407390c12ace837703bee2927b54af1af7d4a9205758ea2f619be0fec5373ac4378a0ddb98e43eb45e2521e5acf48c519bbdd6a96382010c408f13793ad47d64358d52f45a3dbebc4629d7c0c62853488a13329c5cf7af796afd32643dbf4d180ed8e9235f2fbd29b3af54252689a6d145512fd2bb37e6cba1d569ee5856959864eec8a7ca968126dba8b2716a008c526ecb32c165eb21603d4ea99b3df42ae444bb7c49e4ebc72972a055c0278f13649a6dd4d6e662fb388aa556ac16ac58e8459a7bffbebf883006f2b8da2308dcff301d510299c10e3a9d011a88674753bd5f815a0102023b022b17c8ccd925cc750932aa16c208f7f8c569cdf4a989aa522990df8117668514760f907e82975cc8ae5528d066e0e543e8da32356044818cf5194d9c32412646afdd97ac0964869b9759a6068270213f291b4813ffd230de7afc1dfd1235001941315637c153e316c424d022d0e2032f335283e00204f80e64c606ae848c818aa1c9473f028bcddd6f0b5eb253693e8b80cc032fde90e4d29404685120837c3ca4360dbc84c6371a1e81a40732fcb764d5d448908119e87236af0ea15b3f17b1b163093cc2427203d2023e0470f9890546d172b0154ad6d215e5407d1cd7cc33044e07218e0610dd5b06b7031c22c8583f50d1e13efb7144e92acdada7da3589c3715f8197ed8095d421c05d81e7f5039f35bcb0048f89d8daef15b6ba5d88d27fc81bc8908482dcd72c7befebba8023c034079977fbf0c4220215d2a4ff8e89aec34d5557f439b0ca5618c109d3e193f8ac57c511f83f1024db97130096996893df1e00f173e9d116f021805a032ffa57065a59c03682cc660315dcc7e7da6b729f1664858b8eea9a4046bba7afc22ce0e9a9da8694371a28577b6b0a542e41e62ddc1dd78a204a9676e9f82d152c82dd5ac42434255a7892303073a9c7f242f990efbab02e9637e2c18b8b7b3dabe0ea04199e24f06b6a61989005c69214cd2d53d26652542706ea4b47671e2e725774768320f70415dd18acf673f84e38212010300fe08c93fe96b4e75fcf8320d303ad0f5dac209c76c469f093076fd37ed5d5bfae0ca5382073d9a73b0e70c9c7deeee3fd096a2620622366d794806b20f6a06ae90595f443a54bf38060e712deb9e3e4e8352d5e7c755febe68cd6380a6b4ee581d5fb39df4c8c9d540355df690a175a13d601a912ddaf5fd54a8eaef7ac29b85ce2d3675fa1c57ccd90de50e68d1cc7ea4ea1445f34d0bcdf75bf32bd8978ff11f2ecb233507097bad0d2e1a9f2a5eef4c3cfe09aced3b925a2c54a4ff3f10a3a51dab1b6c8b77fe2d8e13596ca812b67ae762dfdd6c502af5eb5ae830a3997227679f4c8587f309a7d7682b7a8928e3c61c7d821d50891f0d4030b4e4574c460e550a0c991dec80e95302e240b6371a0f26bd563bd6a42e9fd1e3bbcf3935b10a45049dec9da0ef16297913188a876683d1e75bcc2fd9f8485dae020685cf59c48df8e803e4f45a3a29778c3ad44329db6594907dfbcdf95225a4850761a231a040ee6debf035683a6a87b04290e42e51914cc66727dbd13c3d04cf63fb8f939748dab6ad52a2fe454feb56ca73982717c7762880e34f9c005c4d61fa28fc97440fb87e6ef8c84e20d99a79e45a314b2139021d728418a4619ebc69ce386a015545132641f7e778e523d46ddd201f82e2cf11c26540dcc0c3c6a949ed9e87cc71ecdadee1f47062221e31f7b18051ca54b36427a4386216e541c06944b4d61275091c53b850e084e12b7788d7d3a66681482ad12e2a457761cedde3e6e476d9393325e3edabd717eb71d58241b8593930e1dba76fa1dc8287911c57a847547e3ae2d99f0a2b08945a450b3cd14fcde0fecd49d0bdd794950b88aa3f195266847136669f4d87a033002be30249d6704a459b94fec1c800da1a815f68eefba5788338f6c7abfa2c98847e581fe5b4cd91ff114a83e97c00ada98860e423901084c62b0d0262f6db741d3b019325afa4698c20ab0cda2915408f2c159bf4b23e84edee52dc09ed8797cd9985c674130bbbd19f69e8a5cb6991eff56cb160a514d47f60897c28b0728e52c86fed87dc3433bb764f82a791148b5968ab561246ff67dd09d20ffd19d52e36deb7e9d546b597c7bbf40514637c67f8ec648948bd3b136cf79dfc5dfd1a2dd0615a9982283277db44e69fe0f9263a5ca1d0bddf35932b95585a28105aa06cf9c0c95ef976109419d415174d85856434bbaa4a12409c27379189092a3ef9ee47ef61e0474815ebf3a2a81bef4ff9e03d7bc11026b0db21989b0c2b0dd29ea47948e430b621689df42cf7d7c61fe94e179bfe722ba62f8bc008dec32343a59f70a7e3ed4fb5418005173959f41292e4692ba8e8aacb0dd7d0ff6e9707a446e76d5806b8d4777c17366966423b81d532d4bcf36006063025e32b3b531d7b525718cd1e341d6c70baf41338378ad7ec027094c025e8f676d8649e3715d717f51968672100666c0d4c0867743dec70e7e4209bd218306f850a381d0d28a07444fa57da3d562a410b41bf8138f3bcb398f8831fc514614b5cd0a79749316965ae628021a80c6f789fd46b22329b78d114202e5a01596ef8ccf3e90dcee377673a3d9a375294e1499123dd52b42a1e124b6f8106d1fd2db084f4b58ca92f8e330c9c7aa6dc1347a1183a24aaedda2fe70abdeb913894006f48613b139a46d93da93064d0acaf19e9371651cf842854de01f9b77d4ca93ee790b479d93c7e1b554eb10af58c5b610ba8c075f82c29e82cb1ff11516a4659db2285afd72ea5a7c2e99e993df63351cc34b17cf6c807c3b9584ca02e6996d982da5cf9e6f918e9f1862b327dee1370accb6baca503185469826befaf5a42a7c9fbabfd9011666f98c43c2cf00897c984e9cae004905d0c94fbd9f713f05d94fe0711b567fc918022724c51c58c73dc74b778a50b9a4b904319443d302d151c7c2da3d5ba95e99f5b4a1a5cdb377650eeb6988045d995b29c40d8bc55a29f533f734b467ea5c35221a5c10e25e9b26c4acd43e90f95bf3f1c72b346e922899c737766e8c89341bb59f3fb3bd3446e3c8762d86a1886c03417a0b177761b2cdf9636beb9f5d3a050b2adca947c880f3d95f5da4695ca1025cdce3bf65b52e84011c6ad5eef4b4b9eba54ad73a979da2cccd25c5597c48bd3d411c4fd996aebe48eb343e9303520bb35b20d62738bce7bc24a71b3e98ef2d92d177ab9fea997e765b112c0e8d81c4cac3c12bf387ee683615ac8cce374cced1ea37881007ee48dc3a1687dc47e7383ba2ba1ebb54a03cde35812a8f46c468ea317502dc685091cb2480426375fdcb751c68a6225622e7ed32a590da0bfd6cefecfdb9bb1862f39c9d55252cf42fd5374b0548e9529b6d8e38375b1504612d872456cc0f369ed32d5b9c50c6da647c77c8e2972e3b53f1c526212b90326004ed0c98386b3dc1b02712e44228b0018e603c34dd93cc9b85c9ed4e131d80477e65108a5746251020d4d5821245c92d710eba9efdb6ea3d9f8470fba799dbeea2c7719dd6d4ebbd21971bcb4796876d4e497265ea20f6d025dddc121a9d70425607a61706af4d1c5aae591c6450832b1183bf33228c1e6ef4aa4d6ba2842de3d32ac5929da3cb8b76d684627583c60da8716355eefefb9c893b3a2ad6b007effea53806c52dc5f13c33b779667682964ed284cd36f75874ec9035df66573e7b960c1b6cd5ca199a51a182cc3a06a63ded3b1d9fda3e3afb580fdf72ef934e232cc8ac025b047635abda57bc5ba8f8e04ed37e0ceff1e36f4fc79211b24f4c1a64ae21880daacb4b9ab4d3a31ead009f943daba5bb3f75a94f751a2a41ed1fb0651570dd7471b691e548e377b307503d7488b6b3379ef0d0ce3b4476d3a67b46db8874d2f5de26b2a7b980a339b45b95771f000cb0ad62c982572fe07eccc97eb9bba063274bb518abc28030ef61907101cccc36f77671b376881b9d8e6d41aeaecba28812603efa894ff523138b9624cbb07fc11f6da0a0e4d08c8f8d6ce4a32e2c1f08ec9a9fb2f21507f9a1fda6b1010aa9284ef65ff39bbdc94d871cfb53b179e98fb83ce954206c0e07d1b1bb788c2d9878d310caf63ed9b7cd2544f008627d6a10446958df9d7b197848513866a8c7413f95d117381a467913ead92dcf9975f7ec74b79ab60a27a2050cdb66a8ca065c1ecd85f6791749e20f42a6c5b3b0f7078cb0f395e22ab8d179a49c33fc90a22cdc51447c5b722914e60b18ddf0a8bc3ad1287038e5b1a9ecabbb3a78f1930492da2ff174c073974338229a04f83d886b6960e1f0749f8b8431434281d8542a776abdeff4631c385681191aac2acee97e186f224d3d24c027f1afdcc9a83bb2623082eb09bbdd3de1947e1baa19546084f52de8a05443d28e6f02140cd685066a7620db4fbaa3ba558a8fa5749948d70c598340103a11b0cb5c792a1df064981732721d7ff172e3a5293461b615e94001230d162a6c099c7d802bec0a844eca9ba12290a1b877e11c0a757b57a48961432a25bf248514f038c27359838860d1b7275b6034261912f229bf1cb22c87987bb4af7e2c9e51f03bfd8a99d57e8557c03b1c4066339df8326ee803a9d7bec25262c02303d54d81ca83f12344023263c93243101e1c7b803d591240c6caa812e286da3f40d85948f7bc14772250f0dfacf23b1af9eda4616d77cee7a7ee560ff81c6b26795a9f6980a68b3e5e01410c8699ce00d5066cf3bbb8efc5c65c0f1ef354dfb97ab30a81affe53c8740296b79f5ae3faf7baabc187294071fa3647502af4687943e79261f4045cee10a80aeebed04f0b8e4d8a6317f8d34a7a2e00ce01bc2bdcf5c9e5b1383f7e15b284edb2495aca80c18c9c7546802cccc4c1e9745f1b224ea075f3b663dfde225ed84eaf52b0837c6c8e28ea8ae64e04ea9a6cbd5674185981ca7fb6a4352010760ae4d8635245d84a262b7db5155a87aaf6a6ba36ae9278f6099d46226ec9ed3e79ec98c025c33a6e5d9f4a76150696e0c993d2700d109261ed5f294590192e143635775cb37461bc853c2a5ed3f32ba3aa29505cfb07b2b2c10b4580f33671d889747a458e5eacacafe2a0e7820ab95a4cd23786dc8005109950bdfea473ac80cdae4daa3f2d90d0d2791bbda3e337e50e2464705568e0bca1e1f383efe44eea4cd23dc72064c91678ec37ff54280e39eb0e31b53c69b636b49a3ef66e2a0daf7723a7b6cfbe3dbf24c5ac3332951b4b9a87aba8acd92aebabafefa71c1a28d6001d846088a53fc00cffbfab5f3ab1ccec48c9631688063563360d9511b8c3045e8c0883dbe1ab26e656d69c6d8fd8ce35b5be3ab168448946c1d5ea1155cf3b168a7aa68328115fc08b06b0d0af3d366564844bbabee401d506ca65c0aee35be26671fd40d47a1015579462b5fdf0272103af85067ceb354d701dba4df6826ef7ddb5e75163e685b980756599fcba9e982e0fc871bdc0284c931d7019c0bdd03046502ff61ddeadb125f43256ab15900b00875266d6582f375e96ec45f24fae25b771a3e4fba0bb4c057cf5eec032c48fb51909c71ba6f381bb8df0943aedc3521f179b438bc7876cfa5edd392be788c437c11438242c29d97843501ba1c12f45bf893589286c2342869efb9a26fc1f4e168456ca7abd7e19788533cf499db1c3e98f8f5828be326b25b1be7be1d4624fcd54b4d009adfa6e13f4c77a6e726c066632b8c9fbae3aa6ed6b8f35b8aa5ea8978597e27af2fe18625aea427bf78166c288aaf7330c955c119f70633213a4629e3b8c791a091aa31f9496c9e651bc7768f2a0c91c96524f3f37138230f67f0a494cccd8feb0550299ec71a8c320434a2b4c5fa4af46eb9ae150d38009b0723f21a3d8911802e101431f540aa73356ecbd5f86eb7b4a371a4e82f060848fdd4945166304bf42bc09a6fe7ac1b878d08962296faca75393d8aab405a7f9a180d449107c408748e572983d7976e624905e5af4301dcc9e7d61360c3e559e396249173cebc93b3bebef4bdce15f3d4ee4a85e63a8ba87783cf889c968a661b3152fdf22d7b05b7955c5480027c7a37ca42990460011a154a298d0c798afc0f294b5af53d14278aa6912f1438b239508ddb6b42cbcf3bc9cb56bbb137b62e6c28304c4aeefbf52887adcff925981448a7ede8f9bb31bee0d060c7e64f3d434f789288c17e179219a2d212522d0dc5bb24a1be3542f1057d24c06eed023e8e90b3050cf133de54d2cbbac46a3540522db2f184614ce261abeb210c2dd6fe0a2fa021eb0dcf259c8035adbb414c190edd21a9a21b107f0698ff512bfad260048d0095cb03612a71e8545ee2698d5f642aa8551933088584b64b8710e2c12f5f71e769df6415911365919b2e3231f45daf58a173f04950b682b198078d6ffe45703688a45a6068a492fe37a44dbb19ab3cfa56c243ed7b9d84cd2aef0804d0b763d23ce74ca20cc00a088071263298009a2b8d1490ab93e00ae2b6e5e2d33aced3ba3be8a4c48d6ad5e23f78509b1af35997da81cfd3889a8874dccebba91cdbd5d0bd6c18f6262a9c3da599708cdda88b34f8892986aea349d3e144316cd8d086c2bbee4cbb4f6286924f04d6d563c19265b49c157c56adc9c4b6e0b6aff215e5910852462bb352c13359900e1ce30de1a3ab022e163f1aa1d70183b3e15755b9706ba5744f055537d35a40455b2f5c8f5ea0d38f49630f8364af62556f728dfe93fd14653fcd6c8f3e4cec3c6d2e18529abc602cf29a5128ab7e9496749d678191b7454c78aba6f9b73f7659883df797fb29d019a2f995b503446bd579015cb14bd172423816b5e3f67c15f3996d9ffafa4b64222b31faeb5c11a3ade8beb2898baeedcff087b55cf0396d1185af2e753c97ee3e4df1e2d38321f016510f120dc317ffd8b037d7a02ce7444340b2f40b46439f003fc003fc00f20db08898db4184994494a91f0b90a9e754a29a59452c26467bdb01f60dfdad713654a038c0bbd0ae40a3ff0000f1e65052fa0418306196678c2733b557d375117f752d5ded4e035cee80449bf6ab40f61a6f7b23752aaa1a3c7183792042108018fd2031a34fe94543338413ea53b67d9748656d0065b8edd04c9743dbf23a56b82385f75bf31bde26f90aa6046264861f4af2fe6e095bc6483ad538f32ca3041dc6435c2e47dac8ec1312e414a7fa35266a7758ca71e63dcd841861f1e3772e4086658823042fcda7b9e332a41cafb323a36c8bc9cd6b7308312649751413f93aaae923209664c422b15cc43875b12e4243687973dd12ea5d24139e7751009625041574b5365afd5830441c6d349ef869c259db5c15636f8113974e840c00c47a0316ef4608c321830a311c79c513a7ac9ce290f1c5f63878e1a64941c666a3b831156b5577b877e8bebdb68e5cdbc1bebc1a3068fb23c7a8cf139cac0c18e0ef82288991bcdd3ada39850c181e3860968d050044185d6ca49663426a56283ad2d11a4a4675d41253522c8b7b7275353cae3d91d82b4bfe1d2a6343204a94de5d68fb210a4ae68f25fe4829493d54844330841ce5935261dbaaf92d0d960c31b04b137c738aacfb4c1e68220e758f7ad1d46e8e47d8d409064122df7a6591b6c0b0892f8d24ccac4f4c9b56db0a5ad60c61fc8baa275b4e7b80d36f743651f530e32f665830d073a703099d107625e8f9f8682197c20ba09255e29657cff188f3d905289ec7bce1f6b3d10d46952f6d99e910752d2b65b5df2ebf3c343878d1a7b763a6ed42083470c66e081609ffe267392725dfd1d08331fee6290ae1d72510b37af1b0d9bcb10cd4b2feba6779b5107a29d9c924b212c7508d181687953e5e867b292d139f81534d8b558e82198210792f6bf1853ee50d9abf303c3068219712067db2f4f17e7e26688071cc8194de60da62d7eb6bb8c08182d23021108410b22d082196f2048d319425db84a9e9433dca0b8c55b5bb77507f973b59f1d84120633da4016ff0fe77a3aa77c311b08e795a53ebbcf2935ad81f023d368aeccba69bc196a20272164f6c9d229f3fe6a61461ac81975e6ac35fdfae3788519682079e5dcf7619ad31178810874bc200533ce400acacb3377a96620292fb72bf39836bf5f06b20531f9982227c31d77966f1aef19b397b39ae5c6402ab50eaad7e4e26c8e8f30430ce4fdab581e67ce62d6781808d23e4d7d6fd21f4d9c0106828aba0555526ef3e65b84195f209faa5055d14ec74fa9612a84195e20576a8cb7bb632934ee02416dbaaad2f2b12a337a2e94de3df49d84195b20fb7fb0a4533ed47fd702395c56f4f8d99f910582baedb0a3838556c7ccc002b133687abd9baf403c6dc13f69aa6658811c5485cddb51c3944e7df023a041c3076f63461508f3bfb39e436dfafa675081941d544c98310552b814fd2b3b07b7f7a540ca7321140572c93abd0bb38102e9d2cf9d99b49241974f208ee7b3cba03eb64d4784194e20e94ffbf9b529f369cc0d1d31c831a309a4cef254db941e35f465cc600231a48653b26368c612c8d9cee28d6ecc0c2520a6ee5a632297669b6ee1edbe84349537cf4802c935e584abbec90ba5a6c20c24906256ae7c585a918da3200a338e401032ecb5fea58b59cd0c2310dbe282ca7513a6afec5106193dca50018f8f62904236497533fdf96fd381c3053468b4123e88414e9e1ed4f3ba69d1f1611073f65b966bd8cfa685c1af76b2743193c1a844c4aadbf2bbbb92be0ee6df6e3a25f8000631df4adf8785cb14471fbf20a7584a2799bae572a8b4f0e10b524c7e6db943f7743ebb8641e1a317a44ed1e2ac4c67bd7c0f5e107b3d6f776b7641b8ce31cc088fae1b46ba2048d31aae6d16e3aecc05d13c8a8f8e5e297aa53e70418a5f9d844cb79aae53fc16245d31e7d3bdafb37ebcf0610b62857ae96827bac48896868f5a10745d8a5715ada2671c8216c4600d1fb4206554f7cd156ec3c72c48e2f45f6de3c7bc8a3e6441306529b5d45d6241fc30e2ed475b1fb0206965fa9c4d8f30b1d6de14c353f8780529a911e1a9524c4aefc615249dbedab957564d3ead20cc6bc67d688c7a1f67c56ab16d73e5a55eb9a774fc4463874b49ab20bcf608b53a4a6b840f55902a85578af14985b9b564358a87a820dde91c2a9f5d0939df292c0dcb6f0bdf1744aaeba99c2948e69ba39743ac548ec920a3e0dd472908d2935dd568bc1069210531587888fa65cc18ee2848a374690c9576ebf3290abfba6bddf56eabbb366d4507a12a7f5ec772434190966a7337e936d8c8c87170c7e9b316d0a0f151fe399d2b9acafe021f9f20bde97aaab3ec8e1e3c706c8f316ec00007373cc0ec095245b3ac49be5e28173b41d4d0e469c9923a95d49c20e7f70d9e4628a16483ea6313c4a44aaa9a1eb9fa948281698218c4564c4a5a3ecf73fd0b1f9920bc88785d5b8db14fbd91031364ed7571d52d314d42a74600b6f07109521cdd4ba5e5c10d8420f02e4307f234b404f1f39a4a9e5e55829c4e5bc796d13335352548ed2dd641e9e02408a6ae9e63312589b63373ed44663f776c2ec694b999748334234138b5281b2c5ff87bfe0109c2cd574a5fbae2e5893f1e41ce59ab4a29f1031f8e20885a5396ce939255b20d6e046974f6c638f24c58bc8c208ed2fc246d45a6b77d114451bde39dce7dc187224872fb4c6afc1c634e99cb449074de92d7fb9e0f44903735866937bf77f73f0e4190f3a65312519d4bea862057c9dda45dfc8307ed07dd20f828043969ad07f57e4158b03e0841ced9ca3308524cba5d54ced218edfb100441c65f8e9723fb08045954f7e5a66ff0b8d11af80004296a506d6f960db61e8f831a3b74d44012b0edf84ec1c71fc89e1fb273d85eba343d089e8c1fbc80071f7e2068dd0c42ef89b7ca9c3e1054475129cf274d3bea071fb46b9dd3f014f75caa267fad0007192ed8d183c7153ef6402a2db77ad3bf1ec85d37dfada971e3eb3c90730cbfafb05057be7ee0811864b808edfea2d13a397cdc819ce1a5739350b51f153b104c45d19863ca516ecb3a9044d97c1ae57934998873f8a003b1f3c5331d6b693fa4e5630e04b9a0f4281dced7537339103344d96fefaac68e9d95110792f6f41acfd9ad538de040de9b939e3ff53d76fa06e2a6b60baaad33e9e7d7ca481d7cb881e8da6a29a6ef0e72d31c7cb401f598735c4a31d4a1c3288e0f36104e69ad289d53068edf4106f7c71a4841895dffabd97bf063a08d1e650569a34721237fd0e3f2430d97a7aee899e57965cae509add82cb2c166a34759010d1a367a143268d0f8410f1a34ee230de4d9e09a5d53afefbc03d55883c19b1f1414d4f5b831c68d31caa8f1e60725c7598ecf8106bfaddd92d0743903e1b47d127336f673a519484946f9e9acf09dbe29c3e3043468ec78b443471948b2d5fd6fbf94d2dc9381143edc92527f19035173c6ce1eda4c06a18b819c32a95590e6313cb76120494bb9d963fd4df960208ccdcb8ef4ef8ec9fc0241cdb49d6bce05e1c10f2f107b7bbde76b3d47641f5d20a5fbb421c4cf5c20272b75da9e944ef0b10572765c3ecfb539e73c7e68c1ae1d7935d77553ab4aeaef4aca66544df09105e3dd5c4c7399f9c002f1fbca73ca395a4c130520868f2be8f9b2f5d55d1d7bdaf1a5a3c425254e26bde1fbb002296ce4ae0271e3c71c5fbed69407a94010f931d409f33ea640ce1bd33fcc3536d8c8b89143c7183fc0a16305ff89068d257c4881f85177733d0761e0230ac89696b6975a796530b519747996755020787acad19a1784b013078e1be6e30904cf94939a4b95647eca033ceec3092479d574b95f671b32393e9a40d0f5941e4bbe82658e5350831a38f86082d1381f4b20adc7567c153da5a3ab04727ebc06fd64418b4ecd406b7c248118de39326ff6f2cff80712f0e30865637c18c168b4a002c5207de57c56b6fc5731152006d9e4e8ce142d67d1af1906c9f2933e19633705918541fab936bbf899f12cc120fe6856bc2496b2c517182469f9371a754de918adc02fc8ee9b2717a3e40bf25a898d2e4b3959a67b412add16532a335ba7245e90e7e5e3a5e5fc2e882edab7aae6a29632754190d9c227352763a53e41a8402ec822bf825413a23e861d17c420d44385aeed16e4948468cc6af94f267e20ae66ca525a1a0649e9187b4b85c8e99330ea0ebf9729fac1208fba8bb5d55b7947c020988b5dade875fe9c5f102bc7fdd3ddf8821c677f43781259d3f482144fa7247ba547e60b2f08d2b282f81cfc432ebb208d07ef18555d90b27edcd5644146577241feb1703ff6a5fc2ab820a8d4f6b8a35667f15b903caca5132364cad16d410e6f4a5da894b94d5d0bb2f888cdbb973435a6055983e77ed031488bef2cc875dd5956d3a73ca62c88b21743470dc68294e2bac590396cd0e2c382609a29e792d1bf82b4767d71e3989b65ef0a62f01df1eb657ae4a915e6b8dddc31775841eeab2084bc8a56cb2a885ffa6da54f45af0a927eb8d86276eb692ac85bffb95df6f734830a62a9523aa96f8b6f3a05496eee9e6b1aa91e3745165c54654ebb14e4bb70b9b24849418ab1ed63f76d565c47f1e8cddd4b2744a220fedba6c8ed949b46140a62125da5d245040aa2dc8ae9af3c665ffa0441ff73d2d6ce66f1f704419fda6d72379d64d409a297aaaf341127c85ef5e271e2bf499b20c9399d72708f268871aaa1a2693241fecfef8bb1a4b7a5608268d29369fde612244fff2b7ac4358ad612578e5f2b41d070e2c9d4dbbf554a903257cc761745afa693209e52bd5b29290952596c26cbf94c5b4682b42ebee1c3538a122141f4d6950ffaf5c2898f2007f7cd1c22479053a98bb92e8dc7d708926590592a668c20a6b8c9fd62761641d057aa674b74ca29751441501f679eb2e631619d4490ad846d58372182244406af1c3c999c7f0882ea2539ae63b9df1b8218844e73f771566d5408728e1bb36a8a0841503673293c6ade6710e4aba44bfc7b0441f8d2346a9e0904f1d369e98e49944a2f2008227aa136ad7f20c6ea8ab7a4740535fd4098ef4c9e3a55c4977d20d8f867cc3932c93cf28124e6c63d10f54c2525ae999ba20782c786171fb3b2dcf240d09c7fd793cae0e1b424bb35d5327720ad2633a161f79a4b76207a52f93a103655f4a01ea20361ff5a5310262f9b660e04213769fa50aa84cac881e849ed79a870512d1d07724ed9ea3b6556668603417bfae58b68d68ebe819416c54bab53a657dd40da515199e63db6d336104ebddba8796c209689ba6c2df649b33590ec42b95d279dd455450d84ef9afd98511a08e2327dfaeea08164328cbcd79c81f8e69b945015339092c658418fd0cdb29781b06a4154edd65752938118f7320682fa6c6d95b66bf71603b963c8d8b9864b7b87e1528fa361530c863c55d0544ae70ba478fffda03b96797a811446d80552d49071dde102497ef8b4397f0abfb92d909452bb5a0f26c23a2d905b54fabcf1fce435cf0249ae3267b8946381144793f6a045d6ff2b10e3c924e305252ba4c964ccede12a90436ac69a081dafa502b9d3ee894a27bbd94f812c2794ec59d3a474480a24d9a5d29dbc97fe4481b8f79a49e9b3b5190a0415e254aa78d33b9e2790c2e737ed7025e45b9c40da24dc538c9b40f0f39c0904a5737a0944fbb395403e4fd633a63497469340f69015e599b4001248725487abd8102e3a0b1c817c31f4d977ea4cf759c008a49e4b2ddabe47bdd7c5209d8db824be2606d1528de7a841d492ac8741ce33bddcdfbc49ae160639c617b9ee7b1efa0783b849c8e4310706a93275d6b1786ae2ff05c9c2fce7dc97195f104dfc5eaeef9899d20b62101973ce5d39e7215e90cce2c3e44befc6cf2ec81d9314ffcd9a6ed20539fdf5680de782a0e26c4e42797041f6a0c662e6bd1c53f016444f4a6573d5b598b5057953b4de9ac514d76a41b8f05acabb8294d398160493994bc9799a96c6b320a83393751ec36da558160429db31e937c58264737fdb9eefd29b6041f40d152ac3636aff5f410ea394cc267d5790aaf469fcda7e8d39ad20c8183b3b7baa4c7e58410a7a1fe3a918aec26715a5cf1f6ba9e4aa20774cdeae9e77dd7b2a08771d2eeb7dea5e1c15c4d3316550bd23ecc3a720c7dcb53fdb62e3495390bdf279b0123adace2d0549d9a557f7d431a7e09282b829c809edfc32157714e4e4e71b7497fb25d58a82d4258390f7a750902ec99853e53521420914041da383106fcf1ca24f907a33266d17be82fe7882ac2e72bac5d20972d229b74d4d7888137da5dd0915f74d104f084f7229af09a2a74ca6c334e9759e0982cc25ba6b3d78ba8c09f2768ee94ac59720e8d8f184e81b4ffd5a82a06f6464ca926569d34a906398678e9b920625889b53de182a9320dba713a3672409e2dd28d9fb9c4890da2bf59c6aa5fb1c4890f64d78da8cd5a59a4790477610ba2c7e8cce3882981f63ba5c55cf551a51bc8faa1db92723085f16836b2e174fe95c04315f52195d3bf5514e45106d35252582a4a7ef439bce393f4d44907ceef637597892661e821cdc4ec85625733f1982a839c372ba8b6bf2540882a7ab6869e1aa749e10e424eb2d3c752ead3f08e27c86502af53dd52308727e8cdf1b33aca72610a45c4a3fbe7f976c0610e4ec7c2a6b903189acfc81b8fd27b2837f98d1fa8194d274f584189599ed033128b1a1a26bf2ed960fa4b81557a407d9f4ea1e48994b574596e79b530fa46c31daf44a762e887920069db4f3cb6d8ae6211e486997a12ca5c9581dde816c6af232cec5965b680752cc93f1156cdced5407342555a2032977d2a596ddb6633f07f2eace26b19e3966480ec4167dad76d9234f7120e78a31959f060e6433f1fe2c9a3710acca54bcacfa717137103fe4271d197bb9f536103c68985ecd4c7173361053ce1723b3876855d740de9864e74ab25255aa06920ea24c03b972982e99bde12a79682098101a4c7a16bb78de19885697bde4986620cca813b35e9d43c43290d4b80519e7eff37a6420be5f8af1ca829cb36e0ce4d23fead7f2664f4962208aaad8dc48d1ce7d1808fa3a6ac7940306b227a562ce99f205825232e4ffc8244fea5e20c66031cab53e4cda5d20a798ca4184980bc577906e8124533c9490f57e49a905e25a4adae4629b05b29c0869296f4f3b6858205f10c2362bed4747bb023975f8b7ed921508dbf1726d6cfe5481943c8d2cbd29c62b4f055287b8b4a0d3eff4680aa4d23336ae2b3aca470a24bdb1d154c71cf654a2409613e7d9f269dbe250209fd42cf7e93d9f8c3e816429f773cf6d5f3c9d400a3edba7c27f4e494d20659015bef2d64e894c2045f91b1d11eaa3e59640ac4b5f715be6fba204d26a90ae49567a492d09441da163088bbbd02381a484b251395445e308c4d8dcfdaea782ec55348c40ccd2417e8ba714839c738d4a61ef62381dabc10c629083c86691f91f0661ddeaa48ccc0a8314d3a5cd6b5030486169f38a68f10d160606d973534c365e31c6f2bf207e88e634cb754fc284337c418e9f53eee8eabf239bd10b52d26a97fdf2e20531d87de54d2ded825cbf29e5f4df67e88298746c3d2157e6823877bd2da22de50ea319b820c6a0e1db53498fbea319b7206ae7c8784159877dc716c417e59d3c836e9219da60eb5a90375cbcc9ca79e9131a2d486631a724f2748fd865830d59306316c4b879d39d96cf5173cc4316844db183bbaaffc6eed86241d21b948ca91f3c3c58103bfa481f254f89f90a62cdea9cce783776f4485710840eb954dd5859d95a41fc4bdf94b7e229cde3c10af2fa777f0a8fa543ae5510f535ddef83d5bc75aac83cbe7e6cb150a682983aea59d296330b5254906e2dc71ff53a9e82e023f4c5f86ea9deaf29c8f9829e5a56abcf72762948eac3323c9385140495d15042d9b5f55f464130e959dd6fffd9414914a757119b9a730afb85829b4f3bddb7d2b9b1fc668082985f4ba72c42a8b7357d8298ed2c6e3f3553897190918304014a2027d794b45de454dc7c4920e65e4e9b357a1b6c87ee8243024176ae2cdbd01108a733b909b1f6f95d7446207d95b8985c648a41320d9a33e3e231e78941f49cf272a4360c92d6ccdd7557110649850b13b63507832465b582fafb769f161824f927527e37e694bdbf20c73ed9ed2a4d71e5f505297c873219937a41d277eb8f99d3fbb7f282ecdb419c85902d7fef822897eb3c48d3ca365317c439254bae96980b724adad29c8a31a75bb386d96801daa18284e35dc00ac3c57a971eb4e24fa9b9d73461b7b07254ecc8922d4ae234e8f7871f6bc1bcbcba8b99b6d95cd676d21ccdc5aa32182d88714f5c4c9f0d136c1664cf5a29eb79a63ee6d56441d2e199eaa3a658902a05fd4ddba72e270f2c086a33758ce625daa97e054996be75d8cdae20c7a87d213ce4887e3287b58218be4ccc749e8c15a411babda317da2a485f2f2a895ccfa9f2a60a524a271f36a92a1584b3bc262316b5aa7f5490cd3aaca720678cbed97e2f7e2ed34c41ae9c4669b7a60ca2530a6206db3319e39382a4e37a713ff5a320c8b318a63e89a598240a52aa3ea5297d65a120a89495368d6c8ecf1a2808ba4285934b514e5bdc3ed19cd86557ccbbdb6b7c054b4167913b6977b527082f3b6652d4e77471ea04b93ea61483ca1aaf5ad449304e10bfde3d454dbac9d35bdb04b965f7837f90124c1384f70f7af52aa76d19a560996034a8f11fdd9c32a36182a462856aedfddd8cb8a3ace0126ff08c212bff567adf12e4d26b69a9a3296f6095209dcde5cf4c9fae4e8512e4b158ea39ffa74f9a6493b8f63c5e5fc3364ee34ff6986771d124410c7a9747afd21609728bcc23533365902065bcfc2b164c55b04790c2a7d8e2d9a5329fcc1c41b8305a5246b7d60882f08a1e4425a931829ca59bef34b4088214d1e4171634868b22487efa3df69ff4ca7822887964eacdee1cdf694490821272656b3e0471662bde66fea4c88620e9b38aa954868dda168294f2c77c979f10e4d4207645fe8e28330d82d8e5b663671204492859952c0805822063834ae57e4a34e70141de9fd7b023c37cecfe0fc44f419c7cfcfd40f020bf748b95ff77fa40f8af9c838518191f125a433e9a760fa44ff283fa9c437a207e9b6a8afd4f1ec8b9b3a52aab3bb71f3c10e49cbbb78bc853fa3b10eb72675f77ccd36f07c29b898dbeef4be1a90329546e2d6d59b9394c07e28576cf95e439906c5f4e888a166bd5c881a08456d513af2517347120c81a4b52e752e040904df13e4a2f68bfcb1b08227a6773cc6e20ac97a99727759d59690369c4695f0b992b596203c1e4bf9fa77dbae8af81e85541fbaa3d86935103e946df529dc5d340b03c35e641763410d4964c2675b6f3537e0692106541c55b54dfe566206a65cb31dde9c52b2f03393cbe3ddd65d6759a0c24ade2a972928f811c3df6ea2521ff312b0672fae7a9a0b39e2dd56120f9987ec67c637b3d1888a2576497d8ac76cf17c82969caaca6f102a9cc4bd6c7d605c28b12a739ee3e8c8ab940181de3879fcf16483fda3fe6d70251e7e546069993d2952c102f05eff2a09bc4c4582068101aa47997958557c8345bd9f856209f6aadcb94ad5501d9bed398c65a2a105ccd329808a5941a4d815c992be307219f63a652202559cb3f1ed6c2ff28903447cf3188d1d71d820231e8ce9c8cb0d1314f20a9bf1353a9ea7e7102793c654b49b4b4bcdd0492901b64ce6b9f3e844c205e94919d378fa3b35c0261e582e7942fb86c4909a4d938a541b4654e7e12c865723286fe46af1c09a494d174fcbcedf1b447205fcb8e0e21443302419e95ae5db08a41ac20dfced3fda8d01731083a74c9a80a5254af6190be449eaacd4918e4127a7f2d74c1206787be112aa83aa10183fc19c5d7ca5ed5affb0531e724c7e4c50d4a4dbe20fc9bba28523c4f887b41eea0bf6cf4958fd2f18260df5fbb1aad2c59b60b928cba23db743c7c5d10be2f6e52c14edffeb920697d56699c11964c5c943c84aa3bf96e418e21bdeab4b2052968d9da9b8fe3a384e9860d1ece830c1d35aa6a41d2216c93521fe64b461b6c63141c2bc0a20529afcd9d85d117e21fb59b05713d53deec2e972c3cadd57ab177ad5913d10eaf0ff1d9572c483a96754c679c5213c2a123f1e05b4083060f7e87c382b4b142cb73baf881159c2002216841043051af70ec54c6d3e464ebd3f4bf3d647312a24a1d942b48a9d236fe87ef591eab15044dafd92445672e9311d950ac20d6c8344ba192a84abde0041118230463241a349a50ab2099e6524a9a8ee1339636d86ae02887aa20e7af17b5db738c4a056183d2b9c4da86aab4a382dc1d7f2ca9143aa5fbf028382c07750a6226a5e37b0c53b963cacb14a4917e2a6e2a7dba837f3e0670a852102df32561396e3c48419697f7534a95aa96f4c68eb25110467aabf67989caa7823b4a1424a137068fabbc4d4145ad478582ec7a62466cee75b82005346898152848fbbea1838d2e99f3810e534307a7e030fe387a9832786c0a6a506302f509f26d8d98b89ce38994eff68b70a8e007d50982f5c5caa4b947d43f4e105fb4d3b5e86c8dda047954a3cb6bac6ca5ece3418d1e44a134419cd73fb53bfb162a1304fd3973a88d274c9033a98b1784ab97e85b4fb44a930a9f4b869620d97797b097177152ab4a9077f53c3e8627f97592519420b697fe3b312653f79c04d1329ba9a7fe4b12c4d6585d29e662544c8a0471c52cd6d4251122870441b39c55ecfa1e41cc0a5ab34c7ae5d2bd23fa2e8d2f71716b1b5bf1944caf95faa4e56d04415fafefc46939a15646705ae3592f664a6d5e04295b7e4fbe3b7284488b508a209e5bf8d0359d312a291124a1ab2be3ba8908f265f60aef983a04796d94676c4e3204c13a794c17acd4659f85602bacbc4e4d4df55bbf93c85b8e1621487632e6933a5a28d420482363b5d76b65698a9620486a6525641cc5ac94b103a283f3363e508120baa6cebdbe1a0704f1e33a09a129a905fe0752ce1f2e5d5cadda587e20e7b05c4bab6ed94168d0283bfe46f581d85f1d664e6ed0b5311f489942add2d3625a7287507b20758d79eb8dfc94c4675350831a36283d10fe82e8d01efa34b3c3512a0fa4f538b5a9772667e3811c2c785cf9ac19f4ca20d41d48266fd73974b78306aa0e243d0fbbbbf4d2819c6f945c51b249410d6acca0e6400eba4cb749d5d6b8540e24d735edd3d0791ec23810ebb3e5ae913964f40907c2fcfb650ef506e2e9527596224ce6927103c1a4851e0f9f94a5fbaa0da4f194479a4c393b47a8d8408ea9e5d97378a798d5326a0de4ca92317f9e75f6a349825203e1ebd38c92993d89524a0361b57ebd53f28d5153d0408eadcdb19a6ed74b7706524a9a94e758101aca2c339084d08c99d425479581184d4e5eae74b1103a1988de3ea69d84b7a90e7f8c1b26878e733606a2a692b2c132f8c9d19418c849e59c4a64c45f6120bb25fbf1af4c818158495a85fcf777cbe2a0be7065675577a7bdd55d6a7c2e4d72637080031d386e81505ee82da5983a752111a549a6cfa4937414171035239f4d9741eda0b6d05dcaa556ded8ab5dc7965d8d8ca79cb9b440b84e9a99d6439505925cacef9cc7427dbd5820bd85940f623f74345a5720858b90d9f25b81947c4c63d01677aeb4aa0239d7a88d3bb6a3c7ada2423633da329b7672a3991f2bb3d49b521dbe5335059236dfe0ae2629903a77537f970765fa281035c77ef414f492fe408130aa828c699e40b69c4b393d7399d03881a434377598f0f7aa34811cab1f975267025964533d09dd6dcf1208ca5ff5aa5d251054da54a3b24920b68f78a84c425fa94820c7798dbd94d9b4258f40ce0aaa4209b18c4092cf207be3c73cf18a41ce175f9be6aaeabb440ce20114309c5136e3ae0e02ccc7058bfa0420f0031c3d6ce0e0c618338a062f0d93c0e9c1a38c1d0508c00fcc0c0500a0078f325a4080003c0e4a193818a3e040800078ecf85306d2b1838c04c000000100000000d080192378c00232c0e3061945010138040078f03034082080d2a3201a050840e951908e1d340e0080013820013b5e07a7f4e051a3c602001080061c006ff4e0c10d54468d1a09482590df3594aa919f538d9b0492ee941139f7f3400271bec48b4ecbf9f1311b6cbc790472dcd4ae9c7f1feacdf139348d40bcb3cb31c83a6d709f957196e377d4e0c10d54033d106ee02837ce93c1c3adc7183790c718377ae0b85186a9b1e371dc2023878ec3560cbcd103870d1ea5468d042031f0460fa4234719356a24008781356a200085f13cd09123c7e7380006a3c7f3000619397e81377aecb0c103478d1a09405ffc808c93e37318007b4152792bc868dbb593332f481d3cec54ed671704d51b366c2b6546fdba20c9d9a4d2ad99a6ef1d7341ee12dbb5a636c9eb8eb820c64adb4d31e7bbaa87b72055771a192593574a41680bb2ba9990f134c955ade440c65a10b59456a5eef68c9b327818079016dc27a14267b2d4d9d92c08d71f2a630d029405395bc72a95670c602c4871336f83aa2d99dfe3b11f405810d3d4a56a9ced15c9a44fe80bb71764744510b015c70aa3b18a53c5a5a25171a758dec4aad4f6446e5db7459c8b3235d9607b1d9417d0a0c1e3d014a4b0cdd7d5bdacaf9a5290ce3428b968a531de4f40521094ef7bcc201e1c05e14ba58f19f3c8c5f56880a22008eda0e15f63673b63287c6b7bdd761b9393dbfaff948d9a4587a020dea58e9c698fc973ee1304f5a6ef2c9a08f15df223a027f235ad0eea65d4a613975bbc868c86887f7e76ff4a9e2b9e0db63278d4c03620270823f3e870ee29362eda04a954a85caa746bb4629a20d798858ca6646a3d7d26487b49db54faddec3d6382743a75dad29e5f82dc7da74f26a5537eacd1126493c1fe1a679520c6c8eb511b22f3f5dda3a01c9012e4fad8399ef4bb54ab9904e9dec4f6cb863c39ea5a165012a4cff021323ac235d6a30c14ecf81e248804415b54507f69a3b4831012f8087404314c5ae9204fdf083755b4edbdaec4cd544690f2c8111393bda145e7831f4349b0e37b90e071b0e35180f738d8f139ca7011e4bca9f3a6cd0e69352b821ca3e8dce23da7c41a7b820e7840052710c12226a2ccaaf5aadb38af4fe2d247d3a64ec81a11418abde262eac243904adb4fa357d810c470a6f4b685f2605515820941b0f38b0d1e84a8c5100741504d213caa673ee00232ca400f021a34767c8f1b6e4041e065f67ae1b96d1ba775a149c818953cd7f736d87e8cdb017132721c0c84d11803014150b329f95bced1a4a5f807a3e107a3b17d383e1c8d3da01e1aa59b9e37e794077250f93da55fad56dc110f462307de61d10ea4d37361a3c894c63a180d3a188d1be01c4819964ee83e1379e9154026500ee44a613405d3793735df04c661d31bb3da50de61a2e6daf23c403890bacee4fab9e60d24bda197960d05ba81a4b477c6b4397fca92b681ec498fd88fea8a1d93029804b2817c2294853715b6324d6b20e8df0abf62f900f002d5404a7369d1b3e8e8387f1ac8bfba3986f00a5affec71238f0988065234edcd0b73a56383ce40d0b216cdcfbaaafda23ad00c44dfbd582ad23c9976ca40d2cab14a3c8489340b928178a51ac326cb3ee2f6319042c524aff2eb6deeb3c1b609c540fc8a71f3183605a19e30904aa8cc0ed234e9be0ac180aa271536f99af00be4346d2916d7c1f52ce805a285a98ca557bbc32e102f77cca97ab23be4023166dc9431f73c9dd01f5f15700bc41c5a4a63a7a0c1fad702295955cc31fb5f5221bcc32c902ae8bdd84f5d7e15be6b026281a4e641052d15c4557e77780562b2a4b11953e814d52968055225cb41b705391d948d55301a33402a90da94587f3d792d6ee3e11448a53387d099b1cd52f4500a040f3775e7f2398c02c1c4a8c6169badf8593c840241a6b77cc183873e75119f60340e9d40fe14fba4673e9315546cb0d51843c7183578dc50116013c81eebe1f74cbffbb277364026104e792cd9ec9d62da1d974010a64133a8b978a80492b0603a772e0f0f9360cc778578c8bc786c9c8a7a6abfb50c4402413b7c34cf9e7b77ef0e8f40501b4ad8a58c262a8dd4804620294d222f426fb018c46cb13f58fd88c42078f8e859958e510be930b818d66289555118a493ae2ae22cdc559022068370a33e6d86c93c79b60283307fe2b531cfb5e72cfe829c2dba9ec63706dd0d0fce17e44ad324648ea96f3958db0b62d0224f8926b1cb3944ccc2f1821cdac5c4532aa996f65d90f3f768f6541684d09f435d10f7aee484d0732a7be12023c70d1e4d2e1764139b25c5a4c8346afe1d645c090e1732b85be09a34a7f6539d33c916e47f4bf313997bf4c66b4110be6be93d8f08fd8f16ac967d8ecddca56bcb6755cfa88db0cd67cd82e827e3a8868b51a569445990621242da696c0bf258202c483208a53dca05a51fe27b05416abb8608bdbba2555790846d876e4d2b1e375e2b5a7715b1bd2c6f8d152499d237ca07bd297e661524313d4aa89b85eccbaa20d65f8ed07cb154104d96c760a5ab9e7d3d54902c445bb898a55310f353aa95517a5390dc63ee121d6e6e735d0af22775316612e19182944ac38f5555370aa2b66690e3b1a3efe7308f1305c963c658ca34e8ed0f4341da3dad0b1aefb62dae010a720a4ae7ff51cb17a1ed18f70992f064c9b46fb577e63c413ed341e54b19ef7c8f07d709826c4ed1f25b7ed5d51c270837db39778c579a1cf526483a73ec0b3e62c3f66c2b9c2608fa739a6e964dd750e14c90c3c2835d7fb492165c4c905cb32825323e5ea5ce25c8a6ecaac336e62c418ed6b656bf16936bdb84ab04b9e36264f5564d06211f25889dd9e3e650e128dc2408faef3f6d3c39bda7a427098d0431c82454a8cfae0b3a2408426fd099495b8eb99d47905b53bceb950fea457ee31c41fc531fa95d22e45bc3718d206ff9f9dea7dc2fea0a5af081a3c331a22a657ac382f9b708a259beea8fbf11c32982fc312dc7dd92ca722a1b6ccd814b04793c88558c5b74708820a9d820b4fea5533af8a88f871d82d4a73bd2934c162f8ef00c41d41cadf2831d3dba10642f33b15c6aaf7e3784f0cc5d6c73dceacf07413cdd99d3a758d1b3725979e00441d2d3f17ff9bc409063ce5d959348d3321510a4acae1684cf78e61c52e1fe40f24fabf4963629691a2e9c1f08c2cdddbffbd49bb4735c1f18e59e27361663a86d303a3e90833ebdec81ec71c3bc2ed5099db71e88a7eb4494a57bfcba7920c89cfa7eef984613d1e181209bae7288f4ee93c93b68d22bc6caa2313c3b10738a5be1ea5f1e4a5c07b4baec6dbc3254e4f4b5fb2a55a94eb2baa303d972d2bba352d017bde640f69c3dc5af94a8da1816144e0ee4d9d4da9549e8e2400eb5267e32f79492cdc1815c99d5926e46ad0c3b0dee0dc45c395fe7e78f1bc8e756213ea7ba0d24794a76e48589722fd9402a1d458718fd1a5bab5b4319b6e3557af6fda7b69d1a48c2334ca98c9a95e64b03513fce796800c29d8198e4d74d86bbd860eb514ecf0ca5a0b45359caf0d87123d906ae0cc4a4c3b5c964164dd9c6e8c081831a64a82e6fcce4cd4557546c3bb3a5bc3bd1dbe05106193c06f2c50ab1ae1bb4a3f4a871033b706220a628f129ba3d6ee02083875f18881ed7313b5ed4feaed8603b30102f85254f2bdd170877ed6db6b72f96432fe4725976e2969719e3c2e0ba401619b36767f7d335b2bbe302c9e4fc6d6ad76e0b0461a93288d218ee74f0fa92705a209eceebcbb7a9738f89775930d3c36a3364b556f7eed7a30839dd0f0e0be4281663df06f5967157208dfa14a32995e13aff9f1548afa354c4df2e9d7c7d5520ba07f10e9dcc4fe7141c1c1588a5f73a7f4a673df1e28e9b023163fdc8ece979669242102e0a896d0e0abec7fb9016e19e1000239c13c825473da6289ef366afaf096db873cb223d78c784bb259455b719eb313b8d56bf830b8bc6a8444de68202592c120b44028128180693ed1200931308001048200bc662e16898a6c12e0f14000367301c32342a2422181612148dc5c250281c0a03426130181c088341c13028009129356b1e939ea9056c921dfaf7d50efdabe187dc5f658517b756f198a760b4b183ec8f1dba16b9e2b0dc7f8aebe699c33bb6a4368609fed3c50a34b2222dd55755ccdbe84a3331a2f1ddee65de233e57f740c267bf1c957d04ceb3f83f3b1c7df55d2266b7cf49ac1e1dba46fb6730c3d288324673fa52a78716669c0d185dc794664852b6164e246350c3a1d532e0cbdb8880cb98d4036e89ddcb7d5a38d4b8eeb3c262c5e6aae5c1e82dbdf6237ed3a98aea33f03aebd713a646b0ef9d5bad0bcf253978114c96db21f3b991df261f8822ff2d05f6434c45e20bdc8a0456a89f0ab126b0def65e8796cc3faea66f13e6807792b28c87eaa898b916704560b96c380b50cbdb47329b292863b9f3ef067c84bb28efd5a0d8a18c51b02e9242ac44da189b75862f866f2ff412de44ffc3eb03c0011f4b010c1eb24ef88381a90e41afca47da0bbd118f0e6463cec712388cb40ce54007401ecb48216232baecf3adc4983cdc2bef109750b99d5f15465e4225eb1892dc0cf243dcba5217fe51a6438e88a04cda80963fa7f356b45d0df9ad89e87f5996aea0237dee7fc239a75f4f1444c09ed1079139d63617235fa99eb6bbaba4882c6abb18154c9feaebbae577099d07644198db8a89878355496e5d5badc44e814d3146429c77b1349218c6adb85c98e21127ac9246d6471e1b4680cd8690ae0e8d01275ae39217e97c354408865bc524bcdafaaee56eb48dcbaf48305b6832e313db5aa9be558734e4914a3282a6680426ee875b754d36c156975b55aef7eb78c7febd2f7a78c858a1b08cb4ff914ac6f1377f79256eb8ccb446af76814f6d2126c1a3a67b855b86f3955e9fdaef329ee74e2a91f37816910776f9b87ecff735fdabdacd6d2d7871b7276ef6ea6a89790b47e87a03e660aab9654ea5ac2ef3dab978ab8d62fa3e15a32b35fbc0f8cd12c732f37737e1cf11d00ad68c760afdb483e5386180d7924b906bd9ef0a7c3919c4f933e1ffe6e820fd353009d35b2123d75b02a91c6ece1e97baf6121f2d17de23ca3b5d53ccc900196248d05cf88316de2e447773414696a4c00dcb19d3981e74d8f46f55518dd5463ee0b4d4a0c853cd3f9e7cff699c3e47c02120e0a21a15e1ecc6397b582fb86907ced48edb7cd31f1edefd3dada273915e4e2e60e550ee9863b5556a94451f3558ffbf634c170caf25d6c83c12d21b4591e4b704e8d6d67ef098e36704c27ad6d50537cfbdddaa963340e4eab0eb8c60459a04753c9692181a7df180544c9340fed92c70e04bb4b8eb9e3fe687c2738ec510ca9af150412f1c5548b0778d8b28f72de65049690f1376ff2a7745bdc162f1c789f9cc71a6ab7baa788a12f6fb25b8ccd95a65053fb242f2fec15921ada1ae83709b840923f9887bb3612d2ae30a282625e1883fb136e5fd24a7c15584592150828784051198437db502ebb514267aa24ed0d219d0bf7826789c482f4eac781f61e64d7d05be0551148164c851a232e12144381fe7120fd038618d95ef2b9e44f4f6fca921ac8945a42abc387cfbefba4abc85e613975ec145957f93b9533fc0fba8bc785b6657e3438c54033d2b34cbfe423883b84629a5fe29e40c00d59424ffc5444e91c81e9d033b94415b0856fb7ec57cad3e1dce3a6ab0c40a2a7a197ea7b844c19f363bb1be65946c96b2677c2d46d5cdc35da65b8f8d2c02762f8297d4450e127a7218d6b890df37d871cc8b05786879f60a4ef8fc6c37a5e730e2ba17c670484ba4a772494d39eb940eb2566ae688ec8112305ae8cc96c786797e0613d6c3e742dbe5432ecc554272140c5e80817031ca4306633d4cdd65b80159bdd4d9515e3296f40eb473d76ea37e10e9242666d346ef5a34847300e063308220b55338c6e41d6863f74af02eda277029bded4c11eec56524a273afd49be877fe985d4913f225135da306bdd933c5ea256c2fceb636cade9c5ea4385c27d774a872ecbceb504357e68e2db605994e50771be112d2f04bac58875d2851ecd343c17c7a38d549422ab910840ef77c4c6d30117da965585a070fdffaba4f9dbacd5b47b232ff22ef7071893365151861525b58fa876e271e6bc796c75c3ac5a98208e4cbdb7d298c03d16646744ac386213f92f7cae77b28bfe1f914292a99b2546d0ca94e030854c98e546df46e2e2ee15e4ef31628deb891831e28dd3bd89fece76d2127ab3e02f1508f4bca84182daeba379be6436c927821c29632bc85da2bfba5cf97b1dfd9d1619deeeea3333e0d67510fd218ec8275adbb7509845b9b3e419e074f7e3602af9fe2386d786619a222fde5488bc48f1923341f7b227fbb9517fc63f98879512000eeab34515e2d3217f3ed93807e2f5c98352d12bf8e6764f26cc817bc04dd8ff0d52760eab957763f18f7a82ac1854ada511ca769df3885185d504c60371e2ec9255dc944b8687236390d7cd98f4a9d68bb2ac19c4ee58f0d3ba4714d064b7bb966e50ce791d117cc42ed741045aa25409ca4fda26dc6a0a9abcc681d98fb9fcfc6ef3e78937d0983818281b5d85ea11bd7f87bbfe5c397c2441a18085b91f5b672025d98cc0b5a49a000fd616b8fefd08b7aa9cad38c9719503eb8da9d2f51a0eeec59dcde4b9eb0e1a3733c518704bdfbd814f031dfbbaf02b5e0a487f77ac9e467e4a5d4926fa7a2216a3df4a826001df6ce939f445a6533197006b34f971ae3d8dc7e39d2f4667f01497604ae162f2c7542e65df16935fd486ffab362e2a9ebae55bff3ab7415a93da3219b1d1ac86486403136cacb4d6be63901fa9cc6123a10beb2db7490a26631c9f43c0ce575032bddf888bdfa5fcbd446cfa75393bc3cd257672c000f491feeb04804f0ade19552a03a5f2e706ebfe4fc9088deabf07c09520d469d04e67956b14720a3cf92ae50d3738477d7438d3c210598f97e9634c610e2373fcc4bd0f63b3c726fb144e40ad63b1b5410910e2aaf85137a600d5482060e11238b75d2b1d15fed822c03fcc4764273459c683ef1bd828e8ac42dc573c046fd373956a9bfa5f060cd62973fcf2054bc7deec6bcc0650fff0e9a36ee212c36d3016ef85c0f0c1755b2d0528b0a41da907ca5195f1781b81c4e17041889eae464f0ac51d83d8739cb25a81b96477a7c0d9a1240e17cf37f116fb1fec9703e841891ba28ce6ac4fb15efc96a09b8758b127aefe72438723ad0dd0adfb6d6d6621349ec7b9a1b6ea5d1d4853c863bf892841d76cb50a9d0091e36fda0119c24207471b9ba6648204b7aa745a0e0507ac704f8cbe10402248e4c2dcf1d0b7366ce0114510bb22b91694ec104b2c20e9a0c62b23b5775a17ddfb1d040463bd492b63cc6d287166224b2fd48c710858e2485374cdd34a21bc516f841c97b35e15bb18ceb93b9db34412f2e4ab0036cf5fd254d3968fa60caaf88722bca94560d5e726d7190bd3954d23d2c708818f3023195d1b3306bf7b723e8ce4dc8c1e8b1365c383395e66de0facb7e344854e8f69aa178146d0ec31b3f46fab6e1c0949f07858919180fb49cc3670996606b342d4857e460d5efac917516ff56170a9465b479cebb28d05aaa52b771986049ab6e726577059dc2a98ae3aef76f05b62bfaabb9afc8cfb2c8697c6b8f709c5b639769721889ce1ff1a022f86dbcba4b749ef270bfc5cb1354bf6ef6a18f9c2ddfe10971d46a8663b8a720e48776097e47e514c4fa9fa8ea547c26b8f4700f01c29b194574235040b58df1b7db5435059a82636b3e67abd91e32ed6073dfa1a585ce6eafb1bd79eebde40683ff578b4a70d46a58f1169b40890af1e343c3db285e078dec7cf6d83f892748050b13da805202dd8d8d6db1a2ede81376f521750bb48d293c0ca8c7add2803bb80748df85f9371f92e19d729ca5fcf8a33906e733f11e5843e1a81522ff628b940fc37ebdb002d2ade1b570a601d364e46f221ec74f403890f02fb9dab318254c13c82670acbd428b1376535c6037aed8dcf830cbbd2c6e575edaca71820e5753d2dd72578666202686ec9e8d8dbba436f2a4353b56e8f3a5b8757501cb9750b02aca3b6d5e12aa6e42124f3e687049e379d2a8df8a51cec8b15702c1ef0d914652161904bf73d066ce25963f0d80cd738adc7cb0b7fb102a29896a26f2fa4654c9a365340964803bb3d5a42627d9d887f0c33dc5a7a86093ce3a35b3d1e6a0280c4088edd39ecdd6b5cd1c5e79a13bc06ef623dc23575456195ce028f051117240af5a0eb4bd773bdf52402424613bc7435c1cb61d3c915b5773ec6bee98a98dc96929a30828824490b699b22c35b2e740ffd086508ac86db92e296688c0e1281bedd4571ad1370287dd18f0361bc38df084bfd0120f59c15d327341944d466804c8fed587cb3a09febb9187a40d0874ff56812f80e6ee506f73fd2151a1d396439b5245b602afc8e939d1d46b87e214b40d773e45feb822e6c5100a58e2a9f028ca29d44ce111181fa97a0708f84b79e80a39381645ae0b07eabdb52e6b1342c78804084e0a28dfce552c89046888fc1dc988465c16d9613e4c4d81f74d41f9b0fb208b13db987035cdcd5b45ca4b8f0123b28f3fd76d18cb9efbbdc49034d6319f042cc499510df5ad1912593c0cc7d5f1d043b11c69df8502d1da41ca9657de747e3ef546e9c5fff589e8dc18b961047f6e531334f4834ee0994e0be2ae03162c5384f1d29acea9bb8fd03ca69c1ddc3c15eeb1443036ee6cfd38422855d64b6489e5c6756435a0c7a1a2af51137e45387b30e9fc0c5fd322b4f6662903ade5058a55ac0f64a79ca09a2a5c5046dedba9e8b23401e5ab61099e5de1f62ff810d77c949f2e24ba18b46b58d750ebcfc1457651ce06182a50f925a44306267077ed810be8afe3f513d8502260dc3bd3a7fdbbb6da8d2a01e2bc378b294edc23b467b963ced4d8de244debd2b5e3ef3a6e4d42e7a5f7e210fd01e47ba1b98310c087da98d49b37591a401d6cebd7048d85c926e30525362103d5020d0ce43b834cb282e7f8444800296c50584dbd6cfebc5728d805a0d066abbceb2efb6046195a6f0dd7548094836128de2ed099b99d5edcb9134ce11ad46a4d6353279134aae715136f1a9bbf999c5c08a0d012d732cd696ce1d49289c595614e42a164492883dbbb533522298dc819adb308a15f4d4d0f014e18f25b8802c680438bdf90b2e6bcc405a5c4acba3389725eaa37af55d1a5b2191373ee610b7247e3b85ba5719c2deff13f076259e8aafd6b0c96dc823e718db1e9368ea4d2cde6a2a08e92a992e38a823b0c3748de7e6693ebd1621383a6b70bb24d514cbc6128b65f4da9c97622245e64e8f08a3717e6207b699b92d618a911b09ae5ebb8d986bc59ad168cc6dbe0c5fc4ef9043006939f18b103cea8520d364bd1f1edc06cf0522dc79a7b5a277e3297bcffc062012ecfd603ca07c1ac8b91c51a625490dfc48fcbea01eddbd6d738a5b91ec0606e7c4f397ca3b0d3dc7ad5765be2e80e40e051ff5efc2b113d119fa59a95950ebb55e236b279b53ebf4dd528f95a7bd414bb3e6a14792eb5f425bfbc142649179aecb7a8b27e5604266447ff0f12b6d5ae464ff70e6df144bfbe18c662f9ebf0ce564d889e8fadfd5b6d21f8f56aa4f397e998d9529c0a9e7d75206c8350c9292304de115f6d35032886ddb30136983e10e5ce15ad2b836746ada77d109e5d2d25da8c7de18ccf50f9e8a997fbbd7da865c452eacca1f0acee2ab2fb28acabefe8bb17dfdcb91b73bf0bc288140a6cf6699f9fa0fa07cc00c1f3c6470ad4e0074a4b121df31607eb746c8c54dcacbee4b8263b387dd9917f2497b693f66948568a840c2ba5bd227429497fb0f689e817bdb51c651ee82c8628e423e1c46af9e86c61b00093ac06763fe4609a10670bfd7e3de9590567d751fd346ac95822413100d5cf5c521ef75413b2b21587f2b290c01005140ab2d01f247ec373661adff6566140b55f3baaf937f1bd3f4b314bef023aa3fa70935a7ac45de5d9f61fad9abfa3c043147a165835abe23ad5b90fb3326bb602203d2cfa5476b23d1cb681bd8eea47e1bdb802d3b91f5ad78c5331299a51113344a395b7f4d86e8baf501dee94b9f30a9b8f7678831e817e2ab957ccc2619a1394cd3fe76eb15ad2bf67bd4386f6c3f063bd79918a289c291d8c9242a7a6507d9fcc8499e26bfb45a8c18168b9d2f7a2afbe6ab68ca692916613f6a18fc002ea8803f924bed9fd04270154e3a066e304034c6010ff242d2f429b651f29dc0a6625561f7033a2fe7435a12307cd03ff4bbda6110ca434e491873d71a519c980ef6e3e5dd2661753d1aaa20245864435ea3b7af8c0b176692398afb84a52707b5743eb6b8a0653f65bcc39bd5528110dd784697f81d9b7e4d615006403b0a3999b2bb4013f201013a29e33e81466326eea68189462e6aa13e86f9bf9056b41a606bfdca4b1c21820502f939b78228a48de48d63dc5616a34400f709562c09a7686d6c4e003213415f5d1cc78b94743e9aa4b200f971b474cbe6b640627cb69818b86443da1cd3063e5d9afedd0d5cbac09f59c689e43cd19be6c4dc76841bb8647459e612e0bee3ef6121b3b8e94a91084b0c133ef60ffbd804c7286411fff0ca1ba5383faf1ab04237f37557d0886246b1460fbc17302ec6477ca99ec91ddf9ff2469e4a1520f2b10ed576d6498fab84c16210d20cf596e2b0166fe3ee4564d8ae6ddfb11c96470e3f409b66fbad3c81a9ec2a209b4571a16dfb4d81a7724758108a7bf8768418e45bf7bddbe9bdd2276b992550ed12bab2bac0d3287e17bb823cabb7381a31eab7aa1f6d66c558cf10da82affe2640e29a38144dfb7a0e37630c443cec076978179495d3b0324881923915d4ac164ef42d504f95d4547760a0d4c35c4a510c431913b04896f76eb937edd710598d466801ea0f24d432ff701559021a261725ff7d4826115a302ad196ed28e26274d8e3446ada9e3ae0742cfb24d8ad3d9117f6a34794da751f5e51886d146859f0091059fa64977da7d69a21d374a1a00dbfb5648d05473a1d7de292d0008ebd2cdda862900d7b772a13b27d2da13377f4d57a5a10857c7b7a0cb65cdd66bc7e66346d739b25f1f317f337502a6e82c95d4e60b53a4805cb77a4c1e27ca665672fe96a03a5d33c0ccc66292b8fa2d6a581f7ef9d59b20bad52b504bee8cc52b4d4102cdf8eaa87e2ab84fc351b40b9097cf69ce51bf1f77df4b2cf0d6d3d70f99df1aa73bc18b2748649381ad6fe2dadd4d1db85fbbe917753badb717848bba399102717ad72a67d37da5ac0a23126a1e77cc42fe83f761f54c25f5ee2aa18f692185c0063439eea3f57870cd44e2c87f77c8bbe9a67a644bb59a4d07ad5fa441bb578a846256360268a86bd624f492228400b3a4a380ea1ffe38447675d73a6dd1b3ce3caad35cf4d15fa7939a9697cecb3ace0f3649420ce0f987357779c07a10e0203e40b4a8836ab4a6637d852b99633665e85e116fec0dd97b27956b99ab69ebf5a7651fa8e26640c0ccdf43303fda234975a7ffe5dca0da375d2a98f463dc4a162bc416013253b74ed9faa4795fc242ddadb79c2ac5cadd36211e4035dc36af08ac2a1e8136f8ca0f0ae0cdfbce9b081e0353df5baeed320ffd1c87ca038a6307671bb26199bac09d4d7b03230936184815caf56072d0d9d96cce0a51af90d6b92444c099644b266bcbd544e299b9f78ad03a314299905574a8e4bcb8760457d7eed1293309e65958ce752e14d83fa62ccb57726a0b3562550e5198400e737746b4da3b1b6575dbd5f526b9a216dc2be9034e2f84b97d9c8e2f3d32ce459c4ca7b3ba87ddf55bacde0ee00a1d1c7617b2443d0753016f4fa69466a3b9ac5cccc2c45ec53d9d50e9ac0945d11004a2424150ebb74bc4ddb20b411b94c6e5cc966accd6c4944e70c6e77f45c7b586e72de3f0850e0284fcee010729cf8a08b5ef3b941353a50acc2a6d060a8fe2c047f83362d2cfc1cc4c710a3f5d7b49d0234784ae090d8d0971fe3198dd797c3b24df315cdd074cb399078a305d4f73b0c00ff9164880b30db280ad9f878547642dbd130fa34dc74b7a2a0a39503a2cefde7a1083121a266d81d6f83aeee83ca75de18b7585a4b9d6240f04688b97ec14be987a3beb00789ee433e960604ff91d80792636a4baff41709e05a7b6bd4211726b8d43d621140b680f89210a5c24e43773e39f73774b7288a859f2db37dc3ab169b1cff1db7870272cbd1e3694105496deb2e5268f5042dc423d1d0264fe2a8341e5b3286e88cc7210c90d3e9386f43bc76b61e0296ac54f1079247f385bf543c308473a9e1a97a88d9de21b99494e75e5b55573d0a5348572554d25baeab9073ae5967ef492ae403fb89bbd6ed2279a42367096c0bf4e0c6b5f3109ce552b0bc1461f781d7b59cdc90f5661287684ca5544b8b3a79bdd0f9b2ec7e10baa21536e5bd709694d65b9f2d5f4d555a8eaa75b113a5e986fbbc9d55a8f664cec5d0989f054a6f00b822631df992cc8afb8ea7b40c885bcde8ead63e693e327ce42a9be3092b7f13eacbbc9dc6f521b297bbf931f4c1c21dd04d0782ab2449c1222ba8d768e6212d30ba1c753659c72ebca2eb0a7eea6698ec4cc862ec931d1c23a9ca4e42a540bf38da56802c4f5a63aa8fd19368dbeb468e821dbd56410bf8e22acd3aeb354ac88e4370128ccdf28711dc6c578984bcada35b70506dd1cf986081b08a2a0d8cbd95e68773a128f5194b69dc11c21d4b10d452285e22fd4522ea316c82f14ab889d7cdd11216dadf96a6c44e3933cb169c8f5292e2f60abe3c9a8d4ed2565c658404cd759dc097bdb0a51bf54ec9add06b4020add7374b9b33a2c6db36491bbc7fc69903150efaff1d5190f76a1466a2dcc0038d3a240ea1469eb66d3a369b8448ce18f5e426e9b2c4c1edda198d76bd27f7bb709d21c332636dc12b7b0052f9ea81905461ea1e8c1121aeaeff866e0b14a38736d9c9919199c1c4f144fc6de69cfaf62d5de22e263e4f971dcf629d89f6b934fd2a79c9e74136a9ed779c344ab78323f06f508df444e7b99ec7d3e2825d51b6efd1869ce3436324693c8fc0989a708598c05387b71189e3629fcae7c4ad00681d83fb3dd1014bbf6ab8cb00bb579a7e4ac514f493ee5c6de9b33878750a5ade49d4388711750318a730aa0518e49be6dcec13c53855caa13eca6328eef713243574ab14db0d8c76c8de9aaf636a0e17d774996863e2c4c57ada5d50c6b2d81fa74e308c331ec5dd145942032e071d539b74e21c14bad6c230eae1ac9184e63699e3daa2130731382b76a205e069c2e511d653fdfe3d2a52e2e5b75fbaaacd3e5ed909801c3a7c6fc3551073bb452c08843a3dc08daf0503e4640c5edee7c526035c9fce789d383c2d90e67862d37639bf756708012b4a811b84e3316284c1616e32281d6bfee56965502a360f692c8c1b7b9c210a8e5fbac96de5bb5859c6158c878741a7bd733b51015328952aa67b897ce87be4c91666ad68dd4d5355556064f988b6382b92c29251947ee71529e01013bd7e245babeea06cf708d8d130bc5b34172bd7643c2162474fc53e5c350b9855b8c12fe1d8cea13b591c48924584b26e4b4791f308833de053eeeae4e4cd4b98a9464de54ac18184b1aad4fddcd397a65fa0c1c240049d584701c448ff707876dba0687d1e228c743ccc66f91028c375e89b28a4d73ae006d1331ea707907de43ed431d44897a6392bfe12b6cc0fdf7a470d082bf1435d3b0ee659263edc8f106e5deebfb0a29a3c8d4b428998109104443a0a0e94880233a88c1e9b0ea03c58e929f8c52a00b7e96fa20739ee1bca1a75d1c3998445aade80197b114ae72c66102f514dc016ec6d8de89103a72a8d5d44893517aca077f171ccb92f40006632653bac6a3c13762abce941af1f9de619eb1a1226277d9b26628035e9296308326d5a9f351f5310699cb95cbbbb00eeacc16305cf35a0e2fd21729c03a85823834e00ef339fa06622927d302ff53202765d126650484e9616259bcad6205f7e0e9732bb650628497d6943318afb39c305d008fb370f9d4dc0cf5db9bae408df9da9a4842149060260670c33b03cd516db7cfe6983d37efa44d388ae51a5c1b0a841e3217772f3ed4c1ee73352c4402e72d58539c639242ae037d855a05ee44edc824850ae7baa7c186f32382ab2d280e62a9e973788aaba142e4c5f39598931948318bdd3f05e2b6cf12c019d21e42900d91cf7d085351b0d9865a17870c4bf5da7217141a267ed5965ed34f75fcd46412927da81da2b1a058e70eb8ba30a05a77986ce485d25a4b127ca2f675c1e6888d15dd9d598bce046ac8a878c0927cf117651c710aa868d0138fb81d3517e326fcd81680f9751dd8d1f2b4abab3f70e4faf06cf8f8dc62264610711e51a8ea86a0cab45416d8d56cb7546c2eb0817fde6e8b61353c725d282cb06a17a1a5ce899574cf25d1412e0af1a34874c5a5afc9d322af4e5c38eb23114ce698f37494aa99966e67010f6d30d81e4d57fef3feeb0206a75e5334c0fa0ece07152b277100c867949d0558563416a85ed687993900060299077fe8c15cef003d5b928a0ac520f40129f069ef8ec98803676927fd18b7d050e530b397e12ebdbf4e67085a8756a06bee2b97e59d24911f5d2726eb92942c3c5793cea5a6a6f0f41eb235230ac5219e7dff7a280054b7fb05d2859b0221dba8394df9f1fb59fee6e6944b7022c57da72035a385d0270ed552116123eb9839e63124630271b838087dd3a064e40f12f5d2ba4462886faf695274e7c6605ede79817ebe05ab966bb35ccda357d488b1c7590be3000a150aa6376fae4a3d4b9b46a125d08b92384442ae7a8806ec6ae00cde88d3945063022df334200c090e72329b45a0007115788ec5638e1295f78b5384fbf6a5383c4e8b7dc020a58d968b4b28447f238ec94731f52bd83c0cb944538c4c4ba894da9380358d72c451efd333bba49263324b133c9c362b44c2c55901895f2764580f491ba97e4f6148929de6e81db189cb1e7265fdf75dea4da87f9c1dd03a9fa8f4436e38ce7c8ff50866cd1e0f2f52f693fade836b9f4d92ce8e93a5b7f3a0134d7472c26c0598b089da508fab09e10a88464d6b0e2f0b96b01df275f25701cf6cb00878feb3358945dba982c73b0c62fe6d404a5f26ced7263aa59de64489eef6d5c0056b5270f18c0c262f957175e613e915875fe894393efa06114257ce349a8b2c5b61a6b396334456e16d248edc126f92c39779a7cfe5fda325a3d6ddcda51a86af5c673b40aaaea232d2a7da99527fcf2e58d570e4e21844d250c30550be06567a8a329ac9cc81581bcacd1fdbc92c02fe3b5b045893dd7d764e7f7f811b3899980ecc94067e21a742dde7ad8d51210ac0378072f3433fb3f7042e3ad01ed7f5dd0286a3fac3a1d9ad14d625e9fda5a82672e7264c69e79e259926b110803ccd33dc7c05e9ed71c3639bf0e7c74af985ab39060180c7fa627379e38e4a31be87b446bfc5a857b103c01906a08e6187ebba2fd528623a0360c2f7352a3aa501aa880ce53c16e8524fb59c100531a087e6ef2ceb8e47e17ef661b9ac7ce125d148b3c380f28c14ead0d67508582b7a0b07752c82634b92ea35297f75137efdf4f2624ad24c2e75f34f68da16f8f5db5b25fe09426963e9a0b4030a35fbccd12c11dfff20c344cd0955435d5ec9d8d60613c8eca874f999a7989d45d6e046d078a3c44dcfb94178ad804ddf7dee6e95f986e81194349a25c7241935473fa93749bb212a397f1372fbb9922d09b266c123064cf984108cd8d428bc15b4171bfde1bd0acbe0eccda7ada25e24f85860bce4b29061dd09fb81379a4fea9f5199a4367e41057c17caec94c6d086e1ccb867292485d61532755e8ea441865450150c539bf65a07ff38f668929fedec0d21e0c17906b36623020244cc7620494f9fb6ad8872a50200f40ccd6d6135d580626926e34c628a0c38a8c5a4c237eddc28d0c17055f7786127d69887a0c78af9d3c9ed2c57c457c26cbd4c512e3843d42072d3f0bd3617795a2744c7894616166a4ac9430b67764ce5e01525b57f105d92e6393b272190e4a4e41d2e9ebe324e41ed1934edad3a30ee2fcde0d01cc3a85d986a7a72bd012271b9541f5178f07e6ace39dfa2804495ad17aabc94dcff0d9997703e26298167521dd45b344210b327e91964e7ca7e76053ddf4548e0ac2cd5c8a70cbf746d0d2aa4c87e08442406010c499842ee1402a8f8551993ff7414434d8894ed0025fe40f9071b16c4ac75c0b1669954ed6fb2", + "0x3a636f6465": "0x52bc537646db8e0528b52ffd0058ec14061e1fc81b1a561058c94ad201f061a8ff30d44fb17fa8d8024ef90ba40f72666f9657cb8be5328893a4df790e76b48202873c1d30625cdb3348b975613a689769a5ec7ac1b9001d191a7be9b06d4c1ddbd692d60821ad1142f6de72cb581e24187318fc19cb82cc137f6339c9c3b7f94c5a209827dec6ce6a6c12518644cc69ec8cf5199b440e1912f2327616b33acbce9aaa884285285580f972061364927be0a50b113421051831d0902121cffa0cb43c98279e65672bcb92270036e471f9b3cde6609ef8cfb6240f7fd69607e689f7ecacb349c064486857d9d90c5f84a1042dbee0c00b16b2944de232246cb4000a2560010f944821093224fadb679c85314ffc66679a65c9e363c31c973fa3f6cc133f2d2879f8fc26c9c4d33e6190708a4a02a508d87fc7e4e5043b26bf73c4962bef754c5ef9ffb42cf46ec85d79f9c93b12e9882797a18cf87243d6956fe1329411566ec7e29dd9b1a61bf66310a3685d41e68d9f377e08272727a7db739e3f20e110777eda23a378bee176e36544a2e3cb3b5d0cbddb3176b136d40714c62b2f0090882dd7b517ebbc1e0321452ff768bb4b322c79bf25cddb7297bc15032145a77b1474e3fbfce1309de2070474baf15ec7f8b6d38def2c1d5fae63615f9efbf1a17c276b00c0bec4a16f242dd730be8fc8e2c97525c202c6f7a58cf15df464b45cd7a68e471def8420372ce49aa7cfef3807a83dde7804c85046807119ca08263764ddfe8ecb504568b9fd0dc5b4f767c7b8f7b9aebf214ed3de452fde2e7eda3bad2ac5a3a1d9b07920e0d51e3f1bf86aa17723b561d3a51c7721c9d570de705e49deedfc0dd10b75d7f1276d38bbf25c0d7fb96b35e4860d71b987dcb010c9e51e6ae78685405cee4252d6cd1ecdaebc56f972357cddf92e7a5be5ab55befce130afa4f5485ef959b961d1ce86c5835b944b8ab8c204325411615cbeb08e855eab6321ecf6fb3d456471fb341debdbe7fe89b2f0e5802382c03e7c85daeb18bfcf3b6d8d725cbe21a5fb524a19fb422dbb1fbb5bbe658ce76eb4ae20f1f351da30de96315ae9b808c8504e5b2ed8313ed7318672ca72f95ec7e20fcb429acbe71d8e31a86318c88fe754c71d8b1c2fbf6371c7f886dce57731c701476c611fbe5de4afdfb5279f4384059c978f97df50b41c631c60c49586f1edcbca0d93efa4176bbcfdf5f99b961b26d4fc0dcd86c90b75fc08d074fbfc0d35c51897d0f14ef82bdfb10eb0e31c20372c04af7c3c7f43f1f1fb31849393531137be6b6f762c9ecf1debf3f9e31a262fd4b17a0d9377010c69ae7c7f3ee4ae7c47d3b1d930be7cab63f1cabf3a162fdf45afd531bef2fccdba64e3263571b7cfddb6ae20fdf9feb44af146cb0de3f30724be6dd88f176aa1e61d698d7ef94653c73883ee3294131297a661f1fcea988bf11ac60d0b5b379e5e9a86c5f3abeb98631c60449586f19d0de3f337c40de30b35bf3aee0e0918cf504e4c2e9fbf8e7780f17c4e1151915620e1062aa217107d415485c8044427204201110b88524004065117445c103921ea009106889a207a82280a220ffc78c28f2010352172222a822804441f209a824804444f88a0108180888a1f50f801e647147ea0f183083fc2fc38e387193f8a40b48468092226441c2072e247971f4620828268033fb6fce042c4c48f2a3f6cf0e3054325f881811f4f3f94f8d1e447067e74e0c7921f49fc70e2c7124353184a6388073e9c0ce9608806435786a286b20c913134860f2e7c7831c484213186c018f262a8054328a8c1083ea450c3151f3f1832c1d0173e60307482212e86b0187262c88a21110c41198ac20798210f0c3d31c481a126431d18826248898f280c2df1418521a721250c9d3184011f55184ac2d0171f61868cf081c650113e52e0438b8f25f8d8e2c3073e80e0c3043ece18ca6248064360869e30e465a8cbd011869a3014852124f8f8808f1ed440831ab80ccdc047121f2aa8e108354ca1862e3520e187121f28a821093e4a5003157c8451c30c6ad852430d864250c31843521872c2101a434b1882420d64f8e8a2861f0c11614803434b0c0961c8054356868630d4450d3e1832a30620fc38e247113e9430f4031f4e35a4311483a12d3f9c8680e0a3882123f8a8c1501086b61882c18f297c440d41fd70f2e3033e9cf0430a1f3618e25283193ebafc88c2c718354861a8083eb690e54066031919b228590d643090c5404685cc0b5917322e64536458c8ae908d21cb423602d91432283231645464289055e9a1852c05b22d642d906921fb804c8a8c0441690409212808413e08d212b4842025049d116484a02204dd20c80641514135082223688ca02b415d8292108484a023047109ea41100f8276109425a88c201d04e520880641330892419095a01804c120e8054155825c102446500b82a08254109482a03082c0083a41d017415482a6046911b445100982ac0812419013415082b0080a41101541530445096222a889200e044111d424a803414b823610a4812026411e085aa247147aa4d1630a3dcee8d1a5c7117a18a107971e50e8e1831e3de8a125e8498f22f418a3070e7af0a0c7951e65f4c8d2430c1a9ed0634a0f12f4c8a207931e4cf4c0a2c7067a38d143033da8e821458f297a34d183033d90e8b1a447067a28e971448f24d1053d8ce8f1147110b5a0a10a3484a1010c0d54a0010d1a4840830a68e08206283757542f68584243062a0d6c68513d602305364e90f3c58617158bdac4f5e5460674fc4047161aba98610a348c20da4006269a144057bca0b0b1041010805ab0238b4f01aa020405e4820a06488ca02880a80041a14ff47c31cfa0010ae8091015373010031ab58b186610830c6280410c2588618b9b1ce444c10695183e3033450c1ea036a84c54316c6c618304b505b506373aa05aea939f26f090a207961b327ebc501ed415fcece007073f36f8a9c10f067e32f093e407eae72906853a8558989f247e9c7e34108b820b891f256a9898136269fc74113be3878b1f2a76601193420c8d1f2b6249f859f273c50f077ea2fc88b1430431303b9c58a78ac649f033829f0ffc40f173448c093f1ef8a9e2e7c94f9363115b42ec093f1df831e2678a9f287ea4e8d8c1e42206156341cf9586da92d8aee8c9406c4a4c8b58133d547033868d2ea60a60d0810d16dc502206456b117b22e6446c033d2ba854ea0d5ee080ac0a1b2a98556662b0c34b4ccb8e2d3b907023891d5c7090b183073b76b023cb8e327650f9616247095c4a766cf183c40e2baa146a147684e162f2b3811d27d8a1821d29d821c50d253144f153845715af2931800036829e1ef46879419139e3e5e4870754063f39b041c68b043a9af07a6242b16182d7162f3168143e2e78bd60c7171925d49c4087971b2c6c80a1238d190ce878c20b043d5b6c40bdacd001051b5cd8f8228709ad49cd151994d470c14f106abea81fb021464e07a6153656508305365aa075c0c6142d4a8d16d4dc40bbe2f5849c27bc3c60230c1d54a84bbca8984e08e049004a7e44f568e046053726d011051d4bf86942471072a011802902e024005104a049008ac851e2a382fa44b5f2fac0f4c0ab891e1e6850e40766baf851628b885161c715b126f43099f162c7142e257a9ce8f140cf931e17f45451a950abe04aa213454f183d57dc4b4f9358157e852b899f275c18d099a2a7033d5400b1a0870b58173d5dc0bce821016c8b9e2d605cf4680133410f959e29b02f6025e819c1ab062f1bf444710306375e70c30537c4b8d1821b556e40f544f5d4a0678a1e297a40d003850c496a153ab05423686c407383ba4595014c053f5874a87849e185c66b0a3a4eaf28e81cf1a2c22b0d1c2cc021464d0307140e18042581c34a00a808c093d9a567091d39c031858e1be8e8810e20e8d012b1e8c0818e32008046cf133356666400802a56e862052e56d8a206043b4670e38109851d19ec58d949f2538435624715b12e3d4dbcc2fc30e9492256458f123125eca022e62536851d4f80aab04b809cd8f0e0670b0c1ff8f901a8031e21f870d153460c4968d2a01f8801ca4f0f7e8c40c3143f59788200c3143f44e8d9418f0e62a8824ef12a5427ed03af2c7cbaa8b1413d8287192f2936aec48044cd184154e0c1a522f1fac2c692a02adc78ba81c4b9b816dfc246c9b3702d712a3a7ca083072d78b9d9e24608366a7083854711aa12366270f3c54d102a0e6c58a931b861417d414e12358b9e1cd40cbc9ca857bca2d413bc6450adb8a1523b70f3821a461dc18c12ea954ac60d09ea0c7ab25428394bd431621041d5c08f960ac5eb8a9a829ca7dac46b0315052f2e5e556ae4a09ae085821a552a075e60d480d249a346153a4bd410818e123a1ad061a286077498ece042a70a3a4d6a3801ade005c6b504470b7492bca0a0d3011d2adcd4e015c5ab0336b278b5605611948197143dd07835713db99a7071c0a581d6132e267690c0f585ab033bbcd821c50586cb033b4cf0e3842b0c57143bba706dc005c50e2d70ac60c7949f253e82d81757065c4eb89e7035794d51a7c8c140e5e235829b2639566c20901e78994046b1c3093d60e420f123021d36d8f1011d3a90e960c717ad325a3a6831d15ad272dab2b8e1c24609c02c37536eb2f8899201033f645416fcdc4006244e056d04406000a100288c4ba1418a16030d062da4617304500a66b8b041e251804c1043428f921ea71e23ea135a90420b54b0490274829e2280bea85f2a145a40a38530365f6c7e60c3e455859e0dec0041cf921e267684c0e6099b246ca0b0e9800d132d4ca147123d47b450851e1db0d1808d161b257a30d083444f129b0cdc1861b3011c2ab05962c3019b252207a217345ce9e1400f256ac2d454a1c60b900a8042309b5043f063460c49c4a0440c606288420c1988010a7503f54993721345abe2e608375a6a946a8387a969a246032f26740334519009d3c309150c1e4de440a10714344e5e68e2850dbca0811798cc50e1a60a2f383193862cca8f101a05335d66927063c98c117644d90165c604b123cca46066063328380866a0cc9460c60a9d227a28e1456587146a884183031a2c3a46f43cc9984066821c66dc74e0268afe812c4b0fc1e7055d4667a94e70a410d3c40e307210e1a60736503063c4cb8bd71843557810614eb981c18d16af10bcb088810a1a851b1cc4c0643ee1830775898e303c8c20a3bc34a04541e60a1b32982fa841c14d149a05b02b402d37503736d021859f326eb8dc54a94a6478d231055918372e006f70130648460f206858dc649924d051851a31007be03306c88397152905670a431be07104300acc010d147e205143155e25a852c440022d8b1e5b7e74108312cd0b1b51da16373ff819820f952027433da0504834a69218522013c5d4c08b033e98403da051090a03526128cc8d19940b0f0fc01afc48529d88e1c98f0f6e5a50a9a851f89062280337377889c087941ac2dcf0c007146a10c2901635604c304d82a1267e8050c3caab0bd90a7ab06088caeb0958c64d0c2a086a20c28e93cf1631a0606a0143131b58d4788194c247132a933ec1901319140501910c5c46681e98a162480b0c1da801831b22bcb4b86142b7804aa14ab9e972e34585410d43e0e9017dc14d194324789101da00dc0145439bc20f287438e146063e8cf8c1811a3290cd00c4c1cd0a86a6f8f8e2c309d007375d5030375b3627b4196856341968636835d89668646836d0ae6834d0a2743eb039d9a4d8a29899828c059b076ea47083c6cb09316811c39420256e76508bb83941fda2c70d7ae8e0468c1e39e011841e612ad48d951e5200b1dc2ce14609374eb839c346062a066e8a7043839b24f4f842834675414d52abdc44dd0ce1260535892a829b11dc18e106083728a824b801a36a715382aa821b1fdccce0e60add412d418f0f68931b297406d40a0d010f24d00edc3c41a6821b28cc48a146057511c4050b5804497183843ae5a609375f6ec0dc78f1d1c447133e45c86e207bc10c1ae09617a0bc60c50b55e44c21278d18be88e104318041c30c6878412c063119c4acb4b082165860838b8d23c060050619eca0c28e303baa301365660433526a3850d3811a286ec493fc081b5f6c40c1c613669498593293819a15d4b4a0c6053562d820820d23d828420c08b12d354fa889420d145ab8410b585ac0410c35a82943eba226cb0c4d98c10934384103076878e21f88a107316891c922c3839925cc3061c6cb0c67ccb0841994004315624e308469a18a16a2b460850c1264bac824818524b070060b5d5a5eb44cd02a410b50b4d0a4850ec0e0058626c0c0041b48d8c0800d2535c0d490420d3458e8010b3e60418b8c15130532516a8ea841a226494e0872a0e48860862a33c4a066043558d45c31c30b66b032030ccee41b7813b10cc496882d61c104720b16be98c103f3033344319388e940a60c991ec8ec8047153ca2f0b08206083c8ce051444c07623c10d3a4c7137aec40538156026d055a08e697e9048d039a153dbad044a03d694eb429342aa8135a14f40b7d420d4118bac28717aa04d5010d47a065d028140b85018d019542c9a04bf47801ad329f409fd02ce815940afa035a05b58272804ea1584c25501ad01a5026e80de8129a017a858a415b40554059405740a1a8130a85f6804a41454047407130a33099a081a19960126102615e19dac1849a2d9839985dc85c40031466086858c214418f2d7aac800626cca78981e9348b9846c8307207b20c9904c9049945f2402e41364176915c24122411a416f94546413a411e411a410e4116410a419e21b7c820481fc827c81e4820482548332414a417f90349021a9cd0038cd482862f52039249ac2297904b6406a412fd4526914e4d85ae42839146741a8d464b411e218be82974988e423fa1a1d040e81eb40e1a079d0359091a4b07818626d0e0a565d033682b7d4557e917f4085a05bd8204b40b1a8c2e41a7a0c3681374178d457fd15ef4184da5b9e82d7a4a674143146465c4a8f8829884a8848884d824221193c41c441d3800e901b18ba368442c6296a4d480234610a003031650801b082014146400406cf8e1a306d9f5e96181e727d682d1ea8a2e5e8e2f13a45a16250d91801024438a801022a48bd20723454284a8601ff0a108112124e08239e122a52145483d10edc0a4d8814551011b300f00a134012345459a7051d10f3cb00e7052112243948a7c105254f4030e18147ce40723440ee30017f560e4881121437a3072a4003d5c1dd8133e1ce9a1c8071b302738a90245464915280a82800adb4012111f15b815d6040c30263b300df010454664604cf0120c440f479014b9604b1849880910f9c1c8911e841041728b2430445603cb000e98123c6049b00f44842815252109d1030eec89938a882811413a0284921043844c400811247708121f8c0c4122aa01c30027251515d181299981219184958c0871a407213f0c292a52033b8291820822881b583023568015c13e1419990091242342f4706489881047453198132b15250909c34944922af043519104841041722bf0435191cc06471538a9084908a521453f0829f2e18811170e2a7012d2912212189244c48734948e2c09293264e9081212244376704ca1072315481a22051e823404091a133042c4a88721121012841041103142240830ac9474a48810a423488a90a2c03f1c398284440812224024211519a1c01121152832aa38a0c0494540240d299224c4872222459020196244081b389ec049454a42204922e2830d8e2f0c44d210202c0e27701112122145484484382a421292f4c312921b389ac04a468a8228521aa294f4c31212180e26705291d2912521428c1c79e1f0c2159080902524152932626408103d084112041210427c3022c411091821a2042523477a107214840f6770521043908620118274a40b1ff9210747123849c948d152111278024688f860a408890f4686f4d083e3085ce4c3911e74707061a4233f241525198193948440a224c41100e02842104224250d590107117888d2101f84183942c48722a524224948454870e03083938a908ef420a4024a448a1091c0902244862c0d398e21701212218e204d40480d1c42e024a4234a49476c1882342487168e2030058820b94845464847168043c5b1858b9486f840a4c89025214542140961001d7c289ac00486e8d0020e207092510f4540f4f0034e523252845404841122c7e10323447e70e1d0c23d1049324204496988222115288204c9102148453e14212284cca8872345642f1c3de0a41c1c3ce021425e3876c0410819a234c487214a4537c4e0c8c24945453f08a90052d1129122453e541c6570103d0c5103870eb8a8e8072147948428013101224514c08123079ca45494943444081221488a7ae86188900a2015097124840892ab64a428880a0cc921881e76f0c181c502448a0c21a244c408911a1c3860a31e8e149180902225217a281aa24806c70d18e9480d1ec7a2221218a26444881f8428f5508444c40723448408c1c1a1668ccd4b0f8ee872b9a9632827a71b9b248eb6c26285454412b799c3e5709c8e8e8e0ec7711cc73d7b528d35666e5553d99139cabc434b3965ba559459f29c61da31d29edd9246903dd91c2973e4a8a25445391565e628b9259d734ac94c5b72642a5594272727f764666fdb66e4ee4e6dcd759c2a29a54acad6666b9e9454db5a36d3299b29a51b337b94654f6eeec90b500033eb700e7394271723a534c57194db985270fb98d2b971cb9a2d01ada6cd91ca4925a5abd58ab6c65c4bb09b9929a551ca99a27cd371f2dc3666c9b58d668d9b354e31b3b6c9e68edd1a4f664d4b717747e6c84cb5542a954a718a53a914734a07ca928b92b93927c7ccf19c937bce6df3e694534ab9498f273702ba59722c43e9463d4ae9a4ed9ad9b68d6e947291c68f6e5236b34aa5a2dc2d0fc0ccb4794a297bcec9c939694b6649b5c89b8c4da59449b50c4d53c93c9b9b6e9e94b46326a594ce18652833cf182971aca8e46ede64e4c982c732400edc327677a493a9ccc61d290e74dbe806ba5a82cd9205e076985537c8d78b0092d21b5ac3534ab931b30d37dbb0e49ab6a452cec84dbba9a49c9493b264cadddc92ad8e2d8ead56c77490eed8b1638c8d83d3b2a5e48e52b68c544e49a7ec6ddb38c9bdb6dee6d673726f73ceb96ddb36b72967c718d3cc4c696466961d656c1ae9b6f1c6bd4dad9b27cf8d63e6962eb0b7e6660b2db7eeee6d63de3836f38b725c777731c63963ec96d3d53de57c31538f7900cc54b6ec39594a29b9c9c9b9cd4d4a29552a956aaa5a0544c5a9542a158e4aa5524d295572e6b4a49299657f7163661bb8eec82dd06e224e766441f60f99961dc373ce6e4a9957dd72368ddf0d33af381eee0982b3bdf6b6b945d9366cd0218fc59a93a594d403bb5dcdb2db932da50fd9dd92e3c8527673338d944a3a279d548676cf96dd324aaea129a5b2259592b69452d218bbbbe5366577945452c9a2b13d96e771b425a5d46baf3dcaea6eaf3daf3baa28a78ab23d4aa59c9b047bceaed97ae3d9726b59776c6e96b1b9995bcaa6cd1e4f96c7cd5e3373cbb9753395dd1e8d94935b8c57d65aabe4284799ca18658c52f6473b0a05f59032caee969299397edf37f3ddb4bc99f93e1ae26a3529b3c61d63c7efaba9f966be991b9e1919d80793d96a6a62be989eb2679452ca964d7b4e4ef694f3932d65ec8eddcc524a2db2e4ee29e59c73368e6d6e7366866d9bdd4da39cb22337a52c2373d3a6dcb429d349539c929cc31c63e46e49bb99a9e48e5c7753ca537637f30ab299a564666ec9cd3230336de6a6dc5b4b298128f764965c4b39a99c73ceeede3696927b729c7332533a9967f78ca14cb99b2733b3ec9eb3b9e7b6c99e4c3d6eca2d5b4e4abb65ec6ecf9b53caeec99123e56eee6666de98539432c731a59229333333654a794e29a5eceed9dd514a190373ec99ee669ecd92b694b265531e544a29bf6d52b29c9252ca6d1ca5ddcdfa0140ecac791800f049398e6351bac20b748700a88ec871ac18b9c84516e5364a252829951ca3a41ca5b4e904736c726e924e4e4aca4c6933a594e2f4d4e49cde947352f63e29a59494ebeed67a4a4a9969135121e242de705700e9481045416841105132220492b5f94149089d222084281921828444480f49448278b9e0431152910f484784c460104011112425160280c3f6581c2b1f8a1001a207214a458418f243910f3c31881a5c84f48310a4234a437a3852a4c89057aa48d152511121430c09c2460ceb98c0912242266084c8042670a4084e0d090891c4e35364480f478ac00480b442515252111292208ef4f0d3b1008a968ef45084a4c32806830090f45094d4b3f30311a4a2a51b31e880010601f8b0c28d22a5214845468a26206448920f3d140939a284a402483ddc18a2c80723448418213204881e7ef8e1c80b319d1a431ca180520da3213df4506414834100a7e121001d4204506434a48804844cc008112092860071a4214a4938564938365800478e20e518f5304402458a1c4162a1674811524e058a8c84280d5164a4460da5a209e0d02429251119a2e8a5b10e23478828f53024c9c8102425214a448208e208ccb2008620f2431112126b8334a4a8480fae25234572c53a841839422409a96849880f468a90201922a4680243908e282509511aa2e8b564a448f2784ee8a6c8b4355393c70337711b53135393a6e2819999b68d07666a6a4ac98f87a6986231314dc943536c9a35c959d34cb5e481a9898949f2c04c4c4c4c4d2926a6ae89a949f2d014999a9a07a6c8c4d414996253e48129324526a6a6266ef2c04c4cddc4c4d4d4a4f1d01499220fdcc4c4c44c4c4db269e3a1293231350fccc4a4f1c0149b62936ca23c30f3d0149b9aba69f2c04d4d4d92076e6a6a1e9a6253e4819b220f0ca04f88cc1c83481ac201e79c9ca693d3e5309759bfdc1c7872691957be631dc54be317e4055ceea5555657105ac68d0f939a8e384c98301de5e20226b7d24acbb85d6ddcf8117da9465aa5feed77906ad4d605249ebe3fad2b483cfdbca456a9bb55ccb84abd14afbc90ac57d67a5ba9bbfc261a5b081d5074ba2a0602525d3eb30c1c5d9867311053e1478b3cf27c8e9f36e46ea809b9e00afbcc7ff3b20c422e9801bbc077dab06dc87497fa4e0029def8148d0aec3c8fa1ac80728f587789d3a20c7c65d837d4ae7cfc2a00c677f11b028c647095a3e9e4c45b2618548b6606471922172d97dff187657c5594613a5dfec15a368ee338ad394e468ee3286c15af61b11125491190bfd3b1d0059a8e853b37bec68df7b6dc789077e20d2b1658e185fc717d39220a282648120320c89a9810c20f8e1041132b94e0229397130908724e6ec74b6344a8651f913c341b16dfb0ce86bfdb536d432579e355a7e99877e9719a6643edaa6b1ca75dbed32a372c7e443a7736ecb3e177d53925d91ce52af2f5e47bc2d78d8f36dc3a19a3aa7241a9aa446fa4b9ad3dd690bb2c3fa631ddfc761a26cffd0de36c0de33d8a7cad864af2f2db520b7a34bfaf8efdcaf730d0c39ddb458a828e5f8d80f12d703401c850596cb9d1e932ef84d1e9f6bb9f0e8046d2a92f4365d1841b243a5db66174ba72689eebd2bcfc598180972f6bd874e5bc0b88ea4e7bc4ba7c2ee3e6b82187b9a17cd7f81dfdca4bfb6a587c7422a38befc78a04ecf3691a16c39edbef16d79e8e01c17fddbe154eb76f5bd70dbd1bb622131d07ad00f4a27479ff15658837d6008c8f971b06de0979cb9d67068ab1c6db35277f5292524a3bee7aa6923232505f7ec7714740e49e7a47dfd10a44b555b07292679e561537d4a9cab2ad02e9ae3c785b7e8a7c37d4764e8f3f4a5bebeea6d44b5522a6d033714f699181e4e5779d7cea9d0b48d844c5a5d74670a945fad5de74359baa973cf3aada923c534b4280ea294b44eaaa278065293b857e7e07c040904c656192673e87e499e73e1ce4a90d7320aa01c832ee180892a59e7a081b6a59d7307e40622e384546ee285761026e57c1e5860c75e777e85838830d1d0b39cb033a1663a82aaadc791f7ce5cef8ddb821d30c1d939fe72db3392a5e5c7b190a0a930bc5e9dab80c25822d570451f4755eeed87c08bbf43baff7e56f1af5e543f0a1f67edb96d6089c2fb894ab517f5e7e37b4bc50aadc10bc94267c5d6a8de429bdd78a31ca4719faca1b725c669f28a7c8795e72fb86be0c411ab72f45e0e4f6256b7a0ca47aeaf32300fdfcfc70e8cbcf3a735c95bc2a5ec7eda8473f1ca4ead2bb27af525d76355e15cac76b9f02b813c15922b86bdfde699efc82f4e53bce8b9f02b806288932ee442889324d3b11dab7efc09d086e07eedb8cd203b7cb959f695f08b45c7949afba16f36863aed523b86ba7954925a36706daae5926954c7bf8e1c0e21c9e52a7b44659aa4e390a620101aaae64fb94ee4e2a19fd3ceb7c4370a51a51ddee5e05a25a7d7e3fe265bc87d5a84877efdfa5578d74ff2e2463e52b53c3a61b13cf621dacdef92340b42c2b0478c3e9e414bfba50775d75755f089eb8f5321408b2084192bb73190a045b401045bdaeba56dff77d9bd75557b7aaaeeefb2ed4f4dbbe20df43f0e42a7510d50158a6d923383b6b92a9ac92ed5146a33c6d9eed2e74a99d69f4db539a65a2f4da674cdc35fb7499f6a7cb529689b34f9751abe429488644938c9e7ed364678d12d044efea2613c8cdc021a87575a7f4315a57476dd393db945a963c1c93d61c103a6e02198a89a7db5052a02e5fcecb71e7bb06cfb4832c4601df9968fae6fbcd4deb9f76fe76f87e53bd983a7f87191132ab43cb62a6c79f0e44e4dc3b1131cf397f3ae4dcb3b3d563e8f9db21e6491a57fe4917fae9d03aeb5efdbeaa44b4be3afd1a80f3ef5ad5a175969dad4e7366a077d4bbce672b9c7f76d6bab7aa2c93a94478c7b94e2502e7add3542266de5bdf6ad874a12ece65a82751b7e36f683bad4654977eab4054979ee65d17bf06ac4e73b012b13a78569dadce7a4c9dad1e73fe1ad03ace859aa6cec0ebdcab4db7bbeadde651fe1a3063fdfb0cbcccf9d3a1751c3b8bf9a7538998d5b74ca612319b79ff6e73968175f6faccc6677f8db32a11364ec44f448dcf9888705de6349fdd7c56f3d9cc63e8a7c3eaacd36f8798b7ecac49063ea7cea20cb4b4eab0a267592262ce7ab779f25380771c4bc4f7d5b74fb33ab44e8477f03775f67d659988b0b9ce0e9e3d02e7de41cba492b1fe5526952c861988da30c78df2b4ba67995432efda59157c4cfda28c289e3b7f0a88b133ef9f55b2fa14cd1a15a1dfae9d75a1ee6c98e36e57d9fe7ec4cb6fd508bd76217904ce59761665d61251ed2ce733f0b3ef31d779aa72f7ea1138d7b94d9ddddce69db6c493cb6430d1967872b5d33b2f15542edbe0c61fc0b0158277ce25c02cf1c5132a4f9ca8f0028225207042c5162aa2a880f23c5a5d9c0d92badae355dd8dcb6533362e57bbbc7df903c2665c8d8624505308539caef6ed6ab75b79b4bae8b9eaa216c8d59ebadce50f880b6588e1e47d406848020584c960b2ba8e9d45d9cc86b5c1d2f9ecf6e9321b9689c53acd6735ecd3653a96c975ef2fcbe4b24f97b1ac9229db59a791c28d8fa94f97c57c95e93bcd732c13781a10b44c9ff58e53674db2d651d0350a39ba1032d413606e3c3ddf28bba94f97cdb8d9674f9731adee3de6367556639956abd37cc624731afb74d9f719fb74598c6592b14f97adeed9235861c2840923fb2c4b9e90a19ef072a355fa70601bdc688300c9b8218d42e516e1a8fba62737f51dc0fb7750fe7cf6e9fbca2af9ec1141b215cb9fcf73df01bec71c943f31f66975d02a59d929dabfcf6f965aa3cd26a049c66ad9ea9309e466d1c9091c82a1ac8b7e752597adae3d447235eba25607303ee4e1c6c7b3fcf92c11dfbdcf73518668af7d0db8939393d3ead3c1fbcace56f7569fc774d3c43508c6134faebc4a83ba54c5e47204a2f4b47b971f0ef22aa71bbf020801de18ab1278b777aaef47cc71755cfe54d7c2a61bb96b1f0eaa87f11ac5ab38553f86aaf7e71744fb868ec2f868b56fe86828be7bb779f1fb11b577f17beadf3b8ac6146d4a29bd4c5d88e67535de8e3f22d571fe3d0175e555777d4f50b9dc719e778f4be5fcf8be9517a30e8be5aa7120a0ab86ce17a97c9fcef7559d15fd749ed259b1665c2e9dc6e272c94cd76dee62815e8c343624181b2e57fd62a4ebfbcdbf775f7565d131d7e93b70c628e7aae7b833df8f9cab4ebf20f2aa77325eb7a7f3fa3e24205e8d7be081b0ceddabe1dd036d78c4faaa8e3d62baaec71a7a5e8df7e5725da8752a5f6fc875f9e1d057fbabf2f52eed5ca7aeefad7fefe68df1fb11cf5d48e2d430de9cef391507a7f26ddd54daa461f436557e69d8576b38bb31359cc9d470b6aae12cd2261d8b12cca58ff24b63b9f49de6a92adfee5359171079a3cf6fe7cf062d8b8e7da7efbeef7b7f8f3502aecb505562f044d4135b9cf0e2c41627a2c0a7cbeefdaadbd9bd4bbfef42dd7dde17245e2ef5d5535fad4edfadee4aa5621df43c24202a5577ee2a95ea9c0d3bafb242ea4455f982ab95aaf265ad56a92f08ec7bfc6763160da3ffab6a0822987e7b6b9dfe5a6b6559e454f5758a76beda8703fd86188a892657a9af8ae746ab85d130fafe6e485d950d29d03d5ee337e49d69881bff1aafe4b2d9cf3413c1135d9c64f54e524b129e7092dd265172d9cfd97076d7c278ee21751265aca9abaa7c57c3216eeafcdd00bba97f4054aa2aaf85d1b1d469489d5cfa54eda886d1d0bb3452b95402f41d15a9d0e8c5a534971efcf9d2c72c4eef758f9fce4f87fa5f7e3afc33fbdb7a6a8d34a8cb37986493ab717c095b57f2977072e5a7f4889aee76a5796943a5be40c219d21277cd2acd6b0f270eb01b325d1a0e7164e372e70f07da42aa5c71a510eaf1857a7e43d22e7176abf4b263319d176a5ac3be525f5790dbffac47366ea4d76a38bb1abd164a8df2abfc82c096e88de70f0795d38d975c7ac8b90c5585c9ed380254544feecc399f8b326c4fae7c4e0dfbbace0c94e3b29e434406e87a8e1bc6ebba503303e9b84d4406a83dc70dfb728f5f10d7c3be5fbc9c0dbfef470c97d9876bea6b35fcd174b5da7463759d55c39c370b79dd70d65fafd7ebf255e3f54e7aafd7851a046bd4a8f12e7a60ad51e3fd0dd560b156abd5bbe8b1ea6a034caebc8cabebdcc6abe14ea459ce36dd58b91ac6c77f67c92e9b4697d8f8a4617772b1fb86566755be60e5dbdd78f18b6f75f12b008dd606fa8e4b83ea5c47474787ead8b80d9debe8d8d0d1797df5d76ad575114a4e0de3755dd6f8ea35c21cf7f5d0f5bef6fd9077c5fbfa0a27a7eb56b2cb6ad5ad5655a757d615e4e63abfb94ed83a39ae996ed5e950262b1d9d4e47a7769ece75ac2b48ebdd5befdebd2ad2bcafbb5e349a17acf37743bc9a8a3f1c7870ce3ace59afdd5f95bbf18957b3ba4e52d35d6d59e2d559c5cbdf5017e455f9c6a75c35e74232a7f2c5a91b9686cdb7aa46a561f337952ea9e14c55c3d90d352f666c73d66d2c07a661f32c5b532500ca1b6e59ee3c0766cb42532500f6ddb0742c6a5edcf95867aa04c078352a1d638594c99def24978ec5c4a854ff82e0b82a2e1d537d76dd6d45f5fe8654ef2a1d8b9fef40103c78fe841a7cc74252527a618472c1cb6f087cac7c632a5fd0769586cdc7275d2a15539fa9faaee96ab10a75f78e23b001a7eb7319aa89a80d80b93f97a13600e504d48d5d8672e2a909a826a034f1c4d5b90cc5e4cb6562c67d5d86621283dbc978db3bee3a8f3fce86b3cb3dd610bcf1b53e5d56bd58edac9e4925e38681e3de755ead2c8b755ee362ea9de7a55236d04eabae78be4dd71584bb76224e76b9f3f15ab4e1ecc637ddf80dc50bc9aad4377efb70e0e9ce7a7796a54b1a36bbcf77db1704c7edbe77edc50f483cf7f801d11ebf47cd72c3a255eaebaddef1c7b221d3655dab2177b51bff552420dfb90391f977ee1867432420dc630e043cf7cf86da652c37ecfbc71d8bb1e151bcdf391b72c3b483acead923262e8daff25dd5a378bbee5fe5ebd5aefb82c06e675d41544f5d65259786cda7ae72d2b1d4e773422e8d3b9faaf149c3e6bb1c0880da2100010880f11a6de73bbfe5480034e2ce37945dda4a8e04c0f8c9d9b85521c0ab045ecd4679ba6cd65e3c1903044e32a6c9a50551882123a202b326d9ce319043a624876c4a3c5dd231d9a563f13ab97c43e9e5b6953bdf576e482e37da4af7b8114628773e4ab15dc54628ddc37e3e87880c3036b97c43eececf8eb9b44779baac9e5d9ad501acef1bef3c778ffaf9585bd185785a73b8279e7e377c3ad8d7cb4f87d7f7670096ddb0a0e4898f9f0158662d2779e2f93300cbaa65c913af9a4d3aed42139d3cef84f149c7529796080b189fdc79a97ad7454f55a9b752d1bea76a4d3bc75da5e2545c8d5755ef5add34edaa4aada67ae79da3df8fefaacbcaddabdd8524d7f1bbcaf7a3e7af6a1895fa767cc742b8f8d4a34d9dbf21d563e5549b90947c3beed88bf57baaba82c8a72e53ef64dde2bc0ce9bb28207dc79f67c3d9f554607dba0c3c770fd0ce9858e78641f519370cf2e0e5e78703ecc63fd6ee5eed839565ac3ac57b17eb67c379e3bdcaa96aeafba13d5e56d5bbca5d48aab8cf0bc914dfae4a7de3a55a0d953a7e38f05c7a6ae3132232c0f8e4f2958f4fbcd69ea450692a599ac5775d86d24016bdfa129d98c87299a1a695e7f000f6652826a02e1fec7a7bd7706ef5e9b2cddb363bdbcee442196238c9b68def11270476bbe8c5274a7d83e0b8f251b80b75d7215ac5e9c2ae9c369cddf9ae5c7dba8cf3b8a7cbb46b369c3d383be3ceb49d1b867e5f48ce34ee7cd75e573e5759c61f0ef2f6a73d9261c2840973b7ca0d43c85021807295faf6938eb1c481e74a1b9fb43dda98ba89b6a6848ebbe3ee3af69a644ec7e7ba0493ef32d4124768549014cce472b5cb504b8270bfcb504bb084916e97a1968c71e33bcde31a3f00a62e432da972e3bbcde31a9f800cb5c48b2b2f432d21c1555d865a02e5c6731deb77bc6974ca8eccad987df8fd049a058b85800ca54418972f5fbe8c047472722a82c1c8c76f08769b81e2e56740cbc571256b31bea3de64207af9d286f242b4ae520be988c3dcbed276b577f20bc2ba4731cc9517eaaecc3ea13cf74ef326033510fa4924bfc930de507e7eabae20f4fdb646f3f4da1704c7a596d9473e1a815d19e7870383b9f25d8dc0aeb4917dfada37241f3f1c60575a669fb6dc1627161d77c79ae79d90a16ec33ac650495c6127b7bf133f1ce4109fbf3805189e47c7c2178f197afa27cafaef18432d6172fb3b946d186fab61fd3eadb0864dbb43d352a2cb652825b4dc90c7ed7f97a194b87279c89f9de6e90ff537b4d3b07ec37a07d0ebd8a561282945a700309ebb2eca600646405d7c010cc018a3c078f4db47e06dfbaa4d31ca10cef9d377b3d6f97012cd86f5a702b4dbb0e9ca33c9a4e46f87ed9a9d35c966f22d935b9d35c9e2ecb3fcd11e2ac93b2db50600f986f3b60e4c3225538e822e7d94cd2a6d18ef3cada1bcf35add2e2467e5bbd596f1a78394c50bb594cdfe894e4e4e4e4eb2bec7d44db35b8c1ce6e9ab634af24aeeb692bc4062fcac4af2ce1875d0717b97f25da4f452d2f664959eacf14d1d5b49c73d800c954418975e867ad27239062ace39444704368cd5451c40fe06d074e7b41ca38f14d420445261eeb7c7ef8f004dd788ed11d3e587fdc860847a82ba0cf5f46462e0cb95b363b28bf32340d3e58685f336ddd8c96f88b647a4037a7e9d44f16a176aae63ae1ff16ad72c77e3698d9777a635021b041d5134eac75889741023ffe81807efcedbb1daca4faaf53be6fad19797dae367c7427a23a99deb585fcdbb422dd44d1107b0633d4d023445cb356c7ebe630d81f2fd23a63b39de6925d0714b29a794b3a8e38e311406a2ae3cdfab5dfc00d85d8652c2e5c6f3aa632b775efbe12a4e4e32be53373ba69d7fc4e577cc40ab775d93f75565f6f16cd80d1df525ea6cd8b77bbc5743a6ebc5bb0a93986ef779d59981525fb1cfca86dde5bfa72ab3cf6743ef926fac475b983061aa70e7bd1a365dedfcfd88775ea8bbca57558da65d8a573b90bedae51764be6dd874fb7cbbc71ac61b2fbf1fda57efaa0bc88d1f9177669f782129d45e3d8a612ef755757d44db53368c3775550de355bdd36a18aff6eff3c3615e3b7f43de85bae308800ca524cb9dd7de71d71e7f44df3b1bcedbc95ee2eeea2b1b3f20f36aef3afe56366cbaab7b7589bbdebb1ac6db9d19c8b3a1f7224097d9a77b7721d9d5aecaf3b7b247f26a1fd2fed5500b32af557132e276579d1f3fa218e67a96d927ecec510c73bbd3f36703dfce32f7a42e55956faac63bb10ffd56c37e14eaa654d48ce82e7f9060fde7ed48d85cbb4f1f099caf1e00792492886fdd85b3fc4102c7ce642e738e848d77e773f207891c48dc1ce7fc96fc41c2c6ce6cce621d27e6ac7a9bcf6cec2c66e7389fd9dc3beb48483be3b88376067e939f493be36c12f133ee351ef3ef7c50fe20a1b233d5bbdfe1d899fd76e338dedb713eebe3d819a507ed4c75f0339c7747623ec7ce68682e6367f2293b4bbd769fd5777626e567dd5d9f01c17b7646e9557626ed4ce7aa83f2e067de413ba3339fd1f37c85cfc0af60673434afb1b39a6fdb6bd8194d8dd76c355fe1b3ed2bd8598d94acf1596ac726019bb1b399d7d4dc355353637f43a57a0d1d95aa53a56a0d8e4d8c04b74ea96c24d7d55056a55e733831ace6ea064a50b5d574d4b3c1b1e12a2b86aa5229d9815b4d8c07daa43c9c98adb956b12aad91b4064772385800bb66d5ee2dc4aca0c2816306a793291e9ecffa3c3c291b1b7b18c81de6b1c0c267aab3c042dd36d6ed793cd579280cf6593d0c078c63d580b7670127e62cbc85cf6cde020fcf67dd7956e0790b9fa5280e1c5dbd3d8cd61cd63870e060e1b3ed2cd8190e1c31f22dacb082ce67de7552b7e7a9719d1b362d9ce7339cf3c06000f80a7606fb8d15cef399ea373e03edce67661ae7f63874747ea3468dbbae73e33a9fc55c873b8ef77cc67a4fccf17a0b9fb1de42dcf98d16def399cd6f7cc69d07f67ad9bf78fefaacfe153febfefa0a2ed76fd4b0331d3bd3f98dbb6adcf5997757fc8c7e85c33e030f8b00c0f1d9761c7606001cb7760680d7a871d867f2f6b3d47bec8c0516be63672e3b737d66e62f3bcbc9b9cbce5e9f99b9ebb39abbec2cc7f59ccf3c2bc43cf13b6fe18627731d3bcbb1b39cebdcf36e3f53ddda99cc8ddbcf3a8b8479e265dec2672a3b04f3c4b760672cd824224ff715ec4ca53a8d9dd1bc5be1dd6729bb436767aaee2f3b53dd4bddfbacda1c9827fef5598db58179e2617686a3e600b0336b67f62bd4efd8d98ddfda192321091a57c27cc0091b7892551b60e0891a486109512061031912f5423896639ef86a67b7b7b1cc3cf1362c4b1e7e0d1d9cbfecccd57a8e9d35a5a08b244465b1e20a325220c36992c2081e3421c60ed0c842850ce7b318db629e781c3b6b59963c2ed8107603764a8e9da2fa8c09c74ed9de4a9de9e634e773329f39d3ea319f31ddd829accf986cec9479ef4ce06be24c4994cd9868ec94685b332afb92b15352168ce1ec0e68a7d0d8294566ae66cfb4b253a89d96c9b353ec9466a2694af59cd2f14eb879f9d1a4348ffc7ce8690f69c217f870e712590122d1b3ce495d4d97e4793337492a154ed21765f69423cbf9f7a4d5cae63f62c9dc5cc6f8e7e0a85ab1a6f37eeedcb1a418222bc0a3783530ec23cf3729e6377636c528c6c6cea618ad52df063e6a01c15ce9988c4d9291b1da952a493131961b067e83026da859b9f25a958ead6cd26a65b52a617c36e9fbac168617523ae6d924cfb39a94275974acb3495d67b52ca0685e744c6593542aab79d130987cca26a5521b180d93509b4dda7ed44fdaeca6d95003e3caa4f8a3b64647314cd2fc26c5861a1524d6fb1108603bd12c1a18272ef767396d4f36281d5bdd3ce9d857a5637166c78b8e79360a958e75501d53d9231b359738b29a2c3a966a7961748cb3af4d4ac7b6167733a7183115a2aefc0646c7343bc5a835c588264e3102c38409e385c80a7012fdb60de3d13c9115e08f18b580510b08e66a5152a2b6277de5cff6a479e4390e045bad1b6a60ee6fb83d0935305a9406468b62336ea8396952342701dc9052a1592895b9853e6da1b9e16432c1984c543794505cb680f486ed4536692bede5cab795bed25d3a4b6b692e8da5cde8a8ded24f3630523a4639c5a888257e895ba219d14bd412bbc42c918b06468a942ce29568253ac590bb9c2547c86d4f3430576a60b4346e6c669c74ec883563671b971c59cdd3cce5b725dd83e64f39b299993fe1c85a4d3a766463db2279e49f706435495aad6f603cd1b12356cdb72c4ead1b1bbb3d9142456e4c3a5663674f38321a3b7bca91cdd80dca8ae491dfa224cf0fc07eb83dd9bc5cbec1c435816d7bd0bd686ebc9266e388e5c5c94947a59a3962dda59aabbad2bcd193b1d9eed28dbc51d930e64b3917e928dea5d6edae142f4d4db421f8259c98ee7c990ee928e82ecd5cd5953490f5a59cfbada20d575fc2b92aa4231b77a9e6c62b5195ca86df97728e564e4e4e57752579b76843ef4b389281908ee45d6a4dd5f95465c3ee4b3937c62233776693d162ec118b8293257bd5fdd92396d73044cee3ec8ce3be8473c3ce46991dc19a4dee4f39b2d497726e387355f6c8469830616e94949d1d61c332cdc89e70649b9ded6876766a67af69672d1c99b4339a8621fe2947d6166c18544c5c6b49a06ebc7cc8603e1f72d4b4d186b0cb36643057461e80617cc2503480ba218301e3a57f72689e7e962c5bb670b91dc627ece57618fbb01bc627573e3e8985334a918f59742cd422958e855bf4a2632117c1908f61742c5445a89acbc72a1d0b61fdfa6a587fa6b61ad697a931b5b2eaaa7e15d6dddddd0d75f946d34c9c4674bc13f6932b05cc951cf97bc8582e9f577c66f119e473cc4336e3f259e62173b97c9e79c85d2e9f691eb297cbe778e5cb652bb10a540c038ce80595988594867df7cefaea614fccc18739662ef3f0859ad33ce471739b8733e0bcf590a15ccf79c85574fe7ac8562ecf229486c9877ce5f275ea100d937fd5f8a461f2aeaa9453a39386c9e354240d936fd5d8a461f237b548c3e46d6a7ca261f235158886c9d3d4c8a461f233d58786c9cbd4b8a461f231958786c983353e354c9e551fd030f9558d491a26ffd51d1a26efd5e8d4b0303a39e958f7a549c7545e9ee858aa0b938e715c96746c33e3a963da96241da35adaa963334b1a1d6b2c603a16a31a261f1515c5606e3f6430373e8c5242d8ed300201948f4100e343d88d0f735c39ff5d1e5c5d9ea663a176d67630e41e7399bacca5ea33ef4e73e9bd06265f53771a164f5367aa4c8da9955557f5abde951bdf59a972e3b9196efcc6e3c66b2fdc789ae3c6cf9e1bdf4f2edf6872458e04dd549217693bd2ea2281da95642ed2fcccf95cceddac52eb7257d22e52ea3717296595c0db5da97555574a5d240fa4b9489e5502efea4aadfb5dc9bb48ac7be7d3202dc55c24965502afcc955a37e64aac8b045a25ee8267212d751769c62a7197e6484aad6b7325f0d65ca9e6ce9c8f221827a5d6c5399212785bbf39ff1d435202af0df689d76117e2f93855b24f7cab36fbc4df546617e26daa8b7de26b6a0efbc4d3541cf6899fa92ff68997a932ec131f5367d8271eac35ec13cfaa34ec13bfaa2bf689ff2a8b7de2bd0ab20bf15d55b14fbcaa76d56317e2b9bab14ffc563976215eab37ec134fab0dfbc4cfda629f7859b53ad985f8a6569439e8deb1a9d18d4ba9c2704947a54aa538ee3dc6764a86145ea02dc14912a0d03ee7952d6e70c3259d1b6d188d50469433aeec6ef418268c945775aa1bbd5e2955ea46ad1697e26e4443b371db8d40906ef446de51a43614c2c69dd62814c2c695d6c8886b589f4bc5e9d44906425a6a5d79257a190869c975e395fa72484b3697bbd276b7f312ceddae24c340484bafab5d29d63010d2d2cda557d27018086929e7f69564945f92372e751a032dcd2cad2eb7142f032da5ee76fec7404b3177b34b1364a0a518065aa2b99a0567186869a361a025d6a596c6868196fa868196542d065a92b96d5b390cb444ef045afa5e0cb45473a77dd560a0a5db60a025f0f6a5651d066afba62d4a0e48c93c991bd634e88c80f1dd2a014db23e11f248488b812059bf2d53c777b1062eb60368bafc59946591d474f9536cdcc1e715ebe0f3aa9b13c70de33bccd14439a6cb43a8dc6955800b65b4208c8c3f2b955b789171d689c960321fa6aec4c1e7af01386ec4c1cf0f13f3d3a59d933c715b7de264dbb9864c3ab4938c7baa2ae121db5c40e2934ba96673d8ce570750c6699a3d625d6aa3704d979d2eb755963c21776937939f299a30ebd394cdcbaa03289b6796d21eb16e94c99287bb23155248d9841b9c7c20ba30c58f93268093e5073a662f37dee87425e3d0775edaa318266cba7c14af3c73dc40179d68028c2c5be0773d8a77169b62d39083e5cff610d436963c73bb76f976352075ed3a70dfb853ab43ea9a9d4da14fd923e9a09db33350f2c8f903b0ac2579e425d51efeca8d655a65d9ac21ecd61cb265083a3a9b32cfa492d16e36403bb5b329f392659ce491b18c5e522031b7a7746111d5959f97369ca7368a46c437cad36553e4e5172475674b99bacdfc441782aaeb755d52bc296b149f62a82faedcb09122fbd02b71f788c37857a93afad8a176fa54e5771c81794fcbf5ba54f3d7612ac8bcf7f805f19efa88b677a9ea7d7e41b8c747cbec13c3b6a97735ecd412778f64159c42a5d8a4c51ec28c1600e7174f5ced92f376e0a10450f3d2f81c76d822af45c23ae6d29ee3d2e7404f613c00d1b1b0c5560890a3630c65822797eedcd0bb215bb97143d662c66fc85d7ea82ca431c6a8458eda395e49bb1cef4ec728125f490b22e4f6b53ec79e3864244f80b37c8cdbbbad8617b8da674410c1c431b50d9b64ca723694e787da0fed32886689b87dbeb5ab7c173b88bc6683c4f75b1ddb4eff0269a04ad0e46a955eb063ac3d52a10a55b8fc85e11ebe566398cb9f13f7703b1571e35b7a4989a09b81f5ef7c9ad6eb3bb08e696fbaaafa7dab4d5da7babc575ddb53ff4af074e75560ee7cea5e44304086f222cbd5ee05973bdfbd53795a9defbaa6289f4a55da458f76df8ee4edf8b2ba1bb98270a7e7b894fd6e5071a915b7bd4ba9ce37a5b23fb6a79ef21e7fa8e8532a150ef32a6b441fce6f1f0e46dae7391b6af76cea5abc1aabca56c2ac23ca92b0ae845987f62813925e55d9a3993cabb2aceb3c566599aaf20d9bee5683a4acd1f739448403f07bd85d4ef901e9aed9f07b675dddb9d3f707e4b3aece06d9aea9ce6d9cd17683dcb8940dbb1a7a77a5ceae94fd41dfbdb3d7eb9e3252bdb361bca1864367997dec510c93baeceed5aeabf1aa5235de172e87335c3e4bce8b32741197bfcac1a363922936a9da4ba2eb2491b43874ff24513dc914d975a9ca50dd5d7bd24b55def211607e3848967547b9af1c4093062e87430ef65200a1cb5d7e419a75b77791ae42262636085deefd1119b9474c40bc6be36efd0da0898af9fd687a728f7888bd5a854c4faec63d2177ed1b40130bb4c76f9ca7e26cca5355967d40fa9a0d5521d3e542cad50ed64b2bb9619aec0f877924af91dcac66a3348a7705092b70fbad3505c30513c913690b2b336cb1a4631b95d36e35def9dee6d4349ba46d9b4da2b7e1a4b50897c48822e6105706e126b561fca19dd927a4ef5fad1ec5302e20727ef6696c2860c46b1a6f9ba66d9ba621cdabf54f7ca25524eed2a9556a5f95b51895d0451ac38f5280fcd0ebb8cefb79ab2519d6773d0662666e20e01012d75270dcd9cc3eda768daf62a0cd72dbe3371bafba919e5bebcb57e1d05915fb7474ba5a0db9db67f6e92ee2520be2e81674510a30beeb38aa009ca01937567b69ec627f04f0de35deab464dd48f8fe7b805c8505a7cb9aa475dd5f5de75d28b1f11f7d48dbaebeafaf87bd7bedfe64d661fd6e9bbaeceaa613ffcd15fd930f6f7a30f5e4882d515a4bf7a7f65ab2b88eaf655b76d0efb6c6ff9c332f9aeacafb60f07d5f59ec340f2f4c3c1c53ef29ecd595da8a3d3e58f283a4589b95083f227c64e960db9abdda8af7ad8670234b140a512ea6e767f40faaab3d18a7de459ec239dee641f4901703a1571bf77a9eeb3ac33fba43ed6575e286ff7557725edaebe8ab46279176a96f7d5e73d55c378bb9ece5e661ab359b0619ab5975a9aaf7a93a28b5268e183288516592efbac70d332f0e519aee0a2bb46e180949263ecf8631b0e71393ec987936bb41af8beeff3defdfbbeef3bef7c9da4ebbaaeebbaeebcd35121954aa5b86f4fa552a9d4792705856ddbb66ddb9650bbdfc5af6bbc7dfed887720da38ff45ce313382fa5ff1868a819884b8a8186e4f9858ea313b86def58f2524a29a5648d88a3d6f1c7d5a80464282dac5c7a98a6556d6eef282c166bf5efdebbb3582c160b085dd7a99e3af7ed5dd7751d162cf8e34ac41ffb6c1efb6c8f352a01b5d390bbdbb77b0cd4dffe3110dfed5d773619742c39c74cc7381dbdf64e72abdef567fd117257d2ee4854b7b3465421d39daa77d82f12a170a935a2ea4f1baacea9ae16522ebdaa77d36bedaa2c378cd6705e8d4a558d94da0eb9ab75ea5d3bbaa0bd9b71364ceb7ec750b76d2874fb5dcaa3959ea12e439180cbe516dcb6b3619a96e2b62bbfd5b08877e9b5a16953912ad1cd77b302d93edfcd6ff35beaa9b0e96a5cb7d5a578b759b777dd46dc0ddcb5a76cd874535c381f53efb818e33c17638ce7669f8b319eeb23793b7a8027abab6b3e7ebeab6b7e561b84b6c7aebd38fb28864152f29000e16100dcf3ad86dcbb7999b24847ecc5c9e92ac95cee522a7997bbeafce180e4a6908e826eb3cfbc9276556123a9aea405117253b771147423fbcc733565997be6f7835eb3b372978f342dc7c5ed8ba4ef688d55649d7cd7355dae867d9655f676d9f668c6f248c6ed47afed1db7cd8671a7db66b9619c9535945f026f91e954c40db91f6d691411e62e7129a3f97ef7cd72d5db1e72db43ee475c12238ab8484bda8d5fda6e52d3dd2e24b7aa71e554f628a671a752df7917900875fb5a8de176ed5d979a7b5f7aeefcfd380a65dcea377eac46d16e553667c378fe7620f286494df7074f6b24ad11bfef840e09180f44bb762dc5e7d43975d599abaa82a9a578352ddab30f77d1db3c55bc9dea396eea316aef54f7b62d88f6cece86b1528f5f8c823bdb56c3f8294bd330d69ebaca864d57159fba908c5da74a71dc8d4fd54de39e3e9ddcd33fe68df66876e5535536f7f4c30134b1e046eee90fa0890597b9a7532a4ed5e801501e08e875e5903e9eabae688fe2dd6c0bb78b1e577d2e5f8bd756d05126779ed2e3b821e5cbb788819072dc28fc262ec2e399ad669328f191697f9a912de918cd9d2f72e973dc90e626d11e9f00c3b8e4ce874c843b3fe38392e7094ebea0e20b2a5b9c9c64da63a7394d2c981081112150812c89121f59fcd38c8c9f4449cbb63ff590c56bf5a9876c364587f8590e92673e46cda6e8202479e6373b9ba283f668679acdc192070a2a3ee4288602066410e50c1e5c11841bfcce260e5c51c11453b4200b174e90b18c1fe6d0e14e4eb2b8a46338ee8c4cba2708ba080528d98604594810c6050ae5fb4054f373325df948cdb8d3d2509bdfac9122720b2f975a230fa50d67da652583c9d5e843a61bc64bfa224d4eee6684c96072e9430b5c6db346d88c4b1fceae66c378698486245097da28292b70a10c316c38c4958ffcd900a18e32e333b1c28409e344968ae2a4b344154f3c415ae18916569c9490b019378a930b6588e1b4444312a8219c980c26327e68814b8d60336429ebc466c8f8e1ec52eb42c850597cb94af14671b2f9c116471cc1c949c676c667323205087650441a4e4e32ce3a85f3314472a50e3141f881155548e2e424bb61e63609ba79de991c95830e3bb0962bdf5d89f2b03a1b26bf4374415e8786c9e7d0b01ce4cf9b475e9e2547dd211c75e565111813f2962b1fded3eaa30c7de577e4619d8c2cb9c73bfb4b38714d8b0096719f9777ce5b8081e6e579903faacb03217fa24c1e89fcf92e3f449461bb7c47ef9a5f754d55754d952aca66cda1fb4667ea2ecdbb4bb339789cbc9dcaba28c7a5b8a982e844c1e828053bc69d7f06da80cceefc11d14fa1a6b187e253d7dedf104da5358c7729de7029de39df3547eeb952dd285e5e5ee9ced0ab2e206cc6ed54b77375fc01d9b8dcce727421ec4b392d36cb154717a89cb5887767750591469727d8b11c979faa39ee55daa3f4688d4ec0f856c3f8da55dce377c4dd17fbf0b90a368cbfd5b30f6b76da69e5902ace343a7ade09392f1b00430e0aaa63dbe7b92a1debcf73563ac67d3ee4aedcf90ecc5de1321494a8dbc91a445a8980539e3b5705aa61f32147007ace725662003828f9c331699ef9c941f900d273501c9386cd4f00a4d605a49d9cae3c9393d335b261cd5d9a51779e0a5097da22f42e1bf852eef42add17388932f09ddc933bdfb793de95e96d95637227c724cad0779e7ba2630c054506779e6bd23179e7bb283bca5557573fca53902cf578698d77ab2e04b02c75579fa1a058b90c0525061788bcf4f2d29009090c443fcf45c99feef35c16f91365f3dc16f9b3fa3cc725cac07dbed3eea2a7c0954b011adc5575d14759cbbaeaa2d600dc954459f74719ad3978e76a488131ae366f273bb29cabb0e9ba7250ddb57d5e795d06f8eeda6c0e9f3d82c380497ddebef10ab5bc5e3d22ca3aebd2ec112bcc8df2f4822cf5235861aa20531265a927e154f6882d4c98307df91b121f5510392f976f30694db4b71c64e145cc228b1b639f77c2b3d5d8a7a335ba3667172cccd0289d97d728a5ddf4e8378734d91d4697e36a0c14693e2ca05c1aef8a34ae3c78e9bd63f267bb7ccfebd5301ade2eef5cf98d67dc62f637d454a31afbe490557451034c807d992e9867bc4d31c220e7acf4316e946e94d257dc627e434d3f6bbcf39a7dcd59e39ddd39e8e239068ab68a3097a661f21c035189ecc3b22d378c93315621cf31103dbfa332ca4bee52bbd42eb7cb739abcd42ea5ecb6fa6a98d62498b432d51eb5bbe6e3edeb9a53b4d3cdbe1aa6d9c9b10fc73beb8eec1b74fdc9405da1aeb8e2d2b0a28d58dcbfd8271ec5304dc4f72886a1ecc3937de2111dd34f06d2cea70c14eb0b0da35748b9391a46cf9f0cbd249ef7ea1fd5e96760a0b30f77fa9e8e810de34ecf8387fb4eff70cdc3852eaf7f689a873b85ba22c90d5fb8f42e068a9776a9fa6a18775985509fbbfc08bcdc56c3b8f871776dae6d3b435df1e432d41522b8340de3ae1dcd9bb2af867196b74ad9877d385e8e4db4a5161dd398f81faa1b7ff91b6ac9b23be2d069efb4f80da9ee7da7efbafaa3e986de55db793bdfabe17619ea0a2777b2cff7a3f6bfba3d55e3ed3aae72fff846b62177ef5d7b5c6db6e1bbf6bcaaba5775b23bdff09d6dc8dd2192185184d345f2bca3a4a69b7a4881295021cc4de228294f287153d6b32177dc518fabdd7d769ac755ee7df905f96c38c4ed3ccba7df0f9577155f23d599edd1ec86f2aace1f10ee76d6887b87dc63903ef7a318e6a62e24857ad63abb3853d07111703e6c5d0abe63f42f74ac35822f97fe95e3527a9086d23354920e09c83cd3318df11a46a305185151b72187a869b1ccd36ff477a32f026ae7b1c5420ee4a163db67e8d8eff61d3ac650237072b73fa063f26e9ce56e95c7ddce1dab37e42b77a317ea57d77533230ae16e7d5b5b3ab25c1dc53097c18ec96fa7e9d8fcb67d3bef6cd688bd48293baff7f9cafb30105f323f042f924eca1c922041c40f90886282440c7e60868c250f12d7065c3871850b1a5168818c254f9f3b66da86c1e243ee86b0cbcd1382370a973b392420fd84f57374acc128556e9fa661b767b82d418fb918cd7a0da3d6bb0c1545cb9d96a66191c69e4217a500670c78a5ec89b2e4ca78a53ce739e02d5c868a02c5e555175700b61697a1a04e709b8acb502b88e2c22e43a9600640948ef072c3a630b41b0ad1040c2e77acb802508a71190a054f3756b90c054695db7319ea8b2ef123528db1e51ef170f9442a2f53dc23a6d50d9584f0831615375492424527841b2a654008f486493b28410b2888ba611218519703377edb3b22be9a0e0de3a89e82abe480edbc70994ad407a25419e85c4094e68d36e41e2dbdaa47eb02d2b98028cd4b1ff69b6e675d40bc77dd3d8ffbb8cf72a9ea55aed3baee5ac8505c0d6938ee1b676d88774e1f0d638d36bd53d696f152d93b7d9bbe38a54000069ab14f3cef20f93273f8a05074bce3f5342cfe75a58a0ae00eac47fe25257fb68877b94b2d7662bf5a345300c3576c3101b90657cab66014c0f0df81f5746c5e5a22bef1f22ff098a163315794f7d1b1ca1c259be8380718f379533af44f111b3aa69daf6cb9291efdc343f3a4ee7d2b1f9c83e449a552aa59c35243342c1593dcd469e801c820dfe60e5a22be5055ac748cb34f5ce19efa10a9731c18822a1bb66ef8db4d402ef56d8bd9b6d8842df4720dd3de9d3a4de5207fe293e649451b72a9c734528f792a451f9f02fb4f3ad64f3d42e9187d8c0db9148db14a93b6052b0f7d165b59e5f85ad7eb6a912f6018b3b8a954ea118c8e854adbcd2252f122954aa5aeb2a9a752318a73d25dd6792653d3e49c9bb4dc2f02bbdb99e32e3f20db4dc93a9b701c132725bd506ff21ad5e69b09cf6bd7264f4a2fbd86c54a1f3fcd1e6d97dee3e43b26cfa948c3744fcc61d3f9a39a0d87b81a6f77e3da4c1a26248fb6c98f7d26a20b7cfa58b9974417d8f65333115d888fb5df4caa903cda6e5fa8b9f6e7235f8e2e619e77028c6f2cdee522de0c3a963fa983e1e66c5804c63c37c66fdb7639298fb6bb315dd9b589f6963b587273e0c5951f9009457481d227a20bfdf80d51db504417fa936f3fcae2398ff6dfb121de957e32e93a9b00699a4d1ad6242f8fb62b39e6866dad61c9e2e406e03254195d6ec78a5df710fce18d43203a7eab61ebd2297fbea7be4a53b6b32177a94b75a3d4b9ab52e79eda6c08c4a5d73a871bf28bb46e1f54b57ce2743b561360bcf18678a30ebcdc32b45cee5d194c6ed7458f765d4dc8ddefdf19e7adcf8e796f19c55ca68ba9aba72a181fb3e5c6dc8bd20194ccc1962b7390e54aa979fc01591d5cb271bb83d73e1c641e13f3540d5b37954ab1ec009a6e17031e7ccc53315fd590e6fc01d89c155363ce5f01e2b5b950c73cf579edbb617599c7d410881b73edbb2175902686e6217869ac6b004d97e620ebe065929a2ecb0a61e3d258577723d669deb14e7316eb3416c6b22110301a1b0271652ef3980bc9981ad25c8b39fd6c88d7e6323594f9ca126101652c0e368fb14636675923ef31455a37e6600d656c91d6b5b1291b1669c92f487cccfb03e2d9d3c7d810c772c35a9f0d6b81a78fdf0da00de3bdf9ccf9bbe1e63317ea9b1a32dd19f031ef62aabc33efa897aa338fdf0da1cc6378b83452def8dd108297798c95f7c68644dc99d3d3ef86be334fdd005ec6d2d8905e49de99d4c11a1b36dd195b735a73a14ed59a98181b73222ca0928cb9aa2ac51bd304e80a12afcce3953968bf37f878d086aa0b56a3eedc3b19ae8c2b653cb95dfc6ee8ce713502f19c0ea85cee5debb24e5343202e0dcd05cf1dbb792b26e6e0735a36042f789bdf546e988d0dc11bf3991a73ee9f9cdbd8d890bb3176e639959b67c686dc056de89dc5a7a9da6b6a58a47565ee7d5597e295f9fc80f495b9cc391b769791a9abf80da049a6767f3f646c18afcc5767d5998395e631356cdd984bd68dc0d39c059ee6e0692c372ce6accfd8980b4999da37a686deb7f7f7a3efea3236f075c9dc28e6e0652c110e401790988307bfb33e207d57d6a87b0c3d5ba4753bcbddf00520866874ba455a772902a9b9f1a659467461bc2d05c81d1f6d8814af342f3d5b17109e37648b346fd36dba4db76b7a6733adccb1ba80cc79d54d395da83bb52b6be885ad96936a359c37ca22a4d73c4e26eb867362000cbd557fd29b1d5569a9cda3e958187388b084de9596c67b451aee86f260c3681ad637f46e5faf613dafa4e9d8bc9739c60318e5b4e1bcd2b606c0f8a6db5d1173ca2d6a77053ae59c3db1f9504a6965df506e0fd8595264e7ce6bb1e33c1e9e013a73f448b9c33e7c24a0124a93db1eb76ddbe4fba1527764684c999e1f6fc4949ed2c9c333a0442fa5b4053c5f2d1ada515a8f86a06b23a6c7b512365c1e77be9380f145785c06bd3184d88769e8a494820fb874be8f00e3e7cea5747a5c73d74980f154d376343b030f4d095d4f5c02183f1f4a59398ed9a7290caef2c455ee9cb2b321e471e57b091e77ce1fd05c2939210642c23ef1dd4f08fba1496d1a8d97e39143f2c473f1092f748cfbf7551fbcee2dc9133fcea66ae401933fabcbe75855963c91ebb44ad330297f56870208ebc9f10297ab9de3569bcda161b1da30bb9e4ef87cab63debfadfbf1d13cda99062e208d0e39344cbb50d3600430642d573b0d3d00b9866fd3d75822be4b22938e3dd1316a438e6ad23157db28f3ac9de3c0109c96264a7be4ae965abd6dc8e376a479ac893691f5f057b3016beaac6134d79a369d69da9739772c668826f558bfcfd4b015639126c860c2df95f7cfde79f9f3baeeb04f5f555b958633c07e6482f6f0a963da63928e710d8b4374ac63d4cee8d431feb5c35ee81f9669bfe15b1da3f2da41f933af9d77346b14a9c4c4cd09dec26dd3be6937da34ca9aa669db434dd334ed3b0f27adcc3edab6597e358c81f88653abe1ebf26c71319cdc7c615ed3be699ae56c8ff6a4e31d8d99f946d47293edac1cbb437a1a8da81121372d8d128b8e3936ebfc3936a76c19268c0cdd971f8d90e2e57ec89ff1f2d97655ea2041972dcb28952051daee7c2f6dd7a87fa563b96d396e8c31c61825c7513980b9f3471bb5f51a4645a3ccccccf1bbea5c431e97c3cf863ceef72dd670e7c608820fcf7a0cb9557d819ba73b571ace00bda7fe020ff9c37a9f933fa007821d73cd36fc3eee365ca3ed4576e6d7334a162c923b5723cc25642ecc25aefe3d042fd35c9679d8bafc8af27459cdc3df99873bb0db13e6b8dc516a1e3353693823a5bab1791f943f34313397a9b361db7655e5d1b0ed3715d63cdb6dea566938034c3d87fca189791f267f6a5431b5d5b0ed60156ad87656f5d1b0edabaa43c3b6ed5e7d40c3b6779507f6d95e53b9e6d9e48f0dcdb3bda3eef6beaa223c649a1ae1dee5d5c3b98a1dcdab0bc1b0753b8b348b785f6c283aeebacd863cee065ed6c187f3f243eed270464ca5e10cb07b8af5f6220df8badb57e16fecb9db766f1b62ad6ad80a6137c78d1669de9053d5f03794e7eca631187b0952ee2f43dd208bcba9542a959ad7be2fdaf8e100c5e4cedb710eb0a1eebcddf4b8fe99f9b66d5bf4e27a0f2395abd990896632bfa10d4a48ce6f28f65333a131b9b363dac6bc0d4da8bb31e3d0dd69fba9611348c79ac7c1960b03a3c9c571190a075e2e962a58a4dc4e7a14ca7c229d74937835fbc4dd964419f86ab699346cf39e3abd16ceabd4a1a76d9734d76cb8faccc3efac3d86fb27e6da69ba6b4af272ef83accf546e1e305492b7bb8c65d950695eee9423c202aeacd2bc5bea95080bf8592579b7d4db121945a3949da1d2cc21d201e89d6d18a9d03bdf4c4419386be47d03e259a3787a37dae1406fb4b6ef766ac36672b5664205e35a57fb766d06c49d3edc79c4b3863b773b7f405a3704e2ce1b69dd698d364efec45cbeeba2d75d7e443800e9a3c4dcbbfc88a23c5d16737aa91dfc91a1b9dc65aad73cdbb598cacdb359b06344a96f51644e6b94a7cb643e53c1e6a1efaa172f5355f6fb91ba4c8db9aa6adf6a2c82bb42b2a7827587933c9293b29bddedb35a21499b4933115d989f1ba547f2523a9b561d3325a2018634b448ebc679fb0261210757e8a048eb767fca2c2f1a58cfce4e159a56386f6c39e937349b03e00c0de341e9c6d16b7cb518c186c53827dd6918dd99afbfe3daf1b7d9b0e96ee70a7accccd4d2e7b8946d8e86511b1691ed058cdb2a1ce2ba6c18c2c9c9090397cfbae1104e4e4e4f972d1360d704d735146008b6eebcd7b1b008ed1e0e71e9a90d53510aa08bbee9e648d23cfdf8fd507140701c73893c66903d37d690bb218f0b822008de2d1553a9d4bdfee99e4a715d4d729bb3455a777bfc82b090832b7270b7edf36ed6b5bde96e368402e488a8ad349c0102217f84244f9fbdb4a80d5b5b980b8f1976d800181ff2b81d99a45aab411578309dd1031344815c96a0310c18eed0f3a5797391d27939908bbd644b11d1293a4545dd303289c249a9390d2f486292a85911baf080d3d2b625c56d31c6188df0b846debfc71a32979047d75ee8d990c7f53e4f6bb8c343f2f4398e078ff600d8bd1ff2885fbd9f43feb0a494f1e159396e5cf54cd5bf1ada70a92a5564670606138620e5d24f1ebce5eb99836e895e23eddb51509830613ccf136a1e57f5d9555da895ae0ac9553dcc7167c33aae619d77ea2dd16b443fffc35011cac9c929892cfeaa381bfeaabed5f034fd3d6cad1e8277933c4e00c31e8eebde45785c7a2ef5beea5c9d0d537d55c1e651fdabade651ddab5ec3549de52e249faa60c3e239cdf2b45ed7530ad5e74eca0994efb8cfca4dae7289b0805ce56e6f25207d083eddbe52c7b8032179e655f31d9b7127677d68d8dc2a7755967b0fa5ac2a56be54658b7015260d60400c3097cebbbddb0883b9d41a4d3badd7b018a3a406baaeff6a751176a7e5b8f7b7fa561cd730ce864576ee76cfeb600d9bd794e84d7d4bd9b06fea2aa8ab7de757fbd4b4bafd88e928f6f49c91e96a877de6bd86cd86cd69c3223cb88635ad228d4177b62178d993a70fb54fad724600e3b5f78dda08b01f7ad1d25069de78be0b3aee471d378072db3b40c7f76878f4cf85fae7b2be0d04602079fb3974ac2f43dd6089e42cb79fc842de72bbffeaf7fb2e30d0cc71c3d675e186de9d15491e6989bbfca3dfa5ee4245a7db496fd61ab79bdeac39b7a3deacaddb69deac3736b7e3bc596b6e97f266a5b99dca9b75e6769d37abcced3c6f561db7fbbc5973dc6ee5cdeadd8ee5cdaaba1de8cd9aba5d8c37ab763b196f567abb196fd6793b1aafc69bb56f674333536373639194c0eb021fea72c7f8b3888ebb2ed10656a60043eefd3e43d900ca5592575e06200acc6d9f6ef6e1f7656df6e17732d583f99141592cd03630b69416dc0a04a9ef0915eb32541412dd07c6934ff8b833564360a97600ce1cc4c454919950339e1734aa2b6a4470e33b9b1a38b1a9a19991890159abcfeb5429ee6695238a2e7601bd2e7201c6734cdc72fb519ec1841c25f988e38d30a82bc1f0438e9a3684491bc2be6549c73ba1ec01183615eea73072895ce4cf99279e4b8e30723102189eadf4c33373d892513fe87827a44edbb9871cc5d990a3e21636170986fc991c1468a515756596db975b3a16c6db505ce4cf7c6a9efedf6a816073a962c6952e58bedcd6d23cfd50a671db8c8625692d376c2e5f6ed84d6e7c426552f1e20a18aa302654aa8a95cf2b1d9b519f581aaaabb4191dd5587a4b5f692d9dc54a109a5cb9e1cc02db5142f27a15a1a1f1c1f31e30750062f2d0753b688f5dbab4e77534c38c255ab4248958621a57ae442b56a217cfeb27cf6b27cf8b602a91156067bbf7134f2c61c2e469c992244f4fd229499234daa99dc0a491c6173060e2978e25799e8d5fba4bf4d2b124cfb3d14b73895e9a4bf412a397db5d9aa7ffe576a7715b26b92d97dcfe66bbda5ce293e6c2e5c62739446082086e0e0d6b6d0c2224b93a34ac5b39f0810aee0e0d6b29e50926ee031ad69bd3082e0f0debce083668727d6858eb38a191820b44c37a75822134b9451ad6374a9c11e6226958ab9e48d1c5cd124e2ab7671632a0dce6e23dfcda8beab1106c30a9c7c219e9c43d16dac8a78e85ad6fefcb251d0b951ad62740c32a9286f92802c40c3ef0f0c20376a83d3ac072d854596e9fa3b2e068d1c179e1a4816367928a8b0b4e971c1c9c1a60a4149719356a5c3a7d71b92e9f6ca9a1f3b2cda5bd34182fae1c1c2b9f2413d984cbedc3543605836d36bcd01869340f27d16cc82d691ebed48620194fb4c870d23c7ca50d4f9d6efaa64ac73be1dc722597b96489174f4f549224994e52d248030a18304fbe7c71e2c54bc35a7649da362bb9482edb36bd98540890850f1f506698613ae1b8f904c7d91c93499c5238956a3e49c9d94495633261d25dba98d15d6ee9de6698a14566f1de5ab4609151df1b0b962bab4b2b0dbb72a54ac3acb415281d74784232d94e0002c825f289bb0f1f32094ba7d46798a1d36830aabff0c2971c39da4b4fc792a4b43d2c9f34a7dd69184c52997fbdb2a0a181e2790d837512a5966bd2da8fe293342ba5803f8ad6e82681969f482e7d2c378c515063647143aeadc89f08a679fadcca861cf8d9106c79366c4530b7df592b312a5a30d1094c3f4a913ff389e6e93be1a0805948995e48b9128a4b9725330b98349e66d4972945f2f4b4e2653269f244f2f4a40286e4e94fa8c924871317969d4ca2bc3e13c575af264ace573651700ec6fc264aeb325f6ebc0e04f031c30b3978b9f1315d6e3cc8e5c6b3ccb8f1ab2d37fed372b360b9f139e4cfcbc29a27dea5b2219763b979523604712c374f8e96b572e339cd72d486e00db93bb97869e7961a17c49b83c47de6106101e393305ab1d250f24793d2dd44fef4b7b4b28051ad49b1c23d01a5b4a85cc903c6fdd19c9ac78afca1599aa77f26ad27b09d3427301c0782ad16cd12ad442b4e4db5ed9c264573ba54681a6974010386cb972f6678f1b2a54b172d5cb86431c30c2c5bb64469b9962b593a96c4fd685aa3a3182689b3344bc360fd9066a159e8533f5ae12b338ac3e26501b5d06c6999f1e2f28675e99852bcd10a1530fa738bfc89579aa78f85d3029ad18a5d6ecf2dd18a0fc0508bbac2e486d1ca9d4c26937e048216a561d1be685b3433342f9a16ad8b9645e30215850032d418492e93f9c4f4623e99502695e96466319b4c2992cb955cbaf76597ef7de9a563614a7e01df9760fa328d8e85329f797f3a75ac3f93d8bc3f9f6ede9f4b3a16ca27c2b8a9128c2abd6858bfa6ca25928acca2ca24528a84d269c827d2497fa9b2497b6158c352b2c9ed8712eaf6651327af962b8c669223a52fb3c069b5fe8423d3795f82d1b1231bfd247972a0e8e83c6ef1a26347ac767aa2f372d968252a8ba4d2b1c8c58be4e9473092a7dfd1caedb717f92374454bf3b019291b725d9a07fcd23c7ca30d5b376c2f4257d2681ebed386ef4ba4a4a63b65ebfd3883f8d3b25a54f3f4fb9b0d5b2dcd86a01625857dfafd29a5ac7cfb7108607ca8456d5e6cfa26aae39d580618c2621690a1ae8001c4fb45bac7938eccebfbb0eadee7c146f5fe03b6cfbe2ba19171efefd0b1a318e649a775732266ae432aa7d5a56e582762e659a620d773c8f15a5dcecd8958d91953500ccbc6f63e01a2b45a5ed7a96e4ec46767359f3105d1b056df7622ea95d0c85a9de7a9545ceab3194bc40ce733ddc65a9d88ff53791ec7bd52399fb92c11387656e335359baa5b9d089c7f9cc771a954ceab752fc5e5e4bc5aaf9deab3d4e312c890c20b6439aed767b2d6af4a9dfb8ca9c790bd3efb4e44ce6d58226ae8d829dab78e537da68446f68a1bb0411a52c85c76f6a4239be5d8d49964adcf706ceadc99e6952d6e206bd92398641859ea33268903248a6084ecc64e09e9e789b0b133a6a030616435768a3c8d9dcdc8d829f13196294e9976a7a7e0c5890cc858764a381fedbd80228422c856764a182fedebb3534279cd12e1d9195354e20b279c21db3e638a3840a20847c83a3b855a90a7e0c5892532d58c298679c20c94204bd929d2ced885194230828cb353a2e5a4125f38a18b6cb3347107ae26da5e966eae64fd245396726ece956832f923563632eefc164b369f64ca12ce8d57b2c9e88f78393939c994dcc864cee7346efb11363a59ea499ea8acbb122953fd08d616272799921919ab4712253232ef1f8bfffa64e0933c4999cc955059cc8f6039d5c86acebf279b7992a729abb99229a3f91136a09c9c644a6864383d922451a292dd3cc99326c3b99296b57e04cb8b93934c894cce1964586586c5e3d417eb886f551dd6117f536bb08e789b6a8375c4d7541cd691c33a5cacc38675dcb08e16eb601df1abfab18ef8afae5847bc5759ac23beab29d611afaa2ad6119faa1deb88e7aac63ae2b7bab18e78ad72ac239e561ad651c33a58477c57ca3ae29b2253abe596d69a76eff4769e977c6ff3b6f35fafb969744a9a2946209f498b9d848e674d0c4dccf93b31f213e4d3c8cc8eb0f18423b339ff33f4daf99ecd769bd4557fca91d974f76abeaffe9423a3b1534223564bb65a3832193b9b12c6183b25accc5ce5b8ead57f87496b5ab50c42c73b1c0782ad16c767c979dcdce6e57ba69d0d2179a4fc8bcef9271c59eac80612ed886583e4d1b40301a6b8cde6903cf23c248fbc90e491b7b31c248ffc0e92479e87d834aae38ef1a78e3fe5c85a395a33a69a989900e050d9d071e18037cea7e9b9d1c29f706437ceff8d8f7d8d574ed7c40460c6bb2180cf985870ddd4ecbcb67000608533dd38cff92f1f9fcf986e6a626600f0fabd8583678533e97ce77c4e003a72d819530e1760375a5c0058b871058005d7cd0a353958c7f119930b07c0ce9960e7f98cc98515ec460dc0b4c1c26d6864ce7473d0a7c7ce9e72642dd81913ec46b5c1c2735a36343267aab1ff8ca92686c74ed95e3f639a79eb332658771c768af719d38d03c04e497dc6a4f315ec147a261bdfb153e4674c37da5afb6a6f5b36ec14560d0b360c3a76caca822fcbb93e9be3d99d86c5cece986e766c52f65563a77076ced8299aa591a176c6d829d37af246d3d75c07ba1cafb36840993375423aaf1a9f31dd1c9439938b3f9c4f293273b733dd7ce63326d759768a3c53eb35e783e04d8be6359f31d9fc3b93f7d5f9cf01a3cc674cabafcef4c16aa8cec2f98ca9bbeb4cdf65cee7c114f3d7674cde733e63fa6ecee4b241fecc98bcebd829dc674cdf5f768af619932ba869a86449946bb4a11e4541c7109a211a4d024873146030482c180d8803125116950f140010aca85456a1c9c3200852c8184388218680010000180098198000541e778c127ab11e4069d2596318390fb9b70d0631d3624cfec472db1b44888f254dc463e725eef9c2f1e16abec0bee4251a9fc62fddbea8a5f4a53616fc93164f2b54c2353b99948be4f9b98f64404507f232cddd856426e95f7d2199e201f0c34ac3c101db228f086e52aa0959d88f8e72c06cf86cfd63e2a9e0f26239ccc8729f548dbf2b432932a5c86bfc42605660d2a28cd8ea252ffdc6b01f56fa15f05014f3a54ea1ba8b219af91cfa7f2335ad7187693e61308bf050d45414c5f674bea2ad80ee2e279a02618038aac393f8279c25dd412efcd64d04ed5e0400c52a30aacccd034b2b4c8511fda8726e6b4a30645685dd2f391ecbcb981951a025af1feac3864ae0140455fee64ff67d84ee5eb28ea8d70a9e6bcdc7df55356bcd6fe3e2813d100256e61f695537a8610f7eae47653994e16f15a321daccefc58e94355c8c87830adfbbe25e47e02152343d4e49e6131fbdd3d85bb294edcc9c706ba92fdd6b7b5218fdcb3028fcb8229681de69af5bc748aadeeec9ef01c61b5a4565fe188c393410d2c99c57cb36fd780f5a5df485155d987d9aa9a08fa0f63e9cdccd372abd922c3ab53c806ad739b16f237780af900839ec8a6946da9a4de30e34c87ebba7fd286bcc660873416a4cdf8c940751152c04d3f22eb70ac27c0f4345ec1e4b83342aa3909d996d4b51d7224238289b513ee95a98af8c968322b744d2d0dda665f64227855e4ac92851e7c85678855e50739e48ead1ade66f13daf815e11651aa87368dbdf4b98801c0d7536bdf964c03c5a22c5a7425d55799f4737ce51760b7340c91e6db045469c89d83ebafc042904cb91d5dd9c85cc53463964131f930a0a39ac03331cca1358ba568723ca2ad5337721481521d163d93746abe9193939028c6a84fe40960f9fb1ac9f5fc5d321bc84e8295770e23a8831da1ba6fc20ed01a351ff67ed317458f1b2b2f8023fe8f03e4d6108bd5c2cc9fa348502c1c93b73fcfdc2834374801c055bf95fb65dfea472077c8354f765224921f6baa66254a7a02df8980927b44d52551040208e152b8dcaf424f3c3a8a84aa785d1684bd62674ec799c5475426826c9f96e2c2c19c58b26c3b88c4ce2688012e542f222dc3fa96270a1f2ec379079199048d8b20f5fb38005c0b04504b07a08f3782834edbe85f5872a981e9c17810b2331b9db1fec2690488fa7e6650a493e366133c6e1ce6b3ed5c269aafc5d7b34a2d44900af0dc1105490be499cf207882ef93aa5095181c8d1b7aff5f1b6707ac41291a57810e4b54102c4470b88edca8b68bbabcb3582cb8c795d17531cb598892d277f3acbec0ffb1c69bc22c16fd0f8e0730cfb829690b0946b6216a8a41f0ff50d88d8666bea9c0b9ac562838138fd1d73a802068287edb2b33eaf8c0880336fc21d3851732c130bddd3a6bdca093d37a1e44fe50f80d8460e510a95fbbf64ad7490851f458152614b256bd377c9cd712a6ac39ff8ef2a96846f8df04f9194cb37a86094345cda79339aecccc5c8252bf6b7339c11a01f735c810dedca1d511e4df9f38db6b770a234736ef77fd45b4a701621a0110e93447efc301f370567848ff184b04cb5a5e0e3a21c0fbc718b9f23edf419b01d4a5a88f40798fc49b263e5ceeb2cea16097fb19fd15978a57a2b1a570e4889c0ded681b688499ddc4170112805ff0477a95ff9493d134c140ea0f5cdab00e6adf46bae383ad271e8d402dc3fb2905bbe4bbbd01ca51873b74b41c6fd1e37a34cde2052fbf278b495ee795fdf5248b3c2b87d929c5ba1672ec4c16677826a5b4e8244278d6b266c08e1c0d08cfe006593573dab792c3c2c4fd7e03224597813a71a984ba0065a51355dc4396e1bdcca006899af1d2497d1fb70341d6296343e2e3caf895fb6acc9d93e41b6760b0d26eb325bc049c992656ea512713e7af7b7ec1f16d3506a01b0cc014688e73d64c6c5c936b370d2d880758059dc86fd37dc93c7ae3b3c4d712087d2170fa10db151f329a3bd5b39e9eac687c1536e5e8d8016393f56c6d93d4527a4f47a8b2f7744199dbdf1501f4e3075076307a65b22ea21be5a651061de545cee2d200ac4d2cb56168ddc1f871a4452ca1d6795a7e88eade5a35c3f22a21bc638499cae9b94008d97962f105a3271c53a9674927fc90931a4d3572e9f23b2a426d028211522db8646acd76469134556a1a90f954c580b37fa3c6988f58c1e75c7cbf56d0720b1cb50df9bf1172aca058af651030b0802b9948b497042de59036e9858d298c0e17030cc0964e0a3b5f098f0197aa84b019740baae7108c65c5277e968b5a5c7d0eef70957681a25cb07e71f5f574412ab3109246bc50a248908666aca3b957431166f6354365a885b72a4000741c4776129c20ff950da261f7ac8542e14668d4aabe45e6594bb016124bcf2b282689bd82ec5b88798b7d79c21528a6ddaef4bd0c92002969dc6a67381413226a2c6c710cbdc2ced8104568c3b7aea93e22aaded6e07fd05a08a3d3a088b3849cf3ca00da81fb175ada7d7763256eb04ec1089bb783fad1487779c2478bce8bfb9d396aece885beebee2882f5561cbe7304f832383bb3804ac7468fdc07acd5a6059174deafd3c58206eaa713de7d63db9b7b10be62e61cbe8d48b8138d88bb752cf4566ec5e5470cf2081ae49eed43efd1bb5b1565b53ac2562370f192cbafd6e77e2e761ebcb99acf521f2811fa266e2e936956c8449b9368dbe20c06124c20354e3a5fbaab0b5723ff15fd2110317f7864676c4d7eb3d388a97ed62418ec629d08abb83a7a437f0a61cb99a2d122329bbfef04b222e824a367d153079494d70616c0a385b9efeac30f66a275c82d9faf0c6d247856b1137d137ada9dcbac7032e221ff8399fc5c23aba593a61c94beac2b3c952f5c80c678c084a6c4d44888da9277a45f240267cfe991ce4a27e28ea82c603da7751c51b0446fcf1cc2d688d4623d655750f9f135297028f0b1df43521f2ef37d45708321bbbd32d077a81b1e4699d490ffb4a80ad435d126ce4dfddee7e64eafef46afb7bbb1dffbdcd8b1977836644e87ece4b05ab6831c3f6bc0f24ef0ac7b9c21804579ba37cfbbfdc3c782440d8ff2246db6d481e8697666555105d9ba146abc38f61880586c890b8762cb9f7098cf1e3fe8614f57c5d7683054d99e67af00fd316a453dfa50415d77dfa78633e31302c90ea65962b3f1c47b063fff038a64f87c1b17ab4a332d099cfd08584d04174d6b2619e637ec0ec1d8cbb49c876145852621d80c138f6be1830e03cb53c9905d56673c0bb2156a3696b478eaab839272f069a8b6eff337f4450ee6b4da5d10dba5437f6af46bd8cf9c7cc13a7ee1c3e769a53e9d3488679459781c1304da5e74611bfd98b8ef8eff0761a122cdea321570249b7ce1b4ca6e3833b8873b710a7b8a00eb04aabdb4ea8ddd7ec99edb037e57ab338ad68aee384c2f4c8be8b0b0cc3ee17fd3bbe620fa840d88b838f111030a8be728b96776ef9729855204d13138fcc1f60317bdd19a623d57eb3e8c4d637b071ad37655dc9faae780b99cd015ba5e25fc04f93125e473f2371f9c4d7fa43302f18c10f3125417422e0c24bfe50aa0747f190e54e9a738eba28880f0c4176742bc59e0770af2273ff9f26e708a3edeafebbe84815eb22b7d9fd8ac150a084f33e715b0447ac7e07b8c6b0f8d0ee86479ffa4a40da900711d68501fbd1df73a5154859e823e78eeee17b6380c2136243089c67f88b29d45a4c222329f6f8dde34fb211d947d41a9a0e5fc12439dcd7482f055f44035ed28c194cedc60fcee0a0995e605b153bfb4c8b22c551dc06e884a462db78e0b19494934c5ff1b1d67add3164ce783d4c5c7e46c3b60487a3f9317f9f03a50420ae42104eedc818222dc8ff382dba274672dd04068843c2ffa727576bbb126970de685cb324717ab8e8a387a027bca01b3d1b45cedfd6579c49334ced2a8ac2945f96da12124ace904d56d7e097ee725d54791a59c0f732badee3ad11712246204c79e46f57081a68fe5ef3a44fa7dabca6abcc4095aceb2970866e49036e02532b1c65c4b5ab176864ef3b0b2e92452fc61430fb4d0c12dd00eae04c8fc62f380a22a7eea1bb8608aaf4c4e7d7819d891fdfa0a4481179adacd3c2b9ce9a63e5e6351bd63d2a07ef32a9c7d8a6ae37602c6c130cc82483a42b53de44f5b500faaf1d9009dbfffc1ea9339138438daf5f33c05ad752d97eefc747d4274dc287ee8d352d62d25dd4344bbb384427f29fc4a91f8140d5b0a2dca34d60bf3130d4e6f450382b958d077ebc95ee9aac424e55d320b358476457508a564bfca378445c8566398d8c3dbec59aa9b21e9d5420eef814c5876c915773f48b1272a671ec05f41ad91762db85a4077338f5270f8f114b802b2764f88afafb7d04f95918d08d5589119235522a56004ded262bdbb56a60c46c43a42dc153ba6aacfc2f14daa85382179e80315f854236a6c1c35086809a8d93a71ccbf16a5db40aaf79c594c1392465c4b91b42fc3964d0fd998800e4024aa1776293e40ae533022360951eab55534fa07972a2f66acb403d344e7d32612cdf456a3555ad3e50aae04a200063248820f04e3ca290de1dea61ee766cfeca57de1742565cc105b4c5c84331159e457cdc09a44beb33782dba1726a9b40a9f20664bf3e13d54ddd30897dd47587829f14095813ba0382a9ef9f9282cccd9d5f097549d9333b0cbb1cff09ff077cc00ec7d0853023942e197a6883605c5c2797735664331246c1fc596b1d63b7154f95b3dd739caa05deb5c2e5009bb29ff1c5100c0b7c77533193343c18114eafc2ae7aa4102d6c74b157317237e4b056eb56681bc17864f2a2fa3cb427b7fc93ff3e3f51e4c18b18021ba9d706b2e43a8dcde1573c26f5f5a5999a181184ffe5fcedeafe2bba27755b7e480da9b800841dc49877a864415289f67ca566c401a628b3877cf1fe6dc0d1ec10eddb066b151d1e96fe1bef377e79af4d89097db4be7ae768457489bf0e0bbb88f9fd857fc84ab09ed1c99fe400d98b34bcca31b3d47d7c7dbb49b00a0a5197f75999cee8a596a1460f87f5cd704fabe87b0fd14b482538af53b38b854ca65ac209de5e57d3c7698f8fd2ee7b9a0091b9b0c52698d4373c56861b84da3d0d64fdf6a51dcbe889c1993f869948b9ac29c4be7ba09cf79a3a3015092793c7f2dc828a829f55958a13b1398ecd8b7515503ff082ae3359ffc90b2b32a34bcc8ca9acbbdba0d322c4cc9df42849945734b81161f1e31ecde9ff8bb3e42c8523179f47b6c51f576cae68999c96c5d4110e29ba36a9dec3ee5784fa4b4438c420484f278b7061d2ed2ed862c141c9fb08b940a5d5e6595f3413e6a95db7c96938da01917a2a984f7e72f6116b5074f306d9cbb657e10bf0c3ea6ef1bb8636fbdd2b6708135e9f384310d00e30b46e7e6ba92bb169c2584c158b171489bbf1fce75a09ec92ee910d4a65ece162157bba3fee71aa959f56b06435df6cbd3eb42f91ae73259c56265f45787d179dce64f20fdb48eebcd13ef13ef6f83ee13db5adef317611a5e8f7ecec2827dc072f0c1601b734b267a50528254b71d07e9f6f185a8a8ba8eef47f255b214e1fb8e61f1c0638bea2c74451d7c27603ce0140a0ed2ea2f50665fdaee9b7cade7cfa92f7761fd03d304f08a4299a85c4f973247a765675da4c4bf4bb70dc285d88990c3857caec2484f1f2cf9dab5c2cbc1f0cc68392e44f18737d1e0eb1b3ac39ac9b9f18c2d56b4554432dd7795bccc337f7acddf3c2511a6221aac2bb0b88f715a754d5ab56615bfbb01b360cfb6ad478a73c92a5db8302ed169be8b28f3fd34b2b5a3e01a709ec44130fe3a2f776ad45be21e024f257b03d9cd8d2dabfce0e9687fab36d4d94f21191f9022ec69aacbad08e953f482ec6f506f2f8719e74b2d11b152cab377f866c8bf2c868957112ff9f3ad9fc0b5accfab1b523fd92c7007336b89b9a5004cf8194ad3e4592723e5fbdc7bc6c0de76769e7dba5e8bb98f93b9ad9f35e6fc7786e60add1f2672e2a1ec24b62d00e95760c65ca0d031c1965858ed4b44bc61d5d5fa3e542156f9dfc1dd61700dca2fb4a9dd3b42f3efaecd3e9408563a90924f839d7c1b4e57466e33e3014c2acec2412fe6a19f464c7b75b06da9fe568bc4ccdb80dec3065fc5d4d686e16611b99b42e7262f4b4d5bc95d093988e49258cf44971ba45933ed0f0b15d3c2d22c336d9b4861632da62aa7a2572328548ce2e04949fdf9957836f181d2eff6b9aaabb2631f87ed58768dab8b8a900bbfb0d3b6ba1d8b773dd36756dda4407c25fe226da87eab071e1e916b46b3b920298d9f96c4aa64e7b6bc9d33a7471c5458f3a6336fc6aa1e2760300d125ffef2d7100a648458df7738bcc42c10369f6dad52c953ea7583b7cd76a10726808cd2f82c2293f598cdb567feb8206c91371b4e5c26d8a331ccd101b624369041d02d5fb73e5fa5e049d839771a1ed787269ef0c4b4f408e4f2379259654e4f37b886519a2c2cfd989b09a546bb18c346f0d4c6c565de7f4cc35170294281746b071febbc80d5d97de6b24af192bb89dfdebe7d7a4e7307109a7f45b0d7b640bce251a6ca2ad72bca8ae919bb39700cde0bf60a70366a2e5c2e26640b50a1f250ca63c14f3532c2652c512f1b106dc612648af0b177d2068d7018c60d93ebb3aeffcce62777a629c5dce425c86f2f1992a13c26bc9aeea5b5ddc728a360897a1b8a0e3202ce054fc4b86a9179e535aeb24219e2e52c631efbb69388aac54feffbfff5fdeeb96e2cad6e2db2091fcd950b85e189c258aac898fa20a4f70007a5f872083d1bc30ed0fed8f8f889db7d7d5f92f92e672157eaf002dc14508f3e4f70c71ede66abfd085dbe816a2907872dea1ad2f16824468da49afae940d9b8f508502bf27cc016814a7ac8c812d880d283c708916dbd5f9defa009f0afea6e3bc8b9e74008c266a40f5793ca87a008368c099666fc53ef5efa5a41df0f7078461c3ae2aea6234df4bfaaed65be5be68bc3dded9f58f51f11d1f823754c84befa586139f0e5afd8938d94fec6fded8a67b90ee59bd3a429cd1b75e58ae11de11e2916f0ea46c77a5e294dfd3eea664b8b6e2b1fbc204e97b86f20479c346eb20dea9966095ee7998303649ce13247a724071b3e86167734dd9aa9231e32020a06cd492a2ccea1f4999b99da6cc18969bbbea53b224293884a3bea10805ccd9d3809592d4679d9a34c628cb88b5c42dd444bb856960247a199f3724a379512e3aa5dd6f0b5c5b04243428c8299b465c01b4225243e1538bc923d1df42e41ecbf6537b712b2a052875366cd8476be4ad4e467742907ce2c65f31692461cf620ae327227e02a2f22facfc872ed1d378800303ceecac0280320bf314b9323197ec502447bc431fd2fda09fb4d87f5de52ef68820c792d76150684ad3b357055e00c6fac82be72bea3924da55249b84095bf4815db84e455d67169ecd9ab020a823683c9515534943bcc30739de81cf2556cea8030f445c57b3ac8265fee48460c04baba2c278c7ede4bbf837c93ef3aebb277edb38fff068fb0822b2a2d00be0a0407b830afea52b07e06b0488eb0017bc40a3187b06955836e0b8cf1ee11f54f8f183df7e66badce3c497bb3afb8d69a475da091d0f169c8e81bc259dc0db4ce41fadab71f9ac3c9d0094ada804db4b5cf49e230d07f49cf31e3d1fb2da191b0358cec3e2f0949dfbce960f60c5a9de54b79dabefedd0054257537454e20707e6d9f7cb39dd62572ca290019df0c4072d18517817c8ec47c0da223a34c48745bf444e698f2095636e4eeb1da6231d54c764bbfcdf04a754541fbe16870b46506eb842ee4d740242cdcf6c56857cb7dbdc615da29d7807caed76b10fbb576c06f6ef2a6b1911c04f810da738966be2b6fe9a02d50857833d3e6a99ec70f461e3a11489b1bc74138c3488de7dcb462c1307189d09736e98c343dbd52cece5c61192964051e7f4e93423ca3beab24be88ebd8389160c4d0160b42ddb444927587f1c5aed7f41ccf808eee9d5d257c23f0350059279e60684ca2827b09d2235dfaa25d79a18b5b6a20db4482deb16946086886ce92a29ab7f5e3fb0815f5bd997cf93954d4b41911cb90aa165f45f3d33e425c96b870e2ef5d2ee2d70680e729fc63e6ed9a196bbdd2ff9ec806c63bd36bedbd4348ac1d72892723b01b09847614e5d8f0a2d4b40b9272f1e1136d21b762507c908b9aeb46e4a456e5188687f7c4d78873a45975fce2123ec6f0f427cb07ae77e2922aebcd5f5c50dba79bdf3ed9b8db4ced575ece8cf3ac7c90060d925a23b726f221017768220daa44f2510e1c46aea45b13ca19d9189ab517024e816907eeed22f485a6f8443310c22ececfeb129351dda23725e3e684111cea186f08d7d3edc5a7b599fbb9d18f57bcb19d5400fd3313f1a2b85683782e50298ba9e42509627c1703af109a556a3a16c74a1732d77329f37a898cce4f9e608c598a3c0d0958c12fa8cab8e9cf94ccba28a3a148d0839a81ace3d516d9629482919c24ed1cf874faa521bb0bbe4f595ed7538cea0abffc89c50ff6ca8817fe91fe466b342ab8606546fa624b8faf7a4232b41574bcf91190b4536809660abc06b0cb675476578cb4655f398a363fa3176a2e939a76d12a70e631b6d16db4aadf5905210198a83a84fd97cf0058a72030d342ac5605e29889f26e8bbb3591403df86e4dd815916047cb7895ff9f228e63e45ef57c5d45bf2bf55134ec5e92c1dfbd50e67ac14cc327e70c5ecbed6a67f205a90c224ba68717dc4d2e9edab06afb4d20bc4d5f31360d188efca6cd0d4ffa572cb638dde3065ab6900838d30df83e3595140425a48a6fa748c3580377e88ece5335824777aca445da07314b896325c9890bd581ccf1e35bc6072fa86834239d6b035cfcc318b0abe304584849d20f8f19d41eff4645206084cc369e09762840dec295d5339b6ba76a440cea27a894a18b820ac33067c25f1ca164040248a85664be1345713c71d789f0ad27504be40d29d1f3000338de33a76d4530819eea5a1443d33e6343977188331275082ace01a07eec6821a97485534701e94beafc18a8762e3dfab265551385c286967252410c70938488af2e8a44f89593de8abb05dda8067e44516644653411c8d9d86d06b4668e1f7a1cccedcfc14c110b9728823de3d14595916716bf180ab3fb2b9a17f14bc37c76d3968d4188c8ffa4556709f6bc865a93d4bc75142ffd250ccf5e8f89e80922fa943cd310f07958a82135e2e1fd7e51f8de06facaeac3103182440346646a956ebeb8569f899484a61959f31d770361ed27dd47281144413abb87c63dc1bc36c6d9e0f3647b44e0cae6b35ad264777dbafe986f0a2b77e7637030fc84dd2029061a7f42a7f05563a0cf5f9119979043334ed524527040b58fbd7356665461378b699c774263299fa72c3b535103040f424d24eaf0c09077865bbd457bf646fa3e9f6ab898091b6af42bdc33b2e6cdb14865a193336d73fb5d6353c9684252dff0397229bf80e3ed8c3c7af491f53502ade5f08e1d511cc6e0ee18511baec96f0821ca24cc9574516f96db3aec3d7056197beec9ae4dcd376b1e6aeebee424b57bffff6ca3a1effeb8b8a0e00fb3f748beb240f75bd2ffb40dfa1f6749078a1b272afcd1ab7be0e8978ae579d651bff2cfe6008cb61c412bfa2875ef63ed5faa417d2627f52afccb6c274d76bf404a93c0e53b0a9c5d3d4d2b7b3ea283f46168da8a623d30c14dc38835e64de551604036d4d84034a713b577657c88acffb2cc344dd78c9221d6814cfee5e138701594beb99c92ab1ba8726a9be8ee5d62d11330e247ac3f1c2961014e06c83225885040d8181c9920676735e89c189c0c662591b00c4d0d0a2e80ba1f65d41f981c47b29f07c7853b2c5628e94d7b4fe9c21267b2cad41d4ac4d3fd21319309fa5faed663dadda9736f97df614ca7476d1c8a1ace7fc7eab340c1cd1500486c62051b01937c3666bd878c1f2d818f57c424ddecaec645c1610022b40be573ebf99cf8f2834b5b93a828feee448fde63a36188eba94b76fd92b6002d0c0f79e3e2f16f2310334970f42388aaf28a96111edac41a58872cfe1d2fa6993a8521cbfec27b2ed1303e2227c304ee68bd163194a37f9f1fcd32c2e94e9ad269d90386c13606223010b5aff82432267d40f73f70cef9b369014635b9f526a58873d3b1cd351d8225d79494fb22ef0b5e84f2d0496626d8d143ce266c98a7a22cad1088fae93c216f844e9a30e8c0b8f4ff83af02513021e650d2e555da998c278641fb249ebce93b80701eb048e99aef6d4cd1c3b41ddcfa9039c63d970436a7abe57032e26e8512bb8ebb9f3e805d099aa79e8f863798ac953868e579278ac8de79a3c67e53935cf9975a38006dea4b8c195474b1a941bd54bceddf646b575dc38745b8a6d4ed202ae5720d8a40e55c1b90df76d9fa857c1da47a551999774592b11c74017bed421ae5ef61ef8a28a6d71e9bc1bd6f77c703961b8a40a58f59e1b221a944f33fbbca63c12699e1c014ea66a413c1011fc090e737cf4689ffab0e02644ef7715f819c9b47989cc2835f02272d888747f7cab632d984b241da3975436cdb86f66834a43929826d5085a0ef1d4771f59dc3d5e8beed280a42df331cfb42cc32d2303237874b7d2013a1582b44ab8fa8a7223ad7695f0b12599bc502f04f783045d82d7bc2715d9d30e9cb03e3d0662824aa09f94a7de1bd762a7d4f972a7aa8f123d0084456f39f8127810bf239b3ffa17e727f6499bf3aa362e53d33b3c28108cbea63e0e493677a3fa2abc3787f19c9de9aee35a437883f815730b888ece531f722e566c66fa1904f1857881d6c37fe044e83e33b5f8fd38d3650a99e595ea809686a68489c211e83eb3b530fb7ba6cbdc9966ae3c158a2b8331a0b0a6df787a45be21eee83b7d1debe2f131a0962d449fd060ada0219464373e90b20a16cfb6bab35dba56666d360d9aad40992d316693f7b2151c63b987a5d45e3c8a323d333e983b979019450b439a3abffd0c74d3a506c75e45145fdb1a2c8888f72861b800a9ac2fa8a2af6d0d378bb23247f7eb0b99922532dd8baf7301313d588604ef2908807cca6ebfecb4c0ac47309828c87b0a15471b2520ca3784758cb74edbab1bae4644e76c409ceace28103e49904954a9e3ae110b6edbd306869bf0efedd7366b73333a8bc17ae365dd9d128b3ebb251b6d66a5ecc43e4dc333e872afc2cc24ca69938958df8608129cd0fb0122680f2c60c23c8a645e81fc02d6f5c13270ea15d1c49e5ef968ce64bba37a4ce22b69e215c756f2d8ae03eb32f07520d6cdd1262825f227220af4c438811d846873a125c62151fe6f73470787c6af56c0e02617c1fe708221f7b17d99b057c26042f3f10defea5190ca55628a36ac250a98a907b83875b0c7bdf9fcf0287f4da188d229cd175ba25e06ccca5c4fd8e146fd6b0f36350d3b270b8ca5d582730fb79fa71424a401daddeb37fe328ba75380ed8b48330a563b47e9921630a7cc1deda8e30c264e1e8d0db80743e5e7a69264628df10cb71c598d09938960f43fc23da895cd0b8fadbc419be4f22d4ab86e017963118326889f552fe7f86b4e05f370f4e558bfd76224222145a02f2e343009f02a3482fb3fadaa47e78fd671009108a944f4b76c91c96596b093b6eea7cbd7a75deeee3c68e1098947d64ddd6cd58bc34f542732563d56c687cab31ee038017cc6eaf1ef79b52f81738a409687cff3c442308ea01a1f38fd6e684175525d24e009cf6d2d0982fc29c9b1215894f600191468b9a5ee4d8dd3c22ad4375fd918b5858a2da3fef53a8ca4be4161662297079617e1a371306b591be2d8d9cb8b4ff208345160e654f4e235502525ffa8ee3bae74b875cb6f1e5e1a7b8474623f4f22d70ba01c199a29073adaa386ca59174929c6690d5263a1738fc3bf0f75d69b12fcd80a84867b637f8277b69b69501759079708e325360d40c28aa05904871c8ca5bc97cb40c9ebccbabcb4d8440643343a53647ed4d9d0557a9baefd6575a0874ba5d982996d7a2f85992ad79b07f707b65d193e2b906103fddc1c1299980922d94a3383e7ad7363acd6b0addab3e1b2eec7c3c3bbfdb9ec528a35d9f9b4e2c3ed37ad8d6b8bc57d64b647bf64937d32cc9225dd9b023238085eeba06b554af59facef2c22924941e4f5eb89856a45f6572c4b0910b2186dfe39bfb880ded042d86a9cddce324cb11b838efaa94206cabc05c20fa3e0d87ccdbc64162bddd3dba0594f01723239b617707a39730e6f66d4ad3ec7dafbf7646066c4cd4c437c4858af026bb98ab8d7e350148d6d1fc8963e77be700933bd6f5e0b80298705cb24ac6c2c29e488a13e71a311040b6f6d7d2498533ae5b01f2c50c2675b4019d15e582e54c1acc26a2443520e8d3eb2d14717b58edf79a91cce370c90f15fe90f3a88ac90b8d89024d27e79d5e3a17bf4b3f81ca7ff991b972689e50ff1d2c31fc24379744dfffca034424d6e6d7c882320cf12a21b1cb8768536d122fef4f5918b2f55fea475a1525b456b278d73baa0adfd60f878bda2dcd270f0dda035e21af67147e8b702c1542e0ccb548aaa369f1049c5a413ba7627f6b2df21d597396106cf20486c7f426491ed3dbe238a9edc4af5d8d66e6814995e839c6a512f7107d1cc7fdeed163a9d5116e45fccc5f0dadcf07237643cb4197f6607df4718e955637ae303ac5e81ee68c047ec9477e8dce74044d017ace474337791f0cbc809b4e8892a7723b60cf58144dcadb2fd3c1e06fde4e7c0386fac56108843a8d9104243afe5293bc3d4dfb02e2ce36d30f8cf4477258db6c62ba2cd5d20626479f89e1cc00ab93a4e1005cb27c6d3af04e097751f96399578402164db41d913c8f357d8c5793d20796dc6d5f7865bcccc021b8dbd5da65d99b65a3a9cdfb8531b5b3ae64edbd01e2abdfe5b43bbebd69166c912ce5ad8f8b58f76c0c0e767b502a6cdc68a0f18b2ab4ba13459c649561ae1693bf55c5dee1d147b150d8e8f83149ae4f16fdc4d39bbfaefcafcfe7503319db2fa2ca83b00d1289ed058c9ff0175a4021465310582c7de1d9604436840d9297433e224dec8345823d5d23bb115eb2401954fe65ecd394d78d0b98b4a2419ccb45a08bc3f243185c7cdcde8b1ad0dba30a15bcfd335149639295f8a28f51552a34b196f01efb7cc20936722bd4242159c7362d316192733777793dbfbd300bacd082dfa7e96d9997966692521ed3500f089b78af58083c42f823e92f647cfd6effcec2775f0e258427971940b5d9cd6049deca0cde9d96abaca0ab8cae117b4de1dd485e9a803ff15feb3c2078e6694a8674fdcab970fa6c8283b56030d01898419bcf2ab7d111e98bf8519c43cdcb5c372646fea60a25a85a9c198c9e6accf3a2d1c2d4063a539c5402464880371f2eb44d8a16e7af84e5b8581db151e454dbd50ef1afeedad33fb6b6f88cbbd83ad3e77e652970e0ba03dd9a10384f6d62e4a631f2775cd94ba7e926c0464157aef2ffe5cf1f3fdde7d588c28b1754a36d3d7dce6d2b96f0807b3b61131a9c3845b9a72745832a06fea0b6cdcf3474e8f516d031b1ba06eeeec6cd86eff3f92d6366dfb0619a2bf516ac0e3795a3ef39e0755bc44eac63ae015d0c37dd0420fe622942e56412193b1704277cb594126542d9b6c273a04f49537320b54892d5c1495f4717f1c2e07e8a74011919a1de40bd42172881787b76eb85570add5e062c54480f0e43aa4be40db67508c7e94ccc028241ce7e1162b5ccce03d9b8d0f2b69a2a0d02b250033a0ecefd41cd531dd88be761995cbf5e2dc07d1c5e3a8db1e83df76c440b4b52d47d78cd769c479a67499a956a19261dc0b7da1929d852ab90ac9a748314e460efdae110ad7c1c638dad6c9e818e936047dbd6feb05aef9289a73f30b9e09a4b6eee9eb04e2ecf18f2ab88e880975537eb6a7c40068e150d15b852467b9cb199b8c9787b1a9c94b46304120fb8a312d94458d2dd7ba7c740c4b595ff3943bda44c1c6d7796dcd44ce7a3b96e59cda78c89782c21a8d2889a7eece49242cdf9f9a7608d6a718fb7b7238fa1af181311f044cf7fe1d3e2045d2011bdb6805abc80de27a0088230752648b72e9b542d31bd0d08f997784e3db267f1690fb4f23ef3a6a576237e37cc35c42ab9261fe4488a0dd8b268da8a9a404700b798c1c12994a9869b2d3af05b287b340b14a70db84f319232fbf82edd4cf3c8ded55cc40b0101f4d5e6d2eb79c74c23f0bf1f504aa634034978f6a26a4bd0f95fed3a3382a0a9e8dfec27ae2e53f5da6d2a7caf7f6a9e4053c633e0d23704354c6b4f265b30b68a7c6036fc16dd13a056b8bf2c43b21de27c9f102465f0afcb77619b9f543677d833dde8a1cf2aebc9e0140dcf01258613408a19be97f2923c8bbc569aa640d0f269031c86cbc7d7fc328d72663fe42c50226df0ad7342b6631a9f7d1a1ce8b374e239b3539a22e1761f96a266ae5218db3132be94b1618d6e8a7005d82589474f068b19c651255d5f25af954a465a558f29c57dcaed633208267adc4eeb040870e66e4501c07f2512ec194726d29846484e4f9eb5088c0735933bb361425088e9c01d95f3450ede3e027250a78bf53d51a525b245cd000f7642253e6596282e51f0a5a9f548cdefbd2b1761c63caa83a809ba17f21a05bed1345a619e28263f4e1ea12b8152f16fdd1e55d234fc1cff36f5ad9ee5e874a363d8cf25f31fc823dbb64032f75d2756c6f29463b11e2e7668d1ccad1ec3512f6017a6c31f03ed606b2b3ba24f6bc5982c2bffcf7e4cf5e4316246205727a928eb2722868829e2f059f8e3239d736ce4fe782762adf589ab70b2454ec06cd899a4ffc1b0dd540134131a35a0e06747f71404d2443f45af741df7f3945e56cd2000853ce5e54eaff14075a9c032590f82b0cf27b37b19a71d95e0940a9835b94b0359ca4542bdf65f84ad3d6044772d7da393a3d9a4a4faf92fc0ea7c9513b25814de2a953524ad684b7f208a693ff8904bc67a1c81489560a4f76e383d503eb05a5bf87d6bb266bb730d50533c31d73d640f501045c59a321a0126f84e4e21e4a1b942437fa2019589586f4231945627e5d319911919f4f55fa0f1c06700ac5f66dc8d819cd74ae6c32a20f0720e2555f187b1e301d91d374d10646c46b0af581e46fadd92008d3c421194f9dd03cc233157f1948c74ecfedb656e05cadfb75bf4c850af94d87bae39441f6343b7058a86b1f1c8fe5b2073f7803029db79556d8dbf49a51c5cf9c79f90af7f54b24345d37e5e0c20e72c1ed9028e08e83c6916aebb1c2aa96e16e2c9ed4d09aaaf44ffc49f6d75de4c84b54a17c6bee87b3d3b3e84928a811af2123e4c5a09af2f6c507484320d96885f6de86672ef7b1e84c4db54c526383edbd02df46578fa1206bae4df1c83e8c3036d87827d33c110d96a242d03818181918192987f287d013d12858f6652060c936c3c612327b8b81a5f007d19005910ef044c93812075439ed67362bcfd450a125f78f458e6e724849b6bcf4465409608092c05321fbd203b538491d1ddd90a5f1fbf9f54035122643d128fd42a35f65809c6501437d56ce29bb6b0548f0e87e67c1edd947e2d117fe00f48f568bddc1835c1b565f9d78be29c9db5103accca34732a4bdf093b1754a3fabc18623bb118bb7db35404002b1a2757d0ee47379b8af85ab6b8b19347f43b12e52521af862acbdc7a0b5c29cd7a8741d51b332982d1c9c7e18a9eba3884bdd5a525beaaec41232730fbcdb809fd1496d6e31a8263da55c2c7f3363438019a6b8114e383e67812b4821ea1478a05818287e373a03bcb41762f0be7de7a338631737a5a7e02afce1078ca275c36892b5d012d5b1c2d4ab005d067a5632ccdfd83e6b3359e0fe00f3efd91a9c38ba6bfc1a342c7c47f1426017304b8409e2435b39ef00a4b2b9dc6e188a41d0e1719ed8b43489169093e142cdc28ea08e12d704ac490fa3aa9fa6997f8946127840e1a7d6efa11b86cdf4f2dd8b0d18fa436b1315701ccedb158d7af02481a2a461dfbc452ca0a1daa6987465d148cc9b3f237f5decea6fd002dec9afb6ee4bd5d10b4c08f1c0ca08713ebc0a783f4584efebcbc2b3c540aa47c784f622dcdd251d33456a9fd9eb1fc82f263fd6ade49dc1585431b1a9b4a887f6e5088fc8ce498e7b4fbe3d446f5b153e99a3af41e452fcbad4ad72c798b43d399953195bbb47a5fb36ef315223852dd19525d87d02b3185ad0cc79e1e9fe805d249d5f1e41e2fce85c9ecca54a76c459ddd0e762a0b6d8ff142513795c2ddb9a4238cfafbb5dd33291b50e21980158067e031fe21e64015b0fd5f54b4a98222e9e3711f09c80cd0438930c2221cc33b8cabddf485be936ca54df686c108b8a995b8c04bbbee2852f05d864293be06527dca074087c1873a3341c218f13080814a908a6600b65e1de6a7fe6a093d72ea48dfbdcf4a6652e55864be911339ef5ba6e3360dcad5ee1df388144d247ba7192e43aada7005c207e903fea8f4f9f79bd326d29adf5b8360c09e7f3ea07224ee1f7a00393ff343cb4d4e8129ab93e9a59f81c9e716dcefc847c8fc8534a01541026bd7c5d9c264c34f8651c3cd180431660ea240fa2ec44eca0dee8d1d05db301eed86ace6be4b7fe5f9274b2e48cb345a1e78fc73462cb9fafc095e32932e976b0c76b31fda616f68bfea49dd49bff14d5191dffa6d9712bf79ecb37d81d09f47f8024d7605e446a4a57dd4dfb1efa8ba7e61fe27087b8c6a91694f419a54d2781bd21f122aeaf56f284f1d4c5969cf062e4bc1dcdec2615fe2230b8a5c662cedc44066752ec1652834f285cd912213d62d1618d7263ee947f4b396bd17dae2617979b5c7428856c64d615f7db83691e4741118188c6cafa1db23185bde7adb60f9cbd1874d5081c4198210071484dbfaaaa4d0b7ffdb23bc66b37caab4263286a5781504ea5291fff6b639fa74512757b13f60f742b98c0786b8eff846b9270344f55cae544df29c9c8515e9645e006de45e80a73ee3c00666a12ed6041624b3ba1a1b84248de89a79f7b23de93cc94c03f02e9930d2716d8a0f0d8e1d8b40fd3e6defb0d92a2b65d45a1be0f0eb0d4eba25b5458a9f029018232c0a0d05e153ac00e5ed554b2c49893197105d6bc6c902608e19704f616b776f3b6829015c512393fec1da48a55030ccdd5ee5de09472d7cddb02e72d265b548eb322f3f17c4304d5bc163668796e28bc3cce853d2812941cc68bab83b4a648b0575a63db3b76a4834ee1843685ee54e54e0e8b20d2c3b4d60b5b996de7e9bb321c3aa60217b99eccb4cd37ba68c50f081755371997e08958b4ead5b786d5da46c35771d8399cc6943f88061248422210c1b8e9d4482b7f7c2ed128850ebb583bffd6711b160d465bbb9f9767f9c1d94ef4b3a6f6b38d8758196a758c31b0739e55792574c062679338ce4a64091db83a606c64aaabd0584e0c5838f64843b69cb10283154f5e6ce8dfae1334474d87524ca851fedfedace74b05b4df0dfc2e77784a5e85ba713a02ed5fd9e16b54830d258f205f4f41f399cea3a84424c37d8075ef0f8a1685dd74a6db108fc0013c3787923f41a780e46c9941bf10afd7ba05e7775025647da83ec8c66801fc02befb1c01ccd9a12dec9d1d3e95a5c17ef13b029ad3a1cb85e9516a20c5d490aa612bda8d59c2f357410348cde0aa1dcf8c0e5e9c41fdabf00f52d0e3870c1961e5fdf33884f1119d77306d02927733b00c130832531446dd4837104186561573cb87f747e300096706c3f61f1a887b6f1b1b5fe36b091a65f795f2bcd48c1ba8b49d4cafcdeca41a17fc5974d48c57a4c34ce7a19234d5a7a43c74efc1ad724eb9c383aa80811c0d300c6a5eab5955324217ed642f27ae331f1540c731a90bdfec976cb89ee1f29d29f39e83f6dcd0ebfa0d702363314fa42a6b92fa613011063090df5077cdb76887dbb9b0ad6d694432f36d6f1980d5a5092c84ddcf7525a1104f279c45ee5ccf090e6a47fa9a0ae5bed356eb74237bdbf8dbd1c63bfaaa19e0038bb12f672088714322742f777e062aec37552e28e68d9e145187ffef60035f65ba4e841c1ba339b6ea1916a058ad8a0dd54d070f8e40c3878ddbac198380a18caf3b6f950c4425b5dc0fce5040046f7d5b5f1f54b6a98e2815d2f59cdd980627602638eb8f4965628fb18d42038aba7d29ef7da0988fc1489d5a66c18eee7eff39dd9cdffd2acf61a301a13a3a5daca8aceb48583c41898a7425b8824483541a22180549c04a8226075fa3968366b53429bcdf22386d3c19e00cf80591e020f68cf1a8c1cad93580a81066ad12e885e5ef0683728fb475f4bd1a4c75066e69290799e5df022d4068eee947cc608f4c4cd2f4c099b3085a0152fae7a303df7e19bf3a38fd9b8c2e4b4a132beb0f9a210eeb998c1e76bda836a37e579c06a3dbc74ef3d9bf4be4a1ada5a6be0bf45045364f68230929f2c887141ed9110c20627ed0bbc90ef083d74025de830ba6da3c559ba0d2232c1e644fc608f798ca39e14ffed429a566d06a8d83c236997303e5a14843939f0b97e674deb8b1b720db195b155e4db9af53002fb1ff458273f29e52f4a567bf1e06c450194b5378f7e5a2ac01643317977fb24c7794a5d065194a6a66ab13ba7367e868cadbe2d3ec4b399cc533fd2912ee7ee532bd94631cbb8bccdeb33b262bbf437b509904fef5ce0150aa2e6ab74b8c06a03d3d28d729499af15660e4e36aff463318d3586310745354beca66a9fb5cff19aa116e94d3c39c4fd0910a1d74db7faeecc50d3979abc010856645c053a1df7a22b093fab617e78a8c7c6ccba4de0c55a4195872603836976b4beccb1e53def15adeb26edd8b6512e4fa9052ebb2a29d102155fa9980691857da0ef0fefa4a934c0714f45ff61b1f8626922930d72d44191338cc8fdf112634cfc3c98c1bb6ff036ff016fe177f1de1f007ab6bd72e3615420abf216d1d719489cd730deccba881dc092082b959f5a4895927c91ccdfaef670a6f9bcb87b43f10cedf062c4c136a894a47768fbf217998ef8edd0dc4964db5716ce4c820e85e888196eb5c3b9514ccda70f69d7f13a1f077fb1443eee3b1e2208b61cdc4ec3e0bdbb1f13467e3bb4004011eac26cfef750b092caa9ef64f7032aaf087e96fc29fca84294e695f08bc61914fa1b681418121ef5eb091080b32243bb892de6b6ba691827c602680fa5d0669519f310a6f08f9c69413a130291f595d78d3ddc8286d4efca65c47a1961f401fb2d515ac82e0c436a08139a0c0e2047d6097516e6446d9fea7e9d92758235b293b5fd9dccd3d58b7d3b22fb7f2ab48692a7898a8f9e592d62933bc059776c597beabb4027ed6371f9b6dac4ab3f9ec2ff272ae675151d9e61aea60b5ac5a410d3037a6a6d4392d59171cd35fa08b0fb67cf70bc065c5e799f3026559277056fdaaa6e17c1987bb1b41f459277480e477ac6dbd9eab1e44e07678d566d96561d18eea37e195a0982fd9a0be8d0a33eb0d36c0ad14eb37cca9714fc3ff895324583c3d80e8d16dbc12c6a441aa888af99214e4d8c9eb5c498451a071a767d8c67eb643d7740bb9b9c98c03c0b1b1a3b8532f85a05f959e6c71a74afbe3787abed62b8e2a51b12a3561cda3a6fefd2ffd8b64a214ae1020f0646666ebe4a73ea5ab60f2ba1ba5725876b6c6b3747db96ce600b029356085d9d1e44980e6458af0bc63f26798efb422c39631d49371bab20a551fd5973c715d365974a3b05e17dc60d888e0acb4df635f1d42da186735c4a734641351cceda2612c5bbefb14c0e87963f944a5cdba474ef6505924897e356af524eb255eddef0a0303426650ec13bce23fdddb840f193dbf4cbe5e1a2a4b74c398a1ffd835f5508fe6c8b7c8c91dbad73ddd07cd909d5d921a6b37631d1754da1c1afa64354fb725482fa58d093328d9d8bca4352f056f04ffada6c4e6e4222e4f5fcf798b4f964c2e76e92aa75a2f48927835b914f09070afccc7e7c5610e5e478721294cfb32ca0b07ef37c388ea682b781adaae91066bf17adee93e63c35e85fcbd5c6af33bdf1f68edc0f9d8ab30d898ef2fa2f0fa90295d9a36d6ed29c0a6662465fbebed1abe52c0f0c6b2f35b342e2593af6f17c9226c92dcb57f9bb539019941c553c4ccffbaeae32f43ef930acd99a67a405e4a8e5f8bb6844f04e1bc6c6e1889f4c1728f1ec3cba8ceab192e8ccd3700ac545bf5c07a914359bd5c67a4b9d4ca44884026388335baf87f41979ed907a03326981b559c8e6f376117002850ae391a2170282510a0fd276fb552d760178661f422ea67bf93236e1954ac1282cdbea9ef9684276e86207879fbe7ae23a3c3f640448a980f9a6f6815c282b205f4ca8d5f555e52ee1bde038682bcdf91f6a18b5bd334a4fd435e855789a02eb2319c84c1041cfb47af4ae49773a860440c992daaf04e24f0a9d61cea4c9f7c57367de8489fa97e3914d906f046b6176187473a1ac5d27866d94c8b3a39f62ed4aded1a193f3774c67ab66b78386b0d758e4ef384ee3ec7b1ee9f791d2f381c192e4c4fb4706b8e7126f6c3df93cbecf88fa2ac09acffb17246b1f56753a4fa58975dc2a25bff89afb7760ce850ce884f4a13e7b0324270092336afe4d3bcf2d10d8084f5f171a90e1f1f459f4d9a0d6e2694a58fd7c40f6218521f8070b4b27b550ed0b04ba1ff87f3ee184766a98c14003165e16a27a1b43aff1fec79bc48cd0d39a642e46d1b5c5e077bb8b71e0521b7d8cb89d78ccd6f9d7dc93957bbc8e95075c9ac72433e34654f635973fbf1877a65453a61d3a1c5a757fe852313de104cf30527e448f9ff4c32f700610e3f39442221f590647d156d8b9d49b81f5ba2f7bc4636de1d974a8321f120fde334935926c97f746e2fe031b3139368e6f4e778d24531ba0a0d5dc07a83ba077b2c0cd2a7d503444dd6d765312d0cb02ad6d632bb7facf5eb35e00823b6da9eae8933cebe258864b96def03adc8e154d3691939f0c73c83921e14de26fe740706becdf6f64570c4d3c514ae9425b4770d632d2f4ace28a28911cd52fc87e000b15cdebfaf4f7ca116f4d9113832b694c9059f403b83cc789c82c32c14d84cec15f950724773683d0be0414794d3d60f8d5dd4c16ed0ea640694d512cb6fac398403688ac3a1ee8535707604a9447c17c18c8d535afce59125cc0404cd29611e65b9f982136e4f54b9ee9c84576516fe78d762e60637ef7a0c7b36cfc231e1c5fa5b4a64f7f9a13c6616cfa0afc2bf59f401a59c80569c57415f61362650f90e4782aa9b5037b74cd70c1382ce0414399ffa01b60ad8ee1ea1a1bdc7eea4ec420259945207a9a8c80e0c93547c2ecf4ebe6f9402e1f2f0359c6743144de29d7c72c303ea9adf763b1c7e4f4d1a4e390a5c4bde542ea55caf38cd2b8d681325bc4c8cc89814ba1285cd8d5027c96ffee9901124d8cee28ad06c91f4e460b00343eacb1e49e384ec04ea4e777165367b4d8297800fa5ee78d8c12b12e2331339119425696a0b5c2fb47e7bf2ab5859c8a67f66ba0aa5afac4db996a82e782f9fdfbfb64c8e1a7c4ade4e9956b86605b05083e32848d2a8be950714b31b77a678095c8a0e1e5a3e5d9064d8dd3668b1dd712d105c1a22030448383c459048a1de8ba23da4f78da8b809d8925780c8ff44f24809850a2073c8b6a3653f6608a74f4b707060b46164fd18317011152f5e1739453e2059100166968c24ceeb26f9a10c8859fb4a03338fe5cb732f9a67cc603ffb42aa22a70fdf49c45ea5c960710280cc43cd7a5ed706e8b6690c07f37069a6d390dbb26c538c6ae7d7239ff5cb246bef5bb8e7026a808ab0675e030b77b4076f0e35f11d5441dff7c810e1baf3a4dd2292eaf1e62d63b74cfd6f9295a6c93c0222edb5c96a4153cdb64ef688544ad9b108469057d1c9e2e9b7d9762a848b5ea0dce108ddbf37589a917d0cfba20f6cd7c61d59b463284a804acafcbc22068935c5500c0185d4fd8acd22b44991ef55478127e63796d2aada0775fbd84c3c05f523ea7caf97a1f10cd58d247b1bb528f9499a66d2a265dcdf6e0d06497cec2be0f82be1899c9dc4265fc82536c52a663eca4a02bb962c9e91f4c380eb97c440933eb7ed05da1672e259b66faf80ec7618c740c29ac2235cf60b2010fc6406b441efe10540a14a973718acf115537ab8378b440695e2c31fae4cf99b783da529a0c8c338d7bbbe6529b54b82b2a1b31d2f506417ae9624556f92e27ddb92f80d1192cdec7e38aebfdfa2a77fe4a552d8832e785cfe3829ac69b349288c229ef77fac253f60a363824317ab079619c42645dc0f352ffbe51d61866a8a89d7df968416f9de08490f4858c488f6befee025e8f33d2405825655c9db5af5ee0594767c1084f0f4e1b2b1eb2e2afb5fa6e3f8047cbdb0c4355b725745c588e3655d56f8cd279f099805d38af48dc5524534b8ab587712493c01237fe2502489324318de3e53846b69c57aebe6e5532ea25c801b8e58af147c6fbe19128fd1c099f676447c2e07364481aa27117d5e056ec9449c89323c5114442c92940619c74958b9d0ca11780bcf9b8c047b29c3dafcb8d2c82283981246a2d6a85bbaa937f940b863c8ce72d46a344a9b5239e51fba5473e54b1492bbddbb2e4b788305f50031424da7778a0d3e86eacc27e07c32791fe6542cfa982ecfc26780560081b9d9a95c98750f84a6c913d53ce27b5d18b2615238e993dcc8c529af3d02f78ea302206d6c7fa1137548f5b5588e064420c1999efedb3953b9b07cce1e6323210bf335126e28797cb581a8feb33ca7d7aced130d2697ae59f6e617772bae06456c2e9fabe7aaeff935bab2790b224e3e9e33efe5cb79a5ef7f751aadc6488da37f8174f6bb3f58830492a672f4098dfc724efa8daef51dd77229d32582d85c1bec07abac88f44dfdd769c3243dbb6af2b5f88d72ba62b17ca6eaf91684476441b0b9cfcedbc383b1556a8aef8d18e48bea03bdb460dbd122f5797ae1d83ae996a006ffb9f281aa9245abe52ffa767f621e97636d60ca044275cffd8260936db579643d4129f5f99b241111d7eace349738d08a935e4411ff6bfcf215415e494032e8dec89b82f7046497bcbe8cc72cde419b5c129ea046a82ca3a01de241f38ccc27fd82bf9e5ef2d73d5660b3e6f112292306e30e22a7283ca81042366c0cf4bf4022cf9a0ef6d88dd2a72325eed89bc8f594cc748f0990452a5005cd270cb2a517056bed48b9f52574c38690a65ef8df52893ec4ae4da145915904286e15d7f4c01fe500f8af658c399c666d8ac5212f3435598157aac4652b4d35341d910a8a2cfc116305dff37e0196199ae4be88966dd552cdd71471199bbbc99ba662435fe5711e32356fb766b0de3da4f12efab72c3328ff1f00e53524cc23449eb7448248a48ecce8d32b6d642568fc86f1cfc05365905204f6572f9f9e8d3aa4bbfe4a0694f2ac4e60dc6836a22db3c230ebea8f89f1cda86a28b0aba152b8ae8d11df0c4e58c35c57ab3f2c903fba23f271f68de1a33c09e1c685eb1fd9f72bad78b08860d766be2eab899b8fb08be6489d69dbe6b62c063a691a3d469c2503610cb86641456749318e69c55614859f34a3a9fcdd6b421d9186cfcdff247c2b512ab56843ffab1e9ca9e858fbead54b175cf89293022e293409a13732e6c32d4f6e55978ab7a8f4c4d68119dac3c9c0485f5e6699f412fcab229ca9808834a32c29ab6cbc56571e6f4b44021ff07020d26dc218a11e94ae96ad0f02815eed831028517553a2daa7b9ed2c15ce66bd9627212b99f8f1e6ebca9d01adeed1c8445defe2a00b41ba06a64f7c22a1d4f617111157c2493a07ed399bb481c40bbf251201ca6782906fe0a38645141d6a1ceb7387ae639d112d4043882d05a34dba929efeee25fa90cf7a5bbab92377808b6264cd5a610016446ac6471db84db7234dd90904ae28cf72f949ada032a05b23b18c9b43150336de4ce0e2444cbbf6c5dd26bcb5f193ca979e06ab27317b5e18e2c247c8fbdfebb845945d1d56cb3ba13f8e8b70e903789f0147651fbf1685eb3cb17414bca428a3b305209149dead8d21e476b74ad213f0d5b4b4b02208184eb77763cac5600f2a725da55ba5b4e814e73571bac766067b19003b934dac2f4079b4023c265060dc91a22769049213dc2859ebd89534655a602f9318e17d36f4139a165a43f358af9555d6fae5750ab72217ea3559d344ab2708501d09cef312986b3f43933d7d96c6110e8d122a611403fc08114ad513ddef6e149431ca0f3990ee2ef5b8e10e460f349e66d7b097598bff7109b45e3c06c2f108faaf7295a571cb049b3da299985b767b308e1314aacc19a12664c548449329e58d223b919c6877f33051eaf98ba70d8b654b86506996c43fa877a5934eecafdb9f68ea5f837932c168c5b278e296a00d465edff8ca892781a1a70f5041bd619e3ea2e2961201e1cd13e8d80d9b66fcd197025e2e03c81210ffafd8f412655767cb124fe7f186a41f254fdd847be19d8363cb251fabe9c8297eb7c835d991edf1cc1ae58d0c2990f3c4b5effc5e2614c8ab7a7b565ea4941f2c568fb2f2ecddda7d5dc34e7e50cf6f1553347c45bb0a63b075cecc5620aa70e500a8a7e4d07b966cffc16bb7024972a5fac9859b01a5ac85ffd8a6591c7f2b19da0e7a0facfd5000a99ce911f823b0a5fced9c5b793f38927c4d28b799f8921008143cc0b9f9d64d6db10409f9c42959c8e485fa389b403b7af10da6ac15447b1b45214084cd9338760c2cbcef4788bcfc5b536b99a59d907b29bd7f2d879df831bab5dd68b0e5de480560caf29dd437d3c933e9dcc0b86e119dee0d1092cf11d89067b63b1a1dcd5cb3923e08042481558797d3e52a7a9faf6e8074c62910302ff5f035bf3e888efcc3a39e68287b1898c0aced1a3c33a9a386df05a32fb7781214cb9db0621172902bb9353effff25120d61b5b37e79764fbf6226d52e49b6c1a1d075130624584bbbb329f289e95863c472245e4e901d93231fdf3312523de75943daf59c2569ec80ae1f4b76390545d968d4e29a14298545be295b7821672bcfa283012614b66491b97f50846fc81e07457c64530f0c47bf026b211e19f351df57a4176f9dd7efd6e8841b2515694582c97997433c4ad6e8398a29f8266c35bd5387abfbbcc04d1cad0c49409a6fbc0c6b31dcd50277d6575408a8953eebea1ccfd5745e7f439bb31e08eba42d0786a3748a06d90261f101d96d6396cae476452691c1ce7b5248b5dde95f9782cf2a246186faee8c745bff3b2a6fc274ba8b38d93d43a58e46766c564a4df174331742d8a7a42c8a36fc890438f590b4892dff9c5a3c7e89025aa1bcad5cce70d26a389d06ee5382f49704c889bacc3e05a0abae8646507945be80cc7afafec1daa5e9ee0ace37e63dd016521fef6deb0da77a1737bf7c947b0884ab254fd05d970a382bc8fcba63d3739b92fa2a57fdae34d2d05c1d259adf0ed0aad6f5bd01f14a2a90d7a562c850fe6fa1c77be83125b6713c915ed60e48331cfedcf80ff682fbd6c0df5025575e3902ff218d85b0cd3af2715f26517684611d69af4a009132f1403e4e64dd504290e0532f7b5fedbea1d1b6ba7b7b2d8506941bf0564f6cfd346a359cfd55a6778d7e73c150a9406575cec74a3455f3bf858363ddb72ddd77be7ca7faf2e53c81eee8eef0281892b28e6b6b7b97234ef4d0ec8d2369bf8129389061155ae828ac7ec168b448ba377af069cd5bfee47a63c3fb12e86d3de2e20d86ae0fae88be35237f4ada1a0686b92f9fe8e1e33ea545feaefa100f3814d7409d663fb05f01feac99c0a09a33ac72236f33e80532f3116c15deecbc75fda959b8ad5549a559755b6b93e6bf5a73c7fcced56ffdbdd11001e477d453530d10f60fbd3920fc804a47f2e6a3482411c8a1fdcc1a3dcfa168238ca4c485031f9ff72635e2cde413e9cfe575ee69bbdbb79561c9940ae5094d073651ed24133af3f978750ce4a27a00dad3208507a797be4f51ba57b33d6f9e1d29b770852db7162400b4eda3cf1f1c3a004abc9d0e1d567a6866bc4199e580299e1a3e95b81be824052522438c39711a2f9507ea9b2c59a37df322c6a677eaad72dc82ebfbfc912c8d9e5550fb9871bd8d2d33a99a351791a189e4f16accb40094e2873016fa9c383b56d74f09bd835e9068fa3e19b38f5c0e315b5c4ad95e2ac06a0f11b652ccbfaf14d15edf55709a3488d106b56270099e6015ac5a077405133ebae46ce3096ef19c5565951e2a645dcd3dfcbec9e2424e47d18bf0167733afbcfd04ed6de44d38a8f343811c60e0fe0043496f427469f02c9711ee432e4be6ec633befda8144f35e51cecb0ef06ac995b87ff5059ab534647de6c210618d00fc74d807f6e19f412acc7a111bf92d43ce9ee8876eb6666ee3d19a3092eb61b0b8c6922809e5f485ba40d59abf6b7579df7620f9392a6729f24184a6e951883c983f622dc9e5e58a854aa6c10bc27081a8da5b955fead9cb6cac54f32a93d1ab693a1aa96a1b4040bbac500a4f9450229b364db2515d99091e1c48709111698bfd3982653f25b483e3cb366d8ef7c84c35b73c9f961147330df51bfc012e25276afbb09d89f073dec1621b4f7283164e35a10767bec142d5d2ce48d07dc3431ddf974439104e55f3533e4f7a843b3041ea1c901e81094e47c9b007b7c5794fe78def4f3f5039cf6ed26fa24ce6ea0f5b038926ffa02fcb9bb943d3abe8931bac7bb158b488c05a73e8404a9fc2fa0311ce3739c548014eb1ed2413b1966c446a5691788fe5a80a675ee29a62a3c2bd59b77f8fe857d3736827cd9848f12d45a0478d7ad08d9fa815374828f18a8ff4b34f716f1d7be8a7c4fed583618a98bc206b585f53596fed98eb0744a922e97a266e1220e11f13feca2fb0c872c0b60b6d41351f9893ef576c258d82ceb8e0e43ad75d286c1a47d711255dac51bfbbc68cdeaac2b62b4da2f28e5c4692563b8d30ecdc0a36c9bac40a2f2d72b7aa79a511ef72bc7dc1db8a01abc9f06f4b55953a6254b3e2d769ed111c1abf983625a2dd5dff591c06b1ee725a6be40b7559658ae4a6b3c6535e464d872e6371b501782ebd77e39958feab3f1fa68701c2aaf0e259c0728b8cb701ce1d47770195fc9923ab4a1c2ed69507d5e78bb2f602ef37de01ef1f81c48dd7666c29c88cbf1446c46cea38e2f8f842263e8e9b2804cd44aa9084b9c6368f857e16a66bc494c50958a2fcf49cd196937e9d016b5f62575bfac783933b5862f9df9f7a28c161021129848e07c92e0afb7f9abdea9196b263ab534caa237de410a0432b2a2293f2ae4337169e1f55f3ac312a902c6b9bdab8e1a4380ebc1f31ad0215ddcc42182b8e743c6f922a7020de3439a74cfe2d096739e2948190f43ae91e1aad48a937413a81227f5b3e860794054206f29576f663547733ae1f993a4b56a28fabdc5f2f26add9a5caebd7271f131f259e62ea2949ca59ce03e9c6b23d7c0185aa074e8209031c3de1cf01b488f0ee684f031bbfcf4ac496bc44103ce6315680c728d5002cd7eee84510ef204ef173a05e8938e4133aa1e440ffffde4bb558cf47c48e8790230b48fbdb32a9bf5194620cca7de45f4c23fa2e14afa2ba80cd1e51f2475b4df0d2d6ef79234a08e376306884f6d99d40a492ab54f57811431b9c88752ac65560e28c43bc7ffb6e82b44795b03998966b2255bb841f54de48e601f2b052b1488587b541a50e1d19a774be9845a45c3cf7c0f1ad1c86f8119d2f6bb4df09d28d51880a0918acb76be5ec399d90fef861fa96f381ac63ef90d23f6fdb69085750b2b24ef66a740f5572c140cff1d3bead9cc65a1946977086661ebb953f31d8ce0928a7c81d44fdf4bb87ec9ca6f4b49ba9ded9cf7f59c2023d70b3a2bf0dc4968258e10146b91df65ff3a476e8cd6737ddacb803b1d496ccd373ebb565017e0aa31890bfb0fa5150178bc654e8672fc71d9ff5c0286e3266adce1acc48fc4d05b6630671ea9ecbc9bc0fbe182d19d7de04eaa9b80142f7ce386a702bfb0d9d5a34223b679e825e8bcd65ddafb1581c9456defc0d2372bb2ba32f8b956ee08f01bbdfd569d288cd37f4c7c86fea5ae88bc4ce9b3f614cee7761f47531d2cdfc3160f7bb3a4d1ab1f986fe18f94d5d0b7d91d879f3278cc9fd2e8cbe2e46ba993f06ec7e57a7b4d8cb93dea5e7307daef398bc49590b9f6a14c67c77178b3e177a6948d797d9c7c4850e347ba1e936173174cc660adb4a57fbbb12760eabbcd18f6230c4a791d02f997c0dc2adce444187f310467ce7bb989b507bcaaa5a47a5e1ae86dd681777bf51a6b1bf51fcdd56237dafae28bdf6b88dbfd70234b52c6270f2e8c7ac69ea2fefd6d4e26957f5e967c6516f9414bc104b8dfa7c308d3f5e322deb89c8d88af7acce3e97128edfd6adcaecb49ed741c16a10b875bdb0f46e9d9fd61261c24e0b41dd70d87c5cedba99b21ce38cb3ed77baa09bf429a341ba9443ed7c4eb8a585d84f19e5de443c13e56ff2a82383702f96ddf5a28bd0e8a9af68ccdc043c88f439d4eaca33b11b74050ed238d5d9685f6ed90df407990f9a6f6b9ed83cbde866afb1fdcd90c29bfb2a8655697191673fa00ed7d012d4ea8ba7ac9d91c67b9a64d231bb2691dca1f111091f53f630f385b35dcaecbb0e5578c43e16eeb92c95e11bc22041575d9ef66fc722facfd5aedfc150ec1daf3bd7ab5d47b492ba89bc382ac925e247bcb219ad526e7a384245f25a1d0e378ad8c9a716f1ae15e41b5610cbffba2e417b3489c8fe98ffee38d333bd1857c4f7bd5f4b590749b65a7c36c2039c1b59f4baab6aa21130a04194f67a71e13ee1293a89c64b51cbca429390ffe7eebf093c6bc52fca15e0ee240d27dcb5344ee0bab39a8b69b14a0b8ded8899d86f20062b9c1d62998b23423e4599a19a20609a491c052a3922a7bd619c3864e0a78ce4bec732756bdf1bf7c696dbeb004ffad185b43bc95fa8d04d665fc1a1f07bf5632de6fd0f6abd9346cbbf13d016448468b1c6dcf335ef6d8ff081df54b7aad85f8bf9cf2e31916998deca11732af4f3c941ec10e5fd42dd12b38e8b3589b3dbe713a777a04874bca919b7bc08eb5ca6af053fa75f30e8b84a22af7e3ccdabf7dd8e2d5723f12e49aaf16fe5db8b357a3b361ff2e9c098dc8dee05a326484e37da5f2827f9eb0cde66b0504cc9829b714bb9e49faae2b261446e8e1ed39232cd50ba41bc5b079607188d32e1e120667f449154c214b0b5a3b485604b4fb622a6db0ae2b60d93758425c415826d62d6ab356c9080cf21534d40d9a28e277a6abad91ca32dcb6ba76638f7ebadcd4a63859576844fa2e807cda0a291f14d71df56652b5c548fbec69b4a1250ecef2d338305de457fc6766293ee90a1f9822b3d549f1cdbc3c9c7a67831e18c2904ed1805085e5e8e8a442164eec0fe3143a6b62a7154935f69d1c404c5a55c330731b1135cc9fd4d34aab3e6587102f23788a32b5299517b32d06291a67253982a53a35d49862660347ff9859659949a38bfcad0f10c88d01c85375c26e9e381f3e6b6b8f28452b860ae905fdf41a182fd5030e3039ddbebd9fce9474608575f9d367eb9e2f63f9a7e14787a5fba56a50ab08aa889b239083d6686710cd23485fec0285f0237425d64644342a9dbe6beac5fa550572cb22aa327b6e2e130fa4e453f73a45a6d0da03ac4d3bde8ed7b3166bd17d4200a9794ef3f93483ed06312d92419e18f75d4ef05f30a99bc1ac3a5e61504ee44f2e4b4fc3b48f7038ceb575f808657cebf05318e18b46f99021c7cb1bb04f72e3ad209069986b58a8cf9f0e05af57341af39303196e7e291c7bfd28311a34fef4d51ca90c3a35cfafd56856c837556565ad646ecefef97e5204f5a02d51bca585565c954b6314ed236cf006ea02f3450672c46e7a738d60f0a97f45e102544898cf451b5fc80f78a2126e71345dd118e49e54a06dc85e0f829f14b8d19253a0b1b155cc4e8ff00f88859c9204583bce45727256f5e753c7f507960250d620f1d3f8fa3eb6a9aebae4cae3aea0a01b9914b8c7a7d9fcc2bdc0ed762d9c0bed8a2a215261235a52c6c54d55895b62045647c1bcb2c5a59975ebf4ed1be785b0e94e7284bbbbcc58848314ebad5d0e1e799e58b928faded4b42fbe21b69024743572a791eed1bc1e36e7e1b3c314f168e51523e096303f32948bdbcebe82b2a6db24dad7855f26a94033736588010f80d90ab18073180051391fe02833f367c0426cf88bc3d87892310165eb5dd61de84a27fb9f89279816a71ab682bc4347853c882c6b9bc066b5633f130dffaf0da34887c923c052b5bdf663b0c7f8a987e72566a8ffe043d0dae5623187265d943d93d4205691d3143613a2b5ae67b7bd8ec9aeaf316c936f888dbc92de75dadf0d2275843a2a6648a92b9e68c450b76cf25b683ce3517583e1a465f2ae4c04c7b0f1dfea9bffd53bb1900c248a19b182327b4f03a49a1b4553142e8868caf5bd9f63a7c6a96013675ea04b415562ededd5c4063544716fa2da25216db7fdbcda69c82b2775d424237c7b9bbb8bcfab79630bf10aafc8eb159e37773b330a979677af08d04950ccc8490781ba219f384402bb40d65125566ca2e30f9d4608af9cd012fa3d16ade8ee5c32526fc9ac4b0f26e20b073acf9a15481d3914ab837b6175bc95ea1baa1f35153d3450dd80f7c3d9722c5c306520d7ab15f8c025295c4a848495a256b53fbfe3898df574d3350cc5f451f701db08c1c8b3a77ebaeef7026279e051633950454c34f8e9154cff1422b41ec021530a0ac326a16f1933c7030298f85d1e1fd51b294cfd3a91068418c0c308b790cabbcd57fa16533decd5f68955bc9093e06280739d218dcede4ce44e47a114ef10c53eb190f8bd775f60d68572502a6f6724a90a3a791ad169332b825bfe2e438fc024529f5f4311810fff73f99666495679324d1c94a38e002706143ee95316e952e324ffa68d3ab9c4b6e6fbb7e445dee514b6a5fa0fd759aca39039adbea513e9f3b504cddd7ffe162a6eab9305fde734096b9a0028e73b4c8c5f26f9f9d961aca450d5d7428a6d2572b9c150a05af623be5084f5e7a77abf15b0153dd476498b70d13b3759d3379163fddd3b9f4bd32e953909f0709cf1c9b046b73bc0b4dd8cf0fc4d3d404c58a04d90956ba33ba560548c146f0f4a9abbbb294c7c6ef080f257bfe398732efd785f766aa4a17dfadc7d69b26083ce4a669e5d125f4974d500c466635f3572db0bf774c44c01b7efec11f1c47f023163719d0b812da4ff2ca19508288e89a1489d05c539255545e3c421ba7e20ed2abca762e63926802653ce8e2d00ba627d6528f8d11e2c1d4b5ed8c7b1f8672cd65e178bbe0dd216bdcbb75f3bba8d8cd6e65298ad7809c8b2681ce8f91560e4ff442119d2ef42d982ede022a898723177e054dc92f09f6209eec394f254a9ca07ca872fef89467891cde305093bfeb0a8e386a0f2aa4dcefe4dca8cb92389b6a4ff7262d3c02d497e5d2d4cab245fbb30307980e8d50094e680519078a8f94a2d293a3c51fe66cf35537252f733e14965a3991f395bd3cf1f4a1636ec31482838362e3f7254644e6961af721850d9b1ff36c0281c37015cba1c71a02022f36793e63195ab385ed4b81da8da1e50ddd50e9bff6d00b2c375ec76cb30182388254682d0aaf98c7bcea324cb3d68588ede20fc9eaefcd4d6f7b4760364dca5b4c52fb8c6953dcfe00bf9b6a28d82a8fa7e67de9c21b12aa71c6a4bdf82ba08f2d742fa9f863df6fd61ecb538576cd5d72d27b31ed69396b0a6ee3b46c02cd7a9ec1caecb40af2e49e647316676813382857dc3854d6f89bb79d0042edffc76d5b96a64a9d9a3d46f64e12839f07868c2607adcd09640f7c534b4cb17fb51f4f5c833dfc1964c927159cbb611de2fb1b379c307b893bee5d839eb0c151a3d687713807042acdee1697af96b0871a6e4c9bc72bf9b2a8e51bcf932d10512bcd659001dfe9804df442654b0de64fd79f1ab6ac1bd9a84fbd45807678152931c80d2f868a337dcc20562ee8397ff86e334df19641218bbe1ef79a7e70c70324ee2591459544c2d9110a7ce467d7cbb44b08233aceed9138bdaef5f341a4e9235e8f6181368d6b1924158013625bad278dad2bf9ba18868709945703b10d252fbab73869c2fff38893f3da596516aea08cd9d74adc672ccc8a94c2442aea4c71b07b05b42f036a1eaba65a200c529b0e351008419b6b4bad3971755209cea47405e8634dd52778b7346aa698e496cdc30159e9769a088ae4a06a73c26fa3e4c3097d3641be1bab39f2c6da29bc71ebce559684cae30b90d9dca0d86e64b7b5bdf79652ca14290ae409e50ae06dff6f198c1a3a5c0cbce8bde7cd359a621806518b632046ef787335fae66ead4638ee4b954074d8b7ac03cce375506d07eddb8959c6cdb517595bff0a89acd20a9745f60c151a2f4a342992c409217a10c25b628c9a1d6a7ae0da72b9baf4949587b3399fcdb56f1f124d3cf9ed4362ebd39bceaea17aeb36cb4cc7b756ae10acfa6a150ccb3269c1c24a86c0ab541cf42e849bb35728e6d6cd938ca17527a2356e0e861b519b07a28f3ee611481777bd232b8c5b6384c57c143d9695602e8e3e3a89e698e2414542862ebc1de9a2e7508279ccc9ac04f3119462a28b16ea0a8d6edd4e5d21d12d0620568d8adaa9d44af9ea356c1e8c0ef351446d1e880e73d161d9d6f09bb316eae6ecd45bb754df1628813a401ba621c77e51edae9da44df178cb60201d7d10f3d23f00dd741852346f19ac52552bd50733eb5597e5d16ad5572fb1b8b4d8c068a50d6532b7d5dcdc197de6b33cc20efb07360f66aee33a7984dd75183df8f6e40f6c3597b98e9db98322ed8c3eb33ece469f655b8fd3720835f53db94699b978b5c857afa13598bebaac3a21f138d211920731bfee01e8308fd12f851de9831ca2871ef30f7290ce8322f1f8ccedccad2d72733757f3196adbf1d275ec481e14a9c76fd4473afac0e601e8318fe5114207bd7732ffc0e641cc694ecb23ec660ec3c7c92aab21f32aab31f3e191a1e6b5edb8751dbb1a9a5aa89be371b207e5a0774ba0c79cac320f4207bd07ed8f39992dd3cd558f655bcd612e43b44e57b65aae81f3cd7d733a763ce80e5a43777337a7035432eda8856ccbc6c650114316bc4516575d03193d5405a1e52607334c48d9e12d4e62284286365cb8b8d9611e1ebf79e2314ee2c7e3143b8c31c638cca6cdd5da22cb09930b4c58bc343b1c82915f0f4e4f595db27658cce337433cc66f8e78ccb3c3f8aeb9d9a7eb2a089fc9532dd8429547c6bcf76ea5e0efecef4d4d18e616f7de2d337fcbbff7fa10d1f5b4450ba2146c5d7d6ab68f058a1bb7b06ce9f0290effaeaeae8f57359479e2872550b69830e56abcc283912255a2f052f086ebc98d93bfea2d450dc0627bf96a8330531308ac35300658ed34c75c742f7885d440c61dfd8ed9ccd7c7ebe6e592f2f772c1f0b7eeee05d78022be37a740d55a0b94deb6b6a6b68a846d78ae5021c277c5b4c4a6c32c408815c2fc50f0c205885d7b1b9d27108e458b02e006d0422702beba06b73e1933c5b16801823a23b6847c7a9e5708179e20086ea1f02008b25063f6a7b8af3ebc75c216d316134ee292158f7e4347cd46d747300571f5f25e6bd3fa212ca739ad393e74124d41179fca23badeafbc4d4195b70e74fb7e2b83c0fdb47a0c3dba1b54c74e8268cd6c62c21ce6a1c3726a747d8455a3eba38ba359136530c4b06521e8614e43d4e83a08a246d8f1585a21b3caaeb70c876e70804960140ef0766382db77bb3fdceba5c595a35bffc15e8e4e4cd11b1c7fc451bf8a1904431fe632636b9d44afdde3988f685fc79cda6654a85b74ab8f4e8e16675b30c718a317591f4bc7233a3631add1e856865f56ce68d641eba0756c617e2dccc3304c2d52080b8fea97034477d1a1285a4ff29169fbc65dda550f7a9912c48a87096dd6ecc08cdf5e63e80b95244176f021081042ecdafb06d60161c7d3973a20f0c690b6c4d66d185b18afe6436cf055115ca48f0d914f6f45707daa03c0a72dbea6edc3d792d7bef518f62d696bdb99cdd68b190459dbc9c6d9be3a631191d5312dce067afbbebabeba0dcc1bfc784e8f5d8615babef61a16f0401253da5e980725c6d53e23bab41147defcca03a1471a14045e140a026fcae2fa59581715856fef2fdf569f969fb2f8760bc6b4df3e238a7c4aa4a37ef518f56b06a1071b1d374ba1401637da5c7b987540e0c1b1b85ed3c4ad438b97c8ca829a34236e1e35579e368e68bf5b17d869848e736a5df411c88f2ea6f1fab01c51abc5b45e45ecb110c40eab891ecbb619212c977ec7d148f4d0ca66883ec6f8c114b391087358963d20cc62f6d233d079a190a19fd60550add54879eca09a27345d442cdd13f4dae91ba419c8e25a16a37ea903c28ea57c66a3d0ad7b0a7a3602b35f4b03d91601445c2182eadb4704d43711441ef6ed230208efaf939d35e4db97b5f4a9b5faebe4b74f8826de5af5c3a855563d55fa9afbf6cc0aa783c67cfb88b0fafbc3bc9e562819fd02e6d76fbb88b94dcfd4414f71a1a73ad17bf4185a9934ee3a0cad521d745dc615aa53375733a850b500d7afdb7e515be8a0ebd77bcce9d09098539d0e8773cf557fbd6fcd361aed7beb46d6fb975a5763f549f6717d1cd815f02da3013ece9767642cd240861633e31a0c8395a132628d0e6c7efcb076a20c485220b342ef0b952d299035311bcd359fe2aec4a0f1f1d57b56c17b2d1886e812ac29457828c269c74e7ca24213234b9cc849d3d362665c836b279469b69b252057c6bc90f5250cf9838fa71f97303070edc42c4fc68a8c18d91094298a6442a1cac35d6b9aa797643ec569a1110343a38544e30b8b4ec7a189213c01cd9245b3e3a2f8f6a1797afced4353a4b6d1d5c60284b7812b14264f0bb5b01dc2529b896d98165fdd01a98da11f35b02e8a64581766edd451420f5ebcb0f142a106a99d8805852373cc7491d932b513ddb42e12f0a29fde7bd16f5648dc89cee28432712c4e209b4df374aaad1fbf7d67e27c8a1b2d862279cace09e97af494a87528cad32c6ba579ea5a0c9d4933d616433a98ee0ac17279460b9b25ee56334b8b1bd29535200bbe7d67703843f5e9edab6841139e9c6982e2277006ea8cd319205fbdb4b06fdf991ee2b74fcb4b8beb96d1d2da7a34788956d6b74fcbead3faadb583960c18d46aa2b5825610ad1f437c0d01874d89c5c3c7aa64435c29bf7d4350d186801ae2e9cd6fdf1040bcb8be7d66b4befcf6991963a6cbd771c70c161e33576a2018b2ad192966a2869698ed3333e4d3b27d66807cfbca787d3a7e9759a20c17075970ae8a6caed6b842200cc8bab02730db4786ea75be7d415cf92b9f78fbd4c64d3c4532203eb35bdc5499ab173a6f16d202f97916dd1c5e145f143590217adabe185231178562f914735a5f14c53232bc087b510cc31636a77374bc423719454cbbeaa715aa3c578097d9dfbeac316554789e6f5f991e9feaae462b4a6579c9ca21cb4a399515f5f5dada78669b71df3a916dc7e02666fbb2d2542184e4ae00d93ad37ffc204a887a9d75512b02be0651c290aff5f6d5b7e2aba7a3d0d939215d8d3bb4644eb19e12b9482df8be55777b65e3f6a5951262852f4f9bab5ec79c8edfd7476b5a21bcbb7e0af98bfff65fa0fef37c5d8b213126909fd6c5f5d4fc2b440a7f0ff0d7c7eb0f43014898e1b77511be1d5f082061fb402dd74746cb877eb342e12e74165608efa4c830570fc3d2d64ea03074bbc40c47b4af5051569614d61041c044ed42354bdefc50704a42e4c92e74d3ba38c0877e3aee86aec33e4299fd187bd937fcc47a49029dc7e3258156c98dcb0dc8ca9b343725368676a2b808b1310482203864070b07e8aa34188d3cd9f15e0f8d7ab40df3b4bb3b4dc2568487e19885c1604a1fe2d12f04fa62190c7caf37da6d9d70df9712a6f768de9b79af7499db72efc77b29bc777acfc75178d1fdf11428eee6da4fb4c6cdb5a34045b8b9761fb442dd5c7b0f5a4379d00f6eae7d07adbc9b6bd741ebd4cdb59ba87973ed3474e8e6da67680837d72e432bd3cdb59768a5bab976128da14537d70e433d7073ed235a9daa959b6b0f51bfb97610c5a8086eaefda2b5c8cdb55bb4fa6ecef744d5a7ed7382e993ee1b553ffffca03a9a71faeb6dd1d406a5b57d9f539b53eb6e54bdbf4607d5fe95f0d77f1ffbebd5aa5f807ec7d17c7b62eb69b542ff084ca3dbb450ef8850234499bf3df890b61724fb47f5bf7e69a1def950464d9b256aef52db23a183ee118ffbea160933ad567faf5b3756d6098b21fb467a55f91afda26fbeb2319c9847a757c7fe3365b94c14bc91ccabdbd488e6339ee92996749c64da7118101e179d6a1e1bd2e3a5dbb4bf7cfcc72d0ab7b9f57a9556adb47d36d43efda0b6c810270bc43259dc92e5552f8bebb238d82c85574781b2c0dd1ce8aca166395adc542ca7e62cd71c357baa0dd90142735b977cbc87c7c39c9e3a0ee6d3fb4dbff9030bd8b02e8e6a92f51cd6c5516d31a7a398d313a7c8270a9f9e1acf8e8e499bcd525496eb942533168bb33e8bb3572cce1e85b952595c158bb3be41a551ab6d6362f761fa30633831fb3178549ff88bbbac7cfbbaa69efcf6753d7d9db22eeedf9b7f2a59a6837e51fd88e6b5a97ed1efd6cdf5d10885a3f0eba551e8a1df80c1b29128fa25c96c0483f9f5d38824fdca64d9a82cfdce66d94826f3dbd3938d6633bfd666a31eeff1eb2c6e5847912d96c55d9f6c54b3bdde83da2e0b07b55c76cbe2aeb56950ab65b3dc98a9a5b25452aa5059a972c58aef0a165f1516abaaab6a6571b766a35aae63ea95c52961a67549ca5faf4b15cbe298ac50cd72b242354d112b54b76ceeba50856373774c2b56c5ba4216e0c9e9b893535327a7a79979a15f1781f4eb2280f9750f887edd02d6c5510d41e6a5c772ea311f1de7d4a4651aa928e667b96259dc7559ae5965ae5d64ae7062b972c172dd1a73656371d78fc45cd358dc75ec1bd42f1a61ae5e1677315ab5da98d5d38a757b2a8c09093a76d05316a2872e7aaa83a52d488f39e9e9902c259a39cdd3f6e9b88985c7779ce746cd7bbc51b80f4ee1e768f31fb7797ba9c2815c85b79b2bbc025fe1ed35d4dd516f3f2df0ec16783b1000fce600f076bfc003e0171c55bf91739ce76e0ca0bd46bfb851fdc8e8e61a1d54bd860f00c50900c5e5d01b0ebd5d100000a037d40234a3285a5b815680aa40816ce84f0af444b10fda3c3bd6754cda4c56922dc45007ae8265a2bca2bc86783979fdf0e2cd8133876bce9aa8395adfbe395773b4cca961ce933948e6109953c29c1e72bae46cc9c992f3831c2b393e3955e444c9817a394e71e07cfbe2a4898315074c9caa383e0ce23089a3421ca738bc2e2f2b875781aeadae34dfbeae315d5fbaaae250c58132d40495d714af27156802aa8921dfbe26969888c30497e57a98ccd373e6b87e514b3f8ad1aedf808144a3d56a64d9786864d300814656eb2c636e64b36a31238b658e46760c92f8e5f5a991bd42ba8e9df0ba39edafaf33573e35b255b49c8a5f5f5e6f64b76ef68da9e3d6431e07bdbc3a3ab59c472ccb18f4124f85b1b1142fec8a2cfe0a168227947bcc476fdc5857b151c453634e4d132c59fcd4d4d4d454e54d555ee5555ee5555e637d30868dd558776cac37162a1c753a9d4ea773d261161cdf9842a69bd956d99c75ebb39cbacb727a963935cd584e47584e479ddc3667e6b639d16d12666aa12c149485b250168a6b665f5859d3de99bd4eec64d6de8b9fd895d7db1ddf6c730ea5d043a75db7187425988fde0e64f1785d09e6e069ddba8fba530a1d8b3e5e578a3976eb4aa387a4834a31bfee2366eed0f0e8d695400f75602eba12b9632a914ece7cc476b2dc63c56c16732598ef641f7547ea5c0fb12b814ef31c0e7325d245f711db999936cb3960a2dbd195ae6367fad9c9ca4ce6b618742511743006cba3e750ba8ec77cd65d0e2531cc373063a56bb35b0c74aa680389ef02987e7637e7c8e123dcdd154aa298ddcd397ccc76d7997c76b862b007ed8be967773d478f153e620ee29b7328c9dcc7bf764c3fbb9fda8e3923754a1a50cd67c79c913c349dd367a766cec81e1d9e9a4fcddc9991301174a51ebf472b7c6a3b33572addf41c3e62b111f738e84aa1abc891c24fd0cf33e7501a63b6143987520c8f2dc76907e453db31c91c3e623b5beeb1e2ebeb6bf78322e7508ab94f6dc79c91301174a5d2afe7501adda7b663ce48d875a51287e6cc7328d19c145da97498e7500add27df7a6ad92d06b6b6938174f269e693968166b926cb37572ab393d98ce586e572ccd862505dcca3c5c07a0ea530834a388f1683ea37638b81f576255b855591319c9848ed47303f1afd48f4a3d08f403fc27e74a302ded10df1eaaddf8081d48ed439759823c1720a343ad298d353742431a7b5d091c29c9aa02381392db123e146b27e6d5b9b71f87ccdb73a04d937b08f7e037498dfb84e7af51b329fdd3069ae738367c76b7ec3a7c751dc4871fa8fdf00f2a39a8f56dcb0b98aa3a30d3638b2f9d1e9473e7eb4e347343fba5e3a0d98d3a87e546b4edfda54e414c896533f7f729ae2cc29500f8a9cfaf4e4f4dca9e5946727a7359a4e4e4d5a4ecd7296535999d3f23a8e9f27731acb472b728ae3e761396ddfa7387e7ecca928e6c5a315387e1ee7d48628e6afa749e1df8cc3e76dbe01555c02692b2c56c268e34d0a5ff430097fe847b4c7e1f32052927dd06bbe5d1c8ab10c1483e553367afb6c34ffde9d9ae8ed3d622e519c331b98b10a9c7da75fdc6c5a5c85d52b856cec4849a0188e630c36f3f6922c67326f37751ca9e6edb5d9efd43c297c1e4ff2f923daa3f0f6b3fc1e47c2811f8527e1f7f1a4da1f31e06d493b7f3a5252ec5338128ef06d9e64ff0729c9fc0a1c29697c150ee449e71fdd5f8194347b241cf657e4da41e8457107550742c10eaa6e43613fe8d841d553a06258761019a3cd64a6ce8e4f4fad8378529c1d8402a8836c3f2a2ad05141bd5d24b62e521be8fdf663de4c443df670c7b7a7a15fbf23521226cb4c5e1c239dbcb2c6b21933824adac3dcca3610bd742ce4936434507ccd29093ef639ada1e38992b7e98cb71e4349af687954bf3ed5a1c3db5c92453766c78a979edebab88494b70ee4eddb87e30567eb0bf0ed8373e5adde7ab8c495b71e86321ad643fba1e837e3bf18f42b7a83b98610b06e8f681f7a2a2a81e571e00f67dcfb6495812ed2a07d583b83ca45f515a9fe0dd36ac230cc9bacbb46cd9a9b4d3374b1d20ca5b9019d08009265082b3648c8c0f0811f405a2042880c408cf101861bd0374f60e11b25b1f20898a4bd2b956d86b55aa6cd56cbec9a753c79ef85c21817a9b5410b66cbc4a5c3b1c1a2372b8cf78419908bb9e8e28bc77029217bc39b89623e418cb9869871b509ef9adb4237d2be7d6e4af8548702326d4fafa7d853eb691886be8f0558b90319573edfbf205141a03eed31329824914f896e3a9830209fea887c66f8fd0be2e35322dd0d2639e7d393a806263ed59d5ade7c4aa4fb61eb531dd195223e25d2fdd07caa234241994f897455589fea887ae8e153221d16309fea88b670f994485705cba73aa21974f8944867c5864f75446064f894489703d5a73a221fa27c4aa4b3c1c9a73a22ab259f12e9be3c7daa2312b3c2a7443a1a52f85447b483099f12e9603041a64f7544574b9f12e9b238f13ed511c5e0f529910e87ae4f75445de07c4aa4e3c2f5a98ec8cbd6a744ba316c3ed5118549f329d1e50105ad4f472214b270f7135922ad2f647db03e98638031af5f0741db8cf276c3b1a81974177c9e405e33e8aa1d7f9f30d3f24bb35633682d3bde3e615a6ff4ab5b1f6b068d65c75b27c5b2823218b53ed9f8da0a7638e3fdf89818454d21c27a80782c6dc56cb45d3fc970a78ca9006bb20a5a67c505bca8b29079e2c142915ec287214c49bc10440a0f44763a70d324c3932068b22ce101e70a88179e348df13204ca3dc119236e983449b1c11a72e283093eb4f0200410429efc4cc5e084106598e05a73828e1f31f4604314383caa9ca410a5ea98f283c1071ad81c1175a4a888551331bc384f466a90590b2a84e141448b105f361c51460a8829206c708a9d41814813535b983c35a100945e103bb67698e08402145b4490244f26b8292365059404921f8cb03a62830b2740a9c1a0f5c2d79518d4e4d06617a699e1ab071155ba6030210acd84a825e4e450c5882b17daf0e0d40487373ccc80022051cc9eb3c312538f394f60b120c704a636514b8028a1049ce5cc1439475080c688291b2a40c1018911ac214f48080f90650d16212540fda614e9c2a5852b48561803a736813a98e8c0e588303524e1f514022c717cfc7690e303ab32d97cc22031c2042959447a6786b0e182e306851c7c3fa09c6568c8eab1e3081d9c90d13104caabcb8a6ace972b3efc9c4109269af0bd71e2cc6e4b55981d3c7c7579a1f69ec0c2a528292eb08412ab1ea89c694241ccc94cd69595911e66e8f104a8d1f888ca72e202c3960b3d55549aac01d3e3618447a9420a699ed21c71668730b635436c6082862f2f46d41d5054e810d2c49614549235409a3ae04282cc0f5728a410a5f22ce8baf138a124092f20683833758400445a907af34413981f5f50c49f1e9eb8b9d2f5050b0a07b4dc6043942f4992fcf0c4930a7e6a7aec082344eb872821a889d2821a3541b879e344eed2e122e68d0e5470c872c30ebb50cc93116dce24c982c40bed82d2c342891c9e6012040998ac76f3c5c5434d1227244ccd9181800a0a2a509150c584020968dd4045c9d6945614394f7c886a68b2a2a225ce931b1d4a7e47c810044b0d45a2c401400b61a5ca113b9ea258613940941c5f971352e021aa0b85ce9227d49049624a6b878e25374ec89084133ffcb0441323066ac832d506862a345d575e8e78e20b0b448230c30414f2cec1204a0a1529225c28c365570197de09528200820ad52e5ce27a01a12ae10a086e9fdedec6ad6f1dc1114b116d8b219d6ee8eaeaaed078754ec25a9ae3689e00657516740c8e45662078a198a02e0f61dd5cffe8a3d872967ed8b25482991f9eec40aa2f70a6841962a488a91d08e7413fb51e047f26b47910047319c5ec4f47a1caabfd2638dd5cffbda8df6cae3a90201efcfe0119f3a9fb442fe4db40177d7c1b983710c1fb45a8a508e694d4c4612def91ac07dd11fe824ee2f2dac68526f81bfe754c6250663392b55d00ec49e7770781e90940d90cf0af936069511cf6ed6d3c3bba6f33f67a4d8bab4031c660a1cab3b29ba5462fb2761cfb07c4878768253ec5e948b2a5c5892614803009d9a5fef693f81144e962e64b881d5ac061a7030ad5133f94b9e1cc992c3b1659475248128508239aecaaeb7efcd67d9846a2081e553e3359aad4d837474910215344890b3580d9b5b78d3bdeb214c998f70dddaf50e9e6cd5d0f736a0387bb4e8a524cd1533c9668770e74330ccd0f3d964187d519230ee1b1d78a69acf8b6b87b3f14c56c03f729acd6c4f0e3b70ccc20c03dce1866f1d2135c0aab3555704f9e8c245019c3264ec024980415c6dbe49270c268c3b009093ec6264d30e026b7ef5f139a26ac4f7557e3112ca29c960f5a0ca2b712a4903003cea789fdc43e1df611e7cc22e39c98fdb7da5757c01cb382ef5f930d8fbf7f4d337c7a7e898aba5050435037fb6b92725bb83714264fdbb0e98949ea56a03c6471b58512137fff9898bc79858a2e93929bc98404dfee9210fdfefd90f3b3efdf8fad4f71f857b76ab536ba688bbb3921130bc5a8783cde8e9d75191d846043cbf27c30f1695bbd85fd7ef8f8b4b1d87cda69662fe5d386f3b6eb6dad3506feaa336b5fbfcabe7675ce7aed6de352cb949a3a20f078fafd18f349f66f7505fc954120fc7a7351b3b07e99ccfeb416c152a4c8e2acef60a2e715ea130ab4c137e20e9fc616433aeca90e8fb9b4b9eabfde90bfd7c4f7de7c3cdfbfde8e4f6fbefb0343dc5c3f1f53f8044f605280020685356876e19c39574c7cc801eb8711bb30a7368670be2bc4be7f4b4d8809c50ade9f8f22bf5e141c9c6f0ec12c7572e10aba0616574110c4d84d3fdb3c76208cf32dd23ed1e7fbb704c45f7daac334dcae0a433d8084619038f6e0157a854b565e7cd0fbd40d812e03f41a4b530f7a09821804c52edf0efa0d6cf3298b073d6cae07efbda0fd3e4d1ce3e31b866118ee7cedd2413b0f926118661be6a3fa15a23d82c17ea1fefacf10f1fbb754f5574eea086000261c0923b6925083b16dc236d141d75fdcb8463ae8ba6502e722fd0217b9d15fbe3b08e37c8bdc14cc9d2f728ff48beb61157a1e5f3a575d3c0f1f1ad79fceea0cdf9fee3c8f2d5d33781e5eba000d55d6b095d53788d9bf1e6c7e3dd27c2abefdf5c87aebe56f079650efacff78787dadfaeb55f53aeff143a0563daef5ebe8f6d597fea87ed5aa9a41ff6d32cf6faf52fde2465dfa2ad541ed2f6e38e9a076277fabfa4577d0ed2dcfa55fa4f56fae551dd4cea583da6b977e51bdc57e71f3fd225b8779dd968fbd7f3bb03e1db1bd591cbacd8ea297662df4212b04f398a7e787b70f3dd57dd83ed3e63acc75ce3a899a36673d86c2d051c4bf1d5561f8e3657d1886de57d75a2264db6f4cb6fd62f3fdfbf67d453d4923fb0afda800bd5d0457a8c81502f2f6eabb42d649a198b77be00a5de0edd5e90aadf0f66ae50ad94ceff610ae50f6f6ca748564de5ea9ae10ea3ddeed1f5c211e6fafbc2b14006faf5357482785dfbc5d842b84c2db2bd415b240564ff49607e0047016ee835a907b370b1c00be830620f77201709ccfd09c7b0408721f2f5134f700901d75187a41ee05f9380b1fd115b987bbc005e0226acbbd8cfacd435445eed942bf2850ee5d2000cff90fda53e1a1afa8deb3c2813ccc4d2c7615b889f656e4a601ec7a335f01e43627d11e506eead9f54607ca4db39dbb8adcfb71d353a03dd2e63d5e437bb61e57e134b4d7939beeae77baa9c2691ea339e92a7253d0aeb7d3a3e52605ec7aa5af207313d0ae473a90db72536dd703dde63c686f0004c84d29763d980379506e1a77bdeb36c768cf2737edec7a3e6eb2c84d75d7eb71153e80dc14ee7a345fe128d09e0072936dd70bdd96cb4db75d2f859b1e0097e172136dd793f90abf20370ded7aa203790072536cd7e37115ae83f62cf01e3d1d3b00e4a60b763dec36cfb929b7eba17033f7b237d55dcc2ddaebd1d3b1bbe5a605ec7aa6af58e1b1dcebf15ecd7b3cded3f11db7203709ed7a3107cab9177a0ff41ef69ea3b9c9ee7a3aaec21ded59b7e5de8adc23bd17f31ecc7ba28fde547736af00edd55c45ee35d51d50ee055a5a5a78c4231e31e675777777776330ecee16ed58d6c675bd172ca28544c76270d6af8a967b6f951dfede0b6e01753cd42abfebe3afca0d3780513d15c33865755c49838418224e7cfcb081e80c95293761ba1881821245ab9ada123ea9aa5bb68079e2e10308d4d7919d0f62cce420d574a6c92e9caa12c35835a503c2ec5f0c4e9f9e31f03e1d4f20bfd96ac0bcbf03cbdbc5dcbc4223ca34ee602ea24b3e867630671a77b1580c151d868e22b05dcfd1be5d09442fc1e8087817185feb7eddd6b9c6e83773d0bb317bc080b6a0c544908d7f30fb0703170c6c6078816af4ee1752a3a7d7c32bba088fb1c555a324fb38f3bc0b8cafbd5f5f195ca4fafdf5b54bb22f257acb3c60c04ecc9e02940e13fb2d5f700243abc3886b8aa9b4beba78afd3570fb1f57d7510ac8ec32b5a226a29faf862fad73dc53e5a9ce57550f58b73306bf9a217d9108f658886218a74df465fd942d7f1e10643cc0a03c9ed7ac16c9b7135f03763aa328b6c9d89bde22ed9a831d6c14c71bd3823d9b7d15717ad40602f980b4683cf608c3116bb2fc618e38b628c31c618c418635c31c618e3b056e319ba18638c83a83d7690c578d47d8731ab37f91504418c65d6ee6efc1d4b2abf62b031083104c1108b65777737cc1c85b08fe21bddf1e66a2cad7d6f0c46ce461570bd18abbbbb2f5605671856472bde108320be8f653f8d59bd623666fd510c411c9bd966c4ee15bbc464c0d17107e16e17ddb85a8dc7bc38089b8ee5799a667bcdee7fbde22f66f57bef1d4b8cd5b326c87e71bbbbbbfb624fefbd17ebde7bef2d719b4e588b162d284c9e11831d5e5b288a2216c21cbf7f2f307dda3e6ce685dea7e6689aa787df3faaaf4f71570c7965e516fcafca905f0c5058cce96a7eae88cb98b5ef1f9598b701c58f8a090abc253d310f5e5441bee7fbe782d7a7baab7005b26f2908f5b6870a034ded96ddba6cc02e118be2b555c42028db008b300c835d5b6168288a2286919824afad249a5629238c2c61304ccab04c766d958de5454912cb700c48392b6532990cd374b08eceb555c7caaa4a46595e34b5576657744a1a0d5bd1a9e2c13c3cd7561e0bc432d92296292b8b0d161bac2aa54e552b75cacbabab328920dba0de0d2a8d7b716385380cafada18c1bc24a9a288e230c162bc958192bcb6b6b4996b15859926459ce64b4188d766da5cd4a998c56ce66349a59ea983bb19d9d6beb8e4e699a3a3a3b3b3c658da727d6d3736deda9953c3c3d65add6d3e353a2f03963e7796d3d51943e3e67890205ee3cc114e58f2c460a5bcc66bbb6da2a2855a8585156e065051560b474d9069e71ced7d66c2b7f7e8090f0039536d90636198d8b030292d1b80fe61b1725559415c862d4075dc50d1c9ae256902b56c0f28a71669bf1b75a7b2fc6201886a238967807134816a3fed5713350c3c699ad767654bfde36e36ae0715507d93166f9de2faafa8583501a14217564f56235a67e0143045f99b57d6c176f916f0fdbc176dc7e3bdb2b135b9cb5d65a9108128319537bf5eded22d7b787ed20be9686c198fd236c669b31da9c8a5f5f5f4abcbdaa97277671e18a4a960b5d575c60c25e71818d0b5a374c4d49c1308e57a3133d3882e297126c313434a54828830176c084a52c34bf2839148164c3129525569e9069216a0a5438c5c9ace8a220868b6474dd1c2883018e33c86e699a52a6b00c06f824c97993a14846142c102c3241c74f9c661847014198b54f78668bf6d95c43a91acd106328582014d90c249947285720141f2e9e413734d5e531f43685c394954f1d66695cc8ea64453798fdcdb883dea2fda312f5642db7fea2d8d6bef7da70669b013e46fa9bfb37a5cae35a826e214ac53230c1335419aae2c3a3b53448b9f029c6564cfbfd939a72de987c3a1486481a34429eaa7479daa5e6eba2489143040d9692ae9d159233427c5c61f3036297eaa4a2b42025e5ef992f3cbe7c719345cceeba6d9f5413a9264b2e3a61d344092926b63447fcc238d6a48ec04efc82d9b55aedb4b99fef9f14efc7ef9f93ae4f6b6e84ead66e86701436f8d764ebdea128b4ef5f140f73a2c0602951552196627effa2acd4265851677a34a39e3ced6f526a379c05dfbf281f4cbc3ebde100e50665484aeaca1c352892c1640a14737d4c5c80430392353164a1b2c36452c063cd124b43c29ca94b9890303249c1a74bfc22b9301cfca474f3a9ee2ad4614dac0c6ce8c91858191898021fb8c1164318b7e0a505318fef0e0f3d89c14bce0c3ba660b1e189a4252550915982c252910ae5137f2d6cc1f8094e6fbe1fe16dd102d5921a98a409ab4ecca5c59849162e71b72b3e26603ebdf9ae556a62a1d3e6eac54b9858f9ea27932a40b85393490c55c98fc9142653bee2132a9eb25c59b6cee0b0420b66d214b0a011c26acc961e94e027499228b992248ba9c3238847d0423981504b9c9614315f4431082e81922d99522a81623a819488516255033ec2d523b617fda046072c4c3dbdb044cc76f0c1558d0f80ce24388c53c624328c53461be59483d60a26dc7085bbd2c58b04355c3f7c49a4c22963d1bdba61b39046a76a2003f4b47d4532381082c5d525e165e1c84d4204ac01b60f64618c99d3b1032466ff180403f97986706f1220a073c003d8d3d60a211dab911398e062a2c9ca93577bb19002aa1f29a0020498ca020b5f61929e889f6a7c20b280030b56b84c1ec81b76960ab3d21410b4df2958676befbfb762d3e21a5b0cdac39c630a07bd1b21f431f3c43ca57a98fd569d7551ef754cdaf2a2369bad46e81cf42ecc1ed0bea4acdb308f8093c1907274015466ff08e778735ddbd6f00b59bd6f415cc9fa14df415c817aa9a2cb41ef1af400f42a9340efc09c037773d6cf9b6b99d402a8ccfa396c35966eceda6c35aa26a063177a87b9e8a6debf00dfcde56284317bd7bb2915b5d1c863ae35db685caf5eb3914d8ac977a0db66d42c0566a52920c05e1d740cdaab0c465b9c144f2974304cb24fa33dd5bdcd46ed77b4b82acbbc29d895a6d86660f7dbedd7826c6ae3204f204ea14688b10a2c3c2662deef1f9223278e0512a7977a1a8204eae9c3a7a80f9ffa0dafeac71b27a4d400040c1f2988c1e21a43c4094ee1fcfe1de9faf2fb7764ebd3f3d3d2cc90d3112a23361c39339e70a4cb119f09374cc2d00a4b2a9c708e5e418cb2b0b86a7169d6ac8bfb2b54892c8098bd64730dc4e6466f2bf44686d8dc787e0b8bcbd27b6aa3441028aa223210e688294580cc10c40a92a851ca0c8c6510d7234ff867040a83b94b30fbabb76f05df0984e2fbb7829115867c7afa4035d686597b8c25823524cd4f85a518ce651e7b6669733bdf3f22491061f3293655b0f6d6a55aabf55aedbdd7f1df9c54dfe6ba03d7df163f4444f3daccdbc9195a7734b4eec89645c0e6ea189579888e4e43eb6e86f60ef49b1b6d2943634e437b3743ebcea27d73e3383a46638e43d1310af3122d4f344dbab06c7afee10dc93ac9d01686a0b3b04229b8783cde8e5d9103ac0bf0af7f70d3ba636e2964ebfe8454fd4df3d74310dfea0a7f1f841e6c3830ad7350566faeb00c1033c56f1bfda92498fd130295746b9446719217ab312954f909711af30b620583c16218633cc6c60a0b6bf5ae5def0c5f276c75580781583623463fce2dc3952347ceede68a2f0e658182d509019b0da8e44ad76c6339c818543410044010005316002030180e8a8422491446b2f00714000e7ec24c4c3c16070351908420086228888110430801c400648c41063987b203feab620d51bdb7504d1da106848a1b9834404c286005ff05107137b0715f44150dd6e850bcb8f54df6632a84430e01de211b19d527f42a8cfd5be1e89ae85bc80f9378c23fb20c559905cc9288769df180188c350d47c74000d7ea82e04f8931927140628143a9fb880a2be80de5d368fa9eb010d3493cc020063cc24eb51c8177b92e111fcfa1866ab6f6bd979ec4e96c9572835c02d2b5f959cc30af12e0bb1707705f6e3be3b72a06b96fbc4fc62c88ecc81c1ad7e81d89dd73df2b2d9b34160b3b052db35e05e3e33eee1b3f3b857be4e10d8959adc18f71f4dd9699f996a2e79c4f843d09cf62dc1c5714e816b9ea7cc09a91548f177ce6987e5e02d0ca2000571124d4afb70d438ae668f445bd34d549c20d8dd54715c0efca1034d5d2d776b13427fcb8048e1b6c1e612d4720bb3002c99bdd4df20c15cc354d5d9ce68ff3f815023f8c08e61f6be8968b6f40785d51903df629125e2671eb325a5a5e7928e3ba84aba3f8af7e25cb8ec7786a8344ac84617e2d156c6c075f085d296db8af2416b68d509e71d56ae9699dff80289a3d5cefdb2217a07dc0ef74cc6dc308588fe623c61d8983f334fa56e30e3148faa80bba886a8e91205d7137a30578f4feae33853afb4797ebbce31d83d7c92d6c68b11b55aea4b89f5cdabbd7a414c87315331fdf6cf1cfe0ccf8cc7292cf30ab28c4b4f70cf3520c7649d2121d177f92ef236a36f8eb251aacdd941945678b464a1dda0b6479871493117fdd2b2377cf6337961d6e99a0de7993aed6a874b8b1811f98f4fd6ff4bac2164331b5e0844c0cdce8336bf41a0247bb621a92004125f0803fd8cc0d4b25836f6b0f3fae321628455da5386e0b247b8647f89821b5ffb5f6e7ecf65c8fb575876b825e291d42f12f65d1d328d4406d9bcd4399d8fe56964e349631a251fc2f1c5a5997cdf4d022a8a9ba4703e7f484abceb4116ac59776a8800af9f48a6504d4a674f4bd657024a6e2f6a78186c1d7debb357f730e6085469f3ed8f3b3c9faba5d7b2d11128cc6b71db25a15d7892f9afcf4a2c39a12efc552f239764044983ba5edf45188ecd57291157323329812c70573dcc622640428d36347e795fb6d823169015d8e0f8cd6ab0d92e4315fa2db12329050312c9a376870afbdfa3c85fa490598b6e6f6cd31d0512682a9e8c7f70076ed81ae0ef51c07980d448eae3a3aa55a844c8d5115aad758b3a143afa29a613e8dad43437b37dab4f2d2826412cbcf391b09aca3adc4bbe18f488b2d1d934f398d30af3777690e25f989df990376252d2870f554f5d73cdc30caec78bc2990776fc0ec666df4028928b5bdf458f84eda0e31d0b5ec9296438383140d87ca35f45817f420a17fc4990a41296d0c71f4eed7ba7a4eb7ab7d1614514127b90c1f9de6eee23303394090086c56da75a041a9ad00287dc340ec48b0ef2fee5cbca77a91831cb5f0bc16ea37bfc454743e00e3cc6f9ac0c4fdba8f33d07ba41c930c6812148cccda2adecf6b36670dcd80fd431a0fe0294d055cfb81087744c62a586ef1e83d76e52b82d9307e32857a660421daa70e158b02acd21ef6cf66eeb4c0aeaf6590f9b887ca13a05b5f0322f7b844ea7ef8fe10c1d18145605f078c5e54054220a2ef40b7199f63c241b1a21cf1aca2253b532bb8d3e22f37c05b95c35f5781421c188bdb05c35fe1ea113e1f08d0b8d2c8ab49ab013a287516d638fd9a49b20ed30976743e8159093ab1dd32cf93e98c12bddff89fb3bb147ddc50d51f33d87476e070fa271aa2104dca69adf06122e41e93551569d96f3e0b3b49dbcd07a2a050fc65774945e896075ff8846b03740c0702aa14136aa6ffca87d2742cbe6bf860657843c03bb91e1d8d1cad187f25e4d56126f71296d5dcfb0afc39d533fb520e7c7f1e17d4475b97e177700d62ea23334c88e536cab0d955df12c1878717e268ae3b3adee8d7c8dc5f7ba3c523d1300781b5e0c891d6cce058978ec989a9fa348efbe2a9ec41cc091aedefaa7548ec672c8de37d064451d8f473fa406348161b2c7f50e8d7af184effd45c8a2ffb9146c60c4470a252dc8a133d0d3ddb21abe66936d6c7141cf7f1f4503e94aae610596876ebad6b035195d90a2dc5fe1c2936ce410573da2d89188206d895bc0fa4b7bc2f646bb2b29927591eef9bb285f8e7302077ba605e80aa08d8cb1f6057670168726e0bc1a5cb87f86384da099cd07a4f189538ae08ae1a1f0670ad9cfe82aaac03d4d00c7c2fbcaf1bb58c09b57f1aadd323767c3b9d4b79264286510817547e1687b19280848a1c1c72736f2223b90a9e1e40a9f9e27480e858c0a54c07af5125406c32ce1555b64ce0ab4a1784872b5751f9996053f5f61f324984f7b98aee116f487cc129a35d07118163da616957bfb54eae65c457980502e7baae05ed5b42505181aa0ee23c30d4318240d4f9605128cceb145f1ab843e24362cca9837c66e184a1b0b158fac4456aac2a58be37528a0b7daa5770f1712803aaa5cb792b73d5f4f1467d051e09a83940936fd2e65624197d2c9b421ea28ada9e4a4a74e2131e41b0b10cf81f47f2c8ca1ee205560ac0a2c9c4956f1af0ca030404548ae1fa10a73148ec984bf8eaa1a41c36e2e9ac55c8b43586a4740844253f129d648d56fa44a73688b035e0877cb632e1adaf2ddf1c08d65310c33cd9ade914edf03eb4d47d40e9b64c5414e4025830d713ab0f2a1ed58907d213cd900d560b291559fb91c6f12b1014d7386b9aede89ac8ffdc0f8820272348e469462e40a85c680994244198cb62fea721fef9b8f934d1770cc9a1712d1f0081624d6ed99cc3bf6b107f390f37f1a12ee7bd23ec2b47a9a8545eb726e5a0352f43cf95351e1f855869cd1968fff07ffa5f48fcaf93822f0fc1f12690d1b238b1700fa1821a0a28fbcd3c2bc7ce26017c958d81556cec8f216648cc8de8b10291c1b7d596e987d3adc8c2c552ce44f84a73de96b7182e2da776e376a77a54a8fa1b9f4cf009164f703f0dd2a9f206ed03e91302648720283ea7013455dc416720bc841212a03d3d706aa0b721ac087909fe20ac55a3d3334ced6e5009092ff1a504337d5af14d43baf10388a58709a2c06a88d9f2b756f27429dd52dd02ac1650c7f8bb30f92a536651d71c8014a65b13e1c4f17d00994cad0905d35827095412cd49285a5255f51eab2022bf54cb734f9f039f28dce494c510f2821d1fd027c9de56bd686d22e5512c733ed613cfa144f495f506a01a5af3bc0f8daae9f9d0b0da5e1f0c423520c9a1236e465cee013a172cb5e5f1388d84fb13d47f288897dafe80b67de58102dc52f9379971aa9de44b3a9b7300ca903a9d61e32d06c79a417fd749fd29052aafd38714873f9c31ad0fd61f9ad2a8782b26a35d8cd5024ce211cb8808c566955884eb16d290bb7d43b00004045c33cc08792745182d6aaae54d3a0d96b11825de249d1d177ba56285287061c2dc782a33be0f96bfec94e6dd3bc2ee0194debd1b2285deaf244ed4dd9da56e9458935f06c80c1a6c4c13f0a0856d647809d7cda71a7abc5002dcf269d0765335e3b68631eda47d5a4630a0d6ab99d37fac229bafd7a6f254e2839165021c57d3868a670d2d33f524ffca76ed59be2b13826f12dcdf0295d22b8b747ae1c17545f598a90d3dfb3c3e567a75574c07bf18883b1b7f4477256c63914728ed3ac2919a94d21690a268550f2db5b4e5bd4c0720b35a82a968ba3d3f673b340c53373d32deb11bc44de5396392ad6b55dbbb669b4835f016a6a46ad2a6c5e910794ba9cedbcbdf70ca7f2ce2670425128bbf831a18279e4486e2a7186baf3bb03df1caf81e19b3c9a54aba14f6f10cc8a831b33fc36863529b930a5f968a88d8e3399106ec3b2ccc72fbeb7ebce6e309ded8c039a4e896a6db8f568a2a382cfdc399bb1f707f1f8e5028cecf47deec7d27ccea1c6af040b45b657afcc9e3dab5c6369434a4d3bdbc6193e3060c604e15b048bde8dad1a2954a0168ad190978d846c59407f91f185e0c926c964a77a15d8f41839d1d2607f95e8e0507c1b35394dc17bde597d9a05693f575c03c709b2cf7fe4e5d3708ca84efa9dcd744ed70990937488cb592867fd320234de55ec30ef5da40240d36f1032f2a6d36a7f9583ff21b4fbfe2f77d46cefc22788807366726381f0562e236ac20d6837741316dd5924f632608175891258b46308645efcd43fb52bdf0bd00bd882443eed2bc73fcde821dd02124c6cb54774848a4098f35aa9d4e97e32024611fa1c44adc9248882d2ae37c025dd81e525663a9c38f234a8b813b24b0c546e20a36625312f91308179b50fef35f78e87c5136637f4abed94f8d37a8aa316abd8b2128937994d53ad2347b2818af6f854702ee82372569fb9ecbcc75dea10fe139f1bcc72e70d7c87aa32dfd8ee02e067a602095552a1e8484e25a00fc39b9fd48dc64ac0be95e7fd0610008a343a921cb419227472a70b3fa7b4d7004ce50a18663423b106e726663d63abe831f34a6128dd5c03344931d49905c3dbc91f5c9b87b1afda10e0ca53599c8552af2d6e547d7a2142ab7274b552901d4700d5128bbd652d37a464f9fa62b004521eb7dabdda5d02b70a991ec4b7d7262a1ac499529811deb4a28d8f666656aa4ff3181ac922fb85669e357a6981d17220b6b35fc578b0862337e7746991a0901a7cc535529356a11011c35e4ee92cd223b137b765624338d18e82117ff4a104cc4b6b8891161ece3485b4a21031cd708c700d10b76ed62b3f7ef076fe7e5a19bab029aec150348832d1594f787210f0373d84d9c27536b03c8a11b53d291e9319beb7de82b4faf413ac0797dd153e2f79a50a4be86d8798cd6cb70dcc0b5655726332526b5f9f55362abe4b927915dd61d094295bd036ef752617fb1835dc771c08c181c7c4e50619c8999cd2afbfb2367e065eeab2b61649e6176076767877a2f2dea0ceb6ae0157e535c132ad41e709f9624b44abd2a49abde656ebf1ef9be73eea45caf9beebe971206346bab80b7410e17765f10ee72e7990b4e1852a2c242aabbe413fedfa484ae8b35619b67e3d3a2a3d8c6b24847a0b2acc8a4396335f82dc952372cabb69ca235a055566c933b3e5c90a5c40d4402d648a183e304331d13222ab7b594f0d8ca0201ca19c5455fbcb30082bde6e897ae39e69d32ba3ea30e25ad3ee8ca6701d0f0a4cd4264bea369c1633977fc840ab2dd81e8f6a0650e5c1556f0d36d8e674e69bfdeec0a9bf20ac5f8446efeca614d5708e8f882cc58dd7ae0f46e8874661af37eb422fcc659fcf96fe95771093f22cd487b86c8be8d8a7d174665b54d7447612744a5662022cdddb74153c5d1242683c25bd7fc09363c82b33e025c807649d5981e12e67d17349eb275f04a9410363948fda5dac04f3bc2724ae8644c846590c274e515fb3f08fb325413968859b7b284a826ba303e7b183a77964691213dbaff51484c0cc24ce4b7d03cf6760269596505c5d4209b818885d87fbe65b6885eb3cd7f769e254101b7972729934f6d2203dd931366483ba5598e526e6ed67c86df05c611c4c0f36150442ea8a9670c899f595e131797e873d3200b2ddc5912788297074e5dd99b230359d1feef32d2622e06119f75744690b2debc815b4716522bcb6efcf362a6b316cbea6c7450d8fd69f80c47388e3dcc3041a9a3691a1fe271944104b84971e22afab76b33a1c36f0c2483cf232284314fb11ec37d9019e822972e001ce53bc0c8c20e89e4f332491169fc5b2e402d8cb3bbf4b6d2be2a69f3ee1a3922dd572fec69287e684a5dd1db71cd4159375d9ac4c3245ae9cc5104d80095df08db82c312ee2bad00184307a73d753e2e141d9f643f50c6e04b121f401e60a50f8c35449a08d3b84ef2edf625e153ea80a6e5f58cb9a82b2258268973ca6ff845027f2dafac21147209bd043960b91ed2e6820f96e135ca83a0622b46a545eafa4f773d0265fc665dc60f111387d148367051bc723445561719e26f0883731285a96d5c4b9fc317f9b9b2acc323659b8e23a618a8e1840c5cbd9f6e2d4e69893463b5dd3dfc697b3cad2bd8e10be894d47a31526cc532c4cdf31cdaa0bc8621cac1aab63e31fca1d73ab08757d24631ddab6d61bf00df160ae27503dffc7f9ce94bdbef55f362a2beb9725c246b0d86394e47da5413c5b01f2ea1de35d70c102821ab1c8bdbe49368e7249666d3ef3577c074933aaed43bbe83135870b3c35d17292e5aa34d76d7f152bbff7946201a7b22a97b6c962a8c005231707010a9eec80072d3e239ecf214c69c148d4a6bf2d0493acf1923693b903cef7b8ed56bae02c93b37552f000fe4ae913fad7747778a2ba2ad69f21c208ee99b0bced987ec646b0791e594b3440e8cdab5ddd13bce179e857e5cb06bf7755ba9c17cd0e3e8735896e08ae4a388141856421291948d4c94bc5d28fae9a9696f8b102a3e1195f38f4cd8ea233d49043090580f323348119e7195863886e68f9d712c4247da722f46373fe5f4ee5fe7e153313f9239f46ca53cb5a5e90799cdaa4ae849d7fa5106f6097c09211c11448c94923166c52be78790195515b87e609228e68ef85e072e04458fc60a51f44ea4af5132485a2669b8da8dfda8a251a32bd75f3aad1cf446b5599a458b84769d2ae916c88521152f7dbfc84ecf970712f4ea30df37c32b70a0435b8b125014b8a9b0079ad96da8404a7565c905636bc7b2d23760d562304429bc4de0dfecb95005a9a04ed4047a7c7f8a88f885fec9cd65c78502d36f5d9a05e165dd32ae7d40105402e3fd35653c0a9a046c03137faed29e1b407bf473193fd2269b6fedce9946904e52af49aa11f7272890173a2c0a08170a66726494af7c8e0e7a2c397d1065e5b84bf1b78b0209b17e46063bc9545fa91e4e116c3379c956d8eca42c61eb832fd04f74b9e2b54342ecd334968f4af36bd946923f1a5123422888f6c8e108dfad953c3a0a9492c0ff6099e54aefd0bc1e5ce34ff60792778808170e51e01983defd90726fe0e0e4ad5bb9303bc610018789108e255b33609af808833719ab19418e10beb4ef39cbf67b9256e1f647e476078419c5e2943c0f1c7bfae144156686e2cd9489429a0e5b71590b68e5a885ea27cbec3de4f35c2fd50510901b90b635a19e6e4dffcdc53e9c179a64acac3837a1f88044c578c4ca0f55d3344cafcbb2bdc547ce72c2fb8a475a16a71488ff235e3bc0d74476d816b6bd040fef95b45e95863f497577ed39cf207a91c578dad9b3d762bf8fdf49256dc455d799d5abde2fc35fa37e0244ada9b076ff997ecdd9b5ab4963b47407ac912da69cddc632d8ccd25b7e595b678731d2cd0ec7b3a7cc4e3577cf2e6f20ca0c60627d77f3d9ade8c5a3dbd187be76e2231351d19db4b1c7f854b784b541abe39a69733c48f8a3455d2b1e80c4025f0ffa89a0df3d9522451a857895245a32a81b9e00dd6d13cdbc4683882d6637743808a7f47bf05f86a407a0d488585384ce2d63cf943c66319d8a5adca257a7d9b3ae346a774cd6644bfdbacbaee6aad2b32c11adba8b9e1db357bd52b2ed38aa9555f6754fdd9acd8ae75452d4ec16bd3acd9e75a551bb8383f03709c59a318d6a88f82cef9d56d7efeed5dbece2d6bef21bd60f348e87ca3a610f599b348f011324c08e063843db4b0b5b6a4ce717b8dd13c3d9571444ba8bbac4b970777356bc44eb27d58293e41b6fad3527093e8b8032cca589e5faa458be4463bbade2a8808e9189cc71b60ace78c42630d6dbf9e73d730b2d6aeacd0b81617d495460dbc539385bffd77338dfce82845ed8312d60b26eb29f8da68f5f8d55643d473a7802173aa31ffe80be904fe80b7de01ff017fe847ee14ff803fd803ff037f4037fc15fe807fe80bfd04ff80b7f423ff007fc817ec31ff80bfa85f983b7d193837a948da462925352d6461af7e68bcecc16a9e415923e3aa20b93e16288f16aa45c4685119907d27d325d39182ab7e85889b49b2b834ceb4007a0722d58ce908a3efba20fdd221dbe4ed2afa226aecc52fb0a49001d221562b152902b60581a09947569e1a87ce798bc4126e83e3b7fbb4b5f80d4f7d4595a4adc15d82247ccc3c3922dc4210ec86802bddcac8b44b72c3f09cb6bde069d281aeb2ce08e6142523ac02d7ca9036c5f77694ea0848c8ab323df19ead3d59c607951cbe09e48f7897475e23e6bedc8e0a67d19ce15c1d5902e038cefb51832d39577414fc8e847293d5959a27147b2a7135a157451a34e6b41a7e8a2d288632001fdda02f40c796846bddb5751d8863fc84c57b2043cdd1ad2f22134be4821d11d50cbd6b4456a6b6d4e4b8cc0e5228514778087a54ac3331b64b197500ec54402fa5fc6e4f940da9dd00b3212dae7025448a9cc7b67c52e362570994b58c33a6a12e643d7e85cef8f8f1b042f0601bcc2079e1319ee2392c376c0a8d9964b2e6ed06e3e5b93f94b9a0d23beccf9bdbbb9f7124a50a11a28fc78d04acfb06c7256afac0ad76619a588c51b78ff2d2e1f05e49d50122ee3496de16c3c7a828b023dba3d1ba9e877256c43f4fcf5fe0227461c28ebaa13bb32b92e58bfcea2742974608d0324d6ca39cde122c96dfed339de3ef6f5e9ccb4f303fcdcb67b2c0dca123ef248299050a4a9900e0223c7d7839101da29905d45975a0194d6ddcaf3d4f3b65c36d7b99fd57e8b09b429b4666960ec909876e107920ccebf2e1d2889b49fcd63c96c5961c1cf8fb169964edaa5cddecaf9cef69774c5076d0c6bdb70f9ccdcb78b7221b35fc401a5a67cf71a4467054285c70328482d1f6ae091e3b8b936abb3fd8ae033e3a33f6eae871a08ae66e3ec0077c745774f5653680b83c8f4641bda07f7f1b0a0a8c20c800c230e1320e829749ecd3c0752e477e735e24e6229365b30935aa56e174017e8e83e884666254b065a941ee5d5a8e6a9ff69019f1adab3730840cb6a69ee3694acc5fa8188343a293b4405233f64b6f4f11763452488851720a59dacc72363030f338503b35afd411f5ac9fec7a7faad989d2c9536725fb58ffea14813281991c470370d4b506bb3e0f3d600d856bcbd64ea61c0a8cff5ebff0adeda70ec87c98e43be9f30e41532652dc47423740ead72bcb78a8622bc57986ab8ef2e6da8e4007f5ea954749d407f98d612c1049356be3bc5997b248552913d4c982e2e991b5efbdc4f333de2c6e20377f59517f0fef5386ae5842ecb0a1d4f712bba26e987141c66ef415b3221576ad548325ddc803a28db421ce99b71af773b30a748f867c3d5635295fa0cc47bc86ddd6aa297b3ad12ff36daf27d53cf7e7404c970241faaba19d204d4870c64ab644cd6205a580b215209a35560604110b98605fcdb7c505c1dfd5d5195c9164abdb13218843a1f0a381425cf415a4e47285a7d8ddcb2f9325eaea484fa8f6bbc757b88ad34132a570925f3e7f26b9e7d9f548be612caa146398605f0580d9b60163e4183277fce338eee2f02e82dc645cea730581e4ab4fc81c2967c2814c37c1214dfa9b7efe3370193f9adca1971fbbd4a1044f5f63009a88910e87a0b13846277cce4806a374156b637bef23d9571a0db3399d907e20008abb267562636b3dc1521a2eba7a58a3b8c0f0a66ef8a56369bf0238e9adc2841c3e9f13f14064cc999b67a0f466f102e74fcd6de93e18668bc51070a89c213675a3c93a85d5f93867433ccc56a34aa224d74ed2d0ed1c982a83ae6918c59ac9b624b0026484779bc3d93276c643897d8bf50304a7c8700078b4114fdd0996f88c7ce826b5d9928ad8ec6a6ca50359f241d2124a6b3e7f92c0efaf37808d802f3458123f889541f704d67f06e24fa588a33b53e4e166f714716eab1a01467935aa1b2274e160afa505fca56a5f5d41a4c46713ca927267933c39ab7325bc8d66d3083ffe37863ff857c9061d63571222ffab9363a8b68f02fd9b846809eddb4df5828d1effbc075325b37b8155d942e6aec8fd2910b345ccd2f9a0b2190aae85b822dab72b2a1b354e730687a0562d2dccbc1d474f3a201e57802b44e9b2804586ab44887aa9067c79aa14975df1fd3a834f1c843d00064f4409bf595a508d8101df48238440ebf19bd0c960cd05bf9846196bf7ab8f8c045f9595c8979c633bee94a96cc6eb0ee17e6ad0902a2871807e018f07e6c62c926524605bd3d7fbceca9c48fd037b3fc79a41281fcac19b5c18ddd3f932e032a3f3583c5ed10dd2ab47854e562502c71b425a9e1474c7b41ac95fde30520a15f937d6fb36c5369582b6f9b7533d990e9ea0c93865fa5d81c533375d983223c507b91eb383e6b40c9d5497acd59270eb78fdd1ad8aed78d8bc230ed3f4de2dc352b5a1e08f3e456500583cdea19a050dc84f2318a2524ec7477e9f50059ea964f4d00cee61ea3b81a5330d6641f503c701413642604448aadb4042cacfe491b6ee5b89a4de3a5f0efa1347d9e2318121658bcc469494db104227beca8765484e5be19963bc58638fedc62ff1f77c5d9500e0870c5592539794a774479b0487132de37177e8681e27c133bfe9bf85e3aa84031e324a314e310a875dc1da120ff6e26b698248623bd406d032b85cb163021d35a56ac8733038d39f382eda00b836f942595b11440b1aa410b419bd5ecc846a49efbd58819bbce82623dcd45a89d27a39b050317518b961eb09dfd1d8a7a197da8423b9e9f9648987d9fcefad4538af8d80057da54425cef2ed46b4831a4b1f333906b4cac2df7b4f2ecd3be9fd90dee52da825fca05cbf21628e5cabc12aec495f35f1a94f3d2926c3df127cd7559a276d75c1706fe52eb1e79c18cf29004d648b1c0d8579a3be4696a25e367c1e2bb227ca1f8c6ece6747479cb3bd4a8b51b3dbec7d9d56254bc14e2e3c5c9a9d804cb8f696e1521217ac61a38651089f1019ca50e87e2059714028f298157e3efb68a23b451c16f14582fd265d90c33f197987339753f979f7675dc0cbdfd89a2100f428699e39284444fd979c55f4c9f8bf9c6cfe1a6c0918408bafbae593e63ca644465d0b159ce9959245654f050142aac9f10257dcf8748f8719ede16f70a20397ed79c3ef676c3caf4142a64a53225b1c240cb1dd9a93a025a86350d2dfcdb3be28916d259018cc41b9e28c504a92d88b38ec8b254f1355a73c8edb19fc42f2d0e8dd70072a7233298fe6eefb8f6c0796887990b90fd0ee8c37fe43a1d6f6c8a98fc69127c91d081fb77566734a12c09a19c6d3fd0b3619dfd115f08e4af1491150d0c25599354e0dae1b15803b1a0b9c366fc90f84ed9cba1531e16687435bdf5471f7ee4a34fe947307da0d53e58a87c8a92b7276cc372bc75bf17ea55657b5071003ef5a68ae214ba4b03dc3e50b87e84f203f9e7efaaff53637dff11d43f3a3deb5326ddc79fe163ce8a390eb97b15e1d763c5fdd11317ff352ec845f0e84741a4e0e21bb67cef9c26733261061cc23c6153628ce917c678a957f6b305c6d70232eb1fb4b068aa296256fe295097f52c4e730e520085c21b507b038a88f13b8764f6652c8d17360418085668853c63e82955ff8b4c890291a5b20767535d46ed69158b9f9fc1059f53c818e4a27e47483fa8a5508a3bc072937239da692215071bcaf629013795719827dbbd7a9ca6a55909ce10ff82b564361b8806e9507e1b3534f0822a24420058c21312175f7cbe8501ce9d785b9d8741f33fa6b8ca5cacdea4aa50ada35e712af0a535b4df09cfb6a16ba46d13426b6f661efa478d5d9eb84223b1194cadc0b89dbf0b71c4691c37c7a9c3c36c2ad78f24b220292c769787d7b28912036c7405622ee345a3c854f4a0e439160a1fc5c900c83b9cb95d1499d37ae4801784ba10d546fa1bbc2ef192845e386760ff755a9d202353adf41ce7cb40c874a7b864b2800fa04d8532c6a0fd09622700b7726cb14c81f4ac3f9d7f4268450c6567350c70a8464db39122ae7e186751164e298ac6b4c8c1302cb771b1f89d41d9e055341c899187f1d93b28b1e120f806134678358f4964a7018371a60984ba50d086367244f905af07d182a618c004280c11040850475c546a0c1616973cbda71dac9fb092d244df795468ea068b76a268fae4e047862c47a0d4b471c44db8f83273b1d372673d0e183aa3cb863c59031589766e07dc555a1d1201b377ae1ccb9d480f3d2646813357152efd4c1f949cfb1abcdf346cc7a38073602ce656ec6f5ea54b267da40c77262b30309b32899370dd9e448f76a656d79867c0d4d768f28753d11a0c17d34d4fe0238cecf9af4673c2272c581c2974286f62514fb5883f4fb423cc6099b9c8d5702c0d8b8d76cff6cfe165f20940a0aad0a0239e0eb6bea1c7a506de89db0ac7b5ec0cafa7e5da8f95f93ff999255dd559dbdfbb0a5f2bd1099e7ff451b652e17efe1bfa82b9239b65f6582baeadc1adc4bf85d80798475132c3223a877aba45a1ba3d6634f0ab3679075063c6b770de18cf85fc1c9ac1f8a88cee4863698fdf9e1decf4acdf97915b5d071484bc2cf5b65c815f960186d7e79e51d95ed29fa825502e6458a180988c2ec2a37a2b4f699153635e722ac72d6813b2075810f1fd1deb0f1234f44045987b87caab471047eba45226c8557e3f9c02d569634c6e1ace06fb79de2302cfab93a16ea383dd528de13a194023c10b701f64f8a79866dc6e1507896964ae65b9af84000d2a8ff904cb45739b300df12b3abdc210cf5d7df389653a71d938bf995595495aa5180b7e996216a3ca1b4d1c7aea3348d43ca30337923d67b4a2c231d77167fa3908d9d8c87d1f08ef8969fbf6c5df53b2b0068bf8864a847d6fbc85d626cabda97ab316b43bd0b35bd61c66de6847055390e37e989b4cb53828e96d02bffe79e3a0056b7b94fc37bde02ece293187ae3a01694c31dc0586200a8ad38c0f0b1aac294e7c563b0574995adff4e251fdd4bcd2f96349e5c57c08ca8f04ed0312ca5d78d63a0b0827b06a62bcbe4e8398b81621aa57eae22e0c3467ea6f8cfd7c65a036714ed4a2533101ce984f26b209c59ab2425c3f55ae9d2f9bc06bb5358cd642d9df2358988cbaf47125cb4267ef836e1a0bbc4f01468408210f430699a9649270ca4ab5a1075bdd82c4838cc236ca75d44d60d2abe969977583a632d9822280657da8f419d0696d2c97b42cf313161dfa1acb59c6ee36855963c129b2b63890b99da7a565f39cd13ab0030de3cde021a524f52e3fc21b45ccf36ae610ce26a520e6616df52049469ce6b71c0c6cb5d5bb21e787dc55b37049f670c3999447e40760f8528b27f002a734177a28f3c109e646ff55ddc266cb889771985351de37817bdfa1714e781343343c918ace7911d238c23448585312724af89d7819f9f64caa24f2b93db24f6cac553d40f03bbfcfa3241da1dec6c380e202c7b65e69104f729c8fd5faf69916f6f51ef51fec89018563c12981cfa855115f3f7dedd8e304e52070e17306247ddbbb91f89fe2b066f7a4a3fae0083c0678a5fb39624a07078f1079e8c96877851bd50046ae4c22f58ea599945b9e4a290b349084fb637a0293a4f4220b7b369ff4a687f4cbbb2121670393efc218cd9464d36b67d30cba684f15df7f7549ad37d03309c7b5a1d38a6696f71458171a5b294ddf70adffb3da9c9846f6dec08b778313e07e672cae875a65f5b8464649ff7fc916bd988527c8b1e700e9c4edcb4454699002eb2d395c4167dbec8f4198dbb2b1e99e2297658a1a4bcabec055f8b7798572a4b3a9ed4441a159fd47f6181acf83e007a31d00f096b23786df7a4567e2c888e090ed644199669f14e995df781d4f24158e7c2ed2f8eba9800dbc68518565b8d8ae09ed8bcc14112be15eada6818a1413ae28580da451757dd20d575c74a5c099b9a59b9ac96d86ad1f80b1f5a53b5cb17d6e636130d703e892f703c26eee71458d41d2a78381f4811863f61bcc1e08a28c07626bec40c4a4ba023d73dd083aa00a31df3a6488f0fa2d490b5a872c2d653cd8836d6cb967b78e35662e88d37aa9116adfd6f723360d9c553357a83759f4b526bb16b259c48b0e670145259d0aa4e2f2df8149bcc128054cdcfa11fe64e35bbbafd728450811fba5e560c1f4545d844216758077b6a3ffd28b8261621d176588efcadcc444501bb3b3ac60b2e23f46b2effa3aabaa2c6d011d5f0db92bfc44f404094d11f4be186a08d34174dc261b8ad2ce39356093befce870430c368dfc33019d2a674d21efe276333c8f0a311614271f220a11992f56b9dd5608e0427b6ec54d7e592c4839336e16712efb75400d53927c2684e46fd967d4e21662bc95201dfeb2a94548dcec18c4c5bf55d7a67ac4905eae97a2ca9815b5edd78e7adc4e44af9f3e69997bdaaa8244938666f04a781c210f569aca87070dc3d91eaa2ad4ba478353a29b21c1b9c172a389e8ac03c48d7e265fca5a29645a220497093d6894629bfd4ce9bb2fa02e45ad9f820d4c4a0acc03cb19280a446983ef1f33d067e7d288f61d6b8a42619993ba351fa8ad9490fd227b1a2fa2ea309bc43b50395e524f9948ba4b4388ef904f4961cfaf5b27c24b030ae0a9bf462ad1a81f4aa987d2aac86c7ce772d01c6495c9740c57cb1c4bd6bfbc78c7aec5e865951a3828da501881ef1babe83fa14db1cb6040fe3f0705c6f8931e1564bbd3ebfc7039ddf440ce1011f3062df88d91ce03ebb7ced1344a3fdd678b0b20ce53ac8365605a3b8bbff13c60353654736cca16eb57ed7b79bb87ba2df0776c69f1178953513e000b808998d7486fc72c1a2a8e2f9029eb71587d39b12d0157a43a34d1089b82c90ac036b6ba9a31bda97dfe825816b2e0f093ecb551956ce2b37b36819624026bbd796383de8ef8c66180e05de69f6d28fc0386e66622ea03361d5797c88061dbf89158a61cbab2b2f19239d49f92325a93e063cda3fa4cd790565a93bf334e59d6e89525e5d30bad1bacd621d899437fe00ab576e17b0d1cea35ba47808f7a7ccad3bade9c572b4607ab978d1e4c8b18e36fd36643b969e723dac8b35610adb143f7e7c5fbc3f878f98ff2595c8bd58c919f71fabd187984082c193eaba731b809e7f8642be62ac7107148df9cd796043e0795aa1e33f7a7d47e994d3231185851a31e53eeb92c04a23203da3a0782ad7817871467b6a63dc4bfcc08bd8b6d0632a65b10ef92bdeef73559228e86dc121d3c684ed877455f586d998be378ce45bbe580b04f01b3c849d317612b9df4dd7236a5211d0b0adf8f38c0259e945b61fda8a1185f30b5b176a39e8b4c7ec51f56bd04cc16816f8f597f4bcd00072e736a76ddaba86a0e7d4780d4aaaaf3299de621f08f38a914282323aa22d99558731a6663681b662df76c3fef9e23f5ff28abf863c7f02c21e73e599cd60ba86ba40338ddbf80ea614788831c3de86ea6d9689119335e93dc725c8c6fbd4b10902ef64edcf5acd30f94092df0cfe699ef49aff5159b792eaaebea2fcc04df5134aafb1d48e3d113eb0e2b3c45b70731716ca7c3a3587e639bf9400e51a1cfc0cdc886e33800178d8e1f25590c37e4bb0de04cb0efde690c0251aab93f39ec4260a6eddeb24183412c8af120e988b1e19d59a8b2b34fc1b82735cd834c6cee98e2fbf5566406af392d706224f6d18bb84b6a6bfca860202e309f4462a06544fcc99e58b00b085cdb3c0d4ce3428bf4b80fe1dfd2e816003d3713644d6e7c82898df0f2181d03700fd6e54f9a34cda15905ead0fa68da1ab9b9a66b14bab48ec22d62c91bcc036c1ecf8a44376c9be39144e401f5eb225b56dc98dbd78c19fb58907e68c9bd644c09ef2cf436466b5c680348d6e012ca73dd85981d0253831525a8d4380080d45392692bb99fb31097a50266176087c6a2c4bdd5948cb36f4c42d2456673a21b92b71add3acb582e8465ae1b8d3dee1aa73e84ab2c0264f745e3d2fd1b6dc767de5c794213c2a8ef1377be582b145a70a979a85ce7d3ab2c48448309bd1f2860612aa414d4823d1a253e04749fe81003f19ac02897954b07bdad0598970e71e70ec4ef23aaa0e50463fa0f2183daf1a4d5bca80703ed950255636d2708ff60db6d07f431ef66a1ef070d485df888a1934f0fa1d4a40de39a1e429556e85008e87c1b74a8f6aeb663f738535bc41f8dfd3a4f93931d656bb02631d1a4ce2ca4c58269c31b33506c45a19830da6581e2b423e24919d2807dc1d169207c554e65e2b2838696ec367031796d38274a57c021c1c681672c8c0f696deab2453fe4841d6d585f30c05c886ef79d4741c9c303239e00596ab240a27d3820f80d5f3ec7fc4316bd6eb783be61a03118a1a6138ca631d349f56f63e8bb44336cdfddb7e49e8ce648ff74e2aacec26d806012d783f09c769aff50e0e67692473778b3d77c2fe3deeee92a0727e18356669cc2d91da8f9affa0143cd8730949cea54fac517436cb5c0cd15e91b1d8494d7b9c4bdfa48376b36bffe61b24ac8e8199e280a9ad1fffa5825744e224f8b5c6c21edd40e36105a2bdb04235e0e926f8b6acece0552dc7bc77653a8db256b56ba74465424282f609551b688fbb76cf67b9ca95a21b125b8c6a76bbaaab661585c6fb4465c60bb1a8f2f949d499c68db0bc8ca7139409a31d1b2f67117655688a6b62697ce8a293a40bcd98b79d05dd72b6f4bc252e1ba2883b07fdcf44eb91f49f8ad752fd2d8cad6189808b6473d6676e3e2eaa68998ba1c78a0dde0b9baee179bd2af62424652aa3aa6141956a8df3cb28bb7f4d6c7a0756427c326afc04d733f2994f737e22adee6820cebaff0a7f97364d5823b805c0ee810a041cb7354c526c7a3372ec12d7bdf2cc53e909026e35b6031611efe0c16b0edcccc21bdf0dd5d5c5958695763d166465ff5a2bd58dbdfccc1b26cf63c93a31152882ca68b4ed0d3f9fa220ad98ac9b8f977cdf65692bef45f9bd596a20d9616b5ac535e558d382bb2601f162367966afdc2b52a8d7235d694af6a21595e4bdfd9b1d82253106b8fa1377363148e8c86d1a17d393330daefcb79dfc9e3a8a16215b6355ab2e3b557b4f99375c93df2be52ad7fb9a236908bde7a531c2752f56c07a66e17d3abe208585517affc710ab8a58b57f82215a93f310f73831f10ba230ff701e4528bf00609c34a231b4f5085c15879d13818fcc20ccda15848a14f33299337505e92588232030c56cd8962e77ff14af8aac1985c21e801cf906ec40d6053765e295e4fd796e252a51294dc3d02f714c9428d48a68ddbb181e1d498f60fdb244118007282ddba2ee4e8f3ed65e970ef1bad172072a84f33d58f2e419f6a9602e734304c3cb363c6718fd8628c5338e55ea27f925f0e3d52b32097b69acd010b32767a159966c9af2a335138608aaacf839269a68a322967b88635ac9b51e902818e6338dc6621396f9e3bcbd1ecb19786fda724d04cf3b762482cf4f0a5b6f7877121be0438c26e66fcc6e2d1c36053d6247a982c4505af8cc42249c55591bd79e8e0948ce1468ba82686b520ab2bdb7748470a830c88be6033bba10c58a1966c93a99a5caece0a9f9a745365bc1310acaf0c8ee7a5f42019a2572ccc122dd542aa6908c747280fafc5c6cdc53594fe7ba56fcd329e5b9b9c90c6f7fa6a70e202935e93b87c27e95c632f3b8f948ee4524e86d2b8cc95a35e9c6505650642435ab59fa2a96c6d81f383e8e0aa6bc11e664ba9727f400ef100f695ca075051656dfa1427e3b225d9baf257be4ddc851000002e7a9c1e4339b103d6b00144b72988d4fba14c0b7fc0a20f100a26bb430171b21ef54af39c2feccc9516311463395a584407ceca4e385583f76b289ccacb02f8492f870808cdc7117722eabd8cb5c11de2fe01e289be18e25f156c729f1e3d28fbf83b8643ba2c36d019980a05a48709e2d90df83d2214c1e1861ba0790634f0272a8535c011b59a782481ca695d954f37554b6f93ac6e727f24d8523a22dbca2d3e1fbc54f2f480148fdf07ab8de8d96c656c4698008b69f186ae18c9728c73a951fae688b0fa0cefa47e49a7ece3c616f6586d9b84e6f2c79686bf8bbcd1164604bfcf6a27a07ec67e3bdb1fd1c533c039e9b68eb960bed023db44931729df942af98a2a9371a7c22d12579b932cf04f70075c088e2196b302ab478d64d86c898fea2a3a3cc4668b971cb91bcc2d26f7256c1e98cdba654458dcd6d1dbd0a1ea70f1bde23a66ae1d5e955128c1cb52ebe048b620a62c714fe631d1fea022715c4709df422cecbc1ce55787ea45f2db52564c1d9af232e9ae8b53f4ede6ad03a19d556089fef2c5813fda9dc86d4a891130751cb4a36c3098e436b6d9a6b4914b8910ea9df69e2949b229e3999e97f80668dcc3fb4a31b81eb446199869b85e153a528842e8280ca8a06e78c48c34b1d3390e5294cbef822a1615dbe1c632132fe4c4f314ad7cca8de124fea2837c7c56eed6cc84887573d27f2cf059c1dd4f6303fa7fc780f5fb2adf61cd985e1829144da4bb9a1204ea75a27ce98f7306febdd77d373b5f3169fce88b7406f6fcf6c6d33a5bb44819b2184916ea51c64cb6d0b857b7f474135c0c71b1149ea9143a538065502ff79af07f2cfc43d75425b29f2b2ab1f8051721520130cb7efa70482355c4c339320dbf79d3e37f183a34bf394cbe573ca2baf576ec21b51b42ec541b7759ae2864a31d405e84117b42d47d3d603d6544fb5aaef58ddb61234069ce2fb84c5464cea407b42c7011a521f1d1532467783bce9b7943c67929cd1df3edcf6308789b0d3adeca7968c9b2380c5db3f60488252c3d0e4d2aed807c77045f0b6e2e763bce5b6f6ab35579cb81341eb9006b52bf55b37daff018fb744da4b7523e1c71ae72548c4e9ae8dd41557dd259ac485befa2218d0549591b2fdbc350e01de122efda9bd14df86f0847172c43f3d270ce89626a6719094f8e5bafdb9d98b0b8e338eb9860a55725b110b0fdda9716057897930adc7654c6d0153a7385ff596f3191d740d5c0f03e97a8441aeea7a4729f40187beb043f2001578e3fa8d6ac94396c17aea931a472a1e343c3648da8d35e4f374af66e8d736f88ce7070ecc758e2d293063255060af595992f2d18556f5bbb88a41a6fdb154960491235de1936b0a531c307ddbf1c667bc7b573d4fb90f193e4c4b8ef15dfab2a0aa82c3a69cd14c93258d1b43a669da9cfedec5539a34365db205a971adaf366283616051ba60adf5171d2a66979ce53fcfdb2f65599c47048fd00f8f89894a282c0853708f78fdfaec45f37bc538f7aa8f6bc2653b23c3e1d7e2febc4db07c6420f844fe5f6389a7e92f10836d71705f7d06cb10ca19a20b7459a30339c76c66c24e13580b61c5d1f1469dfa061e45d1ff36260bba9ddb5ee1d37e11634450235f72e6afb61bcc804e64f841ea629e695ba14dec5e7e12b530881a93de58e723fc81e62c201b9b818a4186657a9e1ef2bb73879eabf1913512b25705cc2713f95fa8f4d5cdc1a5d3c81401ed917e668c3f4687cf6a9443fa437867176922c5679be83122ca72414abba66b0d201cfab58d00beb19e4c50821f49f2b359e4d0ca206706eaf6daa8854b4a49423117de9d613b84292246f69ffaf883ef1f5214bba63b15ef8f4c0ec5f1279b8a61117ab90b78a33f02136fa6f43ecc0b3a9bc36bbe228485084953b99948891cb750805d6c779db7ed6abd01a12968b25222f0f9894eaa2cd4b2a27d1196e7401d97b72970ba09d83be84f4ce012b4eb9bf81362ee81fd65f3bbb3acadd361222ec87b568551b9b3ef799eb0e447aaf282352e1c8fd6c2542714a67b1c30b921786aa3385f42aad68f6845bf05bdcf5eb78260667641790f011d53265809251d032d25178a291d2945e18d6a933865a95172870342bd2c7c21d1c67490668f118af0e0bf2f3cf1f780ed0180a40756de1c8481ca09dbd7142ee296375c03e400d8fd91771ed1f0282b84fbc41628a17ebb2085086f33e31000a2b2becf08938325943565e290d9394cf805c4138590566b17ad10b625be6c99296ede9a7c6a06302bd31201aa31c6f8b3b4c29b481f048c4e0fb2d74dfd17753310fec12f92513d176b0028126ad15a86427cd17dd6a4bde402a128aba0718d99209ee57f2b08c865f6459d116c9bf2e0a9113fa1d595137ce49948847b8b164bbd795d21ab2a22a6831974e9bd91ee43e925612eec89f9490d3b4ef14b3e3d7270c7d2a5d3274f98d9f03458791604a1fdc976e91d85028888ce0cc561e32476d81ae985951baaf6d584248a5ba19152649967d4e19d4576a56e74769ec2ad7550f56ed96487d001ec356570626c28aca0a0eb45f5662cb80aca4ca2cabdcead2c5a2cc191dc80748a6b2753c6817e45f3f34e5f45f633f04e139f55970ed00a2061b64309cf811aae6f0930470ea78471e99d5484caa5a99bf6326a9af30228ed2046ef0c19a1f9f3ef3a0500d305249c484b343f5cd42dcc784f15ae88229596b73e3a0039e7286c01c2b59d4bd4374ae6173ea7417eb6dad64ec3f6c43b1d4381b1e508f8da2ae0fe2fcd8d0da8a3345251bc118601b441a3abdd0a835ae5d5d8901e42206599bbec1606b20fc38e30f539b1e0348dcb121cf26748d0b663f5a9746c86db7c1a33037b667ce442df724fab84746e2b889268b5b0f669bbd39b761178225368cf32ca9cc2984ae01c1e63bc69139ad8d52d9b642302098ff3640214a06b55f47b764e41358837535b04d3d8fdf69dde6e9a10fce717b6b5a8e19ae9c593c5f3235bf7b4dc850d5563b1aba9aa03d5860906d2556b0ce606d11d109bf96dac91dc4992cfa7950ffae2fbd995b525457a90c682cdaddc75923a45df1b53e16eaca04fe899448187018763334bac8546c6dce7d7d8c390b992b4acccfeb6f47de82ddb27a0e4ccf4997af448009defdd4ab1a3eefd2ca193a21ec26d4e85dc86ec42ed09d795ccf5471d3524c2c1c6e46d804f43bf1e90cd06fe38fe431b40092f3f1d7c97db82816fd755ca6d8a22d51e65a3bfe565dbc62b638382132a2fafe8359760971e74d571824fc616a332f45daa45ba1c90254b01aa65ea9c40c1156b00a737b398f105f12b893592ff9721262dca4612bfeb3d99da9be08641fd56ce1079ae3311a7aee99ecde28e433d27208d2a9020ce84724547d8784c6106bb7c445e373c5264bdd5ae528cbeef463074c705d856ab63183cec8aaa65442ff6007846267de438a6863c8e02ce158d3b635e2028649df5e789ef6a3976098447aa9b80b8cc9a2af4eefc3727ead4636cdf078efe3e02f26e9fcce5b0589f5376a923f9eacd0497585b2116a58c2d82c4dc86ed5cfc56b04f2c461133b00e16d75fe17e7d777310fea8fd13cfa64868102dcfa258407928ef29a948439d93487f9ca12a5d8c7be14e488b65aa6e0b235a83de25e9c71afd6444324c8cadded4c30856c8a59933ba6d66afd6a4ee65272a8c696633743357e9c551028a1e77daaef8d14034d27413e8b118e71318571311748509ef91be209e9e9c3fa9d9d9989a9009305136d21c240750fbaeef9d4af1f34fa4fc1c7da699b8e32e7a9e454e6c5b8c43d77ad6cc9a90107d1d279797bb94b2a23447f2ad132301c1f8e8a597cfe02fa8fee8954208a79950e9ad4c64b6e4f22b318bdc17ea725461490bc54575d9a413a48f631cb769e71793eec00074a01002805684bd1b654dd8a66421d5273334ad189600cbcb7b0f7b89eaef3e84b42f6de7bcb2da59452cae20827088008e3e753f4a92a56591747ebe1e8ed6ac3993e0c876008020308b82a636cd539ee74de2dae2c763c5a75d9bbabecdd7885dde2713ec5188f5796566d35a4d910383550fb2bebd72726c13beeebda76e356400d1b2de0f801530411233a50a86c4c362b885103422119448042a5c9699fb025c36bc949bd3017c682b574219a214a1e3f798c343ab366043d6e3cb96323cc9026328ce041a18808602a0452236587abd09a3e5bb9412e94e006490f2d3790c095e60252808ccdd13226460e0a46879a1b5d94384901c818fa6581322928993146d122332ebc4c9f19a05e84b49fae0e193164ba682a5ee7da0b1728332e5c645b6010510081860d7d04e90893002141c820a98148a010d0bcc042f7c2165297e48513f20b4beed1cf1c9914beb46919d6569c5f10e1851962a10da7d6f5c17ec1d2591a6404f133888794302f50754b9a80e57cd8d023e54ca3fda50789aeaf3d4c4ee0a3648caac301a5d013144e98a324063ab340475938baf4f85a238357192b54dd1d286f740c61b248079899dc15592e8c87ae0c084892401193c264003a68f82336039943736899dc8d2fe743c4d4ee4a240b3b0a43d70c609798f6eaca52eb529304fecc9121010950ad55eb99d175060792115688435581203a1482a24235d021e335cfd8603444cf8f301e4010e1408428042f253288517da8b37586911d307c0a8d995e5174c890e68716a1446d66b6cb4edb35da79adb5fe59f202d89f35797670a1aa2004f1d2e3080d33985ca1aa62bed65c5795af99aad62ee34b49b20007a8b85a6b8a1b1921d40b99215f5d93e1f1a5ed0bbfb98cb60e741b91a12196c7da8a73fec3288421606e762c122300922b86b6be9cf098818699f379d99301adb6b79736dd1637a11a1b636034b6e8c401c4419b1e37a060e70c0d1628982d78645b08891bca56a339690da676cdbde604d24b3f735e5f76606f6933d176adebba3bb6c99f39af245e3e36a6b1c39f39af1a5f6e9c630c0d8f628f71bae27900fbd2f685f548e9b4f02da4318d41f2a553978fae309c65ef5e1d6e5ab58d21a1db34271b6d8735bf8534a63136be74ea0aa10b0d4b96d6464bcd85415fc989f9a26b35b789d1d2d6569cbb6cf7b4a04587991ae8f8a1ea0ce9c142430c6fbe427821101852d7755df47ca7a66a5bc59c10c327244c1fef674e0c083738e1d3486c0a223933a8ba2a335428f48549203145e8972e549a362d91127f7a6a2b0ee74ed7275b6b48c1c479b555bfeea5047fbd547a2fc5bf8e270acf6fe869f0687fe49c4fa587a7138547d2f9442beee9edd29c51f466c132e4cb5f9f4f9fabfd13a4dae66b7257db18569b54b5e55bb5913567eb395b1cc3765ca5c30aff7e5e6aadb35fe96c2f9e73b5a7f3d20afcf4b376dd61d245f896cc9aaaee073f7dfaf8efc5f76d58af976d67b5b564e9654b9621f6bcafd6cb1a2ef5754a961dbe358c9f4e1cfe496795d99aab745f6e0c05e3d8ddcfdc9818b08c315e7a0c971ffbd49966597a9922f7558957222e75fcc400a3f5254c10394d9488f085aa7aed56dd6b7ad990d3d295cb52066fe9aeb3d88a17464d183027dc145d38ca2ef7d73696b2cbbd69df35ffd82173a5ca1a16866c5195fed5cb57252d843164c70a131e8aa82a133c7a68847d79610515a8faf021810b8d176e9cc085aa56275a61a05d7ea6c8e0068e338be4c020440ad5f46951b80023d2444a9431377da87094ad2715f286cb025d2e18617935208f0715e75cdefa01dc70bd7505cc3ce04c3fd5a5e7537b9dcd28ebdec881858165411074712c378cd08f5c3696492e7310c935126827061cd4de734afd4edc7c3a65bdf1f3994fd14affe79ea7e9ecfb38a0799e63bde89e8601ac0eaaad0359af5f68d2c58cb28ea59d92b3fcb90c1c61cc1cf47004f38794c725a44cb160d947f270bc0a7d46a391579eeb0f4cf2c8171dd278951dc9afd8c25f83a92d6f1f06072fbafffc051dfb179ecf252bff249f9ff4911ce8f7480ebc76a1bf243dc298338a92581aa4e1143df285fd242f93aa92c8171d6071f0a2fb0ccc28eb2f5c60e0232d506df6732afa52767f24073f2fe91b9792e8a77daa522c56fe482407f64107e90883d24fb3987fb4c952932fba252bff99fbcf480eeceba72e1bcb198cec2089655f78aea2da9caa2d45b559d75a87a2d65a935396bef0e0b5f6a94aedeb252bedd43509556d76aa86d17a171608a3e4ad6340ccf31752da23996ed5666bd566fdc59c5150d566fd36a32c256b33ca3a2569a04f31b475479e6d69c596a75a7e8a9f372e7da4cef2201557e8f7467ae5a798b1fc146907433b96fd2a4dbee8fe0a019abccaaebba325ea14cb2fadd04fb99e5e79ec2ce673601f7b39fb4cbee896acfe92333c6757b780758b44770f7a6901824459d4b5820d6e6ad089c1029136747268b1e285852526d532c911d8a233a60e0c26d4281385a4080a42cad8f993c60516b6d00da08182c20b786ab07983003c5a845cf801644f9a2a353fd952e536a1332b899913dcdc6832e50b150dd868f3e38e1841857c502a5e7c78b818638c31c618638c438db1111b56dbced92369f5e9faf5d94190235c38de388142850a9730420cae1614dd10850ad3298f3192c72015c65ebb34c6c5ce25ac8d0b795ee89a1236c2953f5e536634d292c342a5780183c4024562e14e435b8cd81d8c5a7073430c4e0c60464a583242111662d872886e75a58064f1152d782cb6a2e896e28b5717f190e1a4919c3040129100c8ce0a7aba687469214e942c5b72962c35a3c152c2974e3baed8fa338785c8974e154e8e8beb3ea172b1dc90250ab31cc1c204cadf5c16ad6e11d7d63ffdcc71a1e11a1307cc57b63728859e9dbd02c80a22fa848b050388f046869a4272104de9021603c7086dbcfc7489e92b8cb87ebcf833c755a38269e5ae306200484db00228579f13573dfbcda4f57b7f4e1c8c6a43bb3380411fab7ead4fc50de6d8d8c400ab5eb7f65eb7f68805e953c717ef8ab378836b851dfb15267f62306fd5014e2790ba10f6d52b9457bf625f5dd316eebdbaaeefd1a4657883cf4ff1aec0d62ff65b6dd86b15adeeb495d8b3ef0d4480fffa15766b1de7acc879ec596f75bf73f066d1aad212d573c5de61f2fad9776240dffbeae0b4b47664b6fb967580770f01f4dc7befad5503611e995e3e124c4a6bb5f65e8c7336b461dcef48a96aabaeb5ec566dd44b94a886e2669fbc442594256bd44b443d375f7a583c2c3f3dae2f93b6a8b620fe665164af3e6551643269cb3e55af5f9bde924c7c665475ac67532f93b692b692b6541461f5b826064d3f695f266d256d7d5295a4ad24ae8981a5adf0fe9205d8da25cef1b4fc723c88f7b866147509b48f3887bedc7188bcf51dc7c75ba731bdd6a48d2c2a2d0f342de57189921accaf6407aa53a7ea00f53aedd3b64f02e8dad5ab3f591668f6a412c59eb4c9a2c5478cabeb1db8a4079abeabd64ac48ed549d48293335bd60052e10b172c68a228b181a70e9c301b104d8822273064f172c68b1e2f5cb874f05124868e961a8c31c618fbd918875a4c1b2f424114c950610a0754ac142152662bc90c73e0c0d1b301618ce128790c87cd11a0345a637cedb5d7de6b83776dd89b1e0dbc43ec658869d5967198ac1b7fbeabad82df48fb3e92566dd5d3b55a95cd23167ec79384113e16fe7bc91bc34d0f0a7ee6daf46983678b0ea44533ab41fcccb50953460aebad3ca5811e9ad5f29564b5ad87dadc6073e84bdbd719ba75735f4730e5a294566aa5d22a748b5aa9958b725d3d26cc2e24934a53d9a57e5c9b54b3e242a7340c1d0216c5a51f7abd1b53aad067e3fcfa12a45fa5a2288ae492ccaf44b72e13ddba98f5a06c1443ed6507b3deb3dd2d51e844930a77cd693a85bb16d2b67679532175ab38eb4eba542973e74d952154b66ac8a229328c515244119595f3d6da5bf85d6cc4bcb021f4d6ea9f1557ebccb1e1f31a2bcafa1165489f35320075c1b3012147b240d162a482581c1490bc3ab3103f736cb07cfe99634325091b25e2d307675e5a6be9c5597d1d3be1bbefd59dcdf692e257db8ca2e24fd52aa6833317f5c171c3569e1e684ca01ae2a5a5c3852c4fc6904055da7254862e23cc44fccc812dfa43e5743b67d2b1d2c050708d1c981818a0ae8b02f6c7ba069b016c86375d7874606770ce2178019221043429e82043756b802225ca9a1a345018e286cb9dab87020cd695afebae32a11b70ef7befbd32dade7cf6b87026090d81a28480062e3ff624118313a70d17122e172349db84098cec84b1b383843516e8e30710944535645044d934f2b8e0d8e1cf1c58952f6d5f5d085bf7de7bc57bef75136e281b98922f6d5f6f2aaed7fabdd78211097306ebf1d99cd6045a03e74ba7ae225e5f808942ca66337633d52ed6a04e16242c2ceab2a30ed59d31e6e404ae413558394275c1fede2d5c7fef855a6346abcbdaeeedc636dac450e3f5e5be61dbb0f78d2d85676c9b9a246a807c69bb4d401c3ed8a5f466ffb43e7369de7c9a18b430a59f7e6fce0ee6300cc33074a50fc3345da2e851eae298f59f4dc3751da44940f0669fa204d210f9d0a7eabe3f1d632f4d8c444a4a8f5d29ac266ac08d8e6ada27edd33e2d853e735f6f3efc3e07c7aff3bc4217454f14c1704974d1411174907a9e278a9efeb4f86507c78eeca0da725f5d1fe63461e0fdd29a3d88d308a23d98433c5e2caee83c932066b329d5d1877d6a661c7dfdc2971eeacab49fb934826edf03a6c6c6c61a517990e565ecc36cf6cc655fce43d88efae928fb6ff633f7a555ee0e7034faf203b330c46cf613edb29fb9346122181bfb5204636320523865b2a3a3c77ea46686288a21ed95d224f9994bd3f520188a55dac1300c4367313f2443a7a1530fa97f2e7ad6db0e6679bd51e653c436ebb10c14ab403a2e51577ada8be31225e98cca3e735f613f7369623c08d2688f9d9646d0a7edd3f77979273c6f367becb32f2dedf9376a2d5681985cd2603e7616f331b924fa1576d98bb2c72e137de6d2847dd68fe2386f38829ef576c4b20f7a1d547924d6cdb893cd1995bd625d3c7369b81ecb031a83a985ac2fa9d71ab706f61a4fa8dfb0599ffec1576f12133f981860f77e7e3f73a513003508f05614936a7e69cd0fe0ae286a3c29ab53af71e376fd8653d1a063544f2e5966cd058073da11ab03598ff5a2cbfa29568dfdc51863dd811dd8811d6835e8762cb14ff2aafaa4d9ea55ed695b2d7833d979d9d9b1bcdeddeb1f88410c5eb717bb37969deb6bfd857d4c5e59af1fcd3d9cb00b4ed885e9d94b8ceb9c89c35ece8aef1c35a56220bcffcc99f98a81d1df7ee66228f339335d793e7c25eff8bc46a3f5277ee6ce1cfadc19306ffb993b73e47367c01e7cea946bce11c9c1f0f330a45c1dba997764f991d465620beaa2c84246fd9bff7947e9e7d443b18a8262d537cab477d67e7fe42058d2cf6bfdec1179257aa7a9159a41f5cf1eb93d22cb4ab9fe736bad57252fab73f0523b874f49f4cead977a834ff4a96a45ffc825edd6b35b754e3bb7b4d6a7d9ba2c145928390595c692be75da79c9c195ba9243b5962cad55fa44169d5f55d2bdaea36e351f11bfceaf41f0943aadb67ad0c1f79160becc2e5ad9d74eb768159a41e75bbecce40bfb576c51c9b2beccbb92727db69ebf2f3b567d5a675e6a9f892496fd90bca22efbfc565c927f5e5612cb7e775f1ca95397d12ab444e79dc842e69fe7913a6d0cfd8e1d3c699cf9d1b8bd1bb34f5919cd48745cd23e3fc94bd1695e1e390d29a9141dc9a78800cf915c74247249fb9167978df3a9159a41e7b994b97844b200dba58cc4b22ff3eca1ef7156dbf6d978ab6d93e5ccb377989158f63bbf9291a257b145f894762e7a688566303f742a568594ebf3f0eb71e6d72508de73d086d40acd207fdfe7a097da452fa98bd93fb068b34312cbfe959794c4b24f3d3b254bfae32d358965df236d959522f0de235f8f945aa125f25145aa81b7ec524a0c33e8dd7703c38cb36cadc392365e891e7a992fb145e8da2a74ed6907c351743d5a852e926578d585e37cdd854ec5cec3f10a5fb17371ec3c0c28ca0f3f91ea44b12dddb65692026f9d2469bd36572d2b1dd0755dc5b24cb36c06d23531981860a75e69069f53a74c4f437cf53209c5b6473303275aa2520ff7c4203bb5536bfb9d26a78e3d7d46619fd8fa9c51d8b126594c3c6f7dd6f7463a6d22b0c23fbd8a36b4628ba50731078aa202fa546d4e340315b444f55aaaf8d2e96789e9de68a7ad9be0b44dcfe36c464daf80cea4f934bdba0a9ac19e25a657a49f5e0ae0abcf5981bf56e35f07339dd4caf0bce0ad986a59e9809b73a65866c939a3ae25bbf21a9086f12d5ab6e42cbb0c9f16e643870ec52044430d9d53642c86cc183a63885118689b4a107f080595de36c450fe8a7d9d45c0e93f7f9262c86428eceba0af3733336768aaf87a7fce2f1cdecf9c211134899f3943480c11e9a6ad389af50d0c67e6b13b9b53b5d930f6b8d1de8368ec591866b443301c3bf48ab16955f28d14bebcfd8c8df43357c8c7d48572d8a7f93933d5ae8e3df5889f394284b8beac755d354fffe9fb14ef8d9f6970dc10831e4942356bb48ab317cff7d19a41a549f7d22ace524aab384a5afa3da5df04af8b9c6497e1d75aeaefc88e2cadfdde6ee0fd9575417b9b9fd028f55d6db4a701e033a5f95dd0de3a8dc73ebf94f1d8bd1d523a2d4227102a920905c1b6de421a93d820b1301f3b40c7f91d4d40861cb7e4759acb50ea9662876bb63ff5cebab558d8d2187676197ec6e5117249729f9d966f96fed8e5ed6651d0f9643dbba7ad8bde97e1d197a187c7210edbe5edc4cc0e818aab8e4b589243c68ce17398cf01f8fcf5a5d4670727ee1c877553beea36dbbc60cf9cd8d76bbfd5a6bd8a2bf0534afae75593ded75307c526203e9dcfcfbdf1c5074ffd455547961e7ce79e83f83fffeae4f38d93a408a09d87aecb2c225f8ae49d7c5e933a04c1f2733d7af783d72bc812bb47eaf1caab021df41eecc6ab8af3bcbcafab4d8fe5085a64afdf8d57d4e97fe47dad479c41d8e5ecededd60c12a30d0adbb430cd974e5d4004ddf1e1dd29a2735e31ec103a02a44b9789a64999275b6137b4c14203d93134bb334336b5ab11407f724029a4021845b511c448d0baa109231a80ecd409edfcd1de20ad2f6df90e8f4144f2201a4a7810ed0a92e324424dd01a4f10994f04415ebe5acd6de4cf9c20137c7c799b11f6c37e5dd7755d164403504e07b69ed7755dd7796e3e3e4b960c1262c4c89e197d3ccc81a263091d4056d6d03f75cc88756490a08bec1b8120214bd8dc00a649d79119aa8c25da71821b19d44f1d275f9d2adf070e2dd953c7889041634e606ee800fa32a14b8e3e754ae8eaa0e0794562e83a35bcd0f31071a1c14b2b0e1f2e42549d0c323eac34e961438615281f3a86309d44a1ad81767c69fb42d3754e470c909c0f93d00c7000d6b8b018ab2260de89490ee867b2cca2967467faec635fb724ade22ed3cc43b665a24d1cbeb4561b9e73ce597fece8bcaf2ff13317a849a0425fdaf2ccac8304708a00b54cb576d48466f2be748f9d299f9d2d7b032a02a806169479641b8dfe2cfaa3e849ee8fa1dc1f43866e18946bfcf9c3854a9e2c63df287f96641e637f5208c148cf19313b241c79e9c4a4c8bc748c1afd2824458f9113de7c51fc48b1818da1ae20548f1d1ada0e8f50d127e689d96dc21e168c13f2a113360750de7147d6a16913f6b062760f3bb53bb13029b2302f5d180a6192b0205e9809d74f163f4a3e2a601eaf464076ed77a4ae490f53ed9a84411f8b92258c0dae2849e9dfa50dee07d5a7783fdb4a5a225947de9147051e5d60768e1c4a52eee8e202988c325a8766c83fb28e5d86bb16d296c460466b2b080c637e52c8f376498d3e6baa50f9e21185ca7afd7ee6fc10f9fc10f9a6e41e6db06aadb9879f1c5fc1cf5c9f370fce2cf5293b55ef683b727a8055691940390439df87eba17ee6fa8090ebe3f55e8e0fa3efe01fd27b700f3e6b9ee4b7e2689e74b5fdf3ed3207f7a8e4b291fa67e63fa76dc9f1d13293db0346c967e4ccb3d8e2f3bd5d3696f71d749104c9596d339781ae3496a24f0ffd688f60e8dbc1ed3225ff7c8fa507bf7db674e41f592eb5101dfc7c46964b47a4953873909cefc1cf5c041d8b1ad00f95481660fb2367a183e4154d1c6763b949acfa1e5c46fbbc8a5634f2569b07b2c4e4acb624bfd5963443c08c03927340e23073998332240e1c1cd4e137727019e89a837f32240e8e5d73f06fe61be4f0f92ceb39901d1c8b56f53bf83776204bfadf6cf6cd66d867aebfd9f785b09736a03f73fa33979157a02773ea32993773cf3d0f9c8da26f314b262343af62d58bfa33ea1e9f23ef392892657dd1692e1b4bfd32df63d9c16f0e3e2beebecc8f5c699cd576449658f5cb0ed8b1b1b14649db8f421a9223b938ce4f1aafb0ea23911cd09f79193a9e59cddc234bd0673eb2a0628bd98c2ce9cf5c74d978ad647e444ed9ed9dcfc6faa2cf461979ab2d7491bc023d9fbebf9b315e6075a0a2931cc4298f9081d83c3e281e22f4c9940015388278fcc923084d9e81c69635466a30c1109ec7756a781cc3f3bc3a21643cc3d70c6fe69d9973ce39e379639fa6d637d73853eacf1541720a210232852ab389214409085a90f0b863a7c997f598d1034673ce9ad23c6fecd3d4614bc2efcb8376a7b3e715639c45d8784f126f4f130f47a913247f1fc6788630a4fcc38e75fa17c521b206ca1f199cdc8278ad1003a218e880b173640e9d2f9dbeecbcd766313da54147c3e004f94e53751d0644db61cd6797065373d07ce98465ce145b9b7ee6e600997383d09c19d78f1c1b3a3f6558e816d298e480c9e9c24b561f7618b7c71ee63f3b5b2fa79bbf0ee3f697b4375f9c86562857883c31080b720ae4d427458a3e4e85e0d490c107a13b5abe9c5d78e460d185e2109163444e8d5992af97d2ea248289785e1383ebd53f2213038be6cb2be5cb2f8914ad87711fc6fd1213f99290b2af1955bdca842fc9fb9851b6fa9851b5ab004236f572cf929c0127ed82e842dd75e4a4248de64e3c8001b21efb24b527bba4cef1332b3f7daa524aab280329ad5fc90ec8b26cc92aff0d5fbd7e29566951ac02655426934d2c2bb3e897a25815d2b6052107083efede9bfd6be5c0972e1e7ba55a9489557366373ba4d5bac1f6a45fd74f2773ece953166b5a71ecf2ded8e57d3aab8dbad9355a6eb3339b5dc910fc963cdde525d96c26aea87b8b2cba4ecf717e5649494949a9528d2456ddb09624565d9ac8227f5db2f2bebafe00106d89cd9dec0a6557f232d9e555521259d83870e850ab79f0f0e1c3d2121393041d6a73fc503f7ca073d7f691878d34c7725b26a6ca44355292927f0835131313bd4b62550d0c9bca0f9824b85581b03535b98fa3a6ed3085d4cdc9c956ea41418db68e749cf9cea81184c8a27e685a72a6113735b98fe38c242770729a53879822baac2f93cfb15401229c2339c7099cac53757272a24ed393952318c909aa2a538d460105219ca9264284cdf6446fb43d82c4f482828a5a615712109f3c5e60ba94d024f4088dc1a883370d4821750b67d4044df6cd84896bc2840913b652250daa2391db29441629c2c674d312138855359cb4caca11bc8daf6e4bed245a5d0a28a06082104e22421d22d4226efa270912d7569a6565960811220bfa534a84b8010d619be3d31c37894a8292c099cd9e6406db60bb92234690200155a12814d4ccb232eb478855e1087185fd3b2321565127010515554105254adc6e29a4e6a45900154655404b5410562056ed1ac8810996ec4a5620aeb0afabadc44dac32215685a58bf0a9d7afb5bef8e0ebd7bfe30bfa150062d5042aec4a5a207562864381a243413f5999f550b42a13228b1a7a5eb3cbd0563aadf057bf5fd2af22784a9a0841810927131390a39b30d164c2040813264c48c064c2c4d20713262a9532c0964ace692d0c16f6352d419d05755d29d57a41ffce2a48c51676c2f0556cd13dbdb404f5ee0e931c4fa853b11832c416245ed0e7e045534d4697188fc5161f9e92d4f1d38c31b639638c6fc5b9c3189390797f6714f56ea6575807672bac8360fdaaac84f1d3f14feb61a5dd9d19875a365d8b53acf2a8153f91055d312f49bdda5a7ef05708addaf467597aa3d8e898cd8413834b7f5e16b2a59f5f085541faf9454e1229277aecc3224517e41a05600c235c0c369078615113a04427ce5c2a267543e349d2ba30289540c6737835291a93f4438c92982f4d615d383c7700022021838a0bd45ca05427858a1a2eee823b1644251d0aa1a28fed84a209489c200269061fa14737d5b28020e143821380989a64dc2510863e8c60e30149494d6947d2071334540725281c546cb94a3e8486b3813482cafd5410d9d435921a7d5324b99646a7a6d0418f8e8c7ef67c6a0100aae3af5e0fb0a43fbf1452f258f5a5b476a92bfd5b6d13b4211d2ff802033f16fe716945fd3ba3a6e3cf0fe6908e24c0ecf2d2717c5087743c816697978e523a76a93febf4f153f29b9fb8a2fe04c1908e4a4776a9e9e83a76a9e99834c2a8f4e02ca463939d5dea7de229e922fcac078f42a4908e24e0ecf2d251296c97978e2a10edf2d2f1823cbbd41d423a26d5500be9a8c28f87908e276cd8a5a623091476a9e988b46797978e23f8ec52d3b1a66597978e2446d8e5a5e38940bbd4746c9ab1cbfb740441c32e351d47bcd9a5a623d2925d6a3a2af1d8a5a6e30724bbd421e8a8b4b5cb4b47155e7679e9e824ec523f1d713876a9e938c2855d5e6a15e629a91feac1a8908e4860bbd4744c91c22eeff5ef4b7c89eb74b45fe292da3e81b7908e2976ec52d3f1889ab895a8204a44080050e0340139ba054d20e6948069e983875a8713b225ab136f1d8fe1ff8066d9da35cad9a75349b7de3a382dad96c59aed3ec69f4fd6c988a549346518a73835a3ac0c33d5663dcbc95baa6d96546b0daacd4e8d05a836eb4c6d7639bba6d3f4ec7276e530bb9c5d5305d0a0e226c5570b98549fe720f8fca801342f6952011f39edd33760765179a4d7f098c1ec4b96b79f5b5e0b2c584b1575f13293fb6326e7dc69effb3cdd651b2d10c93977daf374976de49c3bed7d6018829fa7bb8ca847ceb9eb32989c73a77597e9d87143699a398772ce9df63e300cc1cfd35d0e4b9373eeba5c28e7dc69ef03c310fc3cdd653d39e74e7b1f1886e0e7e92e23ca39775d4692a709578f3e6385c072ce5d9751c8c144cb132d39e74e7b1f1886e0e7e92e07c93977dafb40f0f374976b4821210d929ce3e49c3badbb7c83529a73eeb4e7e92e1bc1b75291b92b6c6a435d71b4ca4fbf4cd5566bd5f62151cd5e2a2abcda2ee072f194300064709662716572b745a2abd351260a9f4fd59bfc680fca8932def7a4f4cf9df63cdd652c35e303b598bcda929c80610b72debc512a128a4e7ebad67bd76aee7e4394b160b3dd6e2952342592cd9a807d7d258930db4cb4de5b29cc3e5a41ebbd6bb5a63947484b421aee0e5292929f944ca2a9600b6f34126d684a29fc743bd2f69712071400ad009fe65092c3a14392ca8706f9d2bdda54d0d0a146a9870f2698f80be87c583ab2c46444ebbd930c314950828a3d128028027e9eb6d96eb714294e2402d1448484094d4e8213129e6ec9480af9aa5d21270802f525454284099c809cf0e344c108b40488461484f801f6f505825008113e18254a3464c41a11361170d67a6f5a022905db538f4362622ba858b529e1780a3b257b0409104840f130a3a40515b5c3c90bea4b6ac59725aa021d60a69c09a66b95fa0a057e9ebbcd76bba548f10ea4821239dea8902a5d0acae94b7fed7d9fa7dd6db6db0d47a3c40d072d05d38829371361e9ef2a866ceaa59b00808d3c330ce90b0016d4b085375a0a26289f51276ceaa00552a1a6314526d33ec901a54eccf8e95d38775aef5daba5a87122f48272144cdb1d9354cc8989a6b5eef6ceb59a452146c58e4ad8d44b10175a3961010e00266e52257015e0a2705024463cd970389c085c080a9c7013e070e488f32610123089381cee436d0987f380c37508c1cf93695c87cb381caec690e1c4f9f77659b652d13031c8f6a9c6959273c7a618574b6795d119f5209d78eeb4619f3904d83f3c25ef0c9b28a8140cd88b7216640c1a12010000006316000020100e88c4224192a499a4fc14000c76a43e663c97c7a47120486110054110043210030c20c4106308424a31853c285b1e6c08a33fbca11e5a31abd3113bce4cb733defb6cd972661db80ad491ac681254447201211502f26c1aaa8430c67263f9d39454f0b628cd0e20c50e83d64acfa348d2eb8cc1af27fd7ee6ea610b25ba78e0f8e8a50528ab0c95a28b96346183b28b17510586f6b393969bf1246b7d80a231f6b3d340404e033c4e39cb8c54e37083e20f56ac862d394708321bf0a9498212fe8d492b8e7c2d8e8dedc5d56308b5fe6d49cd6581787912d00899608db499a96469ed0fbab5d582943c1ec046c85f1bd424373034cfd01348cb860676e25098fdb692f77732b0281a5a099895e6c539f08669563ed47084b96a7b2077668e8cc44ac5597fec33301cbc7fafa5e6f4ca551d0b8fbd566d597d2465fa6309a8880bc834186e04c32184c61ea9937b934d3d9127fdac41901fbd88d31a71fcdc7734c81bc6713293a0a87b5ea4c7248b0542e26e74320966141f0002c023a6eeccc8a020fa11c0a828c08d932254e086c2b679de8a348c12a5f161f9e7c30933628225225c96a8a7755f599be8219336d793067bfb93424d1f934a7298446951fac7509143f864e69858752b4d0e16fc2d3c3fb64415842d8a68284a4751158438328a8b5de7b6761a222549dbf5ec9bead73c39145ec1ce8f69d190c1f9581baa0bc1b67de21e2b94fb84016d89931b42a7d486166fb11242e5d42c7c6d5d5e41b36fecf99a465e79092a59cae26af5147d0d09420355f4c9d7c71d1ad77b3a95704c58252315804af846420ec405eda1925091916d76100a330977dab6c3ba3f0566fadf7af03d241b6da6c5beb6bacdff2b755541ce4c9b73ab38cd8bcca9901d6f1b46ea9217b05fec823622e5106febfa51dde315912664fadb22c8e4aa597f9d24dbb95fe2192f21bfd5b463ab54ab7178f82a3a501402d296fff7fa8d4307b671bc27d9634811cc4e95fe7e497454de268f86cc4d03a84ea64e7a0d068227f215d1d00e5f30c4686bbc4b4d2aac17e367356daca57f9d51fb60ddc8214c932db8c002bcd521577c67ae2629575c30bb78deffb344e23e94fcbafb769d77ba325afe8e9dfb36f1a6234352b764910ea243ad504c0e402a6b82f3dee07ae77d44735974462b48727e34c7f8b21e0a01049eaf109eb0535c78cf8621dea1fff52eaf106f2dc7f6ce4a1626381d7a822e2bc4581ca45736fb301bfc3aa055e012593cb722ec48e1f1e1687bd254ca9f4664abbbc92b4b5db9906f6e5b659631036fccc06b05b70489be3b09c3710631d1aefa682aca27d3ea086d157b11835f77d4a84d754ee789064c3d77c0dd8ab7d699a7ad8c074452acbc279d60492202989e6f85ba9352b05cdd3589f0fac0641212864bd5b6e956305a963228ed7607e8fce8d233a30b98c3e0a601a1a04fa50d0f4c7b00bfca4c87d4d9a3fb67696b83f0f246be8fb4170148fddfdd8510efdb8de52680d576431b2568c57416d3a32412ad76562c800f48e9f37987909751aeb243b7e0838c6b789119883daee4d4bb1c48d37d62f913cbca9696337d63f401d574170131c3d8b64eed32769a051bb429197c4b6819fa128e9320b80a9da8ef9a2854a6a3f023d07f2b790bb2e4f2f1879bd934960effad47f151f1bab63646f18304c866dfaf4464f4a2482ea86d302f33c74a5f745f3fa95dae99d6b48fe6d49a3ea0c4fb446374380a0d5515409a60ed809e04ae5ba0e9747afe836466e6c74d9a1f25c2d1bad0386d0d513e82fbb62c1ec13c9d255c8f66f5ae714a59b4078a9328e020c161cfec10db74c2ada808ef1b7c761d1799553d042877016541dc02b1f3d0dbbebe8af2083ecf8154ccbdae566aba41b8e5096eddab0ce06e5db8195e1ec4099e0a9ec5c1ef479002fa691ad90893cb92faa54918791cc20022b16fe4d986647b685332a52740d83ee7ad9aaff158507d6d0fc73baec876b37c8f32eeebafc9fef755ea99e346e74db5d7a85212890074e7df5370f8a5e0f0c49214f7c3943d379e07798433e8119e34c2ba6c3985902aa9eac263f0bd015166165bfbea820570876876eee82f8f094b7227c2aa15713807979f0b30e459ea9df0405b310a6e413a1438b8fc20c2a187512321f30593202038bbcf0da1a412a61e0aeb8c0912b3a59e2a2ae1989e833ff3f96bc1f0be5c4f33a7474898d18c5e3d2ad9e397c3a9586981c277ecd17417ebf8511a7d0b75a894f5515a87d5bcef51d64cf50bf8a1966e580e9f56c348255a389d1db495c37ce2e26419851cad1438bce83949839e06e58c43f90a1b05f0def2a0e75176a350f37c62328551d381d21f15cb0ce0c0f2cafd3627986101576b5e40e5a8e6667db582a74dc45a60b0411e6e311e538759641caad73ee1a4ce1d78664cffb87ba9cdfc00145cdb548ba74024005b0ae69ead18261000c001214010600820c140f3b404628b4002a583484014207296415c2a40113672881e13224380606140b0388ce278d526a2569bbc445a9f2192ad64440cd18086c662129d22088e440c0394107c263bf05852952b72ce07157a379b0bcb79884f62bf8a8b0bfbccb9a7b0cacf3171ee8ce38fbdff85fc72ea67af59b59fdd1fb3c674e298cea3c6c25fd227fdd37bc90da5deaffef14e24b95bef87c5e9f694aa079897a1e47f594c7f03c60a5120c5c309179ca40e5bfb6de27dc7b3450a3ac27877fb9b14df72523cb32ae15422f3301488da87807205617c696ad6fa93b312009ff510b43ea8d6b923a132d432e8746c5f6347fd493b0e6cdda1bd291ef3e3f32090abc726237b4824d9a33ed61e05d0f7c0de881fd2d04f726c5edff3f44a9fc0579464be9a58e62bee7d0d0c42e997dde082b6a2502cb9957be35884f744eedd9bbfcc1c9065127a1952c159898eb74b514092de150b9b678eb8870d8fa6cc2f07a1ff8cc4112ead87e00c98074d320ffbbed3cd520178ce0d8e1d110d8417e8697bb1ed98a6cc882a7c0e2b5c1e6828ac75509d7a6ccfd0adb2ccbb1babd7eb8f3253181fb9c14a2be72821efad260fa54599713da3430e1211527a1c352b69b244c494897dcdb61ca02e2ac48f17e32832506e99dddda15cca38c99c2c9f70d9922e9ed23b6c8fc7fd0abac0626ccc62f5facf6bdc7561df4a194a9b993e99ebccd9f3c15a45b4b2046e198be4abde52f6e614eabb44b606bf4d5731446f94917ac124407462b4ae742d4b63d671eadfd7426d40f5dddda87a2abc80a1c26bf11da55947f25bb5c48e202bed2c940d4bc5ab8fba196eb719fceff7396220cbb9eb680eb5c327d9abd160d0433062ed1eefb2b897b801ede12488d0ccbad8802579c0401773c9c4c86470100468267a2c8019c1a459eb8440032c3107b7896114839e248f98607e4c8b1c1e55811520ec332f49cfac63018071ec9a2bed14e43de05241ccb8a131526c3ae15eebbd2bb09a69fbd4429a300afc7d2eae812e4a11189874b579aa0bcf938e648f18e848a8bc4346f10968267a3cc2de006313179da7717378d197f008139d04b13368c4cca1e3e96e5c1e7a243c62442f61f68547a031d3f3183bd83344bc65dc18d686654c37198597a433d3f708f6cddf03c36aa56da015d060c6a373d06e3e5eba123cc2a02741f63237a240c3a4c70204414782070ce8363b269791219a809e50aaa42b039b9b0f2c8b8104d9b1d5201d86104c6e44a5e41106ba962307f05d60cc83270cf65e2f80c5c808ec3e348306fa435479573df4efca84eba99dae7e0569880022ab5305488c9ef6d12b92a1e351dfa919fe50929a649c12bbf4649e91d043ac5b598975889ddce0be4cfae15e08f6e656c3d334decac71c5aa93e70b26ecf6925038391b749c165dcc2d491a89847d5ba037ee302f2d136036cc4339f78a90a4b5d34e47683736c2f4204481fad73dc7cdc5230d195bcc748eb41eb382c69017a30a71a06f10699b7ab2249f3937803793b6b61d3de3f67e613985521a62a15a9dac8517c128d52474d4032815002d16a7b8867c9080a0d27538c5dcd8bd259aaed35bdd297d03d1a6c597ff8d09b160ab83eb1c1c670e3842a43583aead9119d7b03f0281feedbc38eb35a786c0266747585f4e9a59ac9d2a010e998f087cb990a799303a8971ad7c90263298407bf57c42a74105645f7a98e25720888164d0eca6d14fe339ba9fcc0dc5bf657686075ec0ff5148b8f4cfdd537a8a1d26db870536eda9b93474f97385af6355a1da43525f216904ea3b11ea6d48720601e76613bbe03feb10d43fa3f3c1b2135bd7596b7e8244084428ff6fc5f490a1addd49f5e0234ea4c4f6c00bad3538f8e68a41fd0817f1b9de1ef8ef6348860077a8587ebf0e494bc38eb8feeefe1e55e9c4dcec6d0f2a05ab1b00f800d7fbd55086587bb177d6b4992862ebe5e05f7a1511febc97cf53e449a9498636d47ede9b38d35bc790a1d112860497a17ba1b940a6d43b09960f46d3cca7bf255114af1538f55f7419f8b8a47da06752619b29181e4faa19382edc1f6b562594d80b2960e8f0b946a2abd2d2e3fdba01363beed5b71cfdc5a4b8ebfd15551e3fd682126f87f26e8dbcebdbdc4e34e444de840c3b0c956e5379e98b787d0b72dca0c7112e5237d3fb33cd237c6484286151069020abc662d6c6d55fd10c4e300255477dd190b2cc024f1b1cd49cb260199ea7a746d06ce13a01ac10bbc4c59466a83d2d626339801a94a33b900902d1b151727f2c190d58514c9d7cf1db28247594020700662720aec17a3aa99ec4b03daba462a5946f21c9579cc53dbd17bbcb572b0cc156d6a6076de830f89f76ed276514fdfbbddd5d0ff6b06b3ab019ea1a974649594d67b48980d3ca5460575b22848ad8fad2680b42bb035b9f0e488298d71516e5f99834ba585461bf25e9bb8f6267fa78451d13235f7729804f364d8a1e680248ee167f9f54e60116134f6de981ea82e38039cc94edcf03acda3cea28222623d966e067063a0dc390690a08d447cb2f03fa66b3c2aa3d438b93684614e01c1d4ed8d775ee44802b1fa0e6134abfa5487f08dc517fff3179cbf640074307903016995d0daeb229b56b34d7f584cf8e8f316725047760748df322708f74fd09c05aeae49fa982b36ce7f62d3beb49ce4fce968438c722028791036e95cb9b0289cf4c7333f919265bc2c39b5f2ef86eb5813a63586be35443870e8fa136a15a6c5bf217193951dfbef4ff11a21e181de090f71cb9a44dfbb613e5bce48b130fefd469c56846a153d910463161d38b44c619ad14b9d74a233c681163547eb73d9603f9251eb0d2a6077bd045365e16d0c88c48365973a6ef8dbd5abea13cc51210f5801dace2a74395d3a533acdb22b9deee34bc4f82069ac256e4b5684538d8ef349ab58d50747a1063a75ad994ae87fe23cb2881d784a1dbfef80bfb9d90cf7720225d072b286cda796af033c1695142a94a916e71d0460aa7fe12bffcaf91f5d9ad8a51feaf2c70074f10e424a3cc7530a725dc6a7d17e05cd122023f7dca0b1e11768ea5c1c8264bc86366fd4fde3fb54b9118ea8ac4e770bbb4872b320ee52d2451c7fcc915fa69b926d03dc614d01365c5354688f5a9fcf1bb915cb527b96ce475916d7a5d66015e5c386bae181bf9765a574e0284762d1f6f74944ae2d4b8eff2806fcfff32456610d0fe54a1bd81388c86d8f3ffa7589814a76c87d9178a02819a392959d34df2777165cef9405e975bffa7b9ed18ae9ad10de6dd28358d22a6c71df270685ce679ceb685ba300135842d8ab157a813f37f8120943c6ec63888b0ce8b8b1aa8bfe8ae0d9bea64228aa82d2907eaafa827186933a9def9bbd4d3495b08608d5c9c69540e1e687b61a7e12dd630a57d91ee26e384446d10630f4c096e2568acd0f7d0ceb07b1d8432060c4bda30b486170d22e2679f811401a4e64199e88165c4426ea1210a1a7b49f67ad1c5da1b2835e0553bc27d53091961cb9669038626b3fec9dc65c15d380e7187f8bafb43153a426e30a48c5c9b2806d6ba9be1f02552c947b424548704a0b8f689a46f0768e4f7be4ed4f03b1ddf717168949b1e0d47a1aa75b6386e817c803c784e7a358ed980aca3a85010790916f9e5e4195adf6b40b5b6c0045f6a51a5a5d4148e4b3f1653f2d11cce64097ced8365c3c04dd1565fb90234bfd3e641c88ae6bf5fc885e7a7b6b69e5c3c2303ce91c7211d11793b2fbeb85a022f45974feef8fff14406e1bbf9af3ac1710ab6dfa5ef966b6f4f6fe3ea340803a675bbb341c8cf307d57c643fe87aa0a335d80005b02b4733f1f0ee4306ac94589c7c0764d78d8cc5260cc40c72bbe80c03071a3368be6d62f66f2738ed610fef6750671b4a88219e172f38175574067942526c1a061634e41b097a86ddbda844de0c735437f18ac47a1b6aaef224bb27ab58d8147d1c23dd11cfb5bf2e8cb7ad3d98f9586d9a06e7e18b567e929ce2ca5372ae00af13758b53a15ae39cbe8979a04e252859b6e3194b1427db47cd49ead74f672717bb7eef9711dc326f3378b225ee72bd59b98bd5adadc47c6e4e2a877cbc9ea2a0b535a2be5a181b14f36cdbf9397813c37363dbbaa5192b50ffa730f25a5496d8ab98236b1169be6eecfa90cb862ede268cbc3eaf6ee41c366065f64bb5142b118748a63800f59491a372bbc987f1080db63974dd074e35146e33b5d14de03a6b32cd8c4c0f30f616bb671a5a6a031d3875d450f7e7f48f2b485f36cb6296a87bfbfdba20683e3e15c2b333b4265ab706531f14ef772d50492983cb1583b273dd8ffa2fe77ab8a3e34abfc48837f09dee24a6b3b3e09915bb6c7cc727de85bca0d570edf61f8d3071487a57a971a2d2e36ce48136bc7d1f81065cdf2e1b9f68becc3880beeb4591dfccb717adc045a48cb59b1971176bf082774aa8f23d8954d07a843d7d39ca95cfe6651660c1c1d27131b9b4c285a8b19e2d6d230da4cb8e5f64b6b9d0cf610806f3a575a7b29a3e62eb7eb782b0728ccd7c4301c2bd96dcc7906e15a904c904a4f828d308291617a564c4bbbd00f144af67ae28a11287276e8a16cf624a34f8864cfcdd83e5ec51e1c5f7abe96b84e83c7dc821955c5c6bc8d68a06d754a263bdc094792f02494ae7828533012a55ad259b415661f5572e5c1aae6caf04d94e241269972044b4819af81c18cbc0d95e23e25102cf02c3039914fa2eb8dfd2d382d2083063ab513cf59098567aa781ddf27ca88b0bf4f5e140fa3f9b4994c02e8f26767ab1f4a5d88f0b5d098656719af4b61c2490bd8ac2c9c7186052dda55fb763da8b1392d0a2f9faf10b84cabd3487ef26069603c82b9d34288e0f7790e4540b8ed6af4a088a4a38537ec9b89e13c994ef5d9b351131b481e8a653b36e54c8015253b6ed22d74dfadab43ef377a39772f5f8640bbd0133380fa29055085a43d083f1a1b45a019b39b330e3b039102ac83f181ec91096c8f2e8352ab7f51b491e80ee6260c05cc7177d9adb4c49e83fb653d261b1db17e8c1fabbd739b81699e6dc33e1c989e85eeb871b94b80839ad7ac0f9bef3ff953e4dd89bcc9414ccedf104d3611520c274795e4360b2d5d1a224664c5c02f6e75f698163e588206c7b5cbef05afd07a897faddcec0a4af8064212aec62e869d6d55e2000febdab3b23e05abf60ee11430bc67392aa24b7073a5732da7fb06467cdc57696b77e38a0b1d585bb7725a6e35842b0b000d8607f4dab9995e8a02d926c137747aeb0dfa0b065f610be173d42b4060891e4a9b62b763ef1c63a9d35fb20fe184c21285268626e031b4ccb60930488a5488ffd24fbb9a30825c69c348926030e29a032d802158c5b9b2d6989ccfced5074aa9492d03c19ee6d7230035b90079b47dd09e8edaec0362e3c5238ae92b662721ad8f49b0dc25f5c377edc140ec72042b84d7fba2ae4cbbd68d5417e1b9905107951da568e435807a22a26fc9fc7e8ce64bf1456c535608444a5e083d9fc0c6062f0094035fb1e2bd01c5e08d8c362419403ecbe36ef2d2e7fdddfb73e825cb1b899c8438958cd10b0c9004f175f244460ee4e6d15afb89fe71a4693207711fa6d9cdf9010b023b7d721d0c5ec60c5326209e151b6572c9cddd51ef1d4b6c5209768738d525ca11b4e213c0fd9f4724421db5a6db8653193f197633cc5507444f6bc7bf2f43c701afb0d552223f24bcaaf4067c7f2f609746f30bee732e4fa0f4a7de1170ea23e0ddd9bdcd9216d7ee9a3a8d228f1295812453e21856af9e176f7294495bc843cfdbb02a0caddc57728aa8403fa6b7dbb1b894d4beb2802d9132c20964c4291e4b6789b1486bbe99e17291a793587e2e81eb4eebbed2c913fef9c83cb4e4d20609dbb11fc458a1b1e9dc8b633afb452c56490258bab40642830f96a37f5d68b019e4f7514646a7a2e0585323a584c28bea4cb3ab70c4412c1a0f50af2329c309c6461c85de04eaf043cb5b4964eca68d232e056e5eedaffe692de31d91afaa1994a3fb32bc0471ae16a12f81d094bd4449a4de5d5610111c385ca9cec9572470e316de1c12cc9f5406c1a9997899f61a9d2e0c6f1e1b286989cae61c6dbc94fc2ff560005fea6e8ef78e81d119296a9f60235ddbaf33dbfc0f1e13de95edda488b12bef9e37e10f53a36f9148644367b1361ade1beee294d0593d518ed09e2e3164f1e090259fa0c2c8f51c5c5b523ce2ae10973caae902000a82b19dd822653e9dc6d1c3bcd7fc241ffbc8d7a5719a24c4e1e2839a0a36447f3a3089c72cec2b0d4f89041a22609be9eda98bac0cc12c7c1a66b1954ba2a1aed09ff5c1b037fcaa843935c98f854fc5efb9f781b56c018248bdc902f4c1231c770243feac5d245b6b5801f6e3346d6d7245442effc05e09e6558c28b71c7d24adfef0a9a2fbf8d6182ff66f93d01b555d72aec43c8df366372b3cd0b3e16bd433416cd6df3042899c2412be0971576e2096a663e03f7fd8145ad1f04a00aee99c421a5a2f5175cbb236c456da63098d018dd34c5b42c51632afbecb372a0f4b6525d94c5f579517a55c200104b90956eae36f1cb4480a908783164e3c5ebc6d26d91efb1da33c1097a7e492e9b43042051d94125dddce1c04c4cd4d10c294e381ac6708356611ec76dac1e0c3f9013202021ade5ccecefb993f28de3bd673c77aeb53ed7647b6c038f11c3810959f9f2109df0d911462bc1944541e2225b6ef429e986a5818e80f00e32dac8f0c8d84114468ef34743bf94c8064ecc8b8e6628fc9eac976410520771d472343320be9a61a89425438dff0128f82a25c95de1109b2a9380ff0446d8d43c81e02976dd7d333bea50a4ae856d2024185df795ce02b3bd5f13a59c3457766502126bdbeb781900b409bab4c23ac57f6dbc834748956728e22ed5c5b178f80a157e0706c9b186516b4fa3695e06366767a9d4d44a32697ade30c8ad3572e818366a6c9d762626aa85de4c6f229e6b2616aa57c8a59111b557b1b56715fa22bdcb775c2f9f05641b9742b70f690da9b2aa3dcea84febb7271f6fed1579a49db61a1a3a2f309328fd6da18c96b36ce851609e853090b1618a7380afad4c9ce27a4bcfd0f7845cd1350ba1d17c2e7e51629ff40e9735093179ad3e552a6a6c9395a4a6638d582cb0102600a297ace9c9c4c56ca1d4c4b724e73c6961d9bd684947dee0f4a82f2728b3975215794fd9dcc799a6f2acc04daf6c50d1bad1d27519b614f1a4facb552ee503db9ab4ee69c6c5a28c819ba17e44bf3586ffc8bccc3d0cacfb1b8afa9df3951b075d94730ed3ba7169d33a07a22891bb22dae36611171a79643c98ace0cb46e7ddf9aa32b3a1b86d16995f7042d9bb2d2a602c0ecfffdbba273398ffd42f54f6e7f4492266ea3453d254e6215340905ad159db4463af9f46648d56867c679ea8b082384577472cf2136f6ea396d0cbca240d9b9a425193b1536c0bb93a4fbb7e8c4b6300289bd6be205bd0a3762cccc8552dec12d3aa759d56c3028ad3e89753c3afb36565bed86ae1e7b7abeb56505ac55e0a6b8d2854c21b22147bcabf60801753c1920e85c58418dc0e84492a714f427171fe921855f341e4da55646b96c6c40aaa2bf3168f62b3432ea7390fda4474fe541e7ba9f8bdb4ac9df0aaf0ca0a5a0910fcd12e439f3a293e1b55950ed24d1f519a520d1073e4a27a9b7199a112ce96c2f7ae36bac474bea28e45bc93ac312c38e41a7f9c823e83f0eeb17c76eb51b48c61e50b9475b943665709f4ec8b6fbd07c9e7ccd8ebd4c0ca95d804843376cc260cd1d6972292bc3e53e5f1963e90f9c352e30b1948f9db52e30c74a3f43bcb86249dbf3a5643bdedb1c09232024dfaed4540a2d2148a5601cdab30c23cac25407cd8f9a435ed16bd101c23b1c389f0860c15884c2421ea789f1d43ab791c4f469d04eca6bd17489b80874939bcf3ce514ffc3d8abec192fa94d3cfda0af5d7d1c161274636984cc07497cba8afb01343ffd594e29cb4971b594bb7594e378e74d9daa25f1f92f9f4c84df08e81f5c1738690492ded434f79c54980fd2f439d537576e87a9c3a2cdd0fe1c02514c4bf497d65f468904bbe34b7e0044240e3afa39e62990dfe054841756b13c02c896c00a169ea7aff6b0596ff3e75e754eef29ca9a00d00ce4095a0b9bf5e028e445db9a96f903f076bb6b1650b686dcb33ebd87301d5c4c349397b0fa1b3d2a8e33283e894531fe93bfc7017f9a8921cf608747bf882b287d1c95f916833309a5fb630fd72f1ac762bece1acb1293c762563c048ec789965912750bb0f0de7aa55c852d6f7933872016c80750264465f54a51dbd40e2863eb3e42ddaaa40468081c9e1f2378e5e396cc9a9931fa5ed2a9e70357d23b7401af662a88deeb9c48d2e09cdf46e2cb5bcfc1e525b5ee46544a64708a829f044a37a16ae13303ba2cea7708db668b4e7e930f74d324496e4aae87f9d610799024596fbef6338178b2a597de8ccae29f84b8bcb7c3979aca5264605118b93b8a36ecb50aa51f6690b65e4ae6c198aee1cc597270be99825a45c6b1fe528a2dc81b0edd9804c1dcd40f91512f9cceeb21ba3fcf6084ca64ebfdbb3d7a85d62783f34395722f15375cdf910e3165a5f15e58884abb3b6e8c8ebb76323986862b05360899d9a502d00dddc1c219ab0ace85feee44ee82208363ad8b487a4b7660bb30fc9addc072b38e832cba4d1ff57d453792bd3765a873f5cd1d0eeeec63c7f8bd5fe267bb8c115af1b26776f10b4f6416a6f17793983e1e5f3b1a66273fab867c520d8032a2e2fcff96f4667176474d6b77c5d474767611a1a80c3de52339dd9505329bdded1557e9dc9c05cb918972b4ffa92d2791cb449d81d80e7c437af60d83118f3f7f01e4a246e72d65b26c9ade0daebb1554a5395ea1ac8ad33e69c660acbd849518ccd3857038984bf3f9b9db893a53ac2ed1486958ddde91a56a433955e6b53d4327260dd0c2f841679a9e8ac5016e627b943dee8ff2e35d03ae63e145b1af9e54f9eb8a01aa09819ff6e197a703907c9968ea9da6f2ff613f89fbc83ab6843a507f1cb71d480b31c58e2a8c663458ca08c7ec7ebd548e15bc9f6f9a16568766325512eb6311d3835167951851aed9270466fb29428e9f56eb95fd7d7f5554d74c55d92de870eef9d06107059c1b0f8f0e43467f96e04b316f03a9f6b528f1f02faabb8f37cf8beac268ec3bd21693b9d5795e7f884f40f38b42251c11ead8455b1f7fc2015174349d4a48e4bf86efdb3b980835642d1beaaa132f7c90609c439b084cb5907092af44d9c8229cb6e777adcd511d9ab329374c802eb701957d42267200de5e4cc6727c011c1c02a025fe84fb56f683887a2cf5816da314e2af38aecb6a3139cc46f001a3a401bd04ad60e9aa2c34d51b77e5a11e36ea2bd54007beaaecbdbf6c83daa20df28168fbec65f8d0acf3069b81819ab0dea050197322f727dd7dcd6176e6f276d9bb2eb280dd33043546e1356f2de5dd5090af9b78755012a18b9adfdcadaf55fe4d03c9c0932795bea7d043a3b9b0f06221b4a156fbd71daf40cdd011636396236996a9a41c7136a699fb2a47ac725cc78951eb37355835a0c8a42664afe914318a32668d07c60f4e1d567f0f16edfb45605841ace948e2bd03b710c082d4330637002df437626390e7fb2f2de364d4c6ee89425d69383bf0f8a18951c7225871ee498c837e181dff26620294ca00efb1bab4d2ce026514810490bce410d15ee80cf278b23b15ac7bed180e2181ad0009780bebf01084ad8f4f27a5e2c0d2fb04a417c84039f35513f27686b072638a36ad13def91423662d4e09790b9b3a7cbaf08de96df8dbb04eb650f44c74d7e1a0951c6c666518a8f388a4effdac865fc41409a35674ce7d1536805dc4002fbceec2449b235ed2d945c2c3d83b55a5cc554cc700a540e6a6b10ac4427296d975e56de717da1739d781a5a565b2454a46f46e314332d19cd026f500e76a91805c3e9bdce37bd0f4e4225cfdb840970bd96303178545aced34378a33e7a45738f2d6abcee8134b44e00c9cf5cc83d61a40712f5ec0d52c14f94168b252bc20a3dadde015e9dec34403d253949c86e8c1c3b247d22f04f3c9b2237afdbe2a258d1a9e21cb66b1735a8ac20ee261f8fc24d280633b4b3161364cc188dffee2fab0839ebed35dcf38c567c4eef6f7cfdaea7133a0a0dfb533ed73cd0da55af2b91d59b899dd8d2762af7bbf158ec0aa35da0c62bc22a1fbab0807b44ce9dd3694746e2c92ff2f4b9fcf6d51dccfad3806983ddaed4064a07fa55e113082c0e4be1f3162cf4e04c27a1fcee4390032839180ebf85e836b5499df74ce2b05171ee1f244a7e11f32fb1507aaf8e48994c8cd04cecf5b0ac792e4aa336802a48de701468749d77588c8f50f3364074f61757493a88af0bcc2356db18928d4fa5293533e6703874fd7600cd6853512baa3ec4cf22f5c90c2f3e94d8385cb4045234af33e5d7571e514caf45ecb8583f87c7c86dfbc2bcbad76c4852fd5d10b2848c44cf447bb0a8c0482d812c8152cbdc175248f8b875b66c69201b8e171f0b79adb5763db6d19c10bcc2d6fcb5d40bf93d312aa5c226830e15084c249179b51d791a629043079d25717322f1ca247ad56415533a592ec5ea19249f3ff83bc4088b492727eb04ae5bc5d1d0d1a5969ed82ad709729152ecb713b5958ccc810d6bd844b0be436e6fc200e549567aa9dca81f01e183f88e0be16e3c58ca8988e7aea2c9653adc7d8762861a29404d269bbdae89838c49cba9fc2b4238519dcc1170296fb47fdc117d72dacc45873e617e51df75384249dc2e10bb7b6b9f20adf4e0e3f0fd49a342fa6a283914106e80b82855a2b01b1b18165ad2511c145cf27ddbc4a7750b06071ea5b74a8849e908e724e55fd404b20abbfcb815c6d41c26f81a11d3ce1c2f5d4a14e53c191c8a2b4a0d9b69016e8cd2f07908e4496820b2098c33eb500f25f16c0cbc6ba0fea30f2d31efd28ee63b3a22716465ee5ea70e22f3711a5c3099b999b7c80dd6a50fa6e02349fb825451e5472a800ca6f8007d3179789eaf6270b57ea1bcae7989d0d38c94261f97829cd21a899eade8679a0306929fb55d7fcef1372852e648e85ba9f8706b6ebe7ee83e1f5fd5e04af7921de2af9d9a1f3c8e7647af27dbc0f936f52a21815a18f72199100209202c7096e492ed6068214cb3f8a1b5d7d2cbe5d942c6727102f4928754c4611d737920c119259f82f27b6a74ba3d8022229a07386a051a8c365958939b50d47d72f1d792088947849c0a485cb2018f50c51c3cbd59ba4262780588f125f3bfcbcaefa1b4896b436a98f3486b537c78664ecc27f0822bb352c32d83c215cb37f34e791d0c6ff041f823f5941640cd4bc403e507d862cc6e44dba0eedf2477bbef0271abd4fc86d4a61bc40e6fdbac68747ba184ff796c9f886754fbc29bdbac41a748ad693992466561bbf62d8af2e7f14d6643cae2760f00ede0934f8f0978ed3fffd6aa4117acd590fb8e9209de23410185cbcbc43a6571a3aee9fd8239519c18271f00f410d8c8f2bc2ad00a240eb66fb841bd58aa67fb6c4106da1ca015376c02f2d253abe8bed8c21d8b194efdac68dc839ff5a9e6e2ab14322f4b90a8a8945a3e8b75105d6795f612a357ff047f206b24a6dcd43472f98e5e2aeb7009cb982a53f428631b1d2a89b3b5f7370fba641643e9925a7b1be280a9841f9476ddc1bee64b125f1379ad67d7994117296c4f3c379ce694c10a7c66471db327f52f025d298780571caca63fe19126f15be40610232368470c5bc6601ca4324a2c6b5a51ceebe835750e4db19139da4b934b9c9d95da74311f2cb1ca265613ddf3b27f77f708a957366a249db056f454817ad4ba6a458f774048be4f48a22360f7a6cb0b3f5d09fab6045230c7ecc1f9f7b05dd30802955c47036792b5036c132037973348b9961c70564c84c5e627bfa3b411c831b000d62f3d72d3fca1c25646934df8d51fc006a01c3f9ab7ee39379a02909b8d8b81960213d2af169f21787ca2b8dd3808e6c212531083ff7bc5d6e55ede354537e0da9126234408c9aa140f71efbee5633328f96fab4bfcf91cbe1e6d008dd49b61e80fa03e03cf3cc9bd1b535fa55148a943f338cac84b264446e0abe002ec59bcfbf5caae1b3dd3b023bd476f67b977da25e32c6aabb3bf69b663c9ae1cc5370a463d379cee97faf687906f26a6ddcaf6831b54812b443ea7bb05c30d66afbac8118fdecd94d061118d0ea93d64064a4a9a52c91494ae01616ab05b722a3744a70b8eb335e052917dd2318b934fe3b6f2af7d8f3267e5840ca431a43bd31d1d5a5525d0a63acf405686d84ae9fcae0469e5de479f89cd525f2a00d0babd5a11be51c5e719b6de5a54ac9c9fd0fb6f282fda1d085deca2be7b99aaa74d18da9f3dde1f8771c089d2f99ce79c44d218031d013ae8072e5db9d4a246d24e4031e92ce66a70066b8f40b502a4b92b07203eb6bf921a2814cdc50891029f688e30eab2052603a9dad54d3ec971632fd78fb71c87abfee4a8180795013c7eca282418451745515afe79f02ef6424f46140efdff21d55e6cee7a82735cf94efb381ad092f6bab4ed6cec9f58a67582f718ed83942cd3bd54071e1902b2d90839294af9c0a9b7d319eca3d688ea14217615bdddc1bb8497f46a5bb5cba6bc201d0e498ceba194d4c5b7e6e7dd11234b27e6ee43af28ad47e7746a13d9fe9f73b25a296e34f47168816e69fdd5faf8bae76ca2d552e59f45bf58f8b936a0373a05167f680c053e2e5083e47a774147c3beec38d6e831173c208e6a377892af3aa33cbb37b6e7e21369aec3db542e79e71f4d2db128b1263c9c750c7684d206a1b6952cde118dc0c4e93c64919306e27981ea0e8fa485f5b529225742ceefce270ff0ed3348aff113702553c76c08f1bc57bfe2247100ef00c7a825c616e668ed558ad2a734da65c1aab54d24abfb227b0f1213a2e2bd0cd2077a1c7bbd684c898d99336331e2928ec32f20b530ace077be5155889931a487055e9cad7c482cbb77cb137e5e5cb048d433a214c191ae9d1b784528d5ad9d9dfdc35508ce9851ce2b8d76d114808bf2994779d93d1c56b976b6b8e0ce707dd56df0403c9801cdfe956f6a807829f826693de80703fa4ec8fae4aec2bb0cb58d33c8c3d7af0659f0c0d1a322851a4a4426b89aafcaaeb8dacc6653d039ed6ead9278834e3c9b2192d6ea0960f1bcbbe5cedf432312d45f2a42bd0f4446dbc105ce010162aa1ea3f20b28bda1cb7156d033ffb4733823b02a7d2c7e47a0fd792cc9a368550aa6a22ef7a4ab8f2711446d3841b017af999cd8f8aa7d25235de4cf25e6ca3d6ec4ba0dadb210f4f212d1e80eed7e4c0b0ef51eb38af043f0d66065e9d8b141b692a5bad1dd98f25ba5e304199d0ba55fdad1db1fa2131d9b69f15af507db080eb96ea2f445b11bf07afeb97817175d39d2d65e73c89acdcb21cbc7a1740ecad8a4a20527ba150a9059109ac92e3bef978b45c62ee99b4850df1863b1b2c90f13255ca5430d476395429cb1c8f683b74f8c2a953d712d39dbcb26d2575451bcc7cc07ab4ece2bd679924d8232d993c556a024fb46fd00333f39881498c61d307b6d6bec243f89da0f4d035066ac856f387268c01eb9294705fdfe258e77f9d33137e08c17270d8374ae06b6ae188a875a2994f806826154574aaa0fcbb971caae92c5610672b7bb46f5d3a4a406ea9942c2ac6f26a1582479c9696ce980985637748b6e40f892e2ee2a3d40391c4420505667dc87b891c2df3e10a139bdb32d4014e2549c4be4dbfd44d859a9ec5b8e8052fec69826a5550a70342695ac0ad0eb87e33f42235245c2507248575a8f875a1f997ef4e83c5e7710d23b5cd325023375e2861a9b48e2736e80c2954d5ca9e3dd57b8ddbe5d2bcb9813d6e2f39aaa1674c23cd235948e7aec16a8aac05df9559c978b7f4eb48e877fc1650f424f682c282fb27c3362cdb4262a0dd7a046d6dbe8b228271bc606b579cd18e00da951ea5575bc0bdccebd204006eb0d0ffe4b06d30d498b274e38bb57a852aa4550a86f3c16da906834d27dd18e5dd383d32fd874e6317c64235f89acac13b4ef5010fa78e6110b1c8a7c40d1cb4f9704c5dd3d767e6bb8b5a8953303bd06233b0c4245d5e34f4d74dd21146ffce83bc0d2b1cedadfcb9c58cec38fcc4dae6244c1b92a5d6dcd98d12922c3a412f56ce919f34b9e991b754dfe520b41ec49b730462d728f3855d15f0d5a9496749dd5cce2ff1fe01ad3416a864913d8208c2a31456909286c51a8481a83067c8cdff586815697cb4c7bb254602475c1880a80e0b783f7d2a76e3091c683329636e0ca6d50e0020c01e66b3d68326b5216ad76c30b8ed460e659503688ef524027781add859b31119828657c18dcbed45576082c6f6d9b337b939e8c2ee06d9e51d4158dab12cdad96b1ec21cd5dd902104c81f69016244427679ac853e1fa205e521fd3ced30bf423811f359d89d90329dbc996bf7e125599148d9557ed148bf96939a503ee3c7dc328f6cff7a2c47b5a7f1120586186430a300ed8e3d2bcdddf18f45d6e84ce35242f97832a968740daca112a9cc5d78a5adaad499e8578f7f08564d7f945fa40a60a8fe501a65cc36eea7193a4e9d56b72fdc9cd9c013b2c4634c42f7e5f3e27ccfc2c4d7401cdf23388589b5f9119f2c5e5682177008eda924c4e4bc51d646c8c45c783aa2c14ced617b3f1c619e957ea3468a2813a95f0589b638665c0b13fd476d8e880a3a633da97a489d70702c03e8b731b5f06803c34a4e96ca350a1627b90cd704930294d0446360160ddde62cf0a55b3e3ae352f61109d1c4cc8c6417abfc9bdfc33f2725a7188d348ce519625c5937652e939dd250c4fb8bc414c14a46a870c0b9dd846bda05b869d731eef4be903a70511d4e3f40ebeb1739dd5935d6b26e9e8773b241ec168f1dd309fb5b66fbd7f860a78630c4501c13445ba9b68fa41d6184440c6d926b820206ccce1daec786d703cc202543e9d2aab09dded9be01e0d27709301b0346c9d77e95acbbcde28b94bd00c62ca7f7565e5f90dcb80dbb594fd09b20055fdd92f8919636f92efa6bef1237dcea5db13f10c996330b5e8933cdc8f4d19e68243a0cd6bb417894f6c2d79294d0af6079498d29fc439bf2f047f24255883f0a98149a6745f5292096b1d6494cccd9473e56def2a66cdcaa48c3b874e876668f11907d7b89ea9c330be280f60452cb18c77206e1547901373e45a4a7affd51fe4f0e29b1bb91af66b232f45bb22b42063815ca3038b771cbb2c679653950a46e7124de08c4c8c66acf45551e9dbe1bfc9202303eca63de7d25f20d4911e304f2985dc659f012829d99c6fcad1943ee2071f1e2e18198e411886124bedc2d2d20e777c5d7059e95bcd9bfa4f71812508c3b52c1a707785213ed383306d62ee72815c3eead89d39df1f8724db966449c241376c0ac2efa70e499e1335677423bbc91dcce3b7b61402f946868892a316b0f42e3c74bf12c57e815542b29e679a30104dd77067f70e542e067601a7c1a9ca57435ce1769c9c76aa4fb32e5518648a1ad4a4e633f735ed4b4f0f3b0da1b51c971f1359461b0a390c700de53d300e80d9bba82f63b177d2201e9bbbf6d6ee2c5dd08fb904289526cb6ff9a3e0e4a53d0d10a714d0a792efa279822be242b92a18181e9733aa2366076e84b836237cd90efc221f8dda106c63ca698120a2b0cb37ee86eb18c16d6b2c15514a0c79fa98c01388bfca7ed402c70a84f6770ab2c9a58c41b7e0045a27f158e7c9ecb2822b62e71b3ea86f863bcb5a596111071c700576c2d5427565823824b5ac32342b0944857da73afc2cf5a978012a636c282ec4375164b91c158be0490c4f506fd3fa6f6652eaa27c6460f21923053d10f724854e7ac61e9e90dcf76e861d897fab433e5da67365acefd07f2b456e2c0bc1789a4cf262b35e440d400f7da66c61e33a232242d00eb2ffcbcae0fed6f21ba25c45cb857de863b7f96155f1b8258b503e056ab2473b664849d1bedd1e9ecd27d4e7dacde94ad5c3f1e9596981ae44d8c6c264948bb8ac74c2737ddb30337ac01dc8eb5bf2a7d105104ca33ff2366888b206e0b6aea8502da47e01297305561d596206c033d160885c60d1e58466c5a741633432fdfb9cdfac456fe14ce33a8ef138bdec9831320854738559de2faa8cb6c5e2025966db1aa8431a044e4f870b08f24f7b8951c754719105084e4b01e5f08b922fcfe43360472daf2a02beb6545c4ecd69172f57708c02de02f925281493c914c006a87ae340de435dd2464e7ba032cccecf0e77a1cec9a59270077e969cf0043e6dd2bb5de8656ce9d27af9f99d2efc89ae01d016b4df77f921111ce9c32385300e8f4aa40b7f8dfffd024d0b67f1db0b090fc8274a65d7709ee22407e113e9d5470f845242a13e23de1833a0603c6a0d7c159504da30fa606e2a220d5cec47259885c9a0db05416609e5d411d17999649256838fab179288d1213a162580fcd1851de18d9bcf9f8542a00d19c5556dc340fb6be4ccf36b48573495db0e6cdec2e1d8cedab3e840b9b42017231724327919d6af2439940772757081348a39981386482622151ee1bb7fba8c1a0bb11dbb32ec65315ae52f8213313234594386d203ac9b5589da9377b3dcb4b93e0477475a12278738fbf700851a5b8bb8158067208e2857204b07afec3fce8bdac94c03580bec4225a938d2e1ea240b63c19a92d21da018a673eb7a366b037294ebf62ba8ef84e2fc98556bc62ab6aaec713b66d4f42566c483d7ea1551a135a7197b738eca576e88c0f8847a92d25593069819a82c17e3f3461904fcc88daf68b6aa1196ca701f0e7f20dce8cb9cccad4268478f56f79f1d6c7545260caa4d40440170cb262f78f11eea99dc9c47d0c92d6290b575a5183e2b1828100222c30286c846b8fec461ee101abaffd4a5831610605bab3eecbc164291ae8524782d97f345e8a6423d7378c97605e042af5a3cd5e4a26e61d40317cc64ca4740eb921f94221605a139c4a3c8eaeafe9b2a4276ff944d7c652acec0e251d7ef391d7002d817b586ca13214e4eae1273e2cd30d356eee61b019c5fd3f7a7914c9b58939a690f347c3b65c44773e589af67fb7841b43c5d9ff2c6532e042a0b758ca81fa401f948424619fe8e1ae021e5ee68d36d89a8124fe04b9c5960088f2006bf6b8e50d89c5938cbfeaf69e0d7d36dbf1613820ebba7bb1374e17bfb1d0ed71be7de55d0dddbb946215730f53cffc0538f5d39decd09058af9ac7d24e6c4aec18579ac538f9763c5e08cbec730c8e9728e05b66023eabaae36b07ae95fb7bdac2e62402d5e57ddd49221b3a1f18fe316df799280de8cc39f4faab1351af405c4dcd5bd21f30724333b328d16fa99ed67298ee4a7c05520e53bfe1e84fdd1aa26c031b370596b3fda90dd98150ef2f062f472fa9e5ffc048c0873d31ca7963934eec939b1b7c561b418c34f6be5748b9df62b0c40846154e083a987f87cb6fdc9bff340371dd9b275cebff9b4be8d2ec69ed5b06241bfa111994daedab7e404ce1eaf19e62eeb543d535d921d858336114670a543e899fb3c031bf1b1dea89812d279d0d1d4980a87eede85d33a9e8d47a9444cde8d8c2a65482ca635a340573aea8b1a56252523f8cbb9445320e2fc9b1c801f03beeea5adceb4e6167791610da0f9606082b9f903ad6309c673d1193025d092585b1cad56eaa7fad07a92dd55805a87ad27e8bec184e6cdd51daba556de801797b358067f74fbad909a44189294055536179c03af36a5693533d65ccbe8f18c3ff437b5a12151b9d2e9e3ea7f91e9919a7b1bf3ba8f6ee6efd95ad4efbe58f0ef14f2b1f705ca735ddc63544c558c73410a0dec8cee34e5b4f676caad692fb375e84e74e1ccf49144b261c0ebbd01e083cea433cc75c8fab84c662acd3d53b3a93acda975398ca91e10f63d7561d5a38d54d499c3294c298ca5f7b40c36d6babc83a82df8ffaa64888c21a6c32160ecdf448c6493f46ec22855ba49491b2ef12612efaa66169fc851e46dcc4471fb1e834cba76b91c764ac12d54cf48982a5949ac279d3a24fe5c81d89168050c6758afe342d73c0b8944c8a49e2b2db4649e148846a21098647931f51d2ce2ea488284c61ce70c180a7b369452dbb2c10908943b6643cbee5e0b2ddc560ba0e5747412be92d41be848b214487ed34f2b60fd6a7ec8ca4c564e23c324a7eace6f05cd620279d7d62de1cc38d69cf63db22fa604d5ca6a10969bb0559cced960bc1fae44be368625deadc87a5ec12fa246cd5b2e2b16ee7e7c1e02dc9ff92c31ff76bd2c92d71e97760c1954886c47dcf7df82bcbc8c86d2642faa95f8d9c4da602a6c988f2ed7f44cff7b0a9549f531f295b189d689809c6d2508e19c13ba5a8145a1c4b0812e41b21e5e604952a728ccdd6f2a3448da330ccb761410d0d2685631043ed3413b3b829fac415f255b9bef4e644d6d3ce4ee9768f0af2b7b8fe89a2cc3584190463fe7409956d4e0e367182a4656a6843beac07fd392eaba26d394de3b7d4e9d96fd20611b4750e50921e25ebb7405ae264b83883587351ad1a72e7fcd4953096f1a1128ddae8687c856289bd5037cc809f630613280cc99f0abd9d3a70d3f95f34cf5c938ea5b970de70dc12ddec0037d103fcef5c2146a042056f7ed2c82b6734abd4cdcfb5122d41a3759ded035c08e95b987681ab6c156ebc33f4a7f1be798a53aa9f880a24647ae11f4a70c87ac3c6c70dfc1fb6897b2c2d371ec0bd7c519692a91a4142ec1c425152f13cc026018b9194f3239181d2a7e4b70daf790c1778d5aae885a86bca5d556ce7b214c2abdc567cc2e85ccdad13ef7d6db1e728078772f6b00cd7594ec933dfa85f28444b1d39145e366d657e9aa1e5abd2a5ae3693ea174ddbafe412c2ca44782aba9aa9f6136a9f28b0399ac735a8ff36580cfb9346498d093073dbf3d863b2edf1ec1ee95eef8f467903e91cf0277355351d9fc89456846395253fb24bd69a2c08969c45c427301e05522dfe8588e19b832b68b9488c55bca17a93a9e6b6a7d862aace6933a818c0b79c4a4ad320f2dbf1fb1ef431e4e851aad33a52eb88baa4d98919f7f550e9f91e290e47a4442d8d78c2ce5148d37d5942e7a17dca16bed36017029d194bafa74c0918ba9decdafd7b2dad4eaee9623fba4554043214b9393d6ae03924e4a0266d9ecf5018d2412338bf2dac661932d0d03f75ff29d7d57eb6021abb97b007a87f598ca8f8e83c45a863f81cb7406902a6f0ca872ebd45e7be33a4047d326ccfc7f44ad1c3b0fa79f87f5283d4341d301b612e95df909ea2b44fce71276361b56769caf156cf44cadcd65a5cc8f127c2436f34e3626eb2ba20c7a81b0aca742a3fee5130e0e68c7ddc4e27db75fa2e7137fbee435779744571571ef81c1ffabeeac93aacc6e653150b8e0c97729b4c6ea8f5e7a312a4aa041e47c5b7124e1040d2743a0204e90006119056e06a607548784642753a10030c7082b6005b08b7803fa1ea3f09a53af74928d57f124af59f840aa5767a7d231a1243953e740bc6b561dd9f4d4bdade7b6f29a50c2e127713481298ccc41c2f438c70c521f34a804d579d1923654d68bc5d02d10149a8d86832245284c8db2518a9a4498315e562f876093cba90c135e5a6aa5ebc5d42d7bfe04a46161659561ca8b74b40a25922a059224488f0f33d02ca8c803223a06b11d0b508e85a841ddf23e8f81e21c7f7083d4204b3d73cc270078b84a80092d5c2c715d7fb002742d010f9128216f6f60804a8a1e6041aaab23743de1ec1046667548e37aef070f1f6084d25545b75548240897a7b84ae8f63c38c561412b41a6f8f8006818006810001c284ef10d02e086817043409014d42409310707c8770fc0e01eb3b043166be438060f69a4318eee008b2c0c961a643c89334af112027ea74748952be1d02518df8c6c4199c19b9b74398f2c48c0ca5148ba91b6f87a0264994a7aa29185ede0ea1eb41709c937226885b0c2a6f8780c6f0c9f918753eb5eef3f97edf7da8d17766f4a1ddf8eebbfaeeb3faee13b3e6bbcf67f69afb863b88db6664c18125cc982856de29ca2c1e656c2be05cbcdd474c8255f588c1e4aaebed3e2463544e702973b8c579bbcfc25a8e152fc2c01061bedd4774e303c80b2c38325e6ff7a5c14a69ea7c7ce6dec7ed746b43873ee8d0071dfa346d7cf7a9f1dd87c6779f36df7d94afb9cf70074b781957b8a121ddd8007b8f8071790b6b1a3113e3ed3e48e390a92f196252b0bddde7c94b180c38428c4f636ff73916e0061bd5b24af146f1ed3e5d6e5c8a6e84eca811f7769f34ac945687f67af7f69ee6eb9eb51eb79eb90ddf7be89a3dcb1ea6f17bcf8cef3d32bef788a1fbded363f69af70c7750e7ac0e2c2c6ecb95b297055cc0d0a445c15ade787b0fb1067470a64079bae202eaed3d5250b49581615176bdbdbd07c80c938b178de159d6db7b54e0c0c2e6b554d2c4c7db7bce2f9ef38b878787274ec3771e24cfd9ebce8356d4e289facea32cc1637652b92795ebba12bebb67d13d8bee7974cfa37b1edd18dfddaaefae3bf5dd55befeee9abde6ee70071b3085ac065954569cb817ab291eddc4c030b3e4eded2e91014fdca03839b3dc82f376d758a3ad069b242fd49cbcdd25a31b46cd454d51d37abb0bbc41630a081b9c39566f77b7dcce96dbd9d9d9898bf07d876e6e676e676e07c6f79d17df775c7cdfc1fabea37cfd7dc7ec35df19eee08f085d8b2a41a47039f25e591d535055c1e1f2f69d39184b3759ac9c70c1e2ed3b5e5a6809d216e584588ab7efacc00716205b27ac84e878fbced78bb215564aaca297b7ef4cd199a2a3a303e1bbce5267a9d3d469ea34758adf755a7cd761f15d674c91ef3a3a66afb9ce70073720a64c4a6d080e22dc4be14c0e0e1a663578bc5d87980466ccd6141849b6aab7eb1807c0a6ac721367c91a1e6fd7518332e5c9069b10269cb7eb74b5a0acaaab889bd695166fd7d93cdacda36d5bdff756abd56a912db245b654dfdba9efadd4f776c9f756f9ba357bcddbe10e9630f28666cb152b75cb2a6f710b8f2fc3ac2a6f6c6f6f896daed67888591245cbd8db5b63d29ca72247d6a62055bcbd3dbe76f3a28d9991b5234f6f6f4df43802a68d9c61568cb7b748393d39bd5eafe77b8feef5b0d7ebbde5ebde2ef6567cefa9f8de237eef997deff5cc5ef3de7007b19b275f6e3cb1783225cddb6b2081029b63e48bf9f61ef1ccb8a309d496ae166fef195b80b11d291323337b7b7bef2dc6502d0d1d9c224adedeebe2a24b539e99b2e60dc7db7b6458322ccbb2bdefec1abbc676b65964c79c7d675933309e06e3f1dc7873af398fee7532d9b6e42d794b5e8aef3c14df7951df7965bef37866af396fb8832568cccd41323cc2424eedcd308675428a5992236f6fe7114fb4d1518505a46dca92b7f38c5e4c8498c0a216b5e3edbce34b114303e4080aaeab176fe775bd266a55c598b352a3eded3ca4e6b1d33c76bbdd2eee775a3bad9dd6aea9a1beeff489ef3bfdf47d3726cdf7ddceec35df0d773015e21526230e79acf1eeb841ae51cb21632bf9f61d5100754d364b720469c279fbce580547489a90305344debe3b4eb930a1264dcbc597b7efba3cd081843221650a98a9b7ef909a6ad554ebbaae44df575d5c7571d5c5755dd73171dfd7d54c4e955355558d7b956e4e9d53e754d5c477554b1d33e7bbaa9ab580ee0d178b164c2b2f6f578d5c3abc98590bf222ccdbd5b4342deda95a9ac67d4ad74c9b694f9bc514c5f754f9fa7b6af6857ea1283af41d45a24854892a5165b3f87af81dd5428bdf51e5ebefa8198938ca2b3ed6628c497b3b6a2c22136386420795158f97eacc54e779cebda62b9e6ac5b6e33662e6e3d9acfb7ecef97ecaf97ee6f87e2a353f873bf8e1ab8d11b036353aaeb78b1b181663605cf1307bfb49cc206438d59535638591b79fc6d74b2b715a6c614abd78fb79fca81873ceac2d53a83dbdfdec2a86e10243840916f1ed270eb0929c3ab4146fdfcddf6bbbedf58efb4d97877bc9a4fbbe8b71be6f38dff78fef5bf9fafb367b1d82b0385240dcceac4d21955a62188962420ac6db371102dc94396c5d869431dfbe8d1d24d98123cdccb14d8bb7efe305e68ebc411b52797dbd7d77bd5eae31b355444a1ab5b76f6404b012ce52a7dde65ed33d05d4986d4f02bd64be46c24a99f72ce7913ef3ae96dbde7cd7452d9d1cf2dfb5d96bae873b9882af3946e0287384558de0cdccad471320555a6fd7c49edd9e2e671ce0102856ca68dd6b2e618c47aa1d598cbc329cb40989d182498cd7abed4c488f1947da50bc3d235f836955d1951193e544ec3d35c749be67e5dcf79ccc5a6ebee7e283400757b7c9801dfcf119dc6005bbcd6bb9cf71afc5d498bce608d04de9eb1732b26ccd003351e3d55aa0d8a001e42816f66e808c560a215ad484f94183a2d6120c1232e69bb7f3a0aa028915282f6052345e09785916e981c3cc991c2f930e77c95ba2e567fea188db77b43ef30f44dc11616edf297ee64d4fdcaeb3f699373971bbcedc67aeb3dcc197f7969fb90e72075f22225607f99967c0e1769de3670ecc72bb0ef133f700c5eded13b7b76e9f7907366e6f959f79dbb583a719118fa8eda2b222c5a7eba769cae369ca97d234a5a202ed773beed30a776a9ae7f19e56c83b795a615ae5f61686db5be367ce4db8bd37747bcfed331782737b0ff9e6f69ef233f751e1f65ef133f721babd07e676768eca1bac4751fe43515e84f225a615e518a532d7f6bb0ebfe36e2bdce19d5698ba3aad104dba9d6d7ee642686e6785bcb89d557ee64d5fdccec6b99d257ee610bedcce73fbcc3558713b8ff99983e8e1765ef233ff40c5ed3cadaf42c3c6affcd44deeaffcb7ae2b07eae0faae7c6907cf77e5ebeafeca310e967851deb64274edb5c2558bdb79c5cf7cc495db776cdcbe6b7ee6bbe56ef90445819868df83761e13d7e6a35be0c479744b1c2c8f6ea113f2286781dccaed3be467fea18bdb77c7cf7c47dc113ff75e4dfb1ef42ac7315efdf22a5fe1de49d7ab7175af725e2b54798f14b7afcdcfbc278adb57b7cfdc278ddb57e467eec3e6f65549c6edab9adbd7e367eea18ddbd5b5cfdc839cdbd539a6ca34b2d1fd3d1a8ff213bd82243eaaa3f928dffd7ac4b85d1d93b9da9512a95d9f790715289614472e08d1df10b7a7739ff9afcbed2af133d740e5f674f9996b98727bdafccc3dacb93dd5facc3d98717b8afccc2bc8c9bc029ddbd3e2675e618ddb51e6675e418ddbd12b6e47bb3ef3232b6e47939f396a448d9fc1dcf8f34ffe3b791110ea3df912936ec2e7942f71478f72b50967f9f1294f5b617aa2adf07482f0e4f6d3ed338760c2ede8f0f30ef23c9b4c8238e9b6833c913b789a9d669f39f2331781c4eda708236e3f8f9f39041e6edf739fb908a4dbf71197b770fbd6facc390bb7ef27b7efe167de64c2fd00c4ed7aed333fea728f84b85d2f3f731131dc0c46f7e8cdcdc0c36dcae2369db93d9bb93d173ff39e32b7e763f2c4efdffcb7372f0216dfcd9798d6cd31f3517eea260dbdaf24625eefc9571cc4efe96aa71da4de4166ce618edb7776d63ef39db59d36dde4a69bf26b6962e4897e07a9837927e9ebe2fab8b8dd69e806eb5c1e182ecf0bb7ff5e6cf8eef003ade9bab0b8a8b35d7f7296cd2156138f73086d223d4bcfdc3303bbdccc3b4ff927e7317513d04f03cf93f3d07288fc2767b5784ade72930873f3e3779f1969927cf1bbf396ccf2f65f008a6e774afec9d1301c2206eb180611831f9ac420507ef29d1b0621f42747c97430e5192a089306a65cb702d83d4ab4a481270f4097bb795f4287b883cd599cb7d6d94e1ff0730d831062bb3693354d8970908354c54f2abf419014a0df432552790e30182150c3777d315787509dea58fe86d090b82a1115887a645bf088a545f1e0b045aa2a86e646a52064f7580c4dcd32ee831d8c94b1504371f3f79dcf1cef6010f80bc002156025da591fb799e80cd18400c6676375c5b13956435edca2a01fd721a2e5485855d78c342572de866cc9a19d4dc13161bcca3472080001549e6a654b98cf96330f54be62d1d266674b940895af492d5d3a5a983805f1df0f4696144e6814674440c384c9d8b08bc69238675d073f5555f92f699605caab4cafea148464884b1badd7792c8646648eabc9c5e2221c46dcf1b5b823c1d69c00fb9787ee1c76fb355d66c7cb75c9696b9eb53646318a954964575893a1e71d79443d07cde110371f3d7e806e9e372ac5628c87fee4d904a7d65a1375154d538e9ea79a9e277ae29da619e5427bef4dc451372cc620f0ee652caee6f9cc3c631058dc8c410c0063344d539d777a6257a7dfe0351fe3db2cd1969b1f87c94d3dd6c09e06ee39c375cdedf9989e71dfdc9d3724aedc27ae0e9abdc5edfcb197bd62244d44e4c6c539446fc7f9fdc5e5ab066e1f439ceb9ccb10e1b2751c0e8738de9c73ce5a6b979b93fc880e9d2172b59589b9988d7978aa2982d6565c739be3c00e83c4c83554ae4be607ba931962dc3a12f5804b4e3cf77aba89ffc94f355d68666e27851feec63b62d8ab2b3e5555e52acfc7f3978db9a8f23ccc430e60bc86dd883a6eaaa8aafc392d0157ded71dfe80a8e324c744aacad356a886fd70073519077650ef3016c9d6355743a9e14c868d34ff31dda58652fe9cdc25e08f47d47fae5eb7b4da6b9e16895126e64fa29e8f6aba49d56da7aa26c5051b596e5395c35d9509f35def58a5a288b97dd7506a2b4ccf80a81013f33daba95e70516a66be67b2d71c9f3ce52c7aae676b86d3354d79bae32bbf81ca775ace92e2f0558950e6361a4297db28a73c9a9fb11ab3c7c93445dc7c9c4cd3f6bb8841ec2446ca0ed0ef466ea3347723b3062c6ebe740ddf124d329fc10ee63783a851a6951cbeb9c49b792e66e30eea3cb952561cbe99e7a3eeda416cc663a98f3ba8917a482cee60860265e6f866ae8d7a99e7d67473679e976edaed33cf5ab92b237710bf1bb98d32477e4e42d3d67c33a700073ed8c13dccdc69073372a99b3b887771efe10ee237bb28f25c6edddc45bd876893050bd402cde636d89585c12d2d0c02d9c2a09053181c820a835ca930184415362d71fb2a805d89df7c00440318c0a98103c8180977fd9977fdbb1d4026ca18096bfe811e8036d3aad165ee20d63a3375666a667ac5cd9c25e2c1443f233637fdce51a2a216648ca4f9c9f5b08d45f9abebcadbf1887644f9548752a2171c80a8f7fbe2f2e73bd8c1550a3556722b8a60bdf9cd9cda9927c3196f88bc1edee4c2b0587c21727c7392ad451b90e5968938af86d3e2661e418a85135669dccc7d1e8ba111955974c441b3d1c68b9a97b03a29346ee62d1d1c3773956ccdcd7cc776e666def3586ccd8a306d64aeb8999f65a0b899efe0a6b899af8fc5d67c31ddccd3c7626c5e6bdcccd130ed63dec31fe81d2236576c0dd8e304b02c1390f543f21cf1e4d420761279987232a5587d829c106cf014dda7b8461002939bd43430cf14c297d3e9edd41fc6f8c88958f30067d570ec29736466fd213935b8f08046687856883bd2d2a303828af5c76a058320e414c1e4e431d62614475ebc63ae3394cf4f32591e7b3d84b4897ab0ac4e384e5f9a1391e7aa8e5db3bb7ef3adfe79b29b632217ee1cf09d5874e01fc9bca4711512d570fb796a20d10c77e725cbeee4aecff4198a71f371de716e7df2f3dc5aefa5cea4712b00ac71c76aa98a354eab1eaf3b8d773bac318f6559dc62cce37aed4eaf6db1c63b1e63be837970d7631d17e7a6876e64cbe43299ab72311f73d10d37dd38a0873293de7b4903314fcf5cbdf789a6ebb9ae5be7b577a269aaaa2b6fb7f6d475c7e3b16d4fe7d4d1d93aebb0bd56c7ddd1d9715d1e9f1edfe9f36d9d7d3c3d3d3e3ebe0810249c12246c9d2548e8fd5a0164fc9ac8053f1a079d41415be7203d14218284f600fbb7db04ecdf442ed87c427b80dd6f22179c9a084f5875800ad08375eec248987f20856571d6fb44d31d0a3adc7e3ed654d82b2e26fab138eb7daaeb8ed70a7d416c2b5cdd5eaf0d3c6bb17975478da1aa5b557d6a56d1a22059f3b61657f7aa40e4e888d2e15564f1aa5c1d7bc2c2c40a0f2ef544d280e2b2b205850b35460d3928569ca5d1f13231b2240362c345dd6bf5be2cefe31d5aa16f3d7107fee64bdcc8816ec8b3bc8356c8aee91b3037cc7e50e1aadb55fdae8b8d09d51419729abc3b3a1fbfe34bad70f7f33c3a13cfe34aad90b70601b98803e6d1368ff2a45688f213ac50fbc2e1246bc9550ae353336e52585fce6640adbd69189c349f72a456986e6885aa0f73ee7db88656e8a365eb79785e3c0f0f8fca7978b6c4791e1f1e173c3c290fcfe63979f80accf07cc771c5ef99988bcf331c0e873c3c9b07a749d5a1b97ae1a5f8e6e5e178072fa441c2248a0ced491c9e20b3345461416488e5e029a135672667099aaf282c1e1f6d563a8e535b3a7834a4c921eb82bc5df9c2c37d2c8c98471ee547ad10fdedcdddb4dffcb7e5c66f2d5ebfb9512bdc5c4d39b015a6165ed5a2e2559ea115aa185a214fcf514f07df8bbe87e3bea13301bf8bf81e32113d3d1cb3f91e7eeaa6a0efe1ab5b85ea7bf88f1ff91e0eacb2f63d7cc9c7f770a7e599efe11ff470025871f13d9c0156a67c0fbfd00a7b9851bc84768bccf275b9aee8af65387e75d7cd625d79d6555dd155ca915f27ac54ab5e77eb70387c5ad1355d79d6faf26bdefa754fad6b367b7a7b5eae19ed57beeee02e8b5a932a73446e807957164dda2879488963642a31f2c2c88d2a366b99ba2b346c58511123b202d111473647c30bda5a02194f279a43b6ae5eac6752636efc60e391e5edb9ebd71d2daea8a4c1e2b18ed8414d094cbff45dc46f295e7e43f9cdd71cbfb9bbf96f736e06e6370736792c3645cb6fee4485eb372f6a85bbe8791c77a7e71d695221eb728332f5e20e7c1e5f7a1e4fea799cf36240a6ad48901b6a6794bc3c29cbe7710bad9087a268d1a342df37807894af28ca799b4739508af1d1b2258f72a256882e15fd6ec577a7dfedb484d998b3442dd9f576e0ef58ac605224ca131e49debef4bbdd8ef323bfdb713ce4777ca815ee5455a5f0bde8555555d532a857bbbcca3930004a7c90b101460e10356f779f8747c5f3c44976c130812388db9597270a96e7e142ad9087fb3ee8d322a44ff9eab2f834158b52e35365984f7985569802d967f98f65955a9ee5145a21cb835ae1dac4ca7739067b9703b542b7ebdb96f82d7007dd36e56dcb9d96df8ac8d1b668b8f92d5e6bf90a741316cb12e4db36c5f74c6cabdc9e8ddfb679c7b751aca025b99e8c90397bdb332d4f36b6dc403147ebedeeb72d567e9b64f8d405c5971726de8ee7bee57807431006cd4d470a3770636ddaabcb57f94f2b541530a58c59124b518c159a3e8ae29dc4d494449ca001bb7ad139248ff209ad109df0eb915ff9af15ae58c6d06db1f180d2e38c5a1b3b93a26cc5093433de2d078670177d7a36f5298fd00a5308adb0cd5abe56781e8776d67a43276771bb893a017ef3de50eee9f073a86fa21338fde63a3b6e1a38a443b4d3a68199fbc6b87d67ed339930326161616175df71d8da365a0b6b427dc76127bee330ada7ef38ccf81d87e1b01fee20365321c56662f8660d98228fe39c8d651931aa88189514736e0cdf8ec38cefa35ca34b532ae794bd1d871d99c0a9e1c2c7992653de8ec3ac2c9971d288984d95793b0e9b8295a63c4eaabd4ee2e49bef38b9b3c4493413df71b238fc8e935aafadbee3a4d4db71d2ec35ff60b883e9589ca9392f8e539ede1810e95080cd009285cbdb7192e83443880e1540b28049f1769c8473258c578f1f4aae2cdf8e93c71d1e1eecf0f0c0030fe67cf7806e474bab0de901d203a40775df3d98f3dd0339df3d00d3e3bb071e98bde61e0c77b0c48bb3b8641c226c64d878b519ae2d726066729cbcdd032272cd080b165c284cbcdd03638c659c3163c83257deeec1514a4796315dce2493bcdd83141c8550f1687b237bf2760f76a848ec509120418204dd7712743b45123b45123b451274df49c4f94e428b041824df4990207186a695d5a40acecb0b66a5d8e48bc9d817e4db491093c0898b92a2860a206f2761143b71020c901c4d366f2771d421334287cc88116e23e6e27c1fb1b6d6a633426784ce88269cef23de7c1f31f77d049828df478c1831dc415ce6c3ac4c8d1d5ddccee09264492ba2e406f1ed23886f29b0c2902c910186ebed238c739a3192744c90f878fb8863f1eac91428c62c136f1fd1d5a299940187a64aeeed23a68898224284081170be8bd0598ae8f12e02cdcd7711c5d76dbe8bd0f25d8408b3d75cc47007593066c30b16912ee49b57f326584eb48e3cb1f27611c43f2237c40ad5dc96b78be8aa4ace69f305840c8eb78bd0f90aa1f3152244881079ee7b081d6488b3d721d0e4be8788fb1e22049832df4384307bcd430c7790a76b489912e30fb7a8b7a85605471934461d28de1e8278a4ce45113459c51a6f0f6154da02f695a3c50e2b676f0f71bc027105020408106fdf411c411c417410cda21608306dbe830061a613f54127eac3870f1fe2d87cffa043fca043fca043fcf0e1c3073072be7ff860d6a639b5694e4e6e73d9edbb53b3d9d6ba39b56e4ead9b13dc77a7a2d3db77a7e1772727271a4f2da6c6ae60017bad8c6d192b73db11f77627a20ab4502d6131670693266f777ac01716d51b9ba93647deeed43a09b64e82c16030ee8374ad32d82a83ad32c8e67bd0ed7b70cdf760d4f760d0ec350f0e77b0c4892c306768a4b86ec4bdc6206368cea450937c7b10878ba8b81a26b25ce9f2f66094d59b8aacb123d8db83625827e0ccc9359952e6ed4135434e4811cd746112df1e6c8334b5419a9ad45e373535c5957d6fea6a3a6b4253f3bd29cdf7a6b6ef4d4d16df9b7a93d96bde34dc414cb7c5eccd171a71506f2f91a7246240a2ac69bdbd89f86ca05c81b39106cb10256f6f320ac198f1b4b5c5c482e6ed4dc7165f32c6aee6d4bcdeded4f514b81a0343d123acd9e5ed4d6d948736ca83070f51be7b68891e5aa287d6e8a1357a688d1ed07cf7c0f6ddc399ef1e9a32be7bf0e00108112f6b9443ac1a733b5c4c792315a7e5ed1e04e063c709ad263278e078bb07a617195359694a544879bb0703649911c48d892c24dcdb3db825ab24c71ca1a13c7bbb8734a634262626e577a65e93a9d764eab931f5dc987a6e4c6bdf99cc7c672af39da989f59d89c9ec35671aee6009aeb5a471a875230eea5d0eb9f2250ed792a9296f678a43f1a5c8850685d898b73325c122c48aca6bce99b7331dc3b6ba4801934c937a3b53d711a92d3378bca132f676a6af0e5f1d3a7480f2bd0312d9d65376e8293bf4941dc87cefa0f6bdc398ef1d9a3dbe77e8d061b883011822676e6e0b8baaad27734cbc545df932bebd43d2c592375129ceac787b07a394a9e55b9a3368badedee1b880b12a2d535828ddbebcbd0319a6181e4fe2b872e8787b871e15871e15070e1c9e7ce740d72b16db7a470ebd2387de914353cc770e61be73687ee7d0dcface8183d96bce61b8831ca6b43963954443f2e26da12248162a143088af9531aac8bd6961bd793b07235dd9162d47646019f3760ec7b42f5f64b2a2d8b07a3b874f81e3ab06324bd69cb77360e53a60e53ae8a0830ec8be77c076c076c076d02c7600e67b075fdf3be8c02c4ab34bb36a2b0a95b777d0142589102735ac2463bcbd03366d894d5b5a525b5a5a8a13fbbe44d75c6a2e3597be7c5f4afbbe84f67da9caf725e5cff7a5e10e9660e22609046e4a0917e65b5c1287c51cd789186f5faa9265cef105d9504e99b72f195f044698645f3fc0b4717bfbd2f1db282f58e63c452972f6f6a52e3843196fc69a596bdebef48595beea94dc94e65e27bf2bd12195d4906dac5289552ab14a252fdf95ba7c57e2f25da979e6bb9292d96bae34dc41015cb1a94941258d9b959630648ac060e106eced4a34c0a2058b0ab0b42db4b72b7539a122227530e1d2e2ed4a7033de983cbd9872c37abb521cac1b606967ac966f5742b25749ec555252529207df93d863127b4c628f49ccef49c5a42ddf939a72df939292863b4861c70f63540a35ac2a8cf646ca9437aa38654ebc3dc9861b24576fd07c0cb1de9e94e4c79cad2e2d5e504ade9e8464a390d8282424242412df915822124b446289485abe2365f98e74f61de9e93b1212d2700747e0c48c4d6b08d9962552307ebc41cda042e6ed48c400bc1042860c2eeb8cf1ed48c62f57715b72c0a8a1bd1de9f821cc9b3066d4983bbade8ed404c5d48bb2a9a40ab2b72321d36c48b361c3860d23be6f70dbe0b66143b3a8b5a1c5f70dcad71bccb268c8a24183060d22be6b606a606a606a6862f9aee1ca770d56be6bb8f15d835283d96bae61b88325720ce112677cd3a2069a09bea234f94a2287947bbb06291d4a37757156c478bb066397ad27194f566c4edeae81d802859931e6972d6fd7e062cb85191d46ae244f6fd780043b023b3a3a3a02f1fd2879943c3a6a16b58ec2e4f87e7464c6e361c4e361646464f4e1bb114fcb88a765c4d3325a7e373232e2f1ddc8c8ec35371aee2046f37626c54a9a2d64f2d55f7074b938034626e6ed46441e1590470504aebc038140a7ef403a5e11c82b0279456095ef402adf8153be03c3747d0702cd5e73e0700793c25029931ca2f031e4bd528486993332ae90bc1d484c92a32845a30b93b7038d7f03ea070c21505270bd1d784c26e142866e479497b703bbbe026952ae9a68648208793b102997412e43860c1982df33cc6598cb90a159d4caf0f53d4306b3340c69183060c0d0f41d43134313431383d9770c450c52be6310fb8e41f91a83d96b8e61b88325a4aeba985043d3356c33070b9a9c6390af136fc7401c41dd1a8e2e44caa4c5bd1d43570d2735bc50916bf1760c53b0d294baf6ed172eaced0b6e17e63c7cbfb0bcb0bcc02cfb7e21caf70bcaef17a87cbf70c1ec35bf30dcc1b7851b5d0f284f4e5cbc636f2cdcccb10969befd02f1034fd04c9811abf3d2e4ed178c6da4521c71e32527c6db2f1c2310c546395637e78af2ed17ba3e03173128c6b6d220817bfb05e457d15751515111d3f7226411b2085904e57b5151ebb597ef45cad7df8bcc5ef3a2e10ef2942192466e79c4c8f6062dd5c27035d59ee8de5e44dc5d59d85d59b060c1425c87ef16e876470bbba385ddd1c293ef168a169c7cb710a6cc770b16cc5e730bc31d0c41114d05932b19c6322fdb10b9284fc29851bddd02f1f5128adc92ec0454dddb2d74c138be99b291547bf1760bbb28a25d1411919a266a7b4d144734d789764422222222a23070df898a6f27325bd386d6b4a1a121a4ef436b73686d0ead6e43abdbd0ea36a4c9be0fe9b1ef434327be0f295f7f1f327bcd87863b5881372947b8e4c4990a53a28793ab27a832c41c66de3e9463079c2a52922caede3e6404d2854892362ea480bc7de8f83a4b498b3731ae926cbd7da88895b8396e69c488197bfbd017ffe29c63f8ce911cc9955cc9955cec3b0ffbce93df398def5cd9b9d96bce873b78d4254ecd945856971b6fd58e356c4d26586e6fe7329eb6fc90c37275f5f5766ef432c408048c0aa9b8b7f36313abcc1515c830686fe7dcca189a237065baa0bc9daf545869a5aa1312027e17a22baabd165a8f42eb51683d0a35f92ec4e4bb10d87721abef42cad75dc8ec35171aee20cb6482a2cc6ac79532af8c27143acedc90727bbb9010262d60e08832a28c7bbb90714dcdf2ac09848617acb70b1d53c4a892f342f1a4c5db8598c23ccd614649169fbc5d884c0532152a54b0f0bdc25a05b5b5b6b90a7315e62a2cf95e41c9f70a49be57f0f1bd4205b3d7bcc27007b1142547b0b4ba3745dcbc00908a32044e9726546cbcbd02b1453bc2344b5303058cb7573062a1a091624e9697d4db2b08604d8c392a46e69849797b856096361470b0807c7dbdbd4216ac94a58e0285350a14e6327ca740c7a4c0a4c044f29d02f23b8523df290cf94e8182d96b4e61b883f8490e2b427cac68b285edcd8115b5363729265993b753601375dc92a20b1a16196fa760941217250d0e0b1b2b6fa77004805b92b0a830133db0bc9d42d76b166a585164a6e2babc9d0252050b52c18282d45eb7bd8ee3df83e89241c9a06450d3c8f7a0afef415edf839249be072983cc5ef3a0e10e623663397250c1e1020adaab395653d6834d85558fb707110df016a44c14901363a6de1e642cc1a20a0a1c6030d250617b7bd0910a98a92c14406ec0797b90118b242a6c90a571d97a7b907a8595d4ab3a2020a1ef407447b5631b5ab30b6809c42cf21d88c877a021df81c4be030199bde640c31d2c01c3ad465d9c1bd107985713d1014586050943ccdb81888fc77eccc1a053e3444b99b70319d3a48a338ad4c128f276a09f1e70c20c818212a3c8db8108a0440b1b5d8f6351eded40723f723f3f3f15beffccfdccfda8c41f95f8a3127fbabeff08f9fec3f5fda7ecfb0ffafde767b883dccc85972e3255a464d140570c640fb8b3a7afb7ffe034451b38e08a52b6e878fbcf7a640ed91c154078d478fb8f192e6f462aaeb63144defe53f5362499f5e28d92246fff993261ca840913287c9fb09cb09cd09cd09c30a119e4fb84adef13807c9f50e5fb840966aff984e10e9640b2c5e6a64adb893615aff6914686220c4c98dcdb27d0e08a41a746079a236dde3e410e0a724d991a2b36b8b74f38be7ea33ca145f686cb8bb74fc83087451c2b443736dcde3e21e5f14b79fc7ebfa0efbf54eb976afd52e42f45fe52e4efc7f79f8fef3fadef3f31ccefbf9fd96bfe1beee008aa32629915754c2a25e802e5471c2834146f6fff61e92116e6049511acb7ff3090030a8d372a9ec83179fb2f4e12b8b3145a2b82e078fb2fc5195b97960e239af2ed3f3912e448902001e8bb84742841425a94901625a445093dbe4bc8fa2e81c7770960be4b9060f69a4b18ee60e796707435b750f784bbad3f27b7e5af4b4e4de3afebbabaeebafe567775f9fafbb54565f3d7755d39732909cccd5f39cf5abf1eff3cdd15f8e77966a75fb1d8b0a8bbc3cf6b5829e31d3633f88c5814540b292470deeef4d88a97abaeb41e5266debef498c8a2cb551a9b2b15af8c261b11136772d2be6326da779c043e26f385c804ae4d11ebc5589236bea881c1c64dc78b718ed34d3cdbcb630e286192a52543ebadc68b824ab9430e9c520adfd8b1e5091c351a6af88cda13162c71720079dbe2a8e8d4a0d092f69e30fe18c2244b0d185ea2e3cdccdb8a332af0dcdb188a382b2bc2de9e939fd54ca0c37b192d054e7f02a7dfe13d33bb7ccf4b2edf3392f93d1fb77ccf790de3cc4fbeba3c470571f22cfab30bf827ef4b7f325df9f1dde94f117f929d38f1129f71417ec7cc2446fb13af41e01dbbe1b83968dff1dcd4db315d04de339404de736e52f53d1b65bc3d5bfd78cf3bb426f09ebbb2d71b1a6773381cba787b5ef227d98db767e59f7999cf927cf99e99546fcf687faa419dd92dc7c978fb9ee79699eecf34ead4c52a1855dfb5d1eacf1d50e7e9f584ca778d5cf176bde44f32146fd7ca3ff5529f49c57dd74c8df6a756fb53affda9ddfed471cab0ef7a4ed3fdb9a1887fee62d536ba567fee1d5bebcfdde565e3fb46fed9e2ed7bc99f647f9e4b2c6ebe6f668cb76fb43ff9a9e1cca798ef7b2ec837dd9f27d49f4fe759d5f6fd34fe795afdc931910702e2f9472b04a271e3959494804a7c4937217125ce7495f54a3d252d4a5929498963252555498917e5ce684c39d11253ca12db32ae1551aad952027a033a0304a4e63b138d230f24e681f8ead6a0f140fc27f5406236e21e08c80af9403cfb68854049494949348a7c12cf5adc67e67b5099d80cb247321e9101e79178eed10a9178562b54d20087c96be099472bd4c0f98f0339e770b29eff7816ce3910e77cade022480a2ba8236c759c0b5c189615a210e6dbb132ccf3b807e267ded10a81dee868854a6b8e56c8b1743dcbeeb3675925ce72e00eea9765b124799687c5c2b2184dbf1d37f1dab37c0552583657198fcf62517bd687c56e6c669158f6ed99f9ec892c598e53714e1457c0f852260e0aab132a5e568e510bb28e859a8f35d60a8cad8c2b0b2cca906539663912c75f1e090989ff9078c6d10a91808080808e9c73ce39e79cf38cd50af9deafc47f4a9c077925be2a718ce5c72bf17ca3152a5db5421618e7813c5bb542e04a81ff2850a0c081149438050a7ca5c0d53c05264b36561a688182e1c3445d5a91b7bb573c80262d6d4a17b532705e56ecca916779aed10a591aad908213068eab1e03cfc65688c10df17d10dee7f3f122ddc4b9cfcde7e34cba497d1f7732f13e1f9f155ff601f94cf8947c3e1ff7758d8901837165f945c4e746cd1b37155374441c3efeddf74a1cefc0e0a6ec95789ed10a957e40ea032d1f88af406eae1e886719ad10486c67c3f722a693e5ab9c9667b96b7c96ff3890e54b67722e9ee539462b647995e77ce57254cf79ae6a859cc3703bfb1e4401ca93dfc07f357e838fdfc0f38b56b8810b5179212121960b09f15588e3eebe10c7506e3c613ecb4f966717ad902db642a1228e9f7c11cf2d5a6151dd944739dfc03da4e014e5511f5489a242684687548fb6a8198aa21bd08c0ed93cca43b7198a721408d528cf4d149582a24a28caa22ccab51145425194a3a80f5d513865cce0868c2943e345cbca9ef82803849805cfa167c915548829d034797bee4241950cb0b2b5212ad2a0527cb40933a52e2d0ced5fc6ac24417316a509aa8f8fa2dce7f3f97c3e9fcfe7f3f97c3e9f8f6716add0b7c3cb389bd509326a2b6850f128259aa8226bb2d038da91ad0b797cf396c67994e73c59e44c1466118ccbcb39cf54ad9027c7c6c8c4c658319689655913539e6559f604f35996e51f44613dcb0910e5e559ce00145753cc5e7e839b7a73c5b843cd8895d256be9252548f631064d61237ba576918e79578966a854abde4b0cb03715ce381785ed10a81dc0d68bf816715ad7043072f54677c219e89ad5088c2da53e039452ba480a215a27ab9140c067d70c307bf337df0831e04837c1dbbf241eefe9e3ec83919940f72e08a0ff225275a3ec89d824f5a7c90e3171fe439aa1506c5a69ec783f23cce794d1e8f33e9a6f479dc8927e2793c9e128fc7f2561e5f018ff784c70bf278288fe5f1ac3506f5bcbcf53c9ef279431ee7f1f8cae398c7d342d7848c93341d3c5ef0c24cd5d0e225c70c213c8e791929f6e5393f751386e73c43b5422e86954fe0b76030180c06797e6a85419665599665599665599665599e4db44276c7899ca9a509187164514d1b3ce008492177c486d2861f6fc0d8a8b818a1282991bd92d297234c2261e05288e5789594781eb64225283e1fc73de87d1bdec77d4ddebccf974cbe2f8cea7d61684d7ebc8f9758ca412be40dfdd00bb81fe2386885435337c63e4d53ced374eaec539d542c4d53a0346531e4539d342c4dd9f4290da6a90bac4f7b69324d7d69aa94a62fd23e8d9026d39da2e970383c91f25255c7e001850bcc9c19346fbac68714344fa29ed8c0a578cb8f2c48e2803d01d32505fb3a12e5aeb498919a20c7d816da19306eb252b919624eac5049f5787b1e7699b9d52597a031cb92ea0c89aab255548651a53c5ed086e7313d8f6321cfe3f15cac79de0baee771cee3401e5fe2f11bb4425eca043d7f28e728ff00e52bea02c8a3dc06ad106d2af9bc7c0f0a33e29594b89be2955a8c7925ce8b4c5e8945d92bf11ab4422520ba9b08008a1b383a82a8c19ab1c34d5c962d696f514f55706792ac71b12586cfc7e47d9c3b79df0eb53230a2ac34b79aaf8f4593f7711ab4425fef8341aae607a9507c90cfa01506256cb07617a7d63ccb57764accb35c06ad90059aca7a201e835608b472a938cf390c5a217f412b4cb591bf938c2befc45dd00a9d6078f9dd0eec77bb9d8fef76dc49c6efdadd92dd6ea7b4cb3b291abf43da65ed76bb5dba5b7728acfc2e68a764b76377b96b87eed85d9939b035626a4876c0bdcbb42f61582885d4d0d26125a62966058d07999d919337624a2e176ab476bb9d153019566440bd4d11d9d15042232a4d5c54da0e0dea1b1e6512e1048fa1f8cc84d4a3fc44f95ae5e351ee161fe5bf272b8f727ea2ea510eac5a7b942fd578943b41a1c5d87a34069b4765783dca5bd00ad15e8663597658f72c5ba5e359ce8256c892f8ee0bea4562df3788f8949f295f535cf994bbc54ff98f58e553ce8b9f72a08a2c9ff2a5199fae607e9a82c5a77c05ad30dd49520209a30c0c29ad246e4994735c9a6a73b8a4c254c0c9190c356d6286653dcf43f23cceeb9e77e5a6cc94d5549ab8978722cdf3b80a5a214f09c6da2bf114b442a5d507a3c6fb380a5aa16f3d412bdc2d25e9f14bdc04ad70e9868cdf7c03f7f0c729eab7bb8fecbd81f6de3886fceed946f60eda7af3ace5e5f784fdb537ba335a965556db5edff39c86d2440abceba2aefacdb5b1eef75d5bfde6b8ebaedf1af95b2ff9ad937ce7cdf5522b853ed36b7a4e88f73ddc50bfb19816dcef3db58f7b6ffdde7bc96fbe933f726cb222df3773378778df6a7b8d88f7edb6e37ef33d27f57bd311f97e164fe379b4c0fba9756efde6671710b8d36bc8f753792e8b783fcf4ee605decfe6a9f69b9f6b5b7415be9f6d5ddfd1214ac4c03b3a851633f08e1a51abdf1c3d067182ee10f21d45a24920ef2819aa34e21d5da267bf39cad4fa8da2717d47ddd0b974f89bf79438f59ba745645a15e47baa957669e03df54a911b784f9364bf79aa74f1fb67a7cd74ed77da96ba21f19ece6dae0e873ca950bfb7beabc6dfeaf1b7aa95c4bbdae535644e5d02e4bbba54994abcab686a738977754d6dfbcd55b71fbfe37e7c5f896b7135fee67d3deef8cd57ad34eb968fef6b725572e07d355b971d785f992bda6fbe36bd8ebf5735adefebdc6eb82332f1be2b56fde63be3ceaac7f75dd70ee981f7dd12be4b36f1ad37df2ddffcde9d657ddfadeddc82bcefe27eefe69c78e70d7ff3a08830207ce74dfde6bc234f8bd7f581771e92b7e437e725c5fce691f1d8bce66f10bcf3d47ef3d642f0ce73e3c5fde6bc39b3df3cba1ddfd9a2f1288277566babebc66fd64bc77756c92e59e608ded926bb8684ec37db96e37b6f48e44512bcf78cbfad7ef3de11ceefde0e1cdf7bc8644fe9c13efbcd7b4cabdf3db4dfc7dd9bfbdd0e3fe0bd25b653bff9ba39ee6e0a90486210b3b23653de8e93b82e8c4a902cb532674ebc1df3d8424557444b16e6dbf19c8923c5b13741b6d4bc35ac668cc5809213e5edc265634844460e30ef903a1951e4c461e2e3ed794d005fc6236a6e43205776d7c7aeb534533777711b7f83e00d1d8f294bae76d4bd7d2b7f0b399b132696e54ad7dbf792bb3d895bbb4283cd89b79f43055451abc14389992b44b60eb4142eb8ded060f1f613f9db0b96121f287c10b9f2f613ca9b959c342a4c8ce1f2f6d3edf78e1918982362e0b49079fb39f79b0a598a1f58782cd33cbd1dd5fa1d07cb328bed841428b3b7a35dbfa9644d290b33b1c6eaed68f3e9aa088ea723934dd6dbd13520536498d962a3ad68e5eda911cb97da972c2fbc5668bd3d3dfe4e97bf53a6961244c50d6319dad5db55221114988d146c45d4cc79bb5afc5da48711b4253b5870bd5d4dfea60a53970cd321a6cddbd535705aba6071498121be5d9dfb5d4636c6054a0f2b56debe0e7f6749d2450cd79cbaa8b7af5dbfdf8c813b66f19a537bfb8aec805a0c3430335ea459f1f6758d6d4773ed782666e2edabdbef3939b6220b2f2bcbb7ef8ebf55a8c8413754120667eced3baddf72dc5079994571c1e5ed3be6efb6b2194dd07c09dbf1f65df337c79d57fcbde7beb8606e194b91f676de18268ab0356954b8d0783b6ff93bed460a3561b87e6c793b3bfc0d65b6626c4ad90eb9206f6789bf59e46f36f9bbb36ebf39eeecdcef1c6176a091b1d509297b7b4febf71c35513db0b2aa544dd94eb2b210e79c31317b7baf79e6049b245d4b1735dede5b2bfe071ff0de0a3f583d4062e53de02568851eac2448904032e4497012b442122e891f816cfe083e82563842c491b817c145d00a45ac1f3ec4111f1f8287a015865841800001e288d683e020688520f887b1ff6044cb7f3002e33ff00fb4c20f424e4efc74e26b9777e2aed357f19db8075aa1d3cf2788f5dd69ebea0d0ed1cc448e146f773f8804f285c60799adaab7033f385cd3a2ab471a911d6edebef4c1e0bef1412fb70f4e791d89d0d0628584eb0d7e9df820ef402b0c363535817d13e7402b6c72ddf7c04fddd47b0ffce781af1ebc86bc07be8156e881f79e49cb33f1b5cb3315817a26ae8156c8e4267d07224dbe03cf402becb072e0c081031122cf8163a01572a8f01d1099fa0ef8055a6107ebd252985f5a5a1a32e397b8055ae1d24f4949494949494949498957a0152a25252525257501f9244e8156988484c4919090845879243e815688f42b7a9fd3fb7e7c4d95b9b5a171e2edeefb38eec0f72dbdcfb7afde2744f93eac46c3ca539a1628b0da5e9f10b2f77109b442df068ebbef37f05337057f035f377097ebed377029f90d3c02ad70c34f83060d1ab88cbc060e8156a8c1ec8f82a0fd117f402b3c5a33bc51901b6fc41dd00a8dbafbc007f21f90afc020351ec81bd00a813c43862de667a8fb0c9c01ad30838b0103060c18f8025a21860b4076fc05ae805678612d2a2a2a0262e38b78025a611197f2167e24df0247402bb410e57bef89b63c115fb93c918fa727e207688544eed0d0d0d01037402b1ce2dcf73ce839e72be72ee73fae75e3392f402be49c6559966559966539015a212b2424e28584b8db03cb0bf598f1427c00ad50e857212bc957e0026885155695b7ad783c312b54525b656833783daee49335215f668c3c1e2fabc8f3783c2e6c85bc5ed977df53a0c0d71d724f81bb3cae3c851d369e020f402ba4f0cbb0dbed763ae27eb7db7100b4c25d13b682e17bd1a75d3ecdc1f5a9580e351d5f9f9e7dcadf5698027936be3bad202c4e0e978eada824794c989a13533eca70bc7d49cd4270943dca57311c638ff26f8568ef7d103f83f82ae683c48e313e887fd00a835c20a6efbe07e227105fdf3c10969507e2f8c6f181b807ad10e847ec0aceff7012adf0674471c29be14fe0225ae184f5c77f3fce7fbfdfefc7e67f4d383cca43b44274efbd3707d10a37ffd00a7f4e12c25e02776a851256df47d8353e4284081cb883b9381c0e4fbc11227026ddb4fb085a8a4a8c4b1937aa58bd11945ec8ca50f8b09123cedbdd8fc071908fc0b97cf761d95d84919c1f253394b82d0903abfacd979cc08afc6602f59b075be1d6dde9511e1a049d9a32837665c5620c8c17c54b1a49d83cca3f807bd46dc7191e7433986a725e542c099a4779532b449b1e5a61040873860f8133b542086fafeebc6a7c555593aaca999c6cbc2a62c677bc64be3a5479aaca57307cd54795a1aa3b556555356730db9513715dce5c74a5c955388a6f80b019b6d9755160b8a0d2f3b93e52b68a968b3d3db9f878ec787c552daee8987daed8251255c4cc8a1c24579a403113e6ed8412c61c36a91b1f1b41957352c112012ba7699a9e496e23fcbbdd0aa56df869da73daed5cf577bbddfabbdd6eb7dbd246d86b5de292fdccf819f0d30188a12da52999102ebedd041b20c7d1e7aaaa561a05d5e3f19ad4a8c08c461957395e55c958db30c61c9b346a746539b4ca6ea8d8e1f1be76cf954ad3344d53a5d7d6a7699a2a711c4195c8e5ce190a7a6b4a8d1e7c83718c16353bebce55555555d500a4115174b77a8541c78a459ea327b537ba20695ea8094fa099e1828952ce308e57191e8f77d5e3f1d42b60b276632e90bd192c8a2847c25c01234bf2a64b564c19d2c665940107a7aa0e429aa6e97aa629d7a7423ae4d2cc4166e5909381285b5bb69c811106f5c6832d679ffad039c095ad6cf3d6cb273f2dec7629e2ccc94193b246c6abb27931c689181726b6ceec39e5718885dd4e89d57cd53dc126a47cc56156c6064e230100678842d42a46783e5555555555e5aa903e52f62e1377838d9c2e67943a3020e6048f326bd6b0babcaa9b57d32a2dd7752130e72d4d1d51c6182162d460318639b97204abcd5815a9aa19ed6e3797624796176553713e5e754d1031321bcc3232724698a82e8aa647593c80d2a88df0f7d57ddb51e09a6baa9423aa51a0c449b1f8a4cda5e95894923d0693d067535c0cb1a095a6699a367d9aa6697a8029c794af2977d3e4a752c658f8c8ec76288aa298ac08f15154e9d3a185854c14b11d4a4adc38e660c216034514abb8ae9d144d5c94af1b8e2cc5991e32334538a81052b7381123c38c8695d70b5070998143c73586e28d6c069b6f4bf106f41823268d943460c6bce9142145295fd86cd91ab251a1d35251b274502b0c8c409265e080690317e78a8b10394d1460dca8b049c98c622c8aa2288aa2288af2b5ca589595167343c596f061638d9830746e6a66bce872cb040e332c14562cf69ae23a16c3c8a3ad3e1db2a3aa6a4f655f5577e78a31d996e68955beaa69b1e56ce145e85cb19b0405874615134928345e95850a2544301353bad230adb8cc30aaefe7e28d5679553d579e7baa7cdd5bc8bcb890b5187bd5f7aaaacf75d31c79453219f395044a0b194b616e31e8bc803481db6deb0e4551141580d81a8a3ee1e1e4740256b5c3e38579f40918187fc2295faf88b541ee2a6cf980f29ab1068d0ab7362fbca478db4a7a6d34637472dc2024453904d9c914c4d5bb877513887d7e5857d7fdfd38070297963e8c9d4ebca74790a1695067a2262aa9dac35c0ba551570f68155afcf03e2246625ad7ecc3b5e375e041b8e2b11ccc944a95af607b1d9c2d9742707aed52d1e903a3c5ba49e944d7d5753504283a3b49ab90981ddd840461ced54d1b7caa062f3c1ad6ff6920042e3d3e471aeda7812364f8f88c7c107a98fbb881102183ebfe7e9c03814b4b4e4ea70834112460d8596aa0073a09bf0bbc253ce4d690e387755391d30f1b69be7bd626fc58a0f3393af30344a4f623e202050df9828a363089d8698011a49bf8eff7fbfd7ebdf3f7bfdfeff7dbad6a8a9eda831a0a1584c2a442272a0855a8d0468853e039e2c287827c3effc3483d5a434440665344167ed098cc06a0efce721bfd6059289a4016f443dcc193686789cfb0192613c1b4a188b7b3fc21fe107f883fc41fe20f315974e14786fe0f23411872018304b566d3fd9d65560ac310e131fffd3012376600ee20bfff74fea7814420d64dbcf784343aea9d1aa881226c1c69e8f1051dc169e0f9214ee99de50e9e443f64ffb3e4c7eb67eb67c78fd54fd50e73f75bee2c813bcb5fdf59fe76963bcb26e606ccd198cc08bfb3ecc98294d4c3453f271d492274fef743fc29bfef2c89af779655ae08a50d491a8e92908c92804919305c28b290949444943494c493849292922a242551480a6a9392927e7e4049491392ce243529459392b64e4aca7aa8f3c3489a27b5f871fbc32070915a42eba626cbc4558731fe40b6ce193146d754e58c23a486496a1de323e42c8370230a97520ac559a1f8549d4f2028c584c6e024843727090d68a708085d9c46cc383d20f9ccad1844b4ad400f72560b3ad60c3d674e7ec426f42b7256d0507552f0b0660d12823a812ab8f939ea32a1c7c70f0295cfcf71dd20624c020422670411622b044ec3a7c2cdbce708096f3d8a3bd5262e433d5adc7c3aede089b1021d617b7e393239add5088776f62f784b9e715e18e9cd8b49481be3bf40f717a0ee101395db57a0132ad7ec49dfc34748519ece94f782f03c2fa42637f52f10c0f9e8efda9899086d8d236ad801a739502b001dcc7626ccb315ce533f26ea2c784d849f60b2b6afd00a40e73191d0de3a635447430cb79fdfc1050a4462442d7801fad84a0743cf6ae8a5a9ce7a039d8a98d0b4a787f0f259b5b7f6f450d1b33b5e4f0ff167b5d639631e9d1389ebe40787fbacee0106ed13454f74a3a8cee7c9f46c6ec2c9a54f5ff312cfea21f43bda4bec739fa7ce7b635767cd4a989f8fc37ee89b56b840066801fa27003efaecce0315c0f79808873dbbd3f3f3c820da30c4852a500802d2f033e127e12802049f11d02743cf061e774707c385220b384907a80049afb9fa9aa8b7406717c60b3665bebb4c49783fc2c069891a5bbb9c3158a68d3707adb5d69a48f35303777e866ee65a6badf1161f6a36f2d753600737d1d236d27c9fe7c9449798e71266ee25e62f3169b999f7a5b344d61a4d0ff1899be967ab2332ee3043b19a53fd799ee779eae0e69acf600737d1079b77a6efe79fe79fe779aeebaaba73284ee2b91327f11c119efb0f7e6ab85d1bcb4eeeb518844e841a2e84c7626e538faeecae8d0cebf3989f6be83206d1f398a3291ac6d5e179ccd51ddc8e4d67e7313fd794f9ccdb56003bbdcc927de638f38c41ec1ef35de63c39b7bbcc777a7a1983581d80df20b9e2322215432deec56d03301c11669a325243c4c4bc181b650c427dcc7bed00b0b899f3766ddbe2b66ddbb56ddb34ebada23ee809306edf6d63dcae9b65dcaed7d2dc9ee7c2b87daf7d71fb46eba2e6a211e3f68de4e276bdf4e2763d44734f336edf5b64dcbe8f6c6edf554db7eba4dc9305136ed774626ae2ec39b76b23d114f74c1f8ba991438de898ede0b0f13c1653a34686f530d6442687db4f9f0cb7af4741dc7e06e77c9a6e5fdf55538c317a628cb1ce4956d816b0201775ed41cced27d0111b5727ff75128710fbef5126e433effa8afefacc87f41556ca5618c6dc9cb95e6a330b45770f01b591e63913f5205f0cb7af3e61eec9b595d6c2168aee39a4893680b9f8cfa01bb7afa75a37e78bdb57f44cd334cd3849bf6ea22d58b49cb31a2ddcf112b320d77dce3cae06026d8e9375738f39d0261240d8b018cc378e452208e0f5d9b7cccd0efc7c0c82c5be787d67fa9c86ec33df1a0f5d60a8d5f46500b90e63bc629e3551fac485733df0348fb9dcbae53c3ecfa8dd869134908b56f3d0c5659281398b35cf058667dd7d36f798785121953c904fc604c0c55712aaad651655891e70c4c6ce5a2857544d78c206cb96317370756f9e3b4b3cf198f3c68b4c8e226a6410c784143370503eccbcd9676d0d96326462e29abc1988d247dc9726433429decccfa1bda68198377971d51ef3e663ee0b73fb5e3ee64e345ccc794eb87d933de64c35dcbe91148023e30d982d39723b00c084cc8923f3c752f93e591225ca522b0b9a180b6ca4e111a646d34dc592f998fb9ab8ddc31257f30f3fdcbeb71e7320d2edfbf89887a072fbae7aec7ece3c73be83266041c506dc173ab42618588346cb0c8fad31637452f9989f3c17306175727e9e99ef20eea2644e4a4b8b2c6357091c62714caf343dd83cbd3f68d6bc603b61a5d5e475a190654ce290332f6fe63c506edfc4c71858f2e29e45ee6f68f8786fa8601ab76be363ee9a7135513fa91e2fedac807869ee69e4e1f6f4504b831c6659abdc95456f8bbb93d18372572c9d2f17edc12671775b6c95fbf3d552b165ea13b795035b77b8e78d75cd45bb5a206e4fcc8c4855163745292f2c6167b2beaa602971f1a687c2f5996aa35c1f16cf8abb2bb21e5d77090fcd5dcdb8cab04d574dd353e1ae39dc5cf5c73ac33d93ac4bd8d863cf8b7b1a7b6c2e6bd533ba3d3d562dae8b4427cb6da3ac48d4ccb1cde1017706a6d7e5b64fbc2ef7bcc19b73d1aede112aac955d15b66e15b3c3b19bd2fed80d51cd5aae9ddcfaa2c7a6b722c52e6eedd2611a6959f48a74e954ad4dc6cc61d1b83dc5b58dbbe6d08972d51f2d925e1bde1b26a6200e0640c5d88bab9e9b490493fa58ecedc9c492fdeeae43f77c97e5e2b2563c346e4f8ff50b12750d9828605ad8802903c345873d62145b84c5988c64138bc76cf6e0b9696ef182b83f8fc59a55748834cf3069caa9726efbc40e71cf1b6d2ecba3c7e5a25d3b2db727c692a1a2e3c4651f8b85f1f2244c99de1a37c2899e1377d3688bb8ad95ce9abbfa587b0c6955b86b92de0cb1b5cd451f8b8929e3397177557847266f89bb82e9294923a28e8931d3b28959b3424c1b558a183a9d16aecfd48e8debc3ea85717745d828d77d2c3666098c31665a655a1363d2f0a8b86b8e1d9aabfe68d7dcdd105e1331b5244c377d2ca6c6e4dc9ae8033136557a52ecd5119436aa3bc114145d1c938823191f34997c5d8f766ca337bfb47744547b46726befc886bbeb1dddf8f17a472e986cef8847af7784a2ed1d1987c4a2f1b8d4e919cdd9e91dc56832ddde51d4cad3336aa385fce6bba76744170035b433339fde11d5a981beded1b00d42efa80599d9199adaef3342efa88684de51b1f9eb1dcd5827f48e54fcf48e72aca03807d43bd211d43b3a52e819c5a9d03bc2710af58ce430f19ed19c561732a99c1bea1d55dd406b283da5abb41551ef88c5d242ef6885561732a99c2bea1d491160adc95cd90bbd232cb72ffdd66e1772c5d03ba291a1770403d83b4a711af58e4e802043d1c5b56d38ea19c1595a4a12590dbd231324987303f225a0d3d2869e511c02f4a9759b56d368faccf719a967e4460fb5266aa33e26f58eb25cb7a9d43b7a3a752f0f977a472f28a09bf6ca76d03bb262c01276c36bb8f96339f48ea65c4c81bdb4f5c66e79777d0015f49a7717c2075b6cf4e7899e277a9e7befedaeb8484bd1bff7de5a6b3de7e7ae451ac446d1144553143dcff3cc39e79d370d363f3eb3ebf224613f3d7befadb5d61a9f25560dd43ae79cb31b1617f5a5d73c8c7919677c81c7018083bf6dc4e32b06813e8f3be1102ae7711099446e42398fbf18c4c9f9efb723ca2136cfbccddbf1f88ee5711e8ff7f677db48f35f6f5ff3f577cbcb2bce39635467c7db6fb15186f0f3fd37943152e6ea90ce4a99a743678f282b11d9394f8d31916e317f8cf1bac358033547ad74531e6ab7c499f717ab570dccf9cf7ceecdbf40bdd6fbd49ae8cc598ecbee9ca7cee779f6da7ebb18c4ba7391064289a1258351245c05db52aaa387a4db4fa333991b45cd38c6bd39ce8b4cf1c59948001abbd5bd384b9c60d913b7af3b7872949f4340595e74e806584d141433de1c6039af176b0fdd87b7fcf0327ccfa19edaab81d987a482960a587850f8985458e2f6f5cd21f077b70318cb2250cc69ca97c4ed6708194e54ee988418214e74107b5bbff88cd9700604c7ed27f086dbcfa014cec6ed6785236e5f376071fbea23c6edab0f870419219e7c576e3f4398a870c5ede064c31520016c2642da205fbd464d0be48bb14b06628cdbcfcf7c07b1591991c8667931777308fd209a3b3e61dc1ce8125aaf29927b05e7c6becf9c4dd3344df3097c19fb24ddceb57453263ee69d6bafd75b3da7aee4b6b2a63dde7f64496e2fefc5dcfd00011804cb3167772b0f6f020f1be5deeaf27867dccce39aebef0d01f178cbcf57677f8fe7f7831dac00873421f534e409ce9b39017610bfa11182e3c7101f6a4fdecc979c7843eb5007feca598e578e729d21be8d78ea6ee81c3a9d987a7b7d7468fd73082f69609e10d5c392b56cc30135f585020a315caed4d8e89eda21a76d94796f68697f00e6f2c763704cb160c34cdb82f6aac018c70b4b1b223cc4deccd3be24b3dc5069b37a731d54101c38a8b660b978598dca6131f76960e66c06eae03b88f7e69b73cd27e0a69e06ea1d0cd47c88001849f31ddc8431b0af5f004c805618000de43d2602009111b7f3d71a8f15014fd0d31c0018040ff3f3293d390be2c44827df4176e51df82c512636811d37f94ad4f6e709026d742ef5f541ac717bde5195b5f2966e42ab8cbac92a1f75533f81e627cf44dd34757276a74427e8fde6c00ef6b4d1c97d6b90fbdbf01bb8c3dd5d67159b397e622ea298e3f3e468d739e79c59908374ef9e0bf26f1073b5f1a77768ab1d0cd2453a7886e8f4e92634a35071799f99b31913dd20e79c73ce79bb65baedf698430d35d10d70769b7b272917e7b95f18973f767770487922cbc7569b335e2fe6bf1d2c11c5460dd4922e060d1a4dbcca9456dc2c41f1e237285e8479a204888f17735c84894cb0ddcab028c67aedec755e3640bf781b758d7c8de7d0217e76df6b8e5134a33a677cea9cc0f79807a46ca86488984de39110635431c846d00000c317003028180c8a6559162541c9b90714801865905a64481e49c4791e841432c618630c00000000040000680a1b002d82a057d29bb13963bb30ed38ebcdebc972c74ae8ed7883829d6d28dec22bf65aa401fb7f9021f8723398363a1ede2adf75451b9b02a773a726c9a8b048ff42adfb2fe0c03470d03539d6a4955688f992b3868e1914b14bb2fc7b15c96e966d7864f4960802946eebfc920513024939bd84d92efb48b7129501452ed4539dba6db9af15344eaa2512468d76a91cc072d844f01124410882b96c2385c57971df40bd324f4c751316007ab6ac12248f445432769468b9b54dcd00ca0064af11b6ceaa68c2fd7d975d165af2df88445bc13ea294c3af948008fbbba56e8ce7e31d4a971729886963ec07428312f42dce7d1e9e545c4e12bc8dd6379acde62235b78fc8334505d8c90040b6f2ee1f082793c92380258da02959044d9c7dc791fb950cd3c78098ef18e27711b07fa779acac8ae37afc4c114f007d421f64c9cd2cbab19c99c5b4422d23715d91d0afe50987456e9f65832a69dd485c30fcf08e6d6b83f1cd193dae09120eb52a5786c5caa8fe8416f66b577c082689dc287134566c965f4b1e520c9e28f803293a2907dd8bc9003433fd915ef44db4281754510270ba79d1cdfa94a514d02741af4b1d7018f73ffb0ed5163c58dc86694f2e5bc2f24a6798c40956362a3ad716b885180b09fd4b227cdb5221278bdd5350da0f50d290dbabe3231762a5432fa481f2b4083ad1d52243bcbe6f9727a10c6ed337ecf9024afb5d0e0210b9b2174733891f942d2754a2189930c125a18b5e946248684793ad4538f3613eb7760c583447c73e2c1385305d4cfce5fec435323a4cf726b54829991cef7ae9224d651a50ba12242d8a1e4d6f3ddff9246920f1408fe7b0329ca4f304229a054e24a31f0715b2fb44daa6687b8e3bc9c4161c7bbbd979f52c7e1a9e998514a623f7057ccf86714731325de87a05dcf207147237a48b2d5c0444231b3946b9b9c852731ff25f283e87ccee141c23634826f7e3a20f81163ba86a59c1dbdd9cf26735ef6b9f9ef44840f7582b339d6cc8d4bbc6f7134e66854cde388b36a5c54ed3f3365f24999d364d32587986625032e8ee2fb98bba1e434c4b4b9c6b96eb90f195c3addfe4ea7bbf1173bc04159cf665b72d9d4159b9e057c3131eb544020ee87ef66178188709a717eea4d3c7e3d5116ee9fd391049a6638d634c562b11b3be2d770043db94b44e772bb3c89508b81d856526ce2ba7cc34a17a2094b18fb8612dd671e6f2d68d0b095d15f45fd92b537a9adb8567969427ae169b468c85c7c3fbd744321fff250abfe0f8b5a0b49b13b6fe34f41455920b2a77a7fa99c1311616c33f0651ab37117ab72e5a5704fbc7cf737bdcb9a64090fdd536e241fefd62ae46f71376a70ccba9f5c5531ed5157baa380eef2ee40f1b221772602253748bcffded7e19912e14843c59532bc7a98f9bd28ca793c41fd8fdfa31cd8d3d712c86db3ca6feddd2bd87a5478a26b0be70c5627db2b06c568bc7175571ca5105dd152abf632a3fd252ff2879b0870a33b70781a31e8ec24afde9e338bd141cffc408bf5a82bde6e651ee2e53f08e151d5559ab26c28aa4abfdc3c6ac5786609ab2e7818603040893227c5aba2889153f763e62b22370b420399ca41f55e85b4b564305b1db21e73430b94ca1496c5d72babcb8c159bd5ec16a716331ea42826c3dcb631a0c3e225cba1439baef8dac50c7e1968304372665a6a65cc0400321b83c7edaa27c820dc418176369d8686f2826368ebd62c9b7aa4a823e5f7e9f7526e08418c21ad5cea4307df5a9c1ac1427591470bfd5d0d31c36bd8eaa1ee504dcf2ef36a518e7d3a341cfdeb619d92b69de24165ef08727120fbc49c3d182ebc2fe65dd4b7d29dd41aed438613d1d87f025d8518cda3c11d7bfd6f8dcde185d85f2e49cc76dc9b0321b1f6d7750367784ff849d2663ad7518deab6dd2d70db15e9613f7cfbae3fe64fa8816a1940faa8e6ff7748793e9540a8a505e7b3bb8c8613ffc101a1c0312e10d8ac07ad6cca432fc1bc4a8e1d7b9b7c3225218d70d66866a0c430fd559fbcb7eb325d68e2657668bffb8e8611c91bf6bee161243574163100d5d2146aab41a8e4e224202a41017b519ce6f5184405b0e29d11991ece4c0cf00a82c679e15d7b1c14700a5b8ddd11b60aa6636cebcafeca7a3e7c96df2732066a8153b6529dc0f31756de54f312f70dccbef69dcd5c69d6f47b8690487d5a6edb1fe25cfa39fb902dae7392870100d64cefc17d4992634e415713c6477f7e00afa2e80adeaf8656d007e0461c261b92a4d2c08b6980f5febc67ed645801f75b921f881210337e8dbf8292cb479c4fdb34eec34e5ee058cf44c86b125ac6b5d806b0e75cd8c144c91587c4690dd4afec6be039cb20ab657def6c7e1ba4dd3dbbc1d48ed6fcd1f6ac0800ffcb5a8262ff4711c7bca64eb0d6a44107a5f71dfcc99ddfa4f9d754328d1d70ecaf9d251a443fbfbdbb9f0845ccc784b065337e55f9522054a4d8e9f38eef0049d9321b250d8cbf3bdcaef010c24801d83d8128d35bef1c6d9c895e86a04ea873dc60c5b72f04b4e05b56e6977fefe9c51c5e733de11063df0720710824101bc7601c00aa9622ec78f9e2fc40fe0d0bee39c7db5d4f38989d20228742c424f8d116d10a2fbafa11288565cf445a3e63c40a5e2fc94aa1e5a73e9cbfa14798739f294723f33682d49df08542f618e57a49dff0914240b483e3ac5bb4f798896ab73eb24cff7e7347b4433e58ac0cc6cc516feb4da8a6ed721bc35f3f409ed3e34489533a7d27af513d53ff451f043bb9d69610beb6def94c4dc22dc4e38037173fa16ae6e0f335b8aba18f60161cd8f1f03c4299e1b58d8188514badf539a4c5ce218742be635107f89a7cc36b98d8b168e494494f270ae21a80dc969152804f315c9afdb5c833d47721d3d47e6df1eea88c95c4e1c3604e223b361f961e1d53f4f3763d8c84f824956aebd1628410b4d2141dd0cd87f03c67a32d8828a7047b4c6ce1508164555964cd5f8af60c017b3c7db44a9c0ab3fb035da830475cd4cdb1bc4bee6675d00bc1a192284c62364534408c563000c21a3fab1d3073597731bd685079bcaa3400edb8860c3101285ea079edd95bbee36d8ace1052243347aedc0ef7e49b1eb875c22944f73532c0d644a16af2f0761c7f4b927a729b2790b28304784a875a41eb3174ea639ac8d6f9e5b7cb757000f3c72a24c9bae753ceff9f45b982901274a591ea88b861939ae9c856e4dff059813794e5137f03f33c6c42790cd96f18836a6e7de4784d2820377837474dfdd71cdf9987206854808a9553efe7d935a6bf8df7b301f734ec21099d75ae0ffdec1b4d41a7fb7c1ff36f3bb7d7e73db8b0ed8fd384b3c18a71c879eb8a416a038a8ef463a653464a6c9a8cb26da4b699e3bed64d2713b471c8f292232cb21e1d2393abc5d135bafc2cf7b8d83fdc0a59b249703d17581422a737f16109779f46586c02279769a4e50a5f6180e07868da5268e0c5ef39ca17119e288126d1b0dc6acce3c34976cc784c01d425996ed8299711e16d578269e8877f4a08297e878e981e51886dc76fb6a4e0b06b72f9886e9ab642640dfe14ed497593b2e4ad59ba862e867e64474d0df33701831d1fc4666a691986b68ecf64c357fa6f46b9c05f191e0821a828b249567236ff9641694594fc0870b661e6ae322f5adedb907df5fe33720b66d37a980bf017b69c3fd97cf3b0d574fe9c92f63ed197f5f7ac87c4f05b370a687c0fadde1291365e14d86cc7d6caddc4cc878de8ea06645dd5dc4efad6c5ef678bf51b8ee7e637fe2e8a14885c6a060eeb5e9962e0b68a0f18c75810404e3e2a61b2c5bccd4f64be694fba49fb4efb200e8fd4f38bb1234e28d626e2ae5dc5bcabb2288916384d957e5391a16fb2c8414a840f8f9cb36d947fa3abb84a944c3eabcdab862427af12ce22fa74025f8c024ef4f453a732f332a9a388def705768f8c18b9aa3d28c92103e221bfe76468d7a99a2efe5246aa45725c6d7652181290a2e562709d16b0085493ae574d4d9c780804fdfedf316ac6081659c898878d7cd8c373e2170fcbe0750078bc161c1ce81c85ed484a0a5c222421a1bf10d11fa475bd8f41f08ac6a9dd5744dbc14f73debc0f7535f1d93de07be4dfe4c43fb5a4f1b8878f6565bc385c804f764ac7ca967c1595b7c9550fd75b87adeb96ffbd75fd57bbf912f5475b6e22f3946348b498da68c6cd6f30dcf6d719078037a7986787987d6d0c25643539e45866870460c399147ee1c5dfb7ee14be36f301e5b28d2c13ac5acd8e061aea7150f4d0f557d97147a61268d52b8c2f344ae2168e75ce7ac0343714d493628d0a648a95220f1007c5f623f7ba53bb1309d2504a9be93d9c85167aab51b6ac8b1b7658b461f8c8a8f351d87d3a889268dd04ffa25cb9df737578429901cee5bf186bb7f0105de8f87c5ee46d9ab8703942df97edc14475dde425daeb8df71c89b379c941e832ec58fa958220a94cb5b4e7577e407a5ce23ceb377869b8c0824e6612ae691eb433a90a6993d273db764c76817f4e00348165bef32b360157244eb8bf7793b2268368f3a971b8f5078f5eda675752839b8e6ac52c11a16b751e5995ae1ba7b66c95ae151fb81a1e164b6cbcb3a37e458b94a10090f8bf3ba76f0d18ac6ccf04f5975d72f520d6fe7d2656251530fb8acf7aa967b1981bab4da8e36028ae829b36bf8b93450446b5a4dcf66faf09466dd9f4c9696c8a894ea756ebfb3a2d620e30fa9ce0e4b49c035f2f209444f921d000506935ade7b58a1af94e7994f451759700e67c7a86ae211d4d615d301e379f85e7a211d97197cdd43e76df3ba6157e1280f1dca47c86f60c189d2e46380c41e76e85cd99a1ce224d975b371a153f4bc2ef1a8486f1a1a53d7384edd883773280cf37cd0b762607eec7e3e000dcaed47332935011cdd5c0bb8241cabd056e6c4b744d844e3a706423129705a0f6add87d344700636e787646b0cac22acdb61708c11c95168a86fdca0ea6df4d11a01cb616c0307812479219958f62ec5c6bc02fcafe61ddf93340e2be6c3fe9d7a90e6bec743407dfdc1cb43b8a9db682da7bbc9aa41fcfb3434da6aa3b130af0de67317d0b37ad684b0728c553b1bd84b9f58efea46587c8126674c8c1f08bbf0cac776a0136d29387c0606320729556377e5200c60129d14da677140556a0b807cb41d4053085464ac38a71fda47f2d4d06785db5994553afe5e22b50a8f190692758ee2fb117d28fbe66f2fa8fbaa176c42add0fde84a22670ed75b1ec3933fb39b825ebd0b0b05200889032f8df99559aee9133b55a1cd0c50b29c421362be2bce225108ab113ad2f30c0626bebfde9ae739d534ff2a917d0e210902701ed0f0818e95e9991dd9d8cfaee607ed4f5328f9aab8c74a236c609e700eb3d808904e365c52ec46c1657e8536398188906ddd5288d8f5e0412180fbd6d26503ac482b4c16d134a51b313856d7593a8738ca31437dd345a24db694b21c6cb4bdd6e0cbbe44f92d17017b0cb47c00a41066886595e7c5851161099ab2798b43ad82f860f168f3e8747c5bcbf91eb71191ac2d57d4a4e04685fcf672cf31e508cbcc01bb91c2dcdad0190905896d5b8d351685484f36045448c3a03eabe3b93a732bc796cd0a63e2d8d2c38b033571edc0824b9567644418ccbbc3a63ff670bc2635e6f7efb116d983fff9a0c029e425b5754f5279ba18bbdc0c64e3f029e60a83ce58d6148249501e62aa6a8656850334f045bd947e4a823cf803fad25ee7e5137e634c073ece329f5c6a67622761d81350f4b67edc4ad4577958993e893e94412c71a9e093c71faad597446186896914a3b4bd0e5123fe5e57caf42ad2d150799bf94cd70ddd264ede5b14409a14d3d24e8e4496b300c59d3c8b5afc8fa20244c4640a6b832db8784648f875caaf566e7d3b8f579f4eb40f1fcb6b64b05769caa832799fd25aacfa368517fc5755714646d8306cb8b7b6b3b8760708a881cc7a75e27c6274bc999056bd247472295147cbbd9d6a96143b538f0c666ffd9a752a1df0227a20c00305eed77292ebb7d415e3932aee9160db78d6c067cf69f5fee92d53384006da9f0b10acf211aa8e8faacc17f37fed1e27e89b7cac41dfe4e306dda61c3b289bf4f8ac07dda61c9ff5a0d0241e58cb26f531ae07b6e0f48d70216f4d494d5e6693f65c0f603586c8331de9eadd49160720b1628e14818a59a56953f5bd75d9da249888ea1a3a5448241a8a4197b155ec371edcd3104e4776df22e9aa10b016bd88959e0f384931fb914f87f667ccf01ca9255bb4377549dc648b83cf6fecb476972dfeb39f7222ba0d0bb9c836ebef234433ff9435847da65c8c86e0d12b426f9f2a9caed40e34ffe5198c9b2782fbb56b8ad3495031554be9fe754985b01d81d72faefd9d44b4e3e652e9f6afb4e2094aff715e2fdf2906f766f169b652278ab211685ba0b760533f59d39109bd3c43c0ba801ae88231834389e191e488b585a6632559471db21441adb8eb243bdca57f094a7029b3261214de43c84e3678727c6e9881d63f23121a18b2eb576af3da6ed9439f0edd2a3301794ca4da42a38a3daba1ae249e863f07816bdd95de3084d3911736874b12d16027ca53e52e02f3c4422ff72033d5c1143744aad1483dd4caa37c5425ad5bc72072fe542bff31b9ef3f71eea6e5e987083bdf96a6f68b321aac999b4995986fe3f0741a5a3733137e1329aa786931586ba999c16b3158c39c3322f0d37638cb572115a67c694b998b80eba200ffe04e0e841549ac3988bfb5f4857b851b29135288190ed6022ad308a6486b936469c1084630dd22ff68053bb35071579bdac047c08897fa0a7eee0380507d4f1ae8e2baf00626d8a32f994182e9b012305482aa11318c197129d4f9553fd9e056a6cf61e12930000d25012052d8fb09358da31b6266ecb670f0df7f7add1b714a68911b76d6d48204789e0275320be2843f3ba973b96726ca85ad807af6643df981ad2a9307981f241c3a347ad3e742170e0a949286e4cc347529e7cea84d90550d39908e2e84bae193bf93037143bac405f89183246861435635bf63a07f793f8039388feb7d734f3ee292e5f663dbd2d74234988ad35dab7ec533ef5f8295c492813df726d0a084de180d231ae59752262983705e0aae5e57f63f8e197ed74a865caafb222cb86980532eac8edf8d45f704107c321e44715bace8ddc448ed2d3a4b8164a23f541d1a2a0f6370616a3a4dd8a56a302dcd8e63867d770f1a11398b5e4f2b1d80c8ab5a6d11209a2509a24fe7c956eab995ef83ce7ec9962fd05c10743fa206d4c39500f372de2146c83f69ef8684d16e0e7b955b8e9254c024965c632efd41642e48e80e35a95951cbdaab76570838d295b39b9966211495bb456792e390a7ee94da1ce3d14c2b626b399e4844fa38dc1866c47c8348e553d1d2dae0fb4741e6f6719a0b63f10d52327e2198e3fbaacdaeb1db27e50c066f145e1c0737cf18317e3269e2432d2a296d4d6af73d1905f592c29ee65e0ddc732a1c2cea31794037f8afbb8ce2014b2e922f579da0ebe4aa6c5a76001287b580ce5d9095b5e6ba8bbeabdcb6a4439fe016869a7b7233913620b6825f47abab62dcac6a5a278d27f2ab06a039773b3aaa203702064740d6479ff473e01a07597a03d5ecb6cffc1624e2e885b81bbfdbd91d523321616218ad3b9df610d337a4b39f058f52596bc667c21864a98774cf0d50adeea0a1f9807797b8a37efbd68355cf18c8203173f207e393b3cf28ad8908f19e713cdbb7a90c8cc98bfedfd13580c64e8582eb94662bc43c9f4361e72707c6e07929d2fa82512a4d7294c4496f6e205c3323fc11428c5299cf7ac965ba23690a7e4b9f1aed87b73fd48a632f0877815e726177fa4713fbd675f9cf1eaf4daf91d0d88aba6873abe772629fde1bfa0becd3e159805ed584f4f3e411f557c2bc7cb2ca8639fdc4fccc12c6fce31f36132ea074d20291bd511b9ea3901aa687b58dc7c3c70b5b207a04bc2cae0ec169921c23dd683d8891195f10719dd4bd6087094fb87d044f5569820c154889122c22ffb973faadc44b04846253edee71c326c7c589b48c178cbf78db2bf126de35b1b8a662cbbe2fc88e26ceb9ec6d8ec068dfce9f7a272d3f2cfb448ed2c14860b4dbe2fdf97120b51eddef7a1fb060cb5fac7c23650a1420c97db9a67dcf6be3d7b4b3dd94a7748506f7466f813762fb12654026a73111b3daa00f3804459c41ca99af17846df5591c1b5db859dfd080553023f9f05e15d87fee2f149f370c710969eeb09d563aee8074530e80d22b08c011042463c427dc961914d26c14d448deba255bdb1d004f2d4198c3264e4ae54706f066c0ec6d36b343b97d75c454475afa008fc706156a87d46ab8c31300331300887d6f4e33d1213656dfb4df11da90dd1809fbc11d337a929644b8dd073c106b2a9ef612c4fd266c0a98c7cfff2ae90cc042c72520c43e8c3e1a8ea97e1d0ce2d3aafe08f03a7fa1787760c36f1d8838e7b9eceb081e72ccb352cbca68e987638b40f51528ff2ade0213d8c05c48fd04ec9c113d4052128a47afea4f1591d67815826cc71f459c1ccbee67d0eb6bbca67339f0fdefaeb255297927eaae781de11533646793140f3e92bd0b54bc803fd4c5340e9932e30e3aa4875e3fdac85c06c8fb9e0fb2a86888b053a269e23805410171b426c01f0dc19f5647c72ab26b43a2241a997e6f1d4c653b044fb93f0f2b47a4fa4d0b4d06603bb572d981014aca5dee5b11a9043ebaca47fb46d796d83900b9f1171d8391c7352abb655d4c4695d3cd87db5fb654831c80fa8ce255e6016a21863dc27c80fe031dc40a9a22b6e2aab43cd120fbbfe1a1f8fd2e0ddde95b60dd69b1c322b147340fc37bbc84f710c84b074f59e466f1eecb3cc2bddc386fb06be9966b1335119dffcb329137d4591e1a7a133941625697e0073677964f2f3d86bbace3cb5fd8ccf61792acf387928cbd4c7dd9c23535c8ca88dfc6b299bb97a143875665d87eff720bcb746148022edbea192192754b587421e1f3680c7c6d0ec4c9f0fd4af77e52ce60ed19fd88458e57efd8dbf7f0a907fcc705f868d40330c60a13f79ebc06fa9acdd98db3f4f0a09dc3d1085d6aeb2278d4a5ecde10dddca9e8634166caf4ddffb86858f91d75a204dd21137e24231d83c2c559e540415e3ea08cc8fdd32c17f65fe165b07be6db694870efb3e5a8aef796f09cdbe02c88e239ee31879830ee0bfdb3c5d61b00ea2c6c4b7af8f3602b0ba3c31b8d0b1471a33e16d7ede18290eb80233bc7397bcdb4e258ed5b01bcf1d2d8c75e13d9bce687b4c8e7506f1438a71a00d5a34424f90d972ce56105f9c155ccac8883ee8b2d7d731a35ed310dd68aee22196debcd26e4e85974cbaed2a43f4252d5f955eedc41a630d9182cc1f24a5c04eded863dbd00d8b417787b2b65141b0b906ead1a2897cf7b39b6c4e6d33a2cf277dfb8f53115f6d449160219c18c92f14fea381c51d0fb90333a92bc9602b3d16c08bdcd8237bde4121c0ddc0f8a02bbbcd59f2cb77c3231d81706eaa3d39947e8417647e0cb12655f529c6f04b8809d5bbc26b60430a8c0161857aa9e2441973f7bdce149a3a99d6e641b5bb529bd938825042c9b434ed50fddae815510f542676a05e049f9c57739b7db49c1e7c0da3b6d63b51e2a5963964b890897e8bcedd8ff3e324bc4695cf45557bfac5a8e1a637f1bd4042b537e62b209723abf0851a44ce90a35f93c11b78d3cf7e64971dc109755d793b1d3ae3621e199475e15dc084aaef5219a4e64ae2763c5932d6f621e229ee3e0c8bda8c5dd5e4403852309b7e019e6fa850f4375bf648c2146f8236d9953a711a72596aa135dbc5e19a292ab204ffbfe2a23f0be3f81c6bddc23b3149f050729d8617f8b75dbaf84bdbf457d0eb43474990c23f84ebe41baebc0ea95d322233e5bb78b86a00d733dacbf146d3717750ab0a1f396f7d56aa31dc03e68fc24460e03920baf36d727cd7517e8e00aea91b305543834177c20819cea65d880081257ac3fb748214795ac0faec7e5955007a6d40458919ba7e69cd8239321020f7e09f2df8bd6473cc311302a61167e4c64107f22091238281bddc4d6c25623c120e86d0b2eb8cac2acdf8f971fcce1d497412d5d6e0349c6f05aa176afe3eb1c53a912ab1c222a992ef9a6ae49b646b45ee475e644d90c359041c9a5c7afa38768bdb2fb42e78d3403a56702f1e30fc70f23145fa49fe891fd902c1202e3803af4be6c39617234f4a85e0c568e3e3665d8e7c3fa80fde38d8c34b95ff4412362baea1f2fa67203b07cbd5d233a63546b9f89d38cea856727af8a7aab9496f559af720261d85a6874998f5a65306488d46f0797f36b863e3a1e6124d5fb29d6ee01d08da667fb438206a15a9f3b6ef2a8f1b38a667c84c19f47b9bfc56037e23218c4b15b2f11223bb6f937656bbacf850ff99d131787b18d01760cb059c72fa9b561666871f83b99119aa59d88fe3a615047114fa0339a08edf881173e60d884ef6332f52ab42daac0f9b42a8fbdd8413f703487eeeb848b46c527b59e1af7fa5e8032b134c1df3c219ac7e4a8b52fc2acbb33dcfa1f151036153d90d4a42a955e49c19a36873f2a0316c344d1722d8f614122c1f2aef1982d8dc591d9071759eed31496ed662a9e6c4e72e8ef60980441a64e6670672c54186d61e81a0db814197aaa109f43a4815004052b4ab76d561a09e74a70394a9d94820d3fc457e4fda5b3b4fe24bf0f710aa6df5cf06fc37c7f49e9ac8e0ea283261f09f1f41ac2d1cf477b1fd1477e3d8a9549a13d899bcb40327de7e14b7d16c4e3ee025d1b62068ed8501a2141f31ec2d62b7724a79a2a8e38f7326456b60220a7b8ea34e98793903474f43f2934da25d7647b6d52261a4dad87bc5883741772b0c425cd3a98002b10902ddf44d1a112ae0534d6b9192cfb7f51c2443c24ce566aa2085c0e7f4712cc7b8c6872aa2561786c29e3d11e0c1aa0f050de8d538836168116fe214193771436211743100a9a464764d9ba4a6abfe90acc3105205a645886dc58171a4addeb1fed4e10a4dc801b58f0ce45a7cbabf25c5be381dd409113fd504499e1851c09e18cc8c4d4854c27eec1c433b226176e69ab23a58c2f6c61990bf9d0a8ee481e4e2edcce5bf83f08bf853a3cde5f9a362f55b72736584a123043fc9f0edc24e4deca37d4b05d1033136e2af045f66edb5a63fc63649b82a01524eb115bd198994ba329f88a81d8e3cab05b2958a1a4a0c19c093f1ba2c314bba8971ed34bab412d90ff9e789a5190c1d6ab5ac47f87ef83a497056594896f451210fc85057ad361cc02aa004b59da5239038cab1d3cb13b7a110cd0a84b94abf71eb54004af0bff5100823a82daf417e71702a7e303a55a84ce3a325cabd6d4a3ce9085ff01911b94d27ed36919485ec969aad888f2674a02361212f5c04a93e0981b8d148da42fb0699a7aca3f03bd11998a304af40804aac5bdf3678092848d38549e31d2326e50d388b035c2b31ab34159ffdc56b8180236f9b0f37ee16b41ea536d97f92a830c1309f26d2fc4c28ab711ffec5c04cf5d3a2872548415c4d3f676729a79eca16522c30e0a216c114ed101ec527f4f40a200a73e4d2455166ca8129a06155e5262c49ce86448ed318d68c1bddc5946a11d69acdbe8aa1cf7f5c26d225f0acf742115cd7d741f8d1e882e78c48773599444a63d88026a9cd0e7ef4fa83e94d59ef36bf831cbc4d137a652012bc8624beba5bad62caffd6cd3b83a62450a428409c5b0f19f52278cc33a7f2646c34753a4c36272080e5263204965c92f24a187aff47bf8876863b552573baed74a502c6f5f271f6b2e347b0c312e3800a3d2a0c11f4145842e7b7852602b50926e03be495cad156cc37aa1c04617bb0fb2e8313108ab90e37be1670fa8d614d165336791dc322e29a2fdb9ffdc76294fe04de88780574a0691d257e837a30d6ff4301d0df1861f48dd049b990ca44a8e7dfe4b91fc284392a7b985982528042ffcc5fea28ab0fc44c6ed5271165f3c43065738dc8400264679df3bea3c0b54d9d7b13c2923c7ff3ee90b080905c603f26dc1b9ef88fc4eb63ac9d6f446b306975ef541bc6d784cb81d461bc03276b204695915d324c7023d0c583b6e52909b533d3431ca60a5fe618757736ac6d8e1594941613bbaa6176a7d4bab733e07f4383ed7625f3b55cabb523bdfa414c1ecb556577e7b423c48586baec9e262424aba243e11dd8a94063fa6fb488af128fb49ca09f464cc07f41c8d92c209066a850472fcdf616e014d25617bf09744192703c0d6f36fb665b6cf1a0a80a8f1881ddc305e22f234482f47a3ecc452930792f1e9f16844b13ca774388c86c5845106de84538a28a2f71e7442b08fa78cbfcc09ad942d95546febdad581f80227bd58771b207e96f4777aac5dea924a8171ed05fba51f9bf15ee7d03ae3c72d4e5610b74accba2f6efb48010ca00292dde762866afe4c937bbc810fb5245a1f20d762d7f161901894f959e0669d3e11b02378f418a8c7753035764a80d05d011c09b61184d0c8383d544ddcd59289b5918fb810de465ca50cc3e52c1cc40c9b7492c6ba1642e7991107c51d048b209145ad4eb004afee9cab14c1303d65623858420f8340dce044e52c7506a9aeece6fa023c905377502aed5bbf5b63a39697492a06012258e6d5be14ad4012904ced57360554811a58ed4a9153e2d838f3889fa2c08f70138e5eff92265f38025a17354772ce8be423889d7a7b3a59874601ad133ec6afcfeaa107a0107df4c92e3d210dd70a29c455df200e5261ea67273ac9095d39a7140598c7b6929185771ec4da841cb363aa3c9de92ef0696a626a9fb985cd67c2126e1a6f470933ffbb6d9935b7c3f43ea74c7a9ed628412120619a185707b4f81b6832d7577af1fa6fc1259fafad476c997a4e607541b7431ebadb9fa6fbf439bd40e91ee5ed43969edb3f80c634a94deb4d5ecf996dd843f927afd9f0711e0b80370faf055f017a55fb20ba19650fa76e84d29aada4c34dd08ef2221853995fdf6416a6ec404aa595181f8aed1c3f2c27adbbc73ba0d115b0d8adc20f68b381057bf61abf9b7e90b557d12f75be7c345b74097a07db4126c221266a3816bd229282b028a88e38c77c8a32efc26204195ec9c3e718772f329655b705373dc65ec1bf301d7a6a9d3d1d2888c2bb6f3c0f6ca086565bf3671c3f585fd140d87078cee250f3107f57c56b9020eab9203de569a09c8731c5047216bc543cb11aab551bcce0e4535ab83400f116f6b3585e1c4330838314b315134d6ff95fed96cdc6ba2223e5583061a97085e96a66197796e0e19ae32cae29538f7972862e9d60678dca3a453a27f4e99c8ca49d9584cf456b72f9bbe3e42c7e1c925620e69220e366e521f1a43f068742a853a9b46d7e06ecdf4ce7b030921abfcde0584a71c3a8a4fd5ece14141a1bd915e691b754878fae958175e1c213beb08fef24291390a86525933117560df227a021edecc115aef948da3eb8842665c2332eb15a3af1ce987c568f3c2302bfc5208145f029bb816bd34760f5b5cf1a44bf3871afdfa56964113235be28981fcbc016db562289c9318def506dd0c7110f28a896379b65b181de4f0eb37c77fe3f469cb4313294829111482506c0ee779c62f9505c454fe0f52f142c3ec088511502173b3cbd9c7d2acd9c375feb43d342acc12b3e6b4afc2908e18d2d46bf4579794c8558b70a691b32c7e03450cb535f08d214a979b05a8a040b41aa29241bf4fdd2851518893761edcb24971fb8a49588b7d7f377c0ad2a803830d550e351537e7e75b3cf81ec33c862d07e5d89cc1422150a6c8d834a1db00d74acbf8eb989ce6d903c7869ae5929675b02706c1d7eb68a5b95c0fb73a122cd67ad6204693d1d67bcf966a65e28fee4726e016082952054e6f02e0a091f58e4ee14d4a26ddbde79b067d7c7282e588e713f2362f4063f5fd5fb5fecca5ca04e6cac61ded020e8b2857ce60cb8419c05311fff4adb3faef32598cdfb53b7210b9e6978538363d60b9487d9ab3850b0e94434213e0c60566085f65d42ff95addea46ab63cd1d7813132ef193a05f24ab9f8e8184829bf0538e013c459d2d906b16673c590e9778f5915f2edd7b0ff85b537922ef161f76678910db9d5e32d37425401a7da29d2ab90ffdf73ded79b6800db018194805520a8489031acee58e146e14cf22504ddd68e1523ebc2f149f99f788a4986069ae3c65212dee8649828e89944dbd8089b1a46f7177551e52a8b66b39b0fa6bde02d55766867d309033987f265b4dd7a8b6fd4c9c04d5884a3177ab4ea20adebe48c8e117fecf85456d899b730214ad313b58df019ffd6aa5ae8b8fcb0cefc4e2cb1366d17e9cca36b9d5d3a9d1600469cb9d6fbec2e94284c0e7416132c66fa6a39ca8fd4287cf9798b6e65431274f4129721e96afe17a21a52bea01a4b67a78d28e781b38e5b064671ba630258700432aa993ae674dfa8725ee9b5a595e24b034771ed30c0643d865a3420e62ad1f44acfe981690f1254798d25fc0f8788a4d341f8ff83a531afe419bde9fc9c9bc6340bfccfa62fcc6c6eea50d33592c285f9a112dc7475dd64e941d9a31b76eaedaffc915ac819064cd888ef391af8d5958e1e5993901b622590b11e212eb88cc14e9e26f6729d26c73bbd8f686c04ef950a4ab5d5d6be40fbf4f6f59224a7ab434342459cc3b8798b378a3de7a6d1a2c93d189acf162809065ddd571bfe7ba09d4cc2bacfa447a6f0267ea11a4aa3be5df9c24c66a2cd0a649b53b4774daee9535e4fc9747c4c454637a6a8e8d3b60f0c33f3f075e0b22629bc64467dadc73cd85b4198d8ded38210261e5c35ec701c22f83f861e259c7adf87a26207f04c6ac134d07a8bc3dbefa315f1c0acde845cf47e51443734c2184d7cbde3d1b32944d33cabc69c19690ebad782729784cb82b968b7b51cda61e8d11fff23af4d269faaa5f01b810ae0ad136aa34850d63c34a07875093abcb910985a0c7ec3e450d249650452d7645de2465e1fe1e497573b7aa222004409c6c0a91ce6bf165f3d920eba539bf0f9c0e5c9a979f32b53d7e30bc19260e276eca3320fa5cbbd0adb69d5972706818dc80180a44720b03572686fdefc7d788619d2b4c09e9e591a588da2cdfb9609dbdfeb8f380a367e4b0fe670b12a12ca6a8f8ee26871d320765370a22a3ab8ba5e960c2b4579928e47109bafae80b3b5d567e60cfb398e694508957f23b65fd2d022f93c610b90a1fb404804d8c27a71c0f627c5012a3d2c38b549d2324f9e7fe417a9e8d019c2e0f1574861fa0f362725125ba50cd1e480311477af2cd793451ed203afb07e4286238b428c6a53adb3f601642cecbd4b1b204c39c07b5bde1a602ce40c936164f9f44182edc14a8276265db789e016eb10a7452cd811d785c8c5dd3896e23c5df93c13656bdb45f4817579042f991ec8ca0a18437571c543083083294d7f8797311e6b7bf7cd996a087b4ccf3ea56587e3227433b86309c6922c1a491afb1cd98d94755e80a42a5f86019eb4d4d00bb371145b22e02a008403632df9b9600dff9e36a3c5a7654453146b6cc6176d581f0879df012dd91b86fd72ee5d4f6d36c45ed0c55d2fd165566e2bf92345b83ea3b5e289627a01a9497ad53b54741e7c5b34ffc45ca1869f9c90dc9620308212e423243c6e01124f0ba1e342c25f6d9084c898f04e319ec754eab52438e2aca92a3f12ea60282c1ebcd67ffce605d171ff49b25269e9eb93c439b2b2b76f1a4d5b9890f64e02818abc54b2bb00a7e68d47b2c49b4c59c9dfa3ff8f6283d735003f70c5f459210e105d2ce3e6e0f41284b607d44cf403f8e664958bc7df26dd69fb3f8fddaf9a7801161b43dcde0cd74618e25b318d48a19499c996f49fd8ab0a9011da1ae30f66b0b78d33c060871c46a3052cfafcbf6b81021f037caa7c42778908d73cbe473716ead0bf1e5aca5c2de047be7bb5a1c5d0716e44c8994119611e6c44acd28a78bca83fdb2889e2b569d6b54b7d0f87656dfbb605eaac0f9788379ce70023366b99765ad6c5bf45b03ee406d0baec597d3da41b89357d44953e4edcbadf7766faa87c1ef33af1c87b2554dbc14250775331512808c1b4e07894e10aa60a59b338d6f0ba3715d26032f636322bab2797a7f1721738099d85c266bbb00325bc0aa213fcaab093c2875925b3bea00da3ec2665cf66fc7bf40fb0b9f130ba33ba23e0bea68540ebdf8f1ca48a242eddd6ec5fddb9d488f04d8bc5eb8b317dcdd6e04b971f49b756b7928b4c1e9068330799bd0cc419bdb2bb7e8c82b846304f72434e6416be243ea6902236454272be90f7f03c5cf22337e3c8e1f084bac8e0e9bcb0fdd639d99ef890bba5de759aa14f2c3c0f097a3a543df01b54e122bf205cb7d3b38dad7782f540d5b27fa977044bc68c98c1eb49b452136dadc6eceb73d8caf6a44b3f89be619e23bfe0712f93e0a417fe087b6dbe22e7c168231f087e982383f0055504dbe9df5c02f4e51f232ea360a4c6d82f40cf33c00c305e848b34c18c0cd429be28d15e118d8447ad0edf6f4738179543b2d2e331b405faa48f5d64a095ab288a01b704f137ba7ea2b3d259182cf166a5c3935ee36dbf427110d1cc9da864ca4cdfd7688672f9fe9ba6af212d0c7de9a13bc44b2a4a02ab24063eefb2833f4e375eb2e345879878a8b3466b41a7a9dda04a6c60ce5ad41a4ba2e594466df6bd800a6e6e7bb5be6b2470e807cfa3a4c0c19e8a2c67385de6eecab287bb13605457e64536cd155403e1e2cf4b03bb2f80d1adb07dd6dccfef3f9eb66f9ac6dc9f52ef115987799e688e69985c32c9f6100203941218b84899a3fbf56417fa9b7cae03058ea98be6f97a41b414d3392d441d9d285a2ce4a40f109c78d2f016008fc7c8813378ba5d7b3f722740091ae01ca97ba0ceea6a1db8a8817e50ba53c909fba1bfea1d6adbed187a2649b9cf15152aeaff546a90c339b63bf36a2a8c6b523e7724fd8613f79aa8bcc5c2aeedf892f4c1b9bd43309313b1aaa5cced43d5b1910909eeb77ba5539a111970ea94c74f7db36c59b90d0125b7a238055a8dc86dc43daccb0dd7f3db80217b39c50ac97ebf2c04746014ec486f4034d4e05f87356ab654fffbd4a0c3c97b9211ee0c2e20810fbaad1fffd38a6d9a2be08650366e95c7557d4de6ee79082067b1cfb3880e27da7e5185a2c8e4c620ebaeea5f0f8d8563ca9965062461b3f08106987b721f8cf6994d9c886afba8c7fb904033b44f023fb9309f89e56660e57e6052b0b12cb3e813c854f04c42a917c0cbf629786af7e7553dc2266d754d86a613ba52d6f6153d1027b611d74a8d1e45c832c962ae6a51c99212bf954a175ca922c89369ebf436089f75ce8334730f7f01b237546f71f2867dfbcc00ae2751cea7677c3af69d080c35545a058997dcbf834c9a62cdd0d57b88289f64a02c5f218e2cdf3c3a9a6d9dfbcc638446141ac4119138c3584f47a40c11a54b24ef7f64b04f2767fdd1248238f63bb246f881105ff49a71360075711001009578b0932e5620514ca83547dedc18a9bd1d55aa1413199aa36cd8565a30f4dc51b76af24b4f542671aeb13383b3dd5bdaff4097df891245e96cefaee6836be81b2c9f72d4fc363bd15984118b3a784738dc4f700c4e03c2083fb9265932d05ed60b10ff48dabef74bc5c8b2e75dd87a75badf8aeba5a38b8f01fbbac24c3019de4ab4058d2e82ee844cccc444fb6465bf9dbe5405ec80064e94196a210e4de2296b5e95f288bc5ee6badecbd8951cd23739e3f8fe3a2673883251c39f05a51f970dcc1d3101b0214865ad0f658df667063f46ccf93084de15e5770da1ca8c7e1a4fc4d491141a7b689425e1cccb056e8a7396634ded848f13c7ebc0f1345f909e0c0a91ffa9880ff384bfce6f8caff2e470767ece798e51e9cce3573b87eeda7dafabbc90ded039dac6dc6e15ace98ca63573c5f1d58b08cf43bab5b2b97b1002fb3386cf55880da631a906dc84d5445984a2d8e36415f3e4f785c55211ebaf895561738b918b0b9d3524b425b3f0ad95ce3eae2a1f050bd2b4c7fae02f9a2155999c8ee980e39dd12495b2c5c5bf45a4b98ad39bcd6e6f8a426b5a8c697905bc5036ab318d19c9aae8dc4f033c4c92f832db1af8eca5c657d5c5c64f7c9f4718309320b8450a12ed2ed7cfd5039ece98e3acf84a80a204fb0386819a7f31418065e87a479dc777e91d2564794040e8af218e9cbc8fe13c6b625760cb2783379bfafb70c82850527951664884fff8f33d374093636eb8cd0f7e27629bceaf29a17b1d853bf938975bd26a93ed5059b61cf69935d81197fb89f8acb4d4e38a92d50cd83fa736bfd5e2e9a757d64ba8667519440cf69ffbfc86ee170e018614d781013f1e8c1ec65b3d0feb3818b8a99359f3afb4a963563309cf6a7c753824fdb73fe9db858181201d1d072f83231684f6a8f3a862a709bf62f6bfe9f26ea529168d581517efd0e42b29f60f49f2773a326ac8381ff51d6ba8ea8617c38f65bd22e92766915fede5a817729d6be12df09c68cac124308927015443f67654d1ebcefa37627e6a91dae8970b31a429980fdab739f67f8ee4f63e3299824a29b4ace041bed55bdb2bcff81d47293b7ae06c27ba62a8f14d17b9fc45f08d513e78c2a94cdf5048e35292f6c9d50e3d823b8d53b3871f434a9debbcebe128b45d1713b92dc545c5edaa2186c09f0eb8f0367e40823cd4d4a84a28928d9a5683811950688624390bcd077e9aefcdfd14f557a329ae13524a602601bc8da258241f5e104071148b0c054db62ace8af096e44ea20744f2b156443fb90e6d3820526b1684fb64216cc8f0465b5a0d97656c3a4c71846de75d93abe7d690513a722e34e115c05adaea23a0dbff5e88d14a3d448e7b5734db8cd44aeb1a901310834e99381230a4f26f1bb0dc117fac575f8398b98e6f8dc30cf98169a828aeb0159b47b6d91742f2c40a956e07a226b9804880c6e9513b8a48b7ebd04dcd75137933fb282d74d9ca386d64cb661db749ae5c5e2432c2e6dfc402a7b574acb02d4a47418698c67ec8ff139c981feeeeb1180032afe51b7b7d69dce02d6482f6c12f16c13f40d768929b4577cce40305bfb1090516c6283dd15d517b2e41f311cf55760d308b5c8bcb5a486194b4bcd22b04d39c8dfde7111d8ee9d0c92af4b6b21c2cb16f693ba5189f0e06393ebd346955c0e7a133ca80634aca3dc6bf070796c846ae5aba80193856d743f9694c3cd8962ca7a47bf7712933e9f6cb14265cd17dba0114e9406b5a554d3ab96e3e805e5b9c427688b84675c842a89c5ec7c5e83b16dd8c55eaad4bd6f5a34ea2b12ec052aec2b1b45c9ff807debaf270f6bbc9cdfff105df56fa81652231527a71ab95e6a6ee99cac1625eeb0773bb15945643f7781954acd617dcb5a5f72486944d43c67773e2bbf1b40f6143bac6c756aac8e79d53a95d63c95e454e2c30c2363a67a58d618c1bdee6fc144f74023c6b51e9ebc10e44b9e99d4bd46c3cb6b8393f69fa66add4b35a94352946d9cf1b1b62dca56e7c2611bc7076cc099b364dc2ecb47b19ccb1c89b481cd1175befedee32c4c5ca5519092b05beb967db21e5158738c4d54645e67ea266d994dc64e1c9560b4ffbffbd566d33de8d10e4c373c2a7ecc6299a438955c7493d3a882362ac0057e08448eb6885d32bec1d62296681ceb4967ab783aba26712fc9fe137e17901a6141339fccde5a3e70b716f6dcdd992461b103767f327a147b1ff6a6ef46333d3962c67bc4c7e3d03bf878871ab04822810b91db3088119f5d7fad51b7d5786cd4e747a9e69956e98669550d2024959a1ec64f45dd5b2cdeab237ef6d6b7d236f2cfb4cdb8005f01154dd2f500aeabc495628ee82bd3ece2626ba56346aa58a1cb945b09ea80478ef434ae93531f20e2da172fe5e1b3552447fc6ae92f327e4a0492c2b675b182638d580f196d4b725f0573d2e457db5e9e9947f0c1f35cbfc44047379fe5f5365ba077efbf88e263404081c958b3d4da5dbc8eb9b258b25f22a742b9046bbf4e78b6a0a5d88999f0de19af36824cf244c2a80d7ce931a50f4d74b411e7d643071b1e00174ef0a2ae97da83daa78811e30a05cbf8606d1f3d909a420cb465c93c3dc3fc47c5e6640d474df5666c657ad46a278884b2b558c9c0325b0c323b3edba244dd82924e53c11ba486a578784532a495047c3fde1a4bc6d7ca26406fe669856361022283b624ba7bce1fa397dc5487bfbb4af423ece3650023933449cca27760da60e8379200febe5b738749c35ed8598fb46ca22d512957b5a01f5e486320b03732168ea8fc7a56a5ae4840c203223d164af0470171351594654f4d4aa9318ad7eaf98940c76b9706df4a19650c0412c1fae34416df1bf03df958196de7775ff3bf08a95038aec41c3550795802b4a817f1816b3f2e5e031c52877a233aff2a350f847a9cb73fd8e6227e9e76fef8cf9cca3a7b527d4655cf8e61e7825fb8e93fcb76226a50c4c2f19d1a74ed84b756a63bc73cc72439c7cd81d01a4a4034d3231e6b5c6b0321b9dec2a386ea89c3f44d5718ae77004a40bbaf9ceb27ffef272f5bf30ce015c4f6a1f2ea341c8c4b451c1e508b65febaa76efc0b3a7cdfb64a29d7b4bcffaedcb5f4a3034be21928ffd449618fcbd0f4e1b092edcdae79dc5affe769e8ef5efc8756a0105e1555f9a38808e186148de67d399dd0d6c6b66a92681c3b9e29fd1570c068ddcd6bcabe1dca84fe2884e7abd5af9dee0e4a4691551a0490d289d2ba329043e7994762d94d03c666122b7660ee2597762526bb6235003afd97a258fd6b5463bb0deba97de0c9ac1c5f66d66011e85ffe15ade0d036863a008b7d4d6c17d6f32037c0a9c7f2ae19ed7976bf59e61f1936206be44c3243114733131ae8e2a2f64f54ae40bd5d027431b6b2714dc922fd6728cede307d0815eb86e543e24e7f70d3f21c9c5ef3b7f3389eacf4d73b76e0f0cfe6d4684bfe91e2982b1238c07fee85ad9645bf9c4567961fa3a584f4a0c3c8af2ab9c098d9f19948cd649c3af49f2f5c309b2177fe4458c6fe5a5f5c4b3903ab7f6bbb8d48a5ba8dc0aa42e6ddcd18aa53445f6cdc125ed136ba48be5db59327f75049a02baa4a487386488e95075887636efd4304c3ab896c22bb08995f67144ae25b225540973f07c1a66d2eeab4953a042353dfa37a074e88e1f8a257d2ec0447541a869391d2e72d4f1dc43d47674b79fe2a7d01a5f203e9f1befffe6ef219f58ffed2be675950a5915d0dfcceb71a58bd70987c5c89c7306d2a68c9be7e0a8b8ecdec051470a35bf8d84f3f1c71c17e05ff37f4e9fcb7de667b10507c174b894a958b9ed28672cdc0befb9898de5ac7aec2662f2058956f4c7dfed70812c40fe56342032932c0c960781934cade0675bb8258d412cd5dfe1d1839a74db71a997f7dd1fd9c52fcbb8b864813197a5ed75636c5b22787905f5b38af0ec816e8d6ce59171fab7c229a3ea5a23531adf94428510513b08edae0b5a7aa0506d93c7cdc7b16d3c97b1f31a4dedabe7f0b188be4a0de7adcd8b2938e3d212915b5fb312f855ae04d65f8a331774f5434ae64a0ee841e15a7bca2d38aa1f9fb50569a63925068b11573dfb5236722e5073925976721af70892fe7e455267a6ef79d7c2deb3d8511834f666545c384723dfb31017368498ebaa2ab85139129aa8357aa123c9e42ace30944c704d5e5eebd07aa6b8861cc62bff63fe6a0748417a4a2e1e990019d2dc45667baaf853236a87cb5116185b83fa931eed76ac00e46b8dad01211aad7a78391362b81fc8b00aa2767c191a0cc69d86803f084451bb6b3deb1e0684f7509d02e1206f084d62fa5edfa1bba91f455da749edff47f88bf58d942762440c90557d99fd16f42da78224fd07a8d29798b42649ffc1734a75cb4a91bcffc07dfa12424d25edb783c3fce75631836375c7ce84fec054d56120f6e2f878f933dcc95c7500badf00f5a73d2d3a8036759df42feb37dfb823164b935312f090f06de2242a9b4068131b6d09a6b2c02e7920eedacdb6e0feda725129b5abdf9bbecae74a52d8ed72a402bba3f050e117c44f875263e3f58a16a8704f7b8f089f3b6f4d9d1b29024f5cb6d0241a05d87da055623631cb84b38c19e9375825628e95711147b4d8fec8cb6857d99b9e1d6448ef086aeafcfdafa12fd4196333b30f1b0fc62b4cc0af43f7117f3ec4281bfa7e87c7cd5c52f55d7f089596a879d5344180a8ff933e82f2ea9ffdd7bc681e3107a02bf0b76514b33c0f302b16ddf153fc9de974ec54b7f013cb9f4f364ff9460a189142e6836a68be70447012df07738058f8dc185fa079d1805937714902276dfa24c589346af9921ff75cfe57bf39500a4067c08bc9274c1f0e6d337882e7b52e6a0402698e9297a39d1ba0f5f1b3b9da5c2c78aa4b3fe445de6a43f11bc3ac492cae61aa89b398d1380ed03dbb188a213db82e5fdac05bae2b35545fb43c04d84062a95b8bf4ff0645592c60c29c81c9b55c200570b088845d6560d7845be7ed7cd25d0fdd5506471f3abee0b747973db539d4530b423f26109470e1f225a40860f45df3cf586a21ca9a606220594627d982a49b6d8039cd6345e1f8f3e27267845c21e35e6d8caccfc92a984791406f69da6159deabe07636e0f13607548121cba8d9d98df0164481a034ad28017e2ca05ad51489dc3d3fbdfe1b8078885fec7eef5cc92a69b549e0d4ffc28aff7b406b86753d204f19f6fc7088772d8ad600fb1c3b789b19447fb9bd969200eb1febb81ce88ce80e57fcdddcf5884780ae1c50860dad923290c0810623d64330647fd143cdc8a4707525586c7c0440211887cc335364c1a0b44b02c95789e325251ea5e9fa8751bca2d8b229997cad52957d9c9f64a45f9d26f14986bdd41351d0408e6c36eb1e4af7db8e11a2d8eb63fd73a5fcdb3ce0fbb0f0ff4379f18d3dde760938108f692d8d564aba94b5e1cc8fc8aa271cb62cacb7f0403580d6b56a1318f77853559a781a6dce0f4f99d537412f9cd4c4ef55d0acc8263bd6e90701998dc30ea64d147d7e556e3006a5f3c60acb40cb746dc6b5089e0db8cf505004b9b4fa9aedb0411ab236f271c3b999916481d04a9889801357b9d955683050a78d36c2afbac06423587be78c20b7d646a34c76cb87e10b90b746630ba0f0754669db4b45799b2db39a8ae903512288e8ae86999964ffe064eaa6d1ee7f02209aa95e593850e84a411b691dd7573616c878af82c6c4454743f1d8ba2096018fc884e5a2c1bfff09f0c45054e21a192984a26f717377e4dfb78b632a11c98ec0f9f00cb92f4e9d5b1517a34993f918c725b9ba06f2884322530ee09071e1220e6036f0ef96b3630c01b8a20e23dc9b26870875cd7359c467ee15862208a175954619e102802fc33818037a0171c332af32adb49a6a0aee25bfaa5144b404dd8c6a4ce150d5c3dd063892ec1d057a9f0b9e01583ddf1d0278a888ee7e6453a74c1c72ff52bcfab00ba0c81d89a86bbc4b5c5ab0a355d54ea08d59ac5d04f980c6b3ae5c50becae5c209578897c9480084ebbe33147658a3b6b6ed2abad9df7d844c07beb31a7b5a94a1e995aa18b201027dc8e7b3318518f8ca172fbdcc95dd664e3eeeffeecbc762a1960a68aa093d19041407f8c1b99f36d6648aa028418bd62d69b2f2c965fbbbea3ab4d525d622e4d6bff0ad9f475babcacbb48665b34f9132fb73008235b1b936fc9a47fa5c9397af6b30b1d48c6bccfe67e3c8345a001dc841e9d82ce01d92792b59959a25d55eb392f4ade4c2482b234e0a8a25197369a94bed6cbc57457821b28114294e99fde53eacb6dd998c2260a165b893d85be97cc83b34a553d4946472c216c4d57bdb51bae8ab540148405ec98dec1c99f68e17bf9b8e7ae8f15c003b5efcbd530ee37833c1823c7ecf7400e4ad775329c1da9ff4f4b867f010f17065eee9588e33edff51ffa7c4a1b4898211c968414eb70e525de2b6cad1709b3b2f8904138e84e010324a54381410ab7e8c40e57804501c62ebaa08dc400acf61923f95ded73e97ca2cbde542603f611970347d983c6623f6e5e76c089c3bc6cf18227e367736c19f4eed9cd0d8c009b529744251042aa2a1336587db0a5f3cc0b3a4dbe97bb7a8d4c1a8222ff2ef2e0ce430a6eb3167bfe639dda9cff63e2d1a3c85d26122fcce1eccc0de85d5ccfe0ae3efbd1a55acf2044323b1bafdc990e893f5d8ab21f190828da7d080b896c5b83f9d385e2b58e4e2bbdd41992f52f644352e6bbc32dcac78bea01ec3189186983f00cfec1b87272a482929cfddc750300003d18568d03411a15c70ba0ddec0381e88bd60a8a12953444a28b9466f9cd06ec7a718c6a2a8b9b780cc55d1c137746a18aada8f4c1427bd141573107051e40dc0143f7556ea2e73c033f13f63413fc2b697220cda2ee7922c1580bbd1086c2f7951b0b73723675f7f29ad6727ba58e5b18faf880e2eadfe000ce7e20ee771f56155081798e009f86eae8270dd829b2ca8227799909b69d1f93f95f5490b2a7d0ef67bf9897664c7c911cc91d04305add5be660f7f6fbac30b75d2c75e4d168e2ad294cdff727c8a5797b3953628a4b5d23f7ea2db4841098661c622a6018a8372ec543bf68ab69ae7da5acfaae7a676f3a4f4a6c21ba5149d769a32ad6f1eb7518a31201690535e63f3b976feac9673d0fabcf3fe2dd3abaf425ea2f323d2726721e2e3d208816f3427ff897b50ea71bdbccd06bcfe658b7b8010c84db2ffe6e0c1323115a1426c78fc33617c5c2241e0d66acaf1fdf63a219809438447c1d56e08e1d3817bf0d7638ce16bb435728cc9221a473cc1232f6b5e64638984d71fb5329859cf59a28ef30bd71294d64bd268d052dd80c2c6723b3882e1c5d6cc606298ddfd781a7292bb1984949d1163403cfc77e6962780e3ba663c55826e6afae681f8495025e1bc7ae19e6457a786db8dac897e36e208ecf8bc8f7b6da5741f76db4a6e53c3033bfcf42ef7619fecdbce6f69b27efbf996abac2bf131e24993fc739f5f511c05fcf9fef7e16fc35942a3b31528039340dc6c856e9aba7075d5265cd70998544cf67d316a412850efbc06f3c098dd384e10c4ef03920e7d872c2943bf280bd59325786b52bf44aeb7a5f522cf27744b347810e112aacb930ccb17bc028561af375c538fc3cafa2d259b17d005c198cf4ee843f27109cbacd43d10f5562f49428ff0af4d8251d0a2ddb179c5abee7bdec4c82627bce71cf97e2ac33d0d9a3c6f93bdf52a0fc1bbda06df31a82111410529e0049660e7eafdc7ea4c8b4cc1ba34944a68c5f5d9fe1f61484675c54262c58453d159fbc8ec02f766c4fa12a4b2d4debd2a67681333cc3c6da6492eb7c29b284ddd88fc19949593ed6718e7840117dd67022d056737472359e6f177de81b60eb73998e52b9c56c4e4171157e9aee8b53c691cf7453c5953bc8a7749b02ad0e12fe140285993175859b6abdbc173f48606a311452ff98900d639f7c3e2c101bfdc28097454499bd9123e0798b8ff90319528ed58aa7016df8dfe0a92727e454eda8ce8c514b821fa9512f202bf92826f80130588148fb8abcdc87561f5d14fb9c10d0359b58435648dcf0dadacee98ca2a539fccafac3613244056fbbff1c92f8ec4da669232d6ba09dd64c05f5322ac3081476989ca264945bec9158fd459215302e36404e0c6641fb619f29c0282f8b1e5655da60704ab812e3e6a6ff3eef2e1e4ddc77ea607415a8f7b7091cc000846a9d3d142b42bf86feab01410c257b562970ccded50a2781db7f9fb14596f33eabf3da45566348fb0b71992e54fef5afa24e96dc68761869d781790a87fd6a8650a56cd0fad84159517991559597e5989151325ba0858ed975736ab55d70f6bc5cd117fd34185c64274c7a5a2a3620517722b3bd7ef5616fcd3dcfe1d765fc263540a710ebdfd0d60fb4a7c72ab4d62da90044fd1aa6261010cc38177c22d0eed3d4b3e0f7d42c2705b886a5fc2c0c28c73a67d99baa04820b9eef894e688835b27fdeb3043621b9fec5fa9013cb814adb7b5e7fdade48ff00ba0bf7ac6624e80412ca8d8f6622541149d529b79ae77cc5be2b7dc24322158d6dfe47696c14cee20a6a530735fc515446efd81f73313020faaa665db04e7b04c5652a37d16b219638a9369899f7eeb678ae0a0fab385dcb83218883f682816851f1b94eb9a5f70efcf8ce0e2f48fb5f8507bf2507e461acd61cdea79cc6c056877d86d3763783ad952d9dcf036905338badfcc19d2e3c191d242dd6476ec2c1961e775a8652be5da7fa57c7ad008ba6dae14c4fcc4e63c832360cae0580c01364b81e71372e994f14bd54522a77c51d2fd944e19b204bab2cd8fa886a3079c2996835448ba1b4ac4c22182fbece106356347c7699ee5302f7e5f1f2a8842e5adcccaadb8155b61b2a2a1ff7528bf063e1f37b1b2d85b1d9685316c651a5d35cd50de6b74b0511e4de212632d4ae88d76a80f5d690d35c51ca36421d20e32b5e2a62eee1386b936d93d9eab163e509f9e76ccb98848da1e59f96a14ef2119149001ba3849455c50cc9856078b07c4899d19dd3264ac26774a6a5e1c9da3b191092c5d04032c98d90b20d8d0cd0c5e3ce21100f05b09e2b30b18f41a011c7e8c02e0206df253fc4d4a309bd540f053a7e0bdecf6db6ed3e4fe4137f2e54e29ededbf0344044e0426043a46d8baa45237863eb18bdb0e1a6d0c0e832b1932b4a651372e941cc0ae30159a232ba2ea5524da191f3977b7aebbbb438d32e76ea3cece08f4ebfee8ee1e227e307493dbe7e2906a2c72bc7642028b536c9b443720c49c73ce399b4dd71035b842bce9e17036c4d34149237095b60543b90c428de06b072aa5747235c18ce8dcdddddddd599c100484c5097fea1249072774d7b5e352926cfbb1c157800f93f37b9f0082eedded533b00ae0865ec7c7e7910915c43d49f77c0520d873a130f43270563c6699b13d387058428cc4651318e4abe04391589ce8b8716e1ff6a14f4a0226d17eeb9636f6cd064e9c6ab38aed92541d58d0ca39e33640c91079b7212d9b025935a97291368c74be10bb7f032ca5b7b1578bc0addbc0a4da253ffff73cefe2ff39259aef60687ec8074dfb9bbbbbbbb33d38a3f7717110fdd742e281fd09c732e71ae21eaf30b1afd5022fd6002740cee54654ddf0084a42a1d2f3c4a2898881fb2506a6cd02c5d18873253205539ae7244f4d402f46819968d611d3d457c2d058a0c12b426b4a616182f9e9b73ce39e721700d5185ee102ef6747cc70bc80e3e1826313487602e8bb5d5544311a47e80a32c56c0b2ff4d1796f822fbbf544cd46d701e28856d44ad148dd4bbbb3361247fee3c1cabaf1c6a748ebe240ee55a36f7b9ebdad5488e3312380bbabb9bedeeee7797415a71b71450f0bb15d184f4ebd69d7407aaafffffb7f03e57c53aba31524208b4a0cc60150ad6148bed4d09474751064b1c4745481a20978b5db080ac1e80ffff771fe9665ce370504e16ee3157986d80cab22baa3b25c5c1ffffffb89f07a0b75e683b2c913dacdc61c530bbedca3244ce1a6bd570c340fec1d8b6159ff3bfbbfeffbf2e86ea2a41ee5309b27628e118dc5db86b723d48793289cf5451be4b3536e5015e3660802ece54de9cbc4c8496584471d4a4f0407445dd5955038bd4dddd2d7477777b8043b8b27bbbbbfb0d81bbe0f717fcffe39e3fb5aa98fcfde39eac33ab78d379048ccd60be2d2d8d2f280024f1344269162581923322a12a8718a1453d81178a130fa7144a1222fe622486169504a1b542a1d5035454f72e97c2972a4aaad3fdffbf0ef6a274b7c3a9553051e909c88c5f5bf18e2ca1902754931330e962eb049873503013cb32865016838c0703de44f024411dd5e4b426c6227c6cc0d4891abbf30c2c511ecc63ece5ebf7ff128b2dcad7fbaa5269ce5ffbd409acdd436bd7dddd3c61db4c0ae3f7b96cd3d08d5d842a605aa3ea31d1f41a1113f998c94b05abc405a72d71e6ac6c203788db7a40fe2609a3999cb11b81e33231846326636aed46026b3294cba198e8539088f573dc8b50cb6421c42c22596143c44b4cf16862ce48a6b5245230563f470008a78e8478c5720c8b4515069a7c4e60a659c5a57684b57a9a460063a32d633f4b2762486454a8b459c473756382d68698f17a991e14cc72596c9ef3842b1b6c2a68a458e121f2c6209da196259528916f81bf7755b4b1b86bc835444d2a4164c53e1076d82c92ecffff8716d2eeaa2460cedf9c9414e7e2842c0766ba0202a0a7911e5828789a2458b2e4ab7a489a898906cd7a7ed47a926cc0a435cc5648686519ba4becfba6788722d2dd77ea8c23c8ffffff7f0611cafed8d0c4617b6128872d8d4628d412791aa022a91a2fa24d6d905a31e7547141b2ec4a86176596da8ecbf37f25c35008f732597f382ad264b8aac44e0e66ffdfab4e28fd25ea76bbc6918ed33075baef5ae652f8457c1e93c63045fdc0f5f507106aa0814e055497305e52321b8a91a3edb995c3a9845962e5d8f266d9e872395e2ea7a3e0ffff29801f897d03728f20e49029cd14719d08af5aabf8e344f4f63403d4dd2da544fa75bf6e77e7a7d4c78790415270fc0e38421efceefeffffe3ffffffff8b333b3667b725366712bab1cf99859d4dc5a1095f540081f3b49a617a9684144df9f3a31a759f7b4654a9803342330763d45f17a7e7dcddd5659af2e7eed491b34284066405b4b2428d552f312d372e3fcba5564ded020919d2a41978005d9669c886a8aefbdcb54dacad985cb861eeee41ad1ceccac1b01c2ccb41b41c9ce6ecfe12ad490e3858933f9559f34cba05366b8c8d38c3b38286f942e536b3c3a2d6e5d3b33b12c0862135a223b0444cac022194cc84385a6a6d6d0f17c894160a13089addd813ddddddfe0020167d2070a4c08cd9ffff37fe477da460d856946dc5e40b156b3b5882314b2d0f0ba5b3f2ffffed7ac17ddbf6ed0676772f61907edddd5e6d2ed7cd7316413a368ab4b27214b9589c50544e3f2cda647660a59b0ff1ca2a69d3a29e21d5288105c3e8921cf1361f30074a656faafbdc230b890c8254669831a6f0807585cb8b8523050ab8e34fb53202cee041914305ad2d8d29a22d0590db569130d8eab8bd562752602ba41d3b96eae4a88c843045ab6bb71c13a124237433d5e61ce170aba3e8ce8502d18ee19110aa870edb07b4a2235c57473437ad312aab4e61d0f3dce7ae2a5729c70b1b5624836f07dedddddd4c9d35443d2293ca0cccd83bc86eab7c6291b1637503ea15021b4a0e59d0b0abc57186d8a9700e35f8ffffeea6008b434e11286d73dddddd3d96c5a594a5a07d4899c2bdaaf765ab5490115e14b053a9d0798547d8dd181878104b77a1dbf7c2bceeeeee36099aac98104d6e4c7afcc2ebe608c2808d6109c9c2449a6a6b8c2da9c588b3163749b9ff77798f8553c27973b286e6158184d4c4cc6c268a654354416c4e50e290a2f21b4d589bda4c7d3e97bb004f09cc5b0f1e166c45264872c49456c6da9aae768af4e90a9dbbe23e172715a65d80cbd0022c39729758b645767d4086c155c2a4bfffef36ee73d7b22b9817bda00a5716ac3c5734cd0c704c4c211c455c536609528d1b8b98941b6e34eeeeee1ea4c7ecaefe463de175fdffdf916a0e3b4d78074bd350082427195e145ac42b4a50be5672b4459fa0041f1967db57d78bda7489d1203ada617c0382326a5122bb6a67281c63c400a11d67687a7090b4aa4922d2b480caf0d000030badabc26d0b84e1ee6ee04fb532ebf9b54f9dc0dadddd9ecbb9dd56673def02963a2cbca1c511f94af0230cc27a884a76b74ea772901ca1c14e29cdb1b78dd373b0b73b15bb6fdbbe2670eeed59bc8312c0f839ff53c8796899b5f5f373d262a5228467d20e1a998cc8b7297e2fb3f57b1919b97138d544e4258fb60839e79c730e36d71055ab2bac0c8d4370caa124e8ee202d557108f7cf83ee74ff544f4fddd000ee332d5a237777b775a3d5786425a478c504ed5e0041d6d5dd7d6bf861ab083b5a8717c9ff187f598a90cb950569c09072a6947070a11c71e415c20d99c8b74abf5f6348e1150053ac16219ea866140842b3e9110c961e2ea3a41659bb23035d185bec12820ac80d98d6a3c64b889f96168511fcc1afb625f93a30c5204cdcaeb4aeea668019b22ac5ffff5f79817bb92cc2f3ff4f8638aff1d55d17043c72002261a8fb767717d910d5edeeee8fa6b1f87a498f6555a76806e124cd209e803da10e6643340677f7bdefee8e5c43d4a432763e5be4edab1b4337fbffffddaf8c5ef78a3f0d9182665c9c4c71862d78e8503b32956649baffffff9f367131d9809111a3dac065f6b293f6e5c4d49ef08ae05283b7cb59cae56b07b730560fcd22d3c9babb4be540fedc7703784f6cf8f028a514012d30428cc82a0cc5c91492ab86a81d5b1863a4942246081448912eea815c993a2ea747334d1d1394539725a4e2cfe5ba7717dcfcedad0e3dd710f5cb85c2d1de8721a9ef428921f8ffff419ababbbbbbfb757d8ac39a37171a5126443a450935b6d624c1a335924982e85eed50062d8bf6bf1baebe9692babb3b01bfeeeeee2efec0ddddadbbe03e776d6a211940eb1663c3c247cff8e8ee6e18c701163692805c49e308111722824186a313c3ab3521d48195d271387159dab3b83594210631747c6dbb9274ad212a49984b520693a0f5c8c046a01893ca7e94889246a197cb8ca3b116a9fcf9b0eae305e73e974d21e43e17d9c4b184e3888ba9a18426755088258938084d484f38522fa849958853e130a655d0aeaac4ac0b820ac90e34e516978e2d1762335961459a6054e4dba2dff750fa7b98f6d70df7d617a0fb22845f863d17a9fbdc30ac5757c333df71001d983ea16eccb088d692a0375c86cc9c34222bf7d863d9eeeea7a1354445faf0c4d4ebae8a5fbe7d07e73e979d72777777f1644354d7dd073bcb3441a6c381b091764fb5532da85af7b9ebd2954d9405b72924e65cce3d455d7d040c8a9f4fa7245e69eafb5c668c7694cb7927e71ceb20ba4f2ba6aaaf1a344ee4887c01a88c9a9c44b5a92c916f4bfc3eeed13201ea42b7bb3b4ffe802767f7b9593b5478f18e1c093aeaaaebb1ecff3f0eb4c6316db260afcd66029bb73d3f9c9dcaad58d3af779ab5becf7d1ffcff0f7f53c7e3f4b5aae9c69db250f29458111682485f404ca66d05c60f5a8c48b743bff6eeee7ea7ee73d972de34f0b5ee06f8b9bb7b560e589d6933a2ea5047a37d08c8d93ac113451596d680b6ad63949b73c4448bd57c565d906b02bf1cd671cf6dd063c4d6228443c7716c67a90cdac16205aabd129aa0cb4008981d337c568001658520f159f1b4033d6b9bd3a1f6aadb73ce99585c43549d2332a904418c1d837381b41a2063d6e4a0608bd210f18f35241951ce231d3044dc2aa802a13bab3ee9b021aafbba1dac991cb52849dc943020a209814a488770abad6a4651edba7152bf8ecf643e581daa72857185f3fc39cb6a7079baed0b522742c38b94c54d638495ad240515a13c4b6c803eb0383bf981026b4a6ba9702c4d162d962e963096b2ee9635cf7d77775b78d27577f7902ee79c759ce039c7358a309bf3fffff3ff5f6bc886a8ae0596d7736f10754a4c68a1ddff5fe3780d519dcf2f68f435c4d27f0c6c63b967f2757962d975f7ffff13d23544050a87450e493aff21ec78ffba6705eeac4ecaf805fcb9ffbbbe7fffff07fa5a4354681404901428fc3ffa625d1fcfd5a0e7fa3e00bb39f7ffc59bcbb9f82d3701cb920e91519bd57303316151235f3d2fc1366ec726f0a0c07f6c4a29371693668c128021a5ae629a244c2db346179393e32200d48d8905203fe2737e1e1f6af089110baaee05518f68208e53104141113c85158d58bacdf01a82fd1445a74a23da2592ca8b3403800448df7546df1a1e20e30826802e2b74df5ceedf2caf55c8e5fe4d0cdf2197838a61ceffeaa2ff19fc3e83ffffe84f65fa20fdfea36ee75cb6bbfb757bf86bce1977838da1c49c738c8b8e2c1245ad1929917fcb8a55c2c8e2643b55d6958b71cade17dddddddddd4bc75fb78ed7dd59270461cbc0f6ef36c26b83d9b633d8cde5de4df1bad6034e5d3b6123b06c182d00bbe171e38da90c9382e17577f728d910d5cdb9bb7bf73ba2aea9859006a91e98405977f760710d51758ec8a4326e0d41a732bb70eedbe7b62a6e486013808e0edcfceededd0d455a435426a9a6966f8076b94fb1cdb0ffffefe3536bca0d581ecc22b1a6ca33b7a0a4300c3c29284f584ea316512ef4e3c3dd1dfa53a7be907eeed0d5a8c685a4b98c9122ae7c4a91da92310684a2851a2bf6d4188e0575c58b98540a09610fcf17b34b384622e6634359f562c6cfd5aab61b972414a78989a60d2385adae1e62cce248d33eb53f15aada78e4aadc802039e79c73d6a08c9dcf2fa8869da897a059fa2cdf8a24a2e748c19992fd7abd2483a21a6605777777ac241ba2bafee260305d15eb1fdc2839a19376f20324f2299a47c1291be48e93099ed744d10570fb025e5777f734a887b4e8eb73f3b7de7677ef24d710551983d871ba2fbb6fecffff7f4048e2a425343c321369b258cdab0413d895b16d82a9f116c1ebfa31e20e319c707777c32eafbbbb33e0b52f3d966d93c53544d5f120791cb91a4bbb3a417665a40063f38cd875a34650cb9442ca9929aa5e76a4c7b2dddd2b6879659a5982bd5c2ed7cddb6140138dc44cc763e9f73e5dd9e5720191e5a8746c1d884d01d0ca00e31904144104511c89133d96761480071cd098cc8444441a0d06a36038180803c24130100c04000000104030280c40b2280f89f20d9c00425aa3e6feb08598f161f3693823c061f4cdb254cb6baa861acbdcc2eb9c0a8d1d12ed33e5872120d1ae40941a41c773474d8cd22f5d081e1fff1a4a156a8a5eedd5368169f61b5a5f8d3aec241e80b4b2966db253244b678583964ac2f8133ae02f487e7856327a28d96ad9b87d744155a92c08135dc43dbf98dc25f1d66eae29614d7a975fb5af9b7c1a20a64e2811a8dc01cb0555325892dc50f9558be301234f1af88e5de2180766148503356925107639e2cd59845f28f1e9e04d663729e0887b0e28e678e61a27d1148ba152940387f65c4d37cd24bf71ac327d31b9222c6cd196319f6123a5bc7ced1f70b3123b36f8882b9d052f0ce727e62ca438924bafaeff50e143f903e0a6ddd349d2c3b1817c344a03998fba1b845c938bc46638a754702ba64312779cd6c5ad654927d25b927598f2a312c76c4e88c16582e3fdc4f8c3d4f5e1f9ecd662367f259fccccbc9c794bda0da30586f8285d1ee6a68863abd2826a970323e21d65099f9c483010c31b2ac5859f98dcbaf721daddb24bdd0142a7d31ac6f7ca1b76ada7525ed28a7fd6d0b243c7dfc4bce12409fb3afc7d89e674626bdf84813129576c1e1c7dcdd524d90105b992d17a938c6b71d8b72e59da57d06d78a42d4354220ab016cf7058576e4d67146711feb10a8fb5e7d8f48572dfcdeace1d54947d3d84111bab409289a4c9f5cb5db830a736848631654ef1bda46d71b2dc16765de5d9fbcb102cf30814d69943bb43250687c0914a0d8143b9ba388858b4c0a5ae858d7ebe01c6be71230d15f7d5533aa983960a8aacc0e504218dc5a3e85af8fe39dab6d0165add6a0525d69b5e5dd42ef5c5017d95272288ede689b9183beccf24a86e6494e10e8369ba50d022621716bb14817a29379788d41f6a08774e2c05050dd4901dbce20af662c36bc9f8411502722b024fcb2cfe87f119abb31b979bd67b5c079896d265b79c6d89f29edab27c2380c11b94c8de3b96d12c2a5dad1e82ff8b96abc4805ab1731d93d6b1dcde72bc9081578891cbf9e71025c9039580c0a8e200183f6cb1229ee7b7507f0089a5f6467426b47b398ae79a5912bca862283b86f94bcc24abff3b06d13c585fa28d5c521c6ca1cff9c153c774daf58c24212bfa3ed8e581f6c798f32985de495beaaf9489f49962e245b1504975cc57ee875ec8f7e76d3c852616fb69324e34ff58f2b81927dd9a7f77b813def14d6dd5f06484358fe277c59540534150d3bfc178d33af1591add67ff39d126535283527221eae9d441f9c799f0410f4049c1355003f8594de712d2be4ce8a613ebe34589df5aac0ce99de710d6e731a33a70094bf79269e0f6d79f1f38a0c15bf2dfa4c061d7e88702cbb6acc43cd12d4c66efcc0d5dd58272f2eb770e48e8bf22e6098a019085c20b9cc2148dbd76aeb16cc0479cc22b95ea07998232ac0c510617cd109934f95ad19a9f83ce4d10059d60bf617e881060afa327bea5bf610d69c46210572fe7f1a0e7a481b66d0be534e6cb1ba17b9c582c7f0c981f77c714e0d8d18a29b07d007e9868692ed29726372a4cf10949d826a0668bca8a57faf1162a61c0fcad16dd32d8c087f75c1fce77e9d4d3be713e4c69628e0887716a590a11de4d31d7a3380b53851fd818cd8e0cdeff2f55426bf23fb81aae1c24c3d2fd0c00a6ac02e02929b143a656649eddb7ffc8887993655204dfb2342eb8a8748940b4bb200e537b88a7941cb9bf3506d6d1473f12ce286e21c7f32010defd1e544da2bd4b09a6ae242d9db29adedce5e433acc3e639191e05f9aff1d52995515fbc25c02dc78f9eb570a204b8e3e6e4c593c59f9033a56fa383a22c86d829ec26adc021ba586b6955dcb26d15dcfddbeaa0a21ad0ee8e768807444bb9e10fc0478395a4c8c61288bd2504b259179117d5f989602d71683eaba88ad4929570b679049a2ce49d5b95237958aaadfd5a72196c7f7298408082575d4f2b49d813565cd83b8a45426571c467e39a1b5df35d35475a1a7411ffb969196ad4608e08f04420995231008903aa003082022b1c47d5e1c44061ca61c17abe8a5b0aadd124cb7916c01eb580ee4631657b79d8394abe536009b2f6937a4dc6bf5d19ed4e2a880b04162d7621b1a5103018241ec074dcf30d510aeb4fa29f4c04879c5f524e087918b8bdd7d59a4e2bdc51e14feac871993430dcd0e2db8b4b9e2b6e038c84eaeff283b22018e81d556efa28afdb3381ddd5f87f0b29faa781d33d336dd0d20cd476efc872e4acaa5c9c3cb93d87d3f9dce1e264a0c375681b90bc806c577ad4aa32e34d3155ab9cfa9247ef8e9b1fb814419b061a5a4c08e59a58a65475dccc01b3f815861fc038878d17ba28706280220610116008024a600090dd4cdf3384e86cb2568864f0db9866113b6b253205c5180967211c411052887c63238550372d3b7b9b58949c73a4df39a55319c06bfc927902a052a38da43fc89de1a0add9411c04e7c1cfd2c7c9b07866f9efda780b3e0b41fa684ac22beb6a7e198cdbbaf4eb2b13344cee6db3e4c2f3cc0d732b62b4660d934001d4555045e2b794855ec412735c0733a69844952c66cfa8b68b7acfbad691b9d10a3cf74d501443b80f59ef8649a6a3f5c0ed1ac6919005d268344dba42970137b219c717b747a22e4182c5684de7b042fe7cab7760e1a92bd829f1f8f15b15c273aa5de250802b0850713f9c0f22ed8f3f4361b7b5feba9f72c38287ad1c89a3bf28e342c52f0892fb41508f23329616b80ebd33bc176012bb336ed8d5e3ba7d426d8ee9f4c5c278e6a7b67cf3caba47026e587f9a46fb7c9ebdf7212ccf1df3226d9e1092b426b00ef0b0d20079446e4b6a47821b4076c8f6185b2d548559e2cb9dba3bced0a2083ace25031a449f56463741c1405f66ad3ca6bf6a843006962648b031ae00127b92ebee69be231d5107d5ccad75423aaa9f95c268ec721c0a8ab82745ff3bfab473b21ee63cc0f48b1c52b8c35a56adf26ea7140c3a781da9fca913216ca37427fdadf75d80c82bf9e8ae7250e1c73c1239084909be9771535d0ad157a9614012ee24bb33f44c03b4cd73e8136d7c560e082b4553abcc95e41c38b632b2d73cf17c32a1cfdc21ce79353a4a1780a2fed9b9bfdd1328af0d3fc17176a18ffa29fde2eddfd4f238aa542966375dee3488128c2d8d50fa83e77006d4f6484e1465466dbf84f91a2bc483757ab629016c03668df00304171fbdf3a65ca396596d843f7fa5e6e8ee6be526a9e6d0227c5ef72b29f45f42c73b35e3ff5203be6a03d3267538266e9f337181103ada84127cc2553001ca0182606c88754224ad0004379ff746f1bac1d0d8380fe15ae37d0db4ac5907e45a40e5118f6f2dc1209fca4b937d97c088cedcf4aaa0761ed4115f083e3545890bdd9aaada34ab49c4543afcb6bf80bf8e3a7528878280df3f584cb69fe8d8ec2710a6db4d7caeda959dc5855ac59c3ac5e436699e1c754ff10bc5aa056dfc8d8cdcd42baf1c35795db15967196a8b075e0ca0c24025d20a746df237d20067f04c2156772543e1c8baab26c4080e85c38249c186c4124292226da85556e2ba104b058b8c3ae584dd0b475bc40f55f71af3746ce47599635ade0be389164e65d29120cf6fbea8e464f4c6cb63f3e062b4502dc360adc5c18fb0089c1becf86c8fcb177f573542894c06aee3c8691a5614990a257a1216f86461f666ecf9d1425294d094059d20a663899ceec509a6bd290a4de444319ba6ee6402e885f0897e7686243559c87c7b5b19cf761a143c1661984fede509ac1ed42496b3c9dd54a5e3864d323bef3a358d0d6d03a518d14c5e3600b452c70d7e1dd263b1cb7cafb72a63d50f1e4fccf8aa528b64c9329d02e4e0dda91c1b76650a44b0eac21e5a5836d2b7a617db11d8408d3cc63e4e1a3681160d3ce4f3fdc18092e1c0543627186ec8cf05400b0869a5f123b197cbba0e8dc5eb92ecd80e03dfbd7e1966344cb1683cafdec616f38f393b71486c2ac593fa45c2e617fa90be59f403b5b51ec2deb019412c2ae2ae3d82673f12ad802af5c6886e2c0418fb98241b07a782cca9a7d07b0b3694193640b46f0e1db1d569d112a084de61029b0893a07dd75ada92c0217d657c1fe2485307a6cfce812fae25807130e07dc8bb8bbb4bcafc3e502cf2a0a158805c1aaf32334ec68a49312eff7133dc7bd64d61016a396e257cfda66d731a8475e93e063424debc4c51b7e3273fdec40cc2d96c406029714f500cd542666941d057e7e403fba30b1b541efedf95281e2b9cd486ff21472521800a025420608412a1f0e27f3e84e6ed9e6612d050009ac0513561f8b4d48a6093dd8ee67e6bba24d9f1b50f1e141e24e2ebee0eb07095fc865bfc5a9605c2bed6749f31bd9b5074084865f9ed694a5cedb7d40fdb853f394e3ae84d1f97bf743716dc6da12d4e528eedf11c7205ba18dcd03694601d4071c5e2a37441f7cc77a3800b375a2cfce6d71bb397d028128883ea0c7d522fa7681101ff49e578ad3416d5fcdb09244416b084caeeb1bd2bbc503e65b72f53ce41365c10d33a1297797b722d9c36e5e48ce165ee028f9a59e20b1523206880c30216ab1024e013ac981b84fdf50517034f989d3b1f4a4b9fd7585788fcbee4f57fe42f1327a8b30a852daa9c93a6a4e4ff7031309250fc6957bb494c12e1f864d575b406b0ee36a924fd3302fc10f7b324d4560924bab63156f484c68247fa67b875509e7423c654ea9deb81513b9655a804afb9b9e3a2e0ef1666a1048d53fdc3e5cc2e7c44a30f2177d785cbb54f0d12325a0b654318c37968b838fb5470bffb9b49d2854948eb1aa8679c1218198d49d7f36c47225d0d7af2b1284e50bb85e3cddc7140107eb548220e2d2cd134981c8f8389dc8c0180b8294c3ef81bb45beb3ab0dd0acd8d9945242de45c4a52aec87d4f6f62f8c1ff9e1e04374d02466a30136ffd3ecd822a27a6306281ca7956b9fed5051dbdd5f0b2334bdf7bae6b1781f4067956ad112c464c930e4e8c08a2e70a83306bc7d4cc8bf8216f75e50298793315453a30d5d8155e3803968a4b958509217ef1d59bc61e5f7903b62d8ae1f12255a7b9ba056d4eec2a38b6f135c4b178a86bfced629c39e3586cdc593bf512fcd571f9caa4676f190bfb138b2e0f33e6244b152f2fb07117116aee6257cfab166984561a5696585b3426b8b48e0e4e42ae161643aad94e0df0b55185de3eae85da364a9c961f69ade40188684569beb45926d077ba336d9aa89381adc00893a01a20bf19d1858a3d70f87344cccdc7137d511a0fc91d274f37cca9ded3e0b1dd340acdc7c057779fa0f59a541fd9c65aee60ee95cb7aa1f67635364e43895b277f7cb0670ab3797047be5504aef6798ac81fd5a6f10e5da72e269177600adb9bf90a8e98120c783f0b7ede9bfeb205f659a50cec2d1ea6dc2e15e00deac8e889030e13e7020841dd5a3151dcd9d04dfa463a148b3a7be574f0f3bdad9a366199844f580fd1868588e86161bc16a28d424203a1bda2abc5108f2eb2155a418cc89d8c1a0e907969d11fd9eefa680462de6603457901fe7a694582fba8492a8a340a61d5ebbe90c255be58f0d4dcadbc867e9401b44eeef96867e64189ce3c4f06cc3ce58a6a450ca68cb8afea5110c46d9a95298940e57f16e382b772483222dd2fad3a6238c192eaaf9fa993ccd6284463505fabb59cb4219837e467b2954dd4d94af87f923b10aadff963951b3d5546d2663d0410bc4d1f82ab2b94ab270fcaa851065e46d621fb5727b8a8139b66681038e461daf683afc034d9bc55196d31a2a6368d7ace4de74ab589f56b26302818830cecbc16841fd3561eb65bb50693acc8705d0ea178333e50b77b4dc9a13456b878ba0ab849e78e648a05429e5702d9dea1e0241fdc150e93896e4bdfbc80c11a11db4578000840fc1d26b38c11efe2e32584f7059318402ada84b2ab5ec328ad28a310c4dbea9744cb82b5247306d31bf910ebf16282600dd8cbc0d804810c1cc1aafe2daaee0feed0d3516740b495b47e48737c41314afce546717f161b7a662a188dbb0a191cb7c2199ca7d2b7684f1355f1083aafe78daa4ef5ca60cbb5a7b39529af5d3cebeece77c55dd4ee2c01bab3a0fe02e2be63405444069e157710531c36a544086b7ea6d938fc18294eaa64f2832c35c5b00800c944b0f2a620a7ffde15c6b30a11cb520cf4d2efff7cebbaaac3f9b818943b2e1e512773d5ba708704f921ef0cfd160857da8cbcf850f573db171fbbb83dd7a7f7e023c891957a61c18f192e072c33a529fc90ed1527ac96764b344d2f4bae351040327bdeab85b6b73409958a754324e6e96353b6d4f6e9ca63f75b6b7ba98d8659edc17d0515b07f210cde27366988e5a13b08917a5edaf2c909db2bd577259e600fe5ec3524e766bece608b15ee43a14c5256829e05bb9eac290395cc5ef6ba750cc6c7468e03b2f6c5eb856984144c0b93544b0d2f944599753ca003f3776706562ee87d67135975c719b5e8f88b0bb94194332d88d28bc573c07b1c29331698e733cdb079ab1f032c3faa6ff83416be14b099d5bba77f2cce26536b5d7a9759d06add31452d8ca911c1f64d576ce0b095e6330b5b8eabb5b3233d94f6860b3657a9642a8e285ff13aae84842622f71966154b36d0fd1756410c292c45c5c4b76aa144583850510f9c6cb9247cb1ea77402b2459d963158a9449c6d79671880b3056b5a01415718e6060f1f179f39274a5d78d733ec6e974545eda8b5254df56de852a502c7682d01b40507965ef2f6c50883853758ab4a13982397b58857158ab9259726c2099ede66decebbbb7b8dcedb231a65ed49419a3077c64622d2523369400a90aedbfcee0b365c818224dd4f399269c5d832318008f0039fd8fe4b2c0a1fd69584e904156cce1acfb7b09e789a71a43b04f4a80c602a598fa2b409efc0fa2dee90bc8cccac6b62a5eb55dd5b1039806f717c5f2d5b5a36cd0726747c4a9e1eaf77f3120ac8fc9a0c6b925c9c98820650a4893ea525a1863523906f4afd21dda8c22fa2764eefaf724a97395a6abf7145e4e402ab3025496208c701f3f4c587d6d9325c0e522865d24d45a6b054abc42a3c70e2f057727322d3e4a38986e690a7e803c2a731c1a98c451bac3d108c9766b3a26eeb4344a5d05b4bc661e057bdc03523097f3c5d6eb525b0997de1890420da63b6dc62b49dce24da6172cb8eb05bc70fcbea09f80232e2591bda93dda680548d3342c4de651ea050fcd3b43217b044a9f7b68f09b7a8b2c05e61fe182ac25da3d8160a68b28f8d2c630ab3cf7c23ceb4edfa6a42405e474041fd1c614aeff494291a401f7738097ce9c2495ee6cae155494e2ab2c4b603dda773fa5df625bfafd21b9d69b42618c37042ecd7caa05e7b66a51eaa5d9f2613cf4368caa528b5615b36910d7c601d897d062a8962f656d146ca22a92ece270ebaf37d973c83f6361db58915afe89e177e1d07222f4e0d566e100aa2b07feab1118bff6af67424624f3ccc4963dd9d144ea3d1c8062a12471cb5f4a57e2f17b180f4cbde980f85f815937c0669837fe3ddf826a19ca0098c3220a2fab836ac96380e3e236c3175b125cd8be80b4ade07e67dc0a212509511c52b128ab3f275e0bbe348fce977abb37a62cee7355324f0509f7b419b5dfc17d22ff81458396f58e0e0efac8c1d6951de2ae74caf213d03921dafbec78bdcd8b8595d17efaaa23e63e071e82c94e5e21839c368f3895d125bb4f4ec633466aafc2a14e7f26a78cafe3365142617e4ef132c803140ad8ebe471518c53ace4c89b96409481ebb9c6036696f068198c53d6153af0f909a3420964e74cbf223db22b0944e82019c5bcd67b18bb970db3d7407de5a8255186e4c205210bad7501fa3b8d525487843ff0ddd8d064eba4a587e84b0d69f67ecd9fa9a81e9d1d067991e17c63a351090a333cd6c9fb75349176b950322bc1b1a02330f8d04a5189e272e295a7b041f1f25456438872b321246c2c3d5a78a5c33f8736ee10623b418b24d4c0a31e3307be896423202ec2e407beade16f61e30d7f755ba224be481b6c46f53894d04bfc021749a3e3beeb5e19c61164fd430fc78cec79a89422e893a6a00c5c537b2f2c483ffa442cc2116b4c2b1734e910588052a967491b1edbf019b97e4b994bcb42cc3c3e92465233f06a3443bf022ae95f616f93cf5c86860c13ef3f8019b1d1856432553f6902ee8a318a4daea97732762432b2d5a7a01cc8742e0da1b3649408025628208269e86d82e2088445372d1b3fa098bef365787e681a3c821fef934e145abf2662ce3dfb9da08eed01129ad081172e73f9a0e757031d9ee61031e4c9364cd6e1a897d52c3a7f522d4da46ac54a5489e9d2d9e2d2af91de9a0c25333bfb47f01f812651606a67123980a56b25e98b1c06a60c4561558122e9f71d3912ffdb2bbd2a80293a38f924cad88f4ec8d85093a06e0742483471978a86456c97eb02702fc2a0657c6fbbe2babffd203fcc8893bafe29d695fbe90b30d6c67135f7cbe6932819132d26071bac3d3ebfbf888b0047ee75c4cccb31583ec22b05897bfc79aa6d3281470b03eeaf3e9c28080584fa471cf3aef695a755418c1bf310c30a80629bd2297be19700d4cea376db5ea41b26838caceefd5310e26a600903b18310a1a5207c01db0cc89561fa8fe4f0b9817640265382fb49e440eb932f1602af929750a4e4ee8242444d359910f26ca0b8053c4b6a42f0699c1556eac517e6c87f456531c19e448b826cba050f971ba07c2de5d2a2094196973c2490b4addb609ecd07b343589570ffea4329f6b3bc1d6969f202cb91bdd31583f6aec728bb2e7c2179aa5f77afa9598ff70a3fde14cdd7f80e0a2ce190ea4fe831aa0c8e4d0de8fbc38e2d8873e5a84bfca58ce06842ad7867b4217b52192d5c04c13f53b177eb0131700685b7ce0ea2b020ec6ac1d1b4faf09d9cdff63025e505608a6e544c6ab3e20555210ead0fc854a33ab6a8d29e87fd80635c8113113663d304a197f9824ed8e56fc0990b2d3d10cd25396564c55c125b4665986b52acf541511bb242665671b1e344676610e5ddc90308cb1ee76f5d6cfaa9f7c5dee7c31d96a7ad14e8383c22848d02c1980e8c859fcce08f028d26dffb322d1f5e6627fecee965da8202117559f4209342c98af92b71861d60872a81eb276f3c6235316e248a2fe7b1764adddd1b2bd2e7e4d039a153ff2b12b6ed5e0a50307822f65214e209572681e40b73f136c13d942d0a01da22ee21f1226d7b944d0ee1c061919b8b825d9d555131772a215e2d71c5216f824165fbabbf0c6f93d73b0ce41d11c08b054208684480131b40a8ee86417e2c79bd39841b2bb2fe365728b74374ba42350a324f271413fb5a1dfb0bb3fb264d5d87ae1aa0f5ce75c278567dbcb1ae0443b3f72e8e1bf6a9304933f8906dd090e731507adc43cf4dc57184f721d63a740a70924897b6c9862f88376314491e3770700e0745db94848b574ab0d2019117bcf4d161cccff861d78deebee84f914dc5aed0f0772cd88f6b9153ae6e43e02187409d2c52c68423af21e37253c7f4760fbe1fe6e1641f066303ee93b93c44d68af9abad539f6ca96be395b3b9717c255a0f9830779420a1f8ab0c3970cdf6f683b784be0da2fdd9d692adb1a3e0695cf24947e4b30a36d64525a8f884b06e8cd51c154a0bd04fe415d8828ea0cd623e82640aac025bf8f425966bf4be869b3f468ed8eb238d64db34d760ee19310690bcd28d15a5087849a0e8cb241346b241e7258037bbc3d6a7cdef02de549a5e972cec8d65d2e4bd56512d56362e25eb5952d55b05f52d7dc80474f24a4422dd42deaa0e19374c224f7d845d82ca92eb67acd6333c1a05de45c3be8f3a29288432a514b5c2012a06bc182b6e35254a705236017bc5eaff34016c22400a700193d0c9192188a54e53a4966fa14fb094a82042c6e10445646626852d77be3353c6638413883128c032b5c0f613a9e4d7b740d091e37ebd51c3da9964216bfe60bd24c0b57f347a14f04dbf2efef8183f3562f56b77290343a68e95a1b4a4e9018d896d7c5e159c25602e0cbe153c1a1b4adf4ca7a48fa04ce4b1a9efeb9d55cba6c6250b9d6273a72e8d142cfdcb1087581f50e1ee72be72067ca9c938f5e40726b98744c692919ebd4bf922754241b68a9b6ca19843d7b4e8e0b46ca891853cfce47e96bf57592efbe92607a869012716314e122d122f4a55123da9cb35661bd844bf2f36abc494224d2433afad2a54577296b5542fc0f679da40067c298ae50e3fb7553032890df045986d04b9dd16a3759b266c6a8addf0f38ca6a5ad653fa99d9fd8deef2b6eb6ab16d636e61c775d469ae18ab8a1558d06b9c6bd2a6692094fccf314d23a4d9bb49e37391e52c3fb2b6f02a683896c396f63b49ec742956f5ab938678f3e600e0d614f978aa4e4b22c81d2772bccca4577f1ec034403b7246929cff136062518b787f223827c9d7323a87810880a683f3f7a29c5982f3c948a2db1b71acd1be630dca81a5f21c71ba07f02875616a2a948a17a66a4b9970fca1226d7ce90c12391831417990add6c58c3781c93b9c37c2373cf73b9ed90163bb927a2d911011b72cce208475b2a8f0a8c2cd016a641346516030fc32390128120171cfccbd367405fb2788dc28f118c18e17f962dfb806780b3d578b10d77563de32334540e5634863b1b04135682ee9855a40df652841ecc2b92726958713c834f78d2769523c8f5e0c2cf7ff09546e7dfea6f55c057fcd5f014bb4365ab4cf338c1be3ad2563c29894899fd90d14db3e42adc8b0667f0c5b7f480ed7dc8dd96d7ffd248128a0ac9b7936702c75ea540e908d20bba9077f5f4967ef0c79b7a6a16d55e493ef360ab260570e06152e2679c20da9c532f15a22d9bfc085a7a5098133474406ebf803a060f4654f8094899e702bf6f8631faca877813e3017b6c3496e11e11f6e4f9d1eac816dc7d73b951eb27bdec82ece87003991d3903e62f415517d2b7ab61c2842a882818f6fce60fd431ba5c871c63c86125250164af760de4e098ed2fceb4b4fa9f32962557bf5c25e139db88511f605245182c7a36a808af26269886a6e277118f97e7c65b4eaba2cc7e833c50ce4578195c8904308ae447428a24b69f9545d185c951c2df9ebd61b2813e8da2f29921978143e65ed45e4652252cbaa9d54578cced1eda2a3c661e09718c0a52d1623ee0b3d5ee44291c7ddd4e5a0be6b8c6bc94d5f296cfc411579aa0fe68623ed958a897c289238dd1a279424f0beb543ae2db40e1aedc7bbc7114a0ba53c0d4ada1572f7accce237c1e281124969770e3a09a21050b4d1e5e057e4213c25df6a14da830119e0f1b86da4c60242ab3cf7e9a655837e242ee770252146e755bedb3e8e64474be03c40fd48ec567a1c06ddcf35db63e9b03535a5b3857cdfe06f2dc3eabe9ae5bbfccc285ac85fdc5f15879626cb8349be2e8a17d4dd89f739c9ce1a9d4e9c516737e55bae62d41671c1216da441d1ba52f06dd906f01bfde9a160c4088c9d7e41ba5e1775084d0529e142b4892d6a7fb2d8130e57e45f76e795de71ef2e42bb17394288cbfdfc080eea4d73020e793feb5391d2b2466010af3d83355704a4aeabb3b5bd1e07ce268b08a64dfdb74c64e3132f28cf87c75eb4c14b1ab65641d34fefd7c01eb4249d4064a16c1b8b050b22d2581b2a9aa5734c460c9ca374968429aa4749e9421cd2a82902d654a69efbd6522033a031503ffff2cfbfeffb65548d2885fc813eb6deeee9e5926f88ccef8ffd53461dade21b1784cbe88b4e5bf1416fbac6a2acbfebf1f7bc5157777770e444977b7b908af58b2421a8464260913e2d2142df6d2f68e28fa30ce867d608c5c8c151161dc929064546176d5b071a5b492e6de2bffff5f437d8a4e55bbbb81f8d2f6fe2e0012c4e970944022a7133ebda75671aa886f47d292487e6a4273e9ee769eece48563d4b341c412523465ca0a2d2a14564d1616f606f1c16af630aeddb91a5c9a7677f774f2871e10d7ddddb69c9f0409e98f779d8694bfda12579b00425870e64750b9157699b89852709590b1e3b8165991c4398052c1599a40a853557777a5b0b4bd631d94d06ceb8f1e384a4d3245ab2a0d549c3981da421ed558ab6a92dddd2366c010b574b7c73c0edb164e4dd5ffffff7f23d390f78fdddd3de735055260b6bbbb1b8ce9cbdddd6dcb39e79c73064aa6ed5d6e319b0e02e8e9208260dc6f3d1ea7febb07674a6ea64805013ebdbc19706cb824554349899f09db747777e701a3b617bb7be6c2d0ad3261a5ededc261b831dd054c683b0ceeee6a56b2bbbbbb3b88d98fd78d9f87eaeeee426a06f7db42266def8d0eb0278b683194c1dd73c3da5d0164c6fc10db31c3a5449128c6557107b95299955871408452e83d3c57a1967e00d8adabbb3bd2336d2f4c2f7fd0e1cbb948ff083a55edee2e014cdbdbe3a1c4904e12ebeeee346a654a65c6326499b20cabacab2cac3564d003098844ea86e6f7814dce9420401b61cf9588d9dac4b3feff7fceddddbd8a19434a0bbc53438d9a6a7b310ccf8950d86e77f7675548af1390004895a99a205084325edc85cc700618923323535e3c87f2f115b1ace09c0812473b65675d439997be5195d3e3610a929574b229adf88d8ad7a5e1ba5e21c41e0da2aa4ac8b1013496a6d39b69ea90c924c1b831b11e7976700b15208ec1ff4faef8e2a6239ad3e170baee1d8631800f930b0db450b2d380f37fff6b1dd3f626975bcca607ad676b5073ffffcfd2ddcd1473c3ebc6efeeee6e73f11d5691c4cb4cb8836a272324f3567377f7eec6d54c7477770a63da5ea4124b448aaecf7d770e08cb7ad5959c0e977dc50fd580376c83d7986ebdaab32ccbb298c86e70c2b86b900256a17085289962738344213d4fdbab3fb42235bd1c26465134eaa7b617bb0d3fd2dddd363ca655b4046ccb2ae9a59b8a686a8e10cfae8aba6a3b325f475248a72a1e221c9db0b129ea8842e406d7ca5ee550dade1c23944a47264a5824954f020a06d30b3471b72bb95cbec3cd1d9f2017ac2200307a6969948c520a5ae2f68fc4fb5f5bb05887deb3de5c2ce2fcb8b1bbbb326d2f5657d858072134990e4337c58c51ac39278651d4dddde7a9b617e3f5a86606910d183f8edc24211b62f453d43b6a4ad2d3402b663f56acc089e2c23723828dd249cd570d0ea3d1bab55b577777abb0b4bd6322acd0442c65d47fa28f9819930f0f8c977736f9889ac86872b66a95e1903b266e39cb6852cbf97f7577a7f1659a5fa609661ae18e83b4af154a1747a6665efc05101f28c41f148b358b6688d354e57c68d84d188c54131b3f4e054a3c59f2a11aba695a9104b1c65e532d91d3ab5171dc134f1b189b9e8dcfe66713b411b6868cfbffff735aeeeec724633c77ae1b950b27a75e53cc983c80dd3f81228e50809b1c2a591d75f2ffffffc1638b0826713d7c6c2c0b155cfeffbfedc584142792bbeeee6eb4876ccdd8b64640870890f244dd3ce1f9ea3b8c56c14ad6725086a0e45857726e242228d06e5dbbbb8d94d2f61a91cec148e99ef1ffff4360940332d11edf8e3a21d86459027c8789c0a29e04b12f7c63ecffffffffffbf516a8cf74fa652798baababbbbeddf7845228743f7b8d5acbabbebd049db0bbc40474f77cce7bce27fe1282a056904855055d253eff087f3003f5f63bd7354db8bddfda705be79001e590cdd7e8499b6b7898f3c7130ba1058bd1d069f7143940ddddda61a2140e55307f01dae7173013f6e34a397eba8b617637d55f5862cc9c078f1322753ca0d9e13622f8ec5f3158a2b8980bbbbf3d049db0bc43db8215d8edd071e4a1832b8fbab3674aaeaee4e344cdb4b1c415474778fc14c46c95ccd856557170a88c46091be041a77c97738ebeca64a77b787205bb69cc1ddb3bbbb1bfdd2f60685432208a3e20d821f2a4d45236855a5701e0d9d60655b3a2fbe1ee179144d560040e8ea9c1243023b73a223ad03322be20919394c5cab91207c81f2172e5e382106dd76507860e54a4ad04af28854e403b4439c121b7af1219b22492896e074ad6154594ed595bb3a721c73b83597d3ddbd2432f15f6822050a2891779fc88e16a436370e68494c1b9f665813dd59539a129a1ebfa3b5c9f207fbb47462df2a9752e96a2a602b41f6434cd958b60d3d87254a59a583ea89365421ed69c989224c4b505626343d04fcb8e0e4091e9329249f6a772a55c3c6b22acbfe37157d2dea945ed3c8b5fcff563aa09105a190ad319edf183e77b725f039ffe336588a413151039824f1f2474ea2c8fca6b8986039f33cd3f6c2f438d0f07dfae107f1435032293ee9ad78b2f231c299924a7247181397a6dddd63bdbc61cc977377b32c0b8665b0eff013649a0f279904f398fd0405546552600618a0a63ede75a281aca1c1cff1feffffff9d9a0cf1fe83b8ffff9f252cc97bfcffffaec2c5986f95672dc7b2ddb734c4593175d5c9480f56a70a18391675bcd675771779f7c9a7c3eb2e767737cb6abb3459401d90cb5b570ec250d1f962e0767777b7d617af5bcdb9bb57adac9c7477777717f144745777ebca0a61d2f6f67c1b843fddce673de2c7b9bb7beff01700461c5a970be7c78d6f503824168f1f8ec90bddb9e62aa4246414420a2985b084ba56989098dddded05b8d3e7fc39834ea173e8243a8bad01abffffdf2c2d307069faff0f4cdb7bd3837139dcffb36b6e4a8d9c8c95e8ffb50944901e8828ddddbdb6fe70dddd6da1bb1bc432e76ed5ddbbbbe5801b2dd7a895736c00c877d81905e342c8dd1d0984c6737792e416d664b1e0242634d3b0c6656bbad7308aa24fb5bdb805a3682f61d4f662f77a0fc6a5bbd776fdabafdddd4b82697b8543104b88bec3ec2f61995a86d74668e303f7ffff7f1c32e4fde33e3ad168c9f9f4ffff2d905199511d1d591a9979307554968c396246f1cae0eeeeee3494b6378792119937382933b84b81b9a443cff90ea3406e955889d174a0a074f8307a65b7ae6a0da5b4bd4624871aca759d31f476776f720279eeecdd52db8b7192eaaacb0c5c77f7b3979fbefcfce9babbfb591608e7d619ffffff4d349478ffb831947c5621ab3897f1ffffff5e5d691bde4f673e98969534a73eb1dac3b60aff462e6c1845af54516d2f7e7e32ca84d5e5ff7fc454b29b6559966591447e0138598236c6be39d5ba1be7129381f253d2f6ffff6fac4af2feffff5f6db1e13c20e9b9e774315cfc26dc9aa20bc2145945e849109a2944d9f8a8003ffddcddddc2d17778893083ffff2bc74228d1646e744254013366e9ee6ed55fc6f6ff36b4ddbaa64bc0b4bd3d4379c4528e5d8b6ae2bf96b31a25b463296665b3a3e6e5877cfd4cdd9869e264f6f2ab14de1355b839f70eaf654b4b5e7bb560f01df6012309ae3dcd293ae4983b0c49e2ae6e513677f7ee6ee31222affbeb37404bb7889d88616263c78c33d9a42bc84b268767ca4ae624343effdf669563defebf86f3b7777737955fdadea07018820ad131601f664f1665cf1ecae04b232112017b9ae1d15bc7aa207d951eb7ffff7737fadcbd96ce1cbbdbd641b5bd380691e77e437fea0d0715425547f8efeefe134cdb2b1c128b47103fc9d6d0ab93a8c582ddfeffbfbbbb6f58ffff49c54e3ae2d2c876b27c634241a0a27a4950bc90c2787ea2286dbdd2172ed92ace7f881212952ca666aa0bcdab6704e7070d92d1d489274252684dad089fc6bbbb13d5f66277b7a51cb47cffffbfa2f56bdb6abb19e4b81266f1c88114bef88628553349445638372fbe42e17950c9f30260589858e071b07e684ac2467ae3ffffff97dd19db2cd996ffffaffdffbf0d97a617ae98574d8c6b3e2e75a2c1acab163251444b885ed42523c5168d56d3dad4618bc077387d423a4788b2e24208c2c590c5e038d8ddbaae5ebfb4bd412cc485f01aea769ef32fb670899a280b176ad9ddfd33fa0fe93fa5ffb0fcd7e5bf30f76e97ffffefeedcf5f9f9047d84eeee9f73ce39e71743697b73281991ca0e2fb05cc3af3e6e35bdeeeeae75b70d1531c3b45d99a924a266a09ad7cb90573c3c6fd2dd4df353db8b9d6e2c4e42ddb920804bf795252431d01cb8901aa598b980167b4cc1099c481cafab7de377ac392687050020aa421d97ee2575d3947a012483010e32b01f2471c991988f0fe28001498effff471d45de3f08205546bc7c70f97cf1a820c39a912494f2e4893beee84960a1a48809a62f1934285e7ee964a463c8449143a8a4cd9df6e6809501e319041841c3401c09d3346ea5011480071cba8cd08c3c40401e0d46a190381404828480001000000040a0c1c040000c0de54153be01fe17d97bf9e8beca457d0f96ac9158f9d9ccaa747ed31cc00779c026d001a07031b300055232b54ee476ec8268235eaf82698ac75fc27168355d50a0bd294e443a10a68dd0e88426dd5143319607801f8ca84216cce42428684d640b10fd6383b102175a2f28f79e57ce6ca618fe3d07a4909a21816251639c28814dc609fcc5a876839c8a4a15ac1dcc35cb3f2663f7894fbd79c1bc45231f03f7b3f420f9137298ab786c2a3194c70524045127ba72553e611e6ba3d476c141430d8c4cce2b3a707366be73c64e1b64543ccfe47590009c54cc3b66ca16cc8e370f40788a179917b28c245748709a6e032397161df727101ca362953c631603586aad070e0597aae9694b022fae49248455a03c154412033fd29d4a67d6a31a268baf0497a1b50d2fa480ec128aeb848daa887236517f3369db3ceb1ba486297b06bb1fe14a179badc235a713f0d4e6aa193e8392326958e3e3c39b98259dc0492a50a19a590024e66656e1a9851610a1e7f74af9b35563501170798dc1bbb40b91d4fdf0ae284b9fa76ae653288fa8f59410127425abf33e333abd17d71576528cbeb4e6367b00c1b88a50cd9e72288f91669982b1d22c2a4f3713670704506d74ca17f964d786e1fe81f5260166ac2ace9d2dcac5997b2fa7aefacb69e94446562d1762c34a8545c3453d5766282477038c20dd7d12fd456d902267a9858141de1a9936ad950f4ad078a0223c13cbbf608c27937ed81b2845007cbdd49b2baaac06ecca10c68a7b2a86ed801a8c9a6680a036ecc5865c9555d487755ec9a45e90615fb453efe26f91b14d7e2cc76de84618a329c8d0d161236420206d9b204c2cc6f32cda05a26e90387ab66cfc41b86d9d89227ae4bc202f79da4bf5343d33dc4670d85d93e70cd1b3f489dfc109bc6801e345a61bf4fed0b9497f0042b3a0939386eaf674eae330b1318d9fd42d8256f8292fea9ed28bc2b8f57abb956db2da080cee29ad4b833881ce945c7b01265c68ba04ad9c42dcc5f4a9cbeff9a01ecffe39ec2acde371eee08a6d7c6d6a14291fa4e850471097a815e0ca6645821915078b341812c70cfa4fe0210395b600828c18f544ec87f272af7611e49256916b6cc9e4b16768a3c2bb4966e01a780d9fc4322ba7ec96cf6f316a2aa00361ac7229871ee991f88da542cbe7c80a30b6cce0782b7e417a16bc2a8cb07695d648023204c2df08abdd584a334195efcdc4681b18bca8950973844fbdcd4eb1e41ef2afca933aa84ec092428901461ed758aee16ff9e9f5bb6d685f4ea9d7d28d68d40b7e99f967f5851341880b6bd27a7e457a51f21d5424e59961e619815d5544cfb21c5189a4bca9afd3332aaa70f442ec22354bffa2b96f8cad3b38a8442996e900b2461ae0a9362e20b531391c316464b8e1e60c2941ac7b8f26776a131f03714a2df106da2cc535f5732e4e14cbc8e57850e4666e3f5d8a1db1254312ac4bacc93df59813e81d457d7dd2e116ce7e03afbaed3bb298494085d8471cdc082c5e225c41c0c8b22acf22d14b4909260fcda3282462200d13e2edc35dda0bd38fd23f6064e204c2f9c69c1ab08bef2798f369df9b8d67fb2d43e20b0dea4323017fcaeff852b543f1ca61688110fb91d23c266e38c50618c4bd32b9602f78fa6b04691a581ed1a47faac7192ea0e4c505aee1a9fcb63132fb37e06f810214a6b25109423e449b6c157a7118e90426c9594d62a926e94f25c2edee9cc72b1ded666e349e542d3870a61364ab8ecd91e4f7d945dc4cb123fd4d1b657fa183299607215ae0a02728c380322cb8fcdcb350d138537a94357200178e5a385b696f87deafbf89aa7da5234ea41638f9b290c0d1260679fc29993537d008a607e8c5c7246520cb0996f145167bf053031847046aae13198152102139021041d50d94e08e3acda008da38916ac6dce077c09eee2153d9d285e71a2f11212aa04503a7a5d8e3f38a6a97c454e950ab75f2ba8cf3b4fc4d771b02ddb6989469c56fbe1367b4b9a170ae97e982e5a92a458bf58a791c8bdd03e338722df2a2e4ac7a4f30d5720a9fea5160986f86f276696b16314548d633af14f909a334de6ac04d05e314918fcf35d972380dd000b13efc5cc72d6b9258c127e56e839a125bd7010ab7c86570f81a2fd0818075d6e5d7c01154b9df3f6eb2fd8484a7efa842c5a684a387448e1e2272220c39dd3e99b7aaf9d6131fbf32c0d24a180e58f284d5e78be4680a921deeaac78d05b45a46689cf477541f705448b936999d51760a7660bb6d5883e199ad46a68f3a90a9a42e4af430dfdc6ad17ebc5566a129645573df4a462d5ee2478071dc761a3ea105e6b85221f8bfd4d044c9a2fa3b40f2daccc865425c27974f8eb0b1281cc54688d5dac2a5c2553dd42c134961450152ce1a390aa5baac388ab5d4338221546a5e3546471403bf4beb5fdb2437076b9d281a1577ba6c329818406d5731f297daad8c684698ab6c3e6d8eb6658305a3c6c2ad8c7643aeb840d449bcf08262baf94d1cde7f1a8a0b9a7e51ded23d9458f2006f98fc977daa897049831413316f6c6f37091ea1593ac0d9c87d6fae716644154533701cd82773c6396b2a735a0f549265f95bfad8b7b4a8eb6fc189ace4058e88af285abc0a63e7c0380e5382b43c55034893cf3a4dda105a875608cb2d392e49234a733fa09f1aff0f08c70a9246bafd9c11cb30cf8976c38a5c7d02ed0248b55e80f5bc8587b01ee3ab70365e8c74f01b94b1b3b00cf631e85010461b8a3a3e4980f9a6089568845deac0ffa8f2a826a4d3cf6726232999a21de5a3e2b9a46f797b23bbd5aa0e5c2c4d1f6a47535b84e2f70ec1b18385576acc1413c208b2b47a7dea541e953213d004e448e6fb2e9b3e3e5c562073b5f6e29c442468e29f3381cc29c10b470597324af2ee15d42e95ed4fd8c2ae330cb47012f7d630db7351c3674dc28d7c33acb1227af01f4ca55a3ad6b6e5a9293727e4ae745c32d25e5031f09e4e679a8deae729c524af1d53f27a45c99a033277bbaff3c814006b3a1bf4635e6733e211e172ccfffb499874aa53791e637a0fb66999af015b258a792e3c02d4df6065a6d540b3590653582f9d0c435dbb23316d0d528843efe20ccb3521143cb441714714ea93c701d679fea359c8866cb07abccccce06968d1d3f2e36a84c194a803c17f50fd0f6efd6461a03c590c71b71a069712f27491574f939cbc801c2f31911123925a70852950809fea11440d9b70dce4ca1a113f256c5916e4f62614380f1e743613d9921b858e987a51b5ee08062330d0a0d6a83356e01f50ff45c05cd24206e31459a615b4909b7869066d0131681b504c11ccf6253be4b15bb95a10738834af22d41a2b5171930930297349a8e44f302e1aa3846f4940a8aa54532e0e2ec51608c026e6ae6c15e51d0c1027cacf192e123ea1e23541b8ce00c5721413811277bc01f1dea3f37c4a9299bd2d3373166e0751421968124924a54fbc52fd9b9fc4fae16ffdc01f6a380ebe00b815f7447d511e0c67dc1147d315506d7c31d77e7ca4ba35ff5361781a1cb1f8877cb88a80464986de091034c2e8ea7279f56fe668674443e5955ad80d5c1e66ea1b9d98e074bbfa86a5d4da9b38a251793c077d5d9adaf0d78546858c3014c3d4701330a354ce53796658fd84b0277274999794e63bb99f5d9b66089a0e3acff6ac843790fbe3ac6a7303b320726d8eb1ab6d5e6e0fb35759ee3b481d466fca588712a064823fb6ece50e2af814a490aa85db0c781a08160d72d249b08a732cd46e741cdcc9f4ed61146ca07a107122436ccf293fa32da6fed74772dbf3425cdd89fa6b163b046d37f3439257c4142b08fda058f46d7eed3ece95319f03ced797b782289d8ea88e2daa6cc4a7d91f3229849fe888883f2ce4bb25c37fe925f09a61f2a39230c766cd239ac022fdcb49b26b22ca19334237b43408a28009f87fe2bd1530dbace139404e6195b7e2ade0a90245cf6a76c8addc025ef781b21030ddd427552b4e5013c35d5a161820f80aa37ec031ae197a9649d55a5e0ea2e5eb02d8b535d700ffc4c54c4eb6719cda787e2ab4f2ba9625d93d2a0fb50ac983ae8629825ec8f849a7ff828db92aa7c67095037fed52a62490d3bbd9149e0c36fdd2ce2f3e415dedb77e4982b25d2755536d739402b357671a0d8980fc55c3998ae96d76807c05070df89b59d7c33f360dce4fde56cd7bb7f004cf8a00001d2c31025cb787f4e1c71d77214acb8a6bfe7049e8582a61bbef02e263daa9f838262e8d1b2e03af628b93f54c1abbf2515d46a0191dc5ec18c1c4fa99642de23a55efd329c5e14abc7660dc34fda790e180b297ffd200a33ebc41d440e4cb79a609e5ad1f3b0bd5c4f694bdc1456c4b098a2d7e00c5c7d52ec6004ed1d8fab9c66ce6dfbd6243d296d79aa3eada76097da7c3813b196444c94390067b8f513b6538adfe0f857bc5fcf86100029f0e942f2cf570e5aa1ddbfd1b8ced20e72458a00b39e87877ee45ed5599d0043cd1cde27677ec19bdfa6db56abf56d7bd6347470c12a182704905b60e167dea8016cbc8e43a106bfe8ad4a988c94ee22679498064b78c34e238567547f0984bcc2391a3fd344af49eeb3950b6609d9b46ac570b22119e2060645995a34c390b528db4c3c8f1df2b5e0c75597a87c493512edae001ec074c2f4a67293a93f34c9f20a85a8b1ab99de15aff43d361b4afed229e5b01bbcd12cdf33bd5c069f18fa8ae8f6f2941d4f9d1c41f4456359b132f5a5c1cc8c195140460ad202fb076a981b9339342858be1324f31fc947177ce8aa47419e77c026558fe7e1eb866538a433a0acee6588105d54ee46bf9020ef99192b4f23eabf662a249b4b57a27dc3c8aa3b6d3e4a9314266fb08a78872c267cb49b8168d3bbc4e448bef034085863c861d0798bc9e3d138b5826d63b0647ae5969928c227e92d8e49cb2432d6ca273553bf7db16a34a9719ee90fc2be6fb72c58499970030c3d6c3a3e1dd9415d86d0a2551fb9598b778473d2696f1a899dfde8ec3ad4d600971b1987fa5e0373a5fa7c0fcb288f85c80055c5ecd1c0f1de9abe3a194057650ba58c6e441f3c468e383ed86826f67e811d2c713840354e62e1666a242ef8c7747eaf3b5e44cab9b5175824a209d17c6ea2b9213c652b3941575cc886c956266aca0020d5ed4d3cbab36c328123a47f8bae1b4d8f07f63d5008d350cc4510379b6795ee2ba431c3c467404c5a5ca4ae8ef02e599f66325d714ecd10288dff83e77a7558ddc5034d47cb8b7cc7c765bde0e39107d4b30ed5aa310a03a5a8745336f0cbb85563ad0e3160cc0d3c153fea33991c4aeac90465a38f59af9c1cfc38a7fae1ac9ff295ab936b90fae3cecc6cc4fd770d97dc3f1a4ff96085e752b908468e600fcc207cbb44702f93d8f0b5d0b4ae451a0eae412a0e8e030e4b7f85828bcc2590099e6967e095d47dd7979cdb9bcee6a7f49c88507d4ca4ba8af95f721b8f1f63974d2398ca400b5b219708eee5fe3b12796c7e6548e05499448b5537e36e0dcf3e631915353551d56afe648429c5c36ac74e55fa8b7e924abc6ca964134a5eecb302bec96a6466473f85d01e647473379b4a7a3f35552eb93c65ec36e225b5a7c0b2a0c5d867180a540086e8e89582310a67ce4a38278750dd4c231e455832714a417de94b2880022a5b463168a7571adced7368a5ade5f28f3ffc6096e7fe70d3683c53fa8f98f7927e4a990ca513e82a842287226015102b65169112b2047a5c52bf3172e668eb213280b4a51a6e695269926e82f252e0d02c7923719d6c43e18d34b7f901f5d7ea8bc429836584d7e9da1018605f9dd368aff34b51d225387b747c440b358fe25d485180296466797bd03f9bf1dfeb0cbd3d37bbcda814ae2ad10f4e840b52a95cc4181eebc319ee161ba2e9ed2de859bedd001b208a81de962ae79407af4cb26e9c0b58836a1a80a4a2da39ecb2815f6c44550ba0f466474a71f40422090970aa01c8399de3185af2ca205a6755e5d43980363367eb11089f41f0c867efe90335812c04325671d511ed82c9be85fb45ff2034680b913db5aae251d304b3c25466a80610c53c8bc04c4141b22e4a67463843fb51f96277a344241de5c58efb81188012cea4d9e3412f2411bba93df580bd2702bd2a5f434b884d5e2464f24d6e6e4b06d9a6ea8a8e5112cc988ba2469b9d1f59224c490cb8a2429d3c89a1372c0d1eebc59c402bc22df657e6a3c1b48de93f8f1c43adc6587b8b39c04cb24f934dff1f25d0ee1fe10f6093827091504ceca38408b29ddc0a2fe8087a49153973963b39d9489f2dbe854d132b95a8b945f66384cb309216746e37ccab7c3f66b49591fab9c2d64229140072ab06867a2999ca270755465983227aa0c306335a4624ed1b855bc4a2f602822fe2b5e8b5fbe1b8eeb854e122230d958a91043477288219917af11f2e1a7a63d4fb6b0074a8bd914aa7ae0baeabeb8b1b28719f01166c0752ef34744f261912a4a12d7e657ac7d050b00155a33804dbd5c531e03c791457297b09a649537aa46d75015ad980b28a49028a6cc63827f516a482aea78eb9df1008510834bdee2dbf2ddcb95625689b8c71d4619a1cc99bf95b4c951c2fafd3f05172325ac6040a5197a5681fadae54a31b31e309d4d0093ceb63b0e64cdf5336ef7e60127861754bb344b6f148b40d0d4e14387705f9e37593c597e8cf92f60a7e9a9bad8ee08aedfac39453c431b647fd1e1770b2c91626d1e89d157e7c442658e6286bf8a7702648f5e6027c60066631af51a182c86a3fe9bfd48d348113db337fdc8f823bb8814803a071d0f6d8a2cc9a944d8341afd1794c83f876e3ad54b94e8823bd28690c8dce52dc584cfa832dac4d7449aed0b3ec99efe559e26b2106f4b8aa02d44f84537a87363fa5e8c0bb1a457069a50a5624d409255b8fea6838c84019dec04c76d3e0af45f33365a5d854b27dc16fb1a193c643902d791ed719b3a0225758bc0c4f9a54889841a93d56a181c0ad963846e1df488769011b5d6f646c7e2b012181b1268d2b70851e32837b14f8b2ef5a230dd3e274b65bbc75d133729f40131831081752b54b92a8d1a31f479cbc8ab7b4a7de3606fc5d16245c66b29d07fcefba1f122b93970a57673b4e42e8692cf0e0a43dc80d15d4b21d40a16d4002f752b823df90207c4f6d3540f1bbd58e7ae675d2b2de692499a5a3028abf719745e78622527411244cd5d84967ee44530492d0e2b8245ac3ddaccdaf6435d37a957af8fad1c4a74e23ca6caeaa91916137a411624129dd31dd1028671ed8c64b4c6719a9f04b288919823a5232c452580c5985ec3af744aba5add39b78e25c63f295b13bef924bd222eb3dacf66e44e24f07a750cbaa49f1d83521480dbf8933c37a7cdf9c8300c904705a196eccdbd80372edabefc49b84043197e93f02b3e2b392a70b159dd586226e427d413258c75f8a20425a95e01552d262324648243d243d2c883120e1c6e332600b8170e0312b23e9dec6cd80267c4ee843d5eb41cab78b68afbc7efa9329f460651168b74ec0434ba31073acd2e1ac5486e256bf7da624c731247a0d1721a0de4362788a2acbc57b1835267ce262641d5d8db4f2e566071124e11e3286ebcaf117f3487d3966d71976d1df6404983fbe55975b43a9dcd72a80d9d048d0da1ee9d8e6da3c928aa20d44df9bace6d58c21587aaa8018ceaa84cc8565ee4e34f9acd185cc4ce51868f4dad91fcacabf515fc3640d07083b050817dc1fe4e4eda2a5151d72087decd92c3fd704061923f5861dde49e91982bde91f7542670493928b3bcda38673d0f245db94e5d336a13bee5e9bbea1e31f6451046ec96e01e1e0b0c58b2044d2c7f411d33d5ab4bae439ee63464b52ca89accac98ef29f4effe74d60ddf4eef0a760432c61bb802aca78d9851602424c736f80e20af1f02ec2470a49245d56b364cc68a0055c2a246a5262e95dd8ccd00120f41c2a282c0187c3404ff678ab5d1b8f46043a43e97ea74b27a482b72e0874c4111047410e88cc168178340e1699efb73d028689cffb332a16e12c774a82ab6352e5df1e81f262bc968363399e87ac2069a584aeb0a614900644464ca2b6d09135b34e469c64305a488a65d03fa01f74a2bb0296983ceae5f0e436cfba22184e91b1b6630588b34279941feb03fcb45d03785c394d778510a73854965c6a1ae220817ed9d0ee69c632c8aa6b5fd0b788f6c3a539b3c802dbb33e845a4207aa5ff9a50eda1c168bcf8e6681e2a85609af0d0b0f5c819398df5e377f080fcbd90accd859e04555b716637a27b0d15a391f3c6a5a9309a29b6e8e4f657a07c7a410a3afcbde424bf9092a8ce44c96b51fc1d133ff1b7bb7a860f172a14a512539c5238444ebdfbaefcf847fcc8eee024f04f0c53c8b79e657fbc85130046c94f9ab670d7f7ffe1255e13d77bc7ccefbe54d29227b6cb78a7b3ae356961eee702e0fdad6ee1e5e11011312d5a8620212cd781c0af3ad0e9b081dc01bc2a01e2b9df4c67344ffcf55f8dd55f673d742bc5ce99883176b19fbdb8514956025e3bcd5dbc5a817faf5f37499e6df4014245b521828bdc3c650526e39c0356f4851af47561b979c85f58325221500ea0e09f468614719b88a26883e5e4c7f26b9b4b7333ce914177c9427ca339f2534a4be902d62049b6e52853ce8254b10e2c53842d43cb6eef9d7875c491dc85943f1ed5d103c62914781f90247f4f1650d9a2127ff3d1a019278ea645d6152096be19a5add7b494b2e73ba142ae20689feca4bfabd9fa3fa1556e6874687ad1b0faab17ee64b4f81049a21bf85462e93b83aae63792468f8922d91f3c86c0f5ff8ae87d1b6239bf039337cbdea93dda7743d34ec77521cfbf5006bed0d34d671784a1f7c37e514e0861c048b55e9612293016211c8ec3eace8d106f8a91c8b644a1e86737242986046f0552d89f8b7f2eaab34cf76ef7ce18e58193503833f802405c5898376bf11a0c88b57004b11ee5460c4bd73b65a184bfecb67437141445d2f9abe4e9e0b9df2ea1a5d7815b06f13b388c1ac06dc1aa82d1b6c5d2e1a99b7a5140ef982a6965a772448b94a789bc2b0b3b4d4d24ea24dbbe773440867dcdbe7fcb68e56a6dc51f77566d68d5a6ad85f5e17d3309fdaf16f31dbfa094e2ba7dfabe246b8b4a97ced62eff0ddd95b300fc2eaa73a6863c2ffb639009e3f1bc84b0d23cd22b006bd6314f3be7a847f3799efcb82c48be085afabd4a3da8a16822488144df2f438b40969f9fca97d8ea02853aadcb18efa0cc0ba5df18f388f59a27361771b5791883c6af175688a1bdd77e8c91134dc68d8a7b6e9cde5746082bdb8001324540387e2fd031cc9fc9bbd466d713202345c1705d28d6b4eb2a91d55e903c9bd5ed8d62412db988dc924012dd0264608f5bbf0b2ace450a3eca18d73a9bc625702ff556f557d303835fc945804d49857fa32e25b7199496242d7812e29ac10943840c5fa86d85f7a17668efc34575f2492bbd87d147d107140e94642cd1c7364ab461d0df4227f096d233fa11f286c3f121877f198b3f36895dc8427ae8539811aad037c9ad507516562973d567b24e874863f7e363af036e3a29a5848172a1e3a763f3931f1d8b27a46dac45b889576819839d4969179a70d64da411234c8f2c05bcbe7620024aa79c310e4394110ff6a9ddafce00ff935406ff2ab69f0b2f12b0700216ea527a6bf47508122ea0432536030fa69c3212b75009dd8b8e1fb2f220119b38200f8c1f9a755e8e25c7d66b2aeb572986208c9cdd0256aacfd8203cafae974875837919ac94f992882f65798a8818fc827efdc5014dd24d59d0a737be62bb5046f9158526c56128997c480c164c73aad733b0b9302cd5a52f113fb22d2c9972a97624532a0d0272dba4131a551bc013607b0013fafb05b9215b4d36e0b55b83438c6201023aef9d265b4bf81d21df2b6caf9e5dadc8bf575819c9b350476aa329688a5415c5d0ce77b606290349adaa474177e5504750f863e9986677b445792dd4482048cba8dfec5e6a25acb0eafe41c8f63228780043bf7fdf7f2875a38074b2c866140e856a21a56f2874e037cfe0e9cb22a193440b20cc4df9b93b578d5790a987b759a9f98f84cd3b148c04d46db6a00286969beb497ae6795944b5b8cb4db72593fb19714371498daf1a0bfbcdace448d6c3f3fe561599a0420028c78e74ea43a2866c89a094943ff6ca7901ca3714d85fe384338616df70b755e0d12120cab81b6c35f86218936a553afbf6cfe849348dd344597917f8461bd66742695945909573a114b100d77a9cc5df2470d5e73fb37884d2534a96166d65c6924389a388452d0cce66a8eb6e9fe5d25553bc0d6219162ca62cc4332fc06aac3078ba15f0db51d43ba0bbe3dc03ef11bab482a3a19687d54a9ee63bd58012221532df1073a6078f14b610b1516bbe757855110879402ed9b37b7dfd0dafb07301d3971da68a09aa4394fa32a394987aaf4c6823f6aac91d1a96f413beef3c3e3dc38b4f29c1c85f79e7a33e3235fc0c7063031d64720849f34524b8e5a769e6b5584fd4751c2b9f48adabb51333132056c6a1c7ca86535088920552c8aab900aad048c93a3ae408237be459c3663f63daec871e3a9991a71d362e91d31e2cef0b29e80ed8b4f9663a078122a95a18e6454cef1c550d9173360f76d18497e4051da05b08c4c4f330f926032a784bc358ae5ca8b111419284ae502f6600e74a1dae7cd1dbee5a4f2e18994d310e75c8de52471aa372fee98d9db379a4c58098144a7bfe85a15396991f9670cdce000fc74f7ff1ab09ac9d1a08bfc63c8b882df73dcc21fd47f4c39177ec92d3103ba4896c9756e728a4ff10ae9f31e3c45424d7f58247b39cc8ad5f10132f77f311dd4b6c1ed14b60bf5113548be0bcb98b0a4c48726249fc87a78100401c8f91f74c5225b3039b4c5c65a9f1650c9f1ac32a343f86963596b4887aeee491297528ae9f88620329dd8e34e565589152a00575da2ad9be35b8945ce5f824c5becb6927a98a37e0c2ae8f1231d7283947ec27a8a99f6c6e39c0e68b25b69d3b08673486d77a472bc82bf9818ddab6f0cc0c79998988859c6c123db962defbf5b372c44928762fb8e564b7920933326dd073175d623dde1959b9001e045d9c3110714b7507454398fdcc73b9944bc6d09e060565ce0ba09a361f84cb4a0e5e103849b7bda5f8f3d497a908d465e6d76f113f79b4dae12b36892fe35264090edb219102691c4b629af2f04cddad06e8957ddbbdf7c39791832e9da836c8d09c02fe2930fb6334eaa59403245601eae51c305870ce21a5030a586abbd3e15e1f988eeaf7b1bd16fbc79bbc600592113686e2d01613bacde568b7b116fe83d2c07a242f6b03256b232d6b0365ebc91a5141831f4ae4973a8062f0127a471d938994c56cb4966c291359d248ea02f702de0249732d73ba1255787c53ffff69907fcccccc22ebeeee666a82c475df138da05503c8642d937577cd9ad0eb12e0c7e6480da40c3fbcaa7471b0f382c6b005122714679811e10a91a715c1215048501cf9f1b8a0b33503e9277582fd1c7e667cbb4f7e388e3107a9a6496365aea5089aacab32d74ce379964e35bc95a215416b75b29a4d556dc75f1f5d8caf7437cfcea7182ba2ee1442fbffff27a07a287afe37999999999997767a38666e79e2c2bf326bb376c311a0b99650248e0c999979164190870202b1621a3b81ec313f21a1a058ffaf43d193a9e0f0ed465114ddd163aea50a47494028123b864cc16cc3ee6897b4035acbcccc4494885a56e0c8786246781e60482048142823337391d15ccba388a2a408a39c91b085763bcfffd73a32d7320948420b8a6fa7ad358cd4ec8cf57eae76777787330d631816d70dd53451181e4c8e9ac6b8809804b259dbdd7d4c32d7127884526dad3e6880d94f003d4e74a510219da26873c93bc69899d9c8a90a010e3530906ed697c63a08b211eaf17961c70e083c45a474882528419a41430cce11c445fbfe3233d3e4ccb5d4f1727a3f441bd0f8d0cb83b26265bd721142c6e6942ac701760361f1bf650a88209150aea3b3dd8db2d9dd8c2ae9d1621f1cb530320a3e05737ebc48a1c5034c8888c693d2ce838fb9a187ad2f5bd46a280a33d712061d613463b3616fed46529e926166ffffffa97a51e6d14c1bc9dfdbfd820d1a95cbd2dde759944266a6d92e6a6fbbbb9bb2ccb5dcba8926a46d2799e44b078c12155c2f9dac0142e4f1c46286285f2eae8e191b2c0d4b6366661433d5ea10c275ab3c6cdaddac5e2b018a46bb96d7c680ce2c611651c7f5d11c6ad0eeee36ee085ef96634d9f0d891ac925263880fd9ffffec5a5e1a49d90e0a0fff7f1933f3101d238e99999b450d71d166e62f0933d712e6cea837369ddb08263d2e21b8bbbb4148ddceb307ca5ccba195063d59cc2da556b2f9764d2a51bd1e0320f8768db45008eaeeee76f2f1c375df2b75773f25aa331354bc2a70aa3834509c29de309f3000c988f9601ee94c1cf158f8ff63348afeff5b82279ed3fa5324030b2846d4a1c3ff13e14a27a421ee2732b6cc98f9ff0c809f6f282407d58d1c00e0c01165c54c110bad14212edaccfcff3680e65a420dadb230b0b1c521d0dbdddd87b9c21556a2ce9dce2a20858612283f841471c26901478da28d251b26045db4efaf05fb31d792c8f70b0a892f60c51eace4100f1219a008b02b6ae1890fa8c7ce51f0d4de0659ffffd3dac94580085553728e80d0085754d05543f8c46607cab084bb7423d4752bfde863911626cb25eb6199d85a900558f0a531610001bc6c0a03c684320f76ca6cf8a1d6dddd341b25ff94b728fa33910d0ad0dc9bc2ce7a929ffaffffa09a6677b797f025bc886a12eb4cbb87a4326c53c7a9a46a6d8cc9ef2c65b2d9ed6bb2f0138b21c0e573646a621103089fc0f3c20b66084e90e780f83f8b4cc6168a38009707f0edf2a0c9324d66e619c7113392ccdc3203a3c6c5ca668669d331babbbbbb73ec5ade7ba21b666401b56e3a6cb8fe1f98e4c3fdffff156666ae6d9081a23ccb9d9e59018e5b358494ccf478bc348ca7282a2f2f19365590e98b9c8aa24f30fc10b24543e8c790a02854554dc02a454e2a37286cb8f17940d19b22e84d129a7a638ba314504964e68b9a37bbbb9fb63ee209a90e65dceeee6e492fcc95128a42188f99b9a9e8c33133738d6fd7c9950de8324499a28c51e62893dce576ba1defc68e6d249dcd6631659199bb01be5d1cb0dbc9cc1c0534d7320aea460dd5282bdbad430bdea99d4d41dbddad010ce21f44693e64346666decd822cdd8dd3dddda9d92d53b222867831aa1f2a222adf03b63df462e070c004421d8f700c06c4ec63667e09f3a197398d258529c128cd28dd28e928f528a96073bda703cca1e2d19eb754bbbbbb36ebd0dddd1dfe7f83194194390533333333319a6b7924c12499d3f14860e59c02f43209256d86c482e9d4ff170d4d145941494a697fca2b47d854092ab24872f1f4c25f583f8e14fd6ace2965ce12e115bdfeffefa5374db96e3ff93c95b29a19fb4a22839a4c7ee5be745fbcaf9cafded7cfbd3287446777773730b985ebbeffc23abbbbbba5bb6b1d76d0db45fbe4d3ee8ce65a1eaf885d52153193b3dd407477f78fbc761675771b7fd3d2babb5bedee0f32cce02e69b662ce5014459184e65a128bc62393404ae698844fc78ccebabb8d762d2fcfb4a4cccc267777faa716564663e2073bc498ab3133f3ff7fa5b448802e7afb3618d05c4ba8a155d616b24f808575a7562643d9ec6e565b45b9eb46d1dff1d7fb49dec470bd7c04292aeca8d8988015e4e5a7c1fd24ea9c0c34f1ec626c147d5c2825735058f570b23b0b2051a4e0b825662b06191326032333b302f4a529feff339bda0d8478e8bdfd3b71a9b8ccccfc9f6ba6882939b66565a622319d1c357092cc6960d4313333edffff7f098687fbffc328c1fdeda10beb8608130c9f981ca11b2710f174a178f967703f9760887dc288c8ccccffaffb5399ec25c4aeaeaeaeaeaeaeae4e979f99594867ae252fa7878e10fa7161e694e7c6621014f1d9b5bc96f6ffffbfd475c4fd2e4d7472f4a6a6807c2f47c1834326ea8461d27733605dad066a3128d08752c0dc6f66e6ae23732d938050432b0cbab24ec1ffbfffdf2b127aec8042aeaa24bb1d9b2556332954f4582113e4f2f3cb25a1b996c4a2d1c4d2915dfeff3c43c93a66401f4c21164f06f8ffa728cae74d930050d4beb89131336b90a363a6b1a4e5ff7d28fa9ed0299375888b3633ff3f122b732db3ee968ab48d4012761b9104c62504885aff2e24a12e2c7110962498723311a228e1f164cae8eb45cd0b55bf1c2a2a7c3cc64b0350198be1058e019899f99e4029a69c0d12af28262fbc224b2ac92b42d6d095cccc8c767777f7d5d615521daa596b532167ea33fbffffede504668487eb041a412fff4a0105245537706e7c05079bfc0240d136f2ffbf50ef7601545b383ab2765280820434e386d148c954cf550cfd86a25299ec1f2ab208575c7e742581806f77a9668a8bcdda58152b732db3aa6ca936666659ffcf9bfac127df6e8a18ad0f2a4e5bf67c762defff9fe53fa7388b1c538ba225b8804c4d9192e243e4e54880c4f81df58637cf69196a412220334d412c7284bdf0119c1e5252d455f1308c187011336594605f3c4b3efc7fd3d187fb67b51619ebfb59d2cb74245cf95f2b81babbbb835330b8ee7bf3feffffa59fb996c1124bc22a992a20530a55be62c3203ea47851f1b23a4e1395862627356666660f3c4440f8d8acb54630e65ace646074d3ddddcd7584eb3e76777703ccb1223f5a09f6c7f813803b01ff6fc49543b2606858c05c119d22d1d55209289d141c54904688fea20587b3ca108e6fe769e6e0996b99d3cb20c7cfad5b9c55c5097434251f30640a50414bc81e2d15524349472e7e639f98f00c60ac1f56f09a80c3c4e11e3196cc1bf87663cce8e0d31214a2e8ffbff9d20078c1249983c8440edf55269adadddd392eff977ce65afe8242148325a2cb8f46a48886956171681c1e8749aa1c958e8ac7ccccb51f0a984834420a881d219271da5741dee13133ebec5adef4a2e6cdee6e9de24fe818ffb37471a2951076147fbfad2832482f5dc34429266cc62a09d54bbbc0f5f9b4a324eb6e9ab5604e1f4a9f073530e4722f4cb91045c3146347941ea4ce8b8e9ea2548b2d4139e2dfb3bbdb9864ae25f042a9248c43db8dc6de7befadd1b51d65922794c938a05c3233739a010a63dfceb3bb5ba733d792976342d7e31b92faff4fd5b4bbb98a9999890b8863de0028b905d5059443ca0b47e1bd5014a23201c68a177e0b1c9f49271e62b1282aa4cccc4172762d2f1770c289687b58aca3fd4f63b1287ade52edeeeed9ffbfa775a2e87fda45ed6d77b713a0b99650183819aab6b02d9adadddddddd57fd0d6666666664102d8114aae912201cdf588c458a68d7f2a60fba10a665ceffbf859999ff9483a79c900e16a666ba5e78055ef27724d2e9380f2846d1c3ff5f26c38d8f01b2d202a926399a21201e58b225c8153084323c665e134c1e35d8f876779a0c058560fe7f1d4f97a3ebe97e74443a1f877890b6a854eddeb6e4809501031a58040d0351208be3b0a50e14000818ba88d4903c483c208e47c19030140603046000000000004000804060180483511a136d6b3d5b004e4044e17b755db4f41eb4623c06417bdfdb0afa0d0e7eb526567e67e003f2393c0286a3d9c070d10cc50d768ae40e7e29f99df66c3e27c42c5445e7992c4af530bdb4d24647296d6e9abf372ca0dfcf36a258825dd9fc67dfdb73ab102901ea9b64f79496794bd0401eb050e7ab97487aa562f4b5294100a118e3182f50222801d90b693a3d66c347c3a85e52e9bb982080720355ffd3c4de9ce8dee6f8bb8a8958427a4d926fde1569f832fd774f31a0566d60b502e7bd682c7f5f8d80a607230265539164a51a843fae13df567797de127fdbef3be8c916950867e8cfc649673da2ce0c7130ea8cb85c24b1087308e9a8e3e35579b783cb5bc5f8883ac3997e42cc478c78217cee369ed278ea4ea44c4852cf7e14413fadfaa3f733b2328d1794c94ce2ef2aba673cf502c0ee1851d8a079e69eca4c34f523aaef53ce18c5e91275b34b21cbf6199bd8a705effdf3c243177117724a8bcb755a74d42705205e0b7cd953230ac860689e30a1dfaa18e81e02124a8cc516ae19f39b0b8cb53fb212d0c2c76dfb27df6269c43c6fc5ce64cbc9255a82ca1696fada3dc5b77c7c91471231ae98f270ae111b66ce8eef9457602226b41c2ba8830924ba4ac1b589b0185ce7bf5d739c04e8e48c429ee46f358364f82bb75fc6029c394240139fe9509fda82cbd71db160005d96cb346eae5381083b13d7ce95f5dc47e58df527a37530d0ceaa93dd575e369df29ab31b0090ad6bdcab538a4ab65c850bf12602b35c5e78e2c968dcf97b995f74dc1953550880f8330d174b154ecedf54fbcb4f69e0943f665c1132181650b1bb26d09d2b37e39cec74162baa996970fbcf9e05efa703102ad3df101febd833bb1cc1ec70469be0758253efb444d694be5950462a46065483eaa5869a8834b827dc267e37aa2ee821869a99411ff3663ed48bb6a1aee3977501fd89e2ebd01d00f14a5d3731d01ec7aba33894bcdac6d8c75abad89426ab102b17534b14bd641a1224b16b0c948af4e30014cb50ee6834da1d2d8bad6533442019680ae4ea7e236f248b1c85c41ed264cc0283fccee4155cf959076d40102543fcfff263de320d41b12ca1eb83e768bbabe4755c87b4d420f84044e6c8669fe879306d043d12f7f1568396702d7b9d51cc6e61fc89e02568d93a7d3f14526b393854b934ec593c160c9629aa697f1014288926f135c5e7205966a579c7f6a0cab67922b7172665af859327c3e2399bc1c07a13d5b7d5cd06b694fd8497d1cf2d44adaf8d58138e5a6471c42da4b043164c5e691050610ac5578bbf3c7dd6fc6561ed7ab042bb4407f18457df3473719e8e571fefdfffbd21761c6e42456579c1d828dda22f5c90b122456841ccc88614f08f20560e4a0eac6570f43253a9c75746163b00f916282193dc1ec416b1f4a2b84fdee0c782076ad1e1a4676318b44d779b078ecd02563279788c269f924cba0409193543af8c46e93d89b32604ca5549d1a2545141a41d804438ba06de9ab14b40fbb474459c0eb4e466680b41ec0c2dd01cc8a38048c00b6828f33b15d32958a0856bd3edc0eea60bee9a24e1db8e20d4a070257016116435d1181156ba652390219317863046bae079cef7af09cc2e2e1a4d14cc96812cba690b959f9d5c1b0ddb6d3f498a15331d722275dd92134dc4a01a36a4f05023dc69bf53a6fd0dd8d6b8b963864a9890675e56107cfa74e789ff301462fd066ca1c39cf065c0c55c9f9dd82a3fb8ca55f492eb4d690094cfd666f47e89133b0efd5ec8cba1dd0afbdc90095d96b324a7038ed356705aa64513e475874faa97461050892e2f50e2ec1ed5c787d16dab37ce5ff092860fc8e891e2ee281f4553dc8e96d80c1aeee4efddb34a8b8051a597e02052148863d16cb750ffda94d1a0715b21175d2a250bf2bf44a9912f82dd895444738942225a7d3f8f8fa62f5cefd74b3bc1467838cb76a5a296f3a46e46ca6eb0b784d2c3ed7b0f0ac61ff5e4de0ef73d08eb6bef1091985ab8785bbaa2f187e9c5a6a850f318183a6acb7e5eb77d3cdfa288ecbbb427647b2c8188e14a76756352f30bac1298e07fe7f21ad826ebeab1822a106e6a864e236a0e3719480c466a72f96360b17e1e13b11b444080b70f7fba44063f0bfa837a9cc1b403a9cacf4e5b57f5771f12c7a3d9dc266455ed04bb21167794e9cd07d60250db8cbbbd7bbeaf1f48ca71d55419b8d9c565c2c22a3b8bd9585c6621ced35180eedbd8bf17f08475b9dc75ac7338ad278959b0dabe2204e7c36006644fdff16da275dd6194263359530226c45900af32f96f0726c84bc9d87c95017ed34c25fe08d0a211a362f0c824c42789d7c896f6988920eee9badea4cde879081893368d38a10c7e35be10075692932e7591744a4844c3d4c544353f5009c9e5c5097f1786294d0d7b5b39db309aa453069c12ff698f12db73e5fe79d0fec6044ee5b2613e848f2e56ea66408de80db578b138020a153e21b82085a766e100ca4636a6b6bb3532023425e22a497bba88f41f888ecab45d7214aea7ff9969775a4f66b7440849dafa8da48ee2ba178d9ed61357e5a1a38eec7a35d1657e2f5cc4e29fcad5465fed5cede64e5bbbe552945f79e92017ee5ac9a7fafa7dac958b44de107a9d25f47ce1b2213160052eadc443fe5b710e58fd4704723355899a6abd97112f6405284c1c28e58b29ff23a90307741f8a8d825559641f3037dec1f952bbafd0fd0f1430d12125781d9bd297d4126edeec7820e2f53c80ecd9b590e840d4e5a3149b3c303dac1d743580374c592075e27f0aa4438aeb5d993dcd14fcfc65ec6a7c6438459c8f1b1ee222e982799f67c074183d32f7dafabca16ab4d3ea5386dd5951a4916830959fa7265fab80825917eb2c113697e5a8f0153271adb6583134526a9633449fcf357637c95d055331f5d9bb48731ed9efe2e6fb88c8a3561226a98159639c1c09090c5ca4119b9491d4876d789dedc8257c2bf37642b89d849411a2f2bd6a3921035be2ad07f7e00c6734d8a21f14c6a8fb25645152cd8b2cca7a63db14a4e095bce775a690cc710c137f31952d8fde14fb0e1ea11c9f65661cac9f19379fbb925aab4379671f11ec75a53f34957ae3d06e3004fe497292399630e0167d922f79db602d727b41df446f11c5749825e1b0cf2b9b1f3a354d68536bf70f162b2de2165188715f64ad43298522ff3f19550e342b7d5254a6546f93ffbfed507da187a05296ab7f3a461c8083e68069e91d86760e29ed1af5328e46668558528d4e8dccf8068ca96d7086d1c1860f05f79803e2117b589d6d3a2ee53f36034c6fbfcf0c435472480346b0d12c106b7d42639e77357413ff11354dad24251c66c99edf4b57bece30f85c3c7716c0312b83257d0940ae242f19aa5b80e0a7559141a4de77c88a27b538a5f775462073b1687fc5ef27e8bff0ada2d91bc73649ea95d868b736486e42460aec975e62df7fb842324f9ffc5f1c1cbead05fef7e807f1438e485456da4441612057ae4d8dde49890c0f503a402c38a563c6cb8b6643455ad75483105e04e6f402bd848187028eff99e49ea5d74a518be8c1fa263a826591b7be0dd6798a4170da32a14381d403b63a56d3b896c76afa0ba03a3c2bacea3877d856d76045fd9bad7e0ec05676e7acadc4b8f6b59089be922fba9333f337b41b5cfd89b711dab6f716a104b24ac10bd3aa4d50c54de8a2b5d71448463f8284bca13e2cf0d40801ed5ea8e25131b026bd01f7f5c4b0e8ff3757cc4f43e7f10c3c825d2d8ab31b9ba994739e84c79e7380499a6df1ca3697e59bdc3c988d4a78f8abb84a125c98965e3e825a1febe717185f0defe725f79a5289fafd9287a59d6194be14ab5265e57717f3a029d74eacc49205164b407ea49325a7cb2e699312198eef5c0cb86b5b6d9ede1869557f9a7180c163b4285783ebd24d0e8a4d8668045565b94870fdf8b11fedefd08f2ee7b062805aa83c88d333243e0deeba0c47e33525362d7a9772ae24a1fe1f6d6dab3cc8474bd1703bd5bb2502e88c009d8123c51b2552808311b51e79b0624c446ecf6d006e62a418a9df43557078a9cc3dc2fa2b66d992e589236b27fef424b702888d2b1a08b5a8507192057163b20d89e0d18c72b55ddbadbbb0c9dc4d16a207cb763763411e5cae22e25db41b84d6420edbd1de4070b6eb6d4c8d470cce1d3e1abbed7ab8aaf1713cd705f45b5359183c2167c023d6135b9c58d76d17c780078152fa5e0a0e300191b957b8bfe2b713f45dc4fcd66fa9edcfd97a7015f0679612eacaf7d8c3dd73879931e97663618a92047bada6107d115ee729900759818312c1f27e456a82eb05fb2a7db9e39b85687bb58e72507a6e5835f6a12ddfb0765716c6dbfe65785a9f77e9741161c4cd645d23d60a29c5dbe42be43c8ca8504dfd623caba9c03b230ef2c7c6c4c40c55846d0c27340b62024afecba0bc1aa9b030521098509be3a115c12abab6d4ec310841d8111c0247e263608f1cd2161535053607ce61f32bf7ade46925c3b9aa7392f6c4f6640d5b9f728ea7e7a06c56e991a532c567119bffc414ee2f327b1151d38082311e49dca87edc40e01a993d343ac4300cf86f281edad2c02e8a94c599715eeb01c4702f31094f31f7111a3c473cc45fa295b39a153925ea1b0f9d04e26d9d377f649699979433048a52ac1f93b051277afc2c38c1ff7a34a777da65d8ae296063db3f137781484f0bae75dde315ecb98907075764c7ade51858da9461cd81d8ad8e5073ec5942f0cc2d3991cf48e245947eab10653063febde89fa6d532d4ff26ef297fdbf6413e3909b39cc53117e83306374719739a88f1eb15999583c139fdce98825ad927cc32759aa1bfd60c6bce708bf0556affbc08c33183e839a5ff615ea085a8ebfa64eee11622b951f0dd9181f5171c8332fc741b01d106520f72df5ee3f4a5784d5f6601046ae32a02fc375b2346b6ccffb2c2107fc912b7fc1d8a250b2c45da01aeefa9ab1433eed657038fd74339c51fdcff7332232dc4f97dc80a16366742b25dd5a270c14f73483d548304facca8f3490b9abc21646116ee078abaff402dba907b45d65b33645c4edbebdf0ca413d2531b8594c551fad86f1f0f10ae90b3e8744bb7fcccbcc9400b83794a163299a7ae40039f220aa7099d57fc53366c9eb73f610e7e0a1cff3f36cc561e7687802354f44438cb07212aba80795616ce4e4aa924548cc64e8fc41da67f10218237eff6d23a5edc44453c6b4d5c73f983223819528c66fc4818b803495d852183b767fb7129b8e1a206566b9e60245a649d7a4edd49986c137bce71802c826935909045f57effa448311fbb0dffa9736f3608adc88be53436187767bcc4cbcc408e90f15db05af266d28b9aac23a6a04c808d85da75bd9252784c6070882683a2588fed6fa444aadc72747291ae0c8253ccbc1129ddf1907e0d67d557526927b84ca8af52e30b67fc61b4e950237240b97aa255eed5e01702af8183e6e04599945ec3957e0fc6e10295b21042b798f3b6e55d2100b38e3ac1dce2d5930515989a7954bbe03ac1be4abb4bc087c2db8438fa0e2798e47fa685764b3483d08d15f73e6767706d09e699dc39c47bdc3e866fb3e8e2c46482243e05489caa3399b5930a3d88458e6a51218ef21b73e771d8e7c04587c3a434e2f49bad20ba4cbe858ab0beefc2bccc13f41385d990404f7322b2157e891949949bd888249facc83eefdadac9906d815cffea083710b5443ecb371a5d5f4b74ef05ed57e8b9a9466742d94c846288c46251b230ce2486cb3fd9de233f299728222cfdeeb03e1469d9cb168bd9e38b2602f53ae55e13ab28bd07627b1e3d896cd8f905f3955c3addb56f6912d77ea5a39b8e87b86cd9097cee2969db1bd43f22b23a29f8a379bb2253b7f27405cc65bbd26964ec39170a5c8a37610f603250e44b19613fcdbb135b8c5b6162ea03a0103cd095b23c9d71aeb972595609b4285437d9c9d8cbb9c83501446a6f526d584aa4c0cca7d27db309de9ff83483c4405094e874510a3c3959a3cd3a7a94b755733df42812842d46f60adfc08b6eb14a4f9046539a77c668083f0343963a9897ca21373dbc567a757c7fc0894894cef9613fe08ef8fa0d209295a88ada558b830d57ac2efb21fc23844fd6feca93378a605319d86dfefd0f38e90fa64c847727ec6bfa4fe0ee621bc8411dcee6579dcae6f992e7569b766f610f276307f82420d43a86e6d129dde9cb8a5d84476a89bef088b03d3a628a4f674e2b4368fd5a9d2cc7c00fe14ea1a91cad02c55926559e7149fd2197e4a5b1777d45175ec91eeaf430b34ac551bae12194cb51ac8cb9f7c323fa7b881b2ee82b9763efd657de7a315ed14f85c1859bda873ed3709147695e7a056ef35247cae3b3b4fc5c7a4858893be51df78c5a7180cf98b82efb1e5260624e4962160372fc3e49c22983557f79484e4275b0298d341c6e450964b314f79b55ffe5badc528fd125ea3a7d94748cb4ea9fff388efe8a539cd064ef0c3d67220b52b969e44163692e0cdeeeeef0255f4293b2433ff946d6e1f8cbb3651a473a3411f7735f9d7185b41f49cc0641849c7650f03756c3acffa950b12aaa740ea1ff84040cb70a1aa612e83188f91aa3b2ab91369f432fa3ba9408ef18541eec8185a506f418b9e487c52a97c4a9caf63c745bf4120cbee4c835a046914e49e3599f0ed70246e2d4f53e76167f3fc925981ee62d79e9762c6edf2464fd0554ce32a2419395b652152b630cac903157f3a56ab28b432a5b25c3a40f01db30c97f757e0280273100ce978962bf26c430fb219e460dd5ab8e0c9fa8e345cb20886921e1fef8fa32fe1875d831cb7ec6923f5b51cd41b552025463f7dc99117c4bdd5310f67eb39e88c7159feb6e09ec5ba18bcdafbb8aa061f652c28b8452e775266957a46300b414b7cb9505dcb5639cfea1ec668ffc106df49ca66f87d2faae9281f9d887b2b2f0bab4f1446ef59d4a9058f5ef41454914038b239e1084c42a353a61279c4e5820e94769460356501d416cf380e93076b8a41b7d88c75bf52e0b55b374af961c84729773e39bc7b6a10271cae1d296847084f1b20f0faaa4742a55de755e422413e2279df193c3f6eba6171a35d8e30a62e9b2de86041ba44a62362dcfc86f84e04f16df5058a6d1a1bb16cb1f33f6e4c88c3b5e8c3a81890418e6d3c7ea92b976e1cbe0a795ed3a50ba6e7388b0d70b4d739ee2bd92cd4ae4064c845ae949a3edb8646583bf0a0675288f6f9b0ca454904ac4f95555939ce6c495d6360a9f7c938762c235773fc91af46410470468c9e49e4b7df96a52508d876488645f0c69a675fb1005e1578bc4a179e8010f90d9a0faa772647b51f51b3ed9715b9a4fd4af63dba8fa949872a89e8d8f6c6a449d25c691d63a22d1345c91ca3b4165fa64ae84b848eb17aac23b621c078fbf400f5ef35b6e4f7b12e898bd8f4e217e302615225f4d372997cc6576a5cfadccd0cb39bff05a4ddd0b92b1d87b63aae54bea71d6bd67027372a9fc531db4c13542ac85f03291b25e9894e88a137c46e903339d1131057a1dbcec3e73c29b7bf9ae052fdf2230b5368fc3b42d512035bda970894bf4d7a0b8dc3aa396c9c12c6a3e23a70c7c644114e830f065f2447f8326cf5d823446f0c755f5e75680d0819d69fec4c9d1c411dc2fb18532fe8d92bf23d959d5950e83a2a8179f3d65a9ac940432ecd2a40393800eeef2cb11df629066c19b892c2c449293a431102152bb559216b15ec67f9db349f75aba85d55b9b190d63a4334f371a8b1175707849b9e41583a9808f9efff961a3e7c49bf7b2541a49218b1ef1f5058c3dc3477bc42847838a71ca96ac40fe743bd069bd8a09ac6a76d157c9c301ded4d2c0a04c80b1d95b099dd00c032607edbab848b2bb634d1b2f42287513354a81203b569bba277c629cb17b8de713910cb68e7066ce4e893b8516cfeca0ecc5f43dfcc8f8e5e85982b89192ecec7d2bbe4381370da7c4f3f00d42cbbff74aa6a1d49617627cfe35837efe0e5c43748aa8d1ba2190f866126a8641603ad1d01bf032d438f0e44b4903c02a56fb3b68c57c45c4f4771bc302326a6df8a4629e4b7414e39394e006c144c45a41ea5e216180e9f5beaccf30348868eb7c3cd84bb3343984468756cc395dc8a41b3b495a682993c6650c284947f3591b86ff720bee30b6834299fa4b0ba3d555c501f219640a309cacc453b2b2bca1954e41178cae0352e639346c9173af20b298d01d11ddf3d68c2af4c5cf0a7889e5c5b52fb85936bc69b8039eb87b5e0e85573d710f5ed31c39535921fff696bb63a728168a80deb111417198668e27dd7133a42e1c50d7ee518492bec3f6cae8d7d94b0f89909b525f0896e4f699950e69adecafdc012d8f6d589abb3d4c73fb7760deffe36d019bb21e52d278981ff228ad08edf871be76600e92852a10fa05536e26543f2a2e9a5c01b24aa6094ee00910148bb703e320f8156c25461f84c0236720614cc554733e1a3450e45b945d22ad8b5f157fc0b19a885535232e33c77bc500b9b57a6ed07be92d9e5c731b1e98f6344cef7c52566637dc818f38285e003dd5136afc00b145d31b4f101446c40e73fe035f3beb1575b16bf1a529b80e2c06641694e8815cfc9d0a0d5aaee795f184475737c1b93cdb05b20c4cd9135400c5ba6867f0715ae53354d5c0bd06f88449c5002a7edd6c71f31032cb71550c8800a36746e4b8701efbe90a0a6db767dd46aff01217f03e322bef4d767452838596c80f2181fc7280150520c7a5df7758c150d4b2b0f7e212fbd277f88dfa400de60eba6839901fdf6aa53a5605b284a6a1b20479db45b5932a2fd081f4c44c4528b77cb242b9c1a462994c9a4235dcb2e0c5724fb86d5dba7e86794103296816c9a5c3b61eb2a035c3262140c87dd9840fe223bd2bf5d801d098face9044b6734870781f00ae11be89edd43619bc833d5ed64ea6e3ec8c696550641a3153a832f3ca41b7fc2a82fe49b85110e80d7420c41cd33a56975f5daf7cd4817ab209b83237c2a69a9cf09278ca1355ea6595d48161662ce729df779994ac6f7c7fd341026ba3e3be16e053442d1b48ce4aadce8f13aee20d2f5b6c3bd91db9b7d121c7553582b4c5faf599a2719490b553be9287c68667b6950467ddf01375298ccfa3a5682728b8d492d4c70d23701871084d66da221483bd8f616a2e25dfa27c08c447b31b1e94957f81986738a2b662e111c96d4fa204b8947873388ed1f302a2da03b5d61525bff13f7df7478d61be610ec19964f212fcbb7cd99593f27729cfaed5db4c34032b9206de727a13d40c9c3ede15ec240f4a2cc1c6e8f5cd6bef58db01b2dac31422d5ec4c16a6d55c01f177540cfb2c28a0c712665d43982a52d4806e7089baa428272b695d03ee02607a9f83881bc58dafcf3e0f26248e12541d4e2afd424fa0befa3b6f1446c4da7f03aeeabeda2332837780ef2d7f0134d4c310bf74e9349b5731279e3fab3dc1835cc2f32fafd809bf5e5733ab84182bfb033c44aa2c260630362169bda618dc4a44d2c0174299596709508bd405c6937f2be07df36fa0ac12a3e467a7942259898372ebc00e51c1761504e488d034c48a97304ba47a2d64ab8c411896c95340898747520e84e6531dbe39d9b8a18d437ce37f4dd074a5f8333fe786b8f2f412c8bcbac323d52bfb2c2ca1be13dc26d45769b788f956c07d47850de83348986d74ee77b3265d131732f2a1783625e5aded10154b43b2a931b45c0a737bd3b7af62f12db8577122ef795b602e3332e2341298da84df5be4b5c7528a8c45905364ed4732130987c51b06e502d7e226ec076a6b52559a609a2d83e7a533799b08ba7004bbdd272337e133e1ab963b87bd64f332623887f60401ded65e89664af06a8fb8e20cb1779d55779639e676feef8cc8070bbc8a653b8c8eb7d0566fbcf0916bec71452ec760f958c7dc85a181464b84e20776b57a6a4a56d980940dd120a5da2c87df42a42184db8aaca732d51785fa24088206b304643e6c52acada9d95412fd3f09f013e9b90746f9f5f5195fa219c97ff13b208ad3cc864b5c663ae992fdc268bd5d7671a34578a966ffe0cf1cca8cce2ac582b37b32243582620a4c4b5fd140d2089c292179e57d55a3fc233d3ca577a40c258160cf097b4d676b831caa10a263f0af6777f3c6dd1a40722aa95c81d209aaf73d58765c83c2603074ac6aae12aa5098aefb668c0b5c00c22efeddbde82fc4d0afb620b35bde15434784c3c8ef7ca879102de4a169954c5f4ebc25bedeae032133d357d7589630ebbc452563ce7492d7c8e58531050a3ce999ddff50d079a534aefd5dc9a1671f24114f081a5dc8f067eeaea980f0e24749e59a5116f51b337e6c0f2df4e8b57065eb08068868a546da4918e79243837bee06b0acd8fa01a3503a7a0396a7cc6d441113237dae932f8bfc25938912fdea08c1c68482be346a861f17fe72eba6ea2b5a52e13666c1518f9f927ea20f8956da64204a6b97a4c2ffb9b5504588a37fa29a4678668794d13c1a23b3bb6d719b14e7e70a6048b1b175710134fa52462bf5976df26495a3c7ce317f2de632c2c1e6273935e944603a2165d34e226db9c5fbdeb558a1f9faf98209296923768557469802743f410df5a8ecaf2e56722f790c33c147987c3e1fecd4d05f9ac4501e8b1c173622176e61b84a08b71e4ee90b507716ffe033fac3995f2d52c18206cf5a1522023e91932ef9b41c0d97289e702112b503d2d01d19221c08c844074c4474d117e3075a5efae69dbadcbd53562655fe424343526045a6c433bf695785f3e28f561140276fa3b4475af0725d27d42cb0d801f0048314a038e5b87cfb46e417dab92a16a9dd14ffcd8f0d1bb1b552d888a7405d4c573f5f45ba8072ffe5634a6ee086f15f0124b424039a551670584018daa4033d4a6c6b8da65f60ef6c1e92134c2da6a67c4c931be563f225ab3f82a198ec3151373f96abe4025dafd0d90a9fed07f77cbca3653919f186eb5ebe3f8593a32097507880bf926d4412b2e5de5bca949294490666070d07a806232ed1181af8fb7bdec4d0d0efac959e44990f5ceee2496611924bb431a9fa1a03e53740a361000ecc8096aeb2427be0fbac91410a02b8db9d6b9228a1c3cc150e8e66f4ed6aa9c6d1cc901ccd0dfdbd030c90f5d3f4e9a3777f83a3d1213441d29a307056f97156d208a672667e1d1ccde63819f7104a387fae1d22ba2817b47f735c0edc9cbacc0bdabf52302a486ec086882473c18677675b26339a80c116ca93ad067150b1eeeeeeeeedeeeeeeeeeeeeee6e667667513a0abb6676d012563881597950fc87baaf1833b7c6dc1a7fab0e0ae898507644506e68341ab7e364ba4c67c4e9f0c0edc09d9edc4ea9d45d68955da8fbd684fa743150e188a0ae066e7f4ea74931c508a7e33f5e838a996204508ec100f2ab0ecaa1af23d05747f979301a19194d8d9371cfcfecc7f4fc90fd801fe401eb03461de658e368587bc00661ccc77bf7d2d11c6932eee50c4d079ab5d1cab0406b5628231a5fb9e89030c6784022103eb36cd6c6e911d6c37d0e296844208756723e71c82145ee332d1858caacd01adabe86b6df27a0752c1ccfb66ffebdaae3f1c1890f4cb839d2f71ce50c20942b06f5b93f0388c2646066cadcbb85f2942aec00ee169e339699a394381de114cc524ab9dccb433b2db6edff5a4448f4419e3e85748f73fa9c9e7a3fe70719a7a9c71469efdfde270f4b67dc151ee36166769273d6f7778d8e19cc50739a55ce8bbfba7688755d4ca63fcad07ee75cb0015e12b8d836d0c5862c9c352f50b83002d6c0d64a30666fcccccc7c39ef0e4b1a8d26f8dddd1d453fbca2e07f37fcfecbffe657396c7820f999d50024947f9b55a44dd1cd1c190a5cc5f7598d8cb88817b392c3e6edf0ea00f5ab69c558c9df6980fa35d1ea6294ea67ab08536fca6c19c66def0b8c6800e38f63ae4e855dc77921d9068b7429a87f752a3a684fd9a309e992ba36e23a949ff04481ae137fa23c1a8bd18424a301d1c87fef210302fffdc48050ff9e62408cccc480597429890f840ed3f3571704e874d5a0f20a5dddd4b31a379425adae4aa7cb29c8ba1893a12e1e1ea59e2d1a9cfadc81a541a9d9ac473fbb73802e6b203899f5e80ec48b3119fa083f233335a48021e5023353eb9c1823fc11a480d4273923177def1ac91ac8f735c65672a4fe38eb57b3922892bb684b80f245f985b88e7274b500c40f16b42fca9393d07299e383d109d9cdf2afe035bd33563a42f9d76d607ffde6faf3f6b635c177771b6bedfb7777779bffeeb0d299e67db714d9ef2235199b1117b98e8529242b75c3289d9d1590461a69303d82a896e8fb5a03faf7338e46fe7b988b3999f82f97e8624e867ab3e23885ef70071509afd0f5e2a39e419775491de893f4bd06713c94461a69f0e094e70cd558082dc2567275d45a6b8d8d8c84b87611ca37516627e3a2e40242597221daff660dd15aa2ee9b3543539f23d6c3fd007a30ba30e0648f287fb3688001892e8ec031452e3082225485b8d12889a23f881f124573fbfcddfb3c6d7820f719edaf36f605ad6e00125664d35832aa5193a94868d59aeb6ededdbd830fb41b6bb322a1ed75e8e046a3a4fa207e08f53cab9158daf184e4af23ca53472bb928e05357145dfba77f0f2f1b2cb27f9a55c77e8b0864ab48cfd84a3ed96241c7bd10d71691f6cea201b6d23e4fa7818121050c2934521e6ede3c8f0fe9e2c4dddda3bbfb10ae6832ac4a1753912160f9e646ac142e8c40854e0a7e104416481882153c42c8598213c0e8276e05881d7777a7763cc1c537e10fafe862094b5882132c58e9e2feb46c194aca20a20c26652c01a7eeee16e960094b7edcdd6a5d98b8a0458f2b827f6106912fb8a44189bac49c75674a7a94f828d9a2e487075bd2001f5881c9e224cb13d9ddddb0bbbb9f1155175ddc3a242011c407ae18620461d49084165d6e9084133d585a055c184185a7064eeff5737717011a4d86292182c912506820028aae990279f4babb7b34069362c38813fc408abbfb127777233c9c1e3bbb1250341936e58a052851c57f8255b8f7de7b43781339eebdf7b660e92d62740341051dc000095734410829863c2c427ca04a1413e850a1536084b64212e07befbdd7205ca2cac289129f90732880a9986a4eba7148c7d3e3eeeeb0bb7b0b156ca1ddf0b5d0dd2266419327509c91031f7801431272768690061849200205ab849514c420d4b6c87123dc942102286060e58830501086172a20038a23b45ca14b2f518501ac145b722677ef8af5f8c4a7a4b708a38b950719a0040ac208651182410b2748f104d6b6e8e2092b78383d76e633b03419268696226798e13f41e78485c64553821578f608318ed0728419477039028d264a8a0091a4bba7eeee7ed9b6c5c930e82e5a254421811092e0f2049e2ca6b0441260308901932b0c71259e5857a3cad4c4cb184b661823c7ddddab87d36367f8854f93615b7e8a7cd105767777bf26b058a9b68c01a585f7de7b2f8b195841df83ed42a1e646efbda785107ae87bcf9d40891384c8a952022d5030e45dc1c50e72d044098e18a2939042c58dd17b0fb445114c50639de079ef4577774762729474e652b81342384389ee6e2ebcd042bb7d888d52032952f085931c21ae08200658a84441094f78424523f1011bc447f3617d787e7c7288a8a2e507085ababc3044972e3f2c28c1921f9f29b897c45006bbb6856ccfd3fd32ba749beb181a6ed85969d94ebb368ddf2e0404f4fd8d01b1be9fc4803c1dd0d0e87ba24b5e8c3df6d005ba2cffe85ff953933f74ee01760b6d35ce82a9f7e9dddf93a8a96334d2a183abefee2bb2db024d669a1508d540c6f6acc41178213bfcdc4a6e44d231d37e29337fcfdfcbb56794bf71fbdd022e010b77413af6c9dddd9d7aff6262777777f7e91f454d53b707d92fc0a8e8a0622e483e006d1768cbd0be68e310d19e1810f8fdcb686e6054beb8c1d1dc78179a158266952f30d5aca51a4fcd3af3d3ac35376cc81a722461e48b943b6cd9b0dc58db4625e473831fa8e458cd91d8de59064364dc40f2334806ad1ba2cefdfc407705d6c3bd4b41eebb9ea9a7c7f52cadee0a64689105154b06e51d7ee2440625ada465083b24ee12c907cc7c8dc1ee9dc5ca4ce1e6254e3010d8799875c108a8e1af4ec741a1cc584866f744a7813cc1183a28cd8a10f83828ce2382521a3bcc7410e9074b3a6420f9192c9522027ea2640c75f0e0c20828ac83fe80036e1e1554cc0519ea87efbdd7984c53b45f682febf1f40a147ec57197c8b21e4dc4bf620f5473a0d05f7bfdadbd5bff342eb47f689b417be796e6338790cd8d41585d126e3f1a17dacf700bd9cfe00ff51a2e8c61e3d27ca00041e3d23f54c09fe68929666e264df08669a6677886f1dcc0a59f6ee6ddddbb8d35d6cddfdddd8cc5f6962782702fdc75f468e2510ad44f6d2aad638396a2a9bc1bb4ce6241058bd6a17e1a1374767a74a24059a28b1e2dbaf0f9e1c4c7a7678c2d4cf4e8c81061bbbbf4d26377777777374feee7e92b56bdd8cddddcedfe9ca7e6c99ea7a0b979de104b44cd942abeff430161e50c9da7cbdff330bab62474bfea410723edcda51bd2ee1ed9cd8572b7252f5cda120c3085d041ca90ca807d4a303277777777773333b30c4a70973a044b62d0c10ed66955e85631e2cdfcad9f784087ae07a0a0eb433ba12e636c561a0d7c9e241e2c95d4509a4c3f0949e9275568ed260675effb09892425fc1c1e0af5af4f0b55138325b59f501e1704114e9887b28e8b8049708a996a6a5bc867f05512ad33ddc27610d58b11490da8ff6894035a49b4191058723aa20aabfcd24c4d0e8e4634654d4d686606542a59ff7192aae9c376aa10eaee712d1a1440fde163db401509e56eea57ed00e52847fd5a3301721419d8c333411240c8b0048e1f70fcc056c6908e66063a9ad73a987943de24e570423e4ec34d42dbffb04fe39fd5883366eeee67cc5cd9195ba6b032d8195e630366b6657d58cbeeb09e133024b09e1eb01f3024ccc820d15379418313c09eddb122233333cb518c236e3d945d122b1c0df53c5d14390a428ca3248e863937257130897b499c27a9a4280e7043a8d9789c8c7b0268416a3d518eda9666860874da96f6e92c40a0cb052673001bebbaa20ca40d1f0f6cad05ef13e6233d3c65b67300176448d7730defa0c6d13c074d28bb85166895d4c6e93471fc80c3838cc6338c5c25aedba047cdb7f933747777e70b03ef7738922409e59f7c7277873e9a0f8d8a658eb1c605ca32942f1c22ca3f311a09c4a930c9a00f1fb44a9f0c603ddcd75421f72d6e776632ba715c14ef881f719e461acc8373468440cca5976f623c30908e3fc4d6aca5e8cdaa50245750958b8ef9abedb5762032fd0c4bdf57cda2410194a23d198708b4927bc00b2ac0c230f2c4235081040fb5d6a7ccfc4836ffed6e9a6729fffe002e68c2abb1a6815aa84951fcaeb2831ba84acefaa5909c01cd3a43ab643c35f106c778dcac42a84308e13778d5f72a212172400657a13c9184d663502387da7152292fa81d1a70a46e40fd2be5059da12d8310ce30523b8c8c1c0401a91d5a2347f2fb05b97aff88c352e235b1925bd43340bb270dd0de0ed0665fe7ceac0067060780766bed793020d3cbf7de83b1ea47a7c9fc29b313ddceadbbbbd717c2d83217119a7d1095c40fe287541fc4cc10ebfb3506437fbca2a0603b633034bf0fad9aae46a96b590936a40e34b5a3827cdeeeef5db0a9094aefd7ed90db12a0d381cc3f4920f9618c75b52ccf151cb70b2d555091cbc3523041cff2e890f13c0026e3bec277322eca00d8fb47fd32a39907764e8a087b1bfb6d1b2194f245c91d22a2590c46d9768f186307f2b9fae8fbeab4fadaf43d332056fceae893ff7e1990d0bf6f0c08283ec1585ea10b645dcc7af4c7ab9f72da3f5d8cf5a88f36770faf373211b2999b7a487a81ecaf287fecef5dacdd9fb36ba2bd753fef6efb739346231d3abae1b014f8fb3cc15939b737b94dd1adfddb6ec2498290cb857fb5349ab6647dda93edb2d396381ad65a5bf2da121f5aa54e898be5c2306e17cec1c112b85d384918acb55984ac08a03c22c23334ca5a899741b884191a744716d22d71b467f441640c1b0db80225390c0dca49781d117c4acccc43c788a6c6c99478a889f46a7c4a199f6ed6d5421f4dbf738ec7bb0624e6eba3eeab53f7b5290bef0030df5747ffdd2f0372bde3f13cbe85403c7cd647fb67d9ecc75f8bc89b38b4529bef0170c9798dfeba60feaf976fe1223d0b97e8775c375ec765e363ae1a9fe3b2e40b6938221303c752bb8fe371cc18f8fbef37cb06695828d087a60d1689e328e8df5b4fdabf71d9d8afc1b631eb21af0dcdcac4b0a1fe063497facdb26f3d0ed66f16cbd2125bcbb2419efb9defabe9a9af46221383bebf99be3db5ff68ba86f61a859b657d3c26d31e490b3eb466a3073af429bbc2022d509ed019caaeb4e0877240b22b2cc0c284461a9fba400c2a0365575c00855e7181125acdc818da0f0641ae31c08edf9edb8f65147eef0f78b14504b2e8da113603433e85b87e79d842f3c65fd820a2876dd6d662a0b0be4c516d5f71e0efac95299c31d553cfddfd0b7f068a9e3f5ed1b289bf956543ac4bf759f4315a36fd37a2197feade8f14c5b478e52ea96b4720e4e70621f533540dad3c777037cb960d8ed35ed820d473f535be654d9f388dde6c8dd31b554df7aacdac8ffe67d9c487d212e22228c69fd16abe07bd90069a31fed4f3c78bd11736483f7f8ef8d557a614e5385fe8af9efa173608a3d4af45848a81b6d3ba01fabe72f1850dc2effb2ba4a17f2157a6fcbeaff726f59e2fac0f9e48421b7ae2c4127cd5b582bde7041151b444c1425fa0ec4a94276f4a3a4dd3fbe94dcfa8f3e7e834674042e157d574bdc77832c6cc669ddee1b4f7987770757af63e4d3fc997d54f5f41a2975fe337cbe6e6cdbad474a1f7d6c55ac9b29e68ca09fa10c87a2f176b32d5341229352b9219eaa328db8b82942e9400945d91d24563ec636f9c5ba5edd07557ecacd63b9c46fb59fdd19a3b385a97beca74f4d353d4b52375690f31560a142353ebd9cb8b1067518fd3a8357770f4a5fa406facaf9e5936540ffa2afa48d55821952f5f1140e3cb676e46eba9369a388dba7435035f457343a1594113a7518b7af7d535e1ac1466fd8c28394d6ca1ec7e2f26b8d012655798e8a2870e80b22b4de8d08a5140b22b4d3ca1305076c505665047ebcecaf4aa922239e2037be8011cca1ce5eb668723143ea3ecaa5ba588838cfd3e9b6e11815fbde8a3875f2185b3beafacbf6a288c3fba589389b3ce50281fd4fee38bfe85e9044d988b3519d0b3f6233441b382be421b2cf27d3512ab9f1a7d5f711a539b376f78565f8dcc3a431d35715ac5694cabd82070de6c6c25467bd67d3747a2e621a8dcb312f6aea0fd702510b24a46e507e40d7f57b13e9e6c3fda9f47fbc11e6c1b46f90a134b6895b419805d6122096d5bc5fae85febcd9db23ed832e5b955b8155431ece70e9b066d8d6ebb42acc77c40c5d88fb6bb3b61b3e9dfd1b7730ea7d1c662f415f96be4398a550775af83e49ab9b9b92e1b4510f8018d56da7f53b652fba7ee27c7566afb35d29da338f2e9f721a381bf92325aa3454388eeef638bc86b0012baccc9b8a5d9217cd57822592b31e6e4afa07d21238b20f08129b3b6ef6d1b1c24b9666e6eae41b17576cfd84a5c23651ded073f29ca9157a6020f0abf9a76faeaffdec537de45c2599fb2ddfdb7db6dbfa711c6047377afd108eefebd3ed8d7fdbd59d84a385a426cd619caaa506e3950c8ccfc944584e185d3147ed52c22f0df551d854f9d326d0fb74eca13edeefefda9b965ae4101a0fc3145765f8696a80028b38ab09d1e411d94f1882bc4cd7417ff9d9559a116ac21779002f03d4a32d04d00f5b0db4d3306e47d9d9efa465d0c63f63d35f9624cdfb7791959166a20dbc72e28ab99816ccff68bc0d654a2a4b2228c0c06f8d5150505df73e8cfa13ff7d7afdbfdf918cccddc9ca4660acc8d4b14289dce2981a43deb04a80ee5567b05d4f1b38e27e99c2e181156a073d19ebcc37ab87f210412063994bf0c203a87fa814c62666666eeee8b9b49428c46fb1ec2dd89daddd676b7f1f242f8fe4d6603303333f3bb744081cdbbcecc3bcb333dcbdefb416966a6a666342b6942c8687ebcdfe9bd092ea8b5159260f262d869aa8986f0bdf7de83104249fb4d6f824cb857a1a94489f54008493224f441fc10d03f01ba1883e1bd7545119fb51fde68bc9695a8674da9e97daaa817d21ec5533f7f90fd02916a5c04bb1fe6edc2cd6674971d33a873cf96a40050b424eccedceddde5070b7ecf90c14f800a18c3b6dba280448f0e0c9a5dd098bb85389e3142d8ddddddcdcc3c726194dc49e0eeee5273777773777777773bb3bb3bc39ed7c33dcffbf1fae37e4254d37b2fd4b245ddfda24b5ea18b39233353ac28f8d6c553437e48354641f75a44dc7f9941f6a38a4ffc0c8d5233862ea5ae89f5a068f34099fa897fdd73d3bfa6cdcf6910cd868db6ceb911a83d68deb47fef366e961b13346340338ee643eeefd373eec6c3e9a565d9b8f768d91077b231fde14f17fc7863da10d970d37a2ae470b288c4d67c6765df5d1ff8edbdd581cfcddaa8fcdd2c10f4efc16ff2c9f7dcca7f5f4193f49e7c97bfd755dbc4690d24a1fbbb6523ff3dbcf68538980bf4d2da2cf52514da2c21d0cf4cfe517edd292219b26640df20df2c53962cce221277dde1a32a6a0add2c6cc786117ca3f14b654d937f6badd10871323edbf4dc7ef82f3b693fd622b255fc1a97e8fd8aff2e981f5dd3cf381a26a4c6cec0e4369f95442bf8decb71ed39bf419ab551f7eca4c6bcf19cb775ff7e7d7a0cfce9630e4ea67588791ba40fe17809f2597df2dff9e2f43057b46c6ebcdf986c7c4c8e5949382669fac71b538b964dfb9b9d936583ced4a238dd00cd199aee62d4ddb9bbefee46d7a629ae9b37fe5afcea27effb85f98d3bd3b4d08d100af1c95dee0fa3fbfb78b517e26a5c2218981947938390d6d48a3e0747b33ad2d1e8f04222b59727a917f9f2d5b2970fbdffea381a21ad432249c94d40217feb455773e8b989f4d09c1ed49cc34d9c45c47a4d9c476a7d9aa6a9df4fdf5a7b54d5dc646f6c0b443867d1572010c8a7697ddd0a6f5392cadddd41eeefc1bc6b2190bfbcbc16f2177aef217f306ffa76f7a9c6f7f455e5a675f730b5c61c8d60fc6f9cfb344def3d6f6f6f6f6f6feefe53bb07eaca7ab9f1cff77de6c6d71868b76abd7eadbd9afd2f57fc1b978d0f5df241d7145f48135157cc7b462b4b64c1771153d1f46fd0b4a1e9656856b671719389d31fe4ac59b74dd3c49e5f4e5fdd00855fb9d8d37cf306befb2fc3f70bc2e71366881dcb5628642714529fd857ed43f1438d856d619da3666d4bfaf8cc4c72b8093b89bb17e9998dd1cb5795f5548c1147bba88b73dac38d389a6c1048ed786ac7ac8d8a5e48a3aeca4ee8fe3ea49e9a94e8e3536fe32b1c7d952f35c4a522d1ef8cb13efe7b219fe3635ec717d96f36ecc7d6da8b4fdaf1adda31b9c9fa883a1e26e66be4f81b6d47a4e2b3b083a266a5de9f391d93fa98392b4ee798a1105b115d8cb6266a4d74b5b6bb14145adf5b14d52ece693fdec767269597b048bfec24fe83cb4e28f5d45352767b5253d48390f4eddb3f1253d1d5da5b2426eb63ff5936a487ffaef638aed0bb8b85e7ab85dfeb819e44e29c567afe37668536668535669592c2cc4a92125651eeeec279533df5537293179fb5af6d0b6db3e27025fa8ac3d6b7a6a279131f36b5b67a6a7293a6d5cb1933bdf5cf3f07b49aeefffbd0b7703127c3c2c59c8c35e11312dfe37bfc2ad9e326939b849e7342cf4d42217602a22ea753dd0084525214e4aaa2b809a9e5f8c1c643082305f395d56fad842238ebfef3acdb909f19657d5516919e156872ed08436e4bbc30b725ed07fcea1b1115e4977913fa9ebe880d52d5e010bf3ccf979643e1f3c5cf9039c435348433667afe07217ceeaa7a950d1bd7c27e1b0c9b798a2ec671ab03ffa667dd69d60c5856db094da110ac5c3bd2bd049c206c4be07363f27aaa60cbe17fd57777e5babbeaafb647dd8dc30c7a38811e047df5cffad125fa974b7ebb6ebcbb480f41a007132fd0c2ec82608ad820bc3bdf571385e3984ef3867af8d5571cae1cccefc3cc98e95ffefd037d5d1dfac274432f7fe3624ee605fe135ddc4a72561cf74213d48ad8203b2b68b622da9256445b44acaae97431ea74828ec6fd57efac1ae0ef8c15871f643ac1d98a900dc6a74dbb65ad98693f24c8fd6b3b4d73ab80999eb9e9999bdcc417cc3351633ba58a1b4d717a216ebaf16e648dded5883fd9f8e96dccda68b4a2b91fd5f6d5489c69f1adafb686e9c69c31d67f354dd3ef33477a87b9aa4dfbadda7ca9362a69deb831fd4d0b4dff36e687e096685917a3314e3e659aa64cce4d719adef4cf4518989f6a4caffa6ac5e6669da1d5c4697572985f989fe28c16ccf4cfb281d9af71bd1f5da19f2e073d0c4cbf4cd1ac506efc59e5c67943fdf4fb6d6768aba16d5623ed7db4be6a34503fc9df8ba99c31f0df3b99feeee9bd1a79d6b3debfaa627a8bd1f77d51ed14d60d50ea2b8eceaae1bd352bf5d34551538f76e4e35c634269a1fc707c9583fa1c6e77777777561cf7cd5996cd3e6bed574bfb417dfb681169bc5704b976a46e0f14e572c05f9f1ca02c1b047ecb117a8ac753cf63d64643bf5a687391fa2ab42df4d4bbaf816aa13663404ffd6bad3de520acab257eb46cdc6f65d9406d0028075b6badb5d6b6b51900f737b039d72cab3109816828d4a06b479c73f53d4ec3a1fd784ffdfa6ca1f5818434e6f139de3f179feaa8d4ecd9087ba868460400000013160000280808058382f19024883102fd14800f73a44c6442198983d124065218c618648c31061060002184008310e1d8061a7f9a1bcf76365408c578446f9f8b52744d870898d4d8e779bbc260f6aa0e318b53961737ef5b9da23d25194958f83fb22bf87a8b99492aa540a7cde344d7e5b73eb235878c3fb70875f4882176d7815bbaeb953b3848d1a6c34a70ee1c7c68a3a1cfdee1cf53ed1c0dec7cdae4ede054c7ec2e06ec6c1011521ab76d906066d6415f541299cc2953fb096a45781ce378adfecd69715c0cc5840da7dd785c72f568b0bda0e7e5241bfb790902262f0d67bd69cf5047ff069a1fb77aa58cc0d580ea02c88e192ac43770074103edf414d6b8ef3074b77c9e50111b4e9514c993e43b1b60a2168cc2c3dafb150d1cdace5ba497cec9b2d5514191b5abaa4b678929ea93be6cd3abc4bfeeda3d8d2b9caf892438b9e364adc596cab6aac38cccaec762ebbf878301f48b72be1fec0a39ebdd2820f92113140926bbddb99592c4e7f16532fada308f71c7add150e030bab557dc2a52056bbf550113af43ab9950bc054f6018b0174be3f6c82206f783d6245896f4aeb43e404b3e46972488f6c821f7693daddafbb801d95937c81212ee3c93530c4e95e8585bd7c0556bb2f602442fcf799afd9ce4ee6ae194c74e923847d6eddf3c77d416579b1c85246b325bfce49577612408180f75393095ecaa0807b28772d16a7356492eec6aa199b16691afd864ea3c9aa8f15b8ca423071780fdd13c96468fddb8309872292238cc15deb8ab3740481798ba4e05a7ea691d255a35b7268a537b259c214296945a2c485528ed79ac1a4ac232f34927fff17ff67a70fb725d520ba3faf429301c40ebdd348ef6047a7366fe74c1740c773ff828e010bb311d3a0be814ca0043e0a8db570da23a984fc205ca9630f86d8a07f849883d6aab521e221e17f0afff97b955cf7f0c1214de7062330bec56e6cb79d3106e1c9d56f47169185cb61d0ebabb1ef2b373ce5c8bb51474e2a092a19a9c829e8047b8d4c6f900fa0eaaeb96fb0e57444156c4f1ef8c45032a16e877bb9ab5b522c38f241325c2abc64db0a56dc15db4d82a768eaf599ba54c3a46e16d6693752c6d5d5ce52584b53894c1a71021321b0407f8723fda0e40418f0269f3b9f12a78316a1b8c06a9937a11d992de14a6bf78f4467586b51ea324cfa3794b5c92ffafaef30f3b4632b7be5735b2fbba1452b1fd7f012ba41685cb926479567ee4e4e0074887ce4a7138bd217d086bab9d54e329985d3dc4ce166b5958917c8b0b003d98bcf31182cfa6491406e024e4006c6d5f2c274d67fac3ef6d67a81f824b9af20f821785cdc7ae0dba430f8d896264298dd17b7b0e2f2b94eac25fd1009f6d4d52782f8ebe0087bbc7eac2962f6dafd05b81dcf3f8568e669bed9e4bb90339df61903945d394be60f9af344199233e4ddcaffd40b9c84a531f55f732e747d2d464cedde1c8bd26c5b4b1ab106334d5c416133a85b3f36b26cc77f446143548d7e1929acee1906b957f5d181a3d133c8d026af3e114d557f1003eaec8d541a27e2239c1af1ae71d60c07eb1513cd5f6403f67100453a331123e73c9c133d2cfa855dbe1a3c11f922cdb080d963af3b125f6679011158461c98f1598229ceec6191e5ab3a129e0012fba5b349e561d92f5a563164ffc6c966462ba2ca4de76f7d072436d0ce6a77fd086838924b6710fb3c846a92f84975545bd42440282d6d8a2ed114ee233cb6d807cf491412b52c18c31b1b09743299dd88a85ed1ae5853b7919e26d129ed896f9973562ebd57c6bc1bbdbcd1f31ff1590f602f9f2104578ce96ee3d6db257cd7eb7e3f5ba789d2d6676e1be726d6a9356992c1317894d35e197d32bcdca74a8a1c6dbf49eba4976ad751561676695e7bb91813cc136d8f7b64c4401e1a449edfadab24382f9567c7bd043ae85d2960d6ba3acbd1cb11bc6cfbcb839721b997511ce05b60a9f6a96b4a5d254faf1052d4785de65de8744d003cc24c98c29d9c20e2b36b8af61dc04d4b5d97d14c332bef1c03cdab2d3eaadbc5699f4fc1ad032b1a8a2033e13fbf6bf580b227870091ff6e4422350ec4ad7201fb8e81536b3f6af78894c43110d06b8a10bc115703a18e9d463123e93f3d68578fa245e8cf9248a4d2130d9ae8f6291bb1bb4f4a207a2f6a98f4f3e523e1a01cceca23d3a4ad275508253f7be9b5b66321ad441cc43861f28d6169480d1a7ae28b22bc40261cf0747434bbeeab03401ed50edcda02bd0aae33b070ebb56f6095892669a802e35f039dc7b76bd25a8b34e2bdeb7ac1c641ba141d8b2d3aaa4bd5a6415b67541271f6f310daa13c2ac518c92d4a3432ceb549f7ade6a199c0643d5aa761577d86af44bd779e56a9d5ab9e73527f0a6afb4e56e1ba1395f53cfbce8f3bf9110f4bc6016fbbfc1c68ba780af0de82a2924c9edd0e042b15d5a20451448f00e00988ad5ce085cf7250e64d22a4785d1e8801bc4c850c6cfe1c22a22ae7731c8f921d8bae6109fbe53171150cf77f61f58f5cf1d7b32e8302d87b151c650d4f9b1434b0f0d08e87b57d8d0c64f8221f387a6393fac308ded586d126ca1847a63b65cae9f93ba9fb0614e4f4902b7007446fb6d4d0d361c99ba69928eb1b1828e8c18e88adcdc55ae2af17baa14c06f4beda0afa26a78a5a050130bff65ae09ee9e6a1e0ee71f1ef1d0c15b5d4731686a018c6e6ccaed3e950a10f196f44c372624a25a401e01e2e809948cd6f514d0aa6701184f2ea5fee8b68a088a1d9d73a368758f23c8d49602655306f8c5eff9ccffe57f07148d32587004b349f773d44ff9bc310f3da1d1e57194c2fc100bd9d542bfa4c0868b27985a430a33c503f4a29ff34bad2cdcf2b34b56da04e13cf4ca39707601a1d082baefab3f3243a0551dd6855e7c155ed04ba2385233c2181f5f1b2dbb6cea122b8160d573087c6be0ce3e8aa97d4c8c00c8d707a7edaba9b3cb037a70cc5436240ba786ffc269051b47adfccec4d5b28999b0893a6a1b9a428af50217502f4aea8ec21e23d95d173ca264313b4d5a0550676fb15f00bce8db8e7ccb4848bdc78457a580785976abb1b27a71592a3f64b1b05ab9344a60f11c6153f7f0eb5fe563503a8b301404b1f2c204387daf51af9efa51fdcafde19161f59cb2308d44b4393566ea510f3e480c41014d61ef16c520709e9806f33f852ab632ac4ea210e129c53d1052c88230e7322fde188ef58511209262699df68b9b4d6b0e4d89c1af729469e9691c35da3122d71fbce5a11350d8c192c0e99f94f8ecc25614e1edff7c87b84bc7c1e0bc84019274b5903e2efb611c35be210061a05549a6805eed5338c7e6e83607a0840dc942267f1ceb4a2a92bb2584d2df3e351b219646f79f5aab23525a38c3a8540104fc0403d9765aad624f306716de38a543a0c03d3acf9f87f3652ca70bcfaa68f7ed75d853df5b83d0b088bb6db79d6ac25502322b3fd3b6993106b5e22289c2f627dd2a1b3dd8cd490f4040ba61fc286b1d7b2026010279c23b7c5012febcb3f5c3dcf3cf141fd955390c715e5473dabcd1e53add9e75795d40908c3db580c9cf6809198074cb40e4ac458367c0c7cd2cfc00b28b9d26d08f6abc9482ac17666a74a85027d83a1fdb2aca6cbbd1dc746ebf962af31608d0f5d334579c305d794ed253221c8744f5da66261450c3dc6b6074128c51f3b369b29fb4b619daa5896930db0ff633307554ca60dd6ed84e2b152fcb42742654db0b839134cf6105abb1a20dc957853067ac003e9873ea80409ac09e357252c922226db62a36e6b58ff712df16f79683d179cfce463b38c49ac22266fd7bd34f1560983f387ee67493783d8df9225bf2c3f701ed118d803188c64920036f5a995b8d057921577fb7100ac9738c2b64893af3dc61074973311a6d9085ac0eef7d1c0e4e78fd1a037ddf24ed27b1e1eb21fe40971f9e4049929a9ec94e766e148023d3633e5cd713ed4d006c73abc9e5f33f62af822f5f384e95382733813d54a8d7d33d1580fa8f8ac0b07d88841465d63f21eb0d74e94b772c22d0eb451e51731d9cfacce836937e4366c1083765517423ca22d0c42c57bef5b6467fe06ae0b55e5211fbd68d844c844bcb29b4bc269e51e810ba1848cd22daacfac2c969241118a027484101d023078c5621192106eda029e22fa9ef6bd477ad15b97cdca0995d78d960e340201223787a518a0980d83db55a7b4ef0042d65c59f08a04853259702a3214654f37df96451287f5e97dd1cf39c8e910d44328f160df28806ba44311082a28edd87545d4ddb7009e222384536f9415f346779d5a15832001cea1b95b82a972c491c1d62f38e2fd8bef2ad9a6b57bc6c26b522aaeb70b62ba46a7d7c150dfd5c141079c089df9cf439cb9dcb33cefcaa8b06622889df5b48a6e92bf05ee7ff48b934de104b22610cd6018a4385be0f43cacc37d461800b57e3bad61ceda16ea22ec853fdd1585ca584af630bce82a85be4568de4b4c3795d99111eaacdea5d99644903a44122c26c4e7b6044db556e47f1454d41398d30e32c483e0d7dae20461a2e3df9c710fdcba2a87b068813509410dd6d80842369d5a81645bbd046ba00c81a432d51e701911b55c1c75c4f8feaa21886c12039edc85402136531fcb4d85e9a8004936c84b10bd215474ef16872034056e1259105f5b9c8dc561e8d184d24a3704f046b82cad28f6d6957de30c737974d6701e39ad06109a559740c35cfe699c4707291aea408e5efae9df74d82d85a38fdd613c372563cd07cbc29ac8053242cbe7d11cf98c10ef8858d78462b02de45e487e10e2c01ecdf526ad8818099b9edc9dc9376d2f08c9b073fb8353d0c5d5b3bb54b1257fa3a4928a5feb1b9d24ab98c9ca0d6d4dcbadd6fe025d0c8800c67252c4e4268876768928ffbcc6a2931340d14b72ab6947d9508bacaede85a5bbaf06c66801a847734196da0e415c4404cf286ff28d6be58b552a009d06d34700172ce92a9e599dc2c0ff3c12667e9f20a31277df560f73b040496b8f495f9a8ae17c0b34269048697c6baa119988160f3ee618e987d11fa12a9c085df19a741c4572c2f0110c830c2887ed9c5951078237ce6228bcc8a7d0db9ca4034603cbda704666003bcec558c919b043e65dd382661af068bc8245d5e0a94d032e658ac296bf318b69724ebca1bb177369ff1b117d72729b99c68ff3bdbafa290c6c8de591d7e09bb94bd0878a62f1bd83e0b238de615c0e21962476ece4c87a08210a2edd4c0a36d5007425c26485bcfd3a609959b72825b013dc6d6851cd34097e4f97b2c95030aa75131414cb63ba3e306e334f8b6de98d426ce019980342801d849493df9bac11882168fb26114c7cd3e683048e3cb232d5313fc0f195c3d754620cf1e8af834131c90ace7942db226c3dafeeaa6ef6387b395040981d8e52d02ba891d595162d4cbcd7aff2d864888201ad084d3dedde1bbbb746df9880652c41405d640ddd0bd289d15f0f4873157ececf3ea2eb6d45ebcc2ddbb92f130cc72782f4aff8994795266616791cb5c668549c2c8ecd5179ffcb7a0682261780a552ecc8350a11db1766720095f160c02b9c1dc8b83a5546b35d136080a5fa0b0e548d5c4799b257686bfafcc6efce56f8831c9f30e30c14809d5c098c704d8b2ef8fd9328f2201d1a73d05efae5aef238b42efe3ba76c3b1a72623fa40f46d08587f4336520aecd0b9bfb4d46e2f69a895984c2ae69a4a3b2a96b54aa26ebe5d21ff71dc73ba0243e93666353c88a8d92db1ffa2ea0392e5088d39c068213d61d7cb1583b0105c29203486cf633ebc976632cd1a7fce73dec14e89647ba227a1d3f91d998dae4cb336e59795d9b909c0b831dba688f672a597d94d08d4cbc8359091445541c54720b8e0c4fd79b2320f175fa3c3ce58ab643f6884cf8b1370e6a9d65558e04e71c93227421e44230065b889d47b92933134548468de2f080ab4c4dc7af0c760489ea7a99ae86b77092d8aea9b4ddacb1b125758e5aef40f37c7d72d6ee3b918f2a4053f7ad59441f2d37e20d6a6d5e34bb541e7899ad857a5876e9e64d301b4524a6c1ce6279a5c672ea9c8a40f5b93ae4e9557213bb84ce25cc5faa13eea964173cead1f5c9695045a120b326f60b5b83abf31590acdb47b5c33258e1ed942c8e545ddbc3e641d1b3d533f03a2dc6236566c977f0eab88296c19b2b19c6f3da84057b8146878be6ec245e23c2695e4ff3ace23c7db4ff99f80f0616258a5ef4f065c03bb6cc1ecf94b0ec877d9ae35d7988daddc2d9edc89b90f0796ef6f52269665a90a98519efae8be4ae077a13e45fb02b375dfc737b8764905fa51329462da4335a7eaad821e12020328623f5c2f3e5daad501495a11f40a85f20a57fbd2e690369e9d1571a9d41b8253bc0af4d5a0ddba87f2c72670a9820a50db001da48ccab597faffa726291b1c7bac8842818cc35ad7287404fdf7cb027bf808dfe6ff20f04d92166f244f120265b098af7fad37ca221636018a4948bb1a1727f8f46eb170434b99bcf4edcb10be7eca7d5997a266d1aeeedd767dc4cc9ee20be357bd339c1bf4e1fa47be2ab69eeccd84d9e92643201e899e0c78ebedb35926835a8c0ccb39450ebf0923571f98a7027c5bba029340bd69d44051bd832b19803c72a5089b2c404db9ddb0c91ac11053b6e5b8c49e60d24cbdbe4d080fd964cff2c9f4ae6b1a6bb601b1f09ab38e8d4d398e954a87d7f08c001baee4a6372d7918e6e72346a2f0047684ce3859ed1243c2ab4287eeab744d27772ecd9b737f1726db319ae900e12b6b5f9595b759428ad216ec0a3d045f4115495f74b594c45e06a31349e680247ea002fd20b24d4324cbc54244f77506eb71071812ce8a004f1ee8ec37192d98605c7eff26abd7d82ddb73b1bef6571b516a0f6fe1e8bbcafaa5adb2039e6464eb5835134e453bef6c4c58cc49ff9cf375b319e0abb19238822ea639d2cbc9b40e2dcc9e7e0e3d8b9233b9fb4f3c8f837a64df50e325a5dc9c8c275e4e5d407ac44b1d0c52b2545b51f59197a898952bc63b079f12b12807604e7e2b9866a1bfa3aefa2873ef86353d09c6ac960e366e357a91efbaed02fab10ba3bfb808f0ed8ce093501cd04dffe1c9ba4facd41d03867832e71c7029e470a473a46d1079b2341b915521b06d90b968ef5321bbfc710c526dece96c6469226a1a7f8a6619fcc866f78008270c7019aad8628c173f99fb4f9e52f193bd387e3250c83a8046e8b6d3b346ffe23c9b058306694d93083b9b033e39acd980bd0286ed1307b7e492c844095b3104d58958d11b8729ac361672db0cbccc069451accc6eeecd57621ce3920d69700ddb7ed171d2e6b66e1e7f9fdb5444313fb9873adc5f16844b27f5239b4640e742a4ce8e02cbe0c0ae6e06bb149effb3ec255a8a1193c44f57eb53bdc7e02f7e8163cce3930ef3758f38f18d8c6c1d8a2baa4c0b1c7cacedb049e82be1ab98b32d5e00325d1e2cb2959d4319294427325c5994d494cfa1597859658644a1113f580fb10dd769dd45642bc536aa73cbd4006eeb183afbe8d3de34a6ba58b49eb45099c862d7a1977a78a41612a2a4082609e91a7d3234193b52fb3802e3adf24f3fb56f27a3994b3eb64e5478525f54938d021abbdb40ed3701cde67bd93db37ea0bb875f312a002b3c73a6a4b785df216729a4926d6cb62811e5cdca9119764d4d04291837f3f863a936ade768e0714a8c340d3e2d3ba5a773a2c1ba00981265c318ba017f46374abda53a1448b279486a32ab440096940025ec6fd5978f0ca1804d4e93f2fac02d9a224139445bb33fc2c38bf878a85899688b29d0ecad0b92921fabd56cd8560ce26ecbce3e60f1625d01891398a41c212dd538c6ada1e0e9b9b86d4cbb4237b95671d261a193d0e8638a2cce8a3f1e839b6002476e630c3a0530f03e0906405cd9d8daebc25da5731b63392dd932f1fee59354a4fafe5898a3c0150e4a0cbb162d7ab8099b3f6371403cba8a8244ed500ae2c02b35dee4aa4be7563910a5ee0ccd3a34a77a8f94c26e380b1f7f88c01df39e75b1313dcee507fdf3b1155615d56905c14d7b3d5db313c573911345b0ecd25e8843c3985c602deb63836d49883840b4c43e80500fa3b0006db725a2decbc024074148bea6841653fd97da10cd12c5df93e4fff30f6250fd7813845636c066d233a5f41af77e5fa6323e8343d13830e9c5f35666e70fc1c94137e0b830862aca383d90cf14f80b641970bf7cc0401e1602600cb843a97bc6726b8db31688982267c875bf6dd77c156ea9b3be83a149443a4b54276aa8ea5220e1547f455cac9061dcefe2ca9194c25dbd2f2e2ffd93353c964da0aa8540960f65c2679c260e0258d7ed05a0fe78fb3c4d6d7f2d04ff5a71ef2bceaf41b20bff0edcfb926b7fe5e81458450d5ccedace39d961422602404721a30ff38eaa966f9ad0306ed9b9e2c0ccc5fc61c39be34c0c3b3bd6bb4d8472fa590264a63f998b01c9a55c1293675083b43a772f01410642ef135c830f5727d30317089871eca1836e87b7ea12073bc6874a1a52b6d1d45fb0468f6b79016ef64b53a2ba3230d9ef2bd76574ed3d1b3670bf5e28e17db529fa10686fa064fd699e276b2acc35d967aff7215cd2c73570dcc14bfb1d1ac28b0ed32b42935c15c0f6b2538f22730e99f7d9c28c5a3c669a9bf27ea1416b26bb7e2d79c40c2c2e8b94764f1f4c70b2cd952fd34868c855bf67f4e02740b013d1ec80bf588a80070a8e642d769ca70b054c0ec7ca358b722a787e7b546f8b13b85a30e2a62339fe81a93039e55fb04653b9104c9cd60aacf6abef06552051773267dba77433395b5346d02dc8239ebf6a58a6a53a5433705f63ddf7d18a3f9cd71bb0bb62d43f6c8042098489c43c93e8c7c298536d28c38150f0224dc7f7d21ae2494f422950e2d55d976ebdf29048f40af851510c0a0a0d674a372157976b8591775c40490ce74f594028d814b100ad4eabc5c0736d2bb405650e37d6c9d890e830dc295177f6c8728da2b2970fd67cd3d2c068c798e9ed21c10e038436606d3e59102b8eef1306f9cfa7b9ca07f8f13f6fcab65cee4bc6bb7e7406b3b163323043963d5efbe05fdaa8df58e9b8fe9dc392cf6289762c52fe3a2f78f008baeb74bd00427b713f250156831d4393b82dabfde7e90911c4c61959fc2e181bd7cf400814ebe3b8e1e998e43f924cd4b731e9c037ac94f8cfea1484aa9a4974939ce056f1bf67c9484ae01f3adf4898e0df0691587408aa3a6676e571e3d650fee5e0d228c74fe6aba245f173de87f67da7431873e1ce45293ca6f64c44aaae1fa23f850e07e2e8627f161351ab87d939818dff0357792bead2d26e21332e7487409e1d8957e6a12ed1cf1109ced3115a906e75d9fb912c58a5800283e3bbca610001926929bf0b37cc6fbc4e4af3165352506543d36e25258ab94c1cff0114a73fc13aea1e6fd9236330deb7e83aa869baf6681a8cca445d38cf529872476ae951f80543652b799b85cb9590db81b4677b0c0622489becfd803bc684d44160b639aad171f4d546d30bbaa8466d143f34239d61209a091431973f875521de4d0b7691b0789ae0ed06f71338b02b262587417f5b1752458714e69232826dd133677f5b4571dad84552875864d0221475e623c999ee7e1329b793b31569df662f92f13744c94123fc030984e452aac8cd81891b2075d79256c5abc8569a024c56d929144fad10ef4622a4ea364bd846f57618cac1bdd262b027693154b32e2d86a78ebb4987753c094cd9ea8c3ac90449f47973e6f5bc036aa3b3fc2a843e5677a790be2c58931a366c0341a38acbd7ff12d6fa5f1f12bb71a73060b4fbc708c677a340ab0194af730286869990a2c8d8f40cb002915436e3cd398013be863644d1da8ed472257b10b97d7e55f30888f5daa9feec49da3dbe0e00ae5edbca2e379581b7a80a77dae7136f19f6ec415c72161d2bc16d19075264a02a5cf3bc08ef6dcf297b526be4648e41e5a093f824bba02af47bfd2f6a17b3c17c7618dbdf37ed1ee59c826d8870c4b31b603792f6af01da85f18d3399caccc64cc2e9c587689a5e853ab0117cca83bd1baa61d8caa21a570530e781d33928e2d48bb956687987c72a537efbe30cafa6458c6ed1807529b38e5cc5003019a605d8c2115f6243589399d821be837c5c087be9cd5291544455d7c4ee95cc861d566571b01f87769daf11ab075fb786813a3428ac5c5f79526476a75525f09819f58d3726be0658171ccc69bcc4e82a885aaece20837c6fdc288c20e74497d5f7318bb8c6b3ec9d69320e2d32bf15a0732ff3cece6cf1d4d06c16a607a74a16889550f21ccb8d76f1f93507c4d20cd36d9540b00fffa1f9698671afa04ca6df9787062a291b3b370bc404a1f060cd9fb122fb17e8b135df7c040dff775dbb11247e974361ae12a1aa0153188d8b1d22eed727ed6c73670b5dcc38dbd12cbca481d28d4f1d0ea074568d7f2858b46134324ec4c579be573a564ca95110c534bb580dea997232cbdc1ce085212a8f34bfae5a9029e9f08acc87d1a364de2be930bcae749c0875aaf444c7380eefcb187b90113e798d2acd8913947e19e270119d9216bb0071f089a6d30ff64d3ffe9078b7f3c0482b687bfd62687072e850ede092d1b35c33c3c96a1003e6b0c2868358de66890d2af4e0f445c271ffcdcbe96fa276dda102aa0d73dc713f3df952d214c05c821b6e95ab13a8d3b835bca3059cc43c2105ba266db0624187ea9f1de37fd9edaec98ee01342c492e4f07b409993146b3938b203772c229698305752f45cd7e9c5f00ce2074883d5ed80283e1a20a6cf827106b9f6e59c15b808d08cf95c50442b2cf2740adc29b0984137c09305bbc3db4db4d541c9e446243b3f4c25cff18eebd670835b57091d0a99554b5fe5b4ae1b572af183f0219cf5449ea333826602b5d7f8b2b12e83df50561a6a0ed6b57c544d2b25d795ce7f9eb1191679c864e0935c03b43310421416e9419bccde0b45fde9510fc85925e0ce6a473eadfad4b8d28a625a516f37dd6ca43b2387e6fec85971320a6363f93a3e064dae69ab5fb4586132945edcb860d0544c4ac898f924774207ab9604bb0b6752c13f43e67fb9653572af3a7849a8f92877955625cabd258df7c52d42a2f3178be8a45610f782ceefaef71f38a9764a34e4fc2185388c29bbc72007ce05359337327b0ef91a445463aa35096bd4e219ca849e7504aa264cf303f7a9bf3f0efad55f44ee769794506ef877a5bedf9d9bb1014da910f3a4e95d3d4d63e21d99484099eed69ca9bf7993c55fe95045353527c487ba52a077f631bc2e81e959c29f5fac6e931a7a225f217a29cecf390ef9c5f6b09cda8af3992b819fd8d7d6605d517fd40b7fc348457f12f975aec94b008faa473d6116c9715218f91a0ae9d22b9c21e4cc67e7ea69ecdf7b0d4f94fa5f8d83b90a00d49350e4fd51a8c553c01a59bba111e40590e08dba6e4a2f3b242238af37481f05fbf9f4ed1bc0e1e2bec879097afa29765e77e754686e13485f341d852beffaa7909fe898e5330d52353cd2b410f39f29dc8a19681490b6095245021b9f9eb45b42f86de38b628a106b1babb069cf873bc96a6988173aab19d4d5bc4c06fac9d0ede038b6341cbd3db7cc0bdb4116c80f35547b5347246c49c03002d268064ef7926d944e20dce3ff123b6879470966789570c9885116d3369c33770ff4e27962eb1a47a2523880db7f653f4f2e5bb273e0c717c8c4e1ce29c7bb2b2321326e1a9d692bee3525bdab744485cdc9be668b7d1b72f8b1716ff103ce9bf6383a77af3a773d6cc17392ef6398c9314c0e2ce74c724c6b7e46d615a24adb9e5b4b044fe6aadff1a92b2952092ea1840df441491762e8b81521ceeb78dbb6f6c6bbade39e256cf51239923830334eb766d7b9dc8ff3ab91adcc3a08831cfa3a572b4767da2b840cc8008ded789197bc15133f6d8a23b9aca60013976d8b76969b9c876ac552f78fe3c0fbc3c79beb7f3eb8f200b96d5956a6d5513fa12e5d1bebde2df181c29bd465f1a9792b4df186c141c90c382d112bbafc521a140784f5e9b1b40473a728b9c7ede654f52c3646f5bcb885ccf64f42a6e78467897fdf9d35b5efad0b4bd17dda0ec4183e6e1e43e1635c3fec7d02a71c7d4aabe2069f9bdaabffcdc0f9ed010fa434ea1510a581d883727f9c1da1d29059629781b759fa25cc1397ba9a9686797b3d59886fb84d8f0f07521a251789339586fbac2609b478cb666e8594c89148627349a8c2313741244d8874d6f7b9d67088774f55daeb254fb683dd02d50b76f3cb9025a56291e66bf9780b6def6e67031874fada2ae72746389c48ce32678f832426cee79867e26595b21f12bca3d6ad651aa8cb76d5de2589404970a325b8cedae7a5f28ef43e8f9e0015108f2ed2cc79b27bde56849d1c2684dd383e950806bd3cabf9990121ec9177f7ab12d9e7099ca04770229ff804b8c15ac5f7a272f7e968cdaa985e13b83fba2c902bf3cfd87442564c13d0b219630b12667c39196cb048d94d2c1cc3e0281e28dcb8dca00418093954b7d79e7a91c9d30a09b7765321b7a6eb4c22e09240acdd1a3ce0e0ffe048695127f9bec210f047d3e20f216048d91ddaa49038848028e057623c50de8d6013ab78f81baf4f53f0784d2282e9383105b31011ae48464c11bf351ffd7b1d047816b7f893561d83f2b0bed3e473f91359a46ab60d8dec101afdd95f68bcba94e4f3406aafe474e109a7c26c867df538fe484d40a21e633a52582e0d911541dceb13b92809f12343a01c25aba9c1dabed515b36301009a1f5d16c1accd56de52a3a24813bc868ec09782f7789b946263e693818980701e64144073a54c05ead1f8871fa839dfc9de866cf68b60da8b1babc6b251f5c124c5c2a4aa4d062e502225585ae03a8e02d765e8cf209ee07ce69475f838c29dedcabd15a2b6d9ea492e98733ab2ee15eaf95f1d3e8db6a05f9273fe48008f2aeba4d439e91aebea21f1783ad447efa972078f81d04806ca16aac60f00ca5a5136307a8331d54e7790112b9758508faf5301e3aec2802ff4114c9b08a9865fc89ce4a50b4ecec338e7831f4a0d74d3240d3ebc0dd9ffb0d5c4695a76469c9630aca78561046a896e16b5e0adb56fc14b331cfbe9347baea6963e5338b176534e5a336afeb37a102043e5781fa40ff2d45c59ec047d2f251cb483cbabf4854328dc991043c927a1930fba447512522ce9b3652ce2ed6089b508962e701798316699fd62701b33226cb364d344b1e50d63d83e32c22768fa06a1015935f3cbe4ab775e9478187cccf2a448a3b3592f00a9649cd6e95099ce7315ae059e18210cecb43e8786a952ae42f00c8786a1eb20c634d233489afe730db047f1661785f75be1a00151899a50384f9473ba23db037fa39f7b4cf8e9179dc41de619c3dd1971608b36287f024bb36fbfb862a0b46b8a50efabe77ec1ef16fd1c3dcd2bb4e43a02427897e70745b7152f2de3f6e03d0011256e8c0b3c87bf60d09107d9dbfd241e1ef09c9212efbae8c68ef593f88f547b104b855622545af173a94950ec2289b1f4ce1c248f2f069bea282b6e6210216cd3fc83e5e4f8b4c4f2e21d4198a54ff9ea20c85f844daf326ded8bc85b40e64a94d43924e015b1be37edb79fc4cedd178eb2cef5b671da759becc1468c88c25e916412851e0ac16c648d67b720c52700f9b7992cf8f11c42627c96b95838dc35b6505bd6e57f9494c9febbe9ab62001b6131b9cef4b202fed1bd6f5563f51d3e794581f4c0dd988a98191ac6f45ad8c832a6e681f0aa24f6e359905d9bde7940829f450da5ec611b82838f6d76dd1c3cfe01cf47cbee1310da6e574795d6f99b8a1a9eb804d8ad65ea89b8ba63c00dd47431989f22d8772a003b7178d8ff90a3a924c44ef8412c96f69f3348c0257dddd5d976622faf19302883f6de4d55d7c20b08cf8a936afe1b7631ff78538fd5a7f22c09b094bb2940474b637ac029aade31e6a6379e1853053124c69c3ebc6a1c8b324366962134e5cc7054c49c4a72db55a6dc738eda93af61bf60856d17c17bc34894e2bf0aca2af69db67ca755e2a542237f5e6c8dbd32a8c343c0412a738eb52bdcb330da68fe51ffdb8024bfd6affd95f974e39d1c59082b60165d25d99264c583d5aecfc9546710303629531b41ff5f85cf7eb023b14ec6dbaaa2e1cbf9c598a47e7e4071df64e1637890abea81352afbaf6ee572f148ce8cbb68a6cf0647e7b84f65a52f58dace1e257607c70f77185dbae19110cdc2734648a841781879c588ad2f43a01b83d1c1c06fcf62d774b58ceae0e3bf26aaf248be446f1b40edb176f70eb2257352729d89c576233c1f22ec5c6c087292eac6cd371db6305e315e025c282bb50251b11b23daad4c0d10899a126b650595bf5c14ccd920b91b6df9e5156a520de67a7b953a99ca1f6cc5b7d25c39b381059199750ef662f9da41b71ef3e182b4272eb47c9c12b04a9f275671951a0306747f29680eb707638577ffac04f573bd360d5a42a2bf089d6fcbd34f99b814937457c5473b9e293bba091f0c8e2167f0a9548cd1ca4f995c3aa058cf23a512b8ed9c407b8aa3bf7a2f0c7a8564547aa2aad51f7e74566b10e6bde8ffebaf17924f8517038149bb82bd0b12fb49edfb75994658829dd46e26ba672a60ddb49cea63a8021a358c7dd1d5802838cb859dd5a8ff92ab381455034c089577974ad737253662e96c1a47892536ad4f224921e093aaa7d9a4f30c2dbc2bdcf521dd057b0e34a89b383235ace8734f38b48d48349463dcb0ff618320c3734e794b9fb07ab348413cfbc649fea05609aa675005f1de3772b85ae8d8de88b3e76a58746011e022de173bd54524b2f8fe10033d59cc71950b61ce76377e907809f661108be61890faf855033fb637369432d06f5dbf0a841b993e4ee53442985caa012142800523a9e8db91f3d9dbd63b13d56c64e0b58835d161f53b47ed2f587adf2b8e011412c08954b0526daae0a446a546b77628209664b773676c0ad616b4be20fbe1da09c217a5978835c621c63833de7ffbea6f38047ad1ac39b326ad852e3d2d0e8f40bde7ac764400247cccbd4a70520ef8703ec1c80f7a15ebe731c29c4c047ff7f26a140afb984b7a66f6d179b4e4a20bddf40f5d4992ae7ac816ec123c2a5a910024da5939a435974f047534cc20aa8e0ea0ebfba943d24d98ef0e7457372fc3f99bbadd5484f1c05d88e95e325a682ced5cfab81f94631add5df7506418525534ee5e1e41a225666780b3d185bb8457dec8b75722131d8ab19d6ceb216a4340c6aa890afbb10cdeb78937e10f253e791ef250aeb4f531f297f4280803bd9528e857abb73340ccc07ffa09cdc72c6f5c15bafffc0098e5b1773347ab3fabd54da1a14fc1b5b267c8e90db15b808f1c3d7b139510dea5eca708acb33118c596c2778e599948d58277c7e5a16cf35225c3f545fa50ccb9147f2c4f5b8ac5f990e6b2d88358a876ce989d5fd8b6e03582539ce514f80e6d750e55c5d66d569f29683a0a301497b637dc451f5af0020de7050d5bc4896ec5aaa41db52ce74ea06a275360c654044388c0209fc395e6b1a16ec75537c72888e77ee019a34c56dd0e7b7240dfc77a1d4e4b1fe2c167eb0fc8347526df7a716be67a37903c0bc5c7ab0cb116af859d01f0484a1b1f1f808d008a8a75d1b6b4801f24ded7cda5bbb4629f48c0224817a61d669f8c34be1b68da6d3a1a28639733e3d6a4ce261416b407f1d502a1319610196eb8dd377dbdaaee7bf372023314fffa9b1d4a16a082d74851e42f738855d7ebb0be9bb5965edf23024ea599133fda97099a8469b717d96e0787a9f0b980caa50f8a6e4ef7e1994940eec35f3bac436f265e33b4e0fbddd2c731c8dfcc2cf42ef107e0d6e4603da1f60f3409d4a561249ee1f5dbe0eaa6b520f79c6f3d49375d4355d5bba354124ffa756ca741fb676105b44fae5555bcb28fdb1342b6ae52f3e881b2aa5673ca71d5619854f54aed96a518b6db0add9a7a6adbabbf2c673906633ac92e0947856b79dd9922fb31593f7758e45522886b2ad8fb69c6cc04a6ec97e302e42abd5439e3d6ece3300cf452fdc0cdcd7fd18515dacf0896220e68919f41032ecf3f56624806eb58f20c141ce23dd00b71684dc05bc4abc0f4f16a582b0c25d180fd27597f2a6f3e95c2494a365714ae10e8c46deda53f680d7ec6fd6b09880d70aa530024f3a4203254db99e35df80bbcb4b256a598c8bd465822cab58836a782e23fa3acbde090b7c118e2224c527ff9f7553c12bebc5590b81ef83545229668d32130dfd164ac6091afbbaa44a172c470ab29fa0097ba8bcbbce8137ce9c276467e9e970cfd62e3b09a39b671f8962117b8a67fabcb5fa3151ae2300764c7b6908add6bb0c680edca0108bf4f65c2286c0cfb3a536ea7b5b64175e5f9d0ebaacd58c7d755c6a2b83f8dba90ff01c0ef7c743f52e98be83c5a86577b54a7655cb486ab91636d982015a8a9c612df090e402ba8790ee5b1e24ca83301703a81b9bc42a1eea1eb133111b4bd953909f0c9cc9450f040090fdc374cd80c2f9a02354f4c006837e409705068a87a9af27713eb7c370ec31845121cb55a115ed38a089affb1be046827e4b0c5e3ebfc1fdf812c4600497540950b00ce2601e7619d16384e5d271645a47d78f868492e87b4440feb6abd863c5f44aca574b5b40e7c55a99cda56447e6a0e14be4ce246c09c92f494788530e69717fd9443498fb3b03f250ba9fdd95338945a6e224983750b4972baac8790a4bb0d8822d9c8398869b664e79d974fb749aa93910c1db34430863321b18da834d3f748d7b1f6a9afc1c7be391c2ff9afc2c12e88e115c1948561470047753c1a9144453ae447940e78b4d83bc2748809f374c0d018866cc5e0b1777c70bcdca8f18515ed3c79ce99979cd0dbfd2ed336644877473262a75fb893ed3cc8f193312c33f6bc1534f220c53e318d9615149bc4f8255aa72c5765d662f828842bcbf58dac61d3bca079a04b5d909b72ecd444023fe1d5e2a96552102545512c2125b67dae818161e00a3e8313697f318d4d0f560b2d9c09d14858bc3057c5defd7fd79575ea46bba76a9552094ff1b8298552563171190c4ad6f1a16e4c4cae61a533dc211c97b2ef3219d2cc2899f400ac18437d0ac7d077a1122898adfcd0f9ac62c6f3f2b46f38f5a9ec14e7558789f0d143fba61d858e1e08eb73c53ed2654ad8842369354b58a092ec1fd1c615a18e0c9621a5b9dbcd53742ae10e03ad1c9aa9a805a748387e657c0eeca0c49dbb6b46a6cb33c95e79ce9aa6e3e1be2934a1fa03f63ba73727458e24598e88885ad7c4c338d9c7cfaedc94d272736629a26dba66853c156b0fe82fed777902b78621e1147b4901994681a7a0f84a7d701f71d7f8114fbf79630c7682ba44f845a909ae7e0fab6164e5bb359016daf39f6b5491bb4dca23a93db46e864e5deba35bcf38923180bf2a4a2da165cf14f554091a970260fa9b0b476847b580eff30f61302f150153eb187516813b69bfec02ae136b5b8de647ea49d3a84d660ad7305e0e7e2a0224582ad778ac0227390ebe5e4c6dddb6405d1379dd617e408701d441c0a78ca46c011f7139e9c81e3cf38191c55079638103dd1cf8ebd03c14c9f35d62f53c74316c07d34335784a4f8d9ab863451f81cf60ae2b3b44a411af51f074f32b505ac3555db1e13ae46764c21b76620bc609b2e8211609d4153d9d6b607c2b4175b758da5ef500875495674110e3255d93af4724ce0affa4ad4b0e51acc590db3ef9511f02989e0351bf06ae8b506f23fb2cf9619cfb90faee388cf4ac2cad8326cc254e3b1af6495426ea0f03ed4330d6a7e52c53977824ca7138864be10f83688ce050af4b55ff29563064d3f5c23ff873c54bda8f8254c8f06d7da9f62df83ca3d70c459dc460d1afb7ee9aa38ca7b39a8bcf24f141f5abb88eea8deaaf10193dce17b78563477c320f7727e2e0783e22809285d105416d30b148a8c0d0993224c826c40ca7ba9377d18b7da98b477a79e167f4bf45b97419d7c20497b8d0a04d091f3bcf424d876d6daa7c4d23c7db53a15f6a3a40726c6bb57f6e14042766f313ff2cecfc26e3840915bfb850d88c16b01952b835b31fb9fb8938bdc57858946acee8c07d832b1f5f612e0685dc642f21fe43b2fbeeb4e327e95a9e35c6a647e19d288f10c1d506558ce220331c44520ee162d9890b5d004dce7a7cc2fe0c6e38bca8d81b580760a6bed7af99288a8800b7d129dd6a5cc11b42bd7d53ea6f5ee30f3e3b7901cefda29383b3a0593be2305eb538e366d3e196ebb90d421a651a06fa426fbfee5adc6b1ec6bb52754bc95fedf076f8fab296091214810cbd9b1e1e677c251fb3392036cc65de4e4e96f9282345de3df03f4aceb7e770fc721a9c0196522fcf9b13fb70d19d271bf22c431eeeb7c26288cbd2a9a67ea82a1a2b57d2a9c94a966122260bd00a3c9cd4935ab1717d4ae8767b1d43c4df051a4bcf5bbc894b35c486020695ef3efe6ba4fe8156ed3e183c403646570509c1a4c4023ab125b52deb381f9f5b6ccdec8d1de70f2961c76e17197a8e56e5f62157b361c493cc324d10020ac3fa6a3658c1a2700d4f200f6d8daf4be06283defac74c1a0a01d08e0111f88fc6256397196182433939f83a59ba98d470ab0d9fd2b89984f566bc7e683901daef61b16c657ee62ef4abd7cf3cee5633e4ddc9c882652600e8b03862d6985ee3d9dbcb618a70d2aae8d148c783e37f0703d9654b85bbc53bdee546c277d15ea4260a427cd82df8d525d228471067ebc8820f42dcbe01b7cd5b868b21ab74bcaf796e694186acf667b022035e6893366d814872e07cd52b7b2b3a39b678ba7b98adfe19f32ab6a33b6e6cf9416ebcd828eb9e2879b3af9f13445b0fbb74b833d98c9d0b7664359519530a4e71bcbfe3565a77abeaf254fcb2da1e44247f018feb0d90e6a7b4369e40e8b710fb6749136ebccf44b85dea7369d8611324da242bf2de522da37c5144170f435901a078ddf5c2c2abf4e483ac50b2c9026aedf583cc534e32ed72e7246940520ea3dabb37e2451fd5c3bec86f7b5e22fab4f6331d5a43baed20eb4aa1d57ba65cd0623e20dc4b73267139386467fe83d4df89da88a2f280ea9639eae62cc306989d5f7841de89d3f8b5cbc4c3edee761898367a7d85fb3922718811d3b79b4bbdec32f8cc6a0b9886196d4782e2292884d575dd285d4dddaaf66a50949eb61e0a0dd004fd45e7d6b9c743921c9adc5d2361541fc934b4a874ae9e36663d3b20d5c13292a5fdef9e09da67e79b7d57f819192ef441dea8e83d219305a2f697227b500aa02629250ab9db1f84bf68a34b21802680a93458055c611530b3ac84c323bbcc2f490ad28c58d7420c16c51b6d5693fba6505240f17894db48c1f5079ff06fc21b6586ee58ad69aa3c08c023ce64b08f855b9a540e86e46ce651fccf13a3e20c211d919c6d0b0244bb43d07e54aabf5a6a074cdddb548dbfc3aa8559a3f27f8010cffff707a140496bffb723535ba616145647a6b05f9f7afa4822a2a4179a2cfed6f7760aec873d66b823e5d1e058dbd01a1235e3b820603162b4b35d6bf390d4451614ae3cbbd6caba4b34d433419b973057e1e4ae14ac6f46c6941a20250e4af32ba0dd68fca728ca0bb7e5464c5e2e80d537c5c0c99a1eb8a5fab0594bfe9396a1c4d6d24c867b8a9bf2def65d57fe74abe7b7f0b82d8ac13e7059fc5e9d1da2cbd8a6a5650e18977932e02dcad456cbcb872c581773301d1a92b22e55b62f35ab7d1ef63ff80b4afceb00f114b7623480136369d82dc844aee4486180582839f294ded65f1af97c746b58995430346468143b97ab634d101dfee17fb29f597d704928582c41f523820d935b5f8e6a94b81a5b45735f2572312c541ae019c37057d7656cad5b333f98e7175ffbf2a5b32ab5a91a9f016764a6ec753c16ad0646b352535d68320ee8f295eab1425b71a861dfdd95ae8029289a424b73141ba79d1e33f751e2534841a388cf0e8e2609010a51794548b2b108baf0f97e3b069b4cdc902fff488082b45e9ef3b1befd7571ae492a876d84f5ab35acef9710c09d578c61093bd18eb9f61896bb24b37df841f9b7c9f6fb71cdcdb0ac238c4d16d52fc0f0e6d24137fab4c46d04dfedf9e7ffad625d0d55c7c8e21456e981e040754ce583f454aa732b614ba8ae835c09ba420a5dea45423db188a5f9a2eb94f257bc8a9359e980126e16fc5d5a03b52c28536f5bef59eea20e9d77a1a93f4b462db474dbaecd4ce5d289b8c119a1431665d2d60417a0c67d303dc2a42a794b9f7ccf21224b837b7c7be33f612d360060b2aea9031cf46e6348c89c690a6977008bba773805613eee5d8e260e7ff96ee53e6a9ddb7f1219d9db41b0d9933f0a2ed59953be8b92150551f61bbfeb1067b0cca9ddc034ad5072dab92e2760470fa245c54d70539933c0ae09ff35506b83f5efcf011f42bb88f1e2eb07a914157a5aa92121d5299c67b800cf48928ee20289796ca679c78845099cc41fa06434a9a7e462b2f0a34ab784d33fc238b2869e8e6901d10b095573145334f4b9b0c702c5d5f18343af469f83fe2bb7ab2b9fab53176300a92fa90103644f4dcf4de0e1e742bdd41f1ed81fe6699d4148368428e11003d84ec56cf3b1c3d6b3653b16bc476ff1ce321611f6291a4077548653c9fde1712ecb43f013196095d12102766a46670f237700e441b41c9366c5e4795e2b247dba4f49a1e65876a19979c99e148a7cd030761e73f38258c6bd0383a6642afc97680a6af04d29b06ca90116cf40622864a75d7501b6e2ca60242eb0921d74a8caa2707ca017a099958503b7bb94b44738b66f6d206c38056b117c84c79fb24dc90f9b8aa50085309d7e7792c10a66da4a3ce1b8a63bea6a95aabba454fd83a0cb9d58b2c31a2795c852e16316d2fc3329086f33c9e8d5b197c15ce38ade8156679847661c390271ca45ec17318a122751673b42b035493fc8fd7a724d2c659295fbebe6f771d3a716b5f390e28be32f95a14b3108fc75a3676e8cdec3e22846d1280c0cde21de435a3d68dda5a58d739551f071b051ec8c5d8c835626c6bb944c71bbcab976d56a3bf8087d8007d2ea78277adaf374a702a94928c6c32b7da3d8aa2985b810fc45a5694c6e355e381f6c89849eae534832c0afe0859eda336ef4c10a0bd719a5d7ea47599d6e73b3057fc2d8583cf1a28ecb9fd480764e5aacd5ebd9c38ef37a07ce5209c9cfa275b19a3a8e963c9f06120af8c02d7ccffdd01e2dd58545af61769faa4952a459ba2d202369f16c3fc8dc8b6a8bbbeaa8a39fea488ce27652abb6c4906b37a5b818b4c781ed265c53de0e35f68d3e646b67a9b9aee3edd77c5673b45cc26c9b543541da2939bcae628e138a6b462a78bc23749f465ef988341698f6621f950172171e440023cc4935c230015e26516b0fdf5965b4434317970663caab652d470473a35bb3db41be250d40bcfa43c14e599f0801455cfb1e88fe280459600a63645d750ba9bf7fe2455e8d50065be30b024f16b22e81f88afdc62572487ebe53a696359b4c7e1cd2cac234cc5e78357e932b3710938cc7f1d29c810eafa8b24c7aa4b7de3d275c620bd495e2d38cc228853f62ba9f12032ea3570deaeca8638bcb730662bb96595a800d945a22f3f42bafa0ab9c40a7a034022c7bdb96c1b3074aca0401ba74c258c39d04caf585e3cae9b7ac32e4dd372da669bd5ede21a52da26fda6855d078910a13bef24e19223ec499b0524c8fc8aff8b8152fa05f0609da999bbf9e8f62527ae8b10d04159577aad1d167fe24b7675798f5e2dc59fda059b3f2a7bf40dc40d258f67dbe39cc8950b2a4306dffd208d70a42de009c929374e96c7071c48dd4953b3a8850726a3d4333d52a84322ef3cc2a2618afe07e1e08ac61a6292120d5bb0c4db985852be5ab5386659b9b324ac2165c9cfe430432ffaeb045cc4467300da1051cb6601bdf4dd4c15454e6f1f5fb38790d6d6498c475d3cf8bd9430a601ebf292773f2ca63c93005d4a9f6c2b8849d45d3daa085ea05cbea71b4aa603d0d034dbfb0f9dc34ffe744ab786e965890f216690a94ad8a13e399c1b0022aad160613efaf27b17e3697b64f924203cf6ac65500c7ab0416b238b1f6a1085e7b493438e58e07658fc666498ecba4691c476d357021e4c2364275a5f8e1631b3d633f20b21b6e9ee15b107b5ff4f9f46cdccbb7a11353dc8582064bc9748069f4bd3dc196163db447e324c2f0fa80150a12f369a0cd86b401ddff7741488d631c865fbaa02d7281753d90fe6e654cf9c949d464d64d79e82caec0ec96e5b51b88ed0a5d64f4f8c5d8f05f825890b64fe7c1512340c1d46cf199a896fd1f199174b742f21589a8e8dd8b1a00f790994e34cb61a15cf4d3e77e199717e9a20097977ac18319a3264f447e96bc9e6bd348e6539378a10854152537bfa5da31f0a16914358de8e60ecda7c9c90e2b35a413dcebc76452dba9002361aead0a6281dc6ce6198f25542184b4f986245074d86f159214d0265562d1a3843990981bf1e928a6540d0daca774002d9e72cde38e6e0059b18bc3f47d37f3409a2ff3942e09fef886c0550f498966c8c392a7c4b4215fa7cd357cfce07568319a81ff0ac6aa18a419c2d3fd7216ebba6873d8e12e51110d0015b7aae16eb7d5527ca4553fa1d4eeff8b24bffcd4808f6e97247cc0b990c98d52910d2096497e4b3c5fe02bb4de854b26761769b1cac87575f23d6bf226877b66161d8e6ba521213690f028e3502f7a7883f4a783c05d58ee71c30b7816a3e71a5b3a47733872076cb21ac88787e48c60ef10c11e422ce6ae149e3c54af0e5f385c612202362e0e47068e03cdeac2c73f71b86a69ebae61a05a46b6496e6cda241db9f607e439ca01ca10f43c81366e3c0d092c7dbd8d69914bc0fa85100b9abc15303a097daa578e44ec1a06b6a2555546f49a768d7b234a9b787e82bb3f02577c01712e7af64a89da5675eec3b3bbac12ac16d5290b4e75c3d02a9f42be8ca2422d1076aecf559005d0dc53de8360c19fc305d4304534ea2b5b0fe7f34d0ddbeec1a8f16c67914e012e376f200504ebfc01878e03e1d0df079a38b91b94f08e89bb50264ef4092efcf419da2e9f165ce2acb46fce298e1c1a6c592999bce9da4a2b950b924315964f40b227e1f013341c0f367fc97437a6e84689ed6d587279795de6e479a5a332b8f57ce818f79b9118a3bdc3cc61ca370173599e7e40f10d33538532d874c4a614f9b823e0da1acfd0bdf12a9cefa4b4d7b4016dcdb28be0428d69f0af37acd1df1ff962d10d8508ccdc7c1201d80cd0756778a4cbadd443cb8210bff431ee57f19168d80d96e8c84c543f22b94b92609bb408f473f147f547eb206a7d2837b781b098a34b8b4400e1871509e162dce88b8309eace7a6baf73296c6f77cc07a0ebdb6da9a80742ceaa7a5174f5ac1d4482fddc788a5206b1b10d2df61c548db2c749cecc6f11c039bad0e4752e38184e3142a88940693c03266ecb43237c15dd67632a0de240819bdd1c028f2ea488d8efb96634fa87493ef1f1030ded862a83758584c5f8b66fa6784d800e2da3f8e49da045a5683bb77cd90c114afcbc40203f25700f74076115c793520256a582d6684d00ddbc131d18cd23a82506a6b2488f655c7bf783bad2a5542162b5bbe8b53759850a7317cb76bfce3d8b6f2df110e8c95c091678d25f8f38247b0aff7a4f14e1bf6452025252bc8459423212408af69f07352174304e00255ed9bd2865b6c868f5c586888bff67bc3ac7f09905b68d684da3cb1627283533722917c6453ef518b922c4ca135826ef7fb4c81729bbdc5c84631e4a6caa705b4e1758c1a14d2431f1fb5f0cce355f67a36b097c4c7f52b0c4e4da659780059d9d6e8cf6dae96163d6a09c084b628c8b72fb50b6129d760d1a026ef5ee39b16ba05f2920936c5c26ba1ac2eaa617ad144cff4a50277519c223c16a48dcbefd6006cb70bd608dfed2b1341589882cadb770fda5c67925538ff26800b8693758f7b1bcdc94a91b3dd4a2c796b07422644b97cce2928bccf077f4b3c4f0e0d99416abcbdc65fe08bb0c4c6a32184f5d294499f65560de78daabd60c7a85b79ad0968c7a632a9e3c82d604fd9b4dbf5761cdb1c5c048251f6891ed60377329b961c90a1159f6e0c9f611f99f09a7b7387d8896f5ac80181a6c898a24b6a0be799ff8dd483d00cfac8df9fe2165ebcbda9172902edc9be15bda5c9609fab4030fea1ef462a32b1325ef46bb15362b0baa03cad38ac481f2e2d363daef933bcc1b856b4f3521f4a192554423115ac8c6f12d417220e70510c284d0921b734eed2228e7909a28fbaedfe61dff467e993f24d77a17119631ed757bd91785c5ec854d74ab3c1281a16ecf002981df7a3fe8f6b87d263fb7834d74f9dc168b611b585dca43e7d5c85f88fc978c497da1e4f1e19b3e9cf104985e4698b61f2445a830fd91d32239545aadb4360ce87373aaef01690cb949d00b78b02815c03b35e5004c95ea6369da8d311b9eaf3b30353d9cea855ac1b2c2da1f08413cdc0fab02ee8a81140350250365abde174ace0fdf1e3081fdeffc4da64a4e71370a71df0aa132c2fb06347597563d063155a6e9a5c04a04343b9a64969d7c39abca0ec3b8927fe56572dc51078b238342f7d5a1ecb83b222d4ca93a5ee4135588f4177972caa7c2fb49b625cfe921dd91774eb8d070d78de0aca8f537202356f8665bba59e019d9cd5ce026ad6eb0244c4d0c659f5662f9672006f9a52ec1c64474b74ce6304fa0b3e13afb84f322270a9d5ef9991a715c1b6cf1187e545b56340bd03bf8f4f7324fd7057093c27a86a25662750e78644668451a88d5a552884e64dc9ce496398b485f9dea8404aef5a8e44273f331d65d9e05a463e05dee72966f623c335898d93f4b0e85d9a77aac26dce5f778d08d84dc03e5e0e37fa9d871eada2db2ca351b13b54881379b48db705f563695241401c1b59b8944290df3bd007d3c1ef503499396e63ed85d0636ff5384d49768c3c4c6571cc76b253a628168c89439dc0c82b3eb6ea35e51fa08ea582cadee93b646694f873db5ace054a408e99fc2156868aee039b686acf19e98ca52224021c93faf5c106f37bd60bb4d88088b8a4416141ea8b1b7da049b69c12267f0ba03b20fbd9bf6a6a0065baa6e23e0ab53a8fe1428b9c47cbd1b6b946e497d1f9780edf2163591969666e93ac77505b8ac8fa69730c2e683bb77ede9776cd3558b04c902a815259e64eec46d5acf1b732ee2d5ea0d982fed4ae2a95b1ab180f760c2bde1c08cb0b448d7e8a93919725f8442dcffec3852b1e761a0a60c09fe9ad90144d90a0a2909104fd0bc82d4a7943b6b7d533e1c9f2ff9e162218f7a299917c6884f4689885ccf615ef29d975c95ddd0c5f73e638ac44bde34e2443c5be8a26dc0397e33a9fa0439cc29ace86b50c32d21ae69f04f51cf35af349a534d30fdbf5e7a5d0c930b884f0321fc5e990549708215023c6ea946402fd310818765b30b27552aceba13bec764665812d3063371bd23f235ee406e379b954c4caa8a168296acd24354c31420b87a6f58e1ed2d884699b169ae041237033c23debd783fa777469f9751cf54f5cc7562635e7c81fa4d817f453f80b424af19cda749178d0a22f1e7dc019f5457020e82807ad8c668770f7b516840b068e0a2886bb7d66ebf9302ae381acde29a583019789ca507901ece1f084535073bc42521825dcfee9fdf4426463630b2a56bb9c2d08f572302b742697500ad3018c4b91dd5ed4963e920f7716cb02bd3c3a531ad9b5bde7ef1660517a9c70c3a827a62c51be2a5527308fb40a2f8f00eec75688c280644ae7d71eada99bc90fe229dd0498e2e07198ef08e14225b802d243fbf424d5740ea9b7a5788d5abaf885dea33c432031a2ab66b58409855491bf96dfb767f7bfb37bb72fe34b3b05826e202774fce40b4ac20a6a653dc52214e16f85133589916195d506e2f7cdd72c43fb0f6ff09c1adcd354370dbfe164ecf31374d7ced3efed6ba494244122291ddbd33c923064a06bb0615f37904e7609452a2aa4a7ee50f3fdfe67ca8a6f1aebb5e43e6c5a53f1a3fbfcc4a4af816a5b254a510387a3b3b74cc1f8dfea546a3777834dab2c5230f7aa91fee83e7ed8c46a3d14b3d9ed168f47646a3d1263739fa91fcfc483faa66e961a6d9946b6fa6dacd36bbd914497764bfb489ac966136115b4fe7e95421405996c5c3b2dc876559cec387f3ec78cab22ccb77ac6c59d2b22c6abd257a9135bf1abd08c3e67c9f91e69ca4a965331b5dd17dab6558bd3f94f0e539a54aaf40390f4fc147293d799a29a6376b7f61995b37390bbd1985e9bbb3886e96c1745ed1cff7d2e8492351c9b3b757bb3f944aa592e7788ee7780e6ae4d209314e8f6f4e9cf9a6c338e19cd37eae4fe7d39b2d3ba78cd7759b73964b565b7caf680f76cff11ccfa91ea300dfce0e1d1ef452ef87b41ea5f45350fee4b17ff52b3845ff2fc674fd3ac742e7bdceb150d1fb09e94f36e758e08974b30b8d44f66613762dbbd926be7aaf1cd785ff5ce8e93c1d92cf1d07b33be7dc0e1deee107b07bf8b0dc7238dc9bc331562fd8a594f2e9f5f5a274b36ecef12e7c7f97a631e547795dba25c2ebd22d7e4b7e727f35042a29b9467f65f533faf4c5ccf0b48a829474452b953dbf6e22ba658b9feb685ab9a8aafa18766b659f6adfd8d71204b4d2cd5ed5afaaeae98bc1aa2f55cd3efd8cddfab96a40bd34685ffdac2a86f5ac5e541295aaf724f4af0d2396de13acaa6eae4e1e65ab4a5895a4cab2cc6adae6b0b558adb372a1513ae9ac9a08a34abe4eecb1c76ec6bef459fb92bd3650f4957a7db53240f4d8ad4456135d4f22d42df4276643f4f5e7d6bea1fcdb521e6ea68fdb0c4f451e34aafdf633f676a4f58f3e63375bdca3a7a34b4335e3499a06fda93d662fbcf3b39fc1be69738fc5de6c7fa26cf6620f7b4f825d4f92bd0765ef49b26f4c874c494d92dbc767f5b956d706e21cd6a4d665514f0277683e1af2cabd881429e582bafaab6a7971348d4aca7618470f0e53a59eac64ed7eaee3f1f0b0f7fc79f0d2931347d3207d951f76b3976e9e79923e93fee4f3fc939b51b82a5df99974675555cfc37341d757d2f76df9f97d495e1b27fdc9fb93776d48389e0ed79cddfd9eeb903c546e49555dcf43d39042b1aa4fba201c4de37dfceb66a755af7d9eaff9bc368ebaaaaca2f3d02db2f68fb6ebeda63db6652fb7e8a2f9a249fa6c9f241a61df9fb16be3a2eb238ea6213f625f2f86bdcdde6617078ea671553850d7e7ebebe7fe3aaf8de31cf465df4a520b47b744518ba090f2f16068b9120c61e6412e2429b5b6bbb56f0ff224aec461a4b5559bf62e054564b90e69632dcb85a4656f8ed1b727b1a67ed3c895506b45d7b26e35fa1ebd6c80bc3488defa482a9d58b2aa5edb301bf25d5a6f4a4191f16b2549d7aaf5f18c44a2cde1d1a87aaec385648e527a90bb90e54ba2d42a57f2f1af97d7c6b143092594d5cde1af410925949ab4b4914813d2befab8f9dbad7e6ff17a4df3083febeebe39cb2e0df3fb2384d69556edaa218cf03d49d3b03c49b7c4afef419ea45657e2494c268f393a46ab3d890b3a01aa5e1518be1d0cb17fa9b7d33157ef3d86d948f9f9d0b5ce4ec57478b3ab762724d1bbf5b98edc367e55ef415ec3f755fffd8c3f9da6e1d757a69fa6fb76709f648be7f5edcad757efb3ffaae1fabd34d41994d2e8ddcc80f9be7aefe51a5ece4fd9301bd5bf6abe973fab1aee9c5675735751e5d2705fdcf7f355714589ebe6f0f5de8b5555fde8a0979a8fe755296fe7e95437bf1d2cbf5655e5fd3ee5abf79e33a5fc4ba9f76d105fdb7b5f535e2ae57d860d7bd3a67d6f32fb9494cd79909f24cacdf4e4665abad664ad4f1dd758dfb63feda5e13fc6d81b86bd56e7ac2fe7ffcca7531f7b0f72181d0c7b3b8db9d0d3e9167967685311f09a7f7dbda408f31ce93cc7533fafddafeaf2b90ee791390f949f2ffb4992d5b72c79eabd52569a4dbb42b9f47abf64cafb75d12bdfe9a3bc47df43d1a45fd74f5555cf75f0f06acecb77bcf2946b9fa9a7decf768dde1a78da172cdfafea56ee3cfcaaee3955fb8c1a699e73b5bdec6bdac5acf64309579ee339efaeeb1fa6c3e539ef96706595aeeaaaae7a794e0f7684eafcfa2de7cd8d6110b82a66c3b674dd2325a683ec86f44f366c6eb67a7bf2d7ab5907c90e921d24df5093def3946f922c5d01df3f5eccbbf22b1d6ea87cffa0d45a93e93f9f9e4a0e0ea04014f2c01e456670942b6cb7b5f66bb46ff81a9279e1dc42abe9a09ad66abadbdefc35356d6d8d159130aca6a6a6a6a6468b1a26e9e5e45b29ad9557bef8eefe3f545c1d9279e3c37a7364b3dfde1cdacf8f5a4f897d89fe55faec475b69fec32430fad25fb0ceba55eba792ccb62648efe493b6ea2cb5b48d3e6ed8cf4d128131d276440dea856db45a95f7534724ae6b6ed73b4c5e171412f29d399f7acca8b7d8a285ae0bc2dee2babac761aec80472f1867cc9fceee9a0167259fb7ee9e4cdd74ffb54ba740bcbd84befebda400c9f5acdfbe9bcacab32e0ba39e6476c3576f516516505c2d2e9071f544a38ff50aa6f6df11f66e3aa244bda28fc129eb45667b91edba89faebfaead3f7ec9fa7a55ba9d7a7bdadd42bd85e6960c5ab7d69af6eac3af75686806261f629797ef50156a17e55cdecfbc210935ed3d4d06d1b82e605a37d39e9b26a31158e465e1408d9f44dd193fc9b70fffbdcffeefc6693919efe6179cb1ff8bfef555aefecdcfee2fedad1bade8e20b96d6bbc87799374774a9ae9cf1d7346e8e1bb3b1451ae55feddcb33c040ea2bbc0f0ce979b4565b48e0bdf0e788378f86dae46e1125f5c502e2fd125a25c5e5c628c2ed60e9c6fdfd7173ca70a75c9dedae85fb04e676df31db6808a6d8de7962146dfb2b0af958bcb8bcb5742300cc3301e5c10cc70381e70f4e070600e470f3830cc613832fbd7451f462ee0d05be24a1a4fc7c3edc14f10cbf5e3cfcfd8cf9b5d90ecbfacec7e7eb5f9cda87a59f5fd3306b36b735d1c382256af8d630c47b7401cdd32a7b466dc46fdf971c6481fcbfb99e7988dfaf2afadf1acf35f13f63a67893f5dfbcbae7fb9658a9fab9b7541386c65326313c8e471e14342f0ba123f415722afbc115b40e3d14b9a2d9695f4f2c4a26c26f9275b698ba30dd6096f0eeb42fb33da875f7d630cb037477fc4f0dd24d2b918638c3cae84e7b2ac27f124ae84277a92e8429ec495f07892181d7c212c197b5937c3e16732d9e6792cef2bebad9bd1f8e55f8055d9887d3bfbce75852dc0faf952f457f6d8bbeaa7b459250493ca8442f9cf64a2d6cb595515fd79ad0545f8f5c993c41d9a8f945cb687cd213fd200089e013b2234c089b879380cce8ede719819270c4f1fe130d35d9848241289e09748a386c085e785d5b998994c7bdaa733536f47f41ef4744430e8e9bc1d9d6e812ff2a098933fb93d3c96f728df37db94d26391efb1cc1f3de9e9e8ab77cf8a37afe01e66bf6336b2b7af6d8de356599ff54d5f795dd00cdaf20a8edf37f1df4d8cd747eded967ddf3c6a4d7dc201f5e2a77696fe9da7137f8c5c1302f6d7d5980fe7d9b9f97ab7710c6537061fbb64a4178661589561d875555f6b7565d75b1656af5a49f855abd9e665d9cdb5f26abf623773a0fa4a3dc773a07cc23b8f9d1de93cdc87f3f01d4f954e6cad276f54ffe4e989f592e7788ee778ce8f1f058d46cfcd5adfe8f154f95cc7c81a59a39135b2fe457eb5d691ff89759b68722117b2fee93c9da7f374a6a8e205514de3ba7dbdb893105ef02f2dd2eaabbfea755d57955d57c51e55bd8de37a8378597dcbba5e70f510c72cf34b642fac72e9968ace9bfbf10edbf1097ff29a167432a30f3ca3a6695a3c793cdadb793af8b98e13ed3de8a54e7e9c9c648835fb2f35f3b42d3f9e9317513369244d3bf96c1335ed4d9a4d34b9900bd9f94fe7e93c9da7f374288ff7e13c3bbe53b90fe7e13b25d363819ac59ae9447bd353d3d39e7461c962cff11ccff19c9f5c88f5bab439a3c779b3fd68e3b82d6be3cf28ad453fa5c2a6ddb2c5cf7568df43e68b346dfec9c9b4da89fd2c43117d2ebd763552a69874b3164fb42791b487dafcd1cd14c314ede4660eecd044765e1f3fdbb07add6cdd524721e710ac9550c22ccb3268b3ec29cfc9acb5ef3cac0f91b5997ced9dc7cccb64666df618f65a95b508ed671b4d7bfa6248af5d68b3c73edbc08ca46937533f619be7788ee70ce13b329f3d33a002770e7644642004d2e0ff9ad4fa258450c20ac32094c1e68f3ebf60eae2d22dd86399a6698fd23091a6d94759ec6d5cbb413c5cfa19176d79089c437ef61ae94537bf604c3412392eddcc811d997435ab659b4bb760d52dbd74e99612dc216a790398daa183464add07a5d487f3ec504aa9fba394523ae9d38f9b8d24d87861a2cf971dbd942c32cb1f49ecda405b35ebdaec28052b3edc8cf72c110614b5b64f4bd13a08d2416a0709626b787ed06cff7444269bf0bc4045e08411848ee05558dcc4544b0947dc5cd5bd98677aa6be28ec4e26afb7e6b11cb1d994431053850104a32277909679b59e6a5806c00493a99a58606beafb73fbead67f392dcb3bf0c9c9e86fcb6518e1722bd716bd822406132f06091e8401051852403ac3e1e8687acb260260f7b900d83ddc7070325c866bf16fc1fed925abc4a8c4cd697acb8f33ace264f80d45d81a1e1c26431cdf1ff5629cba75933f7d2cd93dd9275c6e454a7785bfeb21e8630f0de7ad7132ae8031b60ff68f3ff322ec19a76e06aa7d3cf50437e30fb72865844b5c17b44236ba9fa75a613a5857b5994672246d84c2ee47a4959235954c2ab6b452b2a69249c59a84acffe52fa38101b86ff60074d561362aee0b555e603a583fb9fe9b846d57b9544821b0f984ddd700001b6e8e3d5921fbbf6d9b0d00a84185866d7b318329654339296ddb46da46a26ddbb6ad25ebf72e41e10aeb82e82e6c10003f27c39530dc5e3a61730fe921f0bd69ecd84103df4b0de175b3c64feeafb0f0ed15365fbdd948827547f00fee488d93015118fe8b2318de77fd430456ff0b428cd21b806025842693ec80c439e2cbb7d0e18556d01958b0f9f1f3ffa7e2ee392ca3b0fc1baab0f0eb0d0bdfc36d03286ce7cbcb5a61dfe77f2763d0d3c2e5980e2a0fc218a59cb44eea9b2504bbb782381957c54a16561a7f60f7ce0776ef789c0ce7eeb51dec5ec36c401c53d5378be96012558b593fb9cb63fb9f6834f2090010db37c721be9522153e4350501a25f65320f6e08b542a9da0a49ca4a4a49448a39414914d4949d152322c25a5a6dc90f5a37057464882159480e10ba91b26806886703e5892042a8090a305902b8285133c2e8b191cf16913c480c98d163945f84c71f96fae849f201adf1ccdd55ddce009263ae6088c08a219c2952185022d68defba6633e816688120d68de756e80cd958108424134bea98c80a68570041c1c9a2bd6b7f50fb0c8428ae692f56d6e0414285042e31b6a08cd35697f5b11c4081c1adf503b3443787715de5f5dff2c7a5df7e3cf9dcc8feff040405294a408922fb81eea64bd9db783fdbbfcb17ab3c9745537d368554f27e8a56e0e376ae057e405bf22b1480e9e4e0e8664501451bce78f4a19217497d5bfaf629c513e3a650fe9289e1d62fdbdf72094124209259443227c4cf0f1f1ebdddb92c953d3533356d46ff6bfae77bfd98607ea9d362b57eb3935670aebef209d1eb170215e22fcf8334a177951ddd22eddd277e5fd7b6fa1b0fe9e4b17a0ff7d69bbd1054209f38e0885f5b78e8acbadc038e7b79c3f0476eba985c21402eea2de4f70e6c5acc46b9fb0f47329460710373737373421789a8ea20bd00fbf94755c177704f1b0ff103ee34d9fb0ce4f755e285d11a1cbad60d4964c14baa0ad1d1924099b833ead324b5a5b36ff5770988d83452cba004a295f6063535961d84c0285fd95d5b7fc151c2abae5761c4cdebc63d66be5abc5579d6ae12a52aa2a1654c10ead4d502534cd79784e966530c83215c0186190654a6499e7748be539ce23f39ccbc657aa768a60a6387bc63ea288238a98585743b8dc8a0a76f5840376bf6267bc0efa8857152fad4cd8ec7e28b63d6c8ef9f1fa095359f6afeebca37aa96e89d56b0f7ad136991a5a0d07a30f1823102b3fbfd4e861bba7036e4c407b3a0ec94c0e593c9d97d29e0ecc2c26145401ad0089152061490a2b075bd095d618d8fc74c7e6a83ee2fcb87ef5337e61f563576c7ebda8eaba5896a5f203c616c0187ff4b4ac9d9e964bb75cedd22d8db272bc2e57d3d4550433cd68ebafcb6b637d696541577ded56f2d3433dcce1de1cb63c3687f5116714ae5059b543b5658f7aa951f5f7ca0987158781180e8e05b67146c1d87985c736ea45a6060631abb340bdd4b026d698e9e917a8c01b764462c0f302215c9ddd81a375dbc74ff3623af83bcc12614b26959249c561dcc178048cd12e61e5e7928a2dc2f6e3e030d7c39f5fe3dfafe0f78dbdc3aedb43ac18e17cfa22849f65102eb732a31018e401f11f18c20b79fc0451beca28261e6a430d5fdfb918fa589e7c611ffedbfec5cdf63eca958ff236481b1ee51f05e5ffc56f2f50b67ff1f705caf6e2ffc5dbf0e2c5f70360738e05e566f9356ceeb1a0a0bcf8d1d7ec4717e5618c33bb2f1ec5f428379a3ee2f9e2e6303dfc36c1b61af6e0813d249df1d37bd7ddef30095331c658bd1815d367eb6c22ecb193823d646c0853b007e48140b047374cb91a3615957fa6fb28f7cac161320a4f95cdd1b8473f5b4c1f53fa570e177d6142e9181bc5f482fecc9b0f8455333b7aa79fdd10a6b9f9844f98defc8f290a8db47a09c48be91f26d31dbaa71938bec2c4c3c179b4630cc1615c21258426f963b309c66432e1e0e0e0e0e0481c9c191c93bca6c70223099b1b07e7c5c8228d53e44fae080f4bbe88bc36073db4cf05a4d05314b9316f5c61b9705f51c1255705cde2c608928e3186140918e2a2c85004428804348d4877ac0f13901732374a67e03bfc9171c8df9ba287b22b02ffcd348df72620a7c7d2400c39233e3e3e3e3e12fa4858857d9484ff272042fae641b1e4c7617237c1fe8e8890269826c6fb5d52e2c158d23e3d29ef49e10849b9a55e04fb11377e4202e747901efcba8042681fa94e752a77ea0738a39460779596545670883080e48a120fe7888f17634d597c1b4132e78f17340c52a99972324ed0f3fca787de7044165e095973d6784f059ae04e00ed30777032980c39129f265c2ce9d40543069506fe8ea8dedff4ecb33215dddae7a164823080c5f882cddee347bca767becd6645b0d97bbc89c3bcf7de3b692b55b0380ef35e04c3063e403bdc90116e34c217e15ba142848f146147d82b3fd3de94034aa56e90e008a5e6052a798ff7f811f791d07b78608548c17752bd677a8ff700e13d969aec4a12367b4fa73a954aa5523eaf04745222bd1f11111d02590002028a400fb403d08b393dd003c5fb8f0504dfa7d6c25073b102049f219e4f9970ec0dbd4183940cc59c9ca5815ca687f853616273033d96fe3f72e4088c11088bb8e284cd0df4478470967e9e4fe1f4cd4df78f189f0f404de3dd0c5c018b23353529b0ee88108fa5ff06082705d43c403f251f3794c061de33c229b566e88c176ca674044f43e95f2f4617d0ce486fd0b1d9fdb821207e98a71fd4cfbb2245cdd04be17bf03d0cbc1927a3c76637a463e639193824fde684c74a143a6a61b3635245bee10637e33df4d453a9b136b15dc5e94fa7d3bbe1a7d3e914e3937132fc8538000d2786d3299e92d8fe518560c2848933895de43916044305feeeb063e8c07dba13954e0cb609f02d76449ed802760ec6617c22a282212780f0c4189a3880188c28428709204c3042f760490a86388144113849b04d40f2849d18f0c00b4bb824617140440b2d7858d184126110220925a6a08213d0408a1f3008c042094d13689ad0e32787dda975ff17a3011b3821f4840b88808004340e28c21786c0a48717707440d36ffb4dfd2d4d2cb6d4e2202ca14510233340820441a0c9261cb1b87ef80f206e06fca11e776f1efe62b858b204bb101224463ac690af1c792a35d8506b2541fdf7c10812a1251086900bc1ee47384c7619388ec3649f01f6999f1f7719b8196f06421c26fe4b8d1b2371658923f96bd308fad82d5900b8ff924ecccc18c13af71eeff11eef993934868f5cb13f291faaa769bc4b800238f12f7f0bb689dfb819b0c7dddde143c93890b37a362ccc792302ee083373c60936f74d07912aef46768c24b8cfb9d2848afb59c92b38bb9f17f7e3fe7379e1bab4598b5c6e25778c8de4c14082f59b3ec29c11c6ad533b340d781b0529c0e2e666deecc002e1f3de7b04a007c0fd3ef0793564568cc860977931321087939fdce784213c4515937c265b617c2a0d230ca61779ba9c76375cc9c287ce1853d0ee2136b7cffc77e3fd3ff9d01d1f7e2b1f1f1f1f202020dae7c5dc7871871848d8dc3e410ee3f3daa77ddae7cd6deb7721bc3f14d9c1c9a0f12cec8d90145980081f87c1f3015d06dcd7876067dc811ce8013910ea1a128018227c11be152c6c84eff5f46173a79038ccfbf7dea3d487f7de7b379f52a9d44ca552fe96ce226cee94bbb53ebc1a4c70163873a6533e332fa6793ad5a9793b7584cdee2785fd677c7098f7f3e3607cef1424bac2b2a4a96f9a86bc33d0d045506a5127238612d44c3ff579fa9191f76a1478df508aea9b176325b52e7d2c30446073df507f4f512819e9ff3731cf85cbccf44fe71dd86148f4a882d5858cbe249c00842ea4205132ee4f0c01fb43933fa105f617d811790207385e21a652007e9f45d80ad7e258de3b162b588a33c4b08b806371dfd80232ecf78693f15ec4a35f65b182ad70869ae666a0ac8b218063793fc30ca311ce59b670cee06d7132de1fb1b985528144154de8420846b801cd7b1f5ecc038ae08411458ad0240a30d0bcbff1627ae041c20940b690c4081334ef6b5e8c07a8d043a7c814a44835a1793efe8effb13bac62ac42c1ba956e26d754428725143185e4c0a305b91f18e55b5131bdc39854de4f2b982188249081122265a0429229641080313461040458fcf04941848190d6056bc50ca2154c402023de8ce94ea012449537b9df00fbc4eebfe2eeee04f0a14515485690852474504319b6d0820eb840040c24884b5842b0e2674505f52a26dad8014d5c80fda1c94f29d8116982832b7644c6d004675450d683cb1e915185928ec18d2a00a581fbbb9afc2bca4f2f7eea0f7c8147144880444109264400832cba58a20a41a040125fc053818cfc5ffc24e35ef974f7374581dda98853458abe998dc2fd520325e38e22e204244e04226c80fd69a9127942082e61470422548045d811818811e0bc22975cd6880c22725841290c32518840d6bd9b1d2307af521cb0bfd4c0f5c2237da4a6e6c53cca9d5ecc4ccd8b79687a2c4bf0e820165ed37fc5de3b88298ba642c62f67f27a60a126a8b4add83431646806000200000463150000300c0c0644a3f178226b6a05fc14801271944a6c541889045a14c3280c42c8004300000018000200333333b20149b86d0759953d7a7a2e3d90664901617873fe3f418f9f1be3841b96b623101cb5a4d41c8700bb235afcb20ae7a0ec8be5e3a6f03b98a48adc528b9240eef0aa71648b8e771b2bed10d7eb0b01e237615ede5c22d6b8b335cb284ad019033dd73854c3ea10814667de110d5556acf8fab2e4858ef37d39387c897f80e7a7097f34eefcf61867469c9fff57cc4eff8100dfb9c84152753638aaa27e51e1281d3a159525047f99706b8e9eea64748b5271ea918651915b9463f87708dd292b25562a0df694b75164a74c84b5c9083f39deb559ab207185a732090cdf1261851806d546655f956dce26a6e44a2b669ab3da414e28b33e37be612237018a812ddb0d8b869cf9961fe65202cb582c114f834d07487b606fd76370fa9b71bfd672eac863a82f9e5fb8a70f2aa9ec480f6ae9b55924d3cefcb306e4f6bb042cd5f5e806dd40c1a9f5e78601becd20637941666d4b18ec747f786998e1d6d3fe48b5ff8847bf99cc223cc3e7315d72222674254b24909821fab9749c9613c84baa01baa90b02946726ba802661a565c023ccb978e465d2fd40170f7bfd62915945e4e26795c122e8621b6a1612fbcd513d3c19453f3f17c6da9927fd1113b000fe993bdb5bd51c340f5d52057b4db023cc1f49bc8ed7caff477827fdc1b9e4dd119a07ce4cb7280755a1809a0841922391cf675a8e79d7ebfad73d0c3c1b73a254cdaf5ef94c8ded97031492f4c01f1c341396f558065bcc298ef0126209396dffd2d25a4cf8402edd9bda3ab5f1a6bd9daf0ec36ac4f3bf09a1943abd6d7c126f98a5fb210eed6dca7877e9786ff37ef4ab3b4e16f5d79cb9d9350c249dd3b1b0b8f29b4c3a6b131c24652008b450036d0e4fb3c3eecf00c5e799d98102fb913d461e7744992ea50adc78f4c9312a017a5818fd0c70dc2f090f7f05902563a80be14950cf97e36880d620cecff13439c1d5450d5fbb0183de6f436d1f85dc2e812da8f3064f93878c6ceb9966aacc010887ca0a0d0c40d62fe991feaf5f93659f7f95ddaac8c07d516f719dd7060d377e8b8cc63cd80db55a1d7cb2685c35334e1d42fdc1ffd1bbcfac728961e780f9404dca7d9cf30d9a4606c242e111bc5e890546014386e32e2d6e6d56fab15dc5e5b9bf169795af669be58cf2b9762d795df27bbd058cc5b12e247fe615bc0c0443dd28bdf846e20fbb912a10df70463fec6bdad15757d75e7a356e1f0d4628fdf6f22e02f5270fb54548f3edbc1bd466d20584caf0394a381f293be5dd0a9c51f934216d6385ffc3eb7a13f7b18b002d45b9b71d318c3c8b9c308c71f9b0586d5124b18661fae7f6b3d068404edd73e65a5d99ea2470bdc3b433852039b7b5c57fd2ed6c3ffa37d60c41a40220d50dc9f4067012c0569967b849c8f6e3b6cd648214324021274294736717f659c659689d2cb605afabec7215e976b2042c992566bcc959ecd2d75866f726cf9922fa4f5bf96e857031cd3453007214a485cdee5141ca2de831c8e4dc8d1890e343b1c4508c3c6554fc525feee26a4fe158002a16dab1365d10895c04949dcb4513051d7545930406b5674d34b164fa824f4daa463a832e83bbddbc7388680bf91c8b34fdd6072a6350c0d9d4b5030c29efaa4b07af29c02d3d6569171416d3b571b21423d0166d22d802444ee0fd2f11f52aaefa66523684557a322aa9e72f308f54fab958f76df0f09d05585d176c4bd9559521e8a5070e88a278a28dea4f553d89250aae254aac445b08bb01d5a365c50d41e965e221937a303a8922d885de81aa0d2b4a2c3426326815c2c3ffcee225f5ac5260200b6d22f32679dc4bece6d6c3ac7a57ce4bb84392ef81ae790b39750bb559321b1a28209ac871526f980becc6fb90af43a8cdcbd91269fcf4b168e0bf5654e918aa3e3a3230309e3f0bd4c5c02cce899bc4fe493589f24d9512131e9753fd334f94483a3ae526ff3e28702f8804b0604022985d263ec740a4d3660f2540ecc1b5a0241d0ab3b2816e333830e4fd4a29767b41ba480b70e0388cce1a51eee57d0a2871e96c3469cdbf8f2c3613a5e536efc8f835d92f3d840f5b0f0c781837687898c9ac9a81065938c5e83f6336cd3ec1e994ad3dfacdb98b50842c80ed88ab5cd3cbead4c2ad1c33f9b2a042a1aa386fda2c12b432f3f41b50f329aee757695ad02a14aeb8c1bf0734b44868707c0378d45e01eb04b91de8eb91dd7b09405eee3b82703debf18f8adf9902411fdefb22993c32079af26c178dae7fc9ce08d073de18a5072db06dcd1fa29a50e16f7352df3f14f31f0622ff10e7ad17c5ee9563a76613c479ec78b4ed05863fe974b249b463e3eacb467309ebccde76e06e8dc248b439a4b40efa2759ed9d441081da6c98b688e263dc596a0739a1e431f0d66b3abb95e600dd8cc4a301a271ea46416d970f13f6379f24f1a562a11a86161d075d88aee6e38c52c14850f1d9e736fb14578856acb48837e518d74b29068511d8220f4107fec780f38122743b49ead9c66860092aa053f6b233204a8ce44dc31f2f1cafac0093579c3727080876a252db44f0127e1bf1a688ef8785af9dd29e675f6bfa1df5029a962c94023712787ba993dec745a7c4019c8846b296d373055755020e707d7291a0523a3cd3d8ef0133cff484daa15cab59cfeea3d33cc41aca6cb76df18f5884a25789a42bcc597edd87522c5e0c95d923a94a7017f389c2e344e6031d465cc7d8ab6ad5deb48d8658c2d857ba1126602a8c14dad9719785a562e7c2b5c9a2fa8a333753a965954df53d56424a616fa2a95be9a3a90be056614fb60b88731700f1bd910149f379f1aa6f73752f8013ed81fec6cd6da8d6b0aeb7220a5fdad6a6b070ca9b3ea03e92cede0472755349e263ee873a4abf5f0a3053bf8490947f4fc2dd78639b6ce1fc9977e042841e7b09856422b344c1af9ef3f095c87e7a293e07c03c3c7a78eb0544049de2f412119bcdf7a96beba6d5889dadb0da54839701f0df51e228dcfa6600dce2acb10cc5dd051692508f46a611193c0a7f226da94f3287cf5e48a9de47f596f3a39ea8dcbd8802ddbe0f142c674880bb35c41782e6a348b34632d215fe5186da52104e88ac862d32a2358c0470cb95704547debd4d69b52a63d98aa585722dd01bfa6f306c3fb0e90ea095590db12a50bed604143b427c818e4894f5b6e70ceb0abc605eb080bc259dba03e47225240d4a50565d2666edf93723dedc4bb4f8b1d29d2807bae73f816d190565b91c41efeb5b2ee19bf1a8bf8e28ca462410930b320d51a59dad08ada5587155b0bc6a33019960c40736a105c0ba33b148850003689c40b6b499648c60099ac68c4f615317e50b929c6a8a981915164af08bcf0c8b4cb8c53da150e2da4ce60ea516496d9fe5e6ec4ed525782063b61c879991e598428ff3d1a033550f576c8a7ef5f793671029295045d10dbf108621847fdd80ca25fa4ccd2614bc68cf44a4bdf96e25d71469981bdb569bbaf02f592bfa9e28661ed000a7266c05740c2cbf9c95900be688805bd2d37272ec78845c74ba626e7afa5429dcb757637939b8884ba765ad10647ac8ffbcaec8e84d0d8a6789b784c396836994396f76286528694f0eb1e65324979035ac341713653089b81d9e0c652e137cfc5d439b53c0a8a08b4a8331ba6e3e4e95d34c341bf5d7c2a7904b9de1e4954ff075b84e1317be0fbfb71a4b953a354015bba2d04c23ad9a5814d9e7fdb19b47909a9c350cf4c93eb9e4e33997fe20fed8ae9cac5f3ca6af88801617b8c3adc8bdebb82962afd0e82fbd67b855f77cb9eafcde373a1f4310fbb13f4e39511cc8a298b9591392cb2901fead735dd5d23da9531bf53bcc25fced2b3dd8d801e17de51b39056f13ea80e44aca183afb0cf1fe797ac4720bf4938c4c767bbc617143fd2dba35cbf8e98d797aa8392efc548ed826b99facfbb07bab0e9ee0f25878017da0946c2bd2ece22b9391f0ccc5eb4bad09364d65ed1a5d5f7b0d4ebc1f29b9b7892b69a4131bf24179d054f9419257acb8d895f44b4ef240cf815e3bec7dc3c6e8bd553cd070d71c35dd1a3669812cc7d534e6fe6d783b8b051a71d61fd7877a45f1baf47f93557b70d6f170d24204706ce929ee9e647b1e01bfbc9304a060c53e03e017d490021fc58fa7f3a373658343043709fcc9dcc420d266bb031c134aad9e18376316bca2cf02f4d23b04109b0fb7f3ebc922f7d8cb46b2e04359c8cb060aea18723c4a980c623c5fb559a3bbe6dd0596588304c52ad2cf04d9928f3e0028b8302028363c0a00c2bf1b882a7711701a7496543cf8db31356c775d66cedeca49b829c77cc50c59b555bbec113748cd98300fa1bda8d1d6b3fdf50d076ec4e51b8e6669346f73455e7ab7d1f25f9b02b6a6344ac44d6d46b944e418787c7109c10420e826911d41f3bc25a03f1b80a6ec96bb77ed490342c92c914641cc2d2d2068dd76ac110cc103d9b2cdd10e59caffb67eeb5210a0e370cdafa80d45120503777af6320e5501126d6ee8efdb27ca0d3b706d27d2d7fff3706fd4bf0434c6e5d9b2f75192b100d6aaab48423b19122fbdf2c4c885d5cad416d03a0c42269cbc5b71b6d014ff9a3f33d8dd78cfb61b5d26a55ce3427bc592b69387a3e6177776be7a22acf4df1f9ed8c9ed96bb9ae2a349a6b718caf723c4dcc5e2adbd361a0ff36a67cda2e9be7302a649127f710e5a859e77c29d5dd771e205eeef80e8d96020bee659266dc454c7b4b4f1a1d5ebe9df1c435c08d60755fce76f2ce59fe6ec351e37067901e2ef3ba572542e1e08e0e1fff56edcccad3c6384ff3028f21e5f175f98d628221aa13fbf3f6e35ea2572e3c897909d2e390e1cce6ee540d5c8a22f61eb702ddc0ca0a02cd6b98ac78ba0669acbadbb627f4f45165cfbdc75d66aa109a742823ab8fc5488313cb4a4fb54995c8854622388f06e87439f27160b5494a8bd4345ddd9a94ad73b241cddc4d0f5a68ed639b5a1f13189cef61311932aec7e57ebc07bf4c0f06f180e4e461e3523eab1b591d757ae9f6930ff0b650523bf1540b04e0ede09d723c0194183f3cb13c2ed24f235811f1fb51912af2288d0285466ef411f62972a7076e4d1e4f0cfccb628ce5bd02824b501e4a6bd1a33b91f09fe53a9133b687d50fb59fd6c7f68922097a8e74bc3869f383a93890f0dd8a6da8d736af736d313e97209fb365836858f7e51ba92b9c6e262060134eee24f1b2c87ce00ad14188387ce1036413d21ba004e2b33898ed942d64be3836f67779979d1253a80090e54c748dcfac1721a2057a22c3163c07c2dfefab42f817f01c5f0468014ee2ff6f7400ffafec3fbf2cbd5da6703f045c8eb975ede96da9f80cdc10ae86ecd86a74f919a90c5a86626107f960ec9f9662808fe21aabb693732fd0f0f0409a5b6a9e237491ccb752ed7f8e9da477d1544fc37d982c995a111cf7ed2f4814363afab5edaed16da6a4498ba445198b4eee420453b5dd6f7d0505977e1ac7afdde76e18b3a0a14ab2ae1d15e560ab6eb65da9d5ca306006daaca2a643f4faf7cf841eaaa49e30a6569c5d5f3afb8e4a3aefdf2f3c45513c558e3621e7eb46b9a1aacca9d9fdd711318ccc542251ab28155899c005a09daaec47a671296a0a3ae7c2c9f226b40b8da5b046d0f150aeec8b43d517e3fd35f4b1f37c2002b140b503469a4e86ecaa31a539ddcaf104a79092d01458a4fd2e69ecbde51e71c5501cd17ca458a1a19ad36404480e979476f52139d627a446102ac3d1fa65d6227ed6c5606ac6301d132bf89acdee9a3976ce147aa805f8dd55061eed2ecd3da11b4afbee1579c88a38721dc2c035f9a30d42a8f8617b580bc2351c519d0bec81120b33f262a9a5b12f8abe2c819ddf5b6002cc33baad4470e91237d3b9a8ab9f3c0e453fc34ebb138adc620b29901e2727789e81d5bacc77b19c62028ea1a44f36790e3d918338848952f97e1fc600edc1b54bf8fe6e3edb84a7b69ff36d6d43f8db2a67a4ba8a89add40a1b447f95860fa37141baae9243b22a685539c0b54d98bbc547f983ccf055a8a941599723aed18b53655b3fd2769d9d7b4c88f747d5e8a0c4d07b042a3d41d9969257382080bb39eb5693bc62d5da57b0fac563c000c720335dabfb2e52a61a492b1bf1aa99f9da8c42a9e6b531dda0f86f3fe192697aba121acbf2f9cc5abe1a6c4e28dd0e9aabae10c07001270a37daf956865ad4806ae4acc41f5a9b8b8f69549cdfebb01b32c272c149a0b88bcf1f91b484c7d10de261629c659e83a7237ed81aea6f3a7a7b9d2f63c743df8f3a56f986b2605a9aa8a68dc7e56c293904a4ba0210ca19c0ac94180681db0b47bca0786228c3e4b75d5bb73f4863817bd1e4995c6d5e4dc9d06190a85f8e4cfb986834cc6a32a0db6949ce931e5fa6ee51b04d95b2e9c8aeb843a95befb8f29fba058ec3ded24a72961dbafdadc57c2a6d8e391f5a5355058d519bb3f6898d252820da210cdff9b5eddf1a4e440200a22d7855383f96f72021702cc76131de32373be88a5613d764df18251f60cb68ceb1490093d009e70c54cd01ba0b0ef9abd3d68b6a1a56750ff242613015058a660b49d9cd339947baf4af16e7a1945e33f9225be7285184921a24ce8a98e385621979cce56667d9407232e1340ef23b993c0859ebc0c5d10ad09b20667a8b5003bcd77bea129dcc3e9ab43c3351522f461789e723956e2a70293df9f0da6d0cd7955682a3038e438a2ee02767f9d3bc8cc7263b07241f0d95a7001eddaa33fbb92cd416c4f607890e4328d91bec0c44873da3a9d10d0fd59b6deefbaa3c61821360cf7c5d9bae51b3c252c269d13ce00f58bd944539f41b94e087145ac7e45c23374383df76814f57244678b665f040d56542cd25147ca12c4911a6a959e893d737029e76ed804373d5d567f5824dd18d749cad0cf8b4b49d26c36df58875bfe78b422284e5ec54c91a187fba6e7922914ec49948d4f76901a3c0403fdef64b84a479b73eeda8269c8e83e455e10721cd2c2b0c6d2cfad236aad9a86220042471ab43f00563129be5baa0057d370a0a264b124602958c13b8e2751a04e1aa1cfb38694dc2e94517083f199b6d7c91585b3b97ab65b3a74a642cba07e5efb5dd241ee322f81cf6a3871d3a08c004ce35093b14bb45f9766f39282b29a1b03ebd1dee224b1b0fdd67b4fd0ecd63162a6f581ad1dd992e4c295700651a9f142384668e8338daceb3c34d272e3f081e1ca5ba5cfd73a1e7f3753a1666485bd62bba509bb5a0aeb94a9be272cbbd0aebf7c9c8f8f4ba4cc9ae27873eb87250cb08498e3f26ed2fcc3326bb1e08bcd6c4352dd4033e3110367ae53a7aefc15eeef31aba870f46ea105ad078dc3622fc715fbf2920fa6d64248ce1788e646350df730abf63913a5eeb2d4b48b845db357ca9b10ec3a4b33ea9de1ccb42fae6afd5ea9356d21d152321a6d72262af507c9e660eb6b97112f739d03e7f9cfac08feb379b4af5276e676f3e2b7dbd802645017caac46db73e1537cf960ca82654b49cf1541bb94a00c55517ac5687a53a14e51903e4a46411cfd3407fab39c0d3b73d7879e86f48d260e810b296c000e7ba3f288d2b953b49c37c8ec0c5a55b2eff147de3a2fde834aadcfda4365e9beb35384ec30748a218143a051212ce0e764fc4a98914812ed95448590106a0b0782017a0b82b1955c8bf43efaa97e0f0f48843b0e5c3a4b9216a5124f77033c04c39bf3c11b434b28252d6e0ac716c2449a936cc8b7aaa6b5c678c4789593c9070bd31eb23629b4b9ba81de4ee4c58c98918717440a6a39317701b13c0f72fc48893777b67a2464b77b8f7eecaa6d581cdc26313b8776927f29a98932c5f1498b9e4836c0d8944a90ea324ec1e1eab3c169eedc2769b64a46749a8a9e9c0b13319ba0a239cfa87ebb3d9a30cdbd8bfd45a8c0a531f03c8b241a0f59ef2a991f0bdcab11991f24e1ee7a76f98d37f4c8ec26953ab53400b58390bcb1640f8c01760b296ea6f742f786d0033d24ea2bbef52647a9cc14c0398426db44c6213f6df68d4aa4bff20726bddcafe5e159e4337e58ff603775954c353207dc5c97cfdb4caf0620c051b84640a9aa38034d8d9ce2ed3de900c2fc7b36f5221fe0e80f2265aa4045e02c3c3c8bdb4be407e1ec38b0589ef7d37940791287376268ce0100b4c457b8664e62197b13eca5223445df4233768b25f43a2f91e566f3c5afe7e4e5a5268e2ab555a4e014ea909e4da5552f9dffd4b3610250f61579b760c323560822cb4c9e1c8d2c79c62685ce41b2c84f46c66434c95717850fe6f85118c977f2f4b88eeb9a66a09a7aa760274ed4a23268723adb56a61e23a0bc525c8ec741509bf65d4fcd381bbd59beb815ccc436edbb56522132e4cb6bb2586108e6b2b37359e27efcec8e929555c12c4095bed6d7ae1c8bc8a377b2d57308e58e847b19fa04795facfd00ea046f61189c20ae66e4f47c8c1fe8898e087b0728e846e2854620861a611445ac81caa1c0381185a680a2f9f751c3795794abe5fa36a024b311f681b3b7379be18e139dcb7d0bd74260989a8466beeb1651207d04cea8dd6e6a8c0afb20342ee195f7cd17f9ed9fb534ecede5a9a6f004aa10b7be6db1480bc86980014edb475752354d0cfe9716fb9e3a8a7837005596f18c817c7a4997113be344c0af77cc088326c7734dc6cb58383636c17e20e72f462def2b4bdb4b6f3dcb5ee6801ee8fbbbe6fba01c4a7d6522cc228bf804afb5eeab88f926771fd4777ad3efce4da4e3dc22c24c955e1ac4dd6afc248fe3d4180c82f50b3e4891a4a347e516b9824410056a9490958d6db6647ee0f299990691bc89ba2d760b5d41a020adea376e14aba82cebf3bab85d3ce500ff8b391219e279a166033a02835d1208ad5ed90f17b5dd177404eb2d036f0113ba49f9e4312a9f40cb7b188c10a4701618b255c2f89041e4bc2d36a2e7278886c2dee8530a818d4c8d4031dd5a72bfa92c4f089583ed929707c3f99649d4dffdee411a777914acdcbd6b690d0e1fa64195cb50aeb691a6af89b9fd4507383d74936abae2a6b71a1d0db1bc2dea89ad04d8d2406f07d0854f76c651f0bef1ad05f9530f1751a916669655bff962683763e505e2ce46e81ed65ac27f0056b1459715ca889f98289f3b9bb2b69ea48b6e9ebfe36064304cba62d17beede7d88950b02c465f9868ee7579c98bd28da0accf43f43341994d338d25953c8df58ca0d0ce3610e9f99c1f11d99395c3dc4492a16e55f5522e5558f6b53357abd119a4c8825bf1791c47044cb5e37052a3dff7e72a7f341cf25d53166842b09069a11a2b81620aa0d03ebbf2f7c2806ecf1c7a5e705646ea6f707aa9772f0be65317e831dfbfffe0e3a9a036256ff6453821dbf2553110cbb7316d068f22e7b08e6552bb4fa69183962f9f95930208c6179638fad0215e49244d696ee076b37905f7ffb913d01052cef1d1492100a15fa24041e1cc27e2d6943378042e2427428c2a3a562f1378954cc4b8590dea3ef4f6c77a6e5080a0e2a02e3b8d37d6819205c5f9db1359b4243cccc7958baca4b1cabdf9b1a000d728d72b82bdc72ed92af21654cdf5d385a62c2d22d80536db7f0481e315e012a1467005a8006396268aea88cca888fedcf8c9218706c255271c8c06fab18b39e653206c22ed0d962d559ed56fa5b4b00abeee71bd865dcee3a347d3b041b150c8540c53d7a472b545e7e10fd421ff478fb8391301c03d52418f77648f65cca68b7e7848e5966193797c0376af1f5ea8131c15ba6d7cd20a4848b29bb4f797671c2092b2de6009eb94254f27d6a3701040a7f04f9f41cfb0fedcef60cec994c32536dd59ae387054b16e3cc3b90f77e41fd169ef06534b69f3896a3aff882e06196189b2f9abd5a6a82dc62ae58e6522185646fa5c2e49ae77ff72f8b4f6d13c937a17109ef1984aca31f4b63eb16768d9f984452107a829a7c1c7f24af3d9912c9ef0258ba7bc57ab80c08adb2fa43b613a77507a0fa8aec5dfa6f51ef105b92b1eb86301764ff97701c8c5427feff6655abd9445f846e80dbcedee78938211e49df91369b13ff890cd58a02af9d3966a02a24b2b9c186a397f4cfefa77fdfe701a86b666da5360440b5a1dd53a1bbc13188aa1020ce669d89363720ac797759da5b51474451942d69efd3a843e13b4418d67f6ac9ac2d89ecec33ba2fb9c3c1342f5f1ebdba6643a92fd4bd0163015f9bfcfd2b5c274b814849881db216f2c8b7c99a3da5ba01dccba43d44c5e8c916c162fc856c1b5e0deb6ed6cc35895ef4eb1bfb657d98fea2b32a838eb6765f7e510aaab1f13a309116368d3c0028bf43b2a312d2a85993ecc09ea24e928d8c9054b8b1b8c142c2c458eebd058004736d0618afdced36b39861e6b48424447a4ff96fc46f3fb6768a622b34981d4248aeb4a18fcf5accec747098431cc3eb2d29d9d383f084f4b3943f1c6e2494cffaadb2b9a9b7adbfcf21ae0c2d3dd2c1f5f32c42f75e2ac104ad07ac1ac6004864c5b3a3e6cf36102dcfb22ecbec8fff8338670b4452f4b0cd6dcc4fab33f706975f33472477219f0556e8438647932b27e4ffbb5840f2a6e5d9ae1e560b7765c12b5847c8ed75946ea6a6f4227caec6c899a0e32d6ba3b33579b6d1d52442abb53f86016b228453847c4039ddce64a37e42b8def01abb2dff5d7ad4cf6a2e6bbf9588523989a668fbaf49e55d4a809d62054e739a74b78349eb00f65303ed628e2f91f6a56b7c0922a4b4d2ce584196a4a02288d80e3b11a07154e052c4f630d1474177c8609e73f2db7e101968c46eae4ae6f3de66fcea9ff0f178812102d9e4f15272c86e8540a74221f37007b232370e4915077155189d7f14b21c40638c041173b062ee2be3220ee0ff302c24345316217e437190436a81b4c2dbf1908a369bfbb161b3edccbba7318fc06db6748f801afbb117bb857ea48f43a83c6c7d0cf4b15abde17e9d83d0e16caea10df532c621906a7979945d544a1c17095170f9141d17c8eee43c0b7ba11d5521e8bcf2a5c3406b4b87cb0d077e457c9fd0131d7a92ef265dc045682fedeb5cdf63947d9c5b1978028643602b047157115780b00378a9bb3a6303efb92cc97c60e638deab14bb9642dd409aac97ad236cd05db200e04eadf3f402c762089f96881ece69fe276e3b890e3962309345d2b627f986d9bae318fc1cc9d41626cfc882d5b6d8c6e4fca5c89d0214a830c9a873c73b7c4c50456b218ad71050cc93079533ddb17e4e25dd93ec0df2b538a5a257648535e30df66f7a9d75f596651ad32022521a4aeb6aea59fd6278b7707595e21d91cebbcdd074e048653c0f39ca70ff300abb707c60afde0732687724ef955ed74e732c990bd07232c9f0acfd5ff7516e69b3fec1e42091e232eab292fdf0149b594ff8bec001f264b52bf7be5bc0c595ff2bfe10cefbab7f0130bf1fe7179a62368157fdab0feeb7b8bf48664b11253e6305b972b2a727732e703938fa6557716589eb71aa5387c00912d7ace25660dedc2d2ee63c1ab476cd6ae78be83c30272d0e946fc454ab5378141d5a57c271ce5972a4dc260c42cf2cd40591a49980975a90d187eb7c160d059f0e413b13213b8eded0f10ee8ae682e9f03b3719242b78ec1a452a4000ea20c216976ec6431c99e33d02f0765fb0665da1dcdf22bc73c73de4d3a51d45ca22f104aca600fbf22d226a18d8a5bce1349594ac990207500b15fa0b5a5049c412d604808797f774d04ac01c817b8d5d389391a105cfcd351ddd8b447ee60ad5760335fb86bc6844b43d915ca27154e1ee0388f07479bd2bef853b9600041a1dd3e150a68219d794124689d6d5d087c1de2099efa23a57719e3c633d2384e8cd33e112707b891d2f354f7d074b06a748b6451112c6e29a04e516c7a9fa9d9af9dc2171815f3e83d5d2a8a39422f70fdc2cfb1d5331409ef3f9174223b98fe62b2c8001cc312158a82ab982b462eda49ec96644fc9df4d4c74df4d998d614906cb6412712a48b53dcd0c68f228b69318c3c33040b2507ec2b3e439d33c1562ba65574e150a5850f7412ce8ca8bc211df10a78d5fe69c648f53690e245e47a692112fb216ec0fcfd443af0765e568e14c6a0daca9304cb453f0bdf5fcf7fcd00e6604fe1a752f55ed2eb9349db606c0380a65b61dc0d3b756103bb0d3c591504e5032ede7a08f875769ac3d7c2ac703b0457eadb40cecd1cea2f0530e2648f21f4d39aec17ac9bd20637d5c238f0f2dde4f3f9777d504df4c7a4c414161d3ad125ac6d00ea62745ef896e8e6bc4dea67b86b10e3d52078a5089b1e31e167a9a2bfc5e5023f164150e59c522863e0fa88a521f2dc46000ffc08259ccb0d8c27e8034b3472c1e32bcdcf863b606e04a6de82b9ca3e2defe73780c605f58f012f36f00f8bae7a4ec8fb0d8a2842e714aa312b13617c1dab86f2a1294f8934809d5efc72e2cfe9d063c44e0eb43e70d085c071be48e3580877ee7e92c7c0c587847f052c4c16d25110da8a3efe12af216c7feb34ce5c1abca86bcc4159f377284e0ab361060df35a4d1f0fee01e4633cc442d43184fde8243e60753373f4419ef9eb54cf4a443bfef61388f5921a0bb91981c955469e41ea964f20457a058919746405e6390daa5529c46ff68e680c72c1d8ff28fb7a776b4a4fe640635000d1f1ddd08c9124ecb44eb8fa2ec0d9021a2eb68d279d88daadb19d1043d317a542be70df393ba18c75e16d61be65189103c7a61e3738ea2e4ba924566b3ac5fa370b1d5ad81cb028352e011da7d58ad6dcce6fd493b2f18aa3d5ba38fd3b1a4be06f486977698c9b6d6810a3c421d161f796f444347d12e264654f9cc408192cef9d1b21fe00a980779df62736600da9d1a46b81f7ab707260791dbaca327b6c808f5e9c91270a82aec410adb43497de9bed78fa92ee6bca49d274598ea1065cd4d33a235beca93e28a06976e80dbfaa4d16dad818642854064fc2558dd4c67049d116437e83ab7d1d8dbc50da3824cec49a5ea6c94af44603a2a6852ec9928cff14794b5cccc1cb914844d3d85ebce19b5465ac414fd5d3f803a4338ced666813c26f484bf9a34fc619cf67e22402befc494d9c230ca3ed517f525b28fcdb5d535c39c88520fad4176a21ca13d8031b1ff99a60aa54f7ed2ba47331e660ec808784326e419fef617d7b62a299933d31b17d165337ad8f81f5bfd7016231a008c5131df52e8d5bafc146a097c929ca322feb9eed6819efdf0c618de5318373827f2fd9a2a829fc4b9ab5a4afa45ac1d5aa6035a88b9b67c2bb90fdff78d8bd196b3d7c2eae991b105d564eb76f182fac3816576a0ab7e0f754d75e6221e27f4d2fb0d81e8ed7c6924d866528da845ed18abd8e894f924c373518311b245cd163f7f81eb03518d58d7a5613b96b5a38d305f75ff451e7151dbb967a5c62e6ce4f121d9c3d0df7563e95ea501bb278785b737c7e18a2cc5af98fd5da232da19ae6664fb18e050779d1f0b314815d427d5fb8e74493e44240156b75d5584f8726ff72a290f8c14803dd4ecb8333e0e692555fdda08de2bafccbf36af649ace04689ed4b39158c4dd35752cd7f166b0f41cfff9f760c7a7b37c0c1d6cfca1c2ee1de14a245964a5a531bcc81a7766e0cbff22fbb658891cb8f9f48bee0d1af2f0f7ccb30a85fc0a302f938936a31e695df069ece55c8b25df0e330eef5abbbb29aa123e1bd4a1c38d80b214cfa746768fda9960ccd602332c8725bdc1149c6292037047e0d58bf6a68a745750b42dc87b89ccac190658f4f5da303b0ad23a656f27c8dfd7e696fc10bf06e48186f6fbb390863f9b69a047bf3151a0d5a7f6837045b9c8ad4289b96d0338f112b23d2883cef6d419e306308f4eccfc52053bc0ab518230727557191c9e0ff7c482aff006800d8db302ce813121eeff7eed85aa409e17636a963cd07b93e3632c1a3d3fe4cfa03a0046e697dbc51e731cb98d427a3d2950dcbb032a8be163f3e307bfef64ba598acc2963992c8fc094488f8e3ccb8e4395b46fea5423e2eecde2a8da1c0119746476837daabcc8b62cba18298ba1f424bdc3a0c6ccb27c277addbd0c65289239323facc333d771c10445328accb51933b1df861acbd6456a707745e6609e9bc0112be00a83f9372998dea651540073811044a7d7d4d28e6593b65c0fae475038598a9319ca9f558c0dfe04b23053efe11bf0ed52a309a53abce240ace979b9a723d49a864db5977e5e7f8a11267d69aa9c437fc83a7e39f57ffee8cf5891fc181698332198f85e98febd61f63b62ee7bc5f4bd7a634e74b2213f6af11e5d0976794e98e5fa73cbad4600a70d732c1f9bbec2028353d659b68ba78a9c653cb5be7f16c9c011cdf3e6227d2190295646c5a24567e415aa327bb6cb55e5a60e44671187d35e3fb633f9d97b004df61a7b159bf685552d731583eff101575b76b487dc984229980de07a2e809563befca11d0d174db4603e79c92f43a4528fd66c60c68c33e3bcfac3f2ab13dca94292e996d62293ef3eb2f1eba5e4a8ad18f6e4833d877bc03ae0a4d83c1f64121b127dca47d534cda96c5a584882c0bf5d5d45193a81237bf59e2105ae844c4095cbaca58ce9528ce1129123ece6a9a1301cd190e486397fc1369d7702513222054729b7db2a63bde85fe455c22c38aecc8e62a07b986ee8aba0cdce13c47b4b03cc553a0cee7bad5e93e249c8afce64641fea39d640b1a109dece82561fcc4bbbe968c80aca567556e362484db329c9d3e4b465dc3679bfa12926c17586e2b82f2315e132ffb499b41a3f7eba6604351d5607be5f22193d332e8034662450ac21fcec249c27b18658aed37922df7b813cd890b227e6b62ef30f615de1ec46ab2d42906620c11640063d603763e8c1f8d882ac4a9897f1de271694ac829455a68026402e070f528f00b5956abc499b12a5f23615348c642ecf6a04fc69dc100897a7e394d84c2f93f905a44001c6b741dbc0eebc55af972273aa69c39aacc7e361c66bf1d2c9deab59ac71394379c248e20237a107e43055fe3f5cb37f0997ef2517cc17430d3e19b4f97c4b9d1950f5d0de22c2babd59c2332662eaeb8381bb76b2486d29cbe0d5d8e5e4b404eee43f2b309c6bb9f86775a8140b17f8bf8cd31146db441004ed95c37c59bbd56dc097e8c38cebd1c1fd75f3036a17a2adb0c4cf39a00330e3e1a27fdbdb3ebc576673c559432dfe69ff09fbc68c3b371393202b61997dc44e5c8a2038f1191210e28190d0900ef2b69a2c820e299899031fd8537333f8558ff17146cd0e80ffd55f77cc47adfd971721b1914b6164cdfe0f6d2ee07995313d99c406ca6bd193e732f0544f98b404fc19072742e7af51facf8e6ac57f3f763d318a76170d298f10c3268f3061c5e8a872c0ac8d8c0c09d1313802316ae7ea74e31052fa029d9a69780355e66448d5847f28a645413f4df8e426e86f7d64fa43ac02bed6354dd254d31b06c8ccf0c28a82d67f922cba6a83cd95d091495861a1fbd26b29106ad93fb45b47a865662698a28c9d4b8aa88f7c2303b3e231e8501475b8133ed5e9ae955aceb1c3951872760e248ca864c55bbb5b0bcec5583b0ae7c727958c5f13a006174b2c53ba02748b25b681edc24e58ad4314233964cc00e2457cd76a5dad2fc9d76a79f565b5b0af9cc6550710aaafaf20f19a71aad514afdd4f69e8edd9a5cb43cf699125c21185548241263f3731a6c8d3710b2a3be8116b9b9f8647ed4aa58b16cc403181fab60079b0f974a412d5a7e0991d930b7a12402fcf66111ff189f0ba782bc835175085805e8ef83322786364bbf63063ae591fb07fe8049c7f0768a2237b11b4a165470ea59a2aaf34b138dfba7cc5ff6428be1b42b9962c3c73d2b09c89a2d02797fb7bcb6045349175ae92c22955906eb980a4b1203c31f4708aba3c15d6982474281315010d757f16a6e1a1f39f279c58909c7306864344c35479bc215785584086359b625195abc459ee5bfdb44fe27a481f5199b937782e790d81bc2c8616144599f9ee35139e9bbecffde741d77e7ac3c566af5110709e889b7c695f812f0a0b0027a23057b0a973da56c1e53e369cf477a135a21e2345ec674b64595123ef62555a7e06546c86fbb6e6f190a3e1a09d7786bd9509a7c0db51da4e9743d4cf0c3f5589634c4fae8cb8e7f8c7aa306189221f63b3d15b288ec493428705f8b651abe8ee606f43fbdf13c188eaf83265cf9c4eaac4bf82143d414d53c835b3370c7205d22b6c67d3a252e74a8a53073c470dd484e96519313e24834f2485fe75303e0be845fe15922a3cdab629d565a886765802e2ea290cbe2e75727ec6d46e4c3375a1a66aea4f81670a972ac7334031392c247141d640bc5095594a22a1b19c2615a8024fa5ed1e87e3920ef01c78c3c63da21b48810f334a06df97ad2e81db5fa987381fd44325c574770e3866d403566d5938ec691c3bdd554bdd5ff7370c052c036e0aec673842595c48d9e20dfec881829e5b1ca60677864a925cfd3bb17fff47da8b231e12f4a7d4e068fc5f0b05380e1bafa0c8e7d5bab8f973c4b649ecfa6a75b63679a8c2c462b62a562a868bc56b132ab18a08068686d8ca0578ac10deebef311635adcec5fa030e2b8b01c1800cec856c60a65397ab0fc8088278fdd5e566ae33622cf8f6efc315a821f8a64b675b15dd29d4e366b0b6fafaa6345fbef0d52242aac398d662a36a054518b5b4a5e4032bbb799fb7d2ee34064100e5a6e2c01264913c42cdeede186de2e39b64250d38fc9cfd32cff4b23cc04caa89b183844009c8fb90d0481d575b78f9372850b3f1843e3051b87aa214ea24b19920ed0134687026a0a4b9a4343366e40c0112454c4c52aac113b81a3c50c0e0a92dfa13381e6a0b26b3edb4662f3a65f5f8a593906f005eeef13af4663a7caba21c54fbe36265512e8053aa1b5b24df2c97807b03f0b2b80bc84a63a58207b53fa857215b8f600cdd03839c271e5b2595ed8e4a61f13463593630e2ad5799a7522af6a01cc5eb49bb46085a0bb046da57b6b878fe589f3841c816ce0f42f157cee080df21d16f4b4c0872d5a77c786b68485005c9b8919b8861fd5d8b08aa0264698d99e1ee27f112debe1f190b48692b50b24b1cf3ad03f66e0ddbeafd4be2fd1124c1c1f78ad2cc7f5162364435440b8597b0524621e5f7fc219aac9a902d79e0a1044b8591fb3056bded5363ac5cad071d8a4207d94acd1039c9908ee5a0fd2f2ffcdde6b3c20a491e42cdee99e6c0d23d7c34935626cea090139d5bf801504ac3401f12b5dde32ddddc3406b78686bacd093d20b8a18687b893bb2910fe3c203a3deecdc9b0cd7c9d28375e0670e8750466e2a19532ac4f78a8161976cd3b167943df7d99e4d86bf60c62c30bdff9f85ef80802293e66213da81e20dbb3b06f5dd8e414275e544613d0de77fe7265f1d37119d741681be0b77668dc6f86dd93c3c297d58184ce90eff29d8b30f3cd88e3c4a348f558c24893d20ba37dbd069a2aa80d97dbbc6683000365d82cc0a79c74973f2bdf2afcf1b58035c24f1bdc0d446b061ca3378a54d823f39489cd6b1c7a3878460c34feb373b0c040ff799666ba628636a90fb6320e58e27cc4bd302c46ce929c452503228053320f858c87f5e54c66115b274bd59cfa78340e9f15f4835bd87992c176c1ca165a9d21b2f1e5b475ffd6e476d71da1195fe04bf77b075d6d0bbdead860360f3dca2d84faf24c8837c32198caef20114d4573be4db9bbee9303ac5d70542603efc2fc2a7852c13af90d22528c5a76aff71655447f62de14c913d2f268068ba4281330598adfdf6722d173f77ad6b02401eda04c522843c8d7cd55b7be5a337e8497cc559f0a9e9b74a70e216dbdaf6d0259d7dc378e0fa3af2c319e26a56db1854be01fc583cd6e0ed3d0b5b00caa8236be25c13e768adf417bf972f84017bc858b322ae357fedb8647a4561b035bb5ccf83ce9e578684ccfa3c7c7f9693bf5ca5a0487a474ee5a4a54bac6b996e2104d1f6d2c3d5c8fb7680f89b3ddb47d2dda31eb3e5aac49dcd4b6976344ad061494fc897bf6f31bcba477aefd1d2dc921867099e25642730657345b84f78915782fb842e5f107b241b8893800bfe10b331a2e0b9ff57c47fc9f3465bb198513e3db028029a3bce39a63d53bd9075a1b4158c1fa3c1c62fa152db0fa5f7866afb37373b95c01c39cfd8ae0bf451ce0cddd6765d356e23b836e289615f66856c700a97515aea3fe59e5aa7b576fccebb2bbe942c59f85d3034442eec6680cc0db37a9a951a01f333302f3d5737152d165039aa75d6366a641114e3cbab6142f68be98b2b70fd8ce279939125059c1be3b664a1fc1d97ff0db5d5d2f9681c0893073c58dfa7d22de4649f9deb89eef2579a346444ce63b7d3d2389ce45c2ff165088795eb0a5d67bb08cb47817410d2b9a1e808fc20aeb2271f2f8cd2ab4884908a4372bb9ca7d8af572b173d7dd4add9de5856b2d3120d5480f0effe97265035564f6082b9ae31c92ce63bde75ed4a274580479e5ce7b9d27dadb96970e49843b5f0d22ba62888451ae42b478b648b8d5907ff7cfba5ca13ce30822fa5d952c044e28179afcb17988170dc0448118f15c8615cafcba6a7dc48129613260b02ecb892c9712b3b3768ac4ee1494313ed628a6746a6c799a07bad116b4f6368bc3aad2872cd0a17ccf0b9b0f9cd19c275a1516a07cb8c7eeb9b5b2854021fb0128c4b38431f2d500ede5a346350781714903f2b163cd2d8a3179ae16ab27a9b494495acbf13cb66fa0c6309337bc4cde31f1b9e98e32f9c71cbaeb1c85e385c9e47be9734659a3d4290cf3c98a231c63c93009cf04f747486eb95d1803e96ddd5736986dc3c6049d000ce7e5bb2242715d078bc592f7a9bf814ae01a23c28465727579c3b1cd42deb58814565e4a2720dd176dcfc7df66641411ce9e4aa6216300415b48aadc21bc270cb3c6d0c2280ce0f38da5cc023cf819d2de2b00fc1b7362454671399b16455daabbb08fe4645acd7f35f67c770cd8b8e8cb1ca258408ac666bc6a7ce19430a81ac128253930a38ad7f020e8cfd6111ecbdb96f088c9e9f20ebba1d33c435953eb818739cebbef284058f7f2d623c98610cc417508160fdc458c6eaca3468794e3a8bea8d800c50840bf593765a3f1680d036c32b5409e8a35083d001e3ecfb611fe9d68a5aaf7287fff211c0260020ea95da4807f9a41053d5efa53a8e9bea5f09d4ccbfbc7e1b2591471243b6d76dace530d9ac4c0bbc99f13d64633681f50d8c20ff1af3f9f58e0e0f90dc3d5fd54705fe750390e991cdf138c9feda89020a8f8ba425b6f9577bf382a1378edd76feb42ef93e392d577bf2c616f2f210960f3532fd2130456f0fb1404c333167572634180e2fdff543a7d2449a80e8c3002294f405b499b76777afce0fd511081075f1573dbf7fab307947aa99bbaaf7a5de4e1c8b2782832bd9d710646113d0568dfe61a839b7eca111132da75abe2029b3db01f74c8218be147f0d4862b63be5049e7dea29a04a38f82d996da763c9814f840010d6baae90dc7642d6a3a04087e65b33e8a817af713ca240a07dab48646583a4d38b2fc46821b65f018ee4e5767a388e6400acb6d62d3df00acc44b642d03bff9fbe276d6f1bafea1550b6dede1bca21be69aee382408266cfadf7e49f42736930ef657c7efc496d59da293a568530aad4fa5cb0ea3b5056cc317757adf679430e3676941f26e6c1a078b539fff5ef62222ab95b839d6c7b7aa3963f1c27bd7604f45ede7989179572247df2c3c3dfaf15c66a795ea855200f4c6f2bb92e87b0dd5395b793deb513945e98930f3b9c3781653885731cae075e79a85bb0a20ef795cd04c7bb5bb261d6a67e1e2e0cd4ad47bd911cdcef47e87478877ef891b8080964c0526ef4991aa2bf9aa3f058589eca8af493095479c96c82866a448c98468cc278b63e8af453e6d90082351f63f435d0abc17ee293d16c672408541506be3c38a751fb1bf642996bcb93a22bb1da713aced050fd626b6b2a01e3aec8e01f34515271695db6ae5247a55dc1a9c3cf7b2bc9cb4afaef448a0aae2eb6e3b120ea69c0d8b717559625db3674c5930bd532d2d4a6e9240759e987cf273864ff7c0b476a2c083d8570fed28b03a3b481694889c901f7096bddccc67da3472bb13d87a59ca0eafdbdea2326779ec6c790d78fc1e0b84f7e79d8e8fdd06f4c1e76c4ffb66ca8086fd2bc8b67316faf360931d1c62f00e30ec814978c1ba1056efc6b3aa941500b3a9d5553bd36b8e919da5164ca2a32ed9b8aa6cd73aa55e0c4c18bdf732adbc7f8289010091f71b5aacbf0f095f11cb77318103205c6eddbd8fa8756a98b8c84c93ac538f3eb3e5e83036f529283eac0ca49b2526227e1fb1b70fde9200b01c2606ab5ac4db68097c0a9ed34bebcb5b45b7384d46684eaa4df1b4bedc2c934b3d9b869bad49572af8c3b701412b066f67b5220c94fa1b43119be5a970c27ed01d01ec42265bccd58b3296b4d802def5e392e7d6081b0a8ec7e7cad0026d249b736f8fee9bfa961fd2cae07f34a9eecde7b9645260ea0d39a8fe109e70b9fa8f582839ebbc19dcc2207ce42bd5154cb8a16837d51b1f69ba09395105810980f0342a4a08484763bb42079329bf4096d056a297d3fc575f9e7695987f4e0602296ec702f7ee45456e16afeed5dfba266d77c1db4be80fef011337ba73b390fbf99f312f280ca73086e5f765d46670c5a2354b9f25a726b4a921d38872fe71f9e90ca1bc954b759d8f746328d16bc066a9810f81cba564e50f45053efcc1c4c040a7e74928d8ca926c9eb16f718fcb076420a756820f73b5c7c173fa877a181643fa9f8febab7fe8cc0b0ccda28a570dd8335c4e467563336887707666cf0fa1d39bc83fa8458450088892dec38a6d92206acc46670355c81e4a82c8c1b702a2ac25cf6da8f41910955683e161476e1311886f014a083be369831884ae10c1cf6b95bc43a96331647c09c234c6ff5fe2ac71ef8c4eb3a25b0383075ed06896bbe517a351fa8238b2ccfbb2863db332afe068005f8e1c1603422a21223b3b901c5e4f58957958e94c1a4bbf621ed995142097aa621ee7994b35def600f1b6f147a0490ddd009f114fe14946d9818b09e6212a2a516352955a609e8a3b8c35536506f0ea01cc9337b339a22ee3677028ddccd3bf3c6fb009920cf85f9e4c6b727b4488b229d51bcbf03fd22146ed6f0dd918d32abd0941b7494856135387a9000888549c7eb5e977166821d42642a9d698dc48ebe5c1eca18cf79da64a653825aa80dce681a45494ba40d96c2b080c3fbded925eb7e50965e5bd8f962c5d1c5e4a10a08ee0e4c75819a5a06bd508c11dafa6286b6582fe104e7aba0aea3f018b47278131286f1c113a916b7e7a758ab5ae8d869355832383f1329968d1446552747411d0d57e560288cc3000c6887c3498483555da257655261a3cd7811a2ae0f24c3055e92c611caac38b51e5146c366e5e42a334b21e5106448fc898689cf613232f9034fca5f75a045f7a427e6c6deec41fae3d68c7a4ff86190ffcb2f579b8d0f9269925286543d0abe8a91e7993fe9477c7b4a2d27960b3feef00fc198faac6e6acf114bb8f1ab0ec87209eb96586e269b2486ab76166ee5634b567adb90c1f4558059943068ca0bb19f86cb770a9cb7da9ae019de82976997964945b2d805bd2d8fd8fe318172712fbeb623ba8cb2c24d52b867871491373830843de88f13e2768448de9330f28ac11fbf2b2eaad2101da44cff4f17fdc6472901c9b2e18663bd60a2397c6c3a019b2180900b2330694d71284780f97d1a59eddf2e30f35dd99a32b4080f8b83d3b36d2ef70bce9a80ed49dc005b004fe434bdf9ffdbd4188f965930eea09d9262baff49c8dcc43a43ae4bd753215ce6c49dfac4518fe930339a41f4959657dc6381f7dbbc16f9ee855ea6820262b1e2fe7d6f9bedc79a91307119b23b1ef9af11da5bcfe61f27c33887c43261831d09b56c6ce5939d64051681e9b07454d1ec38778a08287f70c30f1d9c455305a6dcc95b8503d0a28a77b5f12974d98514f5b91552de8357588cb2f931202077189a25a4f9b467a439a61c9512e6bdf47d3d5d8ce547f7d6a9c168c792cf0807d00f164836df8d262a81f2d12343b0c98eafbccdec83d95d1877d7768774d12679c25f87874114d151140348314d73cc1fabb696ecbeb77ebbf0f5bb675f3e42b5fc1bcba54185da66236d641162e1db0162d680b56e4b0d9be64a5ce21c697ee836767b66cce4b3a51077f2d664b29477f1427bf7f18583c439692ef6cc57755d0f1f85f9cad207aea24eb52eb77b665ad5e533443801052157485277d5f3ec70b40f767aba7a140a48eb1c84dedadf34b1e399e4ac501f2c9537066642b9ab585c259581fa0e7e780bae945c8442a23bdea398946e83da6122da60d8621a7b95974bac04a748c63c28ec87c7b8bb922e6f6d1e429aa7bc74184b86af314efffa8e1f1437d9faece0739daf65d705e516490431f28a5d9267bc8d7ae9261325ba3b393bbeff93895bbdc350785957550f19a847533fe49a8d4f83eda0f6b309223507d99a45dedfb06e6ff4f55a5a19b4cd73460fa2058d28eb3da7c1b0db3500686376f356d4161200b2c41c81579b58ea7a28e1b26472349cf9d0b583c09997945a878d73248e56c8394ebc0e346b1404df3a801cd27776f2039bd12ac6b670c1f0a3ec904231dfba7d474010d5a816550b96ca9105e62f01cfb473513fa1f388371e80228aa640ea5439d0c16ebe4c260ad3d156194e77a20ed0491e49f397a58f0aafe8707c992bdb2e367b61b22f5b050acb7693af655064c5303d36221f29b99f7fe7159b6f671f1ede32d5ea6d752078f775a9814476f6bd32e617587ba5cdc8cca4cdf0055f1995c2ecc4691917173d064e5bef9f484acadcd396e45039d6d818c4fcc0800a03ddeefa0147190532efc7ff25d857b5d08b7ad2d6a4c6c42da7b9a9106cce798dd0ed2a806e721b9aeb5b5031f042eedb16c3218af0965e105f2e99477e25fde8d2846cfefed2c9a5ed385d82c84e0955db12a070c07fbec32481be6bc25994bdd74d534122697255805dbe4fe4ec6d99f358a115a3db687c27e8fc6f46da78429c86064aaf1e584b5dd472e50343fb10ed81efbbc98662a087f7e7e407798b5310d28653d38575d31669c983ff73225ee5d66b1d6d3470f98f848c5ba6b0f401628737250dde1cfdd32fa9231a1e87a905287904577c988b26d38160d8c7711ccb5c1e94b39a212f044316110a33f539d3bc3def77c7ddba3748be4d0cad21681bbeeeb455ad5fb3f44031108a94a2be7ef82ee6c50a6e5f47f1e33305fdd07fb19882cf4ad1519d106b88c8f1a2ab6550c0d12966baf6736f7c54d47113741e06e52ecf3f1636f5f637117292e19dc60ccb14194dff348fc8069360f1cf6f38907df6c0de6d046aab8479ae7785219cc0c9f4369bf0412ef1aace9e7f0b7b1312b16ee38fb51226ce6d700c1662fb5fc3f35b8680c4c6f2217f985c92c916180da534ab73772e9c43f5cbea2dbdce370453b5e8804bffd85fcde15870a1a17032874336b493e47a188ef8c639e2b5ad562413bb4ef9d91d818834d754170215539594ccd25cef5724e2ca43c7ec303d77fa58e8ac07f0d75dc560435832c82d2846f8531f68c770b10bf20642d37780be7dacaa591c3e849e6ac619053609c36feed5e95e6b8d42d541ea2f72292daf16e3e25ddb41a0443a0d5b86fda42840b90efc202c2eb53296399fda9393a82192ca936482a868b195568aca1f5f681194105c7514955cdf52fc3a31ad16f273cacc48e3b099e912e4d92955e58576da31684a8c8b23125c87dfa285736c71046649e43940aa16b127923acbba05fd6ebb6eff283fa2065119ce8d32f3a7e4d5970db00f250d972fe7b15968314434e2934d260901a65fd50044577efd2ad5fc2a4d22f96a6de8200139d8e123f75abea2c0c67a53ae20b8319411883d404aafd7c337079fb82cf30d8a4caab30b2d0811c08e60eb9e8e80c02e159834e8ae1ce8dc3e7070640ce6d7a7af54e3e6c801ee38d297afa07457fa802f72f24919c9100191cd1f631245d98a10799723281c9474f791a8370849e5995da8161963e226eaa03d7cb78972f67004b4c6ee9395a3289a65428fe4d6d6e83544416c8678a97616ff92edb1e0f868a23a151e6ac0c1c640f6c245b85d294eec7605e06b4bff9a0d6d6cbf06173c894ff530d22fdcd33b7ef7a2186e86f15a50b010069a498f26b25d1886d9125467fc35a1a3c35cde3f210bd0c968e9661f8a2784c3171015e468a655864bedcb542f227aa5e3d318fb0b01cff32db44e7d59817ae07345cba3920e54cad06589b0734496533d89cad3180d445c137c86eb01d15810d1e364a8979173902c5e8d4441e0dea35b043fc4c1dc30912030a0747b054fd072905e34bdc189f464cf7fdb29ee22906808f2361f394111430e64439229816c5b9db029e47ee53148108065e7f11ebb7405403975c050c83b5a0fedcc6dd4836e8845e5c58fc26f33c68d1f6b712ca32b1610054d2818fdbf03fcb391a97d63f32b80d94f9db247d968cb47143de4c5b19bf5b75d2af4d22a694ae009c87b013d1fc7055fae0b0ce888d40bd0b4af729e5530eaa9f1c4b45baa6f5f87464978094a71c5996368d77f9525094b55d5a705756383f754fabd05dc020740500656ab8742ec80016c1ed24728747a21a23bc6ff50191216cac59927c7168fd4fc312a95f1edd456c329c522319e24eb2781244f9853c37acf1fac36007ef51333a56657892b75668e50f6f590edf58ca654cc80f4f22c3be6a8a63b8a65f318fd3b8b0ab816425be4a6c47411bde45e9b6f6f5cd824d5dafbfb40f332278d60b1b52e5ac0f3008cb86b42f64f49ee61d9c9af65d14c0f5db0f1bf7bddb0d9ad1d0f5c1ce3e40c6fd0cfcba2abbedf65ad2b4984394175f89670eba50307a66619b5970d05bd9893e18e40353b468cf344969037d564328e5c67d0f38fa299ab529c25ff2d1cfcb1658c23b664ae6fdfaaafb040f6202df0fb32397f4a1f8f7cf086ff3e2b34cf9adb3511c9a8ebf7e3a1489c4b2910552f6575fc26dd06688b4b1993003435d8148307b6f9b20b59af4809bf640b541654c881d2881611fd262f19ebd735dadcc192a191fb91fa14fb466b08173061d03536d5b0a8467f7c0cdb1a4aae302931280bc1e0448a078f6d16808c8689523185eb6e100909738b05642640d7f1e8702f98c910b4c1aa4ee52beefa1880030ebaaf4efff506590de30e82cc84a40ef460b42279780fa7254e69efce79b8513f4563ac0005c2e22a907bc13f3c71d7e3d17a9e318df33c6dd2e86122ef1d32cbd5a76c0b8c075c1cc99f663b19e32aee3c49476c52135c7673f1567232933a6e7af0a2d918c9d04e9115027a591ea78d8a3d05c63be41c275efac41e0fc91a911ec25d2329367667c2de18086a93dde1622b8880412db082b39e30ba2fc31c19d455d2b62ec61b1da4827cc2e8b8debded66bc6ffe5bf365ae28e5d2ef0c246573276b203c213822b7ac202d808d199e709d7f6a9a719d1116403c54aa32f553844dd9b1abfbb4903b5c3177abc0b16cc6fde4c41e805273ed552d751dbc483ad94dfe5c059d6c1e1db8226e337e4d3b30662c8543030e9bcf2ddaf56629482645851c142296a45536a36882c130c3445cba5c69aa205f288b8915c6b373daa15f416eac2cc24fc1c210fdb7b720a82a0b23ca6b270d5c00d6e88f3e001115d1658b3ab83b64b25e2a0ab3a9af983e47b236d61f25600fc121118b74b2ce69d7f2ce2e3716e26adb1aa153cbcc5e40a5bcb23442bc114c6a68fbd5818d3288c00ff8c9139f62c97aafdf3a9c1e347ddee8c25f0aece116ed5b8940d1df961402910bb341b134ba5f22da75196d4bf4fb2b689dd856afc28d2eec34dbf012cfb94d01420d57b92ec99d4f100251a29d14006ece33163e9a824cc007c50a1df2801316717264ca275f714bbba20aefa9c2202dac7e0f18ba43e7c8d6e132468cb306c9292155ae3c8a48c9270afe55bdece874632c17fc9d17c26fa0f86368ab1242a11b3abaebfd25ed5f4304e5dc6bd3e99c4cf4b1a2b18dccca4004d1579f2befebc1eafc856fe7d38a961c1573b9c44e81a24b853dd061130e604e935bffba1eef4b2989c7947507300d88b5140e811d087a9a9f07b53434f6bd58be6aa410b40fee3764193ef9725d2978ec4ae9548bc424322137b034303358bfaedc861350fcd8793c9835c022b1a541a8c1f12dba0e1bf234921fb92b661501630f3a31adabd45855c7d7afb763aa51e44ce7c002e07a5c12e7ea6868bb6e1f8ae312ab4fdd572e0d9195ce788b86e68d44057ce3d38a8e12c119398305aca05d11a96f8688a4cbc0e0b1cdc44f30a075e6d4103a2cda5e0aa9657466cd1e6d143c9cf7cd05184fe97191645fe99489fc7123f6aab0c1bfa8bd04d9072f6828a32fe1febb7f608fee960739e28cb88ce38d2c5ca3beba228768c75cf25edb52afc1167e5539319fbd9e6f0b1516965529e6fa1a4bd450fad00bdaf306fc2307be97f6170ea8407c799d968982454fa01f8121b464c8c980d8db1a89933f10ee0ec8414f73ab376df5c45d74381f590baa2dd656f74297c1097ca7aee76642b29a5da53667dcfe2e220b450971c94d76786085a9cce2633ce64fd270145f55b4c28be98400671bc985b11aff83e565fb5f8f855aa0c2ea646a4b4e7f921b1d08283d1296cc7305bbcc5b729d70b71111298bce020628a769c6621f626a2d59d12e2e1423692eea8e7a2286ca7aa5bdacd30aed4ac924eb4906807dfd47e5d59c3b6b866064043835add2d6a1c624b3970a36b0bd3511be8d73c34d2085226522b8d27a3e1c53c2845aba8f08e04a6b268997abb519842e50caf363858b25d3725621ba9b71b098527709218f53bce0f1565062b8af556db06145c02daaf795c5d508859451d0a16d8b530c551496f113572504d1b146baa1ed2508002637d45c3a9c36d7105ca0f380fa64408c0d915bb29dcfc1683d8e0d1cfab310e069a21e12529116043fcdf1083c5d1a79a4d011936c64a95701b917b6f29939401ef05a905a7050fdcbdf7566a824fd0fe3f4a53b014edef23dc7b27611181dadfc303572f31dabfc32fa8868df69f9d6a64d0fe0ed420d780a0fd3958dede5b09afd1a1fd1bb03f6dc821dabfc7cfbdb70c12cee8bfe1f76aa2fd794620639058b4bf8661d2862cdc7b2ffde869a3fd77807b6f9e92d79a31da5fe7b7f75efa91ca1f687f99f7f6de4a3e55f887f68ffdf6de3cb0789068ffb287864afbc36ab4407ed1feafdbdb7bdff87903d3d2fe58c9075f008ef6276dc880c5d0fee3e5edbd79fcf07872687f1108ded2d2fe37b7f7aef15384fcbd37cfc7e90545fb7bde7bd36872b568ff1acb99c54cdbc7f68136b9c6bc28b6f3ef71a21f2d2853d880d1ee19022f4a1e1ed4d2b5275696363dca17ef04e1c51084204cb637048e366f3b28e464220e71781981ca982b76a86506ded5f925f764b812c21834b93cb748c97992630c1c72872746890ba4f007a66b635509b7d80b56c10a0663bcca9e55941752c01a98036fc9f0a72403395eafa1d654951f18f7ae90ca046ddea84c611287412c65ef0953d36bf61342c1b2a36c280f40c06114618cd7644978e56102fb035219b2a5b0a881608f5e965e943f2f38a2440c4560d4d419f54207b291d72486a193226494763efc441e160f86589ac8f8b832a0b89f9288016265bd713bb97232878c909266e9f5b444f150c274625e1c2821503abcf18492f3035482630aed270ab394bcf0f443cb8e1078e50c161e99302509e128e5a5dce71b326864624f3cafb6bce1f2838c9bec0107a1f76cc88085379276d89d21900d8c37a4aa4c0f590f8a172e6588943f281780287ce0f48afd864a6e9c49ac34c1793fad709e19988263545336951e16f1a707f5e5d72b73f5e2190a55e0f5b6821e7e339ef01863d4937282638513c8cc1b3e9d475e289306bfb6d06948cf49aa4c1b72c3f00eb52cb9e2f4a20c9cf1ea8a93ab293265ba5e0e0c42f6c8943c200ea42baaa61866923640c0bb5034604666f8d1a3e16704eb2764a8e40513b2d9c02a2cc07ec0295c8052de9891ca0efcb0e278f9524215be27085f908c60f160a15049955e131b34e400784fc22c262ebdac2054594c522d90e4a6c2059be2f10636f67c432e4f6f4e2e5034b82839cdc8c11728b4bc32c02d4f32b0456a4b062cc4f6dd1e124c88d555042b78f2781c180e95a87022e90282c553d8d5f322a7ab08c9b3c568c111e4f5d3c2e3d26243cbe92513c2f013081e7ed9505f765293ebeefe53f4bc3731ff5939dde0591d8161757671a844668faea3ae41aef63f71b5d75b2b0e22961c4572144324fdba6e9e555b6b10975f5a5a729b16ae165c5c3648c615af15af05024105909477771f81a448f15af1da1732b00231505515104b7ca1a19fee05b40483a1c4a55f404abfe192c262b6455aba1f30b64606d4a403040231b0d7ebf5a880b6c87dd77b32321735b2c01108fceff57ad87bdef39ef77abdb7382035b2790a636ce3924defb171a2a11379cf16615c81ffb359ce40ca5581bec403236fc058d8236306081088814fb2e9bd9bf730ce7936ebd19e7d3918dd8490bb54f6e061a29949955df93206cd1838636610778d51c35f39f00f91e9d504553d5cc5d450210c55d641dd51ba3e2c105a0a114f878a4dd1122383868c9bcac1036a77c87a5c22f4e55471938aa78858eeeb8ad2315e711ab20d25636c48eaf9515f4ab214aee2c1124934640bd5cc1b33726032280faf622064919793f8d4b5a9e97f254135a538fab966ce74cd9c35a02996093c5d6b94daa82e2b082b67ed0f6b14fd8d8a99ad953ccb2f2db8b85ab4b045287e22062d6c118a5f946c52ae9e29849f6cc1c5c57529ae3ea50e348724ed148c499c4236e90f032e9dc5d56ff1ea70c6de94d40644464a05b2e2b3d92c848d592ea7c33f2a9bcbe5e4e466b768bc169801258d5b70232690428e638ad96c069ce5aee9800348176389c9456034c5e62405100804be4ca4d05428975c2e6725b770215aaf5ebd8a33b730de0369826ed471e4dd186d4cb25979d66d612c10951b250689a9bab19e1fdb380629c966e58d3cdeff28e4555ec2454c441a19b24041f5bf37df63ff8fc791576f8cb60bc42c705c7d36fe4e834e85981c5fdb478b065cb76f11e3aa21905e4e81df2e48718117e0cf974dccec504e1cadfd6bc5bf13a843416072489597fdf66a11256c618bea2f2af8aad5281bd4413629578deaf90a2f7a7d8b9ce3aabbbbbf5e4820541a5c2d5e2d6870094b38ae3ed50aa17dd7723a5c398dee2ccd8504708650ed2a30667d00b3b33417164c1cae7357819d1876d40940c2ea849f0d2e22f8764ef359b3bb4a5b565b3ba70dfddc87930cc29dd33e9cf11181ab29b8731a081fbbf2fa54bd8831dc390dc40b57402454a0342e8ab91112fc8bffe28786a86c972b8ae21808e84451cc8d90e05f7c20e10f25cd4631e6b8fa42a2a833127dd9d46573e8e659f0892a48e689344a0a1b48c260050452507dc10e067e5e6e8e4c36e9afc0601447f46a93dfa8b0fa447065fab6f662f7759e65d062852de22086521a26564e2aab293b08903421a9c2258997a57a763511d3044beaa7cd5c958ad2b5ca7c5294bf00ba2b6b0c00ea25b13267575e5a497b8b1b9d04355da3a9551336badca1369fae14da3ea579fd116b724e37eefb1e7272327d4aa3333d9e70dc991c2bbf52f56688418e0959bc2c0ef610216a4e787a92829606421c68988c1952c469672405dc5d33aae6acb0bb37f62c725aa4c5682376e1e2c805b12f6b2eca8fd55cc49eda0a0c7b29f4f8246d022eb49f9a8ab4dda5bb9246772c72dac72ee528524a8516e19a585513a93c8bb65fd65875f7c7b558ed9d6814fd2997c5d9df18298b3c91ea29db6d974cd1a7459fdfec578954242956894091ca6fd64f9a3fd13c6ac916b9d0e2ecdba525ed425b14b35f6b4253f48954f6455f157de270842a6d48d85a6b6d481f9eb869adb5f6c3930f4fa87d5aa9a94253bfd177aa2a003741c10afabbf427e45a21f4d9637cd3263ec837a6d7c9727ef3cf5dfa1f9ef2cce23e3c399100ae57ab43656e25d73751fdf6287b66558231d9ccd9b3adb54ed99fb5c272e492cdac691a5c5d41ad0aa564d33e697ffb64a33096ae6f7f8e645fe248defcd393670e9c12e1247b64d54d9e6ad5d48a4997f6d1d4aac90e2dd3d4aa49d22d03b4c476157442920d4e08251b0a406b68c4c6985336e930b64464de3ba494d25b9d01088a0d42729388404c632ee84836e9702983e1f0ffc7a7c3a516799801988c62a8c4638d6306181883a8b2498777a84a182c213211a34d3aac551b7817ac8398a0aadcf6e56c5145da59b28a5c129bcb91b92029d9ac3bd7e47b22b3c5d51bb443b4b1300685f918495a13a42d856cd65d7d3bb849d2da2015b259779513999f5391dbcad972b7dc8cc98403c9b85634a15b31ea743a8b037292cdca8b72a01f16284ece51dd2731e8cc1822060c33ebf02c07bc193de199369b0eeb30490e5111fe3a0214697fd3c866236d3c320b9d4e87a5a882009b9eb2b0c312a022b62f3617d0fcb0f59aaaa04040169d4ef782cee7f3f946b10611b13a9d0fa8f3d7555f9096bcc2893c676b93736d6ea891155f8c36137c694861acb045c3205ba428beaf92b0351a006a919cc5ec4236abefa6bbe9743a9d1ec5153a8d7b1ea8663b3edc7bd3f859ba53da5ff3f6de22dc1ee595f63721dc7b93f000134f19ed7f0026596b06ed6f0010e715d9991adabf0020f2991edabf04889dcf20d1fe243ef4f6de3cf24c14ed6ff481b7f79e3183bdd2fe137cd87befa49f2d82d1febad8b9f79e11e37546fb17f5f6de4835701bed4f04428ed79938da9f00483ff0d6fe43c3bd770c26110d92f69740e9852604ed1f01feedbd7b407940d343fb8f28e1ca4394f6cfe1bdf7c601420d1a2fda1f0272b8f716018d1aed3f00113a90a1e9d2fe2248e0de5b87d24e1a25ed2f44fe7cdc21da5f00402c94f60f006fef9d43484945fbe3c85304a3fd6fc3bd370e28991aed1f42b8f7de3125966606ed1f04dc7be3d022cba1fd817e7b6f1b61ca22dadf76eebd97645b4eb43f00c6dededb0699b7ba68ff9a08e440bbc2bdf78c1d76cb8df67f71efbd47f0e921db9a41fb83387d88a8b9a1fd3fdce1dedb06e96401ed1f3cf78a09dabe86125924d9a387b4f9a39d66d1a690f621ed706eda1f671f5656ce68fff7bfedd04ea5a52b81a54a931225b254f1f1a3fd75ba74d1fe14c880518964774a0a6234cdb7d803b19a74c966441f9c640738512daf91a8ab550a2168fbf735672a4d90f6c7b2230f03844752e0940e6d7f6ca345a3c78b7d35a4cacecc9a02311f7c09430648091eec804455a3b0b82a32057910951ea8e41dcee974a50283587b585078f5e27a7a28ceda92a5285b901db0821a517debf1923d56eb31aa968a0f6d238093cdd8ece7a768196977db96d5142c4dada64c69b36ca3eb0b696a35654997435d9f924fb53ffeab7dbc5601dd129648b0e02c052d2a91a8508c527c52a79ff31a7ec2517eab1a1af002872e479490cd07cce940db9a08c36fb02e245d1fd6b54b18664cfb694f1159d9fedfebf4e886c0c18b22683e301323ce8b273cbe3920085ba8016cf2a28954e294f813e6ffc182b6083b515c7d264229bafe155d3f688be80e36c42715a1e6efd3df1c2e5fe9f3a2ba42794a95544e749d885a493975ed95befab3fae9287de5ef87a44d9b364b9fae2550d7606c6796c2241fefc411b5e3c7838a04600fcf12c2d87222538ca2eb57f28dae5f71129d441ca2ab94ae5543daac3d315a6c74155247e4fcf95f5cb08dcfa0ae4fbe7122920b6f928be422b9f0c648984772e15eed559f18256722f78b7d49fd668ea7aecfc11825fe4e2a2dc27022535c1291449e88242221d922bae32df590c4338b49f6b25a0a8bab7f624ba63bd9e3ea9fb8ca7447b57674573240f665cd2745f9b1a73b2a4b21abf9f870176c934d0f96b41e4e647a4f63f7cdf259f159b1f056e9ce7746d11d3e2d8e467e11585f0cd6177f221509196c30e4418dfc25e03ffff9b470b1831a498005d5d277e853370c2ded34aaa5370ea424a40e4c2ac828623542181f6d3365c20e14ba92dc8cc0c3e1494ee45397fcd6039fba3efe612a7ce2a83ae7a81cd2a894d466ee08357d4c8bc6a76f69d158b339cedf6bd47166a96b38cfa22ccedbe4fc75feef7f73ab21846cbe6bf72711cce66b775153ab9f94ae349ac7e45bc33bde55963b571cc991c4f505bbe9d89ff5cc7eea910623d96b668cea6a98379ce9f3c82a78e99d0d32727d9bdfbea623f7e8fa25070ed772e0c081c34cef68af990fd0b6f6d3f4f1d0d109ac31f0d24cc782ddfa25b6f48f761a8c4a579a90f60faf20f65b4ee8c4a831298469a690759d4a451d73038da9881f584c56653219a5c5e82fa6718580c74df62f77e80efdaa2950d3ffa0233cf1d215fbebc850786d67279739c3f22be39c7326f328e69c6fb6d96ba621744c17baee3829a9cd04a1a14626819581ba3e882a27f2dfd1da11faadbe861a8e63b310300d9689a14b963870ce1914d8c308171c0f9c902cf1a9c0eafa36a12dcae64e94a66fde7a3a50c93f7e3b9acd4218eafa79d7cf48f577863b5c20809709b726db8a5b93fd5f0fd340a70058d4e8135dc0fc748d7da569705ffc186df6f33721dda569b001d60d5008ec6f307340db1359a84cb64fb549a962af75b94a4ae5065495aa315fbe3ce5d042c6469b1a6d787041204a4906902431608da0c30988921635335c80024157ae6f72a029c63953590827c756d644999993e66a878821563ad0c1a54386374242f60a78c48d911a32b074b0b34d52b83021c2258560174dada254d13f5a5190e85c0439f21771e012ec12634b0b46e6ececa3b0451e94a0c0c3498f194e44d8d9cfe9acbdb261a006c92605b6d039911502732324f87fa0303fa483813484c28214d73114d0194fc2a04918ac71bc84e3a8f3ac41b29e2d640c5894787b9e273e4f9a816cd6f357a292b07f833220aa708e18670d1b28a64bf99caaa223e9400d5b10fb3b2b49fea45039cf334b3e8ba877e9d91b0fe181b5e77992e7795518c9663dcf602561cfd3da603048aa50a1a22b5b69aa246cf04f50a33bb3c11aace7505451269bf50c06adb5d68e4f3298801be18ad70aa02c21e68a8a0aee5e8562425ecb4b78dc644ab3d686251b96a4902a2bb62c62340dae663113476cde177ebd2a979262a0c9bf34d3f4a73473265ab187c58c668edad699a6a6751fbf74a7347324477202554b20a66f8d454cd32f459a396affd8ce67517654c26222ed25ba1d6547f4d24c310176ce9c39732ecdb4da3e7db9689d46cb1c94d2d8c56585e14b29bdf75a6badecc8dedacb5a6badb5d65af1cd7befcd626c1c631bdc7befa52666113bb2f68ab466624023932ba5b1983db597b4d85a6b2dc6b0d8b5a5861dd55ef255fa2d21ea74300d1b45511c45da03681ac7c6a15c2e2613b578b3fd31024f5a517c98ec48b4a285c910606b42177693e98c5527866cfb135e6747ac3a42418b30ae2ee49fd9ce85f5e49cadb6e3dbd11ed9d2c6448c6d51bd5f29a0ed5704bc7874641601b7763f9cb02156c25eb1aba34429a54fa74ae874306dadb5f69a1d2ceda52ba574c443b9dc283bb2d73eb516dc7a65155020347523f1a8d326dbfef14bbc927f66b317ecf69c305ac63035a2d8625dedd31aa359b453404fd0a2f1c7da058e737a857581dffc77b66459097bc9623a948ab83f9401215f15dbd1dd654f824c624e412713b24c53ab60903719a6a95590870e2a957e31c5487eb2a7bca3a95570ef9c35b5ca1aeafacbda7ad17e66f8528a73d694366737f06c0797246cdca0eb9718c7b2dfa262d8278431692089ec575692cfd8b485b3764c2c322471ee859d1bcb18e72223ce95850df6c8697154e31731cee5ac94073c9631ce46b89a76939967395b319387ea3fa44b92cbe97c417c4d99ee9d5b7d59f25a4501112c5a35f8678dbff0481246b3392ec730ce3371a8cdd780422571ce7195625abda4897971c9334dad9068bda0f24f954bb20625659bac0188ce171d302739a6a915121ab033b9d4d40ac92e5f640734b53aa2464642c69a5a1d2103b3927534b53ad2a55c218f9a5a1db15280972d8ba34723a6fd388e062697c8e92ac5f96a6ae5858427da6b7fd37e7d4b9b39cda45a784f7a03d7978aa034d35f9a525a969ad2aba909bfd6ddafae40e5c0ba83299f4645d0bf978e75a494524a298de26447feb766dabfd6ba15afbbbbbbfbbb534ae9edc8ad3b1d62707777923e6c48ad6eb75e3e1ad5af4e8dc497860eb8111368fab4fb2bf09d89e31d494d4d0d1dbe6e5b447762cdac48b756a3465e95eaa6d5035ab462f6371c35aa59045c6968b7c0d62cc8dd6e2674167895b04a58818eb6808af0bf3565fbf4671da8517d5a3715a1f5ad31614c65334b23f587a75cc9baebdedf8b9570f35c1da8eb38739c3f35bd27ba4b69f71e565e6c68774fd2fe42b9ba658b7611c9ddcac049bb8e5f1f617810df0bede211fd125384f4a766e572129ab463e00516909498796ada45c0c3e20306942716c8ec68ddda679c3eccc8585242981d8ba82c2f435460018ad3ae08960c17e8ea9d7161e766a070c8b072648d93124c9b3d553f4e1af630d8e72e6134ec674434ec1f0b060d7b98ec0876231100ffb1ea02026d2867fb81c16ab31eb3a81f15f017741c9728faf5af276547afa21286e16f877f941de14c8ac144bff5f85776345e710b93163125baedbd5f0cf7def994e3ead73443da7ec50280cae6ac4d3667ba026570f08dd15c6b350e46f8c591a10483052a491a58c0e9cc1718a08041438d6485a0e109357220136dff037e1e45d4dce882a4035f12191f5c002a8b13949458444b931af4811a5087b6ff8347587af7e1c9d21618e30a89b6ef2183d923d40e5dc268fb330e84643df5aeb09041a326c8294c093ae2400d838844b4b0b9f1821a3950bd6891a1ed73901dd999b64596964069a2c28e25bc5d9e328149ea088e33399676f60227825998b6d6dab73e6db150f0a1adb5d65adb80ecc8deef0172df3201a5445557b668bf82858792262c51b28890454bfbe774255855b9d16e558502b3549801a3120596e2a8d4ac5816a5a6648800800002e3160020200c0c06852251928459a667f40114000d4f84446e5a341b8a4381500cc3200a8218046100046210048018408c61466aa715ae42166860274ee4779e95444ace817981048c44eb003c34b65c2ea14987df35c968585d2d1af26287cfa20c0c77f8032e015dfcea9944e84707989650c9fcfd7cc5a20c6c3362180562811bb8a66a991b89d0aec011aa416c962bc4b57feb118c5ceb2c918eaeab2d3cd04830fbdd3dd528031b5c1fe67245193714eed9f1951fe63b13b99d13ceeb58fb39401aec2a1c076052c3f1cebd94bee92787185884ddf54743fb0287376db996fae4d5a8009274c23dc2691e4e4cc237de3c8a25e6fa3c970b474a3e5cf4e351e89585a9c61303ed630f6e3d3590d7591fe3e6ffd6afaabb92009124e688378f908a64c2558b37f797d9e1a6cdeb670b3e9caca2ba81b976e78acabc158d79a22bbf7e34d24e5c874c77999796782b8932f1d0ad7446f0aefa66416ab904c8b91a9399d82f805f2f8f8b5ca9ff78144e56df3660164e47a537f7224331d7cc85c7aa10b1ae7710156cf84028260f3501e01a2871e9699d569db44366e5d02f518342a9506435c5ac86ec0848549f89fb58caa609a968d8b320cf13566d5547e9694fdb1549ebc9e370f25724ae2c1dd0ab6ecbd0453cd4031483a9207f9ceb4bf1f52321403eeab3e99d090b5c42660bcf1f586913cfccce77eaaa90e26b7874344cc8074a867d565d756f7c08c74a39bf3b5157e6fa5e3ed85645f40930798d7014c79d5b011b0d79b2250560aee7fb04c223f8648b97f4ac2d7ad100429f72a942020ccb30dc043ada0aefedff8fb5f0178cc11106d54d729ec97c602d9f0b2f9fed8c57f5d48479d4cc697aa3a54414d7fa6e4a1a97ccbc5593238edd1d73a6616b282215ab2b3f61e8347109a9a0df7274c7d2df1e8e11707a5842e2cc50c5817fc074a58d4005cc953bbca52cc2acbf844c09ad6e825912ffc2a6f361e442c3eb2c2c0944ade53836dff444aaa275381cc2192538142d4ef8724b7bbec878579ea36ba8a173a5d4fa48b22667e278c84293350e9734d86fb79e2dd61fa799466fcd71e187e69e3a4f2b810231c0e321c071482f71923ab483e97ec6dc292e0540e30c2f3f95f5378d6100bab33f08cef50931e9b5e2299d76341d5f8a366a3a0f40e7e321760f108422d979174c6096cfda86dd610092cfa5b89143b1e27087b2f307d035da5c49ca504ad75305814b771432a3d77a2aad333def281c71e9e8c2db95ecbb28fd5bb4d57989e9511f80c97501e6c2674676d3b3a7112e26f3c8ba940a16c025d05465460b862d80871b6ebadf76e5c0c5dd5f4b01cb77815029ecbe0b6464365e963c87cd0ed9478ea927efa8bfd3c536babeea83daa18bb3f34169f8b76e5cef14cfde74c1a3eacc05a0c41a1729b9a4fea46e4552c97fba1505249b24de631f5d205a1ab5821716a869eedb90066026582371b7d4b8eb7a8aaba0aa2132ca5c2746057c343cf99510f46501cb151c4d9c235b0c54b7e05dd3447174b8f2b4495b000442e4196dbea78a9b247eebbe7011c125c4203b7f27d90c1265e5ef31fc8a3d08ab30ff32da82ca678a7018715b4b9ad4fb449c6a3d1cacefba5b7a3043c4ba9574a28f5bdc7fb56857466346a645a3aeeabe50c559907ed60ba7a49ecdbc48986d6f594ed9c2bee921b3778beca1e597d8f0c9ab8aa84bec143bb4927ce3fe2bf4c895401bfd11ca64b0b3af8f6d835a5574b147d3d8d82c50e143f83c6ec50a7f2ae5befbd7b4a9952503069eee9555bb465542a2007da0fddb56b2127d8c798d244377c91a6c18c0ebc26f852e1c6455095902b1fa865eccbf656e9f1d54d0d95083678cef1dfb0dbfdcd6dc5b684e67475055bf8c2cb08fbd52f2bbfa4ed9755dde45994a2101259105e1bb21c8503c1215442099d193c3c4a60eb483cadb27cbbd94366e2891a1e16f8002a5f4ed544e2027b68234e8f2a643970c02f9ae28102af000e2d1819e0571ab444622c0b1ba4037abe43554d2ac8b2e2af453cbff91cd3f9ecf261a3414b3e10fcb6f299576c5f7bebe6b9e1b22a2758da01e3a405539da03b4a361eb7870ad1e675f3ab0aeb26177cf215cd29341b27a499aa9135f76c39fde30b42603a7fa7031f059b2e75f49820f1588f056c1a97899fc8aaabdadcae52eaa30a203efccb6737b1faf4cdf9cfc3487855a54128893713c072de8133575b40f4e9c27c61ed4c55c9aef046e0d1b14ec337b689caa2a16dcb0959dc5834358cade62c114166d57f10a5edabfd1de4ed10ec0768ab16a1b5f89b0c0641e3fcc21705a8df2da8892e5cfd728cd45c7b94a9e32885c178bba64ce78b32d945bcf5475fc7485ffcbab67876773b8f4ea34a9957f4ebe791021a7d65c32a3363006300cba31033dec240377c3d4b297d1ed11c347267f9f426d0003500b4c4791b5e0add1a7b48b6e9cd5644a38b5ad2a7c66d25ac940a7ad3ae6f811e0b0e987803a01776fec5aa4ea8164a03bab470cb3ca7cde702635f81e6f993762834027a6f2afc05c1e47598514cd71b963eb1b6b5c003b62b3d3b1dd16b28891cd2dace2538b930e68d0f46750206de3c264b8ce5a44965c539b28aa1765a94b7ae83caeb648600850229f82f716947e1462f217ee01a95fa3e8e2c4b25bd12d36dc86a6e1887ca20c70c877dc1482ac46a3e3bbadb4270bb95e4a18f514b272cefbae279a342c8ec101c24474edc2c611e60f063884646c6af2547d3644ceb5286d36253bc841f9b0979be0a3d97afb389ff57034bdb5cd63686e1901f2ae84aa066902056c24d757c285995799d099b813189c5cec3b683f7117312f34888ff7dc49d6ac3a5ea3a7c84133ec1b1402ba92c0c2b820afdc70befb826ad229704c36fb49be611b67a47dee3024230a94a745e877a1a5fe04c9a15358567bc7c18e85eac95a65cdc6d1b95d2ca8d43161104a681f6810f8299f363c21e282f47084702879336b56bc6b9039b707021f9272b093624963c593463b9a28b305224b69a668053724f765c7b096ddd8553092854a39430608df7cc02144f8f38b09da62e269dfca0802b212a4de6e93f8b741abb8a74802718b66c1def49051b085872a56c8775b580fa2e78cb76cfd8e4c3e70d48c1323c3ba7abc42ffbaf519b119f4a4402499ef6d3b43f1813224c8c66c69045e2cdf7d24492bd157bfb3aa0b7ea2c5f526f9ca1466d2e0368a2479a57c3d7167ec86c6efa6d43e63c0fe6987bf2d499c093e71a6078960af280976a00479111a3cb0b65e90d3adbd52cc661c243d7ba3500dbfac6a94e5b2e51d750c8dafbe4357b433e4fe5e221133e92c1bfe9699887eb2fabc11bc99e87ad9d8f20a4b0da8b90e0e969b02992b6f5858645ba309cabc49f4ea4cb27320ed57be09ac93e8c6468a663f29c34c7a2292ba80971c03e59dc8f496c2fd6122b8cdb58cdf13ec3ad939e56706c25fd5610738b2fe75035c098c9232f92d78ff0d202c0fadca5586311d34789b764ecbae27382a0b8f9ea1d0709f53d87a3a1dee03163eceb39743f5fcdf198aebf05edfbdbc4a341bd1c0c4b06cec3bd779e280dc63254c77e6981de1ccec5f84f54e24c0c1ac213f2f0f54c55b90532f3aae671d0abec608876c2f401ce4668174deeabb9b920df7a3b00028629fda4fbfef44439d38c79abb8428b81bd9dd6833d1e21b4d82a089b1d5b7cdd373b8474408e086f7a92573e5e6a98d80a7e22692e2299c8f222d60da7b5187b3ed5396c054c269dee9523ac2e78d3330e194ce8681bf414d4d59fdbc8aed8ac05c308f25b7679c72b50c5b72cd838c2744a285e7f533cf99e16d7576ccef4145d5c0643f1c001319681925ab66274119af2dc8a3df4b64f5af26da3d7baa3ca55c876b9fc099b83369bbe2e01b15746a4391e79772a4262466cb5423cf8ccf9493308befad4fa1bf74216436c6f8fa78198b974be8c5162e213967da333b87fcab88fb73b4bb82fc32c0d94405f7bd09b2541ed9c7b857747d1e620be2f659361c4ecb390ea902c5a858a81b15f95c23adc79f9d306ac3efd76767f4500fa629b976594f1591c8aed0d52f6e1008f6ff97a5bcff738a44ba5a261ec5a370cb06ea5a8756c7f8cb05d5ae01c2e8c77ea817499abf9a49a5e87ddd1791cacf10b3599b5d767da4803c94dd183afc37450c0d88c463bdc301b157d77800487231c222d1bb45cf96b0d63ac73f92471d59063069905e9e84f3b214316b42558657ae61e309aff10966217212319e7f52434aa268fa3628f19c1eb41f9be29490291bb014421ce4ee0235e14869b78c6424ef89623561280ef0da5568935b835199292f84f98f2bbb07fd8c9833d3940e535a62d700856ef06566a10d3250d465e4fe6535e64483db851235b67d95b3cd39b4903fa543b5117cfd179f466f20db9eeb54286a015ede46a8488295e9002c425a44542b35255f812c8d539fea63fbc8ecc11c7a486a0bf14b2a763e76ed8abcd683e23996406c7527792b30d3a6055f7fe4654beaf5cccabed005fd2b565cf4bb12a768608275af34a5413be6f4c0bdd89cd1c7bb0b171858fb1b93352fb2bb0475c48004d93e44c7c6ed419d9f859f243ae4868429b52e1d1ab3bf32c3cd7ce774d6f8c7502bd578ddf51264bbd78466d48d4ed72419d205edffa4ca600b561c5b7e8d0543603bb424bdf6e0252bee49eb0e3afbff97fb3745fd83331be68a21dd0a7d66f8484ce0f96e0c9b7b2a4f0f688f459944b0cd3fd5987b9a72451cd88f9cffdba7ae00d1e5912ac8d8424cb58f99a9f44e0d42c240b6b1cd56921555f020a1a945b54e0856941e056b01e19832b2cca14bc98127168b0e96a60716426f002f8fdf8f574f548f487b0686d6aad9339d07970613c1e668f321d01db9be0572653ed7509d2524046c37ed30c280e9ed001776e8bfee0fdd39ea1795b254e85782a0226fbcac35346db736206bcf0f2734a7e775080314093dcf0a972be2638473afa8e906d3735255bb8ded3085804ecc7bdb8b45af579de3fa786f1ad3fb89b40313598a4103ef0b810e1d28e94212fd212a56d41ae96563214cdaa39fc46dd04848218925a33ac2b6eb7e342266323386ff07f518eb984ef47b1cd20c8dadb6a1b82bcb76bc1310120f006e9d057b3d6add90cb02be5b2247881f89438083b7800e35a89b56121a677a322d579c653e8e0ecb54dac192dadf33b3a32f639a71cc71dcf5f29c8565a6ab9bb01e6dc316e3405e47bb2e15a6cd9931d2ba30f1b0f9a11505a738d6ee249b272445bf8a5cacc5e06e892d69a57876e7ef36e81ee5a2860fefd39e2472a41d8d61696f35fbdc323fb3769d16812361b8863f98ad519aa78069a0736566402f0a4f60224a40fb4bccf45cb2feb876da0dd6037813fd807125a4e5a44ee41dbf4caae7e88e018c551e4e3ae55ffc2dba6c0b4f831c0d4932703f2ddf4c52ac8b800d9584aaf880fed783987b3c39226124c9870490358378207b6b1ccf559a5d8354fa1bc17291f15c82681cc9f692657ccb11e09eefe99730a8c7cd7343333160d66d206fc6c77b70591d5ddee1e4b762abc6aa323006c41bf9ae8c11755ff00e0bea0e47a14218b58e0c6edcc565285e405420e07a46801a319a9359697535849c505f6c8c03057365a0df9be43977f0a516776cb2bfbdce23db88cfe90f3adc4bbec1af119577decc341a1c84eba69b7b768807c937c6a337337170234d735a630a6fb582c6727716fc5bd561bb5c12d1de044395f33252f9edf17128e19179b5841d38e0358d69ee4c4ed811fdbf0fdb42d0b8553631cf79c324b02a8a3fee18ee477f105cb8094bfaaf1d9fa5a8a1f8f79ddf008bf507e749a1cb73efa161508a78189ab57fa1c6ba2727919b60581f9672f5c72aeebfa2d6feb93ce670f0317a95ac621f6455d33f822e46e7ab7e794239f854d1cd8e89a12e90cfc70745ee735d0b1340cc670684e7538b8927a7e3ddab21ff644216ce4d65f42c64e109daed0e6050449169c88b284415eacbd2629236ab587eb8de9372c8a2a2d27e842ee5e18264cdd95f2a89148861d7d1c1d2f0ab1df3144d4ee3c85224aad5b6d54fd8f1430026472aff452f1a64e7841d458dffe2417069361b07243877c1d1aaf05a63b42e1a5cf0d9f62d0794d8c2bc9188b9b6146c0e6c2405fe4d8b0cd5cfdbeea7924aa6323a03e33b4122b02bf4b6e8b8189a4641ca48e6d408dd0c8d5330da1a9e38483617d6f39eeb4c33bb35d2f7c890b66ecfde00ef89f159b825a1947724d462f3c2b30ac0ebabdbc2b0a22a3838f9d703f9381588c560a8f9233c4c4effab94c8279179ff974116929b48ace1ddcf62af6f7113d1fc5a4c17a68a8c5950e55e4d1941278494a901e2b1942bb97f612c6ca0aa255520691502d4d6fd2281c16b2c1bbed96243e77c2af886ef55ee7846178e5ad05d31fbff70f9797f3a1b11e1b720183a0a04316c53512248e13ac1fc47b714a20d3f222185586c634d28398b05b10ae2fceb45466d241234cac97b864a645876c65ec64b009775527d49bb842aeab26dae2efc01e925042181d8a42a5c5540f3cc0150522db3c634ea09932b3a57ca457b257c42716e725a65b38254abaa5b3aaa4021aa84ebc0c2ac70a052e2eea403189daee788c63151ade3d6b2b22947ffc731075c641746631b8c5aa151e67efd212ea0e52245ee6875249ea9cd3e389ab51e05daacbef61020ed43fbc7cc46b930418ca6c0540e6cc86b8918f9b8f4a049451cda8248c15b496c07dd752073a164dcd84629548dc7ad2f2f407502947eab038e5e96e4d3629c65f54ef1d2d73333bbd403079485140c54f8a398b5587f5c8fe55736359084f958bece9d4f69b39acd201b78d3bd4ba3a7c4891b21fa17c0e2218d8ea4ae2a20b6aa120a4fc0cd6d7a7e19722e111d450161f91776981e908413650b3b12aef19d2c2a28e439e431a6b01589acb3c67adae4ab2fc0ab7ae4eb3d508a50cbe661caf8f732242d5422f114886e9a984d1062758001e7e1c90af5d597e469d80f6fcfa02f6244930a307ea426d4108d4d9de51c4b1b622bfa48ce7c458edeb063ba27b0c2aaefb4260b9c056e9acf4d6e250e2e2cebc547558c319f32e7086591df1672545382ca48de616a94a5e8e45790d2c782b391f89b1736b09b8999d546c08d96d372205f486325084ebb1874b11e18e296b4367f73720714ec53ce0fa9332f9b788175164703e27330c9bb825d8aac7f2d6d58749fc0404f315262252792edde7f0f35beea15890fb8936d899f48be18c323bfa427ed258f4f945275495b564075da7cec0ba6959eaf9259e79eaffa632d6fa1af615892706aac4661a522592a8fad299f6f14ed33d2ff06e667901422262a960b95aa2dc6a7ccb82f7ca96f930db6c972e6881f51d78c7d8cd1f865012bd2bb7ee1a41903fdf27e723520cbab990ff8fc415dcfb3beecf80d5506b33a17523b725234cd2a259a74397d949a3dba56cb0109faec7637d4b97c7209a6afd1cf5f125aa5195646f2bc31626bc5ca936c055295d698a860bf9682f5ba396d5ff1502f347105faf9ade358ccb872cad4f22d684be007fce99a85d0bd1f5ca6063117aa63189499a6fabeeb4fc5f5a3bfcbd0a4496700c78883e638bea65a6ff24ebabf07e9f2a7d83f2f2e3e8b5d7da49703047a8b4ebb3ff5a8a21539038329e99a334cb7b141f51d66027c553288a64f0273b60a846a4ed1b1e2909f44e9cb99c1699bf18912f8ed95410d2450b40b1d27b0e429c0a3d430156c3c9aaa392468b4d2b9954744f2dada9f5303537c673016ef2ae7f6c56326d0e15136fcbb298403d5272bba78c88bd9b4aa670270b42906668630d0b01d9bbcf213530ae0850d4199c283cb506cc105a8ccc61b92b7d1fad3fee638562c83f1ff1b6ea3192dbe800fc2cc9ff325d8587b6751ba16b94eb0184f5065c3b96ba1f9002b8ed04c527ab159cdd3d1b87b1fd454d82ec26c2ecd8a9ae8f646030f9df956a1b78d5db3cd890e0f4e09e21ab1e9b57ebbb91dafa5845a142271eb43b511d903fe7b67ecc54a151a61dd2de9bd5b8467ed53e388281c730d9b66dc058ee25a2b7ce088856e5cfc72ac5d75e1815b759d31567541f9c3f8fddc125dcb17c3163634077cdf4f71ce6ef2867b22bf10332c36f295386f6e26884781c4a7bc6d6d2c5ed3eb620440fe7b67ecfaa13b2408895c7c334533ab7a447773d166a1c99c9ec40623a65a4998e3a48ce200d7575d659d82897d2e48a60a846046fe740173b770f08f7841fc620768972f406b65ad7e603859c87a1e60a937223c4874ed7001e84a425c34e3d8fddc6acc8deb45a2a00098e3dad513bf7d9e662d629e60ed67a77f386c79d8bc3ddc380cb897ad7d21ba450bdca09cebef13187f75550e05ac9dfa6dd76c6211302cbfee120aef35de015edf260ad57f383f160f58fd03ca40b1cd4351edbad581377ac5e7ba5ce512a96a3d6b7335d1a494a16ca4c0f9480dc787be0d6f75e58b2a5bac2121dc80160f5b37689787b6772ec1e0e3568db240ef68a3e5a571d28e1ca41f86bed04177640a05225176a54054f0d7fd0ae98d4d2c7dbb0424e9c3e18c2caf11ef038735a545290b44ac62b8680a6e0caae5c43b4b0ae414e85a132468b7e042fa045c8fa464cfbb4e3faad21e332d8c98514f72083f903815d1b42fc33d06dc1441dae060e4ae3665f0f2e4beb22fbb317559ce842a08f57d76fe747fcf645cdfa78e2ac2533d2b54764310de202cbb92e3e7dad77e000157411c4310b6500b78b25384c9fc5a48a17f132303b1d3b07dd91a234cdb81fc17ef856207e31f60eb42980069aa71ab6c50c19a160e74bc47fe877f191a2076f1128eecac9d3f44318bf7d2232edfe5c2d02e1596e49fd1e9d29dbbee5158ea8d5cdab5cd026a0b7bd82170927821e646195ce5384e83b01cece3b2c0876619ad20303d090fe2ed53876758c088d32ea8bb5b8c33bbb54681b4ec53e9100a1a3df8d08984db4afdbd17e6713b3878dfe8918e8270f40fe067bcce7e12f68966b201570525219ab70b5e9157651afc753d53028b91d62d261346a45106b9a4215fa45ef32730b307b8cac91c48fd95086f3b533f43d6f7830737a7290569dd6d7dd2c073f242b186b803d5bd48b18a5c8dff54fbd7734c70a5c9864385af09b5d7e7149b2706dc0c0ccc1665bbb33eefdf0de23afc6103f370f07a602c62154c97930d32b81c27eb87e6a96d566308912f4dd859d1fa9c3a66d30cb64a60adbde0378cd9f4840125e086925b2cc867feafbc15cd5c9c8fa99277f297697eae96c1cb15787980a0128b09f144b51ac123bba9ddc43b9179c192fe9162082cf90f8e5d0c61a01304eb32d6734b496899b92ecf25a6dc3e09bc455b6bcb339727ff0248414fec716ed131197f21053dbba67c3a13cf37c15ac203d3ec4157a6cb4413bdbc14c6ac0045ce872a7ec85017f821a397c0ae048c85899c580e47f0689e9b7020adfeb9ed11501503798114bb6a5c24749de4d401078fd0efa95612c8f1d3e2655b11c85740d013b18b6a0b996cdfa358897e1e01ccffa7a962e1b435597ba295b6758540baa3094fbcacb3e99e298b69b4db09a3a8fed96d3d57551067505091b3a05fbd5f125ba8359b69585caca311f7a3fba965b058a992b283ff0d3ab01a0cd03745a35389576abb3d159dc2a80faca467d0dcd7f30dec976053a933117ccd63c903e33a786d1653985bf051371f27991b21789c0a85af0f5d6478a2bf46c7e415df96eac6fb807e782d8a8327d90227361660cd188c0407537ed6ab58748ebe9f0483fbed85a6f958b6dce90de6f3e60583db2b0b86ead388d60019824ce25df2854338049040cf05687535a9a1cc36c469aa8e821351873134ab9b20ae83d981c1190e4f9ef90db64e24ece6ed67ffb984cd0651d31b3fa112e2f750aa3c838c82ac007efdeea33b670b4a13180328b0f471fa3f2b242b4a1186a9547716a3a5a5e106db4083cd12b21eabdff4d5f999f4d23db5c3b810f3edb266cf1a17861c2acf501adbce86f7c3fc26d5881dbb3f9ec1be60994f4d01b8ba80d1ad635c495c459b2ff2fc2f72b0399cb4bfb1b63c11960d651fb18aa63f58c57ab9463de7ad3dffa6ae513e131221ec1160f1783c86d5410307428ca86bf782ef146f2b285b24dff6500d8cae21e0dd766cc75f75f681222cbfb2189e8181bb2197e437c748277867b1a65cad31d9f1d99cfdeccf80a25e151479cc871d6ed92518b09cdb2f8f8e02bccc78458ff2cd0f86a98643d712130cdf624fb5f7835a6ca1f7b9cab1683dddca52bde5011ca86415e68dea6974ac184c43f36fd30cb4e2afbcde304eaa763c3e3f66adf2132febf411e8589d147604ac1d6de186f89ba3d052b528b3aff0adf456d960e5ed53afed50ed4b78db819ce1cfbe901ad6b92d82d2de5f7570456f5b74c5430ddfa375e6031120d8d90acd46b8403538e4628e8e40fef3c09ccddb1cedf4dd51eccd801605aaeb2a95a0397eb4dd010194632d1a407a4d4f48da72a1ee4f742a1112e8149302d5dc25135b7de61d5a5a7fd94e01f1fcf3de7b05ae1ddf680b2a84175e85074b8e4592eb9ef5ba1d08d4c30fe829f1f3b57a1a5937a3c4c044174e7ee0b35d80364c62c80259553c59eca01943a1c95088b8c020b4050e03738ef6e1f07abdafa399b78d4e667e64cb6eeb664967c179fb7f12590d93df68603525367a032df5838244c9eabe1f6aa9141d2ca8e3d7512f676e4b2dc539fc8b30b59f3d700695852b9ecda7049a13b52631eaeed6ea3c46f32cab211a2e641841611fe4f9a7d38c893fa9796349031e7c4393add761d17140f28346446938c5ae192ff88aff41e5573ba483f08eca489878c3650b229e87e99cc0d507d464c2d643941dc66b54d0320eca183b3bf817b2dcb6f1ec59ad57c22556a016c532d74e5c155ec3f0c7b5e7b3c15005eb11303083971b9b5893314ea0287964984f472bf4cb59e4c21afaa93a93b1e78f01105f5662af4b09068bfa091ed270abe1afa9d6d34b5be710d3f4665d188572eb608dc613b6b28f3019581b8887268228043d887b13c837526db592af27ed081bbbc8a6a63acf1a47e7fe6b3129e871927fb040c737c8ff1cbe33d555b577f629bbd3d781daf5076922407ea9df8d3f3acc6cf0c5a239f8a2ff8208bb760a74ca266be7dcad2d1e839511f4b2c88c37ce095ccedbcc29c89933e72c7b7843158d67f303e4f47ae898c7ae5a752d0f3881c73a018ea2ef7005b92114e2ffa4a7485d53e5b5f72d082ba242cd16572090ee362678f684844c51226d2a916508018d6d6f9f3e79120d5c01a5efd61015511c316372fbad9cf3bd1221016f79855ef16135811254a050a3c75bba06de03e977d0a48d282d775e764c2580e24f2c5867fad5958a8fae50e9177adfcc83f7c7473ffc82c4d98a368b448b9372d3c99f15cfbee5c1070aabda1c38566939bffe1931e280c568133ca1a4ef35924c5cbec858e43e7ae3000bcafb9e195582927b604cbbe22b0be8e35cd53019395dd1117f1466bdb73692233c1b55cc548a4ef184b040c7d8b9e316d6230165ee1b4bd590b5fd3705914b23547059ffe0812d9e3f079cbc97f92a5f6d2c52de9709c56aaf50b4cd4aa8e47403c3b64e58c4dac2a61d1ecf2ff0b0ed6b18751b95d78c68aef9c8f46b24c317f3e255f7be39ec44df7da2b16c87b602528f16bcc546e10c58a39585f9711fd48fb6f4668fd32a9e2ab139b499e6d581759e5b5c2a5dcb4a3d917db558d95754c2e2d75382b03c8ae7361bb2ee8b58e7b727c87a4fba89a39e34e8b5c6db20f574503df4c249efe358693541461837807481fd1811095e1b40bf3243051910ea84f7bbc93293545b0869868a9c5c406a8dfcc8b73ed94e507da837ba4b48beab19218dd04cdf03d0a3f7bc2c9a2bfdb18ce54a91f05781c0133a97acbec61b40b6760bcdafd32533d4846c56a25650137c370e5c37071cea03e766b4e2e386c85d3453d2b70dbfd9c0f1b465b604da3e22735d4fcb5ee814988165499c852bbaf6ff02c8690fcd2de0858c7092d25939e656e789650ffa4e431fbccb08ef25d532422c2d991b360adc5ce332f809dda253d9b9d860fe524c284795fd117f3f0c48964a7235e72a47fb912f8c553c22c39853822d0b81592f10f26816e24330ee8884a2ad8290401e164420a902952a0e52a70ad64926eca3abb8b15f22bd1a4f26d6128929d56644df4a82783e1f79fcda24aec40d1c6b04cfa4a0733b5fe6a4828c2db3d4847b513c5a281f138a3f8841dbb9ae9538193d44e82f01806937f0fa07e0a4cc47dc1110b8554a88f3cdb8ec289dd21ff1305fddb4ce06c662853ce8c602912f2b9e4f1691a53a3adce5f4b6807a8b9c2b60dfe97034f67b312f788f6550865194ed88649fee3f94f62a1ef79080a58236c6eb8be2b4b95ea6a067c2e3fbe4339f91bb0d6c5fb70962ba346791f902c4e072bf4196476cb4e261fd1477bcfd9b3ea69f468e057f518f5b7d4a720a9da96eebc32095dfeb093b545c78bc2750e8a2e484f473324ffa50cdcf6bb6c6f60281df3d07ab2444f1a6585ebae15e7411de4f11403f12f549ca21682c770eca8a5373c2f9f32d9b428d1e5864a084a6cdea6152100a19c165e6faef480f8381ec52095973cfce749ba7015ee0b311250e90321de5010dc1709218c9d1d9899a9794573f9da0d625933ebb7f21ef32241411b0e1b8fca231ea907bfd764bea09a24e01c3c5814af3286716933e948a2a9aa265b3394c1b5a9116bf9359b55ba5ed5640b6089de406dcef94588e3ad2a51af865406b3ac71ba7f5e18f4fd0800d937cfe974af9a71932471ccb7c717c8e75e677884f837a8084d035e837bdc01e48ad39a3da790e60ec9ef1a5697a0608d06b006a952a8a64a821dab4570058d7a193faa1cde670ba86fd66799c010e89b5abcb174cc84d84c59b289ce647be7c663498b972b05027991f0be5389b5d1d45c6eafb573c72db376a843fe920ea9436baa20a4ac2dda88214b134016e96610d9e18e4b15d6c9aaf1987bc493f74c6f1f186c6f144886e520c620344f794a5af6162cb04fe26f2b86908e943b1b46aa0c7513b0c1ddcac9c7a6c2597dd0c1f78ce7e588525eba6b961de4e019c19d6da4b2b2474c02362dff504a475ef67d30eeb6cd7c38f098195480a910911fe7714194d887b9ee508e24946b4aace8bcd904bb8ce6900a32323e3eed4cd2f84dce2606da3c5f2fcf5c57bf4b1105cf9c0a1bb753d779ab927378203bf26dd62ea2d613d986edf69ef96a6529a20032edc90b9a58d4c438dc4568ca44e6e71074bce262902ad628baf158fe5eab3767509ce784a287bcb0bdf6eb428aff88576b9dd112e3c81950f5916744d1abfc342c7d02bb5becc04a1fc947830d23f85ef28555c185c87c79248bc3550036c2e3e5ffa440d7c98a35ebe80f4613c813ad6abf7c694c7547d9ae4d7634ae0c4b95200d36d21375b44920b4f12e35ef4c00b504ebb2ecc9d5b00ddea03533031e4ff99491dcb1994f9a575d935f30efb3b280317632ca6de5962c98d6c7845329918b3ac33cd6d7c962297a7f31fc93272dd80b4747eda13c3676fae3d6f325e1fcc2878d5a6baac9cee03b18b8f8c0a602551da2e71da208c1afd62dc618669261a0f87940bdd7daafe6f24b94693743901db3a073efeb22b25c75d08567200f7f07282d0d4869b4bf163b3eb74666d33837a1cab19f30eeafdcb0be44c4ccf0f584472c68ca39c01c3c6174fdf55031973862c8c31ee68e55172fae07838e6511891672266e360b3411c3a27f57be164bc885ef47be21f004fac83f064d0302b7cccf6d2a3387a2c4cdf5a32aa39bd87c592a10f71616b982f343d502f7d7f96e870772bbb264c97f6422a519729838dee9b6d5d443b167580d5fc11fc2f858919e684f83d2623c2120fc6ec9d70e1e0e710720ee027ec561a58889033e5a7d5e828fc5e0281f30142044728ea0d43f0449a8904a341b84409b6edae68007b3286009bbcb084caa593698f1a168d144515fb567847ed6488291f7164f28086f7974c2192efc75244be535d261b2c845d34ad85bf4daa61d365ab47c62cca100255ce6ecca588b55b676a44a2f293a99b6d4b3c11d52d61ed081d8e840c4e50db094ca2e5c094dc89e8dc169729a14c541d9884168329b91315ae8b901c861a8a7e86109d02bf395e5d0088395cb818e66af5257481d0fee16e160ea1770720e5041a207ad05410bea7176f3f085c128fc6841ea3a8e7554cc2a7107a4d580dfe8777464825c4efa963b904136ac70dde7743e50536d05c870e583770885d60b01025b1b838ecaa9a40a001bfbafa3f0f83181c35967a629b117142b77cdc501cd321bec680219869c9d142146e8913e0c6c7014a82d8796cc212e826b4a1968858e1f48a472048ae33c912d0f8b5ee1326228b82a17c20d362b7fdc8171162e5991507a2a7d525e995eb0356d2f341d81579a8e65cc178113a168f71de84c184088fcf11e8c4361b0243930ec5798c6a08fbccf9f40f41e45a185d1e79cd650e3c8b15f2e644fd2d030c289afeb3e0df25cba6970596df930e5f1f7ef2a8d6b6a4f4d92a1cfc58bf623ff556ed3793ea9dd7b5224ffe325b3db9ffca9fd601de0a73ca296aa0a21c5faba3eca2e0339f84b3dbb1b5040e797bfd380d572834c1a17c6440a09eae7a5dff68fb58432c1bbf64eb77bd6c26d6a07e1019d6847c0d64b40aa208444c61a5fbc1bc2f821f8b9c21f993fe2d9af2ca5620a299b3ca19db37dff24b7980848ac893ecead9725fdb0bbf172bc422cd17e007b0c10591bf5875ce643deea1740d2d9b9e6c0c02d500eed37f4261c837d256c184d2ee3eeefc51b00a03137f41d4924d63671089b30668f6b38e7e650eb0d981986c011621ee1df1d308d6b1961e2d8b29050060a6059f0f7f70a90ef957699ef1d6ff0f62d85613820d32d7b4953eeea80b1f4b683d52e413e1a943c44b14b10c1c2fcc4229eb3fbe8d7541be1b82782cb90e29d5216f5aabfaa6c543a0b6c2b2b6ebc4e0b8451c93e88d27966c235890ab1f9ac7eafb8ba401d47daf84898bfd933ce464df9008c9ac958dfe6c5c8909b0c971f5cbf4a7d7533d941c5ac4a093b6b4772b64f5213040d27cb920ecab429b3c01ba0f2730a009b92f645102d2f77cf9614c8b64f963168ac4dfd4e0a7dcc15efff0c809fea3afd26db9b1c802d6fd310671f34b0ec53d2c98f74f04732dea6269c5da668ec8a8687c855c093f3f456da8b688e818ea54de15532746d7f164d48d7486b577ef7bafd6407f00ef81f5e91044c468965ee229a420f386dd20138b750decf30c380d2b4497bcc00a37611f4b7fd1253443e0eb4822835e314b1611b6345a83c87a1dda33eabe610fd410ed1f0833f82186783946f52a51c04143e3752ccc89524d2ef54205dae3844fc186fb70416004d44548fdc30fa5f5fe2068a0b7b071059694ce55b3b5b40f8a0491423d6caa4b61f11f8df1536a18e35b8398c5b21e5a8cefdab1006b6c8a71ab52b4882e16f68b40815c0156131a22ed5e18d139c8d48834b4d49712a266838e2b3e63f12ee0d84763ce7ed089f07cbcfb296b9c8695d127ef961654f10f657e5952cd5913480103fed0b9db22f5f4a4b4c804fe8e91b1234f17da04e404a2b8a105f12ef797fab464645e405645b059ba037fcb681d967ad77f1496bf0322e12ec0778828cf9839a22da199fae7480477fee5999e21d51ef702057f54d4609a9633a48b9770deebbc96dd0710e435611f879c0c16004b0cf42d4826f11ca2d93fea1868791034477da03458ffa8657d0d22511029a9c326f4f718d5dec11bc1e2ec33ac50daef0fa2600ecbd7ef029283114dc887f70e22f087cf171b06e20c02a950a71b447c4bfae308ecdb0887790a12b648e2a511e40a6e35f1bee01f2239f7b4fcb317cf6a6d1296ead83ee28f22e0609fee5812d60982908af8804c5c4484e4c37e9a622d70986fc9ce88ff216674612ac742c34966a9a6ae338caf16a0d649e7c450f3748fcbfdeb130544a11f7ca14f4f489e1638b4095da1af7323dabaa4acec01dc2d0b6b58841c375b2d3033b54f1a4475a2a5ed0b4f1bd649d08b36e50d9d33fddd6077771742a4eb0dd8de3109aa8c55ad18a440740500bc8710862c2f3944926b7d92c3b9ad64ffc8014f18b24dcec09b17c301ff5a3c29bed9ff134c03a987621a84044e239a47e110f257f606303c2c2e80d60f9b186f49359ea1a63b97d60d059ee213e260beab1e25320c992aa7934927583974bdf3654b8ae9c55a6f8262e420aef532476dfdd467c10963c0dfa23d8424c0e565610b45f0045b4b3c4f48541a49aa59290aac4a9d5d2fc7c1ae39b52061235e36106e8d0dded8d37100f2db74e545cef0fa8be4a4ff13a58478b06ad1dd45605dcf45eab75b24270c9ef52b8875be96df51bb04a22ca46ba1a8400bd924aee9b851b3f85b823e514ae3c45e03269e27f132ce3ce83b851f0e83c4b53b6c2666de724f72331f086d77963370af72d531da93c4be12fe99354c379abd3078984c67f707732ebc2aa68f1d6e6617d678c43b4cfc2bedd307f246d566c31353fa5b912549a4564eee33db28ba8a6054207bc8aa7a113849002ecbb548252da0f2faa42fcfca67d4d01e6ebbb350a911eba76faf3ddf0590d4e38ad1a230a63c1812aa4a5a125bc40c1174249889644164fecd80306b33283d1dc04e4a618e0a631fed6ce1502ddcf5faa0c4c20bd612549e51c1c2c66a4c95a9268adf49be2cd0492a388a9ccf5690d3c98db2ae826021ca2c9529448a5b1cfe14bee60104489d8678d58d193209f9fd5e7f5c3e22d07c943b4c2c4ae4e5af415e7b1f0ac6c4201c98d2accb74b1323c6dc7502e89e1045ac138ee8b27d581f08e9250421a2af169e7eeb15e632d9554717d2f95be0bbf73c9628f6004d86bd092c29605e0e37a50df3951d71e12a880792e0851b0ecfc1ec8a2fab61dbea2e0a9a7009c218f1348b44f175aad059cfdfb9ae3926660c53574d9eb04fd37c73a0c8524d418244512c34a0d615052342cc1e5104295261ef5994287ccdc204322d569ea3284a44e218664a897a7840a4350256ba0ae1916ea10f1302c01244c1406951a8241a187622c17cf840a335d250e232e83803a9a78302c13da4533f193462bbe3f58de0e6a881e023fa8e4d00e0b359c380d0b50510d157288c38518caa05287108721a01a8999be84f2808571801ee5700527ff0a23a01289455092444ab0af160296a7345f21441e0664009250c5a05fa8431894cb99c9a5969f51b99f515fa82118ebe519a437bb8e02a42480dcf17c5088a11c16d230711b10438464b82affd7c190c4e2b32a06e5d0513cfa81d6bcbcffad5c3edb27dc322092ffe915251b895661b3d37c9dc3efa2e6e4f609bf6cca928539784450d9afc369150df28ec0a7921d502416b71cbe47868c407b7faa47af499f4965a6aeb31678ca26a3f46ea4450896a72fef7ba5d0c86999b267737eafc49fa071b4adb3fd5557fd9657a62193553f73cb1b964225bcc2c4ae8dc56f034dc544253df9429adef0503575e2e795a19649f83269b5fa68df8e73fe166329e601298c705a8d83f12440f638bea04a77e4800f9a8f48ecc0815d8ceb5080c8808c3e7c1d7a322e03fd6ed0441b2c3f334587012651046b166c50e7e6f56b0a35748113ceaaec74aaeb7b14e5c133fcb5679151db54c1101b3afdb2260b2a55ff51abc6b5e6a813547aedac4f9664968f65618ff8c68271983186428c3844a416a69d34de5195e3cc35eba2d17661d7cced09570a5352bcce53a7cabe0245ecf11bd3a37f22f49219bf791ee11b78faa6939e802b17274dd85c4b9a6b3e2d07e5654c2200b5d300865f280dcbe491321ee064f3feca2f725dcbeb74b7ae50437453bdb49bf4a339d32ff665c46e1364a9bdd9c9754f8d6611e8db2c16f514ef98584e1ad1a1fa87e49f69f003b340dd6ab0c84f299e1b048202e21e1ade540a45908aa363ac4258d1e200ed3ddbd1fc95bde33be8eeeab544aaf3c5632ee46a018b244bed3c35a4528ab1771850b4e81dbd62481d3d94ccc62facd40e3051e1944c93c1091463d944d03876ce20dd7db66f2e5328e4d25b6d5226e45ebbfcdb4eb33a34221350ba5ca0a75eaf19dfee90dc40117eff6bd12109049a5e0887d8f801123bf6d1242f4d08b506e79f0eadbe07d7afac4e7cde57d035c0f1cdc364e166208bdbc5963986448857e72749437d82fb30da8ff695aef2010dd2e5f0437800320b92c5d8daeec75a4ac4cee2b8d80f0f8f27f7a42dec0aafc08a73cdbaa403b2e5d6c9373a635c011b41866da4b24c7b938250b996dff34c3a5ef4636328d421ff2f676e9547b88164b465d129a646cf5402c28d31efb695a800a0b0b1028b682c10b05a67c0afe6fa8939bb437021157fdf2aedab0ffddb8d46575c77f6e83b99c63b7bcd422ee14e5be645e2b78f53c48f2f8ffd5fbf6e28469070dd6c3450c6f2198b92bf2949f89b9b835aba6e991c9e35413f4c6ad873b8cfce0791381379c76c641b35e8a099ec46446b8b23da5f0cf2ec00c37c6409b1e7513c4d62f8289e8d02036dc23ea0f004194e0289013c7ebe276ba934a5947b7fe0fc116dde76feea550ee1f6fbfde09effad8534a1fb035e5533d15407930799eff1cb85e362c8a7c4fe3bc3e50ca96e9bfd5ee866f2e3f8c2bc64d4b2f31d3844b8bf658473f1a0c77e8ae6d47b961032aeb9e532a5ebf834324a073c1102da9b91525c4098554d636dedfae05da65837d967e40cbb55fa79202cb8454acb7b8f0001c5b6b67dbd3cb24f4ec85213d4657a30e7f0f619b2ef4df3015ffd3a74db392ebc50eeb025ae85dc8ecfe48a5afbdf7f37212badedddd6e496524a296577055405c5045d473b7b1c8276b7643e7c78928aaf4b63db2088e3391e8364c97cd8e8d001212128202a2a01112c93edc3e6072296286a220741201182a5da36e30db5f095f5cb9e74eedd65a8cd687bd891dbd4031306c987cd722452be0ccdf91c97bb91a32f164b791923a59452ca1869ff57cc899a48e1040d4ef420832143f0b5d65eab040a19a060e2052698e062c29224d84882a64baa20431528574d3eb4bd64629cc0cc8d1021788330cc2c8c78bff010393b23024639c407765eb010da613c733304e33d7333848a72142284bed41b2137446e7c309eb9a9dccc0d916f0885d13db49bb9e9b9117223e4c6072aca999b9e5048877fb0f7de7b3d9eab699a769fefb5b91ecfbdf75a8bafb5f65a251bbe0731fe288ccaec2f625ea02f9288201819eda5b5498c96b41304154669647ccd18edf8923fda7d4925467b22822832da733606e3bdf735e678472ec52ba2ede511312163fea7807bd2733892a1126b1fe54fb6d86ba13d8b23e8bbedc72248cf97cdd534495f6cf24ccc47d3a8a6ed99980f15e518ebb933b11efa72633d3f549431229bb4c97926f633132b12fbf1b1b121373624d613eb8909797d33b121548c6973a49361a065dd968a18041bad76c6ed68c4ccc02fc4514763546334ca8de33aae543299b60d5a2b79314ed1e5858b0ba7534aa73e0e854ae9d4c7a53a1a9f0a9b6de6a48a9bf35e9569a295e8fbedce137952f7eb02279cc9bcb76eee64fb384f05bafe5342c51aa27073de7b3f4e148dd2d1e034c869251aec14301a55a858b10200f7b2e0b412cda253c068fccea5784d6879c44d91f1a547cfa2a2fbd188d8b8d5dda2458bf02c00b0a2450b15600a4a8befc4a4458b16aa1629548bdda2458b16a4118c120883cb588fc7ba293085a8284f3b069046fbb2b1b1571c6fa88d76bb18337db199b9991991336e7276f7f572f7cccd8c8a729cb9019263fdcc0dd01c676e80c6991b249bcd9db909a2a21c676e9250518e333741337a39cedc1819676e80e428a537735364e6c60815e558f7cc0d1015e5485182a0311af35ca06b20d1b40a45088d339e9f2288468c5354dcfb7bb1f9522b5ca0317ec16f51d1c62ea1e97318650783d51ade928ad6025a1e3942c8b8d154a6a2ac8096478e0032ceb900bbeb5da2b282950f0071198269d1d53cd18c222c57a84e5089c16529c28f211289a609a4151fe8971cca291a1a626182de4832f7a943550e91482a342b2e9a904a915234d02f39347da09143570ec9a1a1a198549008fe481ecc2adcf8beeffb66140088a5075d8360e455ab8c61a76ca9dfecbd29d589bd16082d73e3fbbeef9357724137f02172b1d872a92b7a511451a05f732694b3d6dff7e7e4fc62ad44454242958a6312ade2f3c147bf6f898bc48f4417c12c224801fda24bea48aa8671150a9ae11910e64c0a89a215c58b64860b3132428053a07d88cc9c9c9c3c1a8df7f96a6043b1f2a389498417dfda14f4eb2e1d9d671d3a85e8c4e85423dc68b974d813fcea685367eae860fbba5a09817e4d9dffe8e8e8e8e860952972be8144c9922449be6f559b2822f2e12e80c148ffda3a3a9a0e12fa751b486e04b5e80b9d33f99242a0afdb5f24434222180513fa258178f4909247cbde4610fa05be767a090464c3866883664dd6d54a0d313d68a899917525822165ba9a2b3c27c02c4a341f9a44ca92249fa05f128807d0884492244905cda3c70b33522a5e00b910da8c42844548559162078f1ef42f9a56735621b382850f382e7351689a1d39dbbc01ec526d2ef20d1da00742586931c0aca1c10631a04c31c6db0e2ad208a15fd3470e09cda019cd1caa4395a816559d129c00070747a5071367f6ca4d2c89808c51714c3f40b6e47a51561b72353fdb91413b16e31e19d0606707efc8161ef46bfacc1d219f79a022158e4a41a7f031d6572f09ca47a370a0250ebe948f9601d5565b6daeb73ae3e0e88c83638496b1f5fba1345516d1977db58c340727070747150487064713c9a0893c1f349e8f2566cc1239abd0b18285111c973924e8970cca37e8410f7ad0831e34e32bb26b4cfab2a316d221a4230865839f2d4ff0aba8a29c6f30e03563469ee12227e71b0c904414993143b6d4aa4244cf186b7e8b193824b48df52f8ece2372453fa570e1c499f89018e934c248e98f96c20a34bdf456b06496f3bda7e3eb2fbe57a4a05fb7f1d5ffff2f4920f070a0f17098424fb12467dab0d6b6c45685c9b5ae1c995113db7e67cce8d6428e147e754522e996676bbd24c91ffa256739d456ceb359502ba8359bd3037a428f2718a1470925b414346829444d6c811804cf00ec40b3e820ea4c209688ae44a1b2284164358d47145a4cbf2411c75da43f9ac6230acd0443c4177e8c7c2aa8584d42f09278499640c312e60fdbcc8dce4b85212747e746e766e7462727276747e7c70e909d203b3a3f7ee4e4e4f063e6cc4005451481afb5f65a253740e006ddc48e6e82033d38d083a69731af87a11d71be90529d8c46a05f52e89532d6978a118898b5febe2a6455a44c19978a2e88748658b5fd8d46948631b2a55e862903d757ab04511c8939fa2585ea27ce94615f2f4325a2130695324c19e8aace39e73ce98087193ceca0e9a5b7c312a1b932737171717121000b8e7eb9e87840ad30a357fdd95c5776c7b8c4b8b89894d01aeb95256819a02021595dc4a8ca0e26938c61abad2b3fd6c50dd70a78088d850479c503238c45adb513fa2562ad7b4c210bca016f120b08b6951e640c0e884e2507a51d13cb08348b0a3c951f4e2b5840b9e0404ae509aa231ad6b00947042766e34b65949731e6b5f65a7be3e5325251b65023faa56bc8410ed1d0971a8e46b1c2c8b850fa534f5ce0f0addca0b8f0408a8a108802152b432b548e00c00916499c452784c26649a24509548880c178a5062c2c52b850e1115de8b05a81420b2c41015879e2850a510b8b0d04b0b2c361604c838801698591fed5c2100da679817e892315816292001a5fa2165fb8e002430003288130c070195f363b3ca22082860822d6dad846295dd141bf2891fa194461e69021428404090204c8f892458a504a29ad3f5c927ac17b71adb5d65a6badb55e6ceb6badd55a6b318b2234fdbdd85a6befc5d85a5bebadd5d299588f26948d6849c52bd87ad0da4b29a594524a29a5b7d2534a69adb5de571646e85c5772c67a623d52ca96bbe9b5f6de5a2ba596d24a6b8e7942684f082ad05061c99c6954db74cbd898b462c59ac507b512f929425faa38da7fdf2f8ab556177d8ccb6d98c2b1199be91a94a095b0c40a0fb082a9861cefe9efadb54a2b5394ca2aa95512849e1ffc005f6bedb54a8a708ab6a95203cbb2d87e5306ded5d65aab5d6182fe72d6fafb4671ce6fce39e79cdf9c73ced20d5e901f5e902634618913f4dc71c2b5b5565b87a29089c2c80b2347741c197a6148881e1f9f3c9aecadcd187fc3b94f61ace1d71c52273ec59934b016baa8586f43f7a0b7a7c280f628972c6c3788437593e74839ca4d8eb18c87a45d66c3593cf73cf61893b49b82a2b226241711a0888d975381a34bbfa44d47b7241aa44d3b1a5ace541c7d741cdeb0b1033d63dbab8c21adf448a423888ca45f2ea654faddb853a162eabb0d0becaeba0d0b5f76df65d76d1047ca5577a55cb56b78bad79c3ca5db2ed5bf5df35db5e15051748940bf2492b15eb2244bd6558c28d66d6134f76c2fabcfecb131f405f5167de9cebd762f9bd16472d573a03cc5e42a94a77461eab2ab6133da1e764c4d4b456e969eba1d51a10c6dc885320c4da68aa93b6832951e436150443a20206ba20251932401c458aba9d4c5e84b3d92e4c74b00c6fa29abdf6ad705f7b0fb529064759bd552b4e57b595fdaf35f148f760e5da0e2bdb6e31b63a8780fa3069a3e07d33ccb192d4d4095f82fad4257754f9c2a4e1f467c3c836c3ce7cef441bf7b8e7aba6114c6e3a2dd06e759b3d3790ecdd90caa30fab26be90d92e6085e866e4132861c538e8b4a5a855171dc1dab8e4f8e4f712a0ccab1c62618532054a43a54c4a064d12e862e4cf99c5d4be6a35edf077d77152657914a608e3177f089c384993c982b7c3c61bc4ea70923e7ea457a91e409109d713820612611e40a1f4f1c3de2cc640b9ecd705f434ee0be861c47b797c60cf92069d692c9be9b5c7672d5275185a1c733087fceb056b7cccd2032c676fcb9020933772081c033e26d4f22b205bf05204df127781da5835bd6d5dd3a523e89ea0abfa5484ffcad035bbabbec40d2de301ed261f57ac3e83b1047bdbeab5e9fb45d34759410f52f3cfd24347d3391acd1e9a66f933309bdabc2d2a5f7d21c7308b6f463902cfd1cdd55a164c93187725469a92deb0ab56964326fcbbad2f832d3d65157f8b2d2b65157f8dd8ea92b7ccef36c30d53a6cb86edc6db6bb46dbaee1b9db453ab76b6a6c2e1edf6f972c7c37886374ee3948df366c3be9dc86f1b8b693b8c3481f6df05eb24639942c0e7f84f165c0a7c16fe1ebc057bb6b3447f01e96c1bb416de3a81fdd553ffa3d8ce76e57fde8309eb95d79d3c346bbe2c9f2aea0eff1678cd28bc4462f431951e8facb5842d7e318244b46e76b3d557979b1d14af90d9ca7b761d9d300e228bddef5ba6b78e676d5d35df3bdd6d7a0bcb4c169c39a610e755dd9975086d0f613c87ef6d828824689c4288f40418571ab1c0258a025abf4dab54a1bcc075d736cd56f3205dc5c92a0b75b93dbd42dea25fb9a42760a2ada1751d1d6902706c992814f392d85e0b730e5b3a301e2b061951e830dabb46b6c58353cae94970edec543072084b04abb86870e40c08095721a4ed6363b1c92253bb9c965076630e5ac6d7203f8a1e76737ca60ced3a748124d3495cc9e093491cca02934279126d252f468a2d1ce398158201408109c257a7e5a306f03f8a1678f6cb117000f7abe9b61f41a1318bd861cb514172ce8f91680b49544b3a3310398770b4c39fe286cc964aa9f5c96bac937305cf19450c551c2fa2fa4f774d073367d640c6db49f3f1586de5a3dda0ce2287dc55d3cf935f5a5e7eddaae62d7d06f97a160587a4ab81d2594ac2f94ac0d87723c0925cb24942c552859a950b250a164cd0e6c557acd749390bb2ad44f85dd49e1e9a8d0bb26d3375dd69d3b0ec156e9314856e9394c51fc20616d97dddd2d99ccc7c9db2d99deb2ae64a62debaab4655dc9ba2de3b6cbebcab614e9f994530ef4bcec5ab27a7a2f96b2c1d4848376499f9f635edbb00de371c1e4f783f2f9362c506e1007fdbc6bd7f0c8ed9acfbb66f4995f334f37282f59f4362c19ca4c5186d01f5bf53aea65ea6d5450bec71cc17b573e3dfe1c4179188f3d8c3e1fc683b74bfb3c2c9f7e1482728377e3a0cf77d1e7ed9ad70ed3f6bc57054bef0e3fdff782e586effbbe7fffbe9fd1123b9a5eeaec0c4d01670a2ca081051f0af8a18039e7987edd868a21f440010af85a6baf5532821d9d1f3f727272f8317354000514f85a6baf55f2c48d277ef0c3134fe06badbd56899db4d605d4dfdf2deba694d66a2da594d239adad74ce29a99cb6683625cb9029b79715a6b373e7f4d7fc313281bc7ada75b5a31cab01340e904b18ad54c268bfc5707eec08990d89e904f1a1c7e706d19797f699219951ed536176649fd1eed041bab306d9623fc39933373057f61487d1c6b66dd7902369b76aa5a780cd7867acd615ca4d977de7becd988c51ea4ec3d247f62d00e9aa0f5e873eb8c17cf092a5c33b98c1e7e80e960eabef9ea374f0e086d15378f294d0e428a1ea5f88fa660a252b857aea5c68ba4cdd04b6baae742e2594ac8b4f4c768c2cb5b30cb545d3feb61782f726f0eae7285d6f98e9ddf586f1b84cef0ecb2138c302e63881a8684f6316a1a2bd64e9d28ecd585d59c98a69a14c4db34daa4c1925ba851467bc3654c96f27cf3b79086081561da542ed56aeabd1a9061fdeef7d9c6e3f3bb07537b8fdde86b5c16d9beeaf0d4bb55d8ede0ec4e1fd5ec7e9f6a810dc54f7daeb0d3bddc2bcdf4bd6666fc3bae1a67f7a8de9de6d5895db427bc3483b1a60ebdadfceb3bbc6fef4d9e19f6485b976b37435baa513c6e8336cef91c7295b4652b68c50f74edf7db4a1eedd85da20febd6983dbbdb95daa0de2dbeb9377f242c93a8da46ce14efa0c5f1fcd5622855bb8e31bb79d61d440571a36a8383abe6194de777a0deadee9de5da77bbb86677bcdfd69bbbca3768dbd573fbab776cad04679afef007bd3bd7797fd09dc6ed2bf77996e37b8fd747bfdbbbddfbb4eb7f74e21b85d75c9f242efa8e7f08eda30d54f476d188f4bb59f3a6d0d661ca7ab9e03f5d486a58eba6ac3785ca9bd5f57a3c3645d9d46de1e8dbe8df476d3b69d2b7de3762e942c532859a452c7edf8e4ac14c4fd9600990d1adf86bc5ddae0c2aac7d12c0ba382ae2a8c0cc785656f8366d5df5fbaa0c0dad94addcf8bd2e39540240afe7efa307d2690febd733685c6db041587a8a87a0d53de8527f742937321ca75f83d653aeaa0e9a710857ae926d4410b8e1e8364999e03255918c0c9c0b46103e3fd3647f9e068b47dee501895d9f4618891fb9a48c67bef68cbf7defb8de69cb30eaa303307bababf3968e670b346c3124d4fef7670b4857307d9729fc3d943c57b1b4e1ee6eabe86321bce92b300afd228a7015ef305e3c57beec8967b01f030c304f2f1c619a50b16343dfdecb6cf0e1ced9609f51cb664b2eef632eff59b2a8630a57aea32540be7b88560ab543a3d2524a17c5b87ec44a6ba32936da3aeee65a91db3c5babae278e9b769ede975d7d49f462397b58cb1e3dbee8a1f34fecbda0550c9aa2d99fde5e49491c7d36d08e3c987d997ec4b77d9fad365e8ec24407a08ab57dd86b0d46d1d8df66b07cd487a9675a5edd78e6f0b650e491bcb54199ac3d1b72e15f2b8ea06afdae0f61006ce0de6bb5ce0b6c1bc71d8ab9ea33e757b957dbe2a3f95f34739dcc257fe288772c49b438573a7aeee4fa117ce9f3a67a51068bce74259ef5b8ab4a76d347a22b24915ee5e53a9b4414db2c42b736fe3dee53ee6da2983744385e13417e8ea7e0b67e8a147024c18f73368ef91c701c896ab6d17d972ef6541c378e661dcbbc3b6974e3fd246d9d1d8603d77507bf7edda3658bfbdd49524ab04e2e0deddb5bd54fa76ae3b7757e9dbbb73a076ef92d585dd4dcfd1ddb461de4b376d188fcbdbd7a52d03da83da067194ee3d87e97ac3f44df7368cc7a5b74b5ddd9b76abae029298a804edd83435cb94199901000000017315003018100c860563c158146582aa790714000d7a743864523497c9427118c6711404411082200000000000106200410821267b1db1663268f24b9dba9d17e9a8084ee3271d59de769d0aa8a20bd737a794395d24b643a17336b4ed4f5bdc0ef2ca580db7faa385c151adacc87e3669d5da2e23947b8d457643d0c2daee8e9000bd8265af053f271daa6872fbf253defcb4febc4e93d2c03d583da0abe85fa56a69151e0d4f7bc60fdde2d1eda859817e779becd14eae51f02fc601c5dbbb6c622a22e92af95097aa93117cc85c4eb178c5b60758795b3d89c8d1548e8f8b1f217b257ccadadb07a406f11d7384ed474953d8c3ad0548e6aac86acb7bee6c305bddc768a1ccb41613fdb791f029f7f472b53811e0d57c10e9a806a02613e1656824e55df0c1b6b69d350c28320bb59b7772647c1a68441910dc9805330c8dbf83031fd2d096553b5d719802a19f58b30d2822e95028ee05a1b29136dd764c9e5df84e37aa93060b77a5a24818276033486c4243f6c493de1d544470e2ab62eda153c9cb8dc12a29a03ccba05efb2626dcd2589d0ac1943a4fd794f01c13b7a4e91cfa78cd82c592d92e4c68af6098d239275c879680af06b44427b45095000e58da84855dce11fb1a92902f4d4fa13b707b684e66d095aecf751f32a640c890d88aeedf3bdec4f15657e607f66919254ad2bf7beb692ba4f33840b086ac1a5707f20c230f82c88802cd33f897f8be446a4d1d0aae89e7df78630d4adce8686b4ca893998c43a4c9ec985ffcc5651375fe30d9d1d149c420a4ff81e4f0022bee031067968c82e0b8fd117745df6702a9b889349480a6ad721fec075890074ab856900e4575f6826ec53dc096b9d8d71b3bba589988867b2ee4308a9708142d679b605db4fd7e9123d10b38d81b7b69a4dd6d1174bdf4c9ce1f88f1f60e251e92c66338307d04307ac7c990d5b3b643726c77b5282ec4460b8376cf9fdf5ac24c4f87129004d5faf60d414d48e541011a85aa925bff05e7e0a15419370e24a591827154c0d84da6588a3afb431868b848174bbc740db1fef6cbf04d609708c16c9f429bcdbe37f642401749ee30f12aa366dda5295d0ab2d100146b927726caada5aaa4395d19f0ed90ed0f2796cf5f4cb10d973064b1406100dd78b2387e48728bdf1121e7963d05579c8d014b8aea726d8587e5d6b35b6f411c0ed0c6d1239d81ac719ef345b6e69cd900b93d897d988fb84511580e89158383bf36dcf300bded24e6c6ec93a3f1c999063d24490463c926ef6796ade2d12bb5c8f39197755cce9bc1bdf324de04e5af8dcdc54fce1bff199ad66bde96489e656a27ccf9ddd11227ea4de7e3defc7464f9efa4e1735b1ed459a99c2b2d5d6c709e0a942f023ad117a539f898c276229c9fbb80ff1e84469d450168fd1d53a067a2f8743f2a103a06295483720c21726a958101970a96e6e4c8c918e64a93bdf2f9b06f1578be9b4d6d82ea641e4447c1ac165619326177706677c59af47a70b0ab9380eb5a8dbb5479d68567faa0f22c0d124226ac972689348945489a190a3f8b16b45944961343deb412d4fe58afdb9ed585bc82860964bdd1635c68d68e29f91ac89ec4a1c7b6da1298da446b5dfb58d3967c0cb3c68bf2119cf7abe7f5342d48fc56cd342f17ba3a0e92e2e01f2f681af4a08227cb99c3fcf9c97e96e128d1f508cd55c8e7348ef4431437e8874d7775e1ff494d4bffe8809acc3c3df85f90f440e88a25b437a627d6513439629227d1bc6199a1771735ef816e4c334a1990840587b33e34968e1bd3c2995613181302062dc4f2b8ac03ad841807b34bef86bec63b4c4b448a89ac32aad6c95959dbd47b52666a33ec168ba5d5272b754305de3fee844086695d08293b258c76b312b6936db2b892c68da9a2449cbeeacf765ad7229d3c93c239f7d98c47db8a3e919d50826773d02bad2d8b34adb6acd881dfea344f951e98bd0b5ef901b547d290f1897c9e52454d755a6586f4abcc17884475bc00f6ca954a131f7d998249a303b1bfd75efa03e378858b00ce9889fdf933289aea3272cb2d20ccafe0c8e5f3055b6eb1606d95739538b34071ee97aa9866860ed215bf807c8269446b2c43b4b0a19f8ba1bcb17367084d02f579bc96336b8d8d695319fdbfb5d12f47b94092e998d1e9f914c42cabf52a4d5c33f95a00099c3ae6e8453ac2c4c847aa90cf05097b3b92871549929e644ccbbd01642d1b4b9e445668c1ed67a8b2bee82792e9f64459fe3a35edb732d8ffc4f0b90ac46d85f277a8891e2f8a224cd36c5a1e5f7b921801f5a5a69ed0b860d28ee89cb19fbb2eca82725e3cd09422018456660255c233d5c12d3b97a2f1fdad9ae8564052422f085ac0f910c0824ee64c2b8873a2314af2178b44c8377ecbfbef573125bc5b641162c0cced2cd517c07eb90f003adf835363bfa8d851ab23765771f028c6f7734c26b806f262a9423b698f612ae0f9ab976211158e1cea7e400dc860a4de9a7daebee264aa05b6b471eb362b3343adcff9b0b1d5693d38aa5ba9783c51cd0a47216e97be3d72aa8d2d8d7dc6429ecfe25c3ebbddab8050dec3447d02f2b252ae5a0a8605e7098a17064b04c2f7c8239c2b0cfe2a97329b34196fc34a02b2136d1c7f5c04579c8017d8c46a9938bd5ea01e7bade5cbbfa857dd5098066b5c0423bad6b54725306b8cf95cd6934f936e9934938865810c3a36c180eb9408e6d74400c3b8f8676d2b23500e31d282275930d4042dd6a94348ad04f231f1126f5c8700b6d567c5f45424128ee4c9359246ae1c60ee2c63911cd6cc5746381a916a1d3baea6cc336ec9779e8b487d85e56ce23367e24f0d900da958e3742f5d32ec6ac20475d732030ec5a79bf313b0ba215310eafd74d22501c644b6079c04d79c1ad56d1f1eb49a211a7f28e8f68c223a03a3783d001c3f9c5a180fe22cd01948e4db143d3a41ec061174603e9917c860e85d26ab1904155aeb5409b739e6e5fff0264c9eb6efbd73600b9fa3f3ed811665d47afc007ded27046c52ea0ecf6d0df0434cab57d1dc0bf3493d754f76393cd6fc437c48db40020ed7c3587c64e0fd5717b7db32d086d15e30537acf9ea291c10d7e2f4a7417ff1ef4033fbabb609251d50fdc29763be8df9327a8b4c9a5a333cdc089936ee19a1a84479f09379b958dbf3636fd2451bfb8128645ac7e70a8aec5589f5557f4fc04f30b6afef79eebbc7d957f130460a140b49363d5725bd07750769248a9f028420ab62ec66698d18befde044849629b14582eb5794485a209ba8be23e551b1b9a97a2a880a07026a1298ff31734949bffe58f35742462bbc580e41002885970e2e149f9c47a5f2ac0b3d87fb21c5d9231d4cf71e3558aa23e29cea88355f5f9c802e94f0303d1422461b70dfc46c9040609ad7de735ddf211410acafe537fc92d381bbbe15f2eab2570536cb1c84fb911d47ebc775f2aa3b271c671e649f621bf8d84ea4f65672d1799ef1f49053a197dcf0e5a8fc280ea8cfe4be14197636dd622967c764966274f92d58969be85904e0d838cddd47f68a55806aa8b329b01251df92fb07a85e3f05a62953c16e4d37503d0b37dff260bb6f5768886ad07ddd6f026f5e001de546e7113140eb6d31eac55210f36c1dcf1622dffae46a5756b541016705d1201c9465a77007db72ee1038df3418c54e5aa81752b7c7eabd6b1872cdc23d12cba40518acadb578f4019b9b1625b1dcbc5c974eca54cdaa1a4ca8093694952f6e4fde388b43d37f25e85f43085b0ed5d6e696e78191f75bdc3699059eab9c369e2248a23b532a635a9e634782dca411f20f2b85919a7855f59d9ae205999441d2bf3d4d68158d9b39fd187618b95a518e36b56f0116e60655bf55526cc6a32d0316d3925e98a95a07d196aa1f327755d3433c2fd6a2eca5a7d282c839dc70077a1e4486183f88787dfafaa5e599fb6c13255c33b9f69deabc607babd89eda71417e74880c6ef3e93339c4f85daa048e69cc14729ba1e620afd2bed4eb7736cf670355c5c943d80464d055be73dbca8d827610373cd36adec6b248c91c145ab89241a19951b7126520af4939216ee89e0c8f97bf7377ab0fc83fdc2151cb3e665990c7c50c133db3e19b0b69d338394e55629eba0225122b2fc1ca5b10e5cbdea656b99b5e2c23134881b04ceb928e3d71b076158083def015c3c7ab7185cc6087464587a137375d427b589895109a031ea0853e05645e7c5ae675fe3dfcb02f7e9e3895d2d9830b31dc741b59385cea649f95b39490af57eca635056a542246a06ffa01429ff1fb8eb00997025ca792901126487443106f473a5fd893a150519d0d142dfd4b363015d5504355bd1c5412ad3200f977c9aae1436265dbb6ce0297e2afaf88c3115d07e12f21f501c5b122bc9d18fad5be089372d4717d63e79170559b3e18f691171d6dff40f9ac83483a1949a0e3df78b8215c87799fd51a69966ada0e9b74c57ba8dbd4adc4fc173ae1039b11e4c3a2148049dd3dc99a8374e19087297f9984ab382b540b44836758f66e072b38f63d944014ec523565dfc36f5928fad343f588f7858259fbe45b370b9b5476281e40fd673211c2e6386097114ef4b30d3d78f2be5441380a877437aa501f43430d70214a8f02ff583048a3a58695bde80270b5bb1ae9e4a2074d17451072b11f29e49f0d1d9ab1c5ad2c8ae0c3eed4d001ac026caaaa983cf9d858ded9a1d85201be8dd8e8ebd0fbddd0358a8e8b789679176cccaf1781d42805d660b5a80749b0c3c7ad67d59eb8bcdcc6524399875d61cd0d4a8f38cf20758b30c45c1c1ee0ea29051a0e328fe3c927ed031a3331cb243726742d16023c5356a342bf9e722fb19e606b92d2b83f5399b05be7800f2823600da9787109995adcf66dd6062bf40b0b4656045cc00089f0ccebadcd826b1b8e040baeb75305e22c137e3905a223f7cb06e00e80bb19b0727a1ae562588452b1da0e6b683213d013d5a00a00b1ca1c98e20764a094075977b18baf8a9951eaf9fb8c43a028020218352f914acd0af70214386b0c23380711e1689c98241cb38b1269e00e8b7bf4c69d0041cf92301845fe54e20d50c41d90f111bae86749d8ad52cb05b30e7d7af4698a7f57bfd2a884fcc5f279e1fdc4a13cb7b252844923942c6f6ba4f4f511e4f5ee3b45162cd87b1b368dbc82de58f0d3e0f3bb761909038630b97f42c359bc640ae41583b9dc69014584484d42c47032ea64ba49672ff87ae120b80caef4995341271f986385eafccd471b412cc7bb044193f01770e4b910833f2561e531db344702c8760e89c4dfa250ade64778f68df46d9478b4ad964bb0701b11e8904c9a75a42ccee423953c4fb5d02b9e3ea6b0fa3c8d6504d9abc31e0cf046da28572262f214a6d8c62856dda1b50fec060ecff39060062e7e3c7b8012eb8f4c17f50eebc98384fb9e329389ea3dd2c786e01ecb49cc4824091f90e7a3a3010e41b2e7c5081c7ba1e2c4f404e12bf4044ebbd3b12595db7a6c00fe73d0deed08280dd13c5184122de2b4a563250d1e31bbe46c04fd19a3efd0b6477ebb85e9099cf86ac1f5a8db5f11e91ec0dbf12ccbf39a746ba918f35190a6d140588713d29b8bea2d2eb8e28a55669f8956ad9e06c1aebaa063ec7e7c25aa11a50c6873e60cd19686da84723f7d9023c5b2aecb11e85080a40c7796060bb84d600a17f25475b27b3f3bda8f11d8eff51e35fcd51b19bdf3a2518d669e537a40f42fef3750591e772e25a6bc81d4691d9747585fa47c86fafef878a38caaf462edaa73305b054a1ecf65464f1813592207d4779cbf9819fbab5c4832c360aae9e0e08c6e82cb806dd6a2f027b802be69f40cce2327acbeec7594db64042dab1616a42a52201726edd9acdf523d279f4f25b8086d38324cfb879446c7dd994a1c00eb186a2498ebe50c9fda2d005f713cb54e1254f5aebe04103c7f053a1b3844dde3c19caf593997e05c6ac6434951c06a33e27ebbe892326ce48a60d988f21b5c84dc58fe03669d073db2563bd84fb1b88eb7cfd6e7dc7200b1cff0dae39b341b348c2166523125488f16e0f1984fddd821fdb4ab69cd2ef5405be5165f8f670595a66ed84160e160fdc1017a8817ca9660373db6ebd1fad55bf9f3d04f05e33b91e469dff07c830574717d294dbe62659b5c01c80ede42886082db18f45329bb11ec5eb6192639772e09c7a3d90fa7b07eb50b793c2b2167c5117cb141af0dea2d59890fcfb80a055be0154ab5b1a16b412779a29642e3af81d518cb9b11671a9deab6393d8aca1efdf39b5ba4256f17193c91bbb9c9a30e6d564596b2d082a114368f59c8116a2c7361226e3b821bae2cc1d4548ebdcb166223a995a884c7c77c3bb35e32a78ec9bc652ac111257687e970f6d08ec589b2582bc9e304024005a808c87af7541054411e37f0603b71c5f30903db137734fa0bfa45b486c55e661dc86ac15e1575d885f8273050bdf4833757c3502986eba6876bfe3c84a86ad7190baa51ba45f6d902f295890a01132963dad3410ec9b30bbd03b25eaedba251605e723ae6d4687a55501a91a53109828688f74f829d261b242045cda38084d00474ab2396f363a9dc8e84dc6cf3d90a8674d7c169df0b6f35066194ff4180cf3d31ea03976f443c93efc9d78fafb95b90158dc1a40fa24c91e9b4ed0b7faa8c4a6707bcf304229a324669ab438a3c115196ad4d1b6e05b2b329c3040a8b17cc240318164b7f18cad5da11ace5a69091e5b499e88c779dd898b99e928f46c745c616426a5f904363735a697ecaf28a0690512f1b010f0a52f7b366e8c014e2248ea8726659cc3c22879a3c7d12d604cda2d8892793bc9e5ec6be5cd78aa684089d2514e9f4cb0e0b1f7432e825ad918dba1a9c0f9b8b0ff56aebe68e1b4a301b885ea8ce0d22c22302b89d0dc595be3bebb427b73d42308dd625779c7259b264e2a901d3c55ae25b4500fece8d40e9812e39f53a79a740a5691652f2ab669db8deacc28af1579c5c3477911c40d56ea28cdf677ceac3903c297faaf46a6ece2d4244cd765e3316a5498fd3db2e2545784eb3465c074d472578f8d59f3343123764e9b91774ad2b870379301a04ac75aad74dc78cb65d397becdb3dc8e2ac9dca931c59fc60813fdbb8fc7222a53bdb500a2758f74e5e46d329f75eca647bfa38e41b28e294847ed3e3f808c75dcccd80f9c032a2b872381cc0ab6c683d9977732949d32653b0e5c677d4aa0c731799ee3b1976be83891130f6932e2ce69195da7f48cb8f3d37290141dd333a2ce4a93159cd6f964c326e7a1f1c0168b561dacee7afd1dc8cfa5c460ff9088849be0e0e7827bb7bcc012f5c6ce6401eb8f4f846c6c932f0e8176116f486d24fc36778756bb519375087fa2fdac9331b8e20f7ce7dcbae55d9f2f59ad5382472f009bf79677928179ce8a050af95fdf335801e71d7ab8b9adc4a2a0e3c48cd429e972ce52744ecb683aa765498ff41c61477a9eb4232d477aa4e78967da1cb163da9c7848cb483a337dbe2bea41695904e5294da3c2e7ac028892062598e83191a3ed48cf11754c93d13aa5cd489dd365149dd2329ace693949a7b42c71675a86b68369a848bbd3c865b3f37f079cffb96751947f1ad6a5ba75ce7da221e9e9e900407227385f04db481e374af6557fa36208be078f7888f145b180c5cebe75705d26a2024335be6a1105146da08c8f1bed6c0db7f7621097b5e3a75a5e3f8f272eb2ca1a20196c3bd5c91862ae7b81bd24757916738e7109c7c702640b995e5e0f116c5d691d84844db759c46ac0dbf68d09fc654bd372b3c11fb8219f843a61489c35db0d37f1a5ef1fc946b6581f22fd8a4008acf06687fcb9c3727fd5ee0302e4fb79270ec91e2d5fc65de3aaae859f5acbd3d71647bae9d7a74db27c129fa85488f914a864d895ca914de07182eca39d55443ac8c7b26017772927f76569befab0f0580d679252fc16c98dae3a3ce9e328c59e85f9c608981bfc58036e26ab50922072e96d29a4df25d2d8040f6f1caab1b97a154aba08810f771560e3e4e060b3218ea01079a110cccd370905542f588b346cf603c16c8290f14b3ac087fc88d70b01d46f09000cd5d5b03f1d1beacff5600a41d989fae0bbd7c1da2329bd7e047fd7f98e09a5ffd0d1ddb70cb7f28b3e4331947c367e2d305e774bf8c85af11717c42d589a5d9a2b33c696987592de01625173be902b46ecb9cfb67e13f62c34b1bea2b6b5d45bdc6f41407f8d9a7a5763e06092416f61f075ae25dc07fb7a4cdc8a142a21d298d8217299c6779f790fc59c856cf8f403918b7d0853bfca0398c9cd86bd0a401d6b40b25756c8258e588a1164250c92a86c398264971f4b29f12ebf8b788c1bd8273339148064dd4797d2966bc59605ce5ba80d76ce89c889eafc665a6038158367d1bd0dd53893e21bb922b55cca8322344235eaee94ee600ee20a561db233e407e77fd919c61dd8d60f3495298f7ebcd650c50f3353e85e9dc12ec81984f47eeabad46687c93d1be79beb2fc88604c8de0f4eb6e9b545b2888e6288396b60f0f6fdb60f25424201aa376edc89e38ad7cd3378ee4522a90f557acee09ec7d558ba434ca31d84067730590db81043cdfaef2becb2a3b6def6852eafbbeec372706aee40036db956da8198837908ec88e054124c49c81dfca41e1da1644871628ce70e88a9aeba7f119a85fe637cf427c235e61805d16c00153d7263c6446862225984250e4bad396a1a4ef6ec36fbb1bcd10ffa6cd6da99142a2ce84b95037c17e87cdcaa7c3400882b12845fcd354b1b189041f520dfbaaefe14f75f51755fb41009b4c2ef03d52bbf0888af1a0bbdc790af7d71ffde8257b6bfa70065f506229521bd8fcdf29a88ac39e3140b72375fb585d0a6bf3a7f9161744799669ab5387eea66c34ab7b55359e715832940cf09c8e493d821becf5b00291eea43e22fff41acb243139b17468159fd617f53c7d960d46e3cc8c1806b5e79385800ccb246c8c64648d8173bcbd0af79b13ca86d40c2c521aa0191c8ed5531f82f1298b99e0d8f1383910a6d3d53384052b1d0b40345ec96f624b3a2c977e6ad2fbb17f34484277b389d07b6a0e2778ba0fbbd5cf3b9bb5e96b9f785812f28d0845d3cc0fd982d353f1c3865dd33a58c0096a8e053c110c1aeb0ce8cd38f292ad60e9521dc844a8f5bbf54920130a8723bed947239b17902b4a612d112673a95485dc2cc9842ca1862314a82529ce2560c5b3bf235650c128fe6b089110275b8098e021bb802585c81b9676b3cb1f720ac81f058d30c94af8915c599108257c208607d1401abb849760b1042da69fa09049ace02501b85271a6a4ca2ad183e4a8ddd2f4208b77b29e31625b0e401f85231cd32aa29446323310aa87af6c09c237888527225989f6b1c85f546ec31d65ac0aee345cb61475c16ecdcadd9f32d3dc3e2989104cfcbc290693d08d42590601f3c6e6a984a3ad37e7998e1c6dedcd36aa75da441f904847e198f1d5fc36935a03c8c98ff99d39e6ccd34c6e9849d547560ccb7bcd9a93f9f4e9a520902ecc60eec17512226ab7bb034ea487b3c3f5b9ceadae63e5063482f65f004779a1fc1d2af86fbcf4e1f47b8cc5ca000e9665193e87a589cdb75af7be17d0139c0b64ca054a12b65654d6d5070b88a6d5db4f67fbb898fc18d793ce4364053fac051dbe7a0b43ae51794a6b735bb112c41fcd0539ae11f44b2964fdeb3009cd67e8d3cdef9180702e58746cf37bf210dd9069663179b4c0cb5a2dbf73210402ad6b0e3c6758e61f03c78cb4a30589456c7078e07db463c1e97fd741ada081aa8c99456ebeb1ca87195015df5a73f10376313ae39037b8a7ab90b41b8d089b0389e23404254aa90fd7521d29db8b5d5d8796f56929af9b674512aecc9c1dcf7157d038525db3211f7f3ba7dbedf5be2d7e539f1be4adb24def269c4eb4741b124b4a17e12ce1ea03edd7c3ec36ac12901aa04d87ad6d22491e3aee38e2bdffdf5ec8e49fa78dad3e84503ba2f220d870d61d8dd6963af56cf4730aa2945416a9e435b8f794a58e86b05eae577450c117d8229045704500c904468ac70f90809c1927ea8680cf45fc7353de6aa50b1a2b823e7e25b31003afe5cf330156e350f6ffdca9d70f233318365fe9a728b072c7cffa0ad2319fc31b6cef495eef099f58ebe88588abd894a0c232830912661ec973d785e05dfe3a11226dd27560292e334ee7f27a1cf4185dca0b101ff12f4d43d1918307e68f2f148237cb9152bcbc37940af88fdc357820fad03a4b9eee9c52590d32011d99213c011482e227f7e0cc044d55a0ae5503a6a342365ca191c20747874083ffd2f12d14f149ea03aba98bd08dda2cfb81a9f4fdb1c6caa7ecc5ca24a22a994aeb04f426f982e2956311cc532a438fc19ae62379ebd110ff0f0b7e0f19908dfbe91553f5b24dd0cb0b1b9e57518921460a520acfae6a7ec75216f2adeacca35bb7864e7a29fa7d6f4a206a40689ca3edec2b2582e61946571f486dd8ff39a6cd7a6f4ec9686ea6e635729f713cb2682722a914d820c5389dc2764944944762345cc9c58e8e61a695a4f0e44e4fc51ed24664954ce1c917320de4a3770e18a6d4f7f30be8ed21725c5f14fc182a9a373bee2ca5463e78a6623ad708237ce3e8cc7ae5be2c56a2fa16944487f4cec806a611b54dfaef3fed8655c5f324d7382c16557964b856f61d4f12ddc62c63a0d1d7ad4019a80ed528e4eb027a09bbe9156eff0a49be78b24fd2382c33a480e83bd230c51404f2224436d978bc363384dd9366f4b076364808dea71b9bdf294589977097e392c7a4e7bd5437a1050c6dedeefca1dfb46675115208544ab8c11d71439e4e80a0add6454692953b4d5aaba55700190e9f0c4a6ba09f838742959b7fb5c505abae8d63e10838e1f64d74f2b340ec6de63c07a43543f4ff42f66636114e836431a49f819632e5d3d3343217a97a28a630257fcddb822045997646956b6851b5d3e42c7ab2c202cb32894a950d790a4aa99f31ec662194f07a38e758a87f16581d3d06b841efac388f3b982649a0555b1aeedf1fa630b2164ab9d092134ad9737aaa880e22b245da8d4e28200eb7b16a767498a9ca16b0703b88331c061cd06606e7e31d0dacac8fac9978fdd1a25bbb7607e0550f36b977614699d021b49528df5aa72a2877df8bbcc0b54f6c545902d8046c1a9d6fcb0fe5eaea626874f1c4a4431130c4bc5bb1760ce66f85f3f1f2f2091e1338673dc1d3e9d8048919971dd701951d167944479726b647795d850a0b9111005977410ea3d8faea2536d469e8763e9b9597943a828015222781ebadb514eabf972379fe3ddf778df73ebe9ce1f85cc7e47a73a871f5b8671eeba2d64cace89526031daf0ab4bf7be42b4b5c0e57dcea218c07d0561bdbf2f55637f2ecb0b72602849c7824b7a3fc50a1be296c23816249972865869ae986dda92d5e1fb04bd39891da4afcc37fdca0c07fe8d2b3eaf8d3497804658b17aa7826e7a356f221880201bb0d51b308fcad90bcc33c1684105926a6a679ff3a30281131430fbb1a12f52f42333d8b411728005ff99915960c8ada0ffeec64286840bd834d257984abc1f74ad4c16f1a844115e929932ca9229c472d68f5089fe242f224c3248d6c18f95dc7fa255c6a531150312484ebb73fa03fbd15877385f075ab38a7e80b081b24b6335d17fb1d03bec51ccfc5e2842ca5bba3558e039c1eef37ca818af09865773f2e639c7df4b30fc621c2ee821428fbfdc2c9f299e784d7dcc518097c90e9eb8cb6548e76f4ede02636cd4f1a3172f4427b5e3982e809d9dfcc6ecad4b62d5b37ecd3fb05b37134d2efb36b9ed28b75c112072f3def2985c6c3facde4b722aedd05194118e219810575265ff259835ece0bd08b753e9a41f673d1cd2ee3c5e146104c2326d13645dd8c4c1e23655b2aec9c131accdf28f4e9f1782ded793152fbbe54802a00c36f66c1619110684b4902fa29a9c8b731aafa9b4b7ab9c053f1dafbe53cd8ae8d9abb7bf003dfa5dc98db8adc06bfe1f7c608e2b7b62e78ba0b6006c03d91a54ec620775342f33e56afc736971a5ac23414aae153a68c354c4e5d82c4c284906b088d280a56155328a2a70e2b6fe8e0f9cf3b045755d9042e698df512447af294bc92d30f3bb71c58b3a8190efe7c9136a2def1c3b304042cedb552dd564304c939f34f39d48a4949de5726a3a8e25ce783f7b7f37fb1368f0de6f08b2511023b66c770fbf8f995b87206824b8572a8912953d38a8e12c6283b3fcfecdaa08408faa52faf5cb1f202efdf5e99d774cf212f9b06062829681b68671876cca9af15dde7e6ecb728d84ea2ae30392cd559405a5dbfcbf4dc785247cf0e76ead7f3fd8e3e95dbdc88adc457aed6a3dc91bc6d9a543a842c11475ba827b457c4ea04eaae68e6835dd1f2227eebd64a8b688d8f568bd63c68a578a854c5a3dd83d4f0104530eaf236323f1532425f99878b249f657862de86845b1d17fcf78e07da3b99e94df19fa0ddc356cecf908c610ffa451912dc06f3eac6d20cb70c9b4c13db39b4f4b4786038040e14c7661bf6dd53d3ded4379c1c735fce1202389e183ee306826de39f44c4f144f647777cb1ced3dfce0b0e7f0de0dc22eb79534d171ce99cbae8eb388dfa888014d53e975d524e906f25359fca13daa7109f6656c257903d8a119063ddeb68a19ae766fc4db4a8b0b5afe5eada41850e5000c5614cce95bca4e907c70030dcd5b59485da006c340b873d4dfa03ee223836033cfa6de268c8bd64aee8133a5e1d2291cec1088314a0bf036d240aa095c805513ea3efd5ff416fc2814621a49280f08d9bb1726824a6a1bdc7ce75b1fd407bffd3906b2b438e5cf30e67367f6b4b2b4ecf522dba304b0479473222b5fc47bac215b9bc1b5724496a7b6b2b14bb3d0679e487d8b6af91495822dcc5539135ac8ed9a288489f713eac07b9a636de97b7ce75b153c72990b6df076b3231af8da89fb04468c0d31fd2201fc0336ef392a634c9e9a3c9483c125b28525bef0e7d8a0e4994460e3a1054a1c8fb258372d5cae3ec104caba34edddf890e8412e0aa3a7908c53a5e609744b9319c035c57cdeacd799fb1f975813406ca669cd90f2130e23ba213f37e85a2936c8a9293d0c6a02cfabc709fd118e5c46c8cab74bdb59fca4e08be797c97d416edcb0bbd0764d79fa2026755afc7ea824024aa285c4595a9408c864323f18d8b85af36193aff4b250635c7f04b34dd8823cc2af7583f6522c6dcb77bab7e28d004628211bf3fdb1d7acb59f5570c6dead273fe191f2c747c6170ea3f9ccfae73c2a419a5a1dc524c90e50bd2614af22573691b2121757c9d2a35e7dc0a680e2907d93781f41b80742a8123509de7376d84e9eff653ea2da5e16a5f9c897907559c0d03854b0aa76d6737041dd53c1b7ffc74a1d39d93fa86208fd18619b963fe05e42543ef8ba48a33cb42ff3ae1cf3ac4d4e8132e36d46f3117291f4cc74171252badcda8a5e6ce83dac6e7e2494434436a6e39525fadccaa00e934b9bfeb729e8ab582c8f9ea6a86720205757c9e6f917bcf4dfce88b8754eb25ebe19aa401aed9aae1cd0044b3613f1e6eb03bc59acf8f0ee892f8a3e9825723645936b5436af03a4c700e633bd224435a18b1d8ea6a599b49607344a70739301a0128d3c465190f8ec72a05d5086561eb8c1d01ba8c3d8d245da02dcf5145c304c025e8212de1e8534fc7b00e89b3a4db0e94bdf67b9f0bf9f6e93f3c43fbb85f861e428837a6be292107c0574921c181253ef804f9ac076169ce2ab4f131187650c7c46306413fa762932d68561da75186e682e1f80fe42099ca8780f2a65ebf0d6172153ef208c3f18b8bf33c5edb70b8ee6787a655be49cd7c75deced11f17ebc0cbd19464a013c7bb5976c6638ac169c8f0665fc2166b4215f903408a3b16c95e328ad34d443bbb7dc5ac940275e8cf6243af430d021146d8b14bcbebb9222f55ad6c847388bd2b6f49de65a31ddbdfa5f60d5e1f728fe882f464bda213f8a4c1842f774ca5d015139e579b0f0a0788749346c78f5522f811f64712f689849045889a846ea3a1cc51d2dcf3daceee25f5a31b2a65e207e6492d3d4b00746e458d785435443afc86e6a95c35c5f8f1f8058a298215a810d1440d657951a4e66acd07acf8e8afcd65062cc797a2f280502c7324598eee46e41428f454844fb98e8a793f91cff0132882d943a86eff0afde15fe8b4a2b7df17f9ef8f58bbe5737a53f4234e3443911576c0a03e4d3d1c94f1cb3bfa10313bd766637e94e54ac462772a1bd150c1ff71021dc002aa464b986d761591a3b43fc3b9d159af28122df10c3918000b8ae2dd1e122bd43b0f1f4b74698e027858366a79286e1d74191b06015e581da08d7032d4cb86ed6036daa87dba8346c037e0416433dc6efcdda8d23486686c5d9aa61493dc101ef5ab40cdc97c9b60b3a51e188160a724a9e34144a65666857979ac50b2a44e42cfbd690e70ed3dd30e4bbc3e8a5c99b7b09c3f1003ee5d8b06fe85c367407b5df015c5a270c798cd948adf466da841c654d54c768028bd48b8c3d76769acc367ad8451bc7b6412dcb308d22a2fd0101ca1d950652f0c13576df12e0899ac184e88f30515a88846213574aa3fda9703873f2e3a4651e20b3727aab790445a60022e54a1580ef8c01b980655f05f3f44f6fb0a6a7f711b435a1245f41c40cc9ab6636237e7d3c09a2d59e4c13249e77810a2234bff6bb03cb12d0c78c8f21bf962e30df56dc92966cdbe520ad2d27b80f7e0b509e834e04b9580e64cde6c5b30958d11ad40185b91c3a7386d1d2143dc62cefca2e41d4a17f1250562e361f68c6449413a860620f3233639c732db1c40bd1a47572f296123739ddd7af23701c3a803051fe8d35119844aa445e1243b7a87f689c4e3ecbf0400b84aa4ea57cc332c35461c57f9de76ebeb825117166a6b0ae71b594ab258270d999b2cf7cacd937d93f259f18131b58e01b589afe4ff6ffa5e4c811b072e4fc9d8a4a21666c979c1276f7e2baf971411ab80f8bcbe4239c2d38b90bade2a4c1ae96eeed22bcae8f113414972e187330f318ea6d662720856eb9ca12c8506f3efba3fa078176e1f26bc652ee8c06c2184de98a6bcd92a1e2a362678e1032f994008254e06906263442ebb6b428a14e050b1a3f37a8ccaf28baa95413b169ecf1cba83b8d7dd358b2301d0327e1a8638c44085ac13f8cd1bcfd49bcfd5a6935dc10746efb592801e5cecdc2851231af2eb0ecc806eb34deb8921bf822aa3aa302b542542e9e62a490e71ff04293002ee41a29107b66bff5b05e5484cae062230a0d973e6cf81b059fa4573fe6bed301573d4f711ce502f666174da9e655ffd218021b4f081eb97de9c2e75362d225fdde3b36724019594072da0e3be202c810312eca1f983f8d1b4839fd5c2c6df1eb09d79d8598019f8a8beac523140055afd9f5ca81c464cca30debc6c934135a802b9e56ff6c86a6ab7a36fe63426b02aa730a69a672cf487f15fd9515bdc7fbfe2adb45ff380b1dedd92e6a4951f521598501b46ee364a3ae82b22b3ea9e88083240f32ea9631457973481002277c82dffe08d04528e77ad7a233f33e2253cb170b753ac2dc4bcfc33ea799552bff308bc390ed62b8225fffc224149e229db0ed5e7bb3aa5ac4246cb35289a39024b48873ec96e57c999a0b412d65cee5d2230b8bc2a399e30447990ea9a03ae61c27f039a545f3542560c12575a580d20bccd516a7221e02550e079a4f16377908bbef6c6c4b0d93034b1e2ea8e2014fe0204f5ba516d600a34195456a6de91b95a1b7177fff3ba17c37f2a1f78e147bcf3b5e60b5fb4eb2b72510005af3e0c2bd3a8e53f5944a7a125d88950e3f27750aca5011c790fcf396d3a2dc092898318b8739d7ec9902fd35b1bc74996b8dcef104c5b40fa9145affe2988024736dc86d130917c6a271621c800507859cedd1c544bedef688a6297c8426e376662e86b8a5346c5fe3a8235aecc5498827ae6063085ae147a16f4eebf101ed7269d609b5105890e056b278b59ae31adc748121935eb71a52fefae5d6f519831e21f560217bc8d1b6f0230ebf09e9b3cd5992876833b0a3565c9003345a71208c506f509891940b01dc831174efab489b4142e332ae1d40d96830e7b6d906775f1a65fb7508483028740f00a6bb097a5d0c4930da598d3b3903595b42b6258888cf0915ddc171929b14055e44db2790548dc0a3810729eec0650d605f3a5f8fbfa2b48e20fbfddb67acdfc35f57383435046a930bb45930d8514d3a69f255bd8b1b89072c2864a17fa873411d3e23b251c8079d739b8dd6a6731eff25dbfb4d0bf0e06f1738dcfb60f40225adc21834331fc0613f264ae0d32caf39aa9b408d91d986dab4adb584104236217b6fb977b90a9b0bd50ad72f7c676a01515c9bfb3abdcc85bd2893e1ebd8652eec34d9afcb6034b666bf1e24c3de7c04b1178358ec4d7c10c31ebf96974f487f481f66f683cc7efd3e85d097f774dbf34d054ae755b16a6bc52edb73ca2863cbbe7ef033e70cbfd2289ac39595afacacd8b072c50a137365a5656525c99c527e4a8acd2933b5fd91132c8d13d399b7ca4d3a842da63cc72fa2a8c4409e97365e5d6fbce69cafd8c474da1a67deae6d522ca6eac54a9697457723f14516e2a21382122b58c146160e0f78f9519b30a3a5839e254045905004100b5bf00117a668a20b4280e14aee69efc90a493296a3122b002187a81f23e6a9041aec1e53d1464a9e974744971a44d529943b98a104429e2bab9af37385046a99a91ceeb3a745fad80b775f832d5282f7ca9f460d608cdb9d7db565aa82602d12a851b3597ab8fa3e1cd1a919c41df3f593464495f9991355e6d69debf067eebe08c66e91119108cf9400ecb094ac999adfa64ecf9c3b8cdc1fe669283c0d608c2b1bd0ab1510b9d2abdd906e70e53794a8324b9146f4a20b66923bfaaa2da4913d3ce1ecc36c5b80cd09e4192077212cb8fd046e47491e196e913bba621cbab14b54417d1ab8d9cc2479d880a20599a93eca860dff98a93e4675cd70e7a862c9304676414c5d65f8404c4921f017e61652743ea0707d605d0e5ce0be9b13c87dfb6efe43a6240f217287446d91842e071f594b9a6559ccb2a989a808ec0e635c5946fe618606224bc518882c331cf299cce0c61c9e6e18d956796e131369540f99a9fe35c595f4b9e525c595cf3ae36293c004ed8a1137946534cb75f95ef9646fb1c2955d9d3609cad54aa7798a74cf10bdd34b74923a044e919c2264107f3d7c5dd1d9be06854c95d4012241fbedaa9864b50a0042d2e70ad98a564c81440665994329942576c59b1d1c2999c8a12c92e5372cc6188b2891e53ba7591090e57b27baf412ad9252744a89c8434611bb07d1452221aa541c72b977b294aca8226f7282abe1992331da175840104107d4b064c2109080113c522f6f32c5953af245b6b4ef55a3e4af4f9621871a1534535248257d664a5eb224eb4a8b256b87cf8d0f25ab59588b7eb0c594ed0a4e364b4b99c5dca17369a3e49bda0002ba8e70c3b993bbb25c328b46f50e9d3b3f8b344ea3628b8c603212c4f04c0940093453fdc9538318fd70d15cc7b8575e31e2862db91becbf4497a984dcd309b9e31462d422ef885190587015105372ff86e8d258e4be6dfb3524b9f2353871eb25f61a925c992ffc830f44b0dba01d5a74ef3062c34406578e84a8172645dc38453db61bf376a3aa060665e8ece0060a236870040584d8c1195c78018922e4203ebe6c37aa62169c88220759105aa2c4aa025d6471849b1e089182240cd86ebc31fe14e3638cb7313e2e204529b5df810a28a554501ad394eb88c004892e5aa6174229a534bb39afb7f6199ee16eb1573bec35a0adf6433dab18966198663b0d3d476507d3287a1320aec56e1f4476ed1c4541b62fdd3739763d367ca4d67e8661ac9da9b8a525534aa90eb6841f4dd3525a9665349aa6d96c0e810992652ad0344dd3324dd3b42ca708c7cdca7d1a37356dfbd1b44c7b5f1b02a369a7c934cd6699b5bf391967a6ae679f766ec357e7f2dc9d5ac31717e7078bab53abcd621a75dd7e2d6a332230d165cbd7875627ece2e4eb3853e5d59b33557336a6b1167b74c35ea5c9f0b675efae3b8d057fb4f9a905b118d3cc773f5bdd8ed96a3fbb69389aecf311d4de3de3b89ed945dce7d567efcbcc8b300df7f9e66606639f3dc6620fc31e7d046334ec3133f3286e015f5a64ecec2f306fb1875da09fd9cb6cb7d969341a9b5344d3acb5b787b1e7b4cfabb7df2e63bf611a2c0413b157672bc21653b62055aa66c52fdf0f64c8f461b402884c6f633fc854a1266a945153750169b0ff72c96c4f5b984e54a13888297af9704495903c23da7f69a054a63e3748e8ceef870e66fe66a6283d36319199a2af210b5726a1f23ed7ab5e9dd827f6b961bd8aa0fdec1741ac719ca98989d83b55f342160ab5762006096996d41022f1bab972860851c1e53e7a07d17d843d6c843d0c63dab50e0b51c00e2e778d131a3253971013155c9a23d869b473a7e9be9dc39ad679158ff0f68a445f9d99ba84ccd475eeabe18b1824c45aeeda9086894c0d6bef84d4f0c56d8b3d6fd815e359ee31dab93853da2de6f0ccca4c5dd8571bcbbe2b6b974004354c73c47698665e805ec3de05e6bd4cbbcc487b771a91f6ee11c4be9a376da751d77b783200d0f981cf0ad4aefdea641dedf3309176bb8f2ecf65cdd4759a9e7c5dc33ef97a046bf842e7da700d5f5cda63e8b598790fbb628bc80f42ae0fb9add1cd1653b2d237eeda63b86bd893d75e03c688ae69dde7258ee96bd7f0cca8f44930763d3a70811ea639729d665ec334fd0d03ab89c93d0dc97413a6c97e4b5f05b76c48071a45efc19048d94df0c5f7b097b29b5ce6be84692ea689a36fe565a6288d3ea898fe04e7b5c7cc98be57b1fd4acb511818bb1e425c4dedaa83d10d120bee29c8f596f993d00d6a5996cf4fec4edbb967df1e84766ec3352087bd8a6bf64cc3a7b83ddbf067ea3a35eaaaa7c9ce9d667b77c9558c3e26c31ef62c66fbfcb63dbbccf64c3b383d1891c893c9becddb5948a332d09d0f998534eafaec606cb66bdfe88c728a4e33fb3c2bfa32ed32db479846f4ed1a466dd9779aa9eb8a2ed843518ea87c3d44c9f151aa4e32753dbc329627471b05799b9cec7a6c33da338cd21ebbec14933dc3a799b2b983b1a11df65d14348b86027b93d166b11866452637f7d747b3b3ba6115db645bfb08468a5d661ec318a63942837d5e7ba6656d02847d7fbe06c4de85af8b5e1ca528c8f113fb7c0c463f338f9de218fbc6337d4bffc9eea964ab8f2994c65338244b6931955252798abd2ba6ef5dd803a23dbb8cf62c3b0d77ed32d9bb7798667bf608be74dde82348351c672afeb4cf16532cf67d23bb759f27471ffdbc8ce81ca6e12efac4344762383a82b119e1eeba4c80b8f4a2d307c15df4d1c883a1d893223ca7fc0cfdc471a662b8cfcf9a2e664ae975ac07ecc22e7aee34f3a20b7bf5f41e77896326f6eae7e745d925ca362933d1a6e1ecba9eb993e833dd45f8ced4c571220cc770eff0cc84f9a12c3d60efc107cb7d54c61df5da37a34aedaee2b8ee13f9889d0cc2bdc31e16a4bb0873a78fe1b0cfd073c7704c77d1457866be7b0df8d25becb64bd3b6cef220cfa0f6dbe1946d77aec35cadb46a38667ed4f5d0b44b32b909a6b958de6ebb5c8fdfe2bc5f04bb5e546bdd6eb16fcb30c530acd6cc3d869ec31e16332fd389ce5d86fbfdc534a24df47939d44750d4e138634ac51a5322f386e56d86976a9ad4e84d3e6f3d20f5f4414637e99b2cbb1e5b73269fa7d1cfd3e8632ac533474c469f21bd8aaaa6691775f785da4511dcfed2a2fb7920c9e4f532a58a698ec4d097ec47fa8834ca80b8b5dee414d3d097decf4c1e536f720dc7d097be51d2e9eb887ef4faadb9fad163e8754f1b7d9e863d20a49b2e737f726fbaa7316da3cf8331dd9340044d9ecce89bec22d09994f947a332d2efb7d9514eec5ffcbeee27a6cfb3f73aec0119fd5e86f413d2ef258d4a1a961c3767d783f4997bd2e8923e7a0ce9233c734423693866f43bea2f3ce5eeda170ec9da45ddf5d0b84dd3b4a821715b9946954dbd10169c36372de0bc1016ec13d828b0e5f678958d102de0fd8d05bd87750137b653c00d0abc0f4937dcb480f7612947538e6fd2b1114fc290fed2db4ae726ba441c9e15a5f492374e2f6fa64a74ca9d9e0236425cd05e080bde9b9cadea164cc8fd18da21db84dc3728f78afd42ee56dcd196b580eca10543ee47a9809b83d9432b86dcdf8c6ca75f6c144dd1731fd7296ac1edf6bbb9e0f6ed1a6a547f1271fb318fb0c851090b895c7d9aa5b6b2650de5be95a259ba59684d0249f6e191c4dd2827238fbbba869a05032708a2ddb75df3f6cb7a8851c5a3abc799d27eccd4cc3e9bec5c2694fb6196231f5a4a86a8d2e73e4a8644403ffb8438987ddbbeedddb5cf8bd144d8eb703f07c69bf566a69a0651a199ea675f9407086919ba1c3a4b2074683555f6260591070644dcd1d82aaaf4eb0aa20a3b414cf557560840001d3a3c2fbc864c5adc106b85edd35a00b6730dd97bc25ad145941bbbf6740d5d5cb821d6ba86721f2b72c30a45ee6738395385fd5c3853657572bf72115558ab155de4fb558b58595185f1cc1414d1a5be83c85d5bbf4eb02462b855c310622d304e40f5a7b70663e703bbc195a714603c5375edfc4cd55c4dac3555cd8498ea77633c3c79defc40c156e17291bb95bbc158b54f104086bef6892afdf9b512e28ebea975e9431a94e1ec5c3e3e3b5375f95c3e97cf9cf7c97d5d3bd78e6de9e410b5c2c4f52cab2d2bbf79cc99e36b4bf298b87dea16d145e25e821357da9fbe05ea5b96f591dd3c7673c33814946b6ba64e15555b53d53e33d5b7a1bdb595bb83668a0034b8218d3358dd41ac6d7e3de430439ecfa1f3c4dd335303a0e2ca87374eabd313b698634ac8fd6499fd74cf5933a046c9ec0a9e1b5670438e8727baf454711b9eb91771aa4d6893ffbe2d68a6b2960b13773eb43f05ddf9f0b4821ac39d0f512f2d54b8f3610bcc8f1332840479121188c81024eeea872557dee028b971a6c24c28a7b2d655c60db35687bd9899d13bd127c25e8ce8355e03cfb49125804051cc51090e52905b8adc306bc91ca903468edc913c274eecc89e99620d5de9237f9e031f092459bcb8f3a1049241524807773ee5055755c69d1f0d8d8a27ade0d290bd7e3739caf1c46ceff08c17d30960f46d7e31dc4578c68b11a12e7a0d3873cf1940065c926651c012823839d4ab3bc60de550df340e8f17dcb06f3aa7756cc8b961e7f44ef39c92b861ef744fb35a5a70c3ee699ffe51c0116ed83e0dd42d2bdcb0813aa88506b0c40d3ba887e62a071737eca1793371524e70c3793373a6ce13379c397987c78619dc70eef4b06c2872c3d9734777d42262d349f24384dd000ac050820f9ac8420b226a921c6141149284210c289400ce6992e28673ce1c57b8e19c3387156e38b94ca50005f8e690ca475756dc700e657a43717e6e486f680ed5c90174439a4377280f02b07043ba437b28cb94841bd21eea437faab821f5a140b49502c30d29100da2422d3837a44174a8ae5a726e4887ea4dc5314d71c37a5373aace0d3837ac3975a7f2dce0821bd69dda535937b4e086b5a7fad49f1c58b861f5a940b5d552831b56a01a54854e53dcb0069d00a50e5d2b931137ac43d7cd85c3a3881b5e3757cea5830023dcf0cab9762e1e941437bc7638d60b8830e79c3545000de10a4ce8818217400040420915742184227c4108bc7a2e168a75c3abe7f2b97e689c71c3cbe702ba5a2824dcf002ba822e211b6a70c32be81ac25657dcf01acad80d8693430a37c46eb01c4c0705c50db11c5127eab2552b8924b0eeee6f2bbd063c790d48e335608dd780de6b401caf0167780df8bd06d4f11a1000af0105f01a30f51a9000af01b98f33bd0644790d787a0d68e335e08dd780395e03fe35207e0d98f21a3000af0151af0107f01a90060fc4e0882dbc80c50a9080450e5198c009521cb10324e080f2347c18013eccc4ba2136800f4b7dd8c90537c4501f26800fbb41c40d319f2c1f800f0302c087b578c0e0861850964ff9b0201d1f2664848b3f6ce8fbecaac8fd676f66f82c4e8e2c6e686fb27c8ecfe6e0f8ac0e029eb8a1cdc9f2373ebbe37d96a785881bda9d2c6fe3b33d353ecb4a724f9fa5f1d99f9992e7d1821b5a1f0b74f2d916ce0d2d900d9a29f9d26785664a1e15c50d6d50b643ab94206e68876e701010c50db31b5127ea649ed3e680865010c4e89d1c584e083673cec961afc333dde83520e935e0f66dd88bd944f735a0c96b4079932fd3217d59ce176e98e564a32fdb99297953cf0db39d8c35b39e99925779e18659cfb78d21c4434913acac2579cc7349c81df22d4a8fb35aad80d056cd32b3bc3604106e78b422ac1764ad6c48b3d16e341c2da727c7b3d3d32c219744dee196e090344b65c2891c72daec72e8312797c4ec7a6c96eb8e9e7e3ea0702f4ecebac8566570385c8eed7af4e7e723661f50b857a6ef69940cca5c120e49a3e4c41c4f0d30ee7398b578389ec94d9ed923f3c14818586521f373c8653e599ee399aaac25437b793a6b75f184d01c9af259eb67aab216de2134050575ee8733f735195dec1b8759178dca821a250f1671fb61d6cab285b3a01ead698f5d0f0d4f2ecf2baaec60cafdac9505f5c7a5d4684d01a116d04f967fc141f2544a29a52ff3c2b044227ba0b005125b1cf1cb04240c98208b1ca730d4847c612e74724877b8c8a1486808c28d4ab4e822877407892caf058ea44880881092c2124040440455c1059b2a8aacaa08a38c9ad0f4ce47fd7671b2eb715d12c36ce7030ab79eb39d8f1851f51bad7f69fa0a2671290efbf1170efbd9b30f87462169947c773e58cdd258f620d12c18fe41c27141727b926ca38c7437223a5d8222c194d5221c9bb21a25ff53048b309410842464610b50462eb20083244d3082153a2d505291240b238ca1c7075b380228b300460aba3042893052e005284f0031dc4e29e28692e74e557779ca3355a2772c3bd7bbee5df833256be8e02200e88692e7c23cc83394dc04f0dcbe890f6ee31d1a25a5a43bdef52865c42b36346ac589bb514a795a159fb092f247660194a594424aba48821639399448326dbad32c5149174b6479ba04bdd9e99eaf3cc87cf2e25e4a23dd75a5bad0b7bf3e107450d6a16fb3802487b2270b4b6479894426a9a1491337a4ac2c4f59ad6a017b6e0fa28a3c5522ee900f5b7207e52b8751a63b4cdc50d29d2c3f83a64a74897140b9b31e201314611c5ea1c5ae655ff88ce1b059fdd1c76e8611efd041466e0e769848a7623c4d4ea65a5849ba8383922c0c6549774289790d4040c65e33864309e4ba4307e5f98e3316000c37aca1c18609cf8df4e73485ed86155c5674e98b4e2fe6f262b0993b533276242f87a86408389e8cf56468c0d8f5fbd36162af01f108929b5f631d6a2b19024eee3e429e5f5422849bdc1f9178841caf7d9e0c47a3d9cf93b98e05d98e612f06bbc52e1c44d37e612fe6babdc533f6d76bc01a90c32d336d3bcd14765ac1fda9819a35e5db67b66ad3214be71b15e5759d5e1b55fd8ac37a0cd3ad5eea908aefaf8696a0bb4fc0842d82b1591e51f6212a477b2953f6fd61f6f28bf6baf9026b660968cb1f6b450b72ffc686099161dd5378b1c252320e0f78f9b1b59880fd09b96f4fbf91a392d60ff296a3921612395c6959156ca823b7bbbb45dddddd3d3b461963a4747a0da8b91f7bc85b902593d954d496a9ea62aa4fa8c83d31c745d9222eaa88727489b944cad1cb9a529c32436e1a9d4a4949b923cec4a196b895cb25cb711cddc296b8514623cb4fee9eb8465dd9cae1a289eba185a1998a3673a6168ee972a61b2849a4541cce882d72b8d27337297449b0d00451cfcd7254820524508185206451b83547255860022509d6165b38333abfce9bec4b8a6b6bf226e34f96386fb1e56caf01b173c4971497e61e68de41fee4b9daae296a4b7a4d81f560d21976cb963be6fc35c5959f355e3fd8361ab470e5bb6d0a0b2e16568123a30aa540f72a014f8e17d0956faf017276a45de05cfd63a69ab2605e66aa4f03179395493a33addee0b158d7835228eebc3c364d3c3e2a7e898235e70eda99e624bc8052755d3865092929445c2e8587e26851744aa63ce86dde30d20deebcd7f5a18ce40842cb4ce508c29d189d9287e421b720c50f0e2c29a2e44173bc0d3aa36a031113c2aa299247943c668e375d0eeb7c482c44bec7fc64dc41270d17250fa985962a21920352555f310e9d6a16c9ba9c953ce255b525b6f898f26523016168d925352dc330387084a026f30063733a8da33c48ffe45b8ed780383e2f133de65ef4ec223c7324c331dd73e0191bef7ee335e0b665dba6793a3f27f0e991432091e9a6f52469968ac43d8ec7dce3b881673cec65f71a9eb181bd6c1ee531fd93f74fde1dc3ae6a2a99902cea84393b533611ec56a9c6f60d82c98a3ec6ebe135758ae21f4e5375dd34eab26915eb879956d11b9913dbd81cc1e4afd3cf46881590fee682f3b1e7a5b0b9dad1bdccfc08df799a7bda607882bcf2f5764274a9bf3e73a66af4930aa6092419920a720bb9853c75f2a5752fdd35ba1bc3303a3aa5948306ca099f98babb49a41a271d07a9c637c9e18ff41c9fc975d478cae9c3f1d257e3299e0ecd45324102a9924df0c4211e4cfe342679a2cad561dc0f2388aa5642fbc421db30deb39b4820823aee7d36f839be793530cce954e393383ecc86c67360893353d7757c36395e43da788ecfe6e4a4d7f86c68dca483a20bd0d53e570be5ebb252c7aff74fb7a60aff7a0b4d55caaf001cc70580873d94af7993af59a451d7c4c1711bd7c1ddb861e3386c5c07f61ec11c3a9ee332f81e7e0e7c9a7b1ddc6327a238e0c941fb8007dba61355aed6c95787c3c6d74a882ad7fb6ba05e824c5da7fd84dc3eedd303c603867ddc932fddd168749afb089a4c71ef47975522b92e1eb47b1d86c18163fb7880b101c053ce610fc8bd8e07191ddf4e957701741e101289646282d3f5f0809cee3de674effef40dc7942e003c337a49a7d6f8be07e0fb01f0cdf094efc6371d5f0473ccf01bdf24a7e3cb71fc798f1efe60706c920bc01741007c114cf922a8e38b20fe22a87d3267df878f7b65639323285fc78181f2759b1b580a7958b666eaba0d2c7f66ea923853757947b98d8d0de9a79fdcc6c6e4a5d338a9c657b3d299aad22f5cfa4c3e1a1fca17e47482327dd7fcfd46a78f21610f7b698447a4d26f097bd84d1ec18b1be89a9070fbccd47512ee207b51237c5d26ab1a3559d758c1e89d68b4f95c1fd1fde13811268d48a7199dc39e8c3a3b3839240e47670727a769e911cc329db35fc234dc9ba6fb3c097b1b259dfea5339e1c1c8ae365b7bf2e6f90648f8d53c9237fb2c00192e99b601a91cc7cf7ec034233fafc76bdd249b2eba15d7698e6080ce95000676a40d26f7c12f432d365ba9b4cda63676d4629a594524a29a5f4369394522aa594f494524aa9a4160beae17a86bdad449254528b7dc48c7999e8f3b273ef5f18c6a6c64f41e6390c847b7fbb26df3a934e24f2604a24597f7e984ea593096e1161123ecd143d8da6c8c6da489c994ad14b1ca15b47d74b1f99983c5ea49356482794527abd9380c9a743cce1ba4c4826249387a74c225d8f1f3d9ae093f8527c09c8c908db46d512e61a752247d768542a5da3c751e9924e71f85c7a8c31c6f853fcccb1f3314f3ed351be791a5fbff4cdbc49eeba4e4d3fc139cc6c824f51858e4ebfd149a39b4677748d3aeb615d1deae7b1cb12849185ca76c566735e3a5009cc4f07faf9f98d7e5be5a69d36e2d0074c077a5a2b90ec18b69ba43b58f4ee984cfed20c2f993ec3694a7f0449a5e3cb98ae03d3cc40732466869b4ef3979e5de62f5d66869b3090d27f19d367d8c18589831b2f510e83bfe1cce8a27365cfd4747ca27ce2f8bcecf93e734c56168d9a57196a7c3aca75d830a5a4a03ce5a71494ebc8711c8f9db761d965df9a9352a6fcc8d6346919745bf3b78bd9cab22cf399aa193b93d9215e60f73694385f801ce0f4905d4aec2366bb854066ecde865fbaf41cb7311dc7e5331c4656e95bc12d26930e9c721d37a152b00eec6dd8db3a29b3ecdb7888dc77b1e95e761d37bdf4e1972ea3039b8e71e92fb3f445d054eaefc6bfcffb3f1b9fe1a3f12d87fd2440e39be4727c358ee32b3dd678e91ecce984721c5f04f3f745f05f0467f82298e38b208e2f82d80dec611b1b1bd8a6068ed386066e99a9398f824f33357f12e3773871e3e319ad243b79924229458c35dc3372773d362cbb876138ad42c141228910923c7d32fdf102d014b5849830ad109262f64816b6653e3b2c2779fe3621cbb26c760d3840eeecd876195deeb77774217ddb4ea38bc9bb87356f0fafbc3dc44a0fafe9f4eba892fd7ea3eca2ec5d762e7b8c2ea7a892e1107bbde9b35f497639dc7e3ed428af49cded9313b698125e13d6a5bf97348a1eb9c7f85374193d5e1c4bb8913eeb704f2fe68101679c714626bd7e7b8c2c5844d51a9185d29fa24be9f4762b7d97e957e9eb4ce3f346efd338cae78db007641ee5327d1a9f47797739cc6cfae89bd9349ab9f4fa120e6be408e4e4271a1fca17674a9ee6776f127f7fa265f6a21fe9a1071f6eeeeec3a9071f6ce6beddc7aefe7eb651f5a3cff37890993eef605df990765f479578ee935125c667f1b7ab12b6ebf1b228b85e7de798e927ce486884bd7a2fe99e964ca28edb465a6667c934fa48177d77341add9b4c1e3bafe25ba229fad3544d2c5733459fc393d33aa3518b462c1f9e1ed137fa583e3c3d2e9289a8424d2055b20969a235a93b0ffb37caad2410512599c878e4aa62c9c3238f9036dd437cf413cb3d50fa8d723d5caf27611866347a691e18136ca3bdabd9b5db70ef8e903cfa26d3d1498f199d846746af3846f48b677ab3dfb273dabb9799a2a774a5aba1cd3141e708f6783711e95174997912a6f1688ec4783438642be807a8e56f4438dd223c93e3c6bb5b413f4047f57fde0a923fb17be96eec6532cf70d2e761cf71ef378ee35bf4b673d74e0f54e394a29c92a80d4a3b4a296906d2ecdfc66b64b367b0d94f96fd007521540609a76d7e82c4a01946ca699650de907048452809474a29e5cd54c9244992649a2489dd892a74e7ba97fdfc785f8e8f46f43e8e8f26c771fcc64773e3deb94f669ef4ed03324fbaf6c9f4459737d77bb6b5711b1aaff11c1f8e8f669ef41bdf9118d1fbde4743fabc14028a2e33534a299df432798d6f44e3bbefbe93a37ca6d24d6e733f22914e4c784809dbfc5c1ce447cb4cd1169dac4957c0bec5e82292f1d7e765ae4f2c53ff99c2308c0235200f89053c445524125d44594a20b2fc9066b9594689539065fc90a99260a65d5e4aec37488278824e5bca8fd4991d779a253c5d9d8b44b3542478ae4ea459525a0023d783b9aea98a5bb488ccdc442541318a21574abce0c9a11c42e2c81ca9c3228190bb3bc9d3a87aabe11f666a88bc91393325852610418a7582ce33db9221bf4c9537ff63aabc893d2094ca474c132fe325f6268d3cc5de8ce0fceced9596a36cb0c5141e63dc7e0b608b29a1ed9f7e82e46637cf4f37115d1af7135acbb4aa6d73fb4bd7182d264fd35e7e3c94205fd8c582240f89a990dc414f8f6d21ba4c4cc11055e8c121dcb07fa8d054614075d52c36cd624f5f6fea105d716a919ad33fdd45abaa4da7a8a521a57f6e0465fa28756e5f7eb548bdf96ace5771ea10d50668aaa85c358adeb485a98b3b1f36cfca4c518e74836bb2caf1cdc26e6e639e15546e1e7ada94c32d3453143b2353311a45851a45e91015b71f52a14ca95048859a2566ea7154a8aee8eb0d3d15a2a74376b54da18a16e064518e55b46095e53904d8186badb5c65867fc38286edf805b1a254d32b8d1d290e375e8dc237ebce010ef82a4de08bd0f8dc24284344a1e26c8cb8fc8baf387a9a2af74cec89a33b2bc151b60821021d22cde8409d272430b4c90971f72e51359f774f50c7df304a997d88b919fb277662ade7c9aa9f88ef102e517ef4cc518dfacf679d82cd6e351a76e950127cb53ac48684127cb532ecb3b608b29e1494617792bae65cdaa1355bae260258775654555a2aedae76d59cd32b1673389052251b63ed1057b5f0fb3719a455ebe6f2a127d33bba3c852feb4248727764e96bf346ee029431539bcc1b5ceb8c921aa0c3d39b4a125cb28059d7d80be7164abb5737580bcdc1129a5934e3a67adf364b298c56e4c216cb59e524a299d734e4a714829a534da4b86d60b0e3f1a25bb7bbe9c76c06d4bb230d41e1c4c061866036c6b4d4ca8f6ac50200b22e0a460082f8a704487208c818c2bb0b8c1186400c3f8f3842dffc50c315aa31c959891852cca5189195280c2160433b03098a104b7e4d61c9598c18417d025585633638acb47921e339ec078cc68827b02c70c25322870ccc0815d9951a4f3510421336e381f46e831c304978f27583d62f180e74764039e27787ce004cf0d80e079c1fb0555cc8edd3de7acb964df20caabd28e77cecf186cb4c7666d7cc7fec26ef9aa854b5a4a71586bb533d6ae47a49236ed49258d71ceda9a17d45a29819aa0b4ceab31ecb276ce2fb698123b0597b396ce9eb34f62ad38e5f39a7d99604404cb19800b171521e0041e50a1881ba12084b0c0d00cbc5045199ed0c10f842004262e18b34753232fa0e208ab1ab0922c41291957ec04e1337485183c01d2133d513a4f290d42a6573c7193699629a5945271431458c6152e256c4f21d1c7b7e49161f65d28e3549d3a67dd4d69bd2e6c6699a66d5b26c24e39ecb315fbb0ebe2b0efc2300efbaafd6836bf99ebcc9ac6615fe70dc3b6ed11478ecb44d8b14fdab9ceadd259a748461579fae9b092a38e9a4cda9b3965cb2cc36258a33195286e88eaeeee1e2a4ab8214a8b328cb86164fdf0a21521e5ec115f70882e1dad90e79d76be0627aebd34b1b93273ef3e3a637446748933c77ed635e2374933fc1897ca9e5364647b77320d6ed73eb99af9a1fb86cc9450035a346a185913dcf0cb4ccdcbc0f6e5831863172c2f8c2b1f0e555bff19018a75e096b0980bbae01ad5ac1c1fd270deeb9ba8122ff34996f288a178c55cc9cd35aa876e4d4fecc10ed127d31e94462a069552cabfb4965d16dbee881375a46fa6c7ae47c9e45bd3cb6a1c76dbf5a871dbf990f9e423ae6b10799cc4931be4f8c8e272add8d012135db80c34cb7dfc0fd185f4f819d1a3c963e9d1f478f258e3f1d2a7596c3c5e36a15592c6295e461179c820b903e5a1444254c958448e973bddb73c1d2f6b1079482448e40d72bcb4e911441eb288dcd12fb224c70b69950d0a291079f820861462136e68550d91478cdcd147a94eb38b3c6c903bfa364429864d1939c6cb2e5a25c3e8543fdaa8f11374a2815170d89d4fb00c438611469743d9d3d9bbc2f449314a9f14ca41d2bdca2d73aa89a8fb411619a2a43b0ae243df7438ecd5e42cd612d3e285deb4ec24b91077f42d0efb067bc1862b5f58861155fa36787085641865b8338cdc5de41f9082d092b0e40b9f7b71a1f9c00a5a18d762b11961451674b3246844b8176bebc2b53d9bcdb53cd91337336281ee85032d05f7322289225c154b86d062491096886b1286cc065f6c2b2d6a70352960425658215c9ba31232a810c3c5725442068b8c1e0c0623bb61da255ab1a1a5516410916d45dc744b4a5a0c72382e88b219f86c5a7056063ada1346180d561915db1564c9c043a3caa085e9a0a33d97c9cca1889f6a57c880536aee5a7b736e662ada2b87969cacb4e41003a0998af6ca212e88729841ce4c45dbcafa040b4b83ebe5a8a48931e470e592b490e53411854c893bca51491354d81e345184ee8b5bca5149133b34b8a21c953441038d0ad794a3922684c0e2ba6cdfb0d2123f1486135460ed60db4e7d622ab5c924f51db5a8e3b6d6b2b6d89cf807eeabd2d9327b4ad555bbbb3b5a7b3a9d72ec46994d8315644f7a125f66ead26aaa57e9c24c304bb2d9451961d747dbe8ac2f3e3f39026d5cc7755c27da2a9da29136ba59a5f3922cc9048b2e28a5ebc7c9c500790059c351f5996a159f2b492553359dd04ae709ca44a1d1d1a7e5144ff50dbe984e67a57192a71af647adbc7c377e4311bd3cbac4dcaabd6308932abf79db873a2fe56a72ac17cc4c75dbd01827e9fc08688c93c61c1359e03cf96afe3295d98e11e99c73ce2927a59452da713e5e99fe22c50148e1c61f28807ea0f0f98162e7e78920cc96b20eb718fb8d05356cb7eba605b4d73e1b212c687fd30266bf2298613c7411c07208461f0f589e58877a7d04d86fdeec15a99dd4ca2cab5d8f8ef494cebff4e4b41b638c956e5cd675948a26154d0a3353f127d286f9a1a24a3c8a0ce9c349299d74d24945b4c332f38c33faf332f18c33c08b8b1806fbc41288208665181051247dadb5deb0e917e23cbf5d7485f669075b8e2764549912658584cff3a71b2b0e5f2feb63078119b20ef571fa50737c5fd875ef083553f157ac975185d61c4ffcc4cef1040d33a2b55cd04a8412505a2bb5d845045a2d762d91b28c26388eeb2aad16bb965c1776793948ba84d64a2d761181568b5d4bb0cb567a619608d8855d7609add8b584d64a2d761181568b5d4b4c407bd27827912143b8b29b936ada86e9ac82c05824d824504495f6c67225a9588996dc07fce038aeaba78c48cede755d7c4b13e4ee2cb3ac5224128da6ceaa65656535455d8f7a11761bc686968200f734f09047c81d8d7d95f3d34c0de1aa3a47e8e864d82a07688573eeed7ad0dfce47e779525ce9fa1053499d1a79c8d5f6695f8e215c29a56814ab512d7d3ad59746883bfa4077078aa8d23994ab1c6a9eb84fa30c92c5b24c6a2736dbbc193994a78db257b832cb4bda8387598615dee2c6db1c950c4d214b2c56f486a45fb5945a9b1d26bac86cc8fc8f79984f9f4bbf3b53f498cdd3526c6bf06205c6a665d9473b35b1cd11fbbe1017d43e6fa776212e987d3ec7a869d86b59e32f2db54b293779ea482734ae08c524a5bc5fe9dd6752e33ba265ef3eeda74f665a0fd7bdbe8cf645f0033f8462c8130c79d65a7bce39e79c73ce39bbe79c13abf45ef7275d1055e6a5f6c917c8d47c46833c6557b1c63099e88be0b57d12ac1fcad7715502f1604a251a44cd6a35ea7e452799a0be96999a1f7d3f666a5ef47172763a0630c0080c2c2c76604ff4239ae3a31126cd725b2565966f19030eb2bc21fe481b29a91c4318596e524ab922e594435664a9492aa58d94524ad9338631e40cc8763d2c86212163d81894c82755ad5501b98a610bb9d62a86232c34d328004541c70d39bc21cfd339c3d093a71844e4298616f21c23499e51c9185800435066a93a93591239b03f3b677128391aa00929647a7afb0329bf9024537acc6e31b9307268123292123a095179131839bc916917a6c894de76210c99fe2af142924c0da0c40d6d96d27423850629440e6da0345e9145a65dd058068e5c84ca2532fd8937999ededed3515b6041a66f79f90103060d327d10214bc8f443885c91e97ff8428b15166e608003460c729c5842078c3276c2f8e1e941a6975c18a3076545210c383709b9dff7521b8558a2147ebcc8f438b4aa57abd58a0520fd0360267d900c348bc4e10ef4bb34daa88ae0bc0108d2b1972383f50121cd928a2ea22fdc1a822e6d0919e2c36a089e22ad38647383333bf2209131c69833550fb8390f884dc8b5be624b5b4286f8b01a2227cb4b29654e4eb384f4889d166aa64e333555f58d6bf8825ed66cec8c0d67d2f46b7dcd75480427f660ae7b31d88dd8632bfb1f820819726f803e532b33457f7cf4548316aeb4b119325314084776cda1b6e7e822b05904a72cb1119bd167ea14fd9d8d9d9ef66824734e8f4ee793c3fab191236f9c7e724a0305a88b9c568def7a36ce7d9d8d6e93271b2fcdc3aa0799a2ef58864c2319996a1a464468063b34c8c941a69739399ab6b5ecc1cb308c0d181b1b94d7b8cdc94fdf26273f19842c22840d1199de26aad887d226531bf71ec406a639929d667e14a4c3347deeb2a7b3ccf6b3b97b8dc774af61718ce9273cd337dd0667fae8198ee9739f79db4c7eefbbd188bba933954c48f765a65638fced3f587362449a3e8df75979563b3d2b91087bd90d118e9ae3f4f246521a3d245613563e7d72238238e4bda2df2b7a8e4f82a38fc6c64f4efa688ec4d8f8c969bca3d8931bdab7beae2bbbc2e809a36787a510a854cc96954dcc32553322010010002315003020100e888442c158340f1451d21e14001182a84c704a17c9a324c9510819638c2104100000008c008cd08c4800f00b7ac7dbdce34ff16d1f918406af962bcd82891e04ed104cfacc586bc4be4bea35ea6f9727c303c89ebfc336b1c0130c81de07dc7b038d75df71b3f786dd4b0f37e915d0820651da9d9320ad7f1d7b2d59753c11b6c1529c086133e2c941066b37cc5f3a2b3d146f136b29260aba479a6bb8287c6139182717d305c939317e48f538c1fdf5a1998318fc71be48617c4b96ece012f0acdc797efedc47a273f84b371103a296e3a28f5395852dda14edae4b68c02e36942d465d31faf9185ab6c84f86700f658acc221c3f1d4fdf191f145fa21a378ff8dd57a6da4a21fa33eaadeaab549a1834b7b38e3313e3574fd15f0de7bf08f581fbc1d52e3da5adfd28649d416080c0f47255e3b59d71120542848648ed33c1bee93f481031abc102759869236d4c25e58a88594d4ef1156bd90ba7a15bbdd0fa8ea48c1aeffa37949e9d095a743b3240ab20234011caa72b88baa2fc6925c88e2423975ac1eae2b905997ceecaa7ddfc94ec85c51d3314a5c9d03be7cda5b4efb97587f58804a066648c228c35ccfa7083783e99fd4f02a0ead69dcc701b6a5cfc5391a0652e76863299d473dd81cad23ff7f9a74021a0bfdd2a0663a1c713ea85d157e000389016460207b639f46d49fcfa7137869040c99617340cee60caa2f77b1bfc6b980c2b2bee8405f97cb0707247cf0734f25b9e26eb785efa5c851e7aab7df440ec5320a2d3e915d24799771ba4f2d54bae206ea34cbff491c60b88614ae60e73cfb642421e613f633379097fe4dba4cde425fc6fd596b67513fa48a10f13ce51e34707dc51cb0d0dfe5fe8ed188c412a86a3c69dae30ead6bff9200b336f86f1f58d0eb0ca5d9b7456440ba9b7c696a30596ad1114453a5d8008068bf71a94d1054399f1eb35cd18ae15a82238d64792c1fadff54f027909d4a650af16b65774c1e0dd0400ac29c88c8758ad05820f6006d57ba1a10b34044244f74a7885b3b37ae48598e9edd41a2c984e8110c16cc0a1aea148b017df287dbeab233313ebb5bc018d0d26524c56c9a391cf376da9e323585d47af2ac0aed70664358c6d7bd18c55f84f7b4e5c79cd62ce8fb0184a5c66a8b379fdfc67a1b68ed5772a42e6efacb83715a828a92fb396c5dc334568a335b72cfcfb3fe839617ecbbfc6ac02e5f5cba2d39abf51303fdfef81d16a4b2d8c102f77bc1667735c82fe8f60814b02306f9a053a9401f13b45329013148ef05173c7805cd549411aed4916005f8adf406d1d37aeebe0abfe2c13c7c9e2001289b693e12c27a33a6728fea6d894bcd5a1410fbc7c6a0b8c19efa94658d6e29defd1919241872ca86f72c5d0469cf23212ac808781f822c4e4410d72830912faf89d9a3c2545d4030e4c57ac131f61924c6e4a4cc0c251b03b7706b36c6db439299c05e3393bbf41498b6fca13204e300638a54ab5be11f807fae9896cf00ba04104502b3d0875db00d8c4fb53c2812eea514d707b3b9edd4e28c09d9412b282ea9ea7159494119432705017e2b64a455dfa7fb57551ff3a4d804ca8a700a1d1e8cc676b0904c15201bd9607a89350216444740415d308a247fdec54e2608573ec13b5cb43f718a3664cb832a117b37007c48acd241cd84b3c3475c4e38613459f6b0804f8f02f2321097c834303f8ef5f90df110aa23250fce3de197d93004a81bfd669247fd60d6dddfa4403d90e00367385d9a3d1a0934d06017c06b24e5ff6e61c7c30859de905232308aa8bddb3e4e18c56c1b07eebd9a42e981fd77204634a60001f25330a0d5bd5746d2c2995acfb5459e73f8b4185999b7db40a7d7de30cecf4026b384392c1bf2a09ee14af3aff0e659068c2adcb0a1804dad704e780335c036dd99796154e6f2e64a26deaf5b3fa3be65de09842c616732883230a7f86f4de53e2965966ce40aa8a46494c02c089eba6acd537349a6c11ca5fdf66cb6913e9849fbdb3f1aa24819d2cb2f68ae723714cfb0ff73de5ec3134a08436459cc7c954b5aa93657fe26d91c6d009d60b972ec2d23cbbaa7b1eefe6676eb3af81d305fc70d7d7d5f7bfc759483a4056abdf79c1275af0dde30061d2a6b2102123b708329bd00652d4c6db5423cf79868098c66d00951fe8204a1d5f5c44c866b311765a26b8df457d6e36f2dcbd0a0160f2ad793e4ad2d076454b3f4248d3c962d23202bdba61e7c45d9bc7b961171c7d88e05b1f80044a851c8b36f8d7468d0acf3d4a1c0be9d63f52050abbe335c0b3016d64e177963bf75c81f0d08393c41a376767b0e23af0f879b5cd7c1203ae66f2b097ae31707b85afe16c4eb79383ad80fe1ba184b675e569922c2b743224eb92332009a848df4fd306a2d4cee611510b3051fe08d64e2c1c33e2e9206b45e9b8d7db523177d64ce5d5bdf2590d25da3f355ed23e53c090d90630630f6415c083f992d2486dce6adb020227fcd0c23ee50d72b8cb90eaccfb170da2f305723fada9310c98789c4238cf95234a3b58d083b0d42d20a0ab3062170e95b6c8f393c4a0c2b0a6bb693db9810418d8db574fd915a5e375d9631d3302514cbad6b7c7f77742f0104ae9609aed00ed9556c7fac2ea6ae44e38ca2ff99c47d0c70276b1c91dd83ceca3bfdc77862d97e519f2006363f2b19d600382feca69530f9ecd21feb0374c1ad0839af40d12883f459bd1dd230be361a90061344f1e8852de4a1f745b7048ae33e980ed6940ad6aa56343597329e0d758f5608cd5fc02f5030544fe3c79d9329cf8cabffd7876428013ef0a8726c24dbeba32f9edab3d1a846edfe915e81224ddd47d494b6a51b6a995fd028351c068de07c0ec19a1bc37609376026bf3a8e50c8108506a8cdc3b83411eef0cebb095510be8bbff2e8b7fc89266efa73c4957fe1d269f83db43fd9f2b751e23b44125941f45a78082859ac837980b08ad9637ed157f1bafac50fa50023fa6b280b83b6b90ec410ec16ab603b4f3cd71844977a8e0cd37b53e68711cec460ffbee09e6ff4d1e189943e7e08bc443787ccb331438e88ba0ff58d5a74e48a47e21d4f36decca9cff57b26f72b5a3d40ca0b23d30650a65e352dc48b1e583e49f12576bdb1351948685bf15075f345aeabcb1758a4397e4ecd3fa4191e6d61c76bf450aacb5436fcfa7d8669d8089248684b945196d696d9aa88f8a08e572f3191970e2fc4fc66e15f2888e185390fe3269f747932c008960c7dac3cb9590dc05e36a10121e5476f84ed3945bed9623a3adb8b80b81d4161fa4e8b4b4e917875ba9c879c7200d6669e754140d8167dbef5fee78bd804ea12e4fd9dda95deb8a9a773a7be8c390b0817c6a1f2dddc737c07b0bf8b22b21d7c71df9d77b739e3bbb1d224e37b6568a2f34a08dffe5a551abca222fac5af1e3a4190d526ac432640263b6dea406ffdc127de654ef5e8e1c4a1dd69962c67fdc416067c3db3e29c0616b45981e47d8336954c4d6344c94a1cd7277872f93ef887dfcc5f292ca36f60b8b1743ef2200cd870be010089f732f116ed20ae17be05b31a112c764ab5681aff73a2df4ef502ebc9aa6932c6423b35868ea6b92b1c682334498de975310da078d9ef82289e5d743de3a2a336f00336be1552fc0e77f251e95957b006af8edf6a4f348f5a17dcd36c9905d3c5e3578c887b40a59fc8e72a1f5dbf240a4ec63fb92aaffe4df551de130e0a17fc2d60341d590449cab6bb1f294a5608c1caa923b3076c82a9b5368bbf1c87655f3aa2df7a63d84af9c59efe1e523389efe0d0d4fd9fa5d8d2cf42ec39191e67fe2f6640fc67299d3ea7ddcebccad6a536e14026c94f0f5cd8dff698bec1846c722d0ccecd3ea4e39782bdb0909407c1bb480b8f630b7a8110c314623558370591d8a2919b3f5bedd12ef16e1ae459882ede1b1feb4e8392f35bcdb7ad1f60418168a9611185aaae0eea0c11178aa1f51ce3d589990413d54414c8448c58a1ff9b37d7feeef551e05d62beddadc940e4a483f2db09f951d135623acedcb74d6d7ef6dcc7dd39c803db14a4bdf55323e0aaf95242b33204d9d2ad9c820f76b44ce6888bdab1152e6c85c75c76a8450ac57d480d128babeba340832fa2db737157b2183184baedec08978c461d47d312bc935d978322a141bd5d12468ec3711be88913f26cb929147432bec1dfb21fc1aee1f43f68795d5476327ad48eefbf871c10b8cbdc724b849a9fa3a29460a4251212ae7464c7b9537a64ad15a28f70d21663d74799abbb9891ce3f4898a466bc614197e002c05dcb23c9e77cdf8e91c36a9340a1658783abdf52cc977989daa384cee1b56f27f7a3183c3712b75405828fd6eece08caecb156db79c5f9758fe46fdebf97b3d38016576ffeeda1eb053113b1c51ccdb0cacc46eb4acd1445fe116f95fefff5b7fd98b13c85c7562f9c72d1e0ae471b774f49ed5a917ea9600ba6f3132cbde72bc3ab1037cdfdd01cb7e12c446a905ea581cfce9f9a7e7e7de3b5df61e82cb7e62bb0deeb70f39c5fffdb11322ff8613b19fbd558ef86ac1d13add9b9db0255bef05b345bf3e649194fd4e9340bdb46e629daeb5e24c4138b0eb1953efac1b9ed48a7394b5aeb50e0861de97aa9098164dca20c60cd736049c467360e509157071dd329d905d227a604836d058a5caa0c18a6a066cbb532de08d0c320ee3d14ba1aa9df7fd48bd28126fa3bfd4f18535385bda38b02a6e81a69662f6df7f1dd3457013b8e98a3fd055a9cb205899b1ed3e8301c3165506cc96a7e2ace1826c32a4f240bb06595ba7ea0cf23b592491c542ed1b302e43853f11f3315b6a72f870b77c67cd6bf3f7ba6464462ff0df1db3de6235284909e412542509d6dde3f216a43e40d9bbec0ac4058404ddb1de81341b93da5ea0c6f48fd51109060d7ba5aa3a285e9a8905f3d871042bfeed720983acad5355fbd167e085b440754efebe0411bf155c41afb2c8e4f8ae340756231bb772b82c27c4a90f9aae72717eeb65d738b1c82fc14e14a6daa4c806d635eed3c212e791f08698c74f4204585c170eca4e4b5082b73381d2e08389759611b9536fe8c5b34e288841351cbe0685c3a64666e788635779ca0abb16f8053f4768f150f79580a255d0e7c2c5c183075af1e2b808b46c865dd01274b9156b17a86065c0c964ebcb69baf3915e3639e92c98659d973a04540ecc1b544f78873e8c5aa9e86fc5195ba3bc7dee18bb0e10e2ebdf73257af52d16598f5fa2f26b2713e30e035604e6d6ddef802ec1e307c87c1baf6ad9cf8b5801154bf1ada6496f6abd9ab5784d5886bd1d37636767b3f563601ef3a56133946d08cb96d3b69f785b519eaccdd81139496a2803de8dc1a5944258e1e2674413c8717263871ad36e506568948801f4bcb2014e7f169c5ca2b100f209004ad7e7954495fa32230d95d2fea874c7510c1ea0efc64b575069abf76d22f7435f1552bac91847867445943ee246a65f700ef91973d21f04085f1bb2511f7580293270a6da1fdd13bd89334586ee54fb1afac078f43f7f20d4fd7340031278df8f8ddfdd46a17c10f9f3a081ce7a1331f1bd2af66f365a7baa30b350525fc2372970cb5b6147ff26c8c1ef7fb6a64f4b305c696b423f0ff308967c4dacd258ca4257fa48d2224030710940d3d74cf5df3426336c430910f70825096d48a31a8aa21e046f7d626ac463398772ec1b470e34a494cf8cc4282b17a63c9421b746b349bb4c7b9462cf92db4ce0cfcad131d12d62a6a2023dbbf213ba27781364b1f9aaeb31f5cf66c060be564dec815c4a7d79f12190049c7696892488dd809ee019cd3872617cc74ea87b6b52771288b54c99c5718e3796a1f292ef3dcbc0d125cbf4cb7e2ebdedf72742fc5056ef189df240a9870bd7430e8169d7655287b8bc177199aa8cc14b9f3a002ef9ea38b62bd71488de44064f9339928a73d6762c05779d8a1262ce0c6334a306f624030a8ba41a8e2936759b4f219ac40ba907adf22f88bc5b4182999f83f3193b7422fd3bd1a8b3c1aac1a1cbc02ba473f680bc7664ad0709a98f73ba118f22a63154014e8437019b4ac42a0890ca36081505517e171d6712edcabfc6e7b02eceb44087f89d3b314f22e82e0709233266dff0206def8c7e97c0ab56a9650f1ea1eed7f125ae304f74b39cc5f327170af901300373512fd2f23c0c26cf0c214ea8fe88d452e642f3fe40a31c8ad20b56f4cef8f217b06e2959ab8718583d96b1f40d26b043c80aba88a2f9f832f75a43737c4b73a86240868483cb1dc81fef3954c544534a2b057a7c2feb70c4d227a37293ce884e1ceb271b6c3e4230005de9b6acee5bde2e4a57b414271b64ec8c84a9563a8f2bfdd5e464894a3751c6cc584a6d004868491b25eac46a9ef9a66aaed3d439952dee0438f1d6f97bb069aa0e5a90f45c741f93c00ab72934aa4e985d9bd314e6e269d2954d87121b62bed2c1c0cfea801ac92687b84f8c0211abcda8b928501b6454a0b4165574d3b3a0646965628943a186d08b54b06ab70000ade95bc2751a4abc35f5a453add060e456399cb44f54f14421ed8816d8486a45ac13cc1dd0b06a47a1799897bb8993e20aeb72adb8df3e0b6a94c490a5c0785ca5d41926e2165c5884702b4a19ffba18618343ffcf4ae55f7fe2b7a928a61093ecec2d7e3fba5407279e69cdaa1bd5f99d263120e7b889e37a1bc59a3cf1d6c9ccb78e672e3c8f9d42a41736be8f295018aa0e7042753331609d2d0a5010c0c12fcf2c3331bc91278c9988ca14b7833f6f127b9a637d88020becc81c4a213439ffc6fd3e4fb99e54c27d1a0c57cba3005be48b86e790c74f2c948127795c8b69b842558fbf1618c4db2c09a1f394e2d8ac76ceeb4aa044f8d11a162cda1ea9b0eb9aae0e4acf494a232d47ec8f98ae6d9b066aeba7e889265293e1287e47caa25fe69ec506c29ad6e004e225cc154b997171c47ab73ec6aa4c4073fdb287b2d2c9b9a53d7ea7035e9b1a9a7516b2bfe426a458e0de0877f1361e0c9ebf703c60e5a08fead7cd79e9b25a5af09e68b3aa370aede0bc887ff3cb6132918d3e6785e633532570710d1c17fe5a9616795ff9fef93088def73f7592b0c8dec003dca04626fe0c56738795a691d0e6b63fc862c76c3909b98c8c2fd22862600d6846825f56d62d6e10d7f905707b663aa6bf883823cb518001dec6f8f0ec70467df5520203151a0946db08697302368b08d858b5f549cd19ba583170323a93d09b37613640bab19f72294d10b0d8a856f3e3bb6038bb43cbeeb380de50caaf63ceae1167d836dcde53c092f56b70e2142f5f9f7293c00167f57dd46449da97c21d573c47935ae0e8e06eb44f4372e1ce38ef91606950cea66a660bd4fe1629ea502de9ab0a804822fe06ce6f8c38ec0a08afa9baeec9c960295757d6cfcd9d1b50bcc093582e138bc1663e6310e88c4e2fddac42357a3333a3b8b7576eef21dfdee4abe8659ecdaf5fa95cf8dec664aa220e67dc5900e872f77720c5e9916d6628ae84bdb3764763dcfb41ef14e146f64dac72a926349b1948c42a277e7679f5b1956b348933130d6734337eff15e41b90cab51ad99684e674b5d7e3c6cc2bd4e01bdfd8a3ecf6719cc47c36b698b17fdfb5c20e14b41fb1a2b93ea03893be73d096e0a9514c9984761266e8bf6a144396ee84bd5369870fac9ef3bd94b19d1023244b3c22bd4380a0703da6803d581f4dc3d78fa2da45132b52ee272c954fcf1619218d902399e1933b9868e0bb9595ab49905181760140ccb20c20e21a7e327fefbda57e3758f485e085bc79bb1fab649fac103a209fd877871d326b1f869dd8c96961cac20169a3015cc50a9fce95c2fe63295718003b04da45b4a20a177929b12fd83d0039a1ad5e29c4179da4c2b5e534618735e89ef81c4d21b27a450310de7cd08c7f1c0250f70ec703eb8d7a4a81c8545030a2a393b32e2ebb751a80390ca95ca8021497ce59704d48ca51891bce4e991b31ee4651c1a1beab8092ef5a169f314c4db6524b2480310daa3d0411c9588989834bc0cdb23eebbf81e7f94332f07c5ab2493ac019d06db61eff04be8988d3889c546738b65aeaae67c0b7bfaa427b0dabb440c6d482d2c835c875898be172a4072cceefefc466374b531652b9c639674c5c2d94b842eb72e69ef32718c014b250f1372f3a472ecd7b09a285118ba4a20218b7ceb860269011d4975826e61321ea568c360db1412de5e4483d8dd8c28dd25611f93ecabd0900d7703c3e87f78e1ae6351e7969297244edf18a8d2b4eb6d8373181d99b2d8fafdacbefc65ceb3e356e4724ce019d4c21c575ac836a32a2f07b587dbcd206ea3fa5002b44011d429e1c09d50ebb746151cb6f081d83a837d493d3055bb268fa482b93f41af4d2f2b177b01077232c9eb7a33c998b0a9d9a99eac4e5b7f9d9113966f5f6c897b52796889be32001592ef2aecde0be18a637bbc0a7a2c51554570b2c26fa81fade7fe2b16bb2c98f46726e23a4e7397f22fdafb64fdd0be3cf9ff732295c2282fac948e97f0e1479561ae1f4c5f0ef0e3791e4b3db7ecd9f87f11f35f8391e27f740f2213d924c6956d120cc475ee9c14ff4333ef2dacc1d3c5dfdfe14f255de2f795c0061dd007cac3c3293da027d2c43b5fe690e688c0747133681866caa229f8cdf6e31246aa6142a1fff3e3742d47358b4081a8ea08d39ccf957736131628ba94cbe14112975f3929fbd21b3042330b060c8cfd289c1bd823e3d8c8b83c564cb95faed4d200a3c546ec1b4185e258dc3fc2fb8a2aced7a703564202b6d1e0ee9400f4e2ee816460c68250891e8802de4949cb838b573fbca922191c655f50712683e1cf7439cb6578f30433aad33bd7d00f78385787d9b479fb0601cab3238893fa138cb7537ba7fcf37f0d391a542f74866c4df0c22e32c9353c95dc08dfc5de95fd59b8607f336b1ff90417fe43c8353c245daebff4c3571b3ce91c592a0766042510bb7e4c146899957b9327b1984dbb52408369d699d6c1a28a58c390a5f8ec071ec254a929f6daf99ff4b82f9d4021baf38000578674607ca992e96a0b90cea402f2c73ef9a723d0cd0a64dc8c2dfaaf7f4192f45379648fba9b9c851021a12ce3e64bdf00c62cf24eced19523762a590ea947c5e05b5a80f843b48b17583dc6168d14efae09ee2b1ca5030d80bbcd3851ba63a3fcb4960e8eacd1a15cea56fbf3af35ea1d9123e6974ba5a88dd167a25fccef9f1bcd7b5abebc9d96fa09b12f2b72eba215e15a0b9035a9d81ff9d0e470b125868444c4adca6a02188feaa2643569274440d1134a3cf27356c5db5d022569b4a68b29fc8d717878ed23f8696c4770b13c11df86f6c040444235816e35fb4bc034ec8a0690988e0bfa467985c038b15bcef33d783136c66fcb8425419b761edebb1c293e1a5c4bec85a81a04eae238dd07f5c9816ba08dbb08d81175b2c5dba750c9428495823ecae23dad59a3f216959760e2832d49ecc5f9e83fb90b9b47e77676e0ad74f87d8e28afffad7b45aa878f7c38ef67de50e3bc30073329e3e7f86734074b619f011384a29491e2224175c95ffcd3b08b6d75e043ad9a007280e780e9dcf990c2abc8efac8491058eebec43041dffcb4e844571cfe6cdf7bb520c794e1ab0d62bca73bfe103d39a6eadf3186d3d81069d64bd0c6a9373a0e5e445f593d410da54eeb94805547dce37e3c70a1f32a55a2ab9d7605984175530ab130d863748af69b9f4bf994164bb1af7470aa8df56369303467139543639d493f60332c84b418ed3382c9578da17ce5da93516bbc50d5a44e4f8e3077a6c4e5d4a27fb13e4bccb5ce8b51f288faa942e1d4fd603f020b7acc43e528abd92b93397de109e3e4c087fff2c760b303d7e0cdcb302348b116062cd4128a43beeeca17881145361a6406388224e443f137ebb6e1a2416041d0a3494911d33cfaf42cebd9434c0a47300e507e399237ebd88fbb9241bc24814aa2be65664be3425d0addfc0db0d3bd659164b8d2a90f7279af0204ff1d708043ff808078b4fd06284d958f554b1b5d63e961b767752508a9fb9755d489b9593ad5a95c26cffaed9f401360fa6589fc40e35ef8a7a90769db01fbe6c075cd7202ed65e87042cf2be87b9743063b83167a5bce3725f5a9501d48358ae4601379a11b9beb046129e016a3a1d92ee0b2cf8de7c301fdce6bc13fb6b21f6cffbb869f1b1db326a16479c568d2dbe16e142190b4b253ecc1c617a93942c139950d1e69a71a369658903785f44c259f1b86f72647cbe44ce7e321644f5479f3cad0e3427e3a2547e17ac0eebc8eb04e7ca40c11013185e8ffadaf1a1a72dd60a51c6aed6462384a160ea8b86e80c6cb3ddfec809a8718952fbb010fa9a48f084bb8e5f03adf480b6bdfb03ce7a349a066fc4d0d1b23b8f275e666eda41e3192aae0e7ce0d53c6ef548262d77dca689f314a20983a5ab79b8b8a032e84a858e7566aa3442dcc798edd4c1bcc26800f0fb024560bc0e41302ef7bf51e9f0c840216bd7631bb078657378d0aecf7deed82e30928a1b2068ea818b2484b548f6399f75d3c9e35c2a0a55610edb92447f87385231a128a4cf0a1f38aa35300f936d4feb900780d4df2646cb43205c26a34996884bdf31756c917ecf0fe783bac423ddc5b753f2de0ccb2de63c59f756c57c4e42f085b146c6c7ee9d0e84e43e2da5422024520b633b67e484b38c4896dc6c3d2ddcc19801eae852f44a8d6ee3c970d090414810316bf10a72faee60dd8cefd4c3edd370ed425ce9d74086d2834554870fdcf3332a62f65416f7aace6fd4fb6e2e7ba80c6ac4d1b685a3525c61d5b4a7aa7a6cd049d8cfa90c6bcf3fa6266dfc02a7090657020dfb78aaca0535c2729d216cb88c4724dd9e3770d2bdde24a30af36421f6b4e7c72d5c30ddaae3547b996276716692a3e0a5864fe090e0cc717558ee7c04426e5b7fc847c9c40794f7381e152806015c1c5126ff5edda643b452e9d4dfb9bcbc08d05061692b0a8e072c5b3bf65e7ef3e311f4074d828e26599ddca8386f92188b05bf4c7a106720ee26b0ecae99dddc83a3ab2141c196ae6ec6fbb314e82e87a67525f435e66df1c4fbddabbf9befc7df389435e977627cb3a83b26b8dc8f3e85668896e428c3b54b66695d9bae27bfa4e5884a7a5baa058f6f5c622967f001fb20dd688e95e99a81fb1e0c4519a4253078c0a7ae50d99682415509a05fa826b1f963c4fad84080e147ff85d5c8a16e692c03abd08f2c6228f009610febc30f73fde589e1ab9f6633f3c113a74b0134b94530cd12d8d2e380091b8b986f01b64280290df7c2c40a8001705269700f9d1f11220f008e54a94111bd24f8e228afb3dab8d032b1e3a1841e8187622657c90bfa62c909b65e35a245bd585c509f8909d4a50bd30c3c5d8a873f025f130d85d441c2f5d2cf28d268a30b19e8ef265f5f2f6cb67c9d39cae9ccf32168119c0c50e5592b3427c465c19c161f363cea13856ae85e57c855cdc13df52f13e2cb388db481e10655bc5a4fcff759b42dcc1148c6d793596961bafa63e61d1a05e4481051df3f04a898719c19d142c1686c7b917c004dc198da4a20a820e9df1fa61bfc6d60e8841ff690746b8999824aa38f1eb1fff589ec1335634c76e86d94d45f37f021b4287866c3f613cdf61deb1d678832fa503c7b53607d022736011fd596a2fd3a707ef7d8266fc0426ce149f96fbbe8358beb39c07fcb4b768c1c0ddba51945b53f243ae5edb7c78426ddc628a659b84adb3e574cbbb4e992997dbbb81fd74a77eacd9e80706676315d93948e0ae49d715a65dffba939e5b8bc193d9023ecd6f0594291afea545fdf6101ec973192a4128c9b14bab19d89b3aa4a25659d79887e114e934e0609d2ec47cd90a98d8029aeb3d20710b40d80b0ac8020411ce3fb45481b0f9862ed30138a5d0252016f85d2e0e9eee4507ee221690ff56bad3a1112d3988beee3a8c20c3bb195139a2c3f2b457f0be8976251d960480b41f84350a113b7b6a03ecc1683e44718ffee6bf6431df66430b5f35021e3c7d49165c44f607983dcf07d979b33f16a49e81386f8185d9c0f1fe0ca570a3492a653a04c460aecc7a498393b2a0a33d50bfe57767031692875c470fa3cadfcf2fb2ab450cc0e0b600b1c43a604816680c76066033125e4e737a76ff1ce6b06c7324dcbae72cdd86416070223e2b3dbbfa605df642a05e7c7ff2969e8d86c141758c3521446efb6061f048c1aeab7309d2f60dfb9806b7a9dc215026ae6080d1d42d2c1f97ced2506a3cedd3dd1d2f15f41c3552aff1d6a380644050492f1dec194f3fe7080b8ff92ff8e5ce5337db08407abf90e6d62758cf4b99aecf6b8b2e09ad3920fbc0f56ccc6dd42269f4cb6c645ad267c529e74dd4d59f93090c9ca9fa2119c679cfb9508b1bf48b6b4b1355b45fd02a46e1d2a4fbe59665dd585d16c11324f05fb1b5660d588d21f428363fc2775806b72e556e8665311660f4c2c0bd530c77a018569b893c7bd6aee41043945624402cdd810ecb45f29c06a5d15f8227db903c7cbfbc129ca9d67d233d5a2b01230a043748430d27990c284b11cefb03d8af5020545f02f95a86d7ad7445b23c31585caaa3c324f36e36858d7f29e25d643090928cca83aef720353a4b41d4c4f194c8649c72ed8a10e485607486ab9d8c581baa9e05b35b1a625b5fd4148f2c4475d6c1cc6d759824829a096f2d41e5940d567938d83b7b6c690684af7d74bcd37d94bd4e69cb0e94db509403c564728add3155c226224ed5c4619924ad8e9b959676f710e959ceda5720c42ca965e8f0c0e4a16e58fdf00626fadc0842cfbeeac85a51c07690beed5dae241773177ddd6c48344cb7f1d4f243e5322f28c147470d71bbd8641b1453d9847a07be11c165f6186e9203947766cfb4a4fb7afa38f0c0aae015c151e279465f5db376dedf89d274bdf40a75c121741126ecb1295b762f748b0ceecb18128e9c6c8c840ddfc21f7e8fcb6bea84994242666da5de604ffe6a95b58b21ef8fbdc03e63897deccb49c206dcb8771df303c8ab444f04acc7826a2a71b188d662486f4441689effd003350c5138c9f64800c420de8b1e30d2687b1472ee3522b0ee9a32f020445c8798e4dc4aefb9fbdf4ee023a3b81dc8645706c23dd57e14f70a3fd7e75e7b272bc724d1d350e4e59a69b13c4f2da9b4a83f942a8ab6dbc70eb13b5080e7859daf0993d9171fe76618dd2742955fbeaa40258f231964841ee8eb63cb2df36d10121e8f43aa6222d3fac18a06dc73acbc9d40a196d57b684493432fe002ad9d9ee41653cd048e6c2e1106767df7cbe6c6bc3626fd3e8e1a2fd1585bad348b0b6e0dfcf0180d0658f8085a35b59b0b4932f123f0699d0cf7d623c31b531f5dd4283dfa57395148db1125e98395a11665617831ff5379ad82faf4e89c5fe31fabf3cd1be0702a94873ed8f74605d637343e45b717edd1e96ad24d1ea54df624b9edcd8f803c683b54fc5661e46f0740c5aa254db6bbb663c3defa904d904da870f53026c567d8e428c45bd9cb8ab484ed8e721babc5b731795c15eabfc07d4086f29f43e06747749e249b167c36cb84c1d21e210b75318c571766d8f8aff38703f8ebd9849fbd536d2d4c89046ebba1a8125377864aeb42a52a53ea4eafa267574e8d11c9331b65480e61a8c529a1e5485165c925a06c972a4dcf9f1c658a5741820b7010ea755d65a4b1cdff1941183812c4d139ccd3144442895270fcde210b2d2b8ef66b031265ebd2d840dac865488907d167ac94752ecafbc6301732c0917a1800d1487fa803503b48080e04669982f88ed1497a9ad72a48a0023ff9ba96d6c952d2f3c4aaff0d482842ace5aa08cd3d6a51c3d589460fbf44fefb357c3c37a8ee4ecad4acf453835c39e91fba6ff836b65420c3b89361b6f39ae95a5cf03df0c43a898949f246c6415d08ce77f54fd868d49676c66a98c2e1d3ec5fd30ea942d7d2e39415c1e6437418a40a2dd008e9a688117fdab222b6b3247e3af5e4f63b83b9b24e533f90117d16c931e5a783c11eef19a3369381d9889e9f29f106a65c277535397f44809fa87b71fdeb3514ed78d56279677018b36a4ff2138e296e5944fc1620f88467e743d25d6a9b654311f20fa60260bb4d7d71e6a4bfb7542c5f0ab70d0f181a7b9c29ad9d59756e411a4835cd7858f2e1d1668765fd251c0985fdee5d2858b82ccebf4aaa5b2bcd7fe434db56270ceb7f4c8fea01ee427038a5fd8b386c852214e417e37d09da1c57d18287377ad0bbe36c803c6df5845bfc4a5755f44e19066cf8eb23f0b67d3bec094f32369406a2be7a3260fab83a2a62965057435892b0b15dcd9b80ba768aee758b10f5f122f756658ae05f007d866e894122e6a1e31a8a6492137d3689e0ff96aca42bda9a8c128381a6286c25089703c87c2f23bcba9191be53e4510a40c491f7f48f8c425c8e9cf4070c17d784d884d3b604f67e606a94e5b002db276277843e948ea1d8f4d558ffa93677424e28bc60044bc66aa3b56996810a71da2af20d4c7470d46e044d3a2f47b6a1c2124100207e0d1338b0eb1b986ecd568b59cf05e28645e2716b734011a60a08b9ee30500549ff2c86264cd6e6ca66ec10c3b1eeb0a8baa8f3da4d0d81f02b4c83d7ee2fbc151cc77d1a3ad7ce902ec56b02acba8cb7856816353ec67c1b359bd54a3ab28b7fb66fc526edf0f0cc2c3ed9d12d3a9c097ec48673c4cd5280c5446450d14d011101bc3246e0dc08d40ec893760b9a398860dd0554073357d4963a9da39e9a8c5c0483daa8f748421b22ef7fcb11691693c37daea73e6ac8cfa191edabfbf076ac88c01875a2192274f50aa75908190b27efe82eb10f45ab238f2cd4a7f5690479a62e483b875cb38cf02f2682d8a43caac31dc3dd04000e205691e48a33e82fe9b78a5b7e77099eb3c014618c5e351d5186ac88ff72b53537f0e22562c85a4a119297b9f209160a2bb3cc23d465553f53d1966d4d0466d04c55c0ad214c1d05e9fb8b02341106b17a1e24044adf444996386b57c4cd1d4e9020e275bc60dfbe697fc15035980a6ac4a10ebd6418c1be419c68f36457e511687f414fc5e7bbba21705b6ebe2bc2a55f7c1f463b763cf9f47dfb6c7eddf280c33f846508c7883eb902c8beb190ea755ddac70a851805a172cf270057f532a841f0bb7d70df4326ccf72a47d2e34e09097d4f7669a0f44308be8d7f050ac04d1bb5643f84174874c0364484f70dd8d7e480fd5412070b823ad88490b6ed5ec534163d3e24bf140b159897fe83e0a350ee707a8ca47c067c3cf426851d5f02633bedbfcf10a29a43c0985bb6f1a33e2ae376bb30b8365d610ea18fb2e26602fd1170ea3a58ce6143fffb70ec64a44e21480b09a0b7c1d0ff46235a0feb47153c39023eb19187601e920ed0cd28e43034634a746f0b71879d2f60c08d87c3fef77c87e6ab27c2d8dfcc955006f51dda79e073a607b10e033d85ee86f456fb6b6fcc7b0e42836d74b3a3a2920b29a8d89be556492ecb16f66fbd9f0902d4eb0220e94c6b2ae2b7732996cf4837839e14f2f5b6b9b95bbc8a414bf3c2ff7aaf24b234445d6f7397b7c2ff68c6a20dd9c986dc9256200745a90d06c08546f8a5fd40977b78fdc2a5ecef8c8f44ad1a36031a15a9ea279e36c3ff83a687b2d48b8654d9a9f0b969d66ee5696d318955f26026703aabbedd6ca8a616bca108255dae67c80a5810bf237e2dc025c302586d40f5c913f570fa049c80a550751b6312f8b7e73829e157a369cb75abbc599d6fe5128e9eaa00479d1326c7467cf5cd5d9d41430cb2b60b73542bae0ff8c7210b955be1d4358eaca392a171a2e6fb142f5c582bc18ca97f93fb7a022a4c6c1ee7b80ba36f12e1e9b4052199928e1e28f5c5805582863877dba35a9b014ad728101b58b16315e8108953f9492a95ad26dbce38733301da415cf8cc07fed97220e81d43b3cdd732af87c26b3e75263f051a5c2661d7cd7b402cb1dbf925b535962033bcaac9476c75616ce11546b8dc4b22675078a7dae5420648f8550d8ec700ae2a53748a35ed39979745460915e7bc8785783c68c9cbfe5c8533af265b7f3c9656965ee252b684440744c1fb5c186f8c50d6a049d6640b3412aa07d78544786379f6ea1c7b0ff5c7f6e843af0ff207bda0cb6a35f3be8f08f3b6926eb8fe42af8665097e8f8e5e8688ba5f98f06bff4a700ff3e776ce59327c75a435aefee01e76e79a4bc9568aeb1ad0b26573db511ba5561e197109c5f6f27ad6545ba321d8e6475f91200e4c9b3f90288c4042da586dca644a916c272999b79b629b96c379c011b193a7b036605051c944ec3002135871f34c86e310f1bccf5f3c042b51af809947cdb23d36fd0e1c82d14216d4c707e7200ef1732c92df571a8778278be0c20d6a47993fcac14253489343a0d3e241b0a76cf8886874df94d30d971b09ce990a292fbc7c4e6e38a7c2357f34bd5c8974e7f03038f37483436d72e6c3d0f20873a5984dcb62d1c78378782612ab5d9b11d4ae93963b9c37f38ed3edefc5e0308be8fb3b6f5fc2efe780e3c0442d04459bcd68517fd21705a2ca84a3a0999318c0e6466c306182f3f801c3c7facf019a6e29a12f5d5b0e578f7f35c700f0301900494303f0fb70c537807d4dac7200e1760096a97d05ce29dd9536a5c7a60181eac68e510d42b9b1faed30e7b257d4d5cadf75752ed47df1d660df62f0593d60e8e004fb6b6052b041496203a4c02bd873cb06f7cff520f2912e6ed46f276ffb0a6443ad30afed10b102da40def8d693d30d685b91261bee5410ed28c98288d113eccafd6ca0485288836fe956c124aca712a43497a0b5b44e8b0a0d445a705e409a59b17c500b066b2d48015bf0fe18aef33d66e7d270b45b70cc2a9402e1bfb45578a0ab70581776eea6869c4e2e45e80d5f24433baf1e3e894c3f024c2ba4ae72d15b111adf0dcd269278f8f914274981d7915b129ec08d1a07a518abc16c21fd26ee0d0cf8fa7a1e6b5bee06762daa20c8afa4dce1b5752fc04b2602421488d42091fccbe0b1e208dbbe123344a4d1a92e68c92a9004d8a362c574a373361f523bea907a4dfc93a9c8ee88a3ba73c535b3eb9a6411ce9bdaf003391ad598124f5f9821a05bd8b7e02bc9d887d974434ed32a7b815f545517b269270e713095215de88b5715d4bf7df51bfbfb7bded506cf0d2f7329fef188fe49e203df0f42371b9ff08f1e9e9021f94b7f31c111f7546aa86eedd10bdfecca8c1f08585e1c6a43d073121482b44a42be45a7a3d52cbd8801455e3581d00e5dff9c8af5600688b8f2f824594e6c8b0cc649321f660f814a368c7c8b206259d615dc9e597b11a5d4547f978d16d1a8cb8a37f0e9abc18cc49d5e0a7d605700c79cbdd8603bc1613247c678460f950f4bf4634dadd0d777d47a837e56df26c1286fc1ccdd50e3eec6fc17cb46bb5287df0496feba91ca729d5a8758c6fc41425398ddb2a1e4f9cac5b4da1078d9f712f33ee23a2756d01dc20cd64c2e2444203ba068e20c51fa267968d01415e0028e1207bf475792cf6595f81cf5601ed81dd01fc3dcdd123838082b0ae6d89da759c1e44bf814aafa4305ded42e8bf8ceade5547ba44b953ab331fe9662acf12af98ba40f8bde54f003476d25769d339ff99cdb3be8d921d3267c8401dc1fcf44479249d496a91645aa38e3e572b28c4847d0387a3c451f55e5cb0969beb3d47c6bce41de11aad37ba721519faf4a141e79f51361b7fa78ed65ca5771bd39e32aff776aa01071f5d43e9d45f498cd7e247e5a8da13b4270626ee5031686344f06b64f26624a846c975cd91e310eb3eb97e8e2bdf2cf8a7ea1727a3d5f37890980281e02f7a241f9f5f7cbe3e1744cc0f0a466013458ac857f4eaddff3234643756a249646b060100a738ae0e1df9155d69412c23401a45c5b48805ea2d87825f2896c2095b64821ff55b01a4d6eb12833bd8805a4564d96f1725f5cf110b539fb5438ca0c458ecad4949c0543023f8b10967bd081c717a2322b9ce4a0a354ecc336257934759a9ecfa919fcd275053bfa7e1e9b610629867318f683f92c0c85fdb36bc7073f9900f3236ba704457330fa74130b4d07f442c3063f3d9e3567cbbda5e30edafe9719db2d99dae50a4d9bf0753c76dde7ca3b4ed1c106560c695d0bc90a3786ef76950eec901b5b5cba58c07482a1aafd55996fa2c22337dfb2a382778aaabb95cc9b06881a8b0005a64955d12daa12211faa0a1c62ef0426ef7a276c8d49e870841cddb6435a3bd19bc325d8f5fcd99b045f361b5a619037a06c0ba19af161a7eea59801db5e6f037d10a7d34e42d9556e80fe4960d6fea78d1f8c8ddbb4904195a7ac226565bd69e373f1b7b7a54e81af56b2eed4aa54d4e434203bf5d3110b221efd7639c32dd1058b1c0931bddcbf0ef3666fe9336efabbf6442253ad1941e51f86f1df66de7329731e6429972dc3d39baa3d3202692e1cabed519e311273a8d316107170d34adc4bf61d74c47dbcdef31dee95347670670e9155b45c82f26475033651bfaa57590b522b567df6aa55f12974d5aa633509d4e361b58dac0ed31360b2ba99e3c20ff83dabe140b264f8203258c356eb1a5cad912727a5f4924c931a89b0052683a059d6eb395d08996fae54fc71dadb2172a0690e33adedad93b1076ea10da5543d03c055799ee41870d24c6d5e6a66daf0673505a3bdfecf1ba5f6c6ebf967789dcbf47e6647e07ef1f82840732f92bca282f19977d49a3388dac0ceca8a2142e4e1be50ae82de2f02a277a44de6aebd2b232196e32e1ae9e682a78cb859dfc64f4b736d4b6d94f6ecbc3903dc39703e38ba31fca29ef47e7c0264d9bac0fcf504a7c0427f20c0f81e7ec86e60fd3210497008feb419d41e2ea678788a65f93e404528d1ec2231992fac2ab49796d2fe5523067432d32fd7d750b025ab6fc2f8d99dd871569c4d03f2067e5d2fc3b5cf84f3010868600127300e4dd9fbd9c97a749052a75763719564f5809c9d3084db01a06574f1029d1602f29e0c0c50a711f60687e3eb74226f95128215aa8684c0eb7973a33d1877fa8a8c0ebd6b44fbc9c99105badcf5451bc8dd387baa3217ede6724eaaccbb07ce4fb2481d946f917014f4e513d2509410674841032457b11caf8f2a89049b43380123ab49d549a6c4ed2823fbcd7dc5113173c28afc663b0ed23811b1b7838417f8604fbd1589c4ee695dd9c4a0a780fb52ddd0058a03d54d52c1e6c90a64686bac0aeaa1b830a2e97982e3f5b48905864fa53e48894aab1ad7f23a0d3cee70a4e417e8915b23ba93c3688eb36972a71e9b702bc72b5a0d6b2a8adeacad9c32267e4315d9df73225e565cc263cc12f988e531d84ff44621b007d91b5fcf5ab5a73030df47684af15e5ef2d854f815fb1cd40d9e7d764986f7d19841b834b8d4988ca8fdb02374f76c8dc4a20bf30bfdf2c3aea0d38311228b926217f4f27e4864f488e08352403651b194a40496a0d6423efd8e1e109a350188e23f0004dd2680df1e195e8390bf0e42420d09e75a070dc081d8bdd51d2d402ed5b3a2294db49fc91eb14e6f0d45c08e3b8080943e051d5aa149cc9556f73e43395832bf90146fd1036b44100bd9f3654e6770e70921a15e16d687b48c19c6a2883984b59719b19037da3e1d0c0dc310148287510d9bc83a713ca0f300acc6d4a714ac61425aff32bb81e40a62c9c3da7a154fe0d0971ea2c216fe70b07ca19c740056c91ac9641af0910c1ca46e103f3121f7672dbfecefc1663792cd7512831b0371f9b2ee648e83b262509a50bd074c6dbc12c082ebfea3723ed1dcdc32a0c340ed77724f830d167657420640260e8389c5524452ef57ae2cf575fdf67f1137d3300461691854186007f5477f7cab8dd0c74cf00b139218845be030a1151e2cdcd841a44b2d7b19fab88f4a4331fc8cc0b657f2caa58a37fb5017879da2a530997531c7a8132045cbe3c548f6f31cca7cc8544c43ee72cdc2846ec2cee3044d82b8883d2ed3d8a307413d220d5b8d7f256bd27afc9ae181b23bcd92cedf6934868cf93b0d1932ac3b58d9158abb0156cf69d7a597e04c4e0b3bc36b6d5af0f83f4dd0b968df15bad7b2441129256d2f5c289e086952a3958989df208bfbe88e0b7bacbb6c28dbea7a62188a9e607929542535316a8f7a9af1bc942da4f13bdaba7965af6f2a0a9cfe25f3c612fbba6450baec628f16811c16238bcfaf3d69fb97d20c055ae05b2be3d7641e6971289900409c5e14bc2f830d2a47776a5cf9f1567992e9fca49978110cefe15d53d819a3826c1b85838e6288837c0771c16102b49a80e431ce46412275264357e94024df910619afb216b78ff46d2cc43ddcce19a6951891dde72f751ea9234f7db3adfffe764e9914c0e1af475ea4ce90cd4755e8c9fed588ec3eaccbf979ff014d892b80d18d7a9c32b2ec59082a3f771f232bcccee48a073317028f7bf5f4b6d25f0ac31f57a1e1d61e9e6ff745ba3f9f061d8a08707d36d4b48f08d5914612826749bf73b3356403f74b9fbf8852f0a4827b573c379f8a6a148876b0ecdbb124356a244b69a053cba2da934e9284371089993a1e3cb82e5afa64be8265cac55b4ecbf35d99d6e42b4d8cb0856b75c978a5e7e2536c91636e35a8520b0a592eed592393bbd3fb5ab00a30b9f3cfd6e152ce0729aedf24efcad0ae344eac2d7cee59f1dd98fb02c208a80d3ae3cf3e2b08191cdb97250ae48fbb16cfa851ca7416706e0acf8266ba3366c2c73b1465f8797f4afafd9a088e7e8fc6469352964e4279bd08429248580c2ddc2e7d6e76b192493e8c7cfa8ec885fb418913a2687c4ec7494dc73807243204bdf613bd29afdfd1b35890099425b94c3cbc1ea813ca6f9fa2af6acf98d46167b38835fdc996e2805d251459cce6077477bcfa51290c6570bdb944fb70864c84670f6237cd0efd0fc14cf11f4971fa456d77ee0878397e283e302bbc8c3f7af13ef8f90ecf99065f14e8941b732f0e1c593e144ce72a9d41bc0ef469f042f1fda18984f60434380d97c71035a8ec07f3d593c3f6e3a264d179f089aeb1921322c4c4748a92ed22128f01e5eabb8744bd1352bf2a710d8efb3128a97fc534241cb714defc38f8de1cfb78ca2d239409f59b9d9a88c040ef6531bc67a49ff88e84bf92720807e6439ef104eb21267f23dd1b710c46958d5aa1675977b317eb38428a8dd7d83a303eb1bd316a3aaf941decd1b81fbee48b3823a823559337a868fae0cd0a302c3b4f103daf12ff8191484b00cdd3247188860718d569177e249dcd0407b3546dccf4b9eed683e1c23591e34805e33e15003ca936172b1d829206610fa059ff09bda61ced233ae902e2d5934e79fe08d68f1ad78f18350b541e76f85760a970b5267bed6054a2630d9dd9f69842c7d74015c65441e0a71b2c44f01bcf73aff8f43fa08295afcfc1a7fe305147c170ac60a6518986f6a70cbd08490b80ff361d1890ecc5b64bfb8ca1ff7c34ad53876fb5d54d4be6551d5fba20702052a3844c1bf68672bf418cb6c466dc0bc399b3085e409240206e93a283fe35cb24ba24b7702ef0fbfcd8e5478456ba4d440bcbc79fd78b8928ce4664c2ea62917ccd4584f85403b217f0b562d14b3e4c8acd361f42b3ffefbbbec6dc23ee1f84fba87eba657f3ae12cd8ace3b1f290fe1cb6ff385082d838a337182b98c02bf958f8b5bdcec5023e58b1021ee1e6d03d68fc149f0f248ac67b28dfd314633467ab2d9303ab9863a07f9342e4f6eab9ac603f071cd0864cb05e07b35497531942b80acbe5a9e54502d05517b85014c3597c80cbae446eae04636bc18478875e4cf1a09beb3f0102f0ba51a8b850b4612bb21d633b3655693d4cd0803f1b3b67549ad1918134c97c60cc1e798d2991748ef11e9e7795ed0e3aa13197a836f2b4f0041be13bb9aaf3b8ce52fa630e6afaa876be1b512a34103cceadfb7e9db28dc86a61ec9d990457e556c9ab7399088c27def034428d28a9c10b397788f2ba211eca1ee20530d4ac5f13d7818067c06f6fee2f27afbba13bd06c4e62edd4d68444470633fafd11e85ac9fd7b14fe0822265ce8c7cf9587500e299248276bc9c3ca0ec7491a7c7ccc017b23d56a398d6eb12b47c7946cd1709a54a92e07842b07f4465ab8504dbe15ac1147ef9104abc1105dc58f771f90b1ef06b236a6493136260db991a360558cef8118ea4aab361038f4af6bb03c9ad819f60bc8e8c610048e9013047c413335c08dd74b0fb0884ab36041cadac3fc974d4e5a94dea5940f3d39d68c4414dab48652fba86facf61a9f8fe2f089318d1fdf87611a31c6248fabfa5510646bc7dcda17b5621e7d31861ca5ffec8a83e69fc2eff28c1a054204ff2a4c3b13727ad1d0e5de010619a3233836e19da8bd1be9d8a284d4885d79bcfe90e27b233b835b22cdc13cbe9a5bf60685cfeff59954d6c640c6c6d6e0d9ea7528cd123d1aa5053723555997560cc11ea7f9531edf2641564637a47e6b40dba5a6663f2aa783873a370ebd7909b8b70585962779d78b8bf77e941fbd18018d680aac5abaa99b3cfa9bf932593b3f6404f14bc705767928adb10091cded6e8db73039cb5789b168d7d63f7eb411b66bd3569545b10961a83ebca6bc4b7818175c80aa15bb8a930a610681f9144563159265c8aad802b2c0be62d53980f39740b076eb84e31641a80b05fc567730c38ac21cd9de6f51b7f04318945e4dc1f5a8a29e5ab7486be95acddc9f3ddac8eee89512397ec7c70a07b8aeb4a82bf2ff5b6a1b2a05fe5b0555aac001e18a5561d76f0d41b0ca0ced9c353ca2703d0c160ce0369fac2671f6ae1289d60651a9c2c579070f586add007ad8538fab40db2a88947dff88624a8dae15868cfeff4b398f9d2b529dc34558ac2bf126bc0f8b30575897b8a53a43dd43cd5267d524d1881e8e8220de36b178a527e661bab5a540f8293f66662142cc7417b2eb0c7fc7bfb1f230667895f0772551ffd92c71234bfc8d8203c3f13f3429d3137585e1a40f1dbeea4ec25ae09c536bc01255e6a78b288941cf25ee137d9298958eeb0ca77953e297ec3226794fff423adba42ec5d00dc8831c85b51fc2c0a79b030e11a1f845347ab0b9a4b422dc49b86e094e67a39055fbe19019e447b1f84dfc462cce94a5499371daf5bedaf06113d307d8a4a1fa5a7fdffdeb2a3775785c57ba1c80be6d0d5cf7d280db00faaa7d20e7f62589f2932508ef2e490ecba320c8d3a2d7a8459a6e5a0ebdc95a733231dab3e67bac4590f247cffb0b371a2d221a7dc3c5471d0a3c952eb15bb146e93f7bef25ba0603c022fe796878a980592739b110ab20d6f2862e82ca9cab1f923f254059dacabe614a8b7b08173a4e26792eaf1760fe8062871ac1b7befbd3fc05a2090993be06e49a8ae86e0d2658237cca8c1662c6b1fa58c9962a480259de03d5b0158ad6854e03fc294c4e88c276b9002b40fbbc32d13fb2d58d604064dd5d5e2ec0b2625fcbf69b008b6caf0789fa004437522238445b56c57e7b39cdf7ce74560f220ac59217f57675fc4892028311546093cb33d4a15a454efcca4ae785a17677334cedb78c5a9895c3580a250ccb5314de1999e4668089445c328a322ee935d0e75d2653ceb1f8427b2bd167c813ab16dea5c111694b60090a749027a444db5af038a9c3574fc2224e8574eb7bbd28204804ce0153369bbbbb02637d3b003cc76f64670c3ca827f35b98995ad799d84647a895a4301e894c9246968f92d09a58fe250b106045ee21107c7359225bf8f999c6f81ff0c76c33de0fc32a8e99c35ec3b9ef17f5768b22860ee1a13a490e84d5ab9ebc0281949481aad08905086f15403ab1a4a7bf07b78bd03c5a55bb56ca26f9b44221b85e789e36f77f8ecc25f7634a42c0718383c92e21dcf60f1e96376193f47f5edc00f0e12cf0108096fa1ca12f29ce22d1130dce9730c77f532c35532b6a372f38879388b33bdcc8e52bc584b54c8effec085ac25784aa4029c76413de946c4072c5fd948826af8cb1753b7a8bc151ce9607f1b26e435488a552bbfe9c08678cd7963df5562ba40b25a0fbfcdc27ff297bd21e0c13599f87f38a1612670a2615b2ff5b9904bd87ed8e1ecb88992e1cf7d53fea60af647060c57732438dd3d34fba49efa86ebe460471a044042beb01ac20db47eb793cec70fbabe787b5298bdae1f2e27f581a50a20faf86f6e4fa4975f0ea7f0417fd11c800f3c85df1b157abec87a61b204f6fed6bfd4c06f26761a67c4f97265f7cac4c1928f5cafa3ccc7b6e0f4a5742ab266ba04f07f723f3086a3fa39025b9766a73d89dbedc48053a2a9f0753e1046fd3a443283901fafac27d3d586dc3cdc6901eacb74dbc2c9004e20468b8f3d209644a05f30d01904859793a098def99d8d5d1ec73f1de7a53503fd4cb0f2b6bedf196615f94e061d85a749449230a6f331fffeef1eea1a4010d5c0393a0877283a66311741579ddaa25cf5a3f1ad79c8a4bdaddf004c05770073af0980108224b4e2d0e0c17df0f92623e5426d0872a00955352fd3c4cd7a75edc56fb1cf9f0060d0e6e539e3a8ea20aaaf648084b310f90a2a232b0efcc96d7f29460bd0d9266319f6b55d6b9dedf04a195c40f4bc9f3a1d011806ea3e3a30d4b2eefaaa75be946e8fb71b087795fd1417e6ab8e7ab8543788e08459ee885aea8654141b28c1fc678dc440b76cd385e82f18c63436e64155811a76625234e589f511b915549a17a18b26fba7997bdff46522457b31700aa11bcdb621c4c5c3f188e10e1b0ff1aa2ede73c66015ae17b47a50da0f5162369c58e467524a6c5ce359af7937c2779d30872da7fb021ae9635df9766d724c92b617ac2cb893d337e321e07a92c7e22463600192edf63ac1bf7485f946fff21f520a84b03bd1530311acbc65c49e9fe85bb62705d54356eccf617fc2903c0885e81ba0fd46ca49b5094ea727f6332ffa92bea68833151bfc14c77af0f63a09216df614e52ddff759c8543bc22f772e0b1a8683e91b960af539125a513220830c04575327f74b521cc8be046280bf43fd2c2713a97225b627dfebfe8733c0a752b8f240aee1be1e64ae4d862806779d99b359438f9dce70541a1816f38b9f19eabf76b0ba1d9903635511545c265ce4604be46fa76aae04bc44cb3b21bd7b79f9be7c91d118cbcf2bd9ac8d71d91a2214746f6ed33284bd868476ad9916fe723dce6ab533bf6149784e5e50f6b48d10687d43248ad45f9bc61881760efbf716b7a0547eb27c5397ff4a67135745f93230ff32188c538470606282053925d6c661ccfb2af57c5d0349d74284862b2f5e208215b55a2487fc9ae91b74252f17573ac73f95630ba6d3a8c053841745886d36172325825670137521edccda668c86e98a18c8368224b701a7fb6d9cb7432b5d14f058b9154323f4d6ba3c7bcac88da0b4443b04a190b55682be8288573d446ce63481a559b07290f2f1ebff26d41da48a99c785b88b9ac0521e29d9598d69d03d5a8521e4033d8219d8339e4a80c3d15a14628debc3354c712f406a88f4d7a2055c0c6a34a91e6be4c490c2a9444b92d3fe785b0e18c1d65af5d744b8831673d45687396fdcacb24fb868d70282be6401a6b07eea6225d8a911be10f4706fc69d376dc251b93b52bdea778414c4595ed334e1499c08635ff09ee5bdf73d340b4120e5be0b6c836a0d7e0e4e10b9e368cd6c64f2be045a0929db5bfa70a687618b15a2e5bd0e35ee848e1baace1dd72ed3d8dd5b7d869b92621541054686793e9f8edf7e9987c57f0f6d3997a8280e7958857aebe04797be8741ab9ae54a28b570f692db961587a84ca518c15f42fddea0d00c7c00478e3cd46ceb905b93ad1dd04522adaa71fb0002535b6ffd9307119ac21c661e9c598f013fb9e284882ba46fafd2084988027040f00fb92165d1edc0df5cc953005e55071c22c3e3faf7e622bde8147a739447855701e5a0cd100d81d8c0009a0083d3e92673d12b633dd881496a82212ddab24aeb7f1b1cd59a2b8eceac79a7d37ef879026a2111460f30dcb0693425aef79467eafb18827f7d5ca47244cca8e0091e7016a597c53a60e5fed0748b1c51e8723aadc62017631fef6c0670b885660733bde1f3ae02ead0b6200b1d02ccd6b7cc690f0bad8826e21c17306c705551376c8a818a0093425eedc23e1d8655784808c72b8b5b4cf64291108dd83a04b0d0a219e4d43c258b979304e44ea960d90b4f0280ecef910cce0d4be3e0d2f0a8060db52c5feb07e8c8f0f25fe173682b5a191c49b2170fbeb9b76c31252913aff2400c592e1049471dbf81886bae585e2635ad9d059fba3da90bca6c100764b554c43fe6693b4e96d59496fd2b1b55503b52ddaac89bddd6e2b9238c6e68762ef276d2392e2957c3ab16c4eccc52019888b3457e304a19976112f786dd413c5fd3d8bea6fd35794f75554c3a8bbc1dbcc06c281c83d2529d59da3eecf7910bffc64829474f1ec935279d7d1ef87558c8eb44847eb4958ab4ef8a9ed3027f6ae324ae3bfd1c23422f5c8b67f363ad512cb55f7c571a7b02e1b083a07555d53708d8ec756527aa50d25b3e9506b06175abe2895a907adbe2c7f73c12734e4042ecfd92a754b712034a508b428ced83b5f439e93298692a10c0b1ea106deb300c5a2a813c2b06bd713766a85217f1adb4ef0ffdb33b8785c4a0b316f62ac2bb5f28597e997d850668a6b0eb2251c8cd1bf1fcac6892582d4ed6494e94719c1c21d04290faeac846873ed5eadbeb484c780f7f4ed9af952d6c47b084fda46c9d7106f2db9fe52cfa0f3f80b13377c063d755bf7b94a3453325b1912bc877b539d9a5a55d6442bb0e8412928b356352c6024f6921cc9b1c5e522df8ad112801929b43ff05b65109a871b47fc3163184eaf213ab991fdbe3f43545a5bcb119c86dd03f83cedd393d1a82b3704dca616f335e26c593a1003beb515a84030e54a907c5a982d206fbec6743a6abbf1ad3d7d0639c1e05dbf84f3b3bcf4cce63054ed11c037a8c48664f1636e09c17060f3322a8b7ef5b3fd798daf485065cf45a77086de828364e8214eff1c161ecb75464fae7ac12827a1a99fd6fce3aed21d8c66c2e40c6396f527747887faadfd2405af5954c4926a5175d554b916b8c730195712ba1ebd2b7a0cdd1dc38cbd18d1b2e86c6f4d74ecb726ea500c45b1358682dee2946fb2283ea98bc12dad0a35be90021bcf04c0dc45274401edda443212e3aa68b3c81aa356e2c36b8305e59c303c1b0d31802ccd5651931153419bd66940a706384886ea4e32fe01e5f039ac8c1bc5f54d8f476c233411a0816b64d8a7370a5964fc9e6a49f49f05b1d5ae3ee49166da7af32fa3e44a657c22c7e8eb3fa245d523321e32cbd66684dc0098529add3e9b4da6e15611045167c08e6d5940de9c6c2d4885057ae67a02024254282b27c22e5e039da6e492397e62c1212ef5f11aeca96b13225d83ccf70c24fda80a0ec611424ba44513ea6c90ff57d9308d5abc67b5ae61415b1a33ec5feb1417fbb1eee9028ce5ccd27e61383214144f70e70a61a8a3e26a01a9853108fe5310fe080a028c0282d3272120e1f2f7a91e77fc5450220add99ce163e77ab5c4babe2c2c0b9a531d7c3e60dd3059faed53d367ee8bc3eb573897f166edc13ecf9770d439be1d921e5113abf7eb890061246e33cef28d2341e07667ce6164bea9500ea25c99b00a6102291e164d3001cafe498b17a9f5922cb62378b394c33952235e859fc0efb4cb596199256856f5a2eac1717e27942505953424cef7cbbc2589754a20c0c5c10a52b9e24ee8c53f6c72f68a8a54dbce5f25eb4fac7a81ab45279c9aa91387ae641d131b7f316ee74d8e112a5780498ac49120bf27b725eafe80368d8e15668e524a28a342baf1e1c90edd293b5f76005d1e0ceadfc209e313658dfe4ebe989a0cd3d0242da310e4a963964f885438e90fd0c50f1f50b875ffb7cbf404974668b1e81cbfc3d67dc473bdaa4e97e4726c7fe9a14333bd2676faf67e027ded2dd08c70c097c4c0dd13d76bd851367771af2d8e2bb5bb1e99dd27628235071b431b5db64eadc0e7a67bcec02206329383522a3ad4dce727ed1a8f2b87b2c80d7900ce538a6a280570156147ef76860cb727d73a3a5810150547cc66ab255691190d32d7d315bf19f9cb6c1b9bdf696236ee31d4a93a32accb9430da3b9a4544a6b351d7869eb8013cb9ddfaf98d3cb03d71a282f319a43b0d5b373025b0f0ac2c8be2fe460e12cc40dcb027590b22cf1925467e644f3e97020ad9e7831135e4e36f1f778a2767f9c7fef5cd980df5015f612632ac5081e8fe74ac2d27ca3394dbae6c4d5f6b8b91a8f85596d02c09c18c5eef1dff26c20077bb57469fc0e0fa511eaca9a2ce2d0cbf2c8036df9f01e8b0134901b94284a8c5a113c38eafcfdbb37f351a0df8373f61df324023c19f502b62feb2e62dcf16eb962de8f7bc635c14198281b0bec0ac741d7da7af6a9100d1e45750dd987cf70960db288350b54fd438461c320f63e9b75b7b8a04a61a090e0b0e4c738114e9080a5a1485b2be36def2b1b6150cc616e58ab44054ed804a83562185284a50076550ccf599e4a2d937a4ac8c048e4473c86a958f55170112edc4114cb1225d9fa29ab45bf698264526eb18a8e293149178bed58b00879704529c979153e73b21da2f4e92b94d701175cd4080dad8f6768e9982135e4fea20a6319400d336530aef074eaa9fed56d914475e6e9518a7dd80295e40167aa922dfe3eb8f0a13b93e84166759343a223d44c477e4dee4be563cd3c2101d82d4901eed3b179e8b5e38797626c4a9ccd92c1ff081ddffc096fc0adf33f8478a12ee73448d3cc7cb01e925e202b2ff2811e9c1b6fcb71ae54403d06a8fd4b8b3ba63ae642d035d2c3495deaaa5991c51834a2658fe2351ec4d12f0a4a22fac859bbac82a0e8253d11881679cbd761f28b943952e351fedf6516482bd22fb8bc29e00ea2000c9504c6e9d2073f124be236bd1557d389b4d8e0805b2f021879e86b04890c0b5fdc386a6a21e4a6291d0cec0d3bd59acec1e8a8294fd30089e051fb875e8313640f3232c8f77112d8ace5c79b620858bda55b42057a97c2cdf2bb5987da2f5d46a2cac6b4420fd40099e31f6178f965348bd1dbe121238ca464e54c6b03cca5012a0223a128d222907f396fdfa1ec91388174eda6343aed727af49d1c004e9b7fb46d5e692d629126a39383aba832db29958ba4fdebf47df316000aa5fc4f3d0efcfe4aaa4b9e08db31a3d4a87db00cd606909a3a5cc5855b6e6fc51af2a812c43b22c3a136ff1f441ee34fa4ecbb231a6236eb060243e967a77781d66d250c3742b2c46791def5157fad466076d01696d4259af55b812cbd3fdcf4b87b63d77e069d47aaa23d2027b308e7b9c3a95cf3f3cec795f4610cc2bddaf9703b52b0f422044be5234f55d0d84c5bc1b996da2a04f45670ea4eef41183e4fadd640d146de2d6f7fef01a632d1bcc03efecf9391b81f56f2b11a43aa85fb92e123e4b54c02eab792c2ca470da87652e046ffe607e5f6da4341a6579989f89d1871ad1b97292365d3f9fd868209964375b10de685765ff495b5358e41a08066ec12e84a3f3fc71acfa517d24ebeb399ad91dd38282ad32ca0f72e7aae94472174912261d89bd15f1bba5a5e128f4178e603c684a3845b55656982f29547cb316efa90a04a40d14ca4dacea665107450f9c1bfb9d241e707b6beaa571fab5228ab1e8c59edbe094195d75b80ba41acfae1e9937ba7b13fcb9209371405215fe2ad3e6fd5f19e9a62509cf82b317b767c47ef0b60bebd475f7ad5036ae150164c320d34f91114c209c95416f03ccdc57bda67d90190627ecee6f2467ec5e50c5a0c3b91c3682d6260e62c87d6c687a849156ef45ae920fae82648d58f77f558e35314cc56545ca4450cbad60906faae5ba8dd88b70d748625f68395023d05768cc2532d7804396effb25c55f15b5c17708f68c1bd4ec25d9f0f773f5bf5dd3dc2a0f9836143166b79016e01504452c67da1561b185eeb9d5e1ba2086b083199a299f8d0088ac68c1c13a4b05b2a7741d1301dd7aa4443dc4a34b57545145a625cf0befa10726a7af7ed145fefff8b6f0b59acd3e817deab14e86bb67f16ceb1f74206daba1ccb89f8d6774dea50760f4b41e1f8ea5888d5a54f556691fd4618db25f1cf911dc1d9ffe8294d32ba776ffab7be43913e0e7b0484d3eeb300e0e9eaf82b749ceabbafa97e74bcd4992cd5649656e12007d1561f866b94d7aeb0fed89f7e51181d02dc2f166076a3fbc6804c9ac4a13fabb5486897e542431841abd8884265b59cf447f1d790d2a9fe2f98a77e851148e0fb74c110b5b8b32a208b4a374b8ef3ae1b4b4c1a6263c13d19eb346335055a8b0e6c3c18af67fbb2110491c4b09b805bb0bae3580cbbbd3ae9f6ad65d6f40b1c2ac85a8592b6555003cd1bca580bf35d08c1774512033cd284463467c52dd83e42a858730645c8abdee1ad20d167777d05bb0b5e403f7fbf371019e80d32321235ae1023a653cbbb9f707128bd3c840921150064f8e11041acebbce821328ea3b4c30b370cb458e12553b23e850c4aea7f2f5cfbf6e37d14c2cf2741a7d4e0558650c99c22388fa9b51ce47850f867b23b5661ca9c93a66fdf772b884c12d6e724ee83f75001c4b6af25c728d45881b26e43d927cd7b12958adfabd6edc0a5d908c67777f83e7d562421cfbf9a55f0acf5a02e297977f5d5ba0d970f96ccb7f88cd04ae5568b9b5d2f62aa36f21424a045de4e3a2e57b4bfcbfbec43e4cafef92a90b789df58a39372101b7e35fee2b7564687842a5d2a5c18dd7627baed9c3ca4187ac4ef182c120cd03a172004feb265b43e3a0a64dff32ea658ef30e5280a6f350e72b30603e20fd892c54a09e56a0baefcd4378de2bc253471419d0ac937bd57e42befaef296e471217bd3273a9b60ed7ad615b8146f5d570468023e61c80828d1e38509927452c3385b36550567a6ce7a120523fa3dcec7ab3d66e95dc584b6f889aa1444aa4643d02ce0ceff5944c4e031ea099e4432ea58a9811787258d15d43870adbcd34b3393f6444ed184010186d453162d7dab73120d183578d43abfc9d1f4c1cbe7438f45a6c772e488d040bfb39628038c55c139b1aea9df41533fed71675d8971412092c572380eb820267a6472e1d68264ed9264d707675332f048f418393581854ce11e15ab92bab69babd02923c274c111c3dd0b0be99056b6a44c134c6b90982dfc2cfacb48c107d16aee59c3cfe61869035d01e46fcee16aad0005324d6081358dcd1a7d6195cabb359d8da5bab3ff5dffdc9510feacc257b0f151ab56c2428953f1a177fe5646d0c0e18aecc5f82da0ab2da09241a6f22357fa9a0af5d75e6c2b1cc0b6ba4ca7671a5cba75aa46f665255483aad163e2b059af1a897717b3b4f20bac932dddcac95bc2873d279daf7de150f90f9686bd40a16d66a6065a67cace9353152bbe3fbd08907f3e81fc4e7adc5928a26140cb597440a3d3b29b3c68884eb84f89870829f6f8b0892b8bbcf0462f0b8735412a8a3f012ad83552fcb6aa62708f6fb65e09e51129816db92e2e9ca4370e59d55261304a81720611253905eccf8e844133d6a0be213d7ea7181527bf3200935c3761933e1ef5b0f09c9155de59711760bb124d3a70a72f552620535f8951d89ae635de35754cc771e5b8910c0f2d503b300873688971062e619289d24b148cfee8831616f00c481ae6b71e2cac7c772ad7c6b015de07ea006a6a1899b4347325ffe183b2a02e07497e703b07f0cf97c339dfd2a2105c8d087dc0662e7a7b967601cd64db91c577996fd2bf5ae863db93162260497f44efbf81b8fe1c1a36466ec44f2da35d32e3effb3e816b88a9401c881f0a9ba6d848a5e6ee6b1acc29b016eb933331777a091da53116325d781539656d1e85a5c2690ee89bfc51f222abf01d2f4b8f98ad6c53e56de68e9ad7cc8a5a5c20d8a42aaedbf61f0167d07063921220e7262a643af7150b0429a576efd0da084ed739b0216508a74dbf6ca606c606ff650b3b8385aea6b27bd905c48c8b20fa1fb5308c4b309340ae6d08ed2ef72530104d8e6fa581a53a24f22c38232cff037a0b339e57208a434a07fb65a1480283ec29081ecc34a99026f255b9b21619e25d5a88772b08a24ac1393ef4ad820504430381582d0523ad4a11e68850a194f2dfce669b2dafaa9db466afa1a242cc9c35d9c8de9b6cb9f79629a514d5099709730ae3501d7da972cf4f2bc4792d6204cd7aa6667750da7743ccd036aada483358206d83e68fc5624e44d92f9b7d331445b5cf7e87dec56bb4424f5019be360f5f5b08a6ff47236f8819da752322041d8daa96113143b3dfa1d365d235d79a689777a767dc9a1adc2e7dcaac5b4a4d6e4b33d9cfdd26a5f481a7ac5d66a4c93a72b8319d6ef24ae9deabedeeeeca4cbabbbbf7c6eeee470eb46b38cbfec75c1f3977c6e83a5e556e5bad3ad892abda919a419124aa2e7b94bfaadc26a936b799638d4955c620c7781bb3644d6ad9d09011a36f6848a325ac3e265f35a96563b46c8c2825520fe75d80db65a66d935b71aef5d9799bc6da1d6f3651b66296652b9b881e6d2d8a3d87868c187d43431560d0646ede4700afe0836cd5f1783c9f121f7d8ab60fa5b63a4244e64c7a389616aecca8a2bb44479bdcdddbb66d4b2c8d51c7a1ef6904d4ab0bb5c445127455176ae98da6cd7e924f9452293e2346434346666c31a3cb0e9d434b4b749e47e7a474bab0c874dd1caa6f0e7d2ffdb05a79744efab4c6a3397c5c9d6e0e2dc1b0333d3a2735a3ce6a68ba41a5e87c4ce8487dc1644e13072893aa2e51784ccea062623229638b130f130b1bf898a051c615052fb9d6dd49a0a13304cd016785c49bca3fd4b39978d050b1cd28bc58b3e4059a2680a0b22e1568e6a02193029a1e3a21d0e8b06d9cd652522841ab38d07d43b180819e2aca3477cd0a531560501d6a8515aae0b4c800f5432c63e982e4fa270b11a505068fce49a57441a980c4fca1e170a08e3e50d4fe4997a094e2d487d341f0904e3ce1f6cd3e49e1df9dc2ea051c4774dded44986eba1b279cd8ca7016b84249061fb0bcb1c598146ee0dc0d540a1b0852170a0534aa8eba50286c31f5d475de7a2dae7bb75c4a96cdd4f16f86c1d407196dd046cdb2f1a7662828d571a86658a6a863929a6967be15cf02b09c992d663e5234fbd1f599fcecf7276b76193af66143f9e507c28eb36e731dc6820d2eec85c328e14f8646f369cd27f5156e5f81a505e5ea42616962b3826e75a1b098d95c4b3d38ea80baa857170a8b107514a35c989b2492de5283b2e436dd94cc3b363333f3f2ce2cdba6dc5ef3d99d18a8933b3d1a3ad0205867bc351e2dc3cb920f45384511054b7ae1cc1759b0d142d307be9879b3ad19438b4d0ccf475da8d8147555172ac6c4f644963973d652baacfe5ecb9deb9854a76f2dad378fb6b22ccbc4eadd6599f79c2e176dfd08bbe515d1edfbb96c3231414e193a1d394a39abdcaa946e356db165cb6ba9415fbe0f33a3cb253dda6a359ad4e4eebaf6a3cb20edfd67fdfa954a929afdd7dda2f9922f542ba8472da5b7d2931c345f2bc317131364168655644daa4935a9ba1a92b7d5a3065dd6c0b1ca945566657ed93f64939941576b945d9da156cf2cf3c942cfc55d8f304aa46c91b3f0c5241b5fbd9443fa8c925ad76c9164de7391afa16b5a96651b5825d35a3e3d5c6d642d4dd342d9aa926d9e65e1a83d1d91aad7e2f45d222d34c155ab6455ca6eeef6caf40082f2f7945df362c2b276f56637bb6fd404e5df7fd2a21caa3870a4de44b1814af374a68c1119a7305ed625089641f96515d96cb8ccc0d4a23887d83d1ce5cb16e98e4bcb9292136da116528e219d50a5842924b438428b748752a7e397db65a66d935b75dec7daa13c3d385a3974b878f478f948e0e3c783e1043f40280822020909f2807cd0a7a4820ffaa828b1e0977005d263821f0a7e9f3611100b2af8fd28239030a5842a4dd43591c7f3aba5f59be357aecfaf04bf3e7e7ffcfe2ff81b3eedf805fa15f23be437e857e897c86f91dfa1df20bfe2af91dfefc08326d2f1aedf0b9ee877878efc1a0177c50b2eb8c002d05501e8f3290162c10e22f8b3a228420902be901f1186401fa08f520474893e2310015b415c24088194822941a007a48421e0fca92244fc0982882700891f06118384235205f2fc1480f263222b9050fe843b01e87d4bbaf608671b232bf6e8d1010f70c887110f4230488221272028aed8e37d829e1c015d0bd4e333007bfc4b84d2e363422b8fe7f1616bc51e2e1278b8be0f1c0e193360a93f42ba628fd6141fa0e7ea5142ddf13bbc2a3ea0d4316b8f135e3d3e078f1e3cc211a9ee787e17e8d362ef08a5ab65466b8415b3a7aad996ea5170c4e1920314a1a7054259317b1e385e8cc00e8ae8c7444a3555ff05ca1e037077a70c0ed008eb63428d3ae801873e231ef080415ee6a4bad8053dd9017f44282cf0573f227ca00ff7513cd0357d46e8c0d6e622610552ad35a5ba97f95c3173b02552f5670f3fc79baeeb2e2deea7914655c7aad2443d453d7117266faf8ae2ed43be4f43dced52cbba9523470e1d2e6fc70e1e92070f6fe6c1d3d3f270e068b572ecd0e1922e9737bb7444b5b87f8483575e3dd5a324be388305324a399c01610814b460da22e502144ff6873c4b02892aff284c95bf4113e568d53082321d2843ca06036c41c301a7a830626280c929c9b4b8726a31cbfab32d719e56c8a9c527564e4da442d7d593afd1edcf15245410f10413e38a41c5bc74776b695149c7b46f262453d0093240c75eaa60489ef016bc8311e03a554abf05df35c881054c40ef3fa589c4f720ef14bc0379ff799fe03d7c07dffffdc7bb8f7709de7dde5fef3dde79bcbbde77bceb787f2ed37ac7f1de43df77dea59a084ef7fe1c874a4e1a5c2ff09522fa51c440842eea2dfe4484825e480646455a5a642629ea4b2d8ad0407d8193ac084804140283c021a0abc57e21a00f09e09412c02a3f20528bfd138021c84a2df683207fff0f907df44bd0ef03f2cb4b13c861748039fa5bcd69784d8b6cde48810c270e555506e03750bf1138d440fd45e05103f51381188046c0b99f920ade02709cc275aa0c5fdaf76fad207c69e192973f6b2f3513d85b9a4b7781437f8bb6235650e1035252505901e317b7e8e8072c44f0654e116b88802291828e54e8f9ab3451d090e7476a2221cf40cfcf4a4d243e07f9ed7982a74dc4f3dcf3ccfcdca4e3397cf0f99fe733f7bc7a66d3443f9e7d3c4bf0fc2cf53debf9394e13ed703d8fe71ecfcf693491cff36b6704d69e02f9459ec80379ff7923a2e7efc08b30e01fbf16bd91dfb2f302b90ea7c1552ca745aa16e3b438d5221c9602f90dc83f4066c36bb8332df23fc8654090c980ecd46298169b5af4c2dfb305e4195ae49f404b8bfc41405e6a5109e418528bfc43c0135ae40f02abb4c82f0496d0223f056011f0898040402822b4c8ff031a8122680476e040fc19141929026e25026ecd005c9811b8b022706144e0c284c0ad41e0d621e05621e0562070ab086e0d026e6d702b05e05620e0d61f70eb0460d7b03eb8f507c8d507c8550290ab0fd8f50576ed016ee5016e75551de0d61c5b716ce5d9ba037665c5a91ea8d50eccea0a64816121563970d7b8e18b589de04231550c40e9859818cc080851550e42549d2d5e3442ed8a7e3035d176994ed34bcda6b7b4539fe9a75e2303237d85a3cbe174d9ddddddddddf971a0d51e3c9ea45ce148abfc4947e85239bcc98b1ccef4a697540b87bbd7a9bee4a587f551b912d547e54a3c74674d1cd69a6f4d1c6f6e4d699a9ad2741ec7a75a74aa06f2c2487c8b2dc2cf5e877a95075688dfe1ac10ff94c769911d4e0fd47f7f743895799fbbc85811ce3143062850b54796ceba8f1933a69562580e386a7fa411556b228aa354f02a7f8e55e63a0ec4752ab7ece95ed554de4fc7bd88223028a23b881d0f9a43f7b9bd9db86a7f7f7a5903eba48a36558626b0871890a1fbdc9c45b654d902259c2df14bce8103551bd0b0c10d1734f133b6939e1f578a87ce1dd6efd3fe70435d74e4404145511c88c5da61fde409e90ed8645a2cd3223b457197eb2974adc2d1e56db793e7a4c43427a552b25d4c4e55aeaa7ee38552bf51727272f2516a51a9565555552935d1127f12e50f8a6e694717dadfcda6eabbbbbb1bf4e4405e56508c14f154a25aea0c5ce5405ed44ceed440feae34a89caa38ae28baa699561cb725ede84277ec401d4e138dce14d5442393a96fa49c698f6c990ef45a9c4e4e514e51e30af4372ed5a23f5731f9477155145745557515131333fff61b0733f4281e682b8afa9c9446f96fa0d769b18d282f722707722f722607f2778a72b928f534bca03e2d9249a3ba3c2a2a2aca9dbcc8e5a274dda9bafc69d1994c8bbfcee4fd649a8865ace7029f923a5ea4b592ac92bd94c9c9aa5a74aa2aa80f273a721b5ea73a8cabea985581b0b08cca81dc470a3a721bd57fcca8aacf15eac96d748cb7295713eb99a23d514f2f74717ae10c6db5e8c3f4138bade19ab6ddad3dc7bd902068563b39c1ad0aa9a223c7caf453d760778726700dab6495fb15f2cab13dc2efac0ccb1675e040eefe5218a85408c07df6fc35c9b44a440e65bd9020a8e62222872225c1583f82b03eac907f07fe43f57767c2034938114d2b674a0955249779c3c6b967e6768ee3b1a9b8cfe370a84059bff385a393692ff434d54767b3645b1c3b8e188e9da6fa73f086f29a292fdaf16ffeff3fdd61815c27b6a4a48529aa6b5606764cd8ef8fd505578bd5055f44cad0243b95e4a8e888131c2d4fc0ba18428b32c09882035e7c213f8a03f8a118a3cd191c00c01649c2751ca881f6d150214e18a391cabc5d9c4db7bf5467edb80bbfb0a58afb8dcacfdf693451868679f230511fd1481a2d1da863cb852beaf85ad8d43168c82889f4eebc7976a0e39c925a214ea3c51502056d582ffde4a7e3d7ee5ef2981bdd7b5d7720952b47dd9ba886b6a826632165d0d163cd60edb8e3ce04aea3eb53c25d5825ebd0b542fe1edb231dc50a79176ff2308ea57651fd635960a07abbc952bdd7ac90b79ceadf5dd54469d469a23636e8a3e670e4a99a3daf668b631509e6f564e78d1d56f80a8165651b030ec712eab8fa2ab2327f4af8bbfd9a8052387c3d6179e12b04d6efbc6700d6ef54e1a7c01ff9517b60f70c766147359b16bd2e17f69ad80af60ac10a0f16fc8d62e0d181a424c208828c394b4fc01006ccb318c3c6142dc060a60b1c98ff917f07a21aca46433c79d117f3f5f5fd89818eae582f69bda5f6afbe7426f4670fce586db0ebb4586df0d5edd77ddff77d59f6ad7fdf9c73ceb93bbfd75ecbb8d5f79cf77d3f3fee2748e54a9dbf474d85954c22659cc2807168d1aa51a603607a00224b135ec066256306992db4d080831272c480ed7214bb11a2f21f91c5125e5466315b84c3b4d145ac5eaaea9803edafc05e6a719fd533d4d55297040d882c4d78d1461da5973a4afb554ee8c06822498b465c2bd091b67ee47738d75d68e8487d687d5ad3f92c6d7787cdcd8ae2d961bb631c68d78572e10d946e4176a2fc5e38cfd0ad0bc5e45447c939c4d4a8fccbdaa828c97e09576f975996f554c7e124aeb9fa0d3857f4d6181983e64f5daf8acf16b55307caceeb56cfff79bf9dd7ad56a1946d6431255b1b59ac8e973aca36dec83a45d471b92875b96569cea02874bcdb32b0b7129cecbccdda9877e8ba6da2f9e3aad98ed94fd5aad4ed27b8e1f86ad21b38c5abbb11f06a164ef1f61bec6a3f8f5ced4edab8df745bc5022d1e512369767111d9cd5c84bd882ddbb4369b4687085f516ea305aaff4b2b750877772919894727285f6e28bb7c5c86e13e9ca8bfd6595fe98cbfafb4b73b4bd69854bd8ba516c2785f68ab2e540b5b5ab800e7011265b60ea091810bda8345a82e154b60d1a1db976df0ce9cce51170a06a9ca3aea42c1d0040c6560688282810be740bfba50305ca0f2b644e7eb2d4117666617d85466666666efe5ddddddfd23df667666e38113dee5dd75c2485e4cdcdf78a372507b61a66c4bb7b4739f935b7dbfcfabd517f69c337b2bdb6babe7a2389953adfd932db4224666e19355283a103f175a91dc464d75e775dd16d2b99f3fe15e0bbfdf42eda795ed57bfff8147e090cf7fa2fd14b75f85bfeeb222c68bac70bfbd0c30b5701d488663f884fb2da40eb4fd75dc5cc1b4dfbe5ffc49b009be3834e1c97c2e449a6112ec17b6cd500cffc23425bd427426c9ded8e8661371ff86a3a63d0dde6573e3e4766be0ca8682d2ee6610ecd09013aa450d5b0626eb0d481db2a7ceb21c91653993d585ca42841859306d9b14526b64db8fba505964a85d5da82c4b3d743a6ea05c172a0b0756d0fd66557ea2cea95080cabe51f7f74de560ab211121a8905aa5bf49563b2ca1ebdeeeed335d78cb0af916daef7352eaefad90ff10335476d29b9fbcfbe3c00aaffd51e1ae46d923bca5015bc4362c90bf2882200f1e3c3c1cfb173182f66bb07136e022edfdff0b46d2802de2bf3d17692330dad4d0c239bb47a2ac9010135385ce69777f3c8932e504aa4dd342d5c669a1aa8ecd4ab57fd93768a2d12853c2bd69c42c06f1a0403d70f2648f78d5e774d722d5fde9b279274f5c09c70d15bc50010d74f4bc1c74729c41f70de01b8edc47ddadd74fe8898eb37abf6cf195021d674f17b495a4a84f0560a88f1a29283e27a5ae21f94e56a80b3afaccba9f630ccabff1eeeef2c61a93a03411d38ed33355b97730a881b89720d71df51033747b13a42f79d1108c7ba73f3a979d1fdd4be5b8cf21878ebe3432936b71269fc1b73817efd244ace77e288a8e2b05c5b9e7a53dd2957b2e1ca733e7aaccf5a8a156c43cf1ef792bf2795e7e9e6581b85f5f5a21ee7b9ea056c4ecbc159e976fa5e773ec844f7a72844838deffa845ee5909c76d616b699153aa5cac05e2005d0ec47d50137dcfbd91ee39ee8f38314f702089f11e472886f5434de47d4d9a4b8bdc7bbf8159ddaf092bec2d2d32e1eaeaab9d910bd4975ae4c69ea7ca7d4f9473df23e5dcf73c71dfb3867b0dfc403937b1635f6aa26c8819ead5ed01bdc9a972dfb937c40c5dfd562fb342dcafc0ae2e713f27a52ed7bf28061ca8e33ebda9e34a5951c7ad725347aea246d591cb24c5a0c60f4ab11530b00412b0f12170468526a4d801851dbec046a3ca59e0f0a4c4134f4d21b800cc43189adea8418c9a1ab28075382ed51059cac0a10b3339901903d6ed90660530c49082882558d21727626cc849a10b1484808dec54b9cd0f6d6c50020b1a3566803d200a1ed68c1186196cb69852c51963e49069d2800eb0a414c080c2228b11cc71430c58520a5c98a12688187250f3046cce531a1d3cc0069a30c280f19fe045495eb2c8809a2e5c4081060b8ca5d8e8f0d4021464463007c6201d3058c880e08a2e1d80f1516f1738d280184e9811668d2fa060722a881f7480c187262c1994129a135a103b1e9695d75d839683c662ba3431173c4981404303828d575d2820a4aa56170a083736743842d0f9d4b22123d15bcea26c6e0e34a7cbe5b3bbbd9dbbbbbbbb274eb73fdcae69e33e190d4d3a79a7a6a27814e9f2a5670b467120ba4d71c8a8a9eb88c62867542e2a3d939e6db568c8288acf235c50fedeb62c93dcaa571d6fcbdcbbb6e8284a94a928475e14256bd95351a68e6c738b3215658f6c4f17cbcc649ff6fb98ecd3c84d045037945996695e8eaacdaa6955cb6ab775267de3f5362ca59452c27aaa94eca594524a6ddbdd51beffcbc974a07dae72cdb24c6a1ae73fa57439e1689cbdcef06186fab8bbbb19ef6e46c7ddc9ddc9dd2993ee9ae4cc69eb175ddb9448b4d93c706d83236fa2242d12b1f343e005d27e0319a63d671a4ccb8cf8d8fa45d794e04c623a476566b4f0210a3a4e702f504d0929a85617ca8723a8f041cca4c1070dd471a8aedcf0a1003e30413551554d3ae7e4c982c56a610b6d9a62e76b61a709cf8532aca1894498af8b97a9810b54357c4d2fac9ea09a525869b0c29a09460433d38005aa0dcc1c96d4a085276d687ec7e1dc88d1d0905196380db4756a9065d22b581a2c51ad6169a0c5090a4c19aa810a540500e3c4638d8dd358658041410e1b734c0f72bcf43035e4503dbcf1babb4710a681960c6c0467fa53325d9c0ab4ab0bd54314dc1994ab0bd5c353017a28f3650ed41731c838d7b471ee661487c86c66bc2ed49721c898de4b3a87287549a75fadea723789b1c20a3c68200e1c2e60a34c218a3947c0b0441530b4011b654c76a9dd928bdc42451d25536daff3258dda5e555bce0d49d47e3693c88ba8c4e14c924c6b2edd36343d0726c929ad7a4a871d380ed7e958f7632bf51253cf70059776ea32df8f7d66a762b11853ffd85149f41b1fbad3788ff5fb921bb5bd96cda3d43dddef4f696aa7a9dd438ca1429818141d3637c05a0d2e215021cd9b2f61387577775775976eaa3df6d853cee45b6a8fbea6b647d5f66245cde1a6e6781c9f921c596d9d71a10828a8383d9f9296d76acf63d5b15571fcb65071e0d880072a8ea75e8ca8389ee75382c395031da9182c1cd125c6830d18636c6003c6181b60fc3d3d3dbf696a0f16b5a787071c6a0f0f67d49ea79f929ee7f99d4f098ff42a7d497f6a60884abbc0a9f4599f124a3b0d27b4888ac176fefb94ec4c29d68bc5faa93cea1854596b2aeba70e742aeb691495f52ed60e712aebc5265aa82e4a54960e3e54d67b9f12d6900e2e8648418c580cf67ddf7d4a3e3a7ad5f37ee620a77a3970a9deaf3e251eed21442cc86af5948b1875f50b864320678f3ab6ea9c930b0a75fe3e515d549b9c40d370b0a16a7f43139576989a65f2892a6d48a34a399f89cb1c1ae828714615cc5d3ad51f628a07ad6bb9465326c6678d2dabaecd467d3153051c3767d020b63550e8d6e8b4d0babd963e3401022676a29efa4b15dd1732ae77f5d4af2ed49734ab2544d1063fa2a2628e94192580c0810502366f104186121bd001d6b2a7a8fd42eddfa0bbfb0c1519ca062f554a2728d8e0012c7c786307353b051419578841e30a376e64526401268bf57bd004ebee9ed425066da953dd02e62d4fd5a8365456f9839a287b2dc61f1acad466aafdb406a72d2ed4decce890c43cd1be7b242431abb7f2216875682023871cd6c462302b5df84f5f0bb5cf7e3ad0d057b1b347dd3b7120ff36ac5053c0ea0b91c4f07321874f5648482f2754cccb8915314f789e7b2bace7aa00a42586699f02c3b4b7c21372ec57e1ab431356202c6c3a907f090ee4e34ead7edcaa857d4f7742668a3d2be42e4c56c43cb1c285996bff854f5a68a5fbb9b02c7c75188296bd152f7cb516be3884acc339b7630ee49f04cbc2176b1f42f69af6565e320b5f1c82f65cf89221989516be3804b3fdc2b4919faa5f81864bcda02e163454d5fd9e742175a03a34ca81a466544f0c74ec18533155f5ef91818e1dab51ddb30b8ef94b9be2206d91840d44303af2c00994282394a065445914d91aff2cdb6a164e07b3f9e65b92ccb5cfb4a324d2c80828302e74eb3c0b88b5415d6c045da80cf0c87f6d1e3491ecff494245436cc88dda3a6aff06525b1645ed351f07fc86922ee391a2bdfc517b0dcc5ca1f95e518b5b38451f9e7aa3db9f71e815423855c5715c529d939bd36de85e2120f1184eb0d5735f85ab025efc3bcac09076948175cf3dd7fd71a141bf8ef40330a4b860a26986257680b519376ae842c5115030a1046b3a64d080441b38d4c04215acdfe5451b648912a20b08c4f8820c58cbe054c5ba5032b0002543545d28199e84ea42c59045a53c5b3454664b1050e050849b349a6c99739ced7d86af0eb6ce4faa0b8e733b81032ba0627053bbf636f6dfc0a4ca6015af5ac85eb0f41c90924061e6097665d150e3d406c9270bec4a6b0598872050618928d81328b89982216d086a183305bbb263841b5ea0e264a0db9f096e4b547233cb3833dae86083121d99c921c6589adbd638cc31e28719b4641cf87a320380439632b09904db96a86c91e3c05da18d49c8fec83f03f98b0b45c090b8bfd23718010513233f09d64d9003b3f7aeeb21f0f5644e0e74bd569c048331e84fe50a57a37ece6d89660cfa6b216cca7056adbf359df791ea48f000868c320470840f65602e412487ca620dec4a17936db84105bb92c40520440093ef20d28e0076659f80c950cc8b3fa972a770860976a5881a4b24a1491089b3c42005bb3214b3a28636c2cb1921aa6048ac050b2ad8952e03b68dc1e86d1a73dbcdd981ce13ccc18e0a58835cc5d0af12b6b07dfa3fa2b7b7b7f46eefa656182730517e2563c68cf122447c48e0f31a120a1a2204480c4201909f0942f07f0c1521221434440890188402203f1384e0fff02181cfcb7b3461d1a329e634c439d0d0f620392b90214386ccb2a9729f8cb6833dd2815b14551e51fb77d5fdffac407017c8fc05aa1201dbcf2ea0f6af144173a4dabf92d9540fd3555c256375dcaaddddb6707777b7dd7ae5d4aa580920d2092db6a8aa6a8cabfc88ee9e628addf5508671d7988812a2db07fb572e75d124f2633309fdd819287a07e297e0479653474ee3b5dd41f70845ba4908fa919d867cb792906e5e02fa91b588dffd165824ec25c8f747e9226ea200c877ff011609a7e122fcf3e36251fb9fec11af6882f0c76543b44df02b58241c878bf0ff8fe28f1f9fa986f648e7e3bf45d24addfee440ec621de148eb088cc4a58a846337119942e1f82d052dd590a5526224ee4548387653012d894b5e18892b0509c75e43411390a6348ca4e37037f90421c761249d868bf083e1d895a95a8991b417380dc44f3f1ce98fd047a8342508c7497dc2a1147ed36d54e5364f752a8755bc26595ac161623894c08cc562b00474dbad976d33cb9e97be4c11e1659b9993261a798727191164ba7bb6d1c6f3d3224bc97efe98bd4f8b1f93ec5b64c9b3002c719a67dc35720424285dc45ea24c298159a989166a883ab59b61fd5a263b88624ac99fb842fc1ae8c969712b18309cebf93b111aa895c470f04693dfc94f89263f0f923e19becf1ed9216fb14568b1b100ad103f17d5638b769ec55377c20dd8cc5d7134aa5a0e9a5411554a6c1d35312aaaa6695cd2b4c865bff508994bb63d176afdfedb6fbffa51b7d7b0981ea0602cd0d67147110c4e9b05daca752bf047ddbe898f2a65fb55c85c5a3c6af6c24924b7d2572a9754b79fdb8abd70171f2ee8f73db4304a8b1a1411b87097aacdb05c76174901aef0b245b616e00a2d0bb43dea516f608fd54f90fb15d884abf3a344f9717b1136d0670b0aa5c51568c25095326555b93002ab3ac71f75cca0b4c61fa0fcbb0c80246698220ad660912e30a41f43a0c101d895241850d314be00bb82430eccc3d91870bfe004134fb006b30bdcd05a70d1031bb02b6d4306c2acf15a0276054717300f9b2f80b3851b33600dbe96e0e28a173200eb34de42862e4c63a66853049b3645a0c9322d5b361e3092fe05e277918d0f2ec22f5b4ac731758218299163cb66e3546d1adb86f41679f4f13f4158d4d1abeeee3e9a3bb7823e69d18907cbe64715526881831a1e768801c6553b8881810bb860451650c0983228e894ba418868d59da272d246433c06d5fde6d135b76ddb3477f74e21081594a7a89c74f7fe4b20f527ec3008acfbce7e03737bd0a4d4d5238d51c5a67c7a87d84b03f5bb8cd0a0f953bdfca040631ce318c73c4a7b4e47fdb49a1b39250811b495bdd4149513a96d53035b9a36b4fdadeedbd5d1adf29d17883fa8f26b9a94fe535a350b678b32a86e68bafd61c5aa0f7fb9ff2d362d1c554a3f69a20e0be0f4c616d93a4aa202388960c5feaec12761504d4a871eb4e8aef9a8fe4eda87f43e0eaca0dc6fff92bf5062aaea42097144d53e0eb87fc9108aca69aa067a956191253a7ef5f722a305f27e224bd0d1a8bad11ed1de3f83235b34e78f2b0515a3496738b9708633a8e5f3e379f06006865e34c105d5bdb5c393d0c94f0602ea4db940fdef639294e1aea0e84cd89fbf3fe3509d45387bd9f2b9adedaef5e4d6d56ad1e7a74503dddf679fd33a344d5b4dfbd53cdaebbb459def32d42adb73f5afc98eba856305ea94efad4ed3e154dc3d93d9dca473dc8ae3b6a85aef4b6a2ee5be96cdad354d4a4d6a0ecaefa4bbe6dfd23dcaa5c9d13a7cc98ea04ae9da0f6bac4095616f6fb4dceeefa4c98d85c6dda36f5ae63d2737676d35d10efb2fcbe6f99acccc52ba4bf797ff5183fe9d7fcb57ca5d0b5863053c8e33a98e39cbb49726334d5bbdbf045f2b6e6e526aeced3c64bcb269cbb309fecf08f3883b4eaeb64cfbeda54d4ddbf8c77ead3896724e4dd3b290bfeb3c0942f18aba77ff0e84d240fe24003dd0fdedc77d335fa0fd518696c81a0506ba75bf6531928eed6cb493608b89ee07e006da1f658facaa7fd72306895f7019e5d0e0422a8776b183c3e5e3faa2478d9e33785a1e95ff7d4ae4e6dbb764e5682fff35392fbfe5ad6fc90c5f4de66baf466d358eef03ede7b7e68af3582303b2ae3beebc93206b4cfa227ff4aa96b1b2742df232f14b50d7f7cbe9f49b4a7882ebd97c578b3e5bb4429f2d9cf2bbcd63b085021d5bd5a50cc115f296121d5b3e3e4255d2ead3445b87323062fb925fed5937bb94527a7b262b4b971e7a9b9d8c66bdbc3ee56b6e9ae46d2aebcf2f3ff0e7ef7ec9cf1f01f8394c9aec55adad35bd9616dadf62b2ea70b32592bf0f9c0322b5fbb7c3f6ef24f9f2dedc65d6debd75a76ddba76493ccd96fefdf84d36a7f2d9f3f024cf981bfacddd907de34aa6ba900ceeff6e3e05b4dc42cb8e6daaf9649d13efb8d005ab63529634ea2ebefa60a4a24d12560615e68a5ebb80c5c3ec47f5b2dd0eebbcde30e44cafeca0ad67d8b3310f67bd2751a0b5bf7cddf92fd62c9aa5942a4727fd432a4c24e2af77d008e4e2af7ddca9bd9dcb6e7b96decdc0795a373bee71bd8712c78ad5eb554a05bff9b73ceb96923287fecd76afe8b7bc9f9af9edbb635f93c58e7f3fd5bb26a9610a9f3e5c76435e5c7c150e5e696fd1b5d8b052a9fa7b66da09671aceb60ec5e12e840bef603d8dabdf61298c08faa8552ba97dd4eeb059abd93d5733f6555bbef3830c6d8c0c68305638c0d53d46eb5aadceab53f72ff3e98ffb9b65a694db47a7e6e05be585b7592fb15f892dabf32edb5692b2a4875e3badabaedb52673e554bcaede3f26abda855ae87d307ffb26ea6dfe56e5a48db73019bcfa6ff0defb7dad45e472939b066a9dfcd74afe6bca4dd3a4a635d1e4e780a42a1bbc9087efa50c80173a7a1eb881ef3d3964dc0e3051d52a5eb5264da6c96c20a90b3668a840c69a2e1b78dfdf00921ab0815744d54229da4b400b27f02309a7752740eaa4ada51a1f7bcc9e77d4ccef795b99abe7794d9479ec81a3f6de4bcb18c903c7d17b065fdbab7badb27f71196b2015a4ea3d57f6be8c3d6ffe36bb9dd6129592bd9432f71bb370f50e22797f6505f326190850b6c0bcc502cdde7f059a7d977963f64c56f50bc3d149ed422e1bb972e0b87d98c4b1c686bb7bf6ee61bb7b468507905439f4181cb3e67666e6cedcb7ba875f3afb2c9bbfafd93c72fb9c354f5e902b33c8b5a59492d937d0fb3ed042fac18a5ba19612eddfd944cc2cd759e301aaf43e780ebbd9f3fbe70cc7f9b2c5094e2e68d7f93d4d38aa14d04c488a552a02a8fc2d9f62fb6da540f9e77e514df86f65133183130cc017cafd3833f6ef83ece58f5bb7aa933abf0fb249a48edbcbd1abebb345134d0e88a8d92fea265f9355aae956ddaf56dd33806e07c668a992f3402a5ebd2ea9769de6adde3f25abefbb6fab8754bfdf46d677cf81afdefeb5dbbf7cfb176be3be0ee4ca791d13f7bacfbe26f2bb70dc79df15fa7e5788f51db813b2c0b16b8dddfbd88ddd6bcf7d4bbaeff740ee8f7ceb8afdb7d0939285af262ec330e9e36c8c8e7bbf6d65dfafecc8916a36723fce1fb71fb517172e59d5d70c97aceafe6b0b97ac2aafd0fe4b0b97acea28eb91679c65bc49937bcd96ee4da23d536f9972d9797707400b0017ba5040c434fe2607e006ba5690d154c71f19ec119f3e048993dc1b8c345bdc4ce61807a42e1412698030e24d1412cfb496bc191d1949425d5fa42e14126200f1f484d744117055295cc6a98999fa04eafe9b85eb402dc32853f58a3a8a01a435a8b4ccf7b43d0b15a219010000a0005315000020100e07042291482c0d55556f3d14000e859a446c589889c324876114859031c610400000008021322454a48d20009f9355ad61260467a35f078b1b2a59f3c5852d28e40a274489dce891142cb70ed0eb87c000e435d43a86fbb473a1875fb8f0711e24c34a470612be3b4cbf78ba2800924a82e9752cd4cb666ec841a2bfa19082376e7edc5bad7d4c1f59961ba05db791ac4228aa897a450151adbc9d5e6967a8f88b2d788ffbed114c8fff907f0267d3ee536eb6da841eb742dd892de13f8df8ea744181d2b051ec4332224e1f1b656a3b8070011586d43def5f7c243de99e47f3452aa4807741d8b8059ebd8cb7210e8266ec9e81d59174d85fc8c22954c454c93dc4117283e45f60322113df9becd2428032324d7405afa7d14d2a84fc829be49c104e2e62268614e381faf92c34ab28aea844f451877ec4e276ff6a159b50d7d2a9796b322124bd7c7fa178837c082a2644034e6e8710b641cc7b72d97ce33ad9da6bb04f8c8b045309ede16de2efdcae3d99c921dc992da534881a67daf42cf12fef42efa402b815fcfe0461041c06f51f56ed9227f1d235df3cb44b1d16b7eea13aa96d3b2111b9bd155b091dc093bd73e55c14cbda76f41032eb4952f221d118be55d78db319741fbe68d683c3ed9a3ae00bc4181282f82072e714926ece7559a6e67a183c8aff9ba6869090c4ce08361cdef1ebd004dae6ba20982c2e9a902635bd519d471fbd5a56dcb2a2f79a5b630533d5e864f828b8a095c2d1afd09b0c841fee495c72216104080d88b59ae7f29e1c7d1a1813deeaaa70e59581591e2ec0c8034ae4e4e706be8914923824a41d8f4cc122961a108a74ecc30c7a5845c06177946ccc771dec7a4431dae7d90a62d4efedb577ed17495474c40c890209b9a65aef94a626b91fa714b903aacc96cb06185ff90a9c7c805da7deee88648e34e313f7b42f70238752e48ce5185db1b0dde21325d74259a1453a54e8b6750115d27c21933155cb0f76a870a753be35d523b3cb61757c845b7889d688034a777fa16867afdd687e63151c8d94cd90a4fbacb824d0c2533bbd94b4814f50821b4d87f343815e0d667643e3ff8c24147ad97dad5eadbeab178882101a7f1baadd8f0fc33445ca92eedbf9d7eba3bd8fc774a6c9cbf0d10f74fde40aca8a4c1e88f60f128857aad05b355466c72fa4c0990adf77cf9aa0b7861b3c76c5ab95cbe36482eb0c46e8ac15eeecc8a3a5f7bdcf01b029d17708b2dab4c8d36d4c77bb14cb250286ccda15067dfb5dd64e7a736a3499a8c762302e42c9f92ae86e2ab9e4a5553e3dc3a82b9a8eacdd81aa6025a8f11ac764899f85f079c9cfe10747456f0f495ebd82bf38b2d9465763efcac927a75025b00d764c98301beabf2ddacdb1a6ba30e4a68a458613c21d0130bd6394fca81143e66e1ec9a1d6cdc6f548c3c2de256cf363fd9d6ac11be5d16fd2b67e331151c76ce516a4c763f89941b6323259062a7a917eb221a7567f372157cc2f1ae5c667c0e837caa70b6cc269e6e84b4567f568ded7b8fecc03f2c553775760574f14800eeb4a91f305aaa46a8f5e3d2ac07e8e52fbf321cb901554f22829ca3bbb7b6879764807196e41329725d5114e3e55609e9c966c1b88443d7574155f7523729a019a63e55d0abcefc9192f61e66f2e011b5b3a96cdf1a2d1817211d50fa9a5a985602299ffc1eda06330ff8e7a8906b7be5089ef27377f3104d821aa77e466c6fe5c9bef51b7293066c63e40db6e3c0328d384615d48765be9efee6293546d1051b342699f558674c59f9241626143307cacd2983283b10c7554c456b6bccb884c64766925b52fda4b4776887794e8da2c2b9373b23bff3bfa007091a07c6c9d26982a96ad93d31b4d94b165ac0e959ab6654c8be72babc3ae64648813ccaf87690cbde18c8b19ddcf91fe47a317643e25548e75f61b9f79de512b4ec419762243fee316aeb92866dd0aa2325dee3552f94cd0fb9907a2c9c46a2330de0b409cf2234d1667b5c912b9a672e5839326e83895aed352fa7f404072d40a3e5ace339a76d062d5b8db2ccfac21970598fef5830602c16fcc77994c836d544a113af4ab0fbf23f0139808faea64e99553d420280292b1a77adcd5354c524a4651a363b40d9b9704f06f6769275c62b90e87a72249610479091480fb40c368c8989e0d91649fa282f35df6b6ed4d74712b7b8b09f0ecf5de1707fe625433b4e12a4b8348a305972bbb164e6867a43a7cce7742a0764cc6843507a94d9072f4b75d4604b40ba0486214d5a834dac68b05f016e930cbe72b989c6ff655889010470df4be0da95920f635d257dfde8b2b415955bf914f8817be2c2421e7e8cd994df68baab96396ad2863e69daa8aed018e15c89b6ec129ab8bda62c4033cb5d705fd6adcdf95d1faffcae9b713810378e53a837852b7e09ba9ffa682ec68f23d0c798c097c4e806999387f63a4ba2918ada27c2b3583d1862bcf9d8e8dd4efb3d73ff07ed1390e8a63952937e443dcc632d2d66ff4f1b8d0425cc6278f7ee5b21dc3b3dad220059e9ee4980fdb439976b1c90fdaa404abe9ec821438fd254aaa5b5e4e58a2bcdccb78bd4966e2f8e477210c373169791f66acf270482383f7a97492b86f894757c872f0a8fa64f53dadd700ff47eca1a8b225c4b21abe2c01c1990327dc8d4a52f8e35aab297bd73a58b03fa709a46f22e0fba3fed68ff31532a00140a9e029a25d8045ca6600188538167e38eb39aa7fa450a8a3e48a457fb48704b718aa88beadce56a1fd88191a31a42025f5783b76e4331b0a7305fe58e43b88045067f228af540293e3069a90b338e079f8180dcb33838812b9874054d223af5170806c2501e182795c360d464302c9839d7abca48a8fd3e4c3a39f47ed01f8e96626535b520991fbc898fcc4d2d852e1fd4a0c8c9a4b65e6470b39e16002cd98aa38df46450ef5efd0816554c04146933dd7453485604a0deb4fda1a385a96cfa78d51aea1805228ba6429fc892c79d69110169269e037bf68ab43330175947751175b8a0c9c8439eaf68ef3af195a55d0a6bf4b41b65ca79b7d647a17b1e72084d306052ed3d643e7d21843150f4d0f0f64c767c773f82deb1ff6fc73c9d3784ad294b9b1de81f34aadbf9593fd24bc319fdd2e201defc799510706bd2f304bfe02c53a79adde32077ff8b68ddd38e0a570828e695f31b8c59dfadb9fa18a46bae2c2dde49d86aac2b87748fc1590b28460077f9f008605dbc42604e602271f449d07ef3645d3dc8d0da5a867f8ae4947c58285c7377fda8e9b3a0071f624bd18477f52b23e0011e8658f2228db08cd73346826113268c1c73bdb1993d804bac27701068ac16e38dc2e5b447217b7674dc8eff2e6ae31a43bd5fe2af093fe8c8e6ad89cd98c128fc1214bbb8d5024c02828b6dbd26c0bf5a0faa04f644adce1c91bd5fc0a9eb0bc4985fee2625d831a083736f317487b8233d7b17a7536a6e1360ddfcd1e6749e50382f0c676a8ccd14d0c63e08bf57512f149b2d37f9b95fef51f6ecfe958c8a37568664ce48891445c0c52c633bc512709637d873ab9739ca0609c75c0f80e9ffdfc9f42f152033c940974b9d02d5033c3a27b709c2497d942581b446deee10680168229d757b64d49edfc375ac238cc91fcdedbf22659eb823fb6e8b26e873a4ef561228db714a380cefa4017eccdfb96a8a3822424caca77f0bf01742de88d1762004ac37413fff1b681b538e8cb3c2abbf86479cbf4d6e764948bc18f3f3b7e8fe24be6a2c464173cc62d502392765ca3b3d15703c24307443883786afd20f581a46eb153cd0949f414952aa5e807c027ed949d619f0aeb24109174dfca888df53e090dd54c0701d62d7653a610605928b9c732722c16c2da79d16909829c97c2b3ddda00579834df9f61ed206e74a9872c285c108d6a1b8bae52560d59167d6267a6006240f8a5f0bda9cbdc182944a482ca68fe1b2b9535f3573ed9b3849a88da49592ee719d6b013070092951d76947b299c4598567029c23e0101a6e1886ae791f4d547732013acfcb0f91f044c9ebf7f68c3d43c9502bf531feac13e15fe8a553c2383baaad13b6483111e5786fe1304b738cb6c9e9404d6ff458b53fbd892aa934e0790a6b3f65f87167031424427235474e343211860a01fde46a1030b128269e40b128481b74587f191848fa7d14709f39d7c660f42b6d449f991a1830795dbd02d94d3a7c0065214312d5ff34662a67015ca14ac4d62d5547d1e45f4519b3e775ad0a8f516cdaa4685d6ca64d080eaa94503dad0b6a091cc722de6a92446e1739c7ce8dfe0dfec472e261497a0b67544950ee23f587e6e2ae9b611c729466f4b879abb57aec4964f2a7b2e31a82c3ef45577b249ffcd4fa57ca13acc75858029b12c63eb335ebf1568b01f18c330b09daad169681e2fe167236327e9779c53d3575d2de454c7504b557b48f13303544ecbbb391bf41b84b49bc0090f87b45e0c323291531f1ace9d7c065596d785766ef27e8dd4612204b704a3b4406c8ab716f8811a9251db2b11112f8c5013c420ad2f1edcc8babb9581afb8896c598d074ab610d7524f40b1103c3af58502f9824cf319025cda9beee3e53edb31ecb67b06c0e8f539064949d4176007e085391c7d5662f3b792d9b4240ce641cf1ca4c95446c6ba32d005f04d1e7cdd7e4a3492bfc4142ac25dc3a95b47d47a22df1c3f85c1a24aa0bf49d75fa575818c94d9765a4e357a70e9a553042e0ebd1920849910327a9ed085804e168604444336a7658ba85c6de8a8744961bd473828f028912c0a2eb8292928b30f370cd9481d86405bc2d7a6ba2c72d5ad4f647fb95ca50b4cf80cb187866bb92d12a1db55e42ceb2d604ab16595517c71b1f1e903082eb9f7a4a6a11f84d9cd56013c561ac87613f70e491fafddb1473dacbbd45bc652c5d8d329d23fa0b15bf3f82925bff2b758ea39717867c1eb94ffbfd89f13410f08541d2c4ede0bf8bec62db2fb5ecd8a0b211cec01b08d1a736b234339fc4c839c62ff7052bf20d0ff14eb13e12c30ca837ec7cffb977394d4d080c414dc61ed59ab7f39ccd543941e90a8a0d8c52b9cf8d3e52ce5c055afb04cb87cfcce57e3d4393a986a9178c4d66a53a2bc7657730943225bfe0a8a5971c52155655c6479b4d29c78d5b4871e4470b726f67aac5debe5afd97bc361f249feba1e9303054993d7149ba5d4d83db372dfd20af5f1d479fd8e234f4aff0a45626d2afc3d634dfa1b42d3e61016b629491d763e57355cf07c417d5637ca270891bf30a122a63f103e594eaddf920d2d06b419e62c6922d3da0412954c622f314bd90be1245d678e5e246c516d1f9077e33907e620fe1eeac53380544bc6a64f92f86b12c9be43fd842b886d74c622b0ece507436d35048d057be601bde9a11301f545af8c318b26744cb7509b16a07964453b1308ae7faddc6580d890c1fda24e910d9e19b0f0806af1301dcdb1f842a02f59257b9b89d049ce201c7030e204aefcb99d59b853ce5826e1821d994504e6d5c83856162cddda9e8431de5cdac3276544486f84658cae0031f8fbb11cf82626f4bbb5edcf675bf5cc9b17e568b4a1c34ef5d30aff532beb1144f19f7842401e91263632c47b82ee401c2b767911905bfa02662820a9c63eccb2e326dfafe3f564f1ebafcd83a55a3e658980969be40b10b9a6513d15bb23566bf80e870d4f208ca5c72a499779c6b392667c67c43cd66fb5c8d260d0ffb1bea4d0a538fa5dae1cf9a4bb709896c93f006d2edc6877e07c0603a89952f70e21d7e733da5733c1674ba7afee90cdee944f69dd325f0934e6444ee8fdd2dc06982b62913d2cbd5dab9c946481ac0128f32146e9f39389a221c89833ac4093b8c278590058b12b7c3a4356607a80d15ca8ef249cd2a987e6ea69b07846c3c06697186af37e7b600154ad53f6815394e374c78a8f934681a66e68de7f1fb117bde998a339dd95d3ef4b10976e08249ebe6d95c274d82986cfae78f19fcbe3d596788c7c1bd606e72fe2fcf06376a3e86e2ebf622f881c41ba4162071595a9432bfa5d9c89033854f0404ca4e244f1f63bc9d68a024ff9dd6461b5e0f3819265cf5c211647cc9c3babcce3e8aaf75745d0006b7f59e45bed5e213e6cce2d4953736dded3367c424ce9b85c3950fe1cdfb14175b7ee25b663a9999fda7d98c05de27218964287f42bdde2f790791219345edbb0c84d46462c4d452f3739d88fa7e31a686c942b9b7a6022d48246713623e885646d420bb52a88bb7f09a3750234d1c6f9c11aa244fd11f55872c488844fe7d3ec987678eb4610ebbb6deedfd3ee06d2e62e28ddab82102304349101492f4186b10247090d483e1a60e932ef88fa02efd61ef187d2f45a8cd5d1222820f99a164694b9449b832076076a792d23f6cf6869c35ca4150950d6eca3bc846f6f0e9b989931c213e0d36c72711529c7039d744631e3357ab51690471abf517d6703a61c05beadc17dd4ae4e8afc1d5073b9589c25fb7e91c050d797077cee8da25c8eeb2eec187d54267d454a75ce2f669515ea14128a6866c1a9ddaa2c391197e9a30949238d2289a37020da1167832bb31c24724a05e432dcceadb9ae1c5801ec22c84499a488cc25f3c6212682cd2f8c9e7fa74800cf68326a88288849bcedcaec0d5d1fd28418955a0bc015032f4153e75c78a9c5aee91eb484ab53892c8a0f5efe44716173fe5da09a504aa62826c9f20e463bc36cd899fa250be0817f0ecc9cf5bcfad44285e629f7fcb6c6b471d76a65307eb03ecbfd17b0a357d696e04d760ca905b849c20abe559d77064bc0f0e5e1c4d2e921702b683c68237ae32e42eb2326a62210a6aa9ee4422f9d1055c84021c4f283183237fe976d41b4f535027e32b0486d760c730b21103d16e699144d5781317191f4fd1dd75b7d444e6aec73afa6e4b9a66d955df80f74de3a352f32eafcc09a36f3222aae244a0cafd49a8ba56d5b9f7647c00bb7eb44b3c36d10c069761b14efd0c252644a04d3a1c95dbdcf6b43e651b6a0374b9e35d0693337b33e05b30452e2892dbeb3df31475bd1000b02982916cf88ba69418b05d7084debb5c8fa3437b43fe4cb7df776a82dcdf1c8463dbbfe42c81443304695adac7f6e4da41b510b6e0828c9ae8b8b3ae92e139cee3fd4e28603361a07bca943084893776a80936325717962e7b4e40e4d6db81e5163af9dc6bf659c1d98eb30e4e639bfaca96474b0d6306974a4ea6074c959db28dd119e7e646ddafdb232c425445271f516ec93de389eb4a58d92918084847827c5cc50a54bdb57611c7a037f29016e34f2c2f0169b0e3eea8a6b68b2f5fd9591ef17e27d08daca9fe35006457e5cb7d667dbfa18da6a056a8a88977cd06624594d52b7211cb6e2a38572d720f98310fb2a8ff5c7cf1f323891eec4004e54dcc16b03f7bf7162e4630ea66f6c3d786c2330b0024ecb74ba96c1645bceab5e6372775ef23bf8d420e0fc3b6c2cc4698f9d02193d0ba740325c039942b2015b27113cfc16ef3988b0cfd6ccdb01ff4ba573e4accd419aff926df98141fc044ea89e8a831c9d8d50c3b3d3dc0002ffde9b70d5f3b716525ddd24216e6a8bd4008fc863490f9235c7cb9e22843a9132e45ced7a553a8d0cf583dd375f3fb98d28000ae58a252ac090293963c29751ececd5dcee8103195a6792950fc9bb9b9804f866b9f03eb29e6b1b96a24e4141075760acc590fb50ca095c73d9dabbb059b3c9e494e915eb40c4a2edfb0b4d8c1055c949c898120c84c4cf9b0c8f50d97d2bb0b44423b49b01f3d4505e9597a9e568fbd46e28d7ecacb55ab304b0ac6d3415214c91ce1219ec8e9969242da80d5cc02cc66c640212535195319e32a490f432053014b84c897ca97545203010427d88efb37c8c6c8101ffeac2fb97b5e27b78f8c565135cd302045e8a184d1bf7d39a73310b104376c3097a2918533d94b44fea192348107672239c5a1d4fdb93e7c9759324b80c9b75486b418793d741d2b96c1ca2b3a031b7471e9d5a8d4616c0d3f898f0d1c8ff932f13aa3b903793d51d8dc405f396622f0f55a3f566867231a44a52e6efcddc7963eaaa2ecf3505deebc1ac5af30d9b7cecb65d8a8c92eda31e3228ca0613497d775c4acfeabe7577112c2ee8f5baef4a2af6ae76174a09edcc3433d80183405bdfe9c4c6ce4a8a66e264eb89ee882c32d46eba7ca588025bc351ae421c8e7a80cc548e2fc6aad7d05a8a8515070b844af6c9c22bcc855d97bc594637776762893ea3cb3615973311f1ff79f56f0b6b69d77bfb7fc786fe0a8ae5ab6a135b0a3018da44310b985aa18f1a96dbfba0d21b2bf9dd9c563a6e2c34117c0eda11bd723b30f3043320b121a80367c0e8fb9cff9f69146317bbe41bb05be5df10ad5de204fd31c7ac224e204b30689762b1b103cc57c753c5b8825b81ae6578a6ea47dd5bea1870b89f93cef6d5516a126a8a6f5d18e957bd7b8aab732449913421d7627fedc5afa74bb4f9bf701f13e85855d3d96c285460df8f3411df74188a0c83bb44a5876642b1f79b61e4a39929bff031a74b3f86664c7fb4cab2375693675126bc31b3b75f3c48d4b0957cc8042af1708e0492eb0148a67671746be7918cf86d8992b0e88e0ef174a53ea168ef697105aa2204f3bbc6f61561fe10fc1146d03b5af557e9743ee3446f6c36f149058a81a258fd04d8a6737eb7357fa7e7120753c17e22757415ac68b7743b4cff37e0ad549d1ef57b65cd2466d7da56d6387a2fd4a10b1c046af07093ee6318c4e0f47abbb269b039fb09a52802268fa84dc47380906d4d9e2a459d8e6a204e2304c61b655ab31d048a107fc01c628c306aeabfd3d4ab831c683defefba9c386f1c8dbebe5da89c6607ba60a379e5f4b6b96f4f3f4c4a489853059d15f7d4f7aebd31a02a90e7da1e9975d2ecd64e7bbe71b41c53e838fa9a7dcc4f01f2fb65930d15bff7917993117fd371c61558d9670213a09b8d7c6bd8d55dce4ef5ee3043553212d85766f9e11788ba357e00d0425d15ef43878e9cbc03c97722390e123e7586e05f3379d9db6dae90dc680a1d0302d16107d2ba4056e42b56ee58d582092fc15c588c62ad5a6044b1499e32df3f484e795c7a0a365a5be4c9007b684b91362366e0ff224e09d402e4aef997c7be1006b018d8f9af3ae3d469dfe4c55a920b73186c94c1b0e2e19a0ca2d4cbb0e8bcdc64c7b2568bdd585e9b2518fbc6413ddd2604cc5625baf7a50aa2034091f23003b182e53d63e3961e674b9e6224710cf1b4883339a576e19d7875a7ce72875f14d302e759963707cb50a63a159edadfbb4dc50383da1adebd59436de183e4217df9e68714524dfa0b480fe10caa385ce07a27ea56d31e04531317e26c81ee880543d069aff3f245c0f7699d8452f856a04230b71f1121482611465bff14fe92108b424496510d4541b608bb7a8a7d41360db6ddd0add06e66a3ab51f0797876778642e0496c29a83eae7d80ac838035980e808eb5de31432d0c1df5e5c99ca5ea482d4ca19e288524009bcc1e828f8085313e4e98fa3699d2c9a029abce7183ca683217ac9d56295f5c7e3e4abe6886f54918511cd139be55be9047b0b406975ba34a067b071c91ea18a556431e95cca62555a9ca91399d2e01304192871965b17cd01ec99f94131b3c4c93410617d67463695438edf0eceb4dd00318e0eda9104eb635d198021fb0279a7b9a1f621a9f5a457465f8401b2f255251b55da6f5e9f29f78315708670569e3ff31354020a881e90430bd5ba9e58d065cc127092bb73b4d6a192058daeb9fdd222aa727e1ab8091acb2e2d5836ea8c58fde876be7463765f281da55d5e5a0c5fa1dde2a165860e600faf1aa755ca8d5e2127b16665764207c8cf8a3a687ee474dc68fc97043e7fd6e91c6e1d5d62064e9219bcb512b9a40735c3b325337e015144d6003b09cf9f2db01cf0afb3165829dfba5bbcdde6c15d64655ade43781f53e88a79de0fa70155a0cd47909014911805b480336b305ba8c4a56562dade4525e71895855f7aa63ba9f36144f7cd8efce41e9a74814227c73bcffe3b230ba0eb7655f3da8131fbc0e4f3407da745ae6dcaa1e869dc0811cd6f480c0d8d6d382b6c9bb0d33957366566a85e058cf3d60b3f1a158964a753b042e487d9bea29f640dc9382ff3d377b139fc78a9c1316f9c4aef989ae71db4ec26daad096d1f6e0f66aa1abc75ca90204237027841a01a856db4b35a04b1fd92c59d2fbf1360745b3674feee5dab6fa5dd53d939990d86d6f72203783d2db88dfaa181132b88bb1ed26ef89a56915e86741548aedfefcd78f587d508a0950487ec88a538ff6569735f9a0daec525ba2573473fb15836129e7a1f05a92126fabff219632283d8cf86b28bda2c3ea3a3cf70499da7d5f3e3f6dad9a3e7f7e5e1799edb492a9a51b46892db37de72b0687a95cbc6238b61b137cab3b28db96ba3822571523ad8484185f99d33d8d71df29d361322cfe66dc0fb64b28991656fd72db7702f4fd1c6bf0051592415a7a19cd13118f57cc8a074e7f6129dcecc8bcd0c0f50930126d9bc64f93af7f1355e855b62f8a1d48bce8785bb6170232fa97c75b47343264796810986957ffa5a4c32635412719af55dee26b0d28c09f2d1380b7b9e3f41d8a9e4468891c5191ea3b38911b038e43d311854c097ef81ed28af95d1e3fa8f7beeafa98948dc1bf38b0a5fbe9459aa009cab1d74eb544da91e43b4bf64a3415aa7f406c17ee95135a0faad4a5d18a5fb75914a4fefdc69e6d58fcac27ba1854472079127b6c343e8a933b8fc6788ea4969ad2db92bde049e66c58a36644b76c036cdfc8c0d09f6ecf28e566cce4445d6863395cf356767782801181c76b26896ca13ab101b634fc8d807f43ee3a8048f3f48133cf1b71c5e5335f0ef2885cab93be77729d0958f86b89eb3ba002a65e0309ec1dba86bb892b34005c037f0d28965388d849a154c6b8b8c2d2b6172c5942eaf85c55d84fa004fa9f054dcb4397ae6e8508eba4744b0fb08f904281483b304d00f157c3cbe1a5f46fbbc96af3b6609f9bac67cb4963bc40ae2e26d3037472b699677d66ac0373ee8b3f84fd4e3310171daac29fa24312bc577850ee8924f044c1f49cb85ebc891be63a47d7514cf4522002a32400fbb2b0ed9b784c4ae89724f5c9edc52393c275f8296d263bc309335beaf7eb43f93bcff5833eb4431c01cb2a9ae313b2c2ade16a16d41e6a553d910da594a2f185c2e60398b1e80dfe11923c175ea66a54f7c96337b303eef7c246a2b9ef0b9e714d40eb8dba4479011f8a3ea79a0da7b9a0a6a13f217103c1b913fe07a9251a70bbfa28b45bcac43b19ceb9ae36fd2814e109de77a7521ac90d25fa8c97bc134f34063649c2649de2268da58fdd53316b4328534a0a566dc6dc087123a63f96ae58673d321a50d62efbb3cdb938dcf213be7416606393000b064a048ffdf0b2e9f999628033f5075626a645008ffc890db38f614347744b566790fdfd42cc76cf4d945e0e93afa01762cb803c1f6205238b83185762e099ae2a12035e2b88bb581033ad129f8f7bf3f7229d3774a085dd9a6518628c3f3652e6a5f1f4e68c5960c5ed0e2075117dae796c3093a772cac09ca864405fe3e79d62202a5684ddd275b6ce9afe2276a14e17caf53afecc051bf6d13593ca728e716264ab4e72253108bfc7c2620798dc5a07bf7cac68385c65e24a7d09f09557728bd322b2a06b85b46b65fe20fdb913c5ea1df9636529aa636b3beec16f43156b2e286d41bf0cbbeddadeafff0cfc12bece8ff8cf91e461c89c319cdb7b0e61e24242de803f5ad07604025d13e31a975ad75a1c6a4c66cb19f85cf3007900746e81d768fc1361563f55770cfb505393e7c3d76c3afd39e35649c5365de553e140404f2f23d1ed573e47abc097468f6c86419548f22b0a1835c4b7ffd73e489fd0ecbddcba3dd975bdf23031320de88364660d84652aeff4a3d971269f23397e346c9a19dac78e6d971ac5234e3c502148ea878782021ad6e16c58bba187d40e3d18b77cecd0a20f284eceffcbb160dd591a5f3fa7601df5a3a3c137ce06e58b8aa390e608a098752c6a026aaf3c13c382cfaf3944bb3082cddfa9e973af1154957ee203ab4a82deb9846ca723880cec88488c00e58791afeb085cd43bd98b19a82cd2118fc483e714080b6f166f5a8dc143bc6e3f748122e73c87cb9bbfc58b3d713e7a55e9c4a9b6c480c08f01494d1c318ae07818609d8592bc3341a26c330285ffb565fd56c5f38d897130f42640ad9924230fcacac2d6d15fd977444879180bc5e1698c2b809d552df0fc5d32d08746d18fe59c9fd792f0e035bb39ceecf877b92944c5930bfec9c89f00fd909f857225de7a6a5ffcf3eb075b1c4f262065bb0e0e36084872e679caa6be3cb23bec852a89a943b65f97e3af5910c827a41264c8fa0ae2ed12377a4c9d0542f523aa081983a9b0660af20125502a62a4df659cc7099fadf6936ce1e246f79305cb85c97ef3cebca6adb6ef35086dcf40cb3b9fcbdaa604a5c637de9e04c26ac29336aeb88cef272b05176f6a5aa2dd2064722ed18099e188555b4d7c8cbe3250cb5286525b01255c645219bf57e7f2060ee3a3cf87e3c194920cc960d37484cf5f4a25dd2877e035f012848308d309d52c42432b180933efc8d016484e04000bf11cb9df5002eac08da692cf22993ab1e1ea952f1f45273215ce234d5b57d6cb6110d605f015906576db530e9f0e3cdb4710fe10b32b246df7115021c99f3ad7ab9a1d9a67895e69340abedb13a1c2a4cdd0cede324ce602a1812aa558bffb440118b4041f198eb73dc0c44c128ee798423350746b1697a8dfc4b159957683ef62868318215ea6b31faa252f4ae45d35461c7e576532080737405922eb8a9c9f3b31de4ff474a76a4d087ba49d15983db02b6e90a9da4d7d858ec8311ea7e6ee3a2639ee5c7c96dc28e1a65ec67f6153056af934e99f2c94fe3c2a346206d887adac5985c8c68cd309e247039ec63ed9293f37b017c67c7315886ec416f00866c9c1d01b02733ca11ee89273d28e69ea174e4f8817a2bc9429c0d1636e0420452c613413425f23af5bb21b2b99772c10db8c8cf2a3cf92c1159517e5a7ab31a4b505609bd478c91ab79597462acdcd805bd49d949e039f9db1f374931b21b53b2752100aea5d0b07add7f3fb8e902c50d3d8275ac260ba0b4ceb2e957af462a3a2601a2fb982cae2f255c33a4aea930a687950c13f886841d2401b7db1083f84a0eca6df87e06ab4070948ca2c4c391ea4d59887778603817e274ed6d1cd25c9aee4078c46456a15b3c46827435c85d38ce9fa05b3209b19074a6fa3b190f8b96e850659dc398cb1adfb9f92c2fc71d9624aecfb315760b335d983263f7b666ac48d26c9d8d87599ec80afdaf1bcaca56c729e0e93a5bc6d534ad2f00065713a4e39833359004359544ffc4987e2a17820006cf7293d01feb141262367461aeb0a02cdb8fc65917bd389b35cefd5f11ca46a2eb87409937e382e2445839f319279f16d13b8c4e199dac6b4e5183b71ef028acec37d03f99eff97c15086caf86f0ee762cf91854541fc884bb66adbf29ce225003a325fda7451dc2f462278d55672605a3a8a0162a9fd1934a3265f7518576d11bbc1a9607b1750a6447350731c5322270d86829bdffe909263e4f30eadadb1adb4577398695934d7dd3682d8b3b6f141f68d4e82e7555fe377a8dbb96525fb03704268a4fbf4854af1251bcde44b5c1061bb3a16785238d8c64b0a2b9d28f2cd3f9f225b557f194c0b2037f4446533acbf29ab702fb77e94d235863c3802b67454c45b5bbfeaebf7c82a1afca3491cba14468d0642efeb62aa7e351ea8e2ecce05d5355f58a4b39057874815a3664b8bb8b8d1d348f7f18d6293985065df3378e45c2a612711f08cfb9a717d5ee9652a9d4ff82814e80602c1608b1b878782060e9a3dd8b807e690d9712fdfd5cba61ffbb5efdac17b45fda0746eba8f7de83c1d0dd229ec93c32b6c3fc4c625674ac857c29ee0103bdd60cb873c06d37df218ccff01b103fd4ef4ae2313d62d2bdc87fb64c57d601fac661fed9315ed6529b292f5ac34a1094c403f2404159679e74638d696a9bc4868df85f3284ce52247f02998a72e3d9452f38314ffa7801eee2272c5e89c48f3bfd8810ee90f74b3637721ab1a3289a50b71a849b0dc0bf1d2bc7055f16e408c7d2ce891655d4c6475cb28f4a19e47e18fcd111e07ee9ddbbb9e0aade9089a94fb7b2ed0c4c577574046a61a96268b315fccdc29e7d9e754f55346d2b70682159a824c9a6966278b9dfe4f8506e6f75b3460ac1aafd5070c465a2c6c047c5e59546e60a54c3c3efd346f71b777d2f40e5c15e6712c65bedea02d2fe54bf2392d02f84cba19f1d67f90fc95a1f7834be1d934ab677a8dd12ecfca7d313f2e17da00d723e76a734e7ea847746fd0920cbfa05b84127b01c34d28ce410bd432d580e26236d45432dee7cad38825a3315c553ecb6e22190fb60fbe166538bdc494bdd13857e86d2eeeb4a703f7a756706dd28f739a64cab4463791e5a39fd2e32531bbe1ef2fc18570620fcb3d567bd6b0de701dedfb453dfb92aa21d95109c29a62f7b2c21b68d618ee6d8adb08450d0eb78999d6a5001e26fe4341da2e0091ac024571f30cf88d257ced64c02795f65acebe3a06fca36568ceb132c8e573079db0dc231cfaf670857be30e50f643a8ff409449bf0710cec37bb0ad4b30bf4361410ab2302dd44891058a4bf8ace10e321274025a3863a5f65822ad6daa7bacc33ab1e4fc112aa29aee19c7fa9bf4340109c9121f9b07252b370b5629902c04254eb20617d7f2484a845b692cced0096cef7b250e93a028410d57dcd8cff6984ef0ea2276a3bd5a4f7d4798e6c7299bbc7cf2a2fc5cb22ab945d623fedfb18e250acca5bbfe838a5fbde10d5fce0947c272302a64bf135acab4aa4f68f529401076cd19ebc0d5b523679cdfd2073a7002e31fdae1eb5b256c51c320f2882476a5290e2613642d828f88e889429188d7eb6d99315a2863b1bf221d528db9934288bbffaa1545fedac6f55942e314a9ef6d9d3afb5a891bd45613e46b40734fe3d9690c8c0fa7925e9b8cbca61588681237c43d083080f91ee4fe61a8a02360c3b80c7b2742f4a84247dfd9f0368cd1b141e3723960811bc0b0e9b2824294fb0177765a790a0570bc65b78ed365d589f9a6cf920dd4ee25bca446357f2b7c86a24694d85ab12a773ef1268dc7ed079c585921594b78547c119022e6026654fae75c46907a5a984e3a9d4c8db2cf55a00b01994e21fbb71476dfd81ab0264420a33a7b9c33bddb4985c0045591f37c02972c24704063270fa0a312d25d1526eb0dd9bf23a49e2a329884d9e21376c19cfe24c94df7f7c24621db14abfa09e458dc7f7aaae1db148069085586280db816d4329ec924972a631af509a5b80b3d5519410627d8359fa504c681cee095aa2f008ace1a31214b6c0e9d011fa4542988be9dde942a5780810a0860cdc7e1d303f73ba5a5654d3a402f483c514623846f9e480bb5bf4c92f62727bef9fe6d0d691f132ccda63225dafa08aa7fc4eb64c850945210318161284bf18ea7501554c19374b0984a2e1393aa7679e01b43b33a6591d39c051d5c411060ebfb0c4dead3f3063530914d2ad99b184c892d9c6287e224d429cd45985b81442d44969d2785c1063fb0072acfa02f2c3b1e9a65884a94f732ac56bb2bf4a7ea9559c66930ad5b0ae4c6a5a8f378645d68bff6e41d55e829c80810740447067c76f9a150d8e57e1f5d935a8bcb36956f3644c3eb0733ecf2c1b5ca05ce09ef362637fd9804b40d8422837ac1b2a47e61bcd2387b36a05231678c0fe8bfce5ed71c867b40fb28cbe46f6bb0f974ba9671a4a11c0f1c8833c424335a8e5d30f118e30bd115f0ecba4f5eea17242fc90d31a76800724f18e04bcea6218e9a811dc522a1ebcd0b67a16efbf093ba829ed3e11a2f20db985d62c2a819c642491c59b459e0f8b60b79e4759d1c374088e1f5377c349b356de4280e2a6716c81839eabb7696a200ac42d79778ace7a22e1be122800c70c7c1144e39c2a3ccf7c783dec12949eed0a0032c5d9eef06e5ef6102a8a47fecf02c015eaed8baf1fb582701c84a60ad6dbafbc6ac61351f833d13a3a29c55d4b1bfd3747038d8a5dbb859790cc49730d681a1c398c5807a1115fd9b86bce5f45d6045997f03b053476c0897fdfb5df7dd507dc144ad3e7d2e85f9937f10a59be73c11e5bba8bfa4263428cd8e568dde4203746c515abb37a73a00e487030176ca29a8d37e07faee5785d25ef1409d07d0b20845c0beb4415f3d94706d38bbb7e9a08d15dee06c4795582f35d45dd2b26ab4f058910c202b5031e48efb23f0a53c697064173ac2faddcc0513fd6f0de4482de2004aeebb82aba074f62de28bb92d98c717bf7d9fa057422caca0dae56c91f4c74765b8702a27de6322e0826c81d76dcd9a7e5b24856e01006fd10278939817365b082f4d2f9879d10e2d32a161c9da7110a03d0816248c29ef93115d2d862aa0293a8054ad676b839a6490dfb298221b4168784d8bbf5813d5bbfd2f367fe134b9ec3f3cf9cb3e4ff2453098fa8a13a00b8b07619200c332d25b669c57cfc91a1df018f0e1ee1474d53acc270bc07ffbe1d9132315c08fac0b06178818edf5a3ee1fd0cbbcb873fb063a3286ece84e4eb6ad2d51b2b644c75c308037602ac5bf267237e7060863fb384d3304208077dce12f4a191eb3bff306aab2858ff01271f61f8d2f3cf933ac094541e6568c4e17bd0e680f1351e5de2fecaa653e0ea502a01751d4acb3cb3074c71996383d6454dc237ff806a00a0660fd25aa6924a8fcb997d1c0d4037609907d51513355f615f019405632c3c3a23f76bb655bb54499f12af5f959bebbd4b1a778d188a2819786e5a64c8ce2a90b2425e16c0f1beeeacffef676b81184464a649362f8052a98260c142f3a17c2a4b53b7fa363781e3774c5cdf6be2fa4dd432f7ad0fb7b161d235a2e1fa662aacf5e1c2ed23fdc5de888a98f49f64d147f827c5d49a9c300d375d9d86d3393857cd72fd601024b9f2c1f5605d79c6bea4ff99b4256ae9f311ae4b8bd8fd558c9198ca3583429d5b32e1c15859f193e47ab675e0314ab1b04dcad7f7a2919e9988ff7b85c54ec132b782ea634899924600039bcfdc2730e90712985e4ba8a5052381305aee06497365a850ce948c78e19bbb03c2b6618b1b1fed28c2719bb2181316d7949ee5ed6b021f2c6ec642c9e99c0f5421ac7ec666d3549a9dea72508cd1220dd8bd4442dca356a28008dce8be6c27b450ace37b538918c5bc407c60592169026fec3e3a2841f2a97dcf72e2fb8a00d4f624170146cee8b666e9482897fa0f8126ea75d16a75b7089dee225ab6ae0ac40070dae8b49d6884c8834a5942eb4f139f716a117fd6108cb4bb1519a71901a3ed0ce71e2bc238ef48fb6c337c9359f0849ccc7de553b3888befec5125c39021b3a97adb6e559eef99e05216f0422de6f4938c820b4783138f3484d499d75ebd9a1143661f1ee09f76333ab13213fd02a5e3a403f12344c30a7af4ff5ae1be29304c7292274d5aa65cb5dfab531e969996c035291b9bf59055e4e945074372aa75c22adc518636db1cd18b59aa45fd43f06d8c3f4e215053d25c09829c4c771f310892017b052fd8446b2286899c17b0c94ed01a232cf8fc4286886ea04657ac12c32d1c1eb96ae91b12733b0f5175a00fcae4906a7dd1b5bf89c5ba05d7f72da9e420ccf557a2bf40d728c700008f5d7ce561f4955892d1adf237b56973866f7994d4b9919b0a208d1ec6e06e65a8084696740d04d86a9e17e5962ebee18f79146e33fe3c9e03c936db69a76f734e8ddd8fddc2e73fe2cf7e1043b89a2cb1010b0e525be514c3b5c409b1b037aa9b044390d0fc7d8fa0b1c182fb6f8643b8391b60c7c68309897db0dbe411da498c27502c20f08d7c790117e1016409a70fc3c1181b8db10f8014b879b7f391fe0025da6c4af97098339026a19be3f21f3e9c62284ee91f506b643667c24ce5506c39e86ab783a42e1adaf0f01bb008faa293af4049cc15029b7c2bd3769c6cd74e631b68186277abf1b5965898887b6ce38e5d6327e921ceb1c2a2a1442c99984a913ea61fed69a676e940f98313bee6d3b1f4a1a0d7a09c432aff1c5dccd1f06affc77e8e119781f9d04205ff3ce81293dace960bfafa4db21b64c7c43194f3dacc9d3c3f4d516a97829dde665ae294098f7ad5a9aee32817c05b556224f230181e2077bdcff00d8b90de7d64688303a7d85d332d220bde1b89c0a55096707d7d021e0c250c740d1062296305598ff17aa631971035e0a54d70a1e77d22e48964843e5bfeb9409d518bd509f1f176909cee97943e8c736eebc7a1895903f28a7f3cc1881c61cbca4e00e4f16fcd47db6efddbd9bb892af9c766639fd58aea672b9ef385a6ef70834c190d5cc554b74c86677ae743d028386fd017c4a2e5f4328381c61da6b69c42344d8227f62bf1d7c1507a6d81255cc60fd1c2b3f734e9e61fcb8da68ffa56078c32017b12ef630de553fbee0baedfd02a02106337c1298e1e0e88ded149517650b1203df91f0b83f3ae25b2ced2ddbe31930d800613b6788097d159dad9f34968f3260d284317bb14832c06a6a43e90495e769cfa5f8bf1cd907b9f2320e5490310010231e2d4d5cec66a80a0daf1db712efa12ea7a1c79d5dfc3d4618e6cd8d4bb118fedc52b99260697069357630494afc605c35856bb81a43ba29ae931e0901cfb80fe0ddffe23f4dae1e2e368f429fd48e0d62ee35b03ace516976b63a4150dc0e57a748b4dd160f193c68abb9dc298b603ca9c29927fe7917105aab73fe1da82a4a6307369549c07a2733a5c5fc21106305bd28dca0f983dc8aba377351405e4b70467c48b443208431a5e9bb9b48ae68f832ad0b85b8c63d0b2fe2312ce802d3674447e6bc79c6f57bcb4b36f3fc7d9c38baa55df56da7465c13acdd7a67757e77caa2cd1c548980837466c1c6bdf615eb7c376be506fa7280220237202f94007985a192e2102148e2607d905b1384a106150c10519252885e37e9091228713a8af03ec57cb4c80aa671a285d9ad8f00f94f2db12b701ee6259b1ba545962ea3a51b58e7e80f7c8af564185ce0739526dfa9e71d01b3cb6db6f53f5211cdd5604304caa3b617ee347df47039d33a087b7046d72694d66449fb77d0f465cb549ba4767d8ebaebe9f8ec4709e552376f5892c4ea90a7e26ae4c061e80b1589e01f2280500d89bc7805c190d6821b75f1fb15d4ffcb1f2e0a9ac823ffee351c49302dd4b11345e19de6da2c7fdc92a5a58c7e8c0664b7c5b0b15689f23ff469166709bf07eec463d2f902b457281c8d633a5ed1e1af6bd609da4afae80ec79113aa2d4629340539de368085bcc2b5a92d6e99680eade42a935798f7c765535b594eef4c39cbf77ba9624c6eea6083de8b9ed818e12e554fa2b074253a6f409074446e6aca62a1be8d5f1f3cf0380f1be65c1311c77b71470ae3031e6d0dfc129aa38bee77226e5c32e18c7aa0379b020f42432e45fe9e3b7cf7071d30c4dae8772375a2545f27aacea26e3b1ce7fe6fab0825a28f8961164bb4ffa813db534019fc84c842e611b6b7af07241df6837651870d911ab62032272824a3ed7da262a90da1b051139994288946abc4501f953db846790cabb354096bd620ba046f897ace5198f850ef2da0eab2ac38fc7dac947679a0d021a245e841b822ed74b631c56b980a0b3a988c4f522280462d97c047f838f5a4fe23625888f043d632af574b12e32c41aa2f2955bb1989768f43d20e4e88969eb6793bafbf8a88dba63da8cd1947008f074338a6d98283042e03d38ebf82157e5bfc8d2c9a2a882a1fb56fa85908a3e455b0224e7f763a5c8cc0554bd7ccc1303db0f7899b5c76ac367edd398110a48c302264d9b3ca244ff8ddbfb9d969a144cac00226e6295e1e9073e2874acea013f894483fb04b25d273088d3c9fcd26c8c0c8600542812b6ac92066c8d5877af3e876070028e31fb693df4b3cffcdec9b2068bf2f1a68bf5498ef66fcece5f92489b3968bfd2975b164f940d2e97545922aa34e92013319754e8cef4c4f43d0422742ffc7e42e5414071921789449a9fef6af5a94f9bd5310d17b48ce1f6df1f3026ec2aab2a74585c0916f4153498f9b65eda6cb9a3ff0c3dce63a0a348a5f98e6b632c734d0a0ebd42f8b864648b403e58ca258431bc46513091539434fc4f365595e0c5b7a61b054fe6195b41e29c4c882fbafe6433aa56c8e752d4bacea4912382ff5c8b97b8696eba23fa97ac406e9bf942e0ebb1cb0d05eebd84e3cf59cea29166ce78559c62151a10ed50f9cdd4e6a65c89250f1db78b20f925779f53f3fe6cd0c2f240befce7e77991512f768785c7d13dd4560d0fb971cc2987e769305cbdede149f147332302d6441e9cd694ee90c95270f64eb2ed9e37da094f1c58fcb12997425c46cd1ca6c41eb8d6c7d572e276662de18efadd591e309e50b2c2dce898def6062239fd5822862033d85d30ed4292e05f52ab379ba52b99d6476b014eb5f8ac9dbe46e63e07dc95336c20bc7ed7d8dd0282b1af62832502cdb06e7822eab164275ce8c42f800bc888a73cf56f97d691615cb350a58b93fb50d80ba20cb74fdc8bb573a30a33a9b2bb9333507e675ad1022a45ee88fce6695b190b98e0aa49516fa4575c61ad3a1ff5b3f5f7998cc4c6c475374206006014824f8d56a45e17aa101b4b0167e6e41a33e262ae58a67652d808e6298eac645c0717ffdeb1d814080c0d6627052ea6f4baca8fe087a96d4684571284307a567d2d3297685dee24912fa9a736e21ee27505e3a1a50f2ca8eef18fdd7dd81d84d469b1a0e369f55b652852aa3ce0af4531b43f5185b0284159f56da1479087955d7d7be5e92063286e5af46b9a8c18bd1fd27f3689e2cf94f138bb17a776560bc1e11d4e8b30a2789e0af8556b81522242ccd6f4cdd3970f0e06b562db9e5e74c8a29b296e8194140053ec1bdc9986f806636ab6bfdac8a04ad5d428d5f1af79b87bd96454428872e5561a455f83188206b1347f3795529172094c6a27f52998b91bcca451a0c93fe29c5d7ff46c32dbfbcb438d4a76a00eed867aab017de0ca8c6dbac4a7899b2e3504b9eb79d808822be78e6e691e4a26b8b217857c5840176cbea7898900e5f300b088b511d2c06d290bf9ea12a19fefb338bcb70793dace0f71c19fa626378762f2f783dfa425a21c082cdc830f0584236d9abd9740a835954be045620e92655488a5ff6907aa1114913bef762311df7c2a7a9967d7f32657e321a34feb8f9256428658275b4db34a8b1629816300ded42f328a546035692e50d4a080da16bf79e4c2e69933acca5e8c601879e64259e740f4b09328c6e03353dcf8d2ac86d7b7a0e6f059d1a560e4e50913ce98b82addce3857971bd00824104b18fe58c1d97512d9fedf0182540c2f9fb5feb1f3bb8534fa65d79101929210c89755023d0a444e877ab286c65e6608520a796b922d0b36edabbcd33bca3e36f9149ee8930b7d2256d68aeb496420382e5942da1ba4a7128d68d42869053381a532e46601b2f21f138538799cc35f96a64b1b7d4f17b4ca4af9b22ba0af413787348df35be9c690df438d6d26d8ac215bc05622313bacff187b3834ded8175624530d8e2e4c1ad200162ca4f4046bd7761cc702c330cfe304672efb73979af0c9566794c990df8ec89cfca89f851a3eb8e2d1c7ef7ecc5becdb309d7cdd982456d683c30bdee1a7c321fcec20f8a78a6aea49944533fbcc760a0eaf0dd907fa42096a9c1e19c11ac3e0fead1892483c2bfd7b697868068d354ab9e02dbfe64b36595963a28655feb4a3acb13e47a4cc5b3f8f6d6380333109105a04c3965d4658d26d28a4fecd76c1f0c3d57b8b77bc909e5e2aa44af0f57ca2f7df516e5e2512ae263136a0974026274a7b36621338ae9c9357028539fc4f9c0aec43a391b613749e903040ef8dd3cd18a9887ed5cf0b040ddaee4398b9395ad511ec68f5987ca7e236d395126c4a2daa4024e96ab6bcbc7d5fedb483b3f263fdc1b40f883c9028af82e23e5109f33feb9122da0c0161a2a4b651e395d600e810095a8de59ae96c3edd08364cce1ccf2c71012ef42ec45a137b818201b4f4492146d58504585519ed9db5f6ba480e13cb2d494e6e2b0e134eb3609f9c348cc95fc49007509db9521fe8d6495a52f298dfe181f06d00b93365817fba9ab2f4e78b5505ad9e72b3ca370dec64158ed822f2f48f2f9962faa31c849f8a54974104465e770457e1a506bb1708502031b4eb8cd24f8f5a61d7c31da7c9303be7fe35b7c5d0e97f2f5503d1627747ef929fde7d1b6ed4593f1a7324292b873376a2faaa5423d1a4a4cfe010263dc072261308a18da88e9b88421192f11766b14a695d1539e12b7514a8b93c5c0b6813b37c4b5e668564bb6cc0d8dd452439dc638b0e368334d12552ab8d56c8a986532da58b733225026c076ed15be151015b01506063a4a262633eab74083a4f6393bb932e0ae9d8f7b62121725ee68af43bc40049a0ffad3e539302cbd5e283308b5761c9a4ce0a2599d4fcfd1f44cd64bf75f78fc7b734ebae8351f604b7e890f165d142f83bbf0d91e19728b15400419450474d13dcc730df3a80dba0ecbb85f8b1b89303bbb5270584816509a34d8bf5430fa2372489d6ebed5b7d273c170af730e03de192f9fc2a99ac20ca87c31b1605fe9cc54a8d512d1b9b48248ec5742611e237a392b6b8fe8c95a17bce8a31a74888a2189a809ce1a22f295b384e04b1f49ca93db325a381ea76a27ccc8a451224983724384bb8472a69ecfae3e14e823e79bef5258476490eb8263e036bac4dfd26c67fc55f51e17e85761d2d8aaae3f897e1515691c3b1d37cc77adc1c080e9e07f28b4f610869acf50de6d5b32dde6633f6436602c5f7bf19b83c1c7ae780338a7620a879aab809211903cb0647b0d77092807ad73aa0931d8017ef6a9a525a08669894617ad379b81154cf6c069c244905c43000367d332273df7c74da25b9e5136d0139931646af281657ce4bca21c153881cc0859a9c5bfb2aef6ac4579d2a8ba48d9970660f8972b7028db8ea6ed98eb7a9d20785190995c76e2487328bfa6f2e9986739f6ed03159722e21df892e45299fd00a059c59891b884632be263c17264f14093da64d13a7ae8f8acab18b4be78eab4793b4cebc158e0bda13f65ba4955f3e7c170c734178cbb008d60c746a5798a692790f353c59707c975fafaaf6585a9739e4eed8b93e37cc0e1ed5406a299aae8644740cd4029ebd05a81d0d42b42f8a90479465effef1c014ea1728662314eea7445460c7f21eb4043f6eb598816b242348751d90f4b54be16453e7f5656ff55e6ab57e1dad327e67033d3829d5a56ad5b28617d229ad0f50d86400808439a69877b7e705f4fb455d78007a387996e2ce9c8e471342e4b1586f9dc414115d6e64cdf66edb7b18186e2655cd502351e1c88b02ce434c86cc44db1306a431618b16b2e2b8fb604aa11b741890653d0182696a20500181ec328a91e812863205181089e1b98943a940ccfc094fa98704f807d46a31f3c90587ee0771dd5f39c0f378a87fc8c02c8ef87a5993dc481ef6d2c83ac46bc482cb8795209de5824f4cb1cc63184b80d85d1115db39e5a6c67d985b61cd122688d97f6f2802ad11e72d5a0f563432814a4aca5645580d72dbc9e2911fa5c3157eb0cb643407dc0b4f5033e6f683f89cf7a1c7079f71d082271a8029ead29b51f60cf6ae6a0052cc1c16558767c8c38522468dd6783f02bfe727123d55f91855a37edee23a1e690101884b6846415fb16d70b9bd152d61d437639feca94ff8bf59c266e0f4f9cd5f49c516789f3b927cacff09600b3c9b49be212b2c12adeea81c2249fbf1ae3379e50671a6ee9af97c33f695febe08ee473eb7eb0ea3709795d43b25aaffb9f2b89381f56aea61abc2080d9bfa66fb79369cc63610e4702a4723bd753d99df785fb80e7c2ef00da8c1dd7d1782f724b0e60faa4e7946f0ed9867fa6d4e8798398ecac10d91fb78d391108201b4cc7de4cee584ec71fb618d5e80c108ad061ada6328512cdbb574854338358e72b11e81d10110fa10fb7634f3e9077e754a4640490a64e403e22d600390ba9a8fc1420ceb210da6ff98a792e6069f2d2805927978141656266c7b3a32252bf3415a2d9878c83b064f4030ba21ddd251f63892bc0a53fc3cb66816c795064d98fdeccca0bd6f77a97871402b66c5145434c8d4fb84b6e9ba581f7653f795ab3f669a41211b295fb8a7694b2ae268e4e2ab189008107ccb92a0dab0ded81c3186b2748a661b93aa251fafb4c74bf8633ca8a0528fc3d6a1859b89392675c81d1a24ede0e92182b7647f9a989431038bed7e5d379e2bf862af1a6b713c7ce3d5d20a9e97210581686bbad0c19a70b36b1843716a03507e7a81be1755b8c4f6d2f0da21c238a6c6d2cbbf27e7ff89729d57967130e15386688773f1b3d9391d5c115b5ff6b1bbc006c3344c9a2e9e7358232bdc604d66b54ceafbd06ea23410b73450799b9de6039405884d5a5f79450137a397fcd9fa086ed2229d62b20f8f7758d4914d0b592026bd9137ed50ea8abfae0dbf8d7291d93eb6d41ac0a91da6aee28106456856ae93403a22fe8b63bcc1523541d7ed954badd3924393d4023d88006713b35f9ba1944a90737b29bc559fc7241cec58409d0e606c21c333cb744feb276c3470f5423f6346f3f93f9f85a505394f0e3dc45247af43d6afc705d1e24b9e7b6e93a44ffc12c8c92006ed028606bae49da00c06098196e7188c8d703c19e90e4cbdbdeeecaf54bf8bbc6a9e3c4a6d09d2ed96a8dc05829c8c7d9286ab6347a1786802981bc139bb25fb8fa8d0b75bde94a50b8c0ca325d5c26654cd001d82ecc2c750c99708a42be964d5de421784fd63357851151a9bb295997e1249bd3540c4108cc0ab56182805956106e32c93f682854657cb0b20a117f43b07520f2d587fc242a712f162aac236016b31d3fc42d488b319f622191072d4e3959fe5f30104ed8b86d117adb1731da92afe27bcad20ceae88cadad12615007df1439f1b93a2afdbca0bed138ac72a831a2d5622d9864d2dd8b0f2832a421273ceb39d39ec52c788f643d8ea7cbfde5e2df78fb74a2e1c7bd64c46f0b66a5bb608d52e04531aa42b2d12281e5f23c75e8738b109257f241263c6a0110dc115d91ca42a7e59427666b68afcde3ce837453e3d0a4798ce44610deb2a53e53936abd8175502f5abaa760bb4ef4d09db209052bf0360e738d550bf6224dedd1b2661fa93f3d00473e08a4873380942f4ec117b16d3bf84eae0626d0706fabf81d2e612eb1ad920f176f896dcb9fc392b425db167f0a4b684b6c5bfe0696a42d19b6fe53b722795b15108444d7fd8306e006f75e835e46ab17137a39efba79648e72297a3973e54ed92dea965b7ba61b3e10db88f8c1350fae2a3673cbe21ee33d63f88e85dce5cd2dcd4431e0cb9d0e7167580f8c0f4cc89478e55e573afd2b0063a4d627ef98d116dcefd0be56f65132b0bb8ff375a1c8cf9a104f6ffdd40a5c899e295ab1b937bc33210d80215457805cd1e30a3aaa55cd0877b0e9bc3ddaf8b800c5c1854fab72feb76e079bb2df24fe1bcb7eb0e9d76d5783b08188604e7acad6e94ad9292db5867da7360efb426553fa60e94d1dfd8614040e660e9c3c110d7a6237c85dec38b59ee42b35945efb4cffcad37c209e00b5e2682d6dcfd88e0171de8f6176a125449c70f419210a4f0b8162719cd3de8581137fd3064cfd552d2f7e82b0f6c94027035aa44a98995b53330f03f6229da9af695c982c60180a9ac0dce6c4e4dc4f3f217759b549bea691b3c4a2b9509643bb6646d4ada3b955fd06c3c187363886abb20df8fc461fb070f839bd2cfcf200da9c77718deb34bb3ac2572dcc5c2599fbb596e9f22462e7c955590ce3486536a5e0a8922bd420e4a97770c3bd6fe14ee52da8dfd64713624bbc36efc53a0ec7e31a7076aa46b4f4a606211c100fb3f062b15b29e542192431aba06107de89c5aff0a418a14a99c43ae2ab06986d05bf5a4f03140be1df94e64501f77ac97ef736a626f37fc4e216f06cc0fdc5b917b034a7107012720fd369549e068030fd944a219481bdd401c3b292fd1a8904f3075ef3a6e9051bbd1823607c476c1522b15f92b1b61d7615ed431c58738595765847b1c7b6f939ffe76e4003d3dab4a2a3608048ed477714337c21f3a46d3cfb53073ba9bb8c3e45ca39ed8e979304913e549fbb73e08caa6f13cd0c71757e617b33d1a754c7e206fab295d10b8c6f9e34088a605cd577fca0ebd5bf83a9e7bd7a4857c2c2924198625b4f44a384ece07baf3902de7340febfe4c5a0272b1342b5a6ea1843919f6ce3a350da693e5967a5313f11de2cdd3409397ce07c7487bd475316e96f0f1448dbc80b8f84aef983479961c77b7b80ceb51052e9aaea6ac06b2ce250ceb3d09f722962d346dfad0555707d987c9570dde8a7b0213d4b74ce31df5fb5af71d22f524f3b00b79cdb17c3ddfec4d5878475d8878784832bdd5b0661994daaa43f791980e473e66d32bf272c82fa83b10fff3d02bd22a49d80734a701e6ceb1fa8dc36b9bfdab95f354cbe4580c176d03e748408e87ba0e1a583058fdf1e468f7ef3d4be15e92545691abf8d294373be6cbee33108e0bfcd4cd14f3f99277ccf84345dc421662d878ebcc9b102c3e20221fef741d1d07dcc0982bfad33262f6acd6b3fe8b8e630d3a95af7d019131da8efa0e7c1408a2032c1cdaa3cf6c107e626a3c7d04a303efdc0805e19fa48390b556bd0790ca10c27f02fee0232b1c9d280b8029a2e7d323733e6238c0ee962338836b979c23f69127bd6a1aafa4b8fa323861cf73a27220af4363d5887ddaea558edc3efef43afd33774a7f17194bdc1bf3b32c2620e3d140403730d7287344c66d2d5c0b7e1dd0f0189a78dcd79abc2d002444a95402b2dafec89e725c3821a9a0f33eea0183b4fb3a593e17875aa1e405ee9a7b99079f032d0d0b73f7b469a1bf74d4bdc021165dad9d4a36e3c00af8906302a0f9774100d9c1c74a948cc1980584c0bb3c049f4c19dc8abf547426a08024a70a54b477fa363b1e109b3fe302188f8184cba69a4b6cdbba8e03709b9d87b3fadbf9f3bd96fba4b7ff21bb5528126b53ec5d3b6e798421e26a48fe635a81fbe9c0c7847072ec29c652a57f5ff0fe9cffdfd69ad1a0e8026fcef8abc24c8113f754da731fb5617b3eb1bf87e9b0167aee5c3d4a7614e2eec19bc5dcbbd5b760e864d4787ffb9b816ac0b227495c8c3a02a03e6a1b659921409ecd80bef6d5d774431ccbab03e664c57c70147376c5e53dec56254c9c4220d64e8161dc4b7b29bba1c105ebf550a267d3c7cc50021bfb9bb0f1ac753bfdd62b711ad7b75848c0bf212b8d286f93e2b7e38476c801b05fe18e0c0ee3794b49987c3565dd95b3faf6e9c307ce67dcfb53cfe00686c8372d039006f2de46040ba4a8bed2275b02a584bb2b7af0cf57f53a4243ab1e88e3c3834d0c79a6e83935f14df9fd6ed02ff14253b335556bba34d506c51f0a059a82038e0a7f92e13835ca7457601e451ce35338dd9f18b3fba695cbc449709d21d475a0f64ba4cb498606ccb467b4ad29bbb6a507c087706e96ff751025d64aa332a97cc170e5884833793d3008ecfe43badb80b8022f0fb518df24ebd999e695370708c67045b0730093225b2dcdce6e1ef3f3e7982e462bcb8b5c22d05c5afbadcd9907c52be732afe4591da5f7adcad1cde1be4564865b1c0d4fb806c48878b31bf20d4899152f068339d8829c438552b60c20b71c92a47e7c35bd61e850b12f86293b7acb0e3278cec6537b800366035ac082d16922d1418ed97857d650d5b289b2f4c4ea303b5e82990ba0f1578d69d0157d2698853feb48750dfa04b1b8c7b32069e03a6955f60ce67832a10a3ab424eb098870e3c46dc0bf1495f6c90ee0cf4bcdea3f5717e0d44929f8f599def70fa6625fb6e301a090232443cbbe635fc79a431b32ba291e097d7c033374c0de61a9a85001856f682e61a3879b1c511a99a04d14f1543f67ebd768d10b3f0143f6c59c78a8957112ea01b42b483c4b18e1cb9aec5530f041d51af484e7e669cc83a0516488ba3a2d110eba6893ce58c99911908958a1b0801c0a6b994622b9cbc42302cbe8a8b4d200d49b214c9b83bc9e5c8285790a29785eb3ecb8c195576ec6b800736631d04414025143bd0318993e0c1b5628c0fb17a6466ac1662dfa39f22511728dacec1a05d446ff625acace95652f91513e6c01d82762f4bbe98c59c70364ba49faa2b5462646027fdd1e38fcf955b536c510eea4b0f9bbce97e929b6900a2d2623d6a1bc68af31507a4f6d20bf2547a3d0b0b45bbb7b78462731b14cbbdf6b7dc429570f8941e5690ea6325e530ea23dd84aeabdceb72f632c553f55337607d08ded8f3fcd404d694ad8a53b9514de4b90fd336c060440f1ac6fda096694f051cb35752906eb877f602e2831368c33e32884d6d86e0fd2a2883cb86af8ec210a08075d944146d7c4bee305bbd7e4df024a24206da55e7d1aaa074b706286f03f42ca0c01314b81c9f8810ad063ca18002db7532b4847bdf6580604537696a2ea5ba2c65d11bf2db1749621bed8f83524b3cea879d2bebd844cc786db91d80b6bcde2ae091d440cb1fbee6dda8c9faf254db40616fbbf90fed92a58c5dac965b3aa0c491949fab31256a49976ea55da5af77323736419b47d7cb7584d2b747c619b6e536f17e952e25a57411f04cc4e6353e3eeb43cfcf11f7526e1bb11074858f2d4f735e2534ff9cfdb91df87fb5941f98174f87a0660d7ee2922f20b40703443d53b2e01a72dcb014e49db4c2e0c5f578a6d4ba824bc6029952f0833ec12fe0299445518cecea080f21eaba81420e4c6bb7e3b994b8259d5af29bd1d24a77a9c85997a0c233b08aebca4e91187aa4ff1f87a5fdafa9c4a84a5c8c0057db12d80df4bdb4db604d4348281797e2a55c829410949c432c09499f65410e90a5bc852c58ee47a3679743fa2fe80085653f257a021fe971fc5c8f6a0552e1f69b5e84d6d8f5a328402568fd2a4b6009587caa12540297bf86e9afbe9d956fc86614c5b25169f8c2080df336db8da6cdb08e5bbc5d33a9ef058f709f22a72d87de767ebbbb764da7c2db2e78de666dbf33d07fc65357bb59c9d6c3a919d8254bfad6419f5196c1d0de80135feabe450cb4748b54cfa9a964d11ac4666fb084db70709768bc9a8aac77c08e9f27906a335b2ad83cce3f3b7a2e1613b3ccb791af6d210250fb0a9e7ea33cab093e5e88adaa8b2a00bd9bf4cead7568e04d89c836de05a62e2f691f20176debaa83bb8f8283f7a83bdbb3324b058feda87b7a0d2ccca182b1e8ef743821bc95f10733fb918edef18260ffb4cc5eaa233ba579568eb81b6c7d108d25d8b8ed7ddfae1edf169ab6aae683f2f781634ad8fdd8d63c04bc8d6010ff4013d32ef94da17aaefad2a914ca9ae81b57b2bf117a2e432f8b45ffe27d8c593afa752272d5a9d48f9c91173fc56eb93424b1ac4ec5e1945cd377aa66626c3c8a2377780144c5dd92ce3fe482c3681171dc710310214fc2452bb10c7a5b5d5ddf1d3325a2bb51aeedc869e12aa7ff9c62e88678a1755f3d3437263f5cb0725c2972f4e513d6cfd2531279a750c620f2c03c3810740b411e4f819b3778804af329811aad50df60210a0557853167615b2e2ad26987954a41e108bb1156ad749662ebd74fbbdcf1527db7b128ca80043be527ca4e90c89e347380c4aaa9bc2b8a40ff8d8bb81b77943aa903fdc3256e8301e960b99789de1d0f8f3f047a09a7668a87fc07d5383d0c0875a253fc240e8aea7d7697e3393f32eec79b9962e500a151961c4811ceb61891cb029c54616ac08f5b90bed312ad30b52b67578140b3214c75815098a97c9c5a8c25feaa5490bad6112404424aa9c244082672c14aa73741747c9575c1ac0043388d6bf85810fdf0f7f449212ecc030709b22e880bd2cb267b78cdb0b08954663d68bb9ae1a6cb68e75ca2b4b997349dfdafee05424b7bc4d2681d510e092cfb55c6020741c57f1ce43b4174835238a23b649f521d1a637aeecb1379cdd810c43121cd4a6b69394399ae5f7296747ddee02dfb349c95353dab777784031dcd4b3a14c5dbde21c009635d29b6ffd1a11fe63bf29d4d4ae127a9475d16e1657f7c033006070d8dc1897f0d25c9b2bacf6fa106e46ad7228e45173748ebfb0082b85a083d4a08a272c180805195018efe145d201ba083a1d29c0751ad001f9af7015987021f660ed991de9e6682728147bf50e462022d40ecd8be84a0971ebbdd5d9aa73de7e51a14e018a73aa97e016d12c04478dfd0ce4ba82bc8fc877e6b181d32bee4b9b35acd6697d3f7318d39c0eb33c88853dd7e73def68b3365d37eab913f393d69833857280f60e0ac3bd4a45701475880eae0c478383a2052748018659ad2b89af045a3ec687e65171b4420abdb78efe4f1e35ca1dd5414284bc01e2ea8d89f49d62612a81addeea0622a06647a6199814779d1a584a908b9181add412af8f4dceeea7cebe961d857cd8fcaf3bd48c687a0d8aa5fc61114eef256f2867beb11910e6a9c77a10aff8326e1b8c2b366221eebebf6c1af1bf091247c337683bed9b452c8ed1edda3d97e3b941e170c2b003ec79d0eddfe59039bad0abb28ed4ef81102b8175fde9f26dc19ad0a5dd31f41d6bf25e1e32821b015ab9bbc670ddb8ad56ef95501d98a953533344b2b872abe5b59d4bd8204dc2acb428c19ca88b06293343a3230bb70934dd018a0638a26963467abbcd71ef096f053171485f78901353c515984ca0dd64e9530586a833c31a4ca44c1a02f8bfee9d02a1000d05d7367445e4a52380a2e8e8a044890e3f86e4a5fbba5cab9dd5c6fc08309ab7669857716b0ef7cd8aa3db2c5d31b11413dee07935c1e13567935894b068ba396a78a6422d6e152919e41037f0101a9485b4fed0605bf2d565531ae4ca41c06512251e8c956801e451be0504539cffc10907d356ae6b57d0d2a18c98a13e578f0c07edb1857a19877a0b3de6f9bb1d9d6f60c5bba371e586a19c60c0a161a366d7c7da31a39b31fb1b3d86a0bd0f07bfa218e08f9199809e2e36bd80b97e50a09f30d804576f788eaba32b4c127bd8c648a0710aa926c9e04984df58c10d1d926b5b4f58fa6d3a9115f2cc85739135b5bb10970a98c0033cdedde34455dce6955e4afa64c4fa81a24de320a0c5520ce78ceb1947c73785c16dcf21002ce2e71c6984e6e4c425fe72e4000890198ad3d8f493f741cebec1af814188bf6e1a9be3564fad5e1dc55ca2dc2635624f80839581a0367d6e85d2715e0442c9c0835850e07109139d00821a144abaf1208cebee2223aec9f3fbae14b21d5decf135f588bb5694e4891207769fc5652dc6f3162ed859fa8627aa9d56ceb8d635aa41e9319d4e0b9c254723d1100fda9762751175cd8d387cf2ca2a04c1f87fdd3abf7abc06c8dc04c99ce339159afd6e09054f06509102c9d033ad422955920ccc29a0e058d3a468c477ea54b1ece0f0d32668e71da5ef6438281c676fb0f568d1556169d7376ee7cb9a071c77c1e057020bdeab7075ec3627dcf1a17037b4327f11aed8862df0980aa78ab28a4edbdf7965b4a2993940163098209ef08a10fbaab14f92f043003b17b1d473a371c05c97b4645d9a6ce23f987040289dd93627735da00c227640a18848036c4af13733c0e1ba39743bc51c31c01ecc41d266df724e384998d81486d3c927f1becc41b5234f75b48d88d2e1bf4f61126a15bfc6f7a5dd6616920a610fe98ce7dcaf2ed003b515371123771407757bf23f4e1bbbb75564ee20761084ddf7b97c78a72b09395cf69e863145be2dcdde70b723ecc697939befb1c17e400c79e20e077df89dd7fb3b69eeedaca2008f600bb9f1c97ff3b02bfcfd659ebf79cf74815f4fd234e0bc4b909204e5991166c05629977d9dd367e0ac4d2bbdaf83f0c4e20faf6e9c1c1f3bab1a3e3b2216a57c8fa4f2c29ddaf69c4d2dd83a26f5077e5f799f67c1cd88949ead64bf657e67c4f4ecbe37292257b84f0bb0fbffbeee906bf24f51b7bbe2e7f3939e187e1b3682e1baf69f4fa6e701cc7717914cbeec19e2e775deb4bef4bd6975fcb637d1ced78c04e7449d1934c97db2ef5131bfb9869ec2f8bfd39cd353f15bbef9e82e05852607fd9cbba46c42920e67edc4f8e1b751a28279fe36cdea163a54e23e5b132333579ecda9eb63f38e6ccf6d769c0314ebac2e81d6bf1c5d9865f82f739f0bb385bfbf7f353183d9feb419779dba6d92eb36d2943e52e4ed6f297277727273d5b7952da256883da0eda6cdaffcbcc64dbfe992953f1589669e4e4b1faaea9b20e54e876a5be68e124ac2d914065c3173cccaa44494de00b0f6bcc28c3463b6208962a5a3cddd9d111ede19bfeab121d1d1dbdfce8e8e8c88976944420a20212a8bbc4ed084b1abb9c67a8da4c37b67aa9e9a6efe384cd45403a7a0d30e540861a25a09a90513730dc10e5035222406266a56610a5f14f104686eef959d6a53a653bdd97fea85e66d54b93cd8d930e713def5fa7d03d77f532dbdce8dbce1e5f744995f68d77d67b6b47c76f6e5523a73ef12e4444aa4379ece5319ef7fccaa2ad50c93e657b0fd1910aa424be57f0feef14bc4ff0eef38ee33befbf8f81ef34ab971bdd668b3ee5699ccadb7895bbb121facdcaaffc4d9d3dc9b450f425ef02ab44cee440ee511cc8ff8c1ea3bfe82c2f2b4e65ca9425a6a72c505d6a5f3c91dac688546a14fd8c03f9bfb17a37af3678d2dd234ea75b47a4be7344df5aa4bb25ce369b456bb3d906c5bb3fafb38048252a72849303cd05c88a1ca1358d429fbc71d89e7514a7eca5e4fba5050bd5df05ff23fe48fcad52933f75f2a74a74a9e99dd504ac899e7b480cedb02b1a9c40f573d6b02d74b96347ac0cdab5c71449d464f5818070348e9e0e680a04025d82bb2af1dd63ffe87e2d72d28e3e789eecd8f589d437521fa93e90faafecc53757d033aa4b152caa0bd5a6947e134f7b4635d1b4f78cea72b5c94a44c429398bbee8df3fe33b491f00e606e5cb9b29dc60e00150802983aa03599c3491d52aa4b0c2ccec0a1753309922b5c676831258982823a36f019526c71f73cfef993ff72b688eda49eae391edef8a42d77779d1a59d4aae1a9c6d5fad53744997e85275a112e52f355d42f279ffa3acb1cce158ead68f648df1f1d5fbde31eb51b746fbc1b2e81f73536e84e91ed8fe7d768405a16da6af2b91fe4eca185cb8c0a29486956cdaa2e2e440831223461432fa489568a2612304951021e8820b930676b872e325882b564e64f4a76d8569db9f376dfb5a9c52b25aff12fd536a0908a96a7f0e4f192c07dd7afd48f4a715fd3f5ac7eca475f289e51d966f898f163219aaec3e9e59d0271ab66071c90bf48636b23b5e211de04331a0019a13d9fdf13c35e867a264868c14962764bac0800c0d1b08b688d124449b3132afe18929284a5844e9428a8c8916349668624286a81250c99c085710101e902aa20a2ab020818c66806a87326690a00726be6ca0f37fb5622e7fd55a6b6badd5566badb5d65a6bedbdf7de9bebcd39573cc6478dcf1a6e662ffd95d0f9736b3ba2e8c095ccaba8e30a19a629998b948c283210ce581242367291557109e5a28b2f7890bdf071a04a56c525938c20c8587271b29922abe2924ac50f41d4642fb4a064d9799841a24af602c6429c59944056c525ae26033c5cc95e686521cbcee3da5cd26d914c21fa545491e22673f1288c8c097dc1dd6d8062090aaab9411b243afa19c9634c74494914244b6634a5294d473c56d2238ca8b080bc813839ab7045b202122455a00673ce4f190b6db3b5365b6bad18b34a06edf89942d6da6cadb5b31a3e4b92a49123e514e3e5f30392e46bc7101276840484080a468ebc7c82c84af47abd82604124597424420635f8023fc849100435088260f7e4228376e4acf5eb4557c8609e3991a275f15849afa0a658a1293135393d65a9cdc8d02bfae609bd721acda338cd694e739a149e41b971aafa9206aa36466a8aaacded298e93952c4e4f53e8de7befbd588a8772e354f5250d546d8cd414559bdb531c272b59a8d353280b45a128d4ccf7b4fd3839a7c09f995daf2783604546543062644e3531416fd3c829a594524a29a594524a29a5e414a24e963a5127ea44d7d4dafb95952aa7274c7e358ba2b4d444e5a93e51e5c68a6a9779937ee5577ee557352f8a8e442061d34e3b7bb855224e36dddddddddddddddddd9dca099c2c57a0b903fc99d9f57a320886ab93c7dcc99ddcc9663bfd16a6880cda419d2c2a5ac16322a8508434848891230b98761e211d151515c1a9b3d26a178f957e55a1ea946aa5d2aa5265aa4dd5a93ed52c19cf3c565632dbdfd4277eabb44af398adb44aabb42a95d328c1a6916f20b62e17b9304392527424825bb76e6d0c06db3ba69005b2c463a545610520445438828405252ecc6cb6366b87101962036253e2f219e12aee70d7e10edb308948ae404632876bf6ac423da28235d289b9b7a76924eef95cc55f5ea7eea6c15d87ff4edd2c63ae9313510c34dda72eb56bbb52f7cca5ea326ef25879c560ba5430c6388bd4ce8fabd216b7859a422f27b3cb49cf496176263be9f7eb97f93a719c2b884279d23e4feee070bd4ed78ac76e985a2bc7798fe4d8c9c9fb2ade97d769bb07560de67c33d5f7eff3fa2895e1f3ff7c4e727e1225492650b78f25fd24dcb63f81ba7d33a95402f3f36a31f9df238aae5deeafacd69664b562c961d77051d13b098db35d1cd0dcd7fdca59ebd7ebc93d4484ee7eb6e7ebe9e5a4d084ac52baa4b327760350c88066d7a74e53461d848893758893f907102779a8d01a0b1d9e8610a2098d19460f41cc000587375480e0c43623e02078ec99db7a056aa266868307c8e4a045563d27b654f9c205183754c92a139a149a19c058a20618b0c8ea535a2572a14d099c90f1c50d4bc020abdcbefb8e35ff2dbdc124274c9c40f7e7777603136625aa32eab3868d009bb03a50cb5aef19e5a58c7a3167b9ee08dd8111f6a0d9f80c4102822f16bb2cd2648ce08ad9067498210a93248cb08263458b2d519c9095302f57b4f68cf22266877b467969024a672faed893d2e1d30e2f4460d7cb3f325e7c70fddac07677d7ace920f2e5d24fc9e897f6220517516b0247d101c921062aaa3851068d15999b1f6428030a1c124cb95750dda083e8c9a2c5a5ee4ef3eb7a8142bdd0b0671414696c1b7b464151b54b58370315191cf4f3cc082daf1a951362709410c4171a30c20a0d0d5c30c086c58a365bd0788141094c4b0a37c3674869e1f88013558c41821bbe4c514109d2b0c20b22aca0ce48620824989a38c0012e5d3c2ddd8e50f3041a3350c08b9b356398a9d204c67c83a6863034c0430c5862989fa7cb52790ac5d49e51b5aa3db467540d6a5b26cb649b9a98b820f4188f95966933798cce62ee485e55abd5acf9ad967ef5a6de3cd692da146ce386e867b3991319fd3a55a78c68ca686d3623ca324a55abba7c796a650cd31027b24c0e449fb6b9dd66666ca08b99acdb6246d2bd9d56e96caa124dd917ab2e9b32b5b162a9b8922f559b946d72a299a53255222aa35f9fb8152a9b4e4a299d416d5aab51b2acac539c9ea06c9b662c9fd5fc34554a090b756a9fa14b58b07de902e5a4d27cb242a569694a944a7b4355dbf83fd1a5a4e96b52da79acaf6bb55ab935722585a2192402432e26d1ad55208c35e0013ba10312627fa7d2b0dddbc7d211740109042984564ea8796a78375c3adc4ecf0b47063e3b868436c8316402201b47033081032306b8b702a48069288060544484afc0295f373728face69f1dce0c4d74bf47921f900267824ff7c44a1ff7e8649193c927f4222ec871ec98b0250f4283c927f309104d8cf3089c723b9055674c922411cf21f093fc3a4d823f93704e683f4364c02f2df1017088a44df891e3c0762f797ea526d8c69f85689f4ac02d52a916eaa4058e71b075f66225fea0fbe7ce1e701ebac367e03884fae64037c0a0678195e56e43f776d0dc66e0cdde4296dfc1f8ce58bc8c8c1c82588dad8330cfa21a28e0fd22105090429841a17d47dc1d8dd3a90b33f8aa7b3ca17768e216186e8fd4d4c67650d114f189be88084d6fe281723a10c4b893585b5e4b1ee0ac6da1fcd3c6052b090e8911c05108c8a02803df0d047dd4463773bb38110b83fea0d09a1d9f1ed8f7e19f8889d95109eb7bff9d1595955527824f711f3cfb088cb5218bb5b05328058c47bb2f1ef4c01899d55777524766f06207ab3274e767b82264a7ca04fde3e5b7080e08bdb1f0d7b5e45ec88dd5588f74759d359a5ce155db2681bdf103b2bb1bb62e1c032a2c2d4dd1fe62a9208b58b89a02075e3868ecb2f90213623e293eeca7918f902884f682f3332766f1c08bf0c2f9bce43092359a14ae72d6c07ecc6910550ddb8a1e32a3a2abae172d5e0d137e8501796ccab1af57f9ee7bf7c310b4a78786a683288e4d13a14bb2b2773666bbc610347695168e15f90f3fd61ae6a2735cdf92f5f4c674f665cced3dd8523dcd8396349811d568fe5e7bc7bae135f3e99e3725a991b5d5e94ceca8170f786b6717753fa3a1dbac4c4fa4edce141cfa8304e7b9279026a53ccd10ce62f5fab94bfa73b7facdce9eefb58acef59624f98d3f2582c716ed66489737f75de3be70fab1b6f486145994673633537a4b44b527328cd1cd81324d31c4ab36f57185d76b79c91fc864959d336f833f41db2661ecb9f43b03155195c98c6c60f4671a23c039b3c66e3f183543c36e4f1834e95e8008f1f94f21890c70f9ef15890c70f4e796c82c70fa6f1d8058f1fa4f2d8001e3fd8c663283c7eb0ca630278fca01b8fb91e3f78f318d0e307ad3c463e7ef0ca633a8f1f7ce3b10c1e7f38f3988ec71f3ef1d8cee30f691e137afc61148f053dfe50c963371e7f38c563438f3f5cf298068f3f64f2d8ebf1874d1edbe0f187543c067bfca193c7703cfed08ac78a1e7ff8e431a2c71f66f158cfe30fa13c66f4f8c32e1ef3e0f187358fd578fce1178f1d3dfed0e631d6e30fc778cce7f187521e03e1f187673cf6c1e30fa73c16c2e30fd34ca3f0f1876a668f111e7fc866c6843cfeafca63398fff73e331a4c7ffdd3cc6f3f83f2b8fc51eff77e5311e8fff7be3b11d8f1f9c79ac83c70f3ef118078f1fa4792cc7e3023c7eb056895278a68d4b70cac65f825006c01e95c702f0f8bd361e3be1f17b551e23f2f83d371e33e1f17b378f95f0f83d2b8f91f0f841b1bb794c3ffece2a8b2e1c34fdd7342aa9e89b7eb48519b61ec9815cbf33d0f94f68e76543371e008fe4495e3fc3a41dcf23c2ff284a4ae2e37fcc9d54c20fdf9ae3388ee3b8ff41c3a41f9ccf7f334c1ac0cf300983ff5ae2dcdd5b0eecc29c96f7754c2674a3fe3e2fec7e8b1403d707ea806042708705de68812f9d73460d10870db0c705d6d0017d76ba2a37b6bc708043feeb016dd878246f89746fa00c7e86493aff4d09edbc4c9c1b00433fc3a41bff8920d2fd39d8c17b98b4e34510e7fe623fc3249e47f2afe83d4cc2f149e2dc3e4423134828e17dd06dc29f10801a9e58fef63ccff35aa56b1ffd0c9340f8af13779650781a260de03110e7fec0ec2f0738001404207ab30b400a3e00a247e524fe1344af8d93f889885e9593f84d103d374ee22f41f448103d2b272bf80f03f000a2a75481f00f11bd284ee26729fdffff1b819dd883e5b4b471d52e5b4b1be3cfb34ac4527220fc58cfb4b394f22c67fdc2cf7d1db865cff0e71fc9bb0f04c12a16fc0c7f8c2c90f533cc63ebcb019f38635721c023798dff7640363a60de93cc13636c8a8148ffc6d703e25802b331a852c4470626e51f3b4b3e3b4b1aef49e6891a926320d2fdf1d0000cc56e8c29847f04b123830ee117a267153c7ebdbed415fc6cab3056f04ddd6da70b0744164cd889407e080c227657fe23d20d644c0774fffc6704fe10e9a6db8748779248b70822058048b74ca4fbdbe205ef853f7c4f3076b70bc4ce6a87080fc83c31c304480f0b7ff8ce4112c3c3a87bca09618330c90291ee109c885910faa0db82ff38004110bbff2087cf8e991c47350e74001e89ddb330e8a8d0187c70f78ca2a24d0d2d7a0fdda30a10c23dc9d474d03c4023b17b0f74f458a123849d3dc9d4663d5f24764f148463678820a40ce07824ff42f88a40028854968201e6ce151f0c11e03f19c86304c6c4ee7988dd1b27f177207a3327f173207a4f26cf121a004f69f0780076e20e135bc6419884eef1bf1ee00662f7b01d2f2b3b926aec49e60936af237048ec5e83d88d1d23623e9c1873e3035048ec3ea8680787a21f649e98fa40008b88545600b1bbaa40f88d74b7eea60400a3d49663129142248f09b4cebef63352af88c7d1667391ae155cdda432f2d1276e2c6042d320130ad24992fc23380cf21f6d0719e4e332a2822de8c767bbc05dcea929056412e9da2346db2ad17f496d27b88cac40fe3d50e8a959b86110ad5d2b6cfb2e70dae9fad9d35a23779caae35418832ee3f20f0e6881133daed1f3cbec8e25aa8a2e3f34e85c45076cdcaad84143555103d83413d24483e3744604faea4c152f21404865fd02cbc0a0a509d883c67b466549834d1631b83459bad8256c7f1dd077cfa82c54b025c2fc38d1f4a079864c6ec1d115ece9250d9919167921012e53a3ce3cd9f56d074f5e66ceecda410c350a0fb64f991928282344992a3340ec5a6bad358b27bbc620ab3fc463fe5a56df88135959adb5d6acfd8c0b65de9c73ce4cd476d9dab4738c719e4cacfdfcf6ef0836f742bec0c661ec3ae79c37cf7b6d7dfcd972d5719ef3edcf8da90b2779ae4bdebd43e2732969fa3b3d4c41b5b9b7740bd52e5b3e380eece0c5cc0e7fd8cd454d51c5b65fb9cd8d3673ce719c9831c77115cf1f3c3cf60ef1bd9c526b29a5d65a6ab95a33985d741a750fc7fa54c75fea6c9f6e1c8e7063dbb1a40052ad3ab3da893c53c8df1547d3e7c4dc8d2593ebd56a3d6bcbdb61ee5acffb3ccf3de6338da8ce5febad4b327e5a7b700f5729bdf65ef1fe773348a751c813bae2843f78f2d38de4371c8167e7b1a4c0b5df158d402db5fff5efbebca2bea303eea839771f4b6fecc69793d672f7febe178ab6dac25073d752c31d8da5960d8d2aaccc86cba22c2ac9ed6f6a49c4118208295344c15d365388d934b8c1018d95355560b878fdab823da3a6a032450e19f8fc93e077bb05e35cd2a44a3481e887405555cbd80c6353a84919dbf4c19d4d6bc0d1f3cb9c7f3ad93de7d1f0c7a443f8271de2de71947de9ac02b99c34a3c56dc7922eedf9759c5d275f49b7ec4997a67d28b6cf9af8e2db68a2694de287191e993cf1400518377ce1450d5f98fcf08594a81b8288b30508d6d87cf8e202311ec18a72f68c1af303b7447969b5d65a2bdaf72e54378d1965baa52efb6b779f66a438a9750962caea0352cc1063871cb85419028d9a379e2d0432d4705a4697669773ca5d0a1caa54cd7660a2e9202ba78d882d665c01430a25c89095530a8f99324687d7bfc640d9250ccdc376148169f2831bc1624223c2081a6e600a82073050c2c0828723ba00c1131a378b2d3c37fac7a5c109ea28294a40cbd8fe590a37525011f134e79aef57d0614bff2ba5d4d27d13508adb8afb5a77d1ef0ae2aef7bbd896e2ae4750a74eddafd7fab5d6c78f83d45be9b5b43a1c5c5f53a8e27af17d8c47ede2301ead9db3d62fd65e7b2f1212797eb0c38de45c7c0b38e2a40a4ebabbe874566bdd8de0ebeef8bae34b1a81640a4dcff9f5fa0a721442e8d282d7ce16ec5652b7142310d5da244baef872725e70db71055257bff2596bc76bb10f774ed115c6259d9c63adb5febc5cb504eb11b4cbf9f36de997d56e2b82d66765654b2f08d2d979d8519f6e5975ac609ceed021171d9a8f016aa5edbdae10c42aa53f9e8d2eedae7fedc8645bcca4d381fb8b5d77d418479456c241148d1fa982bacc7b72cf3d6799fc12df9c1a24f79c61ec7cc3f43e836399b7900036b613287be0ce4a367e9aa7754a29a514530f47e036f7336b30fba0e984b11c8ff9e64f91ba72685162e0971e6cfa2fa7b4684edae2bea45b36e5c6c9fdfc66f77994e20f7b18576eb658a1e7799f037af8a32e4ca312fcb2b51d1c9fd8e0539a84ee7b4798b50d8ed6496e74a18ee573781439172a90bb78454ab374666376c5f24f8b135cf29c3dec53a72d28b1bbcaaca70895dda7b23bd240d97d5d81e6f70469edfaad5dc502f7cde7f343ed7b12badda9c8e4d2caf4e3ea425725da838e558a0ee169e4632de3c6ea56a9aa6a9b8db3e85a88be051dc26e6f4e627b29bd571bffa43d94e4cdfdfcdd549b2ad1f7f86b1627aa6dbc2a55a26fac5239e8a7366dfce1af950a08ea4ffee4505e739b4bf9d434a23f94b47d4ec49b864e3585f0bfa4e8fb7a0a599ff9cc69ae34c5973c96999aa878ccc963dcff8c755dd7bd1726753f611207daddbddddeff8ce5e7388ee39e0b93b81f1c2679e077a3554a6ac1323989df2e6529f0fb2945291597847f0127df87634f910b840ffe942df93e1c7548e41baf60fcee37bf722aafa24d4e4f5035db8d0517e88cd2a8125dc2352420448c1c4122dba2abd4c6f8f5eb4958d134a2db35db524c64f83f9189ac5255a259ab55f55689ac0c7fbd9a46d436d9f861ecbaaeebbaeefbbe6f889714f7911163c54705d64af8c3fcb3fffb5f3458662c09c200cfd02b75895585835ff75f15c55a3579c60cdacb1fe6ff74fcc8effb3e6f042758a3e99e3b07b1efe8752cc9edee1f75c9f07571d2fe97dab64f4eda8babdfaf3e1d6adb5aab589dd0a1faf454a16aaddaaa549d72299fa2aaba5d4d231f5f4adabf8a78cfb0cea4e8fabace6ede74bbf299d35cc9976a36a929aa2aaa449566cde9096a52ed2348587081ce28ad84c18a9080103122dba2adb559bf9e9c464d4e958889ccce1a9495d977db34a2950aced78292bce763f04887847baf48fe6ebcc0e7b1c7e6e7c61e3b65b902dd7b5f44b8ff4137ddd104a412b96c623cbe68d0fb36c58b2e5e34514d7bd0f1488d69e4a302a6107e5825ea42f0cbdf5e6b3cc2ca39d41a7cbdbe7fbcd48d5469870ffafacf1e13c83be7cfe30b8abe302e9a88c7f2f78cc07d7edf75d3d007f77924d2820a4ee237e22416bad29cf80a4f98b2191299af1af0bb80ff087e243d3c9751a0a4fd919c3edd22aed0f5e7b567d4142a354b03054d4c040041ed323f6550134d9903e6d71efbf739d91d69450eaba47dd9bd7bbe6497fb2be23d695a7667052e2dcbeedf1a274e49af8fe0627cb5d84b81cf5ef911d6d1fe780bb0224a6d59c232328d5657e9e373b5ebd70a86875dc184b1ebff076abbda967685dd80ca45ee057d9dad6682e50d1a4a34b9f2858912d026335bb67d11a0cc9aadb40a8f7d29e3812a515f9840b00c2c8ca030d0326847309351586d77f0f68003091c519ac6eafc9e2f347577f72227dd33f7752c3d638cf158d6bfa31df3f431bea2237f6532df49dab7f8ee9a476bb95ab5ec13c70974dfd3b1ef7f9d968312c67d11304eea2c2497dd17760d35a6ba30b0c8a04683688065b42501165f746d9248c3f212954494f724892f47b022ca05d5fe3da3b460c0866f031f74fd8f827702d52781fbb10cc23d3681b353a8be065674490105b487fdfa338a6ffe4c0c82216b7f330c827ff4ab3384ae6f7f6e8f034e21cbda3a41e86aad45436adfcede8cb9cb3385ee7f17cca941fb4c23baef53407be0a27dbbd7fdee6155347eca711cc77daf9bc97bf1c38cd0fef82ddddc388484c6ff55fc037f921a677c4da1fb58c44187eee77b5f74e83e169d0edd1f9ab5a4ae149dad0b4d07342eb0086d7fdb41942bb680c18a2db0d8fe557780831645e4262d9e6cdf2ec6a97cd88e05d5d5b666a8b6fd6f4e230c3481ec4f31badbf39df6b83f81a690fdaf82f4fed018ba64b1726ad0b0200d688ff9ca1b78d1f46798a4c671ac81157dc105b4c77d3b42fdebe414b27f451d95282824b74787ec0fcd5a54968bd31ef5e76b9d8118edbb04e9907f153d3ae43f34d3b3566d57da2303319aee194e30c77eedaab3eb043023f4fdb9ede36985b8d0f6e7e684b6d0f4e78655d173d32124f4dc33d4a0a669abf6e4b039e7f5e7fe7371025e3ea0c69e6d1f93d43871760bf985ca15b6f516f2e778e9805267cc99e4047ce7af6299b36b9d9695a4ee0c01b164615bebff827bb5e5ac7f4fed744e77b0dbf64b60c3650acd5d021b2c13688e60b7a793dae63e7c6fa21eeb6073efdc7b94fa1cc7713027ba7c7d2f9f1e6574fe4eec41455f91eeaf7a9309c4fdfcee7d9ce4defd8abe5b69e8d267f4b6b9e7b877dad5157d43ad3c5652dbbeddd754eaefe7e4e4fc12fbad6722e3be06d41d7d36853827347efbd5b9ae6660d336f6fc1a1689d15339cf3d95a25495a87a93fbdcbb9349e4ac3732e280031d3ac611078e1a35ee97de9e4d21ee433147f459fd38ee2990a24b6adbdcd3560636bdb3e7ae008eeebef4590525d02575b2e0497bdc7be212274950e224f70f98b7daeec69e0ce66fb3e024c771aec4bd2f71ef33ee9dc6d9b4b78be48cb372dffa22472a10f7fa91dceb7e89fd9c7156206f2ce7140aadd7e392cafdcb7da651f71c06760b77b7707727fa9329c4e5d1674e72af011ced9c4de73ded0760caec17d180ace6d43e311d2ce8c7669fb5d62bb556968d596cefad16d7cabd3ce35a6bad5cadb5da5a6bad5dadb5d65aaba7750dd4abedecf570a61dcf3fa1e9dbfa98e3ac97b17e6fed2f43d3b73677b7f3acf7d50f74309caf49c25edb77d2ffff3ff4586fdf63d3f3583f85fcff6b9f968f8a6077ae15fd586befbd38c7fed978dc58dc51ece965d32d0544040bf6b8e92e699093f87e0570adf77bea4804dfea75fca11d945b3b6e71cf0d73b27a5025e746c167b26fe66c073c2dcbbcefc4273214d1b2ec1b3bceebfeeb3c6eca3c91fb4eccd8e2b2c74710df739c5ef6846257e770756bddfb2ed8392c1877b5d903ad075a292022843dd6bf3e67a7fd71d2593a4f58ce139aadb5d65a6bad9d995a6badb5f65a5b6db6f6adb5207944b6d1f965ce3927a5b0202ea4136591b594feb0cc443de550bba41506b1f6a279ba4ff669cb53ad4fb53ee1a7a82d4ff6a279ba4ff669cbd312f56a2fe672e77da0eeb23c69704ea39c59a35050b565032f095d608574368b42694bb4a90a55b2429d6cb8ae12166eae159054e9cc1d0ab58023146a62a889a1766e805ee8fe02a402b9541524158c80af9fb745b55a67cbe1a15322d4b43d6a34e82e30d4da277c794c1c8533307076778ee3ba1fa8ec12e6c466072bd8e080039b273544ad4923875b6783ced9336a0d1b336bac60d1a0bf3da3d68cd9256c670facf1004cc7ed0ea133cf1aa870470adb6bcd103574c2d46eacc921c745e66a670d14d08698271d3567d4084373a901418d9c315663ded8d0532d1df55443cd18b065c629474d172dc456a506894f08199b1a21403137585e0a67516a9cecdcccf8a4c00897d0b884445d45655b133942a68032a22544ea2a2a8d0e2f2154a4d123648cd2163c42ca346541458e1031341db75a0e36515ab4f0a2267b510548455b2a4234c278336889c20a2d5c402890d8256c47a1a508988e3da396b8d56ed0993ad5ba27a5140b34366dd11bd5d45225f7d2d294d22ca06c0f36c7656befe72cb080e1da9664d66a9efaf90a3076fd7945153ddb2cd183152f7668828c1b47f1cc5a4d41f04c931ae06c7f6cff65ab70b26d9427b12a66fbcf292cdbdfe617c084a0cd95117471e2c5fc120414318cb061cb9b313277ca851564bcc81470e9b2297d0a65ab2d412b76d8fed63f5b1186f6a8a51f808002a308215e2268c365090e9c18c2c8ec3f51a723b650628c8bc3cba4340e8eed352f0aead55ecc75465438b2008fd10f41209528e7e773505eb4c919738c3cb9064c22189269947f929373a1e33a1bfaa8db8e5349d39f09c4bd0edadc8e72c8fe4972dc53ac2710f72cd156ae8660e56035e757cedf47d1c4ae16d0711bf19f757ad9f7a913e3b6ffe13c8a53e87e37fe14ba9f803ff29889e75e159dcd3c1a3aa4d7f7c149f3812ed030a3049718489002c60c0e975a9c29ae165acae468e162022598a8f513a3650ce62ac771ee4ae09095e0c1462df381284e1d54f7a233fb65aacdbcb2cd1bd21134567496f78c42e326e70a8a453a49fb5ef7e793d6caba63756ac5ebb8900a8d17bbd44de86ecf28346a3a345337bf4be7d11bf78c42a3049a2176494add227a767d5faa44dc576af3292f1fedda25bd8df1978fcb096ad7dfa0094d7f032d9afe064c68faf5a914feeec168bb2718ed7b56f18668cfa82aa2d8f456df467968a1a79340fe248c44aae9fabf7b6c7d2a15bef72884efbd7d6f5c72c58e2878ff8d4b3cf0bf5f1286a1986f3878620e1aba7c6500860795762274490333ba47017fd763472432162ad0acbed3ead35b7d7a45ab4035a9889ccef651faae6aadcb066cd659679dd7ba73305b05ca7abeac46aad96baecf2112a5aa37a03dc3ec8f8241ba9861768e3db5d8df754a81f87a6c0e4b67756b83c06d7dda8be7bd76f461d65a6be66aad3573a2abd60ad6b2d65a7facb576d65aaf871900da658f15377507ab58f604b120d8d38b365cec2ae6d8658f0fdf2a4ca1f9bee92e7b88e4d8730b77266b2fe672e77ddceb25665b252e3702e9d8b6c8c518036d4b00d7e69ebc5cf6ba4c411260d885bbf75e8c43d6077ac0a63381ec7fa2c5f75e9d6dabceaeffb15ab9f37eb60fbbe2bf53378f585ba15eedc55c7eb2c3ccf7601205a11da894cc98aa6a522a4423000000405000d315000020100c880322815020cd64654e0f14800d6b964e6c503816c823490ee33008628c310618008001c410029429aaa12300aa5a97a264c96db20cf7d4548394cc9a4811ad8fa1b771790f1a357ba67eba8094308836c41fc177a31110bf72d1724ea90b355a31b5b8bbe8adee6834232917748891743f36f7e782a0d848b3258c02abfa1a75ffd980e6c9c901a6e2d9c1d24e2303b3bfb2e5d002746024c805537c85c75f6840328e2a4b09e7ef10bd44ee44b0a4804d788677d16391699fdd02502d769341c6f324b2ba89d030ab5bd6e227982e8259c3b1eb3cef17aa59ae76b328dadfb635b92d6c179a3892daccb65a73c13d5855ae4556ef5183440e3f937c28f847928c16ea34a4170faeaaced905e5175ba3dbe7107f327dbbb908ac4719b558b069ad331a29d7c1ee42061364cb368b21397c0928858d9722e88a9434eba8b74b8c60e6663550a1afe9f4ec0a7eafa5032b913d09a621c8aa68ea001051d3dada76ab8766bbfc522ad1ac3b5720200628f524b82c4ba09e487d336639e256f8487d57bc6f957c24e50b067ba5f8e1bebc95248096ea60107e885e055432baa78d08e86f56eec8c5c33aef79d01907ed6f5204cbe4777f25dba933f5d26f68f10c0cf1fbeb774c313563a88f010e21ee3ef2ae026cc221640300be1d8ced30bc7fcfb2eb1beb40bc661cb70b7e3414defcc4a7168d3f0c0018319fe6b03461abfbc4ae4690af8f9e46d4a371761b0a292ba3b998ece1490fefe84332505d3014844bcb7d2435af647e6458e83be11b8a45f919352c4371c0c772dbdb33af657ac831dd5f6eb0850896b570b1292e251b23792ff24c52247b218d7c8885d4f67eeb6eea9724b36528c05171dddd0f426d83199b1643febf27dbd21279a57133eb99529b4a96c89c5a2c486eac6c21c62509b9c6d5241a41cc0d4d9d07999ef1059d658b6275fe07da224528f042146ae2a6bb440749d08b1875486066c150318aa5ec9857497bb2e0611705265805a3bde43f8e7b69071d4ee5046e53ce570c677d070dbc0d43f98899fa3b59c924187258cbae92cf7fc447174e41fbb1ca287868b202725e71e60ee9609f2c2c4830a3a89f77c5815602bbb0e189f8f586560798cea39ac9cfb46a59ea54719bf3164cc18483a9cf2eb32d465da43b5d5c027414aae450307f0aa1265cf4bce468c28930a164dd07d78acfe4d478135b31d5482b6a5b0833f05fa5d85dc6b099052bb74d95192bc8d2e826fcd2202b79fb0a6948840d15105a85bf91f171631874bb2b777bc882df66ff3f5ae4de2d68877b80c00bee885cd72fd909e11a5933ef02a40447baf776d1ee9e063a76022d61ba95769ba549126af54dde4a38e6c7d57f13390ae5ae2d9924fda7f3503ab0a7355d8919690ab0a54c2735b07910f7a4fa5545a8518232a979e924a6c147eae6e68e852e82eb7a3dd455b16f5f5d2d9689e8ed52ce9f0f8b5d381d4715da24ce4971299fd41ce61a276921ac901332708dd0cf5e331e132cd48455afb9f09dc7431aac9bac65559ff433d5a2e5df60bc6c9a93ebca7a55dd8e78b32423bdf470b2ba37cd47720ba020593f34b8ef15029fb62ce013e8d1e4a967e151eac9bedd1c7e57face89dfa48e251c24e3321d9520dbd947744f2494f9ac2ab78126403c05701466a9e5b61eb5fa4a606d38e2396c5065d5d4e40a9bc8e9e381378621f1af94477c5cd12b4a445088eebbbaf2a2140b1711b87bd0b88cdc9eaba83bf462014f0c0bcaf5370f5a1ca9453b63379e7190fab91492de8a22455b5ac18c42dceb65f082c619462923ccffd8f0f3e7b8ba9ccd3d193a4d3d4c9959b2bc5d204b16802762e17f62a633c1a2cf4877059c5314975ede2510c4f273013c33633448c722e4d4aa6c29c728d4d61d4468d71bf02cc9b9d7e8c81e214e12617c462b596bb7e8671b84ae6a7ede6aa14573ac32baf1461f5579306028b6270a3309413b47a36730900d4b240aebde9e1e319c70f7c2b09604aac2c7ee30e78ff5a669611e0a37ecfd59cdfcdb1a3986dbace3c26a799e6f5bc5ccd604ec0aa32f6005abd2a809f0da49934c084043512f02082a42a11999ebac36acf124e91e3764e50108fb272ce19feba08d39706cadc66fc7369b874707a32c2f205126e43f13cabf26730a453ef0c0b29a8a3f0707f1ab055900a30c83976634e1d0b497efaaba7c85fb7c210fc45e3000bb65fc5addd436cbe6aa64ad3fb8a10fc9d4419a4552b2b67a64e9c9d463ef9cce8591a582fb10267d0284e7c5aa01db6e8bf964eae517d72cf945078ab17c8605ace17cb46c52edfea2969315f1ec54801781bff6d78135f99c65954999ead545e501cf7f0345bf1e7721fad297fe408664c1ab5635af7e2fb0600c86206fe37d067db663ed2919d17451702016dd2610e7866fd519418c03d6481d3f4f30c0125c675a26cf4b68b9875f54d48872e468f04ed022be85eadb0cd76d20575d9ab5de0532eaef09b1b03919d8103e724316f58f9b7f2ac47fcf33fb2408636cf784c6998adcf8e073260916d97461898f1887df3e998cd72a0ad68914572bb19eddddc9b18431c0761056115b22c7f88d45dc513a6f3f997993eed581b45564ea2bf4301cef673840b6e15ae6709244abc331bdc30cbc79b8bb4c140cd1ab4e119611b72e21062e881d165a10fbf5d1c225e8e8b787d14665bd63c1221bb2b7c87396651e6b140d4c5ee47b7dacaf0bac19824aa05b74d5887ab63027349b3c373d0274d5cdb76488bf9f343d66139d14e75a5ee9e2aceb7a9a2b921304079f5b5cc5670086c4f29bf106413f4ecd951807b9a1e382e3ae360340bc8262fdf1a6070d7e5c8fc0f87d4f3ea19278e388e0dcc70b290e0bc31070194b172db360ba50798818ed5a909a9e25cca9bc0feee3c78f28f3351310008dedd7d0dd1a5a504b7521b302f892f734c32eff786f0dd3796cfe8ecede615911407665c5a0155ffd1740f4df9d007c26a543a881bfc6f6d452b0a96d5020c4382a9ab5ade7d425754a61e454b9ee83c309a00036cc751933ea7a7bb3922dfb52d7f67f2153f58a19eda0605e09e0848318785d7ff955084ff183e60181895924a641dc34d4c3e319d40eccb2f349fd1ec0a8980773cba068fef0cb4a56dfa0f906048583935222b842fabdef830d5a4a3e5aa05757cec12878daa58c5b32d81ba2377e172f846937698e97d4ef6939cd902783fdf81da8a4f83f29462b28eb9f78a28446d73d7eb42829b8b15e77aa7ab606d1d64b8baf64adfb1688e799a5ece4bcc30442fe048d6554f2ebfc5923c48e5214d6615f78113f3d550b4143ba8173601676577408efcd8fd745f984b28e825605932200a5a3915ab1207f3d9a01e9dbc231f893ac56803431324fcdcda03ffe856abe925b69d9734f58bb7d1f0831486691faf5f8b8d91fdcae3e32907d7818580030aea98ca3c98ad23efebd53811a96dad65cf0dc1b999db037a311d923cbf99987ef19ad33b6ac22d41b9bbdf02bf92723079a56e0fa1273f63110eeae31137d757f70f723526a26e1908c3fa20328128330d97460306689346fd9fae834cece5d78efbfd2ab6625e1f91eec1bcf8fd51f86291ca81eab2f74bacf86d9c9106b27c186efc0a0a94e4de2b08aa3606567cefbb2c65193dc61784c0c517172ad5d7aa93dacd2af3319076bb3bf4643221a724f23b93e3d7507f9b37fa3daec7ab65aa5596ddc05329a6fa1f7c767c70de62e8b8f70467ff9740427eb3fbca0328c6f1ad07d5830435ca0638c1ed473af1c35b5fa27109aba4c1e7103deb23720a5c8128ba136a3915519900ad7c12df5b1f499714092ca0cd5946bdcfb30e916243f9a484d2d69a249943c7ca33d9bb4b876929a5308273883b62e0ee54c8d06c82f09bbca12158c1670242654801dbff00ba1fb4f43d8521ccaf65af1e309522ec1678523dc9900127fccf5eaced1276e37ba38d13439b947d4eed7a5818fac69bdce6fe43e84e57ed4b89e2ac32c16111b47b50c49d11846843d63451e232f34aa198189eef4cb046914f27392900721c26690d38bd188cb4b48985da79d1c49e6dd60700a80563030b14b7a00c30a928ddefebb79d52445795a6b178c5407829cc7c8dfb66261f2291e5aaff57a3ca641de6fe0a990a5cc742f68b0ceebf3441bbd54651611c0434e0f1d6a5a10d568232a560aee20e28af302447ef25711af3162f7e62440db3c9d05d9e9733167d16ed92f1eb02a610c2238a2717dec3613ed98afb148aa34b293b403ffbbaaa5ed26c1f26f52fd20564c5bb9801389cc24c4bf325d72395db110efa89fdd5e25b3a34bc65c25cb85a645ebcccb4ece3ea9ba8a05d65f069058eda5b39a3efc7b11d1ac027de841686982f1dfddb813ad696a2ec3e4e0557202e898e2bd21e688eae44858f68889f6d9b137b21799eb725a62c4e69d587bbc5458186133e2d23816ad1ac40fe913a52b6f8452708ac816b1ea716bc3254481a93067ed97284241a2664ba84a3c449e05d790284dab0d95225d9d06296d523a992fd8b057111040965c6c5b5dc8f72ed8d843265e3ebb6031f894b7210d13b5cd3ce454bead6658f43dfb9043791b99f12074b2866df0553737d15b199399f2b6aa5121748e86db2255889536d29d009574356e93ac3e2a4db56158b23a501943347c17789608efa4fb59348818fe817ef8e7fc1c0f6eee2e5726d071bc85edc7419987bfcafdf56fdea87d9215d72f9374bc04794db8855161dbc38fd90638606abc45f464adbf160bcd7add35d30b65b321487264404353e752ffa88c8450b6ea5c622e8a50dfba5ea2a258644990c73366db5682643ca91dbf0c421e1f36186fbd1162bf23b713c3e578e45b360718ed3b521262461b222bae2c0c039800bb2b635f45af0d53c8ba19a180613eafbef0decc7094e636fd320993dc31204132588b6c895e3b06a48ad408ef371256db1361ffda6d0ad15cbf1d409893eeb34f8bfcdf0f1292b2979157a54c02a62323544306ea2ea25f30beb51316fd3060306b4f8341b643030d050a1feddf36e7efd50a4d517e818b894e3e3888fa6652fa4a34d8e8676d7e2c19c7c907c70d3d79eb0652c52b9570a22b8304b802c1586360c16cc167c30d9e2bc7d7e9f8ba1926a9de470ed5d01b2adf0297c2006756583748a257a4550fbd96447744d4e02770b49a8200d6aa81ca463101a0def9b8c75a252daf41475e922e5db2d883834b52b241ae3a96601d40c2f7b78d428457dfc55eec4df238a7069529e70954fdfa9784511ee756b9383b000efd389e3cbed4c7b945521e37145d875d345b593c58522b051fe67f7e9ccae529be00e0aea74ff1786e04a6c1d2b3f4eb0dfc440d5063f8238fca8e2033e1cb3e1e12d8951e6b15911d0f2abdfb60208ba75a2dd10bb18517886639192f34a1f75cbdfc10c21af66105103bc99ace7deeab63ac73c3a2eced0b01938cf29ad44000352454f6527f30ba49de60879ff1e9881bc9924fc8c26a231ab1c1be1b2bb3b18570a0f5a64fde8370faeec2a7f5cd9a71ef7882f0c1563f5ce3be1d640cb3f95ccdd1f4971c480c19e8c50f4d0458de77f8ecba6c5c18fe23e8ac0c2e1ac150ede85308e8225f1c023aa17ab78a180515d43a98f24afb0e8a2d75db5ad0d50313caaa753890760c8854ebe4b287220fe91c1944ed651754f354b90355e37b79a3640a8c600d941ea9d193017794c5565fce6b4f644cd2b246fd27fe3237db24ce4a18c099a32964b2a34a142b2230e8c5881204e2c95c7a2fdeb02845369fc3cc573f188d7e5595c559380d141a8c10b5efb3131e63014cc7b9e542053d3cc6df8176ad7e0d45fa151fae008cd87e805a08795fe73796cc6b0512b3d98fa206cccd68553fb5088cb15288c6db10ab9b36eb6e869592bde9cb1c84cdbbf330a33e913c12858c188aa7a5e210eb6463e54e0966f96027a799e373da6c6479bef60e8f1162812c7350daf2c522a11ad75762d42e6f10bb93fdbf8ee724c11dfe0fea9f9a3f0810f2f8440e9110c1f213c7a5488c5d3720dad30b7c6a0c6b9bdbb3eebfab34fa894114678c70466659d16f424aab99526353fb06796f92e640ee7eddb2f958c5b5966ae0f3ae849550a4ff7a15720d8e21bc1361326bf6a81b951e5154fd2d863d5ffaa97a16c80905084a110bea2d09b405f3fbc09c10dfcc6335977816fe8ecd57fc9ea8bfa07b772543290ac22be134ff30b94e255b5b7bcf49ed5b6bac609725b13e62975022276a7a464107bf215094f40e34e4318a48f685202796aedb25345fd7c04bab9d000d19a7fa80b45099af184201d004e7bd540c62925043ea1f46f2089a8c5166ef403ecdfac670f8937aa196be92d6242725aeae672f3f1895c5145fc299f299f36129d58047599df202d7a34f493e78d8f5693e23875d4836498ff0fe6309896f1f5420642386711b65cd04b95b1770bb4c85d767e5ada64aa09b88cdd810087997f7e4d6b204e41e5f09255c5cd8e6819cc39c1e17159192c87ab6d07abe589d8f084a0d9267c4fdc4813424e90db509a61fd84059e5d47c8216c2727ba64ac9aa8a38ec0563ac0635902e32049ad892c42f91b95c47cccda2683994f9fe22d8ddd38d84c57f51bf4e0ba3cdf77da20a4ffe228f89234806634388fa47795bcaba317b38990e66f36026b88a969eb2d377245d818cc5fd0210f88594df7417087503dda2029bfa9550777ea36adcc4625872dfe2e9a20b7317dd3c650d924df99ba62a04d3f7a081983fcb71958b6c26e582c642b938cdc9457a384292d98bf11a5a5ee101909b746efe2761a68f9039836065624fa1ccb0ef430f08f25c1ddffa6682848189d5678ad81bdf8a264d05d99ce7ec0554003e1e35f405b02673f26afcb81f58b3a6f801687c0ea1ebd82bb2b0d4267d5b5b6f5dff37e49356ba9c039861e415beb5a42f930cd6b0f421968fec85bde30837804efbd0bde87b9e26005a0e740c78034b38d0274005be0316261c52dba97acc90c8d5df4461b614c6ef7c8000154a43efb053fb498e82b2501c250f4f941425b13b1a1adfd612fba5dfe1f6410ee01953769b2fc62f79ca9e89f9f5ad1fa4a7d5c6587c7e6c9f4413f5aba33df3b9df28d049d0c2e6e316cfa771d4cd9ea7eeb92bd9ee5e916a91eb02a6ba3708e1841fcad39a3789b6eb03cee5577d04cc3ebb71abd656f7014130dc1cc3076757d05ac12fc89cec001c1ecdba33b71491a768577f5f614608e04ba9567771561d19ac109bc6a1955ee99608ea54563c8bbb3db41c659de85babc007100278a3f43363cd206b0c578bd30731207186cfa863310337c017f1f925161a79ab552ec4d5718985054d990f8b104903b0caec481c5c971be65b5990e62ef4ab1a1180cf48e783489c24e2b7906f9904ea052d88212c0d864218e57e6f101223437d16b0601e4718c47a855c465cec67ccaf250a298af4d5ab5c3c85dd843489894f9fb921c0d75d48217e383da83ff29c015f36f9b3b71acb7ec87d9f11765c9c80b1300297b0d6432b704ebe15f02845f9cbbc8c4ade45b1ac97f2db27f7f06cf938ffccb65f2eea0bca97a98f0f7422e736508b99856648bc6118492a24c10dfc8fc4f36a95fd47d21fdd73941dec3ce2efe40cba4cd6403539f070722217ce91cc3353761c19baf44123f2250669be6d8edf265d46b998a11cd58ed0962c41a24ac5b08fd361a952b405060d9cfc39d0a5e23eeddf268c00db6ddd454072c20dfd0e0c715f06dbe814812e00c0c0b13b9bdef85725ebea0a57c25af158a87ea90350653e8c02b0923550f2209d57eb5fc99d630ea9b2bf379aa086805a61ba1cd0182f2cad8fc4f6c8f605de43958460daae93ad0d48d9838dbb8a0836749ecf48923212550a42884ceb468d4fe053e3f9a3c620744e0becd187e5a900390ac7711fac2e02a605392070814ba7d60e01ff13e9cb0ac77763fa81ef4a3f51456caf82232ba114a9406f9ce5fe093f73795708db67fed45d5748871b4a28ea576f5feb5a228a8bc8775013f9e26761c58cbf13881a861b619ae875cad4b25fbfec7239bae91b9e40d1d36b7748120b1fe5f6ae0c7e86ada5e87397127ce34c4a52d223756f42f51587a19ba0985aa83275fec1f6f132079c949ad834eec4fe46eb53f24f796f2c5afa7ffe36086f0528b1746c7e652e632620b011f47555c38d0ead0178e6ad574b5cf82b870d93162dab15052c67180e86ad44ca0e15e7d820ffcaab69513d8d32c5cae3f8d58d586ca0b15830cca52fee5ecbd3fc7d6879457d0ee274ed59152300149e75854b88b7da91543b291cc486c8a8e082649e721576d006deb32c42040ecfcc153e534204b187dcac79f66a0519dddec1f51245110248666b2c16187b274c2f431527c6a31dfdaedd00b7dc1d5f023ababa1e4553b8c9a221da51f89b25069471ae2170e3ba8a1a971a68f36f9adcdec19641e99d31d022e857058d4d0e9234552b6033ce6d2b817e2fee9166ad2625dbbdd4ae66c19d9c0a2a9721b44324d42d72a98ab62b568a3d169f5f9b74c3af728cafb5f3748eb7c97ac1c2f0f7291278ad8a4e1dd0aa0d7ca583e6b7f63408067ffb897ebda1148886d3a146f1b242c369d5078ca8990081db44e3a15e0988a6e5645573c73a739fa74b0392f6e5f41088fce9747e984619700556d06e2309301a95f205039406f479373cd96b5a75eb5ef92c7bd7b7b9bca17869a391b364691b40ee2a13a714d00c7d2c118959eb5bce3adea49b501a53f5bc5191ea630e87243c1909cc45894f17bd18f89c8b5bc41d4fb568273618572083dcc843d57886bfb3f30f7999ba44846755deaf0c6bf815cadf5cdb2e7b30215cae16ad72d9d88e299df33e6eb6b14a0d5e17b6c56b9c7aa87ffb78616d3e93a26155294aa5c3ea744ebdc7c8d76c83a7cef7ad3ee4bd9dcdb96c4c39097de85257cde3e83a331612fda66fd4749aaf5700f7df741a814eaf897e9ce1cf0ec55b194487551cdd01fba0f0cb6a0d7bb23a853a53638880ed4096720e59d7a05461514368f012b86404dea25bc06fd34acc67c602266a0adbb67438f483fa19fe9f2021e10029a740a7455030c6819bbad7a6bc7a3f9d691c20ec610d745340d93f01810a4943d299b7079d08421b055d295d1905f4a13e90e42d83ef079424715eecc6841afa01dc1f06533d24cab1e359050c7d089d5cd084ad57c043c8bb7048a9f35720297c708eeafa31ecaaab79fd4c2075f6c4826fb33fd557d004d341fe1f93222f2513e2ee7c33b7e60405bd26b367c69f0677039479dd33422f5c46419f0709ca78e034dcc5abfa05a59b67aa03343858edd655254851e0a837d4748ede7aec4e1a48c47e6ad7c0a8dc5140125172b1663e4521ba955a65fd2ed93a068d5f17c16625aebc20fd65c40f50d133ce6f632e984b0573c83820a0fd152a53ee7715f41b74ed4dcd2c837ce58bbbcce7c2a684d7fa56307207f10344bb265747b8072fee3ce51a047272297b3c228254e848858469f854ac140a6b2d89f2729d2a91dd43c7af28ade4bdd85730de16097458e5cdeb2f42e8821f9516559a727a789100a589f5dfbda2387a6df7924dd072836cc01af337223a7ceb72e5f73f89eec8992a642645ba3cecc7f9c4c9863f0dbbf81eec401c0bda0bc090ab09efe437c127e76ef8744d8f76400898b077faa10fe7cb723162d16b01c6467aba1d443c363f1e384a923db166a8dfebe6024e12ae1ce75ccb842455fa8e01823a0bf9850bfa8b0c2cbfd8dc804be9b5dc593e085108a0497a529a2c2840df0ee3024b147186ba301ee83a330e06e4c9d7174b06bb9a12d60291fb5cd9bb906b19e1c6f492ab71f71cc97cd902a51b4f511f251a3990b995ec4a9830fcf871f73ca8e887c9fd0177100fbc94985585f38dcd028e4578a2bede9eec1d1bad433d7cd749c1a28dc4ec455483fb170b514e3f50fa95c8d0e24cd0701c358b890a540e8fae7b8fa1421432b3d77272c0f2098d6eef515a7a065794c769dc4b50b1c7f86fe54ea2323d845e783e8481ed546a85125141388c08adb15e389d30b3051735204d2b24ade3f411c4d048ee8e5b9b1754035fb9e879f35883307796a920ac76cba17b797714f503993a6b0ca539835d8a78a585a5e5a3d4951dcca9a580bf10b9056b383b63ca0cdd4668cfc02785b6fc8fc84bf6cf5b6742b0ddf2779e84f8ac274f08780c4da64824a5bf840df421fd181654b72cc309512c098d6707aa797cf35dee51244a1d7f552557447bcc6f0bb4fe46674c34c55a3d6c9395859a843fb43c8c77465bb6c3199a9748c13bf968136ca1e5e6fcdca282ef61d1f6b4272a6dd815197c99c288e3b289fb5528438c1da5b9d8eeec32224ed4e5c47a832b55bdd0f035daf2a155407a2935b727fcfa02119877fff32d909f7e3dd7c399257710706e709d9698946bd85c8a5ec75554a86144bcd6f7c9251a21c8980f495852d6413e0506c40c38175b78211f4ef90d8283d971311fea966bb351a8b2b306cfaa34ddffec3b0de14c975f6d3c5de74783fa48d38f2bbab51819f89edc2232a6b2b6f1602556d4273adccebb78d30ed0d29d5a31302bf5665a6e23fb2e9203f8937efa99dc5e8aa5f91145f6b84b4989d051e6a90398d4b3e7240689a374446f2c3e1b3c1f27466cf0d127cce866416734d036355b7611500febad7443f06d6d3e2edc6f9e16d6d50ac4895d21f06a050e29487a120ab219fe15f9abb57fb40e154203536e8fb18bf03273a25982630780d2ab9486742011683d7c560d6cf200a5b6ce94398955050358f7e115423d483055f7598a83eeb2aab8d2f5cae763edf2e655bde7b7ed9b1a9461f5912899adc41edeb398cabc0d4c5c4f1decad95505600bbee15f82a2b743640cf57165b7cd39a449d3be9d69b204db7820d551eda905924d10dd4c55f46a3a809222d2bd30310d277e963ccbe51a1d7848172e814ee8eeffbc39b3dd0c284196b5c57dc9da79096b2609b99b77253e9c5d0f4896597e3a2cdaa97de6dd54aa15cfc12cc9f4ef851b45fead06d0ac961a4efacd9745b1d35a5a2478f0af7557103f66f827ae21ce510bcd89ddf5fad0fc387e06c76a4f39f1bea39d96df63c06347519f11f0ea9ecbc5281d49381ab521d4530dd8b7eef3a175576ad87b6c3570f044dbb9405910721f0ad08abefdb0d250da6ed347dce0f55285e7cbed58b9088d2d93a168c53b18aff7d81d31a37f4dbb4da11034f840e9ecb2e2c11a1279992f884971cb565c74268f981f4de5724e356bc83c8329fe7f82fd2ab6d835c939c3b30c70fc5ae78a702787671abbc33b0f2aff006b4ee2187d6de57b82ade01f1fd0dc53368ef024f01825a0a66959b886e66c2037a45e0494411b68b72be19264658433f52698dd8a2e5e108eb964fa4db6b3228e14d1e5c725b976961c0552c03f17033a864c99a597c498897aeeddf8b25056bf0614b4892f65567a961ff7be629c3259a6ec396935b62953e4a802e0a19dbee1ae15324809edf3e754fb70a39e476edfa1be889739ad6647946105077bb0608a8fdbf923ac9153b41f1a44fdb5929da7641a0b6fcddaef1147a991d0c5f52cbb30cf833a78eb67d102653df169c698ce95571aa7f6471a4f9869db669bb994fb80de7846d051eeee532b21ad3a6a90052286085fd91a76939c18248f4646fd7bce8a8ead8e630fe11fe5339cefbdb1fff2e5e1fb6bab1aa0c57a64c20ed0fb1375589b1269d1c61b74a8f1b9c7144734218c482bf9236c51202ffd6188a880033c14b33437c645f938d126609c1240f69a967e2da471496e0bd9600d12d41afda59413932270374e2f7acb78f6a7ce324374a582470f957beb1c5f91b17de374bdfb8d06a3bce0d5a71aa2a2e9fb011819485c087f0afb6e5ef7151406d365e86cc99d83b3baa13e4f03584025e5bacbdd9984e4ac6f70f091697a673afc7aa2b00c41f0d63dd4994831e037e6d115c5ef5d905992c974dddb8dbb987ed8e52e842c8a106019f210f274066b830b8dcb0310169f1930c79b62ddc817360d567d549da0111f508e658066d7a6711124c65eb55748ff48b6ff2a172a14655f9830920a2ad1d3d74b3f06eb959a2f89ff640ffcc6d066cb1f76d8a765c86774cc1e8a4cf5f9499ff500d619d96b5bc28bddea90db4798c25e3269d3146ae23f49f733094ccbbc96159cd4da26ea4cc7596d4822dba20ff4fd8bbd9c7462ed53f9c761f251a02229594c029e0052d2eed33f8287ff6f17f1c375e53e4170526b532614677d10e8196ac1101a049c4388a5a4335716a50d9a9dd80ac9758c666415f3a3fa8d180cfc3644336da47cf7374771917b360293f88491b5ae3e616b8543216496eae7a54b6c337e570d2d4a1f278e802319334b17f59a29a4148410e7b6ab577b2435335152d570b72adc472640464f6a11471459c9c5e28efb21f2b6753718533c986c6749841ea98620989422dcd139b090570364614cdf4eb5843804b2305e9dbcd969f7a181502d10998946a6a2ef8aaf285633c90e95801fd613c7b972c047341e09e33da9495b313225f916b89066f6d8aba9f1b70df78b36b62621c5ff6d95ad143f03307046b8284cc126fec02038cde12daa05166b56d7898ba0834e5080f5d4f83cc1ee166168e91e4528bd9776276627dd1e0dae85ea291f096109284b1e21160856c6ca9c04905cf4acf101be321a796b00bacc42c9dd0a9003838a426ae0bba3f2d3a68275797b0c66fb0a85657885d0f12256ff98d199a1a4f4542cbeb8e4eb4120d3865e83b846263dccc78890fe0ae905d27b60074ce2dd6cd25fdda777f7ee64c9522f54c06109f5b6a7df9c2fec964648723a5e1923e5d2d9ef0876599ed40f89a3f1b09094aa6cea4c550558321d2241b3933022b83e65baa5cf0de5a8f1b2424b71ab9b22c030bd9857ad73671fa486a6f9fb93270577012736b06452a2fa42b6b123f71b2b073a8c461442e2a6e77709897de0d5920e00fbad92075797454beba8669b9fc262c076d2266029e9a9061a682cb592e8920fed70445ab5c989134556e9d406f91d540c719252dabd38a7a8b7a2c8e1ff1ad9446a8300688109398c9c0798e13707244730ab564daa9b24a0c96aa89f48663499877069a53c1b6fe8a256cf46f1385d338d0ea615fe76d97f1953581664b34a5b8c5326535eef947fc66e1d266c5ab9319d0649ec1e70fbf911878222bb74bf9f520c4a3f7a4a35162d49a6c93c2aa24ca267d6d1c014fde964ce857cf3ad81f9647cacfc8566680305df39e5b6a8bee9b757edca26092340397bb9a1bc078968d8f6b05be286c2d304f498752edc5115003dbaef86ed9f104334badb71aefaaf38c72a9d3712c5e60e403d90ce352ccd1c9c073b454414d63455e5442e528733991b91b035c64e72d9c683043341a647a9ca2a6b99efa924980b82d6b83301acd35d0c55af00d64a259de246b107dffcfbecfdce4756bee30c8e7595e50d7cf4c944a2fdc9478ae33ed0c2b4608185eb6274bf892128fdc8185f5d13223bebe289b496f80f07d1081c060c4d8e13f4b91505604717c4afc825ba6085882dccf45546033983d0500385c2d5495d616793529f96409abb696b62347e74fd04437dd7185b42b179159eedba862122518fecf96d5c30ba4ff8ccde85c05c543118c792f68b8c4407aff98e80659290e3c88e4c01f8399308fddae28b8888800b562395a200918322c2e640d747b70c033aa8794b1d4c6f94e1691bbe460baf4bbd0fbeeec6c1238a71231ac3a0b04c9a950fcd8bfcbd99b540f50bf3a71d8e623efdc11a9852bc48beabd88db79160aaa308bfc2c1dd63f4b52650a89d735c666c7677133aa665ea1b750f3df801919c2b8fc46496bfb749381a6ab42b18045d844d2ee51a14eeef652deb0d3c8226ec6241951c1580fece41742dd275af0b25a63b5d31a3a8ef185fa97feb260458c6b6d139f5827a346997b7a0d2c202bc432f4422d0c4811ae3664b032a5769859e968026165e226835b64e8f34aa1e2242fc11469269c253c372961323469f7fe21bae24b0f4a9fd559f01a9094a9ec2158251a324301789321276e91f33274cd4e1d4de7879238bf198f55a6532a666a4cd8f96abb850162fcbe325f8a4bf9c852d7d2cbb9c8c9a5a7fbf34d89451b4e29250ce20a16bf05996c2e0a11d08039a61657ff446e8092b0ae8328bdb0691b8a5eb458849fab087f6873183cf9ab90923b35e55fe2a2399cb331b6f192486ee12e3b4ef82f46c0b2d78e868d0d00929de44f783870e6b01f725e822dca4e35b1f5ff9a290b31e2dea2ee7a28da2f711c7a0421a1f2b8b9f8fde8a23dd472f2dee56e7eb2287acfdc4b27d684542a6d837994294aa5424dd7e8452dc5bbdfc42ccb418bdd5882b0b197b8bb0f331e72765aede909b060a58467fb6adadddf445584008d4e38bf0db9136174e367b50fa98a392db458fe049c87c4b51a1c674ce2d6a7d9068885fa0aa8d017c7e6c4ff5f8403f489dedd7388c6887d37b196905f009a21ff910cc126622834832165259814d5ac84921e93206487f22961652c2c9f927d384264e3ece4545c68a912ba2ec63c20521cd4941d863c3794435dc622779af2ea73dfd40fdb387eb40e246fd5650c5e21f433d8388ca13088b0938d9c2efceaec867e2080c8bc7cd73fb791a03a32ff2be743eeeec2d2d0184d626648abfeb98201c33b362d202bf63898d976452b2855a8ac65a20c9801663410ad19a96b20cfefd46480cf5cfbec0a8474cf0c5c02d4e6d9cde5525f96daea786ba4897e2f1a398a90ea13d2e2a26a9c4ba0317acd9aa48b3417193700d128a3f8eeccf920d64b78d767aa3093716668193333f2aba1f2558dbeba9b95edbf340bf1804bedfa1963fa0e4f364ffa56de32f2659559ad99c480f8ee2165bd4c29404a98977718ec60003a6aff1e78dbc9fa98d9d1111134400df8f442d7bd25c27a1d43d3ded4c37bda4460719331666f4a97dd20db739d28868f624bf444368cbda041975a0130b70f7f1f3851720c76027c608579fa3b70b479546a56db4d4c9a05b806f2a24e765dd86b653057dd61fb32660a95a9dca9b76ed3d56bdd3bc6127133a6498cb14450033cf55c480b94ffcaa23a170a589abfa646810f38a63cc877a28f61cc8c43aea373d62434d9a8a5280d3bda3f4ae8c0c6ad4ec0230a84d19e29a7356ae8ac5e573f1b70dce5aee6ecca434b757663507aff9766fd4c4d53d9ca5aa4368b72fed137742ea5f91a7a82e202a198ab4288aa24fe8ba563ccada3552488b746621d50fe6bdd6c63fed4ce0e66ea4f72cca9e11a2053750e39780bde9917a9263929c166e4ec0ad5c914815557d015e2603e09762463103ec04deb60b58d672609eae5ef494b1f928b91e028fad54f4f3ff9e8dd30a3437d053129f30bc2c90f4a017086fad782006d9dba51f2291056bdd58f64558a4981d74d8cf632d80c91b214400177f4866448892ecde1946db5d64b735a121413590624f2d2cb98d9edd9cd04b4aa43bdaf2f2d10be39d81c0615e820b7cc5d57c9adfd6dfda7e194c35ea61336924963f6d2614bdb3c77745580b53a3b1e754e52a385aa0d9203e091fc7acc5015859449f8420a5f2a4673f630405df4a8eb813f4fe98856a62c7f866027f6ee53c975f16b84b0e49516d50a42d54ed1a250402027b21d3bde0cae47d8b94c54db9d1650a62de7bff17b1acb04bea3df399bf71db2b20f7caef81f273b0a68714faabfef32e04f4b03cb61e66ed36cc3915e42e4563c268dd0206018dd4880e06f6b24443796c9b45c51867e6954d8ef3ebc6e53d15c5f81b3ebb1529b64ff9ba168644418badb881278a2366b694f14c212d6fe0bbef609c5f6939236e3846628b2165fefcd9d26988352a621f3cb84994ba47002bb72db8e91a1f8c20219bde50f1bfee79b4a29c8c894973c273e37bb54ebeeb0152fe18deb86224636be8408884c2c68f2dd4e3dac680a7b6caa2e960bfe7123d36e5a84b27d689b0b569df1affe0b5d87001fc5b1955318dc5b53b52ec43a1a8508519b72a74e850a57f9d08331925fe1d9d09df0b38da32d8a6863fbb4f6ec1f58d56b9f0780b10777437043e926f132f4838b473f8001cb9c7684ffaa7972e48e7b251005fbb7c225ed1238095c65dbfc483a544a72c45285e7a9130d66459bc15647125d5a04ec7f20fe45f85e702caf49dc73e1f827169fb214916a2496a48c60ffc70752bd658355e57e8ab2b3005904b0717284a4261ae6c177a80bfbcf2e6b31d55ea35042f1a0b43b69fe4c15de079a0c18516f4acf94ebd169f1dd7c7962767aa3439fa67bfff68ff521d043f21dd894465c4cf401911d902ac096bcfb8477d27561a00eae9ebe16c0e1b14f2238a97a24254e042fefa24bd400e162e948e4056906c82e31924ebd1e63b941b79548a237997c3e5da71903fbc0fb9d9a6b5f66048771544579aa95f9a794d7d54113f86fe31fd3dbed14f60e72f26343603675fe1bd62626e62de24814e8dfa10ddd1d26e4dd32b166057152552e55cab6720bd1982484af2e920d44d4aa7358c01ae5630b97c7ca54d6145e0a8530b98cdf456362a0de63939d5a83eb38430b8b0875d755a384849312b7a86f80ce58024ba9504e99ac546daa5450cb8da153e7160925a8844eaf02e831fc1cb651d3048b7e0ab05af8c0d506bdd3eb5800602395b5d2f98d2b91e5652d065599932b3c8b6cde829c4d6ab592f911e2ab53f346f6ef39d6ed72e17a3a4e75e1d2cbcab488c94ab51d460924eaf75b4fb88029f03cca92ebb764fcf1fb4d9975d55a581eeac961ddb2f926dd872af75d98643e3e84d69eeefaea08dc3590b5425c618ccf6fa8813bda6a0aba3362cc330e4870a42fa25abc82305648e7c79f0abc390c856d81d829ed4c0a2c46022ed022cf282e8120fe8ca6099719f12a8dd2d2714e0b03b08978143faba24df045c98a344cd015a0965ebc6b5b5b1b867b883076df2b58c7605bf6f73c5ad991edc0f526b6ba211591f7f251d6c3771edc8827d541869f69977fe4dde764904304eac161e004603209d5cad7c0b92317d3cb47e5d88d7db6ee20c900df752d52dd906f63a2abcc355a55c90606a30795104bb165337a0a07342d7f6cbfa5e9f7337896afa156f4ae8d7191ba91e64223a45f80e39081dc6d44193d9c959a87e1eb6e6a9c6001186e97ae7cc71abb8e627a479bd1cb071e6cf43d4ca44ea14f488837ce6f026d477e1ed5251acd1c1cb4fe64651c9d89fe0d17b42651f16a46102f00e36e50715e774e22a686feee72685e56bad2763e444a7aed184f96f53138603bd609e6ab3790732f8dafd455d2ae8931c90898ec25267bdba138cf3086699729ba5daf85d5b4a4902335a11a0e5fd04afe7c4af04e81dfa65b9efdbaf8513aa6f0494483f5c441adc56a0eb7ad5cf4f520b644817fcd397a0450e0cdd8e50e5f3c64e84a0e0199464afe60427b2fd1256d315f38fad3c2a4d89c88ee9255a4bfb34415532a28c77d7983e2619437c05bbb06f6b2c78c68ddd46e519a847a5559168e576a386da689fa506c5f6eaf43713b83d2c38377fe47b288a25bc9b66eecdf58a0e2b8b4395674f1582383cd3f6eda808afe130d914c379eda9365ed5a218ec7b36f850b79d0947e48a1856857f2cf2509c90dca79e97147721a1ace97483924a9a6d561839c9873ae6ca4aed36eb7162169aa3140e03a84442fa59262b1ae9e23b18d7fb36d6bde46e0e805bec81662e6ddd9937f198a8c0e566b05221bbabac0404f341f9e3fdd536105c7406f1b6b729385af0890db7469ba4f60baa68ba333379b97d8f9f890c3fc104be4319906f261dbb5d625e4d3dfeee5e13a108f04c45215022d3cd8d4c4ca6eaab7a343dbcad6bf5ffbab99fd8df16775258e77090cb3f25ded0ddc1d0de7e530f5b15f797906c52cd987d25443d2022bc380e6113371a4b7dec12ae7cb67cb1bc6828b28ca7b5f5009d3155babef6086a602d869d5a8bbee9db8e6a245111f7d79aa2a0d9d0a08f737cda4ac95941b41e1cf96f756eef1bda947bfc171d7b7505d77d4185dbe0a230c37f3df520c8226824a48e6eea61dae109bbf1dcc8bd9f036e9c71af6af155d6d229ff71288edc1fbd4e9db617e079fa26b83599a1903e853889246d7e96b0fae14604f17115f8cfd71779aa6e7aabb8c63f9aa5db95f1e43c50ca0a2b1f18c2755530e180484cea3d94d4d8474902e2f1c49e709f70f979e2ce0b07e2688b7312b22ad03176953c193415f2d59f6c31798287d54ea54693b192b7aefef34577807e30db9167c821561f2a57c7cb4fa49616744f964d3ba64d455c567dd03c615787333c7a4b5d7029acf6919affdfc8ce6af6691028c3c7d3e285908664afbb969de033aa8978204ba4cd982f599ba2acae82196173d1aae83418ce5c192405e7303139ece8a785b77bf3f3e4cd4e99c637f276913db772d80d28df8675b7fac5f0f0bffbf86ac7755cadc9cb0811778e8aa649a1d227c874ea2a5edefd7c14f3ffef5b67302d50091a53d2c528c0089b6824599012b2866582cad97db40896084e5aa09101520c4065ce9d8a2329c49bdbc46344d212726c151ce49d3a5fec4a8bc34be1f37eefa04613c95869bb3e043e64588fb86a6bbf0e458147e1000d2384886e995a9993a743740b9acc70f4b4b4e2e737d88e06fc057a02fe01e481a7f0fb0d21e6527692781fcb3cb11a4d57b98f78db4111b775973037e6532a80142c4308b24401ea633e6a3e08eeaf92638bafa554432b4c1cf0c28113154cf4f5a226dd44638638035de995e10aa6352e6694290c239760c7b2353f1bcb4910b9c182b5a87bb0c0490f8e932f2d8be7a9d94921b9e9cfc92b327288cf64ad385d27280faf27d4989ed4cac2e403f53dae6435e5d1b66e96c82ff91a0a243beee45685182b76b131283ef099bf5cab508738807129253694287c56e2076b1bb7e233b476275ae8dd296d13b2eee5908417bb60101630b66a58f2ddc90d06e1e3730e19880f03538de75f4eaad631e8c1a07d72a6604a1463e90c42f66210e2bd595dbf5e6de1d41fdecbac4d924585b4f401a18b932b6218e608f8a5864d13319aa7e803e9718fbd1a86f7a7e84dc16aefa69180cd75cbe099e465038dc37ec8bc73ef905f568b74594f8f48623cbc822bdf719615ed58cb5758d71100c8819b94998c2fad93c8988faecaa80d318c58b28a9f5aa1bbdb3699df5de8895553b2d748177b604d8fd1501b1d6c5e81737a645ebbd4bd75d77864ef4a6034a0e9e6995308a5dcfb3d6e679ba952b1a37c7ad1626560af5881ea6f7808269606addc5df0ad9d3d3b0c4306d1cc79656b92a83344d1f482ead3017bf8bc1ddc441530fd140ea0e183804d8a7ee8f7835e7906c48e4fd23963541977664700d5f2bfca49aac6dbdceadb52a3efb992ffa21e55ace6c64999d74add8885220569294ea0bd89a3b61c56df0b318ae1a859d1f3ea0b522742aadd55e78791b7e17971202b31b205c55c7e921d728c94630b508a86543762f9141913f4fd7ab2178d9db5f94aef618b85714e054e8258389f9954f06a49d0fe1564053434af3b332199010721ef49f51494b36f927a7ad23a871adff20945b3b94a6eaf46f07094ccdf4f3cf3f4c4be15db1c07aa8573a7b20242065b27159ad863ddbebcc52052c83dd137c9d825e6436dc6b96fd5aead29727a999823145c0f9969704325002163e5d91199e29d002cf2b01d933f767de1a042c6eb480d340a0af600264049cff0c0219f8895d6bd03160592d6073a3bcfe2b6478268af4fd89b8eb9f1b445a0dfd21d7b0aaafe47a4041d2b3c0ebcbb3f82e3e7b2050479efcc20fa7df9180b56ddb1987edea475b66c2ee0307929c3f81cfbe3a16a1d33aad367ea2843707f0aace621b4ee1019abd06dcabf9b527e58ca052032e6c167cf5347c0e23b12aa28d59c88b0909678301930f7d33e1f9fffaf47c830138a16e4305c0a017acb4ad36c795a725072040c7d7eb115b72643e7282471c09e386f4f32f8409d43055d9a6f42f0996217b8f3c2049cd06d1cb637881f93cf6d1ac64d7ebe716ea97e64179d50976b3981c2f8fe8b41b7fa21d4abcbf08f26e934e180b90ee1e8ac8b3eeccd79d036c85fd154021fe9285d16410c199e5bc6c40fb283f60cdd2620310629ae034ccba41e274061b728f1ee85ed0520f93f94ba510b382c0ceea31f2913459bd66053babe9fbc8d68a3c67c93ee7d780ba749ef08c3b67f7ab3c2e5a94765ed73339c6c1d2b1d995e8dc26269fa76b0adffc8909701bf45a58b56ec03fb0915afe68a1658c3c8e4406ca14b74e4b3d795f39691b8a39cc91d25ca68b6e735463f614a15f1ee571bb720ed2706f28d392a0d97fa10043480c82049638b05223434f544efd526696641c9996d4ec684c36526ab36b80b05ae41f2b1119eef3405d8ea926d2383e01260cc15744154f89eeb12b1672943a6bb56f85a4f0ff07b222a01160a560de89780470840c57178c2c6b808ed35469bd08f91d1921dce0ac21dfa64e34b407acc94af2ce91b6234c5a80d1b36f9a7b52a8fb6ec510355209d2f76004476cfe936326c8df60690763e73bd51eafaa6eef0e2404e2858453763aa0aa8f8823caaae42d979ae3c2c6dedd63e62e8fe72c197a251f08ae379daf3b0f45049328c5a64ee413e1b1e0fff811bc14f039a2f41560b13b9b831525c18fca78cd92fbff5d57037297a81681e88c5317db147440a8d60972b9d0a5ac6b75c00bb41174221d5a51bb1c8aa2d6142a9122f3b439749f5f1d2c8643301da93bfdad39516969ce95693df14708acf091225d10a51f4056221d234cdf226eefc0dad9ce79304020f6e5c8f3e5cd477ec4a336c769d8ac58b0e2c86f075790df2a7ad1a48aa38487b0c5746a86824fd1b7e262245ebd8177c0067793548b2654af5425e82934102e861de55abdcaa780e0c8650697be86b7e4ea516013c96cdcdb0b88fbd035aadfa6cc474410b9f88f98b8bb9f5b6c1b8d3c2a062ef1886340af4809fb83fc3dee13d995ecf8ab1224d169f8a9d54fcff1792d772587aaafca9a8754074fe53710ea903af1de323d8fb358d502b1dffa8c615b7a9744e333a5a07252e2e7b0353332d158142224332ea227bbf49ed846a258efeb0207a785f5a81d32fa27168c94ab638d09cffa5867b977ccd36464756c3151f7adb56a04f3e967f3f3171bc71d5c4db97051ec9335eaafbf5b2bdab78c141c4820357a91ce2010afa03a0b05f56bb6c79887221182cabcd7cebe1fa4ae45248f181c333f2d60dd0a2c06165aca8732035092a517f0ec16f5886626cdfaa6855f23af0173de8f3ccd9636fd8aa6c62b1e1c96f6113ce6de9617784b66f34cadda7c91bd8e0a1436f0284758487de0e52f3729d7d05105e6fb20081de596221d6de9d843833fa21ab8c9dbb7232a19679636934d513c47ff25727f328a41eaf80a64e0d9a11cabcc46971fef1e51f310e285ed1c6ee6000765a149ec59191ce4368ba775d04efd762bf46bfe4e103f52c1c743182847a48febf739f42230b32d84734278c937745bda46055940ce3ac0a7b78c09066f168efaa7a806677207c8d47339e291c3f071068643a0c32ad2783bf8125b0af5529110e7813a314e240d6365459c31651b45a8a77d5afc0e3a31de850bd16a7478fbb396ef83900128573046316c37e7c083ac4d31ca86fca62d429fec672e86bec731743c1f3903b7d10aa316c144d48025ba9c10f86133e2a7dade45a2091054861176be909f7d596d54b65df8dcfeb6603bc4d8335b2d0f519383609bf2e420ff9bda34b8ab1644156e461b31aaa9e5b1e393674be6751e4279de9102a82da7bee3277d9009b6dbba74b3aada69baf66a22c4944be1431f4b6487a453eec3488904d91553e8b546ec0b7a1aa74dd202215c7daccaf8684430c03ce4d502e09c41970c87f34a55f462ab8bb35c68655c5264919b17c60c45f1c82d336edac2f6bd736b8538af04efb9644324da5eddfc21b5ff0a4c979e48760b5bca0cba702c648225b5cab550eab8f7c38487ef9c52ea90d05eb02371ac47be540a87111ab316f549c15e6a1b79a5f7b7d85ef0a7151737def4aaaa3d4be83bbff372e5487bbbc9e6d67715e353ea36608f23ab95c10c8bb40dfb68a8c1fd6a2303722d818d233222c306721d4708f7361a8ff19499714c296d45e17d07d7b57911b0dfd92c527d9712b2e001b960743fdb6789dd71584a5625bc7d2dddf79d9495bacdade3bed37049c3e8efa47229035ee1e79d9ed0b4f68c7a69012faeb27cb71a36d8e2bc82674d0623242faf39551f3ba5565c53d1ec9cda5d2d59ac84ea07d0f2aa21c0c8f9ac8d306b28b861dd6d6801a7d4e62661a9bbf10a32a48c051ce42cdb4953ec3976f45886890c472a8f31dcd7eb54c2dd967a8000209704c820821064939fb14dc3f646de3742cfa39709c838644b509d0762da93950da4378591faf2f7e4c949b693b8a8b875dc709f37e71fbb9905f4e735108e03919f18e174bcce2c935534ee612ca6e04df25e687032df24b8c65c1df69d674f25a935af9cf6f5508bf2d660cda5dc38fa7221211657a6f14a8e1b0a915c3f963b81ed32904dbb97c75e43bea6dbf2111c6b2186ce797d01a7ce7d0414be4064ff3182170908e87f23e3eeb50d844071c54be4132bd3c3bc048f32e7f374337b71bd951cd3cba08e8b52cb5ec2171086b511a5a710b560aa9fce72760d41be2d4860981285cb36328d13d3b5c15a294c84f6a3fb1d06671a26321d3c35a561e229b24b56c1feb8ec4e56c5350075200ec224abc86f0a00c2c730c19bbdcc344bb19352aa243ebfa7ed5a64c2137c56a7f679f2a82145656c6a7b8055b0e074533decd9c8ee10611a4ad64a76aa637ada8e04dcef91ee261190623f64b169e9edecde9f858a32a55971724fa8bfa161775d33f17124393ea56a885f15071b2974082639eb50bcb3e9784cf8facd32243e46959d66d02f1eae70bdc75815221d1854cc2c48b11c5409fce0ed74979c280cba77b1e63186844de3437d6f5344c01af6fde32c6385ab1181144b4f50479ce9cec407cd0811ce10121186503be7699b0b8df07f980d4df6e155f8776578dcd146226261f0c380a87ad9f11bd1b4d62ccf7830dcfe11e2c88d6872289d79489283e9a88e07c716a81b6c43b2a58638960a5f8796161fccb5e8e2bb93112e6339a4056510af45310fc33fb370a10eb81c30c12339eeb891c3fc1b761f67ae8b5c4b3eeff0dee37cedaf1d880a89dcd7c154f23daba3010645e652ecd301e7bcf852be60701e6d38d5548d7cb1c37617293635bd56e516f2c062903a41bea090082749249c6d209c2a5856cd26c23938214e11d3d2e13079ec40cf8013afcd4647e471f8c8661c61bf6502cd97c90e99318777a7935d47ab8b7de365f2b868a5523e15d33e8abc7751a7e43eaca4280919bd1875b6a82abe957308afc2a3c028d36522996ddc22503ddd084b2f5373303254b8af206d0f4186d522c94c41b8d9762670b7def9be28c09063f4ecff3146ad7c1c7eaaabeddbc81e38c972d8c04e8e790ff6eb389f22d1d8f54874162489a6d1e37e715f8194a4cffd3e5543a9be5e5ae394e1f63d3935a73e3820a904ad0b8ba9885eeb8f2647da22979c3e1a641722bd89bd0d94fa3745598007bfa974bbc953068596215527d3f7ddb6ce7439abdd88cbc31d679826822bc738e7666b4923a52bb0004281412364ee01a550cbcd686419970df9dcc224e720f1973f45bc7ab565d01ae2e417c165be9050f2e87a080aec9ad33ec5cd2be2389bbee780410780d4f6e6fe11fce630dcfcb7053c5668761d295574fce754e41e2007da922b8b028aab911c369636f0214e6230e6ee1747bdb2b4c528f1564aeff4c09e8ba960e63b9efea5a0cac46b44945a21ff285737f7b5de45d223c49589baf5ce7c37757a368d66e753400ab656862062b9d0391e33e2f2ea5c95d3d51c55ad5cef724a951d4f182211a42fd11f1ca6490e6e07a2cdb676b7ef297d9aebc2ca42deb75ac492020bc8f0498fd16c9fe15c74875abee09a63c00f11a01034189d7e49fa3e40a8424e7fc8fb86f52f5c5fb07e1b436150f67365215d22465938ee56cbe3c5d0974ddbbb07cf833cffd9a93b0f2c4fb02c2c93867d25f930aff108c519c63d697b55197745451072b7825650a70c9b3919da2b1f54600d19b14f26e0f5704de7b93f050e8e2ade80f16442c8b5d2f5b85e5aa828e4f02f8684939cfdd2686e99db473fa876ee0c1c2057f83e17c5d95e515b8d5cb12783c091a86663d5f4081523e5cdb8ce8f6b88ead81d608e01e83cb07738219014c5a1ced645270b2e5b73375406eaf5a21b4845ceb457541c6864071af80d316ea480058b4bebbccfa5b11788e80f12b20a660de2652a9150d8a2107f89ffb3404796accd6455734fa73442adf2f8c10a2968a32015c2f4bc58d2daa00333552c97d874c6bd5e2d8f10b83f1bb53822d3b34ff2d65ff8553d94a79f4cb737c1004f9e7679e0e68cb35bfab2891805ea28795ca0ebe6c57ccc66f6906eadfa7ad51c832e5e5c62c053ec03bf0e5653efdd221a1376012f9a5c43c6b4c169f33dd1111020fda1bdf95edb1f4e530b24ddfb16872c0f59c18457372d4db420765196ec08485ff05646a0e8a1d9eb0995e5e79b259d278756f3d56d627cfeccd58c630938845e561375e6cfef08f69284e870b3cb678ec92e2957e06d4c0e55e7a1b9b4fb060e598db84bf00b13e2406014d7d2737a9118406f9e73eac6de796d9e91d5b24f68d5653dc7e5bde258c73820251cdbe4bd6bf869ab370dff1b03808675d1b36194a1aaf4641a8c4e84ea499f5299edd98a8d386c8f02025882d7ffeeeba65bf28ea93452f020ae929cf6fbba58b79b0fec371bbe7ed9f15069eaaa86bc023bbf9655c660dae58740a39a5423051b2c29a35529363f970342cf1aa0b042e4e6168f945f0a1cfd4100c275f7dafe1847c5e12151cbc9224c2718619509b2a54c560ca216e8b495836b37bc6ac2a56289e3d1f2c78322159a049d7e6844019636eb433ce6128c7968d9c2f187e8308d25a042017bf1204fc5e0d783195df91f89dc2f84bac4d5818ed3e7be8efa42f4dc831e13bb75bd5d0a35a3efc495f3da2106f43431fb58aeb46d34e261132c3195e16d626b4e7f8e7c88665b17edd24db10d1a662c3205d6992c7d925d5af3d705c75bdd0380a713106788177b52e67a1ab9f9ebec33d3aff83a64fa6f8e04dfaa1f59c863c90d42a41ad83f9f18274b4b60aa9876f28228cd81e5264ce8242dbbb6730f8ccb76ed9e02913d3a419e12a108b204eb8a755f2fd4bf30705478e8d327424e8131fa0816c85bf75f0eb7c556a6cb0502cbb1b25e348ba8bcd76438efb927ef0e07909f7a0e2ea36de0406a2e1c34bef19dee3a2b7abf57594441702d7fbaf6bad6c1a3f5185434848002a63d8d7efd9f9f8b9ad427f314870f7faf215f7794fbadb1b1303bb9d41d12e529171509ae653dd536d76097cdddf544521e053a9ec077d1d2eb9ff343cbf51034c8c7896cafb34bc5b3f22ed077dd7c629131de4454733576c82e171bef73b2f40a6990211a5a670bc335e8bb53cfb5475524f7a52da1f2806c3fa90475edf7879180689effd4dbd2d3a73eb416ebd3cd39453caec33017708cc3f064fdcb622ac10583810b49a82d1a25e10a2d3189c08ff694eab2904cc368782d07bd6773424f01a18f743c972b31987a34f0e4a96bb5539c8075c4f3b1ba6f7363c351f84e7cb511ecfa0689485699bfc62f8cd7e63a7fef8382b2a1b41158594794a4e252ab83380aa7163dafa9d33fd46e950dd6b610ed892dc77c2db502106db3b123c39314247aaa0db9354153b3a54b2d5688279db99e316f1357fcfe0e39ad9ea0dfe83e18ba5d2fdbac4b118719a4f86d075a43a8e4e1f7b71e2e317037d22867acda3c87fd99f14e9876d81cabdb73025651856fb98ae089518cbeb7753110740bc8b6111336f9bd883834d010230bfb822b774d9876e22b547e2164a725f2c05a6a9ad91b5fcd1607afb69ac2696b1a24bdfc71ac9b532cf07b28ee2b86d840ef22c8c6eb0081297c96e256c4bd22aeb566430195450e59411b7d9234ad6ac3a7e093be319c92531fc9aea3a3a930cac187b52c07c156831c84153b0741f861845546bda23a90d73b12bf20c53f10075eca5dd088c9187f19503748550109e58e917c1bd19550f14bc3b506848e140891cf1f6ffac25f570361e25f535b280f406911453440d09615c104b9a931e78933b075836aa01ca3f5d57df705f12c887a23e4ee78e295135ad6e1036163388fcd1dc72dd260ffee3b2c175140e0120f588ac2bcf280d433aa9252503e227a9c4565e0541711482c97e2efff329fddef6a6b695dc4faf620c5b55ac03b5cb3843e04e53ed36de982884f4a6c43cc7e22ad63ed2e5710d6f878c0302dd0b279a7c3dac604e2827cc5030c584288f23e883d4063bc83497c4cd99540e3f9155b6b534cd42c998349304c1e56b8fea049a620b3b8b930d778c9136cee96a11bc7a811ff7ed81b4c62f622b39f7cd1989b05bed4f8a1e5a421463c5ee168302e6030372bb0f96ecb24264be2c35ba686fc17d52844eaee222272823360756b85263320b1597e88a11dd67c45b648fb254417342c884167333f3728dd2ee293f7830398c7d50b63a6810b9c61647f95801682b09c91377096c32c92dd0626d6cbf65bc41abf5061847585c57e21218c8fd24814d0b8f56e8e2c8cc0c8fd01f76ebdc963a489c5c4e35dae746603f12e58b906ccbdfc6b0ffd7c387539044c5f2db140971d43ce75d330603c4b745ee9d6d0fe98f46240b11349ef811aac12c8e2d9268c7e5a25533b7efb53c27d7016509e57e59f512b4511e896315697c0018052a772115ce3b18161bee04b9e5d33628d7fa613bbf0bf090017acc3786def8607acb5ba8f657d263e4b20a74628de66d080456556a978cb13a83495080f6936baad5d0f3b936395d7e65c654a12279dff590de58c075392a34d2e07c49ef1fe73409e8f52e04e668cb1af724e1a68d4f3c79c4fef93d1cd2e2cfc09d2cab84a9d6f0c22d000297966806bcff83df6ff0b327e86d9934ee51ee0dda733d6f2262f3bd6cad810883f548af71b888aa1e69ff5d740079b268b69891d4550e82a55f2ae96f6f3344fcabef1873302c6458ee6fa81a02cf57bdfd19553da5da5dc05724b185a0d416ad222db4b0e596b90eb934a8d53c6d4437f8143b3b3d7b2da162b48e05f143483721fdd85db129ee7424a7c91ecfe3309443fdfb9e4bfd25a5414f4efe4e38254fe50a56e299e4044ef1fdb1269d10454dd496fcc1ff95875e2e7b20959729395dcb1e5a6edaf2fab5c5f059d48529cd24782e214d4e9ddf9b8d6b883f3da588e837b0a0fefb7741c8d36e49a7c640aa90279888a5ceaee1d6b2354d3dd5923a7e83ebc66f563406c796e897c2ac09a318682b59cd5256c64081c99d656f2618ec8db57553b29aaafc4143a5c74bfd7dd5309d07222c38131539bf20b0525098289fe0d586b24d0180e3693586e202c5ad46571c05b4b3f2bca52f1916a12afe202dc2a3a6a03715050bd510dcc3781439ef4b411e2bad5eb404393e1ece93237fb1b81497988425485c8c8d15b3a130d00f5e9abed12a25c68ebf6d7aa47a75cedf7851386f275a1dde6b198b3a9b97788b45d284915694e091d5f85830763041a09405c2a77b64305a9dd26d8bb3a436dee651c17edd454da00669f73d213020c9a21e8e67bdda8d808d41ea557ddd1d987214d6dc4c52f81df6e0a57748a1d3f9cc8d842cf66dbb496c024a70ca44d4abf48a99468521ac1df18b7d093adf33f26fef30aa6d677026089b7a9be69c9c7d67d40b975830913c8b9769495f81c17ebdcac13a052762aa044f093564a13c84e840811134ab948b58bf47613e113cd6c96569090cb59abddc312bda55fb196924c2269c8a83dc2e61ee88787b0990bcddd99a9026847c0919540fdd5007a102fba73582211e0e1795900ef3ebceab40d39ae987a157cd01709b9d44bcf1bdb0b4a7239dbad1e8f80dd14601c23af860ba128373bff421af4d303fafdfe9b5b30ccba9a0e0d028d018305748966b1e52dc6f6c32f6fa5dd5ec06bbf301230e46ca3002d70002f9c5e16b056f672d787995f5ab0f195304f11f4cbff8b2a532f24faa40bf14c7782a4e298e868c26da445ecde6d4deebd654a5206ef09da098c094a4eab535b84d307108d06f4c5cd796a9d92c2822a9f2c999030811258f46fa356008891029b30468861b6983a22bf921564bc903b969b0c2a613e90a76d0d9b09a4650fd54b2ae4f4a552cd9bd3575f2a95e7a9542a0f648e5b759c1ce3d55b9041019d938c137280e2f6041848ac9043981a1634726842859212454d5d34018d5e3e806834908998134430c6983052425863872c29b01d692104b782282a3fd8084203025fe018533a7414190a45940d94c2fd56551994404988274e30528a4102436071020c1ec0ac6104c705153954aa2c99c600a372518d4295ec6130ff5161212e6f55a5526158374541870f8a2e92762a6c5e9025d31353636c91471a140aeccfa33c3ffcc20f02a71db2f3423a022d9a164deb4e0083f0841ddb89fb27da157f2b326a9feec9fc9f32ea67d63cf3594f935972088d5dfffa59336bac344febefff844e4f64fa8a8eeaa916e3361fbaad56abd5c2d2e24e183bb692953cbf95dac7d54badc50231eceb5d4f33b2afdc4ab3954697caf2736eace6652f73ecc66afec6d3fc3756f3392f33be319a8fbdcc37f863377848e79bff099d1e8085deb8e431884a8a2bc46429aec89247b925cf394a2f378f31c64fa4337e7d2fed4861c776dad23e17e318cde3bcccae77e1180d1e62e369f6b1c1b1d7bb7ee6197bede0767aea2d5d8274b1edf3ad1b73bdcdcb6c6fcc75f333d7dc9c161e676efdab6a0d0abceeedd72875e172fdceffcebbac4bcaf9aee7c220d7cca7f53b4fc3a09d76f21f9ae4998fb1c5637d3d0dbe7884d5e02d584cc82fdaeb8e3601ae6ffddf5811178e15f923f4ff658e408bd3e57a3d8d7dbdbee65d2e97cbe57ad17ccd45524276bd90ccec8aa2b9b2c52723417cd0ac5899475a0bc72495525a7889b2a208266458438817b6ac1125e50485141e53249ddb4f3a5766191269271c1c22b04514583c094104972b0318030c147068e106c60f39376457d0b0288374830a698c60060730717201044098d04215b51905155fac00e5648d298a6ad3042ebc90c60742d0e5888adafc980d1c9ca62556906e52419071d244071656b0431630626c01634b6d3e6d3ed07cd8ed9bdb5b6ec3ccb09fdb2947cd40d4d46508159ab060c1114954a182db972348509b4f03eabe581a3c2ec934efbae36757cdabe655f3aac1a3eb5bffc2a3eb5d6f5f88d35cd6f7bb8ab2fc69593f5958fe3c9a5190a824b5686592e9a126b76f5d04cabc9a5df65bb30c8974a6c1b470a241793bf9ced42982c1682c4a0370c2184064f7ef02c0644a5191fd8a3a851d659e5f6098f0806102834686791555b2cb5073773196a8205839cfedf93570ce4b761b5ed9ddddadffc89ac77c5146f1b4228faf308a78c238420ca3598d3e39a32d204dd89166ee779c6cff069f9c8daf3a25fec4be4a1fffb9f1f35f12267f6cfcc87e4ea7272044d899818e729dc1284ba619886480ca5449fc5a95403c33ce853d174efccddc990f6f6c83d07ef84b32d1100d0476cad573abfb01ceeb7c771580f33acfdd0f72fe679800d75b6cdfefcd150a400c5d926a376fe3c6b8d88dfd7d23b1bfcffdb5f1180be5bc8d17c2f9d82fa9e1b831eef1cb5a8eabf3f73df8c75849ceffdf7f25389f3759e9109f4bfa6e0861e7d07b5dd83c8d53520f35acbf4b394d423292923fdca97d5a7f3dcf136517ff4895308e19c12f5b52eb9f2f9af97acd17cd9c73ced0880935d9cbd0087e1916ba8febede78b66bef090ce2f2ab593d4e4849617cdbcd23e23cd1a9c0f73ce79efa54ece239da7004a76e7672ffb1c5fc5088ebf3105dc97bd91fb32a16be47e0e2c54310e58c5f91196f3a3b8f338efc1ec735e861d0cedfcecfe7cd57fb21ba3f91c2f6bf7c668704c01f771bc07b2cf8171e0da27bb45f3b19ad7d3a9f6193d89a6a686e6a992967ebae509ca4bfbc8a626a2e897f6914e4c96723f95a2626a5e34496ea57db828b969689ec8cc344a725ef6f72ac9f13870fe7e03725e56c548ceab1ec75582f3177f3857e773eebf7895fce7bc8eabf338ef4e232c07d9e0fc073a8f833ff8cfc137ffa9b179864024bbf8735c9dc771ffe6e6e63cbeb2d7b939fe2f8eb71a5892c36fddd806df0e445fc3f91d707009367cb0d5dcd602e85f92bf5f92279125397c21dda4c5ee11831ddd3694c1bfb939515b7250c2a996f3301c3382f33aaf83851c0628359c0f7270ccc80d01d618c152ede697d40ed053f24c8ec701012b996640c2f9d9532d82e19519e7fe48a206dea692ab4b29e5b842558ce83c0e2c2484bf4aac039c5f80ace1609c57f27f731ee775fee6bf1be35ee62eafeed853f211d5af1e06a38d72c9be08a4e454910865cfa392a7ac423225cbb048f73057df53abdb37c2b0f355131f517d53c94754df522df694ac9252e1966a9fa692a9e49e6a1f224c16e8281f6529d5a2ce2541832b9d07070a97528249921454be18411628e41451702104173e2cad5082ffd7f9518a69c21fc8a58b7130084f493c7b80a3a48a919c9fbd92fb3baf24e7673838e6018eac3fe74ea250aa0a1545187123d2a413c5ceac01ff396f44e7af0e8e4d0fe7cc7e496d07bfce4dce3399b59c5782f1bcf22200394f4fa3db35fc23d06c07cfa52b51dce8e0f9e43c7df3aff34a6ef08c729efeff713ee55c9c8395c85e07c7e6ebbcac7dceebe8bc9298f7f797d472725ed63cd0f9bf6fe4ffc6fe71c546feef5f2c64e31f53251d9dcf790f743ee73fe795c4eacbda7d1d9df720e7f163ace471ace21d6e5ed6f0e7fccb5a8e9806c8c6766a227cfb76895c30d891de3eba8de43cfd3a384cae186cce375572cab95a6a5f917b4beeb678018b30f27c3a67771b4bb760bf9f3ad127aa4497fa4e1ab24431aac1ee8f246a323482f3b217d29f8d4b65f429f7dfa04a5f727fecdeb8b226bbd26f0754c979fa71dec695351c2ff6f3e852d4e63f4b8ce862040a4e20254502236afd94c87f44e8c10a0f4f539ac8e103b57e97ea77314a384eaccd235552923f324b951c949062041356bca8fd2c293a230b29501c792933821a005eb62c774a702da9e91d377cdfbf8ec74cb0a1869cb538dd1b48f7ecd9c3dda94f15151fc7715ccb2d0f0692e3b8ce390bfb96e82366b3f36d94f1feceeb3ae7835266693d81d8af1c4df64cdaea8bef6e1fdd95cb9f83f2e79c94ebbcea3d2bd77955e53d555e5d79cf9563f1cd9a9652faa093bb22a59476aa6eb499524ad97d47dc55d5d7792a6c931bdb6fe53de58a9b5179417cdf4d193bbbeeee6eef06d23f4a29657b4fd64d19e975498c19c3513aeb9c9ceca1d40372cc9c63e61c33e79c738c1441d4eb3ee068401214b9ae9dfc91a910ed3aaffdbb04cbd1ceaa8685b2474ba8cc1ac265c7a057bdaaa60520d85aadb08fe6e91eb975e4d6c9fde34d6e1f1f5ef9c03e7e08977df8f066d4a84678296326052f52455eb6a85b3c91c0cb0928980a2ea13282fa8800ebd18a87192f49e5054a47c353f522c38a23f2bc1085b4480d4f1dad7a31c1731f40341a50086cce23eb1667ac8a8040cc1662a88ad080b485166111a3a330029d50163e0c6120c5cec780093b7b88b1b3fb895243e5a63dd34d7df61973cef9cd963de3b8c709763e0c9f9cf9cdbd9d28194549c27225cb13242b57941ab40d7577b70717256cb549c5135ed86a40d2b0b4256c51fbcc26b434c6d924fbc7e6cbdc11f09f97e4a12fabb4b079a5eca1f4813c59aa82238e4cc08073c106e91f09449fc29ed2aad8fe1e4e68327d10aabbb3e1a353054954a154f3aeac7d3fadc2edf6a47de4b462cb94fe2cca741e65fa848852fadc740eda879a91a9bb3bcdc98e93289340fa4c13a448a90f1fb55a0b83fd4b274abf32a4946a3d86b08e652d02110502a55acd16225580e4a15f85a845a65e64fa2350ee40f6d0efd165944e533080e28111654aa986c114599bf8d522b5487694654a33c1fa74eaeeb658d2e001fd3371509a40fbc84cf424b7cc1b3d9a1aa70de7710ecd263e8db4cf287265e4fe4904063b8ad9df896d423e91479a690559e3ccb27a5dad82ca0a04449b4060d809c394562b69e71c95947377774b2975aebd59dddd9d454695bf58aa427cb6746fafebe64ae094e36804b89f533e810f0444a389a277de2c03fe33f3fde1159eb9e1ed3ec8de775ee7d5650fc7d5afebbacebb8ed2cfa93b27e90cb762518e722cebb6054a792b5463b653aea3924e0982fcf14560028e47db81ff6440425920201a4d14ad0bc98e438add67c07f60307b93ea1870af14bb97381c90e9fbbcf5ad7bf7bce298f732d3affe20aceeab79ac0501840fe456e083207f7cd6bd73ce03c1bb30895f349cf11956dffae7cd592008f2c7a78a9ab2f27b0ae94f8bb837bbbb3b958ae338cec3cf711bd0e69ceb6e767b3dc7da2deb046598ed94f3b8aeeb2cf7b55695ab56bdfa1aacb3aea0b242e0e4038f66cab43e209ec22e6c563f448153b854412c7d47c0aa0f47ab1a9e5c6f0450aa1a50b8e992c45430365c10370f8a4539b072a5a3552942f70144a3012525714c701084185aaf841cf820e53cb2d62961e50008a395cd182fd81b59321141a5a640c40b57980183152b20ac2b4ba6219e88628821a4d858964c43844069081466a6581b30576af84a979c26ec296c3eacbe16495cad58687119d16074040d2afc5413089a72aa145026c30c2298e18cdc7fa39b73725b1c81447777278b4d197e6022fbdb0883bc52c1c5e2b46cc66356c444ee87c97043ee7fb1e886dc0f0b839ad6ee535254616fe4ce96184e90fd6d8c50a974a8b002c847902c373072bfc044ee17bcc050440c3208a9593ac38e75357b260b22b53461ead2c294dc6f612d0c91fbdf490cb95f741295fb692e3091fb8184b8a045eed7e05644ee7f392141c40c8d8e263b647f5718e4b05aa79e827077f72097ede43188052a74b182122cccc04298dc4f6b6a32a40296dc6faba0b48a269a3ec094bb89c8062233723febad955f7c11c49428ca34c1858c095881c61867d420050b30741dd054762e274023bbbbbbfb4c18e474045fb2190f264a35e47e3b3495fb61282c91fb5f04b99b524023f787b427dc79e4f16582d4094a64264519b6e4c9972c514c2f2815711b8205112afc10840d5664a0940b8303f8854174b65eb29a45f6b730133e90fd576190bfb5b4dc6f4577d9ddb4050b162c1b55d8f195e74bfe903988ce1ea6ecb61bb27f0d831c56864beef7ac58c38729730d5b8fdccf59db946ec125694557ee3ff228cbae0696ec6fd568a28c0a1ac8a950d1e405f4e260ca9eb48c0cd99fba572a5f1732b61e263257ea053c7cdc17513df771944a2a25e7fdfcda7937d64d2f0c7f11e69cdfcdcee3beba8fe0d99bf95600495e3d379fabef158f94bbde6305a4ec9978acefcf4d6e5e580590b45d550089943da3ed01fdeb1f5179cf9191b931b20ca9df18c59c54e6c0e46f86436a7dbf9c1859861c174696a1d7557c84fbcabdea5ec073acc81c9778b7fb113c7778e430126f04cf5e75f892bca448290bb4f3ea0f990eb68fbf60b25fa91e04f18b5e41bf97dff7befa562a557daddaa540801a4c2c7591524ac3891024a18615638eb832c413f76589ee091d98101956dfd4921964805060dd8e039428500b942930dacb6015769325d3182acaac5430a6298f522988314c702044836fcc953c8a4e5960d427477368afa3de792a1c9bb356196c7654caa2e82a3e4addbb2bf30c83e6eae7107fafaeba9fafaa9ee76de0b239cab9982d20d4370669d202207f32a09cec3c0b2dcaa7b262ca0b5e30c1654b184c6a258852a30cd1145fd2e8010c1f422cb02034a039268534ccf0af314d49ca50768465c9e464b2d69861192b1fcc92e904619668b984026aa9b7181d5d915b2a0d27f2d85672b7521a47b99d9eda2794dcdfdc1750e40f6fa41e57fc47f5abd5a3505ff5ae07729efe5642b007b188856a1d450ff62d6980ea57ef31ffb0119a57bdbf0a0b55716ce4f52b2cf4fdeb85c0a7f925b525b56f82ab1bf35f398e2980e655efc1eb5758c9f7afef5faf047c9a06acc2577d03667e2554a583efc1da279d27f792f3745f8941594165ca8c239bad06beebab1869fdf7dff7e01bf91ec44255fc85a28c7cefc2421a80f0fd28973e19d512223240cdf520b6c142360f8258c806b7b0110929cc9a8b087c59037f94624059fb8c6c5ec8f542558c7c0fbe50152335ff7d0b0b5531d27a1b2c248485e692eb49080b4d24fcb256f3e3446abd92d8c7b8ff603fcea597b51a1cf35f529b575e5889aafb2535f0556fc4f5ab77e158873b18aaf99bd5b7708c5b526bbdea39dcc190eb5fab9735188e39ee60a8916e6c6a407fb95aff35ebf6158c540025f0c3534c4db6fc02006165ad0a7d59abc201d1e7f0913f925b505cb780f8e46ca4b7dccd28b9a3f306448c5137eae4eebb11d647dfd8464fba3c7317458e3415d8ba97e3289b0c91e9a9eee7172d0d029559e4e58a2db9bb4da2d9755672d7462d76b4ee81baffeec5ee7560dd0d888f3aa5944ae9ce754cac773b476b55823e5b760bdf37a953aee3b8ef2ab9e68204cda2edd392a2bff423b97f7292bb8e81dcaddcb3ad98008d2ff2487bc2d264c98406974aa5085614b430f065842ccc1545c27801ed64420308551132a25ee2ec6541107cc966588463ac4d964c588c5452ec4d964c584cf8c9922909a8261064624e3135e44641ee0e240de1248533748072c3121d9484b051f194c69632bc48010a36c028d159a0a046133d6871041330328d1a76282306086088c1a926848be212450edff5c28a52e90c16b2bfff1c811d41d873e92ee387dc66b4608617f0e5adf0c919f83fbe7efc7e5a413c8184df0fe610c0acfa792f00e623f57a9f24cfd50442f10e445f633d0bd3e691b245892bfdb9b13d0fa02fd99f9872a627a6fc02773a65ae2009637d2aef484b02028e1591b3c7f8802cbfce1e46b2fc310259fe484296b3d60ff105c03c26c92180f555dcedaf07173bdf83bef7b0887cf0fdda174ce63db858b09fc3b4c50f9433c747a413d8750a5b555e1936bcb8225162ba329cb06811308e3835ac7b7145112fbc503b2535d35f04acbe3116d7b4ff72d0628bc07d12cf411c46c2e2f011fa35b3605ffb61cfc223788661d9e2c8fd5bc9cefd8fb0a71cabbdc70a8cf55935c724f7b79360974af6cc85154082d45158dcd3bfdf7d0ed7d5fbdc8d55cadd17d25c1839e70a118152fa37283e72bfe61b36bebb78bc1889976dfc0d3c82671b9800373bf6914f65a35c5f12c0053bf62d279693139392254b96ecdf47fd336d474857fa073f8eecdf5ada473649c1927d4b3fe5c4baa787419d0ff6c68f62a6366c1f398fb70eb287002fd89cef1fe78dddcfb932c7eecc17cbd8eb6decbe6eb663136c9185ef8d5b6466d8d71b828ca295004e2cfdb16f7dbbf1fe5dd446f7fb7f60cee3efdc7bec6162521f8139b7c2be542bac8d9a28cbfa51ccf90e8364df2192a01b3957e77fc8bcb54f2bb598f3feb26f1fd9fb8b3c68eda3f31e2b428f74ec76947b1be9756ee7dcb672e3f695db1de3624cec34ea5981b58171aedf6aae175d7fe237d7a35c5ad4e2acf97567eea316fd6822cddb34a2f177dd8ed2a27febb6bd9dd462781bcbed2cbde4d45b5ae491e7ad7d7a58b11d9774c5bf8ffc1b09a4473a3d0bc3f9ece89441b27f10e75c30229d7ab2bf11f9a37356bdf4e15ea53a00a724d7168dec77a1214cd254122fcc3046cdc96092c5114a3069d2428cda0f3566228f16fddd2f60623b985376b0245f231f7421ed8dc3c1892572a8790b4d652051b65f686aa88172b7979635aba5a9346939d52d1505d5fd1626ab54163a49b9ed156a15885020aa953089e022858c9a7dd615daa142ad049b5bcde22a9c177adf6a81752500b9cbfd19e8ac11feccc7ea8f30580b5505b0fab27e05a50ff873ce5cab25bcd6c96eb148ced36190f7ac0fafee689372bf0a28db3cb284729216d262530c3404b4c4080a18535fd2b0395131cbc0218b2344c082962a3ea0995fd6dafce7a60a0a455e8e5010e28b5ab388d2284201962aa05ca9f5b3a4fa5962fa652882ff91105ed9f1055e79fe7c2092c8d3b2806064d8cf234b2a470b3bb2a47492bc26bcdb5ba5c2b376eeb56255b71aa767b7e38ecbec76cacd0ebcf3654fcf973d939be10429314091c204cada2c9b7408c3841455579f0e5ab88c48d28189e6081d92606189d2a18a0b89231d42e0c2628b10a3c30938464401e30609a7284c378e387a0bd65a2dec6d1aad3403be7ab264ba9285a2c05a2bfd882ad64881ce4e8902e45196058730b97380453901071f723ff72d502a6e88e2862a32a5f6050a1e2191293de2c20640060aa54ca6b549cc0bdf94d2398250a2a020e56abd2c3e391b5b5299764fa9f1c27a6c036e2a51580badd44b7d657e6d94e92c6a91d230cb3fe2b822fadf4dc44c9d32a5b04c7b88fe9cb25e68164a29a594524a6ff41b897edfe8b7110563c12c7bb0604758ee2418ac25e53171b49b194ba051ffceb11e65ac83b1537677f7bc342a9aa478e1ee3f0d832d374139ca7de472662106ca5267517224e769395b0e38616a8713489e811b72bf084040349a28fe2f49a72729a1b8a10f969b8020cab22c9b7ef892c70a5ad8149168808e3cf2955dd9d13aab9453258294f2b997e101243e32bfd28bc7d53bfe5811fade7b388967fa14d6a2f732c3baeedf7b0f1fa1dfe123f489c8bcc22a3c82e78a47c748bc9675dd1ff925b95f84249ee7cb9f6102e8635a5df81a68c9ba061c64d06206fd633b708644e87f9f44651eb5f8a466052a2995d73fb3093164fabb6846ea288aca737f229d5d4a299370d91d08eb3ea5e4ac4fe3729378e28a479848854a8d18367cfbdf3c6a1f245eae5f73c5f3688609607dad565aac1394f8366f4c769452af6f57eb1d4bbd304dad2edcc28e47faab713e61418d11c849b8ec9f81061c78736975679e99c15309a7886e2931e19d9f25830e80b228894ef349696907ca3a2622b37fcc5fe6a9296692e921f730092dde244db4820de2c40651fad97a4eb5d8a212769c524acdd35fabedd105071c68d06273d062cb2c1970d062fb0092861d81e60dc848fb0469318d318857bffab8ad56b7d56d7593aa42ca8b1da794d4a7247bbad8d18752952853a040613150b23d7fb01e088238e679de7b3e3e7a94b16d23c683f55ef55f067a2a652de07f1066699f30c431f08de48e81f841dc418b8d33e4a37b4a4add9bf15e480ff1b2877d64eebf3b4a25e931466bb133e89fb5d86d6ba22935c5f400c3522456db204229bb9295aee9c262a9eda3a59db0c866528bfe4b58da4afbcc2c309b9d8a7f47e99fef275dd4ddc4f38f9c4bde43d9c9649fca8e94fd28bbbb2fb5e8fe1ff80bf1d7c09f56e5abc73dcd07db4b947ec5a385c1dc6699479905606c875396654af5844fce844aa8425fa8842afedf83400e5e1b40b2b0b4a657f524644f45715fe91ac7092dbaf0e2288934841882855a4f11638311514c2b90c18a5a3f0dc82f902f2c8f20fa4366acfef74bea8d5510c716206b30e7a9a5306ba0ac09cd1a888334b1234dd668ed33ced7c092ecefdc07d1ffe6573cc5cc232ab44eeaa5bee2f4c2b43a5358b0455a941dc11cdb002fc9b016fac57edb0febef51c6fa8f6097bf06b9fccd095a00c67a9652fcfcf9dd27e172cc3f04eec6fc4168b1638edff104708ab04f821757940033748218a0d47a490a26508108244800c60b2e6afd19f07e12bc5f88ffb4244f3fced2e5c9fdb6c88e606e2ac42767aa1b30b4b0d53e315051262de34804549cc6dc3b774f42ffcc336cb6265d930d50b9eb26159f94aa8874a6ab6b9da77b554d1796fe2895ba1f6b47828fb0102c9081f691b5d87df749dac7bf7b205ec42e9656023b7e274688ece938d07d35217778b45dd77d0f2745f42f40c28eb2dccd896bfbcca9b472f2c3154d495fe84c6ae20399dc0f26f14c6902e673497cb6099c4a6845e436e7e19ea602cb4932b6e75ee85b5d59fb54b745d042135b2d88cdf60fb50f519489d43edcd744593a6d608b5476d022f71cf7f5c2bc2b8321810591ad46e362398f726395780c01ccdd1be9ee07536cf7a374dae1fbae03fff9f0ac79b8e76ab576e6e1f16759cc9f83ababba42530a193bd86a355c58fad3d671b616b9e77edeb89f46dc4f1bf7330cba40094b84ebc1f63b713f89daa7fb5a9439f924739d55a2ad3a817f1fd709cdbc10f8dfafae50f8abff669a7a9461659e2ea4d084ad165e59c3a08a0930a80156575768f5a194ff7bd6796abc50e9ab5a77e977656dd5b83a79ed4ea4a4b942345ff3af2b64f34293c96d0aa5daeb3f204f56e6d1ccb9603f1fedf3faf9336f3f1b2061cc1ac80ca114a4053bbeb2d7c30c0b6b9f0ec78aacbefbd5bbdefb97eb4a2796c8c1468bb2a3ea6315d682f58478af81e7792fa3f9949ae7b55878068f36c4234cf6380d7829cdfbf925566472df59e67ac710c04cdf5f57d668585260732b7c5c748515e80a546819e2819632a428b394222d428aca10d563d950ce2e92b3e2b7b9c18e3099fc21b57ce90e04411004df0b83c0afaf18befa956bcd849de51445487e6776dd9917648343e8e5d7f73346aeaf37d67a992511efc1efbaaf0b130086335acec8adb0057ad7b2ec0d910dbdcf268544a4b05f965314ddb2f71faba6c32022525830cb298a4290bdff6664f7ccb801dbf22a585faa999957ad9276b5066cba82c99eee3c33d3b52c12b7be71037be8c17b7aa59d7be9799ee75def69e8eedd5711f87a558a04b6f49e1939901dc36c546047ea650f8b3033d873769ee7799d573bcfeb9efbaebe57f1b84476efee54e5c4eb2727e3f00b8664df87ee3fd99e9c60abeeaba85ed5bfc704c5539699083713ae666666663c48f5aa9f6115d21e0ea99ed79a093fd0bb36465f48c4bbf6eb65fd0782deb5cf7d8bdddb3b53c1d620ef09eb85740d084e6103995ca7b0214cf62a1657b3ff5a1dd83e5ca569cd84ae57bd8bc615863315046bc892997527c80aafe77933e18af5aa67751deb59ac7fd5ef595f93114779ec31a537f363f8e36a265c7db382ddccb431868d14fbf24cf8213e20e56ab4d136300705eb4dfbacd0067dbe54b093460d3bda2134bf54b0324fa629b63cdad993bb49a9e7755f04528943f5e949dae0099f9cd1befbc77223a53db28714c700e45e0248c843f6f4e7a060fd471ed9438a5f2658cfd2e984a52cc6e7e0c49c573389486f1576b8c3f7d5f809c47851c001c454217964a6353b96d1f681b5d8af024879e59697c1b9721c7747da51cfb572dc4a35b95891efbbffbe82b6fae5bc1fabd7077d7ac7ade6cfbc0a8bdce489bfff382a7be6043b0ca2b267fe374390ba57779fefde74effe73776f8a4331b8fed93bcdc71492c1fc6f03eee977774a9a55de1c2739ca711404e54bb0822c50b67d3905c04c87218ee49e12919ae19066ea012a8b5932f1b0257f16945376e5b8d58ffea35cb94ad6a0ee7a9e21113926b715b931f7aaffbebac0f6bc9088b4420572cf8543e498d57f211159a64baeff49072708ce4955f4bd5b41aafad5cb6ee6af15367eb160e57fabdc724efa1f05bf2bf3abfbeb91ae010bd083ada91a70100e915c2c698529a1f5a5a585b5590105e1e255c68b0c1a509c5f552d79f9259760130e79ee85f44b494d9800eefb268f158ff3e5759e7bed51af53d5aece3a6b9d138707b20a8ff5fb47ee08f7320bf1a6b5f1eb052b6d1c5521a222860a96febe363480d6a918657732790425d1e7ff010105691f9ff225d37f516e4c1e414a9f52a74ca5521729ff168006eb6190bf9cb4411f56ca2bf30c6d7162f1cdb7a1c18e76aca3c8459962946514f864aeed3376077d326361ff88cb39abac8bb5e5f960779992d2d483972c7f0bee214b7665d9d40310793699c9b2a98728519fec4f067b59b086205b94f847ca3ed99fbde093fdc96e92f2c587a52c9b7cb892479147ff0c55f1be9b7a28cab2a987a13c1a20f75b9065130f4f798641ddf4eb7df3f40eb5de2adccb5034c272f86562ee70dd09c2723fc2ccfe230c3631edbad1f8888cf28ffc854f435abb0fef58420e470d94d014833d201ec3707564e21166ae4f9fae56b8daf2f83df7e1cf30013f428a94bf06675d55297be64a859b78b8d2c4c352a60ffe178677831f79f5dfd70787d4a7b122f4eb0c83561d7e88c799bf71f5496afe5e88834742f89157f8023ff2ea57588495ecf1f7d595b247f57272687c33c9ce97d9645902304694a0cb114d595c4ab9e7e4fa6734834ff1c783478b3dcab2bf68ff381e4398657fb1451e377cb0fee32ccf78cc35328e2e4412a4fad50cc74bd7cf02a6e30e644f3f8eab00d9d3ffc989e54ad2379fe696e914e5e88951d1adc773201706e1b8c366dfbbbbc37e222961e67b6dc4643772745ecb52163915207fe0f8fe0e3aaadb051bbe0ff5b7cff79eddf573580b9feda2e67985ecf11f4cf838a1b674d40f21ecd8514f3b3e75d86ffb63b5eddc966110fe9d1d1e9edb503b3b3c3b3cb8afe0b932efece07eba93ca9c74cadc7907cf2b644f77c04a272657728e0ed4b294e5e88951d1ad495369a48eba8d05b73b6e2b64c44c497dd90100ffc9700152898901a06c00c06e739e3692516ef321f94307f9430333efc86a67a0f0cb3068e74aaee500db971665c63d5dd871426dc1f1136ae77be777e0b1eefc0c8f76c7e6fbbf6ff62df5cdbe19fe70477d6eb30008eb441ff6a18e8a9961e73bade08ca20a83e6d113a3a2db8482a10065f397ee6fe44f2c0863ab0e9f5b3c2f9cdfe3aab20c8b5cc073ac8805ffbd052fb38b10d4f34882c4cfb163878e1d3a76e4c8a16376c1d35efcd9f7dca8d97fb30b55e4b75b8bd787da07893769d189bef9c9660d117dffddace32d98505e66541834cb31bb30c81f030c3098fd7cffef69783e69b167df8e9fddd88ed9e5c298794ed2d3df28c89e7e02bc60673f6bd17f76bf1d3fbb327f3bb0cc5feff8191e60e223fe35eff80e37a8f9829ffd089e6778bce077e0113c5f80e751907f8fdbe5cfbd48f6b4df5a1c2f789fcddcbfdff11fe679dff1fe8e44284f39bb483c0f5dd0c4892eb83257008913c91e1fda31df5fc7e7f89e1fdd96e3731d33474fbf08eed88297e1011c1fd1f1355bc0036f50b3f842daaf8ecfa10323f1b2f816e0113c8b7812e0364509e0c4fa8f6ef332a162b37f1f8acdb0db88e69c56d89dc7736802edf37df863cdad9751b27f5cffcd66df3abe737ceff8e6f9167f76fde7d75f1365bf1f2791874139de4324413a7e87c8f34366def1423a56c4df82b7001fc9df5f1f729eebe2f5d9751dd78dfc090eecb6167d06d56247e1e9a5c5fe9e15d81d8cf1bd7ec58774ae37f1db77bdc88dfc894771249ceb496ea5c50e633bdf60b7d9fce81726739b1b3991cde5d1227d9affbc9ae6650d1e6bd35cd71d6b4b7a61b94d042e8f6e0b81c6e39b138730cbb22b636c91672e35e5645ab4512799555eaadb5aec0935a35c4ab4061af3c9196d7f2062d8b1660dd02e77b841cdfd1e2209f2e73af9734b8b24080d114d5bbd19d98890faa899f8e42c881467e10c05d93e209ef965630d64b017385bea1361be7ce97d22789f7f3702fb7de4b55a0b8375531b9b056918b4a2947b55739452aafa4ac3d1cc0869d7ebc6e687cc1a1b9b1d81c0fe0e70e3c6cb4c4508923d92201b5d7759ac182b2796c3eaee8df58f26cba591393432ecff6d7cbfecce5b8b3e8dfcbbe866e53b29a93a92a6d26223b58f8ca20a52e62e122e27c6fa7a3b4a23bd90ce39b13bd6ccc2634719efdf98b759348d5a4747a62393f573df35a181a8f48c7685492c15aa1909008000e314003020100c86440291582c20c9e2a61e14800c85aa4072549808c424475114840c3184004208000000430090a1a1a10e5d7a9242e8cd6e88ef1e6697fa09da27c23c7e0bc6a2672a15b0767de8555c1c7efc7a3aae6c050e95e8b18ee374a5d36abd2fd2c2e6980c9d31638d0ec2c4af318b1a909c79167573ef7e65e07cbea4882d379e457f413acd0793337e49379a27d55cf2e7b62329a2bbf93b2ea9a6f898e6b96989660dc175b6a7d442ffd3584108632d2ef2458d6e48236953efe601dd30f1da82e856d1a13e457b93deb16af3a9f80d9d3444ca2d43f18be5cd8f7d1d4e56d895403cdea04efe166547278160882928684d5092ef9928a61fa88b64cd3cb1841885a8c9ce383830f3cfd3aa53bae8e2d6087aade924aca080afd15f5f049f8836f8dbafa7f60b59a08f6da764f7d9947a9d76f3152d21516c6d497eb1472eef7ba4395131fbbc0edad12c8f8beb61e8323f6bbf59f41a70157c9d2c178414ab1d87fed71e76138a95da1d659ec2ef29ed70f65a5b43b9af9130fcf42bee4f9b9f5619204a3fcb17dbd93de8d41d42eecbabb6115cdd3be78190bcaee3e8e1ec9785cdd938cdc3b3ddcfb1462f0d8e6ccd7e457eb822e205a4b2b95723b011df1fdca713dc6b745d32a6b1136e7e4ac35684080bc0db7cbbf15158dd9eae8c4f50a8f8ffc4c956d3dbd7b646645ad1f7ef58c6caa2b67a812e4ceff4c96cb7acb635458efc987a579571ff6fffe35b6b4ac53e1376775195bb4566689eea596436b35603fa376ab9d1b08e03b7df540675b7be0cfbf4a8f39cf2128390ec2596cb4a0099f570a8bcf2455e65b301c981756702d696f0f3a4c067b27826ffe6e133bc684f8b033c1a832b43e59c82f9c856871715d0f560d476c4036d74f0e197dad8cb98a008c23f1484dddcd50b44f27f90e18447ae0d4a0a00b8e06436c38b48e356d7f9ef2110968f6e168873bde585a3e1993e6132232d1e6768e06f36fd59619779f7f552900b94a68ff52edbb109114939b4c5739e8f922230902efcf280d0fb1587372fb2028933448deb190efd89ef0833d1fdd3801fbee66aba498edff3a68132c2d42af7ebf97386a6a0fa1833bba6fc961d4c5bcc32e77d8b48369870a4ad2f6e6e31994a1bcf8c3cf0581005e27a1882fa31f4618f49142112b373806886f2fc2c2450fd6521188f30b5aff8603e53a33009f1e38f1a1367005295a3bfc61de5bee440f01acd9100487d57933973912ed70ee163c27c29efee61c0d532dc2e848f06e5a981b312e33388c75c647eae87d556ea6b0bd95186a34f81ea393b20a53aa0c4eefbc539f6dbdcf807a8b63dda47533c4bd38dc33a1b422be25a96c50bc138397b3ae8e251b8907f1d691e5dd7b61fb656cf632db751d24371a565fc5bd88df4ec1c419f9dd0e248a10f42db4d6a725cdaa29dd04919ec5fb2c0ff886b3789ee909b403cca645b7222ba4f41c2b9493bbd8c7a2d80db28c809182be4694c3aa60fbff0503b895ba03b7787c878535b6ec43ec175e439a6080c3c6332025b2a5c2c356009d9e0732b8496f4d5b915b88184e7d6b3c88581ed3e4f8bb3e7f913b3be829820cfa8d2c6eb35c9113a73059f08d639f5c71398b6085eaa47d2043aeba9f2e8e37e03f489da78d6d3cfe199171b2395c7a3a3dff0a4bd78e1a782470a0e868f1ca9dea5356eaaf9827717cf99c2d9a921529df71a80719b68cb201bf17327760842058aecf5c1ac3d53c6ddde3d24145fdab033fd6056970c779ba9ce0f4470a817bd811413108ea141bd3dbcacbc7c1ac8c1e56e72dd95a0d603d9322b0d2a37cd334995d2536e69b36fddbc87522957eb76d12a72b0990b9a90f2735915ce4c7d3d99c59c31fbada9567b8856e0f67d0df0fd49b10c809b233d4543477ac62790d5c5e8b84b6c2b02f5e8f60e60750275b7268d3087c1dbe157f437449909981831c37d46607e789847513d70f4be58b66c882dbe4b3e569b3ca125ce3bc9999ba5c8969d6bde9c07c066b058f66b792e449932889bce15355f12c237b112629cddf3d727c3dc58bb93570a0a98a20c0f24fa4c6bc13ea34b90bdc3d046a068f98f721ff7cc4e85a529c728a50807e494100538a1f01045eb6f2f7e0075ea85d34233b762b3450806046bea12284bb75054cdc3b7d547fa6e0065b0abd251a2b82b52c7ae80947779d5ab8d3c0506fb228e9e0cbe0531c9b56239573070c40acb8872d109a44631acad7574f8b06b96b1eb08467f0279d5ba15af13f25df4e08d86bebcc443bbce3bf63a8ae09b3dc3eb81ab2ef5ff9d65f71dd143c968fe7320608a30da8ce395f1c910004bedf29bcc7accb7264a22b5389a9c59adb42a38433fa0fdcdf544102e71eff7fd6f917ae9096fe86fe803cdcbbf3ae4310c74be7b71ecce2daf4d2ec3f4fe12b3937c05353de4c784689d411b205f509680f741b85e23c9d3a8c3eb3345d19ba20f8ffb8896b81483730f26575935d678867dbf4ffc8beee7c0aaee5157a638f59bc094dd4154e640183a2d905677b5e7194242ed9de5abf7fbc31de819791a765255bb72bfad74ea5cefc03ccbd93f389d4efeda056c6cb1184a2284fcd6d472272900e6994f91a0396a4f1aa00f0ce38fce309faa40aca32d8d04723dacf36d11fcb9d19c2bf034a3c97b9719f20aa7795b9c468539978dc54c40bb9db851a89dc01bf767da6a45ccb6ad523ab913b56585c559f5d9aca62b66444d576ae0224223d6abfd02e647151169c62b5c2978c0a3a1d63e94406dc079abd252acede791f13017b91c9767c9838c68e1d83aa7b32a1775dda0d8e9f291c631c7907066adb7429492be04f05d27eda488198c970e9aca6c3fada5c14cbfefe95ee1a73013f04e15822410b8af0c79212581e966550ed344791beeca3e7896e3b3c74c97b37d02faa9b96a5236c3cf41f966c45616736528a0902aee16fbabc215c9fac945f1add60ce441933f3e515868116f3689f0e6df3a91aa5457ac7b92e88e643122dcebfa5aeab87706429ec4a37adde644444252f1487424144025724e8ed9c96fb68f2f3185114926e2bcdb91e9b8b4eeefa2c117b1a160a40d242197b373af4a01afc8461027210809574bc21397a20746d63a776db7de52f8c61c51f7c3efb15ae0c48a73479c6bca6b993ec200cbd3cada58e25be03aa445ead585c93bbebca5b9698b95b4c3b3e5a0bb0e99ad73fd99bc2e4c20b5accdbb56ed7c2918b23debf6ae6e70778490e90a05a0563c7a07671ef8a767bae6ef3b26d7df597d8429731c356fbe7b4a2c57ba8220479465524267d73e08ebe2981dd1944c3d9496e300c4a3d9403bb67f3ad6c4fef803ef606026587d0bd0224b22f58c4b7cacb828a3f3c5120cff8b9e74f90dbba6d7d045a697f9638c0d36d5051c62a0725a4ff6761a54b37eb7f091e170e6909dcb9c9ac597fb32971dbe2d31a3f9e248823815d097bf3e09846518e2b36a8474de863722d2d6421370b58cf1ccccd1ebf28395274020b9654b92f721c2b1f120af978ee0e0e12f4f711e200394ef18d6fa560a234a63fd620681c4dd9c32ccca12447a458f898ac3a5e3b485b95c3aaea55d72f0f37c36f8a2806b67510f9c4888afd97665df034ee15e842d8351bb6ae63b62438b1976654656c610d81b571f9b0d5b5878992545f956ba41452c25228239f885c3d89d172a77cd568399f3bc8b2775e3019cbd415eab806782ee987cf681a1a9954276af0121a7618ace3b0a1277eafa88745a06b006f6303c5d16a28f6c5a49735eb73c6d03bf51ebef93073ea1f46b3cb7807cb0b40da92b59b25484bb8f97197e038cba638daa49389207841c2764d4dc986830b3a7ca1fe6d0c07fa9f631ed3169779a4902b68aff63926256b8b1a6b19e9baf05fd4545602f7cdf3c57f22b3d5c64c06186890c5c877c3dabee111fa2292b6c766e4d953658f97a636a6dbac24f687c9de3cce294c3d1431b1d1a808d991193c08ba06c32116d30e47416e01643e59f09243d02d2020371b5cd44af1029f212cbe7ac34b185549a25992ab5808fa4a4b91d27552bd9a1e30bcbec3a2cf773339978632fa17f0abf09038dee054a193b69294e0ab64b13217089ff16581ad559f101dd55738174e94a3ee72b1eb8e9a8e5d6bfdec4412672ec07c09f933107613e3a926485ae065f4f1d20f01545ad8e9eddad15b59dedbc6b234285f304bd108649485fb816a604492f183e4d9d6509a10dbe48c137658403d018c515730c044cd9170660299ac23f5783518877ca7e64df3336232a6bd6a7bee432cc0cb951a94c58f4d15171f6d162c937163ad0502fbf49b48b2c4e2fb76e8537bce9cd84e206ab3c30f15d99860970cebc5d0cbd65f3b130c07fab4ac1d1c47c348ac72cc4feb1acea45e6e8b508235ff362685201768ba7a2d14d623b13c577b8ed291d4ff201985b885200258371b30c8681087030ab77769495824c70018ac1ac654a1a676b3b923ce0c20aeed672f9e3565d9a53815dbb5329e7d399b3d46878282edac54c5331f6fd512f321b0fef90023d789702af26cdd1df158441f7b5bae690f9e923e42241fddae64536984c2189d004afcc6e92e5acab22e41507e2e8a039480f09f8a228ef359b314565a6914d2478dc0d3c80f0865259319d2f11d151eb27536828cb0f84a6e6f32c96b345cbd52736ae3635e25df94d0e81d2327eeef11cd80c09f6f725227b2559e881b0ba0a0cffe5d807726c7d1280c687d3687fa5602dcde15b0c958004ce87419ac94572a1718a3367682f49b6284a4d4cbf4eecc237de535e178e7fd749e07bdb3dfd66804ab9d8e9af728f9b4c40b6c0c302907fde6c1720f87e13a3d17ac28b14800feee3318f52037301bd60abf64a5596b89d17818ad4815017c73536e300085a26acb0e2368ef439d5ebe25b12deccca1ca45b7a96bde215a33d9f8581fe9711ef74b7e2da2bd95c6da413192d9d3bd7ee98f08fc7c9e92fb1d40c2973c203cdb36d95e87683a02e6132b5e6d5186a3ebcbcacab90cbc7668ae6e6b8bb656a2664852373851cc9b4973aeb916ec16c6c3dc0b2cfd2d0d48a66ce2bb6cd8d9b127a105799ad866d0a494a8d923c5d2c15fe16c6395e76d439d50312b03e44aa88c4082ac54d95e2de2172e51625c8ef7b9052c2c877474fff7b8f01eb1a7bbbca6de6ff011bbcb13d776f528cd0f237ebab94353b5376ddc105b3d20a8cb93667aa8572b10492059951d82e67e879ad2a0b40df9bdc6e47b16ba02eaa81b6aef5fac3ebde8fbbf8ff7088c69d3b7dee77defd43174b78e7fab24f99e90ad124029a6e3ceb5a171bedcb8f74b9ad7ede5404a08bed0d4bc1995655ea174265b153550658ec637cc578885931aa75baeb7d29567ca3cb0e8352d126712960abae175cab2e4d9d53fd9ebbca195d08479710be6aa712f90149351072fd654be1656de9106c2da0c416b375589b1e4a57afafca9568056a65848565e827cebc22446ee11f2c80c72e4aeeb3a85a0b5f1e1dc542708827fc23a73b4ca9a91048f246b153602421dac6fbe7706f45820323d04cb901349de54978f41ce9892f8b2a5a1ce06e84c4eb1ffcdcc1f4fea99db08e20499f5c328d1c7a08adca96d68b0f92839ab36171ad2cf1a9134aefb38002de7a62555b9769ce47585abd92831344faeec80811d0408510bc7393056b7256ec44db14d8deca9ace66689355f56f79b203c63017131e1c7d26d881f9d85ace940e477d6dfff49ff0ebd1436b7acac0be2c23528e6a11ee30b5459b1b73793698663593c86c96cfc1820291b5ce330c418c6b77e69db1484e9be5b8fdfc2a3e30ef8585b8d233634de1bc9a781a8a0acdaaccc6ad4403d1647c8ea29bc68f4b77e8f577407f8a47ba7ea22d3a03490345ca9e4fe5535f97e2f049cbb411d19d448e4df39c2ef96eaf7475ac78b280053ae2feda87e692401b24b7d995db96f91c0ef9168220e729eb97d55c7b0ee2e9189044cc319615519133fc31f44a411dcb2e260c08fbe634c7f38ce18c42bef308dad97d072469a06c380bb7d8821ac0bae77ce7b9825181bd124e9c83f8ac5479c62dc2b312a55615f51cd9aca14e81abe101d80649bf390d55ffcc72b5ef3c3f26921b7e94f2c51bb8d3edb1e360a3817c9da9d1fdb79028e587c8e561c8f16224b88c263257db4747b5592724c130cff3d2c86e641e8822e6e9c631adfe48b32eaf20fa2d3b2a8efa44c8eb32020ce74e59342a53c136368205872452b50f35d4a76df0b6f81dcd0f2c38fa15bd0feec5e3a3c4623ba2f38e3815ee5ce16d92365caa95682a0141cdcd79617c8c5c363545c6a47fa7123d4808f1f59b868b7273574d2536b1cd3645c73ae5c6c9ad45705438212622cc2c399620d529e3240929639607cf9b1d1780c0ee652444f4f9fd771abf33c65462b2a033c672c9540bdc040c47800b0f7d2ae3a3486e1558486bb1b1a0c4779cf1da76cc1a7bbda017c2ffb784c023f8bc690078398c2a811d0d26ed166facca9e74437e205ad8e5b08a4d5d4410e578c13588343430c7b0c2434c00196f3b910b047516749bed3938ac9426b292086aa6aaa67a8672cafe2b521faeaebb444bcbd7d0deb1750b8d4bfeaacaba57b2eb8964ffeed126f24296d8ace27a69ef9615d1800cd618cdf1f14057544db03bc6a38544b95789a102445edb701eeea2c537ef7af1feb36291e1e2c306bd583d4fc5b2d3b40751a473dbfd7c47aaa578965590e53936b136ecee921a9062b5dd2d4b10f078b6a98b1d2fee1037450a42c7ab07e2a4e1c575b226a24e1a3bd7ebc25360006f9a096e95f5c755cafe37cafafefec4e8f7dbf893a87c4f5dcf23588e0a8fceaba495bce60cf66e24093f81382d603864f716f4a24d2009ec67fff600b83799176f736dda6960f39ffeedf5ab5cc18892a3ff1950ccc140e0230a53d39d83ede5512fefd0a5f10ee61d4750b29c9cee4c7a9ec03b70d8ab7e80c20910431703f2ee362cc0d113a7883940627d01b9d79a89885a41bce46c0a871fc4e8d800650e4b5305573a6429805930800f477780e1a0926a0acf35433de654be09d4b07e5841cb263709a39bf79f1537b01125a0c78cfa4d17e01f81ba58910fc687d804d5855adbf4aa8fc6cbe8b10997c731b363e74c396f5549ba58ae285e59ee5e2904736c5e7be870bfc05c403c957502293dcd8028536fdf2f3ca7b1a597a88786f253dd35e8779f90c2f210a50db623023ef4eb9e6064383048ee9aad8cd161be3adce1064ddca45d74a044d1bea66dc1504c2a0b8610b3d8e1fa54bd9f783ca624152489ad3c6fa671a1cdf64a996259037b6284279541a56cc8c76c23c5b4624b6154ee97fe206e708e82c96bd56f11af295f6a4a92316c7d260e905b95c202e328c90f7001e1b6ed689210bfcc489b54829cf6837fbc5a06b5e3223e3c830a6bb704054146c238003c49910969fec8a1eaf48abbed5acfaa9abc6b97f5fb2c490b1862a3fc07d368a5516381b17f165e353b6d5ea36fbe2beb959065f9c614202b3418d7ac5fb18b2d4e05d4bc0beac14cc1e74c983876d57ddc4efe8d6f1414a056fbbbdbaec67ff3e6c987f2d368b42dfe5f5ee1043ddbf32440a859b245d4e43978e4a0d9a4e05652d2571ced2e9b44b225c2cdfaec43e90c98cc19a7d093ae3923f4046bb70e18085d7c1d4a88c361d7cec3b51d5940840fb043c6a19dd27d5da8363200e8ae2365026f04ef6b0006d931f3d5b6ed7c119bdc9a428cd410d86b18bb97600a3e09a4ebb377570e086e6f80118c483ea10ab3969631b57a66d929faeee4f0e8b3bf434c55c7fd0e4636f8488c193be0e8ff513a32639cd8e6d214537b9e00998448cc7029c0032ef2fde0e280fe1fa17720decd6cf1aeea5647b25cd95055b028bd6b9ba13797ca14016b6873ac6c330af25cfcf02adb9ebb1c827f2cb124bc499505dd5555ab32364d1f10ccb2a42bd16affa80f5051040dc70cbd8fbb593ab8351f95d874ad4d51a5d04c715385a421dd20ef63c24033475cc94016b446144f7c44a8d5ba480436aefbc6337c781233f49ec55852b67e8cb8bfb410c978d39bbc86e04ced841c84b7a4468e2be0d1807a9778b2915e1f8168ce74b714b370ecb081fe701b0a93be016960201d133d23ac3e4fe122e5122d08347255a1a9860716d780670804ae64fc83ba06efd7afbe3fcb800b5c31f8e254bc02ec1c38ea91ee864dca29540215b6d70b407b7b80ad93814e01759acaff3c1a8462d8ebe46ca7b9bd46d1c0a2b1103c9c9bd2463f2246df8f02d48b19a889291d0f25096e5cbc77ad5e50587fc2ca39f65db238443ae6b69b951c72e06e9a6f1a89194abba2c6232976c566ba342ca53a282d6395fe2840637eadb999e4f02e9a711e8fdaa0b2d1d95a5f5ad1ee0d244e7d2e1e48275545658a0ff82612f4cdc9546f78ae8c26815511930e02fc057c730f88b49128c003d1f462a99745ceb6d0d33714880d76b2f4e279d207c9ffa98b5282a2236978649f33662d2b35d7a994d0f1544a94b0d4e3953c401ed68f0c9475d0c6206db219a37746dfd36478b9782c6b43fb1e6f489f21bb22322940dd6a49b99cb96ad6a2ae7506b398b20337d11fe281bd4151039e542356470ebe90cc7efdc44d555be5f22a8caa1e6015a61172672766979230a73883f93112982be65fce651c272cf5b9064cc12ad384a8271327be8937f3ba91e56de212ee0c1884915a441190a97c829d48f66fdf477c48f0c85b767199f8690f21e888dcceab00a01cd69449352b080788a97dc710c4fb061a3fdeae2531af9003055791b19a2fc1e2496c759f52448b3ea6f2dcef550e246033f57553cedf20341c0ccba811f1b5ee1d0c977c7e9ae3ea2b831c465d6337dc88fbb341cc8b22f533361f97b400fe27cbc411b835aee2d1017776858bfa3b977696c18e3eea7590c554fbacdba390bd116ba25efa90ed6cc67e003eabf8c91af951a83c8669a2ee679dfeca6ed95c14f3b1147b36f099c23a8ae87201147956a2cbc306ccc3bee4c173518ea899dec5fd9ac23ae474ef79ec8d19566bec0ae17454dd094501f98068dab7022fdde9f6c01845d1930f8295498b8d94372b4e229d03ea48c38f780e88b96dbe801eae5325a8111e25e2c99a6f00df111408b587640ca939245d6ae7a8459c52b511d9e4504ee25188025b96b86c28ce0c881d5642c36a6c48ee4c011272f1a7edad9602427185ce4c48b23bc66c9eaffd205cd1dc6ad050fc25b33b850dcb80790ef87f71532f56649d82b9929b3b43b8385c2b46048f3a4212e01d2c6f82dae556ec1e50dce67828af16f6d431ec7edcb03103e32a5f854b672b117fca1dd26a33ee8a2e8c29d37f77e0ad9c9d996097ed8ccd60dab853ba21cf184e53a250a7161c641962916fb1ec600f674b5c38576f5244ca58175ecf38683613864b0ec2a68a481cec984601810d95e6afb09c72e1e0f200e75dd520b7e871fde160016a3d803e1c1b0f87a9b21497a4024f56a7ed993cd15c44d18927e3ba0624ccc30846762616dd1238abe48a05a070aa2aa2812cdedfa3f88215f8725e317148eafb9e884a57bca407859bb3bd0a33bab4b9778658c8a2f4581e3247c879d6f85e91821643412262732766c329aad4c36cef5f413ab43fa719ce6938cdd8fb727000d75df141d072c1268f6bb4d20df2714e3ba13089bc4f72e13fddd56e960d2edca97b25b3382cb74dba9f5022772fb5e500840b410d66aff19dd3bdc3ccd07128a2aa32f970dac3077f7822624c8eab65150357c85cfbce751f93cb093789f3d26aa2106e3266d078a6a23072a31ce307db545c6342429c0d5dc2c382274d3b1e189c2161b4f8d71f591693aef8ba8907c770d525fcd910f9133dce01d06fbd1f4c6a98efe0fb3711cd81a9a4e55dc2c21b5952f34c8dc6979c17b825c2743e7c0007e62f7b79c99d0b71960fc797bf1121a49d3598d930924cb27316a2f10150b709145386a67fbfa1e79a07d1f63fcfa49233132abaa0485455e31f960a777e44715a1ac3a22133f6c0acabc511e5c41255013151ea4680c384d2bec0c689a575016962050d388a66a79327929405c60950cb02491336f4021ff64fc2cccdd9a57944896970b27f01e9723e535de159b7057e3cf33c7b0869ac29266cad5ce802e7aaa3fddb84ad5d0f2638111ca925da6723f632013a9201583541de7110420e6e9327989d7d9777e501833e63b7d8c6c1503129963b92e646a99fcc4b8b2c313c5b18291b99be17273e0d701dd060ff2b9222c9bc61ff47861c0cf9781822d1f85f7e7988943e1b4b9608f6cd5b96d8c2634cee777cc19e41ffed1e8ca0e7a141f2fd8781f56ddcdc1ebe6a46491efcc676c7a46557c4fb6dfb292684774586ba015575657cb6c460a7734e1179a29994e89503b59a15edae244bf4cb4546d00caf5db64fa613281598383f743ee7336bec690f834bf767dae352af2540033397eef16311a476cd595769fb5843b2f07c3d913b849f5eaf18e4dd657fffce5a8794762602e5e86cd3fa7d04abed890359528c10dcb675ef3d428830611d225ae9bbe393659ca1acc8a1243ed4e37a604a8f912ca9231f0d6f678d005f42664229a0654e47c4ae946f50bbc46b178c015f2d6a2643c9c7e790a41fae04cd252905b1ebff009f2c5c97b2bc7e0d9187c148b676e85558bf4f504433088182671611201855e2df1ab62ec32a568f9d865a4485431039734fff950b8b36c64ac058a4c588b524b2449479ac686926744674e112da0446fd693a1cc2bc4b8a0a302ab470d2bd8c5847382388e2cc2e5f7d6d74ad1611bc531175f244ac3f2282773c4eb2130ce18b6aa46a701fbeb54b03749878ad3a89f2d5624dcce07686322495c14ddb457ad3a2eb3b663e4e315ce1f2ff8a37fc34db4c27add9cd4366b1646fcf4e717abf75d5895eb7f29706a8ae454c4fa954d143ac6d649ae7c525706967a825d62494d1191c02e74a494bfc3c58a0695e9ccc587e608286bd45d01f45002d20c9f07caac8c79fa9655ed638abc2e6a11f56c85ba312c89bb2419f7c4d3773fb07c2aa1113fabe522e9b0f974b29be8a3155b0c3db3005458795fad52278f9090bbd01fa28fccfc201bfbc002eb31adb648766342b984f8bb4b9fed6c7554827d73861e698a2a90fce2fff97b08ccb42ff900a36b8a8d80c14e48381f66b8947143810a9156153c2bf9bce1ac4c6a18d30c94fa5e9e4ffc426a278bb18cb801ee2d3a31b7ebfb6de06bf579507f83f0858fefb3206b41a325bb46a50965842a93f5ad47cd4f413380e7e4a05940271ffc43275fa0a09c0743bfbed7eff1e1ec086188232e481a634974222060010fb02930280a97ac037de260bdb508016c10008836cff7c2c57fb595b47b6cbe21aa4a26e02c06089ffe21690d000a53de91df7b65fea5d765fd2ea762a5c7db0213f24b872dafdfd66b529450affb37ace34c19dd6d4f01743cd50054a9de081f8ce4c0497ca7830b32640018a2f603b35277ee06ee2f9e995fb7b2a3c03d39bb7ba880029a112ea15b06c1f86ee6318703460bba64438b92ec4ff7efba4b9e71062a83606a6ce70e5da724091e7d1ea58f9f836cfadef9daa044619852776aeb19771cbf8efc40e23f8bcb501a2163c2422dca079d42f278894049b3239b4d20c54fc39eae8ef1a041b84b5398999861561a29eae6d4ff266db5ade6b7fe05b85d58bb83230708771646e50ec8cad7fe41b25b52d974dbc838826d56767b4a49c8ed025d65ec3739437d3c9c3304a7f99bb8ad91d6c319587a91c3588198cdba1b0a3bb290805aeeb8fcda0703625cbd3e952bdd4b88a5a17bc41a3a78423134303b3c8c5ae0699973231050202c979b86ca292fc2c592bc479287740bc3510b7f1fe7d50388d52a2b8cac1b13cfdae134d665f5f799346ada6a8b733331bbb04ae38015bc5a0824f31b93a601d16d343918fc1c99e8c3e16d02adecfa1da2dfe3fd1d362c653830af813fd7dc73fefe74df2080a1194dd4e6e267780426ceef58b8d2d82e9ba4cef513612e9b56891376d39c0bac9c7e42db1c132a05c615af5d4cf6c55dbaf8f8425572968e593edd29ae3e1605965e45f7231ff15c604aa58ef69cdbc44a4b1676e387624b89e5e8efdfe7cef6ce0a4d8c9400e66e4511cc7b5291661e5f1924248c3cce6e274cc084c625b598220c095840c5975606f30c3951032a7cd39be1f6bed55adc357a252876ba447c9d1be514a88f854ed946af9e0418b19934e83e04076706322b5b06b2d43bf86c1dc264e3ec1f15931cf07319ca059408045371115c5024c0e790eca6b4b2e349360f3a288c0d998b8714512a03cf64b98b5cff61ad61173b58919e4799b3dde46a5cc80319da089520c7742665c902c25085f346b313e4b54fb85100e8cca0700fe15dd6d3493090aaf2a8ae191213c9da7b50a9bfc513bc0f9235cc17474113eaa2656b05c28a50e1dc44bce65b1b8da651e0b0d7f02c69e469bee866f2151ee73c87fa1831197b13f94aa46a2eedcfb713e83d7339fded9682671ca90a5deda3055e722fd39e31acc0216568bb1ce27d154dbd931a90bed7c1df695cb5a799bcc9d85e2e0ad93bfb5fc9ad160afbaea025c343635c5b1b8a18e4d61a93bb5ca7f41b5970695e0bedca86067bfb16c7d0bc0801242013fe5899e851b284ffce229149be195138a82631bc6bd7d64eca975e8c790f6e1b45eadaace42585bde55dc6f8199b48512cfeba22c17671872ac9311472f747669a2677585b6ee73a9c3e6b2367c2e470a39ce91ca97eee24c65e10ea5914680840b669d60903a442682df50fc72812fa3c1acdc9286b65e788228603471b1940ba38035d58c94b1766dd9e90696360a9268e7a955ea8ceddb34904dd9d6f97942807418d416dcb2c6bb709c0daf006418d9b3603a81abd7ed40a416332899ea40ceaf062464189d096c03a1ac1401141a1d19c880f97a139ccf2d59aca3517b544c698c0ba445dd763b64b19ebef02c7a2d90c6ec9f6897ff0ddc606e6b10b440ee80afd63b0e71702702b4f746af53484056e09e01f778418f8a38d58d3df11ca893c37d5e821cd3620afdc0b16016883dda3298839aab716501e67c3cbdba5bfc6671d1127edf176326c27e09622fc51b41407682264f10a44121763fb8732f67467aea209c0bb4e3b7d81298a6a9d4380a2c516d8e1c01189ea0d3f0ff37df2940d4968584655fc5f53ba6c95c3b872faa67928006b4d5c8538a7f5f0ca1d26d92f1a81e14051c40c60343623b3ecd1c608684674c48d9d1de50c9ce32309d00c379378066b55c7de37a48cb022fa4958382fce82f29b284c046c5212c6b055fed8d8616d5fa1745a88e22a906f9e8c417c01b2c07c3b18ca9ac2aa1ebf5a2a228f88e859803ec29512eb50f58cd35ca5a355634d19ecebc318fec4cfa17799f0fbb5c41d488a6a113b842131152234b9b7317827a7e100e74049d76037cea523d345624eb452eb90319822fe6227bd177a36026dc2902b334ac83f5a117a50f082b938b7586a3e14711ea99feb878907a69e6fb32e8612de0396eb7cf081f6edcbf1fb4c6aacadd6bad32254ad0a9821c23a63079b7ac17b4e17f8d6a9ae533e33403eac5a3176fab9371c2577ad1d24dcf1a54522d84b351ddb3a809fad2209cc8ff008e0a1f0c90e10687c9c01c258abdbb2116bcb4c35ea3a233074c8de08f50d0d033949155cec91f7d4097a35242931d0f30b7f1b3fb150af045f1c9a20a45c5cb4910ec2080af1599cd880c62111f94579f2432ab5e33d85ac3f02e4b14be535108775acbea0d75f13d61175e33952e087a6e36fbbba716455cfb81526b128a2de01ba3db44f030b996fa2ee511c8a8f4b40c68a532d9efabe3c49ab245e97a70964440d78c26c16fd98885fc2bf60b14351e93d5799cd8cd7ac86e3bd85e608d5bdfe868e2b5b364430e1f844139874135f8ff90fbbe26bbcc062f099bc158b9ad474c625fdbd2df080a0d5276f1a179a8e62ebc80e9b927708c9a5619e7b29407b545905b3c4b703827e706a306e83eeb6bde91ce003d277f27df116fa512eac324f08bbf08097ce59cf0ac372d7e9b04383731855aa89a259502c6c8405765e3144019fd676133be4154348eb3abb49710d94e53cc49a0f9fcaf0ecd289dcfc0315590466e948f660b7f48f80f5fec2ec1aed2c01d659fd1437a9445cc9c7e4ccfa212fb8c31832793056c405222e2250fb97bfd80895e918460d8a4a6da425e9cd29e1930e17d2f72a704522ae062424cb434d7f0fa87ba4e77f2df6f045c5233841ad9fedbab72042a76eab483319e2c5a17907d4d5d3413bf6466d6117ba1376a3fe492b37b72c20f3b85c404a91d1d4e431fbcc0194ea8217488584f5ddbab9cd98aea4b40a86333b9bf8ae13b7ca062b54621ffacc9fa952c6c93b61a7c1a685f9c1249021247aeafa1dc8ba682e48dc7b294c81066605ef5bbc67e674acc2e1429f409476130eafb72a7c7a1d4d08d8412598ab42c5853944261912543e7642f019c61309bb7301813002415849c362a92955d89ff9df0e92a976bc55f735bb7ea6a05746e21f311b9fae725246870a8e218e4740c62dd88de3769431d836d7908168e3978423737deefa7b729306c3e75a0aa16581735765a40c625b3b421cac8eecb1ec7d195b51176aef3cbbd2d656b6f73ac56ac7cffa998da289a0ab6ed1402a69fad1e2ce9f735ffb31919e61a7144203bf6076b9b27dd73012257c118fc15578c2f9cb33e6f2b336ffc9caf9a82999617f8bcb6dbaed0974fe4fcfb3ccef5a5d14fc9d140969409c65a78075870615efe16257108d616f678f302a0b9c96486bd259dbc1080a4fbd2ae888f71b34e48b29b57201c8476c68b7a0955f8d0900721708b254c14b46312e26cff2b7a31edaae905a9fe00a850c296f724ab11993c1ba799d95f9af1f0620f2e0a8e9ef80e3e2138bff8206631217803c36807ebc9a019324db441e7ade6d632132bf189c90e60e0cc80cff5128c7b8c2fab8a7fb95f0c8f6c9e7f3ddb9f849fabac2b974e044b36fc706e530d824cf66989873cc754ab9ed15ce3e75c360bb710412472fb2f045253babff043fc0a58814a9405dd6f03465425e4ed5ebca3907907c0a5876abb6ecd495f95646e24ef11590653fbfe504653c45f9b0dffb0981c96b0193d065ca746e8fd925862259c51b12cb232e87e9b560393ce0be9fc9b61e92c76352d841a4080a80602848d99777d3b6f38bc5baac70d9397f0cd4c828fef8a3e42a4fe41f84551f759cb1e2c95288eb81cc62c8b09c46e87db09d9d8c6446e7b7096e96ec5add3dc0221566091f300e9daad937c29e874e6a13c5fdf5fe4258bafc73e4f12971741c0bb5d891cb1fa042e842a950a27ae27c5042ecc5ad3cd92ba713ebdf372c4312f498e38b4cfb86c92b6e9f419d1cc0b5f007ac61c220cec1f628af9bf53b09e4d858313b947957c66d07d7686957f5154daa633ab6a52d94acf337b8cc16f1f3b1ef3b046a5689ef15026d25e905d239ba5c7290fd3a5f4ffefc1081c5d9d1c527e883d011db3d8d01b0e0e727adaba1e5792dbb8476b0b66333a29200defe0af51825c29f71fa3f2dd29b0f1fd0922c54d86862d84c069df861d0b0c40e2f34cb95c61edc3c47ed1779efcb04b9442392d4318a999487a6ec87aafbca07e530afa62279287cc16959b75459edd340830b68f1ffa52b82903580c24ad9af30244aa50cda39775264b6a4fc525000625f54ce73bac7e4f950c27903594560fadbc6068a0deaaabc5bd7b5850b197c1002a94f7431d09e5c54556f105daa5726c9d6b840fee7b24478d14f770ea998afa6d1122db76b7e5ddd8b08ec836c5168ba7a2b3cf526af76173f7c77abd938222c5312e1574d8d7b12277ba55d5ac2ac3dc9a5114b7c40d50ee8f6485cddc39e23238ddc30e9bd841cbb55c98d4187080c671cec0c0b9f252abf3eea403902374900d341fa8b6fb83c9913d92ab0a41a907642729a2a4d291e86ffa5be6e8fabcb52f8596b50bb8311c5ca95251d6fe65103391221dbf768fd0d35a43283f363d09eb1a19b15ec72a5747c32eb725573cdb672d8e69d3a28a01ec583d2126fd461e673ffb0f44130c5c57c0f01877fe9ecdd5d4990b42b21d5eacec716590206fc1de6707061343d0c967241629766f748ec9f099f0c16ad923aa328782fc85d053604ef3f02a9c3d8d503b11613a5f4708514393af38cdaf223b08d143eb76442a105e8c195ae1343fd0ecb4c74b951b93dbd33a498151a173235362dab0765a7f504161b24b636d974a135bd21c959546d61b3e866c283df3f3929df2a24da0527e1b9b91c19dbf7d9bf298378b4194fcd23b7635bf3f95175adbb7d6db57ce75131ef2d5af4ced6cae8a598c48d8fd766cacc22afc36eeaeab50be3dad88c6ee9758dec32218604ed5307b5f7a575c3b3ef0954693be5df54426676cc81d9017dbeda3df91471b7d390eac4833e6cb492ea63f30233aab5065137f334c7e9b1ae19a379e8aec450c370c044cf086e4356e480a7f88648de26cc34573f2863ce0c4566eb61443ad141bfbcac14ea25231750aca5bd1e71cf032566fff612a5191d03ee8003efd4eb19b7220900e2d5207c0dba4d413d899bfd1309c45c9477249a581142a3a4cbe1249dc7f3580cfe9fb9ef27d4c4145181db756904b5188b8c28760c8a5394b8339aedb23e8dbdb27008c343a364c798870343b530c07635e8bec677b8f86b5ffcda04ed07fa18b06051879d1d2a8725efc02b3af59b4d56226437b5449a4e631622c7f9a1c39e6dc48acfdc8e9c6842455452fa5c49359106f56bf047988b58142b98617928b0712c25941a5cc420abde732fbc0a5cc8bc568de73007ecfb1804f1cdd6b84d8fe2246e93f677430396ca5fb0a6ca07a4b438190851f1bc3249cdf52307dc796d5558bb2607d5b461d8b08c70b03daee283b9fda5ff4d5aee447c4f9bae5cfc3a911145a28c2f29f7ae96537402b71eccb90ad9f80339759b3612d19675b1a7c4f670521601b88f5a650cf64f43cb788aab3c8c9f6fb0c71da8139401f72610044398a8d5459d009b401b49df7b9c8a1b430a643d98da2961f972cd9c430b596f9b55503becf545fb0fa4361cd3d192e0db787ede86a0e8760df1889258f8f4e89a008e0fe9618a4efb13aceee2b33881958cd0a10b20db9c4ef90794dc72a9bb4f25c698fd17119c5542bd464f7294990706f434d30e00d5815a800b96a17e6df0ca5c85c26b178d0ff9d0eb6b972990c82ee6293523d3e8bf0dcc12a331eba0d9a1ba6d551e58509a98a28d81cc2daab4ecda2a30541b1a1e4aee24340d8795105d46971537183dac355824a2b445500b4eb8870be3dc85cf86ed41320af251cebcf3c750510ebf0c3de68a1e631f853687398d2bd3b1055c6fff0c52fc2b754fa3e55e741eccee2aa5818dc8ac4aec907a46d7e5530b8c8da998257c7d92f20667268702aea045c0393e439364e181a7ab645807705a21b339307f8a50c4d5ae271980e2ee14a5d56cca3f595ee24f79f4aa3ab351dc160e1f3f12a019badd41057e5295e2bb01c3b5f28f0d1e722fc54cb966811d5ef92e663eabe96328713c1c4d226cfed5bd232e26994470b8641096a9642218a9f2dacaef0b1285107e31a472b4bda32f9035e12e9d19c79ae88bbb187ccac4eb8e4cc5d20e165a3997cd8c0e87b9e6b0cea5067bfb12750c445e4cdd01f3301513512337d2dcdd089091abafec01149efad99ace23442908c75c29516c7b2549d4b643650d34938c7d2b815bd1d67709b5fe2ee835dac5014b78900a3c14b080c95a07c61469de6a571fb99d56bfb98961d29759c62ae6829f03c775ab0f0c1741052ead32d902fe234a729dbf99a308f79b597e27abfe1cab17037e6a14685c7a384cb28343b84c4eeedfe4d747a10b878b91f24a2158dc3154387ffb8982ef9e267f77e4b49cbe7b0f61e9faeb3fff8bdc53586283505aef8042064d08f3bf4595e0b6b6cdf3011133de79a00faee4d797b7847fe9114d625d80ec8e7072ef9f4e9ddf843c4125bca1b96b680fad5ab2c34f5308d4fc103a588621e49695afb78fc9ce82453385dc869bc55f0fc4337e8f288d9488c087d17beaeb69ce2325d4e59db5b93b0a96a0ac38798fa3dec60b56afa658b60e147ead2fe6053e007d417cadf048a370aa92243dadcc4d51923b3b2e2a9591982a16b46cb9a13b3d1c6a5d72d0a230a59d73b3f649feab5e76469214df7a738af47672f02c98d476de5d3e1482e1d4daac5dadb0bfe49ae82a43f9818acb1c6176df5431a25d886ba049b99937a68eb16c3cde96f33026acfeb88ca5e71d4e1175ee7f5edb4f9600fb3779fca13dce15bbbd463fe08290e58e22c210bbbcaf1bccf1ee141ecacb797279ff63b6219c6865d2bfd3c9ea6ad28da145c6e4d6e71f1550f289ef4b6fb8fac8719345bd816098f900ec66a98d9aa9c85d1030c101338dd721fcbea40e47730e8e8c1e9ebc0587b0794dd61828e1fb01e1d2ad6dd41cb766850f803e9f30e46da8d39a879ebb0db8eb40ac577fd525df6f2c0b4e795c6c6679b3effa7603d8a83f2eb30f1425fd85f9c305366a1c014e8b7791e319d10d283d9acc0dce9c62125bb852999d50e2ed0ac063aece2985784c414faf2e7cb39e203e8972ea24d87e7d22144be3340855539cc209d46ee62f8d9f2e7667ed80033865cab15ac78027427f430d6478f7408e09b6f32e8ac176f0a488d7a51d58a0de18d38179b3a89f4851d08ece3b2a16d85328a44c48201b014b0ffb697adb35818b60bf476a7e2029dd5b68d199636d61934ffc0296eb1acfb09f15d827b992fb013250970b03a452bb391920594b4a3cada329484941de484cc2a986c31192f9a2331247c24208b3366feece3e1ab2009ce3145a2d2901a3a9f8b5a9b93d12a5ad0792277776e87ad7c00ddcdad49f4b78bd726e06d3fc4b710fa560002de12b2d4846b92eb697f2cbd465b19087e078774ecc155ca8676b67ff1b976cc1ab2a8ee88c911d32397f056a1ef3ecd34d538e7c2ee573457e61aa008ac5f437e84b9bb204118f09874f12542c083baecc92c21ae7de9820db18c18fc7ae82633ae97e19d7e7a056a786da1447d51357f2df946a618460d34029825facb9cb9a4678737661c4de1a2525180b24b50b85fb6b5aab4ef6da5b202450ce801e643c9179b1a8728aeebcfc6bee6a91e6160daeb398588137cf49f5b8ddd3168b15038ca849829289132c975ee259c7543ba4e325f48565b1f74910feeaf2d83e323a2bc839394eed1790d7f18c3ba6f44be6b0407b1c182ec1359a75f16b843b72d7a2388938ebe75d7c35a4342e832b0875908fedf2f4c700172b5b5388c0f89e8cc32e278220a2db09ae5cbab3f453cc68510c0bd05781004a54215030f3690ee3a6f8c1655591195f02a06097c2d14986f3e1f7479892ee01e09da823238ce0d9989e79d6d41041651d4c8f6b42fecd9d01f26c0c4312e410263892f20bf0d9ff182fe99b1c9fe74bb7ad03208e27d849dab021c760c780c9af9e9785a92e2438a27c60bb653e9c20157a5f2aa8f762353ec7df91cd183745dd16392c2faf4c34e3875eee37cb1cac603804c686b8a02611e07866b3c3e2a637c2292a334968607f8669b00d080e9ba7842d73987503ce70c2b2f1087c6cca8867001c9f04e887420a7f22d588943cd06c05c22ef26dc4d1252b582daf35218303c8ae85c1dcd01f3c69ccb7ca00c6a3af87bc213a26d403c5aff17a49d00a07dbaa9543cbcc5f24659975e07b98d549da25264511d024a4c6be4429d48719b1166db86599aa7054b4f558681b85f55d4b2d87708c94044eb03c230c859d5dbb0272f2d35c9cc47b144585d41f042b06b92cc3938f43ceda82ffdec022f58f5ba50cde528bf1b45cb378150f511c8668a2a140617a5d855de87f66956fb0c0244d9530d6524182050b39c0723b5462fa52cb0adb9d99e0643678e5332e1f51247186cb0fcca44e60586c8dbdc16a6dac14c59f2611b730223458baf828092d4baedc94227ad13cf3dc4bc19edbd81655414daef5c939498bee120f2e1b9a7efac454fc887f442c5ad362468250f889ad148042503048e34e1114254fc2a86c3107141b9af2b8590041a0fd771867399eae88bddb5fb3ec48c55943d42b373b6ca871df08ee05685e9bea8b19d0d5a0f4ab31564aa5bb623950f43cd6656db61024cd00798394eeb946b6d94b00aeea041e65a47cebc3bfb24486b6cbf5073fde0d0a9553624e1a25a9d9838206e9ad5616417aac7a62a572654230ec3c09a091fa0a5464329f45c547dfef249ced28172eea6cd83147f7b67bf74cb1a7e2300aab43302a529f3681f936109855493f8c245562cdc52acb2c50cbe0ffc4696bf548ab7474c6b148912f944e270587ee91cb5456cc2ff73911a056e55a0d8cf4b04987c1fb23bb9f5a2c59d454fded30699264c8ba1e35e392e28bca1f13945317710a81458ba68615ec2352e139517756a8ca29c23c3d3b126c7a7ee84d62fa468617c412334ff98683322d4a931da1466420908fafd6c29e585401f88b4600c017861d18d60e59c38e7fea5291868d366e3999ccd4dd3de1179dc1003bfdc8a09fe93e41c885e96d7d0b3a812fc3268ed18fca560d1a410031eeb3c71ae100903fafae7184c5fd3b39304c8a2f539f8dff1396bbdea60f6d207a69941e4b70a2c9ee59817c469043496d8733983eb1ce29b13a423854664c2cca8daf9963e13aabbffef4fb52b87e49db46b8521ed94e1e4bb9e24ce145ea6fcb3d96c6a5094162356cc49bf4e187c4b7ab5aee00fba9863cb80912a82586fe694be03d6113ccf476c8b94f688b74e7ffe01c21735eb5b0c1b926b3528e81823d92f6fae64e7a7fe9f59ed539850978ec84579e5910488b2c20a5b12aba6664d11bf491f2398a90772c6299a7c56a429513fc1d094988d886b900233c53f9b06e52c019e4a29a146519ff6e25626b481eafb7a0ce5c2a3f11c5e1906c7336fe15a0f02b50ac83f79d213cd333cbba10f4b4414798049a73d162a1dd2af09043d40ce12da5b211bcdcbda9befdcb8c7ef1937fc9c883ddf45a83af47d08a9b78fd177a756c834c76c8506c6d408c8e8ce961bd2b7449ce8432a9b891cfeb857e44e8f79253efa6d85e01a05ca77ea164098a1bf123aa8145f4b32da2cb1746b277338734816bf94c5b39cb2c8f88a4dd0cefbc415251de81f6d8d1951713421f1e88da5f94b1bcb879c70a06f2c8b873a0838cff1d0c694865bcf83ef466cb3221cc14cb7cc282598a2d91dc486a172c7dcfa9ff1bdb27fb9a8b030cb609ee8a42c471e20d5ab4310b0b86ea4101cfe118166947260adaefe5ac99b9462e69352731c4b9d95508c9628993ea138d80e4c9ba0880ce571f7158197f8c971b65fcd71c7ecb0fa699da608f713412bfe21206c7b9a55570b047b369b7ab62f79a58098bb56dfb5dac674790daa2b1a5c3f8c56c8652a57c54dcf63eeb08a50ff30db403106d2ff5af97d3de94477e69d891e16d79b86f098c977f4dac6e55f3924907d5a97e0d5ced286a04b199a7354d1a71b86af822b23a2b3cb2de6b3d350f56acc542a5a70a8bb9f526dc513033f0896d6ccd2c2dbec265915a11952323ac1eb5298210a3434010e8fe39eb9bba7e193db61a6d403fec2fb5ba4767f64a4f2cbecbbba1a4ccf8fd18315c73f5cdc5f7f549128c42673aee9960cb92f03aedae3e5837f6658abe92cec888d2998cb1a6af558b2b864dc8dee378b6f473d77507fd985b750e3391c9b5c02a955581db32855756cb0f867f63ed4ad9ca492b5bf2903c59179293eb61f43ab90ac4fc7929b9f88205b82e595b069d80121e1d67b119c53563d495286bbe424a30d4d46eef2a1e54c4c2dbbecff08afe4ada887fe381d801a3bbf47604b045ff3d36905ab5de526b58fd94da0e81bcb26191f6ab1bd2e565159d85e29c4d9563b8a2d57c9b58d0d21e8401971462774dd16bc4fd676fb733753b4b88b4074beaf724ae5de037372e6c62e872c09e6fd0435d9b0f9bf241d6fe20fc21e0beb2fa4804bb199043f1545bd93103f3f4ab5310ad2e0f997320321fbfbe25445846522fd903c320e90f463b9bd880b54b2ec5200013eb6c0aaac9c534bc35f4cf86e07c6b6b6d55c2252fdae050ada9d9c6a8c414986fa88f8183a1cea9015ca38bc3cba2875a105518031ee6940ece3c9878b798d7d16f6d9aaa35de5aabffaeb5e38c97ea32c0dc41b1812dfdc6e05884bfad01d7d7171e17f2d1a45cdba2f563d74df379e918d518dedc6bf12ccae1170db10fc11dcbe8944c02185d975f0ddab7b53fd7e1ddb69c7b7f233320e289006b1d702bbc4b3561a912f1d843fe86e6fe604b208c1b1b6b7e16f8c4f5b759cbafe4188a2a99c6a765712425db3896e68fb7a40d88b163fc6b51693bdad4e60c3af372ec26669e02d6b3285de10250426e0b84cf7539d741a8605fcf5e75c6e28224de4889837140d9ef03dcc99246c182ec9028a2cb700e8340f1387aefcd02f213069fe8965798f45b7f9d17130273bfff9389159f757645f2a35a41b516b3e99ce1e086a6f387a29fe5380837d062da1d2b67ececc9813c4be98ef5ad7315bdcbc87a185104036755cafb1c69ea704a9008d0435aca2d5d5e4718003496f6c4cbcba36e836715607058a3e83bc4153f9f99a55a753eb6ca926fabbe40300fd47cd8a10a41f6f84616ee08a4865b3d13cde6f40272a007330d748c38361747547bd0151919a9d22cb848f68e1ecdaee606b2847701e57df360ee6bd55cd296c04fc5078bcb7ead2e427a195f09250a1d1ac85a61278df76e9844ac4b6839e950f8b4f454af2cc4218c2ba47bc0ca1a66eeaa61e34cef3b6056b89f8b364ca66e21a73d67ecdfa1d307b75b86e07fb0ab7597c632fb2d97067feedaaa0be0f9c35702e441a4b4051fc1ae558fef925496ff9d5ef2cb10ee57d834250ccbd58c7b7d01d44ef052aa08540946df7e2a1ec69b61b152d4023c3d81f7c31c2360207d440eaad2851f288682ca0f1a6408f3f929ebbcb837d677b4a74917476bd8b05e8e824189dbc7916f14d27ac373bbc94ece4e14730e2a3c96138082b5674b6bf3923a192c208c79d035495d70f65710c31952075a142a2699075cab5f4b000d949053434ddd5e81037bcb4f193ced52c04a8cfc85b5e1fe70426361e5b24bf1add9ce06b703e970619e361de62dfd7dabea2a97b17c7979506ece0dcc657cbc305e879b40ae70e4dbe402e15e2e060496cc8da9003bb1dc02109437ca96248825514743049d2e785a1acebed66d72fb56fea6e0a589e71f08c2b9cfb101093b6b3a2682686498c3ca0dc7f09c4c4758fcf6c135ac0ebe05a9f5846b67beea468d0858b40cf4ce68b372fb2e6b62c7d7a64ab291ae9d7a44756f6e14765651199c4879aac6e3d7375ad0afe6cb612303c1c9630c06f6227299a76c7c885f841a38ede2556d6c717af1fdf0de73cf91f6be093704a74ab91058c7264b3e2911d4554c53f156fa70479cf6f58abf6eb01203e07c9482eedcff3a964cdbf82e4e6008dcca8964ad4aea6feff83aaa2463f9087d24f6cc9eddb786a054bf59a99ad575fe8d54dc4682a0fbf6b79cddbc899bbabc0b34d40118d27663e1f13b5511ddb475b51ef9076a6b7a5c223c389fc50d8873b4e4baee3b9b4dac43f650dd86ed0657cc4c53f6aad00202c42e2f98fac3cc04cf6ded72bbb4965ea40ef23a9155fa24dd07de639d5dedf7e3b999543df834b602ba49ced20c4ff1e4e19ea79ab487aa7caaca80a4fb02e6b2ceee867ce7ce8cc22b2126001f4032366eeba94f37770e1791bdc74b70d6b1f1309478de1befa3cad35627a3fcaedb9e91e062bd299a11e515237572f8ac05979607eb0a510b0af0139f9448b586998ffdc248b6f29a335933a88f72e265f60a6626a422ea6bd2e888cdfc74fc39ed0e69993aa431f008a898eb16b93617dca384d638cd15f72577e580c792e334e359a6ca26722f1641ffb40ba089ee7eed540199e652706a3e5edaab506a2f90d326f5af185353370c9f50176cee5358518f4ae6e39de61a228eeeadd20b805cd68af9c21ef4e6a2b35d24bf19a1ac3aa5f222fac6846f3215531acbdd737acbffcedefa52e689400ffed3fbcaaa67f47c81c479b2f4491ccc2b628c7f5d567381bbbb095b88dd2837313ef5447c714ca848b7ac263d7c26d25746073328392faae1c817c395417591571cf8da8988e927b3ec6a3d9816f4f89db95c09758cc5be3cae40b19470f5afbd754d628f026bf9235c34631b44207cf55797733a90c73b7d669886d9ee1c079b14630a050297b1f335ca5131332e0986cc9299245e448e934f5bf00a5d4e05bcfd031d36091d7d5806864c5a5f422048ce2dc911f5da73aff6a41c3480842e7b8a94162212f4667246615d9e99bbf95d919ae05be0a5ca208273701516868bf4eb1d1ff9428abd0a336596b6040bca999d1a33f9936e35e4ba9022b32b1f9ab529acb1c46024ce2918ded05da99cfaab2d71e296495857e8c8427ea94964f1b53cbbfe413b16a29b498c2c8cf5988f069e5d9e8d17a12d4259317d4f6146648b163e36d78a0b1191592f83724944dc5b9ae4aa6cfb1c697ff7a9b48b996d04a1b9081b5e4753b068e8394120636dc804b66286975f7fea602c1b0f8cb60274f43f8c71e634b9c544f949fad8c2e65f890a3172d8d172f33376efa4f221820b20c087ee3df69c9c922fa447de007542ea0a880f77a822847ccfe3b147c2699d56bf993fc5be45f2caec269d5512c4c2f40e22f46245d16c3ce18b40db2ea4f4567b918c9b2b9131b340c821acf33523b49b8b2ef92dd92a70764e86d5380b8ba4a3d91f9231820ce2c46d2322527d51df62a5dcaa979e091943cb63488d2621e5bba68d201a74e979a4494edb3be365274dd806999807486831eef59f17b16ab5235db35c918163e2a9a6548eb4c74910556058483864bd0c4170f7899808b4038262201b5a83160e7054b25f1fdd9d59990687ad190803ae9f01a31b81eef1823c104d1dd21d874fde55dd678988ab66a1cc3a623d2a86774f987cae89f951dc5dfe10d1ba5bb7bd740bb2c25af4c2f550c8876a0525645e9e9087e478d24715e261c3872f57f5ad01ab63356846565d21488160f88c332ed6f1462d44f8d4ea462f5197766c570ffb26e3ab9d462ee05acb5da6707c24c3555001baa863e7f6cd4f6ee0969c1cdc3824722b02cb012fba17686f852e6fd177eb101e0550085c3eb662bd848403d3e1eb12cbc529886531faf4669a9ef29af00401125400575b01b6a3da48e6517a31601e5fc4a4be81dffb973da65434fa8057402731497373e4f086695cd1bf37e7de5c3a39acf7cfd3ed3a33b30640ddadab22e152bfa3dd920622319fe7085acbcf31616748f566f9f22ec9aa2f9699ed293b0db0c5eb5fcf700fddddd982690c3c3ecdb3aed00b30643527fa43029a377d1e1fe03ba3f14a12559bccb35b1906863d2c960facb66096a943b5e5f8331b2f411e5b83dc790ba2525799d5b05a90c997e7424cbcc33bb64eed804d52ae62855f47fd7798652178b7a7a9e69e5460f8ce6d8700f546d98eaa6bd1b77bb22c13464909043b80860c3ccff479a63a8ec43c034c3eea7147c5f67e57e8f3e3a510607f6644f5df813f297b883e9013882484a22405ab6ecbaaeeaa94d8ea02dad78cd88cc4ddadc5c96fedd614b696df50b6b1a23a2f8fe4b999c61c9821d44a9d6df3706d5baaa161b9bd548f61e2c916596e880fa4deaddd878733af75925c09a5b153308860b57720199981d0daf8f86d7acbd328f80d64593a26af6c3e419cd795e77ccc0dc8f3f156c68b87362655c932caeccd07395279f3bd3595d7c706527a37a4a06b87741daccda781eaca876a555fc5d755eeca5b826d860af7f36c2302be3f50d7475a4e855b8f04bdd57021a4ab66f22e9e479f76b76d479cfa3a0db92d8d58ac67818f63b5ded277717009fb3eada3458020a139e9753d5364efdba4a95102edb47b4226aefc2f6756d0f6229cad85ef012d47860be6c56ce1d566e0cffb9e879142d85b4d0d0ac88a52133162540abd379b44c6cde26bba3aa8d9cc17ee88f2058464800405a9fe451132486cd0ad7bc7be5517586aa49580f29c55e58088a9370e52b465580ea70ff7fbcc116b0de09afb69e9576890b198278fcc3e83f91ecfd778f8b94b820258c853019a5d3a1e01345a086669b491f488914af14498366f648c9123c3c67cc8264c5392c745662696d946bbe8c1c7efb5c04d33acd60d5ad7ee3c9564d2caff630ea5edef5c99c5d338640e5005f378b7adb016fe2a4d49943ee8eb16df853f96d0d0c6cc7a870620b3208ab2d271cb0da85288b9740b3269654b1127969363711c766d1e45123a2a6671ecbfabdeb3cbddce7fa1a762e14c1626f9f0d2be63ef39acbb05d541bc48b9ae88318c441efa51351898544efe0dc936671583dcedc33c4e1d7053b0d3528c096570d7475775c5215ce2c7945dd4f7f2ffb3712f30750d893d9da41960beb5874b245f37967ac87118ddca49e74df2567d69cf6c82811b637188d016633310711db95fd3347319b5c27d50f660151bbd75a8e9cb737c741e1d516b66ed7b212c5bc0ec32245a7645829bb1a0ca80273e73d7184cf8075eea2c839ca5e5af3475ac5316553168b5327b63b5be2b0c5e0f8b0071a3e5ebe2ba5ee2c171e6f6a6f047b49d9def4658452cd0c7419d0c44ffd3af0645426eb8be14d19b38c2d3be6976ce73d04f681d220b21ca527d66448bf627c1635fa97cf35f1cc3aa2a14c2bebcbd41e9a3c23642d9dfbf2c08175f4f81fb9854fd0c942c5fd9250c5e05393a4e46e274c74b9ea04e256f8278172a8a2d88dbabbb7fbc631ef5cba260e37db2e9114107503c0bd2ebf81833d8a087f108656afb72ebc0f0a3925d1047c74480a42e4faef9bd30fa9e1182eb29b21a22884e1894fbae3baa8d0f3546f39797896ee2d22e416c3ad5bc1143423fe8e92ec3f45bf146f7cc10c6c75d0cf1a539c3e3dd568871d5bcecfc1b90d61d2338f8255a82bfa7f8dffb0571773a5264210b6296e380238929e9de55b10df107a3794466eb736fee52233111a59219a09d3c26c55c2e6357e4272b8450a9bd63595cfb37c396512e15d7ce27b3a80b98e26aa349b7674420d2b4c4aff3ef027b6c5e63f0b5a5ec3ea799ccdbc820a557b873cba8aec8d7774061088197c19a328468fa759a50cd345b878931e2d5ba8351a33137ce9a747e4c02391af7fc7092d49c46731362be7531a09f418eefcfce5b512ea68b4173bcf4ecf9e34d517b5c8dc68a5da9b01a0fafd56aece6f0fdc2ae4294db7f594f98be53d0bd4143cf13900989f54aef5b72a7a7545dbb422b291f52086f93d2bd7e6fe4db55abe231f61d86c1f541a48eb743bdb4a16554f8ed3466460e27b0e07927dbde3c7a8245997d85b9a007bed3375d67a7ebdc9a63871f9f1fe6b9ba4335d32880f270256fe698c8db328c21a901559791dd88ce042d6175ebbe7bcd3de07099266d039d01092e30879f195fe05093ee8ee282db0372bca65fc7e6d4d5a4ab0ec68fc6ff516fe8c9ce0dc97ef1a27fc81720dbf040a7bb6e0969d7012ec1125dcb671165954c41596e6b6a129bdad924c477d9507cb3b59ffa5e3a5ba7c3200ce68f398b5dd96e343733ec893dae7c235218e8bccc09172cf28a5ace35fe6f51ddd230a2789cf9550575eda05c9d08e1135ec4c1e5c4d5cdf212671aff3982cfc7127b1cfc062bdb7ffd1df87db4bdbee8782dfccfeeabb45573b6c06c8abea95295dc42f21116cf2fd186586016713958b3b18359e6784c08b83700ff25dfef908ac45aae4da88ea515de4e0fcfd69cd6c7b557d76efbbfc8e5a3a218d1ee977fb3f1632e3cfc2d1e571d979c62dc753e751ca0772a97b35056d9a3edd2976b1b3f0fea9c007655e35b753649abe33876cf8be2da5085e12a8970527b27e91787bd10e6457f52e05e4e5b977a6289a3d03d1d294cca1f238b7a5e199e759c8936da66b6a95bbd62dab6ee11580c3444ac5d85ca77b15b98cc81b4aaaea00c9340d95f54e018416ed56e5109cb52269b4645c066b2e59374022b7fac807e8defa85a91d30c0349955f863478d3d760cd8267e8cdab91e0798dd99bd9ec2d07dfe8f8ac44e915820df6de08b6a935c3e34e72fcc430a3fa3c78deb2dd8e59cd8102e32f89cea3cd08a5bcbb37c17fdcb6be45df85b0a0140d11138ed7c0a2cda287326972b9e762351a07c369ab4ce38b0051649a66d9dffdb943332dd72a25df95f6bbf6f9efdf41f7eddf911ecd4d3f4cbd8796a16975df9c7b2f94a0ad66adf735691fd32686f81e36aab7540b20aed30e54100ae14e4f915081ec7eee050140235d714a558da09903c79d7f986f5798c0261337691e0152459eb7158cdcb3a1cb5f0d8eec53a29e890e30a678618e1578e054c6cda0b7640408e92642dd0b03627c5121160fb06b7073913a5fbeeb0564e3ee19444782aa82451c95d678ef8b2fb88c46423d593ad1805af0875b24298e324bd9c5ac1c74e0597c70870775aa5817248147a3949d5e38d30ccb51ac69ab76ff02004a14ddf5705ee80e809067c2ab705be81371f95e1b0568c43881cf694d01dc81bb92b0257084884a8b0ec891065d16149790927c6c1de3ca1c34284c14f18173ecb5147fb377e9113501024c49414612b8d5824f8cdd062257d4786d1ea8a6516526141ba38ed18592d5bba48b8d6e93b86ece4054201221ef67061bcec48f98ff884d12b1cc4675eb1c538e9977080d0888cddc56e9109b462d9b040ed0e8ec5020fc169305830060bdbb1b29bdaafbb10808aec92dca2422e4864524b59d915b35065625b7c0570407932f5ef3b6d05100bdf1d030b472c71aea498aa79c647b0420d73006e8438b9167233985a53cdb428f67a601093f1d99b0e97aca26c63f86b212d909eb5de5daf2f1ae8c71a35336b374f70b4221fe0c239a7959ba06eaa95cf451459b3141d8da491c34f5c9b751e2128acf7fae3da1304486b632ead9fb1189fd3457515665c6bd16c601508370c816e728869ebaa418b538e10d9d093a017b16dac1ea5fec01e29a158675ec3917830ac805ce78a5d73855b28ab74f3b702d23faaae413265c4e67ad143323190d6fff4fbfa72ddb54d1ae7f7e37482b81f2377d53423d629efdcaaab82e83ed1af5770ac57a9e87773444f4bdee8f5eff96d92345a03893525691a3ceaa01cc95e510457f0d8794fa1122cac9f728435ae61c8b85ced19d378fc22b185499846854cd4b26e43fd950912ea50b55f6561ba50e5b590842951e4396fb36063558f09e2e3b076faa8c2dc5e0d9ba83bd05946221a98312ad7057b6fc9a3c0bbd1b36f74b139ca6c9a63bf7df8b1c8cb1c32db75791914434d761c463923c42b7c5f0a2f4ebc908f2f5ffa540a9d980f5b0f1d7ebfe819143d52171153734a0fa29b30c47c1fa230d738bf1429475113991afbbe8643512ccd56ff766b43efb44e85d898b70a281dd95684ea75069faaf2258d1b6c66f9c24516853582cf201933bc03c0d418fc0f73fb316e9396b8f07c08f011a0a0fe021dee80b086129c4533d4e5d7315eceec1bab75112645959530c3d0513e5be28ff2333b86c6a588de5bd40c10a37847755c640be62a3fb12d50c11425bd562944b9491606664e7012e513804c96dfed452ec61207213ac337a7d99740d703cb83108eec13c3f2e6beaa38afeaa4973a28f8a1bcf35027782c5e7a87244b013da6f6d80bd49844b5c12f4677255a213ba408736087200c5e43244c8e3ec698ce647e2810a783a12e0e1cebe0b8d407f6e6004271b98ae1e0622ffec09ef11d28aafa01cd4f87805aa6b52eae4f5fbe97db3f84c9a61bb31d669a44684f97041a26725c089cb8e7e9468739a76ace44012501a429026a7cc54959501a55491b5381c4c56ac42aa98f9cb6700a99ce7924e257b4a7a9b70990d59fe16e008f324fe2e47a7085ab8bf0300a00000000dbb94975292eb8470c9e9cf2623283e8b9086d1195d793dfda6213492472c9e6caeeeede01650469048a04f833df0ec5078ab86c69b771802eae48cea1a9cc6f41ae480b72458024b1739545d922a2c40db81b112566b0bde47eac22ce882b3229a5f4c25695bf7ebeb265915c4a455867ae097bfea3f55a6bb1f5ae63da89bebdda3e36df3dcfabe95bea52ae9d9167b91b785f92e05accb7dac89eb5e48e682b373e5dd09e182d15692b249cec749c8f06e3f6b51e5551d5bd431cd9995b02fa934111865cb37b995c23cc6f29d661b4b513cfad517d722be594364c312e9d2860fadb365b762aa987f1a8cea8a7569f50d35a14f52719df3a2d55bd7ff5fe6e2deafd29e59aa482dc762362a4c786f20d3083dcbe4a1c6302e3456c8309d5d5572d55e525914d6e3f75db222c52dade12f6b3b3145b7ea3a89ff3edeb139fcdfd7e565b9db335f7e6d4dddfa34a3060752aab1db1441202da4c51a1fd85eeeeeef755d55ffdf2c22da90c59e4523aa5ee75faa59e92daafcb684b78979e01a96e96e278ffde17bd965bcaa48cd4e7b49fe1b798aa5452a728f5d65d46ca5f2a12a4ee38faa4eed8ddddedfb37910ff17afba2be904249a5bd4152d72f9ec9c575014b221364920a7a7aeceaacc30e5f4dbaa91e965ca8af8fbafa7669f8d59161344d2c4e3146c0a7700c859a54e3556f718c11d04b2f4a2e5e68e8a29f12e3db51956fb9e552be74c7d1fd7d04e76906255daae55bf92fc24a01d2d618e9c78790c24b698c5485f2edcb8ff4524a233d594eed5b1ba26f9dfaa8a1f47d527757715d3c3b29073c686e346ad0658563ff2112d1a8c234e0fad4552df2e1ed381a55d86b5867b512edb60577c4d46b509d21a6ddce137b13ed7689c2b068e25c6df8865bca749680c084c2b197ea4b9ad06e5f6ec2562042f344bb1daa27d724087ca926a128da6d120a05634410f909edb6c89ea8ac4bf5a8a2d06e8f2e0acbe403f9525dbd9f52a0e01439c4820b458576316858a11bc68050d9507185f0097bed36d62816a6ff3d454880d8563464c7b6184639a957cadeca5602682bf34d5caa4b26129ffe87b060376c43c5900f947613e20385dd308a87f13022ec864ff804b11b46f993b727427c7076c3261ec6b32726bb09e939b23156f2161bd1eb28139f5cb495f903b8c96f82a16027a45fa7a391e8eb8b445aff75fd1ba53d15bac568116348e9c3274aafa68ff57d1af40c0e9bf22b527e878f3103556da878180f022f868a120655668a4e9981c59e4ffa815774a4638a24490cc1ebed574b985317b87c8718d96d37ec99e65b2514172f96a243fcecec006de7c45b8123ca39e79c7386f906195e121cd9596b020a2642792dcf6482117b2614faa267fa861de062dcd243952ae4ecbea86d4a071be4b02d85524c55555545fbd651f8af84119f66dc8f69db02d4d5f82dc43ed45a2ba5effb8db5eed2128905973a5d2fa8fa7aacdba6b4db1053f8549d5a432042c5b88d1fe21823f2c96e4728828798935d55cb69a8d6fa189f6ace56e8e253753a496ea86fdf625cdfd2774ddfe1fb57b78db5abb1dbc6ff4cb30671db5d745dc6edeb4a72f0a0c9f7bde759071e782882136a14c10935dbfac0c9818310d0ae06a93d38bbedea4b292895bdf61aa266672d4c3ed0f3de6b4fc65a16a6eabdf75afbd47dca453675f4fc4eabbad65dcbaa94b55f554f5195add5b27c487c43bd5587da0ed5ea2d7505a9f0db138cab865aa3c2b554d243a64fdd6e03682b4cd818cf703b7fd5211fdbe22604d90e5f77e4f4c54b5b99df52849c000ca386ea6261aad5b2aeaf7f5d967551f7198ad4db36d316efbdf9332c676c43c9be4a905af8455b71f8f40252d72d45fdb35f7feaa517b7ad76b854c3cbcebd3f34bbed2ae41aac603cd3fc1a9e699282e4ece5e545c9b5d784103f3b6b3d13450f9e0bf644cf04e4bd2782ebbaae6b1b56c0559daa93eadba644884135897c610656bb11f182172a47e955e16c61ecfe768b109fea57fbdc0e7076d602070e0142f8e0085cabf6519f4e5236be9d37d6b77e637c884ff2a316d9440dc8cc3432381a9ae66e648f3164e9288682c16de9dbd669cca25ce534b1b0b542c7ee46bc8f7e0a9429124a19e35db53958d9c85f73c9ed703a45e4cce5ece021835d2d752f2f5ee4b6935619677d96a85dd45aa594129f6a3da973c60967adb5565dab94d3cd005777a3c1d4afade2fb50e377d8d68f3f6badfac4525e6bad7174af107f8465681b9b9db52211df3025cdaed957bea59dce8d363d6c4b6fd62ec6a59d4eb63cacf570cc18acfc235f8f2486186d3cb02d290cd97d08c792c804b9075743fac999db91a1cb75b103d260ecbf77411a8c900643558e475b89daf5d8d15666f268d48007902e9c80053c2ca3b4a184504a0b4629ebfceae74bab92b33e74586b35a960d430e15b1317b69db5c422945252477d3a79c90871ad945bcaeb9d0f71fd1a82ef7608d67baf7b1c30ec741f948f2b2c651ca0ee1fa3940e3a5729f509a183ceb9ea6a753a658b41e3023e2c7c608f47f46c5c8ccec5e86294ff585bf141f6c78ed218699c31c618a3fcd8e27511cd22c736545afdad5f87192062d999a8f97d2eb9a28ed218a3ab3e25a591a294a5284ae9a494d2522504107cb013dae744256838dafd1eea8bf36a043810c3fea4d9598b872ef6df630d06ee175bace067a8021d746e4eea1dce395d54713d04a41fd93d60df130002ac7b03a420e7a7f2726e76ebb1e163bf77d9adc7c64c10394369292f0f6770859d311eb60520c710a1143a7d77c764534a4b50c619db9c10b9f5e4e066fb8bb66d8e476e3d3800b2fd5f6bf1cfe46eb58a8e695389ff228e11eda8493ec82eb017b20cfbf5e42067bf1dc8f24ca69458fa19a8f03598e29388c82f76ebc181910d2c80033dd8afb190d33f6a7964c76ead852cbd28b9903b197ee6e2f9583db0ac6aadb5966531c6b8fa8bbf621f2ebf7e73dfbe8b2b8cb155e15a67e5220a63fc297ff187aa7614968135a9c64fcd9618974856905d60196eaf7bb5dbf831fe884ff8516c8309f6565dadce5117b3b860c125910972a5dbc6f4db8bbd8e655b38c6e4422a64bf5a9667c22e4c2c307b727d87f4030f5230555178ceeab679bfc56c559475d939ca3aebad3ef9533ae66afad8fc86b953fbb05551eb72802e4e47274827c81dd15accbfb45342336139072c15a0a1c9fbf9c90d32c550305829cc22294d2cec67a65aa94add0426e016bbbb97f54d37a7a311c207380de378a55d8fa7f21e3b1f0e3be0c5c02597f3031a3817c47e42c8b826fde080682bcfe5f42063ccdda3a46c36df2b75135a57ea21f4d899ebd9efe1cf974ee143f7d2c9189d74290d26a5c1c07d02831af86cfb200de966def85c66705880fe05e096f02de09e864d4d4f8f9d4db25b8f0d78b6bd41be0d5302b43483eef8135278839add7a6e20b301b05b4f0f9ffdcfe5ea90e5c7777c9aa58c06dc7389920d9a1331eadba825a96dd45cbf557d623b1494b6e21a4c43d156e28f185c4bce4a6cea96e820f499d321692e67d4dedd3c171c32e05a9c8c33c18f4aec56f2ed1d8debc1d5389b6c0057cbed5d1c4f94adb59695ecb70355e0bba84402df1478802ee72a658fe5c01c8f73c627dd8440861c81403c7b53d830d63c86e54cbd9dfb76aab763bd9dfc995b22e7392d4529b594a2f465abba14f52598a2b6c61ae80263cd8610c886af945d80baf7de9b4fcee9a2ce3ba7e34a8da4a30e5481ef3a027926e8dc9167823cf1c733c1b8f34c10c277475c1241f187e491c0e082dc7a74e4e8c0d9ad4747cd6e3a44b095b80cb0b0f9ecc6f3627a2c3fe7e2762df2ddfbd85ce66e24c71197230a0f0914e4300204fb9037289c99a32607cd767f7104592cd4cb080564fec0d6dd7a70f8b877b71e1c3b700f0e1cb95b0f8e9b86afa5aa57f007dbbea5bcecec85a5f94825be60f3581c0b72f6d276baf0a3ed78e1c876ed878ccc6e57644261b104eb82b828cb2211557777cb72a774bd5e6bad187b7591d75a6b0aae418e6c8befab7e74abc53252d020df5a6bc5556d8ea2ae48936817cf34597c9630b37d96a0c3bd9787b21d5194f63a83c3af27b97e878f91431f2ab140959717b9fd607182e2523e3b6b3d3ea42e1cf1836d29b6396b9db397b2d6924fddf9706b7d9e4b228dd920fbbcdacacc6d653ea90594b6fe5adc437bddddfd9dfadbe82c3fd3146141e4ccf7bc0d4652f6fa6c67efa5acb5d6528fb58084c741ada8ea2d8ce770f5edf76c5f810bbc16d2b7cf4103a36fef665e8b08c85d07d17794268896e87e965eee72aed2f4ed69f4321c9f6816777cc0faedb773cb7f1a3d29e253755955bcd59c3feb917d7d2673e8114dafa64174a45dc667429fcd9b3d1f976ca84c851d9f2aa7d5118c4064d3af8e600420bba2254af34c53c6db5486ce50998a4f5516e5ea2d3e55d7655524a1aab2aaaaaaacb73464bd1dd219a5d9f32f9d39cdc6d5553daeaa7ff8545554284432791555ed606767be44f51a7227aa00af11de0bc10e3b0c49c2889c1d46e4a86093f8d8618484925a0a3f454a4d25a59452a9a9a4f4420821ccf7410a29c554f549a3d4a41b8b63a4cef65ea9f3cb528a3629919dacd1b08c3a92180a26875c61432129267ac1371fd5f5243930df27758ba93a259d934e9fb3d64a515e6bcd129fe4abdef6bd524a295364b4dc09120cc9b9d65a658691b296cad9ed93b64675632fc96e4284f8ec8b3a5915c5b7f20a3f21508871314664d16e3e5b10b22bc96e3e5b1862d7b77954b3e8b9576514d8a61aa2fc7aad57ce9795f3c86d8b14c97a4ed5fa6e5f1dd5b36c1968f3031b18d8e08ca0e070fcc598304397f1e79cd33dbbd6c0333d27f34c8e05bae0c0221d7e180f9772201591b3e6830374c9805379df81fd427002d20f18c82106396b3e92de5904123b732df06adf8808d40763ebabcf20fe4cdbcf66d82da321f45923c2c467ad88dd5a10483e6b4e8002ca676d0ad7674e8794cf9c07fe33c7c38acf9c0b5a4e7ce66050faccd9c8693a3b39381a571374037473e426e8e62717c92fad080bd66611a8325d1054c929f4e714fa441f87f974a0ca7c37efe6dde8e838f782a0ca84375065c2a01b1da8037552f8c3235a8bc3239a69c2221308480748074867cfc9c35384a708cf0b9a0f5f107c41d33dd3dcecf950c74883c958ce4050c73daf385182723b4c91982520206c5e29babd6e6da571810405cae4a1251e9e174d2c4c136e0ab368c5db3a3fe5eb8a77bbae4021a19ec450b015a567ba3e6442d31a341d7b7e73ff1c9e3d9f4e4c7378c8fe19cd1939bfbe8150a190e31459f43985d57247eac81d324796340d6ca7fc6b1ad82e3da569601bc5a3681ad8feaf9a06b6517ee00ffc813fd205ad25e5e74b9c06a3e2e7e7005da28c8ccb48205a4be9e7cb9c0633c3cf973c5acbff7ca983d682e267c4893b3b1a8cfef952a7c1a4c0b9c1b9c1d1999288d682f233fec09d0673e2e7bb20e82265a0ca7c2ce79f22ee59c653e487adcac61a56d6b0b3aa4172253e9dfc753bca4097c993d3e20e7499344d653e8f0c8f0c8f4c0e4e0e4e0ecece4efc812e12a8c94017c9d37ea0cb046a2af36594f1e76763394b1e29e39ee79b902481595128a990408a468c9aaf5091020404047463344dde9230edf6354389878767f2902cec6d4989769b44ffcc99393367e6945c780646d26e8752a0983493062321bd351969b7f109142020202093119ee1f6e8ad894b451488d6a2069ade78a6f99267e6cfb09c6928e5cf7273264af00cb7456f29050169341bf080924b35ede199264d1299ee28c9a1372c76ef09b62a13264eee45c9a3b72d89de92f8f2e2faeca584e4dd2e210951222c818caec3270924f4d6043d390b0ba514755d2a796826cda4c1b6ea0041174a7381f67c4b531ab816f32b7a63cfcfbe2de93a0f7e6c0a445ba1e1210422f6d4c19e224c7362303fa3397bbee4792d401a8cdb27f3c4bd3e7676467ba88f7e0ab0816d2999ef905142e8953a0825d5ea67cd07bb3522061080dd54b63661812aaf61e185c564facf912502bc27b816cf79a4def549be286061bf88f39ee008108db816ef5f58584ca67f0ccbf909fb49771107ba4c9c7f938985259b405487e622692610748940d18823809c712dde6329c82668920604588e40726667d188bc1185217636b57063bfaf7a52a1b5784ff5b442036a2b404023a7e6934ec94751f12b8e48b49547dfe29ba5943f63748e9a314a1ae832abe054de73a1668a613fda011c67ca26d016e48c23c0ac826bf19e8240ca501df69b6138b2dfbcc27e9fc91d2615daca9b4030c8599c403f48608b87c8ce5cc77e0fdd7bcf5ece39dfa1b3605d8369304b2c51d360b2bb6dc54952f03cb352baf1c3b694ec1d759b9452babfa33a7e9554cb8fd3a1e8be209423fd1075e4ecde2ce9753f769642548306e32277bab3b642869f6577a70de60416be4b29a56c29a70633dfa53200feec6605601140b6b27d546429a18d0195a4a844ed5a07b5652423080001011316000020100c0703c2704828d165cd7b0314000f6d8a40724a3614c764490c2321088320c818420c008410630831069922b2db0c74f10b3aa12a7af3564ed05366d0d5078cfcc029e1630a24687fd2e2de27b4eab534f4ae78774a7258319bfe6d143e60f966ef448280397351b6d851b11823430a274c45c4d136c8cd249bb4b74958091a467ae163e37268c19480d61634445dac4236187204dbcc066a989c49bf1cb8625fd1a1e2025c91bc86365ef601173f978defa4bd81b2ec6ac0d589918e9478f643eee432ab6a1896fc3de27914b9285e1d38d0a86685970c535be2ac4774bb04b3640829b02138ec211803dce8bfa7a2da1a6b1c983a2c2134902b806bcf10d39583e0b332ef04dec5cab2167859cb0d662db36cca2dc4193dcf1b3125dd0c6069561b7d59fc1c9a55378110c18ca2f6830900aa15033ba704dce1ee042c9850b72937c083a511ebe0d51213c7aaad068538774f11a6fd648f226c65536475c41e46e0ab48787a8c01b71ae4033d5641e61a782b0724ce9e882d791e70b888e7f9dd663bca11c7fb410400a865061bca49508b0dd26427d4aa3d384c3e42d4f09d82bdcb7d7fc3a9ddac72c2ec55a153674ad7b0189b0e2ffc11fdb8cb29cd3d391214c862a02901aeefda2b7fc45142b7d7309b3a5aee74d0f0ab8e7383535a3e0b530c675b169f49917a124e9b6fe12b34fb1715070b877aed4b014d72a969d76a72aaced65478ae9fe639132a24a92c52605c6072fac5f87883ea31dac3c3bea5337e2cae70adfd758e35d18d98c04978c13941d8516d6a0548f1920e5ab4acb0956873d550b6844d03eb5c41c93316405138ab7f01b51b031f4af7d193949a14c6b2f5d54edbbf82aad83c75d418ff26542fc04f4c9a52677ac2fe77d5a28688e829d822e57bb95bfbf8d753c0a854c3d512d745dcf1c272fe4674bc7658ead017b652546379aa48f28a02faa5541856e607c83d647165cf085e51e5c4d550c882b98bbf2eca8c66dfcabe1b560b516cf03cfa1a0acd3d61b2e372582936396e0489f1d182e8e7570bdee02fae331d846d3050fdbff216df26b9e0eb47a8c86b16a9446d3b03245e0919705301a0cf7030412551e01a7daab2ab9efc45f0462b629bbb7a3b0de2f008d687c6b9281750e5695c4f7f6cdefbe2f60604035f04833109965986e9dcff8b3c3089c8ac3a96a3cdecd26f795c9f8db67db1d6af9411710a13453f4ed426a2554880797b5d6eb76535c32f27fa9db77710bfd9c5d0d397347337d173716f0bdce005881551fed6892becb80f69283bc7afad384dc1a1387f3127189d32459f96713b3572fec8a858405e763df7234d86c1dc3da0088ad471b877dc4aa5a5ce45fa3435b826c31c8320aaae3226aa99f6c2450992954426f3884ddf58c602533853b1001f71c20a29c20aa6d327485086849a2aba27141eb941f19851eff67b029ace105652e46d748193ed2bf527712162b52710fb85530477ace6c0409437480b7d8f989dd214e63895ec799b31402769d2d84e358d1dc4a2d8e9ea19d628b1292c20275251c35f376ef5bb2ca978454adb4ff2ca94c3738791ef027c3a6d81b159ec9348f0b3a932952037c59652a6e17b49e3dd6f9a98d5298c2dfe7af5f743094927c6dfe8a6340224444c067182dd5d6b56e0b6b42ee1cfb2ca206b06158ca0c99cefcb088e7c896f52819b9c3662b8fb2833790de228a4095295bcd11b46b697e2228fb704e03e0098f95d7ba198a6af7380b39b80c4ea0ba3a3943f19082ef1724331fd64a2d0f9f80b63a57188b1a47a5450bd1920125d595f4f823b9c0e2973b9233e1454b9aee3274414a7624a93f3dd1d11fe0355698316e4684e0de983c5800836d53d398c2468a443b1c82eed3957ef384da90ca612f47684d2b6a76e4bb9876708a5ebb8a6cf30b20813934119e5f5c0efce09e348f42776b48ad449f4085d0fee39f1885fd7b1a559f6d74fd5f1dcdb3ecd6d17a5882ef2b7bed77f85dacb7d4d49f80a7a5815e6e3fb2f1000b41f537326b066e252cd26838f267aecb7a50589b68f1b47a0d807787d2d9221f1ab509e6b79d6d4f88adadde868a4badf6e0f61f37c32e68029f03d64e05dd0703f685cd1fb70dfab32ec6008a567741d2f0d04d033c297163b13ed817a245f616f3fc59c631edc5ce14aedf8068ab94584e85146e4bccac0c707f7bacfd822d000b07cd9121a22a505b0a95934f7d445e964bc7af9041a98b2cd95c476245449996cb3c60dafbdcd4eaaf7ff11b984a6605ed055dd120aae84e243e15a6cb7af0f92e359a02e6b4c375ed32eb8a400fe0cbd78623b7a462af947320e973f8d6db691548b982a9f698b29742b2c431b9cc0536bed847a29f23b41d7b1c7bde2ef3ffb45088852a6418ea1d32fe5dcac12e0041ec1fa2447cdb91bdffb07cde551c6e7fa31e71deaf05b81afe0d71bc771b2c7b215645598c667fb12a72d00485c7dd97d7938f24906298d15ce6660bff2c959baa624f7e733217d11a5d28038b07a5c58871c0d51fbcdd841b30a734bf4bfec348a99b2cdda93a8abe7edd13e3ef2f3f61577bc9265e35dd1d42b25cedfb5f2c22037ebb729b239d6f6e1bde81f9dffa3fcd3907971a91bf50bd5bac262267315d6f1af00d6c9150abf68f14102416032e76445ec0f93359295ae3945343c0ac1ffd366887ef72ae47ad4d534c66cb9c5196937260d9e156caf44bbc659fa1ad8e4c4cdaf874d382abfe8649e0b5b815f34a934571c071b82e02023e7809be97fb81959659b381f0b060b7f05627adffe70c8a58182cbf1709b3d0935132cacc5320d94c2f35152ab3650b48cbe3f98a26d5df087d31324d03241beece7bcd9b06f95c27e48619f7fc41080bea079f1eb688999b3017c679f12b2cbe36787a09f2415d7053940ceb362481f3b8809a7b30896d866bafd018e1627c582485130602f7e3b5281becc228bef5d4a5451b23cc2a2f27a321581fa9510c101355a3cefe1cb1d60ed210036602ed9ce3abfd24d6c00c02d06b1b49fcd669e6492c98e5adc6830649362418550c2f1bd1c58db12fc6a63bc4ffec94c09c367f260a8a18421fd5dcd3f0c5b8b4cf2937c963947d2e096b6d2a0d67eed14e5e5133d24d42370902dded1f66b266a3020dce8a08bd3e95ee85cb5a93abaca637f26286358781770d0e4d8830f51a4cbadb993a40ea1ea021f4e42232e0a60c05a07b28afcd806f0e17f73c96a9386d04d0b7473268d03366143a7809f0a02b8e2aa5089f362ffeef126282f22129ad75ccbb758cdcda08bc9b13008fd772c5664f9767a604b04b757967f2751b8b94fe5055a62313a905dc718bf518aa8c93f67f48abd219b5c1ef902c389f7f0d1cbe3d8e1715a578d4075b0842de494a4a36ff600c40503d16f81bedeb824e57d0e79d387d256bcdf4ea0dafd409d6ca0bfc11de0f612d37c3850747233e1bea2ebcb9a9222c91da0589db7f0157aa8a533eb724fd54b1bbc1205faa4f36807408048abfebce965dfad2a7cfbe4022a3bff0d8496ebf00c53f7ddde628f14befe07b95c4a84ec1a59cae29f4a66245d6d890c40c72241ac1f77d490cecc9342c0f133e5c91735d2cdc10eac0086135e9abcf79b6b7e81f4e46fad8f73e7f6c43674073775014af05c40186392f191b625b3493337da80ae208e20b4f6556a8bbb5318194c0c49a6e31ea0ef0a580c9a21897d07231217f72319fa8037c3150df58731cb9ed46661316bf70d51daca951b5faf87f07b3c8754b674a48fb5e1aea1fed20128e52e37623a8a95b63ca1c7995eaf887b9e497296a0399c143efcc4f950c13f2510c84bb849c4a724fb55731ce5eccc6c3162eae3f48d7517c4329b764b0d6017b1010ddb0440f59c7e163198c61fe405bb34a9b75c267fdcc6e138ba1e098bdb4cbfe569e0d977c31ce3207983f5e900a889bb8be4511f1247562f3511eb018834b642a06b1ad785c4a53c85d0f93c8ae71edab15fcd125d2374e445ebc49091daf660655b4740ab7cca9bb0fb398c661485de5de13ebf0f5d5f0f3a381f4410fdd23f4c5c682d0985e467747c660b15e6f97e53e33e1f3505e0a015e794059b8cfed0219006fee5325042372ed31be7f4623df194d3b72029cd1b17f0d3998ed7c01e43769bb476a8c83eb4fbf2bcad9e782faa9f9344430f7a5b32c08453cc70384c4e7df0ab97a0683d9ff4183038dfd968c72bd4d98308736d891d871eea2f1c2e7989700ccf2b25f0eed53b4f56d3c802892bdc025cab9e8b8512e48578be6a09aab590c3e3518a8d8223f9e05326623eecb860c73ae0bdaa8e8fb7cf806c139eab15539ef4db864f08bdae7c7a802d2fa4d872af8d146a0f70206a13df956983fce7dffe970d1bfc881f946e7b8f460ad834f6ab7f7d2102cdc7bbe810ae8cee2d6a0c7dfa8956ac8336ef9574edd7ddeda1c37d69a3718fee644a4ceb3cee53e457007f2b560e06bfe4d4c5cb5f4d195e00e7045e6a02008814210651e983594d560c99c664a5377a4c1141909b3837c67c9bc6009e7c2251dcf24faa3bf7c428df93b3d6661114ae3e8957d05cad2a2e80349804f37dde20203464336b05603849090799f23cb6d0bb03704cf6e7e7256658c3d4db936b455d1496bca7000bc1cd4498f20741f1f8279016ac33c22b86df0586c3c4b5ab6172235607c189edfcd8e822179ab1392b3b833620bdc922c8ef81327abd3db92708f53a37fb552415dcaf99581d62f150009d434291526cfe8745cf13f9a4641eaa693e717c48c19cb0e4761ddb2fce53db8e842c4fd9f8e4c8d8333615f81618d4c709340e7f2d01a9689b9696b7d0f474c18394eeeddd2c446012e07927002b3e4febc6414fb2278d09c3aea5c81df76f1760ba78ffabae42ce6efc8c9fdca914d5433666991b610615866e6b493ad8b7c09d920b26162fd9f35dc03e5227457aaf3b97ac85c43f408c07c76c744729064d71475b5d0e86b5debd99c966e5cf3043a06689cb28ba34e603d6c301716d5096343b7dcb2920944063a7e3244aa6c6cd8a653f11b4bd7fc6ab0cf4ce5fa2f6de02f1183c08889ecd211677ccb251043fcbd9dc6868a0248a929a0fd21cd89fd5e6dc1d8cb51afdacbf837f3adcfdd0b59f8c18ae03eb168da499b0ad8819c09b070dacab56e4b2a130af365b9932fea70ce4a778ebb736fc1a4b7aa643266509df8a585224098a708e43f14366c53d9b677d4d147ee2eb1eda0d6b0a6d261348e112bb47b793c0c3baf122fdbba04677418319223c48131310bab10d71820131ae25a8512d382b0b45c8bc5f8a84d33c1374209b991a0f78476de7c4320def7f1ac2c2ded41cff34b834a3f2d82c38bb00c019a625ef326b9312d333010fa0688bddc9528a47218b8ad243f63336992f1b9af1fcd3e8f7fa10d86a0bb1ace5796e5396bd272ff4821cb038edfd10e2c6705391ee9173f1843d77784edd89e5a73907db4a6c0196c695daaf4089e4c31deba33e0cf5d3d057cc12777509df56394e88ac578663308aa022c4df3843ac39b70ffa0b231daadfb6ebfd0ada4dfb016de6a200b13a26714e88160fc071ba0111bc78a8a0dbcd236c4430a6b532d0f1e78ebb36d24ffff295dae3c32b04592cddfd11092a160d3a2d41cb9f2bfb570b637b5a580b0b9d71e973ad2d978557c5bb87f787f477dd5ca37479ff154607f9bee7bd08fde2f98f5a5cecef11748347c44b5bf258786e4d147452ccd92aadd9c3c59a84ca4e078f70e83e10c177be4b1615bebbd2c0218e7e8e234710e2fb8be74015bd10ab64120aa31994846c9513424a7fde5d42685f21eb76b7fb7712da70eb29be64c40adbe144123c969a6f2cdd65fee94eb2f1a4e0ece30f441d3acb07caf3708efaa48d1734db0ddecdf5bd7402367d8efea2d363505abcb658d932bb38f59084af8536434f8accf321ab8af5ec4c0b2d5eae94ce27e66997479dd219389e2da39947c8138420e5cf7d68bccd930a6a5b88e5dfc47af7ce3746f4878d49f00f38f89e5896a63c042b639d6676d6469844b4d50c2641daa42025bd72cc36d05b6e363d7d89529300c65fb803fa3edbc5494ae59b6b3a9c28068521a516b75c06e88c759c64e5e2ceb49e43a3d436f1daa5d47cccd8b624d8e34c89d45db362a4c026e8bee0f408a7618406a6718cf5510061204ba9963995b5f1d4160e4b71f3f4e755380f1deef357bb2fbda5831940659dd787409d54fe0d05fb196fa68ed7f78b5c12f4e6a3d44b2b2ae264601147ae69a7fe6a666b7f915edaeb411fa56a429eb6d31c9699c34a7523a9c18984af7c2bf8882fa9a2faaee4da3816af251d5da4aedb182c3a1bd932e1ba48e8dafd342a8e588b54c60bdf353bd69b9c11b18e9b2a945a073cf27944c957d9d17847b5a89b15f13eea5eda27086a7ab42d71911ee6ac64382bbcd9a272e8c714adbd390f95daa9884184d6eab31472c24c4575cc66faa37546bb8616283f0d14847491801494137ce13b1256eb68e1ca2c7958c993e81dd5ce397bccd948d27b4a0a3caad4093ec41465f870bea6ada012803521990979aeafda7d84070df7769313925e935e0a0439ac74fdfd36aa6a6beddd81cf6d1982e33856dcf329578e4dc19e6e478876df8e5ed847aa3a62728abfcb8a3a3b880d48dbf1be6ead8d72b70882c1bdfe08390eb78f8f61e47cc217c217137ff0d3b7c48ad69b99dc3355225af6d5c8a6cae8b91bbff610040d1a4bc9d29cc90337e8aa8a9985c15df1ca6b41f52aeda31f2458b0549ed5fd79847302493af7ae81bc7f4d1290d83f019cf05168bb66758401d55ca29b1a2ea608fa0b55a493b44eacb51614f2a498b0cdf643d72cc136946942d9d2640c0c52b5ccf6f8efb46684f57cb6b8e592b06631b216af22cded4ce711d6ccfe340c3bce19eda7e8d0ea898f9717947c94acd9fadcdc955d2f92a3a62a5ecb0dce726d4b9588e604cb23f001cf4bf09594460ded1d6ab525a794ecc4dec3232ffa63cf2867ce5654cd3a99130822a5b74b7da7bf1e6c711a72091381f01301448ddaa248ebc0debf86f8e118caaa4af930a52ad4abbc4add023ca09c32afd090b700679906909e72b862c17131f950f50aede5e3f5c0eab59d0130f6efdb8cab104a33ba140720553ae79710b3b629e4a3e46d8552895c8a0e3c36e3e77ab12878101aec9c2098ccd16556ed2ba4b032965a370f6b7b696913d717eea929cd2267cf5f9080432c55e7607f9200e39a81bf9c967180942e70e9acb5f0c80c30ea92844829aebd9fac5c7d6e8c6926696cdb533245f36b1f4426cb954936f398cac05342bcb58f1b0d59159789653c46df07dec07ddab655a8bbe326aa3ea8e86146258d25433e9e1581006e9b08e320ab25fce06511fd42c2813997242d1ce97198c4aacc6edd0d6e6b3d7885e1a7be8b68fcdf911194dbd4b731575eedb1e7608df916742959ddc9c0cc779ed9d25e7a82a54dda61c4d009ac9b2137c6ff39f55616465403167194c2662fc987741acc4b22078384c1ed67d2e6e302139d84e1ccdba512c7ba623d020faa9907a4570c75de504c0f6085919d81cc0e93c4459e6c79da0a3d5dc8c0158603c73478048751dada6697206d9a016ba13809ff053dbd9ce26fe8908506b70bde177a9a9ada38fd76263a1740a37a379e96e6aceaab2bdce487e9894a0753f34286eae6ca7d05d991018bf9122d1162e0096e4c756fb62858b7e3750d89fb1c289170d468ef277ba5c88d610d05551f24f3f8d39d907e8220a51115c9456b41e12809e43c06043f15e0530c412d322275ed38ae75246d82fd5a7b84379a9e921bd364e30cc703023fbedf5a688e3a8c4da99c78d99a7f1251508b4ad9707e25c5c91d99b704d9ef8af77cfd22b11d7422e4a7ae6622d5eb3a97f344252530d3f03e0b54c1a284f3c277a34d3171d35f3e830bb03054309b000d6d510eb120358cdea6091c8d592e68588a4928578c592a0e0f27207d908d175b734b95a685cf918a35d7c8f9ea0c953a146dc7a3e6e73b6faff751acad4b6d6ec1f29f453bb7a2f05c02de800f9f2623880889f4ba503e898e55a6342659a3f6f6ca586aec522f475850d190bcbdf225030a1aee4337b7b358ba3b4fc23cd7eaed0503c2475097e394d47be9ddda693ffdbcb9ecfcf97a461142e9837a92c6c818119163fb0b778c792a1a06170fb6600fef109861ceaeef0a86fe262130ee1f31767619791be4495f50c740220542cc543824a45efaa04459498e4b20062b4c3b773f8012861ea233f2e51677436f2f251161eaa56df25e66d768cc23c90f66f7e549b92381c92c2d072c4fe2300e86b5ad7be3ed65a9adf9b28d03f597ea52762b037c8ebad3fc5b3480aa27362bf8f75eca2f028a1dcd7356357fafd1ccee6e77f1ff486de02073bd047c716842ce7a6ecccac72d21fc17c1833d3c979108e3d31a6fc03969413e0ad4f84f9c05bff5f2b052c882649b06c494c6339bc8084a2208a1101836c3554219118734f8cda4d1bd3f68be77adfcb61b9d52868463c2bc915c1bfc7cbdd75e78a6bdf11fd49da28ba74238667decea16afefb9ca184705c5e57254b17517469579244e1db081c7aebda6ab0338b0e5934a5745b699132abc9406e4bcd6b7e2ce7eb084138afb96a20d4660d9596f977ba04099ec274cff59d45b4c99ae5e4249a21048bf8ff9d8e80c0c5ffbb8e5a3654dbce331bf058ad3fa47fd00488f7148e96165517011abb74c484d697b8b315d8d05c29904297d23da776e9aef600163d747d397921b821fcac2ca7f98175934aa06e8092babc902f63226290413a19d4363b2046c36351e72ed91c3b137534160819408ce14c9af88d3abf5dbc6da9798dd743ab22974d630912eb43dc40f8ec336c82ee57eeacf17c31e7b5eb98f6934a1124114fc22783087d5ec0f98c7cc238b81cd6c05442533eb4d23fb60ba1cafb434a566b6b15e65f85cbe20ca7cc5976f925218da2cba6bfbc50c00f534139cd9a277450fd62ed73a40ee6f249ad2ccff8e72458944016c2674e967362d38924cb24aa47fa801a42c87ec4002820d08b4c93ae72d90fefb5b50404b5c0fd514683a69725bc23b65dd0b46b821a2b9d1fc56a8a4d8aa2c6626598ac4ceb897c3c98bdb08a7ac8fdfa3c2cb39f745d5ee43839b4c4194265d846c7cb0d7f6801089ef94fe2fcd0f7e48b9c137b4aff9007414db37ff94900718dcb741ad8f5801e88c10b7c784b017dc77d879e8b10e4dac44aa21c25cb1eeb3e89b717b7af20c1f743845cf1f51683251d432abc368dcb4efd6e4fb1172213a0b9c6299540119ec251cfd447e0d59ec5aa96df46eceddb9c37b7ecec14f3e305a028430264ac7ab2087b373780c9f6916fe76866b2b2036aa2bebf694b16867f5128b4dbdf43ddcde05bdec88dd73e4089445f610f54523d4270922f549e03d2c19157864f717df63f867c2c93a7339b11da545f644e2dac8ab84d016a893a48d4b9deb19d4fb2c3b17eba01070455010ca35513f1e7e1ff05e0ffee712acd296cc3482eb57223e7766b097e1639ed7d3e4a64ba2c69f4e10660b5a9d60046abb404b0ce8c2d2a6883888801298b47c2902d9c74368f9635e0e34ad09d15b1f39ccf40de2201379a9a79dce0352c000f490cd34885a4bf8610409228e7e4daa4501a805e461403ff5ffca7cc2908fce10a236b0e56fe528101f099c8c818c59608048a5ae90121f644112a8c199dc921b7914c0c000e83142d4f01923bd40cb64f7da3bbeef54a9ebfd8609289f4f9877834f1e865d7ed56fa8f48e5998e4f48d71294c94693c5dcd61fada008e871429f48da5be3e342fb87278d58b193a2e1d2634f2fb8c2bcd770e770f66985c32d26ad400f44bd3b9261ab58f9adabb4093883ca7ca88cf0895bd1414b63876107a82ae877df22077fec12a2765c2fa9f604795259b6a27d8f703d0bcfca1183dfbdde71e90a019b0f01d68cda8c80ec6e5567d26e1bccaaabba2d7edadceb4981d27b03c51ba39058e3f897c8c1b3db87440ae4915b496cfe0dcf0869dbc4ec71df0e96920c398fa2e096a7935b60e5e7d1827886181ab672b231e17ddb912994f8503902b0493f9b68997daae684a4b061111113c050250b246d446ed8c07080f6e42539a8106ca6f815671679b7ffe6431b808ffd83be324e891b820dc7076c4195e59a1d6f11227593e51c2435fb9404dc7a48d6df5f682edb8ef0b56fabfddd083c3787ecc945d27ea728ff92a361ee97fb7508cd86e00b256243aeae00913e339043890fb50f12eb3ad4064aced4e82348a8fb398e4a5d705bf2dd8cefbd71a0910f8a22f6352fefea305fb60ae13754284bfc25127a43f567068393b0659adaa6cdc3256d78f71c0a990e99018c8ce331e553d490f5610c65e9ac71b90c88d9c161614bf8c8b90933e9abbe8ecdafb386e48d9545cd6c844ef659e4e345a6d111418cfaf840afdd4dff2f61bde6c168d2f2b686d81d5d3427916a10aca59b60772196f41dcf4388aee346d5fb88ae81e064deea1d857e32f0888848336423b4616239ef3e202ac64e85317899651126822de5b820a0ba4701a087856c3ab5137d3e860b2df5d11b98a210d1106e3f2b829a5a418e5d7d33022d335b06215d9de8973b72c3e37f67cabb1c64404d8abc3a5905ea68841472bd404566a85a228662d033061730304ee78272f9f75e5b0a15c3f240221fcd555059910ecbf94490f3bbf326b3235e0e76c68e3b4f877fe8365ea9d8888a1817241746b15c2b5077375001736ed8ad43c1476ffb6df1a15aba4b0b6e87f0190448107d21bcd194532679fefe788b55648ce2cb44b32b098f73e64e0484bc1800796f68070eb975420122e72e774b0c4587a277f8359d91ad7845083a6472dfb8bb5d3d5bcc4062739a315d830db05d273473181746463e1085f6bf7fe1845e941d0359e56230c4a850b5387b140c0be1106ab5606de672608d6352c1a439876217d324a1ba8675bd6cc79bd5d4e91e3b9307f2c07ed9685b071a12bd889299baaebc78240d232a146b84242a8ebe70d4481a9e7764d645734863c1f132d19295169023001f2ecca761e33c158bf08265865609ab129cd6b13eecc499caf05da682a3c8d7a1ee793fb8d294e144de02c8f478d89996990d2911a4615f33ce723b2331b761f3a94e43167b82f4281fb1c0b42ab351c19114c0bc43006530885289537020fd3a28e8569a28c4df008192c00d382e5c069475888b2b375bf2348ed9068321682aac7ec4c2427dcf7bfaad752a182b88a628b04bd628deadcaf6502270e0bc71ecf3d4333575a7b14e7f9470165181cd76476ccd449f251d5415ef06e9f4316c9f25c18b1fbcf897927cff862982bbff4bf6ad49f00332d4e9658c2068c8c491e8df5a64b780fe2cc9c35097078527481a18a5c802df18e9f8cc8f801eaa250e1c12327babbec4951059416aa23923aca025e9540d8c70639c16b562787d42c3dfa20c62af3a54d2391862e98a90adf74add9db43c77616d8ae5bc7409a309d4ea8fce29554f1db2a808225c9c849ee134d417545bea040fa200382321390c10d44d27fced25e6a4a1d9f41e6794c168cb0217d0acb2fc7035dbba315d0e82150bea0c025f7dcf304ccb08ce7f7b79050cca4c0d4dbbc3ff3507fb24c7de5245f1ed78cc5b58cb9c39c01286fcdf2e2e2818b5b69f5056a62ef24b16ac372cea4d9983a1f264f188d0d5be9e0405874e6a393241d900416c679401a07d41cb3ada26a93b26ba10b7d9ba78406cfd454845c3e8b0f2f30182de7dbcb6acb5d4783c11cbf2fe8a9685147ace5188b2fc0741657cf4dd9f7719607a93d4544000318ad06c1920104a3657ed2242e103aa4c42fd4e852121909f01f91092a22e1e87b22201f0517c37403799ad1325d4d18a597511960e88ea7859a2e7c6eb9935dfde0e961f6558e0e2608334cceb7def5761f63bde5af9628d3d522ad0fe201f555acca1a05f732183eb689763c8b41d48514093c8167c37fb774fdac4961faab5fb7cd441c92269d1116d5fa6df39e0cbda52c22c3f74855bfe82d97dc4ff182622ba290a2e0752fcf2a6ba1cefaa10c6fcd5f9bae0645a28df5e14c46ca7034734e546860a7c17836fd946e618903d140fed0c99c634ad701837bfc0d437a51fd983ae20ea4884c11e386b2cc0ef47550818124410e1a947bfe5897217d5f963b305a3fc0bea952146a82c3e7e21dd226c329e848e2275e8a5699965abd3fc5bb137c1022386f02ff58568793025e9751031afaba8d77018d665b84e69373ac1feb9b5c26b27a46922a2a6a374194f8e32f849b2824b3330eac3b6298fc8b08e80855f05cd1ba36e1c00be51d9bc80b2d469b654d1fc21bff2f770e006d61dc83fa291a8aa936106c111733c300c55161834b55484d30d8f5246750892274282a1f8c7588abf1800bcf84665f8a1bb83b6f2bdc08cfbd401c854b1075c02df1b10f042507a1bbdf03a3614612f6f5de9290787acad0864e0640531fb5e5c0c4db851f22f92976f1b88e67df9a5c1bb6f6714ddb580e4bb890a7e0444c9d38bf6681b88359c8179609ae1a7ba1ab67c246d5d2abf0bfd038ba7e9a0ae79281b13fee6fe024f6c517932abc6322ca44c61ddd2cf4360f2d68b4cb437ab49facc2fe09d5f9ab2126b894d2b9309bcd5a3b5c622f28aa89a5ea250c23e7f8d5d95f7c302818f6b6c2116c826ba67895272d8de2be433d0b1677e6e5645af4b86e1873a8af4377d87e272b1008da4a1be0cb4159e36c177df5774c094ff34f20484369186328d3b0c16fc07ff7752a52d6b068a7c6cf4a7670c5318f4be2aa7a18d68a1e541e8e5bea29887252a024db2461017275270d8733c07a83c0d95ca6a4267f77d932a39de744ea88875cad2587b041dc7511689d2b590b84dad4db919188971c87443d76543f111bc0c7ccb6ddcf88b653dcbd942676dda9ba2f8ee4ce3a55437670d8e480193040cf5b244de069e2bcdd400a21dae70f7ddcdb43530a15c088e48132e98fcad91c749b2ee05e41d027bf472cb40c4b11884450e642f884696470dde9214c22da1ae6f4e92b4dd7fa1867d6f46961698efee7920dcdad56afd2b6f144a940215e5e3576e3d8c12c456f92248507f7b8d25c1e7d42e5f79ba37a85615f7ee088a8d41eb4a147e1f737febce79980daae320bb0540074b60edc6d2d45ac5fbd3b405dc08e53365485647defe6cef5ab1cbaa51e1edabf3d7de2335e2f12a2d74e333bf7efadb7c7e5c8e9fc2a28fcbb7e4d9e3d88bcd7f84051901bfad66513fd8847ce14391245c4bbfa0187a927210bf8be0c8b3aad8e70b2445994021d249108847ec167ccf34b08c281d66966b7949f4238706dd30008f3f9154fa8e85fa5a137295f1264c2a1f6c1b681941e41350c8f8e96fc89d2d3e98a8a6a2534f702a7ca8f3339d400b176af6d3ee5a1d5720a1271480d4b75882ded84c09242221f37301026a831d044351a90f2d4def6630bf25327d6d2f94c48f4317878d81a7da682ba8708b06b1e588d66a4720d4a62cdd0d3936485923d107b6adeab916558906186fc474ea74c47e9d577f45fe1def013503597452f3b86cd9f39b0cbf9161d778ee72501118accb1760f6d5cf87a884e212936456431ab74d1fbd94e7c08538331f45710b2f79bd38a5411434062c1ac97ffeeb7632a7b56400e27f88e542076d0c533f6999c801d6c991fb004a45549206f85360c269dcfb2f283f751d9024e334ea67f088b16cac7bfbb75ea95cf727281b75bae3ba1f712fd84c0901f12c582009b695f2e485c0856af44ca0760e08a69199162a1df3c098979dc62602d5442fc97c4a10c4b59377b0fb8d74a07e753c53ab440184e130e83a99856ce195037d33372c3c4301ad07c5999efd916cc1c51fa5fb7e1058dd1fd193e0063ed04107fbb45ed881a4b8a7b17c959b10208cdc530bbea49eb1357ca33274c8551a5e1dbee7bf5fd33187e9a205cd8a59ec50e211cdf8048a554400088f2e800a297e511a15944c94debcd4fd3dd06d73f0ee96f61e404d5967ff8686c6ca95e78101a04f6bb1f7a0400da3b11b23bf1f27f01c6b9ec0ffbea3a78b0c471253d42601ac8b03cfc0a812dec4fe60dd170fafc1f5a422ea40deb5f1808186b9572c4041601e71ad06e5686b053bf0150aff2df3a8b083906696bf186b1d419b68920dc22c879f826f948f711aeac43f203180aa3dffeda9fe36003456f082e56b4cf7a965a59abdb1aa2c213803ed108b7d3069374095cf1aa353e4d3136f2613ccefa5fd6c0520006b7e2c0f90d403d1c622c932ece86fc903a5aa4f6f507b28adc85a3a177abe30255ad27a87f0910a62c0043d3fedf56a8ffb1307f03bfbcd40bea077db989ef341bc5b7edbd791e12ef170940e02186ca352ed9ab816499643b5bc053d243c56f9664d7c9381268d0163215e6ab9efc009d5a56f21925fd2ab77c9d76a2925e7f08ac065eba7bc3507a08d7b795e088af7839c289334a4766b42c7f6bb57122f0b142d126880ff8d040453a2f54fea73c77ccd12b33ab59d7d1493c00750c2ed7fef009954ab08e75c9cefe8245ea5404168b8f6db8cb099a88959c57b7af3c14b2cfb0d597cb2e3d6da97fada7108b5d9d955c52512d54a567c60450423079eb60a9e6993ec9cbfbc1c1ba2c89c481c2f81ebecacb56c5db5ee58e54602b45acd36fe4455da6888d4e09a14833ea8ff0e11e47b4fb26fd6e0472df65ac3af6386eb0ed00cd50bd4c00728984a12b1f029d619e9a32c7b62f1f1a1b2ea29f1c8d15d7cf03720e4c7a27cda538374aa4d17dcf6780d3d86ec042216714d657842961af3afb99220fb56949d51858ef447d9f5ce10cbf2753b7e4923497f256941db3f29bd64310b3523b0f23bf9c04032d5585deb86e32218655881ac0ccccdf1ea1b819b834c07092f1cb3b70b61bef764830ebee8cfab1542d3ec2bc9e6679791afb07ffaf6464c562fbe5e5eaf18a817badb0bf0390f16b2f0ed3e9c2af275ac86da50f0a6d2853eec2376073f835a96573f80473883314d84407d7f9aa7dc6050c4543047174d1cb219a89a5c66954293b282f40dd74b168041b7173001c6f578e05fa4f70e252a11349b8dbc3cf4b2ccda116b31dc5d0764a9851cdacb9db48547a6e00b9814405fda5385a875d26edc3acbe64299c05a9365c487c7c912131d236c65ec16c8a98230dd5d465de0e95cd44846f733c080fba5f6085dd90032453f9aef0473e397c9ec360838896f419e38ff36da131d4321489fb19e72f03104830ef9519d7f451f75c4495895e7702cd48d444c43d06f5cc309993e38542f013a5d3128e2778ece72416e9f69c3c6bba9f9e5a5cbb25c5a5ea1e205a050286046ab92703ec779530f9d6b87a101190e929d3fbc6f9adb31651bccb5934041f46c287501bff45799412cac75e653b575901a08da94299be729bdb478c7edca57c86d0ab64becc24aa80349a48edda78eb9100bdeb6981cf9f680d34374b14c5dac5c5df6d8c4fb481f4b5116244fcda36d2abae718757b5e8717b5663d14551340601392b72159f80ba67a9f6c222410fae5cb90f00baba63d50d1670b57f5ffc31af8844669ce5aca89a30289487572d3f8baf288a48f86d4fe09ced093eb67cf4f47106f3f5b5fcd7fc5a4f892bf29ce4d69b24fb673e3bd628aecc20c5b1b2b36ad3320626d3e24a7fb405050cf6298f49bb5953482e178b125db5d7b7c0caf03c2c15686043d7f38b031a6376292100760a777cfb3c74c898970d122864429f130437fb3ea0c80ab75c33c40c3b339bae26266ec63a14b3a16e0442967d7d1dba92a286bf1df3bbacc01b460500d2ba7784b24b60c664530115fd98a5031097c341a9b0e348a9462c00916039e321323a226cb53c17191f3c68679de6dd43eeb3cb314beeac9486cb18eaf3141841458d717f53e8db2df78fd98e4f5f077c3008a178c8e942d8eac6e4464482c40a2f03f585c6d23e397714e9a4ed146aab3407f08d647496f70bf295f0d3d7800bb5e3aa5ebeb4e4d820c88f2fa44d2fa6007fd1c7d3601cfbf98902f4ab85a98eda30e155e146393a4bb7938352c607049df204d5a136789bb36eac81e13d19a1df8e0df34196227b90b0d36dfb41a4ae1787eaa1e99f7f7f8835a1901667b141bb91e0d46ba9a51f0ee776d5db040cdc8c5e51d29b9d17dc5cb8339a96cb0f0fcf3ab61fe66c5f22c624fddce878835a20741cd051956e3979f9690e1fd1942a10918b26931e209d670471dc5d13a3b1e7288c5d11075034813e509649fdea4be8b6a8878e6a4209c3949ee220259ce5f3b3713aad4898a50280036c68c781868421d7e5d93f1e3fb6ab83004834a6aac94705a13c588bbaf7ff48a2fe46cc8e57fe895f7d1c22c6426eb2cee0ef7b9ac27e8eab69d91cee22841005ec075a501f606dab7a018ab9a454c405e99ebb221ec9c138fc3fe0c18e52b519b91a87b3b32db11f4fa817529ee5c310fa80779efcd3077b4bdbbf2707ea04730ccd875014ac28de2cff43ff3f73f305b83d9aec2fb1621590237189ea4f92ae3303c35ace09e68063d69ce88116e959bcf8d32714c97996e4bed7d18e63bc253f74a28caf7480747a881893f9186cdd5ead20e502393f6f405546c48e153f09d9155874da75a327b609b72e6a8808a4e98b3ac0bbd8920eda884f21ea4260665d2858b900f6160e2263488a0005ce35cc6f874f8ebb964edc7972fb1496fe75b8dd797c6316142f6d6e595677354f51bc9bf87178cc0cc57b6763ecd92eed13168b126bc018c4b851c998a100496f45be4792a0f028024298dc93381046182ad91983255d8fdb9aea7c7ef951031bc92095e361a7e38bc9d467ef12c7440471eba209dd7f08efa86517c4a06e6b447aca91300e867d2066b6723ca5b0815ae2bd215e0971cb9ee1eaada6f96702258196574d0df992668f87a870e75fa7c85b368a29269d9650814ea04371b41c3a87f53238c709cc7adcbbec28d14486c16d2bfac87c944e53705fdeeb6f9bcb7ac3c8dab08914c5ac6f5ff7f58658782a4a9c242373ce46e1e5f75b548380d448bef2c93eac03222a5d2a79cf7b2a1dd56315f4052df8f2d5d37e7139e86d13f6afa942f728f9e65cd8b440c0561f2c3518b205765c9e5d1f54d94508a689eb289a2f2780c61a0063465dff382926f3d1f0bc837146bee8481c9ee1b909524c14e30e45b316c8d4728fee767cfd92d2757eae292e57c5c6b1c601140b1a27cd3ca861d34e3e7d6e21c7ccd45bfd631ee82534942904a44aa5857266431238e51f646c5c14bae944689071a0419a32b55a856ef746242363d55d86456a6271b5c9d8b78605e6271537080e919f881f19a3716e9c167f78a0eb72681c34db71c4dcc9790d6176e20a7f7b6b57adadacf2da26208cec230bdcfa4f41ee42a215e136b03495e6b6a743e0fc55cc280c1db845f98f2005a512187070113396950b387644f33a69327e5af37347d6552ab07c9886d42cfea88657bd46c1685e7cb723d5c81528f8a9438a88c5c036c2bc6963ac0dfd93cbd108aa5e6a5bb494aa27da9fb9815cde36b39910475b98436f28a03a71e35a0234d21fc92d0e7ae35b22b939925a8cae3df29f8a77f3c061e72dff00967a0ea68a92794ea9fbf30bb7d80d4224e64f638b5020e82e08342aa6aee59b82daefd0a39115d4063aa22d6495d774ce61509d9c55d0defa18efc67765224e5edd9172b0fe643d4983e7212721cd5908daac5034342b0f3d0c971b85d2494febbcef72579d7c01fa8a422692067c2aee3fe038ceb24b29065bb504c2b13b2c9e862643b05e72df3c73e8775e1cac24c80e47be6fc57568eee4d9587d7877b0bd44a7e178ccc8d256c77dfa6921ed4f9f192273c4fb374e6a65542fdf5ef378532f591fa937dff2b39d6211cdeda5b6b147866cd8ece0ddb46a2f93c4eff8f7d01bfbf4e90466841c5b59da8d4a64366e842db394874d45c637874da478c1516b14c4052e8f85b0ac9c9694221a2c2cd67c482c056e688f52f35668fe3fabdbab5012f39f7dedfedb9fd6c7701de9a2e6ec72c83391a3c86e7e449eea7586eb78ce09ebbe3fec539e26b63eef64d85d65e3848359ccb6942db0ab641e6d0a78215ea70c0c72a929f5eb8d2b852562f9476bc13b775ef87d56908049980b4aa0096e3c6de7dd200b640acbb3a33b3de888c2f5279c3569fc64ef14e4baccefa5da6b02b7797a33900334fd014a610d4b59304c524a1beb0c20c05b2d8a08662215485d68fb2d3c2186ec530a70afc1b3cb6b4e5c075d6b158f4d5fd07c7fca3074fa8a863f5e9954c84ba1bb46a8fa9d29788100fa056b7c20d743e26dcd1a6a8d342229b4b2bbbbbb7743045704dd045c8c5bbeb6d6a8abe6b4ae97524ae396afc5f8da4ae7963b060d85b2f43a84807d1a3fd3cffcfeb4dce3e6d04d22cafe24b9adcc197052e7eb696fbd3696f007e00c21d569f08a4957b05ade6c3cc099ea34784510a4caa0cf8790c6a34f1c7d7e0c4e1af068be10ec71ff618c79cd2f28f6fa22fd7e1c9cf168fb6574fad120972a37ab258fce3995e8cb89023c5e9cf44e79a7d0f1460077cabd70989462bc654b25131af5106775d82f5fc684c34f56aa74c825493aad60e974dba8f0e21ce26e20c1cd39693727a576eb9c5b166f6c5d4912439af3e4f821e7b483d40149dc33d380c994b902f6e0f6f951f003b6838c14401c4310871a8f26ebb047b4d74e2b4e3a6d038963132222182cd6741ad1d78a6fb5f66e8945981f3e7d7eaf58a7b595ce5de4e5098b54920e02095b6a98d5ab4b4853b0587110877cf81e97e3d1f6eb258970d269af8a2395928e19b3e54abf3f8958a2930b81842d3ecc3b668b54aeb9de0fd36b5dd0319078b0d30e6b561eba8a585c03270f724a3c8c87631112dcd3a113445075f93ba244424575856a4e2a8deed553ce1a31c6b83e26422adb7c23bd37cf18ef8df7721ed439458c5841818ccfb4906dced45aaba68811faaffc568efd6814e87046564733a243c73fe704a233474a37fbb95a9c697ec00cf2dd4b3fdab55ed3e4b88b1793320f0eac94ca31a259cb23d7c35b6bad3ad2ca295da1a734bf928b47cee9c5e10c761787b3cc7a17f7f9174ff2b3c80198e3670e11c1aacaaeed9d4818686c8108815539772d2fe628b5e6491c4cc5cef37c78c4fb135150c0f6d1fbfa65ea4ad90dd9adb58413c858bc7911dba21d4576ab2e0e6799c72af73a40cae45b384c535aef7a7dafa5f55f38443bcbbcea87764625340489b5e3f18365c0c3afedbe302d1e8d0e6b56dcf4c8614fb472d8936bbb78929f2189b329dcdba72a1c8f1c8003b7cd67e7fc5629c72bb02b3cfcb42855bfd7122fb2f6d0f8f5f5eb47373935b1b81f60bcfada83d3f33ccf93b7a3498005d33c56305eedf18b57585f94d2a007dcda4b4c4b3ebeeebd8e551e993c49d9792c175bebfa1ca75459e0db7b0d35d0f658b3e397d24da6a0025ca3b5cd1da764ad14cef923b51f3bb5f967df7befbef7dee824ca7e5a74526ba6f5c6c731c67c698c357e7c6c37bfb13e86ed007d0062abd269118948299df2640f28a9fa4947adee6937bae721c5902caebcd65a3112129cadadb5b6d68f1cc6cde9e6167fe470562d8f4e51acbf3c3a29f959f7adee95fc8cf55ace38659c5d6cf2b8caeae2136c8a4aa2924843e5af260f3f157e5d63f2853e067b54fcf8d65a6b2ca8564cb1de72add65a6badb53f67acd149e78d8bee8d550515643764b1d66c690a52266fd0e1895e129b90f068704d0a2ae81aa6d322958ea52507419452cafb952bd1f73c6c23ec45f3c88438241f4d9b2ea19c5e0088433e9413a44c9e10390af34286da1d993a0deeb9f8078622a4ed6e33cbc85b9032c9c2912b19d6c061220a2c0e0c395e87fd1d07e04c537601fe84021880334db924bc09247c929f8d50f475c8fd903a3e5a51914c96e3a3fdb3ec66b94f2e55891d8cb3934b5244f877c8117d92247ac82911f12564c400000c1c4137806cbca0c0c5504cd6a28617d8045e7eba8eaccc43b769bcba86ac086747830bcdf0e93ab6be28176fbd278315a3dbbb00253c8c0b174544f68edf27f2c9a5396425095cd22087ec8fc0a1e4b13f9a74da3074d0062495b07277c1bfe0d86d6161f587bea68f74c556e766aa15e1ecacf7492649d5ed4b2a59d59aac8ed5627759e0749aaccd6ce40339c21a26a626b2542192850a6dcab2f4029217908cd1e234468b0c59a4ae7ee8c251ded73b6f4c53b64ff2b3d7bb3853929fb9b48bc319dd5aee8d47f9bccbf52fd707e790929ff97c32a875d7eababcedc73c76ad716841ba85b89c736eb5b89c73c69bc339e71c0be2625ccd875eb9fc196df16442ff39e7ecbd38afcb5c5f9816cf46874e100182eec36dcc5cdfcbbe4f7d16c3c56aeb500c172e5bc79f4ce89f7371dc8639e70c83c5606d6dd5691bdc98f3a6f79e024a62a9d59a18f48d2d8032aba4fb8d33b262c77cde8d37c698d54d7d2f50c61a638d31c65ae7acf3cdb9fbfb759f24bb4e63205288947539a98b9359f55fae678fad166592631acc597f79d4ebf7eb35eb09723f28a714e57acdda980316ef10877dc82105c1c5d98b0319c225edf1e2d3e01476bd7655a9e998cf1e37ee07188feb708c9612f4fb5aefc8f98053e8d6c6928b5c4733d25d57c336d9e694aec7759d0bacf58b79bb6e72d7cb72d569508aab2d791b7d63b7490d94fcece7754019c4dba848caec774839e7ac94b5074086586927eee73d8046105a1e86cca3e8247d34d9103dbbd9ee56acf5c539b758186bfdaed7afed66777e1ffe80d9b57eac73e77a97cbb5f3d6376fa016abbb3963adf5c63f3c3e491e563b69db6a651dd0280150868294d914e6908548dce6513f8fbd3981d6db67a1f5f6e312d7fd70a629deeb13305190462c40997dfb29cca3b82487ecdb979c12f797c39e7e58eec7ecdd177d786cb281eb8ae890f331fb8bc7a709b92f3645a7199a98b07e2eb663a83cd5d0ef8fa172443f794d5266f10bfdc6ea58ac8df1cfec1c04280fdddeaed35a7730365ffb16b1d469910a8e522c291b82057fdbb66d7b6cd569ac9e258618dbc7b9c8ddfee68bed6f1bae0f21bc74bb57e7df3890b6b96edbbddbbdd73edc64fe2e6f80b5954e2c4d71aef25c49751a940229088b9b17c5574bae34e9b1bab2d469b0f6f2f6eb05c4de2f6f7f8c8d47a3b1fda2d82ac719020e95b4cff75e1bd8fbe5eda0099b024ebd289e13db7bafacb4281b3165d5691b781b7bd2687bf87ede94302ba63c48a7f29a21a6f66828ad9410626964adb5b473bb83d323e0a23202908c942afd012cfa14522d2d059991401d18e9f58df41562af5f03e847b1b744c72656ca545517aa86b8aa4f23ec719fa563d7304e38bb28af0439f33a0bb7208e69c1118f5ac1d461c7b74e6aedc5b6bb97ab7acbd5d6ee5e7c6bc5f7f19631461d10885d7f2bc46eb7485b41f61b81d8e907919d4a21d5d0fbb6feb55f91faf56b610a0971045698589ad9afdf4291f9f46dfd8a50a0c8b7449f7e6faff068b8f388b3c9e14c4619af642c02de987f634792901282a0150cd365193aa350d04b05cd232a239ce9854e6d8f076a7ba26a7b74d873e40a3d6bf490e9b4ad870bd52344eda2581dee993958cf92ac07864d8f0b79e6ec3c6b7ae4b53c61ba3c5aac7879a25a7930e0ca8209edb09607871eb54f1e185e25e8f1f50f1e3678a06881a716c3c3c5450d8f112f6a787a00c2b3a4c7d741ae3d30e0c48042c69d2f9ddf41a2c7d7fcabddd9c08c3b191072d161edce0b34621dd6b278d3e3eb096a595cd5c01dd6b220d3e36b28eb6e05ec98b103a68b9d293b52769cd869b2c354870475aca853a64e08ea4cd591aa23a58e933a4e7598b0d0f39a7e2dc4237aa0e4cc8ae8206658f2905f690b40692c196f0ec58f028940f1d742dc920589a75991bcc48c0289305b885165468dcca20b4d554ccdf494114e1a97eec8e0643639509a599412c9161fb6c4cdb158dcfd9fb4a2694d80408448a3175f05338872e8f05a2e9fd70fac450c2808460c19cf8526a8212353e62acd1a2b683cfc48026954f4dcef30c0c347611e1de03bbe5f4358c1de7bef2f818c93ee388def68f0a2d7441e720f508a2262893a1651d5d155607f1e458c3d2f16fbffa4528e8f9c12d1ebbcf1de186fd62eaa4c2ae719197dd67acbd6d13dda98b8903092d6dca63e16640bb6ee767df5d87a709ab5edcf05fa828e090c838d014bb7366e91019781a75d3bc734e8346831d1db7ee1b337e0b1bba8b13670e9d7d640495e928ffed93ba8b7fa4bc3360763e69afd6818cb041f223026bac51e81c7d901f809b2a9cba557d4082db48bedc508c04f0062fac56ec9e000c6810b0db45dafd442e9850eda3edc47cc07d06b57c0ef85f90083748cfd23f4e3c50f18fbf2ee87fb213b10200f7831c61a3c4952c7d0bf5b4c102428880ccd77ac4607303a78fd6d17320f6278c0f58cfd6248880c219f16da401408e0053043d3d8413606c00720a427d8306e7cf07d4043d7d831700c993164022ddb32000082100835f4d07e1a21f0d8614f3c1a21e8b8b1738e8f1cd197a3ca8b4f934b7788c910136d637f9c52d1279962877180009f24bf1dab78bce5f134cce3691e8fe7f1b4e751c5e36decf86f07974c302b356c7036d430e1a8e001b03387fdfb3e496a3632f4bd75e4781fb113bd9b245dd7e03a96d772f9bc7e602d622e5e0005c18821e3f9374388c604356674920bc461df821d9b30f6bc58ec5f26ebb16a0379200f7bd5b70d9c0e3902705310fd7c09e13bfcd2260810beb47132a48d920f3c3b0378614600d9ebf00b9b2f42321b2d1ee4a10ebfb079ea20c8ebbca68abebfac21f3c128c2c78c0ebfac795202cac3818b3401807d19a18a22faae020333177afa9693f432b3414c090d807ec8808a1830105273418b2f3d7eb058008382a46649df474a46af75fcd0a3bd6595a462e251c925c92497368fdecbdb7b07c7e2582e3ebf8b1d2e582c9608226c168b75c1de3c6e6c31d8441c760270d843e0b083c0611fc261ff80c33e000ebb0038ec4238ec1e70d83be0b007e1b003e1b2ff805d89c3ce01ec2370389b71d83b873d89c3be01875d030e7b061c760c38ec1770d87b70d82de0b02371d88f38ec463c384d2a21e2b07f1b8bb579cf5f01ef3e078f22f23a8854612f167accd4008d2b3f587123450d104edc950f6048f3c54e931024785295507d5162e90627ea78411365bb024d9f8f37301f43c14b2814c734656b62a6cfc75b0d982869e815d426e5893e1fe338384ab63335122a258ad3529f8fa1706456e06106a92778a800d3d3bc43a7cfc75b06264725439f8fa368250c0881152cac9058592387aa898289884fb613777aed033054310102278e340185d570b94b94a0cfc75082b0552ed49c79a9a838712523c5a53b470686534204dd117507a88b65064c03bd400c9309ac653e8e4e62617a7c21f958be272d1d4ed21ab6745634688daa024d543d89a2524a5c2585f4498aa5cb115cd54586eda4525a4bc3448f4cf18906e14425b1e9cd1194d270d5e5cd96da1b2f5dc21a133d74f9584aafc3da9b20de40ed1d3828247d3e96f2a4cfc750523974678cd8e084961ca6aa3809e3549f82bcd10226cf973851b5ae569be01920159b26a8aa257aae3863817e060d9a111cb953c60e546632adfae4f07851d4fa7cbce5409b88c23d71a1cfc750b63607c80205030e786a4f451ce9f3f193eec68284625f431457aca0687a13474c75d2e763a86d8779a7cfc750ac7e88a20d90c4052d60f69c799232eb6224b48012fcc0a60c9d33783430830f2140454045d0638c1ff3629594719cd179192123ac105b9d523275e3240b5d6013dac6b8a9809435374a8460508153f8f31eab8ca7ea006bb1fdb12021193120785414ef8c1e9f97c16e6a5de478b111f43967ecc68284624ff3a2a04dfa7c6cd758b9a6c70a05afb27cbc441114897b8d1c91441523a4c802cf0e675c80c2440228534a669863ab94f8c0a684980d38bb44a741323468556373a60d15b53673baac7191eab00e6b6d36d07787b5364f6021b455a2cd9531514c47a668e880dc439026b45c9680fa8094a82d527411020519a42ca18307a09ef86024863330945103e70e09a498c5c71d7245d1ca84242fa859c2e4a9c996253c28710354173962bc502531050597aba8264de874816a422045e7290c95362f8819822606283d1cc1e509206018244b58c08c9b0e8ce0872d5a3a0da94f2c9a8022083750e48004882d553848a122092c47a83431353d25ac4411f3248a18e2cc8c40a17284ce192e1d381367ca22d1ad1a244680d9018b2673a88853f4f95f459f8fe7cb296c069b3183c56ca1d7f66247453ae09110b40f4120c4a1f0683b56bdfdaa0178e2853068b20863012b1410d5c30b4a8e680a020b7bc4cb8b9c3b118b4672b0e1481435275bc42431a3795da2e8f369963ec158600912218833e7895a173042d208d6ba80d96a0d343a5fde2b65b26a2e7ff2a24814a3fca0824814210b3bf08ea429b99c9442081ffeb483c592941f6d056904855a2bbc9a75fe537e422442402492b0531650a828d08cf4596b95b2f984adb5f2e27b398d5734a6a933c081d7626aede3eda3b4fcf0de0f6f320dfdcc57a8dd62fc1066081f634c6911c2b7f4e127afe85b163aa4b7fead348aa6d248ee7b6fc72f33ae5fa373d583cc1b22516d8a44f2e39594c91b2291fc09638cf1657dc9abbc62a1d797d3697e5b4a3ad3e92ac893f240840c114128e8356f70c2563cdabfc49e94cd30e3d1feff8a4a6b0db91228950f39ecb04c8f5e8070ea5a6e78fb85f0adb5b40ad3c4875ca58f2612c1bf8a44f02b010dad69d2709a910eb9a45f39bfb1da80a3c7018ff6a2ed1d2abc4a48d39ff0269c5978524ee968f3dd707f50caf06fbd3520bffeb60feefbf6fe029317a8240d1a096ae9d090080000140193160000180c0a060422812446c25895c50714800f5f7a4e684838974984811c06521405310c43410c01c810408c22c6188390523c81e7a4300c9b25c6493092738f4cb262415369dc2e842b094bf763c3ddb942b719778962a75851ff7714cd2bcca0f1b31ab3a364ca994aed4196499dc80d4873aaeaeccdbf1cb861eae9c7d75ff6d113bc919e49cb2a5eda2a07dde26dd6ccb972a602ed0d446b5c2053c8e67fe8f967b69833d59dde6b95bfd6b51d0c5f28bd9f235c9daa3404bd7189780e1ce5c6f1a513db88d6890c92deb931e0a95d1af4eee499c79d6162a79ef25bbfc0557c7ad8514f5f8dd80d694c6089d09b9cfe3aee52ed22a7c8c91c71662a7a120311c2cec9937d8804b5008e1b73a20233953ee99fbba9636be8d3dc7ac01b32264053f50950f982cf6e08d9ecf26a5a75b2de56605176afdf2b320576e2ccf1a529855f55dc9798849d4a9f1baf4e03e96212258a7648943f4c92a2b66fe3d2c650a85a2f93ce15619ba9fbbfe1ce6488e0b1ce8144a19f2c5f67829253957e8c9daa4f1a65ac12dc2a363a3f36de9d17c2c0c5c5a3b0f4be45e7b051216ca3d29dfc7a96ac00efd84d1a52096d674afd1e1feb408e2a345603f595d5ff67a0314f9d45de2752e338c6405e203ace0890ef120e12f19a1be8535623347ac7e2059d26a62138e7590ac3c4bfa3b7b1e6e0c6a490bf7c19699b8cacdc31a5768cc6a60d867357e7c597d1cd0d2bd6a96a4cbfa3f3a3cb500e8e8e8f3a818d6899c80ad657d7e6a9c506ee2374be4cd74ede279a92acbe4088cd94899a454cc96545abaa00bba76d53ce22f3db19a055bfe48ab322f707fd52dfa2d091966cfcb6079ba285678cf71ef9900811352b9fc0cfdd13df21c79c5f56c0d6ca80a9ae06711ad4fe21d832f4f29a7a8a4563e61ae964483029dd0cd91c2d50c3bfa12a62843409b6fbc3f65ad28cc5b7ae0902d24ea9f9408a7e80395e846b2a4dbb98ef33f0906bc0e22037210fd1a60a0ba868bad438bfb394d9029afdae5622b660fb1347053a4df9769c8c05762c2183420bdcd95b2fdbe8aa7940a0ad6ade27f1236288f41252a48f88d168b984b47a8e7f42a6fc34443be30a0f2fc4981efd4244a8519c4a5624e7c60f1a465cd61d60d3582d871381d9b71bc44ecb57985247cbf6cb55bb94e4358b39d1ec9190eea3726ae2c41192b58ec881ee342603e918534150f4e81021334a009a5251429eb25fa69513f6edb45116fe1582a64da2998baea181abf6330c395b196b846ca065a6250fa424d132e91648a1673a3733551fbbcc29fc96fc38e45399e3c34c5676a6baef56e89cb477057c42b7484fe046a03b51692b30497dec6e4a56c8928452b7cf06a2d7d053da4aaf065fc78cd937eaa7ec372a2d62702c8e4c5fdc586ce4572b96ca90245026baeecb86cbc942a569ee1631545ac6a4b98e58a7eae7706fa76e1a1ccb1315c5c1d2e189b7217a37dc37a6faf83d90f7b0724d9739735c21f9676029e2b2492ff4ffd67ee8a40a3c3f47d1356cfb47b24014e758e00a463a3af71401425c8be8200d31fa60c422ca789961e01ea925131c3cb761d2815e72402423e7bb8b588977e0436b031d3a792a0b77de263a1ffa2f6bebcf33502df7857112492c3e4065d517b68601a61aa27e74e1523ed3b4e1eefcf7a9cb806107a186f7c3d98f188bee07c7430cebda55082875db53eaf1c44c14f0d001d74e727f26a43263e71a8d05577bd2ee17b19e7ef33e089c8d5508c7c0d204a24586c0f920bbbcbe96d65d0a3439f438943937634f73104d232a98f54a3b722dd45c49870729856ed65ebd8e475789747435a15bd9078cc7bdac73a30304fbceab80de4358bf12c10b33d2710388d9f3753ed4744b7f38bfe7214b0fd87e33ee84d2db894f68ba8d32d9721aef98bf9d7d61933ff833efbabfc47025881c31b959321040269f77ddd572c955aa7223c3d6ea153c7cc07a66a1e3f4edee46a42483a0e6efe8cc684e0e9fe1b16dfb0a4c46367358d29ba2912ef7d2d08e367fed082823c8cfa40db282c03dc2725c7b807bda1ae047458f0f726d94b59084186f933697d8c00e43819f972f8c37c759d603668dddee516a9bf26a0b63ff462298a75a0be3227a306c0c1a1391873d5d1eb0c300878c11b198003e3e4527d2ddc9b3391156ee35ca926f47995684b3786bf4cb698edc13afa17c39c93decd02f4c0296ee86efbd1cbd1a8278dfc7964d16d97209e5ccba684bb1de49a566a42d2976d1db466bd46c75efe87f5cb879ecea56c94a37295a8431f9feb9e9923dd2a11e67df46fbbfec12f1d6d60b511e290d64eb7bfde55729b4ddd92def917626edea4a0fcbfaa6f979d7e4c464d00535970d67f6478aac85160b3c09b128ce9faa3655c342375de844cb111a9870f65ca3f0c543e89f544b934145d283a5b21d18865ab11330154eaff1f56dca19955a85791da834092518f02d0ea6907721dc06a1dbf4a8b27c04affc63937c9eaaa8a1c995881f7114d499ad773b794281b6ca7d8611ac52cbb3537628ccbc61fd52bc441abe6737ff41547dc69bd81cf0711fb1ab58a65453871384076453f55db07703cb56330613f717558ac579d8e7f494bed7a1d6758b4697411376d3383b35bd61fd86ce53fd24b61492cac0d900bf6466291d4d20818141c772f0a45ffc70990204f2a59a74398ce618500e7f2ce0e645416073f65229664626a5ab3440da74462603435118dac32fe86d797398b564307dddae681d6bd32b96827b1e047d870f52c58b3ba0f3040998200743b5fd7db98f757a51c40c90098ce5d0b27466c080cfb6e6e6d81c990eca9d1f23442721cee6fdb87070e7322083c7841208c86bcef7998dc902e8c90baa32b43331486443395bb2df4bc276ac292fce2e1946af0921fe098a205f7ad19c24e0f6f4290736e0857732e13b688dfb680c7027e8ee8c6e97c8bb473e8310ce776f2780040c656633eb2f8f868ee705906286bc5ca04b97f3ae9677aa8bde6e347b5f737c8530a1508164845d26b1ea66c817987aa33d6fae20d230720b40cc045589aa1b9032c3d5c1ed3d697f7c53a96ee30ea33220049dbbefecc2059d2f97da1d7512e4c05fb45d577835194b124a1945e26f1a9970a47658b75d74de5256e9807fccff03c599771130f67a28db5b194b59c7f82849a107a74905d35112ebe06a93574da7c5f65ee3b938bf67bc05437997790709f4f928510cf47ddf451705e8d31b3d3b90c2f2a604bafabc5b6d76e6fe308f17d8f725e128151e9bb4e0a3c950b9d4e2f9d5b523016af70eb379043ba1241c84ff2845509e066cd7bae59d8e27c0a493a1aefd3aa9384edeb187cf51ac94e1f871bd655bfb62554707d9dcfa7e5f6ac00590dca45415521e1c18a308ed9d98d7ea052aec5ea049910b2285a709d22fbdd26d8d050791a0d020ee286fba708767177cc52d859c49c8e28576b419811a6a0f9bbce9b59bb8f0bb12239e5000cff76d7ae1c7ecb21fd291294e5d6d67ff7704553ed5652db599978647dd7872b076c44961cb333f6949f8fb0304f7a79ebb1110d024d11d168fe1001dcfc68c58a353059f2fd05c495a08eafaaa15c955bd5f7a7f2fc18d5d13740de8726efe79970f938266102864bd3d6ee57c3c50f243bb299c4333537bebc0897b68fb207ff8372c00df157ba8200bfdfaad619baf7b11e58f66bf0ff4695983c9c30eb03d0c5b7051ef541736130f4210716a03ed0eaf1b5dd808f4e5e7a9cb59a0034bb9d3caa320ad82a953ea200729d43123a31be0fbe1153eb2c008afb4aad3131584753ec55197e9acb5ac5172baa54385ab41af72e92f4f7be3b2ce924189adb9c6cc6197429b331581ceb34e7b889fb081075c075f08d95cf9582c7924cf8e27b8583b9c5acf89b0da72eed361c1db72b7a4498bac4f0e54c71374e4723e51ed630a401acea8148f16dcfc6144df070456ef2cd2fffebcf82a170a29640170fd931b51f29d80ccd11b6b966a010cd4fcf97e91c2caacdcecc5bd4a3e4971e5e2176e54b4313cef939746e1ac46a23730aa565c049a208a27c3c0f21ad6d3deafdeae729b3a652226d4decd60d43dc9a320dc06d40d8337c7b43ae2b2436a260bb8ffd5364dc64b080653f6a8b2f4d770b5f83c5555b1ae0a9732385064eae947b2b5fa4598354a43dccfb337a5ebd50e2a53b347fbb86e10c1d7a204492100fb9d644007e90da1d20ef9a3aa91fb6e70c64ed28349188186c7817c1792d74e51e85bb7a9904f71e2f650161bdde33a1025baa94119a678506d6301df5f49377aa062aa38658812baa9b93920fe75c8c9de74a09eb3b4ba18887910da7439f23762aa49a03f05f72d3a628a7c62573deb9e01dec37e40a49b87c8aff42010c85cadfca8573bf6097b453c5ef0eb235a392156bc6d587e0435c752096564435c8bd821d4fde1b0e9648bd024e8c3b4f8c8857151e1232276779b89ca9836935b287de050e1712133ecf6fe40ac0ae9c96c6726d8db098c3e38bf2c343964f8d463b7c15b05dac8d857684ae35057b82ca2757b437919e31c98c6d145c8c48660a5eff9410a9072ad30785436fc213fc9637d4f3b09cb5319460f53729013e66d976e2007922d1a520b96905167fbc0ae89a5a5f52e58e7fb3f0f9106c61ced88a0b5d143172e75cafb1c6a8d613bb44250f3ff1953d3adb364630d855752af407830a986645132e313ee7f0c7047a2a343f073f19c59b90bcf854da1b7955c3cae2177a55448b51e9ac0289a02b1b6b66e1325a1163f86db829d0a789a641fdb58ed821b6eaa3c602dd056ad0fda3ccf6b4b50eca2d557e8698a67313ce2b89355828e7d8ab27eab4e3c5b1dab5b36fdd0cdc6339c73e74385d424f1095e91b04dff783c7587d273c9351b1d178bf5c57faeb35125c2a69fc89e619b3b7adfd9bb0ea9311324508e258c164082dc90d01164441a54cc671d7a5d8dc8d4957d29d44f97445170db77cd831e840a33d623380db0c1a2a744dd5b4a98cef608fb6cdb27d4278b710038b024148fcd3b747d252ffda0216887e6b8549722f048fc961a2f3d34fa5ad3107fe5f8aa7b63fc2b95405f835c9f214f8479e8b3b38e1b88ee3d3dbb73d507425e9de7cf0fc27c0f84024c6565382b03724c8ba66e1a46134c622bbfe3451f565316ff8b82e0fbb6b4eb86929fa6fdf69e9adb6f180892e1042780dd2dbff4609beebfb8d13938de66480a1f047fd76044f63560d9c771cec1fedc7d7afcabeba69cc27a71159b6c2c5b644d53c7b20763c79131fd9bdd8687fb8414438d92a196c9b8c902668157be9c391ce7ce4a376a114a46588b7c5c3199a0b0bbe080fd417beb1554b55f4c1bc7c4028bdc08cd3d5de0ca2bc24db1541cb1cccad8df80f93d61d266378cb4806928c537895a39d225809954aade1bfc0c5aaa56bb3f03a8ca5cdf7d884f86e9db07994c210771a3acab3e0a06551dabc79db1cd525a4b6fcfd6ae3428083d5caa1151778b3003c0b86c2019474aea582b810acb5227cd62c47e47c7d2ba90a2290d17bca8023884c1629ae57e7a31dc5010d47ef3ca9c53fcea67340a722e824da5551381aa84dc31d663af5b96bdfdda270a506ea5cc1e28f289b4342f5445cc5bb0e8d3d09f0f59c4deadf75dc56f8555ef05494b42bf3c0dcdab927a83c5f6c21c26d8b2c0d88a37e7e21c66bd7613c42ecbe478dfb5cab1ffd12db46c16dce95151545e4875858cfc0b27402a61d6b875f3109a0891798382deb6daec814e14dc189ab9bf15b1b3724501ed18c98c85a5e059e6572e88624692ce6190d8f73ede20da48310884f8ea51d27c041ec952c78f453635c917f5e938f4369ff0a0488b4e22fdb9aa2149b2080e84648d2f88d6b6d7a2c244b89acf80161d23b5d59321c2919add441aff3314559a3dc6134437284e8110bc7a429a17012059baf8e20e2b7944335f7ccc73e692569aac3264d4e624ecaefc00ec4a157dd65c887b90cdb51b89328d4bbcfe5ad11d91f9589f8c2e1f81f37a50861c264de78c20d9677a8a43cb96a5ca40451598b8fa014734d2ae44388b41b4c619bf3df4ed0523227dfc0ada8d00fa60d21aa087d26a0bf6dfd08434cb486b1a7011cb9720dfddb593758e65d4adcdc49414211c96d73eba0a1f10b35d4fa5a466e0bae68b92fe5ea19080b2aa2a0e0098982a1c37186927dcc4a9a62a8d348b42c4f5131c51741ba194919aab5232d9000de934e087a29b2441f1fe552592e40f5431a39b0c2e8633ec844fdcf466d83c7d051bd02de59cde6956ac25e7a6180faeef14e33fac734681f02cca230a06d715a86421a4fc12c7e1a0eb34b1a6423007eed4f24ab4b9c528572652a48d8e68aedbbc61d3c193f82d630e0f899f29b283fff39eb4e7270f82aaf9e88e8f58172153b5ab0946618988c2aa6731b8f49bd6d4dea04e0626ac7048d053432aaa66ad4aaa6fe4a7ac9634253086d8c41ca69f8d7525361a451fd80bbc15d0e7ab6ad19a8e0144f5c34f92d9f0004a2dfe45d46d0176cbf75077287e9d767209534ac28b417825834072d501abb220103db6addcceb676c624cf71041ca4a4b10d010e7bd2f6dbbc13658241de7d1abdbee91d6792ca72cccd918b8d5c11f67486f8d8ea407d6530e319cf6b6d1d4dcddec6cc0c5adbbf2f3735c99161d6bf9754d1432a49dbedcf98a9b76e9776572d79782505aee51e7146ca30654e8d373f76fe2ab8f38c7805aabda7952873621ca3bd8d989d0d715240d8b82a453b71c02827c1c33acc91daf4c0919e8313e6484d03c69bbda541fdae3e4738d2dc74b579b160311e8c8cc68adb64882cf6ea95637a7c682733dc068671315ac003c3bfa14b59fddbb3ba00caca6983553cd91b4afa2e75bb916ed571255a6ede1f1543d4375b42aa5495410a33956e470610c85251c7e67308d27c07a61ab2d974a57d4347949e0aaf6f3aa4a9921e04975f1dc932a744f30e216edd80c1e48ed6ac92da71177b08f6b4d517eefefa44e228045d74a67d35c05a638a70c5ead2a41deda5d59c906e81b349afb5ad3a3f5d437242deb6ca2feed609c9186f5b0d4b56754680999694b9a453fc29f5d3fd6f075c0e00ebdec5d6cd6f46e193c417ec384b142c6b4ba72a9a53c5382f26674538af08c7ba03c11786da0770e17d3b854e939ef61e144336c0982d2771f7c49d747fee9ae442a5bac95761bbb9e95cd416715fc23544cf1adada20ead4db208b5b2a773564072aaf26ae9f7980db151e74c3cdd2c1e2e853ef75b667f7cf5ae0f807cbc7c5de6561c9f258972369194ed335bbc6bdd22f2a2a455223496c34a3630639090cddee290f21fc18220f23fa38048f43e471440f47803c1caabd5b0d93c3a3725be39e42a1f011a3a692c0f7f3494381825de79ef85bf20d6e1a324fc7b6cc962d4f063312ca1b81231f8582fe90cd2f5604cf8f8897b22b76e9905fec097a55d65b86c771c63f6e52008af7a2cf287a28497a891f60a19b504fd67af038a1c887e32d60a3d48f16eb5908e80b34d553ac04699cf21010de456cbffc153ea62a12c2c1384413420d3f7f520574ff4a46213a5653bc0ea2c40ba0484262518bc5ffb70b147675547876920251d635dfc27ff1316eb1c5455c394fefc8a57bbb21363897b5cd9aa1d8fb3bace8352f4232c65688ed752f9c5ae8162df47782f65c43c4d08fff49a3e9e5c772713945be95426f2fbdc07c8916c08da97669cf81892ced535eae6a382c9a196ec7750aceee4d1a939257a286558b88971d1b13cbf3c1fe764abc38ce877f467c804344950ff6c61f22f05c85c2f52df142759789cf574432f70511457ede7e9aaeea851d6c3235bdc79151d3f98735683018c9331b0d4fa47f42b699dce274276678844810694b220303f540983a93ef1b745fdb45ad53c9c2fc0ac220aa871ef3e38733803c7e99a1af13a227cc5b59a2f3de8927c471943d5cf08b17c06f3a7b0cec1049faf00a47bde63f57995f9302366bcb34244c2a69d019efc309a764d760ff0ed01b43701a7e88be710899d9e0dcd2dda9695662632c93754b44d82a1102392fdd96139f283c49c4c1456c5e7ba81e98be6548fca710f13223706894283d897724608900674450c7b7b47b52579feaaff9f488dc6f7ff1c0fbec155d6c7e382360c3e8cc000fe9cb19fb6c84425545dd3f1b3e8d9f9a0a1f9ff49296ddde0882edafc11dde220db60d0df31eb8b273160306e65789516b22d144ccdc8553c2cb86814deabe24b80f785aec8fbb89c908a2284a0395ea5f18f2aac6b4b8023389585ad4839d48cb4206da6dbbdc41b4bf16b0fc84d0d0dfce5a519d92786082fceedd6bffbfab080b92c85c3d8c00b98d73e1373b38bed2ecb18884a2572498972afb7503b5a422506c5351c428c8e6da59bd568c0b9a4f71ea348bf463a061640ad0bcf379b91621810deff6ddd0a27a2308e52567e3b70d14a8e42d5b5fa5331f461f4afd347f281930c3d4f55025a853915c523584454fd9bdb23423cdcb69d87bce0a76484c6796091a52963ed31205d142c1d998bf12ce7dac306c6652cc63e3642c7144ae9f037c22915f8fff446ebde6c9f1bd74afaa36c2c644fc922e8bdbefaa390c2a12105b7d476c2b8156b41502301883842851ac7523fd43c4a651af94ef14dd812552fdbf57a6ab72d9aaad830724c9af7239552541a7212cd2448f7656b52657895fa5140ef11cdcf3adc0152da9b49742e661361200461fd0fb8b224d219e047fe666bc3c18f65073041d7085489bef49b0ae9a8221eee3b036294915605b8416c9da16d4b57dc63374aebdad881f3472056b75e7f0a80c6ef1701179c9d93ce86e3d974f77353b401380cbfed1e5c96159d9e1b37e35df2e514ccb1505d31e55b8b4e3db11f977669e81515caad9c15e7a024e621ad2a90c14e08c503036a68ae429f1771f4e8a61ee9342dfc057271aed2289f47046c1ac318430320b41830491a45dbffdb43cd3d87c663a27895b2d5943600871afeb47e4fb86522dc5782cf6fb70be8e5fe7f6aa32101e7d73965427ba3ce9a3ba1400713738ae8c882b6bfb70d22c659206c14c46011d1684588a645c564f602eab1cfb70ce2f880951ee37a82a593064eb7474089d45ba898398ac6c0f43657192b2027ad26f99c992399176a0b8bce407d0684784f2e9c319c036937f1cd5b7a2092a0fe9d446a13cc119444ada1e0e46702668c6d6381099e8bc93643d72bac156d3347330e43d8e0a8374b8f040217f2b83cec0906db86bbee6c44098efa87c6e37f97edf8a981c47b02b80b93dc9a5a5f32287e005b9c13e8298e413f8c502e6be9393e57c91d387a227cb63e33ae63734b203dfc80f462199cdfa20f325665172ac5296ca2f4cd1113cd4d150c1ebfec958ef264ffd22a053cd4b4cf010c4f3b50e668482d1b8908aa4b1bbf41342ac27c3c90f6d82662207a82c07899cc23f42fa2af77b34e1823e1150e260e572d47b82bcd7439081e1e5d5d128c59d9373c09c51a534b3e27db6aa41a540588621214ae7d5a94c7b5c899cf1f709c1a62a5f8c6d891c9822e767ab0b19e8fda31173cee8e61cc1d620d8b7771eb2d1a23750e6c2b6dc75be06eab40b0fb507ae4f4f812f121ff8771a30667c5ce71ffd86e824801447b8e8f89fed40cb11e35e89d06ead8dd240f09f62d289a3ef73b131c032a61b398316d3d9511d28bf0e77f6257fa205a3cfde773210169ed0006b95b7eb28e6f372fce72f814155a66fb6c8e08b26417a2085302ac0b8b48cfbacd705fd03ee9be3d2aef6d5ed95683abda9f2ea57c6a401c6c5ea5b48dd4079ba1b743d73b1f59fb48a4b15fde12abbb499f8b86f10be8071814538f950a42cb7fb311d5db7a045287459566bf54b3521f6429b01949b4f01e3e284e71c45971bc5cf870d46328bf1ac2885e78f229fca71021817887e4d65cc5127b340c0b8b4a17da79a328548a02f3e778e4fb4ed222491426b53b0e0061817d72929b42b56e774d06bc0a42720a487c163a7f6e16366f41b4762c6bd8dbe3a9738dfa460a594d16012983870500a60fc3510a0c80c0d35a9848ae3c1ef67235ee1a3d2541c1293a54a664a8b6c0fab6ccf87b6b113b7a46193c69fe5cd402cef41a5300c62b78d655c1183d8b37fac6a9a3a55879090cbc34b79c10639fd198c69387cb83fcbae09855d53d47a7d6efff3ba4551d24f4ed4a030c2e5a24a615566480f857a40029d8c90248c8c20b2833e208b45380a9636713eb8ff2cc4b7d50b9137a1b1b2bc096b3ebf2fbbcfca0d9d3a292e36c644b9cc1b300e24830a0dd6592202036893a284c88a2443bcf4a8cef40b96defa975e34c2ae77bebc4ccd9b4cd8c396d292390983ab94af02d63408094da8a060892504a0f87829ab419b9c064200a3772e852f11a7b4a7fba71c1f38e3bd626f8cab6170ea4f9df7da24ae558970f19c260d3789be5d12eff44922911c284da8257ad8e3c32f0e56ce2a5ac399696807456fe89de0fdf957494e13b2d70d268eb55503d37240ab62f0fdd10e5a3300ca40377446aa92f3d736e61b3a64075a623b2db7ec401a99b3e0eb83e2606af64d3001c46afbafdea6fd7e8ac3f74a2a7fc5c95e49f327aff5f5f14ce96802916548fca304089ae74d29f0fb7bd54e16030d267bdb8696d14f2da83bf291fa2e55192f6c896ad4765b6614bf79b071f92352c2d35acc8787bcbd93a5bce27c218c32b43f2b68d7b92c76ef12321c63bd858a56065dc8094293da74deef974eb60a26871128cef8a60c0f9519286f7c536f26be50b238ee8ae9eee0f3b20055c39744b6ad489342e8586f2f49a21841cb1b83521b26fe7d2e6fac0956ce1a3d0585c3914e70e62f0a7900c8ba1b917bae1f0e640b28f6fc485bf08d443112d5c4c27fb312b6e3f2d5de3ae019b169b5e35a84f9b826a8d4458a6f54b5c1ac9eabbc60e9426d0c6c78c2d0f55becdc12aceb28a8795f589a447e78be9aae41e3b81ca3aa218b151fa8fd1d8aba1aa247a9612ef4b74bf78f3f56dbd9ee123126346df86e01ce081cbbb4d84b4c0e6887814004a73cb80077fe3c23991e1bd84cd43c267d736c70b57ee5bb1d2c0e561be75ce1e7e431bbfa66f7dd0b25565c385f893990f36122c86123aaafda3d4dab41307eb14d335a0871bbe69013ee7d8b410cdb3d55eafd83c3663f4ce454ca0a7a0e50aa5bb4c62a363d33d22045a8b69fbfeb138e2d878a4d208d0fd38dcf66a9a0a4fa8bad9acbc913a255806761aba3fd099dda574a8d9c06f545568f1ab0cb6560d467a65a9e387c17c959d1b1e860656c612475eca1d5353c991d16097660bcea1575c54c000ac9322928f18db87e5b812e7173c030d1cf8cadc646b2b41942c4a16f4c336ac649cc390922b67b1b076dc69cfc39d19440f41359112ea34ac58e8d30fd9d34d8201ff0227175a6fd3db707afd58f3d4bf44dd5a7212cb501cc4dd2b63b5c86ac07cc3970e8769e6ef49c55c9f68a25c63bd87759aeeac53a9f6f36970cd8c63fc35a1e9e3a7bd12c52b57f0715ca1412bb695545661b4751109fc39f70b5fc4a81d09acfca683aca11422f08979fa56f11fe22897886caf152aab02f0549ecd3a49236ec902d1f899cdc509edc86fc335ea82e8b1aa652e0001e9b40a7dd01ef1bf622057f564627273e50383438b3280e38707361a39728c52cc62cc0d86c53ba382bd7bce5c6ba80dc056936202d24b9a1e5eb1586a4f55bc68777de4e37c8124e82cbdb45344646e614f873431a3f272b10c55b965b83809cc29411b8ebcc5f12a35e341100ae247e284b0088ac9242f694aaf66cad315361da87ddfaee48f9b294c3bb28ec5136f547ad4cbaddb8a6cb82bace7cc71228620270e8b02104e4310fd3f6b1bf03cf08740e6693a0bebf072e2cbf33c86d88e71178fc2a20487110d40aaf7c63f917e972f06c8d86b998b9a186e7d0482a5c5842ade91d2bec3d60b6393d7e0197281251f2819dc2ddba531078ecbce1ca7f541f1669a58caa53c804499122908a24f6b14b72f9ed08f9043500d46437ae2a5047c1410178317459d27a843e5d3cfb7a899900412585da283d4330d41882dc8226a5a98027e3f213c91b4b172c0f649f489b003a242a0ee43619f5b605f23228b77c3992e8f1b55513652bd3d564bff96103838e9c2f3b7ab99d3f611db79501333597204f2a97ec8a44e4baaaf90c0da289445d3817405b1d2ede46903e492263a599b693b52142a20c2be1b3d0d58dc028371e930e4215c602b798699b662768782df0e91d438756f097551f1721f161244313ec546b3bc79529d023f17b1eeff89791ab17f6f1b27faf80477dcaf82cb548a368aaeffc6f9dfa2c7b40fac59a1b5df30453290f0bb3ff3a6a8f2988b012462f49f4435afe87819d3dbf10222d7f11d36ac2d22888727a8a79216d42d1eeb6a351b0399650cea45933de808d61b4cdb8306c4ba0178b6caef57ba9af4d6bc9725b5c13c4ceba458b23984241641d5246a0d80574c10138d5a0b4faad4c7778afd0643c2bfefc455bc9cfcc544507c2b7f650b7fbeb8198a305bd02613f1479291b2fa0f7242d113ac1999d4f0b7b5fbdb04c70d891ecc888ba41724052659f5d24e09a0bb788b69803b08566f8528c9ad305b6eb20ebe754de921cb0508332f9596e44f7ce983355d5882d5c430aae35845686ba696e8e86d9013b354171239aec80a6ab1c2d48e966e6ddd7a3e3635bfe4f56a79c750668e2d8c7559b3cb2814f7a5a057f310ceaf06d8d13c68efa05bbfcfccfa08dc59818269f5dbac063d266ffc21f0f4157e878ae14b6c8a0c15f2b3b12167b3462b6bef7fd52a45be466f209d2c29585347d7651b538e864ae6c5650fa537ad3ff51c51590637fd296483e01942f04edbb38de85fe013e6009afc1a1c9fb91db4da63e31f297edddb940cc5b88ea057a85ea834a1be54d5aec273dec9ad202d10c123b95d8a1b0f6ab8bfa322c10d1361c639b253664d4f7c17cbbdcab184dd8a61b706ac1f7e4ccdff9b57cd67ff08bfb56df948c7a1a4f1a6ba1ed9e40871f6a65399ba3c7b26847c896220d6509d76270e8a502db5d9da85938585e224e8f2bfe439e3870bb4c117140e92723a6d6f3017ed636c3b5bb7aaaeba16d90a1b7bec046c5d9b173f0afb1c7a10a77761c4fca814de3af61f9de6cf43d3fb8618194cb5c03c295a7c18d153fa27a016003fa2c6a321a25c051b8d94ce79c8995e8044622fb1f4f45f3aff30c9e63984b90bfae6d4bd6d6cfcfb946c3993789831e0bcbd6ef5fff67e1cc82d4037d70fdd256f1a2e170306c0b3ebb63c62192f348e807eb482625e80b404f29cacc4eb021b493782cad0a66bfdd9c4005ab8c1fcc38fa81d81148287ab66f4008136ec081f0081174891cafa0f905514f798fa0ad7a525877ceeaca04f356f8b25dfbe0d9b2bf33590951b15472f8a060e191a692ce25e2f67344121013f1e1d038738ffe80698b87c2865f4e49f1b09fccd3743fff8e775a220bc644816e5ebb068eb41a43791a842a2573c780879cefb5285042a784d044436cc10f2d89aa286037cd77b3fa0f6e2e7b7d593736475871cb7cfc371af877c630ee9f80c97f3013b312e8bb3de1c09f38a5e0cefb127b55e044ea647164321250278167ef2d3720d09c50e6c910e5024cd73611c1ab3668d9f7897ca0d1e87b0734ab14ccab828324a1a9678fb4947d6386fbcde687c2700194cd62936fa045a328f7d7abd048be9ead9ee2dac00274cc38f538333cfa0c0e3daefacb4b1236aa4b9f3c5d3a87d0b56b268ce7626e3ab4e5c80e23c5e9e5b549f0d9d6df95d291f65e114d300ef0266b149e15b3459ebc53a768c7f84d72b196e19e2df15f0471cfb6f713cad9f2a518df20794a5b2503eb64a4654e96616aca7ff3a2efaac286d3f3a810f06436764fe03d194a7f51cdcafb3292cc064bfad4f4ac9a55e9a0f69fc623862750da5a6ed07298c15386cf3758b3476e689ea776741b5d97bea35b253d4f39a0f40a0783cedd0591dc0e7320d5f4d12286ef54dd2e144f16fac910efdeda06f09b6728e6e440cae61be6703093c695302e31a3e6c62535445d29a0c999696ad76dd76e85754c5def88b327adf3c57fb225143e4ec5445279243797759680bf46bda255d01377b33135358d958f95d3f54efc116a43d7e343426fdfcba845624153ae4d4718e78f6712946740dc75a9748bf161c908524f9ad3a69c0426ba2d22d9f4f917233e5bab53d806645e519a4bee57c4677dcd8bee2c8791762a9719f8278c7d108444b23bd38e4eaade97342e560f342972026ae6f6e34d40ca311d98f563591e43d2ed384b42a2d83188d9cc48660a5d5c4530ed2a6abdb9e2a2a41172087d4ecb444b73ea2f8160833ec0ee1ba73f4a6d7b8de3532aafd01e35d0da08ff1dcab8c55c210664874182d37d0dcee5fc69cbce35c127885e4f8583a449eb148a23851a7042c30836320d187f741efdca567cf14a3a66272dee71fe7cd3ca929c70ae283ab61600c53a877d8d007deb689899ec2820352f743a8445c18eac7d1a6c411c3c81658d1753c1b6a6a32e3b86b1c952a1c4eb90a053339ccc0740862cf559f8d7ac998d6c757d67631b97c837cc9fe12b37730ea4d6638d3fbb154243a3a9d92314bd2d00337a7fd13ea2ae8a6735e38b0cc0446aaeb220974f622568a620d7e9f40c2820047b93b22b6e52a47feb2eb278c18343f4a31fd087d8758389f17336b78b344f3cf38d6d0c2ec78a92dc95f8f42d6bd5c6d4fd8dc165a84c890764c52c804c61acba530e1238952cc8bf175b4e6bf01755273b0594a2799de405a93a4df6b6bfa1932d56295e69f27930068d8c25b204e4afad0d032480170253c8f2ac09e390259062f1c5f66c906cc5e3ab0b5982c0ba8386616d869c4f575605b39618dbef525e2cba786430adfadf53d5ee76f1ebab4196120528a1663b30c59b5ad504fc17a288dc68f93a2b3b62b06c05dd97c32d85fa254b8dcc9cb56dd7e57844ca7323913b48285f7e45b68b6858b08ff0aaa12be4c7441422941f7ed795b90917703d35be5b276c59323e00cbb5d948ff52641d1e2c5a5b72d8f23c0d98cb48778c5e272db65298c626a078d0c696827aba36a343200366075f8e706b3fd88c1a984f9d0f510ea66385076c01d6436dc8f71a29c2708cdd45732831c2f58fb436592a1d01a592a0681844c60516fac5d507ff9213e62e614ddd11de83f60bdf6cc18afc345a5c59244f203ee22cacf019530144b3d80d07ef33fc8e19913ba7d814d2fe08e144c4491d0a8e80c289e47157aa6672171111c9c10a52b9139cd9199a419c1e7dc80bdf92af250915169ef0fd63e2fc870f02e52100e58fe92c3958902f8e0993a8eda1cd0784f86466ff23ed66c0a78f7945ea4e2b1da3b518fe9e1deaa679839a212d88910266602a257a61af915687342f1b72bceb3216856fcbb25000850c06b67fff269b279b63a881d8fd9bb0d84a94aa0db521235cd89a4d78c3be8545481d10112ec91b4a5c81f4c1282ac1fc8db476c48d5774eb2d558168cb68367d6cb84b3023699e9106104b0bb93ff633f425381826989a0edc9b01ed6b51907f26a8d2dfca9e924f0cab2aa93618788bf0ab69c951e6420abd5ec8daea16b435f3495bf2a4e171a8097455d8548d0933f20884c529421c835d0e4e5110283c6257bd1125832231162b9465b50c4688040171eae6a5632239f484fbf6f61b072039b823e119814922691733bbc8d237aa459d5eaabd4709348acdaa0cd1410de805724623a4f005f409b3d7b670f6ac1a294b8625a93708860ce2bf238890dcf82a96b05c44a6e985777ddd4cccd5b810b4e0c8c37cac4784eb2dce8d3c2cf541d9434df11ac0039aa4ec9fad583d2b463780c2b52561c8573ae4abe491ceb9b923aec12209766e3cb83a0749708d5dd17b8115c458ba6ef737d6eed06f31d96cb1d9d296094796151fcce3c4ee038c83ef275d26701672ee582f93dd116df06b8c1ce10d3a3e8a7f01311a9625a5888726470747d74e8da698f620a010325e653f5799b31ea0aa9228b74c0b04cd93ac0dc3d66787a287a56b7fa68fb4751fa8547d664c46022a8cb54f5d4090324e07d489629e7bcf2aa630c649e81a2c478739f3b304e304b8b99e8b5fdeab92c759468fa2610c6712c56a97a6f6094336c2e6c6d59fb0ad60294703071976c501f7c42b68409d08ecf2a41093621382d0deddb6dc52a624650a3005a704e104a596b1f4d9d41d36e4542d184aa5ffd55c4df0abb51cf7ed2d1249eb510e1c1b0bcd4406bf25e4d858e854095aa9848d850635d3973616b0cb1d05664a9664ca0437c18496d184ee6607ee4e152b419b6c07ab26d838b3769ea5bf9ae09573e54d1c3b3012ae079b03c9e5cf4ad0e44aded0703a9d7cc068162b800533e30a7fb498818100054a0cbab8a10916d0861f23caf0c148eaca173268a7dbb265ba6909052be1df4863b3e3c6e61b8e54aea75d996a9cf9d1bf05ffdaa6c972e4451f8f59378a61499173b468e36f23713270870a415ca8c2e57657b91dc46221973434abeb69970596a5f99ae5561872bb1f48bfcd0e4dcaf0743af9154e963aeb574520415c80c00c6c06b3180c1e8a4e236fbc1450e8800d4d0aee4daec6a9b5c64f0340347179750394cbab1b98f0ea8625314072e36b2f644c92c0cf0665a997c8523feda13d12a7c39852820b2e5ecce22754ecb9dd4594ebc5b08b1cae17a7dc8eabdb4de392db5e14e3f63705ba3dc5f5b4fe9824ec65a02e885c2f2ea194529beb4bdaa8b62d7d9b7e878d2cf5db00e9263ddad41fb6d0a62051ac1789dc6e0659ea6fef9a5cdf2f81ee6709832cf5c796cbb9259397491d08e4f39cbc91e1eb247943a5b8f3392430cc87c0fc202dd0d5286ca101129037f3ceafa175e7f39c73f2d07c2ae7943b3ffbf9b6c4d9e7bcd2649d3983b469daccdf31ff4b0cc04128274b02440aa87ffdac7fd5918c90af5d1d5d11bcc0c86498a15e6f8de4e59c80adbf9e921f7de44730f6709fe58f237a25c05ee5fee2d6d57934a4eb5549923357c65cd9719b52a097477cb31aa015a1c87107abc46520a023d76faae7bbf2dd89bc89505ae0acb716b84d4357e806f1b680f66993fc968c1051b3ba5e0dd159c05c006f41b2ef21199311525f3444277e7b4fb7c4f1203c9d4e3638d0159f2b3d877265b69ae2c9f53c9462e87a3ec5571ed48294b3ae8ced1e455d0da2afdd26a43ed6d5807dedb84dd1eb96d7acde82f0c6b5697a72d53c0d461921d8d7afe1952a516d137fd6abc6f1549be4db0ee2ecf7aa578dc33a412ca1550f5de93d9c11fbd23ff9ce23df3d821788a843825c076cfceebc087acb8ed103730f7bf4b0e2e313054a141f8e3e3e63c42d9115b9b82e145008804d005040a18a0c2512d227a624123115caf006ad160dc010a2414bc85b2d0c7bc1057e61ceb6e23c8e7225fe39ca3fe7719ed50d4756369871a300b41390143f320452b1003b3d014a99348a972596a884469025098f4ea432032f903831f1811b7c2ec87119688a0ddcec3290142c31311e7877b7d4ba99bbbbbbbbbbbb87ee38e6fa942d49544873d2962e94f9e5596334dbe57579d3d3a733a5946fd62ee3c5f3c5bbe94f3e30c5f56c6581c55a2052811416c440ca12f71a424a12d38190bc928d09b0a64205578696b3dc6520293b48b9e1aea4d0e0052628c20b23c280020a3176b0e2c8d60383a9011ba14f95278cb08202237430727961c401488864d9e2040a98f042072853780e8430f20284110d0667f848d245081612257a88e2c8a58517c1c0161c60820c26900851a05d894120a93abc2451e2490c214203454ca172c611543451bb8884c638422a551b0f2269922c5735c7c2f6652028ba5c8f74b180e28ceb691ac9a128001536d880099cd8b2c40db200c20c4a0625838c1b6d5c4e24571160dcfe1a440d0389db5f2f2c9d240b235d66208224587c38a8630cf1002abc8872c2e233821f302fa4b8fd954915318c1288a470105a18f5050c6722da228bdb5f993ce9af41605b3c8a20444ee858a1a205134d38a0a504b1e705532cb92187236017106446086d575871fb6b10a75f1a61841f91d0913612a96524791207bdc753ee537255eb0269ab4dd2835842ada11f812008821d6dd1166dd1166dd1d6956f22e1c891a304d36632b58ca6c943ab87bc887fd779aed56ab55a810e969eb3dee329f7f1d055387280200882e0956f82492b954cd04c26134c3841a339a166aba969196be817aa7a15746ad6a985ae55ab54fae7386bafaff6903d714552b5d61377325dabd475ade8b59ad7caafd5957f028d76c2095e89d46834db0f9a8d85fe6afc6bbc9e341d00f0fad5cf66b3b169196d6a085e7ff5d461897edfaadbab0e6a56d753e3d4adf3aaf52cd679dcd753a9aba72b9fa6a6648fc6e95aade5b8f74ab7a6bf2536bed700e88f6be49398477f1ff3e0cac2000e3529a83941bd986f30312bbf738d77cf98180f6cdf58a2bbbbd6a8c0c68fccccfdf176ed22e340504170d1e92d613810305f5032934feac26e0cfc3e92e91fc9f4d515d9216dbae4af7355e6742eac5e5791aa737dbc3ab8315cb562a2fa58955acd9328dba737df632acbac20eae8fcb333da95ca2a2f8d9999999b67639a5feeededf3bbdb3b7e16fd3dfaecfe22b3827bfedeee1fcdd8b46412bcfcadcbcfcff1d8f81c6556b8d29974fba4d715e3552f2796888bc60f1d44ae994f2b26aab1893cf1cfe1759ef475619553204294550cabefcc23bea6c5a86d558b89400cddb618b7975aa35c3f44f9a2bdc4f802d374fa0fd1616c8c44581831bab99bbbb99b99bbb99bbbb99b99bbb99bbbb99b99bbb99bbbb99bb99bbbb99bbb993dece66eeee66ee653aa59dddccddddccd9c71377773377733a35028140a8542a15028140a8542a15028148abbb99bbbb99b198542a150dccddddccdddcc28140ac5dddccddddccd8c42a1b89bbbb99bbb99512814921230ac9b8acc79c43d631c23639217a36c6d4ed13cb20202449650c0816c6a3dcaa8567da4c2d663c2d82a7a61aea14f9d1a612425203a0c7119a8063f575e8f85bc580428bcf4ca8f442020b948b9c2e83629f23a5717016982400aa91db571ae671efc452e8b4448aae50d5c7e3ae78c59966d3efaaf1c6e5f4dec0d23ba9bc04ebcfd2bf86dd28c46e79c0608f2030868e32623fbac2f48be2ee28e6f3b73dba12dad7776762ae618d6326274dbc1b61dd1b69369ae692da3c6a5c5a5d56a89b69d6de765db81b16e6dcb685fb69d6da7836dc7032e2d2eadd63ccd53cb831ab1896c3b36b69d13f77d579ea0a4c2301586a9e6a259dd6a96924fc907821f087efcc3ddbef2d5951e724a6c26eb8b0837b22ccb447dba52f6c894f491a154b5c2300cc330954aa552a9d3ea743a9d4e3248b2a4906cc9212c954aa552a9d3e9743a9d46a04183060d1c4a5a350ed9d3cbaf247942d52a881586611886dff77ddfd7ac940453a9544af6c894f491a154d50ec3300cbfeffbbe542a954aa5fe038d536271f41046555cc520d61786ada1effbbeef6b568bc5620dc92292e7fabeeffbbe6635ab59cd1ac988a0cd6c3f666e68226c3f44b8b1fdb8f1238c7c346a1947492a0fd8034315b22d6e280cc3300cbf36c9effbbe2faae22a06b184c2300cc3f0fbbeef6bff461861a4fd77da68d475241270380e1c2d230e1e60680dc593b75a61fc4aa57f8eb3b6d608c69e300cc3d043123a12b61f2490b61f241cdb0f1c394a5e0a5886b03675fb6920a1a106e6c1cc23c2008483c4b85de3e8e5d2306c3f0d8dc39dbc74b024aee1efbf78b01e0f598069601ef1767f4a8c8c494d237ece003867c4957e877c7fcb368c02df5cbf6213e320e04a109bf8b28dcdc9b93da43b1d39d095f0ce9fef5fb2dcf429838c4924e6512fbf090cdb97293f298e4a5ce39570f9410081068d9bc3ace37a938f4c7686755e0b17fb38f24a376abf5345a9e38b6ae59c7370b08e1ff5661d896be68b469ebcd763a308947ed45b3b96e27a95251d29dba5abc7acdafe1b4b74771ef69e08c34a9745228e97527a5d97758f417becf226244e211cea68f13a19984aa552a9b02284983e13ca4cd11f1eac475b59300cc3300cc3300cc3300ccb8261586b4848decc158b95452a51a958ac568b4e11a20a56844ab59aa252a9542a155604265759bf4792929ba394524a29a5944332360d0a52c6e7ae0975493bbe61ac6efc96dd0e03eea0e25283618619c908d9746061c14967fb21363127de19050cc952e4d2e284b0d7acc23551015d3e080e305dba743143076601ae03636384f5e877a38ce85f7e888ecc0fd1a9476e7c192dfb1aca1baf6a5a3d227168a4aa129ef815ac4ce25727f22615bf4291372379c34054c0b8f1ab12f5476a192d52e4129137b40a996559261a09d9fea5abe1e563d4897f159137f3b3b12995fe39ce5a592afdcfeeee97d1d4c9a2f632f2d6c9dce98b8c90a903f37cbd789bc074356440c741a9d3baf597608d8d64f03beae1d047f4cb92804b67479b62cc10d6b354dcbf11d4894fe3efce72769e6dd98371580a0f09828c6cc1a4094a273e10c6e12b5e0044ca8a2c9878e2043af225ea886ff39272e1d45a1d01ae82563c71143bc69f5a4ade782f373a9137348a287a58e8ebbfd3d75f628eecb81358d963d3d33127d6158d28fa49bd7ccafcb83efef5b1e3fa117b7eb9c9fcb83efbebb30e01f559d4792bc8ebc52bf3237bd1cb649df6a22bb3c2f6d9ef6c9d374377a2ce13fd901b9fe5c74e867845dd0cf176df0a442d4a31bad5a928aab4a210233b922a41cf951adc00879d2a4ec0c4175374d1038b0977d9ed3609ebe978fa6ea529ea441ae6bbd319eff5f43d42893a6294ae879ca3262c4d7e258bb4ddbbbb9b22f9e109111e70bf627774224f266dea3dbd89e81a50499d629c3373e69a32bd3579e3c5c4704cbabb69f772a6cacc6d1f92387f1993563ec8950f36462351ce49a70b315f86980e4302eb11ebeec66295212a868944988f8d40b866c6d836e6e2a0192336312833c619736748ac02523b8f579769379d04403ac62190007920cc832f0c0e1993bcdadd0da3c16c3b1d6c3bdb4e4c0daf51a365ac51a3868d6d67723159dcb6d36a0d049fac10dc5bad2b274bc907821f087e913a756fea9486ee940b6db93b6db95fa7eb445bee17930b74f70b74bf5257ea02ddaf2ad7caddaf95fbc5ba58d7aac2d408a1473d22554c24cab66cdb5ac62d876603df605c9227e6d1385c16c9e5c61d66dcd8cd94cf0c5573150482200882f4ab2c168ba544fdb153b82a9fc5bb94e566a66d2f30dff77d9f9d2cf9393af020e6831a36361b365a461b52c93ccd22dfe499e0ec096209b58668f8cdd4f77ddf377d66385573e5414c8d0fc2300c431bdff77ddf77e597000208325a0821c8c8cc6822ccdcd86edc68196f740f2b0f6209b5864010044190b6c2790ac3300c6791f94d9e09ce9e1064401004c119116848431ad2908634bc32cc23728d7cf9178838329ae4ff8710420712bb92061f6cbf7429630e330f5686783dee2e5d2e6f16e01ae94d444f43e3883a6abdf3b8cefbe86f01c6894c03f3f02b1dc368d0f04018695d2638a970f9a820819631ec102555849842cb087ef869c22b1804b1e40a1245841145b5eaa182bc3102e9a1c20bac238086ce6811d1820b3034c0c651ced38418246cb1966b7df105cb898d1f5f60f911d6b3b656d7b8586badb5d646692188901458e6d1f19df96a40d6e3386bb5982a9693524a2923d7417443bcc5a2829922b0702276ac2fbf7e8dd147acc27ab6d2c9b23443df7791672fd7339a953155f3fcf6c83f8eea5f13684cd45540deae33c4e0df4d03f69b454d969cd88f3f43df4bcbfe8598c37f84a53f3f76b9fdb5deac661fbdece9c79197753374a28f23ef6fe4386bbd7a33adf3e2d3f77bd5ae027d63a03fbbe91cd8411353a36c9f2de394ed93b68cd4677b775e73da7533aacd1b638c8991fe589759210eb9436e4cc52e212a16ab6cee7e041b67d8eeeebe9144f5c883b599d3ed377e9999f992d53bf2b071468d1a6d818dfedddddd3fbc8b36cea8dcdd01b883e6239bd88624ebbda65f77774eabcccc323fea95375e29fbdd636415c1249974ae7c62f41251ec9abe1275744834aab7d6ce315ae95586cf4a695e5e5e60301818185b2fafb48ccbfdaa74ce392fafb40ceaf372ca1aebb8fec2405f17f53228eb98315ef402b7e96dff981a5dbd0cff1a1fc89a39a5730ef132684787dc6d6c3ebcf3496d88648c30c7e8a4191b7a59595d74c929d2212d4d0de700a1611e4ee381151baf2c8b22ecaf51bdd8c5d306886455a56e696667695e5e5e60301818185b6d89269c36389eb1abf936d2461e2b7675170d1a346eccf112cce5e76ccca6b18e99813bdfeb253ba7947ae7ed313135ba831a9b0ffa353e90d9e5c738c7461df2f92bd77abdab8eed743407367e66237e205fb8766c63f3513b1e099136e61c8075c8176216330f047467009e6283339133266776a0554a795d97942d638872d8228330b6b0a26cb1f263b7cb405b545b424aabe46ab7f8703dcea708aba86a31d56ed12113d2d2250bd23286a602163c5abec0c22db295162c55852c3c5a80aa0a560c69515d2a5ca10adf6ab55a6e5e06d2c273bd8779e2c2685329e505c5c25c06faa12288267e9c14f961f2c44f088efc7c37be4dac128759f2ebad403f37dc5a6badb51291263e5295d8251c1369e2269c48135f1bcc8ad52e033d4146079e082353d97919e80921ae08d0f2cd70d559be4f79ae36e6faf5b82b04b5725c27fdc6bd5590a56ee6ae99d9bbfb1c57ebe876d4893a643fd774e9098c94524a97524a29619c88923abd7a4a7a8d22144cc58acb7fff3b8feb261675624e7cc938dc23ea903187afec280e6cfc6f9c6ffeefe11f86216f9371be4ddfc3498fb0c77ce961af785bfd5a4a6b6039f4241db4ec3759221b93882c2d6660e37a918b387412bd2789c44f49ea4610628c5a0c7f4a8c5bccdd66eef67cc3dd0470b7eded162bb8db732c24777b6df3b1098d31454847d33edb7c685464536e9669c1c3cdb480c1cdb268c1cd5eb4f9c8445f19db7c882cf6c5c5be6e3eb02b0b935b6fdea7147312e07aa43be77c7b45eacee7ae38e3ce7f2cacdc79850d25148e8801141b4271bd999f20212b7a8298dc8e43478451464a47da2d6e40d822b8192c388835003f52753ded0a8b4a9807a8840d3af5285443048080a0009317000028100a0543498ea24094c4d1f40114000d538c3464463017c9c3c140208c04390ac3300e6218a290310621a0884246300b2a630b436f08dfa756008eb84f4690460e31bb950276d20aa5e24abd72c1966e5a270f20d3966628eff36c23506f3f65d8e231f77f866598363035e2311bb5a193f29b50f0ddc636562c6bc061a458148885114528a067a1e6d0916446637a065bacfe80b58aef97f85a7260c6b91221bf6e165aef90cdf88946c8b4d8f2fa0b3216624f5491bf8d15e8ad568626bda9625da20246f3a33a24de11eca9be859bcbac9626f21b97c1efafd4e440e2dd00871b31bc8df085f0dc1e2d2fc36e083d4fac16ba64d00b3c783e57bf51f64e8c03be19e4517ba568f6e240357eef3ff63d8400e37d1c9e4b7cca9002ff6ffdf373f4310cc46026531675dc956fcabc3566c4c0f679ffa0d2137b6afc65e5242c447382acd9d9ea89e6f7e120d076223d07f6daa5d0db72ddc3637ee2081abdd82c7fd010f8b1a7cade01bd93dfb419d70779f561af24fe87a296167e6ff8cb28a5c5b58bb1d584a5089780decf3c66b3c086e484d246387177039dcf9c8b976d116677e7ca9ade452e9cd35bca0c3d132ad648c96d60d3a41d4f94a61eb97ffc4e62a6a1405b08072c590320569ad8592dce98c0bca0d0d25bd042b31677cddaca7e571d8d7c91f98764a6eebfc4e551298353344d224095251d87989a97f1a404f6e117964688e1b8f5a868914ebfb88367dd848b18e62e09a30aa6478d74d94455a67f3baf8c3405714042955062193dca21d752bac17b3d49ab1808124ae1ad223664328a0f42c0ab2eb37544bc650b133769bf7582db73aba1512504e5fbfdf1760492a5aaf7968aa989465f54986cbdd7b56dac1a00853f44156c433984beb78e9e0b9337adfd620bb4254698890e5052f7bacf2e7a0ba3b6b6cf3e08d56fb206bd058a7ef5a43c85902697f623194752da4f872a0d1984985a3de85ffdad64d783beb3d2283dbf2bbdd917cc36c285867d857325238c9f4b907a29d565d874f89f12ef3234b88796ff13b90e43e1a98ddec568f33d6a6fee0574b7b6ccc171383cac99e19013357616fa8deff4cfb7ee0453b3069cb7e093240a79b1d1dac86b1dc2664e02cce53f37c24627e90d44bdf43b9cca25840ff2303035448d05941f4db5ebe92934976946fe8ca725a139f52f6f98e3a7bc7b4b7eaf70d43f6e8e6b1a98df6a225817c998dceb0e70cd7c85a9b85b0dcbb1f2816eba608b86477c246b028931a81afbf37a7012c24e4dc3c37ed3807672343754618b6a6f8c28488bf2d62711fd66abde5c50f70cf8feca7c655b0720e2df57e467938216da417445a3031f74c3918ebe0310f94e86a36ff17148ade22b095de4c881964a55f854b6ac4f018bc80bbdeabc6ca9d054e03090023f103fbe48f1fb808c3bcc8aa7c3a3eeddf826963a013c7134bf259e5749d3d3e02c898add7859fa07b6cc255693608fc73b18a18c7d00e329130e1ec270519d9b90b5160ff6f33c0a272ea3cd34906b5688a4ef8c222117df31d9eff03002ae7f7a98505dc8bbfa68cd25d13b6274c521f017e88143d182a5ec2ace985b39c677026437811a167b30582bb5a844c53dba78930f3cc5015790cac9c58e48ea3d096da8ff39160b0eed99d2b6e64783dc47c07236720a709a6e330e6ed172da072f90ce2889e11558fcc5a11f2ccfa246d328930ec2d0f7453c226e4edc550354fc099c05f8624583a67d789d9203f7915e2144295efbf6a6b6fd2c9275126973a8076ff2cb97a17dea02a676115665ff096919cc8734c8fbf759fa7ed6d594f7e3ca92f1bd2e7c1ff8d794d0d82deb4b08c594f30e16d65d708607be5f978ec76f2d7abce83503c6b3823947fd15e8b1db0e8e37f1cfcfc51d645843de2c15c36336fd0ed0c6d1298e1ac52d4c33750604862eb60514f88d8e61ff0822552afcb923a35429ef8b2d1f14dbc8aaa634f37b4144af238a2849dd1d67946145e1d991fff0b30e8088f952851eba1ab78a2ccac665178ee5ad39b5f23593b4ddb03d2a4133eaa9e184e28f6ece435a8f0947ae3ebb7f2e442c920788b10a731f8f82d423ef5b13015bcf2320e9786c00905f5ec9b1a8f14bf5e118294bfda104007ee0d32b391ecdcd4475d3f6a98fd74134887bab22d1bd2cf7a9c24d4f1bf5dc8b9f7b7305dbe2ab5089c7071be022b0e4690dab8e448f840dff07c89a81e060c637b80c43eb7ecc867978c0e91c106ceed45616285f86b52136b4d149e707471147264723845f184228c3940b96fd43d65dfcb39de14905524d264eaa08130dbb5ea83c3392f6500581dfb13e7b6cbff18011bd50b8478b6c777fe44a5a6a7344e3c7a40d050e05b71d1c8428cbd436170319cb4e3132f28ebd05ff1df673995b4a43ec4dddbecd3e04b4fba0d7988b548af122980a8601004ab6b9668058ffe1dc17190f123caaecdf83e3d5dfc90baadff7dc7e80978d486cf61ad9347017a08f6d8065db8100a0d3122e3f8ef4411e3c0b16e8065b6c4ceb6baee59af7217ccfc2eda9435ec30dde23285c9c68870ffad669c4e72856266ce1009c248b4800e7b7535b04098c3bbdb62ae7883d9fa074d5ece4b8c8a5789b20c8ca34dfc6df9d184b72f0cc71a6a6fac5c0970c211a1268bf48fb021f3e804b3296171b4d15e18b5b34624f0fb6210112002c4b8f3ec70b51620902638d22ee7c556e36786fe4170d2621e1463470042ccc3793ebf33d15e9497a55864ea53b3f25a6d9ae42529fc1209528d7548bfd81a37114d3a07e40c0a7fe5a1142c58ad316565ac589da24428e8641a2618753d2935b82e3568d3144ce3bc324122916e0c8b3833a86fe0edd242de41d612069953ffd1f3942f4d33ee8c58a8f5c762fd757bdc0006ef7b2e8bc713a7dc886392ab873a7741d3b9e29a16d1f9a895441836dd21d71dc1f50957886efb3718953b0a018cf4576eb5ae3c22ad8a68909d22147c8a24021b65e31a250e240845c2b50bdfa3987f947ea8f2b135bc6df532060ddf21dcfa6c12b5be704eb8ff376de944f7ad7cceb8562cbd264045b6e15e693bdb9d617e273495bcca10411ae1e45c35d086e30fab51780890bac577b4ffa59f47d1ec62d71cede9612490814ebd9a4ad6afb7b177dbb9609d51ff0cafb2adf3efe58c74fdc0d802c5ee73a18bd2d20a6e18260cd0aa983634c3926ee225b94c6a6f75ed309952704b004007321be1344869a4240239b056c512e04500d2d25c7d0c5b01c7438c61c79b8da4022c5f28d2183e32ac48945b101b5a021bf57d2f60629a788f7110280c16f8589b4924bab88f145ca14dbfb141fed300bdddf00b4284e7b0a9d8d47ffd70b0fe028591d133d6bd3cf63374e09771f9fd9ccb51b37c4d4a2a4f9b49b3a7e3eb2415b7d95a097010c7068875f56f8a22f1bf659afa363bd2858854f5970ca180f6f2bfe93613fc49467d5f95e6fc64d017038cadbc44972b893088806b07086b00709977726de2c9c418ba418d5de092d52981ad2ce98910483b10dd087bb20e9863cc161ddfb8073c83bdc763e26db29afd7664c70001d5d6e9385877346f2fc952cab0e530efb4d09297e12db7e53468a889bd4d6d7e8d2b072c5d916ea20d4a5ad3925a409384d9cd2853d0741e01a3349b14b0dcb532c169f476cf5b1749f865c671bffc98e76602685d91c749b3f44027ad52853eb8a8296779b781f78ee72210b1531fbe7da3257470b01a8bf0c211043df9694aff863e301843ca4323ea963670ed25bde99387ed268910e331fb4cd9e2dd3ce9f797399ab580cbbe208a9418941d26816e9df5492055ac387312c46c10df2035d8a0acae8b252c2ad78f7281bf49ba009b660e5f8a201361d3896cc98da845b0de4220f4964e0990a806e978b2e854fe662bce8fe28834076adbc39f0caca2b35e8dec421ca6b550a1fbb59605fb43a064d80baab069ecd3365c2a852ba7d9553d9fc1c8c2accceab1e73952753838e561faf49ba5eb6ddfacfc8400e919093c0ff96e4fcf9637e4838f22298db849f02f46241a4793e0a8e576796aa9c5f88f4d857ce2f6d20719cea95f473a3b0606d74273028aeb5155a2d4abf29afa93666622ade8b0d31de82b3b9f30f05494295f821446cb4a24471848b210018e4e0fdbba94c3b7e8be24b35c1fb816c0b8d22832a5aae4f72e5009ad26e16c7b8f5f2ed2a8dcead9c14bcb10b7be8d546f5a679c4cc1ec26ce033851b90654bc632a8eff314996ec5a8914de0dc4c01f487aa1931d63d691e069fe7f05246c1179ab295eedd4e28294c8a7f21ee00b7fa4309e7ce35b943438ae370f32b07341bdc9e0931c05ecea3f16255ffa2633509efefde2810f7a1a97ebc9ae95484279f72286fb9f7da83131ff16d8de1e1f6b3db964ba4b3f73e800192a6bf40d9fe18fcf462a9f09834eed05ae677bf1786c8ccb69f2d7bd12ee80487bc5aee8dd03bbd650fb02ff3f8c38d2a08826f87231c3fef26b1bcab82038eac9dd392d5c545d4fbaeb92c1edd947ece8292432012414f0034658aff9a54ec6fb03f6f9fdf34b6a7abe189d8a984c068299cf96b31bb63313706fa3ac32653b635e8d3d672e3d933f931a8e3efb197d22ac3a03ac636d9c74a71196c4a4c413f08a61b3d638244aec6d92e0b23a5e45145b8dc2f0aa7ffbd0a01be2d44a5546853fd450a5b6c420226252428858dc7b60a391f62ed6aa7b3a4954d48ad2542bc2f9b13b377901657e329dbd86c783650c1a8ee60558fab44975a51950d91fcd19072cec40a99d23193ab43f716be793dc48bbf07a4c5bed00c893d16fe50ba3008eba4c646e22e1c1a93ef047fb21e77272f582fccabd16717fae94ddddfc63d96387d675b8415b19c665a9dcddc7491dc8d0fbf18334fb3fb91a99eff7ef2a92d8ee09eb00dcd8636e9dab6a0b4f83fc83f414bd836078ee764276461cd6be67a2a983c832c44a231e4160e61020d3e7a8c762e232c9ad895eb657645d5c466775830ffa064e43fa7dccf51b2079dbfb18eb162f3c33e2180928acc6a017eb92d67190560e71884e004824b32efe977d625a678b145928a7687e9dde6fbe7b2345e7c01f42b294661003803437eb7034a2ab72402ac5e5b9391e9d3c5292be986c0ee181b2ff71d689eefebcfd4bd2251c09ddd6af8e19f5ce5435b507abafbe729d2f0696f2015460c5477d86e342074a7bab98f786214d651e3d7b4ae6c2e3004558b30e4462fe087e52de0564b510e2d66f79d7254dc94f00c8a32c61639fe8d27082e58836a547ec50e76e472c66dc93c51a3a8ef01584de4134147960a5895d9f762b614c8e0e732bd083c4560ba8fa80ed6f8eae0e590908800f2653306c6dd3ff487c613e1af87a10618ca880a4537f7160194221afd1397bff9101d009b2e179b9e143b7a7d63472b5a9f116df5105121299474ec78d18a33666dc2dd2cc2019d82e2c9484f5c800447242c18ca2fa10b24a6ab2b961f766caed039d78298fbb7c0a3e56c2a79205b5aca49815ce703398dcc08199c1c0f14abfb021b11083c7f9784ad9300b344e2f64d0f52fc796d3f54bf467fe39059721343b7fa38afe16a39e1776ec4a67d981a0af058ea0c2a2e536a4dca4d6f8c777c3b62eb27aa3aa89b72b915f87344c45f6026be258ad2074220059a60f342d452aab0c2c3818a235b05d939f1e0ac26b4de321d537d88b402427409754a0a318e13e9103a775ad2caa6494e612b40504eed95cd10e847628274aea9ba3b7ac31f8ea50fab2f784796aa49ad18f07892af61ca8d0722420c643461a57e5e8a4a9e53440bc00d183f8840afe75f9cb69b6d80938d3b151941b8ef7b06ba4afb8df1bcf7dad819cc75e02ee61330e6ea2ba5c7f7177ec937fb3e31fd3788da880bb0d0b8549114c2b47c24603c0245aa07031f3025b3c8e0f3c9bb657cde7759ae28b8bd3df42ea7b7f62571a9367840abe5155e4afb29b3378b5b12fb191b6a6f871be7fac71c1383ec2eceff1441b34600a21f51afb2086c9a0e13e7795db1e45604c886255fb534c768e317ceb4504e7002afec728eab35ee60302f02f3ce87f946e68a8412e3b94088b0a31edbc93a8d7e19bf0844e9243ab98ea826e25cfa9b78e5cd5101f0dbb851e1991188f8de38157795669493f92da1a6c38d4077db8865d6b62214a60a3d28de836f25f31f43334e6398f83d2c41aa5e986f218639608b3487b7ab932b66add668282cf6d32e0a9c5a3fbe14bb33bd65cbc5aeb7f1644af12cdcd682c3ed4b45a720cb4084e344ade138e400cda911cc0432af451755fb396811522ff61816f208ab8d6f167c9917654b5b8ec2fea388c270b5ba49ec815ac386f204d8e1298c61658fc90c78fd2d137ed5bccfb648bbce2b131fab95b8693334bbbec4e3da6267ad10f598f841d4af58e9d7f27b22aab0fc4a5d5d6ede9b1e2bae0f21b5607182ca641b7a4531866b81fb34c75a80223d12cbbdff6e9d3b44623dbe08091c04ca76987e852f50434fafc037fe7e4a5406f289abec8943242d5ce4be39be1694d235939072843784511f1ed1dd8474b85e02ae73f512720d3f09d91a07064b411385a2e7c2e9271ed932b73c8dfff7b6cda9119a2f0176dc264e2ab80e5e8d5f6fff3bd36a07b2b7200c9e6851a63ea380a151b740c847205b7c1f512934edca3aa8c15072c743fb58b9073fffa163ae2445f1f6d82a5a99ca1d75eaea2994b25bd241d4fba131f089a99ddec0ee1b4013ea9577a3df9ba9d9b2e32c6f7822de6f504c9c7ad2daeda1c218d7c1a27c40e8cc3d417ffabb12a2bcde50eec410919a935a23e4e49c00ed4c75fa7efc374bfe475550154894e11dd5783f56c9683235ce0b09ca1ee5fb6902d309f486739d43f89d69f0e90be2bbe413d353b6e0a81f4201c4a7848c7662199f05098c0d66271edbb124f5e1f21dc310bcd55d59e45296edde4f799f0989f12aa68cca3b393271bed5d37fb86b1f37ff4c1350cb73c11a8d7fa6a63d3dce994cd58c5a36775a5b6325f7e1a7d2f00b65568a23f1cb0c37d7742be213aa659941fa5c76fe5c21ab734f0619865b357887a2637ec51d3e63e960bfa9cf5a86751bad831ac2185fd61ddda3386b576d978a2efd540ff4204648268758e339d4e5a5cb124486e730efd4174c60d3752179787b90d368a144a337e94006324fbaa8ba71b1c57643bc17782a92695f31b39a1e17440c3d972622b972fe6709f6d5cf78c7e88085e6eb395fcc07024d5c9cead89dad38a661e75226048bf272dc19adf2a133da1cf8747b1dcff9eb530b4980e5b22da54e991eb1ac59b942a5463723eda12ab2668292853751366b17b8a04661e186c8ebc7eeeb380287a2a7e2db22985aad8b25d313801e01612051ec1fbd4b6c0b88537136ad6704c821a06b0b303bd297a0dd00b02a5ae616fa0d2eb9efb0f36c9322dbf8416a7e3ed2765fd96093d3c2498e358125b9405e0893c5c002d6673b97dc4cfb0a303bd8a1b999a23ee1ff0e75007d6d02467c4cd2c8a8741e040217d958cdc9a9b5f53d1cde6b12b764c2852482a92ff0e49b3c30a21bdb4c0a58694cefcd25f57f8a67b8387b7af0cefc163d49bef3cc137a8f903dc704350ced518ed1d3ae6b22794fff40f0721d4257d59bbd7d7391e16a8ed9b1572ffb87630787fd8f5acdf123cba712d49904ea96979e5d54c901e3e9b146a53ec4e5e9310e07220a7a7a6c9e2a195f510279abe805f21fae4609530bbaa8a312deb2fc585c7ede41ae47b8e86249a6fd70f9e17482072f99f3c2d96c77f1a8a702b75a1d09085637c410cfa015def3516347907c461618221818b7bbdc61362a7b240ce2cdfa3e679e080e294b71cdb4b110b3044956aca2c97bf8862f5384c2ba78242e56e80e0a33571ba6e1df21307245e8cf2c8d64310606e8d2ffedefe32945d47faeb6a7e3c105d5079727387d9da88ec200067602e4fe36f71aba6dc1ea0510192f80666cae8aade054bd2e111d06adac36909fe9cceee823050a8bdc7c6f77c31b130f4b424e28045b80b9c1e6d848ae4bf703d3ea6d865693d2c37ab1ceb737d9f370cab7a3df2535bae18c3a28986a43396ef190da0d5f1bf802e264ce195b90852efacbb92ae215c0b7cbae9a0cff361672bb4dd1773baa7806ee105000c9443227ab1bf196f02ca52dff6a6e8f6761f6212e65ef06ac1fb612547479af8f2a237aa6dfff1b2fd787f257c0e8ef3c3c1f166391ec6c14268c940c31e4f80a8fbb10986ac194ea8fef7f756c6ab97ce85ef8b7570b52aabf3cfff498c872f9d72d01f6f903d12894705212ca90e3abe0485e73b7f99c65fcb3bcdda57657c2568f7fb6539e541545abe3543c72c03e79d413cf0e81e691711aa2354329d30a0a59333e89af5dcd112391cad39ae288bc567c6a44af6ba979fec5b4860cf76274423e8613c88bebe9972043dd447a30b15972246565b3c12b0003559c4ea87cadee28d829e828f4c337e648155dc1160c0a1018a21c8dee9496d91a8b469b9b53e798181275bf8b34b7e1efe9605a65d96c2073559cd919a2fcbf6aa6c85f19d37a83c30ee55ec4dd473312d862c3ee25b5ceab0914f0730616496cdbbeb3ceb1a0cfb8de7924f0b477b26b021946f152dc0355becb5bc3a134027da84d65bed82428b80800d64b0a26e60b2cb4362eb226956bcd475c64f8196bcd45eab184f64cfbe6f21ab2b6925441d2d45dc7ad26957a9ca8a6929c188304c194e47e152487a23ca6ba18d457f4026aab40a97855eda9a0f751219f09379e7f86479df4bef4fefa961034dd64a02a3dbf9ae0a043c8a172b701a8e30a140b0884e938eb8f9010b6ff0ab776afd972f2e0d2341e8b8905f15bdcb0da9b3a18106f622c7baaa50054a0ba92f9b0ae357e51ff7f6fad804f8de2bdab1a36a3860d1cdaa504829437f37a88a12ee74e27eb1e84530e1c01ac6eba3ca35d9c6cd882c61852b29b8204ed55d603d697a9d00210e89cc2f2643cbd166889295417bc369030e455e334e606407061b546a7f5b3faeb9845a4ad9361c609dc29dc58c4b6d455edf962c70b22030b58e0886ccf64b9ec4a95060aaf35c6a00ad9331f7730154c621b1bee56dd109bc717d41a747f4e0ae72f9e0f3d7097ee340e1cdd471c70af6588154ed92a2fbcd8350fa63e62f6d0a4dff7360f4b7d55be805948acf0d8a8b6cde5290cb41f373dca7c3d2a9af9cb1b92a3040a59d9b0f3d6a9500663a8377cc729268642c7dc8903fd423f6f9baa323155b4a5815db21ba8628798e85e1eda35e28ea3290e86d98f1df8be45c8a780c6537e8d83325a39d0e46af84cce4893f11b645f5c74852ecdc72d80489ae3bab784ebebf6c2efda5c2d6e34791768b3ed2f164d8ef6f7bc83c4a02cee038f6b0107058f848056af63d83a9075d9f30b0f3e0a1fdd10306a0733739cf7f02e06eb76fd61b482b9fe54217a7adc6ba4149ce179ca00779d85e2a04e883f6352f6286fd5868ecc7caff3b12c97b9190e3dec54f1b363741aa591ee66021113888c5e17f40040d2936d600a0fc66a59361db82b9d26fbb8f4e513c551ab63439dbdab8e4fcc981b242af2d505c93fe8a746c1fc9f471c51ce14db0f4c012bb4cf2b259a691fe2d3233d13a135376f7893146403ec26d98129b4009c40b827ca4f435e89478229b1658299175bfc219ee3ea06c7438476fc4234d12b923fa167024cbeedfe8b2a2143ba0b3a6eddc0f19fa4873aedc4410f15591b14c0087ac80a616c106d162d2afa21c30cc59147473e34274ae781f0fcd7dc611e39b9c31d2ef20a22307dc3f50cb6b7901e822150a2e0c219568178b65c42fc8c92aeca5038baba5d97a0307637629a205f6323fdc9c5b6b2395914a730ad24fadc1e6b835c7b33fc8c334e4f90012f32a419e2a931d120cf0da846aba6079b11366d4d21194521d3ea52527823b65b4805fc2a6526617e9ae9a1cfbb354be61f0a5918a8c3351167888bd609c72ce7b80a9e635f5128505b79dd27e37baf470a87d0fd236ca799b942b1fb5b5bc64f0e16f17bec26526397171fbd24f22efcdde31e3aa4623bddbfbd3621d906b5c41a6428fe6cf804d4bc1d6da191f9d015365b123280f4f77d25afdf31b698b279b0781d7c42fd44357e95eaa279aef403daa9318b001586e44c113a245ad819dc829aa5ec4424a2810b2ff83230398c0d1da4f2f1ae457ac775cbfec798d6b539926da167aca5447ce777b426df097c10fd7414fd585e5029b45a0c652bc7c0f5b0f98d6c9a246acb847b6d352dee7a345526c9856332b6567a084a6bf5dd0e8926670a2caf9748f90214d4b374b6f0670fdb9cd395b8b0a2ff743578d2f88aa08f3ac5d743e4358091ccccb13f90300048c9c415ada4584a3cb57f4836cfc9886378b3668b8da50b5de4c8cdbd5196b2af895115dda3ad2fae938ec62f15de171a00f0e7d3ec2f6c2243a7f538881829a541aa0951c30bd18c713a2b3658d1644a6fa99383b106de9fc346d5c1b028191de3e1f02613ddeae3c4ec62538cbbf87a072a9050175d6f78540aa132fbcfa5f165d37639b506fc91614b8ffa190d192db65e58c899baae7d704ab5b552035e8e8c5716c37e4075a69bbff0631260b0df98a733a4fd280b6370a05e04a4a40a32a1b0e8d1a9bfd945518e509d2b974faa8aceca828902b83ee17b48e8a827c816b6d57d9685aa6018c3efc354e400e2982868eb3bb34cab0fb9a5d10ec8e6dd9e52052950318d16e352318d4eb63a4e9919aacb53315848b88433339abaae1b7d4158cbae99fe6f9890ea170822152a7ae4f8b68d349600729968524a722f196969300049367fdba029a1ff7cd42b03a6e23e0654adc50b28f2ccf486862407e29cf23055af138fde86321f2d34885d6f63e557da14309302ac40b9468251abf8350351a1b000b3e8618ab3d1c40188fb595447979786bf558d9e7e43138b9340f1177797b3a1702951fc1afd0b58e41e4b45a9f835a2a1c5b799fee894ef5dc08c23f6b7e32c11eab8ce28abd899722999cc84358e10f58da5f3542d2f6b39c0f0ee9746ba18acc97a8ba09620fa770369521892d9343ac41a1e7179fe00079ea9fa61f20a8fb8106d9843e03c5b3bc8043ca3350ae87d01db1ce271b1e872944dbb97870cf8aa75071a78ba834274da8c32dde7ab52d2b40083a4557719e55889fd3df7fed01619f1b80013510c4933faae3d299372dd7c956ec314f9a13f0456705cd3302eed214ea59b2a6dc12e621e7a2c41a0e2f2dc063a054bacedac4d036388f0b3ffd1889f81d8974e85c1d67c1edfaa0022c26e40aaae68cc9d32168940ff2d29c01d88fd97673f901a2533d33ed8594737385a0031b7078d632155d5ec0f7388259384837447aa89e42c20567ed7b2bb22c4bd4e227cb890d1876a0fbe0cb70c065299fe089afd5710893d058949a10ade461b5eeed505192ad3b344b11b939c84e8e4bdcd79a12f5dc87fb93a2eda855083c6b7024210e9093126c3fc04743eaa58a5be5b87a521ce64d4bb64f1a088430d05052186b98378bc76df2d3ae9b974c208ab1f654a2a2530c6423720edf6f24b95e3f2b7d3bd8b8b57b77effee9b345fee25c794556941dae5a54785c3f2b7f3bb9797af619d8cfdb7a92b214a71ba1de6ea553579f152cbb9f8e5dcdee2f25fcc10614d01d87cffd4a5fc9529492b012856ca004dd76352eec5df4eeeafaff1f50cd1d6169e5b6fe8691cbc8d9de7b7e9f06c7bb5ebedda9733f1c8b50bc1f1a519f09befba28452d63cf28d0db3c51d3df93b9177e3bdd5fbb78b586909a68ae97143b339438760688a018061bf062f8b1c4f833887fa747799449a99580094bdd0769d74944c3acdc27b9592b8151966a0fda2e7ed8c7f57b374dd7f20c936fd66cb2126f7eb7d5b4343f318dc92d4d4b91d7dff5236f9aaeb24c930f0a914fe6cf7569cc59950654ba1cc43fb3362de753d331febeee456f6bcf2810e53cd92690df60dd3997a9d8ff9555b165d89f35f43e4eae49e65bde64ba121308d4eb7651dd1f527d654d5f2e98d2875b660859259c91fb26f2c812d6f5671e7008558a69277dd7deeaa40b3b743945d99d44a75959823540c818d44dbf2c36804d2e3a3e9772e55f09583f454174ff4a6c4a13477fd4214a5327dbdaa5fb96cb5b7a60ff51e1a3ed355cc113cb37666805de254699202a746d7d21a05d5358fe8358363fdab383869f279ad872e69c2be8cd62420c0a6da16e251883ae8e73680ee793a8e6215a2517f9c29d1a12e271e363245ba400271b3530aeeb1701e15ec873cdfbbc900751f8954bf6c75ccc57c10fdda0d01d78925fed14ae9b31b89e1330a8e6a78cf30d6333531d921f4845002177810adc65c28c626cee0f457c1fd4d1614fea3dfb42a86554ba76bae3ab210ee64e17a3bdfddd2b46e18080a3ee4f981dcf044242bb9a3d19aa79abf58c05ab5a4ce9cecd762006334c4a7768cb8d50b3c07f73d32af53d5c16eb11da34b654b8899f6fc559aa25dd30499f12099987fb4cb8820481fcef51e1ed41571fa8c31d92f80e98980e0da80e46cc09bdf34a9d2df0844ad70709c17347947f5a6be88a7e41fdc20d1d66d3fe864733c4320a43a4b41b14733ae5bbd577e3a2a7e14738fbe09c742b6f83ef4aae31f04fe977600e0792eae7d5a1f2323f8f324fecdf8af63bb8cbc798c6603866b930ed2697c813e3a3ae01db0a6bd3501b5377ff7c20fef2c2cbd0596682e6af49343f80bc3ca5c80b84790f1228c223a48c86bb36ad5d7e69a5dcbfab2bbe28e04355d38a5291d9339fef8013cbae4f48f46eab7456a4a444849945e515e2f24da5dc4fa8dc6b8be56ca108b59312f4b3e8823bd95513283f5423cdb00c6b3e75b4aab3471750277b740579342db9fca3f6fd0ba2de2455eeaf573ead99f245eabf35c9a6c1b28565ecc5ffba85bce679638abcf82c10a75a454825e89d234e37e80f483e6af1e21e385a94e1d9d6dad6cbfcc386c71376714519cd0bf094b9dbfa61767c8fd8d0429d2c18a99a52e77bae7ff8af33d0739d37a7c8d7564da1185e595105ca32a0d733baee4aa18f2216ce152175e0b4447693a0c407451b23a59762f49704a9c7af6d512ae509d6575ec08be309f36938c1a2a1c655160f47984753517979000a73bd4d00426281fdaf6bd8cba313f2393e415c7ae68a8b2f87da393a5643f61ce31fce34b50938504f492949582f95bb36860e0d55572a097e37c691bfa04da98bab199138a4cb14214d69524dbca9a0aef83ab501ef3e8628ccfa7d9f38ecd45248d8015a10676c272cd7fd07a6e249f0e98bb0f33b0e910f3d4b378e678503e8e8009a00e1a9a0afcd7dc0ddf3efa1a19392d97210ee3fcf1206948b83b4b4aa16b4a4000d805efc212142f1906a7fe539fcffe2ea41a594470cfb86b889d0166eaeee94eb3d7b02d683611567b71f272d6a5867730997809602d8f893bd01cb13e72b36756b9160d4b493c5ede1ba0195f2687bf0fcd09816a609ee9da4a59331ad040552635a53402cf26334d80cb9db30e6aae4429cdb95123c047e423c0ad3a66735a05a3ab8c2c0f1d217b0ccbf4c9a26db13901b8fba6633a769779e6b547edeb092d1d9edc7a78df67fed744d1c676355aa197a77a938cf9694e5107a09d72c3aa856cfb5fc845905ed5708311f705189e2b3da11b5a53ff655d9d4cfc2d8f1cdebdd4331baf1a64c37d22763da9cc0bb82cf90c929f0b158d6235b685473ca7e369103486252eb5391c9efcc24913a0c5265df30351e3c30fb629a6a52fba80c225b27addc24235151aa9a0d31bcb7e02b7832528151a7772ac704d69ddf1258f799a5e0c8a9015e319c388424da3ce01dba6824bf0c8f8e87e15379dc8a0df825bef5aee1252c44843db1c2932c6c1a21caf7cf14ca272c990c3f637faea4b86a8203e89420878a43e40b8cbfe651713a95316ff28bdafb1f64c448ccc9a5976b630a0965f4b003ba0223228d4532b8cfa2279436b0c3443cfd066857c756d226512c0689973d4a1f062c3345b8fcc9ce2859eca089f25d47b4962f3a41aa1ac365631bf87b0050887fab0006cc56bdf0ddf3b9e7cc35feff4b21d5870eb245b172282a1f088bf266d8db8a148e199746136d0b153e41af5d04a463101094944a66afd755760e0f2979c2e82c9d679dd6d9b3151844cea5618ad9f6c5a579d46f6626ec8f259c043505fbe2ba98287fe166589184782f29b4d9224f8c2c76c660bbb3ba1566488c8c91b66d02df1877eb2472829847210341d545030fe0738d6f24235e28e709a055fc515411d5b310450b8505ea55f25d8630541ac41a73b17706f1e3c289b1e88e48e82a8505182f9d6aaf7b0fb70719244af588317ce34a7287d96b375cfc12d65a7fb1d54687febf47407d4b49865aa8b49187cb2460cf952acd2c15870b04b1eff0fb26757448bd77db1305d2dfe3dbf7201276d7bdecd4c1dde2da2461278eb646ddc50ba02bfaac8b427e9d13cdc984752eae386698d7d7ca8d8c943e4e62ff8e6899cb26482bb1cba9ac036315609f8cbdc6729c50524c98af552e15d1ba07ea42c3444369f712bfb7c70f8547fe4d9aa08eac6598d4bb613ac393e251e34dd7ede5ca9126592a9ab3d2183478fb6911eb73c371c35dd043aa2a58171bbfe07d7c18fb69d7247b470e5e92387b709c220fa017a9cb220d93b1d190f40dc0e3557e5c69d831f0f212d398c15f35e3c811d1ab7ed37d0dc59f41a393b065ad1d93eaa61a1f94f7fbc93406b0ee2cef6a2bc9b44e153b0067b005142607579044d5713de0dc4e21b0aa56fa32c770faabb85980f34d5e36a9e819f1690fb5a17988b8e668f769716f7fe4412c954d3b23df956d55f5d39ea0c6ccb0dc49cd858026d795d4aa4b1e68f9be3d472b013adf8d9d6fc60a9fdf851b9ba0c6f99e11c0b6b1a0948a8324af8b98f78dea9bbf244499494d7f8795468b839bb50999f3c3cc7f0593deb5446fd58ac4342a0ee8f6891039f3db82293a263cb2bcfbc41f02e5476b04383a3e315a35e1c22f1e93675c905116382e7d5c9659c23d9dcb8d940caaa7680ffe0f36f62f2322a8572c2630a2c4abffe9f95ddbe25338785ceb56fdfa08e10ad0bac83b2796985cf3e5862adc01bd314548e00c60826606a8630c3a05de292bb94c3b49e035419174e7981853fea9b1628dbd64547db755610d233428e2e106491084d39a11827f0e9036f905df784861aae5529880f3e4f62216dd29ecafffe3311982a4befb94ae4043b8104b2b753bcbd62d6d9246c1dfe60a0311ecf58d96866235db985f3cd215bbbdb823d7918614e3658ac93b18f876757831003d9ca498df7c3c0e326057a46c9560aac78c85d39a980b27845c76b99b3964ce64359a4969984cd165c165bb8242b9f40b415eac89406633c2bb846813084be8043a677d55d1c76c9a0a07abd94742455271a98e17de848e51f0a10e94a1ad120d1ecb58f7b47782f352ff532bb81d089b7ea8b51944b57182baef57d21d76382390242eb4563c3838ac0f863c12e23e6da51358e6e0465a40aa918bf4a227e1532b90902b845e0359337c19de9768260ee323cde1e6bbbff6d4cd6b276c4cb71864a5e3be06d70cab968e6d9e74f4cdc3941e4e604d3ec2218d2beb446084dbd9b17387cd1379f4c24d5afaf6b8f0a1bd59840977d67efb4e799945f7305d5edd2a0733e3d8cdb4f671a9c984fb3c47d56cc61e4503a8eaf41ac870daf52e62bd2862bfa4c190be0dbc10ad577015a11663e752e60f6dfca2e42ea81c0460bd1dbd1c2fec153daa920c8ed031d22b562acbc2dd45d36ad4514406b103a4089f4d58e7d1aefae25faee9763f291233ce3fe773d25bf99a484fc9aa0b3653de1098a981fdb295fabf6083dcce19dfd298191cec61fa4e7dfdcdf193f1d62734c7f28179e61a8cfd4dce8a5eff7a62edf7dd2363fd375447ff3076ab2b39c78c3e21d1abec360dccc8b289b58be80835da61e215d249c1374388d7375250940e36a0c1bade4d97662fbae45c1c7ce5ca3ac82d5771b9bb48ad70ab8c9342ef265ffdb018a2f74cfa8901685a6ee9c3306264d1b19c5a9eb8e4e90176a5b5d071355d0b6c2182b82d9df67578a5390760abec4a68796b9fc41ce482876e56a95c378380b8b0261b6b96a2644a374aab1f00201923a4df3de163781109f104593aef9de65905377a67a824a556ee63ec418ec78a3f9dd45c1fc0bb7d2d6e429c64232f1641be627c6126884e9f9a57dd9ebb95eac84a4fb4863c8c23dce821f273b4dd989af5bbf69fba57d980df3190294bc8937398454751f0be0d8238aeba6b87b09268757f783eb8317194249b556a8e86a34caa99e5e5f8dd32825f9085d82ea18832fe39b58a62c3722d473c6bc1aad236e7eb530e1209bc5bfe5576b263aafddaed115e90352a5d03291ab994c7b7594e0ab6d0bebef390461032428e17c2ca3da0f55f03d5f404bdf3b0527baa2f9382fb229426d412b8cf2fca9b6e8512c4a6c4a4324ca9349f7772ba9489f7894812382a58bb12e9c70384939ef857e27309f2c7e6b14be30f47e4a5087ac0eec0aa403758c1fbb3d04918ec916606f80cea0ae3b0110ad3a77baab1ffcd07ccb9f12e7414fb151da1c5ac7e584513017b782f6006b3e71ed2d2db08b22aec53ff2a92e387c840f52f685b252c137cd51aeab158794f0b2b5f39f24e710ecc9c265771e575072b5ae8c76ca85a31724b575da27c615a35a5e02436aa6eafa291fabf734cb3efae1b1385b6c7e8057a0080ebc4393150162398a1e2364cf402028a4600bd6e1f50d0ecb84c3f55bd6f17eca8885b531054876bc41d18cba88f00c9e506294b40104605432e59b00df0ba5d232d53f62f767960e1748510628b8463d2af2a1b6f78fc174bb871adc8eedd08625027555700a1324f6ca15dca87aa351a205f826c801d7e40b633e82f09bfd3a24d53d1db8b1017a029e386923692e6a5453085e2003381b08814dc284031c087e6e0a5b913ceed1dcf871f3f80916025ad4e167ca594d560e2f8320bd5f634e27c1dbb3f0b222315ccddb58c513ecb0591fdafd4472a281519e512b7a82f33011010c80591c8037c0680d84425bc0c2c41e79bf084ff9da0e81ac7786f8ae4c3afc365a064474611f8342c620eb91706200d193d9c170393770504e8c5c92a438ea396f5c9f714013a734e60135109cf8119e93bd7ce19378effb605dc056869ef5be49049eb0e22d864179d476e7744e3df6d7a9d8f245fa70bfdca473aa273a517ebfd93879f24e167738e7088b31e113feb1185d6a3a1683d9aff5ce33837ef46db7a2180928775c24fe4a05cdc44b9fea492596e728b7ae4778a80b9745e30e5288417d0d1afc8827fb54b1eee773319d49928ce7a1e1f1a4a37c0eed5941f4ae01165fce158bcbde4446aa9eb29b7fc0ff4fcb4ead748fd8d9e31d13d9f5ff587cc07ac4c4ae19013dd44b8702f163014d83e08e52dc83ff7ffd9ac019ac220050dd63c66faca18c6d0c725d3311575b5775cf56b65cd9a611dafaa9b4d75d27ee2bc8a99af28b28a2e0bac06c0073521862cc0fd860fdb194561e493afdc3ff3ce19ea69e6dcb3810f147f7c263e7a986985ecc4db2fdd53011ca793ea2dac0050a97e64f6a00ce7ef4f64854186afa5d61cec6954e69018ebe785e21879b8f037839c8b7fe91faa2db1407cb203d456aaaacf82b7b4a2078bfe5c9aa39dee507b442fe386f58ab46ca4571d6cdd427624464efa0c80988197a7e88ffdd84f9391c517f9fc5724d48d22d9f0651dcff11fd986856d21c83b2499eabd339764c10e6c8ee3c35cb8d3162e469d9ee1a26e56776169cff29a51dc4de2c77db374a1879b5a014b09999b954efc66b2001d7426552b0badc1b6c561aa553905bd42a5ed0908db048786ead4a62331a0363584aac6f97f7cd53d84dd9e51501e3d85884b063bad1553d34d17ff82a54fee07ef57e66a78eb00dbb5067b66a1b4fad7bed9904baf4022fd04aa7edc9b0da1dbfa0f2095066d9b168f06fd51ead42e20d4f53590be3780a4d1761d552d51fc326f7a2d6c7f3bca1d5f8432d0d598bad91cd6e683de150253661ec051927599164ed634ef8dd4746e18fd319e0a62a8fc8d0605388c4a95d63094ce358f7d8fa8a44222e833894631f53822390575a6ebcd48d4bd6ec597729b8fd47eb6a1075c4822cec0606a131fe88c5672084fbccafb391a3c38022bd7af8dc0c6858d1ee42adf69acfaf21693b6cdf30d7b5452463c9cd13e78635aa35ef6e6337daa56278375a200ccaa75586dd22f8f3e412aaa2688c6997cc4a9c4d2ea39d1bf9592479dbaa96054af91887c825151c878f49d6e8dc7db7acbe5234d68d7466fb8eea405e4543e3218314040cee4552307904abed53d468d74be61969298a7aca22e8f76abfb28b4afab863b8a927a4ea4e306ad00ac255927c3adb2ce8e9bde44837bcd7a7685831e8d80e8bd3b9b346792c5c543877a7d8515b422a376fc19953f452a0f5fafa39c49751a4960269e7a09d0798f6bc561a298e1e77c0896a0e4285e2ea66bcb3b9cc31da619421d30b5198a1527466439a8aee2eab8cde188d0d921a3a40b0513a81ca39f18333d11b0111beececccf76294daca3e23caf4b4b3550d9a87726840421f59a4ca53e926db69a99e899514cdddae967b542511874269d13a3f5fa28572aeb79e6dc3b531daef908d2dfafa95b5e1d414fbd1147e93b55a9eb3508e58919cfde5dfeaf697063af33572f8b1e80fcfe01492cb0746b6fbc3b21375f94eeaf7ecf479582e12b4a139109f4ce540d8de34babca2d4a023f2693a2aed48d74a72f3a275def8f9ca2e4c9a4dbd62638222d13558bd36a6105bed4234400acde566a81a64fba61699d4e21e26806ea2f50e2b40cbcd133b451cf81469f3e1e3c737de74051544deedc6db7a71a57339b1ba6a68c6399aeb1dba6cade3d4f5ad5a76cb11b930464d8017a39ad3e5a409819a7036d6bfc16d3b4ef277e9c2205cc497fd042898fec47eb6a3512ed9708522b26df62e2281378e4a255a8616847f977e04ef9b56edd19caa140b6ef16e84f382041bcd310b80fe5f10702feb48444c8de52a62d534a29b103d803e203987a511fc37cec15908b4732ef3208f49a4bd8fbf764d8e4d0273ff303e4dbf26127a6116ef9280ff067966c1ff370cf2bc9142b5e70765f18767ed4981d776bf4db34337397838f70c05ee1dd0de1842da170777777372912a218638c31c61c38ecf5974cb045263d00b258ab1ef60337063f1d38ea5377f2e4f76f8cdafc0891bbbbbbbbaa3e8dff476f42954a357dec30b1872aa5e1146c2f908bf00e0f4f4b09931f273c3e4d5e40cbbce39ddeddfd45db8240dfc4fe95155bdfecceefb414d97aa5dd37ca2d2b8854b595628cb163ec008063677c1b3be3677066efaf71369e6cf1e5678f911690451539f701c113c6eed3e1213e0ff07fb8f40d38b11e78c6977059e18a8f9ef13b2212f912d8436777e7767f4dfdc4e04e15f6356d58ca8dbb3fd395fc7e94ca6c11eaf577e74351fdf23f17d97fa6d3a9bbee54ce96326b81f68ce973313f6e6eccc6740c6bfb54bdf2a15374cacc0e9aea17ede043577bc4a2fa93d02d24994d826d81a65aca8eed58430831b82d68d24b6bc21445a5a0eeee75290de445a23458cd3e6f1311c66d104db14220a4e78b103139ba4723dc8c24c9c6b012efc7a5c9920f88d94ed6e706f76a5959fc4d02bb75b900f5ba96d52d6b57855c3a394814c59f6526d322511a189a4af2ffe2050bcbbab275ad0bc6ba16c9bad6b52ed72259d7bad6b5aea0121332db9beeeede4491d32876aca0620437220ccb42154f3802055560dd881c8a28c88089294cc1ba11c518849d1a40e10baf1b9154270429c20aa4d0ba11b963a3951a1710418210458cb06e24a73733ce18436ed61bc9057113b9206e30ce9e8041300ccbe1de3133332bb64d1f7b053615eb611bde4e664ac3cccccc1296a662a3fd85a129fe8ea1d2948af986f839bd8a4242424237e408090909710e48419c7394867fff860ab0bc50ed88b12b4daaa44aaab85319b14198c14829a5945288a8ccaac3deaa0de7f4ca3bb9dbe642a3bf9fc168bb8ab1a87d4d636179d1cd4fc50038a5a6361ab1b5aa2a936c2c0c6e077bab9d4ad52bb9a9fe7ba11b34b5ef9fa3bf526e1b2f73ff0dbada1ca58153b3cc64fa5ce87fa465c920a2ff172fb4e5cf64740c36f3d66c291ab1edb781b9dfcdddbcdd3210a9a8f442776a9265ee3294d13d621266ad6122528e95fc128bee11931ccc986b6d59b492d4802026672bfc24c8b0b44ab39a6a895454d21f49361bfd818d610f68ea747a796969f9948a8e949ae9686ed556ed7149c240786bbe202610e9f03fb0319c75403405f48365f619d5c5a0e677f9c1f679cf8fd2950714c59f6526938b8e8a0702b1fb8828a21452224102b39a0c710a8aa79fd34b66a756265b2f17cb7c27221839b54e2f29a56cf5c7d21a99a8cc8fc535e2585a8d6a16d6949af44ead969b941ffc8f65c4ed8d88e3d4934fe2685094fc95d48763c6947f6af56ae547ffc9536bf6af70246ec4dd98a16bc3d2a663f782754746a353501c82b423c88dec94881d17a0c600a39a078785ed3b9dbc185db45557b7bbbbafb08452908e1cbfecc43bbd3a11fd777a69598d7430aa475d4e7f0e91a7ba0b444e3d1a2c207bf08e07c9690c36c3c4fef4e1e0f26dc8b1c1bb6e1b70b6e885ed25c6186bc418e3b2e0c1f6c1c0f48b628c51ca266209c916716894197fb91b42243332f42503c7067dc9c856368db2e9150e51a4e434d93e9808c332aaf6215b154cc3d8a96054a217b57c9cb052c568d4d2f2f23271acb07da718f949bb678a82d33b9369629f0f13cbb61e886498fc9bf6b231fa323e7643cad7b9dcf4b1577043d813d3389871921ba987bdecd5f6e28ff9cb6417613e80152cd6a0e52a18a11c1532b34408e914adc2da21bb336353630646becb8ca2fa3f18537f8ad94a6536a7ab1b14d5ef537639df4968f6f39830fa8cbed2780bd34202f41320a5129478e11554d4c8e5fb3131f88a31c61863ec4e3a7094a6c79e0afe06df883aadf031d2dad969f1285164a7058500aeede3214388f091c20650b27dccc3af25e2b2a00b9366183034053195bfa2602fb1bbbb2cf36d13f6675f1b4484d72205dbb7bbebeeeeeeeeaf51ae3874ffd12b0907b358a41791b81bcc9aa4277dea8361c2af076934ea7820b588c1e18fb82f0313fb15ee7341c2489c4e27fd0af7b520752d23eecb61530fbec68dd4839f7152a17af023b68da6bb773e748e944ab106450ccd861ce479aa1a383bf805c57b3909121a7a050135e1e715a45e8c10f433b9e1a125447afafa355bbb616064d8e4c8e921989fa027507cb9c5325ffbccfeda8936d2adf66129f38399302c96d8bee6699e97eee9574bdddddddd6f24a78a8292dddddddd7de8401294a2dca8c10840283d118316777777f796af1e54147c9d6dbbf981fecc1a2e42d8344e4e0f96f1b761a79489cf836564ec6c6a10f190d8762c1177f72c8b3f882527b6c85c44749cf8b186cb914d7632bc53c519a46c30b37f074ed7501add2cb3425d28818555d7650060cfb3bb3bc29d18bb3bcb966431c6c8ccd978b2652f6d0c61cb1e8390846363d6fde0197f23cb1bd01bfe80e1680c2e6b9a23c1c7486b67a7c5a344919d56941825d83e1e328408f649d2e2ecbebeecee2e7ba545975754fb4a95cdb3ec45197783b316307cf286772d5c64c09fb3ef78c85ac4e0d2c3b39616b2fb7298108e5a74989a168b403917dbe5652c6c7a965f128e9fa617994c9f6a10ccc862628d91d80f33c61ef9fd1f98d16734bda84726ae079e2653b79a923d2cc3028819595ec43ddcc31e4bf705c12d36b2359033327b6b60938d89d2ffc2d572b9f8992e402f201651663f4b21646b60958d19b23558cfc6f4f7b775b386ccdea21246f52f713571fdbc9c00c527b3ff4371d188c7451794ad893188328032fb09c0c596a6fa7ba83ff2ccee1f001759ecf5d3c0452155b6c6bda031fd57ccfe2ab3ffc479154df54791c2aa6206cea1749c0ff56c8d2b4163fa9930fbb99ee9429a72261e00ce9768aaff85f3229cf3b0d70f5bbdf25793ad71267a18d50fd40a9afd2f3ad7c1ec77d1c4c87425b363e07c4753fd30705815d8144c8aa6fa2194adf122a834acb235981534a6df5530fb5974433667cdfe2bcc7e13ac32b1265810e6045bc21e13f61afbc16a388c867b82f56c0d06048de98f82b13028b3311606c5ec8f58cfc47c044064fbbcd9dc333d0eadf887b0c518638c317a476427258a38bbbbb9bbfb469cddb9c7a6c2065e957ee547a709333f1993f45f8da95fe26c14b5d2b1d8079089f180ec41a46e9a82d80d9821841042081fa09106524ae9d98cbe5ad48bcfdca65efc1552966559e6a2a9e83265cbccb2ce87ce94728686148e19524ad97dd884aaf9fd30314c237d397c2d267cfe01839a16af28926559966559e6dad78336e16f967599a660c633931142d148691a13416f423656694a690acb7c1bab448565be8d48a98ad2948dd530a86c5f498a921425292b59f013b43c2993f0e8e6a2729351fd14180b526a62852c4ba7fc000509ed0084c88f29cbda5a55aa99febee508dba752f4d0014bc2c59bd9c132dbab6c72e858fe769898c35df2eaa13472894fabe5e372c248cba78706584ae7cdf66e7734452389eddbdd1e4a23e70b0a777777f7c5d1cfc1f1ef55332b9c8ed7ba6fe6f5a93c2095a23e68faa763623b4cec150a7bfa17a99ebe8e4c82a7cf63a3a289113b1ab5b4b4d8010bacb8020e5c5e4e3a3e0802593d9059c649c8d08828947ca0bbfb8ccfccf44a285be1489c0d1a137e8e0b09dd80313f20131bf930b10927a08a8252247225b8bbbbbbc3283bd0294dc49d1b1706382d8c106315cc3d006af843867c0af429d090eed14c3a1f97d6f274b72d45c1777171b97c7c9830d9d7841f1043135bd6d0f497773e784c8c2395152a8e7861199e9aa2b4f8f240a6bf0a29e90ca833e03bf765c0c5842d39b0d054cb6431b1df154dc15f1f9aa8039334e168f4e2412284104208e1aa87c123129346b8bbbbbb3b8e4b126aa4556487c5da19828410d68e936fa92c95add25a62cb56a257119783513837589a583670c36b91837c0c6bd161337140e33493db96659bb357c149fd5fcb0c3ae1f4ab072174765f5f6e77f79f70c7e787c8ceccc41abc220179388d52c1c0380d042820731a35356cf0ff21270d4dd13000ced0d01ac71b674220202045612fe2b2f77a4cf8dd353c7922d18c94c26b7777777777e609dbb73c3c3daf26b8bbdb3d480c92699acb4f677a8c52bae632ca2044997bd63dca44521a21da9f7df93809121af2793121c2129f975ee1792ed8be75b956099c1bd492a1345c6487c5da19828410d68e8c274f842084279e988a00044cfd7e86ae242013c5f62915203a31ca501a6e61524400e31d0e0d276214c190152ec0ee15eff4f5eac1f774a428ef81c387f9e9103b55149492e5ecbedddddd2d83880aa686eb606fd334224855f6fa327e11484de87d14f850f3f439a7e93a4f2261afade1ad59b8cbcb10420857465b8b24713b5746238d341a693a72b0e7928404024b252c0bceeeebcb990e89707839c68af810920a52881ce3c6e518631cc9554fd3beb5ee2487b6f82492c6910542624819441b6aed8916a4bdb417cb7c5a9006c4329fd604ed477b69411a0bba062bb64f63a231d19ab436b44936f83272765f5f76771f954a53021ad3dfbf43533488048181d087dddd58376c5ec18ec8b91ceee2c9860941850a4ca83619264f5189099bfbc35df92bc88ba58455829bf8a35d69af10bc584d5828b889dfb2abed2584c5aac282c14dfc97ade9667c5d992883bb47131091652f60a9e25b6249688bdd521e31042b8110c9942843414143424f3668c88f4c1e767eaf0f638aed5b20a0753225c90836f83253c5490fd0122f71e12e2f4308215c692ffe1ad7a228ffcc1ffa0032e1abce84514a29393f92bd0d77d9371441ae274766c830c61863471c3fccef87e92fe285da2bb093b2279cc16b894fabe5e372c248cb67a5606d1ff3f0f4bc96300961af598c31632d6c09f66219272eec09d6c298601886b10631960fcbb40b634108a18722c0d330805337c3cb20800000e02506185ab4949464c386358d5ffcc3ab1aafcf3ebc8409cb8c6a9e467fa7308dff96cacc7fcc5ac9fcc73b335051d01a1c64fcb75398fa1b45699cf08a470dffed9318fafb43c3eb6c4cc3f86f7d30f5f7a534a7d75f97eabff58999e1b53b404f91a92ded4293ed519a17800caf0f446902f005e0f479bcf84f93b02e5c76a851392cf312430b185e6bf0aa6c4c7fcb8a598dea9512f36c4c8b46bbbdd7ab9634ba4f6e33ddb7b9acbacf45a6fb7e46f7791387ad6919507a48676bba0a64356a6b58d6d0c5e8606815a9ea3e19d37d07e83e9edbeade1a8eb231fda9164ccb004d0ad07d1bc7cd52346a6b5a480f69d4d6b4918de977e1b2434286b0585c83136283687ad3b3c8c1f42c2c3ebe8805c73d43d84cafd3144d6f139221a824edda08bd742308808016f3150000280c0a8401e2a0783cd014a5b70f14800d69903a7e50369045228114086210c3300c04301000510030c600c08c328a19f404473b82cf345949c1c380783d8d47f1e1a0b2293f275539af123c28586ec83343905639dd789623920a43162983ae6a17c9ced6543f71e3a70e3b77db3dc4619a3e15d979891141276ebb72fb4cf346afbc7365ddfbc44df6146779b39ca1e992dcca1b4c126489e7b406a0f4b18a9596e294bbca010288d528facbd139028aa8bf40ab3237548b0cd2bfb3e1f4c6c1e9c5f028ca4a2367d5470e1da6a7ca6da9f84df945bcf53f000637771c99a8c8c2ab3e55ada342e4ae9bce4550f4e274b258e98cb4cde5af4f7ab323c7041e81a2d3d8c809e164022b8d8664f450e45c42c7bfcb18f6b3cbd254c89e5281ee366983c68c60343b39d76a3868fa11a1d7cb923101bb5ed2c3eb7d8583df8934c583ca2b883ae51df0f9c25c61fc8435c65488cd302e710d49b9a696fc5b05647c18880293adec0a126195050f417d79b6cfafe0094358357f068f0f216238c91eb9e62faa3b47846a3a1784ff6480bbb2c029d96a5b71e8b64640845f2da7be489ffa2d8773ef763da45ad142692cd0a007ca2bd0a57d615dac94b3bdde22cf6bec3a18b71888a10c172f1416b1332e43b097033820d6d3ab6744a394bd153e3dbf633628f16ce9bc86a27260a1c3a382607f73bc5f59ea9665fe3d4f9dc81a19a64f151bb5ac265386235fbcedce3a9f2d0bdb8d1527328f1cddfb3fb843c113d025c2d9922f3d01379aee94cf644f73353dfdb1101f1b6ab0fb595591010ee5d1030de49c94a63d3b2a0ace53c9c627f6fd4c63427ba26688d5c015ad5313a61319f436d539d49345f32f5d923027a4c12c4d564202299285614f38182b2f6aab78d38d0eff607c2896c60bec0f0cf407c4abac3d6133d460e469e8e03b23d3cfaf938158a6480a273a16b98f96498ae0f35f2e2eb18a5c0b2ea9a95debadfc5836182eb39996c1d72e7fc301669869ab2a0557c90266d3b0eb3b5ed737aa6cbd83ac2c7616cdac899322953c047b060a876e39934f2703ce05627622235ac50b308dd7c3a865022d417a8d5ada8c0b186584c6287512f1ad63e873d3b7167a6a500b7d55d519e0489322183fa9639490a7b898cb86ed77428b84b31fd2ef5743a58dc33497cd133a2522f73342ced915bc340f76b0034d0ad3542d442991841ab12642b0f39d8486271df17591a5f3223019d9fece7395bc0bf7e583d44446ecbd3403d7b13479478073b804ac17e3a1116ddcc1eaa92548a05c356a3e674f94cc597830a08317dc71c111bfa3e61cb664aaeab36309e460d27500a034c34bcf7452cbc86309ae08f9416ebf094cde8051af5de484bc5e7b95e490187e2a063af67acacb04ffb4200c82d5991b322b83990b7121c757305b5aa7a48d7558fbf6338a7c2b1ef5628e6f07c9eaac25d7bdb9c123989ab894b700a205df9e8851f7711408cab277bb16f62f20b92d7d7c7fb1faeafae292e9739a4f5557f1cc22816e5517c1ce36b43018f4a1b8d07f4293dd6d612d22b2c8241c83da6b8c6573036121447db7e37ee920623cf3c9d333037e0749f992c937f2a2103bb9da138709c9c9bd68b2c9ec51c52a73ab62306176cec5ea8bb3cc99ec05721fa58e9e28b780841e82c869102dbeb32e6be4bf1ade7ff250a7f9c2ca2ad6f11c9eeb76fcd6b87f256b22c5bfa8712864e3dfe6dcea58a9ed5c886af224bb29d0edc92fc5d5e7d11efaecb31bd63f3f43fe99022ea759a406049cd0c74aec9054708473716c722a287419e6a365faf1ead2524b9ed07c75e0a9dfd85dca9bcc233c4bf9342b0e056660cc3f22754cdf37efea542bc1338a4126f610e9f3ec98fcb428bb363643112c9de87923f839775a229ef792d6f24a15fac95df06adec4dea9e1111c48f2157af7358fa4db1db0e70264abaefe599ef55734fc6cddb6c674dbdfcd716cb59427f618eccbd95faef0e2e75642bb73dde48f15b1221d5d91cd9f9e46f22411dc383addc07050448edd0779ed09531dae1ea3bb8ccb3d08a997d7ee1a560570275d475500df29b5d4aa3e072196b5a49c7fce9a750434717f9012ee867e7c1d7a0ede93fc6621c2760f9fef4e4cf3d2a448fa431fc985a11713b710618b001b48bf426f30631199133d122a85dec5ac410bd2f51ba7369e5da45fcff065465746eee37f3459a97413b668d13877d710e1f3c0b6a06ff204227b91abe8e2bb02a1197e03400210d5afa454ec9a76341c426e811c6908c901f8dbd402bc51e38018f90690c4911846ac8836a9f806ed3077e41c547d345d78699ac8ad26efd996cfcac825cb79ae5d97127e5d4cac3ecc903ddba837419e70d5bc218cae17163f935c9e29b4c1d5baa1ae0d9fc16ff625153a9b7079be7fcd509c4d69351b6ac67c478320b6b0ef1ddeeed7ad44bb230857c7348ce45fc886a6251aa70be3dba232f651b6f1aa108a71e00f52d9e1619ce7c6617ffc560a240bf7c05564004b8dfaa87ce498627bf45231ea31f8ea908051547ea2b665d7934ca11c22872fb14d81f2391b155ab3718cec83bf7c798cb068bbaa3f698a5e1f189d7c4c04adb944d0683c9f345faf4d24ab148932aaa2f7472c4a988ca09a3d92f46403b55201eafb83bb893b752d040e81edc696e4f0b53bc7b05b05f35fecdbe9978c96565b6d12039afc342d762c5a3b83495fbba455e42d4dd2f4ff720395496f3616bd9b242da660604f1d832fa801d03cb963035394d11618851598bad30aa35a90f0cb75b0e298f04d2f87542431bee5e106cc03214bbdb76ef4fd932280201d1912bedce4f9c0b52300851f37e6ba1f40826a76a09e46c8149a59d7bf9a4e9e91820849f1925ae7b6609f85789751ab69b66971aafb2ed66ca692e27dc7c20aec7a812eb5068805e41d58ad4e5f0f1bb448e882d7158eb2afb1451a41924355962150d2e294f016a3466067a68c52d577ee468ef8f87675fdbd7a1ef5cf83c0fd2d582cec20eeea0e53d6b4a41f866a15a51d838a6c12b99b8fba0fac47ed2e328ffaae5f68d0b97a936e86c66a7f116a5d76b16f2b7aea15b6cc1972cf338f2f490a543fafdb1496c1ed92b845bcf6549c5b8a24426cb8ddc9e948e88f86823a5a7ec3ed14cc17dd21fee43526b6a97b11e363233e2a5fb410fef53d26168be1160f1f227e6665541874b4c3e525d58a2a83dced8e654432350c0bb795510b45403d5078f558aac3c3ed5eab7768f7ffa7254b596d2fed64f3cf270280f2c497f59b7de5e4ae37658f91b4ed79f145618a8b514ad17f1be5fd68bb66ea23dc922a57a97811b7057b295b34f3346f216981871dbcf8286f769ede3dee9ab932d414d7e6386249e4e22f9283122c6b75f82af61e6878f4d8926c5e7c7cb7bc7c1bf4353400b25fe2617cf185e2197d07f052837ebe602116e1839d2c8069500bfd82bd4cf7af65aac38df2f9c5cac63aa27ae19a0994b756f4fab0ce0edc572107c4aad5118b7a88dc54b4be8af89423e785e5977524e3a7176b180fefa1c1122e101397013f0eabce8e5998eb1c342fd8dde63415d2ff6c4e37c5c023926d40c11f17a0b9c7310ab17b5b29b8f98f547129a81b1d658df9a4fa3654c3748d531652c9fda7f1824950a8952055aee75fac05748196bb266e6ae171ac9e7b9c11c27719905f5e07a5c31ee60b7f480813873c689cb1714696a5a723d26fd81d97e3ef1d18dabe097ef4632d178fb520f216e8d3f0c0df95b5b58c3e90d6381eb1fe9eb89c7e8bb809b48e392607dac62b6c9cc146a97a43abede30b3c932a128116049aedfb0dd77043bddb40ba6b573a5876aaf9a601d78a669f9b24950eb7a0e83bdac7fae41a72b4659e3dd4f68d6db66c5222ec8b78813847bb5a13214a4a8d1208905a949e4d482d6aa9699ab357130642b942f940655c56b7f0592c70e7cb326f0face0f050b890278612baf65f6b0031435549a9feefa4bcaa00a25c5916c69e1675c16c8f52c07b5c268666bafdedceed4f08264cb908efff32d856b07fb42d25c67b7de4ddb58d40fa7c6fcdff17d0905678d9390de43f505ff8feb01a908b176e870a51995d1623eccda860270e8d76b27cbb49133784105e0756a20a707c1c6d313bb24f05ea926b170dccb55d18bdec96294b3cbdc66b2d6b88a4838ed1a3188256fe9f5022d736c89ca6a4a4496e7469c0196498aadb89ac4fd8a58158433fcfc2858d47de46d480df73cbee0cea4f9cd7e934e2147974575c88ff8381915a8d94c92beab87bef38d98ca54b47f0c803fd9d6c0169a4d72a2d245b5ad605e3d226acc6d671692d714384c4f15f1b8e56d9c3c5cc31d25db415dacc780f034d82080f5e76f5fe98c58b43cb36e049bb9f47236bbb90e1e65cdbe81584a94d4c1f7e5125977756eb38bc2755b8fbde14262ee979506f4839dc135fe8bbd700d277193e075aa73234ac2b7ccf0d0003bfb1c167f32d6a9b644962d8bf33e0cb2db5c9ba4a5f61157709316db760a8f2850fbf4072be54c8b64a0edb089449cf9c51f4b5180d68ce68992132c1181e068adddfe1504ba54d03e9e340bf3095798c0140ab77863311ecbe451145a6ee5a62fc748085cb04b3d189542cc7fb82d70803baa5defca04c598977e194a38998439688b829c598ea545f59b520b7298a997fc4a769045f6113d9f20cc55503005c726069f4f12b955a81d4c9bf7bc6f9297319b38f22315e947983830e3e9289d8f931e5b2bb182be2fba6b0de2448672b78f15cfc6b044fbba45d5d448fd10b693d5bb82a0e77d7889029215c29971723b8150d998d238b4671b8a77b44b6fcbf235330f1b7c5616d61084e16ff9fb2388ab10a5798467617fb9867e28b05bb7da265e9a8af64beae5016331b4d07a1d6bc627afcd83cbfc41ffd6a82cefdde390fd1e15e9466cb8606ea6d611a50b180bd880579a3e4ca091f5c27676c3dfef65f8f8dac78b18649998fb6efce404c0530ce4d9a9392bb3711c1ca4e3510e35cf2a55fa40c27093896f0228ade45d6efb4f18a04634499bba1985a91c6c08f0c4ee989db2748eacd8a4edc9cae52db49b58815449606c8cddd9082e57560711e602b6a1d68eb5af350d2b78bfc802c440840ba5895158d3511a3f5ebf01206ad6649e0b967ed32a80c2782bdf08c3719d861eb26b7cbdefc44bca86f062e6fde8335790a4e97c106dbc6c8458cb6783cd58e2219dcb7faa790ec0202cce4053ed598f537103543d4099dbf595332d9e2bd4a120a92e60bd846b7672cab88868b87a5c85d6e15b72c2425dd3b91a98facc558c7e755ddd111f428b8cef767279303bb9f7dc24645a6d1b35d9027f9ed8513e0abf52ab66aeea3f42e2950a102d43ab8b6d87ec58d07140f255494e98d9d96648f2d46142bec1d9e3d837ec3989c88e032241021f1bcb689d5459489fec39a44a6e41bb396ab01af1a5c9247c2f1cdc40ee61cd0062f4662e05d35534e6270b41082fa9ab91ccceac6c38a7a40c76757b65fef8d16855d13d7a110302860f66483069a04df6d72f4cf23203a862bf5c0f7419b1861ecbf6170685ab4b630bffddfb301df8dc440ed3a2c990aa9b7d4cc85478e045d3d8dcc833a50ab2f442402c6b6814c19082c512b2261765835c92998541661c0e98e7500c0150a1f2ef7be3c41ce18476545e7d9d1eb6d598f722e554ada39f96ccb95705956d050d6046259f01d7cd65250cf72ad978df53fd329dff757ebc797653c4af12ccb1e9e9c553aa3cb113fa5e1309d238bce69199ec23c55fca27c5936db51f1b78a739bb3e1a8f39c4ecda3ae905eb2f14b381b9a1cf5d15ea23bbde74cd39516503c86dc86f36d33a5bd733c28a5eb2009759f75fd69358ffae83ab18198c5680892428efec0c9dec911f026ea8c025ecdd6ff4255b4240742df3bbbaef27afc17139d40655d4c0ea03e145560c43979defbf1ffbc36088d339adcb820964f647db9479868987365858911f24cec81de8f964940b7bb025967e9f3ee07da3698a2a7bc3802d42260a28acdc0912f200cc3f4cfc2d15604af0d82468dae37399bc4c95b603d3dad7ca8b705fee835b780778604e06a371115da0b78ba6c1935664b741d5d6d721f95149559eeaf509ce89e91eab2887e8aa990bc9a237d3d686c7b330ec2b920d1a9408d1b9cebbca5d86e80c04e6518a0c99f8c4102d3ca50201e0c08e30847307af324a2f9b07de1bfbeb149203e55e9d519f5c26474e6fc98b851071d3ad4261c913e504507f61aa692a9096c6c9f4a04e99896f50f7b8305d313caf8e6188b1c3700aaa3482199d12ebe47c1f2e7711806675045978c09107e3530884aa7d86ca9a81e0fd0abbf470356bb7068f9aa15b50b7f5105b870da999cc3a9525f9cac52cfc47b0c77bc7022b26690df0a4386ad3f17a9eb3517da8c4d707a209c03a32479dfbc01a234d4e0acf6daa5498c37d116192c0b4879ae02b3fc9d4ba5432f80f15d709ea23272c9132657fee2135afaf3c662846408294ab5741c6ccefec8538540eccd9e3df53b07a8a27679c476548b1153d65de0ae715e87dd74242e18de867886853d78d27346ecfe45ade119c56da50dacb5c92d00e3ee451d7ce1a61f32d8267f680c53c90e6fc49c2ad4f0dfdb9cadd53b55abb9adb91cfc7cb49be33ddd93d777f3a7aec7d2dc450c4507e6585bd3fc0ae41e2c583b277a4e89169193c7b7b94c59da1b4d392f48b6ec66b820f4245024d7141166fb5f628ba8e816fe6fe819583842c15a01814ee9f98282f0191a362697cb847d2145df405d418efc897970d5c9138e7bcb3224e576248273cdbb2bd9983c31647d3a5537abf5b3e61c0d87352d980a118dd7f210e7b4c25a0c1b78ae8328014495bf213fd048cd8d23a3e81b06d83423137a7cfe00fe12f1f0ff47d79ef33310fc16499ace4078c5938848a5b6872a8379f2f154f98038654790bbf6bbbc168fc77e8862ae02d448b38f5033aec0f7b92a602a2f8ea36d0b6afbe3d9c8772318ea4bbac276b8eaf8aef43a4a6a39a3079d9f6b9640caa2c4ccb542de12d0fad3b0ae13541fde0f69c647b991654a8eae0cae24467a31082cda3dec89c8fad8f8645a591a521394cf7428c2ff6912380bc671a7ee9476213c32587a1495a12f32ac370e4409b36a4084cc7ac0d5a40715b4f889ea3cb2b41164cd095cef8bf89464aa01e14b3cad48b77c0f4b208dfea7f03d6a63570385f7d7b23cff8c4b719f1995f1bbaf7e103e41339d6ec6f14e68d6eda3dc60e56d66cea95ea9a5f781916a6285737d989e33fbd38756fe28262fd2a40ec7848920b15295d03d8d8166e8a804da0bf84b7236af4625a8fdbdb1a6d71a5c65ac73c6b21370923c5945a352a29cddbb037fb1e6248d2dca8d5d084c0d41369f283a1926b3ce1d5dcf885d09cac7d4150f0261a0a9b17c039c87c8eefb8c976725c5de69a2c0eeea583fa0e14b576ef47ab4895b3771d918a5088f42290e579412cf905ab070af9853c0b50f12069bc55a3ddbdf8f4983dfad3c83617b7dfe7fc1f14e08fbe869c8c7450308be2eb33f3c910c8d6b7a612b05fa000a269b409f5a431abb10245bc5d46095ffa28a9c0751a86966d6a6a8fd5b956359c6eb0609a325efee83982db846ad38b79bd26d41a303ba419dc9c6ee0e7aa2f282add5a99d6285de529ca9a3bea9ce8fcc05c33b34b5facb54455e0859db51840f488ab651a82dd3e961eb6f3ad04d751b6d45b98f501695bb1c40a19b511fcb5a0c84a919eb23d4c780e9dc41b5b90b4d39a8150ff984cc51a6fb9ec7a17af0a84f40aca541eae106e14063dfcee43bd0f5882228110f961ecd89f6890abc5e25ab7c1163ae78ab8cdd39e64cf810a34b9e73e3c4c21be1600c47bf15aad7c06ca05dcfb6471aa1dd39f163792fc7163d7c796c1718189aa83ff01445d8d1df0dfe634b1451d4f851a29df6d9f265a688053e87b184583c762c9b26ec700b966c449c5f7b72230564346326b057030dccdc0590cb8843006fd5f24d922af220d063165fd9b4062f49698a1137570e01a10c2bada7b0c0cb0418f505cadb22113bfa662f283580893f3108948553e0b2cbcc22a3227940371cd08b90f602012f2532a0b167a872ea84c5f52c35c61464678baedfe4b9935cd454644742c66eb74ff281b21d97472c535cd6ea5a1a1c6feb6841748f5926cc190dac7512f20fa8eac244f67b0d71cfbd43546d20f89b6f84f81310281de11727d3c011370dbe2c80eefb7a31b3ceffffea42f5feca4e8e4b0dd037e55f7876fd71b46720dcf044daeb7aadaccb1c198955defbf930112df1c2e000bc5cc4486968f9e7919b52feb7db02b4d3d42f0f6ca17ace004151f39e1cf77b9aa86b727c0710c53f80decf92056e5001326287c71b1677ebd688ad4a4e750fe133fe854bd94ad47646b6f59a800436b62e97890901ed1a24dfbf838a93e7a1f09606c041f33fdc5258800a1ce69995f432034d8bbd0e041fc020f657aa34edfd840cce7532d7b9e1d8510bffed1c0853aafb278975cec111456728b2dbb939fdad14e6b87def1cdd122b656490506ed9244fab8926f299011153076526b97ff39df9a904b64ca2203a196ea7dbf1f2a06ffc3c6b0a113d3e88f5f4ba48be26a1bc105550d59d924c079db676e264f96cb07dad7b8b9830a6a9a19392f56550410e0e3088854b9b9fa10def4b7541c828eee5904ce0751b2e166bf83f84928832e5945fd4e9f7a89346216f8f98594f7c20778c4059415c2634c2f6b4611ed38e4a3b3eb002e40c2a2cb7508cdf23cc276b6ff6b869d0522fa5645fb6b6352a6e02c7fbfc7add617ae7a8aeed9172dc37ef15915723b0543a5274283cd8ff3b6a619d31d278aeb0f5cf006e88a73ddf7dea2e1e2c6755ce7bbab4bea165df04e72d50d94801c83ea846534081181cad8a331d79bce790798a5ec3b657eea06b78502e50045390cfcc65908525358cc748e392f58a92a9ee2717013f1605de59b4b9c1f212d4cc755f9edd586f2cb004e934087ddf8ffe46683af378b806c821a0ff5b8d5dc98413c0d77e004d79c514f1dc3651b511fa1cb45c7a6782b44e28ef2648087f098f03432c7440e992ab90f12e69e4b5593501f70bbc9805d4b9792720debc32a6225c6729f5bee4b1a9b16bfcf77f8f0dbc7719870cb3a0ab6f06bfa334bcdaa3b9ba6d3716e156573a9c06f2694efb317b46b99a640e7e9dfed0041dce37e3072d7e95531eccb64d7bb44c77dc28a293a652ff2a5516380ce20e7ad9e6374a51a9beb15a6d20b8c2c1fc672065130b85ef716c72bd73061dc108407c04f1a0a02113e44503f306df63f486f34a099a8e6b4446e82a969a56c2e37b453071f10d17026c8080d8b16880d5dc69b6516e595c06bf1cbe3e77329db1fc993c6fe6429dc0af6ddbbef2ce3e4c9b43bcd24fc45e400d0988bc6a095eb587b05c9d282c3fc2fb9ac7e35cb362543644f6c289cfc5cadef41fe945e30ebc9a545b307debadacf515d3ebe8809496c744ee25526420bf25dc1a351918e6b65e21932f5439a5e67f9c0de43cfaed222d7a04f2a2071316ffe7346c7499ecc7fd52d358fa44311c1965bcd197d7dc14f6c28872a98fb84f642fa4ec409133a4598407565096274724452dcae1d13c25e95e546c3f6913418eecd82d6b6eacf6f5141e32129002254f5a59e454689cfc540bfaf21da7a4705a9f6d5cdcd743b07ce51484273990e015d571aecec8d9f20375219d85fb32beefe5c37b130a404777956b171fb756b4d9d16a12b21a1e097b1230c6facf1562aca97bd918573696b7bb758279ffabb74325167c84d16812e764d6da2218dc45f3e83c6bdd90fc10f419bfcb814312cb958b7ad357e2f84a94ee16605030e8463399bfe3738645c1359e769a7671ccf2786f20108bf34cc56ccc4603556de516ac82454f8d2e3ef646032b6707d942d16d82eb8722734b8eacea23a6080e0767f1e92ad85e847dd28f6a7a09c03d030ddefc54b483935910a17c0bb9f184c64b03025cf990108a2c00a9b32fd016b09c97f690532eaa05dd8183a9497a0aedd1ca936c3f0f8dac65c287cf8dd09c0fa7c5b646a4343b98acb8c5c58a5ce2a788e8968ac15d95bc5596f9f68ccbabef4483530ea070a3d7b8eb0a25fe41e9d930f6df42fcdcff1e1b59e5651db264e5784911a86a994e8fdcc0df3874c70c07d0d34626a71518fc0d919ba2487f863435ffc9da1bbf8d8d48c54e849f5a7ca2cac0051f14c898ab71b7bab0644c6c579d796a2af86da172e3379eecc2685e7e938e95fea640c26b450fffb8fcb2b5f9143f05362fd7e6575c74cb4c60c547529cdbe2296f895298563fe4376f1f15d0741a4b3cce7f2c2308600cfc014c4251ae39477927769e759ab58189601cdd4a0e9984c8aca53a16bcc096ceb4d922b57c464f791e941cae39552ff9018628346190c55d7882486c7923ca21c3b20ea76889680382753d54750d9513808c235e3f9bd729777062e2c87de7d3b6144f5e292724a2066ebf46b8930f7254fdccf79a8658c621face44a32b50979d9c2445d939e02431a51f3e1504815f0638f8df29be6b426e7f86c4cd281572f7e51367a1ef37b635ff825f7c1648ec85e6ca0cb2e503bcd0c292e4738b317052995b41944f5c94b23a68ef8daa1759feed2062092c6869cde15e35a40c5a8d73f49469f9ec752c0da2e7089ff35447c7697bd6a4f90486c7b92d42f7f42d08965649d00c5e2a82217c56c87c2c3db7167470ab55d7510c06bfc6fd001595309ca40d56f893e23442a23cc48e35404a4cf41189d55014b7c97607cbda5eb2282a07d197beb69220f22b86911dc05b45a9996c55d86327340a253e822688aef895811c68d55a84885d3431f9a88a5835e5b1f5a0db26ccef1c899b22738476f73c9687c37ee088bad4881219918138e1060f7750e5ede5af5e65004214fda2956b7a51d0b56adce201b72873296a9daaa53f12efaa7b57f456be45f117f726a97bc0416580eeb5a12125d39e3f0ce167b0be5b11722527552182cf7917bfc6a683c126328e240a2a09958127a0483af7a8b354e057bec3738336e4f7ad623a92080de88a0a29d9fde9ba61e768a44195cbb851477837a47c91775da6b26a18b11bda201b9177b9db1dfc238abbc402c7f0c3a7f308a23b947d309550f26f79cd540f9722464654a2ecf6a5ef4748b0093ffd8494171fe394d24ca00f03ab15cff12afc02ee0b551c282f0be02531b874d966a7c57ed912fe49fbbe9c2f49a1bae41305520e058bc7567d3b03ad1f923d21986cf956ab217951486382c9769c96eafdb31579204b713924a7786585143e3280057ebb996e4cca90183b249296a781d4ac48648b240253f95e68684522578be45b0d083b1be205304f85d35caf8faa97d34522ea233094201f963a5bb3510422296d27ea76df110d84ae539de31ea6090a037a04bf9a06b0295fad1aa72228647a3a95fb464f29f7f11cd1a2cb35e6422fc6b987b50c9161f85b79927f4057130bdb1b3eac6bd12feef3a33d8eefecafd8fcd27b6717d13bdffa56933ff7c38fcacd6fcd7d0b943b8fd8fb4f58ff5d89510456b17093dd986e06289cd19b87c9bfb1299b8a2d8397f6946133683d2789b24d33aa870e014ed6c2e2431d0094fc361dc1ece4f5cf43036b5e784314c0ca4d2e819d4deb16743ac33a0f9a64c58272f15c0eee083ec22211b8197ab6e55750cf4fd87e9e1ab2e6e51bdc0819076e591da8ed60d05f9a75c750f419848881b42566557d741a1e3a5b7931d5105a53b4175e094cb09fdfbf020d12cbba199237a661062709b7d002500b73eb1bf600257eeebd548be0752c0ba8af298bef84780a95690fd82784886f5abd08157742c21ca459c754cb2c2b91b9a3c1b5b0416b5c4ad74eb1481ee2a45fa3bc274d147806b2cac0177c221ac2258739dce4fd71017c0cf84a6e69e2ad490e943528507ffd54b9edb1013a7251c1e7a38d40808d1275dcd84613efa57df9c2019a0edc2ff7adc7ede98ff84b51c95b060dc2f5586e683d87bdbbe45ed7eb31b4a47038f3381f5a8a55ca6950fb10d83e782dbb53b111aed0c8a5ebf04386ab229a2b11dd23bf74b47e64a0cb760e1990d9393b11165e0202c9cfc9598ec909fe00301d254fb6fc3389d872ad60590928f6dc9d811c1b37714a1e06ca46c031e7c5e03302c60dd13690bd630f5ac29696a4481245cf0b88290108489e2b30c4727c4305158984987add7a407b88dd8be0265f995dad55bae2567633f1119fc350c19b68eb5232babdf5bb377e9b486982930b1357c332e8ba784225ca70064b1c6d1b8a145ab38e80a396317611749d7c292c2f65dfaf279047234de048df0c43a76708134ec5fbd63a5e01d2f9f6b8dd4cb1ba1c4b5a8e21e690e9aa7d76aebb75a6a5a8b4887d2d66fccb63fa46df9d4155faab9fc098fdf55243d15611edaf73f1da85f617b8d00dda5f7ce0cd0ce184107b80bf8670fa733c0777b1cc36990efa139dc10c7a0e036ebe493dce6126fc9c4197be2a99e6faa6a860ff4f555d84fc1e2fda29df06a58043bfa033bd07439edf1807bde11caeaa8dc75005f21afa0979d715b47e799dc7482d428e0176d08410e0ef30748ea08ab36011cf9113a07ca7520de94932e16a6f922718e7c89c3b1b0c0be0de3c24ae2e73ef04838431908b2ea781722df7eb6afa6f7efa8b7464b2ada375b9ba28d6401a04eb8a1742d9ba105e6062747c36fb41d491f4705f109783f1b0fc6afba4d9e5801fba8a3dd47211008e6616281d25c64965c91aa2c92603dba2c6ea6b94554a765c0dc1504df0bbb991eaa2d269dff49ec05ffbc3d6849e384fc7bae1e404a1664ad6519d36aa8fb9ab846fca81c0eb5f5a760b17b583902cbb3d4663a0f03665394d18b37b26004a62224a168040c611819c0ecb9854b5a53a888350e39b18afb9b221d0d32f5620ad37c1f89f56320ccfb26aa369baf6894a4219ef417e17d93db9e3cd49851858ff23611496ad9b2d9279634c1553b00fcd0e61587478351f186eada37bbe5804216d8b3b979bbb7d0a844fce269436276000efb20e9846c18d694ead550b333563d5def5b67a3ffd12d7c07d3da5c6c53fa246cc9a6b9f5635082d746860293cb36761f3a6048d3960780885a2ae91cfed273ebe70afd8b7dad06ce9cef3d52768f97bb5ca202f5de9f6deb9bfea080cf7429fd365cfd9b7a75aba975556578b1711e1edb63d2fa6b460f1082533f34d29f8734c41d779db6a8b9c7b61b7414d286d35570eafaddf3c77879d34c590e2163bdb296c0b8d85ab8c92e2bee6187eaa554031a9896f8c51de89e825ae151e8472e5c988d93ac86e747aea09e306b58acd604675940248aa06a0cb3b62054cfd1185bb3943f524cab5acd47506edf664aecb81d3b63c051a6a7b1f778fdd8e3654623d5dcbfe9a7157e29ab465d0dabb30957199b9d1c58ce928d67c600d32bca0dcc75ccc42f045f5b298546131d540897a270d24ef6de78756a2d8d14b4c571b8960674c6e77572e32dfee70d17fb8968276b7c8eb7d045b6ad84afe4c4e09d36bf09703c2ccb5d861d12476df8d81966e7629834f7ff923da2f2994b136d9072851f49ef9079c0b90f925e9be4c77eb27e0b2feef911c104ac67877fe1239776bf0927492ffea3216a6b6e21e3c52b956fe2f4f90fb73489eb04687aeb5add37696a1ee7f12f56f12eb45e0eaa574e369184ef9a1657cf0fe8e7130b34800691e255208fbc2096703329a9e97d5f5f2c876b6f8f55722f4df67f14ed855d778b19c2b672a98924a863d32253d44b8bc9767667d888c99510b92ab711c03f35188762df44fa4177cfd320a092d879511b1738aabcc06ef6c66a29f22424caf49fa6f8a9e94e4edd917b20baa64cb0806f3c55e5314f59751499b7409d980dfa607d90e3d57f87f01e869f01d9e4841653981d02a48378993509c2305126d994a8dc63faa3f90bf40137013aaad5df4e3da8901327467c3eb1dd23cc8a0fe8ee6faef241492d07888640615c3050f371ba1bb39fafe8e5dfcecc4e73499080010fc7feae6a92ddfcbc779c8f546e8d88e05fcec0daf4dd0dc1fa47334b80d1ab3885e7f10010d1c01ac24b0608bade9c91a33448b02890a5f17b20841d2b8828550000588a5dbad115c3e11f317d859ff15d3ce1512fdbe156c073625af94c97e3f4346b8e5e4161a6c903dfbfefbe2afbf59ce05e90d516108ecd73a6493a937e43101db0f30f48f993e8cc37bcb06dcdb256e27209cf1a821e601dc010225c33fd48c89c10fc30350d016d410c02dff1c6b72e7ab2ddf9f2c8181a4fe524074b62dbfc25d1670b7bed5aad22b430bf641bf02c00b877ea0cf82182fbb9a016aa40fcffd5db7091777811d1f6d657017ce930fcda8027453ce245752c68035d764c8e0c169cc08ad3837b7b688c5013d6f6dd0fdcc05f0f9a2b578722e98c2fad44053c6f65400b182a676e3440243dceed1c3acaa961ca8a34712b1470deefefd5b6025c232b9c669eb2b5fee719b5d9565df7f22e47e52baa674165a0890c044529e5b348d201639e067b7bf5552edc2b030434875fc74df464010b55fcddd7530b960f47fb124555171f501bcb6ef212470af9b614af6a24f6c852950198af8198f02e56a233aace6d8e65173e083aac62764341adf0edc67caf105e83e16e5bea083ad97fdd6d138753a8c86ffdacdf4f5c6277949c8f05c8b976e700f4e4c1bf79d03950c0a41e7e19fd5bc29720e703a983af64f04f15cc3628ef96d064933c3fe137b9348325ce23731c677d4fd91d907e2f9b6048cbc79f9f373cf67390e18c6234c1a3ba07cd229ffb33fe14831e900735613228b5cda48901b70dd4f7df64a33fe2e5f3585e0c0baacd611641da77fac8952bae1ee41e4a099c9c4b8152dd6d903b5a52132322652a05a080db566ee0184efa1324a8d6cc0e0c234283710c21436a68495ac701dff8b685557e358645ac53f39dc4b16c88f77fdd2c58445c8651db7d10a95b58d34f32e149a0479e3e84886056eecaa2784df5858b8bfabc90f67aa4b7c5c17434cfffa54db2d822a2b0c699859903eef77a62fdc1f7060f7e9201d7aea43d5d6901d0cb2216c49060e24b3c5d3aa3b391d582a49fe60121b497e8007c4ef631972785482af2f1a35bb45bfedd23d93e2ed644503341493d7a1ec2309ef59cbc9dede396b64caf9c959a90d4d7c81741bb8923f45bafec7fb6de699d1ee82ada300ed46b4d2198a3598a96284d7e8cfd82b784069ad602883506b7a2005dc8a760de0ae1e037d000c41fc733e04c2eaedea36beaaedbe30fcb552f7d17d632f2ecf03ce2680df531cf8c054b29bf5b8994be6a0ccb19e10e906620bb5500b818d7cb3ec4b9807f2e5625d06ab00fb7e48a2aa86df88b81e1e0467215d7faebb6688a99198f7217c32740e93c973c706ee4176a0ce8c152f0c1abfbe49856acd6b6ad1ffb6c56ad2d6acfe27a3af4e7d3bbc59ba65a6d1b7d6d2a8e724878379d42daafc6438e470659c65ada08fed381b0fb356314844b22cf314245501ad119471038a38c6705720103b4a07057a695d68a8467c6a3cec1197a6130a219c261c43c51b9649c6ac42edb8ac9e0dbf549c71a464e3ac50050070b8cea0300bbee508807d0efdb7c63fe453a87ed94bbb6b8aa162e537b225d9524a99644a291e079e062e07bf5a512aa586c3806e494d3e5c83f2530e2228ff084b543ed7c0f88fde7242d82d55f7f938d68207827485d4bf471097f73e63e62d55f9fb478780796079f80ca6249680505cdddd5d14513b55bbd74003aee1650bac3e6d5607752ae8aacea5828252cb13ab4b05edf2bc5490abee21840ba1a36a5c90083dd0ae1bd684500f28564855795bad9cdfb90d46dae7e4fd3eaa61cd7a778029687c7a5d97d7eb37a9e47ad47b5515491f85fa9d2854b6dd502f29ff5df265fbf0fd95a550588d919af5def532f9320eb3d7caadfb571657aa302aa4aa1e66480c58a0d4eaee23fdc3e3946402300c91814d4290c152b705838337eab66442a8db3a3da569773d88506956e8b6f28ac34e048807133d86a0fc3d48403948b3a0a05b10155e10242029e8b64b7f84815a2b120038e891e7d6822c0043fbe01029d22c201e4d680bfb438483124e42f830032964ba68f1bfb03f40ce3011820a25a248516a4d11067cee64fbeceeeeae47d162aefb812fb65a30bbd940b75ccb5bf361107b196c4db8dcce5f8c35ade61b1c916bc60204ea09ca8d40024e815ca4c3911044b49186539ad64695b6f4100518a4308e38d25197e9062588e2e6063bdc402f130ed93e32fed3a6bb7d0f9dfb22fd9b3f7cce6934c8c04f75c8d5f894e5a8ded044afd969bed7eddc23948ed598cc5a8fe6ae0623c1c6f26f43e2c22fcdd2612d0811a59efe828c272864a678428116cdea2fb5ff298024a68b164a50c454917599d4c8c11a2eb802898d1c9e2083e90c51941b54218552184d68f4608c2523884b9e442dcc4c813f6cf9e28b316982a8424a6baf04710238c878f282658a97233a4acd182f584d4c1146d2125c08b1a4d544f010c50b345e30861748832538bc253ca08aacd2c0e814b9287af227a21a5fa8a114260a1aa3ba4c688aeabeaccb74c64c857599ce38c969f35e6baea8e8c8b24ddb65c774b7a6443ae3e8299db1658239238e33947440399a92d427a832dca080d658c99bd5cdcc565c3bc73c4762c6386e76818586026aac0499aad4fca115011c8df902979afe55f93093ee67620f31ea76a0c64b49d6edc0eb51bfa915e05f97927b5c72ee35558962d92c14c49699470d0e929e7a3dac97c6812289f32a646263a9f6335fb9e0754909268da64b422b4a5dae87d9b3952b93400e63f80a2f3575817224c44fb13525fc8de43476d2acf84535b89df8f09b0a8ddba5ca2a7f6edf9ca677e2c71392a0f0b96e9c86eb0a5921afc93d2c8d91ab729a66c537e10aea3e4eecba52d755735d36d745afebe6ba725c978e0b6adbac2980ea3496648ea159f1879a15ff633b540125b5156a966be778071b531cf73ab113a118866a70922a8189e218b92a50b3e46f406fd4395ccf5376c0a8711482f9d8d768dce476e2cbdf140b35f092db414914ea7a475b925097fcc25378699ff867f69e8dda670a7c35a8908485165e80c1b395db89ff32ea76e2bbcc772aff9655e65199ae90b9933551194cb3a406bf48eb34cb61cd8ad1e13897a67f7290e23793f6d9adf11bca328d31aaf137fed648ae690b1a696ae48243dd7a882d5d626ca24a8defbeb4cfe6924c8cb04b8d627c9941ddd8a9461846d4f18ff13dc65f9da829e902a4d1aace718ffd475962596b0409baa930d595da4e652409ba5eb658a99b6a9747d584539d13a13a115cd852c4ee6c75462c6beb16ab7b97b2a911fb59f58e085504e76490912874536d72d7c7852d46cbda212e6c19628138540a05b74ad5b5972d465473b93c3f54f2768dabdb0dd5c12766ffb461c0b44181530d906e87bff9372371ddddbd59d6b8e79e36cc2c256a417a87dd480fb390c4471242d4fd81515ea889a5505851a1191a293842e48415b2134679a126964aa9d04bd06d9754604aa349ede5b2a2d23bdd2307223f718fb89dfe13dca3bb74bfdc51eeeed137a2ca9f0ac23a85023fafd275b33caa63bc3f91c7b6b6abee0f5d68e1e4e39ed94b1248753a7f30ca0b83d9864af5c0816ebb7464853c23f371859a0c1c8726af9411accae5614d2e4f4d1473ee0a69e79cbbbbb373e79cdbdded6232efeeb2d2dca5de6f6ee2d4ddc3230ecabfcd8674ce3199c10810d61a0b65202d985129b2caa742a8026479bab542b6a79bb9f4c8056185d1e850604c62b2e8713f98182c5c6795301526a64add74947a90e6e236264b126c700378c5064e7cadbabb41a8cb24c6889885df2c8f7b105d9ee57e2a56a90788d5e39eca15fdd582398260207c0186a1222743807962264dd808724b8710c206b856d45e703b62d0e7aeb545907649b6c98627d70450921884fcc9bd062e5a2564134f46508ea620917901991a809ee8b661aad35868967b49dc4f11a5a622700aea4b75f7085f8cf04577eefe1cf545faa1e44a8271a4721320d3d32c22d5b9bb74493119b4430bddf68a16e46952e2c7eff923284c7660b5ae67129f77047f99ed8ee01fb35e131c36840cb92184900b56c1cfc5cedcdceedcdd993811e5c7f7df1a3ffe8ccffdc5e83e83bf179f3fa7a1abbf24ba2e30c0e474b2fbba9e19755dd7df50a51665f497d9c6ac319219d2638df1f1476f67d739fddc9f3b4d66e9391ae10c5db7a384018a3a7a7c8fafc4fb1dabdcdd9dbb3bea727f30dbdcab78632a66ec4195cbf8546e7065666e31efb96fbb76eddaf116ef49e5ffd1837ece457e4f5c107347a0360f6dde80aaf6ea5b4f75e68bf98290fdf91f843c992543cfe0732a7ad042767f4eecfc39f834e776795c937f583b768e1a7cfedc7bcf39d76e318f612a8c3a0cc3dadd1f57cd0bb773ceb907d242b67b585115060e2485d706b8ac01de7acea643d05a767011c2b0e8ed7e2e6367c4f95be9fdfc72cf1a3eea650e4e7106210997da06ab900e124d4210ce9df3cbfbf90737ef5d66938469b5a2949d530dbda1e78c704067960c4e75d9ac7f32e5b3bb18b81e5ab42874e59c0a079cbd945462cdffb6f73eab5a8e7fcd6ac6d23d3b97d59765d5fd2f0fff970174c68f1f7ad56938489c36d418904b2a410738481ec7887b9c2d56e9b426279c15cd9eb34d481374c33c053323ef253f437f21a784376b731f5f097ca7246a4a5aa58258fbbc15724a54a761eec87571d98603d42cc649f2fea7b96ba4c077994fddd403b805351b6e683d6d394d0970949086f2a38ee8122de470428825c47a287634b927aa9bd718a022ed66297fbb7e7b2ea5645dd7f56e87df8b1052b7c35c9f733ee7fb743d46abdad0dc9f73a88c43dd322a0e92ae15c2b03c0c64c539cc0ae7c30bec3de74ec341e2388e87e8ba794e75ad67a8ab10b6b42de498d4238d3a312f25b3b7a050d92c1c505aa49fe0d9580c59190ac557a935335f1aa6c9081f3bbb2dd825b67991281cc8e124798f805a539fb66e670a75c75ce660836e5e9de351879e6a0d1b3374c39cea3df6667875c8abeb11b84ad53e5b0fff8dd93df3f3ed55d78e87b93d344751e54aa16333470c861042f7f6c951543d4751a542cacd5f3a37cb204906ddb0bad15db93ff3a1b64949ab54228fdc0e4badc708a8ca9dbb20f7d37652fea56d38482e6da94a6d06558ddad0ab10c7482b358b7f7bd5b5d7f41e75df871a6dd6177131dbde906b34ae7aa1c70f74e8798de7eb9c5bc1cc2551e502c2f7de83ceb93426bb93e9749cd0cdabcbe4f2b0cb4d68065785b6a96eb3ea3a84ef436ea37104280aa0ca424095ffcb98b27d963a214fd06e9bdd5d206aea63c680a4c09c6ffc6beaa618e05af0dd8c0943a75eb71ceaf76188a106f7339b082062dad6c3da0c5cf76d36a759a99fda0d380fe0d67c6e4dad09d64a7d136f3199bf836cf18e703d9671ab532c782ba5ed90834d6b7eb7f64aa190646abb235c59d4ebb570415d2d388b2340403d3d2cd6ff8a5e2d1fbec0a5906c1628c83a3a574732767fdd7bbec2d394b01b3a157ba2fb1e98cfe1bcde4378c9dff79565e0389ec3f71e54f29eab3013615904d8002cabbfdd0f90dde95f20fd3efa6b4e571fb2877cf751f9df7f8dff35be1c40cd7bf8fefdd382d6b555927ce16085d560196c4dc6b0ecb5bc351d8665aed5ad09b145fdd6a9843ffef5fef0e5cf2c480bc549c146093fad5bb76eace1d01a23ce560cc6bfb41412a8a5e04ae07bddbac16f764ae0f33f0d0789577e7f9a57543b2af25999ef799f91ad033533a2aa7279fea560094b342b010bdddfeabe8425ba796d4d3ab63cebdcb51d62a96ed832a1b95297094d95bab1eaa289024d133afdfebb75800a25dad142fd8b38fff89b6900a82af18faeada8d06b03c2699ca919e93a7f5046ab9cfe61e2463908a3ba1f9b77df13244b750fd43e57754c39a8e27ebae57ea21e8f21a3c21a54f7cc3c86798c1156e5a63328ffe64fb8c9a766e70beeaa351aeb05f7f3a363702987695373eee4197c9b8c094ac98d26f5ca3656b6f195ea3c832fb3d5a4dca8ff3ab942664d001624312a9373cecf5401a58c942858b8e1d4726f398329cabca153868c324cb14c151f189551812a0c983222581d39e3698d1ed81c4123690d1ce838122669f6801a8312a02e531743745982a3c7041484ba4c4b61c02ccda08b2baad76502d385d2dca228d5a1aecf13baabfcbd9ad0d7619b755d295d1fd02dc7ed060f1e50fe7577f715f5f7eb8b347cf1c9f7249063ba7ae99aae5e3ae7a4e0b0d02dd4770ba5d91082d6a55d6470bbf8404b2b2059912349b2169627023b26c5806e410d8809ca0fd42d4f39adc85212a030cedb404040ecafd57aa0b77a2da0e5e907025a211b9ff4b373ceb94fd54db9e71074b314cec739f8e293efc90857ddce39277fb0f92186f20be0593dabcc89e1be09ca28231a94b365bdf75ebff73cb294fe6ee0b2f467f1765f9644ba9d1f67c875a7f5ee0d3b22672708c64d8f2f4f5d3686e27ee46f939e1e16eb031fc47f5d4f545fb6b1bf8b72a86bd4486020ee8b38b8418254b73d6bb89d5993addb91adf9535bf540b7957beffd0bef1d21529fc456157bec6b32977936b177ecbd081ec215738f614f604e7dff2347ba9f1a8d12691ff853f3ef5736cfa6670d06b1871f634ca552a9d4379dd9f6757e0a9b584654e7ab97cc60d1d298ea75dac85f9d8d6910745b81592e471c91da7bedfe5cd8cc5097db727e50bb2cfe71167f6b9448fbfca0be7f15a4f69c8cb91ee35cbb9ef9e323aa43af3eadc53090751dccd5813d6efa849a63d8ab7230aa5aad925ba385705fc0b83fad6dd7d46ee06f3c3cc618bfc33010524a17638cd109c1405e90d1a7f09ff0a55cef79082ba42b7fffeaeffe3e7a0a0519380e0d27857eec83fa31a22adff5a827aa70a8b3228e5330a9ba639a2b29d466b6b63174bcef16bec3778eef1f14dff9d23622a2da9a5b40bffcd9292442b3eef30a424a30d0efa3eed3a22a7f8853e85f4d49bf7cf843ae0e650010439574ffecec3dfc0c89dbd23f13f59e3dc9cf7dcbfea0eb5bd368e08ad236a2f7572665be9b6e1beaa0ed86baa9055cefda0c5c87b8be97d9fbed2124efe523aaf2839c263522c74961b3f58799e6eb03a639387677f77d7729160b618c3042776ed75db731a54ba1f0b0f91b5d81f05b0f0aab799cdf5615f51ffcc6aaa8df7e5494133ddec76f4035fb6d9576fcb64baadf368b8edf16cc0d0a850a0185928fd2b6b7ed1308ffab4cca6b52fe33d4fb78a0ef01e423db168f0cf5ab0cf52004f940db91c957c9d701a6cacf21ff26934fb36df93699fc10e4e764f2e7cc792c9392232507f538590e31f0d7ac70b26da532d463d9366ba2b4ed3d5f9a6c967429232ff2c3ac85f6a9f615244650fbe50d9168d5d00bd7e786689f27fd03c2efcd2fea3ff8fd9e20403e35bf5fe484232a24f9e9f13c56bfd1da43731e52aebc4bd53ae9e649eff08a4c8ecdb1cf428edf8ff427dd6193da917a9b54ea6f6cbe7fa676a4329c1da9546ac70e15852914284d3d0daea6b44df53b341a5c556927647d3417eb29ed03b556a2c22319544d37ae373c372d03166f622643b449b5e8df642e6fe0462bfd54b6c94ab59b6ce30dfd9befcf916dcb05d20cc7e6e6e669a430a333dcdcdcdc684a6216bf8f5a091424a5da166b6a34a09e2061fa67bbb89f7632f08aefb102f08406c0a8877a2769d3283159e2e7a44eaadd63b889764aa3e4982c39274db5df9f7079ea2a5dc8208599f2e5288bd1952656bc080a1825c638bd4b7a72d2d44c96d22891410a33e5cb5116a32b4deae68a92348bd79d549dc3cc5c1dcc3d739c18a5d239a7d1665df21ff5b362efd99c99ffa656909f7a1cf929adaf4f7dd0f5296da74603574c43bd73776917009ca0ee5a4eb3a4e6ae61aa9cf671ffbe44b7ad7140c8dce62fb27061187041f99b8220f5a8b2592e3c3515bd51b7a928cc350637158161060a6ac91525d56d2aa25204a5a9c84953110f1e071c340e331b8d634c94658aa30b531c5ae2d8a2f263669a608ac38aca8fb932264e10678ed605303dd034df842e131632ac04e567a1a8592e34b1aa6c9674c15ec9d2c4d14ae52fd2a304e4a4f3230891bd724485422b2a63aafed5b37a72747e288139b92592947c0a154fcad653b7ca82812b58a244dda3ca4f778951dd68d31227b2694993ea621610685a42a66ed8362d0953b76909971aeb362d89414dd56d5aa254f9b17e071885501d490273ff8c5275a3f26346947161ae4e9057fff718bea7c11fb45d93cbd38ed9354b2e8f3b42ca63722fbca4e0395d5fe87066ee952e6f90e08d216aaf9e9503387260a68299eed2d7fd318f21516026666718f7ae0dd53de628f1881ddc1c5943a9758c30bac2544c6d88b96134145597a98d2f75c3745414c35439387599bee0e269266f930f32c04fc155b7ac07020f8288071700d1b485064b5f50d1ea27baf4508414343d70d14234c509c448011057f0a004492c830b444182386a700596a2266898cc000b931fc898c112483178c309a6214c90c61487a54c1a382c299101832534ce90c10d22bc3c39028a2ab4106181832f4f1c81021f7210c205410223cab8428c2b74600651d299322c7022c5125daa28c3890e59f440c60e6e4cf96244909febc1e8091883e6f453d519666491c194293828b580f8828a293c9459b2822e108c09a6c02b08509120447869a862a4861a719cc0cc12db800d1ed4868115284150b1020d5d5101d49aba4c58bed48d858211de2092450369410249f594d5c73015556118866118a6c2daa7dfeb0f3c35a9fc3fd0bc26d56d9333419062deacf89b0ac3307668f840376739e1dad518b1a9eed839eda90e75f5194820043bc79899817ac0cf37a19e196415ea262f66d0d3821e2ad6ed74bb76ddedda757303ba05e1e758b2a51d73eeeeee8eb9f78f330b851c5045aab31d6f7b8d43aace0b1f325895f054c2f2fc2863069deab4a1e77c79f8b176ae3333f6f9abdb8f1986dc0a9c73580f2d243871d1c1e7e47b9cc5901e1a0ef121a84ebe366ca583e1e01889d571ea0e0e508552291fa3f237e95502ab857f25ff8a89553906cc622d3ad4fd2407d842596e0656cbfe0a4de7afb32f745be5e8f0aa073d9c7898b1e20202171f24eda0a22a01941a1d2500a226070f6e6ec8dc5034a20d183a6ab2b849b500855149cd1460a82288b8ae227c98120d8d69e88035403d1978ceaf6080b9138eac52919506a9b0e99c8f113a51638c31c618618cf1898852e3e744085d878b08a9b06e131128a85b4f1300a4e8a67854c66c1aa2c9193ac40583892c5a1879e141082ccb060bc2b841121232b06205ada51515de2624941e929afa76b6bb660bc1cbb280e569159627682b4b815252cafbb380edcd92a5370b962c3f2c9827efeef62fdddddddd2814eae77777cbefee37b0dedfbcf26b62c2552a932be6aefb3ad46488f5c95d0877e1c285fc1e093d1ba4591ba56bbbbb70e14277f81e84ef4108e1fbe77e4d71a30653fd09f421dcc88bf027464d1ca93284111a01e1a4890aa848128191915103d14e80301ab383162fd251ca00196a49495454592a92e095150f3d136a5b2453e36b3da659317e59451dec55345edd8ffadd5d89bae226d415a8798049202061f4025760021578c10b21209d66e540e57633b7a0c13cef31ccdc623a4c8be9313dc66fb0493869e8d65337212c29898a2afc204c82cfdde42d518238e287164d4889e274404af3c58930c38217b43cfba1456b3e2c4a619ab4262c03c717ad19312ecc6cd9a235258646043a684d89bd0c8785b74c6630b182d6d3a467382c3c1b74cc683d8d2e6a294c97245a9ee998d1fa66430736383ba0522660eeb471ce9daa7c47557a194a3fc6d7512ff84e8687a01ed6d898608209269890c36f50da9b9ffa09210c16c884a494d273dc38b5c98854f7c6e64ef57d1c43c6e9bd77545399f41d504cdb88dccb00d5eef99dc9c3e75ffbe3bbe37ece39b54d08c8cb781906f276bb5d84ea6675657c4cfb947172378c819924a452362f27e69e0a5af79c58a30250101250415066e8158484a1268187bcdf7c7314487849739b72985227634a5556a72a6b1260522bdc681b7c15767ddbbcf750a8972b24c7a334fae67b2ae87dcd4f4642a1579aaa5939bfcd72d98d3da6233e16bf88bbc9b64aba719556aaf363cdcf9f3c646bff9c4eb526c3d1014da190b415dac674c33ef8f9d2fdecf8a96d438ebdcb15723da66d42589d0f5ffc1dd90ab34eadad6020ef670dcdf1301daa940a3be6942f5136d4f68dab6c6ca5b2150c84bf483352fb58c143a0cbd128327a8ca89603ddb05f3de5d7d1d809cadfc32778d630acc6065b9e23f90365946e8789bc198c1ed2cc40a0bf5d22c8fd65e28ca1fcfe1e7c6f9dc9982aaad2e1c67cee5a0cde77bbf3aa739b7995d4fd22bdcd2904c182bbc88ba9d3a41d18b357c8732da4dd9de3e5d9d7dddd4e749cc8ee8b979c736ed95d3f99bbbb38f4702dcb3f559d03d75baac20d672a5ffc7b39cdaa045882f2373dd9a1648711f3dad5cd66ce3df9e49301a0400058bbc18170efc15706395087eb50a96afce6760c5bc19c2d7860c5e222b5434e60203202fb23cba06aecb67125cb9123a8b7acebbae635ddaf2b890a2cf7c3c2093c04c997149627070a969696965c77436ee79ce29825aef303651b9b9a9a9a15b21572f952a5f2a8ab0a827f5077d4984137436d595fa6aa3ab21c754accb39b3a2fcc335a270af3cca64eac2655b13a6b30cf6645d579e3d955e70de699ac3307e6598475aab01d98675ee707138415e63d7ad4780f9cf679cf6d68c12b72248f228aba5a1017ea48b543a8ac39d2f2f407b182f287d08eb4427cbc22305b82f93ff07f36a777fafbe96c2b6dc50335a1572b56b7cf8eebae59adceb8e19c507aed336459970f50b39a0aba5a15e001d57b77e037aa421a50d5afdd813f247e2fac80e69c6be79c73bcb3e6c55957a78b708c68bb756ee6bffdd3a6dd5b88f8efb7c0620b6e20a09e1e166bf749f8ec3f3d6abc3cf05d7d5e57a79d05efbd1d39c20ad53d43bf819bcb983b7c6b4d708fa2a1f6f3d3def238d7bc26b40b33d7fdb458ed93c1f7eee7667760e4f711c6f77edabc1691bbc135ef606e2fbb60a2f819f1a1ee4fc72f78ebfad9b957bb79cacca64d2572e6292468e6666e1e9a9109dadd9037470a287b6079dee3fd1696879d7b5ba66c9ff89b8cceb9294f3b7862037375999ec8541ec1dc9766b8664cc7329ca4814f2d0f06d08c95ca3fa39443d4cb8c51650eb41114eb2543ddf660090e4b15fedcd91833aff193d27494a6c63faf6d522a291539e1c836b9317a52736a9ce43195d117d02deab07e444e6a38f8f9b9e5e9a756e8e66a7fec770f339e53c349c17f7e90ff4455fe7811498d0406e2657657d7daa859ee43a759acde71ef9a6a41371fd5c9e843f27bddfdb25bb63331824969032102550391d34646cfc101dd8fbac58fded33eae0246524a0721fca07ea811d50a3010f8d81d0aa6ffea38093c845d07dafd54eb88fe0aa090a8544eb724b1748846000000400113150000181008064322b1582c9ca7b1a67d14800d7794467252190ba4510ea3288a629031c6184300018618438c199a19b3010151578b9a750ad2abdb8b3b08ae925283d2f53f5926e95c0cf3f12b3eda62f05aca8236aa7c925e99afd201700a8d5d13f49d570a6f35f1aa10a7942d4ea1b1cc417002c1581d4d8cfa625d3e576e9c163b0bc7557686c16e277a3ca7eabe156359e19dcf1a6e26a2dee48e6f38ee09706026e7de598fc7b6d39382a7ce061443fe44d40d7d53946ba84ee2083e4853d7b30185e257b1f3c239ad9d60ba8eb8bd7e2de69b25bf8c613c6d32b025ca10e0a769b34ad0d8fd37da251281a2ff85a0a893c64525e4484571531373a9d379a814908abd53d5b010cf5b28bd708422cdb5a0be5998b8bb0514cdb32cdc511855fb850b758705d33684095b4740d77bcbe23342a8e99fc96bb1a379772f8cc28f7c865c4cd7791ef1a925849e2819c2df6355f5bd8345fc4bf3ead35b1e24a8c894dec504a25a581ab150b357c2d99a7d44a87d0a543a9482ea3aed298882404180a0453a48e7d7c4fb29c0d7500676d86f2377d7c2307c07b7613a9fa63d68ca28580fc5d717e099d30395f4c2f3274f928fe508e1074e46196b7e96c8b2c2abac60f5568fc107dd0f29bd1a38c13e563b799432f029bd44c8427ebb131e25a0a673ab886410f32be739b373675ead07f3c9ab93d0801b18915f6e76664905bcefb94b991492c0368778423bee61d6594c767c0353c707767cacc928b98e03c15f40069da63fb8d99258c7fa555651630c5176100c674a4a01684df677dc7d49942692f2c884779831a21f24d74253df6024b58a93e39d702a2bf5d86274fd3b01446b14080b4570b557d4156cd7a3fc59dd65458d591249d79726644f173c1248ad94758c23d4e65676c824f1c1d6f3dc5baaa55103332a4951ea3b55e3dc534223297940daf7b9cce93100b018036a2b3d298392dc43ab4ef83860867069ed3fe87d2a1159eea1f6447480e86a7d70dd96ae5bfb6d4061ca5a0beebf560dc6021880fa2b06b69b5a581792011dff93c3ef3b0c097e076d32f79ef03b408455f1c941a08fafd5117469599dd3015758ff479cf345d542e536be216e88499d33144c92fff359796f4a8473e10767abc981025c2df2ae3a9751f59ad24f4f4a1c767e36168dd79bf32cc143428987e881abb6a6783d4a27f3f02f0dafc1528bf3ecfbcb7fa257786592d16b452ae8d9cef08cde55715531cd824843310994761a72d50f92e35563bb9b9e9fa629de00a070bc8bdbcf1d3a3fb53c5b9eb65a7cf3e6bfa2de1a41bdc80133570778e80fb58890008b344e21f3584d239fa9ff0c6f4ea2d088495dbb234a6f4c6c5493c6950ce87094430450d47b143c7650291fa55f77c4460b764e97965121f58552124495ba0ba5afad8bc8e2431a9b44a5e38a39857b1a3dc42a4abfa3f89acfb4db9d7208975b48cdc9685ead0ce6c953e6566366d4a7eb9f68fd7e32362cf2994a345903562bef49ee01e0c77f2149467cc9dc7197073d711bef0df1a82f8b922d22bf3585fe493cdd11d7324468829bf794ab625535b1ce44269201239ca5a203c5761aad2a42b4b863b4244009a8cf297ad0c3dccd94acf87c8921892574b52154a648cf4ab3560466d96901e15fe6387859b7bace7df88227cc392dbcef5c935477ca3aec197d124618687f849569419f1923872fb8bd5142b12216ace699cc40473d21a144a0cd29d240714ac2a94fe0424f19f89c417d43e7760699925006d0452d24f44f302688fe38d00cf299880dc834cd626cd63210465827ba0bb289457ef01adbdeb2176ffe1a267a147448ec386ec77147a1b7cc6aea80f8c5e3884f1f9948064cf767da4e170bc88d57f8a5992ba7edc40092eaa9aed6444d92a02e2d0f1265dcef593f0d87bf34138d6cbda0f970dff00160ab691f33ab92c832ec64f955c8f9992d8405ec80f32843616ace2c762b19e12c93a587e9b096086529baa626f40cbb46ac544b2ebb497c3e8e51a33185be49043796985c2a6ba624653eadca0e65cb4e42975d54e42c05ce7433d52f4209def49216e84b60a01d594916e879ce6e12409e9d800a24c0454288498040a7733bf48f3cf33026010c9fa96307942fb9879e05b8a2ce8fdd4b92dc3728c3cc823a24f37ab382e877d5ae7485e79bc9ab7a0b95ebaf5417dcbc0ce331d51fd6d6b6fbd87d79a4882972d54ebd1351dbbd34a53541aacda593f02bfde72fff13d0c15b90db221ca866b2f2df723cae15e25fd2644de8cd22aac77d4fd9a242ac5849ae294c435bec8933404fb3d89cadd7ad336e4e53e74482855520a5bc2565753cc120376e495621b374346f948e0ac9ea85376fa1d4129f433c09ca8deaa9e21ffd392905fed11788dcf0a53fbd9e311d16299452712c4da94533798022c2da998f1cc1cd8972bf04b218092efdab819e5000b10d0c3d5b35242c7040ae10ef744ed8349c1d9fb59cddb5485178cae711cd5450a4dcae8350802cc7ff78049816ff2ff1b1482a5e42b5fad8931e39b61e1bfe2f5db38602b0818246ac8dad93d9ac0226a60dbc0a7e605bdebd8dd8882825005f39f0372b1884e6a7bf96cab4fdda5d79ec6eb1729aa7029654b9cc517f049f83e6a054701564f4413cfb268e99823f1382a7e49649c1562a69b7a5eaadbffe805f956e0521e1c12f43fdac2a80d2cc19177fc709605c5a2e301b110f5132cb48a983bf06b86d9c30379c9439422744f979103dfc66829a5e347032f19bccf76288ca48ba3b66f764a044f3216b75c228cdb8072bb802f669851fff0c023fbe6f0e887514271b2c885a7047b51ac3e7ac3e93255c517aaa815c67203307fde3ca3e5f0d7c70563281056e2fe0044a4901753ecc7205816483258e011e069a4455c9364c02c307ef44d36025b89d6daff89b2b200c0fdba2c38c84b7b84e3b3ded77460c2672b92f6398d9f401242102a5198832f0fa4065b8e087847eac7b9758f3fea4f6a17329b5d8f0d7aa1510d671ac2f06753ee872349714fd8fa88bcd7d19ae15e8a2821b29eb967d819acf952af6d458557d2055b26f0d207c704903f2c20d88e18018432a21987fa5401c621b0d9f5d87c06e8d13e7257e33c3799493181465e6d86590aba8586d5daf6e59dd22fb57adaefa574181e958bc089851dd1c5fa06c16d92cf929179ae94795bde054c6132706c068267af0524ad845978cb32ed64c7396e3860e8f0219923037268e5afe9811fe557169518f416c65426d7aab05cb045cd645bcfa803f1560b26ef9470ef7dd550ca492fc42c57bc40c553458c0470ff747ec58ce65467265df11757360a03b0703f41a12c77a9c3123213ae3d438399dfc4ebff3433af35c89f83cbca82725a76a9b1e94d0ffd4b5e11eb357c62931ec90e325c84bf6cb911e1696d0619085779318c7f49ef17d50c1a0b408b08cad1dc7804db5685238a0d81244c6e1e103069f533ef79d7ff0a9491275a6a4cee0fd7e2d9058bdf5e9f778743a541217849417964f678affb40ea92dbdb26c1a4c940e20694148161817b98a1e88215a5aa843450eeb0927fc350a22c6f5b2373bd9a32010e067f76135244d32e12761286a7b7a03ca767f1e548f9eeb82f5fa5f13c4feb8f7188ac1da2ff4df6e667647dd6fb433f707a098be5405007c171b313d59d07a900e81bd7fe45f6320ac3301b6fcac8d6a34dbf35009dd6acac096810831b1c5c0c72e0ccea9bc34899b37d1a93cc58d05f82c0af077b973648fcba5d935c17316dd6212560999e6023b27eae35d2585fcbcda0180a7d93df9221e38866c02b126684ee807313b771ab287772cd3de25f6f9ffb6342603f24a644ef87a05c45b0b1a1d7f98b9f1061e407cadf6e0b33243de2ae5ef2b73b3e36e3b2a5b0625fe4f5ca19a010e60357f8bbd8f1153bc207c0ee9b1a04067bea2fd2fee7d3798f47bb89d39350b37de92ce503b6598b664e1b4c5a9c0f98b5545c125ab2857dcf6d6b2f05a81a30ef88d5781061328d5fa7cea416e1611bac9c130ab130d1456485b256615536edcbc63e7c64e6f10543a3de404c80d43322bed6bf83f5f848136464ad2d37104295c7c1c76c1fa84f13ee78e077516716b039feb310cb1a8ecd13bb61c6ab39f1f824a070cc32b1ab85bb06b080ba5d387b68864e177ac47a0c6698d7b556e094aaf85884eb3226f452fd0c02a1f57924923cfc208808017b34e3dc2c86caadab219f2748f1a3a63efa92f7b685726762578a807ff6baaf20ad102422ebef15f304b0707fb686cd54046686e1ffb74db6a2382c1a2ed5b594880a0391d959ca0586fd98ba0155b75d942c71dce5dccfbaa46231411254105a9d2a055f20fd5e32e8c4e638fddbfe63b7661ff2b18860a891ce3c7f56204d6a18c6aa79887f6c84f829f14acd8b5df104a86e15a86538cc39851c7173089e1c861ba4f2b0d78633d22942f0222e6b12861b793f570ba98953b171c803face4cc7fa93a23bb78dcb7c57840ecbe6d6f38fb464fe5cf31f334f88f1aa0d078c4a630a9be57653a7c4a3582ce7a9bad1b8328c255ad67c7f5ad0ac12757548cae2ade6930ab0ec397266dc423bc80e1194795517b1f9831e130197bbb9a1d759b5030c39ff2ee01b79774874a8f97bfb2b8036a4b86e75b02f20cc432891879509298af10b77ef0f1187dd312b97c89b00316e6b2fd33bf28478722ad3da35e32ee0f28f3be0e31656e8f2985126ebc95ee4d0a8514b4a91d6b3727ae32eb4d64775c9988d5295a238c3b125fb169b36b3ffffbdca17663869da11139551ed2eb1e78803350fca24b4fedb6e7ee4978bc893d448e6c97928adfad76a92a12c963732b072069ed0d8c34d8f127fa61185fd38b2793a2e18380ca1dc504190d6ea3ddc0bea388411a6d53243caa72b1e9a29ae37b4153c7da109fdd4b4be42ed4e970e1a0c91806315813a65650b9ea0d516295b367f8564fc9e41d30868c4387c84448e2ec21c055537237ad86636bee776e3b92ad68c5c75aee328a469d01018eb566cfcca480613b4480e3768106c996951bf1b0624370077bf0758b2f83c041214a4cc9afd1803b26f001fca3c079982f3ba0f200a9a6fcb604c650ea78c34fcb839df692056b2a679a302c7c3b33cdf172e9f51afd3513d0008b775bce45013c4b5e2da78ac296df91cc666202690746fc828e3d09e5c3671d6d226f8f17de8beb80ef46ec39e3d3db4bc9abee9d0fc452325ec4c3ebeecf6630882d214d3118bfac9e2655e26347600a0cb559b104ec1e58b024e3d58f3923da16069d0b33994057410a8b1094f42133be976b22f17169dd9845bcf374c7c6b6aeca790b3cd9b14f30cf1d04c7f7a1b8878df4314e02e5351be17337288b3248588216e757161127408aef295162fd0ab56f66d279342374c5fc517abb12951c091d5be33c5a41e3893fc274a99963133a6ab4473e8de6307e450b9075a22e717c7609ad0cd1021a79e55b74b4a25cde0f6ef014b30c0950cf3956a693cdfd95446b24b67e52fcb4e48f073fd83a66c2d57e5c1aea005641d8208768d719a5cc0cbe00dd7e99ff1e4d9f8a457c064250d95f288955b3fd99d39cc3ff92f1c057a4621b88dc7c02ec2470550f7d291c5f1e05b08beb55ecbb673a5fbb9c78dfc5594c32c73fe75f9707ad9853e32009b01c8b20bf7564a50e351ef037c0ee7656883e7b0e90fbab4253ce336044809bf3f8ba0458478a5195fea58f5bf2f56a09d9074b1a4cd37faffcd92c51223f2fde2755970e256e8ef16d0b31d349e6274b4ca5b9241bd3690d9f0ceae8b22a7a79c594f583b3f229ee2278f4d22a6767341fb9916b09da456f57dfb1f21fa1e9e0be91e82f898bc95e6c2177f04322dfbdf11a45fa1fd09d427e2b72757c5c30d80b0ceb575fe6f3bc8869b3ae6441b63f5549b066f455eea3826afaeb07780a21b33efc4d64851c755508a79dbd96ecc0847c2f22883fd1c4d74ee4fe2230eb3baab87db16a0195f65b98f598f5265b953b9ba90020c5b0a7d00d62a3e13728fa00a37f7d8b9665bdca9042c507e4b0f73def50804172ec43c139e02e1fa032e937c23d010d3bbe3020c9d1845337818c67aac8be890feeab20bc542740104138ba1a053a1d56d5a512ba034eb2d9f2d74e5768b50a2e08401c890803dde940b81eda8f28aa37aff195a2644821c76790850aed437f0f440938405e547859bc89b2d57245394729aecd7d5615431bbc4504b5fbe110beb909ca6e8ace6c7e2ed79eaa49d9cf014f0d5ba39a23acd90edbccac8da5879a48381ff8b48f303a69b572bd2ea11624137476c6b40825b0c5aa5d2f0c904c5875315aa430612df26422691ef6070acd3998f323f5af96766a04a0a2aad78a2e89e41fcc54a14f814f9aaaca70a340662b7a61e2aecbc2fbee678c3d1f6e13013c87ffb5a1e60188bf67ffb4dc2467aa5815c51465bf904eeaa9161731af10910c8e669b15c7d55df42711c8d2a932598153e907c8dc29397cf784364b21329fc73b01fd53cce232381c213ddc511b79c9dc6f6627704c2014bedf806a2e41e08a51afd8e98a6b48a20e162be4bdca9da63c7008fcd189110aac8c4edb81fd598cc2eef568eeaf55abcb6121e90daa0f821429edac592542cd49e9f37a6f818402f48b29a4ca93f18da3e0520abd8686d25a78cd2927978cec4e966a9e6258299f735637f184172023b6bcd7c31e0dddca2efa0cc917caaaaaf4fe58cb227c2292daeab30da57d0f7c7bfa4c2c79b00ff733a11e9401c005cec0255eb617b7b5592b75f2e2a3145dd3377736b95e73ab1eed232c73b8a1206b1d6f00bc6caea67138a454b37eccc0ec7489fa0bf694e051e2700cb49464cab655a75897915e30bfce82288cc4c7a07ccdbe003d2530be0b0dc06b27a073c2356550a290c539c2300a760bcef945350c486d99bc329ed194df8cb8b443ce163ac87714d311feb2c8557e8518ae29094c52a2ff5e885ec7a820c324a05f23ff4875c46a6bef27b066e3f55e808239c4b866d3e854cf8098898dc01dc4f7bb66d666e7177d020ffcc64affdb8b8e93f542496de3c56d93c133a087fcc03bbe021262d01bab06800fc85994e4714ac8759a5c77cb2628c34a1f0c62672f4c9c1fc3b181e2bc5e18ca909afc5fcdbcbec65a7c1a5d6b1c726e5e127937ded6b0442e8849884793c3c04a50acf889b079133837369e832f0fa510ab71f3b7c7fe65939c3c0a4e88271558a76cfb99b9d7e006d65d336245be8b0bb8ac88919e1d0d8e68f64fc13d8c5036ea4d1ee5780a5fece862bbb02d8f29340f0899829f7c130f20fa3039669617f290cb29a81942f9575891456124c440c74559c5421d0316f7bf59901a2727d1099e0e3980e477f038d0ff686453d8f7647e0401311935620813184f66dfdd8343b2d735971e745e923c0e8928cd32a340f74ac4628500f97b9b9de2e2efdb7bf47b5e2ff463ce4cd31404ca130c2794f186c3af5b8bc8396b52f4b3244f7ef0e24e00fa2c46424c34cfd5c6596f310cab05385d8b1d3abd61d2d831945dc86ec9f6879972481f56310ea632affe5b948f25c75e3fe2f5f4978bfed8ed4a7dd17e15d65bc6407461ff7cd840c7ed91c29c8c9b2f778c991a713308909ca05b36e3d7b52651285c8425c0e3ec255767ccff4239ac5bfc9977a20f82b74b599ef84bf76e19e9066bd0b710531bcb2aa6523ba433c0431f049e0ec6cce1f80dfdeff86dd51671b6901b2ec80d8794dd8d0a963d873d3ccf425b056276648b78d5657c4812ed216ac4714dcce38b4678d329474603402cebc2d5ba5639c8d90aabf3cb085cfebb5bd0312c6002de8e4a492cfadad76baa159bbf92f862ec950d7ec4da313f6969af57872775e4132c6acfe881eeb28ec8dccf3425c628180cc170b1ced64956fe436a749b3afd1797a59689cd365a891f5d272461b18c9360c7aabcb2c0f208e7ea59d5573ce174edcb5449677c2d940c75ef7297dcff2c04db6f94f003678ded135966db38a05fdaac11d0f4c216520e14ac4b81bb61624d4c76e25a9d865e322023160cb6a4815a6cb107ea2c5205707759229f874d1bc586352766397d3b8050ca278936b10b71edf3665d97953274161ae8544b21a41c24b1361a227c0a6d478db1d1748486aa9643e4eafe6b91aed9d75da2c895b9dc1f2adc6b0cf9d53ec9c967220750aa01ce53b3dd546ef73953dcdcebce8d5f96c2bbbe58cae651d4a1638eaed1306ce1ba76e8390434792d6b34d088ab8a6a5e14ad13ce8516c15ea8e83c18a057b687b5879c3034bfd803e0f4979af80df68b43a96135b2e27474de24b710df3c01af43b624af704a7db538a2af189ca839b40e33a452c650f32e759ef42d333aeb99f23b01d7b5f8473c0ae57e43966c60f7f6997a10bf06935947f9c5df4d63151b2b3a23b121442561917f073f5d78f0a96a25ce973ccaa1ff58ec6a017ffcba245f5651da5f6f7b5c4d490e435c16f0e175cc8680ac9225348e7389e852f9d20cd2f783a03b4cc74218a8a9fb31a9d9bacd9caa3459092836900d8f4cbd7ad1f88a8c356848ba09d4e292ada2a4420f244c6bf828db113fd2ef1040212bfa19ac857bf04fbcf5cb643c121b50368fdcc699a43cece4df2633f25a437cd4d12dc52f0e0dc781791a8f32cc9bfb0ad7492afc9004475f125294b37e9cb8df05aec2ab2fc0094347d9a39f23dbef59f95efe08edb51cc79439ad7a04b94de464ded09a7d1492831f8dd3a3946fdaf63cf23b7f3a4a048dda98bdb038cd741f27c7f364d9f944fc0ff5b9be45164af5c18ca112b102febcffc4e4c30ca4e561f9ebec13b93c0879768219588e89be3f501e3c47123fc267e246b674d1086bd07a1451c0be542a5144b073645964736fa7a6c6637ca6d8f571ce5c87f054e0e9e47e4865ede6c69e46658ea236856f8c0d01d8fa8e71388b4f190096c036f1a8329afc7fc832c512d2cf24cb745f1eb2b2b528696b4fd0f76e198b0e4517dd6793badc152f330713a1765762d0864860b470254b258adbf78a2755f4de1a057082823d42b19cfa50fa17e9f99b310135a2733de0fd43096cb600767d6880735575d5f0bfa84eeccd84282dc3820996b16a86974a56057ee8e266d99081e6488e32f863d5f9aedef29811174b43494eefcd309323efcc9b58e9b84e5669be5fc75a4e3d9a1cd3e7e5945c01948ed1bb1395a98b9abdf641a90b4be527f03739d9396417405f5e83505d823bf09ff6a79a9b5dfbcae603e0c9b0ce1c990f16503a3c8e4c9a0e9e78872d3008e4f6e2e02237bf0c926bd1fa59234595d261ba3d131b300245cdde6091e61ccd295200c57e59c524d3d3d7fa7743aed35b942c7c45afec296a33ca22fe190ef114616bbec555f698dfc22c66ba6d58120874d0e1e912edc0e8cff5f5ef3ca8a116f850aa83d74233b5d6b3f0b05707f77ac85b5fc88d3d42df1715d2c068855d506b20fc977f7a955489e374b84dcd035062e9ac965bbadb92d201c09efba100ad06ca2f2d51943c2175be697339b5e750838267a77fc37102b95ba4af78213ddb3dc65883a432225ac42494c0811a1054ce068d9f356710824433cf1136c7bea263c65b81d2b7bd51160ebe214a206af57a49e0a60e0f97a942f3834baf5d47e2609a1d4184347e9233cbfb00ec410851040bedc894f3151111e131af52fbca5536f68780413619bb8b5981d0189115c33c94e0d847ad41899ac4a9634ea0db21cdb3bdbf8ca438542dd22205a0e3fce87123f144aaa4c7958b7951ab7a12dbf6d5267ecf74ab556ab3e979f2b4f05b49cffe4751e9c7138f375e85b9830522548e61f0331f17521e6d357d88e867b45f5c89f231bf855d7096e25e03c149d83be97d687d9542502d122b0a42f58a9694c2ddf6f01c818d2e94d885a0429fc5bd04e678140e8463962f0ae5ab3535aa15a7c5ee07d246d4f9372be11819d6ea5b256c6327ebaaf0536384be6c35e0666fc20629d9126b034be6310f8e9127768cb5ec980fc1acf5906b37c642c78ad0b270a3db30cf81d531230d79b7a8057b0fd3c3a14a0fb3525a7f3635af219135cab49d05985c6e98cf81343e7deaf67c34364545b3970deda25649624581e0585557db737c11062084e39a133303d56582fa09740dd3cf545e29346605eeb39b6cdd178e1d5480666eb694b2ab9d6c2762ea7c07f06200626f9614d98e164b35d3b49b7640b6bb389b02b46d9745bdd2931c5287059b91032296e3bd01408b8b2056f2a13e345f5322a65c38d471e6a8093b4bb2f24b81b843f6bed5f9fc8dc1851e91477d4e477d5ab0583f948b51f0b8a4472f8037b2b49c24605b0e63b5a19e5a4bd544257b6f858bcf0a97cbb9c1b494c6c7d3340944518dee475a9afed0a20197a610638949340139fb942e3306774a7db212fb68dcab5f2cbba80d45d00fea013ac1c5ccdf4509974e690914e4cd52a2bc0de8e4b38280c42c692207af906e70ab0d300dd0a741a1be04fc99248d5b0c70e917ddce3b27c23c63a2b5d84bdcd18b6a7ed16be3f400c44c1c69074eeeca444ded27e8ce1dbc0f7e3aefd34b44440cafe04d90dd01f2ab6bd88cf7dd3c5ce203a087c824ac84b0c4045146ff388277c8ce6460c38974cb24ffe81789d0caa6d28edf83334057c3db60cf676854fd1a5dece9e0448a116331fb5d3ec4656590232ad73aba56c3e7c2d1a9a3e532f346c95e7c5fd0fcab7e178b0434e6b12538b03406892aea0e63028a4d858387c0ecbd44513c26485d728b39283e9f588161f57a4e489b2c1f16ba09e5162d258101f792fe0734ce0e3a4c3a0c97a908601dd2b4b2e5c00c09ff411daa3c445a88ce68ca1fae92267620a7978d7cf2c088c605fda112e492d2927ef6b31f383c26523340bc94b56840d46ea1d5c59fdcb172097ec64b10614e9f1d9e2caa3a7c6c9f1b9dce2a241a4a6fda5cc01de3c813c9193ae6eaa835a5b42d29f3e77517068d5096e41e4ae1bcc14148193c43ce2c8d65285bead3b097e32267a040397bd15d2e7985368fb5b10a4e3130726a01e22ccbbdaab3133cc3687d4d3942c6f21a5342ef546d2bae5e7934f4451539523ae8f771b21c136e8b388bde29270354a0714fd7ff63e82b9d674f504280c217bb6b74bcc5c0dee96a914d1fadbc63332d276fe21d485fc572b3e62221cd2e23cdc0e5e800d09c9e436f60f8d0f164e5580c23c7500debbdce53cdacc953e7572a7c38682f6b0ad111f20132ad1d8f2793e6c6af0355ee88783aa70cd08242d660c430e9954d32c562765b0033aec78e764493e95668b08db6a4f96d821b09be3ec3cb681ad0d1294b7134d21b0300c77d9858ae23dd51010409282d4fd5f28893101bb6dfb67285b59c7eccf889493821b3598e00614949e127e3c80d4cbe51e78cffa3386c26f2e4dc2ef2bed1bc468bdba4d4595086f892c012c5f9d2f5a6558d5ec8b8313d586ab999ab5b4071b34a9d9115c39c29eb1acdfd085e6855e18d4cf0b72fa8d83e1bace660548718c036084dcb388af7fbf2fd0ec91121591912125d826d0ad42c7e3a21767d5802d4f9c5d8e11757104d243b7233329780c4b3a9f04beb56980b7da48bf7c74c4173ad48a327813f8097236284d11dee640c81d8fc4dba27f390b730f18fa2387b2c25a7ee4263d39d278cd98a44aa5b420f335852101f688c0cacc93d585124f7eab7b6d34e806a6f31a5ff87d5aab8f19db7c691214753e0720fa4ef3750ad4fffda65b6d1fbd5a57d23c8afba0b7c91871dc2167ad1b8e2d047edae036678b994e840da303209a1cd10ca8319a408496cec8c7efa2d49434aa3ed3931a486e88f1919bec91e1189b1d12d81362aca20c4bf3963556af491fa798540f99a1edb48a2eba3654dafda15287802d4c97740930362a2ff6005084bfc2904a03aa05783db85a683cec866649af5e57db64653075745cb666b97ed458c5b4317a5a3021d7964cd1af3b915b8d45a0ee4258dcda777b84de4caec53044aa8e70927f46ab8f7939b7f489f9e6d984ddfd46f77b6f2ccb009ad5ded3a873cbc22c65aba608422785c4f20ae3020beef139b33296298bf36b1d7e383384c941a96f8f30726685421b005718a81ad19da27c7eec54eea32532ed0905eb17108e0de0406e40f05b20acc278852831b16c89d223f33899b513253d297c02c97675110e4665d0720da83e3aa6388d020e60e03834d8d1b26884fb506e49f5146e7ac020b44f9ea9dfcae26529dcf45d596014a5241b36d240a86e3dcc42744df0608cc2b31a0ac68589a6a8e417c28ed8515139d503053500d08697d81112ac36320b6150257b7154f9c7696dcb186e5733f61189dd8ee80b573a71fcb2e20c8c2512671d84d1868b0d68ed0541b31c84704ad7fd9b27223581700918118dc20e08cc5dab7c3be11a05d47eb0aac2ee3c70b99b39ac4cfb0052047fa0fd71770bd1691719336d88e55918e84af04228ae19fefd1d6bcca763d3e885387340e77377ce6a2376ae796a6356a1f823d02ad0a99f03d9a93d8b4eeab0aace5077559c2caae22907a0c162d3bc07854039775397227077a83111d1e58c9b5a74b55934ad57c13addf69f74fc10e0d1c0d420761b3fd3b13def8297a3bdc7d2efe401e65c0dc14d4f2cea8b6fe6f6e0ff4c2e1d7bb07c6482ea84ef2a78b5ad877b7a9e5214004a02dae718577256aab97df28564701950d32e118faeeed6568d6e697259d7ec2ad047263de2222ae4626551b62dd15104869a95764b85567d51a1aa0d80caf6cf28975daaa2c8da39c40c03e0f2324d8b1b8302da5aca53d6838967e662f4ee5246d51c411e5839b76cbc94b5fd2ef9c4668dd080ceda78e99c19adcea29a4db9c17da6bdc93e51637e4dfb9d59c602bbd0c9e5b1506325ceb9a3e3bda9a271f031e9383b50c3cab820bf6f6f66eb1846b4b434a9ff0c90d8c8623b5cbf8b9392949c5a5ef3dd5625054a23360148d27a43e6f26aa707009dfe3fcd68fd92b92a46e5eccdf46132c66f478116f637ce4c820ce7f8c89f592b0da938caf7d05e64d93d19862403bce243ba5401584b27967a8200e6ed39ea8ba99736dca759af67490bcc4f6903aa826e69658000d815ecf5cdc60359199c4fcc6f3b6ac67159fe3536c42fa5cd64d957fa1b6154dcd6f79691d229554e349fe6dd201c8b3a85dffc2abc6857950111d62691400f70275d183149aeb325af03ab4b8424b02c57943376d51e814aaf432bc4eb156d9076686e5f50b4aa83f1b47af9849baf1f016dd42a4e306c4e5f536859a9121a22ed1dc3d9446c0e83c9bbc8d33341769faf0c73af332b1aa54fa3e82355149f457502ade8768e04db87f28044a0ff3ba29ade89010f242e12755aed74c54526fa89b5c154a4571731581433dda05eac57a094776d3ada6c20949916eaaa69556f598f1718409fb10edc229ea381e120edc7e068dd150393bf9dde6df0ae76d17089ed73082d342f4d479f3918f74b573d0742b0feb6a587f9de7979d723a18ae2e61487cef74e807b730eb97705cc16eef26618c841976b1ecb09a5ec00cad489746d6d53b503170d7478361c40ddeea0e54dc033d4c2cfc9b7c55a28eef5775080287597705fbede3b17f4d16c044244c505984988172e537f074f2119a3e527f4850f5103c23e9618abe72f69241d77d49cfd07395a2d9faba9a4e6788e8c4be1c1d54e3f78590b546321cddf169133424945094ea868d7f93b322bfe276a099076993fc73c1b05cc5ec8878bbcd8fefa85a9589410088d56847dfd8601a44b265a8e22859bd2d3e64b319f890cacfb333e081f8cd759934a9cfc62235792125daa2242c40d7e2fb925110be2126a820bafaab2e325088c9e0d5a181703a55425ee83ba84830e877562524917e20a3171e3c97c1c6cbf2ab89217c56d38ff08989753a3b10926831289cd475d25b40d89ac6605a4a433afc01d2c9925c5bdaa43b0a3672622aef1f88c0fc31bc813ccf7b3eca680f2898ac665c893ac148be84b4d2dcdf4f54828c45762ddba30c48b55845fe43f49d6ae5a45021c6a2cdc994c9ea49688b8c9f3d38e037405364dfe805fb7070e584aacd5361d8f9069b7458b45979a8f014c2b8ff6fcb807c27541d21d07caa2e42db1c634ed6bbd77b61ac7a010d70dcef2753c975e9060011f59908c7394abd00b0b2f84c26cd54022306b4434d3892f18b851081a7f67a651d08edab0cf6a46d70c3138e2d2c4e08e485f64c1a92f87320604b951645c4dc6d0411e792a79e0fc58eda4c8650634759c443bea5d4b6072a7dc8dbf03111215f83b745ef43f1e11a2a105869a17792d85ffd16910b100c9bcd3ab98c98d97e366ec6cec911528570fb4d298f858473229f81257f857801e5726cd62e95ef71246fe198506014a47991fa841496709a778d7562958ac547ef6313c25e2e330d2c8ee03285685e89c3218fc3b8a6e0784688d798d3381435b28c158a6ebc6a70c8d3d2471a820cebc8d6b4a7d2def09c1d23bbd13840bcab70d83c6107510ced5faa9e4550cf2f80ea14382b6362f626b2de980fd281ceef6ac05b8d40363d7339a78948f91340d3c8ed849ad2c8476337eda786fbc230095fc29c0298f171e95e6666f6afc0bdf3d6ee28b53f679faaab638e27cf5422f332a99abe6ec5841cf153d64ba7cbed79004f91fc0cc898fd8bcb5888fe6a7e65732c367124e2e2cfc2e9426868bb43e9d4785047272b837fa6797dfa39d0065aed8fda12cec4359623fe9a685cd378a81f3645651f4834432cca15f9713cde95788e248dce05c3f234ddf5f7255352621c437661cb275f93931b7b0d2166c07c53929adc2891cee7226ef94de3a10918362988a0b0d95835e81838a731bd74b2f4bdc7ad89016e693cb018ce921cac2fd82e9e9f89200ad5079f10d0891baed2df4cdbd86f6866e575f0ace9a60b747e90a3281026bd034a40cf4ca90a5f3b8c802b41a5886c70ca7f960853f1d508d02eb6bc6903600d8a8561b92ef921ea616c54132d0505015ad21a84c152f5e28e7b8c81c46a14e34aa16cda1c69f34b8b2087879def52efdada232e561707d61b1cb30b6c77376623fe0dac59b874dde7d2f7d2a3fbb0ca7736ff7f284400723e41c584637513d56b93e5d42c187bcdb23c1bc606aa362a08c7e3175d4682ebdf4531dda2eea50ae43e41354a69c24d2c8e981d9930b6621495c46d87606bedd6f5214f230d2c39892823f01816790e0e96425de544b4e68cc8b8392504ab849ce0f3c1521181aa43ac5732391e9751ec5f76d9e7e73774a953411117eff6585e3291de265d632a4a22ded2e6389818d6199059256d37ed8b1d97a754043eb31281be08ff227a90c929043646dd36382260f64404c8dfd669336cd2227d77ab6b726f8bd5b4172597e6a691011abc94818c6dfd47a9f2c76df90007a7bce48fb094b95ac28c9517dd30355843f8387dad0b8bd3338196984e4fb596e9d6ad71a631709287ebd68d45a61bb43cc56a4672dfa3e9d2f2f2c2b7587a18aa6f2f48b81351cdd345c2ce6b37b1ce1b24bc270a8dfd260c0824b1d02abd03c202bffee148b662972f6a12b36590c16e1af2c3e900c479c6ee2415622b08f8a81a67c2160d59c17e11c1026c9ea1dd56fb5311909ebffab34ccd59829ba56612f8fa4c97ec98f789f87312b01566e42cc20c6a4571341bb413b090aef53cf5283e332555ae3f62425b315325c0827c74ec15b1c6b489fe08598ffc4d930977d7354d6939eb266d6648a3b31986308c3498554e611110a2a6fcda18d45b1fb9a28e683e503193269a521598c2e5a26dc7491356cb6daac7fca24bbd1c088ce3493aa570255def1e467139d16d4c183e7b706484a0eafc7c292072a117389a2113b694dcb2ec1984821e21c9db5a35eb785a09464508ee5f26f413763f28cd43ab24f698601004c0cc5c6d7b427827a90c671451d4e0e8a846bc21df99b6640eee4569eca69e6cfdc7e1c5aa907349eb94a698cd3410d30dcf8e911e3f2e5fda91a440795cf5bd2b0f6c67656de7ca9b3125fe4aa8462d3d7af3896bd979b420d44335d8c435b156f5cf726196450eb8ce4665f020448c87182623362df417a9697fca842d31d6f16e3d38089a603d0ebcbb0a9171535b801fa4247c82c714d887ceb47cae556d6c8480063035b36a5abf149aef185ab60016aa0adf29735df13ef934a71d718d781ac2a7f4cc019e6f24fcc014654babf3fc10a3eac36d5830cfc9da01e0e834270a34b4a5694b9961232437bd5eb97720afa503c17e4fd740af3e9a669f8f179850e0d3390167fd0aa19d0113b6ae753b1861c35dc0fa3b258ab2771c6faf04fb256b60c1ddf29eea7260419f770b530b392166113372d6b03a55073937856c26c0a670ba8fa07be0208a19a38cf73b5fa26ac01f66d2a3c6ee7a7d879c498fadfb72c994e0a8ccb8f5b9d19e35cffae4355ffc9223186882a2317954d7d2f4ec33dbb960a86e47dcb2af5c24f82c7533cfda053b2fa78300580e983762cb6669e084345a35771b17643d0fd5ee360368d3a184b48d209498cd540f9290bbeca1dbe1da3425744ca39fafa4e25f5b3a046be4886fa048a7d51e6ae6458a3e45a7bbd0c54fe54fa0d126fb97db8a649b30346c5cec50ff85adf946b46710ce52c2ef9efa4590ab1122fc9a970aeaed422d67fed8970d0daac9b8ba0463ec4639aecaa2a1f106df59d72fc8cffb3a117631c88b21f79ab274b6de3721293f002c615b2bdc1e3f5913fa00dc21d01f4427e53aea2174a285e8221a7491fb63948cebe0ad7527094744f9c5b901454fdf4f14dbecfca3f20b3b695ef430821475ba6923841a2dc16d01c6b7c607832304c6788a7e8bcce20b3e8d527d4256cbe95eb3198e94a6ed642f3328250488d43a5c9503e7186e8c05cd5179e8d85f46a584b7020efbe0e57ad62916b30f8c6f5811c6441d8600e4337fd153d8b1c7ed9c76d56bdc6dc9f80a19c0c1b97f8984f18bcf6a197b6fc8423969e19b0dc2a80e536a2f91a8845d775c5b2954e27b8b066ebdd01c93aa30218bd4002115198b20fd432526d2a49df4c81e385fe28f9ba1771346b34ebea3de4fce4c8c1e7f98d9e47d2dc6eb0261801d47e9f849fcf405275a0a40c281265fb0cea8072dcaf8826e46e9bc048a36f800b3f1aef2e8401ff445b0c9ca02198c16f65e0184b2e40dbe6c87e1a42db2b9a0e24ce6e0a0eeff744a4d9c015cc433773e8e2c0916f8ddbf11f918c4a58c509eba99ed14deb521bcec4b2d99e50f2fd43731f55da0c758a10b3439e006e368263a08ce0c9a838775912d78bf49b0d65053175ccec2d617ecc65e4ba4948d1369200009858cb9c6c6d2496197ca1c103422e97000d0e3152d9200e4468202c3e104895a2d08347278d31e4ac6e884e89ee410621a6c4fa2206d4369034bf2239e997706c5308578c66e4f534a08aa5282e58113b511af8b34dbb230052ab37a9df1026e43e576bf3b0c9c890cac703354b8749b5c5d4152acfea819002292c3159efba170d7de01f44450fe0b2ea781d1ceaa09da08285fa93424b07f1885ab494c91162d2b59fa286a411c3513a40f42444f3a3836733ed9072c6b2c7c8d377310a8450bb3ed300107f46b2521b976b4f6c8c361198249d8466825c00c27807dc45a127e5ad5cc0b2110e40859c057a90c32ed076e9d184e699ecdf0f738bb9f512c1c1cd3256e4cc2bbc0415af671ddc5e253ea4634e3f04fc4da419c3e2bde146f1a23f192b2a85f9a7b7a951ec3c1a7ebcf15ca31360eb9a9cf6a68de42535551afd1f1d25e96aa7a6046a5c212b1b9649838bbb455109e3db28aea86fc1b43e7670793977f89d0e31f640a1cf311931c60102231decc469aa15f4944cfadb90c7a78619a11de1634033cfff5ec33bd04f0c3b1cebc339f0f75e0c1772c5d63139d83a146a18076989d383678ea968ce36bf6c49951235de11a2cf74862a3235e1f0251be5307c390bcbb41195720bc94c610049a36a950d343957a2ff1a9983d1baa2c73734e1c894993db5b38e1f4314202456d28a313073b77f4612a12fd7cbbc65ddf17d7a5cb5531d15fb9d6a7ea188bfe2ccdb51751ea5953220e7614b7cc7371bb545b8afd5e1b31255c17f8541bcbf9e4ae6a8f80b8da26a96a2ed3f46cfd6ec677f628d634c4e7489efd410bcda3b1b188e0e4cc8ec2bc4a972fec05f3d791769c58bfeef05aaa122510af6246d53a4911e67976c0bc8cfd9e212581934d66d5a55781988e517eb230fed8c0eb8499d10047d923342c8fcd08102706a8d17110d779893c3b936c27a6a46000214863337d3a9c2df57fd086dec27656afe5c0b6e85bb47748c9fef1b982109c6e41be6f5b9a10dafa35f794d89fcf1891f0da2487426ef7f69a1d2251cc3e2f676a1163f4479ed177f40e0bafa779dd973bb515cfe18bc19da80bc9c0b7c8cff8b95653189686a13f1ab4e03a68429ca96cc1a06262cf7c850ee44eedf902d3e3d63ff3202ea550105978c930130a619c9077b2f05a26faf4ef2f07b28c3b05c7b4e84a68501439274fd545d6b51708ff0ff35aec4ffa32e7652afb32b9f62ea67e7c32bd74c1aa665e95db18e449268254e6a058e0254d2dba967b07c5a04232a1b2112dcec2ddc2dee87a90fa7f7a7d26737121017859b6ed420c920291466d6716a39f10fc1fc79d79b1f3ed2475230b97e7f25e79c789d989442ffd39ce2d53b207a2291962fc411bd0cf27c661f1dedc23482b97c797df665c27808264848dbefe0cf13657a95e482b40384083da1e12db03d6f5b24e43c8085f9ceef44d11a0ee7c1e2cb346eb4cf8666c6b32cf11f0efd206572dbccf49bf00f0c5bf7c7d1ceb23d74fd53252ce62532f24df22349f3ff20549a7f5781218e1925cc3a96f9ee028ed0554e59641e1aaa883ca86296b273885559cb352af0cc81af8dc32c3466b8569c0afcc24ad71ea2b142702dc2e65d3765bcb6be72cf9774378009e3af695b97e7ba10e43462d1e5a5c4e609573e2654e8ee0a2b18a55cac8912616e3c4a8ff276179850664a6489cbbbc190180c8c7f3347609434f793009dae71568c7508d9430a78820e2637e6b642d73985a961b157b63b08a52c865a2b02a5c9f1ff8a4170f8cab3cde807db820c0a2745ec0401248e144ba1b3b18f4e7d60436fe43aba7dcd3e0c11346c4ae6cc4e678618e605e23851a0f058d0a505eb3662281e40d875d54a7e51ef03124885814b7640070b3f2a6ac9eddd0c93afea149472618cc8c84b10dd785400928f69ab13f57bfa1dcc023302b695993db4111412339b04e2c87bfb78cdf4226d241ce60ceb11712945de8840cc454571391b89f52d94a24d09038f6cb558b27c3ba301679602e5184da05dc9159f9552e1f27de7c914a67957db65e1a99a9fd01066cdc55795d4578db16c39f78212c1a024c8afec00179426f7985a88f367d572831fbd4f4baec1bd4304f03cbe0cc2366179b47d6ee21b976f18ac1fce7ca24a0ee8950657d55595ecd784d52fb5a0e876d95f34a81360eeb59cd293c6a068f9ede3a857092d4c3f6ae278e3266a88081bb687b157a6119b8a16f2834665b53fea0fcced51afaae6ace6b284292273450b70af2bf66886fa5f8418e4b8cf54b4a65298e21ca95eb9965b181a832195b52bd5c529adcc781edee3befc234b9db4a3ac376abccc8f99edd9102721f93db0ad4cc33a634dd7ae3c0b5a3e0107b614ab7fab02a2e23907417376c2382ab4048f9437d5fc14458913c388b45325cd03656921a5741539e4302b7c025c38721363bc231bef6516e28d470cf47faed1fce439173e49d593ca1d0c75254cfed68d863fac59142bd9ccdc08d3fb9b99ce19f98a871fecdfe6f6f749120db062eb93450bb1690ef432540b0a7ed66af6ff9ec52852140b9f2b2425a208aca7fc922750b87166f2b286af0582b36a21dfff095c178ec399ce536fbe2fcb00e5e938659d83e1dc4b14ecaef30e92183d993578884ddcabae1bc6bb1938c14ead5cf0308d3cb7f7b19bb0e10290a34c9a3164f8ff3b6ec226d5d44c36e1867f8f2caa066a211605b4acdaf1ca71c2cba2d7551b5d5df843715ba8ce21094f414504f723cc39d8408e12630649b9c51a7b2b3e3337d4e3f46e5d692c632f795ced0c4bb9d51bca6d81553943affb00919a3bc94e4a41e489155acb7290bc2d2c9935cf96ff8f3763d203558c7d314ce30236290ac6b376e9e9bae6f6f3f935f99d4d467c6bb369d848a243fc2a9afd47db8085ea060ec6e647314999da9945cf071ac0174e63060c3342fca4c9e1a3edc01b01fb6e363d7bcbd78018240c44d61067738be112fff6bad5af40dff078e3012f55a08f7fb74908ad28c2ad65e061bc2fbfbc89c75ba91621bbdff2999ac1db803ba7fbc5ce709ec65331044483c63e5c7b5d51db2a4e7031edfbd72f3f20b6891f856198c38be855592d58181fd6989794e535f7157229a8c1729088dce285c0137544026fcbbd59684ecfab7d1c4282fb1bc0e5fcb1b5538712b13925b4b3e4d7fe4ad2c380954455619161e79f76f7126abc61c50738efca5286073b3d13a07fcc07c926e5c2d9f8de53bfcdbc0e8d52e91438945e85a9c4ba846495b8ced19de100c569f7eb3383e0dbdda53687d15f576e0953a9b97bc7ab246c6613e24593acbbce01838a1cd2000dd490f331c563f68ed464d668672f54401082bf8e3b07259a17490009ae7cf9f62098c869613ada7f0f32dcd2850d3587299691d8776295340c876d4cb24d503e2c4a552176e1f0f061420af5ff37cec7b0520afc22711589bca92569f30d9ee3bdf36fb43da2042e77346bcbe5f14b9ea17dfe647bdd2d3d381badc4a38cc4bd1fa02fea72b04f4e9113238c1b39e0b034c9c5867cf9d339aecfc93cc2bf40e035945f4974c162bf1d37c69d6a20795feb15df238de6e2292858c16dd6efccfb6bb94cc3c3f8b099665193c122b5680d9af14c758c192521b7d63c5ff1002604c19e6295303eb55e61ca3281b0cbc67989196f0111c481e2cf75bc0eb1416bd0bb0e02d384ec0218d5e242b2d33d8bff217516590e86d9ba492a94a2476cfcb3b1e5ca09124869aa62212e0bf657f6217e4444bec1dfb546c6b5cc33bbe39965c6d5e3dd46521677dcedfb2de08bbe98787ed6bd846df64bc4a859940bacf2073afdc98da294f5aeb6092443a74c7028cdc98aad03770d0a9eab9600a9f45ad54bd68ca794586b405ffb4d94e6b863e3b27b842b5edf662c087ad6525db53b69d439395e4cdc8f81426124891e38e434953acdcf54d9bf426a8c2038d49ddec834a1916a7eed786fad86e2cbed0b2f145c204902d58636294d5c5cb7773452853769b18b8d7d355717cfdd1546facb47d7d1b5df5d0074e507b67052c85720abc4a1fcca96fb80d7dc3444360218678e8428a47bfd77323681dac44bf2b493cc2f901aab109ba6716df38a01e0e07efe71fb8bee3e7ccf5434c9a172fb05126a2ce0c401141c909c821e3ffb74327e6a19c626e38df6eed130287bb45a9510e99089b5420e687c38be617730eeaf385a9eed84b3d29c106ec96c2ca6ef05c0c1bba9cea86564e01d1e7cafd474f91824cc243e3791e610590e2c7b7cb90c0062c465a0576f9c88a42d345773244b18546b70bae3442620dc964a53ea98a08d19ffa0c83608f953b4228f94d42fd939009a565f2dde4dd8a6d406a3dd71d2ade372d6b9fed8ae999b1a98ec3f0da8a9a3116140680373f5e21155ce85c8b5c5ca596a49795a3736129d2042809355b7e55b3b0fc59abfd29ae8845c4f8a1dd08cba3ad37e07845db4856f056454fe66591e85fd22dbdaa92bd66e2c5a6bca51505095f0035dd8d28e8e225bc2930a150f8648d231ae7368776b089d53da2faa7dae08c5ae1382e00facdd4ece80a84511d75cd331c3184fce0c028cbbe53b4db10ba5ca1d1422621aa6f5dddc82f1acba41b5a4e78250e80d36d5d354f1d65e4f818adf663841b622c5d3f6198a152392f08b3663c816fd3a2e840dda6e90487c07a95f2cc9504ce0407d092f9e3283f9184662c4d4bddbbe8c7fd5cadba777106e136c30917d5afad10449de5f68dd70f109ae4662c441db612fe106f7b8d9da4b4ee309ffc78cebab7bb650239e80e0235e1053d18d99b8b9eaca441649c026c315108b0bae0c3158fa34c38bd138165c26ab094456fb9f33634298470c6867c0466824393f22d96a9bb1a2c574ed9cba100faf136bc58ac2916b91aa0416cb2135b94a6f4cb55221abd095804dde9c7fe5f209cd385c47621e90992944f5f956195f524be0b3fc2c0205ef5932591eac39ceae7b6b22753d9afaba5ec870042e739a209f0abebaccfd494ca1b83b50da402a2edb746fce6dc476584870afafd39d854ad723a465944a2d7085183d91b9fdc249c7374959e94e3f4e6acb8886d0113d84739aaad344bf6f75d141665190349a56398d83bcfa7fa6d530466639f48fd8784dd11d31ccdf2abe83ad64a854438c9370be0e108629ac4c80284f382cdc63ee9af79d2402924f4c2633bc7ac3a46bf36cb9ddd0bd09bfb948475d60b8fc801ee18520344be3f3fb3974e3e8db3bc58effb3d70896a1878fc95242f36a2eb58d8ca46a5565d90e66367bdd11ba1ce3665104d8c697d39994d7c1c112d316bb9c01139db560418c8a73bf05992367e097fc7041215678086f842f96712530cafd81e64e67aa06c8aa874c8b8f02a4da310b4d153a3147a651f896ace57b309b944929275c3246a1c72c6ea31d8dbec19ab90d17fe1fea4299acb3cfd6d1bda90c26334b7202752b839ca9e62f52eccf761e4d418e2d4dbe09a70ea79bc0371538f6aa63bcd6b8e608934e8c5b968f6fb462340a1f53392949095c5b567001289f04156ac3f2133ff741529dc3f60697a7fb062366042403123a1e3bf95003e08444fd10f6d995294a879c37625e358629e9c9a6f845dd6d26b179c39e3066f20da59b25dec14076e452d93f85bef22dd6a3634fbe70a2e4be9640b1a65ab4d4e0dd76e17582625a03335270e09b27114896c17c2159b113426513b52de46d87fcd56492f236a101573916a5a7374b06bbfb420e28a3f06662b12d965ec1d16b6a4ab71e4de0970bc97dfb0c387f187ed78b5e1a1eea63683161fca99b3d2824c1adcdcacc578c690c8e4dea87a80b925c42bddc01160dc954fb060bb1c551eccc77c6e6a79288ef959c8912626d94cb997df660ced212d3f31ba64c6142ea6c3f191cf1065fe4890a8ac838674e81a9fe22afd2346d44fa0ce8c6d4cbbbdf0ab632b444952081474e66bb27d1a61e2587c16b0a6e18d032e1b22c3efe748583af1d5dbcf195d206d8e898e3ca9d1e9cc4d06a0e83a85ceebea20aa0c0f753828694462eca784267770ce9731fd892b9d4a1265fe95133be4f901d0000eb843ff1e59f4e0c69461d44a3bcb58c270c0ebb5d0d0a9d3bab531d680517e1be894ae1511ac7c6468fb9d0e2ec3e76c88d2abbbbb450a64dbb373e9a460ab0cb80804fcea13b01520b41c0b0142e51edd6828376e1a4cce08089d6953c682070875306dcf07f2e2d2be1f7f3c4448edd2581d3a6118b04e950deb9bcfb590a9bb68e1d931537f96102cb560b6a688e11ea93869dbdb3ed58109a861c4dc57f39dd175d975765dd6d3025835e469597f6a654216a469182fd296acdbc616d6c0dc8ace7fed0e8b6ae0c7fcc8fa83b5d28200b8d592e7db59d0ad1165fdb10dfedf8f3208c2e66776d47d0a08d7fdf0e4a8100bcf058e6e9afbf66c22597f4e1f772eae474462f71c4de5006daea8d35ff6b12bc944a8b6de353c1dc23f71b69cd3d515536c149678f04c88d39c6eaf260c2968d5ce68e32012702632b4bc09128539ef0364c1b9bdb79435523037e70aee8a93c6c9fbe4fba752c025b1544cafa05409ed106eecaec3c6de9ce79954f23fee4bdf1350580d2d395aa762c9aacb46386d4e21d02cd3ca9319222c3e7f7d715cc727e41d54e43360a78e8e0e6d23119797bc662134391f217fb77da7b6c15c9593a8f0873eb22c53529061c32ac1832df5c0a1abf7f20a49a9ae2f0862a7a75b566e32be978b7c0b29a9a7015c512ad2de371a5397cceac202a5a1533f3b51ce637a0e214bcbc8a7e2672519ed1fd7733f8587d80007f1bf9a951824de828fab8ab0a6b5be5a661b83d1526cabc12f3fd15cbb9628d578ab2dd5907f9f3be367b395fb89b4401852ce07cc0d801455e4d43ae5d6a890adf60e4151de020488876d6823aa27ff1e3ee21702d3f383977162db29604ca6c48b0c422ad092b0fa21f7361a4b1ec51b67c38138483591249e42bfaa407fbdec88dc2273960259b1cf067a8f5969b8cd4ce52b3b843212a295ece1f82f2456b955f41b05f3614fd7865be0b7d951c4b7ac4c6f63cc0dad3fd094cebb934af63018af6f55419fce6db2c6a1369b4201e559f68f33c890a1c892481637fa613b2e11e561411d370c09a0ca7392dc3b97785a17bb90e166b341b4cca056f2d036ecfb6eb0e9133fb7c8987ba963acd39cfcf016aa61d3264f4ed835f1f087fa93e155edcc1f7af2a58f23c2b96b3ac2cf3ae5f1d6395318081d0cdb7438e837538ea2236f86b229d3cf1b16369ae37220ae42981cf652717a457ed51c9e39fc42ac37ea351355188c63706a16245da67473b2a9794e019be303ec922b8c5a24f45f7332dfd3a503042f15ad3b4640f164749e8b56b6b9b74ea7f35696b741f7e394d4763588e1d01a34fbcd2fabac5d01926ed2cd2641742fcdebdb5a70447723216673adea1740cc2db9e74a2e189c1ac9db5402759812c50d1f4b82b157dea6428301b517be51216c5a4f11fdd29378a08a95f900bfa7d47e0813abf0e73d2e37777c993c5d73a8b3a5e6b8fe1f1a0cbb919a838d5af8097441d5f4b87a193e067eb29cfc367c96ee99571e45db41f6bc0a88d644146fb46cdcfde361d2baa02d38e81d6810aa361b2008c88aced33bad41b086ba4d20f39c432c4eb9b94ed642f27cde0d199a0285805edee91a27313a61e6d04b194267697bb7e9887a3a69343db250927d670df92a2b593594ab25a312c7f25f29caf6cb09eae48194ac2d585618c29140fee5bc064a305bb67ca8c2f08bc9447f20b2fa0803070f94786670c989a5911fce91a1409015111018b84acd6018800599c596f63e1c3a9038b305475bb533befde4d8f8fc5c44b16980a14ed7276db92928c4bd7dc564823794e9fa826e575cad71028fade925052ce3dd0a561cb8385446bf8fb48a670717ae81d76c2bf175c4407471e44fbc9e4043dac519ee04343f0d437928b575808b47601800634e0f12d1f3e1ab3082697dc59b5368d3872a629d94e4523d128a99742cf1c81f06941e8912e539531750f603e5712b9fb4e2c81ae5ddcf941ad999716d25d9de028031f196e2ca269b45d06dc5369ea138ea4bbb1c28c6aed40161562bcc36a190ce4de08ded7fdf4482c727255dcba66773768173f51da66fa4c0a85a321347a2d651110e079e3bd3696d8121a4c07a97037473dcd4078bdf6938a36115367fba79d49b6814a682e1bcc5209ddb54fb69e2979f8fc20178627c03da2360772edef3968321cc03eeadfadf9cbc849bb0da704730094880217c25776505e18fadf1e1b7b2de4baeb0e921d42a6af59ae47f243b49629c48b72394a65a4f167680ca8f4d396e68f4ce013095f161ad874477f1607d5723cb5b073ff9d3734697d1a7397ed63bc68c315d06207f7a2c47c94c189e278d73e909724889c5c20f1c9f428445627e2bc2efad72d73f6f6ca203e1e3a1af09e610f7020f998b8b414eb5b517fe5554528b856ae2e78824cfd145e484f8e123c149660e7f6b53857c004ddddba8890c5ef3885a7e879562f56d3d540c10600d1935a9506752b42f3aafbb851a13da672d338cd69430fccebcc1e9bd7af0c2f2399aa9216034d5a336f76258865c3ec3b20bf7d5b594e6b1a298511dfdaa25832abed89f060e674926a28a0f0aaa02f952364250ceaa388056d23dcf00fd9f6b2399903ac8dee68b14f54d209c23fb9591800577c67c8c690cf3f1a66fdff0069ed00a9ae3cf4cc27e8c2d9c87a8639cc405818b4c93a08edee9c2a244dc5134bc867ecac5fca88aaa0a36ca2b308f5ec99a0e979d85bf7346fbba9bbceb0b3912f9140d9c69fd7c3538abd17ca2a5460ec8b29cf7f16a4d489ae1f0ab695a13ee335d2f1bbfe9841a758bf83957e20a70df7128ce8d026220d09a55b417e7d7466a7655ff0b62a5f38609de16dda0e6d78652dcde7a07b560f3ded73c066a5ec6a6f98a56c4a70bca7ce1d4b2467c2824d02b2d77957d8f6c90d8b262b30ebba392d8b640e4fb4e220efc12e783965563a3128cd454a745164c5dcfdac7d23dea2ff06854640bcc4dd30a0a0177e2882a89c68a50570b12a9792e3b341179f1718a5cc6a86dab33c092dd5a3c20a9f54a1221ec62a1c6b7a434fb34137f38e4fdf4e48d7281202a8033b4fd4feea4eae1178a4ea462002e093724ccaddccf958d338e472d7aa18721d1d2dedc3abeee8f623baf543351235e99f734a6eadc5a4f0f4821e094bdf4406f780fa57b5df4fb05e1218e7193a2ef7e76e2936477f42915866dc570c31e4d7e14aa964b69aa8678532605db4722e64c1e324a32de1f253caac8c1595449d15e0b44cf3553e0b88a0608ee608130e82279a42fe7ba804740060794fa0ba4340f1728936d3e4b0d60c935130e65cfa72010f955d7295a3cd4424a991556f21a6f3cc465d42b87ead0a1bbbdfbfe21b98f5f053c65973dd84d2dd013422a39bd485a2035af400f6707b92c9df916dfcdcc58053bbe02493d3208d94d55fd22758c6dcd1cbecab545a5675b9f82e9c8da6665e515f3d5598a7e616b5fc8ef4e9ee4ad22f386b510b86219d8165ee80781ec70c522749d8e6a2d4bd48cf1b8d2f5c00d9f98d3affcca0a7080d28736b9a0d7388f96b9a930a32df1095890e6219c09540362f54ebef61b726a5e4a477699ad7a7bce198740670847a216142d0ccc07a10654245b2605327f2d5e6a4c523459d4dee44367cf6f358fa88d2ffb3d28308b748eac432b94229c0e3372025ac7b5eba2842511b7b5d57df23fa6fd5ac8b6ba9943d0b61f36cfd306b0a3e933df3c001e5ecee6dd4d8898cb219accfa2cb33dfb59ce1a6775bb31fbb952620daa4cc46388feffab07865f3a4f7b87fdbec14003eadf03af0283e879c32b9ae55c8c17e1d7895663f2e938c512fbdbc7deedb5671b220e80d8f51f6dd055f3325b0ab1dd6e3a205bdb3ce5887c78257dabd4c582d27dec0081076b980aff3887b337d90fd13ef25a05b599e0e2ea031f774f8b8f2f92571a645338b133173c5f8a25b7dc1bfc8588e938e68b0a4319c915790d6974c4b7e34190c477c883f9dad1250f8b46a4290f8c3ed85b1e08163a420fc04b6f7c42971c78489b4d61c9fe8408314b9832662972847678dd96a3723249491f416ed9652e642fc31c86221d6a467f653a2ddc0cb3fccae76b50f5261f751976a599d620fa500c29db3e3519a830031918cdd18a7c49dab6df688ef4673d13f52f1d5a01b4d714e7c56c3849b82ec835c90a0e42f9d9007a9917bdfecb30d30defe8cda81e1406fdd538d8b02358c58bba2f23daee16b80e6d667575a2ee5b41c2bbc4e38105a2d6712e10c78435d3e0d6828abf653cbfc83a989bad11d0c00ffeb8a9936ae1ec6ff8d90e2bf1381e6d7b0ef5986955746d7dfd0c0cb79df9d7911c34bc0be4206ccebbe4529e308afe47031072c246c7e8ad75b4bf09ff20d1f0fd0828a8b1a99c76f86a6455617d9003fa5b389d0f0662a57cd87acb9680b80c199288e2efec0a0aa98061eea8c62c224897e810692f4b2623801991838efc346b2ca3e97060d75eafed921c728c910d3849195549ced14d7083a852092fb451272939922ddb6f2d1406c89bb8492a4571ab6dfc62435d402008acff60ee852105b12634f31cc61e74629a7c324a93b7b0592de9f9c3a2dce76e00864cfd3e3e947d0023f9ad76137209263d60785a2d06cb19e207e2c05b84df878f528b52fa5f893e96541eac02600973f8aca4890558a288b1188572100326c79f5b22b484135fedf84b668beb36699269cf1c413c414119f0d7a105c5649754a1709ba99302acbfa44d730853b359870dad59cb2dd230abae1bcead67286ae2f9f33a9e83389f8662da78e04ed960e509798e33f8259997f2a219d1b7f2286553bf387c86090cebd2834957e65371b0a519b08b08a4aaed65065457934f45b6a67ebebc318d7da3612d05bcb8bba958fe084b49359a00ab4fedee4cc4756945603953e3af724ef861158b02322c48a797198dc64efa312d96fd185c7812321a1b868943424408c9c01900412b181b8c31363cd5083a4261c9c81657087535bbeb6e04ab5b48df39b5c6048de18e6f0f23fead76e9a6e089dba9b828f6e0f3e1b1a2d4a3dc7285e0b83d5e174b2ff32cbc14c63fa0863f5bdaf17ce2671fd706a74662b15c0cbd31dcd02d129e226b94cc3a3acaf639f371fd5b32a45dfc92dead87f8483d1fe58f3c87530a2950e03911fc00e8d791395f977fe6874ae826fa3e1b82493d8649d94c23232ccda4f013ddf27f8c23a9d73530d62b39d04b1dacfd1a55026b1fa8a696b258af9955484b3980fc20ef31aa39402d13ec1fcba577acc6aa9a44c251d02fb100466e5e909a4d770149d811dae7b0a421deb36d266ab06fce3ee66a5737ea45eaf04526218ab9cc9e1886147f375bf85ca0b9ff09721d8dc827d10a7d3d14c75187cadef924148a1efeb8e013350f32cc0f0e903c2bc7b8873ec30f04a492edf89574bda0747f4b094091c103a2edd3a8c33a746aba96924c89421b7bafe3d6ac5266879a70aa92c685718a7ac2e6e452454d81cb85c47f7e456a6caa6a4b58fd7b1a9874e6352958a74d4e518e4a0b32a9f2fdafc5baf2cc9b8d1adbce1593cdecde6c48a9e609a44cfd14c01cfc8239d4f7e2a557202264c50a8438b2bf07822a76b50fc5fdf5143e22871dfd6a3d8dbe5357e0461e07138bc69845fc56dd0a1c88815c21584fc8af7a92fa6016c3dfa911c52de5cc4d566315a6060694cd9dc14124d22dcac325d9ecf0286046612601da7871302d2eff0231fa1e4f89463eb086dee2a6951dce658678b4eff98f4bd6615bad20e1787482ab85c9f6c185a8c6468d65f6522e68114854ba2be87e0483b41ca652fe0c9427e6fbe8ca660eae65b178af19d241322d16cdf044a5f22c89a2cd44401849a00c0c0377d4480b0c615ca6319c33009d3b6c420ac3969b1b011129b19d58aa042604ef57e940d55428eb2d2643fab344b8f083842ad1e87cd17fe67b40958ac1e45ef5616277e08756f43ac9a057e41a0af7d30e9934313e8ea06b04003c5b9f4dfc77085987f69c7e11004ede503becb24b818ea31500508548eab27a33d05014be032abba28c5a2054b29a0ea6233f30eaf2f429db1b4b966a30f90b2a996b05246a54d66d833f9fd61d52ed13ae93ae548507449e9055b38cc11837870998f8a47181e416f483934595ddf376dbb29786eb21bbda61e5eeb6bb6db9b74c2949192a095f08aa0833deba397eecd574cd219ededade37ff20bd03dc4e29507f1c23cbbdaa63b17b1b252dae5145a9a9d44b9952817e05f42316fd391aa0f6f7efb4e33116dda563f1f4de8f1ebb6e6466b93cfbb977a019345b12e7a4423f87645efb41da8e29300788031cbb1be09842813168b5db46582384a1c7757f0e7cc005aed1debf08d77436b567bcd3fb7b0f775bbfd0390f7c50b2d8d1176509ac84c560287b0d85b24aeefc797216a98f8a4527dedd5d5ecf327676f19bdeab667bc68633b1572d04bb4d26b98592bdc3ded2ce62cfb87b371095e9cdbf46394c49ea8d028bee1d249bfee2340e4718ee0b47fc6adfdf752f64ff46fc4719ae1622d1716badb5d6d008dd1113032b5f9ec25e41498f510b8df88fd9fc16fcb35aef0c8dd010ca7c0f7b090f9c3a2ad3e94f5e37aaee7ba10d9e47dfb32e34b2fdc8795f9f7ade2f51a2e3854bec73a191ed61b85a28a17c6fbf1007ef743a9d4ea7d3e9e4799ee7799ef749bcd3e9743a9d4e27fa7ef23ccff33cef743a9da889b51a7a385f223986504aa2c7c4e1227b21b3f32a764c09f15771cd8b7fbfff655965467bdc49e90f963b717660c794c7fcd8d12f4e1763ea657ebf90f92f3304121a99f753d32fbf6abee64dfd7a3826a13ed335973c99273737909beee9b3a77333dc2a76a4b9fcdc4b95911d69a66f2f64faf853336994529a65596602519a3c699dd7feaeb5d734cd3377f13f95b2b6488f3b5fa5859d2f553ab0cea24d4df1fbf39697d70367db86b2e9e9563f4867eeeeeeeea6700bb9f9b66d32777777774dd3344dd3341f65b875899433f3a5c52187ce9224ae699a46297d26373af497ccd09fea19f9599665599665345c425fcbb22c73f76772a3e3e112ff2c940948c038c31da74480014625779c1f4a6980f92a4c156a12196b2561891152953490d09901097e3b93543675316e2193a9c33d371ef1fb82e9e5cdba9f41894e472b8b347ce1885f536804495f2826e8e4a9852eb441c94ac78619926c89a2074338021a49d8a2d3fd12253a5db8e4f45c181aa94f61b859484128dd9fc02473f502f261f1d440838e0d728b0e4b874e17e2d0fd92244b94e870dfdde8749fa4e3388efb7ed592243ea2f04111530c210743c474b8e751c2e2e1e161dde874cf1275bae761a574ba67559deea9aba33c2e58e97461122550765003128ef8c1081a74a0c353a968a511a4c3c3c3a4ead8f02dad56291d1b342d3c4c441d1b3a8d950ef74c6e74b870894c105672c042a247072d7490601b3d605471f4831462102909e2a1c233c4142d61c0749a0728b45001184d708183ce673fe43062b982e5c96a8914bc7438082417ecb064e90832786241ac320d0720502164d20c2a8254e0830f3908e206039c6103115860031fa0400747b8414d82ab194acd53ab614ad8192ccb40e3f20779a2e5888c8d0ba12bdf555fb628059b31711e255df9e3cded9e27bcd694f6cc5aad4da5fe4591520fc72ccb7e66afb5d4dcadf5a622a54e6b4da59e47ad9a129a64f2a6c338879a5427724669a37ac522a5b0bc9228b5d0f0cc9ef1a66a94524a29a5997f94ee8592c092187119f52da34e33ead5a99651771d255b12e6cc8739a30439b92c61373d349347d4f24a58ae04e919a3d5aaca0ac437596892c4a38fa560ae2c97fadc8e328592c05cbea218dde6808264af4cca57f69a3d97265102874891ced73681babea65c3ac43e5f45aecfb22c132fb5c0956176ac5a8f407beba233b62d072e5b88c29020292b38594486098c367157c29ed480c82905a40f77662aa74c677a23593ead1aa5b4bbb999bb86dfbd5ba031cedb02ccdda13b7597cddde1d84f43f92e8dc58426c5a4846b6c3269ac05bc80f0032884a8f05045d5d3832158b05af5d4a033d26c5902ca172f1313ddfda021819bb66a3585127a4da01b60e051b14310ce24899241f96b6701ea1868bc69373029c39918e1454914212a38e0a28c1e9011440cb0803206941500d1434f1537e860d24c19f59e612af529169888c8616d549a49cd5f362d965e097b9202adc86a57c29e30a928ac1064c8169bb2de95302288404410ee28c29670f3b90912e92d69dc51091429573e2702304aa0e5f28f489ee039f900dea8a4b5114dc9e24a2bb2940104298694cbdf8320bc40438c27e4952897b9f042526942629185e4a20b2f90208b5634dc238dba1d8e4a9cf042013d50400e946ade48a40a212416547e50b96219973f0483c71391083b965071e1810711528a150df708a32e87e3088c9cc61b6188c2c505355eec70582e6fd16df2c612c0b43052c85a7099fa9042bbb226b5ca4e07b9b7bbb777bb77b7bbb74f2ade789b06971df0bd2ee35c0e8d34119cf400913c81919493ff4505f1f273284e1f38293327cc09a02b614ef85c025c096b35b9956be4133cf7af84398174b9eeb49fdf5c773beabf10e1d7aad6d18e6a3f4f0e5072b57708c8cb29f06b4fc19717fae2f5cfc2171aaa208a62f77052a6566b53a82bb294fe1e851d51b75f1c7cf1afffe2999b52e0707c981344d7e54a98134277db19fd39139bc49edcfb8be9c5eb2fa65005f172a109d4f47c12627a690a2b14d6f4230a0908945c7922327351b7c54b41132e149c7b2667164a19e9433233d7d0fc54ac34efee1ef60bbea08d8618a62cfc958bba351a597caf2838165bc204d911751d3cd297488da02b762872b38549f55a64dcf6355469606a7b2d84c2a582f4d01443387014589c5c4d0d65e19baa6aa626a24584129761443071e4e3e47623cd5195c256d44db7ac69c8d74d37cd168d898d24603448a18411d240c24913317802e58aa31e349184097447f94aa373b8a37c5915e400c51257584184133ae34db792146c21c50f6948417a09e9cc2f4ac293a0e78e2295e984f628a1c14f0c8e1042280821d4a043086134c9c20a1ea0e04085ca7c59a994a145d10e556ea8a2071f1e708c01051454ac847a9092c5282eb99307423cd1c513549ad0a033a110fa2287d813180c810a16588c229549855ac1c28c32ee1137f0620b0fa618a2063ad308a134b6e8e2892fbea8228b21e4fc14150d073c77ee400aa5147451838b091d3b0cb16c700445962b5492982febfc94cda44180c969d63959073be9106e21901b904683c2bdf641b803a20bae0888a429b2696641f3040c249e84f1ea501d8c089f6baf843dd1c113a43bca645e683614091106152b488281509156c31755540003209e404186191e38a3053a08e30c252c39ace003104b1c1d01054e044d24e6cbf9290c042c6cef5a92c4912a6cefd247c962c7a216665670302bb01b87eaa4943de7923999e7f79d8f04e8f22b1185eb0ed633fc1d0c0553c1647a5425eb5a523c4f7b2eabc995ef5818d636dbd2b60483c1609b16538f918927b66931ad54a998516afa916fb1309b6da967f84d2b6b53e3b6b42db58d1ff10cfffcff546a5b3a7224d7e24a8e65e76f23714d86b24c580f25cfefa2d71d1fa6891dfff60e1c34ece8474bd40905e29ad18fae0fd78cde84e8cea347c1851e21a3b9e4e4c548ac283089a3247158e2b0c4611f223397ba58f429d2509f1bea437d6424003491ca1c50fee08f69811dadd19407f2d4d5e365522a8ba23e3cc3322cc39def3939cb9e767647093b529f2b27f54c40365a9c9419b5952be9ca29ae84b9822e07d373daa9302888dd9e48e1446211c7c8fa3891b45513ddcfee67f7f389952c6acee2cc4e1dcd5ebc9fbffd8bc79db2accbb2098a2eeb67ff59369fe9e901f33b669edf852f1cf71c3387645e2eecc122cfd09977846c56034e6ec08952cfe5bedf0c2df7c9b8b9987ed47177908809b2e35fede5f4720a55105babd5862f6e2a16b7a7afbd8c2871b8d79eabe18b0ae21d671ed0cf712fd54f44fab9f0a5862a88b77e0d4516e7bc35ecd1028b75aba1dc11b2d9942ff7e1a65a80459e2b16c77aa9f4411f8609fffc691b1e246298d748a7b1bafd4c5ec7f4dc63022527409ba0168e321fd22bdf8e4956f7482d22337bb886397027cdec21673b8b6b263333b3741cbef3a52ce14e983b5ff34f533e08738395cfedd4e027385f86e3bc738514bc43b9812f935ffa1bbce95a6feca4260001c2624725379df4c19d188c8ee582a3e8d3257be6bd10c9c624579ec04a2b665cb938575a3103e872b303028445fe18c251c91d5fe6cf19aa20de1d2a5ee48bfc51942f5eed5b862a88570b69ee11bf124452af9433eca1aa817dc9bedfb35005f176288252863b2ab6e98495301900ddedffd6e77cae6efd51d575ec6c5ce899fa73ce1d234d9b342e34ff7c4dd3e66afbfa301c99816d6e7aa67e52ad2fb9679c4d38c062adcf610658ac2fdd85d6cae176daf9ab6df58b6850b8af8faaffb53e0dd7b40d5755b756995beb4b991abe3081b41b52c09d80c314a02b382eaec85244135811ac56125a4a12184104faa7e8caff01672384cd10b6460b09d6ba7225ac35a555452b0a092cb5623b660e56e66009a23b8fb02ccaf9e004c2be0eff9015244edf4e0a338eb2a89cbc340d05ab0c4ac7040a8486d0446c092d7e9438a1420c318cf003900c90b450f5a954100d054ed334ed0a2c80348d3905650c4da4e2d62b61509ed0c215494ef9285e9a7b63df869b541a2552773889707d0539b8ae24091f0660e1760972c6ddc7046e6718b83d333fc1edf7e1ffc51854b818e108f283e6318270c3f4302844a4f86b8e2b615054705d922003172fb7adb4d6544a0bc722e2e59f45c41c6ad568ba02f92ecca865adfbb576eade59140fdf69d9a752ddb5474b71771fb3e9a994d63d8a6b285b4a2dca007705dc24c3cae798bba57b38bbdb7b61a1afc0095bb66cd9a2937d732a326ce5d9edde4b4f9985299ee95759b196c566151751b8c954c16afad14def619bb6b0ba751a7a7bd3e072e7b53ec36cd2a9cd9935edee6d7baf35a37fb7b0b7ba6d3f9dded1afdc8984655297296b5a60711e71118276f7fce2cecf8ac0ec3f2daac8fce2f26baa1e58bf235b70c7fc51d3b2d75ed0bcfee6de6d8ce21a07c23feab3b72dff5bb6fcdbdf514a6f0351dfbdeb049d67e81eba6f553a18fba6a17df66efe9828ee90dd5e7e7f1c2d83944fa7339bda9c9ed2329a928dc5bb0e95f24a9fc7c6da4908673d7477f35b0651dc318862ee4e7516c5fccd34f8abf9f8b2cee7117a0f20d60419bfdb6fa05ff68d6e5bd885f2af5be1a40c07b383ddc14e1a16b34cfc4fa5ec94383203d247660116b38f69d9b1cb7e663f79268b6bfa3d208d5cc8b2ef80c4a99f65f2c826cb6e9a023eeefc6c0ad1cd46b9c5cd68d0d9ac9cf1bad2ca19427724c09556cee0b99ae62c6696fe1c222ffd06a37f4e9820eefe946abea83071e0f391f0b8245072c59dd73150831416a5bf4c5110a5f2024543946a94a12a55e37e774cb640c4514e0b4424c91ff29e84c81a334ca56a9d9f85291655b3e7cf98273a57b54fa1d5cf40219ebd9065387503b79b81a65b25ceac3703b72b4f42b4fae14be6b10ed4e7fa73934371cd383959398ee393909827a56cacc2c0fccbe71ee4418283790e868379eebfe7fa24e48381796e7630a0bc1fcc73200cc8c91d293b5058aeeb9c6b68af3ce92e96c5edf9fa77903fb753033bde4cf97de18d0916dce1fe738df31b136890361eeb19771dba87ebefa715604013626d13247673630a6f58ccc176af6d5f573c932571e4b5997226466e3d2e4d74dc981fbb76bde21a9e5e354fed26ecdf2bae691677cfe9c78e72573110012fcce7781850043f1ba6c0fdf75f384eee79de989fa71494c43cd75c37b98b79980e86d5abe661d13f06877102f52a2694d5a5637193b3bdea6259ec7280f37a914fe19a9e3261d3886bbaf7ea115d222869c04a2b65f05829a3c96d5771dde5763cf7ce361348f4e12cf7b5637dcfcd9390979fab995383c431bdffb441d6c0bc8f16072567b8473d0cd852e4be8252fee0fe03b90741eeffbbdc9bb86902774c9fe9fbbee72c38daaf5f9f3b791f0f9047f849985a4324f3c28423f7dfbff071a72a8573b111c770fc040a6ab9abfaf300390b8bfe20c84a3ce3ef2cc2c0bc0c5ce35fc1796143adcf4e71292a2a72248fc5b826e66d1e298b2f718de7498ec5955ccb75f698c7fc8a1f31cc0b12bfa637f25d53f830b0c882e9bf10c94c810b59bcf1338ad02703d78cf56560f17b41b2187325dc29c28e1ecbe231988f09633ce30fb3c4eaf8d37ba62f8acb75b894eb93c8fe4e117694598a5e908145ff23f31e095fb07f645e9fe2456de3ad50b268fd67d083fc2027713a7d839c6c86f40c5fc1c52cfaecc5ef8ee2f7779c43903201dceb481c1964e64c2cf3073f3fff0e89c39fea70fcaaffc98bb87054cd8965e6cc2cf2073fa34e341cfb0ae1f210a40f7e06d03084cbcfef42dfdcd0d088292b29d0ed9f43fa39e05399e809c63ca66a3e6b24c7cce9b36a9e4a79d51826e5a10c8bed2308801f1e3130aa971d3a523970dc40d9a8e1623fefd471a6ad6a19953ea40fde72a1f40761660e99d90b9924d8e7ae29ef25fef6cb1b4056d6fa524ad397325489eb460a5b4416cd391b15c6e0b70818d69f36601e24e468e9fb7338f64bea0dde5cb15dcb9af0a5057f2945cf1481937ca78c8cf4314f3ba1f4c9dc73929b1dc7552957e09ab10ee1b8a700d7f4739f01b649f50cf795e338ce4a4d9bda12425762b9122603a2cbcd530deba88d40ee04427b329534abefb78663128e7ba9b9a0603210baa309977bce06e19a476148a79aeb2a4ac571ea72cf52d619d6b96da6df7e08c769e1a7248b966bb4e71e2565b8f085b9ca963829234187a16d707cd6bdc4014e39d37f03947206054a1f4d7f25716a3c837c995ddaeff04ffef9d399dfa341dad89ec9240e3adc8c99b3af5a9859964279cafcd40ea5ba4dab3fa769b2878d47e2b7c61bf96e8df0ed370bded70891cc6b231c5fe0d732c7327dbc9fd49988a59c8ebe1abcaaa770acd64638da1aa10d8f562b0feca4d8ab6656c71d8e342f48fcce37f2dd195a16bc9f2192797d58cc3e94fc5cad47d851f4b2a7c9fe270db72b072bf22ac86583faec99d5c34ea670cd48c3415cc396ae524496a500618e72bdec51600b3d233df0468afd423ffd4440536e363df0a6b728163683293783cd80e86674c5351236b4c4d373b3e74c5d3393fad9b7e92484c30c4ceacdb2c6f32a7be6e19afe5ecaef6b84342cce30032c661f844fe03c35d8692e2e2f6143ae3b4e974fd7152959248c886bb20c86ef8402a1a0fe038fcceb851f6031fbe993c1d036b50bc76a3b0b6598010dc6308f63ac703c73f825d736b77f849138e47b3773b2e799c3f53b9638b2abf98fae7ad9cc7238e6a81abff34bfe66e670d49e567e5a2b8731fcd55ebb5aad21cb1722d9fb67dc2ffdb951bb9987a2cccb6f2d683a1020344382a0e034b3c64e4f7ad2fbbc18961df2a37783802844e1f93dbae7f39c5f4f60d9f93c7bce39b9f9ddddddbd08c71476945380d85194455acfe5176da6ce08e4f20f9939f5f91d3073b217ca724dcf9773181cdc8f5ef7a3c4a15f7fe430c798e3ce530aaa97cde6b6028b3fe86b60cb1f54ced0f1841ba74b7f985eca1f63fdf92fd4d7be8507cc6b0a297002cbd63086bff4eb4e01ae11b9258d9b8de1a5af71590c46e6961b0392ec9afe085f23275c5308b2df12a4ee91d47df1d532e02bb0b8820dd7020cb0d94f6eac571bb390022b50806be4157b8859604904ddecf9be44d92b8383c5b02486523c2347f90db2fcd4cdc2135832216732fc50e585fd9b65af8b84af91a9e54a9c1890d44bff4876fb6968446ed9723dc4c0aa68fe9097059c195cbf94b9c1469972fd774c2676b4451749df76dd51be86eefc2012c788c6c44a5894a01be505774810e204c28a5c33569ad70dd7d021395cfa2b708d8d4bbf073d22e9d21a098bc2ba9406e98cdded64288f513d0623da35a25d4a4323b389702bc14d2624ca7b1382a030648576ea8130f44c215c57a5ac7286c913a467fa534d9d6a4c3fcba6c68365b31471e1033fd88ec5ae4082f09bc0b1b6444dd9d0e8d4a4cb4fc6953023b2c0fc45026684d19d4610c18c68220acc88206046f818b1ba57c28a10e3ce2e8a30ba4056c28a20821521a588a1092b22e8026ca5bbdbb960b6c2566a732166368bb1952b4b3a58e28a15cabac110605c665929d2c339469fc652379c05c905435cce6285ab7477d7e65877375be9eed67a3617dddd6c45e418101b312a61140112ebee662ebabb99ada06a73acbb9babf00ebabb97eefcae4443b0e0f292b7154ec282022592625986d0214bac56af5b64995dad565ad48ed58ec19a494f0fb0584a4a21a5f88ea2a8a14a2604042b22138a396f21635c0e9cf889c5843889a11d8462ce5b509f69831ff0501fa2ef062ac09044b5b74021a087293f406dc134300d9d060dab2a4a47519828c5625e243d89c5a4962a048f0e524bcc47538193267ce8d39bcc665b2cf94c81c3fc627ee156543154a5835c387cd141312a34a190220a2a0433c20e5c4c5811b008c8c3862c5168617ac92fa8b8c1f4a232937c088d293329a692b982054414511dd1ea6ab53aa2d1dca0d92269c302450649315ee22b5384e0a523745222bf5aadb48075622ce1032c268b3c27ae3264514c46e522025211992d5203a862c41645525bf4ec22a28e29620c895d1523aa1c51a4932f3fc2bce2237ec477508f68da962d5bea0d73ce89a4b96672d85316a9e0397111e1ce29b96676737ac8244c807429dda574e9d2a5942c5b35095621aefd03aa6f9ad4b42a650d5f340a4a1f1ebaa0abb24a2965e7dded1a77a9c5b778ee8ec9b2120645e94e17e60fbc021fa38fc0230646f5b243472a078e1b281b355cece79d3aceb4552da3deac04926603ceb60d1657b6907d106e300ba534c028a75898adffa23dedee0e972051c317edb550a629a5d49f9999999fc98d0eff92194c4108c1440f2d880207403a337898ea99f9b667a6bbbbbb3b874b24bbad3d33bbbbbbfb99dce874b824943dc349289b78e0264f1170724a512b88677574458aeba7895216d894282d160fd2d14b8a939f252523184d0f2cb409ff844d89d27296f3201dbda4b493fe59523282094561561212d16b024d275a9664cc08a6059643962cc27a4e981dacf742241b93dcaf074e4a0772275a9662464342edd33d58928a88821888575aaec45c43b3c9f4c95264880c4c0bec9cf4098ee3642853e026f764cfa50f49f34da316e964cfa50f981daca4cc6136d99b2fff8af30cf2adc0e075fbdf45c7dffe5cb264118a119a5c69a508ae22f4ccf6eeeeee99f967b36a63e5ce76e8534682931b6892a5be2a9d62bf60483cc3af7ef52b868771cea9d266bfd3939069599cad1df9383d49e2cccb3f4e20dc371ef53750e138af4be8e2e22254039cd705e42146628a144e028582b1603018cb867571b1d65a171717175be3c4828bb5a87779948bb56fad9dd782ecc338b418887f18052e2e3640be355a3cad568bc73b597b3a9d4ed6dab7f6f4ce823d9d5cdebe8b0d4fa753d23d8113cbf401cf549a3fb0762269abb9d256da4a5b7ddde9d4755d773a9dba77164e5d67fff4f6148ef3765d47f4154d298e62b049c5e9f4817cbdd80cb1584c8b69ebba6ddbb6aeebbaed9d856edb4edffda90bb76d3305cd17dcf95266105d9709c99009654299d01257b7add65ab76ddbea3b0b5bad5bad5ae6ad5ae6ea8c9fe93359686c9b09e4cb65ac234a99d7eaee5e6bf5d38985eabe7dfdad86a37bd65594b020eda0d2a3b6e17e60983932656d376bd49d524addfddde93b0b4e69f550520a840231c09ddf30a1a216d0a5913ef8722f9d44999ca079cd1c936bfe68a674c2b8ec9461309f58a061e51a2a2f653ee27eb8fd314058fef96372d13b5f46e8764b7362c70a3b8a57d5a5bae9959d566fec2b55f49d33d21f9ee91c29cea7e009529c6f72b54d03e4cccce93755711b07afdbf4391e9d3b9d3777fe8e15dc8f7760ce1eb06099c1956b2f7fb7f4d192c54a43d3b2f2f3bfe6d1cdaa33e52692eeec7759fee9c5f5a732675e993f1c87fe7c1816d89714ea95e3114d9c619dff42a43e7f0d3b163bd5a20c8b0eca1ffeee3f72f8313ed85eb9f896c1795966effea9ce9ca9532a5dc6b52b9c9419bba33bdb69a6d5cdc47527ef7b5dbf9c4b0d1ba81b3872a474ec7851c1c4f0e0ffcb819d374f8963fa93f7dfdb1afeee391b02bc748dda95b1fee9194adb68fea02d9f6b576ce6744242b19e5dab87c5237dd037f92c913f3a21a0ee864bbf13d2625a4cbbc2363d4ae89e006017d401752b9ea12b7eb5be980f7d01f8ef2be13f2e168bc53e99ffb8a5a50f00ff712e97cbf585ff7146461ff81ff7f37ddff7ff7143431f8fff4c4b4b4b4b5fcc7f5c930fe63f532c168b7daaff4c4a4adfcb7f2697cbe5fa76fc673232fa74fc67faf9beef4bfd671a1afa72fcb72d2d2d2d7d38fe3335f9be1bff6db1582cf6a1fedb94943e1bff6d2e97cbf5d5f86f339a3fa8d1e7f2dff6f3f37ddffcefdb86be1a8bc5624a5f55faec7f0f431189c3b95caeef5b609beaea196af455a3effb5ef2cf577fbed37ffddfd0b7f42d7ddf9bead0f7694bdf579b7c5f0927215f0056b1125e603f99d8522c165bbaf441007821e732e25c9c8b73195dfa0f9e9efbe186b81fee87fbe1862e7d1e3cba9825aec9d2d212d7e4d28f81e15431a5582ca674e9c3bc9876985c462e97cbe8d257e9d852a61fd3d067fa31997e3cd3cfd0a5ff92a3e2d8964c4dbea55f3235b9f477dcd0505b6c53da62a62d1653baf475d8c86a6caecd68736daecdb5195dfa299717587a476dcaf6b30d6d3fdbcff6b30d5dfa9c05bf9fa9effbc2203556956aacc66aac2a5dfa9603b9df72704080b88c5c2e9711df130e5a7fea50fda93ff5a70e5dfa7dc3b5db2e2d367fd0e73eb06b75411deb0476afb6e97ab49813d8a54d8a342b973e8c0e76ac4b75896bb4b0cd00bee3e16e7b0f621b2de6516e007ef42101fce852aef70ec435e27bef2f90399a920771bd7727120700efbdafd8466bb59cd5721fffd1c2357f86ccd18a8ad0589238e115b6d1582c241616ef3bc635e07bdf55648ea6f50eaef76d247178bcf7ed629b2ceb57d64559c3aef73dc435aaf7be959039da12d7fb16923831ef654545eda4a8833c98f7be5320733224a45ec1f5be7b24ce4b16b6c95aada556af5acdc2c2352920c89c8c88688c2489b3630adb642c23d615a422aed15185ccc982826c70bd67228993e33d9a942494e4f250ef3d0b2173321e86c1f59e81240e8ef79e79d8861615714f11377172bd1b4990391409698b168963e3886d68ab95d4cad25aba5e0d2e640e2522e2414ce2b848611bca6211b1a678df7b3f9990393468fea04134b8decf218963dffbf9c3369e943481925a9ee977b8de4f1d640ee539c2365ed433f4b5781f0299e348d347e270ef795f44e274923df2be05b6f156cf50ef89c81c279a3fe8b34c18815c8fb5c2108953df1b05703d2fc9f3c6ee5b82ccf120ef2bdb7452cfd0f7de658ef3cc1ff4bdf73ec74988f7baa216d39404106ab100845aac84508bc9844a973e00629cd8efb55691d67aad5574e9db083d506369411aeb592c2de8d2afc1e3a44ad278925449491acfa5ef12d3c1142115a98a8a902e7dfbc2a5b216512a6b115dfadf0e938e8c9505a53256c6ca822e7d2fc7864aca78925049a7a48ce7d23fe1a8378a90bc22545111d2a5dfd9d06ab488bc70ec802e6db55a44973ee7927d9415f463ca0b4d969a3c89f27892277912e5e9cb39b17e476d8a172115151521ddfeb98523904b81b4885aad16d1a55ded6e9115e42c67392be8d2afa0bfb6b4ad34eae1a812402780139199cb3d985d0653f6d52a7691b1217dd8981f6c5fb9f457abd50d8bf43fd003512cd274af0e5f7da58f1a896bf8554bb589b6a42d694bb5890e6d639b0158540a9c472cd2ef014e249ea1496d53979c67e6705a52d62e255dfa92d372a9f35cfaaeea7858a45f97daa66331a765e67434c81ff429502a657bb584d3d9207dd01fb93452e0eb61b7923ee8c7fc60fdbbeed509ed6853b866b49a91066bd0a2d866e629fd97e1b4ce04d2dbaeb6b16d3473bad7fc419f76ab9ea16f6d53a35aada5ef815058af33f3dca9a528454ece644fbf7b4d0a9375af4bdf74daf9cb2f2f7fd675b37bae031f0c6f28130004c2342bfa3b52d811caccd7af7fc3559e2d2bf5fafd6ee0346291fe00c019e3193af6b8f4eb0c98e2194ae93328b248697c566d83e219fa62f5d5a51df67b7724c3467050c2c9dd71254c89d595f33316fe4e963a29abd24127e79434475072410c0f32e329cbe57772fdfa159fd4096d72af1065deb475b813fbc54dd4afca53eacceeb1af9c9162e7c8e97f4f7e3a65c98078ecbeb9bdd56dab3625cab6e99b1b9a16c5cb55fb1ac682744fc100ef47134cf87e94af125c2605ee00c0b378ba9206a31ea824ad9745390919a211000000008315000028100c0744229158248c74412e1f14000e7a92406c569fca635190c32008621042041045000000200346608cc60a396c9b43a44cbe70f88686d2de81076bcb0b0e6e245b9e1e412c1dbf52b31a183b0774489396e2973d46e21c2ae47b3a7ced1fa887b14a82867171d0a5948e5b08a0f7752802ca2c17460b3b60374220242b20a773c5d64d5c405114619c4cb15e0697b6a2973843c39d0be8f33abceaff959e6b780a36bb078ce01a5e03f4eb11d5efdf1a22052ec6a17b369854043e53d7ff942e8360ccb8005b378b3dfcdd9151b39981b181c9e94601cebf6cc32ac543b84716f87d0d5f796a83eba8dea710427aaa1bfda5f771398454eb478881bb262fc454cc84d7c0ff4987d1fb27625018dce7671f32f56e4047236916b9f42912c754c29ff7f0d557634d64376a0633cf222d1c14ab9633fcb6951dcd3c007d94f9b88595e179fbea5d838f4c537d067166a0e7d8e03434e1bfcaf2e91fe0d97d2f461dec8a40cd2f48255eda6875cd670aefa802dccedc1b56ba3c3a369569249bfdb410d3f48fa006144680bbb3ab6a9205f449c501b26c2e43a0225d8829f432f459e6e4a7d86f1d65c84cbacceddb9bc726b7ce0f7036ec1fc0719439f073385ce5bf87c306db721f6084659032c094f374bfb41649be002768ad030cb8cd2694a712be921770a17d5449229158412b6eaaf0edef4614ca8c5432b4337ebf988b3f366ffd06487dc8fd1dfb45ec9f2d95787326ac5289eca580665b80ca115d2b6a3ea3f873a577869ed9bff201446c945985ddd0cb771fbf286a5aa31cad75442e086ce823a6b0f1abf5153a598ad525199da4094ebc6adbf5941d6814b9df1069c8151704020761b587ac236966b27e69dcaf4be1c01fca159b0145783a8b31bf0c63f4fde8900b13f3ac88925c06b2546488879b60bf7f82e108865eb121fbddd89237f5d412315181a90a12b6f6ae013a36e44befd8a460bfda5131bd538614a32911d013031a11fae955b5e0e0832d40ed316112cb2dac56b29f443e27c1a3530725ebd96d4162f5c8db0942671725bb5b4c999c53eec352cbc607f3f38df19ed9e7a95b7aa5d0b687a89c8736ad980298986dbe5542bd0b0c7c1351ec475135a12b31ec46773aaa51ee98b32d45708d6733d7e58c1392110e90d0570441ecd8296f526e78c29af30a2054fd5b94d2e5c2a9352ec7af37b6867ee8044a4e34ede073e2d7c618795c15b693328360e3453b49808b27785ee4ea13f7b0dd400771137eec0c6de7580095e9224882911887bdda5317dec0146df1850b6d54b7ff402c3082289938c83d4e94c30bbcbda41a52d24d70fd840ddcea43856784667253740ec36ed676c8eb33205c0781e8d04b0e9dd17f42ddc5ebde8ffb7617fdf2eb4eaae0f3a4a1c47c4af44081c042fe48570d479f6e6890dbde4edc07a71764102a7dd959ee83b1c668d2459d91f060f84b3bd45c9eb702fd69548bb58c92ec5dc0bce431511f20479ea9aa3ac1e7e1ce9618b67f17db4b2717bff46a5a819e755e809394f48fe2416eea58f52a91494ebf419a9f65207a8334a7e696a3ea2b8a2165877ba9ccb6c95238ad5bf01c365b80a735c101330c6387d1d131beeca6de77064b4b63674cbd8ac5c443345b60a741b45875d1dcfe6a94f027c6271e80a2215d380e6ab7a3595a307e684346e0eb1979fdb02bc5b644fb3762a37a8ce68870c7cae6fdb53ddeab1e893af921c2b97363374f573990c32fef5c2ce6e82b71012da1dd0dc41849e5b28499f8f66a732ee5c65ec93caedbf62e053158782fe7329ad61db6145131d546e437b06513709d71067a715612645a49381480e102cf8c0e9a67ad90c378b6ab814c2ecd00a36fdabc11c0bb6893f00caa394c6d25e17a99e16e659f42d594157523d74b9b384dc6122070aa2343a8db75ee1c50894a12953c814b3bde678d32832a04f272ad43284799238aa3e61085a2743885894a2d7428747ae83047541ca424ca0e51142547298e92a34e995df440365a258f5447c4c0b84da40a563a917a631d045e008bcf6c1a915d57c385aefd831b4869fb482086a6ac4715f6749842ee344061ddcf1a710460ca1d22ce6e193de4475bf4fe051c31bdf1a85cb8c1ee8e27789c79ed4674a9b8512cb801e8386fcb4ec5d55c8192c6fdb46da93d28b2a197106d25e49ba969749aa5c60c06c50a914bdd078f70421af0c7f060a3cbec5f35fee40b9e133b15a2d510456d701f44962ac0f707eac89fc27c32987b3c1ce3068f07b09924acedc6a800c0eae2bb361973eac44a6c43d683c69ccc4bd5f93aab98a26650d53ce685fb4a98275e52b9fd2d4bf54ed297e2ca26efd8d8be5fe3ef53921aa7e918f31fe3453822cc12d952d350b41e56eabe6b0d564f685593c145f42f7761f4f953e0c754ca1cfffb8c8671218bca83f4179cfa0f47fdc7654656541efeefc3916d516de5df685c3f2ef5bf90050745451c7ec55379667ed70aad0da613b49ab8f1675561b2a848df2fb34d5c5105b9bf2d52ff78d4ff78be485179705e3d7aaab6145d5179c77f8d53ff78d4ff78be488acac3fd7d70d92caaadf88dc6edc752f717f8e15854c4d1af782dc9cc7789a2bd613e8776833b115a75181615e9f7cb5613525441ce6f45da3f1cb51f9f600c57eeb9c10780f7a252e17e5da67f51d4fef3ba9b16958afffd48512c2a4ff197b1eb1f87ce0f348db6a2f21c73a0adac45b565ebfe30fb65ffa28cf3cd4b27cea72e139121a2dbfbcd8d40f4aa0dbc81b5ceec9907d85b0dcc6a5135d9ed3600b64244dad1516381c38bea90019a06237b9634f4a244de3099141509d6055b96a45e945da84fe08aea74d436b6a8541508726783271d4c057f3b02deb7f1909c63e622bfe495eb16151168761497bf7b4a6591224588e22ed8ae598141a5fcd84f5aa96c1dce99aa1528fc79c4bbde2b5772a6351061f84d545c9429d7eb7ba1e0cffcb58e49b9de82515d3b719c5e7addf31618edb556b5c8d7f70a148e69464574f890661e43c687c73307cac3c29415d75ba201610281a717f616f564483f28c2a5c6ea02fc6df8cd359be7b69ea9010cc82c0ec06d89d1c86c15e7b5b99a5ff793fcf0dd2440f92ba453ac2eb25c99cac9352de793095c34f3fc0612920d145cd6d3e0061167c1183acdf1a740211f56b5ae763a64c74eb0f0a7e918a981d52598bf8ac2d2cd601ff8396f78855715c53842c355295198b6f94520ea7c437336b650a92582360f1dccc977591f053221d2ce8b115ad892e8fe10f42a5a8a9525921065836218bd4ac765207563614afd1c2204996827a369249e0dc65ea57e7f23aa6d6742a5240cd52d0ca05d6aeb4d682008aa66c816f8c7a91293ef5a0c5b1d0bda79b002648abb3c89a44ddf58c8ed8aecf447eb647effba4509eaa9b5ed38faa458716a938915a7b64cfb47e6478ec53b8326480b7a175bdc5ab14b389d0f098191798c6ee39721d53a496b6ecf22035eab5f40845529cef2000efdd9b72ba084f01219d773776ba2f9d00089be1140583ac92c3210c541080dec0f5a61697d0f47c2b2f848cbdf370ad9828e9067588c22522e7c973ef58568bb2cf66cb1f0f67133726e160e498c8af31278ac6ddf0fff4f1b3b0e109ce666d968dfb34cc5446c0cfdcc5bfd43f8c1d492890ab864e3053a6ba1852d25e36232bf0daa13639c2566134e37571b611826103d6f2d58881e458ca9b8f1e74873b9ab7240d1c5e4961be6e0493bc4c57a8b80dca9ed77de9efdd624e00b9d9a0568a071bbfd8a33209d7f78a36011b0971e1cd7284151a1e0151adf34f72e5b96bb078bd4798f27745a0d837fd0642c442c311c40f2b0b0cf0c00a30da3da91b151b480720b502e2134c6c009199d532ee78a2d574565fa91b453ab2b4d1dc1f7e1845ce931637d7696c705e39c42207110b4301acef101c7c53a898b00619f89f9b2e8da3df105e4b27febf78b4784bafefc7c47ac8f7c730662e88fd10b132e9800c84cba879a7701033b69cbfba55ad5255851bedacaa3f4e1a2c3949e6dc7ef8d5b2184e7985932a11d1851c91c9cedec89396b4707b4e6cd55a335666d5026c4d296f74bb55ad1b5c690b60ef67aaf6a92cbafe4c2b07ea00c7d4c836bf887fdd55c7f7cba2beaedc3c8daab2f03c81cfc9d7f823e8dea10be7e7e2c8d5798a0886bf45d15c46c188eab8108603996b5ff6a70b179864a5efcc386da3586072db006f37f31b30c65a0bf72dc6a75157fcce9b810c3d0ff457a89271b68437c1b12d559b3a1cace7ad2776a184d3e82f408d22a5fb5003117e69b2d3bd5a817e63426d0c60a90ba24f8e95aaf3baf9b9d3bb1be34673bdcab5ea8e9a3b6bd5fd06ce045931cce037fee7a7447cac52c420c640e6c53b6409d2c29e536ba1bd0209c32d42d20af7fabf6303c83fd97faf441d0a73879414e1c3d37ae0b6d49a26b152e58f8bd36b0c56497642b56fed208f5709d67bcd649247060ca75bce788fae9beccb6d0befa1f53530839793053a6b06dd0ea75b6d0a819d51a4725a91f04f4d8fbd70da84e300d091db3351be53e6df38b403477e03969a588bcd1816d24cf4c81c17381fd43e144023ce0dbc4a06107eea78183cfd27a637f6bce077cd01cfc62f799cde1acdddb873cc8a94c629d96437fa07c1e826ff1bf46e2a5394b9cc7985ba98743f42c88d52de752bfa14281f19e51fca9c43b2e9bdb7c9910b9d8d2a1a2fd3e639a04055c3e7d1dab5232d8555902914d1fc61cac40e9ca2460e877ec5b9252f820de443e652d102e7de6f4778c1f8fe31855098d5b14b5203ad757ccff5fb477d4831b6452bb6764b3a0e50884b8e6e3d8eb0361862d6d602e62508ab78b4d572059fcc91ce2371e01c7882ecae1d6b589fe51609f7585eeeb52bb4421fea71b82d33ef483cf8940667199b5865867021091a502cd767c298b492f93375574b2555eea001bbe149a542969d9c1d8b4977793607bd8bd849754670f305c7bb69de29e6e780e3c173b0a03f4f620665b6190cb50c5cb726d40f654155befc7a9d584aff6d9906e5dac24950733072c9bb55c503a68ee044a04e4c88be5d26264967beb7c47cfb56d1ea97e1c2f6feb72d9fa89e8ccacc70722d4d3e63b36dca6caf4cde8bde3a40cd9f0e424ee1d405713c62160d1962b43d21bcca5410f2e96dc9408906cabaacc18dedfcacf3fe217412ddd7e4f47d746c2401255cd6a074cdb73d66da5155064c6737c2ab23b64615e914f1ffb093d3963df69f56bd47584702911edc157adc2a6464cda4f97f6e1e7fe28943cec0b62bd1fa42cf9ff4669bb7deced25035c1c8720451d4b7f064f99d316ab9493ac6e669bd2b044a033fe5639089d0d9126ebea8a7c0f34f9987356dad26927eeb981901482692e86656c8e5f31d5ccacaae596b84cb5cda274ade50b25e2825f215ebfdb082d382719dce133dcfab6060e3767155209447056ed300de6653ee75b2597c91528da9d089912a0fa3f097920371808bca7fd24ca43a48d451f33aca027697c5f10d9651af57f1f191044afc7dee11696c1803692cf6e2441db0606ade1afa2abd2369aabf71c96cee885ea80f2f3cc54146551c4a50ead1c7c2e59ffcb937aabd5715729bf5eda9bf94193868260bf3da06cce38315d2f9740ca7553c53ac8e9c608311db694c8aee8bc8833d2998556b64e8e08adc8b5b02c9592452ba5040100302c54a6dd6a1b8e976c8495274f3441a72488a4c4f1317f59219a50b3989b9d9e36970275accd3857560426bf88bd0af76e05e79c0f24dbe277a8baf9d58d8e80886bd90adeb818b70aa01c0fc3800915bfb7b327d9d217d7a4abdb4414d9758ceef7dc89f1f4e8fa3129e703299e3ed25112429a71dc962a91693c38165fac72519132a086fbb987620f97d8f32c225e126555658de2a3feca2ef04ad0ed90ffc9921f93111390fc0f4a4dabbe7d44395298a61fd349456da444cd11b83ed49bd0e264102db39cdf5719ecac8cf4c11e9d66b09f99c2126cbcb0f48d9ec5b6133ec61ab92809dcc74b501e9ae553b4b5a6cbe4b07b10043f1d7cf8580ad40e3bdf2ae230f0aa0561ed07f19a391c014bd264c71d109ed406f276c444b9d3945ac8704b990b780fd7f6ad126535b73e240f711a4111cd509df1692556c103d15e8383dfe99d92d8d431d24ddbb3736ab4cd467a6e7005fcbb23ef6dcf5883f14da4085167b20c63563ff84e09afcf7c0082e0b7dee7e3ea09e113efbea91c4516e25e91249c2fcd9fab9909236120c07ad0e8ad8cf550e8847b46631ef520eb95b75bbe0720e97c8c77df98620a07cfd000dcaefd2cba936fbe3e7117e1b1c4c91a719cb44c54eacbeecf951ff7611602124c4b0f46b006860901bc4d23b1bed6168200bee060203f1e4aea226a4779d31db23c20ca1ca9a1c8296feca415404d44db15259977ecc41bfc65fec8fbaa0312b4c57d9df14f58a6c5e4496576fdc56a147dc6fa03bb9ab9861263af8ad34bb29c12307baeff46e4abeeb11e5b14ceac13864758f2913e38519397e7e762aca5944e139df1ea7f616552c1488fb2e01aa10044674845830a6064ccca0975b61dce5535b68a7cce9d18f1a6480ebfc2050373e72113b9f9574f4c1c1c9d028190ca892ce4beab9e476e9f409e87c1ff0a0ede3705ed938179d7b4f9e8f179df6b3c644e33e2346cbe9cda1c7635429d8163165338c55853bbb8372ae888bfdfb0b444eacd40ebc8cce41e66c8d3150f90d3659e2e62b8e7fd2a5216a70f9504e8677d310e35b3d75e19658cccc3632e97e69e5c0ad359ab2c9776cba6b322b37467e7d1dc40a395eee0a581d9e4a7063475a28cb5e297b63856183767334c3f4d021b3084deb668a9a41b8df72520b850b7b3da01287d638e251d00d3a3f7ad26b60b601c6192bac704c87af30ead40b3e22cd5a709b5ad2a3cb29c04feb2f5776049670353df636cb138a8a7b67e7c8402fd56c4524d4792c5ebf03a153920085805d5b88809d48113ccfb1131c8247fb599917bec70508e6269fbb3b3dedbe6f3595d13b4f68f4751a7244571e7612f559bfdc2fb96374f84d2b77c0d5080e89b961b9cc6da1b0084982ace1fcd92f02d1bd26c2c18f4b9de2b5bf5b1d7f07dcf0e88dd4375af93f455580c11bfeb9d5f59829c488e385fc62afcf08b822ad64734733af34ae39f910ee3d645896e63ebc19f44ac0b10eec374733a7e2d4aab8c14bc072ff8f28c86721d04178fa1317b2e43b9a2c46e1c988fff4283db2924ae3f4ad001ab99042470089c4184880b502d8993c89d9fff2b137f8c61cda3eb06b0f609b4709a64d078174e2af5987552c3f9ed7d788bd2b7a5e3d7d4fd5482ff3564d15c4bf8786d159bb8fa4800d26ac50495521992ad26a06f630dab9e3a2e98b2290772c18ec3600534d272b1f49dc08fda7465e8624b4f3a661b79aa1a1e855cab64c56cfeaeabd83a5e10f9be303187abad554803ceac4b43f540d246d47b8e3d300183022bed63cfbabb5df71d8b1d32c680c4f45d322ef99325ebaa55dee96c5f1f602cf538876111f7f141449049d14fd5109aedb8853d45bbbcd37a3a2733f8a2a022046f54031b65e0e397f4361dbbaaccce54697f11ad97167789e3457d4c98aa9bb51739c51c9c9e6299cd40a6ad4ab65971602044b8a11065d3775e45fd9ce86e6dddc0aac6ef0311bfc9e0b7df9a5895919077f5ce836e90acc2e26b967fa4280ba54021b0eebf3382d3ddb040a0cb5d11f491adbb3f0fa865b3600b5e815e674a430dfd36b27e007c29120913167d43ce057a7d491377681e9d735ffa97630b8a6040491d383d9fc1489a9b5ca44c8dfe11df820b2a38c3b8b35e0fa93c9e7ae4e99df1f79fb5ab20680cbf4471b655b23e8ff3eab9fd0053fce3daddd099e783b13ca8e5565c0e0ee19c2e6b4c35ea2595427380991053f4193b8fe62bd75136d4825d6a2fdfacd2562bad1f0cf8b6664341b21dd5fb5bd2ab90c854e763e60d89e737734de7268b4f8cd6008467f8413fb1d57a3239773b665439668752a7c9c6a6e68300a4d6652ec393332ec0ade850100066e23fec973ccfae68abf50436b8d644b1a70663bec7c03fc55ee21715e92921c0a647e742591b2c72ec8974654d6563070e5307cae042bb6b979125c6b281152299c5de9cad4084c2a723a53165a1f03d8ea985710e0e388984c565c1e7feae4ebfc2f97a3324d6d68991720a787e303919e21aa82816d9b640d2089904912fc112d671c790d92425504121c3b58feb8c0030a1ee819a60eb9b6f7bb20a00dfa10ec9f0165786a7cd8183e2b0ee8187a63ada723ca77d103b32e610ff6cd53777afcef912baeda363f4387e33cb8749ef16d9c2d779678a9b3ca854430ec7d2c5515286f51ba4ea63a012a677f1f27497485a548b5f02cfe354ec9c0b4e7c9f0df26f57586ff8bf6dd9d75edc076aef8bee68127ad43f43aac3faec206912a3e84fd2dfc0cc81ba38f4f7add157ef6f4af908ac4176c9fb7b3da673fc38ab9e25eb2501a20a021fdea7a32b8fd0a07b65b8485de2ddd0e6b67be70069a8fbab8bc79db9a002d07ba64f8686538e1a4ea0db08abbd3f8f658d50c1c97849d77f63bc7478e781486f01b801401e129b34ca403057039c843e43e8b97575b029291c5c9ae88a21b6d886b3678f47542b3d216a05507b83edfb3f737ea4ff359d1cc44fd1312d269d056cbb28589d5ef5ea8201fff2ad3ca2c59193b5c331467b401f83f3abe895103fd7033b78460ed58ff3b882b0460948cbd4ebc6c9ed74f4540b64fe33fbd661fddf351dcf75de1e6408b084b357288f80e5d9b3e0960a40ecc4a6870061128026ee082c1620f8fc44d7abf7b4bccc13e9c23393f299599acfc8eee1a2de67854f7ae399b5aca2684bbca8a59c87cbeae69a7b2cc1ea1075cb5cb14ab70036602158dd9f7f771e08022c56f1a6a55191ac9eac2a92d2e134adddc9e00395ac5dab21bc5b8601baebb0bb159bd5ef5cb2bca261fbf654a92481f759d1dc2095e81f4c33b0ff9ef06647b53802f6e81d9a058fb8246b24e45643bb4a0baf13631a77423fe7d4279e232ed3c20e34fde8d9f7e4e79850971d015baaacee019692c9166eca022dce99f58e1cb6ac9f44622d2636ec0384a8b6fc22db7570108b63b23e54872d0d4ff118eba615e29779ec04d34f69b93c33d6361311d0fdf011fefd70007fe8a0e2719781071cf65d5f57e448dafca4e18173be49f274d83121b05465f2597f1bc0b15d59bede9bf0f7d93fddc08a4703d46016c80bb3e3aa0271915843019ed0fadab4121f73f9452036c0b879e583412809fa967e56038c0f15d0d740bf232aa338e412f9219b82017610ab555fc7520e48ed4262d8fa59f8897d4f2a7207841321c0c3d67c3176228854e8563d6e1979102107947b95ea0a4cde5b8f6df5a8d76ee82796117083ac4fffe007eaf079549bdd60975695add0052a14e3683d93ee26f4d885baba61c09124d43fb4dc89234bd3c3e6163372fe5e527d0e4e16030f5713cad57b0a35885e1a971668782b524d75cfb01e05bca51877e24b1ad2f692b60bb2e79e2263c934d89458538a9890b8c47a86cb5905ff8489165efa3726c049c980a41240c52386fc4752317724ee4567101793b5a082c9c2f1a71eb0360f908e7a216aabc5d448420a30a2aa073c16718b60f5388d77381807d60a1a00b6d45bbb2cc8286975976f8d0260110523fcfffdf74377db5f4954c810fc9cb9fe9e315c0187001ec622bdebb6d1061efda536d4ca4d61f6e0500eb865864dd5f7e84e232c9c506c612ff55e839a7a07860bb79707bb76c181d039f78513875296ec3fb72213d3c32bd30200aed850ac92da8cdd78e0a26117fb404493d2f453d77de9c48c54468be339ba3c6a86223061d52df98eb95e024949150507a738fd9bed2990762b03ffe5c5a916eb3c130245be0c30f04c083462ddc676254baf971e0c446a53f8467fe5511a0d52f30484d66aa1766bc186be94fab22f37ef6e84481e3640f7c20375098acdb69151185ffad0e6767661bf80f148d5204a5f2ce5e0357e196428b57d79695e03bd16307fa85cb591e077ceb9cb0e92b859d5857fef8799728a1e568d72df48a4985a9f67d76dd94d683fd56afa7f297ac0d4c97347201baeb4693c7f956df7bbfdf9d065c0d8c0e94bb5bbc1972bd60e8e8ca564b9728803a24aac536691b95ab2a9a610be75e0cd975cf907eb13f1a09a892dca7c092e5df22130616545150c7f2c941521d2758d938ffdd575308575f9e851f71daadcae14a3ce15ec945798ab6da9a55820e79066f624f4bbed0f34904fbb3d8e989e4cd615b1f408d7af2e0a99dbc932ec744962fee136a2378b1a70773bdb97275ff01888ebb150712152d99a51a453175dcbd3986e44a9e6054172071ef86bd21e2a58876adb001c326c76eee8d705c38499ef70ce883d22353d3c1c80f78b67943fc52480f984c2c565d7e2fa7f7a3d61d9e67e55b789c7eb21ce18c6d247fab4bc882a0f11202edba32f46f3d3e9b44942f22b6323e2bc24897ab6d3bcff92fb1ced6a8c7799774a575f8136ad46eeb2e990bf1557d48befe4d924cf1ae482f30b3106ed0fa7650a795f88c4c3405a634ff4be2a9917c4e8c956e037d80b24c6778220743fd40db01465be00672ee80c9c7f628042ecef680eb0c4f42d821d379c6a43e957af6663d5e3a65e2d2773ecd185ca967048313e8768c0e05ea026d2d73b851e053c85b5bc7304ddae6dc0406bb8b7fbcfc4d97a6e63be99478d0f76f5f5f3e1b92266d34492d320370008badfaa323d0607c7e97e4b79627e592c7b04b36c7ab97d01bef6625824d7e84dbe039c0ee68ce407a369f5ec990459c7bae59912d296799506bcd919670064571ed9f65f1c4851b64cfbc51843d940002a83b7d6e6e38b7bff76d2cc0abcb8f4fdd228e1cef051abf88957989d0ec0a75051442bfe26cb2c8069b75f7d58320f252572e41cab2553a137917f39f2e24e8328faeca0b09705c64362a6fba28bfc909049fdeda968e7711073dfebb396751e848309605058695fae666ab7b9a93cd07fd63e6e1fc237212ede0db15ba75eeddc554ed2c3e8a10d159ebc1984929606d4b0e87ac8df7dd8eeadbc781b136edda9fdcd346e0985042a70cb2b3006f13df73d31928c1c9b694f59fe63b07a32f72db3d188b82da57e970fd46036a35fc355762811ddcc743d3b5c24f453ec3481a1bd92da3ac69aa0db0f68efe114f44fb36b2506b21fc397ad483777e4e687ac9b5ed166ccf431df5722df9fb718dc58ddeb33f46cee8e52c1fd3d8aa050dea75ce7a3d1bda13ab99548241cbfd9206de745f581e9f540c87ba09e23b860340c46f492cecddcdbaf11dd0efeed57ed20d8281b5684df4217e7a6615db4166fcc88cf5493fd976b536f8ffea475990477e6e7022d86d77b1f12104287d2405b55aca1ad4a4194439b04040d551768f407bef3b14acbaccf1104cb78edf6bd331a91b5d0dfe769c8898c888b3632133dce7dd15ad24419064726fb60923291f24dbdc8c8bcbdcdedd012d97c978c3a1c226eac45acc66866b04ad04b2230951f95f6e2b275b34dfdf79b7c8205317a500fb701e1604e92d299880a386b5a25e89ddbbe58e484043d8d6fc14e47a594deae9cfe5031256f28ece683813061c4e95710abc06c54501ad1c9889d0f1a2da0834eed329e365c41961459896ea3855c64e106cb28fa709808f3d908c26d2e772a268c9c5e493b1bbbabde10918f601956241bd099b38782009b5040ac84b341fa813039a177b25c8799d122454f2ece28ee3871841efe3002beab1dfc6465978d535a4f7c0899d24812c40daee4d62b9252594227bcf2a11d3013917db19b8696c03f2bb6cc1e4c9341875e2945d6cd4243e9f04561e5cb152d46a1a7be32090ac504246ea8d1b13c636840d90e3fc8caa82953b17ce00df5805676469fa40d2ba1932b1b9d595fa401497714d92d2f2791b775dbd96be9dc866f497a500a509295777046e10e0b08f47236c5942c68cebb789cbda8f367eb9ef0f96665a5295dd66fd7e90ce590d9e92ffe71cbc5c628b857b22bbc6343d4dd2f6d9bf76c44b9493ef624761bcd92455db5ddac68d91322521986f43112971b5775faee2f293d5d7eb0a5011c8fd37ff0a9f527a1efca9627087155d619ba38f3faf44e7c6cb999af693970e0620127117485f22c9375808ca5abb690a112c6188bd522734d32719ae3fdf2067f73a2b2984e0309c471c768ce5976dc8d745786d9207ed7868825f63f22eeb9875ba5ba53d6d201fd000dafac47adf4185759fc97bf3c6b9a7bc4fab740dcad8d8f70541ceed6e9ad60a78bd262f5d9d097aa8173af8f87a6112e73380c63473f0e970ced514b095c90475df119368e62f6889597255d173f84a0ddb3814f1005eeaf7d614c8e0b5ecbaba6a08b39e2f00d1fd65094fbaa55c57ba0c959ad438f03bc78d29e7e4b71ea1a049d524b5c14552e183a3672d536d11a8147a7b8cb503e6770cd7f2e5a634ad09a87691b6c5802fb07680cae32c8996800650c035d5d60789297d9b8707dac3e025516d1fac3d70e4c9f0c30ed11db883586c178aa9901f31ff16a440ca360430355c9ecaa79a9ab0139243febcf73c10edcd28555a493704682d2dedbf537e33d6cb4772458da6b8bba196b2d7323e3198ff431f46d916b3d027802fee80a216fb884ab24e32ce40e77518019e8de413761d87a29da987eea8193376371dcb8b8708f5f6dba387371cfc5b5895783042248208108322820820c22485082042968d08206294810410711441041061154101d042296668dad7c6f9029175ba6fd12246571196a0a0fbe329d1488c5566d9594d88c75a6af5d0f404d1ef29ff77667869297b8d41c20b02d459d9a1180f6b030ad378bf7a918e3b7d389e380841b403fabaa725665f4150d9089b57b6ddf504a0ddaa36af7aca51aa7302513676527baf0936881cd5244517c444771977202aef3a0406985258e6dfcce68fb096e115c0ff50a2003c635d0d582c21734aceb70281c74ec6c43096414ee30b6d791452d49b6f1de3c006b60cc78f16e6a3425e18e1fce98f08f09ef98f08e0bff9870c708779c70c70a774c78c7847b5cf8c7857b4cb86a6b9bfb37e0ef801155162ce684fb5c82c7c73d0377ff07081231ad9ba64e696cf24c525f5775b9c690d1b4baddabd9a5bac6d50788a39267ba7a5d53d71a371993babad5b8869e936149cd9d3c3c90a3205f71aac55bead1927318c7f0ee6d9cb8fd2fa8825a93007cf81c15fd0eb46fe2c00a3703b240d5fc6974ff9f22f5415a99cfc839961cb91df1cb0603ca45805be1b8a860022cadfe9f09eabcf5ecebf1ae1eedf4b87d98e15e8fedf4d84e33585f8feff5e85ef7d82ff624c870fd91a18bfbe56a7eb2b578b52676a8b8cf14b8873444b6c5c899f8f5071735dc767c55b7d3f0e8dce9ec24242bbeefd022d2ec488e0dfc0d67888b1969ae7f65de62476c92653f0a6c8cd880143f412f3c0aee3c34c0a33674cc78b750b1390d1f62b22964736ddd3c194d91c808e993a110983d9247549a5128776f7779c845e41adfce365b744a2225db354ba1379bf5924e4ef871075f2f48972da4daba1b0eb7d241679f5a264dfa7ad22ed0c70e167aa7a11de5366b297c1e2d1cae6728f415a9fcec4df991575cf385698d2b0459ac46ca61f7bf7fbd31e07f70015c1cb16891041c44a431e70a4bb9be2247a687348a46b85b6944e67aedbce943c340c981419661967a38a7aa3e504ebb684cc429a2a443d90597202b5e1fb298f005853ca604b0504a9081ea1137add9da144ef4b70a0b1c426491eb3c93bceebdbf03915130daa3be10160b44d570d0867b56921243865e38967754568dbb4c2a5d2d1ae305dfd2400388ef0534bd2169279f9ed072afc5a791ce5c09363426ed147dc84882505873b4fb0d3f3153388f4db0dd0679679b2940b6699b17136453b1c9a301a8c266851ab9f654eecbc9367dbaa8b7e8f020fa9c374be13a9b514da0ae20f69f0567433144cfa8b83e89cebedea7baecca65c9995b51dfb159551723d2aac59d408a44933088879043e530c727612af774b433f1591c8fbd68322e6e9983a6e53879f3ef1f8982eddc13ca748d142520f288c1c04d3674dc776fc9f15aebecc681dec9b0731b16951a8cdd4be1c179077052b51cfc810215c7dbbe4edae699a258e280f912f44225d128f2fecd3d44696dc580ef3779181af5edeb68594c411816272f34194d55a2153b10f288df4c0e401afb9571c759fc47838d73c8e755d19ace71a5f5156b3e98a8b9aa4d9ca6b78c295289f48ea1431cd4099bac46e643aa4e63b23d7f48c79f51ec49252d2a52a92d6590e552f703505d999765affbfcd211609803630103488d361b0059d2651238f9d8d86803bae0c8c49735f3d18a5e69cd8f4314c873110ff76d5467ac74d0ac7e0faa9cf094fc96ec0c4942177acde3012e110944f441645aa0c4faf1e86ad50d872373f026be69d4997f937eb6b1b53b3d3c3a528aad1d40c5c11079d7824cec18a0c9e3ab8d2c9ec1ba10762e1cfd7475264030f1801db024c3f23afa504b123b6202e6a1a0e39e0b70d2fc1e687c9de726cbf5e75ab0973c1cffde7b3ad8fe48a9ae8fb649338849af06644c74e67ca50eeabbf3bc6b5e7302b4845ef0a7f4decf0c80169830cc49f802fbd3629f6d16fc25a1edc9d8f30d817f62306a3f4b2f1708920db069e808437e3021914feb05032770ab85178090ce561573f6469fd1620055b0892d77fe3afea7044aee9f135ba7118d3a7dd4ae63a9c5329ca593b8ece5ed62ca45aab88e966064add3c8ddb50bae869eefdc737dbd8895c03a4762ce634d33a4352eb32452611fc5ccfbc77404536bb9483842db25d8628e295139ab261686348328e3aac0c9c6f66bdd5e4816c0c796278825fb9a8ed13cac07c3bd34d57093b421bc9c3a95c2835971b5348a525dd651926a4ab4350fb1e8b2d2058e0fea656c1f95675aa477659f7575813854d363da589783b393e18031961774addd35fe90f5db17f60f231c58202c831f1a1e39f09e31f70005ff0b53fb3dff6375923cb0504d867b5fdb87cd4c280dfd98e399cb04cb37b3735e2bce3ed6ed91396c986e07a4e2859b848b7990e7f515dfe6de56384fe41878a916be291f9440c34e7952696ad29e001222fb334755f22fbf3e0ad728d40c7a0aa19c6ebc82fd5adec2ea68e95a2c9b87d984b0aef659416215372a93e9e177c363b12a8630c6b7d1451a5d97849243eede7be642a40da5f384ecfc30999a964db6c7520424892275253d2718020d22dbe94548e969f7d72db9a1d008924a23ffc9612b93201b5c2c88ca5cc3e880ac0cd7426e2705a35b62830de82b64436afc0d081f63221dc951a07a581e63d2d164d234c61267aa443b3c0721071d318a711fa90e000bfde21c63f4eb553e024009d20eeee149c59829305cbede5deb187c7d1f5c1605b1b8e4df65834f40a4b26fdd2431a95ce97a2e954385d0100eaea1f4d314c7cf6e6087489e1c9c103442749a097dddf031e4de782b74baa100870114fe6f3749996d709ce71d2f31d7cfb01c41093c51c68d40a8ca0766aaedeff6540c3d2d1b0f1226265a262aabd8257362e25a0df71b65d5a050ee96a4fa77bc207e2ba58840643ad38762b120ba686813eb6a13a1fbee3f92b84dcc917029f93d0163a8a44e73b00d39cdb89772d9d6950e49260b9192cec66baae9b7f148f85fba7b5897b5fbe7a6ca42dd77c02be166d174dc4595141f76e71782894b324cc25a07aabfc847432e9a7caa15c0c02923b5e021f9981db6acb0559d0f060d79ddcc2c475314d1f21234c62d62c3431467a571b0e122e145f11a6be7b66b845a8e52a4438d1907a3a59f5203628d26e69f209673712495c7aedc3ce00ae39f2986bc06f655ddf632dd6bd69f4e5a3968d73cfac767b2e5e7fbf2f5f0215a43d2e5483226b4cf245d262631af50c84bc7f758dc111914960145da7b061b246b1365ff4d0af4a2972a934b4d1e42c3bcc5d40f4b83380a03b7b67dc14580498bd5d1ea263e26104ec16ae07c5dc204c0c72979efa262c2b5d622ef4d605a905e312cd6a1db1f883271111c4e4f67a81c2081a3d89ba9829d18388d2a04c80eb107520d28a4c8d61705e2f86119a1d312eea2d1375d4e733ab14c3b7911b211dba31a8aa575ba27373d9a478b6bb2ac3ee62ef72dc2397e6459b79fde2cbcc3987af2e91ec1eb24a907c39837ef005c899a27bf4656fd257bcd943112554fa739d66503b0076b1f48b2a7a23042b948ffd52db90992f60ded8994d5ddb4f8ee87d3e7671d651e087e334b143a466fe1e94b4b1254adba4e14ca4e1368cffacf823f2c9a8b895e15ab50a5cd6b92736d24d7c4bdf424b11a6442e171db4c3af767bdbab2277cb4c4e4b63f879546d5acc51425e23dfca7a1820eba695407d274b03134af3a34941ec2779b8494f2defd3f0dde6c5ca854b82840b9aa4c1f3f0e83f09cce9449d0fe13901a79ce7f8c089ef20ff34ad01f6c85125b4b213130fd1b0580d26f83aef99c7fd29d96e812739d60b43a02b4d7279139e11e33858c8b50256dd62c4781adf12ae5348e6b8d03ff6f0e02573000859bfbf6c6ca2b94b82ae265a4074cf49173b87f95655c6735ecf753695c27963dd4b539ab2e7ebf57899a8671e2158777d276b325e25add13d94952e4a725bcfcd70298a422b7b51290afac248a0dce00b91b97d1488e2a7441d87fab96146850472b3df9017e4563c69ab47b6be87a287e58fdb661b03fe92860b52a1d9dba2ae6746e5582b9218aa5530dd1949731d04eabc37bc4564767de0699d2f867ca7ef3ffbc8308a26afb6c14a64dc94d1188bd6846ad92324a1a95310156b9a4fa4e7b527eaa5c0718fb1ba9d6b719fc3eddb82794da0224da1d70256ccaead32cd2f9dfba6c106663410d027f18f82e08beb76e780279e545b54e4cd50029b9f03f81e9867638e1e4d99bc7a66338ffafc2c72f6ec3a64788df4b72022df350ba52f9dd2f29e1bd0c859155ef2f1be5747cb6d36f8e2cd292317d4a9e245657ca69575f5f43dda022a8ccff93dab09a1fe1f72364fd4dac327fe02c2064db8e47299558b8ca56e8d011c8154199c60f620a8a0f10428b452e9dd0a4143a2e64a2c9ff06a1b135ecf5ec072a39bb687281bd2425ae20c209e3d62275be71f51de00902e54f07b23204706e41343ec7991cd0546120e9af8c6425fa719f64c6a50447f1fe9e70eca3d7e1005c6c1cf92f2ae9bbbcac0347a11b431710358959f643223fe94ab2fb30664d3288e5fd288ac3a0b77667c6f0f0d7ffb6d6f5e634c9d177111bcbeacade43f4ba323e44d2826e7c3eabe15554b24f398ab25163e2157b596863f7e6a6244163bcbea9fec9cec492c6e4ad68c8fb5b1649060c884a8f627355846847b65cd5ef07f5188d916ba8dbe4dc0f9304628fdbf64859411cb7d543826e93a179390962dd28eb8adadf8f7c070eee3521ecc61c1ea7c0de6c664b3547e034b5caa688e431f896157e7f8cf8582fa2a2c23eed9fe6351cdaeb42d6b73937d49aa19a140cc19be74cb0f11b94f9b0201a10cc96262a2a9240876aa96f40732ae9a4c4d93b19dbf84b065512a75e6ea2ebf9cecb270f2af506d979e7605e1aee9b4730d41e8ddf806405df3c5a5cf73382e0062ebf0a74aa69e780a8c047ce8c7ed0ab8211ae1639f868b825cf40dc7fcdced026da196976ee21c92021bf1fb7ef2f34dddc10b1c675109b7f2114bdefb9c446fe4520253478b2103fb1de881d07cfac281ab50409f89173eedde61411de4f23ecbf04f9f7d8715199f54b282806c0fcc20926158298ff037e0fe6025df4a5a08a0706a5b6b3d46d4f787a3791870f3d84b0ecbd5b842bed7aeeb8064abfd6734c64469e15c2ea242c434ea1cac7a1b648e6c8d7b62dba008e4ebb49a1286aa9e01926f4e868265c0113161236a42b4c3a48fad766b848d993812c3a33ceb3bc4666b08caeb805ac6c83c98f7991439128fa002bc85404cdc2d9c66dd52a491c7c6a0c288a8ac2998f701d73c00e60a40355150e7d1238109838cfd98e04705d1b16551c7abce656825d500f27db35293ba281e26fa0504e4c18a84df8d1f25e92887be44d2e5a0981dcde9c4a97d961f855e0638946c9ab4b74dea5db40fd71a081fb48759d35994f876510fe76b1bb8b913087b6d72a4b4427d626c3ac49410bbb2e96b579a51c506ba775716905d5284e97ebc07eb339aa09a7c1d2260e9b9510cb9aa6b8824f0325434eff898f019b64bfd62789b04f6a87b817d40d4b7f50200ee9daf1b4e03e917329811ac4f4a3b614764467778b80e8b357a1c93281ca092d41443767c18118af13f80ebb35de2be481362f12058568ad433c786d318da4bcd7b5adb1252669fb06d10150d9f61719cd9aa1c1e09da077476f7f8539b105116454ed7732a6aeec199735fbabb484799fe83cdcabd7f71af89bcfcf214ccc251e5820522c8c4ca4470d6319c345e242021cd911e96281a90022dbad29081b05b01d9b007d32b2a7c63f2abafe153d18ff43e136589ebacf69e98296c414c6400afad40d2bf7ca27407be3a986243c77ef0110f7c8d6be6f13f96c2e008b0d0476908d656b569067d21596fec8234c08f0216ddc2159c358052aea4e2ae21760dcd2d3bfa0dd3ba95323a40a0a94beb00721e5a31311c8d5182ca9e20739f93ea31277c97354788de08acfd041b2eee38c0f95454a4f419a29e39e29b23582d10cd3c1406d7338879813ce785f083bbe19a2bbf6dba2b99250129c79be26b76c1c8e56afdd1706374a11767754fc8654052bad6c077e3118dc5ab758cf6274777a020acbd6388d7a9291bd1e9e4dc5a3cae320e1315b04f07ade3049a14db37f9933f501a52c17f3b8633cffa4799992e5f493ce467b83f76741a1109199822a5c58e3ee906f3f0df80d645f4b6c2a39cd9b32d21a23826eec1c5b4c4fa6bae3f58af77e42a0b0f731feb0ff06af5c4aff86c3a05f70e88f606031a934a3db2cff098ec518c0d791a1ab61bf7c63244111a9f673ff0ed9b5c3c0b93a96441c97045aec24a6672fe6d6be80bad52f9249eb1279e81317748a20bbe2149b883cf57e160ac6a891958d21878904553f45d134ba1891a0f2854f235581680f72d08cf5eb8b168913b8ac1a8d100d226415023cd325c6391564c385cdd14d0014865862ad864900feae41146c118e719d861d442085bf63f4070cf24c74f1359064f27091a3f417d0f7e0530c4cd7cca171ed76c5b0b10218ed2e0442c02734a765f5a62d550988680c8469b137b87a379147f2bd8bb07ff2b980a37cd6bd9fb87cc246b980ee4b244473f532a068a069209f3e7be99f6b0afd2f339a299c5d65f76d6673a7ae821f32ac2d1d93788fdda30d1913b49daa5ebf709797db825aef53fde1b3a3726786242e1173743b107a54149146c6e8040d4e0fb098917fdfdcb500f4a372d66c25eacbd48526bb5ff4a541346d0ab25fffa6222843f11ea71e91dea5d2c46afef60af4bdbf0abca5edad8739cf6a419562467651cb7b7e8e1dfd8414d591ab1ab6f08ed29021338f175ef06e6aedd186f592ce8369dbeb8d2596758794b2a2130215b5a86c3b379013286b7750911b49150d743275ad77543891caa9396e28f06cbae7c76f41a09de7b06100402bd9dcbd1bf1ebe51af0553277d4af480676c6a44615d1e4d30790802c73f5a595761544314b2116a455df332a8597714459cf3d6fa6ab82a74d42cadf574ff5185cc1b9138d71ee7d716cc3e37d445947866cd7d7b071ed05a5fc4274f07aed5d793cc9b01097231b28fb7095f9466ce44fed2975447045db8785a87fc605672b27cb31967b3feb876f621546ebf6ea1da8fd01b0130efb126b557ecc783def89dea5eab5c21e558a84fd8882a6c76aba7273e4a90f58952375e8c5aa5e2ee37c85d48bd47794471624c505b2975b80c480c0371a887708573928ce4711040f1e7485078805ab160787d02424a5ff5470a414f7c4bca0197d390008565e9599e4a01d62cbbbad92ecf18977845819e4583a4b2ab7764f1abf23d21975705777096593b488e23f77194a61e1c8ec440c6e9aa60d7969a95e68ed6595e542e7a430f70c99e66e709b0961eecfbf51f9502c863af9d886d86929508aee9559001c5a46bb71db6bb7c3e8b7bdc71e89416b9c3ab18c8ab7eabcc57211ff117063977c992ee4b5b688c8016a72b852ffe8b5776b6bc41858d4c60fec123e8b1cc217049dfe3d0dd48f5bda129c41a67249549ded6d245c91da5c076c6844430e4f45eddf8c725798c2815c185bd496dd61785ed3377d0d503540d775bf81aeb3db23aa23bb4d00735d500a69fdd8be11412b4eb38b0e6515df4ae21a3e7b65ae9607f56efe674e70707d0954415e9b273257364b6e26fc39a4f1efec33f70715206dcb2c8491670a262c90865922f3efb34a0e062c54be40fec73005d902ecf27468c2eb950b8731b7804eda09bcbb32283e4f23723283b7f6720b3c2fabdb9267acbdec0e40a058cd8b390a6a88cc9ef97a63855b750d8f619e9dd9a94993f0d8fbcf997e485e482e301d147ec576cd0d8fa26868ac9cc3f371c21cac2b0ab9cf6042f53eaea6edcaf4ef3dd4f6d47f7bc1b479fe0a5577dc95b736ed7d0c2e16fab691a3bf96abae712243b74263c1fe005ebab8222336714001d1e73d1609e2920395b691b24a71110c598fe39c9476fa0252b5150cc96fa3b857c17d23d63dbb7eddbb8ba629ad29070974b356f55a8b6c09996d2be00bd50ce99d4301a824a54001fb42c79508834dda42447f1e87df0da0089440b264fbacf39038a15ea4756e7f70084c79be468f62b17130243da47d4e1f8e89dba1c1acb80359051d013680554b59e7ccc16152bb4a15f917340f62df29c00ef493d59a484a621a648e39df0c15976724e88eebce92aa1923fbcd19d96bb35cc45936acdf38a258ea804f6820423c88ebaff5e893865a69d7df9444decc74a9fffbf45acb125bcd56cf9e64e9eb74d1364d803e94e1ac2ccb32e661c7ae595653d3d385003116c0ef6be6160d01121d59161f00365fc6da52987243339d8c7e89f4b27fc5439167a08e9825701ee3a934a30eed35213352f64d6ca90b9a1f56bc1688677a81fca2ad58cae9790d6eac1a2523526875c1faa39bd295612a8ad59fbb407bbcff45c815ab4680c4539b253308aa8ac7e18e20a09791852c4969e1c2af2f5d10d502dd09eaa04c0cc14306a8680c89b22b2dfe847caa67e559f9ec4a0460b34c185c88721d6da113da2bd95e30bb8f3fa6b9db44822092c3a3168f068de02b865e33fe75b601787faef0637f4215b45c6bdeb6de980510c1520de73aacbcc8b487e895b021250da3e4e9f5b5804eb9ca602e15f80472e086324dee2cb17e549c6a480269674313ddfa00f92533563162f02978deb1dab05cd928b3eb8558aac46c4a2e28dffd087adfb6a036bd1194a2375484bb338bf2a4a08d1d9689d6c09b72fa7ac3aec2b59c6475a86be7633d325d27e75023bf11c2b7e945ca1105c8b6ad106325d56786ed97590b5c42670619733708483dca5b0c74345d698132171530b312c852acf2575225522d6c083a493c5e01e8ddfab1e4af081239911147abf625a52c9694495c086278335d8d1e498e8deb5229f3c6ddff79094e32d5caa5664e230eb100cc3664cab0b9a667d7b986284cda75904923f919d09ecbec107e266f7b5c3aa5edfe9cf007c87184602c72b3242deeddea125e4c2ecc96c5844fa2cb4b5a530e80d8145f742e54857a92dc585bed93e69441c2c8cd62b41b24efb04883d6c544d2f3b93dddd4f7cc6a04a6493eb87a7da0903bd570ef49d9ef4e5cac330035f3f24e21eb4278c5efd71e845b1cd5389e1130bd3ec2c3d3ea1dc5443f303451e307c5a13c7df3a8eaf81a93f8b0f031e5a1741c89ada4261b4aa5c64e7449a29a2ba52ad4ec821f87bbc755740633c356aec7ca4974955bf6bf8352963e916010724526c2daa4c74e366a84005124d15dac9c8b0ac9386ba8f0433415660bd1123b7563f81bec3608c5882fd02e9d792610a0983174bc78de43f31998cce9ed0d0148425eba5470fc36458214da7dd6e9b5e4d7cfe6cfc34acffc518455d800721b439059538e04dc0d20a20145c03cb8087822b0035fb9165836108f529c6df61a26d70634154d9b1f942492047583f2c0566b836d5ddcf585140e46a525ab84a6e0e7d82d24c5f8c8392243615d1fb6113a54d3bc7761f8fef4006d2416e9674ce4ba20345a08e5d67c8dc4b977c14f41fe84f865be7a46ce8f0a392df9b6f015ed2c588358e4ba4effc9d80f4c04d8745ac454bfd594fc6840d4cbc283c6837782a1baa504fd68797c3d37d5b8613210987c7b120ce2cde9abdd26133bb4162751f60fc67481ae16fd9e9682bfa21608f89520d2c4a109c958e98373459d4462257e92ae349a5d8302d10f3519c1fb62e44f6836c75ecf0bf43b6d448b531fc878a7c686742a4ecb87c4bcc435981dc445d73e9cd5ae3137029ca437df4e2bb86e20c407102dc5bc9d68c3d75638803d5ec3f0309ddad0eb56edb960cd00760ad07ff9741c396a4aa2e8e1904bfa38d3451df3ec105daca3682e4a5f31c2a87aa2d13b80bb82f62c1a0a1b3eb9105487489d45b7b67dae397aa4ac533128f06c1502108c5d24528cafb655e4ae3f2113e50c73d9b66691a05dccfde3d011ae89c392b101ae58958144e34ab359eb91210ddd53baa32b66bf76d75ae34ab02403c08ada98e00c32c8f51e036703761e20ec43abf675b19ce07f4094acef9faaac02997e63f9452b8e3678ecb21874e3d20254430095595379960a1fa9d07f3d644a99222378c2c3f58510660dfc1b7a8a83a05ca2276863ebfa4fd87f715d900680994f5d3843aa74f2a4f0e915cd0f5ef168dac03cefc326089ed3c89620c570d7f91c9e89c9cf857762f597917cafa8c18df718ea476482ea7eaf74784609ce702910b00c1f99368c00d1d00564cd4498ca022b01f31a571b309c6e485a53819fcd0f8a8386b6e55f663b82357245e155cf12b02b929fd44248d8d7441312a3434703ad43290ff559e453540e4bfbf195c9afd012c7cc5f9c296183c0603ae6b198ae4d621e2a626a3d40a75c1eff1bc3c4f508b7b1cac335feed5aa04839152889e99fd31b21c934e2711d0428d51bf4e94db890347a4cbf94caef8c1f017e67fca2bee778ead2582041dff5534dc26f677d21a787ffa573a05e619aa326645736b0ed833346fb7d3f371ebcc89048a190c67e14bbd1e9c8c86c9c24bb0c0080442afa38fa8585ae93ecf84e755993cce76d2109f375e70a33dfb2884320cf4fde3d01c45d18f2c74c92235aaa4e384fe0867a496dbb70e28cec0b3786fd0f0de1d8e70f5354036d6c5fb658b4f6a58c58ad7e9d085a03a92c44e652ac70414e39cbb13ea2d5a538c59dfe6fc0d5a4f247a5f2f33b39c8c1fc52c676b00c118eb1436219e32fdcc76130050739ff6d39318db17238aa4cd1f18852e6813ca10888a229919935fcb044bd5f79c7a079367307fcaf0066d4a38330b919f9a04fed3ae388d330656e11d5d253c58030becbfb63ab72ad6ab7ca7e393f470f23c690df3def6392add9366d08b602b50bddc7305064928a786877f7ab9ada1b743e363a3b4861de00f3a3b25948ef46b2fcf9ddfd433f0482d60d03802db41c211746c1dca4a28dc43eec0bc0209bb40545ee3ffe1a78af069d7233826cd86806be53d3991a61cc8c6b74fbb01ec8c3b904fae6c7e6cebe86f8e3eb3fbbd1cfaff00c02307a71bfcd8db784d1f327308b70a700307abd4f236aab21dd2b5fa13174d378c51ec6223da93b35c3d8e1be3d646ccf7acddafdbab85266673fb99ba007baf1b5344912c97a416e266aa877286008232f68da6e894630811ce1ef8a0af01cb21db56f0184dc97647bc738a2bd3c33118cdbeecb01c5355d088c13717a418e3c42460f506876b6138934be6b2a3447fb8fe44b39b85c4b039c118ba4ca42b7e139404b80a6c8c10aefde7cb9cd3cdc4285d4c6459126fcbdb4229d3168060e31136df552c5d2ad21728729a7b1ef7353c3c488fc0ea9d87fc3438f78aadb5582596d0c6afe5e8e839e920d03a19621764120400d04804230af13e1d3826ff14f80d191f47cd41b53a75bff1889901044e75fffaa365572695823e4ea59fad3bbe8e7146b87b18eedd315889ef4dd6a44374ea205881e10ead4999ee80c6cfaef17b050dacd77324fdc76a4e372591156be1b0561eafd721b0f9946c013d66679bed0ef3afe3983410ee2f58774d2b2f5cbceb0334c284bd98ef9f656336a2bd318475c8cfe6f17f06486715e1f6ce8d3b152d02495fa289988993bacde9655cfd9da7380227ef23643e9b9c660baf2b798bfcec580f147959f0854ff465e3c0e35ce81dc28634bfc9f9c62f10f0d3c1a195779a88b05242ad3f15d5c728b856268fcb2cd4e57461dddc6f6c81502cf421a79cbc3a4b0b5eac16f3c25c13fc690ce39cf2466577c14f31df02ae4e50747d5202e759195bebc01d21139fcfbe76be61e190f990274e064d5882abde1c6be60cae47cfaed18d7f53828a22473147c8aa161f077c3d38764d1fca465cd23a4666290b18534ddd9114c090a2e66f620e4d7566c5ce7dd0223c9048ea33a58c790d466410e0438fd6afaa72a4f030198468ff73975dd76aef395db151831682a8cbd35a36cac13d6dab2380dd0e1de5a2e35e461b4f98fae8ef659dd31cb579a00d11f67facd103adcf5e6ee583ad01a2dc0b046eb85fb9a10a571459d746852a853a3d06196a54863584c48f2fc86ccd3f5a70c90227bdc3f5bbcfa58f6bb0d7044ce2e4a6724a158fe304ba0c93cdb1469f16947a775d03ceacb89fa0d4a2fb5f9073bd436535a8facf211c27701cd7076482fa429517abee3972bc415622a8f40267612799e2c5a0b8a105f23bb9e27baebf45a44d6f757d9794b3d1af1478d713d7b6fac699dc56d8f16a3ce84ce21b10cd5a0efaa9d1a3c21f9626b6eb2dd0bf0f842b0972c062917daf9e181bc8ace0edd35d97fa16ed2019e734cb166e8063827aec60892fd236b64d45e7ab093891f853b163bdc52e9dc9e6a2a944400899633a63ef6f9b4554006841b8e015b0d80c22a51a11232f6e756bd50e2a6a610b4ac08f9d241be986e23eb4d3abecee57d7da6707be27e203756cabcff9cf2074fd7b761a9c4b1a33fa5355b682aae20fb4c2879783637537483e889ebf5c1bc97fbe866714bdf7f7a489f068c7a73f5c4fff131f7c5c78594546288b44d96e2b7126986245c6af7e946d35b5a6ff709a451d05915d92b101a28f04d640bc59c37ea853e1aed8171a7706d959e7c66d6f365d9504a427fc1b2e09f6d33de7c6341d27908a64cc33ee7ca7d8983fd2fbf7d2471b2bfb17d29f6aa1c7fdd0bf47cde94c1d36c108909c5406467df80ccf8c603274a663eeaa236092203d7287eec7a40c542c731f79ad1fdd7386ce016c1d10397ad3ce285a474b360490a169700bede1bb1b056e845c05da150021b9dfc507082d2c43ba2fbf04dae553ce75cd026da7a810ed46b5c21f92770b182e46a8d5bd1c1436f522afe2faf3e584343811b604f68fdf36d6a4832eb6ba12cede8c52fad2db44a3a1c5643b11ac0dd48ed3a229fdb4b61d6f34e066eae5323725670ec343f3bb6899ae4933e96162b76b85916b3520c9dbb9fa7c8a6f0c01af0fc01526b2fc8730e0038f4a0b7331838909bcd7aba3e3125a136f88da226b2fdc2f93bba3762af7b2f3b42f0e346da3979886269cd4da16b0f8f6b3fdb50ee6584541fdbf142a0c3b1d35a83e4667660d8c62117f21917be387f12a62b495c9418a896a58a2ee4640cde54ed0be0a9b2232f6291ede8f8a3ddf89b065499da74ae923d824336285a340350cf921dd552f0ecd96f3ba2aa55eb63c5e841f7d0d7732f380c6effa8d0fd5b44b8a5c573e4ff68cc87d4aa21d27904d669536104a3f03fe046c28f61b9767e38063f27b7abaf86e4acfd066e2a58734deb2c883bf0e195eff9d73a598123798fb96b9e20eb303c57fdc49a9aad0d84a6db4635ecc4509c0bd313b80ea0afcc4e2ee220d08ed5b8821b224ab9bb24fe90f98bdb6b04152d7eceb34fc1a0d14059a567e0b1730b0d8c0bca1e2da60918b8fc015e4c17410ec648efe901525bec0e4339756fc460265547ce51dd72763da5c6a75e82b03a626f5eac34e4494c36d0b97dba9a67b8e99bd0b73a22c2286546206b4ed03f5ca81969dde146cb4a50fa940d13c6c8256fffb106585804987a1f92e630a94551c5656ead9acfe7627f5bfa3dc200448fd23d09689fc9187bd0a56b91fb53afcb6fb4c3fa29e9aa2331080a040e7aa31afd78d8160829ba0bb56f060229e88b8be34008951d5a34fd83b73d10047268db8912b6b6446e70166b0e3c6b68e104c5e486a92c16f12e65b25097f8979548ea5ce763e9866f1b533012cf1fd5ea1afa5198b700d3f41754134dcdb6138310fa46f906f5da183dae4f505dc84536de0dfd2d97b6d2d30811f601af3820bba7a6901732e09eb657735d5a872ff39424148a5eb70bdcbc2fc45d28ea133a6e6faccb9c4ac7ef5bf0b1a69e69c804b53a062e39f2731532a1e320e7d47f171030735fb7bcecb03f3f60ac7dfde254fafff978c551c9e7c2891ab136b57044aef603f6743222a8b8370c7033525e0081aaf3739e71632a98a013918ae649a4ee9300fc9c182def90e8a7acdc632f7e824c6632695641622e147f3da2886bc21a4d220f5794348b1f00f7a7f7497385a2f8fa6bf4fd2b9484791eef3724575608102fd8d1c2c9b7e9e1a95d22f8dced8f4ba51f3b80f9ce9b002edd7955b457a90a8c976908ddfddec0c7a863fc761c70d72bfc3eea0df841198db2df08dda34eed520feac1872fda493dad4444f58140a4fb58b15cae7b208ad2bb23707862875c442cbcdc4ec00e84cba295bf770d43a0897ee1ac817236855f2dc6691991e2abc1680a824ddda53bf7003d7d67e94a0175bf15c7c639d259f4d56246acfd44dc1e6cc3f1d9a3fdf4b01251dbbc3149007cff620a73b57914bbdda06547d30f56188e85c459b98400f91ce2d6530b12d0eaf4d2d2cb1211a3a05fa3b3878494fc70c078afd1f33131aabbb0c21e297a057bcc90aa0d3fd41fc1d20508f04bfd0d37fd923471c3b0778a106562c273c59fd484d6e5b75e657c0cc1a1dd91b736e06c3d1d11a1635760c1386ce4a3d9b5e716d893ab7991007226cee4ed6942ee1a4c46c5fb94cead0eb30b517e5899d161181e8ad5bee511f9bfd188e6f3e4c617ac5f0e84e27fac1e25f024009ab1f2bf81488cfcf339c3c47ae31b8ea57169408e7cd1517d424b6cebde3fb23b56fec601778cd45cf6fed5e63b4cc5bcd01e4174c55bb6edae00bb874e0eab3ff4e63483596c5943ecc897e6c3aa3572965545773f1c5038b2942545de8c74f1cd30fdae56afbd014faf082697dfe80ba0ef3cef3b025d88485f3642649e9d7bbc13d9c6aa7db729f563fa7855c965c9c0dd8d6047bd9d8867771a9aa82f74d989642a7e32776ea22c01df8c5a8d5b42b97a4a54280b6a7334008e7edebb02db0f54325aef204e0e652e4ba8197308d35d69e3522c46e50cb67161ae506e3b8eb716fca2a088334ffd1aa569ce3abfe34922df1b0d801dbdbbd021d6644183bbfb685ab59f732b25b3592e9fa0cd9f1e6b6eed005a5d3824bb441dadfef24f209711d50932deee3c76354343db9eb3e7c40daeffc6bc5e55dafb08ff4f703474fe65c2f207eafa8f815914442f028f8d99dae8224e7e41b6f4ffa936942ac2583c525377ab112fc5b710d0da4a34f77214d525334038583a6955f3b7089709a9226d029d11343b13c5b4f64d3fdcc88ad0981923110c3d08398a28b6f7c309f3e337dc94954e4dc05a2cedf67341fc1caafa968297fc7dbfa46199237a0121550205bc67f0e2e347a59d5c1d62131d45aeecf5485ab6cecb912e3fa06835448c753606a8c26fbf308bd27cf7753162ec163b65e8e7ffa74e878008ab6710cc2d4851e7968c040b0c1e726b984f8baad4deea402e192dfaeed485429755ae55617bcb9511b8678e8898c423b01ce2b3961e9ef06d6c6604fee75b86ca7f536e0bd034a4e353c4f700aae0d86d89b97886d39dea449c177144f77cc227784cc58f5cf18a4edcca4cc2166c02b333321128da130b9f792bd9aedc9ece9f6c43604441682ca005bd3d89fe736a42a76aad97c7021bbd2ed6f2746b6fc6f2ea4b064d1a4dfe2499def22db773b8da27670b3336ac76dcb996accb2e41997adf78d123d46b460991e31f2602abd36ba51d82e10c9e6da0e59de74db8bdd5265b23ad672134871127a03087aff259ec79298f306ee155a54559a9f012ce7c93f13719851ccc7c93971ab37108316c0fbc9f0e360776bef44e542c20a8351980ae99e4e4ebe65c36fb444ff9dd1c9863be89a4ac75dcdf3d7da21b2b29477b9f6c680cb9ef61418e5f9d6a7d0bdc0845effc04216c1a00f2b1550c8876fe89d641ae9c936517f291532d9dccb381c410339c3e36336e91aaf93a5bf15d2db54db85979e987b830717beb57e92c0488529ee6bc51b85583d671e3f03e347fcd6d42e54b17bdb0761f6ba087cd859506d93e31d6a8a955986e5c48737d51f94141e2487161d071e002d669e27a016fca5ba0a2bc43c20253e33c57c30e6aab2f51046eb48be033449e3902368044823acad4e6f6b724ea488eba61b3341f50c704c8071b818a9b9744d478ba849045470923f361f68c57b0092e1c206810808920f64c4a1430ec0879be31ef46ad391cc568d6e2ea587dfc5a584f16be53de4a3aea7e12f27e35700a003f102af4a67711aea81b4ef6c8ef1cb8740fd112a2194fd0c6fb3176f58afc83cad84e8c7d88218d5ac48aa42ee36ff9ac24b1d295918f4dd4567feda34dca6d411cddd357aa9cb417775d41b090e6eaf01bf1f5c42c3cf43ceb5811e61cacc60a0adf62d3d5bb4c3f02ec3fcd909cb19b4f64e90b1d1d418ce287e444e91390a4df41e03e90a368f029797146cae9eaaaa408f631fe63f3d76d4158a81a5b00aae6067f721e0a8daf704cac227557ef761f734e232c70bc39560353924dccbbd526867a30974a9b79f78b2b695ffc5f3828bd53e0b3180bb179013ab54edce902e1b65efc05727f714e637a82481b5a60e76f962924774e307af581743c70c65e7d035a7df8cb4a92cf7cbacb4c15b301295f2f3d3aa95227e8f1817fecde063ae243ed1a783c3710a93870b1a7f82b7f09c34a1407572928a229090914018e07c0013b21de305005e3b74e069c21c0bbb54bbf3dfff697bf6a08fc303e0173932697820600cc5076763cba1c263db0f9b4e9a7bd83bc26ecafc8fcfce418a44612b08bf1c4bb90440aa0311f2f9eb7ae64720242e6194ba86e96772ee1ff4875ab0f65a8a2d3fe9a32bbf4f2363a82b31bd5928ef856d92dd01c0ee366de38d6f0292bb06ef41f3e6d1d99504e62a7c09567fa7f9e495028da0de886e3e343e1019d03cb44a16cedc5b255bd5ceac91c736c85b41dfc3ce4c110ae69f44a15d3e564a2790cd7476fbfe71bbd072cf66a26939ab0bac073beba510020a0d574b3a4be94565070f6082d37299e456987a716c1aa281abf451f7a4d26faeba7c133722b9f9ee2039e1a23c6a1162b561a256a9f4f24046fdce72ed496e8ab92f761da56001c4faf2f2a2f6acfa37fd5f62442ff70f71b6ae27e49b723c29690f65385e2d3a4e1c018ae345986bd89d1e3ebf34a6810643ac75e05624ced1fa023dcb66e9c18766bb0754081fb82948636177891fbee98721aed577a21fc624a49e07d063eaf4766da07cea973654aff6f93e3da90b440495316918a20dcccb4be2e2602fe274ad11ef8a2fe633fac7d04342b200d83a035733064f410d501cd6931241d5c28289a04bbb62196f261affff540d25b280dbe5f5bdf9f973ffb40706c7f1b46e88bf85041612a9be28f67a7215b37ec2e72b625800f84c8411764b14d9216e14b40eedeecb7290890e802f9cd9e5b52f20caa43099876d97a716ff4876f9f783f7f9d79bc6671624be15286c3e8e2af2a8ebd6d6e95b7f4b76afa600f228d20f27e4419469497a4a3dbb13eb4def3c0c554554167b42295f3e58ac5d748b968ab4a42e8b45da9ffec0c6c4883550fd15f5f8c4ae88ef6233e890142a134c9a13d5d19ab87e8e367291fc30546cf270f3b18a62a076977f05af550523e73742a2fa4637eff306d03fc2104ca2e93a4582010b34a07564f3c649cde4a0c5b2feef302d5680857e7a7949e99234da2833b6ed2eb146f4e4b7bf3f954a55ad9354117ffe159e8ff7cb3d6449db883191c24bd29d401f792197630c5f3232209d97bef2de59632252903460a91095f0a33cabd8bc17fd99d262c0367bf94ed7721785e28f316d6afb90b8fcc7c659d63ff5e8c41f0c1bc81d9ce6f298e2ffbdced97155d4c32f31571bfec6f4ff3766dd696409003954af5fe9dccc0973945bbbb53803ba9ce81b510e40ac9c95a1309eba62def180237dda6a626db8cf21cfa977bd097183142bf9fdf621f8ddd04e54f7d6c3232fdef43c15f55ab107f956853ebd7ea950a7d2d5e096b2899432948e7ff8f0d35c57622b778189f1be0a4567995e6196953ae5f9734cfe8fdf7f4a951f30c79df841e491f1ea4cf91d5f75eb80a67e6dc0bdd3f7748bfd0a79c4cbfe8ab424f92d23953495de0d193240cbb2cf42d9dd35061e7f6a9e6f9449b6f8a36df57d43ceddef378d0358db6febe2736c2225443355443f93ce121a47e3952a6237592699022f0489dc82adf8b0ae3497c3bebd94f484e7e81ce2dfdeae161fa455d2675e877c143fe48bcfffba12ad2c74ad7fddfd7709c33e32f687ef790f9d4c937859284474772225b92e95327cd633336d40ba979245486d23c615caa819039f45b705f206b245a89fe02259b64da64326d319986f1faa89d34cfccf4571fd09cdfd3fcf9878ed43c943efdae5e3897260ef279b0a611921b3517f69728877554110862ba85dea45ff483c4008f2ecbf47d4bf38cfe32e94385f469fadd0c8facbea0fef93648c369487bdbf8fcc944a7a4d5c89b34cf2682d0deb4a15ca034dfa2fe50e87fbd866c84789dff4a0016acddf4d3241e4dba1eb34569437dec0d8ee0d23e841ce628ed6b68a45fda8741ead3faf429f7b5d607e2b505232654ad722127524a29a59e2b27d20f88fb01c4893fe8744d6ae22843e65ee3287d39639acaa38cd2b0832d1d1cb771df71dba65d8dbad02f29a5ec959c20ddbb77df9eec1e15c79e4ca7187decfb299fdf8bf16b7c390cb4856fc0f1c5fd17d2cea1bf71a187f4a65f467ab28b3dc497100cfdd292bafbdaafd06fc3c7be2f942d02d7d19013c71edf452e8e33fbcdfe6de4e79522975e3a97347f4ab91eda11008cb4dff9f149180c9e4329157bf44bfbef979635ba82b63d0dfdb730087da794fa0a16709bfef14529d7a250bfb407a15fda0683c3f06b5735a5d246f891efffe8d7f51057cda7d45aa39d535fcb55d3b41e370d43c1efbdf77aa6ad19d3110cda6b56be6d3cabf56badb5d64a29a595d6fab5565aa5148e11aeb5d65a6b1582a9288f2064fa304c65fa4a40a0d4bbbb37fbe70e3b2ecf993c75e4b9027d4aa98cca1427d36fd13f2a75e8e3e080e9cb9d1eff4388c82c0ac2299567d04a3dcf75e8a45794fdc50fc3ff7f1c9cbfb97997eb41f06b6abed57a16eb31feef7bcffb6dfb7b9fd2af34de4dddcaf059d7947d8b9a3e5a6e51f3873b3adaa266b7a29139d3264f9ae3febc528229f08e762c1377c4c4c4c4ad248d7ccd1c1d113cbe138832a54968496a1e394b224bf6e7b22041699ed949c9ee997ef4834881471a860621617389c88f94884cad5019a4f023cd12b62161f349e8473a43a638501e50b05c4858179df0a37bc90ec6cf10f2a38bc13142c25ac9841f1d4b76279c0aa01f7df6b09e91f0a3fb903d082722ffe8555c6448584f01f9b1d3c8dd86cf90801b98278df0635f919b8bf682801ffb4b0dcc65548cc0220208f31f3f36937c801f5b87f621841f1b0a0b4691c0f0f1e32463a691755a723acd2b66144be4fe290309a34d00f8712e4d2a02f8714679fd389fc06894e7f87fdf3d7e9c4dc41f27930f7e943df8008e1f65948d0ec9055637ef3b4702728b905b2777d75cf703405eee5e083c60298525a1a72077000af3e98421450d281252a464825210a5129480946624cc18308bcdf20cc8021490809e1ae127c927090149b21e194cc6231341f6e3000670a9105c6ac70752019074909a9440682240d38cc74b000100008dea518fc40f76f010c78bb18d388238c4914785d27288230f10c45825de95385e0cf2c8a366c4238f1d12530d66b22699953c40ac69e248a5e430ecdce170473150e29238245af451dc0d5cd19454188a1927ecdcb99abe789ac9986e36a42d896d6953da927070c4d19de4d9d91576ee6aa4b61d36a3ad684a0a94e500ea69e67289636f01c3ce3537a909a62525a53ca7ee0aeed135ba453535e2d84b5a616756d8b9fb666844413d4161ab64a7b04d96c92eb158e238b3d8222b8445b247d6683eb1211505f57de228c5e4b9859dbbba9485ac8969fb4dec908c1cd63d9139de314d3122894af628d97fd48eb2ff0e2170ff08020852677eae9e7f548a84cd250efc48ab6ce0477a45033fd22c3b455afc7e5a2461f329033f52230cfc488f2ed0fdc302dd45c2baa8023ffa170afce86126f0fed4b342ef6092b05692c08fdea4c28f2e8b40f70844badf9d4858cf20f0a34379c08f2e2585767d03116a1d5212d653413ff694037ef42214ba4938a1b74898270df9b19d1af0637711d235df2698f0634fa145fae05092309705f9b1974af8b19980baf57d02092d612ec5801fbb49ecc776929bf52d04a467a0248c222de0c719a5801fa75402fa67172223741609a34d3f3f4e2d3e3fce2d08e8ef7b85e9c37bfae7152409a35133692a89d03fda024824ac1e798ebf24638003ecf47f40fe14596d9c0f09a523246115847e21f28785e9c37346903f601c939f6082003e00b685e9c3e58f91e9c3dffe1207e6d2069634208e609522e2d8dc5106e61306e6d305e653f6ff317fa69205c4d1b7a80a1451a0680262cffc995256e85172d8d6240125159422208ee008f367261111c7de9020208ef701e288fd531047108a504f39ec4a05f594037a0a05d19f84f933914e10c7f62b1b92d4802421e2089a307fa61313643287dda420b2126440b2ec7fc2fc99472488636706883197cae208fa0bcd9fd904883876a6480eb333cf590092029012208ea03f91f9338da60fff1144abb4c2fc994b6894c36c9105e6cf2c9a3efc7f9a7c9a10d0d4238e17261689208e603d7298f65464fe28993edc61da120bf30786a7a3a7a3a71d281fe2082ee1a5ca34d559336a61fe20e990e68f0bd38733f9e7882f716c01882318001100620f314c6572a62aa1288661187668f3058961d8e3c5ef2186e187613813c399c3995365a257d030f40bed92050d7af4e08e94b823ee883b52fae0c3f0ff3f0cc3f0757c41e1ff071ffe07e1ffff7f950fc299bfca12953c5f469b28137d41187e107616b728295bd416b54549d981f38f838383f3ffff8fe3fa821e0727fcfff0c571661c1107078736a14cf27c29140a75426ff8df9a92b6a6ad696b4ae271838373737373838383f3383837e017847373f38ff38f7373f33737375f6efc8b47391853522e060e0e8fb0f30e24285074b86e6e5c2e97ebe6e6e66f6e5c39bea01b970be76f1ee7c6e57a97cbd5a4239cd915ba165fa28bd3166fe2e6460a490ac90674b94010045d2ed7bb5c208e2fc8058237effa1b17083e088236e1cc60e849fe24cf67f2255772205caef959c79539b9b22bbb3227386a40b0a6a6a60604c107c19a9a2f08aca9713df82eb0a6e66b6a6aa66aa6c8ec800d101473938e6ed24dba4947395a3535ad56ab555353f33535add61754d36a815ff3604dabf5ad56cb29b79c9eb84845416d515333cb1176c631d5646a6aaac90cabd562b158ac56abf5ad168be60b6ab1584202aea30abf7008bca4712028fad276c5b6623ff50b881a499d03440da52bfd0b5de26303dc3dec7ba7fb574969882e5d910175da7de1122bf4bfef3a1b3e265b040a054a5206bed0d9d3ac5226ed92e7b5bf7d6791b4901e39a94747dc95d73a2d2a72a8e6f9d2b0efe98c3a75cefc1d51f0e84999799dd5441bea84d24dfa80c13d8f075d7eb4d1f7efdde9e913e71095d2af99d42fa8a909c5c6af8d6f1c9dd1d96f9e857ba72d5afccb927ecda1ed91ccecf3e9ac79e6d07dff29a58f17e9632d17e46ffdad7daa5465a979e6a5529a4249fa6cc3173a8f0e0586f40963c2e8cc7366196a4c77030ca9337318a52273e61b31c3922754a64ed028aa2475e6e318617f99470a65be9819757aa253d3a1a4ce7c28cd33be929ac7fb45a5d025f7678b2173e69b71d7c06340afc1afbc2fd9d197a66bf12c5e3b35cf53f37499ee736c29b9ca9c4dfdca32799039f3b7cbc2ee1a79e4de12c4084cb76dfbcd9b2653539ed729a59452775cc4be4f659fb91544afd3e764a6178d3cd9c8b3ccbc21cf10885eed59815ce897378fa4cea4c9739cd95f76b37fdfde97fd4a00164ce50d0852c7458f85e6b11172737d233627f13c4ef91628d242a5bff5e89737bfb3e1fec8861387bca6937e61913e730967923edd7b9de8f5cbfbb1b32665fa98affd3c9a3fb3481feeefc5781e49f9bd18b794e98963e72daaef84f2b689aa500951ec6bae86ef9510c5bea7e1787445de7eca2cf2f69db889df276ea1dddec3d10445d9edd77fc3f1f3889910c5e41259561ace686064817ec95a94f346678996727d99b93fb2fd0843aeaa6fcacc7735fcbeef0b817865f96f9c15954a5539551555dcf6aae7be86e31debab1e8857964a3ce2407a7e0f90b1fa01a9eaaf56351c3df1fbc68f818458620dac574214637da77d25d4efaaf636ab57bd5056bdcd6af5abfa551c8996b24a1c3ab2fd38a504ac1762b19e09518c2532a1792c8a47b6afcfbdff15724b9ebf85d4a65af13d9cc27a9a19d1c815638938b030c618638c318bc562b1582cd6cbc06a8c31c618e37e9c27d861ddddaae6ca74137cf9771e52d18bc05468fa70fa7226036774094cfbe574ecdc54ce568d44557433a2dc91dcddddddddddddddddddddddddc511896562a161f3c873ec4f2be7dbbc8e77819f03c7d7b49e6686857fcef927081159a161e17f22d8a31fa7c51eaf57bf5ee8f7d93c9a47ae77d7fbfda62dd52fbbe3bf70fb1ae2fce542edbb907b55d8fd2a54b142fc3321eb69c2996fb51e4758f339421c0f8639de1582ef1565fa1e1e9965dcc19b70c7db8437af23b47957a8e3bd255670de868f85bfa3083cce9953c3e692e758304cee926d07916d98ceb1efe1cd18836087f15e36cff8ca9e384e297f2f8c4b1c5ff90bbfe371c485ec7dfd825c435cef2e1e435cdfb7236c3153647042d7226341e6b4f4b9b2c5e4b62f5f98d915d27ef9cd346ca9b0c55832fdb2f673846e147a4de847fdb2df0add49e848fdb23f133acbbeecaf42576aafe24bfdbac2e4599afa653f0c5d4be76c09d261a67c95e6d9de7e5ff991eddf2ff238eddf6dbbdce536da3dbb3da0fb339c4eb7836e5fa01697987053cbb2fd0ed361a4cff6967bfb61a6d319f26772913eecdb6f34a4cfdc42ead8b7bf89732675eceff8016fdfef4bbeb4346773667f42793b3a0ccb9bb339b3dd3d4ea9fb7dbfef4dcbb34f99562cb26c3f20fa01c97e5db13d7318f61cfb17b73862b7f6e55cea976df54b682eb5282b0b6c17fa35ffc98b6cbf9d7ad63cf7de9eb5533fdd3ba5ffcb673a1a674c277b8c5a8f7dfb847b24c1d94df01c49ef267db84f76afaab59b7a925e699efeed2913c77df7745dd741fdd3bddf735b763bcaed28b7a3dc8e72bf4a5847913f9ae7fb7b6f1774bbabfaee55ddbd2da5b7b496ced257bacaf70aff13dbc990ee5562929957e238b3fc8474622371db371439bbdf38cf0b67e78599d2b326e355a47cd69dd897f67b66fff57fedfdeeeeeeeeeeeeeeeeab12c78b41d0659bd86d5f3be957f7dbdb4f48fff65d7b5b9ca95fd6bbbc5fa95bb2fd2aab32ad876cdfddb8fddd9103a5475898f200b29c6169923b8c7347e35d119293bd4bbf2ca5dd5d0e8ffeb499bb1d3d7217651b35cf51279979abb2ba6556c354a9e6a96fbd5f73edbdfbdddfee6ff7f7f3bfdbdfedbdfb957adf457dcf797fa574a4eab7bc77b7ad977aa969f5ee8f1c3b97f6fedaab5f1ee7b5e6b97893ccbc3df80575beaaefea96b9d4b3e394ad0da284bb2b8edd6f4968be7f6495efabdcfd3f87fa27708665b328cc3d77da737c41edbd7aff9578d32faf564898ac5b7415a35ba552a9542a954aa552a9542ad56bad19b5d3a45ff6773e2139995ee997c55101ee0f4d70189e55eaf47fa1367df4afba4e5aa738c3884966eec429d5afaed33ccff3fcc9672ef3a6255fd23cd0f3dc975cf3b89a6f88573f21defd942af26691f769e2c889aaefaca7d59f32efa082c72ad35e4082f3eaf1775c98e466fa5f980467fa5d9d3d979ce30beafed62d75267d64b68fe31bd2fdfdba211cba11d287fd55e848481dcbdd1fbbbfdca5e9bef3c21d39e0f6a5f923b35f6172277f923b41a6e01f7546d1491faf9b5abaa9a59b5abad792db279452a7fbeef8fe5e7f419cd73dfe8478df0d799e38a4eac4ee5fa0b409bdb251a39d1e239ad4f9f0a63b652b4aa9631f48fbf06e68f30c7dc98df023fc8a33f9cc5a131ce6597c4bb62feddf7b2f94d25352b68f94edf75cf923b3bf8741903bf287df20bf7edf73f7b4ed5ddbc47b0de0e58a06080f001007d77c552673eccbaf56dcd71ad97e3523db2a46b6f506d9d62db26ceaa1d205246c4a0b489f77b958ac2edde2f6475679fbeec3bf5fd0f69e98e42ba145bc895ebfa8d7f2a79d59679b5315d31326db1f775e5d3a90524a454a290da284ef1bd944453d0d73d43c4766fefe9b646b372bc642c152dad62b358bd771de776292993f71bcdf7db7c3ebc24aa64e5531fdb2df619d619d491dfb5c58b9542da60fa7b03e85496ebea2566482c36a97ceb16f748f305292a694ed5b7bf395d0798af4b1d93e65a24da48f67af326a347d88a3911ede1f5965efef77aaf91dc784398e2e65fb546906caf08efda6453d401c5c93dbc1c8fd55c21c0c99637f933e1ac77d41cd35f7df73afd7912f1266370b3a996c5d8c7d6a742fc66ff471aba86fc8f79c98646695cc61921a6d6f41d07b13c76a34b412a7d4678291a32b4f934c92968e6ab2e4e453144a38a3be20efef7f25bc77432d7b2150ff165659bfb6f4cbbeb6cdfe418cc7fa3e56a96c3f6ac8ad62929937714ad52d52c73e0dab4c89ce0f32d4fdf7f6bf10c9cc9e38c3dc70466d336a86f12ed9fe14d6db9f52ad80196e467cb1c4598b439e7d24337762238941a8609afbfe27be40fd8a2f7d5c743ec6e0a6159aa7be8cd9b86893c2f79c1803f7df77e2f73236e2014081e70ab58518bee7bef3bef3b7443c517a8e48e413b911835913dfc3b1854c43a319eb9e0b97d8b08058f74633c681b5d6ea40dcc3f1564d84cafe5cd885de0227dadcf79e28a644fa28946d52e89efbfb9ca8c4ca158970ef894ab857229d88892806c4ed2cd750e6209a6bad6201caecdc80c75b237f00207d34cc058eb7841e057003cf1f410975fbaad14922d267cebc230a8f9f3b946d33244b11c9cc9a584de897277598e0f1db8bee07c9c09f6518476e144589e2c8cb0eb1c601162b5863eaca0ca2988af5bb00838e109652a87f857e20fd26f8155dbf20841ed1945dd07a68ca2f6c73fb6582a72c5c70e50b23846822f26107377478620c1eb2c021361f833479e639730396da43f5206132b68a096dc941be6416da62245f32cfa681694fc5a62694d2398b38cc66fef63246bf05edefab607f13631063b042a4dfc6ecc7e0af8936d3865ae8c262053754d0c617557ab0032931ca0026c0d490f454c44c16a33f8be84f23fa1dbee7d0109ae0f133dde9171d41ead02f801b58feb823b4c45f3f93bab53266b97ec7d2a1eec8f53b694a51995346e4da45b9d6ef0ad0051ea72cd7283093e7d4da467d94ebd79f4bdd03e9ae9156f064541ee26414c771da77dad42795b557b9105359732192b2f66323b910489ea395c9f26de865b2ed98f7aa8ef517448bb2154267a04599f3c2b9547f42f9ceebf50f82b8d6fa1df76ddb0d47196593827ff72af877a20afd46645496acd93dc11763dc232dc98dae880a1dbe18038b153064d6e0128321ce18a1091a454e4a6f187d81258c6806a71d54218309286088c8624a0bc004c1450f5ea0016b620d2cb07c9102041a31f9a0840de1f0648a186b54a9c224265f4af957ca970b58b174c063cf8edc0f44faac727f7f7d561b180449804930579ece60e3c9126a48c51c041d66e3fdefb0793dc78545cf92f92b29262b30551c817183ee5e2136a97af4458b1442dc32b2a0c2881e1c81a9020b32444895c182a23136404db949144ad602a829b5e68b2a9678d1b2430aca08f2028b11529efc50031fc4c8c2418991658932ca3481410f3ea8e086d8943acac20d37d248038aec31bb1687e4b8faf9dda454f593a3722522c9aa7048caa7f267f8976a3feb0f692fb30c34ecbc1c7ab98a99e6d4d9434764c83d84c4b9f0c8cc6d23c4fbfaded7ff4af07efba838249f7e37b5f0d28ff6abfbeeb707e2423a7b1f276dd8e316247f44d2ef85fd5a270e21f12c87e4cbbc85485c879d28f4f7b3b20d15853c9847f90dd4fef5c54147bfa3483c0f4d6de69977dc008f44b96607aadad7b7e150156d6adb16c7fa4966b655a3d4ceb6d275fdaeeb5e1265cdc37eed3d6dbb0e0bafe768a2a87d37f42aedcb07e2524867aa85a390fceda5682364d6f7efabf619e4beb0df43efb5706c218ff435ee3bfcde0b63b8e2e633df0ecc43da833e5872998151b6afbd7dfbdad333f0cc0fa4edcf8f7e405a87d273eefd7bdf0bafe738cce5976cb5df441b1bee89f87f4fa4df7bedc76963c38929f87faf423fd0c7a4df138d689f64e6fb14488626ba6d65f20928321000e54d50b8802bca52051419791ae1115141011847589eb461069324e349125d6ad0240a0fbef072844fd26c8a29a82c5e8eb032a3ee6e12808c30821459a8a062a6c4459727621388338800e30728291c8aac7458fa243962cb9499ca33cb9fa2722449e0322589cb141ebe98490165e6849830beb8764a07aef08189142dc82288214830c41a3af82189262a5094645ca644715142c2d2825a6a14bccfd6ca09fb4f237ece22a88ed229c4874828352618b3614bac8cf42b0d02aaee4f8bb28b5707b9869118cc213e90857c39a449c997468ae8420c0dccb8820c0d5b887eb0220a144658c894d2b02ec08093295e1445c1e48b26887895d161890c7650c5135148c9d30b0f56cc408d27967aa8129b65a4d8e106369a40e2680654850d182815310103268519b0a4611484131b3da0527e60cae30b86379edcf0440c292e42c4c6eff6801b52b22bc054a12285b3748237969240410bb22ca121cb0f34a002053e40d916e0900331509c01c50c1c74101bb197233b44eeff346840420d57a88821c418634ed08441cc44541a3f642ecb591a47797ccda048d928524caca00d359850410db008400e2cf0d22587255eca90776e6fc32536f4c4b637ba318eb3bf85d78503641e4abdc507c8d8fdf7973bb5a918f78d6e6ccafdd15f932ffb35ed0883bb0f21e94cc5249ea790c03e4de6a1d4fbc75f9859ce3cc54acfe91474d761fd44ba815022d6a2f46e2658a8808a35516c4e3dd14129d66103a1446c82a093d465279d8752ef2ca5942f4c294a1b94be3e57a908b5729ab6e570b242c0cadebd0a5ec77dddaef65cb8847b1c2ee9be862351ae5286607f8277bb2da5f44fb58949ba5eed91804aaac6ddab59ad52f7dbd5ca8e95b1ffbf319cc7b74961fbfb2a6ca20a41b818421295df864b3a480df011399565ec6508fdff32e6a1cc74c801aa5befb5ffa7dd5dbfcd73fb2f7d646d6a4627310e45a3930eb3423bfaa9e0b75b7243d0b216a3e128436e9a6c89501166ad5bee59552e5e6add4a92ee22eb56a84f1763c53b0f6726425b0422b3a8a8a8e8c6fa5bc1c8ca919e3c84c433fd57268a69efe35ca2bd0d568ef464249efdaf0ca1dfbf9e028f34d350f7b4d04a12f1569f3fdeddb4aaa895249dddc57baf134d98720d45295f230d5292e9909abdaffd1790dc8c04cce2485febabd918e837a44e262c6dd044297b10a2ec43aad7493adb3906d5f747c1ce5e83caecdaef953e9d7b1e0a71519b3e34e9437327a7f7075473ffac2ee8a45721b4e8058d6a55fbe8775593548441c733691e3dab23dba73f7a4268d11581e7f9d6468867fb9e6d28a48bf2fc296ad347576ac5202fccac69f34786493a1f996468ad8d06129a69dd54d555ab95f459ad542ae9a3527d9ff4f93ea9a3bd277daee7f95c9faee338e9c3715247fb4dfa5c9f6dbbf74a9f6bada6491f4dab55fad42a7534a9e354ea68efd2e77bff963edebbbfbf4b1f973aee2d7dda0b5bea68ef53ea78991109dd364f4ce2cadedfcb7dfd216ebbac6de4589c78c4c318638c31be401c09cd22205a8523921186ece2d0a6dab66ddb58ac8d63b158ac8ddb9c22a11feb13a7608c31c618dfcc2666b1582c168b8531c6fe1e6ae2e8427e0f09cd43e4aa73f4d0f5183fcfa129f5bdef86fabfaf56c7335d99dcb547f3f5ac797ba2a87abfff8d468896b2132d65f995b0757f846e621257de5cc8cd47e88b60e87efda1fbded1ae7ba7b9df5df1c8469f35e704d233212b5cbdfc82cca22ca50e16c72afa77defdaafb9b5d47902e70fdeec7dbbd77f7666d897ca34c8ce66b30b2312644311a51134777cd43e9cf851e962002a2ec7fb5eb62125756fde8d7359abf9bbb3b8d4a9c8203cd3369b55aad56abd56ad1d0d0d0d0d0d0bc0d3d319a9781a6d56ab55aadd6dbd0136b8920ce133c7f342267df9c734a09c2c8bdc78d444bd913e595dd13653ad4ef44b34c1eef73ef1f10a705d93265cab421e4be268e9b38de2934dfdf14a38fd18832c859cc8a8d109ab5bf46b06c5ae34a9e7f9bd490e5e981c0f627449535118967eda29064662bda18b1591369cf9919c89087265673f6967e4da7cf13903d1fc8d0445bdb0c41f375adbbb360a2063d963a26642b7bb7a8d2656820ab220513560d267460628937aa58228d4e8825c0e43841178eb37f56efa6ddb4dd89ee76da94564db32d354a655331ec6e6d8341a769dd94d2ea55d380d87f170e215320f5e9fb3701a94db4c99bac56a93fd534ab3aa2c3b467955545a7d3aad59e1ab53def0b5c468269b7aedd6a0bae6dad524a9dd25a7bfa90af6994524a69a5b8dd73f480de1c3d90d786ae5aefbb618a43ecc6bde2a8f7dc3ea07e0fc76f48d784f3c7aac3dc986a4f783ecf88e3474a69ab7ff6f421df13a2bd6a738ed1ecdde61cb371738ee1b4e73a8dd63154abdb98cea3738ea99aa53eea4b192ee5c870f703d2fe53b546eb18aa556e8c4aa55ad1aa69401ae5008edccf1559b97bcb06bd347fe6cffca1759b3ff3e75e7b37adb56d1b573bf9c6e3196efb4d6c750e0ddb8f3ab81f6738aeb589ad560744dddd87a651165463f0bdf5cbb7a7357ddc9da622452aedb1792bf27972fe4cda23dff4e068ddd5ea03aabffa8274a6562ce204a5b405168c74cefcd180f4d12f8603ad2250dcb664bb06881ebc33a1281d2308560ec2a0a965ecc04d2750da19505652f8c8cea5ed266f3df20842de7e94f1246f53e46d2b032a6f6658c99b196ce4ed5f619cc8dbef9cc143cfc5f6e578936d0f10b27d6ba398b28d1a932d194b645b060d39d8c1ceb6bac9b5fe6d23d7c7f541a35c7370833160f0d27ef012e58701b88341223b9835bee040013948d9b2649b9c12617c710d30c5bd2506991e5f92727f830740019d51e4b14500357488d1440c2eb91f8d0e6329f7bb139dcc9dfc86c82129dac81fa74d03e44a4452738ba37cff7e793fb0490943a99b12461435903a2ac2d8e1b681bd2c6761d4f0e580699925ccedc0d301afc6d86478c64915030c660903df2b57086cada88a50520181b72c6760084103183fbc01c60aa28071240486119418f78a5d2c8fa8d00ad60e263ecb0a470a251e565637b2d90e22ae8d13483840703a9c90ba49c1e6d23265039583059b8c7440d950733c81e47a03c7144da018ae068aa51c616eab0a251c5f2e0d1348355e743332a416161deb89660a8b67334bac80b414b190e05440503ce129ded7b4ba3b2bc0513a705336d8a6d91734502027d0a00162420a6ac5c46505d44412142aa02625256e530c3ca027a05cb00151f1f404288aa4190e8e36209994100e8c665ea00ef0e4d5d323f3bc9bd6dd534091c71d8f8a13475021e5eeb8134e3056c249e74828ad8494bee0e7840d3d605696b3a61de4f9e3ce8e83c1df8f9e7127eff4441113850cfeae81caa357b6788de8728df872554e58450512c691e5ac0989596d7ac1dd926449b3a4a724a8a428a0fea2b0e0dba1a907d972265d2ecf9a74d0a69c320a14cc7217fc65396b2ae2c6c094cc0eac53995179a20245258a8a1495a9228a3c8926a4a4ee9b51a796ce915bae13ee027ef9309d2333d09298ce9179d644949097276b376da7477ae121b7bc38b29c3d9125d32c675e9ae4119c61bad87dfaaaa7ea060a3c9f865ecde1bd20d8699cddeebd17046dd7792ea57c1428f701c97f81e0bd5a573dfa4d57f5f40aa4734ee9ce52e13ccd768a77c01d2196d053d554f2c1771b0a790eae94368fb4d7bb59facc47400839c4d7454931c676e338aedb3aef7a5f287de6f7ecd0c8c99242364233c0f32bf5ee5bb5aa2b4c59ac67cdf48eac47c84516cd7df9a0bca11016f29c767fa1190d6b630909c9271963a9846642d247de60913fdfe48e12e51bac596f3e519e22a63f439cbb8edb6e776fd759adabb4f3ee66e75a749ddc0090c330ccdab41767ebbc4f158e61fe1d3899524a6fb0f74d55af26cbbd7376317b3b764c676638b2b2acb15ce49493ceb8f774772c255d4d29beea1ba594525e0cded96d94bbfeb37b80501ea73ebabbbb27eda749a9f2dcdd7d25752876169656c3ab578e1e8ceeee3ee3d85be01954abf56f285fb56adbb595ce641ae24cc355d6344dab381cc8fe51fc89207b1d010d4dab1b73bd4ea3593c9963bf0bedcdc8c20daff72c3be7afa83626c7ad72d64ab51e76ee8030e71c63add7a9bec73287fe077a1dbdf4da315d38654ead5be760ea6675b653cddecebbd395b4b29c5409ed7c68b2ac52ca39e7ebf57a7933eeac2cbf537914e34ce9ca5be52961aaf7545f18e2cfa59767a592521a1a9a56d7e2706c12f6fd4dcb678df0fa8006d8856ee6138239d6762955b212ab0a478e9b03f45c254c17107dd7cbb673560a62960ecfc6b3f980eadbdc785e77562fe5f51e01c8bd0a559452cf5271eefce81ef32747fae8bf049879499fde21bd8b5dc8f37d8ab2a59ab9447186e5538a29f5a99c65153d7a9ce4f9234c333a297c84e4d5d07d27b1ea991bed94c5f494172d31dae24d9294f08f5ec599bcc90dd732a1667ef42f73ce39e7549e73ce2995a4d44f0d758494a7cbf2f459972e320dcdcf7c4034b728cf3ceb039a8122b3bae090598f3f20d6cdf8571f105e499157affa80565a0f4d59f5df07a4a2df0d5070ad0ca01465efbb0fc8a3ddd3ee2f1b331b48c1601465ba451ebdbc3dddbc88226f3cc0f488266a45b64f493b4d5156207114d3621a7e22572d80eae59999521dd96bb094ef5426a299788b0b5e7cf1c477befc03dcd0c51b06c8f4713a003506163f0011041664e09842660915409db102262c9527709841fadccc59174ab9df06e31b1cd18387efc53a3e20a75d70a10550cfba60f1830e3dc86810e3852294c88193143070c28455cae205463b0e7e403ebd6879710a2337174a3831c9fd393ea0060de0862c53fa38ae0ab670f223d3afe1e2c50cd2a7356bca003599a69b11b4d0220a9f4c7fe67a51c609582f2d82c8fdd80a2e5e56d70049d02d327d4ab91491e9abb00dbce4b064f27c548bd90c6b540133000df0cc82864c9fd22ba7152ea830d99cb038038b27b9ff622eda58622715b95fa35a1c71439d33572491fb69164a35e01ce4fec6b8a74a0e5d28a1c3183b7c219a010c5c404508262e685489d1305c327d124e30a54fd896a5dc8dc305cd7cf940da352364c44ceda1fe4520613216a3ee92e63e91f6f689686fdfdf8a4aacb812e94aa613c5ae0bfd30f417696116d1ae640ab085162cf3fcfefa1504d91e0edd94b0ede726e2c89cfe9bbee94945cea40d74028b11b97fe7098f3b3b7ed3491f156cfbf6915f20d46e041a700848787e085860ed6bd8ed94c16311cfe9dfa982470955a49f8a1158a07c0c81b59f45a28dcc5a92121585fad54f44eaf44b59ee56c0e208a4309a7481840f4dc8c89e8001a20d2c72180014989b643040c907a82d29b0820c93581341f1c10a1c9c31c6114468899180a1ee149decb15365a7890944999e20447fe6fa5d7b038002afb27c9b9bbdf77ff9639086d873fcdf9815f16fc15fc87f0531ddcc8a2ad995e5cc8aa650e6d00f010a9ebf030cb67f7fa7091ea5d40d6dda86362dbe0ad70a11eeefc7108b41fe7c40890b0e2bb2ca3bc0609bb669d12685ededabc0fdfd3722a14099d3ffdad9be7f0b6dea6f4d140d915f5efa0c692208b4771b6639943ef24ba6df584c1e5d4c6ee132c628c3648314dce00a1a4eb6282d79a206639c204a0dc19b7eedf43cfd17a5ac0acc00c5ff5ff9258cfb22ffb1d3f32f8dbac885170431b6bf3d911b6448e584ac4b06f8330b4c106106126a3079c2058ee20c2b50f8c0c6143274ecc801ee9f5e06f6f7e692060005bed9610608be0106c18086294eba10c3861427f8a24b1436b4418696a5faa864ccb775450e15d5480000004315000028100e888442a168208f2351ce3d14000d809c486658998a645990e328658c31c60042000000400684a466c0025bd889f5b44a568eb03e7720ab96d09515c4b0bc114125b6a7c2f17856ef89153f90c76876d6b815c95a78a506f8cc414261f1e4cfdfae9b853516724ad136ed494819d859fac8ecad685c654ac1b4f551e0b3a0477c4b8cbcb4943103a67bbbb441814d7d673cb441c4cfe73c442e9b99b0a938ce6a4705c80ac97fe7a328cf7827d9814c436359d6c0d304a51c58a432b8156913e81eefdca2c117135fba9173b63613c9d72c79d19e1f600cf2446a1a702ea4047d979adca82e580eaf77ccd379cf88c66dba268136556052898f818896dd157b9a771117b449eaf7cca2ea02797a434a9e140e978fac0d5b34b49bdb26a3fa04c9fef9201ad0cad4fd7293aef6fc30cc3e58dacf3b5a993b2da9a9dd205bec526fff97839a2144c4d850682aa529087ca042b8604ccf9c03a22d6499678570b3774ee933eead3c782d735ccadffc48484746d8b0b947a15da82957a4955e760a5884728f10eabf383edd5de0dfe456fbcb0cdf55d97f3b5ea20997a94cc99140c22705a861d991c3217e2314bf4aa39994c95a491e7b519820e5404877a7bdef34440731fa86af23205c46135d7af51b2863ffe33ad5321ad21b025ac7abf7c111e47c8c628409b44a00b5fe0d00577ecbee8f8dea7c1a59784339b1ceea04fdeb27231d37c9242923259e58316aadfd966bd4995c77c3f03023447efb11cd4fff1a2b1b68ecd5a6602866ec52206f5b1391205318f8641dfa1e26020104967c4ba3e8ed02287182f60926b3892c539bac3c6278e146db6d3e5792ea82b4574e2636dfa9aaf72988ecefa3c50b86d4593ccbe0f1e131c060ec26bf9a152d5f67ed140dd865e6e4bbdaee5db3070b70fa9fbdfc91a8670d2b7349f4ac38387153667a0a1b8008e17012adaeb138be62bd0a81ab16bff910b0a88e6357358baaa2c5100b415f00d45f56b7074615360b4ab0aa6c0275a18811d60aeb1621e7246508bef15ab94db21a314589a4bb544cb14f4bce0030818b1c672b25497eb696a196ae29139d3533087b54f669487584b4026c97179dad8a5ab03a2e27c6e7890b5d7f7a2afa11d4a742c94b0c751c094aa42c10a10fb0da48e8bf241a14d155f077c4d4b686940b7d8c11cf18c7f083058079f473e05106c0d4e60cce4b734ba465967deac7c1d28408911cab4fac7da6c8fa10c91c2ff79fbb60b4cd5b5bde9f01b8c5bbd3e1466078bd837e916056b05f206b5515c852dfd6521860332007b7e2d1f619df86fbb4daadfc8f9a12330ff357acc0382aa05686ae05dfb02a633c587bf043a35245436d0eb866233ad2ce298edb2d3e3968997336f41d107215081a9768ce00832cd0a365e3ef4a18ea3dfdd21cc0e1425359fd7fe9450fe1c5578e35e3065d3ae23096e864635b450191e864635b4190c035c668912948f689258ec13b4a5fa94a32154334dc327a4c05eb0ec009a4d51d9a6cd407e42bc8cb28f1622d4939fd43777cc0282c10bf0c59d6022121fc8a37e0e9fa11d34133c13ed35b7ad5e42e362f455001552892708ba8817f3224376845ee34c48ba83247dec580e46f3b881ca1d088f343ac3dc248fe1efd2860745c1dea0056b4e2d5a21f60d3e80a532639744aa3da8ea179b47a4575eac12331049175adfdb1ff970195a3cef48d5bddaa993d751f56722aff400144dc8355ceac4186c899272558d8bbe1f94483a4acafa46745a4d91a48de6c2927925b802211da203ebae9893da521f74703a3ae85df13c85d3458230ff8eb564c8e2edfc9725257182cd0157acee0d437c54632a380a35483b8263353f2bf33d28cb771126f3dd17528f8e0e3cb8f829bb3d1fd940e637f42b306680512215669b1b93aa6325349629f10dea19e325c401f1fcde18821392d78c503009cab758e5f642bedd2d8b71538cb2422f6c0b5927b61b9dd43bc46fbbb4a288d00a14f4daa44ee081bf9209575cf3099877e0b7a4d68da5840000927c636ce84a5f1b22401492f086c52f5d71fe493b4080c8ae7fbf78614277bb1ff5afb0fec68fab55596b5e6f133c8acd5de235f425c820cca3cc7c9cfc74945bc815a9a0b69c3ced1080e7ac62d0553fd85116591123d26563848cf4dd3e23d29420cc066de6f911392ab67465edaa8ea0997a2bbe2c3b6046edbc542f4ff9087411a964e207709f485d052d1643dda47409cb27a8af31f7ca7edaf4182b83c7755376d3fa8105c516a49efa7de5528380a682f0f5ce95769c3e2a3c6de3dd009895439ba35d51d046760b429461169b04d56392e7513b000f75b5d35015ec96b9c36bf44ad2abc5f6f3cac0001047d5c64d5f07a29b055b181ec75538abd4d9acd8b4113ab3e8a3de8776c4bd2f9110ad15ee82bc6d57d62b73d0a6d505b926e6c4e0fec922d497a2bdfda3665dafe2df02abf1d7dd7babf9d3376683087dfde603d09358d995fa57f4644ef3409a0893c033d82d655de39bbc27cdfcca23fb221c90ebfb519843fdd26e1ef4e0d9791d7264f7d46977ffbc6c7078a45913288c19a80dcf2d7e6d2c2f09590a4a66bc5f5d96a1083c97ad7c79fe82a36964045f542626248c929b9c0574be3983adbcac06c07cb7112dd60a0c1e97eb82a4c80e35e77ade9dead2249d20f491ec788e3e726614135a875b028e73ddfa3ba89f9a6f447499f000ae4dc5cc0a39bd6c48ca426a696fa8ee18d0d8c5670f4fb46879b7f2b51e0ff1a68dbc14bb237213969ea480cbe4e0f103055b48dd2aea592d9e7294029dac070de6538d2f439cf539426432a3b6f0aa406f346bc15106de4059763d8289de32567a335da5a110182f24578b9401b0308203d2aee00eb3eacf55e441f7f2bc527f8b4afbc96db31f702d928c213e150753a3f1180222bbf5739701bbf0aa80a3ac4d35c041b6f8b7a5a3cc90afd580465fd5dd30208fdf1caddd8f8ee99c71b5b7862bf7586892457615ecf66bd836b8c9cd81400dff9c899aa1b381641576a33e516f93da4f00471561b1a9a49827e19123cc162eb1a3a9929417f0f093c01f1eb0e0dcf74c1bf2224f0c4c5ac93d0f9cc0bf27b488323bdd41d8dc684e67c8f4494707dea1c5d63ba66be8e2492b07eea8e5663da0c7c8fb4393801a8120c41d11fa381fd16565d5deedb2276e7b3c9d292699bbac80d6cd0f1a7f53777bb7f9102b705cc18b6cd5ac158b26dc080f0d590551ca5dbc04dda4de81836280bf7b87475a96d70130262088bd9b6a1e1712e5818f2d26d424c1ec52412bbcd8206622944a5db044cfece1c0e9bb8641bd8844031bc626ca36a5c588ab7e430a0edc592d016605569c1dcbb42a73007cc3d9bb76bc19c37baf39611b77dee2a339a83a627d18194ab4bf591b43347ba431b011244b7a2707a11d1e71cb0247f222c72bc72b6a0966f1d22847363110dbd91a57141297af044746e5ccc3eb3e83bd15e78bf8a03ba9e390a67bd678ec85b00173d1b64bec66801915f0f4690451f013119184d85b181438c45da16b4fc10870c5e157aa8b149dd540c16eea27012580087f47b2b5a1dee35a23cbf803fb14b7ce3f8cd426b491455de680e344e3e078e961cc4a8aefb908a9a7b6c5f852d1ec1d2a4b9a7b0ac42207fabc17c396fc0e33a57c6b5ab0c865c4448d9cc267abd09f443650bb164612c922bb8934005c96d34c82356eec235884a1074a3974dcf36d64339d92c2e2a14d5fefaeef7e489708123f32555ea482efc2762b875f4b32e93360d3e877583c90dc28ff01b680abe8306650ce1b6f582ecf4fc953debb405e0105aa1479c9e9f9e973447806141b8b1254cd9e908267e8cbdca7496f772fb1eb8214a666f50c8d67925f5925e43f45fec4737ebc93aedd895a6a4bb861219d5c72670bedae96285b0a1206590103044333a658b56d482f6cb52ab7b5a446685b8bf75db480f0396cf630db42f3fa8145b89ae184adcb3813cde0fbb0f64e1a4f774945829903173c7475f99a331a195ce6b251ee74ed3d113befec157a431003d690c504fb71104a49506176d38c891ba414b0a6376cd65be3ee552bcfb441bc3f9e1bfbf0edd1fb00001c26dae87b152ae191060ac73b4e2277c9205361a96868f106eace2116c6b7d7ef533432309f98a21f69b79600e152f4e579874c40457944f6eb18952aaf33fd46af99bbf493896cfa914f0462a05b8d1a40469d121d05fcdc611502b9cf08c4dc06f70d3d07980814baca39c575a5683e8d10cb85c65036819172fcc2d79a232a18bd3ea5f0acc09f9a14b1150bffd72cc363bad36d6f8afb419013a60bbcc69c027df100da8bba8afa6cbbc187feea3006b99409e0b43675655bb832e2648a7eb3e4edc4ae27d4d67450c5e7a8dba52330c2cab1206544671356ee834de38a57a02f3737e81718059e4d4a6bb797db95e6b920fc04afdb1460cc101f8a3b04dd753bca01a29c42ffc0eb821ce51adc2acb79583c0f185cdde2cc8e0e0dee4fcc572553f9c997c437a6886ebabf90066edf7f3c28a521d40b7b28bf10574f1f31af277c0d38c1759816338d08ecb7dbcd7c06aa96cf5a7f9059fec7e88bf768bf4550e764cf71c0185f14f5f10a994e94fa50e52c8cff1858d35ab2d1ee0ce113589890cdbedc32c8b0c51287dd9ff1cdb04e36aa28c78c14f1ccf645c023b205de34098fb34c14f9ff0cf1a8248f0c0042629659b75a5c1d4f8233fd29c922509fc5366e5e12b943c2c41ce04612045b0a2c3e8be0f76af8d740206a3f81c459f29462157a4a006085a1b963d9e4e37760d899ddcbc9d58a85228d084475c20600b27e21213723b24ad3cfcb77500e67121931740e82493cc429a5af81316b4e4160b845f13d391d27bca82e9e9f09212153c257fc508cc5a2a2fcd8d3d1f248ba88368f00e330116bab5e09cc83e32f5e29478ef6050cb130955d9cedee9649861d326ad8fd3977bdd52f19ae40f699af638a796f605138798319939d67fd24a09886ff629e8feb1b920b0c2d0a0660489fbf1d704be7f45dd37e7d4bbbcadca5bd009662c85f85106c1ef672e36f9db92e6daad3ba6bf2c570a0fe4f26d90387601825d442539159bcfab3baaaaea5342f3e51b9c9d1d56939ba4a38942ae82be0cbfe608d8f7311f307c20274aec73cd942e34f7b10dbe3093d4d5c10d81c168c6247ecdd1833621f7b622fad8fcbd74cc1eec36331a738bea510e8cdb48551f52a2d114c4c6fff0dd87814dff7682f53644d22bbc3c1f4c34a0d2aae61100aca8e7d9f5f82bb1a3a6d6b2c69671c83a5637bca58a70d4eb2c50ecd94d15e6f5acf301b23b62e29618fd368133cc0a942fd8b5ea1b52b3e2c8fb7abd6a30ab56b2639cd253552cd4eba40fe0837890c6f4e1383d8557a4c6132e8b17dd0ee4d0743342337cc70122482c22f234bef6bf9f6bed54508a11fc877f7701f985421d5d4a008a5cf419b4200eabf3c6d9fc4160f379fed2bc9584960a63af35335d80ec5da63dc35818ed079f61d01aaaddacc08f3635e774a32b5419ca47dbc5393fbd056d70bd3b81d454ee751eec082f824026eaf0b8472654899eb2d5ebd497c4e7565dcf642d32270674fde57720d43b7011dde127075aba6e29417aa860c6e926c7af1331246ee8a91ca5462dddf694927799570a5fb023d38737c52effc34089d972ba6e42efe6a5f95755b15fbac37d13b3991704db43cc6c6543b3928b03ca5f6ceb6b3b5cd6400c326db1a0f01c275c7f070238950f9ccf96f03f1ef7a52f4eedc1f54e20ee81921a3504b18693c9542daea67607f57c1860600c1d722ceb74e81a00d4f8d0989797a3f6f29b48955b4be028927950c2304a2e64789931ebc26a7fe548fa11abab5b0b52ff306c8737514bc06541f459b68e229ad74917d102bb088a6f8cf2bcbb506e1314e82fc77f7b1d2b51e3d82984ed893146f18f037b157e8b21c0e2c3cbaa72378dd62c4915221ec21cd30eab00fa407c4465f16e7d801b8f4fc59bf61147cee21553c79b9e7bbdc310b920e268e414de0bbf166d7d0c397dcade9fcbdf29bb06120c1fdf2b622558945d6dab7922771bfa8f061e1a9e953a901d85f1666ffe94aad187ea0898c23fac5fad309ff2e6efa51e307c048ccf184edfc5368f78820f598331b72e154cd6473959c006aff9d4f5057eb722a4432ac0d9a021e3f731f5f2a53c95fd0f27b461d29bb7a08d4b33d20973735277b0dab94ef7c1578c181e626aa693910fe4247256c1109399cab866623a1663a63622b30a727e7a3f3a9a7b7064ea7c8721bea1056be038ec392a2e485afa2231859583427853fe9172f0357ed6ac67106165908c5a8b111336ca81a77180eaf3becaae2df112e526f37e23374ecf20dddee3c2d1f087ed47e65fa001f481f61b029cc78381dbc18386c7931d5fcd362bfc02e194de341e2f3eccba714f59405976d9963a424587862e21fd4ec59f5a12648e10c8d6300f5158cf39016f9177a5fc83e115d698304ed01eb33c447163cfc8b4713435606886430026f4111a92a22059f4a72d44c03d3e0078553a818c0914db3ca65f5210d569469f5a5ec7d87641437ddbb14124b35a61c76ec53cc11b80dfe4890ccdff54fca8d64b9b9311493e16e3de6a5eeab9060b93bcec0a2fe6b90f9da37003b3e4c3b0bb9f1704bc959cc900b4cea8285b1b7de228e42330603d133158d100c62862a817a9d9aa8614d960c1c4fff11abf43a19261f978cac54a89d128655fc05417aa140f4af2172095a70688c90591316c4d3125cea64676516359c4df624e2165f5943b81d3a740d9451620db5223a042d4de76af932cb5e549f1d4abd77845ebe7771242275e9308b3c2e8253e8a0f5a1ee2834a3f446302e47e791063617f1071b54cbbcdfbc5f9a29eff2da525c5d57a77d7e152a200676996c81c4b9d27447fd1b45b8fee28f992b5251f41bfe941f34443e850399ff1d8c7e8321e50d0b39e2e5517b4b4ecda240ebd896f208a83443cbcbb5425f4c9ffadeb9e7ebfac05c29316257b481d5a68d6c920b8fcefddefb27242cd81f3e2dc54e21bb07293f2544945b96999bcb4b117b8338dcba0fb182167367e2d245a26d8d438656e56c0cf8786a4c2ca0a9881cb56bacea596660e50c7f86a8a7339cd41bdb1c95b8527a7a11f4b288b8b76c587d75e5c5ee327e88b31ecd6cf35a9964c2b0f1c3892c14f20cd9fbc6c61ec61f3495347d507bc3cb3c89521ec7d7819fadce4bc79de494957d5ef8d2fce83f739b37140511d7a533d8f90934f6baa45da140f8df39a7ad7d0c2bdf41dde676bce2d7a47ff498b537951a5b0a37fffdec61f7663c94f309ff4662e3b9c7274e1a0b48cf4d54ad1a8f0af922c4c15e8dfa74f8cda7acbfb80440287d826fd0de25d9bf59ce6630fb8d0e6a0fc8cb73664059890b33a4e085fe6ccc1f7395e897e534e4a27d7af548255fd866320cfef721bd63b6d3459556163d8089b2f8602dd3872147e8ea57c3c7a1eaa80560860178021bfb208493e357d5b7807704d6e7ae4aaa506f8a32d8f76e36cf97dfe034f14775b6069f303f999ba47c478e3c897a74f5d43213fc3f2c5e46e591be66502c1368629d304c16d0163e7d0e8eb4fdad4e13f3a006a61e22ba88ccd3ad21bdc9b5170bf3de70cecdb1f6dd4d5ce3ef461fc3c331acf9db03c5841316e705f0676165ee11c2bfa4c3eb90e40c5b499247073e42a000b464f509e8b6af7ed5c382a3890327113a5bb57edae513fabdd1fb0972e2aa3cb6a319443a3f9ded3121769f7a57f5d378937eaae20f6a4e42b70d9c00530de0514bd130f0a2c1778ee185619b8cb27a9b7835d1e3fe16637ea5c6ca2f1dbf4e1d1bd6eb23f202a3b98bbae1c39823429202ffc40ed03985a7de60115040509fb03b53c86ee5c0c7149ab7ee18fc1fe3047f8081698eda89ff22da148de519d24f2da83b2a2a9f598f42ac006a984e05569a225c436b216593c600d2b1f4f2c97c9fbdebdcab629b91ffc7be828d57c247d61e67a99356da8201b68e5befea448c024cbbdfb48cde2b6da31d37ac12e74e329f7c8f7c9e96153eee4ea528d2249e31d7e57959a2440380c94c96ef1fb4bc040430dd1ec6e4452a725446edd180f67b69cd5a6e45eb5e7191c14b97ae279ec4ea93bf76e17621933bb9aa33058732d616d787a9ad96f5a09182e8c6ad9fb6f13bf3696b4610c9ffd6f38b1f1b8cf4e939181304932acfbeacd065209398b75aa710b9af0916b108dc967f68eb50acae02c2884bd0044eed037c35d13604d1e1ac22f8aacf6237bd4d859d24e2710edb7c85667c36026b71c3cb56a68839ba0522ddfd9dea52b42e630fbe0902aba610f7c1a392e3336d7653b6224cc0d681f478d99a04ee4f46238606a5461fbc850cdc221dbbd64c2822305d1a91409a668a4cf92229a8a0b41885de2e4009f5500aae0102df052b89580063978503e21a5d7085be6d9eebea4a2844d75c650292e80b3f07aadcc55982c94fae8ab26a031aa3d7d1cb11028fbad70e1f33e03f1fd183e0e22eba514096325b3a08ca6822247bbf45c9dd26d697c981ebf892bad669610001630c9a01c95c9738f6e8ed1d3cfe5fb718121765cd8f931acd03ae37174af4d05243c912a680280cc3ed1755f0c854bc005ebccb81c1510740d5d428cdbcefda0c593bfd2a9671044ea66fbeb002b356e4845b63659cb7bc311bff3dbec5f328e8426de68962ee89b3415e1b54f17bf6cd07f28f3828ac0d949ebd16d3b0959957d393721a72fd5e50307eb84127756cd0b824ea1f42238d8af67fb67d108dff7a12f723048cf53ef2bed05c2547ba95040bfe0ee590e151dd29ccbb735654122ed118bb42e8d5d512592b6e8ba7643d3aaafa1dba2b44b01fe943e795325881771bfc2d5cf3a0a2beffa9fe3cf469760a2fddd46ee5c9be5c0d21d2f21a68704c8458d824c3ac2a288bf6c306e2d790625e57586b2abab7680b7ac0a85f4449a04699aa7e9c4615dc75805496ad461a5de07ca85b837edbbcad54d1dd5f0d7779e3648661d19f0c12bb88bc710616152a8c76364d0340f64d338680b0bb8d0b3579c5b48e5aa698e6f1153d79ab5db0ebea8ef7141ab4598d50a0c842ab772ba599ec58b05620a378f24a8bf8376d930a76fc26ebb4e02562f2f835b30e6f5271e1b56ff3df0ae72f9303b3b5ba16cd66ba1936f93c7790c5ae5dec3b25cf56f85f5857fdc8bcb5200e9142d926c4233a51ee94df78da63a960d6e9e0acbca03c689fd5fb4e4fd4c3f3b31c7c00d1a81e5bbbd61607dbdb653382925c9f4f598cbb11e93980bc4353fa20b4a59639ae92e629813d35e32d57020d200f192cdddc63490ee8e215088b6aa3f607943a1833df4735de760de2d278b21977f653934079d8067330a3d359be8ef99ac8797b62abdca4b40e458595ad9b8d1fc286faa9070609426c748e7e230265129793d416f93c3479704709d2d61a40efc4f51f541613351d6c2370c542b8c4013a65240d5a9e0af67d6eb3917d6a590dcdb4843ebdc6b4fa48c368f32c66af0eb9872f117efc0f89d0aa33ae1c3cac910b02ac8904dc73c29bd5161f7e001fcd0c425e3f16ca97c16fac1f773a807c68ddd37c4b67a71ee5e6e8351c087ffed9b92958588e049f45283a35e8d874c51c84efb3d707494eff39939ef3c467a1b218464efeac92f19c9834092b9449ac75d9d8918d3ad87096780b605667a46870d3c614bc678f72959d87ed005f8d73b7c1cc1669e0d80d91a56aa7f4759162d377b3e70abadf45ea0d723c8eed41b9933e03a3f87883d8e0118b8eeed0f9ce404f4822c46e95c6697c3643d56f60f4456199267e1a74ff4f195e4d2e7a881cfab3369429c2c2520d03dc101a2d59e06682297093e01b761da7b6ec0a71607b06a40c4c878b052e28d4c7eef6cd11b3946fd22de50faa8df35221b17bcf4c3ad0032db02c403cb71408c43a58ba439b492c1a0330a96e60585492d7a84fff363cf0f3f029b3713897512fddd408826228dce54250243f674de8313c4ca713f6e22304c6907121b2f9a0e72e6ef0e049ee55e91d5860cc785ea46699a63575c0d6efc50ba2cd4630366cd22ce10b6d227da2daf40f90a37db31234c53646219b166e0c0f9dd1b8259323b7b14318bffac530052fe293987e8d15493ac24ddc3cc64180dbb58bcb42565aa0e8b827417e0c186fab0c4963e70cd433c1978594cca8f6235992679980c68cd344bd9c551682fb3c3603a1d983698dd15a0fb7c58c8462c3aba145243a638087cd3234971e655b0e636f63dd17a3e3f35585295357d5fbf6af6dc883416000e5e1e5bff2bcd143ba367838b015ae3b024691b5d2b6f2e3f0c76af20653ca3ddab2fe69645f09120e317d2db4a472db2e80872e163a8d59854ce3dbc9c1c90949b36173650b762a11d34083d35a4175e3a392aaaa35c3f30ebef2ccfc8cfee1120758f5e44883931e09ea9e39f6d48b13cfd40b8916e206d4c063203277a6babf578cdf3089742ef31a831f06c0c0d959d30033171dccf385a703876c3248663c5bd240362737b8613e29793dbfae18e6a53eff58d34339789a1040e50ae47cfc7d8446ba793aa416585fac7015facc7ca4370abc9b02c866a01e4a580425362f8238b6d220c5af825c26c0a238406e9786a6758816652950ef5a3d10bd68a9ca6f8bf3010ed938a37b795371603baa81bfb9a3ccf1737b9d91682ae0fbbe097e10508d80a4a2d8723ae9d2bf8e77f32ec1e0e42d93d537549e93ed3d388eb72512ee0098ca100c5dded3054aa141c7ed271a84c7533f5ea448a96ae3359dc2d3c09d9b8766cdbe22a3248a8f2cc98c2dd9ec065d4f026ecd91c6333f0b826553601f1cbf90932c486983cc31b99b8768978e12d74057d3026215f61af2e157fffc059b56c8ec77be8ad0ace0e888bc32558f660dd99883da0769dd995cf79e36632fd464c13c1553b674830bfbc7971295fdb17790b33b517735a1db6ebf73f18f5811dd52b65aa4336575616cddf2bf6dc4edbf8d8011748bfc90e98828ee49de8c7461c830f9ff4c7d0d232e906663f8577ae27aa2d1a302bfaeffe43f63dfd42ac0899881e562672620211625df5ce80d2d016095591106634daad4214d49f8d044c28e573dae56eada5c00dabc494dd281c510a502ae302b8ef3ee65d5bc8218f3c47eb9fb8078e7265dc7134f254e812cad6ab4fad0811f1cc366d67261f4b0933117feced8729ea12d0be5e7874a1b753f23877c7b2cc9c9acc1beb389d14d5d93f0819700f6631c72a97c1cb8388ee4978b7057d36abbe4568ff458f0bdd69b7338e8a723b1f55b0008245a9bf5a68a488c973e8055d72268f3322d9df0cc451cb8d275ea09e5318736165da4e37eed7a276bcb7867db3aa26cb6fa743aee3e9e68d07dc2d595b68c2aba9a6bf72dab04eeb06d921ea65a91d415554b629311fbf6bec9422a038110e4a344586a6723f64860f19dc65ada52361bacbca4ee14fadeeca56eae482acc5856d50877de5d756ea1cac7995bc9ae51cb68c010afc3a7f2a8e3e006321821f55cb15d5ef051f60a842f7bdfc941f00d5c01b772f7e3196ea7fc99dc96237389abf49c154e76d18dc5d067e812cb1b04c4611030ba341373c6a8315c074f9e5fb5a820a905361bb77bc39e33b37368561a2a93412470223803f0e4ec8fb2129e77a68a0b6e7a2fa33230ac5a12b017ac05c1e63282597105c94801f0962ae4645115313acda719a516eb24cd4c05d4b01658369db65e5f74dfad437b96b79a92beb0778afd90a9933e01d4f79e9f293be932a37f476f352d67ffa2ab824183a1b8a019d2057856d983553ff8388b413293bf183248cec47bd39e956a37c9551d42f7051a95a24fb84cc1aca138a7e44a3979e0484394c282323a2a0c09282d491be636bcfdccccd0a14481990a409c6631123362228439a657f9d08a5396944ad833da4b1cf71e0fc08540f461b0b8db440fa019448370fdfa84add73d1d7240c6a0fa786bbe3272285df9d3e09540778600d585010f8a57ba5ce9165542b77211fd93adc21b10e897cf9ab789865a824e888475481433406f78f4e3ba44f1c6158a8ce1c843b5d6336d56092ae4f2522c08168c98cdfe7363803ca9632407b60d48b71af5b5214aba5872eeb481c7e4a5ead68e1d4f557bfcb7c1aab47634519c2ebf737a268ac0e6744b198f070fbecd9577ac6c0930713a8b85a09f77a388f74aedd88908651083c54f607512380dd6c44ba27e8cda3d9404f712604576376be7b5b4c233514b6e09a0a68b12a78946ae0391611e4fb92d0676f0048099c214af114caaa54abedb1c49c3715227946aeec359e55e27642084b4223998be466d28ec71b75d2065e6ea047b27e44b47154722cba29ff309c3e8e24bba4a3dca0d202ef812f6f0bee3d71da981d1c434ecb733c66fd1423a88f1cbe7897dff0a2da568524e86ca25cd2e5305c78f11157bfdda49e374eeef5fc15d17b48eb0fa0b49a907ec43e273705ad0ec55530a4eaa034c47d437de5e1a2a5bb97a8627ec0303ba131e65d98dbf67db063127d34ea2c7a5fff463be4f27325393ce700ace2b6906bc9391eb09264d2b2108f1912992d29076cac198ba506da8b66265c19f4db55ac437b9971c8144fc06293b8320b862d37d2fe71eb7e8637f87161f26ad9bea2db6d5666fef0202163fda8ad8a50d7938a8f8cee111e704e7b5570ce7e99dfc78d5be07354638feb91da2710d9dce090e3ae3d57c679fc6fe3c6c56a77f7edf52a6385fd95b816dfe0a16a6b121ac1f064d5d6d97c35559a12bc3e4724faa354be62b3b7e83dd1c6ee0d71738e8927852fcde82e0e90734d8213c85995292ee059da3d43ff0c8371cfd326ba24e926f5122c9331a2c7523e01ed1711bb81356a7bdfce366fe153dc96b4201c8e4ef4ae8aa62ffff755e67c2e8d11008d6ceadf2597094d3c4263525f01aeda49ade2bc83f2dbd6e69488857aa2c4f2d51159c49f328e392d82c2fc6652e6b9c025c041c2a128252e4194bb28759fc936554949da976ce7f2254e12b2586326d8715027f40d1b135fc8471fd98b778098e0167bb38e9ea2b150cafb89ee72e0dd1cbfc5bf5e2d4636fcaac3cc5a1b8d67b8420c4bcc1b437f2952c1ff6c55191745364a4d5c62a0cb8c424125898864a3a2b03d5ee52310ea8e47cf3a8a85fd16df81ac0847078e75979245bd63da8eebf1755cea13ec0d1117318103d1cdcf331fcfd32e6e00def272c71cd5589416394969df5a24a10b37cd6c9959d1bb9b76ed99a07fa28aa570c9e02926f520ba14c1259adc087071d1febd477df3bffefcdd65c168451f75a750e562b4255ca514081d536bdbbcb9e780f4a505790948013aa5cfab2c4a3aa1a840332d2bd4600a6f1f0cd610870135c235f3569f6d1c6236da7ec286dde59f6f48dff23b6957772f7dca4109c9208a97625085202b37677d826913ce5bd1f101cb3f572fb441996939f769588c22684c589c51d976ea2c5a1a66c7bd01f867fd4a6b0cb76984ed44a1e9a4037c9f44ec8cd929173ea41bad4488f0b8c3ef77be20d922e079190c4d0a775e183448832e11546822c0d61b982fa7684bd7a8fbad50e2bdafce9ca90b9d038f5a31062b92e26be4d37af91bff2f5a2c1f9ed09d80ba4e88047de09c10c71313a4d3e744425db9dd5b3ce3d24453a35e36db519da17e8e0349016d0ecbc614d4ed661311843eca437fdbc11f46d40d9d530fba980936d8b68ef6d7d2c1d4fb3ceb50ea019a6a80afa82c81ccc66c97201d0d5caa18ab287e8a6c5943bce421072c3b37fa1a37015739dd7e33744693bd4756559c0a15d47c27091413787e8e0234121403f99a6180dd142801512935cb6d6b83c0b6bacf5182bfeb9fe3267dacb48fdb69eadd7224d1a3612e8b8e4e55295c22cee24522992366ade81f84c677cac482565b69ede74afd2467c8eee4a5c4c4c514c783c031ca3e572df2d18b96b41b5bdeb3608a475291629555b07a72e05d40cf4827510f2a08fb9e9f13e5768bae8d9b28b5585b2a3d0ffcf1116fdc5d8f0c19be5dcd5d9054cd7b8ecc8c05e4acf06d92066cc0b1fc97dd2b9c564cee580cc394f29b1d36257011cf15deca4daebefcbea471f50a1c609117f95b8dccec00f42ace9fa3b748e381757f45bf1de4d950b8734e9db0f07b77bd2b14e2b11537dd70546dd98293850583769ab751fc29dcf024b508d91c46773a861090b82ef1ddeb4073ec4bad88a623e66deda2efb3cbbae04340b2ec2ce61df88b07a76e3a01a724a813a19c4b11d29dd25f7055cf5f351bdedf909c0a97ec04e7b8fa430e491914ee968be331e4c592969d8f5c390a1d81d5aa703c0d4e1cd6d571367921e41902c9453f4b17af0cc4787caf0087cf207f27fb24bd5224dda9c0f53f635280ddb66a49dc3932cb176d8185b445631ff2d073e5d5c0f93ffda2480fb1a92a2cde0ddb8e706f9c1aaa609b8e9f734ef9e51d272ee66a72cdc7ba7a481588110985000c332068da53468144e265f5fda1dd985fe7214f3563430eb8a857213760d53f1c28ce1473ae711bc2a3e52be7c10f63b973d91a968b29188a438e9b996d7e45db829ff905fe3f4fc323d3df9328db5800e6d8c4a447cf014bde0034966832ffda9e641eeb1ada26d7e9009b9863073db46b4434a228a8cad8ddd247b44141bece6c6021a53dd83f579053df340a4ff5122e0491b774ba2843b14799c9a969d15e9afe80381950ce0aae5c61a356b0beacd20b9204936b032cca8dc7c68e51beced44d33ae304f5dc845543430b81c7dd1b4c6d2fd0b54388da9378f22ea1e4da5fc514cd0849d76b84c9e29a059b7244e35fc41365607e304aaf7347fa65f8b4e70de34231fd388721cffa894b1f0799a6cb724732bfb13ec5b8ea08d55e42a0a7033b364e8f1a862da67365fee20d1ed2fcc3f905322dcc56ed01d754668a61bc3c7d29335e9b248b2be0e8e2ba4d36a27aac7dbf0019bb5c38998373ff500b0c9ec27ac93ba02c761e86b1e13ddda8dc18b27d381dc26947a26f4f0d04560b61339f756bbd7ee2ec067bda9eb775dac9a0afc0ca3758c70a949c0881110aa353879ab8c689fe308579ee47d3dfcab093fc2202d1a816077a7985c5d42ad3a8f6b570210492076636fe17b8abaa389a4fa97ec0499a0cdd33938b23b0dcfe281494222f8f8f5c1cabdade435b5058fece64fce957347774377dfbab988067c80cb728a755d190c34654296f015ba811aacedb219e83044de63d0f46e1d7eb2d6ca2f1a0527fb23d7941968a56d676fe6118f29196fb91ce71a1b108d5b4911e462aa41882e6e9450304c7edd5e8eca6a8a4eaf9238cd560c388538e44d565bdd8eb97cb53c3f9578184d988525fa205aef88320547dfa33c4fde7695421e4bae0e4074b0de7d1eeeb16ace3f09e0d5eea82cbe6da6603285c33c5225ad2a29fed78fd7091d971e092c41b801b5198842011d4743dc0d427c00e6a190c2796003c6a86922554db7a81348e79f9327989a84a35cd254ce3631e13928ba45deaee57f647418043c9f53cd2b9abb7d8decf29d53eb7ff171a0b3cb161d60f8b213fe1c0eee553bcd02be05bd0d7feed89b63bfc95646763b8642ac23b9e421fdfc27078734ea0cd7211634cf1136311f822e1dd61918ad4050f638a7b1bc8e6aad523eec4a4b29881a5e43228a1a182ceb7956bfd6a2e0ed20d60d519d70be183ed3858eb2bc5697756b2a4ee7d267ad85dae9d4eaaf23d97db4bfff62d33a1dbe02b9fa39ca627f69b31aa7f6c96947f2d44a18f19609c7fd022c12a599e422cc935947dd13a22e54a7beb9bfb161a5d85bbabad98ec995449310d544fcee8f47e6d9168dcc05408634a5f220349e84a4e04d6ca475f1e1b959a53e27215888452f05d676331c5dfaac03f1ac22c2dd9d13f1d35c0678a420f914da08366c64333b92db4d2f950b0857db751c5ef03ba29f3f5383b19c846578b50b1f6f0fabc4b44f75e8aa17aae9f9af4d9a19c61c66293dd23141dd9f8587d5034652d303b49b09e8f251fc2865f5f77ca67745022e23cac8ceb7098da10f17519cfba16047f85fe723a1f7e2f2bbe4efe6e7944f299393c8913cbc3fed647c667ede08ca592f0e25f549cc147ff3136b9c26e841efb2dfbe71f473fd66feda3060b3f5a62cfc30f3f44170884312f75861ae04576e2dac00f8eb34af0405d996331139d1b7c59c3df66901beea3499876fc6edd9b2ecfcdd8060cd1d165c9d93b14a5f80739d2d2cbf6fd4d94557a55b36ff7616bf06336a3c664b76d1ee7a7992a8499dd58139f91f9bdbf593da9460f848c5bae4b5ff40006fa15647f503997609bc3d68f9cce015723a26cc36efce6fb73e2b6d8d1961eff7a42c1725b3892c04a58375552fcc44ae5eba0cc54fea94b51f9100dcb69b06bb2f2101ff8313aa6b539bcfb2afd83a48c83f3a7c1ea3263179cd5678ca511da71af9bcf8debd8ea0b107a587495b15505c25daa2bd8d0b9c71c56821963893adcc2ecd352c1818ce279ec296a1057fda8d200fb555a6af579bb08819437714f729d882281bb455e4a1686540a739328d6ab544c8f5969283211b11881bcf4195f881591ef1b227272edf27aae96391f9fde79cb8b8f70824a9b3dc3b018ba4803fdc751fb294120a803e7ac4f0653ea35608cd4dbf19d75e4e878b892d3f273b7a408ef970f91d687905264f984478d90afb0f6ae1fbbfb4a39c5137e04d6f7b1ba1e05717945013d9135a2b1db113a97790325c9591bc9eed758dea6427755db785e5d560c2d0014f79adb773c7241d30631fcd40d1825c6ba95adfe7345d1e3717e5a84e42b0149f057d5072dc8e325d3ced0f10926e97088df1ebe9285285455f16fc30e1bce4fe49f7ef86cef32ff62c3915eb47249c405a82022acff8c682140c9af49e66b479425ece051a6205edaf16bed18714acb962f76447b373756811cf3e8012702020d6eef63df4c7784af70f035c1d807cf46230c915688cf4e850cf2b88ec9d910eb07e347bbea3efa1f8b7e18b264e508b9e62dbd166c2cdbd73ab7b4b8d89a676450fa083e1a39b207e930f20abc70ac16f17611e7779a8c54d708a82956b2b35fe3ed0d8b98289441397499f0a3db696109da75b79ce461e4fa27f60a6ef72970167c5b1ba4c027f327a6f060b7c38958fe773d1702818235ae73eca1b1eea0b4f88ce1f04d2e9b2c46bb8e8d1cc4f676d5e8f712fea9f8439e127ad0c52308ab0207f3613f949de7b01abf25de0b1d2e7246564bc1ef32e796d045d02d6a4a6f4cefba5bfe8c0d677365446bb195340a70e49a6f28495e59840dce7096b5fc44c42e01dbcb19f1c5ad6a0d1dfa94a7432e827d08e378246a14acbe3442cd2f2f440d22e6ea01b3fdf6768e685f39beafbea08073d7f657714093d37c02d52d2f632aaacdd039bfe36363bfd64dac4288bfa0324161c1243f4f3d971a9c893b30c3241e3ee14430da13ebb531b5352820f3f88784629d3a4c0fba8d6d55b65f2475388898f80d26901be1552a8d0846e6c6a960c2dc36e0ce7ac5137446657c2bec305b52396c6c78e343c5e913c0de4920ceebb03a153f2f242da7039d5dc29f80c48916bc7a60604065ec35c0519303dbc53cf52f312e9bac347ad931b391b90500cc448b1820b68a5228eae8920e5b31de04b1b5363da0f8c8d059d2a0cbb5db2c6b5b987f107a284838972a90396c3cc5b5b4a2d43ce2be7a0d01c01143f1e0960be3e33948bccacb8e12314394a32e9d814c99b74eaff81dd02c32b6fccef193731a1bcc7af130a036d2f6b2ab13854527cd383006c429437dd0a1222157716ee18ddf6e8436ea4faaf271fed5b922e0cff8b2118ece54d580af9de561f01fb3292a330c4af678fb4781dfe1c9dfa3ded9a7da013afdd969b611b71d5a1293afbc03aecf7318e0a263657c773fb94b021561a723c6937edaaa039c318c19ab3ed053a51b257cff0d045541767e53dfd95582c901130ad6062dc853c585c76a8c50ab7bc4f762dddb2a480870f848e6fe3682221dd79d9e04a44edb425fc89d10455e31b221e039aa082e369cf4d8ccea6539ba108233ae3e71f73b2d0029b082253b35058b9c5bd89f11dea57fb5bf84dfbdb968bc30f1cc621d13e9733cae8dadac8fe49da90face0d6a9ae3c0acdcf2e8e2bcfc3c50bed3f6c36270761ddb0e7c17a92a6c48e744ebabf892d789a85fd44a074542de85c1ce614b734c17cd2cc8626ed210ae4cf08bc3f8d4652bd0558a158b156f13431ef80f5cb011246f549925579a0bb07af1d67922e020e7e828764bc87ff12ecbde0cab79a6c3bec6415e405b7c8301ca6122b18f7ec8984f4d76aae3adae2a4d711e446514da74c463b3fb6019426ba0d1cf30365772f1656e050352cbbe337b85dbb9316ae3c69e689a060581111e6a1ac2da39be2b82cc7d739723a5cc2673bcc2ac4a7178552744f3b5b612fa3f39d29a164eaa66e39abd4bf9816bbf0a06095d529b59a35266d5ba787253ddac7ba82acf2d8526435df80bb2ec8fbb89a62468caea6abd325d03f50a96108682b879c8c048292426d8a821775b55d198bdc2836958e12d327737149be8b04fe9f410b41e239b11b81a9bae5c715edca7bc3fae2b1a9630eab2b0bc1608771251215cd39abdedbe258873fb4e7e5bfd60c3591aee867ff4e2063c37615f9b7d58e1510ec414a8494703667deaca939921e5f37436538e19def2687341b71dfeb0a2dcff66cca33944209e6d6ea0bfe04c91e41b0b07508f9f0665cf97902f40a0ebe3bfdb828c702364f9c5e14291e434fbb0d8971772e285ba644ed77e4e3704919ee39620389c133f26178c90cf87957407d46903ab6c80b5f361b5a27a128c12eb4d9a1834337b05eb5d965f2409cbb8d9e714c58746aa66c668725ff6f9dc20533d28c090940bf83e10cd742552e453debb1cca97e291360451c04a49e8f8a2226824cd408e2b0dfd6e78840e0bff26a39271953b5df73e6d0fd5660e8c1ea183350977eb9117651fca58320162045707651fd791fd0fe750a21ba4b903f0426a4a4ea977189d008d240c75b039c0ef2dbe7b229d20d99c81e26cb8efe46716ac21433b6d8303afa80a3d5834bd0a330de4e068872e7e5d9e7c3c22027bb28f8a9c3aac79dae9ad0506ae01c04d2776a06dab1ccab5893b12ec944a922c59d2ec40d5f43c35942a1f27d88a99a7b80a70eb7d36fd2fe1afcb8d64bb9e61aa470cc65f899ad14e39a9a89a9f7bf3bd9ed2f035ed29eb27dd02ca7f77fe1a5be752b2c22f52c3b02f0dee6ff4a2e03419945914f0ce34c0c098dd657fb3f54db08fe16f6427aada72e932920573950b3fac708332b522042f8449f728d05d8c0f122d40060be3c780cf507d32ef88cf528c2d011c1fec93b1753aa7364fb1ba4b351a836d99de4814d08db37defb1098e9649c7819ce240012e060f1810d7086e0dc3e29abba2ab58357990b4fe0bf0aaeb33947fb077cb7e63ddc006aa21465221433dc61cfe6c53463ea6dfc1d131cee444c62b006b74823f5c8c09bb9eea9314b3644cfc06272183fa73918a74917f4f9783e5b79d89912db5fe777cb21b11c9f81540021f2c5586448ed2841a335ed879ad36d6adaf3d7094ff3ece5932e986dd81ea6d05005bb24d8b302ba6f70947cdde47baa52608c6edaf979af0a80a5d8c4e6f174a91da4bb44a24b4361fefa76edcc632747c2f136b0177fc1b1f10ea60799b2197a71383891025f74d0637ca15318172171915ade269508e3eb8f4ad00cc404f088eae97b2ad98e36793805a2b0062523a218cf46c1ee4f87a202840727f7fc06cb3dbddbbf7ff8303e803e5cc365ac968f1935089afd362fb595b27585d5a3da01d2bd64117c74201f3126abee0b3a698456d51e19e9f5e69796ff867fd969f421617470030134441f1d398091164c499c0fae22c7a01070d7db089c31b25cd0fafd51741acc4ae2dbf68ad9fe8373c488514ed954036f5921bf671400a553c6a4967dd63f79eebb936855e5d4e87c75802bd2fc275e98a9289c31a2310c200097df850102bdeeda6a4e5e9b18a2080d14664e749c2125680e2d9a73007897e4aaa899806a9257d112d723b9d393be4a1bc193c827058e4bae48d0874f591cd6ca34c40dc579c07c1e6b906961d750b054d651cc83144e2d7f0d62b09ce563d18cc9e74b20d0fb973a055d11368d84e8a91df08bc7356fa3bd49b160a807b8311e16e41c648eeeee24b482dee8b3f206c4a1a77a2ee81cc8911f52e0c58d6588a1db5e69e7d76d3402c49198f6982ed279e4a9c98d67690412a620f15413b9022a9f281d98d37fc903f9830934b6e570183199a961cc46934adcaa8e9944f7ac31dc1ab2a180188672059dbc14928f81d4fe0c0aea36924826534ad7daf400516a912153e15be274351b1912f92a4454e6f53a21144609f87e9750fb618a9fe7d7d60443af998a04a74c057ac6417601268a6e5f140eafdd381d19fbc4ebdffdd98c3b94f33dd263ca30f0c21c470026431db8c131c0d26b38a0c2095f541464152a65934fc9d189940fc9e0c034cfb634e76999861bf28bcb7abcf8aa60ab8db755df2e5129cb91e99ac5ecc6056334fc9f8d93e6cf53aaf367b929cb0788e05606543387566094e268a31a0ef0f45d00cfc76752d53ac1c48149da0c68f282d28b286017acd5ab80c0e7fcf061dc7400c973730c711ea9e359772377684c501724feeaa5655695ed724793e511da1a819e332bb6a5e26eff0d4882fa269b135078a9751910a82542dd6ddb63ae0b3da66f3260ced7057bd6a2e3bf57d2aa5e16a1d3445888de05389aca4cca70e73389fa859cc36765a000fca77828c1e2c7a538ff80def70825262682a4f46dbbe5d1e5d398cb00aa801529383aed6222b417815bbc2ef2a4fb041dca7167df0f9e799f4d663407ae4608ac94b516b877410a68f7028f10e033999f71cb928f9cafbf7e19cc5e12157e32ca4534703add7083b3076e69384c84a02f475c69afb0c6ac3ce340ad063b85d86a5cd3b01b9c3487f9bc022bc8ec6e4055538c65ff529e19160a1a887b968cf8d553a7cc820ef523a97da1b075339bb98eb3e053f65680098c01b5e23cda6236362c1a59670435566e0485ecd619d29124ec2c6945d76c612faedaadc7c901179a8b7c0caa05c60a3fc555cd3194b1be551f74a0bc960e4fc952985eb22e6a135f8e91de28bf620bbe417c102c934b200238eeb407936731d5a895ab69e40ce048172461aff2e0846c037b025e45de785fbb81e5f7503bbf3ab16148f8045baa41a44c9dbe5cd112ecb0c3fb70f73ef6fca4ce6f07d7d47b1d3bf7388451f5bf621c86c35afb7f77ea957010bd4440c0e9a25f2b9f6da3f1636605a231cddc31a2b9be342f6b20fbed477247e778c00d27ad3bfdecb69979e057ebb6b82b1e51dcca9384aadb70ba9cb1d05cbf972e809eb7fdc5c8c2137416fb3755915dafe0b4f07ccb8f6725468ca0025b61d4e4547ce163c25830539044264acdd2cf36c47ecb70c14bdd03d46f17c3bcf0acfdb0438c2415b7dc8c9369f404a5bdb2f86fbede462f7ce0ba5f754bd1248bcfd42b8a8e21810c2a510e142ef6e78e9bab4b0c03ede4aa1b15d0755dfe8715da9412a00e958ea92254e122bab46388dd16fe907412a74cf440797b9fa7d8b3572677735d0348eb146285862bce223843c07157aff7ae71466be58cedc075b780826a6033d239769b2d8e13f64061248cf421e1e8ca4d86728bfce6c2f4da579682824638f35d9019a5501736bece0e83dc8dfbed8edc64769844af043a9e25713fa3e8c257256a91e5c7dab58057542f06028d6df7085940e2cd80db80944719d1b2528511f16e83e1e05ba74813ea506e5e3e152ee2f4c86d34c81951f046062c1bac7cafe0c144b66944229eaaa52127e79b86860ca4efa87984c159bf6ec8ec0a6eb520c65ee6f854bdab67643395c29cf0a29ed7808634c526a8840255185b4831e6d580383f46a4499250214543e848bc4355fab7b1d887d1f26ddf33762bc6d3f87194749c13386b377d6abe0ce414508fe7b5cacabe4b71a4159a4f65275a672886a9d0430c7cae2f6cacd41970558abf31c3205502b802c9378aa1c0216e0012d6fd05933283285ec814f92b19eba57083bfa785f62ae9b7e474fb5398dfda2a271e65106281682c07cdfc75695a7ce5ed6c0abe9b8d4c2720da575d47ad3122042fbcc4bca1d038b6e6c066cc4bb119a90338b78e89c5a562b1f4053afdecf43e835db67dedcb04071d1a4f5a145b0e4364a0bdad051f959e28452334e202d5ff1d8ced71d8236745e73f3b76331cecce5c4cc14ca76565d14c475aa6887cd6a4e2712064a2581ecabcbe5d57fa5e0e994a7c68920a647474ae23f4ab01de312b2c06d4159a0596096079e198e05803228614f996b9f106f8041b2a5a414a22bd4b3c35440adaa9e59f69955289113488fab90f67ef6607268e76e669c6b08230412d5c9e55291dd62617a68f07ac3e99b84fa2e1701cd098827f84d2a2fa56df605470d4dac3cefe41a83ce3078c0424eab28de0c29c4bdc22d5e8b90ad32605f61a55b3aec11d341191972fa27731e18bc219f4d9237d2b0045b53104796e8c9ba10dee4881f9484ff4d9aa82df2b3d287e07629617019df2e6008e4b8e7723e7e10d8b5a66194bc8ca8a5bc1ed2c31f051efd1541432349d957ef082e451a0a99859e23d0368daa4ae80afb48dab2dc001526311e25c19755e1b99780e785277fd84bf0a3207c5ae301ed4a5edfa0a095d88b49ccf0073af0f44c4d83be1838ca221ef105ca55c77c77536841a1be4a06a121e1b337f05dd43b22d05c698f23bec4a5a8f341cb2750c46454d86918d0d0ab0c50c9a0dae9d2b711c99c3b9678e2ae3cf3d93014aa755e77606af0c48b8c7e134f96e48f44d2af378dc93b382fcac1f9616a1326150e802112235d029ba043f092b6ef578506198e0969ca2a82a59f40f91fb7613926e9589a3aba9cec02995d60f61686748c42cba93a7bd2473b61e9a6de7729496ef6e941a46dda1f8d2b422b7daa665e0265d693215045010a83300e2df92e5cae904e68b882f063962d760b6b6b1bbac45b3c06f5c44f0c11c789bbfc96491b29f3da002c6ff1ce71f230c8cc2e5ef6e5652c57848958fc7426bc782486744993c67d10d3115c259bb8a55aeaeb000677920701142f08c6acc2f20eba053dfbdb000a3e8eac4a2822067b6a2560e9fad849e3051ac890a9880e60010fe93869a963d439f152e6e5358cd7b5d610b22116973cc7612522d5093c8d44e9ef07d86c89d9a854b2f1dd4a3c1780696b2d0d9aa5daa540faeba08f883b276bc1c4f6cac97392d2a4e3b5df9fe449185bb7743d24ab32135947f9eae5e7860f2108cfc8fd5e8672328248229cbff3b810d5dfe595944297afc687e978a95b672fe978a58487ce9214ff39a9c14a87e31e615972f27347c0a41248766fa31b3f1db0cf0a23e489a855ff9ea00e30b8b8a4d90f6b5204d4d5e17f86bd62b4d4b65239ced223a098152ed0941349ecf52f614c59b84548f1b955078dd1908655726303e06668d86412b228df1298146528431cf37795fa2f7900ef6465c48a73ca479ed3a9b76f9d9c2e924942579439523a5e27c58ad6b9aa297b6548d9054c44f1bd5c13273cc3583c78107fc373781f6597f29141fbb9d6470b818f6b36af19e194080f95edc942c56e136ae70a7c65b4885e4550724e17e7d91a4fdaa45b7712bd7b57ce891974e5d0a19c96e661bf2ca347af05b2165392395019b1016ab046b05a0df80ab2dab727bd194f54541104c02cdc7bc214b764f48cf660db68684f7fbd8d30db4a926236dc241688bb36fbbb7fc83d7783e24b54a6ba46bb2559db641d43a9ef1ab0c12708932d6e40d6dbfcf726dfb3f6c79b1cda6c27637bc5903540e69271f36a4de665de8ecc49855d1c0ad731ef16c0f4bc8cd669dd06793f6b8bda60bb950ba90749f888956cf982bbc59e1d82cd59370e8a5c501e3c51594e210374151a0e6998ef094dce55d4307edfe45b3bc499498715473bc0f72d8026858adc168cd55398a0c985cf46ad8d64d0908ca44a4386845845ad372ade0f69032fed9055b44580c7db90edd0b08c119d81064141b6b56a884354fbaa4e7a0ee337d27e5ad5e91aec9c940fc4b44ee19984d4a20cc031d087d3788c76472ee8c3c1193fbf99095cf0165d451f6a99f589d2502015a71abb77d0116622b0141366198537648468338085531282b2090781f93c41b0d448903e2ce6bf13ae034eb4ceacabf289a2ebbcbc7686a88f4bbf0bf03d3e76bf306d312768d84f110326ec4e66d07eb7827336b7360512511e659c461370f9096c6f68d5dda60907089a871ba6e466b9c820dd24a3c5a175e3b98be6ec864d04a3089ae2e6d2ade22fc3150b0d3503665fb8709169c46473145765332e65e917ee6df3b631dcecf04e7a344b8180a3ed59dfcac93a85023bb5efd99fc986b9752eaacb181d110eaf875961d38828e67dcdf8fa11456069e443299dcc8ea690bf51a2725a2ca615177bc22a621cda10463f1c8ec151a85e0c63bcc39e1ed655656184a25f70ab944bbd7b6bf90dc40c22494699a21b3015f56c394b1962231880d9b13902ba1658d5a48777dae0525d2b1f877ac19ee165be7823111b9b36c00c22123993f03b9f306d2f2baec1716a4ff7d8bc746181b213fa1bb5183e4536fb1daf129f1b59009c626ee71f6a73bddb9b665cb93721161622470d1bb7f96e9a646357aafafe436447d14207645f6cdcf28d75c0021440078912ddd803450b88b80804a646fd1e3e63f25e2d4937c57bb9d151f61f7b6820470a42f3091a3a8b9578c510fe98e024b8993a4f732865b93998d921a843d1d5f891a962e8582dc9ced3ff9cc6e83cbe7d17bc3d8612a24af29ec1e44da2e7f5418c52e727141022a920de6c849df9a6983fcc34554386a484479ddd04d559bff682668f0454e7a86bb6c39788c56882c9d069670bfd5d977882d01b2831b00ffaf897092f136a708b04384acef40aec490229a592be815bca799a74bc56cc13f0594deb9aad9b07595598d992c67e097349e82616e5e8c07e0e8435a4b6df9d35b31fd5d3ef40cc3da87a9a5df5b99f62706996967126a82eb8321b5a4625fb0ba1c8b2ed0ad926bb5bcfbfe5ddc036f59b148b978542416359a59a19eb66de0cd00ad63ea42c7ce141d9da3653111b162f849d39471d4ffdd32cf8220418be77716ce9cdaa1d21cc6f0d82ed7508b963e363480b3e2839bd4ca87e5270530daf99c68b35de498def965628ee11e00c8914891039213c4ba81e950fa397d2e8bde85944780db2b0e02ae48b2298807703076d42131ea35124adc5524abab9b5185e4161a868a872623f60c784be57e0aa2a67e67f7183baecb4addb971521e6444e2b19f925033c5436dbebe74ac05042c443021ad13f7b6c6d1dcc0853d7879247bc6f06b3b9d5e2d3be0e73996b4355e0c5193d3aa4ad0ea0b186fc3d05e3c7afd5ab5ab0fa49ff285ef83b6070fa440cf2e844cd71630cf66894687c7552beaca27f96ce9404a48e6c6c0791d45a11b3f2e5fbf5d50d910def3eba4fe60271899b40f577b9ffdaa95d24791914ffaa5488ed428d4ace59889b3229f4ec1042a20d3381003e3fd416ced1c05620d2da08ca0f4ea0de0f5b55cd587200fe054cc5db5a7af2a69658e2a50c89b75d7890f91b24817d6a295d13777ce0462c904fdeb50d123a6da7f1313ea7c815172045c97920073abcc6e496005bf2a9e859a2bbde23db81a1a11922fed2f58665d1873d36343cf6ba7b41a611a662f3936ff21ee243292ab9f918dbe109a7e396708928daed4d274a58205b2d54374d2a4408dcc5928e18e07bcb62ae9d47ca1ae16bbaaa51c94be0f3b6523db92b803a4a0cf70139b4d925883dca7ca29cfe001075b6167289e55a28f4658746345ee25bf1080415e72ef1f2e29f7700d0cbee5279c43c586617a78ab36cce894b17a0ab7cca0211d6f3dc724974807b125888556810b8b934d59900812f036a4b111199b2288ab37a9ea5a9fc807c12371bb84f90d7c58290c9c96f7ca24a35d1c070f2ce97ca7c1bb22e9152d4eef9f0a67415d15f0dc3929c955782fb5b6d31ea1bd0550fa1268027683213d26da8b46915e148b1c92096aca4f8afe6173b78adca446bc55126543115ee1b5188e3dcee21b27e656779dd526e69750111a5d1452d9a679078812826199581c0802a0340490262cad48207ed381d7c2c7faf488fbe56b5bcbdb5a18640d970a17d0ac6e7510d11f7dc2ba7222d5f184c027f0e4f6426072359f0c0412b60a1f5037f33182557ad105d86ff11611a9127cc17bd522836898bf9293f2e232bbfd71aae295e3b9a39f41f1678e3595f38134408c4204ae58a1e68f8f207867e283a0aaf60b9bd2456ea0b9c6e170187114fa527a11e60cc3573c8dc53dcc6dc000eedfe2d58bc321937a532165f5314dd1a459384b596d84a3782961cebb3c4dacfd7ed590932698bd318a2152048acb8a8e24c61c80fb12a4d7c8280d511073907db9017aec532407e701b874770cd6b1be333466ef91b6f5268f2ba702c87c99bd1fe9f357722449b11508d7f02d21a574e8a95f33a68a535ac37ace06a37feb45f26ac7051920bc47b1a370dd240a8e003811193c088940178773a94ae412ec308ae7c54098630f36bb98c087f88e9486e1bdf73cc226b15f11a1fc16a220acd95f204fa2f3df71f0a95c523ddf655e6429447c1eea1cfd00bcb5a1554e9492319393910b787bf63fca9089ea74779c17c819b22a9da42dd133d830f46eda1b3594055ff8ae21b8b810d1286214e6c5a0aef763002712de3f89647ce053c36836d5a9bd9bafccb93410ef761aea91173c9fecddded4cd97413bb2bba9f602e8537b456cad977a46611c298ec9b79525ad9e943dcc32e9601895bd2248683017996187674e59711eb915fd9d2a6c4a6ec98fc3df5a4872cd3d9dfb50571ea825d82f1d2770f7a502040d1800c8f8c41c6cdab1c1cd285e56bf88a2b4a91fea48e499cba99a15784de4f71d0649723f1faf05fa4ac61cda94a3575cee8e4a5d50f4d73231a5e2dc63bad55908c01331da50e5fab742efb6c823e953921d98855ed6b6747df0d102a1e03b754db24db05d2c97909371e476342daf2dd5a0f3dde939ee2079833aced0c96206989074b191ff074896698481d456ed62508906abeb00be5c2b627647fc0c945dcc26aadcc239d89cd2d47abd8378f5adb4befa83532358484b1a9c5bd1dcc2d6a862cdb47ab42ce25a807757ae437d7d2240fae66e8703cc9799c8bf625f249370a63c334074458290a7ce9b1da8d71a4a262c950a2431e871aee839f06d038bde0ab23f40abf91d3e30c5a60457376e8e54e7d3ee2668655d7ef983231509355802be9167942138f6bd9849743d4dc8549bd3eff35c17d9409e9f1dc942c22655b4937f71c911ddeef202c41b26525a1fee7a46a16d5a3334b458119f3a2ffb47ad32bc92b3c7caf7eba35f46144dc4b17d46f5407cecfc65b8a5cff41d9813514dbd6856f8ddaf9c38dcf9b5674c3fbd7246e303bac38ab2361b0e85830c4db32b103427f760bbee3e25d95b2bbfde0dad0961ebb28ad891b7bc49eb1b9c0b64d719fcee455f05a24b0f4ab84c4563d0292d2e6a34cab9c95cb3c633b2de92fa2439a26fcd09363e350dc525923553cadd2d8625b5c16602d43530fb5599cd3d82a589b363e6580b853c1738986c5294c487a5b37b510ea4c5fc1f0fab7c05eb3c11d76a27858dc7b9d1e1289a1050313ec288d7cc575eba781cbe30c7d5e889c2451527fd7e76b0b91343ee50292bee8dbae5d19c64f9f634156bd9d772bb24f65c37cdcd00e7ba1536b9b8ace0840f401ac83696ce0ec52f5a11175a605f061f013e2e043b93fa4f98c5c1d95f449b861fad7866a527defdb79537e988f31d03db53400d85288b7bdc640f16fc870cc9d90c9a74b71439e2fb0702b44ccd25bb54e5e9def1889fa9e644e23259bba77236669b583f5aa15e225318b5fff5a058c82b6f51370e21b8de1e0a77bc64a15ae5a0c45544dffc1db3ffac7c4005c0124665ba177282243985c3e37526dd40d55d6d12785341c8f045f5a6fe7019298b11abe06b29f1102e7edc13914102cc5412b2df582cea2538b0a2b0a40d3f2dc078cd495289becd5296ffe1425b66a0919d430e88f3fd23d43bd14a81a68c11cb0ec824e82547f99dd8001664f620da861961e3c0f90b5ccd6ef6bda349a191331636af4b64905547e0cd4229a590ed795820f515884d719db2628af0ffa3df9962c46c5a1be60129b577073f2775a2ba461a5c4d4bac2c29628d3f93a07b7bc687ec26ce3b02f3463da0203c2898eada40ac3a005726667d0d0309c688cfcf4e6af30b37340281fc09f4eabf78a24b6878ccd836f33f2b946b8303b6b23077a2c39ef8974d7d557b882408723b08e33f15e6420bd7468d0e3b1dfc8ec03d82aee34971a61108f2166e95374b33a185f8bc049fb30871cb240c657308556b46be8d2a0f4816e91aa1a974f2709b50acf378184115732576ab8701ccc22f78eec595178c561859a201a0fd9cb7ae33af0a108fd2940d42dd0590c0a2b6a937587ed619ee736ea42c2a5fcf6ec0f44fa3b12304cc9e95b89c3d14b073ccec998a6c1c8861efa899ad86a35ff2cba5ce6dfcfdd663a61574832dcb537f8d23e1348da28fa3fca2e58e6b21449aa440ea8164caa8ac083992086bbb17df523f5ed383a44446b5960ac1451dd91f836a96c7d8f33d4348ea79fbe9524b310f94e393f4cdf4a1277d11c0f113fd4cda3cc8050dc4299c1a5cf25df45d219e1be8a8908a2379fd10fcbf2605cb09f712abd55c736634852b1414a2da3ee22db5d9fb007c04192f8e77c6c7facc1eb75704a1fafd9f327af6e422a9d4ae5e772a2244701bcf8059266cd44eba33a065ef18b7cfd58746b44943a3421e8986d2317878423d2fdb20a2c35f02c155001a9149ed6baca1ab44f2d8d9516d24ff211d3c0d2a47fc5f0a4310e9a55aeb5ae9fd02a6c583ceac6553ec6661eb6484b3d0fcb82f891d9e5fb8838f7459eb8f41e6992b34ca17c81ca50b424d907af05173ed269e4f4da2bfc6ae371ca7b6fea0a0a0c62a6e57be69eb8affa3a60cd496bdeaa38344df4e8fa30e28f16283fa95176586d38cd04161027cbd78c8abf07942d08fa680c10c76e0a751d4e688f759d6cfb50db16a7a19e5e87cb6447c48be97534ed0e2e137dc2d427be8ac4aeda895d945ce163ace1b5469a3d3683d9fd476f4440648d7384861cf6b52cea5de3f58296b4abcea8aeb1ec3fd07cbe5beee8c2bd1ac228a867c49b5d479bedca53b6b9406228da26a029b0427581ce561fb0ea42c51c83b8e60fa02fb2322076e8234b73878dfe08345e595c547f9a9a420b6738f4da8cfd88e182d66b1cbb500566c03a0806fda48daede77907036e371872aca8c4afbdaf323f3d078c666bc3f70bb4cdf752e9ebc4c1848b9fbf0218f785015aeb682dd7cce49104a50c33d828b38c0fae6f125a043986ad6d3d49e2e2cd66471910fd538f43509df4f76ebcfb438f287de12356f22a9b63d5dc2c0dcb2751e5fbce8272dc88f35e488b93ee07140d141acf54bafa47cb821c589beeb60f2f14e48474d98449a4cb940484cb9c4124cb9d0ed69da9105ee6a956aca728b87e57617215bca5f5cc543b72af51b3a690e1f027331898e32128229dac5c249030c564a881e1831d61431b88dacfc5a2e4c53cd279cb1035ba497a6899d38632410a017c6f428387ae3862441b8643b1f57a394dd4add101fc9a892c7d0c442b38c0ccb18d18241b98762e9f7e3140782e0f794fea5473f30eee8f9be543ce8180ca4fb2f8b1a6b6565146777bd7d715ee7aad7aa51dbb3e24a7dcd42a66a22de6c4ee755c3ac440a22ad7c35fc06acda12c0369bce2875873e986f49454c2d0fb31e01e33545e8adc5eac4bad37cfd2f26ae4305871693a4d62da61b1bd01da9dd81f9bba0c46712a975cf74c5001e48ea77007f2c94209b24655d369d58807f49ed1db1db382927da385946ace6dc5a8c13ff62c5c236990ef9a23b833b1dd1568cce9d60e01177fa59ec80524b77886db525e4d395063f9f4cf621abd47647dc9da0928d86a0021bac434a827a1862da1214bfa270f250503816a17da83850faa12c86dd60b2731083ae511d49cb25d5b374a826655e268c365cc2ad5857dfc63b52596c382a74cc3caac35f8b8f94caa3ea7b2d6317f9a4e675edb5e823539edcea1e2d5147eabf842a5e9b26957f325694754e8493ada9f5bc304772ceab5a9a729d466bb5b3a522ffa0d2c3bafad14d1c9b0bf63317aa7244dd2c40f9560b4e92f74e2da0b1056c3d7134b1781a85b2d31209ee9a28f85f929e2c84ce7ca95f86dfcd8be92cc099c7bb990bc79f5ad01bfcf8c11083672698cd80832d4015847d400134cfeeabfe3df3c1f2ae803fa03207e958b5da854a0f54fff9878d07899900037e730eced4e2ef7063c8987a2bb05a9c6a1ff8598732d9df5d5a2a7a0be0fec71dc05ba46fcf80a310988b3ea48766af2c007f3303bc69617f1dc861f2384ee3156d07e25e77d0c302cc6fcf015f5afc378e1b1af3dc36d63452c5402d27d8dc3c03b92b199a6333d8b915ffde56702ba1297694c23be6e05b57b01e18702bd90075e68df3e04af1efc6f20e9fe91b0a375067dcf22714ef81f5ed685938f40c2a315fcd6ac622482639e13ae9ccb441ea44fbfd3aedd0aa3c138e8df1b7bbe827be16247de98d0f81d58d6e9e6579d4c6ad8b151e374bca12e00e5141a509f6696d0dd7aed865f6c340b22a7d7e52805fa20499b44a4e49fdd52ed67c512d1fb3809562c246750b041fb2f78992983518240ed1839bada614aaa5b52f1636e2961734608320ba460df6bbecd9364654328abd410c668cd0d44170034549a94c3be8a608458a07ec75eea78a97ae765181f373ae64226aa0a02bce08f3527d624fac2e995e82d0a410f044f4c1388470dbb8dfb517132e2931c20d5ebedabb262635d258b0ee1a855645d728e0ceee9017a7de818b3f1a3b97d7fb098a62ccc63a764975c884e7ffe29ab045e6a5d05ecc205773c26626ea3e88fa433ca441067ce24e764044e07154b42f0e9c9b9777107dcd0a9974d8c8e2161e250ec42781a01ab0a8521754daeac201101e2da3093a3abb808730f110dd11320a725c65432512c79442842261cbf01530ec3aab21ec9c55b09b0855aa6e24929934cc55c95757b9960153d2e6f8c7615231f602da52ef0290b334047bf722057f4691719b0f20c3c6548b01a3327ea8b0f20b24cf086ecce1a4c2172263f218f88aa8072300e0f985f1e7cf6a9d45a474900d89639299963f30f600c336eb5feaecf98f31fb03f250fd7e36da72cb5c9c0154d74cca2e0452ee272031e3f27dbb02aac7d03bf3721f86047b00b03f6ec57c5956c2044d82108264f9c5de0345737e6d009e5b27809d060b0caefa77159d319a84800dc63f79615de8a285ebfa631d5d4e8b34c0d40bf2432e54737361e01547c6df505036dde68844f00c0d3ca5305b131e02984999c4c24ef6fc6e99aaa8c8bc39e550f6be7e97b4ca4daf2105304d95f268ce75cf5c90ab9349ad8eafc43d985afea44967de3392642e64932206bad06bc69630fb3c42aed605a75084fa7305501ed4d8ee2468f38de46f2a82063eedc4b5b9d4cf2eb60a5260d3593fa09dedb146007b425e03f2b0fc746f79bafe3c1333b30922d9934181e4e7c270546e73d1192c0104d6509832ade7654f927a5dc42847b6d3c59fc91db74049cbf3b227032d91bb3596df64ff5f4e45e0f2b1ef896c2a161e15c339d5525c1bb3c56de119cd75b4d085b9e7541a1f52189c674f98f526343512460f2c8965bd625b0ec3c5d3b302c80a22694e8900a21144c4ee4f740f809a106429f3514b00828d3797c123f2c835df7a6b07751a6a9a36bc6b1c4cd3d40054b9b90ace8583d751c0986e9e5608e35e77016657db981c50d2645d9902738778424aef87e5193ae8bd8644793d9eca81d386a7043ade00d023dfc7c7c9f8dd15da45f75ed88503964b7b27128d1c6f5b930f08100ce5097431c4709710511cb386a8e88663a4bbc88590276f8b84761f8df37137eb68f0d4b923141e585730b90a15b49f4997127f6d6f5d6d3f9bf70f39d0932a08c6ccc3c47d0850ea6aae1115bc0df6e2cacc0e538690ed7d33aec7b1ae45e70bff1029ec489583e86140d3b6e9f711ace8ee9c03e779b144936ace4d706326e8936bfbb6bcd53e6788079634be73d42fcc252b50d91eff5767ffe847a571d8a7f6a06699f2185163205d0d91b437f93f0c137867789306a1610b8cc847d742b3705bfb0e5e5fe1908a749fff420e659ad898e7c7282758f310a97004ff8ac43422fe3d8219725741fb87ca81862f81847f2c1139cc291ba943a7ccc17289b32201e1642c890749faecef7164fc720d7da11d0f7c61805518f1df60252dc57f8eb30577fa01f1c6c8fa282a2a650f8c482833bb6e356576892ed3cc68b780ef1fe33bd66d1d1d1e3ae798c202ab0a0717818ad667be0765e1efcc29c6d5747fe0350170a87afa680238eb3536e15f1aa61d857862cd2586290ff17545d0afb840a3817a369cf303ca2edbab5720885a351d41063c24b8ccdf30c09a874b2a0c14344ca1011c5a1d3f69b3050f1da6816c4f53c7bbf7adc380745dea00bb312e3447e35655e093bd7685fe91debea0d25a489707155846741312d2f6dedde4de524a2965b10bfd097e0a513a1ba7e48ffc95e3ac996734d9e7d8b3ededb7784a0ad93767dfd68227513473742cb8be39166fe349358aa828763a169cd6da838147dcb55b8ffaf8411b20587473eaa140836a512a6a45b1281d8ae7cb348c72ce9908feca6d2facf92fe40c8218bfc078cc360c829f419c73ff32c638e79e2f70b26d7f6979eb415fbfe6fd15de9c68977d6a26096b2d537fb13133f57a11d19a9b423a8b3d2e248571859e4a5d84021345a7c2571886afca14860f322de57ed6dd4942efafc7648e975e0235071f1c3244e4e14b87a186022a7c31f940bfc5b8ee6a5aef4d6158d1dd0d097c0af2aad4ed0d7ca50e32b1a665b244d65a99feec92fe3e5d01d685dae2544503105fa8eb13ada2c18ad6bb5d47d241115ebf0dcb22f4b508964873fb212f2242d7df89682e8235ed87003e067308bb4b9624d20d897ed8e92bf55b0fbbdb11113917f2ed6ed7693fb2366765f4cfda034f9ad52dd761bbb6bd88f269daed76482c11b55fe964d96a67f62d93d5200dc17e11dae392ca5e28ad3d6b4ab1eb55b5b2a60c39fb75d6422893ac99f5a447fd4a6389c23a9535e4c3aefa8650ad58a21af257f9bdd45affebb794a8a62b59ad5893762559a2d14dcf7eedd9af57406ed12d08f930fa24e771748b6e40c8277952d529e9eccf68b2cf5a89b1766ac0ced76badd48e9449e3c8c7b632aad4ee9a2d8aae7dadb5d6daff7e7e0d4a44bf5f72476de1e62a359173c2952660d861063ebacbbb32b3244e1e216cf8a2bbfff7cdfb435bdbfe9d7d475d6b9eaadff765fd22e78c6bf86e6bd28f5f246a203576d203fec3238d68d8181a6ba39f9d963f4eb74b09f2ee00839e3c74dc80e9ea7281ab353b16a4a0e1cb15f04d179edd550ee1054d7e5db9af3f5bf29bd7eb6fa0d3040e53a88288da8282c44e82ec60e9faf3c31033b0f072428ad09e3d5ba28051020a2d3a2b87cb18323238f1b224d5b50477b500411b8c33ee1a0277f100c36770787585c13e8e78e8ad24f0d69c5aa7bd2d335b46883afca96fee8639101e321bf629d4ef5f231a10f4fbf721a016d45b9494c4c709249e74f59392acd0a2b37f8ba88e2a3f0f5b54c960e131b252bd2d33585b60bad62e63da8362abdfb7b1d5257bc118632117899cdb42942c57ba5aff5a1d9e0185f1f6d142ab4154b1b042173472a4dc2065260b87304d4cb956ee885b356a8543d69f23aac2e8f0440b9326394c8d29a2a98c1b3e67c22282925c618502541247e0d155e04d0b7f6458620d0a35d4a93e4c30aa3e2f903e8e78bce8b4d7678750eaee6c97d11fd07e9f1455cf88e6e87fd546d175973a7e1844dc255c8a4651187f5ffd727eb242a146688ee62b8235a9112331bb3e2e324e11c143b948080e00e1036b623cc48a502411c316970f77b86cf8a101585a70d36333258c1bd04acb8a1a1f2710d035638438c303d697297ce8f121028c99a73643b85084561d514b0b57db231dfb38d51f6be308a59fb84f8b0f0ffb88868d6ddb7d64583242091ea4f021828623f61c91871725874d9b3741786084694e6002666a0fd7121d2c48f1d93225852e75c0aa3d5e687ba65cd4156a31ccaae07982e9863e5aa6a6d059275a52bafc79ea42a1e2491283a29bb8b87b7870c2f4f482551915d4e4a042981c94b0020ab0a7c78a8c4a0f2f17010a4bb054913981062e457ee8434511595a58f306dc93c448b5c789165a6782b494f8f0b4d081964709f2c806d6405e2a2d14c63249c45c1c3cac05f350b1a8e0cbd6e709003aedf1c9c3674eedce893bfd5aa73d3e6bf86cfab44e7b7cc4683d5aef5ddb1345cea40efb181bc90d20412bae52fc80c14c9c3a5dfa1c21a5b35f9e30a1254b9d22faac31c1c9146852b0028c144da8b9e0cc0b597d787bfa507182c29b275970ae6cf520051236555b656860934685ad304cc810a1820e5088b832a28a89326d549821490b48a038014e9c2b1b70d0358d69532709366cd0ccc1d20314324c3949f2043c03e3423326093d4ccc41e2ca95292d5cc6f0a0d479614a7ec25157185083154c3290835612ad325b75b250d1a0839e34542b4089616a8e9235428819424892a724e6b4f0a4cb94038260020d9e26bc2c91a31382ca9b27d05c7192c4083306d8c2e7c9126d90ece922449e1fe6f0aa6ccd60c7c94a07656278222a0a0e5b5b3a5b050e0c498258a18829252d6e5478f3a686297bae289366093f44445131a96005d6c29eab3d4c54f501628423856a0a071afa5809822a11d58412593068e9230448e6d3c3b5031c36626e8843a503d59bdd131c2c4c3abbe7cf0d7fdaf8b1e2490da98004d31236b8e0830e40c4b8720243962a68fcf0508548861f9ce821ce0f65b81ec0260a94298ae88272e6873127c4c05ba24606ab3179853a56c2381551440d5155d4f091e28e9f25bc291474067882853b4c48f1a2d5c48720b6808993058a1d3075c031586be2905142872d268270428a540a54ba80800206a5a8159a2082ce145084a8028ab962c70915b66cd1e3640816b24e80a28c172098def480803c747cc8401da71d6ae081092abc7019c3429f1dac804042c4971c68a88a818aaec7183d572db4e0c4094ca284183325890d2bf89004941deeb0c9b243a6071f965471050335e0b1a2c58949172d1120e127ea0a5e9f3649dc262a5d5252c4a87942090f3a2f4d3ed479131547071f9e402d49e22489199684f9565802f3450828785555589873e686255a59bcc061e2cc9a31295031450318a5274f50a8991243193636e4a045c688344fa468a1822504ac1ee0b841e288ab9d2e042d585cb04891620e9e2f54f02c59fae2429d243c2f243461b3b5f5870e134f576898c8e9e10c96227463155340b9f025062f4e404d5129338787283f5c627050a2290f9493387f9cac58399950f8c1ca86a61cf83c41258512bc3173d460c13e58e1e251656565b102b387a659d247cf10515d51587103b5e3c2569e3669aaa6c8c2a359504c0182cb1f3977ce60917a418a1830396c01a303a2099354163b6ebc2c815db00d3b2c3da732534f8019507242a609179e53183a50acdc1e5d73bf0f5fb43edbb18aeb5924579bb10c359b2bc636e49cabb579a835b7ceb98675f1d75a133f7014fbfd7c41f06d51d5d9e740bd3693f518acb54a30c618835fbdf771f942ccd1bd36639cf1ad160ca639d77a2faff56bd5668c33bed532f11bdb71df5ccde58b3136db2f677cabad42e994176668169f2fe74c29d534eb9c5fe4acb32ddf0fccfdc31d2cf725caf9fb6c17e33064c6334d8a331dbfa64ebf86993a7d212b72536e9ac2b6cd3e6f7dcc71f5df7440ccdef671a6de81ea51e36e418e6164d9781cfba8c7b1636b5af25aa271ecb9a8667344bb819eeb47f6c50d21d89814b1d932cd0be8dfe7b256769a71c69ad2b2d3ef44282d52d27b6fd931c74a32087e1ff881347fb8894c6d7e3a7ea04d92f1971fe79cc131533dff0b3153b55e844ed9aaa54ebb7afe5b0ffb2c922d920fbfa6453af3fd7d9cbee89017633e7ed67ae6454c1b95f3f77d5fbe455f0ddfa55d5d6cfccde4ecfae7dee2d33e860f3e0dfff52e4622f786bffb8b9fd8d6acb967e851d30ee0205acb8468dbb29626f1b845e1d30702c756412e8a726b231d845b448d54abaf91cdc6b5b994689100601489fcfb134627d3e4fbb32ae1807640cdef49c8d3bfa7d40296e87c103edb77a77f7fee2b839adf87650c9aa3e6f775830e1ac0ec27091d04eb52dd255993e90274867dfb5893606d18b1aba57355b5c56acb543f75d516290888f447acaa196cd50c5fee0c5bfa0c507ad869d50c4a7a7d5db5e5abda9255c4db13d4d8f1a326cc136abe4c80254d1f2872ee3051031e33c5654b7622cacb5a90429115dee9f3a2c2f5431b2d24a2482384ae0c6315059e16dc28f903da4075a78a51096c8f1338ce1eab8a31be25066cbddf7dfaf42bc3ef03bfeff3df1cfd887c970a51638d6db7e8c5713667bf5a0ba541d39a30ad5ddb9fb544803d21fa390462ed1d46b3d9302e64127ba6847cf6281961d0c3a547ebfbb4c573ea4c8f1b1db37325d3736684fd0f3bb29ef4509871dc5a6f2e981e2e221d2c528f1531841af53c79bde6ec443d2a84ba8929619e2a6060d42bcf9dd927f21d749ef21cb16309aa3c6d5e3bea68853b98d0ca13c4de61072a4f981d73a0f26420dcd104168b2501587f1b624dfdb47f604dad1fa775f5e3b8ae7e1c967e5c961e625f6af5f5177f714af6c8fdf52f1c56c7e92f9ab920d22f0b40754b397f1f7e6179fbbecf7e96524a737e9a6ff455de28b70fdeb0346feeeaf4d5f42d12b5482d02b55e5f8d54af9513b95f1fce0346ecd3868dfd46d63cc2b17f731a7de8e32207b59fbd901aa777f642684f7bf6b43febeec5d88b3f96f592394499ec77d05d9ebf3b59caca1d2b614fc9add46b69247718c72fd419e293e5697b630e910f81407507770735d7fd2381ccfec8569203ab9b717a735f11a3ca54774edbe625dec4985e7cef684d8cb1cdf8e27bedbd96e2dc46bc5ff8437a87e5ebf237c5df57f1a575ca567bed986fbe175ff07be94cedf7652ae6efab92f3c5395f70db2aa06636327bbe1450b3821daffc3a3fa5a007b6d9eecd60fe70fe2ec64088b8d34af6b8fd7ec574a853b3026a62fb95026a56b003c414f4e8f626e03e09185f6bb3bd7eb495fd755ac5e48cb88489183c6e1b0d23265ec24ac36868c8480315a6dc1cd54c9c641a30d54c5c6d8fe3587b81fbd88054986103e39901c20a3360a8b460aa65ed0a6e7a157bc5554ca2f42ad65a71ddb556ac4e01c6552b60d15a521d53ad7e9510b9e42c7bdb2b8b13a221a39f340dbda2786851af5adad23b090fddbe2d0517bafd375338a2db1f529243b76f54a544896e9fc70edd3e104b54c544a7db2a15a2bafd109aba7d11aa9634d12dee94dc75fdf8294e821b3615c2691c96e83479089996a87edf7f43473c868c706f2f14b1de6d4f6c23426f3d6ce5b71efc869ff6fc5dcabef70ed117798cffba71a03f7c21e3bfc4b1bc81e0bdb78e5aac97d60be3228e42ac6e48af3c7a11a37aabaf9feac2f256f98e2228ded7763f2c71d6bd4aaaaba410abd37a86945d3fdbfb06dbe88ee952dfdcc6165b6c2d3fefa5f96613acb52f3d64f4d782e56fbbffdfda7f73c8c83eb580622aa28869950346a4b95a1e60b013462d5d915b68f4bc6ed864a73d344b4cd0690f0d15fad3d55a0b8260e867879d562d71b1dab34eab96a26824fbd569d512933b7b775a85429794edb7b677685a0956a86f122248c36868c86849cae62815d252ef65c3666c5f0a566c8e6ee99202189ba35d3f985956c204def0e1244c1f967db9b21e8af2b2e3d67a334d19ba7ad726d65a6ba16e8eea2a14964424a62e241596accccda7adb520088abd3debb417840d648290a10c0d584209864c3176d68e31c61bff2ec55abe74bf64012ed831e64924586b8d18f51d12fa4cadb5c6d6daa032e81091ddb6d75f83caae4f3f9d6f36b226fd8cefd5f76aadb57ed3466f41aeeed5b9bc7812093a7a731b768558edc5f903f52b1c29a534143f1d7d53e841d02fadb5d660d6a65b47df1cb2412da845207ca0109dfd7d1a845ba4b1b0b4d65a8f4696e80edd6d5e0ec2dd1c641d083560b8395b2c10b0b0e88b5957f1ce571b4db66362e722de8fe38af1cdf7bb5f165114b2432dbde0c3a048cd1c1ba1972035f35f9102fd5e6ae6b7b5d60a8a3d7fa540bf5fc10bf46b6f09f9f3e31c32fd0ffffdb0c5b5d65abfeffb8bf3f737df2acca18e6dd8c4f4314e63da5cb5676502458e555485aaf5faa4b5a557a76a658e7e5cef4f14dd6a2b67e87611b4747bd535b54840ddb1034496123257ba93d60953c589115292a8b94177d65dd18b1a547fbd5e2be9af2a2470faeb6dafaa1368e8e6aee70882b80ef653e88f151d5cd3c1df567075f08a1d3a58b56b011c7281c4d7b5ad987431d1bf3f3bf4cf46b17ac6f8c554c7185351a5632af8745c05d514693a36ed6ed7efc5b6864ec6715cb2cd5ea7b0a173ec040e112b54ba6be358ab33b88410e1074b0f3d3cf9a18a8da9dc51a18d1a254bbcf40962896ab76127201c1fbe8c53f669ea4a35804f4aa4b8d9932feb75d9c77a7ea43af9b117f3087bf123c7ffc81c607e9cb9117d7a8b6e415824e567c18f6eee7b255da7f4cac612b748ebbd6db65dab6873459669896e3d2aeddf4b0065670946f061e47fff7dddd5ef2b93cc6d594997f9beb94f1ccb5b8f9176b1bcf510bf7ee544ba2c26e3411f2b45207b902f7b4c22d15ec6cfd8d3b805acf97d5f63885db14530628968b43c849a41b57fad57741ac75446103f630f7bdc2b91d8931f7bf2c53a566a41d0d327834ab08b95da5a2f8dc380b395744abad3a87ff7ed7f9dc72dc2ffbdd12da2bafce11c416fc9fab3f216c425b0c1eb63bfc37ed0e39e7b107f6b7e9ba603f7fa416fbb1854abd164b4cb760495b4538ca4e790f153a9cbbe9644ea07dd906237a41a7ba57e49a4ba3fe8ef256b2fd6ba3fa83c49e8f581ca33f78dfb7e4ae6a8711d34247cfbd19595f74923d6fc9e2cc732e9ab5fe536acf9fd39ce68b265568413d3ead748820eeaeef3f07181935ddfe816917fffd60363d1c816dd9c8e7c0c71c0ac8ae14b684bd4b6ff7ae14deb8c2936a97fe4549324d7ba5b8ffcf8f1bd5696809dd5910d6bde7a60acfee21138959cfaeb29d5aee3a7bd92487489fe7afd8b13b9f5783dfe17afe1b0a6cd060f4bc17d6a64cd4be365c839852288dab553be673489697d59b15affa9a544f7810c39e22144e4c6dcb6faf5bf21fbe34937291de9012642851db27498d39bbb3a88afd79f4e7fcdaaaf6d5783ff12f2fdd0cde9af5c3ac9e6f4eb71d76c2f1e670a0df5937681e95a7fddd922d8ebf1ac857fbef8fec409d1d07f748b60a46d08dce6c729d53f6a7d6e4d735a534a338ccb88bb8c857d1332ea9b90efc3efa94e4bd075d669fa545a6bad3f974354867eb200593772f3e6340457b67eb36bfafa6b14b5a0a437d7294e7322db5a10cb0edabf0b9cec6dfbcce2f3d729d54a2622fbfab48f7a1c6f4e790cf590fc1f64adb596d94a16a5ede6f283a5096e16a072cee0ae518ce9f9fb60b4d9b137f30b8142d9831f20ff1ddbdb85de8e45c1542b583e8eec513bd277c6fe7ba56e820f9abb36c598ec0cc207d63462ba55c43142edf5638f6fbdb0fdf476fbae0fc412dd90f6cb5ec6cfdaefcd95bad26dbf52dffcacdd873515b03fa8e707aa07fdec7910a9fde63c6e3df6a9d437c7d1f3ec8f2cd0efb232f5d81ff49544a27d103f674fe3b5695b2076c5ce1f500b6a1f21076d8825aa714a4da0cf4f49b2f622ada4d168404fc91ad7813bedcf198d1399f11b1290a352d6ab6c735599acd62a58bb5aa04a41a7d65a6565edb61278fb5970db4d088bb7bd8d2729e958f07d73f9a92e5b5995ed2a93d50034c976edf979c2b5d6fa559b3f0cbb21dd4efbdb6926f4d9f8e1ebb766be3299d67bcf68b261c0d9f8bff63e1ef633a6d8e7ee59261b6289b2ec6fb4d949af64e5b6e68dc675d84e9331d9a20ab0f2d72628d9297f7daa5df22c5b5d7eda4c96ff0310f23b20cb6432d906facd293565b3a724edc5d9de9cca903d507992d0f7d7ca337759497bad3c7197711db8efefb2f294bd0dbb391119bf21fd7e193f0a62cdfc9b03b1260b2136ae2de9864a948e05a736365a1387358d6ed1109bcb9f75f8e2390fa94cd6cc4df965c86162f1426c95c55732488bb7b5e0fa8a3688ed59f0a41b7f8c08117c8e003c8ec7e047108e393ff1d368187c0d217ed6f8faa33ef034cc4fda1ff1f8ff785e0d7e62d0cb2360e752801b6f005ef253c6f353f6203fa23b9702f41a12f0b316e0c6f38e64f05382070bf03c193fc1ef05903d4fc60d0e24d0a0962184013ffbdfe00083e7dd90809fe5cbe0e079203fff31073cc9120fbf103f653c06cfebfc14fa1b0ff073c6737e44d3b40435bef323e3113f32f6e71dcde0e7032f013fb269fce42fe34736ed79b2afc1cf19df9f57f929c11fbd2d81f0067e361b9a35c0cfd95f5e033e9e67f9692f288f80359e577f037ee3a7061f01bea10bbe12a06ac0cf16fff123bbf36efcfc7e13603f6f82e7e700c0a116fad3130cf123a3e547465efd16fcbcfd04fcc8eebc8f9f2dfefee049bee7dd17003f05f0f67943fc1cfafabc0bf879c1d7e047c009f44c3730013f325ec08f8c173cafc6c3e0278c6f801fd99d37e36703bff991ddb9f8e04966cfdb3f007e0ee02f78de04fc9ce06bfcd1452a6d3c8fd282df5156f03a4aa3cf51da781ca5059f4159c1eb4aa3efa58d3f2a2d780cca0afe4669f417943638fd1aa5054d153031a25f543af044e58ba7a074f1344adb0f6002010ccd904086500401c89910940e3c00ca171fa374f1b8d2f60f940e3c77f15fda1e46e94003e58b5be9c24aa7dfa2b47116e5ec83cafd40fb69e58ccbcacdc30e2bbf15c868d5e96479614042a5a78f25480493115fba587e7190a0d9ea3e1e24c07f3f3e975c7cf0a4aaf3f1b8e442009e64753efe965c7ef0a4abf3c197a8a5c0f2d33e75fa3d78e5a7edd2e9576e77d6942969601f1003c281a197b1f8ba4610afcfd9866158f9694110bc35c86c6bad5469a7aca9bbac1c5b44f62c1dab95ff32e56cb77abebb9eef52cf357f9b28a67edea69e2f949e5f87350c7f87ed61fe07d4ecd3a6e939f35bf8f56f48f66b1afd19c417a4466caf9693485c486e02ef9d76fef1eda9d48d3ca07ee55c461e1896b63cab55ea6718be2ded9fe0a96ba9d42d91112cd0c1a77d04b083971bc1bfb344b0cf541773ea16aa67be63cdb6bb4e7bfe58a9698e8e25a5564ecfff3dcbd9f96df9697e9ddf860afb3a85468814672570b3623fd0b54fdbbfa8fcf6615b9d0afcf0e64c06a06803c688c7a14a0a5d924c3961055da567ee34d1659715c30a6b74d5294c1f1cac48e287ce15bafa361f4e23b6df8c32bf61de828d51930fb4d6d68aa814589ab8da1ec7083aed9da90347e32d8e5b305899d33b41cd151bf064452903e688262f28d1d50a1af1c60b2d072e02301b2744a32a86a84f890914205ab0e2e7042e3b3c314319ab278aa0b3c48728384fd0301e028b153758f8746bb70b25a0d6742d3195d5874aa1440a2958a0da12474b87adbd5ae054b11084bb365c7d23dcc5f58a85aedc10c4955aad0d0f4b75d7c6b14674e509ed025f8ce0cc063b7dd39a2004548690ade0634a2fa045f48d2c5150076d7e761e5aa7834f29b8d574d0063ef81c4765807f6465e0d9a791510c872502c1e7913fc8f7e42be982e4bf617ee3607cf2838cf893e8051ff320e08fdce8e6c057d2c9e002ef18c1993d76fa22257be00fff5512c1fc86645f7cfca1f8e1bf448ebf02b5bf5e7facdb72847bc515b14e6b519642e2b45baa45a01412ac1d981d139dfe5d8b62522860edac765074fa6d95a82eed9cba8ee0cc7e755a6bd8073f462dc00ffe17d3ca6bc499d4be20f8947e1f1123b9e70210a18f29088220fdfb14e4e7a58fffc3b7a438664805b16f3dfcd7d3ad1d905063a70a16fa68e996424e6feec5f5909f7d0ed521a397a0c9a65f85b21891528c6bd574539baef72ea96f6d4e00ff6f2f3ee1abdd7407bb682ded1ca1f2e9a7ac1bc1f54f10b1adc1e24fbeedc1b706a576bcf7de6b0eddbf171bedb02bcd6015a24829a5355dbbb5dd9d71f7da709452ba6f79e2cedb2ddffdacaa01aa1bb1d696f97e98cff7819f7e10c480d626e02a40fd2268936c3741cfb85fce1767dc03ae22e77bfb35d2e18bd883682fcedf0752bd48a2db3fc57ef401b626d85ed69a5a506b7ce08c122ccdf7c7da0b5cd736df30cc913fa4168043d4bed5723ec010f0b06b1fd41aaf1722a8b135c1f66a4fdbb5e90ab0e0f1fbb04629465c61c2b27205107ac3f458d35b0a2d3e9178c470a93722117b69604596e846eba8908a047becae5e32a6b756c4909986d1d090d1155a1a5cc1b5add82093b252258624ca4a93b1070a5c5694e81e273455f913f64072a5b7ed81e840990ad3cf212a53361cb1bf4e7b535b6075a6a88866a69ce8b071d7f7696b26898cc23f9528984ae12a786438c7c954aef48ceb395321d373152a8f716dc84653bf30d49962f51809dbde5b8e10a54031428a9e2967bab50dc0891d5f68aa7a214fb747d64ee9a13e41cf1d13557e43fabefe87b1d69f8feef3b8ff2387cdd6e7e8dee771ef0fdd37ca73c4da69bffcee888028524a642d26badfb69f6dfd5a7c6dd75a9bcb6af66b69bdfada58182910043f10677cab36bfde8b69c637e30be2c716d420ddf782a006c357f8d220a8c117fd571d7b96d28fdb6e6e8ff7de7bda5a7111a205d6811f6ca3036272a5976a4a29c678778c2f7e6cdbf86fce397fdf973f273c404141414141498994524ab70d0f0dd93032c271c923291f240f6c892ead59d3812ffb5e31d6822048270aefcc163bad8a924547a98ad23486d961a755515220795550ac78fdd964a75550f8b40085891c1d2dad5f456c0d785c4340f9106275b981aa4aaf0aca12990638303d9942a6c10d4fbf47ad7777e8524581d95d1bc75a162e9ba33b0db430691b0c8ceea25ad2cf71acbdc6da8b1c1d9c5416c64ed88c4fd2f43ad65a71bd57b0294e766a975e6b1adbab5727e5c2b85acff9f513293d1f61ab0de1844963b07e65b689674e3168ac242688357f90bcb17383142520a1810a2acce02045c3be976eca264ec7563a2ce9f8715822d0c59d7dfed7a6494ad39e6e5d20d3ede719eae34c58131f3ac6554d2a6c3758bab5bd211f8060ad1d6fadb28273838c93aa16ec54b180c23816a1a585a5aa478c47a28a1f608285c799d38b87a25ed7216e099ad3cf94bb7e1c1e4b64715b9628ffd784c3b2cd80628bb7173ddd9cfed96ba6ddd4cf185366426c1adfb69bd35cf6cde99fa166d37633ac19d60c6bf64cf65994a6eb3f298e8e25d245692c91ecf5173ddda222a69bd3af75d1d353d7454cb768067bfada7a7f7f153175fd7a59695af3f5b352dfdc4bf77ac568c26159a209ba7e5c9625b240af3fc6ee16d55e4fd94e319ebac661cdfe8cc1d4f5cfd0b3675ffb936807ac871c874565e89f99d9345e024ff625d07ef640bc04a0af7da5fdec83d0f88d7caa9bf15bf8b3a73a190f02c46f243775357e0bb91070f6df97407bf0857c5ffb1a2f61f6df8c1f3651d14ec7381156d79ce8e8e6f4d34a7a7330f6ecfa7af61e803fe3f47af0fd0b08bdb9173f8d7c9dfc93aed9b35da7fda433d1c50eab3ddbf51387351b65bcc161dd9c7e196fb6f8270eab7f110cb1bf4e87d8f9854924ddc9b34527bf92d0c917bf912ccfa04ebe2577e00e8e6479ce3af997dc20f7b3844ebea847b23cc94e3e2637f8fa6942274fb0939fc90dc07e8a6304436cb09325efa21e47327cb27ca087a50eb0932fbe2a6961e19365d9c3f2c440275f0c2b7d691891d04b274b22214822913ff29fda81fe2a69d5520f9d9230b4768e40adbfbe48f5172732f25956d7ff7ad55b0209624dfdbd191d6bceb0aca9fbcc02626dbc65d08b40ba8b41601759d85ab8186f99ff36e69fbd382bc1fe75d18eb35989bb88c73cce44f0e3b97c0cc38106ee8b9b8b16d6c62208a8566933d98ec1e803200e367b593954da4a1db83ee334a88cfa38ac5b44c31ce86be549b5ceefcc6179de9eff559eb6e70f2ac1120827076755e2aeac699f87d9678c9d55b71fa3c9129db35e0c2697c912d55d8c253050764bcbaa07060a4a939120407658e11a75f5cb9e624b04f43299cc56d29bab3d5009f4414158e3200cd4e26d3fa4858dd39babf121a7eeb2d9535b1463f73399ec8f6c8cdd2dc261d1f85bb3f6383a486c9aa5bd7d1c9d1a3fb57da0b2f6402f5a320710ed7d28751a108dd35a49ade9e25bbc10177cf62d78122f488bb77d92107a73b3b7f1a41655358ce91408eae7d16eb7eb466c1d3fed697fee6e69b82aca56a75551e874b3d3aa283df4183b2fdd7e8c25ad79d7013ed0c55bb185e1b2247119d3814912298be0a849a4af878fcbd7fd5a7e7f4bda67e5b9bb2c569e2d3af8b0127cb23c83ce12ce19d9c1d7e50976f0eb69eb2dbe3ec51a2cbf04fffe0e369bea7867b57d8b3fbfdbdea2b451b2824f250506eac942b14d96c9eeb6b0b280e8ac7a545260a09e2a146a4fda1ba29f161e2176ddc5d8697d562620406e8e867de2b07058747059382ddc168ecb12e1baa80555892380d0e221a1440f677435cf13bb2062b893a6a703adb39e8ceb6734068d1163777336c75102767262ec663d9ab33f8bb1ab3176741663d76de5e79e5d955427e3b2f1fab2596f763593f3332c4b5479046a5d84b74f35ebcdb420a87a61a99fb31e8e8e35eb7dfc059795038785c3a24394d1b2d30db1b0cfd9d3deac1743021ff61963c7e2892576ba183b4b14815abfff05887eedd717ebc88292406633ac59d6ac37bb8ae104641f3862a9d7f1d1ecdaeb8fdaabd3d606b54a06ac2ed469950c60ba0c5afd85814dab6480d2599c13503a756ff12ddef6b4c796a8f63422fbc3df0f7b7197400f2beb87747af835ab2aa729daa392d36be237521209c87ee406e1effdb0f2c41d26e364ec61e2039527f9f435185fb64bf1294980dac73fb26179ee17f90eabbd1ff6f807d087497dff47fe807dec26fb909fb70dc817c38ff1f326e348648cf6a41efb4cf22079d43e7e589ee103f11d563be4b1c72f7222e3cb3891da8746ece6466c1f39acd6a322d538b6660bfef9437ed21e5b9316fb31fba0a7e48fd907fd69420f7a11f622ac0c7a518f6119f495fc71ee8781d0c57b7b257f9cb1df0fe3b7cff859420ffafc9afc617bd0873f62bff91bb93de8cf180b7e2af520cee29248b6b3f8b064c1cfdac38f7d2c8cfd0eab6de4f65097466a2c7c34fbd6a3c71ec6c7af2492f82f7e43aa0ffbfa307e865d7c22e2bfc25eff259ee293fb4925188c8f6fc91c23d81eabffaa7202d35f2fd61e569ebac37e97a705fa06faa0207ee20e7bd903c9ce095cf2674f7bd87e5949adb9c75d7e5f2b4700677d469bfdf8b18ffdab921b9096d411231f56ca7e5f1209f6327e7477097eacb4ddc6ac393e8c1f599213115fe4afddc1f2d4499d8e60a42201f5caa29236ecba0d93ae0b577861d2ed8f9549405a3ad98bd6269950a3b440b1a4db6f828d3e6450d0c55e562699005447b7390d4b817d136849e8622fc64a1ef9f5e9d581fad88fd317adf817ebf0c7da2f2856f2c508c4ecfa4f6107e2b37b7d7afd7da4d7df07bf02b583f82b1573902f964333ecfa346ef5f1adf3c051fead62d2ebb4d3306908d1a84584d825f082c87e7f09b19f7d09b2df1ffbd90789fd8c0791fde63c8cfa2b56de5efcc6c1fed80b99c55edce5ed352b6faf997dbd669bf6bba4ba19eddeb094e9365688f53bfc58b84b594975b0707facd29b0b77b9b1361d295816f887f1d3ec7f648760d827cd12e1548a9516b84575e4e7db2a2f624d2d802c5bbf98b3bc4891106c08e00fb1a6b51f80d9a71178c477fb41eedeb4884621c592385d404411478eaebe8d16c5d033c3146cc4b4f0068dae3ea5b40ad9222a45c3022d96768d887dd6270174da2f9122544baa5f5e7f97541793ed483b9ba298e64caba8dd894553b7ba4cd29f347e7d4a4544a9d17d9c2b0805f6c02b6a41d8ed83716811084541a816fcb4f1e9f6c1266bcf4faac5a775bfaa5b7e2af59b1ef54786e6ec9f89aafae25075fbe2478616e5ac335a55dd66ae38dd7e9a264b8a33b2ec53a9d71ead3707e6608fcab07f7f46967dd62ec259df84fe6961edde55ed386bfee34f4a6b2c3e5a1f19a93b509f1415141865bbb373206b9f9fd306b7bfc8611ba1fec88f2ba9c3d21872e0897d7e3b2d9bb5ac2934677f5cdf960c25f6f93975ad1f784ab750bad356ef72d24b4e9ac9b7bb45a095cdd997a3e96c10cfeed6b3a6fd1ff6ee16293d99f3020dbc28eaa4b1c2748b94965c7179aa7a120589159dfd4febe3aaa5910d23a5179248f9a10e0b74e4506989218aa920a670d8c243ddd5ee945d4d779b40284b94bf4704577fd1698f88387d7c2c75c12a9ab31f6709f04e4f84fbefb4cfeb8443eac5cf29bf96ddb773e24fbb6789ce4fca0aebca129d598e1c4b7482502096253af3d527f5652c4b24c7127d4ffc8684ff7e209e6eb758d33a59f373ba459f9493d3fd9e3ea916336c5a460629293268886062ea004154d93991a2862864f2d505a1c0a85b34fae041b5f9e8c1f8fa8384e36b9e7403c25475fa6f41fec59752c040a7f9ed32559dfed70b19fff52584258cff7aaa1bc50ff9ed8eafa493c1b53fa95ba46d3639201e90ce0864c86db1a667e5efa77573f6b13e2dae758bc0ab8fcbb6df06f6c01e533f3f2db017667fcffe7765ff93faa88a64ddeedfbf621df50ffc050811be2752dd08880566d9077bf6c1abfc14befd4c95a1b254cfbdae73715ea712bc2a412cb0778259dd3e0462f6eeb42a8622fa09eed927e562d1f459a11b30a530d4ec5b90b7fc16c466fe3980d86e0e0f559b24eef49f748b00603afd287e7afe45faf34577e04fa11c7f523943289efe67b512a44ba77fc19f550e9077e0cf8aa7d3b74ff6c60f9e84753ef8927db214d0eff13cfeb425e05dfc8943c0bff8d3a4d67cfd4923e84f23167fdac0f127bd3a00a5338466d5fea45c477fd62906d812e4e9657fd6a831167c8d3feb15d3eb3678177f563a5c80fc8be79afd59bbfa0e2e09789b7db226fd3003fa201c00833fb918e06d4fdf522e1bbcede953d8d3c7e4d3d7e38bbf753cfd2333f7270dc09f3402dd4e48c69f7549823f2bd38c3f2b93a61b4f875e007fd6a90906701ae9288f803c4a5d7904c451de288f8047652d8f8035ca23e08e0e10c08b4222163a1db00e76e8743af809eb600792073a3e019c027e861fc48f681afc44fa97072f71d4e1818ed0839707a10e04e808f911fde267f82cf811cd7bc1f89171073f915e0702763c4f07c94f0a7e44c0f3427ed2f817027892d7f3c217f949fe8ee721f113f63a70bc4e87c403e9793c70f0b3e875447f8317243ed2f83c3e030e8670083e030008c7f332d07d0d93030870f0233b031e0074fc8480830c7208d1fd01780c7e9a387ee6782de4460401e0677d9d10ddf37098af85e8bf21a4a6eb4067f233f7357e44e70ecce76508f859cb809f395ed74106cfd3e5f819e3cd0e9ea7f989fbdc817e5e7e7ee63e83e7e5e0a7f93aa007003fa28ffe0607b5e7ddc8c18f8c38f89131c7f37000f11382aff123fb889f00f81b1c003daf16a18fa8e48c3685412a15926800000000021315002028100a88c42271402c98a7caa67a14800b7d9e4a724c9b4a845110c320c82043002006100000318610824c114d1de828ed0fcfabbb87a79c19b8eef0f43c8727b8d8ea04590200b838b2d8e98aace3b16c40d9a6f97f832dc646c2fbfb5060db7421f60a1e735ea0adce66e0418d0b6ad6d494b292ba911aa62e1c2a923ab3f64b07c21857514d9b3a39da0129d221e916f004a477b5aab2b6693c9e0b6bdb35a9f0e49546d9df09ddf5353d0c4ecbfaa2b74e7f6e2f42722ff965880c2cbf9dfff6269d5ebe56b62e7ad8dac14c00c67496f3a77610e343edf4e8f8e74f5ece3ef204ba909b6fa90d0f3dfc312572b4293ee1c72a9d6ec63c46d6d3e39c147ccab96f0bfcde15526db84707c7c09086ad272ad4e57b6b884b6c6c37261568e9d8e495aec6fa8b7ac8554e87dd068aa2eb59be49cf6f96dbfb51c5fa30ac4dda8292b44f2609aac853747c27fe2dde389ee70ec7f577c69b257b5872cc00725cf244a72028515dfe5c2443e61d45b645b3c82fea8801cafe30e04bba81cfc23bbbe3d1aed498c3c91c3f6ab1b3c8a6225eba9de56bf02a21934190ea894c16e11c686ac65d3c2fb362e20ead35cbada255d7e63a5ff494da7b7be49a75d3f46d67d0ef8215c96d4d70b1ac2ff1cf6660500fba54ccfb11cdee296ab11afb214ca8747bc3fc4921044d74d2f0f29427899ab0412ac69e746fae1323fd697f91350b682f0955ec77e475e08030d795ba3ed62835064c043d98aa3d4d0765fb60a4af3d113683fea1a515894146155cc624a8156a11b9418eb409c6160c51dfed69f2ff2982faada99915b1b9e69e5f58f8b39caf1677c49f3dae6529c30090c4922e79765e596f78fd613da3a09d3761cd735b046b9816c479057bffed48a2a70de91426336ffe0ce04d84c4fbe2b40165af80000d6617923591e2bdb03f1c46a9658608da71deff1badbe506a9f17053fd8c211d58bc4a1edfcfb6966f0e7055428906c67cb1faa8047ff118a91eb3f61801c097d7cbc74914c804464ff8e3f5bd6904c400a3eb73dccd8efbf74db10d636c840b8f8369dfa4c0e5d451fe92ff05e9ddf1fe2c269c46193b3bf731d3972dfead409bdfdb4f2a803d344a06ddb94ed69589806003a969fc823176c061529f2e1730ea591bfbceb0b08da04b87f40aecec82e3ea1d4519759a49aeee95cd0d14eea81ae69ec3a217495083740841c0801945f570803fbc2384a97cc2269e646e5afa699f64d4aa34dece0796c92412738eeb5a94fa3ab004526eaf5fc9a5412cdca4de7ecd5272e56d75eec807422aaa061f7b1bf428b23f0ca256cfdde743e8d8a9fda7a90427cd4ee2ec95e1bc7cec93bd6475d6346a9238752331a53a143a3d1d4ee5491463d79d178e6ce1628cca3271bb7158a598b33b67cf65912857dbce1e28ed9e6e41662da9263ce01139f3dbcd56cc7197bad87ac004bb630d34824f75f6295a1da0623f6ce5767ee2cf4bda1cd8d68465ac4d56db51722e44264483465009a6139609a3100f4cc6812cf2c71da99bd65315713fe33097684f6178c19c2045c97e945876105b0e83fed87f9da6081af2ddc869e44bcc4d28aabc806e58ca495e5b9523c7066ef44faae3fa8d22b38652f8e61f8611f32b66c4f8eda7d7bfdc7360341966afdd48f244a5b38b81a2743ed6528a1db4758cdd8848500d6fc8780d54e979df85898d1a32b14fe0c5a90d387d95edd780e73fa7c2d7be4232b1cde6feeffa97bdb728e645b694e17a01959dd9aab2b79c4f16f3d183c30cd8d4b928af3ff29fc286d7754c1d127cd21274e824ea29622a693d132d82fd57067e6ad142e7dc31f83b2fbec109e2aa0eda8f4bf1e21f563dc6cdf1c874bc789d3c201f3e891a2aa019b7e007efac1608d68b933c7222f15bf819b697dac3a1392a8179a2637c6c71b7b11e94b4f56b3914382e8634f07ae46bf9b870d3241796f9c37ddf6348d58c71240c42352884841edc6f1f8993edc260a4cc2e03f1bd281012a40c4c72ae1f0a51bbec19aedd4407f07f5a4d2aba1507e7d9d2c7d1eedaa3c5e10b82f51eacb050e44498f372e1578fe251aa5e6218df6d33a067000871660b172f5229d69134d601049155473252bead7f58fe2ff82737616247ca7066742fed492604724640cca39844f70be36d56c88023684a5fef5904823cb278338edc4c38d46bd83b3dc293cc2209459e3526256bd044e3b12c8c7d0ef0bb71421209c0e2d854cafa82223461bec56778d53072b38818441905ad9b2fcafdd0bc97c71086220249ce794fa85bb0036c388d36ef888fc909034d273484adcc78cc473d30c2562d1327792ecc6247faebc2af604c96823579d5bfbe5888c7ae29e8832f535178959b47918a614340582dfbc91e5457fca09770c3aa614a7d6916d4efd63c27ba3d5251eb72e4f6fc4d16dd66b50056d553369d87ad4a58d62e09cea55072fe2d5ca569ffcbdac757badddb0a445016d3ae8aebbb159febabaf510340a36b3d0fcfd6342e6c98423914f3df43df3d2c285d604e445b46a39ba51dbb176f4c1e023ed79bec234c67d39658f57457ebc0f6e1d029109dc83220a2c39e4ae9ed7b33e01ac4f250edaf037190b94f538bbeac5228356ce7f140ae8b1dbf806606ee4634b1dc3971f568ed1a53a4c39904843a4f5b53eb322492b862a38c726bcbb94c7afee2c83a5c56606fa0d60566d05a7817f0ed048342c05d2484aa8e9b2db1825799e45ef04ad1406badef381d52cceddaa25cd0fda58358b84ec0764411703721fc3e4d26815a989a7a901642c78eb3287c8a0f15cbff9ed4c4912bc5d44e8c3c6cd2993b242f0954a88076fef347e5a1ac3b1d95c7862c20dcf671e7880ca103364ba368afef69ff9ac391d4e8414ad8ec5c2f63ae8326d1bf68f996dacfbae8434998ed3a7e94b086c7dc59538b07c8a2cfcd49ff702e7e7121e9b3693fd3b7746a157f1a2f1d907564c41ba799915e7545bb44d1018df82fca99e85aa3a7222d16d9c3ce3c9ae156c6758e07660e63f7821a82dc88c789a732a55e3c1c4994954d5737706383576e135d6bc8f4d100a28563740f93e62cd9f46bf6ec250ad7e171a78c99916fcac523c15613acace71d5797399bac82d75cd27436905685e18748f9dfb8d56d16e7cec3c7ac63e6cfc6838fe01ab882a3752fa44a433b6924cd9acadea7d782b54d7bc6f766c6f3e8ee15f26f7498aae1b31e6a0140dab5b87cc85854819721f59cc037a3e28ea28b734e06cb8a6f32fc20629e815c6a7e8cf8a628e8f597a2dd8bdfa163cf623cf6b56b6efb41de037f168cee248480b57e53a042831787b2e033646cb4a27af3a3a0da99afe3c3689bfa7a858a17ec1bd552f431de19b8aab9882046e1550a5fed67d0df8a5ac71210f542197121bd91fbae09a0adceee73233c93bfb68f720b574af44b8025f50b88423e925a5cf29b6a17d929c1af40ff26ff50a59a97d51bbfde43efcbe88c02916c54816115e910fe3107b1b952d566a0482b1370ba9933848aecd6da017da300400b5d03a116fec5c97d319c4025ba757c5449476ddd1cabd902f277a84916e592217b8877883d84c3c375ff09745f8548c81ba0bda4a2f06e3fdb8ec2613256d217f97b5f930ff5d74c8a2c15ca83f706085a0fb428aa0d29795a4f8e3dd2650f62e7fa192823044af853045936b0a7eeafb36135245f833acc0ea47ccb5092689f21e4e15427bd6dd60e718c61e17ab3692a25634a1af72e10631921a05514d292fcb87c8d48af446c2961e587a413fe5f319eb9a2c2081693ed98430d6f05c2e03483ee13c55752ef5687b539771b04276b732983ff1c00806b65f56b050e70befe4a91017de1a5cd10c52bce524153e70d8140fc71fa1a10cae901d550331445aa5f9a5103076c4c059329fe23d1cac6bc6b82d7d2bd61cdb5cbdd217a3ea242e80741480af2a99b4ba16b3dad5fea920bd554e4a17c73f53734c6fd18b5845f6ea0885cc08cabdf0f22e209fcbf8e27c97f2b948a3a7d4040c9e4240123972212a1502eb0f3f41be275015c4aa5c49f30e304cc33793dedbc121061a045a1cab8f1d27c57b4d5346e20838330b48499016f201a1d7ad623e7b106ffd6a50a4fb3ab7fef44448ff36d48b3d89e4a14501d2833e2d20db22c0b534c49503702ba070ce3c6b880615b417b731f1506665e4cf6c0a44f47fc1e1d0f369c5ee231b7146b2d0e9aa941785aaeba19fd0d44316967e3cf35fe583aae85df9b78ac86f64782775fdb9e11b3175e98851645c2e49cefa7612135a4ad70d677ede1defa35dfcbed24ac79da52a71bf5c35ab94a5385c8b11593e6f2bcedfcd1bc8d18cdea3165f75df87512e3e07ef7b278ee0874eed64176a93320aa3114ef83f1133d11e8398db991fe682ee8ef3e5747f02a12e06dc539cab1a994882476446a65cf8bb28d47a751c83ac32bee4645886bd2cc690b0b96e44b70c8ce6dd117109a8c274acf8cc00fa2673c66d80cf5bdf1220daa6b86725ced9c20374ae329ca6a413744a8d6255e5590e292204153bcaba4a9b70e8322921d1f928938054854ea3c7a000bf43121417d7278b3ab9323d0a811e984c26dba9a41b5ab326a74706a9e848ae6b55b8bfc0d48be8519b763edd175bc91870f6a812b9bc0b7bbf30af05d062c1585356002d4dec22297146954f9a52de5fd9215d36a3f5915b73ea1c3d9df9dd3e9cd41f1d4ace3e7264cfdc49fd61b311944cca0dcf4aef061462bda26d310df3d8ebf2d41213e6e743663c62f2823b2637e4d977ddf38cb08c9734a9409022eec6dfc06183509e16dba758a66be0390e46f6e363ee58d75968796680541a370063850d42e54c03617e770d54bbd90edd8728dfa9b97ddc139f155276293567287ab02c61d54ed9131a2e32c6713342d99f3828605b0298d7967670d7001e2eca52b35bc53e9aff0747c891b28ff6cb7192ac282a5143123aa934b813977219569c32aa1ed0797570f25d46dae4d44e4378d58dbdc4d6c34dedc07a631b330c83007b327f225a5729a127c501bfc2287032fd78c5367ccb256177728a634033364c8bb513e21db34e757b9acb580eb140f05a73f32d5b8ffa3a59ee3b1a44fe2c443ca5bc70ef6a1fd9186c500d990675b09139745c3da4907c18c88a53643508291bf6d365574d2510d014647819c541953c689b59707690079cb36a159d861cafecd10a142a6e17b4d12072cc4198a59b90d95fb36f043293140e69d80a28a298ea81471be28124d12ad79ea70c51296e69262e0f869dd9dc1f3fc42452bb84fa3ef18f5dbfdbb11bf965aa3da712133c0a17edb92972f6f3895a7077f557a00b0609d36b3a547490be105015fdb946a943f14303aed7b336403f4fa6ad62666e057de24a0a7ef508a9d1a84aafe2f7203ae04778e4bcb9239cb6296d3f42ab1aaf70eaef838af1551949db259b005d999ec1e8daac823cf468217868fe5a0fe821448fbf0dc7f78bc7e1972415eb51133aef84a9a8a56ea77fa94365bb94477f6fc56c0b0c8b9c4d53c7018c47adb42179b7cf64788cf9da76579358ac509dae1b8cd75457802c7c196f214339649bf842d5fa4c5401a6f96d1be5c0c91662659bedd92cba8904908d3ea17a365cb62a8073633e3c97676b513ced8de3c95249a370660b7d7affecffb3293923edddf865852fb0106d8a61cbf05f8f8a1ee850ffff3214ca0a476906562272b7a45f3f892a6b51295b622a9bf7fda9a0171b753e649306e85ba3be2cccd6b27e7392ac284a5f13671323acc816106d9394fd1002615a39d06e43afa160b8a52e9b4b914a7b3dfe264bb7c120950d32320a78968f90dd7113b0429ea7d9a6942ece9e2d4b3380b0637cbb278e1bf0b2ea519e8be58eb9ecfea06270cf415f0e149dba8d570d2c3f3478f54909d4b8e5231b69bd4871e37fc55108af6230d46cdb666b7f8341d7e3a3f30156133707c55baacc7d4c0941f932de5dd3eca73ba27db6c005189c76733a5564ebe49e1b3fda2065c954e416fcb86ef1cfc7c7a974677304af170a53941df0c0817cc87bb7bc982223f9872c435b211a73d655943466431263bbb9ab383703f43b7ce6c416082f500e570bd7781bf735cb48282b5ef6e1863e054ba9c84f332179e141e5e2a961f27198c853e45659cb96d8c8977ebba16070e41e26e473aa7b8c287c9d008092ccabce4f6ae0dc7ac6ee03995f8c64d08c0914ef6846a89d98f372df3808f02118cbafe55414e47da6e7343e82b742c763512615965205f07f09e78a769faec587e8588a96d34f141a753e6fec26c01796b6986eb6ce79cc395004a90e694789d4db521537f52b2b21987e5255f2aa517c8fc2ad2176c0bcdb30e4f4c17647f3bf745ea17ad18d6be03ec942d3593f359ac9ed797182c1ed0fd0f596299fa4ae80afc561082619e4daef1b53fabe7e63ad6164ea7d4ded422f61991434850c78a7936840d7455814f5a42a88b08c949a61262099b79993a4c941f2f3f0d5f373d6c51c0ea60f11c2785b42bdf2cd87dad078f325c54c1f217ded7787ba9b25b91391eda820b93ac20ecaad04dda62dc2eb6ce4acacfa847b01bc90d1870605017b41af80151e96e06f1a8a0ff6f09780e5d1896e15b56c6a00829dd876b1d0fd1082a520fa3bc942ef5f2b9d1d93f9428ce61b08e27c1b0a3a379975d6d7d6a5f9fb37b723d094fa0e1ced2f32ddc3a3aa3fa46715bb6c44b48ac1754135bc1b42f011705465792f78e8a784fb7d3d437580da706e1352fd72760bfa24d0f4b86f2b7d4ee7e7b2fd1f8e93c9a553dee7243fa7358f8ee2552f3420cd28a7b8857ba105d61ca0625733455dd614978953d0b2f4ceec38939d47bba5def324fbacc35602319081dec289c1ac462ca47c9b8fcb4e9cb4709dc372d17c9f89cd1b078b3975d85af78b18fc2f0b641713d22ad72158d4e2057631301522d03a8f2d44608437955e70bee737540e8005a24d3178d4910d762e43fb1a6fd2ce22b997648d0cd22ce92b8bd202067d621ed1e24c53b229739d54d890b4ec7046ad87cc6a8586eb961a36b59c18495042c1e47cdb329f9ea7c7eb27ba425ea1a9611089ef1981c6811a2444a86921f29425a96c9533a6c38021453a3a713914757390066f06938a7673648071cb9e05add7f1bfc3dfb11733bb56634885b7e01a787ea667206824e71233c04ac709fc0b69f03eb3c66aec49f977168e00f89ec45c73f239f774eb81883a0f9afc2613c9f51cc1e136dac990046c476e51609af611c57f91133f56694c2009623575464468143834ce0b9f3afbfcd99fbe9028faf89124c80712321b57ed564274880dd0f8860a4b1482613ca1902dc830c66967c7f4eb8766e29655e05943ba972cd57ee673a338017814c57115e7254af419be08feca4119df2110ee7c3af749b00c4f64338eb6a3e26ece84dd7197fa83cf117058f16f2b213242023a357925185b8833bce9fa6a463a8bd097524af242d30d15a89ebfe43ac3c31a900ddae4807b407471a5cfa04dc121f3ff2d7022e9ea0f043c4e94700b7afedce2bf8a1b69d1fb9d21bd665844f41adfbf875aa32b822437446bf9762684dcd89f903e0a2080add6e8c57ba2c7800ff5c3ed97f391f6165ea788026ff94500e07330003d98564730cb66fc3f36edf35913f3a6ea77b5cf3761a6a210ff87c8dacb690a6e89a730eb42b10fff2dbc2b14e9a52375b800117e8ba713c4c48278b4f1e25a41962a0c039e5562a8647035347ac349c405cd057a746b32e272bf2134e1f4a9aec73a8a4fa9b6958e5b5c6b84e388af6b5f0835f02b6b25e8c9304829f3e48e5f1358c2cb25baf483520ecdafde8e5e5edba7ddea00ac0fa09ea41d80c11fa6dd3b576a77ac950bc31682029c107913fd68829a808cbe8aa247842205c25d43569e54dfd78bba2ebdf34b8fe82a4bd5f411d7bfae527849c4e7ab155effa75daf556d91fc977a3d860d2cc57e605d8783b64daf8639ff6aed7e7681169bf5352d3c5eba6204c491aae9fb26777a24eda04d7da0a4bebc49e96a116093808578e9832570d93a7afb4853a994f04a2c35142a467d7c6cdc8475b6db531ab43482802b7e200a5ddccc12570b148050267a597c317318d5135b320b6775b003ea96b0dfedb818810ff3cb28d470976b49a00bb70c77985bf7f5a7833a9a8139ed5b6d887194e661ffc5508b57bd9c3ca3451d450d584debc16b66834c725b8a7aa9d6edf4a62668ba8c476b4df5188b0f22f9f2b116cf42f71e6dcd159a6314df2071bb36ded80d60ec3b94f0e66ea8ae520afa58a0a2e61fff41f40a0f17714de6e54a13737e24c4fae59a755b9a2561127d25ca9eb6d0c7c39d1a637e19cc9b32b6f94fbcebd3cdaede66d20e5b4e919fe082b8ea405b30d859bbf874b0ab5df4b7e5e5d7ae8fde02c111ad6186aa5c7bf08883dadf6547c35d3f5aa7b7ba78f30719b0fa42da59260ee3ba1fa31a2cccb6dd34ffa5c6838c908fa9807c0361099003553f1040a21f5adb12caa54469a24d86e592e0099b2c402a8ba21283b9b5bd53078871c1c093af1c383353ecd5e5247bcde8aa96aa86228173bbd752ae973e2be2cfa62b78d7fb6d5ae9235f83b579b84b2dd07c13bdee6a2ece259bcdaa465951e1e37e32660eb6fed8884896694ca3756a7860c30fc54834116135712403d09e0b93e3a1e2e600a24566ae2723836d702e24b29cd5105863cea26416ca501e18dba0fa9248675c316598fc250b4a1d7d066e51ef8de0e4b8b6ac336468efe200d14114a5218f5e53fb1a3e774f9ae68a8e462cb44faa40079c80073043a6521b60cf67b49ea52abb0dac202baec9ee5a80dd150ea67390f142061ff3ee59d03abf35fb0b28621c19aa297c64ec89a8d86f2f8556193eaf0571683a87b21e987415254f301749d05314fae81c1b611d0583597272a65a86d6b9621249d71a57a5c53d1324e305531ac1da83a295857ba7ac71e40a7c9a838f242839cf5edc28aba354ee999a33a24cec2efb205c7ee6b530762764ea744e060520370a6c3c560aa90afe476f5e244e2c0b1734b51e6e7ac43274ff4323f2b47128725d385b4f8359a83120c33fc25aba82e018221439a1cb99f7976817187a10b7886b4d298a9575c131b4f3d679db3ebed701a4086c56348155089f0d17f37cefaad5781ebf181d96ac896ad41e4bb3d6fe2e0e3a4e52b34282b608fb808cbafe3943533176dd621d5f7289bc371e4a57e04f3e117f42cb3c03bafe3f24fb4660a598c7d13305d2793f1983e99374114790c7719690fc3880edd927e5b5c7380e526830e6ec6675ce064dc69e8417f0d3786f2811947218c2b8cb1fbfe68bbceb7dd9f80a0692b2c609f5e063f9c384f41f9a5cc0cdee437e0684f2d15eac2c1217f6845d583317fea9bdd42c215d1ac3937f1740ca7a5b4e97186374a773da945038e3580e9f2bd3156b20582c7a14e9feeb20d676bfec7a634f876da72cdc17e93af543d9242d5e7be35e2b5d4110e8c43b8ec8fa07caace889ad2bc6053f8a30fc8dd9a44a1f750be32be1690ff27f2afa4c0a7438b25f78b1f62983c42926fecad7d5c4cea976ae4892e83656fcb7c5d56362bb23c5d23feaf4dd001949032291a091e22b2be5e0f14d07d17b380f461c497487a65730b7eaa6c0325dc17da9bc4e3c7d64750f0a99cb201235f416ae5cb0cfa2bd998a3fb29b5f2af828f6cc623e52be23e4641e2af6b1e567d241b4cd2b073575aa077ec034e6ef12d3c994fc0ca7dad13b6ff3b0112be56e6c51526245df8693f552c0e1d3d60f9a0ce72be78f73608894ced862c776b2349426a181e9bdc311ba318286945a83c002fad3a97bb5f2ed570a52f4484435b01f94452121dd065feb583843fb5f5b982ca732175b10b38477db24d33f00026ef182778bddd01a91bc8afa63ed42b71aae059476b146b4e83aaa1f68cbaf6077f9d55015728e78178a598e312d62c1c0638eed0fde57acb7e6a6a851d69f40b6bad4098a0a0ccaad54e731f1c449551d9097e8dada659472dec0101777a131b5788a84c08a7b857d7011d1440ff6b03c3513756805c227145b7c0f2a4d869f4c806e075619cc25ad42f4a18c34a69a652c49ee17de9325609c921c1d5c4167aebd672c84d4cabf64aa053940c4ca6520cf441f3024190493202909f0d9ef02a2073f3c1218102ac2160dfe7988c19b880d0b370de433f397809dc9852e38363e0b1131e115408e0dd64a58450e15b7f1433a5bb9a2f00a1bda867dd23a484dc5378746c1abece7c666860f05c487a1efb7f6af61f5200b8d3d94bb8fdc77c4b697c442b3595bf6692bf9dba4c0b004bfc691fe533150e86a1a54560cb5663d54dd0d65a8fc4c070983a670a101bd94224d17041b1dfb02808885cd4c162ae8e209534e0959aafcb94f75b248d08e9c98f6ba8d31d04f40820ae2d76eed3bbbdaec202a9b7f4fb9673a0cd8f55012dbe1bf9faab505109183be3addda4db39e99240abbb460b457f4bf2000d7c537cd9c50a3b1e099ba4b674afe0e277fdf4d0459219161129d5088535f442edda26affcb0de2c68baa973d4ce4f8da5a685301e05948e27437f262285cc22ddce9e0d106451c6e6401757a84111aa048483bb6db6ddaae05e6ab6b656c61a25fa59c4e49dfaf51bacc9cf8ada80e35f04ba63362b7c10a9f224933c429399d0b468d3e5d8210a122e57af2196625c2e1152cab5cd1ba5cdcb58e4c3eaceec3acfed64a3a119ef3d6ff0308b6f431c818aa67172cc97bb1ff22c5ad14cd4836dc90dc6c2b9759690915eb45edc4658a247a62575a5121dd8e1af9530bf82e4ed63a7b844345c2589dcf965b5519913c5639270f39889e94513fa13088711b7af5cc12b1339d1258ebfd1c35d331b4cc3415206d2487102e070935fa46692447d848822eda598b18c421ab41323667c097ef175f04cff435bbf732ea222907ce585df0f75a83623b55388f3fe6186b312cf0381d4cc8f6c021e846834a0da50a24075935ac0d676dd0977bb23f680c17007fa9ea904185eac8ea618fce5653f5811c038cd23e80808c7bc6b6582ee225f78b2f1f122a7ff83f39fceab2e33946ace8bd0be2d87f041983e4670180827a70463bbc0581476fcd12c1d90a0e0832e83f1ebad08c70fcee6faa3dd7418cd15fc84198c6f177b612bd758d544c8849e0d0f8bad9e4e44b553022914dbcfe7531b1e1364d967e86498592b36edb201974490391f171154ff037c676f9fe4a8d64f093d7d92b5d279fe66f0e767e40aec8843e7ec058b0cf71c78e6d3e4e524acd9c98c9b0e3ab14cfb88b9769855dc95bac1d316eaa633cf1c1f5bb7bfb7bbe381085a915aeacb64bdc59e3a88fbc6dc626673f1fc6421a0ac000b325d1a7e2434b2dbb31e9dcf7bba4c7dda01479eaf2b569809694cfc32c1f8db7ca67889664e8ec8e335149361fb776ea247352d8a6931b2316e244dcff1ff8f7bff8ff5b5fb9c58a813155b9b0afcd985d1add38d66890489ecde3817e85fa7e033ed107f56027b4c8771150f7731f380d6c125b9f223f90b65197f1b9537d4640bea0a1ec2cf23338e2671b16ba5101bc57e0093e5b6012615a9084b0343d39fa0ceffcf7fe458f041af97ff5fa7313b10729ce863d15dc9ac9e33cd8acf206cc98de43b72afa04179f243a3dfcbc6c2463e8da404cc07389f8a614300c249c2c516ccfb612581eacbb4b71a182ad45006784ee913ad113b5dd103828256fbccd77db0087e704d0cde12e60beb5195c3156e55fadd23e6025ae90b1bab70917a2833a501a0705142e8df45b9dfce7a306959da2796568fed1fdc27c596f1d6ca72a7371e082499c22a8a0332a261c0ab1f17e035aefe52a28a4ca1564bdcad2beca20b289b7ab3924b658e51f26be46831f7b8f15187c5e6a456400628fc8ea9d53ec72e42d3e0ead4036b87cf3daccc9247f95745b5d2f12f620a3f5b3ab042af1251f6d9c74f25511c25466ad94fe5a4646477291bd8a6c11cc1e5fe40dc387400ac08381b306458e3d2182dc1940034408f71992be1b4a07410ad5f38468bf74061291bec557a7123cd4ce20d9868c210a14e97668939b7630be2f11975300c7e960c96ebea98fe3b45f29b3aafa7d07b4c207c2be50fe37db4a0476c87847b915e1f8733d41de3424d58a38b7bfb3f80c5c5177c7f37124860abf863b450fb5939324a1cab59f4a47363650dddd788b682dfa0be4bb419577d19a14d16e466714d4842c9fc708aa403b7dba92fbef61531fbac08d7940a0f4dafbcf1c31feefe1261741430b30632916eb8eaa46313c61914d079a9de80345357771e002210f728e3e1c5920f59395595e643f9e0028f2561aaf565857a674d0959fed44d59e7301e43a29b5abcc5ec26f54d4e31006bf63402f06823c180a4a8027c880683ce6b1de121aecfa1f288062d3fae93fb6178010efb6c1acbecabd557f3127e4ec7cb111bb8aff83b4f50daae23f9b8ae27a0023207ee337de2cca8edcf08b30d7f3c021886db34b330020e6c5b06c899d3e0d3d97b5db075594a56fcd83c43e03fcb1c69347a28a14bea9e52c8c645858cc1bed0b60953b688842f64cfb28938529d05a1d0bb7ceaa60f7484c395fe4e496c06309ccf786ad0d0ef121bc6721814bac3ac8d8f2cabb3385623ac4756422c610974a59937229fb05a6b742c81aaa3e09912f452993bd4b1801d28e69e9c8db958de6a6e2432df8ee09608614f97ff9493e9c2d8f9a59c04bcba37e0751c53a371ff1e62f102a5ba703643e39083e0a290573c14d5335f647b55269f58ec142f8ffaf488dcb1a846cd4fb24832ec0d87282dc6338850e27f7f4e7cef991c3c321e306ea583ca97f8792f38b1ec274d3296fa40c418e7513d841b7ac2b4c115d424340641b75f68316313e6a08283fd1eb5706dfa103ec07073a1aa1324f706ac2c7514d9500784176125422c63e913ad8a4e79e947a0b827115d902ca2cbf57d5fb6bb90ab9fdd5d4d4be829113a5df6fc80eadd7a2af4afff3d93eb1ee19112d037db61721f00026f36413143994a824183418769dc2383ad317e2636f558d90c2638453098c834bb92300676a066b53c5f2f16ef969646290470637527a09d223e1d15e2470b64342cbef9120c17ecdacabce5836e6e363c5328fb343502ba0d13add7ab45e74af560a8d6c08e46757b5cf611b453fa4d3d00fb64c9ab03853852ea35065ea4aa95c86861a6a9fd48129bcfb29d6915653580efd9cfd6b02fb5e046a8188672c83764c04f3f551d821c4cb5722262dc819e1b662579a71b94d22b726ba8e13013c23c1e4760dc1f2108c2d31f85e76e8d27dea112dff4f8c24f259d458c25594ccf144bb603d79f9ab8a3bc8c654d45b8f90d1fd18d797c00ccbbf7bb703e42e8a677044868a2a9c3a7ae135ef03483493b279ba880bf3590be1d26f419550e14f8352295df55eb7a231f7609144051d650d435ae21fd559bc5c4ee98bcbbc687127f74fee2bf4a0ad523a0ff83d508e9c115093b6eab713d39a75f3877eff228f906df637fd8fdec24dbad8a9041394525b88e0e8168e34df42455e39ec2e0f4c008f20e1ab20945f146e48b967e8ec443913da27a2d1f37198f43f195fa6ac19a42a14e8236e102ac87b018de97879be8ac17d3f26651f3760093d290413b866e534c7400e04f8b45783152812ca4a8aec426b96b56c62b896c1923f15c6fb2f09b2b4ebcd2378777feb90800d77e6d7cf986752ef1a0664af847f78519051663c076423f593d903bc12f3c7c51fe00434c6b88eea2397ea54002279a7cf401400d4a058629e077e4588f0ed99c6fb125cb2cd4cea8680309e83a4f3672b68a4790ca60ca2f57633dc0f3d687081ab3cac345571e85b926476fae77cc90d1681e51ffea5d1d3792e5d700d278bc0a529d38a678bf2fb34c3e2394da13e98affc24fe6060e3ed0356b7a86b4f7e6632734c6d30147906ca624ba4d7464d01e1b2aee80ccae1d19ec546186bddcaa1004ab854e7dbb4e0d0324061ae39b6d0cb581726d811c058d62e877e14cc9592114859dbfd4fb3db0c2531e82d36542f6e4d9ec1e57680ede63e6e94b46a0dad4f0f7d34d6388a4f6fcc1ee83ce9d3168fc2afc2842ae73a66180484bbc5551af3908f16227025e8da5acb4465f3b055365007a08984480c1e5a3ec68f3ac21ca00a9d976683edf6278c58987c4921617af963c04751c9801fa5c543cf61378f7b0144146543701dc824c79128fcdd05980c3d686fcb22d314c09fc56f99648f4259cf3adee3c6a06604b0e41c1ef9511c591662682eb88a3c5704fc8ce5e0ff23813ccbf6f620e2938c1a7ce0f03d57ca7a7e2915d849e0ff435099ab73135a804140200b9dcc9205d9104e0a94aeb05d9dce5143d28a19192812b01e5d2144db5a27aa8f128d6cf8dfc4fb835c58e6ca93620e0b5c19f98e1b140b54a31686cdbf09e2efd6f65043795fc01d81af1dd1e48d48033f4e32019c11f923d44f3f01a4909eb2882a780aefa8e589c2eae3ca5c44fbae80c693108740011957e010d0196a958c7f202aaebe4094551cf142475c844f6effda1b2f3a3718e9662e290db4a1a13aaf3a456dfc040694b9ac8791e5d5b57878e4e90261902c696000443cab28c3bbc8323fb46112b5f031c8f0bef02b1b2c44c4465c994911a1f2c994a528ce058aed2b848f935dcdbc5a6004486a4cdb303dbf28b5ed57468732eae8ec84d3c2b19ff71a5892191e0abc1a7a224af2771430482bf06ce95f964a6020c2d3b833d87baa5799ad69035acd8cb54a6d349a19fd479f88a31ce91c5cbd0d032654eb075f181466547ee58df9f83425525e377bbdf6f7a0aa608eed8366a1941d3c51686afa20c7b109c2d941beedc347f691aa587e2f15b0e6a318bd4e6b5d3a7d824e266a13b85286e12bb06db3f8a9b785c72f9c001a5bc1e74f2b46dab22704b4506e74796f2a1a236296274676af183c9406128e85db69645a4f009394ce52117793c18569f361756420e7ebbf0d6c26a180376d66688c23d02be7ff9f0371ef330c11461a25257a09122a8a632732d0bf880238538c09d3ba24d138de9f635dd5377145a655b5e484d73cb49d601ca79d4c6e3f1fac491b697705f5dad023526b057f14d2567bb0371777e55171f1702f1c2c3e2cff2156d033c36c8f7880d55cace680d09e6872faa781572adab4d0c6539728bde510c0b752d232124b9bdf1df7cbff641dffd2aa87e3d664fc22e92593ee96223de7019c9525307eae21c4128f4b8e156f0da8fd94161a225a15d281b2767f831614c0a3b087188ce60226f7b980288abffb64f0156ec719d03114667a9ad087a4d671742da0c6b3f9a0175f66d7a42735d74392cd89242ae88eae75f3645c64dd439b08dd8f8e9704eede81528eee11d0263b1cf8a53d3825add4a31a36f4b9faed678873c88300790fa55240848ba21c690955f159c7f74410546cd51ab831a3dc89bbc1e4764fd09688491ef64e700c1d048c695791f8895f91cc20547860986e138f7e735adb065e6f15a56d71ef1befc00096a083fea60bd0d7e86115d1616f7afc5638f40e1c00920ee6d4aeff03c0f195f580f20993f088ec1b7708c71db62db68400e8b442eabce53aadf058ff87dc87e6b1b3456b7ddd021e3c8e8e1bc37264d73c248c6c4ef6a84117fcc52fc69dd990ce19045a410d7d9ec1e493208680c7deaf5d349f315ba14b3378b93f3964f31e9d1ee37a8d99666c4b53f9e097de6fe44d549968451630d8bef9b7e88bb9c30e304d00425f77191c9534daf8e63193dda2151577609663305d45b0b586e3de3f32b62bb91ab7faae9f854171d2610a0a942a01382d93ecdd7d5c94a487790c88b0894546066d9238961c42022c89933281f8991e5c489f046cd72e2d836d48f2707395df8ed719896bcea0d476baf0be2b05d34602c77fef4f365b097f305df1e82d02c2f3ae72d888c7219d52c8875d07539336522cb92b04d52096ecd99465a9cde82b41d1b6e06e5df2bc0fb7cae106387fd203d8553702801525293d4f97fe4f1f8c9bc981bcc798fda0c43ab192b270944b13f1d8622558c99f23bcd947ded4caed2b145e51063d8b7278bd48488c515b1967ed1c3a9ae561eb874555ae88bfce2627dd0df0f41efa6d9f59838353343d17de1b04ac4c2e5f886f740a169148172cf95fefb53a1a89c7c59bdec0f004e69c96525487e0a99c1608dfd520e5a392ece8d4d7b26e49d880f3d9bc1a18e8e0c5bc9635fb90e1129e8e6fbd9ebe9f59ecee1ded903d65305b2f1231638dc09d8f80f4f8a6f50186befeb27cc5947e197f851111dd78c2f16ef12c9fdf99c4c6d38e8f63b8711339a7afe68490d674a41f35f65e09f80a964c5003bb878f405a9ffe95f013cdd45d11f4358eef68e1b26aa3c178260f14586d43381c1231f4a17b33b012a68d2b03fed5e01dc6fe622056a2a90b4414468835a83d5a934798d5365e81cc2d6eff3f6cb53782aedf0e669af114f40bc609246a7e68dc7adb9d9f508b9f4245ae2539b8b30eff2421967656848270785634f63658ad50ca653a14ee1f2f8d59a60d03f44b5bed3a55e4d4faf8e56d4db9bf8ce6ff48b6fc06c29cf239ec5d2b41084f870cd3d752e67b7f786576c799f5b8027a2a7827cd5ce341766aca2a6c5f60a883bad293d0984dee10e2f36a30f9817844e042844d39a05eb0b564ccfaf0bbba86fcd63a6665170dc36514465ca5433f90a82c9a50d784607ce2d405ff34a875dd459a708106e3ab3f1065f121cd6e78ee08e18d7391626e9d33a2b1ab7f4d6e1360b7774c0d448d817be18dd0b8effa283f016a82bd449118d442ea9207ee3cfdf3e1b625f4e750675d8ce67ec5e87272af85bcd7f890b9aa35e8a590df65fba3e4ea9fa851330f636e144c4bfc0b5801d6b3c5b6e19702e9bc719330db84e45831190f54c80a23f565abaec626e42ee590023dff6d7c537ed2d5119f6eaa6729891dd96b416c51912069ffca9087bc0b9521a23f4d6dac90779e8a427f502d7eb83fe4c9cd9e5c79ded43c4ac6b27f61abe7bba1222cddb8972508fd3f0e0af822c93bee2f92ec1e4b32c1bd47ac93eb95301ee37801e80bf5282129c27b90797d265f84fcdd65b8ab77fc7a65f3fa3bc00a1703638ac0c3713da041f443daf8bf7b89f8dfe5474f208815683eb2030576b54f7cac29f2e0bf11dbbeb0e9bf6273560a84acda6e575dcf05e974eed8dde95b0d172118f170cccc843b7c38ba35be3ce47a37c97bc13df6a3aca8cd747b500c685036a8281e9f377e2420c7011a0f8746b4dafec875c7e0e94135ee0dd0b449de0f01cc1f0e274e0ef7782226dcd06bea3fc929f646c5e7fc40b8836a51ee3720cfdb29261c046f9e79b3819300b6b69be3eb020a6014870e974b3b274e8aedc00bda0fb6721af83922fb992e56df4e4e86ff9f00d7a3fb83caddbbdc73f80c96a2ece686c31a083f942aeb6aee66552a75727300b41b5b04e94e48bf27c8ef6dc2318e7fb00b25ee2e1b58b18038f03befeb9054771cf20044dce8d3de4c276e317c039c9d2879b6742ce5f2c6b936731bc2a8797f6cac7bb61d2b6c1bce32e03827e60032c50ddc464eb69af9c47a9d930e4a601811efcf9fa315facb2f1bee5e8ff4374e616320915ac5ba7f67b74fcbf24faba86a830abd58fd07eac668191c116e794153c95c8c1917214125ddbeeaba1e7ec523549e51be72a455c2e2352ed29484e2e47184ad34a1567274b8b98da12c285e2e710bb9071d34be0b66125b9962ad66d873ec80b2d59c46e1b03e3910797d007b71467b0d0e1239df3b2af9b40bcbfba23e11ece452486706bdec4b98bdd4be5e68f4a2bad339bd598f3016a2ff05075d606672daaa585e807f0121d667056a4e66820e404546f91d1302ea869e189a88f93b55748be32df0557c8483d14f4e56639a320620fb94be0ce10530a37129ea07f16b1055cb59823d3b82dd602a2464003a07984444d134b68fb8a8eb73a34c45678624e248400fbc2967864eb9b4b21202467ba1efaf76dc43bd306827e2b1df89b013c19ed22171d97722ca2d734840c61469ffd11204ca2125d7125432b03234da127d7b3d5b06959db8a2a4250353046bf91b1b6270161cacf0b91f3fb2478d8906519b3be4331baffd61d56898b83e98778219d624e4b8f24c7ca39b3f22ec332362a262d93dbde261dc3a2ce4d3cead44a98bbff51569c3aa8657bdeed3e7ca04bca2f3b5c0f3234d7e9f9b94314f39c21715c60d6166d13f3c7d4c05668a07156b24b02f3c4c6d5b18da05b0512a81f227272cd946fe9721108cb902fb686f45778b3e80bbb66c7b4b810e2c4dbdbee51f56e9958660de86aecfb39398bc44a91b2e78f0da1efd1f7d00d76d3c00157e325c6933f0ae2f5d32a77eb8c9b23c0bba97ea474eea41376774d92d0c8b2c0b1bd8041a754b183e3c53796668064abed5866e0cb5528b41116852895b1362529f07e2fca1267f00358a8f2b55dbd10088a005f10895ecfff8d47e60b1552a810f2c950fc13369f4e1b8f2e40f8c99b6cb235cd19f9203f8175b2fbbb130c78657297946b98e214c4364b67cae9ce4fafc65b3682ca8e4fbb48322c94b97998a7504c34ba278a9df71e53aa1d1b43eefe7a5d032f50edc52f91f28dbafae4bd9d230f62243878da5319122728b7dc911186f82bb9b3c6f9b9a9989fa0ce3cb9d564a4f945505d8c56116d98150a6cff51fa80efca7660260e9aeec968ae214f8d6cdc0d921fe484aa922e515dfc7a238d4c3ab5bc741b11fb9d920720abaf5b7273e765c4d14de7125e68da6ef5ab1180150983e317d54cdb9d34098523fe4149abbeca6e98388b3061ecd006a0d1581ce34babe31af16e2fdac553336221d1e81c1e1ce14d16b01d798e7e126edc895638fadf32a40a816334b3450e16dc39081730d3d91b18bc76cdb05d55705285e7b1219687b7107d7c9719a35c2ed7659c436f4d260fdbca5199f2b24e12951545dc553778bef34df7e5f39682024420ee24a2cb66db789c0a42c9b5a2eab4784b2f116b60e4a72d8e9c41a6578f29897b738ee6b45f7d9afade0e46a3a3ec938841c3f747038dbacfa7e449c53e5aedafea3a9159f947af9c29e4dfc7a1fcf8f5f0f28bbbe31b5924622233f5bddcf2df1addbbc1dd4d40572b60985d120a62609a2781263e2bd8e9b89aadbdfa9246699821b25d8b81616e1b7c8ebd91ac19a6a12464960bdc21d3631937f6e2c677e1e2924a1274a83d0cd3bb70ef14bd00732f5bb3e64db9219f613fd6c0ca9ff8e890ba772bbff96431032b4d816afafa0b0c3feac1abfc6deb4d95b6adcfd7a7ef066acfde708eaa59cbf881791a46228d78066224d845b940363b0a662ea6c4c1777e1133e7740b6165e3bc498624615f67efc8c3a22e04fef6f4b4b4650a9bd2c3c789d6d24b887e2c8e8caf3fdb7a6b4f2c86eeb0d45dfa9547249e4e8ebe90061fcaeb9331d8e91c22f4cd3e6b6e74ed0c92a488dfc41b3d68a96272d65d31aeda3078d1020e92c7ebd7e90ae191310a06d0171116880ab6be5e3c938b2e406957bafcd5bc063b76969e2213807f3bfb633719bd0c5738d527aa5e2fa3699295332ce601d9a0625c75a8761a10a28c2d9458b7c4333168f8b9a7ca409e37b6814d4fb4fbd2a0d30a33d8b819a5c9ca4e221131c2883b8ae1c3a79afa437a00f94e307143a4c8771baf37d5d87720441c1fd39e5a939280dd210c50c6e1b45b38b86ccfef800d621f03795f92914927b7331bd7d53775b36fdeebd29cf13a499ed1f3efec499d6ef1fedbd2c6fb7fe5e5b28f668cb56f076b92af25a52dd331ae4fb5f712c49703302345f04e85ff7aa970a548194c9674c33992dd1776745aa0a45be4c8336c26b54dc1549a7bf78d19ebb53fba886d92f5bca341e2d507b1022369401a74e34c384da23b2ab274886e6335bae69693a1bbd17dd0ad71aba8d2cdfe0c43374a9b20bfd8fd53fef0c5f81536a709eb553cb771f3e8b238f82551be8f619260335cc74b5619ab62cd0713a2fe0a16f53d9c7534f22d5a1465b15751e9c7d044d06fdc68971b38d07be3042c7ed297a44402c5d4b3c8e648e0ea244cddc6088bb06b1ba5727ef9a5660bf61ade020122ee5ea84956ce34db59b44d630b68c04f8ac58b534c89618ed5af6edf676f41d22530870c1281dddb2b1d1033f661e4c68add66d64d7df598c86e6a6feb5fa3112dfea3eae37ccdb6447f782a2dbcb7da6317084670b5c41aebcd4c002dee6a6b7829cea64d29df5eb4735e25652ba001b90089f8c60cf5aedf409742ef0d46de8bf7f7a03ab299a73f431a1e3199bdbf88628f75b63ad13eb87e1c7fecc807976072e085d2ca9acf5a5ec60d18bdcbbbca0651d84de28a7818d7a2fcc088705fc54a0d247354931d54c088fa279bfb7d6b2d8be39b06d0ea3b9e7da85b98e10b2c47e4ae14b9de8123c4cd83713163de9ae31361a7334b97cb3c7c03a8cbbec87fcd6a91e5583ac57fc3bc2accdc624b0cbc38fa8bbbeafb404dda058384449c1cf80f8b309d716c35dbdb0e16d54fc8f0543fe90a2634916db712de563979f50791521cd889a933187d2b3a96beeaad19461245bd2517e14e6e8ac30c1784f3c6eae5d82d76851c8cce7cae312ae5d49c3c620b7b264b575a4a2baaf4a89d61281ad038e4ba7cdcdb8fde251af28fa72cfc2b0f9079d7b528d82818e09be9a6f333aef8bfa6524d90d708f3132faee01270f5cfbcc121b80308752a89297b9731dd45fcc554adfe9b34a0f31229245f84b4ae76ba8516017c362bc433fef7d9c1253d58699702c9d7cd92ca40038aeecc6fe49451f250533b298144986008b79c0edb2332afcf2422abc09c999c08c0903858794ea32460dbb3d0a8672fc087d450b6265c8b225550033b8298158e5de4bbb3403b6149b97db1d5c7889030060717ffdaedc635cc4feb5cb3c635df01797393cae0dd0b2e809a672fe7b04d33edd0603125ecc555e0110de452144deec82a77f04671af9326cdc23203fbfdf79bfe74cc558ce9babd343744388b3571f8b770d72806712820dd1bd48f78253cffced734836ae08a05f8da02f459d07bb7d18c9a9ed1d0499312ae5283247137774664ba9422ff3d5d9c47347bf08079c9c6546af0492003cd9fc46325290adabfe0cc79fb80007a2fb3e677fe07a374d22ddd9389b6da39d84097d20a19c07af9c3b327494e50a7ae2efc6ec468a5d37be2dcff7f57955680e15d1cf27ecf3ee91832622ee994e277f628892b8939a7c2ae0e9221d07371916c003f80730e617f199e0616a3a9205855b18e5f79b72ad7f4d59fd6eb46847c5b77822e927c676fcf99438a3f5c566a53214c5144a90048be391371670ddba49920cd9ba3f984e94ce7d40862ed2fc6e0869dccd8f47892040711d5dbc90b4797e98f5ee9cad2d3deba4967511ec8d2abe905a46afd4db364d5e485d46275a391a2568538a9ad6ed406c1440b86e34145ca88c7dd707ce545343903b74678c2dbf0da68cf44185f6880acdd01af951bdbb65345881b7c43bfe4f0e57b6faaed7e8fa513784437948f658e8bb95f6892f92abce97e8ecb9d5a5b2a9badabfa0b6a9869906bd30a0e44e38216b14b23cfdc77c00033c0471e9c08ccb707fd7e3ea1ea988b897f7a150bf03c28ba4f4db3132dcc6e0a865285a1066eb3c45c024ba8ad6ef053259be9718848dec5aba517614c66064d482fc3d7e924758df6a018eda5095122666b8bdb4bf65d5a05e36f93f7fc6762b63fcabed2d36d60f971aaefc2f844c705dfb9a47ba7984756c0373f588468c20cc3e3e676887d9ea06355cbcebcce762d90719daac4cc29142ef4351d1f098780397dc1085b9617e0b8eeba286600f95b74edf31169aaaed372678317ae33ec80ad57a375a84adbda69719c768097c116ce7bbd70ae9dd735287345daede3eb3be92ed3f9b509b92bb6e693645d56e9c0cb3771323ae00d74ef732d9631202db0d30f7a01e30a4be804b0603df594af8968528fb6b341b5bd1fd057ad398e9d667e142c3cc6e310be24215151eaa772034a795b6314c0793c7efd0fc9177436cb66cd27d426bbb3c47f0155aa77bdb821f261b07a769f80ac35961998cca349344f01cd43763c6c8c43880e2ae0ec56eaaaacc7e24e4aa977df69255a9829068c2fe898da389f97813ed4032a41d143cd1342f471144ccd6c76d293db6e5ac8b7bde2200c1de2b947e5c94d7f2af582100416c9e732960d94b85acc31f17a45de35cb4a382b511d0e7d8e8ac9685db227e0a3aece20aa38ca197f43950865ce0bb8a3aae601b4862886766e94bb45b6d7fb22cce28f893d5d816d88896a9bda9b34dd3860192763457c397264c4692257288a729a66414d9286ad7b95866e863a92dbc4b02f821c2764d9c1e34b3b7d75453935e01e8eaad37b1f44d239871af2ae748c8cef09ba6473cf9a428746828bc7f52821bdc2314cf7b283a85ad8855b66f01fbe5ff9b51a2180e9311c20a85efe9d09b7f4363c222cb85756a99413f92ff6bc8aab1b667a1119600d61437eb20295c8922acf6a161b1509fdba50af8c0790b0348cff96e52a036cc09ad9fd242993ed36ff93e340bea8439c971f77d3faac26b58dc47bec76f46aa5e13e47f821e55dfc3a115bc6d5c23372258ef5542ad827ea35a12086fe0384aad6cb303ac9b796ab76c511f018cc107411f7ada93246d7993c0a09f8229d61b7bad566ab083837f302d471f368d84db09fcd2ed62210bf3271c7a09347f7b29eedb2f124909d11c5a95ab4730cb7301af059e84ccc153387239e651b79af056809fd1e1a6456b443170759546b4b33d9daa4c6d57286d4acc583eedb752edc5c410fc7eba3b436ec3b77986075002eb806f40217e12eef0664551db4a9f3eb5798f91d69b4e12221fa502033ae9a916d155797528cdaba757eea0c8b32a3dcf90f84210137c6699979477060530db739a1c6aa18ef4dcc459e201db90d0924b94f89ab075da2747e07a839e7f6a0224ceaccb31e9249c9e9de003fc654c87f69c201fbbdadb414219e72359fb43be75f67b63058609c8eb4a29c4afe833ed7327437b6f31697194da86e01553708ce74e56094ecddd4dd86100205f18869f32145625604ab8637331498474d7b65f1c0296333daee8be3a20e2673a19139a40328bbda458da5fa3e0b5e72e288d71a04360d29f38881c9e6a9e0ba2b7480b936eb1e125309f4cae7f2f197b7af3418327fa2c0a8656662f5d10618afc26879edafcc06faa79f0872fc18c94f0e1e09a1875aae32175132aa7d4eea8b62a8a4cada99caa2d3d7b0e95c8f104f41d4f6b50d9c0d37988d89e186192a13bfab517d21a8554ea5f95c9248d797ae04e4ca8144cadbd6c15c804cbf9dbc249cb9b50ac4afe7c765601d0c8fea48308f85daebfea34c9a89910efaf35831dfeb3d4947d540c980f91191cf7552c62e415ee9d1491b9dd095b197f73b384fb72c3a742292d0b3ab0a09128fcb0d98c6d9412cfcd663da05a233d9b7875907a4bcb425409ff6cd022066dc606cdfd6a17908b99c901b9f2f4fb4daec26dd53b3438a0add4d29f4f7879b3e839c8023a5a40cb7d41905904ecd0ef4cb14b27e272e5ff549fe0e9d0f1aa3a3550309c4ae30980e7327b13e89c21b722ef566d346774f1931a6698ff682da3727249eb0949243049c6747f7b994da90728758f82145a8511f89eb3a897df1ef801e86dec5afbb9fbbf7fc024fbf8c8bfc0ec03184b44c9c7beda0b740130b629ef9654107a8384c45feac7b559ab55f59b371992e6bcd5e2144d08a72580a78ccd98e0dbf81454f74da3e472bf50edc64646e3b6218d6aec7096e1b71256706bb1f4d91bde4b09d66c745121203be67c323e066d74d77e2de52a67b47981f7ac8b397b0eb91bdd317d31f26d0eef0c4d8eff8d5d715fce3e7812f370691d0224d309e0f2401a3cb5e2365d4a28ea16112b17077ad627ac3bf30d270c5d98271409d38ef578c64959112a2b27cf4a524068dc57022f28d4378cd8de0d15111f8bd9f48a9803bd9780314ec2bced8f27e0885aade8c63126e580a2283456d79c14c27d876902d447a2e27f49f3c096ee2940158543b36e09803d543d558a161f02bb336809aa0787d168478ed62fe546d7f9448c1ead2e010089e75b378ade5aad8405c5363dbb9e898681f121820fa281a69996655c34ed5b36e90b44513942894f1a525bafa19cd9ed52cb3be5df3f6af7d84a55993efd8b4a145d4dc6ad26c61de1fa88a6b476355a091818c18425dc8288081dd2414fb6951e2f6932eee96c02d07c74d23248b811f8ab8e8df0e37e9645362a8e752a0700b99f537c5dc0cf46d3c0af9616ad26ae3eb037c6579683589a72bfd333d3ab7f19409650586e4344af1f5388aab5805b13f5c17a56dba9a4adf72f2e570d0d4edd162ccb96bbd6c60d9491c668716888bc693697d5d6860ce43708594c38ed37369111b4e5f6a9e16801b1f2f54004127179cb179458fa9033365cfdbccc4ff75f0d3fef5495b78239334e7a635818a936904cfee2454d9af85ce9df93ba3d37bdc73353c89e7eb9d91dc704d8533a30fea54847079d992a0d888694ab9ffd13f8786663e85c7f3881d2234c591a7494238aada1c300c780a6714f63945fa879eba0ddeb46aeadf11c9231a31a0add7ed2c2a5b99e81850dd96df65657faac6ad30aadf7fed4cbf885cda371c14971512a8e08f62bb6c704e83bef57689db5ce3af1bf2a29270cfab2b7227bf9105b57ee6650558259aa8c9fc97fa5ef952553c611c8d049d87cf0096f63031a5a6fcd2e2e7ff99c9fe641bf96c80c823ded57b4802dba1d43f4ca1f3346c35246203de68eb648f31eae3f585af21bdbeae96544bd5cb2025fd72e32b0b00ee7a987542fb086cd1ec07ce15d5fb826004d3fa07517c0e8283ddade5f72d881be0145fe34ba8e5527fdd665de321404f3a81457fe6b078d95be85916e9ddfda93785778b2092a5a40e24ffd97b10d0c60183e49096fc40f9a83b7fff90d4702afc956ecb1fc1fe838439e8fe60058580ef7f0416060a7293e82dd881cf149798f6bec26a3997023b075cc48d0276e83690f4d50e2e6c8b1c0ea3c7f25153392584b65f718c2e2ef7f133922fa44427cf961e55c5c2669e56a8336dbc8fb9d6d19151150061ce4764d78e473cb31fad84f1a5a115b3802c6c46ec6b44f4b75ed26ad0fc5dc5779dee3823395eea747f66e7287857b917e3c7bf2a2214e0498816b11dc7fb4c9dc665754d6d1029ae3a7aef3e20f3c372f2a3de1af0d4fa4074e72fe20b5d8eb8d75813062e85ed184da5a1e02d010074efe86564e6313b7ea2b5250699df5594bfaf4e5fb8646c41aa5cb2d68835183dda50d192a5d876830df9bec582557779c44f39b4f59632cefa6e9a1465be95e5ebcbf3095bb29055d2d30e445acf0807d7d230064db5174fe04e98e69c790e9254b304939df78eeea4901223557e1c2a208d0fc5211f74ad175f9f2bb5efb0fbe291afd466bea4eded84f39a4933a79f335a9c83da9f4c894494e47d0a1be437b6d03b22e03c43c62aee0d9a026b1f3bad80d68c3c35743fe27ca6dc5f43009ef0f9790af08feeb7435c35bb960db911f1dcc055bf06f0a170d39d7db6d86f06fa9ef856c302943af7e49a6c79dcd4aaa2684f22030e2b25e3d34b8e444c8c1d1b1ba350730f1ca26d76fab35045352859bf27fff74f5c02c0653704b394a6f8bf68672805d3d7875b1061133ee67fa276fcc413156f799db6fd2c790bd61ae29eef7ca96204c1696e40ae2e8e540284873be5e0e4d8150d411df7e508cb7f6d584cfe81bf8526ae412e91c1dbc1842744b179e8c91ca5272f7a46228cf1aa3539fe809d118d4192466162ae4fe20190a48b927f616fde9e9cdb55600f7ede37a95195ddecca5ddec0e913c11b2889f3b8bae6f68a937e8a57698b89df5b4f4c0312eac744bf9a4dbe0f43ef16869b473f77e2d438597a19f5e496e524bb00b9b1596286f7851c1f883c77e9ca98cba512ec754e13b13259f44b99cd20511b1dc631f610536593c22465a63d5e0e7097f65f17f903b3cd250d3db4139161305e202fc6c58fcfe48618069bd0be7af92d82b3170dfaf9f6e01bb13a36229b27bb29ec680525e27e0a4c5cae1579202961e1cf7c987b64f3775037718513c2e8236d73dde58e617e1d5c193b45ea22236985a3ddd7da2df1f5266802986d7de9ff383b28febfbe7360e2845087807aca8f8714546a7f5e2c4615d548cde8392bba2a0af29e7f7dc5e745de42a7d92a7d5a215ca1e3f6ab91f1cc0f5585d1f0c7c9b5764d590a8030f56a1fe9082c0ebc2e4297e084180a57b555a8e421993f29ce22314e11c2e3dc82c08cd7ac16f98db853b359c8bb33761459ca5c9a6130782600a038862db1b8166c19222737a44f8c62936438967eddc6c422510279fb115b0a3f60825eeee760d44a6066c30201a09d14fa81e496e5c08055238a5aa5cb3696966bda748be7b4fc39a45abe5c77c40f6293993bf185257685d2a973fe09794630bc768bf7eb157c7ee88e2ed9b1fc3291f96d569a602b60a2e5124183953edc1a4798e06cf82a392df2961e14608add0e13a62999cdcae321193ca6832d754210b49905d070e3d79a6cd6a7c3244ccc965f1a93c5e5c8bb57b7591064c29b6914248199778d0eacc2dd1410f1a27b1a2494b1ec63ccd3ff915727bcf760c11edf0071f795692214c3272cbe5c58aab50b53a47016082f2b62ada6879b6666da01a5397b80934db558f2aa6e2ea412bcad43db17fadf889fac015bdbf7e59c2bc3a5e9213e98876a28839ce40f9423f1cf5558d95be1eee37450d01de5e0a543217f2375561cc4050b52357ce3a224aa22afc6347f77da893d0f2e7678662985e14d8d1221e6fa10246a2d823b9cef3711c0f58e6b4d0185f18dc3f78aa1c7be688cc29b6b91589d9487539c2b670010c0ddbaa408ab7b7654984ff3cf1796a2648524f744e681469ad756ed6ee6e2963e44d2182d14a90af0b86f62b0179dc70fae7788ab0f9b081180ebaaaf5eea7d079cd59f7382a85b5aaf0d57a71dbbb322b03543fc556300cae35105c9dfdeeb0ad8e60a37a76744f274ac3d37052f1f104f082f299a7f0d6820ed7f6ab8310affcad6ba16ad73055b6afa90ad6302f8146c55561ab36f39be192ccd9c3e526336e5b0789ae80dacc388bd8c388b8696ea99eed8f819bddbdcd7f268efe958927f5f0f74d869c22ea4819306747b5407dc5af3bb355323bf2d4bf38fa26eca562f821ee468c00bd7478fdcbe8977018d461e047f0918039b4efd060c5b45e876bbbc778c95a3313e3b8689779e83651509300dba90cd21c16dfe0afff99f5cdd80c62dfbf48664398971905cf43639b5a4df435a1c00bc37a566819413971ad972ced6fcd6fb6bf597eff551150174a41b9d3631a18f70ed63f8462764f7a2e59d5888e0bf01b04601d90ec3efb73a840c0d2dc8e8d01cbf097c910943ae4f0a22aecddb9ab205573eded4dc57c2d76805b1618e527b6573ca036d8f042691f1781c15beb68bf2e2a8a58b4479af51ca9a7891441131c68eec96a9a05431d2f9fe0adc06a00148b42f7d591e219736a0eb46e2d0cdbbac6d4c8b88a7825d76173b189435d97d9aa19f5e0366adbf6538104ca2e5f9c9bccd4a1d226d75a717c79d5fb002a20698437e5270c5ff4848d49954498fc6e991636c10a77553227b326ea61cda826fe697afc4bf9a068e7341e358b29f611e16c67814aa2188d4ebf9ba87ace9d40f72cda975f3ab23cfa348ac6c6831b70105992ed576a986749e4660254e09058f8faae3ce18cd4c464561afca0ca55668fdf3c29220e0aeee07651383eadb42b5ca39c270989429a0ab31c018a3c9564252568a6d9be50608377c52acc7e9dc48c8e129b700a7ba9a01a18bfcbf0cabeb0abc2922fbb905b795cfa3ff89e53c8c4fe653488209457f8dedecc3967126713aea8db9b0ccb99382c58068a538b29c7b796e44dd475b8e74aeb52005b67b03455ef5800aa2122f9e0c5dd805d1d0b21101d6cbabca68b2504e6c1a3e2b6eb5685515600177ec6737598253675193a6b3eb12327ff43f8093071a82cb0787109b65551f1194987c3bad808290b00993795078c1fb98f14d7b05fde1643f01247582e0aeda10b1a8da5980fc0358f5a25a65495ffd7467adda2a50cb6df657e9d0df42084f6b29f005ac204fe1d8854b17c9a7bfc087e2d4cf3e2c709768d7a70c3b346d662f78a5905aeba24cb1f68a378672db43c5849226f3159c58fffa7cf0a99e8cc004178b93c7111a430d8e0ab069c194fe0a09eaa10982e08a76bfa829130170bead980e4606db5f6bbee4d44620ac5b59000ba5d902b2d4e5ce39e86fe7b32a0c5ab6fdcd46cdc9dc756d22d492270334fc8250e8ed868663144c9f88e2ca4e9ea2c1172a7e0a40d682aea1f4cc2a5cb900ac44e2e115ebd6c80ed0a21123b477fed718bc31de94e45a7ca315b536d6bbe67423e166e9b58a7d77517a0d5200ad8e140df6e5b6a0f16c613a46735aa3b7aff4b96a1257605442b27f0c68384da6639c08717a036e5b92d0fd07e4e2115e9fd8afb8d597290e39468068b836e2f55bab5542ab785c3658b2bf8535a9e947cfb67c96fca8ed3c706a9dec360531b7b2f2f48b5aeffc861bf03e999e219c7e18c80d9bd07d5646b9173c639f3adb1cf282a8de02d90e45cbe1f28ffbf31d0ae3f100da8dd101084f27305774ac5586d1c4b8df30ba13818238007a53e0e1611e9d5b3753f2df1877536d30b083d03ba2acd9a1d3a02ad90df109ac5913d14061c8f454de94e1e774ac022110e0ea4968f9db441209b754c19ea1372c60ba6b61cfe71c64e2df5d6026b2e57a7267a23b35dfc734236076d875f33e7de482a333b6ad0fd79f4d984fb1a5ea018a00de0bcb219f4d2fd1dd51a0744ba8d12b66422a8c5226fcf74ff5461ac1dca44bf3b0750288e410f4d587279166fa68225715e10b76544b7056e6bfb108962c482e5b857525c038d645c06a681335aef6a1e66f01b9da108b60e87a42c2018a8de2eb720edf2af7362bb4af6f6e1d42c100b53904b2649f1e56d0b7d1a8d7a168a5d72b1b2b55fa4004927d6d102a9c44fce549b98003e3a76b248e80c81c4b1d6de60a97228f23a15f46e2ca11f8593ddf4602a9accde595665ca85bc6a5c2d5cd3ca44ef509c684677fd62fa83132af8e7e85599bc519344e9047cdca22dfc6e439fc2bff4c7b64dd96938a7d0de39c64110e99667377ca4c6fdd19492f5697b0e3f1d1cb0b03f86766c5395f644f6c8d071bede4302dd0d8c7bad7ea1a7825ea91fe1702b75edc81befd192302974b9e07728761734dbbae6f1fd47c236da3f3656efccd2457fad99e416c398eb756e6d76f730797ba3955846070e317f3e549921b0c941e49cb2fa5c302619e26678d6873cf48a0208dc385a90387dcc2adaa78f849f8d52cdfd2cc6c6ad2d13a0b6c1b35135369fc4bcd3c8890ff984d0a83a8f6e0a1af47d3c0e8b4d9fec368a8194ff3c10f81097f05b612012a2854eaf87472e95f58a8492178056f0a3a696b6c77b34e140257e79051da22bda3e1876424542782c4ed3290813f4cab527e407b8b89a48e145fdacfb1c4a23b3d5fda785f4540247d9443a1dc2d5a90b50e0f8aee2ae189d81abe7941325436c813373290943785b14068cb072b63a78786198376dae81c67f0fc92167418ff3f674ae9b1696e16170cdbae18227d1fa9e7684760e6e9c6a85617a05cd728d508e207d942070426666538aa2f991c40d0805593670d4784fdd466cac9e3a4ec041aff0e6931b2f8a43f5a684b5762297494265fed16ef067521099e3ca972941ef1f4b3fd30582c7e38bf6305faccc3f5269211c9c2c990f5d82a621dcb0dc1e561aa14165a68471422893e8fe1a1baf3be4bd35cc53c2fdc09e48e0379ca91c88b923c112092c9d04fe04c4ac0c572056324a8b01f5c9c56794a262926deeb029fc8c95fcc38ef0117647912b6515f7b9e79de1fbacc989af45323b3799039f128027c7661a64cf5efdba801fd5a0510b42971bfc40ff67b3adb5269288904d08214422bb77e40bfd0b520cc74eadfde70596ee166f1fb4bd6517809db3a7ed5d77ed5ceed17212aab76f58098df64dfb762de78dc7fbbd3eeccd7615e636f7c05ccb3ddfed379c846a7b8e629ffd4c36ef975289e34496241289ec26ea6e4922d126c246a23c1a8dacb5d616a15e72dd751d5e786befb65b1b73adade7f0b6be6d77b3f89ec395fe06a84fa2f778b71779b75687e6fea1a00d627ff3d4db3b1eeef6556ea7fb9e2e4817f7c4d39dab9fae365f89aab9477bfc4e427de8a293cc8e0b08002da29188f3b48c3c91e7dd116017e23b9765597400f4176ea282373e38818b12c95ad148c4795984b7c799449cc7651ecf33894c23af1b9160acc54aa5d2335ce2623b853db87b98c21e14de6c5d77318cc3db07cd75227823ca9b6a11a63bd15f30105af4e54de1122dca9bf330d41c96230cc344efb2c8f3de650f1f896fe80ede6caa495c0caa2715946c8760785741590c967707bae8aa822251d5136d551ae0a237bc4f15248da882b6c832d1b591e92698bfbc54d2aea641bad9dffadb7577e36e613818ce5eebee3b7caade39ad661e203ad045df77dbe3602c0753b52a486b30a62a487b29954623d288341a8d388da47157241289b6e82e97f78fe63a0f07f1e256417afbecb25be7b2ac0ab2ef3429ba0aeaaa74a04b1554056d52cc0a5e2ed943ae3c6f5d79894c22a310ee3776bf8a37115dadcbbaac2b013f92c79ef42036d3ce0a622f7ab43cf6a24fdb1ddad253f2c29b88ceecadd1e1ec7e98d0d9af5b9ce51249941ae58d7517792fcfaabd2e2b6f0cb3be6ca1acbf6078e54d445b3815c63e387324ad30b29c1e33f3991fc765682e43aadc76ce1b42fa3d1271b27b99c7bbc97403d44a4aff2e3bd1abd7e17befe51fdedbdef4ddb7e489b00e89ba7fc19fcca73768c3953cee9d0e89e2eeb7df3f2549d73ebbf734afd1817a8d0e3d85741586ddfb7dfbdabbdf281deff5628ecb47a2fee1a7e748d437f3dc6f879abbb7f44ab76915f0a3eb2f26dd93deddac011a5d5fa20d227afdb43ca292e82f9da9fb8ba8cb1fc6667072ff51de9bbe37e58dbde47defcd9b88263d35ad5bd64fb243fe9b7bfe9a7b687e7f9f339a4b33737af59b370e19196817707acc29e614131313738a89898189c930303059708868afa4e3e6ad0385aaa9d1f7a57bb9cb5dee1edf97122e1d631f9c2038380518c19d91a52fb0c0a2c65c1986558f95f5eca96961ba32d264084e9baac9507c0214af8025abd5b3a597482fdc4b97f7b66d1d775ff1fe0e5feff6bbd56bdbe91a89398c767391189826434d8674f75d9376dfdddc637acd3d2f1ff6894fb4f68ecb2f2f2592b5767bddacd5b0e5bed98abb9ae7794f490d7b58b22ccbb22ccbb26de3fe4473f189ceb2ccc8068363be6d9fb608cc63329c36db560426c727d3263ed1356732a8c9507cf22237298000041c9cd9edfbcd4fd424a22b1cccba66711597f7d5d5563314ea6238717ea6e0502470aebc9c54fae9a6efa66dc3dc378f41bacd63906ea3734a68b4e81cce8637ce969dbceca3ae7451577a4adeed12d9ce755dd775dd39efdcef0f3fdacb1aa0d15dbea5df52e9a2dcf3f9e0e82efbe0e8d296b70f8efe3e989793c9f472d2cb492fa4ed8544225dd2f642226d97b4c590724c4ccc7665db38bce14d446f1bcc3f53e924d129e6fbf4f697ed94374a6f3119266feccba6bcef4b2ee5fd8d3cee32184e1bcede6dc377fbcd1b476f1b8ec6c12182830323bb15bc5e0bdb4157966559fbbaa2c72006ab9aaf5925e04707e9e23e49954a52cdc007d877fa693b0c4cf6ae6658742ee6c8b592182dea9e65e7f0bee6388e23e504fc68d1e5b2974819ce76f7aceb9ee1bd83ce2e86ddbb3f2f9f12f0a3bd5fd2efbb1f7e34296b80467b79077dbf77d0ddbbac1365d3b3dc633a29f7c43c4b52e9ecb73a9d8b89397d1b0cccbddff7977f5fd679ddd779b7d65a398ee338ce07f73efede8e84f735e91ede3b688fe3f2a629ddbc69666670e09091399d62626060becf647a79299548a4d14824f2bc7bbb8ee3acddb65a352dcb4c26ece5fbd2dc4f87b047e9bbea61fa77cadbd2dc611e832d7dff82f5853bbebca9bef0e666579a3b8439a573de2feae6bd9df4d42461780f27a944986218c771bfd8fbb437407da5bedd0d50efeb2415fc0e5c74120a1349537458920e46038655f222bc6fd0a2aaaaaaaaba1f327a3692a247cfb49f287a74ed14017a340ad2a3bc4587f4de0f6dff6053e7e5b3cbfb1287cbfbb379df12ae4c789336d54bb86219ab3804abae6598624ca2b02bef1bf2f6e1e1c3638a24860515d7b5ebdaf51ddb4c87791dbd62b7c73049f2e121ed107bec07acebbaaeeb3a0f470e63bf4f4951a61285dd63a273dc3d7712dedee11360bae829c971d83b8efbc80b2cf618de3768ec6218c67da3b8fb1aad770edb21de4f3c1ed437e8fb2a89d81f22052880bbe80e217959c4e57d83b6dbe34c58369dcb3da68b72cfe8dc3decc34373d9878736e56ec45d5a9e51a612b57179c3d4faf2f294d4b46ac3ec2b4cc32cc77ddf8771da398ce3b8673849e4b05371e3a669bfbc4b8b144e193d2c4579ff6c1edafee27d83bea4dc9d44030e8e0e1d28544dcd352723f3f2427a89c4913853de97c471798f6248f5f6175b1f79af176125517bf75e592191c7fb95b766dfe1cd43775df73aa3e5110de9ee8a7e0f2dcfcddda50d722315dd714fcd4e6a2b758d76080f89da2ccfcd57f4166d90fb2e77b90689da1e6d908ea7cbdbb9acd5ecc3436bf9ba37f0d04a62290a768b0eb9acd301d0434b02a1377c25a3961d60d8e85674d349a4edd9b7ed5adbbbccc3d5ed77e336d186ab687bdd36107a3b79cff23e0de15eb3df0a3510fa7ee3aaa87445afb947742ff7c05cbc3751372291ee6801a3db8fec1dd90cdbdbedddc8be3a66abbd7666f8e5de7befdd41ecb08bc96ddbb2bde4f2969a3be91ddeb65289f3bcfcd4ecb0ddf0485479dbe66d1b4f4a5ebbc474d2840584f64bda20f596b581d058de74ca2150a278302bef24f3278b72045630ecc57ef4fd23ddf412cc4bf7b5c3a25fbcf1883e247b97f7bdd7e3e95e71d71d5a20dc2b57b37711def5f009209d7b4a7aa4ddddcb41bcb8ddef298c17584440e8ee965dc0fd563dbcbd7a38fb216adc7384070877efdb102e03a1b77bf91dded5233dc33bbb286f43485cee8149327596a1447dbf309f35954adbb6003bdaec6834ba37dadefddad1687be78db697517e7979d97eefbdf75ad9aa6dab6a97f7b679b787576aefa56fb8c3db07dd89447947efa393ce3d066f4c6f5b8cedf04e324b780b2939ca4aa2bedf4926947363764890eedea1dc362c7a9d9607da209dccdbc6fd5a1efb20575a9e9bb124136e400ce924d22439345eb55abfefd7a1e238af6f6632dfa6438d0e359f59480163bfc77cdbb8bf72b8f40e7b59769257ba77cfe5ed53b36b749775b7bbee328ebbf72efb0bdedce1bf8b389cddacd36101dd3deed7d9bdf7bc733ae87ba875d0de332efb7e4bf97b967bbe8b720f89c33e353abb57a36bb2986d33d59baaa99a4c265335994c9e0763ca30303052d4e8a0b997f0752723a33d932997fe82a14495f2feb4b749bafbf772d34b097b3535353535308b0e355c19485cd13368b80589209977acdb8561267fe15b0dd1f4198edae75555d5101fe843da3e7ac3fb90b4dc3f5a5ea9451458556b467ab531b759e6798f797957f27e878c2efa7d863749675956ca3c2351c6fd056f1137e23c2ef37cb277775f7db97c3a0d119df3469947d49df3d1dea1f611711ede9e977d489ae346b927e6de5352847d48daf3216579fb90748c17437a75cfda4a7a2555efd523d5fa5a6d19ae1ef7aa3ef3487933a9ea33ae665985299965dd3d2ff33cef5ae665daa3b8272151df477ddf657b89758fef3aec62d8ebc51c86551b498bcee1eda3b9aebbdaf3bc77a7bfbce48d69eea59f309436a5bc31dde5bd5df4d41461780e5b27e1ed23ac24ea7b7ab16379d7df5fcc453b04ca7bee1d16ddc39ba4bd4fcb23519ed41ededbaf73bff65d264994e5b0c30b513e3e24ad647ed22a5151f167c61882a845106eecb9f1c8b53c72b5cc320288405050202868a0dcf84dcbbda2af6c51828b8e0ea85b66e0042d54e822bae0c26858851198d0f1907b61ca87e1ce87af2bc820c1ce12ab451043e001143ba6a84fd837022d3b648008044ad8f598370f1d21a0c30e2412112c2ecd142efdbcdd4ef19cb8d6fa6a61d936b1f6aad5cd72dbc4d96b773dd128328ae8f4f208110ee2c51d71a31a0e4f3d613d6d31fce293901e2fc60ed9eebdee1e1f1cbdbb8f62f8c53d1688fdcd27215eeeb17bbbcd3da3ac71786a6983bc7cbe528b038ed6a2c7f025373fe538931c8f3b2999030bd1c4111b7477b963b190ee3fd8a02d939b33d9913b37c741c76f1ebbc435608febd472430dd86374fa199a43d843c9d5f6bbeac806f461339224b4cab4a19f39843ea295b8839ee61dd62151f6157f16bef0dd24cafe46c31edc619f613bca18bc8953648e28f774f9c473a314dd652a23a395e823833bece9466dd536c790e31112459f9a164875ed918accc1720f38baa7ba762a45e6f480a3a7540ddbd77aefbd3de0e8ee1c778bb9ce7eb45df1cab4a1b7c7600fd13368634f3d6d33d6f6ca28670cdee0bc7a8737913a2d0e3a0e2bc9713232675b8f11da7bf7ed0147f7d8af079cecf7db0747dbdfebd7f5d1eb26a2b367a2ed660619301930843633dc58fbcd7b8e7d1f89681c1ded90520dbe58425f57cf6569f6c1d1d7e3965634ad2264f4ab426b24c775e418fde22d8346232c235154c761c01bd336c3503a0cf8740fbf80f7757e0dde59e7bb80f7a773461235c648e2f1152471066f92c6814f9fb874194c041791287a1d769039dee92f20733c8eb38f3643c0c354e7706faa8ccce14ebf04088d8397b7e83e389abb0fdabe89eeb9dd53f21251c00ddac61c58070e399ed2f6a99903c36923eaa2451e8659e642d77b278980e93ada48f6078cbac495eee1234d74758f445d95300c9e24b830d0504b97214df58e57f6a51435343dbdd0d0508b14dcd0f4118bcc919a6e42a8b60f42b53d0cae745443e6c02d4b48d1f4b18bcc9941c760a86170d49df77dfdc1e8cfd35fa6bf47a873f3efdf6f70066dbaebc0dd73e00eef28e4e51d95a0e9cd18bce97e7c35da629244512c07b8336d909843dcb9a1ba420bc4061c7d83f8d9c9f1254230e1408edbb0f3b393e3a959a305a2040772dc66253cc044c79bec404be49efb7d7713461275e4bc2c2351f45dc614009a1240d3df60263a9e83d3813d20c3736021e28e0caf11eacc707b684b2229e195020ce0e6855d83c2e1a193e31bc6cba2b6f633e01b0ca18d0e0ca14d8e4f972ee17d8538d79eea2aa3b517e123f1880d6fbc41aa2ce915896a49e230e93bbddfa4b5d781da35f662a8ed111bb60ed7cb3dd4689b7bb6631e96b778e3686bb18e6f989b6f4fdb43a833c37796c39b21cba069437f83613a329c365746395e11e54da3b30c9a3a11dadc67d8a55706d1d07bd83d2c25ce819704f1b3d3811c67e2811c1722eee4c84be20e9c369ec759bff8ea70758b2d6bb30f8e90520dbea881aeae578c6968315963c9806190eb0706d980272c0cda5c11ca4818bf5197362899936998e9b96b740d265112da2099b6a2d0951caa34c79c94b8f2d8311c3480b26a1596fbab38c8b8554f04423fad1e6a740fcd2cf0601553c4b0b243f1298c1d30ce88220491882190c0c554421382e006dda20527c6a8b60ac32fac2004d00ec53324d8a9d646318e34762abc046661a30914ec34995c306107ca01ecbbdd2040f1849ec2d8a130a3a1056658d9a19737a831e268f908c50220a410424aab4b29a555f59484d08210a2600a16adacd3ebdb3ab52acbaa2e7a59d697e82b89d455c65c00539a9e7460594371c639e3679c18b30af859a2b12be09c908b0a6b36eca269f6b393e19f9df90a2b894232fcec585eb224cb4872803b4772803b32fb7e7669c4a98873f1b88273c96738ea2a2bc147e40e1649917899972c91979948ce01ee3881403cdc91a969d11f3bf35da6967ae2c9b09977ac287ded81c75e23bcd8d4a9cf1ba574eacc3a76610ddb3d1fb15fe7309c36f1bacd1b8bd7b04c7ec3178655f6c980f6f9f4cc424a39a5947256b3881965d463b05e62ed47038d3bafbdbeb3f11506bb92a97b5eae55eef73e6236c9fc8753b356edabf1dd3fdc35e1a9dfac7d770fa78eb5da9db57b2d4dd2934cd1a18e3146780337cc61593deddca3b691f800a4934cfdc38faeda76246a4fc91a3ffa4803e2ee3031798b885e4551241a619aa68db4ec7df3caaadde66d6f2bee340cf58844ea216525a7d14f1ee922ad7aa3a9359efb446bb9a77bfc4bdedd49a26ab3566bd68e3d4ecd08cce1b4a95dde18ccb4d0e21d63be317d632ab41abe7903a1edb4d662453ed96987ff309c3646e6b421a36a9ab5d7075dbb7bed4730d7bcd91581e9b0c6715d774f37178129791f894a985431e9255c495e2e1203f36f844f5d2e0243fac82391f03612e522313f7187f9f7cde522301ebe8fc11f0cfeae698fc13087b608ccfd92cc243081243f22c40a2910a4abd32e3abe8a96a7b2729248e56559d52d4a3f6745e379289cd5101e285193ce9993442d7fac38c9a8b0a65e0950065068efa62bb5ce21f6de2bc4b7fe8c3b5faffdc663ac64eaeb1e3ef1688fd7724ffcf5b84d5722750fcceb2f0e8bb1bbb76b02a4e71eea5af1a63a5a7bdf7991db98b64d78bc6fd73eda5fdb447b3df650fff0a3376e09e7e56a7bb60fb1dfa0fdf1f2684b8fef4e406e0fe9507f7f17b5e61e6b3d27f528d673ef7276d45ede7523010248279115439de1234db4e84164d4a23aca3ffc68eedd45ff309428513cf178e77eed927b9768efd0fbc593ca7bf3e6b9a47ba4ee17737947204dba392569158dee618bb7894924795bfbd4a4af4796e85229dee22dd3d72353976ca6db7b4a59c9d4f5de49f4d3e8deeb4b27e193e8a4d7bc7f8090f0dc7317651efb4d89fcf192793027bae69ef8ee30a6c7977004d21b86da427d23908e568877d36b859d958778b9daa76612298329a6bca336bdde3b94282f6613865abbce7d0b125c4a3ae61e2d53dd719bedf25ea2b5688754af6a78531ef8d4d4f04e72b5430fc70cb5e8780eb3ecc7b8517bf61f9e768869ad769d76fb6b451f69f516dfdb4bb4e669b5629e7aba1f75a2aabdc357fb0873ef2a3e7999c7f4d3bd77d14f57f4bd7b3d874f1a3e91ce5d7bfdf0cb4db5def452eb28f3bcfcd4ddfbe8227cea328ff791e8f0a68bcee113f7d1bb9bf0ddfe724b4712499947f413772ef378f0f67584b98bf0bdc551df6b98fb086b17618fcbfbe76a87713bb44200a0b78a7da6d6b2928b71e3e1977063868f58ff856394401abaf0f312bf21d40aa78e91f92b5af7169997f99b3655bc9199e1c4a60d6d22650c8275202e2357b6aacbc8356da68c4398d6298dd7bcaa6b5a5735e7c6aa22981965dc29a794525a20b39a46e8319c515c047b0633366d3221663504d36c4189a9867863742f8919cb820490c65ecdd845092fed1029e746ed1049abca0291f5da2ccb23e7657f58c7304fbcdcf447477d2e5709975e7ee69d844a999a58131d291089f70f90f8687d539ef9d4947a0e0940e604c239b1cf29a1b02506546a07218d3422897ace5b4f62b535679573cf8927be7a3e72652518f8d156fea1fa0fd59578baca3fc427b13ad22cb392a8af289f40ca2e1f6b933499ddab2d6841e05d8e04d3f697faef23fb5196e16b95d070ef48efb2ee97e4d58bbcfa94e4bc8c7bd75dcff32191b68fbedf3e9a23715cf62169afdecb3df5a2dc63cff99034572d67b96ddbb6cdcb4c2624907ceea1ccb9252e2626c68784913012a6ed37499392c0c1a64e57595885614488e80dbf491a14866519c171995c040767592723382ed3e5223864888421f3ed38648e4326e34c1b7bc8a56b81656d225ac3b07bbfafba05bd1fa21749e9cdbbf2fe9992b7467f71d424fc69332fda3fa2ebc244b85e45ae8cd3c98a0760c09462fe62fa0b277f887ff5b0cca74df74f1b4e094d26cabcec66260fc3eefd51a8eefbde07a7a73bd49ca81329a1f921f2b2dc637a76d1663295625e5e4aa552695482818181014346a6abd4de00f52d8223c32903a7cdcdd0deef1d3aae93b9111c32463e6decbb0c23bd21601b353bcbaa268632d2fdb2bc8b3b9c3a44e0b4e1ec56b5130edeef8d78194e9b9b8df880b3494a832f4e1e0af5df8b61a27cf2320e32325d119a3c933914eabf17c3bc53772332c77123349fb9e74e5dc641e6385e04472ee2cde4ed0311cd7d81030786452346644e8303cf5c06d3e09c70c0f19917c1f1990ca74d1199d39c7098398e1799c9f638b290b62f622f9323108cbc57ae756c93399966edf6415f9a76ab6200d4a7ee3df4d93bfaec943efb0e3e689af7ed86a944657893a8573f69efb99e5dbb9efdcab0ec833cb57156f1225ca363a2cfbebbc5f518e6b8adbbcd516f57cba7edf6dc31cfb39ce5a005a26d9aed027a3e4a9139d58f7f68835cb3e2380c363de39fce27146270833a323ee81a71c7bc3ccc31484e39738c322ff3ad61e535aa1e64dc1310a9add24f52e411528a9c22a9489d7b1bfaa04ee28e598a52e0cd7ce5244eeac49ef13d5a25d34fd5d019f2df6f2a59695869c82bc8fa0cca302b8da9730961f7039a3aa75336937d1906946140d90c0674c280344dd36aadb52ea0ca4a3091f9090227199913cc8ff3ad9de4d2a6974ca79f2e5f3e693e221dce935e4b380655437ade3a23fab0d2883be6c42f3fa679a55b257fef90005670658674772b8de8635a69e8791a5c399136f32fb802922837d6803dae5459feefbb846ee1793a047b48919f72ca79094d1d0c08bbfbfb153475683e377c9aef4f6f47a17070aea00d5fecdfa5c9267919e98695f296e3a43c949c55652598d05ce61202325fd284cc50a268687275997706b4bccce3dcb0cf673a0dfe2596bac22fc9ac049399cb1499c9302fc171fa263b29192f87a6cdfce7041d9a3a118ab4999f507eb001075e12774e3232323232972799bc44ee9c4e38e6248c248ea420891723891d1ddad4e2fd6d4ad99710909e7a5f417a6e11a7d5f33b6aa8e53c0e292e8cc170c6287a5bec8a49ca38a9b0664aa523145aa48e3ddc34bc1401d4b15952c95b4e418196148399ae1ea14e55e190e25695252f9f5c796397965308a0c495f149755ad1ec128a2bf42929ab6b8fc7e21324516a5823730f0daaaa00696cd6c80aebb80e618f2bef897130e1466d05a9794a462d3ea0691604e06030085a1e488b20481977d422669905dec8a1bb2711b26839dbc080b4eab06a386a9ad5458b1285445d1f24ea6a75813da4d4520ca93d6e3f2e2e1245a714922831640e12ed948bf7234d8060142774d3aa0741a9b499bdbcd60aa5454b0e6208d92010deec2a0ba9da42eaa4b46bbc411bed294ca18df64a089516508350530b73309823614e05732cab8b1683242a46d1be23142839468909e2c5b5bc9058f4016dde92004adc3de514a25ad5ea7689b11c83a2a4e6c6cd1845e6785082e69d0055a122231095d2ad9787d6e8a2461a940bc5e4b3a8be6cab2c232d95d0aeb86829a9941511a0ce14aac0d0b45242c5844a0a551bb07a43536b88d12936fa96f71dddca9814834a3734956a682acf18d5396395c88444953e9a78ea1800dcb94dfb23e675e2a9311de474195e0b80ed6bc0f307c02926d0879505eea0b7a9c9c9ed16e013d7f0143ec00d80b5df11ae5128091a37ba8432fa48eb5ab7112ed91fdd47b8541fa1a876141a9d8e7ef3e85ac6206af4397a6af4edead1e5e87634facc47a3d16834ba9e191dc708a8f4d1a7bd40aebfb19def6bc3f787da0208969136d87f60ec08c0d86dc050daec60ec1a63b7383a8137d827868044614f6122d306d341da60f6148302c3b05f8ce10d4bbce14fa2b0576c9e0999f335ce280275a4d0b4a13d0a70ed37108139355cbbf211e002406b365ab3d8c050870a910c507dde652556894c484145532a910903441f128a2c00f6f11a708f1f00df2085a6ce147d4aa12985a690904c1736a04e4c02b4a1a98c61f7ceef93f9a6d135df9fc651f37d358e9a6f4cd71cc70b9f79e1859917be3f3df3c2f7b74f1d0cbbf7fb64d02f2b124af421717050a8efbb9bd475561faebca88424aa66912820796d4fad71d7bec99ceedaafccb9d7bc883be8352d6b50d7bceb25168942c92c5458b9920aa99fcaa9c79d94c4f14d852aa1ca8b4a4bb58517301c06fa5865e941c625e3ee29a44d21d8a37a3800ff30005e619cfbc03cde0313e037e0d465d0b4ba588956740c5562e1303cca30efc2c4803d86576ddbb0d473c7a1a65ec01ef514c3eea5348792d29c4e993a369c9e56913976ea0439e5c10307478b505af4ef6bd1f7a745df577f635a144404e4623f3284361502b2b5a162eff2a571b9608c83f1f8a78f5db33fb08ff08e40404ac74e2d0e1168da6c9f180435f71c5fb2f393963a93d48ea7640a0bd1c4911d0d0b91ffc106ada552a914939d33d9913b3b38e8ef7c7a017bf038fd9c42009d6fa9f31671077d3e941fc0f7478300220e0002007b6c36df38a8df7c7f3a5c3894f45ae20e7a179ec2374c1bed04c044244a3b0fbc04de68dfc11168da6897daefe516d10713b8433b2d226db4d337b4769d2dd6d0da73b2f601641af2beda058021bcd11e007c254a3b00300ec6244afbc4128bcce172cf89274b2a248a92a4d4a29deec854bb8d76140d5afb0c795ffb4dde9f761d795f2def2c736479654bfd6a7fd84b2ae415894566c1e67c9096db392d5a20f066cf63d3c7da1f5c17a4eb3b2be422c11156740dd2d4e2a05f23b42457ff44e6ec5b63f7e963bbc7271648a77d3719d293b3164b49a955cbfec0ec90cb0a32a6a0bb633ddde7617c52b9ec139f54abcb7ca7a5ae53736e393ad1326419b2cb80616e83370e0a6f540c1849144d18aa2cb4066f920b1849d431e33dbfa0421b7aa1f714a27a4f219296c1bbfa42d39f30cc2bfba37e84b3c7e028e50889d26c5569988e5276cd3b6aac9f540d079ff8c406fb4f0ea9eb8aa54e693347273dd8a38e4f24ca8abbab2ca37dbde1612597ee19bdbec24a2eaddd7ef4e3fb6c3ef203a43538a447af75f4982046c8f4e83bead1e818bc195dc3d0068939503dd25e6b2a954aa5aee994aef6f5787413de1892a8e96d7452c211e889cce14e3a7d94d107158a505c5ab6c98b0a699590ccd9744fa12946b54595650a699aa65121d8a3aab4149262c89c19366d92aee1382b295759dec6dd32e8b2226de871bda442daea42c252a79ea2553d094bad86de95189a7e4ba14a0b781384b8c3ea32752a2d429a5ee62e9500587063b74528a64e14a242a2a81589129a3ad61ad286de724353212097d6b2752bdc6d751192395b52a169962d2a2d951732c7ea2273ae2a4b55e5706df81152c7ca322d2c56d0d4499dde922273e6d3a0824b14424c686a69b1a864418f24ea2a0bec51a3b6ba68cfac210f685f4fb24c9d28246de831ecdeefcba2e9ad36a08e3ed5199b36daa9f586a6d7109a5e25d0f49711925e4a68baaf270e70b19d0ca7ce704eed29acdd6a8f6248ed56de3cb45779e3c8bc51f5b2e2469735b4efa8c6def48e429afeb03b19d0dae5f4f9b4073dc9296103b4e1294985ccb9f389d6b2d435fa0a87747d43ef2a8bd090aedfac5b2b953a130fa42e44dc49e52571c776aff8bec2dc353c2282a67048e29d644afb63a4dd875a2197156474d1dc88c32ea612854954d458843a0778062d10bc1257104d1089f880d6b41f6047d7a76a4ad3da8e76004dfb01308436f53b1a4398c210daa466cd6cd58ee9ead16adfaaa65dd8650386da8f0f69012368d1f63087a45bdc1d8929298554dada8b095c17d80346e67ca8d3c37d4d81a31cbe741689a235da7b1818fcc3742491fe08d2c5b56c107aee30f7950d62f37dbc027bdc7bb087e8f4718bd17d60a7c7f0085f88b2f6228cc11b7b0f5388b2d10a4a8255401f11eeb0df32510e6fec45a7f4eaee236c6447f80611eeb01034151235961540ed21f65d238539568539d9ed2fccd16295df60b102b0204001518b446d51b12049726795ea8a55360254f13ccff31e2d10fb6f1a7d3f7def161b38d153c32d5050a121bcb9623f8253a7bb01068fb0086fec7a320849f44253fa2031a7ff017dc49c1e01b007cce96f9039df51e73e92e77597d941874ed4ddfb48405e2e2073b09cc59ee08e3c4e14af4c3bf236084f707b2c6f5812176acfeab0c30528006fe8250077d0437c01bc03f7e3f4c8e1a9298ec3d03d4e1730f411d5803be827c645d127ee1eb50d86300393c4037d87f514e125f374ea09750c8661d85f3a51a775a2ceca0def1a202f9f36f893a86a1b914419a8ec69067754ef46188337d5961c0ce9d1f78fb6d9b1ef51d7ba55fb837bb5a32ba00dfd86d1766a7b929439a2cfe6d0870c8a3be877c0f1c4bddf500c1d2e2051d406a32ec2dd1550870768434f33306d82a28f25714bfdc504f1e27eef2e127d0af8d1df6bdc44df47477224bea1619e04d3314ba28f1885d21885befbd661ef0e35f6dab3fde29efb7b9b4f42b0dc736fdfbda7ca277ba845d9e62865c3f6232cb5c575842b0783e387e31612458f8ac148925c1db5803be86b256dd162994635a41489a241910aadd1f6bb6a7b1d32a7bbbd8cd49156b66bed33fa6c7f1f8fb83852890598e2ee2845d32825472a510b8e5b7c5a11b410d0f11c39c7e34e9688c5ca4f1fa9c0a7c7e7f2961ac62bf0a64719f78aee51c69541b007777a2898d0d5da60f07514aeffb0f5186c1f8162944829f7a8ebdc20d4c179c674de71170ea10fd15fc8a1ef6b8e833368732fc210eed836fa7e07be9701cf8065c6e0cd153d869ed33d14ed2657439879f910eaccbb309fa10e9fcc89d046bec6ef93a317dcfd3dd2f2a811ec2121aafa74055155e5a327ae689e455418bb1717dc4bc32d4f38b13c0db73851052d3b0db73891848ed51234183a3ec21e5b9cb042c76873f02348174e48895545ab092f6e23d1f2310b950f1a472109a59a42610450e8cc6792b491276921451989b82c6c4a3a29a554e7c2b08b4e28e59cb28ab0929809a6a89584369a920824c6894d9d086db20dcc4cc20b62948a134ceb04539aeedcf14e5c43b241aed32a37d30780aed4f1fb56fa9b3aa86983a592d6155f90b8b087bd44c9bf2001af5f18c31b78f3c11e57de3f310bdab2e6145a599701582085156d6b262601dd0cbbac8a5adcbc96b1bd156c1098929a1502939a1947134185b0470148914e4aa292d26fd4b24ebaf2ea2b73289d3908d344e5ca19445a7813bf7d5b7a27997ade678b65c4d389694a058f2cdcbd6dfa92245c5dd7e9afabaab2cfa6a774a3aa57d574f5585555ac3a4db304a3a291461aabaaaaac5c2fec76bafa8661726f3a56f168d425baca740116941ad247f868051a2260555dfbbaae6b6e9a463068dcf4154583d249c2e6b450524a2b4ae90d24162256451f568c55ac6215a3dc21a50eeead0a62f1c2d8f5ea43e27519af1833a5135eb7ae0c5fab6d48756a7f58d3a2736ae9615d1b85c7b8c768ebe1e98c5695370cda0d477853bd62096faa9bea19aeac4b4f1b270e6a6acca0f04a4d500f3c7c788cd1030f6d5541d885e11e30f6cc07d7ac72c2c5a8d4b919967bc0fa2ac134c25452e99ef96da3745ba7d83789c211857b1d6a4c53b90d511275cc585652692bf7d057798b37a8c62a17ea595d461f28a4a56ce35697b90728a469ee99b92782a0c29a5d71d1f2d627b65ee74686de73484e213f87e4316c286868c72957a670b9c20592a1e96315435368f93987b270b70cd2a4d4328436f3198661795eb98b75250a08cd1badb82481522e599ce0f17d59f4e6a175902827ee14236ad17493321f3d0d5acb628c3146ad8c1b75a541430b647fdf876135d4504355c3aca1066913a30fbc2129716505832e3a63428b4669b865092c74b5f5f09ace2ea306d2d206c9babe462174954f749d45e84aa1684b4398333f508513c4d0f5f595a5abd39e4d09d5db33ecc4903ed2e9edd5da9c6c6182cb9453a39aa6551616c3ed1f2a704b1320d07543ee3bbbe45e9df670f03bbb65f7757b8eb337a42c90ec436cdeb0e6309e78528fc99caaaae631f85d55871245b3f7640af8f94176796a17907d6679c36b50cb6ffcc3cf8f961245b3de10d29f1aad276021850459408214594401051b8112407085072c28228a164e7830a1e146d00f9c6ce10a3fc0a070b10532b4b0020b29d4a00d9f3696f0c4194e38a3055be02276c18404423451461057a8a08a8f4f1167e42006572441850b260a0800061162c4600662202124021d6b1c8109535640440c88e8d1010e78a0507ce6124d7cc08a13e0c0899522dc20a306332863084a1256f099620c1a7831851194e0034a248111418519a8d1650744b0411378f802a80a276460d1c2162c4f7e5a40c4124178110437a42063083d61d800cb1429e0410ac618c286a8e20a2d3f28c28a337a608410869670051154e1461542800991a4044e8cf14418469c400b195a4c11451734500114f14a1a46f42004560801831ef0a00223966084134ea4a8a00758101548c307560c554982941ff83ca1052ed870e38c2e5610c2091c4a411743a801852d8a00020f664026e42088117031c21a5630030b811a4d48811764ec2005672c01092a9c7003ca0c82a8b20503c1009e3481822ea2c0842e464840d093326440e5035e9c00fbc0cf131e84310425902085158c10411356f05085b8c5e79a418f1266a011022e40b0220919c41ff0b0a40a6c0c91051a423cc10106d404348a38a308a02576e0049f1c5840a1056344218c3580f0c6cc12d210c3091bc0e00b367a2c25f408c00912d0800667084961045be8220435b8a0021340c0420b9f1f9e14b102a02faaa8a2824b0bf0084670428b0954f003120401f1411425c8420d84a880e572c3489420a860c5159ac8020d24117c7ab4f8010a5bb0518408c42802962cfcf4c0890ec8684114675461c41554f0308bf0f9f9c0900eca28011b2060c3082c58208b2759a858228925ac7155e18495173c518209c6c0011a148a27941103225e20851a49e880871cf830b9a2093696e00414ae68c175052d7800a485212380c0055b7caa2a14a1078a293e0863084444010539186a2204283140420d6cd00511a6168b0c2806154d8c91052c4f9e20d1c612ca48c1132853600109acfc24f1c515346c80e509336260859f259c24a189368610852d58c1436cc2e70c19441902892c4ca8021b363cc1c411a4f0c2085b98e1230a020e4c30c6142a74f1c41ade962eca78020cb42086951ff43cc10312249862e50a0a9ad0e2842af050c214414780e2083d30c207cb0ba880810516ce58c11953089ed1843340d04517594062091e94700611425680c211ae900415ae4045112a60c28c21de308387257ce0139c10c5145108811a3890c214b21a52d2a882099400450a1b908ed842053e50a3892e4d5c5d84f04610164b0c4182283ee043db18c2123a1092021822d001113c4c11841439d8410b8c10438b142650c61152b08cf184184c91051a2038c28823b0e0086c4481860d329860832568e0042c7c525ba8e009972c1c818a1328bc1891050ba09c60ca1596e8d191c212a84084268c018616e4a5c68d932a0451c51282aa0c91c51350482107514c908329ae274037aa9c40a8065998a00640f881284a159ab0032998008c144c1ffc5039030d1404b1850b135c8064d1061664d044146060c40f9536d6f8028c24502108104c1938e1470a2840d0020a7a50049623ae26a001822b5c0cf1821324818403a0a08d354670052a58610cd111809c08c3084f98c08b2b882b0d2db64ce1074ef4e00a1e00c1da724413a040c60bae68011120173e534b3cc4e2bf884304c9831997525a3de09203c5a4988b841b7524527dc72943bac2526a244a7edb25c99cc9454794cd01ee585b4e998283dcb1b294326dae70f794873572565df43c853db648618f5845cfd91dfe4e9d17660eaf636e17a601de4cb9e61499b369a832a74c2a728aa4b286f634dc0205175d610d176e91428a8ebf9478e1d40641b23d09a6b994c4b02953d72aa7d4ef6f569954b0995bf6c7cc154fa305526ba501f6a0546b4e42d00468c7858720beb153f3893f27c633cf5c09189e6119fc1a310d4860da9c8245a1e7356c4af4216300774c29037833e7dbb81b35a5fec2b17d1e8712176a1cb73c387a70e0789545abbda6e4e832c7814f54576dd3ec0fd15dc0216802b45373f899d7b8451967a4862f0d44461da58c71c685aab23f668ee9ec8a627fc8a01a9c8ff1fd11573ef15c501e210bb0832b838cb8f09c6f53a51499735d4d644dcd9c725da73007eae45ff717851277cc5f57de97a89aeb5b46a646a226a557bb3964c821c3b56278fe657fcc5cc354d74b4e7a3a1d8a9eb7e4147843e50a8005379ff42da73c20c710432e25a1f7fecf87f6c7cc5332e325a89f68b290f81f6cd0d797fcecd89c894d8e973b7127e79c99a0ce6447eea09e921607178ecacf328a445da9a394225133794a913941ff7ca599c12eedff0cdef1dacc2f8cc3e33beaeeabbfebfec2bf3633735d46c60ab1e18d37deb038b8f02ce63bce4ce588fc79d9e5ffbea0171af4720875e8cb2f7caa9fd4ca75512b17b54283e6318c065555a64e0c315c37a14c2e9862307da6aa8aa9aa62aaaa9850177321c790bf98af6bd7f55ddff55d3017cc0573c15c87b9aa102d2bc124df855f1070e14b9ab872ced8afbbf0ccfeb89e9a17d60e6dbda7b567e6f11ab6676e9dceccd0d45f8ceda87bae67a7b95c78c533395e98d2e0ec75da78dd9af93e4dbb2e0af50c3e32a115f191a935fbe3623b246afa94bc9e3d352b0642530cb50b5806cb3c357160a865b0f71346126360aaafaaa2e74dd48a9e7fc15baea1e7319f4f93f026e99845f8cad4e47061a8fbcad5338ee1156335ef26ba5e38253310f9aab8077b75d9737dea9a613875f2378643ce47a2d698680dcb3dd7a5ce70cff5a8b5fc18329c36d57aae8ec6edc140f5eb2be79cf3af18720c98f57a6d198611437d7f1081d3c68221c2805fe8f0ac22513518ee68d50e3795d0f3730670c77cc9e63965528137f3f5659b5434bde538e56e5cc984ccd9714a25053d2dd843d3f3755fd9aaf2de7c261ec81722eee4bc24ee5c96565577eaead70a816fbcf1c61b3a77a1910118c20216b0900169b965b0499645d883ce49675505c11e52574ee494407108f698b2722251120b921b0b7a22732c27f2571479656e120b823de6d41550fdf6f9747c4629a59462a744b4957bb0be33a063f6f92a2752e78a22f715746dd8bcf6c71534bd0880e00829f98a22e3843bf3f6f9ac3927bc809e558dfef4ce40eee1d333f74c0cefefa336c8a5ab2c0029775b4041961319ab3c9f3d35b3ecf3e92df7b82e9f69d107bd8c50868674a551e69328a5fc7c3275e8932bba215172e8c99c5224dc517d620a9f54304b372810509e4058d0dc53034d287187fc9c4052c8a1a13c81244a6adf58d01505e882127f0169996528da02b280b24927cddb2b20d8835ed35f41d20da06a016957d0fcd0d4a9803210ae2ca0383475ec6d8efac2525f54a06813c09b13c41d5795af2078232f8015d42d0e4d1d2c680ee9aa0292a8a0a9633981922d202cdc7d055d5464ceb680a6c89ca0289714997304b58064ce75055d51ae1caefdbe82ae33a4ce94326da0c01ef4b2823981c28d2a6b6839a7a8a12592a8f7156401cdec8915b42d295a4e2953070bc282241624b1a020796b08a8c35d7219bbdf5609b4b48cd0d282819696125a5a4f585368b9ad1f6879a7cddc1590a5f358141e3815501585964c684945cb89056939ab6acef9d4a4d3422b3925ec5372da9c015549d302ec8a9e3231536749dcf9a60c8e3bd59c52cadc528a3c629e0ecd533726ec1103a789a8240cf604aa1a650ca21100000000a314000028140e0704a2f1804092f344f31e14800f95a84a66489447c324886148196200210810300406804066346900506fd4e044462df7d5d43c2c09b43a9316bcca6e9d3a35b403d40fe140123b41d2a495cf774667e92a7ce36f1a27390ceafe202fcda1373f97a2690b94ab5113ea1743500ecffc16f1271f00d2fc800d029546a1ec2709e20bf84def97f8f76844b731cf4ee890ba3d9f6615d0ee91e9af9e60bd8183fc467e34abb0d8c4ee459196340c4771941d07d22ddeabc75f8181d89d58bf89bad398e19360cd2654d2bd2a557d2f91587db3e0a3e1e540aa77345c092e311272b8ba05977f73454874a7b8d27eb9317736787686f301e1cce8d3cd0ef3f0613315ba69fefcce1ef6175f31e7f0d9c3bcfe613792ba1c453585e33c4fe04a2d55c8047764131ac722f89a92632d2dfb1b29d2a8b12499e56a40fb6a6b24ddbe61eb084b7ca851f1033c09960c58404254bd8c044e19c84421fe3dba2e1813f7f781f2f192f4316a62fadfab49a1611b7370f023c5de04ab980df5e1e37f659e3f491b200435ab3db47e747d4ae3d126063de27f1960af429bc944b0b811f4a90d3cb0bd827827a0b3a9ff0c15fb94ffd8936b64dd64c64dbdd2b6fe3edbea5fe30a9463763cd8392748b7044af8fc0e45fafae885eb76e12e7c164d7b47375c381f160cccd6e824b3013d15137633b37a33164f1f14db4c3938d6e3226afbee4e9b324229fdd5bb7d27d3802be2cadd47cf564df3e5778db7a05f45ed788ca872215e484ec5f92f79690a7bd1e05856a4b0c6cdbf8f09f2bb1fa189e83adc88f15e09cedf8a65c051c13fca023dbef57092c6fd6ab3db4d374ee41a65eef215d6eb820aaa410913e9889e94745b165c24f0e13080d4ad73b3603207660fc59236bf5c24dc04bcb2de5453eb37c4d4332fdc806a17339af24796b7e8d6aaa7a88ca194b130fd312f78ffeb51eacdf7c1f499493ee1c315230d2ffa6b4cb2da993fa1da42b90581a744f1904b48895d25dcbb03f981033ece62532caa181e3ce866809b30ddd80be2c87a4928744df715eeaae52662e0249c2760f4de613faf67f0167992c19018d7f408bbd9674d2cbde76e8622eda9a69a0dc555eb06c1ef0823451b18753881f1ea570f73a8f57b48f64113a2cabe006fe5c3e8a3f24e2a30b92d7b0cc36dcbd35ea4a58bb3c6f6e4151fc76790d372f59821dcd14b0e2276c81a459921b67b8620a25be64432678855f4047f0d30cd508b220f0dd51587775b9fa58ae004df7a589af17b8e48a4618d2099c1f65a0e5421ef783f5e8df09845559aef93217a72ac900f550ab28659271bb6245d7212ae6d64032856fa64dc775696e0504f8591c094a454ed198477c63751739a99756b05e6908f14bb11b42979da6902ca3510d21bc2f92361891b4892c644f1459b1034368229504f7664a8ae32a025a40688b0d9175cc3d9bef1f5eba7ff25aba09b142d43abfd1d8ab8a9fd869d46f4175b87a39c8c36694c5b47145b234b9870b4f0838726aca6efbf40067deef846eb81b971bba45db5cc1eb7f76b9f7b3394d6aec7d55b3e7308090a385de14b4f717461b9a39c68e047f25e3561d723e85f5d1b00d27106655ef96eeb763bb104516d94148d979cf40af2d50a1816a087d1eedc4c0676e98f468d4baf39521876a54ca357931fdd381519d8548ee2971273e1744f59509f050ed97c5b12b8ae85407d1f8c7e3db1c3c729b1d2a10a575695cc8a96203ea7beca1003f85b655213d9626486fd0e64fe93d98d87d9b90d1bdab335409a19699aa8f7c4759cdbd23adcbf80c74e2a7ea963f87a7ca627f7c97695248648aec713e133fe06e448ae1be588a14b90144d855ee49c1504caccac14a4a31f709eca2b4b90ca35e4a39e495f34f464f55c301078b86e2bfb34ca4297ce5ec6a58e10e727f35956f71977a0c6b2bb79de5be2ded1296f87f6a5d3f56cdc0383d765a6814b5ddc46099854dd95ebaaee61bff55c5c9d313e3fefed91556248ba54b2d28ea4a387477a4dca68597a1f183451f87977a2fcc0259c1cd78a7274ac39265d1d5e530ed15bc96319e62fec1353d65445bbe81859a363f84a40e2abdb496c44f04e9c638a84ce72f030608a99a17d8c384a91db8999be5057ecaf83788eb9883d76d1e37f6769417af0ae617513643d0849bdf775ea996bf631739fa23a8b87e81cb551cf31135c7c3c1749f55573348af841b78ede2159f8182372afcb2da4e9caacae0e18a46523a763965c97723e3fd198b3e0b3172bf7b79b9f260264e19148db6a0c22a2691cc798003d6a67871f18284126d598634e0e5748534e99b0373b05c5b5d2574b9f3e11011684e0d02e3fb1657d7779581bc2542c45e65ec7c9af99b5afa46b9884026d3cd331a85b4d638607f8d55a8f00a61aa14424ba7b984c21e12c688a424e8f82577ecf8815344096e2f0bfe4fd5e52152c34590a0fab0f0b338165f7b6c6658c3810035fe703c4ed16b8786d382dcf58ba0988424f51a3adfe04b1fa113df1c1a4710f0ed67f5e6f3ebbea9953a8f438a6565f5ddc8f2b668585c71dabfb89176efafd45a8647c782281f5f638af3d71d815ed51e039088f91275a927846a1bf18b71d602e6ab3c9629981a948c8749fc8eaee442c91753457c4487131889fa7a0c76ef4adb31dcc660f4c76020e3f9f48592c06b545498fd0912cb7fc95700c3277e6a3c6e33641aee5c2db913b0d55d59821c29568da955a71e05eb947efb49b5032675fa18e666e5da9961e3aedc804d14688fa93397fc2628d47a0e886c2e16e3c5a351f0329ee47ca3f03e39901df3cb02d2a75a6479be70a33943a20eae361657f1a4c1c2dd5881ce408431fe5c9581b3dba5a92380dea9a4c955aa81e83a8bd7cbff84d25264200325ad94ed14c0ee3a2417834ca829885a46b07d04a71436b06019003627b909edbd8c23bad4f1180a8882ca5fc41f5a651cea6a9e4ccf95273d7b9c5cf0fdef6055dd97586a2ca5c085a1eec01cc74611f107cac163f105d137b619aa2e033e14209e4311a8e2d948a79da9e457cdd01b78e31ebd66f79467e562ab129530507b35343e81f4f95e795e43e4aea8346b68f2238a2040e3909ab040da7072095246f0468255d5a5a06f4de7a4da8fd80ce91bb984ae4be36fb5be25a12cd71d8af7fdf5e9f504deeddf1c70a0cb939732ea8485dea4a94adc41fe8d39c194009827f95b8f4d02cbd0cae3d931f6cd63f24afcb042bb59e0b19ea8492dcd1a64231c5a99632578c0f2e65a973d79599f6d302c94fd7d1045b0ca777d2ce1f0ee4e18d3327e3c5663b8c140613ab447ed3bc7eb55eccf8397a8fb9aeb88a9621777a7aa50326b634a0d23b527804fd3f03945045f977a8ef73a63d19def4e296e57831d5b5f6d991752800a5f2bec179dfaa449135626ce4995b8cac9630b84502fba3c080b4a485710c26ae996fac3039b2c5ceca300fab34fdc942533e9d2022f686590b064cb2cbe7389808a6c6dacff732fa7abafc639ab4727df6882099465bcc750e48af6058c39fb33e80e61587b20a8657160e14c182081609b794d9e692df5f3f7258652e05585e9fba6a16c33dd3b632feddb22fb57a882dcf344655c24d3f947adbd57c27a8322cc47aa68ef34c8368f3525e42c89a987a5e9d68132cdd10a8d97118f9f6e79bc3e70f2fe6329d8229cc44ef290a104f03ea885283666cd73fd636b2bcc4ecfe095bb17901348a601eb097f76f77078e07f10218987ec024a11de48f32b7d05d4893632f88b39b9032456d3e240b40302e7006d07e895903a15e1ccf4296b19bd481a7a9aa4a37a74ce3e644e75c0c957656760150b5089943e5fb29eb2e36652cd2447b798a47fbb0dc12533d625f3a64a7c8cc91656b21b693826df410a7be782f601fa22a31106162599ee88cf1bb19959b3674f49ef93938d66e16e2f5051e96cf3f55499fe8aef7e9fd0926d782d17ce6ff8188f2b7562e8087738b811f06d1e5845c361d919f94912578b9f66e3db805759eabf8dbca70ff55336767abc5285cf8266a67ced4b3c4c0409a37e51cee5154ddba5c0cb035cbdfea8a058ed91ffeb6ca35f99e571221d1d2c1ade7f5c1c2ba05b1c6161d6a45fb33b6a5aba0c3d4eaef2adab900e20c575d51ab5f196e59a171820f2b670f48f923b34fbe5c110f7669a25be9b4100b2f5ba918d5b8d6855b58e9b0803295c92ff5e164da454638df715685e7a0d46ff1f9726ed59c8f46f8f049c5277c0c262b12932f577b2246b8b7f9220b3158bfc5ee6e451671b09eebb658542a59bcf1610face5a62dff0fcda915584a5431970b570a6cd197b1e5eb8305b0af2cdf3a32905e85dc6314747ad1627375322a815ff1f864ae5e0783a8579148295274f64c4c2767984fe1ae82c4cb37f6b4ab8033306cb5219f4c2e8ad970e2dd934914a7f73e323cceda4501477ae4f41f3849cde7474a65cec662fdcdb6d2edad0d5d2c72419e11f170e16291ccc93b4316a8c1a8ccd9583c5c5862f4b952cb330e985bf903992805db7fc037e683bffea5da1ba6ff816d9f9d510ec3e856632651066b112eed2b89cea11bb78a40e35098a7394ea3ab88e3f1ad717ae5987c6b25415d5a3adc6dad3e2c6cb7a0fa9fa38b2d6a000fe8ccfe039eb89cf0b04d7ea39a48f8de6e376a728418c1b7e5c4d0f79c6e414f9785c66f02c5f75c761ca85e92b28e700bd4a69dcb40280a06e33b4b0efc138c23a61c951c9062ae45db335d2306aceaa497c187ab29b5d1404e11a45ca73793295348687ce6de9329484b8c9b29121bba926e295f3a66a2f997fb8ad384f2316ea328e68fcb624ceae6ae361ee8d6dadbb4010f61b05a97678104d2b68d0c05329ff8fb99f94d89604561dbd5379505431bb8671b5c16c5bf477b96a440810a0bb3b104d2f715064219052b9e96795ab81c531d33397c85ce8a49f43ab99755b734e71c645c5babab6471d9b7b55dae20238bbfa7c435b3436c0f5540dcf332c40a946258ae302d9eb8da5c8e8ec297a5286cc180b476aeaa15bf60e23d3be6f3070838efcb674658c875080b4cffaf8ec00cbd5d31d311005f69da1092cd7a05fb7696f2945b02eeb908acc69fc6cf97162eb7b9ca088d5efd0f57e5187fd77fdfb823a9e5cc20e17938296a44a4c61d284b9094e5e50f013e02de1997b348a6c29d7993e01bba4166c9e5fe071baf6775c16cc5ad9eed4d38b6631f4e390b0d4af6d3a261766a238e6cbfd7818c7c255752afb1c6ad7cc2ab9ac81a874ccd9549b432e223646fa5c24efe3438b8e814c4c684401fca57300ec5436b5c535c464bdc4583fec68cd407fb1ef31b9b67ab9c2278265291a6944a85678f03ce1f3372907849c8a62a8eb6872483b42adbb289e0d20b48a819f9b5bb1701b98f83ae7a5a4c0a2b7c8a20648b5f8d57259ea9d3bc2c2e8926ddd367c1e11a13f1ea5737798ebd55b16a07b0de308afd51165ddfb7fb4fd5eca458363ad7516d79f40fffff69b6800d2aa2df849d0a0190db9696e7b608c40a2f7a2fd83ac0bdcde78fc32d8c133417660c8f8f3d3fa0c5f27dac5b63abb4a43c9d8512072fe652ffbe4692d1501ba4b9baa0745907c6ada7d725c8ae99d79c8ff6de034346ddc72a77c30cb29730919a04b3ea0fe178057b128511610f891c9cee43824bcc22a05256911176bcbd81e8d6aa128fd138ab8b2d5056dc51454cc2308046a8fb4fdf650a1866b60842dfd30f687346a87629fc0c35d2316165e011d9cb7de2065cc7b4a7040f4edf57122f265670af5268752d765fb2dee1a5be6101c5cc404b366fd4a6b2357e430e43d8e5cc2609d2b7d5ee182dfc727aee1fa7856738ab24ecb90d5630167253dfe7a480e7464cdf8ad1f5af6968b7d511da48df933d8ad066f8b3d4fe070bdc722f162cae64382ce812dd7866c88e7ca77a0a4d94e6b890b688350147a35a049db53b320011a3d54c5e37e0e5d51024225160d4ca6d592107ae3e0a68587d800b53db2928f819cc0dc3ac2a6943d5b09b6f714d2cdab04bd5df5b6960ee16f2109b1f92f42b32ab45762253c9e5c3eb07e67dccde05710cf6741baa3b1ea06c8f7d09ccc04ca2af2b64284b80c649e90efc1ba4c290fc66fa8f0374a06de2e6d6d38a259b72ba3157e4cac860ba333bf6bbc0d66da601eac41b92f68957e788e2fe54b4e16f2152675a723fd253db57332c19bb393b744c63288462ef5c4c880eab8508f26c83e0204e40cc5e00ec2197d1a741e9f1e138fee92d8557511a6e6c74e51883a31448f2e8140bf13606293a1bcaef25a5d193b7e99656d93e662c8e85e4a628601adf0c75553aeb469489d8e19b51a16bc27ad72bed9603f2bbd54a0f6ca228fbc29e2e5ec926bcbce880b9525c8f5e53bc78d613a98d6c4c484a4d967aa806078965e0d9b2f6d290f67fd2eb64d21b4fcbf23f0ebe83095a94a21bba3f9c0f99677433ae2b6ab89b8c0b3ba448aec9f03536bf825789d0cd4ecb6b84458f313cbaeeeec80e5d2127db9b0a2cf2a3787215b690330f58279d594fa4454fcad09101d861fc92f6a2c2398c010aa4a20df7f6f4c9bdb2d5d489a701e6158ab729a367eb4af46a13de6308df182d98506d35b8015e192a7608abac7bda892b12514fc88dc4cc8b501ba595b8b9c6679c0809080fcd42bb6443bd0e51b4e598681f49331b72094579a93deb3e9e2b5522dd2557a2bbec1fc87eabba83a1f3daf5fa188d8d19a78d64cb0cc69c4522d91278ef05893fb2ec3ace2cb615c651fdc482b77d151706a0b19a263851488330aaf6bb14fb892e3157f4accc32f71930c6c73299c56664bcb1c45a6f13895bf8c736c2e2ff9919e3d8b0ee45cb89b90acabab1a4aa9b0865b7e40ce704739d0af23f112c3e04ac08b88ce57f685f2b3217c564762f75a3885325ad4ec620e4ae73eb7aaa3960a812ac33fa01afb30dce591df6ce4b56d9470955325c54c76a3031d83649a791a9aeee4c5525c2805681b118959e14b348a8b729879ef77f2c7724e4aa8455a2a8487a6b35d5faeb59ad5b0affb117f36d84ee36b7bc168b54cf523b4b847fcf2795059743efeaba6615d92868153836591fc48442712e72c67bb9b180417874bb9720ea3416d0d90d9137c39175db9f7ba89f5d5650b29ccd173b8d54a327c8af0e6c6d6a71f3c637d31033a1a1cbc818676e6aaa56063bc598431f51b8238f8770a85e31c55a4767c3c5b9bb9625331d35bf1cd64dc66d7c9ae2d78a4557a0499fb8b024016179d5e2c60c2f41c21e11e73a09f1caf205ef0e38aed6500befec4bc04a7eea42f702b4f042c42aee092a60c9362be3c16c2ece8a2295fcba84e53e2ce9508d5d5d0e659e0c9cc45683f8634f6908f5b3e95cc68fabc6611ab8e3dcd16ca3d0110a6dab93ea9c1fa12a47fa5dff3edab04754dfd3140a0b32ce99335845448b1695306f9d1c155d700b928b5983104833713a1200352f96d8fa39900a1c4ac34d86570440eb7bbe02854e607ecd3290c31fc7aeb37cc0a59858100b50fb9764428b0ec3479f07a8f98d504f85c6eb1799bba85b1d7283b7c3c51b9525573b1ac79eaab22f9f1e53cb8c7f705fcbf953be335608d933fd95ddd17469553ac6ab2e737071a467eb98e0348081293b851996befe0a9761da4106882d948c476fe20806617ae4ddebb5deff1a7649e366d137f578d5dc366a3f88d174d9c970b1a9d52ffca9b0d1da28fefa2d2adfda42e4488f16324d4b9b21b4745c0793efa871733b5b9900bde6c461983d03c0845f8a07feb7904e8dcb10c05e62e1cfc0ef934b16df338b32052d0b0f00331e7beac11374b5c665a5fad1ce23c5d435d3f8a309965aad6ad4ac4ddd1bd6afac27fa1b3844019844f082194e535e59266fde2755674c5aaa41ce84127862522751978ca2171180632e20b39b283d59f6785f23edf75e03475ce00513c597dc6a8b2a1ecb92b631817a399763523b1ab2085c6439d96b31c14a41177b1ebd86b09eb1d189dc06effb8cdd1a897631c5cc9f145636834da2e3ef659b95994487b80d71a5bc879905647300e8feac811151246ed664e3b61176d514f6cc554aeadfbb03586dd1d364a69f41aacde7734cb36f7766f0bc3ecf05a8b5fd7d41ff5b7e8a04cf3102679ba33420e2287415e008e4fb20b3fd2619c31e16db8c2eac3cdf689eda0f323e8b415d81b8bcf58b41f2e30344e15ba9efc83a0bfe87edd10d349ca5cf07c789b9acb2ed148b0771e4a89dc9a9a6a7a6d9d9ec1954fd11b97c4255c1ed87ec8fc5b779c31ef73c1d79e6ce9be5cfabd838dd8000dd11c16464abef09a2ad457414d23ec3e5ca721d3d3cbccbfc31072f829010c2c70262931574dcdecf3c636854172048e598d91481496780b46898ff4e5929affaeae3939e8bd6ff8db231c582e8a43c998497bcfc453dcb8f4f0bd3f09daf26ff771600e754ede5ff03108d44a24e5f442c7f4f250642caca3b5096168e8474eb99d87b488945e4c28c497302852f82325504d812f0a429d760b532ff61a28e259c65b8e2f89a4ad1b2667b7aec1df881df8cbf33fc70e588a8679f89b3dad2fe2e71158039969d27269c9e5ca62241e56a4980f73dd476d7626da401b5392892de16be9ab3bf325c67d8914b0c31cd410dfc3a87f27aca8cb061434fd8a892046bf81e60c3a0c6663848511d1f1e6178359b58fc5ffd30a74e27ec27cac7c917f33f9f2bdea464d971d555350db32dc535fe2073c788c90c203625b5d17ecb220687220c0fe1dd4b2c62303026d5b3345178df68fd0b3b3e0296ac5f827887f012b1771c0a4a2ce4872677ca15d950b71a463cb52dcc5535cccbe1d2a667b99ea3102048cee93899b0465591b86804879325573a9cc8789d2894be14a24cb26dc1d9402a32bb4f25492b600f9be255b1d18e58124d9e0a58c6200506fe6833b598c09962ad022bd4251ee55f5642ef8a098418188016a486e75907dc025a9cc92e4d1d7b49f1fbe250542d48f36fc7e72531fc12cd55cc814185e4fbce589b0f0f4dc901a83eea16a2cb3e2a184b49f23a77a6ae22e8e24e25ce14ad469fcd9c72fe52f0e03bd0e06b9122abf4e6a693d18be8685b3289172ed614a2d8bb397534d1aeb214b4dd89094ae4f4c7b073aa9c8e38eb42d56912a16e906f4f0dfec0f6e7400b96f469414ba4f4afaa17e90cd4cbd6a6ed68c5ec3f5496955a0f8512ae092c20ca06d5550bd6cea1012fad41dc4fc13ab7f23af2db729dfdb44a4d4ebd16c5dfce1ff60eaaab2ecb68e176494bbf9b8ac8ccf53a317814e846747ebb9c980462a740f6a7e5594d1f76f10842999d95e8efcef1f9464b0a92c4c0c67a60e03d60b4bbbec9160494a797ce2c086a1ead4eda30617eeb147f5cb49cc14fef0586e2b332f345494b309fc262b4a44d9a51b012408f809c3403a17b3f714fa5e8839f9572f4348b2af0f9a251a759b8e113c758f8381a21b24c4c18cba3ad6151851cf88e75678093fb31e576d8ac84622ce0ac3ec1a61909ce70bd83c5940e2779eedf45c04f78b0f5dda7427f9b6172a61c0905ee15a4162b4d0dbc1e95dea260cfb63a584da29a89a5be75132792bd78e442dca1887899f60b64660a8d3ee258f5aa9ed07b139bf29e25eeb05d230b5537eb67165f35661139d502127824f492299cc81abe6a4ba985c4ee0922dfd0f8cc5be42e6e32019f543f4184470cc04a41250143db1f205e4252f12d4cc545553e0862342ad9865eb9f0528bd999126349271add39118e25bda3b8266f11ea33e5b7fdf1e657aace9d67c5251c0836091e97ace8cc6d7bb36cfd4e7d8eae7a786f105b551c971b54926c22c127de755bd525d946373f3a38f0ad717d2cd3e66029dec34c1740f1bda7dbea017bdd952161e1ea56ff7256cba685a55d91816bc2eb4e258420cff07984993562096e747c162d028cc83c32705d62a72def87d6b110899a025ba1c78b55c53c31ab9d753669b5b94e133808da4811d62a33fb683d6f86d1d189e3ca52ab8ee01c82484c94c201db72c2107f95db749f25b59e40b05dd60e4e693dc3fa51bbf93c39f72330538eb2ac7862816cf82caf09ea945e5c2e3c6aceaeeccd9a18f4a90d3971b86d34fb8e98344bc6d73399402f09dff3d959390ef242cc5022a7cb3e223489933f62bfe84106e081c3836aeeb2b96205153e680f931b1ce061e949c7e6dc460ee6b88d2bb4e86fdf8bcc81a5a5a7251758c571ec8d14ae7ecdc0c98ce50ff82f52f46ccdc7e20590bd3906ac384f1dc56316ac3fc76ca222d123897edbf149b35b6d80d78059e15c62a3c98dc322a05d858514969ce1210593408655d2c4542ceba86d351dce2ade8abdbba46df6588cfdffda7ff510bbf932386161076050e0bbfb69d43aa46a9f5cb616168bb6609d91118bf793fe3322abb857f359c677a8af2addf9242858180ae4901785abb5b8faf2950f6cff02f8710e098dcec4f48d48a884c8ab360ca1d283b3330cbfc9f1c48287326c396f2e9682d147e1b0a30a071b007b9d69071150241e5709c1ccb0fa545454b6d83a160676082a77e1c521da359d154493a16cfbc395a58f49f811a5ec97559c2e8cd902fb1d28b9399aa0365f0e25369aeee17d81ec24e538b1fbe4fa0a9f410be87a3f48841e959d61910b59692c150f78aa00362092896ad76b05e0f3190cd48f3046b5a0edc081f8927b98add147f42b5e7a4273300e0dc0e11164bf42838b3790da47acda933db01fbdf752ba259d161a220dd4c31a5801bee6e48dc000c9e352d5b285f0f96ddea0f1af2ddb2f647bc814d87019159ea3cea85bad741d1cd2b3f047cedc0b700b54b1a15885be880daf71389dce95f1e671b02b38af12a8dc9b4598c1e2e726e297b73a345ccac55277f8a9ea064c820c87b33f68339be60839a05002e574b4a63b4188f4fc642cb5c697d15127a0ed69b406014feace957b1c1443c9ef9483a2e3c4cb3b91844bf51457291a19d18efcb03eabb05ff7e2d47ed3f9d4e0c1d0f7e39ff5b877c838291a6a7e22977981e510ba755e346d46cf6317b07dce830c7d83fe08161f7a3b25b3749c2b905890e3fe8eab7318fe7b231d66426abb32ad2e21e76025bbdcac2c47a145063654e5a0e18d50a2177385e1004c9f36e88c2a2c2f1d841c4e17309b440a7deec846a9055e6171f71ea4ae09033f2221f9e89f7d32c957d7fed4a76162c63c979a5a40b57e4986f70fb4232c9bcec83e1edeb7779ea41bf35fa93ff96259de87207701e482c612247423a98d53f41caa75d9ad288e7b8ac00ac1832399da0e2bb24820023b469c0bff91457edbb1b4a6d8a9779bb848d4b2d7d6f3cdf8965b37421a76ddd3e71808c9dc8ea0b8e5139351fdd5d05f13e533654216a72581e8f9d17c0adcafca0a976cf99ebdf78a076d00cd414bd6a2847f76b25a04a6228dbc3354178e16529ec565f3207f6fa14593f9a63788eb681ee2390074f5ea39ececdb5f9622fad00811beec69520cbb4a3af1440c7a367fc89513d4311020d7813302c13e7a8483721044be1f088735c1507a1626ff42e493881d9bc4216d490e89267377c485bef7e75451ef66b2e684ed5f31d9d23d20424f0e3f2818bcbddcb2743b4f847fa59e6c6288d05f80ee64b2b022739f040c37b610dc72ac264aac20355895c7712d9e1cd8702767ca02a704644709913f5f031fb4ee227fbfcd0da00a812de3df1523f186131ab4b436a93219486b2f1d30977280c7552cc81002c73d441290f7dab589ca32563a5b614c62501236fc5ca861aa7ce93e985659a570c255df27793c546801cc63a2a9232bab483b8a556624b53aff4c1014eb54e27d3f5d63dbd60d55eadcd95ee1f069a79440b50c13c704a956f082610b9710726655b48a4285b150cd44ac5fd4fc35efee40abf012d412563ab048dfa21d183b779eae1a6fb7df4dbf56bde69be74002860df0c5fcfb1fa2fe2278c1ff73129d24ae2061243bbf29d4a4d0a1078144ba3a0f1949f200673c12f0db356dd359c07ca08741c9a34c84cf8e934680864cd8ac5c86049356b68b818140de1ffbb817e189bd028ff1201cd576960a147d1f430fc9c2cc2ccc2e67c36230db3943427a775219538d412b06ac4d45ad1ea705f36e26c014cb8519aaf5c47bc03acbf1c1023883634d9648c7026fc7337438c59911af007c3c496e0bf85029e441f9d0466b956bcf335f6b73ab542ab5361add9be4a99de564ca8123dddd24dda18b242ac1c40f564ce3d7c0a626ad6d9cb8cd327086de438c2e05f3a393612ed6ff96b6e3ee5c2be412f6a5165d9efe4e5a1fb7b48c4628dd83e8eafa98451bfa07c826a91612bda5bc1395d8b75935293da431f117de4ec39a3a91ee82a883cf5e6716f04e1c57f39a26cf803215053690f5fa149521b9357ac6a49eb4937aadb8f5bf1b9e231711ac19dbb84bc8d2de7ce3d64e646c90d8fd7459714c1f9f8fa3a1744756aa231ea95bcd1416df2faeeeb69a6c9a773321d8dd0ea15de100617c83b2a0f8d262d3f8549f58475c98965487b827db48077ac76a14114530da4e1aac3b83dc04f29c0d6a9a8409727fa8f428a812740d549a051a0dfd86afc2941e31354294fc0e3f9cc1ae17352544775e1699f39d33a649851fc468ee74910264cda8d017facaa690275021a6af7eecb100b9790dde8fc08b3c7ca3535408288711aafe12e794622c28be27cf81371a4344a86f7b2f93e2e63f4de56d0d3845ee8e4e5aa2689b8c07a647f79bcdc108c5faa9f7c5c0c3f2b08f63b28fb9cd19ca2b2b10710eee971f19a0ef2d941542b0fd644af8aa09378f0a60d939ccf4a9d05f5208f26f1ed733b29f0c66f645146b65710c0b99ec5211fb3d24bfc3e5069237d2544e1835ae02076f32993f42b362ed08deee843fe8bc8fe2c19ff620b0671e00f67c6a67a14641cdd2e9e09fcccae3ebdbd29c32d99c946846851085d41a8166c965b6cf3985f1f8969d83c6faf746799cd79665aa8eadb5866dec8c4293a40e4685ab93885f431a08440306f8aae99bedf58b57c120e44159486291423c20d174b03711c65a6edc2957cbbb3ae56d34a42287b3ce2d48db9e7e3c28af3eea81ff9c6ca5c3b76777d9fb94557dcf8e5fc3228ea1a9e324b8d48b5b29fbd93307e936ccaca83d03b66a0b530e3d31f78f3bece67e1d38f75ee8425b71f26c556dfa6b636bbe5759d0e16081216b40b8b103d4f39e02e27f8cd6e39cca856860227439c886c96f1dd53edf004c31e726df80982488f748e80463c211c147e7c5fe08d7c7d84e4e5944201a328a04b37f7fae52f089b987345591c93a33b70214886ac08fb095cf668e82224966b92364348bd953983b488913407470ec0aa2f5cc8f012614cc48788b1d12576436a7b840f944c6e112f9909f19d860f0318720872b52d37fcfcf3597db31791bd141f753e5c205fed7d1ae1995f092665be3ef31b136d058d039bd4718ae9c5027a0285cd78eae4df86dc0d37fd51853a546a5f6822ca7325693949991f5fa97ca011bc5f901281bf3c93a6513989a7d743e3292d7460c27343ec5b1d3e37b078cf1cc44cf943d52b202e3f870e085221783974d8011137a0c59e99f659b31edeaba6b87662904700022fd00462ba18e5bd70064246935b373d6cd2e1087d39372ac88f2c447312fe58465bc04ccd7dce841ec65e22f94ac326ce46b08b8142b25de532c20bed69ca1bd11afc08450536348b7c184b134eb27c0ce73aa7ef7f3a8d5fae496533aa462d7cdf68e6e38b64a9c74697b512efaff122daad2c0a691727d7a2670e0405f44ec6036ffe49742ef8d511d4e684b4c832089ec56dde5bc5eb53803d4c9eb16b5236f9ba89f2a726d3ba63bd9e202e47b968033a77a756b4b20c7c1e1fb9bc155df47565c0a98d9f661a6f6a957ce49d8acb7438580b87fa95f8516ae7259c6fc21bdaac15252754043993b83f5909e4cbabd5682272bfa1daed987586815f17c64432671c2fd91c3185e21350eb3d751f34cb09d0210264459ecb2c399dc07a712ac84c86410283134a1742038323173b705462094efa38fc8736090c821a5555d0249b0100350bb8e47572aff0b8236eaabcff081cf76fa8f3c3b9174056d4fd5c3f93049aa44f0d6a7bbd14cca468b75880bcee54748e01d25b0145be85939ed4765b572e62abb70819f83332e9ada4d94c0af3a017c3612a770048435515e7b561278565f7dd2be777fe825a6b4851a34c84f939be51cc3dbea12204105dd100a0cf58bdf0cfd11d3d0a056b8500d7610c8197585698612fb7251ccf8dd43f11a5ad04ac6f0400daa5a99c49bd80efbae9357af2003bc33df55a242ffe525b184255ca21f241747ed87dacada39f4f1c2dbbde446a0157ea5be9ae72936a4cfe813fe3e1b9c7dd05d6ca56010bbc03b70c689fbdf4cefa26dc00dc8023d22704a48e390e62d16233f261784d8514cc2818200dfecfb1578fa690db6a00154fdfbc0b9bd61617489b6bafa452bda24a81ff02187810c1f270fe52e41ec3eab523fdaf74805c1d51a7d230708b5c675d97dd83cf6c2db7c661338aafdcbcfcab09a6eb65de6aa3f1142173abe84ae145f6f7a7b7b7501dc223bad39777e709d1857d95bc5f4a46bc617274581b544538bb1890f97f58f18d00c13a5c9d9533453974681d9159aae8e0457eff1f585a05e5440add3c7d12f988e0a42bcad67d04391ab7a5406587aeb2e664e47eb15c09864d493bde59033353c88bdb499b18f9930701ab8ab41c84d1d511f9d5dff6bdbcc567a5cf31accf022f141c40f9277920689aaccd78fc685fb5ecc84c91bca40ec5c63030de107bd7fbb9852c1ac18d18dca197a49f98590bb9a2aa0447313f8858f233bdd9a3e9cf0ab6296da8944a5621bed211447831d957e7f01052b5168762d15c6ffa7951cac856aa793b10a10b057ab6216c2d2d6af00d61284c119a70e25b14ef8eed88c8641a270188b83bd4a49da6c7870b9e53b33949e692c02817da950129fff0182063a0e7dc03171f45688238436394e9f353ab04a016870aa659eee9155001c53c3a12c3327b5a287faacff57e8d47abc5d922a30d7e310ad86441662816c24c04d7252c6c5065b93d0888571c1220def4e821cd88a39bcb0ab8d46def77a5e793ee1f39dcc2ed5157f2f973f2eb202c86447aba216cc0717233f5baf97e1c17b098972d86127a9fa62ad8d04b57e6c6b3955578b5ca98988d385f99971c91bcdd9b43d108668904efb20b793b39141ae749d3d32bc36508ef40f990eef2b20a70f453bdc60502e0d800001e46a8347e9775e5bd435d46173c9ecef34c6ab3c2971a7bcc1c147dba920db22fb0dd512084d659843f1e8ae393295ab771fef4fe432ac3dc7ab3d75bfd25c6c5c6945fbc7d2c5aa4a9a4f7320fc7f945a82370b48a85bb9da18aeb9931a93ca3b386ae0bf6385eecef87f63490af48c81469fb37e737f2861e08861b3002a5449db50883e084da4b4422bc6064b66786298451482dfa30266663a5bb28899dc7858fe1b13cf91ca8f5b8ec14f6cf75c833c51e69c606d861ae1ddaf008a32d77a58467955b393a95cbe99ab367c652481a72a812c41aa1dfcdfc83c2aeab60aeb34a592f0fe122dc67d4540a1f26ea2eef7354024ba1650f3e20b274329c4f9d4e03e530a36180dcd32ed18ad6e4467f12797f0687a571586d539c47c75d67d88aa0b6173d370722f8fce941ee3b5899c21cc2ca03df40dd06db0317cfe8828e87bc462aa7e4d3112fe7db4f51bd1a19ae951d0ee39642500f4a9738ec0f167fca466d049b1ca8b7b91516f5033bfc59b0b059ec1ca9de16fee805090210e41b280f4b896e2b9d4cca0ec9bce2c3b537f73dcb7211f1a4ca391619d80f09755345ad05047ea95ba98e18cbfc84011b9b29838084c2a4128efa677b597c63541b1d29223d09af540c36896097ab02b9729195091a097c25c2979ae2746a290bc17012798b463ceb968cbc2aa51ad412235d2328a9ba09e3d1379d0169eebc8541275a1f793bf6eadae76bc0ccab6fe4f2da53d3a56089fc92487f90801920e7e62eb94f9f139fb7f7160147f44cbf8423ac8dd13e5ad25c077a80d51466b884e40c0fc31aafe97e73224f577318a2213d3eecf3618baed49807d669772492693540bfdb558ee526658f863bcabf10f81103fe4d74e4196fc2ae216400537107a851d033dc792791392094904c1e0b34468eb62989bf289120d11fe27930c82d29e3c4d74b579e9cd7787f8de30d8f0c69e258ccac50bf9aa5aa08678325c04b21795469c10495f7d5452d7a561cdbb71678ac7de9c4470afd4c8766c5f045956b392cf37ad544211a73796d40431482d92cad1d7d315e9ee4a1d211a97e5afea5419ea88d8d5f706ead8234e308fcf2b2c57ff9cc6d416a59cc9adee8e1d22c03a910774b711daab717039043f6363922e43442ee6960f021102b74bd794f9a4f812e22b843f62f815782819fbcba101dd8371901fdcce14b5ee70048b0b6832bbb1e6f13215fca9b8ef4ef55f5bdcb9fd64b3228c0f79523075ff131d2c50eca94b3a154588a3779e81b87d07c685a280c8bc2603b409bf00d5d958f2f6e95a00ceb6b628fb2e96508f08ee72ad25df175e9f8bb60148c0d94758d33aaf4f62c9ae1bb3ced30cd7b03a9c0d479afb819a3d8a3eed95b418d16a66076937fcb3cf6fdad3e09ae537d2f5146696f1bfdfe2e6e520021fd2a1788f27c7ca64528b4be07b8fc3d66c4d205b9063493329821c15ed556c807fa700a516624a5a7f7890388c9b8dd11acea6c7d2afd5b5554a38b0d42eca20026bb532d513b63dc6232833f6127cf203d656102c2a431845b622f9214beac0b38cc659e92975d606407bcbb8eb990a1d0b436f377841e544919f360a5a835814eaab50a58874357b73c116571992b121d457b79ed0f03f1f294b6aec55b000ecf3220e744ea912b36b8e4b3021bef99fc22c4acff2f065feb3cc2d43c381c9ad99a9c121f65a5648b1d50d5c9aca9ca0f62982a0830273f34a180e042f061a1875999f3f07963911230902db288331730d1b5ecc6f8cf2e30d96a9cd0fb0d6ea100264da8360e8858cfafea07b76acc5d446319b13ebaabaa93d69cba12d4f97537f0ff9389f772a9f40f68d69eb16847c16ef0b1e7072ea30862109c76aae265a9d12518ca6be0df485dc940a48329cf64ba5ce79951526466c9b74ffa6f6c1a7ce7ce07ba21467f98bbf90aaaeddca48012c74c03e30d61cd04fa0c939cd9c541b0c8a0b213fbf8fae1942799409c42d3b8d9663299680ce4287286992df9943eeebacb8e14f28b7e0c2015b00a3b728ca666ae0ca1d608c4527cad67a70326cba11c94a979282d8d5960dc49e12d392b7147aa5644835c9feb2870dced8dc64eaed8a8f6f953efc82c3621577400e250c4898f4ce83626a644b9f087cf3e083c34d30c8daf054762d6582973f7a2515ed9cbf175be4d2506444a9d307c338fd42a7b144b7c09e77326237ccf481ad5351f07862cb1cebaba55e01bf34d09c5024ea7065397c428d35e5d9c3ac85ff7b51fbc9eb93bc1c6d424c8629642a2a9e815b029dea281350ad9e46352e11af733cd650a0f4ce90821d28ecdb8d9e1827101e42ca4c0f616da683d530d561827c4bd015aa9ce641b033f2e50b0634205565cc346fcc87062a8a4de58f1d6bc13fa46b7d954aca2ba54425a12e5336bff9f27746d1d9130fdef4dbff7b2eac23762d4c22483fa771bb281872ecf23ff0c88dd894037d521d89e7870dc75b0dae706dab8b4c5ec88edb0ab89be938944075bac998e1c5a7e2fd55551ebe37ddc3e987fb169d724cdf411a00afe0d7bd38a1db46bc3522e8908f2f6ad29d9ba42f7a2a79872a2e0a8859bdb469f3f93bd43fba44d431c365543a51a8371603e4f815d6596b0f9a714879dd0a985fd4defc94cc27bf430b2f1b76cbe8334e8604bcfaf350da8ee37c0009752a67d77ae7469b2933320dd847aadff441ba0513f7a36c7d23ef8bc2d16030da7e4bca7f988429bcb0783039a4b9e2c114244c15d8327f5f54284205fbe100e654556e785b05a0a6b7d8de8508b4d7bc9f58fdc24cec3269d62f06425dc9fa2b3a7e943e5621af8d716b9488493bb30f8868d8b4818d88eb4dc2ee5ec77dbfa02313c7157831cac326b1d1fc4ef2d4eb706b1e60dde209519d3e7a116a5e24e277c31a444c594035da698619e078ec5a4a05bd815dff3c555e3f512a1c4782769251766fb8644bebd4b7095a77b49201210ec64e02a0b3de73e96b32affb27ae47d47e34c8a2cba13ae8e682b0f84849d9781877ea8b378030e5931020bab50092a4c04529efd32b840a48bbf47bd40a33051867bc336cbf54b020e955b2ea09b303a27a3a44900c2794c01d619dfd4d17085e97c2bfa9e74240ac5d599266437dfae07aa1dc86a6af151e9a15ac7a365d283bc60294fcd1a64e2023b3a40d343603ce6ce8cb2a1c9afc2e733cbbac27b95dd98abc334fcb5434f26cb68f5e5cef02d3f868250b1bd85c39cab52eeaca47171180caff76ecc25c6a750067daec162040befd7753f4d221ca5333bee2415008a0a9fec12972794ca9393731bef4de15de1d6d04369f18332b847dfc39cedfe7a0e7ebd98fc162a162abc0e25ecc42e5c73310cdcf7302da50295dd01adbf659c8413fbb10c49824bdbefd20a6720323ee6015992d09f3a4912360c5eb0739ed496a5f46c715bbd17d33475bf0a52317498dc05d4b75e29f943dbae16afa726e9f9958aeadcef19872ec8cb2fcf1e473d5dd3c30c5b82510abffbcf1ae08c6137c43e632f650abe135f93f0d53ce158f5645d77aadb8d6f211f16bb6593649c65e55677e5704e1e676ed7f0bd02a6d8ceec88459657621ed5cfd32dea4943e41f5de8cd8f35074a930e7e526c5e1d84cf57c322a0a63a62137289eb43b2e6c0b8ebe63195a3589a118c4f1ca6a4eadbe43ab7a2f29a1f5540544e989533f45a6f392055aa0df6861211c15f568b35918d98de5db5d97ebcdd7dcbaca80e13e3ee877f9640cbf83f3bfccbaf47c62a4cc69966cbab9a61685f78153efd12f2e15c87fb6fc2d7564085611880ea075d4e0e5d32667d9311c0a954a8b4bfa290c397b91cc2e14b319300eff63339516e46c222e8921d042176817cb934dc9b03f402840dd6cca323cc3bd1d9b5a5d6628ef26697f94290d9f1a97dd0d5d9bdafacac627d76ab6a773ccf0e12edd2fc26572d7d17a2800b655c9466b528f7480d15223020fc606bb0a6fd447c7f21b4394b4c4d1449aae345aa39eb6be2a2d73ddf0026b5a891a6e435fcc1bc4545a48a5139368b328c0d47cb5fc2120a667b5e51b7c85bfbc0b570f33d65ca9fae7d11e8bdad5de2f084b4e2ed550499c79f53d35874ec3d85a37caff01f4c27dee98365893d0c2ad1a117b9553ad166687a4cebc21fcc586028e5284a2acab8c5335dcec5c6a85faeab91d0093787f8126070c22240f9b060e83c9feb7bd094dca759a9bc38d842bd0315b11eae4b8649c71944928b578ee5ab6e893d4835d4c73fc20311759fcbf6f346afc6e97f01d43351409f46b222b6842029627eb02ca91fbe52cb7bd44f4d47f08b42d80fadffb8a36e3ad1a7d0c5c3d5ce181c29f3566e6acc0b564cea98cc17d16f2842d6ee2187458a030922f52ca820e393fc40c8b5176b968fd62a5f72ef16f16827001d2201589b7aa55f0e6ee74d833d0c1a6b358d6213c8a5b33110e54eaf1ff6f529e6c6f0656bd172f6285349c868ca366aafcf9a6b64ab9e75b64a0c8a029bd8b16aa4c0ca820c3ebe8f4646463db0ae74ba34e98036ac1349aa08918c5aceb556f4a236881842e8ea4b6238ea4cb56c34206bca8db7f117d1ec73eb6d69bded1a172708e5494f7ed4aeea8f9e807772052b97696870011d0705a2054f095c9a3a9d813233c710506ece84ec9f26a0a5b428e5d88b9f14195723b8edc2114b92c6b8e4e8a19b618e7b145f112131b378e1cf9c1b5a534fc1ac5145981e1ab9c7785590449deeb004ab96218e91fe51a003000b03dc7e866e6405a674b4ba3d2797de0b780355437b70000a3d46e3eea8fcd9d84a97946c7f2faa3f542621aed0f1d9f9bda27f81814e19fdf30d445682e59bd8226b6dd0478b9a3f31416a485ad05e935a67ed03274474fb53d6c0e601369b4ead29e1f0669f591243c5d4d11f006200166e7643df20b41022cea31c0baa1f1aa61fd0c1b0ed4ed96d1b3d694ea9149c6d72e122854b3d80ec6b02ec2eca3c51e418da3db6d923371337bc31dff184984bff18f04e3901385d96e5157e2d55dbb599dbc5880577722cbf08c775467d0722cf82a2bf776b44a7d0cc7a492c53de16602d1a8fb5f609e8380a8d9728229425e71eb443beb6a37f13786701db5ca5fcaad67a8d4886cdf9c957e3cad841881829cae67e6c24cf8ae370b02c2077f3a13ac47814df8ca9dd15773f13a2c0553cb9afd8dcbe5e009aa586c48b8ee046015e74725f4c8829d2db583c9dcf687aeb3210fd3f47a1a69d7abc68eebe9c3b117605923e0eeffa24a4263412213078992776db48381dd2166a4b1d748b2bfeb32e841cec8290786474a62393d213b93ccb2190c7fba45bf1ae9dd2717c831e808fe31b8e9bb25c7c1635f336a20d4230894e6cab00e64d9bc98db7c3525a62b0beecd8e44c2c3ffca2f87840673d8697d46b7c1733bbf71433428dc2162dca5180b583aef090c8fca785f90662babadd21814c44eec30b81dab3ef47cd9f205c26001825c5a05f56cb9c5a35052b03d9d6b11ee038f7b325cd1356b5bdfc3c95c061600035aa455a3733d3a388cdce89d621b05d61e1e749995ecb45d45ec30c12e78ed48238cb49b94b17a5610b5c82dcd6b86a1e2e6254d0f4671172ddd816a6b61d532fd805294af2cdad28f1a0359537a337854cfe688a0a5532ccae563aec8884293c73061440c3504bebea02f7d093f8e5395248cff7db10f71d678d87217564ec390c67e715715060c8f6eb74a73986e8ef558fcef836a245c9fdb9f9a1cdb3ab826206e1d622a2ad8f34834f6c8ad73dc7dad791a9509b21c337f483a9c8a5ae61bd3e60fc12d9c64b47563369e2c5098dd5fbc272546d98dd7d5fa2be6b65f454489baf158f284afe644eada6ea643cf84ae85c6d729e1724b8125d98d59652d2e0750d3c5bfb15fa23a00caf38093efc63d01bd00653621d108084d4c20b7e9c66aad2f79ebd0ce3b1782c424d7e95f2f5b509a6ba180cc8c1887a5fe1a421b0c6c39e18d9136646e57a4f12198ed5ff57d631a4449ddc11b0f931cfc37860e2c970574e3159cf2f09a3f87e8438eaa7d7b63e524ec217f8a3fe58ce2fc84152e50280d330a09d607f56c592c8c37ee5edb30f20509fd217cf48980ca034e3e449bdb957e8937d258918c3069e17be36176d63739252805d765c34103e3d2ae9662a1ac11d7ba71490fc20d795bbcdacf1605102ac0df7f37eef7b11b31241b047cfe10f839908481b4487902d0d3817b90506be49fdd8c765ccef9a0dfdc3d676b97b5f0371eef052e162dc405ed73a9eea0cf01de8d11f4586e1cba5505ff08b75c37569386192ee7934035b2825d956ef49e06c6df98498e40aba8f87c6c37bef8bbd9269c6af04fd93c5ceac38de9da7620b5ea2322fc313e2294c2a626c1d83ccd8d5ddf3533111cd28e70e87e5ec0b48c34de185f92a227bd3feb7a1cc4897bea8d213e4cd8784e503912b00880794f6b099f968b4321690cfe4775c25a6f0c4bb061864c8bdc3168547963d777d9385dbdd23a2090dcee4e57694f9dce41e6c7ac3a728dffedd7fabdab6e4cb6c4b36ecc48b6d41870229fc1ba2671d91cbef1fc0f0591d3eb7c02b0bcf1148aa2c2c6302f3637a6735924ccf2c40948231f9db71c615b544a77a35e6eecbe54421f5732870b6950d989f37fe6f2524fe9026391d37163fa5f817cb84f9dacdb7c50e2e8f590a713497fbcded8f085d5df1821b2e884d83525cca44d352e72636b978d78029df45c951bbb8386c149a5777a62183a410e6d85f137362a12c72f820859b8f1c299df8ddd48f82bd0f00886c55d176fac89e37a3ccf8d41ca6fde1a40ae2cdfb8345cc5b606fa893237bec4758c3f53995551f6bfe69eeeeae5f70811b6a18c2b10d7a8aa43e9c8430beb4ebb09967ab4102abd2a4618c7da6aed9290223cfd3a4baf15e625a2294780765ee336eeaaf5838905726813c1d96ad6ea28650612b5edbe01ad8fccaef811529775f454762fbc0fd9234c828b573d2d7ea421cfcf25a3637a203b528c57a5b2f7151e22307cfb0c6b52227bde480266b8d869e68dfd5d9eaa9046d0b105c824c0535db92be95152bbaf86c97413d09454c8833f757d0ecd2a4217a48df44bafdb07d4634d9d5854493ecbe2f5554ee9cc50ce48a06a2df6a13ac3a899e9c798c8ce8ff45759063bc084b6c35024a16224a79e392adfb2721956cdbb5ab12a9c100f8c1641b97d232e62f012810a55b61cc3cd83891ba7048c869bd3f12018fa89cdac9a2d630ea481dc8db67c90cceed747e7dfca69e500066d529eed7cef9284cc77c00e47842d944196196f52868932472fde0877b23d175b08cfd6318b6aca0e4da2004aaa19da70e710363d9fe55381fb972020949fda65f9b736e97d93af9a0b944eb8ba706212f61ceda1de0fa2514562324df8069b00e07daf85c2d1b7682d322242d299c9df8d6cddaa77c7351c008e83b3dee2d48801ed9958d0d496caa1d55de0bf9c60f2cd7e303f09089f73eeda12b88da9c0deec68c8edcee3fc0355af781676e1bede1d19246f5b21226b6be784cea57016262dd0817b86b0419c6d8bf5a676a92be8e65e4c8597879dbbdda326012d374c3868d897cc3d9a97e4f45e4b794021a7a2ae19f36b62abfb33d24746501a8b93bbdd872cf12f9f5d50fb8c5d50e29aff77239fb7340c2e3e228faef2218a77ead3987548e724b5bbc7169da82b216c341cd51a61612a091da97da010ddc63f8ce1db20b7244a4c9aa46904dd8ff079011e023f13d17bbf459e720a780abadcb2f2dfd6cb1754b7dd076b941ecaf4bcc521062b3b0a186c9a460ec5aa5ad3b6742545ef0d95f7b03fd72d634600195f917a6caf45a9c001ee94cfe5d871f90c8beea45f8ac46fba719a6ee155aeed746194ef6a8752f3d169236ca9674c12968ae513bd90b9700bc4bee28a3927d4ccdc9f96f40a8bfd1ae331070ba21f42660528bb34fab38e8b59ac44aa6d0a1b8b1fe0cbb028655bff749b7a58d4aaa3b9186f2c2e600da166fbce1c91038de57090d353a07694f1d54d33118b4a6aee8e19429e63fba3dee8746f7a2c25d9a99bf88703b2c0b0ed3320b1e28f3b134940bd53226978d7d8221d34fc8f9c0d13bf8e791e43ac84c99f29b52b6d6e14a8a4142d2ee9b1aa606d1a1e34e3f2ee7b51c80031c6012bfc296efc64382ba45618a6450bd80420f04b0074e591a770f81308ab623bf3463c4fec293e3240273a62bda94b58c3c1ce205a70d5d43a11cbef03401a35fb3ba265a521e142fe848504912c7e96740c3af2892076440b2ad820f3fb8823877baa962b86cce26f0b7850875279859653fcbbcbf3e001c7be024258bd7e000550852ec634acc433cb11d9bfe821e3a43ca2287521cfd5d5c890e3bd941eb54d10f619be1a9feb6985b8f684c86d6d733314b84c2475dae47df3174cfce0cd75a9c2d97115760c9d6ee6a106454dc2794db4d0a3fda0af9b8e81f298cf2113936a4c3c58d1718cac5da4d49b91e3ebbdff0649a155e80e83422ba2547ef56a8dfc6ea7264bb1a5dbf8e3cc4a2dc1b20b6e9e9227bf3125c4164f7c84c329479e17e9bb5a8a9827a1ee098bfbd85f3efa76a3a29db2dc472db0335928336d4682cb53444e51f04a6fd551952bd67621b72f9acf628aab8820af528e83bc1a83a7c5e575332663dbe3fb77e672a7bb8d033aca48021dc25f28aa88b2b9aca70bb10181620f780db0c712f1f193895d178378eff952ce18109fcb4147e9da438b78e92b6d22162a4514edea51c718d3e1c6ccc345fcb8bd23916a34ab8e32b08882c7df0f9c9694862edb95f300b6542bf803e6788f1a78a740f13502bf22695ec11f9dc636185b44c6413c8209416b532ee02e76ca0aedf03287bfbd97a8e590a96888ffd4ede36585e4578d1b8609529a5432f0cdfff0cbc4afb2eef2517077f89de79a6d2114071e06f31e0790728d0d397494aa8fb369861ad9c989fe23963a52c28cc01a291b9603f1227a790f988829bd996c8b9625f5a1563ea7f5b14128015fe4725d6de8b3fccf000b5b7d9031c37417953f702688e5bd124a7e488ff9b21c0dce9e6647d0512775c6b993006975f05ba85c0e4c9f55a8e68df8320ddbe56ef64efa8c54d3f63e399dbdd0e5cd4037d4b33f2a6419d09c98559bb125ed45ac5284a5f3738631b992d82f03bc261c9829aaec47dc413e789362c93a82c155cd30190806e23afe8d72020e56e59299b46ea24dcadce326cb7b9e6ea4aea9dc4d4c64123fd5714589837d0d4285696cb1c7a40110533c0cf72a5dd4c385df96ca92a2349fe6b7b93d636593b69d2097e4af01f618d9af1396009b209cca4112992104dcd2a83e35684bb4cd26214261431799078e66e6236a555c5a4bb6c49dcae7b0591daf2dbfa9656bac8c1f64a31341237142bae9ce63f6d2608bbdd46c9bc2a625eb53bfd59c94877d827b1ff528fc618a570340a3ad0625a5c26adf9b11d8daf2c387c12ca95b97e81e8417e06c5a470227b77b708f54d3e137354b4deb82fc1d07422a9418b4c79941125e400a062cce86b64a70ef285ce3e64bd9ee22884a053a481ef789202b11d7158ce0a98f897f8d2dd3eaadd6d8da0834c20a5dedb0ef0b7af949b57161e23530821b964ac6c50173b86ea3f8c4d019418e5808804058d6dfc1948e585f741b979619415aa86a46f0e7a66fe98828e30657516ef49dac8b50a3b3c1131f29b0f1d555a7ec205f1eebd31d226c6f04198693bae86bf8177694734e864fecca0d0aad989e4e3383b3b7a04c1e42ea5534d8be9945895cc3fe46a206c448b6b9292e540e47918715fe78cd1c93eab80b3f843b03074f24827ec4953423b8561278426c91b64f510d7a87c5767f9c734f4e04f790bde63d639243f1bf4bf710bdacf62065c81114b419ba1b42227716afeeb2a42a8733f8443fcdeeadaf120284dde5038c51dbba3f0208871ea4ba034c480e1711f808cfbea8c29060550874f200fd84207abf4b5d2f6e5b755526742109e281363a9b67866c3aa694e4d36228fba19dd4e9a858b05736898d352f56cbceeb5b93b4bcabfb5e0da0a55e337d7f7769157785893dcc2bbed6f22777b873480c2ea4828cba99a1fcc36c62c857fa3fae6e88f678da7b429e352ee3474d5d4dd7308e06d6e13bb30d7066f812afe3779ab8f13380dd12f26616ebdb96c9bbf5af5dac99617236072239d3b23fd089ddc9a31c2beb08305100f7f775978a4c4d78cd73d709fef5481811ad631063051aed3d46310ea16ee9ce0cac00fe94895fb0d13293c99fd497232a86282640824da28562762611fa613dade61e8a338b5fa8e20e315952288e2c2c66258fb72d3c9ee30c427ce1988cab5be76d2cdebeabdcd487b28cf5fd389bdfbd0067d47621b5772218f6d579d323404977a3edc486af6389bcf08a1f5e3111e71810438ccd7d69a557177bedf8b41622336cf1e4536b4d2637fc81d30d2845374ce80d139f6e04f882c2a537e33ff1d44f37e32e7afb93316d6c8da5d983b5f0c4bce03476b10dba57b6f8c90dfec1ad8ba680e8859750aa1cea857d19996b76504e78eadf155dbd0fbf6b35b00c8e5654c559bb35ac5be5b8bf77717c40cbe2c47d328d84e664bec4541f43526208fda70e08b58c5503f012d8bf179a86707a25fa63b5a03420085cac58cb5bdd4c0ba731017b93b363def23406e43ce86e3c29989c9e2e3f9af4aa99a116dd5013584d84ede6d98d3cc8f163772f20e4e049e608815b02b3f5871bb00b364e99c619486c2df3ffaed69fa4419160e5136429ba755201a9c9ac1faa806583f51c9f316ea3db0391e958c11453d09af82ec22d1a9907951410c4bc1053827b6b99a436dcd2f048826e8c10fa14b4ccbdbfcb2413b105bc04cb17e9fddb0c84a54ce25d5eb73945569b2814f7fc4c033af667dffd00374982a9ba98e60959b0ec22c944fde418db60fff802d2722e0d7a512204c3bbcbd0ad6e1bc2ee3e76f8cb39fe80d9359f01d44182aec0b4736289f50b1ab944b9c0e80f580bc3246898ab3ba97cfc47be73f751aad08f53da12562a976e2ba94090a8af6722aeaf02555902d61fe9d7a06b77b2bac6eab2448b8ab568d1622e2dd194d7caefeed0c66fed842a1bf5f66f18481c058b3a0901b956802aec6e8257fc416e67666b831ff30c42990ed64296255e2bb6e6175bdff2b3b80d4082503835d05088a275bd720200c2e52f9762ef21195d437ff19850cadebd8b2a469473a524e4df8171717bce975efb83f100870ac23f6ab97126cbdfde64adc65d6167986edccc332960ebfe1284006c771a2eba67d0873d7513ef5c24f5cada3f99619b1c548fe29100b35ea996983ce0f643b61657a1332cd875680906b32590a9885f2205f2735770ac1e523095a32d6833d07c743b9cb649203b39beca1c9deb9f0c0a8ba6fee421751022a31ad70ff65500b493ec828b3669d9ab52dd78d289e98d13fe6a4526b89fb72ace5bc28428980ff6ca04ffad01ae2e1fa467a2058389ce2177c52cbaf3b1163ae191a5033b3416f48ad12ca5d77332317475d774f49824ac1b1770c841e31acfea8fa69990f332d19b3c72703f36594f60b87248d3830c8abbba1226a03cab4d165d84d5354a4699be23df5fee21b6114c3a334758941995a87d160c71fdad5329201862394072df601505e1dad4a901293d6097f406df8d6de1222bfe39b8dc16625118409521e8189a7939b84405525f1136e65b563bd01ccc1c95f0392ed2b57da765cb4c5679ba6862f46d34c71c1451e5645378e6320fa1f9d7069a453528ff6f6583aa2ad0894ad52efe7e2832d0d70498cab86c85793792ddfd8259252031ca98cc85db58a30cc10206991ef00bb41000d043dc4e20fe287d4ca9ee3fbd2eea01ac9e45356d47f8ae01ef24a35687ba008f78c3fdb0043897cdb32a999825694f68b26ddf6f28582124307a58b82f88ae6b201313944a0afbfe418980b49ea2e459d6274a05cdb08306056f8e19cd2026fcd66e59798b98ff61319302e8f1070a28438ee3b2b548d278e6ecb20c07180dec557da01f6b4be4846ce24bf68e470da03bc3865647ff56bd220355fefa3cbc87ae7f2e9e26397ef58c5664a0ef4668be0c1a047c4879214f44598ba597e6cd24a5a5e62a3c6d4fe91c138982428fca40cf58a8e3461e33ad95abcbd3255281f78c5598a8029388467cbdc889cdcf001f815136caa9fc8f647848a471f97814b8b8dfc0ab9f26a26826329ca090061ed18de38d8cc040a8dd297ac90e707bfc427bb91bf09b127e63ead49e07b4b8ab2d64d54a12525c4c05981f12994cf2644a52cb0f7fd341ed19c3ddb71754fe7406d4c6ae0e66fee9c96d0a585ee453f180556cdcecf913adc8016454509ce915fe297a937e76c4dfa5d31994bec99872d5cb1abac6f4aeca7c56729d5975451d848b4ba88184cc6d362c92d11b52b85f6722ca6229668419b8f3164bfa3347021ba2f21d13a88dff391f82c7e03fe8e7f8b95f6ece2bd5703438331e66ec049d393187e108c222c49a68b0087496c44e0945593440ccd4902f02e1ee635aa0d19bb9a971d311d586c88e0d7a03ead763d1a7052ad239b6652afa4d6f86373d4ae1459ff76f270725c17aebaf2a12fdc74d707cae8a4ab41b34030f068da22058473a33a6a0caa37975ce5ebaba8ac5413afc87b52d10041ff6b6b93502a6d99d3f431589e92a2868cd26d6515042ea5f066aec9d5314d440c241071b76f6189576a4ce87641afd8b83840f7c474b0b0155b4bdeefff2ff3f8eb923971d76d73644095d84aaee50213dfaf3cbd52a0c74cf31f0701843b96220957a82760b8681c6491d44d961a617325048e776a222148b592b2d39c47738fe02df28b4a4e0c80c1c6bca8d862172911dcc681b034dd802b77ab1b28eed6dcfb7bdc0090d307ed0a51a2201b73537a6f839f32673721c09809aea5a63ebfdb33205cd1c389f71c5513802c1fb55380a7022854f36f1c76649d1d1664b4ab496e656f90d38248ab12f3eb50d7c0932893c1e7fe5fa94c539a00f148026973035508441a13ef3f0873c1d3f840204257a681efc80808d1eca51f92078dd0a455a189f3fc0638d12b15c634b360f531266d52cd548ec1954c3b02d7a53d831254248e2ec04e0785f74814710aadebb18af977fff97aeb763f2ba44c813465ca76648c53071cc200dfc9f28701c50556aed041930d0e1f0898bfd38d145140d8b8a55296657cd15dbcc58b5da5a1a188ff35986e0c1271fe13346b4d2ef42cdb653847010e0985b288cb823bc6aaa6bc4f37c4758e77014b2c11dd962d3047f61f8939ec234d61d73372021d80f15c1615febd4723dccf17723785e5be90e2a177e1bf3014893e76250be7ef68c5729c19683216c96b20ecf7870702584212a3d9c9d18e8a49a401604a53d43307228d38a7bb66f674cf1c698e8ca0a210a8287fcada4d707a1420909e883661adbb0df73f39d7e5613fa0da9b781a34774e3dd0a46f66711a32c84e14516941b9338a435d08bb300a0077b22ceda892acfc10c41f9ade642619037facafd5d3a7f2d96095cc43ceb20eb7b40d704e29635935482934a38d666d78f7733b01fe5e8e836ad548947f141ec2bbd110cf6863816c3226f86f3fee7eee1b20a0a23329d8a8aa70e88d099c501ab774e711e9d2073c4458c0685f60711f81ab8fc17b939b44574ec3f2f5f768df7dff251e7c08089a0b7e7526a640ec021ec2e769804e3ea6fa932ebf464e9c6ba8511a27507fc87e1e0fb212662f6f24865e011ba0b1ed74631ffcd00699eb976c88d4884dfcd6b16748a38f37f629291c7325aee906ee4ca28407aa8be22e67b1fe6a6e3e67f238d7a447b29721878dc0f7f9cb0048fa17e48f022aaf605e8fcb80088145ead80a088d69668e0e2d803e97cbd47d2e0e2f6c468eb63b256d0fa328ac433bba85954689ad7e4b1e8e7448c00872a5aae62835d52140c42ee8a63f910917a813d376aaa3aedfe17a8faa9fb97d62342499136f2417f29bc31013351c363739acaacaaeb201e91dfde4b24603dc599a489b42a265d1e2bde5ad8e7a5e416dbf9d91a8e2cf92a44335248d88e6486dec273f20a75d14d87f8296869ddf4e9f70ee45e5394496b2135f7bab944fdadacaa0f47403c71af57b550f0feeadbab2513a34a2c7e62b14f2882ba52dfb3f2ee743598edcccee474cb17c15e59e97766cf4b5be97aa58ccec39e09a77a0de340db220acfbe56cccbdf10d2ab98a33b1d04d1abc1b25df5d614835b59a1571b39ad43eb8f2fe31eb4a7f86e3a086d9093c44a748f2d79cf47c9c7270a15cd2b2398aee6153ce40ddd91b1bc9be098de2daf1ff3ad6a5d7ec2767dac63e6655b22bfced980118fde519c19794ee903fcb9a4d0874956a7bc008c2c403bbd36ead3f8ad3dfc2a58070d61f8e6b10a5f70cb5df54216053b8323fb61eff36121b9a581f6a15204df566cef8a0541dc95757bdafb5e10f551b758d4ffb4ee4d4d386c4f34f3a0970c59deb9c653a3e6b6c3f8b88d1a712e8553e40a7b1db090a6650cc48c48b71868df81d8bcdd64e8bff21ada5566fcc4287f9c011692bbdc325401666b4b06610874e4d686bd3bee6e49c379ef10c8c16a145eefbdcb366b28a244e9f8ac46e1263a24d4a2e5e559ce16bdde3ccfa9258833f113627e2b4a36e96ea89319f76a9f57d7214036f9af043a782976a3c4ff0bc88393f23dbcaef363c610afc5011d83eb47091521c2dd236fdc46bf0225a9db58d855ade60f00d74a8aa6677b0ce44fc5aa216c08dbea273addd132d24af2db7e3269aa816d40e37abc5be50bd1e9ae7f713781693103fd7645eed932a342e7a60b6d219cb60e7ee38443a52ee2978ad3fbe479f6a51aa7c32f9f69e0eba85d06f3cc0dd8d0767b68ff2e1e28b34a854f6b2143878b7376124c677045ba48e2c523d53fa98c101f4e0953eb7623028f250a814b0d4f3398ea1166a709ea0ff9da9a4712e2ee1dc6e30d3387a05c28c411d5cef5de1ce5c59034b635d1692451f65b4cfd9776c573f391d23c50e333c23f1b1afeb15c2ebeff5c34219debaef5e8a0f238c004669e09b744ac28e2f0a66b9e86970a59f78f020621511d3cebb72a372032ed8a0f3b4934a046fed4c791af8e82b47ae25f8630ffc96a6b86a4f687b87f0444285735ded7190a1009b10b79ef3e03409c1fac744d318e3890bb6583f10e2b155904834bf4137bcdc2d99d81e5e0263ffa5f6ef0bd7e1952f28455f901e8236eb6a19ebeb1ed4ac8327d326e86dd1bbe8284e648a038a6a715996773303e8a2a31bed752b0a4d435b749f7168332c797b2d5849b93ca86dd1411ee565a7ee35023e4a8348172381c2714ce9ed605bc225a7ffe6ed129bf73e58ad4d00810c13341d9e1c05caeea5fa86488c3ce420095381050d715c4412fd06ad0f485004b28d51e3756f60e8b9800c9058b986f6030ba8cc0cb056f33eeaca8cdfca0aad5a33f84037be3da7d47e816e030025453f6364a789da8fc2822e25ae61e60c76f821655232dbbbf052a428db4efff16449135a2d9f74b90456b4acbfeaf818a5623edfbdf052b726d34f7fd167cd1dad2d81f5f69e055e293db7e03c1bd4d80b7f8261305ca96bfa68d51a3bb4ad088c7e00576fa87b8ff2cff55ac128df6bffeb6b65cb976240b98df173cf678252fae0cdbacd515f7d995c311f830db0dece914c686be98d0fb5df9cfa087bb34040c1a0afea70ee9c0fdfcb70abbf5eb3f8c18fba9744a945db18c6016c45cb3b29865d9a6efdffaf46c5043d6c1e7c5e7abd7bfb08656e00c7614ec3ebdf1652118035b2dc98718329ae1c60ab390f26291755e58a03548cc4600d6cf480c6c2f00c31dcd4e586cc34f4aae7ab03de37842ba176c4dfd4b8b9ca7aa30e3864e5c3104aaff9ed1395f63317e6436241c63b451a1d3c9469861318eb1393efaec14e4e885695f88416d09bae5dda6893f85ef8da4a94e7679a209b3fe7ff17a7b22088c545a7a91832f749639aeea85903e681b1fcc3506bde0214f19c075c4a6049b9e8799fa71b39887a18b657b2d81a1b6c303a28ebbad1955d2bd5680a93f9cc68e1821d1ea9e03298106873e43293d9b3ee004293e048da6c02fc06a5e6c3694b5bf0913a120ef212e797253d50872d8e8d68b53bc440d0be8afe8e9089a93195743f580a0a9e92630d187a454f96d964c4d051bc72fa807ccf05bde6f69ac06562f90ab8a6a0f77d7011ea410b1ad8db9bde3f7868d1c3ac2f81836590fc30ee9e341843b2ec4a5e8b5f128128acd4fa7fcdd8b3682aaa1870dbf89ef60da1caf1da32946e04380b49a9facc5c6db0c9a5d92f83a1fc2b0278a094be52caec4f1dac3d835a60cd93ac52c42e7494772d025e48e37289bf74d3de846ad9147ed217dfe32090c8eae20fb6d5355b1fa67c1b0a08c401577c4f14ee0e509124d8849641e50174a35364f02db34c684f20e8696b49e50c934301df8263692a14455c0a6ef367ae0e314503cd64accdef143abb739d72903f9fd7a23364bf6b7cae2ba7ca74c9ab17198c19f4da8048d8e34836465098820f10d956658793fdea68cc279db7ec15fdf9720bca8dd775f736891da06681a4a004a5937dbef34e44b84bfdc31c7a47545bc10625fc6cb054383decab1d0aefa8da87ee291866ff7fa60cda84ea587ad99a6dd5f832aa2d6b4accfaa094640a01c99258cbd66f89056cdf57e39a27b281f7ffc79082ce401b3cc2675a054d357c44b9c6ce01f6f4d51c16768ad061a85496e22ae8ac4bb4e749772be1640ecb8329ceb78c1e1fb0a2e749dc760d560cb4a32a90b01f465bb650aa4e80951238772ec211ad2cd3ef1fee864451d1f08d855545e91e29a3259a8c675df7f76c6bd817364a33740b88259f14515ea4a2b5c36432acc68d30e9e77b89844709b370277f7fcb8e41f09a9a84e5835c21f78b841708b0de80e7601e6e17b48cb92400b279490a2d7f2117969547ada910a4abbbc9532ab93f00ecf511d5420f462784c943c09b41ef030f834a924155894b211e60f4911505f88757d036c06dca0b564e2fc37481aea2c64d2f5ac71baf95f626742ffcb18744efc53c26d14a9b4475c8997da466a030e722c14461c029747100ac2fd53d2db488908534d5dc0c610f844778a666a83e0bbc6ebed0816b3feeed33d2bffc80fd006a27c3620931cd62064c522036b2a078161ecbd80b8907c2395173a95a31e85dace03ac719636a7aa192608495ff770f39505efcc391e9de3d64c755223a56ce0190d9209ca4c5890f8cedb2736326738cf027dcbd93381f987d5b69b7f537d77c4cb01a81954188022ab3dd0b8e4b9f92f8cde366cbb4123e59e1cdc9233085c429f89efea2812050d3c187fe4791efca93bf3ec60c20087c8bb012cc3a1f74dc6430fd57b1a351a08062b0e4d807b0399bbb37a2386854a8edbdbfa53417b89207ab3f237eea18662e787e8f9507ff200fff0dac095ed40df075f9b4a7c5994a15490437b445bd626ddbb9e360ff0af0fb4b0572fec6179804a1a3bca84d03f1efe4b1f38c36c8a558e837524595122a999c887b208d1edabdda8c0437b4c8b021daf83855e97b1424e71fe229167e6d45e729446593c8cf3686d32fe7768f96622ed71f197c8f33ee1afd1adabf13c4f139109622228603742a699a69595668fd7b03fa6a79f347dce7525d0226e5184ac10d99f537845c67a3e81b12f623dc55548167eb91f26c221f7e152282f0843a7480683b876bf8d5aefe98106a8d877e512c20d2a66f25e83842a9441125f93c479f055a2d8002899929339c772fa1d1bf189195ba0844e072c94c61112931c191b59e3e69360fc8ac6d3d83755ab26d258c7b222e9b855d1cbca204786da04763338ed25acd13d194730b3a3988034da0845418e2732fe77993dec6f64aceca62639fac933d81f3395671554da60a6c7dae29cb6b4043f140263a8724289c82ab1613a3748ac0ee791e8a94701af2c40f40d06c342bf9745b264906a3b61cefd2a7cd47cacc220b8cdc5430540317d7931d84a6f601440e289525b34dc9cdff335927339e214e15520dc6941eb3f1b7043d4c827f903f173a74c90ef1a98c5db5e0ed85cbe5414c90469d7c14466eb07251ea2d603851aec52fbf94f5a980cc156b0b789652844c59a1eb529541694345f44838d4b8bc87e7e6e06908ceda1efa381c2ca4aab36f5c8ca11ede9d4829b63dcb3469431ac8ce6ea0aa43d236579a5d2c695339285769a2a3982a5ab2eb2d072e54e755df7f2773be870bbd09ba5a93b59e885f8b59d2cf8a7347c7fce3a452207201d5a96117a35225349d071bec9f2ffa6d4a048e58ddddec2cdac7749280580a80f1357458bc6ddfe427504beff66ab415a8a132ec839398c08d57f8706de4270d9f930632b8dfa7086631266d4f748e1540eb89fb83418393fccb83dfce39509e308f279d90aa974764e2f787518b67f691a599f6726d691f7885e986f87ea453430390c934e045e80d067f9e74d069813644a0b6bb32d12c7bf5873c3fad78b3de68381021df0633b3fb16e444af5617edd9e626c00fabc1b2f2d0ec4dfb152e183bcdf7624191cb47cd453ca1fb2e7efe910719980cabc23a40e5cca24ef693354e3fa49d05c446b8e2c6455ce73cb8c518e81d6d2ccb0619edf0d2d0a636ca9f4ad77196204110c837a1e88cd1b3ff3e734dd102c9674bdc4d3288c1951757d5208c9ae569206e0bba383dabd6438240160a6d513e112bdcfc15ef98e73a5e835263c108bc194330c0b04d678a5a9af949f628d65946a2543d8ac641784cd72009b9b138c80e6a99d6b9e12c9eb31139deaa961c1ede3eab1cf86587e86138043e3cf110c449e8b482575139d05ebb1706562b37c7baa4b12bf3a3b271dbf78be2698a60b68f36de0c1ca98105e6cb27c6cea07eb3e45105639b174ed2f2e6c1bac5b75ac99b5fcf1df279d14f4853fffaacfcec7daf7824019ad1094fd6a77752100439b9a598ab00fac7e639188592b18b68a746d66fbc937349f334411ddc3aeabddbb64946ee85c685ae717689748d31cd94704b8215dbca6ca064eda02cbeb92d1371942f17ec43b4cc1adfe3e80e6aeaf129c468583ad997c2576b576b107a3da71e4799516b1fdd5ebb61b88b99caf8173ce1ea43a6be338f35b8a7e52158cd950315c084b99ad515e442bf7c7a46594fd3d7080a369ab4cc375822ead64e4d804088fdc5a6abe781575983579259272302a16d96c17200f8ef03abc87d316d22ba75ad918f2ac8a587bfe4862dd0b2037473d655a51ead8477fe05a5e0c6f238e05388e2edc755fd1606e58a03596cf7896307326169cb337c879cfaa90890146f719348d2c2e1426262acfd0caef94e5e6c1a68903202a98a8f96ff73b053974c4195a7b826733f946821cc77789b64fa386c12ab2c5aadb37bd37f176ba9faa677d981ffa3ac13e149eb6b3f590f670603183877ab27d2a9fede124e13d9752601440b771d090afb25de408a427a5968f1a6d959583ae3482b2b581830057d4e46446be302e8698b355c692309f5da1b8bc068c8d03fa70b2785630dc15a503850476764f7d9db45667a1f5ae22d31c5de6964b52ddaa5ba935b0663c3c318885b9d9ba600000ca82012730009c3375154bef9afa277b5157237e243e928b5e5b04be2ddf3649c8967b6fb9a59429a514b30774075207ffaa97d27aeabd1692ec62b04204242b08ad233c99bf480be515eac17e850c93a73c69561c630bc751d5234d6e7d848a2b48cc3ed247f412d76979ed9989d6927de9857a5abef43db47ca9a2b48796222d2b64984cb61e62c22308d3fae83a1b80e2fa0d94bee529965f297dcbf750a22db40716ca5368f7fcf09aded181d931db954883976d5c494ff1cbb769ce49adfcbace7c49653ff4f65cbc050929a9afa5c5857a1991a86f79a19e486328ea8b94a250b4851679a12c54a8c75a279b8db2d8da455d06e4dedd1fc217aaf1c484b9c5c9430396e7ad77a1b2334f75d35832eef9c16d3a54d8335be397677905bcd0f51a9657c07acdb34aefb2ad512d34c6fa9717ea61a13156cbf7d0428b4061d11e5afe851671a1454a94e5857adcfff02adbda92adbbdd769c3fa1d9d5144ec5c8ce731c740e7d0bd0541d3efff317a9673232abc7755e7d8c1411c75ce0fde828eae17b8ff7db7eecdd87d4d44636ea21455176cab45f630bd2eabeefbec0c57dd483efbddd8264dd7706c3c543750bddc2ddb7fbcf77776715ecfe1efb7b670e925b78eb56dc5bfaadb9e716c27577ee717757a62e25d25e85f7dcfedcac9495761d7c57a2a820e91e90420a5220e5a4c2752d4da2319ff5d14655a952050bb59fb4b6cf5fe8cc9d7b0f422a62ce39b3ac8b330cc31c6724523627d6fd54c9ece78c85a5bbbb99b9e4e2f2f2c22fb5397b817181818129b5b0c0c0ac4c18181812cc08838181b1b8b82e927b94169db4ae3922c928a76369892e3a9ad234954c32d3c4b1df02b59d8c4824cf1998cf641919476326d6c07c1c3b2055759f65598d191a32315936438609267b71296559d692b1ac6433cbb2ac54e49068269629c1e4a74890c8203159db4a1409454293a04828128a0423e2badcdd3977e7bc5b3ad1cd4faea52298fe0610c1345d1769baa3626561a3c917c9546a199d3be9f2326333f70b4c776d3a011838eac8303030fb8ad8fa3d379b1ea9477012e81e43e82618cc87966036957369117393b40473a9892a312909a6bc2c9a2a529066347d4c1890ae3264603f94955d9b6d3225cc67666666663ac6603ece31b36b930c0dec07d60ee30373facc603f5a8d1a9f6594dab0414373e3060d2b9fd9681b36785f364b74baf88d1b7d83a37479c180c048930d196fdcb8c18e06f331c95c3e35ace646313bb8ba0d21549bdea0e1e45383a66935353870c4d2943b38a7a5e073958d0d0e6f1c8c63a1dbac86d2a4a1cdd4d4c091c39b733c4daba9c1812387cdcd4ddcb1634f147c9177ecffe81a359b8f2c07b5b9f19bbeb9b9e19bad46db0670e4b0f169195349878e279d4e3c78d8c037dc8093d31cc614294eb2e025bc040f8d71812f2a17f5b08373927bc3ffa337211b6d9701c0c3e378787878bcd965b40999a0f6b3cc11cc4dbe177907e6a36303fd5eb78e37d80e4e870e1d34eca8e124638d8c384e1b71709c379f4ed80f2fcea986070eb9990d39e46613a77118e72d92b95c9b6e10a8aec9de2ca548264532bbb2626fbae473030e0e0e8d03e380c3421d3a3020ee6607e6d3f4c2c1e1603efc388c030e393a3b259f1d1f9e6bd7076583ccb941eaecf0cefa681ba2ba4b47d22453470703e2fee5604076309fa621983cbc11003c3d1c337bedf7f6c101c84100984fad54658b4b3e3db09fae49e61580e67dee6dac81ca34eecdf6a881861e377ad0d8a0598f1edfa3478d1e3d7accd0e8d14326a6c70c192d3d9a7146313be0d074a3aa501e60b08364d3bc4bee1cbbd849aeed2712c43af7de7bcf35ed2068944612715f9aa5b9fe867074ad81715d34ddbcbbee8777b4d967a2aef6ca7a52fd378c29d5d7fdeede54df4354778ff1fd9391cec398e25f50104ce78e6e315cc145ba48ab645bba7bf0483c5231d99b7deb92a51931ccc745b9a4eeef12757f95ec8d129f11f6e3ea4bb237fb17898a60f293788a69623e939f2a99ecd7aeb4608f8ad6569bb2b396ce746045a5a25d5cd8e58d627680957f014d6a4b89e4f2e2f2f2f2526a61797959992f2f2fa49711f6f2f252c3a889c9dc1e98d2a91d605d1af7c6fdae0f9d280ae6667acf2da9ee2949511444e9139954922631290ae6162d134d625e725faee328754af734054f9398174923613e341af62353e7ca0a0be613a90a2ba42c691213b2b4accc16aaa5a5a545c628083659397271fba63d1f0ff3d9f141c9d676abeabaa4c4e48844c27cd688b97fcd25b269d916ed6473c2d158584ab364922d2da55932c9923495309f9249c64517e5ba481aadb7f9852299db8459181fc5ece0f5bdd7476164e905f39925d3a312e632492a82f9de5445ddd69e94ba4fc6b4452790798a64ee5f32a60ccc47c6ecd4fd180c4855779098fb978c0c0d1a337266b79dfa9e2299efb5eaae1a92229935302055bdb6c6ffcfd0908999f12fc304f3f22ea596ff67f995f935feff29b86314b3c3a9be87f5d1095c204a1053e99212a64766476e0f6c911ad14c0326706c38d980c304d2fe0c46622e9428a8888209f8ddefbdec87d61e8454941a21a5ae06f08ee700def120cc7e784c515ca5d36f8d9f0b48c061294248d1459127de248a2ebcc91047980a134c4588c9164991c516ed4841c54ee630908117c517de144c5080c8229a42098b480612ca15615496ba50ae28aaccb22e942bb4a8fcb1afd04125d58572c51395dff98865700406b20d36a9fb33180473a1449145dd64106ce21ce0c205489092a32e16480843741de8027f392e0c552bdbd6a0a8a2a880bb9b41c6b44445aca06ea6a5f40833d6252a424935b9f338286c5aea42a9e28abaffdcdd5f5d285530a9fbefddd75110beb744252fccf0ebca5037e79ceb41183140a05137095830a9fbae6e12b058a2eebbbd79f1c216dd9702bd2f5520a791673b09ed6055dfa4509d3641fd8fb6628cf74c013b948045951efecdb62275818256ca3644f58532451795c84aa98f36b18121768b243d141de2df8a54a7dbd6dd22490f571be71c3d0d5d710418dd1042e81cc25d6d0bd2c0f05db79108f36349c63454ddcb5df8bbb96d42dde03b08a1bb3b05e17b2e9e600438444cf7fede7beebdf7e07bce6d614518a4adcecd1831fd234fdd16eecec8ba98fddea66ed43b1927ccd81adc9b5d1ad72518c10c3dc154462316c388063195277a0c51d4c66148699ded289d337a8afe7431394addac267544654d16e6268924112633f904538119c2828c8c768242657eff850cd7973114ea623e39ec4dbfe63a31ca3ccd9643ed779f39ec4da6841c7a89634119a94c3d710e0a410c856ac52f9ca3527d1c7ab764c82d199274e8a24314f528513cca92ef979032f2a630957f535cc7b9296e8a9b329fa9ec4dbf8e324cb7a4478f0dc53954a927d41141a70ae41fe59348ef91486f5524d2cf7fefbdeb7aef5d5b6765317c4a66424e92f42f239d629c33fee81f2e6698bb2d5163bf2ddf53efaf49a2dba93eff51866532bb6836b3b82b06ac22c634814da48c12d620d220d8444af92d79bc30fb17368135700c884c95d422da1bf93cb030378ba8ca294695bb3792fe74318960939826514497284dccad718b2a107c2a42f831c620ab842daa0fc2b769620ab1882a9017b28ba34554e3539912eaf51b57eaa97718905395d4aae1c2dcae25b57fb39cd46b49b488e05f96932ac822aa4e5da278153988ae703ab958e10aa72d72b1c233e1626e38a630a938a69caa4b92679283889754c7443c5d980438d970fc2dbe06061a1a1d5c2708afe9bfe81627e5928a51d95467251c6502b896cfdfd7d6d1e12dd1619dfcc61f84ebb092aee95f12b98989292bd15a17a60cf720c698e4b97acbb228324cae54b514bb487d8c1f5b87aae19f1d2b980d842b1ed3d5e746bfcd7a654382c8ffd9ca23c6dca2c332b9c1ae3f1cc26cd2a0528553a0408b2815ba5f5721057ad451e96a47b982b42a448374b286fd7b9ace91ffde47d76169f967aa6ff42e2feff25090be48cce85d7e7b5e48b407987ff9175a2466e4f20a80a287972ffd065c5ebef4db0323d4135d9ee57d78a1d36b5a881e5ede8516591ac3c3ca4a8c02b8a7e5b9a7e5b7c7c585421113640484fd886edd9e954b66a56c59b295ac64a2d2d128446a479423860c5c925c9794d765c560613d91c10482f5647978c6989b4b1297243158d030f4646e27221a864e442e495c92d09073312c02ac22f544fde962fa1375a3e1c1c2a4e9b67e44abc7b292ccf42782ec08430b46eafbd293e6e28a94b755f95bcc4264adde33965cbd15bfca3622d545662f66e005134e12e15a1a1829215be49ee70aa7da8fc7dcb6c87a975974dba29f2e2653f91a29ccad8ba29c6adca21ffd7caa970531950ab100850d88eafbb894902daa8f0239eaa8f426fd85690b9215fe1b3191ca41541662aaf3b9015588ac936e4054a0f7709298a9656666e621b26e442015222b5320eaab4dcad1284693152749623e9b44378a4ac5b2cd25814f319b20e66339ac1b2b7186baf5082e4f52b71e416de749dc11aff9c2dcde91f78ee89cd8da05485c89208a94a52f31eb547e1cb64700f8f971962768a75a8fbd4bf6236bc958b20bcba613a4fcc123996d02a8fd17869956fed4388bfdbbce7ccce43ad1235da932ede435ccb0464ac1175c4bb3d910d558e1cb208be8aac630b95affa39ba9e5ca150f51dd5688b071620a814d2ad073616ed693e591a9f061931f1e957b50e36f2b44d4f7a8ca3486080724cc8d86a1dabfc510551a8664aaf5646f9ad4f79bf52486c8a68907ae3d4df9364bccadaec6ce1142e366c4a76c54f7e2db2c3185381315887226aa7426369a5a8d2aacaadeb58e33a93e0050cccdb55882898f2813aa99d4e85af892bab92a25b5fe873f956d6e49edbfb4a86d5197412a1d0d7226aac3117b15572f52ec1c21727f06f555e55f05b92a108b0649ea2feb6155fd55fd5655550d1140952a67d8c1a66e3dd48a6d6a4581e0ef05b3cda656cfa6561fb34dd618d9a2fed5a35288ac4e836cfc0849aaab172996e2bbeae55f926bf5aeb53e61a7eb647105a45f4a59e5bbd69932498d7f591de95651a6cb2df92171c5ce79fcce5dd0395755ce5515a5dec118e39cdfcff5db40b8055111c2af2ccbb220f51574ee72cc4775eefb9d9d7039e7debbde2c60bf833e85b80509e9a0bab79e9fad8a824140fedd9ed56a29b7d551b0a5706d8fe9efbe6134d56d024254bfebce40bbbff703f900dea35b9024bd933c31ec49d9535a939794bf522e8d24e2be34a5dcf7aab7fabdf7ac4a7e6b926e41fd858afdcaff70ccb53663bbea25f5d7bfaf684c10eaff92f231f9cfb536a2b1b5d1ff687fd2ff70d288b2e893efc9f7de45a3655dd685fd7b89bdfc0bbb2e7959932b2f5c113ec692fee8b6a8d81ac4aaccbdbfe7ed780bda27d5b1200fe8d1981daa9701539b53d6f97483ef7e259b5dc3dcb39a4e3b5a6da253ed2ada50623ade27412415a64081f32fdc9093d930e5061ba64c994245198a309b4814634a94a2273332951f4e8878e89c191a334c9a58c14a9658c28449e688244a00111404910b14193272e44f3d44a3aae80c8d37e33343238b753722311a29f1c86c888da66d2c43b337efdfcb86ecde54ffaa4ce6f7c629f7af1ec2aa7a08a1105555bdab28d0fb585d533152d4a343a80a78edafa2c6632ad6bb9ac7f13a39be6dbe6f5ec7e77cbf0eaeb3e34fdfcf4e5c87c7f7ccf7ffd03934be6df87eb6c2756ef8c6791c7e5b2723263a87c9f52d2cdfdfcf4a48df1f0491ce8999f1fd454c2fdfcf47945efbfe1dd7a1e16ffcb6536d2831dfbfa73ee73d0eef71b2f51b6c6052dff3c8d66b4ed9fb1dd97a8d8e6cfdc6a6a8becf91bd9aacb2682a1b554d45bfa2d9ab68e62a4d4d4533af3515cdbadaa868c6d54645b3ad36aa8abe1723e3bde93dccfb97f72eef4bef5bdecafbf99ef47ef41e5ba2be975a0def46c6fc56566d8d95dd634fe28323d59ddb68eb03353e4699e7d79edfd4392ccf346672687ccc0c196f7afea0ce8179fe203ae7e5f989748ecbf35fa0734acf5fa4735a9e9f8748cf39d8f37392ce91cfcf4a748e92ce59a2756a9e713ce7787ea6a2756c5ee7e6f9398bd6d1f1fcac45ebec783e3df378b6e169a8e169fee43a379e9fc5c0f91b321b789c766851ddebc8a2babfb1c9f144758f23dbaea9c99678ee6396d978fa9babdacffc15b3e7aa8d6cf7c6ab16b3e64a5fccb6d2f73ed6f81f9e65349e7d666a7ce6ded5a0f16e8606cd76860c079339966c5b5b992423d561ee2f2594dca071f47d95358bc162b817247164458876958318dfd654c6916e953120fcae1d1389557714dc3b57a37f55b92a46d7ce05592f66e0c50c6a3b86190539d658198394af47155c4b93e31ebc98b2e2573e5af3ffb576d7da9dd622749c0f4c8923735556e62352191c1b22c039d968a5d6dc5fa6facb3c0d1164c2143b8b577befa17be820841fab2cd2854fb9ca1845290a0bc255aa542142ab5491b16492f11b48e0019994a06c0a23459c91fee1bf40e4f9a049a10411e6762e53305d5da2229c541eff812180e2032975575301142444a1ee6a0c04c2a008224ca9bb455c0e3298bcb952ed14f858c277776dea8241d39a7ba52a53d7d57d1be84efd21841042082124e21042082184d0db558109003a6086f7de8c6d29ea39f5d6ad7b085f0afd1b9f3b32a442bc9d4308e112572c7172dfe591127e7fb5a455e6fbcb7fbb7a5751d55315051d74571397955d56c38b0e59bb57662d459581a2a8a5a8cb515493c844094fba3b841066eb351ceb26c10748d4e524f8c0088edc63b32ef6dfee8cac0b48b93bd7986d441ababbbbbb3bcf24682e98ee636b49b8b62e8dbbbbbb3b84ee10d2cddd33ab5ebe4b51d4e371ef0922e0e08513ec7400070e9c73ce397feff97befb9f7de734fe4b914013a6a0849542a3a817a14b541e876976e4354f8c2d8ecbdef43c8dfcefda8907dd9ae55a9ccddf7b47302972684b10b21848f42081d84103e08217cd36177b7cbc8bdcb3b2798efdd7577777777777777b7c3f7811fde881f2a91f746e41061460c0070d182c44e0df6bdb714ba4377777777187d5d1320847067e77228d5da304bcd6be0c78ce65b8310767506c7a2be7feeeeefbd26a289805e58227777777777f7e7ee910b6d0376cf39f7de7bef3dcafdbdf7dc7befb95390bbbb2f9d3132ddc37defbdc7efbdf79c731415709a70c20b295fa8ce9707014ed8606fb66e0e014e44b1dad6a5d139f7de7bf03de7b6502308fedbd2777d77b730c217d5fdcbba9854dd2d8ce04575ed1e73a014a2b88216ea26e38476978cf9bcdf6ed4dd1b6e770a65ee5bdfdd5576b928e3d48433b7df7148aa7b9bd6e11e77842ab2a8aeba87e9004de738bad154f74d785c83288b0a0024b1eff1ab7e8bdd84e8358e82f0bdd9030080c1cc1468df5a66ff20957f7708a0a0dd2249752a64b748529f55798b24d51a1a23c6ddb7ef3d87b472ddb02174b169603b9d3132f7f9abe57177f7adf6c639ca84d94d805dc1c0c50823588e0080277294f02ef707d4f61d0184f0013528cb6aef08fa7d9f1f74f786fb4c90c38bb801b9afa10241ba158826ac3fd56dadf0424314891f2d7ad353fd91969ef83f5bcc53dd4ad565a5da52793052c1f71bf57e73741ba2ba878f36b1bf65a8fe9eb3fde7dc3f0a2ea93eba39964b8bec9bbcc6bf54c1b0c40d5a70832651becab6276643ce092430e0c00b76d063c4889b1efe232d3d6bc488ee897f24872339f4c42250f4c05fc4078fb187f84c8b685ee3fcdb166d183c308426b2c084194001093ddb2354022d76c0021660512485177ab607ebe1878692c427502873a3bb53197ccfb9211aabdb53da5275773fd56666767fceb95371ed6fc57c20dcbc1b7e437fa0bed89d147786d9faf4d30978850f74aa2d8329eaa58c873b58957a98b5142ad50b050a26b58754ef2ef7260e917bd35615c180ffa3fd67ebfcd91a9d0d96c706fe7e7c7fe80db398dea785ba587c59b8624581e2c75ac5f76cbf025e976e15b42c0b5a961094328c2b93574379059a7c1245a2e0e5a29c2699a7a120052908fd9fa3c2cc3e4398ebf5aeae64851f5d56b9d662aca5b97bf374b6678b3dfcbe9873412423d34fe3d75f9ebdf59b8cf3b137bdd3da26318815a92e8bc0109cbde9536bbdf5b43718638cf1cb42bd5cf68470ce3d06c41f2b86d10a787d9610ec1e6f14f0eae8c6557c1ac7d2478d003bcebcb708f8aefb215eddce85e37ed9f08d4d6b547bcf9b66bd2cc67aeef9fb8b2d20f7b15af19d56c0ab53211c1d42d5f8432e50fd51c06ba4db10aa3aeee18f738bb9f3424137e66341883106a18fa4abd8ca0a3669eaca73cef157224585c9fc8f997dc3fe1aad3c69f48bb1c0af22299b25d36b36a7571d633e71df7bfba6e937ea37ca44c15fac2bd0894617b82a692ab42074adb3e335d4471a6238b7e392ee44ea7b030e26b53987549c5e554d80e81a7f59a2b695e22b85e9f63f3878019173d8752d267db88a33e774109a88c4047142d5f12ca208233ce41c4e6b3e1a8d46110c8783838383f32d38d245530b9157f2b7a191c1c1c1c1c1c181634c7f598a31b556995dd57230b752d5a2727ce752cbc1e49fc1e5aecbdf6515a1e01ccbea318cdbca38be9551efee9a080ce2ef5cec29abd59326467a778519437aa14a2ada8773166545a393c70821e4ac4607c4e0810fa4d56940bbcea96bfcb3ba8db68695e25d742a3a15cdd36988ba6237ff2145ea56a402f97f7cd93992521425c1985ce5a4e846e4554f37e732e3eae2f290473a6b027ef8f7c0ab6cd3565c29d6d188f42c2bd91cd1ed874aa25b2565c68c5ea88ea65810ce69fa7552a94c085761469560a4ef3adc0321f54cc177155220561e9def3a4140b80e01bac69f8dfc18a6f9266f9fc2bbb243045871348b8a353505746e16616e9c458d7009957fdb25542084e0ba3cee5b8a6156bf757309a8fe55d956fdcfa942488770959fd3cf09088f5a3d0daad77bff7302c2e3e7541df5c3a33e1e3eeccd132130a9eeaff7b1bb3b06beff1e00d28e45d5bd93eade0a2b768879ef9c138208f5bb371580dfefdeb1036c42157075f726267e4ca443a81ab3215495098809a255d77bc3af39d7c2f52ea3dea37ef8fea3dc370f59a798c75080a5f8856acc5e966d3fc4df17aa0bfb0bc975315682bb13318a8270dff5c12d77abdd9216668daceaad1f7514cbb22ca7030fad13847c779f3edc7a77e992ade6ebbafe67eb45afcfae6cabde51bfd2df10945477515308e6660ac263f4c17dccbaf5148c44ca3a4aebe8e035eea109b887924ac938ec1d3f46e7d630f5ee7f38965efdf5b26dad005b1f95b5ea762a462925fde162be50ad9eb284aa457d95fdf0b832525735458463d3d6f0efbef76cf8606e349546eb1c7f589d1d379fdc09675880ad17a9aaacca5996f53f5bad17aa55067ff8e16252ee23459d09fa8b2a1d07a42ea21889a1c9139ab827851753a4e075d03dd9446cd1c48a1048e144144c9a90ac30656b5210e0064f54d2dbe0b7f78b07a67b20f894e3bf362a7655c93881e1ab029d379eb6c63f4e07ff475340bd756b1a436538a76ef8fefa213db5e6a7b803df37f838f0b4d339d4fb467dc469cde19f707ac7e1a975e64e89c69f094cde74fbf965bf6b6959c2ceba72737ace237657c6d51f9d83edddde5d24c6a8eba32e6b6077812ee6ee6e6e8153d42e45fd83d4eeeeee7b6a9fdad30fb819dba1a67604a255b737edfded5cf5dd9ba6314062dddf9c4b723173077eb876771970b9ef7a53223420a818638c314649c47d6946295d25ab18e57b822de61e95b39677bc8f3290ded0453937ae3c7f7b95e76ff0fd67fcf95785f98c649423497744671649dc95245995144711f391d708e37a657bc3ff4a416e4081165470248652643326991f04e89caff1fc06e81c1a3231336498605e5c585626698449eb73d8dce8d871e261c3d73c6b35ecd4221ea71d3a6e6c72e028b261e3060d8ebf81e3060e1c34343434fb1f6e23abf119cd22ab51e36bd06d6d33f7325d147d1145ca94520bcbca1ca346ab8186a222274c89416def214642345d912046619b20cc8d1fc2a20b0a0e4e10877063e7a44d1d3a27fb305a07c7778eb7f9c863748e8d191ad44636467d9f654c9485132d78e8810a2b4832336498983cd1c4072036ca0d3cd8880e9a6d6b37ef6ddee77861d4f785316266c830c1b83c6e521f0b1556e880280b275ad4f75a46c31431d80849c8465b27b8369e762a75aadcb25a4fecd951d3a4516bad7372acd697d69f63739e042b7e49ab0c7e843b2c4c0c61044be8ce7eba7067d73c84ba9eebe83719cb24abe5aa45379acafaaab2e4f5d45bd675991e6bb565684185296a7bcbf628581ea39b10fd8dc606cd6fa51bcf2bcf1fe976832e0d8d94ee3c977f59a9f4db3a3bd96fa7ff6da7c66f4be484c66ffb44e6a3ccf88da6f2c6f45b468ee9b708f39bacbcf234d33ca35b7cbacd1a7433cdd0eddfd3a09b26b31343b79d19190d4e947fc9c860fe257375c6cb9bfeb2301f13570cf3154c35c1d0971719abedf8bf645c97e956fa96bfdc1bf14bf62ab7bc4b36bfb4c2d292b9d6200b0dda297586d1441475ae4c48827ffdba4cf58c01a1de6399bfcc287ff8a0bbf3efcb8a6959d6b4acf7ed96bc27eb64eed419a277a8b40d7874b5648a6600008080001315000020100c888542b16830cb644d2f0f14800f7d9c4c7246184ba320c94120852164902106104208001980119ad10a14fad1fa56bbd981866f458e128b2201a27e4924ec2031abd33ac66414462e1cf1a8eb4efcd1ba71701f8d518ab94921149f003ecbc00e95f3420e18853f5626f7c15ec0ac0523f5ca092804b17069a63e764108324ac670c2c0d94ba39ba0aeda8620bca3465c411313e870501057df923da063511e7345541389f96ef8b7b306c8832efe9422e8e99ee93c134636ab82f184f0d84d779e3258232f94d3e490b66dab901eddf1f3485f332474a76eb4b2a8bd0afe896e4a5a8953c13c5f317be4abd18de2b2bdf7190f602922bd812e70d69f9da0904b42825397155edbae4074433c95bf1c3f7a6e79d06d069279f862b2954ed07edddd424eef160026328ade0b0df562a8aa8daea86b22ce90585dd6c389dc8becd724a4211044bfa11f3ad423c4553d73751e8b2a8840d91d63e5e6decc96504bbf304da82936458e3654ae8db1a339aa8b205e9d24b7cd289894dafe1818b206588e74264662a68b1992dbe8aa6cac4c91a8f824c817197ec328392d01b290f4271a3a3512f08b737d0ebeaaff2571c90be7627172a24eb27caa0934492fa0448dc8d79f59a0490d72715fe8b05e49a5f0c338af27a53d6d71502d42b0bf2a29082c7affc929f0788e523aef6f82c14a3b29023a26dd213b20e684b3a728643434c2cda1637841fa76c6818e282ae45f8ee18558cf0db700a931ac1479beb8f112746976aa9db26094e9d651a2663841f9be112720ef22867440489d1015920b931b7a86a72a42e4fac626507a34080e329203c46a205e104a18d0f547e2580e140e9bbfdb8baa15d457a784572a0e41e188f9f2c1fe36153296c29dfa269ce7fcbc9472ff8db096d3b3f60d8242a4a2e5b70c21a4b81f21c38a78db0adb1d345624a702229abedabdd7205b01fa74c3cb5206d2ed950fa416a9755024a9f643aa640ff076493777df999a46b403a762ea2c5e067c46264461cec21c99308662d2e1d34e334fa0d1817dcff75fe6af09662d39c21e8f22873fa4c96ec92bd887c0f2d119b305ddaff66096d16c57370d21a3dee6b6fe86c16647c4813c29294234e42baeb06a8596bdb1f887d103dcdf4217d2131cc83ed48e4e84b731a4d1538c1188ae38d9041ec5fa870a72e5cf237ee1e23dba905f04b7fd5f4149ad6a58b617c4dca0d7d703e79f0b4271b666cc4fd2739d336ff54933afab0effa5dbbd8ec7632147a5de23db4cd2ac0ea66cf223adfb544db13a802497dea009ed4fa75df45257aa251b13aa748c0bb51ca46be2b84d4fa713f270fb6d1888ee8d0bbb618a4adc630c74eb8c19e606296184e39ca4896f905fe026a8017e693a13a4f83f93dfb9113050a77a16e876d9cbc14639549babb4f3d11c03cd64ed017c7d5c31f60d308defd783ac466d6e423475d3fe665124f5af9c5bed9eac3abf871239f769c421f4d156965bb893edb2cdc19c8b45b986c2a64d64c7ddb2a1cc51511954141ba7d7761440fe8494c624750b45d7ae4505aee82b906dd615c820b90cb6bafdee33aa417f89118e2caf496ee9f9a371bda6a94c5b8a1285393c02b1f24286e35b9ef57560fc79e2498f46eb9fa9ed082ca96e78421b9103883a9da9ddda1bf6d25952a151b07d109f3c8cdd3fa51b4f91a48b47eae5bc6e9c8723140c5af6986eb5b411f57ad080628fbbb85a30a48b0b8f0b0b64ab84604c3c11bd1f924ea01bcd1afc8c6181c4b5cb71b8029c08b06c869336e1ff454fbf409c037d0fa648c3c78b580282ab5240d02319d8f5bffc83f989d9b3664f423cb05020b40a0bbcb5460afb1a03ce707fcc314b119089a7dafdf8848a707d0b4bc795160add5ed2c7024821573ef94b9892e1b2b11048f04723745f64f0a1906f2dcc105a55b10d442f65573edeb881cd00e419957ed13c0bb208a1bf7351f44e8d7bb2dc7be8fc5d3ca142c6af19f8b1aab4d6020d4c8131ba199da319dbc637234ff83effbc32a819940122a5c7eba3a792097b7b2598ea76f3d2dca8e52dba3a35ee1b729f103bf28a313459c40214208f5d5600a95151788d15e32980188860935bdf83fdc7a48e21ce9d95853488152500311a735be98e5772b93c94b39f4b19f6335c7b05791e2fad1efae29cf8d3e7816b4c0ce142efd3a0ac0f0697df406b70d9fd57e4117ec0419c911fc429944c6905769d4da419a96d486281cbf364f67d6c610ab91f30cbfe7114ef0caa665b8d88a9de854b855daeb5787c4b18c6fa58a88c571f89af19ad12257455d9aa20d7b0242a8f0488c4863bcc0d2de4bf98f2955fe7a4b525b9cae872db8eb614953033db1b35672e7fcba3bd6228e4a7a96f4aacd144dc79ad7d03a57dd3e11afddf1181f3448e927b38f6ba1ef833e345704877d787248644dd3efea3b91a61930fbf3355024921068a80c5dacec401131a8284b4b9f8108db6155ccd84d985f1c222cf5a3be888f701a6c52647b85eed10efc8987e9a549dca56ff2de30d049b698caff7f72f0ec9c4fa9ac9f4031248770296674e0446ee9cd98803a0f0c9c30e750576bfb0d780d95c5da88800e11852ebd5c8133a7eeac1a9e0e368ecf247a7674088dec3ef3365d1250c220871f4c8e83c2365c8b4a6fd4ec44f86b3cc3aad9c1f17814dcf5f40fa75a0f1150f9fb304cf7a4d7df88701fbeed51408fb7d97233a80f24c4b4a9ca90afd63905016530c1711f2fc01644a05b0a582189e5a00c177177eced80ecf92736712309360e7bf8acf6301831b3eb0c4489905b5d0f0ac3a5ec64444959ad78bfa282a46c81e2cf104458333bd59c13a51df71f895fe64568f06f20b00d049c01c39713a579b6b407dd524e3d02057e2c37e6d0d46bc64b8c7a39435b03a51247e9893c910908d5bdddaa2727ad93c3c0052a76b9688ba015c39dce72d0277b27bb2be1ea41ebb0c162ecf1fd276010787e1ab471e04829af4e5fd52495ed35226ed7afa3c6a446126639f716380523964b123e50023319ea5353092be4e3f35c209071993cb1c63a9328619828ee65bf1d40a62bb8e7c98c08e547c6793f4c484ae129ec16e5fb947eddab9bf7e6d86824a4b4dccf07dc5d7dd752d74592e3324940ee35c50af8c1203b736c36e3d30621f4578e315219f658b572ad9794c0d4b774aaf277b85e1215cfbb53c7b3254fafdc95c5370f03b9679cbf50961da3856828efc85d36a040398a9e14cdf9ac54ca4cf88e6458e2afefd2495ab632358bbf6d8f8114690723767b066d143b4af69604fe9be6a2a38ffd041c15835120d5f7a0bd8eacac66a792bded2e821f49f0a6fd834cf39df78f83436e763033988f0e73715fc8a9d964564375816223bb9ad40dc93dc65782396bac9a080aa79bd694b87b0a3510d0d9d983056eb604b13127143ccd4fe6893d0083aadfae3f2b4c1db313aa1f9c35921f291b85dbbf20b687170931f1e6c9ef491403b6f3876e80080248614227fd5ba2b979682caca8c105b7568cc48172bf0750da5b47f587e5459415af500215757290c35a886ff0c30553b1c6b6222bb048c59fb14c3611c57f7bf554d0423b27588c42db4bcb329e9664b08339d9bcea4327bba73610274ec7d5ac01e973a5bc731b4f99d1d68d625a32570e96689610a2a1999f8c58857c9287ac1801277267eb1817dc85ce9af0c04899173c380aff3b8148a68b5aa3dddb89839cd25daf5e2f2acb8610baf377c0a17fcb9ae66cbfdca2064392daa958554c91182f437496d4c461ed4e027940ca1ca73423d73b86aaa7641604fa59db30d152dedc32f75eda7307c548db35602d8cb987da1260107c27e114f28b6d81cac48cbefb16ed4f35f79ff012ac10a258babcf224a493c61772e9ba44e48548759311d7aac3ba9d11590c6cd1e3e937b953bd9fa518bce7372273cdd01b2d26df780ae3ddc41829d80bfbfc118bcbdaa973f6bd66649130f5f780462fec7cd7d40181a7ce9f211cf06766cdd6c4b40fba36f46ed6cd8379e06e620d22afa32376346c631d17ab4a301718cd0df9853748c3eab5982532db8e19c53d0e02f4f80a0a0cf63f538839ef7d4c95bef391b2e18fd115186ced4997d824e945f1ab872eeb2ed6d78ddf860b59079ca3ce65d99e437dfd4dd8fa91be7f1c0276ede95d04fb637fb7be2b30cc3fb0a6ded07e870e483f63d1c6feb305a9cbb0e3099ea0097f63e774c027649dddc57652dcb738dbacfa168a779aac61b1e693248a20c863399042e14b2fc588b26497a65dcaee8baa88492cb6b9931bda5e757fa2c6435c5a42dc9a2106f0323ab606d9fd7e4e4cd785b48abcee285996040a1fce653ff869501f096b7817c53e70b50f1929d230b4fa3e78579ec5c75cf83817d83cf0330cbca1d5572f8caaf734ba717dd53cbbc976b26165e84f8f06088f63abd0063b0f8c646f25bd5b9fe97e34d28cad9c3e0be483d4082c66c79c738824b5b85a3bbcf3aec145cf8f1a376fbb05fcd8f82ba8801a86928769bce645d74a35f6f6b26353172659fa002b24a7082e4a43655284a05ad290ac31a3aca04facd8904124f351a2565a5e98f392d8033ad0b2ee9c3c4f5a2c807f0111c2d42466ddb9e3e6ac591059a3310c43707cc0911817d4d469aaaee5e79f98804627c2ce50f24ca3e28128d3d4287cdb20d0df56c938f9caceb5a373e0eda53752edc2d9e9b8b4e710c91e7f314f60219567d9844fb44c700416758cd3f04115741d58faf8e582a120268cbed2e16338227056525d7f42d9b401e3bcb4513632ece9f4bf91f9a26680e2f7d0b5808599939e0b680f985d359f6c2d64d9a3b494ee7c438c0a1062bf302a584ebeed10dbf68cb81047dc0db3c6e9c97ca54627caeff5af806ff8a4d519103d1d688fc120de87fd3a0a4ffcd0b3cb8fc682db4cc7f8fce08107f8164a23aa67283669b5c1fbce799304e3b7535713384ad44cfd50cafe64e188ae912624edac41a42e7b3ee0e568c4dc89241c014b2b4b288dc81b7387bf125e4acfed3163eb5c4cabade16cf38a12b52e20d8ee0c97da3affcdd8dfa751951901dd66e89429683635eabd3f611167150a0aa75eedc13c4ba8f15d4929cd47313e848f965c4e4d247707e088b2fce185e52999edb92a7dae7d68b9fee96c0ef131410949308f70b54ae4e9d77fd1bbcdc818df89bf51397f172c75944ad03e829a9b1b8f4eb0c7d4ad2405c4316c5ef59d4edcdf775dae21138e37ca1ae9b7bca06285d91c5dc798908f1f98a46f076323b8e89eaaff2e0e0245d532ca536857e294275ff5182fb4f65b0acd9064c092df8ab427fb7769dbc7ef710dc676a2109be28c571e0ce093e383ce8f81927cdc95582a2505e68fc02970cdba85db9c6346aa89cdec7fa5e7c13147ceea7d336e4d967c5291bfc5a8bdbf4779b569337cb0ef4a708e208b94af32bed8cc5a6ace35803abe37815cb7671470d900ed43f97cc36c6b323497c9005651d116a3bdc5594e4df0f434fb3047ef5fb10f01c622e3e89fa9ad21cccf518a8422a63e96f0cc8b3b2f9a26326818c11543feb02b8d1b68d81fbf3439fca39bd8002f3a0a6f116b34fed348dd662e9c329209e88a87355da8c372c62d8de6f20f4b5bd5975b52c86e73828232ff12a3df6316ed9389b0221112d39dc1ae6ddd0ecea67e5d552044b179e3b774080f2c656a2d773c502f0679acd22a0a0c53e32dd1b2b7d53ee8578ce29da03e4aaa33210d0aab63d9fef4482b72bfa8ddcd0ad9206b45353dc4d6b23b1cf94fab1416d451d11aeae3e0e0443b06459e67067aa9ba89e29f6e038ec64d53d7b4da16bb9aa0954798391dbafe422e9b12c098452e62013bd94d3446b8a825f233344bd5232a3373979864c385cea976a8370a0664ab742bdb434df5d03b71c63d612ad4211ecf4e92276a8519f7b6e3f45ab3b595f86f02eed005b0a6f51f13d5f9fae62c0bd55fea8723524a5867576ebe359f640c489f620dc86f52c0073b15cd48fdb2fb4753ce0d8280a1e9df2702abd36535a5d3e64bc710c76674af053c8c913cab5d5c3925eac092a3c1d1f02880aa840300538d397ab81df8c40ddf6165673e6eaf453afe45e3f4bfec2be824a82041437110b449a6303ce26a728cc125b92bde701f4b76683886cf8b2203361d5661e121e28b2c49d036e9c276e21374cd0f4751d666d3445959dec82a5c8b90840715bb1e8e987ba8b39a41cb18b025c623b6e5921497f810036d15fdfb31bd65e4d77d996b2663d4d93bbb4781d12bf41802c182bda80bd7a4fed7889c5bb42643bb040a8e5967cfa2b5b81af1e66e730f6158b22a34807507416abe3f8fe83eed0687b0cebfb235e88714cbfeeba1330691d8d718dc1a0fcd85d9e5a429252926218935aedfb8c7420af19cfbe96db46cfd8f18410d678febd6f077ef53f06c9cf0b8e879fe31ec6371fd553d00cf9ecde0ddb312942bc17f7c5b02aa2d80e025850690a4aa3580c4985ead45db1e9f960c948b04e2c24a4b571206fa2ba50e2f7b1e527754b480f05c723f35618833af0ebd27bfe9d8d9694ba8551c24df09519b2b0a4f5f3dc20f1b7d90fb820bf4932f97091450b2ff95a408f49ee6f13238c39b66011a6cee79c34e8562325206c9df6f0bf41e4ca9755cd88aaaf2a65211e2aa2ef2df46e15ede9f012d478265cfd8e6851856c0c615837bfd46c0203c415fad5c1470bf6c71649fc2f2f76ca4e3714a4b8212e23953a7b22cbaa3907f9512bdcfc0a40388fa9415c81721b878847ecf3918135b14353883c07a9e9d83cad28912806a257af9f9502ac93f4a26fee42722804227016a908b79eb027794ec9c0016cb2671851f441092faec9087b8c854d0479b64497204e1ef0213d3e084b594e68cf3fadea5093461eb6b1cd403a682f6f6698c23bb6e0134ed2b8984c379a83516ea35db6af600515a0f469c4122995ba552c2d56a0c487b2860429d03ce0cee5ce640994bac0bb67f2cdae89005b8266af26623a7126fd07ed7044aa2924f04f2b9998972d37be4536e2a3e8c0165aec1af19d86a24de1972f319c785e662999b0177949a5f251638ab5ec9e44403bf6979a251f0f4c841ebcef802fd96253e4d3902ee7cde120e808b1bf53b1ca8a2f43a06225a676c3eaa1d8492173cb2ec4fb1e96b98db8de6b24ebeab5fec7d5e6e27766fc96915f3efd6babfd53059e132ed53b6a22490a766f29323ca7defd08b7074394bd8a8153ca137a97889aad249c4436f57ddb0956e93a0825ac7d781647bfaede3d268fe93bf8c5731e6ec2cd654556b9f83f8747cdf070ea36575989d1fbf179d59f3e6bb7bda7901ac0e1de95edb8c1a4492b19dddbb8afbfe0402bb641d06a6cd56a742cf386fad3bebcbf3c2f159a0bdefdecf527884900677f857d52624fade3620e40ef5b8ca156582b564dd6f6a930baaf6ccf2f063ac1bed73e82a903331eff62de889dbded5328756fa0bc4e8cb5e45caf06754efdb2aa28e119561a4262a3b3c49257bf892a8598f755899615f8152e2782b00e364498b51785caa725d05907f76b603b4f42766cdf04733d1583280a0196a16059ced668d16718be6b80a0a64718bca823c7d2cf0f244a28452270982c466478b6b0ec2edfcdaf9f442975f3aeb70814eed46e69002165ac530a4fc5334ae76e5b1dcbfe24c7ec0d25c6b3339de2ede2ae3c61b10089888c62ebac787564187c567f4307ad49e94b4bf655c7ff77aa2fd284ff71ec2f938c6fe1b6239e41e8da3f2aedcf5b222d8af6ad6cd303157364a7a84ad207ad11dfb10dfa34440bef00e6596a1383ca18357d74fcb94d21481c451107009e695109615c50e89800e0e58cd903409f8d094ebbfd1345ee1a95b825bd1aec9def48188ce788e8c523e15e199ddba6d2866cae3897624f729d25adc0bbb78491fd7c59b6854c883cbd021ab36e007094262b31d3b986c94a2dcc51345bba17acf89f60c069fb1f84b5dab38ea6335a8479eec4b9ebf72d8018fe8b3a5dc56a005e9d258a19274ad0d1b91ef9a18399d78097f5902a16ddc11f00601c8e909f7010094a952b60a81cefc404c901c473d618827e3b3232e386a79845cb324c0a74562fcdeab2718a87b56637215b2a829474d93911aad70fec7a61881efd0c2515d6e9ea56a1b593a2a973e089d4bc4703bb356e064bc7df10159efbe255395e44d619722632cf1964d9f245aca02284c6726332c049c2559d883250ed65c9329290931ad438acb05dcbb77cd477cb01b9b3fdffe56134608b5755094a54685e1ce8928b3d27e1b47ce62e656149dd7b1ffe6e1d73ab499b90353ff6ea0606508bba041964cc5818c0589abf987fa2269e60ddb1dca315819347fdeced3a187e94cf23aca7ba5ce56f3d0f0beb0141ce6de6a70dcfdb7518f99c8dce892ad0533d06e4c6494f0264e01278d1e62b2caa12bb3c586c906d264062a81a98ddf62bba808fd7c1ea193c475c6258b40c695888e3da9d837585c12f96688629051d1728c82b5927152a51255b8af5c6b023323b9a5154d882e5a587451304151c49b4e1d4a1a0b108f5079d31d8e2f120a9aa63f80e25d350679eda738dd7c5282e26a95d482146f75dbaf30d36ecfc7054d58dbc89668cc2ff5b61d66e09925a8923b5f541f762f266eb7b1dcc83a11c06a2fce5b74f881dfd0b83889cf07a120f5c6d7cf35ce926410f8c044fbed5b1e080d78c222a9c96d9101fb1770e9e873031337ae1722b17f78b50a46651671dc862cbc670941b7fb97c5af726326514f634d8638bf0a30c245f1ddf0586befa70eaac6838918d2f77ccc61389d917cff7edda8b37dd130a005fdb2d94a375c863b4a28d959c7626a98d4c53a30c6a8ec4a681f01ab654c20fc24fe4c2505d42c69045fd59f637867f4e12559b6f4833ba9ba894ef70b5fa9f10e7c1077d0a8ed1e8d3a7cd079655743140d65f21863d97e99a4cf9cbc49c93da7a769c640ea2dc848113229acb73fcd10c92d55cc8e69fc265dbff7cf3df3ad7b0177a214bb59ef14da239d7fe41761112fc2b233e143234b374a04fd0374da6821b161d8f00b530a75fa438d2e8008ae1b195be38fbe695ab4ad1774e2802fd2610aae3882598ff134a2ba46c3b144d1e5bd760b939da1cc084cecef2f8fb469120613260423e7e81e90b9b96dff71096c6ddd84e903f33e97cd101c0ab2e82b9c891f92104bc959f6e2ead9648e14d773085015bb6a4aabf27ff410ace8bec6f79921838a74d9bcb9997d1cbd3f2fca8679b34a85a46da2d62e5b5e23d67922caff5c4ec704a21978d48361f0620075eb49f9c6f9152ef99eae2184d6b7c48c01c2ce7b21a9a044df0cba63472739e8296f92841cac4d3a544310b5f220904138e354d6c5618c47249cdf88a4d9d88d8ae856292fa06eb32e757e34871fe8d7a01b8485fdf8bb8b611299b9c8410e685dc25a6ab3f84d1108efb078d825e66414cec872071f133fb66157bf3ae9ba5c45eecdf78319850080677abfda0eb17be881fcf57f0c4b60aa0527a51ae45353c4d24ee2ae36ce401b971a220dd71840366d9a63ec7179a0a1c27010bf8ebd0449056e43a49986523edc242d59ab2f37e462ca1cb60d9e47409f56d49547ba469bdcc5f80b6b01131fed09a81ae1c154d19dcaff059d3a1cdaa2f4af1704b5c6c28dafc967c007211ac6e6cd8f20d94230728a9a0d082223abf71ace6efba83f26324210428f1017ce3026eeefba047a3dd1ba7f66f4457b39000137424c2b1cc204d255b5bfd60506708e677a22a0075942ca5417ed7f32b0df349af8c8bbbe05bf78e403dc595318420f13d3624650643547d4108ab5bf0bb12d02cde122cbb783a669acd749d440294b6efbd643b800f39fb0a099b1ec06495fe12add56f13b0948a8ad0ab9b6818ae6262490a2298b51ad56c9d67e9a6ce14e6b6b631d80b1c419038c30edfb91a37f44c9173b5904c20c05f34d45da661f9e7d398c8e87c0fc5e078f0c916bac00a99db21ca5b1acf3a05d70112b4e4301644ad22cad96f9ac6db9e150d804a43dd20a483b3225a81857bf1d394c66e9444c508a994b2246b4bfd10979ae6fd9a3293f5f3776ab48638cdf24844ad68d92db401d4403393841d879b85dccd26857d03c349c58c2706c4d725c8d6ab8c4ae540fa43c48f9d233a92bca21444249f6577849ec6918f61fce9eadb3baaad41e9b0ce11023353b12a9eeb67f89aaf85366cdfe48923a985c2f1788ccbb5b40cddd1b8e8273bac335c243c6516377455a85430b3abc67cf09468419d5886d433526644b5b51c0921182a6f564d22778fa5d4738aa4856f673b8edb28d51d55d8df90f7f9bba2db016942e26e974f2b7344f849c5d1f8f634299c90ed1fba2f5487bdb59fe3548b9ac736418c23bde28fcdd89b1055d9d8a9e6d2e41439a2982c50b9052d374dacd7d02f00f05cf865f600a0557a20c195edbf7d1835d5708a02225c24c414d7625521d933ffcec5e9ea3597c74d301472181d16b28b8feeed5d46c81819fe55fd2797d6536a5373ef85f4301cac87cbed986d091ea44822bc6d68bb59e7d9201685ef9729c981f0d2312366445be9f2d00329ee8d0c7a50497c9d1989fc79b55417689e7fcd982512eea92b9ec89374dab03d60a8cbd3a5e1d59d4c371374f3bd232a45ad7ce69a4d1bcecfb81ff471d3413b95cdc9eeac65f192d35a2a459f03cdc1aaaeb344a24c528927c61eba72e65de669b713a9c12523a5a4c816c63b54ba26922a81cc364da9060afd9fc68f8ef1586f5c438054581317161bf7688d9612c3a32e7b4efc95c79959aa38cb34b1c42da8e7f218b05032ab917126a7f42287805d8c080fa5484531d99ecbbefbfbd60757a71b01152b4d2c18a7c17b2eb0eda71288f58dc06115134b68fc66e8f0ec5518a8232517ac08180dc8b811311e7e90050119eb6e4d8bd2712350f05afe9aad6f6ebfd597e3e0daef6fea5523e76cbb4443d2079bc493e59da28e9dbc0c0a22df7a036b9bf9e38b36f129e622daa517fb70873ef15feba4564883620a2225017ba148ef291b1672e1ac40e1ce68be93dc40523b4a678ffb0249635ae644bdc1e18bd5a82c58834ee1f0a1adef9a566d4f325a7f9958544648aa966f42c474829b3c7f784319a32dc9c150c3ebddf06a4e19b65c990f9256269399009dd2287a5b16ddca9bf0806516bba8fd7902351f50e3758f65d974fd7867fd35c094e213e7652df4866785581347ef31288d07bb9b6c1f35f84e783e0bf23e00cd6e812d889a52b1f8d166b1efc1d2841841729b6ea8faa973ca1b0e23d5dff99c1569db84b962fe7bd9966bb7a37c3ac7ae8dea75afed7d1db64d6239c1dc6bd14bb4f8e9d1a80ed2cbd73ba60263f343a31a137a5f51f9bb84542c67d2e1fbf6244beccdb60ca0d5ed96dd056d063d99dad0e0083057b47e34563c475ab6723b2e4771685c435dd79b854093aa965b326256509099b4a50e17a7300a2a4fb2e5aab0803183d6a975a208b0db63e0d029da0853950ccc2b5f22b55a885ef670041fd46a5cbdb2775861952c9ab5aea9fb4dc49a700e62a23763715b240da37847c1613c22626f1114c9c09162f206c963885db1e7386128da361cb807409633adc0a3472e960d77b31135bd58e6bb79df9cbf09906b40a9a94388c02b379a3054d40a5cae2ca4ff62ff0e5663718cebf43e4aad1a05b9546769dbfa66a1cd14ea40811917d83f955e936a07df860d691389937b7a6f22ad4acec8f68ce3f93e2b73eafbae349182957e07f3a9217986ef1154998c4ff5a08a65f58ce82a21449ec10fe9824841dde7c322fc624bb44063626e8c174a69174a239366512397a15f1612e6106372b710162e9f2ece90b424ab55d9d0291aab84a0b278f48046a7571a8233bf084520604d9e3fbf73576c1c623e450a637a0da526d087fd8e341b19c5f17913040d1bc522d961aac1a5f83522247249f936e779cfc4ea8094737926a3d27b411b81a21fa25104fd7c9a0b819ebb0d9a4975d5137acb7602fa7df98e6fc25120f50f8eaf13d2cb8120ec3d194d12ff90d2f9f32eba13214af7caba4d966bac6279a34b3273649b7fb3b59b258e96187c457343577a1da0226869578bd1a707a2357bdd8bf9311fe194cbc4fc1f7b43ed7f0a5ce8949f1c1fb3fb98a59b76c0f28ec4709268fd315917fecfe81edcee9784d052ca92b8b91403262a1001262c14649b165a9878a0b56d7269e267619675c75d887000e43ec98dbbe9a283e20916aaa322582b3e827f0a273c0cfe39ce2a954245cd89e736ecda556b9bd4122b29ef8ae4c0bf475cbe047c30ac3bad92c4bfe7fbf1889c66a6372a4c85b5340aa4d4015a6eff46eac0e381262356165cc1658115178392c8733932c935a64766c02c96f460dadedcf4de40484e3dd04381797d479ecbfbf5fe7372f089fe72f62c5cb06deae11fa58d7e49a0ba6da44122d5f657e6036f8b90f3d742b4cf2f53c74d935c91be2e775da1e523623299e12e6d1422814fcf7381fda7a491a312af3b71e8df270190c57237b1f60110bd2d3a93e206f80ac4f3bb3262c2e2200a8c9107233849501e8166382a23f535c68ae45a75524965e93e18517a24f7aa9eeb862d91848588cfbf6ae9964817f4fc387a28e9ba97c2c3a89acf5b3acda1eff55052587e7075333996d6d27167e9b217a44fc27f3792b53ecacbf1b2ecd5cc709186dc684d5bb1373b722cfd4dae6fdeacd989bf9265a8c0afe9d4d70c733c3cc63f7dc6b9a43e2cb30a970d373855921c38a0deebad6a5c4183589030eab8291ec7cfcc611885288a3456ed852ea0ca6f41c9b0f783510c9fdb694a652e0d8c7121d22aa54cf0c898f11dfda7c3b3bd597ec2a7e64d3ec3eb295a9731d60f877e76fb8f7ad5932e1fac0ed40ab0b8c841d98676f132b1060563ab0f347188137b61efd0cb3c8affa967e45d72e3a5375af69bdcf47d6b33e737b3570b7285c7d71f566b179e7397b7e76ed55f8652923d2dbfb54d10022c8ba3c739ef0f0321c17e4349c269612a9911f0f0e63df4f7e12fc116d4e0ea30737885075ee67ce7ca213859a26ce340c9ecc5d29afe6a18c837a101248cc7d9e9e8fc715cb62f8ee897cf798d6991f5aa91c5e0fcbb235c71a7a8189f7c5b4e625d0bae3fd045d3c0c75491aa088e0f4b8f3c6580fbd87f4753a6c786acfc2f06dd30c885bd8390862a8f039ef7a8b5f1fe04dced71a0cc3bf2152990125c591ddeb5369ab0a5cfa1c2b616b35b3215956ecb6e3a67b17236e925b19ceabd766a01cb63496b7bb94a7b03c47c5c6f1cb2d6ed510b6dd38aac1bbab11a817d4fb0e562dbe59073c9b95357837bf1a602ae4efdcfc197d5a6adf8ab9f602aee1d1a74808f2207e915c58f5567f348b8da1df31cab9083998f6ed8dd868b08b6c5b9fb44940b06aa2f087f2431d2c858df3e7f88235c16a605f86fc8fb70692fd4c447a03864c676b3104624283d2ca564b77dbd396dd03dd633666ebae392c0ecf915f2bc6d8cbb1e74797227a8bdea184f2c9294e75e46b1fffae067c0f342f114ef56ed05828280723f35457b9da5f8af317bc92208e5db2a155a44b06e888540a82833283c1d3928b453d8836213e498a2ffb924ab9052405847ae2da9dbbc9153c2f466a840050d674a3d414fa385d766ae7c85f7fd9f670f2a403129c9252355693bebdf038848ae461fb1516ae898f67f7725f5089dc92ca33fa1be3323894479735ae8740007d07f8506b334aed1e9df2661825dc867b11cfa449b297a09206d913aaa05c34e7e4c52c7307116f5122b18208b500c0b66ad88407eb5f65928a196502b3251527bdeca449049e03f945c7b1b088114a07f009ee5bc62735fe9380c2c1d1caa85a113972f731b07ce59e7cb5a072e81b92d63d3de661a0690cfa92e03eb3642ed47c0ff1c0cc699f0ca9a57a0dfc4d71a3c2f7f1c0d543d9435b0405f7baafb41db039b85e3600a7f9b5bd566a438c6c8496c6761f2ac6d3b0e90aa67d0462b30b320a2decea7195974c887ed361b6fe0bd971ba40a756f93dc562cadc309978236118e78264145b2e12b01516a515de867d97dc64bb1ebe1875352586bed89fb5c4340fd40a8053013b8888ae314f1de70539b5b10b729252db97804ab65b44a6820042caecb7a6e5a9da57eed0c4c47064c8ee8f5b4c2b8eae86122430e0077895b5b92eb91320e01aa1c836862218a52622681f694e906764858fde96b2502f4786442d467a240f24147212d34f2491a26e8f4cc47228caafe3e8a19c02e702a26fcd0a2d4a604e6ae4131b19c9ac10c48a49dc6864aa0f0d2617f87cddbc5fb46be74909e8c6c88073e9ff159cb7abea4a98fcad2f2070811e56d64056e6cb435864a23bdba2c204581078a064f3c11a57cf4a487fb930061117ce21e8734f93c8ecf22de2058fc29421f91034e868b92c318f73fa05f0092a9a956775227483744a70c0d12f6e96f0347f7e827cb2abd18c2a2a636a060d26e05c17f6c95650a9100033354f2d0e0b7ca5bbf69ae49f59cba5e89953011c2fdead0dc34dd0b2bb783742cf614ed21752ef28221917c82bc2a8fab6e6fe92548a2e2c3ad7c2612545e470b3ed069742694841c9b7f924da56b53ef5e6974a5a2ae166fc26c9ed60609ae5486c2f33c93296855fbc1032f193f89146765836bf3316b875000e6f7b90e31c7118075efd474fe63a109eb884bcdb5a3c608940b0ddd7585dc8e695b1e423ccd288e92bd23db979ab6e801ad3f6a6a6e8ff41276b57b20add9ce398b64e8b001eef29e41f617711cf797978097de93c3b99d89d3a7c1dcecb09e493412792745f98d95a9dbfdf0969b598434465b01ad010ce990ae810390b26e12acc15e514860a044cf4fa1dc88aef4b69020e0fc7b4aeae1a7075853e2e8ebcf5e423ac175bcbb511c241e93bd44c752e81856efeaa0a84b6c6f212c70ca83d767d54deb2761e6fbf6a17390433f3295f78725d2fb34fc71b9d223657b582c996e4eddd949ccf449ae172191dbba7ca779867be1aaee8b68fbcd078fba7c1b5acaa9a4f49e6f2b8089ca0babb2534491535a8f4deae21fc436ae6418fb8209e93984882dcd1c0e5954bbb5a5a41468ecd129b8177b7e734e9b28e781f5395d093c95fcd66f5b31b80e956de3b0973e5c26c0b47711014f0fc3fcbd656ac4aa095e4cfae5deae18f478f6b5ba392b9fa4075872404bda82ec536cfdc135151b8dae70429a76eb26d86a99e003b8ffe0fe742aa19c00c507be9a8482c459b417d3bbfe54987e7ae21534c8751905705c8812092579174de404e7d68894e42f008a06bf534aac0acd60e19f5840f0948fafe2689ba7b6dd108170748e74d84e0c61f90aca589a5f6070344806f91595b0586b38827375d6b78761cee97352871c891f5dc1f26e50b9482174e1b19fc4af616922ceae4929a36eefa372ecf9b3b18234b9a5bc1bf426033aa3c6385f4df13e553282b287ada2ff37e4bb242aee278374605adf267da07fa5b891ea8174ba509f7dc761c06fa2332117fe3f330253533d2a538a9cbf884eb45a85a1266d80445baaeb5a65a41a38cd0952a07fbc3df6d0866e78fb7d1c92635f9c025192b68b52d3746261540558765576a5a5d2e58c4e1d377b9cc24afa3f12b21e5f72c8d4fa6826890e9b211831609076f100d25812e617bc86f09b3018e470b2613137bb037b563dfdb73f9f4ab353d5903fea44b219cae45c6518a4ca0d005bf2603f8489eceaa7ebd3970ca117295474d0ba4ca96d0fb3c419ad7b8f79ff2ebe4615c2fd12db2286051d1220c882f32fbe69a93113f9c5c1fbeaa8323e6dfff56541269908a92e6aad30a7a68bdf2156ff617cf28a8975db9ea38c727e02088157743384942809dcc3198568936ecbaa6d41349ffa82ff4c92892376f9d4eb078a06a8563165531842902c80664eb18c5dbe03408df9d6fbcca542d5785464c6e09f9eb8deb90298a729ffb4b4deb75368fb5631ca7bbd44a1f9d01ea28bf2eb4436215a5e342340f8a2b8d75bf441bae687af1d0f0ca6413eb2dd4cd2b5fe8ed081d01bd7100656499b814948e8d1dd84621df2adbced95cf772d5fe3e268a646cc515c94d988159bb2a14ef7478c9bb299e19b528810e8a1e89e4b2e462a69102aa9e4af40d56eab7190b7c1c81bbb1b7ce001407dcb027085cc544af3dd07f129c69663ef056b4f4c10273438dfa416d4d984e97e9f8fab163feb593871599e4a71f87753cad87630dc25a544d5ce17174691028b4b31a7fdece071599e544c195984b491d245b40ff3e56c462401780359354f5872faaef92cd7189662554f7b5dde7ecfa72578a0d1008b6dbc9588e0e475b02add4eab9ce99bde177f267e4d777a8e0f163bf7068fbf9c9522d9892a2b59ada6733e40b99ec8438f22dc70b66a558a48d099de454f580bddc0659164186bd0facb004938052386ce544fba7dda6b51c5d7bc9f77a78cb19aea9dd6232ffe50a10ff83422238c0a929babc34f1264f8cb60bc8e272939cda742b864dc68d893860b833cb841515d3101885cae489290c007d0781055b8b483f9fd63ae76e896c84cde4a42dfe6429d55be6935f57318ef171123aa5c57728c35a0168ac055b02ea8ecbfa9ebf235304c3e8390dbf8082dba4d5257f8b9c942a92f389af5bc7ebad5df5f6bfbc9060eefd3f8b9b210a22db2fbf635e44f346b00b2650f5f82035957344fee37b1788dd01c015ae384db141efc6b6a42c02e2145c6beb2b49e583fb0a2d2c46ec1063cd40fb97d2d211d14cb1cfb43324255e76c619ce823c145b0bbb40eb59c1589e606272f249dc5d1e265bbfd850b45b5a8696306db48fcba85588c90b057d7f5ef90761325c12d185e73de713294c9aed27c32f8502e04dce028d6bb5de37033022c9b301ffa8b58faafb2c72d774e8a33abeb280e12a230dcea2c3a3df2e797dc4cf9d46ecaceb9b016a518bfbb273a85f3e03d43d0cd0b832b9505e01bd83fe10a484cf29803b0cdadc1ef1a6b302efd689e76deea1260bde0a084110f5dc62c3ad659ba9ff2655a876b2f307137b581ff4ea1e031e839247f2f169afa6e8888108867df91464ec1eec619d6b184724daa15c298e7ddded6b4a72309ba045298f76831a79fc8566fdad1a42ac9c6915fddaab054fcc6379c45a3d6e04c54c71f8b0a2cc3dbd0c49f67ddb50fb64eac0c02e3280b71d92c97e28b78ba949b78c891cd1000528a55c6c40e8def5283e1c4a2319edf7fb48401c979688128c21a4ab92cbbd358c7c4f03d2e5428a1f7b92a3370425e012b564766e5736f6f83980a82fbc6c1d2f30ff21038d2dc68ce9a8cd27e454e19e65448b3415b1365723507610c2e6590c7cbebe28a6934822af3a2510a5282692f1adb13df218b74eaf53761ebe298e8dbfae2a5608e30d14bb0a5db85e8c8bb2ec8a392b63f471f9f3b260f9cfa9b4de72d297707fddff39bbd64802f1a9463378cf3aa1c43018b4e5673d616e193f41558f36cbec8a76d3d441794c83ce41207b52ce9688fd74ad721721c396f44e556fb5f2abbab5d3eb8fa812480be6f008f36474253702b96212281384b412c2db53c5abad1e7920e3e2374ebf0d621214be37cd400009778afc473808d3c572faa2fa27478589a56c2dcadff217c64d56c91578d7ee50fba7cac50d403023bd075176d12175a44bd794addc255faf93b1558665fa82047c23d8f26f2eaa06d148ede00ddc801189e9e441e1603ef86f33f369a124b7e4a7da5ce33f795ae56c5daaf76090815e71958ba124e90faecdbf483830d304bda7710e983f3662402ec233f5971e2a227395db9db4c9ed3cc7d26f1a88054661b1f2b18e33f6bb7715afb0b0fdc09dcb94f0a26b917804f243839e60e2e93c04cde48ff9d9ff6651b869cfbcd71ada95303a2999e2d4520e921210b647302cdb110a73004f237637889aaadfd1b75d27f84be60a74a20aa2c5765191ffa4118fc0996bf45de68b81b7279c9f98a77d65dd1ce376b06582d677741df34688752ba1e740e2167b2e103732068c7e757c8c3ab74dacdf1c5a8d14274f2f183897a2003735d58f4f3c5a9ac378d5bb827de772a29bfd8a8c3ceafc07235683737a15a4fe155547c545a9f0caff33afaf0ce22b11bc66b5eaa1f4202ce7b6ee5c265af107bde211ad19fc8bfc62f5ecef8bab512f90927c5472d53e146b5ca168559115d0a96b6518fa04bdb5c1d300b31864646a7d339d20251dd19f06d71450bc4f97e1d580bd61395853d2c70227b29ac866e9e102deb1887b752ee2e02e530f6cfa64e6acb022aa706e811157f09392968cd94108c303b48f12b234717e564b1f64392cbb5d13c53fbbeab66f589b73f0331c9d3758a15f0d333ebfd34b6ddb6563166c3e6d536e3d5dca28367f443488764c72720afdb1775e6359122588dcc74badce44d0b497962d584cc7ac1b5541601abc3a633b88bd6decb237d08eaf3b570f32227c012aa2af9de8d8e3a0fad80d170843a9173d64021520eb62653ec98e45521ebc459f34f9758306f001c99fddee2613474ec66e0ad29b4e196a65d08407eceaf3cab23b21da8456280b5b108c7baa6dbc2ec2338e4b22b910186f87a52773c9524503f0028e9e388aacdec32ef52c99127052c89bd0b2ca42191570b9a7950bf07f09f9322521f4f80e1fdb76cb8e33514afbfdb58c6659fc3f3365da1bbaabb8a3add91b51256360e590ba0c097ac8967555698d90c557bd4cf20b065ada710d849820dfaa85c4a4df3e51f0e8cd2d37ef147e6f9bd05a521a0e8bf2a4a474ccbf8ee6f5b39b35305fd377aaae56fc38e97ffd07b47a3057039a13080e33ce1a5c408b2c6cc016df3dc7730e72e08998b0d23b4781f86ef986a436f6b1f06c18dc980077e215813e3eebe1a606707adff287f9567001ff517e1c1ff64c0ce57daaf765813dd1f5ecc9bb482cdc81ba0db1aacb09c07fb47e485082d555b8a41e1eaedcdc29995140f469117148eb144798cc2aff7ccb515bafe7b7cf511155ef320bd6b9646fa0dd69ed99a4d143275aec6177240f2500ef360d97a6fa9442772019aeea89287c785014015aa9f31faa232aaa56200b39968c501d86defdfad1777dd86bba5c8d26ad8f2442cfabf41438366dbea6a99d8bc260dffb143e63789211688e824dd67383f191d06b84320e40c7d7da8bb8020a9f26e002d832657a09f21497062866275b42ee5e3c2f5258283a1382d4e96795a8512a10758b3ed3c3ec8b3bf71199fc703103f8c4e7ca6026905352c53698e075951ba0b051e6c5fc55fe293c2a8335dfcf4dd26167f05efca6bdfe4ead8cb5abf71c92019c35dc7749f1e3eb000199f427c563f34d5f07af31e7eaf9f709b941e68a81bb1ef45c340197353ecb08cdefe4b026dee8f3500bdf51ec3b665b987d313bd0420fb7132a48591a0e6e345e2005385c40417589d00251e108e0f8e3d49fbe6c8748c12cab56084e9affbb1e38b18de8cf0805c0c480dc9d68c443271364142312d9afd560ec91a20b8c60b72f8f25237af0f3fda6472d1bae0f35a34015c0c85564c5abbe9768637a90f2ec8abc241f7e83da43694945b1dcb74e771ea1a34e19105cf888cda083e303ff47bf4927cc1d2585db56c5ca28c993e6d63e7411299dcb8258416cbf06bb73b69740929c9f80a1559ca1929bb184ab543627395e88764f9810c979f142e8e8eb75df2324e750677c7bf66f9f6dbc00068d4a7f3a4abba99d2cd8ece8ac03964b5cd33af2479f22b166db5cc4d7d8ef1db713da7c3c5ec3f85d9264c038df4390eeeda01ba2ac96e9dd48ed6fdbedf8831bc8594682d7d7728e2ded1990c26016bc90fe1bd4632dc83d6241ac4e43dbe8c0868180307ee1029dfbbeb268d5db8800c8661904e41910d44fdd932cd34cef7ba71151231954a3a14d23f89dfd46f9b3d040d191113dd98967a94f74cf11c52101a3dc19bd48cff7691172bcb9c1abc8ed391945cba9cfcfae7b68bc88ee06050bbf2750bf21bd26dfda9dee5fe2ca4c816f38553cfac6baae3a9750bdfa91ac45f09abe09779843daa68751839426ac12249bc77a59991fa31c42fd651b465c68a1ae0487e7ff2cda47317cfdc8535159025e00cb4aa371dfad27f316ac69575593968e1ee09bfe1a7d91c951654510bd8de327d6de6dc9e85cbfac717cb8573b61f30792e330b656751dd4a34c2465487cb5624bbce997274f8ab37109ae19c94b147fefdeff570cb84d056e31cd6229c0d6eec21324daa414d0e3ccfeb681545adb7d8cea76473854ac6e43e859daa5aca38d6d6d448ed34a1d1d33f9488798d236c99b45a92b5bcff8aa0a793138e510afc2de505c235fb78050686029d8432e306c1d20a7fcbba745584b4b750103b41e51a362a1cdae213ba7b2927857e028899e7a4ad7bb2d6f488b509a0baa337bc72ec3bd1a6a3e9548d7024237389ce731f86d60789bfe42e2c768e200014f6987646f91a8da4674c5a820f2e957d129011de46b4db5bff11a6b5e7f3cea690b3df3be4fd4cb64dd42999ad63081ee56c52932855c9550ea14a01f257a2a4135ee2d292004e429d4a2e1bbcfb79d74f28634552558b2d6b64032ba72a3f3e1ad6642b7f86673a93141a10a61984626c433808127a5f6e94e9a7bfc7176f9ca93dbebfbc97cb54a20be85df48201277691322a4fb1f505655e5f6a98f419718513b5fffc9bb751b19f3e491314b2b20acf8dfc4cf887bafe1d98e958e3249a3296b0607b4c18df581acbb6e533fb240951caf445256bcf228d38b866a5abeceb4449c0f89c42d30f91695ad583cf567ab1ee8026e2e887dbd859b4e68534f21884976f50c1b1f6a8e6e3e73794987bb94b37058f8884977ab8d31928e838f187f556d8b0814e0f774d38428d448ce08b80d9e2fbc218da85f5bb7b196b3a148794d3891678df110a23c2831b5e15af8545349c4f8b6784fd90979c52dcbff8a447423f028bacf3e1eb89e1bd0433bbb3b74e0f96084c004985e3081dd715e0197bed99dbd2765ea3b0def9868a8628249c617ba7b8c09d6e47e46613fb91b30d984a4e51d5dc8854dce2cb1cc6bac49a891a5ed50b12e1cd373205e1e86279ba1256baf88dc73f8683458ded6bb8eb30c8625aca05bce9d0f5e53f83e669f57317e7d5259dbb8ac65ff74d10f5be1096365f5f775addd1f4af34a93a399d6780eea865e71f0b4324ae06ad0106245534165b1cc96430c501bdcccc050a42d1a1f18c58dc352962e496f7fe7dccca4258a577ffdbb457284a8db2d938ea7c347254ee4ca1471148ccce62b553014087de9836c3b0cad93e98bd0fc2f55053ac565cd749ba42df705c0551bacf2c3bbb843d6cc3898622e22ca17f773b9d4a686f49a3547b83dcd307c974c1e41f9b8c07511a0541b4699c4609f759d1789f6d0e839b43b56826766d491ea4a2fb763a69e5761a9de68ada691c4060a046888bb6bff6f49cb2ae2994d615db33a05164dda12754bcde5d46fae088f505d9a80768a37441285ee2d4d2d7e1996038c70bd64120a5604df244023331504184624e81472696c2c03924fa90482a81e618f7cc28b7ed747f3786efcbc14a43b0a02f230131a72b994e849b5345be4a6f2948c9102892857c96101138733596a71ef71aafdbba3e76d53d72bbc4616226cf03c8ce5f9e0b791804993328adab13e865053a3005169c12a83141b144fe0c459ed00dcffb28a20025698d4c22bbd8cf4b1dd01722cd3f6b5de7b67dc9e90df45ae6dee7736babc264de0d09d8c199e755e343d8c291b03fd54e5b3d4ba0329ab4d7b92981e8f2706e79eb1500d974f1896065e186e240de1b16c90774c490edde28ce3052a621e4458471b363b947cf0fa1ad839b9f455ca3ced4f67ca621ef5a14a94a31281125095762303ca80169782b66c034439849e9d31aeacf18cf589225842210ec944924003dd5b06f068a942c6c696824d9e20e311991534c1d33ee03bc6382256a107c0aee487e40edcafb40d4424362c4344e97ee47c30c3ea65305abb894ddde840c41375b49e7c64cb5617da443fc5e5a9c37cbc34c353c7aaf08ab1f2783a6d89c5882aa189b96ba9e721776a41f00b23b6659ed4d71da9816f139f4c29bbe54b5d16a83c2d8695ee5d935c8909d8c4fbbec7d7ae95dfea4b8c98d7be5ea29135a0520b397d3bb4947873fdac0a3c262f67486230facac7b2fb1b0b0a794601e10ab952c5af20be573f9b426008d990bc5c3847c904a0fb8e31f42ecec6bbc49c43d1628f777a38703bc8a4442c50cb0443e431e5f11ac99f52c740a6db989926f367e2a830f67e6f95afffa84c866c4a36c841165f6da09ea22da7f8e9078867fc8452fe60d3d147284cec1632d290ea6bf296314e56ea03f8f869918c16dd93e0b8112680c0545d4080a45b0f11a9d64b24265f933a0e417fe349d48031a2a772afb2b18dc15279441ce198ae8297e96d4fb108156090450030854be0fa9de02247a36fb213a20800dd7ddb889b0559347d7091c339185bd6d363f77912da2061643bbf58148c0402b06b70634204c9d84d6f1975f35c1d0e3cac6dcb254f816a5f81644d71fe8c31133c749162de8405c01d999191078a1bbf6d489bce085540863f6e16827289960f1817f5897abe46c19d4c184294b52257d17eb761c1b695b6204ff4f6e24fb7398dc3db601cc9f96b13c22ade87b770bd2193e97987092acdaf482ed5e8019ca84376f560385aab0d89d061ec78d9d6ea9945253ec9fdfcfd1ceff8301d52cf406727af939e66711262a4eee34df05d955e219adf83d3c18c742ad35be853edc1f745880fc9889e58a52c3816f0575039605f64bc871f90ac279a4887f953da3e5925e879eca8ac6084d62c5ae429c34eb7835aa6c8bae8527771509b8723b2428c1852279f874917be4b494672d6562bb799a36fae348d9c502058c602e13aba715eba9956334637bd53d156346b1699b290d0e8e70cf17a627e4f2f238525fa831af0b1b72906da90b7175b8f12d309083c0d43c6dbaf7a8e530a40b415fe66f51782fc1d05058ed9cf6149e3a11341ee5a61f7848da6b4e5b3cb2bd802038b980837cdf904055b1cc6f6ce7122576c0c999eda7ad2103fa2c5275d24b095ed664cd10dcc181ee49c700efe79cc1dc121153089deb7ac19898130cdd6498ba9de4640a12529f07c6ced779e883d01f27aac06235d01dbb3f412f0ac645ddc4100f080a54d7d9c99b37e23495b2a3be9a09e0098febe5099c516dc174a055152e9b9b047c46cd6a27106d640b83bb5b501913a5f01d8ed523e51babc25e560f41c521065427cb3475247e9138703da9dcbe8131901240698823ec05176024ff415ce8da714748ba811c7fbd6ff7b47b66d34751b1398cba15b0d8d6eaec00285789ab81761d3b8eaa56982ebed3ab50d8606c58e573e129c53804bf84366fc0fc90e0d7b5033cb0a79a9dbdd1252ba146409886417fce54164f2eb9f565af329f70a3ecb05096dd297c3ea80145c0af1f553f3e83da97bd693cb5205b00b0f3586f5b7577fe00e82bbf4cd4914bcaab04fe7fa466e8c30e37930b8a277541522ec18b8620b58fd839c7810b86413f91c36ce43099ce41fede38e95385d8ed3c00323df8df02f840812d1830fedd5c124ee52745de8b63e09a55a94b121cc73d522676df4cb0d39140c216ea3acfdcc6f9b1c8991251a656784df41578abbe91a9967deaee8c0fa10553df4e7c97598f8c6fe4b8f1eb8f1337da2e99dbcc870259c34716c4d71667c39bd046684b032f20a5edbbb5270501cc7375718b8ffbdb04bd83706e6f542f69c9f6ae2b0763082e801af1c3d70bdd6e8ba67063e719743db1a2b9e8f24acd6cb7fdd41e1805311d0439b7ffa73d343552d696fa640e38cdc775c3527601368a753dda4fe67822b2486f99831f7b0e3692fd77b78e21b10c24be64434f69f077749432ef32c89e05b15b38c0d63f51ce3658e03bda35ecd49ce2b2b4bcb6080415e65364e6388fa4868ae2beadf35e949ba4023212c5b9d32d467ea5c18d5a6e42b871ebaa0b2ccbe6a760570623abfc94d15895f982682c853ef3b0c2093f96457c1e4b5371483155c3e748cde2b4bc39136d804de432686f66287b9ef035c27877b93679df8129264aebafff69d941a356c6691028002db18584d052e0acb8b400af0a476a757dbaa2a686128d6016fe1694310956e345a765360527296fb0b273d5f5ca3f745ae4a6d1c392df0ecf01cf03d52f942e094c8d37cc214eaf89a6616759a23e5a94ce83407867a3145ca1f1fefd2998ce938beeb5c356d30db516295cc9b59c67d75ff6c1259b5f8a4f1b0dcbe9f54ff1fa0b9528d91b6a22c1f25ef7b6334051c7a22c60fd516a1c81d6e06a5004a381bbaee49ae2aa0341231df75e4a622d58e5732eb2321f791405812ac2cbe167553d6c5a777ccf50399107903b3deb29034d2059897dc56e553596eb8d3673af488fd10bb3f20c779b3e0b57f90fe6a7db9a8a17a484329ade38a1059c32a60ef5b944f98005462c8fa55407bf233944246af75f500bde548cdc0cd8f991deacf34290da1bc4c2952b70007bbc181f353f45da339798226dc4948ad4dbe9447a3304e90d1a635d54cd5c1defaed38940d607f36a6554a67d642235148514f724e0a3a1c6747440ab8ed59997c4e29700f4bd8d82cbc24a56039c77f1cc5105728f189468ebbc751f21612f087675fb3fc249af3c22cbdf8faa67c117061cd2c61c1734810075668eda5540de13fb8fbea066a7dd0c894f23a4ec126ea86fb410ec17ebcc09f932032e7884274369227460bf4b48eb435cca80706e1f1dbe3a73e2e2b6947ddefcf520f13f10af7d3586c41e13fcd2faa72c83e94470788a93b465d927511a6d31ffcb322b9e608159f1a3fae4ac5bcbe037320d236730deab5ff76a0eca9db6be92e38de52a896b065e00f570b00d78bae227046c28f3e0e54c31411e5b616257e4be01cb18beed378ac3c9ffc0912fa60f210d3613e3213769aba9f662d9f421468ced57360cc8421f42a40686b6458177f9db6e93f68cf1865b1844ee33700b37299e7546ce855d270359a44cf8012acb2cf1e25e052a954ee41fb6c850cfe3501c73ce7c48284530087194095ca80a9b19fd912bcb4b155552ad7f0da2cde01ba3fd4c6ccbf2a67b148b6b627c7ccb66f94c960de4cfb13c9a4b97a68c0700bbaf8735df7822d8e8e681fc39fb0fd4e6ed2b21b8156cc850b73ffb615f50c3e5051cdd90b8b8eff66727c9156856d4c812993d72ac82583f20484558238045d5d774fbb39fa602dedf1f630144466889ccbad8699e83ad78b3c91eef02e2c81e0e4362af89b02b1489bba14c33d078cd1b1ae33dc1d192e42cf202a8f3d673dfaedc79b5f0dea713ac5889943b1f05cf22261acfa833a2836facc061832319762f00de8b416151a3cbc9e6e26086e0fdf9f13c9c5b0e9cf1ff065031427d73d5e481ffe95f39b92d1fb601ba6ac0a452a2929c57c3c513a61aa804dd56f03e4cb402a8383643928661c036c05df877aa1db0f21360b687fef25f42b8c9e54d05f8b0250e2ebba2f2cd06a91671ce431121d11f77d2f36acf0850afbc0d5cc7e1230d80f00d513d0bdf29bcf14d1995be360cb61a49877964892cbd5e13da99f5c42359983f152a840755e559ed504c9d98093a3a0ba031ef94fede0d44dc11535de43c89f65c8a12809291fc361be606e9d629f8ceda14e7d34fd6f612d3faf6a2979bd257901bd0bd32c730f0351382552da23657cd25f3f34eb5ca95d7a3bd95b4f7c45c97d59f30241c1aba299743aaf3457e3f6767863eefa8c1e6029a5b196943d0b074192a84213cce5c67728bad7dc49d5f527f1f6626c88c743a6be926781245b6944cdc60496627ac038e48e398af536834db0de07fed64f9c835a41299e9b7b75ce73f98cd9e40373747ba5b79fa210b0e10a452b1d72be88368113e61fc3ff486c0f1a71e513fdea65adc18786646b9bbed887b00d7795f7b286c0569032de1921b9f8e1786167343ef271d359c76476a2238fb99dbe267e393b9144a41d4da96e1bc35770863b9cbc1e2de091d4c7c808eef8ef6849b1260b8bcaed61818fb191e0ae821001104882aae29be8ccd63075073280caa311d74530c209de6311e6294b277cee6c37987288f4a23ad1ebbe7c055760834ce526f95807989928351e6fd6fa2432becd0bb0e5f5ed3376cdf448d798826c67e8afd0bea3274ac4b4103abbd625ac6b8de23a1a1bbd445ba78158eaf9d1dd3c0e9abac1f3b2083b4736fffd7d18daecc7abc724b58cc7ad87221fc449f0c09d5b72ffc2b7b31c9edfadb812e01818614ac337701bbe996d5849030fc7973fdb8507f151b05729a1efc42dbae8b69182d4b5c429da453ef850688280602b41d39f0b2665a711b316dd05742c05744dc7223b331b926a8d5cb3e27353c1d78f66fd80c1e5344a2eb75ac4f83dbdc84e30869847b48a75b54dfa5a2c92e533e04905551f64f626a1e7d08d9dff25804f2b04aae695167b358377f54b8838457696d2e2c00049c48faaaecb76e322a07ab80517c657bf46a95f3fd807c69e2d1b2dea82becfadd5f53a4a04d1627342d69e8373bf0a96d5e26e89adbda27df6301bde29441e8a39ebb4869cb512e4c98217ce8ad65e581601c5321000a254cf57183c64fdfb454d4672355f0543886106821405d99c58a4ff7f0d487ddf145f3d437616659f769bfbd0401982b255c5890f6fa8f7f91f943002b24194faffdb2e54ed4d99043aeb98ab2d0778f9c826d8f5d257c4328fcbfb1c4d99ce2c0578e7ce8b0e3661862e8a61fd8a1ccf058f0c61bb1c3c0527902722f0a4a3413d66383f5b06bfd3ba060dd01eef7cbbf377fb2a43fbb1891e405a40b2bfa38d7b6784f380d5aef65ed238d8e75568e656d9c8015a667120d2bf7e094bc8cd751182a29d3467e3f50cd7844a6284ceaa466ffcb5f4905c680b0c8c375d89a481d16628cbe2b6da6b2c6f2729ad8d631f93370e451175c5f4b08068d0fc46b27dc8ed2a529ae8718f05a5b4028ba103fcf97f1a595971ddfca2f7ea67c41c10f29a59f485729d1386a2a766f5d2153b60cc9bf5f907511b094f668ce27a312a1962589dcd173c495b3b93b7093043a496a401a0992101fa5da84cc63c0f07480e78a4bc888e8989f0c0d20095479211d9a5a819117865cc15b1b1d446e5ec0ceeda513a2787f2303aa46d8f300b016cb67271ab5b7ad4c31c34a870b317de93c81d83efb7c64498a9cb91df25ff5721edd4100b7ce655dda5a392d9584a0f8bab76f3df70a5128668e1bc5bbb245682f1077db8e0571773bb282b6349992e9601dd5737b669b462aa96e8236d8c0ec5a5d1209e8aa4a1be21ef50ebfeaa933903e51ddb1c8c00e1746cd1358fb7cbbc8b27d817b1c11e42f09149e3b1ba07c7c10c72294e92456d3dab4b6073aa4a2abf38b64dd251d750f736e09f6f08802a9d05429607b4d0c2543f95c11a67cb6229fc2997225b877ccbb16b38d145021c576fd601a617882213366e9c702850666ff13b7298b7e8494f069ddbcf4084b81ed85282b3eb47f6a685ab52f302a9852f0507b50f64891640a460171279a0040c0ef13b5990394ef41bd68c1097b820129dbb017f5f1b4e703465c5cabdba7746ecb8a3b172605773cd60bb39887bb6542b1c5b3e084564c209fd452cad8962ef62d645b54d731a4a4357d6162cb48035152d23c03db20f4e91044293b6745cde4bdec10834810be2d4ae74afe5ee759621412df6f4d074e69d150bdcba4770fa75d4b0ad9a0293a4c6c90ed5aeae8db2bff20360cbc31b05343c5ab6769477d46f868447eab5d1f9bfbebf24e4d940838d55d29e4abee2cd62af88e8947a8ad936fe5a2a6c01625c2f56dd00789476b9b37138fe669ed96e080a188236f48c07e440b529aacce04710d8a95a278a7c1cd682624d25708ef59d28ecd57e8ce83eae4a2b2108b52e9ec224c4bedbd42eb4ca75ae0966e9e2e1eac66f02719127fbc30d3c20290432d58efba930b23cc9323065091aa7c28ea10b59bbd46d5ac292181047c1754b360626014a5bc643ed8478be26b7dd69abd0eb6273adca58306e4b7e37945590d88a7c94994d0eb19e54e8f910036eef25c37a4395f01c8c587dc33d2805d67e37857b06110b9286a3c59bca0ce6c68fb29cce998f29695a04563c926251fe3bc2b87462ebc231102e02ef1b21d984a2f7d47c05fb7b3e48da464ce5462702dc4ffd6fb52eb52dea3c80f229b19aa9f5ec9cb64e215908ec21eb84677832ad691ad5eab5148ec41f3c2bc14e133b654113670e3672f4f67d82244e17738a99e14963aa12631d70a457a97e149b0003d4899280fc5dc8be45e5f0644bc6aafbf5a7d1ab07662ec6bfa94f8c4ea172040c909b33c7518213f6e0e80f4a399ef5f479503ef1b91e102f014734b3411e7f0f6cfe94ae833d1b1fba72308327b23b9600540af98ffdf6f8b48ebac5bf771d2c500c92393f230f3b1860646719b302b73923b4a4cbf9a63654391cf4b47921f0b1bb101823449f060816d656ef22cc6a2337323ea0945bb072f5efcf767e27801629795e154a8cd7e1e45a29160545a690e85b1761c83a101990ac199bcd0da4487c0a5c981bb39d8c4697ef5923e47acbf055dabedd5e7eef5603efe05b11df96113f1df2d95da1876986882c61a897c43144529ef626ae816e3be47d39deff9ef80cf9036db30f49642fcf7871afce8415bd8bf1b12e1b5d2a66984e418917aa93f7a2e8bc3934596c3b5eb5989a8f0a694f1f7988c514238cd16cf80ea1e7408fe032a7f28b4486e16846a11c157c44612b5da6c8d82c840c0ec429e1c4cab2fdd7091c4627dc5ec20195635a4d8d5d2588e192ab1161453df9360c39202311892e648adb8dfebe6c539f0ab091f5d070d4ffcc45d867fe8230439668e190b660673461a4c945dc6b2edc52b8abb919f40f630c23d247e17b5523504ba58bdf7e54430458ed3f4f16ad19e5e81e67f07a281f0b52448e36278614e49ddbbee1b4fbde3f8c14c298d3e77ab273acc1d9af85c2b4330bed9eaaba0ffbf715ccf6992cd7a72a57c3f0fc4c300eb63c9188de85005629e5cdecc43f3e7a294fdfbe67e097907944275a0204f34f8f244646fcc198ac138f977538315693a64e01286a602a1afcb16d0950609b8f439d5de45bf23171250db192cb96a8d26a5f64cd06f889feaff83d63d4bb2cb9e081fa34fa539040f64997d0064367b3a62f3536216b5b74d23f4dc651824154c4700383e019558ef59ef7641434ef4de110c5cd374d0157f58bf609850d8fec7f3c42d4391af5a9acdf29c6af865b2f06bdbb22a5e1d9845f6815857c1d38028ce7e20cebd83256f0ebbe3ffacad39544e943e18d6faa4c7d7154c548963f270c43d1510f3fde840a2a9c668dbedfd791435baf7a96f47b4fba6e2fdef3f29056a0cbde7f62906028ad803c9507ba52e0b9de8f4fb108e5ba0c139f9a103bb13a4190ce63f9cd949ecefbe80cf51a42cee1c4a478d5545c80f3a40eb945aeb4219b4e2559705569398cd98c62b36175e9c7fe9e5bd51bf283d47084c7ceee83333930a3024196422ad14dc0421bdc3c884a607dd24ef982dc8fc0281b3e528c2e0472942489163a96e8e2253f234e99a8761480a5092704b70b23b34fe03fe0f0a8f9799f64a171b9ae3a50a2a2a3510b0447f80d5502080fb0d1179c929c6be0036dd221a1d5c8eed6500ad7269715eeae96d75e1716433095f230e89198a10d989ee8a80f8e0cbbbe9d94120590958f701dfa10504d727d216375d50855b5aa6d5e01a536c1fd0cfbe343820c6b502b563ef122ffc6d451f4f193b168a7b4887d374bc287bd5f45a95fcd0f7614575f29899327e724ddc7342b94fa856bf376bbc9f7ca0c6a4aa151f726309aed274d732117305730de4a45afe358d9942f1681999d2195d523e644d9d6c2cf012d5f9240629b5fdf279a38a5060984d86686a01dc0d043ac6828f572010334e070a1da35632797d01c73a2d53d826b78dd6f93391daad523c5f0a63b3d246bcf52888a4c2d5c2f3aae56287b7505212671894cf527fd8a0bff84a84d6b49891db2b7b3fee68f99350237bef2df7de52a6940274081609f108ddc171cbfa1faa8529a632ae7401491f3e4822b904aa04ec2848e9dd5e9786bfea6fb0e908dba577864dbd67d8204939da4f69fdf9b4f4ded7d05ba6bf71b0ce7ac91834dce67376d01165b227282194d9ea1369c9effb3a0cc330e43a25bcc34a78d5b21623c69f9403fe0deff8edbfe11de6f2b734964c238de54d07565cff0eaa3568b644db41b2d912e2aaeb479af483830eec8edf9615b9fd39b7df00332b6e7fd9442b5ef1ca49ad2d6cd96254f09cf91ef28e93e80c79d52fc6736a5e113de2b66d6a745dbbf64af678cab1d8107c3a494a4092925aaa80ba29d48cc0f1ddc8ea952d8494141b8bedd9ab65290d4d255b0a4b25b23c9dc63a06a5369cfddd37474ff6149e4a2725275b22b7fa153491947cf62d59c3647bfb4bb6b74fe586e358f6357d692ca7dcd25bd233a944e596c616fc92c801b411f0c3eebfd17baefc16c1763784eda938a99b9b6d44952c168b457f8a3ed4b0fdb439a637ef3b332825b9f799ed795e3fc8b3bcb92ed0e03355f032b7fa4c31c0df4a1d7a1697c3c441e6fea0e04f82b7da1507ecf6127aa98eb7e01873b7a776bcd28586e1e625f1dfc8aa87cdd92825cbedeb360179aa7d9c96547adbe69c7c514dd242a325e85d345f22896af4f725d9eaeda7ef91d207f2d40a1d4702b7af7edff06ff837dd8844c755fdf6b9673b36927e0faab0334810b6dfa6b6ad5672ef4c5744501246f7fdc5d8f5b771118d107eb885f359354cbadf7e2353a85b473bda7d0792976e4850eab3a387ddbeb4611892653706a594a3508cfc2f371ad18d9c73c8f59f0c65b6423062a3b04c79c9332394cf8e1eb69fb322148659d8b2af7cdeacdd73de6851e1f38763197e58df7b92126f03df41101c4b101c97b05000aa80a7fa3d2564027076a93b922db6b42c3fbaf4c3da06a597494a90786a0bab566bc53bb22e38436d11c3b55692aac17ce7731d1297c1b821e83612d48c011b5ceeccc260dcf0badb11b5863b5ff4d6744d30aa8899db36429fa9c19dcd6043aea394e3c2fbd54a39f5cd30016b807c53b2181c494f33a2fea3e30fd29f3f20419efa407d5f1f3e50a0a5a891e67f8cf4838ca407327adfe3fc6ef69c259a0f329a1ec868bfc7d37774fc4169d775ff3d6904df67e294515ab8dd97526e37e5761d596e299a2ffbd27cdfdcfc18f9fa681293eec35a99329da58b1a4dde78fa6ea4f9c9cdb3d4814fea9fe3cd053df431f6ad34a34599704aa552e9ade7805f3ab2a5c8f21487cd8208bef59c16fa2a01bf41dfc68f3dc7033b904ca16684fab7c3f19c0fa44d3b9c3e7956fa09616ac200dd737549fd3abfd4e9beec0fc3514b7dde3a8fd4f1026c61c9aaa5fe9c06a87229a9a5fb3a06bdab23c5a9faf282e18a9e2ac016b6a477be018ae29b6c4c255a2b3747aed6ae9f725ced4493b5b69d9e4e23950bcef94b363ae536d73d0ea08dd44a3d056ee11696a4efefb6d2587a6096f8ee7061bb2ff5ada1cd7fdfac9b47bd3969f5a63747fadb07a6472a2980a758488196dc76e339df123838483e961938d79fbb13f8a01782634dd87523c842d7751f76e17b205936197238248fac61f5eeda938515a4dc145a98b7be0756e83694475a8bc3421286dde9fbfafd3a5f07d6fa5f7fdff7d75c931d28da7c6085ee761f9877852ef51f7016c08f4c81dbb8ffeacffa5cf921173b62399c328e9b950e5bf62dbd2779dffb00f2df784960f875d7dd7537d7cd98a770b2b040468e2ffd491241761a818cdc9bc60e45dfb50479ff090b325257017990863336b7701fc77d1cc7f5f773e4cc22e4397cb9ff7eb68f6f25f6c1060204c873e30f20cf249aef84423db88df49df4cda7921325818cf3caa461ec2c5cae3fcda865833f8d5a84bc1db50479d3a845fcf99aad0d48f65a85582b8a22f99aafaf644ba59297b91f593613af71b97239b28603c1f16969a796a07705792d4148ea2aeefb71b2b0fdef65485348a49428975301a7075bba2074b9dfc85cae9b379e0392a59721e13ce5be4df43ceefbb8effbbeef86e338ee033f8eeb1e0c49cf8d20731cf8dd0b37e4b8cf7bba012f7353e0de494bd8531cd9cd5ee21ee442ce86136205a4f409103f418204e8496945a8d5dad42db9a89f4c957f93416b46e8d2091596a7dcc9b59ed2b94e12c1bbfd74d8d216116db55a2b8aff4c2993354ce653b9fc4ddf5ab1932c6ffa8af7741001f24d3985aef793daad770cd2d68cc0ba51781586606d30dd973dc6f58fc23bacdb44640e360a184a5ac2ba1be943de621a8c7bf11cef9bc8531ec537afe4231f62233ee2fa72cf79edfa38ebb2d0b7e4a31c6caf60803b9f752719a50043f8d046c921cf79e2a93e729bdc49b25016a89890aeeb3a6ec9c7c553282a978222e8e252b29c1cc81186f5cb8f89eb2850e82f478a663e99a77c1cf10efdde33cd3cda16cfe9f698b89f6986dac20576fbcb2d26e43a7d2ae39df994dc36546c8b955b0c5c3561875cd96d2a7f27e9855083bf688677283de2882bbbfd258ae83a4965bceadf823ca76f076d3408a179cd6531bbb56d44d469da39e7b4e369b21186dca78463aec3de86505d6ab5ceee58339f66d2905d3455fe26f24a97ed2d79225b68aa9ca352d3954a7fc2e94ba72f75a7b1a623bf7b4b4ee9d2914eecd39053f8a750719550ee9cddd6b2a9f22f5de920a0a9727192a82eb50efd63c3521a52dea9df515a39cebbf7999b08b4bb1b8faeb906ce832527ed684752ca7594c9c4c29a1ffe3786a2d3299792e5372d48b9f628e7cdd40dc714e84fae86d5ab5dad9f47765ee73989c9905b9fe9f56ac725806e5580ccb24fcb6987ed5b4b2aa9206cbd3dfae5ba519caad3b77f2a08cb791b349628fef769f9c85205d4f56cca10c519d63ae79ca2e7500304bd0b7c2de0778363ca554eb792198bb2dc7bb53e5749caa2668ec2d0a71449a558a7692c8d24a03bc9925a36ac4e779d1ed32e93947074769304c3da5435d7dbd3bb9135db53b99bb851f247ac22fa54b19e735f701c089a40530541d3735c5dfdaf2b3b4502cea981736ee066ef1d3ac86b9ad4fa352774103382e8e5ea1ee438ce43a779aac198b165ea7bafbfb18e35dc7bcfae3ad6709e473e21a14c95bf0b443c55ae236cd832c57d6ab64660957f98e96f46077550100974d69b5a6f8282bc2d3d962e11973f941f68d852c75f2c818d2205088a285651e79e614b1d9d928bc600417982021557335b720d07a85a07da662077f13f3d0c77acd8fe32a494ae66b6fcfbeeeefeffde948b91ebcc9d668fa5dbb72c72fd79a73f8f3b60200310650869e1722f58700616270863e88a0c2ea7c1145488a981680438b8845821070cc040c30c1d675cee5e79f60a0bebce4434473471b0cc493865b3e584655ce3f29f42b355d3f53bd285eebb38e9be7eef427d8fac6157b523514c0f3cf600020c2130a8c450c31a4c5c2123da628ad954f9d0362b5776274488ac774b1683d3867d2753e63904b8fe738877b6eb3f9f3822859d3d3465debaa1bd5eaf2a5f68dcc515606293cc14737d165dcf2967d08ccd2cdd3d8366cbc5b8ca4b1753ba2e660d0b13733b92e5b3d9d2a179c2b28b5da5c38810599a5bb2989eb15042d77e48f094bf922e819db349346573c8bf7bd7ab9a7e53ffe61d4a82cbc2c6c276cb0e9a5e78356545f4b03d43d5e1879514b69cb2946ccaa66cca688e4c26e81ab60d15ced6e59908a52465accdbc81625357495652d846d9dccc7cb6246cccfa70fd993b31f82223832a345ca0d90a1dfc600bbb7d19521d24dc3177cca870ab5d18f24e09084a06b8e5d32a9fc9818758e5fa1ba1812db96601e6f940bd1b14718deb5f01def9600b4b73cb90e682b4748178e5ffc11636c8dd808a0f4d2a59f61c290238a763e253fafc15164f3ce5e3aa7e225aed7a9a27091be9f7079ab59a19ae01c53c335dc6f507bde57d6d19d9b29057fe3f58603b05e60077805b0fa5797a562fcea3c7a832eff475ee394bf37f861dc7759c981e92f14ebf7f1fd148344ff7feedc5fdc31085b2b1e9a011b4911978e54d7610afacb025cf363abfe7bf652dab793d88cf5dba3e324fd846dc67cbdb3585a5f0a28819b85ed86474b85053b8f83f8783ebffc33b5c4e12ea97b9f2f38ba35f1d5785cdb36223fe467845e2f0ca9f6705b6e41902780933699e541b717f185c4f71ccf52c6d2f62614b9eb17052bceab7ddd35ffa2d53d73b2e606c693a73fd4b97b9d3035e644af07abdbcb8dc835c072d0e112e2ce5428ea4a456d4ecbece96db1b8435877542826f4be6142f3ace0b96738ad79d64cd0867ceb491b2dea94278b7f0268049f84cd2e7c6ca7df87d23b791799bb4e195cc766fd8f4e820f154a366dce901557c5c9ea971c7f561d27bdc49ba16d6beae80967d8cc8418ea320c4e04246838ba900828839be5c1983e8092a58aec0b044991eb27c51858b5fe4160a2fe00105b4335b6a3002173f337f657ef601f9663ec7b977ed66baf1b8f56df627c5db53d5292b92aae733e97c169478644dfd102e0b09a0ff43fa786a0c0fa4d041082c5690071341d38b9926e258c3c809385cfd560c5b75d85205d4e5c81afa3f9eea276b28e9134259c59aad57cc60088d336b74a183ab3f355bab165c01430e6672a0411957bfed17bdd2de2e6deb340b830d1af230230631907031a08c315a7c4145194300e1eaf7f9e9dc00f9a66ca086c2dfa40bfddccf3cb27c7e583a7858fe23acf207c1488aeb2c5e9dc096ac9faaa95a5d61c599a5d128d3bd8c682c0c15663e5a982f2a40a3cc17a60a330c0803082c7bd460c5088c707989419526f670a38ea117972d880e194d981399b975cbad978be88c7294e94d0db61fbca9c196f476630d8d2ef7616727a543b0cbbde5b826bb931a710fd4323a612da32137d21775a2d26977fe6b3acd8cd380b0e58c796f99471da55fcedf46be4f67560d30c9124b2459c2c4f40b3089124397bf1a5dfe8e9fe3df28ff64d29328e1eeee5e87c6a4934e4abd4c3a29f53227f502a667376d1f6234e1852a61e7a4357456a7140a3be704e3dddeed0217d831bc10ea36a19b17fa2884522f603de14b300dc3607a99369b32d36ea5deb1b076ac36a14b9224b1912cf4a577923ebc4a92046d3afb0865fbc816d97e1fa717f4d9eda636a2cfae0f2eac50b709ddbcd03321346b959b359cd4aca59ca032af43c2a232d61095d5ccf76ebde0f6ba74ce51c76eafdb4ac252fa6252ff56cf2b51b2e406e8410bc03b60b6b79c73ce4903b091dcd87d1de201e0e300b4096b481b9484ec88b76466e620b7e4a7cc272097e66bfd31a70f14cac70f1a20a720563409296d40aa096d400e3e007843ea7723476e01a037b30317800761aae48e2a03e49bf2531e08a083d4cdb56ea7aa06c073c831f49c211f00400e421b524d690393102b9e82d000f1f10315b2e7a02e7b8e0f2034414ea21562daa054137a4e18b2e7809ef3798e77390c1335b8217bce18b2e774241780ed86763005e041980ad973d87352971f4c95781b03babbd30976217b4e5fe11d2852a6784ec7bd58b3454c63952c2bfe70abc954f9b3981ba778caa570476ac18bed2fb94c0562150bd9cb7d134aa3cd6fe698e3d9f5b97384bff42df346bf3b1abecb5390c1426942509c41cb830c960f01527069a38e163071c7172e26e30a3077e8710605b52ac2e03114060f2d53946107280b43456dbec23cb187370b03450ac23c6154861d5dfde13a694202182a2f1f608822688818f210c3d5348811f3e50d19f490856bbbc27486ac240712db0a8ec4c800c3972d37c868608506591cc1c61371c8600499f960b7022bf2cebcf351cde32f2c564ceac77f3ad9b2fca5d5e32957cdf77f7246f3b412277329abc773fafa8de794d55bac21581157ec908417655cf3594162b6bcb9a10b301f648624b9db6f671440dfdd0caa79faceafb3e90c40beb1d655de38dcd226762959aa80f2946849d146f41c2b7768b6dc45c95205510ccbb7b453e53c5569d896ed7074e90d42ab95cc9822eb440ea6680a4db254c1c75c6f8e5a3bae6be945b7a8566b45f13fe545f569e7adaf3cbae52666847937d3976b9a5d3205b6acb0eb643ea3f173c355fedcf895f1947f117379f0d4920f6e8579ca347461b4c2564ed820b4ce4cad24522591c2febe26ebacf549d75a1b82261359c3c47b1349654af9e486242a7746a08de05cf0eb4639b25a536f5f28d851ee2ca54c214b3aa54cf1540b657a3af01381237ffae6e67abfc7d974cf9fde02d086e532d79b005560d22fe14fb269002d48eb200e90b0f4af50b269689a89a495bc8812b6650eabb16abeeac86ca18e92a5a56f9271b7443eaf84668b5b481c729b2c9d89eb7d85bbdf8e6cb1f3abc3662b054bc152b094c3520e4b39ec2bfba79b734ee6bfae83fb0f5b4428b9d0c5c9e97dbc0bf669de85d3fb7891744b26a2a982e6edbbe0e34f5f33ff049ab77f828f3f7d936a266902cddb7742f3f69b74e2e34fff047f01fd091f1abfdcb2697dc42b3aececc4a99a2adf02e372fdab1b314205fe22cea08e2b462eee5b32511a97a69c54c40a5b720d68b63a0cabfcc3a866341b4d838528980dec06360483790d880a66331f9fd9cc67462925d244cbe5ffc3238765cd96507fe36ecfb31ee7bdbc43c36051024f1096e707db63bd4d1a72646b46d89e13e3e6d06c938a7861e737a90815767e8fdb05bdbbc915facc2d62444eeb465162359bcd66339f6e8b8966eaa2ed65bd5eaf255cfe62c8002c739c40862baeb0a1c8e550bce448c38a3592e0c207d7cd95a13b66453718b951061a4a5cf13233f221065769adb5d65a6ba281003ca7f34014df83ebef45c8b0f3e9f6ee57f4c2963c9bcd66b399cf8b52514d4c6918af99bce7065bf297209acb8ca833eb44416e84d38cb8fe4e739ad39ce6b4235114a91aac7300905b05a6fd50ba51ba75105dae67e9eeee9794ce422406cb9e6ac1535186b25cff9b237e26119118c6966c860729b3d543aef2afb5877a68de1c617f9c2845f4f3c14090c3caac11475150bce37346992d949d4f3eb0c3b6922724a0a2b4e0016ea566c7d025c0525d57ae6079173301268985e5623e52f2992457a2f0117f2cd5b5912bb0cadf0819db573c8542c2960ca6c82b015f8c910609bcf207636b9653ed5446cc63edb1d9a2663eb0c3721cc7711fd861b9ae6e947e6087f56e499f66e11d1f920637ac83e09614d783ebb8ee6f8863d82f1ab645ede2494071fd8b94c0961eab5d23798c5777c8175bc6634ffc358b5e974ca1c99a1fbe356cdac27639eeb96f2d1e8923b504bdcbdb484a0090872db9c876ad8c47fad034c3b2c7dc8ba7b0d821def118af9cc8bd3813dcf21f58e5efb1218f953d34e4b2186cefc03e3010dc122712b16162c31ae675550454ac704b474af338d131a36346cc93d96a2658e52fc5752c6c981ef298c73a51e4363a91e83841a2a323c6631e3bd54e46ac2a9667d6cd08a16aa0344a9b2d1b57b90dcd86577ea55fbc72e7c171e0952bc08ae9cc9933675cde33e904eaf2dec78958f12e38439baeeb4c68577db00b6d825c7f5ad43c633ce788776ab3e53dcb065bfaecbad02d593e7329188beb5f7a98eb7290148febb6ca75b20c82c7f5f7bc6aa93f4926b8ab7e94285345c48ae53a66e6c99528256b9c6c2fb8eacf11bc2c1dde71192ea5b18a78d5b92a496953656407dba4cfacb025a5f98cd2288dd2280d253402531cee363bd7298b5296b7aa8cc334f1bace442cef28cc1968dc92856ec9cc74b61341d7ffe68c32ec6e168b75b47d7114879d94520e8a94614bb6b9dde2c03bf02436363e475878ad3d2f56137775b640d0a944269d14d8be25ea3daeddfa1df73f503ae2779c8e8e10a70299111d07345b1d19d692a861cb36810d28d0815b6f82e6e959b5e07fe83181871b9d7f005ed1ef01ea5ea8192a8aebb55a2bced76b7b510af39cfe2bdea2301ae896ebee9ad241902009d794f05f701528c185ab0bfd522c75abe0a8dfe3069a7653981b4901ee32bd2dd952cd899cb59aaf34d638a1f9d2d3944e967b8382ddf69ab55a2b8aff29d6f6a053dab41aba707b5de11d7b6de6f8d538094b1f3e1517c9f4a571d64627e4acd57c5faa71727ad39fc86954f3bd256990d054d57ca409ee32bd899c66e86baafc61b6a4b22986ca668b8ea163a88c8ea1323a86ca64d7413ae6d2b6d72dddfbc0dc92deee4bfed23d7feceac6eddb4549fddec802bddb87f49b76e96fb3c5ae2fb6fccb5f1071e96ab68ac26e593ca7ddfde52ef452d21d612719fab6bd50b3cf7dcc11927883232f3b43984d89d3892a4133cca260b0c7d23d95c00eb91e04b7805a1503b77cbaa1b049dc5a77a924db28e82fbb87ebcfca624b9e51000329708b819ac7a666d375eebd6d5c93b39fcd9a6dbec7e63e9159cc7d0910341d01f9d8a493984cd6465ae2318b6d785383f54937aed25aa777ddba90e3bafa792005c1e90d76d5fb405258a2a5d2f42e7d601892482553684d277a3a4def53c98626933df9a04151146a7aa3ec89c6870fd48f10c80f1a4488e82c9244e81ed9372089e06c436d6ca6b74d8f40280d4212210889c9ec917f92123085841b9096f49d2f84c4c4bb93ec40774eb2905aaa19a15e3aaed33cc54fc3efa3c5cd10f6e74608cba40fa53d2fd68850baf359062f329fb772158a0068d8928da0cc16e9ed37ab258962f8ff91ac948fa7fa3b95ea7c0b63befcccf5e78e635ab9eb668e3233c7949f63b2a756ae956bb54189bcc3aa71ce6e86b40ba2e1762dd44deffbf66ad749e21cc06b9e43e6ba911bafdbfd0178a75b1c789e4d7980eb3607a8f5f4dfe020615503cd97690ef153ac54ea7ffaf5e11d9e75b6dce53316cf5233ae4c66971bc29cb9570bf74c720047bebad07f618e69038797ab4b0eb627d9dd2db956abf87c5087ad2fd43dea5feaf565aa95c15cabc7a89008977fcac8195b568eb4a4e4ef63078bd299a6da0baaa9741b9c733ab771750385d51bb6ec22be08de59c2b7d4b12203e770df125fcd83a40398780312de1a0269e8bca153870e0aaf31afd7eb3592b04d1189282279bd3a27644684a018da6d1278c5c249cd70146a1c5a4806cb97e711132e6101dcaa3fcd7353892a1151f5e82c751de09c8d4b85d046fc9d533e9cdbe8cc121111114569e2a4dfa84602affab98dde344f02d848085da452443f32cf86d3cb9e99f52cecd96ce686dd6e1986246eb514b3b0c33923bff04e158ea5799aa8d16d45b7a8b0ca5fdcc30e386ae9963db331b8ceaa33645c7fd60cb6ecd9172b2cbbda0c1c5acc20e3aadf4dc726bc8a556b6345be58b1085bf68cdbc8cf6cf58b55fe4155085644a56767bc677f3bf2c92767b317d7600e2094b1fd3389980fb59b73d6cefdf251074020026ed528cd73f323a8b6959b239f3f7c14e5e8e8e8284aa743ab7b164ab7857a9b8516eaedd2edea07ea9d24099ea299c1b6d0b7bf66d6ccee4ff8be0b0d4b69b1a55bdaa4b4d8ed9636b5d69416fbddd2c626c80eb6f4198d09ecccc5ae0e9a2a17d892693c4fd8b261b576cf912e70df71df910debbef20861619e7a59be7cf97a900cf58360b3761698172ed769e832f04ea7b458cebb365bcc5ce35aad1b9b70dfe4871908200899e3a8521db9257364c346601b6602abfcc3a8e549c885d16030180c068339a845188661188694bad30f8764e19dd9ba40abfcc531ec17adc616b58b4dc2c3c272755fff8a953ee3ea421f4b75a9e14174ec18af6a0b71a46c23ae132026a26129b922c396ac460634b0c205f6e85123c4401c77f0990bf0ca5f8d8dc66235eadf1b2d78e5d1236823b2d9aa640705c9826441b296d53c2c4080f870fd4153894fa47bcd655cb6e040431466ee77bf0bfa6c71b5d4e5dae4da52b2ac3a43d8cad53c47c8f5e78c9ac70def5e933b9a2df0b9da246bb0db242b095bbad1f530bcea71812d6951114f0bec93d96a17b86d1b9501b72ce94453e524a5e33ad9c67592a231720b7c90e4b660957fc9baaa49ceef68d1171c98eb2557e3c08446b0da6d128ce79c4849257cb7bf1b617eedc81a26f3eb8fdc57920613ba2ab099efce71d6466e176d4460b07ec1079d688a626e69438b88e81148d2a2a982c1f62d69cd04f09b74027581e494175c204872b538b8daa5615033281b540e5ac4d122aec6d5b81a57e36a5c8dab0189796ec198456183d45a264805c6b065cbcaee7ee3be6715fb1d7a825a166095ff6cc67acc2a40a6e3b6eff9ef9975437447717c54bceff3be0f15eab8fc75c0bfdfdda2a2041e3a18b571c71249b8e152e1b0c5053c14092d010615215a1a5eb458d1838720976b0f174451021dce5c7186cb6ba5dd73cefeedeb77b52337ca22621a11b6060f55777eabfc7d9af53833f8baefbdc73172a18b13efbff76f325b2e78ff7d4dbf93afa64913ea777f42254ff8c827e4b651baa4e6c453ce85ad3f4dbae7eba4921de9f20f80079cb3d93411023cdd9ad06834b6a135b142b58e93d0a9061a8d86439b2d1c1c1a0e0e0e0e013a1612b6ec4e8c73f1b205fcf059b3ad441aa58c503a4bfd2291e6b3103ce5dd24ad66a30e92da3c460c181a8d46a3d14e42d5bdd79ceea59b4af1ce5659d5a5ba5427a4eba21c1d1d1d1d45915501761c73ce1ef79e9e551e3ddd7fdd82695f188dd1a48aebdcb6719be76c4fb096fa95246130d88b164413a2f5f4ac67b3566b67ad4f5202823b6030d80cd6b39b236c596b3df2c1daeeee9eb7a4d76f49398ea394744bba6d54502fa43100d422d02aff36338fbe32193c46d8b26331960cb66c210090b12593b1a575c8269a5ff3c03b2dc43b1de39577e91f3ad642f54eb24813b664324845886cc96470614b26e37e40850d67cf1e5560a3167295bfd06bb6906c026c01ce40049a07491be980ed10c9a01258238e3b2240c6f5261bfd2296b4a0b7d6ea24114ab712552eac04f05e74232969fadccff1c7fdee2b399f7b9f59c3fd8da76a38f2af902bf66f93273e3fa7cb24254dae48f1a19504a733a9d43fd7dc673667e01df0fa3b1b5870ab875ae52fce2a720c85e9a130ccb8feac17d8222780cdfc8be7c878c767bc7a020ae6f12dd88fe0964bc12aff59e93219a5cccc40946b606860cb86f14ecf8a9ca8237d56f690cf9c88820a6e49992a6f9ec621869716d78780363a5b1d06abfc617214f9ac8b66b3d98c4e29b6c7cc6cf622c1b1842445d0cca8eb3a4ab75ac1eb242d9ef73a496e0b354e3657ade494175c730ca75723d07d88752c366bb556fc6775e9962c9b626db1f259ac98dd721f2c0203d5b635977ea2bd509292197ed775412e93b26fc3424b85f571e7ff34e19dd945c78836b26333c47e62b1582c168b8130c8e0ee959b2c59a8397f13ef3637d2291c436843ba78bd5eaf97b5d65a6b431bc4f2c196f6659abdaebb9cd47f23842dbfda7500dca06bfbe539a4eb6f8f2061fb410f6f99fae00e0bde32c5b937cda1c252f267aabc06eda2efe34216665f3688beff8f69895b7a77b49464c27451d2da60dbc7beae5b6badb576080df461fbf93db24b45f2cabe8dee722e73bc9a80e2880718b8f298038926766842d6650d57086a62e00086ec8b0ac6f0d085134b1cb11126480897bfe7f05cff1b242cb053f460bd5c7e2f88f87299ec205ca22706cbc2627b9b815fde36846008beac1369c29bb07dcbd06bad449ab01bdf2a97c3b051bbce5faecf9ae5fa0c62d75f850a84b3e0968d430d13bfdc2ff1cb618077b8e7c6be3c7658262da11c39440ebbdd7e76b1ab0ab79e77b6b6a1672861bb3c45d88ef43df771ff335bb5fc32c82d99a8041e222c0f17db8ddea5dcd7cb3d95eee6d0ac17963e938a5061299126ac731ce739fde2555781b56c9861de96296169777777cfc013d008d1d4d0341a8d46a3d16ab55614ff5329168b08cda27c3ac7712c8edcf23061a82a6db658ac54ea5f14ad9dde4f0c91ed85cb164f3d8d8bcbdf8be8fb1976d288946139b26b40f611d5a1b96ce6442ef3214a2ac144bb3a3a94e6341a2170897016c5f5075f3d1dd7913d5ccfabe7d57387f55bf66c5bcf95a0d2066d7fc2e3a361f2707de2707dceaf242533acd5320d15b6233b36551b70483499af296a61cbf99aaff99aaff99a2f9a19f54a04f84772b0db73e2a4bdb91123cb6d423571024d95159663a1c05676236558078155fe9e773a3d05417040f374f73a3a3a57476702bc727aeb034da061689efeb1e4dae98e64d87577fd13e0d6f7fe40ad9a950d9683abd4148b572df6ecdb82d6c50fd40f92c662348d221fa70e72d37b69c7df05e64132e5011405076a00f3386923fef56d6e11a5b4d692c9a3ee1da3899d62514aa2f87915898e931e9d8e758ce6294129cb8aed1be69b23be39e29ba3296c79d36ddc8bd04abc17a1fb886c376a697c7f8d68e3293f7a05f9919b0137f0231d12583ff2a3575014293d558e0861cb9b1f129a8c4e9ea000540128211819e2c68ffce8e8e8e8e8a8dae0cef262973011ab06fb4334e764a1c0821ffe6f4f7fba8fc8237f4a1727a50f7f4acd83ef2139a544d678cfaed287ef9548cff2d7f17fff947f3882230b87ac017560bc0c180ce630162b9512c514cb4a1d51b8a6bcd0b387961e5c34ff028b8729dc707521c20ed70ba81e5c3464171619b67418cdfbfb96d9ea2baef2f7f134c88e70b14d43f874dc007fb929cc0f3f0cd1e53061862e870913746532980c266bd292a573a8144e7645390915d10000800293140000200c0a860322b178482e5524c53d14000e78944480549b8ae328075218a70822c61843080000900100a89940281b6f38457a636847c657b2b4f24b6f504a95431ab7dfba4b90152d71b3201587a022dd782c7a4c1e995d6a5674f0e3c3f4a71642561b4b940217748bbb1dcc210a59adb100cc7b50c132002b1ae318c569676062bf8fb766a7978a4b0eff768cc9e979c986b689c51fe3766c40e3722eaa6f0916f5436818fdf5c77a9c078cdcf44e9ef8d8a2a04376af0c641d216b34b7aceac1d1493a814649c7b261a28980acbf7ff98910d6511f447bff37f505d33e9fa503068f3a59aa534a8368cd7edc85d606d425cec04d2dfdc82f6c7cdbf114c2474dfb763d5599e30aadc7328fbef8279394d598759ce83bf890635882c848fcdaa51a5bdee23828e24d81984cbff0303f7b24ae43f692a5ce9a0bde7932418ab5c7bcb6ecb9d2d42323c4ab1e532fd6d5eb7d5c2e1eb869c6a2ac3728c468ed43af382b96074be231acc896655b98433606f046d5fe2891b9dd83a10b07b41e2a72a208d01aa4224c8dbe0fa2981a611369082ccd971290d47a6203f7e3c45d12fd20e39a0bc0792e44c2f314007231561aa822936533067bd0073dda2b9546351d1b1075f1c1abe270e05d88528ad9657ab1f4edf8d613fb9846de16a2c0b750d1018bd06c46a095fd3710eb20c2269aa39d2be38e8cd8bc281677276102b5d71cc21f02b4d70390f13112417c773e4d0cd54f9532dbcd5e587db42021bd1c69b3481a818e160f25ba0fc51b73e9f0e6a1684da42f1b210cb8443c929426cb7a71285077e5fb95f5551573bb2a90c821afd71c8c12d1e39c7a4e8922bdb1406f16e0dafd6e29db49b6bce46863213176e01da9313ffdb22b425d63aecc503eab30b73f656c290b5d45961768544c760c60ecb53ec39cbdcb762c784e7797679482eeb688bb7c6defc41a6af3bce018985b1101d7c2961d1c9b1d2ae0933a7bfc20389a435f50557f30dfab528ede829507d95a56bf67a8214df61fa404b8a8e38d5fb99a1f2c2e141a16d4d60b7e512fce08e3e14353c9456743039be0dfc6538ae875bff6cc24fdfab28b6387066d74eda1be7f582ba4fedb7997cec2518864e12e2765fb07068ab8b5c1bb0e6b2160a6ff172dc50e79251f53f06c7c3fd6cac9b60c89448effb16fe89e385a3c06cb407364ad5c8327a07bad3cb7b3f8585f19d67562c52ed8099240183f08430b8d84000efea33814cdeb33dbba16c6eb7377968272820d6b6e6758130f7f7630fcf20805a6fb3fa4949f7e50d2351f6defc5a90bfc4db61278c0e7edd0edfd807b63337f19e9d4e5421594daaa34f55264a116397252c71e05404b620cc857a15002a78af5b8abfe8bfe540cd446f1b52f6c116e6ba96043b46a14bbbf2cdfff0a8932c3e38e6b07a006b911c8fec48d8a841be3fec44869de8c7a424a1356724095045339cb7be1902dccbc7e75924cb7f76fe4bdc2665f0a100ae91053c6eecd09b7b0572a56a413a7de188d41581a28e5e58ad7e04fcb2f22c02bd9eb2cfcc485f11767c39ee5c109b3043e2effb8f4459270fe00576c365461ab69897c11ed3a5d70365747e30dea506c0c2adf22f5fc3d0924b7f8e852cc264e2a46759b050fc7d50a71b931fc0c7a91cdd3f6bdf61c501ac72436a7fda114869c8e5c1d3832b831d14ae76ebbe166304601b9c0ff438ab2052047e23e2211968ca4367ef0ea92b5ab4d0e1eafced58e69ce18348d21ce6a23876c4204f2cb097c8c0f181d333f73080e981491e38328b994274900c4133ba75d4169a039a516dba1b6b75b068033b0fbe291fe400370ae073d063b51b37f6d1b26e2589ee9f9fa3340e86a6e9353a78ef03bba99ea5064e733c43bdbbf47e06ab2d63758fa9d32c20c531d7a98c15d243b8ffeaa500d1b455cc7531c2ae33ee85b7f8830c48d104ffbe7752d1c7412c87112e2f5d35a2a7e5b81581598ec40bbbed161259aa4070f3ac0b42f0a69233d7871c553e549349a8d6ea1c71a9e71dd44ebd48c004fb2d07b8a51ff7b5883b67ddfb06096cdd8b4ead4a6f9b2bff0c46f713e82b49818ff5e5ae6858d99706d33e0aff1b3175d90df45836d0dcf3c397eab05b7f9ade54cf74461fe5df52f348d61233464176fc0fb6e91dd457f3cd331c45a49a15f59db4a66e3f6e59de0355cb0ad594554cbb7cd2b62bc3f208a217e899f4ba1b430eeb121d7ee03f631ebc0a57d00166b3f699fb9396f0ae6da5e1a80a64f5096ff772c715f4a61771074e86d3a9e3e89a15860154e88515b74f0476e89e0a2cfa40b8c6315ef2eaf030993828b103f0e58cc88f7fcfd33a14baf45f352ecd87ecc5fb04386004667459f04996138efadf2ac6dfc4b9a0ea77b0f4d2713aa77aeda4054547239b4e3d7fffc297f49dbc5fc382e3e14bd78c86906ce9ba9cbe96a46a01fcc8a5f9e5408a018610301aff60ac41a416fcc26a27456c282805edf9e155d0fd025be461eef218652022ae051067019cd45495026cc05aa99d47a9cb79eb946213df9331d22b0b7753cff7cc40d0a9f21827020bbb19f084e087589c96f91dceb7f01dc2dda1a01cd19c058307ac97fb1f69afd3f15533c2b2af7fd39507dce78c8086401f3d2d5e055175ef05487b4b9f50a2c58afb847343d29c016bbf7fcc81c5853a3a356fab084b5fa2ec6014a063b4128f48f869e76e07384bbb73654dcbae3fc4443b74be5983f2a9938a253d528396c3e4ce8ef675176cfb01de51028f30fee34e010b4f93115885212d7c1125b286a788cfa9f11996e15e029de52346f9bfd666ac54abb51a2967b70b142f62de65280a6d8155fa8307df1ee6aacacbfc8e3fa38bfecaf83a2a61fa10ac2465b8576ab0ff99ede2c5f8d323e3fe807fa01a60aab6b89a37cbf9b8198778b07955f7cbcdb015f4db508af51943ddd8fa88dfd25814bb9e5930c188798daa9ea90580d5afd2243aa954ff7a2586b1c06046bb630bee0438d5df5c335e4f58815ca9a0528821fab0951f21f0a3a037b087e5a1a01a006ba5c1748417da7ef23923427a190df0ed6a7be913903c7f5aa79dc44725b72cff95ecb9a7244c44a8efec5209809c726957ec585d9f4a9e5bdd9f2d2555ee9a7075e291a1503fef979224f382e9e83a4285e9ccdcfb179c9e165ee22fa68cabaea921031d5bf9cfe5207d42bf11c7eb3d025156ea670238cea92e8c1e9921d7f9bee857f9a355d58d8cfc4695a2896d9eb6738e2e649d307eaebeb68d24f49e90709ef5bba6339c893e35d4a4f287e8baca19f8bd80a5fade440581864ef22937b97ffb72feb1df15e862809cb9b5389acde209b50cbd879bf2b67fbf3f31e604bc2ae2ff34c9d5814ec0a06f9375debfe155109ae78f25f68128058473cf656d60527ebef02e476f5331355401ab9bc1efd618266959e09e3fcfc2a4c0e4ddb6fdde3a96adc403dd1e59012ae782b9d850194582cbc8c40d3bd21435a7392f8d58a8e2659c382dfbf868d3c87b6b3bd8edba556ad23b1b6557937472fddfecdc7ae69a230d282d5d5e19d4460ec90e8bc7565064eab0b01f209616067bced76f685a44aabede8ade34cd8acb72057b662cd40e2d676e8f493373cdd6ff1448ada263d53da56a6dc5c975756cd08564a69babe104fc9bba95165da5ca98c1ca8320a3f8593c4a7d06a5b0166ac6e28f250d026e8e05852e45ba62ad21ad14695b5e3e5a33fd5ca02fbe13f896c5e7d80862d4f09ec170bb1d5290bda338a8e5c7defc45281340a1844b87a523824b93f149f231cc02a56b23684cd9d30b0e70162b86ac28f0a5089fb729bc551a97555a15f4316b566eb8fda47819cf6b1a0243009189af62697bd166427a14f0182fe3ac4927172118c2447a66ba3adb84a91bc91fdadbe673a05d87f4340419f8ca77cdaecd5e2cdec81d24a58312eaf48c38ae204a0619434ec110172c1da41081bb1e11ab59d9a4602e3233c0a166f13084c7fe509c93426e9d6f31dc8b78e34667e9a2130a2e05a29b1860089823c945f79216ebee31ee211e3f794e89e8ddafd312d70f8ac93cee1b3ab0fe8337d25e5b34ed045116d82c127695cbe692d085fc837242f0b8323e8aa17d09ba8675e669b37849537f3f27e65bc4773321fd24d6557916c4a1404c84c91cd9845feef243f65e1283e8ffa05b7f124e20f65101a3f2493127019f692a77b67e743d78b32b9f6dd74f258439968ed6cb382d41edae1b7b41b55e845e99954c860bd3f832c0a82f8895a6e9720b28e07a0f88daf0f79f9b3ad91f496c97c6ab3e8f3d694f976d392c4b3296651c5cc6f373fb74374da0888c7f6e09ed4f55e80f08e6ee2b67937332195a10c45d044851e5efa386a9f3fad633e50b4f2ae33fd7810e37e91c4da421e6a994786ae9571d449f0c6ec40234edec04a76634b82061ac363eeeab31494cdb0e4562088568fb79094fb6984f651982834dc1fff78427e082541677d00a0c02bdbcbe35c6dc7c5d6684739c0eae40efd3711e1a09ce8020f5186ac276f5c2a37104dbecf25bcb2a6a3bd6a1d927637cf47103e6c099e352fc128050f9afcda37ea7c78512512047c8698e796d6f80e61f5d5319b1474f652d6a1682e4648d9b851c06e59f2ea31e12a1ca057d3480fd73d5085d3871a6927adbaf46936156e0b333e2c0ac1fe96dfe23544dacd05fdde027ded89c05f0607dbf5abd77319045250ce6f1ac7b5b4a99c1ca9d91ccfed2ff384edf1ee30be8c2b74505a31a788e203255a3ffe9808ad129d53af8dc79134c81500918d9098f7832616e297f16450c0aca6a919cc820110ccc3447206a309a2e431c791d1da607a8b01e5d73a29f54b7fcb945a4682e254a75f8fa507af45088c805bff0c718e55ce2ea798648060ec07a982f160bea2e8a9000792e40cbdcda15e93ab2eb58ea0c5bc13386ede13af6ed6c7994554c6f0570db616ef8595d988590cae83dff1bd84c6e4006b17906110b5a45bd04bf64464dac1b556c0c5fbe771656fd5977722e2e33da6af9677526fc0c2c3f8ab7ae037e392b7b5a8af6c2e80f6ec214a842d43fa00c028dd187eca24f50bc6db66560db21f4d78027eedffbab21f71f31808288215c4c6d3a6cec7a5bbeb2a51e564107b66aabfbcb2a126051448dbcb581c55542eaa47d13975b18fdb72ff67c2756ce45bf17f6b698e10b6f2bea8646d24ebd3273889c0a84eb850b709d090d6ed2d15cb7a556dcf980eb80c89ca91fccc604e0bf99d5afca47af45b2d95d21685404983e34ad49cf59c200439f60951b635cac3ed72e3f2f4d8cb0c36d579965e3c2367f3ecbd2958f7cc5b0bab8a85c3f2c972142ce2787d01a0b7215ba37fad9b8329d3d489be358106b6de693d3a6b212c861a55b869f43d2cbc178b3fff8a7b6c96f951f0d23f1c428ce4d0690a630b60233d02fc2653651d0aaca19974f1bf4438a69e0353e7130a093ee91d730d40e87006ee28189aae854c1f5476e73bcc347eec62e1be08e7c923bba906cab20c38f1aabdb0dd48571f640c3b5580f11c18956571823feb4f94846beaed82388c80dc8c09c7acd1185f4a9f63d72f9e061483d9af35b5a97755609188309d1dc80f799fb99c642cdf73e8c7d22b5376359b6260e9fd2e8e802413026acb2cc8c246fe23b2bd201eedbd9b42c14d7bc7f33d8b2a7f88a195ab08e9109875bf239d5539ae66385946013acfab0e5895afbaf2ce66a0b499e76db60c0b4e48af53a0f76c6393476cff1febba78126d59edfffef19e32a094d58b1076d1c9ac24c6d4836074769c7b601fc1fadd6ac058ca772885a6668a992e77590084f4db4753c36a87d12dee2d7e7cd0fc70b072254ad74d82c1dc969175336c5d6b260c86e243b91a47ba6f84b7e702e638d4fe011d89a6a5bce48fc9824aaffb97488986c6b4c62268245a1853a906b14e7ba0d9641e6aa06da9fd52106b16416b59a266e0edb3daee0ff064e9e31b8cc03005f0e6abce3e404189669b158017053a65bf5ee4d2099d1ff92db9a290ed1459eb7697e796b22f5a3d2c0a02f62a05486bad8b41dac05fd5ff9f2eaa994a0f30435d0fabd7619550f0952c691f8047a3092bea78e6ffd80446611f48a7f029b5c7f7c085ce1e6e7a20b10a9631d6cee51898d95f3f78e01614785a95e76360d1370a7d32426cb620a3b4675f8bb8622453f805a2aafeb702cd5ea04ac188e8532588c0fe76f264e28e704314c02a5b0daedb3e37a85e0ea6a45455c6964edc1cd32bbac375aa10a1b298b427c4f41faedc53d0b7eca5ff6ccc746ae90a94468ededa6ff0a211c7b86170c5efc2e580d139d0a20928088e14147651c191169a259c753230701eed1916013b8033b4c0428e655c5095f84e1fa9668ecaddc0211463d62010be7db0cf7d2d8265a3388d41083312ef3425271cfc8cde1cd2901a9e83da3eef16c3a8068ab074b8b024b8e28b6d48540aca5f79c2ad4fcb4f8eb05a1b6b970518465835319df2f360942fda84d5d66a8dff540ed898218052526ff3dd3b49c67e7dd51f160f1204e7a7a16598bdcea88fe53b23edc3d10bde47299beb6a87b2fb7046eda327eb6393bea0a227169cb4cca0713b1772fdafe259c8f098dbe01a1dee4974dddf7a6220c7e0b6416f826889cf3fc0effe9a47fe3291cd000b887c102ea0cf35dbe3f8306f4fd1647bb24435884ff530f9cd7d091a8d6960eb30425c3be6958403581d440266d0d19f194de2b4f11053288fb240e70e4f721a3152b519ca6132409d96ee0d406a535ee36bd9505b901cfa18536893429f4cf3b07de6d4fea939667f9bdf9f2d14b66bf6e318f690851cd477d0c48e64beaed8f2452f747deb558b6c66c5c580aa0195af9c349586cc717c70e7d81398ee82ba859edde34eb06c42af173cde96369fdf6a8f055f50f8b08f13c43b2c6f4f692e6fb9fa2016e3c4967dc31aa3d771392c97347f9b6bc4ac86ea0a765cfb2ca5ced29d7692c183f49928a56b3a6573d4be037c3f08100ea9b4d8c139410e46811c7d4883dd712043543530bb502d1b134411b4ef94799c4a5c69f39e090567c4695355e6f2225b4b6f3d2be41098fc265b829d166887baa2f7b7df6c8658fc159a04d4e20998e32b13e29ef7cf40f43fd1a427355a9108a0bfb16f6ca13b013ef7e784ce6eb375bace1fd17ce1c65e08967fee9074ad139c97e51591bd0f32c4bb7211b2a990a28b4359af43bd8fc0d33253be780abbb97ec4e756aadd17a404185a803798452ab722068ee930876df78353b1440a1694b7452e1a00b6323035b8388c399e4d63d2349d8214a632360f3f98bd866060469f72346cc07784ad2cdf17596769ee7c99c68a5cb3d3d817d528e749b15af80bc11ab73115fde11ecb28f55f2c4c105ea59a248abc58f8de25d6bf6973bb0225d7ff2e9ba57d206a554f896732540fbf956b530e0150d86f8054e775ba6ded26c92eb726eb2625a5c405b6e6731511f0a5c4d3334ea5073f34e1d23bc783518406371ff1e8b04a650634ee0561d8032e5122ace41eff3998965dc27b9a2b73debf426cbe75a638f96dce0c955e9c6b42ed6245eb7280248a4b7efcaa4de2ed86b49d877c9613ca34f95435a1a5c1d0c500eae60db0bf95026507349ec80bee9cbf1e0f72404ed943826fe11db18a7d146b0411e3d612d3d8810ed9a83343b17afbd275a2d60225f0b63da50a1d159848c7847e72272f3f54349013fedf13a068a33a87cc026b2340dc1981dac5431b479298b9f279ec4c7ae5cecc56a31daba18405d210ff88fea6b56269405f86f7fe2d4ef78c511293177b9988e1d4d3637fdcc25e87ea1253bf8cf1213acc2827fa2988ba59ddf2a316cad5fe1045d416d1155e6c7926372336c0f473ff89766e24596e84c980ad31e8757d3b67918beede25724bc52e7987482671ef74d8a9b981396f936ac5b897032f5533124baa24aea4a2589254a77cec25001694fd7a897b8b5e00545cfc0d9348ec3e42cd337df0128975cd9c9ba8f22a2391b285115f56408f76566f990b3f8a0abf05400e463b4f291647e1fc66b358ded9f91132408ca7ef61e87e2a1e344940fc5dc6b56216c8dbfcf6e1b6e1cf4747a08a93a7eab8f325c2432709dd57746308ef2faabc1b595e7fc0aa731d73d3f690715938c7028dad57994918de8a832b9aab89bea82bb5156e6aee93967fd4a11489828772ed5defa6e70a9a15d4b482c4385b4a3f32240c487f2476d144146266e2763d5261fe80b1cf99248bfd6944cd494b84e873a9ce07873cbbc4dc0d587ba972551388f95f4dac312b92ce4e410b8a333421d89edfe21b79c9f31c80aaf748265cdea0cd0b836743bb041ef326b16749e47ee683bae2f26bd989b9200c5938f2204cf33157c68fa22414c6bbcb089bdffb80e573bc7325914adde7a4ebfe2bf4fd2f5e5fa5a1d1869b6accec26b4190667999f7a93c37407e35011fd6528e80e38a25464590facee8119e33afb8d467213cfe4f18b166d9e6a3995542f03f567007d9538d1ecc757111e017ff283a690eb52fe09ff355b96035c0da9644ef29d54714fd2dc663f6de55c3e2f023cdeaee0d2d6a2d9277eb90f99d8a818ee03ac9aa0198c1b1c4c69d871c376cf60581c7d87498074da9e1471d291946011304e99651cbd9415faaaa2efcf224afb350bbe910a878f95fa7e80f8589d88386a8506a82660af066702de615fb80c7f090770937427fbaf525f40b30cacb75d3bb9d6c5e6083ad2286f1765b7ad2688d80a9da0f2e7226270ecd7c8ac1095fb1c6b315fbd5a1e7577a11f0f006c06fcaae63e6a7adb7ceabb3ad52367d89d68420da518ff054cbf3a48a8422aba84b668c1474d256e909aae028215cbd6a85203fbb2c1657e4b95034be035e8ab85efb6ec0c5fee1b18f50de41dfdce726bc21af02fbb70feb2a08e80ba04f58292cb53365b44079b4bdab2f0d7e19b5fc38acbb82901e4539901fa18fdd934c05e256c3e0c68d1f6755d59be5d9067b27a9eef74a3e65abecf47f79f3f75270a54aec8a401bdb1ef4d09f2768ae6a8bfc68b30f51fb3774e11cdf3164d2ae97d245457bfa681880e8f5681359ee9cfd7e6c57d74c41b57c1742822b5b5baaff5f2577665f7b34f930aedbe6f84c874bd42016e4c969a285e20e8a0af19032145c056696c080d6371dc3afc602b905622d2408b380ddba273861def633f57560f42d243b59fa16afe8ac3f01064a33951acf71624b1722701244b487fb66730c0335536d98028225f7553a24155a6e070d93f9aa8cd8f44fcb14dd3b528cdf48789313cf5b879d1d9cb115184a3d95b241353245ded762582db4b016f8f4cd9fbff1e545dc02713edb08ec2d4a6c47c3d1639d898bbd40c194b246474b1d16f53ee46558a705b2fb8e45ee3b0a43b3dea0bd4d35c475410fee094e790a77614b0b361bec71492af185e4d5444615941b4b53009a20745496dae87142e5d07cc6bb14a04390a6d2caf1a9c74eeaa7c04ce89628af7100de1c8da7e1203de7b69c8d33e00cf958644cffeb6662c048b9bb6a1cca6955bdb5809a8204504208c66bd182e7ac46fea2823c262dad6ae57284034d5256a08a80951e1b5330f2425227ca0526751080bd68c2f04b9d6a6b4867bb839c9837c44deff794745cfe8862b63595989117b1c55b57d2763ea7f21185fd2b84216a2ab10a955c8b054e42192aab314b71428d9ae2e1625732d32195559d08d85b4c114aebefbee5c679b51be6e08e1b5c979304c38c4f79d949cfe8bf705560f6886a9b48c5f756c540deacde1f450effc2efedaef87122e033cbc3120cd6e84ce6958c39f7117067d0f8a977453786e7eaa93c8ba3a5559b5942c6f1be3e27e302c4f891f148ed811e8e6f714cc181579c962c7adc85a603c08c5f8905bfc9228f527e75a7e0604eab763c138dddb81949aeba8a17904e839fe5184e2b43a32cc941ed695a1f24e64bdf6b3930deff58a3cf437dd0ec3b7a154da2af948614d2b80cd49a3699eb21066dd02279faf4279e5d72e93a00beb4c3c0804b975492cfbda74d1c0b8dea7a4380b24c3b30ab5931259db2352a1cf300e7545fcc7c9528dc60a8dcfd20b8ff4a15ebcfb87274a8c50df14c9b4a1adc075951492e045e36d55190a7fab2f5335c6ce26d34cda74b719780e799076e5952f00320382b2c2c53c9372e52baf7bae87e09698b74bdd6981ab2d8d0ced6be01a400e378f5769b8a5f26b155849f9f80d1709c8af38bcd080fccbfa21e721dfd21f8e6be4d74b838d38d7b9c89e01ddf8070d440048291253a65b8e98c89adf29a3a8779516542350ea235323d9dc130ec54e617b2a6c16f02cef68ce3916ba6d95dec280b695cb809a353ca0285f2afca35de93e088cfb9c103b3e58a05c0ef93416b515e09f7995015aaabf03b97e5aa890ef9bed830aa26af9258f7ccbdd625adbe608a6bcec972c5b90c3f563d2ad9d9f31d97fed7bf33bc464af7c0c020342c39d291893b11fdb26d95e30c1946ea822f2e9a7de450f07c6a26a9d6882af37ff4d3c6b749a481d18c8f7f4beacd2629ee6fc2a0b12fcace3dffaa675c19fd7b7cbc55d8f36df5f7f7aa4f743df73249763a6417e5bccae0bff52c4ab323638d83325a821936c1a14499997e4084642946826dc4e40d2cc93286cc75bb7b108473b172d1ce64c2d3565f1f1c7d1c60f4e7a4637e9a0eb7c68b47f10f796d24637d09693b80c74587a173a2e170fc23b9f3e1312549a9ef496d5841f220ce92fc7e4cf96b6ba691feb312a6bfd228509b7942da2a9908b3e1f39abc7d6b5402cc2233c6e476d6d2c016af44104d92bfe1aa79fa58440dcd12c304a82a5c4af586b46e152a3eece2c68f6d54045b702d830eb5eb56b757e9decc90a2a04974f66bacc8eacdf54b392af63c11cddebc709ecae27288883c2d658f489717be3cc0a2fd642022fb70e81a5f8f878ccf732bee7df12cec266ce3b24822bd4feaeb642aea13cb2252bae303b2874652f5f74ca8e788154c2d6e9881ee7dde43b8cb4f4da41d885d7c095b8635e4d0ab495db31ba22a27228d7dc25fd7e08c2ddd305b4d4db918c64165e4663794be1ce7db4fcdccec716a4884807fa7ae96486a022c4c28e928cfbff44429760d47b60b73c169e09ccfe9a52b8d8fa90f254aab634cf6ee340c69546d790619809454f91bcc64e411aa89b1f1f0a7ca956e1254e1b01c490389abf00eeed093b7cd275ac32ab4b6dcfa7734e40a00ab486c03bad121f5a597ffa0e7e01f353d077859e4a2a7d78ecba8a822f531c80e90e4cae27b76a0becdd91e1dc2fd3bfc1c52570e0fdb7d6ef54a992eed7c74f607637292092a34a5cde87cc5d5fb369b406f8b080511b9039a6dce1b8689d97279b8aa2bc378e7b8db1966d9e9769a71d247d8cfad9027cec8f285f197d1d227f94c38c4e1066ef53db633f75b16d9dff50e7c46b001da68b30ef784276cdd2d1355e961a5ef36395c5e01500ec8b0f4ed27002112e6295856596e14a2f70435b4c0032d7d04a7b6075c4ce3e42519b248b70951d5ffa5ab8b6fdfabebf0bf03d8ddb0fac995f56e401a35ab52b1165d29b540d645a82aff3a5af997898fea3df6dfdc875f0b3520a745c5a5e6e832617f10e8d681b5674967fdc39ec273eb26b996893f9635be58a62d2ec6ddd75758559f5afe2d4a6840276b5e04590fd5c55d9efa1a076123e145ce66c4afecd47bca8fc24025962d9d4e3f071d669ee4b47e7951050d50d236d4933d98a08d238e22cf3daa861236aabc375c658ee461a3182072b981accc4f397e7f8cf8e4ee2838dde7cfe521d4186736daf5946e3f1018f6bfe95c642e1388fff7c4e12c35c469ddd41c32106d89f53a4b997a1a96487bb96ba626243f3f343807c17919fd02b2cdd27a6ba35079c1c122e65d033ec53c576a52153417bccef7dceb0a567e39084e74389cbc5b08ce050e85667df82349136b5210bf5aa04d84e47ac287003332d30921fe391a9bcaae465539fbe8384dceb8b2f746d80d987f4c21f7b32b592e7b79bebe8e12292bee10f89ebcd3ca6d495653ebc50e2c8853f794fa559f418247f032ee8cadbbaec837ac634a4b45f9caa3779eea7649d821f98c00c12a4c7703b100abb2b6b843497d9dbfa2eca575bcfe04170611654e234014de0db9ba69aaaef2b3d6a45748b9a81c633639442cc818a545f866a64c42041ea34b92b5af7df8d83df6c6fe129f2f2536e50a54305f8da0c038f26d446a14b2bb3e30f2c40b873a934cf4d525800fc7de5e79f16df2916c8a17059d56f4f56c432f689f2d52bfc10b04c37b696a8e6c3056061f04bab40db33ff79de02c6931a86f02edb294913569200e76ada5a99e8de638c0ce68dd4cc705853eef55c2bb0cdf4c1b5d399e84c181acc592b8092023886eb49eb9942acadbcf27c5e1b3aba0be43e4636a96bc9e19e383ceb181c101648df71de5a0ff2b9b355c798db46ee6c0da32c3ef45b9d45eb5a897fdae07e0a5315393dc0653d9cb16593c13e87d400b4f0e947c4710648031bd02a6f734d992f6f888126479ec0131d6e83ae76b09c65c2196c5a5637323d28d4efc2b3f357b4de59958e9e1d4158223a51cef8963916452bec218ee2bc56e789f1b9b7a1ee320a0438a80966511967d92b0f047223e279f3f559fbb940fdd2a3b6c6b479d7b7bda27b8843e3689440a851d799c85b72073fcf86dcee8d44033527d7e1f406e8705ed410f6b1e6907ca1f028e530bf1187e3b6bd4c56a237fc358c07c79bb8d994af79a571577920bbf83e210af3e884394cd3ebee5a1771fb00a8e05c59d38b10e1e3e8dfcfc754f05dba647b64adc11004d50849b7a0693cf512d63fac947cad703391536ae73ffbc6472c72225a6fc4d90ada24a75b8c10c730b5de3ccdd1705348a09bfaa90bea612f2450ea516407ab9c0e0ec8a8797e0f9dd7f8e74ef11f31e5fc2dccb79129229b172707546675ee368e111578269a1da6f181f38f6f0f48f7038e755db1f20d114cbb6080b77ba4cfd33aad924fd8590e3332c87a685a9553de6f31c3605d2bb6af6181fb861bf0a902ce75e8d0288bb69570b65602f16e974e1b4d3aa503476f8bba74c6d94a421388b6b3069da09255fe415d62b9630f91d48f2c76a71e94763354f8d009f9ced7e555036fbf1fe541a1b03bec75be9679eccd68c27d1035877566a8218477e65f893594b7f1009662a221e10248247fabdd546c587337854edb25c61a1803f3c52caf3d88374cd515204d48768ddd9494f45215e3faa4bda18a24b3be3cadcf44c63f12055357fe1fb98cdd3c94f7b728a7d3d68d39c82f59b5339643cfea06d9245e24eed151b4851c31441f2ee272c181444fb068fbc92ed835f802c43fef1854ceceee4f9d4f2a40ac0ac337c4adf6fa838101e7ecb91d18bce1077a3edff842c03386d3ba04acd62e0a4be0478a844bada3c25565eb904f8336e3704127967f34261fb175dd8a6f5ee043b5d3ce485ca7fec8d42ed7329997a2d7a36bfc91254a1dc3c053db1384dd88ce8029fb566884ced8faa013c05ed4934471c1f8913b5bdca2af05196f4136a5895a51bcb345f827dd1a9a6a2d3e1420a2a83d017f6dbe4df4dbafe68f3a6485cfebc4c0c1bb5fe9e35fa7e207c3e48cbb4d2689ab143b93524c2cef83dfa98a0f3a427c4b547c843c9689d587c619730c6e9766b16eab7c537647b6920d5d0a6de3cf29a31dae98a0037ec3e55fc923b24db8da857000a1e1dc32b2a268ddd0cde10026c20aecfb698942a5160adb750d078be977453b439f8f096002c7f788c01e65d3897e760dc98dac4be8c7ca2aa4437d13175d780b89bb4e23361ef1d26b69129a6d06942a7bd882d257e892fd8729d53536561719c256bacd2f94b10a2d95430fc510cb318d25c687a0e971ee333c70108765864bc137344aa6e728f0464ee2a85760304cccda99207f8d51f0ee328f99cc48cd0f34a4da6be60654d760c1128da163014d333f430e8abe05c522881fefdd41bf11e95b115ba41717511b39e0017239fbf19d109efef3d7c31763970c975dfbf4a5ffbaecc79507111d31941c4b4c6340a22dc3808fa5ee40e40bae746c708868130a39c15c4e9bede7500aaa20153e3df8424aacf9549135c5533cdc6a845f6e9c64699b14fa4f5dfb041439ca82d63d64b5a064a59f5ebd68d1fe82554d35c473705092dd034a66022f4a854ffc6ff2a577debcf20154aa4277b1f5c7bbcb53c525b09a76cc8d5414469947ec1276cc0303c2522b145bfe755c5ba041cf23666d854c13db4389ed720aa9e467b993f30b24f8f5c94b85d5207fd6cf5050b7ec80570cb0b82bfba76990ec50728f69c4fa8bb4c1ed82e60d8606f67ec56f75ff80c2de89db850e6cdc0126f299b4df8b4a392ebe607191d238da921fd57669a178461bcff5646c0e021046690c18709099f8617e16c01f724611ed7acc4e21fa292b225e1f48f4f0c3b5eac348e7dc1dc0f4971847fb2a4592f168847a34553130b2ebbf94a210b574d6e2a68981e39a5f7afaaad2c4f1f58dcb3977d9ae90b4176411e9ef5f22bb581b8c3c1a413ea85ca51a98e6133e69f4a26d8ef908f0a90ded5c2578148098db2170fc91df82a42bc13082ad984c4b246fb9a0604cdc9ba71ae4cd9691e4da80436cc80215700fd900cb3e444866806b68240a91dfc8cfcf968abf5cbf3035695bf99a2c2914e21238aee5e0ee492cc9e0a29d0cdbf374f8045cf1e9609850868901855111197b084718bfe777f628cadd7b1ea1d6b4bce2273d43040621e0bb65b3a3c1e8b5940c9dca5195aa6ae8983dba13dc760a122ab75010621ee97b0bf09c741193ca2c3693dfc441615baa8ba38d4e0fb0c8ef15f4e762cbe3d240c7d65be075a1da9717bbe148d6f0f715c7e09025665c6c9881adb7b50d5094c4fafbfb062d41b532b02a947fd0f5d63d44ee9f5761977ddd57b98447efca7f53f8741389056592190da64e12c73c5978d3fc2bc326578708045a483bdd8d540a2baee493742efa201bc6a5ca6c99321dae2fadcb9dbb53da6ca4a0976452141483cfb206209fdf0895f799328be0dba64290330994f44efa35aec0ef0c2d888828d38cb7452bc2ba2c90f7c871117dd24cf51289ed8334822df4d1ed825ecf571887a33b6095b1ab2732d5c1f1afd0d2b8d083c7a8b0aafd35e95feac382a42745418e33d3efa6d8b8680a085954031755920b3953ea66ffae7ad9564a699e29fb917fbebe8a980b5cc6bebd8fe409e398f41a721f676714c09169d5f69e51f89e2227409bf088b1e4d9b807a4cb3df40dacc5ece5c2c1545d26c9bb6ed1f9b69077c0efe16285c824bf8388e485af6db212b45c8af50244ee1d2f8738a82a19a1a7d96b5d9a2a163e194703725c691a9aad77dae1ccbf700767365732d42f67d997ebd3e0544c1a0cb941542a2a8590dddfa54fd7b23982f99b99023f975de541965b0ad6d18c4e0ff4c408400f0b319905211deb02854c3806ecf5952b154af92d8e115bb0df8e8c79c393ddcb8df47b1fe1a52c0b3a1e4afc95d42d027cde4a8828f93ef54a9fcaa6482d00d0319267c95f266497dd26021f6225b29cd7fc5c1c539d173eb497403af2a0de9a5b3c6edae28462477e527b182f3ce4626cb81bbc17b0bf027593b4108edb3b7d5df8f1d121d1840cd60bcfe1ef5c68912528ce23144660d2f11520f0ba03c3405706ef9dc45e5bcbf1bcb3a3e29431c30d099223afb798327111874d18e0cdd1361133e28cfacac6381f0965b76b44853da04323e5ba43d52a73fb6c90481315ffb9ec743c3cbef0588439280fcba8e6b5cf2df8e65cf9558d3d5aa78ddf22dc2a629d5439ea26f39e6a19acdb7ab15761607bd282ae3bf03c64e014974a9b1dd2a613d2f9e569d4b69bb0cc5583693f46daa8c5c6b0796c6bd6f483f440831fec071d6fad13d81fc39610b692a75114d075081bf356b0989cb15911138ebb3ff4342b49123bdf9cbe61b6c085ea71dc8c2e8fb71941b742ef17d33e8c46858363232961bc71067dfddd98a976c1422e0b1121cd84481a1d03f070a0f6c68dd95cc0a6b948b12951f9bc07d9a263e73fa4557ad0166fcd16428d05f79735245f3168143615ad25acfb7f34a4452c9bf1887102a5b1e8cbc0bbe95384480d680e7ddc10ca157c614b4810d88e7506451d9c3ab7e037217323b103a444a38e019dd44dd23f5f1de3935da758202a88c75a4293264937f4ed26547be8e414dd46d68e49e655a25682e265b29edb4bec61fa43842dbd95ed29eda39f9dc8a3ad732d99ce59a3200c77ae748575604fa6f389a5c4231e8a489af11778d0a59aab4fca26bb04dd0fc10a5111b451d1a0a6ded04fe749982d5485d3162a177f6a9e7b278128593e570a3bdcb8b8c8b436091da40c0a4406df4e6d78e7c463e9d1c13319af27eb24b73e4033711a6865f2d7e90290ca1a6d602dc49782a0f7bf522a7bc1104ba6c49a37b6073d07539e6de1f914ce3a356b551a454e60540dda31265fe8bac85ef9ea5631a94931c1d974ea12b6fb716f165f57fca43581d2e9a78d42289c2bd51fabf238458e5ca63fa0feaf8b9823c026196c1eb4aa210467e6b544eba5660512b2b1c0f13d188114200653193be9ff62625500ffde149e9e874311092c3543d627c16dd30dcc2e931f64c5ea2ff0999ac78011342d417dd9e62ff2372b30deee4506819ec1b17fc5dda77f5f47915bf512bd126d29dec51545383bd7df8a816cea13f3e90d9528d27ebd3115ed91d3c8b3f57ed638680e849f121a175bbdc523d5d0eb1497dfa282fbf7ea39e8dcf431379f0b53abb2833c800a7db5118885b3b594c0aef304729518a16a5c6e8561842dfb331b50d6e290962dd2c613613e94cbe4f30947a80e1bf9206ea722e13330e11084437c1e859796819b665c553a826a1ca0ce9b1b10eab5d3be07d359b64edc439f6dd245725861f158180764d86d11cc96160c7271b934410e7a2404346308c817d2e81ecee94de3064c7cbb9ed5809deb98e3d8a0a14dff7b2817cb5cba27393ec0b9a89d37c71f6b0b55c9ce1efe4e04593b8683f701c1eb4b8494315508ecf0269dfe82ea628f4a729c99266efead81671c3586ca4660b62a218fd8a3b435e9485d2831244464e26806c865647b7b591a9edc2bf1822e2bf9a4baeee5c8614f8355747fa95a083ec6cafb14a60a8f42ce69a31d693290da8d1bad7cb461c50bd6a00b56ae01e9c065f7f4608ea5e6a255504394772808deb7fd513a2012510a68aa69486bdd7afee3d5e17fa7637cf33361b27acb8c580304967453eab6e9ebb2542ca1863b5cf392fb756fb7e5854d4a1fae511b90b384fc1bd50c173d877bb488db330b9d349235be38e68bf17f93616c41e820a1f454364933a5c02ea5154159502d0d8214ae67ee6c3ef7aa9d9d16dd934108dcd3c65a3e3661c28993569d51bafc6db7d063be3ecdd159eebb7f07bc3bce8ce1277b31f3734a9ca668338677db7ec7616f98a04ce36baf8efaa0ac7b7bb3e62eb765fdff411586372a71c96e4c8ea8002df8fb522fdae4a66592f388abf2bdc58ebf5353b003efbeeecd38296a78d0d61d5ad168a230fc9b6d6d08c45aa0880375b9f70aad658bde570d3facb6865d8b1c61af57878ddd5807e4869ab762ab6aef588861b733f441495acd335a02a33b5c68135d686f9b46f1a3f5f33b19793c72437b94ed75e3d5ba6fb3e5b7dabb82086b8012182a616b9ee864452f59e8cb7a912259270857f752d3d73d6901de6ae4bd387085d88120dec3896d363e937bf60d0e9bc803ee51baf5ade6c563488d037f998765d6058faccd4c8cb0d83ee669c9b1e46913600676c030c59f372950dfdd0b0e7c1c83549a1a30c410df03d038bdfd3c8d7075dfe30ddb889716af0c11b3649aa26bc5a4b59b6f4e6f67c5d2cd749bb730cc51c81eed392cd6f7e8546082133af0d7fd3db90c75b6c03597bfa0fa4ea6f29c7a661e0eb01227aa87e0ad81d18b594751643ec17b8078e2daf76fa6f1504e6b20187f1cfdc700f523021f408ae0fffcf494a92cadfadd9f01b13ee9575e4490cc67ab9e35736b6e002c4b3d1f421a13d36c4130a22476ef2b9d2874543bfc8c22ca0c1e337173b77cb52346a73d3bc08b3c3cdda5b2c1c43ee5121cd4371019226179bd8233d40b77331e2ed9792dffdfdb22a8d6f6ff31e0f14fb3ed00eed68d2a604c9f858682abbea238cb7d759d13431d459001af21fa4e82169fec887eb18f9e0ffd0a34617974837e80e683f4149f30102df721c58e7c137868aafbdc0448a1ec536c06960529ff46c649b5e6ad853c9d26ee8cf068a846df89388043be34ad1b24a7ed2e290c8a20af8e51a894e872ba2c14a05399dca6d9ad5d0b5ad7205abdaaf850a0d667a9dac7340c9b88cf52da1b1575f4587b72c3a29d430a27e4593c72e1eea0f6451aabbd2eca4b2226e0f56d81d8a266afea9b7e53cb5af9d84ac4473a58a760f2206cec64c405cdde8acac30dfe8aea7bc8c0bfa97f8d856a3a08fe24ad6a6711526c32ef6bc33f7c79c7a3a17de0b7e391f227d41b880f301f60cb2fcf21191f3efbcb638663da5358d1b90014568b36c0da9606286d7fbd9bda540d72873557c7ac84e98d103e345bd99e6af10db9415ad90448fd381d6aac5d4ea78bd2d96b3c328e3b2370e3bb6c9b9cde528158046842c128f238b19f170dce63a97c2122814ac173f9893700c56bb6624857396039f6c044c1dfc25c74aa101cb04ab351113e19d845118443706bd151e60a55f640571005c03d98fa97b097cbb4a2db2e8d6e5a568f63ff33ee2a0ef86d375801a75c646ab0a184134a8972e18f79e63026022b61c48c70039ceabb2c179bf6122329dba4f35a69444ebab7f4d2ed028cf773a87fca48efa55d28cdcce670404c70d19983cf28d3268d52d66ed159fa509a6eb257ee865dfdd5b777fd45afa58bac213c877b71008a0c1392f6c30e908295607fac6994a952555650991eb943d49b9f4b6efdfc48b6faca5b3b05c835d9938dfd394fe82f0ba3886d3e422e5e08f004ae78c96e42a3c0f6a23adfcbceb6cb711a6339036f6920107de6c67183757db4a85c92737e41ebd8f5b640ffb2b7a73caabd656f084da7c11530698f893fb5113ecc0e2c20de4508073820d3cb4cf66b6e0e3a844dee8ca89580d8dde2058485fd862fde5c06e619b02d9de92bed2842bd6315a3a9a121937709f0385af1ed63a8af8ee4b40c1891f5c3f8a6355b872b54e55622a1998ff54eb6bcbe4f49c1d6c2b93e147803dc99ae2366f15a15de292a33b46c592e8055acdd5de2b3fa36fe117726f6c3cf8c2d32d0e78ec5780648acdaddab1461004ae76d06e753b41d28a64d91138f5431bf36e37d4e8b983ae0ad2ef05ed712cb0df91ab7299cb22b5fa92d062f713b4bea92ea77dd5582ac99d777d6e04a3c29bf9708d4530393dd312ecdbf5fc2eb02251aa53bc26414eb6b68bd8267b5957af91b65186b63cbb69e647fcabd4e29f345ef53aa256416a7b69c08575dba0a4d5fc741f909cf70a8ab6db386db6d01bf834681304dc12f0092739288b4c70052f59c08b8cb5fad1b68d527f81ad2617501612cef69c1ea233b018e49bb7cf4c5220d749c3ce57062b1f9e29196e1abb5eb83f791ab8346ae8d14aa4a0ed52b9e8288a63f748d8766aeb0020d4a744ed33555ce3372abc4c13a2078f34737ea6957ff11a88ab320e2506bdef874de0d1d802b172a2625a4bb7b08c2f7807ad3b23a55684d3b910a89d23a3d6e44dad204fa3a19bc87f008b281ea7053d63a312ed26081e1e6c910b0d7f92057650afcff72d2d9a2271fc40422bea0e3643e142ad8e979053e28ab7995cc063a2042988eca2028d438ca19eda48d05f83fae4ccf22013663e0dfa6b5e786dbd2c5167eabdd8aadb6f466f70ee6894d1bf7165003b807d1570c755237e0695fbf3d1d41ca8003654c4a64ba1f9532ade6cb3416d53e1a50c0a2ad7bed60c7c0dc9f7c05fb2f8555dd3f25d125d98cd61b194ca788b91a436f34832f3ce98411952c32b1e22cf1ff05d76a063ef90463481718856123d78141fbb7d75c8be1bec23c8eb0079676bb38b988ddbc35e41d9e1beb963fcbf9432cc759b346e9c1196436873d826b567facdde0802cc7fe85e8636551ef0b8155a134d7d1bff1ccc4d634b32d14549f3e2e4b33a8b7b83b40170f6f913cd235922797576904b68190d5c45dae976cdf6b2e539a3d442a44dbfa6981235ff8bcedbf3bce385a3f0cc4671644e69a5ecdf8714c69fc9d92fb5461562b42f5daa4622d88613a89de2b2d20bd3627c6306ff9463b6ac2821e94f4860ea2b51e5a3fdaed1deaba80c1c6e0b9d8a1fe002edf03634209e64d913815977392b7b5603955e738350d9df11e5255b98eec8809d085109abcb9e0669dd3546d56cb2b780fa96bf070dcf2412277c3958e8fd72c3dfc25c0d9c09a623539e6aa557ba277c44176654cadd4459783ecf6e6d158aac9cc13c822ea84c9d8d890608ebe131094c0459861926301decad6914c6a971de46a33960736be0bdccc155f485a0872361fcdc87b0e4df5fcdd63aeff8896a218fddd69de63195628abdc2aee29db9ff9c8e0052d54814127c6c725fac63d46bddc4c94815c6a7028dc20b82af12e7d437b5f7d0fdf9fc039032adad85dd432b534dfcd206c94a04429784872f881a062a705eb3e6c94c1d2f22c6ad7397aa98b914eae4e110812e31e41305139ab82723490afbdfc29094ac14c742607c0e226b2dfbfac11afb75c2ee314a932edfc56bea910b1a609a581d86d868e0a6292e79fde6c022062ef4d11f4bacd00d78579dfdaf3f3d7b906611f81a633e939d5e6fcf0e87bccead5bd90c754b03d0c941239fd498969ec1a0e5586eb7bb3b2767e352d318f1777d7222d18d3ff08159b4650d92f8216458ea00c99be8e1ec7e79a77ba47548f6a64f65a4cec7f6cd450ff23618dc8ea7fcea699b73e97858615f6f97649619382002cac81d8e15cdf37d183293244672c87be7e8b95c5f2377ff3f7599c3265dd7ec8dd07436ff7b8c2de584160e843a51e0f5e81fc10a4d03cc0fc18570db62231e6583fc683b2f5f330853206b28d83bdd320525ab8683b7efb0db0266961bca60083321811deda07e33a5a2f1b9461143dd8b93084abb10f71c4ae63001ad535390341bd24c8f20fdb01a309046e7dc7258455e2125005abb2c50ebeeed9289f357e10b700abbd9e716b09168cfb8742f4e06881a210dd3e1bd4a24dd9d5e22a78089844ac0d88a5520a720ccae06f60e0823eb09382398452f418308d4b9bc4aca3f8b6483c86a561e528699b3ab6fe9e6c1de880ee7b60d6dd3bdb4459854f90c969aa750b878270f43d496925b0f68b2eb8ad23bf78626bf6f20f73abfbf2b2eadb5d31844d7cbe581c2c0ab46f66332a1212fb468c672ae206f1c100c13063f141548a9081de0ff9b83e36f94915e5b0686d4957802c1b57a75ca1a3d863377739f75f6dde27d4f6d59538d49471ec27ae403da2063985daa6ba3f076d90d9408b0ced41d3d9ef6a9c495773b68ba40b236c831dbae0c4700835881637acdf6e3f9e8477a2abe94036a260af60f8033631cb060832c48ca335494276d62d1b16b00873f69828ee1df8d64d1a609425b75c40db28242318ff89098da4c15575099cad3688e397ad979dcf58140b88d26941da815aba20385fb9ee6a25e309e52f4225c7907a40e061d1257191b6e40ed3bb15ac7bfc4f33098b03be5d35667e1daccc8504e290775f6272f0f3551752c6647680a4e6c75098c248c9641408300a8d7e2c06a2c552b142c55391622d78f5a6e6bc9e97bfaf7f51015839e6b5cb632e559f84c53c741ba49861c6524d1d36373caddfa92aa26d4fdd2ecc9b02bcd3fae74c8ac079d08a03b4ff8550127f2cbf620420b25f5c5d39056650704c14efdd984d6b1dd35e55ca8ab991f207f09590459c2718cd69aec421759fc9e6f0302f21d27c6708d62adff89f599f9cf1e666853e853d6300754364c0856f90b893a82ae40e708cd670551806d3d0641b1e86a1c53bb438438369e8640d19ced0c5bca1befdb557771692d7935317b41a1394f22ef64888993e7715027df27435b69905e0d203600a3ea6d2218e94dad7ccc399e39e63a816844451ea1d88932145e2f124240ba70ac054596200e3eb6c3e9d9dc799f53dbb9eb3e37766fececfe3ec7a9e5bcff9f1753e9fcee7e77c7d9eadc7d9783b9f4fec6c9fbec58f88b31c05ce8c66319461b1feb075187636072d5e9e0cd2ab656f19b80b5fb5bf61baa0f82aa0f31f3cbae5c0c5f5eef9254dba67ab28b302b8f35b69b7cdc0c0b10334736a70b840bca60024cab4b3f91fbce25e0bbedc3822a1ada64d58b4abb6247a1ccf228c2e403cf6f95585f527b370db66e1846c0bccff5773889f636d2972e5793c63b47cff50595e8f247d546176c9911152e6c858fb75228f984f88e81b63f2efabad441d9d181185288c1605e23b598342a1d95cb636e5bc989e99744bbb8a313985f6a57a73ac4f863c36cb92d8dac44561f49af17a145bb838e2d919697323bee9ccab85c3aaa5c9e67aa3a0fc54631ba5a82a5212f0fb2f84097da371df3fa1e5f515c0b67e537459514f4efcc97321f8d69961b391ebcd517e207b990a267b9a61d14a8f105dde12550c88afe00eb0c67e861f55bdd20e6a38f97094b91e6d9a7732dda6bfd394f7adeb766df140a95e4db7291b9ea6c539672806540c70c69ea74a60a77ab7b72e0a0eb37aae52acc8430154c80544f8b015c17ae0e11261aa36be212702c5285fb260b525a850bb25e47bead1d3b8290f9e392af9877c3ac04fd7267643872f0903cd1e550ef885363470cb2a5eff5eb86b5f4a10b0adf1cf6ff083aa26622d4b91f8014a5286c479dd943fcd35925227e070602d422910d6ab284cc104dec59b0944766f7316714df2a1ebaf1ab1ce0a7776ee33c6237bad538af8698241e46d28ef411703a04ae6eb2a69b7f9ab0b433becc15a559838db073dc407c72670d3173eecfdd1e4b0ddb706137e6297ea4b4ac26798b8e868cfc8ada6d016e723542622c307129a1b3405a0f7392d50f78bf330fc4a85015cacedea9526416938d2614ecf594f364d20c09ac462bc4a513ab162d3c6ccf4824617603414304d63b2a2938830e2c1deb8fea3410532e1954706b0caebe86d9b7929a9b3387c8aa745409c2fcd4520390924793b159565dec2db130d6345e7ddd6f96643cf49bb580db8d5a3353d8e689e0eb206f8350368ed361247b965f8d773db845316cc85f3bc6ffc8030b03cf1b160f91af7eb65f74e4f3acd26268d629080199947000872c45e9608cbea7d2e839aaa0ec24375fc21d45bc1065a1180894689d96823fed7cf05a7884fc5234268a544dc5358f756e0d38651b4a2f2e4917ae571233d092553f6ce9faa18a326f24f464855a9c4e9ae6be6263116c0b18d276de597c02db5b5e5759ae653b2dd927ea074729ef0bd52561265e0c66e6b110a568a5b30caaa3c4817e67fa73cd06c294ed3c9e3412fe88219d0c44d91868bf365a7b3cc492cda949e4f86be601bc4166094592169e7396c0e4bbb9bc3313d8dd4d05824e6419785f95217ed95912d9d83a91e90ec0ab4cf5e8628f036184d6a0102da82dd53c2c399b221661ff31b75a92d0f51b8fa82ac4aee4d4047325c377169c4bfb00f26f5275fff00ea8c3c8ba3a6a9849ac1c473a4029ba47f0cb20ab8e758d50577137229735ab1d2254219e8a7d7643015ac11e40805a694bc71919e3213ad92f3c94c204c5629daf5f40311e5cfbde054441d335d2006d0c29450935d8948f4364dbd6bcc65f7eb5f37640cabeb0ee0dcbe9aefbd5808997342b2ccccbd05375307cc41496d3e27347aabdfe131219c39bf56526aaf4cba943f6d676453a74f508a09c6cb72098fa00b1a6829cf2dab28cc81808c8bdb723eed741d66cb7e2d3ad6fac4ea7cb5738caf202f0cdcef3521aa90af4784752c725bcbde6a0525a2c70d2b1b62258a9dad33a424d2f9d4d1348955a8c605ef20485cd4e3d0109ce391ea5ca4629c1cf854eae91a4d3425d6d4f1b8629a05f021260e858919a3659e41146f84455f68bb21ada7e1e64e9e862576009fdb295916c33e7e4dd901be67c37608b650251d0710a916f706d9e4948cd9730e2e088381078966d350659e02ddb5ca637f54042d13a13b7345be92854aea3b204ec55fd42bfcb5ea359a5d419241c54805f4ac30beaff5eff53c75e4b5acaea70d39784c51d63d30c9e0d60ffbef8cdbf0f078b6ae5c1487668af8408e2d429338dbb091b0031d3fe1d06404f04501ef1d197886fa2e88eaf8417cf1221c73c56fa1baf18bffb9a91a4e10d8b7b06e39c8f717781f07a27cc2615fb3d2bac29cd77ff5d08dd9c66589e687abbca754d7dce5eda7d7535bc72fae2f93a1d370a3486fc292bc04ea5cab4a52a282781bcce4bee322ee5fe4a5c5d3d93978706ccd5d1868c62ba744f0d1121ac3eefab6428dc33812a9d0a671b0298d0be8a930d395c6d7d1e2bc21bf7cde67df2985be5701be52242b3109b627f31373791aea684df32d654fb8c90dd6b1a791f326373275623be6455805da0e2af153dda1729ab3b93aa34606aab7ec6ffbb4b97df891c96ab7ef54762dffa6d11c6d885c0ea14bbc1f750b63e53e33428381a76ba7d143317509a10fe75b4b4348cb87e9b16cc89068e6652c1b38df46b86efa6e0b24e57328f132d06564480d1cb874f6a9fb82f22b5106aaa0951f8a3c08ccc7b959959d5c9828b103d5f0f67d4495caf8b4949911fc10ecca203e79d1c3ed9f256783058bbceb4363b58d19a8824a87c0fc6bdc0b9e6d2882c4a8feba7f2082ae504ee98fc87f2854318ac2c96d7dfeceba8e65a0b14e004a108b866257c8b8fc18d3ef6cb57d1bf212cf26c2d4e7c19ac6119eb416e6c50cdd48e79d45acf686374d8269039e579c1b8014060bb4ad97a59045d31c72e43e0962e93496e5ab2ef2a007df9aba767774b2aae659425a1f0e41e544fc066fa44f131d6424de1a9b688d0173556791196ae78d38d9ef8b73ebfe18b0b7d9974b4552e2ba71732616fe841db28df96a4a2f39cd37a524f5fd4279a1053390c39b39db07cb310d84d5714001a937a41ed4069a133d683207f62430afdb8411c63a150b452f740d8f70a4d568075fe9e2fa2147959e4fc7863e8c35ad1c00300877d157f6a259eb479805304b4292236c3b8f5e469dde60cb8655017b84ac64689f7df3676d397c2d999ec7dacd972f6e5f7e38451a43f3754dc2a2e2a10b3cc80805af41de57db9ca3375f87bec2cb13987675fcdf473b85d583daa10d52efc1a1c88d953535f79123987e468d07303900e5d46daa778fe28cf4f1c48f3771001bf9d0bedc32a725c335af4484e586688ea0b1f7d6f349c1c10c318ee97f4123ed492bb66e2111e71c89e1d6e824cda11bc1767b8c2542661ba85dc1c8851ffd2e0f15b5502c40d78d30eb8036e83f218ea0dd7ab00afa460e853090fbbf0ecff105a5f4fa0a77d43a3d5cbbe62eb01ea0652b33d92d91581514330e4f3a211ad662a767f75555699d7798a71c36e0615ab7d003acededd9c22e230195fbe01385f8a21eb68fc4217f7d6363c0228558837f9b0a564c1240f7813ce80d9b5a55ea2890d3a3f856d1684a1d4d09e46f549e62816c8d77702515b01dd3d0a175bb6ec06ae8efad720249ff99701c97ca190d43540e03c248a5724711374c40a241e3a5f91cc6d31502fa3f427085ec7e459e00fa2b34e7da9af1a48531155fc254df3303b610788755a8f1380dab57790343368bbd85d6942738fda4371470b070e0d8f26dc3a1ec7ee98e5237271015df357474069897f1ddea4a13305591a1177a994915fbcc105efc4c3456d0458740eaf31c6c3a131005b11a79ab5103911a0e597efd3245dc331ba97d48fdf1a4c2bc80dbe41fb722a203375f8c6239c5e1c752ccf34d8b6957cbfe4624b016ed45000e5d4d2cd1928fc366f49e0b4d2cb71f247a0d0e42ed96be40439f5afc76e34b7cfb1162db2f61b6126f2d4290797908c1d9a8737a863aa40cdb82317f6dae4d9bd5e715f4fee58aa22733c3060912cbd8b74180f8d6e82d59a535d41488bfd10ee626b14a831600c8cb5e41abbe7716c6546fbd7073f085268cc66b642cf5c33cb17aae6220ccaddc8b7f477dfd2909dc2f6d161b225cc5c1e309bc10613793dc39a98a576e9304e9a23cca4b904639ae50a98db5ccbe0fe4cb0e629eb227b1e96138b2272276242d3f3f929593ae79c9278e98ee0bf444f9a8f37a31a94b6808090ffa3bb7cfd75ea6ef12ab507bf1d8113e8b83905cf18d2b374214fb42a86296bf227765df894d35ab662ebabee18b8fd18a297ec92a7fd644483cab6514f030f5758b50da1906dafd273ee3272717a1a6eecd3217cab244935c08e243c394e5f0420fd71d91566458d88440507e455b2f18ee602414cbf3a4df70c6542aa9913f7cba6392dbcedd1646892755f6683c99caafe7f1e59ccbfd4f80add2704e38da22d671d4ff9fe16459dac3577edb29ac760c88f60aea363e846d7f323f463c197d5a98952510f814910f9578bde1f1e2e06444a138dad9af839492e5fd092bb0f135e2650ad5c9a056f777605bc6b71f5ad4e934296f38f251e795edb05047a97045c0ceaeb5dfe767c0fcd8b9bc1c0f1e45c35cb2e11cacc1667f18d875e015f82571290b6d8f849807c3f6d37439005a5b858c3d64ddaa61b539d70f3fab97a198e1d6415280afcdf20689d879420c6f9fba97bcd186f33bf744b37f6efd021fe829148c89be4cd56b2345c0188f8d65feb5d9905fcd8a9ad7c14ef5b24cfa6f6fdfed03f0c9d421c3d8a0e6a9cc86ed878b0d93e2e5d4ac560ba6d860fe464387cd7fd0a17a13a8b9b42129b43072f289adf3aa5c2724a90859a24754051b51410eaf4032f5571000b0c4481b503701081159788438c3e3f761e454d5fbc37dce55dba95e86d312f6e4bf9a003b7e72787a43042c5c2f76c03484d5d5d5ae474205cf2bcb168dda3ed87b57d767d4b8cd744ce92ddeeafd8232399990752c3e1bf68e341da2c580d477af209cfaefd8af338f26a1116e7adc47842587c86a44e539e42c230dfeeca2e9a65c5d5e52d4603aa1d88bffec235757aaf2cccc94d62349613e2554aff936f63cdd57033f7fb2c8d92512258f6b5b58996233a17f0b965441cdf5726289850bec64b3925b50b24338aa389c8a547fad1fa38746b3160eb8c0e27aa0f5f1ae4d87db138d85eae65bb370a4532da50f9150c242be39af80a2861a43ee37e2ce759e57ff02ca88bb9451f49bcbc94e398d23ec98b65d7c79f1fa85e715d0c8059e231c2ecc782d96564b3f55642b0c4bc1701925396fd2ab5564a83245d0babd2e30ca0b32bfa92f4c8adc81169b98b3086d94bac14ec97b9cac1c48f46a037bd5d994a284aa450035ad3c5a8c070db9a42666d39345b828bef3bc721911638de5281c7b9692c9c3d348c64ddfb4818aece5a5fef931175d3deac1554efb9f3061f590eadb989a7c8e3c8af0170997c1c3a654f11f9db9af51369a8d3b213eda96e064769da924a795f26e07e83cbe263446a3070d338df5f825cdb2a26cd9ce82f4b89444e4cebb0337adf55f9e483aa6648f6a4648c71e47fa48a7df28dd0ce0580c4253b1875cf6260852362503691abf471f06439fa9a3019277ec38693d2f4e12d9b594ed3056dd8a54c7632f3d95a5a52d5576b753aa19cdd9f9c0b5b44fba8dd80b8ac259b83cf8abc31b85f2322e6e6f9217e5001b924636c5a35d6d37d5af5d50d6f77f008a2c676123cae80deec8aa49edac8ae201f906eab5bddbd0d5b3796a580da3bf699fb56cbf9dd44e94712d17203199bd184c262c5f5bc1287265d9fb24a6433e862a55338b5cc9c01e14e2cfbd60fcb97a6e91fb4a557e711f7285a3dcb3e55fc9d00937ddd4eef8b9c919d04af5acba73c05dd73c3e51da974986a7e37d45669adc81bcf2fc75cbc51f4b96de01a6c0ef75ccac64b7dda79ac7b02b49a4748e361d2b3a3c8e06a27bbcbd42ca4dd45ea217cf72a98631780e63a4a78a8bf2613ebb151bff5613d69dab79042af10b131c5256a8f0f24eae959d7de94cc596b842112423d811c192a63640f6011c91e8bd1d3d11637d8b15acb5c189caeb38b1f7d9eade4204b8991762d5574f54fb45b47635ca4d962f184e147ff73a036b2d6bc7798440d437d0c2e642bc63acb1ab20e8c030d92a1df44fc09fa2417f526b6f83c742765f04ed41c3ef5abff92e7c4c912891a033e84769660041a80293da889a3aa689bdc57743b4453580d09d2fdf499f4a0d871f9abbc0f9377bd6f6e09df41e10345942574d8408dc8a976323b792621b4f5421ec675a87e467a274cd6960b590e324e5ab06ee6a30b3eb99367603190b57a7851fbaff4c108b5d0c5a3a6eb04da9d67772e40091f7d59d897e2e5e8bbce3058b48e72c0298c7fa2889e1af3689524388cffd5b9ee76d4133159bd51f9223fdf64fc9cb96ed5ed69822f6122f529b015e6a38f20e4f36111093541f315d28da52535c7e7e3989e9079e371d58d632ddcc54b8c24e061b8db9146ccef6683458539fea35c8e30bb8fe04eaf2b51ea86ea9656d407cb32f53b10fd5f31f234266c0223352d07b7ac10d9a6b26c9158d0bc53cbad8f420cbd2d82de2ac20ba5c884f3b7826f16a529e33232bcce881be10e02c6a2f51b48414cde86802d6380f0b4faa4f2e54f3dfb87ab0d9dbc219050e1979f6f5c64986e2f2ea7156788c87773ebd9d420c744ca064d0989ac7373faa995f19b7aef14919b129317ad619cf8f49b1087a9d84a4806bae606a5ec721f77f240d26831ceff249d0c922c98be2b9a85a371c90fa226201ce75ca490fe3aa0e743da18a712c630b4581f4a0954ea468cc94283e746c0c92dd902a9ab5ff5018a9a068d6f22e61b136c8e49bb23a216ba2817b99da4bca0435c85fa3516011cc5173c56baeca72a24faf8e77cd973cefc108f46e4f8fc822d08ed17cfab1ab5e030835ebf0496fdf0b1d04ebc33be85ba9e98f2793facb28f10e5bca9216bf07f8ad81a0946d0581467770dddec115a0045eeea12cb84877326e604f67691b578544302f57db9d2aca76894eb274b5178f0ed70a29244c038d3414cb04fab35ec15f4826bd09bb4008d2148868addd686570d0ddb9b9a0c46a2d3a0aa7314f5d6c2a821af4c25e1546bce6c53c408aa72471a2d044316890afafe2117f9eecaa287ab70e672885e317bfc45260526698056bd707f1939874c4c243ebde38596929f0b186397fa7aa4d9495af4ba2062e24e942f5d06f4e5f1d736578f0aeb2c4d38b2d17810137e8e3f0b3eaa3a21da9010deb6d6412298d369079a4c94bbbc016ec38ed3dbffecedb6c1753875fbf67bd339240ffa354a1345491da57b5308f1e19dbe74694fd08418a4fa460597718341114dfbc5d4ab4eb4568041059d40ade9e36e94817910c68f3118cf968bc4a5a68919cae9ec291af92befd34310cf50b72f2af17606e8fa8c1b608cac235c094ec6249b9fb8d6518078af5f52ed0c94df3383e792c15539c5c50d56479e5b512110ea26e88c240606f7d4bf51e79b48f5e353b46f05252acc4b7bef284f662872ac263e222a706fd88bd8f10141707c537f440f934011bc8a30710089d1e1a531b6a774d649f5df5e8491123c55872582112c1bcd5ea70c8d128c954413d3216229692ac55982a15a4b5051237fef233767bb376faf4cf3876acd88930f6dec1be78f70dd2ab6f0f03f8bbcd4eb4e4d968c10f49484d0160d5fd8698c754da5a0ab6fb4d103566cb8000301ce0e4e4480845225fb81278ccff1a8b75888e3b00aa719efaa68200be688f8b39cb51e909ab60c9b58a2682b7f77e869c7b7c399ade7f60d1e47107ba41b952c6eb87f8b55e73a5fdfb96263f9cf0f3166ea29c5be1c45b30aaed5be67f0d23b8ca4e5aba33db5014e142212c175f7bd870105509822b46c8741f24af6a309d0b32a279068edbbb58ec9a0c3a10ee726c04ee9a605bff093639f388addd1fe4186290ece811ec01445974ccc2a751c870d201d244b08bbb00de5b4bfffc2b7c6d7263ec10a1245b521b5e04d4c18acd382cb9477233f40aea4855e0385350570d7632f76dfea0dcc0e374d8322e71b0ab81d00389becce5fa196a26c27b74a24963393de7381b6dacb050e855cf721b048761291b4f899cf6c3d960e1062b12991ebd5de18198b045ffe4bc3b80fbf17a62599921072f23d532c58fb713ec66060271a1003739026f567df862e9d1760a96b6bd8f936b8e7a52c92f9b058a7ae686e998a02eab16495ab44756966610f0621b452a3b32c4e477403983c403d80c70ff55f777484a88d17264aeaee536a6f507a1d1c7190407e9917fb41903de03fc996c7ee152f92f87f097585437bedd0ea831102a8699253225eba419752a981770ed5ccf45ea1ec94e01828633ccafd0c22be313d82a8e4971a8e306016a5d2804488a2bf9a4c981cace840984a3d5a27cc160e067688b7bfd0c1ddbc9307bcebf04a400f525277ef9ccb140ab10c54b816b86473ab51a94c14c3cd885503d806f733f1533da504e41111b2610bab95ef2e74c934f318e9ca2b0dc21d8f96c89a17e8a814f88c8f056ca9a7b7906527fad68c52739fd3c66122215605b51b63efdaf592731994167e54413744cbccb47ec6044a3589b3eeea93d5050f7ca525f5048386813b83abbaa349736fbfee644dd7b52b89eeaf2eb49c204d093cde611f788ac52d292ac8870eba47f0282c6990a6be104ccf93504f12ac0abe08f4b15d650583484c4ef68f061434f8d97d9c5f5dc183bcfc13943dd4df81b97a83181f4555865773af91bfdc3db04722b01ad0375c6d26452e2963bc5c99d6b4772a76f801144757bc528da9647cbb2c145cf7adf9082595f3a2c8efd8b043740a3d2071b902aed747a58c7dcec28202b40b6837416bcfcf008b1a6ee05a8b06b38d3d0ea79a1c4381ddfc3ce2156f3a39cc005e4e4239bcc1f5d87dc0841e8908a7a8262a1407169f6d3406fe76683cd86e3a9ba908cbfb82c8f28f42216fec5c4cd164933905f6a3edbc9f11208fff1088c27173106f142b09d8bb433782169e4e137089bf78560a1146c88f3fa1ce28b16e5c26abe02531ed1402ecb17fdcd3ddb4b11b5323e087007743f797548f26c1215d7da823bc688e19a33dfd32c2d432e2d300ab37566af9120ac26a706018df195ab04145f36cfddbc41921344134051d1801a3d9a5bcd6fd29347507a34d1639461bf676d7cdec34b34d85237697ae7e8413c6d30dc936c2489e0544ce396df0f2974f060d890c9cfb878ac5253528633e0b071658d1ac7edf8a5431d233ab0f8692e7fcd9a9ec6e32fffc3c2949b205b8dbe65f308476443a2a1631046cc7fbd70e8b8ce028f04387b7b72d12c207e233e9ae008a64b7da52f2cbf15b06cd3bb1d3a2e69464fdf29118c059ae064ecb12a1c6d36e5010e3a638f182ceaaf8d89c7c738fee90b58a527660c5f591d4db7d4e47ec323e5a4d248c93cd0dfa49c8add83545852739d5ef57d50530bcffb361b7f2f08a2d58a4d13d0fc3a47f497ecd66545eff20d9a4ea7e8220cccdd2e4abc0f41897112132c2409397702c78edc56d76c64333339a1b233f6af63734840f129942e3404a929ee0215191f79acf94bc103f38fccff7cc2d6ae9eb81ddcdc90a27dfd6ddc38a6e2b18c053862cc8c05671a158921cd7dbdba146bab6535e5e3b6f6417508e6eadef6708880176ba5c9ed0ff1d374a6e2fa150ac61f7be90f30e665ad28ab2abf0d3645388761d81433bc88083c217915a95693ac322ee824845b1f7f1937407188d290151479a919660dd63dfa48ecbad2d30689a66d7067994cfa3a40e7311345433bca218ce7067018ddaf733f6d908fad2f30fa1ce1b5b7c807c8958dc8b6583b8744e602679086673b3a1405b98419b323e58e640ab5973b45b0195f5041e492a0856144f454a96390d7fd130af81b4ed46374c4cc02cb3696e1c68b2e5459b7962e873858a93ee1f01ab5b901d611f6c21657b0134a6980a5950c064677174583aabd5f73ca5986724e2f484cbd90b2c46e6df2b2a132eb2e64aad607a6a39fe9d31dc7e5471dcccba7fb5e047325d61578ab8c1439a5cb182d3bed936a8cfd54874dda976813a0f704aa6526d56fa9b5bbcaed74abc1c004a0bf4a2ddbe5b256a79d609cb0167ca4994d80e08e21221abcab7b16b55d561cec27ad59a72a4ea24aa130f1d69b70a269a1251626fce4789d2816732a173107f0cbf95c1218a8aa8e20af64c2ac9c52a63ce3de6284c651a41f31b583b1a2af8c9534b049089416889fd1db4caa9847fe222a20005e9b65bcf15117ff57ac2c75f6e0f0262b9181ac677ab4b5065d5f98e1eb4cf4470d3720772d7d84d0501429927a9e510c06dafa3d7de4baf19b9bb09d84cb5b8a3fd8a35a55108f73d9a17c93dd6e58763bdaa07cbc2d8316ce5378b15a21e603b246fe9088e7390eda7214bff9e8cfa8de8166cc45919929a38cee8d30624e9fde0b8264fdfc70c975705d980327c5032d502d51fb9f7c82da5320a84153b847af844f5a09632926749f64d334fa3f8ff6a6b9a90d2f9a0f93ff913027ebaec02391edad386eb1cdef3862068eec30ec382df2e371a7882ad269de806e2e208e43b2c8de983c2efb966c11363ee16886b27d1525cb2f0f00e11358744e2b6c0e2500599915f0596b062775cbabb32e357ec19142109ad77507e7dedb6d3048e618d3337a4a8bc13e19c9e5f06184d80132dcee532924cc0d05042c8cfecbb8bb3d30123503b5b98e496a7a36671462e013742f0cd66b8d4a738ad84659a926c9e3d736d058615bf156661d07ff88ea5b3434659cc4e2cc0ba31363bfa306b8410a2d8e2b98274a22363933ae636c8bc4efbad6a81c94e242752d34ab881a24c03b35f07e99edbc9e3b04598f42f68472ee655e04328385a3e24c3bda7de598d70cd711ca568229970ff4bc46116b8acb31cfe6c7bc362aa1c95046d8732bb97b14785c67874690cf6005a63bc0251c4d8ab3ad0e6ab921445bb351e0782ab0da2719c5a0f7c1695ca1763a983dcabc76c39b8162120320139efc2f85293b57d9b09086d25b7642db4724049483a04a49183ed3a764ca3baf574091858013aafd8c68229db99de0116c12577ba270df7394ff910bf03fb4cf435ae578792144d1c8a83245b0c4f2feef9d04bbf55b5f0afcb7be4ab3156e91ddbf812283029ac2987fd22515e4957b08d8d041116319e8c1f979816f5b726a57cb20b660a6fdd3ece025805047eeb920ff5a32f04622a39f9ee24e6f38bcaa8bb6e2d6169116afad1106ec6e0c44fc072c17cd8149f9a0cf03eb6cacd22c037bf44c34fe83ddf9d02bd537dea673925162e5a9bbad008d79cfb9c08bd5be3a3d06ea22babdda051481e7ecf5a3e184f177bb6d848035eb19cc564df2339aa9c5f98849eb418f76668c466d63fd196129426e99e85a74564ddb3cbe2e23896b882f217d8ebce791730c686dae409af3aa5ed367ebbaaf19189453eb61fc2831f282857b01e86e81abf108c67fb17c8c47b601dc80f0c716a9437e0a80c681618be58a17cc97b93356a54fa6d7a3c6aece2eb718774ad41fa7f693fac4910aa4d003ba73a6815c305032e21c596c8eecbff3ff0ee7952269977f3be97ec63ff200ce49d0550f2f883d576ee5d9477c2704b2cff03eba9705746bc2106587928e25e55920230b98c05901cd03814a3c771224d2bcc623e9080dd15eae5dd9bda54c49064508ca071c08a6074bd86a69ddd3ee44ccd1707512671c343382f20193965b751c075367d0b970b4e0fe5bab295aabb8d9dbf950a27bc5d580b84aa3b9ce07b5e601bfb84eb790ac2b67230de5ef8309ec561ac7ffc30104478be140a33bb652ff6eb3431e1bb310bd71d2ab8875ac9e9ca3dde0425dd7752247cb1efe205d81498e46a3d168341acd03338c414c8b157b78c154347966427764f24e115a545a72ac69943b172ebb0f94b809fcc1a5ada38daf3ab2ab663a749c70f66c3c9c5078222f96424f0e1ef8dec300bef77d0da2f043b1068fa43319c21a91c89c02e407ecff4c32984adc7f9c584280f7e0c320fa4ff4a02812bbe58937354cfeec7be84c862bce663319cedb864aa5f21886502a7067dfb6ad5337288df763888f231a14e0fa248d4a946fa4a1cade651590187c942108d5a51c15d7726ffdff84d09d1c5d7dab228a0b4c364d28d3728881c976755dd7e3c18f1c61e09eb5177a636b566c1a2d0b414ffe62d35c341a8d46f3d81d630c346add6addea775d77490686ebf76f1606856ac1f774a7ee704f5f6c9eeeb6a78ffaea0b313cd4dc35d52d8092cc20657fda45c7ac0d928516d94fd60710be544b76d50b74a779fa1d01a6207ef2dfdc9480c6691c7f1c163ed193ff8de28eb12d06df07d35eed0f9a9a5b6dc560188e46d57b34fac2518f46a3d06b48a94d121824d160772c6509a6621518b449029368461001b691825d2c95606030eeae27ba71e3c68d1bde5726fc61c1191a1a28e327815dfc94c02e923804246edcf0c0830f48241040c081a354aaa901c0e8031892e3c0d1743391700c083235b5a6c66bfacaccdcc051aaa9a929e5d05153030000e4c8a143c7bfc9646353bdbd1e600f5375539b40c8814347e96b4c62f51675e8f837994431041b9b114620a1e6019043d411824db5711b1b9bb631853fb04df8c3ff134184114820611c4fa71d3b78f0e8d1e326ca0ce3e0a072726c4e4e4e8e886d46087f801d5bb2350e41041b1144102184116c4810611ce144c20e1e3c482081041246e7d13c369b253b76f0e0d1c37b748f1e94db11fe00f18e5085ca83478f1e37259480838342e5e404200026f4006f6ec012701aa704b084f007aeb6923e222140c12e822ad47c7dcca1a9f8073d02bb68c20902d049a55224589193f324588149f084ea4d471021c7262704d1f439393a727272e4e4e400a02627a784232747852cd58bdbd5b2966769e305db78c12dbae0634980eecbd27bd2155b7d56f75a76266b59d29d51027cd52d333059cb7ea24241532cf4c9ff7a38a63e517fd651d01b0af84972c115de0f1c2a981c0df082025820d118d878c1f56bd949bad5e7d97dd66b73ab4cc4828fda60791b9b25b891f454faa379bc53a69b6adbecab3c2502adc705215aa8b0e2312eb2d96675c86b73a1fc09aee33438223b6dcc55d479027b8faa8ad74f2a16a7447b30569a2ec00985b53a629b586265ad29061780ff67adadd8470e58e7074045962c7cf8d862f0514a29a594524a290da23a014569adb5d64aeb9619964c1bf53ceb59cf7ad653556bf72494eaac29146a1cff49248ceb8cf42d1d869e581d4109d102634565cb42072b92944992eaac30bad3355653322f34c3b45a8e79992729ac4e510426ab956aa506796ae65dc654b23fb23940b8bfc886809897f920312fe303f332df62108c451ffc31ff99389689fb6a1511d0a26f938cc93e5df9f8500922f331a24fcccb8825f0e9ca47e64ba0904f2c591101bd12755dd5982ad612c644a408dda98e82d354a7a037f5f4d10535564f2c320e19b89e18a06bd89084483d69b69ef5f47ad6b39ef59c617d3e92512f64aac0a7ce049a42354f0f1e9814d951b556f7ca6df6698f77b807c63d6032af4b9dd42abacf809efcc770da14a0274d64d9a9ccca726ef8ad0be25e0ed4ad52368e321a5a808965fb2dc0c472fd5316133a61b68ef4c6b34c2693c95ce6b2d705c25c62369bcd6a0a0467e06c866bcfbc45772a7ee204d8e1de992bc95ef2f848d2eee08e2c18a64b57925b3d7bd2b329c8fec982b94c829dc30e4b7eb2348105c1e5077428549a48c193d96c36ebfeb9cdfae879c06cf67d111443194692209c8c614509aaec70051b3adc30860a4eb0443d2b14b399cf7c663ed54b8b7ef169d6141f7de8cea8cd52bfe843a5c520dc5fd1e73e27b60ff79d8864d522898471cbca7af22007ea002796fac552070983dc4ef4f1f99e4a0948f71d12212c814907f27724e84e934693cf94ccea4d0d937eceb827af165a4f9fb845245e16549cd8dcd7508348e49ea4302d9eb8c2164c57b54567c6c0e7ecf4a159fdf12f0d76ada69c3663e1592d6b4d57ac9697359f81d005cf6a8a8624ac48111ac10a8ec861a563cb153118820a239c7c002693f40bc73d8ddea4e1331450c8c9399d7c56dd67de55e8c9bf6cb3cdd29ccd663ef399cf7ce6b3ea21b11e73e5c2d067b1584b569df2fe89009551da10289824f5d402b86c0813df0e10b8b16012bc2c1b72ab80d24b1d8a4f4484de7c446aca052e5760cf24c572d3c60ddfeb7eaca95024524ffee42812bb10e1e144a679975fb0bdf7deb22ccbb22c4b3f3b2062b198bb5fda83de780fbae3b966b247ee32d0a06af4ac791ed038fe1fab6364f03c8151456092d2da6c1e99a4347a4406ea20d867a281ee78cd237a7f0e88c40750197c20d32cf48620f20f037802b718d372c5081dba58020ad0172b2455d28082450c1f94c862c44a842d829042091bc43822c90a0909d428412d8b3582a64063e5dfdf83db68d3518b3125c0f5491a03562b833b70806d267b7c0f3e0cdf83220ce0d37a02458c04ae277701eeeeaedc667b1ee083cb1318b00c6c33096e5b531d72fb927dda3f7abbc1e4072d9c50c105892ae8901ab2285990f1c5122eb8e185174d04f112a3d56ac09625b00889400736b4acfc37d3a3543f5a7177b9da950af5acdd6a2306fa18844dfdafe96b20d32751111cbbac2d1d12607006f7426a9afb8b988af8b8bd677f6ef32aa40a9aea939ea4a0587e541d29b83e496ab55a2b78b9cd2cb8bb654ac14792bb3e9917189348e3e828d438d26e20ba33faa9a2c4091a85b54284e0c8a101fa8df88805eebfafd7e5e20477f691051fbbac75b3ef995ae87619444ffeb03206b6094cd0429b500bf56f3be8b9f7bcb7e73ccff3ecc1e1bb176312e91f55ab6982808827b939af2ff57c554dd3ac41a089aeaaa805ca93810759d0148b5ec1200b1ecad5914ed2e5ca96d5e8499592d5914ec16af4243dad7d9939c5c7272f1fdd7d64f2e9d5a88b8f5e6a8c1f86f0c1f07128d215d775a92db1fef8f889bccecf7a023fd3bf649eae4a2d23d600d6402508f8187f0de1c3c03c5db15a18e622f9e1cb0b4a0b8a2142d084d5aa62fda92c16ed277cf047ad572492d7346baca78e4c74c599c87e55a159a66135d115cd0b93cea49a3efa45a29bc75979dbc41ae4a37fb5e2a337711d6aa563c2247cf01b108aae6ad2aa79650bdac0160dec3a13677a9befafb26ac50ea1b20faed4d3ad7e3dcfa39776b4ebbacef37aaa47bbcef33ccff36a68dcf33ccfebbaebbacef37aaad75df7dfd12c2424e422f3028542b9a3c0066d9cbef4d29d4abd46a15028140a25db58be6d34603dd5c09dc99accd5803435f6a294fc60a160b1582c16abb22aaba6288b05c250ba83f163fc7de20fdcbd59db75a6de3e91280c4561f835c9fd944988005fc5880dbb98f4a3c9b3b52251188661d85345dbf546a3ef138944a2075b247a1c866108bec8443306bfef8a4461f885e1d7581c75ac6158fa1379b7e3366b3e505026bbb29cc7c58275a9e1fb5725ae037ea25b9f4cf11ad22dc6012c2fa57f75f957967f6df9d3f0060accaaa97ed29a525a71398b44c18c6848356f33b258f6cc01026b9de4946744f657e3bcb28f17dcddadc2bddfc98ae923158ab304bdf118bdf9426ffc3d93ffa4d03cdd22a53864b391fdc5369eb4ea140f60b20ee5fac553ceb23f9ef2969f7c4889a7bcf453f36c62b341ab0da84eaf41b73ae4b5a14dec32d9b5212b764dc655e3441f1f9b65e4148bf8e84458fe9ac275fa6b5dabbd6aaf9abf6a1793be5ed2b52f981f9e207c71d868aa5370a5d66aadb520b001ed2c28cc934e25bb43c94e04751eb2b3217ab2bba08119d9bf5ea982af18c15cba78f9e23fd8c413051ba929217df2e77e2482dccb2512c9eb8942b52b52923d79c175f4582c168bdd16c95a67188d987c4c4c522107406002428468192708d90d18898d42709ee7799ee7bd18ff9fa4a7bff579c27278c191430cdc753499fc06ca11066ed347fbb093843b0ab200d94f7ae33222467a2895c9869cb2f33ccff33c5f1e1833af192794524a2b6c6c8c6118e643ad20424a0e5647b6265baca8d4eac5756433ba43fb2af0cb7538ee89e8490e283bd92f98c75fad1536c35f17f3d19f8521f7573155c875da7f233fc674eb297c6cc2f5143e8c2964a1a6e88ace0cd0c2e8eb83ff8945b6064dde7f26ef39201f5dcc1df7e29ef8d8b27e7591f97805935d594ebcaaacca6432994c269b79850e32a9f47add7d917729a594524a69d789ba4ed47535346dc0507b459de81621d25d2712894422519d8126d7ce13ad783b1ba799810293542845d3ca9d52a56252992625244436a30909993242f6ec3f0319982475cb865835ba51a871fc2791fabe80054335581db92d2e2b2adb93a4262bf2b3635a6b8f90cf5f042885a9300203db0fead94105dec412b5375b30d9ae219c1ce13291f2087ab35714e5293de5d1c7e6a1d652342e407768694da37c821139d849b2d5ee9f493da52c1a6ce6f101501e55e3d09dce37d95d8c65d247bbb6b7a6eeeb63ab9bd7918f138cf0c162b1582a158be599dffd13ce9ec94211258873754d260cade814fbd65e9a83c2a5e71718b502aae34454bd94071898ac01a2042669683ad3093ea238187c3cae3c1998d67f2c315ab2df8b3189f44f29ade3f8df0e4226a9900a881095aa742768aacfa027a73ba010d40669d0d42d024b217995ec6b64ff1d2dc0a4974c5cd65623453a6b694015900f727b0974b786710d6b58a7aee84cfce4df4d6971e226523f7989052629cdcb7620101a88faf8c9ffe72a29298dd24a2f6362d5412ea8d8acc7fdf6b4d2af7eb7746ff73d5c709dce4280b2adc9d6c656203a574003bb82a07c3beedabcbd512cc7719ca9b9ff38ee33e0a4056472ddba9e61a3a1abf537b202d96fe41a43c7bac5b4637a53c90b782491ec2e927cb4d8c7b7344e8d582c766fac534e043d7993eb4ddcc3f9d21df73c0ef4ea7baaeb2ecd63de790dd501dc2ff0e9cabdff60103d28d6d0bde83f9128e6e801938e45c6097cbffbaf45c722d6cf0386636e972ceb4c1e7b35f1d1eb8d17b64f7a130ab3966b026b526ac0151bd0af7a3addd46207e8295e2c6d4fb3ed5a59e3bedfab0967ce64653e8b09c9e01ea333c74285ca06a63ea6e0a30c1c92cd433374f0413c6045a80729679871ae4018a2872c51282134031dacd163e5ee267af247f96fa215abe863e9067c459ea53722d1cb52421398ec974ef65b444d1de993f715b7d240c8b05009556092ee208bce76a479825001840f3ba8dc6691e4b0248823afeeeeaedc66453d74d7137d200a358eff2412c6b5d610fc44dea53d2ce8a8a24616ab233e7ca00268d57d2752c182495a3352535da905ca255b11fbd82cec50d20d0d37cb888f8ffe385b70adf1b8025b1f4660f21aa96deed13c08788b189ee1e1057f1e1a80fac8d3045b914577dbbf774bf1b014dbb63dc76ddf3cde7a1c1d60b259428484442a986e81e24aa619e809dcb9ab60ba050b0a58fe43b6ef3ec8f63eb86ecf893e5714620017ab55421b988666dd608312158b01740c9a8610a1aeee4599a1cda0318eff9e0a88289354c88a54354557318df377efedba582d8b543ed4051ee0f2b33ac26d31b40aa96906d19dad4d6b9adf0f65ae665b2e00ff8f565badfdf1117cfb1f68b2add09a3ede5b4f2ad006d593bf0e2a30694b73abaf82b57fc16f076de93ad5dfba480bc47d28b306263bc6d1b821ae16c3c28c5971f38a352b17aef002cc85408a702fb4503535163e9e819108f102538b1fd26063074e56fe1656533f904801182e2f6258a9ad90f0d0450b27623ca1061749ac36f0ea40104e92c82007b1957f17727633512045866db68c59d39aa6699ae60ced7319da90213eacc0fd3eb6cdc7e946e66ab1eeefc3d03dae5f06a105988811efe9f6ddc3c0bd27d6709fbbcf7d0ddd6f4f575f839d09c9ea9a4a2d9610b0fdfd20dbeddea7fbed91ac68484d633d59f1574f838c49184e781125892a3b5762ac2f3a6069a38b9583d56f6d4636e385b5d65a6b5fa0fb47a9d0f6b22f557da95edd6dd393a97aaef0420a142b9f23b4b6831515d11f4109e1450a5654b817b2d60275d9279ff90bc3b1d2be5c87cb30a3b71fb3061e3dcc93966559351563593176cacb5eb1561a665492eccb02d9274343aeb3d53c453303f3485632339d358dde07ffccb71824e6371327e3bacc781f78cebc8ce823f33e335f0a3750e4cdc8883eba92a9b1da4528b77db5699fd897354df6f5c221c3beb2dd8668258de36c1ca1a4edebf57a2951625ff63523037de688733b1f4bb1b69e3585ddf1597f04c22515ba5cdfcbe008843fba33dace2f30b959d9ac6c4e6c29a0db950d8aec4f372bd97f0ba23bf57b985063f3e4f8932338dd4e8f263ab753043b73e42a8e6af4c6ff07115804ab3e7a79136f0a262647d306446fbc6ba9055202d96eadeddcceeddcceeddcceeddcce4bc48dd80d2d65c99535c59565901351b860aeeed25c9ac0a47df96f2e202b7b16aab4354c839da8a0d1e480b8927371a5eb80d03c5ff6e79ab8ceaba6fcc7ad602fcdd2b4a5596ed6c555110b3388deb83b612261b6594fa5d981208ee338912b4b40a3bc8da305935c5996655996e58d1808e56b90ea90412a147ba0cc9fe3f0257f1544237f1674d30c0e5cf2b7816e2af9e3649ddca6928b948b1f1c64ca050e51f2c78da0c908803ad0b12431945d2ce2f907bdb1ff5dd04d3251f2e7816e0243903f11e826999f56fe3ed04d34435914b6f881a09b4464e42f04dbe4de888e4629d01bfb616e13e5e2862eaeed969f70a82084c96692e9cef676ac27fbf6d451f9683d80bd17bd0b3d29b00024455776b46f5bce43757a073adab75fef60adb789ddfd369176a2ddc1fb4b77b2677f8b7741b65764fb644cb6386cc0f6bc261360265481ed8f3e36ca72a673db40a079cb768b1840d9d2211ef2c7eac24426a91018b54cd219ad96ed6fde17dbebe284b2f5285f01b26ffdd1f8d8d99454186ba8822a777fc30d59f49cca471479bff7f16915b18f4e23f228d8dffbaeef664d63be77e301355a7b69c775dc78026a1cc7d1424102c408a4000111633851050c5640cc8841079ac8020c22b4386bb5ee3606bb02dc3f70f8f989c1fed09b1e5c9888b74c5b26427750c080152a50d11b2798e61964b801fedcf762d27603450f3f9da0f24c33aca5b85b96087561db6631fca0f4c63bd2120e6bf9d8669ffcefc5d58c759cf5d71825d95f68ae437a93da90ebd4e78982fd53b31ea23ba2f7ca03c5f1d97b2249fa482021931d9bcd5e628b954405b789029a49031298800db3668a616e31ccbc044175ea1674468ada3df4660ad8ab767dc4c4fde05efc0118b8be8e1b6aed0b7699a431ebf762fc428da8ed43a9e80e9220a2b522719721c50a0583fb892a1d7a0dbdba980822c0f64da2fc6da0111f8b3029957ccd42a96e84818b0cfd70265e1ae18982798ec064bf7cd880ebe748c1f56d27dec802775f04039d27ee6cc119a8d9da2f59513424fabc7ad7d111d8bbb9c8930dd05443a1277f1b1b0000e0c68d4cd2a1acc20bc5021ad82bb21199e1d558c0bfefa7da57b09591ded4173ab194bdbf9e581a7bbc8fb5d4bda9d465120fe3c9862e583f50a105044d14f101610bc65c00614681f2ca013d8308237248f2c3972745408165bc7c6d706fada99ba7b69185d01b06d0933f9db541538d32ed54b51327945e12649d4cb6138e1239b98d74028974c2795e2f2f27b48da6d55ac590d2a6d594aa5558e88dbf4aa5e242698d4555539d46ed354e5615d9d9c0649762d368312e34d5f7fbdb0a4ab7501fdefb77907b6207e52c2e01bce7c42e178bec2217a79534b169375f3012de934da3d1bc8860352582c160b0f6819efc85b845601aad69341aada43913188c06a3c168301aecde178c16fb170504152f3fbc7238011b2b7f42cb08c4f8a2c50d35f85979922fce255064f081202f560fb802258a2626c0418a1f569652ab0319b8ffa7601a46630bba93a3cbdd439ffc6f14d88a2dd93fa70a26bb87acdab6add6faa9805471620667d7261998862237d35004e72601bde9c1cc610616bd2743ae54d42659c98a4c422a7a96ec7f63c97ad68a41bcff449f5b4ffddefb8830d095aedab4fd0b1496fb8a64670bc89067209dfe3861f4b8bd82030426bb0722ad0329d7747015902afdc349f4363df97b5e4c4cf7609aa6d926111d68341d300d63a0330d3feaf79722406f288a06ac31d09b2142e012f7b49442a986a606407d947c947c9438d107bd9191d1d0b81f2ebef8c9948b193c3121532e64b45ccf7a06e09378f5958288fe9bf96c5a64196375a47a5951b1a22142847aa83dd09d2e5d54d4d0056e0adcdfe33534e821d317e0a082ec9c3369d70e196052b56d997cdac50b6c9d06f4e46fc6b5011bde85def837485363d3a3bb9a9d8fbee8b22cbb2fd83cdeba81e7793b6e807126c1bea00e9b92409ffc4959a8b8f40b22e81750a87cd1a51198a467d8fd8e1be02f93e001445bd882f79b486eefbdc8c41305dbb004273049cf7ef908d43fada45be5f9c47cd9df24d03c3e1ac76f7260832fbe099471aa71ea40025f649fe2cb122c6782c01eae691a1aa5975e7ae9654ddd8bf1ffbdf746bee3fdb144a1c69144baf7de4b9b0d1cee972fdbeddef43831626d5a6146617a59c534bb756fab95230c7c4597791717bde9cc0971f1d15f88981856985e45ca594459c5fb3e647ff26c981994ea2a66cb6c9965599646a0b0832db669a9d56ab55aadd66aad97da5a6dacd52cc945a652101f4ff4235e152bef91ac3e530e2b2b1f91e82595ed91acbe06bdc421042e55955607a2d5816a574321970543ad8549d56d1638906a8abb00930e94950095207362ad21e13d1745ed59294fac5ffc546b2fbc894fd69a0b816d095460b2d628e5485930596b1955ab29ea5eabd55aadd55aad6db16a0467724b6427ade7fbd5137d6038b2e6354391f7959a560ad1567dc60dae0072165c59918ff2029336053a05aa098cc34712d85ab1a60d5a02774f6d9037cbdcffc5589268e33435b1429d8169e36c48728b2492dc9ee8a735fde4daf33cd1920e238d64b248a531972bcf406b2948c1dd936a26c7ecf5ed73fdf7ab154b0668ae7e063a8b726fd6344dd3fc6c4dce0465a3511e3bae033004fe4cc27821b3e4eb44f24473b27f8b240af4d44fa96316e75606e612b1582c168bc562b158cc3f0f365fc5625dd76d44d0934369d24dc6c034931db3db13d7e13e75859694a824a3dbf09994069e81aa92c21c61e04ef4973f11da6896796113bd89bbb6f03249db209486d0ac63496255a80a09a137fe42b11898e55e8c49a4ff1185baf73c4b90e17bf6705d38cdd100614621f8893c18f18aaecbb543866f3d75b7e7fed6bd0c5ba068c01ed7d903d2d4d86c4eebdcc322a6a52cbb2cc12e47244665676b8e25cf1898ecd22505db2fb7eb3a1fec2e263fb8972cf9e1eaf7df4c824072154920b9360ea2c7c1fb4b02c9269609b0f5603091e799045b702a29b88eebfcff3785d1badb7dfbfadc265e8c99a0a129cbb2cb9aa294de509824403e985588ec946e5db2bfdd64dc176e4894b9d656d654f7f483e619bdcc6c515030b9fd568ae5b66d535ca1371ee6cfc30dd6d54730f456228149150e992030a9f22135e5b37af2aedaa1caa26592783bf18696b5ee9b4a556b4d551b2aabb26a65b1b6b22ccbb22c4b9ad8488c6e6badb5322bb3357f16b43e7294d861b3dd97b6901194e99632dac81eae70c552f75d45ee2972356d224e6b87ba13017ae33199c464ec90d720d56ef3a33694526aed931a0df09b61062f5eb2c09e9733061f1f20c4c75a2b891359b549a40d0b599b06e44c74f57d503b9307a1819f470893bf659ae5bc12a304dbaf5b956db12d38388332dd8203a04cde4c71f0ca37d32d3870e5be41932d37f821b7003efad4664b1aaf2d6908717b4b1a656e2a24067726bd89113bd34ffede9932747777f7c6556eb391826dd85f8794d8ef8243ee7f5e47206cb3047b2bc03cc84d31a10b968bd5d1fed6140783b96a8a13aa2720d7f15e89a7b8d9c581eae8808eaef3437736574d7141d5d5fdb46835d54a94d0bc83c1b2973b5aedba32685d93333e301cc1e018990f0c47303846a6c500c3110c8e919901c3110c8e9199a1d55497033d954175ba1be8ccbb8e087af28d963b281dab9bb224fb6f9d2b0c4c76a610ac33bba0eeac29fced62b15caecb72c984b8f44f8ceec05c078beb84230bc66ca00c07ce74204d7b62111f233e8233a8b6af5f6bad759431bd69ac2710e446207cf3088497e011087fe0e591296c854a744061fe9c1037aba99089d75c27e4818efe2219be38a1b0c92c65d20e53533a35020f534bd43055c576e016a694d8c214152e54a1c12ed4b982c9ab42fff6dfe54cee8a8fdf7156e84d0d5780114b231109fca0580ac5166a167dcd226e0a175453586c27f464d21db00a25007e7f3a25fb83a6fb436f5cbc38d093f38004983bf1b2c8d0ccfe2674c11fbe6aeab2ea4909d5e9216812aad3aeb0457744ef1f9a210be813c9d0ca7d320c224357f68fc1435c9663112813ba30231289df0d7004c29c77bd91277633702fee89bdaccbf2541741bb2d26f735a5e5af13ca65bd4e1364f2ba541074591728fbca562030894cf61429996c2b361928933d85ad3649601652f0b15f0aae22b5965afba40e1487d01de756b0b9b9d713bad34de80d14aad344d0d15f231016a5600351061f95f80002264cfc50f6669d3a58ef8d81a7331ba763e2eb1cb2bfda65364f17d147304163f16599218beed4b0755961abc598a0b0e5a2375eb35991e4da60f4c67f888f455c34410b4c5e56eb96f92febb2468e420beebd17c875b855e982a96206390164d21b16e07ecfd595dc66bd4b05935c597aaeca991b57a2405befbdf75e2c422928d438fedbba7dbdf762aa05166854591dd97a38638561c41b8a585c87eba9e779b27e5a54e67201d8cc98f858cb5bab15633dddd7e8f59f7fb7cbe4e80fd60aabaf5a86305fc3bf30a37b1f0c4df71bac4caee8caf545bbaf41ac9f968ff7d67a66ffed87d83d16838c0da40867c31764f0d14d31f87887d458158ac01869acd1f51c79a3cda8046e770539756846020000c3140000200c080583e190583c2c9caf627714800b688242885e3a16c7834190e3480e324619630820c00018190021a9ad0069f9295ce874e5580f89c909ce182700ef4553b90064135fd8dcf724353c10f0e3f168e1b59a9312b9088db01c53bb9ee6a1bd0c26bcc17456947d913c106fa3fc25933d3379f41febba2a15a1ca43441e4a0762845ba515904ea8de58612045b2f7d9253013c4dc2de581109a868efdea2aa9db75d3589b867cdb1c9dc60ef15a569291fbfd147b4030e96d08ecc86443e30433d5bcbf1694d700920f2b2828053adeb5dc6dcc199c9483de94d1535c9f16ba1fe031eb104a384203d9e4c9c93153c860cc4c6f8bdd65ccfa8be02652660141462ffdda38f16900c5000e9921c504291ce2fbcef3755e664b5fb1783eb56d1e08161a02e2d51f1ea1f1e4dbbd9ef195fd45bb6c44693b3a0f25428b38cea05e906cbc0eeb1b1332c08c5dc1b03eb4aef2a9c6274f583cbfac2b3f2b680520921501ddce93be75c14fab31333d22e36bb67aa4df87ace273be649cac50d98b111c41f12b793fa3359d56fe6f9de66eb8a3d64f01ab70d153c970f1f88db9a8e6e203ecc030a49af3011c5469d549c95f04e25250a0c1d39af865b17bca844549580733c595f382e5492a5bfc6bb40198166b1717f31fc17c854a43f30da0be646c643943c99022a554eb1294c0b2df25637b70ff95b95855be5db0d3f2a681c0407534641a805aed517701212993ba9b67766e7ba3ef7ca2c7bd5cc5cf8f0e9652a69108cf7f052a9f454daec47a7e3479f8f9ff963564fc52bd4a8043a252c6b3ebfb2aca8cd402f30eb6678ad6220fc3d23892630c78e7fd1cc2ee165a6e5be7c86c0a28af2097ff710beccb667b53863b8d7efeb8ce05c1178699bdace6f9b4c964f7350f322958a7d01a92fcac2e4ca4d0cf9a21d274eceef92c72999d5f99b200549c19b5d21296a6864d198089134a5414a8f87187e9df02df37c79b82bc2943234e17a658d88d1471952899c14880f57a110f4ecb668ef737218411ef13556a73bd645a8934b09f35246505312549d0dda5ace19c5d9c61d6d060823719632f03f0f701213169981cd4df2930813638a036a7eeb0d8fc44f315c1617cc06dea0a54c4a4ed7db39feca23da56479401e88a0f70af4cd902d4fdfab10b010b942a179f69064423b7b9c221952c7e869028943af3765cfe49b8eba73285692d9307b745bf610b6f0681c9a53028120f5535b278b179b2ced180dfc433e0a6fd2362ca67d9be86e16a1ff4122248184bc06048da02eb8cdea995a277664a26b41443fe1b6f792fc21d87ed3976cbeb578df214a517a5591a1a258e3b61e5e7aeb6586cf175bb9b8637a1f81139226ddf81f60317481a5e9bd92ce8b5cd1f09e26dcf6d2366704561a5380f08f6d48e3d5f827b77eb54342589b58e24a07e352c58e8126b2a6075889d5fbae57075620252d2d4eb09a310709ba6f0cadf6731507761413b4998b495ad035e1a77aa0b9392f5fb8c676300d7c25ecb41e82342534ff50a864b042687998a6a9916ab3d5070196273f850910dd49fb17c650c6a1a6137a189b0f419bb8d2594cc4b5969ef19c36e95ed2d73a720e705fa2d12b07a585b56de70037025811d5d32b391c59a439a27c1179ff417b4e87855019ec62679a56cf5ede0840bdfe00d5f42154359cfa39f7b1fca237c8588c2c16d3c3fe9c6e200e62dab8a27c614e4cf2628baaf03f386c68c9f3d46f8c8b6289ec239e21596517e54bc94e78440d9269e05cbc515afae67c561406308ba719f03baf4f9b566f5f71e406eede57d8ae10a6c6206e0cef6776f0fe360b65e627ff2cdf16d6e910787263fd79919784c5f96ceb31671d851a1c789280405d9dd5d45db65e0db240c88dfe18898c334e2072d1f2e8dc38e2d134e34a75c5084b41f81fa8dca7dda2559f2833034f1433684beb274f31e18be1fe2aa63f89b53da94e70677b3f631f974c2dd8762813f9f62d13e4da9e7e2ee89bc5a0a69ab01d84435aae926f09036b087b4976f6993ca26421ebcf3ace8a347de6e465cb9c442636e91931ad42fa379426fcc5f302f92dd1fb739017ac628e003074a5cd43d2c35d9c9be0548d4dff2dd5b062815c17f3906278826679ed37b2b8a2af863839717c0268c3b653617b475b8fc1b2ac952b9b3add06497d2ab2a14f6074520b57b54ba517d9c3b11c0782ab2ee157c75b95baf215509341fe0f51df16995cdabccf727dd100d2c3681adaceeccfd11fd28776dec04822fd7eeac75689483fd612adbc3401a8c752a7ba11223233589c999b02297d67a4cb0caf54cea13d2bc7884fdda0d0748f52dd1a6591b5cf57f6a02a195fde8147a07d5d9277ffe6ae8d44eec9ff3e3189e90a4bad330e4a9d657a63f5101778a78cbd42b3b909b723a8917bfa45d00b822b93783116145c597483600e84ec0e6d5c14d03314c864ac6aa7405c0f5e86f344296b39b5eaaaa8a8461241c65605467886dc8bae66a4bf3f33cdf0a9c49a98c7ca18d2e5d16b64849bc72e0fc88e0265e38de48da420a2e4f6bc3b38bc8b0d271d713a53c4da0056da195c4a426a31c253d54b05374f464b7b4de95125383c6775258bfe17fa2bce452254cbf3c4892ee3ba81633c0347aeec917e780a5dfca8ca4879e1a37c01d943898f54060ee39e23901350c90045b6c753441ac47fc50f9417f86d26023d94e229fb416423f42ec48130471a73145ea9a9318770bcff8ff20863b590f60060ed394ad28ed1057062c5e431fb54c90191afba817f7435aa6e818b99895f703f549a13142a814b300b35248e7da96cc83548dd2b6826027b0c1fe5387c34f7c90ae1498512f4692a36a850457a3aa0da13bb493f1d6c9d27db0544082409fd01e4c36111341e6863ac92fa002668e3f47f11459fb919074f274c1152fbb2354e5c14c9d5a325300f1752ae8d65e64d3bfcbb99b29123d78ce7ea216fcb7de871c096ae658385fed0758d21c49cf7f804f82982e25eb313227c481cbdc035ccc538cb0be01546bb0767d4f40a0108e23daa31f39e84ef74412d2d6d67816189d0da56c22d3e90a8e52a8249708d4d844638c969c80c04b754d3415e2330482892a8bc5f32a160d678ff9769627437930cd88f6ca07749841703e3b65d5560933734385ac457e0d358c5fca456f616000a26fd61b1db684d59e17d74a82118b7b79ed0f355bf012583b97d9b3201093530826cbece87e1658589aaa2dd65e5d4135cc66e8358a8aa61c76c8c5342acde1782ae3d2931c35adda150346b762e10d900f8ac70b4cb1f87ad8f423bbcc7ec7d6a3800c49b24f222ecc0637a6ba8b19e42d374c68e253dc3342186f8941df4843cbe3a4cfbf4d25173d4102c4836645c79b93bccd8195eb0232ca836c3ac867651edce87643ef4a7f301b04d48a4dc04ad6d13c534a627053b0148a3ec06953f8b3fa69d55a608fb1fbb9bb2b4a884ab9849077b586fd7db747a161a70e9be7d52d225b0aa981e2b371d127f4137a1cf791befba29d94ac044dd1b887010f3c039bf06d34652bee49ceea217d73f258dede3938d7fe311983d02b156e4b832f73ee1b042b5dff4ebf542530e987f44fec521ecf46c8516fffb98eb018e65479389742c6428a047ba2a2214e2ef6e1c3d12e3af279e3e698e7ec108efc339d6a71b2e0e6182cd1eb1c4642549f547ceb2f50cbc71919530d16757c06b411469004b4c57dd2d0e2c6ad74d17a9bf3fce83bf51f297b5afb29306cc9021170093ce49d74e71ab2893e23c0255bf6fe9fa044b7b23a4e9e70033a2eeffb8817dba63847847cfc941ce49a6962f3b66923abe28f3ac8995539086272b35121001867373fc3c0dccc4008e4d603f56c57f52daa50ff45648c2af7bd044fae2c0612e2b0f74dcc2aed5dd447382dc0970f986c2986f48ace71be445df40dd689bbd1eb8421313e8f7e029c298402e8a4d2f170800f863d80586f405459d9f2c8398ff1a98380ee051ac35e7ec4b52e7a006469959ff54d16071301c50ad93d2126632510f7e9f238230ae35aa27b1f670593c625a3b3e521142209567286b98488a56016f5671e5154ea44c1ddef9fd006e543b1181341a08decc08a0b281df9a1cdcf6d131cf36a3eef64cfe9680dafd8ccc6455629c79a2c2a5c6ec7aeb884046b10f6147426fe1de7a9e39d99da9af7a9a162d9936e170290e9a87d2d22c3425ce665e14f2b655b96ab5e5189490e2169da6cdbd7c34a17790729c44ae8f31d5601a5e92d9208627136f1de66751fc900be74e16fa015dc16a78eb14aaf4c95ac5681540b626774c8c0572f2599c391739fab75eb99fc0734113635828b50de75aed8a271c280954ff1f017413bfc475f67ff66b0799f668c42a7595015124d851b7015843557b5169410d79561d6419e2e55f4c1d4924b1809b055c11db46851ca2ea7b23f99468166c833242ebc3d2a5a06e1188d808ea55571f464f8665c8e1826d6601e8e3c733b84361c4e9d90932a3a01a317c111d326acaa266f6910ba276fc188bf5fa6703baff3b25327ef3eaf4ee58ce23d32ff242af322bc8bb69fefa40e74924ce5ce8e243d29b1d43b38494c8085247710daaa1a9aa4b7eab700ee4dffd4016bcae0439dc02dbfd0f14d12c5462f0fe1e46a11e52eb743cddcf24b4b9d18d60747a9b15e9e20c09868ba3c3105a427511fb966a47b687775b0ba3b3560ca76fcf170235bdca2370f47362e8f81f2c18e839d257828f2af4a159c0d10614ac0345b3872b5277b666762361bd2ccdde5c4630f29db9ac8d8a6ec9e3d72f4063c2fcd867c82e60177a08cc60f496e40a378d370165d6170101fa738207d709c629a693cedf3b19cca5c3324db6ad223cb0c3012cc269a1fe68baf833275266ae70993553d803fa1ac821a4fbcf44d0ae7018b252050945331e8585da5b9b3c0d52d9cd6bfce1e5389e406e2ea90707925a7e93695a3bed3620cb19b8159a985292ac2802929fa805fabb6d8e0681edb5f505882f74888b3cfc0c342b2d0ece2f840d6c9810b90c36ca027093c9fb77895dfcaa00bfc1f684837809fe634b412a6528a8fc45d4e694a365addad85c7def1b1aa5f646ed8f0a65d9d9116ae4ab5f42b141cb0c63aa5a6e8c24a9a00641af5c43b9b93e4eff81c7b194216fae41f9bf1893f8e0459f686b3a7baea40eaa34968b134f64748eed92f5bae1637ce2a27c55bfa14c53509fa8621c4422b60c7140758cd04cb876204741a92c8b8a31b96968e7576461c2ff6d310b395441b582470a59d9e84f35476b78e7fdaed0b4299c04f968c6d34d186f1319bf5c91518cbda1fef94deea4ac8cfd8118ed04afc024d9cf3d6e21270c764f637a169e7a000862fde50db54a0cc3c52d64bc165cf05064aa472824a3ee24b9b505e6ba686649eceea44fa2028ecb1860e721609be8913a27f8a4fdc8d9f7e1981aad374a92ca027c5a75a44388e584ac9a0f697d9d1745d906ea486da80517775e235dee89a14d65f5330e97969c9d3cf9c0f0463e72bc1f2154aa44561f2d7efcfb45fe93f323b537f819c2c0ee4b20a7a14961eaa972624c4b1fa66347f475d8834996a9d7d500976cfb88ed7cbe5f2dfbad43d79b29431d5a6a29f0e7655fbca456c82f165ff1419fdc0f0bae29241b87d010a771257a7afe090da7bdee07c253ce649127d290dde16a80f890012a33007ab12c816f3979413da474e34b1f705cff15935e5f9a69d0a4669ad3a49130b6eb5dbbee55575d71758a898b49a79f861ad248030d35d24014e3aa575defca15af9aabda7bad7df136bfbc4bae3fa48d3535a7be58f15393c366e0e8e26709787109d32ef5ef397fe7905db9f8d3f2383124ac5418f171ac37952368ee3c9d4502a896aacd258d24e8a4025c3ceebdea2e63f403ae15a85a888b54fbc999d76b1f8cc5706d3069497f35917f8113afa38ddb44d2c48507647e212a501f4067208577d42ed44cbe5db28165e232c7963993954fe36bf8e2676f3e9ab4cdcfec9f835282c136595c23933545d1bfb0d6d52ec76c99d5ef5611d362e0c9cb5e7b548d44c48d16ccd73b2340f5e6ff7740c7846ff121617c833d41ed3814113dac6826afb9e30de7223c097091130b1825bcc085762509eadd4e9c16dc5305299ee55c29a3635439ca68488a970245232d5f1b91ceb53416f1b107fe813e884b857b790b126ae12b5e6fcb18987fc861da0a615282a07af152900c73770b988c9c399aedf44e6f31d0dd6f78fd6a204cea5243ce92fe7a741bedcccec3d5c12fd4be6176bc085a92e0f2663649ad61bebf287f6dc0243842840e7ade4495a45a3554ffc985cdaaee86f5d6d23964b8611fa2d9ab5ce3d331cf0c7aec3661abe41ba115611c1f5ac229bf0a4ace25bc2f832638456ff753d72a701ba11ce29262ba9f582c2150c22cd1596ce76647b1bbff9620b554cf2105d03db6efd99d0f51914001440f932ce0ed0481ec3c58e6435c874c68d9a33693254c2a6f256e8de512ae38c03df381cd1459f0703174afaf4c0dc8c55b37f52118d6c24d9c34cb8b6081c21a945687dc8eae7105ac6f783b565c78d364d80b4f2f68352451fb514292ff3a4832c4e6ac414d15f1ce3e35761f2632f88a9308c0173e91f0321efc80246b4ffc5de9bbeba089d20e61c9471081c3d762d9d196c94e954cbc71f672f3a6e01858e41005e6fca33d8d63e20937cba004194427051652ca7eb6be1fc71121834d3516784c61f0499ef179617d21b32d509158cdc888d24499b2ef3c286e9be4c25d560b31dc6844eaadd3648dbc1d74ea188bf9d04086292e8a8cbdbcc475dda5c8603fc763a888c6d25b08452b8effcea985a9c3a7debce727bafe212b28d7f38bd9671544a63b64627adff81a26563ad36ea2a84bb68862ccdd9fcea99e8bd1accbb9e9ad73a7bd77fc5b8642d408eeb4f21497691407d03f2db32bff1f6a1683366618b885b3e7709ed1598884bb8141a37f1286d9798386026a021650b3a98764489df832ec260924eed2c7e1cefbbce1f67bcc82483ea6782b9ef865334089cc878f2bd2f1620f448ba16039ccf6d89137e41ccf8193f6d8d540ed46660d3736b91e8c648f3dd353a1deaba1cd7a8c3d2068a483c8f191c1b339b70a2eb7660425bb85c00e97c57f20d1a0136d26873a23ecc5283fb7e30ae1331881ed937ab439889c08245af6adc9819cc2ba41685eca885e78f90602542a0483b41cb0ff2276f41f7cb8f1c994158b1933117bab7495bd32fe389fda436cc92bd547209614a3a21023d0f3fa62519e6b5e57c6bfc15502101c46298243021e983d007c4072b097ae161c6bb4fca7a9d263f310ae4ae267a44020e1e4433e1c6d0da31fc934bd09c72b09d88f843008be6fc6a85169a2c6859082f69788702c8d85f96422836eeecc5807da58d5bbd1c48862813dab2c78358ae8840748cc7b29c3fd0806b091b20a3d3a5375df2147d48ed9afab5dc502a2fba9e05646a8d775ff8ee0f68b44aff42fde2cf499940f79b6b7b62c8602a6202e0c008e9fb02cc37a1d38b2d390f3022240f182fd5ed43f8108b095243d61d1bf052b7b3dcc366f98662f37db2224cd77ada95b5641a8badb5f048d07ee2e66ad0964be8e2f020525bab757909b11e1a581824a9cd9a79129b628e1c076a0c4a94f0256aaad6a98331710f41041173b0377e0d55629ca3adb2a3e5abc1a5e4e15d365f3f495765053c58d95038a401f68d3d15791e2a0751fadb4ca5dcae57a58f02eab7ccec6015e39f4c6cc5f81eba10d825d830dc3277495982e57110b0db72a121c5a1d0920721af07657274c8dee1bdc460f1a57782ecdf09205114be0b4d437e75ca025d7b13c202b9fa6d4ab8c7610aaadb103f19194042179b80b3d03d17f2e32e237d8b0b9bbd3af875021253d84d8b8e4ae7879d7a6db9101f9127a3073246fe884bda85b361fcb3e98f91cb7f81afb4fac49fe1a36d164ecd017e6d5b3bab042e8c29d1e1a1748477aaea3a20cc657961b59272b2a57940e2e4532ca42990341d2956949a01461a2441a71b187d165e9396f725ca3ebcd0006847b914417d077494bfae9cce8367a6d33c7076d5a32a0f18e9ba97cd988896603828af75c1ff1bbf37eba6c7479015a4bf1cac513031558a19d74cb2c8e2cc0a158d108abd86276de48aa56e3f19c4aeb721842f7a2448ee6e337d291b6b10516b95341ecbcd6b0774cb569be008aadd778fb118b77b0318d6cf73ccfc174738731afd45aa310682e3b8ad16de5bad9a9dde992b48fe00df39d7d656b078fd0697d6901b6006434fcaf0f3a9e988feb566bb1adf78a66a545548624fa13d5914ad0738f051d6163d89b19a74840f3eea46dafe684816006a4926c451af46bcbccadf8e2940ccc08e7aa51008e7a0c8eb739307a4fb69fc4c0c98364621142367103dff282b9eb4a32f0cc1c1352129bfd286a31da9e571792438bfe517428798b08a5ac45f72a7f9eb7bcd5c48e7ea058d1871007669158fe9afcd51891db77b27c5f2ac7065e375e4aac0b746a9c7d7df137c1f9bea3204f6b8d533069c07b2589c24c836606ca36d4a880a3e35be2bc9fca1a0858a9acc459cf93043d2103332b9748ea99aff554444aae798e5bab7662f9da48044ed7f4a8979078494a0eecdc612123871d40305312f4723759f554b5c4ae8f4b13a67b0a208ee606d61484287beb696a5c8ff075febc0be3a4b4c3d5f56d36864d71bb73fa2e2cb9dd26ddb42c7f50254b9789dea1fb9bbad6221b51cfe68159ff35202a70c09bce2086418404197dd3e8954fe5dfd4c9a1dfd3411b7d4e86ec266d6a2c81fcb31a4958175eb9963ee6b87a8684285b035d8fa32c8bcd0c8e8a5687a3bad9001676214a122a75343a8bf565f2d998b4dee1c368ebbab0c7d0dd1af0f2935bbb3373a6743fffe7a9b3f6e9146d6dc8a25908004289de535847ecd8af9c672c376448df51a49e34f98828544e68e2089ad228f2496d3c0de0c6e28e3b712298d077a42dcefaeb03172056eea58c1d2ffbb2b24cc5e5dabdc13003759418941de15c6bd1bd6fa80abdd084eca4c99496343b87b5777ac61d437b9cd7670ecfab6fe534608140d1bc919966c16ecefba98fa6c9b656a969a258d5e8f7545ae806887a0934b25c3bce5bdaeba9c924f6098745bb34bacaaa433e971ac738252b1937d77676eebb584d0c62462deac14643dc09fea55656c4e11e71f84f31fe8d19ae5bda484803b014e3449bf55d40dc5007bc95a1d1f8f1127de8633e5d894be268618198c50eee41ccdca19a4f4c39ff21c027dffe816eea30895079ad0da1aba93db746fb2509afa5725c81c9450811155aee7c0ed4b431b64da48fff049e923b8971f16b5f6df1eb36ebcdacb14b8187dc245bf8fd1b7274f6433bd931155aeadc4b5cf7c40a10666c3479c6e96c3832e3480cb1c4a2bab548bb677e661a9a909fddd0d43db24ac2df20233de1ac88ec56abf2ead7e00dd534a90abd4f0ce62f1aa14fe56a04d7303f3f9a140e26feacf649f6d7b973e7cee5d46d3422fadf31c43a391ccd1639e4e56457bd48e5ed887ee60a885291972324b6977cb965c83408a600841c4cf799e012dc6d9efeedfaca909134995e0d28662b931c8193eeb29115165440daec63cc4136101ea7f67eb445c7b0891b8caba1e5959c0f16083fa452e57bc8b56d3ca00dd84bb5ae680a043ceb2e7bcb34696c76884ba786a935e15d7ba112318ec70b4c39432e3300b82921505a702c4c0e3e1742b601313fc94bd70b73281f4443d42c0a1b099ae8ae4f0f82656aa7aca19ae04bcfc76f97d6751954ef076aea5dc58d41aa8a50f97050f473c90a4416aa9c4287e0d9b10c298b7e1cd30afbd4256666c35f2c74c4228e0f230b404df6338caea129a27268a2285e57453f3ab704ad91771bd04c7e453f24717582da752aec9cc3c060c9683b75048a7e5c14d67609dbde0ab9d349f91650809fd4d34decd716ce7bd298421bc2ca885f31ee14ee40ce04f4650efd1458e217cdec6eccbbe96fb7f0e6fb8a7c98964c819e3d54de2c163d3d4d0025bb7853d0a9b287980cc156b8e85846552a4c26b17e0b15402d279ab1342113ef9a94ba97a0723179a0cd099ec67d0317caab130724b5f5f739c54c2c09a244903f21f3a21cdec883e2bec6a22452144c1be5f6b93be8e20860b14dc69c1f8c5dc7dad99724eec6ce4a44be5c2c657e4b5c4e624e373cd79239caa840a64017a82ece6f5662d7d48fb18a913e4c3bd107efd4f1254697cb530a67616429dabe5ecefb1228a609cf6076ff60cc2ecfaa16849fb3dac83f443e43666a320628c08a7f4117d26e655ec0c1f1c65710dc3c3ff7b986c543ff39c82bbaf4ef812918cc65aac13c82577c1890df766a734a832e9bb430405f81d8df3f21ceceab582d094b1326f10019f6e80883bfbdac2aef961e3c75dcb091c744033193709924637a63e29628e0e988adbdc10fd90274aba335a8ffae15b55267ffbc1ae491eac231cae8a9e86f9f6f142e3ac95e08d8d23981db165214ac58378221c3024e76f7feccf717e4764cafcdd4b5e964829e5f882dd3222e911a2d22baf7c5e174803f844153c1ffccbf9e7121bdea13fdd508a19054189fb0d78dc770f347cac487e60b540a24b6437f8b10ed8b75b6613f1dd42f3dd5a1dafd442c1d5054812752a9fe1a8f0a002e6ac1e0c6d7f91645093100d841718993ffb7e5a8f1e85109fdbfbe5227ef7cfc8bdb9a7cb6ca19aac789ad874d5e5916f2ff8a6d11c60af38221e118556ad4279bfe7b327db2b7862a28711edd899661516e7a13f402818fb82621882f9ba1a3623bf08e872327a2deafa03d8e21c8511418db764b40fe4ad17df4f87347703776fbfcd7f6566244869a80a08413bafbda42fd4863e338b6f0817632321fac95f3c7d26d624c777c8080aa26642b78e8815f71f301ab69e00511b9e0777fac71adc1fae0fe7035791d0e5ab27917e3194e550853cb322443b1f1f2bb2b38cc74586e18a58018ff7171e45a46469a916c79f7e777969012ca043bb2bdf74f5e26c7f771af9f5bdd64fce343648b4a42400c19cae5fd41f8180e151ce3b9cf69c0898c535c6662772c3ddd187ccdd37cf2f12b25bc6f8fe054facc9e07634186207be0e1895c7e989be62d3027218de02c4e409b80b61e82c004aee062f19d23594e5741d4b9673d3977128b4bad1410d2aab8fa99ec23f8de4c964b3be3177c04a706b0ba7d39cbebe97ee121b4beacd193de4fcb86bb5fe285221d5951aca97632d2266a8e2b3dc25a891279d342a5d7c223f784d789e3b13d4c173a6fcfc7da44e07b017f1448accde46839d4b45a98e80cf7cc9884d4a32e8b1ec885da0b68689842a7b9652dde1357b935244a0904e3bc78bf54506efce138ca9d92d9404423c7c1890945868521455a69e2923d86860390de740cf9425bde9558a59c652d3773a768e2e39cac75a55c912a377ac45d08371609708e63c7620e7b61abdb01cb8561dbb0c23eeee8ed83d14e4cd94884888991d1cc573a94822e458fca3ac036612d079741f779f3056ccdbafac434b2ee34f6677d6f9040f313f3c55a17923f8f9425d22b66bf851c8215f69e37210c7098b9b72b5602c466574756b8072cab7332ab3e58fc014349f379e510ea784368aa7a8c7dd29c6e5e103e79a61102ad1115c8da05ba1178e3e8de8497d1cf393a2e23431c48411f1ef6d03dfea9b66ff6ad23b28671dcecf5da3537d6d7ddaa9c79e00b713df5958aa834c4d7cf7589b5333e197fa5b49586a829a1cc8c092f443578652e08f142e94d610a20584f82cb914759bbe5cfa72b4283b7de3daf8ae5f096095114515ba6a2b43f754fe2db74837a4ba0d4a2af7a7f84ad7a566cedc0b1114e38e68b3e68cdfe8732a5dfe6861c255242277e2a2901d95fe62b00875a09e43f0255ec90de1c8fab1b32c86d3d2697e9968c6ea362474db3c38d0202b3540a5d62bb0314e995af16689783c63721d73410d7c1944b055d35341c77271aa6b0bb044e1bc07f89b72cc28b6eeffcfd4f1dfe507309a9d04227df83d5cd0058ecb8211a7941b3270e40c8f208f38e3c431c3c3d9ca937189d66011f0460413d474f9dc0afff6f057e7d676e4cae288dafbb1c83ff4319835326b8f2d356480e3969f8a4ade64b3ee086a036a49c234834d4b6e268262901c709e0cdc62ff30fb364913f2fd1999c375a6b237f4816e802ca325aab571e7209311e19a771ad586d02c39ad40179517e401cb18e2b14711b2c227b7be66ab91397fd9d72929e5657c372527767d6a6414859348b28dc0290089122bd55aba3ec1a785e8571cb245f22057cc02ccc35da857f0b83890c216b1466f31815992218a48f16512d112854c9f062fac2f8d589e9d7800a7f26094d1db2bfba9ccdd24b8100b835ddcb89fdbb716165d9e6d99174392d730214d0f20faad75aecfdaff1e8bb03cd63b29f6c47cca2f638c5046e05ad391ccd10af065ff5b204a7c8de0e8138047d198d74cda3c12df99dbbd1ec4c41682b8de093eb2310d55b5a1dc57d186ca9e83bab300e64d523636567cb3f791344494d90eee004008698099de81402dad3ba6fa3a2575cff065a7cb04e0d93769d89aeffcb8d6a6fb348765f5117bb01953c925568535d6099927cde41acc93af5f8c3f64928d50b996aed8e07d7e935ed5144ee1e9ceaf4f4a1b668495c2e461a31e1f535d71d7531bf4ee49d306c46a88ec2115fb541e7a463bb95c494b5ca5d0057359c57d3ab6af493b4769e8a007371471b7395fb5e0187f069174ec92516e9d9bd901171eed4e9f15ebb00c376cdb93152d2d8515e5f8f45c6e850d73c1fb4b14e30c22a0a7facecf9bbdb215a418bd49944495f05b51d3694edc8e0dcd3f843aadd5b6400650768b781a7c53dd9e5dff96b221c8a2f685287feb6666317809a6767f65a27dc31118abe30ae5707efce20299fabc9959ee7c8862f100a2e3c8bfe0f3ec3e7e1d0ef543b973262fa46198e5d63569a94075ef850d4d0504f165d1e637dee1511bb3fdf3c6821188b7db0741177efa2749f7c672e043a530cbc4d184dfe0d1f83263d846ef1eebdedb2bf878483dc85e93726eec78df123ff0e688941ff5a24fb486d9cfec62e570299087fb93f74faa62902f1b5243227ae9aafa9b5499c46ffc2fe8799a547dd81a6e5ab0f9060fb6a212b87b056096f5ffba0405364b3583bf0aaaa6d6298024abdb51a1ddca84ebc6cc9fa48909ad7388b7bd3e0263dcb2cf37e1c89ce5923e1d4acd40a108abd10e16a2f15d42d4559638042c0b63d590d4229ddeb1a1ea919836c6d9c1333728b7b25a3cbb3d8f1938c4fdc746c321c543d969434ac10b3f5f38bb807cc1e935cb883923b2d2cb91f1c5e942b2be2937e82e13f41aafd64b0a8ccc8c1dffc945b72c366caa01a301847db0b8fa964b012b25759daae1a629049a0a4994b4ff1a5edc6041e940d92457b8fd91a58d3ac3e3d7f09c323ce3e78974bfc072b8c321901a5de23cef6758c2957a96bed7b6b145f25576a08cdbd166a79513802aa22454207d7b88d298f47ca4db058bd620513ce56dabd0b7d3b379c2bfe34ea4e473b248d3fc94c973d9809cfc2e64349984b27ce9a2127b5854d1d5632263d1dbef5acc2a26408d0527ea0432a3bb6b54f8e3c99322e566d7273435e5216030a36c60ba09a1b5ecdf52b2f7dcb45fabae61a18adc8cf5ae5cddfbd0f565a5f22c42d7bc49c85aa225a329403af34ca77090a14e0c8bc0dcabf21e143b99c8acbbfb8fc4947c1d943fc052e0165f5330a22e25165468272a80f36c56143cea6202f0e9a5a724104135b2c494670afbd7597eb8fa222c2710db956abfc644a93770ab6a49e83a74f4b527f5075c3b88bfb3a026bbb51940a1d34080ee0bec12545657ebab7692ca34d81017378e33100eaf9af04ffd95acee4a4b1212904803c260eca4bb904d02c510ca92f4b8a8168755c9c03563d3840bdb9f79b1e2493b42f05afa4402334da3252bd306811a751501cc4638168e0918f3acb83d0a1fe01e7ce88918b4037fded59f0b920d7f8c225c4aa63e7578868594ceda889953d02b9a0f05ab298f3346732ccad02fb0eb8237c9e9d088a96a756ed2e4b035128a0e5742cc377635ea1692a3a956bd781d623bc2ef6296a35c92a6d83cc645991c7e465a771e4d1200e697a6b393f7d4e62183497abffa1d65cc379ec6b874dbf057c4e1e430ef70f7a58aec1c95ab53985bd88ef02178d7828cc78a9b839d38e51bbd5aca145b730e506322538e05766742401b36ead238bdd0a73d0ac6c2f5d550cdaeb33e0e235696db68e32a1112ff144a4b94fc0ec80dec437875d2ef19742d8941c4570228b567b7430cee4a1e68fbd5e03201f7f8d6af1a8677e12dafe3c35cd70185df351a716342288449bf28dfc6907357dc702617798e6307833596f7baa1d0ef616e86700db75c8b90c40d36c4021b510c91d57a3b2bab21d7451323a31643c70485793c0dbdf8f243d5b78d6461c20369f0e50268b3655dd0360a4064f66915892d802664eefd096e67500345cc6881531b445674552af43c91fe88119d61ed07f14d02bfdbfca96736b48a2fa80b61c21749c4bd478ec87e74350823ef671e12457268437d147635ef96625128e44186ff4153497c1ecec619fba2c88b843feb90b21bec4fcb0a72c46fdcf52f9d3562c3faec5564d173ff90d1f8aa8d2eb0756d9ebc915a637e5f85961804036401c6277d64b6281f2be84b044cc3cfaf3facd2da49c91bfd678bb40ae9502fad412108294caf86e4f8893c7bd8dd5706b05dbb4d4bc9a1e8f8ebbef804ae31fc2e31f98bd416c00b8b5de1111690b64b1b9de3e1196fc4c5ff741bee4386a0d1fff2a64fc92b5442eec8f3870c63916d1b88e2fec8a612549436ca8c2c81fe55e608cff0598b2a30f49a38984084b0de42c26e710ca42eb53634828ba47f74183cbfbb70b7d3ea174a765851279190bb3ff4070fabcd3d9e2e54fa3c544d37184d43e0beecab10b28f03f7dbcb722e4320d46c811ab367bbe61cca7b37ad4007bf1faa441b86ded6fcec0931ea6a4e6b97c1614d85628aa5462428068de746db77a34a1167f7cde543e85767e24e5ef400c171a28019501fbfd914f05643e4574b851752c69056408e09bc28a31136178dabbb5952478376a7dd623597b85e2a14b274290e6bb7d0f141e02539e08e6adb56a18fc515862cb031bde814a9dcbb4036476670d01c5554a1b969caba3b0a8ed07e8b2fe7986d8c95c7d96c370f1dfc0f9e0500c4c198e6f68fe339182e147909a4c22379a0cefe9a168118728defeffa900f3bcff8203f26c55617ab083260350cfaf731c550d453519170f4e9954050dd60ae75c9ae3c366aec35514a10f0000e86c0282abffad845066501f58e250ac364e52b381959f1cc1261d899668b0b7fdd04ef4ac71973451b7ef298683a9251de67c2e08acd7f892a03980cee0f48819a0363957adac7b36fab62a7664c6bca59ac165c6c2e82e72caba9dc21243f6bd645f6dca13c3c4799e2daf48ce578b71606f6def853df279b5424f8eeeb486068d1d4369eb49f08f391e359c8e136c467b108af298ca623dfb8cb591ee5813cf229818620c8828e840baa628d89920c7ec821112187d2fb31224892b32eff0b802c1e73c5115cc628848318493dab4ce212c6f53902d022b7bacb8bb110ca9cf9453f473a0ddeab207cf0a531bfc236bd183281bdcb285f7621f5b567915545026af665d7a97cb049a6732d8ddad55a12aa850726cd362ddb9c0c6230f7d105509498a013e26703ef86e28fc0674a656d0c0b16c4062b7277ab185f93492ed5e3f19a405468ab723e12ee4280d7769247b11128e6816ddef90c9b097271454babb0245150c0ebf05d2a99e5e0fd086e286a7559454eb88479294205e2f003acb87788e0832e1e5ab209b38734b74195f9bedc9be54f6474581b687c605f27e528a1809e33dea4892b60a22355915f79164e6b58ce9aec067460b97283726fef562600a5a34e482cde05780dfd946c80d93bc0019f5755ae8c2d8d4e145c15b1d4e3aa233883de92fbef12f74037873dfb3ec5eccd3ee6a58f442d82af10634b415dbea319e2de808845574b0e5675417423123f81b79aa242af9579429edf7710e9af54c3fa614a2e3f6c3655340afa76702dba162aef7f2e4c42b034933a0c84c9a342a5eb19d32fc60377ec7a3bd55dd9dfdaef4d41b6d378a55026e1d9cb8b7c80479a36a66efde593206cb1515b9b2548a2a68d44cd59512c136aab0af9921427b9eac2bd7415948c25989230d0d00768a825ae1ae1e05574704efc4c192ebd844b12bcba4a49fd453d318f1fb6dbb04d94cc8115d0f589cce010a655714f876514ad001db67a1581e009fbecdf9d98014c77debf583fa6f056ee9800ecb2e0be4183bc105024520d6ab794262a911cda2983388900de43d889b86bea53118c3ecfe3df50424d7665c8086c6941d549c9e63d75dcce9ee4f7e0014a2daa6551e5a13367e275a2edfc065da9f5e8728e9332f45e9c85273ef61d7b9107432d0e8ed240f640db7f12996ab5f720e934189c62e49159d2eeca718bb9f7900fa7611c15b13a8143d11caeeec536711ec26cfad96da4d5847d9a8ab6c43bd79131a1fdedc2e7a282ec15bf04f9d74da633881c2da29a458600a030701bf9992dcd406c88d73e71b21dcdf8d02ec1a4cd00a06eefb1dc03815c3cd0c5b74aa63efc718d6a7bbf9dff0121aab51a3eea31dcd67e4a6190366a2ceb1bf7725e1858b44b6f11059f57741d7a4618b203a97525a2a4658cf7aed694d93fb8c00de446f42c8c84fbb78264e4f886ab03d2661c21ef32885d1bdcc20fafe4a589f3c041302f27fd11cd335245b2c5b8a5871d5d8d742d78d1e80054884630da88703a59c70b476a08ba2ed8157213a3908fa26d9f188f14e65ae9deba2b51e98dc364fe485e6609ffd910ab14c0cee822f9d0548290481037f5c619652b28ca1a70df6d3ec79442e5df41b35fc93bd9c190719bf359167f619ef337d53ec29a0b21926035060a756c0c77e0c07412029a9982a1e387660f2bd40600d4e2a3cad4149ad24db495561254cd8afbb7e912c353fc6705e6fc580adbdc050d52542e98ffc4d3eaef078944938e8df9dbc67c5a730ec0ea63589fb4a2b1cb0fcaf55a90f48263018ef29c0d20a5f852a915c3d24109d6395ac29bb5062f6fb831a56e597420e8a11bf9b92f9f16a8bd94930940776fb9143a9252603a7f4e612283df9b8db2ddec3e56e75e9b3d6ddf2a3fe2b67755fa263c53d592a1562005c3d22555047d61840e63b5771566884c28352a16f1c22bcc8c27655b2d5c2122b58edb5e2fd55854ade5acf95239197fc1b62aa0377549858efbb825918170e079df2664490543bf46a0e5ad474dc6abb929da4dc093e6c8678b194b2836c1b08451f7d0ed8449d8d8993a2a50c4c8b6a3f980afec053a67c395ad4fd4813bb99962bca5251e37304add432d6bd509c35c2424f15b5ed84c56d8a86dfa3873a1671674c1c71fdc662e2f670cc7e1b637a088b0942c37babbf80b408e7c8dd1957073168bd9df17265c3b61897b2e1093b447eac0475b5d2b04e08431382e5785120c9cbc7a96371873d69dada800a2e61ef6fca9f81f8c8d4e9397adb6d28c0ba8d4d29aab04420d3166fe0d48597023945094d24acebaaf696f0ef77a84f7513f427799b6f3e2d7301480757474392c20f0286e07fef25c58076579c8b420fc280e22f0663ea04cf82e652338ee7b39f011a2710ce607f5499f8c99b9dfc3150757e61b25976e388686f7a011d1097dd8c8237fae182af276f3cfa680926ffd8acd1a4d980f9aa6f40b721bb45b287a4fad0c0c7cb453fc2785e0e677918f1eb2a1256ce6482dfa7800a273fbde4288d74825a47b8384104a7b20418c2565c4f70c6a5719ed3eb47faaf731131030845de57ee253c0aefbd087ead08f7341adb9633a275fea0cde1177e8c6917d827a2d7cd87c944587bbbf28942676cb9e7e138cddaff21fd5ead66fc273e0fe104be556161892d6609180e809c6c3558434411ab949b1f8a5d906d6d0704d285479af3fe57bbc760b5c512adaa5411a911bbde32f9d2191337963a2594a984c920a4d3e645467d9e3b89297637aed4d6f45a8d7b34c0993d02209da849199b6dfb94fc18ba1cdf341e0b8949c6cc36965aeac2569e81f3d51ee99d6f5c90a2150d4ce03c5b4d00fb1bb5f1621d67224cd44a1efc34ee4360c67a889b3fce79f8c3607ee5d70a441b8ff56a30209941b441492d8dda3c0a3049232983f288f3618e162edbf1bcf848ef38cef70ef54e752fbcffec8a7fbaa73331859825d931fcffbfc3dcf1a1ad0b89e75e129e39ab09cce32aa419867ea93b9302f35001371d3859f43375ae0e158882864eee05e7b920f9d5e24ba52c593b5e98dd3914e6e9f294df8e79a22e273b17aa6bee9867385829cf931ddbb245cdbf0d86a96389055f1d3e01afd1c630adfac755cada44b21aa251380b047d9b30c4106abe695e7528a76aa7135614190bc582d513e0ac254a2fbe31ad53846de9e262b4731b749447aa1f9abe8107e18977acdd3375a84be9bb135dee7cf1f1a87b0a2655c4da7d1397a9c32531f21643790b0e5818cb762b7fda40b9b3abd6d5f2977536d310e52214e3da75f1eb3bacdbc00959abb22b7048d542a3f1da44cb2999382eb5c687c7d854e61f064a54a7220b530a127ab4ed71906bdd419180185c55a8df0b570c207c53153b2e91d7d8e1a64b307d650d8a33d17826afaa22604a9518064bbb0c0f84d3aaea76e5267d697796e8827695bfa833ea93738ef73b14d65714332772378c778d22715d92214562e5e8f7924350231d41884ee5a24b28749d29ac935f6b445723aa7870bb51daf0422c9bc9797b6db06ad52284a9c2e8468025b4bdde705e8fa9b8570626feee197db8ba926ec4b4c3e7c979adcacd3c04a53afa44fea32ecdd9a0835ba322889807200969adba544726ee402bd35e77ce48db2572f6c6aa4445be0566fa5c9a4b1cd756f2c27d309210c2cf40d23826fa15c54f48965940e26e5c27567333c00a8a828082861ad22be17e4d4924520f9687b5219dae6548505bd455b1d51dc18908abaf70c666a78410049e5be8611fac0f999ee25b622b0aba201e9cf208a3068d2463b4f27b12d6fa074e380b74936e6bb54970bb30791f633860f288864e842f300d0450aa3c7d87609040c76e96e67a536d4fd76338bf0b0c4ab789e1b27040c4aaf05b80ce7716ce15fa9fc3ec6ac68958bdcbcac522c4e18620c8b67be00baaf1269ca27c2003265c596f25dc98d0850449b8b089704e16fe330755387f5fe3bf23dc535e863431c12cfcdf64a8b2485911abe2bf42fda1e9cb572fed4fffbb29a7e8fcbf9db4ccd7812332aa5f0ce30214bc0068eda5fba779a3c57aad85c6a9cff453d6511c937f72a17cab24da0506e7d8254ea5c77511c5ca088b2ded762c8d56bbc411adeb07c49588845855b84f2f01bc1091aea9dc3c0b07e3c57f2178eb50897bdf2f72133094a785dd7ce28ec648617abdf8a16e711397e9f22c527b97df7b4c434b030abf544d41d26566ac24c68b156ab1cf94b58a12a81055c3e2dfacb68b19c956d16d87c79ff94972778af28b03542030a9873ab668f8b66ca01336217e6b9708fd403fe61d5a7f9d1a110af2a7b19d0bf47824f2757b522591cd24a59a3c3ce3ca6a725a5cc9adf43b234720ae2a6039a7293b0538f40cc1894b04465419af55fbe9d2b25c90bfe08a44c8902c7f6113b0797879b00394411418a67bfd0247c787b566f28292578e05776164394a10658ef2d607c8a81dae45dcf7c73e6963575afdfccaa2a280d8633fb9127e19c1faa9cc77311a50e22a54a950a532332392c2f1b900da473110453ecbe2933333c5fad77a0a95470dcdfd84ab19eb9646c058a6a11b42b59e571c732eff5e3f3f699b7f720f0ff1503f225840f989557cc27f0e3eb8cfbc6ccd58013643a2e5fd1394ebb3985e7bed434090acbcd9e74d2d01bb6cd268786ce48210261fe586bd4a7e2628ffeab11fc2bbbe032ba1b78a0ddd566cf0afd01b89efea6151e34b128c53d444bbd18d8d81a0fc09a53e27b4b2aa4cac1be0bb55402093a92e8279af9a1f564db3449336e796a699669fcd699c690e4249ee884d3f0d4a47a851a74e9619066d48988b4d9767c4fa460df7e0817c567e7855a8caed2178b74720fa1355ef259af31bdd2030263c21b04eeb47e3ee4e8c0881c0dc259f6225da10a635eb8e3e72e07608bbbb4fb690fcd53eed3b2e997961ae447e1937a13b01d2eca99f003b53961ba56b3f61eef18994e97c2528245450f19a747a4c98863d9846ad6e5e2097c1e340e5df4fafdbe05f93871ed2402ccf99933a558e4a5b3daffc482b9e33e8fc025dd3e42005986fd9a49a67e259daa4016084a35e5e24cbc43898967720d2f5dfed18046bc4f9cf6322fa18f1a686cd8995c1ad3b0f13056f1bde7ed138de50f3a3e94506aeb8d62183f9f4069181a21902925f9e47c5364406e57dcd725aa158757c1f46636842759e12ba6866bfca1d3390925530fc58d389fe5df7d107041599a9a3d87572f6650e0d2aa896a0a239f00aed5375b295a32189f4521b363ec0809de986a7b37850080c978104b685ae43e1f3f6ea68d711d549f84a54ae53c5b979640c0388300e8b230b603da5564d258b322807b3fb9d501b0acbcf25521fe56d854a4bd6bfd56d88d7ab7ac98c34c21c61fbe4192f0f35875648dbf171be265cb9ce2c2761022b2321f58309b4c7c85b8580ae9948c7a883234a329c7301d57f321ffd48d02d7fa77a4049c9627a133a38ba59b7eb3152887dc22892c4b3503abab29c8d4469e9c913395772fd57508e0729e410350b505121e03a0ce412138f8cfd33d9d66e83fc888198d9362c58524874fd1510a6828c622a4dab926c8797daff6abfa0013785ad886707ea030fcf5998cb6a4be6b8984bfda52503c802dd4ee15c654ec46a6028fffbf7f760acf2bf1873cc06b61ca65aa43747ea7fadfb34c4e4b0e5ffd6fed2368df25e144d3a4e5eee25de1ed134020aa40c4249eabe06feb305a00d73a3b8af56f60af8961c0fcf76efea619b2bfdcc679ee733759d2829345486735176332e4d20c8bf3fd8dee0012a081120e4408699bd7710399e821e5e7a65db35f50e7a59ada84b5f38da925d3754c1f1532f7a076a8eb45180176e2d900a757257c105c57ba82f9d6d01495c990459de205dc09f92d4c020f623f6f9fda70bb21f433f7cc96077c03ff4a850934b43771970e061fff58abe02fc9aed8bb0c746c1a54a58d3a20fb17799d46a1c3b79b24cb717a5a901b84b6f8523dbdfd801274357f4b7ec64f5ec0a0880296b5ffa1934d88ae1611a3ef7d3cb4082b034cfd46ae166470ad98e81027774084028c8eb04c443191602c4a4a483ec8ffb57731868c598b4662a2d46fd6c1a95bec3c495a8ba997e94437607b3b5d921602ebb92c5b3e48053ebfdaba6a6cb678c43d1494f1505d88ce0ebc30734fcf2056e5dc7a331bae6947504a7850daee81c121bcb3a1e8c145fc39c4e4d02907636755617a187e6a4582df563a1fa25b6644fa1bf35dc2e3f86b725c4fa3f6b228f259619766ad1a0a80f3a696057bb41c55b9633d9f41c25ea62f01a54a3a0951d90fb0c56bccaa2fdcc4d267eeae8dd987526264ba5adc2838f610c2769723e20c8660d03f9b6c80807ac92c07b7ea76d986d0b28635ff6a98abb04f8ec12a05c62665d82ea9ab9ea7409507c54ca0753c234dc74642f46913cea29de6140491704bbef2139e85199623e80a3a89d7d6764b5c3250ec0a357c72280cac2b43316c9fba4997dc0dd5956ae5700526f80776484d04a4ba20090f1051aa99e9aff40f925190128f76825696eeffb2d18784a9b40ba126bd06e11c7e079826b04bde8086e467bdc0c6e994b6c0915115b1306e656b5fc116a48ec1754f027bd1dc32cd917e7a29c86a4ca3483ef7766b4ae3093cc40e6ad7d11e6f567dd74441f77595518a2a46515c418cedbb4c5bbbfc6976409007d91b22fa64476af997d12b023d78a40e049642020760e5dca8d555704a5a0e964f2e34235273d18e67cf89343a8052c3da0154004e03fc5ce2d2e3ded29575fec6e37e6a87ae402dcac0d70c15b8afe91f46503caadbcf2258223d183c357511df31a0423603c598392eaf1fc5c95903aa2f5e7399b326030c70ccd64f88a0b43ad36b9594b0b67d7b29dc4c4b927202d8bbfb9fe6059305b319cef353819e20c0202065efe836a07dca5304cd515cae049b7e1022f428bc3150b78cab74557edf85fc8720f056f8d9d400f9e17c3b27d4da5ae4b3c218fbd2a6d71608d0070cd436b08e393e6bacbe9d6635fc67047d4f90446270e12a9ef3914289800094f211cb4a71ebe500968003444cbf857be1c02aceb98dddd2553b54960c04926f8fb4faac7b99f1b03ac87a5745341e517107140a566a4ba4b24106a0ef715bd47bf9f8136530e06efaf05d9536b134af63a9e462421c24607c21241a344297a4743a5fd3b8bf8d6456248083ed4c6213db5eafa9fcd8986b1c4852bf99546e71470eb82e5268de888ba12bd8decc0aad5a967262a193f810e05dcd472a0e21adbea68a71cdb72f4e7abb467e800ac59033f302dece4147a47dd78bce0e99dafe9bb2afb9ba659e470ff2c8cbf8b961e692d50376ab4e481be11320e87028e0776de8c9ae5fd1f58fbd70dde6a4ebc2f730f526d94740b6999ba2199d1bce6cbdf644a72aea42dbd4e768544f750fe3cc26f7b5833e182d2b6659b56d0aa91ceb000ea945e70fe818487061e64b2409c6669770916a3eb1065831763686168ed9664cda5cd93e8fd9298b7db7b70c827040d2f545172d1397ef2130ea1be03255cc6e9d6cec3c2b9687f4ccb5cfc666384b0034339c91c242243d408031c973ed2b1a76825c4163167f09432595f7e20109026ebd804c1a3e8d2f6352b758eebada297399b9af50b158ae385f6eba15e7b5cfcfa985eb25e513b52b8132ee8d97344c5897b0a2e5a5304e2b67c4590b76f4ec296760642f6e825ae8885d06d83953f69ec4b229255d950bdd97be18193cbcdf746f8d355b731a1c762dc2b3c5e4287e8852e7b90dba7baf70b909e400118547932e0d9a4cfda9bf7e9dcf0bef77c55167ced0eeb474aebdedef68b746a0f893aaba536a2ce41da84df736e48e78a990fb7b655dfac5b6ea079cd61f900ad7a1ea955e0e34527fed2e83dc75c5a60aee345e65499c2c788e5c8c689b744ea733e6885ca91210faf3e20e47e5e585fccecbd700ae843653bc2202a78023a4daf306c076a9ca22301a0161e15380ca002249092726db87f89f5a4fa94a4a5dee27259bc3d68f7946df07f9b0039e0b23a1b82dd7dfd0cdd5192d4aad7760765e89048aacf3232a86708263d50c4d3d56235c08de177a3cc7e8ae55983b1d5f14905b06d4dcc7fda312df831ec5e0201d4e350e2e130d1e9e02a06052813a4b677a76b60a440fa222b48bfda716dcc9e2264cb40b624e0486c759061765dae89aee5ea7273704e0fa2a294f6d789926570fe3649341e77776816f5dcdd13e8323c8cfead94e5426f4ce1405b031c10fc63df12ce2a9f89ed0c5890c08d20950aa5d266500d8c14c90661d8e1928dd8628d5a6be3913fd894b933b7f89a1fb416d24938264b08a40626dcc401bb42ae93fa788db7d81525bdc7faf4c12d7dd385d6e1d30362d28426edf47b40bb747bad9a49e4e75a315248c74a0f5d7e923a918ee683a18f7bacaafa0600165442781a31e5f6c801b54e49373df19147aa5b9e2addcd36290422cc2ebb0e28a56b66626e856485e51e1ddf10dfa271c0e1bee69f9c6c5625d950b2d7d078b798a6215ea4f999745085ab73fd3495ea067b68d14d5476d5e88fd2236aa1007d0da98c78a00e262f56914d083438e1fd34d0a3eefddb7fed9b79fb6dcb0446bdd8b3f029c9f7617e7a5690d45524687a291d658110d24718c1ebe8ed104de3148787cfbd3744757f67a3d132d6f2ed935e9e28bcda50653778e9c2bf75a8e9aef768efa966d80ffdeb699bad0afa602705e23d1917c8f9878a6757d077335ba8db3f25e77818493f959b2394193ae2b237f0fb97a5cd5c2a735e1151bf48804c7af771cbd56b3e629e4f89daec7b4e9be0163f99fab553c3acc22e3fbed29a79d8c5d9dcac7d69e5878d5651bd5a6c74d68c1ab28bdc9cafb0c33c3223a92bbaf0b8df3b01d2f1e3e5904121ba503d7ba3dc63dc40ee30e16161cd7f220ade26118a24ee382dc59f1147e80505ce317eff909c3446e09af30a1f76756635b6fb05376a3644f9a4ee59307d63f9bc3e2b04b882c2c9f7c3e1f331f62afb64210ef55566c7f291ede8c703593309e04550924a5d1d3fb6a010502e7e2407f273639c6eba38fc86c05089e9e62086b218ef48d91cbe506e3198bd5743b28883b5558795fe9469a18703287ef0038d57a2f6975e77331f4886a2329aa8968485e2b6047b85a6f9489683e80ca7711f014be2c7d5effdcf0cc21550ab824e4461e5a1fa3a6d12476c8a9f860c7a1b31ae6c4a01f20f0165b38fc7f41b7187402d4f372a24fdd150a433ed9298d3a480916413239de6203539363b5414f8c6f1aa8e6b785edb74e3db424f22169f8c00e9e5079bdbac3138875ec38d707d65e7ef3a359b3db388b7f97804b1a52d3eb1b5dbcf62472b82d24895ae6ba28e4392424ea2604290192583bf2594154f89a8071512b453cb57c400ddbef7c52cc0691330c845fda4ee68e2823602a8b3dbe190750dc9e4946712751e07aee019095bfde7902bc865464dff5d8025ec769dd95a7f165101ab68ffd018972b4c756de979484511d22c17681c16ba980da4e5f78e1efbc96d4abd7606231119ea6d771dc0ac6a9d32ab41830f9ee4952b3b5dcc3f32b1261cba63574f515871f438855549dc9081728f1e512606257de3918ff9a7220135f61b5b1ce6ddb5b4da1e7205e8a2e111c14288ade1718d27066ad2fdf7c3b6436de9f9803bd7ba7c297057aa96b85c9f05bf599767f948028e40901a3fd48daf7157195e6a04d86b4fb5147cb1d3846a0092e2fcc4846a0257961a4849501732712d553243cb8f823a5e0bbbac0b06b7b3ee69e04e3b3b3ddf824b77a7716decee8b793484ca50073a97592b2cfbbe29a2b18f415178f6f6f101766ce44a0f3a488081d477ebaddb518dbcfcf4a03916e55f1f1def4e06a39a5284c25b56bd571153d5364cf6538282ac7bc4ac1d9e101a7a7f9695825a61d3ce2df992bd2c479e8afa52b8bf6cfa81c7d9044e1075b5ee598f3a2d90920dff27ab892045d5530e21003201e5f5b64d78b35dc18b6cf9b8336ad2acddbd2050bc46fad26898a45243e2944798322e6279303af0eae5d0fcf421052da44630fc4ae2a573342eb9cf3357db92c095d2f9a8384f69c80ebc386a785a5d22ba37fb9a108df9049365ad4a53d51170a58f8ed30fb3f890a98934a54651eef35a1e010d738fce218251901b49d5118568cdefacfa49e0b217fb398452b4795667c32c002dcdad52791ecd2a110331a1ed59e981f948ee2a83a41468e338fea605494e413e2739542c35a12bafbfd074f3f75ec3bc3a1419f8e3a9fee847dd079dba06de78bee8bf43f839045c92751f012b73c677c739d10aff6dfd704f77ea9b2b2c8d297da5b06d3abe3f581c6be013e184603ea39bceeefe910d9418bb9d2f0f4ef3c78b328ebda3fbc56bcbbc0cd14c75413e707a3f8766a2436fd70beb8be86dfe7504fb7e70d63df1bcb9bc750f6b0e9211a1fcaed77e4aa30d901183a4ba6fbc58fbe059dadb5864f49f9f00e39b91918fef35926621b16a032d536e13f2bd0317b51a41a1541d7177597994ed29123bf9888c826917cec73e3dbbe2fbc9e16111f8d485aa77a14213b1db23a5bcb1a70a00a58eb46cc3ebe256b542a1e1465682949b175ce5f2e7f48c7fac63a0689c8018cda34faa4f45b8e850849b58abc88d678f3df7ac0b0481374e402c2388b1aa00d0b08abdee620b31af3ed5c01c6a8e92338c6471600b0f268f21df0dae823cc88cd85b6da190fb48ca87cd969cdb9d9f780272ba0245f1401296b6d9e60e86f9291eaba349a2896815c272b05c43a3f5837ce32ce7b21b0047bd02f2c4175cf98c0112ae80838b9189e32b20e83332c9040eb0b10ce939f0d36e7be6915023cbc14b4c621018d24467e9b2e283ddcbcc667aa22603252d7ba98a711ea9f4aaa2fd7b9e839772c7b0bacda450d33240a52aa5d37ebf55492289a94f4cb3641cca0fec59e8dee6c6796d1bc18a86f746ff168dbe1b7ec8e601b310ce1046cd4f5583a0e1a54e55628135ca8da8547891fd72d37afa2dcae5414e6d1dbb9ab0531101fd70ef96a2f7a57eab00a92e30f6f99fc16040a437dce3e57a7e7f31fd0956353eb65e4fb1db5f4a97b05ed284da3819028219363cd92d5bb04edb98634a1efbdd1afe2f4a386b47efb38c47c8ae02ac535e90eda90256d0b8a95f1354d5d2ae4daabefc6294f5fb25d7e4a97cb8f55dd3fdeff9adda96a128e2da878f765e48a2fb71b7ce6c9520b0b3ab6b511f864e8198a141039232125ffd224d92f1509330a1ff409a9e486ef07652cc192b763eeb45bc3da14ed9afc9060fc3899be2931352bc6fdff8707825f70a8a54f5998e105c3355e12217774efcbd41b3c190a147a3869ecfeabc76ebcc668d0587120c5ba1cd009446115b6f86f74feee1fab40f961b50f088876076a11ea7836c8ed3b70359ff80a9b8126ac9b0b8a377d86a412f9a3827a25647f0dafd336c283de79c19592a47f5e8568a3b5011886e28ec623074c9b20ee017f450ea073af2f5ff1d10433f3014e39d3948a800602311860d8a369e021c9972cf9025e52f21fc9b970f900cca84aac0e1213c84270d00f9613eda66285dcede9f67784fd44c78a2bfbff8d76dc4058b0ea847500f37ac7964d007f0630e8420270098e90d0f279b378016bb1b99a9836c38159ae7242f9901e80f7926aefdca8d261701e4d42e39e512091991fa5816b8fe9273d645901b453d20275ec0ff2409523a6feeb4630edd0b8b4c25dd9abfaff51bfec7791f948ab75a425c043697353646e762cd0d07730814c0379e8bd4390a880f52b7584ed080a871962b609a82556eab611177390aefc2d81255a18cf94004da39f34d87cc5b258f0c0d1f2ad9b9b9cecca085b1c13de2207069691884dc2d1d0e59e2da343baad83163c31c82ec1e5329fdad1008a9565fb7bba97bf4117b06672408284ff68e46314c04da2d294e96e1b6a29816d919644a242ad8484e42d7fad6990b5be610ecec68c05b5bd7b382577ee325588042ff7e2f4d11e9352f80fd6889ff96652a8b95c6b0ccbe39ed10e454437fb3d4387176908438fdc163f634d03b6fb4675fca0a4cc0547d82535d3c95f56b66e5ead1d0fe0fc425ff4a40b4a792d57e836673c98485b6d9c65e1e886f08136e111f02bc727800ad765b0c6b090b3b17eb813d6098cec37be5f3a56324b12c140b54016ce448b0994ec039eba731ae532c2d0763eb11811e43d410fde1013d22ffcbb517b0a71d3e8119046aedfc0b4a93400191069e6ab3e7e561b35ec39d4650fff944f7634fa422a1756f9640135ba845020b094c2be1a1549c7dab2dee6e895808b42c5559ec3a299cb878d3682d4113065c544dca7f9e6f12d34c76f7b99fb5a49ebb52e85685e6941d6aecce10655614ce95bc515da3da547eea4b821430b138160326211d030ca33254f7cc80333a53c934b5701f7d09babf7a0ae8e9ef30804cebd20d0614a9d71b50c3a8f8b80ed7b1369ec4f6ffbd9ac0660072c67fe75dff4f086cad690257734beea4c072923e64ee722e4db04b8bbc248f7c4da04e285f4ddcb53d49a22a4b5338dd1ddb7cb3a7eb44730ec577821b9dd64d6d0c865d152a56746abc18e5537f9f6eaf606efddd623baa05c2b13f0d620f2789bbe653fcd51a94999886ac3a7047c0986261b2d9456bb2b7ca371e408b13ad2210036cab76d27af17fa75d9706fc241d31c28b1175877ac0cc5f963b00b34b77671fc12c411d619084bea23fcd71ac0f26bb762fe149c451944dda3a2c76d31b69001d6380817e13e4dac416f1db65e8696bef64cad8781170c6eb7b2a541f6ca90a350c8c059894d56ae4d6d15183c3e4c571472431cb9f323bc518853624b3b239c96cf1705e099245c50e1899ed1750321ef65eab072e6eaf0ef7a311e5ddcd8e1ae4ddce1dcf7484f17e34654a33a1a66097467101f800a2605a4ba995907300816c0e4e0be76c4ad96e5633e6bfcf4b1e2c15908e3a38cabbda10763ec3052f1be0672c013b1c471bc92d198f2256d5c42d1136769624d58e5fc2fb95441d29da340f9304c8860c8d8653d62c92985f3bae76e3eeb121b37d7669a7fd84ea96801a6cc89f7ca50f51f2348dcd9ab8ce500ab68a29986ee8b8dd83bcbd8690e1179e1c875bf89d5c32baa5508613d192b01a6568db5194be3560d7cb14489660ef6dfba531ca54c4bf7955e7a4e7d174c4764e15597eedd3ba776586abd909a31c8ac4bf5370b8443e9b107187443da4276d34b7f8ba9873fedc15bbfce885b7c7f1849d7e6e547af0884d78db77f5dd1d29e37f375f03bcd980a81c3b5cd6d82e035b172e8518ffb06d05cee793e43284c0587691ca95266dc12fb353c278062dc2d442669b346546787700a5b06e9f08a8728a4a71b35fa815587b4f12e03a1829ecae138387c998cf3a51cc657810f44200d33e5f142d25ec9b2ccfcf7093a26fb02626b2a1efbb0c814b00e8e23b1fca00ef505341e8f9c10886ff81391ea4358abd8a63f75eb2dfb210a9cafe16b32018559262e36c3c12a7e1be8884287ec8c5f88ffa4e0bd58947cc4f383f2e57467f70dc7965c86ba18dff1725773844ccba4a21bca4c9845a4307e7d4052e4c011b693b4953d945993effec7a01fc553353d5e9fa77fd3f73952c62a513dfd2c53eeb72223a426006451c56ea2506135231cb39af2fca6f1606d70a2ac1476bf1087cd119d0e8873695bb0c6907aab615705415dc14f26e869963c0e51b016c085a86faaf0ca927041353e71861b09cc615308e4e7118b54d3f69154e1b5bf4ba692035472f427d7628b4789aa2501cbcfa19a23491e0692ea2dbbabbf1599a65a57007549ce48d823ca69b99abf006af4743bb10a9a33fab547a0168b9b2d990ce3e918d112161e947eb6031985c3e6280c09461f5a08b88d1f933d0db3bf4c0896f3a184cbc1d5ab97fee3dfb546bc2f5ff0256f13419983b2d5e704a6db51caa503134dfe22d68e5d77673b342ed4eb2dbe8f82b7f52af8a2ddbaf97715320e0050b771db4bd505006e0940c367847d52ef3935f389857875bb4c88ca418f42de67b5d728abd60c11ab706ee567c30fe6803927f513c189fbbfbb38c7e12220d46765432a35dcfb264d11e2406b731ce72603c65d064ecb1470b6ef4c29caa2b30cd9b3a7bc0daed1fd6a7da0dc3531d7d5eae51e2c98786f22ff5c207d33103c54c575b24175fc6cd199e98d912d8b86471ac9c0b245864e96a23acc5ece61bb1faba313cd79d24f323de673476764aaeb4823656d327be5b2db9e5a26bfe7f75603b97b827d08f6388e129cd0f1e75600dcdf867cc22a35d6ca710ecc0ae6abd8e213880a7e4eeae88f6f65f8c622e83961edb4b29d66027964ab58cec6f14fc21dc81c5542733c94df550dcd991e29f1b83b257b1d04320841268de17881042cf011d65a45c8d94406cebfb8385f48c55decb28f9efa8f45f3b1af5f43f7333094f635f2ccd4b89f74756b7ba91a4beace82b3c4ec64b16144bc82b0f14c149ea33491a8a51283c746c09a401646025301099e50232791946cc9e928804a7880424638d67d0d71b202dc88bff8f41f786cb6047ef6849344ca1e603455be191606f4a5c78634acf305c98bd7e88b6bff86724dd5b20bc6b979426b2048185ae68b55e74e43646a8542abeddc0784b3aaafb75f3ff705904807f52a7f37444550e1c46e30a32ca136acf5609c27974a82156ed71c5da1891b444b2203ce5442088f62191991d7590d6839397c04327875a2bc9d23d767f94202d50e68600e0d202f7939331cf28300e7a8eced3851e11f318403f1045c20541fc9d1cc2d98e1386bd1b4390206cf8e9145525d37f938c72b305674379421d0f597d2ee2343305d919a73a8d66436f16124ec97e1ecd64ab24762fb16a29df242a8a91460cbaa2732641a5beff1b7a5d9ce944c6805ab3de60c4e2fe6e4adc07ac398e69c580cbc77a906623947ea49740286cee53142db5122ec475e2f7b200944022e6bfaaec4ee417cda2a6270f7e9f1cc955b925d913fd13356b3bfc54762ab44f608da02705464a321454183b928a7afd4a21433e37a97c5f6a454fded0d87ea88c457e5acf211e90134b20a72cd9bd86c8fc5ec32bc1a543efd410fffb8038627b756523f8856286dfdd3834857608a92f44168b1903c9d4ae933069e8533f5325b5bd93e930b03c093a7f3debf988e475a69247874de9f17ba5308209c196a1853e47b08dd19de74df97ece2057cf073209bc97428c001e4a9d16ac9c6980c26fc99fabda84ccb487435f01f5d949a10b64b5a44b903979b240f4668c9bb6d60c8d0971587034c64f84082093d8e3424948cd33750ec7c35f07674c448ff3b5a2f6376bd2b34e5e7b1f07a388915948a9969112fa34023ab26c588465803e992ff91f92c26559bc83a2fc0e96da7bbd4ce38ce3de21155237888181d82b2662ce8009aadeece48948d4e57a05eb62fd4a376c59855caafbd22c7a322ff3fb71226cfa3ff26a3b735e885ea6682b2a27edc3332c9cf7cc517e76f0180b1debebc185f41a6f77f0a03934b97844b82ace2a3f9aecc948df36a3153af11a045bdcdfba351654eee3e7e7d0aa2b83f89c6d00862b80b694a020f3fd875b5525146806ff110e6eda0bd3de82d555e9d5b96f5680e0f03e101bc37c5d8c383b7ae28bc1c75a0bc8aa7b5ee71b14bc7234624eafa054ff5f0f9dbbca26816394aa4c7b9479eaddac38338f2879849ee9129363cc22ec40195a78add32b78fa9fdb2e12b6b454c7a49f382f30d2a41836c4db718807c73c2fb88254026ff2124e79ee4a9c97b2ec8ef34b7225b44651d692b8bc7a4757c27b2638fa217c5ac09e8a77f4253b658863d5f7f970ed21d777449bbd8279d47167d77e4c77d342c2aa610fa072e73b818f5831aa5874514ea70f04ac0ffe32b8992b2ec9fff66b24abd77ba659ba23ad4e04796c14ab6b00fec26f72dde7f9262e5780458a79bc227659b7c6c69e57036cde1594a7566b4a52b0af56a63a771849800677ce0621aaeb16c5af8527c82c574da093277e41d8c507fae3a4daba00691b07d70c01e8da1720f5d734ea0fedcc5b6731bc5357e4f5be41dc60b11d3071e1b2efed63d52594219e9ae094f23b379710ccd3d960c7a879759caa8f75b3a539c90391611b88cacc88f662f5247d235c24ff2c98b5ae986cc31c744f27b53b1899af35bd62bcf2959bd1bd5a871e80c68625872cf1adcab6456470786c8259baa885462d53da25f095f4f0da68192599783b76966a341c867e543852176191aa366e216a3c3944caa0690b3227447c220738ff16fe78b24e87c7f3255c907b93d7a06fa118f8d10774d1f922b0e7ce019a601026008a60401d69495747039782445c7b64d20befaa505e6b51e0c0889cb6ccd7cd0a7cc00312f8136bb21935bdd083e65eb81569bd9f0b603fed827c5e84a63da5fcd923d919d2df82ef572f13a4bc06055a2397c8d850649734da5cc2e2c4814a7994e689740730bf2f0d0b65152247b3754ea8db890479f239c8a44f95236755fc706f8d65621c1c1286618c4ee3ade87a95675e1b75c9ca0d3b54c9bce6681db92fc879696771163c72366523209f0b9882fe09baa058d03586d1210cda0f2621753f006bc58f12d929e2d3c0b47145eb9e9d2715dd962333b9f916437f56496a86b8c17a28d213ed1a6717326c37af4684578f3cfe68c5bf7a10c0fa77fc6af378e9be3a4dc1ae22f60516a77b8929b772f2b9c7632101bd338ecd492422da6f7c83400cd69e033c4c037a07be6b5b20ce3a6e0e059e0aeb3d1e88f5d31abebba8252872e60ab91ee7dd60e0f11dd9eeef4afde114798509e5e184f7f89c1c1a2f3a628499b883d04ad210fb2840963a06bc36bf390615d31e23948ec7aaa3104a5b2f5912b2a59449ca7906b706980660dd417ebae867ddb6df5040b6efc0ba33aa7354061900a179cf868dee39086d6de6ed4d68c1d4bc0d48dabd419842bd01ae401ab9124277cd67000aa13635a19dd5082d0db49909ed92356760404b7371c9455bb34c4e424dda30773f48bd43fe44c945303417972a14a227b7b4434d649c6906446a309ab4b22d4504564a688d08808596c9bcb8cb521efc229834356a6c64b07d1a70df0a2502935d5714a766fbe96e07feb8b8bd6f9a9454ede7eb9b08be29a52f207a023d6deec7d8fec3a9bbece70e0761429394b67d127f59cfa60ccdd58fba8b92a1f3db0702d485d6ce2c18bb646b2e325da220d69c5171570adc8d519eee1d8525e5ce4f43fcd5dbdc69773cf40c4d8d1a1b1960ae93e22fa0efeb208af671d1df5db21916a669eae8983aa68e8e8e0ec5f1f776b8a0b7ed5a7bedebe8501efc55075347c75e6baf7d1d13d4970f6db77f533505db9fd62336ee3186565a69a53567ad57ab0f8af33cdd7d8cad3d3a35c73fff466b1551ec2d50d426b62634defeb42945827da54221af4f72dd154987e619d484aff5ce4f4dccb0304db39a559ca23d8ee3dcb588f7adef15608ade1e6f9ac3485a161ad138d17473211d6f789ffb22f739fc4ab092edf1b900eeef17e1c2225b68c4b26a78719a544c2c577c65aeec8b8e2fb676aa8924c808d0164d564f0a0863ccb0a8f95a5a681bee3f63baba71517c1e77e6511d9466ea43899c15f4fd4ac770fc2b9926dffe199eb5810b0ccc28b4a475a55665ccbf248514c5c809d12f678c424bc0318755ee3bb123f7947e50075c2ab840add35a7a28d01cff0c20e1a26fc88149fc037f0fb6681b923c280ece164dd2dadda86051ad6954f4f6b5b373c5fd3fa4c84305a93efbedbaede85493d6bad605179d0a227784b2fd24153c6d8a52c0b63311911caa4222a9300c4392ea7b6956aaa03244964a93b77b129fa95c64b5fa2b35a374bf662a161b9b76e122b63957095e41fb22b80bbbb268fc33e005c96f93b5e8c80e0ee94ce5282cb6ee7db41d58c76ac385423688238ac62ddcf1ec67afa5f4da6badbdd65a7b2fe77b03e9e8d58bf1c5f75e7ceffd7e0cb12c3a6b11208c8e1b1bae5a2d8e0ccfc7897ee7de76b6faa6610668cebfc2d67219f8e1ceaa9fbd4573c52be49cb3e78c33ea43a16cc08cde07dafca0fefb2f14aa2ba4510231a3102ab4a94bbc1ff0472b0a08119b1a2ec047d4a3fefb0d9452b05a5a2d91f64e5aa36d8f3c168b5d538bd54203024dd2d307d2735bd87de0bf25995feef183b2fc335dedf04a71f19ad79472eba645db95135adca832bcd7e1ae29f82f7e91f2b4583c56962582dadea02e8f8afee4cdbe0e52d17f069db5a656cbf77df5c18fe2b8b5b5d61a8af7ee88a2efd7a216003e229d60dbfa80e9da5249a1d43d531a257c90e450e1b39a1981dd110c71976afceaad313ae31d5fc39bdff0fdb1e1e039db6042533c85470462dc73b63b47ba7eb769486798d02465a2b26b14b21eedfa3cd55df6b9ed3a2a09d3862ff51d2db4ce1c12fbca617621f66fecb66d419407b57dcb95a8febf6aa62efabad9257751216c7f55488236afc260fbd75e9be6a0670e7ae6405243d209e1c580a0d180beeb40348d12c284f6364e189aa45d78447c78d0f50f5001ca43371027be58e15a806cad44a0d79c3a4665e6f0596b4f0bf4dd273f8c5d20fa284f8ae8fc3f378b6db60be29d43a493507a6e0d9cb40b531368fc4072e4a4fdffd353e4d13a77ce1f6697c607f4b5724d16a085031220fbda3eeb56ab052239e22206c70bd6bdcdc45f6d23d8710b5b15db56115a7fdf57e37a4827358326a560428ebb912d6617275d7c8dc0b4d6a107b3d65ac1da734d18746856538bbb6a90b3fc7393d9a4abc8a0b00992da75a6e4e26aa7b4075068b2d2ee75228ef491ff50953c9069b2fe605568e8fa3614e245bb98393081a656871794e76485baf2bbbafa43eda94335c79f0c16ec1f7697b91e5bfc55999ce5afba34437baa1734c72b189ea752b56abe0d05a447174dd62c54f6b7d85040beffea05cd0327b47d57bd0535d814850070cacc57700ad18f3361f53ed47b4fd6af5e92505f1ff527d4da639316ac492e7af9fbaa578135e9a97dbae9c636f599ec5a2b4dab52a10d02eed7af21890a3fda154d56222028cb7f888c845ea2fe4071fc7f58c126e91427a0ae0ed59e0f684ea5d168ae4307cd0d5ef37d5e1d6bbdd2612d1a366681c859ebd50ad6b22dcbe96cf655a1d0f0810e3a5885fd06bafbeb50eb0520faf1f424073e44adf174831ae0d6cffb6f0aaa7bd0085090197b3c8144790c1f0ad5a62a35c46023175224a7e31656b1afb7e88a52800d430072448cfebd0480119071e2072a438831a25f5a9085cbc984c5071c98a4008a10533c1953c3932e7ea420828c259a7c71c314e30528cb5f1f69429335a66bfa4a0b49faf327f10c9a7ccf36cb0e1b30a61bec3b02c9d1025fbb7a4293efff3310c4a821ab01050c0683c16030186c05bd6df2c6edbdb7a8f6a0b6ff8de2ae6a66d3d4c1ecc18a6985889be522d5a50a6685da05ac08d6230ccc849930180c0683c16ac8aafe4afbbacef2f7c0087d377931a63c97beaa0ae52defc8051431e8981e3d68b25e8137185c7be9a55d84290302e51565599665599e1d0f655a2d515cadb4268ff84bd72cdf6a75a416f22aae308119e312b7010454ca18b3900d12e3921a598c396c62cb9419abf454afa63557a635efb5001341ceee6fced992a8395a9ce55fb9d4938729d485e9ab96d6ac3d354acd89218828a79a0304b48a229fe779e25b462977444101a614054bf7b66ddbb66ddc566b2461f3566bcd8d8e269dfa39ab1ae968a0d6526b79887f53b37dbba260f70d51b08e5d8801912a4b554a952acb12f579a707f2cd6b1178002d610704fa7a80d28ed28ed28def5e8e7394905b42597d65bbccad562a04a001988a23252c9051094da1c990948aedbf6359dc87fe000950a001548441a97000dd028c06501c7f2a381b85477908a1a9144f609bfc2dc513a22f6596b63f0f5761811a01ff7d22f675c76c6f4cb103024dfec661d9a3365692caf0bb7b156715470d10d2e068bc8f4325a24dfef6572a77e5b1ef18f4c7d8b7214653fffd616658fcffffffbf6ff26bd91700f64e4e129a5ad60deb689fa27a40a1adfdffff7f34d0a8447c0c9abaf87dab2edabe111a8956425542b24a560989f608d51ca73c350d0194e58abb37d30afa769410a24a7356edf118688e7f57969546e65ee79edc716d252885d151da1bbe564c93e2d4b71bbe2b9dd58a463bbfa29b9b9b9b9b9b7b33bda13c1cd0970f4cc5b6b6d0a810be8c8326738d8bbad5c264d4fad1d914139ce5ef81e779dd773f00b3f2116b69d1a40f9600ed3acdc1e67e0af7b5a80391585693091f68a1c9faa46ef6f1ad7feb6720b7f83ad1e4cace7c8c60efa67881dbfefb62a0c9bf35dfd9c28c399383df5b4978f0c6f6ec875bab3c7381562f68524b5f6d6586aab0bd5ad160572b94a76641715c8bedef6688b1b2bf2862fbec0a3dcbb33a9b49096a6a6a6a9acdccd317ad41beb156d70081b6a10d956d9b1054b25d5f25db351c6f5cd14c5628411a665c79c10e41883172e00c15b67431c6500f5d8c356861a2e0428b164c48f880d403d315489460b460713ef8b1d9a04159e63cb560516d157772670fdce92e0db63f87c471997132eee4cea6ae0bc5f1b1a2495c8471a0e120b00f98075cc455c145b8881382a3c29d1c95a4a23249044d348e0a8d46a3a9924460a402a36a42c345d8c445345c44c3268e61235cd4049bdc99830377621bb00eb8076c051771272ee24eeee44eeee44eeee4ced2a67e6afba635c439b53f6d391431e094a1edd71a0f0db6f2541d52b5478ab3fcbfeffb849c36f96ddbb6e5c72821bef1fdbeefee572d2bcbbfb46256d62fa51336a668ba59235dc3ba43cdf1c73c6892ce32f7afa765f94d80ba2e3632f35c73fc9f304dd334377cad8f92696ad4110c06abb0d4e9bdaf66ce121a76efadd936591306969fac47d4cd755fb350d77d173ea2f61c40fce008f1887b6b6a9050963f066061603018be563c8028d62e04de0b5eb8b1e957f1a7f4717070eebb0e0f176962d0db732fb2284ee7c1be7f3fcbf30c40a438f7b94d14c516165f1ac45a3e437e4a25f1e4224b9a71471ef5542ea096ce8e8b33602c66b0e2d85ece18bf87adc518631b7e1ed054d6e468531a90cd59ebd56a26b6501deae4a13e14973aa2da1724698dfc3cfda950404e9ff779a76f08a54aa952285593267a8683193b9b599ab5fb88bbe8aeb9a1bba6e667d0abbfa005b3e42c267157006ca1edc3fe737c07ef1f0515fd6d9eda57f8374c4a5d56f635ef0c9cdb1a701c0e70db39c06daf2ede37f0dd1b6c76db701c0ed037c76510f4baae4b710f7221f739c06d3f88850bc9235f08e6781c6f0324996c1bf9fd743173cf717ee2c0f114c56d39c2ed7180d98bc87e5473b2c75ccc5e44cdc9bf71dcdb00d2e0734b5baa316d3276e66dabc5b52a85fade3bbd0fe6e22ef2e6c74f1eb15c5c44ba56cb6de91cd9d16291b8547b027dd9236b8f6a6ede1f49922021d0b769a3a02e10e70035c5c10fd66cdc4108d28024934df3de4dd771d07538ba2e47d77dd7815d17765d075d87237c30e3e06ecd459b032497e0bf1dc611deef40ab802b46cda97fdf824b35c75a9a8bf68a81c15ba3bb666f06014d51288eff0994e2537baa8fc0c77368419317ca6c572a2f379de52f37ba365c2854fce53187e223b820a02eb7e142b950bcc8a178d119742699d593d21fe7799ea783f1a2223f8b8a8a4e137efc797699db70e83b3be7399381078697180012e8fa3d0480045ab4af6cb3f52180185ddf8af5460a4d8a14e9deebeef79aa6901e469aaca6c9655d56d692ce9bbc255c5c963ad6344dd334f1adb582e17df8e2f0bba15b2f4cb3b5f3220e6e9aa6f9e686e479e0ff77ea4e9d73dca9e3c66e426a5630644967eeb7c7afee71ce03b476b80dd738abfeb6e4c9a0307590dfffffff6fc5f04021034299fc634f92f6a7568918ec0a5a9bddfdda30e88ebb67bab3b3e348773baeda3b5b345943674095d6ececd4f0d1e6dbb641813d192adf6d78a1eb26b5c3dcbaf07330ad61fa45bd82b9e946368c1810f7de0f8af671c496a18a9681d22de8d2ad3350967f0e5686b3ca20c3f6f7f1f19919c935f094ba8a9dcd663318a436c6d8c70c229325e3b0272e0a19425f16a02cff6e09208ab36f5889a21862975862b6c456a68792266ba934c4e90060f5020c337ce0deb22ccb72a5b3e2ceb0f7c6625fecb336665f9f7b95b2038bb63c469a748ff12043936ef1e33085ed88949dc477ec5b3b2f62d175c9263bb06dcd291b73d70d63b1582c168bc56e2c7f602b93430fd157748c1d63d9fe8e8f362f1b177b3a85424bc64bb3aceaf6e28dcbddc9fb504d96a298a9142aa553d6b33560898176bf0e745895176663c6340c71c66cab218d1d903858164a98b906a3132075322757c44e5d88d0a1c9a39284d1f775208d62871b4a940eb258eaebc04ac395166663063d78c1e8a9be0eac4dd2a8e268cca06fc1327a5aabb44ed9a75a6ed8221b33185a195b345cda8ce2781614e7d26c36d269d8e8c280bbb44b3b374965327a9297e63a74f0e071ea6cf2d2487a9297b6290e0242f2f5e3cc9f2ce9a2704e2d93c9b832f505ead31407e5612bbf866d3097e54dea54c5b865290d89b85897c830b94b83da43b7bf53517bec6351945d2377f955aa3d57501eba2dcdbe725c90a5ccf7e36a26338b6044fb96b5fdf223ab03edd1f78abf328af27047f6485b1e3216ad6573d9d7cbf6f711e24e29f7f64c8450608bc7f6ea27eb00079dc2dda4c8c39f529e1d34dba94dddb7af5a9e68250d30ca63e4ef4b7061a5511c7f1a4d06f6984063b0278cae48fe01fafa421b7a8e0bb29419c94a33a2ddc4a0b7c74f3794256a59963f52f52c4559a2020c9d1b8396c845a7fe85424bc69d3345930e73585734631a69bfd5a6bccb306d6146385c342c29cf346d559385412e26893419084113a301a256f39ad7ec2b0913532d09c5494279ae1994878cbbb6d38be286ad3cf77102bd05a1b79c75ad11493df5fee427ef95707f3a82cda06654af55f951211d6b487a91673f718afe364999a6e86e3325a13cee795e660af2266772b1f4da505212e5a94934b081fa729f39715811c77d11fd593ff774e49c0c8ae3ce44717c4c65b975b23db549af798d28ccf630d9fb1fee4f9f5123d031f51f68737fe6e98802f37f5f84fb19ee3fee957830fbd2a1cd7dadfa5ef54550af4325a747bd0a153accfbcffb22f9bdd3874242556c889c7e043a9ede3b856eda976959a9d309f5a80c85b85252e547f5de2bf95e892a1cf2e44e0a159280f4859ec38e6ab5a39ab7fd8ce0b9917d79e18fd7f9e857dc75df2684fbf58a8b5b9cc2e44c2ba8028a32a31093915a1699c4ee229e17da1439757f7a3ada8c700aeb2c5b56ed815340a5b90874a4d63485a956abd56c28b32ceeab519315fa72336a4635b21a798d82208be5c3c7ae59d60b7a0bbdd60365f967a3d08826e631c1be92a1b2a85f5734d32ea828feebda3aaa711cc7da89dd58c512e382bff72e48826579120e2e34094662473716a3495ea048a038feb1a4582c16f3d8e9097e2a17b5e30a5daf0ad6da0ea8b0e30209700f29f457b2906c2493a27d42fd2334d3767e92d63c8eac4728ed87888b1b6cb2668b501271897536d8fccc3ccd4c4862d8c6252ec24436453dff54d5de20a7134dcad375cfecd8a7ba31caf2ffba8eabf133f335a150cdcfbc57a3c6e6c7c6d7781ba19dd9705fe32783aff90c6a421bee6d70355f53835385a914d5e224e5c2d18c1f9802de24aeef8129903788eddfcd94e5a9f29a582c168bc562b120242efaad2d8bb7ce598bdabe68cb0708354a0a34171b622d9245dabc8e9cf640b8a27b629aac3121109c8cf93950a8de00c69c8d424bba16c6fcdb91a5d8d2d25d0261d3905c6d1090346ac987d8e87d19776cd137080f17f1bb88f1bb28e217c90f08085834fe9e1d344997b6a56141739f033b80f0021b654d99fdf4cb19e3070ad1266618b2615c82bd7419bfc7183381bb6c9f626781cf9c534f66fcd174e5b80f05d2511475d0f47daf5a9c8589167ee153897ed42b51fdf7344a68d52b41bd7e25dfab9ea4a77ed4ffa8fed38ffa221a150a5529a20a6d69594e26044c14118da87065595352750b1157463a56a119a36151dc4504eb401b0545649a9bb4a60e9ae6c213f2735de7d9ee842478e7b7bfd513ea57ee3defa97d9d90bfd22dd5856412bceb4379eef3e66ccee51067f3fe403a6e20c4cb9f466c942757cd6ad5c8b6d94c310a355b64b5d9038491595007d29bc3a01b2496354593b4d6a3881e483d9ed096a2b60dfbe46dc4be6a01945839b1fab2f2f1a921899da4f812c65e8ebb98827473dcce4dcdc655cede00455fc97256322f494a399548d24c46a4968d3891b060de1c58ad1799fe995214cd7a6555e71352fc666f5bcd9774daf3de7b57d72fe54979412d926582be88ac6897999d228b3364f6eb36b437ee73aeab1abe8d25a138fe16896c756353d4799ee7799e6ef0c49cd7b9b7e6f3ff7712bce4fc4371605e2e8fd7c2e5efffffff6f58581872577dfa5e057f5cf833ec0ea149caa507174d522e230a3449b98444643299cc869b1b7de37e737333e6c683319adbe40d8771cde7371cdc9480be5a34874993b4697f5f9f78a150951fefbf1732000c52b80c8d5e48b6b61bacd0e1869166bcc99b3d84eed37360f727f0378700dfdb7b7b3d18a37deb818584598bd6aab518e082d30738183743ad56abd56ab55aad56abd56a5308b182a4b1bac08828b21368f2d66a351a34ac56027d996a4d311926aa358900ca91072ff04103d0ccb2bc366b52abd1808eac58308d68c242914a55abd56ab55aadc6c1ae4ca66a82c1169f1949319f0c1949319f0cad809164f6c5d11ba95bcb11a3c92bbb321994272b105dd99521f9cc6932a4269ff98c76efcc9d0be359f8cc673ef35996990cf685bb30cf11e5c1e1f6e24d04ebe0a54f6222a2207f6939a0d05a97bad4485ac89daeb6cbd0b566db6a3ceeaba13c29cf622bee3ae2505553d15cd4a2a96591aaa4edaf9259166dfb0720a6c91d5da250f714fc15ecb64525e0be0a0cb72d0a01aa99d65a6c519e5aed88435dd2a0ad88c666e6d0e5dc9597cc6dc260b092916555b7176f5cee4eded7a4c645d1d8d52782e0223676bec58a13dad865b02ef1c418b2b1cb606d4205278ec62e83d5a82cc268ec3258b7a8404a6dec3258bb80392369ec3258c1203a321a3b23d2908ddef765905a91040ee7e8a1ce2db5d14b7d19ac51c03869ca601db2e185a3b1d352822c8cc60e0c63185b4268d263463153078a631433ba342b31232373e96a31323232f2d80ab11e6162b1132976148bc562b1582cb69949c06030180c0683c156f0156045b018104448f8e13fa4d61f673d5bffe34f2222da74fef8ea93b3c5f7a4f9d4e7eaf40e05371bd49c4e054bcca41897d0161c5d01c378f10c378c4b368862bc34835dc3b064246d708323862671e0a83df5735096bf0072cef6170e8ae38fa3e66cb1277a83e185132a31e79732bc6a33fe1d4468bbc95c391d4cd33799514030aef9ece7aeba4054897cb4d0a7fa95c85df671ed4981b6e99ec9eec2d6175d487384a69bc8055610f10456eb3981be5c584d23b4922adc2b39bdf77e7aef7f4e5e68fe7c212aac384d9aa4670728d06435bf906068fb7671cf91d9ab52bc62a9e616215030bb07154de86ddb10d93fae0231314819a965a182e40f8376db5aaab0ef66a2cb1474334dd33ccbaf8cbf90d76959318344597a695f75a80e9575a8ac4344fef22117eb501daa437588a8f6f8d01377c5ec0bff515964fae9e304ba6c4168db7e043a6ea71cae2cebb93073364538fc1c11d77df64e1b461ab293440292976ececab22c59257e54909f112c16188478e209304cf6166e5b887f7b26231dab5295d97ab4d5a1d026480856541211f1b2964547652dcbb22ccb72e6b49e22815771d0be69973064a8b5d45a1f3be8fb344a68efbfd367fde010fb3a85e49103b8e83e3f7290f1d9325db5d65a6b7dc778d65a6b5794272583b647a5bb6ccd8176a1196dfb42eeb2dbbef56157d025d35eadf507c5b16f438cdedebbabd5cabba820a91d45e86d45796ed0174ec7a3bef7e5ec0116d018fa228b52134ad48a2ccc30609cf8c0031247baa7a63b1490fa41eeb2c14fb9e7427ac19a18b4d10f5e92c0208541c6c8c4072bcae8c1491455b080c368ff87fd21f67d0ca1b7af1b408196d9dc532f5b08c7230040eeb21f5439b007103d5aa0b7a7a81e2bd05be8db0477d9b759af6cd5e162b5f65a8f05f93b231487d2932501bfb7e6ab19fce184ac10464823170ea9a1ab8b6ec241de94b3d6ab554bc7c5fa039b7122714ae2ac39e779ee04059980f4e3e4e3139f20a8a44ed7f4b064684604000008d3140000200c068582c170483824992f757714000b5d784080643e96c783913087a120454108196408200000630c1029b1990d20cfda44c1caaaa942576a40f6631b3e4a488798402f5ca2f98684aa30d7e9cb57c274a5bb04c504e80ea3e08ab669054ca169ff662c43530329b07fe33600d590f6ff746b852feeecc125e108f32c3d2ab2b4ade60ab9378e0910870163faaada1b885b492927b8b206ad9af4a629826601b1746a69a140a508e72d814cfcde6dbe3c7e7158453eee06ff53c67baaa58dd8fafbcd90ceca94e5bd7ff34ba16abe279bd0474b03164beba312c39414a1692664512ac1f4369d6e927398c5b10a03db52bb8fd7e1c65b99e4167e9c290527c470631027494f32e0be883b616e79483ace269d763232826316b8b15f3780366035a00a7fc239478381a39bb7d36b52e5c3a36880121c8c8280a1486240d16061429ae01a8a1018057d5c16e3041da720c4b223c8bf56a8a61a822eca25ba72f1d66fa0dfb581e48f753891f362310dd98a2772c0ab843b682bdb78339683bd71509c4ba3d87f5e6b6a9d5ef6c9916860e45b711137b1e82b0cd12cc232f474c0f9e8acbee062e96113da03c95c1d0f712bb53c68c93866315c9a970a9a9f2fff574fc133ab4112e1838d2c1e417d935c4c470d703cf54ac661959512952e25f53637936474ac28c84779c140798c6005d2fdb0b962a8f75d20f05cb295b608b331400f5085d0a4936ce5cb39fecba9f1a1f414188b7ae0b3f1f5a50cf0b46c6a576ef38f087aca77573a2956f7685ce0ab74732796f668a2b80d31eb2e57fa4df6ea6e66e0e73daa6b377098489709d9b1f4d5460b7e2e38df412024c4dd3b64c99276a584d121239c5317a84728dcd560338b4d9788e4e0207d33745a3c74bc3ee9dc5599805fab6276c21c6120a60f0b59813f5a7816c22925ee244760c51d8d891b2bda4e416c1d47a482c1953cde0a4b46c4e5a161317a6ace9cedc4b5fb23f6de0dc42ac2343d5582b23fe56f4de5e68b46ef51c3fc32b3ab09ab74d2b338a9643ca4dd320a6c09f3fc9a9364d437c6e991dbe49e64393696fdb6969716d49c0776f7ca7654c1765a252a5a32bfcd37ae29e971780fc06c2df6c353cd33f1169b35ff6490aec162d788a04c17436e5ed77416b04dad471b6124138c9c68e8d05a9d964c5844b9dec536465ae0347cbb801266c435741b277e092ce4dce3375e8f7af415a7fd90758095e5632e87fc3631502248297e172b45b1d6baa0603d42ebe53dd4d41fd06710255c944901042d8c1086623088ed1ab0a31ed49c9ef48f32f8fd7fa255795a98a42687f7b8f192edbfb5ce1eb31d4db8ffe10b5ad00e568b75730b03137a20c7bb3b431c2e5ceaaf637ef4d9d989fa0c6da533741884f502f8d52c081ff96f2c71d72a1e511ed299f052203a395ad90b2a423173bed414bc70f88496ab09c0f6c0b3afe09262842910b12e140525a5a480e3714ad3eb05269eed4a480a48492029c8042f3769a40ce6dd047ba20cdc578679be013d41387c11eb397371205c06aa2bb98c97732e63798310e6a8cb2841de888bdb4710218e4b3e41171d2ecba6b85648acfefa783ed69f7498f15c15ac5f477093b355f04e337028690803bc7345dc9dfaa463dae02413f35bda213dd02413d2714fb152a132c515cca8ca6de14a6542854470651501c72c2528725924e2d77c9cd4b6355d5994624597c0ae8ac09ef703ac0ad6cf84adc46a1d7d8380947302b6b44a18f73f94bb16e20e3f381a3b8d58cb16dbb9c5a2a892da02e6538d9c0b09707bd9841b43aa0b940838d79379001278452cd6d2dbb169523ca1b99980b922e0d67d9ca917a3b3930fda5400e8ab642ad5c31e271f64ac65407c71d49cd09cbd9403f4c47eef7772bbea05f7900bddee6799e52efa17732b6e5262c921394be47abf2b0f584c8ccc4b32ce800c855cab1b7e5b201e3d645428ae57b8717466330ccda6ad55219a96c59958338b7655408447a66aa9dda70b3c6bf178a3b3c226068b73a2427e0d2c8a8f56830b6021ab17716d139cc5f62c5e7108b4d5c4eab15743ef935fca19d44fb56b778a6a4290f22586d1b251c79278ec4697c3cb10bbe0bacc88f6f802624823e55c254bda4cc96b7f2342b413c3ae391a04004f8467520354554968eaf122da9044d5b57176363400e1c6d5de5a44d9dca08d746f3f7f183940945e838f8c2a0621a540cba9d3ebfe246bd67024db3c47a2f568d6aa8b21117f5142d516220ab5f7be478ae6fc85a85c7c669676218b0d93587e73ef97b2f4aa62d023d59bab9ce47b83e2db6ccd10c140154496e334e71f3563072c8b18759dd5d1c6c1803d8054bd2fcc39b48573dae8447711ae33b1dc3db9a6d446c3d75d9fc397666cfc7d689b31f62ed45c03581c87f612227cb322676dbe5497dcaff323d11c00e76df660ea86dafbd83aabba6583eb137a8084b12d08b5ab640687cf4abf6b0a1ef2e9e5d5b4411a6a493b4c2edbec5d38682cc57ccc128023fb9c252ffb59ae2025b751d77e125c26b8144cac922b7898d5967516dc609a257f4e96140d0720523605ca3dae6dcc4a9b97e59487833e6f9d6969fe6821be6d07dd490ead71dd62eea2393aa2e1c04524eb0457631e9ce02ee94b8c857d783acf746cdee9c7b5d54e1cdc13286a8add307d29d2f00a83730981d32c8e5c914a367900315965186f58ec0cd2fce7c68026affd4ea92cc8d31b12ed008f04a7832da23b048025d5eebdaca7e668d1df7c2d920357b4616ab4191b97be2bee5a6d529c4fd614d83bf9156c09a1f3a2fdb7550b6755680d3d2216bf6d0d1f2022a434361b80880aed29b4ef0543f7aba4c305e0df7ee9bb23b2573c4d36f080bef19aaa252a4b81839bee8116a66dbdf8e3467fe04360fc0b10df057be1cffc0b885f81e15386713af7173b9625dd006feec5aa0d777bfb6b7f9674374b2be76001bb071a3a3ffe18c1180ee5d1a22a1b9893956a9920d79cb2a4878a244a0faee8bd104862d296b01872e79a48978046b6fb3c4d408eb2ce9a353122c058d29bb9ea12c0aa632aa0c7a1f30ac8536a5e5c28db00de1c5730a0b0b689f2594bd2499d95167cd3163ec389165adf8fad268dc96faf548968403428b329481815ddf9c36c804b550ef0f6d920810a726638a4fead980d70a746d447a701390635bb6bb49e40573e4882e2da018e9cb312a0468e260beb49645ddab06dd3e762b0df4e2bda7ebe819e8662273ce2936ff5e2f17c331bc04e10806f12c0868c300e911967034c128d85ce922dfda09ec20220908ccd86611f1f96b6bab91ab41813e30059ffb82b5335be72e36f78dad836cc06f0661ba8812a128901ef7f1aa764c10bd8321b80d71c3c6c09d1b6887a0cbbe2b0a4fe823b4d500c0b15ddf88fe1d730aa6c0b71bbf1a96440077c399eb2624999d87b0748b6d801fc5ccf05de115ec8ee47f579962990566f8e20fc4e1882e539c566fe02c94f0189c6c03f7aba4a08182753a914e3ccde122315a09486e5ea8c1b9b3d2422f895cc3c2f11d61b2d4be7258235202c27bf34571cc08d44726804fd9c0b0f8d23ff2ba5fa43bda3ccadfe9b0b2054f32f16043ea76a25b06641c078e7eb9b74aeb4c697a64a59e6a688467203fadd8d348a5aab6ad6e68552440770c66177f2074382c8f93489396c6375d9d1b1a0050955006714e47025e33f7f9efdff69236506d6464e16bd433f8023fe87e06fbfcc5543fdcbc802b256f303967a6d06e707465f0bca897405f3ca303f702b5618a4acf981161699fb91531a87c9bbd4634c3b182ecedd0880d86d3da8bd1ce12074cc91f191ee4fa2970cfd735783e5073417c537ead784822ac1661ea52a85c1d35732bdbee19b7db36fd86fd4d6a6effbede9f70cde3b41a1abdc30a77ac780f44bedf1682b6e19d5d4f8f8bfa9cc12fa7028a7f1d489ba8ed7fd1b5efcd8f63ecb0e6f6827b86492e568b2b7d46610f1a393d272091b00e27cd5eda4bed4d39ff9dea9d97df69175d9c406a09cc6faa60069e874566e343e74adbdf5e0bf373488967cd75b9722eec7e1ca22dfdfca57b448e792a3710589fdcd47a40c3d9c4cc64f3ad97dfe382cf726c773c3cd023fca249d4b62374bf5f92e251e76d1bf04e37e38d25907be35e40fa3f035e9c5fe0a9448473511cb235c0e37b4260f01b1366c13988b35318509fc930982f740bc2b9422dd5d1653835176b8a1c98861b09a64073750f44332393b6057b1d426db4c4b6d906fe7c0818cc459c4d363ce57176b05c733e86a87f25c6a33bd92894116d0e80856bc4c6dc4452ec6068e37896a6ad39140bb8c9d0c1970293a4f840b9769c8b891136d96884e2ae1d4a65670b7883685a1d56d153170e7107ba46aa4a19675839c8802160540e825295c6c2c5332d049a8653424b9f564e81907618beaf7cf453178db8b6a49ba1d792f1ece0e49ba1002ce8098664571c7e603d805895845b332c4621ef7525a7a6db2d85038dca40d1b0f04c3899c0ab53b26bbea66d3778c87f20b4367408ea6c39380ab1a6047f05212bb8a804d4f23860f173e2e5ce042131518c3dd4b3757058d4310101ddcb250d42fbc41d5e7cbc4422f80c370eeb7f7c3f0f580086d446f5c82b405189e3454c64b0605502c116df3fe922b6bfb76eba3da8c514000e31b7212464aabaa56aa69bfa33271e54664243ff836f076148f0a6404fa77df12f1833b0924e721cc9c0bb38abbc73735d8932cebcf854a57945ec773982e9a04ab07aa6e9eccc8224038fe78984b69ed57884ca37c1dcff20b3cad420b438d3881af78b8e0d4f4ed730a2edb92a94bb669db91ea6fc42069d016f59ceaba2c5c423258ee7ee16786916e9efc8321954dc86ac7a4a43a06e68e4f49a46ed60a1456c4263df6a4ec4db882f992a091652178b9382df5eae8a0ab52073b1558269a7ca3fea08ee45c743f7b005b2be23db995b7eb9e327fbd65e9edee258aa80bc9bc1096a18cbb9ec5df3fe5659c7945a7c2c069018964385b1c13341c5599eb9aadb042828b61a8a80fe8084b3119f631156201d286d4029b419f160aa413d0e1bde8ca4a6653c0360555b9b7f7e6ca2b3bebb78a6af000367557d4c84016eb9a1fabc5835fd396dfeffcefec1c04a21c0ee55701f18fc58f7385e567be3a0830c7d80adbe8404924ae4bad0c1f13f506ac42ee7bb4cd7fd78a9f2404648e0c2fae43ed0dd474a5f3373c7806bbf9dc51eb0c068e7c0bdc30fa58737d7d89245e366bea49b2771fa3359a9db11370fc5002a0cbe312736e2387073ea8ee0744fa49cdd6eec9740631c2d79ca7db5cc28c35523cad5d0b344de517a13761d736aa2fd8d996000b287317de58ec005f2d6b3a9cc23c5886c06e30fd6e94940bd14c04b61b99e9d50419fd07a2bf8dbaa3641e148e0666cd503b21c0ae4183b2ce28ac70dc2bb2c5c3f373470722463ab6296fd5c9e943483e654d3e002c86934ff68904c2f4f4742024637c15b779a9edb18a83659ec22c55937b32191f8b2ee3501ef47ff45702e8691c5e325f448bb47995f9dad271749eafdd84fde7f22f0992ef1f7bf5f16157f2f49f2edcd3deda41370404a1fd49ff321adb5ebe6bc281e9c1717a125f530c5479802ed403b45d2819116623449071fedd309949d71f3f26ca7c4aace6bd0df70d8938073e810fff1b13ede22fa413ed2e59be2f141945884cc7d0afd176f0a30a764e76882f7b36b64a001118e57a143bbe61d7773229180e505aab8b1ee1f63d236bdfbdb367bf66a727c2bba70798391938c084640a93b12566d708a2d067cddaccd48366ed49f6403e077d58a59e1e6f491562be53acbedadf48cf323f5081332b1ba78e7360e442abb2f635be241d916cfca45494605e44475a5cd90177e40c3f6ca5be79227b17a09f4985be82fbe267323c3d30ba486428161472fb45e089e663a692300b96799ba7237225187d72a373b8440a117b29a828eebf1e7122ee30e163f6a8430451630c616b7b7b16837d8c6977af8e65d69c9784753043041cf002898861e25a389970ae7d36ad7c291f3c895c21e7397fa6529eba17e582f7b7a98d45d14aa12085654454310cd16aec9af3718f2a1528e5b510532b56ced64bedbd3dfe15d2d3f1bd7dec2faf2b1d5b9f0463a4c4f55d57fc3a0a68920ee1afd9e1867d228009d5c3c76f13a3d8d326d393cd14f889374a81d3c0138a08c7e926175a03aefd807d3a687faeb430385fbc48b426a66ea741225e5ef4f9062d6c8c9e6f11a8049cd1e71995e3cfa9eb34b15d6e30302f0d8a5e413e6da7859c1c01957ad95ad6ec994c6df2e390f299756d5b1356131b548f8eab00e54e945d70b3662ffeb49a6caeea28b4ddfd5eba6c435ab565fde4868790c52e31ebb41adb0d062080a8982d22e003b42ef9bf1d35805a0bea091719de1cb3e12ffa0dbf686a74af170b8e09531d161e11e7ead74cbe5f30e547e7849f3db2b27658ea1b31c880eecc9b4ac4ed7a5268e9c6c66085fc2ec7e19e67201685b2ad7d8bb8cd7198146b7436d7a1e6f937c024af764c60438d9c00f68fcb0a544732d74d9350796cc80e4d9abf5b04cc94f256704bac4ce2f26df5344185d9147c2745c24dd4155399ca5844d1ae5519e444aa2677bef067b865b0c6c35fdc0b9c7dbb8f1597f725aecedf313755d7270515fbfb9ca3f013de6b012b05d5595d114911bb7494259e6f40300b3eb4e91bcc690aeaa4e01494431301e5cbd471c996cda35350c72505e19d9b224b4f41952f5450547241889450414de77ee7519f9b40b30b8e4746a29f7115073f7bf056c9124dbb9a176181f4604891d4583e8a82c26d54acdfaf28a8b2e8965df48f1811a2a33fe9a74f4e8fb04c77a65916dd79e0f61c3b8d1c0a6391baeb200f56c1311a8f97f2c7208a31f59ccfa2cd0a54c59650127f96075b00e9b9fe2bd4806819190988496ea5806f694430590a403e2108209bf955b868a0add586ce80aa63ca377f4e8e17952c5059894786e9b93e0b289bd5abb7469b24609d2ea9b98496242884995628b070f42b8c69ea92ee0629b6fe5514757a4f0381718750d89fb1a19046d337f6d139ca45e590bd8d6af9290fa522b5cad48c34610adb09e22892807569198ee5276ec15f28ecb5a4baa073a93b1d1a13863b464cb121486db78d82e77f6ed06f1c45647681fae21c0b38b9f764f8820b9cdbf26f4847e03680da664656519e32300441bae550d2b88c126a36fc046766aad45a6cd7f6662d8c78af632798f166597c53209b03154c280a05191d69dcd734f1c85deba286551c18a46a65d559ba47a9fb774f740c79e529106fefdf0e444a7453ad66330786fedd3e36df95885e9ef1e072f88c89d2ebe02d653c48cb90d36e0ac4e20267a18ad31731caf2902ba600a729848182d7f0516e36162d34247b4d5957e35b2d3aca8a794c4f2768cffe8c22225a1c0377793b94ed9a74e7c45c71135d455a89a55d0825b9b4bf028c55df9b13def9d608e9e96ee4e769887874ecdc5440cd1cc88af8e6416136af048b0d58fdb189d51b49ba0969d6da6269ae7dc715c00362bf38aa203a8babf4ade7a86a350512d32528ee07c51444d05f46b06b0db0fbbf7f48507bc4796d7ae3df1086101e0cbd23f8e741bdbfe862f8a286fa5eb9527ce32f3ebc3788439dee7cbad3b1a0933661bef61a2939011e420cdeb686aef27fd9f40d027af189954e01fa10eaedb841eba41ad6a086e3c426607b74c1b29429b02820b05f828131f0c65cb90fecc1d9607304979471f8285ffe2d9ebf4ef8b5c144565d8fe469c77e1459513a6bccebad0d0b4014b6a1ec4998298b395290fbfd6516ce5f1c79229b5901e445c74ec5a9bf2a46fa46a95b55ddad570068404021b7bb495fbc714c6289437c8498d79ea307d68d618865216d89ec9ac94326eabb2dff44ab0ab9e59be6d028408135fd817534e80bec564fc41948a9ade05e8e572754a32b4fdfbe9143c8e21b8a8bc7c78c8779f26e88d002b489075f3085966230d45bcd72e1428105f811ddab80be3e6911e4bcf5c0e23e7485ded61391f6cc9cf19929e612ed04666d3a5a83d6f7e4bab201dffadb1ce13af8dde6ff53fa0a921d356b85a4a1e97614765d94a36e7630059030e6a07a33fe1a4e60aa4eddc1c7aa7dcb0fae4b6ef65c5501f22eae08d3c16910bb545a06406ceb4d41cae0bb2b9a56fa2d9b647ab13949bc28431068de0b86c086a4686c245264095d57a440a6f4717f5fec03b204d2a93652cca10294043a11455fa90c20709396680e8d150eeb3751680afa929bd6b5cf2f922319c5ec357d8f808a185968aac70b666c24f06eba1258cc6e627374ad19750cb1a99e6dd8a09ff4da404c88e1af43de42f4c33f73e7141d2ac1418371bc6ec04476329ca353475ab690237839c3f8f9b40b96d70d6570bcad955b3415064d0e471576fc77b6a16685b814ff0a29d354938af1e2f69bec28fc869d5f1f453a4248d781d6f002de8681342aced9e30eeaa0c53a33ae5b10262c65d88290ba4a68940670f9095b1c818c2dc1793146c94d55ab47ef505d1154fba031c5fc8c34c6c3c437101a69e8e512879150a79f9cebd566ef30c01d601c4db258f3e309c6358e5241093c8d96bf6bf460fb4f600e1da5df9b80f7e11294200e5aaa7cb013011c2537a60e30823275a044e1a897341f311ccd72605eb7fe9211e6ff0384cb41145ce625f50c6fe184656d01c95b2482575e6ee716ed5b4c87845d8f85c6f61bf2c98e15e0357d24f3eedb980e80ff6a921822ef28cc0cf12b288ed2a8eb9b90709e93c9e22e680615ccedacabc0d60260ee945538cdf783aa72a48b7bebeb783e82eb671df0e62a067d7dcfbe3f7964957561f52a12dae114ab194f1c33faf53ac0fe63cc43a3c86bd9b675935f2895cbf8fcd0b6c4d51a7433961152b272bebc333cdf9296bbe1a8c3c85a6421ff68aed6ee2d215840abfb9798b5645da079e7f0f2e4e63355c775c143e87e55a4afb770a0cca75a59a3c909aa545ad23f3805b648269213b3df2b15a1ec9edf00f00a213128c0f66a66077758e4cd706f1c1e58cde60ed9eb151e13ec1207cf27083d781b8708dbf2241a9f8b85b06d2430becda3ddb04c1c36e066d03b03ff1ca70fbfb0a311200c12b0c5d452301ca048c0a8927986ab1da0a91b6408031beb16080e32379467f1cd02d39aa0b3b624462aac2446d4a6e87a3801c8b8fb12ae433c176177565f5580de250a0894aeee5478a5626198fba4211295ba3938d9bb732d761897e8b34d01a83d3a0c7e7e8942662c1b31ba7f1eac8b085d476bf33befc3e08d9dfcf2d1e75ec62c23a98b66c4283227f3d86637fcb3594046fdf48ad267ed319e2b37dfecbfbd7bbbcf9831a37d5cca498a040fafecee38d08e8672f93254c08b8974526b97ba03f39efe25bd3e69eda5194889de2d75e9a8087e551bdc8d28c2f88625ebf188f50bfb590e8272b909a9c5366cb1dc4bb33587548be683eeee38ccc58adae8316ddd298e1dbfd272e666a232dbb44502763e464cfc121812bf04ddbc2f8a2d358a5ed05a081f46221ea6d567436b2929fa5bfacd6bb5cad0896c72cfd73279d00be7bd8fc31d0d43155815d283200ffc80bebc2a9efb1a84d9a1c52eb77418f1cf386289a7d43f7eae44e1978b562bb7b284fb3b1feee62f5103288b2f0c82d80991b9bcf14c25f2918e985b96346017fd8014face29c34cd9aa2da951d1d588e7b00754be4671f68dadb14bf4a8379e2726aa0d907b480f2e1d3e57f2f23bce1926ae74ac1b807ddfc54b4f3f6d565c2c7eb202f3af91f6f930e4c0b2b65506ba258dec526a8c0bad130df59c995ad58856cf3a9074dd3575b7a679a052e4cda1f75c123b3a846f3ee2b950f572cdb2e52d379f7bf7a08cd0771bc8f3402c7d94909c4404ae13a663ffb1fb5f0f0511ee694f9200a82f5ce02e7740abc7f0c6762e8d99076071a8769c670d154629f7e9f3d60d269095d55a9f325645a1bac4ad5ad5337da7344af3bd4d1d1c7773deb53a3efb20772ad9f09b5258c671e1cd3c0cf9e3c67517011838ce50c570633e63cef8e38554b401df001d1824b7f5f5e200963fcd0a6da7c0f3fa534e4b9aa0b690e9c3553628fde8685041d758485619f1a91a78b10cc8394e6c5cd18ab81a79b3e3025e702946b93e6a70914e874782a04acb8178250d16a93c878e3fe50ed284d55a02cbbf48632cd6e02c2a44a24dfcc9e3c25387c83a23a269bcf4642f0bc1b06db93ec177f5167cb9d5fa5ecc122e5431ebe302274cf94eb424a22f0d8f5c444054aeeadb07e66bd570afa122b542e614ea63b6b9cd927f22e481183047253b2567975c0f708eb2294f446e5db52c72ba0bf09227bdd21cf09ca639a2a8060f028adab64c18a593618a9eb027cb586c426cb32e456bf6cab3fe08011925c4ed15daee1552ba11fa0df32253ec5be9209a07e70b960f3de78689112d101c676e858128e21e5ab864de5c0c0c139e630e90c0ce3f6ac908c5c484799f3814f6514a2d7bedb8117d062ad647ee117acf086fda2aec0e39d328335f3c5e5c878ebc3dfc1fafcf1e3f7fd2efd3209c6b456a875c665b8c445f26a8b1e2d4835c7fffa361c41593fb1d2a4aba6e2a31f55b0340c131c8a4c7de0dccb5254be394fbd53685e79c5e99041ccacda55cf456b82d6d915cb775ef27099d202537786a9f73a654d6b7f0fdb9f3f0ba728162acb23d2d42555cc8f9f3793781d79a0810d7b97c5cbc47c02b4078e8bf09b28b00b271f22e1e2aabe057ca67ebfd9d3a0ba4bac8a88cacb0fac6f68c39d8ebb06a5cebc9641ba33b0dfe3b31d6dce4ea1f0a11369aaef246ff372a6dd78bb874cf4dd8191ab1028e7070e89c18b947da734d4032e1b1d8ab95d230427715fe6ae7bd2cd8a44df47ec363e1614fe23191d1dfceb257813fe5dc025ebd5cfad8e0017b2785d7734fe0027b34871e4e4eaf3ce47bfb594ae6eb8f2dc37da58d38c43768d1c8bd4a19f46587aabf33b10660af70b44a18807e6e691eb6ce1134df3486156c607a515482083f3b995b145583f1a4769fa88b821b68055d86fa3655c801d9e33e1556c79413d1858959a1a1a0f1426123fd2c25a7d5368af19018f41a2fd67ee267ad0c4e64c1acd2ac6d0bc807cbe6a182c971b552828ac1adc347db3efd04a3ca93a4f78504c356896b1c9f242258b3407311ca39d58f907f4e4e316a0ab0872d7f9b71391055cc772861a14c7f30eef2eecc866ac20cad275a437adca2630b2fcc8bbda2efd78305787bdfcab823faa80e9c0c194e9202641c3c382ad69517ee95970a091411d78f6f846f487afae610309ec8a8296f1f0b4467cae5e326e506fd8d25280c0ac8850afff96c1fddb592eb80c2b8250b89741c54972920b0148316cdc7a5d7ab8fc034d6729a7a78519352dc3580daae20417d0f21064d99a9d5d85de703db7dbe001207dac61d3729c417816f3875effc65089020b363a82ec1ad00411f08f326c5a7746d2e28e9de032419133b44a3b6c216a4658adf5f4e09803f856b5d96d9c030fe58089ff1e221954c0c7284f50c0055af3ddd97c809040ce87380e743abaca13170ff8b02825198ce9b2639e1cce24d11cf0357b30d0990b1cc04c84ccd0256afaed8d16b61c83c6da2b935d6b4c4c3c1e1dc1a3816a2f55d62d44978a20a1d689d062cef99d42ba2e7172f6842635016c10f0ddf4470dc816d5985f76a15a3f51a38e7ccf291dbbe396ff32a0ce937de11f9a770e2ed2d72db4aaaa91b2cb0560f2f90e0343e4c452df28146747451cfe1e291452c2c259935e337989a36146be7e0b9ca1248a1c81b56045deb721a78a55efec67cccee4c849466f43d36c522666ddea8f696f9754d11ed6512d1ae5e438c7cdc9f4a863eed03d9ce41ac5d87797c5440253b4b735e3ac8f87850a0dea0658c06c883b4c083061a9c13d73170a49bb7493fe72cbdf0be39cc78d3a32dfac84cee6a5fa48ca8acdeaa2148fe7ace38a695d32710aa085ad30bc3e6a1e58a6876ce2ca2a9730e87e695b988669f416ff37f93bf75bffce342b7701522a221c8f815baccdc5844498c5bf6e38acb070ffe7d3028c2502092e1de360c86908c48ae396a0c5627410f4796652c6e04d6a0265cde8889a1662d94351125a29df2144b3032f2f650ac0d0b014d518289a047706c9c9df9f3df58402e12c513a146349c3c5fa82dfde55d1eb3a8a1d7e24debc811118be3e8b9b559dedb7aab133c71b16c0f47957f7fd8b27adfa043acb9700ae5c0c483c4a9d329671a272dedb5e2aac28eabcfce7255c9773b2e59f6aeaa79f6c602f9f38ff6d86bcb2446e069513abbad0e4e109afa693095cca410fdde86b0781f77cd60ca0d7301d91872cecac38cd04793f64b17e5ec0c1f6b35512c857c2fca40f75e21b413ca06de661c1a2fa14fe92389b5b3dda1959328c288ee775dc0dcea6c0c6adbc8ccf8cd59cb0af5059637719207b28688c2c57a0726522a1494cd5bbe74043f149113c5c2bd9e8ae0ac2fcd7418c21a4370d780c9258c7d09c165c6972122f91a326e6b4f15f88614332cfdc1ea5f350969b9382b09c5b3721ec1f27f5861213d0d665cded01628d31425b01310981d5e06b84dd5c75ad3e9173a2f1442898c4be12bfafe237548c15fa304717f1d3f975eed64c11be5e1876279bcb62525c8d1e0612f9928afc5d69636d18efa149707f5ca550ffbe1609ac6156dda62ca9316d482d2c7434ddea3195413fae1585a4c95af1972dcf997d126910c8251f6664d2c8f8f91a61dce21f286f2e6e8ee47c126a7e2fde2f8f5061358b015ef5890efe81d7efa45e569d75413ef898ee215e055ba95cff925f56ae3c2ad0aaedfaa5fadf1b58af179af94ef6f1304c847d89d13cbc190db05ba03ea6b2ec9001d794511e737ca5c81e7570d6f48819daf02472cc00e8d1b4f0dc8557040172cebb413bc990d5b5ba7df65399457c7088446a63c90e89dd36ba8a1931acab53f09b285849fd6c841a4e5c198493b4ae340e4ac486de6703d8dfc979bd9083d00edd91c4eb2aa0d6fdcbd708132f037e3779587ba8035a87a508e9edf1676e3fff43bf915c6a9276f5d9c747c50504864bae1e44d3242ea0ffa045a477da3a0da43abd3bb11811448f4eb865b8fdce96c244d469b2dbf5e7fde8abc0ae89f35bd9100b43ec954674d4d130cfb9ca6c91fa6d87455216e8591e9997ec528b8d5dbf0b339016dc71de20e17ed85a534967bbac0f8089f9aa33d2ecd30a368e4791dca763fb588ceda6f302a734cae2a87c3ddd59de7b22ce2fb31a848a46060c1c2c1437b20344599af3d7b0a482d482e560dea496ad1b2e021b275c56428bb5d20d50cb611319c20e6de7a26118671a97cd61bc448765b32e48e33ac2fb26ff01fe4e74942ec5d1fe901ea895d6ae55d3f25adbe88c31694e02e2a81ccda862b7512e65775e06e06e4f9579e6024c31a0615979889e2eac35ce94d839342e25763eb98732397e5e821ab04a7cb3bfc0846dfa4f13326e5ca80c9d751e3bf3a21209646bc71032b5647879438a036c0c5bcfa5d248ca8d679c2c8d8365c5764e8378085ea29d347c7bad8fa0ec861597cf66987324b79e7906e615fc507a79fd521a24efaebb5e1aca38e3e0622229cb8d36ec81ad27d03651c6484c18f8e7cce52163f7182cabcd7850e3171a25746d613d393f466f4a645f474bdd58344afd9443ba31721c0a64a1811b85d5bbb32bb6bc667f4a58b75f1ece69b7f87f521847e1ff95bc36f04de5f196aeb97a7edb5c8ee04ac4f20160cf43d045ad557e43fcfb0bce1faf37201e77a85b39218110205896d77d3d1614b6ab3fd9186b3215e1e7ef8f09d77a306fe5bd610a956ed7f925eb71e87672516cf843e0235bf11d3b1a26b5d4cf00e96812e29fc07575361ecf30b6cfba2f6cf0740622865e43e9232b2b7af94a2679d3607f14d3b54a882da9ca0b03d16dcf898d0e16368b165e80f6a957672d12c5a688829ad7e0793d04dd18a5d65d3d1af0710aa07590557d7ed6d02e913c7afe91c2b66fc7d1ee5fea5839146dc3a3ee0091e4815e82aac185250cea96db216c6f19e1b34ce0a22c9f1fa5134a3adaf9ccd2af771db220466be73195d478ea6ef1a1aa000eef8358bdfdab16393e14450477da126d5de0732ed3e4e4053c3ca2f09ed3089c56fa7fbafc7a4fc865ca6235ca029ca6e294576e087a2c9ea87d1d8508e8f5f26a13f5b525df068a963098b186aa73a8dac5398cf4e506f75a0f2fa17be6ef4250114617ab13e6228ce5c7c200a226eba9948996d992b596ed0b6a2ab019671697e4a152b24b0ab1abefb8cb6433a5f56cb68e0e7661d131b829c7a89d2cd3adaf343e5216b3401d86379b260ca1f4a203abf1d0208d8170eb2862eb0ded78bb5a856693176013496cc3a5a0ac36f8872e8deef98d990cb5daaff0b6d18141d82288c0b70c7f6472d9e1d5ba801d227155868f8e3a544a197d273ed079210b6c5c1a5dd01368ad5fa0dfc51f0ef22d1a0de8024896b36877c0e591fb763ce0527aaae0106380ceb7bfac9f5e0206cd01e70831f97e0709814e3eba7004164ab72f94d98f6de37a836ed1fa0f3c815908c7c7f1c4a0c4ae93d31ee6bbdd8efdb59cfec57c125485ee89affa9a0f25233f546a9a71e3ff6e5d7023cbc196a1b28579ba25f7c6c197a68afd99c8f5dd43d448b8d869e88f61b12f7b75642300b8068d84466c41cc3cb0373147401ccb32b994fad3af5bbd8276b7b7afa546144420997343f7bc0725d6b2938d69cbc275c8fc4715583394793a2a686e04d78a27ef2dcbb00fba087b578b055769ae1cc79d6f9fd53de855863b2c1211b22ef9cd80e3e75da585648de2e17adecc74d5d75bfae042a3441b39d760683abb105e64523438f9a8e35094a627e066c6cee73bfb50b63d24137d190f893aa77d65a96a128e901191017920a44479ffb305570c2e4dcf90d198a9481f8a5739b5ccaf8908e92fc41868d0cff0949ef25e656036d8ddae4c3d0f8adcbe910f210d22cbc3ca4616f91506998116e5093d747c7d4d95cc38e9f1ef0405008c60c4d0553682722e08f4a42be2d434b67d9f8c4ad04769307e7f920556d6924e5566e3ccf89dbb3e25df61546b79639045801dec3920c877aed670711a9d382ded9f9fb0d5cfefb2ec2f1d728faff47c299bad710a71933aaa71db3347fac19de5eeb77d511f25795e2948b47cdcea66d5744733956a57396d34b8b09a7dd37118c6af427bf433081565a5d299b94d3bad9a256c49bb362f1beda5843ef899b5a180635a8295fd3882b48e388ecc993ebc6f93e44f4d9cc7ac64038288c604122be70d60f87da15709a6a61bc66efbe470d32e7f6849c6a3408a2d95b88eaaa5fb3a2cd80189f9263bf9666c2225e07c23ab882553c39dcd355a352f4bae0dd4cf2fe0c6be4a59281cde87505317c413e0e60c85894ab7851e618cd8afed874a65aba626bdefd43969f121d83df4ab1adf0c46c7b7e07cfbd0b74237d6217620d91df90cc2ac9e988f940215be2fd2d1b2a4136738510462171b5bbe5cc675b7c82c69fcbfa3d7435fc4f866a77abf9447844a86308af8ed9fb18e8f31b49f82a86dfcf407b4a1c3e9ec2e5fcc192e2e520d9d4f0955fa884323981a16c5c0dde10258826e86aede79e2674069d4f61d88a37753d06cc8bf6ee6830ed5998f19a853c0876850627c2185926a27538d4fc08a604259a488139e77fc8a6b6179d5836620a79df4962a924635e0d0e2da208682b0019b4b0832e0fb618c8ef79798f4f306140460dd6eb5dbe62e3b6c564ab516eb399510c4443e44e86307ea07266ebd0c4c649b42f5b5296fc5482a5071ab376395fd6eaf03560692673981cb767ece41b94817d47e4f406958b308db8302e5643962424e1c7f0a79c7c27cff201c9653cc40d8ea2dcb0905ef3a7a42d21a8dde84913bfc29b3c701ba37073e6ab7b493f16e4934016adb783e82d52562019e4c0aeda81742133c32714d483d8edb189573792516458d5adaf48362b11be65c986637e3f652c0a3de01db3aad14e66d71f1f4ad6f1875497b252c27eb113c18b30c6e408334911e12a203a668bb2004989de761f3be6b1c028c09794335abe50fff95d30591664979215f08b7bfb88893c3d16b02e91b6b0a8607e466f46950d1cd88cc8859800bc360313701fb84b6c22f188a16b9113ae1d71af4900566833fe57f438f54db7f84cc61cd1c23aa1e267a99d1fd9dc92dbaeda63855bf6eb5cca55fb66118d3868d79e2b930cf71d9c88fa1ecac0fb700050b684bde1ad558a764a39157067a604a39b32f7f39c5aa4ae51875caf6adff8408d99007b6334211be83fcbf22080f601364793417b6b6036ca525a309820cb13641421440b67a7d4116c9c5b336da95e9d7c50ee3d205d669cd4d2b7a83b73dd77b7e3fd76435308d6d57c1b0b0d96f3b5586edb59d45f523603c7e16cf4e9ac4101d3db8df48a395b01bb5f069e0f2dd191d79c9c1fee42cbda9e92fa2b587baac3732372fb8fefb7951310a199de894264da5b1a01cc59b239b27043185595e520ae83f829134681c7027646a614dc6c1c97f066467128a8d50a2cca8f735b0c8c2ac02a2b5a12ea6bade36e7a11f5ae4af2bb921c9d9cfaf823a4246db1096c930f51dadf6d1ef149b5c6b57acd341a05e0172bab66d3893452ae87a366329290047b8b4a208089bc756790b61137d25530ff4756faa28aa833c57ddd8c96e0779e12fc4a2555fb2b93ab5222b53bf57c2b55d047e8bd541676c3c49f8377f01806c0bc13e4a0530286e812d3a3ff914a8cb921f5b99170de8b0b4d4027a176cc03c2cf0faf879a678c62221742161085ec0562d5730e181f92924ce7032a4e99aec85f6410892f3f4713513116b34a3624d424a5f06ec3dfa209bc7897f9a75565f67f9467828822ba98350e883a6b8da6e58a8bbf3a707b72339d33ccf41d5153c3260570eea42cae30105e2d940d11a5440784c8dcdb7b007c4e9ea42d31016e8122d4783b210f90eae47fbab576e52d240bb80202d7fac8e568f0291422a326b5b5452aa90ad29b85d076ac82b428884c42b5ff457568bf5e9f9754dca8b236f5157ac72a92d98f3a6dd06d9a5b7b581965f9ec9aceb141472ecc248353cc3c384c83c26e1de52ddd8f65ffbada2a4d55c3302b7e26fc0d1fe9a5eded194da107d988517f8d2021db9cebb991066b8cf7dcc3b8ffae8e15f5096de8a1b28a7a9392ac3562c0a2781851aedf7b8f9cda30939f27e882cd57c8b4c3fc037a9ca0cec30d7294d089619e90f400ecbf78bb3bd41d26753fa2f7ebcaa0d3814e4e42b30daa0410e855f36bcf9367e92ceff8756c363d4b9e962dccce2381cce280923a96d6fced5da2531f0fe0d802687f74146b6d444bb655286f9c57b9afda731523a05db10f1a3f401376775c93d1000946cc62761d1dee363e4dcfaeaed995b554b5c21324ca8a0e188864ae13670b0465b342fe6270033122a3a8e32ab5001d31508a4582ba0bd19f8d6dd73132b3c31823d70243b315c2a2cdb643fb52d4c5eac4cdc7619dc0aa7a5fd628ff637b21e9a4363aaab6fab77d11d23d3986b23a11c59cf44a419986784852774201d11567ff387843cc7a4913a51e39fca6e7857419c39083b5374aa3e7de3dc10cd7aa77644ef0471aef8724ce16fcb8111f635c9de460375972234859d8db20e57b92c70e43faa020d960677c9332e5ed6c9069b5118f6a8984d8cf20769f10cd1123de247b26c87532f25365a7b369f38e090f8e6dbb10d0125a15aaaaa017cd05874502b94249fc13070d0109846cd2f85e6cc8c3b9d1ed2130673caac5ecaa75acdde26bd926b84b9505d01f8ce7fd2baaa1b52b37dc1ac5017fa2eaeff5ee8f2c8849e78b38b6eda9a1a16dbbf8c691b39f19a7e7196097c357144a4ab20baffc91c91a4dbc5d86b38263f572123b6b30a4b5edfa107b070701ddc5970f3f03ae952baa712160f5b5d99ee18f411de20f9ef4a2578588f5ba92b0a1475b76b4c7615d458e4c73086dac40d280c50c53ebd43936860cc118be28bb5125ddeb5d3e308a96612a32b4be57b89f82b7ad5ba5fbbc44d14e0dc3590533c17aed315d63bf325c9f72366da65090733b71b7cf9b64f32738579a09f3c42bf6995a092a09cd04757fe1736b14658e23a1d4b3a1c7021db5d99297cba3219e00b4144664eaa87b72555dca0275022a963063dc64b3cd40b314fd2d911e0329cf36637c700b2128070c8aade611b969b6e4e3cc6e2be80c04d23d152a604b4f77a3ed8d8be1eb6cca0aeba9b4a260f5ea6def1532cf58216f6df3f00695ff2c2d982f1f0621b62265ac10143c278a9a29cd462d9c70030b9f485c968d4ec822f911680ad703a6d0c216cd3891e0f32d0b5a9c9df254f92bae019dc1d6a4eb20bb805f1a7c351d486f1a55dbb5b353c323b95f131694102bb80b39d33b01e9ad990cbd3c5c13c81cf863eef05394140d8318584964e1568995f2d2f323b5523325908d4fed39580af0ee9239a8d7189da50782a4f88fc81c9422441c4bcbd00f5ee5999f9cd09cfa7a4189152f07d264bc60cfdf0887efe28bab68ab42541050175224d8728afb4cc164d99452c2618ef5911f7d4a0143d153ca129e4e12db8ec39d4be5174cf1067dfb283bf232a5cd56922b5aa075b67378bf93c14f1d475ac96f00a4ed087e2d6938b3e4b8ca5d8306e3523f811e8bb4df8e89a024130fad85e66b383962551ec4e3bd29294689c3cab4fbeb51eccba45ac1238dee1ec7446bef867024016ccac424a6d80479f54226658f00b724ee250a864ae6667fb2c29c98ee35840febc49c727f449a16cf3219f3c4e43a18b006dd12f848fe94879906eecf00354a8292f11716fe23db3fb32eed4a24ff19270234d6b101f24f5fc4303c481c605aa05157be4a60a0f9a7f87b43fb25971858cf8f7ac79154034dfeb4861c7dccda81265ec63b3045b0ac1c2e09a9d62e0fe07383b506fac1c8d41bc725e178ce92b641172267f4207697a6e35ddaa7d1c194862abb383f916a2c972b089fa27db636ca042eb29f74552a7c2cd88978e25ed34b475b07af3b592c72c893c16043f475f1bf9f49a88025876d2e5879b92072ee0ce483131a2a9169db9c534073280633a728bc6c6edcc1a519729c0ddbe28f16ce3e227ddab5c5f087210e264dc705ff67d9809415b6c498a64eec820987f61b105a40a7063e811d174db02564eb0834d654432fbf3be61930e3f740422721f7a3005e7ecf1eaa4fbf69363198b8ac2ed9972234f3a50e6ed67b4c2e69215d6c771131bba76aa678b508caf793763501b77913d1f80fb1974f3170e302ab02baf80a5d86826a9a9f8b58bc2ccfc1ec585211f61ac272f057ec3b7b4004741e191b459559758341c36564381e183fce110d4508d000ad8d9f32198830fd88f62f91cee08512b0b457c07f411aa2cc9ff5c809f3e72a6d88c1056db5d7a1b2dc783b7f02d00c0db5dfbb9b688b603e9ac2919686568bfd2083b30e6e59cf14dc9732f60174927a20056b325ef0b74f3caefd20befc0e798328f15d71b08460c3dfdd273d3111d16f5d086130ea7a256de1218cf94f4c075c5e84420778f3faeb057040db6e14e59868a9c272b4050954bfef376b41b538e63431e2a89f7182141aff6fe60b64254e8aaeeb51a46a70435f8312063e59af951122397aac413344fc51e886e91a2d36e1d97069a1f586e065eb370f0aa7b9b8dd85109fb0f61dba095bddf01f6c2b70781b968071ab328416612cca2ce1c58bf26174252e054e6d9a6dfb65df255c73f0c1da33f6dae61e21bdd1b77790c95dbf1bd80161b5271df2ca67630d12415cb1a5df0b4083c00c17daa16d378a7bb3d3a4c0f9b2df17ccf9c1ff4c298898ab981c28cf885a2899521bcc24fe9d0ba0d96ed2339bfbbc80363daecf1140ab93bf48231799e63d8a4265d0253937caad6a2a5cf3e7fced37f475be0988fdc6cde3e3a856e247a63b4b1a97e8f3585365324ac9c826c4d52f7e1c042675856dc437464b716f000002185cd752a525f4fdca314ca6f18c9b6ad0f6cd068d1519db3380a4c13855bffd04f9a0e0135a575803535f6ccb19513942b9315859f406a29af7234ea2f5a2fe15aa911078b8462b2b05f789d7cdc8b69382a0de207cfbe06f6eb054aa6c2ae11a2cc5d59776dfbd444b724047ca41423fa3042bd625aaf9f729c743f9f038022eb265a22e64fbc7235dd1525c4b0affe9ef1e9e65a59076f3c804d14e9bfefa104cbf3b6f0bfceefd5d87e3e33f2ec628875822901805c76d3218202954892fc1f59c4bf53f527ed45a9308193634724be8ad6633152f9c57da5dcdb2e226cab02f22062f08a470b76b05dbc6556ae66dc7a0618798ff818c7988904dd170ef9236b83ac8ed496160b7feb1930338261f2dca7f084199c17a4826bc33c23dbaba2784f67121ba5ff0713a55f43a89902b0884232c57e32fdde0a4ff7b0dd8621b142105fa6243e17135f9578af6011c59b92392c72a96cb6dd77e4092d3853b9e52bbd33c90b02bb7d904ac2d13dedf2320560c8d4c52202a278f0385942ea6ce4ce4b95c70136dd92361de179500552520243828c90f50ae848660a56e46083ff0b232ae5ab5b26c190b9ec3f8fca5b95d1879df6c5b071c82480073fa8fb36f495eca4097f00ed060d09ea28208dd6051ee19fae5a70ae6e9fab057a081d43828a2628e9e8018ab1501b0558aa4d90b43d0b4a66a0a9f3249e8e6526cdaf0ccd18fd9aaf7f3d9e2055bfeec958dd2204ae7d94b2afd274262b50a6bcf5ebfe6a852c07dad67c2c63b779247fb9d3ce9b77655af1a31e0429a04ee0236fe70d52cf307a122e8f30e6cffdbf4ebca2b358bf5f150e9aa49f5b5a8eef1280e2d36311398fbc5d16c19a81a4a13170085dd8bde0b3114a649940351daf36069550060d739d70ba24ba1940412f3420be685c6c5d0fa49d1534a824c8b56b86b552bb7ae429ba501b10cf6207f4c15a75e31eb722999426293aa6a7f476e758e074984209af38f6abfee56e6781f00836032c14c099e3579312559587f165f465cfe43c9abe52510c8a7aee8fda1eab030ee89b848689214a7b27af01987c6da78482c780ffb4a97b6dfc052c66d54466c47eadf07ae599743ee84c27143eb1ee22ff2caab1edff112929cf0814b12999cd91af5c42ee62785789df6a03849bf82b2ac4597d691781378f56c5c41bb1b1c1384287823b23416df0716a79d7c2c4ee0c72c4ea9d7599cc81d599c53278b63f45a3675992fc88cbf6822169521d6c8b7fb4096104461d43b86795341f4ce34527788788eee8bccecec53f3b5c6600e2b5772a0d9f21f6e3e1b097d121dcaa5e23ec604569bab322209bb363205729a7fe24639890daeb6f76625a33ee60aa9a46ecf1e34e45d57f97a20506580daeac2252830a2fa667f3bbef6460aebaa233c55f9b2bb56c28e11d8aa02020ff4da97c8ef90b2b44e7a951aee43319ab7ecbe5b39c522aa0d9c13af72c61ad3f89b36c67a04a64752db341f062cd1b779236da8a98c441ec1223b37024289f30671120085dbbc0ccf2aac839396a01d10c7e80fbb47c30247cad31ed89b7117908ded913684b93c9876db475aa0c8f3e661e5d380bcddc90aae840e5ba0feff457390463c867edd061dbba51a4c38cddf81949558764cd6e1badd89a9283ba2a4a21ff8e237391b1d998f778c9917dd8cf5fc885e345e770ce7e5466fa75d10aa0fdc7e8a2e1d6aad3627b1d9c9d370cb8c76b25401815424d61517e7ed20f64f4b2891088207e90005f1f06e08efe9854c6309236e62a9e2f033a71ff3c7f9f07d2800a1a117a7ebbdfb8b599bcf330ff811e7bab7508e7dfc746780394c36efca99343cf84f43d465bcf5629c55afd70cf0ae65401cede2355ac812b770d481283f92f9be8514d2b009e3c70e5e6231b512739274758a6f8e8befc6e88bb0099c894ed7f4299279d834b1ae972d7f3160695d755777a6907a61986933e3ae6278c0696b6f41a64c61f65692f8cf485ba0065f36a14822632fe0b6b6717a8197aa5a0b1950ded1e9c63086ddbea0c32bae8c665f1d484968186410b3826cd035ba7b6daa94a006dda015b023428e6a7afaae9f263a72e3e8095136d5e20c86f40ed0d082d005df9c077a72b3251cb09dc709cf80b33707f10dbc9251347bbd24d4bb144c9e60e649a8ef58850dd5f88f88d994648d832ab37714e4b5b87139589f7c9350748335257404d7b7efd8e00d85bd32b95f97857b75c464e0695ab5f66befa27e056097458c921c67702f86029e86bdd8e7890d71e770384e462c4e54ed3802756b8f72cee231280cc15cfd81a96ff75a0096f10bf140950c6102ec8e1c896c6cb86b032aec7d18a8268dd087b50fa284d440efbc13e5401a030fa97abd39990a91b83339442f088d0f3ede999c02cfe488f14cbec8337973bef88edda56ce4a3cd0850e2e35888d59934b9014ee71a8298f9113d375539efb298a036797989a8ac274bd7ee821d64c9b606ec7dda147e6f69c63260530095c15f9e1d431a23df0dceb2f7a625d3ee620b98e4e3cd948f288a672e1aa56b5a3d071637c2ec1f6230579bf97b256c4ded06003de2080b57a620f35ce888284e850a74fa2af3962d1fb75b09c9cfc079d31f5c0956d2b758d4d01b4cfa1f4351a4362717557f4a941f88b18f2616f4ad11e3d75c97a61ede5df028c66aeb016f986c6f90cf8f67ad23e2e39a6fa9f3d2851d5f17f34f50277e8390f2937e2cca9f9ccce456787e977446601456cb6cc9ddd4e70028b773d81c3e01dc01517026b7adc3b4f23e94abd020f321600ac623b332dd667192791874a49ed48ce32028e51a9500d98f2c5584d42a8a829e4ddaf9df1388b8a8a37cf3cd846024fce154f4cfce169d1f71ea0adf3110643bd7b4281f7fe9425ce681ec67d978cd5bca10d21f719ea4f0a0a8137748090865630f3b8949453176464e9882cd9e36391842f3edb0c052a75837d1936faa8dec3c08a061227e30d71902ed6b510a44c0e55c124c582596699b0482e9c9f7e713419d4e97c633bcec46d97f07ea260fa4adb8395e2c8c3e87e02fe2e27f391d36b802f70a710d061ac67fba07aab8df8a5a20ab7b0830ae8d2d02c780ecefe8aebe2fd72a6495d46c38007b9ff9b84504b9e1274010bc0c2256efbc6ee4750e14b122fc9c00dc2d600ede5ffbef7bda1a57235671e432b50b024b998ac55c997ff5f746180899e02ecfaaea37ea858133e37fd80e025cae35daef3913b34c638b49ea678aea453f1bbcabfd15034d51a30fecb2c99ae7f77349a425aa227de4a9f10e3faec16d8f3250c9d05d6242c196c4c9f2ebc28d7a0bd3a73436bd64aa7c5959be0645c78b5a13e96739d1f2b8ba960782a54a4038dfea280f7cd10cdfb683f6731439f320bccad0e3f69c296795a119763f5474407c751727a032a32f3662284efb004c5b609d7e8735057946c1309dfef99c8eaa1062557a73023ac22dbc7e2251e266b018291d4fddaf3e532e63dd0922fc44dec6e75a2f4f0ea72cef2e9afe8e9d032a7656ef3e42b68131bc4b539b41c529d47f2dd34f4f69cc0967f325c41fb32b36585c59348c71064bb0da6758e6cca539d84e561297b47e897fcfc19a29548a0da22bb87786957498cbc4de3aeaf5676fe55e32be2f4553ec874218dc64b13b8250b8415b217ee22b417ab6f539359b3c509a8ce5ef4999a7c2de086a8eeb7c325990481170d352d345f5e0fb36bb7b889631050309e367cdfd440592ec233551f7fe420f5af77e2734d6e2934e1476d89dc0d03a2958b485be67f04305e48128cd954ae39209df25333a8d2eace1b9275ac3e8fec928a63fad4b12de897bc81d9452a95b0f5c12cc4cac889288fa040e04b7a4852fde0d7b05836f348edf72c54b4b1d289f4209c49370096e0f36df7dafc9709749ac0f6adcd2313ba226ec70daf826ab06d81611a56b5741b20a8eae6d88413c045ac11c1a55f300d7b8d024113c627a487453bee38b1cc9e3c35e51478ac9c5ba8a77d1a0471d2e36fb9ba7344f87f0dcaa42980137a8a9be49556e73025e3a71d39ba8104c19b7e594cf4cf191a3a89d727119b6808aa9a53a90f605f1f2b540b78d08df041bf269f4069a61f5e974669ecdc3ca7c532d9113aead5a69dba200b5db493b3a9a8f5719423ad0320612d2f018bd62af383dad2bae13edd51b9fe28fbb8fa46a63b538ce784223814c10f286d4f2008ebe44e9398b9c9e1ecbb9283ee4e41981f1dae51b084c4b2fe325193d52f520efe0aed29e4df80db597383386168110a98677ec751d885107c73fefb6fd3353c0a87abd4cfcecd6d2ddd1983f15506cb4c3fcb410560a582362339df09abe2025542154718d064a2dcbe2bbc6b5498db435bf50315800045979333ccf63d3f18b9bc7318d212adfb4d0fcec78ab56dfd63e913bcb15280d2377c56811cafee1c7b45c6e3bdeeb312c9d70b5f6587a59aefb765c25e695e811acfadc34336610d02f64cbf201d84d807379cb931a0685ce857e03f5683930393e496b60a7df41ade7da8563d5269478ce00cdf64769fd72da11c9d3146b0cadde2058f635fc9ed557d25327628b4fde38d415d00ffa3e4ce06d5c47802daeb532a573a52f8796c125fff9a2116a7bfe9b7bfff0ab06c0139619e07c98245e290b98b2a0d8be022a73b9bf9121c1a519391ee0c8190778b34d93d60f2193cc8de321f0f9045fd0b42e791de14707dc33337224fa18e9ce30272839264339d933052f3dddbb04b1eb8a2802b328432283cf5f5010ea52622f8808afc1f5690b7bfbf3fd5490f282ea9331040e66b45fdfeca5e4292d8d1ecf34104db675ed2efdfaf82e0f7e6d3bc401ae3c9b2a4950c8858e45211c5f4c9c977618748cabefa462301b24ae62b497038175f346c0287ce175ab1fce968193cf0e513671fb28990d81ce39b158928b0e36836570927456f82fe73556c54ea20b7da82419f60057d49a18c392a6eab033c2924a6abe08101333e491800bab198ef84e1001b1063462f81f10afd5f355238477414f0f25f09f4218ccec2ac8b37f9493ef3f2630c88545f0855ee41e824ddbea19516f993da7a5f12a7617727527d4d99d3acf33ad2db06aba86ef95e25f6eab9aa30499c07b6551e61c7aa705f1efbc078f769dc9ec840239855f56b38b78becb38d6bc3cf3a21830ba5ea12737cbcdc8916c50ca1221faba162273c228a7b1f65f73fac0e8f522196218fddd732bd6f43c6a044552044644c18aaa18ea49db4dd55aa0bebd6cd9c357824caf4c5036369baea2e9d9a34a7b8d5d7c8536a5c51a4c2b2082ab32ce00d5c6c8b42ae514f6bf0fc3aedf685ecd03dae4f57c388c9f5d0c320a00f559ca150481453530c28adcd96e731938cadc1db13847fbb85b3289496804f060c8a05b1f645688b03b5527868b0fc08941278c0c97f2069292fdfa007d7f2ed84234a7617c2f577530d4b4b0b95736bcf842832eedc42b8b260c98543821acb08879a02408c62791eb20dc6c8b677e4cce1ab32dc6c2635f1d18ac969af3eb825de424e42bfe6bdeaa3a5d535a74fd82c5ac8f9c35d43506bdf3ba6e6011765d7a75643c2d3a849f2c41176e53e6e4e27bfe938021798ca74ff7e8dea97c7493c5282e514964190997995d6f8b4c17cdb19f9c42fed10d8098f18a23c286d86906c0f156caa854c1fd24712261487c1630745649ba6e17671034794b967da18fdadf40d03461ac5fea679a9119635ec29a433b6015529036d99b23199b92d875d0fa92473f6d81a50a1aa6556db237d4e62f26be3619b59d91926ad9f3339b30773868a762a02c3b1cd6f503ff46eae511cf672a16da3055765bef00f4ee8b1d384ee6129b4005e3bb6b699cecec95e185b12b5beed327d81b984a25dd164742c8903d26197309e59ae8ec13d6d288eb0284f326e453d22e3374a036dc445c3fbee6ae99d0043f7095cbb5978563ea231b5409c605f4329516ee1db7985607089502c3096cdd1f77fe7a6cb5848e2550c37d7b770ed14672438fbf7613db93211b7381b6822f7959a0bd8a4c0fc329b61eb5089c15188ad8191d31cf716e93c8ca74761053cf6020b1ba246325db621fc2c606587436481b0d69d005189e4bba53d92be211328cddb8609ac2d59701975f1a957d27a2e9d3180b7248fff1c403c4fd5d163c106d2dcb046bac9a6c76ca89aa06cf910cc1505b4f25fa45dc2bc43eff0838fdc470fc109c2980fc2ca51b50b84cdc5237fafac2c5fdd00814d897289ed98620606eff612692d30f34030ea613189a677bbbfbe001de81389ec1fdb7b7a0745676681f8cebca185bb70e4970c8d23a55fd7e0ac6d13f858c9b277681600f86c135687262c5ffda77b0d16dbf3b537fedff1ae9c56c66fbbd942aa2d7ec250ab6fd53d6e21ce2fdd2e680125a9669ee451d84f2fa214ff49d0d19de8a9c86e9a91e90a76386aa220d09e45a118b4d46a1448cb4f3af9ef2c88f413806b8df01a10b82d0fa5865438fa4e5db4d4155757fb5945ff0beb24ff354fcd64d57cd432cb14540b0207dfd4315977cb5c558d5e62a2cde759df6d3c222caa41ff0c2bc3706cf157914c266043529c4d14774a11365fc4175d8242fc3097c532d0e02b796f3a1afadd0e22bac523ba786879c178ad61ced27157fa71d7e20c9329ca3538afd6cdbc98b8bd01526470fa937f6c5ddaa193003934eec40a51bac68aee42d5ae140cc609c9eb1d25c3c34d201587d544c04feb4241db21f01dc9e52cb553bd0f7f12571211c6f5ed809a3cae99ff7a91fe5d8fd2fd1b1cc12d1fbb229ab72925acba8466a4932f4a65e0b25af7c7783a6dfe19cc16a4561730dec6328bcf0514dc743e24888ecd3bf802d5a2f5a75d5a49b022c2c8a7e1cc3f049da7d93fe8efb0d9a79444cb9deeec24725cf565775be071fa5febdacd27a825ba09317049cb86c4ff8e1dbc2c4f789db71439310526f7774a14e34a7dbcfa5312f0a54fd8f6239e2a4872c7358f5038898eccab8c4185c25878bd7497db62a83feac95d5d2576cc1c4bd245d76bc34c8f5b9e0372f7317d37b306e064805174792e6db10c74b5c5b550089943099a1ad6a21e6a19b981e40d5494375ef97dcaf591488d9784e694538203d96c905c8916ee7bcd0be290d7d7c4e981853dce45e3164821b3f56b10260d80dd529f8bb34fbb829e649720a25b09f999a067b6417cc35c0f1d947d1b480f004438720396ca892f869b655a7adcdda47d6df18a403c12498667349598892cf829d91432f046dfb7a8da0ff68609e1ddeae612ae287a5f879fd056a85920f3bfbb8d72b3604285e726fcf83440626cdfdb5a3a048734c3865eb880c5ef27824752fed0eb486cb02ff07feeb27d68740ef40bff4bb8203007a0f9afefd5f471e588628837be883150eb30f78c143478b076b8271c2f971ffe83ce9f4d418d1547e1561a6491a183a0bfde91b3678b67ab658f7df7a0b518449ab6e4e356f392055b0e66b3380d650438b255a4af4d8cef596f83c76243b0ca9fea1dc28e18a482f6fa062ba907e7e9e331c5e505ab9de7b6cda10c7ab8371c421a7496bac97f61bedc01959a7b81771de8ed6d0e7529fd3a0a0ee1dd6b26376aee1c40367e8e7bb7c67c8edadb2db036f80bb6e4e471beeda72731650330e726a1c6cf4dacc5ac87fb0cd89edc9b6b659e9ac81bdaac5f3d6c83fa3756f2ddc5c4f793966ca5c11289b39d9c90399314bfd8f4704a1e2f0e82801ecaca60e355ff26e24d805c7d14ebf6ca1ad24ac93955b95915ca8b837c384ad1ac790143fea1f427f44d2663eb2e3577bd81b6af53444acac59bc4c7eb1b6e644b57b86f18c1928758ae42e9100b89ad274d43cf85a3357b05cd033dd3cc4be386197fe119a2a887deaeea28b58c69881b23cf81f4ee1accaedd3dfb3be310e7766fe2d61e418b76be46b5b47bb932239736ff0ad4e078cc854598a6b537fdb1bf020d0aa90c96f5ea1c0362ca31e42220a20a8c540004336b77cfaa050673f1a0ab29e75bb586115d824aad4acabbff6e0b1a7df6b3bdf8e3bc515f76596d35944b26ec2cdb941501faf2441d89c98e39906a2d8e2890c4fc08bc56b41a90e58c6cc38801f1213b0f7e47e93acd7c7fcb2202fd75f7cd0e9cf291ec3f4a696a9a890084e5c9603da57527b5b20903a5207a6015c11905c130a81c00062790ab293999804c6e3d58ad263ab103b3d6b82207a9c77d04199c87b8ac28dac53e380f639004c0197534c24f35b7f4cdee8614efe122c1d6baf55a4e62af64388667713b9a594322519b407be0784073a6d25d7434dc506a59dada329d31c7a334447b6ffec5a8d2b5ee9b6537943ea244e8a797979c80febd927527a4ba4678807be8b3d44cf446c68985cf9cfef6de740e40beca694b596068521c0f36f68135591759428b664ad8f8b473c39df864de451b1e2a2ac832df078bb479c6d2e52cad8c5792f8c882edb10a3ebce0a5f603018ec4797c71f38fb38c29d7d1c61cfe38f1f53cae99da4bcf20710d9ea29b01fb01f03903c29c017d6393266e4c4d59ea8e43c0895314201ce354a9a0e161a786c180733dcbd98224680e5053c5970a946156c4d79fc6101b9d36a9817302f4ab9d2ec8f0d8302db709e48f0be7bdbbdaaf4f7550828fd974b1890395abe15015e7869bedfe5ee08cf048472492ec9025ec0bca619c269118bc562b1582c16fb1d62315b296d9d190116e874169d4567d15954e993119a51677e1d6b994e902d398b58ccabc11340093cfb34421029e68d8864edf0fe2a818d6b9e262dc45f7691742b9364ae6210c60b2ef24c4aea50d5bdccfd1dad76a31d514ac4c88848194634d5cffb944ae1932c3f73a572c0dff04996d1013b9888b956208010cda5c26ca1e6ba8f819b7ce58629fc5c853889365ba8b9f0172f643d0184682e3957b3bb891071324d304495244d6e373335a62f2c9628c25263ad35f5a576c311cde99f88d0828b26cc727f14abc45073d2a068268a66da0e854ac0fd262a12aee9ef0765396bae8b4d25bc42f39e874bbc5a82dd093231a15034a70aa5d2cf698ac6b80cd68690fd41903b413e4b9c7f0bec4ffb1fd5c29552da6befedeebdf2a99d73ce296707de0f87dcee6edfdb5fbaf7dece7e5dd7c37e556a5f6030180c0683358bd5b28e35510dd83420e182990b833845aecf4d30180c0683c15a7800d9ff03c943dfff5b5511c11429a406ec408bb0a4e6fb28d7a0813b7786d944c1f86b7e9463968c1983f1d7804fe417a42d4538cc4251dd8b60a5b4c9a089ec5dd7d1d308270aaa48a0238d34d53c00ca191765a6099b286c2a2553f88532f4bef4945e0047ae3d8e23d790b6000624b29f48c09131fe9a1a0c83a1c22c5d780131cc80b204262f4e3d4d0da7c5ffbf902670ff372975939bbe2a5f70ffffffff3f2a0a9a2b78ceda9d1a41a2ebba0faee026019edffdb386356ec0f3db5a160b86e7b7c700cf50864182c0232b4bffd1cd8230d9ee96bccff479a5dbd91e897393ed6ec9bb3df35623cf1ac254e6f274d1818c815bd656e409307dfa7d7242eba17e5d9046102b8a8a8a8a6eb7dbed76bb1df15a206741d0a64890400a970a3508232ea8c443b8d2849be6818014e22f8112c8e0580ed5da0a86ca112fe011e3a103ea86baa16ea89b0765dc50607ac0a3570482882be591466917fd1e4f3d0a2751b72928d40d752fc6a914ea86baa16e3c6436347451424b0c454726285241182253863822062cb513c420bb502b5ec90b713c7ce7e92d240fb9d3612410af1547ee38a51e68816f1e712c8edca1e94296feca009351032b5ca8e340eed8641fb9f2f7d98561228f35124d4411a406dcddf7400b6c7fc429657932d2c445f9e59601c99dc6492058bce5557cd55b18b158ab1508e6c851535372a215f0d845455d57d41575385dd470d682b28588017159e09155e9e3500fb4c08d008b82192f000dc1cd7a3a43d268b4c791494012c80a988652da60c860313447f340d13c777eeae668b368b65ccde383dc91d295233da7bea76af8a8688ae469bd49eed817c16d9eb909dda4dca8542b025aae1f94477f495f3131814634104796430af19775b2e53dc8d5eb25a3c9683e56c0d7073cff9b95ce49739bb95b0e8a6cf515722577ecb73af7ea5eb797ecd635ed4693e2aa131c12057751142a7c98e5269de7bbec46447423ba11dd4e7986a3061cca94ee34630aee34daa5d15ece45027902c7937ebefc8c277912ed457b9586522909c4a1f8ebf57216e051e63cf5c27145c674f8a40c351f6cf2a9b5ba8e3c5db3f435c0e747065db072c0a3ac79ffdda4a90773bba6d743b3f5b5f7b217fab0b60471c2c7c77361ce79b323d7dc4336d8155b1469d142b7489ccfebc85189ba0f92d211da51ed463b3aba628ba39a121292beec9e2c56fe40aee64b3a5f9e71711a6933f39b36bf8fe6f7ac8b701030f0a43f592ecec771017b40c34f6193355b3df3d5fc39efc5f85f14594db8e03162aceeb47491b7da358d6a1eb00215692b1a93ed8c5e1fbdbbbb4f45b08bfe138439e794824793cc29786901d20cca1664c6a84011368cd161c6c58c33aef9acf93af3a969defcc4a1a0bf96f025e614c5ffa3a3cf3572e58f67b358a2e8b2dd79f67a7fbd7b75706eac77ed5f100515f2bdd387991b061efdf572a121cfe9acba9fe57dca6a89ef584ab9331fb7178c06f6f2f519cf995fcb5e4a351248887574d0041672fb60a885a10b13399810ce488e10e9197283d3e30708b7fad7388c5c18b1188ee1d86cfd20c590f07c9904f3a00c6c3d588f1ef0fc9f0bc2cf8f12e907c7b0152cc35f5176dc3fda38cafe3c28c02c1d308ef1e00186c7d16c7d3c6ad99f080d7894493abc7af1ec76208f0cd7108147fbea2492677a07a8ee07b954370c2a0017dcf94f2fe76a9ca711aea484f068615d38e2580738963dd8a99681bbee69a8238857b66fc12e54b14070d13fc69a15c564d28a59657496e71701b30de90c68c96c7d575254e011c73208028ee1188ee1188ee1188ef1c89d5868196cb4c0a30423fb370632204b2530c0086d701ea8990bc0fc9c53c929af726b34c05dcb2f7d4b7ff72093c921de4bf7425917c07b1a8e281c2d5ba8ac569b80054e50829365bc935dcb7ec8ff905cae6646d3420c3e14ea312a64b15ce644d36130cf410644b89ea8e03e5091e2ca82df7ff5a0cc91f2a29e8623bd614af6ef6a6e30e091ce3c0c4bf4aba592fdef646aacfac1358f3fc88502553fa8bf41d5dcd480aa1ae1c4d57c8dbfb9791b37356cdea6e676e6365b7436bbcd6eb3db6c86ea5c15a39c467e27bf91329bce4983fc939f8f17b00f913b4e296dd8d7ddffd11f02b6dc91b9065948f69b16f6cb4527e4ce7d52040c3c82903b1f2f8c4ce499dcbda508076c9db83887666d6868c88768434d7c5e64e51b76b3e0420eb52f2ccf080b1daea4a00454b83cef3d132000e673c072ae80d0d1a9d6082080e0d2426c2d09f598ac6009060a9203f20318f82160782dc464923d341a8d46eb81b9f0c90f059321fbcb12be52f43266486e5bc18c3102033d73bbaeebbaaeebbaaeebba0ed575259800847339999339b933adb5d65a6badb5d65a6b9120d152b7ba8aaf72ef40fd9aab266e0a73b0e01a8ed2cb51ce0952cca90d6689ff8d145fb5e47da6130d6a3efd5a6badb5d65a6badb5d6895d6cec30bcc536031b193632aab091d1848d8c217eb091a1838d8c1a6c6448b191d14292cd8c0c6c66aeb0995181cdcc113633586c66aad8cc48b19971e10c19d8ca60612bf3c556a6095b19236c6566b63238d8cab0601ba38c18db18485b6c6304611b23661bc306db182bd8c498814d0c2cc470a2039b1845b9c11e01be59dac498e57e8c69966669b4c729c1c599730f47eed05429a6a39d908bfe610b78b44299e6f092b2b47111cadf91dde2393788ec362e9ed3dddd9f17ff8ec07c442eda2a1a686993e40e2d6c005fe0ef4d302b74345b2688f191022c24caf981183c5a9a146369ae22f5f03273e58c3c5a2f3824590d48577279b462ec98eed9479e33da222f9e7381c83e6d91e78c5668820f8832468ae7788ee78ee242b9c779cbdd69e4eec737de38228722792a1a2d24ecc0cdde3794ec92c7429142fc65e7b28c9eed577ce54e4dae68348fb5150db0898b0d24d43c1f9042fc8c16b2c9afa579b98f2677ee776469df112ae93bca3909c46709d75ccc898b45805c244286b5344bf35663b147489e23e912396bc6d2ec8d3694472b46cca3a5d99c4dcafe740281b93e64c958ec0f1fb02829959426c17137c173bad50488c67296a5595a2d55c3550690eb07642b75a15c1175061e650e08d7448c93254c6cadf5c6444b7fc3cede8b71aa9b196884799380cf5402e1a203847b94295a610a970a95852a3c65e0518788e7d0fe39e79cb319122f5e6648909c4ea7cf8444eed0d0e42e364f2211512bdd3b857644a31d45e04ad2151e90984104595c41495891c50c28604744c0807674314665893404165d2a55b344e29283fdef524511678934441165b14e3dcc8a5eafd7ab753a7fee9e750b728779ec9391ce444e23f4d4e4540c33daaca8419c8598cdba5f2ff00811bc80c9dbb496ae9f8a88d986b8692dd122a6a7b4964ad55a5baadf784df4aaeeed40317fd3642bbd4b1c6125670479c190a4f5d08b3fdca7d37f1d5c9021959aad86c152a9ec1db5b6b3a6ee9aa4b5d6ca69c5fc7df22465e9a79330d89fdaee9ab30129fa9bdefbfec320752c81cca70153be9aab0d88ee7e3d0f71d17ba63ad0667c7a144833ed69a6e6cc5fc3c6212d13678f191af91ff6c5c9baa11199a7ce0cbb8a151763548a929ce498fc840225384a70b822a65a6ba5529a4cdd0e7924468d6789fb3c42601e259d71265b4f16c889922515f4bcee04345b0790d180f33243146758a816c84d5cc1109aa94b09497e7c905425b1ef077cc4c51d389692bd5e3a31481e252d24b7eace7c2e68871e34819b0262c49820c56c9047ca238ff4e7865d90345e4a9aa76390212502972e361d0f6653a3335b3621ada13a3a356ac0328f32d7ae51670913d3ebe0ff4cf70ef914d5c9477cd58f22d2c3d2d14179c743edcbff7f8b4e609a47938dc95adb357267b66acb16fd7eb709c2929b8d51e2861d5c80c195a34514180c7628430c98ebb1c882768232a62053c525d310cab2c30e3158a1c314974fad279ffaaf2381b0e66aaee69c73b2904aa5688aa652b345698aa6a8cc21911e17896eec76a33298491181729dc0874f7ea80e4aee4fe84c2222a231786c1a4dee70912d9f5a694cbea2bb9b12dd4be4a4066ba7f7de5b4a62e1e0e0e0e0d45a7d78d1355c5f0482842b8bc562b1582c969c2269afd7eb07d6187c334e618c314a86ee24274e92dcdd9d18197205d33cca5c36f3eaf248f3fdee93dc50d5dd275175fd9fd2d7d74fe9490f39b99fa4247cd28537c8d581ddfd52f8c4fefd27f5f3963e69803c674c4d1d9da9337574a6085cbad892929c9cf9e487a2ffdd9493e9a6287d1a218a94b996287d50661d17e9f7c894904ea6fd3579e239df0f798e4be95c4ae94ddc34fdd4f96bf004e6709940e9729dc02cf5bf7aa6d65a4155ad21076aad1ca8b572a0d65a93ea9926759abaa8b7340d6c235fd137b5974c7346b963499ae884dc92869269c34c7f2a026ae2a488463fc912cfe9223f41e6341252a44f4f2624808aa80ca50472bf13cd0909ca5f86d5569367d39f7ed4d1114187eae880826f527207851cb45f48f50a993ea541a640d8c51378e7aabe0994537acee739251906d39f4dc0dc4df613908bf40170029cab15c849ad14c85bd689505709830b9f42e9bb4f21cb29fca17f7f822a19aa4ce1024adffd4fe9bb5025dff5853ff7e9a74043950c95b8e8fd92b9f26c92c0aa4ff5cdbf9f024d61fe7de9925ef75e298c0d5338c815d43f446f9962b306c64ccd12cd39e79cd412d92a7e9a4d91947b1ee5d80e7fcd23cf19df8be75c14e4fecfcea903422f20c865ff7d5cf6835cfd2c26b01dea2317b72cb7742db9c1824731f71522f78b3f5844e48e9c541cf28d8fb86cc92d5830f3a58917b048430a57bf12d9bae1018c0d325081c3195fb89a0b2ff2d8d4299d5e4ddabc244d5c2c8f12c99342893c4a9c14af3c4a322f6b92e25e335e1e716e241860168c403b7b8e08797a91e7bc382860566401b7985cc09f91d112f8c76b24733249ba44cae3789578b0058f6d6455ddd7ef7c4355171641016301e4efc47f498dca2e08e6f14a7a6faac79796f23fcffdfd42c02037605d6a7d0307c5501050ba3c5421c05d48cf2060964e72b1d6d588a8f8966c679f09fdc553c3fd1cd4808130a9d655b0927da2d248038dd1abe47acba30ab24c430cf42d7b78427d1f3efeaba08f9fa1bf3cc75f2f24c8510f0ec2079fc78e97d09014d88db771f3356c6a308ae64f6ffacfbb5d3175f56200be0300bcffb37a3c1c99f418d15f4660fff97de4012857a00806a00330e5e27c00803d40242ecee700f4f971713e08267171fe8325b8389f07a8c4c5f93bc00dc0254c5420501317e7fc94908b73fecdfc1a601375950936969eb5962ea2b5d1fcaee6e2fc0fc0f7d57c16280494be0a02fa04f20de47d802393bee519aa32905055c3a77f7327bd7e809de462bfc4c09fbb2ba20516c2dca018b3821e1fac38c3043218a28c3332cf11f6f1d58315007a701082cf63c706382a1d3952386ed8b8a12983a5f67abda680b9ba16822b2ebc5cfd3dab29da42333af2e27d7f23ddef4e0c4007ffac6f2eb2bc5c423ec8cfcf0350e61528b31050ba3e00a52b08285d222833003207a0cc2128338803caac92d97307a0cc1b809e6dc85ca3730dd8197b4e81329740993d996f8032e300f3498ac928d0e6008037b37c80d783157823823a0100877400009008782404c11f1e6009e006a009e012900908e404c401f6cbc5fe1b600fb92805ec1a605371b1dfa6bf06ec2a56c096f59fb474516f71d1c8c576b1ff039025040c4229e501f39714cf21722bdddd5ec5a6b36bf4192ef7b7fca202a3dcd54aee1e8380eec691c9adcafd396af021d9ef3099ea017fd26cc9241b5922f100cbcec4162fc8fd1fa5366aafd70bcacdffc075b027d0c8a329b7a97654441e534f8cc9638f1b7914471608ee0dc477f890cbad62807405b96a8459ba0f72d5f88682c7f97a790e0cecdec1ce5368480ad1ace2169c364e601b7ff3d64628e7ea269ca63ed977926b6629a867a2d0e51a156aacfd0b7e944a0bb10e7391045a833f059d384889eca4a7d37f7d3abd3cd180dd53109f4023ac1fafb26fe3835c665cec5c8f019b4ce75cec4927aa86e3e6aabf46287d6c844fda55e33f074f9863139aa917a33b5f2fe071beeec558ce142dea1e1d97dd7b4c766fddbc8dbff163caff0628a50d50cad50d28e5aa9e46f0f9f29cfe6965b6cdf74f216fddf8fe29c55b38be4d8f039c4373d57f039c2f99f415cdb70d682b06c7a08ce97f34541991998641798223509eef5f8d78509e600ab35c53bf677efdea7b697a4c93e9be7ba8657994b48ceaa701479ac7f9bab192fb859b5603942e252e76f7ec737f8ffe21d9da54b7b517bf1c265b1eb0020722267460e1082caefe49245b0a68c20566ceb8c1872bcab85ada6810431e678f0e4fa0391baf61e1932c2c80dcf9931fcafb4a5f024d0fb6cbc9506a8052ad6d7295c0d2b7c07279ff3dd85c6408fe2d07e03dd15d74de03dd750b90c30b45aefb41aeef820d6ba2b952fd780d33fdf7a6b0894255ffaaf4a5b0653d9bb3399b733684e7e344cb923cddf763d912235732015990912b990590afdc079aad29845cf94f23b864cfcd2ed9e76c2693e16438194e86a3b2ce568ac399b6488346a30d19421b42b3764e4aa90a093c3696cc4116ecc4139dad6c2bbaae9b6de4a23f6d06984573824b651aa0763380121c0e87c329a14f588bbbb5cbe422ab261e3d0dcfae8ce270381c0e97bf5b0a97abe56ab95aaec85a6bad173268d899a1db76b7e47da18f57c3a51abe35dcd5b0ade15ac3b53967b5222bbbab71ad56abc1a49430b07f4bf1f9449c024f2d05b7944b9b37a9858f9b7c664d870b11f6297c0ab92365cdc7c1e44420d329796947d969a1ddddddfd5e95bb0bbff0ab7e87f386b9c374a1cc17fce99b74ba47be6c4d587b5d6acfb5c3885e43b38f89532f24f32f8aacce736010183e7a335a66bdb9246f1eaf8114e22d1703156ac1e21979a4637433af1c4ae0cf3987e253fc86572e97cbe572392344213fe79fa121132ef0d8afce8a0eb90a9a9cfa12818e0dd39524b952757e905eaf6e860e4346c3aac1d150affc53387c87e6d007b25aeb952629308a56f3e2e2ec415692c964471288ff10ad390cd9202ac016f0a265b24a65b29c97c5f738608973ba38eedee3b6521e3c7a98a0d2e439af56135ff993d4ac3f8a59ec339ae8f4387131877fc0a314b3c484a64a4af01cc7927f6e642144942f5e2f578f37502e97cbe580ee1335b39a20688334f7de3927a5a722582eacb7d86ab8d25bff383e043b3757fd20d8636ebecaf1ed2b1cf074fafaf7de39e7747004cafe7d357d6f4f6050766be2f10d7e8e5ac5c6f78eef5269031ee191eef11de092b9eadf009473a5e37be60da8d201a6c071bcb9018e2ec506287ba888a21328f3c94f9f28fa875580c726ea18129f1aa1eab30955dffc6962734da8fabeaa3e9a9c91092ba342d54713aabe9bfb4d387d27799266be288ff2cce9f47da6efc8f781c009a32d2fe0d2040e6204bd3082249848ca414c154678a54b4567eb07496104a1430f44cc68616033c0204619b5232aaab818c3a13f89129b1930c8a33cf21a8ef7c8c13ad7b95c2e0705d63e69b5dda5b4e47db554ba9f89dedb994eb3ebec8906a8e708265fc9988be794535e5513b8df297d87d91ac242181190270938575aa548df9e48f85c2908f224a1e6f91f0dca248028b83fdb553abded0ca5e576436e37579420fbd38baf7822bba786b0e04683ec4f1d089adfc70ff4adb555c7cb48f497ed0603db0d0c8ddbda43ccde3d82b55feb4dbec9f4fa0856c175f6d3dc239caba6e1eb9bdc3737b289dc697a64524a29cd0184a4f537d1ecef570ff9e801530a4213fab67e0f87d05027899682d3af50453fa5a261919bfe1c425160d5f4a75daeadb35cf55f7ceaa1d20686c77e5d934f92fe9efe23b39aa56d069ffdb005ecf9cbee83543fdfdfbf1fe4a2b6245b3e72655ffee781d5f579c3ec5721d43357d67eed5a6929864405e65e69c368b2e653fa2ec4734593ccd69dabb9a2625f8ea65cbbb84198c9f67fc064fbee92a722339cea40202773657f8600db97596291a58d055b72cd0d25b13669abc228dbffb1a329d79391d9ba2110adc8edd9fc4a267a2a2273d17e0828a83ef6efb5b6b3b52edd01a6972707e037854fee7fa13cfd94de0b9f745f0a8fbcce6c95deda67798ebf7d103cc786f0852de051d66ecd7e122fc07d8b5db4df813db338e521d897279f96cdd50761f0885be6e312771d9606235b3cc2d6c757f67eb7fdb6afd7eb0545665bb395362bce64fb124c7d15d96f8684b34856f2d85e6eacc565dbfe6a21cfb94564eba2fd01867ddbed37b014b6a122e1fbd27f1f94553f36fec6dfb011aa7e6abc8db7113ec9f27d8d2f5cd275f3fda5ee76170994249ee3efe43381c929890d0d9f40bfbecdd738f8a39869589986c6862738033cf004ff6aed7feef4fd6d5e36a9fef5419056196606c60b11670c01851897cd5b502a71b185d0704dd8d5ead55a5128140a85425994e951dfd3d308df3b49e2ad0d9498e02da18ec644ee96100d15686469a34228770172db6c67724b69eb7ee36d8c7f2394736523b45e2bcada5a6db5ef79efeeb9bfb5eed6fdadf528917bdfe30e7ad43d7b9f062cdd803a27d007c94faa093cca1b11b98967a99db65e47034a10361c81c60d5b8871f550c50f24488288292838724122dd0e193cb60e5e90fce8242941c91226409e7387c8fd4de44ecf112b6f34c912d9925e2c01c313362358f0c104ae7e20d992560851022b9428e289326470d9cc38caa3bce57e1d57c76cfcc6151c2fff53204d9aab7e1ce02bf7db30b0bdf734a5260a278ab0610a335620c1f8c2650cdb961910b9201bcbfeae9125121144d459c562c5c5bee1d16bb71a92e74c303f3fb7fb16b96b8cc1638dd522cfb95a727f8d552b5556b7c81d59aa5aa6cb2fa860410b33031726ba844083123c743165872961d0b66899b1a8c0e33bce57fdae7b318e84ec3f5fbe9a43f2e5620af0e8333ff29c9b82dc5abcc8bdb8112e275b413b1c2104175f4061c3981b828cf072e50aa21598b135e1aa028f35dfecb95b9302835c384056193cb61856182146b8c5e4f7fee64bff2df678776f18953ae46095e25e60f002038b955d4809b0cce38fe04fc5f0205b38be8950e1786f3c4d8803ec4114b391a769231c6f9fc2d1b38de926ac118ea74cbf148ea71c24d615362b81e36248244154893c67ac43b9fb2b950a9bb40e794eff04a52d0a317295e2393a72bf833ab23cfd172c2c62a4e016e32215b92304d7efa0902eb08ecff1af23ec5428a5ac63e7f1f38ffa43eeaf019bd4ecf862c103460c3e9461822dd23822e9cb0c8c1daac0c1092eee9b4ccf6a011e1d6733b5c89d198eef1cdfa5540dfeef93cc9071b17b8c8d7f50aef19f9bfac68fd767733582cffa6b517f8d55598d55143a8d2c733a4fb05aa93217fb816081479fc56e84331be14de8331ace9704926d40996f86c04646d3c8db28880d0d84478cc3f18a7dea6e39e60093cc95e953a6c7e1210e50ce55179335b1c7c9c6125f82a002c41123a022bb0843c4172c48c20b285d5c733aaee777fdf9ca1e1af91c2fc09f93fd9e246d6dd6866a3055a7914798b3a3bda4fca412733251c4f2e8495f8cf2388572ff3887609328b78f3b72ffe7ee291007099e519869a4917d47f3ccd0717235715f6b37fc83309f06fc95e57bff49ef864fb2c8f0e7fe0d55f2c9fd92abf4411264b9e87d07eacc95f725b04b575e33f08579ef799ee7799ef73dde63065c027faebcf6803c8155f2ef07b95432fc29852af9f6efdfff51c950b500fbf77fe607b9be0b4ad7c4deabbebf5fa85a40f7f31d50fa1ba670bff4b3343f85efa5ab7be9fac0232e7a3f419fb9f2be03734c813f7b9ee7fd124f4eef49a392dfa4b3caf4a7ef7c4195fc14b27c01a0dda864eeb634b974884604008000a3140000200c0a0483e17050342414acd3f614800b728c44805a381487d32088511c6590418620020000008c111021215a0775133b785a74194971dfb8c968ef1417871eccd7e9b76d4b61e79ca5f76be3d3a5ab42f0347964bb409ce6332c5a167d675e7523c5afedfe097c637c3c86b13c9342feeb995e08e4bfb866c03e62d5dd1ce2cdde3070ea8706ef104a81bafba5cc0da9222e1351d040ddf0792190012ae682066ca28ca43fdaeb0dab81c88c9c602056a8e0bbe13cb52e421c16dfbdae9c3d78434ad08b5a62f56cebdc3358b38077bfa3d2915d69dc179edd36726b2cecbdcd7691c7327b74fb2496e0bcba63213f35966571865f2a2a97e135db6c5dad0e7f1e1d1c510f2ed1f9fba720eb72e5923008591d193024da8b824f91000266d0162deb7d23a5970c95181097c79dcb4503629dcf19deb5b1f670cdbd1075e75ef26903b3d800e756c67184938e0038616676eec75e7346da7c18a6badefd0437abc56e3b25ff7ed60ba887ab295a514b2e7f86def36e1dd70c1d2504c6e61402e7df3a14d099f487af38ddeb00f04ed51acbb89ff01eab9cc06f6e0e35e11cd9c6ec1e92d9b20c350633118cb0b02328ef93b8b162afc78a957a3d1fddca68bde3a11de941cc4bd3a0c9bb0aff800517e2a6a1b0b92f828e0f37796754347700b5d3cd9044b0dfed3f52f50f4a088055c841df29bfcca9a09e3ca40bdaaeed58c4b613b217d6b9974a1b5e68bd847b2f213d7ca17a891bfd488d22bab68bf580db1b7ee0705967e1400745c8e1b9d9a492acc2e53601c999bd792221e0f2418ecee74f223cd22b85a36abd5cc73396756cac8ff5c3021d4822b87459a43adb1827074df63019e1f767e389f5ebf667ff63ec2ade5afc3b6260e875a0c5984a97ebe6e6a70035154d17d6c3233286d95c73074147aef06d6155c9678911a0440df91be290a36ba7810a2fb366f1e90d62e333666391d9db7c4c3197bac81635b1ed369508570b380aaed0ac81f7a41b2428c49e63deda628307e57a98efc101f96806716970416e90f07a97b764cc40228daada0521a21cde652296c78418c99ee1d41144897a01777e564723f9aecda7f0f464fccb5119a41e2e81a0f635d305645d1caa25f3da208948e22c8eb4c598936233ca9086c81de6856e576e7180faa051cfdc03c0a9a19869abd8ab355a5749bfde3f72141ae6110b9980d6ee26ea4f22e655bcc904c78cea0a9ee55362df69f52bad6e862802b821f451d2f876f953dccc52ea2b61732f217f2f74e39fd9c9a2886da66b737b424de46aa45acc40b9b55331f85218dbaf582676eb9aeaf816f990e8679ee541f37bd0a0b97f424c43d584e3b72947251d71742615baad7be423531287f6a7192df68427d70b19413af2a171f5c95840a29930c1ee072acf1fac2a5ed290d041a2eb434d50006314fa2d29a793a5d619177bb3f034960e6da4a452f08f92b1681e254f9519b4b3a40cda7d80f2c27f591ff0a02e031188e0aa7527010c11aa55a36cc418c686955510d7199644f668e8e0e6545a0eb593aaa084a1890b08d86c79967c3e8bf42c338bb3c6d7645f961c90553f5ae26b462c9b4c67586282f6753787dfd98f3db0631b9b137aa189efbf58dfda51a20dcf95b571d71eaade9c9842794f74b8323ad37c1b3bb72ed442a1fc7cbb6e6e9d7ba24bbd61412661924ba56838eb1ffd7b822f52f889e19cb7d9aced367f86bb3e71e171d56a9c09a102c62a8251e9fc7096bb193a099a45d5fd5a8631b22ce3ba50c982dad620ac88932cb47be9243a4e90afc41cfca94b6ac83bb16487117c09f5ac67747c85994f00afd85dfee4edb640d7d6031cee388c4fe5932252818c47c80df08c08da18e6ae2673059e68b23b1095f8879a5f2c51563d8f0967b64ea8a7b880540237d10244bc1995d1852e8e9ae922fc67fc489d8a662f6e5bac85c79159268ba0dd669b37c431de50ba2648a0aa75ef526a41d342dd1374c399fca8065e10975945db2a028017f589cd0a054e0057cbde17f34ada3c143dc0e01050b55d1902832ea63a461ba5ea4fdd7ae9cec682816fac975d209e4dfa56f4667fef6506cec8d0835718e8a5607ac193fa98c5ce7d24d5057f32a50f6219f9e57b22577362999f2b4943da609142ca34cb33c50ed5607d3a287af5833dab09579906a3ac5b1648e7e426440cc9be0b0c876f22ffb10b0c081fb599bb96783a9320756af92cca4b61c5ca1d2559196f5d15fcaac47206505a1f69a719c2da6e3318832c88d6e00574d928a56ef33615fe9f034a480d4eaa5dc738d35c10ffb56e9f19e6f87616b9e616ad95c27000ad71d5dc13b1860285de3ea12f5d826c7ce93d80e71188435651913efc0d5cbfa8673e608ac1707298f8d24b2701b63bc58d414b89a5b8cb3b372487e88fd73eb52a5f6cd76de171f748186abf602a27f95bc3ee7706b77a0dcee6376f70f06555c7e20e16441eb0503a86acbc1a1d03b011624ba934b4d0ea059ed8c65310482f4e6a0232dac86b06ac8d7346bfc3d0f75e9babec1053619bc2485019a2558a98e9b89624145b2e1a715505d3dd322c0d98b044d102745caacdcfe2ce2921f3e0eeb5cc14ea2d12e94ea937be88931d29f1bfcee0c87a7807c6be73ab4f48546ca54524eba20798345ae10ce03237f15c236ff4840d3852034c0e826a469b06fd26f5b4974fc2b8ce563ec01b7de9a4bd07a228a40fed35119fca09e17aee28eaabc8c4727749cb62604bec6c6407a864ddc209cb76d3fdf862532d4f0851d090c2fa9edd96e801f86f27ef7d7ae0e0197b03eef1380789a5ae4766539d2305d413fc9670710b502126928c295641549b9234659c3b96a9b261a4c853f70fe7def24dbbff15b2bf48bdab84e047f5acdd424c53a7b8531ad0c008ecef5b3ba327d411ee69668515cc0264a15ed735a3df73190fd6e7e72a29099a3d4b034c28461e35cf06688fb66511476aea340b57449dd2f86895f680fb40d7877b7073e791c77498ab104ca92b37f3f43b30962ed07951ed59990f97b0631f7f819498fbdd84202165d8966e1ef2a8a4bb4ccdca52680509de01666cfa24870b102a23e16b19b978b3a38af4e6036cf079c060d48a76c378dc6c755124a83c216c3ae97882a4b831be588ca3600932300c1ada0c4f4897c4e6ade72d5572bb6c5b6880767842d2b2bb8b2b4bf46b69852752b77b7cbe624b03a10d88eaebd2969bf010cbc19794f9127a02b23d9ded7f68534484e27bdd47eb8a075a6ea0932a551a99992a17b4af84b06e3564a6e6f30ba7a61534fa1b3fb7dcc41a353a1d76e850663cee2f852517f6e6f55c17c0931a7c70cd8b8ed280a30125435f289c362ca4ac928b7e76575cc04828e7c07c7804d271533eb2096f12d0aa49dc92f393902742e0512d02efafda700a239e5ef2d907f09ef5a8373efa536155e59042f9990134577e8d63e1a6020ed4313e2f1824f97eff03ea2f8c98d525523f74ac1c8bd7e9c96f35412fdb3dcfa440d505372c4ca59783f2c3f9736929f3f007af5a27d1eba23528f0d959c8ca49a31798e3a344eabb0383a2990bffc3ea00aa07ffd40f7bf8f74601feab21a965f9d15a61452410ea15a7d06761bc69f54ca03854b61903285d6fb6afa73f5c34280bc98b78e7a3c988acefe6f3e04594235efe0b957bb28a4c0012cebab8d27a5cb3a164a737ba1e51b96ed705ca1781723fd06beb85c1f988f90d767497bfd36519230779ca0c3c26f7f48fef06647a4bb4f10eb57183df32226dc8bcba089d5779d4f836bd65b516b5e07e98575b2280a0a2d9c974f086720cf315a2dce02d8f5f4f3c4e6c2c791641647dc3096297b50bc207182698714a9f12c1b4475610df9f71d20074aff600f752b1fc89e4f60e7c1482c7791917c29ab63bac682f6c37da1bb2d78aba9a6dfb4d6eb37fac6e68d4b0b2e20a2ee0d220a6a5e2200057fce0a1a2ba059f3455f45ba02884002d0b9a1b4525564e6ae3811a0caf0dfe82682bb1eb05b44d0d1fb8bc56689975c4daab3cb8719097ca0a7606902fb3e79a08626443ba59eca387236e4e1e11d44d173ab476f898041dcebdfbddd4a7b04b5058b0b2c91feeb58bc1b5a2902bb8021b26bf13dda3d13f5c041c2d82c15e768eacfed8acc8894a13fb0f944b3bd917c3ba982e3734999879c0fc0a311ecd56a95ad08897f34a73f62dc7cb62583f6b9f7cdc3093a47916e8d7089a05727750ac51823e45aa06c0820d6c767e8db6e9e1f1ca38b9e42688b8552b36c791b93695eb81610b5beff5a432e0c150b1295efd282e536574cd9689b5a9bbf8d7b8476c92accbaf2404e630a32b5102353999805ebcec28d292a113823972ec913d2e27e8ef8001dc57195850319ee69b0b9551817a1771b8b93e9c756b8037b92eafa2f60ecfca35642ec3fa2d9586c59f5c49f2963cd4ec95b3c337eac90bb6842e1e6480cb5e399255d2cc8c55803e44b2634a3fb5b62444d18ea2257b32af19fa8e124c4cade6ad9b09f617568cbe66014cadb7aac3b078fcd28215874faa5fa29fdf0ff45e5fd92039f912a97af2b34de2d027b9605bc861aa21bc9b78fb80893b2050c9dfc4ecf7eb1ece62f35b133986536a30bf1f6ed5cecd4c0889f23b6ae52fbaa1e2a6510629ab32bddc5f5b73d9b345d7fd4554c0d87b24f4e6ac33f4dcc013c24ce36a26819e160a68575e868ef8160979cb7121b6b226643c2a9094d1eb03f33a790d0b5c3c9a7d03e850c3da78f54882037aa6aaa7bbdc398a95cf6aca8707d9c84db5deef06a1e44ebaac9ae48ce6b20411678fac74fa1041b4c8958697977a4d0cea92feb985a137caac2f70ddfd763a6f4d3c4849f5c7951908c70ced4962e22e445e68f3f71835c70e8549fc57253ca8a9f0f8eb2651be0a5dde78529f9b4144a93fc39c1b07242c7da6653e9eb40ef0934dfcc5c3a85e8ebe99bc3ebe67cc4279f5a6590313838621bea3ac4ac28675a02d44adad7682b9bef0c26eb4b7fb35242319bbaede984a4bd6d9a31fc8a4ad473d384bbd8757ef968d13d012705b4ad9231f2af14378e36fed3a45c0c88f44e228b1df513297d9042cf1a422b41fdff6dbb8f7b46aace7bbe8804375be6415687f0382c37bed005324f0500d350ea48012c14f3c01ffb10c836c5bf5dd55a54e97d5f80bf6bbfa36418e03ab0d68f281f9604524be978563733151792be5831efb624b3fb23c0baca56481e9cc4891c751e02e25f1f8a2ddcdabebf017472701b91b581e1f2bb8650f94c0da08737e0d9f8c839eef803e18f18ec1e55facd4ece908695d98bd3bf2e832edb71229f83347be1ff1f3117784bc3abd9096d06f99bea6bdadd255732809abee736232c1ab6463bf9bfc55703e951641f9ce2e5440da5512480fc3055f0cb17360389d80c092697732aaca8cbb6ffa587e751e5a836db9e1177be2245fe8315cddb30cfe1e358bef748ceaebbeb5f0e4efe18c775ad8e0282746fffb9367c7f9a0971a452cfc13f77fc057cb8af7d7d94f413c1fa223707bc183772f910a5b2295be63d1c6f66d98b5c61ee9dcbe343183d90e5b331258b75636286878ff22a12d8a0e2f7b425a8cf6a6e64da97605fdc34330e4be3b9431ca6a8d3dae851151555a5c073eb61d52c0ee879f501a58c9ef64cbecd9b47f00790bbd2c1f77ad99b8e25bcb0f8e087e12edd6eb7f8eb2047f156593464322f66b825578ebe2b39a68d594c9679e97cda92092b40e6b355733c6ed542dce29c2fbd722f262cf7dc0d09f60d0e27be4a121062eb88abec72ba806d3d9aa3e2773fd9815751522945727b6615700fa83829c74b01a683922b0e9e5226aa9c1232fc36e8d2708fbb5c63fcfdfb90f004400c91dbbda3dffb476db469a8270e7e3f7d3ed8db12d61db7966ec110adc9c75ab5db06ed664e090d0f158af66d70ee9890ea239f3f410a938b07728911c285cda3b8725e3f1d0a0560046c835e3958268489b66f2b69718d3d8f095d09f7bd0831cd3acd570f90f545cf07a472234c70201f79cfde457ebb2b5f8c494adc1fca8e058681c466cc3a37f0d8b499ddf98864f2025d49f9d5878522226d1c32b93016101f6a9eb92ca7e2a100a56ebe6ec3f2ab91a42fa6edde61ea0fa6b6cd90f91bcd292a04b442df11dc69edd751f2c22a38814b7156ab77b3a26b637c2bf616c341b4eced12820b3ba2ad2709b3a925c4bd1556cdc38d8b6d6fcc7da175d9e518be65b2c7532361ad2f7d24002bb7ab1c9c67f5a872a6a4c3b65eb0bd9c752de82c05fce4a96cc5712aa7f2346e3dd4585d54a64528a16bfbb688578b260ed4f3e312608074caaf500d023cb4ae45d8165d52c4194f9b7763b120a614855a035f9c492175adefcef72fd2fa854bf80ee10246e987c98078b62462d68b0f4ea9ea31df3d0c14cbc07a509cdae18b5c6cb6304ee4bb7efef87910f828f07adbf15a8be4e1c673e7009055aea0a7bf9b33492a7a7b5e0634e93e86adc77809f8221a2f3d0db2be81154267940b98cd6a949c6048a62f1237a70dc7e24ffa146396519ff161d1768d38a82024d4b473ae832a16f87ff8817e6e273d420d0e78892ce550f52b433203c965152d34311b3b29f2345c8589e168beffac61b7c606b4153c962b4342bdd4daca5553717e37be51c8251d3705ae849e824319620f58fa75dc99cd0dc4469fa0a59c5b59b47585fb2fc100f59dcd8f24ad4875d5915f248945f51cd28d4ac469ff030500dc850713e61a1c455cc0d54fa611d9d1ae5a9446d7e382f71e39e3ef3caa391eadcad1c9827859b4acf2edf17b5ed2ba9b35d64b0e6fc583b522e4b7187eada08b8fa18abf1bc6f0195c9ce9cc3bb15172effbc95df1c4cf7a96d301927f7876e4f110c0169ef7189b2c891cc8a0422a3853ba9a3cbac9599240c6a82b272489af5aeb2dd82112d7d28f95bad4058927a68a82f0d758ffb022a4d62fffdcb035438a5329ca756001f899c7c178bd4b9aa0ee5314c020cdc8ebb94ef6104e40198fd99c47f35b17cbedb9464848259ee9f0ae3f8ff4d347470afa10543249c3a2c53f68c6b8b5ef83b3a7df0b2e6355dde391bc84640624f8f94754aab52016d6992a735a17e9c85957956974e3b4c3d40b865a9aab865b71f96b7fdad7bd08109ac83c3063464e95ee8a17deb43105c8f264b554649e11ac1173d1c14363b2a8173066d80410f6b02965e840594b957afaf4569881f4a6c624a58c84e488855061e4ad5041061104543235c489b10824427067b857734c1b8f691c0138b898ac24aad46421748d204582e3042cf87d4a5e0fd7c2533840bb5413fa664d0bd6b1fc17b8486845f901e4c733204c5ccbde21d6521b7960840789b416be7fe27dd28668579fa3ec6fac2865704afd83f647574539fbda8a703abda70523765a0438d2ce1d75207446e4868ad2c9e0c1a9cefc4e506d84d759bfea68fc37e8dc54cabc9dadb160638373060da00a4907b9d26427dcc53562fda533443157edc2fc00e71c65cfe0b5368e372bbc45b25f403f7d5d10076dedd5a62824d4ae13e6614c6f377b694f30c17feddf7ef565f785ada954e4274aadb0594d3d2520701a913aa52992316f4e487b50653f72e505359d5ff54ba0e40b68981a67ed07774247a6e4378ff92daf141881ecc6bf8eddee11b504fc8da0b58e94876b01f4967bd6366c981befee49cecd1c7e0ccb07a01bfca921136721d797fb73a7040464ee5e8e4acb80255285a55170bb8c6fa85f68e50334035d571246e0bf2f5e76ee45ba83c2298f591063fdf122f97daea01a6dac0c968da9ef94600a8bb78a4c508a09b85af43e12fd0430ced8414f1a8e713a323163af0939ab5528473c67344bf84190669815c971b10ab0d91cc43f5c46defc42012b8011ace86fc3339e0e88e8b135522f2c8118ea65cc51d6745a2a570fd91d636bd9bb1d6bf285183de3281e476e120a569746f210888315f6b3be11106c2c9d03c20a968b8d97422e5df013bc9f8f80176e51e8cee0bf2abcd7f682f503a2983be870af5205667558f20b97feb496c10824dc61407fc976b0dbdba02d115747d4e04c63259fd89e99de17c7290532fa90462a900bac3915387fd2977ac923e701e92112d32c4b02ee76c8529e69cb20f11e4e3771f1bdbb0c50ff35c9770f50f6dd5b087277e8c291c5fb764d439ec91e23b2f0222fccba67ad6dd869263a2d25e34e46f9b9273faa58974cdac93156d146a0bcce19ef58a75cca45399c74fce9f51411c92134159388dcc78cae35bd835f9c56ab0d387bf7d84d31f32a6dcdd495ccd29dd144a44ea434a096fdf5dff2026cb454bd2a3e1c6c46f688a0e135a41bdc2592dc43c2b6adc3dcbc4fc430438fdcd06d9a23591ce27bd166b36d9ed787bf31a3c2fc5e29bccfdfe5319d43dd2f8f8c0c5d9ff7e634f0fc50f9c8f7eee7f30e9d3c30608b7ef05b607cf7d8591bd4d4d6201c27b86cc4ed31352e8afef843c18eb1c9b22021c2ae6b3c15103e02034ed620f4c88cc838c98c3342eebe09c3e3952f104a74d5ded1b89241058f317b6a4a52d10583c005a2d5201f84e5baf5b42b65b4eb341176e0bf7ad4d3fcab3e133ab5f65dec9028c174e394aa873c644207da21ff107f60582591e344eafb3a9c3ce57109e1ffcd23eebf73e856afe055a0dfa59812df0806c06afe448b905d344d3bf8c07ec24621ec6c2702bbf44086e6138b2074a420ce27b338ce246f9a1ef2b157b97926891ef478989735f35477cdf39b9afa5905c985c56ee6ba5fa87ef0445b0e84000dd935a17f284d9cdce877f4ba1468cba951e39b2f320f4a2fda3612148e2311137bff00bb395c6b8cdd72255d76444d0f869323a5656a73c8f3916853c6f3ce9088d6f38640563444cc91333a20c1b325450502e799b778d9f89d1f9c2f8d711ce3837967eb615deecb8546e40b6ce72d482b1ccf47513042179bede83692a1bc2a54f53242a533fdddd1e57eb6c5fab51f237385d3c032de6b9cbdcd39e3fe03abe9f80c183ce978f67cbdb2c2f05346e0500dd39b4d4ce68c4b4735c056bc48eab27ba10259dc641f5ac92da0a5f73b3b5353f34cef6176a4a48d3c5e20a89698aec4f427a28894ec45b25ea1fa3a8c5deb62dcc7ad5063ea45aac229a01736ae2b005ebfbc04cb63734ea00e4f789b323af1281de2b8ca2210a1db2764e4e5814ece8b6c39d3e5d132d61bcf9ba3f6daaa0ba0684a212152e52782326b9d92c655f6fc67d843cc365f3ca6088ae24cb2a7e94660104f6c1148d743875e3df537eb8d26c16af840ed8a0598c35230642b99ab4694f199b132e31531229d361e266c491fe192869054d71a5088d944bf5a5277fe1160e4656bc33c7a81f93bdf0cbc4062bfffd243f9daaa53c1850bc7377992bae1860648ddcc12a2f5ffa8d50b8f542cb4b3eeea37013c3840a728733dabc62231c6c6c9815ad5f916bb0e6e008f7100aa1b7a1db43e536e7bedd066af986339389df8f71e9a2af0764ed7e7dad9a32829187804ab19489151d1edbff506f0063013549232b168d0943231b949723ff38d56d441a4c94a4fb94a5100dc225c208baad522e81570648de51d71dc5fd024cbc4d554d083e1a90d7dac216a16dad9f52fa3d5d3775ee15452424db3966528ac26009cda949871ba4be715ad2be72d14bd5ada00ea01d444044df99a8289874c0adfa9e8b5bf0bed386908b790251ad13f915dc5ce10c1517a33e17a05d9cd79d2d14b2d98c145d9c633805d7c7b3c37f584c0562f991357474fba875788dcf3a2a9ff2ddf13313ad2c5b6162122406f94ac1a5b038be709957978120250b9e37f78cf859f774fe08527ceed7a327112698949a867c3da66df03bbcac27405bd1cd875b8f7afe49e010100551a8199652d8a99855c5e7f52ef26e8cdc4152ce3a1d06e2928def4af89004d1667c50a977e46497b34013551304c1d77406e8855a240bcc804c5eede9f2955465ae480848a0bb9f3678fdefb73b812791ca6587400d45be5eebe210b0ba67daf7dae6034f33ac35206898205ffe3693d55e13ff2437510816ae8147e5354d4bcd0ffffccba543300bc82aaff3f10eed328b803b62233c094ff2690019baf045558813ec9a8ef04c744878a248129e5a3eca253cc2b313124376dce45bfe9210f4ef82ce761f23c7be9fd608cf8c1382044997d85531d64394d0ab8a8a8d48a49f282783a0b62c6c54b78ce6fff67101bbea995aab760b6c0cc1bab379bce4d581f40a36e7f931700513cecdeacc5e2e637d9e3c06e2cf2b7661b112ddb1f5650831799d9afd34375f3e059a9280c89cd0226390161eb0f34d5469772eb8831395b03b07298855051eff480262e1f2ca5f49363110745b8624603584df2e5d4aedeb788b2d341a889fdda47a24488b012f77e212d9ffc43ff9bbdddfbc21a7647339a084a253827035fcc72d6f9c376c428768746f58b0a7c66cb36002d87cfee6d0c984567e4dcadc6b07b0f132cb199169abcc8f65f8b37b049d97e9ae052b0315c7a63da1ab3c84245ca624025d7f1076c18492865d630bd050e175ff000a8a085d08095a58ae9827f8615b83cebcaeb342828e3c99a9183e26c0acc315aada81428c958e9745b2a34e42f17a8c04ab1eddf27db1fd9510f92489f4dd1661e7d0462b424537aac765782e472f1b2568874b30aa61cf0ea1b7a48f5e558c7a1e45dd56d9909ed1a1617e08c24f23e7dac8b2ff9a6fa341dcbe1cf7f6e51f705fa61cf765eac41dd938f44a239d057cb42d9a0126888663148d5855f5003a9629b6514b54f154d2d5cf54d0291c89142b65e03dbd87826390ddab284ccaa128f88b2c57cedf84a5aeb7f809a2baef6a1db7cdf6a1ede423727522f847c4f3810b43a57ce4eea25dee65a682fa33d08abdc7b3a6a3a964610239a981850caf355f6ff875dcb99585a1d0838ed27a08974e280414dd5da2e768b472a252e329a38f4180a1a65ee968ac0c80912770e9794b77d83bdf82b9b8145b011cfb0668f721f6e8567e9c2c20e6af712648ec6875fa69b18c5e483f6f6566c04977db1e500deb1fc57af86a20abf9ea6ab88b21b2d16b74cfaa927895b47403375c97f07dba9e38c14619f56cae51abc661d9ddbdbe4fd52f8c14b7037aa31fda2cff0bae55179b068f888e7058fce607a4d10fb8ee7f97c553b4be5429bdbaa75037093317ad907137f62f30742eaf7aa7c9f7348a64b4e778ccaca214752d6559511dc5b47ee4f26b5e657636d2b6a3f71d3d121e6ed63d69b3c1fdafa132e7850c110e95c583399d38e789fd2f1e4cc2a719ac83705b937892e84417628f4ef04a8818bfd67b52da306f61942c6f2157d238a655955bfec9be0d7b32a5fbb2e86ce331a3e1027ac82121e7479d4e56ad3e8bc4df0580383673db8a8b26c0c4aa26b5e3ab481864e9a213010153e22b4cd1d90732e5275a0102ced8daec96d861f718c655fdcab1681c65cf02159728210036a6a1adcdb9b5c2cea49881a285138152145a0b6cd6c5ccae5f8f164cce8496170e9f09865f852ca9229d75f2ee4d5abac5d50a5934b7088ea814cfd4e67cb5fa6ad75ca9af8973db33a2593df60212c42e2cbb7cf6888da8d6eb74c6ab77787358354acf143d52768e565a2f2ef3ca7c1aa4dc9a17444168b7a8d935b28809fc541a13aa23460050d4feb61a71d889deabf613b9d48f8b0210aa9edee4ecdce7da0361f5fbe7afa3ebfcbc8e3257338bc988c06a38b9d7e010fd0a576751ffebf8b4fc7600788bc3f414e08537d80ae1c91e53800ecbfe2ab8487fd68291c2f57e1d6ccefcaf5a5b8bab53b31e6c1d3ee9c7bc3ad32933ea12c1ff19fa7ebc83688fa57e96f89cd823a959e37ec49b678324d3518371c95ae45f008a3e1e099372250d8c2ff73d2e7534997b313eecb270c098152aa62bec2d1dc009196ad6c67fbd87e039672eb7570a61f316236f229c08cf80849685ff9489eff09c9397f1ef9e75376e3686ab4b5ba0b32345f21cc5fe0831010368ebbb27e499eac7c2a919bae679b86bfb783c842a74002979faf90a228f1547aa54f63f784e71d41fcc364559d98d060224afdd2d71de3f8a0882c19c68700a926c1acb9f23fd3c3ed88fe25a84018e6d44aeb77a832ea568836f17fecc7c6f4e2ad73c16c163bbc2dd04c0afe25c8f63a39958ca8a1b00e03b48ec56e3f7cc7355212e55aaeb3950835652a8fb47f3b6695957ea9544dfe1a2c92f1c03132e1f751ecd6d0fe71fe96c6ae809bf453088048d39be5189e94197834e4aa8597862f8efd9396e98c73026e0eb9c5538d555b742b1a0a9788330acaa437e143d466fe6a041f60ce8200d26783c10c9513f5daea51c4ca688073c6cf045dfc75299fb1d30b21e041aa54a7534f9f2b333a0a738916870e76d068279b18db2f48df27da199ff96f31cb02b3cc5ccf5d1b844e74545c60ca5f7b768cefc2afe6420676dc27f57ab7ed28de2f3601ea0f868a53124ac25640b06150068f9b98ddbef23430144a722dfaffa0001101b1322257d887061f317e430589ad732aaa7a2df07f59cc32b6bf952fbc0c49d02a86421700d4a2b289ae7201a37f50ba35a68a93d5f9c041198918c956588cb6551e539f13aac6e57d8dfe583965bf80368ad8449a6b91b5e046988ad733f40c568c1445155b311b37d51948845b946c42ae8d1cb3875c80f218175ea07b9a8823800cbe08c6ef0900271100c43be55332d5e6c9183c17b62b2ea55f50f7646b3fa3f3694941b9cf3fb59ef8c44d36f9626b4cd8b5fa4fb3af103736ff4c5ce3b20bbc2bf67e041cefa3da862bc73b0ad683f5635cff781dfbb34717ce39649eb64f4b902ed94884413ae106eb9f687e6dc0ff0c8660c93517c64e1b58ac396772115cb838f299d722b863b8f88cfbaff2084c80082019a4289874eab2b24febb05c2d23e7bd13725f141f5beb72c951c680bc410e00b9ba0dc489bbeae821c7b6dfcb633dafe201e4510e8147da46188d6f05ae263694e1117a11978062555a6e296687117756a0f9b455143a790fab9b1129dc2bac9c5d6a3fb14193fe2d3bba24da7f615c7a7646d138640558e0b01f7d602c41e09a1188c62763b5375f2fcdb021671cc5082344ea979f91cbfff72670eed85afd9150ee77f0e389a80566dc0529d7fe7e784bc59d457d24f30939ebb2faf86b3275e360f15237a1964fc3ad0e247a11b413d88a91716046fe0490f22d7bb90a1815cc324b290c7352323d19fb98683247b8ce23ed260f6c577301ab359851b1c01a450ec527cfae1f7fc2dd87b10f518184df55ea66020cae488b5510aa008cbbe65467c6237ddbb1510c0b682be837eb3caa5216ca2c49b6f38284291e04d26bb58e2ff508a0379129678b2c634a1042ae792a1713e4940967ed32a6f8a1ae36b6bc21722e1b61d91350b5fc74253500f55afc8ae8d92a6c63c369235396db1df6e14a0fe323d5f27758aacc0afa36aa089f77c7030cb291afd3d48d3b575c2660d170f7d431a7c3e1571c24b71d0ff7c0af9a9b9f908dcf3bd6fdda24629091d1ad2842aee3fe2914f44bf14f1d114d22f402922b6c9a0f8efbbc6af007cb05c8a6158cd1cadf0e8506db981343527ee0ec507ce5d286e07f3f75c428030534874d2bcc8d7ab2325df4a42b267cc2dd4a9b9ad7553abb5c63df3cb83f1e0d6f5b0039a425a6b4bd3c89e6ec13561e43a61a3aa33016f835638eb252791a2b0aad38cadd8e4d0a4d71d76adf9d2899d9e786b4884f68dd714db7cc726d19ea89080caf47ec4d14ef0ca4d7153cf3d29dd010816f266acdf1b62e88f3770ab9df003a3c2b6ed6fa7eb96391b4b9f213b76f07527f532d0441252eb446c8dc4b5583baf2cc5c198149c9c11fbfb6b3598ba031923cc90d21f8196b0c41041fdadc8afe12d7b9e9da1f1a85636ac7eb25a4a8f4aaa44cae64e9491984f9fac711e2d4308b44cd4217f61d290906942fac65c8113f8ff501e92ff209a765c85cb96f54beb46b97fd67562193e225fff2ffb1be103a2b3ad0ee1d1fe05997de8e63e695205a50780058cd1830a57e8f9364dc0f1de45bab62af6541011e0c4a23f92f3e179880620213c2d80c193b6f4d46b5f65b6bef8858a5ad19158271984041efa85f34dc61cb12d5bd54b7446deaebc4f8547c6733b828c8d0b9979154df13ed4548b91c42b323fd3cd4e010ea39547bbf465adb32724336560e7e3307e9f40074b3790aabbd0e4f2253eca561db3f8416eee02cad71a132bdc89b1a0f2ee0632b7378705bcd45228c17f0da1414f1eb315f06c8cd7aac3473b1c820dc5c1de62abae7453b1bcd725f5ef40a5fc3fdfbd9b735789ba69640e19e909f53db38db53e10ea69c43a2c5f0736bfa9892093afea941d15ea72344f9d7abd516f4049cb8551b4306b06b9c21f5007747505cf23754058370aa2ca0367f47c584707580ff677323930008553adee7867099a48404d9788512de14bde9d190b1fda840d0220c3d3ef8b7be14ed402b2c27185971efd857f97d99ccfaad8eeb284afd989920eff8ea4a14a9d9cf4eeb8af5432af5649fba69748e1fa59a4ce92a25b1ae78d10a959bc64791417598e173c93002f0d8b494455c89c009cd5bf177a525ee22c072e4dde4b8e2dd44b167be50d1731e7c6d1b21d0bb60f86bd07fbbbb6dfcf48af699a521179182aa4f3bb624bca7ad465ddd338cbcce817a916c0d45c6c9843b026a220ddf3c37b07fc7e3e6588b725ea5af57f84577da44a3110d696a98f49b7cb7c35fcfd79eba55f8f71a9df53222cec90f1e1e4f566fe1a40e995b14386003855a17978c8b37aab695d2fe094e7bc8c4f14ca73ec16489b00a3aa137b5b2a936af13a1ef4e3c83f27f0ccdfd2bd7dfccea58190c086874f1a800517427ec99cb0630cace42432a0a05e98d0d5dd27cc3defcb201b992472f0935db6b16e68b8cb34c698b20f508bae409e4f4dbefd2f35b9b95a36814617c12e8b24b982d50540d3c6c122662c707b28aded0c88900f0fd6a3f693fec75bd6baf7929ff09535f6bf40eb38329f0b603f8ab241d51cf71f74b066638b73cb3e41e4cc6e36ff436927b94d43461eac1269b25564b1f76ee1692dc3b03d2cd4e6286c9fb58a713d3e69b7f9b7b27389f9d5390fe8d1378f121b0e672372e8ab65c14350d4a7986cb5283000a93b7a79d51c8286a0b59cfce07df0f5d3187e4a52d559b4dfc4f81a6d294aac28d161f533763d5c7c066898310fb3b1e87950aa8b660cc35850a9d198a26414370b231fe93549900524a447cc52e5b6cacf8a6b1b10e5c95b35d6d559ec9981e0863374e48d44b43791a5e0186f33205ef51f128c0dc1d6c55194d5ed613311241de5bb1aa966b10615736cff41ad40ff028f06fe8a6e33d820e5aed32353c446ef2258c5d452708d3df1329847889c17e3859693fac6309a5fb5e3502ca066ae0f820aec6b439117128b97ae0494ce94bdb547268fc6e9de1c34cccc2e61072bf6d56748ee2fa453ed54a79948d2bdce2ee729d2170180fe6f9dbf6bbd8232e79f573cf0ab4dc0ca2de1a64b97e22e929b30eb1de25dd5a560530f68ac06f6e677c0c4f1d1bc36ab54fd57adf90b9b34305f89c301304ef487ebd15337052265aa3a19620469a55b39dd340205094b8b7ede5887091290aa631bbaca53d2467d44fd74657f059843634a864c0c951a51393b588fb9b723ae63de6ad197d1966b3430816cc3372dfa8ba8080d4803470b5136dc4394e700552e4aea681d7ce41ee1006ec35852365c0032d2e7a178b29247c83abf94315e6eb70d4f2394379e130c3aa66dfd07e470258ed6db607e03016bce5d7f2e3f170297468d04018f2cb212906769f8fd220da3f1185ae54b850171d04b58fb422d5aaf9f30a5f4758377ab25f20e5da159d8c45a2dda1dba592bfca7e121fd8119e8046be736a32b4f0674257a876eb631e08bb772e52d3849acdbe208d4f94902bd9bdff3eaef783d538bbd6a259ac7dd9a804fa7146658e581ad28db6a30901477835720bb531df15b1d85fea7b2c8b1a4bd5dd3aa51b6ed6145abbe3bcae692c6abc885ecfcd888554ec7fc1b0150ef31ad24bad07ce2329621d50d83aedbe1270cba3805b7e328c2218941e004be7d3929243e1390be116bf5ea0e8cc3f391e139fb6f53b4657e80ce5231f36009d7d9e3cb16967673865f0da7d39186cfb64927e4c9cd52303967458a91521a2b8b1b2f9978163c057fcf9d8a9cc74e8d005b8177d0719f06ca608c8706911cb412e55427e145003fc2bff37423de0e53631f2e4263a21733683af869d62e7669c098d3721bece206e09b922e4c7a0cadf62d73fb448ad37fb50197c638e5cfb7fa38877c23c363ba63c683960e2f6a50c2a933caa880a02ee0edad6c1915a1769f4937813e56c341aa4c898a4c926a1ba1f242d59ccc91c83d571cb21cd459e74f34533596f7762af7bd05b1920ee76c08d5025fac6ecf79cc1c22847df34235540daab3ef221bb4bff896afd1e2ab896697d109079ee57f98558d78b0498855efa298f808210ea7296203dbf5a92d6e672f34b1ebb037ee4846a2ed7971de76a2222ace6f7e776a12e0147528caf1323a2a43085b3dac82a2e4c7b4afdac5a2d228773b82d98aaa4a6763ddea4fcbec5d33165dd3377053a5960c00b5bc20fbe2c372386f2d84fd0ca607008c899e5cf54e85a7651ebd15ffd4e5e3fc19ac9ad5260e181126003b1f8b0f74bd59f14cf638349df3344971a470e9aedfa89c02347b8082fabaed559238b4a75a4bad41227e54f53ec506ba7ef7c31be797a2771e3de2e9c1bd63ad23849390ffafaa39fae94f5ba2cc6dcb68f51c3fb5b2ac9affb13ef007c4b51f4797ea9163b7e92d2f0e67c8165560aa3b1b4da9b99693b86ad5dba286e15502f954cf404c1f8ad3d24ab11406a732241694aee5ece05af4fcbb5f50bd0c65ec17aa4c174bda94538c024ebbfd63290ca1b89c04d7a42fb6e496cd9d546d3c924af0e672fa0f1fd2faff717e445f11abfee7e787ee337f4c9bfa9f1df3017d05acfc2f9cff61c57da68fd3f6ffeb190ca82d86165b9987c6f85b53d5000a6ccfbc45aaea41d162298d07ecb4acce3bc8e732aa5c616c19193935183e614a642ebc5ee65faa9314ec21d078fb8b5e5ebf561fab2109376f668e1e451eb4ae08c11e6d81d246f1b5fb2ef323daca16b7b28fbc0ab4fcba4d3e548d7f50830533d29a98e3462630cac98a70653e067065ba6061dbb8a40bdd1a2c195c098ce056d8eacb614604acb18f421bfc7a1ec6d65363ec7d5eff0688b5fe58c120b67aa81378e64b04c34f74a75f15c35ee9baa9ba96e95753959011b55326c608cd59506b7dbc1d594d0139bf17805b5f9c950ef9d71f8e3c8779baa0bd007d6028dc1843ecc38b35e77fa333ebc82a9d9756684823437a89532f8ad392e4048b349cbc393d25f8a1ad136de241836499c933cf6097e92e1e59c3198e50fb52ffe315598a5f1f195a6ef4d204b1dd8ef1461ae0aa54beb858ff80ecb70c70a50fefec6b5d805b711205d7216f13d4ad0a70db7fe5791220b8d30fec0fd97495405af52f789c3bf9b8fb20b810d96adf192660d727f050cea0097a66da2fd8bc9fd74cc70567d8178697e4955a95d958526f2dcc28316e4ac64ab9c8466c3ed228a534b13471fbf0f1e443ac7808c8ca019cdfabce9ecfa5ea95a416071e29c5aa1205a2777762a3bf3b59d4baaf5f02cfc2c22bac52c95798a67615cf3a24a01466c44657a22d405ebc449452f571f1ccf44a396e945b57024ce62b920989b8aecd997ead72029372160c133227a0ceb50a5a04948aa3a55c0be3d3f60f540b8d89f80ac8e52ae803a5843c83bfb0605e4b4d6e1e8e2903441ea74d26bb19ebe557ea8c75e0f2186a93a4465461b6b6c46c71aed9355c7370c590940abbbf96de5f2022191b0c8da34e2553357a2110b0c5ca5768421eaf6f8a03c8cff74f3bcf7d5fbe668b354d955187e0579f984827fbd17c1c9c6d71bf5dad404c64afce4651471ab7672e36efab9171da2557b08e7a4f72916738e6d3edaa817d4f90706f0764975d0514c02a6bfa82741a4d6a64b41742dbf8ef965efee9eb0a195b0ea924c69679e2f8dc1c34ed3a39be16ce2453c2a0951cff70d62ca4b34f76b60a045560e9354b272a5f82bba82e81d5c6313dbd8e34ac8a89e8decc0923a5ed1da4a18d881352cee958b70093ff9bd6dd0a9090ebbd2d2fed26e6aa37d79592a8f2b32f7019c21b2a15b00b887b62b123182679c3229791a166d3c6e0f3ee638227de64ce97c52b414063ca27b8dfaa788281bd29517d97a05937c7ee9d34fc545b735650c5eaaec544c44ad04d0acf98a697f12c704ff51229d9d4b8894ef51b7e129d1f389545e8163a200f6ab0d6453a025d0f8cb2327f385b282fd7d4d6f71924a1679249e664a007a82a15a633c65b5cf5234cc14e7110e9e1e934b5f987ee3ad0199d3222845d3cba9832dedb847728a707d42084ddcddf6210464145acfdad2c57fe8bd11ff2a72ebd4151cd32448e9eb66f4c4d257470ce5f54df81bff515ac737c5d774a10a06898eb4e75fce5d6d8c92fe1ef4ef1d5b2fe5304141a3142a102548f446e74aca9f40bec2bf2c616903683a3c90d044fa0b6bc98e7d5bff9571ad39883d956c6ec51280e973e02fefdd632ca3d369edd165dd971568c589b86109df3fa66b50999ee24d2d8c14591c9390352f579dbaa0826051f0b2be56f41272c2d2ddc66b7ed37b9a808c462c9b1b41f967ba1d6bf940cee7623f4ef6af9d8eae682c9b9437293d840778f6264b5c7e1f2efe198620c1c59c1d445a7f7aa7780303e62a879f243e47d955d4c4d81678ce1003d17ebc71ab8951a8d907e0289acefcf790d61010a44d9ae6cbe55336bf1680b5ac996764f4d84e1d1cd108320f57629996281a84e65bb2996681d22b89d683bef5b5b581ca740b3aeb407465c97f1291fde80dc27c884a1d7f451111d8d2dbae7815acf0ca6cf14bad8ba5380f3c8929374ef33f3f47a4893cce52191b3b9d3fa2cb1027ad5fab0fb99a7a54c57fb5c9d014b77013f6fee92b8ccd8a0f95eaa05db070ed3c036aec144a0a0091ec069f4477c9dcd866551268a30c80151620c6e1e59621917f0a9a73d6f9ef0b03ca38c7ff7dd2e7c0434edb55ab48bf938bed685bb9f32441b9d1e078295a3f138d7a0c726d555e661adcc903d4684547cb19ed3e20cc9c42863f46b4600a53920ed68fa18e833804ee9583fda0628c32d2b25375e038b24f1cade684afe88547edf92d28f3411b62295eec4ca0457eee60d05dde71e004e8718790d6163da469aa428417ff8aa708f876dc14b36750cb710518f7b26eaa5710daaa6db22ed3403ce2fb41673d7315ae5d4190062ca0c212c39f42713425044fa420c749cb19b816694ad55ce853d6845da459a3e22b361a01d9504d559d2755f5292aa44eecbb397bb18f5fe8948bd39dadef55e6fa67febb7a16e1a4b92bf2b6cc59c38fc842551c4f0aa4c438a6db052edca61f4710d81055dd6522f8a1adfb9c0989fb88714cfd39edfa976a2c6384aba5b6be90053f982ae874cb88156c652934710637112d4d78963c83c7a6fa0df2b1ef6901ddd3fe4b9b696254aaa35207715e6e1fbfb0a3305e1817e9ef088a25ed14fdbabc2ece204a1cee3051536bea7ed229843c3ddab8252d7a6f5a4e90b0f7f55b4afe031cadd50eb53fa5064607249768d4014aee90ef0ce65ace518e5ec71bd236d98f7e7bbaf4db18605a28874ed50cd5362ccb2c365d21647d41be9fb399ccb6cfabc72e6a972966852e710d42605405f459982f1c89bdf76581ba2e09cbc76f7182320a5bbea9ffa12778046729a8a4013a54044d256e221f3e099a807870aaac600c941c87d071c3939ec44e8c2038df6ceaf45194b1c7af12e1fd5af3d10b102c5e394732037cd7e1ef820c96165b0ecc5a1e34c4772e4ef2e9bfdd055e62a7eb6afd310334c2879d68c815661bb5568d45db20df3cc6e20f80c14905a163a5471a0cccddc6d897c82c7ac780dd2b68b671115f99f77a432b79c30160d18b3de8ec993f4957464a94398189de5c37f1970f0f2e09c7d6a817082ad60001c1239fa225d6f1a4aacb71f4a133aa72127f7ec84c5b3d3f2d87709a4662fa9763cee90e529f8a49e3837875a044a17e5836ec388784b048f775645bcfbf738518beb37a220a8c9c8e7435ba0762ce63775604dc9b2ce2ab6fe8f3318d4e2c7c4d68478cf029f169869c28bbd9c94b187dcb60eb136738d3fa2cc3c577994322173607885998a908f63fe45b54c78e5c042ad29967547866d88a7599f43980d945d89d32e3a7b627e0282b2a0e14b94ae010ee0cf963039a54b865a211b9f51ee16d7597947d69e35cfc27617a94200c0dbd2c544a019a2ad2c5b907341bbdbc9e976355809e949e48c18ed292fbfa422a7feaa3866d34e30f3938f58c9e9dae533a2a501fecd87dc3bd4be0b94230e08938eed972947bd0d5244429f83b4e5367057997f33eadc350e4b2bc6a51401b352160e59fee522a300699711ac0e26e016581030807c3288a06a9c4f63ca089f8a6f99224800b5a911ce4d5cd41c9d6eb7aa6ac050ed317ddba920eb1a5bf94db217cf755dafc9f2732cef548cee5a1531e1ccffe5fd9704ba406c81f3675e3a7e245d8f952511b2594ae4e723013451a01b2e6ff669bc7a300593054e27f9d64ca6017a976d4eba1ff3bbd85e563b390773ae9153c62af3d8734bf8dab7dcc6e974673b5a8324f0b979c30db48987adda1a6d873d7dcf4d5737b96a80b460c7eee81c6a33045ec1b7b1bb823ba53fbc95dbccf1aa68ee7c550a5c97b6762db0947dd2cbac09225ac422a22939437a2ef6ba669756a64772caee6ef530d11a09afb96129560a62f96a181ce61cb5625d365a63ceb0547a5f29f653e82ea695b14e69385f195833c3d2311888fa7d1a20c48d54dac3656c765156f7786169e868818e95582a927535094b8e7482f77c86c58a7dd2a88f24d6e346b83bcc5fbf6ec4d23190315d4d63a7fc2bd3944a82c30443f46113cd33d0449c11b2f17dc2a2104c114e63885da5d0e6530300daec00e485462cadbaf16fe92bdd853e37ee9beb963ecf0b2a075344a4a2867bb86a04be277af343a70a4c514f768cfde44320f105c1854fd77d715aa51a94d2ece1d46f8489d55a8541de8c364f9a6269b81b45e902ebd9e0ad654195eabf8fbccdcb87d85fa9e919eda19b1e8cfc17eccaa2175bae91411a2016c2ea52389ad5bd344fcd934875aba5ad0a864d9b970c625ade2ecc15c819156fbbcd14264596d84d557f58e82106c23416e86e99945e41599b826ad415108c1ed993324e26327eb4e884d97a5c0843d4046ef3edb90ab3742fd21cd78d26ab5d81c2355efe7b3c29e3cb52ec0a0cab9366e8e4fe86298165ccd92dbeb0e3437e1a088b00f3dcb0c6e2431c3b0b6304eba47ac849637187e25346e1bc619b598af5978b919f71d156e08b7e8458ed5b68b8ad603a29a40a02dc0418288c884e9e74f2f4a4c3ccc83e25a3166febc8e5c1bb043167fc40144107adb7e5d405395849cd29a67c907d29bb6990ac2fe488ba6590e88266efd0f5391efadbb3556c1b151b4b2f39056232e9835c6166a9dc035c8de36ae18660f581cb3d54666df0531c983ad0012f22ee9373193dadac4c3c5fb6969608f1a5b976644cf616303ff86f8c991f24349af4363ffc3fce0fdfca739c0248abacc311c6711a39c87a920a460a57342ef3c35653b99165fe1844cb38d58bca6ce20394981fa4e2f7775307def6af1686c380db3c6a30cefd8672aea4497f40ffbcc6094e2fc407a1cdac06ece0e8a269cfc21a38bc38ecf784d235cdb275d13019b137b347c6548c6ec90ce44709c22708ae012c635f565f464f52dcac29bac419c46452d730c4a059ec5c04197e19a1202c46efd842746b17d95c59e8e14b8989e53344871aa68cb92c61230bf2e6ffa70fa3d84abeb0581634999e4cee30ca6910b520a93811625c0c3d890f0856468e2630198cebe5637ac5cd014a824106ed02ee4ce2e498a6d7531d78c5ac7042a78e8531c2d7564f94d8411e30fb80517711d39fe9231d719d9ffbbe664a27d190ee17e0dfd69f31488c5a468c3e085ca6c98933d0a88ee2b9a03286617c5e40c691bbd2ff4193c5d2bda0b12d190c2c4069172175d11dc43ebc05d8d03ec842bafb5336b4542e965115bbead3438bd1e4d72c3efb8ab9f154c76823beaee6b2475d063c817a0278d0be9b37a50305265017040cfcb6d068c3fcc31e24d4d2efa19e886f4446ccbcafc0180cf5fcb1ec4e8110d0c37c9c22714b185b6e1a50e0a90dbaf015f2923aa2f4372139aa08bae09d259aa2e211f67a0764c787177dee197c8dbcafb698c8887ac90678134ae98ebd92e9faa3c2ec27481f3973c3f64556f7d8a9e34d0c3875de0572dad7135b25395498528fa10f73677798de06e03a0cc341375dd91187a6c291c2c906af43a206b7f6d59b2051f2313683e1b41461d931ccbbb66c24a67efa24c691d94c4445c9771ea75572f3e2452272f18c834de48bf23496ca9ab854c8a930e4921dd982ad518613fb1d899418e34a81655968be6c28369155c6ca7ecd6bb2321e568647b2f8b5ea678a9e30261692071f07202901c64c1650547de8965f4c372370b508b90d5356a3f22be767cce1ad646db896f06b8ed474c570552ce6d7998cd01ca283d448244b1c1ee022a34549ed29848e4816ac836add30b2dfcbc718d3b35f5335a46e61c0fa1691d6454fa43b36ecf146a6db68499dcc9d2c4f19760643997ac3661bd41b9a8072c283f9f77c4f902cbafea7ff9501d9af52095c0106f505ca41bd90a68efb756b8728145f7a8bb4ee8692153ecf8aca542b19056c68d55afa1543dec00bc04b93b169f302c97a5e832cd791e368ec93b38dd4e990c13b545eef8b5a76d15226b4bd77fea0252e4f1f5c0d516c3eac6993228040b5b696263202983cb83a9e7c167deeb6a8f669246606a18ee647992dd7c3c5f3d27a22b13a6fa00e3b4d80f7ba3bb288993a5be644d5b278dcab2bc9416fe5388871bc6939b08123a35067a5fb6034ce6acc09bacb8a65f424b93b9830279d73e3a73313c1b5c0b6f6dceb0859c5cb197540acc35c8d2b57cade38b4c9eaf251af626102065eda390b27f533956971249a6fc5e38e3be209fd2fd3761531be83392c3c8e44aa386e979b0bf537ae49859c18f27442d00782a8d21d34d40390b2971179f9db819a765affbf5964b7f0690f808bdfc23f1d7af5d8a53fada44c843216f4e161d8e13888972761706ae8204bfd9db3222d3fd998773dcf52af5f6fe9204ea2b07fa4ff1c080e327b96fb552cebe22af30c15bc9a7fa9e5aefc7072493076aeb600c81a03b31e7daceb66249e15b70e76ba5c2fae2f78c5cf01a71a0da6d8cb3bcdca31c64577df18de461127f56f86ffe6b24782cfa86c09519da15febcb22bf36170ea3b9b678812b9f6a40f648d7225a94b5c891be8372f0e55ace72db46f7c1e71513d41444c748259597101cf606d1547d38c7a9ac1ea23d2a211260c0e13d97de956d756496678c2ecf8d59a90474f32b4e1cdef94182dd8614e04b405ce2e080ed4e01fd194df68bd8b917deac3d2c5c6f4e761c6dc2988f18b1cf9804ca9115a4f1aa2732e008ffb2caf15b4e1e291594619a05251d562e4c180ba8d6672e584e3675266a873a1e3df2f139fb1d3bfa94c319433724315a32a87525a45c5084ed3421ce91cf2e98c216481bfd32161424873a9b871ec39b971e9a0ce19c892b17a7ebc08fdf3ecf29c8e346ac944e98903a129b7fd72c4d6eaa0ea4e8dd0bc5dcd1f965083f47c90fee5a1b88e9610c8e83935687e43f414a3b8382423a7ac821c80471935839160ef5c3d19fda8fc6160bd8a7355ea110c1397f00d5fe843949eb765347a08e904a08d0622e9d0974bd5a4d61ca17ebfd1f449269905c133b19dc6e13e7fb69c50487c182356a007de367f5abdfee07ec058edd81ab45644c44738698e2fc74fd49575b4df1834b59e184a01d5a9f6c30dc74c46442d9cbd925ccafc108a7492b038e0efe72d7ac519d548b0b80cf9097fa0b8679358f97ad2276cc4143dafb83e49151d92981b7e0d858688f79c4ea62c605a6117cdc5006ed03dd688d7a9e43e592ad394f77cf80222b6e407d629d7cd9255b432e421a255bbe40d0dc60f01e06815760b1290bec474eae20d8b3b375aed08a50f2aa4f253305ec0c8b29b72553753d98a30854d2be92cbc110a72eb03314593a0ad5ec2e8acc1d5e22e21d6739da4c6218cde334444ce98c3a0c452fcfc3453a4137587179d2d41c96ae482ea7f37baf9a36c23cbe30d7763c42111e3dd5df853cf41dc738df4809975c7c7c3a72f5e413459138b60449d042bd4fb03f0569b27b56915ca056ef5b70dee4c1a84f72d3aebfef65111e1ce8af91042a6f6a3b39a181d35053b2a808e34adb0d2f5830662baa588ea7f9042c7bd80beb2568c544d0f084344b4746eaca9c99c765966ab30748debaa2ddd5b2e2e11bed853c0724fbec373565432b6c1e29e7be75b042cf079ed5a8908a5888bd1731dc9a0a0f078ff44a4d1c5fd91cc284aee3ce2dacae77b0dd5067c7cdafcfb133cb478ff0cfa42976fb73f01cc54a435712676ae735c579ea57e681673a47dfed4365b1a812abbc5fddbe3b5c81ddd09d852217be66ecda52cc02cd9eb554658204eb74f9e70716422b4c12a5ec4b739cacfbfc4e4957e5543d4d68161f297c4aa095fb85f648d6ec3c8f64820a12d71f68b77b47a659f4b3eca25f965217669292c09acac433939ea2e2b772e41014e9286c66173bf7e14b9b4ba36f40e6d03f65f596e6c7b3943e54864fa275694432f90ce7d231432cfb7b589f0c83cb87c96c29f7d0764a1c7fdd6e3c3456351e66daf74d42e12ef1b2c59d6b1972f7da325b1e6d26d0880d6929946426b33d77005e996ed19a8677ef8c03c571db7444a14cf99383c426d0e5141deee062dd2ad6e08d7d49a049613c4c68de8c75550ddf3c079797c9e9a8319fef46d0319feb43cc371a781cd6e4d029d32c1c42db13cc373738131884c0ad738e6280cefca3a6fa0c817d67594d9b17b8ab2d79eefff9a181366cb0f3c26a74a128aef476d5a43f51070f6b251dac42f9af3d66afdb6d8dbbabc671d5c74fcfa2009bc602345da4ab0d904b08f4260ab4b5372882c968298e2f5716809d0ca5d8c428ca11b4413befe91512eb09dc17c2e4d4eb3fd304d17eb73b28c30696c3e9cfafa96fcf14d013f91f6bf8d8fa7753f8ea2fc75e44b1716f4c0fb1b68693ac3a9011fe9607d484d55009ac1e108fea1e8368da886c0f19dfd837aca96347617af25cddb17c41e770eaeeb9578029eb00309bac69c123cf1fc501ced7e4815de3ba015816d0e92a64dacacc0c4e1c6c276e25ae538830e948cc1c628cb4ba9b6955da00abcb5b9cc359999ecd7b980f06530ade4cf828a330ea24da31995740af005ab78ed66969a381b56efd44a266402be202b91ffaa61464b2b4f23c6f1381ed0b0a621b1636b4d4778c86d6968ae596d8224b7c730d6023c42e1458a041aa092df59d1a5fb5b11b8e13aed5f393d818236898ce639d0b7bb2cdbea936070162b2f7dd46048423ecb8c625cdb5c0e006ea10c0d611ae36cc92c9ba561146eeb55ff8947a93100c2dd782c681a2be3c7378e9a4e8b62a13d145b0364f299192a1a4ea36cca2314dc2135e2aeb71b146f8d0de1ed23f581d4d5b7289b35277fcc337a80d7b44fa525261d41093aae398b449a0bfab5e27160fdab1e30caa74462672d0cf450ecf83ba4626577434eaf580d5b3d34af6db4d434eb79d7361860c89db6db5cf9fc23c9eabf523caa4df38a47d85ce1f45b9fbf0cdeccae96e1c550c158d332c62bed22301199efee781e39fd658c4dd3041829bf8f0b6693dacd9c56f801d8ed42fd63091bcd472ad3b36756b46999dee648a3a70381377ee55ea293d2f4d6c6a8b6d162e219b7bd8be825d77721c16abf24f741d984c2f7a866c9222753246909bbe00c659d17526c828fa7f6b9040b72c7cca18ecb4e10cd2ea1ac00e5b905fc0ee8eb36aede4de457fbff7551747ae768b62a46561991001fd5f6deb0de3fd48852946750b5015f1e4aca9a4e690cc87a9464d7955b7b687b40445a1ad7c5c06f2b018c2ebccd4a1771e3427c5ed06668e89f0420e5861ba30d4c54a1612f45f75745ce97a3b15c9ea8e61084d282aa348621e85934e48d13cf360740fd85b3e1cd2737b4ac1fc5abe25357d5d2520a7165e995786d87559a8c5da8b2655bd2e5d9b65e50347f1c56aaec1552cfe116719fa36b8d458028c0dd84e80b6fa35ef780d1d907d407744a0f7bea63beae508794e22189298f306ec6085e345488652e71a686f4bfb977e8e23d6e19f76e86a3a9dc1610d57f963ac44e405ea4d7e3f423ee23c1b948d39f7c10e1a680ec229158d40d599e9a1c0fc238a33811aa44c6656cee24fec5c4e5bb22042a42ed3202edd415aaa535f257d768fbd71339f0e057507683d9d6e9b861d145069e9297ae80414180346cc78aa334a61e518cdcde94fde2b422ecf4ca22a18f2edf445b65ae4c167797a689274a373b876b7688c0d64fe7d2d2cba72ce3e59309d83483b634fec7f8b847dad7be52013fc4092f3b24a4b5217333fd036c5df71a8c888f2a4db61768f1b47dc5b6d3a08e5140477c54638414b9b501dc5b21dd15a79e5567f1835a1e7bf217bd4a611a9cd0a201410f86b36762144a96eeb835c18fd653dc580e1e2b814cdd7aa1abfb4d751d22888052c5d44bb44a1e7f3c6607047f6021ac8a1f23275a60343837eda16a2f1282ef9adeef1172fa6051363c93c609f8922b2bed3be713040e535cc67cb22fe7b6b74eb93fb8e2bc92fdfa9afe6b4af6404675395e514b98e18a9acd37e11a3c643cf6b397c176219fba6faa8453d911f70ab469016843bdc3288e38df4d88c3224e98f9e0663cca2427cfe03b9240111480c587639b4296c2272e0969df74a954b7b0156ff9c9c562b8ef1c3fa9e99908846d0852fecb95a378b3fb5dfad2e4c9e485cb9cada382b481f032141fd2b7cf577e8d288600b3c63f2c2ac58d603135b00eb670a40e506a57b4a4cc07a84c3c0be2d79135a970b300513e5067843168a7e9875cf39cf9fa080c2eae7e656462d467a6af9778e1f63fd94374e943dab874f8058a6c1cf07e9577987bd1438c6dd9b1f4f84666347d9497778c1eed34e77d2d5fde3f7f8ec4f3abd1c4754db2e088b6b2e2a4021803059d01047fc77a77cdfa0b2643df73966ede799a1d4b22505612bf9a8515edb1f31cc8a584e089cd1e8dde384fa55e6fcf9257d19e61de400c5bfe8f7eec11c693d1c4f0ff82c055df4fc9f1be4cf1bcaaccdce9a57c92f1dcfc9d822964eacc7586c22b841719d26ff826dc3b467b21b9c09224e76a910efd478e5fc5829938ed76016c86b0be93cd7c8cb94e80a961c883151bbefdf68cc60c27d648e1ae89dd2b0ef05bb353477f9f7e77b80e7e32f1eb002ec8d1da0cf7c0fe03eb8a2488565d6b09ef421f2039e7ec4a6d7aac9f7108478203dca393d36d523a0589491703039ae0041261fef06285f9322b69aa1c468c8d492cda443b97e8912c81f9a1b299b1a48716e6292ee0119974f52f27a200d99a2ccccb925bd512b3c399a13f034e971f6b590eaef92994e48391c3ae68c981cb9af50b0930407b066883e53c9360e1ec8cf8dfd002b7ca600a17e7a302e44d88a900b66b670a068531b9a8bc9a4e9573d6e33b35f242ee9b98f016f252bc9ae1f718d1ad835fa2f1a49fe0ee44919a24244a755be0170a5ce2c05af80322641d4147469d4d7e30d7976a85de1448849321fa05f5ceda1114ce1ae32c16c760137ac64f16e03de8bb79cc2714fad6dc0c458d507268b79caaf4c6f7e9d13e777ca8119c4bb65f2112621daf8b2255b3285921719df4d1f9ce3821f34a62b31550b8cface5f4b9cc6d888c8d41eb97d6300911c292df793b37398eb56227642598c28876879c2a1fda82fb01c0cc663fc03bc1de9a04438b0abd9d99daeffd314ae09ef4026faef2725048887fbcf7d90a5746f64629df4e43a1343bba40e6610ad3fa33d90ef953ae87f193315cbb7518c0740529d32da443a6cc4fa6c199829a989ba96811d6a4068faf7ba944192e7864b73dd0c4d3c70c9ec8632e00c267b0a8de504ec1f59ce47aa55c97cb01ab2fcde6c1e4c0253625bcada3261408bb75f06b97c5513299ef3408172783406eced971b6941bba4572a4be698a7485c4d4812b7d7f6213433b79211fba8b780a45ee9923477dff28fa91b39c58f27d2b8630111486fa412c7b5cfd23154821023c58ac82205e868a98e44b10a34a158f50eb7a6ca595be21257b078587eeca176419ec70c33274eba772e60a2ed9cd64d12b39f85b211384e37928dbf333a437fa271ccd1b6518f04e2d04f321126493a58c49a6a484100c4355bb29613de7a09b6d26e467f538feba92b06fb7ff80fdf51a98a289d6774a04ac564e9b2aea8a46967c531b861c5f5838330f09297c7171f5dd79b17b96aaab38aef794d7fc1d9711d910b6b8b66c6830e4e8a388bf980bf91679532246cb4ac6bc14fe079dad1e1273154448dd8a8c7bab5cd8fc4f4ccdace7baa12040a4aa601bc6df0b4f94fe59c4e104fb538b87f27eb48720c3168306f74ef502ad6d74671e577456161df3d62f858d0e4bd5d023c9129c3df35a819bac21240dfe4369bf844c5c6ae59e3af476156962f72dd1846bc7d76604f553db85d10dba03d4e12d4ba1e77ff388b1b5ea6ee2a233a8571fed85e0a4a97008036b5da5ba799b48411531d1707d68041670cd0073466fd2760d341af018a66c452e10fa14051576caf3b235f5e309572ffab8318987a14286ebaa4341cb6cd263b260c90feb110e86886d070d0c090eadd2fb1d0786f1d977553d014aa50ea9f7c07bb988f6c8d0cca369bbc2468f4e2b8685971d33e64698386ae044d0c7c6785579451cc27ab1ffc5e9106eebc40411574e54811b4681a0548fcdd25bbd13d197069d44c2c96d6a1d0b46092d1a225f7e5df45e49642c5d7384879074298719c369a5125bc2834566b353abdb96192117081d16737e9afd82982198003fa3e1a5501aacfe4fdf6e7c63d2d6ca739311149a00dde396eec2491cc6fd2b5afba9a43d96deec25bf7589828730880ecc2f871397c5fd4140af1b1944b21710e2ced6279e2eb935523d9c5f4e27ef32e24f0670b2342891733c6b9ba5cc84dd18077ba5998320faca291c3d028f4145955d1cec6a013bc54d3e8d3bc00862f5af9ae304c9535fd5b9b640e321bc73b48f189305f673b4b284d77dd1b130d2e4308c6bbeba1a7cfe3a9f6342cca67ee276fc5483449dc3dbf4092226ab6ed7e429245196f0c0827c4920aae0c793f2626f7e8315903ca133cfa5b7f9ccf52939bdd4c2e3d0c34d04cfaa24a51996d8d3ac828a96b81ec04a475e1efee4fd15cf20fceab99bf7b8666a2047d3b8bdf21c2b0b993d0f2ccc90f6644282f39bab5dfcfb22bbad521e5e3abd0dc649746475cb04c6a5c15c928b2d0e5be1016ea9557e832d84fe1fcb7cad2d7955b3ce25651b91afcf7a223123ec7f88279ce090c0f374769588777f7e240c21ce002f38195d30c4259687c7cbf75846c0c0e6d7c7868d2437e6c279fa49bcf62341d71d4b4e282ed653f77a8014304e9cb016ec4dd899576185536b1edd14adcfe0b2b01e1db80b5ebae995c3d71472800b4003419f52a57c004c050614e0034c3f644fed1313cdfc2b2314459af611f11342aa833f387e8528326cc85ef4a9b2e5039e71e9b5047e30a0f81922f4d384c17e124aca8324971762cfe1ce9b6291aa37060cb6c6013930a1078edd9789ebe042171ad6a2d4ce26594416246bada4a67e5c3770a8ec07ac3657cd7487972c41811348d35bec79a11487a49d217789609d77d6f961cccd48d5e8a575ced61741f45068c05dfd73b8bf2e81fe28684f31a0f326bdf35f40adee9bd9aebc3619a7308c04c733b2e1d2c77aa239a18a24a26fef0bf2f70de9f12fbbafcc97d169d6581b55e3fb941f112a69d743c3fc29e816665c6f35498d88e9d032ca1037a7d56845c30ccc24a074d7f5e6ac5d2afd18ff5875c10799d5f3fe8d3650ba8b861ce84a1dba4fdf2f53b311c580f5de4782693c10068beebd1e12b619eeaec429bcd79ae688a805626f405f76fc2f63a1eb0d6306350b3644b42e4de5bca24530a08ea074208432d96e56cde266c1ffdeb27564bc527967748770ac1252a0278febd156441866a4675712c4e5429a93ab932daae6a68b83255584ce532b7172cbed409ce18b088ca7e65e4c5aa863bb7171ed0fc04ee7c1970e9c574dc9fe694fd7fbc0746f617b12051eb955e56c163de93e3dddf628ff46eefdfd7d4431e17691394c9b6708632190f8d7afd5129a5948850d63b14270a6c81a22b563041c185992892fe113a6b21c4444571c18593199a90f48710d958f09cff4e8087747841861a9cc8024b0c5390b4499a2d594829411749247dfc85407486b6661a7a4074764329d414f6344928110223c6744153801f92a29e5020850d4190f481e807d18741813ffb57ebd5eade311a82d0456470733ae8bacbed9a61035d8f31c1f39bdadea9d786070b0f08f07c3abb28539693154d4a5549a9829eb5b3b5e43ddbd7a62d9602febe6d061b79bba2b39692ddaeb66f29b5945a4a356094ae5a4abdd352aa99f201cf6f29b594b2924d930ff7850ab813e98c5a4a69101a26d3396d478366cda93586d15626d3dad8a3b4e71b397d98b350eb59610839406cebdb15e47e2b1462fd0d87d0b1feb5df0a83b45e88f5ad306786b5d65aab05c50c4467d56b17d62261a3e933ee54ee44fc1d846d54db06a346c4488dc908bebc13aabe22dae607e3a6ecd13745713b76634d307d20b75dc327b8b39cf5da4e2697c275964c5cec19be30e6c1c20382add65a5b45b9c4756e35c6c4ebbf2af8e15c6defcc6c23d30a8eb015e9a8ec6180a7cb00435b6dea1d30ffe0002eb723a7dff5cb6efafdf34168b20318bf7cfaac7deccd6b3aa8d45a6b2e32ada8b876ad3956bbf3966b98d3c10835d7df92280ab657885dac0f7a1deab801975eaeafc7b5cef055a4d63aabaa2f4df7624db0f7ccf6a1462da3a699d296939651eba87da86751a8dbdce80d0be1b6517d1fc61b55f7b3fe6461a3aa5df7b3fee43aaed61a206e8ca8b6b0a64537a7f6b9917b9b364641dcf91d2b718c32cba97de8bfc83ebfb5a47b5eb48adaa7e2b078c8b3dc60c83e7f4bd23d1b0c2dfa4fd6cf6d86d9fd6c29f96274062da2b903bf8ae8e805b831bd4bc11bd9c84636f2d1dfa876d82f2327af23ffadf697b6ce4a2f6d6da05565b3816d069b2aa299010c34b3554467af5a8ba8d581367283ae16596fc19b1659bf81317a87f517c4e99125a377b0585fc2e822b7c007e4eec16cb301a35cbe9a94c05712f842025f50d0cc0c5e35f48e1a9dbd8c5e5260a0c9feaf5af6f7ae77589e59bf21c9dd0ffb97cef667d9addb3e2036d0aa2a808dcc85df130fb8bf7cd55a67571c239609eee67a7068ce7ae67698a9a82e505b9efa692081695469a2292521d54a8f9cdc0a8255e0f9d58849ad2fd231a4f6697f4de84849b9adc346422842e483210e9841624c615975cbac1c39965b9625450563640b9a1042adb6f5b85120460e9a6f05ce029bace0d4417db628d6d4b0f6cef64d62e0c79c5c0e7446d47d8b3af2a515e45b73e45866819cce181cf97661be16cc97d5ba91efb591af57235f172cdf9a9c7c6d68e48b71f2bdf9f27d31235f182f8f9a10428fe59118ae0e6c8c57be3260e43be345bedf4dbe38346cf2cda9c917e6cab78697af8d9bef8d67e50bda7c431c5cbeb12ddf1c35df0a3c9aaf0ecf824d8ea25843c32627e8fab155211a7251b763d369ddb8ceb25ad773d5d8e09b1730bc978c7fb97e501c1ffb0abe1fbf820871c0900fbca7f5fd448a788fe7aab97901e315a36e39b01a366e3c18e2cc182db8406707003b74c8be3fc803ef91f1dfb798e30380c197cfc3e35b067e8be2eb00613f6407f8c13e0000f8fa88ec80b8880ee8857001688d5820ea108f8ca20e51478e9f5f015873c4c26e1a3c2dd2a0118403ca783c08411d191010145bd409d2037e3dd2f81ea028047ff86a91060d2279c64fd70168181338a9e51b216e9146111ba017420dd01a81811587c6911c1adf383470c25228cff8f9df8c0f3483e7072d6edfdb51a6ff820c9418a0036ea8905ea09016b7c7619278c0a01eb7e7016e534a0100693df658e30403e471b93ac0b4a017a0cce3f1e006d4b9322018145b3a416cc0184b1452033e2be6001708b33fc403bf0ef6c1055fdc47a405e2ed5504f45adcbe5aba19c9f47de3c05ae7eff09b2d6adb73cfd96d0bc56f7ba2e29a4ac8654379351158f1426595cba6ca934c9e7ea6673e0d032a5c8ab96b34863be7160d66f70ee56155abd592c86aa61fd46e64060c8db23aca254fa651564c32ed2f997ade5352fa987a9956da3eed258a0ce40df20ccb9941a83f5f8affe44ec074760126885c989224cd133a9025969a7292ebfb5052bfac38509469ec4b4c244c3907e8d71ba9f9f543f986391d94367fc39c0e60dc3c8c1fca437928cf88f1337e28cf9001930193318f828410b9ae993d0012e403d746830658abf1619c6ad475efbdf7fbe9fa419ffbef7358acbff72fa52ecfe5b93ccf75afebbaae8b2a800582707f7af7bf6fd6fdef3e573ef7f782cefdbd677200c3c4e50622a2acc8a6e3f72e201fe8414e68592c1c1c1c1c1c1c1c9ceddd3e0d30c6d70037d78f18bfb97e6c5e580e65efd2eb7a22dee3b31b56734664a3c27491e7cf886c9a9ed0926798a701404126cf3f2254a3ae7befbd36be06b5e1fa1aaeb0345281fcbee33c90bb5c9c0bc7c5b99e057676d6dffbed723d90b328e82ebfd4e5baf75d2ed6bb5c7f6ff6a7206bc6b340d8bb4019efe08c17b84606087b1a8f8ef8da61b331bec60f91ee0abf4628c4e47aa12037dec6db08856cfc8d7088bcff02735c3f945d1704c1af2f79d2ac9a557ee449dff7c9f8f932fede0be5de7b6fdcbfe0fdfe3ef837be3babbcc70806fe0cffc69736cff82dc3ac3cf30f2c06a2ecffe234ea598e948d5216cc020fe01296bd069d6c5b0a0a4d36a5d343839d1efd2d264b96b540a956fb71a04af687c56c857dfdaaadb00ff6d5fad5af3ec1e537b33a68a00831d9c5e7f974706cb4239838647faf48494856bed49980cb8a54913e195178b59885014af6f75eb4d2b00297b68710b8b44d7e3600eb3ab0a37aea53d746c39c2d1481844c7fe21c89f8a335ff963aeae244dcd33abf16042ee715ae794f873027d1bcc25fdb76512bca45ea09194a03835f32b89217ce94a0f37aa196fdbf9f35d97c5abb244cb254d1c0d74a210a58692e01b9e8eeedf4844b4f8324b85bf4ea531927b8a7825d0db76bfe3c43e60317aab23f11ab288a032683653e61a135e17236cda6b2bb742123a48b9d55bfa5f4f0bba094fd633ad88b8937c8477fefa11ba5748bd1a670f9ff3a5e701df79fdf98b8444c2d96ac05abeee9df76c968d0f9b0c632b77de7184f6ed78fee5b207e79c0a305979efd0916e1e9de860f320fbfb6ca93bbb02e814b0f4bf6f7f04b7ccff3bc1e6170e93927c5d71688ec6ca85a8d644a6de8d95001834c581f7a4ece27a65b88f1ab0b2e310a7703834b4f66022e65b20d643c2c2089c0880ccd891ef0e7235338056186e80817a2282962c90e3ff060660a2948ba84112150a2c634e60827515040b57045871ea4a8b893ec580c337866e9d17f62e91dfe3df637554fdd1fb27f7901edab2b2c4f503d459eb3b1c7fe7e2f2ce71002e86f851d850dcb0b727f1796d34c4f2c72b4d85f41b0c5fe92016503bc831c3527a49a5471b5809ccebfddb6513ac1cedee55affd12d996e71a44c2925a129531296e67634371a13cbe0b2e240e1cfe5ff84c1e55fe7842837f030d47cc29eb7a385f99fe7a7b9159604973637718109bcd70a4cb2ffa782c52a4065ff176cabffc275eb6cced4d9a107002aaa11de4b0527d9ff7b99477f78393995b3c99c9a3fb4a758350297764715dc2d1a55fd78d83249cafede8bf3a8d2bbcce935ed61b2874948f2304de0d2baf520c87ab8520f93b7d0878b38b8c0b49d2570f9f34fedbf600197366f4c946e2605a7da8946eabff0ebb3b53a99aa247059358001778b46af1db0d77b16565a0d4ac0e58b862dfca0f0d44fb427e72b68a3a8661422439674c9fe1f94d18003d8653251fc7f1991c69b72c01226b8da0a042e6bd6a0080be9305602900f2f2afbe30fd3b9d18802979e064bf0fc6e31a73fa7039ae7cf3017a082152c31906b6ebae472b5c848e848a63eb494e9f61df812fa4297327dda13367cc025d6f15753a793d2a5ac81125cd64a8397a54ef8aadd36dcc31f1c012e3d0d8870e9e51c9454c9fe2f589d30313827e378116565ee245f58e97203452a62229581a3a5ee3b56724d734e9e4c29ddfabb7fa34954490c2ef18b1d70c9153d5744679e4512eea8a82a9718c9af1c8a8e1a60e19cb8f5477fb00a7369b09322a3e9244a76b73d8439428221042e6bb548569788a96e61133c7f4e7dc9d3e7cb45efe17fc1154c430f3a0c9a8184717441b18f2fc87b6c0f52444ad9ff3503098b74e6638b3703890033a2e0126b29799a0007f871d17978684c4cb0b2df31dfb639bbaeebba8e96dc87d63b22e43dfc5f4f70595f54c165ad35b9dca3a90297f8450eb8f4ab263ae33a2c1dfbd546267b4b994094fd1d0d25cafe77aca2ca45aadee17e737228a8a8b0f4a95c62a7cad829977ee54a0025b9706ba223175c6e64b6cdaa6e514b5809f53b36fadb7481ddaa56abad40526adf99f47898cc9c93060fd8ffea84ec6d7085e77b62514b254163e488f7f0df60067c854b8f4bc14b1154647f4f49f6df200b5cb615d7052edbcaaa87560b092a69a9be922737ecdedddd9e8b5edb67adb15e85794081cb96129212fd52c96e463fe0ba41b93efad3500297321e5f70f932fab4584bf1fc501e593c2d5b532b4bf6f772535ada9aa6362cf35b4ff9dbe7a677dca83ffa638639f46fb267cc052eb7a6edf117c5e3099716e7d65310afd27a5ed21c658fb53727066134ac70692f8e31b87c3554fbdcc8d67349429e2de6b93585b944b1398dd4facadddd3d7b0b8f84422f9a70d967269997912ebe64ff23dbc6711cc771b572db468f08b9e8465e47b89c64666f3d28ee245fe080cb598426979e37c9a51365b73d78e9028a07830b2e6b6e3067be142ea8b2e58249f6f75e444cf4953c59bf63b1b73ec020efe11f002809d8e2cac7aee1a2cfe88f44241f3b0168947cecf955de23c24c939b75d3001388ae276dc99d1b5053f29e0673b5943b37c00432de9393a910b76373e6d49f3f94f104a5b042246d1596dccf3067e8beba96935a5ae6fe73d1ff773c113f9973d91af67d9cbf30a674b60febbbf4dcdf02451fddfbee9dd93b3b6107356fd77a33d10bae4d516e6380a7d3ea35d716f67d9d75966d596b59f6c5c2d87a1eab5b20fcb35a2c16ab953d6beb775e7fabb96ef5edf697565707b46e5da977f7647d94bff8012c6a343b0ff6ed510aa0fc955d84e2d2fa94524a29ddc29e9e264d9a344dbd3e40a749936707f44b151923b599e0f9df5767931807fb7dd664089cbe632146019796678253766566309db28352e80339cc6b64ff18b6ed27afbaedada74c3f2cc2b3eb94dbeed39d8e4835d71712a3a232f3432e69559c6006c946985c9dc2c4da309f793ed6aff4671996455e799b5627d72f63b9be4e6c3b53e9e8fa21b2f56de31272bd4d6883d8d4bccd9d505cac2fc4c5fa780946ca13a967510dad576df0cdfd1bb0b91722346bb39bafff81cf5e7cfdb2cfdc8041748643ec0d42eb39ce270d21b7fefa7396f5170cdf63e9d4a48444351505f5344bb8b2eaaa2398518ba045b81db32d0eb65bf34d5ed0c6c6fb9a90849af748b8effa05b41e8724d87ceb5d61eb49b8f99b33c19c59f341bec67b579833dff543a490f736e17d9b0f72dfe6e7dbb4de150ad97ceb856efeb62b46efd8f94f473ac31182788feda78026851a0b3105b9791b9bb066f3362112126474a44fbd0f9b8e362c310eb1f7b05ff3365fca92b00981d0e7c04b478143a4070e91f527588179009a67cd7b57282414021de97be1113ad21f41014d12a1237d1114d064cd2ba0499747ad5c9ee7449a464847481d78cd7ba0cddf5bc1195660e6fa2c50049f4fae1182d87c4d282454f335e16ca2237d9b703ad1917e8d0dfd266bdebfc635c976cdf0d53bb67bb2758019d5b99d72adf7004181e8275a6bad1b7449cbf4eddc36d86468bbd19fb4d25a6bdd2aa54ea9534adba76eb78fcbbbddad6e9675b7ee5cf766bda774f777f7d9cda2a1c6e5dd56eebf1bc7a223d8f48ebfe739431b1baeb33535355d97fbf30c5daeec6a9fe658addbed43abd7d3a76d6c6a5c35f7fa7486e1cac4eeee7e8640bdb3842750882915101a3c1d88a89e9ef261b79edc96ee5d76c392161a103315e56a76800b29b6a88a82169696345dea94cdf2bb40217b142470a1b6c4095248439225ce1aa0c19d5bb9a5b29cc938b9a5b23891cb58b661beac79f42ce6e3eca97e1f3ee3be1b74027f981e917b8ad0f28b07dcd9a38dde47b3349133cd9287926e10e20a115c91924216e4ffd0a00a6c737b8f5416a93cf353132c4d5a40c9a2a9c71c49f100955baa872423724bf1309561f54c56e2ca29d32f97476c6a723fce9e2bdf0ad82c02eda256c1b71d3841a725f5bc7d77069db7b0ac210e3d9a672e6d39949f582e72e712f348d246e4f2957790c0a9c84989bf227708a45e58a168925627531f32a5168cd40e356419b588f6c9bda3633ecd0954c47b4a1da5c823d33100ca44431f40bde35708010aa24f408400051965713b56af90b208d7dd4d5d0424997e5787fc168d01fb4a2669bf3e113ab3a1d0249940e084e8c830d0f1d13bf533f8d1627d1fd5c31905c713b8ec282151daa795eb83517aa73ecda11488cf785809f92004a15a6bdd1c88e6a36e1cd4bc45699fce959624d7fff19e0120a026c0069c63c99cedbb62487d20f5853808fb2898f32ed6aff587100122a4b2be5cda3f5e5e104739aed2b84aa1c498d71a04848a4c9ba28bfd1b37e79c733692ad6e2007bde33487d2e661e5ee357b941934ee79cf218440f99c7372d03e5bd08c4c59bde3ff28c065530d99409a040c74af64925df75316844988d010d9fd1538a410519b8288244c49c81a649e60620507ac6c00823c13a589a7228c504189eca82629c8c10a2b25544c90fe9da7e4fa3b38eb9dd97306017100112334340de54def99f763bbd0babb67edb36df9e552579898e13aeed6c1569ea00893b27a87fe9fc1fe41fdd6625c7e35cac6fd009ce03b5d3fc02fd8ab6e02fcdb74815fb0e796baf22597757a30543a1197fc401555e41049c121f2d20e987044de3a03127937a52c6ae4e58e30226fa7830f56e4b59e8336aaf6445e16088aa89a226f4b8826f2de2424f27a9e83b3890828f2f6ad7129559ec821d23d1bcae40924978de760008c9e9ec88bcb34394191f7268b12795f781484998074b0b5dc30c589bc303c07670d4b45e49482a646de189e83738a142bf2caf01c9c55d014917786e7e0cc21ca13793f1ca4407a222f0e8d9c312b40318543230706250464a268e43c212fcca320ec09e9608d2966ca13b527390e52306786246c09095b423a686388255720c15c3f360adef88174d099b44c11455e1b9e83338aab22f2def01c9c362ca9226f5fd0a714e181a71be16c02c40c51b22ae41049dff5630b438f82302aa4833760a288226fdf98094e4a610efa4324068ec821d271549013c4bfb9a439418d1c22fd87480ae604a142395c38c2fc5e420e91b494e598ebc716da188e107c1c376cd480e5e0c0810347059b6c3ee9e08626c9881c7224d431179ed90b37e112c63327ecf3de789e085c6e601be3b0c2e5275d25b0a0ca4668eeb7e2e509a2a16c66c1a52c0f81274d26e3f10094ec0fe36999cc7e1facb74ca97a1571e52fa488272925a2f2b3b536c4a1f7d9cba56d4c297deb79994631d4933bce07f05b7f21d41fc83f682302b6014d8a93e9f3b5d402d92413c5dd62ad598c6816231bc23881e235fa3413620a85984a29f51730abb052448d4442c247b9df42cb41122ca61c2939bf0029ddb342d1fac43f454e90ad5afae54a9627b26c28aa44c749e4a2155c4e233adab0e2c47d63daa8bca7dcd2d0da46c686a49a0d2698c711b8f4ab1a55bb54a88d270adeacace81dff2a2a3afa4f20a8ade9cacac50470b5226ea52d814b9b7b94c0b6566e666891f7d81e88fc49c787baa58a69642296ecafc353eba944cee0d25a6bad9bb9444cb5a3d8fb17c62f2f26f6c09d0097b38c077229c0e52433cf942993ad6a289a656699fc5f0cd64d5d64329ea4a82719f85c601a0f67052ebf0ff6495cb08f96b29e5e23f39e12f32c4972a2c1094a4d599a9aaa282d55793a0197b5c98f909c8a94b0cf114f372c09424c0796b8c0563309191ab6587d0142a40814d87fd685159820a6726b911b0c1050641f3f3384c9fe4050f4dd15a47ee493b845368903e67341f6437b01973f992a0d5299a655880398c09d129ce48a0c902141fe9f0feb88f67ba2c0cc30b4e0d295bc877e15a3ba94fdfa5295d914b874a4a4aab4e44a30b6b8527d9a62916a6da5c810e5e80436e33cb1600a2ef10eb3a93e9092416932994d220d49a153529e5f16f1728d0ea941d5708d344dd509ff098aa14cf6f7e04bfd895bb40019c0654305513b652d8e15aad514fe51d8a88ec129fb57efd6ae16c80719ecdf11e1a89f9f201570c9c343a3cae2063ce430440ab1588c871cb8d0ad729ddde81cd23bfeb64a57c50b5705895187c903dda93aac17b79036521973189b461cc60f883baad4e01899c6a599c8f1e07a20bdb8f11d276e30b31d47c4f432b54c2de30d1c5765f4c03865541aa58c368c358c496307461ac6194451144596b88372436c3063d98e1b91528892830c3140e1000c1c0f2d1c0f2d3bc40b7ac6713cb488a2d83e2d8389b9238b05a3e883515b3d0eac3be803e1a67b88e02374268ae26422963385ec4642080a0104114a14459102620834194783acdbaa5552bb4abb4a8582e0ca952b1f172a5fa8a062e3ba295b12a62b57aec470c3d404d3131cc7612e5498aaa8a84c4dcceeee8902d3cf1154a850a142858a8cb545c185ca125ca87ce16cc76a5daaf1a8ebe674dad1c9ddbdb52cdfcde32e189f8c2f8c1a189d8c2ee8d059db5956abc5b25dd4d8c2c842d775dd139db59d65b16cd744d7cd99a5ebe6dcd275736e198dbaeecad8645c6154616432a630a2302e198bc61346259db59d65b55a2cdb45d189c2988139a98c44a30963096392b1d675736ee9ba39b7cc39bb6ece2d339acc1d1ef85969d285b060146b3af28b321af6c0d39d40156cb67b0b7f42f95c2705622dc6dff79f3f8515aeff16b62ab761eb1dcc9b682ece1a6b12fd0aecbe1775a8152b56ecc6f1c896c89cdb7cfc380dcdf756ac5871e193218bf172f5e833fa1ec21cf69341f6e9a7e933871935c112ccfee5088220088a1d764305d15967397092d64ad7e45687cca3a69a47544f1ec0f3a336251788dcfd3e7ad67d97feec3bd124fad92c9a4495861b2ce6a9da7c5f42130e9589fb1f13df65b686d3c9fd31772b0b69b049a3ed400b5269b4a73d0d878ee28aa2ce9c53bce97ff50c26c2aad803871f292b56ac2c7981f54d4d4d27502ed6358f95add6ea4cda655b0cef304b686a62dbea73bfa4eb129ac0c8acd73ef6fbf1d740dd12cb714f29f7ac4cad5c2b49b4ac50295cd60505400f3e3b3ab22cbb60ce39b94083e7b7b8059e2f6a81e78b59e0f9b21cb9c796cd5aeff4b012abc1718505be69cc4379b4b87971e36fe472e4ba8edb66510e9817306ce42c01e355e31503361322460a667c38ff59f95030e3cc1527b0c2ca4c15549491e5d8c61e717a1c59b28ee2be6ca82f69b523d104392ab8afd8920ac412e0f9d5c74e5145821148b1c377c8c6d6e9d9f65b386b3cb5da4c08dced239bf1c47638644ab7cbaaffd489f0c014a51aed474a6ecfc520280c85a1301486820a018a26316d68da00af47888bfe34fbbe2ef3e53641769faeb387b8e83d1068d1fffbbecf7edfc80067e56a0156a6a0edb13e04ba566ed362ab1b577b3a1a286575aceac150edb8d6c66d5b187bd156eacd90bbf3c020d076adfee7e8c62393d98e46eb9c46593adbbe310cb97f6b4ca74f1a8e5ef89b255cc2bc9c9333892eed5c10654dfbc8feb08b641542a72c9ea2b529988adbb1f9b30524efe2a37f97ab2e96ce38253a73f21eea338ff22ed9bfb44fa5f58a05a3c9bdbe2636e6227dba3d0f4fecffffffb712a6d5996935af90c0a543c9fe2b640ebee04995a7151da1e06c5544052e7dc98b4abfe186f6e9ed6b9d5674e645ee5ee4565e2466844a9bd29ab0b440372d2d075efba8403d9f595a2d2cc37a30e149932e6bf61616877df8683f99e8c3831f1acd9734ec6381cebca7c96cddc64d96a5a1997624705306beef868a76c204a55cc67209233bec7b3b3b2ab22936ef2851eeef76aaa85315cb5c30fd798017a6e263ee18859f8a5436a9fa0988d27e80daa7b340e73d36ae88d6eec844a4f094d9b8d2394573c7e0493ff02e3a51a6a5dc6dbb3b10dc6ec8fd73ba278ac1f34511e0f92d52e1f96214787e43716bc8e56719f97ba7870e5e524d076a3cf1093c5f0c836f90789eb8791105d38f8e59cc69e2050c195a395960bc6278c58012c3e380e8c48c0de4fece139bc07992fb2f0d4f0493e38953302762086c78221378beb8049e2f7e013d5189d013a5f07cd14b8c097dda62548e0a52c8fd348602aec043414c422ccafdf38e9e8884059e78c4059ed845c7138dd8f1c42230007694b0439644f6b32d187893aa29f75f0c643b00b0a3738105a3a8a3821c2d590d17e22aa6105e16a2a80a07ee9c3f4329dbc801ddbcfaa45fd8c5def10f7ba074d6a72009b62ccda73635b9b1e7ca5bb0647fae020ecede714aebac219ed3a7a32088ab2d8ab6b09a39dca72aae9c202607161241807800d6705061072dc08c51a29484890c4d5386902205464354561230242b4c3c2d2125c1fac095192a59be4881421520b8001225a081cb182f556066069d9bf84044453a58c388e44030468a26d2410c9620af7b546866e940132f24125a8212380489c4a67a1414fa39ca810612893f71028b921a1348242f25a12e820aaa2c2412d702885a0a48fa0e0addf44022d1010549c3ea3de60bd5588144f26a420ab9d03646cb0f45a41092a97425e989aca1e73de623994a3b5071223db4de8382fe240ba328d241b089bcd6a3a04b81e1a88a74966dd578164c8ca9910ef2384322a1d3b38ce982433a632585315df42c01a58a1523334b9618aa218b25453fc0d06404114c41d49e68da2288cf07d0cfaca2061ea68861a1ea0cc945d5145cbc64815263f281898dacaa3431592186043688259a3b8828b8b0316aa9209c84b9b52a28124a60b1a40416507a6c634660a99848e9c0456aa98c940e4d6346200504148bc4fcbf7556afe9c086356c176f38c306cc85a5987b860db8552bf8db7760396443bf5df739e02c58d60a9642b9fe055934b3c200cc1ddb5667d8803d2c6dee3b5dcced1858bfde5a7bea09bde1132ebf9bbd9645aa4f9d585c2bf8e5332226faf3654ab873935f90724b7d31cae506797e7fc92da5840ff94a7d0993e7972f79cef9b3abe729614354991988984041d65022064c0c644a80a604723efe2cad41e4016fdd77dfb4522ae6be1a41161290694a720205729a1141163e18f1c5091ac8399db8ed3d129822c820f40cc7a21a8a06938901a1bfa8a4cd3725390ad18c0000000043150000180c08864302a16844a04872a43e14800d7190467e603a9588a220465110848c318618420001001802608688883ac8cac8c4ef3217351d9071e25b29cb684b4f047ff1a1e8fd9e55efded84d759264fb4cd40e2d99bd88e1e3a379e2c051d775aea38163f21b6a9f17264c870960126f4e86bb7fbeb8af702901ed8a45ead269a93bdcea7d3210a4727cedb61113f83da146c6c0e27495b73bf8ff21c73cefa341b31026486473678657d5a6bf3efd38a5ae0341806be4a394ac7845fb21e0bcef4f270d1b430b90f69d4fd8fe34c85a1b2dc7bc9a94d0f1d33fd507d41edd894feb5679cd3f7d126b58599d134439a565156ab4a025d5efa31ad8e0a426fb430dbee9a766fb5b809c8fa54956827a612d40aa52401af9fed3eb7faae58f864ee854e558be5881e02068010003ddddf9ce036beb8159f6d7708debf79d694c11f5be96138bda2db061975534e8a36362840f0b34c187cb01ff94b7d6f19f5507823b1d39b2a3b8f5c27ce9ec330779757782ed7c9b0db991f9a54a9e2408662505b94cd9a182ab7a7e42bad4f757177c0c00319973d3930bf54e02b71e95630d7a0c6daad991693c599527a474e519acea4f5675cb4d1a064d0e1c77a1d5900ee09828d3161c0a6ec1cfa38a18a88a99efa9a34301593fa94644ff53326cc866acb597c29554062cab6a51d53b76383ea0a73824753cb8669b9054d7852666595bc7bdf9390feb1cd70a9397281fc4ad6726764ea8e58f284285bcda6b1be1a1e34e24646c7e69b748752fd39bb1c4791c955ace24b0f8688cb4549adfc4592a28c819081d742fb5c8a73c1f5d58bcc9a7b08d885335fd78b1128818ab17095d61a70e7c5c66df420f7e30bff8f62b5fd07bdbfe6ba7e41a6aaa13e176a581a17f1c34c2168a7b4db123e61aaebbee14a18b5032fd9d6978874eb9f5ce141423166f251c7e219eaa27988c6e6c42a270d1372b5dffe4297c8ba50c6b346d05357afeb7958aca610f6e27506460d81cf2098c0e21d1f935559b1bf8a51100db61f00f35e1c0e59d0a762839e2972efb8bfa99e05941c2d7a36ad02b23cf541222418d3e5cee5d675329a648cad97839620ec005aeaa01669a8a2e7f9083eda9706e310d7c79aeaaf432439a6e9066b59b6ea2cb70fc81451ab7c2ad3a11fc10fef145d5f93d2bf583a4dd4810bebad7eddd9f046daaf34aaaec540a161e8f4a83e1a633c307b9b59b5e34b511f4a62926f141e0710a85c19542cf6009676544b144d6eb55dddc043c6821ea8babce1fcc5d67704ee546faf96390150537607fcd6b5cff5358179ad37d20fadfd3bf6496189f7e4bbe8e6bbfbb1f398da959dda0d8e7c7f7bf8734c194f75f81f07d91361972f43e01b14c256d39f21ecf0aa61fd351c4e2d7b8e6b5bee74ed359d639ac53f34bac90ce703d0d22ed335e72f9a17def4d4030b5bdd21d38f131f6ed58f5392925ecf5d9e9d815332d599217170a81eba4349f587ed87c78b674f6ce017d22ef5c3ba5681a066e1154146fd70d9257404fba73d1eeac441a9cfa10c0a592156a60855259f61ed9b44cdff4fa1a3d318bf1913f22692cd857f5d522bdcf0c62969b92738569b5dc3d2f8410181aa7117a4092e254c0b150424db40981fbdfc20ac5de4dcfce0284b80484987dac7cf4bc8681025909bb6c395d53411f3a81fa01b526124ef74a3d3628656f6b145163041126904c3cb63040a73fd4ab07e9822b28403a63e208b0f3939f0df180a9036a626ca5c2b766cc1c814f2db6c4b8f3dec53ecf0ce1b8917145aadd7e665187836704f4269cd30cb98c4f26e035cbada8bfe0576e92f680864616480c07372f12d13b2da9bd765ecd566757375348d8c21cd49db534a4bed5b2a898491b4bb19e99ebd9f548d22814afcdd51457cdc2af66084f2b1662af318b7de68317d06fb780bca20e52e3bc7179e8a8a9195d043e76337da22928fad26c90c11fdcd1d2975bfd8f133028ef78648686202939c9f6750d123fe355fed1e87cf0313eb02231fc94fe316594b34f61a590b65db17f692dded8385bf347e4f97e1db3c73f587185fec4d0ca68bb5beba9768b2976792777f881ed841b1af69a359f9108c61a8eab150fc8fc60675b6378044c8925608673b9bd2b90829eb610e3fe81b7be37f21a2a364727121569534224049c12cd38befe8bb00ab943acb19a51de43489e7bab9101aae00c6be085df1e4a23da14b6055b2d104aae01ae1798cf2e5db63cabfa4fd71cc4a63aeeb7eeb541305b16cfb34082c80279d643cf398133b171202caeb99c845470a0ae4f50ca62caf5a7602474a9db934dc5b550ac19ac9ee10acfe62e7ad44c9cfdce045b3fcb678a09b229ee2e0d1a45072efbbafe5460be6c9820e39f97f7d4d2b63136e255c127eb8f47bc3e3a595e44e2e56e7f9ac8562d8349ce4c372e9f93c69f40eafd748202235528bf79f98add99d3b0f38998ded541bd6e81e21b67eeaf49e59a6ab64ed6612103794c361a9938ea868c2ad648974f3c2d763f3660d9e8896c3b70466bcef346c39123a0753041643303c523f8194120e9bca4cf5e64670423afdfdd91c4adabea684389bb3910d035e61e05897be72c147ae38e92025c69a8ca8dcce2ba35468eab62d503b92f95a3ebef9d80e6524371151bdf30c431fc683045209297d0e303d95eaf7417bfc07494bfe8d298e4a5192ac8951b322edc7503946d8391bffc4dcf25dbbd812eba69219886c2b4fbef15e1c332adc59a43c81b15ff2b6b7aaf5d9b219878af94107c2dfffb1e2e1f86e1b2b56828e8f9ea0a7df55f5ffd610542691bb7b51d474e35e31256c418a73dbaba6bc650290743e374110da4b80ea18ecf0eb93b24cf4eaca1b6479c80681a7025ab207720096368bdfe6c1a1770ba8622070c8a408eafd43de3817adad4ac460f5d7767e66b485eb9bc38427027fe9dd585d234f8d55afb1af24482ca3357454e851c6fef147bb250d8d7ceb02f5a05095ad0a7f1a943aaba1a1ab9d1930ffb1b4112f0f7487bc8be9799b98464491bd428ce88f459f8708ba0ca6c262129db9181214e066f1ff40d8aef3e0295be01bef1eb000c1aa735d4f8b3721b103e934bbd0ca5a227ae10d0108489521df15b3b2899620c67ddb8108affc51662a9d23114b10051819eaecd195a03bc98f927024e37e659a1c057c4d9c35cad6fb268f7a920d29049404c9379781b81aaf4677f16c28409642ed0ca133c76578ae07e1864b39a110216eb3cc50e5d500f8549173716180690adfc2bf077b629df345b2b7c1a9c6d4799f9a99194ece7bab0b473607139130f994576315d6efc4a1e93939415ac1da960ec1905b1e96589f73d7df8aa314adebdd164ea854465118360782a19247a0708e89d68007c80f829fcd020ba403db4ee0d60cbb2de0d07211a2389d38be4e2e9054bb2e46914e7379259a66006d195c201e23f7e8798da3dbce36427009b5ae20189e50447c47b3fa6b11d5a818152c8bd5222f6ae434c976a49ba42ad1c6818c27ccb408582669b99590e6c3a490905affbf79935dbe72d4fd8e6c4b84f43eb4d22c0cc5d21bb6a6c76eb47dd09f4c5b64d027195153f770fc40ccc6065d5b4d1c265437814dec3d2c615fffd28294be650a55276098028aa89b15b5ec04ed58eb53a58d070570ce9633793b2e842a4acc965c453d65f86b1daebf6634231e268614f0bbfcea6462dc70479fe2479403e5e1dd227b2fbd647261af0b5e01a59e739d3c07068e502442f6a32560094feed4b42c3fd2c7c73160fdf5ddfd7fc707b1fe01e51791e39a2123b1dc1bbf41620a247513587c7b43f680ccd5694dad48f679571e47211982d3a4349f6aaecce87d7d1945d7fa148a8d102df8a901db809f3e6386eabfe915a846ba94b90df879489f03e9cc238bdf66721aba6f76cd02703b8a83e90028265d1199316ca6bab5921cef66521f665097103ba45294a33e5786d71b5a2a25d9c10cb6d1f6b4e40164f301871a4145288e9c8db199f597ac07a443b286220882e68936d13e3f709752a85bec789671d8ea7eb929214064bc11a2c3da79a9c924bf91047764cf39cb000d5aaef06e16955f6a0602a6ed7e652543649302018ab57a124dd05438cc0b91268555f83957889614a03271447a393b50981426cab092cae0ccce5cc7f359fe9c4f0841463f3d1a9123d773d5c0bb31b58c80be0a16eb734aee5a411560c07e09383edbf3d095eceb3a72f170f08376ae063391a7a129f38975145ccd65b0acbb594b7368c4bcc323629334a61a3ccfea9386f5ecc3cc6bc0324ac6888028249023773f37a3643bd83d489e5618f46f5a2ac1c80eee90670ced385aa9918eb5891253e399aba781279ff18c3482c71dd1ea7975971205074c27a9ec97f25d59de78a869bd16ae0822ce8e6f91501ab6000a04ed08754d07ad26f2de026eb4de6a48fd839a6503a15322839dbf6685905bcf6e38cc484d1225c27f3b3e44e2c4908d2746f498338c6fc1d9f408b67d3f44867f22aec299d0f0121ed8d4b73c6b973605d2b2255301fdbb088f93602f438f24296f281bcd5e29410b5abac04fb8dea9e271193e82d182dd40f43e4857e506453fd4c22538ad5083b6ff32126679b2fe069a28f9487fe31635d7d21d58129a5df251fb6c39dc94748adcd1c24ae9b7e79eb98f86f2d49c6018969b917a9495f9c2f6451c726b04f7a8e999847fecf61ffaf80e54bb1dbc8a09a5e3b923d2ded4c9007113847030ef1ce408400716a8e7a37c0a18ba0eca08affaeb2f3abc6a1edbdabe6116cf666c21d85f2ee8826bd5051c8ceab583e15bb322499cb8c3e6b4f1888d1f38385d44fa225eeffb69a65bb8a84776525756d433d02a341de53e05a26cf08c63702954e02d0d32e107276854832dd9af8acdd725f37f9664977f5ac6d2221ed636908f555f2cc70a0e48ae4ad9d7dddd2568c3cd99ec4c4d222b22b0770ead9cc5a48a68568ad5406e9a4eb57130d2a5dd17c5dd84d12ce18319f376766d5de9aae21877ff4db4274519bcb65d05051a74da51a21a21c699142d252da985a6e66722f3d5799a168f47e1e36a91b0962d8541b2e2314d9888683474f5b0b42feea41ca4d3de60a893e8acd38fb486a2efba214884b94801be10d7007b881225d378efe4be24acd62733fa5deb1c6b89c11c4073a3f1f446aabe726ef21924815d96d432a11a5126551352fb9d952309e1b4f3425e548b01364ea5206a5421cf353344a045fde1aac2abb48abc72162fe6389e685c4362dde7fd5357a52ca8225b65e9d83c00d20daa2b1b8c30332ff5606f690517d13682d13f6adb66a4802f681ab89f731c83e78404aa286620bbc8885a6327353cfd554fd112ea3594e964a5b2fb8cc5c5b5ebca63a23a2efae70776a2f2b1ae79e5e95fdafba092e9ac0209a9a5fd8dc77015c282590a8e6fb07c308d109358ab2b79302c839a4003b61f066798402d0102bc03245cc61856e4024db960a14c80d5d158a04b42c5681cb61ea9080f12488fc54e9c01da8d88fb83992a5c3a3cfda9c9cce48e95bdc2a3bd254718b528c7aaea6e3f86336c79fec263b314f5737d2849158e91debbfcb1e377f7adfcdbf337abd97db80eb68e4a3d7295227d3510e0cad440ac178620a83976d5251bd80fb01eb0a264725046ba8f8bf9ce08a7975dee9d5a97f3673d58b9e30ac5c0fe57f1ce3652e472edbc6f393e6e9b0d94b746ac128b31aec2e7530161cfad48ae925adef6d0373f1cb0268bc6774a07036a4ca4a33b43b797542dd2bae3f75236974dc66465e0135a4278b3e39de1bc7b3703c330605507c11b713e1f1563caa6a7b302e155c6afff63730334b0647a2c2deaf9ee55f3533ef4e17f1b534cb3c66ef8d5e5952d5a847d5617aa4329e6f01ebf7885056a56f06d03995261439e67601990b8389e712992fb610ee54c0b60b29ca828ddc05494102070c6101cbc26bbaab36226029cb50baab5caa73f1d8cb066729fbf0f6094e837c8499ad2708bffd289593309510a89f956a07a707ff94d89891d622d65bcffb7f147f713c8af15166c39088f83ebb0bb57c18d2436418d0cbb85c80c55f0d6195aa5074ba614f1ce69f14db437da26f2eaac783740b7ceddf34aca43fda56230951911fa35a4495edd0c0405dd5b004b34a09cc661420abcfd92dd1f68a6b97609264eb8baad947c265870f7f9c16254946eedc3a3954e06432cf5b80a47c52cc33c59694d4795e19de5c3eac16c5184a356af5a4d39e7151ae902b52fbd709f3feef4ca7e9a860002473938a0180629a4ed5468cbaffd280eae294eed345884ef44b67d4f69a1c2736d800075d2e2c83ab725022b60e234a8686dc927cb19960325ee9e9838f21dc222f315f9c242770bf239a22ed76ca7420b41f63f478166ef2465877aa7023f1a8c2adcafe6f9e97bd1dd0f288cfee99b6407900828520defc745a11d3abf409ac457a340a31040dc165e253d1bf0639bfb1fa1245d0747572d74704b7854262bea1206e8729e2eb8d4344249d32902af7bfb9041052dba150de14a8ef22266cb6f20d80efb5ca58b9fe35db62a7c430d5acd270dd78f920968d31f4ef8d4853408d1b7153461899c977cc0eefcf068af96d37cb337ad3b28b315c85345cdf56845652a7a3dd92670b7199eca10242a727c422868e47f8f4d00dd4cbcc755cc03acc681ef8a9b5be41c6add23bd5bb8b6c2ad98fee7bfa9e69664c864812fe87d078d9d7cc44150db2addd4a80b0d56529f92d7c020ce5fcf8be2c1ced8294b3bfd08a39269a6880c52859e790259e5cce5d19fe0e3b498b7c1d3aa9b64320c7a3bf9450ea1c9b7d1ef741944d5945ca4b6749820eec59208bc7190d66dd21bdf662e008952a889adaaa9c2b976089d7a2f9bd205b1a41591fbf0f41eb4d32f1430a9f388c9b38dcba38dd60045be10cfe9b8aeb81022d0ccfdea61d4f28a028747912731980847238eed1b13938ac246e96f24b608c2cfda4d90b5180b15aa313b62d85026967f6f0475d3f2421dab26ddd05f5891a7a3f4dbc1e470ef6df8e12c106300478c97dbc4d57e068fca1d574d4b5b352fd84743afa3a747fd8990b90ebb8ab0eb086688d379f4e35e7592eb1ceb814c515874d89766653fb7e831bd8c4ce180a802cdbea4cd133e203794eef7128e9e7bffe199f2c32f2f3c104bae1ace6207ea8b7b7cc340118a74be75fe61605b98ee1acc84159552884b4021366cfaab1522cd4c02b68f5dd57098e66319020581144a0424ea24879e240e37dbc187d59fe11aee93a17ae30c2c984f4e1e01a55672bf3815e7f70369fb03022dc0f44fdae31c2f535a0e15e0ddeeb78c8e1528de3f7580e33bf89cf82823c81c909ba5a20b762f061c34c3d56f5b3912632ba44699bf475fe9b2124db82810891f177838710c71c1de361edb17c766cc3d49f05d818f4f48c554a2b5cd44ad2ae8aea6fb4b65b967e5153d7676a3459edb032206838540cb1a4d82f8e47cfb0dea221726437e45b1549fab1b1d282e13661698cd34b6394e2c7660b04feb240129b4aee8375fbdfb905b194c649048a5a5efbda5397048dc6f0067bf1cd1b75161f0bd2039401b093bc7a5560d8cf1013237abb68be9ace42c4a06163bb64e86a3ce89a82aa1cf6633c067eabe911f09b70080746689fc1736971442d286aab22fe41a69b5f6dbe41b5f0be3d12abb184db434cec506a9bd514c75e37522b85de35880504a877ce97d5e988f844e93ce634e0d4c03da9cb3ad3265dcef270a0132048ab8dc705932ac6eb47c2c4413b2b689a8bce51c8680261bff939b4caedfb9d5281f4eb4b2a20149ad1574d8a8b1f61436899c393bb84a7c209a0b2d531fc0503ff0b9766c19e5e03ccbf2f7cd7fce8d7494d51035649aac35e6997531dc237cdfa097e78d079fa85e3f160d96aa3ddf80b538f8c7a51e9e61cb1ca4a6e7498f96712014edb21bca8dc6784646bcfabbb214b066ee2943d6b3e7e45542e32c64b5ad9672b690b7677b8cbd8f0a0c4605d2a1c76e1e240ba39575c251397429e3c2e6af3230394bd06e6dc287d1fd037512d3709c6e053e7ff42a2b101b4262f428cbdcbe789d08b0a365ccbd2bd4af184c4bf295760287a5526a19f889d50f40187a4971e8f39e9f7d4d5ac618073640a0638d6858951bfb7489689adbc6e70f5c04443cc761f8ea72cbf01fead7bdc844f70e223eafae3acc07081ffcd4188e905d2060f84af69150a69c240848c1ae89a52066e0cc74237186a914d787cfa4d4ed653676c2ddc486bbed426a6015d341b102ba770f72cb6ed6a1ec69ef2b9a82dd864ee0e6f79024d2ea9276914d9c49cd34f8cfbf08f19546772baa932936c43b404bd630b58cd34b1eae076eceab57085706191cf0587f5844d569d76519ac0abd457c7e438e20cff0de1e5ff4f44356a593ba852cf1f92ed6220020887b3ca306a27a5665435cdac844f0343fe0255fe9a6bc59ad210185fa9bd7f12c036a61b7104f8e86cf57f35de48361a77dce0dfc09a9e4f64f7ffa4a70ef0734b0bd5c87a3396ae250741d6eeb7c6da27fd47f30bad6471a360744bf52a7494207118577129152100670c9c5b2b225881c43e78038604ef1e6acb1b4d480f35c4068abe23a04884a73a8612f1402f4eb4902298eb03ed53a7c8e12c4df8a1a840bed54e53e5de46d62b947c500f1a02f15b87d7cf61f3bd9e436ded50d67e8d0c50c4ca3d7a2b0f655a9af88f9bc933f0b6b4e9e7c89a3f0e6b9ba6c8bb2aa7049f194d5958f13eaf84404db5a193455645db83efd05c89bf894d53ea4963306a4f3123ce581a43376128996973947c7b56bd02bc78ef88374af1c584218b8ccb602be4369308616c7eb771264afa9a60190aa3f850dbc891689f5eaa56a8fceacdc035e95255d7c63f6965126b43b780fc2a014246de0552e4272edf9368240bce97034b4412fcbc5bf6c70e6458e775ec64b4951fdcd506acc95ace042d3aaa998d351740ced84dcf9feb2435036367b5bd52f94d613d796f1d76178aeb12cc5a08ef2704c1ec7bf2f60f8e7866a57b1918455682131109b2cde25a2184b8995eeac002cdb0951e01939830c1bdb923e05c20fc0e9fd10d9c83b6cc36cfd43792601a5803ccca07eb26646066912b4d7c00c844a2973553106f8924a8d4d3bf4ed0afab67d964808a493982b1a8449ce94f9084744bca160e983c10973ae5ff33902fee25938a2c89ab2ed80ff5293886d3ceb59f64064347a54f717770e91e913aaf735503c0af5f98192ccdda360661614aed0327253b076f69d14578dfa68af6a17fd97ff29f513fa32ae6432550c56a8e0ef854d30284af2ed2fe0dce0c315d763462bca46a767f8d318eff4da1df0f1f691e06fafb26b2a79a7e5484368c9d0e2cd04fe4cbe41cf0a488a90458e9ed6f2b0a5579606fd26379fabf25fd5708064aef35721756317800193759dfb903fea3bdb3f478002d6ce83f8b24c711fa2aa04e3a1f319eca8d860fc93a29000eba32a0f20b0af36e0daed1ccffd3fff8ec99a35fec1c94abbf63e34379945ca22d7b5270794c2f440f941b802d33f4540093a838f87e1f7eff5ab4c7eaa45bc41d3341acf1d213f21982da9e62726219ae73be0dbc94d300cd5a05102c9e4e8a9b2e4fdb86fa213dd09252d519b29cc94a76ed4f95d86ebb2df5c0a38848a7108400ecbbb85d2adc82c9a26a36e5b30290ad307ea236172f3c0b981e232eaa218d4a4c7c65d60c78716f5a59831ee39b709d2e843ec606ef52466f311cc403eb915542e528be13a9bf67bb0ae4c1898c50cc92119e665d597c1bdac001bffeaf45fb307dd3dfb64ca5b30aa73c9a6f60c1ca0d7324f8cc00412d433ea64908a37fc3b26fb3747bdf9134841e6076c613fb299097b34432de4cb3ecc8ed4f0aaefb1876bab2480b916dbe22807be48eb4b0e85a83e282375dac55908b5bf2c210a671ab48dee975ff963083f2ad553befa6662136bd38654b8cf1c3daebd8d938b330cc383b8cb08df0e10b30d9fd89a523c1c757972ff6041570f5fa6be398f5aa83efca76bdf02b6254d528fadeb6a0d051a92e16f618981ce459dc26a824ae7f84bd0767b0e210645a7d0b21c57d0810f7813f441449513b33af6938cd3171014fb600eaa4ed51339d071c0462c8a06c42bdb33a004968c46b305ed9740a79aa0796afdf389f415da03fee053de0b6c7dc12e5b3405573eae92526e3c2ba2596253851de5e2db9702add5e879318cf35f9f7505f5123f2e1f43a9408e220e282a9b213ef9c3609ccacec4d2642b30b8ecebf625675b3a4a280269df674ab85ec1339927462b68c95b78b773e0f4f51d567d374c00aa14abd8413282bdfe2bc8be7377a2fabc76155a8e3bdce7d21416aea50af0dc0463060499ad98917160f5d0ddc28ac7b9f6774d90ca68ab90f5a7fd6de7577f7108b5448857af42c77f5f7f4d217d7a4279c2161963bf2ad86537893df5a89966b2358e9d2229d6af9eab97ff1ad0aa3cae0feb91d544360a1ddbdd131235ee5f0c673bb5c36b70752c581b28f508188832f5bfc8ea0e81f833828966f5865d7a0cfdda5a5746c854ded416329ec2d1b401ffe1aaf720b140e17e5209cd6af6ad08b2615930440a1e4dd34ea5549dd86dd660404fda740c3d3ea121ff6619430d56cdb1b838582574e0f6687170f659615ef2dd63da0063484bd1a04afd8498ee449b47bc6b1aacda230ca7acc6a94c8a158e0bbeb37617998adc43e805426a0a8ac73a240b47bce21bd5f54ce05f5ea1a8807fe055d123dd3834e908ed3daeedc7993df367bbbbf590ab6f5c4340fca2d6a902ee6d5f7349a6e80a0f6099c5d7c376deb58f15df816fb4e5a30d470b3f78a3da9d6649a312e813c05014ff010ccf2d7c6204ee6007cce21c97db056cf1ccb0e74f59d14587eada488cd56305787c52b7987652163c2608169683d81374d4cfcf6b4d0df424104d3e3d6f504c0a2aa13f874c0d99d1601f10140bf21b1115ebafc375319f520a60a6cd9e237b9336452518d884d13d846170d188b2e0a88849009a02708010fd7f8bab7b4b9ca428fcecb08f7cb603a2d5dc95b93eee90d93141d496736989ab229a8b7ddb7f4f06ad9c8f10b325c8e0a6e54279d9ff7503b060881788339471316d2aac934f436e444512cd1c869d21a33528bf443b27a9973001647672ef24876402aaf2b591ef9570d94879618639d43f9af748bd67b9329e64ea08a252164618ce3524f409d04e22de8c08258dc7c67f34e62b1d371b6b0df0e2b16b9d5a276444649cc67f49950254c813049e2d05c3adbab42cdc5b569e512e71a71e3ec0c3a371187e937252a4e4a7d2a2c75aa1890836852d25161bb8385343b8b40436c6bbe9fce16c61a5323da0fcfb4a70d06c39725586b3e39e3939b129fe49ed2aae809ac58477e9d68c1cd5189aba5375f1dc6534caa10bb596172b5b0e2f8a16a929c2eb97cf430a21dd5f8483b127f33aeabff662fe1b0c1b05ad11c36ed9a0067c4aeab350e8782cdc1595a2556f64933ec030bc4f8c548450315c71ea8270e4436d36b001b32db5ef43fedbe43c1127fba2c2f53810a415d4499781c5ef3ad17d9355a3c8a586526b220e546d209166f12494c176d255e13e12301146bc4094f5d9fc968851e52d7ca199ad0dcd6c1a9f10acea15af3b0d6fe14e960767439e6baade8db11a2a66dcc062f9763be579861b3145b0d4c6caf31e1ca3ed73314605b9fc545cb5a183c60dffe7504874e2ca3b2b35cde5bc9a6fe81838da95ef913b33dba03ec5a40ea411b830f8767389a46443cfa3233d1eb215ed6307779113c07a501525200e5657f28e214a93ec382c2932190424bc7332eccfa61c28a0e45b0f220e47296116ea2e51b11cc3f879380a73188cb0cff257891269b326031fe8e155261548314c46710b1edebcf70a6bddafd1499059726dc088d4ff879c269acc01822e91fc24a96db8944663ff2a875fae03eba984016218b126bf0c5fa94c5e0184488023c7adaade9f1eb587f369e9fe5e0945b48b71574f58bc378d742f8c1da914dc887363ee0795b51c2e59d3cb749a111ee0a6bb725a3ba16be64133200ddd163ef51212b43ce804fee573e60b1ea5478957ac99315a13f1104c9fdf9205cf8251a7a72dc9b2eb77ef67d5bd30ccea4e74c6af882bfe0bba1268369b9f3a5fd6482f288b3064ebce230e9c24a69d87694c936160f6ec248dc88f2e0c8fffaa57480066ee9c4213207453c1222f1a9d3aa31a5e52201e14d2123a43e0aaa96f019a36668b82c299edb95843b8a87ec70268ab9b9546afa0888aa742da8f0416123af0bd1855d9a17a0f8672e42a827cb5a0422725418c1a1d8a86486afc2bbd89736038877fb3f4b076af1ebee194e9a8c2bd952780041f5e23fe015ece4d72fb072ed538bacbea9533a592e08e150dbcdbb11b83f4756e61eda68c9814e8d523b27d06d8117478e7973bd32887d2966636a6f044b2f8c1ef6bdb748e61b5601a1c87960e2ae63007ad86c747f98a965133ce04cb743c9dd546ced1b565e4747f27a62176b1cbcde52f1cc0473ad8610610ad2a5d9f879a6f4c1ebefb0c442a86c0d2c07f0c20563fe5e442ac769c511be528b74c17b25c6ab0e31f8195aad526cfbdc07dd6e0638ace11dba1ac73ec38c3e3ef85b29851cfed26a7e0a68096eed030db8ba9e97d7a1ff6fcc400cf1045bc707fb33f1d3d3bb999af50c938f98f8a47c5900a2dd805bf3c2f4ff770d46b1d315b501b658f9f8419e829350a372a36f11dc02fa7d8c37359cfa5df65eea5526cd7960587571f7555a687aa812d7531c4062ae81ad9fc1ea46250e4c31a3fa97870eea16a236854b468b7803a7b3cdf3ff2170537cf54b1a2ee4f44b35fc4aff5a83c255a471ea0fb64aa35e3c86052854651ac3fe805537f8e51f6b46b52aa8098de6347f2ff82f7a6b9c381880ef4ec8e5c36742c7d89716043c856ce0e35d30d1a2602901ff2cda642e010aba4065c446805e97d6744de1f0407a480bf6322d48f2f4e53749dbccca20decfbe9ae8e9801f88a095cdfe13ab1fc2280ca357a8775938d83b463cfbb65a602cd7af9dd784aa501e1ee42c0421493accb7d059de04110fff89cf0198ef0ab7ae048e408b751fc241e2fe491f6138be45cd428feff37a86e4dd0ecfb0ceec2e66ef31ba0c05a1a3cba4d5228406e73fa4552a91862c511c92052493b4553c30acdaaa933085de30869fa38bbacf6b781cfecfa22dcc26d168e886aa9b1043563dde9dabbe77d72d21995245cce96ab291c08940c30270ab6a7469f5ace6d2093e73e7d8906c1d22102ec27f91456c25b57fb9ed25a23ea5af646acb7495840b35d8c03c2b477e705b770c0df098c6774390dc48fe0285615f79df39a190dfe021ff1ce1194b47703adc3c802bda7d29df7089155a5e9c163095b4f611e63cb4e03ee9c37da47e46bdee71a0cdc7a18f949cd5c9f95c952ea808d4fd2983d0f0353a62c704a1511b43811fd904c67eff7ba68690b11e68a06aee9d29acf57dd1e00512060e6902d817fab0030828c9c7d1344206aea75d5de2b8d407c9da299f7d1f8576960272934e7960f673b8a74ebb58d0390d766c4641d102327194b4a89ad441e7d0b2e0c6790a8451cc2a4c0c4b2693e62bb0afbeaae3cf7e2b9052a50af50fe568dd4ffa1906ae16dd82d4750bd189e318344e0ddb129da1e7997c81c2cae6322050360e57bf260b272ee4a4c217c2a46947d1232248b335dd131d7792433b44912dfa80817faad930793c9c3e9b64d892963914296e13a8db5c6569d91a3355234d47de8009a54ca15fde66c32dcb309e87f0159449af6d33c5dfaac81eaccb0b083378ada381708aabcd7a57636dca755d231dc1ad26284d9d667ed464ea8186abb9b5e560e76d068c610d8e4a484836aaac45073ff10287ccda92030bd51535c9474037ff1307589bdb0f73d3304f4170f7855c884fb1f7f1ae829c8a5bbea0ef00a72ce8d18a667663c2bee41c9ef9e55b6db9dd72519a772f40757a8ed47c452008a4e97d9f3a3ca3f9a8bb546ea99d181427b7137fb238e69d996bc1858f3bc004a4af441038d08e0c4d1bac63ccd8e45c621da93fe0ce1044fd375b6f5b6b555cdd79bf16a87ba63bf7ea3ced91e3a45f31615a23fdd8bfca78d301e230454c2284778f122d484ab3d3ca620ab6cc852ca692180bd8b850f860018220eea8a0640a41bb06252ed8ffc9d3fe1a80197f72eed9ea5e33b00434edfb8c2a554358b9e2ce4f243c11764fcdf56dcdc43d27c5903a157b4066bb9114c226db4132df78d630008634c99914bb3cc84fe129827e16c04d5863428cbd8d2e3599726ba4ed69e870bc4a635ca677c853dd2adffc60988711b4791dc1b741fe41e977e68dbe8c64f9ad2fa9281c704b48054c9c41d0fa9a83d3a43b047512ca36bf7484fd4e6571be58cad551aac883b4fc7168685ded9fb32f9b05ed9c7409d7417a76bc32a24ede0126f55676e3c765f3648bc7805ce127d16d42bc679344f15d6a004842593e71657115352c50f76d6910b31e8b80b4f3f9b23eb8a414dbe20866d97954d5008f93a4a2c1c4c4d43869e62f96c6e8b38ac9f846af0c354a097d0ae3fde55dabc47e9e9de33ccfec282fe01c1ca17038aee8f91f9d5be4dc39d1c071b2f5f5319cda22125593bde70c0b5f36211ab7ab3167b34036725fb18c63af9f0378b753a7fe3143cc1f03fff0efb6bdf2cc0e17f83f66083c30f38e6513fb0134d9c07c90d2a332268ca9e9e41d4dd99be190d3455170b8d743a12a0e5d72a2aadcbb660ee9e4646c9e6ed20071e0396ffee4f14e99a2429ffb9e81f85858a8dece26055d4920aa0e6e651f6fd881c6d14dcc074ee86b732556f404ce7e1fb2134c8e9b762e578864f22de5fc6ad8120a0faa2db31e2933e9a5abace29da78a8da68b17f30f1de240e5a66461cead88ddba587871340ba3d5582a94643aa45e7bdb161a268e92371077ff2f157e18838b30a39c3fd205dec47df727f1f9c6c0a3cbb2b140866cf951927b57faa32ad9702584cb19cadc5a387664e0bf03b197e71a19abf348cc010eae76658bf4ad483f22ea49ad794d961fb5962174e5819537792a33e464c843429776630ce81e126537675e3d1cfcf8652fec4fcb1a3480f42c5697e133f4cf759c3f125dac627b0793103b9acc73a7aa4343fcf2c334edae7b051226196d12b23582c1d9d3dca856f5d7fcab15473c7a89fdda12470540a4dce181685cc89fab5d7d893a86e79518c6a1c51dba8647cefbfd8d4b58b91e3d46d5d74d2381516034ab78618bb2b7b36a43929ac7f129c82fe889e199df18809f4f61cc3615be177d407f42b3c7e7018b0536cf258b5f8b308d9963423ee2030bb84d3e09fd2d318001ab562930064ae2356281adc69d1343501456b075b200838811f39de8cd6cc616ecfc1fe63909f38234aaa34b03110ee5843a51012f5a4217794196310b9149644b5cd666ec7dd47208aa4240b68d788983f9da9d85809fa0ce7231ff07eb7f80e8473123479b70b12d9152db56b880f22994344a1664b161924041a6155e4e21f8d1e9c80bbca7a2a1c2519a76a51b163b56094aa255b6eb68c10345a35296a0c94e96117a664a3bb56f5e76f702ae99f74334d12280de81e8d4a6886df2f66c3c35d47169a25c9f024eb863ffd91d00162064f7f4bec414140f8092b8ae30de8fc29d7ca4faea4cedb4ac869569323b8748f712365bbd8fc3e0d84fdba3da0b1e39efd23fd0c558c3bed29155ec07c45b9aadd9bd95dd0f1ab0e997a2de1bf580bb590e68d57c0323482c94b554f3afde5e4ef526ab74caeac848c32357b154e66d52b1bf5bdeb0a9c9bad9231e86a4cb0e7f718c12feb9a820934461be5f370707be43d038063850f596187f019f39a2cc34ac56bc5e7949689fc4fb4c1fe276b7ee2021516495ae9262b6639d6ce482d8b31f7d63de1bc032c790a5f010b9e160999f1cbfe42cb523e7a1a2306a4442e43d1c22bdf76296f9acdfefdfb37ef787c3c23d36cc23925d212f9a9bc9a4127c663e258622b2e8d374a1824015c34cde405104537455e6ba5883eb998b4a486686ce9235d369955e7e9fd4212c76d644b79f02f10fefb6faf3d683b7c16a6631f58afc5fa39ac7613b3dda18ea7b96fb576f95108d497f1c4529a4a55c0f7809d718fa1c65086d8e8c305cd13decad92144ee84bdf9e54af1876e1cb0a6deec82633b44780694b1ec52877e0d9286e89f3613d46915797be7acb129a8821cd84f2d3528fb85d9bae2d529faaa45bad161fa9e361d40cf5367f6cc87ac4488b5c95c9d552d41ec3d6c80e0ba8bac955880d334a687c8ba03701299519a135a0be9c5b643506cc935bdc3ecb4f15003fcf36ed74e95fe223abd66988fb14e0c336f4120f65b72e8788012bd10306562d28ebbea0de2c86c915728ab256babdb6d0be793c8a6acadab3a76b53a5cce9f357f0db4cb0118c21a2181f2272ce3875a76101144676a7c7c890a0034a4bf7e443c56b71d51684108209061e68271b5aa958ff8032fd6e42973bf6d3b47794ac808f7e7fd34903128e92550cfd96fdd4a406b33a408f3bb802425a41b3e53fb12f430d8c0b5313d02768748ac73f5b8ae7e77e22df11101ea708c3468c7eac979c7939dacfca2633a20404a4f65a3e700a1d7ab23b2880270d18bc43ca335d18bd90d3673becb37fa7f844cfa172ab880aba37261b565c67a74c4814480115b124f406c4963cb595b0d705b060c156fc27bacde8fc340d58b4351c583e027375719b9f37fbb2a070619912aff05c7f6621a0ae157ea4f883309f8b479599794e90092ffab40f6b3a0ef179284f7b8fba4c87951aeae932cefc3b9a7e31198cd9c55c54f50701566d38f8982e40067ed1679058c68850b51a80690328916b2cb9c60bbdb237f7c03142591a3e0d1903f64936df505cd6bc75d436be1b33e99036d250dfe9f3c26eb6ae114dd241af076b30b86896d8c3e829d1008f4701db297ce8aca0edad6c73174c02946a2b342751513b701c604fd35b4990254e6c450e13864a61ba525240d5588a578c5dc6019f888c1e020c4224804d719d39869de30e8e7b9ca9585ae7a976ee1df35ae51e1c1f1707b4e452404f09dc464c7f9265cd9630401d37ef123d793a1daee25bf11a18da5b118511dbdfe13fcd01d525827cdaf049ae8837c5e4b5a7919f1e41e4b7f94e0fd3bdeec6b5a1104247e8c27ba8b72fad3b55bfd7e67ca2de89c691ab1aab213a342bf0bb76c00a7fb8005b0408d04942e5cf3a737a495f6d6c1d2e5319fa53fb6692781be3d5d570e9ab320d4f44edb6987a136ca25a7e946eae75bd8d839c7a7be30b170a67a02a7385b0d16ea6bd2f61e0eed8338a1adcee16d649b8396cd4e34b134f4321119c48bcc98bac55ce13632a796ec87e90be1c7bd0c88dd981995e057dc91b88c0e87a07f403d9ba4289df5f4133f9aa01c7f503527bca8414e145dff21a1e1fbff1ee0efef955e5bf672e4463134bde3a9657904d0093c7a155886d592f8618e9668e2f21094c1b6a8ceecd7ce01199e3aeb102a35f0ed8215341fbd2f5b00c7e555224d9bd0c8743589bdfd7d9a86d7e032644b0fd294356c25694761f24ca4f9908fef3746595be057fe5deb88911d090b8a42ab7ae35c405cf77d16b6b10d60bb0ff4dedad38a09075f10a82fca35bb98a4c21a7d6d27df1a1557402e5ed940e6bba74bc94984056f6946ef86e489fdba5e17e261889527b9f6a2651615dbdb1f280dcd4e88f41bf1b46fd75c529e945f35ce4704cfa08200ec502d296202726be5e8ec4fc832ffb08581884bc7bc6282847aafaa587d1097f93548739e092a47ad76e74c1f337ce59667835f27984c2f939eefc17a04336cb27de013356b31bedeef97c586142f7afa6a5d90c108658cfbfc97468b9a8708aedf82f1822921ddac7e203bc6020ea7868cc6589b855900941ac8c3884caad8bf446151242eee7b74609892aba41bbc3787ec72f6d221dfcc9d78ac2e0b3b4d945d7092bbeb1d699438a119d232bbc668863a1baabadd6dc3f15303c9f3cdf4323996b6892d55fb825ac7094c0961115ea453995eecf77b4a7934c052209ebf1253de299d80956d08a31d222301966450a841584e2b3f0f5bff55a9d2586bb053b073e7443deb1b083bed4c29d4e3f61096e283d8521c71449c67882cc87414afa10358746ba17a181146334b948a12795e69058cdc8de068f567fbba8883d11b06064d00302b471d1c6ce8b538b71f0c34069d208bcb1655cb339caa0238c6c2a455e0fa29dee2d5d3b25638ae0ea12b1092d4ce18b5296e5172fd20b93d389c2283d7188615af8ce993a115757d8f34e5f8c50de0edeea48a64672233a7ee46819eca506ceb23126024e7802cfa16eef801daebe4048e9eddac3986d151c4a5a3584d8031bc4b2b13708975d1feea9be8b7830268e84d282506ec909bdfedba56d03bb437063a71fa1a49d6e4fab3037088f0b7214f2bce0ab3b2c996bb22996bc19282214717483c77d83da4270e3be2bc5c7f27f87bcfc8c5aefcb115b5f0e6920bc79aa4afb0191c66187bcf06a624d33d63e8af2db17410ce36eac3fcde5e0bc4b734aaad6eb0bb1003da2b1411df08ceb139536ab2235841a29f87d7797c74641142703d42315b999f0092a71f09e9f5b9442819a1ff398d7edcefd247a0665dca983f89cfa3c19e76b41eb8ba9cf5c3874532174e18fc9f4316628c4e4dc65b4ddd703ff93f5de71969d9421a75f16d8f04ad78d388061cf9fec68ecd934def7e934a75edf6d53c131ececa647b29c690f6aae1b3f6d1dd2c323f3b2832b17a91283f2df1117ab244d4139275bfada980bd35a35eb2d069f0f85f7e5b6d25a4e1b81556d8c1d02e3cc074339f7eb6100e224678b18fefdbe12d76e29c5a2da999665b1520314532585884d2403a1431482740cda7963e1aae4042772e5eab89a480172d4e44a0cc08b0596cf33cd7a856acf55f1191a442bb2ec9540cd7f6d0a6271679338d0c13f1c28691475dec6a3900239fd068640d142100a8b5ce4cbe8cbb1b7c491b0c994964ee64bbf5fd44b0b8093706fc61c68d5a26e3d64ebddcd4ec47d22249e229f4cdac3fe2135fffd25a84a9d7419b4c1c682d7f5771b8f3548a99b640d5ed7c8de93ba3a5c61251c314c70eaa2e66b54a8c689ea7407aedd00601e3982c53cc3e03a92566db9864549f74a50d68ade627e0a04c56f3c5c4d79e24f5029affbb046b7723c937038beb4e317b6c0a49a5852ff19e9ac747b158eb881271e5d7ce7ed94b205b123c1a4e565cc4dec9c17bb465672a8ffd8c4339e86a8c8806f6c218d53a380dde1daa8806d426cb8c6a0700d238bd43cfe51e3c9e50b9cc2cf7c61dd0c1883e884cede3e7e827757e22285ff31954dd8349b904d2f6814462ce243d5176bb1832bb5ac28ccefbf29d2423bd62a0d6ced70775b07fabef378a6b78535963a5b1504716eeaf3afe94725505aa63d1d7a0de60ae802ee192a796baa3ac63e25556f9c410c8d6d74a4a57711c7efbfe44183ddfb4305cd5cec9249ab62860b07a3c0b9c8ece45a3ff58422fe40c26892fd710b8075a79aa933518b2a086b51c5027fd8d81f774e7cc82028312801c7ae67b6f6a0d2fc9624b7db48ced3aceae62219e1319788723ddbb4487557e75954e4bb9e32f88254d3688b7cae8d5fb62bfadc285996dc90045b039614b4c68134da626512aaff9cf67ee8aa1c0c3e0743dc1b84d54cba72d34d8c96fe3ec8eb994f2aa87ce2206cd3c06c666956f22e686c413ed39114173d9a64d91021a16ada2f70460a1debeb3a01f3b545825afa3fd6fd5ad298a0c990ae20f2e3c24204e4c294b2abe7861dc29395f5e0f3e3315e794d14e81f18eddbe53d8ee0dfee4eac2ab79df3ce960153e3b8b23fb1def7d09c648655ef3a5cbcf90570b7ab219b5fe3817dc0aaf1afcc03be85c6cabc9439b9f6ad3f31d858357fe8ccb5a5862bb7dfcba0d2cfd167ad634c961c75ba4f8e47b9ee8f7261de5caa59a429d20381dce2eabb2e80db04c4d7013c8800d32cb477444382b0643e1cc0337ffaface9164474db5b0e1e65e3c001dc5a56ef873153f36000c27858326048a25409261f961bf0b142549109def2223b423e11c90b62583268fab4634ad14c4fcada3d307df013a6b49d1b7270e9f43b8d2fdb324ef2398ac0ce4157a500e99c1cc161a985f82c1c1f57feb20c1bea89e1c45305267c92b8b277b056e9a0efde3dd83f3bfeee02f96e6ce6112bab75754619c70eaf23f2f1253f8125cbbbf0409aca9bc8fbbd035629f197ba6ad890d01b13c1ed13b58e612f37b3a22da08ccb9ea110acbf3e50d93fbca6c42cda6ae35b551a779464c195ac106c3b290d4a043b932ce5ec3e4da9b7c3f07a0d499152779bd951cd2b7ec3e6945245b9b562d2b1020c7a9fa5c95b496bd58363dfb025d70e11cfe099e2478f26c0dca48038c574f8819a100dc78915115b46bb44641457f72c54a61bce1aec8817dfc6f0a7ec9cd06c791c9fc282e130045a1835803dfcc9994458151fa51bd58a3fa574e1eb45b7e70cb0ec07c77be9e2deb20908cc9172042d9cb0632d29f6964f7c6003608d2a06b6c438d5c13d30ff00a8cb939f8df877064c2a7dd4ccc126a2e845655dcd7c97cc83c885049996f226c6f653c61d9fde35c834d49f960fa933831b85649ad7403360d197b325ba30c9fe1895b843a00899182999ee608495053402f98a2242d6d11a4de64399fe9efe253e64e607563ee86bd853e61353293f627c6e40434af5d3b69ed134f34e9fed9b90355869dfb7aeb6b3e761f66477300c37dff4ce231117ea46505911962120116f0aab7296104c9383c03dac400d63693dcde3015699ca348a5b5744a078b7572c4452543805917696774364562435543fec861b8f39531e4024f75ba562b5a641be81085938061bcb0c4c8f01292e2ce0018973b5b0319e20e9c96fbc3638844bb5a9653e2ab0a4208ded0089f009f7d8667e2bc575ba8806bc419f9f8405b86bdf13c494f75719b72033dbcadb27e0dbe4e4eae4dd5f2e3706e53acc44d4018eafddf0220e3109ccbf96621d79a8d90236801e18cf32151e70c3b23979c288eb2819780f9e8cb0ad7c52c0ba3be7a52a08086c6f250b2ec73b146777f40dd46685e4fd00a77296c16b60f4f9bbdec1dcdc2309ea230b8333d075c63d1bbb53041314731002f008a067711b9210761d0ec526c5e11042a0612f2ffea13cc6025d254263b595e20bcb50a2acb895cbf6f31b333569df0947a69889ef68e6200b4c7d60a1086042e8b98e377d5b96bb5e1bd16c4d4f1f49d1e9063449465e9d3ef59970e65bad144f6550abe7cc778a8a77ddc8a93e55c395d7b244f326551d32513b74cb8c72b58187550a27c450c0c0c0980d046b6ee516b86e7ab97670bf8cdb1f6d29222ebab4130ca4d395778044ecf8eab6938b8a535a2d34f674a9012b99654e9e3dff61a305959b4864911f93212034070c752edaa63e540f93149918ffffde07fdc186e686689d13361aff682a2770297653a73edfe34ac0bbe713292a49e8ee877ef95e32b0cd09d4b4bb820bf5b3014955f7223e722770295039578eee31cfff7e43571b3c0822522af9924010b690d315e9c82236021fa1804581e3a83e35abc6dbcf2b8b3c080fd3434ca80d10565afe3c2835783544bd63a29dbe004b2ab77002c35e4265ffdb298a311474e6ea77fe8350049616688c25845cc1d187e7e0933834916db713f0e68add37edabbad3784c36060ed006cdae047f7c22fb2c4b7c0a36fef4320b098be81a8f7e7649478d894e555d7c2c61461bca5c6f0be5482b1ae9f86a020864029dabab22143b5f1eed5305bb8d59e93560495fd3e2f14566b682f7e6ed862a24079af5466b8bdc851690953cedd736bc24b925ec31a8c88e9d7a1ccecaccf7be7986df2b934bf1675d41fb95d43836f6ffac61f27305c304498abaed67c6108bcc2e29a4745902c8e14ada25ab65ac54e4030d6ca80ae2657c468b523f33064c52ca6098cc19670f13b989410cb71280895d0adc0219586b06402a3a7aa0e12651eaef40fa41c5dc5abc629ade4d198603f2e5a31a074431e7022091e17bd48078757c0be8832e93b7c1c4c14483eaed000c2b56219d937578b96ce017c95475b8c163ace206dbec1f2e0f72f9f0ec67c2c7ab4ee425566a9eb038fcb24b5f89e302dacf418a24f9aed5ce04023851f63b1869c8302fae6b4a0c4456e4131184053694907278f01349c5cf74aa462ee30e8630e26b7ea5372a71aa6b1e8410003ef74f30287b54222c3c39d314bbd5526bc832637f75a2cc621ffd2acda114e18fc93e67d8ad0f4dd82b6c04b7340017a287579796787f897b8acf7c6cbec3ed654eb18a908f2670235cdc1de64283a2108f9875bf9ccc2920ddb6d2e84b72a7dde3dfa7aeec880a72f87add0a2150d4b79c5bea4a604f66e5a09485ae4c15538bb90ef5b8b62f1783dad14a019d1336380ad518847d1d190689678146e18fa813b2ce7815986eecd4a43174d78c199643e03d100b840514c7e7871dd9a85472f79db46bb020802f2710c5fe49cb5d0b9d6e825b815f2ad410e97512ac055c1623c897554fce28f9f44fda3431cd8f02239138565df9838504c8d010ff76e73262ec91712db1cf7b7ad9cdb45c6ee955d025c664f2ef2afe1b260316e0b2383ec650987cd2274b7d26932030db8ba3b7cb4862a652a1c3ff9f2ce5217b28d2a0953c5e2197054eb64681b1d6544630ed35fb446fa38b309922a5eafb3b8416337dadce99d172da6a872c209916ea3e26a192da4a431b72fec730af74a93f3798b97e3e3522b0f061dcfa2de84982df921bcae89309b0e5cc92608852c302b7143a575693ff218ad1137f52e5b3a2fe884e7bc545344a32de2559eb36a7edf241e91252b3211d93a292ee75fa37bd68a70a31a93d3f0ad6d907177ac780369d54c5b9633b3a6a70d8a994d89cbfe33a751f4471f2160f1ac2dc363538a57d39128e67b376ea690722004b6d899074ce175d16cd0cd521d00365f2d19203fc1a6780238f9170add6429f655cef46845b905f52f7a970e0ff86c2285742f67ede81b2aa1c47fa4f36201c0ad076a67f5bdee27202a3f1d1a294d6b088b35c400efdbdc4fb07bec915333e7b1c30057fabb136277e3f4542a2b6111004e19d99b05739fd0e2317623a26d09ec99c90601f33dc3e2050d3e97fec466348e15aba991cdfeba6de513ad8e8fd11739d817fd41d0e254183e42b89f49a607b94e2106f3323995ad2675f0e7b5ea6a35b9359b1c4f476412eb3800817a756e66ef85725e60c5ce9be55a2abe61e815f615f710cb2d8c3589f9a50dbc304117459257979e0f2501ee9201b24b44077e6ab596c918fd0fc17bb3263adac4442a922631d4e4e440d4c1add2d7b2afca349c8dea930926faea7e433ddaa4b57f369552e943eceea7bf025ffcfe7da1c71a2fd563c42da747f7b981ce02a048afc39e272c7a70c18f25e2e4af398263e7eb2eb77f8a059bef52c96839b8a21e266671827ffabce8d46fd434f9943785118832b4d5162f45e0c8c5e5b28b27f492712601ae6b893c91ab4c3da255302d980405190f8b32d8d6f84cd55327a8b11afb52992ec3a440b7d478c169665f01f2352ac99244d9f0f37ee41754497352d79eb31acd1a5a331bec792d9b7d0c33b799a98d84092864c83b3a50b742cef6c2d9fb48787b90f983b82997318df4a75c2aa8fa385d492176e868c606187226a03ea1a0e92375983c4ea1f28e915c83ff233e93f6c840b12ff5934121199f43c00c1683a94188362dcb6f2930d94c6ddf5372f7ba0db3090743605dd6bdc0abebce77339a6543c55db41ad9887711a78bdf75581a3b0c78b1a8e88040f2065a338c279a6170ca37be1bd7e60d1cd7ed56fb75d9d80da8b633bad60dc33d1e5fe22157b00fc6d678527d9ea6a52bbaf774fb39de5af78e68342ed2a4ad26aa6f670522ed106ffb24f0eadc8852d74e62c83747b675f8ad2991943762b1467c7bcb209b91dc3cb6ffbecf8822bd1112d554cc1d62fb44975fca4b61dcc63e728241d65745f3f3d4e92f051e4f9a9f3592584f28fa85ed0c4208323c866d2de204d91940d89f881d17e26f0615ff2f4c2aa49a683153e8b3aa83cab59736c6127dbd17d61f3fb03bd15fa336cc861cd81002de45a55d95763b049b6a7e04d8ec44ba9351fe94254908a167cbca69b8bf20797320281608d1575f6693386170f2f755bd1622da61c1687fcbb14a0a631880c34c68c78ba3c8c21ac61b02c0327dda2970e288842b26f878a2e22812104a7584b4b4aa775874196d7438bf5dd662d377fc0b0d13e06e4a5a93a2dcf3b30407f9cb630a19d2ec7ac142ae5189d96e0ae72bfcbd0f0f76c4652a9ab8369934c23b3be15b2df3388e0a4ae51acb1c4d46b087ffd212fa1e83f8acbcadcc4594c4d128fab3d9a01ca0ef4ffdfc3da3aba7919f9942fd81adea2faa4d4695f185cc415690b163c7a29b92025f61011332197aa874aa85e69ad3d91d043721acdf51f1bf5bfb33ac502e86b273332409a6fb2d7ad7cadc830fafc3320a440cb44c6cd8a57d283f30a1f54e88c678f7757daa5927e83cd18ad1ee379548e6b36a4401a900ef1875e28532be11dcacc511ba467a70b97be54d88565dc0828726f6ae4188bd5907465ca604194e682662f8c06737d9cdbde0ffffc0f690b5ba3e1b4a2ea00f1756db3c601b46951f32fdfa617f654df2d45e51ae2389c827e8245d5e240cf491ad33cbe829f5c93dbdbb1dd3cf92e76e87793239f04966e2eeedfd02afe58b7bf8c9e853a23c1121e5c26bb5ece3be579123c25312fdcc80d67ce3fdc2d81e0c33beba62ada5d2341c095b9a51d7e74c099363152c765d1debbafeabb311f3aa54583f356af03a41b48cd502a713f47196666fe4b1fd0b9c8eac2ce15fa81a66b51b1349d93db650f98cbbcb46c43b09b6c6a14a2dceaca072fc648edddee486a79020f724a830a286ed014a88ac86652f1110d051334783a91b324313c072292245af8cd8e74e693558c6d80d43b5490f4d2acc68ca9848ba56a50bcf800f674ae1c7f57af91d2b67808072c296146d94dbfe030dc4162fa26b487cb2db44347f943e34f39b784881cce07898f618abbd418000ed540e7d61d8c7d444f5155a384c6392435b8a169f68ec1dfc6e75678622d035b53e50018fcb93776c3d56e818a7890a82ccecdf5ce096a91bc24e0f351ee92a9800cece20ed333f2f0bd614fa4710e0b4665cdad8dc62a049c32ff6cd5ccaa123ec83ef887b1f9fdd214edfe5c899f2eaea7339ca0c12239c49114fff645c049d60b18ac00bb90f454ff3d44bc7e095989b67a6a7b715d8e6ad04db98ff31fb0dfff183be33f7d9d14299d47ef834b2cc2eb4c0cf6b8e7ca56cda4f4a13262248928139682c4b8b0d1b831d44f77a02b7a8405941a8a5c0a1fe133953285e09f4cb36429f3dac3fa95dfc841cf4602443c07785a34389c8b9e47d1ee43a83680a5a68c064e7e5c0d59caba6b53900305e748a89d2543c6f1adb028bb6557c3a8b3442151a7446e21b9b7a86c908a782a654573893785576519ff6ea291096a02e4ae1250f680d0257df8584924473becf595808d25afca23ce4b63fb2b5867d6008362bc36dd446a2b00f17c2144ca8e445e054f3082039b88443044279a14cd25a51644ed1e740248ad0511288c9d3976a82c06966911ca58668ca3a768133f0aa625771ee713817eae12dc6d1c15d2cf560bc1699b18207c16dd24b2b5c1dc23a6ebd0e412d2392e5f42d2069f4c83d10de943b876aea285244665ced85b64b3d1b0b58a141bf5d290ff3f4469394d7e72e7a28d06e2854cdbee4d7506ad5fa9b71211473ba9114c09ee56a97e09e637311da9c8c0fe485c548485bd614d3df3514169f8cc623fb41964ee4d5c6c6615d84b5098d526868685fbcb9da2f5747a41916cfff14a706437422af2ea6ec35bcd224d1b74fefae7d25952cf50895cca8f0d7b5b4ff937b4f28475674f650d9209c079401dd888be6e7ff0f9b47362944f70d91fc89b5678c24df68f089d755c79e6736251c4b6ee60962e2a4a1e74929dbbfead2c05bfc8116250c68570c09ff9ac1e61fcd1cfbdf3e933d0ef42e4c7364a013ea95ad4fb5f3de5befcf3e26a24c8fd9cd00974e09f10bcb19d30328f954f5a61f1ea5e01b7be753e6c385e3640fb8e599d1e52f7eb8c4e7ac99c6ec68ca10b217b892ebecc6ca9b84be0e12887be771bd1c9991905342187a35ae5994d99c0e564ce73277a5de742cf76ee8d14b7ce47ee3acf17bd26cab5b83c00810a1360184df40c20b2d8e26cd6a1071912eaa6dc783cfa7e52b1390759a229184053ba3cb81cbb485036163c3c518fc543bed7c14d6d39a899480dd694d724f00c81e8d235c46c516007a569e7a214572891c65d8c4f3a1ba3b55e5a155830f8b8f4ae63b3da156152ed1633735063271448015788576ac09ccc95eee174c4c7ebc16cc873ec11974af95324dff8968c8ae612f8b6b7b615f17039b60cb99d4061b8a3b808e4cb1e48b2b78dd447e000bdde652b81826c17bd3500b9021cb5754b42a90a53fd5d54e3e652535e57858eeb7a09c9ba4d2129619f7c5d24bd28a711cdd625be65affd9933aa8ffcd797f81bd8830a88610dc9da7f9b471c7e0b5e87614fd897cc95a0793d2ed3e5685b0d22a6749af93930c91ef911540ac430b9460a7030b9b4d54a19bd3897f1b5f94526861acbd5a8c53d6780a5e92842ba55a3464b12f08cbf80deb30101d522afe26177d58315ac4192e24b15454c6e9110e10ffa20fcffdb3a68de8a0a9e93132ce5a2e86281046d7d1703d303437dd50844fb15ac3ae05d8f5f385a909f23d51bd9a8347e05fe76c64839a61c3c827d3df3022e9c3f434adf606a3922554ffae5363a59e6ac6f73d38e514db91f73197dfe854ffe92894563f139b0b3ebd9caae0613518c1c46a75bbb636af4fa97480c7918b7ce2c96954a155a30abdb7f1f5fc306deaeb6452fc2181488b25286a4dd1697c207332c663898c1eac0665d0a7c13db56c76503efe32de7ec751daaa510b14665c6c9f757bfa701744841b6a0145db9b201bcf2c5f1cadb5f0e2a9e3b4b9529cc08072da44f653940ed423ab5dd6d231d6e576ebb83d3322465400fa1195b7096116b5e3c0c34a91b5063e51a7fe4e2006a37ea0885996150f474c80538e4708be0aa66fd012f1d0409bd482e4858941e4bf7a125382b69184314b7c09bcc2c735305c9415a4fec92874141831aab32b6c4525537329332bcf14415f20cde00fd30ddac8d09306021d371068341a6bd870ceb173137e54675edffeb07ad411c47a740610e991f23f6a340d4cc1591f36cd50286d8ae3de121f2a7aeb5ef0a16c625c692879df8ad7a922153129cdfd0b71e0360e99351342cc0da0dec29ec002069bb40ea2e02d58ac758f7722777543175451b4b05398c36e81466e58b67229c0946eb7a2bd90aa078d331d96cff793958afac9bc3fbe9462aea80856a99d68dcfc320c7f475f148e6435997df5802aa81b03ccccc19073e4aaf24c509a08736e5c462652931fda62387fa4952218a721661f69cf199cf4c221233c5f1a828fc7f7dec0cd698c23a48964a572133115533388cf60256216b6b0ec489885d10819c3a468331acfecffc777083ca894b680ecdc611af6cb1a6e56a32cc5539735650c85247b39bcc27d87a11aebfc7a55405715c33c5b7beb5d68891d74a1726def8303d579fb22a91aaa7cd2bff8a7dd29960c70df676a99e858dc7ad9bc14b047714788eb7817a74eb4fdf1c14e15d0738e725ce9ac610fa8ef24ac1140642f72d8e34a5a8f5d62aef0f54663d4e1c7ffcc4b8241aabf3c4b6c13b46032a9ca701b8c10b801d6b50b4eccfdec687d5a071c68b61e6e47b39d7dd1f0d3e7cb2636c5d97cc8fcd4c1de283a21f08854ab8d29e6ef051e236aa5395141cc8c64055308dbb10555c59c8f01f15a65128928133d3c6752823bf3fdfeaa50e1127a9c6a82554fcfcce8d624abdbf69cdb4ac28e44d392e004ac73149b57873d9a0d544cc7b950a0535f09899dd9f05b20201a3d4c9e1bb0cd3b5513e97de9ed3aa246dee8de733e1a87ae418ab77722d0e4024e9680c917fe1866c82cc617f7ef906a1e8888526c6575e5e8f163d0c90790ac5141dfc5de93c2682b4c40aeb2b4d44ecb30db79ab466b5cb975ceed18f7a6f72f7001e7ae8aa5f9aeee9b5069d33b75b023a9c0021a4b7fcb3a4759b5ae4a35154e8141ca9f444151e4144fbfde49a0d5404ef39757060f7ad1cf9c3682e02c788db6da37e4dcb966089840c7dea6f54a9a9fd00c05c876308575a974ee85def013227ffd845ad9e3ac956e41da843c1baa47e3de7d80cfeb2e6c4079014768ad1ade695d6f1e9281e7e37d944f46804a871e543aa3075b0a7078b33dffb16eb427205637f8e7638e68b9fa770d0291ce8e3d85eb00f14c337556618df00411ffa3d304dd190d0a193cd7d3741cb4b6c04ec6b414700684fd3419fdcab775fcd21c78c43ba8389047e39ab433de5d506b84fd1019d09d2650a8947dd0955a00df9492af2ef34446d7b79b02472ae43834a119b39613a611cd44df1215a034258025b70c2ee550774dcc40aaef1339f770b71c09ac7934c3431a480714c852607c9301e3695853c3ee6bf70e476e766b83fcd53b4bbacb8862eb23935df8569176413c20bf8413bc167abb6679f9eb99c37c56dacb5854be900d9426a71ae5b9c8da538e2173347b521b64dc1f858e9001029ee4589adaef972842f9d8329ee672184b5f05a35590c237c4c2dc289d26a8c9ae05f3e8e3898e9fa98a7613313aa61b7f1234e4aff69bca49d3dfc8a74afe3af98c123f9314f36c0bebe5a2fd0b93c519bb795fcbe015e725f7c4de7674bf9775dab885515c889c642698cb847664ee2079b75081f71cb124fe956d32ecc4f5c5b04f6087396baf5f1d288e34580551ef393269df61ccbfcae8335511936ad45df4e1641cf9e78f03bd87a4b7a1c90893ecfd6b436000e2528381857e105c864836b2c6f42e2288dcbff0afca580a7eca40d52d664424c93f315f56fa077b6206196a67f507dfd6802f4f7ce1b2db5bc3acd5f49ef76e6b27e3e70f4270ee452d8b2c007ddd4452ea7bd77683e24557c9a8e32b5c97f2a26bcd3b08bab82092dc1e5739eb45201272d1de54150c06916c0a2dacbd79711a345a03490334a67aa3261808d80dc8cfc1a7558c65d2924a1bd89222df26fd81bcf55c4ae37aaab76ca7335bfc5cc9c713cfedf0c25a2077727a0c7149ee2422d13cd378d6f87515ee7ead6ebc5c9d2531e8fb176ae9696f03d442aaf3049d8be85e58c8e0b950eefe076e07d5ef4e4dc30377dcfb0afa8d9a024d0f6b76ea752c3470734f5d73544c066e6bc439d1212bfd82844c8b612ff65790996921af6e42dc2f2db96b5bc8d8aa4643718ec9e2f39c47b228ce4ec6de9980fe07c1937c58997911b963c383789ca2586a43e13f72a27df5df860a5f2e9e627dc1905fff0565fbdaf803ed693370f960306145caf1950f44fdbcd7615e8455ad356f955aab291d82918ac76aff1ccb7b1f227fb1bb28a2d0d885aa1c5bfbb51519f91eb070472a767bb9921bf8d0af5ca8597be86ad71a5ce8bdee118a3bfbb6fd67f0fb581aa8836dce3e4cb51a299d876271aae35c9118d2dcb40e7c73d36b28d5bff6b524283bf088fde9f61edc67851a35b5942b35b0c3c27d416d8692f018dc0404bc02ca03a66d5c20ccc29a0e2595d1f653f04d3b44350367db1c5c4f9f5585f3fe6ef2498ef8e82ee26c33e9fdd450538e2f02f0f4193eeb028e9f14c3d5331fe7f40f96280b1b5914d9bd08fdf60da1ad346a224263c8903496ecb6b6bb4999a49401a506de06c906457c50b2b869d41528ad2372b869d495252fe457921c1dba43515790c626d902b1e4f8a520db6c1a75050530857c73e628cbc0b4a032b8c529c382009ff28b898b8895a450853c63d3282b445a2d64199b4655c962bf6cc8af4da3aa54ed33e77284e51a75f2b181509070892c4553539354935453932da2453a2dd05df4fb34c0ed8facd9b296dea416e9b03088bd7aabd50241b0e8e267bd32c01ae036266bacd7387eac8fc5626980c341e7a3d8eb15637c6f517e08435a8aae3fc33f597f8262ade4aba6e65f35af1db644f15b62e80a592cf003c9ba85fc5ebf62f5324eae0093c20a668240a10a5297269280b9a1490468a0942ce18412678c301571c2942f3df80044121992ac805c6618c18c1156fbc9f6ab88a13b8f0f63d3a82a466cdf34aa0a967d9617cc98a3e2b03d948e63259d621b2cf3d3952075ea018eb0ccf271c4f1d0db8d4da6eeee7ec73146e94c2666368e38b7188f233eedb9b551147fa494d21a2d7a31757777ab8765da03cb3a5cf93d36070e8acb9909436a832af56ddd1c93eb57bcb324bf7e94db6277c7d6ba10213521df77ea658aa2ad8375f7de3bbabbbbfbbdd7efbdf9de7befbd7eef75f77bafdf7bfddeeb7fefbdf75ebfee94524a298d65ffebeeeeeeb3f1de7befbd6ecb2dff7baf6b7defa596b455db1a3b65356dbc88429768e4857c4304820256183539838f5dc7dd599e4b7777ac43fc1afa88b6dcf9516e1fb7e5cf0f900ee866c3c1d13a5dae40e4c1c37b986072fddba35a60c1cb032137978036cc1b37469cc520070e9c8e908f8e1d402f220af4e341e205731daa40b7bb20006e0f1e1658005a1d2315631c84524a29bdef57fbb83fc4ab3578116520d2201e005ad33182b1bbbbbbbb186e206ac081783910f3eda0030f3cf001dc7b07f022a2d40750410d3ae729634ebd147031bef7de7baf7fae0a230650938c9701e8bd94524a298d29c0160ddd7befbd7784a2b2a1a82c599ac85326570538feef5b0f6a1a765cd9321a873eddfa4f836e94873e274bf0adb481cf081cfa3ea4e10d4c8871446a5fe7885687468d1d51c748e8128d00bd608a4050727d1b228c9a9cbf86f1be36bc200b762343c679fadf8b73d07b778813c99d25395e3fac8e111f9f1d3b7e6c40224f990c8413144473620515ec3c6054afbed4ab1d0f91a70c8f9707d4cd2563b9639a9647b4a08707470ef1025c0e1d3ee28e1711dde1f303d4548344a15c904ea462dd15a849ac3bf156c083878e111f6225c218ffa094def3de7b2bd6a7bbf60d8021eb43747dd62a9e32b9befd2166f0220222de1f348848758ce48aefc5178701c019bc10e0a10622d5407ce78003010880861d002d093b7811d132a8beef577a3bd84e5f17057403b62094dbdf5ca2dcf4ebbdeeee4e7b22d7b7f8c272c52c7fbb1dd710022539dddd5da708c5617b28751e7a03db6099dfe9eeeee2dd71b5748a00cd906bb844a01f401ae14929a554cc716745a13af73feaf81685fc1147f19ff74ee03ad640377c16694f9ceeee4ea3bab71b1b1b8c3eadb9c34e4a29a53266e06d4a18bba33ba533d90cda4c0650925c7f8a8037404ce5eb46dc89738bf138393fedb930482d823c3ae403315d77f729e575779d22f9747777576b4774f016c529a5948a7eff74f74b593744faa2d4f442a7367d1b2f22faa3bbbb639db3866f883a45c67bf508ba7defe5116954b9563a9a52b9dea65c7f1c3d36078e1ae244faa2e41964d39f22b9be8fa0fb5b945cff04494b71b90222703f382238582e41c6ce62ed50690fa6b8fa83c32470c29565994229824d60bd3fe65bae0054d21e4b79802829ab4c9203070e67bd873a7112969d675f0b1bb1e3dcec51753b3ae0ca8d6d6cfa22c5fde050c0813628c7bef75e7185e2d702b9eca0c3121dffcb128793b202c13c9639679a8676c1819c9db25376ca4ed929672aeed7025d3084d8ef877d74a9c2f4c293274f2a4581a98a0822581fb8c3154d9e3c79e2050c474da2c0185716aba2c0d4e45a41b94da2a894d6263aacc0c4c484593ab7f60808a5a2c054054581a9ca158a5f0b7c123ee1e27a724f30910802ccda01bbbe7badd5d4621e611a6166319f9e9831b198575020e68b152ba6158c9f9855cc224c22cc214c27938a298439c59462463153bd3a0b6610ee4c261066cf8462fe603eb162c54ad6a2e6b83447cd9123c7c7b26196d7833c05f9e7a1890f2d8ca0a949aa49aaa909dfcf077672027e38560742524e4d760a274e9c8c3364f8001564083bb94e2aaff270afeeede116a94d6a1310f4a0a5072e0f44530f45f870753a5d0f5a7af4e801d4430f2a4e4f424e9c38f12114a4850eb87430a4a9a9a9a9a9e962164baa093bb94e7e7e7ca8013560f0221fe2453e8480cc2df9d42ded1c6dd25ab9111a9b9bbd7d6b35d33ddd921e3aba560bf3be1008e845040689a655a8956aefd28e44ba146bda6f699e7515de47997c3a14d862b9941fed0cd572e1c0f122fa5aadf088bb20d3356df4433325ad1679621a761d6ba0788ef47d3f381ce6d19e235bd62481b9dc8b28fcdc0bc8d58948cc0cd92746b26b0cbbf2a034c78961d8356cf194f888f68448bc5da9985c835aa9f6ae96befda87542f26b5f6defc49db925f3e0f12212c39097e917d291098f5ae9463a9235fd28887c3ad4d116bff07360cfc51ab5d2ecabfe5c317811b558425669f66105a26b17cb075346b2a6fd50a8b6864473cb8f38a3cd68a2cdd9c8214c2e008044b1a57da69dca4d976da664231dcacdd9d3d78f1c1b247d8ae84b3ef1d2cc3c93ebbf80b8b6f894e2a55d9fa6417dd3330a800b88760844f4f102e2474062a85bfb073c42baf192b6ebb087f8b534a8956ea40b8732dbae956a8059ba5eb083932026a6b2aae4c22c328d4a2bca2b4a2c4a346516a516e516e5557982b28af24c69554a514e519a29a928ab4aabd28bf28b6dbfe4a2b42aafca2a29403df3a887e308a8c7a9acc240072540494939bd9c2c395039533943e4109153444e951c2b395772b0e43ce54cc91122874a8e530e103941e444c99192d3cb71ca412287cbb69f9325c729e729a7b7e46729876aa9a4fa298f727a424b483f474737a31b0db7a4dbd20d861b086e31dc906e32dc66b81db9f16e466e2edc5eb81ddd58b811b9b5702b7233ba1ddd6ab825d9f66f34dc8e6ebc9b11921dbc1b132f8769074975db4a2eed52e158d37ea56f919b7608933ac496b79a43d9d2d648b77afd686d91ac45ad07d314d11d6bca73b4d72db96983743d5bda205d145ada9f3d5338d39e849af669da8f50d3be2e0a0df218a8ae678392d8500312118480ee62bc0d8feeee11dd92e7bce7a69d81eeb00c7407032906ba7310d05d0d0c74378abda5ad64f6a7e770c1ecf1d428c5b656db8e57bd3b36313a313e3142319a602c33463156f912b4c73e0c3d32417bc8506d3b8a1993a03df66bf4a804ed19437ba69466d4fe26d7fe866f137e8c9054aa9123d56c3cc17866db1fa5f8687aa49a8d551f394ed11ed676c98ace5bd1b67fd394eaf0b131e1a3a96d3fec40741d0240741dd640f04502b0746be37801b99db7b7eb1f40741d7e30d32e502bcdc80c820bc4d19300d1758803474f4f0fa9020f696501a2ebd003d135a89568b4b7e9fb914ab697d96cdac350274349683d0942c0fdbd9051c9681c22810421790b1937f842c08d5fcf44c8b8c7773274176382ee642c417733e80ef6f65d09babb4982eeb218ba8b4177366fdfc3d01d18babb3b29ba7bedc6b7ef5174d785ee3eba0bdf3ead16183d14b53fbdcc05b5b71fde5ada68832017d5c68a6d3fc615db7ec662dbbf41b3edc3b2d8f66768b1edcbd862db8f5dd997064f407baad0e019d06a5b500ada330568468354d09ed80cad64841bbabd0cad64a41bba3dece6f636e0c7d025e40d7ed6258c1b24956ee409825c5020db7a216bd3604d5f6ddb22c12acdda30b4017a3c681dd19eb3e608f7b014a78d9f76fd9ed78fdbcb89699f60d5b61f368005073c40fc5c1a044908cc34585454f4c310a89566dfd24a463f342bda2c77a824ac64dbaf2f5d694f7d9658a3068d9c34eae8e4b85aaed611496aadff5f447ea425e3bc88bc477becfba0924f87722a1bc462d9a03136e81c0133d9f71ec8c2294000328805990144c68f20a09f1d3e3a703944a841378bca741920b325294d519aa41b124f54d5ea882a5d48e98277a46a140a32f26c218cb198256731a7cb3f151312641eb2682da656f249b9dc4b412bf239e65045fd61b6dc219fb0ed42b0ff8fb592eeeca6b2652a0fbaaba6e49372f970f4deff40d6b79cae28159553d51385bad75afdb5d26cec1b5b5208e6c0175f7c01b52f6e5f7202f5cffce0c09c4121d9dd3f4bfe6a784bb07b0255b73e6c7dfdb0a56b558f4dc036cce6a853ad055af7211c7fcc4d6a0f95565a290f3bb074f8964011cc256d612de466d5e94025e28fb0b1f6e5f8d926e52431429b1a6e409a6988c966989150aea5c5f0254e4771602e4710dc60c039fa1aec05cd33d672d7ead86cc92a8e446a38486b55a5f4f30f36c6d719e928d63cba2e851e14709c503322eca1468a9824966f684ea8c53ac37de63119a6f3035e6518685c61a4f8b29071f554c96098d60c39d4e2b2a2926b368dcad2c4254b0e1b49961ac25e96a3565196139eaab8d1e122c39200a764714bab4a11bd0c6bf205a1e4637ae2bd707832f28221b7368d7a1a72850d0d6cc2e244cb4bbe9b4661610287ecda340a8b941088c50857cc4710a120b674010b9570880c63d3282c4c1f89058717ac5506cb1151090b91af2ae74da3aea0a0e594639b465d79428afc02f3dae24a4ebe98a0280453a469921255c4830b50bda3275ba1dcb4b0a76f2b8f9bc7b4973d7dfaf4713f3acfcd40d753f08618b35ccb985193c95cdb367959608deb1c1fda70cf92cf920e31dbbe8ea99e25d738760b5f1bd8958c19e58e6dc9b2d98c5663b7b4d2edaf45b24368ffaf026e08e76fcf6a1d1db140d6e3dc9cf468a26b1afb6a2b654b3b4555657595c68b8c8ad8b2beb55e688ff36ccd667b11e1c701715a5a49f6572b8532ec001f26aa1c535013db7e1015dd5d1fa6518756a3064dbf78e37e2179f116b0534d7d43e70504070e1ce696ecda66cfb46592e254a5e784071d5a4b682ffb9aed63d52e4d66c325ce758c6a4387cdf55ce7d9ac976bd9a06aadb5a0784d2bd730764b2bd99ea6ddbc564aefe29c95b2224bece97911b1dee5c4c33b2c0cdf7b04e6ba46a62dcf7e4d0fb1aea759240b64adb5d6b2c09909d398852f0ce66a2149c23b76bc88f0ef7801b9326d7b6e912ccf22b1ae5fdb5a6b2dbe43987cb5d6db121fb18c7e6ada16b9b9ed105b51a5511d351990eb70b77050500f64b1a86bbc69ba1afd904cc67a0b7e357208135785e5cf95078f1711beb77569ba52b9b92b142ca5da5f0dda1ef502d1dc22b6eee38b010622f66d1b4365ab2c15b6b42cd25a9aac2684b12c09831e1b83d0356b74b3f69bd21d2e17746bae7b76184474cd73a369cd71dadff5c686e94a7b5cdb70a26362dab92a59288f4a5e79428942994239a4fc40a942b94269b4e3c54e0a76be288b76b8d841c14e173b6976aecaa2d248f9c2b65fb2501695463b575272bd32a9d79394e381dad140746d6e25b924f28914435291556417328af4424a915f48306418728a4482dc427221a1c82ca411e411a416f28984229720c96cfba418128a9c229f96042d91564b3b56413b49e4062252d03eb2f16c3ad8986c3ddb0db611d870b029b191c096834dc9b664abc166832d892dc946832d043611d890d878b6241b135b936ddfa6832dc9b664e32101e2d99c78a41390b6b27120baded9346d6dd60a8dbd72b3c88700e18feef0cb3ed773d306e59e6c69837247e49cac6ada26c91d41836ceec906d9235b26b136d480440421a081ee78747724d7f3dc0c74f79201290610c040770e739beb6d25395c20036355312eb67d5b64646356c4aed8f66b62586cfb30626862596cfb39a6456c8b6d7f8c9d205645ec0c18b382e99814b129626662548cb16c13038618ea12c098952ce645ec8b6d3fc6852b66558b5db9c858d5f7c31a8f8e7e6a4e3101e4ec96569abd4ddb29b779b2b936533b6a325bda50c96254364fdb3eb9b1be353d00d1b5de34fdeaf96be9c5e4a6928db450523637822dedff88f072a255364eaeffd2f2c6bab57dae8f8f0e1d3a7008103f105dcf364de65ab67d7c742840f4f1d15175e048a710440688ae6fb6bbb661a8254349c0b0d6957167c46ede92a13b1b26e82e2f417731ac1274579304dd8562e84ea4bb30740786ee647ca1bb19d60bdddd44d15d170b85ec4f5be602d9db0f8beef7fac42ffc6a3e185f8c2f7f369fecfb3e2eeacb8aef8afd61b1edd7c0f8b2f8b4f8b6d8f66d62fa9ba13f19fabbdf07d3df77a33f9baf6adb8f9161d490affba22ee17e56b2cf8bef8b6dffe302ff6725bbfaaa688f65ed4f1b40070b7c813ac4cf75cb01a26b7063edfadbd834cb56fe76766ab058b2231a3474747472f0b5d61ef5b685b2d8e2fb08c0e16083313643062c830a7439097c2c9c73ddcc8126c42c057e0843734b86e12210b18530b44edc98725997752febb22ecd3c4a32cc66734ba624b6165b8cb1920ccb37a6646bad2579441e1b5ac8cc8343167946c033021d1ce8a4b6ad56d0a0da8596f69df67a7ab4cf3a35840909f731207b12f09ba1a5cd8006d9aa5938d66e62ce06e3e907a1bb9aa71fb26a584fb028e01b7edf8b68fc0f6cb53e19c0195a485c620de44b0cf1d71abf9a1ec224ac4f38784f3b783e59b67d9f27ba0371c890e1d2b54a759a111b65339a686ec9b71b08b67030a89586d01ee76d38a47e157043ff385fd3b44a7a40fb5acd8f8e3ef05d1dd0004de323aaa3fea7b10cbbfee323bb3e8ea614e8c430f0926c1af776fd168843029bbe45f445227dcaad48a88f49128480dbbbd01cf6858cdbbd98b948b67d7b69a0a57dd2a1680f917c82e24cdf38ddf4dcb4b71b79f324e40237505623d44d4fbf88c09b1b66ba26c9cd1959c373d3922e659980354b6e0e613292238850c374c394b46b78ad9bf88d3ab31648e6b8b45238d343984480a5693f5cbb3a6047922e89eab067aecbb69f83a23bd6df1d49b2b2c6b261434774edd20b00e1466df5903968f8f8bc88c0f761ed10cd2dd935a8956c7fd3ee64cd275b5a5b4dbb140b443a939b95f45ecf090f3a80ad25363784c9f82afc50ed6fb69f2d8d7a832036bca429d58197983f013648ac4e3fe7693f7b99971dda62c83875d7781c2da306496d49e3697cdd341e47c39ed220a92d711e87f434b6acb606e785ac4fd11dced32031d6624b1d32873c47923c73d6e409822f234f8bffe290b84aad2a4f55d9d4cb165cfe469ea08d3c738d4c9af1533eb5471a392365e439425153f696ca6432f28cfdf733f45931ae52e5bcfbf453c7a7a648a836fabca77862abd3a19c7ec41e097364db77b5c833eb4b879ca8ea920daadb52a8208c3eb06d354265a03514399114e5c4d3d6e974b93a649d86bd5969c2eaca8b22eeefc5bd57b4a52d93e99f205879d8a20dde0bda2fba6e7777a7b4a7fb74328f3981c2a66418ec4bcebd192c1f2c58814623f641e4e98b2a2269bc3e8cac58608c3ee7e12e5ed6871454f78c58abaa720bf7058a70db7f1d914a59936e1f538cb126dd279809d0c457308f78d3282aaa7dbe0d9f868909be28b9b66914932c5998fc4000aa199b46f97025aa8a98b36e70879596c179c9b35ad9951c41dcb55a60dcf4c4ef1f5a8b31b6d65f9fe2873f12a41510378b1c01ebb3b5adadfe22a27f4f9b02d5676bd38fdaca0ac25a6bad859133733324536bed69c2b65880537099828b574b83702b0317db0adb5604eb3b79032653bff7085c5ddaf4ccaed9f50e29c1ab7a31030bd0a8562d4620f1da27cffe96a0b2bf2dfbfb9830b23f26c4ec8f0c0efb2363b5bf67bd883e5c5d028136f662e31b1b33b5fd2d18c43292646f5dda267c95b50308e65b86f6e852eb18285b6ff709934fd167a7ce3e79b6fff4d84e71ec936a99a2b21dccf607c5c8b0fdf328a6c9f6ffa2ed5f26e165fbe3946c8f5202cdf617f21fc3c2f607a160307777a92ddb8b7c515191910dd21166ca0528db3e2bdf5e182856c03a6162d8f62fe894cb762834dbdddd6b0e30444f9c200826a515980041a5b66881ca162db270210d8d92cae215f2cc90b03ee8d8f62b088385406408a4293134b1e2c4d0993170a6c9134c54f594a862c80d00828f6097ed61b6a460fbfbb041785795307f2761302a72149817b6ad41fa22e534c6e51fdaa20deed0668c793c9bc329c2494b701527eea4659f58c9765754d53e315394947d6229d9f1d3f6a727d682a1b63fbeb5d64a77d4a441b88947a118a2bfa3fdca4dfc98879f8e7f8ee3f81709e6f16c3ce4fb670dff45ba486a5664fc183f4ef29c8dc7e2abdcf9f079f48d2bf203afd1d15f9ee7ee10fe9b44774b476cfc77890dbad9f8fdca73260ce12119793344c62f646d91e7300fc48f95d820188ff1e71ce513e46dfc30342edaf57de7abadf167753aeb53853aeb148d5aabce6ab5ebeceb57249bb331ceaa44e7cfbac45e512a72fea468c83f699a3aa41681f13837efbd8fb4f2cdaf2efb1ae4097e8c3c33798e2f833c9f0679967e43f26ede863c75b767af3c87796efadb7c0cf2043379661df21cbd863cc18f3cf398439e4f9267a9c913f7e4a9dbd7c6fbdf2bcfd92041c721cff146da781b798e37be469ef969e4144f06af0df26afbcffcaaf67a48fbfe7d197982f747f2ccf763e439ce20cfbf2f833c4b7b1f46def815927ddfc6639075c9686aea260ccc93da53eef76bc85377ff459e38913ccb10f3fc4291f78979207982fbc4bc8f3c47c7e4d4f6dfd1f5ca896a11062a102a1d0b43ca60dc6a8b17475c98c880c9f4082f2e7cd9820c912da64c70a18b23de0e4b08b18293a26f9f3f9b3a15f5b8fbd4b5f649ab88d9279da249ec935e558922440e4b332c5d1182a1b3dc1697026f87262172a862cad0edea8a225440d385c81043495270b8228a2b8848c1c210fd61bfd0944da3ba5cd99608158c3c29f1028ba71686ac2dcaa3055de472d3a82e2e6c9b4da3a0d2740933c5208a2b48495a1481848c94093740813aa2c4872f1f88429fee3053fa20a54f8592b4e0192575318194a79b443e6157576400d5990568a162da229f79a9f228088217ab2b224081398426203ce50f821061ea832d1aa8a2e00725007351085944892208ce4a13203c652a30572b14fc008a24a97c8eb508cc0c481a826794048584962a056a09344a2280390421dcdddddd9dc0f492c0ecc4802a2a33590b8c821f1c7d2982e6e8090d545161c9e7081bc7711cc791cac9897ce63114fc805a31e5731c815a85d08306a82a13957c8e4b90c01c269f2314600e014a94229fb5916a8f222c04a8a80dc6f1bf2c71389d0e6aeae8493eb3d115054198229f9982451f5c25f2097bba2238259f63edd9a31865f209b3452cec5e91014ef6635ce533f7f81234d53e9081c8e76814544308a98e1925689c368d821ab3794a512c4b9b9b81eb11c400e398cbe5ccd43e7f6aa8ac8ed82775b2aab24faa85424d51059d1f05c5c2f6b2ada530a67c8a56b73a13114dd870c346a46065c492266cb8264861a14c9a7ca8f44bdaec8112a2a111008000b3160000180c0c8885425112a4591e6af10114800e598e405e56361909c4a11808421004510c433180210020628c21ca30e6585901ff1585c3fd794ea0e2ae41f39726a1b74f80b023de7432b3ae74fe06001b0a78adb50782b533ecc500a19b6608bd5343980f58284ba5dcf130398568e3d6f3459e93d9f6440cb6d86a7ccadd8533583d5760be62b113219110a0e5b3f9d107eb6aa8f635f3eb0e8a2d72e7563fad2e847c506fae5875a1a940e0dac65888bf0b17b5a64db5963116cc4a992a791152222a9a65d67f45aee243dfea75e0bacdc725243af74c1f1e3b5b125dca3dbfd0839a6a98db238f851129ac4a599a8bc86f2ce5f4d6439c9e631421d3163dac7c09987a454168d183f0e4149154f3b42025a5da3988251bf51ba4f7b232b9349e24f1ae7fbf3d2578203a45cd2111f6d25afb73c1d2d3ad7f2601a1c15566fbae032311b8fdf69df4df9e36519e2d6272cbc781389948275b3c75e4e440b6c805e5e1e08092975668279954c60c68f34797c7d5fef5ae52a2a0568c86c9b559874898b7516c1807c904ec93520347fd541c5493c5753c1171a5d07cc50e9104582a1455fed77139c2f091000675f413e1b59d244f21e276e3d6a3103c99885ce49a43e7f5f0dc577226340171459c7689116a52fdf564cf31dd8c97c971aeb6794a91ea4f14e621eb70d082b438d6397db8aaf5f4830cd4f390bc9604ca500f8b120838e4f6e9d2ac6b7e31e3aba6ff82554df31cc3c94e27c605c7e2ab44049eeb75d11dae9d7fe75e0c2923b966381bce52ae4c7290bdb0e69c2e9c6d8346455df20807d33420f7f708e85a576c3f079f9c0fe043491d8ba58d3c254c19bbad88875d5cc816fc6ab75358af697f0e54d5f8aae64fb47bcab03c19cbcee42a1fd5be9466fc0939434d2a38d8e05c2d3d6fe2b1edf04c90791068053942fb165d895479ce2e93aed28f055b0bb62bd2be534c9a0dd9fe05adcaababcbdb5d3785d827984a30499a6fdc320d88458ab338a94413687a60ae412b1fa7186d6a27094188801ebd681beecd9ce2ae757c5bfa4057e6110bf2a465896ad5aa4b68af791e614bee6a2db63e8f9decd0ade9ff8eddf866890d4ec971189332d63b9c169aa08c7d093b3cfeb806871b1996a9a80c5717f0d8bf2d192f6703516944115b3cc4a54f0e9e9650c9fd40317197cf2fb6cc243d1739d0849bf58530234115df2cfb3f6c81a3a68ec63d0d81e80ad21f2bdebfd9cf3494e680d658aeaea8f7e8531423be416b79db2c41233bf780d6522c64ad0c624001b282fa607c1ac2d511096930080dc89368e40c351b979b258ed69a3827fe8aa17d849eb0729b8360d64c5a5e2ee382a44db39d6e81bdcee05448fd41e79228e864030fa32f7b62dc9f8139d954ab350cccfefab3db94d593ef7e753f0ed65b076b3f8496f187836f02d04c7934e61c8dc464035898b6cdcc29029c3fd67d0e5b2de9a63cb1be72ce3fb60a1904f4873e16e544e78f95c0f8e32de3cd879dedf6bce9211330ff350914be8604a08d346518c758052a90364ef58f0656153bd7be07aaab13a21b51e048b8ae1444c68379463505be7c806a2c53478770b51ce804ee04f40aa7acbf8842da624b585d981b814a80ee8cf66288b012249b4db6d327012aeb26b079accfedbb5656ec99785793c0e96be62bfb8ea4c60c5ebac80ce87a85fac2ae892719dcc8a334766b1d3893321ef99a20cb1355ad8b6bf9c15014bf5a5dd5f3cd1e8923efb845aa4d369463c94a90f5018f605e9280e382988f32686e8d04e485f5989fff5e278bd8cd0c99be138ef95b2c33aced1db49ea2160c254fe150b3ad89515c4e865f5236ba8138b01fc9a68ac912df6ed2e2db619e8c5849d1ab5312649799246dca71a8768f43c4f73799ad841d7639599d39b3461ad0086a34aca6f1b5cb1b6b2582154c11396a44b4210dd97f4be38f37cf0be02fb351941a91d83383cd74ee2328a44fc06876315c305b8e24400fba154b248192a037e11001b2f49bfd534c398d695a85583e3aa3f520d31f3d85bad56cfcf5d8bd5d4f812f6a55c3f3be1dc543cb945a33ec26d51eab31186d9014edcf14f8ae3a06cd5c49e1f1fe74e7e0ec729cf814de233478b953508d4c3947e578f59e6c96f64fcbc62f17eb84be060d16ebe7201b8fd3ca89046914c3f7ed47d52cfacf1f12bfd08324fead7a5a407039acbc5666a20915b04027fcb70cde6d7a89dd548932e43ce47c61460c43c406a558920782e4bc79e510640cf64153070365732a3d36f6b7ad33149089ad6306f5d88e909f8df4d7f40efd50f6a3d4d55b9f92416549e0d2fe4bc8ca32527f2e83cae402be10993980481a24ccb3e0e60b2e19001707939d3b7f27a627f3e7890fc515067b637541fd53256c5f036b97bc5b8712fac53bf4dd420164b0d5d20cad262af5bf0f703f35d82d845f3765e036311119e28e334d60fb8a6a1537904da9415bc9ccfe3194f75a88e270e24025c788e1b4535a5688cf36f6f71acf18ea3f6eb08ccebf027d36ad5817c152c6ccf84a63fcb2e102942e50e2a202e9e9a73388f5831d497776da788b8920e6da07034ea0bb1e2d9887bcdb5f1dcbdba51cbfbe605bfbe005da7243a0266388da7ed104ed0c86465315b082ef30a5cf48b06661506384dd245c35ff6f1403f99c01f5e5f6c57c7480d5fe3bc71ddf915c9077268cb5a2d1fc56ea21692b6ede6e143574b3789093d6274c548549c7177fa5c7c4770d300b0b4f335354d6a942725a92f0a9830ef1dc876a8af0d1911a17ae1d0fd00860a7a7b56347ebc6728a011eab012a0f179068dee0697e87d40d992d591173fa93ab484e0761d813ba1a0c3f35d8bdd7ed970469dd91619f6f67506f8141f04153e8679f79f29c64b74133798f9e54d7a7a4af0b806bb56c101495c2d9e861cd34e96d21722ecfcdec2e9f146cab72a7f70209932201806221ff3f547462cb94e36f61715a4020333f54397707b104ceb145b1bc285818aad598c399a1836cb951fbd41e6428337a6f09ff659db66b9235d7b308187b14002d81f38b0b8d21b54162abfcd7c2e818391a844a46cd0601672b68f9ca467d685d335b73e5db60e28ebd968b9ac3df08d020aa15d16890ef5e44b2601dc0b9bafb40c3dd71d65f45ba9d642d3818485937c3c128223000548fbc63ed7aabe88f6b9e485a08e13ef8a713b26aedc3bc0ddefb99c48b7e2fe4f075673cb430331e8ac4703c9e3ed298397f53558b2b247ed79f78ac685d1899c218f130edda110f4d17408047b97cf93d828db063aae34e55e5c7adc143eb3227324369ec7a3c1e11f03a1e814c2d3d7e0e5a08e53c30d34af7408823766c0b03c5fa2c2feeec021dc9ba5b162fa309b6c602230f430fa350e15c868aab122d4eec36215af1c421b600b9d495f699904927ad0421320fe9fbef4ef959cd9a8a5dff6d3a7dd98b5ef5bd1a3d5e190b1a90c5b7e6cd56e66ce4c48311c0d6761ca3d4f8d90e1b0194eb23196f638ed4ae2add5c438671ed02501f653bbd434532b52383b82cba25e89f52cc11f8d318a3627e8a714e2778a6a80eca5c5452c73b45e6a258473efe8d5c75a7c8e8dd02684b45c2acf694bad748b47f9ba217941d67dd428a9b66aa2378d631e20958384b212bb48f7b136dca5650993208cbf0988ea88ee7e2739e94f47e8648eeb237c9cd8ee83ac6d5cfd0e67a44827a62350c34f4cbed95443f3758e7d1936ed340819343f98c61e60ec6f7b8127dcf4c86b108a7b437a2a0ce040936c8c3384eebdda368c368b6fd8c39876f2da787354eb8043cc9ed50574111ebc69c1b2fa438dc3a1507579937bef608e05f2c30584504add0636711a86bcf1e46a7abcc5317da0edb830294f9704b904a498baf9a3cd25206a18669bb854b44985a43f7a00d471fe25cbe8e34293ed7c1165e8f7416f65c9432e3b635c4d4ce78a901f4a1d6c72a8ceb0f36407cc33acda15a7ef7000347f5461dbd8ae457483d104689add28014cba52debff1df969563405fceedf32f2de050f961cf300926517137921bb618cfca29db43632a4f47d449a4203fa0222817a554c7be9d8b29973745222602f1874e046cc24276e13e621b0672b6e5ea19b95470ae9c5352b2a01c535977d0d6e1c7fc919fe1ef702fc6626521d90c54c7364536b999a176f8e65388e45f0282f10c8bf61e5a548c2581a43c5e1cc10fe67d83f0c27d28a7663823073167834a2648b3148947c3c7298224b82c9e6647edd49583568c45651f1fe8486c26565b1af09fff5841c42d8c118d96836313b7854a6ec96539e5af71758bcd2816326dc722a934fee5a4a3aaa8f9f7a82b84f915bd7ca62be2c835d4d8c02369718bcad2c784875dae4f5d641da174829ee221448a0ad64ef26d8ad3d82dd5dfbf66caf54f23d1e0c54e3a89def99a2ce8ae207f34f5fba4c51f6ca32952525886a2fcd50e527962edbb0955dab2c9fc3f7bd970e16aad6a101079b20f10eb53e6c68d4cbaa4c955b265b550df9328468e76d2204fe328f600cc14d620b426b800fe227e6b28c580b04e75bfe58edd2550012f47817e3aa541cae1ab474d80c6d46ea950835f08be3d4edea6569a38dac907ac833c4bb2ee562478bdf0e0db6b0ab69ffff90a7882076344afae824a94ac26eb1e64b71d11fac5a21a1e661e1a651d1506b9beffbb9b343da555ebf8c39ba0302aff80a67023b4ece4fba53881ff6420dfda0a9e210c790d5a0bb80d9b40b9ede890205408c85c5db2fd0934e51b99abe2b2eaa8ebe95e3f7d936243557f5abec97ed849fbdb6bcf27487aac1005a413fc6eda9f834b46e4e9feb628ecc81af63dcf9ee384a8b2c06338555ed158e0828c3ac4015d3d40df61c8fde825deb1237b40c52b64886eae8828df2699964e8ca7d3a22de07decbb60017c1beb68e3c9682bd8d13b823fa8384ab6fecfe4b6e772b64da181a7ab8d29d4b02274da230927958c72563e7019ec830c153fa0e48399bf9497d115bd9eeeb6e1d93a7c9f898698e8f1472f431820878b44ae8cee46c716a17daa25290fa8bca436c687a168660a6fd3d5210a80d64659e38e037542854092402c0328ee325e0445d062b34b9c1438b1331364cbea89bc6f55fcd0dd0c180ca02f151a83ea50a052019740723102872a7a5c90a97f0d467bc7dabdfbd22e5b43f9257ab9dc1bd8fbe7450305468bf65d13e13548c3155c486c50d899114af8b24172b1557e6aa5f432c1df10c4fa75b2002dac350deb472bed03b6648bdf3b363085d3106964b18da41a63816329869d0c8887098ae66a0cd8291adef5a6f62d691c629f7c2fc49808beca40d992058fa6bbe5dff02240c0444023802fedf0d77cc603c621fbec646c7a92f20f34412bae5ef9248afacae3f98a70a902b11daade4f333fd2e45a1a8adb888e0943bea5a20f77020ac4185af9fdb5cbc7b1fd045566d3cd3a10008238103ed715f785ab6211ca8c4ae20217be0af87e38c086ccc9c438771739928b3ddeb92ca92b52e804fa68a1402a2aaa0a87706e04533c40119a3a11cf2382305a7922e24e82d32b183d48d3762961ea7d05ebe912e314f7957c77a48f975543b12179224fe0da371ffdcb5f768da647094ec256acaf43d83914f9489877075ec4ec77a9ec8cb6b58816391c77020f823661387395616d0a425ad70004a6c63d9d4ac233c66960f758cd61d625ba683a2899d93baeaf119356e9b97ca16834a7e9a6ddca94d597e07dac07c61f95c250e7814a847224ea5fe621deb62c61a5a20a175b655dc02c1f4e4f70b772dc1a85373df22d6b6a2e406b80c8938e4a28e459c4ad47bdbe4bfa972202a407824c431922daeae977c60bf4545d3c1038d5bb3093690682dc4881811d181ab77fe1754933ecf36f88a2d9823b7b24479bd33c984e9350ada4ecfd83d389b90888b91dd43d48c0f946cb1af39b3c91e68c023c0ce90e141485063c6de01a11b6bc68fb7567e40b84aaf802c8e1b20ba774d4b620126ec111a7e8410dab7d39c75c6b10631cd2403d6cde86654d69541f0ae3c921d62e6a78e2fb04e1232f83243883265fed0a826ecf1bb1482196661f005a6a3f3b8cdff4e5411ca789107b08c2e2434fe9cae2da848c9973add4443701976ba329bc44d38fb577d6f5eb7d7dbf7b37ef69e164af183be83399b3768593676f24bc2a554430b35b663c06cf4fd38ff69f8732295efa14808a218ddbc3452b9d25475f91f4632da20bae51a114e6f7a6b883524c0b59aeb1171bc8047c12c69ac7b69103ba5295d388d8a13627b79ce75f6c646633400d499c2d0a07284e4b10837c7daa08d63d526daeca17800f99141b8526bcfe4fe273107c55bd698d5ac127ccd4c828d56221d8c2a237bf0aee44d50f209c936c1112d69d889f81c4e1f6e802e7296866b1473590b20b9d728ea90bf5133bddd598d27e57fa135e56bc09242f9cf2344e0536068b72cbacf32772ba14999a7c3f90cdbe912ca7922399881e3c2de4e6c1aa0840335a6c78902b9d4a8e8974b05d8a60d8e052be19d358b4e29acec0c3275eac375c48398b56eea3c3b5ad0ab2e05b652105ddb7c7c7684a12a7c3de13f0fbf74ec6fd896f95f86620ace02b4782933d0654831fa78c5d15698ee6cb5a229da2281498ea2a43f16f22dc9a639e64aedd08ddd2ee8b6b49b46edf2174e3555674d208b24c69765e1360fdbf91ef6997cc14014bcd8ad26473a386db5b965426edeaa983d64c15c5aff27bc0a60fd52705198cd41d201995b0cb5562fc8dad5baf8fa049e55ec4adf6b95e8a3e9a349a6ffad68b1168e575cd37363adbb17df705ed9a34963161c983437872e974315e61f5cb04b15bf0ad6041dbc15590a8ca6bcde88d27ea686bf176573f55b4e7d85d112b6d2e35185bdc5e60d4e56022d4d8b2b18395fb96b913fec4a7278955e4d6ad3e0b4a4b9057a6eeed5983cca825cdafb24b91f68f9af7053189b33ca119a1b5caa7eaf92d5d5bfe5f51d8efd984adf65177913bf171c8c0515d6e3e0e7486bdec261c31d53744b9c71f2a049b9a48e8c960089845df88ed424bf29b9626ae451d947dd07178ac140bc6b7f5b3f0a7569618a912ec04b6a7042b31d4251567860a567b35f4863877b479a29ecc0b4b0f513ab044cfe9acd4b612d6ed2c96a95b425eecfe76fa6a2ef55c268a812d86439dbddbe0b99446432a42c7f41434a262d8e4a558ecedc6b35d7753f052d497724eabbf477a5561858cf4dcb311bd6c7a66c1622a56a76b141c4e5970550b38a5a07b82305d2ac4413afefc89990a9b4c4dd226ee266b1e4f91b0db2539d1f5ae53175b50c61a0e151210b86be239b006a9e429270ea4aa369bf23c5ac6db96d1b6bc1118e441e0ae4382c15ea80d4f4c433f8909e5e0e2d1e7cfb94092d00df879ff8a4df37db6a17bdbe71f09fb0542a348f38c5481826599d77f791d6951fda0fc25b30e6ecff649c96ae226b6752eb50a09e45b3840ac6a27f7988708c21b2df13c92e9775360a25418070b5d01ab4be61de7191fdedc62415b16ea67c593899023b8c07f9ca28d8f1089bbd4699d697a9f870ccfa385afc9996d3c12b56692035b0a8c6907181c7e3a9ffc93e43d5f347e61cedad1bea11ff067bc944934eca157d45da6fa8c26d52c2e26cf9dedcd8044086f4b51935115e8a581b04902034ab7506e456c2920d344a63dc58050d72c76a111e6cbe3a9a64a2671fc52809afbfe4e4c2549619a34bb81d0a8c1cd3cc9ec3148223309e6becba159c469bdef4d89263000f0f3ff2a56091ca06c01980ad92a9e2915424de133732276984d0cc1ebd51b4546597453c27ff9eb725c7a2f1a3b3ca49977dbaf904117dbb714cbdd4c3b811211166193688ab0286c3f2f86b5c8aaf45c971162f0082fe0c1b9cee581d6253536075bddbd3e7c56b99495e309a5d4a75541f0356406b0a5e69a3eadbc5fe46e5d2bb914337c72f44d5fac269a2aeb291aa4d4e07bdddecaffee6dad2534c6db92bd1687bbac9571a209fb5e40ca23e86fe5fc412e165f097525fba162d3c60cb1833479bffb195820d256890995848fbcf3ee8dea9b6d00e9927876a9baa374cc9eca7014478b510594808d90a59f082ac037f534805b0903f03cb3e4d1ebbdd84ebded7741c5850983ce7c717ad1b4380c073eeff45fb68cde7f7a799c2216dd4a5488655b9e01ddce379d7aa70f9da97fa9479aa6e6debc60cfc5acc0cf583524b3daeccae1933495d6c37e8b185fddddec4afcfc9bff083e6120c53f8c66c36c343b827d31804d21f4690d458c22b4c10803ebeccf8a0fe0a25c59eb16f50290c7efda69c9acef483b00062bb629a091ab59ceabb4c0c82a13c8394bc9e6a42515d15fdcd249da29f0930953be8b0a6e038b96cb2fa0c79aa9567d6b2af70a0bc10c403860b272d0f4cc91287fa4a5f25aae19cc465b9bc0b258055573568b85f5b7a78311c416a2ec471f17a3847bdb8f7b0760192042153231a9b237f4073216b797d808ceeb6ff73a0450f475486f8e83cc46b64f53dfb090ebce91032a3b1476f09feea22aa57732126b3022236117be162959a7307dd51ef6e46cadf9eba03832a81396291449d89b5eb1ee368ff31ceda0bb9565b0824b2b8179db21e15defc5dc97d7f7d34a60a1e1459ec13846a8c407fcb8de063224d185a4b041dd74bb9a418b0a1ff75d6c0410ff0a502d066dfc080508b5b1cef0a1de927b08d2dd0d9067033e81293d87ec4979945de078791611c878b09685870ba82b0f66cf41788d2772b00e556461dfb307a8dc18dccdcfa9a8f3d09eee49134bc5823b66980461140936924f1daecd3c8310a34dbf15b0aaef9d1fd181dd1bb0570ce0a48617060a7315a7f72bae174cf13847ed27c5c67411e1d90607c611051883bb3490824bc690e87e3322d47f81910d71fdeab0037608b1c1101a1a383a1ffaa8af8888f30b5c9ad1214f0575565631d41a5b3ba475699c4ba6504b561398e03b484f7af9810641e6819858ab08611668b3b7837446ff896aeb4a543949b2a7e59ce843cb9e8a6f600f1e3ec49ee9ccf143d19f0e423970bd681977b2f052733ffaa27e30044c0d1ad520e0fda19563fada365fe783cffd6a5acc38543173bf118c3457011464590d70e8f6429c25d40acbeba8a9cbc823e2f2f042caee48b1e9178df8f0f0eb0719202367b948c301617d6f6dad83666a2e6108269a36cd36225ccdfa02e28a181937fc1e87cd8820b6083685ec4163a3f6084053b07a7c1d921f55abdd3ccb2a1ba523e38d9aa851c31ef4beed0d8820df820a5ed515e123ba343e420fd17190b714afcc3372be77826045f20bdbda6336edb1a33801bed7bc8525b8cecadbc39d62ade86c33b8c61bc1fb464dbcfb67a011ac7954e85a7a363bc2a444e0c56594e26997cf82801b3534723e5da01d93e5abb3c1aa9a06df228b722b81975a45b82ac3ec81a387b421d88510c7c2ff0238bb1be6b04efc2580825b43cea64e063f72c1b2ac21d74563211795edd7ba83ef3f310e2a2c7f1ad1c8a1e5a947a2fe4423c686f1168211240e3dedc43d31d845b5c5fc5e16cdb1cee5839980f1d857ad17a1dcfb455c6fbe06fc7c6916a8c82956a3e88ac38ef37063af80c62873ea6fbff1eeb981675416eff3c633c106d2980ea3bc3a6ad433b77ad92c8fd090631b39ffd8d124d7330bfd083968959d969869a0121b678648d77721f53649396579c3b6ac805348d1ce6d9f4aeb3e65ffe5dbac79804035e760a6eb00cfd59582223ab60569cde4079dd3ac7adfdeaada264ab3df017dcac1bba47cb43bb73fbe1ea7476c757b2c6ce68aa3160233780d93540bb51481742b485e979afd8193d4ca79c4f1153b0bbfc91d9ba36386365e951cd318e4f6d62c036589d425f9e8a56fd826fe45e8f3c7c481576a3007c307f0bd225b1c6c87c4000bbec80be36c7454e47be1731b89aee25e03e8ba78a2cdd134850cd676fcd42aff1d113674339e78f0c6e8f8ebdb513e5add553d9cd38e657e1e70a45ee9f6e4d523aa75d02221a72eec46855f4b52dcae92acff0d3ae54f9185d02cf0f9c0f6d26ac008e79f08ec2ac367d7def0b5286b2b286cb7b240fec19c48f080e55f66707fd1f759ce9d83513cefa07b15e8412d84b6199662bd6104591d34dd484ecc7881c057cbe074a426c673003cc48ff8db972f1429146e0eef6e08a6786ed1bfdb1f272360f029b9729c520ce447136754252147a23019f9889521c59ce9f1ec80399f15d75fe722c552644ac28d032956d0b941bd85bf2e9c24eb3d2453f1c304237875cb0ecbed4b87d91a20f1916a0ab67962da08d55b62ef7b793df3118e8a66d76d0c24829acdba4593e7231d2823c80804ceb73910e9a1907f22a0e0c44e80c2b014eb8dd5d834a2e8ce59fb4b7d4fb6a3d6fa3691bf00bd36fdb067949bb9f53df583ea40041e318619868d27dfdcda2cd244095acda04185fc124be1b49aa269d9a052a4b226408df93c3d6d0481355746d523017208a8aef7c808ba1be2f8549f3e0a2cb56687041acbbe6c2bed7b91d8b8fbc8ad1aae28d0be3ba3db556a579bb9cc067688a23dfa719ce69109b9a3c5c08e944e2ef2318bc92aa932a3c7cb88c7acc5a7f9056bb0f6d4a566424a50b0fc019a38747be049b3185551e0e8789695118d98400cfcd50ec95f3bc340897865458188c1306fb00cac206b6b497de3469124a0457cdcd27e4f25491c12317ec52fdbf923da1278f857681b129ab18a1b5c1a5e2f72a595d7d5b5edfe1d887a9f45d749137b12731414078478306be97b9d5a44e94a8ad30b74ccccd5b35a30759904bfbff8437e18d3fca2f0ab339483a20738ba1d6ea0559bb5a175f9fc0b38a5de97bad122fc1cf620000f886661d3caf77a7c99820115f31774e948bbb3aa61c407097f41ec5aa00cebc14a80c8c46a2669aee26634bef4bb2fff55ce93e817725f6d2ffb2265e83fe2951d2232df870a4893ac7eacaa66211bac45b2c86c434eb2d542e085d705e5ee71e4e93716b836e2f053baedcbf3eb35c3e9b1b5a004835c2b3962e02e2bc2de22f454a5bd19bd7b0535face15d010450e7c0ef13f9ed609c84857c2e10951bdfc49f2ea6638bfb35909052906c5cf853d741b477818a524fc4f88ca2781bfeeb46d08856a945b471e5cbc55742f33930b74cc8ed6e38a125733a04777b880ea3b8963b6d03e1a24cb7b49f1f4338231fb9e73eb366d24079783fd5eaa67918c741caf738adf3841ffcefbaf5d59abc0c667e217c68ffb135be2a0257ca7c2d3aa847e1d5c68c94ec4550b303b9cf4f5cbc130d8b2f41d4a731652a9054f28a343250e4010ad6ddfb83e3095b75d0b4dafadce5ea16ca6aedf05687f2a14cb4aaac06dae12a15c44071dc83ce029c1b94913eb11b8e5098aee291cee4b1ae8874bcde93c29f60a89f15a89572e6b0bc72cce55028e808340613beb6d619146658053482a57ff1fb07d6359a0dfa13fc20b6f64d14a6d8fa013437e0380058cbde3c10735f90d7d322ec83aed383831b7ce3c9bc6cf69f8f268ce4d56a80251f3aa732f52581fc99fcdc0ee767d282efc93ed2d7e99831f83845e0bf9c7dc297604b4569d35ce1d03edf7d7a8ba443e90f26361229a73a23207acc0fd6acca5cffaa6df04b2730c136d9cd9a1a27babba5605c74905cbc788d6330ddc6a88ecaef2330c539fc54db1637c9c436a3ea39ad8afaac95a91fad6a33300a5f58732fddd738b0ea087598038e73cc41c3c3be0f0adbfcdf489a8211689567c89948e5fa744a0a68c8c8716a30ea4107f90875494928516cb3d0799c384146b822af3ecb2775538fe58b34cdc635f5c6714df4b35322fd1b6594a141a9f2916e46bc19863a3964db0dcc8ec3feb9a6e613e4711e508975503eab2c5198421fd846b6e3c0fc3a7b255c5c8c31a4bbc637547dbfcec7b824d637f4e168b9a9ed76d654409086f933778d5f238ce4e3ccbce0629c9ad741c37467a91f1e7148afe08bd0047d801dbf6988ebbb9e9bd2205d628b4943d23dc4ac507d055c0e40e1c2cb1e3ee195b5084d25d4caa6614cb37161ada992c343a681c02ccdf4ec0ecf77ada9c5db8bda558c5d932b2c6bebf6b806d0a3ce13e1642bdb2291b6b13c09760fe2cdf290da9d2f8d230fdaa2a273700527eaecc16233120bc5a19b45cc76775943e5645dc79e222b4866b32ca8b6cd41f7156fc14a9a4f8983e249bbdfbcfe505272d7106cba40155b561798d6420d11ccebdd43cd0f22d232d1ffb583267a6f4aec906aa2d6f94b6230b28bca99f37b08e70448e63f39768a0701ab8914021a44acbb79730f7f7e9821c561e087062a55032f1a612ea2f6ce0fa5c991dab393c59985d49a1220e4ff2b3b07381c299af7e34474b3ad4c54dbe11b4a721abd6eca6f7ee0fdd045749f9762f3f178f9cd74535454a431b9c3ac1c29c6065f467a42c86203ef3f1fcddfa4d8603b0f46736839b6b55bddb409c3156700d68a8a0aec568679f4d5c099c7cee1f9dccae69331a42f444ea9e3e42031463facdf1e67c4ccc7c12de2c8130ea53f2950939201a60507a5cdf9591646fbdc332cb952e5734e96fbfd0a4b9ad4672d5b524dcc4fe5b9fc56ca51c80d0b123b382c66dfad6226cd3248d7622d953af181340c9edb43b74b36b78067794fe96bac58d350963d7c834f2d70d42fe46e7e73fa41a55771671980c430b28c8dac369919afd70af13d3960583462cc2410665c9fb5cba2d7cedfb4b21d9a46a23fbc975e9a29b6435f0195b22dc546211ede412a1ff5560490c86a7c10640598ebfd2146b82851662cb3123877b87ed5acc2bff01832d71588e8e0ece765ef17e805fb95792d53e2a2a5992da3a90bbe542a265ce85d8275f0eacb9286736c7eb3fda37e4ffeee0469d1ab93811175f901378398b105df25d8a438683ce030bc939cd1aa449de024c11213c0a44e1379d80c7a234bb6237ca86c9d81b415e24308cdbc6ca2d64395661904b29888719b44acd243dc45214dc5a2d0ebbeb1997f804f4a687929cde038218686948bcba0d81ced382ccf09f18e3d8f1f63e4be67209b6d027e0c83924bef01bc164aa782a3b870a0c98b12306b0b496f43566aaf4525108095e31d6d5c04b0ec1e7acf072b6375c02cbad34f994c85d79f374ae6559abd6d6780045da2d19cfccaeed7b27780b40c209e522263943641ff376717ee0042b2f83b56eaebbda88f064ff2d059543bd3b367577bdd4d92c199bed9502b2daaf327805bf14ed615bfd035f4fd7a9d93daaaecf883be78065ae323c55627a385aa7e4023c3daec5eade7d07558e1cfeda1721f834e5dba9b08c5dc3199b23a7db0e6286f8e180c95ee4c8b2a54b855c839e1e52f6f0feb177527a32e47dc1af51a95ba740b07182e2b06a7be8c99e3c107eb16297eed3557f5f9e62c591acdd54645dd2631194deec283d6f251a18a7105dfb722a2ce4ec583a343d69364456c814303729c3379d69f292f3cf8e0f369868d254ac4beedc534de2cd1df9e40bec1edd9ebca3e5573382faf50c9f7db8d718b1a28febf8b009f0c2b64b54135eb2d76119035200da14fe9538b0a9679e3828275352017bbf6d369818bad35b1bc66225720c0ac2498759bff20c807e6035212d8b3e913fce3610a2e828da4d30aa03ae6433a30f64b6641cfe8123a4a45eade24c51afae2651f8714bbdd703f962ee188825b6b520ae8b96face1ef3c9cf23354533c6c7145bdcb0ec04c0d2271a560c1429fb20f92927a03a91cfc09d3ab56bcccbcff02fe915e95e1b5dd6540d7a63fcffc779313a504a1dcaf551326760f19907c0710107fa0d8954156ad2503d621910af1461acf07233ecf649018597502a8f18e551fd3371828db4d7fc92c6bd233bebce4348bc69d54e7fad8ca869a000de9ed14b5a7ac6f67cfec7f25a730add13f34b82925ac1ec9ecff9052acacccb610e5900d2c08d6d7cf1a98cb2d9baab1d660b033044039ebd4100feee8bd18241bda4785abdd28742e62fba824d4d6fc1fa33443b98f531a83e407e9866e00b13fc814bea8995cd709d7173e4dc75c5233a32a0141ac949841c0697e6a859ac34d14dcc9b5ea993ae3ee3513a060a479c50e3f8ab2bb997b1a4c310f756b12f46b8a12708fec1bb4e18b71880fef185328d54fad4b2646387d743952bfa35a8d5a60efdfd12180acd2470397ca46a4d797a2e1c5af2f932596ee7a4b196deb79006cc54e169aa6db3ad1594668333d8b2d121dd362554251860a302a2575d7ff5e97869636aa7d4e61635b88ff8690cc06e8937f5d6e4e8d32d4da3e464b14850144c8ae8bf0fb62ddef53b707a6e2c0e9afcacd3625baf081836a4a93f3778c69d63576297ddc4bc45f99fe064ad949d2b305d1b87d96eb36cfc1b80f81814c93e9c09ed5f98461ec3b6d42c7495f816795ab064e436bb2897616058b734bfa768a1bbbeccf7f5e180ca51ede35b0aae4c5aabfa8fb1839383ebac9531e098cc88d9bec604a914e53e04e694b5a438c0467302b8e7d880d9f9db7bc62ca416fe924419d5a5ea0eb03a3c9f34c7d55faf1024ad13852c32df28265b47839bbcd6778db4546882aafe1e5889a2113731886c6c8f37620235e721126980355e2f33516c44447e035e11b773d04f277cf43a50adda7ac4bd71e430fb60847f9963eab5037febe902835b6f1fe6d7b506140433a0f934a154b9e5a63ba95af31073d4d9dc3ad10fe393891c570a8da186ac98ff3639a17ebd71851abfc068ba9b1e84fd51820fadd8406fa8503048a6514acd7015e696f590fb1c2ecb0b59e502976ff7bcee2cd63255d320cea413400dd84b6db3d430d7ef50fa5b11ab594109d1b326d95dad4a155dfdcf723f661faf9597d7ba4dd3ea7060fad9b408edbfe71d44958bd4bf748ee40008bd372761f154932de424377e1a580573b898a8c437230bcf73696a412f9faed72b761a738b9193c592eb17ed8521160944c900195791e7200570dafe7c90a70ad7cf83cf99b0c290fe53e622d2b4d67cb7e27873a820baa61753ed6ad40e55f3c7e5c30b3d00b332175a84b77e6a0dd7c70a16eb8f3da82289fcb30274094426c375898ba86e73f135597f34cdfabbaa193be7c5bbe9779792274a93cdefbe01014c311edae4dac87b4edda53f6bb5d72ede6c1183fb1d01a1ac377140a1dfb17d6a874962270eb487add1842e3567abc0f1eb39bc1d350664c5997401a065f4a6643aa6d8ed484271274db124676d547a1512e33fb28bcede81ae3b3a32c7bd43734b37cc87666f63373b0607997080269663d0fb4b59b7303790d316245c784e218c10471e1a0aad964c0d3eeb71decce119b2925a0cdfe00b7d9949079476d04b62d6a24a2036773e24e05c46b9c81d857bbed89c82467eedd75ce00933be26018860736a9d10894c3b229fe9570cb98f3f1ca8db64eab7d411281e0d932095ec57bdeadd21171f3ac645bab67e86b63351663a3657b7c56058a5872fb394d516997dd0446fa6d14687caf76e4812928a90e30ab8ba3a0940cde0b82564a48402fbb936601df3d81b4de94125ac32d7d3489410e0d58f545c5d29cbcd11cf5bde3490890027df7e37a46b45626269a8712d9b16c9275daf44ecd160ddd02642d07776ead8e40b5084d991a8df60372479b36c0f115a458ed8725526ad26c2e14b58347c36a68ce8e664ff192eec2ed5869e57491b610b58875980120b4a87bec67708b3015d5af206846c727ed8a6994d26ea2ddd2b754e1ae9188c24b9bc516680a6486868987b30cb95f52abaec04393d2162540074762bea979bcf404e34232bec999ff6c33014a859f0bb97c4f0bc360098c77ae0e89046b66fbf61056e96017b3bdd043bd3e6abdad3c686a95fdf63953005d4978284a07e2d7f78f243c478038dff90541fc203dfe7887fdc386b1607796b55487fc47ca2493146ada1c3650c2a884ae39d4c43e14dda7e9abc545f9f337c17866b1072cf7f8da2ac5938c74cdad0efb9ae1cb99ae02c84685c51a15c69314ebdcf1d6c35eede6eb5d5ade52112d6eae8fffc9cf009b368ca085284a0a171e59578d0746fee4802ec2084beb2b8b23cde2533acf965fda3d9ccd4549e7c263ebea782707a859c3350ad1d2b87adc1a359eb1da817572bdd98989530f78d4b1503fdda608c25923c60238bca2be9325839e90d4d405852b9391d3af6c8971e9f2673e36df0ab44563b5839ef00978ef760f404df1b3410ab71c39f195e9e8ea2b16187452ecea1b0cdf9e17b0c6202130ed205542b0facafce8d499d3abe4474811600218549716914df65ad1eb6488b32e2b28d836b9905f02197e61b8e151f447615fa3e0b04615878b073a975451827ab45230a96a4dfb45a4682a222ed99fa501258891c52b130714744cf31816d458155876ed7eba4394041f2f928f9e3862d6a555f745a01f535834286481a8b6c11169fb85b66b8a40a0e0e1d0bd1921be4a61accb860a5b7e0949c0c2083876b9a8c7308d8b63393f41621958c3a5738ea1f0d532b0a807b965d9386f3c511f95804de586a1237c802dbb045626ee14878dffe6883afebc1d73e71802bd709c29efbde15c410664583203ad83f64ffcf38f4774c1b3646f2c609a5450866de57d47f5ca1469ad04f451d2aae5dc228d19f27f8f6e56810e0a6a415913cd860550337e6a430d1b54a1917b247b616e893ec08e3ea86f3f717909df671155c85c1771626c3a729f60edcb80819488833d1712adcaa24b09419bf685da317e2933ead375d2cee6977cedcd1723ba4a4eaa2e2e7657ea6870e1e41cf5980cfff061f6b483370f2bf97cd7132dfb07968e2f42af5a81a3168e496f717782457d052339072a0235a3bc77b57b0322585701d12c6f659d29a2be4262c967f4c4d2343b112812e0a939b177cd86d3e9f024905780c3547128008e91fd022d5a570ce893ff715bc5c9332909264808da6943c6c850d30e0acbfa54074281dc4bf563ebad104ff2053ae875bfb4348214cc5e77b7ef3459a888c2e10dcaca25ba3527ffde95d2aae989323887748ab7855e9b71fb945e01292c81e937f5acae5d742c3583d3a6330ff5980b6beb2ac74fa201435d3fd8f06de53922257b26c6731d6ff193561937d0f54449c9c523ebd799c3c1e8ebdd1b722dd778492caa4cbd0368612d672f2f0358d4025082b190d308dad0ce3299ea069a226d307970bca5bd7b342b7bd13af9b032e3254d48c1c380160e0329e5aded261a0dbe8631fe8c91fcebddbb48e791cf069750732680c391f39989c1c37a85dc6998915fdceafd6e245b0bf9c1857365765b56c3e8f98e417fb305e829cfe1a653af37b7a334c7341e17865350e3cb1012fb655979d0d1e1115de06e02c0a7579898dfa22181ac2e7434cc0bfc6f281bc70e9aab843169748539ae623e564f3e13fc41f104244c6a79945d45cc91a0b01d746c3dac3c108de006942cb0902cdf346d42a5ffcba61df2c7a982b96dd63ea5d5e7a8d66fe5134aeae2fa70cc19be043fdd2c5916d79e252ab703d3afe8c765e7edc066f36265c5858841cc8f26f8d7282d5f55d4cd446cbb68a77fb3b30fc1fa880a684e9180c346d150f92dee710a9bbec6c313110590764a11e503fd71ab8210474987f2c732fe3265c5a9dd0ee332a06e8a8b4e11a8cd29e54f5ab07a3505bd3a235160c3ada5de5158d4e841d12a4af9bae90167c750828665c99742acbf71dfde15e43e42874d54476ef8ec481ad35d84d4755d0f798d4d338168fd0c663c594e311da791e7b7efc10bcc07c97323a7dd7e75dae566b3b2cd6081ba5726de33ac6c9ce83e577536b8dd9c00bd8685c8293169f2030be49043ca0364a87f2f5e8704695310e223dbf988fc1a39fdb73310d5db5f7e0cb2a01c72059ec3125706ea9a6862c468241529f061badc8522c01c09f99a0b67e55d5dce6e0e1be2717f4403c4370b720bbfa6d8950f7c3cbfa81f4c47026c4d4ece3deb7b5ec4c46b6e857d55eeac66dcbf3342c0fdf2397ac4284175b80e6e1403a1e39b88ffceb99ae8d50974980dd138110bc72d24b057dc2fa52c1ca178a5f0c64242519b5491fb86817e041c9af9013a19cbdfc7326853dbcdd464c389623e43c2757cc4e1a54ed2cc6252059653de23d852fd6df66e2ef406d15a06ad48668b65face202bbe5930014b0a3b540bcfe660faa9290e81782bd4552a536415d8f25c637574494d70b24be9eda8616f374c658fe0251cec252cf67aa05d26184c181438f4b1e3e160671d959d13f54fdfba22b8cd483c79f7484dd4e9a64285a1f4ab036f448ad66a63085da86906420cf05f78975f33b6b252bb9602b7aa5a92590889e51a1011ec97dda80e03b97091cb38845e36e891b9f0a454b0121bd68cb829955d86d82987950dd0e3923fa57bee16a32e29a5b7a0c8dd9075344d077e35d22c1178fef338687fa0cf4c54861e9cc3528910f4b4b20ce9f62acabddc88c0e3a1668c59ef8186a60c6ad7a30703ae36bcc21de6c19ba07b20324b02136235955be49cb81c996e7f890d81b1fa64b3896f20b2f052ae84e193ca9ff22f45d5f60790a70f79486b2e415ff258748a9ed908ed1b8af7ecfca73791f49a0057c05acf7d39335568f20cf9e751fdbeb25f0ffe72d38ddf692e166a305a90db8955ee8e1a11b095b1f684db3fd9ca527d230943f584572e561fea2491fca2376add771fa978ea8bedb1b5cfabffee23e1a8f236d8140f1520c5b31b332520e55a9cfaa81f389820fe1ec740ad81ca415ea9d50e64464dc8bdf0df22f5366d41001329a7c3e2bdd86e05c5101cdf4a179151c19ce17ebb9a3700ba8e72804899de6f1e13e0fc233cbc16c501512b974d8b4e02bb584c212e51a647d867b6c715c992ee207f55dd6a1c85af9381921bcf1b0e2ee1f695251f63afdc72df9a7847a5fc90a4575028f4d1e9d0b9c7c99c14e0b1e771c46a14e8cf8e3797b2368d0c466e3e680589b4ed758f920bb28f3e0090661e14678602674fd369297bcaa32984481a8b2741aec58bfc5291c4b263c323cf0719e8d65b5fa1b3dcb10be6b39c5beaccbd102246c6430abb25a1dc97052e6af22505780a4d3a008670495671d766405b6b5bf38200f05df112ee70719b39fae893e35d9501d7096e700708d568b815b840ee7913a0bcde3cc111af6d30075e7d597290523ff5a08403c0f3f0149c5ccba125700adf0209235dcc8c327e3130c22205aec76490f64424935b216fa30391a16bbf14b3ba0d803e3c67dff178e83b244f4863a71e0e39e701fb1d203de27bb7fc086e0cc10b1d5bd6d8169a65eccb2274d4d2ca5c444043ea684e103b8f92e2b1bfc9dbd49c450b7afe64118f0162321a66e6344bf93fbf2f76291a3171c6599ae04d91653d00e674f3bc3c15095d1c3d7844d64193cf3ae7a931a400790a1da94dfd1c543b5df74432a6990eae7709ce3a4055512ee800829dc9525bc2c9a25c40f23408267d30b22e1c3a03983aa78a3484a82ab0f6956464a5e6305f5c3f775aa109a49f8c2e3fa5d8608f804314d59709bd615571ab488642adeb378809ef811a47e8ab092dd9dcc1ea5db5409c8bd9740b4b1e9134f68da339659fc1d1f2b501c9b5637ab0052d2a0ba89d57366c792cd910b6bf56fab5744b3663ff676d8bbe30ae3963a74fa39a1d351026dcf6362baa87746a34a0aad1cf0fb83cf5fc5c3cafefe3cc48d2c1af887fd24605875e8b4adfa07806767d8fb508925c742b9b10715cd328d2267564428d745a8ec756013b55f891bcb4bd7353252bdd69abb31d60056d910187bde8806c5ff9a7c69be408c49f28bc55c40cd89c1c2528ed7b381746054c4990fd34e8b5f980bb74f9393afed27d418bcaff14a4227ee7a2c8a80387836e19ac37a414424d0d1b5b94e3d33bcca9501a9b80e420c78163471d87e45b11c7c6123e7f853015e218f7cb5997395e84a12f9ef8553ca4201a13459b6588492131289262d48fd3ae915ce68299566747531ca6d140f7f78c01f645a847115c660507699b622b07d999589d9cf62863ba953e7569e3b1677ac45f449870c014d8461f404b1a9e5ad35d26a46155f87f1f008b9b902260534f279ea1174b69817591d27437030a31f5eea1b4ded2520f62f6bd2b451310d7f4bbac70d55bbaa380720cf68bd0e24994a91651838997db18a08bf6d04cff2a38846d4d6a07c5c6828695e3f5bab83143c8e3cb290a3ef60c9e0a9a45426969b2f98a22926fdf467bf8ff156d0716f7189b21a868302b38ec86a01527997515266af89ae3e30aa3ffbd1a8876ef171206dc16b6abdd0e8166ee86330c4a7d303485ec9ec0b7e5cc155c5c678ac781098349103b8cb0b482d9b383eebaaa41c6e941eb77a0b0229e6cacd89d7a706eb6f9cc7048d560a3cc56162704e95db3e4eecf9d5a9cd163ccc1180e3953e9c30a10a43c7db34213321177aa88434d2b7f8d06d208ddce2ef98257deb392908dbbf7c75ee18ddbcce0be10fd73d6769b76a644f236741a9be34e63cd57e2004606b2ef19d561fe540a11b7a7dfe5cefc6852e6f0eee29819ee6972c83b2d25d48e790893c801b8d3032728c0f2ed690c6467a5b80eb79d1725dd9fd1c1580d503bf218d0e4fdd6f3ced0216c88af28c45476115cea7eb048fb4f70e1b34a79a4b81818c4b7684283c5d85a8ca06367f80032c3663c501b747bc50fb64c6faafb83f11914932068d2bbeba4d9e624863ad488b3cb800790ca3cce03059d953a1305b2fcccef0d5e2815c8e25043b65112a81df806aa15b369174e27c299e9950952f3f69b75c68a0e2ebdd736e5bfa4f13f4f291aa40eb0ff0342fc8043f51cc2a4060314684abcceccdef179464d9e7cc8989203ae8a5548ef2a70126bc72843980816ecfe4c5c1ddb4100892ce91d29d00f728bbc2819273df2cc8986cfd29f15803b449902260cb4e36853c04b7c4940a4f021a274bf01449977f6015bb9b4c6010cb74b04c219665b1c2b2a0902c3a2e6a52f7418734acae6253468c947c481755e4c05c620c189226e7dd36a7a11d2aaf4a233f641e0c44e4359ff11752f13ebcc8ee1a8034f7f345f59929a76a871d60d5d00d1130a9f4907821e7634110bbc6202145034c551b0e5c53657b3e7347936ff9046f8f03a67b407df74f3006f7d340004a118eef8163ad878de621b1c4df491de287d4ddd34530f6266293b1c68fc71c566151628dc028472744e7ba2f5427b097947179889640bb93e3550671ed721cfdf5198fda7b08129064cfec46ce2e74ceb30660470ff5162dad5872e400c838fa0d84459ad06a4d3f9018ad8fec13c248e104b3bc47f00749e0eb4e12fc0e9522bfc6f9603ce5255bd7e8e0a5a13f81a7f19abfb2e678958dba7014ca260e338fb2685b41151932acd66564ae791f7cfafee9436219dc975bdb0ac191a29158a7200eba30327f4608cb4aa29e80f82aad4af6c8d9df05fc34ad32f1323de154f17d252ab4c88f94429b11fdc8c2d7d044193d1c5fd4e2f612250bdb9010f32a94b132da6e4114c27222af288890990d355290be7c707d21393c450658a5629b8bc26739f2c001e0bccaa037ab5d68c5c30ceb29a0e2a3b885fe0137d4149b4c14e46c61ab02d6a52338617b7a3a36ac3c54682ab571f5dcc2393995280cf8f1d1e00c1ec3b0c83a876aaca6a7f11bf6cdfb4cc627fa8d640752f1d8303cbbb8db490b6775b935b4a99929401c008b908bc084d6469823cf3145f466ec3402fd5799fca7baa3af9f3a7e87daa15f69ef853ad30cb7bb2542bcc6a79cfd60ab35a31de3306772c2f893ccaaff69139f26796c9535c81e6241249cc32b9738d758661ee68bc278dcbc5d94a635a2cec2b57771706184e377252770f5500b37f05e0320456b9aac0651751a82fff25d256a300f714b88f6995d27af445c4b3fc9791ce529426c892892cf3587f04bd8b4a75de37d64cbbd66aad4dad15a73cef53adb0e77dde4769a55454ad30ab15232ff65ef62c8b0b4f5909112ecf64a6bbd7d9213247be095262964c2b8652ea9a32e18cc35a382626c6abae1897a12e431d5f198fc6f3272c3f893cea4ae3b5b000676a6cbc6cbc1bb44656dbc68b95cc74758c3b2d02cf9fa394791e8b460deaee6e753cbc1aa594527e28949792f4098fb0ae737777294597eefe366c40492629a5bc2a0e6631a5ee228e2568cb574fed79ddca82bad3a881e58c7f0b5cc25e54aaf33e15c6a1857050101010eb06a7545a4e733285526b29a5ee5f9d5261b15c479f15ef8b4be68bcb35633f2bde97191af00b088235aa2f353535366a9aa8bed8787d79bd5e361cc77153a440ab2f2a2a3637a8dcc0f1654505478e24a8e4784a3f4c824a28ea18a2a2e32626cbcd9cf30b0633e11a9dbc99d4721795ea3c0f072842425f50101090ea861f1f1f6aeb58bfb442c5d983a308dbe79cc2be9509e84b0aae7bc6fa78ecf76cbe25b291cfba771e5def236225897116753135d02a232333f33333f3f1d09fa9578677acc0ac0da24a452b7e3de3a90fc690a2a014e18324824ca3e9e3256df5fd0853fd285ba93e2f3ce1b9945882c73280e7916d4889a112c81c2235bbf87d4f35f7b24042c3fa6624123682ea3bf2b2c1c08e4c2603a1b3b9f164ce79c36932158e00bfe01d7956b2c039845a70d879d8b4ce62a3e5c6cab4420306cfcf61e6768e332e88b1dbee052302cf0903a92143e78481c204b164dea4c2b3e94ba2c60c16b0ee972f370f50b184120c6024b9e042667dc6bffa78f0e7555293a4bc7ad5c7b3ba5c56fdf7f1a89cc8dfcb33f2f7dec7f3e548ea81227768e4ee531f4f875d39459bc8a830403051cafd55a34be61eaff144e65eaa810368319826289e8169c2e3b786dd9699b0e68a0619ec61abfb839d5aaab0c97d8393860d57a4c1e50548b91ffcc281dcffb02f49e47e2bdbc28ad1e6060d32ae70c19527209ec2e4fe0afb11051a550090fbe915a2024a79b41731723fedbf67d8723f06cf6841eef79f82c70bce27f2e8b2b931e3a947eebfd8cb07723ff80dfbf1e4957145c98c28b8053bb23cda9021436e1690c15406947c6f9347145866faa4b3d61980115841c41328f0c9c24a6dac3fc5ebdd5c43e0320a75522edfa7444898cca3e703741942c2649e6277515c0ec1e6f914850abd7195b54c2b0d93f35eeab42744429f5299cca14dae4c1ad4d3559c28654eff0d452d513344080637186332cc2d8382474cc597bfbdc196ed0db64c9f8928ab77310c83b72bd265cbfd4648da95b15ee55e194914777d6ccf6c90b47b4302f1a410b7fe90e975dabd58f479bf575a0feb4f056a588f1ff078fbb10da594b21af0587d1ca80649205ed52281a824909545b25c3820ce88b3c2d9b8238e68e4907a867aee4ae66eb2a5d20e5f8821697d861adc130b85a4b94d680a212b84b6106ab2536cf608ab843dcafdb689a4791316924687c01db00d3686bb058b7146ae60328d1a790c0749a34ae014180a2326ae0f1808704a4f6f7adb2bb94357d846561ad62f13b62d6c9ab0895ae98b0692393dc590ae86533ff9c93db98413299c51846c4e9b40c8587f93d0164256084d21948f6c4ad88eb04db1cd1e129a18208772ec00da80bd29c719e016a41d2ff4429791d33c90b19691b1fe1c5380464674c955cb385479f26f48f3cd34a1ac592be7cc359c3e7ec02395e919a02e555c00cad284a8c66679058fdf59fa46bbdb7202bfe6cf3c939acccffc08323fc35a12f3333fc5115cdfb269d84ce77daa99971197c8fc8cf8c22f6b4b66fe8557aaaf9b91e99950d664bcdb1622e57e0f95549e94d84ebde4b1f6e2038a161a78fc5c871a16a561bdf4cdf411e92530f068538bac132e60c0dc74e4b4c04b969e21273a671eff92c066523ac7f9eed3ebd9145d5ec08ac03d9f460d3cdf4937f9d2a5df7734d605df2410a76de4b4efe7eddb2673903fa7904166d0f4d1af10441464c3f290ee15a8488798c042e34e6e28508242d550439941facaf4c14199b65541ac5e7e0998b595b8a4859a4aac3e15c889c021a11ea2526eb4afcc20f407493d208e6d630a9e6de434af4500cc4ac0ae491926bb68bbbe31807114268c169b262d6013979eed658b943590906c3001a931a446952b9b018ff329fbcf25eeeeefff33fbc001bf42987f65ae2ed0b2c4d2c54ff6c29b252cc0e02fcb018ff3e6346f464ab625ff7136b9b3e0b4ef1d7bccbdf086e3e77b2fc6527a9ea8a466ee2dd793bba72727a7a6a67c3defa5f4debbff30984cb6b373af388a63f755e66e49a62a78aea292ea6a181541211ac0f3837081392d37207282d0b02aa7a43d1f34ac3e08fe9f022a754a459c86d50fc28ab28ed50f58804500c1c60a3cee1ce5fa3b42602f69b2767393a27e275bca7068bfcfee82e0bc31858c8212faf2dd556b129cdc75724e15a687452a581ab9797e122e4bc0f3f835094eb67f64840e6fc36afdb751440a3cc364f005eeef8b28a8309db2929983a800f71cc7fd0c9debc994135ddfb08ac4c3d4af7f42c7eadbb000d35c427dc9058f37b9d6af6f42ad2f42cfea7f70d3383a4d9bb5a73c4a1b174c799448d855a593c7d44929a59412e0a184388b6c3f488485ee7525a5566aa5a6128542102dc85b6dca58ebef085fd8f1b039451424e039880aec78090b9730a9edf81de28e9f21157784d26316e8c9bea3e67784353535e234d22104be8f63083c4a1e4b601a71fc4cf3a907c37166b0a665e36b426ca346b441ff5f9d2490fffeeaa56735a26b69d853cf7c49c78fa08d1f6f66d5fcd839e665b3e8c77c7f44687ed1ff6db4c09fff691e2d948bff3bca051459de2c792881e79c737261c2840133bf87f2aef03ffcffef62156aa1bae2ab424bd9b39f0a33afbab1844c33c882382aa9b9f5381c5be10d2ab8f52dd1c582d390c898ff7589e3c531a22c8998eefd5be1f8b98559988559581c5b8f7a9638b63ee6e747a4f55ff7ad50e6fbf1c47c1f8feabdcf8be9e4c53b1ef31e461e32e1513ef94f274d9367185911c4078688c1045cd4fc59f09f3d6354c1e227871e94e002462dd57afaf1b4769c56f3ce3d16779e258ea008de4b23ce88f887380ee90b8049fe442f0c214798306172f7937da763fe57a969483ae6efd55cc1b347cc51c2631525b89247f9943dfb0b917999f03d468bf0cdbb01b3b24cfa11e2891d52f013434a8919d6c020f83e229a563d784234a960f089e98a0841f4bd40950281cd1ba34315215aea9270c1154a5d4e674726db29820875655a628a0c6193193aa255648a521422806e280202a7240c3859159172f3828b1061846a70087b77ba398e4b7da1e2c40923bc503182cbcd08252ca8adebdcdd5a6badd49229a55448a61c75d7a1d65a4a2975d1bec9ddd4eedeee92090fef05c1ee1655986154986154c82db2ae74b39d56cb5d54aa6ba150252c2d757782ce8529cb2761c8d250c7fadb8ae39d43660c89235882d3e690add4da21365bcc8335ac2b4d380114a293256d823af0eb5e915924286da573c8da4ab9211a237f83584f0feb872e78678fd36e8fdf7baffc8ed200217b64294e4ae97bccc80a36833cc5155eada466da6377bf3a5a2b3532dfb1cd2b28a9eeddc984b67fe9acd25bab84e7e37f3daa3b1cefbffac31ccbf33b5f7572b63797fd9d8e955e0e55bdc3b1fbbb0e47cfde4d65ce39a93bad6eadd5993e70280153c2ddfd73bcbcc0f3b91d1d21594e1fdef7e54507a1ef8e337d4ceb049edf514aa9b53fedcb6f0039320af665c32e953e32c92f2334bb28a461f2553dde6eb99beabe95b5d6722954b525d46b2deaa22e4ab49fb2e208ddcd7f0a7b5df5ba2e38aed64f7d463ea350f7da8020c7f23aafeb82a3c23e81a9cb0775234d5b5e4cccc7e35fe408131c955f6e8b7e4b749d37dbdb2d77539d77f3ca252b2aa553b38421e9422a615c679fe32c122bd211bc9bff4ef530106610bf344983c974767ac60dd9d941f9ed1e96e25036a80f042f8e75c19ce3cc20fef285346de70b91f01c39b28513636e78fe8ed38e74ac7f096ca9c5d42fe0ad8fc7df5621f2468f34cc9ae0466f5505a60ae999a5ed49712928730fd3c1802c913bcd191465862372106b6985228fae5ca9c8b53ed62249061940fad77168bbc98e4325c927e986a418b44882418b0c3775f2a682343cc1d273ce39653f74f63b44a1ce970064e6de72a2922a81ee776129dfef50f525fd3af9e337eabe04f2ddd8d0b574ec26c99ceb53481ff7ad11f95aa37cad103276bb8f67259d720a6e65a880045284598921e513a9863c230a4993d9239c00b7e48b0515de8dd622a7d9f7fe6c99320f2ef07ddbd4b32d3288046eae7fed17f9de5bc5faf1d4d9a2254a63044dc270ba3f8ba800cbda8f2e537a6ab2f6828709539bd2dfa13c2f8f7fd4b0fbf3cabc95095f23d80e7aa859f1557fe6ef33a971e16b0499b76fc525af2a1aa06bf6b99fb92f232e99313ca942461215e2a936a5934e8820688dda9216503eb529f85bf01390519bd275d0436d045f07cef739202ea867acf79b8f91efb54ee43b5a25f2b54e3df6e9e65769295f59539274fde857b47ef42ef2f530f2fd1e3e7e4b517ff74911e56802c7fce83697d812472cda205eadcaa2015b291248fdfb96a967acbfaad791efdb29925695a4543a22dfb736ce47c60de5cb09dd6b9ff2b54e6f6ff95aa57cbfab61b5c99cfb55c96995892ff2bdafd412eb90c7ae2a5b31f05895ae8521dffb160609c447d2641ebb0f249412efb79cc00ee4b1fb3d70b8a85817fce5f191706f8bbe04d8b7441ebbdef1d002771ebfbf8b751969eb25ea63429c86ddef508522f78d78227d1e5be0f95444caf78f324bbc3f0dbb7fbf222ad17dc22e7728cf0b5399caa786dd5b4d177c3f87091f69852bd09cc291fb17e3ecd3e15066f7710fe80e59221fa7f9ad63f7eff5f1db7d0f8baed4b0fb9e880afdd6b0fbd6897c51effdf5de1ee15a44e6344b2463f72fe8ddb7d9826ff7fbfbae6506e9bfef591a76ff0b65c354e22dabf2779f4716d8ef5b22bfd269294b4494ef772d3b9e4ebca950e69fa82ba220b3f4758e26494f98ae64792128c79c342535a34089d8b74f95d45cb1c03353ca430b3c5f8ae3e730447d67c3cebd1972597e9700335fb14852caa6fe8e5349cd1f0f3a609a2c939e0c71c5931d3ca02730744d5895c68705775d543064d139712bc1121c931329a81a30ce32c909142f0b273574558c31c3f701ecca32e98517a8a2e05696492f34b900abb24c7a81055f18bcca32e98514a0ace02ecba4176c46d6de961727bd009447f05e1b990e9624c2a4d27022a3275564c6f7c4b46a4a621569d2e3d4449193089e3ce0cae123c2e2d43363d4c50da52bee101596881a484fa88c90600109f109611183c833da01dfb08c3183aa484f1118226184ca2002c6a9a9880b3d59a488ac715bc125f2022c5288e012f9f284a5cb518b481a423c60e0aea4c9246ae64b6d770b61304b2c455de451865a03bb54104591918a044542785a8a7698a1a8c785225a206229828bab3a81538fea07a794bc26704a0a5418cc3d8102037f49a890c02c21bc2f708a036614610314cc6589a50819503b10012608ccca120b1161cc9e8b85082c54f7de6bd43169bb48f8062afd12ac4946640ba78ec93ceee4963635f0cd120b11545c2488b84ff097251622ac20e0055468035e2a69b2c452a5884ee250189eab7695dfb8ace2ccaf25a59452a75ef5cedd7a8a435d7a519c75b72105b994dbae7af4a3f74a59afbbaba494d2dddda5ebf899edb45a0e95c2a854b7ea3cd5cd0848505cbb641de96e38a4f8f176e476bba956dd8a855312b350acd6add45b319c04dd6fff92cad457ea2cd711da33e992a9323394fa91191a87fdbfcc5da957ea3460ffff8335f2e5ce117ca48f78a5b7237eab377aab611db91d515a924df23b96eac8cde9c68b01666d66d61013beece5d975f7f4babd0e339db0769056fa14a89456994790b61af599abe5468a0a4e993e677bfa28d3a79fc5f3bc22732825ca74469139aab62281cc4cc34cbf6d3d3bea99d44006dcdf4309cbde00083cb6107d3ad48428534a9d644e0b073ca71420a64ba745b4133c36ba5c3cc1a9530ab6958ed1a795b651c6b97b44c1f4a79529349f3e0862dcacee8ac65f0d9e601b1b09846603c8ecf083012d18884273e3b4ea04d31922c28f5d1a228f389d930e5be471274987208974cb42bd65cd863c8041c256aba1accddf91cddf99fff361f3e5f7fe5a4091c737a3f36f97ab4757061be6365fc40614419b265c2e9b86f9ace3bd69d84c176ce361a52f9ae4f963926e92bb9170f7fc220a53270949c0c4d4c99b51da1e63177e1b99e30f4e17f8f1a830f30d99e32b741e6d6ccac018bc5e96b601658ebfab1f771dbab0c0dd36644e8dcc7170660b1e69767f1dfc6944d6d33c931a931ed29db5f6e7b7fc08a46cbb6358a1d7b0f9ee3364b6a6c491659623b8642b8e9863e2ddde9e822701efdbf001ed9451e8bffff75bacacd613992ffbe033a9c5bcfc54e0713d9199a9d4a208273d359af03502cd830f8a4b66063070829e1acd33a9c94e80df6f4e735bc7e6cbf8952babb7aab7df5b39ad64925cee95c960b07f70ee08e9996b16f3d63e083d6bbd7d117ac67afb477a86dffa8863128f925178199979fb33a2dbaec8bc030009ec361971bef4f18102ec3fba4f94f73c94d7c32ed0a699ba894bc33aa4221dc1f0e6907b9a50d650a1536ed106ec825df366c9b3ce2adaf0902392565b224a151184c1012c3a50935b9880b8218d2d2978620352e451da7c693564cbe1ca4fc37866a6220b5dbffb07280aacc307acc34177a3d0ffe3e547a4ffc717f9f12d8edd03e4b1b9c1db9e71efb3fb8e7a4f354da69e79ef3f977af6bdfff4d5e379c5e6a8673770fc2cc7ace23ade7f12f5ece61d83f70c76bcff14ea19ec3df6cee39df6a35ccab397f578cff1f131ef8fc3aa79ff9d9e8134ef3fe4839ec9bc0be7fd47e89906bff3fe489c06c483777154f2d3b009a484fd7d1a365bc8692474ac9f6e200b7d843d421ce2841a843cc213c224610aa192908570c94d387b7488e1f409e74f38738433289c4213ca1c9a5126d194328b66956934adc420dd56aacfeb52a8cb3d851e84b29016ce42d9b10ec20e75de43a9f33fc251c9d5115f9583f601e2206c21283d54f3c3c3824081474c93de4e6af7d86f30dcd3fdf682724a71e99a3ca6efe792ea259396d55b259c85756b5d8941721dc9d866acd0bc3402bfabd414d990f222b28972630807941c2fff65fef1e30c5f66f1d53a7ebeec460783cfe0679e2f64c7c33e88bd940228cf0781c74b17f0b045040d5e15040c3d79fe119caf793e921c127abccc3e5e3a91fdeddfe0659eff3b5f820729007959ebe0656d84cdfed54f7b591be513073f39105f2da3c84229ff0012ee78b01382e0b1f91b84258424f80891f4c809bf61480d9baf41388fa66d5a99463b32086796790be715970d9882121696cc9ee964facc9f0914240465280a919422252d4b4c4d5c9cbc84f3a9619316cec20e42e926744ca88586a4181db5cf95162ab26243ba3550cfdaa77fdaa7e7c42448caf36914f8f3d8424d5434b610a6a5c01b9910256e2829088d3cda78493814e51116b494479d9d3ce5519ed4bb9774da460a2a6218ca324b1a439926cb2c6960c07e3a3ae07e1d57aa0720c0fd3a946814de4eeb822f4541141f016ef7e91a58d5efe008cba4a0a4a0a0eb81104f4f9c95a9a2454ba51ea4c066735a1ad8be4cba214ae65e3ac7711d17da1ff20108aaf008927b3e5c80556f42cf5eb261200d40f5bb0da2c04b5a50aaa9c2d7fc1430896aab9f482bf1657fd654a22ac41ebb665c13644ead3c88c0b69b335b99515daaeb6e7753a9542a85b2e10b26330e4c3af1b8c6c033dfaf9fa469aaafcfc22fe919eaebf7fa3e6f66684a41cab5ce9f5c6bcde324ca75d63eaf43ea19975cbdc8f5e795da755d67c51254a1a4ac053481a2e4bbfe4248bd0ecdf5950269c0b228c688d2f40303114da4153494b1041431bca0c74b2adc098534ac3e48c34efdf97966800c6520b1830c5f7029a2ca1a43ccd094431210175478429286d532b08e15609974834fb6ef1f4ffd09547f0ad59f3d5e7ffa787df93d77b7903523b0418b9727ad0c1c3d397a25d510c589132751dea9c43e4d5f366a409a992c65b21c5b59fec88af9d64bd68f1f5e65f923ce31e27f96ff50cce9f7c20c76c89cfe54880a633c644e3f176a10e2e4f4f0819fd5b409ed3caffc1177046c60e03004185d8cf182da28cb3e5041e2862ab6d4e07446ad1fd6f893b295dc594c7094bbc53189a4024fcf46daccc7a1529c3448ea49a64dc34ff6a77eb5c0239d3f49e44e63c5635fde742564fb32bcf997ef8fd3b2feec3ee58dd8f3c4b113a9a3e6ec19cdf487380d5fc98d27811bfb38816830f841d4d480620be083df81a00e0d0d0730c6380329d2f27302339e307d51dbc2882bba7891022ab8d8524bb5b08d1a90c6460d482305e32b69335ff14cd86adc82a798deb0ef4d3dcade7b6fa8420bb9da4ac3f1fed36822f97d1ce234f2913deb6cca267523e57546568c6ed8a0c22070d88cacd0d989965e0fbbc0d4dff91d0bb9de5cb95c756efdae437a4a1ce1fce998cf101ea751967df02971e629f74238f9a93033d8a1bcd47fd0b37182e1cc5d67d4dd1fd2b00feeb35e7e4584881ff85cae4e23d43432b279777dad5d6733e3fa6b3343f3de2763e37ab56cb46a5a27b4ac18f9289b8e9a26cda082450d55bc100516a629a563fe5daab0a006246630c28b246a31371ec575361d4a0accdd461c6fbe97132ffd78eee719cd7e61ef1fcf755af8ff2f71bc39de86d8f4356228facd21e21053a17d50004cf28ca8a466d7cb8421e410ef38af64ff56387a8e433a5a213ee051e67f5d954abd94e278df3e57399488fa9c5eed6a728bb2cbef6ad8b9d6d6e316eb6badb5859fc571dcb73450ab331f0f6286b2c41a8e7454d219ffeafbe36161f1e9f5b00b1c6d5a5f578f55e032f7adf095009a0f029c1fcf4a721ccdf2e37a68c416689ee63b9ab09bdf083462cf94dafa9698c43387c3cdbc7f21091df34f09f901b3e034a9030b6e988f58caf0f733d503365c307a923ce0e40363a9035e9a6cf7e793a2042a2f46d0cd806d9649514270449710a60353baae6b0464cb1304b344ca1275f3a5ae93925669a5ee6277a5bdc308cf4a2bedf62f5c43eeeeb4c18735b551654d550c9412ca2e760c9208f07ca7792d059402029240641ef2a64974e30ce7cbc83859b2e533c9521c67e6e901cb304b14f80ad37043039eafe383e7ebf8e0dc4f448ad4bd744da3f94f11e315f51d46b2856632db83524d2de7a18c7c8a94bb4dfd7a3129300ecfddab5794910442df51234019e52692235311b583083cbf3d94f79c29a09ac5bb76cfb9638afd78babf6754562b1d60f28142b4e306f4339f8082a4b8018ffdc3c18f9bd312d0cf91531e5b007292d597c9a65350d009495250d2b30c1e83bf791de2fb4f9f9e85ff39826ed80cd978af994533ef323f73c51cf5acc5bad2337c5329794ba9a6eb647f8387e59deca344a20179ff233d3ee7fd5da0cdbfec5d1c93cc27a020dbcfcf11251fa1f4b00bb421a104134e489282121696f438f1f9010a1282321485484a5115232bb623a42bb72c4a5a96989a3cd8a1cd3ad071e26072f0b2b039f8f1f4e747d83f0d14340306834c816940c403dc9c3cc6e3e79bd0b3d8cf3f21490a4a7a86c1dffcfc25e2cff0e7ffccf113c7cf1b3f6b7e824ff33332ae98160baf543f7f66994a73a67ea27ede9fdccb7c7c8f9f0f42cf727ebe083dc3f9f9477aa681073bb4df403cc0ed496ac9f39d36d3797f5928b34e286b39a1cc1a84328b6183131576be61671fa1cca95728b38dcc385e07063b4299613c42993b08656d2794b559286b3d54e1ccab5032651cdaec0a6b960967429a504a019471c29b69a107a1ac75d3938517bb4010e1c808484828c1841392a4a0848525b3673a993e3f4041425086a2104929aa6264c5768474e59645498b0721b8430b77661de8782e7f7e8286a4184d30b69f284555ac1c4d2f7982e901e30564c20f25ca0f074d83d4c99b515594fdbb19844e2a4ef10909dcf11eef994ade3463fef71ab9bbfbe833c8ed69023bd00c526ffe15c969ded3a3040a9a6a8e45e6f88f29af493764ff7a9b41ae4fc522815c19648ebf7b478c3529fb7b216ac963fea99bd35061c898bfa7c448bd00a2bee011b594ba651f5367647fcf09494b01795164f7a8c022bbb7458cecde19d93d35b27f0ac8699f8fc7fc8a3605443f1fa77d481e6b72daea5d7e3edea7c471e77b9438cabe8a238cfb7cb28f576cca7e65b83e33880a48faf0f7ff5a20814c5103d95519e8a00478546520fb7f484e5301a984b2ab86b2ab883ea4ecdfa30c2cf3a802cafea8a57b310641581e514bd9df0c499b5a64ac69069953481f61c81e43ceea83014e264f6a41ac0b9e2fdfba52be5d93372ea2a02a52fdfca0c58b8f0f8eea062c9365d2501a43e0aecba7658907bc9aa2d301ab9af8b82001104e65993464449703be59260d09f13d61549649434343425503f7723dd0506991e5e14bcb41a862a832d134154ef44e1056a0e43179f14ce2210b06810a238fc9dbc50046089a784fb07786ea07bcf2a28b01a3b0e0c2c02e2850559040350595223e2fb050f9410505db2cb150e9219585ca0d6096588e58c107663bf566f566f86a99235f957be4ce5ac94a3a4b29e2c89c172ac77a4e28baee7276d649bbbbbb274e968ff3ca024f18ad55bce99e2d55388ddb6ca7d57217d57917e67ddca7b2aa5545499464c99a10f6b2e1142ad592a398254e532a81d4d4bd18756fa36e5040c6304b1c4a518e29917ed9683f415b313306e582350c261f755ba1d14d0cf2973b5a2d2c83dc2333c91de7cdf0e6eede97cdaacc24777736755d98812a1c5f3856098f2f4f87ae6bd495b7af38ba73b2dbdaf6faad68bd5eaf69b7c3706e1ad6dedddddd4dbdbbbbad13787ef74b0b3c53aa9149ae338688149530ca42a5952ea1ae8f2766c9f5682865cea421f5165d92a9114a03da160b536ae4c19aba5219a135d4a9ea09eaf997e04ba4744a85d727e8129a53ae22663bad96bba854e77daa1566c9562ac62583aa12fc971928e08662035c1f4f8ca43d4b495855ad605132a7a62490633e1ed40472ab4503da160baf3ab0a6ae54f5e3429a6b58a103b897976ad9f0963c55a4fd511a4a58c5605c80f70ee824109b5aabed6c6e785302a97fc31f0fae466e78a92ed52d219c64383d7373008ddcae5641d3ee5b1397dcbf011dbe1fb9e5961fc8602203401bc041885abdd9409427361046ae1b2023570e3801fb4173b50f51f80073c2f3a553a65c3c172a40fdc0823a5d810d9429d903903d094a183e3091fdfdad6c4152a2070d64772baec840ed88d366cd1f49d3684de679314d41276f3aa9410c9852f959db4309cf9fb30ec0df8a1e7d1f3cb80edd77620deeeedebfc1135826031e71ae61fa48af673e321980337192fd5bf478c0f2470a85872318826020bab172f5ac854820433ee8642818af4b91ca80716252a452a994d4e999a35e860a759cc0b5befc88d45496ef1a69ee8cc3711cc7719ce4c45182c9dc5beeaf2c890463e447aea28e0f1ef0a4211299d32b271caee5bc79397befbdf7de7b653de0f9f75dc8fbdb502ec6202c7ccd6792e77d7afdbd70d6a6f743daefbdf7de7befbdd3bd7befbdf7de7bb9701ad9b6cd3befbdf7de7bed7dee5e213b3a3debbff5ef04424e1feefd13eeb5d75e7bede52e77b9cb5d6bb918f01c99649a29bd127525ea4a54bdf7defb92f3ebf7bebfbfdf7bbf9deef7d3fd5ebadf4d50e0f9f7e30047ebc269a563974503bec9dcf716496b9bc7982490a9a4c6ed0c3132f7b21ef0d84b3ee4423dbbdf3d378b1ccac518047b897be7ee77e1ac75e74245ce3d0783fd83a0735cee7227f692c7b8b6d968e980dbe66e730739b7dcd77056b14dce0499f3a2cc3951769fccb993cc71b3289c470dd3c0078f3adceff40cf5dcebcc1f094466eee71409843ef727703fa4ed733e3d1cc7719ce5beebfae66a65153c43308d3a368d903eb8973f732a1c9964a70d93f35ee9e3cd96fb592473b8d72006ec799c4521bc8cdcef8f67be6ec3b80769586a27eefb89fb5ee2be9b381185d61052a213a8848c99297bd4a1a101000000b3150000280c0a084422713092069222cd3d14800c77984c6a5c1a0ac45196a228883186180200000400000c014021a6688a032010c15f2e043b663616dd00111a3e9450ec106a14a53b608981707fe13cfa47ee92b211d5838a5908102a6736af064ec744d4c1a3a2626981d9a7a272df1be6ecca9f1ad5bec43e4d3921022dc3a72f9082c0f977a72a6ea4fc8559b9f568ca0f806b29ebb2b121713e9ae8e8152e4e79793108e87540eb7ea6262cd454a8bbc80510a5d937bbff5a3af78429dc39c48c1a82e6f66ebc04c43da1fd595eef3b2a1298acf70f02c50503982f37f2ff20c0f304e6cc412bd54f9a7f04c6230b9a74640b3ddad1148c1267f62ea1a41445a24c3394bf20fe1e0d63a0cff2b32c2397dac570774f504b695f3500bc78e0a69c72faf5e6ff79fc8b228cb99faa1fcfdda72f5e6c3c30870bf0e70b0ecdb4bcd780f25eecdbd7762ef439c53a971d9fc65e8b02de390318671bca5b04f599ae4761f5cf973c276b00be3691530c5d07f6d88fc4fa515ed018bdc3c287937b6e3a7a681f6da54591ac2ef23602a0ca76d12ff33e563f6fab547ad84b45260b3496cfdbaa4aeca1dc07b772e7a34e52db8bbd2f2aa9e1b2141a64f9842d940f41d3ada4222aca164871ca7938ea768635e60b7201f4b5a7059decf0be9c8ce4d6b6237ceb2e1f33503b3cfa6d3661e947cbed25549a107e9c691315508c6ee6419dc2f0701c2c82da3565a6561062f729ade49c2be429effa41c173138fc47a406408841430f3dc01096e1413ce6e6ba0a29d4e2c6471fa3702614ca9adb7dbb9999c65bf82c2bddb57cfa786f9d76f445c4cf0b3d562ba732b3b1b6067ebf35b76db89e18168238a651993d66b1c965a4b5d9157bd70611430b752b77f878fea50fa6f841b48faba58579c71f569ab87710a750fec9505b0fb76a24df89edebd38615c3b5d9cc81f9f25c087b51f07f70db9b76235449eea5d16769b6df46daeaaf5d4e5b916d79ac3b49daeadcb68a50027ed76fee3d201d6bcb4f23aed0bbd59a3d3612291a42da863229bb88a52ae5587423b1460e91cee345e09a23b32583e22fae4b18dac5a843e43746ef975b7797a1cfd5c570d8ae5184f2a91b4dd51cff088e9745bec205053f01e56ffed7c13f8fd7726d445a0a362f7e6ff25419c717b4d8e2f7d07f0a1062e004dd216d39bc063a87e512521e7b066c1cf24173803cb07b580b341908f1ba89d1a687fcdc0a1f5853f30a516a84baa2dc61e7501b76343400189264501d6683760c73012d3828017bf15554b34d07cff74b3fc035f4502535d0b8887fd9500b6ae4628038c8d540410c79700ea1a2a00fc7877f93f6d4c83560a7cc94da6023a9c226050861c1260e0cc6ea01c2860729ebf9052381315f5182dca00d31980e3d180322fa04738b2c622df9b315d18706c6a95d87e18d02f73a83505548e501d705e0738b103cab7030267f39049348505271035064622540698402b58288250f2848479483ee0930bc51d90e833dbc3c08d277387b6a9237763338fcc502ba80392a2b1f40e8b52b53a8039b382621b0280db0173ba5952228a043732d7599158e46d72357ca6a0b204fbfdca00554ebd29c8f53e1d7850f6daf81c680ece6b0f9af7e15f00dd4e8b2a0b2542963493299758574695a0c83ebcd166e3363f1205de1597097e4b9a47e009fccf1fa7e6eae0bb421220bdc7f9395202836051c33c8512f0ae5a614c74f93c255e9e4c26e55196495b22b04b1f9e7e38dc8ec9891293c8eb30596bc2e450966212a54efd252bfddd98dc3215d0332b0918fef0476295e8ab17e8d80b4cf105b6f505a47e018dbf40a88081afc080593000d93df862307074c1801b03032173f7cee6d4d206956925034fd02a264c680306566845ce7e731f00ca43003aec4e49306912408eb8993918396aa1591d495b504b8376ef8160a8a65c8764f3190f18f80cd8eb299fdffaae41be00be219f0826b3f602fddd1d50d20b3cd4bb7ffb1970ad2f30500e711a2aaf34b8f06d6af64c17fb29c4b41302971055a9aa4a17fdab51ac5e54e01de34ed644cbd12b2aeef1f42808585d69ba8052b3ad3135a19f6b950de632623bc3380f85731220a5b436bd3401e804694fce7a4021c8fd8dcdd31b90222bb9122eed5e5b610ba0d1048143c30080049ea2f4224095964187d1411d8296459b2f1b1e0e0d81d27bcb113f0728c8f9a5d4207b66ed7a6aa7fda084acb6aad126e0f42dfb740a3a5fe85b7f6986889e162a7d72020a547e9d0a645a1dfcda65af930562af6db8ef877bb3a50691cc666e4105237b6766b128457514ad13c38874c0d5b05151d98d119853ec4e482ca228019c6080b71498f906b0cf67fb6ae68fbf87b92ac51772b214cdc1eac6cfce016670063a3c7ad344eb3d49ebe10f4d1dd303afe43094908e567047cbc725b91b9d6fcd5d9046059b973f29c7589273182514be54ee0166550a675aeed81f5e4a5d00bb71590fb23eced29afefa065ccc4ef6061f746ec54a3da66d4e98451c697671c91718261611848445eee96e8a7d8925f357ae6c638c94b1e4bf61edb591fc1c6023e4654b614dcb520fdbac750994b92a97487bdd9ba29549c01087e40f9c828eb24573249837859b5bae22618a514c27c344c0c7e3f92cb5a0c4a4359b11592d8cc7c1cb97f1ca38de73aa4bf7e3674f7dafe16f79b2185bfd19db2be9cc8a75a720d4b7994064ebf3c5651c9ab3bbc1b1239ae6d6e420c6a7bd2c2bf6884244d70a82016118bef73703ceaaf7a515cf07ce85022d0b594dd19c10e27b8b191803947d0deb206012424f5b2e028ea37b31cfece3f906a8b361b074b65220741bbd7061ff1cbb598c9c0dfd8fd709637233da0d4e6fc79572430af672a0a3b2b8c2a50c16eb2f3b631da6494bb45d39430063603ecd374ead0fb5a8fd31e0473991ba37590aebaa1b63cb8dce78e376b5435cb36bf070ac9f7607d7748cfcb8ffccd18c35146b6ac7a332151bc56a7891960e688b5d898f341bf0fbfc956a91f4f3465b35bef1f8e325d6f01a3a39094fb49c401c1ed202ebc413f10d58851238fd1b801f4a59072ead8b2d9bd836106f06046b42020b1c47e9a1c60ac5375eab4d38e8d615bd375f5c7df38d01060a2e75d7c2dfad536284e741588c0a6e4519472fcaa2b7abc94ae1a1d851535e32230b6086e4cfc39e90238fa5665a26e674951bec4a0c482f4f5e68f3afa5034e687f336a1cff9ebcc335f9fc032bb9b325df904c05f8b2431a3419706478ff7a3c0e8714875c8744d6a86f2f9fe2a93c85f9bb9acb1a01e2fdb9ddde82a1d8019186aa4e891973a67a5b0374fa4d92a458d25b7cea08570d825070b6a2b2ae2b1b67f8298a0d7ee14a5d4278fe696369df7f4058e723624ab223e00f9762422f832aff163ed8fec9be6da02c41fd07e6d1aa21d97e015d38056b1fa090e62d67d355ac069780418b0f79d74c41c4aa6248fc7fd6bb5298667f9033d7664e9d210e72007b03acd8f742c8f72cc13e39299c0488e62b60b77918cb11b711384e8966d14b0ad509f06af7e0cc77c259390f3c70009ac31d0caf35a7ef92d4413f685b3eee14fa8f7b7b92106969d5991fde9e8d395658684d6b76411eae9b4eccc0237dbfad4afb897f856d2bc11a8f049d9361413e155409596d73827aa46e876d74375b0de3dd76dd3ef377ef66d77fc0dc11cbc33b77b821e3ccbff5ff77bc8ea4733ec00b2f65fc9ed3ab129e7c69676d766ef158c0ae483bbbbbdead3ceebf71c5405bae14a4e73ae4cfb209c899df77f964d9780989fb70d2d3a6d0922ea435d805db8dce40e9c7f67a72955f9cac3aca78d904655681b77902e2830ce7dd6e063589cdeba2ff9384232e1a814c559bacbe9281965011cada4f3a7ba73e4c37e737f5890aa6e36f979c7d74477edb5190f839fb6c1666050c3a7c316f27ba6775df14c509496caead1b858b4cf3b6238873f54fc4c0f5373b40702ca223400c856c4ae00f7a193702d03da48b31c5ccbcc9b866b520a194acaea048bd9ff70338085234ae8e30df7b81c7fe917bf3709fb74a40a66406babcfb792130b1003ea0f84c5fda41cb0e829c0c570e0a79afb3faf7f3a0473e5dfc34df164f216652b9b9a399387dae223b0043dd76b255c75078bf5b3270cf8e3f425194b169cae2230d3d353138594c546796cf90286468aee184ea731d8d8cab47e94baf744bf4b812740b16b2f287675922058a2c7ab17cd0dc886d212325ed10c920b9d327291c37420c22f30f2ca150427bcc60b12a35861e9354d6dabfc4c0f3e49701a98f36413740b57c26b29d5a46339474ce86bb7c13dfc476414056fe4bcb5dc0a343f96c521af1725b3ede04bfe7dee5b4b48ac065af3c07ef630ef951bec57d6355db072a68ae89417b0db6ec042567535aecd723054c0801243add44bd170ae37dd286c961bcf79a3aeafd5558a4a545da7e10fd9587472f5fc03f4a0ad32c69455cebf6a585a261a9e73f3409dfcf79288a212ce5be9cbb54f6cbc191b21868a7b1854f929521ff086234090b0b64187e89ddfa6a6918ef047b5860bf3d04917fd3ce7f83838fcbec822170048fe0c80cc1b3cbfa16201d6a332f49d35e5ff85c25efd84a065e8f8f74a2a40418f481966680501eb16da7275e5e8331a57b066864daca1394378a2eaf36a00fa0bd2a5b26384bb070a5f0d85d5c9b620657eb96a80b14087f085acc7ba31cf7f68439c0d5ecdacf2bfd5213cc5a07107c7c3aee6b182ae183eb91502048bdce63a5faa0f6c377b56ab1ae63ebdc82fdde56f4ec6fc86135f8eb217282a0565c348ca3b7c824982b0629e91763aa8c8c12e3aa81da7122a927b887566f6d210b4b3afa7f4aa5ef7952b96966afe87404bcc192042558c4f11f90f80ec19d6ecc8b7250f8c2bf78b3a94b299624887fe8286178eb7f0d75611f1b3f30d50eae041c862f780232e369f30dc210ea8da993a79e8b024ca444fa9c0e6269618236ac4590d5b655968dd1cefe4a15ce83542294ba9cbc25c24f93f0856ef4921632b076fe31247822e3b8be26454821b9387f0ae172c065172c9fe1cbd45b24e9c91b8659b0a9fce527f6411ed9a4579fdd4fcaaa114214fa83cacb5d874bc356073bd60e718478ad00e5a69aa578aae32188be35616bc81efa4bd3ab6682bd9c778a8da0c1e6aa5f8a624ed00cc8e4d6e88297ac90026928090f428dcf2e0c99d2c4f030f80207a5b22651d8ba37df5f0a2914c12875b26b58510db3064c5a001bd6a3779bf0947d8f08522fbbea453958ab9f0b27531922d20d502670e28e599603098d2af981e25a5ee553b238b57d3f9ec4461106ced153896e5d5c55598fc6597bb9655579fc95a26144f550dae2b16ddda02f82b71954f82ab9363ad992a809a1ec0693f47db544452a36d8702a4f1fad8d7d9e4f3a556486918b019fb4776f4210f33e95a9a7408976d784d13766241879a2787c31357c532cf96b5f8011482d287177b5893bc611f074d90525eec59aee59a1f9897bddab0bbef78ebd467a2a5d094b35828f2f9344f9eeeabcf79c9a9779c70353512eed46373faf7a80bc16f0ec0380e3a384f4b3f4201c89fa569b9507df10433323ba2170ba98811ecdfcca1a3b46a00cd336a790e4c3a06eb1e5bec8b686304408a5601679d238aa55383fc6205aae1eca82ceaee4b97c304c7d2a5afaea8aca7a78c85668a96756a5c6dad941ff87bbda259cbe11f579eb39d6eadc9b19c76cf725afbdf3e2de5efd2ac642ae36a485f8b2cf4eb7784653fb4af00633af6422b000095f37d74a3749a64f129067716bef229b04a5250be8217675d160fcb12af906112bf5f816b7fb5fafcb45d6410830edd867fd68b0d496651de55f9872957e525fd1ffebfb865e26dea3e35abfb22c90af83d47927701d7c0ef87a69b898af56763a2eb2dfb91d2cce69e771a98d315524d6520310077c025aa54093283deca415357917180a9ec5099d27f17b6c316b3f669d07f68610fa2058ce71c1cc0e1303da48dcd249b39ea9fbc5a43ea08fb32f95f8e3c1eba90cdd149dc873953448c14bfbeaea48de5a03433263ba48f72a880366e7af8032600445d04690415186a32073ff661041a312dfc128951a49fdb140450d983eedc8570d3566e00094f337ae492b8aa2245f6facab6113def5ad708e873b9456ea261d97d441a8f72813c00072de32fda16b53600227154425b6d47156e1f388dfe3c69214ed22d5b101b1a2a5da78772e6a4855aa8563aa325ba51462311e5879d1a22d0b820ef02775f0821ff492dbe4763f81b143d5d1b03d17bd921a0938265f2f94cbc1c9868a15102abeece3a7dcda1342a122ab91a4de5eb91cdd0789f07548fcaa6ecf2a15a77469f509d0ae9873c12b85336b18a556fc68845ea46261a0d1da3607a61d3558324d02235588aab44b3d2bd012289b1af386175d0d6d9c1786de09f2bf22a5e9707a5d00fd0dbf9568de839018e2ecb724153ef2c4ec250e7022a2bbdfb5ab2ab5e11fc41550e9978a855a44387333332c3c3cd7ab590a6db1d46c059b00a36a12cc335ccd9850f4b11a9338a2566c294d214530019c68b4994e77e6e5fd1d3b027e945c7870c9ed60f8365a9763a39a0cbcb16b22795563b89b396dfd36a8d9f40c98490310fe8fe2fcd1ba8e4df4d4d105218b648ca7cd8a10f6fc8d77ca6059b3452a0874d8ce168451cdd466556bc02877a27cbb9ed2e704209fbae53402909d3e239562d991676f03c88d02dd3a11dc2431f69a1107c126ebeb11116518f0991130fdc06cc4b770cbec7f928684acbded1d125b6ad1f4c43ac9f4f7de8fab8d5b662d073b90abc9ea8df5996cd56c7084e75f2e2e2e0fa96173547945772a685d1a1152156ea7e84be772e1b72fef317b38c96a4eac811bc39f8fb95dd14cb502c3432cae7208c908cd54cb6c5195ac3b3fad1c550eca27ccf706b35d1f3e16bd5b0d0cffa8d52c03f707c1b00c3a84ca96015064e6c5094e5d7ba5648d7449f606924363d22d476083811ad93b30d2990d2dc5b00387a48971293841af1074f3998a9546deea70993eaa0667c4dc56de2f998703d2a1bf693b0983fa5112f64f8e0dc50e44db193bc98b60201cd093fa390cb55096f33473c1da7714764441b95536b71b4a250c07d2b042910d007b1df5e48510383d3eb0c34ef3e9b6c3826ac8c99d4e2d4994b64a8bec9ddc75b4691e5e220aeb8b85f6bb4e118606cc26843d61093145f405b55a71a185c572db032e0b77af379d6131f09b809b2b3a031fcf2513dbd6ff507b8932f8d169d9e634c7b72e98089e3e58e76e3b4a141f12926bf002075ba06358ee5c570050afcbed1eda6073cc6f09fd7870e2cbbfc9358b635795ab62c59e1faa66834888b04b5e8876112c42ec837c6ac5775b00aa0607a7f74083d447a2aa9ca6cdc16916094997dd97142dab77ab03ca91f362b59394867a6b9eede77f031cecea8223d580de27a10304476cb40711efa3b6d5d8dff92b4c7453fb340bd55a46b4615071ec4b8efd8d891f7b0d60e5768931ff1cad4006853736c5431670a07eeb8a8e0726203ada89bc158232c086b75eab191a8aa70b8a66817efbb4f3e8a476d65d094bcdb65ab68d6a41229119f430a5103ec3b433327ebd8a277b94cd23e22a8f84c68de3a05cf883f629c875f5a269f881594631034ad4680dc5c3a73c44078fdd730b1a54ce62a2ae2ef6f41c6529565701285a2bd66d129f3d5afb526bb2d25e8cd385ef247727e2c3bee118646d13d3e95cf154e0ed996f0466315d2101c554337cbda6868ad5cee5dc72cb07509251b972275bf130e4aff52200f1ef7de9d105ddcd00240aeb40f697d856443cfa826f1ab6316aff508dcb7deb10bdf6c5e5e681b57ddb4c682ba70263dd1906ccb39d1b849ab345f39125934faef4e6dd9c5b95ef58585161937db175fc49007b8c1ff5eee15e036881f8448669c01a8bd3e5ece2e89156e51277e889d72a0d217ec3174f2d0890b0d2a3354fee98a072b931b5207d625f4e37fea0a422c91a50af897f3298849f56d941c70553e83c6ee0d14eb4835ac807cfeba5e46143dc3e7fe6d1a88a5e0d5425ade65f0ce14e8696354fb99933e9d3c9f27cec07c19321ded42b8b47e6c98c65e387ddfe4103644a1d3e45fa95add79f760efbb4baddd32645216e2091dab512a57a520e7b451970563eb69e81050cd8b4c722a6265c6379b8a705f989c36b5e681c9d8e79a88e89bcc47e52702b4b9e096b745f0ee58529de072716da0838f6ddecac88d3313b8847c51b3923755fa73a2ea111c49dfa43ab8b941a75755f519b2daddb817db332c58414515e0b4ae09ea279de47b553c55c8d2dbd9a67eb35550202f735cafa0faa09d57e20ccfd6f6b42b20a39b24a169aeac99e0f8fe8e78d8bc153eccc5b7eca34474063bcb16ea54140daa2f3ac89fd3b01b392f6276f3a476ab30eefd604a54ceabf54b477592f221973e2017f3c6dd3f607dab13ffb9f233eab3465344d2d67d97654b17a629e7f07d995c07270bd63ba8cc08b3adf3778f1c1bea2f2f7aa7e709b4eeb23274f6b5405e5863fa73781ce899275568444630c76292d623c01d62595f527f0a5fda25bad131ea6b5b34628a67d62a0097d12eeb3ff1cffcc92a01b58619c3967b448373a501b7f38e2e2b79017382e0a48743460ef510597e1d88b1c4e34d34c0c6140fbf432e91df8cead58ac711a08576ddee3495434f479d6a9c87dd1b767ebbc97858c884f7a6467e42598159571a70227079bb6c1d185ed861683eea34ed1fa387c7011a380d2afabf44206869423a97b2b54db761f288b7715ad6535f2245b716fee4342587469f3c699df2d4efd72ad67f5ad4ded31b3186208be67f72deb2950b4d845f77bc12a3469908e1838934ce238bbbd95f58f423cc08e2b39ea5635be8ac09c70efa0f06be41cbfa1a90e3c8ee051de9afd5940767dc7ed77dbb6feee78a931e8d630385ccdb9c7c7fda8bea6731fcc35239b85c179e86b70d8f098452f985b557a81256b6cf49a66a6afcfa4e375efc4b95c2bf7f0f61a125abe473996296662254c63acc5eececcaeb93ff3e4d98d5fab3fb87eea0d63ddd0e1d4655291582c9824199633d05194be990a83919af704ac3185ceeca7504877d41fd624bcc3b5ef11d17659ff6d56912df3d8af4959e75fee0ac9fed0fcb6a494628ce8375dce344e73c2dafeb273d13a8aa203642fd9b8e4789cf5e68df19bb93232037c2098bbd4880c155d5c979275ae021659b54d42390b4a666ea496818714ae96d0443530e0d4f5babc5fd647645dbe044015fc8372c03741eb89a036ba4c427b65e2621693b784676262b43bfc945404a1fe07971ce6b523a23a395209a23732a7175137000651ae9f168ccd5d0c5ddd92da9f38e9dc5362bac7242657ba62c446ccf4738323f6f4f6eafcbe24df52e98ec96bfe87bcdc5fcb5a0bbad67eb1af5773a3ef78183d48d8aa52d779d0b4b81b168f3b67682c985bcd20ba01ed01cdbeaef04baf56d5d51de903317f24e1c2a5ccf5fa9dde319d43d71fb2e07cd7a3ea9bb94682430300f2faacee207a9dec5bcf9f3b1fa2e6771876c9421b5209bb4fa7618a5432e901df7afb48187c1da5f673d029cc6467d7c1027081bc173b04c74f70653776e866469f7423a0be3d660b29d9a0f70ac9cc78832e0f3ad408a20fd1de6825cc20b24991f4d013da447a890bce0b389417c02e63307c097013745bce2fa060e21811e6d09c5f5aea3089f07b620a89784fec860818f5940669faba5e7f47d70022b68f373ad0e7fd793482bae852cf491644703a7047e544ec2b63c13c755837aa9eb9cb2163befa942596a805135a8f9a0b5e4e562c7f11f02b1f8efe2b2180d82eb76097d490f910551e5f6f39541e2cac1bbd044fcd94d002fb0cf117d84298690c08371aba0d7010bb34a4d2a6d5e970130ac86903b36dea40bf056bc2f45d9c6e6fcd2258aebd45ca45ec70446f31b929c1d928c55cee95990f5b725cf224c8720702762c6eee19d62685526fb9c6f96e767da50ac14084b3d26bf27ecd54b94276f0f7d391b86c51f1130d40442baeba68b47f6c75f69143a15d179f784c570c8607cc6d9a82d941dd8e85dcca3ed4205791ac726bc42a870d56b9013eba5bcede56e5e4b68dc15b3b94716d55b9860a6c35bfccf70ffa9384b5fbf84b5b20d1ed29999175064e26157698a83455ae77e61f9c37e1aefe9b0d460e2744472fe6fd2ab7de8c9a3a0a18af22bc53108ad92798900db425180d43cac3b3d7d26abd5665d220a40d3494acf044f62995135c7764cd6076c9614ce5a45bcd6494066c5c8f795a7f5ea93600d63ca1a99ca9dae6a02675a99ca5eec97205079695a00e1ebebadf727a3e603917ddd3fbc1fab22e678965f856f0dc509291b7531bed4368025b838406de830f0e10e2849ad8345aa3b49ddcc61f16280289cdff5650b017387ea5ac1cd544b0bd59badbe6bb00484fdeaf032d5a4db19d0e8caeddbb81a3a78e4f1cceecb9d739502bd7452987280d0ea11615a0f9c1ad79782c33109ecd34f566012fb43eb527ba642479e541a6d183e076a845e477cc1839dc785ceabbd1ee4e2869c0de8c0b81832d0f6f762b504581c452a02d126763d6c73f6a760dee8d27d274d5c0491a6f0de47498aead80fc0a16f9d09c5569a7d7877cc0753b309314d13f4a4b52cdc847041651361e63f33c6def9e3999e324c8631c6b78e449dc57235163081c33952ba2ba317e5391c2f133c7dedc547684626c073604996fd5816dc6ccc3726093740f4ce5f76bbcba1a020ebc45908150bbc495673b4524cb7141d5afe97f4dca0bacef6908bdb98ba6efbfc3fc4b3a9d1dd7e702d591e7794d987e3d195107d3ac9311a1a565b5ef9ff299b0334424d803181b3b73e15397d6bb1ecf3b61ab4491b4d43814e46188ce83c1ab27d449fe881c2bf4e60ed2496399ac71c7c610cbfbaf568c1a9e00114050c2acf13688950a7d88e61fbf4e9be1b9d714ba73d069526b7324187dea81f99f4eead20970f8b0dc3cb590152108d16785f8138a50b0846cdc8b3c88da7922b4198e26178812a1a094545435ce5979479859a2cdb5416cf3cd5541d8fdb415355ae8d14f0dce1c7b050f8e7374e1f2100a5646b5ac1351fa1492f911d2c92f0682e437b469e89fd5719bd60cd270fd48da777a042728be3ab4101b4fac83d67b5b4c5793605cc34400066aeaa602b57c090481fa6d2689c224a1cb8e2f6972e88fd2396f2d155560bd2993a88477ba1ac2de753f0606b8ca6ef4e1291eae12b4764f216be2167ed4a6794093ce41f65fb88869202a74a18128bc2257c89dc415968555d7fdfaec41302db5ad417fa4e66d0c82f6e76cb3c73d9c24e4c2db52db04fdbdf5f3604bc3d27b4171187be7c5f1e04496e1f205fdcf57654d46044ef40999eb75b9a02ec21c46f5c234cf8ac6425c1f0b0dd2667b963ccc885ca62446ffc2eaf8b91909a58f84fb578c24e71fd38f08d59790a974d6c014f53533e24ab400b5122836e905746cfb27dddb3f1fb77ff19f17b89b9bcdd23b325c824d2062180a4c7be16dc08cb88096c7a10c188431143c6faa4be887038a6318a18075fa9bdd042137225ab05cd07b83f96f1f57c740b19c323311526822766a22a6f06d60c1b4d0dc1cda9c292ad3fbc7b1442290d2299944256207841f7d52507129074db0902a2499e901ea19ef2010bc95e37b7543fa9c5b226b71481281845fd6a70c6c8c4c5e94001068f7fa26e0fcbf9fe4be43efc4139e5c9e07561894166788e5ce7617c92b7c8c667469f5e3bdc132b3401481fb56faca5c8fc63b822ada0fa7ccce79c95a57e898e18a088707c31a94e4894438effa736d4198495d35050897110b2ab2b6fc5a7ee84921b114724f4db0c954f88b6fc528b560e96fd5c2d02e6523fc3dd0eb61ead13f9961483e7d34cf20cba18f18c4601d75de7cf5d1d417bf850099c97f9956c745556fc3cff7e3689ee22f2988d88b3f6c02a5df2a1572efe92085bf1e95a6618067d97045261d68d7ec3d99290ff0f20ea60c54ce9b9ded3377349187ef7d177b8f1e8d0302a1e0f5940118443998fe6e883f08c4c264ef0369de4169033374e536d58e99114284c031751c7e66dc5802e9dfde313ca50e73e33835febac9ec10b094691b106146116a4e7e212b03587e37ca1a21bc9f3e5d284f7b3138bdc8b2d938cc4ccdf19903cc7598717a5d92930253727ac64a298350a98116ab3a0bed21a7e7ebdd7da16d8c0b1936a16cc13ec1ea6a25bb7a71b27f38c54052eafaa265869d0ffcf774b33293bdb6f85e019f0b27b6a15336c3c53096109e8cd62ce2ab87384b2d1283afe48eed6e4334462d341e081d2964ab4de036b1c35e8932a9db2453cda4d8e157ca44e6e4080e4158d64a3ca2a7b259a1ac23cb7147f2f3b05e6396a63392f9ff95858cd4c9ae5be1ea561bd63af56d93fec539f935c9eb490dec111595fae1a58b5dc4084af31d7eaad7e89cf547979a0b787edcbac125927dfc37b620d0ca846ed7de1debe6c9cd2ab5e3ec3137e12c097e47a417cbf3e2efe91f3dfba88f83f9650f35263333f20aac1614d803f1f10944b4fda3448895183dbc4610761c267487a174221e631d24798a3ed9f93172411b61f7518aa1a2ec4304a10e2f663bd0ba3331625f21bfd26c5d8fe8de08f16bf6b24f3bd14b6a8a60c49ac89798d7012231dd8757bb919f7c285f7f92a1d850e7e41125ce35c11c6709d5b02c5f5042f578cca409ba130b41903aaf004779bc2e9e8de875106c036faadf417ffa8f0ec5a72499f49b1fa56289cc596509c46be6ec2a2117a0f2079b1b8428e104f74ca48fe3c4188d6e95d5813b2ba68288139d9c210c6f440c0c4dd409eb3c2ccc08f1ffeec52b5267a1367d1426a0c845b01013a9618f0a04b92fe625c608ea3aaba19f5725a8ce2546fd0b8d97ace0e465900f3401a4c6b6a16b4351b8da5594a6ccf490b840567569e82a034a57c1e0502ff1463b65cc230e688a70571ea772e017602ed409ac73f787055403443df5158dee23ef268198e1b41dc7d4482c6caaeddc8434b0066b683656652d23a062ddfc4b15b6e888585f027c2e7c663fd7987cb21c8c5c27d928491604a1b455b39337442acdbc365b64e9b6ee628cf606e0b8d666d5fbbf7ed0d93d6d2c9d5c15d72383b8093fe33d91cef279aeca3f7b5665ee7b8ea1882211316f1f2e32710153e3826b843f6f2992d20aa5fc2745d224102bf143b5e62193033d3cf916f5673ff325f5bc7f5c07458b396144f1b9f765bb7f2414ceabff37738faa902f1632e4cc083329a7ccdb086f2ee250465b91553c42f2d84f35c6b3e6a8c50c95ae1e924732c48738ed5c12ec2b41e71ba7c6986e5f0860a8f833641afaae123814dd44c7bafde05c6f112a026cce74169971c775febf521dbf9f44a31674aaed4d91c7bfdb6163e21984cacfbf334a026d27dcc64aaeeb1a869dad4ef241336ef59c07831282892e211f7dddc56f4ea165691a0201da6e393b72f2b0738b4961b3aa06a3df27585434666a07df6cdb45c1920ed5ff9198fb5da3aded02615974d1217209f8fc1d9ef2ebc026dc9678bc1dc4820a09b5a16f3286f624a378878ea8571765a30498107b9ed9dc76309fecb022e2df0106e2447621f8d4bfdcfe09d09510a332f6260a091801d63de4c48639c228993c8ec1a9970df053178eae81c85fd7a9768ab518fe80c0246a18f4eb2a7ab516e31f190299bf3cd1a107630dafabb87280feddb2a5af9a4944507c3888ae9d6c7a8e02345cc563e8a5e1b2acf635c826586be50c702460565252fb5dd8ff39ff62686c9ba20423699452c51b8035d299fe192c7459218a4fc6df03b7dd5ce2cea934ba9a1ede0073c65c415a1451c7cd117c5148db4013e3d38c46c13e9f94ce4707541963d2016ef46f48610441c82241c6ced0a0e8b13508107f406d814667debeb030da5622c02a5f30bebbe85d935e4261e85da977ae3630dcbce900a9ba65bbf6d65b83a6a367baedf8423c6aa7e81af8905876a2afbebe82aa657e0fb03d45516ac60c6ebc68e720f49ae94f3f610c7bc2acfa2e6d0d9853e131b4f4ad6883cdd5f3ba9918898f98913238bccfe649818982a0216da9813444cc06680fc425fc712e363caa1ff567e51590a0fc700f4347c024b8cf5d5e4450225cb0c0b3307839bfc9b916c55d4ed142fd178eb2ce7ccc7b8f15429c9ca51b860289283df85e452bdaf461316290d5136d8b53b310d2b02802de40be0c87544c7c5beea426295645e01cbadc66e6b186b88c1dfca0b34a2a5228eac8de56382e8987e0dbf2ca849295b44d7a9ca081264ef2368bb7f1e056da665a7e3049af745b69d67eb6beac26b649f3af1c6454539cf0d0bd06936324e9c31a1cee43a63cfdd1b4a3e317cadfb6af22cb344f0c90a8c41280bd9229709f57dd602c8ff8f12e6d39bb07deef25efd115f8ac178c653f5bbdbfdd799dab7af1acc2ca1685daef3ca7abbcc5c9f044fe91eecf5d2b449900e4e845edb1d13682351b9d29f492dac69669f0b2cdfabe49005d5a0894b7693af4a49ea79c9599d4de80dbc90ddc210ed8878cf46d01c9fe9c97e8728a4a7cacf1475ee7af718b7a11607655909613e06f9de864b34e893e5638e16dd2ce871f867a25a4e3cb95252f2e96b71957628408b7a26c89a9b9db1f748f8bc3d1807747e614c656017f2afc74f031b2d9b26d8c2798d3996116be2789fe4e0583e98784bda41c4cce74cf274f09d08ca9ab1a88aa761c721805900843be698278f2729e3fd8eb9d0ddddd8a615b10bcb61dd39b12a84f715cadbf33d64e249e3cce4558c84ef5111a54b498e8a75c4c7f29bdc688d351a5eaa64622886b2d9af0951ec69912639a8830ba3b470ec237fb82908025a976bd821941939a5be436ebc76eff63683e4603bed6a01b813e6944b6f369b2a969e2378df20922ac9f3c045421869b05acaa66be63c19715cff7fae4b1d4df4b075f7cefb55c4ec8d8d03ee41a2f6104ad77a3f12c1a1de2839b1c80349b832d4a87eb455d043f87985fb69c33637a09c6335f7c6fa18e94d5394b3e709a9f98aec13a78f327450901fa873656cd3001edff913c612adeda9b2097314bd4ae540d20be833a2ba2044224184b9f3837f6de446dfab807110b49a3e8fce69407b31b4f66119feb99c84abc9772552f35c4271198256251764ecf0f78ca7a43418d7b23eba54fd32cbd788169d792c83848a6a77458f3f54b0d3be86ad52397f2fd665459953c58c02ffa15b0356f6f2e8b6140e2e6d31639a0fba9f1e98be8bd7012c98b9cf2300c92d962f2fd76d4a1b625d27cd507f0cdcac3c1f65d6a3ad4f644e1c2d97ab954201dc6d13cb0fde8d8b1ae56eaa422be8a2c44dd9ba8d0ebeb30615650633328f34402cef4b3624e610ac5c318f8636e77aaec7b15384a21fc6e816d67812fd0f65a2e8788216b4ce7b80537bdb029e2f748fdcb3f07e6618330ab5a20fdf8acc6aaedb52b7555af6e9609dbce7ca6eceaf5bf92f4dade7dec08246074d9b55a898eeab76f810c836e251dcb955ce86a08129624ace721c4f6603c169feef1189dcf8817e3f765a4c376426314dad41ec2a2ce43202c41a38939a331ee48cb0cd7d563891bde1cfccae0622d0a3211c5d2062ec1c63d7c50a40c40214e98d202ba050ab19760bad994688175435f0ac785dc538ac6c3de9f3fd64d43b1a69cc06e34a52b7ea6c3b813255702f4cbdac6e86fcf8aa2b365d33ddbafbc34c2060bbbc1026318c0432aa71131d0e28b7d490a61fe27fa079944c2258e303a94c3f4e9e60704a29342900488edf8955c67ea133151c3d16efca7cd37964a365f6256e4087c95b0aa7aafb40467dced36a1421ce38cef3a211d8bb4ab4477418e097fbada86961e95c8d509e1369ebdf86daa2a48559c908bfe9445c9964864b192227cc69d919234f2c50179007fd0a4ebae25812701c0e40ee13d1743a44fe175499da9e923e6f088a51f79b9581cd1220a4035cc6833b486bc75d84345106e469250e0193739a8e3973e7be328e322d03c01f34602bf5d22491e93328add999405ee97ab863077c95c0a3e36c3a4010ee43261e2d85037677946d108780917185f9fef6ee4c637a04e84fa707b68ebcd9bfe8456dcf99786d91d0f8f8cf1125c9032b5107e11219d659374ae81b9255392f0d7f37e006be6465a441f1ab26205746393f10f2141db6e2a81360aa9b2c6f9126c1cbda0f2037cd81f77796c31338d122e63adfdad1336d0076d50cdfa29f0c04d55d4caa23a288cc18d5c620d91380fe9a64ba1e268fde85729caa764635c323d2363f0804fae232d7358089be473318648f42e9a6c65e22ee3dfd202d5d83760cdde96110e9ce01b1f4196bed8e6612a13510999106d96d97719c236778daec3103c24b10a1b5b1ed87c0964cf5bddb82d287d19cdb91965f8d99d198bbfb7f3d83d4f2d2a4c9cabb8caa395a77e0dadadedb42949b697901af7483c0726a1853f555b68d7a261baeeb17a5cc344ce7aa3cb7c3428250d97091211776a3a5cced58c1cd17137c7bbbe211c89c26500b40d6ca64799c15695f4774bc469fe1b867d0fa462d112abb1f5ee88ea414487e3eab407f3d7afd7caa8a7e5fb619f36829adba76db5cb3a47afe43534b4685078967ea6e24f90a9ac654f031aa9305819b3bed2573641d74c3a3e1f7331d3b52d0fc4551a9475b72ef473c2f731b0af2cdd958c7b8dfa2dd0d6a20156c64987763e17982625f0a8285d89a4b56ccbd89372c70cab974a494cf955f6887a9319d6262c292c1ce79547ba4b334a4eecdfe82d92a541cd4ce7b4cf5f323287b95e191a2e1ce982de512e3f519c23f19bca26caae395144bec982a82ed3ab05c7409994eec9e9e85f119c3a90e2fee53d348f930962b08545dd7863b02738803de0859fcc182a7d56a00e461a48627584b1cf454f997ca9fa4a712de038196769384d157007df3507cdade7e98dbb17e4168bad472b64d809b9a17e7f7548b8c3cfc10ffc63c34d1828b73bad0a7d89c72a3d1af3dfc376a0c739a0a2fb3ecee31d2acac1f981cad08f21169601a27f9847251322156277c523cd374c4134c90b7f3eff6130404db408cb766a117433f94a83a84fd891ecded49c1fa5649210a802dffacdc32acf58fc505f2acadde1c003ad7e9e0ea34cf35b2b07477dfe3ae0cdd50ba23274c08a2907f8e0149bd910b3044f876c70a833e13f4b2130a9d3ecd48c7ae3ef3dc0151f4cf4325631183d1cb2f56aba921fb57140c18e07f2eddffd342fdcd0c873eb9befaa0e7045ece2462444dfd5584288fc57111083bcf42e7e18bee4718b4d7953a903b93871c40e53db0797e01cda917cffb07d7195bea0322384350d6cb8eac0acfc421536b3c0189f2b75fc9c4e8a043edd18a3671fb36aaa200afbf04f109172ee230e5cad9e173cee39344adfb3221dded00638c8cb0f54417b97053aad636029fac44f1be975b686057e8d9d7872b7703e4f2a13ca621b48872c3e149535b0573539e19fedcea0cbaa0cb5e64b39fc29fef80f5dc208fdc50b9f30787326d423134703bc91941eb52517e8f6c559ddac6a84b0e4c95c9a7f657879ec8aeb21200c016e7ba34b313c2389d67d63c20380146225e4402ae6a7740d1da9b8d968e422d2c475a38fb5601deb54db034a466d69e5678a68fd3429cd7eab3ccc31f51aa8d46811a440217034a2eaf56aa4182f860f3ced08ba25651b9a431f446912f59345952cf5caf444bb0990677aad4e81a2a733be4319540509773471f0057f78edf50bdfa844e40ee1b9e8704e6e340e6228c29e0f0e62506062e7cec052110e4750abfe6e0a28f1eee380653ad1dd2bcc585f0f5122d5ae057fab514bcb75327450d5b5045b0ebf7f3515e6ad327485bf91514279e308852d0387a96adcd21fb8435c7f3d33c2315cfee20be3a4f18a337ca07c05821d8c498852b2d9897dac6d001dada562a14bc6af2906ca3293922d645a1c47e415f800bbacdf2b39c12e80ef5ff868d7b56a624675e649638b80d8b536316d2b42fc000a57854f8f61ba7ba3de914f842dd5388ec36b357795ca64b913946dd4193ee26c8b3b5325fe2568b797e637c8fe140c821d5cd8418104c4898048c63bcd5d72709ab9d612bb3fb60ed706a774aa2ff493e41b5f1ef1405934300daf5b46ab7401eb77fd748b8dfe2108d34210b7f31c4b305751c019e9466545443a47d3820f3923dea50689343118bf1897fbc3621d1dfa9bebf2c83fb9482980c5718b8e580c115091d1ef937edea01e81458100679880ff9e1b4f99fb9a244d9a30f0c92dbdf1c3bc8ab8e23ab5dd58ddcca1afba52b783cdcc3e3a6d89c16a59e08555713e5fb0c9ce7d9a09fc570092385ce6ac9caed66db73d08f46d8729327ae54e7eb989baeb3ffda6b830e7b95748e351ad34985fc2901929e924f2849613cfc97994bc8bf29bf418ca48207a6f33a90d44a522f2f64e08ce8678eb84b80d8342ec48418bc7a5b434066cb7c5202b7a2e6cf422ada08ba80b6f392e723cc41b6ab124afd8458e8a94726ad2480e58b891bb383df7b20ad9fb3e21290a7c770108f43d2329fd578378e5e12c971f4a58d005ce77f000ed6a54be6576a2c114d5785c31d94e5eb3679163e1902cb266d0bfd2487b994a012d2a2ca037b6229e910106da462df807d08e6a16006d0fe50c5ffd43e929b30a26681b2f0047e9466be8db8224a0baf9e66e4a4b4dab423e1d70702fbf816c4c46b98b71b7f50676dcd9b9e639d7181dee0c77de30341d5a75014985e5d2fbfbc1c2298821dfd86f81667ffc100b286fa08ddf3685c49768793d6f273ba848bc670a1320e6aaef0b274026029d72508a06a63a9eecbd01bf8c25da72bad3d960d5157f10d155724ac299f28dbba3a529289e4db02cc73b4486ddb387fd252930eae7286460d5be0a78959f880af7a881232dc5228c8519738368cf16f74a07405669f0de74c82213d20c78785360e3a0d1395585bc999d6cec1fcab6da29f151452b6b8b0a9fa9f24d47a1c8ea7a679e6c6f9be028dc1982de284c0d279cfc78ee0e57ffd4763bee83a6db1c872d4c1494bebe5d4305128068e6106168845c29fae852d8f092cafa20f2f10afad79da4658e9cc167dea776eda9c1fd615b87d3bf9ee5e9c43628dc1f4f31f066caf1f071b4f1d4a2f094262c36d34ef913c14fe988eba33c22118a430a5f9c8fd2305570884bc21196d59e733a59dc2f67707cf6451f9f0eb6edf50bd4ab2f477a169af8f19290ad9b0a9d0dc73ece929d543817f178d5014a111f1267ddcf8c3427218d866d12c955d7d35ca92a98b9852212bd21c212de11119b412a83c1b7c6c4cb249d5eb080300002d91e430ee4b984625e1f1bd4c1fe68f54629bb6e8ba626113177bba880f2eccf894b129570c4da4b427ec31a4303d89f0957b3513132b74196cbd551942ccfb17723fab2d038718611694577d1945b1ea6f70728e2e739c5e97319404cefc83ffae017950df972429f1fbb8e72c5df2ea0566328fd3572144b7bd8d41a9e8d77a883e3e437b494a102039569ac5fbb8ede2a6bd01ab0053f541eb153c7a4332038ad62330cae0d4b8b18dfe43673b90b463b1e34cab78dca46385b1ed44adba6ca09c3d88a5545e97686a9e9885d024b16f044a927b78dca8e300e3dba956c3396cde235c223e8a548a23547205ed0dbfc9c845a733ee06bb84d7a7c91db80e19bd86658069ce0ab749bb87c89b5e9c1a2bc6da8a2806df6597523cd5ce38173e801e85d33c170c0934079db50f908e7d033d0a3166822bfd21ca6cd5766e5a5bf0b2688d225de0d13c92a6f9397054c3af967ec897830d964a80d988c60a8a92c4ba418e60e16ace4f93cb274b8ed77b39280030734d1628d5f266919eceaea93bb4a1d24b9f5f0ea83208e8d128c8434de2260152e3ca069beedb10e317d18ceac9d59b7f94eb6844d66b492cd3a4021844952e01f49da6c5e3a6d123d649a221bf337858295eb1990babc0fe9d21808b9939e69ffc3c485f64cde395cd79c987024dc7f180f3443eb9171f5ae9643ad11f4aebcc2a64dad63db0b1b4bd1ee85d556ae372a52eee5ada5ebb4376ce063ee61d8cdfdf01a7ad8d653574659ca3470ab6b4a08654538e9024bd086f8675793fd5af341c4b84ccb32668c35de99f6da72e887fba3fba13cb43e05683acec57334fec5586300b168094b9ff6c4c7e28d7a99d3f71009d22916b698da7be772c8940f55a5c1d8db417bb3fb4a60ac9f82c8ac3b4b09023856b76aa24a0e28f772b66bddcc558746034bdd2c6c07e5bb0f506d48be0da7e4895c17b2bb84863de29cabbd71b4212bbddd20d8f805d201c778574eae09247b4759ddf0a977796977c18c2f86e8d85e0ad25fd45cdb78205bee4bc2502b9b8e988fa8d2ddd688a9c290c6e16902883e96c54617d940b43101e38e0ee3c19e26600a8aa1a89ee900c59349b49d4aa4fd8bcdd27cd42cd4072a2f3fe2ec6460f59943cab88299bbe6ce96d3438ff0f7d25ff43dd45890a09a4e9f6e186d8547134c385665b58856bc96d26b90566f0ee96e4e417cbc76a3687c049b31d06d9a5a44f0994004e2d0c070b076ac11cc6d317243f72beb2b274b6db24f2560909e659417978e3d54114657c455a036b8df4a560affa77ac619ee7e1bf6dbe1fa1c6203d4b8cb8be04f1e2286aa3da9c1cd328ba7f3ce858c2a0a6c9ca81142614f5abc5d188e2eef051178915776a6639f30601a605c1385797843c4dcccbd9bf18fcbd9aa4f39cb116673781d5d57252bae686c7a8ae3090e8f9b90137b243e26669ed2712a3807dca26c19163364f0344565581e60bc4adf2b9cb36ed4acc3f3f98d9680d07c029b92a2669b90d783e489a68896a4344dd19faede88117db394a3cb189f88034f52f164897c4817c7a135ef62ee4a8c39fd9b5c8d42319c8648323c952411dec5d6716f7651cefc8d68bcca8b5e4e44ce4b080685c0122452b55af4a35bd23c3c4c702a1fbdaffd63d16f397275f5f8a08cf1380bb07e7ef45b227d004de7e5a000199704ce752e565cba495de797849708f3c5243eed42ab9e10249cfb2f7756fc2d7d2bfd5d8db532b3d856a03910ebe32dba13977373346ec2a8ff8f07cb2f6092339d19c84882da264fbe67ecd4014e71fe4a02f7e291545c43b5ab09c578b5ac76a3b6758a0a9a276a5eaf4358c52024b71777c6577456333928fa23694d98c3bcaf477891236a4544749af69b22e8f886c88e75c8c97be6becf0df2e06a16609f1dddc15976aa6797c31ced3587f0ae16816d021713ced26a8b252f2fe7bfd056258585a02958046c0a890b3dd9e13078733b490d4c62d0bf4643121c9824962bb89fb0a85cb3312e9467ddbf623e7cba8049ee9fc7812931d4edf0e2ca906513b6d179a5b6b75719881acab6708f9118c86cdc4a481602a0507d889fc10ce7870e2e9e593498a512e1be168be71513a7d783d869d2aefd180a619577f6bf2816d85bdccb491eca0511ee1f74b3a853872252a7299ddffecd4a42effc5fcbf4c21380d56974f6e3fe65b661dd0affa5e894f1ba59a9a0b7d20c39f69a6b06629a59e1336145c95f08a2ed9fe69da594fc06de88c6ee629817a616091a8a241e9c7b446e721b748cc4aed2ff8378cd068ff57b38874ffff3778661720067e5be0d48835d863cd587952e295a936db8ff1ea712b7807656fbed57565ce3e09d7f6514f0fcfde5ea94836a63604a4f6b9bda287795a2b78b12402478fae280ec3fb09e2cdb0cdb97865d46518b2c53bbcd5dc7c92b2d1b0fb322de0eeb2be348503e07a937f1d5156137956111d3eaffd55931d20c8b60748d0d5655e9175529b9177a7af24ec517703d76c9a4f6533f3d87c81dc9dcd47632a2eed49e1aea1d58cd4b0db6e999366054816f2d4deef8c59694de1cbc55b9d59aeb5840044cdcd8a4b279f1ea213e718c1d6a180b0f14c1e2986c667c36a909614397e2af80f77968995133fb9ef0d3caea361a2adc912bef7c0a94838e84e83d1ab15542c7e42febffb65a2b1e5266ca61b8daa914429841f1d747285b0f8b38c368b2224068b185eb6eba8deabc8a487d8146919e5340fb4d00af1d32cd0435ae9311caec9cbb21e0573949dc9d796a461e374fdf623059d3b21b4be2d730b377ffd056ac288a6363629ed666a2668966ffeef898cbb84515613cb8e34d44e3ce31ec8d72276fb66a02f8ed7f2170396d616b67d1489821d1eb4c42a3007c1da3c5179a9443a86080fe0c3637be217f2ffac7681aa9e988cfdf390d16d7e6298888b29ae1be9ab95b4dd3dcfa2618f567610f2f2c884946d37f3c6acc4717f0647ee9a3323c5aa49408422b2df66fc9485ee75f949dfaaaa43336e04013f5151003abaee7e010bfdd37442d3906d77604ae32111998a8e1b1fa63c44da462d43d6def828bc6f115842e20ffba67c0723e8043ccecd4bdc24026a4f0114b002f79e445a17b15247e497552590971ced8e83505fbfc8a52f69fc2d0c5577b140f4180e9039cc1416df49ebfe82af0157c48748c2a4f8edeb4a562240880d27089aa993fcb8c42f690bd30355d38a4824439329d2d6475fbceaf6a64270200e735d27f1402d3f47e1350dfdf1299ebaa6dd927b721a72e708e5c497d099ef960eec836667c63a6da9b47abda69f0b98a32d8f3e85cc652c814f25cc452dd21894fb85250d213a0a8dfdb784a804af4816f1ffd32d43feb3af3875d10b4a5bb2bcc7d2bcf4bf88deb723d3cff43c9dff60c7eac37c87db2fdcb530c74589164d07dd479682d0ff55e13ae8349281834c458d71636e1010a6ddc0564c6fa823fb15341a12cbb8ff1d19811b68d7112e2438aeafa69c70165f62664e80b16f2cbc68b1ebab658e319b8eefb3bfba0706eba3b44fbf26820481ae7f97045b3263f99f83a9b6973088a0c3cdbd00444de35cddab05b9264f7f66dd30e7d3f8c6f5c17c4000cd4c56e3592547b40408fce46bde19b89aacc2168c087396980c9e5e5ab364e0b105cbc547aed13a93eff6de524a636b5fa8fea10f8638ea0b7abbc4368528d661302d80be90daf1f0527d39799c8d17df7657805d1651b0de59b9e6ab573dd28f601720bbba2d7eced22b7881eac7496a5682a08a23c23334317c41a39335403c1fc2671298aff9d5e72e9cc7558b2f3bf29b09f3f0851f2b7d51a625deffc6f454330821856689746d0c0bc9852dc212cce7ee5c5be1d003ef4004eb709da465d680e106b1f5888ddfb1796ddd39b2ba22cbc2271e0d87ff21a01f517d54aeee15824ebe5154566a3c466a21dfea47ffe0f3d2de92ffcae67891d3e5f79b422fa9360abdb9a84414f6b8ac6db5b374230a06671230a04e42cc60d4e639f957f2dd30f35acd6a46f56d7a9b7e2011eaec73518b2882b535a166d1383fb7cd6d5fc6e103b592f542d50f3fdc85e654522362c1af778b497cf727f31142418ae0e8025461edafce5cb2be1d52fedf7b41b6a63b2bcfc7f508a81c5b05917dc7dd54b93e00dd03ad860630e166aa48228ca3b082a6c5e2a87fb458de7a39d4247fa470390aceab0b203cde27892e3dffd7fee1d9ec2199cfadff99a96fdf7cd51667722314322e1eb18a515fe274504e3f60f187f78b873879adcbc10a4d871371eaafee6897fa74660fa6713e1931b984aaf511bfe2df160200a1eb93fe210a563f222883db579776d9397a704781dde6f1b37e01bb4865a73c4fbed4d9e0f94eb45387bb6ad03d3dc0385d60d9ca220e6c8c877efde4d2ef478f0d98679d82a2e952cd3f637da32419879c16dee83b15c9d074b662356e8e51e8469fe7f5d962cd96b5e41c0c0a71fca956773f079d3a159e896b3474d44f99d91fed84e2c896e6ae104a7fa16dd6ad98038203ec361afc41f017b7c502df7bc6cc854fdf55511eecfc88d558f709bc5443d75bd4fcb06074ea8893a51e6f6169630a9a73126ba4ba3b4ef935bfd395eefa17ab47878095c1cf4cf23417174844a2b8630755adae89ac42bf0e5042a97d6a40323192606ecd2de3d1274b6428ac8551aefd64083e874a0288f4bc4134948c7944858485939d3a37d12075a465c59ffb7e0e8615a28e3396b2a7cc7a9d9163ea7f781c9e982091bda952479fd65e7a8e846bbaa95e0cde8d806e1976a4f4acb8adfa1798390b810ea98110ef81207290b12b11d8c57165afa4a7c5c8da8006ef77a1b770250656c2c038b8672363d3e3ea2cc43ebc6e0c7b29dc27b6f423a221d7acf41fd28e32c484937b8fd4196f415017565f14cf5bc2d8ef7abb712bdf1ce6cf5839f8e4071805d12937d14a94088230d56b6f63862faa7e436036427702b88af5e656fa77a564d9d53e6957d1ec1a5c1ca8e620367bf5b298f26c92b6ac036cda6b58005235a2fc0b6be11f9bb13a5cb88936e5a039efefbe4a01defe5bcaa6a120ae7ea619bb8cf9395a27a545f26e314f6466fa47643bfc06dcab330c7b521515867196f8334565064d7451e056835ad9e032506fd6382e741d0b9bf96010e4ff7088fdde85a63f31c6ec9bc74ada5af953a385377143835c49d85f60d85169c97142c8679f9fcbc28262b537a931c95830b895eec88f103ed402dbd1a755ef87ff6f5f312f9eb50e34ade9493aff4e0190cf689d511f862f4841a9f2eef1d37b1b0e7b67cb9409d94659afa84a108b8f98d7c45a204b053590a56b28ab96a2094faece5740f87f81e942b800bf55852ee1982f02ce92705efc729398b46dec02a39768ce5ec76304f0a164e5c56bdff66a029b9c8073bd413663e242c309f381607d17e74ff23ee40cc62f1db4db8807d10aa68fb417546bc3131406cad6a74527cbfa24f1e00acf8f11448fbb91525f929c8b5e3753863cd5ea4aa16ef128b359ac57daa21e062d11c74f6ec4649dd4d2822b12033e7987f8de7c6f0b380bebfbbb05dd03de61ef29212a37ebb90dbd9ddeaa713547dc89c73c3fd7b4ae20711327c175fb1d170294649488718e129881de2f540cfd1529c77b4cc33e342239b14d93c47cb4c36399a10d4b64ae235f744e6f08a49d130d9737abf2613209fce24f9ee19758a6078c8286ce666ee576e9db98719cb588a42e82931ed9a9a4a9639f646c1d9ec019e6418d6f49a15c6bd4e68a2cb38abcc0617354d57c343c07237673ca93eda86d09ec85a5536ca71875890521b990fadd71332a08288fc4499d0933341e7ff41879fbeb24a8c882a390d99e671d04d91a61b1e5a0f4c12e17424220a8a6fd90303c39b1c9a6bcc639f408a913ae55908b9d00d6adc02bdb21328c0e2182802a19eb364314dd5b7938e871e783482eb2f25f6a5d90eee7beb06384e1bf4e0e8d64b0c36b6359d6ed0b28b15fa4d5498fe76a035c260bc9d6ba9096995f1735ad1cc61a3ffa74bcf789bf742cf46e67cefd4a9ccce5b0cc34ca7401894118b499158e29b1cc6ab11a16c7c2bc4de9202bdae8f8007d4b468b6d0029085d8685c0f5abec3a10b6448e78e0e1c2fdd4b8097095e04a3222c3180a6d43fe214c7d45b83d208a14e9dc5864b4058252287d013c7af9d33ac9256ab3ec99d3ecc57af1cd98021c12cdea84fba2a48ca0e7d23760785f72247648a0c61ea21dcf8e173e7247dca6f426d42d2d71eca5e3c80591f3c5fae2a1c57ca4ae34c4eab997278347b17276122c08a74244843a2afc53c311f8040081f423b5416a4298d0272306140caaccd980a8944e62206008407be50037af94292ca5d37624e68760c4c4e7871634c7be43c8e580849e34e1d3e7604c4dc8d4ec06600c83f675ab71973fbbd14742793a3987d29087d120be37ac622db00282eccc4913a268699425e8bdef252128071a061d9328c283cbcd7bf8ab10714e3ac95d88174292787c9e5d646ea5e788a8ccf0dccddd99db2281c5c2998de44f9ae04c9ee932273d9282bef3af6331ec614c2ef927d8e9ea039710bed15a5d18616bc636c7c1c9a9d54acdb0584f93eae690092b12de7179dc7c9e81f465d9ebcd483963392c5ccca2176b045077aebb95f5dc38c674d040a13e49bd01a81cbd11f0fd832e066c424a6f91be780fedba8254e1656ff873e65088996fbd71b115935e1e5285046a54b4e08d04c0d3a57d8e3846b85494acd6857afc7974c1a2e4b94b5773ad1dd17c43689d4e928f23652532311ee22e4cd732d7ac92c88794ea630619091a0cb996c48649b7d3e5379807e841b0701f885cc7d36703a696d19bdd6766221638d0d2ee205eb00594399e1ffd084024ddf913718685f2a3f5d0607bd323c507b6d921e6f31f48a716b71b3ed03f9fdfc1f0b50ce7c2f55ed621290000428b7c190ed041f732aec71174c2ae47565a68a17d1ea73fd93136eac9717a8214904110bfde019eb5df4c4e42d48617650eb5b41bca3e111d84c18ee0ac1f50e7dd16350462cf46660532bbbb5654649f000fbc954372a29f773febb72deab58d79ae5ef46f26dad5f02f12dbf8455734f2cbb643cce61f1ac0af221606841b7a60c35a69075364a43d53f2ee1003c6ef07250bd88c8d8b6289c7a217eaa3cee05c010b190e09bc830450b74e62c1d486937b91ae7047cfdde4fdcacdd83d699aff80a2b41f8596eaffe60c28ff325d9fb4648995315abe0482c0f592a9a1efbd7d945fc9b18b6d2f838e3d6290f650e2f48f4cdc8472e3fb175111c20bd460be6471a4177157eb8a9aa97a16f8c3e172b158c8ec4e4a841af73ac86452b9a1636cb6addfb74b5d39d85aff7a5dfe8233d45ac1412fcbc3de0297c617681bcc7e727f8fac454202e41a0ef4cefe87bc172b200a6956a14fa5e20f944364408b3520586222d615c6dfa237aa78353f0485028747156debfe352dc466753e973297ebc8b13a83f82c9fd64176697c59e1122ba1dce441a8bdac087eb9fb8446c22a535747e130de48084973d00507777739435dcdc61ddece34134b0f5026278ecf013e4b05e7dbc0ef2d4a1d9c91732514c7d20b2c74d04ea57c9f0ba8ecad10b8173efd1e23bad856520245e278006c4092d3ccaaf27ba45946d165279cfe7c2a87b0a79b9f2e0553a639d5ff45d9c9c6f4077d818b7e882f2a28ff4711e434d31ba1623172ea76cad32b2900943eee712aa8f959ddbbb6973f980a4b78f0a81c619a4105e3149cea623c065bc3e51b939a5c77806819a9c86927bea143d3da29c6d7dc9e01f2884bc6ed4833759db2e59c505ad71dc79f1533d0d8d7bcee59d372222f213f9bd7e6571911a44f6c962c923d7edf02a75616d247bc28994139b3cf2cad2d1cabc58b6241eb7223a7c8d904529c0f654f56f4002a350600401d938ad84fa9a211e46d4ca92de855e281ec0fc41b031cb816334520b6347cca8150fd7e1ae3cac9767a9b57b4cf641c168788aaff8da7edf5d2c9c57f7181e038eefc463b0a16f01904a91772c4a5706217239794720072dff8ea130c651f5c2b9cbb23029eeb1c74d2a638cad3b6d927c3b92c46895e787ddcef82c0f95793b9f5c1e78fa76c8c23c4c6a685d1c2757fb7602062605566323a940997d79dbe408ee9b7713f38b1ab2b5420b9273479d8ad2b1ad4a6c3966364dab64f0bcd1cff04d3fe5db7e94b660054ed17fbb1758611bda19b6d97ed4dacd413184f59d842522d0aaefc6fd1aa1b1f5e073d277e5e855ecac91404bf5c27eac4ade3b9119f624ada983608ecd2532c023f195e6b60a6e741eacf8b01fd1eee0954f353b297b7078801ebf7706eb2248bcffa289286742d815263aa9564875ac27e5cce8993aa409ed7f6f5dac4c044e3aae933f6369afee422c40cd12d0a2082e036714b147fb44cc32f753c1a544a47c304176b6f6ecc3c7088d812673a1631c6fb649b739232003d7612097b5ba38c40e870792942e833efc11345fd14a6a5b926a2d208517918728900e2976c397eb9ebbdfa83073a9a8c1a41ba06f4044bc3c4b9a03d3d5e79b45e9949cbe7c21e3a08d83113cf90afb48b7c1f170ef53fc483b3cb86cf021b0dd2a411ca24af0be24b80e37552d01abbb67a731160040083d56ae816202b5e1fb3b287ef65a06b58998002c1a62723840bd6263f6f44d8f7bc4cb26d1411bdcc33d8482dcdb8bd63df5dccdcc1c104fa0bd3a1ab4df1d90d20fa37e0c2482c700fc3aaabbd193c213c63a10ed2d97b58fdef1e258851f4f5da3d88103e17e8063207bf4158f6db240002fa97b8b6a896cbb1a84eace8daef14f40540ab83132645a7efa6d541b83587350c23bd0442b075c91a5dcc279fa5d0dd6b003fdc0ab19918da62c6980b3e74606eb075b8fe88d380e36b7d579d6683d1e7e1f30064c21d29f6857f693abd4e9faf547d20e118eaeb05c55f8ee05e7c05877f43022b1ca80981687d00789932547ba7fc861196206fa04f17c9957ebe439b755f51e1eb3f496fe0941105d05457b99696046a2db9c8ea4d19d349d9d599cd1823ec63ac570d0f8762c72064cc644bd778fcfc45c064a4497fdce8db5ec30faa2c39e4590810f3dcb39e2e2b576bb32d46207d9884d0350028555d6b4210c259ae535f12c9bbc4df445f830d2e5eb6dcb734a98fa254e22d9e49e89dcbb4c6d217a5cd43957115f7c2522ad43170f61b54dcd5bf80358509357eb8126477dfb8ac01acea013c61f44e02559d48b742899679e0f9be4aba9da5383c608b255e00626753f40bd46b035bb0a2e4cc1e0362dd565137365dd2439e317162d3105a02acbf1c355c72c94dc605de3d6654e935d4b74cc6cb267cdc039ece6796707d8d94753916469a3faee46cfa45830fa67bd9edc1a90223ae6d1df208827e427cf7763eb483d4d571c753c5aacad1a03b1d5b77eb91648255a5eb8a05f4061def8b46b59c7afa810da5c3e3349ce4a63a874b2fc44b00d977ba19a206aa458e8165a2ba0b3d8ce06f6a9e011014e6734aff42917b5c424d036ceac0cb7b2bee820bb489a3a14e91b5b5554d098c94fe53bf9a1fa8db7505bc2acb020477aff39736a2d0847205f74c64ece56f303778e109f39d8a2d3ac07d962c49f0b1cbfaf4bb6c2ab0ca9f72d935aa543121f10e4201bc369852da4f9eefedc73dd980bc1d1fc432f0ea34495316a7d017ea8f078cfbe5151d7b86656cb553754c11194a2e9b67800437244b539553df92dfde1bc283a0cf5d4ad768d42a4db82ba11a403d1d2088ca0c490bdc1baea12ac60fc7e597e196726ebee087489413a86a45a3ac14f1459b4cb577a6b8390754968551f5c1ebcdb411f841e50c1de5f1af0715b13c0db1047cdf8f4aed9af854baac9cad2545eb1b5de8386bf0cd9fcfaf24e47fb914b68837053d6dda1fbf27c5652b8fb4abe70ef2b992cef5aaf8f6d626f244fdb48261abb2dd67e2d5786b0e6a2d0739327df191765c3e6f246fcb33b4ba6a77dbf2317b1e4c900a8c6d8f749393899a87cdacf63201dac070d2d7033dc411cee6ac76e249c8403ca9926885b2090ba9a0e6a893365fa67d82bb4c817778eba605be98134636c0a78d809e0e34f1f1801e2338b808f8e6c92254a309e14c5e60915b1880e716e7530679df8b2d16663b13f87f54656aa95cb88e55d4793d6f6eeb6e5de52ca246592083b08af086ebf4a275e61994eabddb8dba9bc0fdcc095fd3cd58a55adaa5e16a617c7c44ccad1afdaeebbdff7cdefbb35f0663c49bd9bd7ddb1bbbbfbe7eeee7edda973f4db2a756bebe6b4ea4afdfabcf2c8932e1b67903185a7ea2ed06dec3230a602d76ea005b6db0e2c00bd95dbf2ef776fadd6abaaabd5abcba69575f5a705b6dbee02dbab19d84ebb1a74c1f267b6ac2de1b03292e20245ea0ad70329233a2130b8654d4a882d25e88cf0cc96352926dc17dcdab2064598eaa5c689cbd2d4e7e588194f3ce084a9397120175d3163880d4c555c5e985e53b518d020c3888b3c0429cc95265344bc86d410a606031c660cc18106c66bc80c5052348684a0a80819437248aa1d7143ce901b685fb8868820498a19436858aad19e68863449ca22f084c0345bd6a0a8c1a5020b14518470f2f5008a253878420bd50e4f4871bb3cb10418040eb7ac3d31c4aa055cb365ed8911c0b6b4a2c40bb139b77c50acd66ac4b6f1b0d1c3796ab515441d4551a945797105ca1346db7f154bc2ad0871c38a14db1f04891cbbbb95d8bd0553b6ff00dcddad57a7ef81447472a1020536a0bdf0021fa2a02c4cc9420b1430525cb00185a18514809105891084b96188be4841104f2036b535d8d4881e360d37a594526a552011addf4dfb94c4f7c3694b2d32d00113576a4ccca089136c7f3186c5f60f6a02ccf617a2b2fd4180ba62fb132962cb9a1352bb660569fb962a9e147b6c55d9a247064eb63f17c2a0be96a002579161fb8755b46cffed67b0e5652b184e8edff6d64b870748091764594204db1f872fc66a1016515c790a220b9518a86cd91e1e41bf23f6d89a72c4762c3824117edf0a4b78c08a2e9c50a205514323de2b58c9410c5b7ca1831fb65429ef1528ac3ce1aab4326d9b8ce948a3ed7f310bb65f5143a28bed2f6d92a035cd5074c4f4835644a31dbd7607031a5ec074547484e4549352458a8bacd682282c1d4e447c91614986094653910c452090aab961054c20588a214c6b08a3189c30a1492ab5209a8ca298283dd580f022e565e6861fc2d48010c19635208c360aaa1db393a001cb2a1b896f9710f9764bed1222a51e6b8bd2ea83873f4a2d0f985ba9bb3b0dd48bdbe2c5f07061a594eeaadd71fb6e4e832741d002b2bbc096e7e432a56837ce05eeb6c044dda690d59fbed32aa7ad3549b541e8b6ba6a416bdd3817b8dbc2adf5e532fa92a6896dbb46d87b32f55d550f326071465d0f347023400b5eae0f36f82c015e38e28600ebd3d2666545b7d81b73018d7ff85eec421602b8a0c561728f173f79124380225a0f4a2c214f53311ea001766d59fb01863dc69cb0cd9635285f3c17e0bc650d4acd7b827fcb1a9421ee11c6d9b20645049e0e708c2d6b4fbed0b1a515267af0840b0c4b302cd901920f4e3e50e5034da620f5d0c48b07aa4c1ed478788a42136b3b7089f2c0111749ab22141b6523f10e50fa5203487bfb995bdfd37711aa36e25f6d0e93c0f33be25bb67bdd18d7fbbdbc0103fbcf24a4e9d52bd55e059ef3b302d72bb7ed4e3e59301a6158e69119667b7d6a6b0d3c99036f1adbdc7219679f5a6bed26bdf76406ca54c82dd0b67df7337de477bfc5a6cf26b5fc993edb7776db46257b4381dbddbdef4df076b9b65ca4de7424beab75ba0145dca8b576d3b8f53ec3d6ece7a1a563abd6da9ad9b5ba0cda47a494ae5e6e40091366cffffa64ac33ae6aaf5fe77ff5bf3bc357f6ccafd759dbdb75eed16ed1899010bf9d42dd4782f646dd4eb96ddbfbdeb4b769ae37cc2fe222972d5aa6b2484541557972a249698ac2f4644929c9095293a3254956a8b5d65a49a8a1793882cb5c21dc20a1fbe6e5cb1e354418cececb6f0009259870e404efe5f7127cb97a19f352e6e5cccbd64b9a97352f6d5ecad7cb182f65bc9cf1f25fe697fae54fda74a2f1d2c6cb1b2f795ef6bcc4f1d2474b8e973f357c3a7b1e3e76ec7b32025846a96069fb6c191585c97650849bd7a155a07b6a24dbcedbdf7909a4e3e7ef00fdce7b4079e71d24dad9b97915e8be791defcd9b9fa010dff13d36127075bc576f344c8a3d08d8760345a87b87907aa353d801933e378f24dc37afe3bbd941776851f6dcbc9003e911b66f74e85101dbea108923e4c8afd380587e591b9ad093f10e8fddd9b96177766cd89d1d1a7667c77ab03c374e9e52a471436367e73d4e4e5fc1b4943d34fe468f73d3f8b9b3f35e8d3cb7987948f103016cfb73e3bca772eaab1a3a48f6d0d0238f1d3d06d1c940444120e4e4188eb538457cdc7c8f9bef7046c0a109dbfeec6eacc5b9c1b137dfe1dce0d81b9c9737387a4cd2e99aaf7fdfac8684f9534a632ce11a7587590bbceb47c38aa4eefa35df2dc1aa5d42b40a7587459bea9befb9810d2b168e919969d1d4d8843738ae570c193260f8ded38022d40948518b108042ecae5f038a50f7cd7b359f7d1b50484de16602d2c73e927067b1ed73696263f3d9ac82ef9b2aeb0a05ba6fb409b2078b6d433d2ab9c126972045a49a4c82e411349325a9ae19b4687d305b22eca25f2a4ef0085a3222a91f82e30ffa2a84813d1a1381e6cb67b16a052ffd9abd0a3efdf688646bf0e9d33be9837fef36b77c1620fbc57fb1b3ca5ae79c731675dd2755dd7dcfed9c73fec67aefebaf1e671c6e4adfe321465787d5ed6d16306fff5defaa6e77efbdf7ef7599b560dcd50c9ed4e9de7f1b816cfa1275d5bb5d78e3ddbdf725f75dde9efb4d771dfdaeebbaae7ad6ae2aabe25a1fb35660ee3ef17a31dc49daf69e733f3e08444a696bad37061e62fea8898bfa48ca23601226de4801e688d8979467bb5661ee6fb48961c919f6a1732bf7786fd59b538631b30ad56365b963de6afa5efdb65c595574e63b172da34e18627c8284f9168618afc0cf9b487a36e1b8c971bada7ced4bfb16e4dee63b8f564022bd9c8064057fccd2d245201e979db0f494f90a3c8adb59ceb2bf85e828827abc9f1eb1a7c750a5c71763db6fdcfbd7df34123bb53720f6ab9e492c67bdc00b40186184f1ca82e7bb3eaa5dae6fa408e70ca28b81154d5798282171d3a53ed9010e9bbb7e9dc2bf49986fc27c2223e02370872b98344992da6145d352086801a881520896d03005805a154d9d54a256c5131550bbb5658d8a16ec7defbd7a44b2edfbaa97fbeaf1fecb1f7544b07feb779d11fbf7b9ffb211245b01bcb75d1e256dd28b64db2e216fbfcb23926d77cf09b1ef6923b6d3465c4254dfbd4acb4eb3a4d59f923b690dfed7b380412f2278e8de3bfd7132cc70e504528ebcfcf04552410308b87881450cba5c719fa06d55a24ca9f1a6a29850a668b0ddfd6be56c599b6ada385bd6a648b0479d29a2687832439820fb9cb4ff3d4e90288cc48e48ace7652243a4c0df7be0ea8d78cfc36ae5bd7d4f82411bc0421484114cc8229779625d6ecd3d8448910fd4f8d39f8b9f8a264598effbbe2f07780c75ac4861f65f60969b035d1cd7bd0920f80c8422d20024324a4ed93d4a2fdb86d996eb40dfe007f10d7e1a88bfa7632e2e81835e6800dff6f92cc86136c44c780c1b70412052c493e2f5f258b7e77979fc26de1e08cac0f9df7577f73f523d51e5ac93898bf5299ed929c5c5ea4c1c568d7c4680c7af5623176bd1aef5eb51fd8a54bf16d5af46f5bf9a44b14caa6f5081e5e7a082251d91501ed145a923b1fc504af952476a23b1f9c48b53fded5a78ce3d7f38908b3a609f1db0b8ab8e4f0c78fca07852c7fd3710c86bdb42173d860f78dbf4cbc81023448ac81e5f81eaaf5c2b7c1df9b6bc6295f058f7531428f172b4008f52cbf638a2f07c1c577009b528bed872065bd6a248da9e740096b5288e767d7b05be9f83063c4a2d3112609907bfd5cc4f39b74b7a2c150b26b83843d0c01e3140e95dc9c99a91c9ded43fe031dc536ed93c7b7e8c7c3caeb047fa48e8ae6ff391126ea6e0f9e17c39ffb2dc5a517f20057182a12433da55a4f5333fa393b4bee695d4bc92d50b434966628aa831050bada5a19a5732246f5091834a5dfdb63a12d325dcc00227a9ae22add6d3c4bc92a199ec2a321303044349663e464371dd97505c4a867aac60fffa37df9e1af61b57606fe5240100810b2f1862e1831784d862a8e6677212b0882116666e3054a3a1d0c71e88230a8fb15deb7b3248e09897c133336e828b75e65b345f5faa54ddd3d8af52b67aeb2bee57ad1ca3b0fa339f26e2730597007e65a9f478398f159404febdfa6dcb40412ed6c7ac988bb5e354ffd5edbd582cc8c5580c285af41117b54c3008f8f7ed2644fd2d98ab8bd6ea0f8977aedb65d7ad3bb625ed88cb7209261c71b1fecd14213a9bc1d2c310364071b9410a862a142af86186150c41c4099486eac7ea07d597c92450d8fc982c29e8a00b9ed537a8c023d09e0f346ddea3d5e3f45cbfcbd481acb02b95466c01ec734fb3bff4edb9cb5782427c73cf023c0660cfe7f4c582c7cfbea6ae2efa64f191c2f2e7e78882e5e70002cb973a73035ef5495b925aebdcdcaca330f766c4fde70442f5e8afc2dcdcdbcd7180c123fe5c14011ef10ec19fce1c76eacaae7cfeb67ddddececec796c0e36472187dfc38ddcb7a5db67afb9f7e24bb5ad5ea62cd7bac1ca307ccfa9a976010d6b757635d8d4a28180cbe0f17bb62498991a0f59a3ef45539af93b5908c97f2f552e28435ad9897f9d714a650f3e89bdfc5096b9ef50566fdeabd13a86bc67b3901e73cce9d5fe791f5fa5f2a9d1c3dfad6794ecd2c2ed27ffaf485e8bf1ec3edc9d031f4cba5c76ba369f4cbe8183d8a1beba945f6d016d3f7ac7c73cd601eeb1e5b7b468dd38a4d5f9547df40a6f477b2acdbea3b69f42713fdd974a4fdd38127753c296ba576729d1e4fd8dd6fb9fea4eedd090609b23d9de3091b491d3190b9ed067291670c72d1be8eb9689fd3d7658ffd99e5f62902dbff7e8a89e7dd80c2315bbe5f0ec496bc30c31882429f0377e8d6afb4c32e56bf82c710fbb0418e5affe61b09dbb16529738c35a48e7167d7979193ae82644f7dbce59c9236dd6d50e59c9e532994ce7984bc0185bd1b5058559f6a7df2d97c010d2acb962f5118454d71f112e60b5ab4e957e740a21e4bf42bcd36d19e684ef4697ea54de0716efbb445f6c042ca4217a93c4d39964da548dfdba6ae34d9439f689b3e7d87f26e7e95b2ede725b2642651180b6afbf7a3d53e46e09e1a1ebfed4fb4271729ad4255a94aab4ffe04ce77499994f4291652a433a72261746a86c5894d7d8beca1ff436b4e7942e40801961ff382e5cbcf410496efc92081eb6fd7da7a91c0f68de67418a8c0c0cbf62d07e509851d0c92bb94d2ddbe272714ae0e12d9ae9a00045e115bd6b07cd97333d566e014c56f4cf5b0c089cb9e4c6be79c3e6ad8915cb4ef31263cfa52936ddfa5386d467993dcf67dc97eec0af6365d93648f7d9929f83ed7a3865bdab5bda4439c766d3a05212c28212608b990777b5671d1fe38b50f095cf7ebb182c71697a588eb4fb2c77a136fe248db96338b8bf60614b65b4e28ba65b8ad2fb968ed5726fbb5c97e5df22db76d69fb0da86f555a678347295db269911452fb6efab95c0339c2937c369f928a8a8a5a88e234af2265d37a84c5096fc2e2b44777da14a4d4a3367539eb9c20518f25ec0272f50d78562587d1e70183c7aa5495e8d7259779d54a9b4ab1935c18a2a327f9934de7d74b297efa227d4c3fa41f3a139df944d9a08a1e66c005072786a812159800865a15595eb0e26588be27d1f7a59b3f1df0787d9ee0f1b2b647e5d5f629023bb8e57f95e985558c098c5df45639c94441173c140db1de5be524320738585134c422bae04f7f309b9083089ca3053cca28a8980f78945e4aa047ecfc0bd6fbd35dab5037a88ddcdf7e7bcff511d07b107cf0be09f463a400df128e10cd1ac2a7bfeaaaeea59df5896add6e9fcb238c484a308104177d7628420484212e5b81b5ca3e6420046d08747d42b8013cfef73a62d541e40efaa1696c0a8f7853ea7907c636f177ade3af525a03970b6ba8682a2d3ccff330ad74524a29b5565fd903646b28dab4da6de3acad499b3ef771ad562b9cc220d15d7abd5ebfa5fb7874c03c3ae02f8b2d5dbcaaf0e3d1017f1f0812691c7ef5f1e84069a518c7d04aa9b5d65a6b2dad743cb231bd8c90dc744aeb66b9ca71d427e72d1a1a9a9af0b3b1b9a93737d4e78dcc17e379a6d5a2b1a9096b18529f618d500eb02ed2bd5707b0d4a14a5b7e15798327ddf35ed89e73df7edbf4f69eadde7c9bbf8d57ba4f2aa5623c970557629d06e1cd25aa44cd1c6a582c216dcce762eb6815666ef1b27815ce8946e1a2b4e77f79eec085c99e54662e46db25644b3d2ac03be0cd116097fc6f73db25b5ac75f962cbda16393ae04d8b292d9af6fc81fd5b2f9d6f698fffd202698f3a41db8aac6da1654b59dba2ca1ec32d63b6ac6dc174bb4475a9b265ad8b14a62d6b5d92b6ec82c3566d59eb72b4e77fb52cc27899dae395dab296c593f4b6ac65d1b467043cb945d27c215ba26a38da524b1745d088cdf2601504b781f15070af16414117fcd7178a332dfca994c0717dd9128a5a401f647cff7d2bbffe7468745636a6285ca87137262f92b0171be177c39bf205899f84c327e6d30585c703c3e7c9ef00f6f7942afee2940a0d2a0e9a5081a236c10107a657c5e2a0083462b33c5805c16d603015145c305a80d9d2d52d8e002305060a5339f2c0d02e9516bea72ee07cd6963530407c6094ee4b0b18d82d6b59c460f561304db498b26b096280b5306a011113e52ac930cd3cc5d0a291e982e6fb0206be55d8d4296cbe2d0c5645dda894c0a94918e14a82e995840eaf2f525faad0be4869ba49dc10e3d302fa10cad0f162a3e1199553d2c1ffa5c91726f38b51fdb204e7aa8375e8c597292cd0f142cb931d2ec2d0f0f6fccecab7314531bfdbb2e685953ab3a51524b6d8f3bf291fdeb2e6c50a6e152f98e6e380c90b1c6ab6ac79b1e476f165cbbc5b5a4182893dbf0b29ba65ad8b2bd58957ab881b5db87853f0b665ad0bda86c2f331714bd54b516d8b2f6117485dc48033398065ed0645b52db26c5c020c26e1f0897d324f0fe01a97267bea1715af96035a14b51c48f12db11c3d81e548ea04509d11961866a85b628961498ce7e68089870eb021ea695e38d170b04506f1e60876e040cc96352530738e2216a3b66f1b040eaa6c1fbd39021bacb099da3f0ff4f2bd97d5d70598bffd2b8f4af6eb1d14e2fbf55bce2e194fdf2564a31ffb001eaf8e4ed28cffafb5d65a67bc90e748c20073efbc0465bc0489743cff264843b49f938dd078b9ebf8635b20d963df5a6b65d4c8be63649c9d3ccebd0384ee1a5f23dfed3235e09c9c09c6788f7e3026b0cdd319664acda81a357297a327548d7cdfab5fdd3c8f4965ad94a6273ab34b0e12c15ee67c8e1e7ba653cfacd223c4774f4e964e2e0265d9ffe4d98a93923ddee4a247e19838568cf53cacbfc17a1b2fd304cbe09818b88f3dcfdf781b51b8e77d703c0f463ff4f3fe7707d96354b273dedf27d3262ac545ff59c5080b99dff33d7ac4a179f841c2e374f21ccd839138f4a3ed92cbe614453e6019fa81c1a0640fd87b0e1dd3e3f5d13c7ac438f40d3d869bebd136b44f14b8c66f3f5aa5bb3f1b4739b0eff11ff0f89fe7e191fd8c4776e5681e7c7cd0f3787b4467f786b6f141fef1b04ca592667ee647d69ef99cf7e6c723ff781f99c77f90291485f9c3f2ca87a64d3c32a565fa44619c52124703b6359fa3c78b71a8c404aef90906a13be7615d7cf0f0a193b88ac8dec7fbd0497ae8bbf44a78e824ae22b3e7f13c7492207d67af64e8c708cfb2fc12660a8728fbbfc67bf48bf91afae785dc83e51955e373f2dc5e8d2c5303cee96ae809257bf2fd7bafd2bd555c5663bc3838383f3ece7312cc144b56e95e8cc770d3fc18ee16cdb7dea39fdd41f650923d64f6edd9cf2ac91e39efefe5e4b9ed0eb2c7d401b5f1fef68965b251648f1b1773319b8c9da92d4a030e51b2793e27fbe6b1916bc021f3de9c7c311743bf9cbcc9d42f27db19fbe5e4dadabe9c4c69b2d7804394ec9ccff16cbe0b1240c9e6791b3cb0877d4e4ece7909ce2f6e6437923dfe39d98b7c494ef66d975c36bfa89ba5aba98319e627bb727e96a35348c08e97bdec81e4903bd1ae9cb74c7c87ffcf0b798e96b101873fd2a61cf08d13f924238f73cb003f89db0047d8f1b297600274fcec255804e8653a890bf649622c1992bd1c027a0916f9f9994ee2caf9d927994d9a8666da95f449624fb4180dcdfee765590ec1f2dcb33c6370f434e4cd0f96e59ee52413061b4ef034c482cac9904c4381bd07b3a161f98325b40d82cb72de5d358f37477c29e6e41a3fe32728c27f0d2d1d88a6918de4fcdc4254c86bcebf93e5d6c931255be731ff4f76d997fdcf036597d5290080c9e985a1243fcf42cbe9054350eacf1ee85f0678bc49f96f92cb461b1ae40ce4a27fcd4154e0f1c7f61f63af79666871002e93db0707bcfda893801d3f7b0713a0e365ef6011a09fe924be849421a077b0c8cfcb7412396508a5120cfdbc108da164ff64a0ec3931e4ca63dd38d369f4117c3679fcb16bacd2dc410abe47ab34e63dd2264ec9a9b5479a39a51f7be4949eae132d15a7e404ee715e3084f9d5fe966fd265a23309c02007308eb274e9410e86fc6f139de5dc400b11454c38a0049621ff9be47f978a784e0cedd021d0023e8021044f433a34fec97268f38247bc6d3e25311799a65e38b2e2688885bb713a5549cf251771a6886852e967fdc8672ea8a2a22297e2c57da929cc1e3d8ad3b6db4a9b5c36ba0c530aa55406d96362c9ae0464a0fbfb94363579123dea7cc98f7c4861a5ed9e545350c39216b6fbb7c0e0d18f7ccfc077116c57cda62fbc9e7edc49bd0eb01412121252180d5ced57bbe85caa51021c7e2ce8e9e6200df3bda34a84ce9434199aef892d2e78ac1e447efddf7e5e9faee3faad7819e544871da00803031578e184043d5892c30650000515091513032ee2ad3ddf870ab06bf9a33fd0f5edbd2a670a55cb9b53a89e9dd25744c6bb7d48e1f1c79e5d5061d2c29e4becb1ca8081e70833c8c5acf39ccedbbda15b9e2dde54b1c1109e835c940ff474560313c6041eb18db4d99eeeed6bd5804478d321ac0bde3e0481cca95728a56e7879d3ce695b1f906e0741e1f9deeb1523c627636ed34e1813736ebfed4d5b60cac539c36cb3e502af566bef9d5d37bb2e4bd77ddd7b1f91f7e931c4df97e506b73767676d7da79902df36e2ba7ee0b4509e2daa89025be954d4c2767db9e0fadc6f9b37fac802cd8ba8edb688650412a5b0bd2b84ed0bb07d37c3d8378cdd6911b69fcfda9cae4158bb6a14587b2ae1e624c2939ef4581cfdf97da00f6ee1fc6510c43a3eb6f0eae57bab7c29cc279541977cabe74102ff8a5bb1240e9999164d8d4d78c3d118992e664a1e1b353536e10d8eeb158306666313dee0b85e3164d488e18cf006c7f58a216386cd17fb76d08f2d5d168214fdc7160831ab1a3738ae570c199b2acf3a0208320448d1ff862f128941402b167ea7318eeb1543c68ccf739b37fc50b45528b4b1e9e62b868c199f75b83f267be8e4c898f159e7e8ecbc74eb39ee2d48b4b96cbef739ce45abdc64224f2c7fd63b34b8af86e6b8bc71bfbd7703126daf8d72f87372c035c66bcb8c71c21a22ccc60d9e1e1ce0109b9a9d9d1a9fcc34687ce227658f96109d0951f9741fef501676dbe58dd04999afc2ab2f4f0f0e9f588e1f1d363ee9b211fc5bc580c2550f0e9f588e1f1d40de8d181d1b3670f8c472fce800dae121d6b971c32796e34707d00e59cf37a5a41466e110ff7e228fce2cf49d9e9e2fc78f0ea01db259900e8f887de4d4960d56ffd9361ddb06b46d3bb64db66db36d0bda361edb16baf83c4ef475c42def05ba77c7bdb27b67f706ddcbe3de1ef78a39a807c4713b384ec671338e0be2381e1cd783e37c709ca63f3a80be5a7d5639d9f6af493d9e1d60be14465fe1f83a5b76aa50eab9e79982bbe70189b86dcab6ee655d0f1f3f3e00400084363844653fe8a39c8f1f1f002000fb376f68db2647797c2265c546a09574b27849f51ddff32081bfdd6d8f07d683f985138a8a8a58ab9c716c6f954720c1c53168d3b40787cab3b92cba38c55d6dec2d8fe0a2c31c88dbecfbb67a54c09643b0ed65af87fbf8aacf46a0309ff2c1d1c3135b3dc0c9931e6bce9f6078320514661872eb32f5cfd26fab1fb77d1db779fbe68a2dddfe6ad9637527e5e738c1fe168b09b6a871b165df2d6b5c4c15601e4d2ea4bcd0bcb86cf40bc59db54420a6292a2f537b7c2f4d7be4993f2af5970c78614b09f078f7541629a751989c310c70c14612582c2a2afa6168be748244e1a21c7c32b2db623c5e37bf9356545444c3109d4e4f94424d1e40272e3a9949d5a5fb9f70c443876581a9eab92c26f87d2051e5eafd704bf576857ddf57cf034b35edbcf77365ad340bab5fbdb75acd9ffa08ddf77260f62c5d762912e09136d1a26fe2e9f1d2ab472456ec6813217010caa4898b4d74e6521246bf49aa897a7a6eeae4338a4461340b65e2225d5284a3094b69924273a2b48a05892a12a548bac9672ee530fa5126b4c9a62ed515511a95e214c9c91e6993cb9c7c9bd6bf520612d58fb6e96c62d31eef3a85c939a7fd88c3f105feb2c0dee2011eb163913df4bd898b266e50c5a652b2873e45a2560737d1a7527c265218fd985350954d69519b66a1924a2a7568c0cea448c68b6bca97823f7d4ffa2daab556a3ad687b76d5f72df73c62b265ad48b8eddddd9d7e389ab0908bf3878bf3db7b3e083e935c08c14413360c518312550c4d2c8a407ab2021e60b10266e8dde593207df8cf8740123768a28b3de595301f489f297b660db3d05b3328681a6de9473349b5e4c91eb256d963ce1a1cb06f49db80d2ae4fe95bbb65ad0ba34da73b10de9c47439e4b1a6ff98ccb788c636779f82e349dcc279b04ceaf77ae72cfa9f427f2f2a09934fe18eef932dee7144d6be665f4f87b52acc7d89e2c3d06cd3c097f7a73da9cefe951a47a8cbdd463d0a645fff3f52bbf4b8f17478ff86ff4187e78e7879e245fbe8d1e6f8d1e318d1e43f92d3dbefc193d8a327a8ced714eed983985f5789546fc64cb5f690a9360765a119d4131f92a3d8a3294599e64500c09ba9053da97d465cb9eb38b96dd6da9335ea839e784923df385dc9be86ccb5da2b0f94f4f505052527bfad47cdd44a73749b948a35ca450b2c787262842f52f2e524b8b0e4087acbe49fe654b982f2e1435c293b7a3dd4a26b7f7f96c0e792e93dbd65f65abca734f55fe3e7f55ae4fe9afb20a7573facecdb20f72bab23c04ab1f896f50ff4c1fcfebde66fdd96cdf7e9785e8f776a551a0fbf31ecc3fd387e3b8ef859ccb402e72df73d94381dbdf27592afd337de8d39749f4dc32d1f637bb36bddd6d93a0ade0bcb44ae59656606a6bad925ea1b4c78ffa70014fc280f5123c7e9fd441e49eaef915c764989a8282a23f636262ea7bef79a44cb6ffb8fd58f5e84532e6ebd52392bbfd3dcf1eceaa8fc95d4cee1e67d5c77d0c29ec3fe298cc3dcef72508e4e9b3f24abaa847175928da462a8737d59fcf6651d1e7f54bd2125393ece14f7b8292b2679c53b12e535bbc8479091363415668526a667f7c6ddccb9b290c66f374a7f4e7d3771c23ef3eb178fe9e47c5ae9ee70b9948eeb4d66a378ebb465b67a452a93ceffb4090c5aa8f2b972d352646c646a9b556bbd999cfb62c0d4d4dcdac69d1d0d4d87c5374a0039f16fa7853e1b53ce9753aad56d2380ec604eebe4ea5f2bceffbf06ac562e16f46cec8c8c46466665a343a2d1cb6c217aea1f5bd3a69f56cfee60607a7be5c1f8c09fc7ac1a0708c183264cc98318a1bc604a5528a2687eb227dc9fa59bb6d1c77b9bba9beaaf2c0550b8360a51ba5745b24d943317d5c6340a230e6ab59a6d6d748b8be10ad9bcc8c8de26ddb56bdd657338d14fa356e63336d6c7ddf558f0ad8b44543536313d28461d89a9109c3181c86212b5c8161f879aa2ea005a8c4ac37a53d2915a211000000004315002020140c880442b14820c94451d43d14000c7c9a486e52184ba34910832808630c8186104080210018020042c86688020098945c0e75ae3d9df18506b8b98873de22c6a11f067687f23c18dcef91c3d74546be611a0b8fc87b50d280cccf335f88fc4b59c0e90178c78a1ee110bd95f7d7daec805c1ea5289591ac918c8f3f4f0da424447f5d81340e3cac5cc5546c6abf429c2bd59b6bc7386ac587ce8b5f6efaaf3178575477f12f5006605ea47fc26b5dac84eac47420a64c3a46cae6b4847b7487e1e8e97118fbc25a1f9662e2542b3eacfcd25e0380a18ec5f9e1f65b6f2d7bafd57e98d0ee48a88640fd26e13c1f83c90cfe878d508e606953cb091c37f83481a31e4d8cfebf7b6c8bce4be558ff4cbacb63189486fabc6597f3a159fb09eb9891791f3dcb4cde53bb9bbd58259de863cb43effac2812919013646544927c91b34379519c053610cb6de7e2c9280a341835551d472020a91ccc4d129e02ba8fe60843360b3d76fbc6c65c470847c85ece675001b65eb5954e29753f5c6c4ae33b5aed83cdbbc44a9f16e02bbbe43fa18ff1c03af1810e85a716f56882e18d4d0bebdfe0be09d557cdd13d40efa079a75c766f439da4e728928a0d8e15d1f96105972621b9e00aaafbb556ee5f6a937a8b5a7c787c5ab4ee2bb415512f3cad7233f8a0ad1bc99caaf167f4c002c443a14713c34c9d237ca98033b70ddc6f8433b8eeaba48acc4c577be543c733c4a676e36774e36097f532e79381b14218260e3a739c12d85ba07adcff168658eeabf7da68d8d6cd1c2232edd3d609375179ccf50eed3010b91c6d8c6c2921e62372a4386c07b45d2285f36cfef38ce1371ce94cd989504724d5da9e43fbd767e9810f28511bab66c970acad3809c989e8ff793622dae90d360f892dac22fe21cbd35d911a9edc88cc5e8e25b0e90c02454ddfbe29368d65c66e90fd9a3d6c86eec357b31f1cfeac5710dd105ffd1a8fb682a4c8365ac76db62e625654689b17f8ceb4a36f634f9ccbe457f877e0ddedc87c0a9f4c3b72b3df047a7a29744941f2c6b8efbc969d2f61d66675094f723a9e4c6b0bc9787b64eb2a4d9922b099b7fd83edaa197325c360b776522464013800ddc042001d58184807877165e8ae287a3c5970da59c580fed3f944036d016800ad0076002e2dd5b7849945f1c165e3e9472627934ff660299014b4024d029aec77616bece5f4e17581cf527747814fd2504b08089a9621dd34f02e97a821c631af06b0c4fda367c65147c9f896d8aa6d76f7d9cac1ff91f7e0cbae18060d739e0dbe91ce0967d077845d701df1cdb82aa7a4b22983c073c80a7484472da2e9132cf0bfcb4039d5fd875cba99961a3136eed32bef5e80c593e0275896e01ff0b584be9e4a0852e8ff88d43a15b62458f74372a17ab3b4d0765332082599472fe01573543ce06efe0647c345aa5bf63422543c324281ff716582009610e5cd59fb6f5bf033cca8720584dd2a161b9430b80ba0744d8a9e00511e5a72c9b832df6c987894a0dad3cb0ba9353a6d7ddf7509e20884c286cee39639495cbf290c9632cd2df5d98c09f162650a92eab4bf9d8302502bcdf6ef366e408a6a2a71644fdd271a1258a121007e2ca0fd7c1a93b244b6320dbe206563e29db509c3e4c9a492c456cfec98faf508727b7f62470e55a837c328bfcb7a463e4a0fbe94f68b555e33bc8051dc3d8d86db7fdb65dcc5060b322041ca3d1bf85827fa06c45943179af4958262bf451cf8c53f9f385c2ddbfe7bc78f6cec95706a29accb11f0cf1322c0551f8fb4b419c6f816590e8158a426d58cb84e6b84311e3af6e501f83bfd4267ce37c409603cb77dda760955e818f0440f10f4f75bf97802ee7e68e38c510a54bc0e41d1c2803e09dc9505725ac9e76b4b71d4f7d2e639d3c79558657827e895a4b9119b5ea44d0ec54ba554b99831a30467d9b67771c27793f2de032828dacfe3a57213003a11f303f70287849f49f93ebbd1ccef1b36510d662a674c6f904db62e70a58b039060a27b9df60428bd47d0844ac5d49f6e2630304a2818e281adf1399d5583fcdaa8823ff9b4e86670fd4659dbeb3353278834ff97731ff7ff371f2fb3372df000aea7054b427f2d6255524850037e4c3cf4607c03f262e7f2c45c521eb2338104a801a715ae05e7c001e165df998cfe4d60410715270f1a8fe35c053515c4816f21274780133ad25fce16274f40757d7572dbef4614e7b2119a3805a11f01b91c03fa81c770848f3ca8d88bc588ca5f852243f9c2cdee5b23278562069ed1f9574eba0a0470d2e06432f79171c1427859646ffc9818a0a4d5071a8d5d1d9262b466b11096123b494915fb0a09c17b11ce10fc7a948945196263714cf16386295217a38dde47005e52ab3b9dad0b2a0351032a89043e3f0f3416bd4229ce3002ccac128e40cf4e948f19c36d6ed7293cf4a44c2de256261a40f2cf82729aa8fd12c8ef88be3224ba3f4bdfe0dfcb0138d557414d695b385ada65601d703744657a309112540be5f355cb892993556863892c49646e3545ef599acc2393ec810b740964f33af45df361c92b16df265d840db7d99d4aaf758491b8ed0a715926789d2d88b9413823f60741771c20aee00a24340d8012874c04b5c8122f421f1998dc56f1e9c3e431ab22cf5ec666c4af20573416d614aa148a8af526885c9aa428ab29ea2282dcdb05aea5a65dd198c871ae8604efd115c166c1576ceac4fce542f797330f185e6759b62df7021510cb8576634f498c893e01a0e517de8da39491c9a60a6dd63d6096f9484fc25f1b7d2a30cdf5e63b8b563732934263afd2470aeb2e40e4a72e508f4f8284f8694609217624cc96650a28188decd782316d125d843caab0e5d34137a11410476a36b5443cdc74cbb99836cb2b1d5dcf9252e892d0d0eba70916f3608de6e93833455431e6fc4a26aaa869656bf991569ffd3fb5e9028b4d05c7ac8925929b778ff22401368ef82a6b147f4dd8c2c8e328c0adb9739807f93fb147550780613036d81a18900b608439d8e3c3bab1c162a35ae24fad1cec5df2c8fdabe36caa3a6a736d26fdaf1e5519330a6b0556b20f3ebdbdce7e24f213ad7f112817f139647adc656976341f329453d5ce04e6f58f11388023bc2eaef9a0bd2f2ad5f28e08b274e94a5143182c6e52543bff581d5c8929af4caed66fa344548fa65046099e172757908e1186d0551864700e401183612f951e395c2e391ae7041f6402868f593ab08e1251ce3113e9c1655f6ccf53738edc46f340217077f5e7d97aaa98d90c538650ea9ecceb8a49ad1fb95ee15a42540a41837da9fe3529bc0d50a3aa28f4fb07c294d8f4ff0a02e455f114c4c2977b5deef486d49cd580fc82662c4cc8e93762568d2a5a4c0314a11d784bbef18d8dae68114cb7120e5c56e53a8770a1661ed5d0c209e894c714bb3eeb534b43b67cd3143fc6601907a4a11c95f0e644dc13c595a4475dbc5057416e8c32152d32c2c56a043875545f49b58e633af0ad6d7520988fb30a5607b693ce1974c54787d0e080fb03942ce9333aa882560d33998c3cc1450b37831cdd40ecb52ac103dfa36633d6f92a137903d861c4ef5fd3712e4a113d4b86a5e9806c0630cfc45f42f2d70058c6141daa4c01d1852a2a2a5bbab0c974aa06ea67a7f223eab332c086c24a83815d4c40358c239de0142e2ab96b59f417fe6526adf9a69a64bcb64200bb26c489914d9793413aab88fadbc8e29fc97596f51f3c2da40e1771baec50e9e4fb1336907fad53b3f7ad5a440945ae6083985f9cc9fcf2b2f124ab26550972e94f1e7b4e8e2e3e9e0573a493a8c7e521cc631e311ff494e857af54c1959984d6bcbe3d8c4692ecda5801ccdef381442f3e1c141be5ba1a9ab8d330445ed3b37e1fbee2b63956963c1f039f142fd2b1d2660ce6386ff67360974ddf939da183405d1a5d40b3561154010f6f8a288ef2119ce837ccb2c48d3ead3dac3651da288a12a5364be7102ddee98cdd309314e01134942c52faa024e54d5a4a56b5d32bb2939394a7f27771ebcf970b0f45a2c1d3bffedb48381c65d1b107619ad03fb8446608b3753eadc6b584d9822f2901ec2468648af5d20508a70c752872240c42a81c3fea98728579e839e2a36a9567df100e3ee7dd1f6030a6941049736cb8695e4ace9d08f4fb24020d682aceec19ba5751d970dba5b09d61dcc1a021984ecb098827a26977c0078eafabeaa754861f9ec03e253097a5ad354f19d773de6ce00907083222d8e27ec2eeb6340bf11a08ad09e1fe0070b8a62b9718f2c77f79b449f70ea6aa11d0f09c4488a1e71119afbd3c6cf440bbb67ecc0d2f1831f101e218d0ad5d224d26d6d3a0e88e0d11b5778faedb1b3f41efc4e02f21e5498a3b7f7dd9199dd79172a2f06fa7f150669021e0f3d5c136c583c1244af90bfdc21ba4884ff6c4306bca13745167ca77a80e13ad996e90678f46d9601f2927e1b3e65b654f39780e8c0022eabb3fe960739b0583701735331cbd1eb8e66a2f904bf1b1b1aac44c19f5ec6b323d6f0c766fe141f66a85c642dc922487b99c78374a1da75806a2c32243573128baa07ac153b861c334e5a560bc8c757e381e721e01075a8947ab5b3f45cceac885c03d49de71958c16526f85a7006f2b773e45d4298dfd04b6cafe61e2d43d22469eb88bfa9052c5c56c50a12301165d1f08d35d935fb418a8ba163f8c1527dbc1ce0cda6e81a1d7483db73cb9b69d054cf713cbdfb07bc3c046cc7da2b2b7119f83d021b315095671fa9bcf8e592469a929f6a171833f69190c8a74d7be8793bb8d5ae3ee2faa2104e8aeaa3094f7d4458ee4dc100db10de477214c181a96630006c2e720bb55e7a7f036d361f8a8f8fd93b24acaf1201fda9787585f0320d177981e5000a55273383137bab3837f35ae56b566b8be6592f9cc53b0314cf7f958147d946ce162e02ca9050346d8a1bcc4c43aaa8d86dd22ccbd0103194dae321f665e34bccda8aef033a6e5abb5102f9ee7ded8d775bedf63ede4d42dae7f3dce48be6c407232543f8d343550942bae0cf3da3dfc1cd78cfc3699de21b52ce8b0038a0287e14e2c66db69ef87209dbd138e8f53397fde0cff1022fa00936d24e1896c46a1baf6c6b8178737e2bf38eaea8143d3cef1693f17bbd42fae41270149833ba7d3d88ed8e630e7732a4a3f0b19e70da3867d539630bb8f7c76ef79211c4867b206dc323fff2efb6db123e7bf89e6ba2d2b32daca034775274ad4cc14f132f8c595fd9d11e6cb9c321e734880c167c1157afd44d59bcb72e48c89eeebf35abc45c78c66dbd2adeeef19fed467e3569311d8a84e4da48f0b490d0f614380c4495752e6349d7d295595d2a5cb7fef7d40d19faa01f42cb0d47f0e604f27e571ff000d5949e6237bb9e30f5926531e5090ed54b47354887681a9e6ddc11ff61653dcca31197b664ed69920b50f1d7c2bee8a405ed97cd7570a6b99e6b38a5103a4dd569586a023b0f2521b2c6eb45f2f28a965e2b86ab214c9fa34941ebba1e7b71004e93697c444761ab9dfe08ff0387fed9c607449b00c78dee471d6c1c0b55366b5ef42e499dfb1eb4042272a8739877af653d5d0114038aa5e560326fdfa81f3bbb3f60b691ce63562d554947384623b0f63c27f2ba92c4398a5fc33d74bd5e3c6a6ac4396a6c73930ec0865744d7055ebfa0777d7875e33b52dab1a59c5b5144d334220872e0a3fed18b533ebac2e8ba89d428f8cc1011e9b6a40564745dce50a448e6ae66aeb506ddfa76a0ab15015713efd974ebcb9a48a6aea6b8ea81f60fa9f4bef9dac27469e88fbbfebd4b93d7d2f6d24bb379ac75336eb6bb81dd08fce0ad5e9f68d27e843923c3f1d8a75ef798ca2ea3fac4ed1f7c018d03dd3ad7a8b1ad770aaeeae744958ade0158355b59ec6383049da608e31840f5f347f5aa9f8392867aeeb41d7728b252b16b1ef6143900f163e5834c823442fa66946b4035cc2c2177bb3d3e8ff6d979aa109659c68f3e6e14945eeb2cc753be6e5e84c36d46060c9e5ba68c1fea78cc82f8c27f65b2a21e5d549931155c763d18de9f7e7498ca720d2edfd0f9cbfe97d754782d53765d48553ca649ae3d341d3cb8cfd3b70c676532dc6aa805a53e3db039be3a05249195b9cfeb384ad86e30040d618c5da7b08bb1ede6caaed7490b2da1f44c7a56763d9fe4beab9507fac6821cf79d227ad9f51754eeb2eb27bd5ca31bbdb5ec7ab5705f90e86f7547898dc1ae6f7d48b85e4f9bf9256a43d65406d9cc43a3167a301e9f6b3990455ba11bd4e4211e1e20965d9f61bccd2961d7f59fc2a406e21aab9b6cb47afbb37b0dddc7d7d70a3f20622b759b6043779707c9838e6761816f09ae936303c1356753f5de3d325d2e6171c55127da1d2abe076716ef54b12d22886bcf83c134f4290a6bab5de4df827edf7a79ae25c8ff004e553423858e3f21f6e7b9235bf978821db8d633fbd1166b6fc529aefb5c2c20e4ce76bafdbcfd71c59ffad81af108afb30b25c265727b8f2c106b770ae219a6e0d231220e8fbd4e5232415947d661094289f69beb8d5eb4cbde08f6170abff2c912c03048fcca1fa8d4c3dc7acf4a22175977908aff318e647c27a0f6494abe75e5258ecc5ef28727d20ff2fd4db558e06443328ef90952c15c91d1b83ae9621f1a4d3ef341ca790e3f9ac5f67a5749656eee416168f72a1390de9dc8387d6fb2360428dbc1a38c2f4e77ace095f0da55363f09816a65bc8acbe1a168b14455dfeeeb9d8074099e8d30144116abbd89028b8b571827610dc6d4b790d2a6a354dd34259c9783ce2fcaa49c45aacc3a83ebc686f074665300ede8a87057655131cd930d06c4cc16543e899c3002b1538fc3e5e92350d847ecd6b22021d3e76fdd331425a6f3249b1b58958f5cc5d552623a2dbc2a74cf52934751fbbbd9b2e09921f6038de750bb999b77164cb7c099c510603a4940acd73bd384405111e1b07cedf66ed3f88f35c234cb4cabc837ac601d0c7362af602f6a65644662ca91440500882577ba2175efc17db81a10f8375a7b276b334cafbe2acb0bd988817bbf8dd399e0637cf63785912816229a4c6386932c1006ba81b514ff9c2d1b93f9ff98585330410c1a5bfe5161d30f92fa3638cb15913de4a2d0c3ee4857f847ba16f4a8956b6ccc86ce45b74c7f973e7d94513e5d52430ede3d42325b9b46055632d1bffc1430c6456dabd6f82ced4bd54ffc376fd91b0f8048bea645e98f84298e040c902281b42fc0a2edad659bb15a9e322c0de5a8ae06a1abf6ae0e99ab5c48a0d563dc9cd7d93b4f19d3b5158c5b241487310851a9459b0aa9ef5a12b38b263ba8fbfee46934a814a009eb3ce58840eb47a1d0535c25bf4c0498793948b4eb07d738f69a4fc74c43b898b82d9b504d1215aad631fc1969a1c474575e79ded794e2ed29fd11cab5f38476d8d5512f93559ba90e45c21da310527d11d3d370665614dc38a6adc9a281825424604c0c71c4d60d42e84754087ded0f4091616313e0dca6cdf69d170ce38f5edda3b6ba98ac525be0b86fe1aaa88e0d217a235eeb3ac93cd49fd8e88035655e7021f59f0e1da791f030a7e6a11ef5c0d763545f9fbeb0280f090ce7e6ab7acca6b999052de3361024bbdf6dc99728947908fc82517b5c05a2a9746438c1d5ad379e6f0184544466097f855bc561397820b2784330e328380105b4a392404aa9ad3b0e10da378e21589b8e7a93aabf9bb82add77ab5dcef55eeda191a7da3712009131be00e9185a4f04fa1724a9dfdf19615646ae39d4d74d3566d2b72775724141ed2bc2e323c6224a5e02d56b127028fa355ea8bb769f3006c42d2126f20769e57dd7c91f4299739c743c27d85b20de87b6a74177de392607364ec2aa45bf38649b7943f5a5180320cb52a70d148c5309fb82c2b31d106ebeb5d837a2d082cfcd6d7b4204eaa7a903139821437a48b7ef1fecd4d582902a9d9f02a2cb6f87e67e53c76a0014bddb364f54810582265b3508de8460ed616bca5221346f70e6adf2f54694f35f1650757d1f36119c683c03ee1708c18a2432bb6e904c56aa0d142e1b6e07cabfb4552222e91955217c9746a9e7ed3705de8c1903e03c5d0c1a1c24819662ab836e49332cda28e2741d1cc61140da8bad3a9eb96814a09dba1fa7f41e505c390d9421ab9a09cd3cec4b58cd36e88c8750b8df119f6037c939107f732b0ce823edc33363ec1b58d8069a76dd5ff9f70e7c18e6446f06e817a9922e1bd24a30b7d10ed2aad76372561372ec35c16374d4b01f6e8fb8a7601703227da995e1b1deca426588e6b0656c5140829b16c16c79c9b65373dadc9e3386f046809ad5841551b191f18a853f952d68e43de93aa83c8c73461bdd87b0b316e952b1bc21ecec1fb44e97b4429792e2a4dbb02e7aa753d3624de98d47f18a076971a2b407a2dd1e5c6509bbc47d4a2fad3a2d3dedbb5cb34460653cc739e6a2236efc2100cfe40f634f4135021b1786cb182162c6104ff5725fe9b475eff456e546e168fff6e2f01f205a81775fe4fae0c70ab66c12147a9c43a47202b2a6edb19e05aa9c45ba173ee0c0b213b097a28dc7be4ec272b7013c1715cbba2b6231f9879cfa8b5b6974c1a4f5a282dabae3743bdd917ad27f985a0dcfdf03322aeb58dadf35a40c5c3a090ecc7bbb5d7248be228abf40ae05422438afa17fe512312eccb4e4fddc3fd61f7bcfd1a1561bb804a45de75c058025f447514c2fa0f0c5a858f3be14bb61fff3aadbb9643838ef8e5dc84f9145093d437e9a24704c2e328bcf7bdddac9c661bf24888c3b7cc5fe395692825344b9ad9b62401b9cc5cd54842f37465a54293c2054133a244d24d7a8c0811161acc8fccf9edb5e3dc2fa70d82dc89b327310c90774a0a69eaf6e0d2b3a54b8f0bc2a35b8c84fefb9e166a01f3020015c72ac32f41a581210ae2fb3189bc14346baca93e6850bd2142d92abf5510ef8fbacd8870732088f124c94e6e52512464cc46af676a6f2c7c7721272a99a6f75d6f66fedc234d2a604690d215e1c2f1fe7453ea243b66755e7e9152f36f4325322b79f32e29073f7c0e4c4fe95f00a7452070b4089aae91eac4f1bfb2d6318459c6a240d28cac176d9ed2acefc28ecba41305d9bf443c8a330fcc4af305f5f8ade70954cd6151598705cc387da14ccc0f06530c59a5f24e6a342de1d87e0f6002010777d29369557be1ebb8fca687ba9f74827f2f1ae62e5dc5c7bec1a8ec88c452fe43832630bbbf725ed844abbd06f611be7bea1d6f0953706f2bfd9ea24378f25d03f60cef8e10786b6610aa2645cb816fbd6e5253196c054ea781fc03400780d80b11926b119d55a2b09f4529a32e3babd4af0dc34c6479f9ba212413dffd9716ec5f1a30034d6a79419b750ba5fefbd70763935905beb19bfceb8eef0fbb725832d74dc5294a57be03eb488eb2bcac3933dd11d2c8e93c3f105ddeff0d7052e1f12397f346992fe8e21b3b17aebf0f3ef8148ec363caca0c08dd7344830674baeba87e499056572040a654aa9be2f5d8ba053b57c6ada5973e848389a19fd5a4221f3c4395bfe7511afed16e8206c9035e85a88495ac04617dbf646121e46d79b79bf81cb968e8a5dd94e0979253671a243115ac678e2505c415687f0cc1d95a5b4d9962c1e7a19e9d25917be81699d9ddee988c37e516f7689a1ea0f3d503c254af2603c018b7d74d6c141e9310a16a33617cdf67dc8f6fedf5b1144a5a7307e07b99879ca070b7e067ea163f62e70353c2ce640691f5023c443ce470622ed49d203af89b8707591240176f9048720a832b9f8894b0f52dd1d85e80b05775771a4d66c84e0c0d7c66223ce87b77d6494b08703d01b864ba1647c99144304370516718b1b9ed67065f6ac0c4f5c4b083f2b394025ee5def8c7364e4d6af4eb6da2dc47708ca65872685c45f2ddb6d64b486e677cf5687e70970d7ada41846aec2805a838b2b8c85fffa1fecd88912ce976366f21ee9edbd422d522a61468dd9cb1e8a36cc7b012f81ab887c919e4a7dd5f7aa491372d8d9821ac5c956135b9befea760480ab6dbc1c4880c70b68c0712bb02429072804a7b34b929ad6acb27d90169876c1d88768b2f10e7eb324b9063c8e089771c0299cb2d249f0c218296b58144ed675d8172705784423ab24102366c631e25aaa49004c7c60679c148bd1999a2957c7e2ee494ffbe3dbfb6250c7e2698c7166fcb6bca633eaca42281b38dbf8f19358652513293139c644d346ac49cb631eff785e94ff3ea04661420e8ea57ad1354c451e4f97f0a22651c2487e2cc829a125a3ba480a6fe378a3479925dd3b9954443fdaad6b99789407fdf77b9c32bcf8a402a20bdb4c6569ba32abbfa1caca8421c6bf14354e366539f06e04369d3cbe89105b6970f9bd506816c3b0e3abf3e46df5c4fc1da74ad729b39727368cd4b9ad46b3a823756fec47f1b6dcfb63ae4dadebeb183d1f508e118bd2070dada716434092e2af6ca3decffd26313ea44cd16b302b22a7192ef4c717374becd96a7ec5055f4d0849c52a4efa413e9c7af8275209cfb2118da064479db71b07736151e233d14315f409b71eca97b0653b1ab7ebd5a003568b26518cae7cc468a5126b61c683373614284d9f1138b3a185ab5199cdf4408788f7261b4f2e935a2775931c83d8c5bb1b4b1a7c9e4916f92aabbf240fe3838611934ec9a4fa558375a67e1d823b1be219c83f2b0b0965b57dff0e2b6f5ad0b5d4a8d60419f786e4f00e5462aea26c0001327c35aa07a40a57300d99e54671e7bb9998a58b94223fa40f56139742dfcc792cb8c3530f220a45f987465468551a45f755608d8042837445a690f44763b609dcdcfb1c30d44458fac8a0549fe71feab5428c64ec0d083ba7dd81577ff6551b1091e0138c553ba42c0d6f60c1d57460616ec1897adbeb404281bb07ac0ec6dbee1025df148724c2b5ef52072044f9cfbdeb96bbdd15383ae052e73b36506b8bb96c55548c74b9b9e54d5c074ab8b1fbac02a7c0392823d342eba3c9fc1cb6c5f5aa8828fdef81cd3a46a1d8f188b1551134e7e0e0b0f78056c154baed5a06c8bd93edee1613cd21e4384ef8ebcc5139b812ea7df47e1874db7c8201f2c232a6d83be9af42eef6008fb7afc577501071d4372e39d97bd5ac510a5b5e62c230345fc845710d5171e9d1696b547c4746ca153e8c082ebe666b2ef7eb1175867b837148b082376f70dd7807f659d6b27ac0a45466eb3676cbd2fc6e780e271a268bdb455fc7a0da707d59e29c7d156360d5a800a7395ca7757dc819a2d8f5d5740c0b8e13e58818a80ad0809d8fe0937578a56caae0f8ae3065b3a708ea684dd91aa8dda2f144183fd1322aed3a3779fde2bac3e0a423521d4f1f5c8912a3371efb50ac2aaf97ba55e271e275ab1d1537e2e76bb5799f4e6e7712915e6212b739aeb107b37c56b7b2313092198f9a01a188a406cd33f750be1134c2d5471822b208b921bf16324ed4c1e219e8b8345bb31e528502a6ffac236a7a629e70825335447bac32b6d88363335534082f111c0e30c9e357b89f7098063893e43c210cbef99213b85f8e9973ecccad3df731963b6172cb526a905b77c5e45b1a85b92362462d2e579becbb73837e5184e59e713102408d7afa61f168f77741afae3367d12c46f36b78b05c284ee6fd69217d351f8de63d5e22db5b842c7f128c96318c68118c1899b0a1c4ba410afed509112610f367515bab4638c0853102678a3fa6daac1e468c6c2df0991279daa9b3ad55db806a32b8952e926d12a614538610dcf26f2afe8ef06e1bd81b1ee923ac3d2bfb78c081a7fa9c69054b6d50704c6fe54b5039815959d3fb527fc9fe89595ee88dd5b3f51e59b31c33c04a76659819209f404576f15c7c28bad571e5c13f843a3832738434c9de8c37bc669b7ac8f311e9a2087f8b48ca08c6d5e570e8378e7124236e9f782857d4572df6642d34a9d32839c8e3a790e7873efd6534c4830d5406fb45816ed399790e0a510052dc01d1d79a5b3b45ade7eac52540f5081528a4c425e8bec93f1439c1a53fdf62b0d8edc33c9a4079f956de25e20d6ef4dbe820199614c8b3bf10ff5ce20d6c759c95528bf04879d17ab340cc85dd15f78000fcb2b67282cd217ad6419b343f926c24d24b02d0e448af04226edebec334a8e71498df021f47936220bcc308058dbe90ee995d08956316b10dd8137e2e6880462c314f05343e90391304142ee74576ca949df346766eff6ba600a9239c0185d5e365ea7b6c0ee20cef379c2025a2d4f7b2bb1ce59134cfc3a0fe1f0e917a216967367e35663bf0fff5bc2b09371babb6c27e970b582e91fd39912b95d57b503070c77d09c8957638d12f50192c62208e143b82a6038c561d4ed8d7b148f22066a5765eacebe25e5ab19481222a63309403a7da6f3ac19d076bef26464f96800445d0b20c6ccc79848abd7a53d7be28028b6e2af190c94c6139511f0d4415f1cf4ddc843cdf9cc4063898182ef2fbcaee3db2754900f24706b36222cea75f09da1665a1a7b9318384a9f015048145973b9ab0bb6296c56c14c54fb978281b57e5d52625b2c0ad4599bf7e8a40023b507a96aba418ea6804fa1a9fdc88d5f3554cf9a190f93ffda9527aff803779aceed11a7a3ac880d7a7e7a6e0bfb1e687020eec3349a2fa7ef0fbb12653a69b4f15d5075b084b9622af684b4657ca2fad221907cd9f9588701c593a5643fae45dd372c3d83f6f18c0f95a0debdf480ac188351163ed8f4fbf14af3b5856c778aa8064a5eaa5da226e2e28865cc683042ac07379ece4028aa1bea0ac8410ba70d0b52a10c10940e411517518997514c56c99c736dab9b5cca0b1b6010670ec2433b2fb55a2faed1e24f238b148f47d40c579f2fae3c8b84f11f9737b6ade924659158c1512cf9d9a46d3d854c6cfe836850924fd6e65978b9b6e2ea198a056f2275de47daa7b5871ef89e2b2c00997b7bc064bc1c4112aa9a335d084f3d7ada6fa911ef1dd47b8b025451c57722e53e9a9bf2024eae27c05ea111e22ce8afc19939ab00bd41e278330f0f7b12de0872d983f4da07bf25616747062da9fe057a260b490285deb6eea2305e16ab42235e1c07146d27c115df3f9a6d59e6f6b591852caddd7b692d0d2b2d944ef91e131915f2a293dbc78c202fc14f8fea666a435f366f60b1fbfcd44b83f8ef2d61645e08bad5433cd0ec5451b8b764b06f16784e42cfd8261cba00d701b9c35d4c08ce2025c926f80cbd448eecf8c706810e37d08ad2d08e5ab141060c0262b642f2dc24d208ba4ee50a5b9648826d91aaece0298080b48b28cbb88940afa6b82984dffb3670472b175cd7032bb5c59fcdbf663cafb1c79ce0f06c25fbfb04e5f00f31d88c77a53a4d23f87b869c694290e32afc0097bfe1b6ef5b429f3c9ebb904d9a193e461e28d5402cb6067f43487fe01feeee66ce04b5a376766937b9f8530f7ff366303e21174ca82503f39e663e2ea772df030db1df222a753477080a0b153ec0c2f695c6be2e3cb39f711d78b5820cf11b748eedea1196489d4bb51a05ec2ca1103ea83dc6473c549a365015c1d260eb86358960502c32e3cd608d84595c111a6499f91fc256b0a9c4c9daadfaab36ff65a9e67d67cb4d2930450e1d3580f16c3e435e37598e5eebad5b5d410629214a99c86d18fef8d2da6133236ad46cf4a158e19787b637bb7ec41a35dcef337626f7ced7bac586b8f1550d8b52dcd4d7ca3de484c4723d01437600004e1eeca7e648a43fc921c31e1e104cc6445f3005d845d18cdf96826c9d04b531c5ef903dfa8ad3b2a1e04955810a6f6e5b0a3e50a9de9eea4a3c3bbeb4f5f09d291322d8aa30400c68f676379367743269061376af1319d7561a410928066d0d533da50d445ad12d7945e8026d6be5b30f3af608a45519ee9a04ff0ea9fdfb8b80984179c2e0b49ad3d5cbfb73db6e88a32bac5ad1204c0b95d52ad6b4f0f403f76cde37239e3a8a94a442629f4732041341346ca1e78008a7ec8e0054e5cb694e92d7b0156418b2a726edc426bc0e7a3aef3c47cb9e8cfa6785c57fe75e3069bdbd533df02d118ab2f668336ee1beefe1bb63602f53514ee117bf7f496baaf2abfcd8777d93ace2a957cac841a3adf65083cd16d3cca96114ee0094fd3c86527d80f0977955868f50091886df32f39425e6f5616679ac75d1091e18d8c2ef26e9a2757e22bb7702710976e0342b744a250005d2267d2da126879a18808460039d487bd9697cbba81b3f40e0f9a0137d5cf0fdf3426fee1bea4266ab607bc2f5355b64e99f2f13117f6604b4d878885c0595f593b8a76a4f2010103f7a5a2f2b654259967dbd1ccaacde2179bc34931e116428e2dcaf4b77ae03ca469d8cfe1c6bcbec3d0960dd5f4c6e52ea38bb52c7d974169eb02f7367089618a16c4ec67efa2a995bbe0e94c887745b6d068e427b92b7dadd95fee43462b9d2e61ec17b74e84ee7f9e1b0601fc602ae9ef43f6abeb91d28dd5386691a03f973c8863cb2ffba0705ff6e1324051191cb3c091d1c1ada6ac1c897b1acca1fbfa19658c22b9c6e119bdea325a3447ce2d2baa1a03faf31c64198bdbb8d0110a85909e984646c78ad60392b945fd8d081301610b96cf6dba5b2a6f228255e4ad61793e281fcc1610420f61f19fe0eb484e0c120c1640c93d18e18658840d827430c844e5a9258d5390bcc84dd0832ea6c1bf868ed73af3611869a051e2747edc9700fec64af6e0dfe9a59ffe9e4b62f5daec4a7337146e724159a2cb3eff50d9015416f771bea2ae110134204cd4742fca5191833e0256f4b95a883648dd42cd1a38a51b925c6df3a5d1b443a38ebba236471afa7bf14d87516c966be400358d949cc48f3578546438b5a1eb25dd80f01af0e2115c195c174e07b3d0ebf0f2eaf2d7316346ebe3a9744b4b7dbe52c62c2112dacd376ba44fddaa22f8653db43afa29355a4c9e482b3a94afb4af589654d24eea9de7939da73981bdcdc05d0a342b5b65dbcfdbe93cea1b9539bfde1b8c3609878ab4c3c70c82c2cecf686c75d92d0ba7d49c2597db4b5b605a5edac7a488422b6ca92689ece44e6c5b564129e349d6435d153ddb756a1a1c24d2ba6768b54383a064d7974997f37eee99805248c8f02770d72ce43ebc35bd5368a26937d72bf6df6af35c628e089a476fa4a324d3b7e9fa085ae7696f9185efe815cbccaebb38fd714c850373e12c98eca68b4fb2a588b693a68d918b47312b5f9babbf3eea53b90ae3dc1e1a445e7bae308356fe48f087b2b1b97d5a8ce8f6ddc6f42239ed4544473d7e57070148f14997f8e187d25940963ba190505e871b0c21858cc92d0bd1c54846687e34348544b2dd1eceb045bee84a34d7b9206d9b10998a389fc0860a5c0aa457bd5c28fe8cf209508ddc25e5c243f9ecbd1cc5acec1cd873aafdd6a7ff5b5ffdf3097f0bc50548bd8ea04de0d56510da4d93d1e098743a07439f31541cef82f4037463d8aa7a48bf43178b7bb40cf7a37fbe698cdceb9499753f28ee827532296df959a5a3cc28d14432e486974584875473ef102e0d7380d0940585b2fa5cd55c7bfbab358eab45738b6a2540cad71e5bb328dbd278ab363bda3cfab3d89187420db0351ffee139ad50572fdb1b70c226d68d425c0b20881a5a73c11f9cfc80a3e4cb235bdf24d05040738b7c7278fd219a1c5804bdf3106d842a4f12cc7036617cc2fa53c439ad65e18a082aef072273280c9da6b1308d3ee7492fe7288f1eed3e93955e1d5432f7b5f6cc9983ce1bfedbfdd57e77acd474d8de6449eb01ab7e07f8d1638168fabdf9cb5b8a3a6b29d1669193c608eb3cbadbeaa0e2b4f66ab8f59463014465ea626e581b4cc22230e3dff099b537951d7b1c7bde9d427cba6956ef1b0cda65bd9c364986d09abc69d8f2a10da580c51dda39ae99ccbcb454d63188cfccaba5495c0c2af92a634d36cedc0c830d1997b3ef8854b8eb0a336041c2df355d83b8459dcdba631d3a8bde4e6c8b6f6fd29ae253bb8033473fd3ef6ec6ddeaf71de096f57760e7e59e95e2cccfd8e19db0a8514fee8b72b90180f11c312bbca6a9b7c1ce5c2e719bca99383986c580ffe623f508446d2ac126d7eeb0f2a6fd378d92d757362f1949168caeb34e5e9387aec30f656f187146d01493e61c85a641f69165314364d92c4f58d61d3087d1c917c30a6c60cdf64ecb9cf383fc999c2ff79fcccc44885eb6a424a488e3b9c0b5db234e43ec052065c45fdd99bca00780ebab71d3b8511ce9c3adfbd407770232fff330d520ffbc38b41bfb3a3f89379509a4a96cbe99535945d7268743e4a76c73ddc11e13e0a55a6231711f0ec176743948c22ea01f705ef8ce4e7f62b168dc240538e13fa25406bc4563400ab17b8b8c66c5e867f21db0b43266619b1c038d8ef807b953922f57017543ba974ba8703cdee8dd0b849bad18f1a1e2f50153dcf2b14a2f9b996b48c1cef5b9da287ae36fa26337b14e9bd0a580c2cbb565c8c925bf4aa140096da039e1c799d9f622cfc655c5d9e8357f4ff10b479525fa7784ca4e2059f33305578f50559734125a72e10ccb211dabc1e52e68afe6ba577bd96fd82aa8f9b083e6a59eb5744eaaff96797ac8ffdbef5c75e2c2fa63051bded773d795311e87544886df706c958b782670d9ff888637f089522819d02bbdb7c81c728fac3a616306cf57089d7881104403b715f651a5edb6b6693d2ecf6cd9c238bf7afb70052594da24dca95033d1fd67056ea205ac114d08979cee70d3df4dba67fcb41f7610b55f66feba31c7a74e1efa1e4ee1d9fc614bef902ea0d4c49d9a60d21eca6f4a5003c583b0b600e4968b1d43f183039dea89198fc986c6089b039a66f665f5b26b67e716a6fe8c136414b7eaaf40b5d5361ca451041932b0bdd6a6bfbfd5b485e4b43b5d44470420f74c6f147738fa0f51f53595fcaf8137f9e87c84c1941a85e10685d4cdce6ae2a1a47bbe99dc0b9b95a06fd543cd8cce7cb4eb063c21e4834ec680cf4eefc4c2c16032c367a5545a2fccb45cdb86465097a4ea109eb35ce23038d4e92a7f0f414d78fdb6cc72369555186d2c04bd87d06d6771974e72dde3cf33dfa783f1444a49722f7d6dece0a05e9f374379771d2230899b173255ce97900aa725082eb8a7a4c2d932b879814b147b5226c8c4787848f0ca41e3a4eb4beff22fa70a5834a5fccb293e02646ac09e4b8c3f92cfa8e259ad5f70cbe7d67761676f7b8a731498a24276488d493fd4c4a3ea3b42f68f798659b5907419d5ee255b2c95f6de890f00a44a95224072c008ea7cc31c82b729c46c1c9fe3dec10eef34af1c159c8560ac513d8ef40a1bbb4bcccd83983a62122b1cf96c802e37b5c0f85b52ef36a070d5d89a12ffb35d4d8ffded20f5cbb286b31bdc5668b76fb86a74169f1ae18c326230330470ef3358bfc5c4241a7dd7d24f758ee08057a2958ace942b98b61b0919bce7fe264306ffaccb31db79dcdff7b8a2680b508931f7ffcaa2a1b16d088ee8a9706d010a67fcf52764341ba986e94939125b6f78da93cb908c84f1a7aac1a33b9f11ed841cc16f540b3ffa247e3f233ab87dc845bdca53bbc104960e115a23acae9f355c249edd02fa8aae8a7be8e5a54c442a5b44389a8875bcf244f419a4d16c058c20a795f1143480a6ffefb045acbee6f5f356b978b418902e7bbae9c1f37a07ec05c384a46421b86b92c7441a11762babe77d599e38a856ee08a9d95b229f740099544ba07284f70978540e3a4d6b3a8ec157cd9360664c5bd15a8833308de297bcb61a4c1633fff7f0e13bd0576541dfc267e10ba5de88726322028e32ebf736e766825fbc2dcea50599b37f7feedbab26b26cca258614deef9beb85c462a6d68408ceeaba77470463b1ecad71e60873e249b58b3844892d32cec93ca6a0c60730affead8be64588f9b6fc7d38ef75082a7fac3b25ec87b3b5df21825926075dff4035e0e4e0978e1620d1474c0021cab5d7a2ef9303536f7c015074d5fabe91467da4674db5b9a8935dde4a207f0a62fdfe4f1a962cd601033bdaef1e5759c63073a99bd9126f4b417a2aeefd93b917241a2a61cfb5a602551f6296ec0bcba4c5f7e2bd24e0ddcba46680cc997de1705291ec01afa1f72fdd61399999a4fdbddec5f4bbe4d5c3ff2ce1749e79dc091824008fa64569e9f7691101123e05c09f64823a5a354b4e25a890acd5705011985a6d65c5392645ddd8f549c7f4812db9dd38d596b97d26f95f1e0b6f4975b1c38934bc522eba6b97ea868c995c4bb2ee108fe4889167ab105aeae6512f93aed83e44b2fad258724cd7bcff547ecc6b69479070715b454096321e360d5e5b0e6331f1779401467946b4b585ffac1be071712141fdf527a17b97c3b1a377e5179a7f645d688c9ffd5133a451f03a74c5f32f8617bba431998e3d79399105e48558dc01c78fab80f82f392536f6fea47445d634bd97dec10d09bcbb6fbf0c3d147b0a9d1205f11992738e43f510987f774072be8a083826da8e45b5045a72c9acd99f25399ce8edd7f2802aa13441b8c5edd5ce673f03e4164075c9cbfa570855e31783fe2589d402c825daa4edeaeb17c01c19a39171bad9243d2fe036562204a6a9e108d9814656fd5246f0620d09c469c5db22521d6516fe9aa5dee391d79402b1671722e54f26d16f1f761778aee24a3fe2ecc38e924825484790d0fabc3ca5302f6fab6105e058381e6c6e2e99c92124ff87503d8960f51bb90f3803a67208a7838c4b168eb517868292d13887d891e95235191fd40b4250095da0c677e4c51e7bbf142d5d480cb063953ef856f9691e1ac66da8c4afe224848e0b2165b8b7c07e8833ed653d1adacc24dd7d0ab97e592edf126b7c272ba0ded989928568b60d6907bb722a70dd921c78406fb7f57f65622c001e85a2d16f5522675b3a23b7cd89e7ba4af039012e79355436682ddeb5cfc516021d6d414bc2a4c80b587346a09d0730f4e69af381ea822e90ab161ec8ac03b486cd90ae0c00061bbfdde1c073ded59cd4f63df9ae7a160bd3e4f4e8c38cfe3073adfe31e0b3e608dce1e128ec6363d897d2e165197182f1c88ab87b388cacb0d693fae5ab100a6033ebee720ac9b350db501b8ec19ecf768a96a68488e4c43e0439914488d5055123b69037561c26a184f0a3d91479767870153fb538c1ea10a3f509c6f9bac2d4ea482bc759f40251930276e8bdcd631c40a1b1d3f78a303be5bd8e92212f0ea8ff7b451481983fa07ccc72413a2e9875624eb00d3aeff935216020e9c36f6a022d6466ba098b407ad0b700baedaf039c9cbe08bdf6dc56c9d8d2832c97a7a9b802ee2169ed72110ea12435f944bb3f1caf7856a9dfa5d3ae63bc15bf6398f82b634ac2438c0b73c0594f8faca9cb9cb58b6bc1abb808a0591a691f87007bc035454d5b191dd680429051f900d5d4352f2198a16d082c874fddc06677f9eafad5bc0385a4dcd0dcbb80dc41f21876af914439e243b39b152ba347b22ffbdff45a194cbeec30e86df533422b9d08707df9ded14521c432d8ccf9ae85e512b0b94050c7b14c77746117033a30f1fced193c520687e5b4b732f07dfcd84bd7a308a9bed3c438016bc52b7bc5ce2c92932d140a6a13d4b80a33091fbd1b36c80466f7f2327998440a0dfa0fd8e0d3cca0f632e1f45dc9011ab8cb1de0045a8945cda46b7898c68dd8964bbab63bfd251e421202598c61a3243d823856f0972572bbe2a519bc0d89048ef7126301f6e083d2083ca7266c11b7cb97750c734e4e50e1961a6a8cc152b2790be40117f72380ed6af78289057024916273b44657385853190536a1fc4c549873ecdfd4e153af24ab6ed95d113570251178dd4b4afb20bf1d913a411a75dfbd67a769e91d41f852c57908b946cf501af66cf1a0b3e56a10b33ed64d5ea5ab45d05f2680efaf4c29005e88e1a4208664c32ca1a24d0801725a47fb3ad952b449a9dfb818a3fbd3cc85e4692f718c326c3eb276d9d045555af201950758e780ac1eae5cea2292dfbce50e748c07885c2aaf0d3a43fd79a70c6c2a08413527a69afbea0211ca4173bf041511e2f1b6986f00e7560cd00fa1618c0552e7e91e17897726d47158c3d37bae083dc52e51d05cddfa4b1a1e9e464208d017a6fc0f9e0851fae3b3c75616174770a91d5696d92fd8e38b81112ef3fc0915a9cc7023155258f52544acdc87ad9088614c78b343bd275f8c5a30e84a9459ebc0a7061a04d0ecff65d08ee5fdb69da0a842c4e7c7466d468ee1c439fe068efc00ef65f8d33f68d59598eb9672e77316b0be0d8b6b6a0d9d4f440adb5a8365db694e549c64990894fcb326da97d869fcb364f4a504a5b19a7d254ebe92a5b5039f876aeb87f279105ca6ad9d6d0ac90320360677af5477fc7c622d9bce7f26851ecf373f23e58e8babeb5b260dea3282c344744eb2bf7f59ad3a8db6e5ae340919c8a70e4ae8d59329ddfc878bd2ec23177183825b9d3d317b219189fc0dd77ed1f7fa26482185d42d2f12d0d2bfe9b994d569df035d58d5b064a6038ac43460c4e6641eba1efee32da5122b50cf6393b1b0158734c19f73fb44c0faf8deb06b8bd5c577d557aefa6bfa1caec456562b572d06ba8934091a89f3e3c001c7ce48af1ccfa3fc0d5929f694491a0bb2a31e6570824813af23615376f5d110ba215f34c91bcc9b651cee8db04968f8a04e6e34685c9fc86e1e05dc84d8eed90bc440c525f7beaf036956010a0064f3a09d16ddbca3fa6d1c0009a577b382ac18ef7877dc296a329cf4e764d70109f6fa5d1c3911d6767b6a5200191ead0588a5aa82040bff34d74c183e2efc7580fe2274c8ede80642ef8254e0d94a00b5a6fde9b57f520a09b0220bfefd85bd1c2baec27e4518767717a3f1e55a90b280ec8143bf31de4b80f5f04d6c55b93dd82216c1c3ed9b05dc10891d1d0f049c2bfbebd3a5e627298a2278d76de21b925205b424dcd219010471dff71f68fc8e1fda2f0f580d816ca256446d5e66f67ac823bf4eb1000edc58cc501deef112e1bb5db9ad797a0f24224ca1c1bd39d2b073c8eb44db4c4b77dfae055b4a0221f871645f696277ae02759989300673eb79dab4e56e233a1ba7d6e36d63b457319dbc09edee2a5016273717c16e916b99f8002f156d91c32e8e97adcf41879a7a64651c81efd059f051983d85dd1a57878315c9e7511218290316570d6a5176c3d656f9cf721922b78df0d33f3dec4d8323ee8bbcfa22463605157e713a40d4e93a333000e2673ad5602e67a220e28959f7ca1c01a037841adbe7276723c27b9a3771846e1df62ad9f40cd41f91ff9354d298b8462519b2933b7e31ce7fd7b1b9478042f19dec752080a0cbf24f238829de9ff7cd63611ac6e8624cbfa754dbb65f502340e07ea4fd119be1288cfa898cdaa608bce6fb787d27f8ff47cd6459af4e47a7f1c18daf0c5e9a94fbe4244a676b4a4b580fa848265bf68a93b5dd1198a608df2cb6acf463fadddfd6196634a1ede47fd79c9f76f0e932227b63735b1fcd0ef710a2dd0d31ebdb2e05c700876fc9ad6f3317ae82e8b825b7b6cda5aef2054c83506945d0db0ce53cdcdbe01c0c5c84ad6dbbd4a87c691bb9ad6d73287883e87023545a11f436433f00471a2fc198c1279a7a7847605b896c826d166870a641ec24834c9689db9421854cc2136f5b400933384dd8b603316602b4933866a69bb8ed0294904936e1b01b2820d30b4c223bfb593fe64a3d2df7dfb19a53ef07abd8a4ff4572767171afd14e6fc362f9be328716d5e0682f000bfa692b13df8a5904fcbf2fbdd7bf5cba8de8b3eb153dc38f0d07e3c5c02530293dc9318414afdf318cf6654356f21b50ba46d53848080b3fb4413ed6548ad9d9445801a7b34ce60d21f00a2b0c3c27c68c5575fc20631b93864c228a1487928534ea8a3ba80ee5346e79aa0dbf645b8584b0af81920114e3afe9e3b0985ae0d8657e539c2c587258e05cb9cf155114648281d5a618c0fdac1e01cb3da2609a0cd7735ccf6a802c8a38b7e8a58d85ad9606d24b1be10303fa7c12ce4061bcb575510cd2099ae0b8d17d466b1c51045edadc2d5ca85799e57e1229cbf775ab316d381f65aa2db04f3a6a6fc7fd8e6d4a646c4cba72b1385a153bc4d63d23166912f8f6f555b29c6dba936c7457a46e360aa59ad99347d558d7935e615223b599e898c5b1f47a0e84f14d53b3ac4954a273f64974b8c3e204609774bb23594cf80f51fd1ba3d7e6588a481c81b3038446bef34e9d2bc12644bbe089e1dafa8ef08604612fdb57b36a5f647dde5b0966a1d5103ee3c8cfadc9069bbed9a7996bfc07a0ac7e44a802e73029243367ccc6787de2c464b43bda04b5f565c93cef9b412d2da365020105acb61c53e02fa4b991228271b381f05a378269ba347c84304ea7e1fc8549ffa6aefb573018bfa38fac11ac30c043260c48dd7c210947ece2583636076aa084df82588ad4e2c953ec09f3c5cde31290ae4510cd7eb6c8c010608eff26564ce0bfa0d754f89c99a4febdd9f7d6f68192e720824e6210f042ef159f0a93141238b0f0612df62e8e549c8b1d3ae299bc4934a2f83b2290138b0b7a7ba5dc919ec94707fb23cb53fea3011f2140a30759bf4a3c5ace87083a5f6f154f859395b5e44359d8f31d8dccd07e1748be52342449ff3fa87fccface3386f2bd1ce2a460a7f50ec89889d4083ed0b16949e137f8d7b37bdabb82c63e322a181a3fecf27edf8fadad9e1581cba5b683c25743448d35a0424c1aaf482df50b9806ea8e0bafb6271976a4e2c7e6ba05729f4f9851e766d845e33f8723e8f17f7062fe56c13234ec67bee22a2b18bfbb0191b2247d150478366c1667ed00019b460734d3cca611439cbf288e134e19af770cce28776d96325d84bd75bed9b4b1defc56774b22dc0984438045e4de4eadd94689b0ec551494d3358a29c114ba09770530e84a6e94ad0d97ace921aea7fe7fe53ac6cd9c85c1cdc8987bb593327f968c854ea4cb34a369709fc6f0a685aff9b3f64f07ee1c7a0195b25344ea26b7e4ff484910b44e192a0e42ad8e90608bd6a5b34eeb59adf624a19db8e77718cadcb44d27fd5b92e8445078905f2367888fa830ba03fba6e8bb11394d8bdf2d970ed00ec7d8c5f6e76e08454ee1d569a32cf3714c01bd7e9f835bb3b91c36b4c7f8bf25533a6486f5920d4da5d48b306840a8d9edf28e91779201cd747964ad3a143e2b593f08d821860704cec73df9eb2b202b705d6601f479adab20481fcb30023f2852aec1fcf3a884a32ea58dbab19d7753f65066021a901ee5c3ce169a4beeb8f0223e8dd248706003be8e897e5b14d11b8fd9a9b9a2b4c650ee69c73b715fbccd429d0a551a664964eadb9a4be8c210aa3540210ec9947201b04a2aa91613e1aa135faf15ee3f03b7d86c781f762488693f7487dad22269692295b6ffba0b4148a3b09199d567ea4184ab0b625e776de27a6d252bbc4bf827463d8aaeadff79e8ecdd40e0c78f776841736937ca108f33e5ecd97a28a2f5ccd5a8432698cfdc451d7a40146ce9a71377ef51cf9c5a9627e0723cc353f257da97ffa5f46699dd848dd95e41799197a0abe522a43577b9c24c1df944e8fba9713256d398e572df198e35730bfe5b9e339098f7e016057ddd909e62e3b96777027acda0090e69becfe866a0274adf9116813713f3e05e65ef95704785261f0ff64f1658fc1402c420d8ac970a77c7491430063c3eba053d725abe73cac91b62122462d687ac46abae07fbd1a28014ab9188dac004304b4ca1d8bbc137f92f0e550f19ce8418d49eb63ee2efd2f5c95935f22c03c5d32046a951a5df558602f741f675f4587ef40b51966a02f4e3accec1cc4eb9a34cc677578783712d5d84de09b4b5957a0b60a81f76220fa9781b585b8da225687704958bcc40024e35b81a99fc35cbc580ca2b0ad7a3b88c439125f4b6f12d21e427af5c4dbda9eb64dfbb152646fead076ea4c7ccfea014a1390640f4c65f01cd0a868d7b08fe13a02d2f761f458bc85099402dd9f8c158bd12b0070fa8320a5aac50cd0d89c0c338d37b13de75c29316cca865a5dd30b7ab5577c352e88c576645254816708010fd9dde718ce9059743f994a04c2a11e915681717437a5f01c3d00c8fd415768f625b25b8742f07c9fb85620a788744174bc588066decd3eac063027f60d3eb55afadfd472fd3a4b4c94bffd8423a68d7a9bd678f4ff05d9f1848cfa55bc5ccb0e999521b9c59430f153b3cc719918a888d8451f3217ea5885541e4581a52350d8abecf26d835b07614c83114f52a2df35a3644b4cb5aa207a441aacad1a3018c35e42e84844d0e1c5fe6279da2299f8a8f3223aa9601d8d402f471ce38fcd88c461d274d18959e32e57218d7b9fb17ad16845055d96d327dcc67dd257e113455953c3d69fe1a4acbf514c7e6434e7e417072e0080de8325a9c5f83e52f529e037e0dc5558caf97f245f2167b424c58e58f0e4e147f447c84398a0785f39281699089ce182e0e5362ef20f3893c88840356fe978142f9a3b2f86b051999b606a00f977ed54af17ffa5037263a6d0e1dd9f351af792397afb98f57ca680ef766ffc396dbb529a089469871c3868a5f5720a30ffee970abd94d05b4cdb84c89e173467acf9786e3aa2d747b8a9574a84abcd32081895a1584085b5b616de924b9fa8112035233bc916ef4e0ae4b15c4dae16131ffa0144340c14a2a477d9cbd89200f50cc13a4beebd6adb22cb2ae837a7d0cca2f2090be3b414d022efed0eb4d4286ecd04cf4f38d372289ed001d9460d1c7cba81a16c9c59f631c007da9afd81ae83f080766aed1ef637dd7e9aad29726f0a54ff9b04212cb69d5d748779db6c666dac17c19cbfc42af463e5f753ce7489168df0e8efa46c06299cb51c8a5d2f4eed2e57644f2508d65c256e29b57256ff59619fe9178ddaca62897f0b8376b412913c5d5ad0b744f248a61623b77b134f4116f95b14f14ae6d55fc9ca0db2d055a3bd1332f20beef4930ec8a01cad54e99cb112f60e8636880b9c8ac38b4d0ffc008586206f69002aa47c22e8fa6e0f5ed71da76f73512c78b0a9319abef9033d3f968b652c3c17fb3c342a3df4b1ed295ef848a162d6d09ebf213d4d58078aad6137e4d995c664a268ce5363f212638c14ab390e9e2cf3a647ff6e0da01c2953dab0f09ee1d124ce5e221248248659f3fee1d5ce11354cdafec7e66f00401c0afb9378e27c4e7a0c2c7a3909bd41e24b18d4895bf54f716c12abf18e59fb55fbdd10d2e4adb7d5144871533429f889e9a612d3c421481932d56f60e3baebb10a7a824156f314461c34ecd161913486b8deb37c7311dc5e165a4168f813751684f705d50af556e5c4a27b8836e5a771cbe86bd215424c3d650de12d335c7047e535b104b7b1198e73362307df6ced5b2185b099d6ab8892654b803ff03d35a6a81e0630c51882b884146e00686f5520765997b50e00141bdbcd3f08e1ecb68d49095bbc11fd12003198e8df7e5bde738ead8a4a0c224207530fa0add4a19828a70ec9e0e17a0a2d1964d591038b57b89cc2b377399ee091a86bd4ec9e401931f049fb603eb594110f911f402b1f019cea9fc341f147dfa42ffd4d065f06d07b2d98294a1bab52e419674005672b2733e36dd98e2966bdf61cf1e10ab59d6b99e1fc90c6ab300b4de0c687f402f8d8471bb4d06e3cf0850c8e0b523b51b332c38657a44422f886284350ca8e24b6046d8bc17dc051a3f749213b72aec37f75d83022ba095ab3854c7670617554351b3f176c0275bcc99a65f5e43999d0c4f7c6986dcc01a9c1639cd3f0c0910631a27bbb0b26b2fb132d33727b52d2902d8a2d9208c82f0052825db68495d63cc3df6ada1a2bd771f781120705abae44a04d198b31101a45421ad9a13094e4e710ed6b272f1789958cc5696c07dee801ea185571672a8d470760aea5331c04a20e4faf08b8d29bf230c0581ed38fe841ef9079da471e691ef5232112d322dc04d6b5d2956a8e346e39f61c5c42a5b9a656cadb75cb776cbe76f8f436049761924a24e4061f9ae4965c334933b1cc09dd59f89fc7d47f5650435f3a911669b3a663c81c98046ef3bde448ca55ade391a0f8c7d2b0ae5a4337060ca6d33335ab0c39ceb14c8b97f0b83d678ff6b14eea9aecf914989178c154ba0467bb6882ac7cb947636885c6d3ae5cf4a3024af05e43ddc3523e34a49740be97c6eec0b27cc0e4925a54f5994d59360d918bb5d69db3d883ef4bbf88d74b8ab6fa775e610145de2729c6158e7ec2c4d2246206ca90a85ee881ff486b5c93bdb86fee52f0d35b2bcb8c67681192db5836feec456d2b2274e9168bccc1dbedb9f3c7a9b9a5d3070f3673822b8d9daa60284dcf69f4891e78e68eec8f3a1cd5e36d424d3166cb02c3400a3458f7cd2d1cba439c7957902ffb8f7138370813e02e8c30238a5a927063226fa63c9e69a0b8d11ba5ed95765d9139de1a622655a9cb9c91a365486410da0225e1f1ad3fe86d683575eccfa9f1c18c3c9b44b152e6153caeeb9e4b4f366a6b84979918a042c621b87854e32b6f14918c3dc7100c5fce83db9857865d0fd797a5ddae9dec94ce6a8c70040caf28d491fe60b90936009207ee0871adbc9dfe4422181265e036fa7164fc4b450a5850b4b0318388500e2a644745938a976587a24c90a5c350ff6fa304f90bfd9420d7d160b857304a6588cea2b6e3dba2d828c99d17f96eccde99685dbed79bd0bd4fa6ee4d94347e0623ef33dbd0e70e0f20223da154bf5b6cd6e181105382dd3f79a16eaa50aeb80d25a9ce4f66f6e1fb98f506412b66d1302471910a7062d00b6f9102d4379a1d2f3fe45dd03a4d78211a86e505883c17e702e7e75cd4b74ef6510d64ce6e733cfb11d647b9c1454071db39c64b4d78baab23f2ab3e0ce94ed8bab48e8cc76c96147d37ae093bfda6d856d8256872cb8866b89213241f05eec9f91c40b053c5b2061f4d2d8ebb067f5c5dc1cfff740cc8e59d9900bdb1b6659c61d4bb043a7c825a2717f049dc3024c1c0c6ed216ba7c3e17ea73f25f26f6372fa0b8e962f2eea641d16758640e90730c7c731e6f831b83ee10c219c1227e25365f565c081185ca7920954f441af5af4835729fa271d70812a30dc2ad3b6bafd1a7f6a12091f133d954c989c076be7b48cc9ae38a83ec80dd70670b9253a2264bc989833f1a47ec5c561d524c89a9e2aaa8b78d942add2189ee83d386611f79b32525d17f44e39a85db3e96a1e1bd9e24c88f36b3dc0c44b3f838e274fd1b768baea02c1de7425ffe7fdc6ab450dc07817322130b2b9d76278e12af56fb95ca5760ceb02f6d03214947ffbd1508251435dcba6454d122e2f5765f3f74bd8868b0a3eea4e4632ff311e784ba85506a566b7bf2246b15d3bf6f56d0ea8ca859007a17f6b0819679aff64c955ae3d5e3b73d74b7aed25fa4dc79c7db8a77098e37d751983becfed97f34215cb366dde01f50e6e9521e035de3d3612f64916a2ac676f30b199f70b745a049428b624f06514a57c871756d84f4b658fe62c9573cddfa0072180fbd8b4cc509a3ae757e99b0755a1752e5391bd808d46db7c9814c389911270a85426861a979a1a30929aff44c5c053a484338dcf8e6e23b7c3d3e0647a985f74fbee68df1b57601164d1352915e35a5e3117084567507ab712cecf690064e487d2345e880d1327bfd7db0ea13e864ca8ae195c761876018e88cb0396cd4ce38d338364863dd27b442d0eac329bda6c4bfca718c2cb695067e0b93b9ce8861387f7414e2a307c34f7c0bbaf2eec9ed9a1fbecafbee992827a12862dc3b9c0dfbb30c1f8c5ffea8b2d82c9b85024ebc93172df4e57c38722f1fe1f536cb633568dd376b4250f52b5d580d2949a7a7c6359a6d608b4bf8b872c15cf019cfda39c1a66e057b8d7ee30abc3c121b9abd60e64fcd4e1b8213fabdcd69e8508c03a9ef92e3034d9540f2b88c50a81b34211ddc3d68703cd158b34018e4c57214ca01ffe61845f3582cb7638e5c1a0d251228cf405e4a5e20747f1844b4a9239a66f29ff892b19e310f3395b905a110e8bfa80d3bd0f87a6d1895f0574809f127af02deaad0b79dce48dce43fea94b831de0ca0cf0630c7db5eacc2eead7f2317437affd06f0e17bd31cd01748f02facfd95f5c30903a4e075a287adfdf3947b08ff2493449ab3bc1ef65d4467ee839e089a2e51d9a7af3c6abe9f8da30b7820661aad8912168105a50054215007457d1e767cbf23352b99e722edac3a1f7c438d517bf3314426437da7b6f29534a292006c6050206ef1f032a4642f4e917419f7e18ff3fb224da1d8c9fb73dc7544aa99635496e99ba3deeb4a72f52d74b172e1b21d3716b645ab73f1e797bc4adce10447ccca361cd6e7f14c15b7feb238addce11c50ca3536c9bb6aeb6b62de9227b95af1b00333333d30eac343118b54c45d4b4d472761351733c0146c71d97db3c392d8c72218c72968adb4e85d10fec74306ae78709d30d300146474ba3080a0202e2f1adbfd2b01c57aa054edcd60f6e1bb87ddc463f1a534f163459b635362c06e2df332233e9d63f362d40278a6c0462e0d0841053c800c6aeeaac8bde5882d7bdefbfc802784f96fb56314cc58c35441d931e5872c024ceef62bc98aeb34c6d8ced7105fa510a9a8278d41b42b9b96d966e9be57a1bb28d32cdf57c734e66ef32a768f1a4304589c9a01b8a71d1b16e6c5c5e141d3f4bc8a8f914b10519301d2734a8c20b18b8e880a887878aeea5e089c1759006e461e2ca5ca6f15cf98263201dbb3d3375513fb6b43379eea476daff59e2aaf295ee4cda6cf9b53bdfa81b8d749111dd69a4cb8fabd848171fd768a40b4ff9b19dfb4beefcd8c79698319069bbc640de86e1cccc8defb9d3965bec91f06adac6825bff02aba69ddfe44dd0c59dad45ccfdffddfadcb267bd452d7b7693ea3ba93ce399768b7d8b613b4b78623fb2bb09dd69695a92ee733eeddc8ed215d244b7c792dedb9767e577526d177d8b613e96dd5886b7eca2219ad4b76ea77d26d5bb4ce391d24a3d3a38105191e10a16219c78022bc90bc5b58275d0450c64c8906ae0a2c393126e495ad77fdbb0ad0d193de3da7d1d805b463a6e5b7eb7e499ebe0a3e18b080b979e1e6c90c1054dfc181252a2e4830513242f07293f2010dd82e60529519c362e4c646adb2b7427f2e1a172291b86afe7a4b0e0717262acdb98317455dbb1ec6e17a217d46a90440cc6a00273277e50011757c0d0a2a5061e94a1275b4c294680455e391bad4a121c2bd188a821b4218de7e7dab84c93d1e07a976944bc704b9bda898ac7a372c289ac8c306e00eab1418c28061b9041c5882a82c0704314464a34273fe8e060c40a8680c20927b3a2b6dcb50da1e8242d4b827e6a78e1053fe060053720a2724592900d8abc27de0e4c7c6181d10b6ad0c5c3e1769818aa1451061439b002d632e410032349952076608d3403922a767a08f305161aae1645d4a018922939910456dadbb343c1a574db72d7012dbca840881d90ba38c286b333a28f28b03fc24fa0a00535c05c78da0eb0ce7db4b5dd9012464fc05c7823a2c0b81688b1e40630171e290b8c1bd97de8c08c74d6b35e37eac03ccb7599412ca11ad071d61b3bebc24311a6ce6dceb90d553a562e755f0c79d58d47788929b120602ebc1718677560a4fb70bbb1a0c949e73654dfbe144410d550e1a15d3017265da4e06105421c050e9410c15c445101fbde081a7a88ba0a121c1183b9c854e80063617144b4812ffef8c12709e622c33e0e7cb16fc8411652602eb298807d9d10110dcc05892a4b31e08b8dc3ce92303ef0c510a4c492be00bb24994113538f1765c03e991fba2c01fb4ee08b3ce329a202fb2af822b7e0052e683053c5113c5a40b8620a2cbca001be7804841dfcd85003980b376500a103ecad8b3fb2fb28c1fb223f11f30103e6224fb103d8e7c1cc92446c0b988b3459603aedc2b7fcc8a6850b0c33980b3155f0c08440116124a4db01a881cb0ce642b7cec72d54d94849ed4efb5d8023eaf35816e0883aaddb155043d86e964766ebe3dbb9026a089be6f3583e3ffda74fffe93f8a886f6c5280dbcdd6c9cdc94d6e4e6e962c3cb7c2dcc615c6155043a89d965adbb569c88fcc3565c27562975a1d257eda165e975a9d15e8b406b8d3cecf61735cb7394c9832d76d0b55e6ba95d1713ffe985ae629faa561ae8ba50b23b86ed94d41dcb27d7998bb025bb72fa28818e0ba6d816706b86e0d7039ccfd26e8ce5486392f509b9db473a2761fa3c34d4274dc6ed4808edbd92fe6847a35d04ad75e0d74ed7696f346f081656763ec67daa80c9d09a03626469c31ad00da8926dcd2af498809b71b356042c7f84f990df8edc0763b6e1c89d0716e2f68ff496fa82988eb6603397076a6209e49c8f781a0099491399d4618aa0a8a5a739bb4a9b161913366d0549a10a44183a6d284200d0d9dddec40f6808707a6209607e95b494a0005e003fc68d7d9094420032aa0ec5702b87252597489cecf82350fc855464e6e4fb51390b7400fac7960cd036b1e58f350dd08c650603eb604d66a2092b73c204ff6004f96028b650a42a70f3abb2d1dad3ba24b74892ed1a58e882e6d769b37e88d22374c393e401fa6205ce763fb017e31dec675a048daa06f1373dc9810a44c43e8a574c949301b12277792984e40dd6ddc62a9db891e9027643a81fb1ccfca61b2c961c54607eabe5c41ae1fde72a5422b2dd70068aa07e4a9fbb549888c7ab20691c05a1560ed76035872003073aa10c6d06e8f0fe62e2d5ddf88ee0b6db6885b7e20d657c1dad4e5b8d2c164b7e46245385c6f4905b56dc9c562648e85d79fffdc91024a676c5dcf66b3d97fe8154d27663c6ef7597d2a904ca6e43f2603f996876493bdcf267b9f4df63e9bec7d36d9fb6cb2f7f1629bcc9319cdc0aefb6ece39e78346a78d8aab7ebab509014d209e2e896736838f7994e0cb5e267ba107fa2df64f9bc8f0cb3cda7b459eb7c49b794dbc054ef18ab69957b4cdbca26de6156d33afc82b62d0c72ba2a92ff39680455b4f33ffffff649efe5eab34c97f6c3cd48bb7e81757b9a560be20a1609220b9bc354972b9a7c9651f1eaae4c34ba812ab082b36d9ca492d4990925bc740beb5217919f932927c1949beace7b8c55eb6c92eeff826a9944c16c6d03436c540f8523729a0e746b75a5dc9e395939ae496299a1bffb30db96a9b754b3f148cb7bc26ae727b748484e4c5cb976db6cdb8d15bb2cd36a10d890de87f80aedbfff11fbf0df136f36649ef43d96bfe63892379cbbf8061cbf6915ce6a21e5de9068edbb88d3b6b43a699fc3e40dfc6cccca94bed17e3753f3e2ae6b8de90793d1188cf769ffd3e71138da4f0801b978e283ca9db8d1b24756d9828c77fbc7ddd84a96ea929cc210b37d48db1d4898f79945e33f9d4acddea86da1b5783fbd48e2bb55bd950dbae96d4b62b25b5edaa86da766582da7695a4b65dd150dbae66a89d9a11c3e6a314de308306b8928126e5c16aa7b65dc550dbae60a86d572fd4b62b24f5060a954aa5523a42d4e6f33e3b7c5a4e7c3852329e8f159e129c0987b6713bba717313c571547c71cb0ae2a08b4e06d52fd3a070c1b52aa4a938455e393428475f0d6d5fa64199ddef320d4a950b5ea64129ba2559249b76ce39e79cf3474fbb901b94524a816adbf9ce73ce39e79c14b8afa24d1f4caebbbb67f1f14832592ba0b10fa1d88ff1aadd8368574901ab21093e66a8dc1473dc4e74262905c1fdcd565739eace3144155dfe56ad44d59be794695e518bba3ea7159476228d55ee7116c55a8ee42ab7474748485ebc7cf902060c1dbd163a99401ff3e8299bdc2ec42bd6119f63e7ba511845c640c4cb962e11e2fb137474112b0908e812df577cdf9743c505029a85ca8e3cebcadfc038496c04f301aaa82549d678abb9d0dc39b6fb016e504b56abc69dcce2c1f93e7bca943a97c52bff26c61823a43141972663fcffc7e0cb9730dff74d61822fecff14c5456b4a6dcba821930297b275febc0f044313c853e98cf7f30c7e9a1a364c46f89f9999993f987de306a574b6ffcf7d4affffff1f958ac16132e23118d7fd333333b38ed9d66dc7fcffff7fff8e8d078f1ac21602f981ad268c8d3489304598b35b4f33333d6a7860a3e683f046f8848635a4a9a1c0550a8523ac214d2d070e1d3a6c685349223845fbe31ce7586ef6bbcbd19f377c32add3a794562173349ae28e070038c3275d0902a094b298d907333f1d017cb1dceeb42b53039e844902f862f977b64c41fe79daf0c9cb7e501fa6bfb335b9490002dcdc148075a5b69d0528004e19dff7e9fca8a860a3f6b1c4c5b2268cdad6ffff9da09ab9facf70da60de94680d6eebfeff99bb9f895e54befd422c201aff395640b76dc61733037e60e7e3534d0fd6938ca982dbcfffc86c3c977958429d0904eb7fd98550ba991934683ca0dbb431460d28ef73398452db3e33332f9973cef9bf8ad5fe1b1f38ea46a78e145d6601bdcc3298daa18427fbb8a1ff3f50b4c9eedb1aa54d76d97a17967950a6d46d1419d9b97d346542e447dbe18a5bf26c879f5bf2960ba3ce35b86ddbb696ee6e9f8a6ed74d9a564854b7a7a2ab801a27f967f07ddcfe936e271c3e54ce24a46f27e350cc5a13e9ceaefc72964807dcb6c081eefa68f1ca394be47d30e944be9dc52b6e440db9746470c601234072e92d5996c94d64cd1b178b5573d3755d77e362b15c37ac1b1b16cbe886e6327ad18cb03a96124dee8f65bd258bd5e56b6ec034da8eed1ee6661988ce7ee083cbce39b4c2b438e39cb38898e3a47304ee5b9c22ed38deaaa314d57593807c0238ac72db75434c4b82cbfd118b1e6ec943144a1157fdd743eceee7200eeba62028eb260d9cd017870d92b29f7d790db5246fcb26168b91808b7cb6c2524bded2ea9923b96c7ba981bc9502121fcca011561bb6468c075e94fa8beff88ff69ed23d4a4dae2c04cbb67ffcc70d32078e14921dff316359c88b0c293caab165d84bde1341b56314ad0ed0745a59229c754ec40008b672204c23ea6641b04db4125a15f16fbf8fdec85b5dbb9355432d7bcb96de52e43f9c36ad0e8c04db734401c908d6c6eac07ad8b6a4d846af7a4b82d849620f91ffad0166956124d8f0556f8530d2c38e40c278a40b47b03d8470a90c73bdeaed08e311218c8c607bd81ee39111c65550dd6ce9baff464ecea9a2a2729cd846fe0335a439bf6fb90fc4f7117f8a936f6988fff354aaf8b207aa21be508cf848fc4cfca127fa2d4ebe4de15b9fc4556fbfe7be0541fc9d47e2e493a213f916278b9c26ba911f895e73d2915e041e62d7deee00e356741da2ef78122765446f22fa4aeca457bdad117b868490b040e114916f080010fb7aa3d85714bb6fea86e87d6d78e09786c8487786b8dd19b167b1d8adf4ca98c0550adf62588b616c044465ca7dbe3522c36244beded8464ebef5fb455dfba42f7aa32904bc1dafe608440fbb9982a050021d4a3decc731b75914bcd563dab7d355dd76be12e934ca4012bb7de4cba527b834a90f268fe690940de6ab90f183970e51dea4ddf63b52341d987060d07428c12d435a4f182435e632ade706af2f626cc4f4d0538b71524f97693d51f40c996862c4e8115aa2878a0745ad97693d3ddd4fb57199d6f382926a5af2c0d0c2c4a5829769515ec049418b02c52d434e0b2dca126118d2a204a56c185a5a9429b42836dc325c3229513b25b04ba5398a79a29ab878465453166f065a0e546e19823dd072781266a1e530c32dc3b0c82b27b4e417e69636df11174bc494b408851105130488014a141d3c21e5091874302200abc52d1cba3137875849647802290721c6800263c00f4b806460830dacc4bc1e2662e070bd583727a5fb60cc2adefb9f99997fc9ec7f66e63fa267ecf32fdffa9cefccfcfd5858b162c58a152bdd56a6b06c6436372e998b8795d91a5246d254594d85b2f0bf7dd69024cbc6c6ff5361c8c3daef98884a44a594372a6302afdc9a600213af3be77e9b944ee6ed99731cc14098193524e6ebd643238d9144123f4141e1a474063dccca51509093a02c33415d64415dac04514ae71756a88f57446325e8c9f4792b415304d92025a994e5380a0635f185956d66250b6ba5cad7be6d4e9f6eb5ebe8dbb06e9cc4a1a3cb86167192e6b08cd0accca069831fe60c3a41b750b7d0141f7ae0c147ca0e3a38e9e9b6122507283c4fe6ec269ab39ba8bbe7ec26c231858ce984760e3d17e37ad10e93ce96f9cb3c210f688231f79f93fea474936dde79dbe799644c32333368d0d4a891d201d68c5e65a4f42a4f0af2241dddb73ed18b8888ac15431ff2590e9f8d3b6a202124c4c30330ae72cbd45dc643c803329dc00dd9bc23cfc833027f40f840bae4c944fff9dc0706d6729c8cacd4b622581b77ec3005016b3c4298e1c97cc76339c0182803911c1d2121e1701e1c29932fd941ce80595a4aa5500050d52f4a4a283086baa15289d0a3478d08dced2529e906d9832e819eccc1f852b7117dbac5977cc9977cc997a87fd74eb2af0792290858ab016bffff4fc12410c9c9114eb21ab0d621755eba2fffffb42ea24b212b882eade852cb5ed5b26e89817ceb04e42ab7474748485ebc7c016be149f64d64c3d4b311e8522c0c1823c1c69be2e343e5c72615806eb26449004a0041fff1cd1d0b1d124a47345a90ac174eceece5cac9c199bd6a727270662f9c1c3a5f3937362ab09064f640de0f596ec933ce881a174e4e119ceeeec6c929f28e53e4e54a02f2268037c44333e018d9b73ef87477f739ddddddddddfddddda752068638e08123de230b2a38f996895aa3a434019ca1a19a83a12d88b62b27d5b154df269d94cede386ece6ddb2c67bf8dcb99af9cf1c6e673709c9c624d19d55f620b7f59e02204e8882734a96e8344a9fe9acd68b498792fdc92671d0d355b337bba6c5eaf1b57777777cffeeee98d0364d41b0bea143390c1acd91ab7e96e178f174f76ddbce874bd58648d919191bbd7dcd4bc705c348aabc645d9baddddbdfd81a6f35665a888b64ab667f7b4dddddddddddddddddd538a1a8109a8c04227997577776db26664c08204b7e4d99155aa69178e4f9be3e4bbdf14e9fefeb629b23d4e4e119c223ebe1ac76fc95bdcaf80dbb74338ae222874dd0c438b43cb92c39d3f948555aa49c175e3e4b7eb01afd78dcb65f37addb85c372fd7cbe5ea1ec8ad4b515388c07c15fc87cbe5a22de173a76b4a962ca4dcd2a5b451f19692fee5b4384ee6744ffb3ee7cf9f73ceededf64474cccd6effcaf9f1c6c6c9930e6af7c2f967ddefbafbff5ce3ce17a3c572955b666685511f0b98ed7216a424ae0efe81926ae707cd30458dddee360fdd9235ad1928fc68a64dd971afde5389777b8d316a488ddd696b268b81ccf184b1c6e828048a5a63976fec5ecaa4488920e60e4afd93483777a948e4bfc716b87b00da3f5e227fb90ef8e55ebc724bef8f60c77ad9b7d496ff0a68bbc2db97cbc91c9c59dbd7ffbf724a7ba5a825d722307b16924c3b67e5192d091beefb0c8c6ec95b732938a289b94311b76d49e8d6a604fc101ea75f9daddb86ae6735c605955ea6f900036f8b0f5754eb43d1d7d5b0eab84cf381081f4e30f473d239e99cdf75e3ffffffffffffff73bf3dfdf9fff6ffffff9f6ccb8d65d7d5fa61f83d291da95571ab49faffffde2fffffffeecda94f7f776e89d02ab7257840aedb72c655bc72f25bdc48922a72767b7b7b077d45fc3fffe7bf778fa4bb8ffd636cd21d84dbb604e1ba37f341bbe56ce8bceb333fb69005065a2e9b84b43b3bd33969df6626c1c7d6d9dd8b38d9fcf2665e79bb0db5856e15af26109ba563d975732c6b0dc9db6f5524499264d1950fc5d62ff338f18a4f0c848d7cd3b22debbf7dcabdddfeffdfb20909174169f77835c4011e689059c18312243ced03650813134ca4cc16e2086f88bbb1713548930a2fd3a4747161e826123d6c3fdb1ff5f0d03a556088e18b2b4f107105099b030abab8a1cb1024f8a128b8e149b71029e822cb0b4894d060840e603a49d06231dc400591175cf41f255d208a2b7490c100081ab838ea94f0136e3b4f4a0e26199f16dff328754c38a9e20df1c0a083b24387a0d01467e3a49361171679e57c527472d819c2090c9224a10509aea2a88b309af88105b599942d94b9488922b4a19499942bb7b4b93159baf33ecff3f8994f4497d972437cffff3ee7ff4f17303ff333fbf78c1be3f59856b9658f5763d73dbba7cf6e6f6f6f6f6f6f6fa0af0521dc8210773be79ca6c963cd0a4b3bab18c8bced1e77a2c8fdf6dad8cc0ac6c031875a8277098f82b6e58a0eee767f70cedaf634f3d689c8556e378eeb3a8eeb3acf8b89f93e176892395919d7f5caa3666666c60c53901d29a83c96291ab6dbf2086760a96c69d4d85b0293da586a8d1aa620ddee5a61a9366cccb761c3868df074792c2170e7e876883309e96e58a3481f8d93eeb52debcd6571e93a8b39ae675473737849a1933142b61b761ecf6ede4fcd54a6e4c00dc19acf249a4016656c9f4e27a6326193f0c9802b27b5b1d476d49067db97c75202b3764b1b2c7585a52ac9988478b7ed773a9982b03df148e3643505f966be999998196fa69b999999e166363a333333677ec67ba66ce1f6d827a22c954f42b73c11dddc135195caf644344f44fe638e27a213d1757b226220ac23366386cf03991ca884ac9a0a72c8d0900000000093160000201008864342a12c88b244d3e4031400116286426658409748235192e3288aa2186310210010400042c618a21011d900ec5300198b96f09d74574e6e9ecec016f4783ec7bbf2d4c1e4e84c83359974021c9c09f7f05e9b56ab9e648927743fe0ba43baac0471554b593de15e8d3510148eae9fdab204211886bb9704be23e01e3a2a7cbd997935c7b1dba1ee10b5028a5b46f29b878e6d30798e34fd8747d8a38e2482222a3e0fb55d4d502060bf5cfb89afecfe0c652fee5a4e9a31d4e0ea380e2548b9b7e1ac5848210450be3992600217fa9afb30f90dbbba484dde519cfe618936e787e0a61cc8d2847d2524872c09ea1c1f345f9119f695d9ba3baff3bc11096d97ba06f18e20a8bdae48893d8867c7ed325a0be99fc0740a41bfacbd94d51a36b2c4c5b776e2b5e341490479368cf32ae619cc88a31c871baaffa802e2ea75e21f032178c1dd494383bc4558970cd0ea2fcdb2d235eb6e72cce84ed14c4c9e355314afcf59aecf72508e9ab62f088afc663a84f80c956fe8bc24eecc8b0ed1c5350fcf3846a2d07c47b2772cbbe55016ca4026671000561d3370d336bec8cefec8fe211ad433aa8cc68fb04bc7e7e9d6d84864d79305ddae3636ac4756677d3e33aeb7491e8ef2efeafcc2f362b231ca69626626c62f1057afb11a2a59260c30f81e837a6cffd3b62e8faa2b2159c0d83a1666b92a7faeebdf03e367d7a02df52b73af7159bebaca0a038f4b40dc344a5b9e5df353399f27992d42683434ec8fc12e1ec4fd646184e6dcf7aa9c77296189664f9d0b39ef9b551aa407a7b7ccd01220dd697047691aeba29d1117df7ef2b76858433e9c5b871d6106602c192b180f75dfc5085303df5eee0cd7e1da87516cba3c53af5f81718394abea12d839345fe3961357594454783caf0d1e33d905b3d53304373ed96b0e73a3cffa060d57fc70657a049d2f0ad47ad1a228ec4a61342eed88b2c7a85490eec3d1dd21e519f0311829c5f1243df058349d4517611b421bf3acb0a303ee1643682d945ba867ed870c647094c0304965a9ecfbce73426537d2088d4589519de8d3909befe4d695b7ee736174ea093358c46e1752913c1e1f845adb00c451257167c755679c8e4280081f4dc9ff2a1eb96a81699ef1084c855077187904a29bae334af19c9a72ffe997b253ac91c217490b44993ed98753a10c09dee5477ed3cfd54863991bd9342a5514ba1f16deb16840bae3b757780f7035db43fc19955a3c7851a482941a4aff6b7d107a088c7cc58860fb4f71728c2766794cc6650fe58a6b1c3d499fb8e21973298b9124e371d273a29b1ca6e62583f04fd4cdcb0962b5fd9b2826f7cec4da79002a6aa39f416c0c7b1923cb8659338f4d60f7341836ff873d7ba423474a437f1d3296f495e196bd090010d833a5876bf41bc031bb5fb3aa9c33aa5f96b6fd9bc22bf0117771ffc759ff767fbb44517cb83650cb64d949711c9a481197aec0a01e6e734b5575163476dd547b305b0a85eec8d9b543f97ec863ebfa356cb7f16a0aa66dff5d2fd54e3ca21dd376dafe01638fc425308c9ebacb6c05184338d0f48cb182c768e19a8e610acec7f0ae64751be7ca1c5e699d45b6747798e20d11ddbc22494566db48b537976b30a3cb15886bf73de6ab67d72ef98a9b8e9768a7c38c6089d7e48e84945394bef16621a1e1ec66bfc10830f739a1af00eada2907c4df094558153858080529d47a4948c112ede90b261b3b7e0ac6f73b6ef7378963e23b6fca65e18cc6d19ae099a994aa45b7b04aed400b233b55cf34db416848a71dd09d9c06ceae4197b5c90e0c615bd0a91bdc234a1ca488aa793c247e94be90bb9dc5d85a8674c741199728d2eb4a25e08d44dcb15fa969d494ea3477a15a3b011cb410a1a60ee55bd86e3e710a8b93637e612fe17ccb445597b061300e4455e3c2fba2b6bc8d8d49d4604ee012d06109fc4621bb628fda1dfaba5054f4b2e1140ce77ab8f3c32a44a95025da9a91c2b279f24de90304d4aba41a7c2316afe165833658a13f43d79c24f17d4d910cf80c0ac2cc104283fdca0a7384c84db98d2623a6a04edd6b8b7d95109530b54dd516cc27d3c1112f24e54b6076c6949c62056549364a702a1302a00c00d264b8d75b28400eb568e773483a36062296d858e91116e701ac6078d51fef0a26e0f5f580a7dedeb4a1fc815a580b7ed000060c1600ef32c710472024b00991212cb419115f302282f9bb60b1ed20390c9e4f2c85bb8a29d6b45260c0a4a76cf47d85ced1f3c0e15c203c27abdfc5676c6596ce168380232b45c50d8e3995240d749502f19690a51c2a2d070c6830ac4047c7bd32e42688ca9c0cca57b1578046b313a5478a2da4a20189312cc666603c11591ba35481efdad8484153bedf96fb904ca40b56e43c387585fc34899632b18a6c206bc728742dc357b1bf5638662ce82a3a87fdd15897c81e02900c84a33e871728258ea9275fd32a460421b4ea84943d4c421195f2ccf5a6ead1dbac06061230e48bb1d65e037a364e935ef042096bdc91857d4fe01f8b04b0ee7fbd0384b269caa6bf018dc119ac5711920fa4da456a0881c10d0dd8fdccbc720324b89b88401383b332e8816492b0f6e11ccea6717e9c2f2e3af27e0efe393c20020a06977dce27975aaa256a60797719bc224f2a6933c17f178c8b58c3290d324dcc950014430aace6c0fd5454ae8e80a0f445304ae056ba3ec871451c683a91194ed5f1c2d564866d76bc02014b43ff591522bf4e8adba353b004e018e2ccba0088b0d1f32d11a7634e0250063857a7f2ca5e08066d0daacd8b6796a127435f1d768fb3831eab0ad45df024ce520072d64506a384e0d3ce8bd7886fb7f8d251c1abc81597c44cc497770d6355ec791fbb1ec1ac046d9b394108434eb6748cdcb142b139dc3ec0adb9d3f13dfed9e184398209bca48c109338624d591e72c8a5853644273994cb32843097c51ed4a0a6c6cd9e29d2c8f38b53d990ff877f1a22df030fb27142dc2918a447cd427bb10229d49cf033d52e88fd82d5b9b87e5fd6502afc3ad65507a20a57dd182d7a5cdd1f6bf457b4fded69f131ab3110a8aca26c58306e6330995da2691b9226549acb6a59638e2a2ce6b408ff883933493f7c4a50e8cc89d99f20de86d361840487cd263796125af957866b2142a564cfd09eeaf56c92ac7ba7fa91ef67cd8777ca0c83828ee8b2d507a34d523a739115787a4e0fcfefed50504713f50f4ee2a672c852f8df5d35301dfdd18c70d18c751dec297646d63f1d491285fe29b211665445eca46650bba7c10e04aacd7b4115b4856fd72e34fcf97fddbdd1d86514dccbf1cc17b3d6bd545eebe9dae8de4a38d91b762f849b01120ca7b2b21e0f26e20106a6a6ff6896ed61f90370d0040d78ff6a63d6680d5ae25084c3c170cb98f6645f384879662d82edf14ad731d5133809a32b575809a2de045e1748a90844d56e11389e6695d71fedc7aaa4f4d08fc009877f186fb9fce0df438025dcb77ee823742cb30fc6aae18928d22ee4ddbb9031a0e7c66ae101d8b27e95aa1e6f1ea055e2864a72a6558207206ca0f158823e6a856cfdd35b402cac2d470e2f6154c9e90579d1fa4ed202863764afd136061962716fc310aa7cf20f4b587a1a6c11087e57ad988a8f4cccda5e0e4621e0d3a6b0b954b80d4788f0fca8b1652da63a288c7220231658671196528824f090f4f01d61c740e991284d4690c06c46d7514d02b4465e96226dcf3375e1cc3eaf5efcfa6d3aeec5c07553cf962eaff38eebdb6417f7db29bad15525e4b42b3b2d7a6bf7068d5813124b47b671008482d1e3dfe7666ef8ba2b25c6230779b81b61c44255f21e6047eb31e14fa18c54a15c71e03c3d8b45a25444af7dbbcaa839b0502e4876b858611f02f1424878cebb7d5c7ec9d20f1fc2b3273595b85c1604620f6138d6f1caeefdb112ec258987baf6c848c656d6526bd388b7219cedbd2a5bd7b14ce276769c9ea5b1907173f1bde7f323c6a9e21243db8a8ae78d1bb289b973df18cf1e321a803b755e1df7e4f02d827ab83b05cd94e3f0837068dea7049f10413b0b92465a8ab15239b85ece78b0c088b5107746b4add2a698ace58f248e84175064eae8a1d83263df8f651e5431de8d8823b44578cf79fd1924e877b5999890dea69976c993db8aca389eb0c1563c19ec5350b77917c8a2ed8221675ea814dda25e830f2000e00d484df3049b0c389edda97cad6bd07ba16325483ae01db5c135f6c8c56cbec591c8f2de5749e784022d543f7914578162dd8b15feba27ad48780c87e5a249af9b4d55bdf0eb7c27afc19ae866cc8f1bc7a235418eea45f82967c63ea1f8ad4506187ed708e384db3dbce082ecb61748913c6095782bb163aa038203dfa81891b48693179fb3b15a0fbca1b1860dddd1a591cd26317ceb5e76b1ef85aec6fd643a09f9760427596f41afd464b6b065c8765da28843d080f506b28a2c941e9e66352acf8c1374f13114c09cad689be37f7d01046733facf6219ebc5600538f542bfdb86739fd6b29ce020ac394172ab28b3893f6b341b7ebe7f11dd283de404854230e42f668343a401df1c556781be6024a721da239c8f9a769a72e95c06b02fa8bc48c40bd31603b8dfafe7c17b82069e67d89bd029b5943632e4b2e3f9b21e2a6e479c2882db1f96b99b474def7c483e98efbb57540f3378852882c14c31c355ec6631549129ebbc503214d3e4fbcfa6eb89f9c6f5331b7a470e2f8d88d4daba9d24154780b258a10d8405fb7995add397690707424aff6d65c48ca2505f7d05c0a28f6f585e1d267803b4800d82ebe18ffd0987d883d6abaea7f74a5765db812bb2469ca38db3bb26fea8371323dd2d674195b404eb9eadd02f2ab728788afc388a08003d64db1fcb3e4ea8f1cd3700d376065875012ca22ea858f81592efb2b369290b71fd40307dac137c9b5f6316512725844917ff4bbca4b4e45759e00bbf0499e64a5b48f6e2e24287e558a0c8d437951ce74a3042f90b500ece076439c89708df0c3c942c107c977258a5052ad6fd14c279a68d530550c1f6d6b199af614b19ede50c3bd0375b42a1f42e752ca70848b6b91390bdfe0334c239a753a3432dcce020107c0ce1e67bdabe982b65bc1a26474494025aa0222188243ea06da4d77e8efbca6d2e8292e2c9a55503b5f06abd7eda5b5b111562a87127132d3b631462e07425854bf5142daff9acd12f18d4e1bb70d4caf54928265110a97990a7195d3ee86946ae9dba94226ebe67e40316cb19268f03f26c1c297318998444a24a10beebba808616c367bcfa428f8201184cf4fc644a350163b3ae0a0f2a98df1aa03c58a517a15016538a684c3070f9e2217752e9a32ea00efac1313fdcefd5927a586711d1d47b980878d76af2b1fceb46fcd60b6d9c858ab7edc8c066ca1712dae3f16b98eff0310d40e9bca0771085927796aa27385abfcd550c12ee7c84ff13d0512e21a783c3b65521e662863e3f41e8a6806a4fb812e7a60858386d76bd86a3a395ade6b4083cbd4d352bf4deb37020742fa63931143453b38f39b25bbad68be4fc53189a852ea2a8c3e3595e36d77a4259212d4324a0c0ad2286d0cf3466e4d9865e833df0badc7232eff5259372112d3404151041c0512e7a88575204eb22f7e1a001d98083d5db642682c526493472323d104a8710676616443f6aea48470190106287014f88f33c73c802f61e2434127fee16261e3c420cb84d6aad5b2e6bbe3c87d79ab1a397e2b7d01e8632b3d4134bbd6602dd9f19bfe53b476fac93c0dde6251f51c6084daefed084e79cec6fc940158c620ba25af73292994a3bec9fa3c3244eb0a4edff702f1615e68777c910822020d6bb32eaa53848166083389d90cd06ce57a157df612c59e0785d66f3697877e97bb4a249ccb223c8f83227085721314829b4082f9cd339fe90d7a1edebe2c2f8112e255dcff182bed31e1ca73c32816c1c5e6283150628accaf89c691fcc2e1716ce15d1d62053d3bb060036633ac3bb006395a632b9ed1878d8b028f450d1c38f1c471aa317b8ac815a69ac1e1cf22f112da969e36c710648ebb4a166db4a967e42554af1e8a86ad74ed97551ec7a81124607b80a23ad17149076da1d4264e9d02ea94689260247f2301fcf816bec96c3031b7d2d29e0a58259e4105f95b78a22d44c97d3e246d7ec04d329a2c28815df9b44ae7f418b42438a6391badb98681cc8af371916556768757cc4d15bf3e31a2a643ed2f7316501adebe404efd2b9cb8bc72df0ed209c70fa05743283b832e29ab432f17446ea02b4dfa03e9819cfb808a0374878dabe8b5ef6a6370043883c76e5187b0270986ba5e7d187867a43012c6a3b1e1b421b392346c6f284c27ac6fa0418eb37002a7352c7f9c1f531ca3725ef35e52190af056c24353a7db714211bc2ffeaf1d0800f16f6775e500ec498329501427c37cc9328824682c0e6b6ef9ad184f846606ec6896e03cc594818497c639cc616820e139d75371aa36b158a8b7dac6b915b40d093967b9dd5a866ba98539807ae1376ab08a505fb2b2952b90f9ee6a8461c64c47e9601a179ee71310e8a5a6b927df6d370f732f6925c69b6b69311b1da78df541cd875248d08664a80241fd0a698f9b1388b8b5b90a4b32bf29a3027db83f6292e8a0c0cb01318d1dabb0eaebf87c7195a78f9adb4622eb7a19d4f0abeb7c0bb6c21bcbd333a770ea82e4073c2f3eb700b1f028d5abca9cfb20ef6b176523d2fb4fdb03fe0a9a49db9e9742df2b904fbe284daae704b084da0f8038b35e565ef8208925c53fb122d501a86d39f0d0e0481234f4a53655d567397b069b25aa00753b8d485ffd07564d445aef54b2b894be93f53deb40a284c494a38bc6f4f01f16d8738fcc7190e6e4dc4e46b1565cfe5d773dc06620799299ec7699c11ee000102725b157e0e6e0e727f245633b37f1577b5565ddb24472f6d984536238299df5756adc20095cd1a004acf782d1d598e16b55675285d557c6a58c5dab197d96bf58c5555b250e6585504ac1e50a5a2b184448c046e2188e2a012a852d060b0710895bb25580bcae9e4f3bde04ea6943d83c92b950ebd3f7541f96be4a3c334f2ea570c1e60f9ee48babefd89c98904ec45244c2adee4b460f01807c862b281775e34a6c3e7e51a3ad089c909fea1245832b31b8c62f05d22c605a564de5300153c5914e5550be2345afb86979818f711f04dde9bc652e9990a5add7818a348ddc60128cbea72031103239b9dcdea651c2da5f9c14d837e2b85c404017ed55a833baa697e7d012e3f30903dbd9752ac15f4819c37fbae210361254a3c223cac2d0f9f652efe388535049a8f0bb67e0ff75d80ed25437b2a1f685d1277d7128b727b8664a105d69264084e03a8d050882dcaad38f4ac7a71bb8a7a88b731ce35dff99bde71a1f593de41a0c57f5ef40eccbf057d618c57f2c100bc63b38c7b043cf0787d728be6d656d044aad6da9d2efbe73ce00e33ef4070063ef459ee8e732b0938c1e4eeb0c13c394ea75d217ec5f380b41ec37baab1897e3feea9b85893ccc5d2673e358c27a8aa5efc753257afa3bb0002fe9fb221ebb8bab3a9a7c166b8aaf6e4b3175fd37bc4f5fb2de610cc01e75b8d67a1bed29435ae9d863e07b106d0cd5157f61e53d13f8e6f72bbb8504c85e048e55d5d3879f0873f6660a6fc8eb97b2617c196c9a6a85e32d291bfd30ab9091fcf9b2647d3b7d5e448436bf27a0c1acf5ebe8adff7eaa0f7dc1bbdb153475a7906881039a797426f45515d999cb4082b65679ac932b31b372ef183f58e24de1a6f754ce3ba5012a1bdce6a8315483d3b48e8c6414883c2c86582ee9b018660bcec15e0c455ed6c9079a72db6b445d4e61762fd55cb15559fe87904d0f45edf3f9e76ade7b3ce0022af7a33e1068a62c6a651380b67d0b297188d1e377deb77941064a5ca6a439f1d9353bd41c43fda0cb5a1e8700fb0f720f009f1e099f88a5632362999554adab474b17c403de5bd60617f4ba10c2a17dd39022f954b8f84a7786810c1d16d727ef67f252928e472a64aed140722de46243541d22d6eff6209ee7f3c03dd7f323cd6a38f9a3e9ca9f163c9bc1811f550c7ab4d503539d50afbd1a370e0f827b5b37c01cd7bb2c3880bb3dede8aa6b9cda84ffff4b9d44489a0da445c757ba83247b564440d65a0d25f68a5771adb84a462ec1668208a42814868c2965c1958098a1bd3558108f19d5bf964032c9b81dc67dd35436f3d4d4419970af854a024119129b2916a81b131ea3db85604685e22a84267516520071c3b70e2c0a1c0c7b116769752d829510c314b0435c3c72ba0f524b86513e36641fa29b705b4a42eba723d1a2dfb0947474f75de73b8ec65b309836cee1e31d5cd34df6b2b208be6c48aee3092328c741777a72d7df4ba8d155ddcacb0c07f1483761354206f34dce9e20e104cdf57800f251d62c3abb2a5b2d58a0f6252e8cf98afe9bec0a8848f2e198fd0a3baf56aa76bc70ca4a523a041509fa03c3183a9cb8f3b4109e6520b6ef81d0bbf06a4ac994bcc622c34840ea491cd41307e79efa1f3402c46014557f2cc25d55ff9bf33e4a05039599b3d60acf2238e1a2a5525dd712c860cf919e17a9753e3d06569e6138e7ae22fa3e6a0ecf50ee6339ff8791ff81a8bd5e0a9f2068060ef001d3863a8dad4fcd39d103584814e4524c20ce31d5868a640f240d7b5c2a26ee500e3598d1e71f6d243ce27a97f260a8989cf59643a60a280a486a91dd412206b8fefccf31bda4c95a4c42657ee25209910319bede7eaf1e571a0a8be4e2cd0b4c1b0cebce5146535b47004d6e089b675959ba28c7b473ac36dceb4c5ef6de2c629f3237d0849ff3f63895b87689276027aef5ebd29cf43f318dac3d0a1c7bfd2a27a9d5f031fed880b82181eb74aae194b7e535d17b403934d2f4523044127364b2871dd944703dbe60c02e10ad4801e8f4d685507c04e1219a8d472000d1245370f6f11227ffd308f013b0c72fc0ff80081f7b4fd01a20377655de8e3cd44473e400fc96d37ca58bd9e228eb0df02417b4ccaf0c2e1168d34f73adcca5c35f1fe4a5909720eb1669403aedb3d7583f8e76e511f12ffa712027d98727bafddee544da93d12acf717b67a157739be913af8080d75ca1d7757cdff52d9d4389414b71cf896aa71aded81ccf98db876f152da413b5512d54f7968a460ee536a8e9127b810cbf742f5381195caf115a597b846357403814a0dd39700bae06b34834a135d8aed35f149e5762230b4d13c79d5b553d9d256215d3ff419ed3792bafe5d5dbd84d3036dac38074965af2f9c9e44efa32805cb7da25eb08d0d525c195ed6d773dbf229844587fe0c35c42b9b1f09b0c391ace4d20779ebcfdac7eb2babba954373fcc377db1d8347252f5806340a1a1bc59ee23d4aa4c2f73da379b5f149db8c329a80413babcfeab2a62ecd3d14a15c1a08bd071ff53873e702dd5eae1a00bb0ee3393e10be1b4d6683b389908394674bc50a4f9827e05f88238e5ae62a2d1b774d940002f16c314d97a5135e46208cb9af9e61a3f8eaf10c3ee268f12cf37c508f5d3988243cad8fe2671b6af7612dca13f2e0f226ea44fc284e9b9eb72c803d55acf05a43b9b0b6b1cb4a9715d3ff380faadf4ce3c2d1941c5a77b9c7f5aebb896dc86bfe0bc294d1502915cd7f6a6e86d9afacc466239e70feb75ef1e3e4a7c379a56b93131bd025566f1e811d2f4bb816f90897862805ea75080cdba3f5bba88c83250808d3b1be2c94284c4abdf71b53002ed94e8ac2a4c6093f8ce1cea2688f5cd7ec4234ffadd4233a40dc43a94dae61f51ea08f2d96679cdca302e2dbe0c47f84f11b45c71bb2344bee27a76b5022d15a30909dc1a68815022fa8f0ef1b022c4822aaf6548ab46d5632bc349fbd410167302597a45bad7f6eedd36d1c0011a7fb9476b3b03750fd3937b5f61f484613b684afd36e8ba4b354973e7ef60465779ba39354e0148e3466abed71c2ceb1200b124d31cd9de34393f603fb8d75e4b634f25decea3bf6a1083b579e2c721c700c4d2600852670ce47201a16ff1472e4cccb1aa5d977e4728851c7910b706c0764b9087c5631ce2270b71fc5ab18cd9df905bbee174022ac3505fa8be6f59cd31d565ebde0783f84f96374cba32233116441f64c004216aaa0ac9c5c1a276935b7e960a5d939d2b24953ca907596b460f9f16c58a20ad9db0e1e45fc025c2003b23e5246f71b22810938c9d9c6ba0177db7c27543a016897d220d47964bc569374edeb99f3c7d9948c550a28b082b5b8b55c9a5e69556fff009de40b3e048d866e7ff34dff31d537f1f1694fcba54c743be9bdf63c450ef0271cfdad1b436c484ba6c405d3085308a5cc44eae3f23ef214580ce1d58968c0c8cf0033c49841e851f8a45e4b3feb701fccf6015b419e2aca5c5af957721e2080da92ec6f7bb16763f18023db3570d1f260bf6d2fe89f7ecce9d42b07160afdc048e41b53171d5a93f31cfb0519e5b4fa3dee0d38942f6072edffe397db21ab038fb92aa62b50dac5bd5449d2006047dd98cf483ef555fcaa4503d4161cca30817b0f056860e93ff08d22f8bc2eacb1078ed083f150715b6870cc879d9f0a254a4022d414a37c4c20f0aa5e856ad97b0783e37181dd7d40254b222ace1cc2ae5d69626c013bf03d4eec39bffcfca9200797717a78ff90426a418b7a6f6395cdacab5f72c3b73e717f501191ad40093afa3f323c3a04028c34346b84e5a31f9cb2ee606b15931fe8d5e2e13d8872e51f33beef0aeadc52f73189dc3674d561b1b380db23838f0406d2a32209fdf683c8258afda3216185e3652dae879bae2b0dbc498b63ce5c02a8ec1d7b2d57245195de929a7c8924b450a6b8cf79097df41cfe4d333b9cead97c992be09063da3c95e85851017e542540f6e30a68153c20d424e635e245a3e39755311447a2c5d781871766be80c23bf0082869e35a43aa44e206077faf60195a89750596dbd93932eb4c788828f58deadcc1bad43ecc2137c816c7d8472e13f4b101eac011baac50c109ee3cc774358170990d1a97e10612a18b10773303388a170f20f91621c4e1a8b918a6b030a22b0c5381bb31206690c6f0e5e8d6d9a4d0cb4768a61d20d6a8943a87403f10b3b37fc0f93431308f7a9b1d310c867d537a18a442c0e5370cc9717090eb421b7c43e7f3b4669c30f04ae7ac98eb74e46b1ffed68060fd459ca413c6a008ccc3103961da5e7aa2e9526ba6865cfada604fc9606e4952a97baca2292cf8991ca2f630dad9921f7148e5e1d5e8ba66c8b160b2fc6840440a11617489ce454d715fd8f89f7f4180bdc90f6108b711443ae19db402dcab5123099ea305723b6e28e684c89de6445983a9d8c9349dd35cfb999d1ce538b9ac43c87484802491fd47eef56b8417ab82960f4b5d9198a1ed8eddf9c106b74f3b5ebe39b999db05ca2ceb98200159fe29e606dac7431f47f01c742e9f747616b63e646efa61d2aafbd8dec7be1344b77d0c674fd8539f6d64a45fc759854cf9db225a8352a9ddd42638f36d8cb4d65ed8e9c7ed67a959549238e52905b336f0a94f8f7ca9d478edf6ec86fd5673ad2066860db2a7849911ffecf663277a0a88cf67745a2cf76e30ec7e2f0880fc36f1a096f023cb4b97ca4ab27cc8253ca397ba682898fb77777da81c56dd831d911f309133c933688c76cb0044580572d406f5e68cd98e70dfca646206793f4ad9c49c06eff46e35906a467773d0eda680fa6cc91ac178c1f19e24d7fe474f717ff5fcda714967624df5ac89e9cf2474038d1144b953045077225e117787eef86a933b38b2645e3408b9af9a1e12de7bb61b287af3ea7f0178f6f9599afe7b1c1360e3855edfaa9fb655924cf72d6efc1fde355b0f2b92026c382f0bb011bfadc9045431c945d4b9096c321b140d1c40529dbafdc6a7377f3cbce6d9beb0b10453508826d5e2d55a28b2554b617de471dc15065d80892486d41ca47b415e2311bed4537e1be9a9fbc002ab8409730fdc5662d353d4bdef47dffef05b6a0d6996d58e4a45e79e175f6a49204495bff84c649d41bc729dbb22754e954639e42fd6b5653ed832c69191709c3ac9c9245d4821dba8e485ffaf0ce5eb2af1ece121b5604e8e7e74aac31a4cceee9671da77c3e024465fb14c864dddc43aba284dbe2dcf42d111c159a649cb957341ec28da0284c28f8593f6788519ec5461ef2f1a70fe93d3685150a91b4434778082f8e00c36c0a90d0d38ee815a3c03e029ed1c2db8378c827c41558c5f7480014c15e5f813e878b4c5be367cd9fe57c85d9e6666912e151e49e3b84d7f049bec413f53b91ad4badb26fbb31050bee588c0165e0dc2fdf37bda4d0b33f40821285fe92c420a3b2eac89e3afb14fbc7a1e7f4946d00957c3c19a5f8296dc8e0ffd62d7c735d9aa1a555b9329a5e57ee37ee55298896387cc83ebd1c13cee95301f066f3a0f9f9ed5564aa756df3f2ff8e92e4c17f2c20d6c332f0e2fcea65c3699d0d26b5308ab16926225e09a85ef187a6d0d05a810290361760e0952c8c328141f0a5814140d923ee5c83d6d695f1a330d5c6b4613205327c58112661805b98116cefa108da68adbdeef37b1d7073fa5bc7e9808f9a369383d8ab9c0a3e561390d7ec6c4c48903d375cf18763d6c4594a43b86e3c34e950c6464d06b6e1346a1b01a03efa3c144c42c831756b374dbacbcd61d4b95491a6e28a228690bcf59523b74cbe5e09e975e9d396b67ca15b8c4f8d58c7b63acb7394512b13431d18f031569595707ee60eb1a0ac151909d0a42d0169cd3bd6cb3e585ce67e22b98d3d2a759218178171b3238483bfcedc96cb22d5ada51a1d19aef4881d6d906a9dda1e1ded89f8a1652e8323ff404f851a62a35fd4d400bc6e4b8955bd135256098e498465d22443a8e61a3b94a0843ee96539f8d04275d3a53059cae6cb18d8cbc9ca256349839c02eea7dafc2ac22860c03bc24ae44b424e5925e621e72b9eb0a3a27f0e7ae360b0703dd54cc2af18faa8bb87a1a4871224a551148a1a0543182bb0f52aa5d9271f41ac2ab325e1dd166d722e1a87b80591987cf5090b20e4a4a49961317e76ac758493f99e643f82057cdd2745b22094e4b7791b44d8d62ad3417f6a2bbb6d3d4d3bc3df11420b592ccfa826b4dcba8db40cc55f1ae11f25c7414007466e62508d3d69c7d2589347006475b7814b9c56fd0b8c93138b16eba8081417cfd28ba49edf1e64b7ecf8eec5a5741c6e57e43d5e45b208181ce434055d3e393f14a9b8de593d7c5571f909805b641015ccfa82d01de210ad63fd841f626c705601a7fc53438398f8d9f489299402d462ac3e21702dc3c957ea5697088fb177afe95662a203479231e871f81480d6b8739a2c47cc79d5a9b9eb1f5ab8adacbad5fd8dab3f6b025bc2e997f42923b2b5d7ef6d3d709abac37f3233350cbde6f7189163c8f4dfc1f2f54e3dbd7c4cc4de4835cbe9e790f60f817bc3ac57db471130e5876203ea4787593cf6f676bdfc5222814e43aaf7033bc63ebd10b3f23584e15329cc5cae8dbb1a04069db7f43273fefbbcc328b3485e70240888d2de7928a75ac810909b9aaf2bbdb19125610cca0683c3f40b308c91d0acaf9230bcf109704d35bc0e9ce2a23733c5dd1717b6b94a2007c606387a4774863f32ea5531b2823967909c4b2fa1e38ebdef59fcafa4b11507345494e705103e81f3f8f0814a897d9edec4935dc2291f4ed2478875aa7447affc11567979fc173aaf234a0745a175a1e427a5a5705ba290428377739c4080d423c362f5b4d69d320e448cb52bd3608fdd5480d74cd9daa9c642f2b2ca7338c3390c818fb268f5f82d80e273467a5bc38986cba992423581806f6b826769d2a1aa2dc1285ed55efe8ad360418cf193a35b426278a880ed02ef21759cd605b6a85594c1a2b80895b8def0f60021a2f446d72d6bf0e0e86c17e81befd0c7c28b718a11f5a303b413e61dff2d7714b7664d71c81c44c872615f0813bda39bcfa6db21818be2302391f262c3e4b3116188f7bf8b93d4d45c3116ff0bc2eedb32313180ec300d2c6e227230c1e3228ad7a79b7ee27505062d7342c8b314fd18e448218d5e5f8d4d89a127ca0ae597ed7f8c0c8771b24ca7ee3f50cbf84884627c441b996a9e1753497cd0ff2bb81fa951c51a95f569e8fe59d5958894b048cb8ad5e21fa053238bf3578c229f6145ea671d9e96506362819a412bb7e0bc6fad1502a469b4923c8107264a850400f2bfe05d15c025528b1393bb18997a7198934e390721c3a4af7cbb137966e3eaf2dea478c71796de8540ca60e6e7fbe8a43171bea7200d118d875393247095dc9d1460f1e0b9f664f2bb220740cad6b0caac55c1ecd9e543bbdca07c0825870f4bff9c1b53e8c818f2af48ba6c2db5102b3bb08cab61dfc19ece0ec4e183e2c58058574a24f0385a731e1d3a696b8f6e5007d0f99f8b03fd7181bb20412bc78e692849bd062811d88993c86d0be0347c8a0cf8009245a4c53d07e3335b38d415cf778356929a5bd1fc422933958a249ad7219cb2a9a94c535059b3ddf359653db31dc4d4a79e6a19452cb0f0b7a0ebcf13853d05bba5b9f8218ba91be43f52f236d06b76f111788f46c2e40c55e0374c22564eb80e21a14629f87390790b4b8c790542ca4c0f2526883cadf2789c3a01f2571b18697318dab7a072dd2e4c3f10cace326efbd70ed06f29c9faa1c9569e24e703d785697809d224dfa512a4ff1e56cbee5c8dda381bdcb03de82347265b5847cbf264dd2ff707aed2d8b18c2ec9c0c0b86f82d66a9f70615e82e4b7473ec61a50f9819639c67e73016658a3dc6e81ca54b37a24643dfa31acccaa18ea578a3e66e83f1692dc34a82c9fb0bb3465a65bf7e9e808f5649a189069eabc3fd07d3f38fd08d7c553e337df538557fc0a3fd42960e8931b0faf86e6b7433f517d2432c117fee206748542e230022de207281f8308a07fa896779844b2f05bf063153c4e3850de83d4960b1fc97f21a64207f10193aa861cfdfb9a81ae62c8ffecb2021c178e112b469c630f4383934ad701f705f26b1762450a176b91d6a6bb55777ffab028c4672c0df0cb9f0f41c6dbd12b6ab36d2f6aa730a2831d3bc344bd5dcbaf9d79e7a61e6edd05b6cb4a11ebf6bfd5f138ba6319b83b30aa4a18e791199c25cc342694e53208d6c7b2ccd0148a2794f418b6494de10b3cdd52a6770adb9dcbc7c231df0b87980ebd9ca2a0827e79b43ea91b2ca011335d6fcec3f01425484ac002627dc6993daa17fedeb308b0f126a8492ee5edb87372667aea8942f02b1bd53eff070b0b24dcb9f0e23a3dbf8b79c715dd3352e8b6f63781d1ce57853553c3902422e3a124d2ca09fd20d7286fb3052e7309c011524c4e26413a29456b40c96f2fc2e74817f54a51cf53eaa3b9541e8723216d645c916388482cd25b2f148aaa3b82401ed56eb8359c944916ef3bec3b31efd65ddf956ebcf6b67017e74ead17104f139dcb0e9f780eafc5249032274c7c982724439212d47d6d84b3f7e66735b905cdd9631025a4f205690dd8b97296a5f360122cdd844aee5f05177a46db9aadeec8454b0ff004bcb808970467ecdf27b875f77cd4ae1eaa2f97e4fd04ca9d1837a40c5d4ba8214e8713417f1c7d71ddedc951268969ec741c25560bab6f3d768fe7970bba734d5adbc433ca804cca883f01a63e735407ab8b656c33d7e43ec3c3c0073450420c10a367ae97a8fd67aab83563af4966d8375109868dede4d75cdd80ec184ba9d5fcd281a2129343fd37404751ae2b6fe2e99a372179e70bb874f951c87d4bb35041f13af59900566381004310ac5d12f3ee282fa257b2e125d2b10e316cb197b022976dcc568d13fd5fed36710d550b2cd81cb80fc8dce8d808e06fde510be2070653dc6dc049292f41b754f59d94b58eb9b56010c8d7fb4423a16af1595dc5eca0cc25e3c13b2708c84c909985c82de00b58fb196743256d50f46a3b9a4ab6638ddf684932b2b8f1cdba18a66010e221b08add5d2715fa8f766c77dac83e115dea3c9cab75e3fe3b95d7a86a9cf8df9fec45242bb00a797dc58175a51b3afe1fe4131637c3b5663b74e50fe83618c169640b4c7846c8a8ccd6189423fd9e4acea50e7a62dc825fc88b5f67d9cec6d7cd50e12bac9e48fd2a5d596d3df0c2ca7683ac07c72e435164d9a18ce80e7b166adbb16f67424178135647d539f973e1de324caf45a6a10f33e29d5da44d6657e252c4daa47f6484d8e4cf1c059c4bb78224c9b4cb6d3739014af73f3878e2edcf1af503b96c14247532bd35547b02cc8b2463dd23c0a074038a13356ebea74cbb2036c84e78c2d9bb57c651f3d6e6a2f650895d96d00d467e6573c8fded200a74b4806c751ee736b69fefac2820d64b0422ccc0f7a5e8f50989cddd23d9b6f0eac79f2365534f2f3658a9548d78d421d3b400a0f7a10c08130ad0d956b23087c310229d65e7bccd719819a81f1aadd8f36b5b4fbd91ab7754fe9516368f5dde5d458a7874354139573a17ed01afc4595388edebb2a52967948f279f7f75d4aa20ad824da18c434e02543df8737a12113b15037406d002500ee305cdc493c7008671688bd72aed4673aa7eb022f00b91685224535c609b0ae60bce723e2122f50cb7bfd82238c22987dd4738db0510e50cc0256cfb7ac7ac72be5ee05acce263887f7b40f3b6e8bc68475335f89c76a4bd2b8f6616a6b872b835d08a4cc8e094103cd872ee0be6f844e08bf44c39e9fa682f3f3849927d787eaf108fe7e27b989f7dd1ad6c1d5a7e1d26b2900e5be29fe3ecb11056c0a1761af26018ad04ad5423a0fccc7afdcd0914dc0e6dabda3cde80ff818f85a35e99ca4aa1f39507830bde9bca00820aa94886fc3f43aac8fe8ac2c3050c519e565c97e0b6703c75d761751a2a96d2bd001ef7a118324395ab81d27a7af97c82d601ec5ca2d3299d60874bdc0aa9d6895b3548fdef4e7eab7183306bf97ee6f1d2d0ec71c119d77d1a2e158f640537097d0af95637e28995e7d77a13c0b2a3894350157c0e2be255315dfa7dc59e10b174001da3e5d56ff8412c913d09388a271e52b6d5ba12ab019cb657ecc4a240e6862591ea1d3371cf6a3e0b1829fafb7966bbc14ea068ce3b1a7a23b9ce73b2d82cae6e549c9588e749c17bb43d4889e4c7f2533fae26ef5b2db108815410834cf669b259239334af54fc99d12b159d08f85875be3acab52b1fe1a53d244c1480049c3eccc48e66c8b533102c07cf0af1c8eb1189e9baef7c977b7d6d46fedf21220e1b53f25af807e97846897dad773b7bfb856a00b26cfeb0a10f4902a66a31d3d89199081650cb84002d035a657bcb52498ef4ea835a39bcc2d2562118e9d586f5dbaf7990810c2a2e40951c655d3e86d683e22cd0f16d6b08586a6cbf28f89a0995b5f7c9b6d30495476278652be6e9038c75e583280526268549f7cc2367b185d5b62731dda239529d9420e4f6ad5487f895c1e7ddd426bbc3575f41e7d817ec34939f56c5033ebecc17e46d6ec35e4f5cf8e954af3d846313ab0e0b14b6b750b8f96c2af67fdc9c11cc44af6fece56860256e522ce2463f02b960f0d6fe5add58b808033a2eb03c2701b0762543611adaf1e444198c19c032fa2d7086cc4b9ba2f73e52077617f8f38596d9479dae0864f2e9364589c0f48b2bc05cd4fda0725d42117e67a67d56a24a8b41189b123b9c760e5f818cc7e8ed8df1a03ed15d79eaa26d73e11c710516d3597fba762625b145a9a75e7632579d5c713190d82a45a5f0b526509b38282d4ca5b7b8a88a9ace04dde925a08445d5db7315c4eb01a0b2c55db53ed54e872a306572f8be00b155cbf19c3d2841dd6ef9c58b3be1d4c6c60ae7e1fe3fdf3faf4c05f0c9e54c213eaad2bd200400fcb5f18c5fbe56340272cad6f399b8ad0b0bcb6ea6a94bdd0eac4596c0c93e8505085ed51ebb54792524a88611295a5f68a837db02ac7daf8d4be24e7ddfbf6f1b7a4081f67a58a55b682a13c1e24fd3a69fa89e888b3ac77317097c3c90e006bfc1b5a2e65ddc7c797327ed5ca8be314ce06d3c717082fdf507800ca4ebbd00ee3f440dc5cfb50e9b6b901d2857ac004876a441f452af55aa6493c5f22dae1c1a2604bc649d7077947a5dd6371a2c621a8c8813d3b7204b67b25f93efaa4816583ddab10079e430cc40cc1e6ae42bb90fe433de9121aa2a84dbe3e51f5c500dbcb4340c14c40821f0afeb61a461de3736973a04397eb423a4a50fe21401e1339f994cbb6fa77a436b160c62d0445634dcf74e9e89dc597bbf82dfbae40e1f709517fc0c3b504ae4c5e121c2d0e6fa71a9391ab6caddcb3cf17d50dbd02aa0faa95d1b3d8b27cc87063d473e37ced93668ab1ae56c20d4587b995b96232608ed75f758933d96eef2c07a8b15d0cec77384d3159fb89eebb771e6a37536e5552a7480429f9204a3e081eaac90d187903437beff240f9389cd05f122b27867d2373d281645204c28fc51e345c135beba83c5838d4cb8a6a0fb8e59c5ae8ad77a5720116ef0ee7f1e968687722dfb52e2d49a33e41410fd626cf83d80b85c4e846c297da294038484276c10db415ba3088780f4c06219d1ffa48748c21848700a838e95c8fd36cd9dfa66abc14ba2257e6e289ed10e2839fc90e99854db251932bedf88a11bd1b594d4e2c0db6ad334fbbf45cf31dd3305bc54a08fce0919026c2826707e39e1c8ea19eb038b3d4c4de6508687c266e4fe8057b90e4ab8e042f84801765cf030609fbf6a241e5605008280d1a41050b2232675a7480dbbf3689a0d7bd4fc6ae7e59f14844bee6d36d6fd33fb8850a68753351b24a65de8b657809a84974e630baa98267f66b88121f16efd736dcc47406988ff2396edc1e14ecbaacc77e529e02f415cc0ad6cd87ae51a5883f23168b70a3b7466276532c1ef8be06114bde2c85746b52986b561ce1531987c22fce1ee5b5c3e96b511d490c7082a416cc6461a9a6704a624d6204968d683789528d7276f60e8e2952be58ee56e1ca2a5d005381ccbabec24110261b5d4ecd578810a30b62e22b16fe7e234a497526a43a28d3b17ffd0b3d72153342803bf2ef4ab6d37d0bc64ed1805d1569ee97fb1a5d00c743eca24a0a5d805dbd0bf902e2cf4eae3ce8555dbe517a1dd3bb17aa1d309e15f3992bed59642565c41d9d2ca12f96b4c333a830554134e6bd4c97eebb9b594af012046e512958c9802035ef74556799a8c8124aaf3f9fd45e0da8d163532d569e97a43bf682a11dc36d1be74b55b1211770fa2585aeef1e60f9c5976a7fa8ab54f36f9bc3256c736cbe30d0db21e5cfbefbd6c832e0f1766b2acef726eba2534cfc45a4e24da3b8b3a83472e31fe7d7ceef6ae1ff3fddad4f426514a8bd6f061fb51ceac0f6329cf8c1056a13fb4deb518e599cc62df143ffa6c4eedfdcbaffa239dbe3205a2e085a3593c23392f4384a4bd801b4e4eeee1f3ed9979a3590265fcd6b46850bdfae1f4a7748b429d1b523457214cc216f9383c61e34b912a7e2e964e7450af31de823f8231e05672433960d47353a2b1638484f31741ae0c25f10f2a76f26ccae953c1fa1b6ca82f2c68fb66257cea2206a96a5f5a0ed2cc0aae40c52feb1f50d4d38829fca741fd762f95d0e9c75a958cf3f8d98e86edc1049a8563f06d687ec876509703bcde47f33091ed823f06b1a2dc6beaa7cbe372ad51eef8891da6fdb88e2cdf5f3b0e1d0635b4d6ba641cc6ad933082924625046e9249079c6f3870802ccf28b60423edd49d611cf68d109a4482d319c819374ed4dd4e11f15544a97e88efffaaa557384be538845166070b2b0bc3d56a9f1c4058e49e6f63cfaaf3fa8f4a0300282fe5710f911aad42079a96c4dffd03d90e392f4fcaa8f1f2804897108813178819e271af35315542cd5db838cca0e28ae19ecfac44c104a009528abe4451de0726dbcdff2740ae00bf7aa51140747e02a1674583ad29cbc35bce5caf4575a0923e6762b0593ce7d09cd0dec9910aea5dd08d7651518479e7a1c4a524b41c57952c021403b444c54801e4ac03944ab1491e8499de24eba543580d578dcb1e51fc9944179cd42ef38c068b1874b3007905029f73bf0753678fc5bf8c832c93cf46c7efdbca89077e500c05b06a2e7d7ee9d685bb12d407b24f8ce9e8b561ff7934b5a057e90ae3e959521171a36adba08b851d15db2adbb2a0b9a812d849e2b2a687f1d9ecc0adfea7d2950d32d55be2063a1491520ecce9f660e4b566d665708886b1dbf359c865b53070512c26c2eca8f9e52af03e93b4cb81ec54bee0c450c233a8adbb47f23b2468b45811bcbe38a451d64ecb78103ade5a9a6c3fc65cdba3378cae2c4ed7e4fc9e990611a4d2180952f8697737df31f44361e7468532c3f7435d642206f95bc709aa37a9e2a9a98115ca2ca2ca2590f330e43a2412de2ccd4643d292eb461f4067581e867199e1d41ea2893c1c26a860f932c765961f65758488d4458bff768b6430840b7bd607449f1da37ac89eccddd448eca362ab6d43278686953c4600c4ec9641d1a7fabd81a69f3ad42e670b364fcb788773e3dfa027132cf96e87100657022fa20a24c682c5c6857286a882a412b8fd4ea9db5837fab7ac8ed60b0d33ce4f1d26cdd1d35ebfe053a90c80c39105c217ed378d9a24c63b34bf34da75ea2716f030903e9da7d40e24b1d46790d1f23427ba9623309683e3863ac0337f636903090b1ad04854d05a82f2930f6198d4734ad0edce8034abe768957305e15a703f93861b813505408c02f2070d549080baffa045270b8d0b1a1945e12158763a0036871291f87baf911e02981f0f8f807ae082a6e9d6271c96020eb1d9c0e1a14e5cacaf2a903d2be60a3a546e4de52a6945279086608940852cec9b12ff471099c6d32be88e4439421c99a4b24e524ed41fea9107ef2831da4c20fd22e91673126b85037fa4d9e419410dc8f7e011c7d2da086aec752a42b5f984c6b782b2fb0348e8805b209edc6567f8e116e30be16f9475a07d3d2fe6bd1bea53d58a33df83010420837086184106a9b06b50821841042f81246d882846d167d618d560c4cabb58a9152ca1898560b26067a2ba6e5ab51e3b78060805aad961667da134eecccce50bf9619130ed29a995972fcab8f7963188669b131e79c9a0dad8b8189b1a1c1d860da8a303c924421496afc0fa646189839a30653234cecc2c6b5cbb6b52623dc5018f04a52b567ae52fb4d7bf9dfb6b52440fb22b66f692fd6686f93dbb6c918b518e32637982dc618638c316ab1a5c68f4c66ccdc6d0000d8e89cadaa98527e058b946e5d3000d0ad6bebb6aae4d0018a295356bc8bd791f22f7ec5bb7816dd91167d5314104fe0a93fbaca6f5a450f9f9bc0e7197c5e025fa50bb2f2a73775415a3c8b87d10531bd4ab7f22dba23a167d1a974a60ef62e18df443ac7877f923410f7a3591167053952fa0fbccbb4a4a158178e9d3cfc8e116917d2b3e85a98fe6b1d9f1e1e990fa4981f3729312331519e678e0514ffa1d5d28f983be9b8d419894152f9d91951a1a62ec807fc4dbf2ed8bb6250945394102c6f7a1d2c6f92f1372b9ee575c8487919bf2e16a657791da657a137476e62bc69c6bf0e162acfe2b754a246647ca7f2eba2f463bc8eee55e88dca771f83de1c9951f9ee6f623cfd75b558d7ffcf781d2d9e06bd49f9163f83de1c9949f9167fb3e2ffd7353b23339ea583bd8be54d2c0f7b978c26d21e4ed7f1ac45c74133e8cfb6cad2c9e8ba880f7a7c2a0f4f7575ddba7eab25190ba6ed43e22827a133f387311e3ebf521eaac458f129a87e2f46876a6ac48ce9555e85da9c4c2bd3af2be53fcf448fc85fd78aff4e55ae6015d3c387f2bb23cda4eb9c26d245baa733b1e81a46d748740afe8bae639e82bfa2db1e804ab79e6a81eab607705aa18d230514ebc1875b3d75eb6ad1adcbe4ea6e6b8aa4ed33530152ea941914a93114d331d0a653f1f7372dbe461bf6a16f1d21c43836ab8a3f82c9c1fc1612a45d60df47209f0580c8394fa77fcf5b5577c6b1d997528d50cc1e8de4775784465140f06f3588ef8dd24f7b0c70df1df75ab795d49ebf8f55c5c791f1b12f5b8d1fe32c7ec918638cdc6455f1471f0ad25efcfa351b51a77d88e674bfa2a669af3de3b4171bd61e8d524e2dbe96d35e7c19354dbec4891a0769215b45ab20b60a5a05dc437f7c274c972151fb18354dd3b4f8316a316af49b8cd3454860182dcbd73d15ae143868785022dae3206e05868df6ba4823d12e2829f4bb878f5a71b12e37627cbc4434ba51aa38748062c6d7018aa9d56fa5c0b12f25977e9697f1fe342b1eca60a1eb32ba3571106eb2d31eec269a47e54ddcb353e1f7cb59418eb0f80fbc8b8787cf3e7d8375619c6e9d7d69f1f0e4610c8787cf3d2c0b027b170f5f0405ebc11303b1f898ba7dc3d86056806ba9bfbdd027ebc96fdd0fadb2d0e169743b3c4b97c3cbe854dfa2db5874465864fcc98c3f7546665054ff8c07e2924151a597f1405cb077b1505489a28448bd8c9f4995de86e5535fa2339e8d8cf71e880b071a3fe36768bccd8ca7418374e0a4c67fe05d474ebee90c0e4f038707e25a120b6ac47b1a341e886b860e3fe36774f819df3f6387a7416d68fc0e6f33e37578202e191daabfc60371b174a8a628217278193f93c3cbf87e19d4e648d319d5d7a036325ef5362c9fc303719d3a23353e957a1e520f7b97f738741ce429f83b74aaae46b73d001d640e5d8b6eab5ed72f14e0340e2c52378ee120eb4a6caa9828c3567ccf78f834cea2f1904627674c9697f19fac343ad4f6de8c0eb5512366663c8da7416d4e3356337e5d32fef366a4fcba58fe3ba53c27a363f913960ec6cbe8e82f69ded85625f7bbb9a986271d5711d4afae91680f3e7c516704c6975e749d9117cf7546503f5aa7dce329f82e3ad8bb5cfc4a17e403ef7241d761ef42d11b9d44df60b73a652dbde8d685ead6e5a25b17b775ab746db47556053f06a6bd560b202a9d82838d1bd3b5663063361a016b8f53dd37c2f972cf7d4907e94b4f7a59e12af4ab1a3a98d2832855f9ccd27a36d0f34ae22502573fc72c510f077a5e4dbc48e0ea37316bf60479bdaa78c1c0d5fdcb2ef0f5ead32ff300e9e71bfaee71aaf2650d75cb3cc0adb2d6d7bffbb5f65bbcbcbbb1f7e3f2b6be365db5d7dddbdb2b839082dab02375a8454b46cbf2a33d1ef9227af8a38654740afe7e4f7b9bc3a807690fb68e30bf86457e358c8a7d2955f8294498a84afad2c35781018a1e921e96a80d89027131a943317de6bef436f3495c694b4f92a49fcbfd73d46602e9506934e2d17f974e1e85da94fe84fecc7cd2643a53fa496d4a242775345d0e4f413f79d2339de17e521b94e7de4928214a254e06437fb28228a42ffd0c894992a33624face3af946e9625042cce77e663e47fa49bdf927d4a6f493fe7ceebf399fa3a42f511bee49747aaabbbbd184b92e918bf4a5871d4af4405cb34389a81133f3b9b799930271cdaf7052d1af8bd4ab0afdaa42cf75a7d91d6c0f06a1150b804eaa48975361e354d1b21ae629f8a297fb327a91568be8972f12b114f56f3fda3a18544ce6a99087f4933b41913e3ba7f2494fa2374766485ffa1b2e44fa125d4f8546a1ae45a17f67a1441425c4fcd2eb985fa23747664ebef437393a4a3f29e3780a7e89beabbfc9abe2604c3fb98206b361ce9a72fec97bfafdd0be55a56255f07580628ebe3b51852404f81baafc51b7ab0a7dc39cc521180a8560e8bfce0951d99ec36e8a0a62f454f423f9ed4313153eb7e75be525ab82df5dac41f56b584fbb2cd997adc27fc5748ae474d0aae0afc4a6466dda83af9a62a9709c9524e4d8b1810409690a24592052bf4522820ed23c6e8969b6c1dfda7fdddddd1d63778cdd0db9b91b363f91c4160527949064162216b88004dc4ce2480e42fe796259c1bcf05a5a3d48209fe0887e4083f8a325668491729c5584ee6a7a2a72dd3b008030bf95ac8141fb127bf645f4f12314900c5a8e13ebb2c5cda7675ff8e33b4e11d68b5b50134b7662dc7ce203b13d889ae0181b5bacb2ab119f4504f36b6dcb84fa95c8506324f96839a49e55c5d7baad082492131b94c44cd6b414b4aaf82d4b880050379ff8446448002531ab91b4b3a446521341358aa4a8317ea813f5889088444d700f22289687f851948421d4f8ae51d22905a29e1a9f3b9455714ae58f1370d80ce7aaf829507b06c9ccd0f45829166895ec920da2a2c9c9aa5dfce19ff48ca09801b3b3336477667786f116985513a365f956f6e27372bfd7fe6a1ce5ce35ab84f37abd36e08a355a499a0b4a423d5bf042fd58b8a0a47eab16989e2d28a9dff638ec20b6da321f2283e8028f6bc33b19e656c7b85b03ba478fb0bd9b470ff76e191cdeebebebfbee2d9ff851920401cd1c53b985c95f85f6bc99e2f06f413143bf3332ee2824e6e77d9ce7eb4a98e68871991e2da4faf85153b51633983d6c84ac9fa23043bf2f3ef9fd72a98f1f9289ec317f88feeb66d2a33d77eff6f1fd51a8fbe183490f1f3fd67bfc90d4c4c27dcba4c6aaa5bbbb9b89f7713ebc1aaec7a6fce54bfa4d2672c4851f58b47ede1ad32820e06fb44743541045c8f61cb5fd07d7878d42caad6a4f59981a7d716a4f75055395bf335a961074f716d2b0f670e0e3a0fa454d7dbca7fc491e9010e9e5eb187de8492f7fa4ad6643a2a30ea5bd48a3282148a41fbda6bd0df7a45dd5b7a3f6735d4753fb45dde7a3f6c77892eadfc7b816d5ff1a4e111d9c9c91f6fa6183adca69da05b62f5bf5dfe1efadeafe91be504d31636f5580ed624a49831520b01ce30593532599fceb80d10660b2fa99a3d622f737babbbbbbbbbbbbbbbbbbbbbbbcbbbccbcb31f98395cd2fbeb584f9995ec4ed38951726ffca60841ba15c078010a6ff7e8c2118bb5699258de4050e49e6d3494a13d79e8760f723d6696acffd14ea7cdbb64d76f3637c4c875e2e4bf421faed4b3a4f6a11fb9b5ca7fefcd3a672b0aeefc2a8944cfe8d64580843743de527334c988fbfdd770cc18c6388fe9939f5a94f7dea2176fcccec18626608a639a0137e5c602cc4a6e6c754fd676647bbf8cccfe9f473fae9d7d460857d81abf23f6561f26b710583a3cbd10da9b38f4c4b8e38e79c31478ec890657270531badf66496e098d959c2eb03936306064208657c7c7dcab01b3cc2b711b0b6d281f534aa9561450c9393ad5232fb6546cb3212eda953d154c58c158ebc03a25fa157b1f8dc44925465bd950844ed63c8fd6187810ea92c0f7efa78681a0c51d3aa3cfe2ca27670539efa7a0031eb46474217a9fb317acb63605aad558c9452c6740b26067a2ba6a53d6f01c1b4b7bbbbb75ade27e020e84a28cfda8b4938092b71f799f60e1d461ff6d9172896c5550869b14db2aa38da3a948e6718a8e1034e706d1495c3e6c84c28859a79038c00092982b8366a73e4330263d7f60078a2886ba337274f51e9a90880278a84e88d266c948b784a76eb1a3147a2abc17090f682518b19cc18b7d12efc3238760c41d32e4db9470d61a760d7828225a18455c6ec4b57887ac3fc5af85b5acd3d24f9508281994ecccf9b0fbfc6c693cf5daca31173b31bb269241f4e282a08d2c7bf41faf8406a771ffcde66eb508054ee7e7445a17e02e6617ecfd7ba8fa6ce8ff159a2adf638daf291f443d7118d59157ceebcae44618a5efed752b52f3effb0d11e8c92cab40763ecae06366c1bed411c104208e16f103a0e68b342d282898142980a19087f348c7091bcb828b6598dd1a753718b7512ad256c6f32ab8aedb3aaf8ddc5d8f0d997120ed52b8fccbe40a923a2ade3a9f831dd2f1d1f1f193d78c5204a6aefef1ae5e4d6eb42693414a228edd77513fa11456974ba569630f9b599ceb6b10eebb4b7d197f61debae93d83aa6917ce8a813e3d987448ddf48b4cea6e2cbd611755cc453f143a3545c1f665862d8adccaae2775df9c2d4a80d1ab33e30b30985288630cbc20d702afc249aa779dc679e243a900fa032cfbef0304ff90c7b0052982945886202d1830da6bfe4699eed472847cccf81da45abf07d0651d480e32c0e0887eb5649432615d6f8f0145c4f714a11f8930c2371cdb32fed3c4b9c2724b74d864692db6422a05312113704890a219112d7459cb52ea7ddfea7d3646f9994736a901ac1f5631e518974e309d381e4c887348b449d87ae13195147e2f3242afcd109e743a26b53ca2615fe06b5cf51381d94984d86cf0eb42af8aa2a269f0491aa4315ffcf61abf21f85186e0896f829f3f04e8c79388915385a9b42003922448838fb8979567f74e58f4c84c8428108132142a4c255437dd12ea87de2553f7fe255611389f5f8c47862fc04e4f4e5846b0457675fa6919ae689931d81bd96f6dcfd5bdae3876167e765e66e817166e6e7197e666e665e6209b5b9c565eb5377775faeafc55ad78a07933f4a9e9c940c9b34534a6ecac942daeb20384388d0384b06e10a522a013714598d31468740947f58d65e9401b18c7fe0137e2afbaaa1c2d7aae2e710c50ced0b54a9616ea820e81153632a5e5bbffab54959c3ba0ed2af4df6ab5913c655b417ff4341125190d4f81f8a4f8d8f826453f1a58c4a7000e588f9f50b877667a17cec588410257f07f7a2df41fa518782a31410ccadf34bbf7d6c7e49f428af43f428f4e6c84ce9477f33290abee8b917bd8ed19fd09b1245418a925408d1733f337ad21759c13c1571faa56a3265f4607efd92bdda65a55005256a57596c39bde8ee8645678dae56153fc688129b94e312ce66331e6e2d617e1c631edf41fde035fe42a1ae1aeaa8075021e9c6563f9ec1cf218ad950a80158965c86f90a8a0a095021cb890abde881a0427486fbd18742a21f51540815a2d2057f650973fb0879e622f49f942fffe35902b62f423ecf4292c243a292ea4fc4a31276964b51dd9f2118c17162902868b42c44d0a0404a2ae51cd5d8975215d9a851e38706af7a80ba3f3320428435b87e356ab44b039607ff1fa7fa8055b188e0388d66f4a2bf09bdfc9bd18b663eb07c496d8eccc8948ed18b243d796a8919a458e25ad71196395c32dc6391d4244c769774dd91d40ff6e470d6ba68566e30638d2dd2ac78d010c1033a0d8f961aacc33a313c4ad8598c2302afd6e202082c257d4d0633b6ac6400b78718ccefebafa4b7fac284bffae0c718e3afda732dc66df9aaa5e5acad5af15b2d30beeb4be0a04217759f9831611381f7772b44984100031662fe1dd745ec5f30ac374e47cc7e8eadd7b44b00aae4993dad535b0726a6ffb74d6abca65de0f7c9d41ed7a4d09b23fe37f34f1e85de987ec5efc9cf4c7a429dce98e80a1a630c7321ecbe96f4ea445991d2a174b31b41ce73c077cf59f3fd6bfc5fb4f7dfa9eecfeea4c639d13b95dcb71fa2b0bdb7f9600dcd8008755ccbbf1ead1a2a027e11fec10f55c06bf7a2fb2c00a4fa7be8ad30e53b2dc27fbf084780ffd29a4ef537f99a2e4ced234c4d7bfd6ee35ff33a9d4ea726313af41a7e394ced0d7a31e99dad69d204086868123b79c1c87de43fca8189e92b058e1423ccd29f3c37f785f4fe28cba209fde849dd5c95ff49b7f29473346655285444bf4d43f56ec97c4d3e99e60c729acd6634739a4ef304934208741a67cd399bcdd99c15676b8106d724df44fa98e63e7f6d2379d393a6699ba6699aa6711aa7691ca76951839af6f087a6692f4eda8d52654d07d3b6f96ebb6d6b5350a585b93df79fc93d0b936bed8bcaaae0c327008b0a1fca685408800a4d7ef2c2f4a1d2c2e4e734d20fec433f7728d16ff5d209e42f3d7cef50fddb6f1d0dd11efc3c88d16f275ea2a7f660f7c2bd0724fdc7cca48e8649cc4c6ad3e9459b5e38f541c48be75dd6ba244b962ce1989987963c4cf2c5e93355538f1750835acb643abde891e985c9a5c909c21aee814d9b822f47757f9620438da60a4d1cb39882f63f39b0ba3f2b688243dd9f15c82ac7a474ce0793cab29807fe1f8cca2cd53dc2518e1a7a76c15a791ae36feaa25be94e7aac2ae479adeaaa795521e4e84effbc0adbfb991fc7be3986ea0808026ae003155229e73c9d4ed65927ab0aff04c2f0022405b175e175837a17bfd2dd1c99415117f406e588d98457fd99675fda453392af5879172b1147a2211a7f4f7e4f2c4c29f361742fba47752e44cfb193936f41a90afde6c9afa0dfe927fdbc7a42218cf7cfe1ac9577f124fa9d50cf390c54e7a25b595107e6cabbf8485f3c3d23134e94102b8ffa999547d1f51917ff9e8a14c6f48a8ca12036633c3bb1988987672716dbe189319e58abc5ff157b31a1137316d48f632c5a8509514ba962c57de8bf6ee5756a454b639061d6684fd4bf7d5d67c94ded27370b13beff8e6ff78515768790ad56abb5bf50c2862b294d7bfd2d21b7db6a098149f5ad03a36589309d82b17e30393031a116d33fda83bf6dbf2c94dc64ca4f943ff9ed57fbb22daa44a95ba86ecf2b7ffb48f26173986f6532590d92c9f5e4e7fbe7c0c4ecbab092a01495bad99d74904457abe26fbb5021fd5042272acc0d6a1a6f8c94126ab21c52c69536602afc2144481592c321649cd016668fe63013184181390b85ba0d983feb8004745f8ed897d19f8ef0f110aa7f12085c628601dba0faaf9c85f229cf62c3860fcbe2108460372b3ee56f4c8f92628479736406e54d7f93f22bfe06e54d0fdff967567ccacf981ee5218aa9afa7749850a80d3751220c6c88b952e8bcc184b9ae1625b8b0439d4150fd3f1c2aff8ced813db03cf8b352fe9bac152cd3f3b3eccb885774eb291d2c0ab387578b801ffad0c3d0874430ce30b986da7367d28d52b5b12aff149309ff5b120262d4d033ccff74821f3ffec027fc402aff0d12e9997e7b130544e9f96f949e29cbaa26f3dfd8ead5137ed103a930f4a5aea65d4874dbdb9711f556e5907e27162328ffce62d8bfb3b68761a7364c180c3e33c318c682030404c430a8350c528f6130c7198204ee802d41830ae9135988a27e0c9b3da54e398333abbca9f4ebcfbdf62927cfe2d7592b8ff227ca44b63d13fd7808e35414faf16bd26f72f43b7dd36dc2dea2251411ba33f4b4e7ff658d5eca3963465ab735e508735dfddc0f9678622726f4ebceefb5f35ca3ad55b1a4cff850a3917172521231633477c94d3925131be92b5f524874f700e4c0c4648f393031b51f695c00a0f6ab5fd6ba34efd1342d0095c8be94aaffa3344769af8344fad2934a7f437a8efb1a1a1e5a89eb7cd4d0f01875294598a3e7be3f142bc79807cb8af1947f886655fe5cc7af0ec7590dd894af14aa7f3b3b5161f213a1611e44ec8ca6080f1e44cc6888e041c3a38708cbaae3900991cd6434b3594f0e2aa44a7050bf9dc91e9160b42c3bddf10ee5d80938b6c33ca31f6d15303d5b7bff48753fbae837d4c155c5f7e1acb8a9f8fefb8616e1c02217eaba8e544b74c7b15579f70f1ceb94e8b5582c16133d5354fcd0a86a1d2a5298943096b932c5dc1e7e8c91e358487b91ba478f1e47da34c1c89922f77192f971124ec2ed3a5462a742fa4d8e675c15b86e0745303f587140081fca705172307636dadbe762dadb87b2aa24068b3061422da5ba030d263f7c57fbf8ac0f0f910d836d7448ad53fac72a83840ce7c021a393a35ddcdd1db60c8e1c3239926869f169c1c4f8c8f8ac4f19220b6bd5a97e08572bafe5eeb0d5deaaa5ad5a3158200419f819642cedc2d22ebd31b6c2303fc8b1b4cb0cea41d283446a4246bf62bdd814ffb26c8d6d71e917f13f01d49501d81e52cb4384d4234009e627e57adc35015f3f226610fc7ed40ad8bcf0120ecb0a46c66be9412285ec67939c868376e9f56011510c099c39fa1e1c16381197e498605d369c2d07a7672818d223842748acabd0692a729ac9caf62012324d2712d4f81f0aaee49c60414e5c82c3cd5030a4e2b40bc904db5345ac880b48d023712497e32c4e09c7a40847850e57452c088f901e223e38437284700f01520a530733891e7fed1225b3192f69d6d9971e415f4ff9296a1a2988defc05b71685422fda7ce6429c880fd1445d8dbb8bb6633d0029ccf5544a11a0bf7689bf528c303de57436eba0cd5f2176d766fef297bf94c07474747460415eaf7689ec2f87f90bc8611e04c885e838cb5f3a3a2f7fcd19fcc929754575bf99c53c9cf251a93a6428aa7313aaf314aab313d5a5942d84223eb25deb786687b6857ea419b1bdfc116a34122df1fa91018c7b62d013fac9e142fd5856a4a77e9ca43acf78491d8934d6344d2b85e83767ba21b477ad932b3c600821f3f080124a187bb809e6e9810e797a9444213c31c61899878787798238199088ec124c108180801a8881808064343a49e3e468df388db3fd0ed1937e07f72554873a547f0a4aa2244509319a1ffa9b931fbd8ed0cdfcd0afebe3a0982ce8e447bf6376871282f429af83f429f4e6c84ce84b7f33a2a87ed28b9ef43a4a8f426f4214d514b55121482ffa99d2735fda610b53fbd9c96e072553fb4f867ef41f07c93ce53219504cd6408ff2b6d69079b32532a01dbe64cad3d4611e4f894219a8ab58cb5ad6b29df6a216e30ae84726fb019201f170505007b5ac652d93c94640b4e6b8105fd5a3bb6b3296827d5ae30d54d6e142929770102f8bdb9ad0a2b0bc74fac72988ae15e037b88f383a237ad28e6dc7521e9ef25f1df6619f2464715926854f641f19fb7cdc53bd09f6d994bf94cb3eecf30a4121a5ee4f0fccb989b384391bf7b3244040ff9ad62d73ac2a24a3e8472fe21c88d31a6847460fba898f5223116ce2ac76f9f70b8a11b020c7b5848b8612d1e7d817ad7afbf76c51d4d0c459a5536937da4caa6bda4b920f1ac9080d5ae229ff8f7376c0c2e4262daa5ff3c8216cd64ada2f69872966e75895bfac4903cd920001553193c964396649808092cc8066fd026a02b433fb49b2a3e4e767e70708482603920101a5e06c3d6f80b23161c2e49ba77762cdc331c674648d32d997302cab79d03166c2248649c76854518d2f4f0d2463e35b261cf1aadf73ddd33e1d137da41d5b958ba84834128944227a23fa110d713fe2e8ca53de1399acca474ef2c10858611d6def322c7d3755ebba12c584cfa4631d0be28931a6797aa7631de3d8b1e6a1a23dff1893ea3c3bfeb9fb37121deb58cf762cd63194204e0a9aa6d329d85b12a09f2440dba8473afb522a0011e616b7ad5fd3c9210a1fb6344cb8234479786aa35b648e11484a3927eb3047662d6ebb4008598775e0ec0db046dcb81f241ff837d20f2e63a0e0071f526b4f3942e8391fa377edbb2382fb50731cf723d18f38edbf93467730a112f944f0d897edfd25b02e17582f68eb7ef8e0201f5cf323c8474dcd8f201f3f6a7cd4d458253536abc447505050d068a7c73d1cec1007896378c2711cf3c8abb172168bf76f7b220e0448016f56bccadf98bec5c3f65aacf89b166fe219d3b750791d2b5ee5446d4cdf82b250a12711caa77c0a93d92828f06f94bef4907e7b29bfa4877f633e4c4941193d10d1b3e8e7092d75db5e6784113f64fd996a79f0e78e8755f98b6aaccadfd4b5a017ea3cafc66c36a3597952e00c59296866b3d9ec52d068244731466d7721fc189ba6c50e7a8c31c218e3b38cb08b31c6f6dc1b72b7965324246184e1748cf4ebeeaee928bfe3338f857247491c05bf105be39ff676a0c2fce9aea2fee820ba6af4bb592c548e750d2ae772890c682539d6ad8395493b4c31ebae4421258c5042b9336532998c5972d35b4e297d188933125f9741a126e40c32dcdeff9879799979d79997d921840fd785a51247424cf882acba269da61bb02c1833bc50a3fad3e410d917ae3a8860cef6441532e5318aaa25208490fb10e94669a472d512fe5bceaa7cc4a8d07785bf4b6856e5376087ba514b75b4711c67aaf02371ab82bf03d034791c47fa01566a84f41c64ab70cf8927147c1eed398c1d0a525857a698a1ef9fa109f18c66078fd56ab56a1ae62164877156ab1e46e2ededed6d627a2a035ce514219293d35264369bd11421929343a408cc2992f3c1a80ea30812be0303724e4ece94ad5003891422350f50757f9458d2bf40b8427a04333337330f21a7362331dad52c55aefda27589696f7be80d542fd9d817ae6c63458956e5d80326b0c707329655ab65e5eebedeeeed83b9cfc36425f326ab1a85108514bddbbddbbbbdbbbbbbbbdb5d1798688991b111d39299734e198eb121132303f360981f17c3130858a8db035b000432a8e09b68b2d385efeedf5162892c5411a358c3f7b4620f3c7df7e99b7083104dd3b41f21f4a0154730458ba9df5be4769b7a38509fc8021aeaf73d3ec51082206380052270609bb999b9509b93a85f0bb402ff80a736efb4b77377ffb7ea5fb5c7ed4e5bccdedd6a76e6197f665f3107010a2d70c8ebdbdad62aa65b303131cbcd30ccdcad961060b5e9375b3bccf2071803a7f4aec9187ad26bbf2ffdce8055f97f5b55c0f2e0bfef4d77dc705ffafe6f81e04de9b9bf41897e86fbd29250224aea1e3e7eec5897d669f071ec801102c11d3434403b86d8413303b4a309114d780790e701794040afd0069ce5e18b2ecc65596df7edfacadddd215c87eeeebb9ad931c4ee2e11d8c0c47c0db10367b20fa7bcfbfbac46ddfb127a7fd2b280e060f0c8f11f1721cd2fa1f8b750286a01296f7a9457a1364750e84cca9ba84d0a7d202e144a358dbaf6abf67c0720cca69f573f7ed512fdb6c9e7c95388caacca2365591f8d1a49794fa1ebd2592be9b7aa3b52a0719c0387ccfc1c387c6470e490c961825ccf4c0f94f1e5094185f455d2198d7626bfbbb32495dd7063abd55a557f0e4a98a6fab55a301ac9872dc648a766ea95a7294818ee743a9ddca77477f7560a5aa1188cb67b76eaee432231a83a4b39a70fe6e73851497b1e99745cd29ebb084254e238321f77871901e30e3e98b14937a9625fb4f7ef362ccb4de0017f8d3a8ee837ed3fc78937db8bb447f5cf887efb9910aaa910a2df5e4788b60fb5d9e8c97362c26ee238d171da733ccff1218e1387e440771ccff157a50ba8b40d98243de910cd000000004100e3140000280c08874322a1783ca0eb81667b14000e7d9c4476541acbd324ca8118430a11420c1100000000001168000c5632c707e1e26168d2364acb4bfc01bdbeef957f411f42f9eb84938a44c07693e3d997421fb1c0399266c9f786a7b4234e73a08a374abcf8fbfab5144bf6e75d725e135325414fd1f8017166e4230d1c4b19ec43e4987294c8320690de6cd555650f5ea904bcd51c27f1233762b7b8edc9b2180f98fa83d198a0dc65c5a36e71938775de06dcd7947400054e52500e423cff90c4f09641e0704e5194803a90f21b32c252a7584f7799a44fa828d511ce63f9791c55ff29080601896d9973885164588f6f397f6ecc48b2ad26cc52e1149955f24a3ba25b3f4d8778824c5e9e85a0798745f8995288b3876ccddbd4f844a18c195e64f8948d09f226e7877e32a5a58253dc0ba3ffaec247acf08b49255a0aa2b10ca82fcc1069af430679a8832dd80e1c1704543f1411ba8fee8c3158812c3e4b6bb25b6c781cd9d53bf49557fdbc3725907de5e0927a0290d854a40a0048f64fbe9db0e5a3a7feed667698db496ee0eaef15c991fbc2dc99ab9d8633040219269e07e793b89d970f4177e50345d104ac54ed2c07495116751720513928883e8fd75109a5a9b3f20aedbe1f2f7848ee2552aa078beb708a87274dd208a284430092154fc0b1355e18b87b95605c66f6dbbe0cd2cad594c938703b20f25d126902ce7e032529b8b1f48ec3673421e9f0307922e717749d25efa29fc1da27f558e25a9312e4f5e95bafb4660fdeb68998a8fae51f46491645ca9c718e7820bb433c809baa72701a8214c78b4396897116725b7dcad2fcf8af869a5763abcbd27206241b28b4210f13998011ea5163e4167672ba3fcacba6b9193b7402ee09c8b3e712a5de29d6e42228fd90c6e062dbf5f050c9dc5a78d6fe8e28ace0d9f27c9929dc140d52158a0f744b3f7341abd2b18863c26adf43257321404ba543109122625cc4ea98563e09b7e5389684256e9537aae3f5af4113a7516eb431232e7689b80e648aee7c38f0ee97ef20974afa6d1ff05cc7639c6dbe2ec2a4941c8c72f01af7864cfb64d43a4ff28934c184c176e71a2e94827b0ba60578020333dced166bc0177f1d38b4d8611623045b4cd22247acf07a1d142128b79b3184464653a28157d85aaca1ac0d1cbcf22778ffb225cbbf6702a0932dc81bd7e96f6d3f3b332b83b2afb8c8422c0379d2afa26ea44a085a510e5e367afd0b3da6c3e613c9bb22ab8e02daf33e6eea8ad8fe50441acc86ac848f41ea4aeaaab022c4801e806999569a1bd867dcde24f77fcc6aa3ea5a66ec59a490399198499746f72e763365bf32b994bee967c1331abae1753d76069988db32cd98710871806dae4c206cc2f3add701abd09e2de35425cb96580a58fd2414d0f1464272d4c81e52797e13501fd47ab3ffddca64948908c8d6048ae7f8c116d0c5a35d2e76e6d66817789f4a121eef3f7b20d59d05080b4e2e8e773e46f0a17ffaec063dfcf42406efaaa5eed07996e39272702e6300425423e1bc6cd57df2423f31f8d6f59893cad609569044862fa9cc73582bfb99d0453aaae0bc5947d577c7a81a512df5e7441e1bd6d9039011e53985235f2f09b42b3ce2988a030e4bf02cb8bdde4da99260add6f898606051ae47da2978a49214f29130492e6abee57554f13865107c10f8971ce4cca567944a737de5e3f8e69e0b478fe26126aae4f2a9f6d1f116d19998793fa033eb9a93d5fa97c6b90d97608513106411cbfd9ed44bf9fc2223102034a51080eb45e8571a73073ddc10780019f46bb8b440611f8a7304a4a1c92e937301d82d5caa5b7713717ab8aa2e7ac3d5ce20eb7148b5e4e7693b97d4adca5e8b2b86a6c43840ade02cb4addced789322157e55c4e81708a13209668214f865626c25ef1a0f28427a4f967cf140e4e5e8e217451a0a2e9d27410b9fabff2d6fa629f258cf4fe685ba0047be8ea980250c0bd64110f2948d73f87429c6b12eef3c9445ef3a0d979c4eb8d72bd4a41bca610bfe8a61bc156c039ffa001797c604d1521818319e110b6140344d2b74dedca2cf8878a75b2e9a921f9e42b7c73bb652d66288024b6045b9c413d95322a6472756904be707c7f8c2782480958720e7a942ff7a70dcff68c077207a829f725b1057a236450f90104ec240ca1783405c68219a7adb290a3ad1c10e0a374373d111e4826a2293958225404737e38cd3076b04931c870099780996d44f0f127f364a1d98d8cc711d7f8ba98825f496f2b80a498b11e383bb01f9eaa3c09c2f62e06447258a7c889228abcaf90eecf2e261bb8429fadafc4b434b6454e25952c38f3a4b08ea5d96980945eb5f2d4f15f5d3cb2d1c20af232eb06528b5aef2fef03af34eb624909e279f0d855f0a7772205b95dacf3a97d4a7e3864a943f0131018c06e68db0520b5db4ee0270c04967c3c8429760a1efca797ee14e81591d7ab25f1520956ed6588bcb5b57601f1e1810d35c2ade3d4b535aec853c4f7921435c482b1a3030134c0e08fd89f0f9a63f2e1d77654c796fe7c7c872cd18de91d4a116008322060a61f9ea3a854076ca08ffeefc38c72cfbf215f101bb426a11c25b9472442aad3c12167279696c825062e121b71011da9cedbb6d39247326cd3cd807e190519593a28d46264f6c0440df791da0ce5e07898cfafaa7d04b47ca055b5bfaeabb349d7cb0c75a29a6e55dda56383c409f4590b1c5e4b032678672af2935231edee6b197a8ed0846ca8e2a21b6b0455875711d1fdd6ce44fa4d4d7b7b6900521ff940d1493ec88a039b83a4bcda8f4b428749f48462523de034cf570bf3ec57b5c0961db27cababa53e038c7c4bcc25fbdf660c276be26163577e68686ddb1d7ca4a3c42052e4a6ea3b963a9e6122e076a12efc892e7305adb3703bdb65ff76ed4f990029c831b295bdd6ed3fdf6330697c8dd4d88b3893d1353017ded7f31b2f3dd9f0aa2a350b4fc43ae96ce3d31a92c85ca29191384861bdcc739a937452ffe2c8f100a756c43b47abd20c8bafdba6f579b0d18676f1c645900516953fca91205d0ee8ae81690ec786f3e80cd0788279e79e2e205c1a1c28c18fa9631cd9fc4d61b245247cc0f981535a003ea36999159e32d0fab51a919e22c880afb8d15be721bf60f4bf1dfdba93a261a37789ade76e7c9a3304de17e5984a5a250e61ade3af25add9e119642206b0ea4813f70d05380a5f17dc0f7002c014aa2b0d5d638ae2be508b014c420e7ac56cf0c4b4bb086911973e2bb6897f41af46af2c8799004a073115edf39af21bbdb61bfbb946bad4f178352a55c7bcb0e41473122a4248b70294393b91c56ffa2a3ea638787ac5403cefa3df79b3e4da6e1dd1ca69d9076416647d111a0698fdc5c94f26952bfca153903df0f50e072117a46ac50dd7015692bb59340f82a68019b5c0b13afeba9b495e590a2b80e6c9be3813c3655202e292a1738ce80760a1c10fac681cb124634f12324cd217f4e7fdae5704fece2fe5fc57992499bcea2ba17637bc2336fc33c23483a3b7669e8852c695858a4b11b8c327d426936edf392060c920c6219d998a8452e66248fcfad9af197ae1508d7f72c606ca610d6420a8ff2986b92e904432201e0f892c9cc402d1c0da2e740e9895c67c3a307a3c031eefa68ef535096e69f2e9ed87917f4876f2376c746f00e9d99eff1aad1cccd24c4f0dd9e290a7d4b167b458407daddc86ae10bf1ee34da2578a1d1d4bb14ae007df1697940161b3531a43942311a3d91d1dc3bb9c543c123ae468592ebb2e61bda85834c8a8e5e1ed1dfb58501df2e9400d0724f77f19831522b16214be438e2171d87938ce2512c22f1144ac528b0381f0e456b9dc56643e9ce5d8dc8612157e5568880faf36632fec923c3fec134580c404045c2a47e807c605a4436f96140bc83af8dea863b77d4f225a94e440e839f7a6d9caf3f10d8c662dba0982c3c4d5ac2a81fc47a4501e2fd59269f965a914bc856e618e5e0a311232e8a756e006131110c7d80c5d54955d70b276efa238b54ad43cb6e91527431417394034b812a6cde9fc91fa9dd036ef3b1ef7651e8fc3e9696227abf33d7b6f9b08d895e9b0ea2e67adaf6660d0fcf568cc35fde784e3eff510e3ab84f378857bde3ab5dc05acc0dd43ef256faabb4d6646095bdb774cc782640799c880df7b9f8a8d88e10b935d9560d1dc9bec66143efc3b8610d743d49068465f01c5bbd353700692f02a4189e2972980f72442f70e6c6793890fb37bf0c08f51f99e4092dfd855cb2de0ac900317b6931129c2cb54968a5afe386dad5a27fb05ca1a6ee07667233fb2a1dcce96daffc4c6391dd23c8ac940e2c0c5dc13af3bc6c58c9488bed088229050e91ab7ab23dd6ee97ba1b499880d61ffc73cac9fe08d64798c76f49ad3f9c9e8a6477d6dd8208db1c4f08a8b1bfbb9bdc59d03ef9838d67ae60909ab2512dba5228bfd08f27da26c1f5e7b5dcb2664fd218ee5bad0fdc97f5705aafc8360a7d9081286ceb1afb2b6a5df392509fdcb60e3387804cdbdafefa852ed0bb8840012ba128f2b55b5943b65488789a094bbe03b18741abd01d6963f15bc4699c3d066128882db3386a46ff17eeabf663b003802ebcc5fdec7c0c42f6e50e382af7a6f02e0e51d895efba667d54a8ac2ded3960018f850cf0c469e32d8e9e9cadaa76fa0b06f1f14c49b95d3dda650fba0da220aee6c96c515ce52120fa3f1a9755df9e3d83da4cfbdfce64d8ad6624228bf52d91c034eae060587b6f10bd8c9916a820df13f0d541cced72d473b83bcbc8b46639bddff47f165b41d9c10cd0c5e2d4e68a761e00c81f68ade4fc8428202e9fa782b995cecdf657a4f0b451437d1de52aaf25b43f173541a3ea531a42a4e658141b2b22fff8a25bdc5097576d07328f652ee62b9bcc83bda9467cae12a8b35bde1576e11e4a9d865996c967188c44b65976f6fb072bf782415adf59839f79723070ed5637d23dcc36bd3c7d190db07746ab14328c175ae4d5abe536dd4ae752e26ee6bd13573fb9fc8ef6bc8884b85060be1411a53e883b7f0e7754c36aa7aab22bbf49d50ab08c5ce3ba30be1e474147eb587c0de4d1cacc8e3783918f7f88bf67c3472f43a24de288a0afec0a32082a2c0ff1521d8d3a4bd15e5384e2aa84e9ae8f61ad880b300841d62f439436db3a210b7d8eef0f999a4e66e02bb59a5615748b1e2992b1128b30f83b6f3d65b792598a77f775432d11b3c2244d610ec738963ae7e0de53f75d05bf82a520a139df348634929c30a0357619f9e905e86c39a7a400e7d6f24a65618101d64fa98bdea3a0f5b43279a4e2951a6a6dc6fd7a7efc1ea8efcf71e3a4f4a26079a344fc1148cde9d6ac35a388d64950309dd1f021960d76dc75f42b78c8cc942a1c9b5f3868d1e204f8c1747139b7af9c0494386c17c4a7554b07927167ce17eb22c4397423c80b0cb7b7fc76413c6133ed8c3b0c983e95f2eb164503ac427fbdf2e06dc64cc65c15e35b65f4761a01f7b917662fd92a62f49ac74f0b1b0acc4827b283997fc025c59c14a73b7ada27debb436c178ddc89d6513ef96322ebab1e9286c008333d95e4d27f395a91a1bb5768b5d99f08a6506684399c22494764b2499bc768f8235d7a85c23f64abc1399313f21430e02f14cfc155524f732e2bc2f9a8fba76637953eeac56c949e333aeebcdcb9f3b1279c8a9f34b165e0d44344dfba5057a5050b4b8e47110d336b6b1eb9f671c5a34047e4b5caa3f0d4209ea56af7a17f30b718be1bc9d8d4a0661361ae7db7b14ef9a5bb4bb26b160da3bb5c4334e24d5720feb2f07ff62f3f7fffab31c595ad23b8628a2c4a4e9acbd3e5b3d4ba247542b64d5230612634539a64cee21fde9a414fa96042e024be254bb70a5214c4b63c7c588f1357643c200f8e38da852c658be421efe5b6db38e93035aa3b0123a58e273002e7d80bf8572c20033407fffed3867d42181b82d6acc51badb760dc1fa89e68c1485f6bbbc7978625b0546783f9ac93412dcce6249e7491a56b443dbd3be8c1c7d493c1e7c1c035f00183431481eb44da34f594022a527f5646a21acb0fcda7f8177883b4ef2f43833fcbce2bdde2fc22917d9d8c15ab6d08d952a07f458c3ce9dd07d65493fce40f049572d166f270819c7cfd1547e0e8272e86335479f51bfefb531d5e9950b233a2a93cff1e2e5c95f49bf5343dbc355409de7bad0a9dce6ea19c37007bdfca61ef2750bdeb9bb6f35ac050526eb78e89cfce38375a4949669d70142df29d46c4b41e842562b02bc9ffa1133989e796d619b163947b2fd7872522d1024f642a64f7e755d19221d6a26e1826233b9e2b144f64e4e7be0ed7e2421233a9038d5107a52250febd3ac456f82cb2b4dd7e9784dd02007013a11c1d3fe5c6ab99705cb0d97c0310f48c542c42f1e86efbf2cdeba012140ffde40ec46b5608dbd792399900b125b2dded2aae31f9414185415ad1d62dc3663812a1ef226d3aa471fda7a0f44aa8fac6c718af075a43398db2e2f9865a8b2c0687dfa02c656da4d05cc11287f20de2bdd5555ea03971c798f717a392759841ba504379f002386c843db44002a396c0de18dca32b68cbf546647b93333547313c8276e95d2208de6068812794b3c3d320ee05b499bd960a5deb6c0f4a901525abb3fbbf0ad8ce88b7c77bfd6bb8da312ea0d5f1795f8c33cdde5dd8f8b46b8a5b859babfb19ded6f543929cebbc6ef2a102a6376e34d5ee1010745f9bf9291da13d91e5c7912584dd0e74bc629678b8743f2377f0780381022239de6e9118b3acc607c94a57592eea87c905a838655ebc2a787c829e3ac7b61d9669ca068bd51ba784d23f24c6f3e2ba68ca8132f636acb3a8bba4fecb53e69b58dcd0aa86377cdb0689db54ba5b53f7bc3af0c143fba6dee570296f91ba6148fe3268a9e7b7e9d29901603410af5bedcb4f161fb5a335dd27c442fd6a43f20aa4c2185868f93677f8debd54bb3ee760cd2f9e0d343eb02e74c34ddee09e3532faa90e0cf83d3ba96519eb46cfe07b20ba8a17a02e7185951a00012a399282a4dd6f549d06088c0231eb63640ff52fb58fd2a3fda83d35f70917492bdd1120f0b31fafb30cfd5cfc40b4ba1685d64f92fd782884e03c1db631a65b78ac0034802fb37a0522a8a0a540f5fefd66b5ca22c3e9d3c290325213920f38dd15a6c7b2ac58a324250c1690ee6b5f34112491c478328aaafd83e4682f44b76fcd2ec39fe0c2830235258ef73d4e52d02a4954294059233e82eeaeebfd9b5e5902b71cd30192400f2e117c086a3c909cd1fbdd5d17183186f7229bc39e28368b32c308cd9a0ab19084537b515c5b809f6ca09cd40100bf2dfaeef6049427daec63a679a35a289668bf60c51ecb3ca2e76f21669a36027155171d1e4d9d73622385415591ef47d3e0563ea58a1d42192bbea31e2f509823e2e2690d52c8cc5c1ba0a050cde74443f42e75b1931d51a1dc4a62979b8aac84a0585304f540e77d11313080f51ad0c714a913bfe53a2a4e926e5ab02fadb330c68ea0218b632c92f4cacca229c342284322072074caf8b7397459e23de30b06b1a174276a960efd25e2bc9ce46f3230e7490c9a00c45b33d223e91459048dd4eb833dc48f647da9994dccecb34bb2079f849ee5737c631a6de351d724c3a71cecabf8a02ebbf6f396d105a65d21e9a5ed5d5bb016e08b2790297771766a55589b206d4e813d5f6aaaaa43064c133a9ff07e787744786111f213d3fa4f38e0ef396646fd134b321f4f21ff349c8f7e42a62596a06cee712edfc726ec89523c18484cebdb8a59da248c93b6c747cf232a3f5989cde972ff5131cf71df37002f5745b6a2d485b715cb9ada40eefffc1413c34cfbfc8f4a21316ebb6fbbeff8c244c4be8eb608ae90ad0733004299cb70a272a5b45721b1f60cf8cf3635f9b9ede38bf930e36811af860497f3e619606db9a4416f813110906e70cbaee9cc300b44bd0c7a278a85eb4b7046a0f454df0e111cc74892d08fbc0213b604ff00b9af552d157429da134b70eab380ab67997ec43c36501a27783543d9ac5c3be65a46eb104a2db36e3903f8b1d95879e8084ec512f8dcb37f20858266ff6ae8b9d0f95d8a0762c61bdef5154c9b0c157da173457536ca78dd918e0b4f97b8f8b429cb9192b05581c289c1873ed5d20f817caaba1eb6b4dda75f1d83fda16b92367731efe55702dabe06863720165f384c8cfd1ba7a2b48543adb9bb4d1213ee0dc058a898b7554636c562a792dc1c04bdfd3f369d0893ab72e620472f61aa9ae55304b9cd41dc6a75582b7301147684d3279f34915f27dc33ffaabbaf036781d376f999d0cac90f3e16f76c7696fd61b0cb4c41b5cc9137a3eced04680f2673a4939b8d30b3963096274c0f0a4bb4091ed09de80b4f16c6c09dcc24684787fbfbb764ff4445d5c1b0f18b6bdbd9681834389cb1403f2a4bd4135ecadd583a5526c58d5f758bf234936a0dd6530a8c8207c17da9387caa2ae6a640210bd14b641fd8cf50d101cde8d86b3753b757d7f46ecaf40dc2c2c4f1284b0c3df712bedb7d556267b8ecf2d67632cf50cd280d13a15276823fb9f8d684dd289ec504af313d168ea159ca90d45df0936ce4f64f788dcc9c71d79566f381ab90d65ce1265ed3b1b5b5fc306a41bd6e039be7fd4a701d3c02fe3ced329829dfc9caa303b3fae6afa3c072ced01e08b06490abd142cb90cf18554ccb6d2cecdc3dd24ebbc26977b5549fa38041fe9095a1a864814bb84411e64a9a16c5c87e5e33d55f28ce84051d2f59b161c1ce48d3ff525379971abd28307560b005499dbf1f445261fb186312426e631dcba95183dd32d7ab9bd3b489e054f04b8a257ce6095bc7c2c0266ac1952a1d8ffc963232db5234e2cbc4dc4ec1f3a004f9d60a8ea6509eb8ca096edef2023479c2fac9c9a3d916660494ebea9b0233b4c5c11beb7e8a41a6e191eaff658b00c36eb60e849fc93e33fb06ecfdf0120682097c5750b6b5d70d881b621d973fbb7a0ef60d4ff11371f4749ec508dc306c358c1a1107399f4c4c36db74bb454ef521a7e1269f89cdedb2256f89cefccfdcb2b0a263b07bc14ecd759d92b02eb8a2f02349783781a525673e533a0f9ae6449a4ec0b82998893904e03ab001370587606bc0723eb8d4c50a3584086318438b369d904f5067c9c4a89f404a350f26fc4e5cfa92129c7c3a8ea3eb8b99bf4adbac8f6aa7dca474214a8c0bf9091582a22ff17d1c2ce24e61ff9cc7a2ae23e1dc3ba5fa865031e6ff1eb714d34a951c24c4b9e0d861bc1e6a93a0e261309b2a1fb5d19d85e33bb61302043d8d2ce6101b2ed18aeee71a5a72fda046c732e8b29e9ad5e9547d49cdab86f311dbb5b003436d3305d3ec9c2f235bb22d3b13fe7e9a22582c9f313b23261c03231a1877482e3170d580f4c3b10faee83d0f048258584169f7df1598ef55650b64c00486f1194f19c884803276423c6ea8026a094fd1afeda4ccfd52f19081566526dfb3d701ed038f52f6065291896490ffa87c6740103e9884c59772c05c1b022ab4fe0b9b3356d85be5ed93924b2f00b21c7d58c09bee0dd96bdfe8382c6b395cadac39673874250fd6d8867480f6beb87ed0731c79e1744d7967d1e46aec1941749ce0c1caf6fda279b51da6c8df36e36d70ff9c29ae338c2cda84fcfa6d1cb8b386c449a1b0997b4b30ac6f89e059a4f34b1325adc14cae288c43d29990552a9601ef3409238952c8645b32d76f1d08f68f542bd0cef586e85186d843f1a8cc5751885bc284ab35b1f66347a811d5b3d377a090266c0c8786aab0d7f6bc6f901d2542dd72e4b1bc791d4522e99e5c8f87ee12ee0a517dc7f37bea0a21ee6d5ba5b68445c1b6529019284004f26657ac8f99360a581e17fad013cc5d464ff9797b243b9cb115d828492991aa79efee1e7a8b4e6a4eedd79365862bd7eaa40ba690db83a26c713540fde94bb4558a0abca3c894d2fe5d564b2931f8416ef8f9cda71ec4c9699352267dd8aacf8e4971b2735821d5465a4791aa6a1ede8763c0a7362386c247019228fdd10ee2a382f343b180a9da527c316ce0c5ff7297e6f448e874df5b28e32efaa416403ea25f3a7ab8de8713621ec2e49849dfecf84c32341da6a6b5069ca10f675c839cc0fee3d8780d86ca0d781a5ed5ab921b6a42c7a8700fb133630fad3c782375b86b2c23e91b93f0de900cd8d07256c78181c9013b134ef5470b4e3600fd72ab53dad507ac9ab7d71708de1909cfa0de0e30ba28943c84f7afeec45a0c10c3b1a705618c142366c4d4366e731fdb7463192cd2ac38fd2a84a76d714b9a81f59559a885002d18d1406b243ff1e71fce76b5221c60c028d17fdda5b3d8d18f6d67334c44d0840b3f35dd2ef6ab4975daa8b13d6a09a426edbc710eb7db62e7648542ac88734ea850ab6749b4a735cd1bd41e44702fe4d864161a557090ebc9dd85044776b177d74788c2ee05ec5f5b74e68c9327c0320f7bddb3e73fd01cff0024553678c24f1a36de4d513ab665663feb0059a9957165f2018da86cfe6e07420386485394bd1dac6b1c0ac4f820e81d77940f4b8566e0d50d0003acc88256e7bc05898e71f7859ab0530b9c4ce8835ae81dd5f2389a7864d08f654cd4bf46e987489e7c95c701705693e91c036b0b60141db851d4e2f626275e9723567cc6b3eed7af800c12c281afa3d9d0e400c92e9a51c04c38a1c08001dd4204b4f354dfd7fcd4acc4782d36bc033a5ce0765076d8204e85a2e066d1226e59b5fd1af267eb41e11fb0dc87c8f1157004a18218aaa1b481c028145c227522701990a7c677785241a413b383fca1ffe74acc5d992021a00950aa7d43920e9661b5aa83e381c3374bd9e120d1df3d51896dd0095fd5902e5177106cecca5d4294337d6c0cd5e6be6362fd1d80908cc3448ec75e78d9832efc847ddf1ca3e8b89cc96047a263f18923fc3fb62936cf2aa3ccb3a7e9718f67513f1e4909d00352947034401eb281a156e669ff673c2cdc24dd2856f3fc5e17942d93277932090a2d6fcd933c0af8e7696d4e52a614bf10c3ab378221f7f1408d0398d4cc4e0bf94e071576a28fbaf2bf9b02b43da1ce992b21adf3108e950bf5217a0be317e9c3d25df492af9ce4053e3303b6d836b6ba518f81e3227ef005b9f59efa310de11dd819da250b5a41440ba7605449824419bd529eb8d7cbce6a3ed092ee9debfec133d00d0b14f58cc5ba6b29f13b6e070f41cb6fb823f203b7a515e48bec1a609d44dd7562b99d45462ca6c6c84b843dd0e7c4bcc8b80b4ab40e6cb7e0ebd3c2b7c48d2dc692670c5d58a116d108acb1775f8783f32ac34d70d154c0efbbfba5633b8268f5077aa3592c28bda1e9de66e9e712e3f62db1cd2259bd8c229bc976643046fafca31ab5b13321c642f6331d4323ed788487228ee9850840c14779cf42dc1a0de2aa9edfb4cf44c34632d6a19ec089c6c2d26dfcd694ca3a50e33f4033fcc3d1d0af4e4a8ea0906ddc721402fb7cbc969f083cb5c4c805abc6252b1c2eed5da206177f6166846e171ecceae4250ec4443ea8cb02aa3dc9b14b9a0f1d4ba1f5ffe41f2dfa6f2680c86995afb756bedec503af2aba0816dcd4be91a824138352f576e0cb197880b3fc844c5f3794b8fa09707b75dc53545c72ebcbe934a85823ea5d905c607bdd07c4dc361960c96d680c3f496eef16046588f43f0f260af821ac3a5bf85788e79f5e96b263646b43062ff42c0fd240fb6dfad364f304f4db17139410b866ec3a5fed9df247cc3cdd85fc7655ed8a2722b5189399f9a975d6df5e752e9f4b08801b94a475948bd6867ac26478ead4f78d2f6f897f2fb4774efdf67f768f74a1ed483009d497fd19ebea1b21886f6c47f4305cce939436d6a6044ae6ed1f141b43e202b1186a3dec771a3d2afefa7ca07e5c0874b2e1d9f1101aa63d2a416d08bee3ea147fe8c10c0395db01ef4ac3d035aaa5eb91c0e46f5bdd64213eb29d9f2a8cd26b207f80094a02f49bba024727116544bbc12e86dfca79c072f787af08958dafc7c956ea8fd99d789f36a09781a96b0ec27f412c5145234bb6a9c9bf9806be448202d3d750fd1c6de480903bc351685636aa7814783a18a9ea03705d7c8159bea722cb7d7a25625983aa5fea68642248a06575f58babf4281840b892d371466a02cc4194eccaf20877976f99e90c9facd272b4de8ad1e8582892968bb1248b7050b302b099c8ae98b72c40931dedc0b0e9a4ba5c4e8161297540ec61949e37c25dcdd3fd8852ea19e10807f2e793d5a9851ff812a34ea5ea75c79d24731ccaeb939f3728de445af2d63b05e52f3fce207a7c637f23a10b083913c3fd81a54394ebc8aff305b838ffe0a68a91fdd3238f5d08f6f6fb52b557f8f94ccb3f4b93d4880ae47893a9803bcc9e406b60fafcdcbb1ace3f576ed967b6aaa384324208d4be17f356861463206113542c41b5b6ecb07c1ebfaa60f99fbc1ddce355a99a1b095d5c1b22f70ea6516da07b2f819f614473a0e1987da74157da1020fe4eed4a127ec4bc7c196bc0593dda7a11a32e179d3df3dacc9de3dcde63c82016ed8ec1c274ed9623b7604390e602b0c9b8e187925a220cf243d1542443f3c37135eeffb8df3455780b2f9aa9f6fbaa76e061a314e6eb804be269fac70acf9949f060636ab337f8c1a636c87bed7e4fdf8d5c001bca55d1afc3c25a70730f574e2e11ce530741e6ede7a53fd246c114e6631010ad7a89090b6616efced8fff9357aa4719900bc2db510c1b31c1cda7ea4638150b41528b835eb4bc5a1542b069b0e422f7fd75c8671f274089e5be1041b0574fc50f12d54f035e658b498c3ae613a850ef781df2d0f781dfdffcef0c80a0a1dd566dcfdc98e9729d47ec6af59270e3b36ef7d01054d79fbf006d3ee344f52cc8b0683541f8cff1bd397342a28d9d99630a59419630e80460a8a8a9cd031d10b42b0327c77877f33dea241d7ed2ad628278b8c6f2fa7c749ad5924c3f453e71a72c230761706be8d2624b96507dba2802e52957acf2c7f1b75aeda79c72217c165c968de455cb6f02c8ecdf8cbc57ab250b99120df553ff7efd94986cb0c4d10d7c1749cc74da19c92741b0899123b26d7668c8c30b4e68972163910cf4540514d623995985abb13fbc53dea9b476ca957c658f539187a3d8f277f4a5c72f22df23ce2d3dd15bff516e90ec3efd1aaceb55a35a9f8a0f4ba80df5ae5cba82112b0f520189cba5263b6da4e9df5e441a9fef2ffaf62c9546a32c5cf3549baafb2a1f77a0c9c092c03298a76ff8e77dec85b7c7d9ef91ff9fe0ca54c8d65a30225412df7cf6de1bb43616d6e40c73fb96374116d1dc5bd69c476dcbc24a9c73ceb101c382c9797aef59d209943f7ccc139c13dbf28ef0d78604eea4f6bdbad69f5e2a7551bf1e39723d71963347d4527e3b56c4ea15b52c083c36b55f81e46a041aee1d3572b9bfe059144fbcf99854ecb27877216d97afed50646aae50d20448b1ee19e6f42f181cdabeb659e5946f61e335f6266af080ae5fab05793b55eef79378937bbb9290ef250879c8eeb705f02d4c1ab706b7afd572260dd65bba20bc6770d3e07e2ece312de61ac5abf379c174eb311893e55b62ba062bb5f79fe72af9a2aacef0d0a70293697d86bb557857c19d3f1e9d56f51a10430668607760291db0d34e0cd0a17f878eab0fdc09f555fa8fab05822b47a1ecd6856ef6c17165a72534a0a0a22d4f3be500fc82b6e0eac2f413b3f1da83236c166754132d8387460108e7ac4060111f850547b39cefd7cf1a8d794a720f1c50f1084ca0ab2337e7ea2a0d92a0efd00a0ebf15d856bfbb015bf0309a247b4bfa4b1d2713896a19f55212a488ba808ece052c0688a1cd0782b0b81f0fd2c44b92618080b73e9911a11217b73c3bca63c1b25282016da6745062eaac050877cddfa3dacd3102b59e29a901edba91cace4a921dbe7ec55500284ece9315ea4b3748b49ad2e4185a9908c0ba101479c3838134fde06843121df442a6e1e14386239406034594fa451cedb9b7e31439bd34f8ab01a8aa9bbf59d25b6fd9ef1f7825f2b316f605c630171b1f602d42dc3eab9c2bbbf7054da7319c4653af7b251371b138a74efe9cf7b2bd5ec0466639aef4d0661617710a550c97e568b3e3ce6f520810891d8c1812dda4848f56a32a6d431594cf8e2151c99d8b4d942693d72a9c7c96cc5616dd263fb797ff88fc2a8da0440daee192483061d4a98633514912829e6d8fa24957583a4a8f86875a2cdd3454891b476dcf633b5ac96537cbedc888b649219daa0e97a26aa2d55cf32323045991ed05c415ed90c27d431e76db29fd4e629813ccc288a8a836996ce6d1fe4e64a0bafaded4cd8c86662d7a197fe258cc2414e2e24249caabead65af0aadc9c113010bf4dac9980009da7536b47dedea960474da9a1156c603a52aa2f244f7477144b112abae423abba8c6bd24a8f3d747a5c87f9b0d63357255e41f766f65fd66814180c26cb6504115883cdd8c25a409aca18056a3b30f4dbcd98ce15917aa937d6dbe65b5a32c101fa0e681c99c2b7f6fc5cb09f17770a4c4fbdaaac0d4d156d7c4c069d50c8beaac4de5025e102560d972a02aa0528eff706e0cc49bf61f985e2e87c74f529c6c6bdb72a1ab29703c75c0828210cbc3a580db6ff39610a8d19b81edddb387f0b71afb7db9ac6e7fd440f0b4c621449ed52ee0f16c7cf85119b09685e8dd3cea083f22023daaee490ca0529b26386e59d478f9266619073ea3a84ddbea07cc0dbac835e8a21d526ac309cd1c38902a306e3fd4fca0529b3539ae7b06e8325f34ec3d51d4d3c633d907f2cde65755a8da05ec5cd5f0d816c970f60000f58c91ecaf4cc593c8091084acb644216765ef8d28a6635dd01ce2e8a9e7860e830969ea911690b4769219bb143d85b59b8e5fa46490060ee02b7cb467b48c45c9634849181a97a21acd334b375a50e3082dbc6b58f4df98e4524afbef5bf278dc424a485a25ee0e8dc8d89f8bb36ea0bd1b738aef30ba192cb53c00322418374806c1e9c21cae1fd4f6024a6ba6e69e2b47b28d961703756cb1441f01b735b6c8768288c235e0762402ef5bd3c1a2e81c64263b21cff2f7c7065cbf30f87ce714d29a16ec4bba50e2da5d705824efba48a15a0b00783f8bbd8a8c47769cbf7b12904119bdcfddd7d4e37d8d1ef289168b68cce47459fc603ccd8924076c3965bf6055800a4a91f3faace42f4a6960d6fac2dddb8bc6671698389ad0ecf2749029c8671e625ce0fbe728a860ad6938e6eee444e28581cdeee61e2c2db83f5568cd600e96ff7f2d3677ce18fc3779ebff2078245f958ac03942825c00136159aa20bbc9c522da6692b1ff9e833c7a2243717d25e90bf1b17f164554775e1261aaad89a5ab30ec516b9d04c67bec69508e4c695d4d6781fa012f8f23a31338107fd12294803bf88251000be312895f0bccc60e46e4d2115dc65e8a474d4894c99bbef833b08cd89668b55e3ad1ec997019d1fa7a4684e4958a5dcd0d3b9dfb9d18864fa84719fa7a8aced72d73bec6f33bb2c215920372770ecae833053028bf611a638a4d1a2ee60b58f282845733889faa8e553d15c8c4111b5f8268377738d6d35d2be3a9b61c6e55e8d4eb08b723183a7711b772a72d6206374c8c1061a926eb7358f2308a553edc42401e05d18209ab5992cb57252cd3cbe04042d216cae7653c9cc02994973d5e64e1abc3d0a6796da0738f4771f1213db5a415ead72ad663818c7813db04844e0052d50bb425200cb96bb7cb57b6e3d73ea40ae79550d4bb971137cc7279923c8808ddcd6d8ef247823d687e3ba0b075241d82036017c9f5a5ef73429351111ee52354cd21e337ca91a95d32cbe3d1473bab5fc5b7d8bb1f5f993b7036b6ba0db1c58b5bab7a3b72b0249420939c90335a579c809191baab3b68f488336fe339f591784dae4a094bbf7f6cb85f682433845eed68afac5655021196c2db1c1a47f8029d3cfd9a7bf5d900a494b4df02e9e98edfd23e60dacb125aad33bf89f71f7519a7f61f46d1504c3d090e429b3b5cd5bfa15daa87b9e811b04710447bf6987c85cb44bf46938fbbf90f1a564b28b8e36ef1ed13c0fcbaf45f3ef9d4bb3bb9460e9449f60a078ad31b3ce1d4670ca513816b534ba37293c11b1c1271a480ee16639a0edf2faab9927364f37a2853a8e2be3ec66fb8fe7847966f362e1cab4b6ddd86f11f8b3648aa8beaa6f2694fdd06f6843722a95f0430d7e035da1c87618f430036167560b28e1736ae9d372f221b44a863decbfdbdc0e0c65310c2f5af71d1d59609536748e1eae13eef947327edf3c074210741f6bc335f8b4257012ec78bc0df030c71a4b3743815f995d1bd503ec9b1f246fe0b08ac369e1bc6b04716500293932c04f96defcd7a6232fd0b6d0ac4472f3f0498ad5cf8db42fb5dc72191692ede37ab206af97ad0a092f28a56d219c949ccaec0e5be68d8d4095009d0c10083e9927bf7e937e47d3c7b69b51c9a3076cfe6d168fec6a258822c9d1678c0d0f21d28f4eeb47cb74e403275ad5ea11b8866d0733cee490d2fa98983ae05f704b5dbb19f0ed9566fb1c1f4b28044faaab8eb6333c068e25e2bce2bf4fb0f24b340dd3cac3c46bb13a017db85e8c1063bb314d8593dd78542c352aa3408371435b79fa5653bc8df9d5ee963c2f8e69e4760ef5c96416d4a347417552648c64040e347e99dac18f1f5b47d041a3f9fe3232e0813f7afce48cda9b26522980d99caef9307220153bc7a91fc21f625f6066eb80f400359be9497e0b2b74ebbefb13264fd004672f709b01ef8be03dcb17c68269c38b115adccc3461b148879c98cc96ec2996bb4941a0d623c454cfa54f7092af9753add0b35066b2f8391ca8b8cd9089615a8de88bfc60eaabe1cc71a00b34de79896df3bb37390587dc75831682e85ad8df635f7af88da1380acdcfab8a6195b4c8ba84c6501265c8dcf18964bbeb36be22e11663af7dc993386394df5bd3619b2c67dbe1c532c3bac57a8683686efb633937f4d1e735141e0289e255b84e2f435ddb1ce2eb222a299c74df18d13a3077ddaed319ff09fbb60a570a1ed3539c8276520033fe1fecbc9c309c9607de85ab92bcc05e8f289337a63d0f969c7fe37324d681b02521eb92ced6a883560522865c59e9c344d867a676ff3bb329e954374606fc6f2f5de1e1500935bc672701bb50147df264e1c082ebfd797a329a04be851b01e2dda349d84c9ad7c83a5cb2f8c1baf15a6aaaf5849e32e6796afe9b7918a4547fe123e9cd621fcba1f807d204e20985fe73463ef34100176ab45647e9c7c2f8d380d751006deb5a20b0782129b801110f02d369dac4f1376a05c9d4fe45c2fadda692916de5045cfac9eeb67baf9ff0ebf2869e85fb530e5a3295af50a1be196ceb4c0467e68eb64676fee208049d90b79b4beb91d0952770808ec4629e54600098840ee4b928fc7d7a13c842b05e998e5b2f295115eaa40d53efed217edf7626c14a97a9d9e9f22d661164acff6044dd767600ecf00739fc3ab951ebefb2d211535156a2720bed446b260670b7ad7000dc6b491da26bf8b1cf0daed01253b871357abbf8d6c1631232cefc97ced5c2256e4d49b9c6ea0e9412581f0e565e6e5027acae5a8c61cecd0ab59a099681934b7c50e6082a2a0c8cfa44c56ae3f93f63ee29802d3c2ed314184520b01af99af43946628a31d6752931c661aae47df102222fe318eb8cf7631107a32019a3919e883d6e2739650f5c31242b9e36185fd77ba11d0720a348cdc458eecd91056d202c37fa1f26750d15fc3dea1e5ed0ad25cdd283054ff6354418968ef23c7787bf57e2b309965d592e3268f6c7aa2f72b0eec5336af7b7217b43b9f2531e6d24c5e75f5056914f0ef93cc42107e91372088dcb893c3e2a68bae5bee8800207ac574cbffe489048cf671050c7f63bcd3112dfcac4e8e3c427967d2c8decfde9a977a7ea4597ad50d9669f757bb0a8088ebe3ffa9c0ae5e35ae1512b4f843c95e3705fa3d896f4bea296a5e5ed1b0767845d18e0828a3509bf5928c624b5889f5814e394617679581ed8bc306a01a290fde68f9ae0198d05f61d17220e01d5e54bccf2d679501009ceabb5dc654da746e9ef819348d9d2744944af6a51525061ea60d9ab2e3635af2458908beef47574f512f41412ccb797915162349f7212062ca10dd74e5666156a1b9822c8d3e4e5023532c5cef65b2e318d523ca0e12650fceb4e2d005dfd52da5890bdb2d9e2186bb34451308db0d576eee26ce9ee4e811a12269931e5d16ad1b5f8ab4c488d59520f83f8da0e2eae50c68c7a2e994b36095e7f626795fa9eb748bfb0ee1f9d52b6d6424670d0d933765a1cbeaae4f16ae63681a9d2a07ebe12c0e4056094e23e946f5c2b995dedb4d6c1dbca4c33d6383ee26cc4cfdc1a0cddf7220a0e0e5db3f5bdf1d88f5bfa2fa29c5f50af5f03f9affd1c986ca72e8df8a023f20bae8130ce4d432b916a68772725fdfe33c96e78dafd9d7e887fe284a077cd7a5ca260ca88c7bfa6c347ad8ba0e8be407ece00d46d886142a2cd8846565e1f3c0fd74df896727dd499e57553164a77c83ae4c96a51e86ae266f8fa7139d45a72d7bfa903cc633ed0003dedbf7eaf1aaeb33a6188ee0e6e1fb38536889561da9e89e01a9f5ab1e4aa93d58820fe8e943be21e6682196de81f981a334808b7a8d9b6ff55f799dd739d7c708eb61ad9aa6a4228893991beebdadbc9ee7528bc00aac0944283029b134ba6e02fd5835667ccd5cd7d643f7a30558961d4862abc1a61b9bc91f7d09cda3f947fbc117d70dbb529b5c919ec7d79131b0d5dc0f40d2ba2a7a105259d71dd4c82d5ef63fee69db279d934a60c24c591046bb9571b1c5c71f42d828447a4f54d7f0ec0b4954a5c9ac1e5e4d41bef41aadb61c47a893b4964621857075230e9c3e100a56d1eb282699d411d112bdf0a81c057d074179d255bf4412dcdb17392371f58fca2020192399035438ab5c44a9f5a6665bc074ed54e219b2d91fc99e4b589af02925b6d9e8e5cca3760fc3d4911ce8fab0507a0fe9b8bfa09dd86e02e28b63e369aa88f9f049c6cdac97ef6f933a7115e8ec3a37db7a6676fc242812cfa191b08eb321176dd2e5aee006e55b563a5862145688475c7d342674c6b9ff5de7007af14e53840beef87af17afb388f4905a220e1f3364e5a31129fa3c470bdef57b816d9f025ae7188ab71fed2384634d6dca8473a83d03c69fc0ed02f1a7cfe849b7dae0c1325cdbf1c03ef211c316f6005acbd89510303d5a0e52c6ea591e886a26e97e991ab2727c03a150cf30b29f966d84f0fb477648d94772e0c92d5faedaaaaf2b83a9cfd5a3b6cb8f4413b4f36633e298419266f678d6a44c42dc0a1d3c39bcfc5cd14e0fb4183f218b45e98f94b8ca0b83f0ab0b3f4ad241f6b8d805dfc311e582fb168e78bb633ec5a612c1a60766eec709ebc7c41beb21da49f002dd0306f65c4a489e76914cfd78f1c1086549bf4bd828ff4e6a3d5cd83716c0f4854bcd3b10f8b06a01f8a034b3c532a7c21c337a673977c0f6b0148c38e64766f13989450e95d1e1da43ffe561e8f31913a2a53b827f99bf24c0e905ae2b099f14cb0e0489a734ffb3105d13f867dcf993e20c1348592c1b1298c98d9af33f77e1344179cb4211a56a3bd89e06a3b25b782e8750f5fdc80bef672840b1cc0ffd4f3bb219ea6021a8141cd9a59e2c37757ed0d038fee1b437b9f48de11e05f5c1abc5e66c55fb3d82152e1dc02666361a3eb69043d81ec34cf21918de7d0c0e5ead24224594ca6f6fc30187debc04a018cdf902f530d799a7284f177bcd91259530148455f7b2b0a0b19fb94f8dfb7e9aa115e38007ebfb5b1c56b6f84670d52b98e0f8420025d9dbb3c31175ac8fcd503be12e5764fa0db6eecb674ea3cfead2581415fee5d32bc6ab17c0977277844f36b71716001967f34707c0ab59babeeb722ed6820899184894173bf914da0e388100c375730224ec5427f9b2b4b97751f671dfa58873a9eb4ff55407af7c6077726f3a5e88ba796c0852b759b728340bedb1045157cc5461a2b8040ffb15a8b281ea9edf6228781bdef194fd4430464c59a90eb8a4bf59a37e4f2cf126ff5e8ec23f453fff11b8e9d1c2265a3f98ffb3246eff8ccdd7a2c24904eff59a9c859e16ebcc44d823b6b4abd1c229bbb25f4340365ffacf1d07348cc667371c3c64ff775a4ec9cfdb9db3b9b7be9ba0f343e23b85baf75aa7d814419677895fb3fe3d2fab574c8cb8385d95add195792bb9b12ff2a06a7156c506ef54430781f1a5e3c591c2b94fd7cbb1b20d6d33fa3d66cbc69bb4f6e277cb854a5da5146269736a7b11c66838fc9f89443961ba27dc0a3b70efc21c62ebe8974c15fef5c14963a23630bbd3b2cccdafe523d80a0aef95e095a0d764d6fc6e48b406c5c481904e20a42a238a110203fc71ecc294f7469c706e79d0c69aa14e4958a6e96e84bb802d72219793b4c33ceb988bbad699743b71acbe5131fc50b67a4a0076a5d1aafbb2e54b367d4bc616153fbd10d69c493f5a49dbde4e3c8cb50c272a76ff5ab40117c81e3797e374d1588f141f33e2eae5e5d3ed2e1656497aa24b89c01175102b08d29bb507c114b365670a62f5e1cc333ae87e4ad0afdc613ecbf80c44960f073f256d9f6d3358c20ab194f4c1936f097eb3513b0bc17a2df0f62c5896a63b37e9094b7f183221e1ca176d0e903de70a6799585f01c4c860edb5c23b29d004d4c42f0c63a6f6422a347b353f9c32c62421e76c44f565ecdcfa99f8ebbf02066b35ac1cef7611a8ab5fd877b35c7f2a5b047c5894a49bf7512e3b740c0a18942d3896cd6cd5b7b1581c51ad2a3c51735cf930ee19c292f97881ace72bdd127a326f5869957913051307020fa3081ad4ba46e6dfd174c84d1699ea2ad85e45d4fb52c4a4aa65826c899bd7eb848a91fc88d1d5fb6bec27918f867cc980c2f47793726ac8720b9af3b944b39ee6017f0f367eec786f53a0f16bd1b22a12378b2f36c468add790c8d8a8aa0932c2d91ac486ee99288219bd90902f317312f431b1bd489979ad67eb6e01a10f8711b8de33621ee4c6b5c913b12e6739c337b7ee4c9da87a007e77fec7aa695db91404a2f50449efcd500d04c0b5720da00db45d4234ff065b0f4995e41a7694e294cc63e2d10d3b5ef132213e9e595d8924ff89e4fee66bfd2a68d6e8226746d8f8e47ce1efb9a8067594ffc25370265c323b65332a021041ee9b1def433feb83546c648fc025db80df38f7cea30f2c42f7b71dc3b3cfe910f9e483e3facabfeb145acab98ff1b51852f504a05ad919a1bec06cdf56c68e7f30eece623dfa7c663bf32673156c53cb87d84960dff5b7bc5e4376e6df08194c1dbfef6604607a29adadcdd4e735c893300bbc52c3640f061c8aed3d0e66cfda1e5e779d5b07d9075a720459a9260e82847503e888c98d979516e51c50d24cbf0a0a3e61ebf422d3d0dda047bda8610257544f4197ae374e04fc406e3decb4722d4c3c050e42294555375aa11691d3899536a2b072b9e6b0e84ab1287352ac301e685aa209d727f9c6cd8135d3c07dc4f1cd50c7b444d5097bcf7577cac20afc5623ad10e309a9ac14b14a02ec0dba65614d38af2f6bd6e5733d31a92e4ee87c69e9cf83f83119cf847f89d1c497a13546675c42bdfc160d76d0772d612ac269585932522bd40c8d3828b5b7ea9914c7034deef3208ae89aaf8a80842afaaf9a67ef1dcfe5faa9a468aeb58851312dd76388052ab633f2cff8ba8b838cb823c622bd0d69ac430234277044149dcc79cbb192ddad42e0892162cd1d39f1c820b34620f62788168c587040e1a0aee78d270d63df901da8b80c62a1a4874f2a2b9c60858bd08da09f6ab9412f9110b7c07c73806b936d9510d90a057266a9d2ddba0b21f28a3d4c3d43e10aafdf7acb7919a6b1ffbaac7ab92bf192e10d78ad7e2b5999d00225d45536b1f19cd850a8e587a345dff0af60a5c4296c8a19914396f41fa9c3193930b501e35bec004862650d09c35e1ed819a6fbfcfc16aafed24f451e1ba4131550ea35ec6844318c2b8c0a42b01950cc3baf68025606348dee96d827caac9eb1fb3e97353ed4bb8e94262a16325c54970bf15508fa0aa8070ff0a52b5279fa8018cdbc1265eb45a69bdd8c43521e7c0a58fed26ccc9fc9ac89f6bf5b084c417c58c9a022ccd21e39eb46358ad966bcdffa6f41f2dcfdad7bd0d0b161f44edafc5349a89f0e900a9edaa0a3b0ff249d0a136628f24a87ff965651a526de4a8a32eab42a5d815dda753016795e4e07308c51d4bb3c86521572970f0a790a245728d4f7d8c37aa35e5a92e076f5374f7867903edbf087577bf9dc8ce9ddb033da8da2492c9b2b7b13cee23a42633f337da5712950ce6ba915f3c40a0aa986ac74f44431e93abb40e88ff9c9e14a2ddeb3955987a7f5e4a1984bb46ac512c1258590bc3caf4e41ee2891a411b3645185c9e9279803b99945f85a916dbceb7a554c4a00b3a34ac63b6d06a7fcda8d0b17c778978a32930b83c1059d28fdac7ab39c64401098ed18f8c40bc8e3bba3546d8401c33a35080a8d5a1fc77e93ec564a5454575181b1f454ad1d0134357b2186c308a9f73299e3c7ec87755a6fd3a236a62115fadeceb6502b932cd99155d02ea962d37091e16cc89f6eac29e84e5a9915cd216e3e8b87ee1047f2e96b17a01c7fc98721c6e53578a6cec7b4c9dbb46443b5db2a73027220d692acad55d865217d888ed570eac1951526a137c0fec4612d224a993db0036a001a00e26ce557e27a0c068085ee2254579ed9ee4c0e45aa2eb1c4c0d41a168e44738d64304e736785ed71b80d27c510b893e21e00bf567c6deb445bbdf631608e32030b53b89b0a11121fe626748e75105699004c35d5dbd4ad3a41ad1fe4b53e0a882e1d9a34d996000972320d11a1f294a630594e6d7d22cad610902408172b325f785fb950683cdd82d29fff8aef886895e9d727acbf6a5d560cea96f7daaa64259989c05e1085a51b2902e557482c70052004eef9202b0b687779b22f5f0201d80e42dbae263de5f5d3f2611d78b4a337ff3d5f157eafbeaaf5afe1ea603f0e38f2233057e37f9a86c1929948436fe885aaa16f1f1f59a8b30f11ae9357fb5359b0cacdb440bd878b36dc675f976bcd03035100f07281ec9c8e575283be99d5473499e9097e4a43df1b6a8c1bbd58695756ed144636f9de0177485a60f43d55ae80dfee9f6c99a5196c5e2a377a4d13e1ebc41a9478b15aa5bdd0f02fc1ead9432a4d3217fab1f9a7269522a84045799a9b098183efddadcc604c427ed9b717d1a850f6e8ea6d5886a1e138ab5d4155e74fc3204460eb40afe2f072cae5274dcb46941b32d360191b464c008d4d459fe7c5a5218c7124faea3a882af065055e1aa6cf27c90cb42dc7a996281c44469a793160833303c87af09a4a8da4259e5040955a4d2fbb32134300fd2d4b6fbaf9c68521468ebf3ea015efe540cfcd97b6e21dae970fd2a70c8f72cd5c4cc18aa869f37e23b1dc07af5fba2dc5bd75e8f222b49e619355d0d2a32e52567ab4b1c6c4800e46695079d7cdd1be39086099759f36420b35972280b524d396335259614165a15f3090968be6b86d56ad9e316c410e2700e45200175fb916be22585ba53aaf13dda8e806ba1dcc1627099c88e04acb5efe57338c55b76e6001b7c87c32a106e9a89f635c98c926652bdc4387afbec011005cabdb7a6865518b4ddb1fdae2542f5396bb0b40913975ea2dab42bc77789f985f7af2300495f773e8759e57add7e84a7f52024892b519a4869a2533ae13d161f742bc89ea8ba9378a0d205c3dfd10b2ceb66944525237ee92e6dc03d8db81aad429de87d4cde9db6e29da248a7d483804afc70cafa0d0da231e9ccc2790ab2f0e0ad2ed4fa32646ea350efa4d4f896f7bb2f6fc0cc6d2612d0b398ea919d8b607ee626003b3c3455d1137d0a7c1cee4d00dc9f006c93ff9c2fb7053d2acd607b7a42f7264c33d8194c4cf230107c81daf6452b3eecaf89c60c33f1d1f1951170f7c045323c7827174f6711167413407cfb96ffe02853b2756d69a36f99a8cb08a956e8ca839b636198a3332edafe16ae81166d6514e61eb14345172bd1bcb3b40cb369cac7858e5f700522e7b212ccaa3c02af096e1c89a11f8bcccae8f18e9b3d3838054759465e8cabb8895484a9630d568433dd810a471bbcd8d2e559095b1ffbcda3baa57fa2e81c43a14ddb81528e5cc7c8cc8367e52740f0b111763c548b1d6430028f9dc106229f346f6e2a025f639d824e05ef7ab71f45c202a3d2741fbbccec1b2c6d89a041585f4f6e397f062a3b012328cc372babd50bb1675ad82e0ebfb2848b46e982721169804765e3b6cda76af1fe42bce9b811e47d117b875255f822c4fef33bb6982cafc5147917819c563eaf18d7015823b8963f40abb6eb6cb04c2210e3988ea603d842888532e716be553bd98b2ca558a0f0340e3d6a3a0cf0426a35085f2ad52d7ded52279598a5dcf4b39b4d21415b808d232405eeebbfa862e6fe1334f98b44604ece02498229049be08a4d2fd46e4eb923e9e2b4e2f71252c610bfff2904c28d180f74410ddf9d697e8d493b6fafc7ce3446208f8a172c859556b2f46dcb6cfe6cab4297f405a95f7769685dbdb476e3a41c6965ee260e69749b9e034311addbe9721f5938d98c6f39ec3f8135a06d92100b228c075d91c1f1628b681695c7209af3cde0e52a9869ff6028cec7e78f7d0dc443fd5c78d90cba3dff8c5a95878487898ad5487c3175f8129835e2aa2f21b22b45499cc5bffadf05fe68131b418ffa764db70f5804b7b519d90926ef95e08c8fc01d02a921e1d1f34488bb707589c0e2664b5bc6810609234fae3da1c705368bc0f37aa7066bb5c3d526c84f14d40f311d7000458da7cc22f6ac64cbc5802c1fde414a8b1d18c3b31cc442fd7ee906fbd0fa868497cacd59cd902ca90810a376899a3124a1c9f3762ab18dcc96c40881cbd473aff20c1643054ca9d6600cb5439d0d561f4f7b41cd41e743105fc254bd30f911f869bbbe04039303143af89627d4922d9712629698884522957a8307032c70afe4d17e49d1d5405c80a62115b9a03e1c3a3a9c9a8d635c69681f87905c9b0a9dd2106b91ef145128be573c14032fe5918f2ee94e10790a0111a9006f26ef9c0a86d3c0bce3aab1561981e5b7435d38544431914afd0d034768339373238d92015ec1ea221dfff459eed17cd8f68e30f4d4c71bb4a47745d3560b7f987874f55f31c22f9c305c44ca95f3f492244cc7b9948d51b4b27ec96f19c42a9ca56ab3842c5da1e5e032603321827616882a9da6d9ee7b42def94acc289685a70935adabc7b8ea756d6a48c521b15ff5f184cb86c3305bef0d484c50988d706bce71087343c0a3484da568501e417627787caf0a9a4442398c35373aea60e1b42354884e0fa18b31ef05454bb0d2cb3a6a2523eaaa5dedc6cab6f51ccbeafd42f46016225c940593810c722cbaa0804634d3f6dd6537d3411a6a0a0e2a3a34b6c56765e267a762813dd3bc82c4fe1d551dcd783356f19044e17565c017b1d32e449d5a200408c906d426486d9f0e594085969a28a790b07071166e2977be436ddab421a82cb8e01ac079871b98ee936480e36215e0ce3f27bdba519d78b3d267592fb1e94ffa0c6096d65c99261e9241102c0b5a6143e2f38dfeef7eb3c828b2e5a5d33ddad1a80af4baa6ca76948bf90409d6d241e27452e966798b0711cc4054d7d0eaf2ec8262ba2ac1d59962eab1f58b9242da3866b4371d33e07a22bf0944bd703def8ac22b363e5fcfac74f8479442da7194840fa7961c4ff0a74cf5bb910aab1870f333b611d20e78b5a51dd9739276624e36444fb1b7d0a0f90b302f25eaab4954d384766c00bc3a5d0ffe7de70b5955bea21d3a21fb74ccc79d26b0cff570189d30a21c09732b6e767676b8de4ffc09f0121ac035f913c9565569038005609e1d3b6258778d9d9314ac749154b926acf1cc12854507fa924e2032a2ba6a5500b9c2d1c9d45c806971514cb2361fdca9ebec1144a6d6119244183b6db55448ae0d18bfbd7e3ea49d11fa2fc0d6148d693bbaadb372f235b9019917aa98c1a2b041cf495d76423c9e95972ed46496012a517c2a444af320a2502746e71b62f5c22e80fdcf9e2c90503c883f27c441932dde0f8a2f3c8ec49fd8c37d02afceb0c3def025652c8791210e774032e491b83005ac7576abe1ab6e79277414d7c8d80ccb33b3182c196668c5508b1a7e7057aafdf847328ba414d6852fa4ff7a8190b81d8adb2da65678eef82a2af9144e99abe218b9010d4a6d013b4ca79d873cc136fb91d9b73b2ab8b629b1198a4baee5bb1030209b9a34bcd0882d84326004645b816545db66b9bb00a0782a2656f4dcbd3ce141abe0a2436bbd18353a6d4da24d65b61fa1b44edce5a62bf5d547373a0d3e0e67efd1e10a028866dadb476d7df93088c6f3690944083f4a0881a076613417471678d5dd93254ee4cbe462dd65095c4c0f3f260875f20550678695650f96d2ac70f7292ab57de002902802dd956662dbf7712339ea0745e8a99f9020ced3d2d9314b51bacce83d4ddb2d11085436c701cc656163972b6583262cc29b9c600b8a6d191382a18367f64f525f40659b82a2d04828f088dc2f5021566f4f70c1515a4a1181173e23546b6700350e78510e887f3f93a1ea8d26748122e61c23c8e1e825c6a8c61cfb306748f32a2d6e48cace10ef90311661ec4c0a6691bc61260b6f618f66edff171b680c2ab6c0280f2db15ded04a2f51958081dde92c33a60743a8ac120eb10f6d211d5085703166e4157384649aba359e3da91571ab2cd7c24290785d9ed2dd2095479524bdeecf105514b53a3eb8a3725d91e163f190a4bf99e23e578481c04057d28f43c7b727a8cb51a1aaf6fca3ff939a3bac072e3aadc9ceafae2fb6f936e53b6d15653e20c5846b8e6b697ede37b958dff8256d9ed5248747937f82d29c0220b074a71c7d4aef6358fd99d824c542bf28758210f57ea7f575146ee5d8195c92109e56c36d02e03ceda51e453600889f84f866417aef0f08849586aa10ef30ed28844f8a0b656d7c19d10f35c7127bfa973a9c0d29142f05239b86336cf9b1f6e9d3d51354c3c373ca63a9340379d31656d00642169c41b9b2b40d322a7fedc5f989de0135abd79d49324d64ff8f70a910829aa7ee538c340121dc7db694efb072d30a08fd445b329e4fd5287cb81d90bc96296ee11811e06c7fda16b45d3ba2c24fa19746fe8baf0fef613984da221e986feb418bcd048a522c1e7a010984ed13ad710ecd0caa78a81e453db0cbda3d5cee039fb713a2304b7c9d20a79a2aa0bf4b169af4f4d860cdc6692e29294732f893a4c28a05ebe060621fb4493c3a8a8bef943c66da87c2eb9a6bf290305d7a6c9c6e663a7acc85cc2c8232e9923263f55c9e8db3b191c70b814b6fa762ca6b614675145d4f3e991e9824f6a910994ccacbdcb348dc81fd4b0df1a708623e8fa8ee2f5e18cc378913362fe04b842731bc9c66885b0dc9a1af9de585d2ca708164fcc264d3a836f0f52ab2a9d61f0d6b58bd5c8a247de294f844f3a3b1f523a1e1bbfb7b67394ce932a28a9f1e8ca4e8a820b719e1ca238eac75b20ea33d8132d094be0711b8d7f87994f67a4a25d046039ddf307a5b1cc386cd3c907790773b33389f78c5000911d022c783b8eb16c6da19e1d316ce962c2b1f9243452361af09700ada8fc0bc066b6b91f5e4b6892bec5d6b32f3e0446dbeca0a628187e00c60530e0e28e5721371db0ca9f2499ebe8076047226f30e381e92d1517a551a16da39b108f8d97f139356a2850ad55ca802c9368e650293588e2bc91c09d51d34640aec13b6abefe1d8019f2f9bc370412de45fbae9678e895fb7089b27a23c2f15b638be88c3685fa601ec5386a457a2d9013aa81141c98405492524e654bb7cf742ce6c2ef3095b832f51cd9f7c9cf1bceb2c05d45f0fc657e5e08c8829162545aca49eefb0ccd4980b18473ff0c79e552b8bede34050c7afbfd6efcee198b46b9b3ac4906e0b404ada91fe052d9aeb2ac694550aec3cec6fed0e2a2a7613c336149f734f26f40d750184d1c09db04f4297d847e7580fda303ad02790c31c1050672f4405476a08f110f06bc0e40c2572ff9685f604cb6dcbcdb4eef8e5c49320006036cc56dce5ce0023b2df6eb6bd23260dbfb9d5d258c5ec06ee86d462c32b5378ae98228cda0f9f68d6239609f1b64fd41993cc5fe0b58c916694daa60ae8a80a979e33d74fc3f63223e57e6edc640b0cfbc7f5a37afc8df49ec97e780cf5f3af6d724f5a5ecedeb185ed006679254ec5b977a4ca768c42500e703fbdff519575ff7cc1a4124f6715513f98bfed18f2442d345bf3528053501fd0bd8079da7773be831f63fd712a2c9ef283d6f16e9cc73b72ea8995f9c926b6db23bbceaecddfffa5f21062fdddd6e4e34f397f8b6cd33ffce5dc2d91ee559714afe52f48f092523c017f2db60a78eff88eb987f24990a6ad8180277ed2f384d3948fa92f7f18ef23250ea94c8a7b0b6efe0788ad0126f692234f0a0480d88de3f3ff5917e01a79fb1535f2cff8bac971f23c01cd042d6768ebebca0cac9e025f29bff699a6f4b6e66a4efa519dd5c5812b3f2bc61efb098aebe32ada6d46549713b4556d53cc127d92dcb06abb151fe8c6aa852f766efa5bbe5416e1c53be1da7cc0e7cb9ca7382dd05c17e7cb6ffc7c16c2583feb18bb1d5b2c60b0e158b70b59dd1bc136100e8ee626a843f44723111fc5720078afe67ce416050f6d179585c1e190ed05e0164661e5e9e40010cd4515cffc453a9d1a02824a33298a8fbcb9edba9522f781f5f0229b99b5d3560796d8a323e048e94957e1062073a12d09754c93870feb4ba63008b3d55bb422198b1b80767a57e510263b56c8b95d06079dc36b520f07e372fa00719f764fce1bf160ea8d1222a378d6331d0c7ca4fa8aed8048f914d37fe0801f539120944930f91270b1e46307b510871ede0ad07fadfee8b47b5b3568e113aad88d90305b7aee0c655e4ad87864b555bc5d510df54d143a07f6cc8d5467eb72cfda9e7e03324a154230b2965e4e9d3c1ee49818c72e826c987e95e43597e9d0ce4e025801e37a9a895d64e607ac9e6c32770149cc0dba27769e20acf71331eea9aea963e466c401eef244a99794b59a3c0c1532f8afb3ed999f9d7f3fee1854fafc14e95358c38d85894002bcbf2ea286dea6fd985d7395524fe57d4ccdc948c2afefa88dd0e5a523e6a71a97c7ec0132514c753f107edd0f68dc618f203d73311d20fd71919d648fea4678b8a530c108a1fbf83ef9f108eeb001f5d9f03e7300cece8a1d6f0a2b99eaa523dc69d405df41f4e65bfe16feed69a9d2b7e0f55d67197ac1ba020f155e58652280a1cd42429e683b41dc2d571b724761dfcf015328576d9342f5e8b9808e36c8da05119a1733dbdb5ab596562bafc1b3f66e07efae8593d73015dafa41d824c21225a71c2aa4a22943278648325158f6700422f49db89d17f3011ecde2a299a915004f81032251a8a2824a7a1cecf732b8827d927016319acba389db341419cee6eef0e1a6a982980c7127d45ae1e448e30053015c2026f922a203e7f1c16b666a10e04090492c48040c1144b877661c22ad8b0390b6d25af4aeeacc0b59b769224efc2cd1d5bde4c6aab9b8045161064567e026599ac73c22984693d2be3e4407fa70aeafabc8a4a3140a6533c36ababa2652c592c01d04e8e96d418b348ce90337eed57893178984d1e3a05f1ff22c93d2a44ca640397c88b18ef9372f7d583075b4a850a496d146c0ceb99653062cad46c3b97107c335f099a1454e2c43c78d29f0d2be80532dac68825010b711ab1798eb3f9d463befe9e547a5285b01269488131ecc3b0da6423429aded6dd3412e0a26b31a9c534505ba4afc0bf3ccabeadfc278488ec26104d6c2c3d56e61a78e135f628a02bb7a019776cff48954cc069c14459a44be8495167e968bac443217508d518ffc64a7a1d5029715b28d14664d1aab842f9b5a6127a5f29b8bfaf1ac93926a479f6a353df4795ce5df38f3db394b977a0cf8fa89c22388f65e7087a4c767735a808b1d10ba7f63b8a3fa6eaa77d610308bd67485d3e6292200f78bee54613319e73768641de3720216262c36f023588b52c99c199bacc2bd917d0c3edb0377252f271c4be5f308947304542052fb5cf12e122ceea2c0e1154ad1e2b632c888a001e43051211a43878f676636dcde634a7d177ae3059bfe97c12c01b8155492104d804da88a9223a842572653c6254784e7b306bfb37fa9e06ba50deb171946eb22d0ce50689fdae957058d94f13e9ee3dd088fe147046052ec8a8fe906e4f95cdf56941eb87d40f5ee519e4483ae39e881ca9a023e33329a474d2c9dbab65678021dc0e35eb7c66261af7878c28813e35178dad11d8a168f49de4a5fa49a4ad38d3bd8a0e59dbec0180ad06484eb9d628ad527eaeff4def8150675c428579832d0fab04cfae714faa46d16625617b03e59d83dbea2ad74ffd8edadaa256af86adfc503b3be085e9910c9fc6747c6f03905bcdabea4b8700fd1e06653825b5690111079deea59711890b04bc380afa1e3e102b3072323ef4c47656387ae418253106fd8ab15a32f8966e1bb3986770e38ed4f6270b84c8a68830c27a34f6b0e7c02ecdbbd7636c494ff9448e7878cf7b0e30adbf07e4ada2c9bbd36ca4e6228afd1e8891cb8262e83254aed66fbeefc52ddb6aa783f081ff0f2934926e0ed2ea489bb8e733026bbaedc57fa83a978c9870b06ab57847be673389bc2843d2a7a8daf8ca838d35fcf738bf008b1c48341cadc19b9308b3d1fe2ba6557779b81bbc49cc85a1ece018e2d2b6457bf82e3c27a8c360ba3915900b4605da58229c30e3a04c67f52f93419bfecbdf753f77433f357db9c0977d9ce54c214f962bc0544f3d549e3339c729d4268b9a1e33d5e100032dfcd3be58f703ba9219dad9b3ee4f5487867876263edd710e01298f2c7a94a022dd995ce89c72c5ca5cf97b81ad511e6e69ddd0b9c499196fba0475081126056f9d1c2abe98896bd9d974b6b2e842e8494330ab7aac241f2a267c6a728fcefa5142fe270503714aca91de8c625591adfb1410f6e617d1ad1e3e03cf4407d2f6ca87a9179a71cdd6494d8a1aba3618034edb85ffd1a4b9010413d1c15426d18329400cd9b144d7b37de118f5e8b0a794e9bcc2eee039e18cf964a22bc219fb64e2b8bb9425aa8c4efda61c9c070e12854ad4a94adb90c6a124c9810ce09356f255145fc15ba60a98e50d84dc7514c0ce0b77c57a4c98321e37164ee16fd4e13288ea4c20aad5361e103a372b9aedcf8ffa9cb255742a0da7be479f7a741a095aae104aa768c68f468810da4668b4be06c9535e4a39e9b981ed41c1f218e4a2ee4894b4578e883321821034aa8ffcc2b51e8afd9b70811567d6e975b79d440df0f23417354ea0319e3527c86648bb2097aa22ae23399592562cb345f38c11cdd6a787d35b6a62d88847b7a63815e0b05ee5d7b60462099bd1ac197ada0900b4ee930d3a3c3b7ae1363112c4b6a2885c99641e621fc41dd1048e74d05997a320b5c30130d69b447e60887a0eae5639c18a6ce9707633cabd6640f68233f285d88240bf18603c871f3abc5446998d86e741be0168037aac25798bb460006e61543a2fc55f83e0f35c900ba623f3dde48d9737a96901e09b7a0928bc843eac003883f8971694beded2202b95a23df841dd20a91459847eb91c0dddff200f4231332cc426fb14ac85bb604313aa77259718cc73a874a9e593ac9e172b6431f8e1897c4809d83d9714e27f69e70f80dd159200ed97f9292420708f003427a3be3447b2cd82e0cb2be7872fae4f470f708698784271585b31178454722bc43884a0e5f0280eada5189865485c7a0f4fa35366996a7196848735332f886a29628db644883b1753061b53bcd1764af1ce3ae04dfd65c312ddc6c0e2a94e7e6a9d4f742c48014eb06cc2dc56945d844bf82937d3212f329a324c835c88dd8299887d74596ce7d016192140c2089dedc2c721a210c441ef83e466c8a8115e0b92385222fe4ed55235ee58cae8e6961c84a87c0bb19b76a633d302c2b63f603018e6a2e2858194d9ea3dc203f5f4b57bb431df90a8d5ef33271f179fbf79643867593a294c6fa32773d9dfb1d7875161272dba8c550d7d5ad95be01e37599b035bab97370d94300bd28514f62a4c392b6c961d39126f7b06e7224c9f532c346b192e55e0537eea5e78fce7b798ccb09988411269f4d0ccbb08dadbe2235944f10f8ed92820105ae9e8df579635e221b7d0f8d810feba867c6e0c32138829e5a2b19d2cf1c07c493d01757ed777c7d238974d2aefa60c606f1cac5336c15ef72bc3d65b800e4b1e744ff850c0acf175c4768e93c799e34ca33e7ab2f412163e1c18d68b234ce45d01eabfc4234f809c4dd2019fb155060837eb13311f34d13c0a05c2cdf08da2c78a04523742a562008eb9aa3b66daf63744c2f66faaf1c0312f0695a9b6ff58754fa88449ab393716d5f3b3e9d9ec3ff96dcb24650a4e023e02f70124eb916c596aa5149da61541a198501497d6fdf0e2562baf94d810c687097208cf17cfc96808284224d971a5498c517446fe997ffeb9a92c4bad1805e889f12d31f2622ba444d11185113c8ca6a4c2933eb7bc21ae6e5ca99a19afebba5455f55abed2d5115c3a95d2a9bc92210b9eece2e70448e6c9182235649ef458d1344d4b22e50330586031410e8932466ada162d49945f9b5cb157bdaa5e818e6109af2382169ed508e8c222b7c598719665599c6adcb8177a91d322d009404462508850eca17dcca093992993c964cadbda51a055fd7fc826d3df1923104639f05021892c603a95b64056964041a16759b0b1199571c5a0f12a80602206e859fc6b13cbc4583f2eeb7080802e744aa94989ecfca45044208490c8ce4f6a87488a48a67ea07f768b51103787ee0cedd54b4dbdac59765dd985c4941fb468b19a4332877c8405cb2ccbb234ecaaaad73f1ad5c595f009214eb8323533a3bcd06966d1c6911a78465120bc727915430fa508fe22d873e503305346d01185a8cba51d5a7bbf4dda4068fd149b69d8638caf89884b94273689eee8c895999999992ca4c25783da1a6b57a74657d75463ed5a355b93daadb12ed385ec9af4245d279407cf179f2eb42b3e4ae24af8fc33fffc1362551633020e014ee831c416c34a9aaeaeb50cc332ed8a69260c531de6493b6a52e8438b2b310cd39e30dd495d3a15b65c78a53d717d8fc3db8776e143aae7a2ead317fabeffe98a43059d748a5c4842853e3064d1b26fe41b11a1f0997fe633efd3c5872ffa1eea42707538b00d64085d8de6dc40a0300495549399aad2401570f7fb47d9a2db229e6509974e15bb543c108ddc1623c76d316e5ce4320c53c7b841bf2e910842224b58197dd19ef9c7ebbaae4cee84425d2f4dcda065e11418474fdcb6fdf777f7df4e376d9916b785dba6e9b3025c71a8d38acb50966559ca9d501c4a8ba788d2f9ff73bac2c3325ac387041b2556b4c0381a4bd1c4edfaffb198a915d548649eaca69a6a265303da16356ddba2a6c56daf6dc722b6715808078be450087a24894eb575ba99b613b76dd8e9a41b77da4e99493b2911dab66ddb76e451e1c57615a863e368c2ebeca45227dbb12ccbdaa9a293dab9eaec6c9be670a81875aa54e901c255bc3c2a233674449139b72c1206a463a040f441ef308b3cf3cf7ce6b3022316585b62a68cda386284cbd8f8a8c022a948e5a05dc0108ce12862a4822229232693c9742d528191224680fec322d72331455c745117a8d7fbb2d9cc552119bae1ce1bced0cc401a9af747f318503d98c119a8dae08ca5960e355a0db46454091786fe9e6559f090c6facba795f9f2aabaa13f55ff3d8bcfa2b6690d0c3e98f585e84b5928eb3253dcd086ece81f5a96691afd2ceeeedbddb7abc465681d3aa47f56860b890f1852de122f50ac94bc5c37544a07c5a5442bda15edbfffee261594e6a44aa51c881289a030e96e2a665ca1d9326505317a4810a3841515206886b1888c774369475daed24b399dd541125854e85450a17c9f65d91957c2e56922b39874aacc8aae68f8228a5714c5116a821abd700d39b196c83ff3cf3fafe761d25ddf70c09d61ea03b0d4a44308eaf0e0a6a60c05dfb7fbffffffdf0719eb9354b66d1b896ddbd6c2820b7081890170c022b7c598cffcfe9999999999af08c391b66dd2b4e5b223cce5557713326dbedc3cf041971e74c6d2dd3ca05d76af4be825b7801a166aa9b98bdadddd3da1563954eaeeee7e77bfbb3990c2d8a061db768fad4b64437b8b9a9f6dffebdff66e9153e231266df047cce152c54eaf2e2646d4594d1c741b77b2ed274268b807114c5c499b9a0a90e14adbf6c69daeffaf10ae3adbb66ddb30fc1d66a5ecef855ee8bdbfff85defbf9f9c9b4586b3c78c8c87defe56a6fdfeeaebff6bedd23b1a58585178f362e181f83f246c965d56bda967ee6f777ae17578861d8d3320ccb344c33c11920301ed2b66ddb537cc377c01657f4eddfbe7d2d1be6b26ddbcf49d02b2dfcef773bfefd59fb6f5ce4b42f7c0edc921487dba388b46ddb76d0a31557dab6cd0308df2277040d2f48c9c37ce69ff9cca7462e268dcab8b4775103ca94e704e899fbbfe7c1291d6001af4b2482308baeaeb92dc68d8b1c56da32ee941d8652d8af1663c0dd10122f109a4c59d619318ec6686594c615e607eb3222dbb4d3b571a7ed14374dd21687be11982b4baafafdfe7a556bfcfff2dfbf7f87c8df7b2febc2c83fe41394dbb619c8b695b613b76da6d389db723b95324e436559b66ddbb6ad9550811caaa987cbab6e23497575fbfd5e083490c35d1f60364afc6cfb5fffb6b709db7eb6fdaf7fdb6b4dd3342516838536971fa9b81c9aa26d5a14cd7cd1a58a847a84cc13afe186fcdebeb7ebb5f7ed42b8bbbb5936c7530d35e84186290b49dd7666e61ee467dbfffab7bd517457ad98ddf5faa869f73b78e4b812aa669674d7eed8618793ced0001e0e7403d5a3615900fc18c7470c956c898c8c3b9947ba79e04119a87a5006d2c8fcb8402dab01172e4b06662703c04f975035b3a44bf802e8debbd4943e6e1e78167c960539e8ac985d75f9a37b3f64a0d2bdddddb5bff6eede9a6601d138bb8274d9715b5472a9a28304b9ea55c3282086d2337c7eefdfbdaeeb7af77b5efb360986d02b2c2e15f463a29ad23a22d00562483e9020497a38f195d29e54ea0c7d60b92c086ddbfe494a2e15a661d97bf61980496a365ab7109a167ebfd7426f7777c980b6113d0c1a1a3bc73facb7d79b2f97cacad97d066a32cca1e1a2d9c1a5601c430198dc9071a5e1cd972ba12f44e1920c75431b7a6f3f82f5208f2457c298265742558231e4ed2ed41312013b3355491a6cb0c03750a5e9b2aa9b5490ee753729ee400c13e8f286d391c08d61a89bb9491d26d0a5024fc54197328e61a8b3c03f617486db95c0300e4d6897a4c1060b5cf53e0075291c29090d8604f6d3b2ac854b85695846f3cc905cf9b40c7bbbbbfb7bffddb531ac07dbd8a44d3027c9a582a69261c9bf6ddbf60a89039e5ce91e506cdbb66ddb62f4e0f9fad862bffbf6ed7e1f9078a8646e1e3d238d2008001318000000008281401cc9e23cd104f30e1400122d5c306a543c3c2890c4031171248e86180cc22886a1180001208620c490720eaa3d0770a52fcd4400be5bf302be8c925b248134d1a380b98e87736b0138b3064b3806defa2b9f5e107df650ef0264eb3766bda9d86112a0091e2588eb7a78b796851a17c35344c0cfe1a0c1d2a2011fd61b240411372fbad29c64362963ebc20bd0098e7e6701fd623cf1bdb516d1fcce3844c865f0b1a8c5bfcbbe9630c0ed36236ec29d678139ff6349420ab5150c4b58475587abca137ee55f307eeca15f33eceb1dc10873e0326be058fc23973d3616d79a1180d09e680457d87bdf5d73a7cb0bbd75795707cf02a063002e80f334b689d15f8fa631ae80c81fd5a30ac8d4ffd4b47577462a9521e29992a36e543f39b650bbaf3f7076be95e3f5c1a69edd0e58ec3d1e8f6519a485d4a9dd905a52a380d8a59e023f54a56d4d800bbd4d5b8f621fae1e96acb1f9d5109aea950f03f9a8bfc838911b8de83b19c22d5440d413e0c1bdfc94c39c3dca6d567ee906106678d2f0d29a691f09d0c23c75f15137d9ad46177afa7853fb1865f5e8d371109874ac785b72b023705e008c613faee22f607bea71b9ad748685e72904d34eafcfa015ab9d835effcd32f8d6032d6db962a286032184828c9f37907735ab7a8ae7c978049233a8161894130c4433bf47e90b6c0c8ed490c1b026b67e557700b73e302a7f02b02faf2904dbad7c707d9975ac593c8283deebba4331038e22815be51ab911531c82eb961e5547de622a5ed89c5057e32767ad845ac5fca0b2ebda40d8710835ee990a086c2db04fe4c8e87ea2623136c8c2a2c59bf17ed1ec7a8901b3e66f6668a9947e47d1fe2a255997bdf6bfef39150ec749e5676aacb237f25071ce4dde75516b7a7b1a95942201c745ae815efa525c54e41f8072139230c2eaab421a1ff64c0774b1929933347320533a708607e2db2b97aef544abd85cfb1e91054f71cf5cc6700ff43b753ccf696d26a2bbe0347e5359dcb7e887f19728e93b21ca45eace354ba2be634382a1c52c54770b842c5767781e3e92004df42820a6e3e1dcb21c4334853044bb90f33e1912fcfa53128e1c508d52040fdcb91f900e46a0135e35e919bbd003f5178dc1cb4b21804a41c4331e4538d14f5b6a9d6b40a2717bc7a2af801e92466f3a90d96c5e84a5e71ee4d9692df3a517d7cc734202a878ea3f6293c837912308080a0a4413062f3d2b84df89e21b71840c256e7d2c07dd076e43eada4e98d8a07cf217d23f3b14431f9e3745d71b7d9af976c8be952c636c7e15cba138e4380578f13d76a45d4cb480f447c8055ead4e5586c517a5f8847a33a088450fb0dee3bcad63a1c6241b80de1e020c954203326b1c5a13b4fbfccecb18e823591d2404d878432a538f4e73be2aa89118fa36b2078bc8c43590721a99a83460de825f08ce6085ec8789a88a2507836c6b80ee0843d49625593c4b183c978cd13202764cdfc7080e5a7009813c2688d3d2514799b484fdd4f19b50d0e8ebd24a2f6abe52022a1ea6b503e6d681f17a5365aa1dbaa9b2443066b0d9bd9f55400e82eb752f71fe86f9b70f17863b81c8cd0681e174a19af6788d16a86da8168726735632611d03827ea5c4c73719702a85a4079c3ed5fef82697469e2cd1a836112f5c1fb8148c7bc90db64e6dbb6c01ee7829477a1a090fce53d300b6f725bb34c129739c27fdd4b9d01b7672a70d864105b1b37c675a74f9e1efdd2a566f0966d3e1e7c9df58c3a85fb7ec53f304a19232e39ae4945ea7cdadae261c98df03a37d4caa3236324c620494102743bb918dddd7ebc34b1e5815f0a57b331f11213e63bf25804e2132213485b32973b86bc20732c5093a066c1ae3b4a4ab776a284d29ceebb62fce608073ea338d45a0560a645df2c9a2ff714f9a9cc7c096fc030cdeea7fe9c9622b700e86a7b7cf8280553c2b1ec80270bbeefc232840ba8026601b4fa33d769ca9feda30b5c3fd793d0dfebc610251809a11e702388baa562fe9d53968f055700d51f570e54eb38194fcd38b92b461737825a6921dda83c79fa307d07e48793748ad06e42bb47c350db42694342186499dab9e4baffb2e13d13956e155b595fcfe38cc977fae04e42707df7f58ad95abbaabc8f4d6b7cf24294d982431ee23cf6925fac295a43463d63ce38822968e83d8139b66f325f7607c603a7ea3e96efda5adea872bdce802d187a42af43c50b5f0903cad91fb3db89ffbfb1b47be8553120b870a5e620892cd0c855c1365576d6646a69a1029160411fed6327dbd3f204802017af40820a257687c34bd7e2335df27ed7d6c8bd3d1bbf52905aa43f4a80e58e490ce9d0f29a5399c05dc6c20b34cae6c2035204839e6906776066bdbd1001bfd13fe5628e82424efd9c627a91b16843affeb3d4fd4692770a64aaa784543adc6f676a771dc20c43a17bb90bf92a1270961945598ee9e83be1e6cc1699336345bdbb641b91789ada17ba689058a677d8b876b23014071cca525829a6dd630e2f8595101ca6e05cc89fc3fd757ba59b74e033721536a03981641caba8af63d3e3e81a9d82f8a0a0d427732c21d7014db9e10419cc579e7dbe49f0c0ea0409007091ed4d74533bd1adc4f73e0ea0c6bd0d426c2f261290c9efbf43e735864accda756f916c10534482ece56ccdb03eca010507dfcf6333ff14f49f8879d08f8ea2a86231904dad8fc692606b1638076e4a7809b469a1dde05fcdfd550047f0abae6d0edf8c4f0224183ee942058f4a5b3ac42ead69142998c763be85b6c712e6ee512b8979ac9902a8855e25a55544be72ca34acaa7ba6a21955d86fe8a0902a120a279b67123479329e0e34e4360468d8f1a2d0ce4bab65612cbbb0c832c5443afe44e61087791327890a40644cb9608990a310630c4fd8c80c17db9b0c0dadd9022d7263820f4a0605ad1cc6e2c1e0bc833a37935f452e739d38c0bddaf0c9a2c96e24c58d14cb673e28f9432b85ff6db13df745b2b4a4db5bdb1da82376790d855435cfdd35f240f8ae2dee13e7c25f240cbe45663e3950b887460e1ff35eba88ce5c05aee075730539b2b1cfdec3f99c2180c572362192cc0d33ef9ad289a44aba828493db8dcdbd32750d82f52014dcb7e6889ed1efec4efd3cc74c174e1405de971102085bcb9c16a2cd589a74d11bf51d9a586c619d9fca533964144a89e4d0cadc147c3e159efc797c19d35e1679f54780b9c0d7345d72bb7fcd192eec4aa15590502b49ece63e7e529b1917a13e48fa78e352acd2c64cf0b30d345ea835de1d3f41630d8dfd37bd065bb777e291951f8aabc3232b9940370832ca3d14ba131a876320f9297b9b7ba05fb63d26f838c8842b3a9e122c5c8d5c8f3d1149a53ecb57f7c24015ac1a384b8ae8773637330932d1cd12e62be92b0485770df34d939a7099dc78071beb7cf5c15d602cea0ee82ac03b754aa6f7722909d1d071cee51daa55d012ea09076cb0268c762ff6ebdd7bff9f7aac7954ce5d78da957d30c2e5ad7d332232f16196e393603455fb47e48d6be51228a5433b04b36384afbb2da7764d1265b44a6a3084b9906994102f11636f7db31c979d622144433c8bd7395f15a364ef8de220771b5f2d03b3daa1a3e36db3650c88a277991074b75eb475580d23d05e06a31ec13167d7292d394044a4326ff7a1523374c45f17aac6823094aee40b830d6dba50e18dc36faf18761e82f99274ca53ebbbdb320983aa232e55c612e9d0c5791909c7b4d0ba26e33da30efed87ce9eb9479ef10f312ddabd44be3e8cce21aa8ec0841384a7e033a5439be1385e3265593e5da2401c6760fdecad9928114078738c182c6904c29c7c6e862887ee1ea213a77cd9e83a87eaf932854f4c526bf77edef5a2522c5784b14c84f01f88d4a038bcb707cb9e8488763e3cbc7723fcc0430cf286e71197aac8cf7f7193f0b00f6e3010f1eed0bf2c53b81f53e28cb74f9fb0a2c48481d122652ce5960a38d22c59b89efd1f326d7e8b9e27742a422b7123f24e1e984c4d40965e76626877d5dfa84776e13eeb983ee23ff6d168127051baea3dc031484d6e1bf90ce294c6422d2684bd8e1d9002922eb2ac736720a949d4743d8c417398f442a285c66399b43d3d60d0f9cec4891214bc22e80008612e667935bab8a852851ec81c5f8dfc8fc0057a017a5bf5532ec36e3a32e046fb43c5ff37e28f55fceb9ef2be97a25686924ec844067c5ea957bed92836ff54cbe5aa30540bca4c3bc6347ca15d50cbff979206d3f6bd3c0c92887211a16d771034472ac1411cb89b10908055c7400f623cf2653b6caf1a72a262df58a95cb0b0c4b8c2591cc078acfa549a6d71f346caa23e81fd133897f21e7c64c91b2ea6ec20d91bed916b414979b9fcb4454093731c1e024e2f4a3f850522d66b54cb024e3d5a132bd670f471658e2df475792f7f128eb424a25abdd0832be98d7bff043a3db48962330aa66dcf9737128ea7692ad47a13e52ef8d9bc2cdc45933ef2e51ceb9dbac7b250a3d13510209257c1b1cea7148153b04fa42c06f5ca0a400b04c8fcaa236847fe9c897593606564aa294f53ddc5e9676762ba6df1eccb9808ec5c8e2cba94627e5963af5508f4510b3e272166595fab872a8f59f4b908fc44945c4094522db89c2c4c8c8c66e0beb57daf8305d93bb18ff71dd0b8f88901b6cee38d70bc05a78b090d26da63bdd82629aa59def37cac64b5e9197fecad0a664d672b948afd3aff46e32356d00f97a424541a6663fe7ad37bdfb69f1219105af917a85c9952c712d9dc336bda476a37165d1f03f714dfc3b8e6307959f8a335d935fca2b791969f7646182ae655ce10f481ce500c23f76d3cdb6b03b3068e2f8ac7281cdd0cf31ed8adf24b80d4fe0e8fa9c9c60edfddb43c629a471efe1c32799299e6f79688cac286e38f8d74bff77705621eeaaf4d48b54b58de8aa6af30b07a746b4b50cf8ce427af4a02d57ab275c808db6e4f8f854384dc85cf97446509197416fd580aed6b61383d2a20026cf5bc20eb564fc921a01affef33eaab71e8f6b62bbc9e5e1499965674a0c417acff87a5147a7a78cc75d9f589437e64dc2105ba918cb1136d2cae8c0bdf559ea2f1ea870a8393797f52108656445e750702f9df69a96213d41b5ec8df5a8cf4ff51937f637ef79acbbdd6114aed58bbac249fc547a9844649ea43722e35b8e6021e6d14fd901fce64276a3e52e90e270abeea14b912cce3c26a69dbd1d3b61419c3c55547c4d0d55bf5d26af95ca810311ac93600691608624523c839a871fe4e17322b35ebc64b6353f298e8b0c1f3cbe0bb5e8c7f67d0a1b96ff057c1aaad059260c6d68c5e02d5de046e13801fe8d1509e39cd0989313200cdfac56d1d0c92a0178c20beb86dafe8c0a82b05d546bf7c7d38efd9a070ca827ab154e46fb154ac1dc846a1083cf1775a203fc869d02570d0356e5caf186eeb9d92bb62024adadbc6f2337f9a9b578e29e73464d7c0951d5fa5294651a7fc59659fc018b3789443c668c0bfeff8051991e7d4b7e7ca0806fba6e80d1dd793001d34cf5024fe4d508bb5aa8acb208cd145a18bdecacf00cdcf28d9a231a869f091d7f1b51198257a413afcceae1a7c6fa8f1e12b96a8f7b468ec6173a786f822959f61decd759c9f9ab6f90a046e5692e6832660d1c0f3d1c483341908059e4d138f949a9c3169d484240c777c238b555e0a58a936ef162111bb34473607e0aa978ec85852c0b5370780c3492f8209bf79b1c25ee69b97d5db93dcc11f22a9208e3b347238b0e8e4291ff7e1cf30589f403714f38a09162b342b4bb93f0c9141fa3bad2a48fb1ea280e5594a3bc669c8e172c69e26dc6f11e261a2217ff2e0e9b3b046754189b4cfc55226640f3fbc1ebfa3defcfee4d08da6e0b81ac040b01b25557b32e24b32a4a4e2b46f6fb2df38aa45e2a27e7c39352bf1fc3b743aa90996dc30945a47e33d6c062359e3ca3f79bebbf16e0fe96f1eac6ddbc1017e84f20aa3030431583e70e192f19354187e44a50e7f670ac4776451785534b0c8312ee5778e83ddc3f737634a9c3a08a15b1d4ef466298a2cce298e3a6c5e430a5916fd00ce422f70c93e71c9e9cad3165aa9c8205d2308a1daf51d7b2d2ec96e6113907cc91af7b9a74986ed415057bdf8b3209c331c916819fc4201848c77fb39489c254ccbab21f50561891c8aae73a765c2708c8477a7347e63ce2b22e9fd7140d487a11665df452417dd6ad80dae0858b5bde5a77ce2b6d8a0b2f12ed80759f820bed3e47609ccc0fc9a9b433b04ddfed9c7516d82816411c119cf2da09abafd6bba2a40d44473f80e9e9e2882c00d5211c6b18c118e2b9685409026b66e5493f19fa1a0d2f9cd43ef6688e85f76bb8ff18dcf1073a6985d308ea0fc8d912af63657b355a039a95e7f20396eed343b23313d4d7a792a78278a77d82d0ad30ad0c9b7f91534066c782e1ae9c496c154062d14e233cef2c6ec885405ce5b23d3a0e007e6de35d2a60d71310ab48d39363820331b337b19014c265a8f31f2087bceb8777819dd82d9216f56c78b2d20da354bf2212c729d3935d08e9b9341d40a13c636b1ba7a17e19ca65cc25204087a72675bd135ba842c4edb130cb5bad33e082972837d67cf224e70791a91c5a2cdfc367ca46f9b32eb07400000038e4c53d21cabf5c71cd4906a0d94008f556f035c5e33bdc8b1447c0a3e9f2ac335edaa856e1476daec936aceb10560ea7e5147da607ab75d6f5d688392852a5e5031d4a12a8421f84120c77dbfd778ae974097dbbffaa8162e629fa8eafc6e5c491bdb8329f552507973528df2fb30cd1e60a4ce55d4258d1b2ec5e505be611600f9c93f35ac19d32f4134b7cc1d0dcbef6effe6f8f2dab34c7eb7a2dac8c6a9a68cce97421392b270e7070f1c59b41e9ee9f84a97044394bc28db15ed038377115509ff8d212dbe2a2497a2808b3c14792bcb26552b37794b85e93b5f4a8d7b14bcb5be165d43057832ff08f14581c83eeedd61dadf778b789bd4507991cfd09094fd52b635fc28064beb1d09aa4a4eb111e07d7796a9d7fbaa2af66d6a89ba2a3c1020a6e83368fa65efc5a9c638d5b44ac2112fb10898a760e2ee0b79d24d74a377d89538dbdefab73cd2f3e63639959e596cc327acb2a2feb0e9c29ff40b8f8608f79e77b127aeed7346b861124149f77e1c3e778e57e110b72b6c17765a6eb9e05ed4d21acac116340118903b5fd34ebbedc37047624c895eae18a43dbb17a1622842f26c45281ea8c22dbf7558932fc7bb59c217018a09a352fb5fa7a9fcac6f6f77c19fff49673dd207268cbbcfeeb00b68fa9d5a13b207c7efb57730cbc0f045f08cc2c1318cc395512a4a55f39eef4a8ba55c2aa7dfc25f73ee05e366ff842df64724d5c244f64caf1ee8abfe2988515c0574e7f22acb48dab6ded2753b7be9eb8238efc8cf91061b268627497b584b2349bb8602da93c46badd4afacb6d0b60f2d00b681f6e81012190fe316d223f5ec5ceb724546f1f65114592e7d0a1bb682ac5a426824a9e74eb3f108c4b70c1393b11aaab4265a03ba0d253bf6995ab7d86333795f8a38c1bd2967f2caa81e777c56ce94278839cf31657c8728605d10594722e4ae534146a410a07b527e0cc83c9794ea31f28ebaafe27df83ab7f34a2a126e6609098b0ace2204cc1b96e61f18a57e52095771c6e97dd12a831a5a8497c009c8cd621bfd93576bbab9432a5e5e44c05bd4ae26841ab5cbea9a023c1a32723871b4a6590b1c7c0aed93aba82899cf0485feb49a79190a633eab5a36bac82c8ee62a11f1618d8f6a8610a0bd150b0f72bac3f9e6a1af0baafb66b26f6c6169aeda2e90b19fcb847662458cb904422a01fab8e5c73950dc41f6015515947bd3fb825f5304f83da9f0514beb04e6e48e441956763350ed9485934eeb4ac9d04ee4ce1837dd76e1cb9c73fb4e3918f24647d33906c69d441132cd8dc7eb3936024d436e2934cfa6d009592eac820398c39333e34ccf4368e4bb97257ee7a703b76f70ee8237d2c18fefbef27592f14d20fe7cb7dce07851022430798544a3f12cf657a5bbc5702d33de894d5a70b61e110660cc2962d8fe8f1ed9ad4032eb38272ad356c8ae10cef9eaddbd2006778d125485b0c94c4160052fd6446f806740af6ea1602cabea168eb9ee7c984afb9b60da1c39993cecb252f626232374eac64f1d169c4c560d086cc164c981607be8ddcf8b5b7d6e8a2edfbb82256137abc99a598dd2c71d04551eb08b7711d1aaa5516b093238332fde4cf7a8fc9057a2d2f3361c8339288e318bbc182e7d93c418da9a28486f54d2d261b3d8668c5cea26243b06999898f489507119d917605f0e06029846d5d46d62a0b4599685c4c7937091adb1831e26cae9c749624d6218ab4044c7d5b270bf05d2cb35cdf2457f17508b1d2f0499434f5e0e7c6e6b6347399d8696257c1edd3d9ccbff61c48c3f9f4607afc599bb06d03261e838fc7d43e68d72f938b841de2ba2543f36224ec9aa118f1f1bd51f79babda421a1fad27bb1b9e6cae9a8dab5c20d67912be7a9a08e46ccabc3ad2c6daecedf11fd1fc965585f4e6edf632363c860227abedb3b5566b1dbed1bf7edc1c652bab0ae9d851ffa70acc16047f0a61ae1cbc67d3866bdc3c03c371d3a8282070455c79f738fa3b780da73ad57af958bf393619b212dc1ba5c058339495c3d7a8600de0c7bec3743b098304ddf681a1eeb731a94b2ccfd07591e63e59be2e981610020dba415a95bdb83202ca79cee883228d9da69c2ad2a88344dc10712ab02a0991fa9febd2ca08465d6a19cc210d5880df1b9ffac853c1997eb2ccab32dd18ff58670e25be48aa6939287d26a0d292c6126c265c440f7b355e4447154d828e796b254c58be08ff7715325e9d57a15fdb9324588c16a628681eeee4e2b52caf0c0e8da8a730da2dc90aeb3bbb6eb5233c39ff29a950441361ac03c54630bdd30b4c896721b2b5707352c01ff3e2e71c8e6d16d24620765192294104388d514e84143f83bcc1fd73082860daea2cc94f36b491f00b5c23f81bb779f6e30257ed5f30d03e5e548d8ee01060b2768790b7535dc556c25e852fbca218b55ce415d5334c6cd22a2aa9116988152a39fc2a5d85bcd7fee7fe97da754baa581bfc89b04440963b893e1e2ae0f0b997d8f842c980fef7ef64545a5aa675a67f197f91cbbbd77204672495d60c9c97a2b63337d40d73414c8aee1433bef00e91fabe63f6f250e39b940c6e9ae16796fc6e0a1037d596d4c4b07f1d4978a772ce391df8c7a7bfcde6946bbb51c23c7f39adb322c30bcd235c1612eeafca93cf14aadfe6d3d8c439951613e524bd82163adea0dead08951226f93160a0249de76f0d0f69f6b843feea626f66d7658551e0b7b68b80d8c1386035a15ed5411edc13111c43602cb9b4b50cdfbe7465c1707b32a37f1ef25cf58286f46de1374e463c184b2fa1c5a96acfd6e4921f1d78683b2d91c8e64d5ce12569d8bb5ea5fec05c21c6ca3bce3ace19f1585fbef43cecd8a04f193e5259c4d2514b5b85bb97646f24679b9b885b68512ed6f95f30a750d2329768119a1d82112f8ef76866c52376e7d8eaba232c1bf7c59f79914d6b430db8955ec48c2d6c246caa5b03cdfa1a58855ebb4a2b227bcf7b5a0609084f8500a993c22e56efd8ae60981a653aff3dc3543024b15b754b844123e7c3ed49eca5a8b2ef89be252ee26fe2807ace3fef767135458b6386817ab1a9ea1cdfd3ea9e1985c0ceb4483271c839a3d21ef24b6f3aefe5c9fba29dd0da185d71d373038ad3bc86841a942bbae3ea0a2626df939c873a7a8f252a2f4171eda3ba26ef9a82797187e8accd49db7106275157d04bff0989c90fd491d36dc7c37407f645b296abf611ec44a19c195f27ad874e74a8d1f827ed0a008f3d2c951942bb27ab06971f8d53deb8ab3a7b9963935bbece41623dd5fdf937e91e9c602ef03e93bbf982ab07a0d03d7fb5573f11aef1a7bd5bba8d14957f70d0cb3fb62de5e9c1849b4bf47be21ac9dd13c54f8dd283b99621af058a9b3814156a9f67f7b4f9fe31de916a9763e4b8f57f1c93774abd01761f3d8351c85e1478c2073e03c6c3583d71e6732c0055cbd58d1e5c3b889afe0762b4009fd21ba274766010a7f3c233e11c286de0cb684709b12589b42633caf4601798543365282dcc3870c686b08ed6a1cecd50a163dc33b10eb4552f61e982065c60d9e97e075f0038ffc873c60b71e9021078cd3c519a7bc0ce17d0700da1a68b01001e4e073e7e78ec63a538c25662bfb0faf86c413916e4db9565124f6557558339fbaf1b645a2fc27f7c83d68402d9843282abd20bac7aba93faa547a715750a8db1e55b859e4c1082995a1512f8f14b5f46bb55b9b74e9675cbe05a15487bef51a94e24c537c4f012ac4b69e84ab512ba9ab04cdbedd3d4d846ff3f5e6863ff2a42efd1963e0077124f555b09914ecee6dfaea1d9e968f5375d2d0e7d0040d5ae10296e06f94edc3e64c381fcb81c53e0c5c0faf709a74af19d1d786ce62ce58c1d4743bb7777622932e2e539935db6332104d78040450483a4e7283c350dd879bb07f1514446783b201d7674d9ea25c25d7bbfdd4ed77b7f7064f9aad43dd9c2cb6eaef104051d27b5394c915457c58739cc68b637c8e372387c8e9a2b18c5d186a261f098caebc41c7ce6d2549ab08ee928a5600dd8fb2eb8613a5833258b77d4d495497e7ddf9d5b8685f73a9a91762eba5f25a3d7d88b9ad6004a4e2c5becce63cd3e23642a1af722ce7edade9584d6b432d75eff97501f7f007b889f86138c1743e9410b2bdbf9aba2ce3f4816f5c4498a0d1b076b20dd1f681cba2155893d7bd0c4665b2600a03fe1cb06e1ee1d3332af0abe46f7794382b4bad667077a4c83cb6de3a5a98e3c245226edaa19a6f3ba6d97adc570d0600053589bf8e3da30e50675dc73599dffeb8d294a591a8041a61f81e001a6383ade370ce201d4a1722db9629fbf3e99192b097981822a5f49ffa0f1d90036e63057c736d86e6760c7db677d121a27b3a212d5ac5370139c3dc6abe709ecdad8c6af8e16f14a99c45dbf84b821cb4dd5c002d330d01fc8637ab34cc7a8a13c15017c8a44daad2a98449e23c5a00d2f11633361c19c55d4344ab827fa4e0cf8cd55740d6e02b6083c3e2fccdaeb1fb2060d544f71b4d25fad35e9d317971b2fe4af8e02edaef84621f90f0ee33e2b21c256172aaf7098245cf73e2de168bd11df7b0beb17ab8da41973e817965111785c4442db82e958484783e27eea6020bcb6187845a9b2237f066f6869a89de38448ba8094bba3cbcbfc7209a01c5bb3e1e61670a006467e48561e96307032833339d2cb0c987daf43b9284394423996af6efe5f03a4834496f0d7f01010017eabe9d316ca34e54ffe9d4ad7dc62966f933aff6f8298ebfdbec0bbe601d517fa9b26b98d666d65a24016f0a1c8b15374247d215686c839b774ecdb01dd5403da23e801a330c09ffce297116c4baba9b7d526d4135accc18a1288536cee6e03bc784ba57a1c7100dbf04f29298ba8943b4c308056fb88315901611e8288aa691c24c12a282ea5a316dbcd3e127bc70cd5655cc1cef299fb2ef6b55ccf1b63c53392008d048bad0f48135a1b2246b4cb30d8574497990cfc49260c7df82b3f1e42d91f686b5a2c3b0599937a1e78b9e23c8395478ae94bc5c46e0ee1f1795d9790aba94d7d2c8a84672cb35b416f008060c93f117c81b8e683e0bc460d9db18530b8a65ec125779161469b18e6f89344641eff46d4595218be76b24ba15113ffe808d8480b6495f0007229d8f23dd97245dbc80ef124932e5706aa7d5405e9f1456f843604b952d7071b1a400c1f228e1615e38702a312536d4f22443a1df3959595f3f31f0bfe1351bb386e840039bd00a0b285108140dd2e62446f1a3f02e4b1bec8881a5a839701116e6b0db1bccce0d0c43464092c09bbebc12576220f9454a720a5cc6e8d9d00b56eda9378086e8f6549e000dfcebd3588c31bf891bcb2d2d7082440a842950ac24976e0753e67668aad2e01acafbd609e81eaa95132518666e24c93cf56addd3cdb3ca85adbb0195b1fa763aa475e2aa1ec612b54dc629652ad052b0dd259aaf4d310de1d2f180e7f112da2d8b7e009d4c14475b625fc9730fdf283fcaf352233d0ee6c1224a97f5270daaa97166fa26a6f51a805d19b404bb7698a8ae9ac4292e292169c9fae849435b7aa5b45e06ada6e40cb4d07730446a52361097a454a1bd0cc40596ff3fabb771e7d3064d865036953f4d209b069f0c58da3dfaf7d779f7e4832daa563809b988a670aa9b80bb45d0c044d38c2a7563ac473c4e9e54b4272587409a5d6187546d7ddc72306f9f4e2c93bc75dec6fbf7c711c30e96d9cb887136895d8dfbf40235f2b0c121f4ec7b06bf5ef0113393cd469ff61fe8a105dcc4029ab619535c505855690e78640cab13b5210deef21015082be19454f12de5ce3a23d6c320de6db4a3dbf213e0406635d96114081e106ffcef2a3c8d41186df741932459a82c20a826a6872c9924cc96e462f8d6b2fed64617bf973609d952a69452ed0421055005252bfbeb34ac39cdf00ff74bef4b4bbf7d8c87e0d7719917a26ae8aa540d1d68ae7c2d8daa26234e3e3b3b507ffbdd0ee44039fd35dd940b79500b71742017721d3605b58b176997904d0d04946a1a720e64016d3f48eb39c25c3415a3c71837fe313ff75a4842fb7c82bdcfdfb2252d297925b3b4a45ce6eb047bda3ea9800e16c77681e7bf9553fc77f7efeba6fb5c63996798996df0509122cc5b8499f9e241f24ab97197e5cf4a5e582a683e36b5f95d6bf8e72fcf9fd8ecaf37dbecf71d9b1f35dee6d6df16ebf497059a39b17b17b5bbbb2b79a5dcb8cbd7109aaddd8f2e72b7514744948c31c6c8bc9139c6b8cbcc4cd0b805fc53e2d7acf8227580c91f62d6631e3631ac2ee9454cb5cb8c6b009d6f91fd52eb492aa9665eca59b435e2ca4340862a2f134082eca0866b040823aa49e5e6b7e202a153d947e5a1203e2aaf45fd7b453ab37bbbc7f872a7babb3b956a5625f10fee373f05fe2ee9c5eebad5597377b73f1d2c8ec081aac569f2ee3e73ccd3a2cfcccce0e6e0910026b87196fe05129a1cd775af65defc1b7f9993e37c6f8e543a75a7f260594f4fffb461fa9c344646463773e32667d3e3c307c8eeee8d919151c7c03f2f8c055ad76927bfa41729be4f50b8bbbb714ca076f50407572953b44b8a93134fc64c652e384a4dd3344da337c42a690dc96f1fd30d83e4b78fb13d49498cd29bd0305693d760e01958b64c0e9d3fe965e49fbcbf8d130e779848295e4b414f34e4a7f818f253d04df13b6affc9a3789498ee1d15c5cbd115058581599c7c8c9b98d42734d59f9b7c8c9b78dc97bc90db6a70b9b58b1a245dcefbd13d7774364b73b529c9c7784c9378d993bc304774d12e5ef8d5ec65d4d0bc35624dad4c57c45d7f2313f6331b91c9d11fbbb3733763a4672c2933e338fdc904a56aa4523246da48d335d228ba04881f39fc84c78e12786364e6ee032b510621b895ca1f6ebbcfcccc31ef8220839d84bb6957fc74f76b2dcb2d77f75ddf75f796235cf8808c32c6f5b81b658cee50e086a4e0895e45c74e375313deeeee4e640521fa2644140a15d73dba2f1fc16297cc1f7eb3b5bbbbcbbccccb2c3f4a10942d2b7777e3ee6edcdd5d1e68ef7c3d7b2fd4e9c150c19581b3eaafd15306437da1be50afeef6b67cc41ee6097677775b5a82b06bedeeee4b9f919260777737f660f990d1fae8d2b22c4b5aff4d00794fe056ea3ea330627583ea3700021a32e4877bf6857b96859f87e78555cbb22f379685bfa8c8c8e8e868b562d0f725e6fd062edddd77a3efba7bdc9f4cc8dd7ad11084731f30fca235fed6bbe40da60816075210e1841d7eddd7fd53291f52a9255460c0f1eeeeeeee1e614abfd6512e5dce755f148c832898548cbbbb4777a7428d1e822853280f54210417822910e52799f94b4425406624030f03ffc829b0a2f6c1756ef9a8fe1a8cf5f25cf483ed827250babb7b8ceb31bafb82e07584b620873d5789c9772fd5df8d3abb6ece7d8cc26c6fcca579b1bfefba3929963986cd953a77b84be9eeeed2a5f4e8fefbdddeddde464a4a7ac507b87dad649d04c3ab4ec3078472a72e49457fbb1b5d6eff42454bc952762a9e1443452d81c1035cc8cdfe2418038e5d4ac06b64042fe14481233ebc1242f221128410224260f082131ebb8faace4071c708c5031b0c0c4c5cf7e8ddcf309bd111bbbbbb52d016e4bccad5bd947de99c855d4c725fd6d74586df15eeb5a4522edddd77a3efba7b7cc24681dbddddddc0173b9478a657eab1daf973cee5d557ada74f7a4ac0b6cdd731698d6de98e16f24b54e0d65966a947a94789a7b4031b91a149bfbde0a0fdcac00012dd34ca3ad6d6141e70fb5cead15fef757dc8abeb4b3c447d5d1713f1115e35d155daa1bf5ef5a8dd458cac78f54cad524f91f54e81cb552e08c73fe6f3af0b83fbbdb2bb0b5a6bedee366ff72e08a65030ee737518eac19155e5dfb8074395f97354384647dbfb6b9bb795050f5c3f4ebb70d53e73afdc87d8632b3d6e120c130d27ff6919c869298caeebd22f1c04d14b4eece9a1fa4b4e062404d00e3b3d4342f8b40b6fe40efb815128c1857b846362f2249347f925bde83ee4503eec7e717685ef918a8a2ad2a8741f4eaea25051f158a5036723ab785b9df482238e6af908a7f42c243e9f3c33ceb2f8a7d08e8693f42928100a253df631de95bc122f8757923087af03b825a20a46757b7e6d1bc0ed0f8238aa1b02487e23619267120d921772c5c1ebe5f0bab18ea7a33fce912943e0aeb762707617677797558ed32e6bedaa5cc6114ebba88c74e4acd1e21cf1910c9050d93b2e0d117bd293f48b9e2495c95967f1dfd1626eff3a82d4b81e7b1d416accbf5e47901a9a8e203532cfa88ed7a1fdb6c8e8bff62137e9c9a22706cccfbec6f5d75bb4c6d441320408825881053e54aa162d307a9232524cc0718c3b3b3afaf318636c1edf699edee171ded9a31d1d9e9c1e3a3be4e454cf9959359d57ec3982deddee8518263ae8dcad27792918de75b433d2379dec72bc8aaea525bb976bc439218f2774c8f84bd775bba2af1ef0b466bc523e70cc9184847ece123ff9254ffacd3b49dfbe86d9db745536c9db3c92275112a98484fb9227d170949eb02fd14e0920f9ed1750b26348f527e4e3f02a6904ba1ad2549b2ecbe8b67077ea910609333333b7b03de9698d7cecb36e4ee738b7a1a95c97596835fed87b98f4b46e9985bf7c1c7e852bd46516db1f86c5ef7a2bc5cc31728c2c3915c31e61628cececec317a8cd1a92fd16c922b48ff152c365b57cbbee463f3c36c7ad7671e56e5ac52b6a661f424af145fa7eb920150757777777777f75fb25b0543b5fba22e76450c522ba98e9dfa623a768ce986898931cddd312eb89999b99bbb9bbb8dd0dcb39112a6251cb99428eaf7e71a75352a062334543fe2797e5852c3158a7b54527f60213bfda3f4368eec112fea8f574b702b7f290d59b18f5d910d80081fd581b46ce39087cc39e79c73ce3967c9cf396789b71ce94f1c85d175d52f2f444cb44bce101e926807446ab86daa200f547ea27aeb54e74a48fe0cb40321d59d44229148a80d26cd0110c191685c74e3655a82eb521cd843bae7ecda376cb0e99775ebafebb968e34c970e13c88ae9aa0651a8910651435e750f49a718615bfa6fef0fcba2333001a87b09201841302e98eaf6ee7690481ecd2cfb7ded69700dd3d30c8fdbc7ef4fa3610efe1b38fbf5b22c9b33f61035b68a589733b3e65b9917e1ac8965cc9e2ac259d933895f732d6e8e31671a33333b0ef6d730d28b795db1b2b7355a931c8bdfa419a91d42f24ab97197dd07ed0227492373337333636048c889e84491996596ed6e26a30ba01f9a46b9ee6bac5946439bc80212b8f8bb3ddb1fbfa4eb2efeed12690d3ff6fe9b8a19fc18ddfaf38dd9ddc8711ce796cf142a46226c072eed9e6898d4cc3731f9f93404e1ba6be889c6a4351d9a7cd39ad38cd2f7977e6b5317f22013ea45608a50a23f5080fc05859a5a7ec0b5a062ec28d1c0c3a1f893b77efcc585c95b3f95dfeac99e339e93e3bace69e803c5bec9739efed6e463fac493f1b6bf8d3029aea5ee07414ed402d41dd2c14e07c1f41797c0f9749fa04fd027386b8349e0c23d52bb67e0810b7735632dcf709ae13850557ec7812a9ccc826708b9d6088059c4679a558b8607e8e7ff7886a637fd1fb3881f999abaa2b00137fd056c96f873725c07ba6c833ac4f0f3ce1d0838359ad148bb96f3024d812168927939c5ccfc266e6968b3bb2fea5c29c3599bca0c00d9d17cd458c48e4f6d204510a92aea0e15d153b5650b703b44444fdd2122766ad80df9e048ed507ec807456a13692026868a1ce9e7aa5944b585ccf93404e1e6c738d7641986d9ccc7bc1a7e0ca3271a19adf9707ba635da6f652a843a91fe9af443e5c75f54e8ece6fa820e5ce7877ba4b38a5846da65c85ab50b8a8e3c526838956082869d135cda5e54be4fbedf99681793763139d12ed8d1135115a34ebb94705dfbe8d12edc4ff913e5278a9ff36bf490214af4fc9deee7fc95af5f547e3ed82e273f1fd52e263f3fd52ea69f0fd32ef365a4f859f273c759fae77ccba2a1f5dca4e105dc4fdff1973e7296fe1f94ae5b0dc9e133503c86d1130d941aec51680eaf29ae1428665c6fbd44f9eb2d120e2652a95415853610008ee0f62aa1fcf5d8a7f8eea5879242a2782779a160289e6ca22e29c57bdb1f0a0aec6745f131fd293c94bfc12b0a0d318ae3aad9a3a03778cd68ec4f6abfd5e47125916668241b9310301fa33ddff442a32404f4a4fd271ed8df7c130f95d347cea3a4b136f9b10ddb5aea9c13003c5cb8d5f900d8e1e6cffcedf94093fb991f7ee83f45445e04a413facf0c7da7798c8e8cf8cbeefc9f231fa39ea29d958e91560911f914fd180d893f1e7778dc68be11e65920d6f939f231ea29da59e9180957a857ddab14238ef4fbde6baf126348d3b40ffd47fb3ed29fd6adb5d61a0d37cf8778ef6a9be63f3e44eb9f9fd07784b884bdd32eeb3ffec3fec3f467e34c9d0a8be871d040a79983c6280b7d100705b54b0c3c99079a1b1c7f31118248174475fe61c77f06719cb7953ced4d3cd26b1c4d1e07ed4b8f03e94d4e4e4838983c696e716352e9b5af61f2a4d26bbf80125d8009e57e7b1cb68883905805ad4a1e87edb9c781e44bfe86c65f4aef45bb2ed88b13f64b3a6134011cf7245faa3368652051c0b6c8c9e173588fa41732393970f47328a124ef94c4a3c1611e96c589081104ffb033bf573421f38dcdfc708be6d3dcb84f9f3e31ccbbb129a2b1b9799f3437ce4d136413749383a6e8fb8abea2a2d925a3887a95172c18a4e53f6fc8f50443bef6a7197e84093d28506be48ecaf534a35ffb18fd1a5d8c5de30ddbdf671ae54bfa6303af15d09251c618a3b5d1b2a28c7157d68918b67d7231d4189877bee68451185d79ae0c4c6176c5077c68c8073e08a70e68a0614e8e9b294b30911b4b74636eb7dfb08126fa0d1a0eba2164830b11ea79c389887c0ac163788d0bc3ee0c5cfb1f86fa56a460ca5fbc9b02e7333ee3da98a9542a3597972333cf90f96de0945112bbbbdbcd7d19c1edccdcf0c971dd6af6f8840c84775624d5e7124fa8bd53a81dae116a4b407e8cf589b1f5a2dc8a5b75abcf31ae9b71964e6101b70f33e3ab991b3b6323bacfdcf08dde3ce2cc6ab5da150fd7535bbab033b1af89bf4fe32f3890dcf8cb56ca000bb59f7dde718a269083431af4a21624f42443fa538dedc305a2fbcbcb5b9343bef6d1e365ecd9db5d6f5f477f2acea1f15afc9c1cd775ffdf177ec5b15e7efd7b63b345fb345d7ffdff7f6353446373d34e73a3a28886c886e8260711cd16f91715713d59932ca0ad0db748cc600724863081840c88ac4a26cbbe779c4526c759fa94802bd6b81ea33ae8abb6c5f5d7b638c5d43b0dab74725865a323a3bf98a3136554e9f49113393c9a552a2121d5ecc075fdae84a59eda5c0a444470a2f52488204104e666e666105c509832e866e666e666a9a282fb60324554e44c1c03b910620fcd8c8a59f798b8eed17dbbb9bb796e3c3cafefbaeffaaeaf0de601f2c04c046f6feeee6efee96f5914d8d2b2824231832847313333734b4b4b7304c280c8eedddeeefe5fc78899198c32c61903934ac1c4a4625037686cb099314226317d686f1004010cd6db1b044140d4452c73f466666666e66646a53a82a9e820887a7ea1fed14c35869c6fc7000267aafcfb4f84fd785932c618a31192e3f6ecf03cf1e36e8c91d78bb89007799017f176992f66789ad173faceae581ee6d9a941ed23dbc785a44b297da35ce9b283880c21e2bbdd1167cded9f06b2edb3edb3f50f0ff3fc7473ec9fee1f220dc4835a081122b5fb9d48fbb48f0fd3b07d9c7484aa3696319f686835a6d7b43759d6d6ec5bbf2418fb163dd130d19a0db55fba9ffdd6a5ece38332902ba33f5ce8f11717a88977da37f99227f14efb241e0e18260f832b49c9f6e7957e3dee797bcb83000e16b22bba539ebf6e68bd667af6bc4308ecae581a5aaf993c1c3aeae2f0ea434b01b21502387657b08ffeb867af52f6a6ccd2b4ddcf3cd904d9c47a5a4a0dffac293326bfc9b352b62e072016bed9870f1016a28205151fd32a34dc51554c32482007d7a59bea6ffb251d6069dcbfc1b78f69cb3a3db3f6318ee3aadac7f4c90b2750f97758a65f366596f59907328b7dce3cc6a9bc9ba5a4a4a8f8cc6be1553c163ec58bb155c5b3f04b7aa182c69c165427219baab6fc800b5baa49039663c0edd010abaaf5666242c31dd5e499061e2ee5b557f9ed49df82e573f273aa306ddab3af54e61570cc96911b99bedff27113510b968fc5d1f04b2c1f8b86b1b2e5c35fa359f859a0e15441438eff4465fae357f19cc7f39ec8405d0a1414d95b2bfcdf5f87e0177ed82d50caeba96170f9977e263138c6ee9748fc256f7bce5bb63ec649d8faed49d96fbfde46bfbf507b8b7fbd9aec0019adb168cd6906bff5bcd2dfd75fa718852a6ac7f42cf7b8f0e939392eaad8a73f1fdc735ddbe3d33d3e2ee173cf2e47558faab927ce4bc542abf868ecd2531ee393e3baee53fdc23d00ea19529997a8326f8bcb6acbb2ace699f2d417bdad1933332b807b742ac513c3cdddb3dddbbd9bb9a747e5e71e06c23c38c5a9ea01cc05fd33fe625d2f7f4c76cc7b2133e9741637810b998d32e2c78f1f3f761b91e999f575f776f7764b8a4065634668a65d668df69be1502253f2a42791a14323b33260251df2ce510b93206eebb628a1271912d2f3b6c518a3f6ac6ddbc7c89b66e3467f324884483c09c4ceb919a14d864c0d42323899aeeb3a991a8464d4202343c62403a80620991a40eeadd27ad3801565b42c202ccbb290e0e663efbd717a57102c3ffacfaaf2c345eca56f1feaa461dea96e8cee1e0c1c954ae51e8c5ce952fa2e2a05a304ce7a969715394619658c1c99a38c91371302ccb68d99a640707576c736d5a6365ddd5135d658fbaed6f463bf1886d9741a0b4d741da6fd8e16544710266d4fa293869244e3aad80cfeecfb43aefb31b3e9eaeeaf8761f407e9a7bbfbcf94227cb1c617c196ef9be96fc196ef6b01fdfa401b5f11f7eeeefebcdd9b7e9a76047e39b1e84f2387026e3bfba5a8a673ba94eeeeeed2a5f4e87e29f117b3137160c913dc1c2a80ef10de81bbc2e50a28414b5a522ecb5d6949c929144c0e4ea93b4403205406af1da2351fdb98349fbd8c9e682c36a3abe5c11cc1c96f47490993425912a65130ecdeeedeeed68f1de40c51039c8ea8244eba73d6a9190100000000e3150000280c0605c2e17040382047c9b8771400126c803c7a5434160924518c2531cc19828c3180000000010019119a89068c70e647a0f1dcf6eeb9f7ba317152c818146c8e426947e9181e3dd55b908f2eec27a20d7159b1c65d1e779fa210d4db8655bfec6e844b1c5eaad20c83df94f82d963d4b2cf516b6ba7a1f5f06eddf1ed16826461ba4a589d8266da17207bd4033b52ef61d8596debc4bc879ea7616c415e3815e4eb4ab9f17fc450042fc676153dd992b319613f89451a43dc4401a7dcc0d1f2edead8b4a29cf496e02198b6ea7ce0dc8622f9e21a76c4490b744496aa63ee3030c35959ade878391cb5756bc248784ef3596dd210a0a14c1cdbe683469ccef7b4284ef7a54fb4831296e687d00463a212828038ad70664b4f6220ff48f9a875b9ed74c8ef2c2b1d2e542ebc1cedb995a443c92e525fdf4b1958fa5a922f63b80cf1ab00559e83190424015178237e1f8e4582ade0d5c87904797a860de796f216ac14227057e8a1facafa2e0a77f9dcfe895b809e4e2beb06a8d1d9c194e323c29c84e46aadc09ca3eb19b5165ef624e0e41b585cd4cb30e76a9984d403ef8e369601464d1310230d86b91df95023df6f3be627370737a01594fe35d0ffc1cbc643951b9acaae6142df57ae6f0a7c7b6f301e34767b68ed979228126cb87ded42d9391978044d5e7ba7f2b20e133c6010361cfd186dd31106ef79dd9bed9d90d02ec670c701152f182498cdf98698772269d6f05805936356ce07bf948b8338ad2da09ddffab876d50618aae2565b6f23d1cc2590d3dc487957013fd89db605df995aebba2b611b2484f7414c130ec22fe29cdad868812b7eef4bf26083ba86fec85df45d24eb644e01fddf35bee5ef1e3c692feaa48815ba119a1098d8b02744d71797fecc595dffcfd06946ec2458cf4f9d2805f0d567c9d8a6e9e395e1018a051ee8581230ced87249866f93fce5b352a52c37c8c3524a6378e382818ab1ad6579c742277a5b977aeae429566e83607e608c0720c25abdbc9203fe12d772ad367252881d4cce58d7c73cb7f93adc22c6d7553948e7043eae4f900edc0dae70b69b1f2531301240f8b5c3d4f316e9973838191df05a8c934ea9e325177c04f84ee1d32658caaa067895d9c63bac7ee2a8f83c41329becf34c952c95400131e2d685da48220753cf4c23fda5264b731edb31713501dd3571a5d0c5f2e069b44dadd293b7ed13da37fe726c7dc4bd5e953d834bc574177433895f8eeee0c74c32e0e388abb057329c1fef9486b88e1ed4260b12cc11710ec54f20ef1a9174693ee8c5cf2cf2ac83ba544ea3c42a9784193ff6d1236b3f125466343f196c6b69916760c4f40db1ab141044251d7eb9a03edc17821b011fb0c49a501bcc25debb5d058f1842e2d671507e8517cae03a081f081866d9aca1fc7b1347572adbb49878ebbc765842abb1c19b571e7f4229dedc811a67d1bde399486e57c89b007ceda86f34ec80c445ddff7a7056e83a4b79667793fb36d878b30bc59fb5bf8047688b16bdf55ae2b06a89d324dd031a33e49fb9219e5c94989462bd58844dc9969223b3da07fb860da5d8b6bab10b3ce78b912ec390b2e82b4dfa00b0bf2533ae71191e4457b4bbd96e7d6ff2ea443d1b3b716e3165fd49fae01b5a5d8e78a2cf82336c1fd589e4e9a8695b17033eb0059ac1f0c1d9ce8c8a54bf8b5dc14a3dc48ad50f92fdbc08d10a09db1788ea8fbea5e50d5746ea114dcdd5964a1e4b257b8bf778127d2d9e36858fa9f12626e627340e31d243da01edbe2336c61941c9f50f90f0225538e4376036afed8cfe826a8481c0602364e0bdd378a5fada3ba8bc3c37ff7f004c146b4a7f093e3aa94dac0cac5451080963edfd0a4192f98f6af59dc1bab3a0745a119c02ee0939b0bebda613f41b2558eddaec91f9857335716b1a391006d47ca9104fa2571a5a3f31120ca5e623168f6b6bed48bd5281df32ed0ec472a470430d57e0c2c6a7c0a01308350ae17cdb06930b49ff7b7f5dc290992ec54f5894d8bf091b702490b0f7e7c98f33d3f232018f7960d62d162949a41d2ff0b956f72df6e96e0eb72f96e8b9caa3285c6757db676a128b58b2054b9fc2e705dfad772b5afaf8643a0655ab302ebc343198a6db95e55448659775872eabbabec5778c601d8b74c1d6fa69c760038f470c9b5a4f1683fbe74112b6384e92db7cc90897818ada83ed8fc211d8b4477087d91e80681a0934cece5820066e7bcd8d5ea63f0e25dc668d26f5e7401de9854fcdab0325af4cf53ea508f89c0cb1895da411a48deac794acb81d3f42d4e89b6eb46fa67a29bbd636c280a6a1c62c6207024999260ba82533a5a11e1f4bb66bf5e5e182322861ed638a0ad360e40dc9b1a18742ccadbbef1ff3f613aadf4180c5914e0ef9a3a15d34a3e2002e6b4698535ab7df73aa62976d39b9842f29cccc7ac681cc79d2a4ac7878b725b49af44789fd098d46a2c92935531254bf72c4a4924cd56ff5fa12afce097cd6cb2ae8a1a7b145c742e82bdaf71f566c91f92a01f17742917ba0dc3382cd463818da53b8cc604bb1a89c6f188d965c4979c143a838030ef37e8f8bfe51ac1928d20d036932e91fc505d6583f25f116e6875ce00900007c6eb0319e8867667c922eea1ad96509a3cc27e76c0c284f003623da9416007e6b9c8ca28de69be4e3650b10d9ce340c5683a2118ce85f75749645cd6c0e4269405890e1cf24065bee4d8f28a96cd56da11441d450fd1f209182045e66acb4d00d44144070ecec7602b4ef3359be4ea0b1ff07fe3d42697bc512f204f137d7cab2c241ade19d5d705c2c1d538b25875204aedf78bfa4fad0e025ca9feb2b363717ecc6557c39f720d14d8df658285c1d1a7cbae7ff74a1920cb7ddaacf6fb9846f5a6146e5e5b383e0f93da4ea5220cd72a0d9d22c2af4afe7990c758578612c0b86f4a091f828df3c760c402818e75dc498139528aa90598c0e93782e6b87069d7f0a125c521a58a8f2103f659892080ca0b3fb024cc793d487db9dd501a7645b06d4a59c402f13e473b1e2fb463e1c9e75f267f07c38a871cd7f0bc2c6712fbd8d949752802ed3e9790ff28f5660e08344302891ebc873c2e78fdba4781de5a33101a201c89f0013be7e8b2ff39955f29bb2aaad3d5e30a7d70ba691dacb3224bf3c08d38ca07dae1ccca6ef3ae58d82a2ce2328567e55eefac977397d272584f29c9e9d74b6e2dd12f9f484433e89ca584792029bcaa397011b99bc41c5cc4358c7b296be69a73102d4b60b6927a83a4cfd21a198889c000a4c805df98eab215225c4f1d513f8ba577dcce29f4bca99410b06481de1d3867bfc6404a0a762db9469ea4254c714a11ed3778b507b9bc1fd5e607d59b44498256d42727e79a487dfc78c886613718eba3d87d4a4a489b7c82c65cb4d85e78c900f67970bb1ed09f590fe2ed40bc40a2b14e51ea36ce1232eb69e083817e4610e242767022c1953e0d627dc146417bf6db3793042f237ce6c7c8339061a8708361281b45658f6c68f44f7a87a944e77605d94ff797078feaa55aa5571685398633bcb0d20da280e51253db01225e211a4e57815590fa8bc8e7ede1dc68514b5bb57ade1d571d15dbf3caeb77fd71679e72c923ac34dc62d85909fe3c7bf8c81696603a5c6f6c3eee7833f9cc36c8a63f5480e79330ece22f22a2bd3e36928a2441500704d7d77fb4d247849fc9fe7723e13ac8d17eef5d3e85f5a96e5d71626820468f74492986ebcf0a79b2d8074ef6d400b9804b7d71c0b595cd263bf8f0190a7b59e5bd83867e3ba81382029d5e07a9ec9b839d3a7a877ecf0114a6c01517e6d30968d808441ef1a8839707123bba4d17552dd0e553d9ccb3481b12eda2bd91dee40570f1da776801dbaf1786f7b4c6f48e1335cea3260849021dda81740d008e58b991e9976374de30e2e8f640b4758ca8662363c8e405e443bbe8961bebd6d77450e58b1a0e21e5eb4e81a569ac429dae2bd8d4a27e6a0f09493991f6bedfa692b7ec05c8ffe6f1c729ff27b111315827f1fd038381417fedd3659db182d74b1af28d0ef4b7ef7e85a03ab47d23cbd5821938b57282205fa595edc14884fdcc90dc67bdccdcae1cbcdde6558345d9e8ea1a32c7d24810cb1334356fc91ed3781bec9d08952a2ddeef3ddb49b718c07e36b584e9ae52eb0e80b3b6e3dc284c7bf7d24d78d8f512cdee9158821bfd09c4998043360183457fcb7f10b184dc99a0389ee04d36a1e181d0b3328ddba430b334af80219e33e079424bf47f910888b3c77645c7ae72326115d9f7105ffb70e30df5d435c53adbc438fb557a91b5804ed570c4c7bd1daa39ccdfe8c13d98973066afb81066f76bc84fe20a5742c85804c077a3e738f554b374a787cf2aad14e39440ffc60d00cb9559dae27cc0c5637faab056cced88097467ceefd16d04723f13afc60df63d518b25940c011c11a91b1cebedfb0611fb471e5dbf447f06a5ac0a950625984b9b0f89cfde91d89eb757abc753737c0f305201f3b83b0fe606189359031ca36bd4902d6624e4c8720ad34971a0bac1bb19a26bc23bf52c25018233e01a0d6aa4d9d54a5ecc6555eba827d19c4abbd92214d6154d215b8324eda42864ec58ce68986b3761efcd785514f157322b83e43fddb03c9d57b5b2247ec227f3a95f4e5d5d7aa894bbbbe906357283b5644193942a89021d52c1744a6e30927acea86e7ef038b3e48b18f8ff84c6c3fb1f6073e54cff0f9a6e9ab847d48faeb8e6ec2ad2a2ce88aea6c849e6f60dbb34191d691d16abc3714441e8ec23a520a985dc36c3c00507d63978a40b31d61ea07d6fd220e38201238f01aa93fc4702067a72540a5f41129611d111c0573970ba3dc357d0e72f38086e1b881d70e0bc76c81094ed4c4fe29bfbbe134613f33c4c0f9a24f5f4794730f644cff70ca3dd1301d16927c967b80cb0d193ce384b6b2424ec5e9dba317b6f41b338de73fc8597918ba21e6553800403dba2001b7f80efbbf16e4e02a31e2eab3dd0a1845c5b6c220daba4a39fd141c2ba81746d1d134c146f1e6e8917402d0ba647f14d7c699e18cd2d275cfb5bbe3c952587037cd262d1739313c0465acec26d794fa6439d59c5602b4a1d4b0b93fd832d7de986fea259660ec30f115baf3c2a7c07eb30293707905c2bd52f29d15ea5711c47fb96e17f35079a52fc94724d5cf83d418ea62f095045120ac5c651b413dddd972a4b0c4614f4ecc5914af17fea3ec0fdae14a53a2231f4c454d5702c3baaa64e200f02c451654ca375a3628c8f38c03da87cdddaa64a0a87c50659ea8c2c28350f961a4d50aa734ee3c8e8595198702175eb14a79c9634a249983ce6ea0711182eb7f12f4a6f711d53e2b8cdb96f8a8029223968823ecea78a5497bee43ec93c62b25a55c8ae76bbcff8d24130a08a6a0aa9b8e3986e6fc6076ce07893d1e8f84c932a39c9f13c0ccdec84d1bc4d14248026a0e9b45bef094fd4583070725f2003520e7cf3b62f04b758815918f941b6401b1b7f4ac38b1dea8633880fd12076ece1c322ca9fa6a536e0d2db9bbe227d69088fbf15228ec247d5e17e94080f8dd2078387087c54990a11d50e6572a0017c146a52f2ff21d84e3a7ce297b019ca42806dc15d472528d539dc852b0246103a3a50b81182b0a312f9d02e4e314c3b9a7c562aa3609c5098b8d97874757e2f4d883564d06062dc0136070ba6dc68304e63d9111c24b487f6f22ae2a3d8813891a1c4650b8716df1c890c8573d8e1da7f66ed3069644a1fe694336cadab1e4d30718b1a8c5621de1d989140ceee4d56414e6a5e5630f4189376967658dd0392f634fd232387c3d2cb2d1b93fb460e56349f860aff7aed6300295c93fbce6ad65a4bb076f7cc300c4335dff617db45cbfbb513354f61e1f7ebfa673362b5894e1d0804372dca62eb2b2ba117571fa6712b476c8a979b7e5ae68a18aac5c73a017a8ae2709663fb46f13cceb539376b3ce97c1e8aeab5e87386d1456dd2937adbbe45c2f6d361b1a65dc243d46e3270e0143328a7f96df6678d5e9b5120bdb034cd7b4e995c4e2be2934e18b2d398e096d65e6b595022c073aa9803857d2fca3586b2e9ccc9787afaac2f860f9bdc5ebf0a81882a161fe8fae9afd2fd4bef639d626820f17432746680c0781219677fc2c783fff044d2ef265c4f9ccdb265f070d4e84211971d9bca5da07d2787a2baa53663d376bc88a4a02d4cf7c99ccc20ae1a21ae60f8b7035b7c3df4e0c6def57f3887b1289aa1c0ac1ad38234389375900ba8dcf7c808c15d7a023e4c71c15d301c7c8042cf19b8ee4f00be6422779ed8962843e46109d92b6ed0008a20f5a1bef19d9178bc3a9ba97f519e9f35aafcd20a26165163a47149acf0b2bf0860d47ad816c1900f33150e163462ea93e631d932867a2fa36279533470f06a35df96c5875896c99505d76554b6977f6ee466d9a87a6a2db9253a43c6c90e19e761ce3bc4243d87beaa9021ed676aea1f3e42a3c03c1fb4f290c554c57889c752d58cf783d61035702bd59cc2f9b91c35ade834175d6c2599bf6aabfbef701c0c60ad012b4b666e11750233129d3e759cc36ef52627918b599219d5076a03271006b59b040875291b0052b1586c5994112586036b796451bff8edbd6620322987f6101c5100444acd70144f010d79f6c2a69e9085120f1858154845e1aa098481c6f9e94366598a209635f341de4e9f72c92d50b8c55adbd3433538ad63561a5fd0f0e47f32aa8156075aadc4f9f9f409d5fa3d086e816227710662eefa9729bc3821d03138e767520929447a4ccc8c801dc3bf4b605ea56da72e22ccd19b2a5b266ec1410a1fd8d0807cdeb71edbb8562a9ebcbdd285715bf88a9b234a0e6a2efb52289e3862607730096d5366039ea0d4b8b8a3fa1d6e99e7f46d233ffd2c8081b12819cf027e6420f64f8336ea2135074c200e56e1846737aef6d1ec4b73cf05da4678e56db6d56efbd6d338c7ddce56a6119137bbbee50bbd083ce1d3097053941ebddbe43a93e8d2a3a039acd4fde77f98216638343d513a08e6323b041fdd3e49c43c3cf15cb6329bb6a2ea7760f274e738ad99d90726af7fef0953733c2b0baa4f3c24344ce96b3c4a081690512a93ed4128d8f04a0a402107661c43927ef5e3a16a691c3f9c2faf566085a86195339f0dee8d92f6c8f59b56a10d102e1d662006d146dafc4b195929e3d1331ca6ca9d8487bda49466629f27d7a0299eb0cfe5409f270e30b117d861164315563119b41042a21ca5eaba61bd9afb3450a61e11426ed3ab6aadfbed36b63e8c18c55d9d27b5e1d2005ea25064f222b09fbfbeef5739bae4336de1c7b6f3322094be6d3bb8d57894ec18d4373cf067ee911c246850851e280ce3eac10f9945c56316198a81827340780569ef7fa88ae3c0304f337be0ce6bed4913fbbe1e040cc53eab301be36a691e0da2ffbb4d424b618d17b9776d197a954b332102ee2c0644a97e413e0bec848721f799f8afb224bc9fa9f00ecaf6ac881f667a9225062059c9df4222120ec40cdb1d1d18f2d99abcd869c2651b58b343be6dedc220b670383f88a91e7ee514d36d88b6c62c9ef3abaf652770839e8b9f64f347553bdb287169cc260fe691b44b673d6e21c57374eb5b24d3b221e021e0c90be62bd07008ee5d0907d5ef36b826ee2b08d607aee7b0b2549e32ca50d5f75c572e7cbfe7096669bed69ab00c39e1adf364f155f70bc2575ee8430b9af5f285a5f52d61754d39bdbea7093861165e6a8214c864c6ec697029ce28166c631d4e6c814fb8ff4071b4e3b51d8285e998356eab3141c1b7149c24568e634a4a61d85dc36dca2c0bb05833678aeaed5cd4bac0baa0b352769d8c29452089af7d7fb69887546bf88299d606fc3ddd66a283eeaa7b12a0efcb79c23f41c17df172274698de721b7eff5f6a08ed5e925fb6dbe6fe71c63f4eba3ec002bcde8d1e1de78ec610378e2f782ee2b7aeee70d2acf53069afb6674103ec7110d62c30a4865681351e27b8353c6d25c2cd672d727e73b05e096cda06c29dbc0ac09dc14aa22a7d3de599251cfb1da03fe03aad907d53a3439b7f172175dde8e0ca3a2ac2aad58db087c95f1821e7f3c0c2d5570274a178a249398e2786effcb790f60fa388e9cc4bc5025c60da1892dc41d9ff61892e14fb71f901cf56cc92d8583ad672974f03c6a31ebfe9cf80b23888f2bd737666d5df4f60383c4735f971c3da38d47a90fa686e1559e6ebcf5b870f853bcaab18f0188efdfcd225c84d30d75c98eef1d3f2e153edc8c67bb5665be513502c47d8cf7f3b07810d854a4b8b906f701e06f6656b59631d6b5385a0eede4080d42e3dff34a826c8c16928c097ca042f1821ccff4dd908dd9a942cbb8f74262479953e896aa63178d21fd648aab41ef333d802271e19ce2842be65628b4ba31e961cbe45eb0e499b881b2128ff9cc8c826d86011c88f7e1c2ed00987ceb55a48b961311361d05412bbe7f18d098e7ba8c9bde944fd0c39e0bb7476343c77e29a5263df584137316a0021a232056bd88b2bd74c79d4e01c12551ecb0982374015a40328fa5821f0c28b5c4f9374fd7641d619fb6d170c10c6176dd34590f4ab7c540aef2095bed85d3999c4e2726b83aa255199f8de40e8973abc7f762ffc0753db23086ab7eeae5ed12766e85e914e85a220d09d458077672457bf8ec8a94571673620f235acc1af679861a073fe71ff276139659111cd6324411f74b66a2fe083f079b769f591f4a07f9815296181ab41a6ffcdf5ca5f3c8e7516d09cd708d5281bc37ba34f8c0b4ee6653123c19e0cff015fdf3e418b2aa9c544406937340973ed12d75d41a9006efe2ce0678317753abb3105562c31ce60b5a817f929939a2227efbbae77ae6d3336ae284b33482668590bbdefb9333244155c08262fe6e24ebdd5a86a5c066e4cc18231a6dd0324a9786e09812c2aa71af060778783b3d693151735cd3ec927cd506b7de8d6711200aebe20079855242bb9d49c2cc2670f687431638068f1ff41d7c45eafbec3f4fbcedbcd67528d11ad32005cde3ba24cac88f3ff280ef4f32bddd233526afa7d5804cb3fb4ecc9fcbdab055b82cdedc6c3aa4b5ba15e6618b1b84fe09b756b72b8b768cbb85a585a55990e1771c76450e85b77f7b01c468590d838d924908f18e6282da1746543836c64b475179919918e42d56441e79562f0959ed5c7b99aacd7f2ac25c1c5859038916a49e82855b9e45a04a3f522ab6222f6649cc069afae4b1642dfb75227443e3452222bc26916809f0afa869a35b41fd6ea2ccddf29281e0ff447ecaa2013b76d3cb37e2808d1722f5e0dc3fa6679784efa604bf1616d7dd5049e4adb0905ba75ddc56f15ec6dae972e24380880108dcbec75e6c4dc387fe31aea81329743a8ff2731f284977b6dbc204a2c1ed5ef0834cc3dbe7447ba9fc35458d1fb65f3b79f6ab69016e10fd0323fc3e5ead5d64edda16aa23256c9f93ef8285e047f31b5fa0c9162594356359a36e167401d8c5078d4f0e5dc1f6b1a71a76a2a144beca69db10ddfabbd20eea6097e06bc8a2671cd87f0c41685a683c56f78fa33654b93f910867406f8f85fe281cfbef7ca7f8528cb230588966b45a45c005b7e8ad1dc73994c261214b7fe30a67c6032931c991cd806c2310c112a81c4f3a19ad4757afa07baa81fa414f8f66e819acf3c588965b619d520a27a10806f811236f53bea110d8cab3e39327d0447a02d5ad597846c9de516dd1df85b72aa510e7c741ab88daff2283b3d716389d08d4c7d182ea93e344492caeafe7e078eea62794f48d1ddabc15fdc2e930a97efe010e047899481fcacc00199bc45e6dc975b53724bb689803da321b466678e616439782d1d6cbbb317e74f83e3cab3cd4c9be3fee6fac168a9194da617d7d195511beb3001acd277770280411cfe1a6313b63531e15b38e7c98e76924a309839e40a476bb620c370a68c84101f4528df67083c27e68c11884b017bb4ba79313fb6cf898ad83b59d0764bdf610b8082310628c14ad7dd5158a332cbac39002bdf98e7aed41d42ee13f31fc15ec18e8db3905622d326a1c85b413d1f070dbd648f29f3627360a95a86bb5448c8dc3be854d4203a0ec930f800b94bf210416295349ea8c2e7e33b8145bfcbb321b4f33e0c3fa18c13f8d77fd4679ffe1307a0ab2c6dbec69189261ac03c17ae8a894089187876feae4e59be980549a9c2e368a0e799e3d133ed2d53033d8d72fa5af1a388409e3b3f1679482c49d26c79858c8ececb257118dde71e286fd6470466184559c7a854569832250bf80bb0115e8e0d2909ed49cee83df80969520bd2e3274df40b12de49bd5580c60f2703dad97c2f850902221e94a7a0293a938c6e09ddce9c45ee0760c0e46d8d3873da0653bf318ccc0c13a75f962a63ac6733de1d7e7e5c89480c93838eccc03054edd174e6ece2c341ce927a5a33859a6e19d62d1134a874f6cc47059fb0b6f6122f3491820c5c96b4c6a33fe5137b525d7fced40c5962d661a24e7531c3c64c69925ef8e8d95da001d56e776ed3763a04a35f0a493bc04001078dbe6345faa0ee924129c5640de18a99d8ae56b498200e2f92a503b692c846b85924e31e19b986086d41170ad600e43e7a157a6c98e81dbdabafd5db32b8a38e1b68e841ad5e00292085bf9661d2c3ce04a5691634a72d0ec8594ceb061d3225f80edc3087cf1b52ea577e38e2869b5cf59a8b81fb5bb86f4acc5c644aa7fbcf76cc0322582cf16be581e595924f6fefa29e9952a3b32b83201e62d1496d80ed7103e14c1b16a9e3c3dc32c92c56ff01c807e9f533c9af6b0e9a80ff6f2800f7f335ecc51bd873958d1fa09877b72a3ef02872ee1d74a0d4bbf3a0e3f13f369516cf54ce865f5ab266d3c95a8a7d57547dea098a444db0f0c5b8c9f3f7fa70f9942c547ffe44fb07b0166ed938f936c35f5451498664d17b90e9b945b8ec6eaf0f5a8b5f877a3206e58cb5ccf4f69d9fdf1250de1c67370bf039a11277cfd499fd31a87b40f9ee885ae007a682580bd6824838283cc48ea4a903765611a333635e898a02ee49961a7cfd1d54e917f8aac87b851642cbb905613b598c09a1c95c80f7138ee4892df913d01b4ad4304b3785697281baa77c94be42a731d073e16edddf4502618425edd54f57ef3d0b5bc25d4aeb42d4f56db6b42d438f71ddff71f8c5fa7dbc92c862be2268f22b1b382ccbe064dcb96efdb74d33f040f4fbc9e29d61f826b6d36857300679790aca887b3b966516aa00152303d6a1c1839c3bd2bc8360b63bd153fc16a370c358e1ea3e433f1871f293c009cdf1507622da07010c55ec6d6f643bcbec4e25e4d4b3f41b5ed0805fc6d41880d90698961a7702ef15e43666aff109dc205ff2b1d832a788e23b89df01d50ba00115d4123118840f3b8e71c591d7ccbcfefd5a0885bf6ccc2a3d54ad71fd34f1e099d6a6fd99aa23e2583a69f9581e66ea297a6adf2a221e3ce2ecf81a8fe4c1e7b580e0dacd4fa05f26ff56766a78d1792fa3b0a29e990c3400e646bf40600eeea162f16f01bb9bcda0769fb48409373e80804063e3394bf49d8c1568b51e231053e0335e66aff62008065a471817bd6535284041a02d2ece8318dd72ff2224c60c40005949575a157f7aa9fb585f8797268e00ee3f0f0f145e8a3512db3526b2195409b4ea4e11c417fba11a42080fc482b2ac0e410c0934e54a610ff982b7175403dd5a0e601ba97dd8e5c26d3afe6b369c1c859a07829bed40340e5dae23bd1f4c3b82899b51ee7b53ebd8c369e795a97560f1a19c20db3de3e1f4cdffe898369702ff2416b3c40def240bc7c48b14ff54289f0d9409011fd0d774c23d02058a2d417d7e508bcd858379da52dcdc0b47ba04c3decbb33918bea2c265ecc3fd97f179a2a77437004e926047ebf2406e512010cf011e667004bca52ac917ed67ceaab2dcb6d85d41a15a5120b63d0c0fbe28ac9c2e81cc7fc8402690407526b9e01f2a9c8b7341eede2d534f722398eb848fde37d3d68d6c2d4fa817e247923deee179842b670023a97082123028d9f260d2847c16e5d761f3075ea63cca4e62381c3e536db1092563b55ab104a2aa616a9d486fbb2888ab43b5c60f5af39e575f17aaa318b0c634ec90225b0640ee6c9885aef37e83e39ec8d6b3c6bca39646358d19ec73102c230062893ee6ebab185fb76b4edd8f2e364d232a85e764e87002fc043f5b8b22c92785fe4d269c36b9b36c2ad6c9c33b01bb6d39a569b98ad62901a7dd915a3de8b2bb5828ea1c31aa9f4ad4231c4735eabf4266247d19cf90999ade8611e0faa93ceee1bd3bd785c93f15bada5f6a364050e20633095ee6e125662dd30c0f613b3e339e99186389a0d8064bf8cf48ffa4b3a344f28f728d139a94aaa91ed3fb1ae688c36c3b2034f58bbf5ad31cb1987b9a2134f0340efd50b51e7214ba1205b6fdcfba600f83d71429266e6b06a9a42c7aa82e0c9ece80a8de8502a29a9ec5247597dbf249f3c7551f0c9548c24c4392fa9a5975a22d8430528ea5447fed74b8ede734c1d9545f2f01583872d181566eef0840387ce42ade3e3342515ba7c822c25938c1b8f82f5cf977dc5386118706a25b306aa13b9d6cffc5e0918fff34224214c477646a35055aa406e2ae6a8b7f7eccf41ab2e74991e11f8a6b6b4e0f1bd3291e2e90f44fc241facac4a82210f1242319360565080c61e3878160906a9f2e2412c162b5451744e28ac7edcc916dbada368e2428be90571a9e5c489ccce9a9377c0c1ec745a66589018fea6b25c76375a5304b50cd111578ebd4b3694216a7132b5756cfafe463740721066c969bf9e7d920d9ff9b3554ef95d5d9b3e12a5df06669782f5fdd5e3958ac8ee0d407a985276875da50f2284a9a419fe99091014c2f66b9cc825ace9b8546a4dd57539b2f4d50292828977401b210ce09bd204069ce4ae475b159bacdaae478690672b9b8e8bdcfbf1282ca51441a0fa10f53e71dc15dc6cb7c1e479998cbd583c0d348295a13ad13df82afe451df0b87148436e5d3c13ccdda83b1f7bc058d2d8ab5d6afc06690708ef9be5f6ffd703b9054904c64627ec595768243ebfaadc472d87e7dbe5aa74fe3ee77968d5bdc090e4709637edee2073c88851024dd06673e364d0280aadb26b3c53a847c092b3a5284b4fd987602cedbd94f5b60f1fa329c2d575bbf005b681442bf2cad6b61ee36a51d19d4efbe210c1878f7fb61a09ee54f5b7a72bb89ee16ae066e31361e2785d63d8f4cb8e77f18d2d6dcc8b06ad0c3010c809cba2f454c4623027585a4dc78fede35ed4c14f3a69169ee8655e14f01a1e10df54ce9dee9b387373884ce1b76d461c9f4ac0ac0d19bae2849d5ecb0fa1b94ca2333599ea5d851413e8ebd5f02a209aaa61c0ac514f26e1cee607510c882d96574d0f4b8f89896bfdbb3204772ba12ff90c72bc147d4f2d735ec0b6985726deaad31d0f2ecc14714c740d1a61796a98a9c9493d358cf019f3f6b92b13a5a0a7a5ce0a66ef55bd651b549f9910bf4cd873ae8559acf2d1344b02e904771cec9868feace85f2579fe2443aeaa0781714be22416d009ed7cee78ccc1d55f445475d671aecc7ecc226bfe8b94ca1d56c30d2ab2e47d4399b3724df8e405773414bfb76a7dbb5130aba67ba58a951f75de992d9430d6e0246ccb2e5b3f201a77a2e53747e59f4420ac484e16d0543b6191fa9b982bf1070ae6cf363e7436658e09d087b0d02ba959c34c8aea55e883525f2c19406dda90712cd06ee408a2fd4dd143907a04ec773c0bf8bd04aca935381071bb5c495f765105c18c5d40e134312bd91dfd860ec114852b487c29d6fc2a39d42a581e8f28fd332e8c5f1d73191c61eefcdb25f621d5e7111c528ca056d57a284d3c3bc352ff9b428394e5afc8f9a26422702a433ae04817aa0892c0e586244b8d4d3f314763fc2a471820498e2498c35a3d4d00df8e2ac81c0d8ca4fea5423ce1a83d07b23e81c069e11470623adfad0735ee04b60368a5bc54cbbd65d810b662e082872a6797149b9b8dfea4a02d22d900e784bdbd3e88b2d4eaf78b751813bd75505b1dd78e0fcbaaaf380fb5b02d6d6ad800adf3d40b076dbb2ae7e241a518de97507d43aa190d0e21d38f56c2bc1927847f56c359b150103a115ed9796400f43f374ab54861657a19cf21d4f015a02bf5f8d298c666435c9c80dbc95f6cfd01b01081512f59a4882569988c21601e81f6237dbdc5428e9123a5911d8ae16c029ab586a9b451bfe36f7e0c506d27abccf18f0cbbe0779d7c7762e90b40bd494d1cfe1a5f20e20035f84f2d183bac06fd077005a10787d3fe88f4dbeaf06280aa80f9bee66053a537d335bf81d5a9f36be9b8159a63dcaf15bc79f99ee6d55378e38535da0eef32c3a14963c9475c23ccbce32f9eb18d0357bc51b8ce3a316bb80f546a90c96f31de3652fc3888de3a2e284f35516cee2fe3d4087041f4b3e99d3f3146611677b6e38b0244f229ce4327f497442733a21e6ab07955855cf5a69a9da7c25f2af16f0dabacb08432dcbe580effe8ca94cd32afa717c3aa191a667e0f62537310b9cf5a4b7a1b51edb02a2d8a91f853ad2d41ca911c6552b6640d4313137bfa4a225fccbbc5ff35af3b1db7b87435b38e58cfdd03d83f5a305381960f3b2438fa474b212b5b4c73e35b94919b3408d6529c9a8d789d561ea81d3b23035209569487bd69195e7355d92c1fdadd2cfd6e62b26d96ca4a4c6fe80010b54269904cdadc5d06ad4820ec4550e2619d267d4d3493dec8f962a56026b2ccc18006bc9b35ac1b360820390098c7372d12e637c0de48becaa3203319f00382d64b4c8cd6e45b4e0ca869aeaf22d2600b1ca2fe7d4686284ff80fb581956525d80bfd658cb5aec922fe263a7bfb74636e6f015a94964400cba5aadc4c2c6bbce4f3540e89ed22103d00ef74d66f7481700735d33496b3850f8855086c864014a030dcc6ca8124d8ba8d9e7e359eda285c0c2fb8c0df519ffded04f5fb4d8e0bcde21f2911518e0a041779c31ce9127e7e8d3f7e1c2e2b6dd60c37abd803c99a0fe9f9d6f6595e6a163d0e3c966971ea46128a0fbc97cbf652f47f11888663c9c570c76691e00ef4043640aac4dd0250a60ee591a9109fea7d7ffe37411ac2a18df780a852c983e807260f4fb6572e2a70dd78431c60e56f33b0922ae0ac7e27dc20cf9a16223b0546caf099d50033c97ca92603e6de2df7d4d0dcd985bca39ac87aa0d36a571883fc4611dd0627ac17193fb9a921abdcc97983d068efcc4ef9a1ec22d7af5bc97c50eff16f5d6f9089360fbaaa8e48ab6918c53b531f0397e0c2c49fea8ebc67a48c1f47d614090feb8935405e3968740b514c1e7eaee1d7a52b2a5faa0c2c43f40a8ef4d15fc5377cab23489717ec15c38aea57e7d14a147395c570f95e86193a637ed3c6453c2398b0923bbf7a34ebbe1f88a54e4f9ff35ec4234f90a884121cb4663dd7e3d3645434a6c99667842831f7434fd58d07a5214f64b14c52c1ec978c449910ab74b13d64aedf1f9ac4cf0c1224793a9be3080cdfece993bf6813f9cfd9664d8c5b628cd23e0795459260b64e77014d90cbbfa839f3abc9c386c1ee2139211a411590ad7a77e023d61c994c10cb0bcc62dfc463f4b05317e08dcc949c681b3527373c06a013ff107ad8a7b680d97e2d4f3c42b3435af9b7b3400379d2992df7eb67bfc46f2bbcc71b1b8570fecbefbbde5c8d511cb09116329b04a92df2e7d169a76443f3a30516c82f6de6c1caaf620f0d712ccc36ce138760d1a202ce7770a79e1d881b8235d9096df8f893cc26f24b77f49f715502b0b23fa7f88af16b0b058d276aed9dbe6031e92e3d92f68ecfedf4e0f740140cf01b106b678393106049ef5ff6327c31eb359d95106ffef7196dc5be479d258d410ef5969c2ea497ebe79e17b336ad5bdc29ce53d0e169b40142a6c01f001230f0eb6df378fad9361a44f69b0ae06fd4087c1921e71c10e9997db1216ee07925bd4893c261ccc42c08b86c1ad166d9e8003af4fb95c298c79e015f4210a4216905d1988e803cbc302d30f472b4a7ab6781eaeed808271392c15bdaa3ea6cea5d9b3c8ca5566912ca02c083b7b231a042d2bcc96efb371152094284b53320e5865143117628052ea5061964f771512caf41dd5d22ad42c97c413f53cb84495ab424c99ce4ba4711c931173a0b0d91e082923ea4cd177e7ce55158774437836d64558a307e3408bdb35c11c178062025e940d607ec0c943e85cf87b8437c76fa3360f6b722b99e344295be5d7a37d9b030937af3f3ecdd6176d3061c943091f04c6bd380b9675d66640e1cd2feb9a4cb376a927307abb73929e5ba0cfe6ae81ba6b5b187b240c37b4b739a896b3ea97be6556cce1ab3448e7d17ebdbe820137b50eef413d94817ed2d18bca22c7493682b5b2c7f8318eb1652d831e3b033e86b4851dcac392936fbac5b9e590a942fdf6228396f0c1fb97179e06476dd3b93b9adf0960b8980ecc7ccbaae75fb4b63b68f7f460a9bef1c211ae5448df16d919c5ce9ffacbc562d2af297455f33d1d57a9d2b8b7ab01f7af50ea6de284bcef8523d120a3b6df9847722c9a7dfd1248065cad4d064e37f0c25180d2ea7700fe2f79a1fe263da81af8631f67de7f6224c03ed54a5013288215020602bb2262f419f53b5b1dfc6ba8e81319a0aa2669d3d26f3ef2e67fb83dc6e014ff95a3b4445cd8b9678e3152a0d30f72c011ed295e99d4bb437952d9a8794ac793228914eb862cbaaa66f10467d3520bf2b18ca9761085ff9c21b5332bf1679ae215e2f0442ce0118a80726960251e8133e2feed85fa32c627cfc571e3de72f588d61b61bbbe49d84ecb4de4c950674d5b74031c64c1db4a17d35659a765b174e7baa76d081dccfaecdc6896ee96bec7d3e904fbfb7c55fc8f417ebcbffbfa54bec61d85926df2d9687a492895a87b6f86d3d7f457675b2bac65d395302fe1d2148fba4c460ec2f7478a82526f327e5871b6ce48d966150e6bffb2b97781467741562bdcadaea6fa9d75d3c642aeeb7e3af9d5822f93c2aa5c3c3e67a6e283666dfc3bc0813dd0d857606f6dbf78c2bc1c489010b0d00f1ea0069746e114de3e276b167b5000849e07b5556eb0584b33611d771f8ea9c2057d5bb7d953de558b6869c8bffd894eea3bacb28e39259fcf837dc3550f5f93100a46cf2869a7e1321939ce8fcb4a19e521426cbc838cdb2491f41183874179c3589f382510fe1f6f9c438a0d38da67933ebd7f8d9fd0ac225322f46c32a3a2db6f2ca30be22b63c57b4a7c6dc3088e20ee2a0473fbc39eeb7bc958442c719ccf7e7ee44c99901060d82b4402f8efe656d0bf23028463a862c71e8c576b91d0c19d7fd2fb56be74c84f0b18da1618e1dc8cd6b515a7d19b108227180d189ee40abce2f15ce62243679585d6428a055e8e8dc38433423b034148bccaaf5970b78e26665fefa0e4a8768ac56ee834cef9536bfeec6175fc80c1c0108e1aab20aac66b4da27f3fc8e93e386b8b9b341c34012763ded8758b75572c398ab139e53590eac392812ac93df87ed5136339f719caef8f0a451608709e91e23befa788cdbd4397bd7d30e0fbdde548f853323e1d88abe9e64b62e57f0644ef68b488835b9c741f108904513a2f39faa9d874e8bfb01915d8abaaad7feebc948d8e4468b921f60c0417364c861b0b3a05dd114fb8acc9a389e6aaa2b53dd881d100ffe2710916ecffd6766a6594a8d12172db5eae3456d4018442de96b9d56921f476b6c9dadeb2bd6bea5e3145dbcff25601057d340bba9aa0dc297719f0c0551599ebe506e3aa08df126736385d44182081bbc84c645ad1b2b75a635ea40d8051f954eeb5e2ef45fcc42acc71cec900ec5fd823dad07a6658fcc6f9be80fa037807962ad45dccbb0c7655972eddb58245872fad5c5f118c171d54daa9323b626e764f71efd95076d39018be162bdee544694fd97f97f1c6dc098a1245bc0f7e1d078e307e264ada0ffc386d5c28de701878342796e9aab18157076e563a198e2888c3cfd62d0e5da088e9a4fa07701da0cdc6fe5178e8749440a0b2e2f453f6a643f6bb1f8efa3c66f105849b1f6053165f8100007da66ccf781f18882b78baf5d98506f96443253ca6e47ed52d3d0863ea458cb8cd842a038be32b65934febe6b4b2554901ff406c0898e3065f7361adad835b010171eb7c0b8afb31a04834b1bfe70dedca25637713398afd1fefef69184879142b0758da3341e55f1acf3318bb649fd7c3153693c2ada58785118e12dd520a999ffd549b69681463c8c628519da7d9707dd72568e16552e18088cf61ea84b3dadb3266135e4af8386cbcc0fa010e2875235f53e92d9c679d2e30c72e87a5c60eb147b879b43624ce752c4e79be65514fe80424ccd4788780614628b80b2572e6cb716f4443cf4d672acd17974479a965ab6a4387e7477ee12a6c1d9aa8bc187c6f788b650c9fbc3255ea354de021ea7b3421eb05718c88d3d18b41f67b311adf7881993cd1c3dc340be13455c8f9da6617d288bcb407bbf4241832641b171ca4f95247d304cf15000e92f687c006d7219ded8b5c0889c8163484920b803acb9fe26529156a49bdec26fc0da9022cc33fca8041777ef6c945abc05cce3770460ceb3333e90b639054acc02ec8c5b4820acc91d5bfbef37e3abdb7263d9c217320285d50fe60da2d2b75c4bd846ac477442e50bdc51e793a568323e540d29ca83bf8d6a49eb4ae91ac2bd31d6910560ebe769c85120667f4a30768cbaa2104058287db66caa7c73cdfd57d0d5c2d5380878c1cd465c4ad5c5a60a350f2603d9307e68e7b08540715a5cf119c9340d3b2c54ab4f8e9e776e3232ff7254cc277a5d953f03b2ae9b3edad22553308f573e2a54c2920d4c3e29d8601d80e42468f53bc5d280388c0dfa8f871477f9d3cf2dbe385adfb1762b5b23512885cce6dca8ac3a75073773a2aba90514726b092497a4f52b7c0ddeddbbfca0bc43626c5afde3b7e83066569258be8806ff29dfab7b4830f4043f8e6c1130e1740776008b0adc65a20cd40418f7d80dc3f2d457c46a6c13ba085907eb695945915c8853818d74d52128632a6b5c2ff9dc90405bbe35c384a8b586d0898a08f37eaef28ec14a7a5a7a807a32d041ffae4896071b2e38baf33204165fe0f47cf10f5189ae1a80821e484c52c9c5abe007a6d0c0137cd1064182aa5f77aa56937e4af12bfde7e77cfb2a551dd106ca29c1fab0f1552eaa848ee53ac3cbcf1069f667e93f546447f649b9785a04c3e83199472d5a3a6d2eb7e735994732c75f01c88c6a2a9b8479b196b9ab3361ffd86b33cb525cb4a08b77261c05d62697d40dca31bccebe12b4d0a73693dc26bf7837b37d19fa02165d4153b3b3a59ee2d1b4d3a599b034dbb9fae689ba3af4667db1f4e56014767236f14dbe8e7f68edc599ea67d7d6e79cc9fabcb75ee73a24fa4cfe7e62072b781c352681065e4d5d05554ab856572756fbc76ca1632985f270b95b8e1a60d9e23f2edd00963f7695404d2de0b8384669f5e96183aed2bb1435b707722943f1dd08bb4325a8f4e9b0b53c06149f5a59593aee572d7970644237623d2ae740688a2f15ba6061a891a1de9a2d5f8527ce61e078ee19352b4845209bf57e3ae231dd76c7ee9ac72f3b9905c49068d1af03b22872c6f05be8b237c523bbef9eaa20cd6a5e12a9555bd9055ce8d68898466e637e85c0911bde7fea8266d42c125958573b34c61f752503b24e6e9ac70e0cbbfa02e3f00db3a1195031da528b214286891d2b3204386d453eaff44e8fe381111339dfa01eadf924111980584a8463f137858c88841fdc98e4932cf8bc58dd41391d55a008b1e3fc8542cb19f5a75857d7e12213f2f58835387f68eba9b1480a65555a2e303d8ce0147aa08c85d6c770b652a71a1d3339d835f663c215b7fd181e2cede1b506fc8ac25270a64610c144ccbf8656629cc3122978d21ca6b1ea87747a23a1107893d958c1750460b1333138ce5f3a54487ed0f45d52d801f13525f34783e861b9642ee9c9825f91a18a8a405666ee1a182c44fea326422187300f7db308daa977030e27cc3e069630a8285df60972044b865d0d55e1f364ad077e73ea5037b450e7cda7c76734591e9ec3f57fc0e5712248357bce028014091fddf46a30b9812101d4eca09570e73115fb7b95b36d668211dc9193d105bc5c12a4a2ffcc2a02ba1d4da929f1c2665881507257845d10dc7517cf2151aceb48b215018de8b458d7713934f83fcdfe1e7a05fffa104e85b7188f35cb1bab7d173b4a4092325102426c72c8a594fa8d51c4582e919e12a0a066b370d4cce6cdfa40debe91f1d1369b8791fe7a56f6ddf832160382852849c69aa327cbde97505950bc53370aa27fdf24793d1de6b9372a6a4f801a5c8de6205bcb7da0b44e02e2b01621960bb39ca04f98d398d280a9efda825d8935344a0510e6a7ee855fc2295b2ea247355ad8ae7687a775bebd563aa3f794b24cd6ab6b761f0c86b2e152bf6ae97e577c086974ad9bd0cbc5b8b44e82181a93fbb94584c248cfc8745dddf42ba4b141672f11a85e0c56bba821d67f95eee28ec827a68d473b6e9541ada8ec2d1d4953cd0489bbe61885744d4a66cded9326d39a5bfeeced599f5a2fc1958ae6ea10c7ffe31616511774769d79de2e46bb3c34802e23c8bb6b74bd5b2eb933ba2b4fe72586a364f58395dd070c509262caffdac04ac7189d002de1b0337a559698a4e61d7475e9b9e43a005095c2f54082c3639c1b9f72957cfa6a7b93e9382961f40cd6732d1678f152f166309e6f00a140e0cc03a3c33396448de2546d11b10e8fc0d5cc22604070b86e4e27dfb41df7d0fc6f0567a164420c0fd531f3a2d3d609f4c87bafccd716921b567c85852b027f5ddada7b44e97045ef96797003bca9f3f8c4f67dd18f6ffeaf805c44c27ba6d4513788703733a78e20f579732b370a76ff3fedb8a91c0f452a8e8d7b736cd107881522022855dbfc1ac1ccfbca2045175d0dfe3c88316318ccb6ceef98e7e1679283faf86ec81934717190f2f0fe8cfe8ecafdc372fc2d4015c0648768b23547c095713adc00a99120ccf006c522ea79a3709d38ca697ab7376551bf96079a271d4048ae1e07958863d9ca2b967991ec1917bc304fe39062e2180de43eb73163e449895d00db896aa7603fb7f6e6612a80322bd60b2987bec967a22fdf30adcd296421fd6901cc28f198392b6e7b54895f3efe94160bc26c8c9f4cec13c53c68242f7ac38d901c640adaf64928962496f7ae736016e709962d622ad93b52afd4394ce639d929b8f1bdf2e6359738eefa1dfdab077f04768f1f42149c9e4e40ab49ccfc79146b40e7ea2468353f04c6d51c75c9b73615f524e732f15d25cbb4e3c6c41b16a1a430801b197b1393f58302d439626eb4912986449a2c02e2fe2a401f5e62b7184f86a41ff396ee7f57cca92932c861389a69b3bed6af47950bf110f94693e332b0d2d904f0100ecee1bd4b453ade51931414ed97201b006794d15569af1bba46f447984b62934eeece5472dbf20e113cd6d390495ff01b0178dfa70c5a0132d02db0ea12a2195c1ca4041a149efc11c80081ddd0d7f45c321f355d34836460fcaad5d418f0f168db42c0a99f70ceea798bac375a8bb6ed88a2c48f08cbae192086d8115cdcb8067dc63973d6f97426c732217502fb3c6184f9a2f5505b5a0fab915acd8a039b3c59eb93d9821365b0ff24db47ad22f654ea3215324b69b17a6207ad257e552bc4de35d8f7f4f27f017bf9aab5f6f8d71e5dbdff0ba027ceed9d0811b320c7f0576e08ec1cb045932bcbd35af0d65199709287e85e6f0ceabacd105178392478845997c73f60983c04e7972840efa879b79042379eb3275d099b95f1b35c32002bb9c9594967f9d53a65533174785296f51ff0810616931819c66a2162e2b6937ec44660e5d4a8723170ca8dc4fd2e09a81d551362ac49fe27c28a768177da272373894840bb79645fea7c53fbc691a5be0aa1ed49dc6543f4d4a6949ea429d796468c0e162013ec05bdb973a3ffeffec5ba74c1d275c9f8b440c88d81c763f3cf857bc0761b74e775a13a4f24b8df00668e14fee7b65a8269061728819625dab058cd65f6a0def8e0d7c527098a9207aeb9f41cc4e65dc668c19444dfccd01a0d6538c780e2fce7ae21c19578f874b5a4adedb93dee201cdea793eed2cce92195ebce6a2b2e8732ed6eff99d2f8f01fc5158d0cd77cb384ba4f696d829b33754c397421641c77f409d8056e24363c310fe4838555a569faccf28d0c64b0926858e2f7fd0d839db70d5dfd8a9bcd5cafc33d7be2c2a18d68b075a3472df0d0c96f7e12fc217c0829505e716ab770d9ce69f320771db4a64ddeeb21bf3c554aab51a92ff6556db124f43b97ba36c3a07c412afff26cc703171bef1e0e3dc8ff1317c44c47b0eb4fd64d3a0f71db1480293954dc53651c1c5cd0c376057b3a8f6a41084695fe214528f0930c1d721674a577249ef98a705f0ab526c5c6f3ec9a719b7fc57dbaefbe25d26fdac3ded5675a34419a80cf7d1587ca40476427a68b0c91e7843623aa0af79d45f2ccbade562c0a0eedb35cfba84c8c4c31b55caacd7694fe0b458e8823ad6fae29aab97c77e40b2b755b7571bd5a56063af3dedf796385c0be5e7597604e73506b7cb3f89dcf248ec82d1b874cad7123922e1d0c086607d79868e0dc71aaf403810d69a84570cb169f4af30e7acce7e43c8876f053a37a90237a086e8dc58c9d5f90fcff23eb25e3edc667b94591222a0688630e55af8fd6be356c2cab2b662983f76660a1d25bc5925697c180296455483a35ba763a522219183990852fa66ec62e4d749986c205b43a085f808623d74e86e7f58582fef5b8501a93cb1edc9d8fd6772313d8db1dab86c1d7a5785f50e6011682165afddaeaca3ab53cf58308ed0f2cbbb408bb8368ad89f5b3b5ecf01d85274a145a73aa7ed7f66644f10730c3413ea3b6c54718579824185a5ddd417e9a2224ccb6e1f0b2e3765c5ddb7432cc0e098c9fc237c513f8b25973e8a2ae563a16f11a9cb691e407973f6e1493d5f4d8e4d2a8c35427bb67c7ac63695716e32c34deaea13e2e2545f26e1c7af57e0e286f1676ddfef6350f503e287d0cc277f836334d81d9be50b433cfcf2a239f40a41b4584e6c5b88254590381a57189dc42675d2c996ab94d5f2676cd278d2ec70117a1a244ab98c4d2afd6c0fee4fb0ba1af111bd376566fdd3039f22fbd1aa0e6e16fb61b795202c8d4272a3dd0827f8d6ec04b11f97a7e11613fb37cef5d3ee2eaa506c598cc27018f191f4020f6d6ac04742d3540ebfbc6205c105b90b733e3ef3260e10488d66d5a81bb0cc55973f045b31d8fc76116538dc482f5fea9b6179dcc2f48d09ce80dbeb7a456b211143df366b4d9528a10cb718cc1691972fca651d802d7c2cd97cd42448808b0f3f502f32a2e37be32bdb7ad80dc0156554cd2d5d6f40dca4bc8c58f20ce5cc0701c8dec8b7ff4f7cd4717d6285c8a44ef3f7ec592c99773ce7fa3edc96f347e303e2ac0f5dbe52fd823f1ab0698816930a455552a49155ed520343968667a6402e590920cfd04159e8682fc94aeb24390604e0c69afae5313951828e9c7d010ad643ea35cc98a85082165eff7465626ba70c279a01fa63de9d3f6b8e612826443b15e543125c9a3dcc917383116104bc86aaafb50bc6e466c17a181654fdd30432066cc239c6cc168fcbbb15146575c77ead50014f5db4bb06e231c2d771398ea41571db91277e16823bb4ff6cf825097b7736d7a906311cbbc8857d44617d8c3c3ab708f9ddd25a5d6a4be5d4dd7b6c34d521372a56ca407a89feed43fa76fd4a9c4e14cbbbdd76e991c99ddb291e836007f3d030a2990080adcd0e6ab13d0fa22b398e77f0eaf5314d1b093626c0467d55d5429a898d074146891f8214803a3a3ecd0fb25e8c82a8be4f323c014169e31163b68b4fe303b906ebf39e031cedf1beb40dc6318a3f0e589fa7bbdabd4004e1100ac8d832d317ec2abb499538179be137a3f08177a3bfdf70085e82ffafe69830d670b17d1448da05de0d1bd848e0706621747681838a25bdd8fd0c9e803a23bb6ed920bc3572a7c218b55b8e8e947eef013b53e3fec1c28546c7eabb2b39093da746840d2211e1f0df9ed6c90a179901b57b11ccd22c643eb475d418bd97e5ae5c86dbb9eb730332a162c8415560fdae6932048e162a24684ec066161120761fe19082d0abb270043070a602e86dc93762d162822f913161fe21a9042c4a03aa783e8a58208a61461da55d499463f4c92dd9b0a832f51ca5b6a8d4d1b861a9ac9cb90c654be53d677014f339232520e234f33a38b072a040f7d5bd1f1cd38cdf2edab53f6db9f34bdbda8db93f13a1c7623c0db2b5bdf79652262903e1078b082e0842106a131ae6014f446dd760db9f83b9a2002b801e25a4c9020c0b2d564d0a1b8b6d7a21bc2258185f0c5f54f9d287b529cd79b80b9ad0aca44d68db9f859185170bb0266353d23279f992d3d858599999186372fbe77017e0380c3b0c89b43e6b68ca617835751b52098108117113815b61be081c0699c90306b6d5499842fa4ba7c418394ce57019b8199c02ee9f1272fba35352fbfe8be155331c516a12a552a96db51d7a9aa55ed50f91f11087127ead4f4e280828c579f0514334f21759f45b777d9474cb5297a5d65a5f7daf2eb54ed2c29f538c1fefc04ca4f7b3937096903a76dcc2cf5b7aa630ce804fc1a89c73ceeed8ddb19b47acd65a2725619ec629aee11d4eca7f49d039ff5942ce39e7abf3bd67aa571867a7d65a6bdd2267f3cc0cbaf9f810aec87d43ea53964d28488848eb4078f8f0632444e478487d2aff092af585f8a0100f95fafe6d7e7b2215f76836fa7003e141f77e7b9ccd965d8808bdb6da97aa15eef4e1fed560eabbbd4f08f5092ac977fb60ea2bbfb61ad55c88c8767117d538a3dadae26603a15adfa9de8d7a78a3b75da0e7f036bfa1425fa4123d0835e87fd4a1f7a002bd91cae1756afa1fd4dc3b0d7d0ba1d7c0fa84887c455bf744eaa9db99c040a92dca4a7569eab2bca7a7796ca71091890da4838a5e07a4ba2f487dcaaa01090109117d905af423c46128284754f4f7e6fc3abc14b49aa0fba0cfbf33b19a90e542f7416f428717d2445ff418c827830d10706667323bbb7bd0b53078a3b208788983cc81360f609132fa403ee86a841639108b945fabf7ea06b9bcfc424676aead77ca22e5a7c048eafa6bfa6ba6bf1ba16b0b22a2a2164fab91fe0d6e2ff41be03ee86d45aa11fa451fc347a41aa1eba3e8a76ff4317c53f9efd0ee7ca471ab76bec60b564345c8fa0214d5404ff42e809e688591557ba3154687d508fddbea22fda215866e3572babdd0e36c42aaf5991c3e17a41209ad44ab0ef3805e03eb034ad7736742b51bc867b5455969f9f8f39b27b61d648cb13d7392841260e48c31c6782a67bdfed29d6f1ae3f4202e367b946e9fdcdbd7e554f7a5ea5396fe27a8d4973ed4e9a371f7f8b2eeffa84fc1245ffa50a9efe77f549ff720bbf4f3d7e7efbdc533e9d3d327e86fa6cfe3be054e57b4784affe76dea054ab0796c0c1bbfc595b72cfad2d1318c0b982b3041a5e93d2c7cefbd30d2d28430ec0714cc49cb2f71fe9c5ae3fa6c6f7123e4d58504432760401f6e84545ade2d8b0476a95c1efe1f7b957e3eb782dfcda2d74b8191b4fcdf2d6ec01cc17cbd626037fa1d926e48cb2fdfc4b8118cf2fa1c88d1e2e929e8d37f02fa9fa2cd471d7a9ccac147005d8a449ffb0d88d6dc6a647eeead6f0323733572f2f9dc3fc0e773b8376168f5f907e038ac16f3b406d6f714f440b97f4a73eb639e510b9fd7c0fa7cd607483074c2658f0fb7a642aa0a5548b5be54b5be1febb3fb66712b5ad8be282b3ddfd1134d4ff34f20f6f39662133ff92eed341fe3a8d34f6bad99050e0dc7c5383d68683b737ebfb9b0997f5b61649c8bf36d2b0c3cf68214d077beed544d5587792dceb2339716bb83d9ec11c6a75a9e5fae30766704dec9fa74707e3ad487d5103ef51e08f86d995e802dd3f9123a81defe06406e4f8fb65ffd48eedf096bc437f59e7f4e023490377cc7668f4e9fc54b66e9a2565bd3f26bbb61aaf5d74c34183bc7b9a87db9c278c7e11f0127f5cf3e54b53ead8670d1b6fe6c82804fbfd72d90cfef033b7fb9b32fc9ebcc47bf0b44e283a40e448b4c2a61c24a6bdf3f61008bc418c87c8d53f574f3fc1196097df3df2e01fdcd4c4dd3a8c5f5c5f0d9b73853b51bbff9f3b35ee0fb67ea5e1fa1d0be7f8b5dd7f8e383c3e17038f3f708256c7c2fd081b0d135625df22629b3554ded4bbc41fb7e15dabe7809fbee9f262e2104119280edfb24dc24fb7eae6b5bb124c7aded95925a31abae8b63c02761defdf3b6feced4b6a26b073a36295ecfd52ac57fd72b74de356d7ea5cc7ba3d2b4cd2a7d33fd5daabf6d7e9dcd6f6dfed3e6ecead16787dda9eefde6ebeeee398fdb1d06a791d618638c31c618eb7cef4d80e96156a7dbd9dd6979790418dbafef5e77779f937f6b8fb28d34672f31ce18e39ca59ca70e672ffdadcdd50c7cc5cd20839cf1cdd93de79c331c1f1a76b8bb07fbb7d276beadc6b3bb062065a06bebce226108fc7847f6ed0eff3638daeeeb0846af5c95338ae0fb4c1466ea3cfff14abd037e1770f76cc739fb6bcf7963df00cef9cc8f71ce67b9c2b3d1cb5d27f93f53dd3f1d1d41a5fa7fe7c667ea615722f71324993861b4390af0228f0055d8a4ec5845fec1b79cb33f12f61376f6dbc53120db1dfe7c66f78b3f67f7d5fe6e99dd4768f4f29c73cef9ec62d3093d497fb75c2ee7615742c54f60e284f5b26016cc2dc5407cc3f63b8f2ee64ba7b554fbe7605edee53cfda6ea57167b31c48ef497cdb299f7f0955f75b9986bb9d1c1f8d1d3f89893e53327af6730dbbf6a99f0db0f4ab0da6a9b92b5c03b9df5ff4e7f1256dfeef0df38d8473735b5e97207f6fc9bf7ce55eb5bf0294f9aff773e25c096edfc7e1f09ff995fbfdd655e7e543db2bcfc3e6a4dcd9f84d337817578e9e7f5eff0522daf2707bfb30869c66b6f878fcab340b6c8a68e60404dbd3683df3f0d6400b47306d9edaefc40b9b3e7d7f9def55a24fc5b7f275c7077761f5fad45c26fad8f307986669abe2f83fba7b369008ca4bf736b5753bbbb6f61608cb3d10bec2747137bdbac91e3d6ba5bebd6fab5f72748ba7eefbdf7fabdd7efbd41da68220e39e78c31c6d8ee8c33ce18639c9ae5e335e76c9dbcd135b8b0975699328b9e1cb65beee604b97f47472eb0a7c5ccce903a2ab4e04485364e924f6acadc01ea621a1a552302153a2e515728aae322659a218ee0a973433189111b26d0050b0d1a3a3db03ce119e0642e38e40ce59f2d43b3475b0763dbff7412669f5f351fb61ffb35f466f3f95de1b67f87e7314d634f32774f023bad9dedbba6108ad89dfe9db943c2e6167173655c1976a76bd420e3843df90078e903cb334d331927ecf95dbe2d9f6b0716c9bed99a88dac2f2b48faac2f22c2f1f63106f6a92e5e9b7a9a95185fa3683f43c41b049140fd91101865c1973e3879a29663170a81045e4aa871d2d4dd0ab2e65d8910add9729e5c79401bf872d9deecb861eddc4c464b620c97366c95344cf231d193693fb67c2cba6f92559307b445590e95e57bc591995b62e274cd4a4e5b6624e90d4a68839f9212c3d4d83e74d9d00cf5cba648d192b40c5016cbf5d133de89163136493b1fddb1d8124dedab79db709ddf7499cd014068ad147c28825b52f91100b0c09124a249264c228afa6b0348214d21149c8e394541772ff4e98428a788bbb40bf888bdc8e455c64092512bddd0700008f25388ae0d7c75f020ce053304a28354535acc2b9c7428f1f638c7137b1342759f9f8a4006982010880b7d4ab20192554130c9e14a8f696e6741e38e8c0830f421081841260009f825142a929aa61d5151651abd865f4020373144b334656b6d4532b5055b8f3945412aa759e8ff8acfece112f42fd857091db47247d4e523de851ae7393fed67dd357fa3bf735ff8a780a04f0bc5d000020c1d147f0f761009f825142a929aa61d5d5d073f8dc0b7d90f780fea67f7ffefafcbdb6bfb5bf7fefdf32ef9d7f912618c0df7fbcb4d4fb0a4abc56222142b59b8225d5fa9454ebeba9d62700bb55d5dabdcf0a48a43a0f2d5c6cc041071e7c1082044711ac2a0cdfdd57d557ef53304a28354535acbac2226a15bb8c5e60eac5a9f798e68e5db2fb4b3db502b584aae43b6702ec0c068554575a685dc12116b1680426d16e1ada99f49e15d3827696e653f6be0fedf5a09c3d54650ab3dcdb516c490d576c09d61dba27f6c5ee7e1ce18fc366bb8e6f396b5d96a6799e68cd66b1b5d676b3d65adcedaaa7ef2cbef6812cc61863ecf65a7badb5562897e3606dcd0e928f7ba6865827b518cc3ebec24b9e2ce2a508de3eb68fa7f092faf62d0dbbf3ff61a96d31702ae866be84839807c44f216c6fdfd3f8186afe55527e0d66993cfc8707b16204db15b23d9b04fb775f5c0274dbaed6962587219b791b5147e732a346285abe12d297ae8ea15252292d58426ab8bd098dea268124f74fe9ec1c2ae1dabf12c0edaf84b87f25a24a084b4c6d2f31dcfe68799bd0bc875ae56cdcb756c3aace7629b22866dba5b8fd356a3b71380c6c3fb7f4b602fd148741de4041dbf6c353265a3b5180694233916c42f3b501468ba4512ccd64df37d7a39f20ac026d0ac894c878470ac878c72dc4e146c6220d0bb21e0b230b306c46c74b6c83d96ee2cc44d27756d25f135a135a53da09a0f7ca1f1c0a3063b8ecf6d66b4db80b7e56146047603895076691c6cacc6aebcfcfcece3544d12c8fc0b6ff421485702bcadc6d84598ad51f55ed2531cf91646369885abdae9eb146c7eb87a76e25824a48cc4ba2a595785ad5a6b426b433dd2bf6bacadcecec6cfde1a7a89f12b2c3d54db83b5ce5702bcccfe130c85bbfede256d86aba172f861d6e483e52ace2d2ec9f0543e19489a409340b8098e716045300d1ce502451804171442186224d8aa71432c69ad07013daf0486d423b01c4bc13c113c2135227a86a2b0ab0531b19da6a1e3cdcb656add6b7a93db25e9a9e58efd8bbea61f5883dadb557b6bdf7a6d7d503d3f3d2292195924a67ce73a5b45eb101463bc25735c40dabb6aea293d414d5b04a0b0ba9821dd38c95d52e4821fd59afe2b94180c0ada8a1e83f920f7755752a1a312f88794e44a72ba72aa7610bb416694ec0a7a0effc41a8c1f7a937a727d6294a2a351aa37c497df7729e7b0f05d394a68454422a9929259d844e46cb74bebf93942ff5c67cacacccecb62a217bc50f3620d0c4992f7d787f13c90faaa336e0f63f75885b08dc8af223609286509d8a4e5a4e44a7a053949394d394ef9ca8b0aac8581831188ba3ef5c6c0c5d9d8456aa46aba1a5f992eabd7208ed7c0c426561c43c6701468cd8b9b200bb21fde934a97a8579f78dc99f466ed7c47d751aacfa7a6d04a507f55aa4fb1f54ddaf4a66cef3bf2baaa49ab8d12f7379c3aad1b6ed6e58edb0b56aa5fe073555d713f3b05ab4b56af58168db4080f8f041c90cb742091924fd29215734a15924ff154bda2bbfd4e89796a944ba6135b78576046a9606d617c16bd5eae9e8257881c3ee5e04bd09ad092d5542be10629e0b9dae9c881f54165c2ccf1f84ca22cc3e419d196ae7cbda0009e9eef0463fc2ddb33dfc0b215e7a31745e98652a7a7f16622c135118cba4b34c43efcfe20b0b2f9629e8fd5974b14c429629f7fe2cb8b0d862993a7c5926232fcbe421bf3f8b2c960933e952ec4430c9f7e17f56cc99edcfe2e8283ebcbf4d02559fea70a700b2fd5f0c53546d4f71a5a66a7bcef1d8fe42296cffa01edb9f83d4f61ff2b1fd753fb63f5108b67fd194042af6a0a6c8a1a6d06191fc3ba82976a4106ef7956a8a1b16c95fab29504881234594459240bdbe22d55a24ab60924f7d22d52a68c2a7fe1007f5736a07ce0df4426a07d20df4416a07741b68b552d714c214435210d9fe2980d80abcf4492550ad2fc5916a7d12a8a60f448ae0f6744d113491c44b4ec53146134e43a72927a916c816662d922dce7ce76faa2dd07ce7ff02c798aa1741ef39156942c34b2dd2a2d2314f4d681f6e05b093fe521075d12bb8bfaa16f3748a20567db656ad8e3e1fad2f8638f8be0f16082d58550b5415059a9a0288796e228979fe2692491421541448146528c850145174a9288c28bc6858142860b03888975080719e3f8ab1200ab1e0d5fe9d08e759faf9e5dfceb7fb977d54290657fff2e68063ecb4f37aedcfb7d5d45b56efae7d0d5d6f672e8b6ef61b48e4b86f6ff2b13090046648dd26b893fe7299e426c1b714123976165f3c5967bdde4e9da6a75dd3d347959ebe7b21cd6dfca7d67a678fc1fc3757d8dffbdf73459ea3b32dff6e535b7bb14f79843d882de3129888b10b297e8c777b76b88cedde5beaac6f79855ba7973adf90f379e3edd1af063cffe627fb06f7a56177f7b10cdb732031edea6c68563616c43cb75ef9869c764538d3cde893330854cda3fb29c312cd8642734589a7b520b607f19229e63cff3161d9949999e6441d05d44fbe0be6b4dba46f681c39cdaee6d1fe4f5bab750d68bab1e52ffd66b9bace828d324a6f3e7a6ef67782be6ec5861fbf2fe9bff7e6b7b954ab26dc7a899f29694e40ce71e75b7bc10edbf7fcf66e8bd76cc5d87bff8731c638c5bc8b85c41389279c344396e5f4c7625e89c9b67ddf3d0601fbb55784b671c9ce8bd3a125d83a1c9bb54dd66fadc9cbf58ab06fb3b6a7fd6ff6b25cedbdeed849d2d888dd064a242a28b1f4f647a84776b7fb00a87fb4771c6c09fe7ed252af82124a2460e44ff2202b77c7f7b1d6c26c7477778f2ae22762da95bbe774fe3f237cbb6799dd91b8ecfeeeef6f4c230e319ab1bbbbbbbbbb0956134ab9d784446d7f7c23ab09b3b548fac2b1dd30627c5c6bf7f9aede6179cb3283106a3d6d6dbdee2df34d2aa1ef10a7e8e37f00fa783521cb853f7e13ce47f303b009fe784d6b6f82910bf4f1a3bc53dd11d3da6ae4e27cfff30046462d6aaf81f5d5d6da5bd5d64bc43cad5f01b7e9aad02ace7ae903516badb75e81a8b536cbacdbfaf504e925a24decef6a6ded44ebe31914fbe22506266a5bb12f69dbfeb9add89718be98ed5bbe3dbd97dbf66984608286697e9955dd92f477b57694ef4a7fd23da5e57f504259fbf2af69ee10bc67f303bdf7542b7177bd62a8fabb65fa532327fcee8f579d0bdbe3c72b0cfcb635b53aebc2f69857beed7e2ef5fabbeddb3e66f50231e9cf228fe799cbf5c4bcf2cb5dfe066b59fe8e987a09de33d2c0fa9e2ce6e9f58879e51b19b5c0af81f5e1f501f8ad70f9e5c3b8bbfc0f44c0288c6993901d676a4855e930affc53bfd1f9812f7900962f42b94b312860bb7c5bfeef52edf25696e515eeb22cffbceafd7464e59768935dfe67eddf0dc52a27d0e125fff21f2f6147edd8ac5d32cfd35c324f4fd7f2fee07c33b676b53b86e9e9411d96093d89695167045bba57576449118ec7638ba4a424310a28f3a5f3343bcfceb4d39f90482432df62b1882f72789157c88bc4c824462293482412793c1e91482432698697ee99026e52d20b629017893c9127f2449e48e4f0e70cd1852e74a10b69105f6791dc76fd96eddbe4826542cf3441ffbb4307ba03934949bbddffd5094b30ba99ebf259b0ef649b386871b5ceaed40bccb6624bb7581cbba82ed111ee9e9dbb9ce7d561cf2d62a32c18886f1158fc5de02d629ebf91169ee5a10fa4a2c5f42dc0609bb7bf459cae3fddcfeab3f2208053b5dda1b7b7e8466febcf03dbb4a120d8e6df1dfa369c710cd0dbfcd37c9b7973f7b116e9665fba5e7eb7c6746246305c16c9ff6759d8fe56c82d3acfff3c6fb1684cad08fcd67fdcc74b68d3b59a0d3d6db78ca2b5d3bce1f079a22bf0db703e37fc378979b7b759b06376abc2624f6200585e7e9b9adff610906efd11c065a06efdb6d35ef7d11629971f28570495f99f3d42508117a08a4c75c94a01e88b7245c88e1a616c48630365628489364254c79c39f38042ea2fa83afa03436ed06061051e6836a081c366465408be48014197140173161103a165a306341bc6bedcf991429c2f383c6460d1c16845d2e19308c2bed800f30246cd0c34462272a8cc844c318aa9a1480c414f465aca036031b3a6052b7192cc81c1480f3c6345b8aef4d85183c2c9f99f39cc0891d32afb9fa517256046f2e04e2f32458315e93275af7b52030720b83b3d5084c173668d71cb13163223482fe3114d951d0eb4a72ecd6ca22da4259eda9b3afb97ea795266c2f0646cff52aff4dc36b3d4cc3e53079eb8d24b99f3d39de2b17fb7786f9aed65dbdffe2eda0f3867a0b4cc51c1468e184dd2747932050b0a4810a1149c2839bb412a58c3f7b3c8a4149e272e215150be9f4dde20095ea8da40a98a81c8c6f7bb6570be8e4d84d45094e2fb5de205b337f9448979a99e109fe87852658865fb5fe396ed7fa6baf48990fddb1d51616946c168891349269e48bd8056e54e96b2ad2a19ecb10d0b6f748039097285ab40d5844247b4cfb66244322436f45c8d32587f40fb7e8c8d31c66fff571b5af78fb13dddd6da0731dc9e3b51a345c2483e90a8a4bfda94fe29fe74fd5ce1259b0e9e3e1f4e452d2f9f1bf5392d527eebcb68b6bb9c4bd8f8ed2e9730f2cf946542dfdf072ca7c4a74b0e6db8fd71406c6f68e83b335f1abac24d5926e4d0111cd51e3a4a814519714fb7b4ed43c4dbd9509a22b6a988ead6a66a54b5a1652a7fb523fbb7a9666c3f8c51b2fd3d5ca16d0f43a3e4d0110f4343ef79384a81198959af1f8ea80a620f5de12523a334e253316ac8e8410a6c7ba03a6e2f1a4ab38b864555454554b7a9488915e15fc4a44885edaf8d924543a0a00cecd26f69b3cf2fc64e8134b0f16b11f094d0d12235990231b4699d42b71fbb9474da4b94eadcd7947eefa593a2db8a11c710bd1c1de5d29bbd11c15c865bee46ecdabf236339e30e81644941528963634a94af022e3278c4dc292345464969450486da742aacd46c2a74a6ff89c336c696bc2a85dccefc653656334387fa66fbd9346568f749861dc36a4f18188eb217c08a7e7f5748ec91bf8854c4abeddf81187185ed83879d3026536221f0ba43621057c5984d2d62c06cda67800165927313a882c4468fb4b029ae1946321c82c0c66c9123868c970e56303686a9517add0df440e6a0410e1320f17c63ec8aa1aa4c94203556a823c42ab5b3c2ce3b7fdac3cc8e8e10d0005e79839231098a11c24922438bd91c286e0cc2437bed61214b1c2170c4824332a81b294714a44071791245038e6411370683b200ec4c895274f2058b5894363f626e38e3e62a062839f4d9c569c61997e9ba9779e74a0d6689a4092c1298f477b34c650ca9322b3c79f6581d67a02ccc91ba1fc2804bcea8d0481bc274ef09223670911912c3c4b47163fe8c6481b9b9f265cd160f6c99e5c003ff20040f7ce72e7c973d50e116ccaf844d6dc96157b0e8e8e5f2a2594dbeea3c1192a9a3b5d55a6b3db6b5942e5b6bfd24489d35492c1e6f803eadb5d6feb95daef65c538dcd58800d112e25504aa090b1f8c915290e31741c19b3c1a3c90c4074682d1f5c42c418abc472d06173254702ce8abc30d482a34a32692bfde92e90839df8e61d50c50694198a5841820bd03a0e71a10d9d2c343892335b9a8011a326889dad73cd9519b62c23c4302874d921e7cc04bb2ee94fb7bb59cc1d2863403148142caac68a0c5048de00f1682916a1f1badc59fabbf9ce6741b0ba5c91a15804851950325690b69d3fb571ea38f9da11066705b3120f08c88e677a54b9a1a5064d63852c38a466ab8b080d67505021b512c6234dc5ee58161a3f905046bccea0b1f2555b214d4bcb141d71c6a051b042ea3b16e238b1324524f7b2fe8a41254422f5230bc80c39d03356789816ad860b3ec674015207ce179e242d225635e8c0b0478799185064a848d13185c54d55da599de1942a34e8f8ba626a9043c36c0cd24aac8a998e1d626435823489031c63ba5ffff658a54cd1ce9fe6ceaf9d3a37d7df59aebfd497f3a514671f1789162c5ea21cdbe498138696a9e2e5868a03c892af1c66a07421314371460bc232c9390df0822685abac27609e242da95284877b79a0ec4991e21e355b58503255766840aacc149b2542aa24c148d17306a7ac4d8e734c95600926336818a921c408a5058cf55c7dc92292d97066ebd6e9baa166b18001dfc040d5c38a959244150d462f3a522053e5fbe972542ea241315d7d9dd4c1e15bce6bd6a526a7bfa45c8881cbca85334bd0a3971f4b06e4069bb22f2a3563f2d4ceab8eb47c9b7573fd516083e0b8b371eb726cd25f2ee7654eba8a29305d9dbb9aa0907bb994a1eb4794cec9e08305adaf2a66b0ba6e50d1f3e488458f996ecbcf2e1d2112301e37dc79937d74c98871e40d1c387666d43086a600df99a74eff693ce1471e745fd29f4e570eab92d4a1338c41c6962a6818d70c174b1028396e98412c33c274d324979c1ea9f5a55fb8b498017da0c150a70ca7b5b9d12bcb51656aeac71023e5cf516baddd1cc5eed0c05567c716adb5d65a8bd95a6bfd3bbcf46c8c484162a6088d383eadb5d639dfadc9b6d7881358ec23c3be9f63924966eb0a1460943775ce305cc5930054653a8684e9da42a6ca97dc2cae2628b816afb2195235e8fc40418845c1705d951f88729a24ab140133e7ed96194a9c78e5c11abaf9c2e54368490e14d600e1222394934373e7da1952254bcb9120c227d40bd78d28384cb4a8149d14b5d0b0254a51a82553518101472fefbb934e0842258d4e9e29a8b12ed9033fd4e0295be3430d963d1293fe8e5624e9ef48dbd72c580ee4244961860ee3179d330f114334801b69582c783dd9aab2a55f86185c59c07a2891a3656b4689850a97501e346c9abcc006080dac9fb3f4b7f3d651cab22c8b047760552953f5a32ccbb22c4bb05d6eed7297e504e68ca17276634c1622beb22ccbf24780acb444d1cf39bf0a9c4f10ce3fd11584f3f59f2b084619e4373fbfdd660aa6b3b06c81465719217986c8f001a2141d507a90102972de389ace929f08acb0c60e8e17caec84213146019e494383189e0e77ac519b61414a97591417145a10cb85ca91225b366894b1a3a6b88588aee152e19182ce4285868e8c14d2cbfa4b0254b0b079124c42e961cdb8b1a18d1e2e48d000d12d5f5b6c3c282229e382634815979da347cf0c6478ceb07ec4f10c8365c345c950ca189a2370ac13afad2e415c8ec61b82b050a68a1825613ecae0f4a0d2f24275b3ae112a3bf29b3033c284b9f335467fbd113b4bbae031e3853ca2654babce1c3953b8da2419a273e4119267ab6c051cb98866d9cab221f455c34d99172742e2388e06ad36598e2bd85993bf6cf998f2e0052e41884ca921f986e97af5ccdc2cd153c74cd5122c3662f0f0618310285866ba30d15a2c0d47bcbc0992640c160c66d0823a6d9e441da9a27295e402b766f4c8bd2c45490e7d24868605b3e3102bc1fc75e914cd7e78e00cc91c37427cdcd9e35e5369d814814226d3e4a03216e1d4080066b604061472700162658d5853a69a302942246267868e2a068becc4910adb1202ab1b4931a07ea059b3f58502591a7b250cee02409a08cf34c901648d1731d2f074baa2887859e16a4791d3ca1613841898f8a8f1b564c7971049d25fee02fd4ed65d2a1b56dcca917bf902376882c480454c2ac9c42a452321005a8347c70a38b204c1be8440983021912bc92c19ba8a43de1c734039f1d225184312b32e2477ccb6acbe60e02aeed0b245cf9c3c672de8af5b0ea1810cd6923067325029deb0612ad4304ee9d273852644d5ea3258f890eaa2429ea93a3928403545ea4718b42867e70ddb9a21cd2a1245a3063a766e7c7565c970416b46570f3c259226d86d1773830130a8a312b1b13d688a2fe85002d2044b99d41e34535e31ac803d710236d483820ce81439f7090d17ae2f60b25891e92dd751226e964ea0355a6bad4db24bd6e758ea55b8c241644e0d6d9032ac9435daeaa921e5862d3363c2846e75319929666a64c1b52992a1e3a50695e099cfa660c9599901ed471eb42a6243b77907aff497cb69dcc3960db7806809391225081ac526a718d9a14211236cc2f238e95ae3cbbfd34933cec8116286a74b8e536b8a0fdcce9fde1d366650a9d1d5a386a3d5487ab43b62722d1a182f735c30a660668e0d5b210d68e74fb3b14d961716170d59bcca3ab04817ccf5b2b807649f5e619ce0d3afc2f59a629e0ba6cfdf16730796e9ee9c8f61441d32a6ecf192c5e7e200184a7e03d4f6c8f811c5469a325c6eb734678cafaa685d1982e60609e545859a3840e2d8114b26f390276f84317cc431228bc3292d4889f1638c922155162d36cef8d7bdba9dd7dc9041c5030d15d6d1f74b7a17ee980c4a5c632355a910b72811e39202c4973170772da9dfb0cdd4e55ffc367d4b28cee6dd2801f8f59717e318805faf1dc03baf2494d92ffe0ee08d71a7cd18e39c531c3abb2e6191ae2eb3f6f5cc19afd9c4af6fbe7377bfeeee5ae7eda7d62508fa73f967f9019d5aa8e46c572635c910a2080000000003160000180c06050482e158926489940b3f14800c629a46725438958723610ea3400883186200308000408031c428c5d40d710038f94cffb3320abc505c0a3c864a96cdd2877dfce79a23dbc0eecc1b9dd18e25dac3c2daa8d45efbc06f3fa677dad3af043e4037e1cd86fc22c96057a80b4df2f374303a18be1104d1f6e5f459abbd6cd4bd6c2ba706309d2c07ddd3fc76124efc067550bce373d2e205d607ecbcd56807ddbd3a127d7de8869cce3608f1a0b1e37edb939ac54b90926bf3e6c1c47610889270aa1f76ce4fda60619046cc1a7c834eaff660280d458f8d01418ce020e09135dc51b94354de40438328b7fa0c2b27bffcbdfa72b4759189352e93ed968ec9aa306b8fcc2e6ced62256404b54918213872506abf4c83bc4610540af2a6a9d453a56936c3f40a0d727c26bb7b08100e8f2d6cb54653093c62d2ba9dc8699b1c3f76e600dd9d303b86b8d6e6dbf189a2989e0bb174e70406d03c579f282735ec435e6b5e0084d531e779ac55a64ee09c631a8590a16c714a1190f3b308fe60d353bf79b4b356e605c89962b83a328bf10fbe4fcba5f2957d25924b1d9774687828148e1fc1b85321f63b22b731221befc0476e50c95c36c8611c860f1eccc81b9886c661c6557a0f31a3ead9af3235bf11be4cc76594ffe6f009d29ce9f84b6cbfce5ba836637bfd3a27326e1bbb29183e18d00ae582f0896c68140a3c8a2d8820eb130b3d3db841f2e3d7642294191712d8ec303b54654cd432cd7f1203f6ed0a2302df8084c96d2317050103dd30028324cbfddb916294b359bcc3b1050b7422ff15a9619164c22a7c59a05d06c130ae8f1bc35eebbc8e095b0fd5297fd530adec8709dae23cf3ac426e33240583cf984a79e881bd176ca680fc6659b69b64bf5321e022f7f77cc914b381114d817bf45e56b21a8d31c81e57a0343b3a8209c79c08458969c4fd3d3d629d54139883fdce8629b515ca10fa4aa1a0d486d261ac351e101bf17e777f556cf79fbee654b192bcb8a5caf9b2b25837059990c5d076095aea93944c8526f52022b0a9d5968bbd9ae9b5adc4de755639f5f0ba35ca267be4615bc5c267a224561cfe78355a29d48dae90470670eace7771fd3dc0bf1562ef156c80ea1aff877dd33c1d6d4ccda5f3e4f8147d0fffbb56612b6cda4b77e8ae9175b937d1bc78a9dbf43fc4d2488145100bd30b7cc3399086fe2c3e1e9e013259f0f9cd3bf476943f021f9ad6e2b21ac2a0f8302bf9ca78abd16b226ca87484bef251ab31f2071be5105f308e35de546542759f61d6b085471928d2c366043d578edc66a063ffea07e932e4ce9db83301d0118ff00412d99bab636513da37b8c4562fe65c413dd0313ac44791bdc6f60f6c6368cbbcb44a54a03d8df53acbe8f4a72f1500fd196f9710256bce88cd3ae167b6ff3d392649e7816f3c23a6dc21afb74c20f72638ca66297dec1a8025edf6203df664d0136d875a708cc327e6b0f6dea404a6816099284ede9f848bc55159267a0a121f153e4bea3b2b2b9d245f60f7f40357cb46344cdcfb1aca9e29d2cf43886b332acf0b29c41b2624342b5dc10bb1f2582c2e00faa21e282a33a3b03b9657165fa0f1326c92f5c48fc8b21b5a84396f5537c187406ff37680c0b9140ea0e2a1d07624401979028cf856ec2b2f2aea39744b9dd23a1e9d2851bf197f992845d5aba909f1fce858768500fe42250ba22e5a041734d91af16a9929d2250ad7a0add95a8e1685f93bb0ad2dc88da44f0fec8192c55c81a218680b62ac46be380b509e4970642c82cd130015470dd6ae0dec8eaa1619bce3ef19f31eaa3ed322a92caa93ab2530c6ba01e2baaf3f0c192cc4ca8bdec37649fc6f49ed01910cb39d202335dfa8a432d239428b2dc952a0a48b8f0a00ab229e8b54a29c428d59a14989f50ac2d35eb05267984ec1f3b931a621a2864fbfd62a4fcd6a4546ca9d8fc323cc65ae178a4ea9f65d8b835c3f79a49807f959e231c99388406891e8e564f522afe383c053b9c51d793a7bf67ebddae4c5fa6b7192c7bdaecc2ef3b2cfb0cdad1c78ff5244a99070545e5b1bd6e8fc3cc5578bfbeffa133221172f1144ee5068f834ba3d8fac8030661f38193b53f578d8a0f7ba9394e25e96c12fde0da05e95eb0d9a92576f3a2055e3f7280888a9e8184b1ad6c47a64548eeb51e94535ee5507557608fac384e61ff53888a95825582a39f50bab849bb16cbe3fd578bc8f2020282546a19cf290e3a6aa28151d23e79f3ac0902dd0be683ea797ea0519103cc7540c68499aa966935c5e2227b7a567814c0cee7c8db44a8e7f761d8031b845f614518484ea8863f9f2cfaeca22da73cd07052546f01fca67d95fc85b89ff83cad59645c2980730c794b268d609e7ee90ca902457901917533d8aefc3fc98d3cc3c29ac5a8abcf6f2af7be2fa454c5e27b895eb1401a5456f9cc883e24a6a888fc8e1fe24960204e78bb8528534060704c4beed8b442ab241516e2ddfc0a70a869849de19857892e51cefa1196925fd1ca9564b61f588a61a1c84cacf094cb9d11fab0bb1fed00997fa1526b6f2ef08a162bada5dbc37aa0c1d048501ac0ba2fa64452c80a377b6a2972d6886e71959ae60fdf698595b0a8cad3d3f6d41831c06e3210623d69d5d397c6b0f9d04bb36d8d03bedf4330db9ae86ab64c8f9e49918c2e013be1a70c0b861a02eb2b632908f00c42ce656227a66605660e0e5be5e8a1e73e8664832036e2e615f9ac738cc4821967aec2df8c48489a904207de66db5178bb25831422f567c891aac07404840399ada513602f99c4a03b4557dbc70768a70066eda3d48da05b88e41539c2721d29ffd4a83091dc2e0b005ddc65d903ab7b914dcd87f64975ec17bfc27863d751e137cef3bac3163af1b04069dc96b9e60e5ccfb734070fca1f0c60092e5d10c052723c70a63443a28190dee763eeaf8025cc56bc1a2b3b4b2f74930df09ce3e33ba17a275945952c3406306230991637f0a4436d02c407da7229cb37f4739a88d757f85ff00ff9fcf8fbeb42b9b1841331bba4c6cf2e806d452e6352078df7ad76930b69e42be042c077b499b8c43acef0a2eba61524ebd942ac23b27a5c1eb53e1e4181432e262cc9fe8b9afcb2749a7a527bc307fd8e6d802889d54cb4e80f605ee40ae216cf282db46881e53cc1dc906975109bce7102bb62a4db6ebca0f353b3215c174ef06d6e793ba099583ac103fde80e235acbe0083600f802208d2662d4a61118aeeb963f24abe62e5fb3516e7d4c19a95574b1a7f342ccf8a8e8b758a871ea7c11989a251a1783ba007316f41ddec7cf8c846b4e275fa80559fa786251c05bd69306cf429ad6a767759488c94e8c4acf42e9002cea4359f952f894671f46df9aab285b4334ac7bf92470f248f7541cdc6b27ca79b04df7f58f345946de7bf5a137a3b0dd0bb0c2f253cfb67bcbb94616537a0e626978729d733728a542f4b3be9bc299a8a76e7d91208be65f5f28b5cb0a6acee2e587deba582751ab98b12df749e3161f8af07df2a238e19a7f43befd7e7fbe9b143b405e69b600421a8d587c323fa1aa1d52efc4af9d2e150de634ee43987dfdcddd394479f253476d1c016c1a0f03458118abd6b2146e3aa3f3f3e0422f522b118ff6a6a154494ac80c8deabd3bbc38e9c264c0163338a502e76a9a70a034de8f7f1cb12bfd46964419d6416695dc07a2bdc07e60f52f30bc966a42b4925072438dd5916ef074c1af5f80f886581022dbd5690b7fcb03207b1659c8daabab2d0b7b9b7fc947dec911f18da5bf6bfdcf47d1af64f0811d92b66fbb86190ca0816aea97fb3725867d8ec6c51d009ba22624d97fc754e90493b9cfeb29ad5514268c29a00bf2f6d18ca58fd8a093a0b8918e63c63d99c6b60df9053789d0deb71971e8f4dbe30a29393c5c65a7c57abb91d3e50cb2ebbaed1c7384accd91e52078042c1eea602038aa7fce76926ce937979fb511f5a824de1488fe097a291e493e2e22ca402822471cc5c3a961bab6a1137faacd144fa830b231169ea333ee93bd9db9ef326481ed8512d74e9f88cf3de678c2be70027e0c495605727ba8c76f8f8a51245fb29f7746e4b5f34013de4bfd02ff1ad845df29e12f114e581f611f0a423a5f1d01bc34b0c1315711634bbbb2a5614065177a2b1962e8b879d618665a6755bb75957a61e27021ce640aff7aa3a5cec5c5e5063ae2896b1034fa372b0e9111b4b7fd0cc504d4e596c34a88aff55f03e075452aa0669745688a88c2cf0da35c79e178f9caa0893da4d280addbe34f6e500b8b92aa4e7b947015269dc4dd2dc59f8cd9f528ce8c74e1d5ddae82a12a0e8d1025ff27d4460a8104a1d9171643aff0e765b1fb86fc86e0e66acfdb414fe29686ee1822fe065c3eb8b7222715b7ff89451177c9ba46df1fcaa6b2f7c1c0c601b182626f876e4135f05f159e852ebab5c67a0f640448590fc31989a1273c542e369931331a589009c142f67e451b98ecaf9019734e907f04d951b9fa416814ea637d9ae73a0a54628de7ce4309283b7dfc4d16c8562ba2441b7e50f3ebe41fa63efc764fcb155637869bb88fd8aa1ea825cd3990a11e505e76087e09275c5a3409ca6071860ba5b465dba2434c0a13628c840cbc19107fd7e6466cba2e006d482cf1fe966e64816a8761e2b14b2312b11bf1d2f69ebd1444629ca163694a6904c22aada18a315a4d0cb434a7afe8d2f78313563b6c0e42c7756b4647ca905477af0c2bac491e0fb140cd6144be96cebb12e4593081fde9474b67e6caa0152b2fd68916c35611162a9482fc0bce7c56f8e33d0d89af5273f4f9b25b49bad8a041ea59a531fd5d417398f800c6ca32fca10853e805f323df8089f542cdd2e0b3fafcc05430bd5e54ba8e8dad44d43c7463c954333804e216b0dbe244ccdea11f4f5f203ba71537809a9f73acfbc40b90f5ab10010a3ac6270d67268a589ff99e856a37d5347aa11debae677e9dae6e4b5f784e8fea2527aebe498ce7001a07c74be007582b610ae5122c2367bb2384970b19ae014545122a497e4fb61e24821fbe6249120f8e260c731428d5f86105d5a89d0e25819eb47c6423b339540f30daf3316f19419d18a451b590d475322bea057a9ed2df79b06d3d46bb7cfb7d76a5e209adbcdb81a9996cd2e46ad8f8970ed2c84642d6ce1dae983309f58ec05f5649a628fe2e4cba3ba8984c63339f7c1d3b5af3706049084f0dc9ada4041331efbd2e419d4ecc470cd4a9093a7ee4b73e9283810ac0b2b3299a4180c3b7f82e1e64ff614d1c704076c22795e674b367319836cc270c5b57436e41f1307e8c3a1a797ea787db6e78d8adb8b9785d93afa30393ba24a1b6801311391aa0e1355ff3b9c3110555af13bd924f380135ba8a3e3830cc40e38c1b23398719fb101719e97e4bb51b980139b338a6a20b84f524fa01bfd93006330054afa52b09712b54e19a860fb941f5cf58de4c787d906b36b1a3dd9c844bf19a1c27803775969b39717f69b65fb643ed8a96da81cd9b654a869a91d40ffbcba51b7cbc10187c976439e9d6dcbaa5e6849e0b4597d9e1ded55e68c8f47b721b0c12e961cb9603cedab2c37faae4d74f8f571d17486ac316593f8d920a4d5d939814c9330a74ea8c09f251c11649bfa90d2eafc614f6cd40d6775160c78b81d8a0a5e16492ff8ef367a63c089f68b4d369fcc09e7d2c4c245697c4596422d30c8b934d97ae371489016f5c2a80676461168357b670e90370c6456c8e0c3545394e9531b61d05515723fbed2b9abda3008f0cf5b0ed7eec89870ad012bf9442da853aa8e5a8e74bff080001474e98e68abc57d14c1eea7211ba9c06e5a6aaebc947274b4c3d3c3e16322b8b54db2ebb2597473478a3206c8d8eebdf403c6ab8778b21c1cf4f60ae58eb6fd3dcf2d23c29f361fe4a6686975bbb54c06d30ca5226e1f3f69e612eb94e153bf7e68d961c034361c20ee004b1ac6b970891ce2788d403fab59634f7a5ed7d527d8ad2c2202e6bba3f149d24705f021c73c6019979ea0f931667a9cfa7290a4027a9e697752451d67952db4a450ad9eb02136f5cb2a2d76967af34f7e75587d1e9a4a08b17a36a80a5d8477fcf6caa1ebfe765a03690a7f885423f2f0b3ba669719c1be5af13b8228fa69004ba1a5af6f704f316989d8d9bcb57e925789edea03bfbd4f17f33f34feeac016e9a3c88d4c0e9fdea49584f958711b7bb6312ad59f771a844e2839c0f3a15762561028e9ca2fb251cba71b20c483d14dc922c095ea9e3ce8b3492a411feb1496b87f2d45ef47005d9754ca62e0218161662b4d199988bbaac93e04414401fb42af78e61aabc3537ede42f0c5cddd8bbd5a4fa52a4c56694eaf2c947dd726d82fd07692f2ab840dd5f603db161fbcfe12ee22d7974c0ec2edf4e9fe48bdc065e2996f69611f8fffa39728ce94adb4b6d34c1dc9267b753dac10a40b7c6bc7ba79c8f8dac454fb2b9469d602a416cce39caa39e2a0a2ad2d25044a71739f59245c17f88875f3843efd8f024bb3b68c420bdb26ce715eba7ab1c0e64a5edd959f8b9bcb243b486223486863694aecd77d9d637f1b02946eaf9e2381f31d5434a2631802d2aa565885e0b34e405dc29b9e826747c505c1aa00662d2c2822e7ffad6e424224b541f4f238ada846797e053062e2d490b6d5a0b855486c471d20e70589aa06be63bc2190d873dd09e508b5e2417af199bc902ba21cc80ca05951a43670e62528eceffdc45d5047ec9a8f0d84822c20a2127d480c3d11a4ce9ba93eed2ea1bc22082fae9430447e8a3dba628c8079d9dec0bd083a86031f0b788191701495f7bbff5826e191ae1ff5540fa26cb909669d58af7c8fd65435d91733b802132110fba562bbf63f42ab78188aa6b5507c7cbf2be399f414c09a32a040a3fdc86a7e7e922c77310e57dbc784edde484c118a6d701dc25ff9c74f2a4303688b0e25b56e48cfbcf27941bf72ea1641014006921185a86aa661f54311e711b526e2c102d6f70ca8487f3a8f0638309212f7a1b2c95213ada477ac7c888783cfac45b8064afba09af3e49d0ac4c740fd790cf55ff711d5a03efce05a049de31f522f59fa863502846f33da23e1663c010b855ccb03f8da3a396d246f11a4d9574aa81ce9b90d5e11f188ebb94ccef94e4088929c1998e140fdb07f2161fd39afccf1a33ec6c5697c0c9e058c4c5ae1fff7718bfa390dbfa2c9094c511a19f57ed78b743c97d6ae16f8a765ae444c555fa0d0d7f111e5abc337879a2d664b513233f6c4084ae2602223a6d889fc7fef433b9c5f9eb6143109a7a49ea348ca4ad451e0dac759bfc27666e6dee309298eb776e6c9958ef6bad70211957db5ec28c481836f0906afab60b726d7a0b703e8ff86971d4558c858abe041811148f18e42e31acf15c0c571d709bc7dcb3512645846103cac7327cf7fae46f276475a15c63cf20b20229972939619163353e361f6c6436f2390b2962084a2d8ce753dbcb21223d1070f02f5153ac791d6092af2b6fa61c8cdba7915be64052d853dffc01987736224469c33ca9aa3ddbe678e233520ff0947c2810f4462101f2c836a964db35143ebe1e6ac4d8823b5e8df35af2f8710d372afbd9fb3c112e308d2157bbc3e221e48adf1723223f1c6a39a0546c01f82273bf88c292f61790029a5cf112dc1d3457e161640cdcb145be480e117fe5892752adf3158c729865403f18deeac2dfd28e5211274292f8815e3f2dfb1b36db45a90230b87512222b4674f5e92261114dfae82e5b3d688bb015117ec8ca4059149415629b89598db6d26adcc38932775b122d68c4ca49c39f5a8fe2ff0a59b966b17b9e5692762177ae4783aa44474960f37641993c53aa9840882db65b0fc9efa9af29692197ce058122b9630c22bb184d93ff484e3cce31b96848b59dd2ca8a336e67a9944c7caa1496872dd464edbc44a825a2981cec1409aea9650c805194e089f8a9f8572a0b71fa381da9d2ebf04067c1596f571360fd3cf8444cf18878ed5c47eb3e09f94747bc6c5e8d568507b3959cbe519036430a81dedbe89f48198683be100efcffd41ed059777dfa4fd1f6fcefb16dced95ba382dc1783f90c5f77db3370252f6865aade316aa91be52b1ef9b6e5351e112350cc3bc8f4383ca631056be6f46650a81adfd80143522b931f47db37c74f9f350418051ae7130f4d158cb3f243dd02c0640c85125f83248af133f827c813cce9a187fa1babe6f3ad7d999e85559311348d311d2ec66db9fc2920d4f02b1d0a2036a4c0c9ff7353084264b81064fa0a0a80e30562df159f79f99cb3f5092fd5e1b5ef4d1c00fbbedae47311fec47f555e7eedd3c0a84e99cfdd5054b615f5c9195c26037be07896ac4ea9ee4f3a857c96b276afdc4327e32c91f1d0d44b1438a2acb38976a5378c2b9b182277991a0e8e9e96c9233bc42e3960c4d497e8ef1c16ccf294910db2f690abafa237b0ea02b5bbfd84f961af50184dd87bd1867f610b49a9a1fdaee24adee153e4efe9d8560f37b421edee1a0d5f6e018021b0d3c775afb6eec3e2d7aae8474d9d6b4ba8e73a8489ae6a56df8fd956d29ce1968e88394920740f15e69c6c58fdead5b43491071f0d91e5f8577e3eeece5d6f6de1c4cd601ab52389779313c753443378e22da3cafdbf202609b9816a398f61623a783878b7884dcc4b2ea7dea84b6334b475ca480a191498b5d5a271344142b99ffe3143cf2a0006d6595a8c68fd79c125bb8b1b69750ad03b7c0b05e7a3282800e8270b63df6be1c5142f7fca5e5f9f6a7aa26862734b5457c554d6780ad5216a88b701c5469f63ad48284dd8bacdeb9c46cf433bf39c051f7d1d1f1649a4dda28716309fe2eee97e884b95722375045644891e437ec4f3e21eb1024743e46a0ecc5e7f85c624ad85a4283d8ffd614c9060fc13c2486d62e7c14e5db59662291a4b34fc8dfaf855e6b0f007cf56391b04637cf450ef973803e9b3513cff07121822b40a7288fb053a3549085a2be3aaac6722c67d006674735b3e5dba22c234341f693b703739af5cee23ab301d29d6abbf571c88133a87d94242fd98c513db613050cb6d9bbd5b28d6fc70925770fdd52741edd49690c1fae8bdeb20a06d085c5d5840198a0ae2c95d7035543b05cb42564dc8d790f2c524e0223852833fe5e7cd6a49d402a340a180a5f9fa6b9acdcf2bc622f4de28ebee9b33aace45c24342a97ef88d20acab8dc04deca8bcb5aac0f3e55f2444b38956dfb8269023f8e7feb9debea300dfdf64fc1853d3b814dd3b20ea8ec54d4d209b8d702159dfe414da52c032abcbe13ba0f2aa270f5996a61f73401d997ed9c6c4f1346e0eb2ea914e7c323e08f71c316d8f2671ff830a5859697e5511e5ea4c8d61b4b6f0107db68dfb22b049e27cc9b96b969eea98f1b281deb87bc0909fa1874a158c6b68517eb593ce982bd1be43ffdd8ff0930b73874fbbf5a9525cf99866bd7db5f8dd9a4e774c74fba31afb5606b27696553be4047f4d7ff2f25fe8fe66d70a65d9d8e7ed117cd515272a638d6c9147fc434f62a4aa584f9098a9a5dab05acfae80df5e0ee48d18a4494b192aea2137cb7a0cd6fa377e399076d4fbc5dfecbca200ec17c2efd2481eea360211e1ff5df7c61e1899458e0be239012e247384bf754528580908598e0e7538628355d065b09e03f01705dd4b863b7253de94074fefcd2107dd1e59daa0bfe96c532232bf4d2db162402ecc23e298b7e0619b0627c26b8830bb455b0a719fbd7ab6389a92f596af35c8542bdc1f847211facf0f1282ddd8fa0a4608a22246100d1aa0d96885439e5421e7b24907bb0021ae20efc9c15b83612c888499cde681564e3952d37fffc1f6273ac0356288dbe47010503276a25853d97b645fe7bf8d421fb55dbbb1b920949f85a58673d0f7d85460760ad848ac9abd3537577786eee6aafa1f648d1dfd8737dac0d7ad6fae68d07f6ee434f95b1d7af90d102b26922f0d1f9a81276b766f4f60a15493be6b6d131898c2b5c4e8a36f22e09809a572f761f48ec6efbd0b280ebd66fec2d79fabe1343389f398144cdb45b9866fc12b1ba500eee344b1564ceec2d9b2b1b5087e403b6f254338f2672e0cc207d44b2336b4a588071a33582c9e2f49ce7d80c040f4f4d0136a8ca574790be934bd7c371325225406b56a851e6068033997927de157c01b7f3fff418f5c5eb27bb7e81e2430bdc0a5bc6873b58a927d5e42271f54b19fb6f555fbddb287731ff80a44199420e640b4fa19750aa84e8f26d8406e0cded66961970856120f6537e225d811f4ce86aaee7814c8ba306c50094fa069810c56ee8bef535af99f65d69bb17d4aebc1c65d94e78500bce0c46855bad0dce9609ac35bd193dc74f13762962525f0250ee55939256de3e3a25af15bdea359c7fe366ae81afa5476f540341a3866eda8d08e6ac6786db58dff0bce940cee83efbcb1f929257c68be9aa8b9c597113b85ab0a99684c85a72305cd98455cfb39cf47e0753f4436af5d5828670453888a4c54b4eae4cae3510781ec85e2fc0cd40fe7c8c9d2c71fffece0a86f14f3b2099eb5ae9872a3d3a9cb1f92426e0803cab8346a3efe63f18748439195c0e15f6f5976dcc90241683c4607aefc9052304210f081e247d28d4fe9f1d02793c27f8c3d5125c0709959235071bba44fa086bacbaf483180cf1f6329ae7ae7b6915f35a2c4c1035dd728d88477eed960b107a5653c5c2b3689bc406f1f2fbd7087b0ac306f17ba63a191e728d383f0b6888bb3756cf9951dede36b0d4996ef8fd411eba13ef8544a4657aa282b878a295c98d48d11524881eeffa1bd70737152698de3ef536ee176f22bc20bdffaa9e07da9259c65449a49b9f56ae7a0a521126bfc50fe6460daf0688751440f497159f9cb7746c23719f2faadb6543bd5017ceb228140b2b0aed12676a4d2efb4c1f25778846d1669c495b667cc3b9b85be5e7bf6826705a69845a9c509a14f4bb2ffa5fa8d5bc0c765a247568e48cca477f575c15e197c9322d0bae258edf8b53e90245018a716d2592c8329174e84492e7a9241962e10633874e23acdadd09dea0101d7ed3a34d869306937871e560f4ff3b236cb14ede89538b4444305aece83006a7363f4166a98cb91ad7cf3a055f1aebfde229afe7e5240fd306585bea86a913e839cdad8ba6b752ba12297733aa63f9889a86650eb404be07e6cc7958ca7729366040c3eabd188eba0e385c96c856ebd0974dc2a0b0e1bf38efcdb6aa46102716770971d6be72a058e12e1414a071d7d50d4d4956a235a6e2c4a6d02f6c8d886f974fb5312898822b32615924eac04421e8922999b138c9123d3865a3b6976e1b5f8c38ac3ffcb1822e0560d23d8b7c5889552dec62c358b891fdca2b9be6e0002179ecad2e173fa1f247b44dc7f3fc20c42473ca27943ec94a170ff4903a30165dd1ebe737354c8926d12b3af58d1afe78413daee40801f8b0852a67d3cdda645fdb0afee9c6957b8ac50cef619d3d8c304e78b9b06ef7c66ab6b4bd9a05f3c027ef1264f236ae2783a7561dc1fbd1dabb8d9ee188ca57916abcce9d49589c9730d57e76a270d4d4e74b7feb330bfec29639c9a8953fa57784dac7f17cd8ea3a75218e8fbbb22b14a35ac719128ab1d36ca55a54280b58dafd2396f70919b9b53cef129edaebbffeace41bd828d7a6170405cfefc14e687594eda2ab09ad28674fe09b3777732d7f8521dc8ab94e5037d3aa3f0ec0d8659c77ca8c59b30b96200585067a842fbf4b9bed98043b4fea520dfc13f4c6e02f7f135767484887ed83351e69a8177682c33a1355895501e3d65b6c1fbac3e03d5ff26e9c7748228963c44475f84851c9d5c9875504e5acd0352758aa174353dabe957052cb38036070246c513d98a318cc5cb07ead7fa5c7b8071db2d65fe9fb946578c07a38c4fcef1c1c244d0f223366764d91376f4248f639617a90418121019f363d98d2a4c566af93bf48750fca7b9cd815f4b752b832b93d750f6e37df072b1b7a2817256fba3db84cb65059648cf2a665cb84af47fd9269566fe8cdf5a772e323809ef7400206ee06f2361055b00e6b88437aae9d637b0faa91f1994381e5e2092cae7be4b804d1d28389dc44302d57dc23fcc6967b963215987a078c94a00a813635c3c9fddec12c7cfde1b342a167f5d00a006f598e779c8de5d1cfbf63c80c9baf18e40640ea21e6ed6a4859be14b5441d667d1663045ea8a7ea8aaedb8a3e0cccbe42921591a5cc80ca80948d65688d1a141233729a8d1998754cf4295260b5aa2c44fd4803f92979c9a7cee2f4f4a26aaa8e39823670a189d3e712d848ebf227fc48593b11b14d9f7ca33c42a9a934ce37e7b861499fa0cae4d8944b3f714b4236ab34150dd719f781ccb608be8aa75e9e4bb9756e2ab878e0120e2db6ca578be060683df202357ec8f433980e135a0382b39f2fff39dcb81aaaca6ad292c567ba393007f4cd83a3f56a2fb4db40b8128f3c5b9370b881d7737db56907ba8d1375bba93a7fdc8d086a5246d71392412d08ce9c0d0512da035e71d9e04eaeba2277e247250870fff0ce426e8b1932ae00906d6dad223753a560b20937b7bde2d7b55dc3acd8b385de271e202f71dfb61a0ddc5000ddf86d8bb425be2f33be68afc9aa8a62c2a2a17a521096d103a2f273cd867037a6d6c75810240dee059974c377789c15a04de692a809d25c49b3dbc14de671a90f6dd234ed79223f56175634062cd5d9aeeb3e55dfc52a595ae529f351b892bbc09b72bb0b412c9f412e0ff2a82c6c599045a8130b1b1635ade1a8d7773b6ca6ed9acddc2860593145488a2a7044fa569f808f0dd8fa5e07d01b8056f9dcb9f19a405f68c226661bba97b807c37f014c2e4525621ea55a59f8cfac350ce4864e7d6a81461c6659112e75c46d30389a53ce98025052c8d779d22d5a63e42a14889d19d8e123a8eccbdac8786d85d0ddafba6d0bae72f32e980e8e29021f836fbbede46cf669752f567497723268501a34954cf13bfd5aa94a02e4acd21acd85c6a02b8045a5602553d0bc152d25013bb3014eea24551e2d47f54488349011234c2a6f8c6c9e1f202488b000a572b691a1c4b0c432926969ec44034eb11a7eea90b1aa39b3c1f7ea693821274d641e4ab05b7ebbc4fb369c632388648da02f91ed3215e681640b2764dfcf1b05528926f25de4848d515194dfa5e1d3e0febd70a79d30480208c1518440108029d09d871ae3984d54ffaf1a23764dd31a054dceccf68e718821538c3ce8f6af7cf0be2b18082614d523dd0d10c39e7e0af32fc4f862efb26bb4b005c635b3173910674269222e425efc88d2680ea88b50aeb97986154ca07e2cc8798ab53319dc9f6a1f05e48d52283de2da7c3184caada5b0af74c92fcf69d4334d843709a7e76a9edc4aa632057c44c0d02c3ddbf265df0030e914bb0954713f9a519f20ddbb25815b6624baa755f0649b1f688059d8ba6261f007e964edb44c97c28ccc881283967221844fcc08f779d4c8762a48df339ef51e1d1ce129dec66a2ce487803996076b54f7bcdd51da6875a5d2cfc1a80dab93982e64872876cde21f44f1eb13d2d4e0f709a97f0de99df6854f54bae814c2bc70eebecf75cdf4421ae369419b7021a5301913e6e31653c102a57b973e68b8fac25595da3f198d294646d657d240a510872d5d5adeb97a03dcfa6a2cdab0125b1f790ca785a6efc190b4c26ffd0bc2642ccdf5e914a0d0d6b3b2f9c365fde75a87e2b7cc08fdaa593ea743e100902828f14b12e58a72d0cd25d8bc659c42476eb641ce7e0f7bec86f5e16c39f4d8c24b15d7bf749a7c6bf6a84e59fba97cd0a9aa3a38dfc0e021009d63e53da2f183ef78cc6c9849d256a1765da6e010ec9ec863df162d32d4105d275f38f2324e53e80b3e9d9a0ea0350e70daca23a3227ddee07a58e0bf998f683418245938fc4cfe8861fb65476ba9c029a87f172d9428680f4165ab010da75cf6cf543c516504749a35718aae33d0f8a2d679c937e8566d6fa6e037296fff7801b141c9e71862b473bea8f5193317f876ce0b9e92e9cb0135c52c96ffdd88a4644a8214dfe72646b9e4911413488d1d8f70d709bf624b44a5f71e6a713c70fdb43ecef982ffd4c3f090b84d1368593e123e1f11b2ff7626920541913356108f8326a508b68f916552812f97437f45def28ae3aae63ed7df46246c5e6c4e25d144e4a6e1cabe81e2d880aa4f4db84f127e83044c509b23e8224110ec0398e0b94560c2d044d446f30d75b3055c881042a12dceed4e71ca3efdd3ff7098dcf191702cfbd53361ba57cab2df36211a6752e5e291bd18f845adb997e63608b46e12a0ca70ce3591a8ca46898f9c072a7c952130f72c350bfe62f2a158a40f1042841922af58e11461dee26619c037604c94e90ec3cbb9db43a7ef1e820b7e6fe930fe3f4d1a2468b611c8c8ec1093c3c12fc9d92f3e4101d814cf0e21f4c451bd11d936ea7d733d3fc1cb31e19ac25962a8389055cea9250e5a35a8be841aa4f150f35f2c0452ae2bfdc0bec24d8b7efd5d1c888c2bd760f13b6c47822fa6b3eee7cf25f8036c87b54a2e72851e287ddf403a23331af5d9159f30642675331241cff80ae626467b506d22f03a2eeb49c9d91ca08f9f7936984d58c86e9a625119d013d6fcb704eb2e1a83443d724019abafb514a1bbe08bc0e13b94d6612764b4d40f369d69da7dc3e89b502c2611ddfa038f4097312c3b287a51452258105b8d7a51fef8c17e441006c11cdab421828c8abf42f6e5f42860b667928ce40d54ac525959c0f1b68ddde7d5a362adc7b1d34ca6ec74d61f0e912535cda2677f212859ae5269422a1628bca15329fe680a3ad523627ccf9e36d3695fdadefe137b1a608160dcff3a4b3365396e8cb6d04aca953bc91e7be3c3ab9809b35a952561b032f58a3515ab0cdad8a426878f70e20323fc68d099dc6b661e3b7b4ee461edd12ee1784a02db52e8408a9569abb374a4ee0f8125738a6277a3144b7ddf688857cdab909d9b2f4cd01342fa233616f76036cf70415b856013dd8cde97d84705ccaf69b66eeb76f18de834413bb437a442752ae0d7433f79ff2772880555eaac154bbbe762d5ac91f9a6ca91798af4c84cf351ac91c448b14879a5581f0316fa4e7d9caf953152e59eebad58d4faaa4f89a3a94b6979d2377a31a934da562cf4edcef040e3139f1a23c26e01147f6dab2e7b12957f070f8e8561ff0994aa80ee55ea3add39a8d6d04a51032b26b231166dfe18f20aa4d1354672c97c25674e45a9675dd73ee659e8a7799d6a12ed9e77151c97612fb2e336f6267cae79702851f68230b762a18f8a958d31d52016f0e0989c4a847dca27b34b9559983710dd7d3c52ac1ea5d256f75c095482fdfae5dc8a85cc1e83f2560baaccbcec05fdcd8d2e1ba2e094c400874279f18b4ba3a215e3ac26a73d61cebb96f3a1385b74b25f453c4d84b9b1d0e6535b80038a26a22f7faf01d7925de31fd41459d9794b6d357fb9ea406122b2568ee424849e499884992607916073a0563155db256ed817c0eadc614f369ecff65fbc2fac843614152694aca71c989f214304af7373daab1f55427181102f774b86e0c244589e0c29a67bbd306f3c36ce3d98199b54428fa94ed80bd9b712ae7fb1e935880fdc594a2f6febc25cc977a75ae23e4f6158ba7b346522a0124aa472769608c5fd0767489448563e93be95fcd52227284c4f22b65349d0532b337c86e8ea5b49bbb9e2e7fbbd430ac7f380f52f59c5a0776de8b3f91f1e66ceeb9aa9448edee7a2b9d3f5b9d580912f4f005b96b65c66ccb224e4d44f178f3b184e3dac49d251310b9ae090e3fbeaf21b637ceb10af9e813067e6637bfc23a381bd1c41dc9df9b0899bac9a68e887fae46acdfc060a32512ea97a36ec201e62d82eea710d2c256ae3cf6551de8b8b23c430fb7584ac306deb6e41ac1f63900c1d666d11c288f082f1068a2c0cdc3456963f359ce78aaaa09a220367695ef3663ec7d2a0acea75dfaa803c5f7fe8484baa7b8744a0777e9508765e8e082ed5d8ef490dc948e7099f028a922b329c7d5b6154ec4795991724055983009f28a4ffabca8f3509e95a0e318b53aaf1003a04697fa951ad0286b4d841018cdfdf0931a8acd3e80a1b7da8b463b7eaeae03b0023dee4209cfce472c443a37d183bdfbce68e933de812a90a4730ed3bec28616374b317416ee5f6f4b34110856fb6939a58067080b45733f4035290579f0c326656378d3b1d339a5d1a9cdb4d962d8246148f2e4d95652adf40427fa74bb710ead42b9b344d4090fae086d20571771b80005edd962106084d1e4f1ba4da0a8875ef3027a8510c101430a5d2deca726032a95b5c3379e2c3198ddf3b6b34129eb7520df3709d4d016584f8f6ce4dd5e8ed094a1b01abb49a3572738d8f1d33bcb5a7ff8fee3376500f7f99cb1df94a8b6ebaf2dfb8e121b416ed5dd9eeca4e3d0f4156e12ef02d023103b833e8e3a60262b6aedf8ec65972a6bb318ce0b943495683a2d5aa351f16efeefde5ac03a72c857539b10e2148219469da39c4c2699e810f0c6f4acef737dbb853e0d8da3899b98bc3734619b1a6be8cf662e8a9af311e567aa56aea02c74c496135dab910b6a2018d0ced8ac8a32a285776a3fdedfd59cd5ec3ea6e9a20f46d3b9afe62e06ae7c5ceba775b303cc205e9705d9c13527f7b37add6092c7837b7e67d72fdadaffc924d673e2701c6e438aec4a138c8a32b1ca895d6c0b138f53040c6862ccaea26300d287474ba9047a05f43088c5bc3544048e9c0ab7c864c0dcc4ab042d898f5e3ddb5c6e1fc42bdefeeb3a03ea2c980b24f440b75ab276c2954fec749728b4b4f97885a0d34627af32687dd46e2974e90030641c466f20b6f49a395015d8ccb5a2dbfda0e0e88e87755bfdf00df56f93fe7dcdee1d18f1047f4150d03b6081274f4757a0a0198b0ea75068f5f824fc5dbc8accee3c7e7435cc2a3d65b1ea006363e53079d056341fe9e7900c418d56fcf756281aacbc8f78840d4edf2f06e61112e2358dcc9539e7d0d130695d2fb0d187141b07c13ff65bfcad4405893a48538e493e7d018649bf9416171293871e0283fcea4662e8bc8a512560ab2ff4cf8f420577cdde7606894932108221a923cd402f1d5aa31d21b9eef15df10fcad32e058ed7a8d079ff8571d2bc971a45297dbce26454554caaf1d48d311d4291d3a8e353ae1fa7332498b2f9b6644a261130c2866e96b88d3d5b173ab8ab82f2dd19bf27ace41987984ad20ecb66b4ad481ce9ab2e318a4569e943bd87785ace4b19bac166080cc78ed970c36dbd7977aa5de3a94b89136aa38b7b086507d196634c80d19728a52ae3a531b4bdb34be846bbafea66d2f2b8fad43cab91c96fef871deff2d3eaece008b89dbccedf07c11694f7c13773c843d83ff03d88d4136cd1c824862feb54d27bcb93d959eac364e16c924a25bcc1072183fdce34d5c873473b7467150dcbaee309c2215cd06541e1436156269024b6f0343c7aa9b8e89cb79e780224d81d2088caed8fbf4361e11610185eb5e5301949e54e8d31716859caf32c34107d22184f4e405674d1be3067bfc827f7da4088eecbd380413073a76114aee48b340f4c54c1eb03efa22569dab278035280df098cac7dbdf91b40eb7ec22dcc503642a905759881c1e8a05fe34b9149c18aeb8886ed16ef5f15977d1489b9a8d80906230263256e6adae9a08f83fa23d5774ea16c5c84998701336be15c00fbd4aa9d307189a1c6d4960df3453ab597b17e2bf2f5348939f0e2f3d0192be4f83c8fc08a5571a90854ca027e0c04c2cd092749af7573215747ce19454b33570427d3beef415bb945342a517ec4475808a152610be23c76f992b39c988a72012c5751093e409fce47cf322093c2ee84ed74aa441da0c364208c4867c80a375ceaa502fb5991d767096eff1854f24e4db0ef4116da12608f74596b13d96923e1113390ccde4256431aad29657c2ddae1be6fd5eadfa8f1ebae3ba8f2c4db921d6abbb7e27115f45f1b0c96c1f4f997efb26cbc2aa59d5d12c1eef1de2e22d0e3d28fa87742076790e8b63d5960a18f1c2d862ce3c0be6f919b09f1bb7ee9aac7d32428b403828ad6f9952684a39449462c766cd64aa09a6c14dfba761755881ecc86c38d075bbaab306f1eccde798747a85e05ba89ac80ab324a4a46a3c15d49bb985a80be0b66c0bf4687bb4f25e37051bd05b38876febfb580cb2d62ab2d4c2e1d42407f8b67bfdd5fde5c3a1333bb18f8c7ccb65a185d72252aec1b9ea28928d088eb3c09f217f4469734aa5d94550f48e16cb883fad361c012bb73deafb61ae85b67c8b3e33b8919589a1659ee959ebc11ea38c0dc80e2b463f8cb5149305794c3fd0a514b5b11cc991dc87dcd04ec4753ef7cc35225887b3d9a552e4f96ea608c84ba93b51ae08963d3ca647211c1f2668d6c680303f76abe5a95be5dd39a5336c467202297ed893e1729fe611fbedc92c5250bb920070f8b645b3f03b3403a0de8f6f45ecd190559655bb21e54402b89f9f207c2fa664ffcefc8cee4da5b6025574910aab79b9acaa91fc849670fc953bacaa03917de366ddbe8d08691a63f62fdbdbf679e8b49b11a93a6080975bf8ee73ef4a0b8d126961c5be93b92896d46c743d31493670e170a72b68fd15b166a4af5e8d5825fe99440df464d21a018e432b8e3d2544476a9cf329d5e8ad076f9fb52556e4bee37ab77cfc019309122eec399cd9be90d6f951d0bf66d51b90d81ece0376511ae2f3343ea11d96cd02ff0ad4497aa50c110d364b6ea729507ad22cc42a48032b336aeed9547cd46de165d37a1de8086d8f316b850a9f3718813deb9e22eec3c798cff4d7b3b8994da9106e6f59e2ef1b12db08e9675c3b9b7aeb5f9f9d1a69b7fcfaa8d8d275bd527aa525d4f26cb734b7e6126ee975b7a9e9a55538e2b2da76a19e45b13b478620fbd00d76ab12bf8ef9b9e056850b1e2f751b5f176a616e2d27c9d233004d9a8e0d89efdbec91bc573e0fe413a19e275b03e8a2b214c3048691043f878e6d2ca66978d6bc5a3176b6104827ab710d7e426c68cf8170c95261a8c4505d8e417ebc9d09186b90206a0d4218a636cbbe85307ffc7e977bad41f620f573c3aa200d2b8348586c92b4617af156c617ef1d18adc0afffe982b47417c33936a1a8f0c5421c6d2793b535d8773002aea3b28cf10ef398ac7e7fc68f89eaae72e7170252aca5509bb03bdf20fc481d9d33e181862216c6a2d13446a329d474d8259c0cb142a90ca1310ab2482f954a5f068463d6d8afa13454e6ec0160ad9f2c1a022eb414895e38d0302739c5e69f2766f71a17ee25ba69e7663d1a73a3eaf03e73b10dfe827b06406d01de4ed7ed99095fdbd2c08f240fba2741a9af2e8eab3291c2f26cb29ab4533e5e12c83d9ecc423bb819b0b8f822574e103ae7bcd71957806468652583ffd36fe3f00c0d9165306b2aa95b560b4a4a380e71e176b06f32b396061bb4b78607647c15a549b8740c6985d08acc28a31d8ac8f1d9febb197948dcc85a283331bbccf98ce0917a31f9aca92a78ddb3e1c876e3f2e9e597e87b88d0c1af21d1156dfdf7e01c2c8685691ebd10e2cbe54c523b634087d3d35d3f287b9b8944d6e9082e16d52c6e8367d9d7c10a0bfa1dbc65eb08ec539578fb3ea0af30a892dc6f8d7ebcc34c74fd2206183ed96d1af1026930deaac1003ff05b74c4ff82b7bfbcddea50ad2ad84c64115ffec556f5f2c625b35de01ef6777e798e627f7149f57de088c6bd313722415033330035c795d9d81ed50eb975d85bdcd246721aaedc4baa45496a58e0c9a75ed779bcc7d60da6675ee3e0acb49dd8e05f31d10e2a0319f877e5281b349f19f1db9c4fcb87344b52d0008e4886759b28518abe4a669b29e6aab953ee238f8a1db9535228dfdaa86fe6596233043e153ac594cecc857506d3af283ac2b6fb17a8d22962607dccac37271e526ec174c467cbbd60e484fec084dba1b6a68f7cf95cac773d3d11f4b0cabb9057132fe17b81c27ad3613fd8b47dc8c65e3893ceb8e591e31b8983db612722ab111024ee077b7441f025844ffbb29f270e81042cbcafaced048aae4491e80b1e65b6323d6db9f7ae73aa6e07f70c2e594934d1d5a937c800592e81edac6e0d01dee7286a71ba40eff4194a18820c8b5125f396c8df83dc827c2b0f58ee04efaa5a74e8ccc5ad381b15ce9d1afdadc60436c8f0e40e71564dd42cd5db6349c52a77ee594ec84e6d2e9f9041bf310432490af1a2f20ad5b407b6a946d3f505a828952cc361f369ec1b4e66cacc423348c5536d80964ce655bf7fd86ad424a91a904920b52ab0ecc00d7bb4d5f109f1b6255072fa0f5e0a35e2f49c9127b3757ad04ee4c38e9033840462b005c32b57f9aaaad208d0bc0728db28dcd83807384a55f49f8674bb67cf63ccc74cd31ee5005dea2a1fd3b6411a957c4cceea396f1dd01631a210b19fcc48c913c4a846d7b8f4900c964634ccfd8673fa814c47bde67c6cd2f223aa4a7c7d6a3ede104d6c528875a20ec47b76d4fc11055a13ea3a0b3221dcad9e3f92696954fcc92a533e748535b3c466519134e45091e9aa9ac8900c72cae21fa38dfeff24fcedce4aa3fc9ace2cec3659c018df2e44031fe950fb27ae7555c5dc2a18536f836044c0b6a9bc3f05a4df456a3991e55e0e444a55a4efc21c972e2ed765572502b584639a589f9a04b4b4918cf7881c400ef6361037df7539dbda399ed0a8c2749db572ab064044be3293d6d7b7b41f7b26bde6ce2bcefbeb17401bb841f561b7ba1f70a67b0e41ef69068f489f9742555b87bc3416020a64c24126f190196a46b6b91e21186e2656bf17900bc7d7ef45f6a5ca90900e0c6fe63e015d951e16405492dfb00f3ef149e3de5f1bf46042f9ece5c58420f3d8232aa641fc93719730f956459ebb723edbd2d1097da4fdc3673e84c1479c7570d814d92c90c1653f2484849fc30c6301345bff01ce6d4c3122665c32536509410e0ac864f7ae38e90c739d17e52b5f73587c0fcfb4f3c2b1719e54f52194f0487e6c266522c27c602d942596cc8bb64c71088b62c2a0a2d32f435ab92d335e2de07d81094551a1ee5c3fe858670f6376e4e17ad4351bbaba0e72bb0f0e1581502cb950f5d0ad6f4b57e81789401e26094507ecacd9e9396d00340c368c5fce136edc1e828cccbab40a283819dbff10aded1b830ca3b34e6cd93849e483594960ea7a22ac837bf614557a95aafd3e3d91c4f9a7d1aed03eeee892a025862069184ac3184cfe07726bbdffa0231c3c3f2838f97a8f47ac845eee3586469e7db45e1b886c6f7361ccfb08674b0ac185dac01c6f15eb2b0a64e9d0420b397c22d46863da8481b0ca4721d71d41f319728d0954ab376495fa51a1a9d5f3346417d447eed2e4a23821f2264d10bc575d32aeac87e1c911e4bb05f0562c52adc4eb13b3bc1c3c24d026c1fc7a5cbf68cc4ea998c91c3e66472ed76d92bc8a5de571ec2d3713cbb26d269916c9fa5c155d3e1de0204ec90584d2a47ab395c6741e9b64ed809ff9f2b05600d2805018c6886676075b874e6e267a77bc59143c396b0df32418392b3178ce2c582459a041b2fa8338eb98c68dc18be37ec1f78656b85d42afb46a83d46c9ec14fa1e2de29b5289ce31130c5c5606815f071b006d6ff28c3b3d21f5a6e6d0e32c5362bce98f4ae61b40a06e0e58fb45d032fe4d1267e14de17397e111f41acb8cf09d02bd7e7865ee746ae2843a0727a404aab48194e48c6742b8f3bc3071e8117d22eb1664fa087e27a885b4f52b567729dac903ae9b70aca3014b030eaec0d198f4ea58c2c466594489cc88215c00319942d6937b03d1018a003b04dbdfd65cc25b45513cea728f04547d88e74756a005bd8f88329c9c84929af6619dceaa1611a37fbfb9fd5027789b7e6e6ae7fb1b0bc946128a0abf33f883e8e9e5da1a288c014279539122b5a620cf139251f3511abb10af5fc23e5a5a777e02916cd3929e507cb51793bed0561e442505a5d950fd7e417de9f2ca9096d5c53f1030993989dfc943006953c8187dfa1608d7e5c6127b859371106d1f1b3f685260b8676ab786a4375e82aca145476507aa795559d12205eba24fc72e51ecfc34935c1161817b2790d8070546d4b53855be5e4491a5a9b7a7c7b746aebdc9fb274f67314b874cd095afff8fde11382929401a27438d2b1cb540724181f82c57672d860f6cd18728d82529372649ce890fddfd2ebd947f9f0dfd026f814827790be2bb233a533f483983021aa3dbd504954a3972eb0fb2fec2533d2185884075fd993a91ab383fca0004abce62cfa00f02be355eac6cbc4a234045f7bfbb7e02fd2d98446b52da2495854062582a54579e8b3214c804ebd106153a21ea475cab5af20783fdb043f3c979dc598c50e995acd7b6d1981c87ec28ca638dabe46a527d9b6c37deeabd650346acaa76a01f181d46d1eef2d10345b167ef4df830696118ac8e76dd16c84d12f45bee77312494d9a3e90d5d21030c06a8a6c693a8ac2f25d931ed1db3c08c82f408a7efc8324e3fdd292a5d7928f6e70a2c337080e8b1d5a2c42e77b3a80f7965d8dfc73fc21c825157d000d363c75eb2e167154209a2731b46e5a2de504de45918535db9028d46dc05b8b6e32afa3cfa1aa4391548b6ad0f4596f563b338d309e7ba23d984c338e6699273b56dd4981d051119eeeaaba76bc6d17d3f5aff2ed532418da49188f016a237b919613c228d527fe081abec14b1391d69c2dcf5feeaa5e271dc07f421e8bd77d03c3a2ed842ede1ecd646b4b5e780ee5fb71d4595b9890d7426a3486065744cc5f097d92d732f2f481b8b1d810384d9477ea8e41f86cafa480d27f1f1fd1b055ec38fa88ad8126cf0b403404b9ef01b930717d128ae415eed3cf9eaf361b9947f405a13e50b47c04bcd2cdcd4181e24ba7730eb4d139391f821570984d54db1d9483efa93548d3818e3651ed409c556d66637323e14d5e1fdd903c1cc37b85ac4ad873ef06529a5d02397ecdc1aafe3324dafe51f0801336799e7a4d00c4e26a342e5c1f688c4e90e35474727a594fff281a9a5a0a847d746e466fd818ee078e731c45c3c710494fb7d9a4309d6544bfa8eb2c31e762a2c4e04d35301fd5a33a90bf1d91c9c54ac1a106a607117cb9c6b7ebe28e9d320bf4224650b6467d3e2b7ca85422bbdcfc6ec28cbc712c9db864e8ce9596b63c23f983695811aba12828728e36f2c3f353923da2c3b328303f1b726dd5284aa5ead798e668834a024b11d753a650fdcb39554292ed28c8c04f375b3bc78c451ed1b843277cfa95a4ed108f29636ffa35d357b438b6393a6e8da2d2af0c76b60ed110b32f8752218082ef60fa6b55a9b647519a3eea825c62865fb8e29c11f5f00cf4da91c4957e93854e0d5340d3e20eeb943dec227920db8d8099306bd9a96d4e7c26828b1fe8304b271cb710d50d636ab53e6916f0036b6d2aae75bb9e99a6d58a08592e5c86c5937ae36b965c86807640b341445b4bc68048cddc2b0111b95a0fe9a4125ed32628a5014267195f548d6bc32db5cb8eafcf80e6c9bb2436512ea4811f4ad5a09e3ab902a54b1b1c1eb520170add1034a724566c371cd570a6f1877721c62ccf4743a69b66b80c9796d9fd5d3aabddbd45c36b175702416aa6d3af546f34c8fbef8fada5d34e92c15101013695139b09c2ad5916e078967cdf556b291da093d25c7042d0de8f0803953da4c90038813cdf17721b55e539140a8c8413c3e6f3ca2dc44fe3af27c502f10f0d704629a01cb2cd8b3f21e45c6b6d42f33d68bccf67a299acc635e63f4dd4ffbcc793cfb9279b828960da3e0d4f0c16544e641ce963a61517406dbb3bce46ae72ccaa1fa04199547e3fdd3f3a84c09d8f3da1968c63a7c27e1e1a1e6a751d0bf94a3cdb19a63350f0ee67b0cda8710b2715be7c8f3250e9798a85260aa7712244c3891f4afd0cc1230a05ed4008af06664070a0fe1f574918b45c06d84771cc7bc8a004d34af7844b42d9c10ed47e4344dc2a1a22cf2d5a2c61ac25d24734c0b2bc04848c775317f40b2380a32d48c5adc6930240182dfb29eba91730c09d629e369f438678164fbb5a183aa65d89488c26f44ab37607d5153b40301b8170cddd81e967861655d11334e211fbbcfb73902815202f60aa6a1c2cc70cd092dcf0e049126e129c6f02b31d05f5ca7fbe2e2a2ec22f5bbc03df2fcad05802bc0af7d434258a27b559c6c2febf44735ea25279ebdfefdcab4597a286a870d8bc3959f0a79027cb316fa1ae9e5a428b28ac6cc47a5194d9b8dba9d409678d3eaa9fe3ea5039814157ef88d5086dffeb4e284f826a137105c5ee4ce21459123282ca30db3f21889aa90706cb7b05852ef64bf10149c8f0452a154d1dd3ee6829956d1ce3d262d2ab794353e36023220549441c22c1a93d3994f138c7c28dc1a249a3dbdd8543b1383c7fb206e03980132e17a96a9c136cba0fb9ce4e40e127ba1fe8806870b6f49c8498b2971ce9a14a8a83ec770a1ff58753fad17f75845495ed8c5d6a2102d64f18cbfab74658ddeefeaf174db486899c6c61eb9652996ac82551aae14773c6e739a20adb6868d63809c8a99a116b46769114d9250312848415f9cba787a719f1686e8df0011634c822510a78663f11310cc371bddf45bb331b71e094a0f77247a9596ec5beebd858e0517a0528c60f1d4f7456ca84c38d99908a74637200a169448ae8571ce319c21b8f2ff9e7d086679a657575fb4060c298dc8439801e255854ec065de1276ad1b65ffff4331b3b9c3ce66230a1a6f809b091ca7e5ec3828a50bce7850689c408f2ec36f6101610d63e669ef2287628d208f6eb4c52cd88a9e3542653cb9f3f3ff47eff05816880203130a56d4cc41e5f9b56a4c16126146615824efadfda4b59eda5b0c80ba42c8740b2637250f3c05bf5fbaf0b8a59b7ba7024ebf24ed087042cae9e1612c1dc923a613569c48afa303b0ad5bb45f5143a59464df01ede079441e23c034907d01c151a4c6c69fda1d980400408f80109ab4c1a56ede83544d0b9ce91825afe9e566b4d2ede5aad0f932aef7ee8dc0027c3b0853821b2bf262e1a43783ca187cef6ccf03d66198c3349892c3c301e132198277480a3a0c38f0a46de071e6e498484960b34eb50c1c2e6b99a2bfc13fe9044e97c02382d07079999a7b131c38392bb07ed9c071eeb4cf12cc0d07007f1db4841951692ab72b556474a642c30fe2c6da057ae5749b5a299f911d3b281e7c9349875716c7561058a032044880d790104ef08a57fc1dc1679381e328692971df15c08701437fe4548c40d3e7b0114ec03ca135fa25c30ceb29a0e09e7a61bcf3ebf50414381d26d909c51ac78143b3c243bda29106b44d943b78f552fe5fab8d37401d5b063c7832a94e084861f6dda6e6057eb7dc5e94c9940756d0eb35abf97af70b89c9028a4b5bdf7de724b29a59432980ab409990935a190eeb3b352363553bb519b2e957853c9ec3714d27d6af44a669fa9b94d0dc76dbab27b3923639baeec9ff8e1189f1d14f3edb36fd9966dd9ae39b4b59db59eb59fb5a0b5a1b5296b55d67e60e5e0b3ef485261364db5951db471aab06db44356c9ecd7a6a9beea8e24e20ea24a66777db1ef7f3946bbdce13b6474a7b2b043c9e71d33ff9207128cd634b45e691da3750dad6d68cdd25a466fa34a66df47d3959d1377934a669f214fdd46469ffdfb409d285ba7b64b209ffddb41c484d934cd56769b2b469fdd268c09db41f355da64a1d175abae8be9ba1a5d67a3eb585d27d375335dd7813ab5dd8542ba8f39aa64f61719f68ea21db2faf2f1d977105918f5ec3b663b98eca0f1589ab1968b630eeb47f5d57d76af4b4ddf4116167364c7a0cffe85a10e94cdf9f4982795cc8e017ac66b8fa9d15048272ed91e73545b9de72ee60887dc21fbec3c6a33663d7b8eec123163d3f4d9cb1db2cf3742d395dd87079ba65405638eea2be6497d859e3da636639d670fed981384b63b71ff4c57b62ada7465c7f2b91bcb69fbece5f743a49279ba778209d3957d08ce2fd99e47adf7b63c84769019d39e73d7cd918b2179b503177c73a60403dbd31105fbd4a76fa51838f1f4836fba9ebee9cefc725b980ad40a14554ed0f381db45cfac3e6a60e899fa065bb7ddfccd574a6f700f1e4c2448c6785e3c27be18083eba15e38b8110687ec87ceda292a5f8909064a151589e52af93466b25a150913eed41b3dfc4ce1a9764b71c285b55d28e4ecca50d8e3aecd0e79b2ecbfade7a4d7ddd1bec9f06b30834c4ed3a99473f7aefb495da54ce93a3b7fed121364ffd1ecd98930fbb4f334631958b2513fddcf1a4e09931ecd526143657f4a2602ad63d29e88eaa09e561a5781c7faf63b19baeeb9fccc2c2d9baee4d1ed76fccde5ef0af97aa26dede32bc2857c997aa299fecad5f5175f444556b42775451a6b836d5d1c474d614a5b7a3237eb2443babc44f6a538e72ce5ba732adf59c943a4fd5973a6b35ae70c8d8e5cd4d7de1542bdfbc2957b4b7fe95fa29f58e6478080fc92a69872a69471cb00c27a9a4c54295fcb4d17409611a1eaa3055516d59ff52454bf236a8beec0d14d32ab5386478b4196bf294e8bef8828cdeba2662be405a25812a0c34a2cd1868c4246d1393252548496a436fc1238d047cfa122b3177544c280f1a2ec246339651f0d64bcc04bd8181c6176fbdf494780b63f405c15c113402a6e869f50543c46c4a82745469344d97f51e4a74381e34b23018a0dab28ee468a89604e92d8c92a5b7304c9adeaa9abcf5127c52d1aaaa48541931a13b2a25260feb56c5c45b1593b7303f36ecb254d1de3aae155f25784657b4efc937ab0c0cbbda8a33aef5f6b0fda63aa9050d3f5617e13a27858f02df988029948a2a6ea0534c4942f2d4411af5a54e9202f5d4752daf94a4a77ead9582f4d4254093789234051349531491001a851448304dd09721aa0f52663f93a4c8a40cbdfe99240509910beec53f93a29491aa4bbe1b3a08e0bbb1430a367570565a81ef461228352a3b4cd441b0c20a2a4535be4991ecf2bead426ceae5bda925f86ef09054947494c48308e8aeb6caed66c130045d25499af2e5923cd1559eaa30194da92531ea584934c8c4fb969c7c7937c82d510589bdc32dbc4f339695541526b74a120d66a14aaa12f4b4a9dcf40b12309d18f9490b6094d0e8c4a861a5059844458a8e1245e589cc2de68a1f2a28d84954649a4a14d5b61a3f937258e23ef98ac9c69423f9671292146f8548bd261b89891256454af2fa09991a4c666270a029ef2749619a5449cd6a8ca4a1242518d85f57a034961405884e3125c9febcf5cfda6b295416a953fd121e409d30d6dfd152c6f76a4e8572deeebdd4466dd62997fab2dffdb0d64b19075af6129a113a0ad014017d09cd08dfaff0e50f5bfda941b64efc28ce74a2d4365d33ec923abd7df1e01f50d673fecb3439db2aac6bba55a09b040a26d349c9dbb20ebdcd3702d651b02ef812b4388a553dc5a92fd55bf0add3b933c20d4693c7fc116e5862bae64f580cfc7b9fa7f2d42e88f6745c2a695381deaa0feb9d276077a3073caf5e52db7b230808d0e3b9ae3eac7fe2b62d0b82157a3a57e1880736d039017a56e8e99cc77e3414b264039d2ff1c60e78a0fa077a6658a41b55a03d75cb8ff51a649ddaacd39bb53fe10bb4adc15e1ac4c2b2c9bfae75505090be9ad2a67cf74b51d05ff453dbd5ec3ef398c73c96ac9cc95339ad474fac51b9e73718507b6ef8c3acc8ef82341c42c3bbb1a43fdfb98ca8c2103e325e4515680fcb79aafd89aa640b4d2a39df8667b7403f56e30bb3d1648586aedb2496e85e26b4faaa51e464745461b6e7bac6f622fd517d5d5d447d51267fbd3ea92f1ce5af5b6bdba50d9a493718bdfdeb5688638995568bc46a6491cc2d76596951f595fd22a924ad7a35728d593462ed213f6bbdb77556d61989ac6e2d9285d9a0d9baae596345d2a30de26ca55958cead39b4796d9015b2486a8c9736c8792a0e9f21027078a53d5f2896fac3d0bf0a86e2e734433e0f97d0384fc521ceccf4d0384fade1943663d96f3ee3cb1c18af219e4063c495384b14b8c70e33de6d6194887bafd3a6ebf2585805505084931124a0020431f48860850ba6b88da04b10133dd7737e509aa54f684d25d229a9107cba7e5dd82a541f027b02aa7ba003327e84f6c88c34b3478bf4595b6af7769cea09feeb94c96683fe7a499dac0d5f82492338c197b476fb92263575b3d7abebf217eb9fe7b47e8e66394ae3eed8a392d76bc6d8399ca380adb64831956656b1d8612685173370c18a13d32b9727b418c009cce8e10c2b5d664ab4ccd8ad50a09cec00825aa5788286265b84f12407286af7765b9e68b282103f595ca1822f665145f7de9a15b8825d82d568cb134c6a12155a501230f48085132d4f9840f543941f239e941043e6558ac50d5e3c11c14413295c58c18926a25e4004058a2096a6d7ae8ccef6840e9d07b22a2708e2ca0866c003097e90cd40ca9131ae484ae18714dc13b147f6c742b1c508288625204c50c591ae054fc050c3efc04396207008a2d62858f002a16a0116b03041438d882e335c6008329470e2c406a69966011956562bb88094c495218008c2055d4026515a8e28c28628a2a84c994f301ce1228869890c23482e2af82189278a302209a82c4a9b15c515555240c50aa82a3d8821048396193c615b42de307153736cd50915f7de5b2b501431aa2c6144cd8923bc7663387902830bb4cc5680031164c4d0739dac7507080a910994c8e087a00fb044a93989c289a3a7e9b5c3f2e4a4684275b9020a2998f4008329185085520a62d0839425b604a964f5771efa785ce15b335d556a66acd62ac3458b187061a2491752c2b01265c38d4b132880f2da5d11c3490a6e7470410a968eb010c491249088c20733be90a10542ab2bd5368d6429c10a52800494242b643046941c4220030c59bc76563a272740ace0830c4c8c80c1951024391201255880008a26aea0421ba1c8965db28aec5c10bcb5371ac050010c514898b450c2227042740405259a8e8ea05a1043122dd4da64064040436441c41732acd0c28c89a51792648101cd6b17061835c86024e985168eb40c0501430f4b544881c1114e5c10412bc62cdbb21b0cec1449062e8c90b61022a30c254c34a3583182d6031647a2c0128513db0d51454238b1c5426979411b3511c6114b40a1610459c9d195cf8789192898fd80c08a15a4bc85469d7bce0a853cbd769ddaa753c3b74a6a1b555bda39d1de44db5449ed56b44ca25d122d179387f64ef482a563e1eb7bec7a2c8dd8282cdeb06263c7e3fda9a436c1b6743786a3ce155a3be7295898d67bb358ee24396f2468da6bbf3f51b7335e3b0933e63d763a6129cc0e4c1886aa2ded1aca85d7ee853e98f64b96c936d5d7adc26cadb6b4e39fd22e3d76ec9db511f90e00486cedd8224da9a4f64e34f2e3bb1903aab0d98364e8754e520ae9de0b826597fbb5977389a75a91fb1c4976696b50af3dc895ad6b5c7bfed9da57f5855d634f5c42836bc4cba5b6b477e27dba50573b26b25aefed3e12e568bf5caabe51afdd045dc28c81aeb53fe093e1404f8d5d38eae992c161138ae0201716007f5ee7f6bbb1d4c0e35b8551249bf6fc8324cbeaebbef6ac8449d943e87593d3df7ae83ce37aca4c7bed9fd7a9a09d6aebfaba764ab5d3194582e44b3a14822f6f62f8922a79dde33b1f72bf8ba1d1a82830f1cd4fe517a7cc7996ad4e6a1a9665cde9ca9e718eadf281e0df19a32f277ba50365d7ccd87c9f2b7649862f27bb3a3d811219452fc44fa52cb62ff54f3294bcfea944461231a0be0495b8587aea43a96949a9898a52538d846f01deb4c2c5572732631484b933270f1b36befab41dc7719cae697daddf4fefe6ced43cd54825ab7ff6c674551a267639a1b859c989445612271c224258ff84fa65cd103a04841bd355dda97334ec9ad6dc094279d49bddd6e00a23a1b6e8ce026ecc1d104298aeeaee9535a5f82b8ae0aa58fc54faea44a6abfa0cbb5bc1c7f990ee357e7aeee3a9df47ce76fed9a6c1003de3551ef335401d2e76fe68f5053ae71fe79f91ccc28254ce739085fde01cdf2c0c3fd916e71ce73a4cbb34f2838e6425b9702c897c8f2792fe2295b43f41b0af72fbaab1d4409111664ce59ccf9497f6bd9410f0b14acc4ca68b739d2dba12bf2796f8cb8964e4c7531771d39385e13ce9d43666aa24e794e2a64a1aa03e1db1532571b697d239e79c97d28bf31df53cab303a8588f34cabe524a2e7989e03f3d173495c20e5f832233d97979ecb4dcf794731e75c099c7398e939e7c8e79cf311b88904c397d329e8cb09f5c29737de118e9c6dcf8259a44fceb6879970d38c8d305d9c738ebf98af054c92734e3f1339dbde1709d265e719170404038830ade09c88fdde03afd67785f7b602983b19f8b993659467c6a8379659872f7f3c4780e71c08e7542461ba38ceb38cee3460f2e09cdbe2392fb30ecfd55496c7f9379b31eadc477baeaa9aa68b731f1e3e9a459a2eeea6929c5baf24e741689b8a1869bab89fca794e856526b5c539e733cf2ac9f90a66cf713e6fb81511eeb42e41a24c4c28119312d1d292c854f497bede1d38ed1208104c8331900abb363c9382f8697282c23747a3e06bcecd8961c9a5911bfae0d108bd8570859e080a827948289b7a0984f3e1a3ae53db530301c5a7a5ccd31718fdb12d3c29753d639ed3d18a4d9d8efac7c27a60cf63375b58e352cf261888dd13f57471af53db55f6f41bfa7cbabe4ad0f55c7a23f486191b74ea9702743c527a46e8ed8dd0db57d7e28d186ccfeb013ca7001111ea4b5f0fc55bc9abbd5b492ec817dbfae763c59ed87da8ec727279ecd66122d416764c240809f6f4721ef1c4629efa9e31fcd45a4b5a4d050be92dbde46cc37cb83463af2627dc2f3b99d197bbc6928fbb1b6a4df45190623cceb0aff3d88cf39d32f3c32eef979dccc2eeed64792c7f7c76175ce01c7f7882ac4aee4ed6c96646f50576b34a5aef921029e998d08aea0b8f1d5125ad2ba9e4771d938ed66900c4cece63b3911faf1d9c59b2adcbb4de2c27efd2db6ea9bef65bbf532e527d25cd18f69b59489e18dffc54987a38c00f3ff55fbed8564c3197fa9c8aaa277f3ac7010cbb840754f23a7eec393e1e7b09f5d59960e40216b61d7b0af5f53976156433a6f3d82910764c87c030a5da2a95ab505bd8792c2c02a991cb447a0c8e2978e2035e5ad8e56ac5aa798e73ce5916669d73b7b0ebdc739e535f383edc5c7acc711ec77d1c07725cc871298e5371dce6388e2be10195c4eeb252cea5df421a8c6f7e2aeab4da9b4388cdf97735485f6480bd759ac38415992ddb022316113b881484e8906cc6320c4805820436ad02a6de62875133b3e400b1690748ddbc35f58d3c5ed8e5bca5606135b3655ddf68ad18638cc719c8a7421448a7b6eb0895b44ec5222fa0406ffd06c92e2712099596468c28c5c0e951a87f3d56a7a0540a507dcda50f52db74fc3e0ba62ea8c2e07e094580a1e3cc135604c97e911cb6aee438e4e5e774d18f4edaa5b45041cde64842db657cd7e74d99c366f168f1bd4db6764f55ec927c0c66fa9f8c0cd45325ad8c6dbaec9385c930955a86c9878b5de278627aeb3964d365553555cdaa6a371422fe1c69dcaeeb40d9d5b970889eae995535aeaaa424adf20aa9925655a33bab2c260feb760b29352cd6cdaa9aaa76471a3755cd06d274d91b5f21c920c9fcac90703ce1b0e12863eec830e178c201d5c596b7fe71a2f7a492d63b62a23b5e94c9c34ed1c55bf06a1c4f3964399e4a1c4f6ff38843365dd67d7890797aebd7ae82d076e91d4d974dd9a6cb5aa3b75e7a4774d614e6267e1e42393e219d293a359d28b024f9e69bf3cd37cfddc385d5aeab5a6bdd73ce09ead4f61c7b00ed1e2eb05649f64cad38204e8e59ade3b8a74e4da706db01b6c30174b89635ad5f0efea3b6bebd158f2e1d32ce837b0350ebfa6a5d5b319df91a7d2a0e44faaa7f2a6aafb5f75efc6ab2653eaf26f476a3333ac3a1cfab4966c2a960b4ad432193567b71e6746a48f57943f0cd18ad14ac96736e24fa5cdb76f6d9f1ed75aad81ee7361432c4049d291b03f48c190e11dfead4766993f4d93f9d28bbf34f878afd32b3b06d61d7b3ef30b230ecd9771cd5a2e8a0e4e7293b6fa30b80cffee1d98c8541cc18a8c1e71e0d8e6c2b3b4fcd64ec5203d9673ffacce1a0816cda1d329d2936e79301d8b7db9001d75fc61d32710751d02e6d9a3a30c1a6a50e5945e275c8cabd0305bbbc79ba79bab1cd58e8d96fca9831d0b3dfdc885841e5cdd367ffb8964d920dd30b0c8d554c0d1b2cbd014cd7d1e8ba55d7c5745d8daeb3d175acae93e93aebddd5d3d18e273b6a33f6b9073a86cbf8da5cbf7aa7a7abfb19560f63c274c874106559c5d4b0c19299a1a11dc4d4b0c19299a1a999b1fae2bcf6c8ac666d971ded00b18f2c8cfacd67e76c9a34b857ac1a0d6eb6955d831adcbeb469d2a0e675a4ec726b70c300fdcf6fcaabdb30d970619364b3545f291b2f3efb97126d9c2af9345dd9af4d930d169b2c2911c45a571d321d325cc70d6a364d3a6463d374e555aee3b669da374d3742463a643e3a506ae77aba5c870f73478323aa43565f29cfae23890ea219eb4a1d2698993283345dd9eb4cad92d93538a23b3354268fec79e68acf5e6af0c4e7241e57d8840af3fa324df4259d7d9e597c9e5f6c2cac327cbe8064e13385e1337562c268380d284fadc0c28b172fe995c7d86f761aa086c97921b7ab582931744fbd1ce0397516e7dac2c2d87cd5a0ea80f9aa21982476fc8d5f0d4110379e407fd816768cbb8f03615cb70aabd6da2119fddcb3cf6fb38c8ee81e03391111268c1a7554a892d849e8c071da7cf66f2c6dbcb164699cb99aeb501daa4375e89154188d0a42825df1cdc87c551ce604e6ab0e5512a7861e53d9e38a03bdd5a1faa3b5d65a6badb5d65aeb4c73449c9a9c33765c6e8a93933365e2be0974bea85125b1674f893a142913d7040b63d1495a6cbd717a5f9852ed1790f3acb5baca407d3a50f6ad24adf52f0d0d1e41f83bae806905be39a9f50924f4d4cb8cf9b9b2f1a931a7b6b05bf73107803da7c704120a2088ec09bd0cc0639f1348d08f9e70bcb585bddc11f25958e8e111efe1fcbb9aab60ce16e4f0b519f4dc8af5bfcfa34e9df3c4ebbd76fb7a2c35f0d4bba7ff5110d75949bc0fd0bde79748b9c25b0f41bf3763ac1b5f55123b6bba30e833fc86d07c9ed3802308f63fd7c0773938c7a389f91adcb630b7e110d0c7bad797e7d86f66ac73fc1cf8de9823f6982eec3a5bec5b04c8b6f2cfe9a236e7b173fef80808e939e7fc23671b73a9713e3dd738d77ab39c44fa90f2517e42a311719e85b89a7ff28f17ea58d925e6f2c3fa19ea58d933890b2ef6f38f857d58cc1697db8c7dcef9f438c72f980300bf2b26c93997e7fc13f394e9e2fc43b23070cc54cc16e75c56f2c6f2f3e2399fb54a72eeb4cb1fcf79996be46c67dcd4899809cc1ca655d7b4ae551895e20889e9898b17b3a85a931748b9b6e3cb6c7bcecb7cc33d25f7f39ceb5aadd6a48926484d9a68d244ed5643aa21d5f60fd2945aad8612b50313ec5c535081fef880b95320207488c72b49567f400923cc98ddac15072fec72d7bd856c8e585f97a6ab3a16531f3ef89ffdeebcb45e7b39d57ff4e618ed123fe1274a3790b8837c7cf53d545fd839afbe89b6923d5b1dcd580f18a6ed1f18cb561a4eaaadea9b4985e126b5859f4c69f2d56b2804235592868bf04b0bbbdc3f4c34ba2ba5be79ea759c39dd791f0782a1082ed214a13d79a4a12bf4d0bd7fb69085c910d1c5872b4c4d7cf8610b242d906280420640ec20b73f74075512a892d55d4fbb24cbfdf3f42ecd98e33b2ec99e6d8ebe3394b0c0802a61c952637e2a85b1c553ffac5218b6abe444c36f01f525a8e47424873f95b074f1d49df8e64dc91d7174ce49b9b172a9e3f48983b81fdbb213a68538251cd1e5948cdc8c23e2842cac222d09bdbde11f0bab4dd6027db9bf72a9b623b60de48866ddb5fc21f3f5e52bce57a7d6eb0d2b48f8b1f4e3ef389776d076596d95cb4cf2210c184754565bad157c71000b40ef3e10e93b967b247a5b5e37329796704b82bc87e3dc5eaeebf24d19add3866d4172d8d4b1ad6a2ad2649f18f0e15c08fd1a0276ea7904a6a54a5aa74a3e51a8ea24d6270bab50b5657d68c97ad4d7cf33867f3ab655580d02df80ea4ba8be9274a1e46d56f2b60b265fdedc586bbde257e9cdf096524a3d9b8519994f3713b6d32e3d9b67c398bb612e95b4d8a6e3c52eb1cdb359d88acb8ce195d765be7c4c32c7fa34a1ae64acdf983b39b4c683b75edabc655967cd18f59b4377bac98396f56f9d4f16db9e3c22fb335dd4418d7f68a5ce53e7f7039a1143abdf9c150342baf73e1f2cd2ffc8d9be6fb97b3bc7e2f7613ce2283276396fa97ac9d9a649397d1a21f95323ae0fa3439fb0eb74e8737d74e36b70af583537304b445457357f63976a4bbb65a257f98709c325a02ded2778eda58f2ff10d177184124db00fd3a57d869868baa07639479d2cbbc4557689894210a66d4bcf58cab5eb4cb1b5a7441cf597feccd80c454da444cf2aa9bd9ae04fc07f02fe72de70d474e97dc62ee70d13e5e86197f63af87561e885e1178660188661980a435518ee30042fe63e9919c2293f93be903dfdfaf26448fa02e929c618a7505f5845b17f37441a07c5174f89dbb118baea3a4f7d191d8b7b5c52e32971098ddf40714916b2301af7f1daf34f06cab24c6461385cbb673463e26bff36b8f1f33a74a84a6aaf11afcdb6708841af45fc23924f736fafef48038225e1c311cba6f11aa7f11a2f2fed090aeaba065d876117865e187e610886611886a930548521787718b131175b256b444aa38bf0d40e9ca6d3129aa74a6abff8deee624dc4e4b5ce1dc644f5a53b0ca5bd460cf21e1aef30946dc63097fd9d9778cb6bc765cc9d8e9ced1b0ee9fef32f8f38ecec3cf5ceec1f0e8790b38d7d7af7a1731ce73c96c329d7a96d0b6291fbef03b168ff8a36034dd63991de668cbe15c2daa8b7f747a8bc4357f656e84b8cf417c9db0bf4d6adadc248b02d7dc351f505e2a7d73f43fbf43396a2b49f9f9f167acae9f4d831aee54472aa2ce02b93d418638c31c698c635761af1d26c4b63eded8f15fa0b09636b8ddff0eb452c8cc6af933063e15fa6ef7c662c75b75f5863c992b131962e92ad98b1ece0af5d8d50f5725e23d288d3b6688ce57ecef11913769f6c4b7b4e4e0109339679c9cb586612ccfb947198772c330daf7d7a230d3bd51766aae495f9c25ea8461c5549edc25e64a067aaafccc224b56b91fbb1c4513e494b98081361213ca55e2c13867d982dedfa4b4cf4f484899e30d11326ea6a419c76696ddade30c637a670c652982ebd44c4846d60866389d3c35d46a69cb797ae7b1054813ab5ed792a14d2fdaca447ceb68dc72267f148ab6098d7a96d70771d68c398a8b6f47d0a61381c839040fb6dc6f255329bb1d0c268546ee3b3477b0a33963fa5443bfdb1b01bae1a691040e3389c01356e337ae086d7388ed103438c7063043a42801e1a0fa23d355ee31eb8e1343e06d11e1a1a9a9a9a1b386c5c54a946956a54a9325125b5765c8466fc116a4fcd987f6c4b2fa1f1d16d4bbb766be3f239d9190b555e5aa8d70e8ab713f55fd5de7befbdf7de7befbdb78a04fdd960c9ccd0d4dcc0910addddfdb5e78d5f409ddacefe65f176d6da7bbb09560cf575fada60c9ccd0d4dcc06183253343537303070c6845ee6d8d02d1203d6ff6daa06c9365aaa4c6444595d4b45b748d625634e22dbab4fb137593c11946463faff1adbb45469776694695b4352b969ecf4bbbe1db7dc2370b4b612cf5de2c96fbed869f2ccc84a727a35b746918df268ec184d925ba94bb5b7dd126ecf362b0c2f0cdb6b4e3300cc3300cc3300cc3300c437034e102d355c96ac79b0f9e4b4f762947925d6228121e80f1921a4c2362264458099ea570abb96126b67601138cb06466686a6ee0b061cd251a934a6a1c34512535e8695bc318aac35c2aa9b18d0b7d2ed378647f362af55f0a62f9a324f2d70170c4270376e20928ec0fd84b650d03a66ac0ac661c87df6c80e3e2608a51e480031e9b25863e570c41b08ec72b16c12327a4e2a10742363a3a006d70dca8e9c0834ba76b031def460dcd8c6bf6e8becfb372a7ab4767a77a4686d5c387f6f1023db081a7da78c1eee540a6b09c7f64db79f68959b613e9ecc046e8938176006e6765530cc26a6ce0b0a0868f98ad11b3a2f1e3eee04ba38b4d1d86caa6feb27780d02d76e8810daa0fc88d2cc6a06dbdd2fa829d41cc1b6badbdf7de7bf787b97b2f68b1f642950d2d038232383ce8f57f37a0063ac039632a1c566c1d343a74843e1600a0c5d33dd16dab08abc685a8a86c2b1386309bb4bc1d57610f17b675329c82bc81e6460b9461b564e6069f1d77785c66d9d8c1bac1711a2660f6b0389a39cd79e6728d185a032766e55ad1e0e0d23cd6f6cdb1f47a600ea83bc05e5fd6c6843e1768db1d611156189b7a07356cebd6e581a501e3018d1e2e6cec3ae0adaf4d5f421f3cd2b86253dfa1cf1d694cb1a9ebf478512a36759eeac1d04be863ad2a95233e89dad3533f93ba74a94adf04a7ab56ea05f704175fe6744674418ad2a5e64dd9ac9f495d685ab66bfc4ceaa2833ea2cb91cec94eddc22b61087191a2c40589af880b0960c025866ec91619bc608b2d8a2d597489a2822d49a46ed8347e266d5192c596211fb6204971b1c39f495ace88d242060e5ab0a480b468d1520437b4f5de2afd71de7743cb92192c6c58dc6ab6961c52324b321a2d2cb0585fc866b4a86c54419249c251438b1a6b8999182a361b26b0b14a5aaad103a671052da60c1b40982b6eab3282bc97152cd1e8426367f10483055475217bf1c24bade06747a911aa748ecde80504b7d6bb8ba7d409525f122dd439361278e0d67a330931c96a6b82db7683d729cd3e9d630bd2e0d67a53997939393a0621d7e3474ece8fa5a54eeb1c32521f6c41f4843fc0e207e983a626603ec8420809fd01534d88ef032e925a4084f481174b23b4409645dfa04e62410b705c3072f39c7323a97bd8ddcf241688f1f1b0412dba6041151a0a1638f1f9b0f7cf2416a420fc6181cc2362dbbce07b617b16e06de3602225c3962941b864bffc4c22a386af0a3262c0b26dfc4c82dac25181727ad086dd3402d412909c1f5036d0a9efcf24a819be641de1db77df565fe15778eb2bbcad463fe79c5ec37781bf30bca71b605652e4b1220aeecd7ebaa7e471d04fc79981b59e9027fb5af4c20db62a7a98628512541c0ad90b5c546184510d9e08ba1b8c7a585b7e316386a118d2e2a566286e80ba4715ac3b8b0d869600aa85afae677e266559410c5f101bf60adfa4f46d596badb5ce13aacf0e9b8af17d3867eceae59c934e57a50163532f6dadb5565d6bad43449c19547aa9f83e4ad62aaeecbdf46a3068ad75c6ccd8a58aa63aca21c4a663a95219a968aa599da45bd5d4330bd3792cf5c663c97a21ff2b645bd57164e01179447686a73e82aff65e1a4b53f4ec3bce76b3d21ded117d9d4eadcde20928e8aff64e17fe404e71231634b2f8ea349666ccfa75f2158b7fb19010f13b9c28216b2bb529eb31f1cd19b334636cead36badb5c6e60e4864a1f2e50e5d90e589f0c8e67e2665610287356bb2d0366bc3fc4c5a9222cb0f5769c6f6b746e7ac55aa8d8f6cebc652fe79597fde87b164a82f1fdff5afc969c6accc9dcfaf7f57e69765c2587e5d759bb1f1612499f497fc8c702a0c2fe1a52d1336e3b7fc62f01774e1afe325ec546135f8c8c266c63cb3e5eaeef1e8738ef33e9548c3272eab137f7df2eb90b14b92f51dfded80ec110f3fbc0d7d56f8a573215425d287e1a92b31365b7949c6d4b031d61a639d5532662556a24ad2505d254c2a79b34afc9a70796661d589d9aa5618fd85427315ed924c8995265622aa1193bcce126b12b375dd864352ff194dd7fd6632a38fc947cb41f7864da193183e55f23a8923fb72ff77645bd739f16b52c9cfa892d76795bc9e8ae3bc1c1c15898b8a661686a3a2feceece5dc3b9289d5e69cad0a567fa07d4753ea6ba9be9c86fe92507f3f2430947cf931fdfd9abea7cff6d7551cfe66f555e2a23cf4d7ef37fba1fa2a71148e56e24b70bb5e759f11593feed6fcfd595e1c0ac118e7a0faea9094340b3dc64637ccd8b4e83137e22695bc29d57e81a1b1c23e7bd481b26f1795af67207c3dbf8e8baa116ec2711f7695e348b1cbcf4808f69d1d873e2abfa3911b86f051590207fd33cc165465108606c6294fb9872414a3cfe805fa7571ee644083b9f3cd288febb704c0df1c7fdd670c8b3862ce745dafe48cee7430795cbf3a27f8eb767e46aaa76d34639fdf6b3d1f1e7649febdfe8976365d20399bae7b9d35e2702310bbfc8cfe1a7d4d2837635b559b1fadafde3467bea64448556e6021455d63dcbe7a18fa540fb418e3e8c75f0761b48c01f49da0c590d3d10f490ce1c20c03ea499623ac7822aa889ea74ec4b3010ba519c055e803c27d7bef286597373758b8f8fa550399624bf0efea0904593c75816589bf2c1d1aaa065f825780fede2b7b088a77f2d739ad2324c60b40fe7ad633b05027b8b2144cb262e4d4f4752f5d70e9cbd543f9b2e6ef9299bfaeaf6f277f9d72f8eb4119bb046918367cccdf7bef5dc195bf968407ec55093eb8b2daf6b5822b1517a52f907e2a7d71a4f405129f7f2a7d413b7a4ced1d6946e8fcfaeda88c8e752cfdbf9c33d58244597488668a6badf5078f8559bf9d7b7ec51ebde45ee75cf4fc45864d83aec3ac85798e6b33268a1b3c37d2806097744efe15a990a532dbaae2121a645bfe3dd68826643f1dacb0d9335d8b14496d611fe5aab5e375b06ceb57db54a03f3346c27461c77e0116e6ab013829ea045cdb25600f72d8d549d6886950854d9b10152a02a3d6a44af125c87a3096bea44c1e632e57c7daabe13da12f41c7ae2dccde7df445516d0bb3a35a95f28448513deb54b44888f9a249783f3a4aa4366b96880845b40e41afe610f43cdda944136c2b534f954aa954a9548d25df8caae4743a279d1af8e64deda8972f3f2b510d9a2dea2ad00be09cf1f85393f860fe83d12d7e88dc9efaac794a3eedd1447b506aeb8b7a343c9d73ce59e774595112430b1894acb4a0e4645372e2628a92184f28898184921843249511a424c6122531725012638670f553c90a0c52347e2a59b9f2d43f95952db6152a5eaca8e095be5062e10a48650545ccfea9e464448dd44f25a71f6c38e5c09299a1a981897263091c3fd88421f33060600a1aadcc7258497223f353098c283460fd54026388a7fee90083080060c89efa376b68c81447c3376fb4ae2f1d1bb0f677e3a388cd7976272da989d418801970dd739e4aeab9c4f31cfbc3c2bc91b4b022af6ed4f6471122b6a53d8c5d67d30db229990104cc4f25338694cc087a25337ede6ae065f8c1511672cc21af24ce3eb972be74a648be69cb38734990383932ae88e31c873e5c09442a99c47c8530496cc7af841f3584f9da996493a7da2b4ae956b1c2124ad0aab1dce158fa6ca239e6eb83595f3c95c424d49df972c024a94885a60b7b275224258826d81625e2001266d307358c355a448b64b488cee88c32a9309a4416248bc07cd12420305fb4a804188a2409591125fa3aef03c3946abfc034ed50820ce6658712644f2f9df781614ab529586362f0cd4f95c13b631c07de9f0e3bc7ed1aa2c0a8d4ac5576454d326434020000014315402028140e088542b150948679a8861f14800c7e9e4a74509989b328c651184442c638420001040080c8c000cd6c030af055fdf819e9840d1050544666588d3b6beaa98786ed8a46c0baa2102a25b9d5645992cd1f17f616287a428396d9b3d32fd469c1ae2526886e1c261449a924dcbf75825699a2d3cbcd956f04f977ae9eaa86e475042310619bebda7476c2fb7f88b8254f7872b9d0b4c35e22140f99603dcb6c86bd02ae5800d55e3bddbfae8f1fa05145866eb6834679f80311f71c6a07bff90f540dcc6f74370f88bd62949e953094027a5230d103a630785300070b2b93b54643dacf395a42b59c507253bae9cc09acc39cb00c40c4b7589e354d31fec73a97ceac5d4e7253b5d306b7ec840d88f9e430b7341ead7a9aab4ca4f02ffdd601e4d11c29dfe169b08ddc3e4dd263f3f37918a1970c8d06ed7db66aeb2a34acac13b568061a8c27d512ae1a3698c406dc56e19095e8b77be2796776180c25a6226fe87ad8b73c4d8d0e12848dd637d3aad87b21d2ddad4dfed7eb00fa6b0212f057091c4ee0494c65883cdda18b43192e6e39a19fbae50a1b33dc5d5eca5dc4c8542b420048ba9445b6d1870af3f99c2965e1995129a0fb778ab085a245b1aef00f0c5669132c1d1d85e48a6bd9cdf101b95022331234f1407227b303110c5a027535f9a622929c159fa85c01dd016f0396268da18d29d11d9ab6db964d7f387ed6fae1d8426e88243997f870a7e98f38a40cc39e2bbdcb8b8c4e2ca963ff66ad41f37064c05f4e01d74b2784e49949bc594ec597b29172bb673b58318d24c468949863fb1cfef4b67ec27146141506dce53832f6af330aa8a69c630c0a378184e24656b0e7af490150ca5bd9ab0a6955beacc83d61f9603ae6db85b6a523ff78bc543bd5367291fb0d2732ca2271f0514319b40a9fd5395eb53fa856a99a9d7c776fef8aa45653ac922c6e1eff61c99526cd21be23f9e513a4c60621da30eaa0c6d319096ba365a7fdb7f442b42d81d31a59702496c2b7d03e36b031c03441c6a8629da7ca6f0c61d2e9b2e985a4e48aee9bd0f52f6354deea081a6e39484729c17b0477fb50630521559a3a5fe8b0e1aa48bff887ca7d6956f65afc6c4472cd4b712774d57e5cfd111d22a00b040a63b1593495d76029dd8be3d9edacbd6b448b1b3d7ca5a4fd00067e2be435a94f617f1977ed45e918e537a1168a76dfcfc28b464c15f541f207f0ebe37b10b533cd42155b9c992d256452e610b2f15fa7b476998de1328ecd6f90a044df4580faf048f69d65afed2519b62fdee5cffc86b54db3d37cf4c9b898a6aa87a2a32e2b395cef78fc4ae3c8bdccb58cd03ccbcdddc0581b4097b21b69d2a98ffb2c98502c8fe1dfbfdcefd738d836c6d82be8bfed20101f7c7925b775928b5486677bf9a5e288d4324eb25a0ba568d47f28acc4e22ee2329b09b109d92f1e2c654671e0907c4dc8c7d19ea15ed096023accfb8021763df4375a88d7f22ae81807440bb0b393007d0524e4496189eaa6051f3681aa6b105d2b18279901255f3144095e3eddd6e020c2f6571674a33d0ef54e9e50b3bf2c4f57a548ae123f7c01369db177a00af6c60d0df4b5acfdbeef8b80bff3cc90c83ac7075b90ab68517e47f6c35c1c697e1c425e19a2a1d1bcac29c7d6efc5e7451b79860ddce00ffa67d595a00044dc62e8d1822c57f6dac70bd4bcd0e8693c18b6f87c3ffa1e0fda51e3e9a4d642b8b0b49fb5a7556f735e90e492cea40f264943d505c5d247a7eb57f785f4005f6ecfa40511c894dbcc993d2b8c6f91448d24e6edbedbaa39c5f1b69b35f3586cdd76da30be0738c57d4ed413df590b99e87feb05324b4639a1a545f4d51db0c366392716df8aad82e39f42a6771e951305b1f25cac87e9ce1e71fca7a6c02d9e1f5de98960bf7e814c0da003d3e3680f53fd7187e6109228c89c18d029fb3a194a5d8aadfbe92b10ebc0d4358453ec2ba9a9690a9659858697e84d11a0911e7216b87e1c65c83990f678e4903310fd71c92167e0eaf19523e740dae39345cec0d5e32643ae05521f972c7215987a3ce4c83db0fe3865906320f571c9206760fa719221e740dae33105193dd206fa4c4c62cc9a63d61fd9201081a413016ea12e0abc02391533b7f834817d27444676091604dabfa8a61dd084dec93dedc0c6c52afb8e66b42b4bb14eeefe2c3ed21cba7176c135ebbf0c00089e54d7a86d5e41df5659ee289693986d177e164b732ab5ad559d528da56cdb9615101b20657be217104b28e6bf975f418987ad819e0af059604e3e18342a3f230c7c7d7c354eda4866be21c019e8bc9951ab65be60d543aeec7770920d256500ac7d75b4c326bc056142d50a53f1d98d9d37dc5a2af10c5ba8c56d2ae2250c5a76bcd0f4d27abfd59c2da6bef1620c34d72ff1c0127c9d656145761093477c29efa3c7c61df16a66ef9b8dd6c90b780786a746c94b69aaab10b13d003b1e294d5df81c3c444f658d729036c53c83279b761c4bb2ae8ca7ba29c44b8abfa9c1b59f8ff3581a8c932cc5d9290e249580a5bb3b98bdb1fb400b03e51b53ef8f6f13e4d5aa2884cf8216ac487c7813313dc22362aeeff4cc1687003783bd9a38b096ac88ace7185a568423f678416f2ad7bcb18166848a50bb52b131bbbb52f2bd349404621c7af937aa8593519fc66521157793378275b2e701666dd875abb9d6299a967774126541aa5c0d9f1a9010ca940bbd48dc8e4228cc2b7a91e3d132478fffba2c7f7adac811526e64c17dbbd86a6f1f095e3eb6a12d6138bd1efcded0ca5585d7c1924c0f0cec2ae827ec699cf6c893e7135aa45b25fa5ce4338fbc5cae90e59bd740696e97ec2f4528a7f71878656a1d59708fb4b7e16dc84564629a6e97f95f98ae11a490020d23c530cf7208823b406c48376e08d2041d82016e3ea8fc2733d912712b7b2bb47a3c52bd2863ac1d1e783a5e2d0e3bd0e312af4d6b6f60907a901053d85a29e39c2f037c190fe7f846341b6f95a2f279f46eb63a1e4fd75eb7f253f5c56be41ef54801c21f06334eec191235efdac58dc920f0f842ea1a78c36c1b5c27df45875e6d7ea19b2118b77703044e49fad46683fd5d57cd1b2077dbf82d15fb44c7df9d1da673cc40a5f7e42fd9e37f643670a32c833a70efc0a23c028710ccb49fc086cd72b27d136e20f68e8337cd985e3d09080a850595477439b726d0cc0f430ea3713c28afe3c6a29fc25164346bf41fa442e237156f481e102697e64645e1aa89b57f0410b97bc4a3f8661106d18a32d1f5c680324b9611e65e921988c9ffcb268b4b40ad15b7c0f02d60d8c244198e6435c32fc0ec922cfd606f7f038be675c5c6e7b9982df72c5eb2a9c703530316aec183b10be8c2c22812e05cb6cc234537bd20ee89c844835f91207780cce15bedd7c8a0724782eb51937020937c608ee325f964e71eff399a831373786b846c730f977a16f436066e89d0699554b2c48a8181146ddd2dbc73e3ad9731b093dbef886bfc0d2a733783b0c425f371a12ddd34d5571b7bab4cb88364b406bfc8e5fd0fac57ba67606887c06aa3ce474b7becd54a477f402252bcb948f3af08e6b0a09dad5e6cc6f39a46c0b14199d9dc8b765a3dadfd568a8f7996c085b4f0cf4ef177e599defc5288c5cd6c2f908c17e12b781e7cfa050feabc90c0c8da837487c80bf137fcc9a0d4a706b5523514927dc834c50a96d51d238aa5c688ca9aa788dd55dbaefa49ac93fa6c8dea5e8b78838047e6b84694e4d747b143bfd886b6c8897e01afbab4862146714f6ad5d8f4d9aa4a24372ed4c14b8f5c614b4d3ac65437b8f32e949d1e836ec7180b327ec563b27fe75d8fccc2fcd81464f02d1f5c17747e7c78ef374ef7b0965ab6f0cb75a1f6f8c43f3253892ce9f0b7d4bcf830bd2e72d688fdf7d210f7237a5f2f760a2bbc59aef08a7e420f258021ce26ae2cb86ad84860d3baf12e707c66db8cb97054117e0538389ce94f136186503b9a4cc19963e0e3d63b11d3e7116e177be27d1a272386f14999aae10af3618702ab5b3a6a421c653a37b2f17b490357ebc143e495b7e11f8b93778fe94fa5034719b447126a474a26099e4660db1102b43bdf3d5d69a46a6a3d90d3d598d299b2f14fd030e7a4fe2c7840eb9103809d4de28119296414b501c2877f97db97fd64b93bc8823b4cc4fc9efa2f769ac326f2dffac9d20476a2fe53f036f872cb72b64810d35f1dd548da14fa9ed0664943ad61363253d718855109228eef8e8de6416ad7176e122d28d0fbadcb6c97a5589e3275d1583df31768bd0db1c4b073a728ec51e73e0f7adac190f5c14c0c1b727a26972f31410ff9548264864eca3d35b88d2a3a22217a6c5f931a37625f777131304d9513bbc3b4e9fa351a10dcdd0dc3be6b8a4e08c89e7b18f99273433a4d3897d6beeb9018d72890945d13276354c0d3bbcc24bbb2d926669c61ce2c0b91b203044c90e2524c024b4f5190024cec7458c395bd1a8697e43e56207288b2fc3dbd922dcbdc4373ae87389e786bc50eee24f0925f356afee34b84cf07087fc295b6497a0503e3ee9539d1244ca257e81c0493f754645db60f3a2c210a6a0888a5c9a277c870ecf0881cb68cdda2c830950560ae389c89f3cb9f8be4431dfc54bb45cfd58adae38f36f8d3f1cc7e7d5afb1c66566c2d2c31eafd4339368e0c5ae12481c9227333432dc065a4a5a4979c0b6779fad1a62e8e82bd78dec9b04ec5f5b54531103d80cde676c52c62d415904c42351bb8ba4337e3d9c4ab0e00d360dc8b0d911a23b2689e57de390e93f062ce973bfc2a34684bf5c10780962b5008a7e05eead8eba4a6914116cda95c609a3858fb62a467357fb2f769aaa1c6108591c280cc8a6f431789e57a263f52572a3d0bd1cda59f5255c90d4d1dca363a48ea53f3a0d521ea4108dfdc83e68ec907c13ab10f22f5503f48f26cc90a39deea189881c7e0ec2cb7af99707d85f5c61b2ef2084100e2d7c82667fae64da323ceb35590da67ee1b25ef1efc66bfc554e26dc939a5d7de9e3cc97ef8fc5ea53a59637718a2d8fb935641f79ba9f4c9e0c4c3a872d390011933a016fecda8bbb2fd0415350536b56a9a5dae528c999fcf1caacf9558a38e51f93bc5ce14b83fd0d62a0ebe5eb59f01ed64954e8c9561aa8fcf5896e6c4ee1249c5339dbb98ba105066013e437218ace48d0ddc48bd265396db50c4462a7b69c65285caacdb904f43384d23b9964a70aa8fabd86441531a0953d3cd013474c9ca6794427a84c8f3cb778cbbf173f984ae4ab271996b0772bd81f89352dc1f0f167229c49cba6f288b1318013c96f833c9e63b49ba4a4df24fcbeec9513b3171013c264961d61b7e32b53d45824053db2d654b6e6c5b6453bb1bf8f5046a489bee224288267fa86b0fb719a1d12e407a91833db34cb1827dbc438a731c238fa3c232a43c03e5c6f7ddc89cb1aec3a7a963fd1146a30f659972b750cac2a1b80419463f720221b7837e1ef2b7881f40af8257bedd2242757fa885a9c2a85e6f513b6077e126d563fe4197d6ca234935d27f74ba0435854e483ffb0788815ef4a0307379b17b56aad63c75beb8d0ef4b78da7120fd65731d3fc1d2353e4be436be6229b181cfe1974ab0af51d157545f4517b820aa34b2d10210cf35da6862a281569764c57ff79e352aa43812e5608b258414c01334e982f1060dda223dd36c6205cb2e160625a1d1c1d78b5dc707fe707b9e7337084f25d036f5de08004e60e1f8155128aea612cca8b57b84b90cc3ffb7762f511ea68cdb24a72cd3e9263214557368ab364e369073f53a6d1e863eedb418faf2062312a14456a6cb1fe649a360e7dc8e8ebe27cb48f38f0e0c65ae07523c74e6bc05e5910fe0606ce59147c50c33761aef6e5135ee44c8e6e0b2e955fd8fddcbbdce7a4fa039ed34ff4588e269e7bb223052ad14c22744ac0abeeeeaec423262a85e797919c3dee568b6e6d6bc401c5406058c62f7eb3675408bdda6d6cc333f2dd66ccaa8649cf22278f0d914cfeb19b3af31be3b4dc3102145e4ee5c11a7c8dd4200ee33870454304889242cd22d4146831f3fa4c63264a4075d797e94027ae2629dbd0fb4e33d4f741dff3fb79a80f981785dce0fa1f531e7e2a8ec5ab20426494072c48c0bba676b8f984a82f1add89618d7d606f670502c42508257ac9113922cf4ae327ba0fc4d97f80cb99441c73579be8c31ac19252d6d3692928e1c1fad5d8c4a1ac885bc2247ef7e330e9f4e9abf651895ceb6d3f3cd480589f6be2ee0b5fa795312e742acc879201796f5b076297fd32c142e006cee2fa3f373cacf240d5995862b9e4eb5e40ed5e90606f49823722f4953579b7853619319ae75fa31f4c22cce7b55942075cc7468b1341d77cf54e815b52832e6f147d630f0ef372f25bbdd3bb575ec4c7496429eca02c0816e6e67a33d47e1c6ab9e5aae784534f7a22c52eb1dba0f21fcb478493f86627799dce3b1644ab954237218daf7d31f94470cc371fba50ebfc28cb2fc11b9ce2b8cc4a4b6b2692c71359aa7f1e7775a18bde10bea1b8f05c76c97fe9b78a320392ee1182c842dd1b2b397048c21f0cda97c9e96585cc217cd6c79fade178c34005fb04c4ef5464317e61db3950c18c52bedaf775cc86709c30036597b7ec8bb51bb89ed7f2aa37850073a28ba9beae1b986c81545c1fff01772f9191f37cafb96976ca98d32ee1a6ca46a1243b6af50896ceab78c2dbbb16d1063c3a5b6655fb75d6a64113b073057ab048a44733574e03eb6047314b40354676097da89a13572486d025e478be95f11ca9324b4207528c3eb5a28fff5639d4647945f289eb26cea2a61b7a0f41a2b41bf67d0a57ee8151b4988f8cac92680bdf8890f4a88eebe548500cc30d0d619a41775e232a0afb14c51443b21d16b99501939df34faae6bb5426208cac9562599235578d6830e998a50bdce6164c0415e2d46250301f16a14946a7ecd589c8089ba1a798957016a42dda54e28504da8157f7b9127ca11d684d0b0385adc002e60be32650c06e4e1b97eb2b48aa32e8e9693398ddf5d69527dcbb69daf0de3eee40c186f609631c48c3933582998880b1e0554a8b2f07f19d498ddc5c0b3a81c86c9f1ced8699ba45008fbdf0cced9219f6c3580a977942f954a6906601f3c8ef49c91794b39308e1e5c9ba2f373711029901cf2fd764e23c3f74347f615e7f56b3ebf6ac4ed3d63d9d318d00e6900c8e6d61245f12af96f213db1c6c0209e88982151b4cc3974b07f00b2df6579da0459f60667ef47c29a6715be6e3b43d0a324b90c5f57ce6ca5acb12f43d1741361b0ab44110838de8f1fa0d8ca2a82b7b8c470540f4797a9683caf86a04dee5328fbedce7901a9bedf1e8b1e2e6d26e42b6fa837216ffb97d712da9f043b51ef4ea5aefa9b0bae42e0040c0803abedde5691bef0817e8534a82978c545b406250816033489177b1168c8c7fcc7884f7ba550d1cbabb07a044159e10f063693c88b7e75f831cb1236970bbb7647714cc29e5eba016622006e040b69b7d043c18be42749c29042b152da8e26b71a70556bf2df4544ed219115ac58d7be4edd7df1147d8e24824ca162852d5fe92e825c0c858a55a40753116ffd0cbd1e0e631f35f2f346df3ca1e276246874ca83ef9538d2441b03dd7df77f8aec77b9cca8c9a1742c6e27c6578c835d84f1bd3bfcfba54bb2d076cf6577c8bf242400469496e7891130025e12d9306082c6600dd92bc0e49613a0ddcce6c140160ce63cd1514f69246ca7144849cf693a9b53c318b10ec9c063e5d421d6c973f11e834d376c65d0f203b699b14ca57e7fe67c2232b8162f78749a039d8cca0b36154329283207e336fef0ca5e157f4cd5338eee55d8d2d01a2e79b40663087b7eb8d7f4fe5329210838854299914e7467cead2b85f85f8836c4085e3f77d22a5e969390966b8f011253172935470372a83151bf1e6a53dcf2dbe8c6c91c6d072fc42c12dfaa59e482a54e7fca75b2314571464d0c0ce3cc98258bd5f7f703b066ea23768c608e93048b3de939e9685d6a79378a735fff7b81466e02922e61915a16bd399a40acf6683120d5b3fe046208de815c21eb5379e8a9e3f709684bc117b9ec707b3b825724aca829d2790d37d7971e2453ba8f85a588765f5933fe25b29867443d96f717859cfa1eeefddd412a897b2e45533ea02522587da20113b57bbcebc72ae3b05f46448708aea3d510af37d285d565a55ddab7769f6d6d8cd88799a1011bb5c2b8430eef6abceb186173ef04606666bd4b71ae19a4ecac119c66ee33aa2a1df6633014191592aa6b982181faec3343774729761dafe9de0ece9a06c80afebe5cbe768af02d2cb867813b5b5ca8f4668437f2a52f002546b80eb1b7af32ea4e477d3aeb4097ffceea663c7103b89a756d41692897ee5a7de0a58873bea99ef918b111bd1f2b6e81d098087ab0717a980a0e00aa8f889fafc14250d340e5f15f642498fb0aa84a9c41329478078c7022ccc4bb1b8be4cf22f38d960ccafdba4a358be7541c006310f0a079f32e9488c16e4fafc61c0a7a8908b33d2ed7159a2b34216001828786fe0953328ab2f3e32c819e286e9dff2648a412fd685e86c7c6afdcba0ceb190ebfb295854c026aa5412ac3df63a0a92416cae971387dc7591e3eb0a9e3f9a7006e564c1e9b3a08a8fd8bce9a4f024b7735baa2deecba5a9e10819466dd6048901f7a877fd8fceaac92dcbdbeb221526465329a5aae2c03ab502acb32859503337a5802d1e3315615366c21f3824e8f1e0e88fc4cc095b49e0d5eb92b167759bd76fd807ff9c866d8f9464f39ba4236a155f066fa992c838319ec816174baddf62466aea05b4e4728534542977dac8b598f16f44c527429e603d6b078cbdf11e7e3715df1ded16035b5850b3d9a0665817fbe334326f8199283b49fab522476324f6cd294f4604ae86d2d0ccd51b1aa4aa6fd23d621732122faf127e5dd1e5cdee92b2215e50773591d7c090bbab1b105183b83762d70217594d1faa75bfd582212f143f37d88118d9339d8a3802961b22c10a61d106010ad01b459bebfc00713673e6f802c807850254217276f2284cbbbe140302636624122f8613d28827889fecc567654b2e6203ca5b06e9cfe9d29024aa42b27ea576b9828985820a30ed29611f2a6f3da942265bbb8f7a291400f568cff395c681e4579e1f28fef382bea239efafdc99afe9b5f06727762e09117dc8c2c1881c6511f4b1661bdd08fbb7f9a47b254a9f3c6103e225c82a78f0fd59b4b902fa944024db7e28f6e9f52e983916eb5129149e8db880536182a54749523629afb2ca9b35ef61d30b87b7e44aeecd840c0ec47e1b24c0ab06d13c7afa430752924e62ee4c0f43d21e5039f0bf469719231a30e8d5496057bcede916911b806a98ea4b7e884f84f0cfc4cc4413e986680154d80083a9eef0e1e3fa9234a564e830df32824d922130812fdfaa31abc8ea680650e503b4014358b486a01cde41c33cedc714ae93a972a01e133a146f893b6286c7dfb651e014b715f67423c04d600d96e5d440b2006e1037510a4f43d013fc0c36be1920e9b3bd69847b87f484e5e6bbd9ff0e7a339bdaf9f61ec9ad85776f4a945928cf97528bb89af3aff42f886dc3a19e9985ef42d0e7dd183a4fd45efdcf12ffa60491b816f7a630b7d63354ca84db176f6bf108e6c5ea8f0a53dff0ae5c64df23f2e4d5dff8eaa2bfd36f73b0a1b8d755e4205bdc842866206f50bc70a91b922cbdf9a353ddaebb94fff09caff649fd9eb85b78d0238b3b0cf01e0196e095a8869a10b9553f777d534e66f73343c560f63f20f8dbc8a61a64089b5ce843ba030b633daee213b1f18d5d37388126cf0c5198816025a2f5efefac4822b437d4b1d71429ab2c20696baf98b84b4e30ab8a7ab23946ba56e0b35d028fdb80b8a9aa9f63fd1d1d2060ea07a10d166a1cb49d855800d8a07d2c6b3d947593ce1742cf5561d0edddb8a3c4115b8d9deb4ba3612948b26081cacaaa14e4a44fe008a409c8c166261350dbd52a2001eab1822cca6f6d78800f09213dca84003c6c11e7f5bb0e053824e263126d1a67fb9d67adc89ee0760e05bc7e488b65a1dde976251e03a2a6229f708ce49aef6f4d6ca8f5d60c130cc2413457b11269b28863475369a1af6754b5c12d66f46820ce0ea722d7f6259ff310774ba821d2001cc349ae00a5a76134c2cc8210ea3d5710fd6240e516959f48f04a5802304b0b8f92152efb030aff07d934ff9b15de2a985b83bf3e248010becbd92029fcdd4b99327e2b63992b4f1e57ee6139982bee30522662a73f9d2aeb12abb6c91cfe0d3a49cccdf215280deca745a4b9c19d632498868db972f7e98b4c851b23d86c85cac5afc0880c3c902c1895d283aa34f10739e8568bec55eadbc40b793b73c06241c8d1fe4e25f95f86e27d24442196757810398a9934b1d70abf7d1859f217582d78f7017d1cfe0daf689382775d8123dd05012a5da38da84bf8edcacfcf8794576638ab1b67a733519779b669030cb2f959377eb1c1ba2c147e2d74227fa26ea46b4f953667081992cfae4618a252d1184248105484282fe29501c275f27e691ae2630912a2b42f26df21776869887e9fa41672a71bffcbe4668057d43beb7a47d30885edd5cb70e798bdf82bfb233e3a04bf995fd66af20fa39f6f4a4793e1d20566dd350102b9622c43ec66c31ce9df7a63c9974563cde05cc1cd8c717d01b13b8744c98fa717b049fa631389ee6bebc6ebf43fc70ab3419ab7bcd84aa8d8d738ba5ab827abc253a63657d47344d823c700ec1bf2d3c2713a6dcf91a2ed91847a389934271fb0f9b60292d69920b7e3917e87e3cf221b8a376f84f8fa712164986fa1cd17de6b6712ef09e4fb2fbc92c3aa2f4fcce937b442db591a3c3217f3fc693264dfa84b77b47c248f2bcbc9b6c9c62d47b383ebe75676ccacc1458a1ca4fec702f951e888efb9d0472dedea132cbd02c681bd59ca23985dfd78f79a1b5d0330ec3c065149ec05fbf6829c5cd03ebfe82a02f627d1dfffe275ea674520ad61bbac61d72b0dc2685c0e0b28689055d9a3e4e16693180ed20e87c616af1678366554af9d938a61a30ced5705bb2bae27922f63d24e9032c7bb5e9aec462d4610f89dde13d10a8f84224b72d7a3d98ada7771326b6836f49e5b47516e9f68fa35acc4ee8798f68b6dcc1673b35c9735d5c3bf43cc833bc510c1af6d6a1798d6746a34ed996ebdc6449927af9842082eba2dcb517c12736fb0dbb710be1b40fdd63c3a497895dd574eba45333fd755abbe0836fc9692830fe726b40ef54c4c455931c2b6dca166ec6810c4c7339ce792d27cd33738c5f1bed78c223270a8420edcc3dc25dc85aec0ddd5403b92c54fcaf9a8c954ca35c8f357817e80c60cb1c300daa5386982266f5fe14f79a6dddd807e68b7563790c37ac633cb41018b92da1c00f6e41b62853d605e5849a03a1bf4c9f502a78b13d6d0db793de64fbf127f679ed27bfe33f14d45011b41bfd68581ab24b805633f4686648d0a623f5c514a1db8fc8f759e5fee40693945ccb050b1e5a2ddc9773f02e61381dfaf224de9d05cd348b309c8669e42e66e781a4a40ed2983d8ef04186a71bd42f4616005d716b5c64e060a9787ad3b6ee93cfd7874cae10e121ccf01611f47bdba258840ef4624ca0430c957c8352988fcdba89cc3522a20f8f9fdc902443b37c74ce1f4e547756ae253204fb23cd69e91d0615a2bb01ef8e1b63515ef9c283c26b0659584cefe00f7f5e3f8c358963b5dd40ad2b74e986ff7e830ad4236628be4659a86740dec9b90fc1249aaabbc10a20ae536e64003b776b94cbac420c76decc1cadd37eb7389afc856b24b788c505950d0d17d3e42ac3b1ae29a4c1fa997ce3c8daf885b7563a818cc12c10d3e87327d001d6a577b370c90d35ffe70d39d33052ea5ca00ba7a765442d9b4dd3fef60ae29da9200af080fd2504722dd639c5135cfebe3e14342b411eeb38898102c2c97de684a21717b9106c0c0dd462f080715a5cd487d6e02dd63d70f6fe4aba90a7e6a379e2da748c2783da0ae490e95cb59e6177cea9b042c4128a890d86581db8104b5f2692f89f22fda40c2e1bd941929f1c22651e7c33442858fb84649e6cbf1c4e4a0c92f063516316d31537ad67054f48284a645cc9309b29a76e8aae74ec395232c02ab1fc514e739865bfe7d505a612f1d4c00e07837320ac484c203e33f5f432f54b6fbc094da68bf0f8818a810e8f54c6c0f003062ccb673281263940812258bed5763c620b3f68f81864f61cd49a461fa15338ed92777b66f45548f1a452b8f6eca1fcd2f5d04ce3110fbc75c598801b08389ef61ad022dfc247b1bab01f45ec2a2e0249d816a9e835c78407cb345cda5f25429189f98d36612ffcb3830fea507dbfc6c23a2522608faf5a04b54c9e99fc01e061685d3e16cbeb388bf0d829a1ebd7bac8af7250fa3d1edc376eccf8512289d05fe1732844ccedecb07d73187c71885cfd3ecf690818e5af95d34ad4ab21037784901a3de41d3b7c4c964acd5e420519153e92fbed5719969b18e6d9e2612fc53165198c334e1cd962732bdeea9e71b24698bc3e3c17a9a688e1df8b2286637f943413e3d320823e5f830017ca19188cb135b9b2b41b47ac63901d6cd8e2c5ce82cad24fa24fe35f3658e9538e37648cd3e411db32504de6ba79e8123ac0f134670a7609cc1acbc6e27b81ab6eccc9b93b03d1ff1fa0afe2dd7497c8f0882ee13848dd60588d9917f629add538c968dff620a85c8b66382669c424e9d15c4cdd8b78af47ea61f02d6fb7d788ed45cf8df947ce5458aa8860edabdd5779f4313bd325d066a3c39bc221f521fef1f8071547e19a71fec4adb474e392545df171f7804d270aed79bc51e174f1f2b95730cbd6739ceaea01836b4d0b11e63352a4835fbc2f383da288a87ab7bd10477587c5037745da46bb6e0a4b68ded0915d3a6d5407c3ae3c4fba332c2e52c110d669c726cbd6310464cdc1ba4e9ec0479ffe1191af372ef253ba75ab1e7540ec232f1ad6e0fb12edaf667d2843fca20bfcce6b2dcd52beb375f7cc1e7ceeb0404586fb0a8b4e3e1bab997e23a3c4ed2832c7559d8c57c4ef605b761b193c03e8f99d6d4458d6251b854c79b04b2299e749c7a5fa12e0eb17668b059ca506362c097642b138e9fbb66a003160283cca70aaa62283a8efb27b10f44617bfaa893810cec4e05ba1775337950ee55daac75681df34086ce634fdd6748d90ac371d6da2004ae7b6bbc6302a9e315cbb571f27964213706b42701dc5ad33ec2d895991662a80a26586b7492e5fe71a40c6871a6cb8927b40b521c24c7227dc7d6f76bfdb12e3dbffad8ff2fe67631413b584c0d3549146329eeef497534102a34c79f40cc28a87f6ccd8be0bc91aabbe751fdfe0892e53e857903505c07777aec034d01a65636bd3c3ecaf2a1f353f4152246a9805a67569ccfe34f6676d6e6df3c422ef92fc1e9474995879b49e987a41c0290dc36e134e011dfa2edd55a0f1a1f562a5aae64a14292d4f3277f10b4ecd7d24ba3c757969b40f7d4126dd6119c7e4e23a7de760b6040882d923a7636ada61f7d0aee6b42d7614b180d7c37beee86217a4a211994372a26e7f3676bedb9b9765e77b358da8767b11f19e4f3545a875eaa554bc8b057d683a7990b194d04f280dd4483994d74c0a500a6156e27144b8ff735de11605168ea66f6a0f402c2625cac662fec51eafd1ede470736e7bcbadd58763f8a998d4ff40acfd1cd7d38f159e38f6a707150dff2019b6291fb40d279f95e50706de17f028606fa0ca2d1e5de772f4f6d568d0d39846b52042bfde311e2db9caf7800db71d468dcd28bbf4023bfe1445ed186481950ceaad2482d768dafc90968a9e1eaa19a826d27e1b01d7e8e441905246cda5650ce2c6812f2c343625aa9e4aaedb36ef155a304cf2aa89013bb945651eb00c1fb007ee5ad5c28913ee3bc86f1ab16862fec51ca7844faecaaa3d93c16eb68bfb250fcc8a9227250a4971f5dcc1a477475bb0ff416b1013b4f609e3beaab0c6995706249753ccd15ad203f9ab501e68d76250814fcc808a592a04483deb94191f836d8848b24836d9f8245a1e610f2160b350e9770ce7649e1451be72fd52bf133ee151c5fa9987b1b6acb6d936e790916f03178590051f38f5a9a923e30c4dfdf3edf99dc0afe184479058c8dc8d718787bf1fe78d2d03e060d87ea6019963fcaf380ba9324f631630bb9b6ba2db1bbcf0d3a0e269faa437b091b8d9749c2cd70ee1bc9db33b4032d38244b90893d3a1c9245646526cc5458545570359ca4e96d904f666a952a8f3d3b8d58845e859fc23217ddf235dc87b946e00c90ddba751db1ac2906989dd1bdc4bd92045af65b88526b3b4366eee9f514fba6650c09a5b0e81ea3259944bd899102fa78361c97666bac90e4708c1261f0701443c81b67963bf20fc6a2367b9fd1d1e29afd0a7ca549cf5228af25017a082617321fa17707f070965b1f7a0a899567f9c3ff05baa9fe6326159c16b54a8ee676670a7ca1fad2d6366496b0b398819f8a0986b0f7aeba568b1e088d6e0d963b57fa0b2cad59aa1a665ff07a7f8a2c64cc3c3ef4c2e8e5ef9491f7db5ebccbda4cff2c40298d3c59cbd1841853104cf2aeb90e861afa0858260f265fcf6f28a3fc86037b04b201f6dc16be02f687644d5d40d9313c2f6f5f0884ceb09141b1aa9ad31add17b3064970ee84e1c7729dbba3cc0ea7d7f574fd93e48cb037424a7ced0be15bfa87f9ad52c8b354d53b999650f00e52bff6112fa57292993e097df42722ac216ce25c39c88a63a26503cf49445f6f312111fdc1ad9c5d5cfb2020f9c554f90a05786e39c88394f2991c0faa348a13a691e6823babefd2307b3518e3c069a085d0e8f059adaa31e61136844a4e4e2d1e5bddaff7458573347a16beb6f661de7fb6cfd960ac4ca44f4c0afad5be8de9477813487a6fcd501d740c5a163c574aebfca8c2eb66fcb0a91b3bb21d78399cb20db712feeba27bf03c0756967c0068de8fa7efdafc9ba06ec331b62e85e568c5b22814de55352f4d4d8b5bb409ade8aecb83248c0f232339c11f7893987812cd03f660c46d280f7ba17b21526fdb0121b6b1516b7cd346aa45f4ffa35d34a6fb2be48268c5dca223b91caee4fdfec4179cf40863e416cfb21bfeed3fd22ddfbb5869ae77203ac77d3762f3e6085ecd009a19c837dc3f290e9405174a25fd777403adc19f90f46b17b65e82ae6452f6183d1afebb78eeb8f83088428bf8235d310034f6fd9682694b2befd693b78afce1dd96aa6bf262d75d29ce866c3010b0ed9c655561f52cecea8e47e4810d4f395c416ad4b946787aea129f6333b70dfff0073990c33cacb9dc4ed7728167eda9db2474d8d27833d8479f760c62120d4765148f49f5f7a0107d7af97394b3522e05c4ac2a8714b0839f7e1e5483b7f4ca81a9265a12e1bc69e25481dbc9718997390cf6d31e2662648c63bcc8e66f41117e612c304900832d3e4914a0be1f1686a26570e66009e24f79981d99be9d3da694fe8a7435b72d3014cfe059fffd413bf97f8a45e4b247a160308fdcb1eb00c391bd0317b3192a02fd2054232df94000933f8859732a2211d60132c8401f9af4c8106bbc7a0cb19c2e41926d352000f06b99944825e8761d5c33c9ba429d006c2821c05a6087f8f74ff3dfb49756f0fe59d31a52ad61c43daa0096d212a07d5e8929a77a3051581c82f4d58c6a00951fbfeeb575d1cce930cb677f74ecefaa393de3cfa562272b12571ebf966abeaac736a9c39c96ac5f026a07968f1e04d72c80624f2e046d8df86b55fda66e19805ce6ce2601bf781f232fc0c96d9617e304e267ebf91799f1011447892fef0b043197b93385dc95cde1fb6ccb2b832671207adf66fbf8fb5a1b954bb297a41455414b3eb4d952c672183f0106c2daa39301a55b88c274818b4550231e9a097eb8e61c5c44b2e60036e0642082297228ff1963e1cd798ceeb2cb066bc0b524498a4171877b01db10a0c44cdaeb9a96e875911b8d96e2490d8507822302a38157f50125d6a112bced231db2c31d5c5584639b8b697f16b05cc89b45923c86b3d15b007e8c9fc964b7a5ed145149206f22688de7b41c9d228f5e890dcaff4a071fb9fc5cc63a7a153e33fa5fe90d9ff13006872058f4ff60e2129a13a9ea830ada7a86e94fe0ec65c324ed580801338801a179ab3b86c53030accf5bf1806cb1efe89aec28f039e367051fae6ae1a056cefc38ae5931e3a6cba23f8e6d63c0690b491fd1a070ad64153b0ae797ad91ce240811e23846b8b3bd38478c2e173f9c1e6dfb3e00b79590231a6017f5f449a1548397454f2d8f09d8f3ecb8d23931b46d4267d344717093ec0e6d28a67c93446de8428745b00f710c10730e60f093421a5ca440938427237b0e80dbfb8f1f66cf9a691e33c04d2ebe7bd98fb4cd3ec43c507e16e9161ad30df3abc1bbab81d767e22b49b8251301be7b0b6e2d82f103219feca8dbc7566ebb1297bf1f17dce5fbf3f704c063789ae339d8c9ca94b981a3fe2554fc733e98a7d41a4716beac5baf4a0e0eb5f4c98df2436cccdb2856c5deb271bc1a8965feb3afb4fd4ec377f179dea6e90ca78161c98ed384688fd3bdc0adf841ad98e11a214ed2f42d07e697f91eb4946c10ba3e084644bc5faa5198ebc021a529fe4c56093968aca77cb87b14bf1ab0c3dd96085a1b649f8f185883026040d6f5c0bfb6c6fa86b7db0295d9bb043f8f9327f040ad9b41c080990f203527cce98df907926dd14198744cd8e6b255e674374e3e550bb63371b4ae6d8dc36d9ca05ccc67cda17f8eb07f6c19f1d5a948e65767bf55f6d2448d55c802b718068a8efeb3726ecdf4469c6080d65ff7bf1cb080f9aa7b8afb2794aa379bfea01446b6ca7fc23fc07a614c0dd41c7ef6456c212c2c86170764d643476aecabb7db2e72c75c33cd4c0119a00ccdd7b317962386c3fc68035b1df9a9ef16470137bf829383daee2d0a1b7cfbce4025ca9c66ac1e838d7d10466fc85ef55ab6bdf1c0e271f83d7935ed1f339c3518e1f4621e969e71feb7794845e5a12b5175013fd440d02dc4a1b0b3e264b9bc0e27b7cf3c15a0271e006a5d9ee654cf096f42bb642b55f3028edf0af208c754d23b424d0354d110f6123120ecb5df7098e4a93669c604a236031889c3c0da26ca6bf92dfbb5193b3689d55f36e2eb5a8619b8490eea466910809ede4af90fb2d463bf936524c50f1bcebd176c91a871ce66a69188d115864566414df6f145825484c829d44b47cf8efb742140e8ce2dc3ca14d18855bb200787ce67dccdbe34b3453574bc0192dcf60d98ad7c65f75a7f704417d5be401414bc69371503371310388855d21f6cd3d56ac05d4ebfe2dfd296b99d9622a7cffc951960c26eb8b597144d4bbab8798683e07f6e275ddf0c244f88af6153d88d59b52a6324e91619478bdce539252de607110660aa65f1a2a6d88579ea1bb5dee663ab75f66e6929de4105ef8ec81ac70cb5979621debd0e9c71f482281c52af4e84c3f473011bc3a1fcc882cd18b3bbe769a13bc97d2f0228ac0d1ed913a3d22335ce76e46e88ba3e8ab234fcf65747ef4781f28b7af3c8d950498b8f7a12f23344d354bc9e04e0d0f70f2c36678de4672cbdfd20c5a75ffd12ce1f78e3179cd2696922ed80d925ae67661efed332cd72c3b6b92c0fdc7610867cc34e7fa9844d29cb7cfcd107c02791b0c7e44354205ddfe915c24350def6cb4799440bcbe91a0ac13843be09b147c4a4182b38e7f5427b1fe5a7897630215f0cb84ea521802c32d579daf6755d925e3582fd788763e88a2f9301c25b4152372944379cd298d434263a9b329cbf189d248b2faf962553412ef222b0c11f6518007ee0ea5ed701f21ae66ad78e1e4a9017e91831a0da24c8df7c2165ba0bbd5ff2853ef7754ec9f6ed9b7466eb3f221c0cb10b717d8de02c7133f4ffca9bfcc69d9ac0cc9276f51fe7b9e00d80c4516427030ebb45da1e13b7f626d73580c30ca537fc63686cb929d796cc9d84fec6efa14465c19ce181f81c313726764e0785b71eb6cee0b996e447f363181f45108fbd624f803acaec94838fa051398bccc843dd4dc73557c8d2f391e6ff2d97ba18e9bac2a9ea623be0e91892e20726370396ab02d1e605d201cc26a05468475288ab29f538b4fded1f6d11ace350365d6689865a4d55a1ce11504bbdc3d6504dd85a9001e7b9d1f9537daf4479f9569a202301d521f751bc09cc509840339ac19e02ed3695511a24774fa4179670a3aaa40cfd5857592f2340aa1a1bb91bff5ca832d0d3367e4a850bd8dc86caa251d4feb9ca308cf11de37d8880b9f3969783af2fc35c805864970a29287dd89ae9958877913e7aa7367b20e4ab59df785eb7dbee32c146b00cea9d79fdcc70c85b93e87669d82488a852f72ab19b4bdeb6f70aab3226e6202cf747e688ab5f5f2ec693e0d46618cb9c75b76a2850c18242774d08f348260c8efa1686069b1035c6334e7f61b63bbfe0943350cd79f8ffcadc3046f4920fd1c0b13fa653dd9f2e0e39b8d680d0a4a9246996ee8eb0363120ce9a2ab00070710728b15f4a2e5bd7eb45f180a871d0f582621751323446175a090ac83e20192d55fd2b981d1f83f50479d9aafa94fd09ebbafee9051acad3e29d800e5e856328b5aaed821611c60eb28f143006a5535c5f17bce2380e9f5e943a6480f58e8178b29818abf5f3433d3c25710937cfa002cf567bebc3bb89968be7e558f1fba971bfec84561bfee0adfa99246c332b37908aeaca2a184b49318b9c6306aa109fb170b1d7c8f449acb82cb033f4858e0d909fa00c14b095651388449b062c0b1022f4811791c172d892bc2a56ca3d372b4b60be69b6f18a516ca36c0619c8491b6406b5e6675a1e67962f4fbd58854a283162c8c47f58f358d701bc386f5251e2069de49ba0e2a6d92f8a02ca1274e87180235aa54dc5e93ab88300b813685eec115a83d9edd7b6f3f0d31ece9cf0471a6092657c7e11f06d8f7f43bf52e4bc38c187cd64c02f3af590911e28b91d6a25b412e82d70cec26349a3fe96c7572f829ee7376e031d1090c06e482e76c8014c12e049858480c6df6e77ea24b909dde40e032dbc38fee8065204c8c8d2b8b9bbfa0e05f2e92b8f9a6395ae1ecdffba9f5954d2c1481d69e58d53e39e86fee41c3718180b93c2d071669cdc58d93cc43880c3e0885f722877220365e5a8023d69ea18f563484439f983570f1270c1fc3b48d32d30cae9d30bf3ce65ef20ca81a4705debe1df21b1cf8da413ee468be7338f0a20a22a8ed3462de6c9b0852f3f511e0f05b1839ec539af7704ab7ec5d9c455cd0bdcc7f3b6ba73d179505e071d339aea1e71dfe45a231d9e73efc0b75c56995bc3c2cef0004adaabae9cf7e1aa1ba15ff260c8befae03a082b6067dff80654ea14c0f40aa21283fdfb34e7fa9744294ee5535ccc66b955d8520003ba7e657dad2ac9890c5e7f01145a2fc35941ca6cb3c7c3382fb699d4003b9908acc44780f8ec1c60a8cdb55b08cb60c38f73d82c60866aa446ea1e703c353a5d6fb361861ad0c4310f07e4bbf4b7d54eb8832ba61761973dbc75f87859568d376134f2c56a6439a014e10877141f661db680a0527130d7c5f114d545fcd421e68d4c70368f1860794f81a844144ae24b10927e1f798b82c0bd991873c30e7df8a8e97b56aaac718a38216b9f86576d3cea7b01723f78807e69d8ff14f116db6501ca431dc13f2a2a0f0a8993cc3f263bb2814edc5d0f7bb273350f0b14dfb467ea2baf5d149f270385a43e1802edd893ea2def4d632a56bd8da903c8d3c1694aef3e1ac4509f4a4b50352f1bdb4a134a93f320c51af20ca3780c6f2e1e4369d982ae9219e35c14bd6f5145bdf1c06c49eb020ac1c5b11573f60e4281b175bc5b00a74a81c90e34f56eef715b37c4c8a104a1bbad81513565499c7eaeb5317d48c8485d8061f036a2072aaee4287e5cea6c1ceb2da35524db8a1e5cb7d03b26588a2bd6383c58c241a2b9db15918d189b31db3087e4d81ec8243c9f7050ebb9bac16b676b9f314a92b9b783863f992d0666c62092866c37d95f95e754f7a2f3c4bb308481a64dba4cf3646da87e127ca13501fd3d21fa5e741e5cbefa9e07fd201e4f07b857d8cf1400c7841cee17af1afeb38b3161ff5ede1ea00cf1d0e8083bd82387c403a0b6b29bedb4234a76bb1c04c0a505ef093d1e7a6b1e374c97f7b7dddd81791d65e375b45d314db9823b19e90326387493361b239b0491674060b37c587d9d55f9b63f5fe43e51f85fe30e531278506cd026b5ecf29cee36e488fc68a331cef7e54460d83c518247e2aec32b9728e7cdc65fbf6322b4b0ab21afb976e292e31f3e6b89255dcae090220aabb8d7a043de5ed3f1e3981014c60c6724cbf01632224d0ea1e3ff413972cd2887761d03608572c34f84f91b9f0250d1391d9739a2d29713e075285b9e55896312590774fc6ed872f88438d19d599b74213693ac800cb3c3d739a60a377a445a179a5609301d51c78a99d47cbc4603c182ed3c7e00d06ffa9dbc1581ebfd4e49485aedf6e9408d31a04cd93373d650f8047903befe9c19739c1eb19679bb25bdfd1e6d9ebef12cc5d730a8fc8c394c651a450bbe4bc7ae73001c03ee18391055298dfac53c11f04d47a60577c935d057fa81efc74e916a66681fc61e14ea8c19f472a337f526c1cb0272d22b96bcf4f67495d5a0398e1dd0b5ada0140eb38b38c1585d753762099c843b6864d34297170f5e2e001d9901b887c8e617c7474bfb2baabe2569980c57dc58c7135c15f815be54dcfd4dcd1269b54704de37a4e24f3991feb6924648a67d0247d70abee5e0e8943901a34a79fb06bc18b8b7d6fae2435f106d6706900e3c51f131ebcd92c56ad6158ff0f54e9d7f1989bdf368cfe2ed965ea8aca8df6669245a08bdd4613f19fd9ac25a48bc3b94c3b5ce018f796d4dd5dd02239cf0ced99733bb99e9e842dd849ed3bea2c1a9000dd5391716da9194a983ae8fc137e4434cbac676e08b397d265afcd301d792c624f3caf2dbfb229aec90491fcbc8a0be733644f84e254f44e7b17e4f9489c39b62ead9da100206483d7b95293dc1b55c5733b537e075462206b4303677bebd2de29349eee4fd7cff6992d4c1c35991f14b6bccc6cb5f7e730829b16e9067ebdd0ba3ca5aeb96bbe25f312af1cbc4ad1943e344203e11eabbcbc03e5917401218ae18c6f81e80f31817d8272c1a310c92c39247396bbf25ceedad0501e0df1aa7df57d0cf8909415628069a24d3fd8435361bca494832b6cb9e8fe1d6676da9d88312268901f1a913dd6c8b419716130258c58351025028c379625155cc56501060201fbcd32071cf25aef2e1e2d17bcad7f7e542208e4c24ff57f1395932c4d0ed4521bbe4fd142a7fa51d540e5eecbb179ebe4dd33baa2c2e9e7796bf257dfbdcc50000f9624afa143b350b887b2894928db3b9bf18540605e3960dafb1771886579c0c451befde7fb24a2888702648f21b04ff38f17af8044eadd70c678ebf0d003e3d4e20a60c3aafab1b1428cc2c267ecc2284405040aefcd53fa7e59a9635cd96f212b75c475dbe93cb9d760fa87842764c79f89bb1c4a85f8198e21a0f907a857206ee2dba7d446c0abc8330cd669d49c7aa550d3bc94360cf03c35f930a6c8928c3739e02884c4f4d9c75e464270dc678a2ce237183d6dffb8dcdc7e7daf1a122e3726c9c8b385fb0a26cdcdf5a6b27e1c81be1388481d9e3e2108c5190ae34934158f4fa6fe552f65c4f8ede5bc88b9a07ae9e8e6338671441384e1a0a939621e04d27c54056217c4cc8efc27cfead06159948a2388cbef8219cbdfe0da471313a13689eb082b5ea0d480851aabd63062243c9cd0e5ba86ee76bc5c99092d1c5733beb3d83fbc55a4e14eb8c5259000b9f79427222cd141e194907dfe9b26de1569d84d3631ab394891c2ac01a2de2720ba499f0bf90cbf9fd4172a441d4624ec6ef20dcbd0321147aa1891160bf9ae29b60db67bc61949c79976f0eff1ff847dd7351e0559fd043f3aeba3201ca97f46a1f878a9c4701da283ebf1372fcd9f457c99c08ca6beef00ec7d29fafe6060957687715c403c922fe18fda3ca030f736b794a7dd8477e6fa0d63a52247ce9ff6aa969a5ea9e30cb1024005b2a1fd20f9aa4b939f26c1eff7ac539682356d7dc32bcbfc4e97134ed53ddc48b0b87a6a8c6efff493efcd9c655a84f11733ea4a28f46abe4d8d4c28e1cb376af56b865431d359a844823974f53ec5366bbd670e3e68134155105005b82b38b4966217c09906abd32a6134412b8eed49c567163587511df04596502c51ddc7a15499a3e708a38ceb086a10bf2974afffb63f440f9eb63f0811273c026d5cd0f10119b72c273a0e06ced3a5bd3a222b914156a8f55dbcd42651c9600950ee1e7fd712365197caaa03fc567c3459cafde16d797723f5f2c11ab46bc9414c7b094f7951a023e78da969c4cb275c695f7c6abd5fb2f1d25355d2451af191b89bc114bc20955f162a325077334157264ef0e09551d1b72039a1363f14301c499112e703aa6babfef6483473464b22620503aa050cc486c595f5286ac68ef977b9720c32f7ac84373de145911b7029c36cb3a74db185969205d702bb3df729fa7c0160b8aab0d8bac7bdb78770db39d7ac17292b1c9291299e5e1b5f58f2097fda9b3415199550b0f038a4f6f9bbcc5dc1a43716516cf63b2e766d9a4bbc4b5cfc1544f6cecd705fddeafe64e25cb501795620fdec7d3f90f97cf184b692f36bc74030d1036ca512304617b8a089634935b0686457829d19c3ccc11dee5f8f24709b348250eeafeb76b9d483e4cfcc1aa3fa07d780b5342cc0f339f1aa23bdfa69a84fefeaa9728cc4a44ed393ccffd6c6c529d2991cec041f6ac60f91e642a53320b31c84c6816dfe21d3cacc4fc066273564ee3b283f7f2e4e0deb91c28f97e3ad8a7ea80412b2a5e1d193a6c6f18ba04ee3c99180031409400d5d39fc089671fa85141812943717b268899cbe4c78cb9c6bc032211bee8a6a2a1c7241e86cc6d635da265f77b667a7533f1db569adc1b468a2f766a565acb1b858c7052b2e5980bb05ab3f94b5711ddf7e983e5c9a3d76c29551f97d30b4c8ca2cbe42a11b9d415bd220d5c380d4e76e735d1e32493526fd7d1965d0f24d36d78bac849cc618ec61536f0599ff71add8d8d0b1a2f1019f6a420b1920762cdd6fc9a2c5b9e6ea18e97fe2ac11a47adbd80a740260d4ca732f2727b16f819882953f8612d66325a3a9d50e3d04a97e954490fb22f5700170c9a821af5241ca4eaa4c3cd343460ee69669f8a274741e9ff51679a01b6f650a655e33f75fd0393ea55ea0224ae399412cfa37b16f8f7fc1d2d64d642854114fbbee9c2c6dfef62e9408481147697bd741cb02bc615d6742cdea0451a04318dd16ec289c6dca9fefaf576063d37bc7f6936cbd60650eceab48fe93c7625fb52b83074cc5b5d30007f94405105a3289c79c09010abe30d53797c4e373e4c40b356e41a8a4ac0ba552ac9f2019bbbc385d46eaeb47cf84e8540b28eb831245d8ccc45542516f3e22e80c1eab68849dc822d7229d8c0d090d7b4167ba660f1b2a5b8e61e3b44d9b3d9578abab13cc66016f85ab1b6a954817c46389c4193ec4841922c9854be600460bbd492a0743cc9497a6fccee039c638b0b2919dcaf26a660bba39fd46d93d059e6729823c9b81e1ef326ee810c4f8ee9bb25f789deb69f6fc253ce8431bd8a345ae01d44268628c8bb41735cdda37c4231909dacadb502e547e5f1d23d7ed673a8c66d0eb0553b8fa400103ba3e50491198f5d31c7ea23310048c9e20d416c8d1524288278c062e6f884c93fe0186698a473e8fe50efff9fa42f805607da70110db13208ba3adce242cc0dcfaa53a8d1fc2858f45922c9bf72aa3f120ae4ff65a9b82e892554bdc63d38a8da4b9f5b232f3cae063f2a64656944578c939556f53072c3d1a81076d8df577408060122c5d2e67e762582d70a129530fae459971a9a9645be0868d5a98c71c0cbc50f0746c99d8476638df3dddfeaf9fa4245cdd9d2e1545e48a90507cb45d29156aea139c91d0c12aef13f41f26153c6687f1c33c196e26bff0c9e09e5095e9fd9f5381f900d4eb659766b9aefc089138714402038cc0f3dc40e985414c691b6852a085817f3ab5228337b00725e7de922418b0740e68a9ce1c5aea082101b14fdcbc32fd71f48e9adbdc0fb598c66c06401f12f5f33252aa2ddc1a3e19954215cbd2f8ddc71edcd27bdcff9a6c0bcac7792ed1ad6f9486ffe6acbf1c9edd01461d50d6f4c4304b6c1df6bce0bb9923d45aeb1db4e8bd6070cb4cca77b217fca9306c8a282c7410ab764b4dac3077e6df62ded189173aecdcc00a65470b19e7fa2350a54615070cb241b36ea3ece55573b97af83fd7bc2639fb3f822e05beb3b94a7d5bacfed02547049d3f6e1fdfa673df41e8bf1dad2fa725e2ce6387d1b7deb45440e4091bf6295c45896f208e4e009fcd02bfb28e30ccdc7aa3523afb42d449f4c1724b9923a43a1c764292243de2902034caf9dee26f82884d2083c47c81c15e30dd3b52846714b6ad8faa5618935022297087355d3275dc7caa2c40112093ac5f50afc2ad7b435b3328920300fabf2484587d15ddb7055e0b4df1a88927b3efd0439ccc7325ecd804d898c6da35080669b80b1c7b5895c098310066d6232dc9b113b1739cac904d7b4237d753dc27997280fc491301c0e3dbcbd915effa3f59313818e294b38857127380dc609165851b8862b06366424f6f8b395052ea5cbf064df9f1c4c1fa87206c3f4a3b5ae6c3f5565e421460baf6e1f2ab63c9dbca76968c1cb9c87b7d173cc1e410a7c75b4a61a1fec606d8d9e72fbba76f6da41adac7d0bf386f40319ad7caca34e69d69947a5130636b6ccb6864be0b8fb90258cd49af145c5a2a621b4ebb7b6c686e1e5296a31073f9c0819f7475e07258e721a3c5a56e5a0de2fab8a64f7e59aae2c1a8a072db1cb772543ca563dfb9053511898d6e3ec96becad7142c9b2c58d843914a6c01e0151f74e5601b3a6452234cf9f3d226ffb19f83b87ce5f9623ddf08866151504f10bf1bc473e74503422f2ea6b20131b2483d524d7b1b4316924d585244b136c9feb569d309095d062f11abfb04a169e49f13d06ef40c07c1008c47ca5b452d35e00b8d25acfc330bfac1942b6ca97c3a9a5b32b0bdb19f0b4fa2e1c10aeca34e8796a9f64a6cb0583a8d94dd25b3bcb15dbdeeb846aef1023245bfc8b94d701efdaf15c1bf10ec9ea05ee9bc8ed1721292b3d94436bef2a223a1d229818b66eccbeb062f002c1f518bf60a6decfd8e0ead678e4f53d1eada6ab141c428a13e1ae16a1997a8f1ca3cd51def6768fc699f0d3122c06086767ed231bcfa3c5ccd801904e17590816434203ba94db7560a4d538bd3620c9a678060301b536c58b6688c6ef26f9c2bf4b65cc62ff8acea855d24b26cd0902f1b76c0e243b43c7d08be59109c9a5e344d01128fde2a68ae57f3b2bb43caa8543b3f62e27f9a47df06d2c3eb727e9ba374b666bb0bca351d1982c3b04dbf4b3a6a603624bc86b685452d0adff5ca59bd545889b3b5e6c37a3c00ac9ccfa59dc5a109e0cd8e297a2b14c838cabce6dad0e8be283db8864b434a5fb969e412c1d5cb8229257e4f7b7ab7d58abf601a7a95763cca8c65a87a0da9fdd3a3744824e7cfd817693e6205340292ace610f98cf78ec83a5335b3601f87ce88f81ac05045f52a37f3970155cee1d420a052002cbd85f82de9e67ce617bb812a19eed9b13f46daeeefc76427f0c2d40a7235365200edc24249a0c89f6f9195b73fcd528fc36f47f6986df810597641cc5d34599bc27a057c0e7c090646e0b10fbd332a889097fa9e59468c8babf74fc49e177848a3b43441658619f8bdd91a9892e89c60bff4bddf48fba7d9300c2ed6ba2c62c8c1fe0a6badb0304cf4209e00082ed97222e15ab4cbdb2aa80dd0120c2cd6add7d6e6256588c5088fb80fb3f423ce47882a51096182608aefe22023f049d2b6820e9f3b727beae96371fb13abe1c117421dc4fb134256b060d7b62530ee9d01700ef400dcbd2bb8c32704e896258785f09affb3dedd52e8078a5e657f30e0b378afd4e58a22bf1794c536a1d49958f98928f69111bc0c630ae6ac1eaf9b1b4411f9ca63cfb0d240bbff7b684fd9b433d434817eb02c794c74242166cd8d6812494188a30026f9ffda3b8ae613541aced1daa2ca32ac401f6b304dc5306d7daa911d0b9c329f11a3108456a6a6a015eecc34546f55379bd5d235f77efdb564db9b948d0f04803eb227a9059aab8779a70b588d87578ad55927ae1e16e27d6c09e3a509632fcb9c95431bd473ee07d507f39b0950d0a74d9dd0198e494a52841e421fb5241207e325189a7de79894139dcde3d54c6b411616ffe60888e0bca94005943d262853b1ece20c2484845059ef6f3ebc6b024188242418936570d06197c6a0cabaa0b50d518e9dde49105b51d7cb8c38a3291826a4c7bb71ee93935fe0f31ea5bd1ae8771f3f64f26aab88c6a84c39f719549443ce06d9f945487573728585b2ceded250ad7a04d64408966baea3f34ef7779f3e706403b83e042d51af1ae0f0f35b895a9e51aac7a9e20da83ec7a532cb7432edef33404cf44d4609860036062052360af1205d5d107e70120fe521acc3f17322a05e43063a23e73a104277e8fc0fadeda7d3863b0fbb6f3b0bfcbad43f2c8a556bcec917112e24fe88bac431ac310a42eb2aa1f8dd496da5e591ae329bd5a9f61fcc56868f5e9cd9253048f5bfff0ddd0d0aa4f1882b303270b89498dc6dcc268ab915311d60267a42a2d44a9211c281a133020591a2b3131a342c0daa2a3435344e3abea28c6ce300b8e6613b8c967c2b2e4e867c8ced05b2364c941ff4df249d507dbe14e8b265612ac6b485ce587c9a81b0cccbe0112abc7c30bbb04692eb43fc0b6f0d85e204cb09ea4fcf50403a6a6c7441889d933ca2382268a12f6d018b44d9989ee7c73fc5dee28c759c850e4cef6aba9a3fae2bdd77f7468be7b100c1cc3098594c843260550bd3e7653007abe45b7c18dfd0054dfc50b27edd2a89a693780db2e5ae8b185e1731555c547d3d1f48856e7525fc5b29a3f7eabbc03b3347649b620ac26a90f791915f0b096bc5069d4c596cc4f156b3375725815073753e207678d9aecc23730a1caab536424ba2d42b71407e122883c99fa187261aa67ebcc291fc7854ed2cc79974fc60fb593743fdafbde341677a91048ba0d9f31244ace0259cf7feee7d56f6c79f55384fae87ae3b9dfb3153ce064f3448c9f3d0faa6c69b82b8f82424e4d1050068141b718b32f01d4b4757462913dfb762c7a572e98596bdfd3e0daeded6077f763b7e4a7db035166ede3855c3c904327d4be5e508ed6e6c46a4493aaa0a6dc97489785f91099034db9ef2d976b86bab631897f71ae984d44772d374e4867da0709c01ccfc356a593dc85eaf51d67b67a80c120d76f34ded0a55bfae7e4028ce0e8389af6ffe9053a86ff9ccdc413cc9e7007fee9ce03eb9541552efe7e5d85c1c875b7eb1db17b90276883b6837ef52849ac71751b3711737088eccf6204040409ef45db546fbd5454b32c49562970ff0a89587251c9bc63b58fa3bc8ca2b05fb1dee9c1066c860b1bd36d1914cd110aa936e9d80632791a98d413f42c7577ed7b925c978c9a5310397605f5e2afc1dc7912953ad01ee1fd8c1c661e2c627cda38afdda75f49adee517af0b7db2130fc68dd5f8aca45001c98aca2900d475b2fad3a745cb1459cee6a4c29b399946c44340f5b8b62d2a96806d334850644031440a4fd4e7c9f777645e43d2f70be8419140e43395bdc83108bf11dd8cce2c7444e27955f65716aac8a6f75b447efdf753d82a1c02097770daed4a0796b85cabd42ee3fa4a6e83a7c161c57848c0e0d96b06b122dcdad302965df7d01ccafbb1bd2ac99e63cd681734301cfca747749c1eb0fdd2ea151d7c7c5213f10a2b5c1a31d0e4c70b6de8513f30c32c30cfef758854b4c57a5448ff2e7d8176a51971e632c14b7acd2410bc9b05dc201c11f2745136eec5f488e980927227f35f23d3edbaa0b1c49f0f3adfada31ce9d235cd58ad4665c618757f16861e213c3abbd78a408f1cd5a4475aaa4c7cd01754e20f06c4efff5f2c2324956e900bb41f1b3b385689c9743bda46a207ecea4d27e2e59fbb0ffde59ca2b2b7ede797719091e6b1abdc067e0f7197d4a7fabc2bf339315cadc5bcd4726147c254a14195dcdc50a78e7450293a3c8f027f00295e0b462b2704a01c11c1947700fae600e7dbd6c81b518ac3d7efd0684999a5c0f7abb9f24e4090f75a8fa075240e9e30da5ee27ef8920bdf6431035f1ec0cda095a6cad1c387a0fa03132801537d218a948720c653f517111868ca23008ac0e2231bbcc1b23922d097caad127b862d5ebe15efe57bf27f16e03aa028af2e6d64550d48e37ffdda207bf0d26010cce0585d32d194f1c357960c97c4ddbb34bef6d26bdee09919894217a2d7e618647d1fed6a04adfabaaf557c0a992a017664f18704ab8a07daab1a81e36f1302650f7c91d3216cb15d583f0f87d55eb05de9ed24e8cdf610f50064419a191f4cd819287ebf7ce46e395e3b4e9dd54a8f6515ba1ea9d8efd3837bce8df52d87500ca254a06e80bdb152e280a480213b0c8e95fe3ccfb27f74afb9e561738a6c38e60e40861e203aae04c3f46f7c94c71c4c0712d2927efdb1aa9c8866963bb14cf3754bc591e0c81f413843915993c5902dc15c10f7e57d17f74df94b49297544f9c78d25d46abe272314606c97690442278a71807c9a5d78ef4fb84f4d8f35cc99b5645b5ed6c37cdf0ff822b5787a93f1cd28a87ca65c07f6968fd8d14dfdde1efeb3a14f1f9fffa2feb3b27d098eb937fda27a2f1915834527591e61d2f5342ae193d7cd5dfc64acf6fee8f23eac19c36047c5aa11aa1025756d181c844b06611f04c047e0c91a4999c2848bf21cd134cf5177b5b2f0184e80c68322008f101d1cd9baceaba141caff306a006c4a0780c1a7d177367a93ee05ba63f13b0b0b465004b39e974fe2964a4df77790f3e2d805c3fa4dc3beaf4c5dc503d3e397d60d4be5787e2675c85546aa0aa4fe1c66da16ef54073e64ff8187f1a9723115cec5e51686642f8982b50fec015fd26688fbcef170fe8d2fb705af8b7dcb2b7867c987b1b70bf454c98ea7e90ac4f1106748606a0259b2f0e4c993ce661432e6a2b14c27ff4a832810e92eb9a85463d9b800b38decd8d5d318e5335cb271ec87ac67a933663dec49caa7880dd40e208e0c7c2fffcedd519719b477b9956f0a2936f57bf23ad17c0f5004bad492b218a7683aa43c919d6e3d47c9cac1e3132d0ecf1c0741728e302423d01fd895fcbe0b11c3cc73fe4a04993b12ee1de5039b5079a52737acacfe630779ce5823042c1ef3d4a75fef402deabbfd9ec6040ed044cb0abb559fe3b72c6e2667326b92d79d8ac6c98b6c985b455b8646a5deb67e3f15b0ba6d7de139afbfb89fd2aaa0c97dddcdae12e8946969ae90cae227743c6aca05de3e1be0a897d6ff71d8288f87598eeed28c1d6f48797324a94dda8400142bb96052d499bc835f99db47748a61f15637fa566a7ea525d02018d0f545d58905352b19d241ed91db4a78c4125ca4d72da898d163064b29079e740930fe056ab5a824202681b659feb8ef60c2e61abeb873b0f830975d195634c3167906e51c2400eb4510574ab42113178da5d850e38f93bb3d1e8e86f1632003cd6d1a15d31e85e3281c9ef9478a30720ac2a473766a1858927bbc7e416b5c5dffbce4e97ae3ae4434127f4bd6d891c8ba5b4101348ee2223f49808b247ed57056eb2349a5a5d81226462ea5d4ea5c09966b45f6f7d70b55af3b8080931c860450aa5182ff762404e8b732ffa9a9acfc08b05e3f02eff6a1989fbeeddfb29471f7ff3d03fd6af209abd5dc644f77691be0ca2cec489acf00283069123928f2fd6cf58567e87166f0da8c82cdf7c0b00239deb497c4246ae7a0a56e77fd7601424d2420839f40b31fee046e9c042c7454f25151328c764c4280633f47e143ebd66c51c9b1a9710527edd4eee731a29b4e937bf4f8ed66d8db349cc2f65472d69140f27b10d502b47ca9303d4a2740ec212ae714a3655d79eac1541cc46fb38a3002cfbdf95efdc1bf35e1633b7d50f5376d37e4f43ea12a4e9ef1d5bfd5e0456c14b0912df5cfac31d3fa7cef755db2178cc80011b520a85d84e3ae48cb2b0f2a4fa93881578d7b7b417ee6b39db15740985c24d967be9da313b9fa31f3f54aa8fb0ac8313247270a0a54cc8edee923d682dd01da2e853cd077ce4021ae851625b3092b2510736c6344082e49ff3959927d1586a9211cc37defc2b86970bdb80198b21246346891945d2f800f3d7efc73d82038840110010a41f0215fd5796f545071958f92b039450dd4b86f0d8a7e0813542f6de5b6e29654a32054306e205db0525fadf9884889f38222d5a91fbef735836253a965ab0efbd11fbded36f4cc27196595cca87108669e8f7cb13752d366e362d60321d00f5e0878b2551795c4108f2e91224bbdc64979e102efb74815d59c4861361fd195ca1820720a8b8011a2cf91d3ae189b0ffe5a3106045c82cfbde7f5fc2f1c612f7de334b5e09d8b188120b256e2cb5f0bd3782228c740ff01e7c701c41172ab560fffb0874effd0ce1e87ca337d20485fd62cb560883cd6dd64289201b74c06488180f4b3a61c6cf114080328609581bd0e19942cb0e7c709085259f98f2e48a0c2e08838b27ac0906679ba9d1b97caad85c1406c58cd9f009420f0beccd278b28b119c587bac245be503e273d64e15ff9334d648b74459085ac31555121874184f2858af0edd5f752a6fa249f47549ba48da845c8bdfc1730e082789d99ffc7d6d8f2e7be5a918341bcfd3f76e02000810634a6a029f1c1052c59c5871370f1c3961aac40c1df23bee22ed07822831a5cdc6c6092c3c40b74600006115bae008225df85177eec406f90ddfed04cd1203c82c485175ace3a28681a3c977dd290dd560957be8ecb3e69ccf0975ec9aaaa42ed503e493e4bc08a1854f959c109bc54c14af110b6ec95720c2b68c8aca09183d4e1136486cf8f4d069f34743c1d18083a4d7ad0050e5e5f6c612974d0451724aef8818c2be6131db0e371d94a153e7019e266c10541834b0c0a8e482a052197adcc20e3f2ea381b9c01441961c46e388395738416259ef46004131434e124a68593da243f26ec4e97adc840051a41b0c275e800e295d0259fd45c48249542487a112e5b91610834c29082525a5b0737346868d47a904e981296e64c5ff7b7f17f7f93ff102ec2e79b39e79c73ce39e79c73faaaa3b82ebdeec383a0eb3bd7df268bebfa572a775ad59221c265624c33345a4894c796217dd218ba82fda08db15d4b51052c42efbdca9fcd8da99741508a5bc0be21508af67e22504ab1d54f95ccc0b7b8dee4f613b78cfb55d04509c4fd38d045bee27eb6f344316de2ef39bbfd86488ae077bb2bc512d8a2d224f93d7400d315639817061b39ba1463f0ec0d90db341a208b90ff631c38268e1ebdefcbff0f4a29a574b6b59cb7d8c42f25f5c184959489503233cf716609a5d4458e89a9437a0e7ec6e131f306254d17dd6ddc96bb7bc9e60ec3cccca115b2c6cc2b944f4dcf1cfa6426c83e29b57332c71efa8f3d5157b285f2dddddd869639986ae3647a7a03fc8e69789ebaf79333af3a6b39ee1ca09452f29c30f0cf9d32539c91302508e533ebc8818324f21f5d1f5b16b8b38769f84b10e26b9fb472d6fb3c54471d0c188ac191c30669470e1d323d7cfce8218e406600108208219882b4caa64db3553424ac2a15202e2023099f0c6c95eaf2334b9964441234861002aa661c3d201eb989269309295184e15f00fa2041422a4c1a80494f7892e52afdf91870c126e484005c233f706a3f7c4ca047047e7a9c9032c12aa047115a8f1428613512a6a2b31a90650f8fd605a50249255cfe37591b86a6191a7a184086888c0a6c952441ce14646c6c64dcab3ff3cc65996e6cd9ba53799cb44906e6bf924efa2461568435365b9542a16aec045a888290bb538fe8d527f3533ba93f9edbdf12725b35b684730985984c325f49d827db0183c1601286c2cd08976f860499e1f1cfc3e62461b0981ae341654c86b423050198043000112ebf64b603000900b2e527bde9c437532456195759dd5101a7c6b64c1ebe8344009048c7371200975fb2bde0cf581b862452959dac88d598f50b9e400b59402ec76aac4ff6b6a484d527b1981d216c0711222115a63b2d00c8be923092cccfd527fba8f4a95ff651b9fdb253977955635f63768c795879ea9336c96a6c06614b2e0942b6439a24da47e5aba263dae0a28e0288d6862189633ec2ad31185728ff3300387bf806851d24518dd5588c6ff8aba96823a9354379732ef396cfe451ff39a78b7de79c31d4967f770c947e37e9bbd8f2fe6cf9fe9c2b63a077b4634b4a2943e0e789e42581cc994d12e2abc12194fcfcfc3dbbfcfc353884f24b2bd81e5bf305b4399cb961fa1ca7bbdf4ebd82a4531c2a676ee01197669b78721742ca98428242f9613f68bf991b5ea17cf7b16df8f053e44389505a7677d0a7fbfc267bb4bacfae9ad87d5acb713c7070bd9925fee30c858811ca9f0eda56b9a711ca0f412b45a0903342f976b689dd4737b6f4ac16a494ca367ef315e7b2d2957a1e9ff9aaf3e9533f16da961a183f66d8d400e25c7eeb2f8c8f675addedb6fbb4a1b37e60c86656454f9536351750f42f3dbef2599556f9ad0a567919b31ee7527daaadfa549f25aa4f4867865bd3ef33ffe279dfefb7b102d77e17e49e8d0dd0d00aa1837ef355f3c9fb409da0df5ad56cf26fb7dd7f150c89fe85575c78f521132909521d25d3789304d7be0c892fcb02c7af9308a5bb5dd22b9fd19c5c221ce808bf51717f2ad6e7a1809c157c4cb5a9a5387db06c01a3aa716b93196d0a6a13d521ace2ec6e9f8f2c28a8553a4ae41716f7335896f557b5a9ea173f1588063e316113faeb4f056ad574b5e90b564d256ceaa7fd4c1ab8702d83579e4effe8e974692294dff274aca8339dcc1d6eff84750d13e698d06eff7c17f79a2f5fd5201ad6205f31cb4fd5fa8a59ae56d55bcf56d99f4c260dbc32f9a91fca779c688e55f20d73d78a2fcbe2c61014db436b957fedc94f103622808eb8edb7253c888acb57f57693371b9aafba2a359f1f2cb7bb2d0ed48171bb3b3382eaad7dec663d84f5c634b75b6f9e6cb647739feed3a76ce9204ff7e973aee0e35149641afef1b213f71b5951e3d5637b8e941af8bc9b99b9bbbb4b5ac2ee6e5311a17ceeeeeec9a26e9ac32767bb9c14bcb91c8020977fec60887cf7dddf44ea7714cc9af9d87cc373f28d872e9740f97d75bb04918908224c23ba53448479c6377c73f85a72a64d2c5bbcdff4f649bd255da1e79cdd6c2b496de24a259c734eef2edff7e5e8ee6eb09f48cfb1fb3a577f42f9b2478fe266561b84f267dac4ef3abccc26c96a037617c185a269e5402e8480be76ce106e7fed623b8ee36cd759ae4be759ce22c121113a8077f323d469db9eddfea6b2466542989936346b923ef573a0034cd333773ca2430d4f32b91de10ef0ca7e8f33b2c96da984bb78d676638b697766e6042a420fadcfebd2765c0801758a7b73ce9ed5ee80b608f9fdb2cf1a43588ebdbaf5dadddd0e9edc166a0d14783d2d5b18cd4f7cc61aafdb425d50ca1a4ad8922143b2937b606f80a30ef412f4c5800680c9c0182f37da8474031c751ec6a0fc7aa17973a74fccd327be2d6b00263d7d62d216213705b4e22589db023b2dbc0871392de1bcece3e587db02c118ae4b016503c6c8dcb8ec93050b666615366b3528117dbcb8244cd46d8222e4ffe40da75df275a41f89c95714874ffd361f5b24064011ca6f7115b0261f5f20642b55fcdc1d97ad5471bb3ebb35fc7258fc21e9ddc437522ccd0f4db034df047e92d07749429fc37a1b3f993e8606d4f7c624ddd822d95016b346f423e0a74ac7188c7c383587f5ccaa63c948e8c10f8d259cf04b46ec87de7ee8250b1c8bd80014eea180cfaceebfefc62445e07c6312c9ea5a4cc3e1bad42d7fc0f8d697324944e5b9b556d973ebb7f41ee7a9ef47b48a0671ab94e1a813fef744da775ac556aa9072eb8f127dc982f9cf8aaeefb9cf81f92f24bac20fc79211fbe1dbd163f625cb1a01c72eb7eb012f82fe27968c70ff3d37baec0192c5bd64715fc508eb97642d4918987f40183e4c08f323081f049f5930527ca14dd54693f013e54b86a4ab4dd5fbee61aebca3177d8770744663498a66723402f6f8a93e98c3fa40f1134b7204c1fab140e9f2539d63c834f3619866f25b3b53bf1cd9df968fe94beecb1aae0b7343ab6056337da2de776fc1186aea9505c3183a73698f22a8807b5b726f2cb97f12effd456312e9f253dfef133df156e217f1f7467834f2bd68b4e1f80988fdc4fa8af889c640f2de43a0c89e5892dd36d65ab12f37a2fcc41fbaba69171fcfb42a8c7e286a1389a84df4504423bd515b113f892d69bbf63f07d95d1412433fd9ffc452fd1c96cfc4521d7174725836f4387eb20ff6f7fd21fb9e3726418decb324cff3cf2c9667bb3abad026fb829fec0e20c2bf19c001073d94c10335b034c1b21310e38b1d1f0841c4165bb0ec7f21060abc50f264a78950a7e7063f2f19f85c61d9ef44247eb23c61c948f7fdcee3336bad7da72287c86b7fc29cc77bec8b2646d8729e5b61b2b9343e9ef96eb3da15364abeb51c8c97906f0947a75f3eccf5900a383ade18a7ceda91d6fcd4ffe3b64e3cb3e92cad79378ed64e97feb4a9a4858d1b3e98bc5e3f4a556ec4f4982206874c0a0b8ac471a92ba17c1d292d4a32386680a4b248fda4b048e9206525949ff209e5a7ae086700004291c9bc580e0010c2476940d19ae7629a245256486944aa96aa2285831415a92a524a6ea4b554d35a6a0a5a8be9228950d21ceaf2919212caa72e9d8f675a32470ecf918351e26cd621c04f2dc7168b719b7d709bb3dcb6a351ee90422312a66101ad7c4355f3398a06bff971f0107fd671191c91349221908880553ea6d02689654a6e4f4447898569fa29dff08d4a27d3b8468469ba0343538f17de7c0e7edbd9c4781d08b3433cd984a0847e3a2287a883d9d132f18c51ff791d12c9c92a5f84dbe220116e4b2271295c56bcb2b8ade57603491fbe1a167cdfed728032c8e17d36af6376e0dd2d795b40ac13ddec9ed3d2777c2841c5d6bcce73ce39e79c73fe0ff9bacc1e023a85ce0b73ced6e9ee9687e328e5aee5718ee338e7a657293d27fb48a7bbbb173c698c6e74f6d017ad81553cd8d4df63c9e517a794cbdff46e7799e389f487dbdf12bb19ba3f783ff8b8f4462201a100f7c30f377ab3e3487673a6a1b49db6e43a45739493934c6f66f4caf36efef25bde8d479e0e93d6c9719c3f8b9c0bdcdddddddddddddddddddddddddddddddddddddddddddddddddddde95739e79c93ee5c9eb333c22bedbe9ecffb3aef63e2f26ad3ab79b539e7fcb8f9727edff7994852483e4eaff7f33aae734e5795d2ee59e1e2aa074a79cd7a6853f4f86a54a3b56a649b8255a32d7ac0f7be9fc1b2c01fd57c3502f253b76a1434da8255a32e3549034b2623205fa14641ad92ae5117564925a81110e864875bd38ff295e703c9e4d5756274d45b24fb721b1b7051ba82bdd645bf41f025135e8134f0ea41132909d2d851eb5cbde0e7258192e2922e6fd15d8e4a80aa8d5c5ead8eae4e8aafd22959f07835cffb6953bf7785e6abd1cd4f3fad0a5d6df2aeb02a54e2d16e735c1ddd7c15bec2981256853dbc46b7db3cf0c90736a13f7c85b15649589b7a7019841ce2f64b998c7161e9037fb9fdedddbc200fc8430fc857cc9a56c25ae5d9e8943ef0ca566e8e9e8d69faab67b399226135e6e34a98af3c1bccb37936cfe6d93cdb2807cf3652c2b37936cfe6d9c22e055f8d0e3a70954eef1a1dbabb5b894ffae8f978a625921e4f8719ff9ba28ffb49f0d6cd62903073646666ee7a58194c4a29a54ccde5d9babbbd92ebe371f74fe4217371738a3b64600dacdd7e3a45d295c142b71aba856e53d471d94661a9283eaf1351588e4b298cc244b31b329bcd66b3d96c369bcd66b3d96c369bcd66b3d96c369bcd66b3d96c369bcd66c3a123db27ad9cedbc0f0c8946218c8d1b313872e820ede05192e9e1c36593b9268f4c89c70e928e1c3e7ef470988cd66c3970c4dcb001f3e365640e830947a2fa6249c27a16023f4f1c79c0b8d9cdebb811c80ef9fc3ce48fb0dbdf526661406648d7da2ed7aced0039ae97191d17013e21a7bc8432077f87a3063aa7e82f3be79c74ce39e764ea7c235b057ef6b16b6da242f8cbdddddddddddd9dd6b1e42ea59494264157e0ce71eeed319e6ef6f14c0be4a9b58a6baff6691296df6202036533bb2377871d76d8618728306e7f8ce6e0933675ac4ded0e46afaa0ca855f377ccb89587aa517baa4e9dd52595569dd45a7df2e3b11f5f753b7deaef7666b723f3d5a7469ffa757696f038e97932bb6010b79b884bbfa06ea7a94ff61649a6a14debcaf250b1f4a9fe9c11b6ba9ddbdfed7444f4ca9f780c8b10f458cd1be4e99ed8e85c2c2f0394b3a2ce0c36ac6ee4fe6559de689f885bb1daef44cf765c7d2b72f541c07d782bfbfd7c9c36a8572bb5d3ba7f53c97dee75c4e1dec706308b7b000158d5bf35296aa2665b22bababbbbbbbb7bbbbbbbbbbbbbbbbbbbbbfbf46642f2f439e77466663ab68adddd49290877dcbd832e7b5ab852b0f19e9ced6a596858384bc39285c6d1c029e155dd72dbc2d9b025892d1d0f7cf2e1f6fb977e39b6ac0d432ac7d9267a737be4d2ced6d00a9632735dd77526921492ec2cd7d3672d30d815a6d59f999999e94729a55e392bbdd3e77da2d904a96549323fc3f56d57eb73757cd9a0b8ca7de52ad727d2b37eb5e1b572dcacdcdb39e7e41e0415ca94ed93b6fc27a52d39c556bd339c959b5cfd5939b73121af7a367eaa6162fb6b9884f299993beb79c0b341ea55bbfc42bac86147024ea9bbbbbb3be59f9cf5463029284289236484dd9999995947e8eeeeee3cc21e76ce39e79c0f135be42e7028ecd521886092a7209f07d630c161240ac377f719ea5efd060e1c6f421800b04d9c7a591f3795aa9973864386a450738337038574c12f80100eedf19313414e238cf0259080221200134e48418182cd4d182b00987ac91414610a43042080d42bf5b2454016562892804fbd42409da03cee0a60610120b78a0121a04e5006e084803a41715aa04ed016186ce151c0420515317077f7c2d65ac7f8bcce7e94b37e620b7ea6673eb9b448d885ffc0cffbe684c147c2e507651514c957a82aa1f451424971a5b53ae5462bdff0cd5253c3ade64546cd0c64d4c8c0d9cefb38293ea42749dd13e464923273127620af3c5a0ca5d9189579345f15a1d18a78583c2c57aed06833a8088d467b1aa9480d0d35d4b5b1b1b1e908c02befdbc70f8b2aa210dd64a19b0cbcc9be9bccbbc98ed8709bf40960338457de91276eb223411ce940cafd2995524af7e97def914852481ffb9ca893b8a38b8121a6b35ca5a1b55ca59386eaa46cce79a493c964b29b081785291c2485cb8a5716301b0f363674ceb2866309db1c69ce489e5907b54faef36ca55e942e8a8dd2dd669446a9d0190f0b9e595e292597204a9428241ed0cab1b82875b2664ca8448912c57560422a31e0b84e5a99d3592f78a87041468c4a0ca4701c152651a244e15903148a569b4ed139270e9523a34ae96c5ef098c1493179c1d3548442989108fc3e299ef71cd7792ffab8393051c22823d1925094af69cc0b9e1a2534541dc15d4a5963829a12d4b8beace1450c35ba504a691068adb4725ca5595ca1d41d885277a034288d12c48552771ea0718619659031c64d0c2961b8f300018c2fbcf801a5ee4094ba03b93ba5ee403161c0aaaf6cf75e90126c538b94ce8696db305a471b3311cc87b4a2644dd1939d74bf017323829c4c376adec9ba9b9d2399bdcd59779bb339bbfd376acdc4b391606278e585705926a43257b1c02627aa226d6aafe62b9c3ef5e3bc97c5cbc235e9323d0bfd2412534a6b4068e8d9ea0bbef6492b10caf623af60533fa955b2d6a62e4284835cfa80ebed7dc0bb2eafa8307caad56ff1d21d15182757b1c07100afba396bbeea4629bb22abd508210382369b68e538bb03e6c50ad08cd7bff3bc2e09c9379269fc858b183ee0510c0c3196ab93daf8aafb5aad5643e1408057dec85f6e3397dbec832c5c9dd45fba5cd6dc6b2ec89aafa4ac26abd564b6044568c4c863a6a1f2461a5d67ad0272ac9c3378a8294e6e7edf517fe629597c242448283f99c6984267dd6d72e2c8b3159043bd9967f9da2975f7b9c2fc3a4e16a4cbcef974d6593db4c294ae3bc7c9de925dfa0e249f8e924d48397e96c8963208698faf2a0d6eebc4aa6208c57e8844a2b6266c619fe0a75318e5f1a67c300e894a59cb940ff60526b475ca217449c88934d6a6b696e3bc20bc20bc9d5e51271456bf3ea14ee8123984e6409b501c60ce65767bc6375c7d2b473b5e0b82c2209ec8e80e3d5c7e9a021e429dc8123ad6344663a325464bb4aa355262a444e7b5e0b617d4d16254469f502772084d01ed8169688cc646b3e9828f675a375c2f2b0d6e4bde0e896ad449ab6e986872f9690e3ca45b4296d0fea13166b5dba15badb5d6ae4a4f47eba82c218774539ee898483d11ca1b54fa097868341a4769ce557f24783a4ff7a05028140a0504c66d5a77547721fa6a7cc3c9e611b7152345ccd6fdf4e9e716b6ba2a2d51165116510d52dcee7e44afced661695357a5abd2d57ad561e97eba1f9b8b416512d573ce288c6fe8b315536a2f734c73a64d31fe33ff46582aa3a950e7a43e432ad0d9e088f2b4ea08da33a332bef9de042b2effacf18df7fc755a4ca03cd21b3bdb2765e7e3e6841c12a390f2f86989191591d2fc54c2f591f69c80f298fc449b7001b0085bb657a49847e2eb22741298bc5e52a0ea08292e42f99cda12ca4f6d11cae7540f42f9292da17c460180d698c6260292835496140ffeda84295af31dfce9149d59a8540d9ae52c642302000040016316000018100a0744629120cdf33c6dbd0714800d697a406a54489b0843498cc32808a22008428418400001c840a20c11117500fef0132e7614d188ee28c2db9da19bd8f82769a4b7cbb50a806ee9f72406f8ced699989d706b8f60f7f6dcb5c45546593052e3e1ecf4828db69d2804884f99870825d2359d44228c420b5dd46294b757468e79665e79832badceb0739fef45e262f22aa5760614a19d97f22b6d1cf0818f76eb0eaa8e67c613cc87050b64ea473e3c46aba1e011074c8e3965bf40c576c1c113d593b6e5f5cfba1c9f9d168f87a08c87dfe01a3db5786cdec3d9ca13b1faf5b16b3438c69d6e2bf586f6a3c6890b3906da90c4f77adbc5e3e7553d14b8bcda3ad74f802884a7152471b6e43ec493e6118cae87c7d0a4663271c1ec0023fc4e3c74f5bf71fba8fd7d617df1aedeabb579a6db2b33726b622e010d40ce0b0047f8ace653d39ede8141d7da7cbd5f66134096e637295ff6b8e934ada31a632191b79febeb908e8c2c654d37b8c25e479dd7cb952f142c691a33b2fcb3da4e93ced1ed24b69025adaea500ae4df83ae1eefd4ac4ae9ba05221bab9ccdbb65d6dea534fdb5cfc52a2f69a995b52c726d0d6c081d579a50c20612883622c347de4b34aa005133398f0d81bc8968704edf2a0718715af9ea46a98ac47218bcafab9fe1db3de633f856c55591d7f667a7b7906eff67099857f72ae023fef0f77fda2be313354c2bfeb30ce9660abcccf7ca6c1eb95ccf085e1352583c1fb68ebcccc46c2c1ebea9fd91a822e61af0e9865fc7d305c1e69c9ec0c674fbddad7c782a8c92694308fe2d281f225901f7be2faab6048a8ea69d88e292332dc9daade50734402ef9692859f1b663c0594593c3ad74baf79bad63d7baf33bbbc8b783f1086ace7597cf8f958f3a913145476fd0140a4caf77e34b4c589afd490fe070d10224bd49c3b2966e6a6f0fd4082bb6775d5fb30d3de7a7f26a81e6171addc627d2f12e3036ca60a7bab92ab5634fa010a1f25c961f099c4f80fb63dfa01e7e4d374811aab956a9e6d6f7598194f947943703051f5c06788c01ff09db8656aaba85e6abb5554063133078a0a113b044cb1cea67406224c438d29136e000c6606e9fd37d7fe33a8209261801f968199b173378bab59a5112238501116e3ea88bc286c1d0333e31046756f142ce375ae6033d3bbd5772fc4226e3c4bbd0aa8fa2f33ee0a89bde8e8904657e32965c15f5f22e4e7b55ad12f3349b1e0d157fd28d3984a8b2e31aee89a0a2098cd071cae53928538fadfcabb45e9acb2e331030adf657926802f3391ef2bafe00fbe8fdccb4c6c899e7c4cd896d8581fc751445ea7a034e059c8892cd19e5e668a9dc74b1f9157f1f132a3d59dbd812889c255ba870a1430a09abc0b8f30a5f49f95ba560a3ac621209ebd588bb64f864eebd8979360909c98d127e014c18a8c05fc22af4714ae9032a17c5bc769af0fa6952e57098b61e2ce2170c673d1c7ee66ad78f8e8df5a4b9ac7b262c5ad74016d5ac53e17199457dbf9dd470e049a70a29bd3135cf12f4f48dd3293ccd800ca8bdbab87ec770da3df72957b9a165301545e7fe4c0aec49e018c9fe58a9242441ee6dd9c44824e27bc393545657a122c5dbe6a688f10064bfd0548cc0afccf972f0e9e49eebd94ce9f85ba65fa90bcf80bb61a9886aa88aac08fd039872279463ca62569927d08cb92d036d0882ad56afdbee2208b65e596bf19b20e0eb66ea3826cd9fd52016c2e310b248a6c3090622791b70fa059c5f1a7a8164cd8a7578448446a8f9bffdfa58eb70b20df661f8eb8310af46c513e01608f90c76c24c0ba85b7802e8d23df1a839f78fa6dbc4583e3e90fe4a321615519916ab50bea98768b209e0e45d3c7d6209618d475d6dde6c1d086663b08b1d46cb3f1708fc3f84cbf26df2e635080e6a57cc4daac9b6e99adfcd050cdfefa9e488ec43aff83f5f6a5f9e3044eadfcb6516c6a2abb359f904b4ecba377c3ddbf29bd45eac511cf20bf6da5f314cec00b5f1ea4de2877dfbd148bf43a16ae9cc827f0d3274fcd339588f37d281048e9ea87952d60f36487700ba01122074bb6f9320407a6fed5fec8fa8d25ee4542f64033b873c095a83b55e4866724e5a06c28a2d9fa14db0bf28c505713db8658d972444726d6798fcce9a93d55927e801ee45442fb19bcd34020959de745032eb2a80f68e0f9acac157532f2bc8c7966d3447d078a3b6a03e7cee2ec6072ac05ff52388db91ccd142ca9c4c274162aaea47846fbba359ed917cb5f096e4231798cf303c6a8b17f3130909d14268365a00c42e2bf57b76ae8955ccab20c5ed4659009668ab2d8901cf8cf532f506c1bc07f27a8aa1b94bfa368a24101e145cb8309ce93006217fff7df8cdb1cd4e721f2bf9fad462c5862a5e98eaef3ef17fdbb42dc6f152479cb23c0ffb24097570c1b05e1e1f622cd463139f442d15c0d3ee3a8ea2f272457d4a3d1ad4a5045bac5b2a50ec6b775d245e7a1fe0da6724994c600f8a6b1aab82a97396f0d1f23ac5ecf0209d6385a8fbba45f63961e84b5d0e2a7b413de5ae3948395b06d805fbc9a70e972bce19f115cdcde31b80e49c1b592da4b0107b9ea9c0264bc67bfb1b52fbe4e067d1b64ab5dbba1bf00703ad67de048193357e9ac5321ab3e4e790e2096f455ed961da360327b2c83fc6b48646d2ebfd81f5bfa949857e16cfbff996d6f7f2d23e01bf2f92c11f677db43276ef083f61b870a7dc2aec823a576b38c5ff3c8fd6e6c3a56e1550ef8f685ae707344a76048cdaea465b79904c94cf5b16edf2c9b9410b20154dcb7a93a3dc9c3c4357d81e09424a02b414c54ea9b25baa60dd53641dcfa2f52b12199ad896829793e4311ee39e85fe77045e3f1998f602ed66a4aea957bace1ddeee90f1ed4f6703a87848d7795601e676bff0673fbb332ab1cdf68b70c00ce1db7cc92c901c5a637350dcab5f8dba6e8aad6cf345f1650af4acecf59476417a68b63778b1ddbb0fd9e2d238b0abb2bcc83881d07db29e57e4844750c8184723acfc92d5634d491557497253b1163e00a8e1167312baa95a889fa0c041a4874df1abcac273719326eec1771371d7cccf09fbd1bfaf9a14023200e6a7246fb4169f20e7aafcaccb48dbe428b419248eb32b0a231cd788ce9075a5a539a1dfe64ccd2dad28657c5ce1d58a9f45f1af42e42d7b4417a9b4fd2067a335560e1407bcc04e2e580b67c9102f8dbeb3ae37f581683bf430c31a0d06b7460ac7eaf3059bb2488dd90ab6ac655be27f9f024aaec32bf5cd7708fad1e5a0eafa0e020b568728731f45e73b539e3cee21130348d02dd8e91865b6275a2624015431ab312fc80a10a55cc22d82ffc0f3bbc00a3506eda409674d90fb77b127891d3131e0ee0909d1d55b0e82d7b752d525c3b03a1cadd61cf04dfc7e6eef15cba91b3aa425f1650c20372a81f61aab1ed6dde4af340e082249243ceaa08cc51be4815c45c6b1cb11218829c325e3125ce90cf13dbeb8cd8c633ec6b2c0f28152053d47d9ca9a893c528b4f1f4b5375ca01314b753360106596bbe92a738f47d9c1beceb16b7355b4e12692ab0619e9644c7438f3e615a91f038932cfca30f821a5e3d6f20776fb3905593faa93346b70fbd341eea135d15bd3696b804290ef03f59622999931232d443e43e1cc2f4e2aefb684c8f2bdd4803f0696c53de1c0922a06bb35510c1018c28b1dc27d2003eec4208d5901e574208eefa5d52542057188f253c04545003ebc4713005d2b3879a3c9f4a4dcfc17150364854eab0faa378195c50bce60b79659f18a9993402c87cc8d594c07da942f09b8a821e62c9bccae92f44f9445f76dc109c5ccaeb4bbd6269faa04efe8dad4ca3a13aa6f0913bee898056b8fed8ec43c0d9928af1f1106bcb978f47a342d8923bd782f3e7dcbf71c3de1a78cf92022f5078b29121c585d62454f359b0f92b60daf9ecfb4b8b0dc90a0e03e2a1f6691828ca39d48ce1d03317967b918ce747be557692285995215836e7f8ef2aa1395c913b07c38f6bc95112fa52397726a946017556659e0192349e0ce3610e4fb1c40698d9fac6e049141fa0be58c6e6a92b535b0dfd287238921cbc949cfc0832b005a6c5a6651a5f308504c44fc0cb988c17fbc55a6ad857a65f46413904902699779c1207f531ee91a2d723e8647d7554acd2e224697bca17e6a27a70b161089df0195bbf0f768e7d18050efd1a1d70e932041ca407365fbb43d7431c8c7a515c481cfbf43933a62c9ee375896c29fe329fa6288a321f0b86f888b2a95480d5fbdba13b6b27e7d980fa2fd72f508fb749ab8e0289b57c25cdc28e9589634534ae8baa7f953e844b8277119361beaafce094c1e84eb94368263187c6a05d4cf46103e88f137901070a66a207c9b87c368a6892cee3dc46c066dc0a7ba26207e75b571e554692ef517f78a53e67b1bd1f5e607bd8acbad5522c7a7e305310d019f73a52ceec0065ef83d1e4393dbd8ce3d1fd4eeb1fe2c034240250b1557b3c4b61b6cea88999e9b96efefba79b3ad197394c7fdac790fa344f080463931a86dfa07b954c382569c02eb45c272ef593381010b475c2565d6f7827d6e640ffc2a01ed897b4e167ef58b16581eacc035fc3205b94e368ea28aadc1cff993e62512f66892dfb7f62a3959b5c480e3fc01c30992fe612b6e228c85b3a51fbc9aaef1426832afc6b42d7041b958b5bcd5ca796fcfa38855f1786bf9c14a7f4e1a15d4d6b1fe0d9570b6cca0ff637c23c7e1c285741caff857160a8d56d23987aec4f46add39c2c22e7f3d0eeba428b1c5055b0abb397bf6c0b0c7875b6286d7da0cd66638f1f5fdd77abd21017e92aea9dcd16aed34b0466f0d30ea345e9a14dedc0c92ba7b9dff1c9fcb6e8673cc6e107c720fc8f67b2e4d63c0dca6a28ab5c48650dfd93b00720b1e5883bfab91bf9b043ee59643c3eccfb7fe97c39f4ed878dfd7ffbd1ff8d3ea4db88e974df4413464745a6461fc47b3efcf9d169477268f026fd910aa29d3fe97063d98f89e285b4823f1b6689498be38196fd79149f3b9a022cb0034f593b817de06ee82fe1bb80ade4fbefd4a4aab16ce96a6e3dda4a0c9e808c99b8fb3304e4f9badd7e8b7d91e200762a0254f4f7cf95720e92e1a3b0427d488bd05ab189854b1cddea376e31d45ac90c41856804c03abff80c51846ae6b7a5531752aceb8653bac87ee2b38e4b1f45e964a8b5370fa79a53f95ea83474c30a85b38d3037d91af5c4478923590fdaf3c4db7cc6fc6b7edce0693491aee9db7cda8d3feb9c53f60f1fe6d2b3ecaf7aac02b5d4010568a30a043d1597df336004908629f10991bdc7c098c6a3496737db6cc57aaeedb5b3110ee8216f961cb41e95949f00c385b821d6b88f234468e1d9c8181814cf93e51b307a8c0826e6def46f7cff18c4bdfa3277e1942c0dfba4344f814425f336ff5691d19b5d0ebc5788cb7f6193e0649a431f143bb43738c10a88d75587683ea664c2e5d96b00682d2f27425832a880f4c5c6e25e1aa0eb6469cc54513dce388325fa8498612594320bf3cb685f36404bf20f2d337c0c248fbd8e82ff6309f2cdf36b9355d880caf21d9c9a3ed5b33540cd02a54c0110f0dcc00741b8b37cbb0f470407cd1cc146b8a20dbd0d58803062df94573264f32d53b5e70f6087fb50ab6863e6eaf2e3e699ff3cc1471d42211a9c756ba7b5d158bf0e7add17f5aea5e9faa24dce8302cad9109bb14f79fc3597c9165e51955cfaa63a32c29eab4a3215941e9b0e3fb57502dc4e715f9fd42adaf018c1b02a666a8eb91e53f815e7cf7fa1998ef566f2153711752355b7666493387929141e8f602daff7c1702ca40ea0fb6c88f281b6392d052f72ba19b1bc59269380a1d777f7c0d520f8627c3df5b9befdf7581b1d0347ea76b7d10edd97aea603c118c40ec1a840fbe9df2034dec169625d704fd2d28989d557c63998f044c1212d689c10e33941b1eb494b363afb7f4371ab653da2cc1c6d379ea22f9881b417c8299c3448905e92e557f29869f84dc9e8a478a42570f5939cf66353fd2bcd6c4436ba2dddc11381c69da9a4c123f4811e85c5b1465a3f29a67ecbacdfc288678920b13296e98b9802f2281031b76ae3676b71c55a7b526b95edc5f3ce6d003fb5e22c121a3b723517f94f5db830dfd998d25d51ef5fd00131ec9a4d67b8804b3ea245c99b822625204edc4b3a7efc9c4b3c3c9b64984f1744cd34f4442f6fdf2db47f08f47467e17fecd3c367550f4d8c62c81aa7b421aea8f39f12192d056b1b9184c89fc8026ce4e7b39db7d145a6765e976f77f4ede9e705ee9df5f0f57c84e0c957db52569b7ec8f092fe390db70c0ae453dd9322017c6c09b33bed44266df75be8fdb7f1c05ab1b76799adf4ce940d9f246cd012bcb8ef03200ee647d1fa23067bd0ab5207bdf3eb9c9c4104c62179011950299c1d0b63e43f623ba06fae101264250e2e8486dfd8cedeb8f69f4632af677ccaa91ed821704e8b755910e02ea009297cebe5dc7ccc63604b2ba377ec748748ce505b283ab55c621767585e403d32a45725489c4247a55cd528ae35ad3d8bdcc11975392a9a54300b00ff3d8cb619027dc5a85af4168d3e04bc00e63b1e41c0c86ead695ea081e1b8c7c7f9459d857c92075a28ee7b0d8cc7ed3a54675d944a50dd0998a99989fd44aaaa244a83c8c8ce4263095c7b5fb6a2bb680aff2024cf92d311048b40a2b49ba5e267748a0c48ec1f1dfd9ae89ec139f7f68f2c7a1333cd8806d6b57a4d978ae43bb6e0a5c2d08557b541f727685ca8d9d8b8116c8bee9f9d705fce10bbd4d63f38513292ec11c06cd314c805a8dd8ceed3fd806be6cb3fd3dd85285f49774a5e432c6290c6905e567e879e750681bf92d2d49eb364cb210fbf43e139309cade749fd9eff783c2fa66321ce2c0065d18dea1c11b02014cb7c2d6adfc18e075db9fb353d44db619bab077e00137515f87db965f1301513d17691217a39bac60643411b6d5ee0719a2e94360c981b80176d18197486c9be5e9f9266eaef1834bb04b05e125de3d30a3e1a9b132a5bfcbb510f42ffaf73a120a60c94f766af9886ed50364dbcb9cbe384afc043aeb7e709ee28580a237a94d667a2df860225ace03a9275e2d557fa4916f93172a9f11c447f48c50c3b365af9af24b29c42dfbfa6f0fd0928a9afc964909de6042a84a4186d68e8dc97807d99c143cde0969c21591f0cbe4e497cbabd1e50d11dfc3f657dc4633779af3d7f89520e4dafece7e26120f614f88c34a517832925ed200e2ac38737fb01dbc6afa63f9717713d47ae253806ad86dc7ec4019927b8b2e0260d3bc1952c4f9b30c4d367c581d2a786e57e622b70cec5452e6ee3fb0f20944520aa67183beb74d0196cfb43b220d8aee0df0bbb3b2925385396fbda743b7707643819ffa6e3caf556dc0a01365b4639bce8497b0410c0c277d4d8d58083e164021a2460864b27168bf003a360fce071a2b375fa85e0b00ad8f541f7031b81c0063fc162d7f7ec922341d0a1b9d1731562ee61a720f926d0255788d1a9a8fa9ac8f8faf236271ba8b08e53218cc531426179c2cc1e6dcc8d076b847fabe14267b3e5c00a9b4719e733ca8ee8290751679a97516d4ae92307cff977e2e662a02fb47da1e2f82e4b1ba27cdd2377c2da932705bd9362123f00af7aa16e3984aec5afb0550553446b2244d6aa71c8c55754882b2667a368b8e1fe4f33a2741eeabbca6aae7a5b3d790395d012b427d5ef4dce54af55f9de9608fb26178ac78fc452c029d6b814eafa4a82e6e94ae79475198aac6fe05434147e41d4bc6cd70b3a270fbfeb02b1e8a39e6d19d0e0ad072a5467d6802611945407c8cdfd3baa58db97f7556d70bae1491840913ef68db1b95d67f8a660fd35cfedf6fb88120e9a642c03ee082b6dced031c65b22569172680e705b42caa508b704b2058601c2185f0670e524621213388c92defa68026bdf0462252f76a4cac054af9e7c0871210f23cfe43198fe40b1e7092e26b40f665d63229a490dc4909171fe152f1f84bb18afffbed23a5020161902eed03007a9eb5bb4f020cab744c0ec7e303274f4470e68be7f083327be72788698e8731ee8ff9d70d45023ed48d6653531ebb03e205139c2aed25255a2cc465ec4431cfb0261f4962aa067778b56e2df0289eca8018fdc3bcab47390d9032ef25bc715ff474ed0c4a60429b17faf9e1aa504b8a01d5bd367308965a00b3cfbdc6553403b9ca30cf8fc27cfdbf35ccf442c6d23417faa97754255eaa838fdb6edc5152d2e8966dae11c25380922190a8392c6e04604b6bb415af71cb80f767ca06e48473cdd27e771803d3c3e1540684cb40942b67b56b146a1ed0538d9a10d450ceca098ef81a5ab2e3b7dad71e5cee21ab9ec5d322c9d443f21a24e481de8d3832f756a063bf8325550f975019376ecd9b552c0c35fb34d46f5d8182a64332bb394bb7b65f6dcd2a6a89b5badd277d9cc61e7add8dfb24e43243069bea10dcaa8232a60a2b91865bcc1d376a4c9a7a6f1d89c15c3559b8027da456460c7263a0405bdb23c1ea8db3d105210612323d35760087921926149f30d455edea1411b879b33f3250b8bd86c70080e471312ee4872b0570e94fd89af5e7449db70254cdcfc61ab2b20722abc496b7bb52b9899f62726168a90c3526fa2c5ae07491cc732bdfd1e865fa05475a2498d5c0b4e380881038d3939c5e3418623e9fd6315d1b68b98868a0a00f95164592df3e91f3ce0d8ce74ad2bfb7300e09a292fbc2b0eaf6e58e4e997683e03555d130f9be23ca59fbc04faabc8748e1cf4716c29007356a84443b2eb2593fc4854118f59836918d873c609a4546d157d302c11adf11a84344491f371a2a7881c9359bc2897591301af9237e4900a80f0fcf17fde553a9b93262f3a9264a3632fac16b44ca3e4eed604e0e67daea432d6d232ffe4a09674178fd5958ad70bd7d3a5d4d8c7111bfab9b0707d1907ff4072ef93dc6aeab85d904aa35795f49a2d232b55ba1bfaa12d6bb78a259e15b81b6b2b6eaee1e3c4177505e252b73b76b33eee6c3e74f07d2501d45d59d197c3282c2d3054e69782a99e83725901a8b749a52451d645596723010318ee2338e5f12190826818a74de97ec3c938d03c897c0a145a8e609d7535428253e5950bb39be038ceee49f3707ee08880b64ab9c3950d6219e82b04d938712efb23ccfc5cf29dd88054bb16b73b9002379d9b27b091574800d1cfa5ca9f3f84152b6f6de1964b4963e65c60f6c2c3157f617cb6dec35ca26990cca62b4e61a6af5cbbaa40c9734124662d3b00f15a58044354fdae564814e4d6d7d6f369e6c9c18c39d06cc40d12b6b77b68742107bc238ebc109a2e1f288ec3b1b593819b07c53c0ab57f142f1dcf73a99ff8e998335ae4ca1d2d9661123cb5a2c17089028469056bda21098a4f75a03018670481a07854270a833146d2a3731515d8212c19bda6e67c9560a16797ec2df587b5b91972aaf5ad71596176071572a9ace5e9677acfc754fd3bda04bc60c3d929d9fc2ba296d62f02c7d8b79db9871567cc14f6fb29b368a8639612d7891cb76a694391a17cd7c70ca31de59f1cb27a8847e859f558f62569cddbb2f8e3238dc50f50913f77188d9370ff310c3086e30e7034fe0855c683b8b2c32afc04763cbba201851d89bdf107193834b43814ede6af58a16d2cdd806b125f5f43ccb101838e98e49c3fed46cd3b0a628ded3d87adc0841fc0a635205e1e89febe1288ba558d5d7b657fa8549d27d556b0dea473c9d963ffa4f09472645786e27e8a5610564f55758aef4d25385725aab3e4b44ed61c9dd2d10e7848b4c0b61e67ae5d74348f25e742ad80f812f8ee5ed6bfdef203a5e0678c30c14c7a45ea8d6ace9941d93ff6ccbc670cfd5c1466e2c4d795e9eb62bc5d1a00c0610cf1e83777352b64e0ae232a91df7ced1bf4a4c5906e4aff05f502d25d0efeb54436bc122229e9278d39a81f2fd1fdb4555272b11f2a65b3325875f4b1d208a85316e6b2115a22344d6615c32f79b144d89beb4393f5d864dbc1440fcd976c072f64de4e0f0f3f8d4f4a848b3611781920e0d1f0efc88661b8de864d5641067458c16ebad164c1036328978ccab233ba6b5abb4e271dbc4ea1efe5e3d2eb6406ac3e1f5b037daf35a6458826875c7ca6f7ed9c4604dc0c8a6bdcfd628d8cbf5aaf89700043932d7e27c4274a808c633b7744bfe7c798aed048307dde57a9670b5b568a657cf626df850ec9fd4ee3bee261041d93890d12f037d145fc209971d2c0e7dab1d05fbb4d813e3796331d37ab8a398fefa2456c48a72b622c4f60e4aabd3a4900c574acadad43a2dbb79d7b4c061fcdabe191582d7aa1fa70ab830efdea5be05446f8401a780687663bf304ee63a14938d80d27ecfee059093d444b360d11d8e83038b9fe9f6ebacfadb9d1e499066a4ec7dea6c032cc48621dfa683e92a6898f46e8b309f9dd97649159e299048e261cf52e736d731d4d2e14014e0da6b96bd38c511342093d0afdfee8b6ecbee6549b7fc059160ad94751e6b496f421f7d20cb4d2e7b5f4a023516004f5448857e9c45c8b4dc92faf66486707164cd4cc3cd6f3d74d9652d4368f6527e5f0f977e3a3a508dcb35b55b6586268a81f9d7f99b274a2b38ff662d306958e6867437234718c34321f01177d676920c7fefacf8880e0b2199f822ef2d49f379fc8dfa0a10808e8eb45b6a2443c2e5bf1c1dbeec22d93b88830fd6f6573129e85877da409f0512b7ed850140cfce6582e3504715672e428fba48776320728d1311b451b2a628d6bd9db7f55dd22c0008e8d141030645af58c133698ca5674e48c8b89789f9820693d91f37d1dcec886e95be0e51dc06d3f1ca5ff71e79796da119447e36eecac23a3d2ef95dbc84449b0fd1e8d253510fbccfd0fb7c456595470b69e4b00bf5e750f3253bac1e8a7b416ab45c0e029801a349676548fc7e8013340e4d3cbdbe22b99cfceb1621c9d850e38c5a41ab6548eff9d4375b0215a40fdabb806f29b9e88ee5e64b9e6cf30252a7cce946fe35f311105510554c5f829f87ccfccd7bbf36b5f41938921659011769a523567ca4a4c2f1cc89ce45e5034db1ec28c9876c4aa232d7e326d00430b6cf296bdc3c39a07f8682b24c8eabe3c73a55b501a899b98999d89058d01ab27f1bc870ca4972b6627a2ef746590f456527f67132db1e173e2e8cd4853c6ecf6042245cdde4fff6b99ea66bc54d73195b9ad9371295dc754b78f7bba8d4ac955a60cb7e9362e3dd7b3529a80cad458055426819bb4820f12d5559f2a231824044647e57f4f13b97cb1556a70931bc2e573a2bc4398c444541c08211828a50bc149b0614fe6601b1aec34c031619bea5624ecae9b9b7a53e7deb4ac6dadb1d2b98e4db175a1b430d7820a6705d1096221f1f7aabd28dc1137d980640eba733aae0940eda2c2b6829b034c6e20b1e6aa0cc88d44c0d75e6bf44c05eb7a2228bb022c61be177c31604d256769832f72a220e2daeb5be324d352820358a9b19704ecc187d17970fb493b56a0ff305d7d944b473f1d1743a0fd765ada4f897510fcf41d71a8c93060ab14f127038e8d010190e89543fb8f37eaeca17d77a56e0b21f13009e7b5bb87e90094ddcd094eeeb73e057f9c975455d87ede9e1967951fb1e29ec172f6d504c296c109972d69c01f9fd5a02cee286838fb0dc1758318d5e029931edda7721514169f9e0fa0c9815eb6180f565187f8572dfcc4944fac92d42e294480371edc980d6de79807ca641fd8e72ee6dd15c2784a777907cad7785630600346d38a08c4d5778f0644825e3000de07ae75b05af3e2705c43435027d4f8c63e331a61c25ef6c8b2c1d15d7e15b6a8ede2598bc193a13fb2e002a8f7aa85ff3e3f819a316d970dc71751703ec615327a318388a379b7993d02c6820d1dec21304f4ea8be4e00512c29d63358f2252796824d8d9950c9fd90ab0d8a1440c3d7074059ef3eaa429222cf7d04d1bb7b69d950def6340a1275cbdb887422af045c321c885214ed27d1a39777f00e2dd787f425cdf7a2315e5ef94ad25312ce1f5f5e2b19ad53eff2b354f226f8c8e139c30b5139a99424a28fc7af9b0564fab216a2e20db56702c7983e6fd4c0233a365d0472a5b5f601090dc5bc79151724a12e3d87fc0392b8e9cc13b7a54226a91ad53c7cb5cf7432b36b49d38b2051e4b6df6783a8dbfa7cd0464f5746dcc39b26f225ae96ae723fe1a7134767739cd47b0a02a28775cc879f47b83eff195b414c34d5a0e84f4ced46eb40b9777e62d4d37548309d9f24c67a8411da6f0bc3e1317cc883ed19f9f9a86acc5de1068b51ff9e28afdb56d878315d635ff4d1843305cbed6ec9a3d0cab67007976c93cfc6a684b68e0e281f27b0ad42a6fb7890b1e5fc3960668e12e40c2cba8049828b31b51a86736bda9ee7ae838ac32df3369d1d3bfb90860cf48dec24e09200308ca7e4f7c07dd24b98243839c84261c6848ce9096192e0623e11aa2b7c33063587901983902f0adfdf46b30cde7a430528106abfa7349ae8ffef7c36e33251121e92be9a8e0d4c4d2e25e631e759ac85a340df2c1379288d8208ff2c68c69379eddd4c305b12e4f9c162de1d1261581e6cf32c7e5b52c88d0d0e082abe51a176418b3704dc101935704d1fd2e47ac9047839c1fdc1a7ff182bce16f47fdd313dc2a76e444b42a0c9f03733754ae4c4334e742889bbd92beb017d02c8c6d3aef541248dc4405a4e23738e906c2b1fc1108c0945dbcca0c008680e4a74e31f787576cfe1113861f8d42b5e89c42e05bddaa9d0891cb824aeb315bc9fa0d76a77792a00b1f9f74f974d664ae8edd11bcef4362eca00b8992f85f0f0002d9ad4a90240e43dbe041ad0ac7df4ca7bf7608f1b095edabfcb8d81318af1d272e801769763a60a320418c74fb0bbd401fb5a0e0d0232452115cf988e6f31c2d1ca002ea3183cb2242ff4f7e10605b5abd873e48c050541807e35fe6d0d2168bf44cd28d1c0b9bc1f8954fcb84e54653959a39ffe4647e9f9e699aae8a8e702679c4ac821e0fdf3714150e26c4ad0e24efc83810e5c3a765e49e83857f9e7d3f3142bbf582bf9b5370287fdc3dcebf8f885cb12e5ac2226493bf89be27df8f0ebbfb63035a257732feeb308fcae43d203a5a5dcd8dea2575202f838fb91610858426c4df067cad44bd9023484d464f49b9105ab4c07ebeef74dbf1f1f386b45b13365f1f8171b61feac1f37310276a8f1a7058cfb8c42bfa78eabb6f419fee6b376bcbc6dc253cc961972cd44669f5bc36e024127178a0d32906757e9bdb74fb2d084cf2238d2d8d5a5a01ed38818bd225b1ac54dbd0dc94690a7821e290257d964dd9a10637414a5fb01d7c605e95e187c1a2ad311d40c99c27a87e20ee598eb3c90d3254716f4c103af7112c89c8eaec60d3361ef82109557cf1a26793c5c55e48f6fb674019d27c26a9e15d45a796b83f7f681a982a22e2c299e510cce0532accb937a9cc72d697e5fec2586cd64a192947898c7c6d1eea0c0d3389dbeb5f7989e818d66c9877425476e241631e2c4ff1b022db7ffc893700bf3aa61a1307a7541bcbf76bd22673833b16cf31c7363327f918e4fe91fc712993e9353ca7c27cc4a7b5e206489501a0e3c1d31c4094eb2a845b43136b272d1f539aa9d0b071fdbc41d195eb88aac5c03a2058eff84041eb949151c32e048e0ed2442fb05c436b7f436e7b18aba23347996843d869e6585988e3db5eca55c127a35e3ccb8d2c01abde0ca670c7b518369e17e11368cf7d42a78350662a4a615a2564d5e8f0badec9cf2302eae7ca8764fd7539fe1027bbf60414efdcd504022fbde8d69e65343afcb2d789026f38153045707ca3c23ab7390183bd7358c7db47036971370bb87c211f2517ae42d03349c2cbade8611dde03a6eb4228d875fd059ebbc0fd7d24b2ca106094e200349d89f43b11844a0cacae392b7c4d20789481b4e096b06043e2ccd9a19790572d4f271535616e6dce83e8b9c888416d5cce9177109a8482275f87daaf35dbf97833f62d9bdcdfeb65b24dc49209159afb88cd091ed3906a572d0373998be7ec7b68cbb90e3506ad7c82898097f541290db076129b7dc0e08627c4d0fc1cd723be53558fd97e3d9700bdccc35c6de863f8e78d646f6b5c57d4ee41b5602bda777246dc9d63e97499f87e05234ed5c422ee62d3565a789fb42e3ed0e1cf41a2d324c5d0fcc6d0119ba55844f6ee5b575e08fa5f5fcc820d7fc8af9a02d605f06f3b79bbb26e71e824f26d19775f5f48c0c5b5095405a954a86f3252258187224b33edb9f0bf5e2cec6e72b40fe424c8105f29ad54c38d405a6076f13ad8457d987c4b1dae81d0f238eaeacb0cf35246e8555eb870fc1014a8b94ec9f25d98d3f621fcc2f1ce8cedc6c0a0af6212b55ce5cd9f42bf3696804dad84fe1f15e91c88d37c3fc871eb83cd9ee3ecc86c864a175f34de8a1a599365149eb2fae20e8162bc4a39b9de9c024d0067908fefe59bdee5a840ce460c08adad6b04cf18a381cc39035e60d99d1d8e39bb19a164deea82ea05480de7d66df3092434859a8612177046b5f9100cb64e091f0004e42a1150da69d35aa975f92d478b4791185357f07e0fe6e8874d11f0ee347544af1cf01c81f140faa374bbc9127976b0c121b84d6ab37a0853c0b1c11ac7bc222e3b5c4ddf612a74fca00d66e1ca8c1fffff3496d427f5e48d25f8605e0a89b3fc0afbcb0461104ed7ff08db6092a375f55226f2ed553c50809ad3aaf5bfa0cd616d16f657676be21b04c0f28cf6118823de07a397acb4fd353d4bf2af439fd9b95400d8efcb98cb307968f26310a6a55270b7590cba38b99ea687060eeef7efa0b67bf374092a940194226dda2fe86776bc0759d6e13c64bf51fc15783b00ce8f2c92001cdb253ba881fe74bf756b05a513ea70ca8a11653315b996e1d20ef794d6d3f63b3609445a5def621a4279c70a7c1d7055ec278d73dead4c17ec9e9010dd1c549c0f516f1468b62448247297a1551eab59580eb8ec20402b46280f6740b62db2730e8fcca94b64d9387c988737954e4bd0a7d3c4d88fb853739368f0abba124074c6ac98c4b4505c6a45c1adbbf00b0fa362e1187a01e1990aa20be41254843113c52f5c3606a38b7c4e06af94f16d427e0f24e8a7e144301d145040f8f922e31cd8298cbf1da877e18b800646c725ea45565100049376b9f101df8242bcda6677a3785b71c9c9a623a9bb8b85b49c4e8f080dcfd430dcae6175e7806416c0cf99e1c712c3e756d2318388280d8d33474bab30b926f593204ce9a49c2810dd9c5e651561701edf0b7c734ae19434feff9a16d26904c23922f703f0cd790726b4a65e18b767da1cce9c74348405ac723a58cc1e6c470ea66a62c5680cda8a36aea14422d76695ff1649459b8049538da587b2d8ce1820f0ed8325d5f22f16fa22ae1dd0640c881613c5aca7ff22291bcdf3699ddb887fec758762829ef9f3d495e3828689b4a309e1da11a089fdc26ca2c25ebdba2aade7bbff40cd7e99a0a8f16b52f2d97a9932b95419f2f4eab9b0fedeca409ba26e8a741a818e035d0b056b9ffeb11282295d22718e8bd5dec4b30abcd3c19787802558747bbbd1e6c1db65cdae91d486e97471ae349bb0f0b6e9f93965a7ea7b7fcefa8b4759c02f3010f6e465a73e2f93b3222b836f8baa6384edfffa03fe0382b49393cd4de198a9209dcfcc2691796647c23c428777271833241787e963769b0f07a7e5679c4427972a8e29e639b8499cfd1fa24e8a9721a662738fac7c21f11ac2e82da1c327af80509212ee1120d2b1c34c7e4eb318ec0cbc2382485944fddb59b22327ac61e595d7b35480be28ab653130a14cb6326476a55549246828313b93279be1b9631bf5195545bfc9b31ee2336f888aebff4a924705727dacd0e3e52d894d0420e7873446f7e09b4e8d45c5bfaf6167e0317d792e395fc433b99c3a3a8d307b9cf7e92c4e48d081cec19a59ec86d5d589f0b34544262a656e9c492e1373117b257d8f1b285322f0b9594a0961569c38d4538435d97e8cde785f8754c960e6e3ed0a17d634174f0856d9c4fd1f6bb33088923151deb0818a74f178c1fc0e79f33dbe87ddedbd6ac91b4b5956cf362384084741f21c074e3d5e753ed2b9c68fed3607800f0fdb95a7ccacc649600a0276f8589d72f0a6df3f6bf6860b4e24a33a1dbe8785ce2c5e8e32db35069b229a6cd967f57343576d7093c47cfc54d1df615419fad77fed8e3d40afdf1f82a62ac12b3c83d70e3f9e333c05316f920dbbe94e1cd138b11b1510eeb43d3253c073b70911a5e76ee7e068a0c1dc68700ba43f7f0e1c67f8892f1487a176eb59a3ab97d80b86a0e6d4a7f8671a8d754d77a404116c069fb1738b534e0ffb8d92182dd4226c43e6a04202f93354563112ac54140d38378416734596170e25f440289e700a3bc5f411e25acf6ad57089758e72d596e865595d58df9839b7af6aba65d9dc0147286f0ac1473ccf2cd598ef0836e1483bf4433ebba1632ebba06f5c02836d0e019278fa38c7c0ee76503236162760ec9c90bb8caad6a5c2fd8b8d04c797695ed5f0d9362c8a1bc00b70a085a3ac4461f53c4094a0a0d80006479ab3fdc50e8cde8b27cc1a57897e76c5948f72dbbb15280097db5acd05ea1c7e0cb06dee89aaedcb5a86d76d583c0cf93dcc8025c36e61c3e2925854f0a9d6585291cccd579961f321533a08082651fe42dbfb2f518eb1b082dcf8a848435746697744030079458471add4fad446918b109c6fa86630b46d42eb9b12f18fd941561833ac48e173447cfca3f53f2212d38417a126abc58b17efd672fdd78a7fe54902f68580794184010ba705bfdbdcc83667f896cd1de610e9206dfa75e3776cd610e09b83550bd348b58ef649cfae1e12953861efc6f5ba1a468abf3ff50f94bce2c114a191e1e1e9d4dbaf884f2651db8e2fcd6a349fe4760c1cbca3ce712458c59bf5e44fa2818b17dad78f5c64c48e2439a7c933bce6e1a94c2063d1918444e8b67285093157e812edbd3c09f3908c593d304e97a324452ee9c9c66ce8b7bbb4ea1c9c9f5c1df62194bcfb9ed4a87b2e72a9efc119b1337f694cb4e425625510ccfd61be438e34fa590ea56ad83f6fd4d205fb1d5db8a6655ada70c490757f6ad1e8e786e43e828658fd7c8800de1745848cc9a8498602d9ad68833ebff6b104ca1e43a36df53cf8bdb3c867eaa1324696928c924a480b112e5ce0dc768c382da9f20c5c4730c279a8c31c89229a21975a9d0e134854c37fed6928476b5e4084219a47276561291a242441510858212b86c26c9a0846add5e7fd80317f505c272ab076657e553a34cbdaa6b9f0fb5325e3373b72b5dda3fa2c80980da1304694f6b3a6a8be56266e7e8f462610c8f141b19d784b5d3d02c07a84f26fba5c6fedc5549637029304930cda40123abe3a1b43a3960e968f3d1b29fdab382faa3a6a725f906f21894dff3f0fb6324ce660d3cc231eb90fa6eec144a1376ab4c68b7051ab193c30e81e6c8055c10efd1ef5eaf56158882bf4f1316c631505abc3922650cfdd8e97792ad5fa798a201b080ecf782e7ad4c420a3a804989040cf3141a010ad239817d95e0764245c30d0e1f13ba0b34027afa2a86b330fa23ade87a7144471137b9f5810761741c578d1efc4cc9c8e37cae1a7251ba0c1db9c04aaf8d0130df66d1d6af0fd238118c42929fd9548f86635c55f50cef4e68a1116c3725b0c7e5892de24fe0bc13d966226bd2521e3f9605dd89c6a6dfef9db5b0b0d23a2cdf9d8d13754a2c351ecc98da35971fbad55da39c14a8cb122ec81848759974ef032fbac9c0fa4fa91d19aa33ead9757b37b0d528a98e8135ae24b2ebe72898926ec7a1a2d7e23bc0f91cf5a73e274f9f961a9695da745ca6194d07ac746ffd778938fe9ebf2454e220b95ffc0b2c73bbbf075335f55241688ea2de18ab25364525874dcf4e11e76ebd112299333a855db2d8db32d6393407e4a4afac4afb543a48463b7bccd9545683c9994a1c7cab8ff97e728e4f53c1fa8a6c69f6b952f0fa370dee99af99950d1fa658987b1cca81b503c2c0f6c0fb748562f1c7ea507dd6a8cb07bdd1d3c558d07c545c1763546ccca1a613468c628aa84a037c449c286b67fe6366fc1d587250e740250d42210f19622c795c07c3c3505630c04bbca85d0308af6a1f65cd9e7daed8ead7f0201ba2cef86f934b17987ef5c77a1ca580586ab075d17139d44df8a0a9e316664ae9ab29a5ef0af65a9fe1514c25495ce298317057871042e9d0f9f4c472fb241eb73064f2eaa8315e127d8883f40a8e327f08fa44bebd3711c1830009588beb43b0a5c9cfb1a863c7f0c3efd2dc354a55f3c977e995ab240b1d3d84bf847f1152e464cc8abce92bb7a8986adb9c9d513564068598ee562c3567b64b2e16e5effcbc6575d2470bd6a860975e88d466162f99475ab0e87fb87f0185526bcc3a70d2439fb2db88dae9fabdba418a8b0a8f96df0c317a06043a59a4ae7566591f05599dd21c0ee65c65303387ae0998aea6e56b28b9bd838ec1c275840a3bb8cea881c6f45afa076481b5dbdf472b23bd2c731d63a84d4df527c5fe96daee5e200139fb4f86e0ff6796a16564f1c30bd39fa5038574d8124e134bc7b1201cb90cedfaf8daad2a8e07a12a1fd0bd7cf80ca9ac4e06c970ceb3ddbd90e0a2c6e604d3af68e2b80f9f79fabd3779565d579b414f7e948babb6af4ba03fac2996b17611955223b6f761bf27fee8c04975316b32734a24499b6946597e8afe65a0f533187fb0c1afd32c3d55fb63d7fddbd5f4e84fb04013e9767c4d91c0d5c3cbb716d96187af9393d8515ab928664d24a9feac8dfd909f3910cb6eef324d1f693e5ddf850921b013d769de085dd0cbe63c7be8ab9089dd16c65c8a765f8bc0d011c7d3535600b496ef3f18a2acebd8a42db3f202271c1577f9b424ecea13ffa5b0e197ce81ce8d410242b0aa9f57f8efb6682324dadf1fa0b38efea7f2f413d52d203b358581de16fa60b834c1e77fefd8acd18b424d65255685a2ffb46d608f09580b3e173bf92509e68ee637b9d0055f31a96ce990fd6d452cf1f2e369ac18c0f5086816b7d7800d50ad81dbbc4f399f963ce5a5c6626a92850985aaf1e9b3b2800404c43d175f4994c6fe68e5b08a80903582681dcc14d60f0d295c6bcd3cac279a4ed7760f814eef0a61269c12d44c79fc1f25789c4af803f63dbed4cde0947638e26049ad7a73b76a31ea70670a5d63bb752a6ac2b54023cc9db2855997de1b615dc43702d1cf5286c621d9e3e3fffa53bc634f6b66065f8c845b074e1cb73cfb82ddbddb66ee2c0b67884dc5d79cf624aa7539a522980c6509d40b9f67b296f081d977e93e280cd404d4ea993a473476a2a9b4502e9ade4c5c02692a66635f2dc69ea313cc44d8dd05e9954fc6fa65540c2f071ac38d9ba97216cfc6b766dd77e2a28ff470964d1378d912908f8d4f7482a5b490cb33411a32f9ec1a73e334bd8c9766261ba7dc3a6f57db1696d58fe5b75dc1cef41633947cf244e65f89ea9ef16d6ba6a72deab4bf97ecbb81cea59b7e6de1d8b4da0f3f8abcccfcbbcee95ec6d79d4f8a8e42d24ee353249c33e9c2b9fa762a3522fd59aa412d9eea3e0df7a0a3577340c0a5ceec9ca8da3b44c29fd7d93295c2b578e5525830a022a680d15d6c1ed55dcca123ce41dd83cbe2cbaed0ecc46fdf24c02c58de38c0b4a57b3211dd1e48c924655439c40e0331c839c8ef27e7d08cfa2cad2bbeb9db61af8b6658e88f5d1f6f58592dc31174f8572a33d5e1cade308242a5ac433c78b0454c0aaa8e19f827d08cd084947525eeac350acc14dd69078b4046c80450628e0b501fa8a706224998111dfc81b036ba4cb526802edeadd42a34d01112fcdfc72dc6a48a3a94ba4e21a92d5ce0587575cefd0da6a7e250bb150a3c0ba817a3180422419ce90cb45a93ac6af088571659360ab4e00470e0c13d22dedca9922b2adad1fb23b37256dc7380956e660e684db349ddf5185fb4cae85080066a8b751e38ccf7b266e68f481d769c40c5a6ec0bfc6631200714083e6c446a7254881b2e52b8b3bf8e360ebbcf0d3b33e3515873b7e2f39fbb2715bd61fc914bba78dac98b3b2c3bb82df3fbad32586015c4eb8c61bdda32e580cb3cab333c868c663fac96c989dc7c11745f12176f4ec3323c2c2565023e51fc4b855f28dfc1306a012c8091623c8d9b7437e93206933c5d7701e5b604302bcef8acb36283441be12c3bf3e68a93290971389932cd31c33c2ff1cf53184a825793ad530665f5faa89a902853c4bbc911a7911312433e818aed0b8f24acdd67c643ecf69ee1efdf4db882530175467bd716b3b56b88a6de5cdb42a31487832590f83bcae0cf1ec42ad575ff7702deb043acb5874b40463797b00b81403a82fdc7380f7054d7bdb14f88fc290701821e4109415f57f3cfb70978e82de0d1f65461dcdf6aaea0a7e666d9cb29968d7e2f639c0e6de306de30520d2ae5ee51fdeaf0e83ba57b14bea7097a8dd88ac99f9408da218be48b3a423552e627d094f7f8d373717c8263cf90d3dba38eaa004a5091b56b99cc591b3327c4a2a73a834df0390435f489dabc79d71f3f442a0f859d4eb7f1bf3b37b57f69bd445f6e27d43a05ba57e1c98374aef974a96d6c53e80e792fec1aeba0646476d4afe35246111b7ca44efa158d05d795ef4c0e3edf6eaa5710ca7433ed657b9b53dae3a683eabeafd81b9f5a5d534dd731ab2b5132663c026585796b1a78071f6de1c1cf1e352b33aee6febb85f6a05d7a2316681d743d8eb13e669aaa93fb54ef600efc39d40333c28e848e9b76671bdbf99c8574648dd1fa92f536290f8cd2ef4b6e103d8547a58ba318b9884c2bd7cb43b51517d3e33c2b54f261e1798edd782a504a4442fa63506fce30f55426ab182f85a3ad23e0287389201dcddda9fe4a1e594dae4d10cf9d977ee3ec0e0bbf4d34634296ec2eeb4c259ca2e4d90b8a0f5d6a81dda51c2c860b20f4dbd1b93801f8a569768415bc9d56a873625047b88a2771d4fd6b79506dd5eae8059ba76e667e1eb378fd54c8c9a84c0e87526a00551f67c7632c2d8fab2cdba00f603a25a78a131909e4b392cdbc28880682baca59fecbcef26fadb6f875191ac0002b01fc3535a191f40f9d4c9e937129d1bed4c79fba61cedd63521f1d51d65770c64e3cbb2e417d39d3428cb7a85f3529c812b95599349acefc8be092049ef979d144a5de3b343361943b490f2c3a6eac5cf9becd24d29d27738211f4e25d468d67ad9ab2d4fa3f47c53d34d76fc34309f3dc46f3ce9b99db3620820753d63ce242c492f9667f708fb9f95341973e4f919b574aed251a419d52390d5e2b0b897da6553971f7c685b15e8c82ec3c2be04bef9599e159061f7b41666900ded076bf2a6c06f89caa5c00421810aa1382480644e58210818928b9108e34106a170cedbbdd7452406dc6d42e90e284c0d4ed7f9ede9977acf63dbc9580217a2930b466b46fb208c510da258584d48a33401d5169ea12b23f81801933248f3390eb3dbd9e5a8cdaef09d0505a1b4c5a4f2a8f69676a10a99a19d54190d936123f4ca2d7fd47605a49dc0031094046c12ab5bf21b05692dbe0c4bea21adfdb4f86ffbf2712ac7e31764ff72a143cf9c6b9e85ea7d4a8ae67fc198b9fe14c61e4055d1e789f4ba91de266512339867ae34ca208813bf3e5295cd06d94fefbf64c6b44f8f5062bae4b5b7d0aa68bcb970e9ba771948cee2d8f6fbb7342861d6468cbaafedd852789dc5818f62513bbe387541d66c8a6f9c9ccf0d9b154b1f1e198586107703b9e393ebf026f192e5741fb6b07f5384f4805eac0fcfed78202fa24b55b591fc5688c719561af61786ad7c871742c0a8e1d92c9914e4443472b6b982c538d6665703e29500fd24feb55699f6d1393f2dcbb849f25f9bb036795100ccabffda8174751450489803c72b2ff9e8b60ba2eeca7372f7179984f5b00bb85dc855fe2489bff1a52951c86db9d94e1ce40e18451bec3a89bd3fbe524b0362f9b6bf48fbfe0867cb7ed08f06e25987ff7a72521a529db8e091a7251c1ab906c794ca8b6cb978ec59bec5878ec993dd256195bc174bb9a9e9691fa35e45d65867f981f98eed608e963fc045d6995b26b3ca44ead8a1a0ae8183e3e54999954e318f3d085167d7174324695470061c7aa44f6d6f0d84b4580d89734ca022d80969b39929c865d48b570c120b09cc21e5cef8b5fef6dac164f9dd700152176fa7800cdc8f0e1ad6b6f54cec088ad4dda264498044a19d3f700b0375c4c23b4efc5199c2fa3b6f19f9ea96b2292d42b0c3853082a1d15d86d750d99721155a0815ff3ffbc6bb0fac671cf6730b43d0341593ed4809c9a76debfceed04dc44c4967dd01fe1f3517d750986ee7ac8a2c285a2496ef0854100eb0f6ed90920a4bb59951d11f8004a2ca57ea1884dc3041823a797cf6d6be23f4f29b6ff7bedb1405e50bd3380c515a09f3a26ccdb1b33428db7057f68b39b1b218b0c7fa68fe0e5413ec810b23b7ce0fce1254141b3bfb9907c18eb9fe139b519da9ecfa5acc6e63c332e09b68edba7da51ab5b9a3bc237fd00f36ebf56a4c690c7f082b0ea37e038d75d221f275f7345a09cc37e8847e324b8df8e8318a045f879795a303cee2683a17c702076faf1b530441d700bdf47dd8aa002fcd9e1945109ca3fbbe9296d677a76a891e32b8b9e764860744de9321cf6394c6bef3bef7d5040703fdfb89f12c3715311240f388e0d3966c67ad626b67ddbdd810da3b2be2ae859e623958f2049f298a86983ad678964bf81d7350cd3be494cc5d1bf8248d399b3df61d68666ce2503cdc83ee0e4ca07fce9db6ac4cf8d54121809af5aac087272893c38be4bf143df8be559ec75a9c85378787d9667913892a092db472705a6291d9e82ed2fa83a5c803e8c62ea2c968d9dec7150b5c6ff1112c9c80a0187d8891b655ef0a112604b4a59b9b954cb6a09f23238c8e3860dfae49dd06268c40102b469a7b3c6a03187d5e03bd3474228e6082c53ca6883f14861a8eb38b138ab50f44379e92148069138679a7e3008bbfe4425ff4c2b3f68a3762090e8da7cd04103ebb5e1c1015f8520348b96fe049bec7db26b810886c62157f9f879427e056f7c0d6f79eb490666cf85eb8739cd03c8862dbab04221c2a4a52a0a03ebe4f9ace6bc828aa00d8342e476cbc9ea3a382a2bdbb577e63f3a8fa2a39d923da13a7f8998d75cbc65e72a80cbca5ab669c357006e0abfb38855581d9b28646c6516955af7a8d8e755d95cc343049276243fa7174b40f8ae815979ed5196da2df07085a433552df3beff96fcb87b19c5d7fadccec3460e7b09858448da2e219ca115a7f220fe6cf4564d42fc4346592c5ba43d3ce421777464db6d98f274bef434e34b2a2b83c4fa91740cc4ca09c4666f021c2d62f3a7abf426e524f25e3ece5a3ebf7b67b1bddbec5e5820828b8f5cf08319fad858d735c971677fe9b9368b0c3d2cfdef798959751f93eeca0cddb0b4685abe0dc248b9191cb68ce75cd144705ac495bb48b5bf860c1499c8312d7dca61443026dc9be7ac4143d034468b9552a19b27f23c070dfc84df4d760ab4cbd554812b38068ad5e8949fe2905f72c5206a3c425cab26e6ee92b61c1eb61ded9a986743b149b7a3b96cb4fdd73436d218409bc25370f5d499cd5123bfb6cd5c1d44cfa7236f1a1eb65b64aa041a0f2ce244adb6fa30ff03575182419a62a6eab902f39d4cb0439ffa4cce3b13071d94f45c40512805153666fec241296fa56e10b4dd3e5022ffda5110c40830c061a15d84bf14ba7e4a37bc3a22adbcbe4ee39cd7bf6fec0d2837f72fa2033c0df67ad998b3d2d80bb12988c15353ae3937f6d34785018f330bf8122c30944d4572afc52dcdefa95f782d662c9ab28b5162ae3dc34fe7f5c12c2ffc629b5696178ca3d1acfd4eddb3cc08d442766d7ce47657a61d9fa92bb7a2982fecd3112319ee2c13d56221179e6db970edfc9c41182b0dcc9b07f6a66cb65c3ac1fb4edb0c687d293905b25f57ad582d04aee85f8cda74fddcd7851a653a6bc0f1691a3d84c7798a765b3ca8020511b264245774e5689bb457b1fb6fd230f7ef3052da5aca926eb7296b89b628c16f264a61cdadd8df594a11e627f7d055891ade82775dbf05916d771f1c04c08f8c0a3b98b5a6ff546b2b1082b1098b75022453bf0a809bee2b72eb9a273b4efcec666c1f62f2700161bcaaa1b4970ea522b4c902bf430af1d523dd287f70937fc98a59f7336ded7082d8cf846159a09b82b702708b20f1edbcfed5130f100114e802da4bde7d5f309619550755b506133e56d145dbff1d9e8e63b9aa56a2d825b85f14aaee047e579b09e22b211a905c652eaac90768be1242406170e0597bed57632616df813848d481191cb4f8018a8a6ea10d6dc514a8f407ab0dd3ffffb7bfdc524a290396077907e90741f8dc0fcb0509ee211037169df3e8865355ef46389c2ae636159c923aa0600f473658185d53d745a2beff354329becd976c780bbf7e1860e8c05ee42dfc350f030c1df1f730db5af86d46b76c6b61b3e523fef92a887f3efed3744107d305fd30d8bb50f356477c183a1cc64bcc475277da79f153e3ebf59d9aa0bcf76618221f88c82151df4ca4da600e1a3ae886aeea1e7de36f518014702a9a78084367b754a8a931f19a8b60dba83304db2c1779cef982e4c0e7d6914444bffccb4550a8bf27fce4cee6213948ddd8f7e76d73107cee9595c79bd4a12075282cb6a170798bb34b0eba3ce61a87cffd78cdc3150fb3ada58278cb78b84d3c8fb21e8d62867ab79c8327c8c36c3b7fc37e9bbf4dbbd7d2d2f237444a7517e99b7ffed2c9ad8ec9c7878d437ceedf3dd5efb254e114bf72e64bb9083ef7af08514e348940b91da487cf3d1ac71c4992482693e9743aede81cca94e257be7c69c5c4fad265b12c335f2a7df8dc417c43ca326817c4cbc1c212b40be2e548f152a71d1dc4eb01a303d2e5c8ed211e7aaad288aff0e78e4dd503ad2fdd207c066153e728a128b9ac4c296a50ae7e75e289d2e3b433d23d865e4c297e3b7cee1cbb20189987496144a9d58a89919139ede81c3e37c6f85b640c844f1d3e778a5f19f3333c2be372b9626262625a2e97cb0585cae572b5b8522c2e97cbe512577cee3f794b85f3451560afb5e982fe1af33ca950f3a2e982f835e6b92b59f088c478481078afce7ed20893391268933b9297632f485d8eed4f31a3d4b91cdbafb9d6e57b73c72607acce38c4298c7e4f3ce330dbc6608eed1f47f1c473f63188cffd267e76165e69939031a4ab63b0ef1f873855c95c0ea7eaed95743855c72199b32c6edfa615a7a3d2efa0eb559d63d25552f75bc9ddc16cbb4c700cff76b2ff0ef5917983f8cca6994dfcec1b88536e16d948b6128b59c66f91c8229b345a5fd0500fa762109f0fa7a621bbbe9fdc5a673f891c778b87ec37f5b6dbd059729c82348f946bc19fab2eaeeaaeeee16532c3d55386abfad7592dae9a60380bfa85abd6c7e2eacd8aab6577e12ce88e82ab3847dfafe24316f4fe1457f1daf7975ccd41facef5bddb9f819685dddd9e8e9a8be4dc9a83e421ebfb05754ea69a6fc3be5fc5bbdecebd5d7a35ffa044bdc14efa76c2042b41d2f7c645fa7e1b6e75accd21751767bf9a81f46d919c7a48a6b726933cf18cfb3eb97f9327680057019ffb3749d7d470b1b581db356067fb4902449d3dccb1fd3fe5eb693e057cee57f7b0ef9f0006346059d88ee6d87e91afc8b14dea462352876d2f3b72d783ec914394a86411ecc3adab26d2570403227495b58b7a88d2553248df9bfcf54d12f5fda38b3591f6ed80704aa241d275d5b47550df7bef7f711a8eae6011c9e00338617a9c5f3772adc76badf3db198b2b7eeea2288a29acb0b1c2d4b3b95b20ee71b44751ebbdf7ce1aff637188d4c791be776f4dde9c737e61a3406771b4c591de5bcce2636d3e2ef5fc83d4472cf0e0becd96d6e6d9ef35b37efc628df13cc97e81fc506167f8555816d60783d2c59a3492780c3e71ce7af45fea9ae7143f4eea247ec2bd79858a51cb80ed4ccc64bfa67bedcd2751f4c1eb8638638fe368dca3f11ed1f113017fb9bcbfebcb313d5e9f1ec75168ecddeb1b47bb777d35aeeffa7c41e41149fe881cc9d148fae0edaeeffa763c5224c52d6e912449211205fe093685064020856c9b800638602247f149e4cf1875483f017c711cb0e9ad614f53c85e1f9686ff03d976733b7ca677873df390c4430fbd861f091f3cc88dae4f8fae6ff3f44eebbdd37aefb4de24d25f1fd6461222897aa4b7b83b891cef09f606474b68adadb54aec010c60009685cd387426ad25fd00dd9b872fcb92a87359b2beb433fca56561536073ce595b6badcd2fb817c98f7b91e49e512ad55fdf89c9a802928868458eb6096804224e14c91016c908169974f03b828c182c91e1e3860c169c40860de30f64c8f082949657c9044b9018a714297aa1a7436986a217748c3714bd40832948d10b37a630411a41510c1d1c1122c6cfb42b8a010497317a9c54a82331763b62e02097c49031baa05c393109c103538ea25b91314ad1cd6782a21b0cc61b45375ed10d05b71aa38cb265982b5f7860c2a11c9120e5285543e0ca530f48aaf0c841151cc0231c817784273a17a0a7450aa525ca262fd85abf60873682fa804143108c704150888f89255286a82c5922461146c0a1061c90a3518cbac28ab254b1724c2c21a507eb8d1e8aa043c20f186ae0831f0f9cd001890697152d549ce06404fa0843fa4ab7488e804447a25a6badb5d65a3b8ef416c5adadb5d65a3b626b49b5eca3ede64cb239d350a381acf16a3b46ad47d6e67b2f0bbeefed5a6badb556a95a56e49cb5d65a6badf50aaddf6569d0368b5a14c51f4a6baa020464edc708015bab6fafd920bebde218d462a2bbf673ce762c41b5d65a7b6fac4c24610bc9c5464272e7280446022281a0c1a666829ad2cb5afc83c97a5e1679ce2bd82503cb33996949c9a854002182401422b2605e5a258069596b6d8ce9e6071c08e5ede5989016153348b96658de55be2e574c6e1a73a5899bc1894605105b0510a368b25746820a20540061adb5566bad6f4c2d26351c792c419c611c10882a848825a0d66459aca512d698e75e5aa99d40146d5ec940d43c3bc3352076a8d778d89a0e1bd4853e9448d2f18b3723df55748d6971749863f86168389a0d3ba3ddb0389846f6a065070525ba923bb615a5b58e16cd5cec239e4295305c47b93924938b33c42929c4e7149b924cd8138f74944eae39086b23f9b0245e8efd704aeae153246253d20f38a957cf176f2ac98752826d308f9f0cde1c14928b03c4e9d52476e16e28557445d76c6bad39866578cd85d798f05a1005af0199dc9c9a12168764420929c4692d496d09ee2a5e6be13572cdb69a0e1fba8ebf36838dfd50b341eae1b446a346846344c79f32d55348c78f32d507d2f18f8e6b3c3afed25c73fd9aab0f5df189dfc4d128486e0e3a042976865f452159316b31b8d5c4d9194a18c35d3670ecca985214295f56f84ccf331c4571940aed9663f865380d9763f85d4e3c38fd64a2431e250c6ff152c67c13b7bd2514f325981812afb1819960b8bedd743287698d60ce910bc1fc08c61cdf55febbb44be7cab96ccc9831d857d4a4ce7cd44b2e2e33c399e1ccb0b5ded6fa2850a84e3badb5b5eed6ba5b5a52a9144be9b271da71e1765005f0952aba76fcaa0bd7f1d36e385551c28ed72843940a4ed515f250175142515b984dcd8bc6e4ef4a475b4ce9bcc2d7a624182c1c8125300ca0ea6e5730f57bafd982eef8b3131d9b2de88eafc52b28595511765075df2cacc222bfe39bba368dac389a2b986e9782a1100147c139e76ca1f4dd44df5cb54ef43d3e36d557c55747a3be45ae5fdd7a645a7c8a3cf71679e46a0b7a34beba9f7cccd592247f247be99af0066edf8055617471e39bcbace2ce55d145ae52a54a15d3e66aee38ab621f8d972506d6de7befcd373741c2667b73be37abf8de7b6fbeb90912fa766fbff7b316b1680377735ddfb77603b7db1dbdafe641a9330948d57559d2399bba2d02ba21abb2691e29d5b11701edb0a9a8f24e5cc205d358b50d58b70032fc32f93db048d334e2d6b13c015d411a31b2798f18e3d168641a5234c4ae8ce916499150118a8054544a50b4ebc150d10c548a4a4044110e1c45b95d17b3ae9140073d673d5e7d13c70c4412346ca0f9eed38eb63950d93afe11d87111095e30021d3b987584adabb6880c417d9461d8f397ac12f4fc5f6349cf7fdae8a1e74761e8f95714f5fc2d72d10d20744b6424c84a938e71ce413de79c75919411747802c4c4113858810492e880c41225f85902879c71e819892384e839e79cb36b6787623a2e058546f69ea08a69898fbfd55ba2c98272ff4fcd4ff0e1cf92859dc0341b4a17440054e1f2744adf02a33094ad119fe28db16495fd1445d28881b0f82f1ce57502db95767501eb981e974c3c810b700ce053fc1c60298aa20d51358412975e7cbc13f1bdf7e21ff793b6b90277e192b1caa093a429747a17b0ed541abdf8277e83e09838127bd787ef638c4da5ff123fbf89f2bbe9080b889ce8f8b1b1031df1312f273ed6897f7b1878d100adf5092b8d9cb6440dd0df32c0be7163d7a2b5f7cd191245512cc229e9a228de229c139ceba2c84317515dc5bd2efabaf8ebe2ef8baf4ffc74dfd8759194822e9ac47bef3d80b982a648899f85883da4b5c63e9c62dbcc7abbdd789687bca3012957140393a21882a034c61803b1677eac7739962d131dfb242eee722c3fde659bbd79c8101d8457308943722847afc698621071885ac608a154f10eef708a91f4ace21d0b9b177532b3290e65b197455fb6699dfce24f24c2a92d9a51a4e71791e094258f3a7fc63d70c63ae72c8af7fee8decf37e79b6fbe3abf06c0e83ee9de7cf3cd343aca8c803d549282dfbed4bdeb37be521d773876ffe6324daeccaf8eb7aeea9d285e20e2eec6c55eb6f5c4cb3bc55db6f18053ad020000ba976dac152b50f47c1a1da53aeefab57b7744082639d84defa8e048412a2d60924b51e95109f66bb69069256b81d2265922487fe936c912bb5e5a29c1891cd2ad04a2f29a422d15565cd01f8217f26bb3b500513475688d3adabca71739db1cc35fe267e11856be554ad1100a961419f52a4506434537e8018fb10886a03ce424081e50665065870e05589002187ec1a128b95b0f3bfafd0b10c50f81fdf3ffc2d0b97f7fa3d7afc2e84d1774c0a60ae26fd305fda2d9c22e883f1a3d0c9dd1bef7da95a782e84f80d5d1e602569cf021d1d1c06c58fe1d592ccd5db817b7c0348a6000eab608869f4eebb6e8e7482fade82fed9cd1df91c9420b651f3d2963b37461f4fdfa84824b9f809de97f8da0bcb7bca6ba7ffcfc253ba248df029b48a60a8385dbd512c6d0d8b7d66f4fd9b210ffb60c80f3a7f92fbee9c05e1adaaeac749c813b8e305876bff5d5e0165a17b4dbbabe81d40dd4f7ef827664104eb199c59cc80a7e8924c93106048f4593e31e8e6ea4186e609cf5ba93ad1ef6bd33bee6ad05d084403fcd5b1d91b716f00a81f8afb73a3230c699cce4ef3dfc294737dc22efe1bd377d3f09c4daf67054039065a4348214d2776d842d0bd2360e4d3dfafe910ab68de3143b9291f78f70a0564824b585693fa52edb72d0c6f68f37efc81c3948de3c51da285f2d2f69aa2dcceaf8969f345918b5aec943f6d2977d8515dd49df3fee3d64d2f7a340a3cc397641260ab6e32779c029e95bf86dbf3f7ad2370405dbb34a22e97b8f5e2595f4fd25cec2e8af98bb5cd47131306b040844a3a02b2accb1608e11d9197e1bfef3cf5f7316f68b5faae13229b22a326c159d9f194fc27c0bacfef2a59755b12c5847b02c5c8c6059ac64532c0b55112c8bd41396458b6591a5581644b02cc82158162dcb82f4f86550644e5816308f5ff6c4b2285916a3ffb179f56686006c1ebfc975b85fba341e8d879db520075a0f3bd381d35c40f38183ec6c0576c6029a909dd17676a6c3ce5460673bec0c739a0f3bc3a8ceeb5db8106e85ceeb51a8ccdcc23bd00156d7a6d0cbb4a1f140eba1e3a70de11afe16b886d35e9ce6c3c6f0d36c1d7b4261f7cb399ac4d6f03f477580f2a0e3f72182e48753d4883df1a33a6c0c3f8ff14709849585fc4f975be1e80dc7e7480e1f229ca236d8b3270714a8f3708ace60cf23701d671b1ac3c664e0f8dc708af3843d31aeb750f6fd28aaa37421cc361a09ac3df513118e7676dfc55bc02c8e5ad3efcf58dae945c3e5980fcbe2e51d49ab81466b4089443aa0f48012893c4f98288e62c98a798d231106b339edbcf811fdf68b5f8f2fdbca9a9ad7eb45e3a3c407d8e31352aab2d508b0e3bfb9e154b5457c32994cb6a2c7f70a30c02a05171456d8d29a8a1426d02630da228dce317c2d8a2a5a61f0dd810f439a08312f30a6526b05a56ae1dd4e2ce55b916824c71189b52249494c1710499a22a4f7a3078fb5096f6704c7b2c6c4bcc8539d9da53d525eba4b73e0d3062ebda5b9fc13d3bac1867106aa23f3ad9446fa93c6a8d19b9169c598b41b51c72f442b8be442ac4f8dac47b5fe547206cf25e4298c09c576b1a1d80ef6c42acea96fac47bbd160b02962a0c5b035fca5975dcba4dd569953c9b9e40c924aca5318138aed101b5a11a28424e1293c85c2588fb542d1086998a0595f3e5ebc57eff5038ad1985f3e1a26688434ebcbc78bf7fae1d54341b38e68d69166cd342bcd4ab3be7cb8216ab55aad56ab950b8ad1b85aad56abd56ae5b242b11aadc6d56ab5c20d57a397478dacd2a35ca864d4daaad21aba6e2e1938e7b3caf287764b71e94f7ab3b33495d1f167df106a6d5571c948a15612b59a50eb0a6a45ada855c60f3e6937146ae8fa71dd5c3719550a97aa614ffca95cea88d42f054c258162c42a53418d8a825a5d37d7ad36ac410587d3da13f6acf978b96cab0939a2f7cbb6da8f247a00715ae3911be5c65ccea57246a472652ad86f3816d4ba0ed75e4e869dc518e2ed72e872367e68b79cb9c3296e981baa482e24f3a34cce752b7132a416ceb20e57df0c16a7379463bc1c0b2a71da8ea65be134a09c9dd170b41f1c1dbfeb7673683168325c37da6d4ddd862b8be44230666d488412e6c46b3f3beb8d3046f880fcb0270f7df8a48912498ce8683718d6aa346b432469a5321c92a411e6e5591c1544bdfc6ae56485921afa30e41bc2b45242e94bfa31c1b6d5e3470557dc05e4cad16eb96c6b0d872f2a21e9e4e6d49e90509c902b4e6b4da038a9ed4a7248f28134441a82e43391c31572480e51e450934372a823fd4e666dc8ce6072b45b6e055a4f7ca6e7160ca7e568ba71553269b8154bc67c1a57aec6c6b4628d2bd8cae59a19ae31976b669d9939edb872381d908cc9c37a3323916309241cd2685af1f176bbf5a0c322b9d0eac715b0abae1c8d767b60b6994094815da5dd821dd3567ccc31d7cd7573dd86c375d81aeee1bab200b972a89576cbe556da8df643c3d16cace3688b432830036ca4a38e32c59e7a884fec8a797bcab699b72f0689ba54f92e28debea843dc21fab889b727764f744d6eda880dc2feba7d2dc4dac45e8e89448274fb1a884dc595b7aa96dcf9a3c3387a58b75f6373c8200cc944a25a8b2e1ba3d30e39324dd1fde0e9c86143308911237222abc310836a9326715c5931b95a7a8a0bb95ee429ceced21ca92ecda536f089a90c579799deb2d08feb678c3a33698d8e3fa56171308bff0c54e77fe689284fa674bcb333cc7fc675a45467be8e732fc76ef6d58c942ca93e72a1d6a7ca19fe3343f333501df3f959e4243a8fa44e60ac86582eb68bed1859c8186f16e40afb8a0ec1a6c06f72548aa5e1e71c7d626b437ce6724cd49931d1d5d29294aa0b8712fe59e43c7212a5ce22273056432c17db11db8d2790e5049627f004024f608c370b7273d021489905c93cd6e6b1b0b0a4522d99b3d0046996d0085f42afdd6be8b5c3ab77fe6896d00469842fa1d7eeb5c36b8846f8ea9dbff3974aa55a5a54abd56ab55aad5e58abd268d55aad56abd56af5b262ad56abd26ab55ab55a2c1ca5a24d3b11e655a71df155a5959ee242325f8e5afce747073daa52a50acb9f5c5697282e5250c29694d63a339c99c22a4b178e4a8946b1e88acfa2b2368cb20a5dd69b537be222c5894b149cd69a40e92e6bc7433b94b02565664a46095328e18812a25042941025643971f489c5a15252e99a0049d6ad52953354668633c38e5129cec21ddfe535efc0d8c5d42d95c2a58a48f95244a923ac5569945329a08b938b8381282728e1cc70665813ca70d26f38ad35b127ae0de952b86cabfd4815c14bf9b2ada6237524478a08a7351b821d3fcb5471ba9ac2ad52b8520a97c20949e180a470ac14b0afe8f0f6e3e2e4e6d06088a1bb38e9f8af6a03bb4ae3a150ececc94e97b381bb89e575e14c1d4ef1adf35cb814454a97d38ecbbb9c50d07da3a73e72a1ffd1cf0c2fcebde19e8516caae9f6c6111da596b1512759536448b6171f0bb388db7cb311d0d889663e1b41fda0da5820ed128f8c4afb98c8e7f667873d027506686db44573b4ba254514296214ef5671d4ae8829a7a8a0bc9983a4a14221fbc1f22d14a8c6eb5c26b3d3b0b36c75e4825d20b4ce9772e0774cabc047d4722442e884c4456cad40f858d0cad47638226a441a1adb42ab4a1093813c69409b91e5fcf10f6c4efa304e7286f2f45eba12db41e4aebd17a2d5a8fc6044d4883425b69556843136a98803301a6a6ffd8bc6e6e90b221d8142f530466db4d6f38b4f280fd66e7a2632343295b592c53e634c3f2cf9a9797d34ec99439ef262ee4fa112a3cbde642b853c7e5831f2801e42949c283e881fcd0e16e413a72d890a361633f3d863df18f5d95ad2b8b8b9724890bd9b810f6dcd0a3ebd9d1b3ebf1d1c3ebe9f58c6359b25efc7a6eb0e98b293d3a9cbe18f6ecb0a94fcf0ea73e3d3eaccd27861e5eb6f9dc7a7a38f521eaf9c1a63e47580f137f63945a817e67fa8b1facc9b37676f662ca8ba14f0c36628e1c3e3b19d52ac50f46e661a61a92d8f31ff3fc19a80eec1f8683d580e56043c07c3022b01f0c0918112c085b624ffce34882097fc0e84ed86f2e1be23367d27670085683090c87535409582edbd01f40580e9683e56039580e071ba207cc875394078c4810ec875354070c091d8c28dbd019604b6cc08238456994b05b6e16cdf7d015bd588c04125a64327367ee3079661226d05c6206cd264ca13934a7a058d1dc52af3277983b9367f2b2c95b996a89c2e499499840738919349b3085e614734873ebf855a9964c020932d96987f4a93bfa16f88688b0d402cbf4647e90f1c940915965a6c80c676298b9cde4665e2d5b33ba711ccb92c5fa3fc76e53c7e08b22aa47f1f8c58fe8472ac9fc20d39369c9f85a647c323e17532d7f65caf864a0c8ac325364863331ccdc6670cce450a8ae10b7316b7e06aaf37a9b7ff1fb09194a416d11618ba9a24a7c1216caac79bd445376da29bdd667bf79fdcd6907e66f325f81f91f1d6e8b0b27241e17427ce28088b0f4c4d0ce8c50a5ab4c15f6495846ca5d10203cfce0e9b8c9a0c89e581cfc2459147cbedcb2efd15443525ead2db086ad714e3ba57b493e9dbe301b1611661d61015f6abce05e70bce45e7078d1bdf05e72b0277e60097c19f20919003af264365cf6c4d6f0732e1b3e0e9f36f099d3c9bc8c7c94609fe02dad3ed691282c229ca24f58c06c438508595594600193b08040606f48f75223c80b0ea72890171c3cbce4708afe78c181f7a2cb3654c74b0e395e7838456df897a10e83c55965c3db0f0e260674c7f2e9edcbb6178eddbff1cd4c352426ac25a8c2a1caa96e50e95442aa9d6a48358eaade6ff8a4e31f7fec3743302e7bc2d678bb1cd3e5d80dd04dee06c787a7cc4fdd4656a563d9132b8bb245539683b2c588156df22d534595e818c654d124654b5085439553dda0d2a984543bd5906a0755afe3df630b510b51b6b170ec6a1cfb162255592ac1d4495ce85fcf4075d026b6f60368c408213d7804e9d01db9bc177f1fde698457b211762cde6c5c5d95ad29404de869a7b4237e69934a2f9a40d6f0165f8e61141095042ab8826325b772c38a6e456865b732b4b2438bcc2d2bbd9621d8f67afc2dbe17f751825f1ee655e303cc51aab2f5ee9a172a89165430a382242ad8420551c1151c2bb9951b56742b422bbb951d5686567a1dff0b8cd0f7f87c94e018be349bcd44ca81c423ed401a220541ea917e2422431291cdbbd026b626b4b3e741e8f86d78133d6867437686324195b0277ef4070a84a12d9484c2f0727686ebd1718af220ed805354873d83407bd98612b1d1511af6c48f93ad443229b221581cd92a8b525a612af90c890bc9fc73d92aa382cf9bdb0d2ec7b08c291be29357ea57656b0a234a8dc24c2fc9a06cd532bc64e5d89756d458acc831954edcf6cc77eb55128029003e407cce74ce3fc7eee8c5d66836dcda14aa4cbfef62898b204e59ec793ff3592f7553e63799cb7a8b5f3bcb9c0422921431e482888b9f0a22921431d4f1bbf8b920c2f3e3318287063c44788af0d480c7063c47f00ce199010f113c45f0f87884f008c13304cf113c45108184081c74fc3c443c47f01451e3f1c1c3e33982e7c7e323c207220a60ca3cd685fc1002c7b3836797e287ce0a81ebf879763c3bbaaedbd04fd06fe8393a0a7a0a3a0e1da89ba0d3d06be8b93e432f41c7d171b8bd062b24c80a6141c7df771d875e838a16555a0c691d87efba979e63b1426218ee9c10e304600b282d56a18e1f275b4d3821c609c08ebfc5da024a8e30a7490e107298c8719213841c21e43491c324c707394be4fc202798a3444e0f7296e43491f3839c283944e8f873d69c26727e9022e7889c5f4e1339c29c600e1239bf8ebfc4632271211a9ad4c8cfce7286b0678e0fa346d818bac2601d6d822a8126417d3d7187211d15f243908e02b1431de561d1a08eff467743c365355c36cc373713bfc1dddce46e48d0f1d34623401f60b6b910e6184e8de86c3e9cbef8e173089bbe20626555642f88d85406c59e3895ad996c915e4e26968b5a294be348976e0f889dc520fd210d626740d8990cd22070ca839dc1a087d4073b4b87463cfd91bec0ce76b0339c06d122492f2cb703ac7e4da174484a44c79ffa44f15be09f192b74b899e2469d9799fa6063f8455447c77f837371d9ca65c31b1360887e290e44bf9dea322d08fb692fbfa443be540800690aa6144e3bf74bb4130a337d250565f926ce9fbf708b4f9895b174855e6fc371a3ceeb37eff161962e9aa59ddd6f814f1614574f18aeaae8f757783966feea2503983237bf3f890bd9d4b83065eeaae12f5e6371463ed3d1130a6447511c1c9c1210f0c294394c8d0f890bd93c6943a3a10aa0d150143dedf8007d823e4a70cc20aea817c00053e62d9dc4857e668c3a346f3e49e3f3f3e9f1e5d80e36f539e243f4834d7b72b0274e7b78f82cc2da5e1cf1e2e7231eb1a9cf3896258bf5019b38a8a4cb7649392a55cd0800001000b3160000200c0a8783a2c1304d723455c30714800d6794505e464c1509645194c4200842c8104300018410608c21c814d110050074664143033c6570ddeb16f845b6f42d7504daefcdd001973e46868db0e0dcf48d7a6fcd40aa38cd91c8ae69d40a701abc228d7b1b520f21f3058a952680e1d83082ecafb51c21facff5fcd5c5f1746f2be09818482e41a59bd4dcfa6d100b364b0efc778c5c1729460df8ef157acb5d75bb340eb66c5174bcf90d133523147897e26eee1ff15a4bd540d5144b899cdd8bc4ad3fe94e2c2cb5b6f3c05282e93e0b0fcd2f0e097f92cabf990a87b6e865a1d9c6fa8ce9ab584a2e9366b4af782c3381f2145e35f27061481c1ca3c17e99bac350785df00b100519083344675904ec414e03529fbfabc833282b6801988c81d29cea527bbaf5511e4bce279ea2b345ce879a50674d1f7fe0e67a89ff1cd326825d6990b5d704fad87c12ddc16dde10e1e3e00049050788925017e46e4a22c707f03b32583e7cba8265b3a459582113d4aed24d41ee8fa5a5fe6e8d1adde4baa33adb923c774d88d67809510da7ae3557d5c73de86c79002917da9a7eccd50ed40e81c2db455e8346af91152609e1c8fdc52f799ecca81afa98b4d2995d915b19fd8496644d284d4e1ebba9be40024632c5c1e704013b60a2f90fd2dd5369b539152a2f189695c3471c77181cca9e6c6a130c53ee14cb3059611d9754c52a4777f1b7a570ad40f95b7a33b3806a24159041d7474081489dbb91c0996b4d97bc6e5fbd6e046621341652b36c40dc24d34d91faf55adcf4979fb63b0d4dca82d257af81fb363d1e9fac71923d19670e4211f76e2830058131d934c3e82c9dd45041b0403d8dae6647a87ee7151114a64a802cd41ca35ce6c37dea600d27ef339d447fb8fe5547101f8eafaa6e118bf91fc32e039b8d094cca92ed060ce133ea530b742aa6b73e8b446cc5986d61d535f2c35be0f241090caffbe21006b081b15fed5bd920c2812ec10ae7f4b2f63d67350f8f86cd444b870e408c2b19f26bb900a8c4d6693977b43809e067e9d2dd03cbc221570036e466bc1fa42c17d82f0b8c0b1f046c8050b6de69e827316ded8a813ed488032dd71003c6c97a83b2e8ac3a6f575777787051e345cd017cded1a31c7d9ac89ab4bc156fa1959d3d7cf9e6b084ab8bef500667f8b23637a03f3e80d81ae0265b63e8803bd4f126c0d77342dae2f35228cba79c5d8d50a290d6b7dc74b81e4dd527c4193dbf3924af1917ce4d11afdf00e6ace0f368289188bf3675a30a10b5ab5c374867e15a5b89ebd934c1db5ab29763de21592b3547c1a0ea95329240dfc50cabddfaf71de60b186911870f288fa1ee3dfa305badef1c6148bd3104fcdbe4c025b832293ca1247f0a776c89b9e3f0323e59715b2b2987782243664bec00a7586e0f3d841200fa860b9c92c646862a5f15dde6d7a7d0bf1a2df20629eb960ac254104b572ac3f9235b2773bb3a6afda24af47fda32d56fb5e6666683bc55b4e07989c0960420afd16f5e8a898364a8d20ced03e2559b429583f96de769fda568f1e921f006df09b665eb9b80e0a391b28e9da8b2950d9c0aa364b36da41c2e85866cbdb8a50e29ee9181778798e113ebbf40772746e2c073dcef1301ea408b5fdfbbf301a617688e0482508ace4375534bff1a5d28b7308f6c5392c1c25469dfb135168a97068e0390c9c1b851c50f9d68cd4abd4635192365a341e6f7fc066ad3eacd2e9dabc6b9d151c70c02e3605567d22b29a313437af454d7cf6ef43725c4fd9e98094c388c91c151404020a9a7b2e7717874e77308ad222381bae6b1b025a6001dd1ef18e8d27619fc21b364574342eaa08caa0cd4609e65d03b9386cef97ec9a176a0c25ecea14c40eb0fb9a697f0bda95b9fe2d1b297bcd7e47f4ad6d2e44785e42bba3bc7195d95ae84c17ae6f9bfd96f05c03007eb7180d7af79592d0f5c5920a437b485da20f922a28d8af8b71ebd1762318e0d07f236f3edceee0b04cfc61da617c6d1a17fc6201873660751fc040dd0ad20e9ed60ab0f1886532eab94171ce50bd876364544e625c9977b8f56d7dad70d4899d7d14f448cf2968faf303bcc9cf95a3ba08d370bb309147845514a12c58e22bb0c7f61e7f1c63b1ea8f92a1dc41f116646a261c47e73069d7a118ec8e7464547e3832e830e1c66ebbfcd3449378762c15f4e6c021d4f4802a929351184a2f9d17be88a74d2e17ed954584c46608a20e0be800fb57c1ec62c411144d1e51ffad41ff1f85ca0b3948f93467886fb4525339fa1f32e02651f20ca37fb97a12f72839404cef00c8f13501bd6bd7d8af31d24ac46cab8a2500418ba5f585d33d4984484d4644334d3cca25f59482e96a1a2bceac73cb0a11d2776040703aebafa7ff9642b5effdf9c07eb6c71e5fe35f0bdb67ca0b673b6be59ebc67e4632433fdd659cd710e989da5261364a70ac0ca46ed8411f8d20a5bfcca934377d0deac295edca6421b9c2082928844079c76086bda5e1e4cfd2df65c9562d50cb42169610553081fa5e07d7b6c4944a3675c5a711fb017c6b60548eb077255161fb0b8923053e59f257f400b05fa2c941322a7e679859ac51d45423024bf647d39234088f42d95031d830f1b767d76f5a6b47efb8a406ba9232da1037df61ca45b40f8bb4be6b00676386081d936d6d26350c6796911d20252d4cae95c11f4637d2c73802e7088b012c463c58332780b698a8002bd0d8303f5d80b706832ad5f88b30643f8db77477cc3f65777bae401696febf834af4732801882494c3c1518a7f563e28f374696f929c6ce7068acd9ff9a579d5f4c1489c9949c7e230b1cea60510253e9b387ce4a67581edd21458cda27f2d5984315b9f300f52782552142d9955cbcb63ec7c622df03a8144ac48a5b6660995f46ba5dcbb362ee9e746dbca9adbfaf0637ad0eb12600fb2b9d9d8e8fc3523753ec0cbc4326076b54e740f2859198b2060e27a4f3a487f0331a481cc5325a9069819650c05477f0333228c2b55530597cdf240d644e099fd4a018348fa921078b45cba83146c481f0c002626286192635b1a820b380ec9ec0710b3f43e48104938f7f5916db2e12863b55fa598426e099c3394450c6e1f7064086c3aa70ff1cb920348c1f8b126e8fe54104caf70811c3548e1bfcd71de6b018f13ff8ab87b239c94ae1df7b1a6fb284c16f146c38521e267a1b868436115ee67f965ba01967685343372121d62e7514b8916503e1e8570e957ed45f56e49fbe1a8c23ccb6a4267c0b78160e7582acc5f005f8d41fcf45a85af1c1c8942ae030cade390188b6d38fe3de5fdb59bfcf6aeafcdd296c461f6a759daea4f3a3529a73b0f9aacf8eb9763a6e7b9a50564dd7db55a6caeaad9151b6eb895236b6a1422daa0e34da23829de0f569f31d98287d02521b22f0e13d8376384335b9edcb6b05f60f6b89f22f0d0f006fcd4d7e6ae1321913eb26e45c69ff34ac29b937dd8525a3240035bfa8f1c0dd9b5cce41f5d91b1e69b3fc41aee73fb31013e982fa44915a810a1582390ebb204e7747c876a60cafb4e4606e55afdb925ede5891daf3cce319b846eab7eec60b4974786f6559ecab57f42f18d6574ae7a54102924c4b11b1091efc594b5292616751d94001328c9e1c3a62ab5f2c9be49564699dc387d47324b04ea24a21d3bcd6cc292d55bcf5ce2ab2e87302a231209dc9da0e335379dadfab181d15e1e19fa17319bd77ac8c237c6e8be2bb060aa8016033bbe4c7d3286260df70dd010b3c124c27e1074019259c9d32f6bc8c89bf9301e3c89b7c88cb98b5f0c06ee8ce32a6fa74cd225b7e2c74d36ddaad1cbeb649a798e56c8aa4c8edbd9784dc765929b8dfa2bf5a21e840cf75b4770b95d15edc3dee81ff5f8004a468d61372002493912b444ec03eb2a280026501202a56499aa3bc0cb0ce2528ca901ecc86077588293f03b804832dbb29e60075e7bda32c004e85245595782cbd70527212134696ef036a740b6caca563358f7ead8f42002ae21ec0577b1f5ad0834f05d5cbd09b05016513c3007fd22a91f07638892554b345f7ba22e3d7045be7c115dd959a64632037750e01b3135be37e8525dc0297c51555100dbb94443a61f6dfc2389ee26fdc3c8225f3b406aaebdfeb86315d2527df987023aa6eb2e62ee00a9a22ba8a0a404e7b8cc1bf5ddf0a259d09093d7c080c794cc69b08d867c42ff2fcd9253562a6dffb3d8b027face9628258b3168b90f17ccfb8810cb55c474fd07e427abda3d40b52ba1db7e349d213ad45e273d15c3a0d148245fb5d1f8cf021ad7d9ef999b80a77373b490d3145d0ab5277c8ce032e3c8070526c9e61fbe0ab2d3cf6cb12cd365749ce4ea4613a29a8c68aa27ceeeb449a56e15b182a90c1e68efabfc3926f93e7eb57101d4b4534765697e851fba1d6a031d3a0e4e3fd4083952422cd2693a5de53d642b536e14ef5912ba8a001cf3fda2a20ae1ba1111f1d8e2bfe6fcc9aa21453d1f94c564999d9de5cd7c21aa87ea9f3c64ee2146c10d7701f67cc3d2ad34a3303700030f1ac756f1ede734834722adb939f81ac397150a92e93767a60414cc51d01af29ceb8dbd912837d29c95428c9239d4d23333077c15186ee29d6b749296aa032e0284a15269bd0383651927a41045f79f8cfbf83f1814b98b4811e5a648555a8551e3378ba3042440651c159cb52271f3944889ff0f4ca6ebf3a1bebe5051e613e5f9dd23353d967b878677a6bead00d378b3ace46b284062fdbf50b654bdfff8e6051b062be5fccf1c1466c425b93e6338e3562c3f13a0507a88fa4460b6696a4a063c8936386c76472f417b05e6b0954972b0a1bc8daeb1de1e8bd90bcd37ca03545f86770388584959f410ab944a97cfa822964300c632e34b159483232cd7d8ef840cb244a324e7ab6f84ef5f8ae5cd7274e21eb038330d6046b6c37e2837ea2b33bef33892b15c71781b652c1f99e87c0e6f54112b2f9d5686f72774ce8778f33e0915229eafc5e6bc0d900d6c8959d72001290bc30a58047a00499b6f0809d86b12ad22041642ef5af51045eec5859090d273223bcbedbb5c55347cba84804257a58d6839104b7fb490ca5d057fef44a90ebcbc5b8281852ae66fee45474f93fa5856f8a3974bf014e07834e4435ac237801520bdc0499fe1309c6c46bf16318471c4f81e95e04ea5ccc3e97d720a06d83e8a04b3fb3f6b29e541b1e860c0878d2f2864340834e478b127987f0db664fcbaa5c60f382872b46df4ae22b1b5445612b0e0e64ac721555771148d278cea5388af3e4b7c1250e4f40a747a9894f7320785dde877e5128260ca39baac1eb9d3274034c3f4f14202f97078f35c3f71c22428c88f2ce36ab85631664a9128e513035a8f64c9e2d96a729b5d874f8dffa7515ded385833ea0ce560dd88713f266a11b684892ac7ae3876f1282894124ca825ce18b7f1fc5187f8f0d5a63b94699b16a7408b525d6df4be73002673d42b556d3c1b51f6d7f15203b50eaa1bbc4e1ab42d47c35541a65f52356599d26b49cd90a24366ea362fcc7938ec51ba4130887654645cfac9e01a59cb8cc5c937fe484135e128b2a6e4ccbbb815e3e4b705003bc75476f176cb8f6606ea4b622ad8de328fbfd55a53eefd2272306869bcaec92e677e2281cf9001d72e86ca196c97d8dc7242008e915f57c2067cc1a4384d75477c8fb16d5a198e72f4546e8bc308fd698f0679e45a8c32a6f73bed0a2b0d13f4e68f5ede9f1980708dbf8df15d78c30932108db910629731daef06294ea4f6a39f4e86452d5fb9f22b449b6fa971d437bf8dbb033169af74776f2ef1ced2fbc2cc748497988ca3580d2262c6ea1261f60a2576e65614d8d6f9aebd925d209aa885eed4753210acec33a25612d0e0ec3c3d19d62780fcc3c704cc1ec822c48e32bbfc801efee2b15454004c0a8f97d1e772597405f2ef1fd69ce76ee73ab20108a4d5942f4e98d5d5c4911f0420e4ef597858539295e46c88c3e67c6cf08988fe1936ac81c49f10fbab0b215ff37ac122b73ab8b0d6e4eb761cd6acebb8bb61ed418ce30800a676c344256c1782debf078fdf068ee5ce245d6a32ad65bcdfbc51048ba36c5cbf6f8186cf8f14f7b6091e4b125a2c3758f30b445a52d89f07768bb3f235588de0a2e40d042c8411bc9123d3aa63f600f6af4d7dad38796bbe9ec56711d27f90108e7594a454e3607faa1093ff91940f94776dfcde7232c3606c582b40206e0493fabae173dd1ff7fcf7326fe7fbbad3a7153f7bece5a51f67f2755334ced66f07b79319bba58958fa34eec8da8fa396065de2a0fb6b685cd2bae6827a2f3c8758131eef14ef9946bf545918748002dac8476e669c60aeef6d214f83faba96d1ad322efdc77e5f16a39ceda6130606c9c78bfa5ddc79edf3e1b342fba70ed5f4d7d8a5a5f990db873376d87d6afcd258343a66075559ac35b05813605b3d5bb136d826cbff73c2e0ec58e4b14215846bbd83338b6527d0707db2227450a16011091018580c63cd45b2fd79168fdfabf0561dc110ba0dd08216985e83874bb89f45f92a6745af745984969dbe7b3573dad933489923ff867eda6b2775edf43078c177d9be96cab9eb6283a1ae27f3605bfae4f74110359a645abd047140a1aecbe6f412ea1cd8cd8c50078a972a86baaf9973fca10ee0ba995df63a191483b4f05b99092ddf50fa8c35c734e56cc509b52b7d7e8cf9ddc4cbf115aa8afa4282818de257a4a5016a973b2ad7d02ddbd9915e79b2ff4bebf80e6a77989a9533153d17ba3504da5b5797a9032e6367b8e0d9eabcf16669a3be82163c1e5af5ceaeb4543cf59cee65929d372a4d7d3ff1b4d841ef05cfc487a85df05ca39e76353b7a378044c10360918d544f7159c19bb728015e445a6a62dfe1aa624e4a2244c40c2972b4c55e883baa7846f62f51e8b5102d4902fab3ca6baa3cefeb6b91f77462402e7eaac0f30e7a8e8c091da04f27dc75547ff0c5a5640a82d43780c316b7df6ee8d360c27ccd3e7e1f3c76355991cded1f6152c3a170a33fb7f969e62aaee13fb32ec4a83d0b35a61e7815a335d8e1e3c7e17e27d5e13b9413e2521a47eb09dc06067574bce6847ef804aedb3d3d23d0ac175a54d715727a476ea7b90a0470224f6674335a3bce48700c6257fb0896e93d062b537fedcb91dc196c133f8288a495568af856b58fd517e4d0d005a5962790a7043d2ca7de94536484bff64189848ee893d62dc547875e9fbc3fd34140b3d2243e28c728d900ff86431151d9ddff7b6b96175213f817ef0f5a26f1b2af6daf5fd06251f8e7f02518345561aafb941efe048bf0cf228f5544b762713051bfd0713bfbea0992fdab2e0125d233f4bc79b587645e0f3660c47a70706086d6dd95ee9362aa9b8e9d1d92ca20534a34c067bd5ed08222f8d0759d7aa978756599b3d7231c450e9ea22715a7e9edcabc2771d36ca7a2825183493971eff526b9db9da9eac9e0b283cc64d8bc46a47ddb27db1c09a9e6f52eccc89a137ea9ed9a5639657b28037d29d4d6aa17f9edb3ab08c35232d8a05f0b4b0f50e669fec9f009eff7fe16a6ba5b1872512b5421cc8e267f9d59914c2322d03674bef5ce3c482b447cd9db9743d7f6cf2ba88101453b81a16a425c8354c8ac52557ea60adf818e29614812b7cfc8130e796403566283005d5a89af1b9897acbd6a69e2649ba8992df8106616df8efae6d0af209831bc4148a005b0b6788a13142440c1e6200261a9cf83e9b1a84b4ecda7f8abc45dc652f018e984313d854fcf2a629f0ff9ed8c5bf04414146b72e007bd8128f8ec92b23fb6dd1ee27b74231b8f6c480bb10016edc3cfdd6bacd5b5a6f4bfbe11548efa48cd3ed12c986a94b331bab44c18b8fba4cb571998077ec116da201dc1339bc9b78e2305ae3f109c0460dda0579d047b4b44f67886174a270f2d4af503fb154bcfb4f302ae296e8a13ecaa914627d6d30a4b1b66beb13cafe6136813ed2cf44b6a06703b4f58fcd1b125abf304bc5eb4861910ca4bc3c08a4d6665ed587d463e6803bd5eb5ec4854c0190ebccaad3ada946b97e253ff1e90fe6fd985d885fd4eab885d95f34edc365ca96db6b14fb53060d3a5f349351a2ebc3906a15ef78b136c874ba6008ee5f87b7ea564851235b0f15bdefa74a7ae9a5ca9921ec9b6f65eea863f2a294128cc4c2753af90cf2d5eee2f4774d029b5a6ca89e9cea8d12fbafa8d0199bb523b4eeb1ac6ff38e185d2fb90817fcec32faa91fec7c415f0f41fa5d0075983d08545ebef8fb2588605c55ef3f76434b1e2ac45479d91e4b07aef882ad71693f58e1dcf4a80aee61104bce507c4c60b73f1b99b25a8348686177b3157306871e729a8d7bd51ff79ffe201820118cf00bb48210587950f91e3f6ffcec3704f339331906fe4ffb07bb131eb39001faaca8e0272bf08a13014b1091c64d67973613f9a8099af91cc0f9277b63c7506c0832099b414d4ac0c2b542713ebdafc3fc30f6a7b410ba43d40f8fffbbeaff37b8fcfaffa7bd6fbbf55bffb7f8e08585b6e2d4d2d9b260a6643c3b7114f0d81b307cd4e26d1c1e0fcfa23611a0f2f798ba2f7f89e44f2a10ddf8371da0d5c592ca6ec22c4202e9559250618db02994414ceffcc928dbf34817a71098dd1ddc240653b4fc79a775a0f6a67d7b80f6581145cf5542861238bdd06376322cd552c9fdd4b4102001bad85baac8a8da1073218b624eb7c7fb6b2dbd79676f3bd078129ebe4a7b5e0e75190f76090fec71aa1883be2b5908417bf41771a002bc9137cacee823e8446806168a04c14207fe0e7e804cb9ee338906f56ea412f4be5dd478388ab8e9e45ee2c0217cc4579f4ace46f27119598aa0b56f8bc249565ace15924f4258e0679531eaa2c14717f137f34f6e516cdd3408ed79acaadc5812c05ba24c259363278bf3bfeb597b575403ac29c6c6dcfaca0b3a06ea591d2e60e379497ff3bc39efddc06abb2611d6e7d6ec64f15eeb6f517ad11a04dd285d649b1615e1fffba4d4b6ed60d803217e2dfdad74b2d4226e650a9c2e5e9a8b0e505b71a5bc4c6eb678df5b41b282d3024b248f70ade330b03bf8774180dfc50aac08c853256467739cb05ae742c2c0d331642b2d73197ddad7416d34933f6925bb20738a8280a109ece62dc1347d5a0bf2c20709a2c69eb203cfe97c0584cd986ac567940a0b013627ec8b4d7786d6b4d0212052e49809d511b2ce62a9e21003f850ee49713a4a73aa9ef4761521b57ec728457e519009898db9cffab55a2bb01aa79b95e9a7f036adcb052f1a4e79cca393ae992a1beb73e590adf9ecbd28a1e087e784174d3f5aaf146dfb2a76279a81df59aed43453f6e684d94b88a25bbe663412ac23bd7fd595d4cda05a758eecf91a62f427f855b4167847476a4bcbbbb9d5037a2b54ddd5d1da77435a041b6f795c32d4c24a1fe2b4dd3b093fbf6b78a2d7f5a2a83c2f0e4be431d061fc571f752a4319706a321c1b33ff7062c0dc9d7d5d627a544d6d03076fdd3679c223f224a68e5942519fae2a348a3252f57a13ffe65114226071d399afb15f6248b0b072503a1bfc5ac612b2fed83cb474b7a70434f87a70fcf4c50f3a2749c169400278e641f49aa5f41df2fd37e836cfd322757fae518189740e621885e15a3acb9b6891086dfc25574f4109cc8b3401ee5fb50c44112185221babe5557589f894eef6a371d0025a04fbfb6d447e226e786006abb17a36d843393d2c06996e3848f07a00fac15ab8f0850dd8809de2fa269aaac9185dfabe06e3f8081e320a5c1377d498a343e040fe9c36add27dadc2d5e5ae83a7eed33a578a337100046d2d47cf0525a291ab3405ea1280d8b8aa0b01a8c971d74bfcdc9e54916747640d75c9e0c79c489a1ff3d6e7ca07f039bd5b15877ab2d71c0467dcf5935998ee069c2f1006804e827552b61ff1a6d8e6cde32826d74608f7bd344b8b00ab3105a7cae7530425816cc69b5ff182dd8652157a40b2f83cd6dc4eadef8510e8e063fbb66a8eb20b9276d747b65317d64d9c7a27936248a4e109a67c8d6bb47995a76bbc37cdf1f6c5a966ccdb0ad3cb706693323834c7c8e10bb1a22da55ea3b5659d336205805de929b8ec5de2a8961321a26182dccbdca7623e8ba6ca01f76c5993ce9be68a5b7b1ff4c59a2faa69002ed8ed9928e2406b35d26300a500b1c4d8d3d8aad1c7ca20a9d6e855e4ba967d70f1df9f0406afa9d1fe2f572b3b1c4a5d1f27f926d269870699aa2e07c7139d99fab91fef2491a00c0368c0a5cfa6b803b1eba2f9b875f68a2764f004c1f493a37acc54dc4e02489dccf7aa3ada9b71badd88e1c88c04cf0266c7881b2176f81e320c954dd82470d5f4a2e1a4999168d53e93a68f6bf239a552054b477100baa7222e30771e6a43c5820469b557b59033eeabcdfe06c6c163898c5fe15d797044ee387b3ab1ae5b25e0ce13041680e337ebe1ede98002f9ae35f361255d2d1d11eb058c21defe94cbe621ab332b6dd261a000d4e4b738e14c2a5a16836a711d3258571a77c22a08ed6816d075767abdf7cd39c4e49d3e1981a84d7eb311f5dd36baacde6088c2dc0b20e1f3a113adeac6f4dd0b65d77fe075827c0b6846948506dc1d4960da5b91a2149e9f916ca4fd825c96b5109ba099ef849992965a9eaa9d975a8444989c3796013803e0e7f756dfc2d8dce8bd7ae067bb9ac45da8be264949e5a522149c9d19c634852f91e94f546fefd55fab91be67ca2a14c8cd6aa9eca0509fa844357b51bd12319d8264673b2e597399ea117e819198c915647043c6c0e5fd4f478129918c4ced1be9fcd37aba0e4c2f0c9a1582bc6d32066b62324a78a3d405fa0c4a2cf1e4089a0bfce82ba33af590b034da937c9123fd3acda1c4d8a8d1b380767d3581e25bf0fcc4e9177d6ac157048eb3fed94835cdb8f99196286441f6cc0a042c847eb46d156b5b6be25d8953e64d444fd19ae3978dc4f8ba286e06677938968ae886784c16577099faf2ffbacfdad52893621494d10ab11f30035b62b548fd6e2868e1d54c731bb426be03d6c99291e2da7c636268141d18c176d569c2582adcf77139cff54b33a5c1038d7a04d190647a65ac282a5c7d0adecc206d595dca45022f297ba824264c1a598234e7a23103e225bdbfbd938faf10585df6308a5160ca2e9f225b3738b34a54ce7b03d91be9d719eb4402bbc78a55a53f8a158b2d4d3df75dbb99cc44090585dd6ee396ea4f6130830cc84998eb6c62ef2c1e7058867670b6958f5f527985e00fb579eb6258925df6eddad4b5b79d8e42dc1ccae070d48471d61e2fcced84cf0dd223826746edac2f236156fc33e2e6bd816aab750111ba45159a36161799bb31d484059e15bf55b9f450c90a4eebd14ed3b822e94207312f90c4ac8123275f4568a407d4176d555c5f8927481d0df8f48a1691b499628c67b8f6f57fded1e72f4ddce001338beef48a405b104b414806c42f2c7779d0a7dbb9e53f40a3dc84e354214bdd673fe45af348ba6323c9020c0c91da05e6d2f3105831ee8ea8f424c46a09166726be780275117592f3e13b7d01da06eece719d9abd78165fb206413cc1ae2f584f49f7dbe8bb18e2cbdd22129fd09c1a96a0f8480ef1268451380d10b1c8fb542aa0369e2b162aeb920b7526832da3368d05c09f4e996b4ed88346635bae8c4e70d90baf2a2bdf892b208111c45af4f26942ab067aecf56d7f5cb36b7b4a9c2972ef8f1f63fa77d19240354bfd30bbad46136c50c12045bd836dc9e39006a7e8a08c11a2c741192c5ac91a527c32bd244208ec06b809f272f58c41f67ad0b66be421817ec1cc2bfd0908f60f9a91b98a38e6e0ab21d5af6dd2cacfba9d34b170efc99d48ceaadef30b7cb2fa24d33473b7beb0b31d2d997f394f1cfff16c5fbe634e61f60717ca9f311f1de634e0b3d30e81595fb4970c59dcf80468856f6f52864a89a39e8ad00a9fb1d460e51a35fab530d89ba73a7e000b82c01344143ddbe70d6b65a3ee03b50bc91196bf0f8e3c2b2f35e13ff0321ab0e2684229a1919451eb7028f191b114369badb729386cccf0fe10093a25a4096ed287fa52515125c9669637df09d976ad21c42c4c14aa2b277d152a7c848eba24249a002a06cc28818db2964247ac4f467e3280d0947e32ed6e891e3ee181658517b40d8ecce6150a3428546d913e2100a15cd56f0e451729f94dee926143c41cbb516595951ad1db4f1046358fc81eefed0a27ea748a14823bec03c9befcf85a5f141791c5d707e8517b7b7cc54f5a5a17f199875b2c0e44e0176847e361bc8345be0a875085145c918c7c4d1a253ce0b4269d54a1ba8d202aa6764be78a068e92977351846f299971b5c0ee43624f7ce6bed6c9bbd1f9c4129ec538add0bb0aa105f66f9b49e68103b8d79f359c1c03fa4cf63deda725e2a52cdc078b4a2fef0fd117dcd3204a54ee5a2a7d959dd5d3cfd20409d4ab530be4c088b335c8a2785a1af2c2a9051e8147712fd2d8db8531c0e86deb1a1bf964be5c0931e205b36299d290c88d2b86d9b8f2de83475974b45b76a4d6df93e6f5c7790591980ab2916b8b33a51afe08bd589ea8951702085a5bc3410894bbf53299abe74c1ee3d9df4824e70cf5737b1bf03924d3d6fda1301e91921ada7b9d1208d8e9182f4b16fa0697e82c6aeb59e4a52cff8da70bd2ff8b4b2d40b7aa7008251bf9a86a381668407eed9b80670b075d4e8b824f96fe13800986f90b891839d62a21db045412f55056ccaf4d937c7338026bd805693bb9ffd09703138fcb8c2d3148f193d0b1b09c6395a2f2195193678b503db8cd725cea20b5fa282a1cee0a678647ea8870687fbb49e738a890a2eb4956fa8c84e50c81fdf7333072c92890a72309f93e0535d0b03d866b4e20421a9be704b5e64b968eceaff6e0a4c2e0be6ff9f262d7b7081739ca0bc9ba4e9d6ae692027f2bacc0e084b8afcfd54890358499295802189c5a189132cc3c727d1aa726f7fc7c99a30999550fe5fa74d3908e593dcd7808c311f608e7ef2a0e83e1d440295aec92bd14391d6e810dae2362644e49d08c06a83c514cda3eca4cb108ba698191271a6097a98e50f74703e3436181fec06e911658ec2036e9a2708391db107f95178ae4e2f12edf497909a72361375881fb46f12909ae6f1086dd3cd175e6651801380daf4055220a8d27dfaffcdb66a1c5b1b1332a2479882356805ebb19599495b880eec36a9a1f76cd5a6437f75cd001a11fdc0cb339482d972cf2c5df0e46165595c0e28115eb44add20a649da2f50bb585a505bd7b1bf842fa400fd5d66ec81b0f085451bb0a144403e16e950f0aeb155f989aca210d3eb0ecf5c043c0068fd703758f6f52c41cb2d3a240d2a4165a74777dd3044650d9ed5b1c68a93a861fd17b0ba0d9928178b0545ab2712feabb6608d10fa683bb290d7bc453c863c1887dd42606d432d4bb1509c8a470bc46edb33fd1d3513d28cfeb09cfd233937fc3d494ade7e647f90237c2ffae1a2ea061391ba12b95168c35d2ee9135664094d5faff747f72d9ffe7c291ee7e28e7c19dc05cfd03d16e11ab1642255292781be6e7bccb590ac10fe89098b6f29a22355ddaaede03baf2f1e7f85ebd962a64c02b5a0d59bcce7083b20ffaaeeb933beba47b874214ac0e7e9e304edf8686888de5aaa99794262c02c82c846c07d9b59f2c3ab456b042a637d88c431ff0a092cc5673630fcad7676be84d338537f8fe5fd75cbd6cf4d6d1072fc14d1293a96dba53e6d888a02a97060b2c9b69c5e4b4729f0de309483abb5b9704c23c84c73cbe79edaa9f2900c8ee9832c710722d6f67f574d17cc802d1d5995e2996c138d5037b668326c748484ad22b0118ab99e723b4dde36137737fc534f7f6e9fe5d3b94076a86aa294d90e3b8e3db179d1b8424da9ec572ca22957f8a7d8653d6077fe35b4fec1dbf8b51c102e193a06c75eaffb2bdc042bc29f8fb11edb9f2572a538f88939fa797d18feb3ea4bc5b01e11b300f404d763c4749662afb3e4b36a7989b61049d4b96f682330e47dc7df5f9ec37b759d0135c9a681aa7e2569acce3c65e495432dd01563b8d765665e56f07140d506660177fbc8f0157e05c93b112c3d66c73abce6226f7535362f2a1919b8d8ba9508d4a8b5526bdf01e2f807cebce9c7244263a0d084834f3f0d880b1ba29b527290572fa27bdb74ff66c44450317ff6ade01705fd76c8369ae5aa9d75f6a2ff8755bf2a8ab8cb1af1b163f908006e5df960763d51561417115e7acf4daa975b4d71bc9cfeac8a2bad18396e60a0050f600b0236f5bca4a915737e8b17ededa5593dae9c9a8418d5c395008667223fdc32061e64f2e655675226cd35b1bfe2aaa2523c2dfdac7a1c5c4243fa285e3e11da3d4d34812140abc3a87a5264287c6cb775cee1a9bc29ac97de241bb70b0d8acacf016ab53f44927a823c51c7f376c70064b6ee12148b814510dd1d15f9b70651f606cdfefc6cdac0febb0a3862fae3920d6be8c79fc436a62e9868edbf90ec0333836ff879a697e0a1a9c39a3898b77b304ee80d0c91e569f360b3ec2701e536bd742747faefad5ff3e89dec060869c70b0633290bc170c22c0065476843d8dd0beb2c2992fcbd2edc8c6873fe9556b78d811db3ee75d62e44e001a41cac8069048555340ed6ba077f873ac8e37270f7e1212f3a0d87d2264f7d2713ae7464d6da185a6932c75d36a6006ce27bb9092c273d790a369cc2332b0d3293cdbcfe361e7c06f5d2cb957ad7f42c00c2eb5ccc187201da815d41822786e1af8667159bab742135068a7fbd2b8709bcb0a0931464df0f0e66dac9d0cef5c3388fd82c0ae8f547fef9337a8409719b8859232cfdd366256beb41e149e60d36392ef56d7606059ad51326d1be24a683ea7d2f2bf50bf11212ba1b31938cffc22e388a9a8a9e2901d5e3bd7aa9defdb5c3947a930b93fd700c61955cdcdce37679582716c6b4b8aee8d78bb7d8dd3567f5da828d05861ed3e2321a70d8c2c6a486f36755f14e8e6ee23b54acf83ea007052d9307b6509a7108abcd883be4ef4d077eae4e8996776f9ad1eb417e3de29fa79bd7f96ee1242b5b186c95e3bd2391d617bfddf98c921947d695d00fda979fd105f556acf00e35b482dbb2bc09685963d1ed87bef50efb1156e0c6ba8f90d76dae3fe4b89a992b25fa415343abcd1b7a28722fe3bbc554b9ffcc7df140fca2dd678d5d590678bf9fdb9c6d18b06ca5db0a54bd0377d2eeca90f735a14b400da8c634664a99297eed3caa3f913ad5efdfdbffb8cd5ba306e3aaaa16efd760dd4805a1ad3feb8ebd07766ad61ffb9d3183919eababe576d4be0577f63ae6e0bafe8b0916cb31d2becec229478ec0800e931378878e1b7f9eb1c57ae352f3c494ca5975ee1771535178696994314687728cd8e8bac00a95e68c2bf11f1aed907224fd5ebedc37015ad960d5947c8517c4e253c9f04d60ac69fa34051fecc53658dcab1f3940b92439757fd8d93653ecff8bb8adf2a44f87a3e7c7c81db8492ea7f7f741269f744f8e9880b0f79506b06012190063a577d9108061151a6d1b6af1bc5db990fec138e26c5d9f8b2248e79623f754485d9624ee925bef05b29a13ca0cc530e4fd840102f651b8957fccc352acfe10224cce1aac92a720d693ce4fc0977b06b58893922e7e15ece88b8d95d2811197479637d79252f47a9b1f361477b4922893a098dc457d0434858d7016435a0a15ec2ca39137003d3c83c292a3f65722f94f4cc9a734b0c8cf4e5f0d329678dc6626b860f53f62050ae556a0819d0321701633bf5cceb5e26a3bb8955f6836427d3b1a407ed502201e5442975309d45a4018d98305674e205a3cc409ac39170f95c5b4932bcee3ef7a139b6af15d92b469abe567324ce5d73fee1290d2e26ccbb931a6298c8c50d85a11a54c0de388ac53b69e2dd2a2d479b65999ea6a2bf356ea9c9852b19238f50bffad3013f0eeecb5f9a053606718590372355a670c5d768b9b1515bd06d2937eee8a21c2e66f0ae4f32e8e08d7c9a80af177deb502a4d5c301a5fc33bc9aae2ffbc11e02b22f06a8c09aa8c174c96657add508bf73282738f0c503182bca71e81788a99f4638fbf3a1aa07c86ac75cad73cd4f17767713520d5370a23646904ac5aa2acba76dd98b81a7a7174f38016c77d302cef9364a7576d13c606635be78bb93936bc9c2ee8a4edac6c62649481baac17eccb6671d0b203c6457940483b51552170fc9912c393c958d5b1002927ec3d84ae7eb220bd1c3c01ab42e8fc322f49eb79bd6164c9385b9e48be3c1535e529e2c90869f27d05197d5adc194f4a85558f0430049fd15da4728239ba4e4b7fa232d254712ee7a7944d8f9f75a5883c9797c9f967f6b3505fece469c55d8b60884a5f36483d12a4931841a31a0c67ab34e6bf1fe14ccfb43564dc890f0172a0328a8dcc461307e797fe2c96b5350cbba164030525ab9e97ff1cfd55ae7c56777d45f78cd22f69e34cd037c320fdcc9458a3ac2ef2e92b347e46ec408abfd9583d103bbcb3763375d8cb3299098b547045970979649423d84e01d1c4744309cb1cb6b5f8b566599a2ea398553e8f30df286ed858bf83cf38fb99a0441b2ca9ffe369a63795308a9acee6f397d05b9e280dc92e05c28884ff03a6abf3ea4b57e45eb0180eea78091dee4b10c274a34ba85f62ce112a57137f542acdf0515215dc75db3dc86dee1066f39b91b512c4729caf692ad4cb8d47c397155121bafd518ce93665501762f6a265a41aa1bcc41875f5f67f4cac247411a37e63eeb15656f0e80ab084d72e013333fc5b45e76ee99c564fbecc2ae7b52f409893fb783a6e6d1fe369690ef500350bfd9886f4339efb4aa2d5379819cf666440f41065bdaa7ddb391cec83ec9e5cd847ccc04f8b5c5eb72781f7a8b905b2eb7e1ead22845097250d5b1b5287a6380ef533146508f0427378b0c95bdd1043144176e3f5016cc2e79eea744e598515d1d06c15ef68d990f07c76580d680de690ed543f46a23e8b5c463037b5e9dad12379e90bee3bf3ef439d3a48ad5bf6d8235642943be28af15c78e7b8d50fe75f4ab0d21869b286cfe98b20871f1c5117db25700ca2e6b220b25f60fb4d51afc332113e9ac22debb1c21f4c1f19ec37ea45c3cfa69d93e35ade355393a6b99525584d41de41a642f7039f62ccbc92715e89edaf44c82d9b8f5a2ad33a06813e999df0fb90bdc05ba90822572c3b599b650cfccee2bf5ff1055d6817ed91b1a3722ed22e3ccf51ce29e2265fd3782d06adfdf79a10a17677479de05c67bbcc4597ed96896c153bcb074a867c2077eb8239c94b631f43de159a96c570d44b9eb6f84c7659d5697ffecd359f87e8f2e1f425d327abbbf39e57cfcdcb1ed6dadd05d9c18d272f035c5ac058609e6fa431f1a88f487e5f8e2d320d515841f39eaa54ee28cc46b4ad11bec0bdbe01410cf840341ed1522d4229e3884858d35a6f9e9684b44149fb7601266b9e58c8ea0b7d5a61a05bc1d67b02cf57883d8e8c26eec2dbe8fe4437b4f289cc2a60b2d871445337cc89411447473ca25aedf238d927b48f803abda83262da6ddd8ee1b5a5ba11ac1096f159cd013c3075522f130f3d11e3b0bc028fd344faa48b076b335b82dce00b80eb719c770b687817c11f99135fd0d3c887382334fba0de39e14864f1aeacd00595088e5b14d2eb74eac2ffaed29911e5b97e02e0b26ca580483085d4ab39897ab942a14984fb1d673f41934436e6aaad8852cae4e0aaf77a1766d8faf3ca440d26af8258220405470fd3ec715940acf592b252b4d50c4fc95237acac91945581ff4946e7d9855e0e5e4d2de0ba48742f91c795788fbd17218f62f5b9a39ffc7f1cb0d24eb430c9a3cca632a6b4bdb2c5f1695f5a1a4b38a19ae435ac167815a1a254df45b649d540fc430dad318d8c6b2a729d4a38e38c9aab0a4507425467a2fbd1f39665886a130040497692e690bc9b5c068190c31373f165c37729002af6fea0a2e766f9e3535e38acfbdef9cf0928007dc90d092936933c3c109972ab4a23930c3e2809e5c3330a8fb275f14857a44e2d2acd3d298b0578f37fd5e17c86118b50ba6ea29c7134b614101f35063ce865261ced3122e0ea26f033176aa1a6c9b1fab19ea514cd82f13255961b1a4d57d9e7adfc6dec7717023021aa164ecc69ed0d8ee5a4e7b02291075e678364ec3f118d46488451b1b6ae070057cc042421224aeb43bda9eda0a82ca46d7cb56f7e32feddc8729e840e92b46e1befa4bbeb8713418eed452fd1bc31a85bb4f5b4137f77d7e15555094579c8cf565062179a6f6934de9352bff5f5abfcad44ddbb700504bc1478685338b3a31832f4b802a4b8085291d364cb701e50cfde48b76c9697dffc1f0ec4551047a079987ab9ecbe12552ee7405b027ddc21e9095dc846ec8acd936e66750f9a3f08c2499e5c80fe183cadfde1f15f62465355f5c88c24e299fb131f3e7f98d53faf41753879e3ec13ce4df6f435488dc0b5373fe9067f870fd688cd73f6110a9c6c42ae1a84b0fa47b1ce511af0b0186492088583c80c892eddd927602543edba0072879f66ce1331b606cc383b7ee3056ffab762a4dd50fd92074cb3e3328bacb1740b8c8f392ce221bf582c6ed57869d14f7dd4e3807f05be868e329f348c223f03a0103069b972c5b4c05da7a503d97ad5758f370630f0a4d60e0dd96ea361e926bed64f4085e6c9481ad54eba9ab4233c027fa3c8c0241c4da45ae47484d9abc280251553f78ff3985404ef1b21312a81027e7528e00d79dc7c07083e0bf908201e30cf0ddd04226d4fc1f765c75e314fe01be9ad684e1670934b5f474e0ad223698eaaf674c72fe29fd8af89f1b965dea0daee691bb1c8fc3537009213fbf58ec0ed0c647e39c9757a0c7bf02a581059e1a618122c2a61b8a428f2930450482a0278a0f99a8821919508aa6d146dc8369e32132bf0229777e536e1a78dd5d0f72c0f43ba50469633176d723478a7740d54cbc3d1c22b0a2611844069acc5057b3113511bc9731a6b062812f786e30a499ecf589b04082dc1da649d41c7e77a369109d6836a7248a44c02dd061f2b354355bf284ff29029a158f51c68b2017e1072596eb60810cd8c4a56b0676fce4084519b353784d1d9f0ca630862da2bc7448e485cc992e16e720a9da4e0676213885d1dbf91bff788620ceec1eaa1006463ae7634a732356e9ef01dac80d4d33e6c049c5d02da5543092d4f422efb4f85ccc7fd3abba0f384bb923aae821144bcd40ed3e2628d42ec784faeb37ce53c73498d938d53f29feb0c286748acc634a0d4734c37e4a414c9c99e4185934b4563ca749cbe56a690e6bf65d5436404c0d1b62c2637f26090128c1db548c3a3e3e644685d156af7b5d0c831492e6ab1d2da89843b4149a69d99f8a921003551ee3f2424684192096125c9fb1e10639620413dcda217ad9d5c6caf89e848d89a7563ebea896054b7e92c7f493d43433b9217d5038770ed9d99898b1d63f0a07f3c7e14364fae72637c162eb5e21be1a16379af6230d71a6d8a27b270f077ea15885b585b79f3a73c87945c1132f82fdd8652ca0cd167c070aa17201e1074d791abe32a0d280c9548316131b376424cf912441359ef60e58195f2b7227bd75a0ac277d80a31a46fd61f661b1c25908192856130927cac344acf8940c34b758b44feccd666bdd330ff505fa50eed3266270fe41ba412f78c71cf3aa5b567d77e7cad864d8b3d7373e32b96e59ed1ea476b0d31c497fe0e60da073c77c31d4e094592d0e75f59457a7b56fdc675a183a8a30d13d72aa2ce6ca18c9a9ba8fb7a3d9a49da42490288d395d43ba55bb3753cfdadba430d6c3c23fa00ee87b6f691ad394cefa67e7e6fab315a00f35380762af79a4ee8918a2896d875ee882eee7cb7559ffe7e9af44c9b5039fb770194452b4e7922b4886de2be6184afc6dc235342a79cc02b10c353836c073a6fabddb3258924c1b572287096c8a0bc2448756446867db5729daf345e7e3463fa15940218a24dbbed63bb39e36912b2c70f15fcb675a8b01acec8d4e0b1c15dd822d59c3d1e5f5c58807d8d432d90a5215e3ceadd7039ec291c2170590f07bad107c57ef65caec42bd04c6f00e549d23dc82d37b07538e9a6b859974c55ad9e6da948249e24ad99507039fb329cf319ca857151983737b8f4bccdd8473a746409e919d486fed7ddaea8f68d15b7b04fd06e25eac7ad9aa6a533fe6b23311d76bf2b72df6e1f5365f426498ae96bc2941af6c5141db0285c33c4dfb479f18649afa040bebc36bcdcee575378a8079fc159091bb8865d6f3a40f4b80283d4314f7b1cd58994325d85ab4b721c9c23c9d2bfbf3a981a51e5a632fcf7bc21833f96caed5506a660542f558cb5f1e270c7490909b9c0fd2fcf460047746eae3ac4436d419ddf8c0bcd0b0c64c747a8ba33b812ccd10fd381cf940697dbbac8d475ffc46112d88eac45cea10820d4c05267cac02d18e2288ccd584bce60b529a173ff2a39f05a2bdc787b273a2ec0ba2a797330c6b2106fa2f06f7903bc7d410f731f7702ad61ac4acfaf056f0e0fecb750c0b1d74d6ce07ec40f3180c1047b580c306e096df1d411e16865cd49d5d08258d889cb836c2a9988486196de18f6d5aa8ad0911d0aa34d3749239ed573e0c6cc82d1996418ae27b331f2bf5881f6ca3807e5b3f8a553df8964afb2b5914ee9cc7a7f8ff6478f283de89803e95ecb91c0ff82de6e777ad2bd608a94b9be43a95b8265b58172b5743c28f08a3c2f0e3c379efc8039c026c278bd97bb045b23ccb444acacb069893bbfd990472d7e74137b023339854586b2726cb703bc6622ab6024a9b0ee44e4bf10dd7b619c24a21705672c324bcf859090dfb7233d4f06ef024036fcd57e1a1021ffcdaf040605560c57510225a2f29260dee4eb213b5394c089476c7bd6f7f027c3cd65efe961807cf97c5673883901adc875a37cfac1308089bf33d622fb7d7e41b3a0ca42ab6642d14c28313d58787d0158d988c423f644729b7b5c89f63f35112854e39abe0b362e630d1ba13709afe3898421b70e015751c175587706dd40aeeb54083812bfdbc76fc7eb1fe5f22101b27e96bb6c0362693d6a39981d61c9e76872c37761c14c451d5f880c0fee50658d1f5074a2149072238dbaa10335d19f76ac05c4fd834e2da2edfa329ea2227438544c718c1a55b44e7cde8d8023e6447ef39a995489118053416410aeaa5300c66b4dd56115826e99082e3213b5a057409096c194cc80af8e3056104ed593f438c52d8186ed773489c59bb51bfb07be2872ddb6848c9ee100c292f0a0faef3d8c941654a8de5bbc66da69d8f91c280562f3c76f60ee2715382f05c593e2ba7a571ceec3e35f442829009a49e5b2a5e80d51794d268be7152d71355c9e716cdd333a689527c64d4772d57bdcb5fcb590b620161c6906c8bb281c39d3175e8663e008d782f338e9813165a89f138429ac20b310742d83bfc51bd5fc334ec180d7cfe73f3b50a4059bcb86adabc2bdfff3841e47e44656da12cc7c1962b0733ce8b29183842d625991578c6f487a5b099b2bdd020f516fedae203bce226948d1daa71cfaef55190e53dd9d80f0c7d181b3bdeab4906c4d582387843c49d7056216b4997c4823f2d988d9dfa480852f309e0eeebcb07260543c9ab17aa54101d5c564614760f48976478c8ebdefd5d74c0224a214f56cfb52b598da5c208400ade31d273ae8ee3da7ce59ccdfbae01a53625e5aba93446d5ee93a4ee0c8c369f26a0a8d42df4c71be2115dbbc35709320c9cefd4410e8680a5b98f539872b6eea9f7d151aae3a691d587e1f87094fabe212b0e598017aaacd52d8daed5d19ed707b7842d3eb3da7fee9c73f9e6ca0ccdab3663aab1425753e593b90ef840ee601abdddeaaf4c87684ef15ba12e725788682cfacbc77a54d0b74e128c207a8df1edb07f0359a256b420a2a81ce8c2e652c8e19bf6e96a3a8cb9724f6fb4ba1a8a57244f43ba159ab51b6709da8ee0d435e7ccca2b469471a6836d09320f3f8dca5b47805ac478d8acbf1a5d940d04caf7d69a5a2054aada1c1afedd7a5e535f79d3e19a4681faa00304a1b4a84751ee811eb86fc29e06496de3e36e77d3087b8827052002d2a476e0b55afca987e7bd15f76780b579820c5853387a2f8e6b7fbf9a4d9b98edeeeeee2d654a52067709e6099b0919ec994ccbfefadd2ab4cf647c37aef3ae1dbd26cb01870108deaebbbbfb6d9b2e579ca58969bbbbfbe472e5daed920004a9aa3bbddcabaa4293b94d6baded967afa9ffd94528a9b04af6db998cb65bd76db8ab05297b062c57a7db7eed85ab1b244a5f56f5ba6cfc5e4cefbfa2aafa33cdcbbf6a44b65672dfddb3df7559e0a6b4a07a4dfaa62fabb166e64fa2dcac20e3547e7989407677b62434b4b260fde62b2754276a871d7e6f474650e35f23c51e7bef77d0b32fd1fedfaee6b0dd97e35e13a54736013ab1b229221d9713fddeaca820690f0d840e5210463a191a0191e786817b5f514a34add495047498a525848819d348952570c8f2b3ade35ac95b2adaec4bb4011430830b8a2c40d50003b716e410a2a9c3801440f5628c1babf2372ef4088dc2380f178778b3ab646c9a7ca46f6ef30132a0822fb57569294eccadd61235a6eebf58a3afe247d51faaddcacbef7de7befbdf7de7befbdf7de7befbd376696c36a56eb90e1c6aabe2fb4d52c7ad337a65bbd820f4e16b5f77ef76dc650d689f61d0172b69f232d0cb4655708037f9bfe1fe7e28e09c88f36edb37800d31efda30adc31d99edd0eb3be7d14680eeabad5ac66fd7eb06957afb93bfa0abbca42a539faed83f4445ddbbfb054a9d3567753eff40955e07b73f5ba32f7843080620a2730ae9cb1250e1469337242d1ca6a51f2c576dcdfb74f37aefbba2f277fddd679d795389ce20ced91386c7f2f479ef5f3cfbf0f07ee3719ecf624579e75dbb68db4b7c466871f2787cebaebbcfe69b6a1e0842aace94deecf7d97c1ebeeeeeeefdb7bdf7dfdcea4fe3a7332481b73dcf6fd9138f47bef6d1b08825494e1ebeffabdba919bb8c395d45bdd7b3966d8dd5d7c77f7d0c317ddc3177d86bbedeeedbe35675a62f2379137bae52f9239dd1ee6198eeb6faec3b9d166164f481f13dd7727a75e5494c77e557fbf28beaaf419b71ffb51e2fb8c5bd76590d5ab4a22a84fa14a4c57e117816123af5afdf6d85f2cbffdcfb40bfcadec9f36bd06136c3fd646c8b2ece12d961f79587e9c6183a97e0c5255e5b805c18f2a8934e96179d5e372dc5ef5f8714984a56cc295630cdcdbe7beefffbe5f55b63ceb83b8fccbbbfccb53d8aa1cb75f7d1158aa1cb71ed5afc6eec7fb295539da1fb75781650fcbd89516e841fde967a0b0d5a73ec8eaf1a79ec8a9f44139ea5125115cf2a4584a96c73f038599def247bdea83a05e551269d2a3fad313c12c25529013115539c45b4e614560279da9fec419391acb5318fef3619ec258ca265b89c3775224d27b8efc5e45e267214dbf22519f224f2d3f0385b57c909877792a8edb6f250feb85c4944dfa5fdec5e58bc05a5a5a62dea5f471f998b209f72d5f0406b6b4bc8bcba79ec8ea89b8943aa4bee5637e078b98b2a5ac316fa97efc1a5bbdea6948fd588e3c2ad557180bcb5718cbb87dcc1781b1c8712b471ed6d3bc6d65cff831a50febc7b2c9f72f5f04d6e4d8ff42fa34e9797956e9d364060afb393d11d413619515e8e5c7dfc1622c5fca2a5481f0c33cea4f7f56a15106d4e3a7e1f430e5c883f1f7e80a73a94e643222a1a198bf8444b22a51a94a55a985a4b04a85e80991fd5fa93830c5c2bd7d14f9913f6322710e66b789640b9533c0427da45d670ea6c7dc7d148110510bd9bfd75ebbfddd387a4215306ccf955d9b5de9a8225ea74ec039ad24f755e0de421d94724f29d771cf2205fee1cf515acb1ccb1478ab6f724f459e9ffeab43864f9cb998989f69d7f61e6ed116f7b42b4d7ac3fd0955e0f63aff1e5d9f6b71dc37f776051fe03326733158c5dabcff3e8fe1250a109cc8dd7f3577df755d79e660e6ee6d9b5c9bdcd76082bbe79e8a3b318c26c7d14ccd3639900b4fa802dffb3c3ffefd5c89c3094909e88399c8b17bb02b4719c2ffbec7cd12aedf91a799bb07c12f020b4ddff3bde9bd37953e4dbcb2c7647a9f103491a3f791a3578e327c2f7e10d39f4a2225ab2472faafa3a2057ac43f953e62390385616fc12accf463900a337d85994aea3b58600a13cb26630c1bcd14f695d45b67d791f739f2ecc6b6cf23a4c78f1c40e0faa70a5d5b1be4886d4a3dcc8e9010219d21ca74a490c425252525a5a06325c464a59402231d3a52d041256956930d294942a52a5161043e6b124e8e1a0e1c351cdfe5596bb9bf2a55a522337b8ecba6e6dd5f48bb66de84927c1b323562dedf27f663e4081092a024424a8698c89c103d994129aa512aad5d37f7060a27b4cc7f7f1c7fed782ffd2b1527ab9215d8ffac4949def66f481ae216c922634820240fd9430aa9811c42da40de90830ee40e3cf8c47e8c1c212b921a44d624550845562575e844562655569d54a2369f7c649d91154ae568e4ef207152d041d26e9d39fe96c4791c649763c62973d4242a55c909fcb962567d16aec0f5717c2dc9ff1bd78dafff42bb6cc8d4f89811e68585824bcb4a956241e1d3092dd3a68666a6f33e93188226787dd35f3ade3e88a324b1eac91bb205b2874c0d12080fcc0b0b05979615a9c30e6dd64f913cf8c430597f4e27b44c9b1ab226a9426455d2e65065227342f46456a1d4dfa18334bd555f0592bab7709034df905dbe41d28c02d9b9e61ab2661ab2762e554881a4304af30b4933cd2b926615493348d2fcd129b923b7ac6327c449cab52655a56ac508925a92a4d811a0208b44ab49a9e59a6df74ed7232e58601483a4ba144bda92929292925448518e82c8384201124741462ae4b42d82d33243e255427224041560d840f4165ac8f1e204471cf10410ed67a607665c21440f635861048c42994119b23158908216fc50674910c30826252842100100319df9213ac2ac6682242a300a861831f871324b32e207187dda03c4943e8bd2a7943e7501a433e70925027ce6e417fdfefb28246c5fbed01d6d7f4ba9e8ac9cd1fbdf5f63cd79fa69001d5d11aa4f69407f301c424af61b1b6209422758320495540dc45588bf7087b9cb93220185b3ae08d36aad9572a69d9abd5c9e3b645b76f4a64b205d6bdbb6b6b2849e08b2b57fd0b82130ad25100bf0d01b7fb0d24a7330d00c6a35213935d4280f7f611a7e157dd81cd21b7f0e089fb4b6a3080bf1970668cbbf87ee03b8965de4e187bf724a981ef099939d7cd19bcb43bfae504cc991222616e9892832084494249f15e889a17cd624b9c5bdda1fed02e242f90cc9fe1c7f511e3cfa672822407047d15117844cdf4ba23c609e2271e4f6f2d4c6cc859a4b44a6d7888ca404b7072418b161d0d78d790b89f23039414d295d50d795b539036a1ab92e519b57cc7680c2a75bb3c9630aa4990945fb815d7ce02567558a2045124e3de91c11534306295f982306a418c4a87920706036be064ca6d049318327107f194c851c496129d5ca057401592f61cccb0863f2d2d21bfb1bc83eb9bfb6f760054748b24c8f908428d24fa660a40146951b0d0029cc0ea14a54a978ada0add6ba0ab31ad03ad555c9411f36184291c8213714d1a2b107e553569a0f5df35bed0d432a5125bd3eb14fab46edcad586361b9327ad92976cb5d669942a16553811c2c20a16af43ed8a55a1feaaa47b90cff0ac4eaa117fe10ed71818b9bffeb40b00b93f851f70f7a8e7fea44444423e6ab8bb9f4848b541ee1a10f8f4b842699705b6dfa1cbdff757a227b5087c51982ab3901d25c00e3577156ad3e4994c220e154a90fa880a272dd32d7a55e8ec24b97e2ba1443ec3dc2e8fb669768fde5184037c56a24a642baceb14f07bd01b90c4ac4ca9c8a6b754d444a5e001dc95273e05f59f486afbea88d1eba452c9dd95164514fb017d40b528e3720c82a9b770091b839c6a91b7ea9fca4a04131b060889080949a6476828658a0652fe323d42638b5c099064249fe151d2cf185572677a348652aedf4d40880a52522502d7a7a6eea63c441d7a7f8719b8bea869ff5aca83abf887bf42cb9131f4c6feab064c7e9dc053c30d3b580b83a4ec32d9a55b2b09be24b2adb556d60d2ad86cd72d6d9b8efb05a45bf6ed8cbd4f5425cc58128375831f522ba1c221a9209ffd132a39e9229f0de444957c76129b7cb6500f359396b9afe043173d2455190ac30632352f9a084110ba20c38c37c01244c85050468d8c1ad47065c68233be80024808b0ca0212aef56bad4bd995a638e1443e7186e084126111d8667ae4c40a3e284e0471861331d315f854842e0a2c4ee9a2608e07201a476214f8d23a0f1475a0092974f0047884bb4c8f9a60e2680b41874d4984601043621328089b18c152974667828f0923801c91b768c7c418e1f62308a48e892c5aee0f24431c1351a4ec8f13086d4c0cb5389224988920fc43881f43208009a0a3d5942548f901c958329181b74c8dbe30c3882fcaf8947cd18324bed841185f50a1842f9c34f962c951cde049ccb4fc1186b3e6bacaf58be43bd426fdeba449327fb24ce993a755064f2b64f084caa0d7715cb75deb6e32d51e402a7af8b25db783dddddd8df1097bacefb8ed5a77b7dd6d5a1d01a433e78b4c35ab6eefc675de277e60188662e7a2e9b33ba298864e2c9317aa86ba4a3fd550ee0f4d5f10487353e75f1046719f8762d9585237a5b258655a59eb76d5d2dd27f4057dd027fb8244fc05d92fa8c5e482bf206f35f617857d422e26d61764bfa076d176994e41412f322728adb576b7cda0edf6f6f6760bd66ff21ac915bcbd61ebd5abe398de72f7deeab51c15606dc7b66ede95da7bef76b78e524a29063beb5db78dfe8c08ec77a8bb715db62c7cafb5d7da6b6f69bfae132f8e79d2a2ab9cbbbb6f303ab891864c143644b8beb5d79d524aa953772e07de795f07725fd8c3d3e6888597c59024219e3f914faae4c346b6e537e48250144d3687c3319d6e98e609cf7c138f517429660448071d36560705ca5a3046db5174378feb3adb85e14cbbeea805c7914296f0d834c1fef5037219185a1c4e5c629aa1e833ffee32138756a1567e8ee49003b7791f90578665d9ce76288cedaceb9afc107e4aec4f3729414a09033551924295a04917a00bac12fbe30233ba1ba533220b2274d994100bfbd3d122ba144b62828c1f98c47450842829382349127e806294c41832591119f5302f8865fc2751079f54f954453e9d5e500317248135255b2b5cc0a483d2644a77a2954d64d05d246296dbc2e8218b21802004db50b75b6a12840cc83114eb474ca458820a068296ed2ca3eae98830852c96205221dbefb42802086c6b091274b7850ebc1664e142eebf38774a5a28a163401db5b885160891bbc560011a36be104204addc4f599083afe8635245b402a3c4f0acc027a323562c6113110834d402141021e26008c87403cc92e9d192349a50126770b4c407661c75583c12bf1a048552a8bc288a4022af9342f62d21722ae4e0e0e4cca2f898197978c911dfe6430a5ab744889bc42df180c9fa88226953e208d8070d96941042e8a306454a8011c694a022c6c71443f871d8a99474335737c7711c952f4c607ae20b0f80a184297098a9911744280aa3035e64e119793145280427578cbc5082ca4967dd3fc5cc2553a32344e10408fa473def38bad1eb6ebfdbbadc5fd77e2d71054f556abbbd1bf75daef33aafdbbc8ffbc00d0c6f68afb3a87ba2c931fd0e77a65383b83646594b297daf08dd5d6bed6e6bedbdb769d3a63938de5275cd8595e36ad8dd2c6f3b23fcc0f79e25e3b0bddf7bb7bbd976b71e5e4b9ef7adbb534a29a5db8aa35f29a5de77dd9d52da5d71a45f5869ceaa9ef6cf6bcf9ac993b4ded5ddadd34b76b6a4278ef7c1ecd7de92a7eb58e16d918aedf2e9eeeeb672beb9bb5b6baf4761ddddbd46413b6ef3ba25a090b9cbdc655664ee3277d9135664ee32289ef08664ede590c4759d0d43903a8fab41486d3b528ffc91ae87f68117c80f307ca1c72cec3e141d27275f55bf74f05677de572335473ff821016ab3067515413da22444027ad3d9ab473a138b750ae9578f1c7982eb2fa15ee7b9cb9060598ccad5e6ce625ff23c23828052c24234d6113eb0d4a1287265a2249f7556a3e43ab3480c8500f521812a8112a236eaa45632fdd955eabb9115f8915c5d08d7a7a7cb72fdd389fc89122f70285e7324963f7dcae949a93f5dc9ab2c1d296288093386208114b0b3ca107002238600041ff8708610b0b312d5a4aaf4217106d2174647f0200876b6901824604203216ce1831430809d3dd4b546cad583bc2857a7a55439f5d4494ebd6d579953a9c7496c9153cf22eaa4583516cb2c8f1275585037c8a8c7a20e0ae3982325494cdf5151d43161118927b2f8a1a82386b5082400a1052c0c1f14754294165b745efebed2174a07f954b956f98cc99e15d9f31e7f91bd15b0207b470891bdef441def65a610cadd28949439ba851149f0296246bcc09772aaa28abaced27ce2da1db982f603124765eca0081258e8800727a8c1144542306badb5d6da15647b74255b6badb549d05911555a0946f9b37d4f814a113190c9f69b8b2eaafc842a9c2280d89c00ef8327dc006f5f93ef7d9c1ce0b3cef20c4a510e25dcfd90fb2cca03a8cafcefbdf7cf6ae4336bf4665fe9d3c4e72bf10e1614d6a4ff3e4b047556a4072448f153060a7e308218b08b8318483438eac08f1290c0eed7d9fd5a74b74c79ecd3dce39e37aec67ac83d736f12a0add6fe001361041c102186f701228eb6adeb5911989bad6c88bb0e5f51da8658aeb384d835c26b9d3466b6fb06c1aaaa9083839313a47345a85b349f1d2622f6e928010149963acc7a5088a20f0a5c2353232e8cf0fd3085082eb010afe062e6031731a09e11174d585a851252eea645997654be964c8dbc00ba4900cbce6edfa3dbadb5b66b57e59e76e72dba3da578b3b43ceddfb771b232a58e64fd7e357172e7546ea3afce5bf81fff7f7b6dd3bfd76a55d5ae0b2d4fa9eb0b6ad3dff4600d0ce8b0010e18f20008582edb2eb56516f9a486b42fe45924bfdcfab7a66ecf5c6ecac5e539f21aa0a1a839ecbbfc25edbb904d5473dc4f9167cda97bdfe57b34984abd0b49b3178e5730fe1810e0d3c65464e791a4f9d282da35aa80ba567535da20cf22d9c6830f1847088c6304c6d1867194c0384e601c29308e3788408ae471e4581beb39ceda71dbec38daf165649e1b6558a5cc73f665be49fb32e36865c6f165c651661cad8ccc535147e67b740c59730fb72ea9d45b7b5dbe475bd2e5ada8e3f2aa4d545d554c8c8d075f5e546f7af29e2c27f049695fd007e523ea967f51280f1a388e467251daf4276bf8e46a4452a67cefcdbe27ed22e26a1c52f701e8eb63d22d6722db51845f18039f1f93ec94c6a3c3efd0bf3dcd7487e63eab5f296d5ea436a98f1b609acf0f4af63fb9a217761e53f089bfa06ef94f091a9730460206b77045760ef2ffa07c575097093324a637d45c91f669c89a27cf22f91fa461b55ac06a55c36ac580d5aa01ab950356ab21abd503562bb2243b7a93434e267ff520d85d7e8fee0a7025797220dbb348af9a5c3d15ed4696dbafc8bebf6da44d6ab3ed10ec6f270f4a4ead529bf6bbb7adc6bddfd2c2ea599b2d7fc91e5e012eb37e137558bf226beec4d58355d459a111cb2dd678b0459d1adfa35dd4f907616056ffa48d721c9f66997209cd5b72fc8e2977681e4b0b43be9463ea695e52f32cd2a5b42d64ea57a4aadca139552eb17916f2f48ca29d481379b27249bd157ab57b6940340cbbefb8222f890535443b4c1eafe01810e0beb4d5ad8dc063991e516194efc9d53e259aab55245e3552cfefd2ec529bfe3e7280abab6b28fdddd67e41357fa9bad5dff97f317f518fc55e58343ef0b916e34ba3bd786cac54c564ce23e4b3316be42af9eb4d33a64668499b1c23eeb4b22d2fad86caa59d5e903dd2af4beb52361e0128bc97766b47cec0f66544b1e6f11942da2ef3d2e88dbfab09eccf6363f5933a25ec057949da254479ccb06d07d8b69e6d43c0b605d9b6046c9b906d53c0766d907342feea3a8c0f10dabca3e8d2bae5b4363daf30036cbf4da0f6a75d3dfd14014182242001217d504847c13c31d43472978d031ca443214c00772314b2dd840ab838421a6c8e70019e71c21a3806843ac40114c91c97420a9ea99fd5127d7c419f90bf3aff98501e0ab0311bb33f2ed420e193d22c8fbf6aa4f47b4da952d1942c6f8134d020eab4ac4db7b69db4e94dd4a6c76c3258c32e796acc386decd2427001e18e22bc00b17758816bdee64f4aa3799ecdddae60439a7e69feea68c85fc02b87013e6c807d14e1f3d2b61a0ba2fd16c41d1e3d2f883eccdc250f13d896b666d1879771ac633e767ec03080188010a00006e091618603f420608c0992801a32421440838d5f0059034fbfe815331d7ca438ad0653f249abd458356269edeaff86b27fb4b2ab183b004fb6bf47d31bdff17297b2a32f6639feea9a9ab4c9faa70a99f6eb46b7eab3c25248ad2684e69f285394acd458350204e45b626dbf1006b6352015c89ff4857ed5704b216dfad73e40bd7e67ff963fbae56077bf0020abe1861ddc9d064a2eba77b537da75e6e080d5da9ccea93770bace5a5b81ee10feba2eb3a505ee771c93e9ef28520127cf7879a64d7f9d2cf0c93a67b23bce0b466095379df1eea6622992093fc0a7caaad0e55c2f9fb543f3bdd1b64f6a6446c9f67df4208dde7af3bef2c4ee038c213af830c227451a62c37d2f77a8dfefefa4dc70b2862ec4968a1609a95db40b289e64ff4dca94eccfc9f2689fe543f1c10fc2f2217db0484f3ff8362c7d7c8ae8c033042bf5a821595bf6f8a446fbe468cb51867ef083983e2c89846ffad2f44446bb2965ff7e0a433d0e064fa7473dc6a1e5676f6c7a0a03cbd196449af4a43e3c9544521f3e859d3834e03f8d16458eb60cc9d583a4aa765f655cac2b7daa10904c882b5b56aaea22c47a982f027ba9b2faa8f769d2037ef83e4d7a56a9d2a7494fea5b4a9f8a842a7d9af4a03e55fa545a58fa943e7506ce405a5853afaa2672bccf227e7f1016efeb8be5784b9e9f8efb11e90b2655d0108ac560a6577d931e9617cb1e3156b61050c7c416f21892520c09867c21592475eaad0d446aa5f04f8fb57cbf4f131f1fea46020053f598bea5f4697993a9f469297b26963eab12880a539533d45318eacf96a1caf17e915aea292c65b7da96e42d1766e25798f8a967f9263da837bdc9f4a9ef317dca24eb313d4be9e3402e130a492b440a817f3a10112151a9c91650cc008848588e3df84fe0e971e9d364e4017f060a034bf799918685cf01fba63ff9ef6881298c469b8525110e80650c8671e44172a4912786c5cf4bc4d2c61ef4bf5330007e6699e2209f5608fc0a035fc9914ee5d803bef8e096945d29fb18a4c2c2afb0f02d508cc24ce5d813be2d79b61a12ecb421c0bfd5a8080206564401638b2d9cc0fcb9217f15194207619480082320420a9660fe1c101714fa93d45ba32d6d519beebf11017f336fb99565ff6014765a1927cbd4040ea88ad87659a272860f7cf093e9511855f269661a4611f2cdf4280c2a21b9e30a6c662abe2006a66d9af67cca83be3e58bf7983f2a039e4cac83eba5b1a4e0b3facd0ae100a62401a1454e45305288e88edd46eb56cbb217ee3b8910cefae966e9fef3b47ead8fba30fdb6fe5b8e5ec4070a9600668b663099f36bb252d902267a5e00b41e0b36ba2cedaf23e782bc76d5c252d69ada535885aa6ef5241ad864fd78e43c0b961ce586fb70276edaad669ddc86edbbc1d535bc472a0bb7d68f35edaadce2b12c0ae5d2f2c9796ee76dc4a956241e193490cc1cfebb8ed5aeffac28231b9750ed422de62102d82327b42e484be3371181d08250942027464079bddddc88f4f9b3c58eb753be890c30dd686213508e9e101f2e3051516e0fdad5dfdd6faadb507386a72d8cce8c0d991420ef2a969f33564cc0fc141b276a4a0030747a34c50dbedddb8cefbc050349d308a25d52d2e31a509341b109e76791f188a26144b4ab56a71b1b7868c8d275fccd60928dcb8c961f3f46b14ca03e7e9e7b4d02e16cc531c3c641d36a4a5268e9fc1318363a63c7db28eaf3a409c195167a6a43735b28d8ef28c409ef99aefd13a489a71489a73902c6ae228cf986c63439e51dd7083c439a040863a9c40763bb46c6a6c78306d6a6c6acad327cf7c7d9a19134a5a9261cc88058b9a313139c6869154b16e2049accae1c910eb6083ecc21d64481bc3437e796ac68c4f63c6f2f4c92f5f1f868c69b35f5824abcd1811303581c81ba8795f25c260a92049b14c49b2226b4021090131ca3bc816286d9d4418ae93ec39d4bc6f6a21df17ac450901bc0f824ed60c93e90b2bbb7097b6ec8be7053aae033df003c1d0499cc13034855c5cd2d210c0f698dcd6c65cd147476fbc549994deb45ff70fddafdf6baff5982542981e8d0114667a34c60f10acb410250cc20b323d42e3091959e418d8bb71dd12a8f0d090e5fa5bf6f2cc40130152f0e4de6685490277ee18dbd3103f9142bc65df44f278cb7e98b9f7c187ed87d850ad65fd08b9e1de5bf288644f9b56ac61088d12d83ef8dcf7701bfec0451697983c73c8c9a357b1963e3cf0862f8c814fbcf301fc03084f8f904aed58952eb546ca983c73e4719bd67a403a0cbfb285e84dfdcbb962b78a24d9da2a9e78d672d77a4fb3fdcf48b66fba209f33d936c9e78d6cb75a9e1980598247af47ff6817cb8f76a17eb40bf37418b358cf59ae3cbbb0fbaefbd12ed38f7689f947bbc2fca35d60f8a35d5fb60f7ae10feeb7cc956706f256e20a848a025a6b4fd5d23a03fb411c1caf4fb71d30ef9c64c8c9b17eeb4b0a7c76f6e4a3f2fcfcf00327ee90f4a63e496f3a6fc747686d27eed0a7e28eb88331bda10f9e64f0c41d2edbffc4193e71a7e69397eb9f9e7d30ec300cc3b0d2ce64c51d5b76b47e9fe9fe56deb2c8ad1b0f28edfa0910dc91035c8d32a5b5f9026bed5abb56fa011b437bec8ee917ed02c85a6ba75092adb5d6dad2ba6daff655b6524a6fac7771863140d5de22d6dd6d94bbbbbbbb2ba55b8074c656a39f4229d7995c9f06b9ca7caa9067d6bbd62bafd2dcca2ec12ac45f33fd9dc20fd8b679cb5602f6834dca30830c9db7eaf749676707d8dfc59d76dbb65a6b2d8d317535b24d737777d753ae24cb5b28ddba7f86213665da5dd54a86dedc989ae33e7d30a4a2cec94ec9536c92a5827a57aad22e96bfef4ba8ff4e6ad7e9ef37957699fe7e2b75955e6a2bed029fb3d2b1fea1a59db9a2c0f5eb92bfae2f712cd6bf692e59213b94ef25016dddbff60446e4bb226d0848eb016a7da0e6fd98ca427a953651a457c9b83c3d96ef7712d954dabc2f92add4669536ef87642fb579cd8b94eb52b5d2b1bb54833877f3dbbcfffed78382721154fdb8d81e7439814f56de7e63751dc62cd6bf695e56c6a67d7f856f9ff5fefade5a12243b92723d3a5a608edbb2b5e599811856deb68f61edb0edd0e696b4fd0d39f42ba6596d6edc0fb1616b1edfa897b91a5b02486762e837334ca6fed77fbc17273683d3c28f189771bfb6bb4f89b09b712490ce9c1fa50e06f5c6204276236c635fd7c94ee0a83495effbdcde8debbcef0bba348e4ab7bd36f663376b8fb0feac409c8f1e2029a571c4b6d89691559ef8c89136491f60601f463cb7e5b6bcff0e742bbd9a3512ab3eb0c02757abb15c42e0faf57278070d9f2d6302d7c7f4ed66afe55eca465ea4296db6e5389afd09633fa28efd69d3484bde51849b76521c9c251f51f06963e7fd4fd4b161117a371004bbbd9aa7795a430e91e124a24ee7a466ca5cade6a45d95a87bd2ae9ac3c4f49767f366cd7712b43544bba04e16d402ec7201ae37d9df53c264c774d120063acb6d8dd818c9d5fc65b95a139132da74ab2139f24a69b38cc286217dfb4d1e21e59b200886a24e8b0c012a5097903180f33ff92fffab77791997bf9ffaba931affda315fee2f79e6c0cafd9c9091e4e1301a9864d136bb30e6db6c93142fad9be1c8ae364105f8b4a1683a61144b6ad6cdba59379b650f1b8622b50b70d5713dc135777737780a376b69ed0456268759cca60cba84e315ccea6e216fa85232f00daf9a2136d4905cad5b32d7fe9047c0e8773cddf2bb59df7ae34cf6e7946fb57182c7677d3ff72d4dc42259644c9b1c576361cc629926e9d5609ac027a5f5b494d9ff8515e0b3a392fd794ce9a8f40ba7abd21ccda1ce1272a959a53549c0473aa86de738a594528a4a754ae890d021a1438295ecdf5989fda454ab1617d60b8c8d0caa5a16820fd01cfefd810f386d779308c397c116315b1bf38e643fe201794864feca7199bdb4d4ec0bf2b800a22f52eac3ccdb6b9179c82df35416bc239ac3dfbda32c43dac8a0873534ad2aaab9dbb8a94f22b977548073bac72b964bead5c31aa13cb8ef13a237342ed03cf9b45d6339655b02d7faf5c363b5ac65b5bc569c86559e3f9627cbe65bca133f476b81a68259526f7d4996326497a9bf6c4aeaad55e9529e2cd6f3e06282cf6f879498abdfaa562d2eac1798d1c71714d47518b358aab085288fae8a1ce47a94eb09805cabcb8e22fcac174a97d07c8fe64902661c451dfb53a386a8b3e58c00b4ee9a013e29adfa35ea570f4d174d13eeb0414dcdd33c0dcdd3bcf9344f6135277ccdd7943e63909ab7799b92c8d8e5129baff9d6d73c859dd032491bf2d27a057fd00c5d50e093ba9ec03636a417448e30d4588ea1c672979e5067146480cfabe405b7652145922d8b5ccb602225d6e17fd3c4c1e1c21f7c4b480125fb7b493c25d51af1fb2c718686d95819f8f482bc5ab7d75e7bedd53c15837c41357fd19497e6af1a99165ead054a578a57a33c96fa6585dceb82be689ea6b43dd096bfb34eafe6d5bcd3c6bc17506a04a54be80bb2e72e6d8cde38113e3f262b1ce1ed4faef6eabce53b70d05da24c8f664ff28d7d2c9801b9b77c531e57a42c70e729d36f5965812bb996b593963f634659f684f2589eded0694f4f96bdbb6d4a6ba495d094414cb23fb53119e0f3e234fa8bf2e580b260631dc0a2a5bc34a35b6b530abdf1b7b1cac2e501cde1efae18e01ce1cbe6a90ce8cba6acc13528fb8aec5ed0153c23aa2db3b1d8355ac195e349c91175bc9a27c543b2f6daf7c10724405d8d74d95d238f57704f571ee1780577b7bda0b53f1800a97eb3643de8820d40482fad7bbc82653e0604d805037c525a0d3d3528d717cdd7922ecd5bfd24d3fc0219f8a4b4d8c87a5639ca945d9e2df390fcd5b910c6fc559a31176a486de4e7a78614800004204cf257cdd7af4afea2e1f146926b03b559bb3c1b28d74a5493bc55dfa6ac443d366fbe59fa50af6f53d6f8d318893a2510b886874787183d6239dc9105a6f99ab7f918b764b1cd30180e13e013670184b433e22d2bb97e5d6a33d6202c1480b9a308d79e1d21f4c61fd4a129410184b45d2f842e27d87e8b3b666ed1074f9bfe43cc2534bd23532f9094328fe3e0c8c07941aff10a0e3f0604b87bf0fbbc9351b784f214f074cb4bb3810179cb19d3152c27fe82a03c78801e04044980100598408308a44836e15b489a4d205b48b2e567c82d972d7f5bca27ef2d9f7c18f22c9261386ea685e35a665a2ec77a9223c9a7620bab2c594f921c8bc57d4bcb6fa2cee5b8677d8f065b5a9e355ec1e2c780000f7942d9bd20376f2d484af6772ad9ef94ec3b8a30f93631c01ce5c17a7f1ecaa33e8dab809afee5537fd5fc3f0da552a834ad97653d091591240010006315000020140c06842291483c1c4582b2f614000e77a24a745818c963499003290a21439421041040001822022345b415e2f48ba4f30fc2447f4d4fff1e4e4dc713d192c9ddc757c16a68af1e69063a904f6d60d70891da207c40a1c1d982ffd8119f0563ed037b8e38dc0fc0323b41fa8ed9b98adbafb9f070be86b7376bb4f1571413030b5f3137db0c5b4597f015a28b19c63e169466ff07ca515f2a6ab69bdc6cb2d56c7c8d4f0b2bbbc4e5f5e4af226ba657ec649fc9c49737e7f23f9acb13c4abea4b40a12fb8cf0bde724320695ae90daf220e88cc465cb5acaa4c0bd9505276eece77f9b275c136af7c18c0e6d910d195380c35cc170bcd2bf5c5c0966480316fa91879c9ed3bb9e5dc5cfb66287436af0abb199bfc3e8b81a63b993a1c05cf63eb64f904dbb113ecc8c841e5680c7d7d1fe76117100f1eab999d86159b6d2261c9e53c80e9e2b8d0730bb2af7c62e14267ec11a1099f461bf5ec8bff0ac98f427392e0e4d9a15115764a8b16f9c29a18bd378bb22a51360d1bd71181f1554ebf53260bf1c27e62399990d26cd213b1d2f08f015cfd85e98a7f7dfcde4b0e507162cb811fc8b465aef05a4c9dcb6b086ba74216bd2bfd40fef6c629894c4c1419ab25388cd80b957de8a5a20ae4d739056f4ee4dd46b8d6cef1b87bdf6ed83e0ed4fa42d68b213ac9684c7c213d1d16e6854e58219093165334038361981f1f237e972a3ef5467ec2dc802cd1d4d9b776988c678491f2b892450195676432965bb9407796c5bcc45a430285b1769d3f994fd4a8c8a88524f6a5b8283ea5fdd1502e97e8f5ed3e4b63abc55385d4c130ab10b4a8741eb00d0fb1fdd6b3d1d5b18b638c41bd165edd9afe8ac522a335cb4b21e1f6a95fbef1d0e095004409e3e949757531d7bc0034d7a2cfe3d1ee36b18c7cfdd352d5f1558ca34c094188912fbc726ddee1b6ea02b458041473a9da0291688f50a26092e810f963ff3ff275bf476bab74e5d88fe84e7b5465d8651781beed3ff303f05e12dee0e52447f82673475c5809850eb087c9dd6e5f93159e3bc27734843fa12043b862da6dc30eb33c019178b3607cec9aaa3a480b4bfb64a21dfe3f8c39d5b51b96260da4c7fd35d73b482024d9b15e61832b3cce02b6f39d1233b7fdca1ffc9f84ecb5cf00f949fae2371411ee290297ffd4d9691ebc58d98fd740fb4011e2ea2cfa5f7c4669147fcfcb5dea6cb536bf2fcc50b731a1a7c9e370a16543c62993fa1012cea3166a1c559ae88ea1b0c599b1749cb02e4c345e7782990bf13cb491f80f245f39a65815a01920a077c573a5864705f4fb20895519ed3d94ff6a34caf6d33f2287449a1b6f27842df34cfff4d4ac1210a72f1e537dada6132b83d164838a0cb9f05ca8350ba23e5e61408acc479b9fc86e19ff607f5ab0294e75841a98f29028a26262e4a6103d3c240e5be39b8de3dddfd07264093c2c5556a91fa4cc2092cbed41811710511d4d58bbefd9b49c60ed5dd61d071f009d57c12b6c24cf9344b5a6eb898525210d923959215ace32d6d9d251aa482ef443d44505ec790ce9052cf6d2367983867514a114eb086b9be149dc44a26666a4283da3675348fabcee9ab0423400d241e7257fa18bc0e894cc49d29c5c7e456fe9d67e1d4582353fb88f112f1975da46373096e2be2ebffb77f7b81926100265f78d08a6fdafad83cbf723bdad1d4696fea4d698728553a4213a8c27efcdf1636269c0a84b23abac9743189fec5a1ce8e1008a9e72a98e210998f9f6dcc06a518d8978a7a0abe11720cb3b02f2cb40e46837d2b458d07608a8372fd4de0276e9c3fdde0396ca00473e3b940442a750477419332f3aac20e78f477beb45bb8f18f3c8f0ef55716968d55b7870a6fd1f9100f96733e358e2b82eb9ce4978839714ea1575c51d7459493a16b97648a872eaf09253970cb624877fe2e5736f70a18efcaaaaf5b72bab79d7ce9096ef71e61c105681f7fecc3c23e5e87dc416044052b7860d45e86bd12fa941a0c5dbe8048731e47d1b34e401f739a4054c913ca270e546bab91900939573ed9e4b39afb541089d1c1a9d9ef27a6e1d5c9923a920e5b7794f815364e15d687f61186c0da3783504796f8e6f406d92fe804376ecc93867bd95f3e0e665307d29b37e5b8379c8e54429943d51c7a2028b828e0eea2fda7f62aa1a085ba3f6d0c19a385e2f345c132afa28cfa8e3733a290bacdbac068f0b242b3153e53530c73a1fcb5ca670eefa156a50d95414c1410d7ad52f57703ca468d97958d135d653729d3597f08966d3c5e7a44769f5a2efe00daee4591d6f2138a774c365130790fb4afddcb5d63b03d882638ff87d30ced3e5af33bc5b46e7e78bf0f9ae437a93a0586f1ceed9648be5df378fa1159bdb79bb9dc3ba8b24e34472864f3cdab9bd97fe8eaf0fd16aab768aea49693b690568d295c42877e9b1dacd78632bc62261cf15f3150f80ce80e08525024c583289a1e364659aab1254dc116de0d6381f082ec2112aaf6d1c140f26798375c2fbe8553806aec1f73025d0fc3697ff22774e8e6798437e903a4d35fc50d94f7a2b4b56bac9143567067b61c68bed0a1a673d68cc7112b1fe755b4a9bbf8d40b2d25e095c2d75537873e7a51f3c67963e47d651b5c1c05ed5dc11cd98299b0b386ae3bff1adb6191dd02844e3d8cac87b2e2a41a976cc59f568ba1d1a769ab3413457d9bd0a18c3995e399de003aa8dde850899e61e664f2d3e3a185a97eaa348a47ddbb51fcf79d74ec179eb191caf5e6001cfb4ba546665d6ca21c74fdc74b113a53761c72173c0eecf6612e8736afcff56dea49b571c4856513bc23e433b2eb3b0426a90135243a46611fecce0dcb0ba2c2c7e4253c1b5fc3172ec8bda8644d50f6e2a49ce0125adf5a12a90aaef5717aab9ac8c119e2b19952465323e67d32ad04d016eeeb49a8124f388de715cbaac2174130c5bdc81c21960a2cee81884abcc354db31e9e47029019b56df64629e9763bf6557e13f77248a68e71cde633a283c6a5c9d2b435bba0954614be45d20e97212a54258e18e96b3ba4f9391c3e6094abfaf26888d1701ff81f9e0c15a154122204a468c59d49739704e6daafe92c12f431546f41dcfb7e22d4fedc679526faf948502b149eddb70c3fe440ea4ef14cd507c189d60d305cf33e5f5e3b6d2c70d46e1a83e23011a7dfe23d65b28725aa8dbb420a27f4a51fd6ef0652bbd6d3fc533bcf841de6bdfb8fc89e9b20267cde39e1ab80760fb766e8121e92412a69e4b234f2fc5296abb031e74d730ca5630d5107ff18f1ba784e459299a241bae9164eee88949bff0bf17fabb9d6e77f27bd137c338a0d051910bcb0a39bf8695be9808830217a060734e64c393893fb222304b1836fea1a993fa08113474b83a52ca15a281d142545b529fe3c98430a6920c16792f0276d395c6d4ada8573fb42fb5b34edf7f6e6a4a73c525776e55346b49278b8633a6921fa04c459a22752edca0924606206ab874efb2a4db82b411c1487d328ab14da3fc5595d408966236870e4df424655e2297dc9e9142a8d6598486460acd4a0f9bcf4ca2b57bf7e9d6bba560525470e02bf4921189b22381bb99587b253e528cb55eb0e4179ef1c7a50808c70abc94f99d2b153cb7465b51328af38bd054f761a55d02b3b14a5759910972a61259b9859a6c144259a833035bf339dc23f942c9dd048bcce548029307eeb0411e6b4eda5ccfe5a4630ab141a3bf84caf06a9a2cb1f8c0a4632b91312477802381cc91638075f9bf9c96c10250df4b26320485ff148b5127a0c91a7d0d6451ff85f42166a1fb031d7b64c8a1a81d5c41118c23bda45106cced4dad83e07d63280cd3e1215a91515755bc7e7c6d5091b3d9c35d462af52251c2261cca4c4f274466eb23f1116d5cd0de3b131de72d4bab0373a49615a3a2267129afca78812b297296e0d56cce9b555a3e029e82e0cca97c7cb08828bec68bb5f17621846e66e29276741aa12b3e3ae332ced5dcabb22d000f5e1b9fdb4543941f7c7c70176ef3d0c02d4d4a271d6c5ac6f486cf116baae740ba4d5e41a08aaa60de9526677531bb21a025dd15c2f9f3dd826c07f3657aabe6de6b31dc83050b4db5e35f3250df6d9331d8c7a16aa85d8d733a4189d6ec756021359c5b8c224b67a64fb1993ec22cc3447c14b3bd7b89f723a5fd7fac1536b41e6be026e23a212c7cdbeeef948d108551f267707873be2e03677d30ce903f73e77bf7684173d3f225abb8e9340509458726d33358ef3ea9a3f36ea853236ee3c6af3bcc74b91e5c5aa9a3b7ea501fec67be30017cc30cc8073914c06f079f7e9c6e9beaebb7ccb40c6e9496cbc4d79a2be2fab758dea5e20e00e12f97da943833323d6d2c4e9486820a98128ecddd22336f38992e3e7e213e4a10a5d60ca593fe4bb225d2bc906c726763a3eeb1a586f451b60397d4740640cd930e09564fe1c615c7cb675a466fb3e24e299a9c7decce710e10d59edf1ce6258d1fe849f6aafed3d7b82b11b1f46b2b71669870492565055ece581e7181252f56f486a2e86b3084e1452b62dba8743026688d45310eae8d262ed5bb39903a3a0c0a962697bf9a36a04368ffc9c5baa316f2f722c85015847b47bd3a7ee014d56e34368369352c18d9b1d0fe2ff4cc53002ca909f25a6db127ba8636aa0573897e89b221f6c0344ca184ea908a404937e459596cabb477c0cec3748b64e2d840037e23ea13eb8de374e3aa134f936d16b2fdd46734e29a866d0bc0168ef6a0ebec1f5ed671bc65511c182606cf140f2e2445bd2037b62ce970367958d33adee5bdb2f8076a3d12caa1c4cb8c8d065c2941a0d2c31268cf073619d9e3863c5851098e150353c92dd135cceb7859f5744badcee59fd5621e93210854a9c7dba9ba0f0a2fe132aaa5d970851a192d4673067c982daa39ac0dd5d5bd0508c563ea8743b0c1c8afda3bd237506c992a8e8141bc4c541b2f2144065f225758fef25f5c987cf4e5fd2e62c71323d12a0032e7f21f6c3b7a8015851db6051638589da061dfaacb540a9e39537612fad6bb7255677a5adf0fc62f6c98ca4f7990607c550e7d3888f942d317debfa6942c5344d3de50586942bfd982ad0e6b483bafaf56b5cb992d7688a640b050b5e6157a61d61bf75ea11dda9e666b879acef31a9d0b74a71ac3d2e811b476f9b98d8d0de40c46bf81554dbec6784155a3d8b510fd51d9251e6506eed305521f3e918844ee003e6248f0a7ca48ae01187317261f2b3d9f88f8f7ae19e05aa4148d37c5ed220f6a7d26523ddfbbbea2155d55ee19b3aa9465648d58b5efbb36d1966ea5a14f9ffa4c2d30228d6189a49ad7a6d6a13f7a929dc15cdc268d06ad96e265f3e481ac1ab782ca00f514c1b9552510fdebd18282c8fb29f592ad777e030b62530be299d3354b5d1b5f6fda2aff3708f96d1767ca12a47b9e629dd0b51cb914dff685c8a1660d080da4fe02bc790c67a15e6b074be5bedba1f98c299aaf830504853bb0667f775ae08e2f2ac58d48c83b32d2745069e4b15a74fb4d3831d786f4d9f6e350a6705e215bc049c4449bcdafb5ea3b5cf1d61b965736da200a2f7c58c6d59fbba78914685d10b29fba3343ea3973f944a1fc2872593f0e5db062e4bb6b6808ee263141004c6fe5c55ff9a08a23e3a15aa75bfed347e30d6332b6469484d5918f5bedc897589ff9f952e8c8a050480eafc02cfe68c6ccbf06dcfbe7d45b65daf184e7e78bf470dc4a73a32954409502e91ee96cb3822f8d0544c399525fdc03a6d9482f5d800fe73753a0e0044c4ef423da871d4683a3dc4a74978e01018a90b91f8e966bf463d2901fa667229f4e79aa7606d6a607a6432108d41bee29a6bafbdbe107542c3b95e53047165ec72601d60c8bdfeb9efcc83e76c04cd97bae9c98b0d4bda30020028b6c18f4d8b0f24563b3d31e7dd48dd133c893c1547a1d8a7e431ab372c97ba97e97eb0908f2e6a17ea921df51ca0f06a1d8b3b9f1d7122220250c85ca84852c6c72a8ddf12c08e71c90df48067675ce3d0d2692fed7e7a8e9673c10c910b54cf4e5b80b5638cd4ab78d230fc5c97eb7367263bb9dd05c3508201f61a433d0c297022047db2ac6fa34056d21df9bfbdcb52d9280239d6bad7d31ca415c71070169b2e06b601e6816ff766be7c5c4f8f5f04cd4916466b2529180b6280ba49ff0a0a57c15c619d00bd4e090d73cc0210e6c441e2e1f270543fcca294e89ba0dc15d5328f8e18160ea05bb9c02d8fa5f14482f4d5214bd8628a204f3e037570f5916c55fa248c7ef795aeb1dff3c72e6bcd5cf783215da64c39751926e9ed731f016c553ad2dd906b60fe4b27011364c771cfbf1194144d4edb34d20397e57f80f4c20393d1c644291d69037831308cb673f5a638196b5ef4c227a01772de8449724e5e67eccf54cc380a4cd5cedbe20076d8740365b073d3172d0ee78d1a231678dfad6ec97c2e769f9055f856e634f05f4c393a00052e30af0fa1702aa522456132e1c2c08bd0058c2bc25a9a5b280aa3b5e43e8af2e7c0c3581951ef1d3e7286107f8af29a245bf8c5164ffbffc1a70317bfed6973de62a3b404d389579626b1caae5b975dedd2fdaeec320c671f957efdfc85081fdbe1bdc32850e75b01bbdfb8bd4831110ce7064c57201d0b960fe088c75030892d6ddba864047ed9529dfd5f9a5f951b71a82406c25de2868467d1e3696c3ce861c8faca13c8561d1e47ad2b680092587048f504628fe3e15fc26b43396baebb2d094be345cf6f4d4fc6a4a0361da699a486e4365a73b7e25ef05a92ee565a56dfc761de35a5115a66418c5e6acf0cdc2b96431dede9610d9a8a4e0358d05f77adfab14d1e769ebbc88137d1347e4b1ca34149340c77b70c70d1d4a1c5295b81aaaa4ff8d02e5002db18a4edd6e1822fa19ab8e18c3215083abc1ed1434dfe25c18a74f2198a6bdb74df9dce9dac01fc3fc12bace5d246ffdbe48a2792e90583505bf874ad49cfa1d27126359122d1cc3cf9a1e58f59650a333c481d8f742fa6323233d0da655959f1227963ffa93af05381241dcad0f2357fdbb64186c69d4ad383560a4c0b7c197687155c12db26172e0fc6e584d842057c0c21e8b27daa66478d69864040cbd9367e103d0655264056fad001d1e2d0960c1d1d9e6eca8567a71360134c9db97b0974bf721bb1a3bb49d42c720bef5f7a8083581348d018ad659104ce9416181fd456bb07e1b22b871027d32c1ff47b3b85860e19a3958af9b07d7a0d7dc81775a996f6703d6ef86a22f49702bcda21d1d577a4a11a9606d7d38c3af55a7e7ea345fc2896e39f725eba39a592c78acb39888d2d8a7c56096df0ba6c25f9cea01bdacfea33f70021cc8f8db201f1f2e1902b11a3af45179bea2daa591cc974237d03f0d565afd4d168c8adfc36c40cb41187ae2d1286b6b324c37e36913bd5358ee806b1140cd8fd08ee744b345b20c1c51c042639754b4cd2e1722a6d236799a505823119eca90d541d5cf8832ed3b1897c040527f6df9dfe1b4ba13b1e0b0a0f4bb0134e6c2c02ad4cf654c8e628b556d98b8716d2b8669fa87e21da854775e65f1604fe6c4aa922c6169f950a376e61a010bb6654b210837d330bdee47c8c911dda103dd9140b7fed7b549c5972b91b93bd44b75c5a19cd59692a23249c17bc7c45589db1e1a4ae041d819de60f9c1ef447bb0f6c8c27760124b179124fd9b9de9ac4dbce7f66e42921c177e89596d30c40564ac5b9026e3b40fea94600ae81033ac4cc0187098cb06169ad8bc6128e6d588792665a251e541bef85a34a8ac32283ac04d099d10201fad9b9b0b226a8be9bd69bfa7188b89077ebbd5af7ae1e5cfc014337c40ce98c7ee59a01567ca420db8e4ac7f5989943283001785215a851b1b72f6cd0b8f0ce060c8bebcdfd8021d10724519c8de99b6c58f4e0cb5a82699c45c6db5a006c626083db0bf851c87311c9d293864553c35bd39ad673367876385cfb4d8129cc3f42688e2d02593fcc84f75f8bdcb3fb26b9553cb4f2d0204c57967820e60758699cd57ecf138787b5d10eba71a6e7d0f43ef5755c84dd489e5fe4257d32b9fd308b1a162f8b7c03902c9a7c3e492a898b63eec5a2835dea7187bd4c943c9ea79c44f4f3865168ec7d8a066bb9b7e34cd5abdcfd9662bdb687ce7bb0d4da357d307bdada65c96821f711cf6da7a5ebd80fb0d0c6ba5500b4a887f3ea5ad9460ddbf49a66937eb7091768afe87294eafee14dcd68565626ec280e61e63cb1d10549c6ba26e21399a3492ad670945cf15b9f6eb90e0ae2f030c9ffeee479eef57442c06f086c1444b9cace4b48ef3700650164ab12a016b9fc3d4126e322778242df194221daa0527ccf21a8b66b04a568896a90e3194aa488a6f6786b466109803bd05853ed17f2a41ee318bec8a1e1611194898530970bc0faf5ac3a3f93f4456714e181e9169647da2171f9603e3993adf06a821f27e99486182f9011f5b040a90b02877a41609eca58c5c1ec43add700e88524958584d373dfdd150d1188165c65a2b3d3043281689df0d9600a575b4fe947b0a64d76870e387f06900a071f6964c99a92c5f180684b4cfbf9157562c0b88ee1fb357628a66314e4b169622712125c62fdcaabae8c3cbe2f1101c9933d251189edf1ad24969e1292e7a799d8efc809c73a73c4ad34cd233023d5140c8a6be8cc3eb11856e599523d7738b46c3b951afb65fb9ad1cb01d0e96b892c64e09ae38227315c54427498ad5dc5c87a221860f407b0aa188041740b44c21dbf56f9bd823c085405b66d928e58aa0cc82945db570d993f759008a2383cfc1218c81ab2079ddce9f49d4ab4cb1cd0ba32022bd35c937bbc81cbf6581ac00de15eb428ca1af8391d6609a344649f0518e7770b4a952a0256f5cb79c14eae947aa0bf361c90553a8f05216f36c242b0e29f68f7cad9871996c8b8ab525482c034f045c1bc3baacafd80d5583a8df195e52b5da5487b8e4e8a859a31254eda063a56a7c379b4b38b19fa0d0afe144d70a82db8faccd885ce0a68c612222b0748356d0a29b06d375657586be45ebaeedc5de215269b78d2523de339053683052b4ac6bcd737817eecea8d9fafc0a6a215148566d5f95971cc57a8d9aba56c0f686be50e596c34ef0d0ead24bbf82ae44bc5887d80dc99a6d681550ebb292a0d542c334beaa1e6570098a8dfc864ae57d49afb65924cf3b3062df3bb70d6fc2f1eff3d819e0592289b160159d821e1894f604b3eb0edf3169664c5fecade5a663f233ab8d947dfacc2476eed6f00c95fb2e73edfe6d5acec15bc3ffd26beb700bac132254c70798c7b02d910664509c74967362888121b8a51319fe9bd3f1597cbacc0ab96739ad039567b36c789ad96cf4a0870713fac597b355c5902b1f6563a5f682ff034651b9dfda0b02825287a0e615d9880960d930b58ecef465f5a4d2595f9487afda1a44612b51773c3ecfd827c7c25a99b0f44be1a0da808956434b60a99fedf5ca0db6e1e59394a9b5e4f813fa901f6487a3c8aff5020f9758cf25b70575590ba8138bee3d3b4b7077e9e6fc16e75d51ecb7dd2ded59801d18b1a14eb6cbba89d1708e44391b940eb4a79e181d88e8098ffeb4e742fea3ef218b9c87c8074bd3fe2d85b202711dedf02b55646f566899d57f6ed5220fc7588ed8fee69332a1e745515ea98abf77276862aa01da016aa1f12e9904f48a9c1568a4583fb221a5fa1bab7af2dcf9cdee3e5ad2c873771acdede5c5379e928d386c2c521f9fff99ba346d837b3556478fe2ad8c2da6a454cef354be48113d1f2e7e9972fb9de25683ce7962d63b591feacb950337d5ec1d7b07a92c582ff4a8894e99c7f4346c3782f29e17dcdd9d1bd72ee7f7eb321fd03fffa31e4fe945e7d992117991aee63a25166a87da6af4cc1a96fbb01fe02a23262ff358d2d779a4a1b56de4d693c858c7923329479451b0b3579ada5bf279974d6f63288007b3e781746b7a4150a064b0843adfae04b1446639169b090e5bf254fb5b40f247d856758e2a46c58b338f874c5f06e3a23e125e0db348a6e3b3e97c158f8402d0f4568a89a8e6700574dc31efa26d221bac3955790b02b2071d2b405d89ac3cea547aab163aa0b54d75460204c5102388e40f3f7688759939a203a8176e4f11f4e54a46784348041d2438abeda945c5c851bd129863105716ec8576c8956e4982b56009a9106b20c309587d335fa2d0b6c92c645b52d13c6bb1e57efec604c93c5b4a592a6d3c0f00549877646cc1116f385467de1514f40d035147613f81249dc990817bfa1f2b2318261d636cb7863b574fa050f00e6efed4e9e1ff3c3394491ca4e8717261c4e88dfd767be9ae250f02c538bea83755a85fe12cbcefd7c4c46ba9c10c5e34ee73cefaf5c98ce155d6a3a8b6846fb4d0a20cdb476b0993d14fc8f33765b731c8943f0a371da0f43b31ab5b035b55c7ecf20bc733f13fb213bf36812c9ecaa28b81c162698f87584e7f6ef9ea5804e24dda7d2eb777601cd80acd781c7fd5ee1dd0f2dac47a3bb0272a48aede6418dbe3281a74ffe84836c112124ea106a9a043c79658bb95c84e0e97e6db4247dbcf73217bc2ff686e3b67c3640c483b28aa21d6b18b13856b62dfbd8663335013799cb87648f4a0e621661bfdfacc674ea3a822c82fd6545c87303b164f0cde8ebc3fe3caf3243a1582e81229745772784da17c6e75756e71a2c489d5fcf140bf80f05a17185353d479680ea281a4cb626bcd58a9c424416c4b8d3cf3739a8cd377a238ecf6e0bc8fc519370a02d6926edfee3c419e1253407849257fa45d5a57ad72d5f7760ea68bd335a432e0d24e87838872cccd5a28d6bee2d4af3e2d9fb8421c2daff343ba6817b43c93aafd49a3a12aca37aeac2d93960485b40ecbb1b41f3868c4a29b1f4e6e56f31558848e64ac3a4967f52465c24d6b3e962031ea8e1b3b78b14768092bf7dcea3e8d52fae7d642c446447205ace98636e71ad10c2c2b74393db8ed51ea8ba89fe34ec42d9bb3579207043ec57922467cca46f905695f31d40d419c7d8cfdf9de1ad004d06cf2d799514b49547f677b74c85cb80b5db8f729cab6493356a478e8720868d98a6847ffa501cdb5f791545b6f0530c8d1b387493112742bb2d7d99fd0b7616596ff463c8d9cb047503f1dd80fdf7dfc232f66c02e64bbd28f91628807adbd980b674854060e557683bcf7f4c9dde6ff737224fd2695d5c220435dffada9eb75fde95e8014e36d9f7a5f95c2ac42bdd2a7a19e575335bea0f04f661f0e536f2ff7cadbbb37231f367dda0205c82a66154c0901c127445429882321941622505912220a2e9305e82777d83b11664fed988ba9559894b5af20a2d543588ef6c659f1a9087c2d4ce432536f4dae1397e2de01080a511541a3869658b18d1133835bbb8ac4ee091a8680c8c44212b700d8cf8c3315ec8a8273cee28c08d7423d3ca6e2fa013177b01a50cd41e1b9563c729d863c0188c16166f28249364dd6787473a1a4541949eb95f2f8a140457767f390163eb973f9f2162c5d000ef661cdb2fb754f7457b1e594100754615e0ad9238206ce27e8a89a6b10780490be848df2712105067acb62b57d215bce4284b7c2121dc4aa5c9072289f49a412907be25cc67046e61ff2e5650ddc3a54a8efb9a404044a162229dd213c47db10dd5398a3195451940e70ef89114f177da5ea7d7cc6e9f0f4395bf9346de6b30e50696f05e93581d07ba1e8891a5421e74eb8c298e9374b6d6daf5802fd311c8c9a8e1f8f36c0735fa7c02a9b34afbd489e9c235ab5797ef8bc337c125bf0a2c98f6cc9045174819b3bf86be8281cf149374a3921f8a8b0361f993053184c804cbf8dbf044f383003c63c8e33db2d2ca4adaa333d90996e842e4cc4f00cb8ef2ef03d2af4493e1000789ec4b1707616f318192090e53ebbe37cdad2c652e3c80028c8f642704ef42610a1c9a1ab8b8bfd0907d776b82998aafc63044b51f7657db3cca4878be5b816b09243048dfeea67de1b57bb7c445b087c68d91bf298c5a4ac332c1e8228af059e919aabbe0692bd4916e18b841c487969e8e09aae49958f6cf00aee99206c4cfb0adf5e822d1d79eb0648890052b0f7ec52d44b1bfb6dc23a1edfa5ff9f7ff4a33706303dddf970c3b494a1ddca76d52a6107093c5fe2a0d45cac5c54cc869ff6626649761ea4976fb454d515261490f5124cd33f2882754230a4baddf6cb50e126b63f10bd9ead2bb6bb8a919dd4d23554a6d9f55a0e626d2e4d0b899aaf19e007db5354e8adc0cfac2db63995ba919169f2d1187f288b405a5404b10944509ea7b7b2095b7b3d07917872da63d958490ff8da5e8727018ee7f26afbd869a1ff34c965bdd876be7c90f2ed7b13d3d4b33690e8df4511ca3aad4fd4353e93551dfff81963d7d2e537e6b352d1ad5dbe548b1e494bbc5554c2b61873633063c1a55146390e12d69495a8d41baf3fcf00837c8ded224fea600d02e5955d05892a5b338248657df98437b85dc0ab56dfeec333f5ed8ad0d1d57ac364debb377d347f9c6685756cd2e76ea3365b61ffae9bf556d52057dceca582fa80447553499141e1d3e95fa458dc23a2bcb8e6ac1de4677117e6b3648a5a870048b927ec7548281541a4bd51280410d912750d21bd504d92ff73240cfbb31d5e783d65be5df88bc2303bef04d93102f3de750ea05ad8a1726da672303cc0c72ad4e74e107c73dc55c4659f32505016a958dfd6d986a86cb406ba77d56bc0909cac8262974db7724dab291e5c3e49c655fdd0c16934a2cccac993418a5979fedac32658c0aedc265a224ab905cbbc270fc65fb6cd82f101bc6271d405de9201b26b946b9dba398e8545b925428694f65d43d927c8a9c2a92cc667a8a18ae9ccee527513d4a9272e5150994b78f2dc74e3f35629c49b4d685f1439fbe5032fed5b0e5fe6f9ae15f08c6c82d934223700c88e6b82dd0e481d3dd32f89406381021c4c0ef4c716677bde5e118b10e97e09d905e4d182cdb111c810a41b5a3fec45fb84889ee34d59f79ca553b96067014832010e4452e3348110d7a8294d4d26a7914fa140bdf2a1d8cc38d24d43b0287e2163f698017e728f948f25a24d91593226fd433ae86b6277e7005189a51744ae13cbd9e1b22a763d245440b24aa99ab906147540c27e93451bb9e88cbf3e2ce99ba2a9fe5edae80769c8f93da620de181393fb33e30920ed0f3c4f2680a3721e6b6535ec4cee58b70216b7f873208edc853a6d2f58f7e6d930148ef83538a5345df78131f2b653b4d04836f7f4c3422387c4a2b0bf13bbef6e5d50c13448f6bd00170c1b7d897fa023573cec87d716cba667a6ec360c6193555af0d4a677e14ab2db713cb2bb96ad7409773076e5f359829590b27e57156fc9332b488272cd36f98b60c736926e38d5eb00526a81034604f4f8b15a40f7ae02ef34a6f8bb0a34794310b7878a5b1c8d041ceafe99900480c25434c02a3741e33cfe9645e1dea9e87839e948e367ef4bb0f2f025251c0921acd71194165016ec1fcbe20b30d3bd88fa46b9f5641095a8f266a106413ef33cab20a853073c714396a31eba198fe392c78063629c7e818c87488340aa26758e4fd98e41af6983387256e336c6162f0b8329d69a0861e205da8a392a9719e45d9a15e6bd3a27e4393ebb42b9938c26dfc38e8f1283d5586f99489a29898de900e9eb7f0766420d671b294f35f1cf4315c362872a62449ee26541629edaea1f0aeed49ecab2079c3ac24f19fd16c42aeb437a9406afd60940ed20faef9260c5a400a09dd0b6a989f6cb4f8c5f98c3fa450405728cf4c2fbad5fe88a742c23abc27c44b5d883b8c06bd63eea1f7ed359b65b0fef912b419e8aba957be467cf949c809320df321ac540af1c43506acda9673b8d79d67f9eb2fa65708f0b2802c9a395c9f768d0dc12d83435c183e1a31ad963bb9443ef298fe6021c09b4f1858084a797cf7bc1699997f3b3e343c1cc6484288e374611acdfc4b5aa0ed4aec4fdc4ea28e0cc23206643668696a6ee72071adf7f0511d8ce4492b5414bf2cbd8510e9aa59a919f290878754253509506ad883e61174c70f76eb86db503e34769e1f8c435c900cfb66b1cd98a90437c67e65ad1b8dc2fa0f62b05624b5da0d7d21b5224ff06167b8c78ffb0068331ff5cf3dec3390f5dabc6484ea0f14da9ad7bcd48644b8aad0d5fff821344a122c2d5b25da31f5d704b11873a65e3b066232a38212a3707ad50fe15dc79889b39aca161806af1c646d41a28af2c331b72612276a0cd3381c499f9a757741d875c9760aade23593d9a312230f6db4d6af4c1ec5d03ec6bb08c7a02b9a2d66af69311fe3603b7b4f25cc69c30a404d91270cda8643c62c2cfba913175fd1220eeb5fcd01255db138da4c7213d78d1ce873a304a63a533be2ac07e858aaf79a54a020b88fa6ee42265f4c56513b4ed1200438ff081cb52c7ee025ded4a7067095213f0fd92da20b2f4acf19ed9ec783eac7ac2800141e26eb1526ef57d834cb20d99b30d00eede1f01d46969864a4eb41dd129226452f9136d09f7c3720b969fdabff5720fddfeb2d005491b3baf18d0318002475cb4c9983dd8738e714a3810a0fce029c31209f3faa96745f1ef5bcd59f4a75518684e9a1537c5af95109296c00e46e374af09835685502934998ebe4720a988940d716ef90f709b141aae2c2c8f0be82f747d1b27ccf22fb75e467ad12ab2d3fa90e3c3afa7ed2fb873aba80ec74cc44b98c5a5ae7e6dd8db6648755e2a69c6d72a148471598d6a4a283328f4317f4dedf88bf999900e3271ddd2b7e9aeda6397a583d85f36fcef45c8327718e79a049672fbbca65c2a8335cf7c8d75aa517d8628194151abc1e3e91524ac182c64e62f3e61e02844b3b921e40dfc5284a3eb0913eb348f7fcd6240898e4b875cfd4dfba81eef66406dbbb1ff77afc5bb17fb5d2e40b0b7727fb9fdcc1fdde6c956fa5f2f6c9c7f6ece32e339e7c0bed89b23822e55429c1134fe39f2a1cca2d87f86aa03378ad3ace9123c65c729b0a230bf8fbb104abe1aca5cc79e4c2ae8339940be9e330afa054d6120d42bc4ef5fa2ca74d9db3507c95e676841448dcdbb0b2a1886bd4f20537306b966c311182121212be0b6b0e635895b210e72938969e32a061affe131421c0433246a76fb23f565b3d154bd07a0c610cebef4a62085ba335479edada0f1c41a7cdf3aee83f2843fa9cc428a42669b99f5621276e4fa9872cfda287acfbe9c34495ebcba6f6669c48d960c5e515ea0a8995dad55ef8d69e8b5c85c49dce83617dfd964e4b2659a83b2707c9ee6d0212fe1affa0eae95384355b4591a5d0e366ba3bcfe5ddf75066ae1f0eb14a730511e86999fd778571244ae7dc38004a0a8060182329d2c9059548405d8d143b3c45e9fc311b3655117e6b90e0a475404507057695d91d5701e1fc41ecc23aa01235582fcc364d6ca707048962268128d280bd7c6e4e1c2a67b57832681031a69253916331878420c28ac281a636e3270824ee535ccd665eb1f3b031c790714b5930a9241e6d88c2f355654b899023f3d60426bf4aa66e31f5a141d1f646af51404d972166a52ac85e1198fada83a94e41c74d0aa98729b486a250025aa04828094da035748516d0025d42496802a5a12894802ad092a0cf51bae59ce5655fca40d44e386a7a384fbe8e4b89bdd1f75fb3410afb7dc5b9e3f05d201bd71378f1b00f142ed6d073217c61336094e3ddc582b1c93352c1895433f767e7da99bb7e1ed101c05fc6ae7d7c8227b2ef4dd69a376919373041ad1dc70fd237fd05ff5382c44db6e21ae6a372e94ce5a3b888442748c8b8f6f875069e328dbe1906a33ff085446f944e689a507c617e44189abb39804c4a8f8f9c31424634f7c490d56e11055949c3e5422933d167162ec12142aa23c64158b98550308c66824da5b0d34ff0ff4833f107ca4533a10fce9533052941cd825186e399ba1a7c21c1a1311477b67faff4e951165f1075b64f235eddfc79d75ad318d8440dcd13f4680f2302d0e3a065aad85ea3b24160bf7f4b7901c95c2e85a9b298e8e36a44b9aba60d0d6b2c28f4bf938f9d347f65a2b8e51cd1f236820727f3018951b7bec59d3886a59fff684fa9232e3f61200a469fa5ad856f0538c7b52f78b000514a74b0201d9c2af221cef19a1cef27037e853007b105f25b23589d37b45ec6662cface784da4dabee88a8fa3487f8f4c61b6b99ac26e273e9d00fca5d452ce5f3fac483d9f506e73409c7520bfe3466140a5f4fc607d3645fe1b57370e726e65f3139ff47b66071e25d72f19867ea107988d4bfbaf034a6ee2f9112cf5fa401630a81ac158b90fee56cac66875131e5de25c098860228c007209c8359052330a4c4fb3c543a4bd2bb0bf488ed15ac18b8f5377a9181ae627843ed04e4ec8bf94c332655ad7b45afb92546187a44712f375cf561f87dec41f9c308579274841a3228079f85706fe00a3225830f0030c0f680a15279e4fd30f07fe074ef4a4a9f9013fd395fe174d3692309a0b03525c997c6541a75047c44e830664d0a2d401c0f8bbd499c04f09eaab3dd1df1788114a69f900886062b43769178a26299b839a3322a959c2d89c1840a521df57a74dac06162107502e2f1e451fdb230a20474a4cfd46de8a805c3fbc4eec054c2c719c7058fa7837ae280ef028fad52688835dbc2068bcb06bbc38a80212b4925c4e067169cba737819ce1c9d65868fa6cb21993fb21b9eecc2f4df5811f084591f7c71c9093e983e2da9d3feda0fb1dfe3987643a22bee69a6abfaf1246579ee876b2d553a8b132eb52187f308d1560a15c40a8a013cf0db4891df0b109bffa4328fcb0e812faff411239ece731769e9c504908133238ce7e42636b7389f0d19af00f4937c1a69e2e98a4c1875c35cf083c4f8f8f57bb6b39791a4072ecc85b73afe9501ab1c9c3ea804994556c16351a37e73eadfb636f0aad5284ab315b8386cdc6436d821b153c47b5b770decacabff26396be9dcb6d3231bca36cb8550cc53baa2fc74abaf68aaff1d560026960ba9aab1b35ec0741069c241b7bc1c5492b7176573245f50799ee98a251e1a31d3445ec4afa96d372ad5842d5c02cb3655eb07401609320f1ed5e27076af61190285e85136e2f15dd2b8764d8bd91695be8c22e7ddfd83d8205f97765e38bfd6c76cd0caca566d67435656069a530d3468983d84372de633b0206ca4a50b0fb6184d00c04c79b3fa54a24099348c0cd2a5f502261c2184e4111812eebf6a364fceb622048a618d2ce17fe3e2afe7a462f0e1cc56467629864452adffe22848b13c26ccdaef21a92f823fea7813340fb0081cecef882923a6a2dbb48a25c7e7d1bf20a44a241fd1e1881f59837555a525e417242f37a45f3b2e277638128e865599a11a45907f23f026c1478f885108e0cf24ee8494f0cdc659da730c0d1e3d57dc618d211da7c0e93a029103d4cde70524c53a7f4e0979f088be6157782ce11425c135e15d226507a8edcfb39bf511620ed0b9c742e50195d547e118726c0eb54e1fd6e8ad2727f0b200eba3fcbc90b9382833b8cef41eddd29948e787f60ead716f02240b00c54a85d768e4b8019444076715c711967959aa7e7997d721ab7dd47a84d5c4e7392d2e2c77036ea780154ce7b6515e89d28241a5f2c98262bb5a1f214e5ff9d1993d9428f007f6e9f513f23e7717caea16a32b810891bbb4f1044c5fe1a158c58961a0f7d13cfe05aa83f5af1fc51e12120683f40f3ef878911f404ca09fce67c8ac26eb6fff9811e75bf50598be61028020754eacaba42abe97771d6ac6f7a8242eea6203bc343912c6fd375a0668c1e0134312c7243ec8b75e296485aea298fc1fed66ea470562787fc4e9df3a3ea919cc50d00ecb09f1f61a9f60aae92ccfc0f05c77812984f49bbf07a34da756565f8d8fc77f54ceb46783b0c0a45d2f0d431904d0648c8234c35c23aec20b1a8ff5f535c4f088a476738abe9ff0472e1b1d11723283d06599750adb64fb43da636aac3b05e0ba9e1b20b13be0ae41c01f1be26b1c650eb86d5e4fbb1f7c5e2f1aade84c11770a6c2041266953f0fdce040c581c76c080f0ab57e03a2dd6f3bba3dcc5ae4e8b93a13ac2116fdfdeb8d54436b1b41b00f715758c2a295f43b768ebc33214d849b5deabb0dd533fb930be40d2b2ab6dfac1f489c458d382ba1912501241dd571b7c7329af4a14593412f56cc2e387363c5f03e6aff7a96fdb9d55c5b213f9da643b6069c4225e066b1156192b986eaa7e4fbce5a378c8833d9064e588ae314b1eb60a8dd04a484a535973ff21b503862881e06a3602a77e2561ccdbd8026ceebb3ed4f048f795d5ac9c2ab7f5b97359259010704da605f64e06cba26642433105b5c71c81e2ad6453a8943480b93967e6e0188e67946e610801158a0fdf971d9a35a31e4d98bd4933529c1d2b355387009b736f53d786ccb5d138e665731487321f4e896c1558e054b3118e7659b501f78457aff71e993213852acb7aaf6291e21842ebc8ec491597d270f35c0d0b65847d50618941be0435efb1bf02127322c107673c25f413c3ab810452b9da0f44be922e76d790606eb503c544ef338f989f135bbd485c6a30f1616cf29be39ed9175d9a6e3d7e27c1d87fa9bb618d01ffdcbb3543ccce17b4a26340bec63411b296f90c55ab1a2b6a20472b0139f244cbf10971588d1eb5b5a593f85693852971a02741b6170fb7b470456d5e28d0afb09b1152b00871786ced7b2d58d2070bf208aae8ba3e72bf4161f4a7249c30a4f21e36481173eeea21756d2d3e6a77cdb2b36f894fa4fffebe2c24bb499e2534819ca70af5aae2219ff7ad09480c42d63ae090cf768d7943f427bb9ce08285d9dedd7a2b061c0faf329268001431ba6e6d96a2575acc442dbc719f51daa79258f33c3b36b5e56a758a1f1c9de48b441059499c0901173169aac266cd52c0d1712fad1ad29504002e74d1781429337e33c73fefc6a31fd674d2c9db4b667f35aa59ccd624ec3c2a1b8a77e8d68e29bd4ec70cecd1a36332696da75efe12a8b7c5f7aac6b59438136527deee5d2939b8389f5582e8a9ebe03a47e4390cdfe3734a382c7c083f1efa8a6ca38428b4d137b5806d3d10523596d49811f875916cea1329096a15b8bb847638507deb25ce647a357d00901ae12a32ff664b7284312098747560ca5e7adf780f40d87a44c17aba2bc9123691c962caa18ab8cd0c710734697a6ee2cb5a908d24b5488f029dc8fdfa26ffa2f36c13d8ad8a37af85907911bd5b2001f3e540ed3ddb1d917fe6f9465909dc7af532ad30194e7a424a25298fd309a5f5f177d72c1037ca9cd2b185ab71eea7da4822c23914481b7e3b062579e66d2d05fa2e064c20768a0a0087d4210e0986ac743dd61694ff276995ab27ec6a086f1bf717bfb6032cbef82c78e0e114eb5b11fed7ae2c3c4910d39fe504e5c6f013461afe014d2dd0b034d97acb0b265c5f9d555028efa5b434cb02dbbd0ee061a504a1adb1f5155ed724619cf24177ee93c5cb1923e7c141a219ffb704d794bd94f5c6d3ff44288df391355788cdd54207f0633799433cb3db0620cb65615f64022b906fe5de6268d64d8f78c5d0b1f0af345a693355ae5fdf5e5710b6fecc9a991643259f25787a42920e067c48335059a027f90f0289adce207bd9bcf3d891bbbe8776f45c42f810f06f296415ea9045146aeb9826058c4ed73e3a6ab1a86eaaf40ae6ef6fd5f5b504c5a186b6d68bc1c0f937c5343e77cbbf7ee16a90bcfdd7e54a663a5d6ffc6edd2627ebe886fbb7723adb0db0c4c0b0c510fcae98a286214f7090215cac203970a225fed885e0d61f44fc6c4ccff0a8230cfa24b14064db69061fbeff4c9015986b3fe174abf4611436105249a53f7c473f22f14b6dd4595f309a0f823be5dea0c205d0fafdd5e82d29ec5e17fb14c842de82ae5c6af00c65d1381e2d3f7edc70306c1e6dc932f95d3047662c5062c071e4c2a3313c8fd067700e4ccab2a9f68d003b6c898924e3e0d895f92158e4206a035c965a98cd33d274b1ef090038ee88b42c83582010695602e11bb87dfa133e20b889e00edc06056881850548c53c474956e5c515f73d13b87ecd5d0089962a60f4577ab18e347c0b0f50d64a179fc31992098175ef3508fdff4a6b74ac5ba00bc760ff9a48641df9319f4460330292626f0d64359779d24a7f44511502043047f1969a1e0b4d0c63479bb00cff370a18eb2e9ad758e6d0c0dc8caa260e046a1f3c4f77724035aa650d49a0ff0142bc84a70539ac226b2a38a011988811cd76da04dc4ff45df33050c3af0b65841411f48143f34fadb1f28ae2bc48dce14829a11a5f053c6f09fdeb64a680e8bf0d200f917198d29588e74e8bbeab7a79a0c627d5da63263dc0a901266e820ae3e1181d0b0ab78823ff9829be20881de01c0b08be9e2e7a98fdaeb94ba94d0d866ee5e1978ff542022f64ea99af221b829268857a04292256b1925488853f55d42e011c435609a1849119df07c46d35826316b45b8e2fcf389e3d1ee1e5142719c7824382081e6a32a7bb96f413b40b38e61c495c8bb05cdfe33abb5e736ac1bf75385ac844da6ac12e45d29f3c2d0802219b37123b82cc4dfaa916921ce5ce298c9c504206b8f06d8237661c42b3d5db432fe0040df0f825d26048560bc93a7c3a898f1270157747a4b60f1c03b6220be8cfa0388e5d912e3a83896f297312ed4e55f15f9b85d665cd16db93cd45ced0be7446a606808161db28abd0ec507da40e434e0af74d8c484f3c6072e7c3916c81c2cbd267aa08ee30af8c762187ed06de53a8d07d9c4f346768070161970a6c61c643acebf53d79be5e055a5dec4d422dbf54a98931c8678b06894cdeebd5901191e206ba3ae0c6823ff27082be108851661e956e2bedb550992bd630030210d79f402865ade7df5e2414d97040716c6cc300dda33981fccf7e8c6b86640c0097bfc811f8796b640459cb55fd17d1c73d838b6e0ef581f8644718db5d858a5c207154147c96d9d1b845233bdf7451f849e63529a42f8467867b4716068bd6b94487c0139072118a43205779b0017161ca16a62996d87a4f5b9eb46b0ad521a0688c93a8ebea05e48828cef4c5d7e6836e3d22cd79bd75526d54438df0dcbd2c9736403e9ece07b020c3326163ba87fed6d478db3e22177f7739da0573032b61eefbe0becd94056eabe490f273cf30690640b75926f4a08e7f39a3eedd8861bdb25500c5dc0195779f53cfc419a30059c0603867d42cfc4943cbc8a48b32b387f76ebd715daade860ae4398590e8351980a07e69e3c048ccc14ba1b28ca6d8a650d10b41530c832fcd4e7ffc715840c2339f8ff914c72011c90cfd411dc8f4d3c0a63523329bc9bc919360dfe6c749e2931aedddb9d130452c2a24bf4be881c2d46e2bde63fc93dd4e919182e6a87864eda19fc3aaa765bb8e8e4472c7b5b13ecc6db0b85224feec7bfe6d5bd2b06a4a4dfbeabc0b311e2c01c9c8dbbbc44b8fd73cc2f0ecae634ea3422b756f27f30048c1efbe92a502cb3df137783eeef827e40a56f6f3f2f4e3c4099cc5ead55398dde144460249ee0a90895d09bc9ef2201b403d7f06c221111f1a764b471ba1720eebd092229a2dcb29481e7353bfd4574a4996c2f520ca26fa22824400e8780f9a6b4ba87b0ff8630d5616fa0ebf60fdeb00556a65f24da33c41a8e23aad688f7d5f450940c1d95898a9a15805c1c982a44ccfd170491eee7002324b93e37dc6eeadd99f86352fabb017713c257b54524fa407f45fd50c1d039e4a5075c76398e5d9a0a846f13e0d4f4486b3a7bd71e11ce04b0527550c605706debe5df478e365d164195de2e04427a8848d52dceba705ccf1ad7cb9615c43d0117894b1c66ef686a83be2128905b2892cddb6f2b0357285b889e27ea5f4e26024b3e3257d15617724c34dd67b058f10982258047b91c37a90c226cca8c17cd9dcfc998677b09061321f738f5ddc1cdcdd4ffa5a797395ca038edb4bdd563d955e8eecb04dcb5f8fa7163bd5fee308296158565bb9a67f693f152abc463256f97769e072694c9c87df66231a1142f3e7fc2db931df45f00b90e4c91e3f28ae8eb01f9185b6ebc9fef886928d014e7f9eb4d249e4ad0f85416fbd7c8d8358fdc3c7f1153c0f6e50ebea7b292ab46ced2707a2efa4c94e9c3c779d5b60dc607fd41b64f057903ce167d6719551f3c88413f75a543177284522277e979de077934fd16f8fcb39e7babe74977c9a5e0c1c2d5e0183ccb2c91dba98640f416b3644ccef5bf752d032156fc4f54858b5d5212ee0626bfd8af5e4a403e631df083a52ec108ccdadc0320294120f0ea91343d6dfc16899de554215bb9ab0d3c81ac43b9092c21ab8df9765dc57f3dbc4e11fe9f28403979264d39aec28c7d2d792412a1c33aeb9a0da7e2678fe55a10de5847170130cc893c6774a539f39e3a32551f2f05217d6c3e7664fe83cfffa2b68d3456f15b568ecf9569158d3a74cdacc26e0cdd9a51494ff2633548423ae86a8bb847c525de867dd71a732de95dbd00ef25304b9c31b75442691a5b64f00ec82dea6be47ce846193c6e7e69da06f7429d219aeb9443613445fb7a987558f450e171fb8a7972c5a75659c22e8ce1153516f69168bc1be2589bd65b7b5722b40ad4cbb661bfa75032f7ce620507da9f6dca6eca9244739b9af83ca88b6723bf577b4ce18d31e766283074fd756206745a1cf49086ac0f5390382a09a9886aaa4b83ff1b68d37e90f7d48f2378e1ca924b1b29c8fa3b1b85219120b40aa35a931421981c94eba6f85fd9d8367f827f1d2134ba28a5fa6cc315454936fb1562ec702c0aa72beaa9c744a7e534b4e352a86192369c54150c6c1e3e1acac081b496bc481fb50431954d5f0b35f94153276ffa82554aacb6ac446128d5ae84098c5ddfeaa901b3877c3136a681866018c10718b7e1c710d7d4cda7124d45ec2c004080c5366f3c0afcaa65e19f0916cade02d8822122484cc8e95878d4e13b1c1ace6273f6641944c2c1eef06111a8dd27204097ef18572c4c1b460dccd91e35b4c20e3949a430536aef51bb8919e48205bbc204c81be37039d3ffdf4d2a0ba5c30855d68248d8ab70cfbd08d85dcbbffa942ceaf58d37b14fc888ef1001a91b2df0090e6b52878781de1d667f26d520e08e5897cfb80c04081c57be8448fb00b986f8f7dc2ab820cb07eb1840672b58f3980f4c39a10799f9f725a88107074764b64ecb157f24e0e3dcdfc1b638eb4acc7b20b9276792b0a7860733e8c26a40a6839e6b3c904997b60698ebeec5d34303e0b740d0caedfd564885eeafb1ec0f1581a971d4f3629d360bddb83be9985810becc7d7d17f707c0ff3d41c4b19604822ff1108b0de972f3fc2cd743778e5d60cd57554f5933c0085f5eaeb52f8443e9b16bb211ab65b8936e481717fb6292f8d69492b3d95bf1b03769191351051666a756c5735c951426228ef7ec98de2fcb1f7d985fabfa766a2d7a4966f3fe08ec2ad067a376b64b90b8cfe2c9df4e0511895f2a5bdb2690454d91739ed57234d97ec411201a709e441232e0fdfb36d924791ffc602a1d21caea7d1cf3a73a57c8488f0ed647057d4d6dd47d8eb75852658f7ddd71744352eae5b019746445df52c144960313f8f7620166d8638a436cdf343dc00ff34a5055e25e82313ac90b819012da08ddc6dd5bf8767cc9736fe066d13ce0f5d2093784119fd490fd0f9491da04f0eaac21353e2f2637059a9ecc545d68e3d4ca114d48b1be334d434c0212a05275e1c287f00a72faaf800dd8c83756737ae8a1dcd13b0e743e13a39e804373b40baae037683b07f8969dc1f4e5cd6edf910686417565bc4d3cab21e4a4a950b6a09783e09ed5a8db533f1b8f635710d96f4c1d0045627a24c714b59c42b297d265146cf94a18f8aa0ab029df5ab6ae1833132893032f0909a302d00d465a088dd4383d77d10473e8b0e82268ecc429ee330498ae72689bd10b223fde781ad67fb3174251516b79dfc5b55cb97262ac3248c95d7fda5d8d1c66443040dc7d78e91b87e172fca5d5ec3df57f1c489add5e1d06900e66ccf3bdacc56828faeebe860102a63d7e05f1ff127ef19612e29840b774a8542d4661d110100c31607ef2370ab22c2f35b3451ca221709280222e8ae3f8f391315c34cb5cfca5fa040ac6f7334ee7f1396f838722779033509f646bb9c42b0977d4bd86e5011f8772e3ca176894406c2df37320146cabc49c5079fa4a6014b616ed151a1cb641b8ea95896e1a8624db2886639a287590d837b331957aecc6919bc9849e31a121c8e6cc4ad115d1c79e53b2fb44becc9ee444d749e63a3a8f44ed0fc861fc699b2e33153fdb711f81b19bd139a8c19b6c6ca9ccda377991f47f51d449160c08ca646959036f02339fa86697568b6c9305d451f35f9d51326c7b599aec88e7f96521c63e019faf09a0f0758afd1040a247d586b341a98c5fd420c991828302ce8e30ab652aaa51568be69890c501754ce341a394f0101ee525404d2b5d81e579b27fe24912f08b97d8df413ebe3f62dcb0326b8f098df93a569368d48befaad912b09aedcabe2c086edf54b4fb86776e73ec22e606d976bafbc9894801d3e3b6929c4814415c84a33c44fca6bb5a574e0e2bbd0c94d2d307bb43e0eb0e6d2d2d5867e8538a8b35c406e189d9c0b44e6af1383f95bb601d2361b2adbb36f4b3e7808d7f9d6cc5b74e044e325e62457112536f8755e8403049aec8c56fa16171d22deb357625d9655d472508a5b156e34ad4e14392a79f833b913a8fa079f65edd4e0168b3d7307207eca827a2830c7a5340cddcc2a3ce2bb01006f9f547fd23527ecfc5abf6a3f4604a25a26b26e94bca6211d91f8927ba6fdb2c506c821c2ab9d94ead7fa3510277a08c5ec9bf892e541a1aa509eff63fbfd0eed35c55650be45e55d4d4c978babdd7281ff66b5d578e84d83bd8da2d9f9184059a76d143a0fea535cf7697b96e6f41f5e55fae5258164e0b0054d224bc9190152369e3317f81589792638612a2c699b0595b5458294525119c07057d63ce2342942c849e4ce7761ea3df6c8fd9383a588ce79c3354ef9ccf75675492056a972f1f7385507152e6062d4440892d205754c946961b6cf4bbe253f58bf014e97f000b5149922a407a74db16626fc96072288ffd1876a9951543915e0fb88e04f41aa50842bff73713896bb6208456b0c0bf746a10f64da84dd23ee91154b884eec9423652814f8a94c1a006af9e972b077dfb02e2be931db3cb560e8c90b65198bb283423d639de97d0ca86fb4597c2362ceb631d1ea7fc2e3f02d381bf6e4117348cb8762624d46c4f474dd248436d72b9c3197d519bf219b32d5300b8d6b3915c7b3f39544a9486de4673c4322c36c33511fb32301e08d1655b8e2cdb600b035a6c2bc6d2091b308d68898731b39351b4e7c70b11834c1848665b56a6bbf37f08c12314ee14b649b4c7afd5d81eab103cf24d9ea282000dbd7042a1d2c5e325672515c32c83a302d428a5ff58ab1e6c5b2420f6c57f46ed39935a4c8102d201741e60d38eb0760af6144cfb7353ae4165ca7d86b64b80289ab2703927153a07fc1a36ed4a2b6c0aa96f7c524858f6a52b0b301afebd1141599949ee99f4167a6a18d16d3071d85170b3d82a0ec4500221ecef3e52ef389cc7a6aa9cfb76f1de6cbb89fdcf91ed00f61611c970ad238aa0f45779955c6ae6a3dfa5a91ae5ceae8d2e9ab0567de66bd42716401b61cef0132f8de25238684c8444c5cc72c06b1c4c68c68eac1911f8d1dcc43c9ab14567a20876c6c52bcfd832266107c8d7282cf8f9de84748f8192b77880e62169a1fe4ebbd01db5a57ba559b0c6aeaddf15f6e532f5242ec1868ed4a147c92048f0f1c7e4533f323622b8c32ebd2b1abd63a77775a7d4918533a69f7f7decc54e4aae68b0b125ae2eba85b5878bb547136f21c2fc4a6cf45870898b858acc9d3351b62acaf056ac1ea76b24b9178040b97e831a7bcdf4547c3e5c5bd1fbad7034974cfae0fd722be4544c827f7fae5c80dacf872a84b4965559e1b69b11ee84ae7690ff1b8e8ac6fd08a8ffa10aab56f9ababaa764bc7198cd6e391793f1dec3cb7445271377919917611f221e1ab41a2b87e3820a997b69b2aa46bb78fed477474b77da4bfb184374f9b5a10b9e2f8ae1a04527bc384fec63731315d53765e9ee7067f3550b52ad4af3adecac4b31cc75019f27e45c89a13da38431b40ae3e0d6abe8dc2352f0dda26a6062d8e413d24d65be4ccf9fd2fe0550cb604f2e621c86dfef6a398992f1a068c801890ae542570bd2a1ad99411d6c05cc074c54dcdbb42d1dc25d9e98e613b6d54e7b2707d4c3f1123641d34cce06de35018551627df582e56a14115a8c505f4efc191c9a7477bc4f98fc375adb68429a3c25a8f7fdeee9280175e15823a63a25a8f6d7a3641e40c29b2f57d4d7e7cd3e98e81b30a2dd5d620e5105a731d34e4dcaec70eee8ac7abf3f54e1f8924090c748766f4c12cd4f75552485882b1a8c20341337e690dc80d79277402b571725b496c93e113a929a2662d7866c2b48f11ffdb4988910a2152bd549d1d589960724fc0825b1e11d9c545d08003e4b90aa138832a51f2085d1438f34424734a4a4df12ed6ad70af7fac750b18a477710dcf211cf684125a43b1f54c1a71b82e37f230a9e49214e2070ace87f86546c001a389fb20508886c3ab6b0fbcfabf16f734ec16103a65120ed3383ddb411c97ed47003b642df5fea844bea73c13ac596390d00737d9b05a583d498f1de3d3a8adb39e2c510326117587270ef24e7bf8b155155711fffa740f29e891a2af920653220161b9aeff6d42eb0aa0fba41e7b2244a88212cf639fe55fcd5cbc9903540fba93af090d1df79de470966f52271e5b8ac0dd6a7a0825900a62c114757c00b76c83e4c82722ffa6f05d22d64f608c166e185b16dddb0a202519f9bee4d708dd291321d4123143bc88fdecc349974c09ff8fe320f04e23e3db0af2065b6d372fdbefadce2dc9b276d41b340e624b62797b6d510ac4a2d293a795fd98e7529ed0a510ebbb47014b0ebfe754adb4d242feb050b78c2945e78c30c627eab8620f96b96f164c5c9e903d4477c99796a9d8b8c3ca9662b80022a1963fc8a5258dfedc7418d42351c79cc2a862bb2351cdb631d54529eeb099e268edbad3cc3fc2e2a5e1b06edc3b763733640a9d43d6c53c26238af5247fe4e619ca49b0a06900fd3cad2ca02ee77e8d4f5011b823c952873cf5cdb8daaf953bebc0420b47807cc3d614a105c1ec340d08cac923a86931cc126eae1ed559e92c4bd85e2d0ee148cb980908f3475a7f52c03e829a79ccd6788085b2b2e22b68a1d0462df6bf13a6dea3320ffbc3171cb5c2f550f67a75096fb1c024d10b68da4a21b139322b1f5f2df702191614be35f75341ea89794e5f4d254f8e1d67da4a74d93714550571ab1db492c1ca04e5e8cf8d1bc144b39442d6f16cdf95bcb3a0b413504b6667f4d33deac066da4e4e390c0e88d6db7f4e33c75854bbea3516902bb817d3ce6b298002303f7f6d118de4f1769ff1a88a0d90cb55a2ff316031393c19f71516b2f39201f713a06c2521b84fe9139fb1d6d9da8995d2ede33ec553b95f89eacf46526ca8ef9e4c402325cc928fea6b34d156dc9fc7a3a9667faba4c2a00e8247c95b154e248d01fc221dca00ffab08d523430f6a162985f25538ca8dae062a36e7823f5f5f9f305053df832c11e4958a6df1963c34cc8521dde648bde0037dbda321fb7dfb3d7e5a57fd232f26ec4b7984ea9c1c478757111f7f309732f1af640a58ec0d8e63e72dd36e042935c88a02b9e7ac4ce1a01d16b62f16857c16dd8f6a7acd6c1707fe889c80834b74a8420eaf0a4e2a76d77a0cf86788b40c6c3d4dcba6a81a269fa3e704681dd7fdef21e3e1e59b0337896a09dcdb0ac042985770a185a19f0d32d24590b345eb6d63aaf883e4a718033925c22ec4fa0936f6428ac9ed0bb939ce1cfa2cde60b1569b6dc839760dd9c063b845ec15cf20c830f6e31b9aeb7d4a9ae22e8cb8336b58518c643eea17cbdf3407c4d00d02add9500c15e7fb6c60c40374245c5199a6832fc733e27393d5cb1e702318515deba5a9587800675bc831cba4e5d6b14efb05ef21cb3233ecdc3c89809cb3c17498769c4f8ed2342668b90ddef63abcb5297f96353f16b430139af48cb780a89c7efcae885c3b0b4b4171cab227d748b13abba9c792c6ebb72ec1007bb32ade1e3ce65f82d0c09e97986ad5159919d24811255089ae0d4b6c0bf3c524e1533f454283be6a03a4f64574e250c92e8535c4d18a0152846548446566881465b45bbbd991baacb9f571508dd42c4187c29d1782f5f6441624206e180609389d5e7a49aebfc974c7522def47a9d25f9d2afafea6cae72bfbdfbe9046490bd33afce719a502771225a086f9df64e22265e3829e3a698fb149b3756295ffcd5fe5afd6fbbe18283b45954462345f137f058ec204dac288f85f029d991bf91d3f9825e4dccbe100e66f3e4c2aa33ade349ce7871807e621214a3512ce7e1adec5938a2968c0be7692778efc5b34384fdf94d5618f380a18ea53853bdd41dc5637d8859bb69c777a80f23580e0b34ac6494e4970833c224d23d7b0f94d509b8026d67a167babdf11c6bbe2c30178158cc08377d829f849dbe06b6aad2551289f587dce194529703177f9c179a04dd0f88449a091b2f416296c4cdfa88b708785df73d51b7260402d8bbb42de7cb85aa748d1740c4e012c48a0a08273ff9426f1270d1ca89c974d9ba5ae804d29d00af701a658e43f3d39f97f7e7fa181f88b4fbe021e719c01179826c4afe3130234ec8bcab515d4c405421363b7623bdeab37ecdf83c675fb1bc68fe2d4670dcae5d1672fe80413ef4b51e66b21c87d103fcc30ce5c7b15bc38241d1a07f73c4af74419f37b191e34b455c34d8ecb81c184e234fa1d2c2b81b1e8f851277910cf7643d2346f9e748795013d08adc13e69a994957be6b9755ac9c0174839cdae08eb33ec7c7256896001b99f15e597701cfbf9f6b927708592171154da0a06d9075729e26cd9d20e8ea66106d648f019b728c9e5f5806155f1b6e7ea498bd5ac1700eb016c19e9aa784271468fc7e4b54fdcdbd5de702a4583a294f5368adc48ccc431fff732c85dc2429c8472292b0a3501a4e30560c95e415c08a73ddc88f46eb10e13edb4004feb146346052826da7d762e03076fbb085589c1c67216e385647fb86e5217233dffa190b98e738800eb24ad4960426ec75a03be19cb79131a70b5541e3e6623c9ca587379b9bbd9f94fdf51c40c992239166d5da21fe0ff61639e7c98606ad10677877bd701e29b31121c248002a676ed0a7a001ffa0a7096193d146b31709a32551902b7b16e25fb51a412d102b013645afbcdf4da6399682b8014d74955a8c87e4f6a60ca5b8bd34778f38fab38bdaa07a1556256d85c7cf5dc9c089d6aec6908e190202ba138a0fbaf49b4db751b8509a82ffdc4b7c17089ae0d45a959212df10174ee831c86902fa077ed35848601504be3e0e60426ee268c844a9a3e88fd5a8ece8b0f6560bed4b2407103af444d573636901148d61a73658d69342da494a5e28c80561d34f23b933baf833c882a734b3a0c727b1ed62e553c6c5273d294a473125ad7b936e838514dac0e950c626d812f847410418b7b22d2dfb45dc2ecf225e456cf1f024465b766d0ca9447d1c09e73e89920d19bbe5f8fa201a624fec08a718605f28eebe94dc88fb3d0f7e0ffbb879f20972b426e09b4cf036771ab4cda14c9069ce119d6fde2544707906c5f21b2c76cb4922ca164b5263a6993e17082f67a19d6771a986808d66607a289ea3ae5c9049afaa9437e9ca6c95d28a420be89c01ea4e2444d16333725b9f3825a4e9f052e5f0ac5d38925ae04d06ea7ae7c9dcbd912c5352e066e0a4eb1dfbc1233756e628b3b4319e11e9ce7f59fe537ef952e295608aaae8a1c669386694a0bacda280faac2689338b3a4efac5f2ffc007f61a11457d1b0181219519d774a2323a2d318e2e82d8c5484ea43e7e3157daa481e89108a30b6f72eac002f39583f8fa061ec4db8fbf4616090c265938e6ab9f638995263d37b157f5e2f92e2ec199fc59249baed35a097edf1dcea0301c5158b9560a9d70d819581176cfd16c6d709b84cd8e834cc6cfb13f61b439db96cf712073af3aed9cf62aa0044cd810b213a6d2191e87160e4acb8a8db7b3b64bb22d280fa443a26198453868e19df3e99821418f2f7c97716297a45d60ac9094aa67c25261d18fb8db89d048444e07f52e1e151cfe6984e6f81c23b681b11dfba53ae0c2dd66e544b396c50fcef2ae429e65a6cb7f44609489e4c879b7e60c8bbdf1fd396a249920503b5bbba3464a0161de85481557a11693553e822db0dd0cf724b436d81617b45a566909664cf2ffbd3afdddc8fe54908aed4b9f128c56b1cdd299432c37c44c4ad16439c0e42f1c3bded468a3aa3c82505cda41478393500cf7d1014fc60c6b08cd01cae433874427b685b5754c770e1b3c9f5591e8347d83f8caef2be646fa257ee69e20a01066326362b64d317a5d112314f59322d14e83e7984fd956f7e58169381106fb5c5d3bf11b7b3a9a1bdb9ec6235f39980c5b05cd5ed666b34ac24b189b7499cd98b79f7f9436f370b6113a29fbad87f714b075713160c2304b1483e58289f9a9bd6e2a5e16ba9efe561bdb845b5f7760361a27395fb1d0944640be033805d58181ef83e2202f484909dab16ce1b64c46f6772ef7ef7cd634fa71a373c8af6d2e5c0556a6cef01d11579fe3b58d86e5437ed2da5c7dde27e65928b5b5573e8e41d405e305d3487476345b4be5c8934eb11de6ec2ceb31aebcb777fbc91f0162be17dc812dee679fb0726cc6b762622195765506cc113ada391090e5fd208dea6b5bf77ffeee06beefed107503e2a42685498b28e7a871b1c0997577ef937fe5d77ededbac368b5eefd0dcd09a816e7c09907e94c83f5d1f388c3f96b06aac954f74ecec648d075b7fc3fa397b79e94a1ba669a477004379448310c06c4b8488048582d306ed7975ccbf79518c24bb739b22ae188a8a7041c768ef4da252106c1161e23dbc6c5a90347c12c60c7b649b953b4cf76a426e8c8617025ef65e2aac3e5c189dd8878354d08b9cb8319ae20589376127e77f7431f0f931b495a4a1b53b15c891e125021c7883d3afae19014119abe9a6d1f826e696687ce44f5db5b6d10dab535bf79cd488d1e8dc1615f3dd751556bfc88bca1088fbaa571405f37845f0f34acb8070acb3ec06493f200097e80994450910f54eee794e59980b84d253a21c629b4d307a837d08a797926c6de4c13e3b29d18b7403451e0bc27c65bd75adda4ba9df54050a62f00df2d0677306bfff4797a064be4b1e0f882896a2638a10d931932e5cf09054ea8f4dee60369bf55f5b83d225ad71c04eaa456e28fc44539f835f13b86b9cf8598e990160d47c7302e7b36acbd68706a2f65eda3dc28232231742c705f797c3b73244c9d5025123bbfd2af2ee0c83a44cab5b0df4ed9739c5b5762d47b172ecb3998ec3d47dd6da032f84aa37603313a30dd485562c6dca89d8ee0727debe779609e6417e9ec462e30ba177634de5b4c58418d32450295e4256c447cad72656ba5159058b492657b11eeab351f668049159f03964b000a8d3aa7bca8def387336be499e0c51dcf29c07a7e4080282a46a06822f2a58b079f1e16fa176848e842a734f6fe37371e72c42c549325f180de0adef415326272afac061dbf9ba6be3dc536808a1862ac4f00528b813f037c7dae9e967fc4957ec2915f0700bdbc0ea77357a6c192739eb539e93597c038640af39c18fdb6fb7d41c890a51787ea9626a66d84edc28f10b0a05d53505c8ca66c09923fc3e2342d6c2ee0bb6232cc5a3bef350f97b9beef9ae79e9ccb51289c86916601cfd4ae111eadcb84ac788b8833e70c4d84ea4dc15251d7533f172e1b0113d1264d7a8155f3f56bc29c1199e224b43832cf90aa0238422d7bc512301bd2b2df9e30ae1b26b2bd906712edf2da2e47fb2110dabcff1a1475f301ff25765e703d664cf6b34e3226427d3b8060ab3dd653b29f780ee3e665088ab6de71ce84049266a0af24b79270b855e3e92346c35b7dddfd565224d0c694bfb4ccbda412c04190de96f73701387cd3eb32e75814beb9b283572737bc3cd98e3abe3acb77c9ff629b33eae9a9ed6b86fd64f420bf49df835cde1036ece5a52a29b11879d3a1b8b3f8865ce844f0523e58372115cbc4a08133f1887443d3469daf0a102e6f6e539593ba9b94aa09cd76f36c68a6f8be81a3bc6e9470f1523c6c9b3b3183c2d84ec520e110f155b7bb92864231a5f0485503547a51a73ebae9dc2b0ce42ff072eedbdfcbce0cfa8b18c6542167e3e7f88f73edc01f8db56e5f176d631986244ebf9c08b8a7550f1b5171f99081ae8ec92809617fe5f9fb1ae741a29f145f87b190c8a43e108a2ec643f55a576e615b6651acb26c6fa94677a6cbb24ff4fddd678c273c1497424c2a432edd2ee1cd50958f1a0f56c2d59a0c1c11f001c4cb034add1e9c59208e59451d0946144ed93c58e239280ba68e575f1054bd8407731cbab0f9c7b0625694a17a82c0c452c9290782a173ff697b3163a8ad443dd32f4772633975bf63826503f8e342edffb6292deb0463a69fec12eeb6a59429c97909b709f10975569dc7499260e29060020386e62b22dfaf82ec8aa3a2a2a32a431faa99ac42f4a19a53f204e303bab20243440403a8101970c5dbc1dc9db65c832c40e5720d3ecdf8194952f9cafecec10ac361f627c9d36db4db152b2ad28a8aa485abf54af65986bfcf3a242b5a517338d9d72f6fb58557998c3ae44f92272c3b0c43c91587ef903156c6e030c6c918a93ce6690c13f692758d5b5b5b5ab9dfdcba2a6d886d49e5fe52666e3d6df5284d315f3331686c0b65154a6f2ffb57f7eabee6f4e010ab29fb7bea3d8f722399941bd5e09762f6761d35d75ed69bdc7740b27fe965738ec4895bddb82d9c8887f33e6e272a73568c56c7b994bbbbfbeddd2a48c40b4a7cfd92050eb8e4a13dd01d3cdf99074d3930bb75b6b7f27df6a2a6c9b7ac3f0c49b323ea39ce9f0333675aebf597b3db91dad77a3e64ef8ce7875603a6202faf5aaf165593aa483ce60c2583bc786e1778cdbef30c4d39f0c35405c59c961f03f36eb5afa1492cb4d0f0fb2c674ad42b9fa8e746e9d9cbfef6c7db885d500df2227309a9123e2d466e98b1e40acb069e621813c4e264c70c258b2cfc7f74b37d60bb95f8a57cad435941c9908d0e1e12237ace5871c42de849dc80be4783a2cd7d960f390f0f0f91d48d28aae7b36e0f1c717bad14d976bb3a1e9e0d7a1bf03678da4084bf06451f11331f0d8a443fa29e0668b23fb1220db74a73c48ff82cc7b9564da1011a0db834e83271a2021d7c31e315e46273b69f8d8063609af1c4019670ec491145bd549a33fdac2318fc67fd6b55a411f6b5b220e2b50a7fd8973db71f6fdf44bcf2bdfcd47b6e407ef28c3f2fe3410330f6c4320fda797c299b3381dacef3c44bbd549e0939cd4f896aa6dd6c6f6f29d18fa817cb3fb22c2a22acec7f96b61bed83828282f0ec83e7725c50d096e33c688851210c8c9c355fb4cb83b8b2d79a6686259e8ee6a3e32c6a22eab951076ef4b384c8e7463f9b5baa61f327c272239ff7272202aa205624114d39fd0d763cb7a09fdd80dee7665fc44d451ecb9f9f9b9967b9c7fbd60bfbb9f5383d39eee766df76bb3a11b714443cc739d10f4ae4146495fd5310cf5a6f03a70d9e3680daf9ffd03fc82ae817040cc2b2391bb9c12ebb6fe073dc06bca0253da2a8b2fc19673f0b5a12e473232a1f47db8f18fc68e2c7711c6f444e444f8eb327ecd723279e88677327d01ffe90889769b70aec02c4f7c5840247d453012cea55a4d99b5ff26a007e35850b221bf03218d614443c37227272239ef7277aaa48b3155601be220d8635856b00e44c6bbd1fd678b51a931d7aaaf5cc0d6e44bd94888a486b035fdea097fd1bc877a641c3326868bd7d08e2c56585d3f6e9d93b7be593ed56246587caa7132630b09d3021f3c240e6659379b5607e80c26eb75bcaf66db7aa2bb11934b439a29e0f050d8386d99f68c988a6445444be4cb4440042ce9b3d28c7d1fa091318d84e98c0c0d6f9b9321ac7fd96e37ee838afc0055fe2efac02b5a7a1b511680dc39a233f1ded9574256eb5114abced6d6852e5caa22bf14aba52003b4efb29ce415e174829c0e9bc39ad415e45528e73a6caa5024886f3873687c1db3e25693ffc617694c8469234d4d1ea44bd27022072d69c12f56e759ed17eedb693e95258ed64ba6a87887a2d1460a3ea4a10f5b23f91cfe6869c58555972664e932c9d3f9195cdc9d8cd9044862b1ac2fca0f327eaf91349211147b80769ca5a73b0fb45473fe2aaadb65aeb6a74b87c4492272d76fbb3af5ba72c67fd1dbe04114273d5fa62ca71730befd0ea9676e06eb79b1194bb4b2d037829404f56065bd9da255b871d05c421049601b2c9f6bf4b0ed93eae8b9d6cbf68872dd9fe510b17b27d109864fb2240c9f64b8041ccf64df05227db976143b68f029b6cbf774c5a6f78c1294f42b2fdee09e348e5c649ce9f6ea5de0e36987ed8d8c1f0c686800b0fd83b238497223a6b9b646bfbba69da5e936d902bdb1e679be4add70c72a085867f244548226fe3ade61f436b8ed620303ef9238c4f7e8c3c52d229e974d6a7a6b0f8497beadcddde505624b7b906b5d0e95a73f7d7ea6df2a42ac8de403007704e8c71e3c71863fc5f1f5683c14600f830c618638c31971dd80763d8881fe3c68fe2cd89f3dc35cfae9204b528941691b5d6fa677d5afd2a54575056dbee4de65a1d77fbb6a0b46f6fdb9aefcc85699a3585ff75619a4de5b5b7ba7d6cdd8dc6b1f1b578b4315562b715a91bd714f73d77bede1587578047778b2ef1c14dae8e9b7376757ab3989e592032ce59df27d7a0162c99cacc070d392da271d2720d6a1922a3a3c54699ace2effcd817d23cc9122d8ad5dcd565e5500256be7f899228892ef91999c82c223df845962758560e11f7c595b188b4d363571c15151ded98f04916bd71f324c9130bf00596e13d49335976e87981453c59f00187989d282d5974f4e6cc6a9c17e41ac4024645ae41204e5b6e4b598bf56582cb5dba323481050713577cc8b02b430e809583bbc1512e7965168c521e61a990edcbbc4ce9112380966c9fdca2f50443800e3bec797e71010bb1c9f66f1a2bc0ece7e9ee0e1c92dd87fb00acbc40f65065985d07f385b292e8e5b18e63f5d1d7d82dbe18c663d2711cee9b57c64e1ccd5f86691191c1466756cc78d635439367442429ef1f61303a19ffc853bcf1f88d87cb71389ded327eb368d231bdcc2fa2492c61dd2509a81b09948413acbbed6419b1e7a907aaa7e7387c9a744c2ff38be4a0cc99927022927022f14402ca24e22766a01dc26efe907939b35887f0a78e23bb8aec15694476a68a34a7e64838f91026e19415a0e624e154a3469ce764513e847f1c9b852bc95cb29f1dc25f4245325d340cf678e6023673e1c47c9ac55c1361f63334a9f1cf763326b3687a15599d265aab64d1a4e3b973b783e2e9f0d76ce72395f1085f3e1f3f0eff899f86ff67f7b394f10f53c664b310e2657feb43f397c9ac6a0afc7d935101b19ab3df2cfa107e8ccda2e34e202c8bf29cf9f8654b643e9bb3b98f0633bff208a9b398f1891cc3c26948f47094f6ab507a814fe6550b0167ff9a079e1d4d2990dfa2350fb2e772572e794e36f4b2391897536e59d9d4edf5f2b8b5d8856cdb1cd7d65a6bed38de9e961bfbe838bddca883dc5fee7afa0710c3597f3ff2c4f7a62297b09bac67877e4bb2ecc94f4665b36c6873322f3b447423346eb339504e65c3dc8e963b15d9051299d7cfe6caa5d20998bb6ccafda90c4b45c668b9735cbf8be0d9476028495e343d7bcbd9df330fdcbe07d66615bcb3fe05be9810a50f393bd7601560eeaf522557999151d491d3c8c8d95f31ee6c6f234a3ace5a6bf1bdb74dbedf3b4eff9a35c83588432fe36cdabc9cb9b8f7de7ad9e4a8fbcee660f470a6f6953c356a34353593f792e36e0f977ac8ebf512d39343b991a34978d65b8ebb6890b3ff2b1aa2e3eed7b7b12f7bc4ce53bbb7f639ee7ed02f88a8e6795337ef4acc0235b8f057e29c8c5167ba1d89a1beab73a6bef334fd3c3317ed69863474e49d9dced42cae0a966b0d969e2e755e76253ee8527f7aef32f90eebd0fd7acf0b32fec9f86519bf57af8c7f367381d1711cdf9cb9185b4ccd75d66d05a83953df65edda8b005043a328388ea707083af9fa930fdde8a6b8e672a3b465387c364792cd73dcfd1af4dae514b7e543f7bbf2bd68bcba724fae5fe21ac63bcfcd9ca917f4faba402098047f98f21d104e39f5a87c4bdc8bbdb1dc28c501dd28ade9e8cb722399937c71dc712bdf1f7d36d7c4610f475fbe1a18396b4e6bd7fd1362c8487d57b637a9de827cafeb90efc3f08009fef7711569cc378626a1492e4549162fbad827312151d20edd4f1aca61cc0f447455c7c42e55a5e4483cb1821052420c1d3700155fa6ecfcac48b68c21079faeec1c800839ae614c270ddfcea91ab06eb511c6a4d28d6e444f18d379ef4d57808033452c1dbe956e74533d5f6828221350e74c85b2e76c454cca6a73f65be021f1e9caa6554961e92c7a66d5a021a5f35bada7eb21c6b029ea8a8063803a1f4d7b6b2186f0c0d3f9cd1647e74d3eb8a4747ec3208eceafe41829da61c2c4018f2e5ea5e923d8f7778b92a569da5bdf8102854957d6590f4faa945b2862e749e7371b145d0ade6e45c36785060570d90064c2c9d93538a0f42f7b20d0ed33eb01ac36c95353f4f37e6a6a6a6aaad6a9a9a9a9a9a922545454b54e4d4d4d4d4d4d65a9aaaaaaaaaaa2a2a2a2a2aab5aaaaaa7fa8aaaaaaaaaaaa9aba53535353535353756aa5a2a2ca727d15a95e27f59ab955f7565555555555d529edd76c7915a9da1ed5a5143b4e1711e1d3daa5317a82eedb01d559df8bf44050d6dae4e6cb8d1c1130e0faaecfa958cc00128e48cc4dc3f22ccf8bc5ee752fad40607fb78c395c69727391c9cd25bc5c59a670d9407241e518d753eee7a1c64a070de095b9d61413201693eaafa83afdebb7b0dd7ebb7f78117fc5ded4150b15c85794d54b0eb064bfa7201c68396965f5b27a67c9d2ea2a56803d741d9120ced3519c3872ac6c5cca5c0fb287dc0f821bd5abaceb6b189adcdf822784624501ea1531c939f200641342b1028e15cf22a944ff5d2932457c642bf7f78c04e164e58a0583e3704838bedc6f9fcc168685a68e96036568696d99f94bf0a3a47d86b0011264e323b3c991fbcd1a4374ae976c1be72a48862a2a482648900c6f4cd1dee018ad1b75e8106b4d41825258e66e00eb4459a666018509ecdc34e568d4e09a2739a5e5ea936b708d0be3aeac6aacd44865524d2f3361a0cece8bcc7a12015ed793ae2552b906bb9e74dcae2536bb5bae6dd8b421b6b922db5045f5d8c6c9481b156029c9936b908d57ee376b0db21996b906d958c97dc5068aec842c436914843974d3956bd0cd56ae6ebae41a24e3e68ad681a01ae2105a642e6bd04d062d437777778b30bb89f000a77920939b84d9dde7fdc2bb59ae411f962450b60c757ab9a5fca9c8b3c5dd0f972b0a4e9cdc5c54b91b0e174c8aab0b4d9756965b1d77f21a8e0d7f1344ee3772329b3ba2c164c6375f606fbabcb942be899292b9be997ac324f793f74d54eebfd5c514bb8a5bc5267578719a8eae9cca2ce5f48364e804c55c15ddecba0d30a7649757ee4c023a5dc81e21bc475a19d765c315558378cb201eb3ccb0466c85e706d8f8abd18424ade84cc5eed7698617846315ac912348e38733413a51413a4282656208967181c697e09b6099235741323b266490868ee00c3b413a2ab4a1b33b8333bc04e91483336c98b1c436a738078d95d6e532a3370e9b66534813336a9cc0e1e750b56fce92f376d79c4f2839076a1cf282739aaa8272be4822738272d868ddf10aca211394b3859473a74ca6439443036d44ae413950a49c2639bb26bf04204e31ca5df3707a71c8a81067786bc8284cac383fad338e2f8e14960a9ad90aaec922836388362d18d608c93558e7cacc35b84687d962ae724aaea991fbc93a5439bd976b88dc7fab9d6ca7b462b239a519b89cf1eabac18a16169d928e15884b8814bd8470d1d5af68fbc0d2f5dc3054131f45ddd191b329bed1da8189923233e8fc51b0b90a64e9d0c44a0fcd0c5474fe30ec9755cbafe9975d28dfe216353c2ac12d4012a56dd379e4d4cc25ee3ecf93279f3505ce7144379cf8efe4230124f1ba754b41c8e57bc08dbc7c3b736171318e328ac7e16cd2371c8a22845bf30540709c1fb57ddc0dc594d3dada029472f94af984ce65cf5ed45e74f9fd4ad9a270a1d4960259f3adfd15f528e3b79f1e658beb3a3be34f853e1042e1b810ec9bb31b0c131cd7d4b2158ef39a6337f2969ed5038e5372a647beec7fd462848a5473370d28575b730b0842ca97560b729eb0a0eba7d59c929219b60ca380c871a4a8ebafb5360a2b8218b5f8cb16357d16e42729005c3a9e376f49eda38738ba193689ede543fbd1f3659bbf5fe9583d6ffe083d6fbe7dd33493ccefe979255dcfcd87c616965c83486ae4233de8911d729fafb366cfd50e15a58013eacc9fdd9270558f2f40743c7fcb77279ed50e3513ef7c259d7f9d7d8ffd9e9e3fd12414504ff2b173fa7cf92c287ff6ce6484d9f7a0e5fbfc08b3eff9f27dd0104c4ce965190658fae5183dc07c9f04964ebee8111694f03e280876a807a8f3f99e4f2b16971ed4004b3f5d89563b64d1f6b2433c6a0a164024a5d03c54b0b2d3999f823b0943054a67a24c58a8d1e20ddd28751ed99f2c8f8a5449986d9b9ba135eb24985fa20ed4b90c451de85d6ecac031ec727fe9a3e304ba1199676f3efe7cbecf8f2042c4ffa0357bfea023f8fcf9d6a2239c0f842699493c4abafef971a60e6c9f2fd7ec8bf8aaf39a456b10f0f99f27e17c11280b667ffe0f7aa2e7b3a0e77dd09a7de08f8fd346d5116bd6c60cad5db489cd85d62c5a339f04f3674f82f93ccf8326c9d0114589cefcaa6be125b69c9f9556c011460a081adf9d2b3a17a10312a81f8c10b9a186cedf813e346f0e4ce175a6de33dfddbcd53a64dfb7bcea7e783107e2e5feb2767bf797e3babd52c439fb6b56ca697d142865efacde5d265becb75e976773b0a858bf305db828a647f38261e8e4b4a1ba97ad5d92ad75143925075071f6eb5b34ba9464b1c28982a551792f41531c8af61f0c132a52e76018a65c83618464fb27f86411d97e0b100210e7ecef4c561636dbf427dbb45e60ff96ab0a7b3395f304ca80777a92e7703ed4454b47b951a076cab02ee5f817f5fa29aeb6c2fede52d37a8d61e65bbd64fb974bb65f77b8d7ddef051adb12cb5c1b02ec38fb81da016556be79c423660302fa2f2a8b2c39b565b75839b5a11ea829fc09a0e3ecbf35abafec5f231b69b3b90830677fb7e6b243f563b72edaa13acc69f36a8c146896f3e14c7d57ffde6200656b519ce3ea57ababe8d388e7671dd8589db9a3868b105d0a233ad008e21524083abafabd6ba6abeb1d2dccf9b9c8e694a0c4796106921d41c81044fe91c68b87ac323b0c75f5bf3ece7b309f51819932cc35885cc1482193cb1e1262ba1a09f8ed5b9405e363b476e47ed5d9afba9ed54e1a5a672dd3551d7e11fa4b789c08fd25f4b70001cc29427f09fd2d40a89ffb3aab50bb5b212c86674ae6f661636986ad4a4ecdec7f7b77ff6b83d91cd7426dcbf81dd7b69c2a659b10a6d148d2e6f81b3ff9240ce327d1779c902db565fc30d436de847038535b0bbd0b615beebcd7dab00bfc371139ed5c7b71829bddd118b87c518be25c24067fe939f69898b1cfadbce752592a0e3ba99d852ae3c72568f8dc990ba237eabe12506a97255d5d55c3245f869c512384102051826c31010e73419c690381246ea92fb404475328f78ef2250ee5bec4a9a4784f2cee9c2c7e2776ecd8ddc41cab192bd070422308396d9a1449e204091a2b8e9dc6ab43f89bc8c5a2c779029973da40b4d65f33aef95ee0b0bbd421fc60aa97993519cbf0da35b0a6c0bcee79904314f057278d9129bca7ba82b30a79c35cafe42ae4f1c875e64204124d6a5d0b6701e54c1bd85ac3e691dfd8043b849fc5d7993690cb5ef75cc5d213f2f86a9f90b7b494b1bbbb7b04c8af91ba9a08b18fa149ad3b6973481a6ea47ad8b1e3e3c1aa033ae0b0e992c6f74b6282cd91e84ea6ab9140a2b5fb34a51bd4ccd0c60d93951d6a74b8869902224b8e1d38f4b67025c0e03e80864d0b3f78e84aa2c20876b8b2a305c91055d6e087dd0ae038dcc4e66a6016ecc2601666af0e1cc57bef1d0104c7e1b1368e0d1ca2297e6d658c8b57396d3a697bedda286d61532fe33519bf4775777b06584eff9fff6cbd1d93bbdf0b7c442bcc5147b613aeb0439883eb5af78b9154dcc57e61b09bf7ecd0ad98bcbaeaf9d0351d87819273fcd4e64f50bf72dcb5c13953ccebe5fb98e746a903f1d325cf9387a64dccade54667fdd95cd5ddabbbef5815a9f3ad421c76f27dbfa3881ccefb2d1cf796dccf80777fbcf82decb1b54f70db7edbb66ddbb66ddbb66ddb5919f4ba6ddbb66ddbb66ddb56a8dbb66da65911a6dd4d440ea75b9e7f06bcf303add3997698879fa4b5a132d4900b0bf37c56ea6809a8c956b332e89dfeb7687322006daea8de25cec545240e87d51e1d0101d96c42e9edf9ddf9737179ea29d36e5cd3eeb60ecd507092f69a50cf594f4de16fa227fb8f964c9572d1f2b0cbb66b10681dec6b319f11b03a189af3e1b45f26c141634a1ebf8577eec7df4075e6817fffae6de85cf658d381dc08067b12067b13a0781c2eed1c7b7cb3b991b52610aa29f077612295f1cd04b5a6d0f5578fdd6c5f53589b6fdb603ee3c71e3fecfb531aecc6623fe21136c66e2788c5627f63a808f093f93a7ed35ab2f30735a700a32680a5c0667f5bc351112e3f8fe77abe7e6b79ee7c9f1f115f9b8ee3ba3aeeefd1adad1a0b04181593cd7577afebc3b03953841c9d13d73f42c4adbb7ca8ffe7d6687c68cb87facf5b6bf9507fcfadb37c28831ef5673711ec50bf790bbab5d4ad7bfdb15bf3ec10931dea2520b455ff6e43259bc28f5f29e10d2fe18d32227215dec8baf14478a3861b50247215deb0612257a10a6a4ee42a5401ab96ab500526a4500517f2895c8536eedc98d0069c6ccb5568c38b8c96abd0060e368894454ae42ab4b194ab70894efe2eb900b90a978090a67009472e519c096b90a9f113d6f0096b14c917e42aac71a3a7c7ebace52aa43126b79006951f9eda8b9f6c9f275b346541069204fbbe82437c25812120c88f1c3570a8ea6188520f30408a48a9a2b2d3822f3da92fbd21686e98118534a084bb2ae1ae09cd0dd74d3f89853d9ee42aecb1a45ee52ae47165610f2f77618f6276ef0162f16341750279d75b5a3f7d1aed3c61b7fe3b7331626c7d66da1236de1fe77fd2aa8ef6392b927f9d790b7f9bab678a34ed88331cf3654bd74f76a8bcf840830c53726f4edc9d324a6ca8d1840ab0079d52d4970d587ea4e9b20388aeffbcb3c4a448111d5f5ee8e1515eb4c43cd968bd838f324ca7bf75f4c83be84fa17a07e90a3bf2a44ab9f6621422dff79cc2aedf6a13efbdd762fb30180c9694c96caf3d7d8cadb65a38be7bc3d71826ac6ff8edcd0429e4d1047dba5163187a6d409cf67d7d1bad8e73c225845717934accab0dee283f27c6f0c8d1e104494b63e62abc3243ae49ebefc8da22ac3b1549c62d79c14e1d214c4c5ababe22e44893ab33608a5074fdb43e23ebaac12b42822d7062b3f4425ffd68e2244d102a70805873ce2baa2cb709971062ba54d5f043e74d3ca6ae9e78e1518105e35c9161c5f132e2c86643ef7042459dfb6c2667ae422a578ec8dad0b1a2a505c4d70b5b7430c93dccf2040bf18c99aa17027085062840a71faa70d1b5d318294f6cc860a3cbace93473150a7d2c3971ae42a18ed99793cc5528b4419e422d694eda69225761504d2e731506b7728a0382b95182845b514e583b480951ea51030ea00a4eb2d4b800f352f2f57200a305c79b1f55fdb59f4c214b531131499c78e102ecab1408770851c4cc961a48ea0e36ee68d5f09111d345b3413962878e91ac24552a9da8362a6c69f284ea0776aa72e5ac02c6a6048399a8ad2b36779a60a943bcb171e405235c9cb41499e23562075012ae218a34fcb04583460c72a61c716345888581ca7046258d79b525c84669e1cbab33a61421b4df93df9d0ba4bc396d141c6653b80c953a78b07c9063429142e4d1c1499bf20a48903f79694471d313e58be797854195a50ca8c050b3394ad8df9a11b038226054e208fd6228615a21c6b870e38d9919927cd1f952560e2a5ab044d56162a3a6fc003af223c509adcc42054aadac7204bd4a22748584953244906d414361e8141b46d82c51c4fc582433dbc22c5201c85528e74cf6c95528670701ac2063e3c20e165f0b5abc2a2c3420080d2b350421e2d3e167a3290004ac620dd3924c8c94c07281ab61587262107145ecd12d74b5619a414e0c5740741796570b25d61b2792460a2980012d4068ac16524993fdc9e09d2e2115279944aec22b2c31248d77426e8e14ade8a04388145d177901c80f4b585898b20597af8f113db8f025440e3ac8a043e733031a354d9eb0a658e9fa695a948e9ce9a106710a1523317414a5282555e698a9e1c80a408c20ca964ac70617b2cc98c9bafa618db9a529c9105b6cbc748941a5a6e9e2abf3a4d5848d8dfeda4ffec454211e2142a4ce152e45525ebcb8a1d314430d5c15a8c2d1022f5da2a4992125a7b8dc9ffb92de24f7d77eb29fd6455d94bb94d58d6aad582568a1b8e6861c2b216674e9295353ef8cb9810ad312283774f5ab08ca5a913ad712b9fac446f3ac15ad75c8a2e909b8c78640a2d571b00b46ef3be57dcc9426379afb28d6be76528762283cd584386d39ced9071bb4e04c7d777fc999eebb8dca02861e61c2e9627f8b51d79df2fdec01b9ce5c9035c5d659bf73154af12add475724f2ab10f9ba0f1bbbb31048dc187aa68d6f9edda241bb13f6338b02f538fb61377c6915895653b407d54e1ebd2b5263f3ba11e94640bbf3afb5e81df1b53c78767f286182bbdbfdc827c0be730b1f672194689ca3144a2166ff0fbc9cb55c8552aae40fbc4881f2726290ab508a546ebfb77f78d213a0784c7210b33851814bc76388ae7e1dd1c2d393219931519e7c8863e5fb014bcb4a8b149861b5b9fbad235dc80e233e9d0be9da92d2954e7443e667a66a8897ce6f9ee589aec4d631ee7a313e793aab0b14a0ce53b0dd3cc09cf561b90aa5e49801cf3257e1ef0ea9c329cb55f8ab332b9eb35c853fae1ff1570349c298dcdef883a1b4f3fb11c176763f206410c35f8ed24ed1477c952a8ca4bbc360b016eea499a5b9f365c61d2fb0307764454e9c6bf08e95115f25498ed62b767bef78ef68edbde3bde39fa8161b716bfd1fd7f6fdd2defbca80bb81daab37f63ba2ad3b905bb74e5ac73e447d77b7d6dddddddddd7bba6232169323d94af792168ff68bb4d36e4d5bf18d55daad29c691fcae2389dde2d192b05b2f49239b0506363f41b3d96e25cd7b2bec8a69a60716c4a8b1277c12dc097d74ccf4208c42e5e6e8868bef3340a9d6412640be288a5af4b2419454227ebc6786cdb184c56c8c84dda05c8186e62c84152faae32ca672ca7e4d4542c16621746f1602d94f9e2dda520db07fd1ee0ac197f82c84da1442ff9a8907b796e3da71374c59858ea064a000c3843958b945eedcebfa5148aa4836b7cfb1cafd05f086fa125a162777172bd024cfcf1e046573c8593f357b3d4a197a230e5c6438dc91a1e46195357f7df2eb031a15c17d19525a94ab52fdf4caea456ff74cc65f6ff7f12d04155fa4dc4993728b20464593613f7e9a028b5a55a4f54b1024f984ce309404154d1e5111c4a85b78f9a224f8fa6952c6682acb750b2f57b4a8a93cab8930705820234689942bba8ae30a0ee1531132bc324a2be0f8f5d055278715276176c852e30908ab362be4f2ac390df81087cd942f1fc516e41830274750ea080b6c6820a08c0eb2eb50a264ff0be5274508654a3e690f805c85509ea0dcc8290e58c30c88774da8884db6ccc060796f78cc80e46aeacd19d30d0e3fc0110244d49c324762bc8b63860c475499233f4a3538558169f2c147931a5d3f7946ebe210322939a3f5d3819c3a525ed84186865efdb1e1d1a504b864869d1a9878bab2fd86224f57da8b471a9c78ba12460e6980014b57c664e6bda9f832a53495581175e5ccbc37a42158a47e3b9dbd555dc9d343430c445d799af756bf2411b3d3099d64097d5dd5e7ece1f9f91931bef6c7baf7cfcfcfcf4f1d004fed858a2fcaa9526eb47e71e28649676f261a5dbb852aab50d201c064b9d1a520cbd2c93ea9c4d2a550ea6428931193642c168bc562f7c64872fc7bc319bd9946f4c7f90e6592e7486822e5439584263ec7359a6271f7c390343cec8a724d71b9d2b9caf549aeb5d6b4a3a07275caffbde5b9aa337f7589ae7fbb5dae3ee727975d7b61fd630065f7da0bfbf72d5a7b6153fb3180b2b5e8bd7d679446f7dec7f6479444c9f6db637a421e2fec6149640cf32dd090b31f5b6cd10bf3aee692f2cb6a515cef0bf3faa7f5616f1d067b87e16beb2d8d795b6b87ae4dc77c2d90102167bfbda53fb98ed5dbc229ebb7f9ddb6719724ecbfff0417c1c9e149a49dbf2212c82bc9751681ddc5f6011bd8c0f6590c9cddfc89c4b8d61616d7582c1693c564e5edd618ee22597cba3787f20169459444dd69c6593f75a762b158fcb5c8f66b03310662200c58f5f97c584a56b7af6e841f4d4bc8f66b91cdd55a548b6acf11b2c70bc3961c2f0c3bacbabd31d98f88740437591dfa21c1fd5a53603c8ee31df178478c6b2dadb5d6dafaf7c78791b8fb2d7ec0cda48de6b80b849d1ddd38c7f1e2b63c3c717e2550ee7befbdf7966543f9ae9d6e92e74e215b9ea19071022902393c895cce2b725ffb2ac97516eb9007c4caf5fb572dcdeaf449c58067ce6ee543feb5eb8d910fe365d81c4996b8d8345ab148a39d2789b653d138fb79ce735e778f17d8ed6f2f26512045b034da79da87f1e7b0bd81ced371b5b48ad40fb0b951b20ec12c0ca3d5f6d3cc13cba85e15c3d08bc9d8bd3e7b006d5ca2e12f47f383231b67bbe3b177a2298530d59c3aae9c294dd884c69be18fa9289c418a84197a4226409c3fb90a99a889e120649285872864624502135f0f227215ee60102ee181c4913492786198cd21998ecae4f6e9394d7633611f3c7729386be0f7936db5a4d741857dbd1828635bc6172329669c842ae324753256d2022192263801147597b4829553a06ced934ed94a85390226e7643a9298634dc2d0679f1747e2ba02fb865b002149dab2b4a0c8774501a258c8f74611f315467dc98065048891334798e4fbb6998b0b1c82470d29cb560c3d5cf849011b56e608856475d910821d4350015de08579228313c649898ee5d41cc6c00483cf859f343091b8b5ca150aa39e9d223f18967a55f2fd117eadb273d192bd0277bb1d1376770f223190edcb141774784148be2fc0c997489b7c1f68e6e2e23c08fe8a4c959903d5a6c2e95a3213e60a98c3862e5e3feebdf72289e81da0bc64ff938890ec5fa17664ff9f1f9355046a862c594d458061de08b9ba74d1dd77afb2374c1704cf147775ad430b37b2b7a043f6f7e16037644abe7f2f10d016179a96dcddbd67e6c2de03fc8450b09852af4e3cb5207c02234488901c8400310487205f572b089a7cefcf662eeebd5d66c8f7eed0dd6befbdf7bafb9308a2c50343a4188963f59485850c0ca106889610315d6ce82e9920f0a9ca662e6cb35027fbc7662e1c08c86f53f62f35b25f7f06b8514f96fd0432b3e92890fd0b643b404e51aca8522b95da4400f93e798ec9f7feffe0caf77148f2fd222735f9fed112219038421668c8370cd40ae38f21739a80d8e1290a4d0d504a368ef49858197952fcd259ac2d3f5670d2247db02a809633c5a1f041a436f4210719e483c90412b2038c81d0fd2d35abd11e4dc92c03051826e08a64a0301e99801da645b45dbda8ca74f579fc72c5ca55b8c32b976dc2d8c1952b9c5c853a80c8e53561d81c08442c9b4b9081020c13661fd8dca2a6e82f01a5a8ecee96ea6e18354577f737af9f9c78367826f46c04d893b09128030518268c6852eb6a8fb3434d9481020c13da27a6ac42a9f772fdf28219dc9beb738595d70f5023a17cf34d940549ad336bcf95578e3a344059a9a1e4020d4c96b8881972078a7923ed10985c10277e9ad459bb6967733da30ed5aff5ebd7b7b9aaabb75ab635fbce79f5fda9bebb33d52f61c377e5d79becc92f018677ef588ee3388e388d0194edf52f6501a14ba894cd54863d2a15321a010000003315002020100e084442a138288d7355743d14800b6f964a704c9c8ae4b1284851140619630c20c400428031c620646a68a8004baa1f06d535be4c8701e5d175e2d64b3a9471fe00248f77e5e78dc86222188f15d63f6460204116009757c01e32e94b34bdd30f1d3b3e2100a17e8961c9c9e9c947da11e064cfc2aebdd2b3629f44c08d80b17f0b44af49e9832c3aeb1ecd5c16763a6776b3d5055332fb7e0399288397f86748918eb2dd4a0645554b23d0c75f400d8b73c1e918198cfed96bd8d7632d9707722cc4523011a67c19a6e2ab61a647a60a0408f33fcec2673c14412d70312a99f804a193db5a6d4ac48a04a9812cc5c66cfb3eca9b10e41d600fc81a8d6da97e385037a6fb4273fc5b7ce324da5e73c39281b26ccce520210a8e2f004eac3d10bc78ce8d61b3a3831d5931a06e241dc48acdc0f0c676328df22db64dcb628eb065d63822930b59322645e97622ab51d8e2ae132b9407eddb1f003e0c3129369e88805efc94349d64d3b6c9ecda89a0b021e704d4cc2d9cefb6f2caf3fbe2db17c55cecd562c8274205b9c50c74c19d792f664b2331b5ed9f8fdb7010e6691ca33722a284a54ca52d0f27ab27a371642b8795914b80ab4bd47a046211551ab41453ebee2db16f18fbe353439f107ca6d902fdd475456249986149e609fb160f119bee5333d83ab12eab3a310484b0219e3f8141c03051b485801426c7e79afa73c4ca98550d4f3068d8eed8748f4001deb0290290f921d63531f6c66d223655d7533d3ccb1aa8084a337734f2aa24e437a68ed875c48af1cd3a97f9e180420967b65679a93e7f63da07be5ae7c3e398d9f087eec989928397bbc20f43a3813ec8a61838be3067f0b70ea3c39657ae965757fc4e0587a2b50eb68c998fadccfb8cffa08f2a773538340f99a7c7470d9626aa9c040bd028553469cfd7214dcd79fd88cf4e4bbd17a94936d5b325bcb62f4645a657b9415fcac36b6e222aa9a0f504c51fb5460f0d51616ec5586de286520360df358552128af5fa118b317f17151a0f775677ab3f491fbe114fed5d34208e925909949e6ab931ab78c61da598c3ebbc311d9a8783c761d595b2cf7a1fad481a484cdd43c832b72a0389f4d67a3a509fec5d60ac512b58ede6c4ae6055a73f1e09e07c9904ca0a63ce8507638131be87c9df72e12d60627ec4984f7babe1f6f01e357252fe5680ebd0ecbacef09d012ff197eaedfa902de60681667fa1d5f2154b995f75926c73e34a995c47f516195de135c5690a1f1f72ec3af9c04eeee7765350c38a0300ed90c9f7651f9b728f03137b7c4e72a11a45cbfc0056550fd2a4e455cf52463b3acf433e5192745d16e539bcdd7eb98e0dbd1259e13c53c9f9bbcac78a325edc9717d25fd6e2cf7bc8aa3f465c910c81bb71761320c64cb770ff20de37ba3cd5ce63d78562614aed86ef84ff93b715576202bb9acfd43b9f3e828512dec4a4180e3ce90004d7e27da8fb6159ab3119f8934ec594a4ad31da945d854c62d22ef8a551f7401fc5a92e02924eef33ea49a4e8a91844f214ae74cf3ca5296082c6a4d15b25bc6085454bf4e6300a059dcb912eec62fcf0ade2259448eb45ac5ee0f5deb7022bc3c5ff85b6b0defac10808abc77eac0155f0f8218a315b66b607b4d47eab6df442246f3e88486cd0a1866cc07febb9402b8f5b4841016ffb7e40b5d66ba9ab1329f494473147e54a6aad5182ce4e19b401affa14bc537afdc1008fa2fd3307d3279e2b1b1fc070c04f7f886392618d41b0e0ff1886494ba51bd72d83b62ad6ba9a2bddb80d4ef1022232218a17464c044ee0490e88f578cd04ea1360084fc2ad901ea1e86ecfd8963a3e9861e527a166afe9537d4d9b79356c63ef2c48e76f15f1e8dd73af4523acf1c0a343f80e174406ee10eb33d580c27df4eeb94c7b4a1e775385859c672f4f76023056158dbe089369a4ef5e1c1360d9139a42d5c1843fc054adc48540b0049009b6f208d7b262c038e25bcb0a968df811a61f7636328aedb7713b737d7708915961381a5d32b89a6edcfdd05d7acceaf73705f7595422cc3ee00d2b77d2911b88365073e370afa93f3696437a00cd727807f7f99ea2ddfcfda3c1b3431b0a8b021fa7d8ebe86beb0aa5cfccbaa966166736b3ace0ccca315c2f74df58c8441765f0822dacb4583c3a85cbb3b2221287ec5540805840f27115015f907637a96bf147011f0b269aa08af7886cd343829d43976b2a2b6d869aee97c1dc519b06dc95b1dc85b8445a93fd9eab887ca425e18231bc378599014cd5cf83b58361a48781bd7cb25b00e9887942a3ee56312f3d4ca5b1a6a5dd040ced79243b7263818531f8ecba7ccd96d8bed16f5b7c995c999604663622b26807ab59809e31f66de650995e9e28d7014dc2a6148750503aa5c9cc410411b3fc1ec7a9eacd55f42f2bf64be30c1c245574f07cb2e057a8cbfd3cde64bd20795ce58d5e31bceff400911ee10f9e87b307eec1301e087cdbe0319ef8dd0ae72c89ddca7a7ac4d5399e40f470baeebd1344921d4b3baecbb1bdacf03adbaab7a7f7394a2919ae58c882268f4d47823ec8a68b6168a0fd97392368896631cd9b4fc196746a34c3cceaa25e7a7fcda9c774e3d355dec7c44b5960bb3db267cf4088aeaa360d94d32463307bd000d3da83c0db0f9eab22a2a0eb1c884ba6fdbb732618786b0b11d175222d0fd38b5ded38200cd6f2dab10daaa9e65abca0a7c47a33cf1bd7a332d86d4431c4e9f17096fe71a95099d18b2b2fb5e4cfbe7f72e261a68c6f909322d9fb2433080d48334cba9413a7208002dafd18cd3096bd6ea7d5932a191da452101e20b704b8401c396ef36b71ffc790365138876052998d1e68c9d871bd848de68f225f2d09bdfc20a2b5c32ac1322493b64a7ff7051acee1b1566afbe86cb5b15865a4d76379ce89785bafd8244a7d0bdb1b97345206633af09ad007bf14eb9c64e477e4373cc95f704b2c82fa0fd2d3c875b2d5cc18220414c1251872d817b1fb6cb02ba18f9eabe91d0581ffd23d34d8286ab0270d4928adb9f88221594a133cb38d3fd9a92a7c4f9efb870b2f6547d8427c0828d904638c3068b406dff6a8e998de09290f7f630b314045f4fb343e82a99bbed9222e738ce8d37b100c92a050c7f5f7d2902565a3596f51768df441d5c9635cf5fe24cc8a15a1888db2255a32d137f23b89fcf3fe66ade8db36af3df15538e641778d809e20e50cef0201aaf311678be2588bf23677b8b7a5cad544f37bf4800a92b4070967096de7f8cc78f8722f5846fdec1ce3674cef3ebc3b316cd60d7a44f89428788744bf102044f6e3f095e7bfd50e4905d45e7dc40bca0832e1e2deaaedb86c6f5bec4cdf20bbdbf8b9c68d5bb1f5421340562c06e22789401a2fbcb972a5afe8591ed7af7a782961df985266ae602ea2c592a477fc625a02f2443a38e0d976e625e89e2a8a698a53e2653ba871bc8f2208a43588eb828acffd2ab062098dc9296a103e6db6b9ef9b1fbdeb207d9a890140a8b7628520dcb794eab9971d7bee23f839b51473d8e4b15158666a883880f6d6d584fcc42d436a98ffedda58666bcec7e90dba9338ed4fa97c14addfb05783ef00c3425e37daf25424afa70eb6276455280e80f4f93e917daf708f8d1e0701de540240413521179157810d671245f6b8d0f5d7559f109d0b25c8bd8d0fb4303dd6109f9056714c3549ef19430bb95dfa8f7d311cc311c4f41e2d3d064e971719896a3ed06e49c62000423fd3c965ca7be238fa019be29f1d8626c41c4e8c58db0c80546d7be8ad6a324e3c8d925e8bb31eaffc44cd24313bd07fb4e6b7ecaba04f3b089e0b9fa4955c532978a088425982151a44c5e698f2c83899342e2ec64a863249c9899c2c95b4ddd64d018f71f39de94736d48637d8d40137b441ac173fc83f9f950cf2b285449f8553263a79cb6c33f6a16f771c300f73e6e09ec6e431a78e7abb36f4bfa79804d8345c1c33115a3c001606244a0917982e3f33c983b043f42aa13f217960691ba2b2e085c22af22f87650758167e792e9313c80234cdee814f01ed31ce9c7ad98f985489f9c2569fa7153ad2abe4f1249640058045a9cf6a63194257b41e617f3a61423b8c2ae5d951fa060497fd10f1b844e84fbd8df4c682aa2a55dc31b858ed86e584938106d8cbcf1206601c93af4afe3686c02cc09491d11e162267db245410514e3ba22120e0a2114223e8469f7fd7b282a453586d79b6f552557eec372fc6e152e2aae988b92661950a056de4a1978882c385e36ec0628cf0c902dc52681a7954ff7437f1f6b5ead04737a460a542404737a8da57bbbf581c77d139a8569479320f073d387aa84057cf2a11706772e9eb098baa0afbe417c09c71a22034ed4a5d4ba82978c4cf9825c5efbc215c08366f9244532326f4bb6a5c6d8b7c99f9a853ef4a7567d0933b39c12b07259683cb732521ecd54521daa05ff586cf5175d4f527a1779c3760a1863070a3f1a56309b1fa50c765fd8b31825def83df42216d1acf4a36861b17e82e89343a33afd8e429e66e6b75db15f2169d27f2a659f31d5b9a2f8ebf7bf553cb51aec426c483db744867026b093217ac637f7f71a6665a646a28ff33774cf67dd9ff2fbfac7711d4c5b210728ff09753685335507aa1b4ac2abcc9f3921104eb5a3ba35b7edb3d34b94837e3a6651aa99edba3f9f2819aa2e18fa6044500884e8dcda7f6bd68d7c51785a6314fab85973e70bdb247bae3a18805897cf4e79672ad24655a550b2b9378ddf4381ac9f5d4a907f1b5686921d3350029b6130c14b821b3cf0e235fc8e839d0fb329da601d04072f14d599c7cf815da90be886475e1d930bc30980362247ec33cc600b3e4cd53036c7f338aa34683be7afe7e61d4bb8efb3a9b55f0a91e297e2cb2ad496b50d618424088eafc9c7aeac5956310227662d86c4a9d7eb3185f26adfe287ce0a87d5187d9b386296e88694856369bd9b5f8ad11b14d8755f1754de413c91d7f556bae1937e1a535d730d7be870ef962d527f2c9314251a38593b3398b46a961b40199046c246bd68b53d1b74f68bb635aa9ebf85ad765e506f906160964d180971e3718310c98c19c21053fcbb45170f6c173d803d92e24aa1c1feda0fde603366423344145315de54689b3471a3f7e40cc9ad58ba6833673d2afde645e27342762adf5df5bf142d61330b192d9dd25ad4a357d297c8b830694c4381c2a2d6ad0350c12b4b9a30072350a371734cf6be7d89994da3b8bc86960420667798e215f39743aac5e2038e5c093f5b735ba78bce8d9375c6fc0952548e849d1534bf2bc06eb6ea8c15db3972835b76121193079da14f84e1fc7b2d12d6d130887e288029a5759fe163055903941256111aa4b30584898a610ec1f2118e933b50f280a070e6c2f235ff0ba35bf80ca9c5fd451ddd694627faa268a10050d220a6a71284a03d567ea1c30f70f2328fb67300f95c7e0728aff03d84b634ce640fa44408dfc3bf8928246563ce1f40db2420e74a796290f29bccf88ced6241fffedc78b7d9ff5b07b3c4d53adb26a4485877fd4eec686244931b7f193116104f8b3e816349ca7a2d72decd2de38f2d95bc5141b0d59cbe7f15217cc46d98567bac567eb9102c977887204005cf4648288e5cdd54540dd77b1d9a118ea85f67f0f5f140629d5fa3186122d3162c5ac2e97c6111edfa381e53a32d67bd94f655bb7cbb8e72d9acf7425a28070918da7b382533acaaabb8e81bfcbae3300f830058dbb194a603d1da78c4e1f45a28514c118a9b96bdcdf08b44668a599510e6872109ed80b8c0c253ffe81929a1fc45e06ad99f4435323a2404dea675eff225dc32b03833fde34dbb73330b01ae10fab8c914df5ea31b667e090fcb47df6ba0547cd9dc7301b66439e219d45382a9848c50acc4666513cb8c9d925f85d66ed498d9cc1e9b4190573af67ab4e228c24e8f8d7866f20dd6c735fe0f40e13f8d087452b0d0f6103739a060d62e6f0cecf8f18966568815177a4b874b9cbe0f687f65f8cf78c654d8ef26ba92455c06c64d30a09a0bbfa1f307a62aef39e7076e36d25abc2b3c32854b187752246756827527f7fc7fcc3b7a4bc5636f53507b702d08d1c0ef64198220fd179771c967d18870cf57f6d591149412a25ce0220f58be2aa79119e124552781c3b82cc862b3b97941bcbe1dbed183f937cfb8397ab5bb28788bb7122da759b7f41675bf4da38f39f616ba77aa48a6f368685e4740cc0bbb3107ef5f13536764dcfb68120d29be39c02146e6acb3dd93d6ed5728587fa0fc8af36613b6ffe6729304b7c7b6affdd474fea28bb31c8b10d330d04741a13d4fd730ff5ea61f803e5833b284198fd92f2a9e8529c40b877ed93afdb94e71e11612fb937a53eadef82599cb52ce5656ada31e34ec006bf9804e4044f9596a8197b72704db599e6dc53a2165609d4e8fb73622ff75bb7f3df8801b721a9e245a7f7dd6690caa7118e6ce465f9646a64e614f374261bfb0b7ea75bc253c5ae808f113ef4f322c293966ee88f0007800216d450518b9b0a1f162b751f004fc76e336256709fa6cf876243754186e6418ddd1a246dc8256b8b923ce53ef1e5faca118a4fc7cdae1c9d19ff83085109674bae1d93c8ccd019623c994856b83b6121c9f92c0dc4f7dd613ba524e8e0c5de74ad0846753007d51f55d1f342aff4ee17b4c2e16cff8b85c5d2041ab919ad14e3f2e78d5a014430176dae023d58faaccc8215e00940b90162ce43e1840a91abdc4b118c25f39d4f55628d5268f17352a9634b143f1ae9964963db4902cef270257f21f59fe41a7c883c63729e116cf4b4da92bdbe7e6bc2680cc8ea2d612b0cbe0f7ce8af86030cb18fe65fec963c2295acc9162c7ee0d1daff41fe3ab2a701248844013a4e4a5347ca8894f23a22dbd3d60e487cd88ef6009509897122d7640de08b050fc07618480a9ef201459b6fc83ca6a77d8556052b03d7dda83cbe6d901ce1e201389ca919e1cf849f0e3092bdd709d79817a207f6167a3f8062bc13c1143d98dd60cc470466f76432fb558c5aa06b6170fad15714c913ac7112dc621bea01b2def32235b53282725100ddd944df7d27e7c8fda69343c057ad6f33c036fc189a305e4976b3615281a66bbe67e33ecd3d432a07d17c1c6ee389b36ec08216d2886caf21572893dc08547e2e271fea3f05fc61b58cd8c288a5ecd5e703c8ced51053bbc248e58828656d9f730ffee5f01f44290414bb10817b060d21787861c78cb0c0a7da035cbb53bb01dea86996ff263add78ee8b8024f805db4b3444bf4c04959d8f3e15ec152d2e83e23bc7f7378fc3095fe857f7ac60d4340aa868e080762f60125ccb0df91f9685826bc0ad57185971600c21b7d3fced51d9586032887ce6e57c2962c34bf89677d429fb2c6c51a1c3b214b275b328ca6961497e3de214165256b16db3340ad67f87e3dd7b6e74b0a1ee853ac80571d170c369175211078b0923200664f5db16a56145cbbd4c9c2c1c6667295c5900be9ba5fb4c520c3409d6728a5f13796249d025d75d568e9419a504b89b603a15cafc63fa430e8ebb41c9d0bf21fddcdf8285f504a5fe14539eaba4d62e1b412b75c202c6e373c77a1f43ed186fe16887f11e8be4255eae5981f3bc99787c1eb2ecd42d7945693e526fc3cfa9890513f494ef655bd09b62286051c5dc75e0122cdb22e5d829fdeecff96b8b5eebe010ca346233a90bd9efd98b80eb3c0be6597e78a3fe89f69714cda6de3ef1dafe87a5a3b40b8e22f19ac88c7fb197e3fd8e7dc7996d98aeedf8054ec38ee156468191dd97dba85f822056acf1532e321a555832b68436b6e13fb6e27c5244e5d4772f6ba0b8b74af8bebaa473933709bf0935ba995bb14a9d6715a3fddd7e917585425e244c6e56556b37c4b7fd182efea83f0c8cca9e3f1c765f41018ff940514da9df322f6260e53ae87fdee396c16b718bb3ae718e6b1bceff3565cabbf529b0e3b8eced78ece44576d6df24669ca104fe72aa4f4ed595e5ccedfaab2808e6138ba36ccf49ce94605f5ffa4a83197ac5db6575b4947ceafe83ede9ad344b2184a0d1c9fe615328763fd78c932f0acc4a850a85a3c39cd86d6a9c23fb97460c58165b1597944d5ab290d9268581a28ff0611076a93458663dd58e2dc37a003caa65d81da1d6d1cc9640e1528af86a8b58247f63e07cdb60cad2f1ea9cbe5c4f9c2e5f98e671a620df04a9ac8458f8319f43283d6172d76bc09656caa26de25f64c185b2a50308eacde29d2aa17cab8089e44d2e93ed20082524779083122e01bda0c5807f337fab5d53baba0f0f5fb0a446dc205b9126a52d6c7c865483e38aacc5bb36c3ddaf29d8c41b8c47abdec3e930392ce55699b0715eb192069ccd2f57c5a895dd0e7616688fc8148fb20a3fb22d45f481fada6d65015680814af070e77c92a7eef28c9721834c26cbfa495c788106bdf114897f311c73c0498de14c845394219f73224adf2b4de9caa0b6fa050b12863fe81e1c2e9b7a13e7b4ce35daf94edeaf453b85868a47b9e558f8ed1b9af7a196bce44d3697996cb29290e888f22aa984c2ca34fff80effabd9f0d7a91aaaf81a43b613102ae2d725ff1894dfb981362e21cb800239fe3100cc43e74b553d855901600533eff3147e8af9abef8bf5607b1df3f2bed1b053bb4091fc3b653c6b676cb45f04052d40168e678309e6f64200137cac1ed14163d119881f38756987ea8dbd24c03277802a25485dd94e50c9faa84f6206d01beaed5f11d03d24f9c24a04347dcafd9cd0bb8625198a75287b6049dd84333324acc39c8eedf576649cd8dc82dbdc0af7c7c48afb7336209f48bf2f50ad14e3f79d06f364d507e29dec743eee66dbed00c454e4adb816403f13f2d98b477af9cf5508338928ac6b573a2b66ee651fc1f783a7161f07627099866edfb59a492032becf31ec7d4467b000d93f4056415a800324d463f2073f5785b22f1dd6cd2661ad865614d41231e837ddd0fc260039e61dc57de55728490321804a39b281ca18155d35cdb63b4cd86a773d31d2042c2e25d9eb6c9cc2a44563bd0b7ea5e57ebc6022372ac7742eb5576299d7d1741ef2d4108ab2f44fc008441fba99f8297cdb700cf7e21eaa441f240519dcb689602a668508fe2851c89f2c6b5f19e6ed28c051ba2be977f0051820be39d99bded06784a6fdf044fa32f5380908b637c08afeee7ed0653f0070d3838a3b7b86a7eeffa4b63449c9c51b9a15327328008acad24f5f82cacbdf9a987309298cf84abd0fc15fc60488594cb1a8c8806a0e7f99a0df2f2c88c99907b09493996016b0a3e379dd6edfead3afe637013c3f32f04708248a03e53516f6c381323d64a24c14438fc0f3b1f60194dd00a9877e914a21507bffeeab0908ce6cbb22a0ecb3fd58160e01109a67cc928b9c765760daa8a747cdfb32fd1383313a1ead216d0861ce43a95a1f1236ad35bd21da6b2824bb045ea02289f24a4c8f12c11a148d4088c64bcff1d53f93650af3b73e54589d41cf245765acc0a1fb4e49726ebe0f08bbbe75cb38ee893db21e719620c8ad4983c6701b2d8b93407d5ad834be02cd88315939e97823bb329566231c0d3ecea2b9198d3b2673827d01bb1a107e49490dc44491d29326572efa0832b2d76d983877d0553196f0c0cb26fd03a8e821830e3f01ca55b305f20099260eee9cf7384a68af48519397c348bb9ba2303057fc5a96234a603aed5165f9916fa8fb7f6661f6bdc12b654678305dfccca5bd807009cd1c0159f9c4104ef3df0c8efb93c8557e77f301a6c8b3606cd00ce1741b3c2e9dac36dba54d369c56f2a96c436c2becdcf8e02004d2b22156edc73c5e2a441d874a0dc517a61821309ecc99e5075745491637a7a6ff724aba1fac33577d40e36b9c04742739fef437898229f54010be23afcd047360d53326814c2561a933f194a30931e42855b4be9c1586f892b30d857d095901d2f094d21de6588b571ed74b4b769e7086e13625caeeaaed08a29bc2c350660fe85a43895303ae283cf1bc25409ff818e83b75a2563809ecbe9be25f029f718bf68124dd8b334e80896bebd054bfaa3dbcfa7c718bd02b28a061e78e09cb5e75172db1eef14b9a0e38804404bdf36be9e57b73f8285802b9b2888b6baf10c4bcebde33640ae89f4632e868c15a89a2a47f54e31ae4d57faada44580c5f41c37cd619a8427647b196c2418f01997e9d5fe3f30fd9a635dd5797f03d037c0616afc06da8e2248ee9f90c0cc12d9e9ee61f9007b97fad5445944e2c232e6e42603f64ff1ecb74ee130a3ae9a1fbe193c56ad847df6143741712ff7c0f58db5485c8f3302b0405553d732e20566b289cd554664650e66f4976699077c802be6ad2aa27284ac8a9689f71558104fd2728f6d00d40a387248115016998f4a536458f13d2a1d3475d6ec1a281f1c89a705e65921cac039c5d791105cd5c296ca71981c2d79ac44b5b9c8e4e6261cfbe5cfbe795932eda5986e66600721449dbd0f23a08d5a6032ebe194d68192cf9becaad1788300f9cc3df3c6292ce5ad28ca044fac1ba16f4c09d77eb3d5593b36487f7591b0ec37cc73d0219eea0d94d704c4f8a00fecfa9c4628212b6760565969826a887cfbe95350b73c0cd6c44f5d8be4d3d5999688044041af52d43d002b301c157e4b2d988e72836108b7ed89e236cdeab62c9a533848d305a4f602f440c9ae7247814ae12e1b1226a30ccb3fa1a129196b79aad13be466b1ea7d7922e4e6682d1ce5ece83802bc73aa33790d429fde438f2bbb6c2c122fa70eb92a800bd294520a7599bb981c2c6435904958c752ee753919b63e95e0eb4f97d716b4fe32d62eff0328362bf45cc1bdcb7c596c6b566cc9223d097d3df221cd770184622a67c3ba3be3479a779094a774c698bf0b74654d0ad28998899aa4682c46d0ba45f5fcc84229324bc46cb6dbac519a60468da55208518847aa2727650556d20f0b1b7080691a35e71b06483fbed9c190d1036167f463a6a882d6712343340e8f8bf2d0bc4b63a3c4e7f8dbd0a2ba0afce2695b043d0d08a28067bafaa2fdb01c7295a234c5ed0f4e3ccd80c117f70e1144f4eab375f3bb7fa04cc1f16cff00f1b29f7675ca9a83ed10ff5ca0bb23efe28ddeeda796b59f0cdf3aec83c442709f17223995eb0684a84f93c8f89a204c8654612995fc41fba526b65f5ac6b804d1470a7cb571b9095b6dfeefc64f6c4970df686995011cadd82becd87d1958dafb116348d884dcef418f0b33d2d951b284b14828d5def76516c7dc77cc615a60a75675b1e7dcb33880d607507f20ff18d76ea9bb96ca1986148300eb3696cef713f3391122e0d3511cc54b12a4cb3df3b0d5ad68514662b03963524bb2619ec3a532713ab026602c3cd6b06b2df297a8e9c353ddf302136652f927ba852a376765b00bc54167ece2c5b2db13466e9c61162feb263a366c3e05c1715afd7e81a32fe09a088d41eb2016cc3a18ab51a191a2de40308d1d7f160676ec39d4deb0191607e798265789befbe78d2209d0c94fd4960ad03197298b5a6e97283ec0c6d57045440fef63548cecc0584209d4db77b5e628ad915d2760121385b14283ff939a88ff10e21485ef80b328b1e5b5f8c2871316d5a0dcdf7f965d7af5d793d5c852224ecfd95e92dc4684895caee29e8b351a8acd14c79bf8d0f4031975a70f829f231cf6202fd580297145229c49e51d08374b0c026c84a869102c310d1221ce14a727e2229319f4a2116f10ade2470e7abdb06fa40264f87cce97b14dd5d5f3ce67302a1c78a2d28090fda7b244044f3a6c15ec1a055fd5ea869beca9523fd847b79cc360675f297a2b99c95cd908f6641168681b8881080147689ecb9c6609d41d2c29d754279f5dff4a46caf7168cabaf01538ec81e827eae8dfe0f2331ffc6006bb679a273dc97d8a50e00c6f63c755c6ccd57db2240350bf6e30cd6e41e0ebf0a7a5df56c1d7a6983f7c2dce73e2d09f2459d878de9320a4013abd8f107deed1c58d631ccd01d2ab56a03b6a9057e0e2d2e2835789366641cf79baec55f30162709ed126f9425f8a8a1e56c27f779a378004265c5a5626e48c097d5d8ae20e1a2682e48fa84307c5a9c6bb6363929267144d6f131c4b4dc5eed7664dcc63bd9bbc506882aa86408efdf04a517510468f4fe9cf961258941a4816283e5d606bce4074f089fb6b866d8e1f33ec28732a83a9ed8430ee15270ad85c104502fca2015fc59f203656465c76b9f4f27e75a0f14fe7920b7f5d8d58f6d052e2a526e8b03beb24d28f2d70367593f3c1a3f79610183de6dbfa8c259ae65f6201cec8d49b809dab86ea373f327a18aef0daebeaec07f1f20be0c912e06055d21e19b2c062189e664179fdbc528b3f5fc5cd34ef403a8c1ee1389919c045b49281fa09fa76fd843072acc4e375e3d250107c0d13ee4d0241d12c108a70b431b343a5908da9d543b10f15c0bdd658cc8d1f7e7b23dc5a2e1f7e8f959f702d7c1aaf05041cdec0f9e7e0665f2e1e749867480d9fa46b275c6fbf40fe9ed0f3d708b95f775c2c834c1fc872e61fdb9c3b96fc683b1a42fe5fc5f189659548a3d36aac7706644ce36816e1cb2e0329c1fc6fb6da260395c76c704d77f093d25312974b265c2f54b07ff5bb4e45c3eb476e124889e521d39551f56080b46d87a48c01863cbd324bce7b11f9d248f5de305d00b8eeae555e9fd4579af99b79c748a4b25c658ac1e80c25efcd11ecc1c301a301069847054840eadedff373f1b190b204e514f8f55d4ce1d24c3bb775298fab6c402f3d259fda597fb24cefff11f979b4ba7ffe7e10b6b30210f0ad08e929579a0d6c497aadc6e046d0d8fe14112b9b15206eeaf35731bea11a38f8594bf9f1646e5c1e39a306dd2bfd584a1e1de925898e616fd1302cda2def815eca6aa2ce3a5f52e046e7c22f44ec6dbeacc34aaac605168243370e4b0e914162af139cc9da211902bb3993afde62703a0639401f99bc2150cb8e766a73d981f1e89d2fe53b06e9b5ed600cbfc8d67ba0adc8ad93c4909d5b34f24d12e5ce5b2c514160fa6959684b536f0b2d3bf14eb59c4dd2ed644ef432fceec8eb3303db5a35fd4e8c27c462820da85673a3bf6d3650c466026cf0c5bb8d49cc103552d51e1c9b8fcfb2baefae1e6c4105979e1f7472d50954afa1892520598044e63ba0fac05dbf36232242075c70773efe31221c9e0e61dc2ce8ab46b34965171326e1f51619356d40f779199e4a883166c3949f3ccbd6404904519e5e376fc2876b64b1b8cdb3b2f3b9e1bba1d384563e19d6cdb608ae7443afc8879a25c70bea62a730704ca8aadd1399cab0e5fb6fb814581358b9fb913441e293dd8142b9802552c321b3bb9755b065b55a97119fff6a31d000e4ae4b27e543d39cf869d38435777ad6dd824bf42b782693151e5c613c03768987368cbb3ea14e2ac449fa94802f54d4df213455491f2538118dc095abd065218ab09bef82e4ac80b6c895b613bb179f2b4b6da1db8ba2d77e89cb2957c001dbaa3f7172b7dc63d171c4ad50514817f82a07500c05ce5dd6e7aed11037b967f2320c68e60ad06048af43f35fdd6bf2b097607638c136cbabfa32700944774b95b9f9dc03c12e64f9c92734ad3ea6853df142173a385a711dc9dc0656c12f003c995a1df548db563daa41053f1ab1c59c8caa32566220ae4377c8971edff039a47f8d4a0343b51ea9e66018aa4b724967b519a747a2793a32d03c729f793cea25375609c3ea08f4e3c63e21125f31fc522ba49f67662ce78d522a637157d2e886494b59291d4d5c44f9485fbc646e018ea7aec07b7f3b4fe6fd542b99942a9b86bb7d5d9f4be9841499f180228759be1117ece6b821639982b6beaf9b2b2b6b00c51d7011c7c7e978da1242d44ca73a7a492cb15449fb4814ed63d3ab01a1405e5191a90cb99616f6bed558095a3065425fb4f9aaf1dba570bb39c4aadf738801218156924820536823b0cfe374cd2b47e88e196a5f2c3c26edb8c9266b1e82923e12ff444ce826b477727823cc7328811db2bc29764d16cfdc24457524f6196cab7b12d99136a1e462a9bd5701a87d0716226421a187562a1038fb75c7da7cf059c5fa0208814ce9fbb22592abc718c0f9482e33645af3dc2c7ca0bf5f37994c6915835f92970e74f81d2f15017f6bb75b1fc1dbe9c845a3686fb40c543a06a259345f08b3856c0733ab832494bc815fdaa2073908e02353cb4c2eda7c58ae411ae149f364f1804d3b18e295bdb408d82137e1ff77a7f6726af8c3c74987c9b39f63de08dcaacf290f350a0ba26df940cab8afa5c7c170b0b6109650a711a287b2884e9189d3d4d6fb48f401c3cc22c3983237723d8b1f484138cb5aca4fcb396dfe6337dedbdf999d358bab2988d4bfbc476f3cd57dea63771c86d49169507506d2859454a8ee0050a6a2a1e55bcd3e54c00128f24e598194ceb2322773acaccbbfc42592ae788fb4427e096b5fee62424df81455a052bdf806baf3e551695add1b4ab11c7cccfdde33821c20030c51ce2aaa10077ea11c9072312c61acc7604c3f3a8a0b1be6a405078ca578244df357193771f1b4b59b52592ec497f10d9cccbc0b9a0b53042dd3ccafe759137a9ac940231ae0581de3a8f412a9a4deb9581e971a4098a5f75617b82bed3ce88af8abf2767606aaa311d1a297b14a1125c2a1cb4e3078c4dc5897a241a4241d3f842141716db3e47318f88153d82319d3b2f06d4cf538eceb77b792a36df69cef2868412fa9aaab1003c97d9ba323d32a34d51e92567f8c48fa28160797eb8dfa48d9eadfd722bb3a7958644b9bf9546513a4d566452d3d26a836573254942f4671814e2062ab197fcafdece39be4670e0fd5084c5b81acdb6a1a11fe6fa09383ff93f987bae3c4c8a3f2cbc50584a3395aacc167836ecb3f195e44e49e3729e20d3c89080dc4bfa50a8c990803efe427298c829018d83dae8e8c49da7c4e2129c0872e34fb8858c728f0fc165e8c9adc1351bc7a5d862a771383f3c7a8001062e767dda913e8ca84b3154338167860d5fbe2043402b318022611b91cc8a92dfccd93e15299bec54eb698706d34d4f3049ac74beec4599a11ef84ace962ba4b355d7273ca4adc2546a0a6d9830ae79b07658edc60babea1bae94dffce5cbd62751c3f300f5ace01de5028be01cd5f7c7b2a373213085d087b80035e2ec623aeb23950d91da80494681eff4520237c71878a80fb2ae5194b07d4459b23ae16413070c2c9097ffa10bdfed871d7806a6e94195a83117d6dd6f90838de3e1a7ff5cc51344b0921090dae005d297e336256a441b2e7ae4270871bfffaf7897560e6b3ccefdb390f18f056cae670e31c131fd94eca1b0eb191e5c904f02e6e12a0c23e2dd4b801d3db840c279f068ef735cc4f3dc44167c3e290dfedd3bbb945703b24c59576dd188d06e43c90913f510a271bfe71da30923465d3dbbb902b653eed6a2c1f7c995b34b604d0dbc32b0914372a0ed5aeffafb3d1da188c545c09a6fa407e6d7ec72c6e563a6926337cd3883df8a5971ae4829935ad993039ee14db7aba1323ca14b5c645a9920a94bcea8129dcf68c0924b24969c1a7e0f88333f29110196bcae4a332685bae96891303081d0f00e2cd2ff0b2549ee3c797830ca78a541cf65bedf4031b34d6309d772f9ade50671bb23cba274e70d73786e1506babdc5abff077cc95f849a8c6be3ee3c858ab91136f6f3122a0e466c154666900188f174140973d4560dd6ac99ac1e0ffea7c0c22ce73d26b4172948fdcc6e11edb7c23963067c2e31a16b842927e305f480cdc70cafb59d425304480aa4306f62ad78c8211b742c856c0d3b8848dda66323663227b95f9fa01e94744af1d51e52c03b78427c3fa4f7ef479a0403e7ce9f8ff54d4b143a71036d6e1c3433920ef48d15d2615baf486986f6a551baf8a794e5e611c2a4f23610f26e4e50f52be283e5eeec8895479ee9e425f9cc2dd0128886553289a7712644020407bb46018f4561239fd9a8ddf6ec12339f5c9839c2efb969f5d310bca2598d2466e3f8d4753e2083d6a1a66c480c984b8c69a80f9caed568242fbf6388a30ef9fdc0288251b607780ef6b3eab20687c7ab1d007f8ac2160aa4c3f5b5c96a54c0208944e199207f91042419a336e0a79641d782e33535a026f9ee14997a75dee1d4a672a324e6286b1753e8286c3f21af42629a29a023d8925fca9f3eb42db76a37a0289e1b10ed84b904c05afe11a2488cc64c3127ad15bc10bc8941d0073d43864902279eb263bb795fb638b5ca351524f85ebc95556dff73b421f8bf335a59b1eb7093dee46cca6baef4a33748d424d7db6e9fec23a06f6150b25b501af528ddcf3dbeab385c39b74641db37ffd49e5b67a21e7a4d6a796c3af15f4dff652cbd9495246a4bdb1fe187538e474d5f98f291f171dc90fa5e5a93720d12c7c69fe586846a42776efaed0877b63699c7b793696e5141ed18a5e4b3db1148351d2b365e8f745edfa6d64a0402754806ad29e77589fdf963912fa1141efcb3752893528cddbd8d7cc197d851efe4424c813b624f0500127694960abb4378fefde15e609d485cc7d37131948c93b2d0c87355fd45326eb98b53bbc4234142eead8b536ee29470c5bcaaa9f8522dcae874caa13ab7b70856824dcd4a18c7fb7118142b2b991b85147ac6e1df809035cf10aa97e8660f1c1bdef9e98129392d45326d741e6de5b12f7d8891c11e9485983325b57325c77acdf81ac42b99f1dc1ce14307e45d350241a64e8bb276a98578f600f779a58f9ecddc1dc6128d8ff9d0005aeac6b99bd7f2402938dfdb9810d94bc5490db8cc31c23a8b59bfc928bf577657c03d630e6c2ca110adb827327af666c82639ab4dcd12f4b0e93690d93b8a1d0f536377b8ef59206567564334d4eaf2b38fa1fead97e4aeee9ebe75cdcbda876a1eb501842c6a986aa7c46681de18781990993d97d90eb15bba395e4159dc9157c58b93e5bdf203b82906d4f676d26082cd56ad0f5f93060c4f6849e7a65803c3d7fc7a88cb1ebd1b59414e1ac163b2997641f2584b14cfe0c6c1625c77d59f3cf4e9b516923a656ca7555fb06ee1316227af4ac5852b903f5f4ee89b306a7e473b6dc0b266b7c181d87ef46ba462e0dc82315fd55dfc7e6da837c39653469aa1629131b2dca949c7108d10dccb74ef5a51527ca7cacdf6c6af9c7604fb0e971013c55a6bb2b51cfc8b95fb96f698cb478e7abc653b8987d20e5681ec10b6180eb048090a908322a92eb264f4a71985f52f94c7fc514350b28b6189a1d3cee12125a350363aa7ec27c2d69a8997e4fbc6e10f4785c67fb400c7c616f89fc8e5c8ba06a07ed69445f891a25a57dc980604723042b7d0f8f14a2dff2cf888cb201d837ab7fa8b0a327a85705588b19de9523c273bdd3df34fe7b7738e9f2d35a6da22b3cf9972ce077e122fc19cad3453aa00c0f03d11ec36ae9006bd624b9888cda7dbc16a8e16ba3ca3dec5e33da0c9cf3458b005964110460a916470b8db11adba415abd765bcc2e101d33669f51ab60b9b0768524258858d06f851ac8235d157c444cad6dfca48cacb23594eb976561ab3c5ec0dbc1c5966070c82404ab0313619c61fd4d5d42e19f599140b09b8fa32285a5e424e7806971f7bea75c526e6ede8f808abb05f29b880109332e01417ec4a487092d1e9110c2780e22dc846c8cd58fa3c40f1c85732b682cf45d496b375c381d7420793af1ec27ade00b0bfd9605a86ca3425480fad018db87ba82b3b4bd658c52e4ce2d441448991e31f6ed34fa8c16dc4e01f27347daa089b171d1cf0fcfaf68d88f58dee4a2306c8babd28741bc142d0ead990810a938d7702c858bc0285c2dd03c802a2cd5d48d83a9197f6c9379c698578d8864bd8a0ef5d09f643e5f45069e73316043c3b7ec7d675c825aa916299867fd15a52076ab2dbe78ef603cae2fb72b0d72cd37088afa371b04ba79e6347d1554879a2d18d35f3ce8a058c00817c0c02cd2351cd93115012c14368b1dc50af91dea8d978a0efa90720e71634cc50d93308f89b91de1c9a4f95bcf1d62f02317e2f6f12755a4fee833a8d439a76320e3e77597d9c0e9bc379354af4de210c4311a823a0f9880f7dd9d839a184433abeaf385778e9df7b5f063abd5a0b1d41b7f19cf2783dc6e429af588503d8a58e02ba37b486c1e751e460c074a3435a91b3c7395b25754a1613728c509e358f0a66f36b19aa55b0cc7e83af327ce9103b745825562035b6e259abaf48b8f06821412c88f3c22fe368f62433073969328a7d961e1147d02c37cfddba13db4f836bf59411f502b15cd5c39daeda39cc4b30f29466237eedfe18f07a3c3e0e3514920ce976951326329a6ad5cb2f1a2f489bb5226d45e3e6201f5e02aaa37625aa2000af2211498b97892e93dd7f1798ce2353489e2bbe4f1ed36f48568fdf58b085b803508b3e91f1530a08f21fb848efff9b6a04586161479ad260329345ab10d8617ea1171a954a8bc5c401697684c24c767d5ce8b417872a0315d02c406f398510944395136b5980acc89217a60b444412a7413093725016a310ea0c47c3adc2d1cac2a2147c781bc4bbdb039022f7ab6109a713f05cb28341c67eea8f8604e927fbb9643724cc8aa89c5d52346918dde430700297481aaf9af2cbbac0505ccdac46de273654af728385be917c60b19204d58498f1ded673d95838abc925df7683f84a5e1e42f1b5235b67be7a9aea580ae3c3066e002c1b5f09cd6a723b2385e3fc4d22f979dfd477affd51bbbcf005203dabfb1f5d6f405d9a02dfbc5bd2309493ea9062b410e3b3a0f65d21341307911f213fe3880fe30190075434b93b6da128a12209c21b0db67e53181f526216d6fd0ab25bab63e2b6e7e0e4552d68bb74e08dfdb150382c62d14bfb516755d18bc85038e9339ce7be5cc16a179d7240978af7f812993a26c39f62d555f3440781cdd45580e9e5c8acf5793e3e4009999118062a4e972d623896a0a89a9c4faa8e67a045a099b21a5d03d473eef72240fd01d92ee351ace2ccfc30f759e9f05c4838747d44dc376bce8d6c2b220d2f466aed67815db4a1dc4570878ffcf2eedf3f3281099229e6b36859f1832c3603a25f8b74176dbcb4119326b16be0ee0e437b5d2bbdcaa459fb8e3f293f1bbf3a10cbbc1e7d37b1da08e012b594d1584d36812ca51dd48549ac0cee4bfb04ce6b91dbb338224f429a82b35de3d3cfb9448d4a1e8f5ff717d6baaa4e88cecb066087ed8729dafaba15a26c8ae84f1238a4e1159a05b48a07fe4448913ad28440ab13098884075266c5d4fd3c2ad46a251229c63087b1eedfa5f4d245e385ce47a68370e84acc9c0a09cc61688fbb9b9023536c42d86385d298aa4a93df54eaaced4e85615c3bfa3a0b03cae109e293c859db932ef2e6c1009ff2d54a7c2e186ef47ebf2fffd72fc8f58143a7fc525ffa98c3dfcc8c1161e6bba9faccb8bfd1cb090a0b81a864cec7821d3f48bb8041ced7227215d597160c15d2bb881ff3dd94954d00cf43d1972c6df7065c74de8fe5262a2c06c3b54d911d6bb6c75ab8171806c46961b8213e42d5dfd30b1dd72b1697bd16411cc1d1e3a922728b000adfbe953b090fb2048ed6911e1fe20590d9b406158c38cb07b1aeeb1e19ace84b49aa3df9e7bc9b24cda58973e1af4c3a722325d88ea1372e3cc3a7e0028481dede8484b2b28b54639e895ca0337eb5dd265ab074d6281271eef86e26424d550ef984c83da397366617f2a67643ec2d84013ac1471d0ffd60d953c62ea6fbbc9d673ae0dd7b0e837202b5a8fbb202f5f7cf66312dac2422e8eb63d0fd1c596ab29ed643d8c880ac90b0a988a6cbe49766dc90bbc8854ee4887d4898db84a3e072ad9420571c6dbac402dd70a8ba787461e193a655a24223585863b061d1afb095cef86edcc23c6c32d317fbf7742a520826e792131cb589bd7d0027e1c4e12466bbd991261c9a992671b3b5e81c61d10a4b126f3187e214f0e8a1f992c42417b14c304b8b878535462ad4e05b4f0389453fbc4c95ea22fccfb20e2c09775c26cf30604d89f302fc1d5163e4e048621fee28efa065299813dadb50b9b9885d3bde98a0541efccfbfb1ee22e7408bbbc7d737db34fc777da738980cebbf958698f15e21e318ad1dd21917627e9bbac9f977eb83b3c17692a41c06791a68b8f5ab21268e62710a059d2fffa3314dffce858e0b1a5b684f84420bb4ceccd896224d314cac7bd7c420daf634233091f9f02bc184b38f0b592f92066c38811cd4c9a3360774b7a6996600aec3fbcbd557301dc6bd4b7ab32c722925b5e609b50c878e14ab4313b55354baf1539718da88b54103d9d0f8b9b8725b0959649d403a5bf0c020c4ce235bd3f8600bba9800e374c0519e8123dafdef2a00871cb7bafa967b3126bf8d35efc4bd861d75c502bd1b62327aaec4c7d1c8a83f0f271010dc8cd99026a5ab201ca8d81ba7a83dbf9d59af0edd15f25c64217d3f094376fe5c91f9dcd98becb8a70b6d8d35c10827e5cacd07a52e306d12eab9c5c200c729cec08517ad637cae81183ddc8523d10e5024df95e7c10b67b8682662ca98c25bf2135c8d87929299d0cfc9a82b0edfc37b691a1beee28997a2797edbb152648c541a490348dbe9b90be5974ec54cdad4df42f883c62982c711d2b3695d397db035135217b78f35c7d0b915a5bc58671403d81944101a8745db5609218ab2f9d82d66712e05fcf151726d8035001340521cbb210687844973f6dcd952e1c63e265e506222b7eaf4162097b1be315e2fc7a6428532285186ae13caa6e22d6027651ea2976c3a4ac42a38c4206adecd9229220e89c896da48aeb00b21b2ce1951ee678ee2a120051fec70103a07a9fb7bcf17da4673605a1bd673be06d681c8771b748a56040f1ed8b1e76ec0af66fa9b89544293decf30dd307d5623064e2d7f7bd878e0a70faaca0f17e4df30550669e83301acbaefb862f9278879c3ad81215d42943b1004ea5d8626f4b00a8bf2183dbd5e534bbda0d821ecfc8f3a2bef7800659737bafd7e51a650279a893b00ac1b139104f6f29dd583295af592d30ca7caf4ea4f8833578c90a5257f53ad1bf1a25dcfc37270b818cf2c52fbe4eab4c0b74023e65839f1cb0b12a1dd4508c7f5399cfab436240c9c94a12f47854f315968ba0675e15e8328b141994729d0ece9737006da8337d448b773d19214f2be75e229b046a08037b8e00c08f8c73741005d19cfe91075cf0ad03724c0968e2c778b574387ea5f0b095072a154af52c151e8a7cd69ec23854ed1591298391f7619e5221394835d20724952f0f2cc47b3154de04c0428e000c1fe515c2225419e552c6cf28f277760a7056c40fba6385342c66077a26a9a89d9f4cc0531f9fbfbb64769480bf481564cd9aa52375d5eaac782e53f81f6bbcd9be712729795fac65383d18b93b858bb9e6405160b64ed8ee4bdc1d71c83faaea8aa5234685a3a40f549ccefee98fea1189813ba78b18bf2011318c231c28ca7a0486c13e5157154e14021d1df47ddbe43a766c3e5a7655ec5465601a153f564dbf51716ce5bafec5873b918d1687fabe5154918ae0ce1302b296525c79a80ccb5d0bf7de43fa95f3450ab7b1d260365b13c2f28ccaab2ab8d2411a2a643927a3d407d8e20561b36f184bd7bcca9f86a030da123b4a71ef12ba3808a832d8997bec6a65386bab3eab6ef63b6b7d7c3cf0e0563e0803eeee14eb7ba5eab76db125bb0db6218e824876805f0ed88b07608598a950fea660c20de4dd1baff7976ca47b84cf9803ac6e881c5b83f614ea82cd6a21a1b310391b805dbef7caf18830bef792b797b73de5a195cac2f9a70c6909b6374596c76323e65a40aa7036215ff52aee63214d70915554d50eeff99c0611acdf683096722f8833bc0e86dd481580a672b67102eef178a93c7eefb10c3db3c27f0448c7d691646e580575e63c02d8a1bb75096426120110c1080b6c81e7add487694309652dcc5e5db1c09ca9024e152e94b94438cb10763daa1da5b4e6cda7a67654b05466e8b3470819cd8fc5c3349bfe25a1967aa7a7a6f29df5671f9e1dbdc34579ca526cf4c05fa699f360ebeb92444b36b97289a0729c2a0e5dff9e7ac9850b672ac8523eef79dd4243456405e97adaae5cd12b68ab70e4925a23f18b008bc01585155d58499919491f395ab2cc89353939ff93025e9ebcf2a8c65643c948ae162703ba4471c46f80daa4d1cf40be99ab6be1eda5ed784ccc1576e83a724fdd408dc6ff4c3d127843510370c87e26e8bc7bd8962b69105a41198088d79a38b4a6377698fad8b68fccf4183c13aeb6a22d4ba5a4afea503de10e13061467842ef2c69c4b6a203627d7e5cddc31f8ace19308232f5102a0ef2ac29cf055bd31562142bc10623f86ffaa4b1d14e2487f9567a09394f96adfd029f9006b11edafbc0a34874fd167445e7813199ff14b40cc5c71ae306630437052fad8b9b657c20178362294a560345645f90e74840982f2777c7f0755101229264676caa5b952926f7c2d5744ae89168432dfd6242a5f2a01fc4f42e52aa8fdd72049a0553459f8b899ff80713fa7cff8ca7865e464e3570212792e064715995931078f993f85436425a2a44385ec52edbb95b3d5867fcd93e082195d1c078ea4eb02af6126d0110f73e9a770b4cc8ec5eceb30ebc67521e9e26244e83d537601a3623347d9554606f51e14e2e9a1208d7d29a486af5f8b8565c0fea1120fd1d084488fa7acac66ae50d8b0fe8053830be19937d45b3254ad2f22868f599b919fa2ed51d534ffeacc607c0f62334fdfe96488d3cda4d4e71fd62203fd2ca340d27bd1f40b14c4e45a6cfcfb31bc7428bf2217d5eb79667f0b402cd4377a6ed70183ad2274a3cd1d445b4b40315a120051cb5f6516cefe7feaf6c725bfaa00971e9156820f3a4fbda022baf589461775c63a2e90d2dab307be1442ef17dc6a9bccf358d28d81b1304f9c411008c552454a03e0b48323bf226d1a5c76a8c985dede11bc1c8057bb6586b56cb76a15c962a08827e3c7701b7168e3cb353d19ab1962a356578c00eb0dc9a5349178ef1e5a621aa1e490ea3869d366e249a38da3c2dc1d5e98db2d2fa96d9e1577800fc51af9fdb2eb12dd197d2ebd92018b5cd6b55ea38249b5d3b5b3fed782099fc4422e3586f7c9c6bb6e06801499a510bc2546ca0d6ec495b4b3d7bf06de8d6c347775bf7dee9bf353c2fa3d4d54cd05d4e314779f4ddf6c2fdc80e4fa624ccdbafc54b5cc395ef8e0bc80871883fef8e99a406941fdb6dc540a221eb04bcc7afc863a7308bd6a6ec5ee7ecc077aeca618ff913d8d8dd1ad1e19d71da58401291ad64b4f9b3ab57a6d7117b836f1cf607124ffeb276987817f7ffad26fcacd388e746275edc382cefdb78fc5e05fdc496dc44b401f9d6cead48ed24e6c76997543e4496de171b2c3248c7653dabd323c77e0884473474888f2d5eb4c1d278cd29facbb2a69299a2b9a72415c87e3d59489e5808280390d8675dead6e134668cbdd65983010f739a8eadb063a56ebe062959cfb164b25337236dde20a58836aec1e4e5d786b452028679845dfbc1b2aeeb6ee63852e1d7e930d35dc147ac26e82b72c2b8d235bee856301d52b0f39037990f581957f498746df0d44e75ce10c5193201885313c20d0a7e7098221310c72785afbb7f4c5f3b80be464fc0100a1c0e3cc0eb44326399a113af3df73a3e5d764c55ac2282893681293059377c7e678af17fb1a53d12e803704357b6f727d7032ca6ccbe228bab6d05439b3a53aa273e70c7bc44d8572f8b4909e3a3a6b6b20082e48dec171e334072973ead7b099ff6de9758346eb657059ff330963a03a8c75b65cd29b2031a94ee2a08510ee1870cd5b87c3e3ce072df8e7efbfe3add0ed4299c25f50b43882eaeba4754d37115ac1cbb25448ed7a0f8faf611198a6f313281273b2343a9bb30e1721099848c5b1ec2a62358c4b883af7db3825fc7734c3e5ac728dd2ada86a3f68697d1a409e4c9da86fe13e59723acd9b512d11607d39b434be389da473034d86f316f1f834f433ebcce91fab1ba0bc27218d36e3529bc67e03418bcb77b93eeeac3fc53fa10d64f7e607f57f9359cab6a66d1ceb9c6f5bbea75ada86205de1af2193adc7b75432e59312e4c4a084388f22ec1980701df8c4311bd420c747829aeeecbcf2485eab1bdb8b0c9e7bc5e337951ca089f737421b4b3c2ff47d88bd82b13df76edc89a07b2e0f9e6fcd5f33b6968545f4649542c42afd52ff4505c5eb0c9734e825c73d38cf639950dfb8c2006507a09555e6f7f4c9faf796266aa391ada2c84aed0f61c5395574d1b503a1ea23b91bacb951c26689d47b4174e871ba68828461817140ce4ce8b1b237866fe41e51f25071d2a0b545f338ac3741d9891195683f407cd7bae577ed90f87f4839a37e510db2f1afdf515b9456e3954e322e957189ef9717711e26ea9dd4a776774fcee2f2db77e39e89c34bc062cd00945370fd7b394855c729d785d02f386f8c50f59f391fca1295fe4a6bf709c248ac283779f3f0f18600d395cfae7e73d7535c9907e847c937336c84b6174c8f8182b96c23b7fb5d80521a6179cdbe6d1d44d9f0b740c36c3f3d88c11e20a0a190533823352d93f7c19486fa860a7c38ba22f95b9a607f2bef9cf2ebc631ec280d16e6257d2105627f42e5b5bc7c38c45dfbe1c45b588afabb21690491f17f2744afa0aab8722734ba1229c5522b9c990da00334a8c4543304b5a666a4390af6130050bbc43cc1ec42fc936c1ac72b81ed190e5879a7c5197a58f4675d38ab7a45e3f8d7843fd840776e423b6ffcb9cc59e6ea2f6e566b69ff2dc873c028ee5e3f163ec98d042be292d336e27f52fa6acda062945acfffc187bf6f02ce773d7585a6618f87b0750732ba13fee6e276379a3062b8d322a34fba333ff260dc713d34d9ba676dcbbb96002ea4ce560f08da2eb286fe4a10ad5d9be1e7f6f4eea10fed46d45547121a2a85d9434197b70d732edc46d4fc67f25161665a3c81df1570b5945c68400f832d9b1cae745a5eb442f77a9ac66a648d55503b1673370b2b4155f51ed653dd27d39e2ec407f634b67977a8bfa827d9194f5da0525bda1e5c961868996b7270c169c6d5f2f494cf31b421337178b35171b23f40b659af3e6880822ac7c3a2d7b5e53d157cdb3be479cd2ebe9cd3f68e12fe8297e407363ce727a0599a04727524312886e90709a2fac32046c2889850bbe4b77c23cc6f70c7e6ec045cb41843017e089ce6dd9ec54f45792510916146cbe61ed3b3c3085679d11bff55fdf0e73a9a100eb2dcc48db6780928044adae988baeea5a51c67bbd27981ea044c9d00ea4752abb43d4d94fdefcff947c6b53afbb42fd5ba1c8a26e95158d45c0762bcdc92c47f9bc677fcc9d978543a3018c246e6a2ffd335f8cd843e85f64057d89b6bc7058092d90a1fbcf72182c2008e9ef8b867247baa19ecd0c218caa0906a22da04a8e72e2774999c2d16be4132cc5e207ee742b8e4d4c589a1d97d33c90dfad61a6c9ed1d1ad82e81a45118f3c541b6cc9ed5edf91c8b4af4f3b1df67fa8467bf636b947940e832c9051d6fe274ecbb7e18cfcf9f9f8781aa0396de414a5533e47be97f9fbde8307bf802d9ceecdbe02f445ffeab90fd67369e6d33fc7e023fad40fd6f057a7611f4120b3ea08e7404769e99d847cc23fb417f4499ecf5f3bf365d4e48993edad2947dacbfa6e18d559d7b9082e45614ea669b06e16d0380915221bb03063230241a92f84a514fa56d3b590a31ded5ca309c2604ffd9e8d50e5f12e332b49d3eb1e2fb49d03674bc27dcc681dff76c084f6d4bc6518f3e39d3c00cc9b68d666860766ea3ad1c5833957cb5f3804a76e2a3c7c1f9f867806be74d22ca5abd1288197a87a2541d01255bccab758a79483308438ed87d212c1e8c2d73190b8f317359a5b9de4918576a79ca16ba1231b9ba26c95ec67602a37113f3087fe8af2e13fc51aa46c1b78ca7b1762cbdc8e8b794a4d70abc6d5fda7690969fc3a0d3604dfabd05d95bb44783ab821ec0b385781fee3a4d2867ab87311684a81d9bac0b37afc61f4cfa7088b738667b01064c107ec230bc3e130502bf031759ca0cf4815494749350f1ab83b7a0356df32db8271ef0c00f2d59512cc0de94c3975dc1bd468df8deb8053cae9ac6df4b4a412ba8019b5ada621cd370cf36051e31de4894fd76eb2137193661700f1567bbf18824e1a890f5f1dcebfff6a13e066d1d9052f5ad632ddd18934d2aec90991e722e74bdbfb95942484f699c14af7ddc622e746f41cfafd0c30173506f255676164bc700501a5ae19288704d8e49d39c539849c7e11df961bc4c1e35d6363fa1f28e0965a4887fe2b1c4d2834e0a628f2d1db95ecc4423dd4307e33bdbfc2493df474d235e79e1fd5635529ac582e17dc4f091c563279c8b82da42ff4a47a97835656db405c2003e4e05db58909e76211f5bf075428867f83670c7a214e5109374f9648accba78e280790a053cbf4bd382eb374fc0729ae40fb2054004340ff0afb9e3d12a1723bb01eac126a673272f835b5a86c79bf80a67572db120e3de7409d1b104d2c0fe2dab411783dddf0ca65f61b3416da98adecb4b93a6fe4ffa6636b7592adbf5913482e1a9a68c0c213e9f4bde441b9efdcceb58b6608b42d27630ba74a504504e15a4317dedf0b68244c053c9d25b4888ad124f233c0b01dd32729802a217f0db61becbf566e2d7aab52d8e5b05dcaa75181c445fd489c3a84c6b98b108502c37ffa69ac43f183b73100231c4e07fe23549923ff5583ed313f82772b09ec56853e86c27b371f72f2e0c9b42b1b5300c8509daeb3d0c98eaa369617443604ebc8f6b49ea7a313c7b442fc208a95e7db0e5af02ad0bfb9e939fb9eea18562752141911ac5dd1acfb12e8c36935ebc40ef495f7970c356d45ea541bbb817d023889d8800b90ba34ee4ada118db7ece74bf835470e2a58e30f606395ba4ab9d1bd338f3d71dcf9b3277b20cbe43411dc29a4d5c995fbde1d857c54da2bdde978c5810aaea6d0f465ca2b6a4f45d7e9937354b6734b4c6e3217b5621d50ad9f53393ffd6862f26395de282d987666c751cb1b1a6e7582486cb6429e839c6f02fc9470b8f111618d1a8d91783fd42c56d244fc53942356f532030db26248df83f4b7fb194cea0e5549d57439dcc26fec30a8d1cb9d822ecaba2b7aaa0588f1633e18276fd218d2ae2be6784f06f7f6aadce17e2d5a87fbc5c64cefb4c0d55223f57f9f20a6809eaaa389413d760263107a7fef9ae9b569049e283d794f0ca11992e1bbc9e6d24e5d1352295c9f5267f1c1fbc4f08e6aa70fb759ca94dc855e657ec74ed0487bc52b010965533f0d081e82b815bbcd03f04dffab9940ad8498656c6ab2e4dcd76c1e29b67a836164e9f39b9750e15b42dcd10fc5bf741f2976c016465318a603dfb704e10082ee01a88ab86b12926bbab105cb48eb425f703aa8665c7bf896be901c6634a3385af21786e6e96b4366ece07535438658de50c8a7908a6559f97ab7238dd6b37eb447aa3dde876f8d1a0c101258183d4f2bc0f9aefb9ab5505b75c272323e9168fe39de308fcbf53295e66f9184293f94da432ea26d7770c8b5d0b54880b7b5bb3b816818d65262dae8ab2baa5c8f1ce7ecc9a09005ace1f2de853b91b9eb5d9682e4919cf7c0483020736a4163acc258d0d78ed88949b400583cfc2185d29c6d6462f84122dfa07dade600f329a1b1754712c7a8152b6dff325f92c4dba291e3696028790b771cf09c15bf2b126ea8c01ad997d8b75e31a8420271639e9a3ed8634f5168b12169decb0a9120a33ab6025e412a70d554b251df09615560fd41b64874dd5075f9535468bcaf6a59e706a3aaa956b6e172cf82e7fc81d548ee22f5e01c1e200f0840394717d0a188879baf5f6250573fd4a736281ab7d2888b7d8b9fc4579d1db6b8067a5a7df7229b5cef5c111cc2e6d914fca6d5f1bdd858bb83c2306191c769bea4dc6a6d840de9e20e64736a5418fe019edc25cdf51cfc0d4732ed19371e34d2b8a31d560da0681a529044e13e49daa0d8b55ee2e5fef7da346cda6a64d7b7b0af1598f8a0aa3f7fae7e43c6bbc52de7484562e09879cb929a12712413197f2f377180a0162948c292fca969f50963eb84e668e3212202daadf6180aa40c7c4a32788185aa6e17d8502f35a7904c15219dbafb208e33f708a54945c4846e002caaca50f0d122f2e8969688b7005adcac2cd4cf10cb235ab831dfeabfa86995209fb63bbf7f09813ebfa5942bb795ebde0ed80e70d4f10ae6ece3bf0d77a43ca573b9a08c550c254db9f948767fa4d4d730d074d09199b41a8161d2638ca086d5c82e7fa618e02d2936a6bea2da9e67cbff534a6cfb400bb8d7dbdcc44c0c946c905990600f6849d0093cae1b4da0827105d106bfacd037794e2b8caba10944e98531f87beeaaebc0469e57b76fc7d9a37a198c9a721932929ae04261912db6dfe28d969780f83c0115d2dee27e57832de36dfb873e6ea7c965430fd3ffc753d21feba08b22c823398e8ca775dffe31319595a11f093db0e7bf88c941372141ccb8f63c7e8b1a1f78fb35a660caed86045e2d75d47a376078507b50f1ac887269ceae28025e69546dec85ff4247181b11d39c2df33d59dc3e3468e081ee204200ad67d84880a55a2a6f3d96e2c7ddfcdd64285fa2e1679e9af0c13ac7d1de83c9697ada6b0e08b39c7bc44b316b836e9dafbe9b191f30a70740d2789046a5126ca0460f25e5723fcb1c6bfa09ff5098b949d0a4555127c1ec2593670000bf50753a2b7eb04aa2b3029ed4843ba841c4dd05a191affedd7864448596dacf8a22f4a6e1633f65dc328ba6d2c1cb51204a305e861218a3001dfcf5e130e2a6dd941d841f6572d0651e1edd29723f2f0e63aa72afcf1c5dca502341661c495e9c296d3fbf29985d60f8e598353fe8896c6e20f0af86a0325d986b39bb4e9b9b67009c674e86731b08cb19aba34fa612c95c2de35390d3e5eecd21ded105012672f1d9e0cf46d1ed9702ac0381135448b56a804fa21af410e0c88f9efa1c804bc0f8c4b4a12b69386fb896f67d30699162505d15c664a0385028ad98dc028d31054ec72e2500249f407ab14a097b627f32320301fa85607cc32d65e85e2b7d182c001f6cdaf6346152bc7bb79c0ad046f4107c6a5668acc47bc5fd3877d66cab83416e550923a0d42e02eed85d874833528d5f7f436fa67adcdaab26a9fe962af1d4f32a1203c29908c6530d3d58b1366180e8032e426efd9690c333d67ba313396f5d2777269f4fb8956981477e459b18036fee6b4ede28877724d7a1e81ce6a19b33d37df9737b4dcdbbbcb6835aa6af0c1613ba3941115f38847798590bbc46a50887d264803742dc18d5173afc2e3cc940c1f203cfeb95dba1fcf92526cd2438d05011e0edad5abab88f8b2c354ccb365b3695d37e6d9e107a214a24b6629a53a680dbcf44ef8ce3dc578ce7f785887e7fcefae24f07054f48c62054489032a553a7a5b308cc29a0e7599584c6ca8b23f82de803195bb059ec522175c5fe6e17ca08fb06eeddcfa07173f6cd77ce2c4d0b5979d60780001d310ca108c5931b654966502c8b521eb062a995c8c4da808fdf450635bdbbbdb967b4b99924c01f006d407d607631037c1bef58cb6afdbf79f064d7e43eebc935359f7ee8dc8ab110a77f3fadbd7df789aa4619a3801d284c9cc7b231feb7ddd7bec5344c8617248a27c3768200ec304ead2ef01c48e3a7674e3ceab496a82517d23e69f5793a5bd46270ca9a30872adda5ffa54aeba74b85a6b750e87fbeeb7b7cf1e67559c4b47c56d9ce5eaf6f6d6b9bde53e885f6e2c3723ee9e30dfc306dac6207efdadd468c29107f13bc792f9b9f1c8ef36ead85b59d79fa5e3c3d2dbb03b4326e85729c771af8de3b80d0cf9a296270ec6ac03f5cd768e3f8727555772f969ac6ba896ea2987598eddbdbb01348952a7d9538d535a629239c775e5b8d14ea8aeb9527bc344e01e7e0fa1490fa8eb7c11ced7f1d1b79f3b859b93c4b30dc43c96dbb66d4f6dd8bee5f6df7378d7b6b93eaa5e69b72f09297393b5836ddb3630dcaca70fda59b6766a92bfd65a1bcce5173a82b79a5b147af496eba8bd525a69fb92af7657a6b4b7ca7ddd48f868184b5be7e4ea47fd23433fba6d40f8675251b4968eadb61b65b75f75ce9fd626dad1eec68fda6bafbd464268abab5c3a92403a356d95bbfdf9673aa594dea0917319a400cb8a66dc19fce79c73d28fda9e60504a5bb58ebe51f7b0d5baf1b9d71728759f26291075b24977ff9a52cad39db974a9f4dbb6f1fb3aea3ca0be0e8f91e95b6f2253948ae2e8ee5c6baddbd6d6b7ee66d5a6dbe8ee5c4590f2fa819d96f31e6d831012b53cb250269d4e34bd0b4a040fbafe621c27032b20a1639a5c363d22d96c6fef204a757090c8e3635d6308d46ab2e97a6f289843f4e31fa69f97f592c073ade0d99a2d5aebd3b1d524e5c9e29db35217e2792cedb521a573fcb83ca21d55d9d61a91f74ca76ffc5eade666abc5e508b76de37cde72c8f5edef8bd230147b1bc3265b55c88870dbb6ad1e6dd7bfb6b65a471d11f8673e73714dc8e01e6dd7c7ef6aa05dd239e7abc9d9ea169d3e7dfafcf6af1536d9b425fa7fdff5d1de2ce8e439ba6ea56193f4e9b71d357d4ae7048299d96bf0f05db8bd73ebfadc1efff857571037a19c5fffc8ef08f5e90bd54213e668c4ddb98d477ee797deedff82381537b6f0b0d0a55ce5368edb2ae54f52137a7acd48d9e417c93dfc73ac5fb9cecd76aa6ddb3655e55c47f5d6daee5fa56e2b576bf59400a17c6666e66f1d1f93b633cffab5531fb8eade200f775bb9cde79c73ce49ed4f6aadad778293dbbc2e3129a5ce1c7b4cd2173d88c53d947e5f5ae352fa946eed93bdae7c64fea15c1b669ef3274f108b2ae7be921cc4dc7437252efde983374aa7025ed300fd2a5b953b0699acdbe57a199cfc539fb290064df64f1d4984f34b1dfd89afa90066039036b62f7bdcc0f73679ab2b6e9c54f6c479638eb9c975505add6bad55a44fc9907bf82905e2ea942a710649c24929bfd013e17c1829150545a636e609cc2c8b1308501e780fffc6597a283989315182e4080e1a4ac7eeb798d21253b5496c472a24f47a91a4bb8f65d7b96cd7803b4237ad15c5f2bbae062535e59dcc69f6d4a2d88dcebc34d9bbaeebd88e50525343ec643161ca8d95ba73efe079738e61c8622629edaeb436a563e9eeee94524a69b709cc3f655ffe23ee72c077f24fed2ac5eb791da083cec53df43b1b2eeea1b47fe2700f7db6d469076ee3dca6fd9383709787747c70d79fbbd747237e73b771f20fed11dcfee923f021b5e913fe5903a1a4c07e6bc35014ffc9fbfd27f3dec92be7d38429a9be9c4b33c96eec242ae92427298cb9be7aa4d558a6e0061ccb39826f2ca79331de584ea411b8518d259361c24d4394601e70723b54e0cd765a37ce762aef5bb1429c19392d1a15d4106ddcd0d9c161418e1bffe00e01fc83463b703c8f796ffc0500f8f8f97b0069a0f0060e016c9ced54de07ae7066e4b468d01a5966605ccfe3f305403ccf0078de790e00f9fc251c09f1c08306d0e3f304f866590625204992fcf913f4412f39d29608eeb88141131e2671e0b8f12e1e0ddc1b3bff20f0b8c41c3b215ce06a598043847be37190e0727d3b25bccbea1ce5c0f137767008b100c7dbd8c1b1339628dc1b9f78a3868dd1d6a851a3c6cf175d22e883de1a236dd108c356ce0c1f02e00ca02764adc0cff3549de5aaaddfd1a5d47a7d7f01f48c24cf2d3353b70049389fd6ee96ba93bd291b6f7bf79f93524adde97cee897c72cc2ebe4eb34bce724368b24968252103440532e87255e7dac164bf734fbaa23b3868d2adab148f9f793c214dce233abbbbbb9984561d690b4d0999c749864e404702b3a8fb0970a38e0466d1f6dc846ab25bf224ef39e2e6fac8bc8d1df39ef90cb8222ca71a35cceefa9a44c24449c77a7eac95c676d2e49cdf4a1296744695dee4423590c7ac0e405dd8fdf8b66c4a29b5bf55da01a596bbfae517a47d34acfb1fffaf7e5726fdbffab5035a61b05b2b1bc0ff48e4aebfedad76dd48bfb114c1addf5ea270abbbc6c81296e16527da043aa01c51822a4ad68a2a4bc2500c579769558cdc929c7da15529428350b1109671a6898d4c8397d0d7fabacbb4a62f6ec9e385ce651a1445d6ac9976caf9a7a7a853262833a521a5b556f7e2711cc7711cd7c603a1a8703e7d5d6646e354ac6cb963aeb673d8b1c63dfcddecec2eda6e80d3ec49e6566ca525a618f7f0c3b887df695689dc3bd62418e55576d39d4d24f42c85a514a4dc5939d13e8b635b1f928725256cf184611a5a85ec768dd668ad65320fb2b59a536d56ab7990b5e23f49d25acc832c0ca6b404f320ae56db926adb919a124e26839249c938eb54631ec4c1bca72632854b5c55b250a1d43655abd99aad591b8bc5842ecb9e7cddb28309599885599885d56ab59a4c269375b0b6b1d83307f3a08e76b00ed6c1ca0ed6c13a18ac8158c65a42877be9ee3a526ae83b7d6badb5cf24739a554b29a5a268ed6c00b5a2b542d6ba7daa4149f59c73ce722ab9fcd65a4b29a5146789bb17aa3e1d0d44995cad3e30043dd5eaf97d85c2fd7e82cf1a010cc167adc0e7bbfa0e5c81ef031cbf91aa78e4d1c1123699d2660a0786c73c65c7d1cebf1576ff81a0f77ddff7cdf027b863353974f73e5507f2acc2bf3debb067a1abc1b8faa9c95e8d3dd3127e33bbf415a91f74714ab8b8254e0a47a549264ec635714e5c166e36e3c63c714a535c4552122242a99b7155f0e6dbb7c2ad3341c8a67a1dbea2d539bb3d0fe9f3623daf268bf5ab0f592b5045d9a77be7e9c263552ad577ddc876722c25e1d66ad287641eff86c19686b0a65de2314fb9aab109bfa13a88fd279931ea767572c22007a79aa5cee6054784f33baaa981b66f302d65633a544dddd39f6506e6690c995745912fd99a707ea9927d310f5ac93ea5dbdf12d3ed95b56128fe93e4ebb5827d300f026bb52fa9f61da97d4a6a1e04ca64503229d994cc83c058cc2936f39e6ebf17f320d02a2d79300ffabea76ff639894ac2233749265bc956b29590d0eb4592ffa21886bc82dd765aabd56a32994c168bc562200c8481301076fb41f8aff6d5be5a1845b9b2dcb8b797e3691b6a8412d8895b0e69820476e2d2ee52f07e57e5be7dadb5fa7c77ed466bedaeadddb5dbf56df36a37ee6ba5b556eade3dedba8e3aed135c7feeb3aeb27be03657d93ed456422799a986f9447aaa4149f59c4c32a7d9a494295dd196b0c4d8667d4e0106a134e1dcb6f766a9e3636eb7fad8742d1d4d38f2cd5506f18d8e46dcf6aa8eb27888cbfa14f441bdd6ea9af408fe866a92d989cee2843644d7f79007c860b40d44297ddb4d3bea30ff10f9c64e90b9fc426ddc85d60d1e0845bd7e270518fc85c2683597525a811563c270b55a85212b64852a84a12c9485fffd04593f63a21886e158fefd58e39cf27ddff7fdfc46fac514a9294ba6749952b79d529ecdd9e08eedcb5673e77bdc52b3a3a0eeec5a8fb92f78acb19c97f5abd513f59c6319e2304b79df178273e2b88ce69d1fba6893abe7d5f81ecbc5f7a883bef5e544caf972c21044e43d1d7ec9637098a356cf4e2c03a1d2cd729da7faa00a9eff698cb29c11aa7bfa897cca6430aec1ec9d64a64c2693c562b1d80afcc007bfffc0ffc09136f98daace4bf859a72963c24936c4946a3558c68d76d4e7d1a0d10efb3ce6ddfe5ba207bae65db92a93de771f508123e51fcfeb7e921e7b1c064d7a4a89902c9cef5097d9adb5d6adb5d68e25c7e5b0ee9f7bbf7177779e269dfa37694391e710c93f7e02a20d7a8821b59a4b3acea68cce6e692a02e54b0fb32f988c2f331fbc60010b529620c4289223c60d15844cd09004cd520e4ebec8a6600155839318a6be98c29223c615335838a3c41b1bcc147982850a28e8a10a21624d65c410a30cd6540cabd6655a130ede0d555c3032431358cc0836c3029b294982d0e18b292a36646c9478c194206a4038bd208bf2002519ca6022053030c250ad417a277c85cd99afe905aeca1630f87412672d6796c1e1c28934b55605fd7636a1495ad9003a05e182982e334809638ab7b4e0c6062e66a819a9615e51b3038e9a215469d47c39d230e5d050b384a706b60a22cc991b6ab032b2318aba0444908004542cd9a109951a3532b4d260a1f1893141bfe50286919613184d66a879d311e5804416450a2427e041832db4841903e9851f98a8d25811c34bf70587041f164bd7fc6001ed0017207480620ba4299e20b08594308898a106335da8ac31815dc3834a4d9a6f76104e6b92b8ce1163c5c50b0196d6cd5face5892e31189122c59824450d84cc0a5410449851e24cc2e8c2730a434dab490828688ac0c9d153c50c502f9491a18c2ecc6636468a8c1b8ca011428526cd0a2ba734474436b3830d31296da0f8d205015e1c9159f1660a2f60a838545902a943c3c50e10a21eaccb342876b8e5abc659f1623ea4731c57af871cc77128dcca71107076fad455585415f81e673f1587f31cb823c4b1386f5d4623b833663c510781218f1aa8f54c43849bf3933e7bcfcf5a85cfafa381709e5fa881663cbf0640084104124ad0a0e50a5b24d8707d610937c71ed5a0f1dca221e4e6fcfc0a5ccc248dd6338d564ece0c17101c578f2d1c37302264ad2a384348ebe751d50de1477b00f14a44d8226dbfb56fdfbe750181219c2f4e950a67de809b278942f241f1668bcd290a061a75844e344d302caca81044f7e541734ba10868e1228beccb112d98147d71aa618a2255961c4952c11926988002b6b4448927ce6c9ee48930849e20e334a5ca992570987199f68498279ca0fce0ec77ddcf1f9a8543398426f891df6ed4f1f133fcf4322dcb1a3033c62d50ac118f8122de6c5183962750516a50f92209269e48a286361e6c2685de18f384e45e70bbee30c364996190e09e90e60ce3e6ce39a94e0e3ff4ffe0df98a8ad8bf3a37abbc52be693f3c3f9e2ac4d2ae370932fa6ccce4e29a574be9aacff22ca02882644a8605a21cb902188a0626926e6c99619785e94521a830b523e3cb7d62687080f804311143059f3c2104db8cd14992eacc092b4995254df83fa1fd41799993df82004142633f39cdd03c806ddddada7b0ab17c3eb23c3d0d3cc198e5f8ff6af176eb59feaf81fc739c3f9e9689289ff1c859af41d2fc2d23a0dc2fb80c656abc514053abb68e16558616068592e5578e18c319e28a04a0b4cbe4833436cc94c517339f38312188a9881c967144b0e575a4d48c4744d452b5ea6d1b4b8399769342e378a083c647500b9f4270ff758ae6edc65ce6b105e1e9107ad9e3db8e2d267b92ac03df499b9b8f486908342efe909304969508ab8874a41bd00711d03eea1ef0dd5272e65e2fa4f1c3b1e807f28066504aeff0cd976d0b91ea703d77fe288e0e00fd6e5ac062e0db9c7bea7eac491b6583884147645e8d92beecbac0cad52d819117242d830563d32b695404931cdd87699468b02895687048c2aac9c804a126db85602302d48a106ca95356fc470133461b49b22a231dd7e10684e70976934213a8c9e2c942073451963be68818395249a88e2454b166fcaf8529f7284104312599a803962051c6cb8d9d28509922bb035aa14c4bc28ad0ddc240165c407a9a833453dc69532b428b2841222e899265451a8dc4b53921eb627d83075523c19b9cd75eea524a1a82ed3684f5a90c2791e2d8730de6caf9cf5706a5cbef185ca1d2f3feb70278ecbfec5c89d392ebf97d905b8c3bd5471e75bc0c15f07772cb9f36905fd69cf17ea058a9c69e3f2eb0c71677899e6c5853be9c6deaa2ca18b1b1a972bb8fc2ab0caea32ad8b11b779f45c709936fb92d3a5863bbbec70278dcbb42d4a66ccd838d3589546b7c3cb5f83e9cec7a1f302ebf2cf2677fece11e0e5b70172f0850b9b0a662edcf91754b0820ec8342e5eeefc91e7326d4b93eaf2efe00099c6a5873bdf822d5077bec7a25b7ea0e05cad562bd5caae381cae5e6f3856ab6fb5721bfd2a2e3cda3d7f8f0f3c087c16c183582f65edabc926c92d9604e2019224b9cd9022bc6688119e624e4e88490db8c77e83a9b5ec3b45148f7663026efdc172f1ac7c6e6d7d4eb9a7beca15b648a095baf3ccb62541ed0323579a3881174ea21062084c052e65a490b18207222a37516c513d45b0d23857a58818958ba2062c402b4b2ce18935e7849a9e886ae28b5aa8b8e5cb2ba2aa1b47bb7025458b168e8870bb4cd3728543014d0b1350a76588da0aad2af4b440e9dc4b2886342ed3b494400bd22dc9d95684270fcdc9431e0f75f74b38e733b59687b82fe1ac3dbf9b3ce4dfe421fa259c3ebb72d65ab6d65abbfdaa4ce1f6b371771d2f1f926747146a20d28702977b56dda8bf74708fb5e4071de86335b698b4a20817f4018e2193b645c2e7fab8b084cb6ddfd1e5be5a2114f44151f03ad7bcf4c1136ed7d9ab6eb4dcf5334985805d9198b5694d7007ef5c0e13e372776e8f6184341568b84297dfd1200967d47464b9524338f6e0932506128b9a5bda9b010d6177e66958b4b80cc021ac719986058bef5c162fd3b00c41a38c81c63d1966706b6c704b646023c5c60526266e70f062a988174084d93271186336aee1c840238ab1e1635ce9c898751eabe19161840dd1f3705ca6613122851b11c704de24a25583492b0fcdd96ab27d8e626b478e0e61f93e393cf43599853bd9d976ee46f6b71cf4e09feaec4e9d783d9ea7070f6d2f0a75c851dc6a040098acf67b2c4079f8a77edf09800cbc285a6132773e35989e1d11369849e612b597df37f3eedad3acd6535030964a922539f5ac95701f99925a9a52928a411d794a9a35cca9a60435e7fb6ce9c84c89d311d94c5a9a52928a411d792a7b56f6ec4a71483c0b3cabbafc432e83f3cd1dd233035ed841483f94439088bce8ebf0b043ee10248a541fe987f944c8a2d947270cb94746dc1dc17348fd9c4a46f38d3db2741cc168be991f2488bdd4888edd4f5733ff78cc3fe033ffac849420b821284570e97b2e95ab4c6104975a13e633ffd0d1fe734dee5c7f6f8e6293418cb8cbfc63c4fce326f473383af42b0aae0efd1ac6ad68ae0e7dabd3a31127e4d667f0075fb9b4a1fc9b34e6310f9dd77319c65ca65d49baf496e1ed3e9f06529171bb2b527ebbb0e7ce29ca88ba9ecacc52144c549eadd6725033ead464394a7ed4d5813c3a2fa77bc658ce3be3bbe7f2afbdaaaeedead3e138a10ee228a9ee89807c10029392a35aaafcac34d15991d2755df75ca525293650d7759fc70a3f0a72e03fe33dfab9c2263b1aad0a5a355aadb1b463d773cbb0460534e87be00e2a028081709efe97382e2d69dc2fc14bbf7290f83ae38dd1c638c5b1e776dd53248eb0e1894bbf0377d09e0b32ff88dfd93264effe86cb864b1c598f0376b0faf0714008d0b74d863cbceff782b49ec65397eaab2b6734e26eced370b55c465c394b7a6d19c46fce58ceab7a1ee07faf42e11ef5e566bc8b9bb4cf72ad5cdc24c83dfdcf65c45d6e2cb9af9efb68d518c46ffdee99a71b4798b01c295580503e058b2e685022c38a2e8a64b5159c482d3993c3186da2e0b45122070d5ac478c20b14307a10a2a8590823030aac2882045b5668d3e64cd7460d4f159a579102cac31c0e22aadbe4a8cc35266c9eabc1f728149ce5ba35808b8ba4547d37978e1d790879fe963ed9e7f42d7d4cecfa965c1f95cfc693f0fdb925f7e798dc9f8b714a0a10132e608750f4202ed63dfe762c4501248146cb6d35107f339f7685e129204d58be6e6d69d0413cdd535fcc12de970789e276c1980bc684fd93a8c74be88622a1cfe5f7a0906178d081c72e615d0ec3c30b771209c114d4cb617698ba9348c86176800ab303995bda6ba78895112636c6655d0e133b33bfd6ca3962ddc4637a56663abb6badec3a12e5a4bbb2fd2ca56403fd1cc9f93cfae8f8a8fc75e469f27ff0cfc3a69b6ec612b65808bd7ff010b8e36b9e733c61bc12f67b4deb828bcba08f1ad7ce9f195409fb798cec1df834494771c8e59187c11dd3e5d3a4fbbb05b512506820a69d81e1fab34f5d4fbafe3c75446f0522de8218430882081e7ce0947abf7f2cacc1a31dd4ee1f75975302ccbc9042fd6b2021d77b664ebd78fa06d2f141cbeee98e9b5168d4b1a9a268d840747c82648bbe9fe39324b1e81bbf27f22a027ff573057e94523a0af1a81c4e0654e07e9bdc146fa26e0654c2ed7adebd951cb8356efd59474a859124ee047dd4b874b4dce49e5e126196b8b9536196a8b9f32fe0f5330f3fcf1fdd535d1f7dd523b4f4f97c7690c417518f97505001a48436f04003504e44322f76ea02cc2d190c3f71ad5216a538e922cb9d425c66e606e2be4771961a3ce9de8e3a9a9c2f0f1245989a7e57f8a4fbb083ba11a99f882dea5e2ceac6af8154ae1c7c80f99d0b072360f24fbbfa4eaac2ed9d39e5f5903bf9c7dbdd7df36ecf6b15375a474a29a594babb7b4f79b483edceb19dd219bebfebd43a3e0fd16f9256ea442892f05d1799fb7bf6fce931adddf60ee9d96fc2b9d3246dd1dd7d6b6a29ad1ce795e3388efafbd7425da85093d47e3a6598a5c6ebfef67e8f5d1ea5eecd627bb35f8fc55d9b3ae5afb5b25cad397996397706ebae6e7f77b9c9e93eaabef0d873afdff6a93afb1d79cfdf71d7a9b8eb36ba7df46d67397007c755f0076fd5f35cbe55ff1dd5ab7bdb2996371abc6e5d3767a752759fcac5f3b3dfb627dd539e9fbd57ebc6d55a2b57eb0e47c4b96abbadd585f67d4cf92adde6a4efe0569de4d9eaf86db629e0ea7b35d0469ffccfa0898ec95a2bad95566fb56d1cb7a982f4dc268b85c4a39fcf0ca2415cc457e571d6abcf7d49979f247dd1d77d2e804ed97dc5f47bb745a6731f07eee0b66eb3b6b3b6fb763a229756e77cc88dc7a7ebdce7749fecd3dd0515addcac55f53d83463edc399877be0fbf733cc1b3e00fbf757ade5752e55595eaab0a7c8f8214562b6d1e2978e81c62296da0cdd6eed62f3f6067bd550477be4fae737a9f37438ac7c3fa68b4c3e88489c48c15f68b42e3d27dad9d2b62b02c01f3b02821460a62d48158fd508188266cc620b3845404c294296848da018a2a57d01995283e2c5494008110f5109f042fd3cc2041e3bacdad6fdd4dc50c955bbed84c131a4d2ddb5a736146091a33472a6026490b217bc5577508bd5e4248c038fbaa62832909d58f236a3fac7e20b1c452d672d7f270adea5a6badb549ddc34794c4949698ba875b880b24ac1f4cb5067368c3c50ab77c6529f345d7a58c984e4a992b3c9431428a323a5c7099e6820af4a75f76d233b8b4dfbe841ca78c192cd0e7a166c994a01286872cb53b1f2786b0fc0cee7c9287fcceefe1218f7fe6e36c91a1082ba024610129e6031962b891618aa62a45f39f7c77968a913a88809051f33118a13248cd732764e196df156378cd179afff3c9f9de1c6221a134324e1d178ae43edee5963e3a34b8ce60fe754c24a1193e9d5871c38f15576856a4a15d31840b342ca88042ab7941cb82880f56685a8c21850c6d0b36d75d89c2a838c57f622dcb0a17321c61031426558a0c111525e90530639a7ce94209d31fa12fc61071fd3d0c911cd1c28720a4dc1ca143094d900942072b655c814511b5c205052ff8d0741f03ab02cb1567611270cb1d2aa2dcbefd968a26aab0e1766f320450917491303590b7c29d6f97a6ee7c4ba581da2a71e7834764aeebd4cd36efc9c6dd7eeed8eccfebba6c654a5eaa813caa496b5f623c6a7e656aa079edb66d1f05f5a285a227f39eed9b49931d9b126e4a3a660027c2d2a1ee7c1db64bb2ee6e77bbdb97ada4654f3873becf15542899b7b4ae792d95bb8445587ab21a983415b0fd7cf0051e6aa7db2ed7c26bd300f35d8a87ea12ff1ce1a13038a88a38389dcda274a9ccc04196086ebaf3e9923b979a9c65c2256bd92e8553de1924a1f52e8b91d5bc86905e16231b734bbb7475ec7391f753155a97f8625df2202b04f7cc3f82c9893ba3b875a932555975b24bfc53762f765197aaac3ad5ca0401d2ba3810b2646fa5c2348b543f41aeba46d8461d1f5dcefba3bfeb5a2753a5d2e47c7a979a9c65c2b7320f0ac2042d8a2869bc50a1a268be75f2a00fc20444a4b4a064052345f3edd27ccb34bf913490d213d5f42295bd9316a946bbe43d9e6c36df7b9aefc93c27f0088d30881cc04114e868b5bc39cbb4781c18483028014688315ab87834224c9c8882cb1429ae22450ac85419683120c1181b145cc8d87ac3e096424463c63c79c262862d4e5e62741023430c3fe47039705c931e2cd763032044625670f2c1390074c1e2861b5ac8d2458a10286ba0c80205092894782aa801b134510187eb32ed298ba7305161a24fa8b44d1845b1636868000000087315000020100c87030281503020c9aa1c7b14000e6a983c725c389649c32c886114648c31c40003082004186308cd500d0b901dbcc80229874804512573bb00f0fbdc8e7ea5e86dab4ecb9474f25ba3f414636ba4132640322980d0bae77cd767ba3d2f0057619e338c0411061034f196eae1571399e63a83d4ab2e191334041a292f618a3636e3a760f571bdc21586162f918e8b0201b852a8cb2d5a09a03553cb30425b0261a18c9a365adcd48626b419af10a307979f03b0190855275ebb1bbd3e7e5b0465a492fbef5dd004ae1d74c481a197351db169af9c2bd78fab62dad4b461e5d4c414e0ba9cfb248a29f8fc8f6342b0a72adc280b1d7cca06da2e9d40177eb2ec50f4a4c7a1f484aa0f0209fdf2125eaee67e8a87f1644c17bf7b6f72daab267860581832fa43b897b229fa6a3020891b6aba425978ef2c76ae10b90fcbd9084dce1079e284006ae4bd2092b4a31a9393cd91559dda438c2b51adf2a0162ac1de989b81f03206a611991c8cdb6af4eaab6f468c6b50528ec3c17259fcb5bcc63455d954bf2926153856907a21ddb74e33e62d62f5072304582de0b18501e3128e92ad067d21fd3789b06a6dbac7059ff05a04c56a2e8b58d8bb33fd1bbcf9b3e467a50375b9fb8e7126ed9651f4477a3b2ab4dfac04d2f22bc0981036df4512790c4554d98738cfa8f7bc5e1da2be5fb776bea5152b48e87b4c3e9b647c09a41acccec0d52b7c9709b23b45972ce486c7305b2eb9b858912392fcfed9c1806909de9f0ae841ad0687cf9a7b1837178e9e345e9948d01212b3739745358ac480631713ecb2c63b3b87ba3cc43034a96ec87d8ed8985cd18668abc9d1a15b3bc715a48ecceaafed96535c4fd4c8649d644cb59a46142d0fc70c5374d9fe07a64b11ead069737d568343c0111957565abf949bcf3c158642de979d04c73cece1e49312dc5295cd9284ac08264302bd38ae0b8516a8c5c658e56bd393250d7d39479ba55709ec51d96cd130d0dd5b26d4295c9f46fec616b9701e6b0bbe6341e15f6bfc81ed457fd095506b7b468f99e029329f040e9920d083952d73d82d00802c43833f39b0c0cd00f01320a12812e3cf6c553d9d31b8819b02b150f7e546d7d2a02f27b11fbac157e4cf788d689838bfb871c00d9498de7b4e3ae6375c1c92ef2f0c5fdc6b8c725d9d8a104b9c0b8b441976594ea89fb328b588c97f6d21c51a53bac93e15ed14e7470cb303b95b267a853988d66f8e3cf76e7c9f07c88894bde56d5692d7eac758416e760827bb45222293b9d368c3b7454c6d5f8439bd1199d14adb181f0391edfa2be79d10da9ec9a80da442e795056f27aada4dc8b917067d69ecac76e5d0a880d0874c32f1201f791da830847701572c348a122b6c52a97ac672a5281d74439531fc0bc74bcecdfc33d72f0ce6a76bc7564315eafd67635767d2f18c495ed199def4a05130a953ff16cb242faf6f9362380e87f2e3c1b2e1bf7c2e410a3e7affcb9b1c171d56890d37c25bbd395baac45d363af8256b8ae51ac90654e0fc7f11849ab33cfbff69b648440ae1effbcdf2362feaa259ec0e73df2806f9f5f2ff4174dde715c4127e9fd0686a1fd74d8f8b6c02e4de48a16532670900673f1bcd07f1b90c83bb9991c7d30a24ca15c857639731c321eb86fc43c5957a97aeea651ecb7b1b37734fe2734bfd513af85c53335bee0023d466fddb8e195978b711e6871ee6d07c5cfc8f932dd354909e5690dedcae3457fa896423ea44193690291b1ec7b426b0801d3d886915325e7a998d81514842002ac7715a6b0cb24b1cc8079b659883eb2428ad017bb0c87e8d8c30bc0886349a563c2c0f0d9e5e4d1085dc8016d8f06e4746295fbfe57ccbefa0566ceb9259b62d1133d4e711f3cddbbd27727ad705eace5876049b47a17bbd4f455034b0d219c0f457d5b11a2d33259b35a9c58f49a90808a0dc07a32c1bd351d36306108a37284be4ee65e9df9bfdaab25b97f3a863900c51839b25ef1d4934ba458562b0461fe33ad3048f03fbabf8cc954b6821609b1795267c07965bb47966403aa83e42a764d229d0b145461a7f3c109e3e083e86ef83bf5b3fa669b841933e7b10e0c315c8a5828caca984143dd2dc6c1e5fdc98f7ae3255525d86a5a5b87e747f7870268c05300c5f62f6ac2e49a349e268b386085a91bf48283514d09645d36c66f79527aaffee373b5afab724cd85e7fc74177188e0144a55213be4c13f516a0b2740a74dfefdd5d3013758ce4283fa3b43688e06652b158cb8b8aa68ae3dafbe423ae87e01681db94ca83622bc01ee59beafb3cda2221231458051f26e4a6832621ba1e46feb735426384c004d9f43e6be1d4635b4f89fc1849970e022660d714b489da65e13314247347041572edf5b6e45ec4981beb651c8fd94efe108ede08b7743fd4fe9ff9d0aaf13830b44407a3838bddf452ed4957396645aaba246979cb3b74dd722d0a1e67a8b667de23abbe1db87346ae5c4afaf29e951622c337952fcd070c061a0e101564234ef5354b6389600cc7b4816c50cf47aeb0562029a125494074fe9b06949c5140ec0c45032b76454f0a67852cf2c9dbed422f0e21b88431b8598d347ad6dba64c5440f6dc1e869af91199c2e968266bfe5937a665dff7613107f5c88a1cf48fe6320c2ef316edc293eca54f55f091caa37058014debc4efe94b24d7f2f370a36ce8688d6a38fd239c4a0fdf99ccc5d83f8420e0108eb5160fc3d9de6f999b516c50160a4bbd0b56d10f30bfe1f2907be5c87fa4fdd597306798f107c046019fd9b2514b10234d74c064f7f18c371e6bed2165f320f5076c31a6cefa6df008ef0ac77202a8f366f56b69110a36f88dd95c45946290beccc63778e15cd6bfbaeff99257915c636c2b126fdab0e9405300300a0a4bb1055082d00ea25212234a5a20117db03a785154ddd2f0033d11cf58518b7638e829bfb0a8df1fb043803c88bf8a7da10866e9a07d10a33588a451bc998b90422311f82a982c2743e298d09508120a11a8999e8f3e9f04de177ad8db0ad68076971121a761ddafb5f3051c8109e94161243c6fef6b91d740d5e79a39ad4082501b108c1594897cf1a7a10023745119580c8f80951942354f67bc40362b1e169468a0f8ce4b708d4ac4184238491c61abff631937adfc21c738f7cb9842e582d99645ad8b2376fef22dcc64761caa3c7709d68d5161b279f3c5c473aa7e6e18c29c7ed80bdc83c40931394329f9e9c45954f36d9445bc48d6b44a19c04a353b3624f77ee0215c61f1194094b784b8adb20e926d7324af88d33c6371e20e694e315c5e468bb0c718bebde3d5b239b68c33fd8c99dda52fad1616672fd9e45637d9b148b790a7b6a272184e152b7c99ef2044b335f163a1f9a8b247ea81ff1d33476c30d1457cf5dd49e275ed260d5865bbe1fe8d7a763b842253257d2dc335ad1800282c21d92e8dddfc1f255970274b2f295f727e92c9a28dfe6400a27afa9f93b4d110c993795679a6d5d97c2fe701e4ff3d4b4832727c8b2036f8cfeb164c8d42dfcb730fae9dc67ea5d61df82794a74e004734db64ea4cee926cff3d23ccd60adf91ad6523cf6b5e36462d4233175ecec394a49c3c35aee081906638da9c3391d3041f6299a98937b4a759d96f1235f1cbf1f6e977d404e60fc2eb4b08c06d5b1546fc51512a645ba343eaf55e3a0d108b8c675fb8e0c1a26ef3c6d4e6f70717f9e6f8831c70a8ad4385679f86a8c376e7716c90c30f53d4cc72340d08a0958ce24543b21300478135826a135667b7edc542d70d88b7fb36e97603ad067bf1077b53f8a8258b3c65ae9950317c7614e4daee64902f9026845082e5358f58bd3aece60292ec12157afc806b3194c493c741782ddf2a29fbe3c7a7bc8bc1ed1fa36da2cec6b56b33550897e2613e89b10b85cdf60444866909e40d3847c58a78b90f479af8df6527f348e5e1091848158330d3a3e987a8ff38acd85f6e271b5b431b36b36676ebf8a8f8e4623d792d95d1c011d7834c3a710caef10546f1e8b46c3605a3f26c5ed8b1f50d12aecfd7500b252d328efa6275e81b6fce67f24f5262b0114cac40acb9f748ede4f717781247d66230a6e7c55f10b968f6770b87bf1a0a2942f4937dcf706918a4f812cc9dac92679ebc340c93c1777a6b96a36b8a0b5c550bea45cd883ae40343ea38031d79c789b6f2a9c991de809ed50808da416b06201dc5d46d23d1af4009b7eb261c37276f0746b2a6903aad9e19547f712b879f5312a048a3b7138a35d1628fe9a91d4a1e93b041695ba6c44d6419d98f97db4d06d6f7856615cf13b9699101dd96950bf959c7f18c181e48a27478f803a70fe51bb6dcd86f0ddfc65789bfb818ce19fdce5c6b39796d9b4ed485a33a13d8be84a24ef684f81628452665bdd52171cb30cd9db8e0c90c31c5d0ed69bd2865f5d029f162af2fbc80676b99df5ea2d4c36c68e539bb5c3d4b5685a8b50414087f0e48ccf37c2b6ed9b946ff40bc7cff5fe70f396ff376df754b90ae5fe116c057dda6e64dc530956adba987c9cd2b4190bef126d1d125e8e33fdb56ed6e5c8e96493d3f71ea1d8a8b0853a1c1cd64bef95b80889f900fcd0efef76081f82ab0da5724237eec582534ad7306fdac15faa3f5b94da95815efb87d9df702a74ba943c8ad003b040a2ed840b5b0954aade06dd58375a95dabf8525b2bb4c15d06f3f353112294504d19b9e08e54dc5b829bb8c2780f60957d04c4c5df6181cd30e219d1efcd84f7b9cf1a6df6d415c69f671d8bc18cc3849730b59f59f8396395dc2c702d3f26e9e33d1ec8f316e801dc3922437e596678907f3b1c89cd50495c6193fce795acb840a03dfa0529e63d2384ae6085867bc42eeb7dc4dd168fa0a46242b21475c264401ae5d8a6884194ac2a7a7af6991527a8124659e9992299139aa10576de7b75173effeb75f550fa5412496a556f0e1fa0ad785fa250899aa510cbacd0cc107613316c7c46dbaf443568c1b89aff5453113ca13d5cb1d3796bf6ee9b01ff5510fec6d56d7e94e2b4caf18e1c212d71083b6f8ee07e1f8110d99e2232b3ea245b087fd78fb4a265a02907fab74d18a607c12f1e127e4b8a056af24e3f62844c89d22c415c068df4725626756376974377cc05dcfec20cbbb3f66cade615eef0bac6026905c7b80406de5c7d609fc1f6f0569953fd1f9349497f1b1707627af8005e98260f741a579f0a916ca1263587b1bcad2c03e3367fa8a838bbc1444d88104ceb760adadf8d381eeb5e9b9c0aeaf7f95b6ed58ad62243a923f88c1a9c188d938dd03811ea741e53a6b4acb6c3ee557f73f89326dd56ce3118a25f51a9375ea15d4f2e173b8465fc0e680cf59db3c16771f83993d23d66931f4e23a333c3dac6e429c32f9a058c7168be86807f1baaf7aa288cc0b8a49b637308f9c1ce57f3c82406d9a3f2b891e29e00853584a8a54c071a4f3fbb5f4569a2510088e1d0604a2e67b6a5afe6b2bd85f7c710ba0ea6456e95de642a2d9efaa0bc6832ea134a945df8f9ea308ee86feb2c066beb207050f219a3ecc89b2fc1e70821f813a2f3dfd798c059d3f47998cd6e688b6590ba2e59b4705a177da7ed5c9517c1e8cd888b6b64e1ce683b6bb2b8a8543f849876801c4e2a78b1f87b6c610db43dbf60a31afb147106dd18b689bfd84d6e21209345d5dd2ead7f02bf5b560571a223c36fbe383795a39e3d9f23d05e270862c95b9631b340ec83a64b69096fd4b89b6dc1c170a2fb50d54df268968bb676dac0b2a3b86a5c868cf67db30504e93797d08921d5f9b31ae8eb56d0ceab87ba6698f371d5315ab0ba2b5249be9e5592ddb09eac791572f6b89a239c1977d865d2d86b3c50fae006d9fe1dd8785ed02941561bd1e9bf776a717f360bc2daeaa9e78282fe8ec8358c45742861090698ddda74a284b499a63d121411e7cc8124e655ce42076e2db0ea1ab3c85f6ef1dcd70b7a74c46ad537a773ab56255e6fb8e14b0977edc698c30bcee6eccfa1ed0a838d0b5cebf34565b657e5be8af924205fd8d7cacbac5307af091c718acc45d039240b958d6bb58cbd1cc5315af1c21a8656788cdd85927639570ba10ab3acae1cd87554ddb409efbdf2bab163b69090f93b90027111df3a8c8e58af8e85a825469882f2e70bcb124def241fda3fd8261889f4a65a8c71072f6f821d26f86ce4c42e0b953e435db49a6758a65276e90d3a0184ac1bd2274115214426ee1357d106ee6f8e5409b07c54278838c55f072d80a392d677577a02bba00781e0528b96669ae6639da83ada8fea133b39d78a431095c8e8304bcf6c9ea6a16bd541ab2b6b10a99d35840784bde077da688418959fd81c72b1200d4f89cf590434759a923b1222daf7744f46a9c3d4a7685cb4eada946d6a3c238ca847f32f6021ec472307f4b982f6226da94b3237c33d8d46d35df77a09d43b1902fa2810dc7c42b2e59884793ad0d186fc9556c8020868e2b160e8f1316267f22428b128873e943661e6d456acd6ad33c1e7c5c854abbeab23ee2c3d029e9657b9e33a6c5a76c06861408b752be20ee6f709826f1f9eb072680927151a7aea7e3c9e40ad4c45dc1edd8687746f00971909d1dc0d091dc5113b0a8e03504ed655a9043e0d18e89c605bf07e80dd6705d9fb8e478441ec642644ce364372a2e9fbca98b4feeba89cf254c45b91dc82b4cc3229613b1e9640184743288364676e32d1550ba6795a0a9027054a5b2cde6c2c10897a95a2a565b8778230efc802fac54aec59139afe859a2e159fc37021373a4cf1689d56f32ea3ae0c0c7391699c8858151f10286bf126d10bf128afb4cf1fa925f19ac0a6e5883b9348c63259686da86749248dbcd06a10e48304e2f43ce614eef828bda8684df61abfb56a8e666cad82ca1682ab2975772812ea177aec01deb429e73cc81a657cd69dc2264399630edebfd9202e169a4e89335d40c087461d1556c90f272aa4de69bdffcaa54ee42e29231299e23bf57a55fcd4b0207a03f1b708b376e37bca18a14934b29dfd72fd494c1fa39e1409726554cd15e0d9f806d8c44ccde31f6aa5bba0ab37ba3b5a5ca0c22dd8a839795c6cdc393551d65af67f7280d2349baaccac4b8d5d50119d53a7daf237dc40e291fd84b64d6daf13452c051b8423bf9f4bf7b8af803e30ed14e6062692c14dcf51134ef9c9a183b814b7b86a3a0c695afd10404c7f5f2346d72cfa8b9c228424865ab2bdff03172cbd33daea45219214c418a9db5fc23c9f34041d16dcf31232a6b82f6ecb6db76f17464f6fd8110988cfc0ff7b82af3068ebe19005ee0278168ddf412bc0f03a1d2df2371966ac72d2296beeb8d307fe7746f986e502126160b746d82afc2721a8e59bfaf8c2b11a835e11e0cf2ae8701d61dd50246344bb3257a7a1a6d70d9d388e4f65c79954e788717d4eeed13914be4a2f93f38c65942854bb21343b0f97535ee5fb6bd6a9381e8ce25fc91425765eb547f3b391876e4d77be32d550c426b70279d46a4004cc018b8e8357b0f81fb2fae23e59332395eda46e44231b2113640ace0ede9d6d60701c90c0d6acafe6022060c3784c8780e04c9df086a8474ae466f1ffa28825367c50f860991d37a38872220b8bada2d0fc3bc7a4aa166b0b9a19c907d58a5384c7503738dd901a72b54ff11780384a4d1019fc640a0553da9046bd792212fec6b4d0a396e8e501a5f656c85423deba0d977a46b5ba5e7443fb41f781290bdbccb21feb34cc42b5c7143f1b47414f6ef16372891e444cfc216505f911d0de8817c5a46d215e46f62af7a6f2accd577950483baf848e8e5aa4872c0eccedb86e154f88a8c096979dc5b7c3ec86f1cccd342764f8b4d7d11975e594d90368acaa7cee92118f291ef500b06b5f8c79a40187a0b137db15eba7c0c22e0508b65a2162fe4eecfedf41517e6a845341edd0f92348718ad8ca7ad8a974fe10733e6577eb01892626fec20d8d34c6b420b8aaac84e76997f0133cc9e3ba14e7a61b76d462014f227ac7f221d1e8b8998f5e913512916af8f5ec8049efec856796b4b58f6c27f21f5dd920dce009505132ccbfe5359fa8662dcddfd06270336dd1822afd0e65315873f50848ef041ddb7c9f121c880a8068fa32571bad1d1c118bb5c78102903519c58615a1851014063f8af4976a51f0715530ac329938e294a85de1b245370703e204a7fddf0ddef82bba0702cf2c003b862cb58814822e7a1ab5d569b19fd431b9a29c0b3a3f7d89a7a4b1c2429b90ceb0302cfb2beb5ae4bc874c86c8b8c90a712a300f26e214347d212813a57faeca8d9d3bd5b76c3d1087bb87317e661fc7bbc2156f313cb67642054caa319c98360ea4469b4a9c95bc7cc7f3951d1934ba89f0fc8a66e2687387db98201204c731cad58e906f2b858bb7f7c3ce91a5e903d90553b053cf7c34bf297de6f2d4d3bb476a3074f626b75e7b8fd4d29d23becb83221487d018f5ebbfed6438e69c469a394bbb4610856a5a5466e8c32862d03571ebf43a6eaa576fc1ae094a4a74f4b7b5d20f723cc09128e8a846f1a4cd4f6651024cf0c17bf3b90082ed2d011367e0a3213ddda89d03144c5c53a93bd4cf734afd92f608ebb75c86ede34e23621fdda8f94173017ad85dede988204e294f5f1de8cd495bc55b803c2a634a2b40804a96c09699e547365b9f2367eaeeecc7d170a7cd20dd2adcfabbad22cb3f90513765bb8ace4ca843f4ac2cc42d385b7ebdcbe0973b58a969efe26e3750cac0ccf40ad7f2cd5a067d29c71e51fb175ac67cc7f6d3437a9cf6f2f6f0c8ed3dd847bd9a89d2e0a697317fc1b0b3d9385ba24fa3dea5f13ead7191b8b8d00d3ad6935b1f55bf5090a22c07453bddcc45971408fda362ac3c72e66b2d1243412cd976483d8d7bf612e72af611a371c59c2a92b6e0096272093ae01277fc466e3fad227659589aa79be08700a8a22f1d5e12dbfa59a8324f3fe551c8126a953818498c9deb120106d0cb9beda53690b5c911dae790cc4ae0273cf5db3df59eee1c89476a0f14770801b70e903493b47146898105f846db9b9aa0543103b776dcc644c946d3cde5baa9cc93ad143d9620cf3a6efaa17c826b3847053ac6c6e4ec10900ea1fdd4d91a6215869cab2fab2b114e5c942a0e818135f70936e095abc8d85fb3f147609c3f8b2293f7213517ed3e54fb0167b773b2b4930e69f1d6562e1e43fefb2a354ebe6bc08a4203561b6f81d23d551efd65d242fc5808f744640e4b8550d82b71642411ab46fc514fbb33392f0e980d728948a123b746b14b3ec427a14bdb1950e351c97b73772a498f884f58642e30b3fc9f10d8d4202c238e2121903e9e1c896d1dfd720b870b585ab7d8b14d210e45b1becbb2f22a1597328071e7788427486983fd89da79ba28ac6f9196432e55c02f87d490737439fcb5ec0378880a49bbedd6505b936e0456898813cc0295dc67668b3a1e7deaebed51b4f1565abe35444769a1e86f24dfdc94b5bcf0d5f3c32e8f8224682ea285a6333938101dde314c6073b954227ed6fa386593a18e25fa998a03c874188dd0800d329f828d6c1ca1128946dc027308702aa8d5f717dc65c4d397728707dc96f529084114cb8d48f885ddcc1c304a8a8f00bfbb46b8fbde66e3805db6bae7d15487307ec1029073791593dce0e65fee3c972a10f8ae1d279bd937718db11c4a97ca5a3f5cf83d3f708ee7a26cf1b2805f3c58e219405151f9075c1b949eff8ec26b92b73ce0e5af87883cb71173882751b5db8e5746facb1f870a01d3eb1ad3befeee8421c7cf1cb1dda6276f65e23372bd2db7422b5147db54c3e2c8487c4090231d25908eb7d7ae166f8085d4620246ad86d7341b1425c57ba72b2259f2862594efcdc8c2f93d94197a8f8618449c1ca0b4d260a691f92fcb3acbd3470aeaca42283414c122635899052a83099fb65645b1bb31d173247c9304bd6eb2d2cbf6c62b786145913e382196ac412cd1fdf7fd53afd99f5396dc264f39a2acc79db4b016960db1526abde57d2fe25ef4ce32cdd1598724440bad1abf42857d3217565ecd5780d217cbf836d45aa8421b2142eb84af21d31a1efb7f625dbb1f549427df875172ddd61523f70c8c425680ec94cfee95b1028041c2f8bec86186e6e8f7d0c386e7a9b869776537f55db9311566d8805f48a72508af8a9940c5852f5d89f31c959560521dba3bf26bb32e9b35449c122cbfc6921e9978c7563b2e625b98156d4d98dd3a9d8b584cc4fe23f57e9dc4c09563a28dedd775e3331e9a0042d91a30a008f9172c8ba7e849e7b2accb16d0b5bd845b61d01ece76ec6829bc5f3082d4cffca15cc3733bc17185aa8f948c958c76cf86503953635ff29d56f233ddfc556c1b916df9408ea03a7e0d4100a8699c64c13d9306270611c599b949008224dbc7448d8272fd3581cd7d9744f9d88dfafdca63d4e5c2488053d4ccf79f31c271e3c5f34644038492a2994734a8fbc2ef64a5272d8e0ad910d73ba4f04d316f746855900cbec7b147ffbd457a8594ddc0551ed1222a3365e2c510474f4705b1cbef2438b24166e2afc2c8a84bc09a1928f644d9ddfd6970a4685321f65fddb629cc271083d006cbd2db22a8e336ea18bf2f23db32db360d3095d997e54321785162562c31a0c76baa3c94d8ac6076a6347b525f548ca07eef8d3d237d508bb6116f68896a006db145af653924dc3ef7c6c14b0879f90b65b1717c904c49a2672b2e2f0df206de32122adcdb5688c4c512a037f89d647804514d15c280ea46c219ae1824569e2289752d7af337d47c7c1cbc5903c8f252a09677515c5b3a27c84067e991cd2e6b453d10f03f66e5e28cd4fabd11ff1c57d86544b23ab77596170e06e52b43667f7f41580c2f2a37aa502b85428e2b5a668d2c80a34e94939fbeb4e5b2ab98e1389049e51d28e4ef45d1f1cc315027aa216d668f0df5582bb5a8df942562352867ac833fd7ca70579da45094981fd86bcf4985ceb200a16f29f89bde383e8c1e785f0352b6c3bbd84316656980190fa49e136ce14d26bc65e86e2f9a57a643825e391b6a2490baaf645d6c042e8e7e766be5e50d8a197e4525a4a35ccb7ce3fd7d5219d15c26cb74801382a4935998a8f2cc2e6908a093e1f86e937608f4a5ee58c6be1d18974adf8b405a6c692d6e6966a0a5b6111da4c66be3824565b9d696813d944d8b692b0e7a20e664c0ae13e8546c68aeca7f1d77d0814d6c39488548432abb8c2f86428ed18e55dd45fd32f5d697ed6600f9d0035b0640851a718e6eb9dcd4ea9a8802f3a7a291c26592e5a876d96c7ba1b893c1e83ad533f0d0f2403f9b79b6bfd85b571e965ef9759e157ba8422843de504035ed250cccc7b4af9903e87a8e10e1a6b621f6b298f24ea7720888336ee231474258914613c15935a90ed2fc3af889c9e1c1b43cf08ef180bdfcbe3c5e6ab8cb25212463a4ac95cb3e5767f297d45590e66212dbba6cc23886eea8e1b3b0feae754a96088d2f23538fdedcd016f3900f53f6231c7c09b069443e840b01fa21b3c5f7db2f369cbf961ef64dc479bd62941420a80b938c36918f51444b3f1fc683b0589ef59ec1e55ba4b07c014480aa1fc483e7d041483cb2597a9500a1ee0a4fcfe6ee6fcae57118aecc16cb8e128a28e609aec6a8c918f60c4eb098d7c5fe6be3e549869f891e546aaf5a02d690fef7be81945218194919b5acaa01133d31d295c889036f7399e32a25245e805129cfec2425d2ccb0a5a7c75763dcbd4d2a0bf23fa70846a23420a3c434e0e3945067e939f1bfa0f9b94a7a31bcac3172815d0485eac72b07c7b72fe4c0e323c8fe77d88d8fc4769296481ce7dcbc08d63ff45e907fa2e9894331c879cf6807b47b161665b6b1da45c5621cf50a163b8725c99d31d43ab2ffb288b1c56404d8aac5f66829573624ddf9fddb4dd4a5213aad015ae04bd38fe406315e698ceb63981306a9c3637c362a0d8f68ac6fb0a60dbd22413ecee46a4c67496f37e60776df6db3ecd42594f1db6c96c86f45b8051346897c579950057ea7a67ea31fda5d291a414ba365f6be95e35d42d2a0243551e6b115e8696c2984a2401bbc7c0c3d14485911bddbad41bb0ca9fff7131bc4fa6bc008d4147d000ca659f7ba91466f46dae1784e4d6658e0f45b08b6017eb36ab028460f0a45fc577a8e54abcdac4377f0fa132fa5839bae566a9e4751645abaa7e7e82373b81897cd6e64a5307aa98cc721699bf61463416a02cdb93afa42303d4b840f2911638efcb585d9bfaf02962ad9d76a098129dfc7a1f7bf590bba046a4c43e76a2bf591f62eb099f8beb265740f948c24082c9d6957f1333a23e25fb52d2437b80ce00dbe35c2712906a5b15eca3e6233d3bf12720bdaf1f241a39fe284b83e02a571a9d1d34b3afe21c75903b41d00b68282986befd92b317233934760c1b51f6efa4ef8fc3be28f6aa1afed41b062183ea5a703ee94f255da0f0fe4b26018c8b91e411c61603e75f615e94bdb826c9213f139c7092fa07a7437d9be4cb7970e6c7c078be775f7aa047dd61d680f5b792d4ec8dbb942d79976d2805a6ec21039aef7113d7282d1aa9f819dc7b32adb111643f1a270ec826e6e810380517df74786801b8109809c3beb9da04bc91f45f0bf447f6f254ea302147424f2c3d67015ea0d41dc08a4694ff364d7fa3dad6f0d07ab4d0721e4bf63844c3cedcf0eddc6a30715aa6399748b437934a5ac936ee1f5bca6e41ff27b52de767179e198e69dc78ec73af78991be71acd230d47763190228482f6f3d2a99742a79f76c0a24463a6ff92026bcbe88daf6a85969897291980369d0bab41b9966060a4b17f6e57f083f851790dcf541bdcc4039d59fa8ba3d7522fc0a74ad014f3cfe5b968d998cb596c02ee0d9d6f5f28201fca2bb9995f400fb447961ddb8c709cd28c03e36c99a00393087e54895da20cdacedcdcadd0c588d0805d11361c180ad7a1c98f583ef36ea4da67444a263486f224b8d66970e6aa5f97c262d73ab04371e8374681095f3060496984553c9ef925e2ff05a573af46f41284300d73c78214dc31d604733be28e31e0d5a09ba136170ad1a50581978f458cc8f53539a2fa27bfecd1c5d4597fe2f5168329ab577336b1568c8164d3920ac073aa23bcf1c2f97b8d816b534e35dc436ee6b7dd3c7c879e6bd25aa975d5bf1f0c51401c58dcbbeabdffbc54d60fa7c0fea4205153c3d2b7874d9be9b5f1bad03e102ba5c2ddcedfa82eef352b8f00345e18efc7bdca1995194da40611a5968afef36f4af84e486ab26c62a842d3d03d24f4d484d6bbd022daaf2afb853b60928cc22b3cb8b78568a116c346ef97866f492596a57e25644732ef21da0dc10ffcefd4c644dd6ab69722279fcafd5142a3de59c8918dd38c0ff8e45d911ac16469063347756f6a8cfe6f42a9b8b0c0e44cddd8d86e004a707f4b0089cc3c7032d7b01e1438cf8c9320892eb3fdfeee098b88a4a96474a13226abacbd2d96db79b393df57a24e34d68ca5b88fa01d4080e3e59d0dcec0504e148bf8cd5491ebd04eb5f750540def7cb04ac2f69893ebf8c2684649f9f7392e61a2b9fccefaba6f52350ad1f8be6f0a21f1c32399090390ec7477d535fbcf0bcde68759e7998b603c39b6d9f0fe438eb86bfaa1f2bd4491d8b2df42476b292bb14febcd0892875832f93a1905990c56ceb8bfa6ea3943e42e0f8df0671a610cd5167e1df16f591e813762d0080537467e7a44ecdbfdf714691fd788c12cac0cf06e609fe71115f77f6eb9890188de9ffc83f12096b2b957c140a536c6f3093915d971a12eb13f6ed3a3d4371e3792c8fc825458b1fea1265be64f898ee7ee94c5c1210f904cf45c5ad9eb9d2aa635920efcd00e617c098c85e1ef5c2915eb2b7df112aeca0576fcc9e5f8df9acaa8378ef71c38a720dc99eca060a2ec72063e26e305cb2e214b6b03403a6a19ad3e96a2afc4704f3d0118238ec815bd650ec825e34a093cb01697b85250d56208574ae1f8092f53cc9879dc8febf75985f0361317adc56418ad5154990be253674f4e83655fc5375eca58ff4ef18dc17e310cc29ae7e743075d3c8f59c22ce52d0556a90397dee5a7d09a79de1539eded1bc66dc2755f7547cafd37560d49ebe288fbcab8ce1e6c50727e80dada0e4aa04506b7d9e3a71f90403a8346debc5f10b5f96550e95c3298b7d71cb11c82cca5271999ad163e3c0c3e3a1063d7cf77c076febf6fc9faa63cc423fa59f3f07e830de2139d99008c6cd60b8a3ca09fcb2bfd2cdce8332d718bd68cd818e7dec08b1a5a758ca27177ba70ed05032018c45d3e421180a6c71cded9f8d3b9283fb44a069181511c4a9860d822014fc98cea96cffd55745aedb88c10ec7c5ec93145a825aed4bcbedf0e6ac1be5c162b34ede28413938bff50321331a495f1ccbc0cc1deeac771145e9b8428dfe6a8cbfc7b733d389da75bacbb25cb8ddc454ed25125ccd4d4d9b97619dd5ed2a8adb4e223ec7cd9a438cfbd6c8ce0f6521a49c84c70c0f8d5b2951b0c53ef42df69d1236689bdd81de37152a8fa808196b1399b50783fb583c2d6ec1cc43d5962e4b178747ce100d528abcf585d3ec213df0e308b05894b057a01a973f55828c4fbda57d97bd019ffc387a82c5eca75480bc0fb9ca5fb630ba83f814838da1b1aaa48e45207fa2d654328333107e4cd32002516a5b27c66c733623b2cd1df723ccb8cd92a143ec9729dad2a9b8ccc0ae11a67ed2b87875169eaf4a7350ea15c2df4959eb81c8fa91a4a125fa5948fb2a35c62024d07771807284e9a9ef39a133267349b850db1e42798ec829172b26f70fb1895aeaec291e7dbbcb29376a1ccd422dcd559eeb1c14818483ea74083057694faa36240ccde633e1443bc51c78b3d636cb8e619c6e83c75d6aa71870dc4924ff6e0cfcb5d5b95797ee23a04ba508125a63e735ca879202e5ab5c763edb39c33472b098517678b4e3e967143b269882c397c2864f431df55ad3705a406c17c5e0407f6c76d9bb83f732023f8e572c93206084653630a630ad70b9ba752875b385344eedd0682fa803f0015d5070eef63670f34109d8da25c3467c730ab978af919e56d3fc8bcb74db63b20ccec71ac715f4673d643d0bfe6af9ddd2df6606191cb0e7bd5bd95f970b87ccf9513af594b19791e5bbe4625a2ff66d215cb22c5592285b90367c07ca7f21892e2077943ecac79a2480c27a954056ad137daee4c1816586e316f362df974b9cd50311827b73191392dc7bd0f99e77571bfe5f3445ca64b1e11e21deae32720ea72b6cb60039889024e88ecb95425989be725ef8e89b51fb2f9f1c063b5d85dac989f915c2abe99f8037abbf52a2794657b9a6bec743f36e36383023e0613013972bdd929efe5817fa11ec88bbca43cb0df9c093e1543ab0ffe1197b4f1ce77068b7deacfbce76d3803d0fce317cdb30fa37f906ba005c596993a77df5da51da199059ee22ecac2590b1716c2ee724a73a3cfbf3ac12e2fc148e7c42a3ca517757120679074380284ad4ef53d419950517f9630d1c5ab90bd123db8a322462a017c2249273afa700f416558f0a2eb1959f2a566ccb2082aa9dc1ac5cd1ade6b8ae3a2386eb1da2b65ce560434c028a085ce7f1f051200cd02f6b4b7b4998cc0f487c0f14438347e568bf9e41ad57a0c8c583e30540d6496e8e301e6277e5ee02f318b3f7000e254b0f75e132ca79de0eb86d7d5226e042c35a8ea460ec36e0fa5ee0e54f20800ae39dba4d63370269db4486f035a0164ca8fba3e90edec6fa9cc9d985ade2d70989487eabcc66c976aaead43c6ae5dff15b5c93ab23be18f9379d4a6deac94c90aaad1c845803ed07ab5428deaaa24042506c90f0a5f465efcb14ab80e4b7372de1174c5546258467a84a50a45a9228a946e19150e413fdfe30024734cf44161aced48bfb5141150c9193f22a99c08508007d16de855e0d7d340f94268e29cf816e9040dce1f6638642d0700eb942880a184a59eac961334e657a2dfb7eed6c0eb68fad2c119b84b61158a8849cf087b107b89d7e7e4d8152d0c608583c6a4749d368b50aac6f3343123a44df83ab638a3788b8567bd441cf89540b7fa8ea13802ea9183b7b2ee0c90e51bbc5f126ded512e5a40d740efbed2036ff944a9cf55edb2af40f6008280858c5667ad1aa7134f472a6c23b5894812ebee6cad8597860cf92f190284c7c8960200cce219d7cd5d786a101e4436127e059354a1cad8af7b62deb070a96900197c174bcd5f9b5597dc9d413062f8920394684747b6f698b7542c7fc81c8a9d1bedc0836978b45a386807b7166c2d1c261b34f6d9a475731a0a9d7ab2b650036d2632de850f97cc463a556a2d0b367306c307d97ba621ae4a7804307568ef58c7efef5a65025b4d20b29b17463bf7eef85abed061e3c04e8e023eea1dc36c5d1bf80f09441c41ea355e31955f71eddb9041d5ef93eec8dbd35115470e2b14a6d22c4df959952bc8c1b6371ee4fabe93ce14b4224efbc061cb95a34e23840908a27a36a309ec9960ea788039e210f964df678e924d36fb723819b2dbbe58f2af2c3aa482e979a523cab2d74ac398fdbb951d4053460e937b65490b5804b69b7cf5f11e68444ad0a59eb49c255a66cfad85b2e1db1890727a88ee485885b6a15ea8d24c411bc9500cdc08166965d06f886845ffef8593b818c47357a6563a5f93057dfb11ed49d1f0a96d8ebe827a6e4833f509c910c6b7c1ace63b8a3d85bf6328c726a2d63369fc8627f48eaada2d4162132c469415e9d99bb4088d5e98b0326fb540e72733a80ba1d39b2bd952bb0bde60c2255b20cff887d7d7882b90e06e29a5d579d18c6288316198de37ba13b62c8b0e0743883f9c17ad26980bd20f1e60e292b9361eb6172d561179739b6fe47332d325be6038fdf10172e6335a91d21a41e1f03fb24c4aca1c20e59215972e04e931dfb59a70aec417c79e2dfd0a44b9cf89fcce123f61b1bd8e3ddb026f5e1793c922d3f566d6ee64754dca0a14da9cf7483e2e0a8d707a92b65bc71e2a70c75caaf5c541d5f4f591644bfe8216f962825f2be70823509108fba882d65a7ded5250a162675d4a3198245ff97ad99a123ed284cc500670629208c0b2f5e2bf69faee951a459781866c11926cec78461e3de31c8894e0d7d008328b634e43ab12b5a44fba570cdabd760008812c0335eae82793cfd8f8307af73072603634523f393a4374ced6e33e19f33ca396f8718b587ab02365309a3898f2684e67f3f2468d6911617147cf2823d669ad28eda87e8be4598c1b7dd4b87e86fd2dbc1df846c494972a4039bd1ecc7e110bdfc4b060b9e9a121983f7059d3301be49f3a1b2fc37a5a2fb1df7830aac90b1104a173943094a3866802c2892a772238ad3014203c0726f677d4e7d42c662b34424773853e3977f5d1f205b2daf99acce16ae6249700e1b6824f82b3dc2e01dadff20ae5173a56db254f348693171c1d0932ec11ff03224c8d073ea6c60ae6c8b7a848c0393672b873e9cda988e69e6ac9a88ce21e8fa37b8d4bd21a4523d6bcc56709b3ed66e477695a92d760dc8928f06214930d37be98b88c618d2649566423904dad5c350d1bd532e400c831df0a88d1ddf8854c282e09f29b63c0c3f60d57425a5fd4e79f28626f131a419003344a2d1f2c17781ff4e5bd79ab0a61d87423b78dc73003e822a74c7a94316c78205eb52da33726f6324058e4c14d0ed0f27e1c74f9d692671b0698c09a57fb4235d84789dac7ff7db33ee2a44d7e797ee56682d5dff61922546cbf5b683d0017f817b6906491bc2cf89b5c512e6faf0325c7fdf7c3cd77a9ee1b3334405e8b952fb005f93f4aaaf72990783f89d561ec0ae3fc4b8494380ad5c80dcf937ec8545400be5f53674da22c1207cb91e66e91c363d09914cdaea669ff89c6c947157276abaebd8f04e5d470830cd83be54c78d390f3325fb0c3e27c0917916e42dce0bf052d2c3c7599f6cf22b2eb0e945c6eafdc743ba3685f959b836d318fdc4be0924e07f802e1128fde5983813ed6ec5dbea7f34149789174b201c9b8827664d6f48196b45d4eb8acc6d86a632846a3d67d01cf562d901c1a8b4a8381eb4c8f8ee61d392e6894d2bda2b02514513106d5a3e6468f7cd5073fcdc37eb3fa414432e5c8837b2f5f0b40ac1aa98c32d758ca854f470f42db3f37e735129dc9737cf59c1e6f878a5604fa5106495106b55c2d8ae2596640b6c3ac6d9936b3abe8a2e16d316d58e3fa0170f58874c2fe24bdbd0f188e07bff1496c05e8f6f38d0740b39a8938cf2ca00f222c4c6c0fe477802c2693a6fefd96719693c3e40599847a389d1b3f902d3a05863cea4195cac166141954aae4515168a2544c0d82f47742ca4f78c069fb00cf4a857761ded4c8ee3412883ca0619f35ef012e912fa6cd911b15b19084ce9d194ac092d6868435fcec203dcbd770c9c42acf685bfc719c91360e330522d50c5f69a4536d1864d7b037cf692c58b2e566d4c24a22ac5b10a7efac2223e5c86729786d2a43f2585de1f76faa7b5e6504a1c5d9e4a23614eeadc1855d4d2bfbda946e15ef10e985ccd3ed1bbf429a19d25120045b038eaf2422cabf59a499fe985f56a3d99788f7368d5d860d8ee390d589167852bd809007e6cc7029f7bea0011e11b6c8aefc0b1c4cdac11ad5a8fde06678521ddb0de214678b04c69551892d3ece1bae5fa1f5196e4ee70080997fd26c7a27a36afe98a426903e7e79ab73fe21981d97040de3b07b074f6f06f7395c61e40db359465a3deaaa283ba23e098a9c6bd82e72b8fb1d0c0b1cd7c3c61d67191c21418001364a3963cdd351b9d1b1cc2c32ad3b4b87bc087749d2d1e3b47bf6f662278c3566853a3d91eed82e9640ba74d0d69598d43142f7591f1bf48c7da42be1059984d47762be8d4de3608d1e4b2d5ba962dc787ada19f7252c73e74d304506cfb1d88d3bbc699cd4f7feb583885c3e875b10458e0ee733aa3501cd077836db9ec6eb33235b0b7396c4fe9a5dfdb8d26b6b9028623c4142cbe46232cfc433f70aee4ad78538b413d5eca3a2ddac177bc282512a575a4645be6f4235894d18bafbfc5fbe42be78a8f8c8de3867e533c4b235b3f2abfacdcca563186b072eb214681e25cbb307823b2e0afa6db850e6510c15e74ea7e8052cfef6d9b1d1c77cc44d1ff20265cf4b2b7b1efa9e036d435516a004d3f5dff103585dc27378fb5ddfd315220353430fcccd33807c710ded7c6dc7c7bf14dd2dd1678825dfc070da48ec08d55d8379e446744956dacd0009b6cf1723e7d1f315cb1541cf15f2539417af90345fb2ed8bf02c5032450c83c5d26213dff976925069bc0d75e870ad7934b953010461b8a0f364d55d7bb6513cc2c53b72cd8d3cc5bd3ce720197996f4222e7401f91e2825d62aa546c015f24c39e8945c456c35f7f9674dd99a3d7be2cf4bf67e6dabd434e5215ffdbadfdb7ff561b755b640cccd0ede94d845efa5dca3cf6f2d7a2974d8288a79ec28bb54e2b0de2dac2b8802b46c09892479aa97399195e84218a093fdf8d350ff5bd3931869adebbd0c83ffef69f4ef0ee899e1db2ade0690d911df1cf0debdc9e840bf092902bd041082bfc467a8eef575346f688bfe8683304d20662a08083dfa9df60fd5a4af225816cbaa982739cbdba558221ae54fcef9d22aefa42b682205c629e11da977fbf36708b56ac9af46e1cf4a695bd75be46a35762c718fa0d3f18a5a43255c89fb1c2aef9a6ead617dbb2173ce45dbf6dccb9f472186887ce6009a489bc8ba3d40afc52636ad61f8d8ca86da52fb49df2088afaf4aead811f36f405056fcba7e1db1425a14d54b90ef34b85115bee763db8f41870864af731bf30639c66a81259b388655a726ca540a22e8a0a996b91b2981b00c0189a910ac0a0ea2ebb8a55bb4e0968d3fc596a77ba811dee46b0d0b47a631f242757cedfa044e3e03ad2f92b1d74668829a001690ce0d46cb98960e8b8009f21a74662ffc930bc08104e6c09748524d82d749b44d5ba24ef65e94fb956feb8a311bc684e57fe7a6e85385d2cea242cbe0648baa0d42411bdb4e4b9cac46098743be379579b49e7ca22424205e49e79835c66faccc646e640283ab349d7168c546e236cec1daf5f21d58d0e690d43fa13334dbda752772314bd167270cac97f15ceda0df44548ff6511625cf61462d75d2dcc201c4008e1845ff1b4bc81be0943051b9ffea0cd53dafffa62ec982e8c9704457ab2f8845be060f78a5e5e7a53366160ac777fa344919ac5776366f881ca9289de664436fcfb8bb77a489e86f9b94fa82d2b122f6909581fbd940c8ef4bf083a5d2b38062c51fa4b1ee0208561ce4de861c89b7be0b1aeb5008dd238a259c9d3b877df065c17db66ce3b39ce3c6072302c05716e732ee9899ab557c41fca86a9000c88b150221fad99c0a1c11cd30b320e751f6e32c0e12d799f4ee31ce18e056ea305ab438021391dad16249a6e0157c688d12e5504d02e8711022182d701d799132ac4b59df947088a7dc51269d024823e80b0808daccf03beb86f721211d259910dbfb7f2d387d116d400277d183b796c398f60d804559746ed709e22f3dfd5f9211884bdfe55be2c5dadf27ed327f1e3226872b04c98d78451589ff484d0b98c0608d387943b95be92be6e8e20214779c5378281e0788a7ec86b800019ecdddb564a10a62092edfc0a798ab781555c75092f2dd75cd5c7addd5d3c49f768c26c53420799bce041f203ae15fde0eb5fa1670daae4728706ffcbebb0eae0e0bb350605efffb4c26d0c9e79221b48d8e7c9ca91a48d010e591c25d4c1efd284a78b52dab4f68ec1026e1e833016998f03d2e611e7fe9bd1cfd751d005b8f3509cf07c48755885cbde7d9c7c69dacc37cd11713843be805b7131aa458f7303e00133280d2f0bd6da9c334ec995d91437219f0f5c8842ab20421c3cd1f46ad56fa826f51dbd4c7008473780f38d809af289e5512324886f4bb0440dcf818cf161e869a8b64745d16e031a55b0f6912a4e08e86e3b189a4d61d03a365f5bcdc690c553e3041455c7a05281cdeb45d7da396d9237ecfc95cac0a8a0b3011cfa252d6d3d61d598436655c841e36c649d794d47f2088707db5afcdc54062b03037f8152053493260ae3f4824bbbd0bf996ad97fe23ad91314477ab6dc6ae2a5704e676092a33853b93fe7bdaa0b93b1a063bbba84bf628947d577f8217f1d4e033e125a64ae36a16e2f5962661d25a2706c8c0f63a2b9e48b18c9d5dffc83d3b2d3c546f239ca858ab55cc3d381583ec4043b8b41279fe5e8418a16f09a7bbd2b05f01ecd4711ec208363c25702a31bb7a27b38654e344ce74c4dc2783a1a8e7bb78b55ff701001556d842f448d2cf4e1ce0b4d22a2fa8019296338bce8dbeb407661a5c10f1aa8dd6d93a01c1589875972911353ebb53c881798e7f64a155b88f799f83b120b3b293b250e134a843395b7bdbf77d93709672c186d73a550a13484f7c3805cddcd58d37e1188318a6266303c8d78f1bcaa024c254fba0248c254c75a0d4b11d19c0817f51dd23af78c436a194e67c444f3c3eb3ac55732f0f2d39367fc3483fbe539b7cbfd06956f5ef9624c424504e63e0a54684bd4711c3cf76722f3fef363a8a94ece3cb557bd7702de2715f3b30c50806c85e7f7a1456f1e1d56d30c384ad4923d7d504df6f6ff8f179c48bcea02ffd03eca883eb28b4d4f23570fe562adec94501f6c36f419d82bcffe2e7a3367a13759f50b5835af610ecb708f931f1c8b6f8287a496c40586106ea8a1e9da17024e630d42fa860ed390a3ca96f800cb10661066d6da6ef7918971c56f1bbc31c9e654f223581639725948ddc5ccda799fdcbd82ae8596bff362799d998afd70169063c21cd74cdc668f58a21f2452d311248d4806dce2b4bd4c758deed511e3a81d0fc7f946f6f9ab88244b61e631936a70058905f6ae034a0c34765a356f050033f759c41181fb37890dea02565ed3cb26670548e50f40a705b5c9f1870adc5bbd82402ae49a63b2c8726a1ab14019d3b37b4f876c1d7e3908623dd4cf207ae0a92ab061c3f13b4343e9a75e5790f2756989a62c40fe9820c12f065e96521f2a367a1673ccc7ba873c0c46627171a7285f335ab3ef006c8103769c4fe279d31c2f6e9e9efaef1f26963dc48e908dbeb69122283970e8ac37e2a5604598ce13d98bf288195ad2a273aebde6447241b57289fba4b96deae47945e81ae95734177160d8192b5d6bfff1dfddc78df12c5e867146fefa30df7d58c581d9d37aaaeb8790e89912746347d312dbacaabeb6650f9dbb479bcd831d85e42cb9b59593467fd07a9079e149651dffb9783dd787a27851a0637f44479a8a3863a82e6853e44bf14204f04acd62eca633e6ac8177bdc475228b01e2768a7bb9b21a1e7cf8b20637d3b0a393eb8d65d60797c9dd10e154ef1684e2cce87ab17b29056f34b4aeaed69fac1d02690474b63f870760bc3bda3e310d57cb6a555196f28084d2893688dc149a6fe496862fe43ca5636b03a9a14ef9af125d948d7525a50bb4a011ebc1402a363fca9ea8543d60ce07e4f3c93319cb2010aeede716b8efd9eacca97208de0e4fd8b20bb5d485c900dacc814ab8fea0bc8d9566552795a21becacb6ac346bdc71f4b59039102b04ace578d4676c1c3165e39d9463fcd92ec7d758eb27764eefeca4e2c74c841274af537cc3aa6bad3f3172ecc0b1fc8909d8cf01aef540a823b6146706e6578327ea1862d27a4b7850d330e9bf49f63c0108a8ef363933481a44bf3238fed8769c016342ee22db6c56bebf3cc455215a6cd66f08f32c7b2c2a73df046126bc22a1c2185af3f768888df5fca7e1d82154f189c3cacfc671361f2d5ccc0e8dd80a85abe93086dbfe217cbce1ce5027496a7061eeb41a052af4726cc59607c4123e7fb3f7eb4e55744117adc4fa52f61b634d575c761fad23b9517905434e76c71f2c618c6c2702acf93607f964b31a26dff32b84b1b4159aba03ef5965dd8ec5ed515d30c380f90332312b8609e0e549809d8f70875dbf20b760dc5f8a3b476c270861e1a90fa6f23cd6d079ffb69af50709411576cd48964f72d0107dec535f0be601375a3349b21235716729e8a17e72ae04eefcef80b40a96765db44ae868db3db3ecbada10e1fb0e0fc75977185781398620353a450c4e2e5d975a458e295ce37f0dd3a10a8a5ff57949702d5bea39f0644ea9581332ada545717264ce516a14c9aadc85a14dda3ac5bc677b8aa38bf1fefb557ecdfed88c9a4ca34b304a78d4a1e9dae6455407bdf097e2f415cdd5c7fcb2784bccd6234eeddbe9de83a8a1e1f06fe455475cb37834aff7707dc1341896022d3f8254c74de0340ab9b9be650bb3abf93c16084e9455b15754f00385320e0be69d306b71026f4ed0ccd7b3417ae794e8361cbc85e9a29e394370a46e3853964022fbace3903753b58c11437336c3eecbd9c175cc8c32fa860dc2c3a4ffbcb036b73e3326756d13c78f514b598492571f668308b8617fd0e235fbcd55af78d0fc18a14fbae53e36ce53a05cb0743c1df48d4f2329158cc01d04f1b3dc80cec585815aad28b02445088d44a63201ac77fd682aa50844f74c024b1928fc948606077fe00fa982da42141c5075cf5eb9eba42c2d74823041918ac1462357e3e02ed00eca399af2a6060b005d9afd491cd46ee5d2a637d1b0842acc0b06504b3c25e3d26bbdd69fe9c4a68c881cbdc04c1a783872c7a0dd0422ff3b585e814558123382c496c2c0c186be4f8196f8857f58b5856b68bd6c8f34a5a7ba74cba1a40670fb2cb90b0d24850f94e078314cecf0d427dc69fa3ab50800b3afa6586c81c8012c17a1e818df5754c2851052c69e9fbc2e1f540eb35e5a72157985a6bafd3ebd71dc2f1d1001093000ca78374b108f507dd6ce76eb8000046a18157e7f308c19aab1b75373c05360359129f571a236825419fdb0131c1496fbbbefc10016ede90e401881f839a93379c189da2edd2071400c9a81f035e41e656ca7ee68656c2ee4a83624c5090d88f63a8c5246f357e9e4ba6e1089e1483fa124157c372f174e0fc2f52a265fef78a336f25291e2fffb2c6cc8ab2575a9c33dec0983fd02d8d714d8a555d4644e04aaae64c5044ae820e0661a355e4ec847d6c8dc2427501558b28823f617f0e19ffbf76239b63824252f30f39f708e89f074b0109721d5b69de5384684f0406669b832e32edd687fd1967339699e199d1cccbc4323a458077a51fbc4789daa695eae88d422a17f58c0f2a13c15206b5b99d2274e0ff3d292188a88b44169e25beb19542a16e8c6902ecd95fcf26f3ebf30e20c7dfab11fb01d628b3693ca04006d7af1fcb576d422e9a17ffae1adcb1821f43d29b6a4024c364c78e22ae742ee126240c528a8ab6a980615feea110ab4b3dc4a3ae3ed3c638b0870d8b5f0474724c0725569e34aa0c98b0d44e57fcd2a324da8e4eba8621a8c0a74864650307cde40745f4c668eaf50a46e40365f881918731132912850434ce87316ed222d8d24c1317b65637fb0dee2de3dbd38bfc68217c274e102e61447b0a79555e2e603f981bff7c1684e04272518184d34ee3e4ff84ce00b243924df47e1966abc4dbc92ac608bfae1b6fd06ca524b222f3b8d391f2b71b217504bfff64f5f20deb68739c994eb4d6f937e21095c30ac644576793cd1e511edae13141842a1c1a1238795dcf8e48197264d6f490ad085b34b43552400e46cf94b97d9e4affe3e14793c1a80c3208ceea1414ea3e9d1f4256e890f9200872025409a15b497437b2259022b974c595e541a58bb7809782c78df87aab844164d0719712fc19575cbdee882d50a844301432babf6ca04f476e5044970b3670976941ae4e246a593584ddaa4ac0990ff24c891aa1153d20b28138a6fadedf70e0e878f178ab5fa1938fb1b24e9397f36e967434e0f14066414166cfe08fa31e04a17c7dbd6f31ddba732ab7d5de30e0c987ed56a9aac88babfc6f3aca93f4254cd377121f1087d18d1e1c8a2c41bc611e4c7809d4267ea42506e9320139be77fb13abf4119a287b416c4b7a8263da6d7b2ff53d3a58a98598e70667caea6ca555cba41b6a26116e94534f0e512dfcfbde43ff60627951a3679e817ca9c2843fec4bea25866134695cd9b3fba378bda588422374e90ed3562a3d2d7b38226cd730d5b0ef02d8d64d98461d2c797fe5f7b6e062f2181acb4b6cb0008ab148aa0cf3541b860da56ba450e7abca0df382818ef1b28db9949af0f80fc293e4ef3b018b257aced5810180bff4b9dd8b0898c700c4fe4f2b73e022100a5b2d227dea8c5d22dc50b5c70006ccc31694c1981b5449e0faa3cc7f42ee20661ad36bea33284710578ebe4f891b23989a51ffd82435eb00b3b065a7d011dcd00c84c51dd5651913db0b121b7d71ec93f1930ced2d7f65300b3f3ee8e7ac97a93768ecbe1d2dec142f06845c12d1651df3b14592389c4b0300e7e35287e6f370bb8dc8e9b98a379b8fe33518f462cad53d1fd54b732f85e2c858aecd1d714b8cb67625f23e0df005a09dbdd370114e18191c42c39d9e2b0e0a3c563e4c633171d427f4a156d590859896dce2531c3cfdec661bd49302c04e1c05acb0743a8a12a761d09d44b294d5976d53c05c40fcb15a0d56999a076c8ac2ae96a19b6890736dd40de17b00701688617f7b319acf80d02f2395ff410e319f6f07c57c48e4a46dce2b990596f5eafbc47907a9e63acd7a7af17fd21f5ee81763ff290da6c22a500aa40ded590e9a688139dbff52218f5419c6dbe447ac03a5193172d5e71d0567e1df7a798c0560986c2c775701c3c0969024627f71648e2f9ecc64e2900ba65bfcb448ee40e98ce3d2e5a8476e603cc09b10c48cfdb9a81fc46a69d19e04fa586af5914ac10447b3e06a09a6d0168bc56f1a22b51b6e80aaf024f3ea9600534cdda82c370d08d9ca2818fa5349e6c7df79dcd4b58fd71a260f4d061f1d94876e85bdf1b067867e88bccd05d19e9f9451891f12bfc002302d1e08818533c73ea3301b5cb0e5eae347c20591600d2a81b80f9c2984f819e0ffca0bdb1e179f1cde1ff2e3fe8101690d44fb712843287ca738303bb58695c6cd001b3314abc9b8a007e2852bdb662a421831e017b3ccd23207c89f1305c027193c5b6ae60cf877622b395f05ab12117ee64326e966dd4656c5508f3add6673bedbacb976d602ca0aac42878d6f53016af0c2fb95ebabc6bc4357566865ef7b9a9a9b714e01456653b525b197281683803c27a66c4a0ce9a9a8ca68acfa33d999ec62f1c31e4f74551725b312d5a286e76e15bd43975d58b11324cbffd8c0b1591e4222f1c4a8533705f6fdfd55fab102b8759415ac134a1bb35ac9a84f6ff4cf07e3ce0b2915512e6f9e7efe20326ec41ff45fe3bb372fa7fab1802d9f4c85537defed60ee6ada99bafe59cbfe44109b778da10621628da9f1c9d86932d4a09b8803c7422c66418e4f2c8791750852ab9a4d39f3a6fc2524cf9c05a961a9f881deadd7846655276aeb327159cbbcb33e19f86f27b0855b2f7e810b1f1e2f7548b6899b6a0b6efaa372e941f0717bee77a1a44d7e8e412b32a7e87e719e48a3e12d44f1f5890fef1e4f7fab80af9ed9dd5a978d0ec15463af353f6bfa1ca96dd5266cab3641b5ea09c5ad44c0bf4b38e2807bf773d6a7b354fc25cc157f1f75cf0bd6cc0f4edaf99d7768986df9e0cab2aa714fdce2fe701de77d1bb7b814cec9d5a09694afb40e5f618bb31fbf162da17f3c967fece7d3d358d491e2369671438a6ca3ef383faa96418d95d340473a1925a88414a33125e71d008539acf40186faae37b005119a3b43b670d1023fc1a7320632bed3a8d206307c3a4d1309737fca81abd6e8d257a33b03c3ddc47fb6fdf9060420824c70009627f972ef7d59f2ef8da596def864b6c312859afa523fd81801382727ccf2820f3a0f825437e54aebb2619172470ef84385bc547d119ab0d56e0d504c31dfba44f961de6f5a74d0a39a296311eb48d5607ce5fd83d529a33cb06100c991f64920a807a008ecb330c72b76f249d50fb036becdeed41d913349738181089b0f4666475926b817fcb3925cf60c91be68d9606e7082fe73bc02065f660384213f5d7eea4153d82763f8e3081a6477a9dd8d07c50f239d7da18293a672ed0b7d8baf9838b343d5473b8a02e84803cf9ac358aee3e9879098f9ff629668193a947e7c6b0a90012a691d2f493a575933ce7d4fc4f949a68bab89da4afba739b7ff94de95898e1ff8f956d566bc05256aa04b91e95e7d420f81f7ceed112bb50b94ab668b057750db3e99077ac2f45505a20ef000a42eb8afac460ae2a271af55c8a06a78ebb0b9a2baf0abba7683ce99876b847ea6308968908c6f9879c9a71920eb2c7ab28623c9cef5861f2e3c442aed8ef9ba9d8b3285422c0c16b967c4a96dc8677bea6fecbf463bed1e889c4ab91e2d576790069e3185b584945a68aec4780e39b65ca23280be020ebf6176f1cb7cc4b84e80c4e317e5080a5975849d64f0bc2a85163e922af19844eb89448e8a07ce34c7276484b2fee52c028917f83129c513d749811c17a01027849d2c169720c074c731fa427905f125e481d219edb5ba4b5a3a7b28926190ea2c594e990982b1b0219850841f9a9f3ee9906b1bf4456a844950774f7bf49a9dd7f00881f8ab62c827a89db20140a62030216331ba0b81011ae01f1d53f71538f4b00cbc0cf75842f3202cd30cc5557bcbe02e7ecae64205053724ef19a0b666d4299d5eb47ca2522eb4a094f3891a0f4ecad410738f2e4b85c8219c2d0d585d7eb5a3baf5a9a0ce834bedd3feab2107f54b8d7fea701fbb7ef9239b1c435c195f59e98ac4101805d3af3b21e4816c9e10db64fb3d3334ada8d170410861c2f67dca14bd53a615c56ab78e9bf088b599d5f1ccc3fd585367a7748de2d2ecfd1a54fe8875f5ede11a6b19cd625013736aeef95f6aaa13823b6ff5372e3efcf6dff6ecffdd77feacfff5dafefb6ffc2f3fc65e7f9523eb5390278d932aec6bf2ebab66d0aa6b43905c604d9e6cde7ab33782b62347a650c75e963f4f4cab867ce6386f7ac2bb4ef4deb87e017c1d6399f03ca12308c191109de07c8fd76b24ce764cec11777ef3131c3e543905d4213d4d4a6ad5417ecfa90bee0376007307dc3e14c7160394378dd17e43842e1385bdf3c305dacd9334c51911a1854c31448a88034c6dda763ff0534fadd9c59a062300433ffe1f1319cb032fd2db654dfdd9363ead4ac79fdd42ee39b406ced7ce4deb5cf8fd7d655eb4978e9d9e74f89d56e556908f7b3ab16247931c79c61bfabe03f5587431ffc35445ff9655071ffc186ea5bfb0c115474e6c6e6f95d043b650267c8fe7514194c0d2d12697285162850d599c7fa10c3aa4bac81a56d6d257d2a5ae9a9526c9244dd4244c60924d62a26262abfe46bc845b97371f6e544fb33216ac94239fd9e3f595153ce633263345ea208ba8f981f2d3e2f8fd7f15ba9cec6d31465d9992cf09b848af57caaecabcc2948efc21895e98fe736dc7d4b3e704923d432dbf86654c25f933785bfbe951f7ee8a7274e841a2e916a01c49a7bce83aba7c9538da1dc6d46dcbd5f8a7fcb9fa85075d3dba1b846c0d05450ffe1ec5b6b8f84016ee2fb6128d7efe4dde349ae89390bdf13f04c26c31b81fd4d43a6628b0e7aed7c7ced42ddb46f695742b82cc72972f781e3a2beca45c0064d5609ff0a95a7eef9c3373533d02694f6ccf6ab9c228dc1a32b805a66dd30b17ca99bb21b52e8efae16cfa695857da7c11b0e962a2eda09201221745b91533a1f1fa303becb2dcfc65ec5d15eec0cb802958f14ed58511497388045b377f90352c90d6fa0bd705334c458d7d653b043907a73030e3e0445c9754728b23838a27212f860290ef7653290b2db187c60b8e8a19d7f705b2fd8d62ee07186daf0799a60098101f419e5d839d4e166fb80e29d44e84f496db935cc48338392c9316181e0831ddfad842273a15ae19fc078ecd674d00c0563c2c774978434b8ec2a4ae05860f3e2b12d4ad20fa759cb7c28876baa6c7cc11aea7d61c01cb9c4e1311644107092f81b46aba3288af9e2a2349860e4c67063c84973f863e2d2496fd8d2afab93f77103acf3d35fffe2057042d669c5f8566aa286fa45c8323e627b97a95ff1decb54620d49daea979afcce35bd9cefcee3a3b9d25d9889e010c8aa545363a29f326204c397563572925873d7a1048793e32cdcb33c5c0055fb5b6d9ba07855341a8340e72b6fc147c304b63ce1636fd54258bda1a9b1ceb1cfa678d8ba546ede03e86e054729943b9870e49dafa9bcbdc4c31570c5bf65be2a09e7d2e49f3020920553d4e2f145acda9478c7838525ad4d0503086f80ec42a9d3e50128b5f62a46503ed1b2ea210d31689aab15953d43c178a427f6da235af904ee5f337a629aaefb9080a2be8ca80d7c583013fbc05a9c13e36931a799cdbf1529c97aa810ffe35d7cec352601292a215ed30913bd35d31d9f9452842ffca9b4d500ee0c13bdf6ae1877b036a8b087c41ae9289447121d3ec0374ff5407c2dd5a7f287472483d2e3c24e2e5744b0dd62ed51eb147b3b96ffe14754da306d83437f89c64820164ee002ab8942653605add746da964ab3dfe37994a6cc37955a06a3bd26a76eb455790bd1ae07b539e92ec96597e283c02e95f7a42197ef20ede6183c335e9523660048c507f443d43f4562b481faff81243efb626b26d99929401320290025d0233da2665b74836678d9c9ac05d7650a7e532c3e5b1ba35e906d010573e50902b7f864bdc6ff150e398dc180741ee0ad7257e445ddbea9aff0130bc50714128230f9279d34d298f605276f029bbd0bf3082baec0f7e4a8da3f52e0cbae2d25ee94a29cb1649ca8e24cbe5fc8c066fb8a41ce78e5cad9696fbd30a1872c73029a9719d1d295c0a971a6701cd634d929d5de23864b315471c20cdce68b49ad44153865de39c6a91c6c95e94ac24ac2579ac4bd92b5376ada23cd6a7ec3079ac50d92b2f7b8dca4e73596b432ba5587dd4a55df64fcafe3dbbdbd4b871c866d7ef742153e368ef9da38bbabbbbbb95ee3b55faf9715ef9fc38b37a7e9c5b4f1d44a1dce66fdbe1f9714e65ffe934771d44addce65ffb712ee96e7410d5729bbff5893473307e9c3b74840c681c0e7ef1ff6f6c6a683e30a4b78ff139b49fd154c98340251fa51eaa94fd299407814fdce61e141ab94dcb83845cc6238eb21d11ca2652a81ab5b23ae2686188e3cd1147d953adec7866bfbecd343cb32fc3d60adbabaec5609b65b5bae6ff82ed167e1175cddf05bf72bc8af06b077e19e157cee666b03d4ac156095ba8aed9226df3b74b1d1a7990456a9b7f156f8a17c57bcafeb66997fd7d647f1c5c7d74cd1fe3aad4357f11d7a5aef93fae37b8dae00ad535ff1a1a5c79350a87b84e55255df3bfe1aa739bdb6a55dbfc77d81cbf25cbbaf52a3bc6323f9ef906cf6c83a7ed9961f0eccc823b5f15ecca293804bf1ba652e440442334729e1bd0e013a3eccfe3f1b2574505a14e0dacd960b69dd70e8fe5e9a93d3e2e9f9fef27068d71f31bd09c1328948d03caf2c11bd0ed26def0df6e3130b7db8a4a4a08de8494dcbce0e4ca7765d94352c4255ca92f574c4f8b1a5642299e84b117aed1623714c0809b5018a3a11975d75a55781021529b88c0b00411136618a2950235a409d69020960c99c1620d297a1d7161b02a92eb1205ac832b3362071f7040e2030829494c5880375c1859f6988c803130d5000b7271963da60fc024ae4e963d21514411e2f444880c4d84e8681204cb5a11a409146e2dcb5e101e421982f0a00212e5088812d0e9ce64d903520415406eb03b00e151a5b83659f6765a3fecaaaad3eec809d727cbde8e062272b66ad70158c29d355199ba3223e1520f3f2a931e78a8e8b83559f67e44812df9d124eac7122afc0802f6c30f1d105726cbde0f1540122e4d963d1eb8408287a91b0059f69a90c096a898a450da3389a7e3f1dddd1dfa78165b641143f61b861144e922f7c52ee908102742dcb00514263b2817687cb55e100425d93f017777ef855208dc64d990f5051622e4fe1b164b72678590bb858eb823bd420a803c2b0b50dc7904061ca23b8f88a0c49dbf75e7ab08f1e2ce9fd1621477be03329ab8a395929fe48e722b3f61c2c9d5135559be6c08f9b787a92c7f66051df25588e85da8256240726bb268e231c9bca084a763678409f94b59465d1f59be6895cbf26751cf0318ac14fe7d3d755000820c7c72f61008584eb72c7b448c084da707ad3d526bca2d8f0258b1d57bc244ee9741b121f77f0d4a90dc7fc332cafd2d74ef8c416a0612269195e1b5f6ce239c905350d0a0aeb672bf8c0a2272ffd75ec8b2570517b26785d4d5ee2b4246913bc6727f7e0fb296e6ad38ce9f4f3ffffea6786d87bcec0f43821de5603bb2c38ab27fdd342a3795ca4da955eeffe8fc26d67910cdd9974c732d6be2e4413878e030440a2d38f1c1882434fa012a9ee8000892252dd0c709f5b86f01cd14a9733e7a477fe7e89f5b33abe75517e99eb9dc53b9a38cba9bba7454e78272b928a6ba2beeb841511e87ac2eb7f7511fdd2bab41e7d44fa1fa693f6d9e0b5553fa8513db0cd6708613537c330803c114180c067bd9eaa2546a8d15d0bfb96d9678ec57fdf20c773c443375f5e332011974ea9fabdad7070b5314a063639867a7fd4a699595cbd2e2127bf9606258643233339a1a9b9bc7224e28f1480b251e73608c3a35db0e4f8fcf4f18e316405b23192a04e54925aeff933e03b80034800f001750bdd918156489ab18a2d27f24a5ee237d7a429e941d159d959c4b63115bb0cbc76e64d0cb4a1b989a181ad94c466646368ba181a979b189ddb87c0b5e1171526694087340182f1d5bab36d7cec7437bdca77fa69472c491fdde74f3a3d4310bef37aaefe773f9b86a4fb53c53d6be17ccc632a715f36b951c9515dacac5b92c224b0b6e717997d84decc5e6d380bec0d4d86f4adbc742c18d91cd64323332333233d98c2686a606a6c6e6c5e62676f32e8f5bb0c822e25c1cdaca34e23e8de8843a35b06683d9765e3b3c96a7a7f6f8b87c7ebe9f1834c6cdbf4f68060750360e28c6d7e2ac7bce6e1ee0f3b8b26bb3fd26238a3bbf9fcfe5e3aa3dd5f200d5e80dfa82d92eac76bf6d8d9f84197c376848678a4a8eca0a6de5e25c1691a505b7b8bc4bec26f662436fd017981a201ae9c2b7821b239bc9646666646666b2194d0c4d0d4c8dcd8bcd4dece65d1eb7609145c4b938b4951c95d0e6d8c6cdd709bcda4da876fb5a6cc97cb2e5d439a89eaa8a50313121aab2a2a255ba2b251328995154545553559fd1175301949fa4c752e8a393f4c825e9b123cfb71ef4cf8700fc5254240136cb1405e69400a4333daef268f3d36a56b9dfaed0bf620dfa53ac41e9bb68a3366e8a3306288eaec2dddddb8216cbdcba75f7da5dbbbbbad79fb1219bbddbdddddda777d7eedadd3dbddddbddabbbbbbbbbbb7b7b0b5a4aae5de3463a730b4545474dbbbbebac567777777777afedeaee76a7eeeeeede362ee81eb251738b63ffcc32c5813e6a5c8e2a35ae2752d7667d16a6f24875b891e6b23335ce758d93497a48657fba4b82549469b24cc2c255a6f315b071018edc94dd3add75cde9293bdd51a69768bfbeecb47806ab96da39c21e7cb0e2d13eb5f4ed8378620c7c01995fa28d69bf5a30e4af77e91af712670dbc6acc2471c87332b0b856ac319144297d665276e9eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee36d3a7ee327777f79922b4aaba88aa89086b0a8a4a8a2a47f54a94a870544f555040491b5dbc02865cd9561ea96ec866594ceafa029e47aaa33876e4598423479e1b14e5f91b6ce5b981569ee238fb48a63030ffabd38567368ba16c046be3000a22148830920210d80f3ed4f0b4648a13ac68e028e2f5409842c8081ef44023832a2f3ac0727282100f68f4cf6fce6fce395d3247caed47b93dd74545ae7c7007de546ea5aa49a752e31a8a0e4e517c4c3a29af71dd419307232222220e9e1a37a545949b36e588fea8c4ca9dea91d219aa414011003317002028100c86c3911c05e140cff5f4140012677c426666388d4943498e6318868120080110000000000030440002492c9809cc0ed871c7ce16b15fd802b86675606dd6ff2d8390c13e8e6ba69292559898a0162296ab8e4a30efc6008143fe186bb1bff3e677f6ee9d5b61ed642295cacafd3bbce73b09d9a3204f72914a6565b835cfe5b1726ea08d941259175d851bf1308fd6eb89d890c85cb29efcd5961629733a5b19cc2ece2e229256e41259bb7d476f95ee5756e421b677ec962ec3247f1eab89cc33ab48e45a558af95e7e1589cab343915809aecf53c5a12ea2c8a5bb6e6eafc37db9310b0e4b40ca5c64b1e93c7a6008c21c5ca9452147cb12318420ddf3062fd9cf3232504411447afd82efb17bd88f4c41f4f30d735c1b3c71a295440656f8c6fe8b86280dc6a5bef92baf9d14ff008690eae06dd922bc59752c96c19733aafbe8cda856f04e52fd584716879d9725e56e07aef37e26d75f9123a2baa384da77dbf29159a4aa6e41173e111eda65f7e64eca7a12c7b33f5e665cb0a79c138104fab9ab458ce2a99aa39f140b5a6d158962c3fbbbedd2cc3e3921b2adb871300a42283fe8589206e81aa061a283a5460cfed31019b934198bb0a3bc58258001a0df931516f6b5b0304067f07b8a62cb303c598c25f1504fa3f7d1718a2d8021d0cb7f7d32049db3a8058fff90b07308a1f761c4b2064370e46d6c35c5b5bd2b8c862f8ef8880d4f4630533454f34edabe18c8965d2d3ed8a77000244bc6e09badf8c81424605655838af1b2fcfd62db97a23ae6c0ff8a338adeccd41629326fd7048b6bd2f7e3b451c2b6206d744451aa1221d324cb4e6f2ed9407d4a1fe053fe0f1241eb40cb908a0d745663883edcbb7424d048b5d376c67e068ed6171cb2f937802b9bdc276f6ade0384dfbbb3dd1a06e677b2c078552e226de3641ca04de21077f4eae25bcf4128d1332fba6bc11ce4b8de7dea12a32187e0381a02a0f489105b4168d1e95e75709dcca8fa57014e12276a1d5f5dcad7fa5d78f5ddaef2ea82fe866ab2f0f99df975993045e3060cae958b7c7b8ee1c274a367b208d25b02a480a788b4f2830e9c542cdba5ab5b3c2f1fea111d0d81ab60e00eef1dee6c409abf241888a79c6b3de227eb98d4149a5e274ee641348f12f837a6130366d0bbc98bc923505c3a6ef11656a704b8def508f27f6b2ca838201d568eb32beaf2b395fcd46fb84cd1e949c84147ea9112efb829f4d56ba672cf6172ac7c10a20d4278434de1f1df926633e52461f6135282868bd82a8cdec5ad643b3df06bffa004e15f5f7d7adbc6453bf58386f4dc8ecf621e8982b28661c0c19d0bb4766a5f43d9ae8539b3a495f3648cc9f4c50a50cb814afc55ed49d44d707b7c001c5fc200df9d9d2fabccd30c0bca97fac5f77b37035d38bf4401332fdb453c0ff0b3af5248540829a2edf20858fd5e2210d06b3cff536cca86a2a2b0f53ac319f637d2654004692d62e4c20460646b9728cc2db6c21de4f0075df87e084675a1a91a65213c41113d5221b24d5412cb6587a51a390abe67f727050885fadf934ccc229c07d45b413ba1b050d67323cf35eb65b5a7b7c8dfc7fa4bd043425266596de577908a7983c83e8ff8f42bd247d6b1bff38c790c91fc919509563bab481597ac67db14f24424094ac65a9ebb982104924a64358e794e8bc432b9ca3cfdf47b4f1db92112887d353d97a9ac89ad91a6e455fb9c010b1fcb604371665b8686d1a1c188348f5317b1ca561c0035af24c523741b0695ed105b317143f2118acc96b457c2517306277185f4dafbf50a13b0507a3413e6bb23fc29855f6cb54d28bdc2b45ff2e41701a013c5ea316ed5f693112013c6bd7d0dc5771d4bcfe580e42997180025cc12499ae5d3f174851d240b5f0ca7ab54b8e56a08982cf05c2decd3bdcf44143cc983a61348a8e74df4cf62dc3f975b32c91bbc3f43ff65cc36587365702b6496bf48693fb1f5e809179c30de50e47b24f46e02f250e161637884b545450c10df94ba799ac88bde30317d35ddd5edab7d2302c9af297b444ff302dc03ee3daf1bdef2d9bbb44bffde5a3482a851aefe8c63d089b3e8fe828ad95f79513df86177a28aa00f20fbbacbab5e0a16a06596d77f621a8f923c4cb6b3941340b39a427dc2735125502a5da249942dac0ff2e9233511c3aa26f03be47cc09b192964c68cae7be24fe9ea61e50995c491317f2437fcac2327cd849ebdb93f2364fc0470ab6de56f56843e48c375766c433efe74c3f2738e448daf7ad94e18e28d756971adce0669f97c23028e72728ee9821f82e292c11b50cf728bd65acbc73a9e057e5d48b99398dd94be86163f48c502921e79721029317c906a6f7d299a072932b028af1da4f8851bef74d41d362a9798e80e4e6515336049d51b3f5230ddaaf3506f069654c764758d44a777c6d6db5df7366e19da9214a13420e128ed7ce351cd5ee373873cfa2e93820f4e7c4c8551b1286230c6a3a0ed486dd46a02828c78904f7bc4f9f272b265fadcfaff47abff4b2dc7f5019d58df87dcbc604b82eca1b7d2877c5620669faa6ac8a7b83ff5affda7582910a468b455db4fb7b35211da777a926ccb2f59fa7d1de1b8c56896ae1cae239cd7be36e7b08ac2ef2ca05494684b7ddb69cb07b2f5ec714756823148ce0df0843ac0478e2cf34fe58381065a8c2282c3401c47e531308895bac1a6e82289a67cf666966518cada78e39e37e0fdeee66d223de87838db37bee129f037202e5d549b3227c373dbbc33a67148d6403cff70a7cd73f860961f1469c82a3252a2ebc269d89806611e0dea9cc8b31101afa0a483ce5a1177e36a0f1ceee48ea68c29d281fadc8f3f9965c509fc0b27ce80ac99e9aa5f30daabbae092505b8d9e17205558eb3e40292408e42b230c01ecff6ded4fc404daf886bbff1a88b66a25d581a85c07ac53d98169bc1581a375a2911161700e601f4ea28a12b74429e703a5171c2cef9ef23883c396ace541f2e92adc90d17b74aff80f4d5da266d09dcda834758bc7759070f2d6aadc7ac5594ae18b28d5f6c6cb3632ee19a39e517d2183c591cb5466069cbb3daab8f42669eeac5b21889ddd6b25b11f9beb68cd430d75b8f680ebcc375177b493b9bfb949a6a8bd6b34ff3a7fb75df4a8c947097ad1cf7e5eeb10a8b95d05bfdf712c25f04d46b5792d1796ffdabb0251db58acb0b396d8a5cd2b44e71e6ac20989d4069fec6b77fcc6cefbe4b5e8ecad0fdcfcf27aba70dcee23cd0ef2b4b715ee2afc7ec7dd94c21719d5f2b55c58fdf61e178c2fd77da54a2dd17bcb013ed8ae0fa015b969b5c905f1059c6f8793b42fd37b2d1b9b75b65961cf6b2bc1ae865faf385b097c23aa5a5eca85e96fc97dffd121dc8b7abc3343fc78d7f4956acb89e74b87e79e817ecb6a9e234a6f30ab37a08e53e2d82b79412d523488ea6f576dbef37f22bcb9b7483735f970a894f25fd5d95c003bc7d45c2d600f184c706890cbca723d837e5fee32f1512492f0323655bbf8bcb0aa4be921aab8ad0663057cac613f1f7d187c8955f059985ecfc08a65fd8d2918a8a15497b0510d7f9baae27ce2f136a531aa19f4b0ce88947fc549b17f30e0ca6b73fd9ad99b4c1d2943a60c212069f6bfcd64b3ec8bd08f9715003250baad80c1e45058669680d604802635c96700545c802aa2a812e1500a9034abb0c371dd9bec193cb39fb1d86d9b3197b0912e0e6519224ad0fe461228b9c6e2ca08449f86ec0480a435a4ef00a800d8781f496aab056dc82f0c15e12c7752f8034289656c4af9372b716e057423002aafa03c238112c8c67ca0b38ae43302283700f922840a3090731b16c8da090884280732458cb781cccf7f9efc3696071ab28cc47c72977dd6679a036c0fe5da8009f29078152f807346355b4a424096f4ed95809fe12195d660738986b2d51b2a8b0feb8d2dba82b55c3f43f63e5911cc81145b5630859a4d4e9a852a56678784894f918cc5cb15494b1689917c7fc88262e21b6437913cb9d2f7fa37fcaca5f0486adf38f8c317718bdc7d86042dd516c08dd0da10a147902781b80e4a789076f1a5ad88918ec03f11da1a12de92d138c5ad0b9b2a6c45ab159e5a57b6b5a0ffa6447c5adba61b6212fbdb79ec70bd3fc9c84b125797b2fd7b3fb752b51eb1b12cb13fe54f4044f8dc70449ffc27f8075208a8fd7431ed8b1c73ba6b3f7d31db8f04adbf50834f5ce8ce06fecce57c655cbb0b0ebdfc84b0eaa5610c7090aad28aec3e826cb0a936312aefde55ad4240ebbc00560a6f1984440495bc8705dab790e1a56de88e06e6cdeaf465b01f0d5adf468697f9d0ddfa80016cdd92cc0ac563053044310dc284624a4820253b330191c62e1ac372e485f79a40ad19b2226d83b390505d4ef3e289a0f44117f6cdeef46db01d0db5de448697d8d09d5a9833cbe9771ad73d9e42b7eaf775064eb89f6c34c47016fdc3f97a9b9537e2933d5a279b3d4a01116f81dde61d7169d816fabe8e6525f1c4b7cda2a291c6017e638d445fc687f3896151de2235b2e2ddd55da132e6aa0077d1694d8ca33b1b455b93b45345f81f2545dbde11a424c654c468867d40ff1e85ca68c64d62e82e198e3799afdf24dac3196191c7e0bc94e4d5c7a8f53fbeffdff83a0f0ea08ab48331d0d6d359fea93c0019fa526c92cd5a1dc02e7de42e0f2d100b95196e5e16460c3f3e2cd53881e57a7413cf3d2e3f81fa10a98a847c1af0a86100360210a67a8d2410ef44ddf95ca6607920f08bee9dd292d07c36a02e4d0c04a886767b1f9a072bfcf04e6d65fda5aeaad7a89b55c58186e307dd1497c4c7fef996ca737f6609b016c4a26f21d59bf7b6bea589d144a0eafa2c5b1ad07317e3ad2abc44c5f24378431554f027daab1fdaa9231f3d1a5da6546cf2d56df308dbcb3c025562b9aa68a3cb04dc834a7402d7eec2222335e647db74b2f82e0f8c26d53898168560bf3961d6edc06b1657b839ba79cdab6494f422a2dc80387f45e8cf54d7e83e475b176f17c2e71747c211139930d6e8f7c5ca5782620073d274e56c1491db2c54c67e7f654871a512605b8f3d9ff2e2e17b827267211734530bfaec93d0471e79f00120745bd5f131f00606e25152934644ed7e307e239737e06e82b79971fc6422feb74f77e9ad6194a18b0c6e6d4083dbd7e993426caf446c2cd85e5b4d87d61718396b46b1d959b16e0a2f1e7fd5083b87045553fc789cf5481bc9d31fb7f2fb061a70b8fe89c570bd3b3d735bfcb41a651a538e246455b4b8e5e329917385012cbc37a55b8165aca25f4fce8e437fc7c357779803ba82e0737184c5b40e864d5a3a1c42c140c0fbf0b56af39856bf81c8e8e17f1c12b9a1766b894d3dfa3171277eb1ba2f93de1331c42c663f2da99355d234c4ac1256d464ffbc9cce56e933e1c001e6f2db82c3dcee4c1f1ad3b34004a4ae6ef2e2e957e0b93cdb1c5b6a94f55db04e9efd4d49d6b262d3c98e671bc7734ba12af0f8e55c2a82bdfe840f4852dc55e715f4355098a3365c39740121f0658ba0b6c00b4b18a167b41d2a522cb65259ec8277c7ce888dffedfde6164d2ba4afa07c10994f8be885f2d13869b18f79661dc49866409ad2893a871435cb527c0892d78248113c80cfa7ed6e583a26be04469f95ff36a73fea5b571a916e5be36c9fa8da8d5572af40bac1b055c299a548f78f71810d021900cda7849854ada570ef283b4fa4f8f36e85585ffbadd229866ea200a92dcd31d7d1ad5b2b16c0ca59e95c30c7b30b03902318cf8c16841ed0782a76c3a39272bae232975d9a0da2b2219bb13389db73ec92562d69677b2420ab809dbc325d3dc8113b797b605ff2ef458db5493ae7da2f477105d15918e6ae89df0479173da9c7873f851a10e814b54f1a2a08fc41343651304ff6d384ca1b277023a14fb5f7140384d2830197fa0899eaa4015d0cb6f8e8a0c3bb8368a6862350634d6a24d5f679d10e4e92bc0986f4609c902fe0078b3657964a31010f660392adb570bf48c95375cb5db0b0cc80c5eeb9412b11e91fc7336d765d0a6c190cf304474a149cb2f30a05e3d63783838d638eec967e2d3d986590dad77fd0a3e14db05b95a9e4b4434496863b488aeda1d631bee5a44dbb526a249196435292de99e1acd9d85223d76177acabc9cfdc3372e941e95586409ed6b1eba3e125d0e74063e4807b38989f0354455eeb126722eb8a9f7a44c00439e9811085fcd6c59d3c5e793598b528bb7e853b1519098090620d880bd64fecd32edbd0f63c11ac6acbe64c6a0bfbbcfb376c07e406c063827f6499d96459daa82cb35c961fcb2c336f96a577d6443ae65bb361b952c600c10d7b62636970c069d0480d1e95b46f56fcd568ff5ccfcbacd1c9b5a28bafe3108850d8fc19509c52d308c673894a103393ff36bbadaa1009982166b0a232e949641aeabe1d530c739538395d67d1c9170e07eeb38c77368900dfb0874fdcdfaa4c8fe854a85f282d6ff345b882f9766fe064b681e569c7fd1875019f32646a62c88561a8878bb1db8b7e200963aa4082209af1185a4c0e714859e98ee1282e6df877e7293d4c6062d69bb5443d3d13570fcadb140557d724e06a89df9b863d937bf2509e86f85273cf41318890afef8e128196b56a7152d2c8532efeaaf250c379f1ba3efb4819f526f326d72fccc5775c19cd1f6f96adc0c854665662b3d7b993b0cb084ef0cda86af55ba590779a5ba08314ecca25f6d7cb52b8cab7b3ea524f7cef5dfc7c45ea836b88b12739ea86084f7d49e4128a9de50379349d0e60e139f13d16d4fdb5d3710decef91b6f2115e2d58db315a5640fd5d67fdd8a3e4c9685c221b86ce1219c86b0501b103be2e4c6d1b4d584e7d7d2b6429f3e13166afcd479dc981b45a13bed5e38cff8b91fee67b28d481733d3efb57bbaeca441e6e5c22dce9c71a290275f02842511968bb5d8741e38d509fd3e931ae3ae1c12b148268496dd547a1b2a6d8a204fa7dc13ec83e848a00c52955055f5202447adc91d6712d71e8b05c86209e06ec8a45645900bc0848d06690726d2a1903c9bbe87a6a21041e5a5efc6f6e7db9a69c5a2ebd4ff9b70a6a16501bf4a6b63c929693f81297108207fa1357202636db489a773dc6f6c3690e92a53cab50575d603d38942702226150495a45c8fddf85d6dbac9b38abf31dbc56c16cfa3104444004baa683b653202019251d0d33b519bb24eb2f7a94c9ab64cfb122bb3b467833cc5731a34cd7f6147251d02c14b32333986b1a10791bbdf0128affd62708e8051cd4fd08ee25632e5bed23d25adba411425adb6493bde5de010c0b580b880b3878f03c5b3108c2d373cfb6ed863b072ba542abcc16519c91674852c427ce8cced0136720ebc2544ab32045324f977493a658f4cc2994e9f2d72e34a7409814da83094d6bed53f8de9bfae1af7fb0f707c8330f7be6a1988f629eda4aa30835aba2e6d9ca3273e62fceb04e2a020333bbcbaea68238bc0f1bc4736c10cf368877abd50073c01b28345bcdeaa0e8d59cd9e9982945afe6519fc99f423c530c841007e259b628b84d12fa2c831a0a75b973a8cd6442d951ebc5ccd3d1335954dc6e9478983bcec3c714daec048e1750475d78bbad064843f6aafbdb6e4a16095bca3238fbd0704d4145411157ef210de999fa7aca740c12600e88518737900936bda665685acdcaa41e1cd42cd44d6721f1f949d4acd2e73324ecc3a59bae7ba9542a6518d2905e4d93e992484d7a353914f7ed64a2281b5ba8d5b79be989e6e61436dd9c9a2decf4e2a61747bd38fc9c9452fad8ead54cfd94ba297514146a16ed3e218494521a1a0c0fbb8ee69962d4864a6114eae6eedcb3ceda1864b2b1d5bdbbe9c6568bd3b4f8d6e2a716879742c7db27ca74ea6ede6e14ead53c776350afe60b72f1d3cdd4c54d2e1e85fa557952e009a052a938183060c0c038fc7387ff66f2a10728f5516bcee5fede4cbeefc5bc9c3bdc6eb856b35e106471bf7ceae8b11567683e737365dd9ca2f2d64a4826b64677429fc4fc758c922180f06888d110a30f410411448c4ec4e8325a32846410c938379af119333efa0c25403f45fcf5e845d0380d1aa3d330997eb239083e3d6e37278ebb2a1ea873c7419dab366bb8beebecf6b7c120186e26d3abcd2b6c7a4d3cd9d5e8366c86a60bd3ab89baaf5746c87c7449c7ac8d1f61e16f58ec35d1867dd8085bc3cad87bee2d3607c12d594072a45614445db30f67da394ebbda399bc16bcf2cbc961d858259764d83f059a63dcb0ea186da0216b0c0706379063796631a363f2745d8fc5a336c863c326c863f44d80c9d0c61336cc5d8dc3c2b2b84cd35089b2510367738cf5686f9c1666c08cf5f9bdf136b331d825b876133e4796173bfd68f0b9ba1139c672bcf56f3e03c5b58153c37d3ed6c06a1aaa3c788745747e36eb67a061a994243f3d34ab35ecf644cc809cf63439af5a6502105cf633ecd8a781e2bd233d166bea33012352b8f5a78cec7a0f9a6f4f0e0f938d4ac8b08785e76c0134208837a055b3ea8ab51ab57f31906cf3b1167a0785024c1870a3f6ac9eef4b3de1c05aedc0e0c6fe7b8d75aa7c0f0e62018731967694d7710099006f7eed472ef2c5c0269500a910069d077f01dbd398a8ebb3908e60e2d646273104c6fb8ab83e1ae3b9d9ec1edf4967756bb2f1675caf26c7b483ea5ab83f3700bcbc5791805238304e1b38c6619cdb22cfbe8306b2da31add688b72a7ef45152a3dfc15e20a9327a7700acf9d6655d3e9e72113fa7a93dd6e4cef9e7557c5837b771ceedded1e04539b6d9619befe7454108cb23b8d4f172201d2a8a69d7a53b105e1b7d9c273b39acd91084fec24fbf2a5242719e836c29411d4c78520f460ee43a0b47009867d982161bc32bfeb40220c02c44115e280e11f8c1218298221ee543c5ece75dfd39018c1fd279b0e5b300213dcbfd12c98e3fe6a0b4560821bb706e11f0c901dd50e8cdd9c0be78f1d8aa116f19cc76870df9881fb32f0aa57d88581c72e33cc8cd0aa22bcde802f08e1238c1348c4d7cdf238070112b113705fb2811b3d667f361eda4c5a2d3bbceaea84007e8abb034407c3da2590881d7b46df977c7613756011268da20e86e3cdf2ceeb3a18be6e8617de3c050f863d050f8ec711a5eae0c841fdd13cb88f230755fe5dfe681eac8361d823189740772296db0e7829b725e0af9d88634798a682c24d47c78df692ea7a45e99665317bf7652f7d643ff0a2e09ceca593a00ea8d15ed1d1488e46da3532d46af2a40f2d4c2110a694524a2194a9d925ce5e76691fd9ec59d703048ffcb40f51cf3c2b3f45575a48f734912ed2468a60fafee923f40dd4336f341a1da7f1a859d4f4ec43a37f41844a2b34d2eda1e69d0bb77c3e9fc808cb532e342e4eaad3cbe9c5e944f1e9af67948831f4a767506339dc6e5c0e379d9bd47540ccf28ca8b587204c0fa1342b0691b1e0cd81870f517a30b8edc0def20c6e0708e22d3dcd6a397d91863e98f6c4418910d833a459d90a30ed187afa4c63fc6d37f66fd3b9f975401ce33a8038bcfce1f224d22f8e1cd41f3b115f87397c04e26698ab83e1f86bf4c3cd977455c7a4932e90b883fed0c6b8b45dafe841f08f6eaa57d45a58d42b3aa21fe1c0418d17fed0ffc2181712f54a7b9db1525367b96944af9244235b7b05a118e999f706227a78a45940f4508910a7874d9a75617ae884aa30cda20f4098b60dbd8c23485444adc02bcda255607a2881449c5262743a3a0ac6cdf5c5cda9d15f6efecd2b1737cb3cc1a3b7b8992665a58b6db15adfb0dc67b777f661212cca9e6caef4269be10fa6d16ee74a366ff7a954ad2fe2b8418dcf1d4e3c9088b5ab554acaae8fde78686a30420df0e892be9dc4681592ecc1e4e904cfcc85558dce428a3f1dd3439ee524db23bec54ad1e2f22d568ad4e3491b89b49148a4fa831a6a9e43e24f9121cdf2d18c4c243708350d2d208947f661f98315356b781659b940f869d6a6daae8ec65bfc894ba29378058a143c351c99e039e393182552c1f3db8894634f12a94c0578de20918e233129f6c4213e59961dd634849b0eed57dc1a109fbad0e5aa7ab4b4b0b05cdb12d9e17dad4353d9d45baccb5d581586510de3eab98ac521dbc3361dd84d275913f7d1b9917ddb0e8a492f91ac8964aa89336bcdc5b65c655327598d6e0d902e2edab3169b84fb6c82e767939ac86d7f53b019f92869d9a946371dd851b701f1a99455f550a91ec4a626bad86743b2f09d55d96783c16790abe72afc256143983d7b4e024ffb6c36895bb2d774ea96caed12934624bb9d236591872ab89e1b3d7b15a88f0b4794e0eda4db9647cbf20804c49d6423d00f2ae939fe34407596abea11cf7296e842ca07d96693d9643669e9d5e892b89bbe2d51cfddeca46d36926c3c121f54733840faf1c3a41b818ef46a6635bd3d7bc9c69e2c76f4892492cd2e5379a7f1f6ec2a4b82d4e55d5812b4787c96d9177bd25bac14416c5a46373bf752f6de0e30badbe3b6c476d2152c778a24ffa9d75b763830fae85ed1f29ad862936c7fdb8ec6db7dafe64f8c40a3edee34263d6e3c4812d76ba1c61e3c5334cf34a3da8b1da54856e2587f5931d96abb1ea91e2d1e5f87f97c59c133fbd070d7ab39799a45bab557b387b491481b895445060e2a89f4ed23fb81b6827348dfac6089392e8b3d14c138f0cbe24a158cd2624ffcc92e33fba20a353bcea55b0e82b7971e7baec59ea3ee73fca9bdaa76abb5d65a6b09b5993e7ad451bf75a89be9cd158f6eee2a98f4d2cd35bb5962d2467a163592cd6dc5745faf48990443b08fb682e961d7bd6ddb5e37fb2208757bd6b076bb5ecdd7740fe15107e1d1bb4acfa462ccfca87e94251e7d34b282bb4ac7609f7f11bbe9e663e76e5ee12931f67c03cf57db547a856118766dce5313f22d57d523c5f2d483d8bcad01f12eaeaa478bb7b4b8538c94a08328546c9264299b647be959f68d23dd1f3b11e7d46fdc47a49b49af1f9da6557f90ae0e8649377d74d3dd89b85ed50e8ab753bc5d2011931e7f26b771366fa4ec359d651f2f4a06b594f6cd420d6adf2c897416abeac1127ffa081a3ad41c7ff03ce92d56d5a3e52e77b952b8c49f663d2bc566022b94410c3653c427b4a08330e92e165a01250c5af8b1a9892cf4526c3ae15aa6953d98678d2115ad1e4e44d1e452a28732e0fca8e0e10ace2f480f5860555f51e661e8c53c2b340f575e03f420e4c53c6c8037e3c5f4d380bb2f44933c0ce1fca00859b596448156cc2043e980032d140a8542a16a7d71f8e205a6a9b4fe8688d7740603252b688242c25d6299ee5780825f1656b0815f16564082491acd674b06be1cf54d19d204d35358039e214768144d4acfb145af0dc0551b8ebdcc4b56e62a7be3d7aa4e6321a66132bd45b5e397f15fc63ba8573f50df89b8f407059c41f0fca080bb7717be5bdb01e0e9eda05e65d0529bd3ddf766d067518336ff988207832088d4e47673ca41703db599e29cac03fb5047a33baddc49d4ab3985e6100882e03cdbf066ccff8802e7273007e0e9bb1e1ef5eea6da9d50af5675821555bb0a29ea1453d43b5bebcd28dafd07a5b4bea64fa7f010a30eaf0e96413b4fa59f4e76068da16adad54eb785a6d62d7e7a763a9dec8fd349d36ecee9ea6007c074ea777430dce96816ea02896fc64943cdfa817a891e8a66d1abe2415f5fe96da25e952e63e3dd6f329088212d4010fc9e0cec39a170424ae921bd2884b0522821a594421a6b1cd68035a0a4b021c494f6e906d2fad33b0bb18683d20e7fb299667fe88020083efd6d3aa4efd4434c3b486fb671718bcb6d891a4cc4a168d63cdd769048279120eed27ba85944bc541aea55a964e36fbba9f1b7e9b4dc9bd175406c63741b27e21585cd4bc6ee2eca66d26dfce10041106ce39dcde9de916c1c4584493bcb76a369da397bd24ed74c1ca79d4ea7f874553c4ed77ebac69d65bb39715cd77d121175a8aeebbaae437556a74375a4a348b74122a1502313c9440212f1e8eed4b06171c0a1e64734e3f33bdc513bb8c377ef6e0eeaea6078e7eec4c9ddccfa108fa257d3c56bc00da788b7dc866db9666be021b4936c1cea84c0c6a7c0efcdd09ebdec69277bfac8c2687a771cd3bb07c15c17838ab946401aa773364b7c1a05b5581927d9197f1bce8c93b69b1a365cd8fcae88db38c9d2f810f661ceea6098bb59c66d5c1d0ca36e66e960983b14cdea767a853a0deedd855f827b0efc3919cfe00b192af78739190712b10c1e19af699966c9f83c14714a224a5620c4c1d0175c52765d27031618e9b856e6035326d4a9e34e59caa6b877a74183ebb8d4bbd41fa691bab4431dde28848a55eaf1248a333264d803d00e54900721ccc0667e16c5990898204a15342802152d0083cdfccca20d2b68b9a00f5f206233df15aa78411e52708331fc646133ef44b3b82b5f127da8b97186790e8cdb58020604e29d7539dc9680f1206a70778ee300f0ce2671f8c36b1a462ba24ae7a1a5e75a7a8c288e6d37a6c3cd643ab5a8bf0d8a9d2335bfd88a413106d103898141108462d42946997620aa579f444433bac9e97053a8e3ac0eb765efec0ceaecc44cf4a4d26fd80cb1ea2d6c6e215c7ad6a13aab42711decba1f1cc7fd08eee6c0537c0411b0d24a8144dcdd0c8fb84022264208ab03fb80e989b03f5a5ee31985f014537881500cffe3c70feeefcde82aca74d26c16411e01ca662948304510dc51fb83e6eea35b9d69651201d1c1f064c39b31af3385de8cf9f766cc560dbb133185109e62085b883825e22496abc3e355011351fad542bd2a1da659364a9f2735990fcbb033a76191388d7d3800566765b3e4f24bf4c5dfd6d11714c32a86d517fb30f682bdbcbcbcbc602f7fdb0da643b503c6837886712e86cd9504630160f3cec4dc81b8322789bb33b16a471087f1206e0e7773543be839ee5218df9918c68d1197f4d3ab492ad2ab09dfa673438f55c15ad82d8d72db7812c5a2d88a42b1750238839af5303d3c8bc23b0aead51cb57a35128a09aa79e69dc65108fec620566c3d07354715540903f3c2829a3dedb54e279386aaa71c2754bb73877fdb12dd73b86b9dc8808f2ec2dd7d42082835cf1651b3b80a8367f6f939946599c9b4ea55ab591c0c679be8d5cc40af9c78c2d4c1ab85617755c1f09282e11505437869ce074eef3ea34c28f3899326734e29e45db542d42b4ee3b8d754d538fb70d581110867f84d3181119c851e34c116bf2cf4a00836c110dce137a504454558e26c34da6eb66745801812a2133091f1070221a159a6c10de7d4a1fec4a4c791527d74d1ea092354277a353f493d565446904005424b481412892484160a8048a747b2ca8d6a4d82139ea1ca8d4641cdcaaa8052d69e5ae11194f020a93ecdcaa4110b2221027bbba9cf344d534214a96aa271a422474848901852731cf590e63328371ddc05123177ed4ea106c04fd57a3593e843cd109384f46a9e0839d4f9378a7354a559f0ce21ce0a21d153a1047a35b1d1a683c29b8e82d7475bc1a73b9181279ac595ba08c397361e5d05ca0f86cfb26cbbe9282de2b82854bb1b91d43c5b304153a8bead340bbe368bb2baacf566d05e75ef6a93ba336a3d1cdb8d119006fc8dec0697658756bb73bbd1ae047a354dd2f4b8ddd4227c852c412b9ea09492083cad1262a45f1517e0f9ecda2e2a814cd39ef580887b544a50841e8130cbae698fdb8d562a5d6aabcd30387b4dd46c967f457e13cd7ab6af63f20dcc1d72770a4949653299ad14d42c237303d27317e711400903c03fce3e655f7a75e448aa572f3707c12f8728549665599665dad3fe4ca7f7652e34142acbb22ccb50d7b4b7d0b4672d36facc85c61d7b79209a7362580a96e079ace3603c73a13ab9509d5aa84e596abb81aaaceb3ad52973e94e590b17aa2cbb2d5ca85a5c642a17aa8c85892510c0bddb6eb8246e0c51801d4a70479d321c96ebb861390dcb6fb09c002c2f19711b238e8d78cd1117c0110fc0111fc93c0999c3c81c8863a4bb0421048cfbc36d2031d3e22dbfab1acfa0942e34937de2d9db7038707a735bc1aa7756f50ed80c71076eb21db0aaeea8865d0703f50e06ea76a8a3de9d3ad451ef4c1deaa8771546873aea1dd7a18e7a57ea5047bddb3ad451efb40c46f6cba7aa2e65b93922c1dde712dc1da709eeae030bdcfd060aee4e230577bf510577274010ee3e800b09ee5e5a82bbdb34c1dd71f79a23b8bb008ce0ee012082bb03e01a82bb8f2e21b87b12577077182bb83b10724842c1dd49527077972ab87b1041b8bb10871714dc6181bbffd00477b74b70f7181209ee6ee308ee8e8411dc7d4612c1dd597208eede2285e0eebf82bbdf5bc1dd57710877afd1010b31edfe84d58930ce010be3dd5d6c3a208671937d58a5ca349842ba819ba906ae2903280cd0b8000d0bd0a071f8e944111528820237a7701145cc09dc4c4323819b652270f30a67cf2b08dc7c9c3d206b2273409609a001331830a3c78c1987971c771720430132122043c6e123e5388e6382882588400011441cbe0f70732a65809b6be57187a0360a5dee13653a718f41360a499ca5c01217e0668a6376dc5c718c1237a7704ccce1213dcdd175c7b9dd7574bfe94ed3fd467702dcee03b846dceea5ee3637535cea8e6faeb8d4bde6e6142e7517c0cd293cea1e809b2b1e7507c0cdf488db7dd43d899b53187b7798db1d889b2996b91916e1eed8ed4eeaee7233c5a48ed45d889b539874d875ffe1e614b6d1ddde5cb18dee316ea6d846771bdd91b839855bba96eeac9b296e6971bbb774ffcd295ca3fbbdb9e21a5d8deed6380c582baa569aa7c0dde1764337fb70ad16fe6ddd6b7ae3b8434bcfc1de6ee87d9c7d78eb3a1d0c6f9c7db8beb3f0dc4d7d4dd3d8fc1b36af708ead1a2d3648d8a894c3668c076be1791a368f7830279487fe5027b485e78b90aad24335655996994e370ef56a46a11883523ca879b65aa32a383e9f094d213c87f224c2f3ddbbbfad53c1bf140edb7214f7ae72b46bd4f8c9d25ed538bdde0c71851cd742bde2aa74152ec5c170359dd1a3e8ed3acabda65156f68abbf5dbc35b8d9f6c0e3cad71b8ed8037437ca3c68fc8a085180bead5c45abd9a581529510e710b6189354dfbf1c79de39e6d1acc8a54a48b2ba8dd65fe678a67178788b66dabf5aa7874afc7e95e8360ced6d10875cee61546bd266e96090ca908c908e9473b1d8f46ef380df399395032e79c52d523a56de6b95650d6821a39f988382eb67a06eee0a7a867e6258f143255785eaa0008cf4bc95198499954246b0116d2ac6c0827658d37637e5e9937633e396a4617c5b029af12dcb2903d0ad0472b8a44218211ec02bf2844e0c144783ede9c5df2b897fd71edc03e8e1c0343170cb9c7da68208d47e79ca7f92cddf7ea8d3b8fe30883179ed253f81c3a877c283147183d0dcc71e3d1989f3768f07c12757e966ea6db9da47bedd6f46a89637895985da8af573989b610f7c391524ae973e89fec55ffba0b1c29f99af3d25ecdf9fc9e4cf9227cb184d1eeac2dcd3eb34b2195f85d4d0554a263e60f4f2abc0c2dd47a3afa24dd51678981c0d75dca4130f688362158d113638c3b788235793965074eb03c3d4cbe709cd41692443b4cb346db63d69ab4126bf60aee1877273847279594e11c6b9792f2884cb276656cb2bdd8873e60527482a31328548288e2951e223f48986011a58a90956671327b14c81e642284af6707205dde7caf6ba3f407f6eda674dfa391b3c39300676fc283b4f1b88ec9ec9bdde2c62332c16eee6e6cb25523d41c97346956c6e3ba9149af80405c045f9cb2831d951e9eb444ebc0d82442e1cd88cf2ef8e0bbae923c092216bd8ad1c99b116564a1e6b804c7c72591098fd65405cfe6bd272f45d6575bd5d598e97a03c6fe629449352baf341a19f5e2d19faddaa1f190300a313ec62ec618637cf34d8150fc7000a9f8e10092c2381eebe1ab26422b8f01a1b87f490b44b5035f3787e23e840fde88200882fb3a7de3776284125a9584104208a194324601477c6181bdedf6a3af03822097e97a769c87fbee6c74a3a36d46d2fcfb8862139bef32c9cf3f0aa394ecd765f313f0067be247f35ca733e6504cffc48fe6c1d8d5a137d2daa99c27aef77673ebd5a7b4675bd5a4ddf34777f78389517e7a7a48fb40b113c5489b3d04e72804c72652441691467a35afeb514a299d73d4166659966559d6d94787e147af8970d4195ee921edd3457d25760fcd096a86577a84c81fcc0bd983c9d0000650c2004cc8c8c49808812c3c22136752a9aadd5cb39bfae142d59e141c6128a9f949718227b652a9181bbee9fb357cc719677c12c05e0fe8248358158f94693b577776582a5da5d2b649b81d420865cb6b835969d4188d2cfd0566257323899a98aa43cdda5bc1d69ad59d06e7908cbb034787da87f9ca305fd745c3854bbb2e7fe579f9a4bc2f360ed070c9b8705e6179771a531f5afcec2a1378fed9a12c1f2326bb54afdeb16bd82376ecfe9038cfeb43065ff707c53e3a0aa64130144dbad0827c1671bc9a7c97258e5f5d95fc8547b8a61f4cec2a20081ae2c8e00d6ae3376506ada016cdcf941f2b60137e537e9860784d00d97b0e6a3381c00bfcc0804509b23094c5142bc0208530a8f0830215da70c20f0a56c802c44114e820a58fecd831d52bd945d1cae8158e12668992225e50b3f4b924d22c213c583ef584a266f1f465ba1feceeee7ebf5a07b66c79a02346b094f7c13da48534cf1071903ed2a7a39088a459f251491ceaf8f3981a2a021a923e3fe0a1e68e43583ef234abe84ab384c41e3c1ced13333a29c55e88a298e089ec914620a4d8ec9143a64f9c894545b1a857f27d1a4da8ef5d257fe42590bcf491f2f2dd11c79611f69ca0e7e7ba5e7a25db4e1f2caf9a53faf44c0c1f59a4594d9af5b650052858166181a504924b24132ca5132ce5132c3faf8e4345cd7a5ba00216583e5e91d28a7cee222c7be2101db01c02cbd35852df33ecc192a657f23f6ca1ca5842cd3039092c1f2304837d9af62af65c37f2b07caf7e5db65253c8a289f6ea8af92bae1300caccbc323232f0abf8deeb4324a0d4fc82e1ea5d715df751fa6ef6f18295e815017ad5e2483d0e32640b6568831d6ee0021ef0c1c685166ad002301cc18a1a5861035f534908913213e35381bc3e73e4e715af3685fecbea40e4c406b3cf468a172d481180227d10b2a1af85252005fda847af5a5e26a2d4e35c7dea4f05f2a94598a0b4d6919d6294021becd44e419fc11ccdb38a8204aebdea24f1ed069f0c40d1ac887bca0c98745f36f3923e50b212e09cfa016a9f7a24d502279e60a209799c88e5117d19bd4262498dbf483ca9f11d6798e8983ea5b5aea2c03626c04c08d5db98220523499e3861094a6cfaa7076138034f9231f8d8f46b2ad61638a84ef49fe833d16fa25f954821616d8a154cf09b624514308429492a4a620caab416671e18a24c9141ad5283158e53883cc1f9399912832b383f2851364c352bd3372bc6f8029c613a62789c8861bfa6a1490735af304faf622c7a33622bc6c421aad036f132ba66d5031c2bb43852ea8382614d730f074caf60f4c18890d166c5f8a29452be1643f66032d3dfc3279b643eeb0c466a87119f6c92fa0c9b41353be9381113a1863a7afc76f30ede3e6dd6f0ec8d477d84d542229bf5a161aa6d3ce6853ef706c131be507b097a7900b8072c8267236d1143a839854d56489209b725e6b75f2f71b5eac054a9df55587abf74ed355db22fbdd25ec41b342da53d85f5b4764383053577a9374323527387b521bd92dacd79f40b3f46621102f46a152b16a3adf49528240e9952aa040d5d5400945ecfca752d69820514d9448c1c4122298556aeb4901e2253544a13785d29a59444f0abf282de508f17f32e25132c42c8fa18d536ed5dd5e69cafe9922c49ae9aae435e73bb417d6e3a37dd75407ce249fdb5fcc15fa54d3bcc8a26899a5387fabb815fa62b977eed24c8a5c79b69252d56ba4481590e9f6a696161e9acbc72f1dc9c4c56567bf1f48abb46e860da6b48af78aef4ea1272f55c3e1791abc865e4fab990c4a22bb89f5b8a2c3a4211ee772a556b2bc10d2361101798a1808a8d04850a2ea810f50298072c05650a4227283a0842eae5a9544dec482d52d8831024440314266190568c523764fe92a23041e037c547093e38e084a004c71c592882131b9b4765ae54f878391a8d2e7cd2ab087be0104804b3b0083482e965296e0bdba77dba884c1caa922864af33993b542733aa7e109bd1e3a38833aa86a26764214ff6243d484fa24ac0e8da7b8cae8deee8d995e2c5c79878d27d36a38fee8b3115a261086df0810d78a0e0e1b19149028484e5b3cc01e61b08c41f78afdbcdabc1829a1f111471c6891a2ba85185fd61ec7a44b0078a28aef95e1312e855fc0c25d4fca0b850c9a5b32f1a2ba2116ea8220ab87153238230ac7b9171a3053c56b0c29416bc8105535c30852955b4c08839a45ea0dca0f50de31794c84a67b9b9e5358d3ae1534b0bcb3516ab9df492fd800cced14e7af66a54ec32c334b8e190aeddf439e79d6fb914c3dee9730a54ead2ba3c63a259d76af5a752f53abc069896895e5d7f91853a2f13bd1ac2b2873aa4fb75d8e4f40bb5fdf5f6b7f570b9aa1e523e888d4c8cb9aeaa477ceaa92bc5480c47c4e0061b29e2a770918315233649500f62b38a31d75d6c92c9f2969b9f106ef9c49e614e609a8f314a6b9d3773e7c2f459db1cf1bc6a0754ed90189e98de96ac310db3f9e2f9969616f8625a0edff2167b3a8bcd3e9e10103670437d5a20300af518bcc241a05ed3b53e1163ae43fb44ac7f1c0cca9eacf69a38aa3653cee62a84af9abe3e645880f00520e0f9910f193c3f9a973697f60ad2261436e9197882561528d4c22d7c050d516c0e6956a621e2735d7346d9a463aebfebd12681879a61131c859a9f940ce344b3b20f991e4d34eb2f756b8cb9665c6e2ac614c55ff23ca7ee623005364cd1c192e8e425d18382689344b503c74b4d60869610911e13d8bcc31c920a9843a302e668a122baa05e7f78d4c26f0a0c986019819a959f951d20292e21f1a7596fca0b96e0ebf148b322be1ec585c4901a71a46c789bc091a4dee855bc84390c8e8739ae843f78338080af43816609f87aae81af22e00be8cdb85e0451c5e2a1901ed2cd04c75fd89d10b95ebc0e879a0a840244d44284ae4458055f7f7dbd4c5e97dbcd83395254e0276f864c70ac699a29d47c1d12132da58bb491ee23bd02a236ce5ca9f704ff3a04ead5f583afa8e47a64723dfe5c8f40d7bb27ce40241d737d096d52b100eaeb58bc97cf15a3132d080a4c9838c1f3aa2b955424c64cfa11a490d251ab07af55d4830e556bad2423289b493f58cb41b0111067f0d5ca3812968650d0450543eede7bfae2bea8f5052f28352891410d1e4c067b9e4dc4d7ed211dab7833666c10d597d58d66bd2871b8e2d33e710003ce5a14a222381f472192cf323493956315459a95bb8748b33035606904fb60096d26eee103ceb467c62a1e0e3bb1ec7933a40d1bd4b782af6dde86237f6450f660241080208d214a1b08e680543c1af2d2040d04994526e01d7808a11099a7b820cf9b216fc306357bee789e949e699e87e3bacc2eb1ff5891b2475601ff80984a08d431f294d69a92e7de8c76adf4ec82e5730c2c85c83466b0140096552855badd8b65f08da49f934c436f5e1541692cb46d07c3f30798f70a1268cf9ac82e4512edd9db7a68f7c518ece62730bc813e5233faf0c1090e3b747c52ca922ae27e30c65852ed90b8af24830fca13a02342785a559a302942c40a51142848807a8404b59c343152a4c88a94283232862e22f0300a142440b2470a096a39695264454a1425487a48f7080561e104fe4023578ae083b154870aef71d4a1be1b572f6250f38d1bbd7adf11835fc4e08a32ca5892992f367695543b26bca52564f311bf66716f1c76a81da32c61d9a5cd3e69cd114f99e30948231e471daae9529181125c1bced3d327600e98fa64bb5d4f61600e02401a25096397f214b85e1f6f4684a2579100a4c7d468447a58348631832afff06b56761f69c8070cc6ae59158f8ab157ec33ad002f43ba4346c535937dce6c543eb342b2672f9b9abc3985654e6d9ff67a6b7093af81e9372b8325fde8d733badd5c94e248a973d60ed290d76ccbab219f599757838e2ea5dad58ab2acc214c44d0786278697be193778f093911c37b16be6c8e21debbad6037a79114ac522f8e5c8a2230500920aafb5f0e3b6eda63e0b6ec379a9a61386e31fbc2fa8f1f56a85512794a9a2b8120a854295e05f22ec7ab2072379c01fd767c088bbef8f0b8947037e278573bc19526bcb23ce8bc4db71f188f8c2f3ba2ecd9b01258434ac8793f80015885480c5952c0cb1e00350a0021d5a3f5852022a6ce06b840fbbf91565a88d20b49265105ee9d58398646151afde5fda50b38bf78b23a576f6a175139e94d977b4d31ff23b915e78faecd9fa32867ab50b24e2faee538101910f1518f00089b8de6a7fd45a5f6f8ea4f88dfeb67c036b9af692cd4170a9f49aaeb51e677b7d102c6df667b314b857f2bda683e06704a4a15dda58b2f2f58a641f1e01699c132fafbc8410e52ac6c44bd483d8d4eea8f7e88e42bdab2cef8c10e9558c3f94764f9c3d38f6c02191a5c5e53915d362df8b6191549aa5b9a4cef24c675a8e3d65a14bcb7d1da36939f5dab3a89d3693c964323d08aed5a495b8ca95b4d7c42d6a5aa41267581e5b9ee947292671a67b4ca5522eb78506c7ecd2b0dceb4fd817636828151c8732bc922b8ea24b42cd97c68e1dbb49332882a9f618a3e358cb5d6e96c12e6f22ce40a018235367f97bf12036a83f55025efee23d5efee205eade1e2f8ff118578a187fb92f43d2ab9584422aa8ade488ccba88ec1692963e7206cfe625cbb222180a352bc397cb432b3df3cea749da5f6c143146e6a0de3deb770d4fa7d3711e3e5d1c2fd407c128dba7aead0b5593400956d99d0bbbb872069046f79ad8c24224bd92ddbde2e5350da9c418f9171602c59997db4444c553dcb6d4cd74dbfe449c6922c64896bb60ea425d8e7279bb1cdebcc22ea7af892ed6f49626e2cce315305ed3d9c976cfde86823e64f0e9a67736a37ebadda1853eb008fc81404a98141109b55eeb091115411ed863ed7bd23234f93d79511e1599d5ef63dc1ebf5c6bed7b316deafa7dcafdb444d489b8af8e00e00bab448c91d7870c06725d40f802109ce0be39dceb4fcf1c8c4b1363648f97bff88b2b4512786b98b07934384320ed09499ca110bc82e54736c3e00c8568ba1f54f92cd31d25d526fa83a53ddc746e4a31fe369d1b158c3ff970ac643c1c4d48c0890ccc78f4880a80f760522f2a4bde28517d45d79b993c4ff48bd298c47365089671482289dec004e7169a12072b451209159ca390d883e52936b22eae3dd3c9337bec14c283996ca637e117f1fd56b59cfb0ba593670a993dcd7ad7856114c61968d32d600b2b9770b9d6abd186d33caecf1e21382dac70020d5c2003952324610a1324e4e0861358d1021f371001c58262d9ec8310b668813ab42ca878d3cf64e4895062141ba5f4cac53e1c65ce39678bd5de0c78ce645f0a05754e9e140a6acbc5e5332954aa7490e9b2e5f2592afbe8708e6a471fc74b5dd88753b671b40f3f08fbe376d3e2591c8d46c7b93ea21cc65d780648e36f9be112fc539ba1c07f4dbc35bd856db9af572ee6102c2f4f8b174439420483156471c590156ce45b28ced0c083101820e1c80eae706223df51e49b8afc914844041b81df94389401675283612f244ae4636d29316c5399b6ab74cbda0e6aa11e92524a26a4228a6abcaeed66fbb5e9dc94ae0362ee26d575406c7a4d67cf1eaac5a5e55d6d71e1c2452ad51fc587a34d7dd4a2458bbfeda6c56b7af2d8798add520ce3308a5915c5308cd2d29c13c34a2fc5b0b55732d5ac487a46b25daf248e52a783bad5564ab3644be92abd6a2add146b294d659382a360a678d323d658476c7473fa1463aa9348315ed5b10b246295bd825ed84bc85e433c71e682d223455e4884966044f212d231f2439e108982a59441184f9c9158c821202b4aae3081d223c5a70a56048910967f524a2985442c3a46de08152251b01cf2040a95413f43405309962a1b87d80eea957c0bdb546c4be995bc8bed2abd926fb1ddea95d050afe451f227db45261b7ba24f2cd958a4a39178a463e49ba4a444826547e9959c466a7c26c5104cba3e7a3c522546acf3cce9eb231ec11d47ef1cd2014837a76f8e6a473cee3b7b2e9e4268f0a03ef5837a9e38d3515e8c3ca595c71481121cc14f0a0f7c70cb88b32092f48c74553cae938e739d7483e08652e42670d3180447bbd3985e0a401a32f09cf7f52a5e1406ac01842c933439be50af9b97a79132ad9638d44371a713aaeb6aaa4bbd54cab2dd4898aea6bad44bcd727ca1f633f81060f8b416db4d8a7b5deaa5a65f724c7901234677e7f8427df66ead8d01e3c58bca5adbc2d2596b51f664b2d65a0b2f83e17d5d5482fb530650fdc0a382fde16843cd147b38304bff9b6d864518474a854538bfc7a0a1e6a682bba9e890c1f4cd682cfb8045577b309e207b71c638e38c71c6d81794878594120046aa7c4d9432475e7e5e158f0b763c725127b8df45cdba12797ea844a94f806a7d32d3402908674cdbe16f3c89313ea210fcae440274e4c748111a7b70f7bb5adb0aeeac2b8655db414fe20c057a02f4e487b357d1034a017503c5259b8d3e91c8929ea1310628ce34506c024481709f6471a454381a1dbeaf582149b077ee7e0f756bf6c49928a563fa558ac4a11f2bbf327b84c8d92305f7ab0415c1439850ec37c188b0220ce5499c79ddbf90b4f0112a4630202bb86788934b08932b4a867e828ae02a3eb82fad15dc9f4271097e0205e3c1a2a8091192d691dc2dea846b8e4a8643a8669aead56b08ffdecbf1118f601ff1089e98145530c5b1860a9f65e07e4d04d2384b8177da473c827d1ecb3ee211ac4395030f2f0f6f8e6a877cbc7633af205d46b4578c28e93e99d6c3b4a35f76fecaaee7642543f3182fec3e869691de45adfcc8ca3f9c797a7d64e79f9552caefcc394f73b0c7eb4e7cf1800a9525a6f0a035e5480f133bb0814786e2d57bc300f7142baae0bed653acd0028641c81e4c921f0dd8889264b10426f89cc698a6b83ee0c913197fe5ebcab9def4761d237fe5bce2658c523e779776372fe5bc7854e004f906c2c7f3d7d5ef9b49973ce4a5f97d47c7ec0ec45836b2d8638cf339f106be96b0d75f749263e0985d1e6b3ed6fa788c1b5d371e7bd31171bc2f7aaabcf6acdd88567bcdf50e3c1c52757ae95375ba3c56f8f4d395d1abeda6eb264b7bb57dfb7b70c2d388e90f88ed0f88b356ba1aa5f22dbbaf9cbe644b79695fc8705dd7f59abee4bcaeebba2ed22fd28561984631ace63f54a1c2cbd042d560a30da8c4ab15f6a91e868a6664040000008314002028100a074442b1603c2006c93cf714000c92a64a644c1789b4248951ca18638c0100106200008c8008cccc34009d6bdffadcac62c77887b60f1eb15fa03d7ac133f62f38eda8ee5ff20b743e84d7359b99280ac89794c70e31f805e7148ad7b374895bf9724d8c2cbc8da9340006a84b6f63908f7033e68d100a9c00baf7a80a1970efaa9afb5070323857d9cd70e4d2401ebdbce39a716acd2fa4a9523432495728899bdb9b1df2cd64227b1feb6dacbb0c1ef4e7d8afe1e066c9bb9e06bb58641810faa7a73fb48143760bd1e2a51a96ff69dc28358a277152b342b39926f7fd557314374566549799d86cadbcbc2773ba374d5ccd6ee4ef288c1140d85785f48b743cdd6d206595d3b14837f11cb7f5a6cb6e176f07de044f34013a82531dc57822551c61572bdc141b6778f363922eb70987ece0a55d65310ccdbe0c6672220e3999fbc5641043cdd05a0d0e46166399211beaa31c1a50210bd284e4c557575b573866c2d2ea85f9f48a10dcbb4581cf2d6cdc0808bfb6ee8159b08f738190eb37698324d53a7a4d39b6d4154e34d41a0cc4b940b0fdb9d8e8d09315afac7d76863e006cdbda41ea2b54f910f5b2889dac0d8d821fc5b82b5702b8b0b40286fd1fe57b8f633e024ff99ad2e092d7c50040a752e95128b8b2a15d2c0e6b70316b716e8c3bfa1c541cbc2afc6e5e287a31bc8f6c10e8131c8907c49c48914aaaceb50354a1611b7f903dd0f6f7d6f2f6074cea688fa7823ca77a8fb2f0e79abb30fddd5534482f3bfeb6c12bb044765349f8c36131f67566d6db947111686d108d1a3faebdad09027377ee7770188250d3b780fd76ea2bb89080f7fadbcafdc4eb1f7c519f0d5c83fb3780ff4a292160b81d2de1a07ecdc5948265bdde47264fdbecfeedbb61bfe7a2bb4baac85f40f6cd0dc5f8e6ac67b835d5988536d8b95e1aaa86cf0cb9bf56447793cdd10728669a2387ef924dedb3f64106a393bdc7a040fbeec00cd36d616b6ee8db2f8067ab8376bc929293d9cffccb53601ad7a0bf0166b14d16c1bd008ac999fe8300266b6e6a3eff94c3d6e1625f12bc060aad834efa6bfec77d828988856a530b66dfde53022e25e05c095c2bc2b562385406374ae0a0385c94875379b8570a574ae0a204aea7185a81a11911045ce2b6628ecaf2377c6ae2aefa54585fd03f7a9612d4c6fa1de1b4fbb5efa86ef3b3f2a156a891593498c5ff83643d518ca914a5085c2bc3b972b8e7812aa261561acf4a8e5cd1e674567923074b5be6e447dec84fdec11e3f99b04116506b524ce6df2a7477f09d0ce2342ef4d9a95efca0919db1ebd89cd5983bd0fe25a03b3cc3939ce57ddcd9d2cd05da9b706cfe7ae841f0a9c5e26aabe42fa272df86370875d5ac06be477b764a5dd025805249f81492a76e5f3bf20d05256b27487b35e5fe8a5b43f79685b4bdac4b724b1dd9a87cadef408b70b68ad275edb9121f74111b24322d753ae4648b5966f9a5b6c560778d227f56eab921e1fd9a93581c97e91fa2100a5de0e91284dc8bec01d587aecda6fbfd98edcb1a54fdeb06ecb42afa2844b6380680e4906c2e5b7b1aea7c1f97174854e5251c3c12670b595396265bc2e2428bcb3d8a65035ce5e2c4b7f7f15d5153a34d818fc1df73f202115fd40c6a44d5b2053acb80953c541a2d1f4051d849a38b29929071d1b177cc83ded915ede02fe50fe24279ae49c3e95ea762bbc51a7c4f38872360df63140da3abd034ee2177f19bccca54b7667b1af48eb869379cf62a112112fea05f1f83c681f8c5ef4e9ea8e71d677b4c6b26f89ed025cd693ff303124d0b7581e6858f9e6d358e0ab1bfe744ac0c4e141d17c056d3cef31e91ad348b0f0c52142a5d03ea4cf63e9d2cf4069bca4757ba571bce9ed6119fe29df8aaa46d234ed4ab8dc413d1f7b34f6c625e3c1ee73b9f54f9258f5bf219f0904e67c9e6a9cff4d299e8442c37c7000f984a0b9c4bfeca006ddf61bb45d920999c3419e8c3cd3ccda09f3fb4c687277171c70a57e5d4f1e44b2cc4812951917267a94b35463e265235ca91033c18eff530790e0733f097c28a5a392e05000bcec3e2f815e37714bc4d14d64f6f60df57432539b4d0dae176af95c0d63e50dcecf7ea90afea42c916b80a36999e6ab7196084152ea6d83c5028dfe29a65aaf1e855079c41438111af2e50eca769f4639703a2a5e9aa0980786ce4933454de19b1e23ecc020ad36d60019c6787e4f064c4cb38cc06e7aaa9a2fc2f782b6a61f7aa26b3ae82b1d0dd87b6924e319771d8bdacb57b443a5f8f27821e2db8b47c91095b90e580c31b7b25affdeaffb2a6de0e7a7241aad7d73314d2975a7b0cbb09e99a8a564fe83bb4915e1cbdeae5d6f537a658d323516d8dea6f4362fd07d5c604e0a60be582c6c796f58829f9002ae502b4f10544b0fac5bffc1abcc3d2ac89f5b0ec0307cfcc163c88648fcd2a7506763d3534df1700f0f3aecd2c58d276ee8eda61227f50429c091e955f33870658392051918b8218b6c3162061be2aa3acdf7d4e72c11a091811963754bf0157fc4d7ae1686ced35f838d582a852ecd628a5e5009f723f02aff318283255c070ad9482d2515f1ce4936f00d50ee566bb5aa52261a236ceff3629ec4ea69289486abdb406ee714408579d2ae43499c1b33b3f3a6611254dd2780eac3846be2e7a04fe0c1557603613478c0e415f4de95206639a1f797095bfca0affd9273602d3ca428cc0e0d54ecca04fedfe6c421107d7176be410b49e89c55e89c6d0c6e7817cb750f7fa91e894089d4f8b29d5d58645e01db3b474e7ee56b80908b1410176c43c1ec519a90b26de2dd74474d0667c35f519190a94bdf7338fa76c5981b64bcaafb0235d276df6cae5c9d2c5414e97e1dab6fd080f85535b2ec6e8320b1d8801991fea30c30cdb0c2e26d1cc2a779d9cae95fbada1b5b0194c30359d04cc951ddcf26c7f2db9d073ea19cbfed8cb10f91930cafad29cd3e0994c11c3ec7577ec63dc09cf532461a073aefce884e0b126d6a6cc8d5a3bdf18eb0bedfc47e6a5138ae33b7ac0cfc1c46fc76809ea101cdca8d14938b428e0ae09159f49bb7b9a33e38321e5d4214a9b4db5730af3b429762006ad1f8da0cc9d224c72814718a95a45271333a5940ccd0d66afbd891dba528e34bf4a59a3a64e11cb9cbf02a4b453011486c094caa9bb744b30481c6c525d89dad27936aca5632cd9659ad2299cc16ab5e23ea39ed20ebbfacece05a4ac19ee2ec425df1896e350ee2478c316b6e12f2d0c879770a50b77938bc978c9c8c01316ef86da78f7ea13fe40abe9a6b361c9538ac4191f92402900ba523bb1412e56347c3169338869840f9974c1dde4c4a899204aa830f800a80980d7f6950ad19e018c4c99240f4dc72834d1fd50701a652acb512dfe9d7943f2bac5aa58a0d6ce5ac4c1eeb31d0518026ed572060eadbfa904816d1025b9cb7d0e2b0135e5622f252ae7f1e48f02607755eca413ffe609cc49decd5642453fc23f5cb35e3cb689b692caa1a80b4a9de244209cfdeae4e023c5766963ff1cec1a7187d5a414371c18fc574ed0e970f3664d0dfeb6e214ca1f5e2414f7df6eff9f7700622a50af463e83ad29352d5eb280c2f96f1675a30eacfc1f0cff17294988d5948829e18656be0c9aa1c76de6516a2c49d33fb45e815567d2a18f3a3568e62182bdb90a7de77d5bd6266ab6dc868503771487871af7bcc3761344a55d86ce04802937f6d274d2cbae336ed3b21114fd7c8d98a07df3b9568751feea48705dcd618c6020065485573b693002c63567334e9c3be87f7ee48d32ea6f220dd70ae85fb8deb7311131031c67402c8da1e2a168a018d0667cb151cf9186c1e990f8257a15da798850fd13dabd46b6f35611bb5baabccfbf54671bedb80551a192e816574df2592bef1b91bc54ee4dd466a867fa49766955f393bd921dfb457c104dd6097cb1a158a7e62b028725a4e98eaca6fe1276eaaa909add6fd9409114dbe4cdb077adfbefe240b36836c2c099eeac92ffcd990d85282444e07cfd82693ef28b31006ffa774af325524691d3f5b297e93c6d073df8a92427e3574b6587fe135a5f697bd544b2ccca84cd7c03d8a25ac13fd91f8ced78f2f97a35010c4afeb66210ce38f02d5f76896cd6d2cf4a7e7e43d94e062071313064c252254c12aa20c9182514021eb441a5f37c91971cd8836e7b0c0afe76d202e718bc2039e5eb243fd266bfee8482d91905b10f9969095622a5443986b66989b3492eb155c2fdea568ec374c5443c033f68222728eaa4957df7fe0e312ed6375ae19a3a19565451c7fbaf12e5c8d1601bd9eca21e2d350a0eb098166b4c0bb49b100a9289dc11aed09ba3000c86d8e351fec5f3f811726ba8d800eb4bafbb68d17c3c2436623b24342f663689124c7ac0655a89ace0ac6a9d2fe23df58cbc240e1d5c3df3909672f0b28b4dcce94c6302e20dbe8a3f4c866fd0979c2584c50893a819cf0be27a328d4240132e2925c34c4af7b8db286d42c2054adf54c6d09e37d761c7e8cb49f70685af54491bb22a3f4796967c6e73d2c63d93cf14a2c42e2fc647816d9f65c90e487229f1770901c0fa3e24a1888dd380e6f057b85ebd2f4a8250e045cf91583803223f1a250b759d8c264ffe24f8d0a5802045bf19dffc8946631e47227f1180dcdbe4edec106f0df6b68c669c264ef0ee742f912c3161b431b60c53b72fe1d15b9d242da59437b09b23304bfc98fdbaf91487698bf2c0d3b4cc7caf0820cb41f1ed43d71cc0ebd86fa79889e6208a9679aba130636b075de2040bbfa6f2d9dcef25d8538ca72484a07349188d1801ac7b4cfb529dd475b51711a0d516176d003005f9fcd894ab54f47b7945579c3f0bccae006c4f6198882bc107d358d0f56aac1d0a8f24ebaca93e6fbbb80d4d8d1ac4dbfcd253bafff8ac02e0c1ebc019d3dd4066387608bd70909b4c6ca292fa7dca87f7262b398c185e9cdd890c2951200e1b0b8741d7270f52a8817d7fb3f0d54aa47dfb2b017f09119d5acaefa85fe136f3aa20cb7605f8952ecd34a2ee4d6d3f401986b016f126bf0c39152e5ecdf018b23f80f0c868561a8e55061a8be01a2dec79dc0964d7e8f88af20300eabc8a4fe3d7603d1508e0d04503c3f7b00b6f96ee4d52c95d7c2efa2daa0f19463c9c8404761ea309771fb83aad84a418b8961f4c2010d98c235c403f1a6aa26364af665e99cf287828387bd82233f683c90a0b465e1f7d048abc095b63652773c826f0b03267059ebd530a1246f29d87cac44c88c01989583824c4489654672c12a9b29d5119a051512606307f7cec9e6194138f8a3acbb63801277ee4bb6e5e4770b1e16cce46cda92d794635f4aee66a1ecb83fd5dcda6853f38bdab79d0739d887347135f3ee38419d932555a9ec8db3942df79d22f2dbe8cd641a6492a92c546f2f4a539c63f707f7fab4685afbabacf770e7fd138bf26cde5b30f6589646478a6b93c56d8e7eb0c6c9c9907aad7c4f7dbfb9d93f25d9044e150a62e1533450bc6741ae73db387a1b3b30610bf4ee68cd3ac054e38df85f7bd96560b79dd1e31dce3d9ae0322eab34aafcc7017466f3375b8a9b7287c09c6a9f8e09a324ad0e650a6e0cfa2602e613ef10aba2b12497381771f476049e7b24a7d5b6493582c2b0df8410de6cf7d4a98517cb400aabf2f303d27a6c16200228ecb58ff7fb9bb53e34bb3b85169cf0fa830cc0e234c37384998362fc647ce34a6d37fe12808a4656c4c10ef42c1a001b020b0dc77a4ab23a4ba2b1f662c27e025db1e6a5d0a3c73f30ddbe358cef994d2c53c10828d3a23ab6c7d440e10afd395f242b1af006de3f39dad021240e6aadc0a8f17deb80872951535e645c5642a03d30df449ba772a0d44473a19fcd68ec8912949009cc869405e0728e5796f0a9129a62467ea0af3be456a56f604809e6c93607fb1b7bfac4f64133fb539cb93c8f21c341addbe8c40546e5dc8b645eea6df58e4c810faa54621f95bba09450e5e4549a046260d636955eae2b52ccb96a4bc07ef120373fd00d22a62e331d5942a4286727236e29acd34f3f148a77511afded24f6666f47b37eb6efaa7aaa44d5397005ff4474154984e5db4724c95ffb4bf617d6f50dc06e836428dc8b34143026ff3134bbcd64a4ce69af4603ff0afff2c85fec658462b752335cbf3e88e21fe26a9952af9f20cedbf315a82fddb1dcf8208abd18265634ecc7b71da38cba5953daf0fa07a8d77d6af8becfb899026efc99d000e64d21809b967499f08ead92729149169c5bacfca1e7b5099791978318d25338b3cc6bd3f32e7f414de4a264caeb893820f44d1a870d1a13d1662825bf4ece6aa273756ecff33f496d05c84ee46e3a22a74cbf1514e9b338c230f395c6ff020286e79f4ac65b34e698e31741b880f978df53bdbbae50db67b4d8a47d03e8809b9033bc6e77629384c80c43d34deb627ef4e0a0fe023d0a25eec027aa18f8a7c94a4eb7f76e9ad5273e59fcc0389fe732a6811c71d5a76d1a570d09aad5c6b04ddffd9c2447870e98ddee1f35868ff782f80d238a1fb29f15f7e0cd4250287b0454740199565e8de3897ec2a73d497438f43f53cb8a397f8a6a780560fc76ab74d2abc2f9951b2c15ed767dfaecb70ebdabf225846d2c07e22a3de0e9b0d1bceb3b08799ec21a335570ba4965c2eb7b8b242082404c4fd353b4e852f92138ceb3e0e7d84772de995552caa00ba42ee4f3f5a1d14fd0c8feb5686a99a810dc4b252e68dda498d75ed8e338c6b072f4627f1b9b85025528c6c438b4a589cdda2cd687905dd2ceaaac387a36d8e88861581c4d6e8286d9b0ffb2275c78cf87969382291efe5eef88d8422b1d75cd0d6a65fa2e9c100a4c9e42809e48d67f50b783d64fa0ac2a65f33d3ca0a8f0c42d68a60c11de59523e5064fe704627b752bd9f3f4f91cb297a3e9a6b6264e363e0a2575d2cb71ddeb4a552894103a1819c468769727eacce05f40d2b3b6a00363a1b883935f2244792243611abfcc0b8ab0c99ebf9bfe2ea7a718229efb554d215e2908e3002f171d84612860dec2bb8854a5e7467e7c9b184e8987b34c8a3cb9cc17aaec4b47940fa71db5f50090599810982ea65b32416461e2447820417ac2be29e31da4b17ff36a6961a2dcc04faac7942b093d71325d2dd3aabf94f1a26707bd0d6dad475fb886cf46459720b6943d6c01f31deaf97a32b2e5270491ba1cb20a3cd383a57fd0359e009a0c950e682c6f61d8ba926207fa54276d0d1295823811d2fd69793bdd2598242d99448ddb971eccf03237abd5aa004de1f361427336d90a64154a911351cafdefef2d4ae70676d32faeef9ae8e7079b0b0ea074739633cf3eae19ae94adc4b10c436fa22cf60a99e8edfda6f63b2eded0905994ba0c96e580e304fe819a29a5dbdf7483950a3d2a165c14c8b8ba20c917cc29ef0d98bd88fe5226274a0194f0a39892a0fe79c1b94bf29cc1dff8d0ec876be2624a9f7dac290f40b31d57a3b0c4534934e84593794d23dbc643df81817d57f80426248b6ed479adef71f72cda1719db4b6bc9cdb90cf10fe0dd8dd6dd521b62a08ab5c421950a7c2011c85d283bfff30efa887ecf726d3cc5a86f0eb0e80d51be6dab583c54228547986f021147062bfde1498738de95951ba04d6872365e56b4ab91cba0e783aabc8318ef63c54daebaa8d2f836349f8d7c6a3a3e3b02e00b9822aa24c16244c58cd9ce60868f1cbdb309a00a6b249d9d9200269e60ff611183e4773947c6e20f25f94896fe42e3c75b61925c6d178c00041232caf10ff8455694f809e08e8bcb9c63fc10b82a5609a93c45fc22205a57994c96fe501ef9301407263a6b12aefd91a32034392206619cc2946596519a7bb1a693a0299146c893e8f40265653943e19e3da3d8d39fed21de572b2358f0a76f420cfd343687355372eafd64af7850170f18e17ff215bfed46077e9472b5ce2bda706c0d5ad8815af0675b75353bef0ce4c6347f7fb79fd62596b163ab241219179baf0900fef6307e09891c8b4b073ca0368fa8ba0b473569a9e34e614244157e40be5dc1d66c8bf2263ee71d13edc571c0dc7f8550912fb3899763961e8f3d2eead04915105b24502cbfbf1920aa914a29ef31aa2d8bc72fe68eae337d4eeedf58907d3350140f0b326f596e6b95b43fea4381c1c4d9bd1a2a6db6a73530da61f17c456f15ce4b6e8131eb2fd84a5dd12feda65ba3055e30ab56bb5270ae3182c935715f435a4217fafffe0a542fbe823db0a051b6922c9d920444a828d63735ca47b82a20fa3f34b5b3942f8a2f8d7befef23ed2dfc6d56f3febcfb23f9aa26f58cd7d7e9be0dadd58a8c63d6e31d6c664a289db02e5adc4c563e4ef08b99cee1549e64be0885d17d6748f86658224fd4ab3d742e3325bf05b3cb0a5a69c4ac62af5dd5bb50e04b1d0e9398ea26d312d446369d37dd1414d0f4ed0912d1e00cd7812702ecf2ec65a18298f351bc9858c73dd091f1b390087811d9896884f40fb81088beebd4f3c9ff744186b7f8dd19810e9991a415792e6d2360dce9d138330d5d2c21f4e21785cc7b839e7f77f01e2a0c589747250c81450d59fcf615c7ece88dc0861a3093d4d418cb1e1c00cc1e7330ec4ffa8460c7a050cf2aca72ceeda21aa3f24e37a407aa1f3608208b4f5b484706d21e60ad03b5722b46e1b86a0b03163e94258a5e9c8144a05e518e84b6750a238f4a1c784ae51d33d02dd547354d1629503d9d22f1d81d78c684052d2ef544fed439cde8fad0e68f1a20b35969a7cc0cf7c4a0353ba99fba69b20c22f2fc136fb2adb004520164d648bfb0ad2860869f20e72858c5358cf31647fdd832f3296fc36145a49822f3d938c786a96365901a04a1c9745b06fef1d0f21e1115967e0a32a3ba5eeec1a87cbc868ab0090bf7e002e8408d00d2f42d5eea99cad60cf8fb3da1ba3ec38ed99d07e92136f66680117c33a66ebcc232adf6d7d62b6e36e11a4d88afbf155aa7d8a8fdc5efb10fb5fbf3685193f0e9854a8002a6d030ddd179bc27696914ca134bcb05d8fcc675771dfd1881d640775e43cc31931af75d1d64f1816b9d1cf0ddb543339b8b9b8e5cde9812e3c30d0f33124f3f7af9f8a60266c540053c7d22072008b08c5bae78f1508fc3534ff7dfe2b36556af0e8c8bf420f012773ced6eb6bf39be1ca8678654d4883c208fa2890ae403c0347c56e130fe71d0752d691d9ba867cba177b3b1c8acd8da253a3f63413b79e3b080102fbe015b28c2628ba2db59fdf2e601bb336a600dbf14eb52420a5774b9cca5f626946bf59137774a31bf7ff794532f2456030398322b910edcb4e5b1951cd0ef8de47309cfe0945cf7fa29c10ed79ce892f4108c4bf0d9e8eb78e594099351454199935a675ccee9de12f9e103f1b33c426e6cef40f05f57c51a1f5ea1e3e1ea30a037c495210228f387da226a4de82eefd3278f4ffed6ed25ad394430ce47b4987b9c7672debf2ac7c10aadd23be06395c4e76c26dcd287956894a09466b00a77f845f9058900690c4cea8b9d213b634f7c489e973fad4b8ebab7b09e080f8d3d44ddd138fdd6732ef43a5fdd6917497cef3440078e318625be5b234d1022254665d3bf2145df0eefe91c4abfd089c0094a7b727ac6c426465f8c56be409fa47361d760bde1805adf8fc9868e8377f58c1260e56bc23b185e3983b0980b40e5a9f7508e51c59e44683878c54d7f2a08ab3c2c10fc2f77a44a3e8f7ada60b7503f7a841bbcf03f28921d5d8e8d1d9de5e05815dd079859bbc5b9a13600ff25e21b6ad203964dde32aa8668726ac6d98335e3e23208d2a832522d386d6b80865a0a3c0100d90e57c094bd01ab13f1c867409a50a35499fe814c0df95adfaa493063f42835ec5377127ed01c91afb279f4c3ced0eca7ec9379f16289cb67941c802292fda496cac20f7eca1588c2e5fdce64e61557118a5ec97a29d936318cf3816bc963019965bee46d8d64723da44d14446283d5d590b1f90d4438ab1fcb69c1b34116e9aca297f8291f1ee05641a63e407f7ca5114b1ee6995347f457d5caa8370335a9183afcc26e94c69bb9ce3ac6a5c92c8021f6636400da97fc094750c20df04364d030e0e5db290d8d92fa85fa29509cce30f4f25a8d156405d54d39df90db5b94adbb643d67540aaeacab4967dde23dadb355be29edef86618ae0bc476c599f8cab868971fa6ae31f82058a893f2063576371d6abbae4e9da256a859de425b8bbc05c3176c6584260b7883af9e3125ed37db82e76be483e88484af41765c4c8bf4d7e2f302e051baeeac12976595a459f95a03d0e784df2ba661c0e4b508dfea38403d29890e12fd219a62b1d34a19087e00884fdfcc4abfba6b87dafab763ce5eb963ed3cfb13100e70cb881c503f34238b4ad3282cdb96094903bc576a19ddbbfc64c8b5a01573df9a5215542322ac914090c31d01e44c582ba64ec2518e7dd9c43b1290a5c7cda2c5473f4db2443fd1194ab87d751a6fbb40a94979a419198290c552aba067a709012c953956072d3b93c23c59f1ab47cf919e57a77d53795411f01ad5a461722a19a62cb63fbaefa864b88c60e6a19ccac5ccd4de32048d6fb99489504a05367ff4b4519d2574ca1978106685824f06063596519ed9f532d2b022346f6739d6850dcc945cf400d90f3a77c3c4dd58bcb12a2c0083a5eba81821cb2a1309e02d30701fd8e1cf5617df9e3e66a89897c2db2c56f6362a5a8765f7e553ff2e86f91732b339eca4dfa7768b6697176cc46344531a007c604e49d837a8fe5fd6bfe758e99cfc4eba787b6f923616bacbc71c925957f185641d3befccc6f478fb8fc12e14299215bf7c1f74ce74dd5b83b12f962d09e0dce82b6e42a189d21ff38bb35805846f48bf32fc27bb2fbaaeb99410358a35a2f44587e281cab9f392814673eac964497011b493e35309e80f94e02b2a634dfc0cb451a9af51290f469ceb34fd45af6d69be382ce52e80c4773e329712f01f60bdd059c2f1cee254025d83bb71ff5fc12600206664c821100a3f180b3a084126796f97fa5d8ac2df50453aed4a3f8e72a2fbb67281b30a9126f413cfc1991fb27bb7777855880a7c18c005bd28a006e578c9a15bd220008f0258a4cab145579333db081423e09db73707113612f14000a60d00bcbb4c7515ff32972ee117f34b8021efe9f77690f7afd52bcacbadfed74b09155217c81c0eaa9615e3eebd4efa7ed464f4a001d347029f75034eb0f958286921b699df6d3751204a364a70a0f39c0dd74b9c2e37a8413bb02157d66cb15defe060f901eb030971b3b67aa3186c367b9c79f168801cffdb282dee23b8dfd5cd8fe95a7ff1d623b031763f19abd57d249d62128fed827bfc3b18277efb0467af8a30c3486623eccb9bf2e001d27b304de5909632acb5654f45ffc16030cd878cf66128ea354b618f267c8fc524dcad6b367eab965296d9139a8c7b55427d6225d6e96eaf0e27682988ddd6e29c85ed88f0c25d56cabde53e55f1b33291d430931a931e218aab13c4b6b7653ac28341633843796593fade640d49c4ef30f635d9b178079ec1274bc7922ebe3f71bbf8a58769f9b6578bf3c14ae7dc6a23a97017b811eb043c3467ba954e08a0e753fc4e50deeba52d33d896f937f944a9ef47a492e53cbbdfe446da22788f632b1f9f36c408c91106c3eb191dc265b853566db9dc94d00dd36df6701690022a39affee06a8b61abc11d74024fec0aef8df85e770877164ed0d805b9ad06dc6d2c2c9db214a02db288c56193bf81834497c5c1807b5b081129a84f85f6aabeb54f4574462f9d054d98af237b0e75b7b491286fb801a0ab87db05023f98aa1adf8c21f359736e14c5310e8a97eb54010f4847912053c240167c9a617497430e3f996000ccf1d4366507dfb5cbfc9012ee1b9fc2f63c03627c99f842e6233b4dba13b4112bc1321a619f0a63c716440e745bd055c8514b1b02c4471cbe2e5e06b09608db77f0313d541b1f73f26a0293143e36d9c9ed691026f0fdc96676bbd7c82ba724606c07928f10cad665622a4f07f31fe9714e73af773c637c5f9fb607a1fc061ecbf11fad5c051ebd33ae1a2a6f23573647375f5c72470bbf05c0caef25bdd184f69a1408d6540ad9ca712e776dadff47b5cfeb29a55973c9245da1a003a5287574622e18dc55642a512a87839f6bb3050ea6030e2246eda3d6adabe9f7a1c3ce3b6471827b1625c7811cb9eba5e92923e8268ae38f4402be0560c3a1ae58efca607cacd05dc02679966c4eac2b550fd59bf0ba0fa833b45386c40385717603773122d1fe7959c02ee80feb742bb003f983d5bd722d9c76a25465812d386247bdaedbf75d9cad62d960c9585f0c370f11c0b4f4886af750837aaddc1fe8a7729171a8a3f959c834c18acd80315b50dd11de399efcfcaedbbf484ccc8b966ae9c7cc4384d1d94efc9619553e6a299daf666d6e4b2b054bd6aa2b5d3314c7b0cde809073a5b3070f21d491d55ddaea66e81b8538749bb40413a226088c6aab85642714c87f8654f615ce2e4efe6b9d95aec14e58a1319b877fc1e9a1ff42ed58488d80efcc8f8761e34370fd944007617af6ab15424ef61cd6dc3245ce7ae7a51c6557bb4407600a56888bb0365f7696db0db46a603a8aefac8ee8ef2645fd96820696d1f61d5f1a7b9f9e3b20811dcc672b7bd29382bcd80441c2c56e538a0465a456fe0a8322b4c1ae01e20e0afbe555eb2c7f6d2811f3560cc91331cc15d3f2d0bf00cfa08e4ef2aaf0ae60a43f908ed827959569e09736b0fe03eb96eac7ca1570fd5677cc2d70cab8b8b081d2c3eac4a4979c84bfaf5c3f917040940a3474944699df4da38992d6a01bfdc8938d13c7acd63ac067e3f598377b831b1c8b1b37370ed99bf7c0f1cbcada22dc24578bf7d1ee535cdbb78f281f48808be3bc66751c7f3408ab5dac80d51f79b7bcc0554420053134e3a2c85cd376ae6d61be88afbdeec0fe1cb0483825bd3ae4538d84450dc053c9d4461772c2f0f388551a2580ea2bb57c88a4409ba428a9197d7d2f313677c6fde528e9cdfd3d74267158fd49e87152ad65c519ed74f9ac4d3ad734c001f25caa4c52e52d2daa5145399e36522e79042b91d1339b153f18362c1c6cce43fa6f8028c5ecbcbc58bef30b23eef6553ede99edcb2d65db5031f3fc0c4aa2f2c7adb4710209149e8bc92db94faf43a16717632e9ff58ca65143c96f46085c819c07e09d26656da2b2848d9f33b8ce978a83b6310747c4026adde41ed27a8c6b33561f9558a149bc9e71a02a28f7b744e0b9c9819569d56e2e9d82ea99725045853a525e6314101f34b6d53f1f1fd4af7f569a71c2be3ddb78dd9415594d620480439e63b374dab4bb5b346cef6a845e2340943e05100d3bcc69c9fee9e51eeb41bc168d479a93198085f653e1c0cee8f0bf611d2b2ea99799e6cc5a059fd073656fb7e430fc96ccba68b63656b7286c27bc0f7d1a5ac9d8c327af04c2fe2c04041d2876f95ca4feef1f2cc9bbcff7c5c325874ed584073ff607c6fde8ea2eb0e08ad2f9f119ecaf1da09b18a549d437b7876a5a10c994f902e7d7bfc61ae3f6ca55f60b280c09aaf09521c9f25787a23416db6776ecc22e9b57dba2829c45e18aa73df56c99c2b2b3e7513c28ed3957742222d74d059ca2aa9ee5c04283706d9ace798f0a64178db06d06be8bc967012564320216e4f1d77691e4e065e1b481a298ecd0480a6fdac4186f44dbe420d41226c96b924e178e7eb715b558ddba91a378d985b1063ea30d86e4cdeea724ba4dc927a02bdd59263bd35207f34776a04bf76dcb2fba14dfbd4e80e9f204bf7b84cc901d0712db6830480ed96ba99ba0689fa1bd2cb316757ad0e5ab6ee91d706be881a06e298b78ea2d99bc157201f7b44c1d8dccb28bd58bd05dcb02aa8e278dd85b47b1ff03f41caec98f1d941b37285eb9ade161cd5239f46f9571c72f4517c66cc02b7a228547f8fe229c477e08b947235b04f77087b6ae72045b840b2178db638d74bb32e7a5ced260d4fc0412d4f495e7c9bcabd5bf089a136f4e0b3eeeee8de3f3b169476a1ee70b42716a6cf28156bea82c7c8d11823edf1c1b00f53fa0c3319e3c3da89c7378abd8e316ceb67fdfdbabdeabca8b25c36d9842261ed45ec6a0182ab4f0808eef9ae808a9f2473e2d52337d0ccd57ea3341d3ebe1aca5ed966de98881191ac938d81898bc01eb277fb0da1c61d1d59a0ffb6816a1d8092d82822cd4100be20119ef8530e36bd2afa6b9b9a28c045aad1e357c9b1231e96912de2f1a48304d86d9993a73d9cb0ab7842eaf9a81b288a4ba47ef780bcf10cb726b24abd8a0457eed27d3f1dcec33f9d50d2759eb313d6de9c537565d411c6836e7f491bea60b7f15e1f0af1d74bc84cfd7417df01b5078c84d68f2dd0207a0bd16ff35367434527423e08d01853ab4d348237b5c9f97dd893214276203193f80d5b8d223e9f8cb23e3e0fc5d03bbbe3d74bc5e335e82c0ec203b66669e4523ddbb9bebc2544e4148c99b8a3270e4f6e6278323daba623d1e7034445bb82ef42d4225e8f8e8f316a17e3f9b93a64644c6258af841b0879119d122cb92e6dce0bffaa98f06be286eaaab17c7129a570963b3374bfb2627bffdcb7580be5c362f72521e5e46b76d72e3e578763682b6aac5455a4be201c4a78de4a03566cbc1a9a9d74c9bd9b513fbaf6a493c14cd26479816c0c9a0948386565afe94d4f46f53374e58a4d8fe046b6c63664af0364524597f99ae2f2eb79515f88244a1a920d1baa14a9a28402bbd816b11f542bf038336d467e7a12bc96ca4c0e2a3b5cc8c85e1d6c77f421225fbd7de8fa91c67977946b0881ea92d8a067469302d90b1a2936d82400d27387eea8b7b754a6b07d1a6d49130972e8f0785969e14a7b20145106fffd265832d6a9fb0d69e2dc64c5ca22902b9d37a33b2a03a060ce6f2e8d69935bdafce3c09d2f20177a23ea51391ef143bf4456a7c3d42b6d83e10b085b9267407a6c4426630ad233213b8c9b100a6349ed731eb136d585904aa9611edf3238c705ec600718c6a5c445aa7db0b899a47b2e29bd04ef865a688468a7ac8a70e415550cf926534104a628ef10c779b57aad26e0f1e01247c8ccea9331a39621943a509b1714c8a3c9246e69de1cd8a894c284b115b0a311cfb3a287be2c523dc221f04f9231acccd71d8ce2ca1f24f761867946f1417fbc1643f89eb4417687b67a845f3714aa96651b98abf1ee7bbdd10da857d50819734b55f7952d500e94dd9408d5f3dce7a0e553290c6bc6d221185f845b56c9d2c9efa2bf119016a13cfc445b3019b453e131a2f91ddcb375ddb0eb112bd08931a5412a5a0a3d85f191b5442b1b4781842c79462813f6b6a0e3c069e4a09fa5dacab0fbd29cceccc7652f03ef27ac0c81d44a5543045fbda73a41aa7771e47e24d59c00b777a004a93079dfcc7521813f1e19be8247a3c84d11d8213ac05b704b7f994b056d1008b3fa3abafd395bf6d3a3a8995773473eda09441a8494c6fb72d689a1e7594df429b5bee864be7398a3c1ac76d60bebd1f5407a81373e0fa22e713a7a118345ef299056d76bf43ace9558e1969c06cecac9fb349ae23d58461f6db9ce4c8b862bc61a3e73784e0b9a4f1909d7d018bb3b5cdef66c30df95c7b22b16b1c79cc0abe9332037ee58dfb35a22fc9cf250c7682b80139917d7519c34dfecbc3d80b2a45423883169430e4c9b69881cbefa09aff9fec68bfcfcfd4e210f5466df7e1fd73fbc2fda2c7be70f9a21802f23d2cbfd97e295a9e152615583e116b08e0de8df5e01b70964b8a6dc87118945b12375b3864870b0d015fd4eab8820843acbd6eec71be7a560360c7db1d27d2bfb03d5830f48219e4438e04f30607a7cce444053a5cb917f248b149332139435e79de66101956a382ed84547b0805bb39e437495164ade00abe21e5c06705ada2a69ed3c512a8973ffe07f7a422ea63a3c1f7e4bb19d427dcb76f7db2d34a27a8926f66fe0a6c9aaa2976ce89c7eedba20ba3fc81447c42008b49dd822e29306b182a9263702cbe6c28e3c47b6ba8cf8f73e4910e70ec2e77bb43c9f8caab198ae74d7e79ab8371388cf317d7b16c1ca7a9d36fea1db9b1d59130436d6d91864afb5fecb84888ed5b9a14d05e57131c06b871f660d25257566946c22f1efd879668f0b45a9f5e5e4149117ac6eecc55fe501c529449d242bc02e19ea3a0bacbcb480586505ac7da00435bd8cd163319631a3f5873475afb493a9b1e5745ce741afdc62c7f2885ed9ba9b5dc421b020a74be910cb79616e5753228f25cbebc3af3e7f6d669606089acae6a3388491a94e7659de27c8a52705fa1449ff0339fc3a4705fcd668fdd7c3d903d3a5e3bf7c9f1089f4b715ece3e085619e50ec3eb1d9a1462dc361b05528c37ac1c24339b704bafc239bdc6a030423c46af40f6e20e6ee09d2e8a9ca250dcbad8e2955ed79fd1cc228a99f2183c1c4582d91ce374e58ec510e094d6d07b1a7c1c380568942846565a38d2041a6c13b8f97d449295a650f67a0e9bb0e78e014248797f19bd83d4bb9d18c376c8fb2358d7ed17aeeef8b3b21255acd11eb93c38cbcd6f9b1847b0b22c41de1b3405ba1483d50178e062700c637004cea6fadcae4d550d6491dee8f17e429266feb334520b97e6ad85ae7f26fc7e126522a9c1d9ced4fa5c237f2cc7dcc4474f80978d8a6ff20bdcdb39cbd72b802276b07903eb862e210a00a5871eb899c52f4d2b22798981c02f9d8ac8918acdc73f713aee13a22b33380512c363e8f1757fd89e3f5a4ac13c3f24483bbf6dd243bbbdaa7d33abb6952dbbb2b1db1428d056b03bb75297acb27a7b0685ba5ccb09dd228a50b53319d6a86859977cdd59a230be670e3c43d2a206150ef65ab40704957e4e3ee704c447bd40b26adcd96fba70fb613d50260b81cf1ddd3e3e3375c345987e4537e465630aac339d12ef5bad939c7b31d5123db2c6669a6763bde29c21636e612ecf29e69654a3d430cb4ec95d0904fd1187535b22104cba5fd24735a65190259405acc5288e955f2ba5286d1f801e2aa888f063ffb35c3e5a90dca24febed303ff17501e06f88a4f6d32d04a806abb54efb4c705a2a90fc62d74093ba51af2d6ce5f91d6702b5e8929628bb19405d7d82ec779956c2ea7e77bff8df91c33221683b2f281661244cb84657056c9a4438cb92ac9e2a7f4a46bb1d69bdff2fa4aa165fedf2bf882c9fea131f14205d387e5be310753f193b69fa3decbd64d5f850ac432e761d5569adc8ae4b5d14a11f06e12514c1aa438ad29088e1ce2e8ab83703aed95271690d11b0719a0362f49daf6ccfaf0672ab3a41b659a0272baa3cd3844ab5d8b9596272eeffdf791b6f5b93b5bf5274ec00baf43014e510641f89b2b9f70ef2e4810f4ffda2f16c0da657af568712b38177befde1830d83feb4a44c2c8fbfb71f3e3a77cc4b6df93434010c54c5706bfad1e402afeea7f289936dfaf07430449e6422643141c5d01d75a4e54cf418e0ebec78a4544a269924d13cc79e825191b996e0c00462e94b91f88de95861a6169cf2f418a2b2f546bc905ecbd2698954d30d9c568ab59c171bb991b2934f8afea0c1712b1f19adfc89f07d644a95c90f98be32cecc967a63797ddd33e3a697e1ef1044d2732f10c2897f404221da2c44397a2133b6c75aa09c4f741bb5cb5bdbb41023f2dd19fab0c2b2d97ccd4a22a4a749047125f9b48f0a2ca11805d5bbb2469007cbc2fcb02e30c78c5792e1c83f77c9ea7d512e9be65246c68087bfa3f4c016bf913c1dad4ba3c6b8d67bcbd67484e0888384a1971df74327578988e1b70c01601c9670345ff1c779631bf772ab97647d83dcf25b9e199f93b87e377065ff8eb1f93888071dbbde0459ee399a2405cd1d01bd9ab041ebe665b97bca440bd9f3f29462afa5040d0e0a307a65689af7d41588bbf006bf9915440e98b058cfe7039bcca7ca28e4237964d308a5eb8987ae4ed19abdd221b045dcc89eff6fce35c68e2aed78de875b3e0adeafae6cb7f37eff07406d49b437fc3285c274ac0212a8f388407ede1d05922b9ca180c1798d72b2e7a1d563803ad4a035606aba1f5e1e356a489ec409cf0fc94e0f77b4ea095609467c69767ce55afc51b4d38f306aae89307297993f57a73424824260a67f5b933271cd668de0ebb141ff8ea5da590ba61053da237cbaf6f45251557c895569b6084e73054bbca2f75b5e430df765b6e08885ecb76765c3d9a59f3b8d9e4eed9866442b8b886a221a9e34ddef8445acdf95909c981268e033ada8dbbba41e28c992a4768aac3993f1f8279bff624ef37a9f815a4522ae57d74302ba31e4bb9ef219acf9f748382abcba1419fa1c4186ffffa106ef06d66df41a17c25bb64d10d4dc86d8929745c516e4e8cea9122b8f95de2bef4c6f553ab72ef92e5e783ec3169a809769e4aa232b90f275aca93d11a4d81a30afcae6c85a1358eef23e66fbbf9d6d0450ec9583e134aa02d0c1702b4043b3777f46c9fe3d3ff47b4e4e9b97b416e7af0bb105005449aa2f5ac2d9b721354f3c5137214822e88543f60d66bc2dc9d806529f0fc404eddc2b071fa33c08e904e101936f870ca794ed3ab03ee2e5c83a47bdd7a460c6b5e1c8f0a39d514da616d1ee0b258f8aaff43d0a2543022b50996aed854c58ae414c9c65b55b61e416dfe79711d1a4943a28ca44afa7c187678690fd05d3512f4dc186d45c1613bf5b529ae05c65aca2e4b4c3d2a4072362d04fe8775c79e9e97653ba112962775b99be32c6b668804af5b3a09f3ab653af9ad3e803444915a26ede856a2868f10364df112039ef13d27b5a979a0167bf5a210169d5e4dff2dce46226e14f1dc217f37004951125bcccd8a645673a79bd8b1029f581b38066962a339ae03e3274be3d5b6c0f8e15805e0caaf20b9e39141df75e11a22790a0eca9738cf6294b3d56e9cc913986d971f5c6307994b4c508de4b210380e733bb4bd401255715cbff4315eb614a73973c19daeb7b095e382bcf1c3ca8c8da61f2001642550d67cf00cd48703f85c3ab612aea2da1f7fdfa8a3c36ef9bce1368a94e169fc372556dcc5697fd47a84b6302ac11dbb9e86912fb60a51322f0f60ca7c3e2cf675440fb3cc38b695b9fdd0356fee818afd3b6f6aa618d372f39b6cbc61d48084417865c3aceed568496b6a646d8a678a432de3a124fdb452f4c684e72a5cf8c05af62642883ff9860b23f0fb6604f791dfbd62aaf73e3a0f8bee5c1d643a21fb9d1b407ddb6fa8e5e26a63718b137c85183ef78c86adc22ac1e1376fd85362975e65af9cc6f5d2c0dca224ba2ab3e3d64c65266c01e716801b99895029d7f22f411d6e60d70b0e210fc56d31c202e1de89aa83b8ba0d374900e6740fc81cbbc87e46b2fdb1bc066ce862bd6b24895c74baff00911f63c15043f14b65a4f71c5f0cc8af84dcb50575a5aaabb6348aa8335638767f06cac650427af531492ead4036f4c99c64c6af8163b1283e7af66a79467d81f10fae8c41370122221a9f68ea0d0a0585545a460835237a4652b05b4724161b7f3004a8ba7a531a12a31a40fc76e5a8511cbae4ddfe4b9e0d414312d2047fbf78db4628b4052dcb59ddabb8562ad753368601ac6945fe099912287af0259a8fb41a1a4666c4bd584be25f2761a4b0fb75ccde08dedd3b93f1100f7edb6a83e327c454c9a7f69e7380be79e95bec4366727d1ab9be177eccd01ddc72c8efc659d1d1a130fcdc8dc6c3e8bbabc8882708996dc80a485c02d6826825839039fce934b3a970cd2a987e9069cda7d6dd40286f0c6e4aae245d71ab8153297d0c492020300cbcf000e2319021ccabfb93c540218062d0fe33efc6484a7135e51974dc042d0f17bcae4a8d6a6b135f6f0605f3be1adee2f89fa20d849c7d4757d4747fbba463b7c819ed5114d75c83d7367003273f33b97c7fa2d9245b0d70a2c17d6410a321d47db22eae58b87d6b133367e27520b15b5e95e7d2ae4ca90525707ee8060ab38735a27eee391faa17b3d917accb61cde4771525c13e98c14ed79dc30282c7e6daaf58a2864ccd72966f65a6a3f60ff5743d84f708e78c410810020280f13b61aec5ff35269c0304ac7c005674db74eebda54b3915d90c7c6911eeebc08ba1b42e506f01a52214d7add92c06172ab964a6997ea6826dabea69eb8fc29c3341f0c53725eae74d652c6d9a86cfff7168b9077551c26671fe46abfbd305580e30063b22cffd5d728d2256735896e6811140341f6ea492707b155f9f04df58594f08f4aa91fe7dafe2f01708e0362e327d40acea4610ec2a8db3a8d095aa98612e20244882e704f8e7f590f3a9f12040645039fe03ee107e6ffabc053b4e68cb8a51ebfbbc7caeac6e658b3b42d7f484e40a9e3d694bf02686096d218cffee957e8963226ab7e27e976048c9036273dbee9497f7d28194702f89dfd6c283e347136d27f9c34b434e6079ab65cbd0a534cc229256f070eba7f970c7e12eaeabf08c333071c92fafacd1fcd53e383d9023dd1e86bde8d5a0bb494de7230d589da400f7c86fdc93aeacc498fbaf1e91d3e65629893e3982085a34f9ae60616c568b6bf68f348872e1eda57e8e70bbaa92fdd61c538420a225d257cc0ac1fb9a9d1b003f145c36cb1fb032bfba3dd761ca12cc8e2f6720d58af721c976d97c5b5669472e9507233105fd36e9a9a78b0b105366c125a00c26a57ab0687aaaf587de1063ecacaf36988daa0e4880dc1f351f1dbb5ad5b22ea85319c0dcc0bee4c1074a92ddc479232bc62098d50c4e26ff08545ff418075db086e79ae9b4006d748e02ef9a93992e1f1d3bace82bf5171a76a2d6691a46e3c15b21dd9eaecbb08ddd02ab8728a817aff9694bf9c8f7fbea321511e2edc626966bce49d2255869d9e49b19a2804167c91b8c68676385a7f30f11926076f08f1664897479c35ed32e05b415cb33871ce3d0649d79699dbc20c872f2be32262b3159e59c67fe1bb703eaffd424ea510d54497010a1afe0d3dc04d6c65349ff52a1a38709d6d17c7ff8151e39086e6cf6b972cd32d0d5b1ef1968088268387ba91530f2679155313af979b6a1a4bc86f541d2e258a0ed5af8557ad14967432b6eace77ac6658ae95423e24fd6bc037bbe74928b8d3abce0abd66665ebd6482a682e657b5654604378b50eb5a81f1d9ae514d9d579d34b84079279063a5f5a337a0686894769d976fd7e7f9e18c8565d7a925a7e532299466e19246172c7622ae706df477325c92240a3b0bc07c76870b381bf33134505ce109b1967d8f27cef33a4e3c95b495a12a329720c841865db36d567d944341e6aea10fa7ed693a3dd0c895d3dcb5fed025e93246cc9bfe8666a0cd8da284b7423430447348b89b1ace7224c22b5fdf15331ac5715221889ff5a8ce60bfebfc7f83d6ac1f2725c6fd0d21c7cd1160855cee756b3a202917810329242ae13d3e21ce7e1c8a3dab8245187219ae663e3703ea946dc5bba060377ce2785e36d907342d53ea781e0fba605cadb547aa08acb897aa41303f2705c7b92f6ae23a9730aa119ae4575d96cc12862194301092847916806f45641fd5090f991a1cacb81a5865393e35486907486db2952ca367142d284700450cfd22fa507d4a9583c3c2cab2b77234d9d89e5c0ba64ad45f4c5cca31ef4d5a137378c3b02eb710926c58b5a410c3f010c3f34ccf7cedad5d6537c433277f5ffea1ad97d999cc4de46dea41f65fe58dfc4221a86bdeabaa3b1f52a8932222770c3396317eb2a094ad42d34bcb68ebf46e8ea93406e5412c2360fa8df359118d155a075f220092a7b3f0b35662f8b59a35dc515fbb300fbd703cabb0cf5775f845115ae137150f8a72d69ee743b57b2189cc17abbaa4a715c4c706d24ae70380b4e81485768c9c9b14660d9c8dca579c8ef8a528c0007cdaf911f45d6d12154afe5682e520689c1371cc3c9d6d8bf07ef09afa0ae51c90818dda4fe6b778b081a0058dd8c7fb5bb5716022e29aa40efd173e20732a39239edc4155573d89093260490a32cd6fa507a0c6115bcb9e4932279e35e5ba2b0f5a2c0f39d9b120cdf9cf88b8b52f037485c4f35fff50cc5d32d39d9156c2a5d411e439443eb00954830651b71b59ef6c1e8c2ae798022e52159a71b9ca5fe9df5d2300975e184b1cb31aea878240929f4d81a042743f6d207dad9ec9b4413adf7669b319347423d257576516bdf748458d53b4920fa240814ad32f7d4b7a8c71f68b5c3867b82d1926c38ddc967e0d63a2b986586cbcd9246a4d2fd8b82b7652e158c81ae950a679cabbf551026154124471a838ce53b0012cc8a193849d8da866912a83de52e043f6fad287546c1c08f21609a8b49381f2c3782c0a88464824d9dbb8c86c1b4774c1ff3b68792aac40dc3043164d2fd30cd6191349e1cec36056b9262a14201500907b12e7827c14356df55f3f56d5d600e825e00d0e1c3e27ee24995a14de6089daff1286a26b0c23efd0e205f1dd2e418ff85dbf7870728b642e3dea09927700fdd0c83a6239c75f43571b2a2d43c96e0e0ac5539adc39950f4f596c52273c758afea8ab43faf5e28162068290c04b2d5541bfa982bc855850b1c8cca0a11ce5d09084a527836301941d8a72b4522e0dafbe3a84e2e1c276bd1bc71fcb816146b6faca8862de6e7a978d79d934f0d7d3fdbb187eba0199b5e458754f57826e7955e12d981a92aa7a79a76bf8029c8aa476023cece829b263c54bc5eeebc7516189b94bc302612a441a4a7fc59526c774c325a869db7089e4b07befdc820b3e634e04038af6fc3c9ab3ee0777e6a3f7acbff17d0dfddc9066fb5628e00c1cd9518c6f8677eaeb98894b0d2fad707d6577d93df02a11d13610bd70a5262d9ba16c700364840b7801e014419a3417a06de759ce3209fb2a0ae8a2aebf0b2842479837729879056888eb1aef00e51e499df14d91e8ea4a399b9c7ab9c29d09db0f7db352f18173bcdc7fe40f61567dd062cc97de3f107f1d3ee4a02b7e9b64a713253779cf6525b7e8a6b65ccbafb147fe3ab3be169d1023e574d822266e4607ccee6294c0accac4b61c7e1c4e605f33d8b7fba1bc4e04806dd16778e0cf1764002e769710f707188cd6af67246a817594b86a7b7ab75d08a746db23f81e2633fe13e7d8c17a5191bebd0b6a6960d3aa54cd2c38547626b9b2ad2290ba4de3ec3edaeaaca4f545d555a83025516f7ce3f1f584d1ae34abc24cebd599b3d8c3bdd36ee63963cfd53a597b396d0ac653b8074a3e88ab9dd41ce4f304bc5900d690da82d3f54c63d3fe66c5141bfbffc2fd04c3035b84a7475d0c1cdc4260b0640dd137c53830c3dc03cda761a7e6f1d0d8690386e472b24286fa39e71795ebc6e616c48b082b3e01562e8180496370987bcd05a32be139a69c247388550e25a0f5b47ca5391129d99c57946458896c988113f7de22cf467d3fa0b5f32a5b9d89390b9ab10b0bcc749cc5ea3525e999ccfb8c58f58fbc22ab7c39ac2500ee7386eda3969542b21329760c2fb14ce9f977e64eed5d705094ed6e9bcd5026cdfac9aeac65739b3153616fe5c943bc5b51f8e1358e989440206cd697bdd9decad9772893d351609df50cfe316bd0333d5afeb6ba3e68078f028e29b0ee7553dd9be004dad46cb16d6baba37d5b6d9289d9901c5a642b1ccc5ed813fec416e0456f1745ee1d36d9e08f3b42d6298b297670413650f70ecc3a10f46fa7e8822d58f9e1a107b06edd78cfbe708682b4d91f930db4339114655261262525965eea5c2d93b795bec3b72cb1920eb9ef723b7a3edb5a6e107506f4c7349f51304651d8eab543f6598ce97557d012d625f974288c261b34c25ad55dcd58beb21dcd9844b22735a978cbcbb79b372ba1d85b92b3c0449c45e9979a81326d6c35b993df449c2992745a4e9edcca4fa83c284145141f34ead392f212a2217a5fdaa5322ea7e6e95019df22f4af66cc542ee6aad0f9b0327e11e2bfe6a056195757f3ec5f19278a18b1849b2cbe38ebf2fe287fa5699558d8faa774cb388b167c12d78e95f329b66390edc233ef638e2d908f3f59176b5c24ab10979cfd6d629d4633153e19666a7a84fce1b10ba4f3ab293058161ee848209dc86cb3800fba127875372d632be33c76acadad9c70a15b3003476b02dd7d724e9a778d0524ce0014273aa44d2c1e6434d7402b4178f2fe649b9e09d44030be9ea136884378a5c0a681a8de300a8a20ab15d91dc82675698b54bd34b5ba874c401ad1f71a15b560056dd314cb13cd798b29528ab923b899378b34834783ae8372b9532093bce482a7a459b6844b8a2957d0fc270aa247893d2c38e5665fa9b4a2003878bec9149002ff1433208a3b584f4c40c65580749c6722218531a0e2eff7313792f530994790ab560f9ef7a478fd076022bb0f6348abc1b8b506c88b10b90d44cd93ff7c24e1097e79e0e65d541d219e7b951786485654aef3eaab0278a863ce91a400e83309bcc711a858b75afe5b1fe80035daea873dc42024f3be3b81313a52449e4307481d6f8303e08d2f67c7509adc7dc9f388d65a081316065ad37390d58c018a500cd6d9e7f0518d704ce802a5cc30885053cb7180a053659aac854e2217f6e5bca0ff741772d7058fff936cc2c69ae7428d93b8407af216664cda02ee642d783aa585560d0ddbecd0ac2c047beac21946fdc7e55a8d841b13eab7c6e321b515869215b0da160916b90a12aa02e6b02a675dae21e707dca890a828ac5e78ce690af65b0a84d0fed72229d4f197badb3ea12884b00e853304859e942267e19986b7d7598a6849a1b270d38b3a1ab653fc83687a8366ec719f48a43bcfb2410523e47cd2f85bc2b9482c629c7be00a4e15af4edfc64d9b6bb6784fa00de1643108efabe88ff9de954e06cf08983f94d2926b44e887766f8a9f0079545a28acb8e23a749b01a880f1252a05b85122f6880542c500914478f0dfe6d022372c5b695098c574bb27c6dfd54f996c7329073ac695f7d09a8c949372d299909554f07a396fb0f4ba6f3c1ede0bfb83897f9fd0232d934f78daf9e3ccf0e8cd37557344eca8cc898d9c41c396eba01d20065cf2de25e00e12d384198be053423aff122481a21ab039ddaeda00c871ea48db47507e38bf0d0dad939cd40b5db4e8fa9bada8af0bb895a4dff949c8659277c4e41250b0514f8827700f3c952d53c16e2a625349d5acbfc6fcf315dff0ade5c0cfd98d5f00f63a86cc691d78fc85a30c90f9113b2e106e2efb8070bf10d181ec0767669ee2a0ed8dd9d79ce827475d4d44eae8e27f464dd652085f2d331213a7741856bf3964b40a8b97054388e95e529386414511f5c27e77bb93335de31b9fcbe3bbe314d4f1048bbd75e9a3238c29c3ee887c47b107b7bcdfea8f95e6136e5d644adf7d76c642675f70e1fb19984deb91eee4086d52a47130285c18056503cc8a65bd3d7cf387dfa9229ec46dd2bac6d26806f69a77599dff715b3a807cd8259c367041a022d31a5508dee131712d62faae00b4a4c30f8ebebce90108152f430a0a2b8c6396a0eb870c4223d1a767e4df6d82a60d3b9e0ec812f79c677ca40c681f9d682c7d8e04851f60b3ee354e1f3e46aa2191a1c6500b9b36cd104bf407054937cc07dd12acf60f10ef92cf7284170e0262272947e083f87e8bb346422fe72a459b480f066c8e02773e9d55884ab79fc790e30d74176d71ef2d370110deb70de1cf1a2fa58935d7ae3cf81ea8b94ba7788f79c6e433f0b5d5f3388b00291513ee815ed8515b6dccecfcadce955f12ba98683f13a7c025a36d4dd150adc603694d1a85f57684ce2ec337ef81a5034eba90202274bb3bd031b01a16059172744ad225af692b95a53847055f9b1d08a4f50279d4c2891a82f98626608e54e354603f292099012400aefb5436c1a48494887f50ce5b0118c4e2ea040e8cae374d8a2b74d14a477cd7cfd55e10c86c437b819c3355ac511c05ff6d39ea8915dc9af21eda987b0281aabd0905cff39be1e67303ba6405d8fa96097c6dc8037b597baaed7170dba3cdaec21b5b1fa63d7e507b240ffbb30a25ff433ebad962953ff437c09c4f82bfe8acd03edf4e31cad1a587a0725e05d900ac66070ea38d02ad94ccdb64d76c1ec9651b489827b9b06cdeca292877d7a8a7f8028af31d4279b3be0256632a2f6325d4e2e25ad0a75563866337cf2d5e54a4342764eaf1053f0636b68037cdfd99c233aaedccb83ce38505a7c802980c526adc4568ab84f1b99a5e8c122c91415fc0c4da825cb2230d96f142bc8ab9e41562b23c42ce7f8b57d7a3f35c80e203ff5b03b1cbee105adcc2c197796f574e6227d463541d8aac38b7e3b183ecb882a6d941741cbd050c579775a1b30d0d092062309952d2bb589a3b2f2733ddb300867f3746abceb7e40a052d62382f505dd380410c8c3d03ee66dd81a190a64d8b0d509581575a40f563b35253ee17f77197645779a4f07893303d197fa6590cc61348d2b2eb643f25d0baf2291e2e610e539d7f95b7e8b49f645976b126c8d9883cc4bec280297763e171a520509ac6abeb8141cad92738e6631a48eaef2ed5d6f37c05e5d35d61573a8738366b3f1106dfe0f98f04e018fda7c900f1403a5a480e2f0471936de1333140308d324466911d4b91bd17af1fc3e5924d42c60ee3b055fa17c5455004ff4a2a8cf3a97e91ab11f94c112c23eac0962270280512261e4430b3ed7623377af6ad6fe319a3fd91fe551406f137fa7a1ddaeedfaae52272f29df1307e3141a5be3daf76598437ef6a0b86b9af7c8d3d0c389debf83ff2d64c1badfcd76cf76f1f78b93efa1a644f9ab4b3287c7118eeaa117c786332f60ab52820e2fd61b7427dc9c1244cb11e96c33cb62e992759fa8794d84a4012cd378725776f04b6d5ef0ec6bd4966292db35df9ae2e57f02596a745f2d38708de311a3da5c48115eb9e88207294e42ec03116046a693ebdbd65283902fcf0cb459369dd4a59eee15172c67e65809080ffe849566da5117011923b59d57a8d67a99dab60e7085633f4fdc4a029e37a978e7d8b1e6b04638663b00bfa56b4c3c5f5d2c0ed7e02038d2719648b6c76496ce001f0b7140f17a00f65569468cad8f9f699aa09cf0e94071b0ed37ebd6bee822e9ac052133b8537f493efad185cf295edd17b5dba3b2ff3e224c85799af06f5b852594429369baa7b8ceb2e301a8b77b0062d219ad908279c8ccc7a434cc49a599a0977afd7eb694acf8eda13a62043803c52d0378e6719188d689aedec839ca7f0d37b75cd2d79f16526b49504a1c238eb33be96f110c942256ec31310eae6bd65f294d3239dbbc08f7087a13a24c78d040355d794ecd1087d325ce6fc17bcacc8c2719264fae471917d2e1d5cbb2884eea24587874f90e4e7020c000a7fb55be85f3cc4256224bc364d1c02fbe69364004246109f35d0b75beeb53272cad06301a8379021f80e03eb963be3604f6cad22e7567f599edca208060b9e7ea44b2a1bc2870337d421f036426bf84990608125c2f0c1ea303eae9aa7e77f4d87e6efac378a484ca5de5dcf3d7194645c50b700c8ff80d6af7d43f93affeebc7dc35b35cda5f0b1568428ada8cdb66f2643db37b078568b21a7aae279bc22e233dc79deb4f8587f860755c0d9d26a9fcf3b3bb2b88f5e3bba0a673e1bcde0f80c00ea49cd592968e88d3d0a13cd470b39c25083d81faef2206de69a1c56e693747b69e10599fb118be6b109b8da329ab251d005e3b30ff1ab219ed8566eb4a34041b68f4d4b9a337b60eb362d23a6092dbd6e9a3f45a9cb7733e73bd68ae8e58b40aa6f99a1720915be8936e30c58fe18092616dd0159b365c961d32ee78084f48141678ddbf6bde06f28567e013d31ac156bac3721dc572c39a8221b1b4182674291ff20e6b9ac3bcaec29d1ff7c8c253d311619a8aadb8e2c37836a04e6fb03dc534ac961591d078783a032a2d4c36c780793a955bca23ae20cba6b55e71ba88238e6ecf25eccba4fb5ea20f203f587bede18ac6e1c86dd2b2501f3b574a576c61daa5dc590558fd162a5d20c6a7af30faae89af4594b864e8bb4376abe0bd4f9f109842ddbfc032e666f42a706d626a86481b81964c523e58bee179e11952e2a42be3ef0d23c9ab171a506da7e06e890e0c879c1e4f4aa691183ae268340c6b6c7d848534e9e826fd2ec7e324793858332232e8975e8d1410ae67a8022a8c0f7642979b1b48c5bf2a0a938f570831b3f8e479a019f0438bf7749af9e88d74cd878cfaa427553115bb2ee91041f6fd584a03f55b2ac44ea0192d90c6155f6ed5564452e58a2c25eeb21033d7a88801c5ec2b27a9b82550f647ef69611d07b4ed098b218c4f61cd13f8a712aed94ecbc658f0949a4c1e18e43b844767db6df10ed680eb1b7caea37f577daa0070072d509cc8bfa292940838bd46a5738dccec21e0e7cfb62ac5aba7e516043436d5835530e732a678088e4da17e55a89c18014199131b6f0c3e7f9606cf7ce6dff4d1a9c6a5d964a74a1d98d932df64fa6208bbd8efa4e39b486651097500bc92653f221012dcd5998ff9f035e2d5ae095684e50cd5aa4bd18c4e0f60ecb058fa71394c8667105b8a4d85dcd097e104a21d151c3fd9e0360b1f88657f553365fd91a3ec3e650a5a1d8c7932cfe15f7c9a6beba292bc255f7651d48ff8a4b7b3dbf1b66905c86c3a3df4f99786b339cbca35ecfe451c5fe36637d7c033a12e180654320e9b8da44fc0430350b498a77b59981ce661dc935331d8d2c657d7a61acc1b24b4be7cb1c9bc932c85e584e4fbd828c0573281123534c429c0bc3cc82b033cf60185c32cc9e6e3f196b0e03cd4e11862362359e0fc8118b3e6ef50b0b825aed28e9bbe5a63624379f5230265931f9718a2721f02b1bfc137734d90a6e219a54360335b52bf66e1d1f0ac1197dd7c2406736afd6951934835e33d2f8199f3cdc6070bfd3618770b21d62fada15da91e486ed77c9b2132178415e5e0a5966629cf2a9d1af03ca8d63706d3763189df856437c8f63a0f0cee64d79511417795579fa3000062468a4c3a9b8ddd9609c13397ba9b4e0e1dfb9025d4c96aed90b5221f10e6a5a582c301277438dab8ba85dca02a24e84e6769867541ceea7c3310ec9d7bb40e5909b8d2df93d9ed1d66fcd3b292f48a30c069d59c3b0019fbd42c494269dd04da06339ed4898c7c3f02be34a2f509531232209232a405c5b5f9ee523726d349bb3d428e5081491b80b847db896295d3cbef9f8c2573c562d46cf31e35912a18bd985c17b4a769864b45d3ab879899d270732b6b69709d3418493614fdb760bb0bc020d4c7d4f8e427cb93b52ed814be6d6c96be4fdb083b6d8477fd1537a10be3a48d6b97cce1d91d22a6b648c4f4a7c3a9e0be7c0a2d66bda717d4ba5865d6249d78da9c8dd05414c70802a10f385342ee1619ffa31d99192710ccff1f228528a107d3750b314e9f0de8b4749da952ee556abfbd9b5ae70da1e69bf3d08783ba77a0b9f4bfc58df28e7176e456885de41d02c7beec6b7e1916549d7a295097e37fdb2e7a28b29f42d5266db651031a2c4c8b45318977b5179c4511fd443b865a128fc3988a6010fadfaafa5b9f58721a7f61c4979bf7f18055739d58d985adab05708a6eeb45435986a8915000b81073086b8eea4ad11ee00e31cc304e1fc3d1f61d510b9c0ad8dc67ffd27296283c6d5f893f42425e2ff57127fc4410a9fdc8682100501baaf451de20ae2d8552c04b215184b1e84f02108d6d4d23acabbec832a5c64b3b85e9ee96b9fc15d4a874fc03df4e206feec47db50f5924be49d6a3daecada67eed1ac496ea5421d3104e9c935b5d0c7099691cf142ce12ee2fae43c55315edd8367f52313d386221d77b4d52a09f1441fad38c01a5d41e2c17e39d163bcf60be0fccaf1e8c2f1d3d4c6495ecf50643b6a50fc7892a8540db920d868f0e66d49c74b8985864e76e5a43acce01668c01c2dcd1e480beddaa09bfe38b57ce031e79e06f9938d7208f2d488797c1a51810b6ecc3257c34267af78453db03ddbe9d7467308f16a090123cf93980a55c00d1e648725e6a498ef1499bc842d7de2d0159a904daef2b40346a0050685bc0523a3ff296d6ba002cd77ee28904837455acb5640d6d8ba939f22557083f24eaf3f2ce31ae94985631a3bd206f9d33cea59324ba077f7814b0969c16269c4a6272b8c49bb41a1d913723381d030c5c85fb21e340d5d84524228b3b4b68c6bfffcfa549fce5167d18cb42c535ab10a23f1c9d20b15a5d17674de6745b0a4b8b07702b8f63b622bd15a19d16b7183019a1ff7417dad001b861f64f6331e4f0237413a49e731631af10ff202396e3cf35034144fb059bbe5170b94a9234f4a6ebb3e42e59c3137f942c0fdbe97c0a7bf0d0e2c0ccef7b5c7b59d55b31e66ae508c6e0a1d1253f6bb09c7f9a562367e5df5e8c9eeede97af665c37376cd7cb2aa021e2bd436a04329bf307e9f94a4f610436bc6f276fca8b0bf0423437d3f0f6e608050d812c2f3158c9816fcfdeea6590f474746634e6f3bb7fc52fd0214d461debf2d5bde50b15a6768d323ab3da519f4d6afdc74367d2c6305b9106a09a56e7b9314c0f7eca20264a1f2dc0ba98c8cff08ee32c6a997ea4fac0990b5043167ce0902822e0bb3951260c4e2c3fd063fafbc9ce209199b4f494d7db7de10ff324d07346f02355b5c4a3a229225083ee4aa7c50eafbafb02a826bb6ee6a4b0f61eaa19645f7fb610108be36be2f45837c2e57bc79bd3fa88437890f7c304106730b1cf2f9780d01f8da882fddca76ac552a46fb530be56163e1e036bcd67f1fcb122dfe3d4267db90492018e96de3b2586dbdf8f21240455c4e08afbc8fb97d09f7270f5bf0dcdb4483fdf4a76ed4952f74f568a270bde451659c31391e2e5eba10787b6982a77faa2cac32b3ab2aae5a1bf7d25d06f958de0da9dfbfa9169ba55b28b33b7e9b55514a3432d9ff2b2019387865433dc021cf0fd86f094381f15cc9135ccbf3d5aef5d1463ffc04a8934ef3818ba9418669e96e380a08e63fa6fe13fa3404d1099b2c9513dc8fe8be66a91d93497411d1cabe500b8d2135f0ca6823ac1c7dec9bb93f8ce91bc51e0d7c6260fe8bbc532f79a9f87e1f9b7981dea65ad28c1f2c8ebb43cf291b5bef26246384707403ea228488055d3abbf16c5943463983c8c5dce5cd7850d38cc036b07c45ee44732e3c039441ce45154f35f37431be7f609a9da85dd41a85df286bec0af159a66c6d7222180886bc60eb3adadf1f1f9ec120a701bc76fb77053f5606976960bfc0774965d944c529f82209d3ade1a7dc7b661a4ccfd2520245f728a364e6110f2c225844acd73ba3e7f2399b007557b940afbbedf12ad7cc492ffcb65b17f1e96ca2b39ee79c7e04199e2d6819d3f3a3883aed2f69b7056798f12f3e3076ec827d2166ce438975e59a0d1610c43f33eefec55b9569a5276b6bb8ff0c698371885d1c738895668e9109d9b04238b57f508aae6d247eef8daeb815ab6f0a1b7af9346ebbb4c7efcf3b26b0d06af282a1be4ec9e281f31b31e87404bad88fe78abb669546a13ccfd7026158e79733a7020678f85971d0d362f9e0c94d2f496c48ca638171a03de9424f1a7f4b4019773202845dd359eec903f6b459c7670f1f9c3bebb80847c781639c4fd6f02338b451d0be6961d258ea3190739aa10a750e1a1926b602ec658e4fe54aa0cbbc034729902b767e91e33e7502583bb80655d38945074e844a7c7d3bef2544fbcc4be43231ae2425bbd6e57efb7018c04d469968c75eb819568879386c44584e0158cd5033ec64d129c45901133419d802c97ccbed7e4e420572d577d1b6c8a3cfb55027467eed6177362b68dacfedc829de5e3fafdece6cacea45a7004495ea8673493990a3dc4cec55dc4f512c221191086f894c614e2726335a3ba38813a5d3cf5fae08b5405d350631c373640b28ec0859f67816ba695d347ebb42470b147d87401c47167d9354912706040a1472016967f14888fd7e6a771cc1dd9583c565e55125fb448617d888112de340490d2fb6261fcfdd3bfeeb7e046e5ae458308a3ef6e370eccfa0d3fa9ca3a5495779ebfa812100bfa40a8c088b0a60b08aa99a6712cab6cbf0b01413b50a05ee1d568f5924e8222a46f18b49295924726ae2907ad847ad86bfabcc3e39667b936b17d1bdca10a01a6bcdadb732b8a0ee2f6c17ca49b0809f68853ed566cd3cd514664737678001aed90dc13046bd129b9249ecbb5bddcfef8391e619d418fc7d9b85e4b49df88cf1bb1a7f0db465113568f0b83d1fbe79f6ee1fa739674736543a4ab7086aa64c6f731336d042c43b06b79c23af55181f0166ffb4464aacc70472762179fdb24e9fef341fdee1e9b9f02f91523f58bd0754d8953e98d8679a885cefab1738775405049a3e2bac58200cb3da1c8917b7b37788df43551fa92e609eb0369c12db2a085b55c11a16b2de9c87b5fe8a84a8cae6330a53d1b9c60d0ac06ff0db5b79427d1e2fae614c58a84cfe3cc80e555b79ceb9d9d45815dbdd5ddbdd5bca9464b40a910a760a1ef40c40a703016c406488f91ffc07a5940cde2c5f4017e0fc051f14a320fc499b40f8b393627fd2a5d89f5d94ffdcc97f3691cf9fa6cf9f3df4c19fae0ffea45244c07491c568ccfcf3cb3426a563e69ff4c900f80564803fc01fc00006c0bd64026e1b0672dcb3974631598c0630218b28ff6e6e06d1830a36b8004386941b7594805f4025bc096f420925e06e5a82db09d6817b7653054e5a5450c21212f00b88845ff24b48103309b89f46c07dc3a0cc3dfb49cc5885073163151e481821cc22601a0b8269ac4723abeff18ddc17014ba1554c11842c26c207c11b7875110b228a803740d5b0420e2c6241ca225e49c257bdea837268dddaea726ae34beea77d0bb3d42f0a7c1e34b8b2565b7e9d872920da1c7a221706c46292c8c571da760842dc7e335b6b2b3e6fba90139b9cab557412c3884d30dc132c42029192b8501e6aab511e317b64723f68f47d8f47b604f90edb31f91bf341e58f8bfa5cde3a1d94e3b44e90928b729c7e2beef97d9f4dfa6edf987b7ade98dcefdd288f7fffb7e4b0fa31e5b6e5fee216b471cf4e2af777529ecd619d3f29a9534c92f2be7ed86f8fe4b4e39c6cc11af7ec64512a7432ca33f3fd5d53987e56b942e7155a081577467988e45625714fb0d63d96c608eb6770c825ac85af24b504a17ea23837e3685c113703974025cbcdc09a9b513cdbafcecdb8d9cc8710d78235d096bb9282cf7d9f07d6b81947e430cacd3822ce4aa8147271f38877fb3ecf036be290c37a7cbf48459c89561c56c1f78bfde21587d97cbf4813b338ecc7f78b450e03f2fddf2f1e390c7fbf88e4b012ca753a1993eb74525c5c879bd5f0c9614b215298e430d78b425351b9c7dc3059297fb78a53ffa606dcf1adef07a1c01b089bf97e702a6c11be5544469fc575e55a09f2581ca222ce442ba20d16af883fb098452cc2a211c6e21116912c0e917098142e854f6e86502153c8c571fa45a1a928d9185798fb452a54cafd600d069730c8043a8163dcec6f61f009833737fb59188c02a5c0a950e666bf0818b4559c6a94fb4f155196bfe2b252e2ce187b7eec1908f6fc03d3ce15e0ce3d30a5dd99350362720b0db2fc754d26cb1dee3287e9982c023793d52faabf93ea565dc9adb2925b4525f73795bbfb72274563b5046b6e7a56e1337cf0414c73d75a79d888723f78735877adb5d6aaaa9dccfe2bc987b5da0e830f4285472152c8255ce150c9cd0facd55443df4d0a94923b0f8c026f4cb0ded1e43a41fec96145dc68cafda094eb78acdfe364dd548741e4fe6eefe6eeddbc5b06595ceec59c36ee09d64eef767e201368036ba052e7daa5e61e97d42e2f64afa44dc4ebda4596bdd23d5b8771339f398c82417087a378ae20ce1f7eb9cc4d21970d2e53e1eff6497d5142f73368039bc05a68ddda3acec208515bdd6feed148fdecf77960ed0daf16864a98a530548a8051b93fcf7a5c5cefa762f7f1878b9fcfb6f464b89b72b37d6aee6eaa8279236909a98ad3efdd2a4e7fadb7aa43021614e8604494171c2023d6ef49551d082c2901664c135e748921d61f2a51f24ac2a102609fb1d8b8a70fcdaaccaa2829009824c92771a223d8693bdcd389be31cef8921ca15dc6380309688617fd603fcaa0877b7a91195110453143f2a33272e48f70d99342c05ec371e39e9e4486195e1456a2c8c1480898c6c01a0816843236d825a6259ba9973236c4cad0c4cad0d8bed868ca64346e46e3368569ba68f834b17c9a584e639c584d1f78f13ef0e23d413d7989c34b3e3d137718c89298aadec9a43a29d5c76531cb22fcb9ca711647d64840814cdeb64a39cc61d44b1c4bdd54adb51af15be79b4fefe6258ea57c7ab7dc4f00ec521ee02afbc02d82eb500faeb32b970757a201e04acbd2bf836b910eae4745fd305c9370ad559c7e1711f7ac491c2c0900575b902df7ac4b4e462a0e04602400b836e1ea5471fa3750e39eb5a93e11c1f516c4ca3deb9306556a08b6b20aaadcb34a895962d46008a6b125f209d684741eca00db59062fdcd30e8d4754846470022b30c016075b9a184041de7c33c807c5f2ad7b3c07c1b6c81e559cfe203ddc9045ab375bb160790b3a8135d7a999814b5f40a811cc4e30aa223105d6c05912382031954f704c6ef02977dbeadfcd61a7771bba39acdf8b725854ff27a592398c826122891b10f95409a9a800e0024c63b593ea9e5aba84b8dfffdd28fd6eb9c15a18491009baf15e6a23ec3eac5f3fb4e30fd7d4c91a76ad61f8ce895c28d65a973c598aa557fa546e34d24fc7f17dbcebfe536151f5a228de23e08bef753fb75372e066478404f72c52c4f33eb4dff752427e7db262eb666dd7df80e59fdd5feeefb2fbbeaeebba17390f9bf93473142e731d39d484830d0c1738500d663627305bb600936509cc162e6490f1c018e114d28c08e90d065d6ecda7ed2e39672954618c89c8f5555fd790eb7f9ed77536835c73bcdc7e0f3760ba4c1c579e214887d45702872bc6a0612c6e4043e60608cc10e3c4555bd627624a973172fdb06fd5724c7448fdb34b90eb6ba0c6eddc9061cc19b97e4739ccdf961ac871fb4f30d7f799b8852dd3cef35070bda7b44b1c4e84312387297a705205414312539924c0c0a1c3dee5e7d38ab9e283b6aa13448a1d84b0c207399a188af5dba6aa5391a49c58e38ca727d488f5db9a5dc2208eeb959e444b2fa7b8a725b259bc27ba62690ea3587c8a4595f77df73ef8aab7e311fae168441586a2f821277ab4317d105b2537fb456c97dcec0763b4942918a3a44c2453304653b22deaefee2f49a288abbf903dcfa30fc55fc8dfd3efc1918e3fe727943dd913524adc8878ea8270c2521b622989ecbd134d40bc10d9f39af03c7f8ac1ffa4e45a732da370b98a9866323efed89a9bfd1848713bd3dcb98e6c9fe2d32bc8a1c367b6a6c1967bfaccd6e890fe9e0edcd3c1d4a40093bb6bf7fbacea8814a7fffbc49938cbfd82287a4fdecd93f2641ea51ff820085229d7ed86e3387edf69477c3ead9dd44946eb9a537f874528fe826de6ab81b967cdf7b556777757b55cf9596be3b0efabf68d1b5a29bdb981d23e88b836e10e17f774e55a755c3a45a8909b92dea8c0ef4ad055fe95947225a5387e93ebdbdce450272b26fc1ce6dd4ebb4157d5cf725f69a5b4be97de759c67bfaa72b043fb01614d3ae4abcfd55aab1553dbdbe2891d3589263a90451c65687943a8c714299ca0c1034f504411fe600399b640026ca2a2436b902918243832986913151bba98e0030e20f8728309ac80c14e05550183252a0551c051871a3a1ccdf105115eac2146e8039de288a63052204317347c80d24788800b0d3b84000b1254312204011039d820a60d364c3081b0fab0c1a646518c6e91831a43530841c5cd86dbace9464419b729342aaa90c1e2862d361bc408230a22299828c112679fc3af8f0ee9a73628ac588ad12da6cc68b1b0a5c890b5099698a229165691c374c7e87ab7810496a326c11c47742287e915532f0cc52c2e9188859ec8d91070c967cd298482d1f2d44e41f295e4cbe706da8930e698c52c762cb8c48c588594a86bae916a39efabb5aae8abe883a148291d89c8191db282bab58235a2fad9199a9143c2343b44c75c9276ece81d34353b5a3b5aad560d0dabd59ab9ad566bd522c756ab251a81c3922714a8f9a5a4bef7deb7f712b0c9fdd662cfa9e79d12f00ed36c5590923d9bbd57a166af26f75f373d9a25d04edf7b4b398a5f1ca59ee779768790ded84aadf7a18ff65b375c8b79e8b811f8ae8b2a3d85e0668d400c3705286ed61f6286cf877f7eb5b4b53b3bb35378e041f46f9f853bb70d7ef5789a7f7c08048f36379dc81969e52dc04030cd16609a31a6b9c4343ff7038342189451375df8cb3d6e18992c6965362e9157481a99c54d234aba87548b59f0ccd9065f0063a043eadb7e819ab556da5e41d92b0997fbb9dce5024e70b3fe9fa09068ab3a4e2c908e9352b4394e5d729c52b4217d3d60dc6f68e89e23ed55c43dbd175f5aeee8e3ded3e538c82747be2ded9757e569f3d02b7ff8d533df7a9b6730280385400e774c9d52b7d4e4aa29e5ea72dd9c16bcebfff19fe5ffd71f953a2e4b494cb93e2501ed08ec92c22dd6763537eb05ddb6dbb66d5b72a04baa3aa32c29d72fcf9a25cf7c8f9fb1e16532d910b1fa2ba8d56d15b59272582bfdb3763c8bd562cd613bbeda3c37bb5d2374a93c901f4f6b1be57e1f76aa2b15a87e4e89ecef6f75ab5baddf81ade4eeee0fca35e652ff92fb574c2ea5dbdf7f7f64ed60fd28c4c23e84b8ac3f47198bbac9a33c67de0382cf7129d7ff817d601b2c1b9d4e5246d24eb276924e2b595ed1f24743d34f9354bb1a4d79c128136dde9267737394d57cdfc77dcfd9af04879ed8e76cf984e4384b529ac97efb4f2cee6a3e7c0d71c9a7f951c9fd73e65bd647d67fd8e2d5b3f011ee57986b1207e5fe9afb55090e9de4db27dc935cf9c45a4b3ec9d1cc19f1a2e89027ecdd4e50484b91396e5257735891a9ebe30bd83175c73f47da48a36281cb66ca3dbda551360a612837b9cb71031cee09ca4019872d8ee2de13893da814dc1058f03e4e436369682c0dcdfff8a6f91f6f7f3ccd87363c7c1c4c91520ec35ac1cb88ebe36fb8c2619f50c472a45d1aee39d2c877bdebbd2587d9d7b9e3ce28739cfad6daa74e7ecdb7aaf13c2f2c5f4ac8fffe87e4388b3f204f47bbc241d902a979aea6e67daae72d71ad99efa723a782975bdfadf2ecfc96c3adb7b81bef78f277b0bef5745462833f372d8f67a1fa49d3e35df8fc320deef11660d1e666fd1f5d8a4da5f8c54dcf562fcdf7eb5ba0c33d3ba35cff1479b8f75f5fa9b879769d51d3681dadea784fb45c5fb4655036438ba282d72acf0bd43c82f5981c46dafe395cfe0a9fde120b55052f97388ae77e9e1e2e8f228c4723c7a95dffdbb8a7f7a443bbf4a2c6a291562a71cf5b971e949baf1eef7a9a43e63acc7614cf2e18b82c45464749e3abcb51360ab9f9deadedbf1d9578d214a7fc7f6494c5cd4afbe179ba3e386c5b1eb6f81ae2d6bccd9fa32cecefc773acd687adf28584e6d6ffd0dcfaa04ce2f3338902c9914199a399c13b9e85815cf27f60ee57b89fc4abe7f011fb2bfb24ee1a9bb2136af257cfad4aeec927ade7ca276449922548059cf9541ff80485727d1762e29e236d4c7258a825d71f696396b1a8fec86544cad5da320d38a40043092db658a16c28a5000b116891860c45b13e234926840e4453c2ec1063b2061349595401034c1cb11e65430ea31d8e199d50ae3f1639ecac54b274c94db54044a568183bb8711415c50d39b041db88e104507489410b316a8ce074030a7a906dc9c2c682520f62c0e1c6d2d01133372b38cbf6491fe7388eb42438c443c592b77482f7d4de94c36cbed2f8f83f5d356f4b5aceb0663e6fca07f6a06e40b017e549b9596da629299093a1e464ef6d6ade7e6871eb69feded56a66c6ceac56f7bffbd17c6fbf6fe1aff5fde13327b75ab8e62d3ea1e4e4feefb1c48030acbc10879118292b82b8c18c991123b8d5a2aae012060a38928c40a34b19694c19d383105053ce88d56f3c0ed5e0516894b959df821deec949552837796864a88cb6c74addbd27f7273a0486dbb99e80806fc235c7599893430db973b687983471f7f184a763934fe3c809029ab8d804bb1402709d71cd7156c7d6506764c0d9f69a4bb551e7a576777737c12f0ba34d31e9ee66825ffd4c3e2866311002be09694992ebe0080d1bc93dc13ad928f396ac586b6d132cc5c923a06c19d009cfa49402f427943c3b5ca0675256a2571326dfe49b942e387926659d559ceea326273c93efb10902ca3a2b5dea045c896415a73ac1e3112755ebf384e056ef65af1ecf7de70af0abc76ab5fa3638ba8d5fe8eab347caa3fb55fc48fb926a0ea3b55c9f5be29aaa4e93afcf3d551d1a7302f427e754c14f16d765996627b816559cfa4d703daa38f599e00a8479885a640f1ce6d45080341a75b7484b54758ab05fbfceaa4ead551c8fc80d05564699c34e6f290b39acb39124497a4bf5754c994cf6c24d268b55afd564b21c128922ed930765adb5b53f5749b7a5972557a454b75a2d50e63a1a1c8156401a68f464ab351009a402128159c0a2da226dcd61e72a49c9619d1725374992e3388ee3ba396b5b652bb959ebcc7f5fab65edea5afb24c771dc8aa4f9aebe67bd8fb33c463f83125cef6e0d0cca40a11e5eee17391c85400bad0c550304586898f281a92c400cb959ebab67b9adf0c034cf6a4f59809ab854c5a9428e6ea352d5715299549d133e897c82567295aa3a529a94529afcea81be7e95559d134a294eca524a11e433f9fa3c57b4be851de903c22f20a077f24e4a294e1ec8daeffe9d28a0d0a70b727d6babb56ddbb66ddbefc4c9dbd1483bb1dcb7dea77240deea72a4398c1c6923146a0b471a4973d82b49af7c557651b596097e01311969de417d2623ad097e013579a0072aa5007d930f8a8d3487013510134c634d308d75134c634cca4e72aa3aa0ec933939f993df409990266a6d0b90acea0095ded393777318d7fada7a5b9e5292548bcfa027af24fdf9c9b7fa466879520e5b7db565ddf1e74e8e99ed5f5b6da5559cda65f2b9d2bb41b959bd2737eb1729734fef29b7c65ad5016515875675dcb5736bca3387a63ccdefce94e7adb51589bda82d404065ad3de55aa3d97baa3ad7bb554faa6b3532b3a630e020a31405087c900387213249c050c5047d73706888e8659fe611cacdfa2a4ccec80e9357481a9985bc7d39cc6372877ba4b92966a48d4763d248f31a2873b3825d82426e764d56ab3a231014a7be104b48e4fa6313b97eadead0d8922dd7a6914687d4597d90a83e280387b891e63a4166f5c722a4b13632398c8239e34a3ec72fb98a6352ae37755c1a6d6353aecf5999c3ce51060e39ecf49ef2cc610e0a794f0eeba451e6b02e6a50e64755c725d61cd16c9c32b560035d9009ee4765582326877969b348b526a52c4e36c9c8da8c72f2698d541fccdf16390c34aa4f55c7bfef5e97ebdf347372f2599f4e719657b0d9ab8ff7105d9acfbed2ae03be9f220df91cc70c6247721cff23b7f991ebe0a324250ac68c32cec8a773c9ae84957cfa52194cde94dd9db2fb187fd5d7de7eb4b3c63dad9191b74aa5527d59cc5c0b3f5c5c3065f0d0d5f76aeeaabdd501fe57bebe520af7aaffbef205f47df8612925fcef8362e207c568a62f629e2bee29e60fbbf2ec179014f1c10f8a11ed4451eb05b5d65af3d9d0fa2215b168f1e71dd4f28492e353416b5f54da39c1856243ee4587f967813ed13bf0ff44157e01a940d0821fa63155ece3823aef6218e3caea266483021302a631ae8c24304d19a591a4031c6462240c4c6b9041458711c86654a89450420581313410a0f182982c3ce045952ab450eac00f59989a86ca4cadca88f852d372a34213348236de98e386196088630c9da38c2598ac0813c3100e0628810411942441f2461e85136a492520392af2d9a111e598b3a177b5ac85fb99e5cb00349642c5e98f40508c00457876601fa4e420001fa4ccd1400800307800bc094b3e4839c2079112a400477e42084ffaa378e654705c2e9fa27744559efdf6ddf6f8e10231bc304612ed8a242e415342c0861358f880450a2362fe393bb617422a72500113b52d5e4edbafa163b93e5f7544f8f2eae19eae9c28efe2d35a086ebaff0b883b5a37f3eb487dfb4a9ed4d27e12eaa6ad393935319cf08010458081e5851c825ed0b2061864dcd022045fc4fc7d9070deb511d29b2b86eeff509f63bfead832144b70c57c8a99ccb5ccd93173de74e5b814b7fe28a1c9f545c7f1f7b2049a93fb53e3bea813b40317475e7c808d39e8f8c1c81628c820823a03492a1664c3182f7e3863046e7c3144cc7fa7ea648006830e3f4c11a38c2d76f3cc087d016efa0920b80f95420b50bc875268e1fb6a396a7074fd39f8be4bfdb3ff0936dc9f71a1854d09212dcaa8215666e98c26d6a06919c314731ba2689a32fb824a191e085aa28c08684ecc90051d4e31ae46e48b196308f105140f5e829600a2062ec60813c316b76f304b187103134a3481254bacff5e4a69adb5ba9f94d24cdd94b5753a6ef98154f1579cd08a948b112192fdfb89b47753486f4e1ba75cb36429b296e31aa993462334df353a36f8744a8a9bea644e806236d65c77486ed6ee4876cf2ecc06177c2f548d717abda66ec79a1c511e7abbc93c7ec7a579d6d3a7ff36545c3460efc95ab29bec6ebdc51470a9fca4bff5adeff274291ad5abb72bef06e5c6ede79e7b1e7faeca2d40ef4db90e108fef6d3f50ebbb558e34170dd77a54e6f13e2a71272319320f1e20ad1b030a3568052402af744e5d981d34f75b1fb630475a4bda33e8283fe927dfe23f838eda61a54f3dc912caed906ed91d75463b7ea693d594dc1427e5a60543dcaf4d7a515e25675833acd283f2a2a4bc29376bebc77b5a7a225f74f480713f5b1b18aeb55d02f9fa273814964f57c04fb305ffa33c6bf28fef4bb31969a1c594bb3e3ed23eef0949e715f9f6c3076574ac71b34ee1ca2d405f500f1dd7fb9aa7a12959cfd171edd73ccdb39eaba949427e0f84e9b864fc0ba526d7944f5e49b8ffe8d394acd25ab23cc5dcab7b6febc9ff693d29e5e6266d50b633abe756dff84c21affe2f06f2e37df8f8814b1b7c8ee5abf5d4cb1ef885bf04854afccaab19237774ba331ce7726150e6e6500bbb6c5c2e29ee39d2baf498dc5c1abf843e45a64d1da0655bd464c3975156875c5c6ebf8d52f396a18f017d975b80ca6eca1372db894cdea44c7037e538f53ba15cdfa392eb9fdd6dfca15255c7f33ca32eef7f3ef3856412b24e74a89165483f28855972186b8ea15c7fb439acba4e8dd527394f2957a25c1f14a260e8f8923924b8147437ec9b13b3783437eb1f19b55aaf427b471e17376b52066fdc9e1efc651da9cc7d50dfd337268c9bb5691c1a854619061fab5b53cfc2aadbb75abf64090d6753ab00c7dd04af1df8ce48fbefbbd7e687cb75de0ce4a90379202c6739cbdfbf478f1e3dbe85bdc94daef5dffa7f97eb5e97ab2ccbf23790c153cab2a482423abd2bb99eaa5bae5fc2735e6d8907bfe46d7946a95c6a452425d53cc0d4cd12cad3a33c25240fc94d2587f1fc92f725d739e197944bde3b5a823da42f77c99f9e515e527a482b278779f0f54dc03f5fae67f0dcec72dcd7252598c03d06dc1b20c786fbdab7746d161cb98a9c28738f7d76e343372e6395374d99fba70b6e17bc079ceb0a6995428e5c9c97438a94a7cbd5539ef7ee94d435d8793a1a19c0fb783f0c46d2903092fb5146797a4438a859fff47290a734c85b1e95949b35ea043c0a398e0c0e2f9be6d72699950c2453307544bdcd212866f0c63dbb294a29cf0a940e613dab3c2fc07a027ccff378b91f3ccdace7f99ed89f1e74f06707f9cf21b92ff0f9d347ee1d63eee7683fb594078451c8a68f6e378bf52a1030a5436c9e1b97a8a69ae2d87cb5f95879ee6c906dbe039c6cf3b93c4d9c6d3e039bf7296d7e4769f338df8d473c789b0fc34fecf1a7c8b77afc813df98dc967e1d366160b3b9a1b8d90ed537bb06863a1669e270056c1cb3ca5f885e76d1e86cf1e2cdae89022a40a5e26cb73c7b350f38e1f65aee3430b89cfd6931fb6b004541891e890fae578e4663d8b3cc92acfa0ccfa163ebb85cfef613d4fb65aad56797e0f7bf27d6a0f56414a6e912ad49ca50896800aa3111d527f2c92800a63111d022b471acf1677c7b727f260d1362e7925613df9ac274b21aa4c47b30783790034dc739481dfcff3364faaa6b8e7c1dc8e010c5d9ae7be86fbd7f7cebd094f4be07e49cdf14076c93f455bcd475ea1656179064110048bbc2c71d01e16beec236aca610760c1957dfce9e5531595ebaba4288f8faf0f8e47c21d24f92ddbda81553800fec86fbd8f0fbbd1880ff24711823259da8c4afa6b95aca7e308e477098242a0cc15862c8bb8596d994cc1d411267bb621d71feba8e5361add7bb097e9b8d3ef2a28877509cae890fa3c415c12ef3c49f6184508caddaa238781f0f55548aa2415178785f0f555358719f9fa2a25871df9faaa2587fd7c7d1593c3907c7d95cd6149bebeea8bc30ae030255f45709a7d5f98d857976db479de0d00379284afefc1085fff1b725891afff51711801befe3773d8075fffb3e2309fafff11392c7ffdef8ac37abef27cfd2f8bc3605fff2b72f2d500e5699a79e64d284f97ab8472664939e33d81331f8280c927128a0c019346307904933f788504af92e05501f04a095e89805756629824228bc8251b919caf2fde367857ce9833e69080470f46c0a3111e6b04c0e307785cc263c6630f1ebfe0b1098f61c61a803fcd003c062ed779ebf96511706725d87301b0e724d833124cf30fa6f908a6d908ee1c02ee0c02a6398669ce98661f4cf307b8330170670f30cd4570e71e1e980de6f28e9a2e7f4ec41bade22d570edef56597001e882cc7711cc70150b9dc0030f93b18a6834f282e955bcf7937375b25579e504418f6a0e8b8e42b398c2c2f49beb59fb52d1fff3ef2b3fd71dcf759eebfffbe4e6acb61baea009f391ce0d3cc022803804faab4013ee9540e3e9bcad94654c93bbda7b38d34c027ad0dc12775929d4d3bbb86f1d94e16e0d36519e0f34f7ab6ec6c0732d25c86013e71b08957e81c04afd000c0279dca5e92c3b878355a3da323246bcb77062a44f97ee8d1aacef5ae38ece51342ad26b33cbee67dbc82171177e6c9ccfaf0e21a7c49ef06cabe3f4799acb3755f6a77eb7dbcb3e5dafa9a5bd3badf1233f9f7d6dc9ab2996822adb7f8b4372bdc7d7193cbe78fc07a1e1fd2f1f6c963877cdb7a6e86e3bed59ac1e706729f41b939fb2b927bf21ba989587034c259fbe45bfbddab5fad288957df739d130f23b7965d18377980b8343f0b933b9be3d4ced6dd62ab55763637d27a8bad9bfde5f733987b91e45c33b030cdaffefcaa3bcaaea9c53d0dfea12d7bb2507397248d9c9157686c66b83631dc196c7cbc8dbdb1ffef2abd9e30ee39d26a1e9489b72523edc9350348258f5d82431614aa40cc5dfde93d81e34a7498ad796fc92df73d62dc5274b3cb2058dc703c7298fd51965bad9f69b54892fc1fee49b2bff5345f50fe7014cf342dae556e01fa913ace6a94398c66f1e62db939744fefe985842ef5b884f5b7fcf14cbfefc121372b17b6c69021f73fdf732d4c929c25310f1ef7edfd163ea5e4fbe367b00ff1c6c63dbd272037ab9bf5379822b3e5d8af243aa991a6e5eca468e2cd4d20df2548c5cd0acadc7c1d714ff126de1cb66307a67905cac64f1da8924616723801c61c0c80aa6931c450192dd0b885ddd39b33c73e99279faa3c839e44f1fc7db8b30a3f513dcd9f2acb71c177d9927aafc24fbaeffc7541376451d4650d2b668061820ad31007c2188289376488f55f57bfcdb1480c8569eaa61d2535edab551d14beaf74fd37eda30d6559526a5b760f3780a195dcf4eedb33d0e2f64b89e7f4244a99c22be6df45aa17bf09f85fe9c2f7e0f7a00be0abca57f71dfe966873c441471060666062fedda413248307ce68a28aa3a5127459c25d9be3523ac4fe9733d0e2ba7fe5cbfba0d80960f9f2ca12846a6df3efc3ff7e2ca5802f96a5149f1c295faa3ea75555a25071ca1d57a05073a24e5d734aa105142290420b28444014a56c775dc7e5541d956d7ce3a691eeeeefbaee577759f37d1fb8392ffadd0955e745cb9709f5b907eabeb7e58bbefda0582dbde7b8af0fc47d7dfab5766f5f0a57be68fda05823c9d9c1aeaf38dd238b0f4cd1b40c45d1030f5798cca0a50e32d6c8f2c40e75af5038c0e6043636b99f0ddb1365bf7a5b1741f51c9d9b9acc95ae2d5ee9b2aeafb3dcf74192b3c361c17941b1af7b1982623628f632a17bef81baf76a09649f2ba57852bffceb57da4e21fd5cc461fd9fe8da214c1d47888164441d1a7459428e2fca8881c88b18fd4bdfd54dfe6148cb33893ff5a73fe48d4b9f0e71e3d2a743a22e7d9aa9127f5abe5c6e76b6b1e1be961e665d9eb08501f5031959844102281ada608204b1feef376d5876c8d44cc526e24ffda17276deb4b9dd8bdd63d344c2b7e91eda44aa4deebec71fd2f4eec1948805748867307b09b4e2d8b27bd7abfb9aece157571e69a1bcd9a5c6ce9bdc143e48727638ae6f9eda7f61b9e7e71cc7f1229e73fb4f21b57cffc9f141928345f8fd0e16f7eb6a89bc713b5fb7ffe4fbeebbf7b8ff3eb79fc775b51fe0431d6cd4d1044607c88835161e98204344136acc7888f55f9755224bee9e1261658756c37521502511b8ce48c771f4c5bdea69ecc5952f13c2577d93f055a50b2e84a5ca05b0a4a553ae84e2caf4edb8847b5a7267507649a14eae1c4a6bd4a776e706f2a742cd5d47e67edf7de593eeb98e2b4ba5571237caf4dd2853a39f2cee0e2d535aee81458eadf4abc3dd5611daef4bc6e6a79642dcf32feddfe97fd37e6ed23ae68667107def883fa598fbefe4baee2c15d5bff6345620173729a594760d4c42c3e572587b9fc49d505c64baf531cdd62ed121cd0df578714f8e967bbab85c3bceb454d9e8907eb088a38d40c9c8d5c5cd327d1b820ed7b95927257d7928d30a26b9d945372973b49ac7d4ed6071a97d429ffbe6b9d40b134399a3cf715434e376e63edc1f7a4ff193febe7c29b1ffbdf7f6bfea71df54e4a8cd54cc1928a045516609266a0822420a044f3c6561060e60c4fcdfb46ed46f1a73c1852280b8b7ef82f72678df7d02bc9226c0962f2f633db2b89fdd7d04d45258a5d4da36ae75809723b280210aa137ea88d1137869e206c6873222b021e6c40441cc408707a8e0c01131242f5e70820ea8379262fdde3584153071dfccd979738bea8ba0fd67948abba7dee1daff7550fefe87fe5752163a7b1f14857bcb71455cfbb6dca2faebf67376dedc2114a13f85165088c0021c96420b2844a0c1dab571fd27d9aa38f072befe3c7ca3787e3da1ef7fda92be3fcdb48c809b0da51f05571d3e48765c71fbfbee7575773792eba25fcbdc0855ef3b5880cf852a2f4b48e5ee551fd69f0a7ebcb8e111d577debfc4938ef13e05d7e927684296c6061dd9875c4708acdda2b25bb991140c1b4fd9bf695de46211cc295404dcf33c8ffc552965fcfb2bbc838cfbfdf9d5ff3e233644c2b8a7eb4972a4b6525a713c4a7da2527d87bf0f5b497d15fe3cb799566103cb018c2e90f8a209a41862eed2018d59184d78e00c5acc3f05ff16fc6b2df48f8630ace0e7cb8552734229edea8452533ee1def6974fca274f6af9eec38adb25ade22e420833dcf37d3e21b4a64370b345405281987bd6641d6a93dbbffb7d5fff74d14d31ae3ff5cfdfdfdf702fc45aafaffa9ffa2a55f79ed7d9f7a9ef30b3dc027e8de3f4b74dfd9cfe9dee37fbbda4172d85163ae6bf93f3952ed4b7e54763377bbf7f48fdfdbb2e570df7afbfcb9f7eb636be7448b75ba6a65d9e50721771baa7986d4dee9ace36b321240bb9deff0630dcfa626e7d223f5c7a6fdcfccea0a0acc29fcb867e24fd39fd3bfdb472096d997e4dcf17f7a44c99d6642aba499f76dd0a5ef75d7972ef0fa526d7d2c6e526ed812587fe0efda76fd61f28e662415c0edaa9b8e33a1c50a782b657cb756e5b29655a739376bb57aff1be4fa5fa3e950a04c350145d23b9badc8b33a29b367fc3628d4668682c20e27a79d664fa945a6b73dda4a9198fa8ca1d620f986b3f6c893d5d5c1ea2101ea311d35a2136c77557e428862e5b5d2e97cb9bb6c83328bbf22a7b79362073a5dfd1c8cecfc735755e186f5ac99e2eee69bf7e4f17b748be39166d990ac93f544e3b467ebaace200dce1a0fa6dca91e38d483a3e2953e725c7a7cded7b2fe548da44ce9bc51e2f6e4f17d77e4867da9b32354f8e0bf9b41a7f54d97e78ef68c4ff8e485a90c964305c56c862812c15eb63b1582c8fd5712c16cbb22acb9be5bf82597538709c1ed2e59e1ce4f6e720f7d22b897b45dc5a965ba27214cf6528210596326e7208217332264c9721226698c285e5fe3714d65feb573f7f973ff5fffcdf2dcc5aa21fd288822a23b379d16f603901143ed4c064022cb3309936013121c90089fb4f29bdcd869e6c4456b80439c276739a51510a000f191cd1ee325810d72543cec181524ae949c7e4ca2a63ab13740c755ac097125872e040a3dd2db8d93322974935139220474e37292adba26f2e1896fbb49fa82dd3927edfbcd0a71c86b408838929546ac8008a284c30c60c0a8a2662155431822ed8484115a51200a1430e30660c119514c77fb9bffb03403444fbf6346ba7750b652a8546a5b0a3c5fd77fa4edfe97bfbf07e42e98e524a29ad7e25db0e46e32ca5cf46e866539b31ee750eb4ff8e520d422a9add9498ea00152d3598b145690d35bea4f125d64ffbbf3040980cd822b5258827aa7ca00828c01411c715b32526d0d0820b160e84718496a2319060430bd319371851022cd5abcf11d650d88d48755c15c765babe1c6507c243bfab9f7efdc572d672d65adf29c1fddc5fda7e573f7d0384221c9c98aa603125c3151cb010838c19496851527d6e1deb38aa5cb12abb5e8c10b86897188eb83042c308252c62dd8597329628e388250e485146d094316a1ed0224695a4132c808b1629ae884086293ee02ea434ddecc737405c58fd5aae60331433fb7fd745bf26a3dfd54ffb3f28a190dc7ffb5dfd5f4e05fc6fd539218b2488c6a0e285123850995adaa18c1ee2c8a20626b1b4c08ecd654508c4073a0510b59a145760418692932e3dc8aac021040e525c8085146a32dcae3c51d172460a22200306076c98c511a51619f1a569cc1299378808030e2166e0020c197a60e1075252ed0aa9297e58123247133610e5002689a9fbaeaf7ed7f563829e08e3892d4a70bb35f1c40a432009d144041541d01003e2e50a307a2001961faad0db0f28b8c1033570f145159d06f5d2069521a680008828cac42892182f686654218b82030321bd71d171971801c3162b5e44c14105074e10860433c48102a52e625470b1c20a5b511761baa8d003192d627870ba4d5180f8b958b8008f2264b0328626c31268ac86ca58d9828b097e488a511daee0d046184c244111a3503154a152858d0c1251427a13b6cc895ce64eebae7198998afd48fa73fa776c2ff1d3800c7308a12145982bc2c4681862686b8c99818820a288d1bfd5556f280b648408f91bb3821f2fee292507a199a844ad3396598c2ae4d48c00001004005314002028100c078462c1704420a87aaa3b14800e839e4a724a18894449968320640c01001060000180006300cc0cd1100705f058f8af5172b7905aec7a66a5ed88ec949fa9f2d0599dedf6632b92179abb95b155b2db8a6c4ef621442a2efeb9dc6fd0fb5236af3579753666604c1a8a2441b286ae6e073368298c6c2b179e4f3ebcb2b42c827a63262fb9accf7472f2e383fa3605f42eecfdcc9f9d06d8241f32e978728520d9bc711ae06fae647195a203a88ec748dcc999cd57db1ecfab0cc434358f43007727af675af90dbcb622964d72c94b800eb26807848020c20d31d590ff84db25e1ffcf9219145250c21b858025927fba595d22a557075cdd2a28d15d436995bfd297f10bbcc5e475c5bdba2056e12bb274d44722402c2e8b5dca23ec25ccdaaf6608150ca0beef43cddd299805deeaa0dbd5a8bb289856dd229410973bf8c44decd8b3f508261de87b8a7b686eb3f44368729345dbe3c2e4ea4ac3fc6c80ea45fb21101ff961bb856dd9df327ad5f2a32a0251c7d7a239f3fcaa7680496ea8095a949acdd0dc3815224b571cc16e54522db4e48ec8ae1680514a0c23dc4da109b379af85fd349e7a60d3011132ce65a1217f4869e4d9c9367a56c5dca1f8ad6ed3b919c0c5b62437936847578fe7befa85a559647010f1de7335789fcc3807bd80d3bc1ad73313600f0ead8adc3ae40cab9f05bf9eefdbad02c810ee689313fd1f0eaae3b1210867c2b75b59da85ef5f2dc35ff153e71692838cd9935b3a6305d5bc1dc681efdba115f6af881010e62ba7df3e857ae1ff573d4c5d75be081fb69d00625947e59d19cfc0c9c0ac91bd9633c2cc8b1df6dbf2ccb95017e36ce6d9e9db360fb815acf9fad5c6557bba89f473d8d684bb42ec890e85181f518bc2a234ac8926914de4b657888739c45c15407570bdd9f505d241917985436b7e3a587ca6ecbb39fe706be06d6979c1789fbbcc002e8de560fbe9959755a1409dd876705de40a1efc74624aa7464e1dab31fcf864f512feca2ec2c0f710e26a75924ddded1cbc849cbca28fb0950e473c60a9725051da93250d3a11887ed99c949a50f50f31055d08f652a40d61ba73366f0c6bc058a78486ae1258fe8535fbc8e6a6d0adcf7d842296ca72be284d0ae003b473a9a74b556c97d1362ecc6fb24b73f7a9d10d7feb5b6e1b2b683d61ce88300e150cca66b4550661f4eb98e391b723863c7a2a149515e347395a39d594a56ec804c899295c99af62d684f2a48113da28b14803d6be4ea74cd1eea1f4fba9c1f6eb1b6ccbb24e9917d66de49316516b6e6a4a3cf87e0d45d9b779b653f860426471cbb8eb8766093c8cf264a12d4659503b738721f4bcf9001508976119b4ed293fce03f2e95b1c4fc2371847ef728a6624e900779f3079410e71db30ae83c006901e76b12d0d9a0f09015aa5c743326f916c94667d726a8affe022fe10ce2c6387bf08102bb105784979ac049e9dbaa7ea9d6c591a4e5f89a761c6b7339527b690aa584fcf90baf5a307f602c2bd781c47e2ab7f8af1fa89a777c8fca605f1dfe31dc17dcdcb8aca073b06b482321b6870d91ee749ad7e4ab507d0570dbcd3df0071f9a364f056502e6cf7d819143f8adbab02c0f038e74b1cd58e8902cdaba63c755a5921420e2b36035e4b503b083362d6ab50add36c1970a9bfffe7d9d0198a3d6d71a82ab647a30e25caca67961cf3a7fe815e0d8a56d77b19fc6087821242f83bb04f735d4e08b83d1066f51882936408c87523e9a8664aa6921e7d9fa2b44dcfbc43532ca267b1f6433deba724385612a46daa37e33e41f4f1f00cb74e8aff422901cd7b84ba94d91e6584cf041a4616c9220776758b710dda15069646b7ab5a8d994c3e77774ecc28f900b96542552e6e64a1b870532d4b8c33440dcb138b186e89ef2a383dedfd57a7ca28eecacc6f9bbb801c7da1d1ad8acf512c5007e89f1983864c610233f3462211da5318bf26e83380461f1da4df50155f76c2a9bbb47fe35ed30bd9f8220676815e987dfdbdb4674f6305a45ba68a9e64f6ee64a91ce74f32ec3f209426b3c8ec94be205a838549b4ced7e93d6974ab3e5eb0e5f32654b6e56b0d4618086985489bc0443c94400a78d3da630d0f706b05d197c5b9df4158faad73e70a7dddf88f4354ddbd4932d485ebaf83d97635248bf28203b328aa0da8ba8fb89f00312d1d0c3b9a6144176dcec3c0dc74a1db07d88243d1606ce85ce759af7e595fbc21e3405160bd1b8fc75c8d15c003fb72acb6448cd3ce63851b93a0ee29efcf9b6bf750e7612cff77bdb6fd096c74fef8f7cc677c5b8f154371c848e5b55f75c406e0b767ab012169f48635dd5ab5eb56e51078e2ebb6d23f4dad26b8a2b048d3fb165b10e5ff86ef126d1e864bda432bfe5bb213f243f547ca0401c0a370fb55551b80a7ae3013f4da40d6899a55d5589163d3ea4b666086e39a9dc20a0b02a29feb9b639540cdd1e50116d30133440d8782fba09293426ae313f19a5fa49c1a9285a159c10ff2f189c1294e82dddc9a2a57983e70798a5ca7468c1681fec7e0e877a72b4e107de8fe9a8124b474866fe0cf24fc325a54e05b4ea32434783864fe598aa37c393913fc977856b422eb20fbfb4606a2b14c86c4180fcd71662bd92d04d870acd2d09f732991cde887b27544150e073af2428acb11e99b94a1eb269c3da5c1dbc9839160734c53f4755dcac0ca16c35ce362739d925badd47f0bfd7839bab88717a9efdbd8b1278ad61a2151f7f38fa90fe12eeebc2114bc91feaf53a6fcca327c0e1aac33bc55f439f2cdcd24bf4a48d17264a1805c02a0a72dd976188071ce3ccd84cc2ba256e3e95e6f0ec3c8fbf5e51796b9167bba2e6944ba2302cee108174b45fa307bf8385d86fe4aa3ca20ac7c3bf9086a0bb5cb932fc3aae9fdad039cc54aca20fc60e8d783a8b1247cc15020d51ae44b6a2a1a52936a004a1f666a4a5f03b792db1d014938aa8d03959bcedcb959d9d6d6d9768a1a0950184575ab343f0dfaf85c405d7a14b0bc0d39277374522c45bc2bcfdcb9a9020040b462a7d2a467b804a8ece461b972be32d1dcae6daaaa98f28a7a73fb6372ed2080267ee38134e305dd2d46f7ea3387fa44614097963376c3e55717861b9b1f8cd3faf2324abb328773d591ca89ccce988268b2208746971a7e1a0fb415c231f7184b317cf2d915322901b024ea676d91a5458d48a57270ce5d49446307ff38d5b10160afe8b2a8bde78e6a205e93a500a16e72c57434646035925a3b4723df5dcbaa8f0fda16a9c011a7c3c1032f802e102c8228967c971f264b9506a705c624c843981472077180d4869c2f760290ceb31259c026af54833e02af32751610207fc921951d382c8804c639d1c2c7bbb3bb1e59b8a47e81447d82e7dab748a25d95561ba7cbb4a94babe50c5379713be3675ef1fc8f7ebbd1b5c9c79f0345a502bcd102dbe1427efbc97024a63cb87463027b34df768026242568d7a51c217c9ab600420cc511b4fe38e8abf50ff731a151ff49c84906b273d7b8bac6c0a6c440223892b8638f2b9a13bfbba6fd32546faa690d4c5aedae15f203cc8f57aa5078db5c997add41d7169362e4e195f2a4b5bfe8109c5cf8f88f045763dae77ed4380555584ab822d55a865f4ca5ba24b25d5aea150c04d51239fe9e8b30b9bbd65201cde64de6e1ccc159a74eba95dd82ea79c387357082e36eb462c4f55db512f4e544a351d2c34b512177b56554341ed4650b20998ecdfe87fcd24e81eda63f3aad4ccc857e34b4c8b14cbe75ff10e6a5a6c20d2f372a60429a394b0407e550d0f0b4f5d0d8d717f71f050c862f5e9f5e123e68836938a465042dbd14433325a272617166012645e7d4efb0de7892fb6b8bca5cb911d8d36ceb1f283e854861b011fe24f8ae0d90e18f0c3d0fc352cea39155deaf43d85073565d5bfce6b492cfbba5091ed9e8c44116c3c680568622d72c2b527dce62c8b122c1729f0ff8cc72a98b60b258c45799daf2be7da84b73c9f328195b0c98ef87dbc010475bc838e293d02713a4f8a6cbbaf15186eb74e6b1bb4cd3329a8b89fb8152859bf99e24616d99a3d215ad05136c4ced654b04d8fb8ec6065069409e1ff50c1d306b295ada2a346bbcfab5204c5f4457f718c9dcb95008db0c0985deb042f479bcb5ecac87a3e570f45604d41f8a54d05da35bf945a6db1c95ba8ca357991283aa08fa6c2019e18420954626213b8d37c2527c73c1c59bedba040de4ff6ccb5ef2bf88de97fe13ebd1c4b425e4730e33722636cae97d44e71bbf8205301b2c4d3bdcb47fa7925e66a0a2fc94df9c89a5ae9d729206ac5691c7caebddff5434a70784ebf122a2cbfe245eb5f775d3bd78757e822dd5fb0588ad5ac0a8227b318b3b781840cc513ec628b3f9285ce036aa803fce96fc782b0d31bd123707055d877e9b15c54c29f085bb4b9b3afad6e5b8cf18033eb3213afe8944b710dd87e950a8b7ff61ed0240acdb01be62d00e27866bcae2149e552c05d6e5f68eac02f5b116847904591c07cd4774db16871ee73f4a673a5ae79e25b58d545d13420b2f906607ecd1007310c4437d6d095031e05d322709651c5e2df0f11bf0a548de4d2973928a66cd5592d2ed6bdf936f3941be859d2924f4ea9484df5fe68e6efaa11b687e0c6c0ba20d1f8824d0e2c1a6778f1491ee71428c4e25ae62df81929fc1b7bc8b4c1a536da8779016215eb5a292c48036af13f2670280d49d28febe3f4f8a6c2ba359ec8042ee959c29688a3bfaa895356fcbbad3e7a490e52e12e6ea5b807a7a0fe00958fb6ba451db13d9307ce4bb3e41d4fc61b06d56a7601fd70f45f21ae39fa95d090bb934e947088fd92b3985d217cddfd726055435dda84d7e0ec0229e798b5552f82d09f7a26287d9cc5c646a23210157ee5785f2cd73b4b340697060cdd41c2b249646d4e5930c3e72f165644de83ffd27dfe01e7c131b043229fd216bbfec84a9e89df75fea612405d66ca776e06b6efab4feea1cc2dcb766f125fffa210776dc57bdc1877f8e4bba1ab0c6c4f16759bffc93e5386b5a824ff763ba8d665b097f37609d87e5b16d5679b977b1c45f38e9b82e105e1a3e56658242951f71ed6afc7445dbb353cf7b5bb4eeea84a89696f287380f4818d6ccd05deae504e41d00ef554d8521f9cdf367449711019014dad6bbe5f77268d762144043ea9d28f90c4ae7571075d779499b103a62d902f8bc91de7b3ec652e826ce6f09fc9a270bd1675919f363700df20b5574b31efe0047c7a25bff50a83383fdda0871ccaf53c397552a29ba1d54df3e40257ad072d186610be387d314fa156d256da17b3df84999686444e7247490e535d019861976bc0f094da157cd71fe3d48a57423359868037c0e73ba25b22c26734b389872cc20a8dba0cb984ab74bb6fdc7bfd986c4dce4b04369fe6dcfc7c1493ea5b75d413282480e6ec5d7fe1d108353825e6429695e1c3df9e9c1cf66524953a907279a7ad09461f52a4402ebc568af84979c759f823ab3f0d27753944ea3eb71cfd0df3033cf9b0c5f444c987d7421ca201dbef7be83d4065bf6b0b7c1310a063a43c93b7b7f7e716fec1218f2ab8787c2efdf966b527359de9716aa0acd59d11ba6ae5020660a71132ebc35a01ce5fdda4bd9fd1ca574953de959953c135dd75b5aeae57679463f67b5c418e6b0a7cbcb69f742594c5493662dfeb74c12188889b2fd3635f7fc6ddabab7ad840ebe7bc2538cce804ed4bd20e64ee05986b1107b72b2ca4d7a54b66e801a89ad63c93d13f6d4fbc326999747a412dc71e8a59df86430ad02f21ccd40698deacb514b1cf0fb8e994e30dee11f454eedf4298b8c2a7769ae025bc27824b2d4c2df02a42f50a1eafb2ac8bb83301a9e5cdb120bf242f67d9b06bf0410e0a04531f5701ae9c2502655122f29e95dd8cc8e90cbfa98ed317f419d2ea23ce1b570880983917a08477929a50992ce8f2f2c8063d9d8b2992f15e14fb4c8297e4590b7c6dcf2b9452d2d100947aff2399c7724948fb1b829e732c1f8988daaca6fa90e04c81ee5492bbf7f6b58f913a867764fc4014a8ca68612d71f3e22375eb0cae545597c2ce6abdd8e208ccc22549d5151532c8d2a96284dc105a9cd698b0290803e573b1a17b942bf949bd08c4c6a668cfc25e2d6693392362cc12f5358afec6ad14098c77b76bc2b62b12ed57fa5530e8db524ef2bcad2231eec66e8ad757110baa46bdcf7726ae824fc0b2e22257f3862c017877e97ea209bd6f403cd4d5995cc9031cd84abea9e82e0f632c168edecf805d6d8150588290d1d0fe55a42ebbd01b6a8f8f95bad7375afced56d1d8d9a00a10717cea3ecd6bb2d50e6187fd04e3ae6a5feb509319ce2170f00f8c283696067bf2528ba6b42af2bf11be93233e8f7eedd799656d244f348f6c3fc89fe6d1386ddf5e395e302524b33ad12707f8ba7960b6c256a1d94465f54fda9c3511caf42b879f9b4962f70f5a339826aa54f9cd0ce42df913f48928f0c7a497e53008b231c8b57f364908418ebd89068f9b3fc48e654ee422f63bf91a5a9714b3c1d09f39fddedf39456fdaba7b287378c92a6c0e0b933b59aa699f2532ffd47b9c737212605315907e92133a6123b49fffb011a7bad540f6e7602f8f84de9f3003263a92023648b4ac70f69ae9ea7c0c087148efc3e02ac4bfc66e27523f8f2f9d9176f06400d2720635b300f81179cb7ce5197f1b2faf017dcd72cb9535accf137fbd5d72f58303226753eae0fe2c4a74933769b7d66a5a82ba0faadd8fd42a16170c17bd3f408500d4b9e94c6c15d3917794e4c0a550d13d2915ede213682407587b465893931534859f702d6ce59b7462a918f171e4b6a4557e9829f217e2441526b0358e57a9ecae813486db9f14e72750c32df58a9a9dc169ac86caa77d2c207b83eef6d8062a424ac35eec5dc8526e181c803f36b8707946478113ebafd78dcfe1ada52f6173abc15fb874298c1ae41fe7154f43e056eeef41d2ea001d81212fdec31fbc27d0d7c9be531d238b6ee18ff9c3ed744c13cd14136afff68166c6d779497fe465459ad55f05cc62b03b92a6ae69d93341796e7ca3f26aa7afcc40219a188714449b5a1e1537b7bb8a1cd0cd332880b0ef052975a60626bacea9ce44e2613d0205b387c33ef8222136cc04df7b63fe2e8bf8516e3bf300389bfa75d198f99b500e77a62c988b103091c349a7fbc397a3d0942b316e62af44eea2ecd9f38b7305127de0c9a69fcd885fed4c77626d725ef04dd1f3f2415bde1ba6f07f15732e204cdf879e5d0ebbf2c936133ace466d5170017b19993f8c58079bc983c0d46e4139a3396330cc47cf633e0c4a8961f17753e1954dfc73896e557eced41762f22cfaff0b5eaec5f3ab78a0a7fd46322286a439c9cd59ce63d763d34d104336fa76c749aadc94109784446438adca36a0d9cb20af19d27d0bec70f96bba36e8f6fd3e064091a4a1a7d1ddf6da39519ca395f51553f0fce5ac8e63c44c5a15b6663617303455ff389c6b40048f490c1b0c2dfe43250760bf923b1e8f1c78e655dc5d15f45c527af82cc6960722b52a0287e13c113341ea92d455fc35c5449c3768e34943b3df482bd60af57f222ef8eebbabe398b3683c160d13a65d89193d24e1afd1abc24450a6526349607419550decb07e2c5fca54160ff87242d481329a4b3df535d13687ba9454cea4fe5ce6eae24a33907055b26ee977c2becdf517cce7fe01ccdb7fa14371231f0382129f5254245a3df419178602965efe420b9456b334022982cf366a954a2491b363487266cae0ef4bf86f5453b7460c0a37ba2d7f8b572a13472dd497f13eafbe118d43513b69ad84b79d9da955f2210911e9ea30d46416bcbdb44a346701eb46fb326a3d0162bccdb8d502d4545f5bb282b193523bd432db366d484ad1afc0d3cb9b8206abdc1fe7bfabe8e8ebc8212b1cad51eb2a8739de819f519ce9a22a881c97181d81715cd2de48fab1ad587f072c55821a68c8fddc25c3d327db161c1feae94a5cd6ac44b37237b33f6bc431760e0b5af3c0db68d8ad07ddfa7748d9e664ce7596aeb6c2893279e192d84fe00383bd59f3f748ec49bdf41d0338c5be3402cfa65e40f4ef9c48c07c42cbb570c00e1c6a223f7f4203dde17d603cd6361f2ad8b771fa4e26957ed1c072b613584cd23584c66a4e8825f6cf20df3b75d46e83b82639e86eebebd57ab29f9d9fa33ec4274646086e5fa8c1749659f0ebc1d4a4a2b95848207eebf7843acc3f186b0e9a34a12804b2e95d7afd28c1b63d88e34018f9af0a22fcdebe2a1cbc168651510239024d56a355229f5f56422c4bf1c71283ba6985821236f99839a93db87853098a2e0f8f049ac35ede693f0f1df719b66147f9e1f942efb38e100168f65369f6da5d60226ea88a22bf784af8054b0461cd2e56bf40051a9c94c01a444850b04be0ca51143c4fd7b809807439faa62259810c210fed3c07629f9297aa346589d75d82a9bec68593e1e173d33d79525858e00cf1b7c3d1c8566e3b404a17436660c8d878cedff068f6ee375cfa5a731b01e7b17ef81c558072441a07b600874012c5071fba990d43600b8dd855b5a51dd6a5a67f29701e4e181f7dfdac23597593b610497210c438dd3b09130b0a861585980927668d3690a67701959c1699aca6b12f31ea2dc25dc0ea6aa94b0c910224f9c6790355de0269ddd6015f21a2ae9f20dac16f84650cd79230d29fc4572cf915991d594112ceedc952fc8deb5e18009fc4b0942c627203e94437e49a21ed74085f529f9092c3a91740d2188c4ea55ebbb0e2bde51d3e60486406b983955fec28e6b4d1a5548098baf40ee7edbfdef531e81b6392ba0c34a4ca9781d2ce733d139383a550e910bfd187e3755dc36a13b4f7c7213df0337824dc04d332799214f28a9f0c27490a95dbcb466d65bd93011d7a1539395a2f7faff4c868362e01d05a2bcc1a49a25fad31813526bec823ff3c67a4e5b74b3378f298dbc112f842192bb6e42af524159aaaf8d26bc2b57886b9cb2465cd24a922caddaf35b5de3b5be3a7e2f7512c4bd686c24a9215f4fc412defae9e1bde61d0386225a07913bbe455123f518ca83bf5a8495c28da7e30e460c9d3d1c645ba6bea3605fb326cc5770c1057865df52f269358b2a26f6cb459490f65105d903b0420b1e135978175bdd5516ace2327ce1202058b203cb62427a63373d9591565a05d1d4b12c248db719229125ff97fde8d08d855591787c6f0ee3418583d8435041679548457f89f62a9560767e305958b9f54c94b485cd4cd5ebc4eb65ad113d2a822d1471628f60c3f281e28960fcf4aadf8968264c72599cd9d06446a0a63ecb34109d3ba2c1247994448a9d3617eeba5eacd7f85eb40dd58db671d4ae1d004f1dc378335a67c3425b60443019594a312297050849bd007e5ac11e646307ddf3eac06cccc089785b22ced99b5bc55a481506db9160d3a59ed124dd8905a160ad3fb0464af26e47475d7b2a61c197d772f1b41437454b8b165753465734309754b501109b4d58bd520ef180575c0f99964e2cecbb9c0099484abd1f43536b69f3df6283de4e36f98a60c1c1176eb91d4ccd16810f782b5a62cf22129d23b92a41d63a5ff28d353fd4ac89bd98b2b945c41ff78a62506c15f012da01523aedf1e89457e2d6c095039356034d4d14c20e10c034b7a588cf95c01d18ac5eab2e1c22944c620b4837e2eafb2159c4eb425a4d18b5ce478ff849ce054a4784fe6d1c9de1766396d5efbd95652c36e9666b4c9686d21af4c6d87d4895563a9203c11c979b988ce29773d0b543a7567ffa10d1f988a5c4c11e57d1171ebc81a36292c81d515b9a03220fc1f87f4a3ab0319e2fa4f51937e12be2ffdb9b1a2a5d9b55e79c714e6c8162d726b3422d44c0c98788b0faedc3b8b9cdc5dbac21ad3674e8845ce7f4e996472834d440215f0194f3a23678a1e0f1529b8ab5c344a4ec899c912159cbd02fc78b4daa769acebe30394248efac3aff21172578942d21e2e3fe6600eb15e5e88238a4fff83f29d07ce9302bcb4a79a6d676def0127625fc983b022988e0bb315d17c65d7104607b924b23cc4b65f136c6213a8ecf9a09ad09bee7f590529092ea669baa262adb1e880b6d8b4853482231430fe3c3fc26af8688cb0acbf9f5eb11fb2a0befc5cc1193f4fed1af9fb37ad295c7acf951a4f93e8f230c6f1da8889f1ced1b40b27ec53cb3c71863517ca932edc92969768de530f24e667a8a4298618a24ed43a3abc6b38ad851a55b6f23af430929cf43d3fa098abf927d5c31a85528ce9dc68f68df8566209c4893017db21fbc8041a8dd73ef5e107adc2a2484532458ce581b538a05610e24770c4d5a89fdbe17a75e1e34cba0ed3a32cfafd9732e9bf66056d7c6c92b06eac5d09d426d16ac7316368d082671e1b220332c0b13a9516294f23c5060bbed14c4cb473ca9879508e77d8acf60066986ad7c570386858763f410c02a60ae6ac4e32d4b0a4ab237830220b044bf60ce254773ade45fc38a27383f69b9299cb92f6acb98fb5c3354cb95f2c2d6c23e1a0762ce593b832039837641891f6b3a47c89d3ba1fae057089b28e31369dde908f3a994367dfb154a81f625b3a4c766da017afa597a754d38ef2521054e84d355b99ef16bcf0ab3ba51e13cd203eb13d3e20f92c7cd8c6319a70cba60c5f5b707f0a0248992d9fc2013c98fc8b0c86327d2c75b5686e9ba707213165e0e913526e7080d3936027cd0838994389b909f8d2e73884af8fcd3054914fa5b3b36cae61291b8eb6eb21d3c440d518e1ab08102b9b47d3db2f082bf8aa53556619e6c737522ffaaa15023c31221d4bca096830a4036002a3e37e493ee7507f1723650baabde972f440bb24b631d39af66d24b776830a56da4313a2cdbac5c2901e88ff8ddaa634b0f7df32d84e0063cc9b874a8f23b765d63dcfff7019717ed0ebedb14c8b915f015f1288cdc152687ab1b32ebe071e60a17ecb40ba955f1300215f1d9d00dbc1a16f50d1160a6b6197eb826cd0638eddeffc06deb1c9d0ad5d3f8a900e61e2c5a9772a79b83ef421a649839713c795dbe8be60f9c1778e45d93e9525c8bceb761e3b71c4246ea264799152fceb703d7db815ebcdc96f9046a87b49ab0d82bb55fa02aeae1d73c670d8256ffdebacbce25483e4dc1f1905506592ae76f2504c087a6024bb768c7ee7f077fdcd22134fcc02e2cc728eb09d6b467633ed829cf1f3b2aba1120666e564c137cf036da2f6788362e965042feb68c0e2a4625ca5f732c45650591a45148dd0e220f3e2826c2533c39b98c427d11fe46718c83fbc690ef42b276032e7b56ae778ae9603f78e99827cc75e1157bec009cf38c1cf60cba26e15e5871f33b79177702f752fd73a89e3bbf0ad5054ad0991f0b57a25113b1c3173a9984e2d7b812dcf2f18ca056eb0cd5da745c8bf18d07fbeb3f32e2b412dbed429faf430365e674263e19e031f964896e1d07b0a9e3075fc56ff4165c15e43c66cc64f7abe94aa65058d1e72ac0c50adaea943234daf2a525a518676893b940706ac926d14a11ac4ce7db55e66ca54815c6dbb5be42123c86572aca756caee58172696c51078f854985605bd48e3b16939fef830fbcc0117b609d4ca2f1f719770eaf13628b90c9a0e7cec64968470b1682294612e402c0fa4f87521c72c6cec20d3673d4db985f0a363918d09fe479d5f8ea7ff66ccfaf7c02d8b443b41a41bdf1a5f97a7a91217dca130b66f9ab210bab6630ee387c08f06a4d2de7c981e58e0cce98f41467880a8b5b2d8470c18177b3f7b4a86e10732e3568922cf75e2db1edd1a81977e72b091f84fc4ac876d5c0917ec29c2f013ae05d5952e24eebc1d6fdce59c60eb9013744251a42dd92188c072870a327411a92f8cf01656a4c47a7a72e8ebbcb72b3b219884d6102f0a671935ec530edff71f14542bd08ef131892a5337d592a588d9fda6dd215e8d4fac535dcc468c94fdcbc1420cb7937118df2a9b307e6f9049c83ae34aa1476d6f84e055f66a88ccd40b2cdb00a2acdf3c053d38f706b57dd46dfad2340c174a1ea7fe9185c24c10f7f2191d166fd353215273bc3da1e14455d2b96324fa091645776663fa16a776bac0be94fa2b2717a7011fef06b1466f49251cb82aba4cb6dcb5f08912fd253c07c0a9b0d60367e9602cdb4d7ae1b9396d3bbb37a27852573b6981253520495e46ba0318ce9b37e84eb0fdf48d6805dfdb741a1f6f2f6b75b6d81bf2a0a8547b5065e9538cf42316d0042a2b53a25bdc8c9c3bdef66bd704cc606f47f6263e596921ec86f64a4bb4a41c039995617cad1776bd819ddf2d12f452510b0135aea8da94ed9c9ceeef7167c06417b128c2cb959e133186fabf4b1b7dcc2dce5bf684b067daadc9f946ce7de09d7c2f2293f6ced277a0809502e4f2bbd41c62c9ade6119b9b9f6efebcdfb970fa2b51e969249f3bdb3851bc4afe8295385dd5f11b2805068973798ba0e8e4e1d9fb5ac0c470eda56f71148579dcce770f47ba8ea33dfb1cf6667e914283aa6b87dcc2c1ec84f8a660e2e58c0800f1e47d8a191ecc68231a0209d7ca801e983fca991156496c099e9cc491993171b2b66a0d0d3c8fa167f625db5d8bc7883e085a6900a44503d4d097a606d107b837a7a385ff962d6d7cc6150f6a2cb66be885bc6d3092a1685e7c5c9f86dfdd419e173941ca170f631dbc0c88231d66d47ce8f165acf679e8491cc1144c8a91bc81b82af36e40619ba46c0188d05faf5dbacaff90d5e2157cc64ca5ecc8a2ebdd419b37892f5758f5812e2fb622b8145b2ea905accebe33115f40173a1f3c54d0f11bcba0eccc27eec19b0510c1b0caded93ff039c6405ea926458db891a36c82c9ac2494141e0b812e7e3aa3c51928ca9a8b635ced4cfe5c39bec3bec34602d3618a3db1f859e092d140cf108c74d97006ed20a2539324887ffa602892a628812ce7683be6b07a87c5a388f47bd0f79ba0b97e99f6c0d9f6eae4b49902231873ee10610b84a01b238ec1d843d459a09619fb11dd9cd3f9ed54dab6468d508dfffeee32694c2db2342eb79f007698c8c20bc52d62291ba77053d36e8ab2e9164008ba9e0ab3b320a912a3f7f438960a924db8c9187c0085559f9995000b5cc44b44d5d8a9fa56d4b0532c74caa17b65571b1051e5c24c325777ce4466cf34151809b276bbf105b3ecf63534c276165be8f5e82775db28d4cf8b812e580859a461977e659cd72b14475dd1ec8b86c979f33417b7b42dbae35a83c2a6b9cc8e94bb6b11a0ce8075324b047a7dd44a151ca2f248f1cf482f3c030d45ab782a37dfb71a8aaf73becb943407a628b0b747f4460aec97aa2eca437005306985a69d8ffda19800876f3561b4ca9c8bf709db9a19aea6c8b66d7806d764a20b8b66bee84b591545b23fa3cd8c1f722e7b9fdcd4ad83e7e603cc141ce6bb6dba4a7a918189476acd046557886739c9efbbb4ffb99b1469c702f8a2f2abe6fb79a67ef2e128f95b37c7c1346b87ca739a4e6fdffdeba4077c2e09fae94d881b402811f8636831098b721a3255ceddefe45f35673860019cea84b2f36f306e6346814d0492427f0bc8a439687abbc91bb592ab913c4b3f26d981278f9e0176e3454a5becef4134fa382173dbd93768b6e990649434955c52c1c559635b20ea0173b85918e9c745b0e9cf86ac186ba80c7af41eb05d8c9e6da532b26319cdd27aaa9a5dc47d53c8ad791eb373e1290c11c9c62b7c2a5375b6a7429bfcd4a1c978c01810484efb48f19a612c76d29338ec5b67808bb98bf1de664585fa8f2995aa0cf286c6c7b87369987a0c3d26e66370a59db1ec3b6c1f196211315d37e687317a9e73ed06af9199495ce94223cc9d625e07291aea63d9f7da31b349f04deadf6494936ac7852fe822a90cedd2976366cd640be61dc7abc688444b0fa476d965b94e73efacbf87763638aada521a588dd3a75af953868dab34c732c5c1e02e937c86074d69056986a88daf902a0fccb8b92c3b4dae0a52b50172cbd349ea65861e2096e76574892e8c581848b257606ff24f5729ace484f562faae5c5c693210eddd2aaf7476ae7b91254f98e843d9ea51c67a4d77826700ce3f3c6c2be98d20cc909937f388f6cf87831946f3f869b9dce2591cdb2b1806e2fb86c5f77a99d9aa60df4259967cd50dee6bdf0a945682924a49f0c27b0213781bd7052382be53891efa021aa1df77d12cc7727a9dff2138ec329516d57483f8dcc7c35b65e2eed9fb08a8f8b8a9fafd4d1387feffb4a06acaff1cf233711881ae68ee35664d4913124aa67dd6da3b6000c0813390ec7bee1ca461e83db0423da9fba353826710047c87f7be1294ab0bcfb1990f6fddeb1e919cb7e37f496163950e2e96a9a044cb8e6704d1e2b332f04e9af1b86af08350846069fe0040765100c03af92ad04c1c17cadb3c19efe5d08642f42ae18d736ce6b89764dce54427592e3aa6301631ce052280b042feb0c5bc6916eb821506baad0fc1ae721e8606523e4806e4839fe389fd81e272df439c484b04e3b9e0346a078de907580ee0d0cf7d5d34717135e601c28f4eafd684287cc0908f18111cb040574430d29411861a29ca94407fa1eae44824a729b2807c61ae18b45ea306aa3b249aa6587cc890284dbfc329286e1dbe0748ba7459f2c9a7f887171ff34707b0347b3e3bf663e2b1cc24101356c4194254eaf11bf984a992f6daf12459df47872defa1d1b837a578f0207265f2515e72497196984dbc6ffc20ef4a93f3997faf3220b271295edd8db7996b47fbf8d1389b2ae4c4c190dae5b88c2b3aa48e82b778f305357a386583e4b556e4b31f0906aea28619c9ad09b0d981ac96bd7d6f4982be9d1d90621107a960c3f15f59458eae876fc19ee900ad11ccec8e7febbc8d3ad0a3cba1cac0482066d328e27c219ad362815ac5256d18bd4191cfec4bf1604781bab6c620bf2b20a9c92eff4f219013bef636195274574a828fda4effc6c1e0efa3ca80c6c9fe7027d43787680e27b1e97a375f8e33d525b65b01e4091745b4715bc1cf20852c40efffa98df9f750288fa09e692ec6a96058e5be21be70656132bd259e02a46896b8d8fc71cab42f29c1ba368155bb295feb35ae4defb9730991ab05dcf97fc7c25f0aa08beed3814c2534c317a7b53f5193449c0355c76ee044944aa61a169b2dd9ece9558b769bec66e6d642eed53b635d7ec200126ec354a521f0148a6a71134cd871b56e254a49a1629ecbedc282aaad854edb48b2c35d5345aa5725b06e0184f35edd8d69f095a0c7833d003c0f3ecbbcc487ec86293f35eed82af13f1cbe3aa01d2b87392af154bedea3fa33deba1e9a56af344a22556021099ccd6eafd138b18101623dba89aa953c69f942c0422b1742a4ccffc7559a8b4b11f1154e6a9ac17ee0cea621a1174556ae28a53f1794ff2fdd622b5cab56c44f1295ee441635cda4cefc3a9f00555e046e8295e16e7cf51e32b92fd43d5232142fb50a26fb152487398375419d7544acc74bc440dfefdde4da021be46283eebd9eff34801194e951904ea332160b1cc12db8bcbdc17519a78ed2965ab6be90be0621c1a7429284721297cff126e88cbad1125257546883842fd486dc3220f61ccee3e23135dc37c179bcd810066c821609275fa9c655b7731a42d9d340110723f38c45411f7b3416bdb379c1a004bbff2622a33f21ffb9a440eefb60cae6c54dfd0a4b7f9eecd65ca252fc7e20a78034d2f0959cfd06c62abc4a395d5d31f2ddd8c43716e7c96e28369fb49c05cc8d64f6fb43f40c5cbac333377a8d7204873f80fb78d865ee3708f652e16691114d11df374c46d51eca7fd6b3a9c4ebc4278a1719db7be55b33be204dbe9a0faa15e8d6c3a9626628e420c5131a188ae6c9836133fa6a9b825695452fc2430c5f95809533855d54d2474abf64e7224ff52ad107e779e8885ea79e98c2e7a7ad7ce48c5b4de7b0c8d0ff5d05f2499833f7a999d0a81421a1120981afc69df484ac48889884773d308bba385aec9e2a2937332dfa309f30707bc1bab3a50c40d238b7c215d479b676c1173da831c9115e757cbb28d9703153043d3c45264e4d632bbe418cdf8f62e67f98cee5ea08cba81432eefd397a37ea0189ca710154fd152a59d204ae11726ccfe4b78ea3427f727e1aaee12e43cba10f522c2c14a7f099829b34f6afe08f05826feb7384d22c2b8a46eb1aca059a338fe601d1cc3cd1b3dc272b2afd487958d2754e3843901f0b90a44f689488bbc464ce9d767658e20e652e44ea4f5b0325d6079458330064a22040a5fafabfbddf46b527175c033bd7e9d438b0618f5a234147657bcc34418a9ab84917341867d8c2c10f19615dc91d68018bf36a806a0c4494fd704a8743932a3a022052c16494d248394e1721e3ce08fe5847e8ae75f2611a863437d00f1fbabc25a973f44200becf3a96aa0234d1e8068c4bdc7109b8c9204748e1961dcb25978f421f48882191f7054bf1ac038bd45f075ebe24eb80eba642e8caf1b7e423a78f79b14092a3a0b0c257be7d1fadb9d21c1fea38a1b3c6b8beb6df603967779ea34dfd63004281c39cac43e6b4e99c33350e0210004e97c577d5663767eca539021ed1f9ba02927ffb785584ef9c51e3d41b44efbf5f85c9ad6a4287cdb8efffe1e42e4014a01c858084d4677e1830bf3c3950248c09820b7ec4a2e41f0c5ba52ee4182e780eeaa1f272bf53ad4778e5a9af1f4db4024e136421a41cbb30026289fe2e6ccb8b4ebfb25e566264898a9ffc89dbb3d5324064bc00309d1cca60542782bc37d7f83a2bf272b41334c932192b2aabb3198a41831a3ee74746678269988c3894a1f916ed862dfc16f4ed978031ac9a47b8b323b5809248e4e917b316cc4328f4f108e01c042d999e8f3b1a3adc3aaa84b21d57e4542980070eaf2e4930804bb74fb74b30e7a6f077d3b90645407e76a7125411cc0d117160c8950e40a5874f9d49b56eef221627e80c3983158ab8f7164d365a36a3a3b932e71635ebfcaaa6e5aeca5e86812e21de4c9e3a035ee0660f1ded6b24cdd5b30b773072fd84b0477f56145640fccc94c737c1266b4f44a9a018076b174d788cb21fe505fccc1d298a8041c54d168b5dec7e13de3df0495034af8e56ef6be5aba8d4edd6ff4be15e93b212d6bc22d4416b1ef4f2a22a5be0a1e6debed0099c4c252ef9875abf66208122258f585c477131e34dfe7a68ff89f4462c6a959eaf0ca9a0c268d5b0642e061009bcabcad9e9a78222313fe329bc97b35f99e25eead9aeabf0b9c0939a7410efd75524789faf6a1c63b9a929cd9ab49c0bf2b98e2c4e46b8b1812008414ee4a5474d2425e05afa94e666a7e007566f8bd985151ea130f8a3046f084831b23bc79708c95bf96ae411d20b22a44aa9b4f6bdfee46a8ef8912ad780fd61950f3d5dbc75172cf70258e109a5fe16909dab06d4856dcb5ce30a10dfd6e10f994b00bedf19d343544543f3aa967a44fc4665029a421a8cacde8abce9f5ebe5b3a518170f784f46f72fa2c1937ad49fa345d0a4673984cde2b9d3cf71ae87b33edec9f8030a592df8c582a7a9677b66b0435a5118b1b407e5ac0d92b8e19e2e91305964deee2fe3dc95fa6556797363ef308f35191ad4562b724b77c8c76723b2789a27820d8ee5e9c303b3d021a711398d019e7a8a6c848eb43589044301161eea3def9be321f76cf1f1e354440b3c6b14153ef42ba84a0c6c1e84b1112afe4f6af8468c987a5dd2ac5db98701246790195b704a39e5b14523f59913369179f8d63319de67f6bac2684f78fde40c0bc04278a27340a1b0c1eaeed44e00a2cf43ebf682ed5d50bbca3f3047b2f1adafdf0c5e0fcf40645420493c14038b8221cf53dfad25ea83847f94074537b774aaa20e039626a31004901726e0d89c2da8af5d7c661c8ec5275703d2a876227b4bd97e713cb50a74bcf536914cd2acd893f598baeb0550f34318380dcabb345c202734e14850dcdb1e1ab1d0ae5810d985e524914c1df6dc77128cf83e042963992aaf0d859899c309d0aa813fca13ba5aa27a1261c7138a96d7eeb50b609ed44a4c4dff580446021618fbebc9187813fedc35adf17b017f92dfcd97de753bcc2c5b91128acbd7f6959f1c7a72a8db4fea954b149a1d3ca73beb0ce0dcba8f32c4d68913bcef38794f3c33b42a65b6c40e520395f4a7e7186cf3bbbcf86a3116a8fa3b663d56294c1a41ed26f98f8d942fcffc691993fdb84b4d3b325b198e87671dddcc9bf0bcc48231c69770b657f1d3b74700cfdd931ab08e7047d0e5468c8d823722515e7758748da43c45621e387f30f107e96beced2bc451a196996380204644dce19b0dc3fca264850a8778cac700f316bddff2dbea0a160013c64745adc3c17ddd591ac8c0c082ae4f9ca22c6799dcc1926bea14c9b6afdb9466c0edf7a9a3b58b406c248d4a8b4ab32c2e04179f45511400995ee55ec6c64049b142dc732f8335905366707c1b15c968cb48eae2201ffac4ff0cab30e9d9bb8d9d381071a3417afa55bccba20436c3e2d8b16ae0222a48670e0192118912ad41ba368fb56dbfbd6677a51dcf5a193cb74321317a0d103c6b725e74efc59aa2ec5ff0337a197029cae05115616660d4c0190593e42b7636ca33035191dc1a440977f3040441f5a6b2392dded125e17075212ccae65aba036e2fd170af2ba3f1948e9df0766068897db395998988cf887df222b805bfe5e372b726082c87213f23a754bd22f1aa2a57d64183d183046023bd712269479ba18d1dd1abd8eebe4bd76a3921ebd24fd2a009d20dfec6eaf333021940f0816b85aea2521b51fc60c801707839d5e043a3bb4d449a93c3caefbedcb7133a8ee8672c0e360eaa2ac8aa25e3959ade8bfaeb319cd07292eaeca7ed6a58e1cedfcdf144e5badc0bec62eb2641d295e29daa253f1eac7540ffd7ac8431a6d1c71698ecd016b3944359f7e79acffaf2e815c9d38ac1b12f4d3424693c2188791a5a2c3f785901558279394821b3b8e5f05d92cae4df0b45d5421476d517a5b2d1af31ca4cb0080ef1376f382305c78dc47ef2b301d981f9a62455a83d9df831c23d4830f786e721d6bf27bbc4fbc1507bad27b3af70ce11f2f748f61f6b86ea3e7499850347874894167e33f6a9597dab17d83e97bbc9537ba79e2762cc2a2a75c343653e513d101f84322952fde9b7846fc207c2cddf2ee49a71dab6a4afc7ea83a2a2999dac98a510faad46eacb96ec7622733add082ff591f0bff0c272090ef50f2aafe006e0de954730492c2c9dd80088e45552b9bd338a4b5d451a0cdf1d12ac0da7009a8c775816af16d27d72497272e1d7383700700e55453d86c6ccdd3763ecbcfa0c1743248289cb90f55f98420e7a7049a65ca0007f87ffaa3a4c4733378e4214ea95d18b6ec99e4515c8f15aedfcfb4e7c840ce5032b73f61c4fe758880bb0b8d9359710059dd47901580db272975eb15160c74082c91c3751d97c196527d7d25b76fefbcea49ff8eb9453719c4c7e1c2d83a2840010ee06a2afd1e596ae0612fb7a5cbd2e55a4ccf4b8a7618ea29ba64a9a8648d9683f04e325fb4679610133af3a6ffba3d17970cb6fb02d9f48bfcb3b92a3f38724704dba5bb5cf340a4b096457990b188334edff559700f33505e679b44ca7cd34009fdc8cd4037002cf8acbfe4c6897dd7d0111e82297a2826047d016f0a91c5823a132809c59c7664dd13d6eb2273ffa37e8b46581796b15819041778e447497929fa43928d3cf8a4ff9aaeaa7d8f7ebf424267aca4ffe7798de53247b71641fcf651eb075113e15f3f53982efacb7d6004e7850e0cd0c059ee78e724037aef6d926a80abb09c701969e9e6d0021a1c2d2d1d11e159a82004e7fa2933cf8a4bfa3a9dc0017ac54303c365f136e1f7a738dbe934543c2d544fe4c656abb171758616987a988c1bed4b61acfa99c764692b36e2cb9ac4910ada71104d8b9acbbba7a021c771fd271cca55704abe693b4e52a3c7d607cf1eee634ebe284a0dc3c00fa8f9013b8b4770c724e64b6df458fc5e7663df508858541df054a0005c4f4ca8ea2302164f1a1bcc006e99042bb93070d07cb833377c4382c83546a030e9c761ee03e9b51d6f23e6c5b9f7fc77073bbfea46ade933e17c1e8ab4cd202116f8b90c809cfe99390e72e2c93a6b3f86936179dcede7501ddb1e9703e6f5360506c600400c11cc9802fce396c61b6e120ad68ae6359a1aa97d316ab7e710c3fda3d2052631fca10468ed9b226888347c21553daae81338d29090ea88500b7d88f932792f421a490933584f9b46304ac78139869170bff25ca4466ac34bf288241ca4cbd50cbcbe04ecf425915f74e4ae7bc0cc83c929f2cdbcbfe6410627fa0bec63bf118504200373a45b57caf88898250177519e34976c01f6c223e4fdbc80ecdd63b7d8fdb75e056a67638a90699fa82ee3ec1e7a6421ab8b4d6b0798d2c5023448dcee065c6d61d25750ca7c2267aff05ca8b5176cb4ed4dfcec436e226e0e685ba14df24445fc2b22320a4227c10796d89fe24f4bf85636e89a11f3d889681c73d104283f34a24fb8cb22a153aaa48b51bba4a350fe1c6a4349aab4f4aebc3fd829b02fe35f8f028a0c9fcadc043f43111216dee6683daef5bc904ee220142c337c05ddf6e196189f9442c4d89ffe5c78aed642402ca339e928aa3a40b6d06295f87471b385c55074a24237939d6f9ffdbb733e2f464408a712a1de28095196421460ad3d6378481c8d41ea4197662f096f830f93fe64962a178310d4114b4942948cfc4d3dcb2a124f271fcf69f766a6a3dcb2942a7bee13e4265b54450d1578acc0fea45ead95dc3206ad9c9b87b0e1c9d066db3ad77b937609fb9d3f9d88d0d7db5e2dfde599570a5c4531dcb4225a2b0a13005bf3f33ff25844d974adec772c749dc35ea23fa4abba7807c1a8af4262f45a62896fb4da30689b3823183bbce8d5638cc2507052812dc612179b6199c124b2b9a82ced5b35f8f08555a3e9706604a3a0fdcc705e98991121f3bbb442ef59d038574fe8e9b5baff4de697197c1935889eb4dfdfc970919103092eb2ef69a2b7786e6be8e3ab3eceb1e7e136bdc73f2ec21757beb9fb2e6caf42df92a4d2faea7cd9458bb8f93da6be6ff9434448f30f01181b725285e6d59d87d9918f230fce7318d246b061b9315d838eddbc4afaf3ee807d1dc2474cc8e3bee45e4b9741aad524ca72c141f7e61523308779338236312bfaadd1622c7df837e0550b3d51017a84fa3e053b622505e6e53c08213658bd2bfaede46c2636b352c6442a5624815e5e87972d0fcc867d4888c65834d9febf2ff475380546a4611e7ad6db7bc1c56ffc1a354e328bb86072c515ca161194da41b095716e713636205b71155ce8b215c9e1e4ba8173d0111404007a79c67589501ae44ef1e651e6fe4e6c5def3e516a31568bd317ba46d09c84071b62338e3f20ed696090b005d6ca2b55d96831a21d120b38bf9394418da82090301148679ad2bec0200f1da7e61370324e9d513504a70136f664a21e3f75a789c6355a60906ec4c6ead0bd2e9b972276fcb4ab80f5f62a419c0851c218a17d1a97c31a5f26ccddaf97746d97cc1bb4761fcc27728f8b49008c69d37674a2aa3829710659e5460574763a3503e0a95a0c2d08073ee5a23b0b9ba8e179e26945e8513013dc4c42208a22e0ee701764b0f96ec5c2345a0ec618e0bcfa8a5a7ff8e0581c9ad93ebeff290e44016ec13364ffd62a31e1d2bc60ee773b79be833485baea47cf63f7761497bc5a6c477d3f7019d1deaa8b646261fd49eb4ceea25a74b3be103bb56ea6a3f563f74254c703932d945e747bcdbd16f9f40b0c9f367eb31a9f72122ab11e4b77df50cde167fa5ce6db9a30be6ccc718d97273a96970f9a6af72876de72d3841faa0521799153acfd50974dece284194cabadb790017f607d8f5ac57b11cefdd096f3f39ec998b352388b639b216c8146038055dbae3c8d3de3a80b420908ca0168f698f6d66b62bd6317bd1235fcd23a14598225d00a2258c2e5359dd682e954af3e088015166f43d13114dacc181fc59b05462a04e5fc2f2a4fa03cf0b53edadfecd0d65a772b1ddace080c8b271edc36993ba097baa25a094e5107aaf913c7873a9fb0f7ecd958afcf5493c14d0465338b930ad2610409ebc5dac6f9ae0b9e7a999899820cdd73f76c17b76bd7a4ebc669e23203165b8e0d31d5c8bf29a501c08d7ccc78987ab1aa81024fe3b5504dda75fbc27f4984cfd73479c71ab63bb6e33028701ed36a252847897d4602b85c25955d7361889f223b2a5982b8aa1cf8953e7fa931188e93532fa48162f2ed9fe3a39be0b6d062d2e38017110d8197bbe3afb489b60db387d86db920870da288094fe38eff501f5bce3d1080c07e68e1421ec7a017c4700a34e077964857bc52417e676ee5de08f83b461837c1f723172b3b5df8045f57abd93b96b0d528004d9835e44289eb9af469fe8fa45fbc5facc304913725225cfc06e06f1db7cf7b4963d5a1eaeee0a41dddcea4ec808ad6bd074259de82dd0daa874be74dc038114ff738b0eaf90f2129660602d25a9902332b742ac4f2d28f8258689c3d600e71cc761405611350561ac839044759d4502c008919a5b339092d80011650afe1f574032a1a6048d519f61d907e7987e77fd276bd069c6a2336b05c2e15ed9a1ed99b8551ddd6427c26a96eefa2dfb83c5357d6220854a33316c58b00116c60a1c234d5d6e8d4f0bb1d7418a3a4f65aacaed789b7b7648f9f65f0a1af7bc1cfb7053575a8c18ceafae0ea7c376e8624e71846c21a83cb8dc02e93c98407ec6ae8412e855e2eedc780c5c4612a8608f9d8f73866a03865d249289d27056d670ae2b034ad192e06067c1bf1efe05fde74bcaf69c07cd280ddfd2899fc14d9119ec198b99baf7c36648747e44f6e41427d47649fb7635c25a591f016aff614c2f13eebe87087e46e81a8600b4a4248db6ef61f54503ba477baacec20f2a90f62f36225395f09d8e151f7ff261a3ccb72b92694827330105bf088e6ba65fc4e6daf89fd35e76bd2e80d0e16782fadad34079ba94688df46cf4b24ab6096e9d4d3812ed0dbcfe5ba297e86625c3111d7733227ab0566db453ccecd32ee7697fd5afab4dc5edc0756d506d0b7454e851c3fab8b18b65f21653457fc3da05dd9f02d410aaa7a27458c4e3e0c6c90a1628e344f50eb73ce01d19f5736b8f279e62fa46fe27acf211fc1e79201ed9d7b8fbe1e1711cc53c5c1c376ff0b4b5daa7a1100462151607cd230dc64d13f48096ef6e2a4c884e273d531a748f343eabe4fbf60054e53256b27b5751f9307143eaa43146bd3fe357172842114169b08a44f782e84b1a7acab716b5e35ace501ce3d26822bee3e5bb43afcd935a4845a8b9fc5dd76ad1bbba8635c52cbf34083b3172996989c1a115700af36d6b57262265bf17e1a82594fe91466e633429c43234e721c0b2df68c289c3b584d8153036c6b32f1679db0cb79d93a8b58dba8c9ecd23f579afdc7cac98ba03fa44c0855cdb0385ebc7fcb9cb616cfc35bc979048e15c6a7de063a9fdb11298e475f3148ed8e76b970cac90e78bbeca663a0e857cab48fad2ef9a1bf6f9ca20b9f63a808302b6e31643abdc74527e778ce676eae578ee102401302d5a03878d0fb8135f63ee541af5993d3d2bb033b114857f7b8a5303581e188f5c19bd5b1057895906f9f6c82a783c3f9c8f4aa46fc2005ae6f54128d26e91a03b3c0900e6018ab12464238af43e51d964c8edbf04df879e0850ac93a51165e82dd2f16d439f00ff3fa47d31f5933199f2093a7add7db1fca40a856c1f3eedfb345673b240115e5ce4ed3a581fe1ffa304249e6b0451498fc40c20ae19a67d41ae1344a80d27e7c6ff93efd3184dbbe737d1700289c74729a487aaf00f12b1dfc71c6af52e91e1c2589ab0f504671a4a5792bebd28a651d7c2de39248be80ae485a3e045be41022d0e902e0cd923e96b14a98085c9f93755c41f039da57279b40285c76b349a9312a6062d6388b89d59666c033bb08f052cf5b64e1a31c10fe4d99100a5869dd58f0536cefe86e3dcd869b08a5b37bc8b8f76bafd80333b0e3fe46ff87983e1a52dc7f3a6e105104c711e3fc0a973105311ca742af20613c9c3672634961a408a7a0daad88a0400873ff079379136cd5038b58894c00b049d28ea38b0411576a6593ccd380409d3d8cc4a3d66b1bfbb176641353552ec7b5b254cf0b1e14e93059b780dfa3be6c26d043debdcd3a7a524858ce6090850b1b6700d55ac7c61c71a5a930e18103e99a50714cb9e69b2ec1c66e8b723767bc5cab0086256332388b8414336596435b9978c5bda8d601148b7266b92510729b567ae480d3a5436b3cc00289cc8111c72a130e41b8b144378bf66c8c38c639fa490e439434ddca10413fa9561c10fc70b27c9b04a63f64879251ce9d333f2ce947eb960252278ac82097c34c06217da2f11d87008a4ad1fc09bd53e08c8a2b24014e79d80c625b07a9b60622fe1983aaccaacee149a787ed426bf7720e65c9560fdd1b090d9af9de223f13619defccc89d91ec98830474530bb4531cb9511d5996a5304873c7b9b63345170968a7d5d2b43047a53bf5c9ffc1c0378c64848ba10839bed8270b141b020853efc09984ff7f7cb87ab068b03b1bcf00d4737aec3bebf05a1706b1903356181be0cd18acadf9a92359e10d2cac949a388631f5da59b546c5183ca8398df760ff742f37fc1313899c3bbe37c84a87411e0343598d0a5c1bdd41353605a4f5d18974f8a2faf0944b19956d6f179f23ce4d8fd883f5b7e0365ec0e2d8c3e44ed84126bc85cda8e242d0b4204e851e65a6012133819da3aa5a1ecee9effda4868199b8b99cc69c34fc94e6b9af524e0b054a918996863140c7549fe711e797d15c4d831690ee790081e33c6243c494271ba7021339aff990238d3db6d09b44796653f6a9b5e78799a74c6d852a4ed3d88da2892b0771c2dcc0ef2b125fe03ba4ba373ea08bff8bd7f7aa346fc4a6cd5b64f2213f40728f3af83dfa09d5fe435600088574ff87a9d1c8cd6c17ffc3fe20a845d8273947234f253e956ce644dc1b129e81501560694f607f7b7a2d2a86ff11060684bdfb0fafa2871b11c0d4effe5c0200e3b427d374262b241e1f59150f1134a4e53422480893fdf7df8caf833a613fef1b22fb4dd90f1d1f48ec204c6d29e74f5482a904f2ce912e80475b41ca6ba7f1c80db46da5541d345d7d85c74d5dd4761469d852ef82f73f8f33923b3aeb4e2e5b0b4572002c182653cac5bc1508a3c1977e20a69e1e8dbbd7783184d4181a845456a040b5590f521b475b53632b4e1a1f933c6686fe99322355407996638010311f314e6282e7d09b5c17532e185e4891daa1130b5e17c717993eee1e07076fe1459f76f5eab766777d88b9bc16502f6e91a583020ca8abc54285c03fe4cb7b1e0ea0202c7a47cfc04ba99faff565f39752fa076aa8f8a8c2b596d620703034b5e220ef2e823de6620acf165b5f3e18b58c286461a3cd8858ecd437c5288e306e6c4a27aadcf0ffcb881059841caef96be14688bed79c83450297cb38a214e063eed54f064913c96f5a18231c43aaa569b67631d39463b53e8f743bd87a867eab5125218269d6333db24442af210f21cd70219c44d8ac7cf06e56ebe960b58c76d5a23759195ab546c7824bf6a58d897dad7411aafb6c50c2e4508de388a0bb1a407381f039ff13b3f950ae6109dc68ed05b365eeab2d648e97fd2bae4d927f19aef9209ee86c107f1892822871723398297860fef9aeb3c6b0c89eb981d1fc0a2846d2e51283b2474042907c353caa7c808f4e5e926710bfedc54c6500b4564bf59378bdd3a62cfc3f88fda863223c7472c067746d8787461efcb388196b9640a87834a7cec6ad962c17a4e6f5f5c5cf6165657d8ce53cc88ac29e8f09d466ec1e617fd07d7fd3b9873bc36cd18d66f1a20613ade2cd071d880ffcb915f5876dd1195f6d57dda08b368692755c39344ce6353aa6e6613115611fc65b3edf367c4eb1d396d23fea25e31d58496adf9d44c7c402f34d5cbad792f67068bc72f4ea06e7112b6d29818f0a18a85060738ad77aa103842d295a2ba5dffe29b9f5d4b74249b30a9da9f28fdcb766f71b4ead66819be628eef3429f4ee5ee302847112a506f1ec96d6efc89a1ea66b37238c20236cea3b9cc899eda6add3355122544e09639847b7edcd34bd76e48fb832a9265b08a1db9890b007160ab10f646dc4c78d19cae98a71b0085af214a07a640bd16025f215ab4d472ab926b01f6ba600220fe4dfcd8896dbcf9da3fba0398e1aeb525986f59c0cf52aed0829cff22776597bb2192e00b23b9198e349a46c832b76dfdf826d16e1590247fec9aa5f905767bc27b8fb9a4760090c1b2dafda0e472c50a729825d7bac87ca8066d41346204d0031897fd5e4fc98cea95948c6e44a5f833ae32893a86f3a097b61acdd887dc783037fa6c1791d69306c58b4211ff0605536ec31cad6e1a57e2f0943049a62d684a71683d48e5810ccf2276dab64f923acccd7c981dae8c18425bd48b30ac58fa2c3d75d288f78d73803fbf2e333b559dafd8d24689ced223170822c9f6b12fc995bc01b75223e2c5d08bb452e82b42431b04e31453e10a3065f85cd2888217a20b230a5b61e434fc9fb5db14963a521a34e61c106971b4b03ef8bc042f7a6808d31e649d77dbade8ae22b54000f27ea2c0c26ab4ac6f9d889c6aee7cbe8ed01903138200ca5f85e508b31efb595ab993938108b78507798f51030b6f48cfa03e6b858adc72e0ee5662d83f054007600d8173afd501ce0a0995abeab84fe0c0fb4433cbbb5b8e1b69d05708d056fddc559e66c43aec8318960ecae23d82d0f037e8fb50a04be14dd9ebeb804bf2617f6576fdbab464ee09d7e71478e9803df62b326f1f5021f453e6dfd3940dd560d1467d1b3ea4725c1e58ae31b82fb0a2d2d054cc844713ae63fbca82c208abe6fdcbcd906442dcb5223ce66342a0f1af68b9dea7c11eab58b80ccef172e04539c7f2979cf1aeb2ee28445f1693dd2ca013acbb947223baf0cc457226945add1cc2ab0d0c9d872cb4302f9c5daaa1dce5e8db783adb3c9ff512bf0b14c8b0c14519dc80717e26badb061799aebc54ef62c1fba139743f58b4d85cacd944495fafc44eea33110e0338b947f929331763dfb00ce5a2717cbfd02dadd47649b46af6850b7f8acbe61d8eca6f11e196272adbcda8f4c575efc56de34d78740b05bff30ddc98a893c7acbb7bf1b43de0ada4d184b29fc233a78c319b8907bba2bccd14d8561964e2db6833af9938f677f424de3004d6d134a6461231fa377dd10ba627ae48bca2eb748244880308e4ecf4b319e061e2c5a5d664a37c13476d5ff1e86d3a8b52ea73c1b0ba7c8d5966dd9abe1537da7a9a9f839f84ec2daf6975a192d484a20f73769694a1beab8dcaaa947006ca3ec29020c5e9d981b8ada973fb0b5c0cd0370358015cee52ef438e3630e638c10f08375d6075c2f7cb184d945944c72dfa8a4ee8f0a8dbcf4db5f4dac33277f57f3e2347c9078c970e252f8ca2c0803c94efa14eaeb7c9f490f5c9f2730b7b4effe6333f8f9d167d3a94dc6e711f8fec5f6b6fcdabbf1f37a94ee9ec25357f97e688e4eedeb249754a633fb1f997a907b5f90998c2459232c637313434924a7523dd052f6662dcc881504645aef5f393f4cf815a66b2973127391c47edf3e3fa859300c8b1b9dc682c6611566ac116370f1483f7c222b0849044c58d9e2452278238acaa99fea60fdd19c96cdfbf0b22eb0c589f82ab54e7df14a54e3fddba939ca2810a4d59cc5c03953782d9d2a350583b48d98d014515d81d4cedd94f3f2499d2e7c6d7b7e2167233fe305285e2d53879768c2c974c9e44df82249ef0097d488ba2a850e6e12bdf228561e82ea03e6342d2ae2d461ad049f86da38d545c2585eb7104256cfc80284f1c2df76ac69beb9bbec0dd4c4ee9f0d23fe4bca7d22d1ff12d20f5a5a050c90369074fcc443db19e30c0c6442591d1f09b02301646ef4bf158b250c70347c089b168d1414865aa37033fa5db60958eaaa3ddcdf9a71ccf0dd73226b88f145ff2e021ea83f98f250a2ce70998ba1108c1eb61ccbbbb9ddf820ced1b18e81c28dcdd9a9a14df305d45eb5eff003d264b9605f0dce1a04db2e13f05db4cb92d1062ff0a6e46c8310b35f785af0a01e99a148a6c54df9ce5fa788c506f7391c6513cafe8f47609beecdc934f684e658693485c7ca9eea56aa625469a0a3c99ea72066ca89d347e2bcafd2da25ceb04153afbea210428f3fddb05b9263c802d3a00e80b5ffb8486bb99966fd3b3581057b8aa4471912ff72aaa1151557d1370209af27e973e7dd2885b362370934cc189f7a0ed411faa60616d2ad0061c0cacc25f4e0d02b041d182dd98c69a86ec832dfb984381346b16713426bdcbb9695dde63929df94a6e9a7e3d0996142199e0bf7902c63d5b395ee3b963cb7b4aaf9f1330c3cb8f5f9dedfe6a088080d21ca421b0a33ca451eb5c06b10f60a957a45d3082ed6e8a84ed5052992752244499eef1c0d1ee8dc19ec43294e4e963a4041fb7f0ee8dc73c781a815c2349dcb242a2f27ad69367502e9aa161d4da5554a4ef366a6a7df547b33b631d62af2f2719e495613fba7de092446b3f17f2d323632c33f9a36d65944403c9b53238a5cf0d4ad68a812632e633b19599f0d0aa6e8e995106e317744270e84ff033082632b7230db4580fe893648aeb69d41c4765d6eba3ea51382c434ee825c5a8e0084e1bfbc6788351895dcc0501e35d8a4b014a8788bfc6130db914e889304fc1807c0a199ff53661b988d3369225f951618c122123682403aabe35a9d1d3531d31e1304f1e743919982b59db1b63d4242a6260b6bcabf61cb940c23d48344c3c3265c5a3431ccf2894d8ed1170d472a0d743da67c3130dcbe3bbd364e545cf5adafed81c4eb748251a659cb7142337f78af0b1d76db5c1fdee0769f06db8ccb282b499463ec863f78e979e7104542305ab09536e7b8a74b8101a1af57f8ef2986049fefc2984c18788d6d240b8b9375adb68b81b1312b865932786cf2d891558831c78d12fdc5edfaf8cd0d22c9013f9f244dbe4398e365de6bff21a3cc5c37c5740fbacf19f22bea796575df8da7a0222bc950fe37f3c96288b5e3ec27295022094003c129c3670c022cb0247637bfe8408043c948cc20120c7bfd0f9fe5a9dfa012e9bc08bb9d4ef105db6cb0ca7a7bc1b0a6197ad653466865a9e5a9453f6692205a7bfe0fc97bcfe24ef5fe8bd7fd2b15f08df0a65afb509341e2e364b2a4c67da062457030ba21fc78307a57f9a0548d06d011abe2f83e10c4388428066470f4d81ef5b6668d56012ebee41582700c6a1fb5d24dd8c9976e4d5f4f70cf64747ad0f083d4696ef2bb10190385ed9af5523ef107802e00884e830422cb5698a30d956baff8055a38c3986243fc447b7d959470ebbc4177a64cf0a421a320f98780a7987dcd5e81173e34391f6a64eb21fa017f80fb69ba90ba5169041a0ec05f010c1b5f9632d99190d0530dc45895621a5d58da1ffde1de2260bdf805382a65361440bf190417fe02819aa6025acce2d6b8352f5746c4641f4661925d725c38f3d46a98e75f5fad762ddf334ae3f5d01bbfccd78f9aeafc067c0811d8dca0d8dc35e4438019fa3f2d9797feb7d0f0863064d2b7a8d27200f9c407fe6bf3d28abea0c91e405e0881e67692db04329d2265b429189933bf27dd795bff5c04a85649b6c0ce9960c4dd4c3153c8eafcbe567b755dce3603abee7bcecc76fd318357524531540e53ebb3fb4c04ce4394a776e555785067f1fb12ab4737eb7452fbec3d1ef1af528e9ec1e52327f3abf90efeab387f657e4cb03a7a7043770a7abbc169f6ad4e76e78a54a562cca69d73ebea712c7e3c3f9a5aaff02a175a3528bbcaaa8c8ff54179e7a291238910b6a6bc6e16354d220fd905bf5313d89c1f418da4fe79e039177bc444f2643620b537ece211e060ef1b7b77f30fabeb22f1d4d1eec949cd55c399be395474ddfa0b1ab4b2243d49494c13a329362d23c332e084914c7239d8a039899c891ffdb7f3e0b5b71dd674a60bb86464a7726ecff86c72a541b7979b7379909148e7f7dbd83a121d4ea351f467259c7649480b7723fd01422368c279887a4a7e71cf1bbcf30b2413a5d12a551e460a39cafe554212c22408542d14151288d98a141ea10139c0f2aa6bd0384a925a8f7d55c518737c680dd4b39fabe5b498a385c413a9d123d5efd4a45e1c2313700bc8a252e0b4e0607359abc6f0150ce866a0bb48fc2d203e2db3ca89486375401ba3f4eaeabbe6785b1347af29b4d6a8fd5583e10868aa3d4d88aa47a815f22a85b329fb15828a708a2626643b7c6a7356bb82979867e7240f97ae35b56e460aeec60536f23f7545a092264da3e2278fe72ecbe04e354fc17f9e36cd06fddb1a227b53ab1c09fff8785d30cda3c891c26102fa0f8c5abcebb4ca1a449210288af9b58e3869dc06624d5bc8466459414568d80b35acf97f7e52e3a1105dae768e020360692334d51fbf99071fca28375df867189d9fa238eb6816b2682489fafdcdc40430d77bff54bac5ea62f26dff44a14427a29e8cd700a44bc03dacd92905b30ceba4a071a030856541d4cc081e465c90514f4d091810132e0a94860430fcbba2871e6000f05fc4046dd4bd58a980503c86f021046059cec67bb9c82eba5368268ce9a30ffaa88ef85fae841956c884842f6de7bcb2da59429c9e308bd085909dab79c6a59ee299b9bb3cf1a036fcf7df7b55b4235693995bb8f724bf9fef990dd4db3027c43e973a58ea43e331cb18fa453a87deedd3ef71f58edb9f025c43fc4d24afb1f706fc311ae08d9d77e847bed6ba1d49e7bed3fe05e0b4718e1036d842dc44fedad9182470c8389e2bfcb75299803093cb3943bfe4a4ff290670eb8f2b8a4a8a8280fb988b28b8517b14b03efd40137f043e66eb9435deed0a772aae49c6e5790c9a2c21001a38c4c56ab4ca603559229e1d03f748a15242b78a4325917dda9c3c213e7a266e99272fd9287eca1df9903f10e14587bfbaf20dc6fcf85b22551ee06c78bfda58bb3676cfd7c9267fe58b35c69d8cbd1056b79f444e88c84fed8f9487deee51744c93c7326378fe76277c133735c78a9f7bc848454c8fdee3b7ab93b25d5825b21de810257d09bc7fd3bcb9c59b3c078c023f5a2180e45b124a51892fbace7fc08c807f26e4a1ed241509da69689c5ab213da2616c4ec5aae0911ae5f92af4cf9c35cffc7186b181bd47151ceb1fcfb3e94ba80675a6828b2c0a73be24d2607499f93d933bf369933ccd6c56ae489d0983d2484b923a412d31a9b287d4cace1698ced14e91e792f75026efb9940bb553f40f9d72856a50a5920309dcf946d126dbf685ea5bfb953221a22fef0b697fa79490462444575fe600790f07aa5cdd09eea23cbad83f53bc676ade8bb1cbe53d95e74b1a243c2b2a2a5221687e6703063c7f14a5dc999fe3045c9fce17250f900908685a18143cd2b79164a3c70df8d579ececd125ca4465344ba5f53fd8be86da8f607f0be5f4fa5a088e9329cf97dacb20d7fe83ed35ed47d8c62995e77fa0fdf65b38c20df1d4f1d7c2a00ec7396ba8b6816b88794860972611309f39231365060c1a25cbd4e9a71f2542bd938b29f7bbd1f5581e3d6682c77848e0319a34b74cc9949b8b2fc99d1f27f09c22772654f37493eb4881c9fd7376043c888200778600fdfe3ea04134644242901644c396ca8005784639104d5aac60cfe5e28d1578070acb974f5ba2e4f1e622a6cb75bc2c7d077635611d3b50f8698b963ce6e4bcd61d8e5774d173e6885d944a209f5690c141e470fbc78b62e084d775b9336202a524ebc349d453102f7c59ccd4883d6991f27c9c00357bd2b2e46197d7ba3264777777bf515916514294ecef5e6e08411e3daf25012d59baa09169964f4068a1a53b225f80a5b3d079ad31e7d359ebd701d10c3d7a6b44713ffa8c7bcfe2483de57227675a72c9b0922779911b35d494cb85f18c15112144570309548c5d020967c6d03004d1963c2d58017092a093395e673195949498984ae354ca22fb53a5b9a34a4d1dff9166a1467347759a3a3e9b3baa6c324d7f5712468ab968119e92495d2728ca3495e60e2a3573455128eae4724d2529ff2132fdb90594ea42292eac529d44429493939353f6a22277b9dc651451528d69355663f2862350ae3fed5329970b63a9ecff332cc1c68e68be1aa560a8e449449e7f3f1f130b1e6976015134803c5ffb7ccc1c625e90e5cc95167c99c23f50a54c1429494fac4809f23cbddf63d99fa08ec8eeeeeeab32b05c228f3739cb2a79cec73e2091e7bb90f2fc210b2fa2bc24398161052624350b5354d460421460660872efaa48e1e5460b9f3c7a596cc8fe34cb17d9bfce289c589873ce39fdef182798734611cb737e07de437fce2732294e0f2c64ffbedd748a1779fe06dec3c9dcd90b4f0c0188c034cb021ce14e023c41af20b9289323fb7f019af098a38ccf308717d97fd4d15dc89d324d78ecca64ffcebbec5376657e275f47eeb0619709bb00799ac9f3c704e40c6c682de4ce9cc99d16f03873c8d37f9c39e44904ae39082b532bdd2e172b8f9a96a584b84a187046090316b00aa977df6bf572aebe3405b8be84fd0c61cf855b73f0f85e1ae27074651b6a3fbabcbff5f3bc8e4805638c60c685183df05046e74869872850b11e9eba7bc34eca1d2bccda369d1528a5ce168e43552b92b7f6a1fd50cd96be0652172b754d1b311884181629c440831648a8408715ba90a182095a10f10351cce90a2c544c20238a5150193b6c616104678ea822c82fc6366280fc81f8c3fc7d3cf77f7ec51031860855ccca78284382917bba88f344e47e1d495eee39e7ff9879e2f4cfe7e3471318e729e4e210173b688a31390f3786450c8e871bc6f0f0dd22142801d6a81dbef8263de3ef7365fb24b6da5e0bb005c3a6f088e7a88593d6fadafd393473adf4887e911e21c48448880991a425783a7cb8b991afd7944133b45992ef23ffe58b6e826e1c9af988f69bf713bccf819dbd6b9ffb0a76f7e73834f3b6d121ef17bd9e64d46edb9af6b58ab9565ac3eeaabdb4b72f73832fcd56505e2b9dccd1e152861b105d945286372ef6f360c2458c0c2172e3e437dee3567bfa9eebc849a90569475b4990a9e3c6c39b224686109172e25d3efcb5f947c616d2f916800b1e7126ca359cfdb4869e8b740e11851424522a6b49bc07276bbf44f2a8597b0fc81d3e5347fba512344d7b22a47c443e1239d3c0fb6d87c8a748e42ccb1b6417b55192255886d44926fc227639a5b53ebdda57f088b55af86a80dc6e6829a5f30711bbb69e5fde87a9db7bacb5b6d29f627067078fd0f0054466ede987af06c8fca3093c5473f5a7ad896d7e58a245162258d0c4cb0b3404b5932e29f420840f2cd0e28aa0ee36d3f5bc6aadd77b98cf8bae1610ed00c30c374831869612681124df67ee50b97086cb1854b628634a90fc9f22179d7dfaf23b44d2ca346c0d496bce10492b1fb1b67fceb7f6a97ddafda37f3d529f7ebb0bb1e19129a78a3ecdcb1e183facc3a0d7bac938bc986a30d2edb5160b4e727ffedc63ccfa4ef5dce3677df7d27ba4abde931e9256e6c223af209dea71c8f2383882a4e5c1eabdef9064fc405385a4955f4156effdeabd6fd61f41d2cadc236965ec7df7a3f77d047f27330ea58bdfabbc0150e179df751df7f87f708fe98741e9a28a28f7ca7b95f71f3826c9f73b707bee3add401cb98212eac952a6a067f9e19f2f6297dc9290339482b30c5d2ed2a7dd0d5b09777b8fb4225b913bf7e66b4e2f329f0d8ec8b4cc07a91cb8e451e660258f128c84cab2e70fcf33491ea23fa415b95be8ca0c65173d0afe3e5d0405975cb1704fc4bdd0569fc946646b785db44e4dbc3a35350049a61b380e0405b4b414751382f649abd5eec675dea75a61d68ab264ffa8aafc1a8e78ae686abe5ad3f26e6b4637830647a3c6b6aae1baaefed16c6c581b2f4ff64fcd92be5e9f8ffaaf1b6a5f3e1d7d324cacda8f355ab7087b2dda3f9b3f17ba677f9a8f83996968f1cd0d4ff6cfcc37701c07877c974f1dfcb0b9e3af0d5d9985e3bd7fe8bbfc5e2f41f3f8b3bc7f24fefc084cb327fb0767f91d56dd2b79c8ec7aa1ebef1ab43377abea2f9b28770dd65cf3489441279b5f1c74ee1ce64e7acfeebabbab587502c8f3db596ee3e0cb19d649430e0b58cbfefe5df43db574ddcb0bdc735eedc7bd9bc7563add525b2bcd0c3017e5767b63c1ac560b8276dabd73046d6e9ce5bada79d4fb26a7f2effb564b7424d8b63c479195a78d4dfe39a95dda569b98fba39be68e72db7c294a1d17e58e17dc3fa776b5eb512741f3bbd98dab5c473b4f72d2fb7c6cef7daaa9e36e5cce8e121c08d3e1a2063ad78639427feee360d24411ed16fcf9981db7ddcd49062e4b27a4987d61496af95cd8ebd866dadd634f8a986597c259f48769e093821e2e674990c82ec1308a3d52f629d9bf95c46477f7cd61dc8fdd619ebad890fd71c8634fd5684181154b4e464d66eeeeae02258eb64002419830c2081a7b3600175a90c5181ea640d921686ca91d18892d72e793bbef3e1f5d771319e5ef3b7034400bb8bf7ba0d981de7f200e10b81fb7eab93004da7d8ee87402521e9f7b39b632f7328acc3de59874c81c12463e3857e7edb5cfc7461370ef11b17c8d00027b548a1290ed18797e3eaa97224870799e86381334ff6247cab06ecb0e9b0f59dcfba4e6de25ec97504c1e75103135c40a7cc8f4319715327d17972b993e15a1024c074ac41199d2a797074a7b70d05c02141d428cfc5296c0ec50bac40e99ba1044bf83964d4b46966907769de924ebf89ca98127d8494af208a17e21796c7f431c90b81fa9ac7eb5fa5548827d6129e8ca4bc87d2e6c19f7f59be3b8e7d10177ddad853dd382a5bf58cde7907a0b25181549907a664549c348928c9402614938e46292254986bc47dbbebe055f412e976fbeda10a17b8b8c922cc1a205890b52135283d930c675fbcd8a92c59102b7c6650e89cbd68a52972dd899c582555a297149fdb365ea3db0e09652484990a414d2c591a2b3f4bed7bee3bc25dffd8666f7fd28a5927cdfb681af4e428a9203be4832cc6c03c6057d2d4c236d61b95c431e24b79271a4c0e3908b54f33eeff340d37e03adf6def7da7b9fea37d566b7f01584f3de5ef0fbfac39768daa65d7068e6afb3f6854b3c70a80ad6de6e4a2dbb9a74717b1a03b65fc70e93a9ac5661d115eeb7979f101f5cc8a303d61ec86b162a45f685a5a0b72f2c651bbe84b42c6fb6b7b02f2ce51a369492744242ca9573428a713de3b053e737a8780e2778742cdf19d63f585ca7ffb6d1953b4853fd3e4b5b3a9933b26431c92384fadedf7728e17c7903aeef3fefbdffaaf8553f52c1aa2bf5915c21f57fa348f87ef715a44817a449c2f5afea8ad725ce779f53f2e82cdfa1481eb5065570c5c95c597e496482cd7bdd85f477df559008860376aae0b4e920f94b3cd63f364ac8f2b51c28e0514a3180fe4bc8f6f5b728963ed753023cb6934da6de8bfbfa361ced06be82d8ed6d689fc82603f9066e597c871c4305485e9e3881172cc6788f7cda1226d36f2cdeb365fabda4813e1d357382a25de68281cdd0263e49e64bfdcc35a9d456337d3fca48e414d1fc19eebc4de5555ee56e7a399ae0c965cf83fe303ec12e7b6067db9ba70267500555192625ce3e6a4ab964eacc2f72197d4c943e6e44fb67bb2efc2eb1470ab03f699eb19de40eb5634fd1b74db547025def67b8b52db3ecfdf61de7ddf7de7b5777a30bdcd9f39efb844832f93e07d6dc791e07bebc48eed0d7f2cd157cf5549b71917e0f19de1ed6048f9e5741a2cc8133db28400b58a3fede8217a4fe0d79a260a36cdffb84f4d7af484f38d073e7793fc3e30688f2f69dbdef01f7ebdf4fc8fdedbdd0fb38b8bf3d07da5cebf600efb7f7beefb9efdabf2fee3fc0affa0f58bffafa367cbdb81002f8552fc4fad5db214d4ec0e109ac504e1d57beab079ad6fbfac3df7eb781dc7746f2fd0a6e60d5b80b2271656f8372917e8301026b3fb6930aecb0e779d97e0de541ff2b481dedd7f0f360fb4ea3a2a26e3475a80efd052c619a673dfe9abf724525a4fa9a9009d0d4a1af0a8b4c1dfa2b4a5554f54f13beb4c74f14c40af10ba91e874cae68cf4468f5aa57adc2569a3a537b1a03e6bea349c21c15952a2cba625f41ec732fa4a35c9c48b16cbf736aa53cbf5b7915ec9e033b7b7fde82dc99df81a347c5c8c529a16290651b229153f901abcf82476af80ab271bfbdad77945031286524722adb5ee50b6af32db862c9380700131b5efac2446ddbf676b3bf6dcfbdc65a3d7e9a77fd15a19a673d2b64724588f53421932b1b4b1462bd2b64c20ac5ebda7ef54441387c6dab17626d1b7ebcf5d1d74646de5323d63f21e89f5bbf9bbc677b8fe62bfefa9d65ee70bd914642fe7493e6a9cffab193563fb6ace6a766b93ae9243ad0b3a7da8ca8c06d7bd57bdeb66d1dd85925f3e6a98c7493a976027a0b9207e8c1f73406dc3dfdee03a9d40c91b3a63659c0129ef1ad777d8dbf2244e36bbea6e65d2f54f3ae90c995af064aa8e66b844c7ca64efd9a90c8d4a94f239453a78d7c58343fa4c98cf0f5b5c2d717be20c0fa9abff23d93d5b3fe0b8568bee66b4226f8699e2868fb9a259b3306dc852ffbe3d324e11bfa93e6e9d7c2b1958ab84839f78eee2a2ad7df40e7d5cf56ea310232680412689ef523159ab088159270e50812efb5bf421f891766407b1abe84508a84bddf7e5224cffb7b6ff812926f670ac213e59a459b5c1fd63f34d73740ff743dbcc7eb517dfd0d248fefeb03f11efcf577dce943fee4344ffd5a2b0e93ab0072addf7da0670ce6be0dfc76868d6f4e3391fba59ac8fda30086c89dee2d240f993d583dfd6eb55a792f3f21abd5775e85a3f75fbf0a244363e82c4885f5f29b0066854557bc27e113e23df73c3ae02eec59f3748771f1b5b0888bf4b30557519e5f286a78329bfe99b97d02efdf32efa9efd77b6cbc7f6b21e23bdc69ea388df717f29e1aee7494bd5b81a3c7e49178d9e2ff1538c2c41b9cc20749d7c1f138c291f65b254c328e5532330e0e080eb931e4397c1b5004cf476e1ec7e7d8c2052a99e06fa0089e6ffc058fb8febe0df088cd6faed6ff0dceffdb106de03c0070dcd8c0f1dd03390e285dfcf0e671dcd80000006ec217e071160d79b6f137c023afbfe9c271f5e310cd38fef538c2d1338eb78fc1f133fe0e638c0394d99691711ee38422d0fce19824e358fd9824e3b06b0fe73138d28c5f7acfffcddbc711aefef537e088fff54013c887a88f1ba1d0902ebcc8062482c3091a606777f2a821a0cc3c3ed400bd9f9f0f9acfe08b196006656008481d7f28c4315a64ffd1270f913b1948b54021222e3a4d580218179d051e7905c16f1f871ee6592fdd097ce19779f5364bf873117f23fe44fc3188c1968b984867c18e02f652533b41b91845a6cb802dd5665cf42fbb9347f9cca13ea9a505d40b51dbbff6fe7592ef7ddbfa5719d8fe08f7fe2a1fb7ba6feff5b63df7eeee0e7acf6d1fd41359b6c9128a85a4ecdff65fe8482ecea3d873a13fbe492e384302a92f8e18220af6824c135233a8604506988b7376eca829c65a153c9bca9edf9f479e12601e33ecdf1f073c527097711ff581bca3de7324c9f62f21f608f7f665b6e1b87de7bd7cd9c30ceeb8defa862ffc2276690076513789757777cbb474f202583ed1254c4e40964f3048e56e15e44892fbf2e5cb3c56a904c42eca96024ec05a28fb49c764bd19bb28939462482e9b354041f90205e5082828414041c132050aca1114942650b1a919542c0a2ae604152b022a86052a36052a5602a8d81154cc08ca85292817a486ec901db24376c83e21811d01fef27974c1fdbaaf59fbddd65aebd65a6bedbdefd74e4ab18bd18d9d694b873b12072313657087ce474a6ee0450abc8fa244915dc1da154e5a140b267b0538c9409189c2649aa0117285ec9dcc520d92ebc87cb148721d99c78bc950b1119285917753382c3c8c9173802c9f7828430517020a0cc090e1e44319305b2c796124822e4faeae2d5d74e66444f6dfc0098eb3d6bd7b9765463973afb47b25d62df71bd7eed6dddd5d090954d461a34c8f154fe4fab436a18351545151510956b6b0c7a3a3e0d1312606d9df558513d9ffdd8a266396b23be7e4353a2b75b5a53c60ef071bc66411a38367066b593e8dc161e302d72c9fc6dc70a34c05b18b63a0b496a4a2a66c820c9125ca8a19419692fc3ef9aaf8c0022a5b0c3888a093e17002074315316050650603d48d3254aa9393d29086d8e5ae96948e5e96b4aba4d5d690861eced03e69b5dad4ee15df7e7e04ae976eddbaa173a39c94f42b17ddd8eeee3ee79c52caead2a54b1fd8d49141fae79cd33565ffcfd959db4020a5949376ad4146a594525ae79c524a29a907ab4106ae5d2da5740a317ba458daaf94524bad6fef4d647483b8dfc0264e7c8c6e50176edaf6dcf6ddc66d7f95b8f27c809637b0ca559b534a39c3fe28a5bc1e576bb552defe3a373a373ae938a3a96b7ad6933bf2a91ce9cfa9f9cfff409e3913a44d3abf520a7a9e9a6a24aabe922293c964d40c95c96432998c56ea03355365b21f7c90c1a0db27ddb4a3d86ca4dbc4459f46934bcb3d7f2d4349a4982c71d17faaf3280845a2901871d15fcee437250588a8bcecf97cb63fae7ce37e3a8be7813011e7875e72b199bcb3f44f0701e55b2c57c3d6a26583ed035aea00886cef25172d5a3c1083f7879cd7e6eca8ed05584ab943b1e9a8a6dc355aaa71d38e75edfe1b8543aeb97a102d60610ac54750d1254f77da52b9f6e4e25e5c4594af092a54c874e9324d41460037869e624b0032fd79b3b88b9142c71428603051622f06889c2ed8730e1f70e791b6b7c69b1ca7e1cc1d8a3b66dacc0072950f2b02d3efcf4005dcb268c8dce15f6bad2468bd84d023d9d3916344134d1e35e82135bb84115cb2fff5103719ddf51e89dd79a000f74be92d586baba5ad89e7745d6a29b59652a7d3bfa8946a6f41fa121c7958c1a3a781f23bffec5ff0adb4dadfb7774ed16e7844d3344a69b5e15187a57c29e55f295f663929a5d625bf29a523a594d239c174d45d36acaef49b7e37bd0952fab47fda39290d42eba42debdb50b6cc7127a428e246a1a5f5583c6d11c38a266448c20b1da048c24a40063133180144d14c690858144f482145d1971da4b8723b1994169f03ac18c38a2b4c3268c941ca7b1b11285c30040d4c18e500359d808202e340b9824294263d6c71c66bd923e71826b4acb06c21430b0f5ca4e02404393c954163014060b1c22c8a4b163c500006629e52f0f4820a6240c1d313d4025db8c040cb99289838413e518606272e48818c308e2a14223881092a427c79c28a8aa805327ea052c613391835997326818902e73985941eba58010c325e7044d09c734eba0113786ca9b23f10577dd10e19d4438330b48a00022cae7c21850ab6d020bb2f4d360031fb32c6115240a1434cc99d61144b79e28633b11f52b87235a32f2b743f9280528318474d32b040c3d00478ccf19932c5adbc151b5794904213293831c585ce0a119d0e2d525880414b0952987080a054c70d5e9a94e0c319291428a5947627c8748917329d912990168c91e2c50e33a0a04310a59452774a65ae1ba52e9a7d5f59228539e79c5bb86ddb168e57939706cdd6a3807ea55128c0618616aa289520ab124b9860816ad062052cb022c6154ad430a8070f7b4b5f8a481e734e6e8b3c9560caf337b8f4ce2e4a1f754f8c5cf4f723eaf3031efde84bf67724ef997fe7970ce447ff240a4c74625a1a7dc02843864bd00e19e4d7bdc9dd67ee563cc91a79522fe0a6e85ca09dd9c2d892bc6c9147d813dc51f135816d8cb82e60bbd4a4872f396441a5045e6860c20b0cd78a17a3cd090c5454f02acba7262eee15accaf2a949cc164d46745ff08c2c9f9a74f0aac05b964f4d4a12684ab2f6babc380918e4d1b574e5e2ebb52e8602fcb624ad90c09e10aaa5ad0322f6f5b0713f387927f0b6a8ae06eefa30e364d0b42094a68e74a19b7a4a02041f102194a638203fc4c0a0b132178896a52a38205ba0ba40714080c88225d0c529e7b1775d4b8081bd2c9faa34ad806db27caab283e605d364f954a5064f068cb37caa02a59b01d32c9faab070822a286857e01a593e29496966308d2c9f94a2e89ab0cdf249098c922bcba713807995d0fab9aa52aa3eaf9bdcdceed4acac3536e0f6713ae7bc9aa494cee9ee2b9a19ee8f7b7bf360956c1ef9368c88aa352daf35a39b4183a3516303239b7600f500fac9f213e02379d0bf7706b45aedce9c79efe64d4e60b41bed73b9ecb6718debec9cc99b9caa97a139de23e90483bd4bfde9e703832e272747f2a8322d891cccb040f5650acf08cccaf2c98c17286684c017b7c698c22c0d7c60301f2f51bc4ca9c1635061839966346334d5acba40b1c6c0e2527541c263d030a3032f535367be0325b24c5d6143ea4e8161714648795346a8b6258abaa91d6aae114c9c0d2cad83a6a4edc2a6a0b0ac87efc54c494c4ad74c757ae274e4588c2e561d749912038a56074720898104ee2009592b490c994d07483061ef5e9c26abb97b4b03c59c16f6bc1dbec8796a1db9b36fdcebc82d64ce97b247fe4cea48a90b35858b5c190a23a92375e40e6ca32747485194e6bd2e17751b5279097d35a4f2125a79df380578f4988fae28597af449f29ed1b1b8672826a9239da48ecc50524766a828a923f308f37cc932d1511f17a594529755f2907287f5ac8df5d703ef61814044d858cf0aa98b5bf8d2bebe5080fdbbced66a3ffcdf14e2cffa1ffeac27cadbbdcfda562fbf7bbfef81a64ac845af53e285439dbb70f4bf22b878c3971606f1aca4cf5455d72092be3e3a018fd209680e299244f6cbfc120417a58401f11d423d7c0710211d438e5c6708112b9244d80c8f3d34c8bee3eac8ed92cc06b48f7c87ec285ad5344b458721a34e59b830c4e451ce9ec2c81280dc4d345b3d00388147cf6b794f111767fd1f9dab07802cf0e8dad1fa9cfef99e6938c12472a7b933eeeeeeee4624e4296503a972c7c64b869b845c6dadf62ae90009d9ce57a265eac17cfbdea521953b5da59890855210e8ff28b9c0b21c752479290484ce3046ccb9eed36ef5dd4a63692ccf63799a07be34cff36a56abd557d3bac9f19eaefb7eecfe5da4dd8f373f6e94f4f0cfc7f73eadc37ba8120d5ca42e52fc814a3ed6ea31a803863b4f87a8b1568ffffbeebdef561d6b05be5818ffea5b75e04afbfeda4ff5f473549daa1361e655387ea1d65fd769e062f7187f58834ea5c2f85520ac79baff40faf9c05df7aaef55a0cc4b72f7a93e500317bfef3adc812acffbae3fefbe8a7b0ffc2133f71d48155084b570a40a5001f7cb2555149d7ced7fc890caef054466f93f6496e18f26826c7d26f7d72fddcbddf62637fd2d832678c4d9bd5696ef5fba10b42e04ad93305cf39d5f41b6e73e049afb43b8d986af205b78e443f0bcfd160ae9f0faa8a9a1a9a1a1e13477cd354daba1a1a9a179565735ad6ab5566f7dff6f1d06b6e7deeb38eebfdfac673b62807befb7079a1fa88449b6dc03682b8793377fe38577dbdedab13eed7ce007721e4be06e87dca520e3ef7efefd4d7e9ef4fef368bee657353434352c9abf9985696abaaea6aba1618522cc8c5bdbf6f7bbbb29d1e1a268c19b7e25392e72967beb71e08d8b5cd7855c7b73dcd434fb22cc56d7e802b66a33534352469a8008f57071d66f615a2b7517f6eabba6c15c9ce18c7271ce5c14671917a78c0a93e7fc19264717788461180cc360b096cbc5f915bc302020301f298e4c2773c6bab4d92a4d35e4f923c8d30763976b6a20773414a9331fd631b9335fb600bb778a5264b27c9a92256790e5931496dcb9e79f0feefd53e2a37b0e3a7bdf49895b335a55d35a7f3b531a9a46c3bbffbea6699a369bc6dfdb4abab3209d9571914a8d22cc5593c69a44b15c17aee1da6cc2f19bceb060c9d1051ee9ac2fae11625819dc3f05a98f3a4a27b5d27c16d818ec2ccdd493033b0c8f197e45c1f6c78edd90ce5c9c54aa8c8b9382313df9fde09182478a65e631f17ae28c750c4b9e333ac32ed73f0c96a30bac85affa92cef2fc8ecd1d377efbfbf6f1dc7123ecd84d786d84ddac635a48cb8c2ea9128e5ca433a5eeba54c369b0e864ce178e9d3fd577eedd788faaebbaeefb8ae42f1cb71faa59f5dd7be091efb5979f079f0afcbcfd077af67e083c760eb95f0b6f5c1eb785a3775dd7819caafb3a77df6bdf6f5a77430cfec223dab73098e322cca7878b40860811791e2cd8fbf11f70edabbe7ccdbfa137abef6e17deac7ebb1eb8ba5cc7ad563f3f1fabb095babdb003559fea7b29bbbfff8563c769a0cc9ca669612bb9d8df535a7ed349ae29603e2f4a8d213393e28722447026a8798002e6cc4caa85139c04f5bfd8fd3eddb83fa4fe571938f4018f39d97b3292567e6d4fb7dcaf818b4bf843e6d7f632bfb45fa28533694e71710ba50d149cd4830cdcdd98807d46e363a2a96878afb0fb113384c4f51470b13be30cd199345d4e927819b0f3c6c47bb4d0674e669b730ba7cd8f3369fbcd73bdf6d2352ddf70bc7f5ddc9e5ed0fb99026fe1160e20892445aa04c10812efd1be6bfd719fe39e2873e0b87dfd9bb7da90e79bb0ab689efa40b3679c312335a4f23f633631ef41bab3c8c5f6305b116db2ae8b33e662db98b3ad2de23be6921124bea3092d8221f70f2db942054b5ce12437cebd04193072bbaddadc92fbdb2e91fba715efb14ae4fe16109ee5125734c95c48e51fc86f17f98733368bb69002351e271cb7bfd9ee6cf3281bba1b10877b9cbf018e44f9c6fbe7e3c677fdc3fe7da2ac8175034726385e7e1b51de70e0bc86f3151c99649c079a3820fe1be04781ad0b90021e3d6abc33c97bb410041741239b8bcd45fe28b94451c0c59ef15be8655c6c1926530068be6694dc6f03bac0f155bff3d835c09790a601beba1960c792daa9c1b05a353340e9643c0afcbc2752e3ae06c6c5ee366a322e1671b1a5a6a2661b28a443b8bfd3dad55e88b685215c1f2379daad903bad6d5ae863a4d8dbbda147bd82d4bc7dcd5b988710d9a0036d7b717f5f5c48b3475dd0671ae8648cdc44255952c40825d36f63034ed2bfa4bf8891b08a7aedfd264531f724a518d274777fecef4aa253c009b86bb52b8c273a0c3c2d84807e37a38395c1e36d304e1d00e5c074ccafb6bf85ebb7a5ad8484ec8e6d7f77cafcc70b8653e6227d993d9c59b04c2d5336adc832fd69652ec1609f7edfcf4ef58db47a99f1cbfeeb69c6df49def3b2e1dfbccc18e9bb174825e757fe3739a14fb98e3f0f2cf0388fb23f184851e613077230bc67e566b0b52192d924af9e7e429c89190d79b50a3b186f248f194ff3ae1befddbbc27453cd4b333f76d1cd7f06bc8cc4cbe0fbb7525bf11e2fa149a8144d1795410b11d50c00800000f314002020100c07042281482c208f8549fc14000d80a240725a9709b43089511432081842082080000008210490299aa10a72ea07a8ff82b01811532c57a2f23f39cf2ae5235ad90a1c146470f8a0e9336e2b06a9eb16afca4fde52b970e037605d3dd003244ba7cfcac5742b9c81afd6c2e67b1e6b1b0887cd4f54c5da2f59f56e7cb4a5f14d5da9edf03713b2add6a3057f2be1d73e38ef901b5824859d94e91125784666dab0485a714947710e1e9801eb93bb18980be4beb6da2762139d3bf5fccd7dd859e64b8ddb7e9657faaad6239c02b192c24a1f741552b56fa5c00b1e2f15754c28c6e3a63265a963f8d8e848d6a4f422e2596e3676ce8a297c4d8735d8e17fdfdda0f628ca7167441bad54a5a008d13540b2d444d7d0a1b29b1f4e5ce2650bb64ab2217a11d884d44a5686ab87a847a5ac1d10bbacb25a8056846f8156bd123c05076abead7a6c3ac272889d079b22c07897d41933f393fe7e6f4c0dda718b51569caa31a76f1be7c6917d8c7a8d40e6527ef681f553330242e696d508332bf3be17a1f87845b8e058a7d928117acf23d978c5240c4a08a0f2dbdfff32284681b8ad4895d462fe7ba9f4277624fbde88329913dba4f847c8722f6af4544e85c308c631de31eb0661399643681ee00f3b68a6be19d1afbd08c988e936bd9d83fc07e08a4855219f8e43382068d55c326c1bcb3cb3aec768a6dd1baca5b746b394d9dd6a0681ede6cad7604ea494a6b991627367f9a6adc71722302c44467ca19aa6a52d3937691f70743d3c32a2a8b64a5513495383a8a63d8d92db9a0c43d23533b4ef3531f672490530d82016b8087ce8077fcf5346eadf5126424a5753457509cfd5e09ff2c49810dfa3395fdfdae73d311ca41b1fb7ed7ab6a69a08249426dc682572fc6d739a979315cb7697f8823492bdd588f77e0bb96b002482a1981cc99ffa4339e8b59c70267cdd227e5370d372d320e3cb7bd9d0871c31bdc8c70d87b141dfc2d668e81b8db0f3fe42169b0012576ec0bc5e8d849bf069555848965e08523139f24ee1998c270df1a47dd910f6413867e0e12f3578bfc78a895b144a2a1811366becfb1e566418599d883378e29f5fbe7528eda7705e366ab12999d8975bc5e412a1b94881aa0347d5e1bafda5ff91217485e6ab1676a37c87235d0f126c46217656025eb77e3030e0fee38b71415bd354e86f503cfcf001d9d8553013fd3ea222f80af05645805e823104612ef955d759530fe324e9cb7bad8aad8163865fa4644ee95f7817c45379fb3dab18ac90dd6878aba1293c7daec6f8aa4d972031e53504c5d2c08d90d002326ce3a0a469a26c778d98c800382ac9e306291d81a8c42aab7a48dbd7abe3c7976079850b803b1357e9c413677acabd707938796e68cc576c0a900c5150a4008d6ffed3670817047ab99bbff3b9650bd8eee3a25ec9900d3f669b2e46e8a1d5f37d4a1731c989db6c72e3be238866f57e8dab38165e33277d0f55f0b0fc108385cbd456d413e1a5a7e0c3ff0d1d0ad5074306163a753d95491cc7ba169b38650098bb4bc70d1f8c3980fb682ab62d49472d0faf83e69a74588d16d06da76c0387420e871e78e25ca84abfa2e029e65545f9eea7f8b16288766e12de51d339b0a4dbe049bbbf325d07f95b43168dd20a6aa49cda75aad911b485e7422101e45da4c1842a0103e524c793d3c6f85653645282e928c349a86bf98f1cba9e0aeb3749025ec2825cb254c6084015407267e90f6d6235b6b1b1cd3dac687f79855ce1c8457adbf83ca0ca9ea9eb0db3d2b920292d80711962eae3e2ea98d8d5b11d50d365f4af280d61d3318c0abfc53f2ca5c466404478b6c258f9d440b9ff993fd25494e5ddd6a8ed8cf2153d7bf78b289d223af5f3d2828d9ea8344bc1135595e2656ad3e9dcd1194bdb54825751ebd3e7d323ce3a2bfb32308a7eca885c4aa742a6c588b5aefaaa0216e713df353b8eef45ab283e8815382b8043e8496c9bdb45c413bd95e8cf8010d4af783ec45e7a0f118502f0cb985132d57c54866e935bf80937d8bdb048adc5b920fbef2da4edd5176ddba9b39f87cd2eb663017ae8f44dd3808430801c8850b8020c92f1487546e970dc24a1810dc276ca2d7b9a3e5b4e7c9be911553160382c705b0123fc0d0ea2c626df807a3e37d49d4a54881e035ea3ad8d08bdaa017141dab8e7d405a514e67e5ea4c944e3757421393e59474f0b9c9643d2a29e001b316d119b723ec824dbcdc4735d75ad6d0d9567b3eedb33eefc9abfa21ccf0abc3eddccafd6944607219d3c8b3174821f8dc009accaf0c374e1c6380f0e5dc4b730e215670b4e9773db133ef6a26277f2373f263b2cdb893f55010921b9c484f58e1e3f0de063fd41b4b17c30705d1de8b0214bbca01b462a9353991f0190f9977cbdc534cd6ba62e1de93515bc216ec9dca00146157beb2a49a95749d3665d2f554c798654eda86749b8381f9242f5023a60b89439e4677dd8dbbaad22864bd9cb41d14b744aa10f4728c2346cc5178dc58ad52a4a029f06382b7bd9d7f66bf920b750831410b60278a2ba729ddcac10391784b124f0407dcaa535cf4a34327474ae7cd66fa70d0535cb0fc45784a2f4e1dac2b943336711e007884515e4ef6bef4e209047d8ab134b3b110c8da98bda7df9fb1f4187cc2b7d02881a5f7a221fbd7f8f577dfd4e50fb84fd156e9658761152d0948650fc825b858c67225b11cb9e4944bcb1832bee8e6ab6e9981afe2145129021a6871499dc6796c80c03c8d3badc7f0ede4db0278478c66e290ad32e541429d55f7a836022af5cbaebbb65859e7dee1efd92b775b4e4279aac32e2434220855a868a7350bd4c576b5eb157d4e5a81c61d56d5a0b61571603fdd69cda353a4c7cb95810c981c2c4917ab0266ca1ee3b8a9f09a5cdfd4b29b8d3b901365889dd79c38d8906c9a5cba02a86d41e6bb850d1d01e00136bfe150d50eb65a886be7b4325c89f39ecc481b9b9acf4054d69d6a023ee10fcbf921b80e6f9a69227086dbfb6f187e947ed75b39e728c03081fd24feba63fc48a6db61f799061284077235db2082645e7430086cfc02c2e3a95220d2663a10b917d19e6fd1f89886c460e5edb7cb3b48d6a57f631aee4dad6eb520c08ce0f9af5c29c53832c86880ab73077492fa0f2a1401603be6066de84cce307c8982f49d02fdd54b92aced5b83e997d7f8a6f975012832527416208639628bf28074fc7599c4734e7bba086ed58620185f3a68e4cb7c309d6ed9487001d6fb5590ee0f75660dfca4b729d10a73852955dfa18004fb358ef05147f291101d8898bbe3aff970ca04350cc2cf0c8c81697e94f91106f89dee21a00f6a9326c3791daba114c1c36067f36b02508b6aaacc49a45ccb9c5f4552d9c3647659be63e426a920a91a1336985b5e0ad8a41564780d3041b3b1eba2573fa85f82bd67eaf471b1f9f41e486148b95f72086f964d1b5fccb73aa717b01d16e7cb9c1ad9ca0991b47366c8f31e185ee0cacaccb86b42370ac80da05a940397a72bff2122c60c9afadc44ecd4da9b32cb5f85370972e5f272a71b10aa872f93a582ab1e3eb61627a80c15dcd7a03ab7bf725a2aadac9bc23ddc2e5d075573511bff0bb5c9540ad969e3771cd70a4d0d5a881f4446315ad6e26676c25b561e19c8274a8388cf02d804263a8b28638a7371491f1c82ac5b857590bac08ca4aec346601110a0af7954248c6ff538ede8836888221186da7fb0304ea0121e9b0e3ee0ab3a0181ab5eb4b9320396906b95bb7c8f64fcdbc77ddb44419539a6a58108ae499c6b53736073007f487bedf501792773b956d8641abe1bd2b53c36f542882e13a828754a969e4d0fe2030caaf3c42218f3b074ce2189628361894da29e5f8a5ea634bcd2369bf274b1ae4d8e0c5cf059ce8462610636300bde6012d37fe942241cd93eaa8584fd3ace4e53bc92fb06c69e6ba39662b28b94180d0d2cc759a3f4d12ccabd10e010a661cb06506d86e08fc4db6c8aa25d9d2cfb5ae56e38a6c4bb8a12408d2ada7d0c305c22c489deaf279de8f525dc5fbf90c94f69eaa3a37feff22f04194379dd35937459bccd9605bef0719602847b765ab105d9f69d0a5793c67e77458428f8a0d5ea43b02fd6810f5e138fb3aed889b7545b108c43e79e8bdba0f545538bf10df4f7060de7323750545dcedb7e129d1d846f5b74bebb9f9ea51a81bd61f6a04684d8c7211deff19bd4694ee0ebfb9fcb6264ae32841899478ebd894678462fc8f0d4767ab8a9f23e642eb9fc7d61476ad92047e269eca9752d6f6c2621c8ec843dc96a88b1851c601c96b848c986d3c55a91fdf08be35b09ca570fc4985f8fc80d55de325d2750f50ba8718be76fd2a8257d8bc1648ba42aa94cfc005a95da44e23f7833b1d34463d09b677d2182b75ef7cc18794fdb17cbdd96bfa6cee323df661adb328a1a9d7e0ba301d77d65aeb23e2d8b1526bb6918b469152603b81f57c0c1680d1972edba8d86f3f8136d8728fbacd25239eb091bf70a40f125660e546b7688de3bd527a61ba79ea0c7f73de578c3837b32cc7d628586987312a87a39fec86b24a131d141405602372158c7c0f7932fd1e9a0a1232ff1af1a62b44f62d70bfa68028359efcc6eab9b17bb807d56e43cbea249e8a68e40e3451442d1415bb4db3ac38995049cfbe22063402ab460f79fde2cfcbb67ce9cd81ac8525f3404fdcfdc1865565f082156bb5324a325b01d30ed9be40a0ff5aa8ed6fe2d086526e75da6ddcf1c4dd13bd6653ba4158769e5ba0b8af964b4db1832d3756efc77e72730054b8c10d5b7ed5e18b9edeae8faf390a351365c769cbfa2cd5055d3c2aaf6c5ac538300c9c02954f6b2a8a9f21414266af6536c4acd900e92dc22af5378f86bc041a5ae8fd52355314062d4b480a01b7e5f35cdfcfe6ffdbfb214d64a38196e7abab7b89ef7c34c8a4f9fdf08ae290183fce584fbb3d7632155e3365ede53bda46d8b04ff1c75e9ad3d32940ec616fc64f4be969a50f61a4e68f9cd8b8d2aed6f6b95ff49685fe1d2773855061a3d5bddcb316647cd8311b7892850b24ccc20a604415e931270af32e13b05743969ee4c305f87e0af60e6346ffea446d7bb9c200e1cb53d21ef2c102de6982aa9673ec08d4291eaf972fcce9837ae67e67926b1283fcd39b8bf03b8f3c839bf17953f0e04a05654e808e95c04688c5b3f3683faf360d0e94e40e55cff5a767fb0adbb2e38cc4302a78886eacf5504c2d99c756c3b8d7005eafbcb88767a636207779720805a053d736bc83a21d559d8896658678c683c2f4a888a30ab831e0e4c58b5522e2380c3def9ba4e8dbcaf176c1e86dc625a47ac0351e3d8fe6eb4a29bc0bac47bc4d1fdb184eb6d1468c30910c410bf3fad5e9b3a59e4645290b7374b3ee1df84eddb08c4515dbd84175ee28616b4a04fbd786d4f82fe3f495b0764c01deb875eb392201860017b64e96671729f26853bbf7e91e45b1d2473932b158fa78144f4a215da4527579f43298a30c3a68397495a60b1cc8c18a232a93747874dc2ff93539e285361b42ded40114463abea991b02b5e8fcc188998c774371b848dfc0ec48a0651a6513a0a788035a5871c08a11febd50a84e3abb08a1aef065e6691c4da093cd0ca6e7781d85fdaef984795e5af2a700706eeb1ebe85485d3b81e6f29f7921548a72218ee3e49c4839b8d252b558b184ae0e79f5dbcfd2235d070b9773aed3c908428458443a3e1aae9ac2d0681f92519ee4d7845ad5d1adda476df7b3a06b0cbe9f0d7b98197a1693fd0d4734b9fbb2bc763fde8d2c9986ea08cbfcf1c9b78861eed2507a063a058a37032ec00ba1b61753832434bc677ec494edb27a9d3d2648c3e953fb3fc1f25c7fbdf2810b0154fdeffa69dfa2fff94e56ed2b3b53ef932133c5194caf99b608d2650e65203ea67437f7bb44b19fe656b55d7e0c8b45f56c6638d536c65baf9654d0a94a56b448c39ed24eab19f8b12b135723ed818ce8f8e015b06071ea9ffc1ce727b15d01fc920d6637d81ca5efbc870aec6855c012c27dd172551b6855b55b114747d0d3b80e557226781ccb0d24da607a1f7ce1ce16ccaaacc938018385fe5a057aef518316305bf2414cac826b74c5cc0f0ac61eeab2fee02a00072533c621a4eb9b65f5fef67bb06e725fae6425d8095bf433027dc01694b52021ab8d5eda315f0c8f25cd3c92add738fe79d54ee2658c39491ebc1425818ca150fbc41b04600f4f020b6ca5e0a813cf648cb265a6151a6c888428036212c4a9fc04c20f292a71be38309fe8a624092925aa9816adcb959d0797b3a39710cefce15e8fd93fa9cf81d44706ac4715e0fb83ad8a5bfb528ef8c7e6b6dcb040f84f513e19097625d3aa0051c72c40a3238ab4283f8d87ba538d2d8b1a811bf67c8f6ddb345b2259aa8922c0de60f23d008b6d9d93b190817d768a55816154838e29a886551dce0232b413d0ca6d8fabb47ff16b2df60332054732c310597998b806b16f59ae4d25af78a7420c5952b62e8b9dbe32bc226a634e7bbc0656591de2d0cfb4f3ac7242918ca469061ad55d90b91dc4966089b6ff1e98b10804b401d5062ea93c0914b0583be74bc07837f4531024c086802129c2ff36b7bdf045ad97108fcb59ed7c289c5d77ee90aa4c0142abdb3de12d9efc1a0a7880d57ffcbb4215b7495a160ec33d07e1c34f9896e24047933db88fc2c0eefe73fe7e23d4eeee6b0a9c58c148bf2449e9b3ea5703bb10860176d821856e0582c4a787f928364f631e0fb8f08889e877375c5a252df7fd38c1193b593c6b23074302b1583167b809588f70c44a9cb440ced3e1fa3ea3690fc1fa52da5a36d2c838680fa7cf4a45c8694b4c75843c603b72d305c7103ab37246783d3d8da58e914a081a40ab90637f90749461b918f50b72931eefe788f6bf5582df2a54719e96506278e00521f199c61e13fa9060549f35601dc362a6e2878fc718b5a1911c3994248c6484abc8bc120ce35c6182c8c5cce95aa902a387d67babeac2c4ccce6200b24cd59b5c4a066c26afc1f2c6bcc97d220f0a60e4fed5646c6344eb1113ea049e1fa61b7377f106e99312240c40c558830dfa7f11bc5c5095e615c8ccdb787a17a01c8c0db57e82b06927cdc80be059ccdff4b3af4cf4bd5445016e6ee6294d1eccf18dd46c205ec92231a08b7529f6d693cc71bdb78cd65292af3a4d344f880e259529a861d654e5620ea8edf32c0e7d016f16300d276a6a488a21de9841b8c43269d2cf7366c8cf6080dcf8aa79eefd41432c666eb717f9672c092fd5f584241b7a356940213471fc45449842e23d03de9d3e2443499d02c099678755a23ff384fb956537c88d8a8ab5e28d0f7fd201166c289a1d10f895a1b06a2240c7af951bff3eb45c399fe24f096ceb173836daef4d80cdef1b5a9d00f7063361285f91f2e500a6f4f652b39ddb246c0e0f42a93973156af407fc15426a841fb27f7785f70ba92420881355462f2d005c6380664a399bb10dee1fee66e8822b0a42dacff18461c59999d5a22286f0eba4298a8782cc9a4b6197efce53983c7609db8d29bc288696fd3b6877d98d6f2281622b80121aa4eda011d5d2880d718383161198227f8daf31cb0e765458b0044bbebe496da247411a5076e62b27778e3e25725f7c2ae27f1753169cdd87f83ebb7fbc432b6f9ce663931e9b0b11f4ea208c875f885b3f5ff8fca33075f03c2e7f3c089dd5254c4a740570ec732bb7f3d2c11135850fde582dfb3850be1005c69d8f072382cade3e1fe019c537cbb6f0e02e30ea3279bae4ed8868a17f9347159a991d45775a2a8d3e0ffdd12f738a4725e80e30dc17caaf8c8549c1c0687e0147d6c6f32d9510607c6635f95ef7ae2a80823fbb7d5c380480e01195602b43076f834a724ecf5cc7ced5383c38aa1cd01f021bc49a5a3a813e09f22a6873ad5c9572ef69b7fa6f94298927e0a498b7d4a6c99539ecef92651f33ae39f919af30133badece7dd921abbff4824102833b74fbeab342bead03db3ff716ea119360b1b081246ef0b733164d2ea30f37386ebe907d2047cc0a5a2c1d2373b9c4dc9126aa51fbfd5bd10e9d507426c9e1243380b1ac695e9e4764bcbc24494fb3cf14619c3b37cc21c213fab984c29a1a47a67c69b478e4e80898c346cf92927c81fecc8692eba9f7aa082cf20251a529350c1487fc56ce2616079a9fb18a2490520e8441f5bf2b628d2f9476c847db198c9c9f12bc3fc5f1b12903aef32b55255c2df0be20448626512d0250059679a0411882046d5b4738dc75c5f7d4ba1cda93fe71e8330bc72133e6f4d75f9598ea7510463a10898a2023cade2a881c9e71886aa8f185bf93e474d3922c27d203a93d9638161b5f84533307eb230406c925e4598e534458ff2647a1fbe7c885255a257e49e6772eecd82ee25c26ece3eb4b9452c9bbfda30bd786aa144c45839456a09c107a2bdf017a13eafda071a4fec863554c8f7d24e3a612d7b7e2702ec68036e3253e34a63df6603f3d8aec5c57cf868a4abcb91404e0443e8a947f43ae7212763d776b18587fa7e6d060cec8b4d609a1ee4324250620fd5891f35bf53948aaf96fe8063b957f73a749f6caa3f333da47aca8997d9e4886f9ae80c4eb1c41eb64e2fa87fa89d1e7c5ed28e0eba1b403bc9d15c15348128ae48b185b5b87d6fbebb9bf8cbd75b4d17570015d870031c02a7a4478f9d8557fc0955fee44c1eb083f8cc018cd9758abdd2935e1c2348e8a25e8d78fadeae84dd84b5a4da377e078323d4804e01488280ee48007c632b2f50042d12df212922520688e290eb0fdbfe36b28612138c16025e85683797d8bb128aa734cad3cd275f893a247628de9a7eec0dc03bef453d097403e89d2bbf203daa309bf0b0556184cacb9d6e55fd2db2b4f982492018ff1796b7bae2affc4d148e183acedce38607e1c96914c6519f6bef4ad7915dfa26acc61f7f81a7e65ac6d331ddeed7dfbcbc91589f3268ca1eb8020bc846a2e5f6c57e47ce183983f293c4ab52dea20b686bc95ffe0952194e876425bc6b40c10b03941f07ca7dd28ecad9c4313034f53b3127e3c5cea816972808c4ea9e85474d1b9c223313ded6ca2ffc29242ce18b68da398efb483e46cdb14a816ebf6740aa44ccaf5fe6eff44209ce84211740842642feba364576c81e4b775f4d7961673eed1719feed04adb2d63fc2d5c6d15591ce9381cc04a5b7c4f8a6f8a4332a1d4094b6b0da09b8c3de8b63524d0eda0d6c1ec2aa986ed39821c1de9970cf4cb676e524f54701a06cd7fa4fd69dcf4339e1a1a50a25d15f4b5d8e2986e0b11b2c8e2abcd8d1ea347300c3b53f4b1f5c7165309a7368d23beb6446f4c83909b1d2945ee7cd25492ac8188fd7e827b38ac7a18ab6b61c6485fea528eb4e3e918256ea6396cc21d5375bce1885410026ec30afe86839264f6113924e7762ac89d757e99ef1a895dfc4ecf5299c9425c000c48ee8e380f0494d764e31ba477762d92706561302831417b4807e0a8dc944782b23c8827913e70266db61ab1710570af10fb5bb5ef1cb4b892a2a4004fa9ed678a3507337b6e2a8282d48264b9e62ad0a593cf62bb5d5dd7d777ea07ab885791fa14d78353e446ed4cdd53e01616890821d9c43b760997be1892890a304e9afca448d01ca5a122e6c11a7ecf1c138c04c3da40a4ea671c40066d90ef73feeb5b3ef862540d04f4c6a53d07835eb44e1d6d3db185164f73a1e0690ba5613540f0799acbae39531e1f05609afd1b748219742c82eec3c1b1e29c6e4ac44373b0e1c0c3c7acdb91deff1feb2c6d400ec9427d017091e03b7a02a4730da5ae59b23d3c6bc7722cca63b4ed862de4e26b7c755c9344dd956ada292b2e1164e9d0cda7b12a0e718812a1e66ea3e836f09998c1333ceaaa7b6081584b2b5b3d1939f17194a90717b6ec0ee5c4511d459159d82b730ee3455df2ed3c3ec4b2f26abbe792867bfc5bb959f5ae996e5437de351eea5ddbd68d0b78b347ce6b15883e453678e451b01336e00dc975f83b48382e82e093cafe0496deab1806702228dac867bfb89c39dbac3fbfc7155372f2bd217bdc1ec2edd54a29669bd0991315ede82978c412044650011cde4798a9fda567dc9660f5e42b4d68f392092dfb503d8fccde2115940ebe4814a108e070941e59b9d2d79c28fc146a6abca4b083ad50a0627aacca4d8d9ac1e88e7af440c4aee7aa0a54884d7d6f50dca467c27b4b31d2fbbc6853c3e196d626e22435f24b33899bfa63f3c5073dce98ac1ca0fd35095b124c07c486991dd5ecd37d0daf20bcd93d9f6c388f131aecd5c17756213e8f0ef6ec92f22146af5daa7a8e5322f8d8a2866942e71f919e23595dc1519293130345f4b582737b6d6c088147d7ef0a24dcecaa1e9fd75aedc89b92679e3718f07132c4de595173578465f0dc8ebe751d284ccde46862088e58f33fb1c5c2328ab0f676c3c216d88f3e494d69c64561ce8096d16c06ef673f184da447be1af293bfc96a9d8c8c7f832333f4ce0fc82253d1b593e86bb669452767bc0874c63f267e530a7b448cd440a766000d0d4dc8a5165e382b921458860f2e48cb18a749874feab2273ae41bf64395d3ee03babe5a4ffa215dc590502739e54ae4a4931251184b94280c5a3a7969280852b4672c2d4066905a36c5678ac5cafdabf6337f24c4fc05df36bf35b629d33c01ce5775483f08db651aac994226146e5d3fdaa5508e7f810233a10056a24a0c921a6559f6568fd93741c4e1b59b2d90e6974808c77da5d18097ff047910e1ac2129d1ee09c996a087cc7e5c1822dc8d30d93d6788c2f8f7f30649b878f847398e456dcfa544de638a56fe49069d31d23affcba87243a3aa7d19e69acb7f39103550e4cf43c3c4fdbc30b4617241fddad4b573bc80c3daf68a05da1e851ed041d5b9bce4ba24313a806771b98b680a10666e26e4ad94eb9f9dbd636cf90c888e2690feca695ffc7e8f38d0c5d82099527f7867e387e245a9733fe72d16d321c2fddb939bb8e8579c4a61423a5915f6584e5502407ae08f19f3223321a03566c09cf96200497cd2407ce52080a335e1c3bd1c441d1a8d9d106ba5ce69c244908cc0ccf285cdc4c4d152a61d29c11bd33da3d39549651bb3a13adb1288cf77b00f5219a1928c482459fe9dacb4a48481ccbec5cef6f9046422727f4762c5b3850e62d018e78152164dbe67f52e7fbe333656a88a9760b56872fe263072ebfea9274e8d59e2450fb32ab00a1f8c915d6560d380b35a0322cd8bf30f6d207462d3f305e829181368f79de25aab9703e12438ab70ded8e8c405af364595b5748701d6f79165c88002f756acbd14104b2664c8c32e01cfb40309e8b97c9ffb261c84fd7daea955fb10bdcaf1cdfa0661f19b0b89c423316a8e127e2f3f1f40259d7323db2943ee91a33001ea1232a49a6f7c85fdad7c4fc12864d8cbac57b8564ee65584e92a0890b82408ad139cfa3bc939be9e011110fd9b5037e7c7b68db7a7e626018d190bb2388780c1a22f198495bccf7b4689bd79736e13f548b860cdf025949288cac4b6f0c6694704978c1db6a91021aa4e3cd15450bb1bc044dcac60b82ea886976daf585010766d7c96f4681da4dce356091648828d892f43b15d11cf9e6cca80e92468f3180698f8526f051301e11ec05c15f86ac961a007a7430b2e691780aac743a8df6c2b17529ec378f7ca62ad3fac372663624cc8babd195157bbef811dff461db7ac34e92d551631b6384f63bb812bfbaebbfe9f3131c80051e5220d4c1f544ac1b47ebf78630869a1dd1e5d25844bc9d17d074d44a1a92a76cadc5eab0592dbf1bb0e10a799219c33c3b01fd17fedcc48aee28593f306d3da3939aac60ecb676a71f628d6a7192634ce4ca5867ad0b9cfbad2ad09cdf215514aeafdae3bc2a10dd35c906c334446e8801050e74435c4b1c2f462aac4360501e672551ccb7e1bb0471906527078bb9247ddeec238ea659d6012ae106204c67a34ce1741686d2162446abe0330878025be7d84c19cb42a7d74d3cd29bf0234cafccd00dde5cee07b90451a2a9aeaf1ecbaf94d1bd15b80800c1feaaef700e79265619d439764da695ca1ed8aa55ff86d96b782a302b75e9c032428d9bfc2b3a9db8ea28352c02e4a517785c13c856f76e28a0d67f230f3a94ba55847e7eef2d0b4e85a5afdb5fc13cb45c6dd89f6b81af5387c49ead31591c144fc228a41674fbce488cf845f4e0f03e91ab16801e6096d39daf35d5b9c152ced1954944430ee2fd4c5d9cd2b319419cc1eca5cc828847765ed70fc83469faaab5cadba10c37e60a888ddc81c6da92025ddc924c052849637431091bde8f0f259c8152098cd4f1e39d35fc0e288bc9d4e78ff51e19f480d924e4d7a517e749f249b8ed1d56a69d7c5bc8703c3e53cb24b79499a52eff085acc5aedfd01f4a6ce9f9c1a0745bd9213b562e7fe28667e1ccb9bf08296a9991514b1df101fe17ef6dbf1837d190baa7aafba5b7e853673033806d83cd11ddc9d067a914880c1b81f02b42782b547a297b283a13d7c0ab3dec4a3a984e88aaca2c6b7c52817c1e5fd587c99b6943159a74dc6ee882e73070a57b8e4c836a6ad331969bbd68dec7182616025cfd903cbbd9034ce41f433cb7ebb74d1916b53fa76a1013c44b4fe3823df2fce7dc591b464fdd853308b7cd21ea91ea31067a927047385547487ae608ead85c6bf45d20dfdd807d3d7e24ab7fd18b06bb7c93b2c8fd810c94b534c715256eb5fa90744fd71b8ac1bc2e00a7f94f1e602090c5d2329f53eb025b3336429a9d426d6bfe3421a20a137543b8e627e724b6a96bfe5f325280a5268498d44d78b38a760542eb7c4b3cc72c8763a0e3b5f9c713583cc3e85211a51b91d124aeb94693671a2b34206d4d9b110cfc33602379a20b47db8382c86a8715e06be2940dc859f7b10d1051d6782ca03751612e2debf54083c38e7c12de97c6081cc4b545ebec0fd5c8016b5bc077d5405cc9a3407c299e32b10ae317dbf7f5c760294c55b0fe31d9fac350f2a5a2f98a64e781a64be928f64fe9b246a12d849400d6be4a87364597a72223955cc41ac5e97748b5fdf59baa3ee59075e5104a250bbde07ece3fdbdca2e3a922a504283ee81004d17a8330f3ad2d46718ce19149f4e67d6d4ebe26fefc91d3ac771d8aae75fdda3cb01acc793050ff4c3b2a108eceff54c8f4b7f65fd0c55db71d3af9c19244ddf2833b176915a4104059876461e3ed52612090ff7bbb94f9be5db25e29fa90c906abe0e6ade23e6a85dc01d60187ab2e22b063219a0aea3c574e6bd7fb3be324eb4c1a5f2b2c011f2c109112f8a01a670776cd8e007f78c0c10238967981780c881fe0dad7aacc38ae66c46d3f3bf1a5d92299a0a0b87278d906077b02766066b1c4630ae404b81d93a56c5e93d6f36309953f596432a1a29a3b7a0b93f4d3026df470b880de4663ff571baa6bf3e3599c91a6548e5d065f50d5b91650c481661e1a835056c34cb0998325453ad247b8b29d2a93c733351a0d8ad707cdd56c0f173570afedcb04e2f72ff4a9af5dc0d269fe3ba3d3c1343d67c00d87688917d5c38104bf1815473d4050c0c8a1d882fa0435caabfa01a837a519ef9c1cd1e47245a26fc2488c7c702796afc5880af585cf52fbeeb682a14096d115466767d699331900a58159c4107ad6752a3d5da21c2f3a2cc8f5e5f75ac0e735cfa2bf00dabbc6f2d30505b3c1b3b7c16c141b94f04554b54b3a1e8537079fa871da546ae875ab952c40eba8a8522ce79b913c77dc84f5785c7af0e180da50864c5b244df0ee9fb76d24e425da94620ade3b0616a18964e637a7b9238d01146c5fd23a17a8ccd71fd5b140fcb2a4ddc6369677554af9e01f1d9df19222f46cd2f650478359e45d7912dc222c5ac168857d6f580486dcacca538c2e4158634876d525510bcfbac4d4e3b964dbd5cf3365a8041eb2f359923f8c1874f92f432ec844d27f89dc1a64e1a6ebd86644d938b9c06e06234f9b12e910fd0c15c26643da5d984939f50373377a0ff858a77fae2f1d4c411753ac5b8a611c5120d12b8d23c85c9d860dc7ccb9d784c1cf6aeb026b7df82fa0af3fa102ff96514bcec176cfa88b3c6fc1881f5f583598771db2472c71c566af634d152d81c98936d479edbd20f89310918de6c009e4e77f01968faf1419f48a5eafa2f86cbae23dec30d70cf50b0288864aaafc4c67c84401aec1400bfc7ab33020b9a873eec8342908f42754deb864f188a91b46ccd2ac53f63f83f58cc3e1af7f91d94fbc9aa225da3b31a6d3366480361ccf09292e04a0540b4dc302475777ba1b3bda048f400e4d09a7c6ec49c99a7c13d1728b46ae9a764678c1a095b26a99405eebde4b48221dbe374acf0228b58f97a51d9704306d13598dfdef2d27e6ae29a44d3f54ae27bd9c00f9792911eb58f277c77c2d91416da8f614ca6890b8677b3db96598f640d555ccd00fa51f664d62429a49f4a060b8374b2acbdc7aa4027d7dbfcc2cedeb96a0409e2fb3a3e1c3819702ef172412749a891637e0fbcd603b16963175947cf78ecc2ab7171c0948400b959be2c420336bbd5ec36d9359e53aebe47d836c875fba5c7642c93205228d5d7d0d7ade9b3d78f244c5c299cc5a492a7be84a70f448be802b535b532b65cfc9ca3426d8beb802b393e97bde3812153707bb9e6261f20e32f73ab7674b3810a669480430d4b6ebbbdc6388953b50d4d7cff17596678c85ba6385e75cdf002c9a9cc84d622f0150e18b35d35c2f9fa786add1ced64814516f1a7840c0673a13a3b3ae00625395f1e1d6e5403367a60b6802cd29749bcbb75d53d7803878e997acb88323cf564ab595a1992b23551023380d58ab89c31d4d3c77e7d0cc15965a90119d2ed02aed365fc2827cb7e9915c420edb6094652bb04a67e2b67224412bd689b6a1237904b66c305adbc66c7e3881a4d5b07b33c2092825703543069d827b9f8b165d0036ee704f021b9d2b8b146a22c0b85010c652cc017bd7410ac8674d04ae7f8534592da5a216a46d3e65e122fca30388a65342f7c4f58ef4a3fbf12e568f49fc2937722faaf096d52c08de8ac774a69cf8183bbc47c64b88f012a45e6d8930d6b12dad478b5df73a7c083c89c181478b05516013c5327080b3c4c24f60b5a38bcb5f6aa9ae678a382845284382f2488b92f48bbe3ecb10458dd88fc86bdda848554d31a958d2904540449266acbddafa113ab518e80c1e3af40e7cc5f53d21ce5b7c62ac49c011277fdf0d2116d3ce838298abfe21670df8945b87016e069c5b204ec64a9d23069e809570748395f8658856a60ea175748195fae5a33010298dc54531b79826508c74cd280a3961e6e64e02dc03d60746f6326b73ae8b7348b456102206ed2c94be41033e4fd1d860c00a2ce654ccf8291bae7d733c0465796d38205b0c5389b4c862f5dd18da6d00f412a96809741d4cccb35d7383008daabf77920818d4d496d2bd8f4f62b18cd5451d1c0b7d5afed8615bbd711e80b7ed2bc1851d9ebfcd55da75f6c344e2fadb226a67f006e062bd267488f1a5a0deeeee2e9a6e850d95dd9880dc47c2c83623dfd12ff91164436d5c2b5c06e53e8ac726623a84b805d4943b418075264c7671a2227ae7fb99cddef7c4fbb50af134da7b003e5f102159fc97856ebce49614ae0d892f81c2d8fa9d10adf64698def83646b102c38a3ff51e47779006be1c2c6179b89b64357f83d45dc79e1ce9121a14ea5c9010446e8bba94f530586224356955edac84ae45e56ff7a61aa6aab635cf0e7280f57a8b0ced5b8d7de9318649691450ac9d6a3434eeb8bf64a981ef4cf8784871b974c8acc49677bc88983712bd51cdeb2ce34c82a32e33d68d4ce67d7f1886a8c6dd339e65aa49aee31accccbbdc112e677b987482604cfa766819626c4ab57a81a93faacdd6356cc9b1fef2bb3639c0685367b0bde5a27671b225a008fa3b5ead0c75d5c926f3f91dcb9c67152cf1376894e6b847698d8474af4a9bde009e7995b4eab0fdc3743c6ea6e35ca842f86892dc295145fea9d90533456337577d67b182d88552678c75cb3f42f6a692da0d63dde0bdf08afb92a91abc61ea6c4436002412c49acc27279e8f5f2562d9676e9255750ca818f33a3a20c3130c47d1797ec498896cd6ec679dc9896ba15d25ea760a6e0febc1dabec011ae74b225e9c91a96989e9b747b0296d7c8be1c0807564c1841beec7a025d90ec5a12d02dc8b0db6b1279aba8c6fee07d95eebd20ba0091d1af177fcba7f930cb40adeca78d29cc0479b5fbfaa2ab50041275d674a8ff5c8b9ecd38eb4d36b40b7ab8b1dfed679fbf517507750f350274ad844c673b657cbfa85101c17deb7ee04da9d8706b18936261678ba77506b6075366195b2264889c576ea5592cff168620778d0a1a4c882b5b2e2b38bcfcb8892638ea3fd51519e1ad3e0707de4aba85dc4b920d0e71debc824278cf5ca4ec06bfa35aae107010c9375911d28d8048bb26d593d7b8efb26ed0de72714efdef3756a5e8ba0566ee1c707efa74784d9185d6f415b42919ccc0cd9b1dfbd9b20827e336c1cdcd385a89aee454811035ecd5e479478bcf17a2110beca8dfc28b2bb4a7975b3078d26fe652722ac4010e088529075aa73940513cbacb3a7d737f5f79b9bfe50afd819be2afa6614350514b886be78c539ceb526a98e867a6c7c9c092bb6a4e6e114ea2f7b68c539a8271270931b0cb9297ba368b282439dee1be80742d8ef345d24a5520f6f4d75390a7382b8c49395f5236fa9274aa61551047615b95b169f160ade339efaa962fc60c44dc3ab7c254836e6140b9775caf4a003597012c9af2047edce0f4d3e9663976f47ab062d78b35be9e1aeb293e90e44c7b7e621e359dbe37d02b73ac1005131be942e053ce57dea60308583aa5f9010fa73bbd870b9e3963a2513c0cc8fd132abcc8f6e08851eb7c1d799d7b62417ad0fc28ddfe002b11d6a4a99c005b3b681e05dc9a6a8a4c6908892386f064a85c911d88090be6651653f3d99b8f592b949b0d06e87062c6f6ae8680cf84d4d71476ee4a2996b3634025777edbdff04246b14218fb037514c53a3964c268c1eda6bc94a73a6b7e54dd2b3f56dd35f9a1660fa610238131d4c770e5a204237450c960a831a87ac0610e9095076c71efbc898109c5e1c229eb89fc4ff5ce54daf0cc43f67aded6a06d3324d1814f7ddaebd473a60e5c4ed5056cc8b221b66db15a383f991d21fbec5933c214335b19392aaf456569f66ad563dcdbbeb66aabaa8e874f1950084934d65ee01282f7fa535c042ef12fe3aee192cee98825fe580c0826c57a06aaa7e57b5904857ce5998fae9c9c79eaf28f87ba112b09aec5f6c4b57a74cd1397aa27099381e3f2582cb375fff9add68e4f786957a235d3409fb3c60845dc524db2310c73e29e5d139065ace1f81107f98a00d5b769943931b4e089fb59c491fa8007f8b58b2a595de6f643fa2023d10681ddffab9611db17df5f3b29f7b8a8e85411a207a0ad99fb5d9ce12919525afae510aba8ee07ab46e6db9a1bf885699d83598a51e90d8d3d574b12e909873cc5bc3f2bcf3eb14e29a99211c3f946ca8b91267872910974cdea156066cad625adcd3ef66e879224a2916622a8fff891740c777d67deb7da813b273f22738870fddb755cfc5add6c95cadbb014a1cd86ae46880626f3011ba1e0583fd0f48e1621167690c1f2fc1554a1b7c3bd7dec2edb3578448b8684b300082b2cc62850d60593f58c627d14c67a38646e14412fe0150e949aad25a2c1c63ef56eb1e71e78eddb022ef9798c53b3c9f66cfbb710f9033e1f13b6a5b1f0c7aaf9acd4359c109f1f220e2671b43c5ca6964311c68d7d2cdd182d461233b5269887d0352e3c86239d17f57fa5b3b527dae67d1cf316c41e864a8f54d3b7440d434466032344b4c9dd55c67d128993f6f6ca283535318c4d990224547290f823198e4fb1d7409b9e8e1bab5084796ff28fa19c2f5a507ca4067374478a9a9bb0e1186b23b683d5277f824980086ba1305361a682943049acb85943d087453608d3696720f78928aec69a77750359db4cadba49bde46dcf7f809f37d36b14dea970e6edafcfee3c12beac54f1b673ed87449cc74de1761347101649d2ddcbf07cb969d783d061468eab8781d3cb7ad255997d7a5c3cb37d29b9748871b1a06cb3ee277b6e5d31dcc3746d539a13a0c62da8658a1bc9400c8d474068b3dbbe0ec3895adfd2e4c3d7b3b1d207b7df99e86b60b8e0ad33e501086b7ff135531e6aa1ee958754dcefe45250f8180f4e62c923d91b800e020c4b048cff3f32647a1c8f66b50adf1e0fe460ac91059f4ebeb022f452af6fe033dcfc4228c04bca8463e090d1b5949c2fb6a02272eb3305863b820d74df161825964bcd6ecde64b212053efabdbf7ac2f023e64cc304ff287b22e842cbbc72c1de19011b4931ea8b00c0dc2cd2eac48d0608893ec7a8b098eb2a6c815b0102ee844fad615135161bf7c056cc61921dc0afaab33effe786067827d620170d42d001d2b11630af4612f8be4735f645b3caa8016ae5455b62cd29df02dd62b2e402217007301c5388614543450e82a274856b37a5c0ace0324d1c560d4c56fa535ace428747bdfba10aee6682c25b35d18d077614abc301f6205272f007748938111f577998807870f8da3f4a29be28ec680a586314ee1f93feb697f34fc8353a4c118951f60aebea14c2222d69e721d3b1877b4ed2fda7285bec88e8b8bbc6e8ab652ad6323464ba253cc9ce6f7908aa3f5d45c72021a61047524cff485ddf8ed4b42d60cefb82d2c163acd4d36d2f5a9f0531476f734a2a607758b03739c036c882752cb8a1c2b1a30e5c27822d29a54f119464008eb716ee8302c3304f5cf9f1f3908a7dbb93ba4a83f92bed4494100d1f20058b058628845da6697d836abdcd09faf42ae30bc96bd31da16a3f60b0151c45dbb85bd4dbbc7e62b771085a383c1594866489da744af5388b2f34823f30d60897a7a0bfef23647e24d54014b0c6da1edd9ed6d4f237271d244814d57a94618d146580251000e7153f9a1478384d59e12334e173f02c071a6267e5b06a76ef25682d0d4aa33d88784a21be6aaef90dea6b4838ba989be96f7ff33b3ec4337f6704326a39e6524cc55948685a075b4882fdd1a4431d38644d9af305e1c615d6ace5a37ccdcc0a7a13c0f13dc4d97908bb904ee50d2242182aefee3dc754b2fbad645fbab7ffbcbe6a6b7b910e121fdbcbfd72615b421f712c52612ac40fab98604ffb005a9b37ee6c57f714e377e5718e2454de2221f3a4323d0d2362c4b637fde263591f3531e27abd710855421d08783125510b1a10616c4794edc5ab6cff918c3ed8cc5e35161a90ec0d0a14366fb8eaba8878803cc8462d63c2eb32dfa029a149029aa8f7990221aaddeaa825c31ac256127bdfc60721bec6381039e239027f4eaf511e9d5b9f51525a68baf475194e97f735f570de38e85df02b4fcae22fd0a01b5df2855bd8daa4bfc1c3f2ec95393098e200a91831b65732242ff34cfd22f07c8c769539eabc974e8a39c931d01739b109460ef8226a85a593a3c72bed27738c4727f70120828227fd137d74aa958e2e43871305a52122a55df5503b7e90b93eb9afdd3f4a858254f2b7d010cdd4dce8eefc3e12bdc4e809d6e161b062ecd00a0421bd6e2aa3c5145c1bcc90e751cb6cbd478c3ecaa71ec8e042a13a82b2c287a409beaa8c5d66a40195a5c448a07c4acfeb60cf934f60d4177875f4250816de918c09a7bd424831ef9f2bfbc4df6babcd9b45352cb496307619241970f0e86bccd7e2beda3086beba67ae2a26f8ecfb38dc2228a35add82684aef0caa136c9ccd218d344513ae01b0f6ff59016ccaa769ce22fe088aa4338a218d0b31bf0031fffc67fc9c64c9ce7cb995905d1ac4e4803c62b7bf5f21f56f110527e31c025f7af98cf8c472f4dd884bb8f378ad89dcd0cf1e2e01815cec72cf87e4241747a81193bcf0ca5729f0ac4c0e5a122e6b43f7fc72a3d352552de02c02018d194c4196ab6f76d1bc6f6967527d7a081c845720d3c6b584704a709f9eea83432e3a8b82881dfed4312dbb22fdbbfa4e1c4ba4a66923af8d12bf192b976fba67d6ec18a9033b5e58c5ba0dd82219e379870c22a7f553047bb51a82b3c7dce40eef673b3c32f13d381dcf84ecc3c83251e5b70b96f9e5ed7dc443bc771fbb09cd41be46310d3a9433633c358798f07024567f331753ce857ae4078113f18de5e3bce6c5526e6a41c88d3f0d561e5f82b1198db478a67a7c28d4c18ae74ac4f692deaae3b807344e1fa0cb12b82f84ccd054ffd8f25634204c2606bb96a8549d7c5219607333dac6ebe4f33907792f36e59827340b63b626b574c337a27b58454ea9cc0d14866db041d8c18c1c89f96d9e45f63d7e3e749c86605eda63148a16f611d202dba1a0909b856205d136429b3d2e2e1fec7af791a577320ed86088e53ff38734910e2256023ea50e4d0b970a4c6b109166b56619a1f24b3da17722fb1e0b0f2c3816758cadb050b21f226504ca5c36b62445fcd7da29a17a4eb4331f9731d7fbd28836afec25ed95a4820343e2925d518607292b21f0e1ef246b17b1f095bd1ac857eb4775d343fab8452e7cc0d572150e1bc194760fff1bd63bfbd727468b1d896a6b8df572753bf45e679c6b59f306c0cd7624bacd3a1461422cc25ebe70d5cd34b2601468518406cb273ca07159addfd091a0937b846e3079c44b02e380d59ae4f97999faee1ef6c5584f653611c60982a5cf4c44f1837aa46c66161184d49ebfae7be1e5d944f6fdf5d4e0404cd0f0468ed0e98eeffb660e2e9a784893d1ab9644b9cd6a6a17b09eaf5f2500a9adff0ec19625715de5ceccb8292e127833f22d2ff8370b8c62e81903eea2b00c82426d93a900e67714a95e953b83d7bcda57d78504cfba2d3d51031066e31ff338a3ab47765557962513f33fab87e0d5b8e6eb1e9425be7fd9b0b5d7c43f57ccb769af347979bff4430c969577326a4f14823cce0cd23420c60f5f5426a0d6ff4927fb0d4332509cd935744c4fcac8bd0ab7af7db2610ab44ce91a1d3173898c1b5a6eb59a6bbfcd0cb737f064e963910d6f338c1a99b404c9debb4e91b7ceaf8ae9a3e41d3dfaca7dc9808a5764918c865372a62db0398999d580439a2a6984bd88a0cc9303b6ebebf21e6d0734860ee29da8055bf7e6d5b700e12029b358443792119cf8c8b7b9fafe3f3e0395848033cdcb2c1cc35d9ee74c44ab7d25eeca5ac283c40c700170b0467c103d1b37252bb3910e011f7474255e9db009497dd950bfe804c01396cb20bc4b3cf0ecd32d59fb1db17742e6c8c6935793ff1004c9580bb652684b63d5d5ef0b00c553df1c511aa1516ac8b58797fa8c040f70d3ba0e95e69b24cf4f46347a495c4481636d88be71bb33198843ae614fb890192393082b4c3f214189d996cb8ad89a730f32a7d5fd8c4ad46c8982850e7d08fcc6b9a28290332758860debfcafe0f7985d7ccdfa37d6706a7fe2412003f4739345d467c6be7243e9efeb06b62ba3663be332b6957b18c22238d1642c42ca33c329b72386852ef27ecc04a18eb064cabfeeafe67027a7ff1ef7409f631c53a8250026145bbc9e9146d5fc8b2c6a0d6f60b1e0ef44ade9beb72fb9e6d400a3b8b3542e36723327f2c9bb5b4ae5e9aa3853222299a4b5b80221911ae799e3854227d9c9c57974e498762de485140de0a5031d3f6c0c15d5ef63a6379b54fdc72445915e13e9014f36dbd8d307b84bf0129c27eb898a66117b6e04e2c07244427ee064938947225a19ba1ea98764e5f9f32708da4b6c14ae3b65f0f839239411da599f931bdea4fd64963bfe5e3befeac1f5da5bc439884d6c5edca65e396f01d7577b05616dd740f27443e4dea6de0932c057f0994bf77f99533d09d049bf4a1a3c72976c23d738c7098d56c436201617e1e3ab3cddc5e8dcd5ee467c3fa5aec1ecbb535ded0848951e474937c0e0fd13e08eb1a1303e8354df1f3ac76f4980c1ec8e9d80baf4d370bc5211f8565f448c7b4bb4801b86287fb2961ba0045272acfa87dfc465710a8b4c75b00467dc62e7d72ad4ecca5b19dc410bd72afb7d9a7839118b850626a49f59a850b0b88bbe8c0064296d23d7c049e3662aeaea925e3fbea5ddd0c9a3688d9299011f7618f62fe73f95b75670dd316a837681f38cf02030bef83001274aa8461484ef813356f6fbaf364b0a8865ae67fcff40ef0ce027b17884ed2fd14fdecdaf691c4212c9e8b18cf13c7f324e4393a20124c74d1e2be59a0519da99a3ddd2086e6725102ec291989134e0aae35ddfeb1d7e055446540457225814fcfcbd9c99635152ad87169f2e79c4c90dad7b0f2f46adc749bb754f668d4c1fa25138707625ba83429c6c10b676ae893a91f5c4b16e493167be6f6585380470d44816bfa1532b396b43a33dc5e498081c973ee73346b3bf506414bcdd2ac000b13ceb42abe489fba1897312b4fc22d8b34cc7d1464f92645f9831dfdeb9ea06c8b3863e3cf8d02f0a055785607cc43bd10ed1b3e23f245a09e8c5d0a8ef01d23b1ff3222aa2688af9f098652d7ce5f5198cc86ea565e267244bacbf82b52250ee9858118afd4911e2b4a878abd9d114cf0f26d05cdba3dd5bedd0b8ab1c4acd9276b396bb25fb350cf8029fb65656307c44925dcbf2e06927ce9a03cdbee12e2c2a674936bb13caa5750451b9c41f6efe5ca95057eeadbee521c831e486df34bbfa30dbff7984e168f654de3433d7fcfef0411be7cfda97860040a8d13c2b26bc352310f7016c9fa6abc385b6be0c0a539021a36f027adf063b30dc3a92028e510c7d54b6aa0e0873acea8c811af8ebf0c71801ec35e1c174aed6a1c78aecd8d2ba470b1a8a12c52b18237ca5d64a03f322952d316fe82c596d4485288caa7442e42ceeeb07f87d997f4455e2654d435ae45b5416efaf76155f0522aa88ea4927582e47bde345df571bd8d81a82eb5abc317597278038c4c806f8d51d163c6144c4f51f6e57ef458e8f9a21e6212891ed91a102407132af88fca89885285748ddffe6c19005c7059da006cf38665251faffe188154aee69b352bf7b974b1da4597350010f0aacf27a324c996e1409852e0b6a8937d45fe0d75bbca8408de8b87d15ff6dac80d2c9e0e08eb37d72ed430490f4a6d2a757d6feef8b0cc1d116b6c2ce9c131d515e8a07a5082f642547d1eab9bcffc7dd54ea8559c6f45e9d423c752f12b122403bf9bd2b10e87cf54b159cfde1239cac10651202929736cf1e5875a717b8086eccb4e7a1456ab1a518009fa50abd068f56d302de6a28c34a7ca8d99d834319c45bbd88c09b09d563cd08856130aeb9365009452f7030b58e0008e3aa4d53b113e4dc4569b1f1b6b577c6171066f8d4687a80c13171e8c806ed38353bbb6e04322e4af6a8074d44fe6c27fd96df00b4992cbec16738ae89b46b478e10cda15751432017f5f7a7d90118d84bc94107a8ad92e663a1a506b256109bcb842b6c20ce6bff7605e7685a1ca0307d41353013db1bbea5d874a815f7c23efaa010ae65f0047059d8e49579169327bbff2f89af3c4ac2bb6ce3be288e13562936b1c7d1366d10953fee7d4c77da078beeda7bb0df9d059c65edf5d10411da047f0839f6e9889e752028788b63df1f284c6fba701d28513973f0c58c9744fa83284d0944d420691c66f54bbb4fde03cf3f70a8ebe4c751330ed44b08215ecc48335aaf2a9c2f6dd212948ddfaf096b340c8531a0a02f07a90586f246474966608d9bb675ef7c7e524cc61d53f603f2ce96d5f0c26a891021bedfa2c190cc49394d5c0767fe4298469f2f91c0da8f881dc8ff025cab7c6df18e48fc923cdf1a0fcba51ac85806fd48a5a0db2a37e35d73035f8f77049ad26911b267b152cc4381fe5118b05dc817e678fac4a4ee34567116013280dc6e62205fbc9755bfd4f72f652daa992a16ec3b1a52eee9fbd83855125f556a1043a0b0c165fbe527ca167486f58eaa13cdca2a624a4d56dcf127a18107fdd3cb2c8015115fd380be7fd96a8a25c1a0cb8b1e6f21061f72593bd660d0e99f2a86582d26cf247156625921737b86f546544f20a54d54f3b9e053a602d7321420506153551f8527c5f68255396f564c8c48063871a80502ba47d5e16999963b98e35f67ec08393551fb7b21444364251feaaab5f369bcb35762dd0270b092842b51a40dd7dc759827fbf3ee43158bf5554e41bc65f75f04f253e82d3408bf628c150bbe8ecebbb20f3e95339731c8f472e5150afb34bb89524d7cc8d5586ca5cde9273900359dedafb0c4ee351979ea29255c897789fb74e6416c93e108305d25f17473a7e2286ef1334de5116980223e013d54a97633405c7be8a1793f81e6de270866db5e56375dbd91ce0c4a262b69dd0d626bed6c35ccd5b4e54c1c4230219672e929d3e296e259b3f283183ada076375f708d9afafb7fa4b0148f236426535331704a0e16cf47509ca893d1d546296593311ebf5099c60d25d89e526545f9047d043eddf866642267348c12da5b61960b76db2591d226c57e75b871ff4217c6a8daa4c8bff8ec36178a23fedfbc04685815ff77e7f9948eef1cf8b3693ec732dbe3b35e3c34f3f8c46dfc6ca02cef1eaa9bf0a6188539c9d00e91ac13ade0047e461a410d768046477dfe4f9d2d2ba0def3120ad0ed2ba52cda9619ed1f1eac261f9a98a8ab47fecc30a8246bee6e8578ebe92801b0bdbc9134f474ae74a35003488d2439549e613d8652e45d867b6d6def12055f1a50c5b82dc37088a21a35cb6900bd389ba1d2f5c361877affc5f068128b60669e16b7d11c8df2a7d88215d89400475a784057e2473bb8901ace3320e22b6b68448ca17fd796ad10a74d9a75f2030833c072d6719ad0471712a805933e2bc8caadd960b565dd4c431bfe3e0d0eb02ee118795d3a61f062061efb847e53a5591882759b09a59416c14c69c004db1bc78f11c23835a3e75895a7b1f03ae90266b0a60f1e0dab661c6d8a568b262f0b369589256d492dbbf81de322068d722da13b13ebfa068f664f542c40238b88b8162914ed5a80ce1d359da4d94ebc47b8495d014491f70585d82af961721cd7911870543753f7f9e7fa30493915a65e09c0b99e1021e08a7921136b458abc63de26ef9f22b2e8a36d89e52d04564e1b1e6ba2d4b2617694eaf6a2323432f8311b43562c155feab5afdc2979d894fdc9cb398017aa4e66b6f30f5f8d4182ad0c7ac12185cb849eead94fddaf4097c5373d098ef8675cadbbe0abdfb797a972d15baa9523edf5afc8abfd41b8b87a43f2e0253ee0c14b7c77f052f6f0cd029942779b1cc2abfcf7fcdc1afbe0294a4abdc6fa0b466b7ce070f6e3465008a5342c11304e14e8c0d98e35563c5a69776f671aa3fa9c6eb241c62ac1b0726dccf3c282a4a34d09f3bba068773afbf541925890c4c63a7761834a41698197cd1d0a858a21822be6efb2994eeb9c430abcf286549fccf771d210fc4729b01ac61e3eb8fa17a795127da1ce1701ccae5a9635cc3cb4444e370bb3e024e43210e7a201050f1c770d57f30d5be5293d104427422b9132daf89000aef8a97943426078c999a9ea5700775b5c944991517c207289071dde4a533bb65f18051312489a7bc1f10056f4bd5f121ea83952172c4078b799e242ab96918b48811a16b89e19623e6888f23c6ee0ee387e652ce877d657e7bb086888fe37d22ac403c5e6afa16092fc8202896ed5b35fb2fee82a0bcc0a1dc8b99a560dfa4b511d510c8ef9d22937891c156080370f62f777e9420742259e64a92116ce9422d2412567942dc2c8442d63e5a68db0e8f08080f3c7331fe9145e894aec235db22515442930d3d9ac598e0a22dba972a0e2b640e826fcb8a0ee87b60a911e0c2e9c53b68f5e24e021be77609dd7a818951133ff7264e28269dcc0e68d0089dba3be18f0c3fe2c3ebc12484ab2e261f3e799c086e028de411b2f6535caf5ab40de66e0432720e06783c477911d771e93bb0cd68eb3d34ab4cc7a4cb08ffd5f181842adc31a6964b0ad9d31c8a2178784bd7766ef45bc764f3f8864bd4ca39b19e1914bf60aa4061928a9c95f1fe8b3b6117c75fb08a322087cf313e33e880a8cf1409b0f8d01d660cb554033ab650e1294e5d95af2cafdc35cd76d00dfcbfb4042973976f62138d32ab94d5e2ca3e1af787c4db4453248429bc9211903cb2d9317bb37a59b446ea90c8afbf91870f1439f0fd6d3b945ed901fb028b58e90db1ac29d3304dee152f6c6626b629137a7eeb2864f62474b9adf755beeea29f2a9409a3fcb9cc978dc8999c1c1011c90cfcfa7e3945379fd3a3eaf997583d817c5e01a622804eae5087b2c115455f2c1d5b05fbc54860afbdbd88db7b3c31af44524b695cd627c26c029e07233e469117e7889238c1f73729d48b1c0441239039686c19d60dda40d2d9bfb09baf67cd4a649fd3ec85a2de97b01c54fb49f88ef97e1077ea693a250e05c0db5feb5485b92d3e2c70e4240f291a646d0f7603b96e8810ad0ac19decf41ae5cf2a2740bf1c5f900794b42824109867739d0fbe3f6fcb077c4ff50b2d4ad34f536039c74c667fae091fcd506f7b13be929f7bde1c0a34e674ed67cdf95e1e5addcc64eedfc464083c01144a32b7b651d4290437b9d1bbfd623eaecb212fbb4c2ee179ce083f433db6565c2852355bc64181efcbe7d38395e869f02bfb9ed4e18d10b8349870b0f5e0b83d7de3a6f9a331e5fb1576234ff39a66e031e42a32a86666bba30a93bfddb4d685043b01f1da1f49a823cf1273bd27d9acc804275bf94aadffe1b09575da05aece893cac907e80aaebe3eeba731d32bd96ae8518df7ce78e8e8875d60d2b2429e9cc3ff9ccbd0ab812c707b34b5e5f7e42aba2045fdaf905b4f2455eda37a03949d14adfc2159c68614753ca6fe586e281a39457f283dc9a3c4ba13bff03f223644ecaa8eaa3ed8d07fe2df8f0e104464f2053686696533781383e55cfd7502bf6e864b5a62265d41dcf3f75c28b405eb0aa8b1e2e2b201bc313224659f350a58dd4f75aaa26aec4dacc24b1f98272b4602250916e16951701c66de6a278dcc528e109e14bcc7b00f17b729c5d27732e9bc809195e028cfae2ae4da00300aa4c7a2ccea79f4562e583f38dfb3117b56ac53ebf6061853bdcbeb8c6a97be0e4896161bcbad1702adb45a25f61b5055b6ce46fc9be082e06fc49e86f7b487dc906078dd24dcef20bd5bc1dc24135ff5411d47bc6c1b1e2aecd9cc62f7bb8570dd4f6cb58dda35f0460d200e7159853613022964ec5d331475744ca6a04193b7e4e5fd6daad26822eb67068415ea18b758ae065db1a2b454ed490abf54d9220e4d25929410c74ccc4512710ba233abddd11faf25e54b80df9cf9c4cd6be0413bf1fb4dfe8be3abffc48544bd75270e02d8c75df43beace8e0214835d5f9636ab0079d3dbb451b18bf14bf82aadad08ba1c66785bf7740ba8b64164ddfb3a2f8c54c067d803971387b9b5a14be8bc9b6b1fdad05eb784f384048e606169804c42d209d64645a3e50b25f32648f9ba6bfd1a95d84510bb34eceb3560c69dd24f516ec90427d0b25b81347d5c8088aab70cd5fa9fa16cd6d0a952cf23e3539050c13f1b5451015fbd0a2d2657bdedb38439c53d52e0f68140ca459103f0020136f18a252bff425745fd0e75594b44ba6c51e141134e08344c0c0f911a5d318039d7281948f20ca93c89c83981e57e62087f1c5d20d13dc7c964caf3156bf1a95510424d50c29a941702dcd63fdfacf70bca633518141766578b6e138146bcd3cefb504b1b562c7e92f202c35089a38304fb8996d940c9eeb2709511b2a7ffd43c425aea2f493b2134b2e57980de227b40e43d03278b13840c57acf4737f3f8ebb856c62c07417628926b8db584df87b0525a38e28c6cc94cc2b2727fea603aa64c4225fc82f387cdb4c844bea862167e25853a72b08be7e871e4ced219edc0581e5bd15c7dd13af81697373c7a4a993bcf1bab865e7141306c09e70c397a9a56e5ecec44e6805b50b37bbfb104f195f532f9050f64d6781f96b936a104a18202ac4e910ff93a2afc1d09cd017d1816e3e2f367d6d78e101b77679a0e746477587c40354293fd4452c3633bf11379a31bc0ea8e3e16ecbc0f44a59c8377b65b2e7bbf3ca1f51602a894b0eb950df133898d10b755905ea2afe64af56978b54956fea8da237c05b15695104f5073a68defd0804d661673bb0be8a4638bdf9d271a84ba5d539d1ac64049ae5a0a72d5032c514258efbfc3f2f22cd46d9eef1047f34c360595a14a5d070adad8885d1c0bb34313bb467e6b42dc18f6b22e51a860e5fa5cbded5e500704b82a206017e149cafced5645d20af3e1b6c986ed6b999d3fa27447d2b9d35d08f073013a98c63002a9988f6c3617291bf71a9775b040e72934521425e5f6d28c6adbeb5ad027c6f942c82201d903add747ecbc42be5b8c9713c5f52bb36b8a57b8e5c9f364b943857b3222a9ca8b34ac3a1b5482af7162a7b6f1cfc24f7110e1c1bd7b1549887fe4c22cc0433b78c0e0d0711ef0f12f3071e137903bd67815b205c19df8061e979dea2aedc15e18662b6534e56de90ba2bc763c74eb613e53a3f0a30c0494a9270bb205267c0dc8f706bf27902894718499f4587975e681baee703a5fc6e73539110f04f3f2114cf258180f044b4db8559118a04536de8cfb02f4b48b8e9221c3fcffacc338a9f44259922d5fcfec8b0e81f9140cb73aad499f0680748bfd430d7e4dce71c1e8d568e534d4f7322ce0166e6174d80d3972f166c7d8870905ab69743214fff769c4746f404ecbb9b526cd6ba3640b5f8d1edf851a4b76980c7b6fcf169948a902a234f7f7709e12f5c1a0aac5a9bd9e6bbaad4180379904291956da61d981ded96d1602a016b239677d98a3679825248bb4bd8953ec08e6b03b7090bea2a03ee6df1b6cc3b91986a1ab2423877d333da9ef7c6ffbc0c4dc69295a91628ff8b4bf30d5a3590e604ae2a7d54ac0d520e3852df63a9af914b699a3f7ed904c8e32a89b80a9664166672c85226b0fa18b4ddca4eeebc45c46447ff6957cfe51ab010b40afe53ed326f7510af8752c93bf382ce145323225ee15c82c28d2ad44d1f55c5abaf0c91d3d224c6e47b7cce7cd9bfa33d9f366caa22edc303a19b3a218fc4743e29cbcf42310743bcb0cc01759f44277946c4b9b677413f836c8aa9af5cec3ba2bf3582e30509e1085739e0cf7702d0f327e9aed236316077802e81cbb8e0ab9229931cc08ea25bc22b85bdf4fd0c20d0fda4aa31166159c8c8e513375f83a885cdb3196e08dd076ce19151c5e9c90eae8c6810d34d2e4049abea6c61ae4d55d056e6e2bde495664afa152175fb8c8939e4642765828f21ed99ca57064a0e8b5790659ab4326d0c0e414865998e2655ac38f073c798e4f901033ce6e2fedfe18c4771ca0bb04fa57d665ea5bad2e11eebc6fa69421f2f79e6c669fe2fdc5ed566b91b463069243e92a7dc1d25ac17a6c1af4631514fabd2567f2181987d56cfb8c8012ff1250fcfa984c743d3999fc6d7582003d41b4d64f35ccda28ae2fd0655dc0585a5d32b89d52a76407cc288db653d1ccbd950b3f4eb61e8e8061f9c0b37f55edee05586aba36f26bf350ae08b182027481f73abc727877b5d771b67bc12928dc4c791c8cf22fd5ec2923e0e45794a95d09af492e392847984846c060425da6359c00d5338d51db3286afd4894cb408b675d303492b191a734c0570658542387a5043104afca9eba37a5745e71585a223ffc2a824d4759e9c63ecf8a4ad58a9a0e465f20fd4ad2519e8e75a9f531175374c49bf89034fce8905d9d55e9474326e87ec2df88ed652df446045a59f3ab5820d0424a07054750f0c52381f2d5790ada7c91085be1a3e0c043a1873e25ecf89a842fb82833cf6bd7ef39156b0517000a42914a7596cda2a25a9c59e9fc55c5e6c8e1246495bc3dcf805973d64a42f6967b6fb9a59449cabd0a1c0a540af2a52bc179a299c688a2239d534f7d4b3a4fb99d9df4821c61d204e9e5842973a49775e91501fa2c537d51e98b4d9227858fe21377a6c93e9d894b7149292e1d35417a315177213257e222d8e633083fa4a4c613750044ac872326249eab1c4a1e153e6a0fa71c42d100f6b9611e4eea9775f81a92d8687ec54342482f5dc9ea89280083262f1d429159f32400f399044dbc64129df48bc32de9d69334d8cb3afd9210e997d216a9a08f1d18802fce837a5a79c2e3c5b9fd98d4366dda705806ad2169bdf262a3e713be91b68f1e1be713a49c333af5a6980498c54f9ca31321f510f532fa913d219f60ca23a81c40bd51fc8ce21224b67204fd04d5d39519c05e15c3bc712e01f4a778820ba17648825e7e3471db87b8d8c385503a90f1d501485d1e421d99abd5b99a49e7be0cfa48623421d5da47aea08ff8d1613593d24a4aab1744f38a349d9924f29a67a41c5ef3f6a9d50b2c85bed9661a27a157248bb0669ac7e7be1bafe14c82d78870381f79cd650d4432a42eafdd89b9a841e15a7480f2bdf3cdea1ce490e6db7558d0cb175b04a360b037c2f9cce534ea3e3312a3e897a408c837dcd16e943d4d42dd282b12adf8d94111908f70471c01eb8d5830d2a01be3da30c3d9e0d6f8d259622a8d16a3638acd6c3552ba507c1a2c6c1fa36ff865f9ad24550594951facb8ab8750566ae0790855c50c1a22dc61c61d5670c76a55039ca184504a08e79cb36d38c28a21e4125582aa62060c0a872c51d3dc8a21ae94513891524a32ff8dc18253e5c9f7fcc1c6192e9587aee62146c08fbb5472c5d299767acfe8b26ddc803ba20de88ab3e74c15c99f780577c416111a334ba2b1515be69cd37a50f716d943f6f4de227b582e600fa924b34089c2cf3ee3678bf17362ac4165917ec6a164ce96da69cbe76c4949d28a47f881e5e66ca9aea964d428a897136751b66c49be6c0194b8398bf2e465944cca141b8585cd3091a49241081bd3cca5cfcea4c443d47374ead3a753e9d512cd2245323c44bfa1f639291e8ab07d8739e79c575660d4466dd4466dd439c4a8f4342a7921ea21ea21ea21ea21ea01423acc4492ca0c5c20bfea59cabc7a78bbccb72cab5956b36df32dcbb69a715b56ab53cda5749a6519756d7e4e27c5432d22103ec5b209a8284c404529022a4a15a8284a50519c40c180032818a2fa0796cbb2b06d0ca15d3042f8d32e081d2946236b55b1e5ac9a6aa563bd205af7ed3aaf555ecac6ee94ec984a65a9f6fe5cbb4bc5542a05e990f6f8b9f15479b05bceee6ee9b428aee407e50994199b4acd53dd1f3ddcbe10420c31848e9f5ce841126ab155c85e10ec24763ddc98e5f6aaeb40be8e0e0000d013047a005c1d7841dafdfbb4d5ed7e78f440b8a36674eeec64241d9d0e14f0fd80061f90f980cc07647ec4e0470c8e70b1d42d8d6f6dd43ee905d1dcc62cab5f7bbbd08c9f942da1233d4c40f4a07afc82248d45109858897c89aff870b38eef691f4d272a96916576df00a4913277df3ef976b73544049f9ebe3b023c71db25d5a1a37be8f078c005945eba1928d08b14644879332fe9ecac491825848d4b383db17a280515385047828e04e22326899144a7f8e808a98bf6a2bb5fed17984e5d84e8102f811ea147dc924ba24fdc920e5fd3e10b47189faca02149ce44d962082baae8d0830f2e4f30362900d3868a571a05e0dcb8f1751ac9d39ef37554557901d6dc5bbdabf19e87007da4fc2684070ce1e25e2f3670467a1b733a9ad56a15659457935bb82cdc15ee89a67424d21a356a388435228edbc84e39f874838389229abfde5e91a944123ffcbdb9d8d5aedef100ee68c75eae07489ac74f08433c803e5a367e2dcb7d2d8b290e2a58ab021871e1e77e0f578f2c2d3a8f1f5144f39bdb1fcca35ded3a68eee65ae7683e46ce358f5f268a689ef33ae5072b62cd0f513ba4a1379c39a2890927289ee4148fc6b97089f1f28c28a38c32568f9fe6dc56247fd3b011fd2dfa4ffccae37144b9de63802bf7b26a701dc94a0d534821030e38b0218a076288011967c288e2851b5eed472e60679c538289a24138c5a478268833413cf5ed18a78c6d83f8beed20683f7281203dd2b837569d6344b71304133d6bd8eb970443a26f11999ea567449f7d5a50bb208c3062211f9f8e0e42bba04397f1a75d10c70b10ba0bfa65cd337aa9d3b4a694529fda8d951ba7d23d6e3c7a2fdd7cabe6899e90ad4edb63d79e376712f9d427f579b3ca89babd2e9bdf1b11f919a9486cf30d7544465d24bf3a9c8f7dd52d659ef24b797ffde51b676b49646b44d637f7e45b875fd1d110f81e8e96d28f2574bb0e0f11655e9dc32464cef96d3ce5c75d4b1ca61f94a17ef472e502a16e9e57946825bfa1e943d4a77791fc8cf64759565ce974c8addcf8953d6e702f517c594bad22d41b070c48980e21eca99c2e242a3d604a5ca2e24b9e65cbd295db35d040383508218433464dcbbc568d6ad169ac334240c84c0dacbced33a14b96a0930e69c72427fecae002a6670e3925df0d1730bde709beb3873b5ad5b165cfee2e5a535cfa100aca151e5050a84c978eec63c17b59dd432828523ebb5cf0337fce00e1cde833c4a085329e70d9020527285a50c18c265ae07403292d10df1e44032fdf1e4277f7111d4f1738a2c3f5b4f14e909803cdf5550aac78c9c20fcf22c3c30b300a068325551f95ce8e8ed8671e53a840830a4cdfee4f52f876d79329bebd67852c4ebc7cbbfce9a08b153528c0f0041b1790a68cd143930a6278e1053434cbb410f1524a29e511d94347008ab8df1341803e0c7862365492d3775213229a8cc1444d4f0360b801192d9c610333aa78e52d52680aa3020d2ba852e6251daad623950b3152a8300d37ebd091bbd4e795ce8e8eefcf3c6069becba080c4b75f1abe9de55852c8c1432826503f3fbbd40a42ba8ffe63ca6d8731cacb0825c9f6152c609da5b9b4138482f514d94d6d9c3e37987e6aa89eb0a7b44ff711f3d871eab2a1bc84d249328af4973f37b28964a8c9c28ce4324526bd94524a29a5ec2bed92d75d97e5810fb7a241a9d2b7ffc8acc7e6d03db74db28787e71ac9d38e35cc139d267593a450be7193d0985aa59499dda46774c62e1a350f54776ea8482562914a69e69631538a54f394859399263059bc5c99b0f9e4b1287dfb9450728b9450a23a290d9b336a9eb2707a334ddf90cb65e9744adb177e643d38c37600c5058187ab7d7478e04290031871f37c295b4a395741dccc7ae92c1d77e9e8e1a16993ce39e79c4a36601e009d1cceb2654435bd58de01005a7e0387e3c04738fc86e7481b39d3e7c66d1d8e86a3e168f93ab37c8d547e2eb5ab76f06992a7ba8d2b6ef4f6eab476ae5dea358ba249d1a664ead4b9e7691eff02e0636971b35cd2f95cf2546f7d2ec953dd0054dc1bc7f1f50b8a78ddb470737c47714c140e4baf13a0130d4a647931794e9b648f9eebd529980ea2b8d72918cf535e52986ea14eedb3a55d956a69978729977655017c713351f738996ae9913cd56f7cf7f391c3bdde50edaa6e6d7071e1b76af5eaac162e7daa4ea1aad3a6ead4a93abdd23e9e57a758da27e5d5ab433861bbe6b4b19b58e4165aa716d6edf1263aa53a85d23d92aa4f36d54ccb35726ee132a990a1260b1895e60cd4d31c03e6ab97af0e9bda55abcba6ead2a9bacc525d6ea98ef3693cdad5a3c3a5c3924bb247b7f4b59baad3a6a626cde93eb1a0bc614fd31327a5a79652975a4a85ad3953bbbbbbbbb77ca64d5b96aa6730f924c549a9293ec9b2e64ad4521a25a8274f4d3660b7576ba8d62e39659c34cbc6d4a76e19a5f48ac849b517649136f073e0f01c5fab88751c6e1d076eb170abc80dbff11b7ee3374290562d95e7e4ce375f7d35be211c87bfb9c439e55bebc3f98636bfc19b6734e57d431d86edc242aa6ff889d29c1a9dd3e567c25714db5013e290a03ae5ac45403e96f0dc08d30bc2490f9b20a917a4287eae61ea3c7ab8dc1d9ad39b16fbb473047a06e19bf8e83fa2b819360d095a21cadf3c8c3d597ae809b17e8cf9f91f695cef614c85a49f0f632ac03eb3be9920a5f4871637cb1cd619956535a3540da5f46b336c1669adc32fc2a4330f694cd32e68141d7af3dbaf881e406fef18b3749a4e0327fcb985853b36b34d394dd328cef77638b3588d2186d0f6b8599665de133f9bfee3e9e6f9d3e59cd3278c1da55e3bb71d6e1569ef5ca8bdc3b6fb72e674732e33eadf28f52059a39751dac5eab0e2a7c373b50bd62aa5b6cd0ffea6499c89765c71c767742a75cc19214ded6c719ea1a299d78a34a32aad34237d671d657bfb843fa377d36e4a698cb37d1ad7387bc875831042088de29300a3be9b42e4e73392d293f0f31dce435ee221eb43d5b5992dce3f6f1d767ef38a47f3b477df8f2f2ee73dedd339f4cd352935af3b0c21ced6ab07499bb59b7534753dc1986d24279108933123ea3018cc88ca18636c29a524faf9e852461c2a5f60f89ff98d5d464f889454dc69345f1ac927f2733e368a2fa5b0316a4e76b4ae751c7d75ec8add67df0adfdc737ba8cf8e4a8de68c93a8ee705bcf9a2b8bf13afd71c5bd9e57422b1e9e67e8a4a3048fe3527e37b8a8d6b8c1b991334ade4ce9f16f6ee2bf55cda876a9262eaaaf52b9da75f3b982a47cbabb93faacacdcfb5618364ff476d7aed4b1386b1a87f3bd1467f78ab3eb33746aa73f4570a87c5901d2fff0e2765a16373a4e6f525456078aab419c8de44747735b11d68a49edd2e9369a2eaca3d370d6609a5abdca6f96f074baf4d92ea3b9ba50dcac4d1bb23f9d9d6aa5d27995ab70a62e7dfb84c65c956f9e4aa9a6caf3e9a5bcce729b5663b7772a760ea6a734adbbe12c8f9a4bbf71c3ad539b51873ba8dff8fc55d386e7d54fd68dabbcf31a5f0d67794158de03906eb8e615813758395fb76a17ce4dca7355902ef3de7ef3b98f95b5675f269adff48ae86c11038bf9372205632111eb9bf543d227ec6ad5c8145d7889e1066caae0e1b5e126904c1525a0806283980b3cbc342cb1c4b0a313d1ce4b2761e78732afb1cb2e57bb363cbdcf1e0df92d84df8a4e78ceb7e945f139ab11ed7ce7b4fbe0c78f849dd792f2ce6fbef33b5f7dd53e4529cfac57411f9d6bf807999b75e8e8e1f1e3b9e6dea77ddde770c7e6aaef36cfe6a98fd53c9bdb2f62edce8faa80c21f58dcbcb379bbe693e2888d6891256ddab4717a3a49f8798a8726ee8142c20fd18f1524fc28a13f24bd9bbe9db9d57bfbb49f9a1125b16225f4333c349db6928dd14706699ff40efa30210791117e4e1ce777c456cfe4c4388476d1a07651975f08eda244a08f14f411bda2d84612d95c735be393384ddfb93cf39bfb2ad6e4e965a77d59fad075add6cf86b76764f32c5df382e0b8fc549e72cda3676e64f389a967a4736ba3dbb1e10941fa9bebf56be1780d876f576ee3cb9a676e57def90ab770bc55a4c6f5db3e1ab6f2044204e47850d7f86e1ce71382f43738e7d324cf1d4a75ce7d3f46b60e6bb8833ee2c75893a89f2ebbb79be700a42e9ed0e605913eed7cf9d0237289445815a239e715c5369a7569d4192981dbdc287b2e09e746d95b879e91115e736ed330843ab621e94382e4f4897778d25b3be23c2122ad7ad3a279f598c66e376e3bce3b55c7c5e913e7c8a53c23d13d4fe87a8dcec1e7bc42cea3775e90e805e1ec9ddc9cd5f3f8f3b9ea9a26b9d5907745fc401bf29cc3f189733fe73838f7acbec2d9a835cfe7ac737acef99cb37a9c9e57dc4af9f4ccad25523d7af5199dc3d186679e639ace6a9e651bab59b539e38af384aa0f6938579c67d7523c9a7d8cde1735d9471cc791f139ab29b796cbe207550d97ba5ea76729e7389c639acfdce3389c6bf45ba396e873bef7c5e8a91bcf440faa574fe83ae7d917bdc6d739cea7f2fe725c7e37bcde9be586f3e24d8cdecd155a34d7302737af371ebf7c835b9a5fcfaa679ee398f2ccbb9c0f4a9e8bb3d154452d9f794d61cfb32be207117b99771eb3c42b3aa75e902ea6e16af61ae79ccb6f66a3f91bdeb61aafb88d83460a4fef0f63284449a1e97b1ec65270e16328245df9eea3475ffa19f50b781863b2e5634c9ebceb612c85336f21072e8c3191f2f6531ef5f3abf55a6d363f672ea594385b9c63ca33623fe2098637db473acc32efbc20d974d677e3d99772fbad58375a3ade9e908833cb3fc3d99567e6d65a1b716c01f06871e0a1cd6d4f30e207383c07002e0130a33eeae0ec32d3c2d9c7e4c09905e606ce9785258e443c32118f9e8fde7868b3d1b300e0c62d1c5e7d84eb5002c00611e999675e338fd87ad6f254f5d5d759cf48f7d2630d00ce2e95030067d7c199753d076e9c792ab6e7c046997b42d187fac6b728a5db5049f71c5e99438b99dfa434bab4d1ec7164137c9639eda6eca312c4889fcde7941b3511f91b9c6ae207d2f324e3b35191fc1c7fc343d9f48c589cfb572e1db64f8ee719f539553de5d6719e519ff2cd75ece8ac7aacc79e4fddd0b051bfc54399afb051bf8432f334a67b78b03cf7649e5a79e61b36eaf929b7dd65dffccd08fdcc71ac523ed578422bb79efaa40749d677e3373e1ccff9aaafbcef7eda076f8a7636fb6a78bca15ec3e57267459cefcbee2dcca2461ce27cf3b8d5e81ab8a58d20a9bb5cee2c163d7326755d151d67839e50ca876ef7294a7156e1dcf3194d61cfab4330e207f06b94a5d96bd904cf81113fd09e7a70e696c76f9e897864221e1fdde2dc633dba756eb6ab719e2d3b9551c071f83522f62b9e60440fb2982306008d956e633b0062d151ba26e30134dffc47989ba34be99a5bdae5f84a3af0b1bd7400c4e2737cea9e4ff896033ef39ecffd1a1da2de0fe107d04c96d76aa69e338ffe23cccd12e70c9fe1e1b3c499f744807a98abe11c254ed2b9e7ad58dfb410ca1e11fa7912b9436e86c0cf3c73e9567e2d11b697f5f88d857ce889506b3061181768d6420dd9434f841f495d5ed613615e81457be889605d0469c60b18dabcac7b220c6029064b5832902823a67be88900801670885283d737248dc14497d4434f849c2a7a6092a64d1bd5434f8418dab47959116ed0545125074cdab479597be3498acccf9c7a4b083dc224be6c910438b79e6402f0d5b9dd549e52719f97b2292b9e074921435638cf72d65529a79fe7d95794150919b2a272f8444ade0a87af6bd2738e7ba9dc621827815b642a792bd62df444c02918f7f2f0055218c6bdae7318c6d1af08023e5bf19c0869ca5bb19ee7dc97f2fba95c8a7055ce6118cce295fa2cdfca13202f0cc0600077c0cffd0106604bd003f8f63bb2de04e975b38429c571dc91ce83da487539442d86d197b5623d487a424356acc32742c15b81d1973592f3d553df08b027e59e878f8252f7aa6e301375eb3f3e2ba9f14490892a62befa9054f9f58b8f4ac0199e71f8f2969e83da41ca67434502ed436343443d751eb6233e623ad21ebda1d792c074e91798f8497c4d97f802494e80bca63f892fe947fa0bfa628fe64c482a534b02edd191b4477cc494f9513b92c62e79a857dcf31d7dbaa492c93ec98630ebb9d1f94c0914c4cdb0e901d1a77677f5c1c08a34ca50f201cd0b89872094b060016a0625787859a8afce8a7589e16b751dab212e7c57f374dd4a47cde7781823a2cd6b0f6344dce0f34e0d1e9754872fe849205a00e9a5995001f8aa9bd7262a007955dfbc3ff87ac1264830180c163f24180c7a15407a697e2469c3474c47aa6fde91a4e85ceb48f409c057741182b424c084c422c9f01193f8cadce227b3678abae499ce7d3d92675ef8ca1c4a1e089d7a14802f4d7ebff530005f9adb293bab11d2a9a59ac425d59b54ac0290575c9279930cab00e4d57ea47dbea003166cc11e41916e02f0220332b8e40008880b7732d14ea422d53a5e6b46468b5f431852ebd75a635bc07cadeed007fc8a33d14e06b40536655f8f4ebb583a80b4b8cb7b18dbd2e5550f635bb23c652ad822c5cccb19299572423a279c734e082584ddb26737bb61918c1e448751ca96da840d61c3ee0f3eccbe2511e9d937bd9b534a38a19c13ce392784543e85147f37c6f6098cb1d5681a84104208218410f61336763222b5851d50f3d33b47379a9f39cf46da6b0edb7c14227f732b2147e537c739acb5e7507719a531cfcc55ff5adc46bd55a9b7248d4547b1a9565dc34140710a81ced0f861ca5beeebe7a6739c472f089765b566b5d69a55ead3bb8b59ad353e111ca199f6406ab3a35ce665ce87a06f1b0ceee69c0fd9995773cef9abead26f4caf1f2b6555aa22485c5c68f319890b0cf626c82cb0e760b0af388913eca71b714fb0bb7ab906f6b009f613e7440fe42a7a201dc8ca8d657cf5a0d66cace00ee939702be88373e9d5eb777156d30b5284ab1fd0957be3a567709539f7c9b7b1cae1befe950dcec885512e7aadc86555f396c679cb72deda386f512e2b3aca66e53e48bd22b5e209049b8f9e11242e4ab03701a94b16d8733e3d21720bec6716d84f5c24d7c09ec329af8b1e4807b272231688d3592c62f53283371dd783d53cd22197ef54345355954aa5a936954ac5a93a955579485299039f35effa866a667372dce4b849b9cda9176455c4e5f28ac399f3ccfbb32ccb8a743e5d6b5717fb018ccda1d43b9f1ff7c59f1e11ea13e7dc375ccead733e647187a3e3aad7ca7d3973ae95c520593b5bcf9b67cee7d7b29ab7b616d5bc15b539a711f95d91fc199dc36fcdbc75cead5b8bb3d79a399fb11fd8bcc5be71b34ecd9bb052ca1611242df6931fa0bc2a536ffa73f3ac79ae9e5b9be41a0be15a1916c23d843b647cf8b1dbf1ec1500d9c0f226806cb87935a5920ede0424eda36b3e48e9e1c9fb406fba76cd7641b8f298a03853d3375387e9bea7cb6f4918be257105625b5c7818db02e57f88b92e26b0cd9a0ccb80624d1a0002a970a3bb208491a6f2926f92b285b0d03f2029b77d6e8fb44ebc744dcd4b309f3b0d364db142e53d534defaae670fa9cab1611e9d3e5b675f6c5dff2d25750bff29c349ff22b6f254a15346fa1851dce9723d2c683d3cb8f5a879e11a79ec5ebf9e6b59bd75c043544f09ca7bc865b2f36dde939c76e9e90dd72bcdd7239393945569ee336a39ed5211c971e6f5ce5ed09dd3895385f0d9c6f86a8c3bf378fe3375f16c16f5fbef9e9d59b800bf1021e6880850c94587a558f88566df5a47bd471f0eab3f1b5f61eb07d9e6e3d6f4224f82e6fcf91e039e9dd97a7df7890ccc1797b7af30d49a7be7d43d449f0f6cb9408e79edbd537ab6079ee3a756ecaa7fc86cba73cab02e6399f5e901c9f4336dccb361ccfbe3cbdf3e919e13c7b42a690398b5c9f7e7de2568eaf3ce5b6bde936ebaa97e37d43990f5dd79020dc31dd33c2f9f496930e4d87bf65b8954364e5d7a9cf2fd5e14cddfa0dbf616385f438f8e7bae5f050ca3bc10148483f71a6de0390ba78424ee9d12f396173c95937ca7e73bb756e94bdaa5bf29a1775f05b97b727bcc6e10da90aa94eb1c7e56e0f633ba4795517403140a131573ae471218ce100e6bbaf02072e0f6354ce7c8f87312a57deaaa0b3b064f926be3d2016f408edf3002420f06f27823e2415a5cf33b0d0052d13bf039b67e90062c18ddd0e4f3a0f633b68d9c1861d60d8094307123c1ec67470619506900c72dc504329871452647469a6488119a246954e061c0f635750c851839815301fddaae20c97f53066454b0ea0a51b3d4fc8ba916363550307474a88b8f2b1f0b5f6c9dd412c7cb8d3375c89b56ef2806070a5c30efa4812a3bea8be121c4ff5c9f79464dd9957d2a5a08f2411e60d837d247261df4d8536e9c3581533372f7d56f152ebee415df200c9705d930c98f328224519cbd8c8c31572808f0e1d76603bce70db9308412107f82ca3744e29bb5bc8011ec21d2d247e14e2007fb35082fd0b6f3b8924ae7c27f1b99b7389d6220dd68bd2cef4624a4df12d8c583261e30c77ba6eac74b863a31767501af325b0905002f32a98c10526ed99215535985d193aa5c8e498aa81d15233d83a1f38155cf9f8c5580b317c74db1da182a538dba33950c193948b01d21aa1461a00ba55d9a6abf900e646b35dbe632d64f986de47112976d682856d4bb8d1610c8a1a1b7d883e00c12e8c4131f33116d87c3b7cbf791821843e84aadca2f826203dc542556e9174a12a973e75a12ab763cce276d422abca7500d277007574076121d29d2e618c0535ef5adb988412373e7db074618c05333116c6b080448c052d1bc882f595a553bdd6ba6a579de266d65767e9b4cf081f0041fc207ef5128c4a5023ac4b2c05631ec65630f30978185b4187bf14d2197dc61f604497d9486ad4cc3dd24f7d840f508f5caee40ba378b05f7ceb9aecd1ae1f555ceb10ef3c71f30e8f9f763a9c6ea95b6b571248faf4ae819ef8ab815aa77d76da47cb3acf3a7a1e6eb524205de522b4a77c02f095d4443669f7ba2fc7fbd633b78df476fe96e5330f9275d6c0c2f67173631e81fa696a5dd6fd21c59db10956aae3b4ac09dc39f22361145783973afd8a8240cf721475201f79eaf28b78e239bfd885480eea42a0154f7f7471fb616c052a9fadc4f9a82504fa0775f48a4a9094020ab087d0059d52197d7a10883ef11074898b8e3ecb8f61041bb7148c31a660f44a68577bb069c739cffb9a08ee6847d243b6903aa44cf9a1e642cfd0c9775c13d7146739ef8b9ffa7e7cb145e5ed314bbbead39a2742969dce7d9a6f5fd6e667f3eb075711d6aeee9bdb2e342ed4d87cf567fb44edc71737bbded5c3a21fa18f0877c4f6e1bacf2aa49353223f97e08d24118b7a41b87e6dfea6c99f0d24b5975fff6c9f1f5f80e002b247e7d247901dfde2ffa0c1ce63e92390b91f88515919b4f3761edaed1de823e5d007007da8bcf336a13197fa752929eda9636deaabd9772efaaa0174dfe6393cb79b17c4e3bc2271f3363c9fa63ee9c9d417a1b42e353f2d76b3eba196da813ba4df7838b757bff9b4e6a19ded3a6c34dffaf48a00914263b6ada757046ef333afb33016ee488f0edd72b5adbdf149cff99ec0be7aabc8f48ac3abab10f55585336f7db26a48edbb9ea76f41583e3f1b2e3f8ff3e919a946ac4f9c913af9f5cab76fe538df90751cbf5fb62d96c3cf71adc5f21b1e464819b7cc391de9230b87b6c568447ec442da1332bddbbb0807f07fb23be554f3884c9ff84a15589c9b9dab3a400a42e821b18dbb7b006b2f9c96bb494ccdb2403d6e6cbcdde83fac76e1ccb27ed607448bdbdd2c937306b594b3e27aa9273149ef145c932800c9e2e6eee747bf24b163cf4ca621a56c979d1ffcd74ef34897d2b990934697ce4a12bffdaeda27c3f42631456f2aac90f8f3c259c59387312ad6fc011ec6a870faeaf4a5df76d12e57ea5833b24985346f632771df2426cd394f628abe79069fa0cf74ed4a8f4ffda1004ee8789398e04d628ad889bf9298a04ffd3cf358297524238230f31202f16736bd22d2abf48aa0e0a9d72f5322f387a8d349fdb6ab5d6021ac371a48814dace2cac7074244f7a48aa568820cb07d3e0b3b76cb09553c6e744805978fb1881754216589bdb24712d3844e679c38c74b295eb5aba58c40cedcdce9743751f7113b0a5a62d5a6ec9651ccc032295d0d59ba98410b4eb400075d5ef40c2b6800a343181edabc7e74585634a71a0e9265580a84a661ea5a5c2af3c52c23c6d461f1e8d1cac43ef7b4600a36533ce954f8cc59593e2ba3650050d23821c50cc62002882c8a3071c1066368a162032a4048a152464a151a0b545c51011f5988f2f132b56710dec967aeec32f982cd1832d060a607281d5c51428c132a6098e106161020e44f9467497716bc74cd0bf2038c32503e4f182b03e5e3cf305d93a467218a269a48c3c68521acbca217176448a38a35532c71e529a80b32bef8010d94256ce89820a500892276e821062c90c2490ce2c2586c4d67edb5a3dce94359e636579c3b875098fbfded1a6e9cb58172650c8ab8030c019026409cec0051410a2a9fbbef290f6352408949d184066b3aba59d17cfb92981aeae9614c8a339f759e4aa1e53d734a3dc8edc84399329a61d64ae74a2058eef47b7bcc58d8d2a7942d5b7a07640629a519ca260685c65ed0661a5066703158e7824f64cc90793272e8e312429f3965c3f60c2184492274d8d4b176acdbad72c856b76379cf4f4f8ccc97155434c2a864b09039e2530f6364b4480921841fc158db5d8447b0975f267305f610e7f813d43d1cfa90df453258cef8864434263ff1acc1c619c640b50fc77101f33ede5a8b733601e9ad7bd30b52d4997b339b7042fb9c385b97def9e6b9f4206933d26b43112b89d323d2af6911f6d93a751f1ece9c4bcdcc4fe7dcdaee62dc70146aa260e33947c4c75b9f9e10cd67abc8d43ab7d966db7d5973f90d11f9780e93e0e339e77012ce8db49752833b36d7223dc3860b6364a4c4c84079181bc3e6a1db87b131618cd962760c0a2f50508cf998019f40748849dceed6c8b616d20d5dbe782166081bb09922022f673831e208349c408991a64241c467170dd2901103c895a8af506734204c582e1dacd5d5d901a2c3bd2c17f3f4aa873128768062e9b30b0aa5d71e8e717a181bb3c5000f6363a0fcd3d24fef8fafcaa0d3136bbe3f0c0d0caa411df22574172b730d870b634f59aa2b89197a79407fe6214ccf9907fd7c1df1cf4fdcf324a8b30ce2201092ae7f669b5e497f5164037d2451a27d7ff6754b8f1417610dc09ca207d993a587198d3fdfa43d49e8c527d9632e491ee91cce3f156797d7d92795f45c9e69a556fae971b9b2481ec962ddc6f9468cf46acfad047d40a13077087e8e0efbd83d8e989ea6cb6fd8773c8ab05790e4912e8dea67adf608cb46f5333c14a471116cf3ed4a9054f81f17bee08be2087b4988c6f790f6c1c0135d4017f4c1c0135f4017fc0c9b78297d7e42612e3ce3e16728e6651749678069c3821bacc0e9258bf8c18b27a82a3a8429020421b880110332a288dae1858483151c58c1610d195f88f192f00915a28841230c199a3cf1922f48618a178e889d0155c34b1a6106105da6708286172f5926ea871b5e78c19a23ce78490f923de06b496b0d082029a4000426864a982c629890d90a03414113b3458c962770d064e4f38b1cea0a8cbf2105d20b3168011751a0a06606588880055388e0010b9b1ba2d4b800670b5369d639b1c68914e6f4e2e70cf3e4e79c403958b9c02c8101024c0cb2ee32ed85114a507220450b60568889618725d618e1b48316327401e6052f7bc2062fb60093828af330c6441726ae7cde797a34ca488982072f623af44471aae2c40d9ca8c20b1768dc28269e7c6913461861fc74d1041826a4f0e2fb824b0a3031b0d820a6044ec4ac708272441467a469c24c00a2baf812c517305f17d0882e6810c3065f989841a3c9106992705003a831c2acc0a4b4e586195ed06108ec16560b14a089218c1b56b09206eaa70a99169c28014519291a02a5405079864d03d8f130f378b8f3012b7ad09ebf873904f030ebb8e7a2ff823b82e60f81467c816762ef943d3e41d5470440b800ebaff841541373783b0b679536ddfb20dcd1e13c9d2cce3a4ff4730c237e10a3a007ed1dc370821ace2b9597e1278ab37c30bec340e1e678258c6f8f57aec42bf1cacf4f4f8febb334342e0da1d069e23c82c44a4048e8c4931684f0024d185fccf062c1115cbc84c15466852cced8b812854873030b7a8022072d8c8895d1450aa2dce0e40222b018e23aa5b45bb17428a5947694524a3befda3567e61b5e514a29a594620ce474a7af56fe84853b59a6659eb1741ccfecd3b20c6b1529051bc4808328d26022c59957e605126d9a82d0e209325a78657ec5125f6e60dcb56b4eb83373b82289a7cff7aeb83c71a316a6d60a944512591e084d123078202c9278810ed6eaeaec24b102990690165157fc38ddcd060eaed0a46c9a058530a45d71fe386d1bbeda169f5d1fa913b70695b269069fa88801cd0ace84d1610524283398d1a28b1a4cc1628645b3e43175ab5beb1252bed67a634a90f17509265f6b75c91e1294e361cc0b98bfd9a585057aba1a8c33f0681e3aabcb12c3e3ae58b5fa99afd52986afb5661b9d52073fddcb722f5c92804a028acf2e1b7c033d013dc1d2c9feddddce6a272e8c2f3c645fb4e47ca9a24996d3bd533a7d99c22d31657e79c1d287312f41387d08b0078f96602465cd69adf8f9250595e56ad78d87312f357c76d196586896e1db1ccd79184342cd8c759839a7ecd26a1d5f82c582c1cf399760cd89440be6122c1e3d5a0c89147ceea131f0c87828914512603c9098ab33ef943eb4708205657c51051534afe9c58623b660e2421a26aa80792d7441f74e2a9ccce0bec04680c515609eb87225852624153411c41515c040a10a9419272fd6490c014218029b822ece5a992f566420f3c442195c601b285e1044142a64b0e28c2db34419710933b815eb561c24e7966e7a08ed1a32abcf8aefa473fa655df9399d80f8392774baf0621dcd93e68c23d27c766d4834c1c4979d2652a245890b2edac86086939d02c94a125ca6b8a003116828a184124aecec90f0f39aec11614d53ba54897d963539f199ea95655ebf2e736d622ff2db71e1acb51ec69a7cf8ec61ac09cbe79d9e1e83c44f98f7877e043a34419b47e6517ccdcd0bd292408645e8a647fd497c51ea1c4e7202e495f993f8a2beb9fce2cb7684b467aa28b689aff91df946f8348f41404d37eb913c9a9cbef9f4c61c3eba924793131fc1a66e9f9ac39796398d8a2dd3d86aa3f425dc1226249ca77c89cafbe37c3a12ce673be71b46e2b9c44731aa3c652d6c7cc48424e786e75cbfe1d78f9890d8f0f61863f40d2361390b1fc1111fe5f80d9c533de2dbf8c87113d77d76cecd8f2c12e95e75c92169b7f8a804c953bd9d6b7c146158a9fd880949f4c647d563c44723489eead68fa0dff4e0387ce5085b397c55171273e1ab86c357acf0a57d474c476ae0a3f8fa9658e7fce65bc284c4e2b82479aa73bec4ba90989b3955e19845f2d4ea424f58bce4886902f0453d5b421dbe72ccf275721f7c791f7c7549ed7106597481bd850d3b65a57524f309c057e622c457930a4976fda1ab6a94c0c10a2e407902c31853ec1837a8e96abda1882d5c86f8fa30c6050a18ec68120a48881f21babb75b6889105d10e0d808ab84a3b3b405c266cda0122a2d61ae6f6305604962522a2fc04a4cea8640d75a5494c19321a011040004314002028140e880402915034221795457714800b9ba846704616c9a22489510821630821801000000002000233a4150099043f9349ba40c432471688da6cd9c8716da9595bb4be8260c702e7c9ff5b33a61b0bb1aec80a45d3013600f83bf990bc1536e34a270053614b0eff1838e112e7054c1a94c7388e3d69b0de0554dc3fc74d138d897dc40ae865f1893a0fbf8c50917cba5c4a1778ec00d2794824b00dac97b88e22d5757405034efdb8513efab959aa2645347a18cae5453d4fd13baa2df9904118425df4d68670ab594800ac08e1118d9eef29b2883885b7673846e8eb768a1c2925493250dbb2a3b4141f50d3116af830af094a294c4160fc69f9f92fbb3dd4540c4d55acc59b927d48c497cb24a50535754e0d43dfb0e4f16c4bbd7758b61b9ba8a8542abaf018497af39923e00739c0aa8013ee9683baf0323c9a5b14eb23bf223f2e1ee167b5a51acc6ed2431791b57a89adbb323f15c6d26c29608ab566ee0c58324ec22a96758492b10c961084d23ee597b7131ee967a1870b1dca14eec3e00fa1f6cc0476c8f7e415122ef7b1c92a4457bfe936734f53322495c9e8f13d12d3703e93094af9c543070682d48e5e719d43a863350496e49cbe58387162de9fe43d23810cb1dd97fb309d06b343047f0af4adb2c6598c31b382ea3c677fa59662e80a1e2d642b3247b2bb598729d9812c0f9e0ba14ed1cc5c2e16db809b8464e20ea0319e25ed2baebc4bbf4a579dd452ecf6720bdb8be409261256e9338fe50f87dde756ef35ca867f4d84af588683f9725f0bd23da1760846dacc6945a868a1819cc5746bf9dab6521ea58702f4a6fd26f2d7a909eebc20295b108182c53a552c3f0f59129adfc73af226e6e2548c888792901cc1df136aae31de59bb151d404853b593b40ec4175c7ae8c9740d13ea0502cf325ba623628eaffba9ce41ca0ef02005f7f1bf2d1130e79bc8d00b5e54d51288952bc3e7470afe2d09b34fd2a0df426ccb6f49ea524246d4e401fd3d561535a194b92fb91dcf0aa7ed7d0a86efae1c11f2f671da91008451cb4afc9b8dc4101b87a8a6130c25f3663da13cac58c016ae202ab718d3d2df5150dfa445bf8285eecee06f13e9b8f9a0afd98d6c309e2aa40bfc38960eac349b95039a98e482283460c6031da4e5591c316d70710767a9642fee0d7a2cfb66dd1d995362f3b16c11dba39961f8d214c01d028b53be0e2805abd2525145223184cefa8ba4e1eb1dce0d87cee2f20dbe105028349793e0a7474cac950c2db9bf4af3fb4a20366fb30315685142a2e1508ba9064217999a3f19aa23290f163595f8dd880bcc5abf7e5445b0ce544cff4c66299109b24266d60f3a5081a3896d62f2d60958da4457968e4b7fe5f738842f836e5de5fe7d4dd5927d7176a844bea027e256a61456325a9a51630fc25f17e31627544ca2c63777bb860d392540f5c3b2cc759c91dcfa0c675758eec5a7adeff8b5ce802f6a2ffd8c9a1abff944816d5bbcb53d838e7adcf05cac274f0ad0d390690eb1dd8762568516e962542598be4e316076919149143bb3a2583b45ec44b2a5397f8c12de92ab67882702448822bc074c955253f7585042f5a68b2dc765f851692c541d18aca7173f388718dad0021e570fe5e090a1d38858da0fd67aa9cf2a7fbf308ffde82ac0ea4bd0e5d1af7fbc56efb060dfa28f6386985c83a101ac70bb290567a685c50713bf200ec911a7674682744e9a93bb2928486bf25ef940123a05a84f454d88beda401c267ff7af8af1416fd487d306bd455087e632cca28857d7f2a382ee53a3830588909e5f131fe402008aae81d4175a7b9bedd4dc55cc4aa6d120a79aa405cac1f09dc32347d4e3098c414462b029f2ec2c3900602358ace653e89629146ec3ac746454a3dba41846ed626c2563fc15f832daad28627b94b94b23e14d55624715e49d4484d5aafa2ec432748864a13cc47b2daf82fdc93fbab8d34e0c6dfa267e3fd634f7ff66a7021ddafefe6c2490b7c10bc387c1148f00cdc0ae9a81b5e43c82137e46f1acec3e65b23312786e159f9caccb853372fa26fcd7dfa113b5d18ce47cd108a68316944d5ba9811c0413c9098ddda005ddc74eb8014a5da3209f5490a9a6f4c02f9fb1ab87e7638860b887421e8ecd8376cc015a3c31e75953526d0205196a7ccdb3ce1e4292b2997fe65bb28b54b23c941d1ead11aff86ca6a502dfab925800a6e6649b1a73a26c6eea5b88b96c1f92f65b73ed44fc0f1d2ceaa3952a3a271bb469d4709d5786ee83a77db17dcda960a80c273ab9bdc85437e9681f12139d1f5fbec7bdd79eb7b971354d7689904db9fbc350a8f3dc122cccbfa4a33b58ffe539f0d7b4028046215b7103a047c9cd75612178530541bd8d33df8eb985797c9bcd41e9b0e802ca810b0851e8e6a97f268d79ba68e7146fef4a55a7b8d1670e2c3ad06ce6f9ec8cea65c4e2d7e54bc3204626631f6c97ad45d02040582a854ae070ee2b8f6e8a42fe640c7119c66ff9692d2a56edb4142e9bbc93b1031520a9943971a2548397707f85db409f50be8d9396769de527e13d737994de12d6298c6ae35a87dbb3ae31429b9db7c89e4bba658eb1b173a218ad708245ba16579103eb7900982e6629eaec60942ffb7c1600fd41bb06cbc5cb72932a78f3359ea70497a5cebe3607be63a067bfdd558f2c8430c23ef474cb0d3d30f10eae8b5444bbe67ffd7563bdb837063418fb0f0aec9ec4bb78db271ce67b292a5622d3a9341fa0ba4046fed83133cd3b5e980abed17e4c495577a576398a16c7800a1a174da46cab4440d679126f2e2238ce8d4714ec0de7de5f80ea04973b0a1f43917cb0d340991ea730b3cee0b638b08abd0f2961e4e8a9c20b0930a9d8d06b2ad7d85530032935236483f00267f641ecefc40f2bcf3cdde00153c7f47801d3082c4b8388ffac9d724f9b18f632a16f0286219e29784f4799bf8fa815def0139d2edb3525e6b2ef9c5016d0d6b818bed30fd5e5bb826d90c8b02078cdb59349dc1d51a26ab830f6fcdfcccc6055d55c5b65c6139a352745b5d2aefaa79f0a8d991e1ff4cb6b95428185b53ff93309f90839024fe04a4abc5e55466dee3bd64ac2a9dd24af6a0e5e75ad8cc855963a515fec3a76c78d35b4f8f940c9c5a87ef14871fbeec36408b01ee5fa29aa4ebc27b7ac8ced5b792641003430dda5361d1a62c8f7076bb964bba47c47e56b4854e5cf9e4769cea3f23df1f84e1abda8db6fcf48bbad5c8dec7d2c03d31dd6a9580d19199248e8fa71d7751f11927fe924c6a6a7b2437452152b978c6f63033d995ef50acae017fa2fcf393d664dbdb6323b6d9b3aa63e6aa494df24fc697ee981ee3545da0559fd418e24b528abe62bb4cb4f51f62d8f7b09b264168ae8fd3f204aaffe03909598345a99c792262996358cac51713ddc29846e78646b3c887a86f2b108611e079588a2aeb60e7deaee6055b489c9bb2efc3211524cbe25f15e5f139cbb907dbdade3d06bd52098da89b5df34a61fb382132a5fdc59d00d68d2064f902a236dac7f2acdc88811ca7e863b048ea9de4d4a22cf69105deec3b856b3df1fee47e03934271bdd93d823af73de6eec78f524d74179a7b8e7b386294e888c5810b0cb53a758fdba3d34fb1dfd509ec496c686bf8fa9971cd914ac39e50cbe55342dca9aaa266ce4972b56d4a301d07599a02d3703feedc8b44832df3ae24ddf299838a52577a89c4e56fa3802e5b17665b66d524fb1734ea99c66776d7dc99601951aaac89645484b249741d2d4322203d8e671503076197e6f29264ec2a18ebbe82e196bb49803e9636e921951513616ff3f6a914963d7e547c7d8075f9fec1d7b79b067c453be91ec050776bb2de38c6454ee1c20de5b9cbf3821a73b49d2fccded2aa403c80b8d1d6c0144f6ad76478e4a6fa56ec49e96b8660cc21cd81ce47e8f6529fac08ec520d15dfcb00b37785aad423b74e63f1828bd66f33f3b81f9a19a756a0450f5973f1c977a346aecb46a1b13788e388d8246a1f188b3469b4dacdd47a15b5db0c8925228ed4010c6541e8bcf6768f00107e4a2d82b55bac7034b49aed2686003e35c03f006630df90d5720890d28bfacb690c007aa2f64675abd06cc93fbb5bff9b74f40db989fe2ce8b1c48b8b62f3fb1367678f84b1c52aff2a97734d3e82f4fd4f11a3a7bd559d6e9b374aa1ea8f213dd86bb9b5f1d540c449279e5789fca3b65361583f68ca8d4a683c05fb2911b0e14ab405687d28a73bac175c0d65aab1e2136f4ce58bab2804220052a72185f7582e23d8ea29f1e089b6fcc7982bde04e8e86d8ab2be3862cf6985e594ff77840d700436377e0ee994083ad6eb3baa9962e6809d273172c589ae8e6de2527878ebe357711d1779e0db1672815721c7ac52a0532623afab3d5b0f89e7f4dfd0e131d66dad45c7fe4528b10722bac1f404c5dd3e26b3aef6ab647146063b6d8243a06e537ee4a92601981d8d5cee5087772a9c35f53a4b74e66554c1c502af771d2121d491bbe6a51912f31829ec2f56bc5762030e69b8e414fc12ea192477c92f187043d168c91b304e220914100bfc53e022adda7d982e9989964c056b67fad37c70078140612232461341bff45d15077bae020a076aca8e0f4a03f666954d3502c33a52adf94499609e972d62827dee92f091db85dd368ad68043430109f12cfc1a6fbefd902e2222ea26e82a758b50fd621e9531f89bca7c8fc2492c4bddff530ca01b8d112c23c062a6fb7dd11f6fa09a3ea63201628adc472fad010aae7624e94629f496c4f7c5cc18224a8d2801072029a1e78132b69d99346dbf2535bb8e8cbc4a0235ec978609c9573e262014541e0e74d7d789703e37f22ae4c44b8a4f7da4a3b9009012b1fbd9bdc383d3c8fe287546c65e36e4242c96e0ceb4b59f814f55d0ff811b4db6d31ea2a1dba9b19331ba6e437453672e9db414bb8fcae792c76387aa92a4c034a535ec4f6c6faa08985cde55e0502fa6fda55c4989a06d43f745186cc66eb7ac7bab0bf8651e3e21feeabc53e4e04b91e5adaa32ff68d2d1ecd974ef69953b2946ddfd528c3d0d55311322bf0f9a228e0981501335d2528862a0600cddd865f5de52813a408d8ce6af90b352f26e0c97269f9ed6daf618c0ed1ced79f28d4a7674939c454c0c4e7bc22f25f78f88a383e032e901c26336ae743dfe2e7ceac4a469b9735954642eb3ce33da9ea2d62ea9d29b1ee045cdcea280cfda73b28726abccc2c0663a0fa43feb44e47a8c68c1d88c3f0639126b0cf807b69370cd08400eff9c5ee01955070018165b0f50ac68f35e05d87f7c176b5a2128be58d242afe52a9a80387a8e7cb2c9395accc96c9d2be40b2751fe0c0d88a2ca950803ba34fea0ed5695ddabd649c4eba65a53ac9d92acaa91c1d5f070572957992b46f7f8d97dddc54e8e8380b16c1b954926193b11d1eae5a94ec88074eb0107a692cb3f3a73ae1c1f84ac0eb62d4fc00644ccf5ad513d7787587f7e89794955b59678add9d2214a0b8c24d294159be3f6abdf43cc047dff116026a503363327c423cef5a10205f7a470db875ee680a25ab9e8210b04bcdd3047e0e0e556c7ffd728d1f92f76bf9ef4aa30f295f7b67d1bd0a2c3b00c1ab30da04117b285e763d21cdd37bd76b65805459a80121ce5db0213222a15a03d9f41f8c3d792dc3911bdb565aa113ce901134a8ef1b7093da8b5815b08952a863ab576a103a28110af7c3fd97a2bbdc547acad4a888c4184d227962649995afbeec60ce7e982491ee7a4ebf07e487957a94ef6b7c0a80f996d5ce837bf6498ddae90d923cd6f8d145ca30977e24f0268facf49371785c00d04bbcebe3fdcff0f9f110369459d172193949e24bc8ed0fb7332cdf89b8a6402d15ebae205ad2dc751e8b5c951ff126974efa415689ebe622d504a855febb8b5bb07a3fe5266df4f43635ca49bdfe89314aae477c43d6bd4c7d9a231f9bbb92d2b6febcf13782927657eb0a730b04d565bfd8e7a09c67286f2c799d515a04a4cfb383b5aca8c4aa7d9232073310aa379b80d0a204c405a1a590694729a8440d2dd8fa941b1d4a19b0d3a1ead4b0b6322b48c60fabb2a8ca1a93cfc35066e0b076d23d090b8fc1c259347b92d1a96b66a6427e0ff1c4d08fbcba11b9bdd7dcd6e6d8e45842e8bee5b3ab7f0186506f2f4cd28b06176697a49f2ef694637531d20e514f6c471d9b451f84d8bb6dd5a9ec854c6f22831e0cbe879804a98b172c50a1222e3500bd90a6053672ef2fbee99fc2fbd93aba995be68153a326aaabbfc0089660c2de6ff1ddb8ce743d4e4731ab6dde9b40cc2c0d6f7612748ef1acee2c72d8a893c22af7ad0688bb62b938db6c69c7711fe77a99e02685291314a774be9a3f6f9a3b71377e107560ae6290c4804d67533f6ecba8dd9955c29a4171c5b1ed285262af4ce89e93b8c9160488d4dab50aa2bc83c76260b44435d02cf96758d08d7f94874e08a4af841edb20726e605ec524656c72a1cf6d23342809ed5dc3f5182d3af42a4e07c52eebd1479c2980a117db2438c63822420e7458636364ca2a8dff2873fa9faa619835bcb528bb134d946e4a8262fab949de471cb2982b891bfd6aa5a9cedcf0c869ca053ef2d9fdab422ae2b1fabf19f3096331c3dd5623924cf2e165b51a5bd4601c471e0dbd1f8e2f309cb4f08141dbded80ce0c9bf73474156e416bd89092bff8dc647880316409169c61cdced5151895bf19e3c6e18d2835d0aac1a8b3b462b83a85af5328036515547ad3f2432d7a542c5dbd6ffafeb873757ebb6be8fa2824ff773b20d14bb2116acd666b1c1115437ba8c7f45432351ed20e5089092c3775390e1cea573ba4393ddb4da00b21af06febbf88d36d808e09df5f84014dc8a15644ea74eee6e62f0b62f42a9a72f385c9fd8f40b5e48e9e3b19d0930a90cd40e9ce37746d4231d1edb2e2d65732b1a0fa4de0b553dc3e26b082744bb6389f03e8b50d8d910a804c9b605123f151eb87670263941988aa63d1ba87e6c42d95c69b70fd813fd61e9961e10ff3bdce762541bb74ef5242e8c72cfeff1a6f2c5a7b836a7923f46d4a08cc1a68ae05a698de3347b3d37436b537f1c0fe90135ad9742387489f506fd4e513182e334d8a9566615f69e2cdf85220f11922476144bb59ba8a92d021d0534c3f07dd2e4d2508df0bf14ff724e8e76069c5116646e2814094538814b1a0563b5c419848a42c4168ef8e8382533227b00afb88fb0221645da2454b16ea4c1108f6e475b631c50b6fa19e7cb3191ba14f7d8806639f1f4b3d5f3b9e613844c751dbaf8267e191335248146c31fc8962fd0143d9d97fa789a578a8fa048492e3e82f4d23667a9b78f5aa74d93a04b4ab20dea4a161860222332a38664c509b4aadf03a64dc4f4c25f69f443775b1573856cb8aa0e7577e62a43a138a06bbab2bfaadd2a66e0ca8b5f1e856b7f9d028ed71ad0e50e4043243126c6593db31a0e903d59ac21869b57adc723c8013774518432733226e995e6a56774c6acf8997bf6b3b818e14dd291b1c7bf0a52fa5f3a629dcf2b8cb8646318eb6b5bd46802308c79e1d18e1e9a192daaa034606ac4b607a5afbf9741439d3ef30eb634a9bfc12ccbc9e1a6fb97899008a3975a30d2d21e51ef3b270d7a0cddc75a92cfaf113357a6b3682d453c752a1c2cc96bde56a03fa4a6126ac8053717971d42eb8a266d4ad57bf0d9991a977b83c13d03bcaab605ceec410961ed39468371b8bfc0feb96a20203b8a39015831a08fa98a133ac50a01c516c1381bdf276020e52610e8616686728213dbd39e6d446188987ed6da24f34bf78b27a5a300db142ed627bb674f61b099a4404cd7ea38631b40b3520cefe81e0bc25640910038d44a747362cff83da7ddd1ce1df657350c460cd96874c5e3c91d2b766ea6b30c29275c1ada9e9486570dbfc493637c4b4e0e52180b598690491564b3fbd28ba0495cc16c562b3667e5a95a4ca87b2484e1ab2db369f965e593f683485b7916e9a4fa4e92991eb705ad29d2032d5fea38f1348f39d48a21bed09748d8ef90963e3290d7f2c8c733637bd82b84da8f03154a624fb23a70df169a24baf751f24fcebe8be3e45e28ae91bea79c36608ed7da04e6b5b1f79101578e9538c9a0a167104310f98c3b5fa6dba77feb0401f42274deae12c03dc1437749b8fa5e6efc8d42b81ef62d253f3eb5c3d0c5d987b1e158a153ef5b75a66477d93b526aa2caa374defe3adff1693cd7d1b03656bd6f471c0fc9dd9a36f1d60f53cb2be2a7454e626a1ec8397c2a91b1e2275f187fba8beb2e0a687e4f2b60f0c8e4c15c00f983966c2ae86029b287746776082396396dd94a9115a9df02cc15cf2122a0fbb9224267c37eedfd29880fbfdbbfcb247a0540fabcdc45b95a873271a51c16fceb85a92acd15d1711bef0115789ba8d12481cc847d119915871fca98023e9a65af648a02b380d31fd6262148d078e436cdb2b8202a31eb6bf521624c802fd61140baa546f7ab49748ccaf09cc96082c53e5a1a0d19a2c99cb55aea88055d1b3dddc02661e5979f228328a29d817ed15e2e84d0e7275a61ab82a7c97560630a91df7dea213c1ac73a9bb8b8297f97011302aaa21782fbb7b60483dc09e8d210d9a7556ec9d9831195eb8a99fdf8889f4137fa87da5fe13b75e776e7867db614e73711cc0395d13ad93528d13f4d44a0e8b2cf926c9b089319416a27a54a09c0b44881252b5de5f75b3c325b6151b0ce8ad61c6b423e162863315642118a31422db5d7198f351cca78f4157f335ad226300c1a4c52afbc4a560d951ba915e59893650d94dc45ac938431ad4e6c54a01b6bdb05ff0734fe78c8dd6a769f291f21f1681d716d7d88fc32d776cc3847f6a7309cca815d541d7fd2455c5940eebd23b5b82e5100293c9a401d9a6aff97730edc1b0cf33571665ce66148811f4a70e7da29936c8f70a521f0e6a24204d3e9c7fc014aec0418b74dfbc951f4d7f4bc480d6cec0e3c0a3eb391e53f9dae540c646b525530be052a2a02662e0f9bdb52f6248ed4cf8df3009ba5270998566343f92c373f475a9088f0b809ceb4e16c89c9205d501e9b231b5e3c9b8521f421b277ae479a626243fb5a74b4921d111c9f411c91cd5aaf9ada7e9152b9d8bd6abc70294b0abfc5ef19b7060d84d20d13142f2d4a94bf0d91c7ea5a9877e675d31b4af58b7055509d3976b0f461840d17b647cb66eed672bdf9ec5975aed80e7efc71b2bb9c215bb927e4849c862607b525031d7845c7213ab1206f9aea3a7e6ddd35c0782e8bedf81e445fec1508128397191dc80d9bb85693d3fdd37ddea3f3aafb6363aed09b4f5e3d821c00c4b8de9006bff1b0baaa33d4cf82a388924eaa83f16546c364ae43d08d11dc5ce435a425481d1d8535e2a720cd20b327b2d597316403a5d054de7ec311990683813d5f282bb09f1625609efd5c3e193dce50b058a3e79e76b2c500a3359a3ae5f88b426673d0dc2dc0b54165d0625d096d19e59c0cd0ebf244d807117166a4541e96833e19a1d44d1f2b63d899c3a31b5c25f74e94bd75191ceff19dcb3f6bdcaa45f794cf098c16875798e910eb1d215e1585c833d5cca2880119ea3e5b86cdc14951fab9de78bc8ed337f00c85efe5c000968d50b1a6f5312083f5b307b94e55c54ba67f3a1faf6aeb9d0f14feb6b8cec5090131be690d35e16f46dc8cc75afd5ddaac4b4b1c304fa4949228acbdaeb7b047cf173835f2b9d7824d6f02bcb5f688a70b77ec88ea1318c2a3a9bfcfa873d8f6f11452785a7816e6e14b338980ee71a11c54f42bb81a25aa2d596fea947a33dd3b48bbe90762eff70e9cf74e30b15003f78c85cc8634ab82c957bba04af3983023b49f62629ed73c89c6ff3d0d590ed79c6d035cd00389a36b5bc1342ba2bb36320028db945462b5684c9a3e08436876201c07e47e45a972523b8091838f57e092cfb72c5e5dd51096d59d0cddb8e5026d622110ba0837bdbf309dd26f4cd6b569c1f0ef1f34dd2f47a2871cb3f56f46508af488799487932a06251746c7ddb042e0937e6e0930754690f75690f9b16e1ba9b59d7e50ed7cd5dd7efddd7fb1daeef9de13af13eeb16ccc4b16c59ed518e23b6e12384e42646905a23353cebbd457a77f242cfc6627b1c6e931e901c1449c401f0b358284c868304d8acd2d481277b2c911cb9167e38b400a9587bd71b23619479e368a3aaa1e40b13753be02926fbb3bb25a443701efbbb7e8025a01056fd3be8e31c62427b1f9cb3755cf8a563ba0b0f77be3d97837d831be016003cfaf77a6e3fc56cd5753833df5d1dff6831223b374063262dfb2e898123a46d1eac7398ae1df84d69279a10dcb4210e7f99fad6725a5106634a4230eed785c773f92effc0773c39ae86edb8681dd77ad72caa0def3380429ace2b067c49ab922ecdda58f61f563855824d4f06bd34bb06cf439c6d72db24397baaa1c8a9562bbe4033411575c2cc8f63d6535eda47bfa298fb538b6afb5bc498e63f76dda9ee08cfabf461a6d9228f4104624006ef3105c4b15e17bef5ac9d95fe9c8f8b4aff6a0b99589476e53142da824608955133ad20b194db85ddd9e141e2c3c8f12310364131e42732be3d67935f159c56bd8114b47fb3ba817b56a08fc7b41ca7ddfa7f645b87aea7bbba45cd3655ba787d1d119c6500597fee874203ce385239fe9d6eaa2c5d517e47bb38dbf045498bccc8c3515d3c00dec8412c12624a3d063130a57a59cf43267506b7249d34e5cbbdfa060d4008ccbb6c22183e78cac999994f1af461a6dbcea125cc6ca946cc990a1a45bc9b636a5298a0613d011bfc1f1dd63265901e26e374d351304ff6330291094b1e0c552403fa1fb77568da97667f44504eddc6c8e8b4e6579df9f0b4529ee466be49270697efc321626b7683da0abd84c2267670ef0613030567a50f2e10fbc9add87f8208edb2f6832feebf4fd686b48a8c920d58920195124891c6bd1dc8e166d24fc8f5b1e84393bdb197f1e15220142e4a186d698f96335880edf26db6e0d9d76f35e67cb8be56eae2e119c5d07e11108bf0546a7d705e890229fb07143c33e11d432efba8bf7f85682ba0e359656f71302de7b1c95e8f164b87a710c3b8cba32dd69172c57482e80515b2122c3b370fd53e31c5cff2da5b84da27b923022bb720171c9795c99a43e272440767859050b31eb95e286de15ff0cf21b66239a7aa86ad9cce89e8c78e3b65428e7189630960b783645c017a536d05e6ca0c7f2ed95c2859df119d14499f6e2de2d59778a9481b4bd728fb26a8b2577241ca6ac907956944f796546d190fbf6a301499d7b37eea86cd4dd540f08d40d59f355d240664189e0ba31982bd17b5e7994dd9a0b3130ce1628c2443c7c482323b9cf264dd4599150f389ab54fff331734f1ef61af86b60c5210614a213bf31402ff3a720e390e9d090eb255b38c707c3b6449cf97461bb209908073305195ae6309d438567d012cfb5fe900931132190b11b905f5f11c772ff70615ff5f864df301937e2d700e460bf0f4fce79452fd900f59d194b8e599be1739f5029fc9a4fee61d980e2399e181baed1a3a4a5c9c1134516d6eac4e19996d9efc1571e71332e7e526910650aeb9dff7445f2b2465cd33583e30fbdd063739f48765c31de23311c217cf5e102601bd3f166dab5f3ff98e8e599925a5c78c513a6e318f26d369d5f99ad7cce18c43444e487e5db4b3ec0fc96e9a2723af4c8da54654e7481eed5f8e9d1f3ded0f617874838c3512f873d410b6bc7c9e532e230beb2d0e70d208c7bc30610e218f4bd8ea0bbb846ead83e881e86d62fb464055fc74b821fb81e64c2c079e0058f0edaa006bc5b1422388e96cdfac9c23fcbce3c485dccf875177ada5ce8576af32b2cc9e3a982106c0836ab6647ace0b9eb28d107e6f07e8f63458d1c431c1a94861c6d1e32da98971916be0105b54f5186d33d1c50e6fa2fc2476842c2ddf524c3b8f3188aa3397c27b62c9c4aceaedba53de321842fe078774ad6d1702071d9fa8e19a060946345ba593d3e45b56f953a7e17c50bd12b3d95c2bbb4fa4438172e43e894f26d6fe8dfe182111d8085f08121b84ab8449ab3e19040f3b1072e0482878e8dadd36268fe6287ccec509c71b88da8b328fc1ff3ea441f86d03da605f12bf03f069e3b83f9906022f062c5bb72b4cf02bc329a4612f3dd9ee7e55fdf78a1f7fa88ff104c2c902b7ad69a17bd1d09d41b662d73f938d681c8931cdda2726bebabef237f5d7e95539a07a470674ec5307b1a4de7196aedc6b44982a719ce9931f113093c59eb468b55fe27b8190b930c0987b15796987a783c1c9685a5363781143bb5b85585d075831804874bffdf0596155d83a29091e72c1dcb4013c700dc77f82b453754da9389737e5c09ee1e30320d8aff4af91cbdafc4fd27ebc6978711ea4c4a6e0525718c105ead6ceacfa53cad5d531ed7d1f69f8e6ed16ab25da7cbff7f1edeadee4bdb90014e88c66813e810364defe489c6a0224e737524cef870640ab3eb83ab836b389497088315e74df84097b2b4e03a4ae711f0665e43b70582d5206688972a246a0808487597087e006508731b792194c7682ceebae98c3cd7b55772a63d4fd7623b5cbb4b54413bfad9a3617e36a5dfcc39cb87dc7cd5e606583f8c6eea4c9795a09185a7796c6fdd398f532f5dd643044073606c22d3d4987479efd017db45aa238b2cd72d4037dc029b1580cea5c6f9abf7cbff820addfa1df48c3d5251fab2277bcd73d35567d47c5b01edaf0cf999aa23cdfd30fff856fcec6d6da86a9fc6937678c936dcdcfdfcd8170640236197d378990aca29be47444ff24042c729589f809d025ab1d9baf8211e62a67887c31d05c460a02e312f450370ca7e87813a4a4c82da48f3e9833065a31df575bddaeb7f8f5fe71b03dcf9d785c71ae99cc832082dedcb70320116d8058a53deaa6bf932c65783731e3901cab307f3f5585fa48624d28173a791bca0fca6bdf0db697591667a3eb96b2b80836ba805a2791eb0b821efacff6c6c8f9335e7fb0d6172bc8b5590fd015874ff4201b77cc90f97063d9418d23266def46311b9108380d480cb5291ad5c6d3151d0022b1976a724d9c9767c6b81690b161c0022a4b61979cedfcc57feda70d94d0a571b8e750624130f667bf786020dede3cf56b0e548aef870dc0fd512559448d57024fee933f243c62715096fd14ffcfa66bc5b1d6a4085a8f7e276a0420ef8e0bbf07306d662f0dd4fcfa791bc4ca5201b93f4e66618c96fd7944dbdeeac9860d7a8f1a4137f5a35cd8415313530760ac296d0dcfb5a33e33371403ec1e9cea8e7a0b17da9a0d8ee4b6e57a4352d5c3de73d087e3c3561fc133b4a31f42c4706fbb2e8bddb66caca5b7d306b1be67defb303d275ac7ec89cefbf525a51f64cbfb5f86e7e96129f12c32c6614e2c005bb86303fcc474daa18843fc0376bcd65577b50545b83edb583fa63b779af4a081d24ef64726f7d0cbfe0d5546a736b83338a76844fab3f09ed5d46292e9cf8b6a180ac6fba818f89d0dbc3d9b265c34ba579c8268ca734b588513b7bfbbacddb4bed0f96f494f074c0ebe839a6b1d8616ea3dadd159b4e29e3e5980737a0225350dc810d4bc8c0d630fa314d6ae0c46cfd54c6fa158b7ab4e763e51613f5d52c4fb2ed998a5a4b799765d90ff3559e00e97d96927c2dcc04e513eeaf6946bc71084cbb15d00ba0961324148bea628bf9e8aa03fc6823d859ba4435e8aa46fb753262af00d14c60bf1c30600ead58bc303066e31f7a67ea4c4c725cfb2293ac88aeb3abf232c840124ead9ce3f6f0b5c9f442aeffb1369544b88339b41e02314a49401abc4e196685150c923c3fd15186dd7d3db9ee6885d8eefab6d8feb0666b3b786b8d3ccc03f5ae237fe8674115316d06c1766057065de45ebae9e6bf321335df3bf09666e07c2d9a664362d8a9e79b5849156507a3d52e1d5862c68b18b533a750dec6c8ea07f6230ab57b5f977fc5fe9a2c73cccd28c3c47f4523a69c43dd1f726a4118b649ddafad9cfadfbfb9b8695cc678dc729d5c20758a792ed09ce36d83b4c293a80181dc8474a68262a4a85633d88f38d90e51858af7f7641badf13a1d6420135ee17043f25392f1c447254d0b365a8493e515a7d99d5b3a577ef90976ec8b2b1b2ab9d02e4dee3fed5e0c4222b10cc1f3f3c71dcbc8a4cf547bed46bb8ed64fe8d0cc7a79851a5baa3675fd4512762dc6152b18b428ec59d5874c5a7d491387a698a7464c1e106b513f68c2e7de099f4a84023a967844e2a5c912c8c7bbed1b2cc51a2e3fdd2a3bae12571b337078c369917cfb73a93fecba8399fa883535e866edc95433551214c2b16f2b89ed1212e1d8988e68260eb46ef5de8467e601e597a63b4a49e92b4d2f90ede157994174e598badd05b9dcc9cb5d51a3090ee56f10707ad21e7949992dadadc59bf8a5894b1d4d8941afb2a6eb129acee2526e9721064d8164d813ef4430a941617ad7b17ee50a27f3cee4886e06a57e676ec46bb705120753632d5d353d15b96c070fc1acef6465dfb44b86e913ff41b0eb8ca1875bd440623e202b3f47e36b3a2c9489b297809cdb22f20d386a51590aeeedface14858bb61a7122155a6931ecdf9c921aca0020bd2a8cbc2d8122d5bd4427c203429db30631b6245e1725132225ed70b6c2c276d867826f3e293daa4553386865bfc69205857f1164c5e0214f64db48a6f777b7ff51a04bd71883265e3b4e9e2d50a13433247f6a17a5ed55cdd4e6f856d262282f589162423c42414f3331331820c030792f8fe8a67d1a2b5e3e2dc5eba7bd051aedb405a79c298ec773b4033a8d05db8210869d7cde0ea6be9d9583496468b73643066d31675bc8fee6d83450e3b2097ca2c1bcb24acf6180f164160d2b76daa04a2b3eb5fcc8d466b1c7e653300cb965e9421182b42be492ead68a8aa134624d876a4f617ecf6dac4c6e06e323542ae43ddc85d0163e2b0f43f2d9b1d7922f408aafb18f0c763330e55c3b7bc6712a33d0f1fc39f88ca38c9a4a82b449d7ed3772234ab795a0c14a71ea9cbf29f35c8fa64d38582baf9fc4e2d733d0844b3f79a685fc571564a5f5f9bdbcae52546408bc4393b65c3401c3fe4af2eaeed770c35fdcbeed63e349b28ea16b2aa23ad511ba653a4afa15c10328dd81930930f11e54958a64b86a28f8e277f28c0f11422ae5d46b81d227c3d7a5a048209045d5080aa966da63c9b2b94524d671068eae693122c340b59c429fc13cb4f220ddd8c7e611bb88e5fefe23ca68864f83da61bd60452854ca2daadacc8d6108a1a56020703a2d5348311ffef1e771faaf91cd0ddaeae2eff31f129ccce73ac877a0d40ee8b1c1e16f8a0e287b9c5c78d532049767aa897a0efc4cdd85213b20824946778a79d3652499d437699a9ee5b18b28b0b1ab477a9784e662b6486a12d4d76c6dce9eed5b62ebdad17e49e1036d2abae81c362d35537829216ab1b48bda5811aff465be08b2dac3033897e8d61b15d8868f7a64aab8bce78de818b15ea8907ef82edbbe0eab2b35c8397bf9c7b8042222223a990771c6e37ac14efb4a23d900b4a42d08d8882726d04958aaf10847cb859b280e9273b9bded4ada3a6141d12b9f6cdda4226ad4f1a2a3df429b6d0ac69784555cf1a043c21890fd7d34dbc58c65b04a19389ea6c22ded122319509d859d18e8c966c1b48d8f772094d7ddf69221a18ddcc09eb2ae88585266577479bd52fa8be43384263165429b3f3cbfc21441b38b024b0f28ded27fb52229a32b0a06a0a1ee3f092e1899e91505f3b1187eee89447c3c4e4aa33f08fc70222f4e1319a5c30692eb733c25695dd17bfb7f1aa924bb181134b7682a93230006e7de856f5e5a6c2525e1c7b16859779697b9c3e82db279c223397db84d50ee923925cd8e732c58bff4f4b5ee75f39fb60fdcc4b30c86d03535f934bbf023d59000ede5bd3baaf63d56d8bae3500cbed1d4809f7282066c0eb0a00bdc93c0864733c8070c81e026d1bb43e1cd63f397fb57b6deba377af2626695803af87244e42ccda82988aacd942bc21fa049cc90cc2081b57efcc320857442b074fb92dd8c6f725f10788285af61f0cf66bde40e8aab05262ae739b261b897e82f791096015fd30224af5e45293aa41ad1c1c70aa95499bf66921e4cfe44a2a9e4496a9ae02b3f63700c39280cc7ca69019ffd82cb599393557d5305846db33c130a01c0317bd078f1489a7ccc294dc0b32660a6ad81d0d83ac69c670efa31a9582750f63dcfe10f4fb8c3652083ee18c5d2ba5983d39800102e3125f4e2139577c0e02a3105c6ca035ed1756c91457ace2b19f7a19a0b86319d3443555b3d3767f0eacc671221db367c3120ab8a87af92fb48d130a814bc6b2cdf37a688714ce988f4a57c3af04f5e617fb81d715a33553af973342b9ea0b1c9f117a48c66dcf471153374d24f110accd1ff824db8c26de35f7c3cd6ea93ef71a3f31ea7f38713563b686b782e95ac7714c55afc71092ddd429d74219649086fa51cdad421cf026d5c39a17d10e3cc6ad79dd42ad0c6c771541c7ded8a4d65dd246ea536a8dbe3acb176ebacc8c76abb1bdf6c202e5f22d6d9802932c76120119e55a894fdfd9c684c5c646e0b22b269c0fd2e2d397ff80ae42e0e4e1020af6277222798e8fcdb96b3954aae00a46537fafdcf1d39e5efaf3c6f766e273f22a3b47a314801da1712c8c26cc0a7216d8d9912dd310cdbeff6aaeb307d408fa0420f1920b639559d660cf633fafd19c2c4bd0667b363e8cb2c125b9bd87ba0c0bd94778e5a8a5ea7fa6ba9ea59c3e95f50c81f94a7747009950c31ae867c1ef66732aeebcdda196d2cdca7bf4e84ceb0308d02909004fc0c15ab0d9d139d620907103a868de2816fd7245708d6d9ca97ddbc2954c1c05694354af2deb523cd4cddf227d33e9333d68e7e1ab32f78480b18b69d2db23fe3891ccda4791429780275187ca6709318902048c3269d0b4d4d8cb51fa0f39036f842d617ab332997d01a39d86ae845973ab5518402ede3e4a89f6413e039c819ddd3273ae28184b360e8f4a9e579a5c2941e30312cda02c3e87a31c37c707524654a2c9d5899395790d00c61ae4ff3bf2a40ab0b4b1cfe9ed4eab0a323632b0057385c3d2bb622c73d728dc3dd50a9ae7da3a5cb2e9ffa5f893830ef25c3953f9b2730f7ecacd2d90a1a99990526b320fd9d6127268724f447aac058c18997a8d69afe5da7a16521430a2cbca79c3e3903a5fd2279fa51989c9370c7db44202512d775468bc456a73151021eafb1d4e674ee00f95c29f5af6f335232f635004805ca4e017be267609163070bcd5480680ff0f9897076b5a4c86942d2a1a7b86d40399974758c880b1204a9f906bf56d43d04db8308e166d9c50b9da24557f16947cf4dc3d98b6f61b265b0f244010774cc8abab0187f8325673aa36fab38f3514b44341c6471fb3963b59be0bfdaef13638cf0f2152134e8efba71fa5f230e808f9ca3e6802a433cd981201ac55a8b72b247107e2d7bfc09d2c2c950d1c52090e2b79326825b4b435707b18b1029abaf0253fa5616a93111de32c40e10f5a01d9b539a7c27d542a3eafea714da6e43b4623638a98982de16d38d0aeee72c16a790280194c61ab382c003fabd86ef230d393d759f95a773a6da69e957f2c578e3b8a789af11605b5ad44b8b6f0bf84422cda43d9bcb3c2c3988a38f40e9af14516e3a6aaed2fc72fba715310937bb30cd735dc8a5a0930daf3214aaa568f449abf8e4db932e2064794b4ce4c5593b8d4de0e8db37911d048728ccbe5d6d1cd2b3208b9845d1f69f561c6fb10d188ce4dd355016ebb4cf3b82abe6bff8d9bdae30fc7f1743322bc859fcab317e0d0c50d19e0b434a9ce781593b1de5ec2a95b8542cfc2856e091e2b6f9ef23127590b36da62771bf04a57f907a583dff1c690c0a890d5cb407bdb8f1b32186f39892571581ab70f605af074290461c8d058266eaa4fd9945886d7002f6f331cedc75539129dbb70ef14353c5d0a3c2d36df7a0a0f82137b8b34b2ab99112fae6e16037670e36e77452eb514d8cb34954ebb5c8bb8593d0202ee7bffbd4f6cec9fadec8522dbb8e8540e43888176858289148f22e9e9538707a03fab2d28ee04ad75cfb109e0dd4b7ae4ebbe449fef58dc021f3f86346d22498ae7f3062613212ed21af49b971d32b3ee32a541602c3dec4fe0b9ab2ae2c74d157f65fc58b2e58a3cfc37ad25e0fde039508a1bb108d0d5da628a5e71ee8cce35d8fc1e846987fd2f29c1d8d2e530c89b0af564ce45a55eb57bdf8a1c169fc06ebe966ff220ff71cd142851855a0d0c669caf921db4867499ce2335503e68ff71c08677f6849f7fb5ece432f11539c3fb9b288413671989cb69cdcac5402da458f604099002edbf69ee1e16be10bc6af350bb512d304d885bd33a3f52e236b536ef4488a3fe8e429c5a85b004ef39b5aaff7e7fa0a04844e122c9412a020c003568fa7395b9455548f06405359d86d4b6fff9772e01fd2545060e732c462610c85fcbd68b3384556cfca4382ddd4500c97fbcaf5ebfd9205e252bbeaf071be869d3f10189b5d0247f6dee53594c7da14c659a89fcea402dc5ec5aeb83915521f1606c4a963a185b12c93d58647ca3acf410852397aae45b2e934b28680207f669a69785e45a34e35527d78ad7a0a6e46cb482e8c8719a9a6a2d0308ff5a05380d726866223d1c806f69f9bf93b4f84211de2732f8d29cb18a99dad9a5dbbc63f635af8653bc564b94e423152b8feda3c491024162f16f047217da47f2c0ea8d08fdbcd823f486741781ae0b1890dd25bc9e219315eb24d5c3606b46661453f8a02d051ea92caae1c2940c7597974250227c548edda50e9c64d939c7218f4eacac455b8529e3e1b6543d21d4ee6f9a33ce9e72e58ac7b24893aab4fc6767103fccbd8659c9302794fc3fdf80411132c03df746a07636c6814c1728cdf4ac41a0ba276c5f6ec198ce603ff40fc62380e99ead6fe4f9202dc41feb289cba6e7b2ae5db065eb18e2a4aa3767768528e82e424b53b5a4288cb7852def0a0fdbddd7a24a2b0cf79626687070bf6fb4aa4ff1a55ed730f5017f8160cca4ad0cc1daf4ad08df6216ec39a0c756eedbb732cb8c2e07ad4ed4b2f2512f400f838d0695b072ad3cc248cc6f71c31e16648ca5ba79c954f1875daafb44a04b42168d2d8081cfed08b47cafc0f44536aa84c34b717f3ef66ed693d7fedaa1970faf928968b10a9dfae5c8b538fa4762bc5c5d89b151e3d23b327a122d671b7907572dbfcdc3f3e4f8dc741113eab48179768a5e315b099e3ddbc9744e0e92db0465b2d2b79da4523600ba21905d44ffa44a01b93946c729e4e1215a3197dd564ff257e258b7e3a510cf904d7212e67232e809652570b462bbeb3141ce53194afc8b600c4b8fa0399c3356605c390ee8c80343d4879151ea242a637cfcd6af66f0860b09c51258ced3f915d25890b10954256d5c2447f925d7c4aa938cb6a1d66d66e4ec0d9c3dbb58a1ab9c2c4a564342d8e4fae807124f1a0963961f59d1e02d76a79138abe37623c41e65799baa454a2432fa63c675392f536ebd78b6344d2370c8ab01ac196686cd6cde00b73121114cae054184234af5bb68a94027c4d938b4d9bd9b3023ce8194690597c4df6bc78bf418f45aa3dd3dc9107402e43cf8683408e28f5187719f4ebc8d107f9c18bcba3ec4f403fe4b1518bd5ff1299307c38733bf9dfa92abf8823cd8958b7adcee15347482d835c5b92a5f174ee642ddb07755d101ffc764ce0e1e8e65c9500a5d3ef786abc11a2f7226a68d16018d59d8f0b52d8b6b2b9355e856b1e8090e58af8ca1e5bc23b229b623f9a531dc4eacfeb0f8773314aab48558aedac10d347cf0e5902f0795749bee66084fc9583786a50fc909709ea22a395b3de14734418b7fa4ce6aeccd3171c633a74624c0c84dcfb1022c4a9394de31ae83c2ee145010548a9355f4ed8971d4a29238ea8c648d8272c3a32f864a19bf5115d84cc5199034498d9979a824866aa2fedba13fc988ab3e0ff84db1cb57944a7a5b316694c5eefa982ccd333be2bef745c939bc6b9583b62d16be6abb45aec9350158cc74305c89ec945a646f2342d97ffd42982e2d79996595532adcddd347b7563015a9822e80f1c732d39191edbe28b28a70dbc7c7644f7f3d475f9b731601716bbfbba1e3a711ffc7807470cabb1874bcf59bb7a5dbc12ec8ad297487335a39d5f2c203e02c612dd428c6545feee9e274215558b71dcb0d07891a2a67d9a804d9204d1cd512500ec24332e73012d68167be1827e82011cee0d8e90c4a7369e5d5c8f5b09ee9f98137908500289b425ad06c7c620d998c7011520a29c8e1493ed40305241a06f9dabc374e6eaa84c25e0225635e47c1d839ed7ece9084dd349bf7d18da07f846a21187a402858e2a453a40568be87316db58c1c46e3ebca2157c380c8fc2d4d007fc0e7c3bc065834356389aa680088848b8e867436b0736180b1a6d49d2dacf9925b75cd2e1c9ed8f4748ed07423fe718ea92d260e45d004bf866b9d839b2232478909c483880b60291755ff1b26e7faa423378dd39dfe3f4ce309f523a433d39298d83a965d5f4988267df4b104e6614afb57d68117c4f28380e81b485bf7d2dc662784357eb14e5ce232110429398ea6d98bbce2424040dc192af3b6574ebc89ac2a17e1bd417d1ed12946953ea9e01348d69b4b557bdf5749adb8564de8f734d745bb1fccb692dd4c0f5cc26e92f16fee5501b072bda5ff2f549c99b0de0a0643d91c1f17968d327a1e359c67de440af4e93c8ca8fcfbdd5c4fdd0c85dcedfe2a3817440efffcb1e9b4966d2a5f6606a6e3824d94b394f7cd5b6449749d0ee485184938cb684e89d8b6b6aab538b534a7e100010242f45e46a27919741f9a339aca91eb774f9eeba5ac8c9880a4df98b1184a8c1c682173b5dafa4c4e3f1ef7aeaa159148472c6abe1c4d881252cc2ab0806fb59d33cc86ce139ba06fbb094343ef82308676343823cf446eb463cba8502cac2c63fb00f522e4bc413356e44f3361a11504e6e83af1d0d202af1faa7292c5db8843a952de4b2e501c07b285c14ac46c2c0aa3018a6ce0f43ea1f3ec9643c1605e44b8cf5dff13442743b3ecfb44cb01be7d481b08c811d4a6296bfbb9a56e4045cda868a2b991b03bfd20a9c69c5ec6bcca315e4caac82da47ce176e20caf6e97bb184009d0cf135e193f55afaa41a8ed7831a8bb538dc0b8c62402aa578f9b26200ca652fa2e6fbe6759e049586798c92ea4e0f3fa189cf7ea3a9c31d36912f8ec1a5030933203b9a32945e5ebc26f96013b47883361462a3e890277a2371fb08262738df005aada8ee0b521f0bceaac08703b121b5e741238ab253147beba54d440ece044f04104a9eb0f506086a7200f8cc70b11ca88f7813f1cc51c0daf05c4d64ccf7d13bfce9c5d8677bcef273dca0e163c61c8016388f4f8e1805ebcef6e2e6feb00d3e9855437407a8e5682e1bd1265148e1d917c59a0b28517047c0d78ce8c66ec2efd5d8e402dd53279ff46a7380aa8555d54677d05adff486236e6e41bb69ae60eaf1f9d6cfddbb75f916043e3cad76c327421744535885bebae655d5b420157845cd0776e54774f76a63c997db52d6ad84b8d29211291a4b0f8099b0f8eed8b04fec7fd403b73ea3b93aba0f7ef4a18a0d73d2d16035c49ad75a1a82ba4e8d9e3f979033299a5cb633dd3f6e898afea9afafaa2833933913b15f72490f45b429b050fc625886e29492720087d6be645b42e232b1ace36966048348e09b66d5783197cfbdf8e8d3fa0ba34d9428d3984dffec8dcce412e55ac9eab08f935c00d926f5e02c8d569dcd3e293de07eb9dc8d62f3e106dfd178ed07b88592dab48f878c979a1cf6514d9d7beb3e9050bc57ded40763962e095478f650e09c06aeb06e1e5df3185aaaf86cf3409343d979af21b3382a839b07cc4854ff602e1392be8776a5ac058aabe9e8cdee260edc0b391262be262591f33200ae0a467afbc033d0029d5bea964e32fc957c8520954913056556c5e5f864ab3956d4e1805967ab95b08d715d9abc8aa7983a43056f91cb558a1f190a243831164670b864ecc3e98fc8d44cb4a18663285876d8d2194da01239835283e7200cb4d215bb194e60108239469560666611e16007d9c8c2bd009b5ab46353a42ea7b1ba54a946cf06d828797549424e56751c9ffe36deaf835a60597cd6f3de64bbca289175b167f22a966c6fe6028cea215511dcae0d44f114ed66d4f69dea96105b89623f6175b26299a1d02118b15a6ed52190ecb5964fba995a4ff2e40f690697dafb29326b08c98d5ab79b116e54993aab0dac0e2c6efd92c52ae1c2e3879002736b1d349f6c82aa904da7395477d92bf1e0c7929747e5b94a22a0f6598a61e203057c08b45205ade90e0657d7a29a8f626447191b399ad31c0c238f50bbaeada814aaa4f753842472a949a26898b36b1193bc1981611b22d9625beddc2014a9887aad2aec543ff5d93341ccd26416c1cc0ad2ec8dcc4383a769019d548522a146add110404b2aca570bd9ffd8bc2923118011e73b846491240a5dbe5c181ce31346c845526fd5a0a1052fd26a070c10bc1ec7503a459488b6a563c55cbb8ebe98f716fb8d5d7ef24dc6a58d1412286986ae331aa653d84db18bdc1139b28847688e7fa4e97f599daa9dcb93a4a9c376861a9408de9d6a2300dc7e641b212972b5209fdcb4192b0ffe384fa5b93aa9bf8d69a83dc1bfed7be6e0c82b329b42d9b8fada892d3480e1203a735efd6e8731646173842490cc17edc7e3cd1043323e76ae1f1cf159630ef42331d91b2dd3497bbd510169558afa8fc52b9a23496aabb2c5d01750728842b01e0440ab3f4341dc480396a22295cd02be6d2ff09f59a3a64f3afbc6009cb9947b406e8a5d62b0ae05549b60ca9bdd4134268e5cac0624f5aed83b56b5b78d2486705cd1386bb2a884c737e767ddf363f87aaba2397489c3532bec95cd728f9592229ea48537ac0140d24edd246f8891c6313b45457ead95e6c189524a1ac0f5272278ffdc9b482814331cae754d025b13beeb002f8709c175d2cbc0b5ea39ae023e35bf6e730ba0c5cdf0981a97767c6b90dbfe2916ea9b541e54ec8de266c1e9610568cce2da3ea4e29e2e86d87c386697acc360dce1106e1d0800f44c494151f4ebd3d9561d40aa9f29e84e095b65130bc9a722afb9e95af129a8bb321138791a314b5c5cd8c3070e90a0d5d513df8c936fc44ca4231993171d69c5ce9ffabd5ea8283097359ac38734a0252093259140cbebc0283b7a81ff6c00cf0e79b90b382fdbcb3b9cc466700428cd425a72449797375e8421222067ace472633cbb70eb317810920ed1bc3f49784509f1b4b14ba8d8b6580531c1c7948cf89baff4c475e9b7cfaadfb3e81494ca40331feda98f56a642c8a13f615d96a6316dad136a145f8a0b8f55b4eadefb302a23e6362b176e5a5323f68b375c3a5c6d09044070d6d11896a1da7b611124fee87c65732a98cec745dda0f4f06cd5deb15b8696461c81126881a0da4d0d4d04e46382de33d9513707ced0ecc8d18f3ddee4d06cc4b4c4d2b7d5bd94b260514dcff00883821449265f4fa3fa652f3e642f534af88bcefce64521ac64b3905ef84a45c03a43fc548d85a916a52ddcc26d65a39fe22fd0de3414d5a9cc5bce11926341d5526fcafdc2e12764a76d3f474f28543fdcfcf996105416b04a75297bb7b2f612f91371818a174d8d4c4cc0f921b58582188c6a442131000fa92fd962700ad4db1059c03500a028adb29df6e5950f4267e6ff6107720d2ca69a0ac233021c4123335c46ea7cce34bff88de590b3e7fbe019e3a7b55d9f9be24a7eef9b1376dc6a58486bc691c55a2fbe6dc813c4cfbba0973d1640a939169a64a050fda31a29a56d5147270e969756a1cf85ca480b5c53ce311e3b35cb76165754d54ec76e0197daa7a7bfde85ec2e932671156ef81d4b26ac1e3d53219b1504bbd5a7dd8665e380e074201abd2c3a7a73a80d9bf50c79d02a32d0e5f56f0ac161f8923578409d3dd17cd8b5347d59bd6a241252eac61cf3330f2dac4fd3c0b57d31a0f01f7cff34c623efef7e20b39472638bd5f530342276b22f3770466bde0cd21948266ed929fe4b568194d26286ec3ea6130da2ea57f4cd63e501163b991e7fd94ff529ac18f01f8e94f27c734873721cd99c33a8acb0833223dbec9fddbcc0dfdf9aa1033143c9384a91f0c79d92e390539fa54b6831748da548553ed225f13dc77d958499504bb24f2225aa2c28a616f02a1486df5426c7f1b267d73fc37d6969b2a44cab2cc561841ae94010192a5ba94d16a4f9538a9c8177750c65394e656412ab831fa222aacd72c9b23c857bb27867dfefdb1c4ecc2c6a9b6309b8186ad846379df9d4cc8bd66890e0a0a9b955d4bed5005df9c013b6cba0e908636804fff5488549c66d4861501ed6860908bcf0b0ce48e5a7469150c8526266455176e83db737b0124997e7bda33066ab18860d5388456a9d22f2922d24422dda841cc0f8cea5edbb602d6e6def0819bc82d52be90c09ed43a6c7053d786bb63de6fc6df7bb75d2a17e89997a3f1e20bc75e9dfd9f5e5cb7bc85c5ebaf0332bac34b1e8fe0b697494713ae89b24972d775bbe2339d44e3dbf6d3b42ee193889aa63396551ef383233df1f8b977f49dd5e593f87f6616b5c28fa946f0a1524d915bc4a70a3a339a44890caa31d1defd9b3692b0465cb4e383a54f42e4e7e5db5a9b512dc9607777f18765f5fb06cb61761989a466761d65a58b03471c7f12374f11fae026b2a05a0f690d2cb1773e0b394f6f497c7ef2f43264eca490ccd1753adbd40aa7c7af032d99c78a415757104a64a76894fe41c3b07f3638bb55ce1c1bb176e88dad15d89976037e4c6075b58d6303da7f161a4b88788b40101f74295e6d4215e255232096ecdcc8fc95ca6967efc3b44c9355faefc9183beab47c0060e766bacadf33a15084e3c76cf68ac499dcd0e9e68063317ad0826b38d81761cd2e974e72c9f066b2cabd909adbece945bb4ba43ec9736a5f8b0268d33ec9b85d7f36bc66580816a556b77a08142c471cbe338f2a0d7d43ca88427cd618e758043cfa2dfe2df4976e7c6e61648248c185c96cbf295aebb184312769499b1d5487c94fd78fa62b03c6b074e052e178fd6203173caf15a0c81b7c493ac8629a82b76a13090097075627f1e3310e55cb7dfb7a62e42abccb19b1b368a9161309416782d5fd7ff351985f2747e8d3852410b6c587b827cb8c1db6c1ca812ca625f4e75b545a4a5b6e8d4d05455f079d7758a76a1e930a74a2029240f8dd643a3a41cfa3b9f1695489169c7b7dfa9c2181e73ec0aa6c690fedee73a4459f60fe29b09e1f601f04db2e62be682f9ffb597daf01a01cb34aa0cf3202af1408c99249a60d8283ccacbafc09066311cd87e287bfafcf5bdba87e1a2e256d74cd7da2b05c64695e093985858a4505451106e5a737b13947c6120587272fb44e720254fdad7ea035f149db8d8bc26d986dc8915a94ef78b8ccef82d6df6e5755b518eabc248a255d888614b9dce55d16d09f10334e4af9fb4eea5a04dcecb70bf86f154281102377417b25bd4f0a1fe7e8bed5bbf0e2976e6d75e2b9d28de0a6e9ddfb6583d008a56747e0c4449dd57ee1c9f7540aa98712b9849fc603928dce213b47eb890783b3d2980af999500cd365eb9e88c0252e1f2782876e9e9958a16335c4a85ab0b71018e168d0bc5deb0224912b214042887e1c1032b85f019c5830921fb0c536d2874a8430a33357856b283cd1e07c11c77e738f05cf3b051684241c2a6c2f4c37acfdc798925147cb7b6a6dd7650e50209c8ab2b8dc98ae6013321bef2e5b3686ea13648821b9482cea1942444909208c03390d55d8d8e3812f38ec45d5f45feab791f4efcdf0616858528ad5729d9f0e2b53e3459f1a96fedeb2b95a75a50ff9508c917c8ee5d9fdbf896c42b732c24fe4a119f5bd84d377c459c6f7e26e28d398eff8837ceedc388cba468071b76d168da9a701a1e8137fbbbec401c140ab58b7013608dde523d2bba542ace1083aa56e3a754f3278462db346ec3d2529207d3ad6417dcc49fa2826ed276f644c3ca1645cc1c20f6ea17526f4534264a0466e142412d87684c1496faa49fb93c5b528384634c4c7ba0eae09c7e4ac53dd43ef262ba05dc19a2890e11ba411f38be3c84060c88e6e5a526fc4806b50d9e83da0da31ec0f709826cc77fbd8800f6debb3e9ab454efcd0aa21fc8b586adf1b2ecd3f8e20f4b6b11223be430a29f3a796c1a7ba933fdf3215d5a580598091fe87b680ce8e3c67326a032337003275fb94353d3026938a7437d9c9852b10359da172434f191add52781fa57d7533a8c63868e96f88254f3016c2149b56298b239885b21daab512d4ddcf336b2d7146d6365d8c52f9927ce870a9201bed7e4fa12783db8e932683949bbd33e330d2c222a4a212aa391aed2d85d4b4f8aa66e749305526913d4d172f00002d709ead0dbd811145ccdf38cf67c14c85d44f7719de5f00296a60f7d49e20345c491ff51449dccde23a126bcb37da0ceb10f40d247c16b85b759a0d8c1c033669d4d2086ef34baf44ae6b77058a6f07487339150289e203266ca3e9ba8c614ad53bdd45a1ebb33754010bf4b022d3828340115516595f521fdf3a3898610e210be32d74a9b1e41d1f45039d499dedc0054e660521da03a6f34b823d1ccb627f0365823cdce6ba28e4475ea1e6f46d668a4124c40d02a06813a6979a0618fe1017058548cb5067797dffe891a27cd6bbbd9f0494a2fc29a4e779789ebeb30bb95ad8242f1400e7762ea5e0675786ec6c93f88ae2d5e26b589fc2e4a7ac081f190cd481e6c239431e87c06e8395df7555db0f3eede9e177128f546e28a8651833827059c1d177a99502cfe18873ee3515c4c7f0cf5df8c97cf837752af7a23449e21a229b941c9d502496fa720bac3476d3684951f19e0f0be7ed056be24b75c88b910b30d1aa5969b22c9f2850f2185a14298ee198e7bec613753634ee205c92f9fb40846cdac8d433e4815b6144d3f7a73a0bdc666e31200af442b08bc764ab4ecf6d7ff28b4c59941e945fbd234579b89821f39d0ea3022341be095176f8b846ad2beafedc2ea21ec16a3668268f7b5314838c94823085cfc2b614a28c98ec51fe7f5ccefb7a0527d175e7d8ee630699515274eb685c9cedaa1495911d5fdcc56eb0ef38ad03fa930b5e12b42231ae020fe64a4da6db3dc9dd1b0057392bfa40207770bf6ea11285b754e66932fc85512a122052112cc8406ec7b9b881184adae7dee1e1d3dc125c89c4b96442b0c8ec85897ab35ff934fbd400ad0df93a194ed3fa3d3b5705ca7c7a6235ae45d5a1a09ca7107fa62dca8573aa7d0022655ab3f55f263cd5ca07be9ff50ea02a5d2c039df5808d0b6170f12b45ca1cacc41d2d247d337cffce44dd282488c03b4093dcddab61593996b4f6dfb7d3006ec2bf1a698c0c2a9a84b9773739bfc69e9c13c023101f5236bea89d08a0e1246c21bf3b70edeec677492ded864549dd6d6cef306ad6038e21f10054d6fff5aae66d1bd574ec6748477bc7e1e289d5068dd4fc620ed5a74dca7705cbe63dc9be28c0dfc8c4e17bdd35fc16194f2a0d9444cde8218c9e59512f71e48d6ae794e7e08f118a7123da2c6073e8dafc987e8797f7ed0878f8c9d3f57de9ee419a632289c2bdad7a773a8802c03a95ae5bd12708b970fc24f00474254ee365f58c8680d8602451818e12ac30aeb3e07c837b8e87dcaf55408cea3b87b207f77de91337bcc4409684d0aa9e91d8d2edcfdd9aaaa65f001af1a8a64e46d757bf57340ad263ae7ebf1346c45b84ac5c7f771f6c22c6131d7312f1489a1e3507788ffc704e846218fd8f4d38b962b3c310bdd5bbb80cbf9ad7da3042b1bb0c606cb3a8e3bd59c011cd6ca0b89960bef19fafac5b9f5437d5d4bc56d4fce499a5ce930daa42a88a2868814a083cf0e5129766f1c85d6a5bde28595459d9b08e0952d3bc526679ae3d3485338e370b97900353b97b2e965b70499f2cece4b1f9836b9749490b9bd337d8835dd7ecde468626169dcbe676f51eec690e7b828099f8699076349aa3fbdb9d56cb03e6459f33ddc9e275413a78f94ca3120e911382df6398df3e6748d559fe9b688e758a0c8b86da461ceb2a42701f658cd23ba538c23f2bf03b805f67b526a799b922e027bc9aec720a6ef2355418fc80256a8c4448f88377a04a93adecc521582b6acd00c55121034ace8048de19085f500d5ea1b2114681cb4f9080190ea9f0a078cc8b6fe65d700fe87e3f662d0579356752554f0d77e5551fa20560d1db975b3f3992ff8ede1582a35ad2d44ff31e61738f3227102af8af258aa24b26ac69a0ffce3803b0394c55b583f0b7d6a709439b73ef4ecf4f247cf04ea65c3b599dbc11c309131b8e975d055d615bf827919b37d790ae254c7c8279b44605c73db3f81a0c3a29f9749448a20d6e30f7fc1dab922fb04e6dbf14fd2c099a00a8aa991822235a01a3e87ed0afc3c05e4e054fabbe139b50cbb3666be30330327f8008d277e4df000fd897b26a8ac821f28ee826edb585a168be84ee11404a0368d02ced846aadc6e5d1eb0a161f454aa4e43e244b63ad3f5bbfbcf62f324f94e53b777a710ec63d838393a430853705bf32732d8cec75a19ba0e24cbcb914ce8775ae1feb14b7d4cdc61dfdcb7a2731e046d1cfb31a6ecaf5652c618c3ee6e11d2d31c3aa2b4a6122648f88540d9012247f018e877e7f46c2a177537f54fe817a55616599a8351d07c382988035d9d2cbeeb83708eef45a2bcff414c571600b99a67d866c3d6ae0bd9be7d9e95b749e71c3d12a67ab8018d07163b423a50140054070ad5dc43acbdebb06245c4a7dbdbe15b2521bd3390af93be9bad94245360d4c29b04aee87724524cc93bb54c7073d49f1c272b697e012680b710f95fa32200a0fafd6687e4d1e99619dca2f90386e30754df44d6bd83b0ad73982cda615f768d2adffe8db84dfe46e30d44d99af01ebb5d6d3b60b508275dcfb8a81f0378ee1ab1ae8ec192a7462e553240d69c1ee89bead0dddf79a32f9210020de30c41ed2a58c35eb00a1e23580d19f9ed80774ce00e088f82ebe0e5c7fe4fecbe80e6d25eb975f5d4bcfd9f3f7c5fbe1b42c063bb0a978b10182fdd08413e80fc47645e17ee871f85fd4cb60b8b3b160b04401565ecdd61fd6a11125b95eccfcc1af947d3c79e67c5cc9e672e6b2dc37ef4a211796afb86bacb9bfa3e80d7cadb910e646a32533ffa29a106b8cedcf37c81d730197db7d18768781ab5f7aa365c7661f515d047e901e853b3a814a7d93b137373153c23a60e6d0663b36e19ab03b795b0687f3e457924a7808b6dad95428a9370b7e1cbd7d2893714685656637e5d6b0a370663c96a0d31d0303dd4f311f8a2304b7408fada19b2e223d7dd9f9bf79353d7a8ea30949a83137103b0ae65ce2bf1ea886793f66605ec92ff04bb96b553049e9d0a39b918a0ca87549a9c7d559411174f6709b499d6e9eb9cf1c4a722c3d998278392d04198972d1a4df7b5c8084f2150ec9c961bacff1528a654dc3d71f91ea782fb6d9458a4fa275abc929685d62b831befecd961065e38359025458acebef8e62f7d6b4dce420a9bc8f2239947f907a6d620da84e763e87903961d0aa74a71a26003483f947842f5de5d1d7b0f446e826b842c2f987b8356578d2509f7fe071010f3135c8a4b94909230ee9d33322b9bc1b9629fdad8fb8808bc15d5fe35fab29807e97125c3393904f6fb1424fc46e38425d12eaffcf08053bb769ab1584361c8a5843748f72cc29b07c97c013d40c11b50a41a8f60b60a1e0d857d03d4bd29d5ca540aaf339dff6dc41435a3bd3955857291809452843e69ac3f7d82bbf8ec008b4c0d3f5e88397df48de64d142c54c2c4314a4f1921ceee81c03fd1bed5c89ec829e3aee7d6221832adf12a7b0c6afb09e1c4b95c39a13f92cc022c868aa962d163ebea92c05ede53f13ddcd28e063e99f78f5100cd4d4ed83f295a66402f92a6b4214069b2ca6338cb82905003ffdbc74b3f0c66ae6f098327b92b6853443edae1d95f08e7c9a9d481e33c371cc0ae6eee07112fadb3d73c18b1f3c088940cd67f9d5b01c84e9911688a1fd6b224546770da141405691f6d6db976c993b82ca5fe937ef7638c3bc49e6d810969818ffb3d60b9ab809570707f602ddf5a5a834eb7f95e5d2585a7418a2e51086a2fad8f510a2ce3c848a6e26378a0187b1689b9064273d230789e32a2ffd765c629a95f4b0195d2f6b3024998829a9d65f359dde6e4c61d73a9f19c53ddfc2f95462e969305e6f4cffe85ea9eb5566665f17c096d3f272f28ec0649abe585c3fe88a8febf86fbe9a97fc9f7f709c98278b93e0aeaed22b5757569150cd8327a77d9ef8c28b78fd66a629b8291fbcbffaa0851ef6ac6feff648b710e2e8f3a014e1f11c30eb9dc7cbaf07e7a6c08a53d3b823c9269004748778cc3d2b815b6128add3f2a88c7668e903c52fa15dad13149b8aaa18fe898dc48958e16d82cbb88430f7266be58dd8b05b147752786dcb11911b66ed76da1e10f1e1cd6ac0f6c9921429d340fa2ca3268ceeb5f6e55bd411af127ad9d6f3b8a9275eeab6037dd43f1f91d58f84a83173f57d2e30eac8d9fb859e58749f7f2bdbac83494c5a880c5096f9687feb6e00855d4592bfbb53f9bb40a6c7baa1b502387324f599c69d4f54ee56b5495fc11f0c9471b2d9412345f6355c41ec191af3be9e3f7d768771bc03b791d2f03f82ce667b21fc2eaf2cbcb8d5fa7359b1510f13218429983547a0e6526ab9b3782c15adee6b0e0f46e0df1958a72970193eb3a5e216b19e9e077758df062bbeed0bb9c5c905cce80cbbf879ce64f777b19efbbff868aae2f809574525d6be54e2a4f421839e36406e2bdc8953047de6738e9bcc7d852c0193d25be4df96cc568313522a75419d26a4375cdfddb1d2eab17ca552538d460d646ad537194cf90ed0bf35ce0395511cee513b676ccf0dd290fc015c5515c3b94df024900e345efb194e64890e99437269cde2603e04a5a00ae293e071371e09b7dd7cf8e29e215e67174db1515df528f8e03ba53b6f7a0be613284e24328013615aebd23826faf1d603895946d30603934b7afae56b3121bbf9f3c30032d69860b8930bd4589024e7f48d41b2ba71a034e95c0aa03bd74d31d4b8d2e4d08116f3f7cf435257b4feff04ed764db2a97ab403c7ac19d4ed61dbdc7edb05066cc6195c3108db2f0a5e5bf052d05acc72d51e201b6010b8e7580b0f7a3cb688557b37932c50522fe315e97798e32835a611110c6ed50f97f9a901738dd1d3311ea52bedc6aeb9a2bff87e0b62aafb70b85945b1378bb100e8aaa1cf5fd3937c86788a084a385233ce347bb882a569aab19b139a418fcbfb45c64ee3951af847564a0dbc5c3f55a1ec3c11960a1186ec9c9c72371860745d2afae994f7796da048cc663f62a63b82b250a1fdfde220fa7aaa3de39f26710ef576d728acf205a550456cbe6716130918cc0c434a70495bce0835024f5dea83e315262c33c563ac321ec1bb76ac97fab3920bbc917ada940c57cd657f8b53b3be36b11e4d0423836a3bf53f853c9926614db2ac7be4f826711fbdb55d687f812aeef8d1a2aa93413a24b0860e85ad64c7b3384fc3d75ae4205005c7fc1576b5c9050272c183794c65465bd3cf8772d78b1c3e7309cabdaa6ba30c01430beb879f2d1b39db80392e537ed79083d7adecfe0821a177d23053cf7a0b10b920b3317c0c593dd3149167a8d86ec4a1d774818f27e151062c0faecf39d805c246cd9e8245b7e47fdad7059b9164f04c09dc6109823e95f0b4380978e16ebbc7f77f87e670af98c0c8686cf1fd994a8d8d5d19d06a5e1c640b9a8681e91b390102c623a2dd932d258ca11df2ed4e92ccf615c4452aa85ecbeaad5426eefb1076b876e5b796b4ffec6cc7ff51b0b6c04fbf137fec18d67a1117bee6f749570f5a5f98e399284bca663aebf31e4a67a925dcc60768e80f1374ea42cfb5ab57cbec55120c354bcd5e208d4be707b5d65dd1f0c25c4f4c6dd2c59e891dd372a2900e26adf78609be3817de85ddf5858e99d9e5bf8533e71d459e26905723c5419d74407147dc97eccb68aea216b261b3d033d36f7cd9bcd619fd62c40e5e7e9e36c938a1473b7b1a2bfab4353868e45bf32ff043cfb9f50a31cd939ee04cdfbbb12fb3c09e402d923554947b8f6a2a8d3ef0ee5956185c252091e9ae79722e1e3806afa130a9992b2a49ed3cc070934edd4e2fa0910356f4e3f1d5c09908b945125b2f97b9448753bf2756965c3bf5d28d9e134b2fde876bacc823c64f1f1a86d0db329839e626ceb994cd0432fcbf8e4b29ee5b95a36da1187cba66f1ac3bdeda4e9b1ecc320cd252d4e774099c5f1d41ef4da242757b98c8bc3cac17963ab542c7a6ca1914632269fa56b9ac26b569f730b5219e993056922ba73bd526b5217c0279d55aea3f95a844a8a939eda0dd0522965620697a39cec39227a5e6311b60604a8613c42a6fef4b7ab5775623d48a0b561dab4f8b3eac54b623d4d343740727bff962b9ca04dcd595746165753a7e2cddc5c7ec72c55a75cd75990b91e75e846be1d4d58499108f74d13ee0b49f62663efa632e1451ad2b033b7245b63ae88b608d90ca6d01b0a0d2371a236c88510627a0c2863a94a469416a6325e1a75961071b4fc590e72ca8831ae69424ff7054c8c830294bf89d0b928d153d032f67069e3d396fc2957d8bb906db5c2ecb9f424d6cf0bc984835bfd93060ebaefa84de46d4cf0960f51c679a02dde7321f04fc9e74a2b4750d1f074ec7fc41d246bad6982b40717005a01c33fcc6f69061e980c2f12301974a61e0bf897ea0e4f86b93b61fcee8479118645804a89f08623002a15dda7cce582ba148b7bd7e1ac63091043630d491754f4302944718d84ca7d34efcd7230c11a69c912d0dc7b747e7b8fca53d6da9b5a8eb75c8d87eef2e516e48ebef6ee1e2e3ec185ec39674bcd84d2def71963aaef85a77932928f0cd4a9869ed5e086d520ad6450d2a15a2615bab4ea1ddec10917f3f39b4e0a1dcc95c53a7ee43d5dd957912a3526ddf8718deed2ce85a1bb1eea6d44bd8bc388aaa8eabc4dbdeae147ce0d1ccbe556a290b8e6c3f1712d1dac72e417f56c62f0dafae0439d711d4e8d52757b68e728a1d903e5cf627692a88e716358abb50797201763039818d0a277b1508c3af5dde784a15ccf1804930babe0c8f9070ba22c13ffeb0588f9184928ad0584ef31c06bec81e4ab2f1b4ba1478b01568422d695ea050a2815a7efeae71e4f09178f7025d1b89c109ebedc19a0913b24eb9b072bfee08d891c360b8c8b736504576834fe17245739c4509ec43edb798c9d4d83cb7bb79a555e8410265d22e37fd0d0c1806535226198ac60cdc64df9a8ff96d10bef9a47209ce7e1b24d1727102c5b47d23150d6400177e4ae809d1b4697f536a162610938fe8a1cedb25a3aaf63909ada1df4003a66f1a231c88028351e9dda80843d158f03fd8094a9a79ceab2dff0bb1333a038147a6363945a012a068d3a5a5008a9950e7955d54484f31deb9627c681dc8971ee56400fbf18e29159852b178900007c020683117c5e7ab8576ab1d958812100072dabc0c6efb3c04e20c6dcc11007027350e64d0e59c99d8a3f8edb4af62664ef2db79452064303a903bb03c10f5ea9c672798849b22ccb32e79c73ce6519dc62f8eb462eed6129f0794c4958c8674b757904eec951dde10217830b5c0bb0e91582eea05663a61b027ef9e527aa926559966519a38260f32c881711c37fbc24398898206bf331fcc727a417f8cd18484ea14210869730400c4176e62f0459a105f5e661ca0085e08c7a35cd842096a0e149b686fd053fb079929ff88c800a810a7c40bd9ac601d5d4390e5896e4552b8399cfa837637e7f21541017328977628c31c6189718638c31c6b8c4c111d559e73962bcf126498cc9cbb5473ec2e559d55aa7de20843c1cefbd5c84106ac67defbd630811cad75c3fddabb6f9dd1c84abf622361fcf936ff5e62ef571134dc73f790fe5a44fa62c86794397e26bf722504e72d354494df29bb914972a7bedbee4375d5216e3bc650e3f2e42a631b9c9cfb760087968b298e4a7ca9aef03e1dafd1814a17c1d34519cbbcefb81cd8b18f9d65a6badd99ad719049b17a17936b73aecf1cc61c44ddee67b6f0edc9b6ba8317587cd63d49f7a517554817958729fcaf3f0f4a9ac2f28c2fe611e96bda0300f4b0ea3961af230488e9c1c833788ea2923ecf34479cf36eff3f978cf213c5bf3f7b7412fc8f739c2f67133f35eef062e354d0dcc3cf4658eaac04ce3f3f1ece3fbf4f55476e6b3e9cb2355c6134810c126371f2fc6a530cd1cc3183483c01b203c573933a43a4e633098ee9dbdf7be41db7bef3d8e6aba774e0ec103e9e597d41717b7e631b9c31d13b03918c94d8ad0c19b31ad738e1b4f2c9339b01863cd456099cdc91fc95107cd9e13f34b25c75f30b1a96763fef20d7fc1c478fefe38207f840369cf5778fb3993b224b48ed17bfccb31bb47aeb90eb299672e6207d351ab2434ce2af67d00c9490c59926b92ef4b6674ab1c8c3879387260a2bf1bb234a33883ad9a9ced7d3e47748f90dfbc65cab54e7be0980ff737bfc24d96fc24311ff11e81f330868d399002d8348318521da77c2fef99ef18c7711c65f270bc414bd15406388331d6fac207fc98e358009a66fa9a3febf35d1a0d3e0d1b6eba520d351b6c346880aac7a9cf6b8156401e6a7ee395b237eb355740080674e0808c19683b1180bf42aa7985142883244821d571da411ebea299009a8f6769be506c0af057007f694818f9f1c8a5fa053f6044e9b8a242820636a10947d172d5bad4603c0b88b78c8ad591161daf123808eb3ae1e2d36ed940bc4878b4106b1a710d3c76eb6e17c6296a6f91452bbc400cc35b374d0322ce916bef12fce3d2fdb4071012c5087bb95cf70a79e4ec2ebdb1d6128088d69a7317ee6215a98aac2cd1c130716307e5e5aa2be7850d2aac094d3848540344cc25e3ada540e44426b0f4a26569c95aa2540b01b17c809b148c1f205d743a2400438b694a19d69022d4480fdf8d362be5a629ed5d7b57009ef6aa9592a90cd7da0010e7da18629a131c64568b89316e1bce71492125ca265c66d7a25e06c000f1e675c0d2622c75ed48c46bf1978a2d338390d05c1412a01e9d95c4f1b1c469c854ded3902266534d42ed17b81600442458479756ca977be48edd216841314d77cac65b2410afd8902a2d160acde5e07abab2aa72934cf9483bf144a4688b881995094d265a19a2151b58c965d283a9b4dedaac3603d1ac75600222587b9314dbb316ca5026a7d070fc70a844247c4303f142d969f1098c85ab1e205e2b61ad0444bad6485c4bd4de10a1da4b8689b4676d0f9a0c604aa5dc74d99eb46704c436337d977c79e153f5238a09da4ab65921e15d9d7161ba226576e3c451a4bd4ab00ba0f647ac72ad945a274c0e417311d3e4d50631d818808862095e81b5aa2e97eb969437a37d829f76b05500c4ae556b9b0820c99dd294a5edc168af6040c155bbb710b312e5de417e577993406486e8a3c52419758665429326cab513801cc87505c94df26aad48c48e2324b11e77f7c0a4424f486a3649285fa024d226fbf98d6439a406ea312fe598dd38a696f612e43ea362fe828dfd28f3221b438194a195ddc4d8d34bf80b3636e529fc051bb3e242539d730706641a0c023db74df760b867869a8693aa9987dd03d597730fb3c491bb576badb5d6f7e69d941df61addc137f293e7925fab9e4d29e681a6c16f57d3dc6c29ffe6a11e759c57c88e5af3bc2265b54e900cbc02aeb9d6d1420c704d01d7414ec3f53007612f55909bb794cd4d6c538efc94399c5c730f62b8e69aa71f5c0c503e0197200221d7303cebe1ebfb75d11eb0612f975a72101bc070532d55981f0cbfa14bd92c3442e6e58818cd6fe652360b19650e16b8e6a70595c53818471bddd4a52467f585cc31f04baa9797bc6b9535ffc22e79162ab906726d21c89a41fc86d9f250c5e9b077e0a38483a83198c3a8580c97a15d0be4ecb0970a28a051872a080b681acc2550b19150cd1054550e81ca02f319551be9b7cc810c7ad2a4ed33d74699df70493367758acf013ac894b2697a8132fa65b6bad571dfacc73d96d9dc5c8fbd6dfe3e64f2f469fe419fe5edfd3e60f482d57579fd4300be43ccf11d5eeefb697e9e9a936e65972bc4026e070f5a03d663d8e5ea20840636978b010e98c9431c2273d04160071beacc5eff05ab237b16f833a4c878719263e5442a470f3c1c6e4a9f6245501d9193ba9d4fe2a5276e3d91a5d35579135f44b6d61e254f47a44bf978d132593a6af14274462ce87aba115ed732f732d87ec95992621ff2a4435da930e203089a13171aaf96f461283ad9dc4faf3287f33e75efa4a57f492b21f6725d6b51934ee5489711e48dec28dae836607c8c149f2417d4bbe44cace0b206bd0d5d691aeb6c515464d9557528431e87c79ad384454616520f1237d495c4e9ac44773db6f4382c5c658f64ca112d1749de6b0a08aa5f11ad667c161631b614c1d8c2d3f3bef427b9156b3bcc5c803d0caebfb2a47f15e96d3fd272a0607a212ed61db8135d09cea7f3c8fb2274dfa2ed04da0a14d697a074204c1e0bd58f45f51b3a3a588d9e17ebd1d1d7bd01751c6f25ba97dd6bb97d9995de844a17f37a1dac2d48fa0f210fe549cb8d2c3170a8e851dc847ece2d674a97fe0617a75685ec8ba4fc38e95eac1e85d4b73df070741a4abdc58a332d445d5a767e861729711d2bcbb75579abaf7e65ab3329597188b0f0d18db44c4b3f5a0cb5197d5e5b0f165ee79a7bb0b4c7f640d2ded9585847ebda82f5557d895417a8afd17639a6be95f464471f842d68f561cbe976777f236e6b4dc7d99b8575295dbd08d66755f148a941bdb5dd0ad3c325ad3f477d6d2de89bd6723eca5d545cd95aef715623ecd7baeeb056a12a26524fa088ed7f317524494547c42c416d961ca2bbae13f7576b6c672b4fd889ae8e84f5a56a49ea4b40fd5d3b852929a9131d5561097a1a5872cceeba56dcd4da53394b0beb4e5dbd88f55255cf43ea09d459db83987a8ea4173b5a75d482fa8e5ace53ddbd51dc6ab4e676f653619da7abcf617d54d52b49f523503eda3f6222929a49eb506a1e751457845ec9959d1f82d773eaeade80b0741fb3672f978db07f282b5e586b6d25eb359f11de67392fb360eaa4aab9008f193ce6ab52cad6d8d48c55cacad6d619c21a9b0d192ccdc982f948e96eea42e948e3ada4253d2bfc1769271e8dee7d7fc1d0d89e05e231e8c4e635f3d6a34659cdf198370e8ee5d3ca626d215c5d08c9f10228c7161f4b4b5cd0aa0910d99144b5c545c5d21a2586de28c428ed0728d89a42b8a690b9a045d61599142d8db80ab86baaf511a93093f64593afd6ed02e29205223ed2d3f0430708f128c6d40f122c39019ac5d61bc46cf8ecf0f9c2415b3d6871a4cbe8855813b1754f49a1e275f14417bd35368069e7288f0b1394af95bcdbc12347469a10212ba30b1670be26ec414b4a11855de9c16b2d62d97169a3f621f918a82f771b51156585f9368c9cada9417394d71cc865a4c1ae874614144d84e470ac9ac9cd098955d25793b4351df50a4654f615fe168b623cf9b758c4e2592195ce63b95984f399ff887bd7ae5193c5a1a9a2d095d693df58de1e3af05e15a1f0410d8f7842a9dd0264055a12c546d752ada15e50635479034d42b5dedcdc22ea9140c4426bbc1f58995b9131ba1ceb5e6203eaca8f36264cdc2e14b5deaf1c1a1be27ab6e6c4c1b8eb92dc5cbdba4451426387c7d30fd1caa6435b5d772c4b0f5153d20b255afa6f71284b1787b2f44f05a06c39002e0652ab55a206da93186b3b67504d92e6b8ac58e8f5fabb751128abf8232528464c90138c0eca00496ea657a35c413ebe2014e3e6db0ca623d0dc8f45202fe818644203b4f6317f8b4062cfa6a3d87a65b345f5c3e4f733f563e06ff1c7c61017f04746d9fb41f1337f4ca46507d69d70641a0a863a418fa03c52a0cf0d1d206f01f3eb40a2132dfae8f8ce7cd7f3ad26d2dfdf628f96ff9dd4f7b7d883f6ff946eb2ad94b43a3794845148b1c789460f3ddabfbf451ea52954789b0da0c0149501d66cb0c943a1126fb0a9a9418b3d38e8a512caa42890d7a0323313b43c2ba4322a4bb3a58d96a1d44ada4af9ac87ede072fe2df27ce1cdf826e9fe5be4e9fac9ea298a3c498a3872effb5be4917a98bf451ea7a5b26cd2eb1a9d7a40646c90521dac41018894a6ba03eb9353c48b680405b7765547e63465e62406aa7506649ea1a0608354c699b999667514d22d3d177959ccbcb49d375602817c98e7842b25cd71d4648753f2557946d214c8817fc1f26ea459b47e1dba43d77929d22f5250a1ce690ae479269e1d6e205c7a3e2b147a1e401451139887794895927fc1f0bc9ebd54405d2581ec216113cd718603815de3d5f8b2f400c2579a249e0c128f458997620402f9d0ceee8bdc17b39f8a73263583e6880ff73fdc1fcef47a9cc47ab9505872a17086cf3c4ba28ffee6c0a494e45bc40ee6ac8bc4d4746e11e7e947947978388f39098c29f01ef4783e7b8f3cd629d0ceca2ecdaef8ec5069cc270f2173611626f96c67f5f9812fe4c47f47f508b74bb166ddfb436162d08b41c6ed894d8ceb12046024a1a1a68423056f2d359c98a17507d526c6b696565f9af97c692614b322d9113d3bc471ca649c6578cfa3898d3ca824ea5c135aa6660a020414231800001800437120489218068261eb011400084fdc60885c381ea08b016128100a8481188681180040008042180601188621318a4c7ae0ce24f5ac12bb35d2d0032eb3a5d1284ffa59b70a1b8022ff23cce7872f76f4d7d7df3057bef1e21b32e2195b2f35325b8e3c908c78a37af53671610cd516ff2d53204685bc2448b22d8de407330f282c3209dd17d08b12986bc49f2356280868cec35a46041173961270a767c0c2ab2154be2b2c483e1981acd6d4e694ca37b2839c64914ef8e07832a184ecf992479141a100618edd208d19b0a86b8cd55460bb64bea002848f0c0c75c9bb583cdcf7b9ae3016c26ac9e95204da5eaa200907507ba1f79a12644f819c030af2798104eded1904b6ba32300132038f59099e3f441b11981cfa76ca0de8405f561cb60b2b109030b69fe33db294dfc71739af1fd52dae6812c890a233c11d1add5a470c6d4be7524216ff675ede02dd5a3f1a0f56648445a341c304e4e98dcfe4ad87fb256b8fcef2fc6c5f2f014fa6403d60d5e361e60591308e78905c9d67d7168a4e82c387e6822abf86d1760b942ef60b17350d9a446a21fc4a59e6787d666fee184c0a251d33ffde502e0bbdec5b4bcf134cb93afbe8e5fd7b6c4aeb9c7b9b743847619e14f0fed54e0e9e10e1c71afd166567069c8a279b0742eddefdcbbab7a2c7deba08de36ec5c4604c4cd0dfc21f38b7a9f340745b7c8e3b6c5c153005380d90950203ffc3422307acf2d05885500d0acb7f7f2e21606007caf1f0370dfd508fe97c776cee6c1699d9001b49298fda14ccdd5ba7212bfcb3cfcf0a88901982188efb28f80ddc3ed8a017027eb0720bcd4ae84d2d5f6838bea3528482f0862f1f58c35ecebaa6031d84ef0376b631a68a6c22f8330aacb4c2c57a931d4a22125ec3657449bd56b611c9a1d21e6cf7493e5bcfda509a5a2dfdc565b8cb56697d982aa91377cae47f703e9ffa264e3a8d12dc12bd32c5c19783556711becc020729feabea1a0cd69bad51615d9c2cdd013b970189ff96e2c3265a58c7238f604d677875f36ceeeea163319bc2072aa4f28c67b60afc59253f01e74df27b448eacde10311522839bc32e60cd828e2df161c6588717008fe8e582fa59649ffde84587b277ad58a3354f9acaab5469fa8e400c3862cc527b5c5092ab570b7e1f8ad25e8306dc4dd292c7e220918561bf7f7f9881f6ac07f8ee61a89bf7c4e32027ebc836222bda79d76d531fa556d065e4e6eb7315dff25c7b67da916a43d785caa453ba7f03dd2bdd0a83ea942c3bef7735befee161fb0be9f7ac7cdf6014d2735d5cf98b37eff57a4e0bf8723ea1b22f1fc2c0d9220ea128e6229ee878ac3da6f8cd6f71a288eb65e6894a07f436c2ffb48a561217215ee827b0bc7ef6bc05573341a3e5caf6e2a2ac8761e91b84da01e4534002a44d5ec251d21081994b3b70dce61870ef752ff59602c648389a4bed9eab4ca730f7e652054ff7c922a37d5be4c544d5622ba38458937b09f2809ad7a62a91c4b7d03e874e7583d400649a6f7d94e42d81fe37cf4debc71d0435a4fb7dcf2ec866c0da462690df7a119667eade1b0d9ef359067d15936b4b8d6918ee2f8abbe66023224713b00e2b50622ec34209b000027086fabe2f0b601501448f174e09c2bd30231ac1822eeaab7e458d4138093bf16a67182ccec7066e29acd63f6d8a82b9bcd718bc335e720c0bc25a8fed8f1a09763f82c604a1e0a01109aa243cd793f89bf62a18274c75e73d2e50fcc94ac0858d730ec3fbd624f1bb74ab91a938ca507ecd1423f8104c80cff309d00583f660662340f0a9dda741ed526dd71aa77c88e3c703b37d918f96fd976597d86c4ba980236b0938b2e2239dcd38f70a66134f6e9ac4252ecdd77fb1a3aa34b15ebdfded585fbfce54ecdd15a567099e1882e1b8eaa80342792b5a458752778ed1926c55e0ea10340489e8d304e18e901c4d75ef6d58927e8c0c59b90468004e291dc1f2ddb116f3cc5cf03b79381b691128bf15004eeda6758d96b3bbef3013ffd3e31d6c4fa4693e5b5a65294fd05c007814cc6a0eba54ecf71f46d9f5e48b96bdd62d122ceed2fff7d02f89ee096cfa09d2ae182bda7f83c16d4aba93509cb3c921ea5f10e9939c3b9c9e5f45e9a8609a5180bfa6c5f9b4f99323bf8ed2bdc9baa93587551cfc471743a09b3c75c288944ae06455bc06d50d48918e4a3fddcb5f70113df8e2e6ff0e928694ba09a3a2638e73cdf32e384e486eb862dc891c0e154715669479723dde22ca39a3c7f2c49534de2c4d79b64bbc90613e23f35121d4fe1ab5016fa83790fe97c21275c726dea14da9dc6d4b19ce36837180c188d8e66849c890ca4e14c316f2923d77e736bb34fbbf058cb621cfa183eb984f21047299c9d01b8438425cd69e327aee62a8bd0026a43a53e27a66608952109be2ccd5fdb6c9881d99b2219eeb543129887fcdb6c21d912e662c73f037b69c148fa86750159efa7138337359bb4c19a8a216bdb80245b84af0a2150cfe77c4633de000e20a6dcf8c90089b93ce565511e4319583954eeb3bc5c43ded61c0d9c9dfd5f4f72247b23bb3ba50ed3e12bf45ba338097ab1e4c29ab8c86c2822bb74375fee1e385be6f68c8e4717248a963c4b7ef65500ce242d475fc962283d2db5ba8d8e847dbb044276db071f1c4bab23fce27f8e17b8512dbba8a62c5388c923d96a27a22495af568e680c6e8f9a4a7dcdd0b4a6b2308ccde357d49a1cfd5e37349b2834e9c1c58791c8f84ba6a73e9738a326a9087a5cb2a1e8949b7d1cd86491709256ad588dcdf0664d4227768a962d47735a98ddebe32fdc045eab530449bc327e3b427a8d84f9eae935dde7451b9b71bbe9ccc6f25081315c356569b3f7f74e36f1f31f3e2c21f9f63db43f3cd4f6d03b7bcf5ffb5cddadb0c71a5fe221bc4d905d1a680c93ea991a547d65e1131ba94dd15fa34c6e004fb5e4269b07b86db54efd0d0ca189d2cc4274f837bf86fd1677695d7e9e40bef12039fa14a98ebe601fc5ece644298fa82dc765e74397508e8c750a20adb6b5c5c030aa8680dff5030be1debdabaf9dee419654108ca5e4761a1d251d788c21ccdcb574da99319d8d6b12bb5912f36e56226b4308189c832424ad4f010c9f591bdf36f9e3b13348fb90827c84c531e802fa7c2b04b15f471243966cbc5b805cb25e0ba1c33f52be60618e4c11ba6dcb855d68cc512a03757cd73437bb6f59df5f4bbc75ad1ac28939ada757a0fbaadd8f6041e8b5eddc63ceae1bb6c48562d9a9c145a0bf0b6cb040d28ce2ee6191334f0395dd9d60ef5668f8986171d5dfc4223c94b63f04d8dfc81cfca561894b3e7e3d9ddb5b13c9a73361b44e1c56db4a39734a1b7bee0ac2ffbe02a34e0209322c8a66447c69b7d399b889f0f3948b685e1abb1601bfa7ff6948206924f319c23e5724a9efa5f9e3b51c7a5412cf8c18a75c40506706509fad72bf5a7b0a722c550247d285391725c41555a73668566c39ef0d88628c48e1589f92488e95410ca9286f4151be04b6b04d56917a8318a1d4a068d669167c41a748c3b49baf50c3a759001629340a7ccc0c1b9a0833b562fe5417d58a216b5d12a09b3437f56684a4573a03df1b4187e7d34fb9b5ff62966fe1f7d39dff17fd96d45eb4af2492af20fd21085f0edba0b71c74b52c9f60d8770af87162cf11674e614cc534e6629aeea69542f2143ac8c844789835311e5ad79fad3547dba15197e2b17569c44508713a129cdd945cd54c96ea478438d05704f8197c67274244d884095d0515450aad017a5391e14980bb5e734d73a52179445beb088f3f4328ff44ac69fd4f68fcd93f4ed0086db4f82ac2f07e8b97f799ed6b639b09a275849344cd5ea320747a0c77f2b56e81151b04ad9e1dd502df8be79be0ee473bda5e9a1cbad3201417f3383c2b4083304248cd8a7a24e52831d96eada8b8a2724d9bed771590f530b064d485b823d8c77694c3c9340b247b1998878e4cd17c15fd4ba2304082d5e5187626c811526dd081743c87aa796e3423a4c35b007528c436eb3c1599ceb88b6915874d023c2a5280c3ca6ea62771813b81c9e2752defab834c1996765530cd93ae489c886bc58c728f012981d4d9b4dd908234494a3db126df7692f29ccb83ea324a9f46d92f8b306466b02cbb3cb8eebe51b7c5b3845c373de7cee0c1ba5212adb641f6d2e86a5f67ea3ef46860ca36723ca7bcb77df4ff479d72f23d58709c6d5111a82a0448563b45823d8fd35fac73ae9eb163dd39cde16e51981db546a5082d7df94915e80801eddf56af35520318ab505591c9d1e1722775e5f64bd84013dd2345967156f6de5725ae026faa8a82648d18ac0f5b0bd3949c1add9f82182724dca8aab2c5bb13293cc582028542eb94c483dd8ad34b76d7a84a9406fb8a6d422b584a3f299302e9cfa52d1bb55068fd5f4b90722817a0ccf2d9792423caec44686f6d2b18ef725d31815cf28998028fc2c953d514e5014574142eb3bbd1944bb15220296bca20854931a53ca1ec29b2504c0a3de7c1eca552f6db4da94850b85c7727a997a2e569d530e54f415078e4e9eee24bb328be28e828e351bc4fe962dd1924d54fa945b3d32511a0bcf8bb8f3a4699e589a7c350b8dcec72a979a6c0b0760da982121a85f494f18a77a5b4a7e429f014378a75943f949490910bc67e0390077276bd93038c10a6b8907628915e08f4fd0e397652e0097766e2a568a31050a80fada628f40b39d4e4c9e0429d607834f52a0a97e42e298552b44b095edaaeb2b4e5bb1ba5c3a604cfb6c3942785453983a26e8ad0f53bb502e0e78211342b84053b53f1be5ff6dba6a98425b6ab4d4d0522c4cccd2b2b6b68a19b430d79c724bc3a38d0b5a157cc7d61908259edfeab129b778a02a0f43b0f2dc0a983a0eddea2c403ee6894824252c628ac4be172dd9521bdf076035529cbef764d2fd2ddad7e53ba3c554da2b4fbc49a5a9a8279de49a524e5028a3f0a8a32d60e220c0611970f30893ff1a14b024b398b6bc7272a451e651914c4a6dd6dfaa13c9f628b75679a90979278bb8b9af422d8f5a9dcc9df414e580a25e54121f458fadd4b0faf4d2caac56e58369eab2ea45daa229c92b86fb75c7aa9ef561510a59d14c5a81dae3c29ed2866511e94a2779d5be2828d8966f18a5462a268a30011854b6fd793aa9492a5e880bd63244a4d7037b01be72268c2ed74cb0b51b6a83bf3a617d36e51c19447147494488a1a8a3025da1498f34e6f8a8b7f8726e905b9eb45d532dd5d52fe515eb8bb515517c9ce32913f6507dd1d28ea2c523b5bf9533894ab00dd13daf1cd5ade95eee72b3e4b2fcc5d44e5f0d6492550b8bcbbb7a9d92930b45da9b48792e3a1a700a170e1ef3a535429b6c8ee589c5eb2bb6f9562ea0e53ea9b620bfbce58c585baab2cbd7c773a525d303b96448b72417e36bd8dd74ae8b01d5d29505094310a8f1256f60be23e5087452a798a0efc9d375103cacb7c275679ca85225020bc4d9c8a1f73d2349a1a103cf710587551ecbc9231cacd536c69dfa126bd5077b9fa8eb24c4a17d3ee563f94ee30e516fe88f02ae030f713621a153cfb4e4f82281eca22282fe2dd442529d7507c509214d1287c2897943f45d0942ee3ddb44aa058a6782929ca3845f894f1e8fa8fe9561853e09576890ae595939e92a1c0373ae8eb722a44715976df74664a2db3dd587d060f719ba29277549ed09bb201eb84898904d8c1224b9478d19a72205f3a1aa003b13fd367210701a4c5578a59e3bf0cf2bcd85043aa0cf0b246bed22abcf482b8eb55c1487757faff50b8c59891213f9b8257224156ed465a09f126e02df290caaf14dcd1928a8242a911ef459a9233c16679149f3d9f215c686dd69c81243a9a3578e8e792e956c93482260128aa57a561c472a0913f51cae7c0e26091c608179f75431ab764e271b1144486a88c66e8ed72f62e2e4e9cc2bb9f42e385346492d9a0753735af8420b487efcb13f3a5d16893e0b01c646585368c576ea4e453a30b9f84d1728fdcb21dd3b24db4f817e10215238429db25c826fc7a1dbeb200b69b90e0fb80428c712c0fcbd728bd7c2dfe2b6bd549350bcaceca52e43882623e4c75520380b32c260c95c1098aacce3906f29980a8140a1f948c94f7307ce36fd1981af6f8a145998ca98c2d30ea16d93cd44960a528f35d0626ac07f4db416725d10e6fe624227dfd919549e6a3ec708e52fb59b0f001eb6f9b41833c1f8bb6516da5328c071e2dbfd4229a31bbd5f6b2302bc1cdb4a481d58000dbc9f5c0ad3936463d6d6807367d3c9b9659d3d7f6086caa42c25b24c1dbaac329946400b5254ad577f86baf1c27cec28160175786c46bed36b940e10a90d1fd0b72b4bbd1b278480ba79480091960de8018f2f0131fc9045c55c28900f6e451f8ba2247117eca4614983957b9d44bbd1b62574d34022e30cae090423e5ad222d9094432a0262af96f2388e70b09b9140397cd4163dbf28167a02fb6f2c0ea47e3481716a990dbe4b04e7cd298511180152361900bb2d4ee663d1edb917acf99c2f208d1a03e55057e5a87d4497b117df2b40cc718277b4e1521c607cbcf5c78b4dc6f34ef66135c5419c2f4f7a71224c27b325f7df2fc355f25a2140581f8f5ec0f7b0f1245eb2d8d64f9814660b2acc3418b99151e4954f6ad29e195484b543a0b7d1af8ebb4a724e6a183ed926bb315a652a4bbff5c2fd822f7b2f7b705ce1c6dcea1fd552ae5c0471f33c22a871041c711883d6db476882fd399956522c8f2049a0e947c84d7fb1cd5eb976e4447715047022a8a0f8e5425884f31f98fa66265ae33a24d68c60268e314ee754d0ba344802ce8b2dcd6804985ec61f9129d25c2456da42b8877266ddef92647c8b81c8494458c104d546776ac82f0fbffb5ec2b66d30cbda6a566b5804c837020444e5b2583c0493428926e2f65849e1c529b31b54e9073bf20b976483f188506a513373f4467996be5d099d84c83ec3cde2444549342078b336131884bd2288d9108cd75cea58fc483b42c1912f13bc672076596d1fff2d68c4e0fe9fe9088bf5730453fdea1b38e251a45cbe9d534c8427c2c35868b53f15cbfc8320e09f84ab0caaed8305e99b3f46596ad246ace2edb0be13239a677cd268d85a2cc2000ba00d90463d95f5ccb6c840ad3068ae142cdc27b185abd6aa6a1df0fca656d817fdf89c90438e6d5d9520f698a4bdb449c7d7411869cfcebd1b73d2c18cccb08cb62b27a078bcb935b8d74412382156a2ac18f31002ebd161e579a793bc6a978b85073dda6a494fe261ad81eef04872f8214508ff8048174aa46f5ed353e67e66872216b406966baac09c89c02f3bea2d42256073d64f93b575d3f2504f0ee239e0d0bc8e52a80c4f53f971b638087cf3c6f15894335638a21dc6f24ec1988e19e107196692b0d38284e74afe0bfd599a459ebb9c820283d46be0c954c18735420c22503c779bd750611bde1bc9b840814838265550290cf77edf46d60a3266184fc030219ca11e952dd4488081de65f7a76ff17c472f001ae0db2e94c494c7ea926ff04f8a1060cf30d7270a83de3c82dcb0565ed0177ddac376c46f00aa091194cf8bc76b4384676499166f3aa01c11261658fbc4ba0e327e0574441adb2ca76494372c8dc506badcc1b1449cb9e074e61faf3784b72010215c3d4353a9c2317e1639ef6c4ab21e918698563ad3de9d62220a03e32c1156f746a34b8ab1438a2ce9516b1263cf5b63e8eabd317865567374c4aefa193723560b392ac236c0d9f86563b240023db4b61f201206042b7ca3d78438720599c4a865b058b09bc23d19b169ecacc40685e4d4411480bf2f71d9d93077e1568a4e3285899046411b784850f8405afb02061588dd25616711adc699e0ee2428d19a58de1861e7f326611850a95fc1c372b84529766eecf3a80a034d42a355c8a81f464dc120db93311f884a2005218e39fad820d70fdc46f4becca50f5f57ab47d10272b3b86cedb5febfc18e7c6bd319d5cc8ede88061b60506447aa31acb24bb106ebcf158656f8536284580550bb5e48f0c46664cc079e978de972002db7a32f44b8e0cdd4091bd2c6542194ad0334fd8f050c76569dd43a4192626a3e47248c918d7f78ed727fa7c384f91ac1348301861b81f8e850ed6098e27fa39a96e8200261de0340520ce5b2ed60475ef6838eb9745ce31b0d6931104a7588a14c73aee75bf1deaef505bf203bde953c15232f94089e708fc97e1d040d01ec9b2bbe8d5396c61b1eec61d7502bfadc2e2da47da42cde98f8032c70c06d682c56e6a344da820547a578a6aae8ee3a5b0371d561dc2a25c7b378e0b72cbe0551b996217e9989e8a376b92d73d3465257bafab9c2d1959c7763fb638df2729f7834eaccd617d4eda1f2f0b0c83d27eb6369683bbc428c5fba22f9a297026d737d321db9026a133d4bd64ad14078c7630387e8064660d472d263ebf6c34171528bf9e3a27851e07c89c8386d251a8a22e1a1e76e86e27839b986ac0b4982ce0e15e9d5fffa9d8246ccfce3218e11e5aa250f36720900bd7659bbd7f953664469415cfc132c8b6cd4868d33e4d9e4d1846481ae01933ce20e19c73c2a64c3b269986dbda3252bb93e9a89e974a5526d8746d1c3683dad5850121a50570f03607c11c25d367726293c40d8fa82a659e3b25bf45d6b84a3fd6460eeb87ee81b6ea5d1d213016d2625fb4e02d4a29d919329b4c4d3089371f23a109fbd0d054cfc7d7bed5d61ed8b738a0263b18c46264b1258f87d23828cf835dec2c5c1c214a1ee327d3abdd89430a0555a0d503eaa9b5d1940897cf1c70f14901c05df0081b9509ac5619c0af0ac88b3eb0af0c984e419ade5a483f660fe638129ae154619fb40a59a82162a29dcfcbdb0bf413b85629cb8de7f29807a64ba51768c5e75c9268e5651eb973bdf68945da4c2c5f1e43f148aeab47367134a1503b5c7377253a49764037a0321228b4018544b466ae2f2fe4ae41e502c9459729e0a5b8fd5226ca3c2c3c898fb29d1b4cfa47c32bc4bf62c6788f890ec2176576c3ca2c55448057396017a180236811473323425db76913584e8d4595bf79aab5779589b0617619b801f79922ee629fb0b331f9cc80aa83b7895a9546f39dc5ef4818e36c8a9845190922a04314a00028c2da393813b28138eda85c7bfb5f96d7b8c0ed2e022ae6a95f8cd5486a5f835798a0c50d36179e90dec0d21c7b1ca599d93f7bcb8bba3989c84d162f03e26c4623336a3cc93471c53fef35f2c2c1d9e82dc4b5f8ceb6f4019cd3b476592d50915a2c5f1db284141ff6bcd220a47de233d819af467db585aea281eb2e470ddd60dd97d00bf8a6552e5a172c9615cba160f3b1a3e8a2a44591fd228c3dc1dd3eebaaa8dd9614c2bc93f0099ec9e28c4f914f262e9b12dfddb2c80a0de58ff8e38627339f84d28cd2d248f5823fcbb03462a0731d3b0d78fbbe76483038095185babdadae5befa0162275387247fefb93da301fde7d1f233edabcad24d605dcc48f9b611fef1bfc350fd0436596641e58d1ff23ca6ac36611faf03d02f006a16d2dcef2991af2b4f0c6c82461e5c62aa83158cfe52c3185865af025f28bd046250334218e5ad8f327d52a94301eb5f7da35ef9a8a2374196233edac50f235356e00f830113e0fd7290204ce10e474d82741e13031367fdef02d7e179c63fe9d3c2101ab099009903192b8d3860375ccf1f44cbc315612a9cffc9d5354300873f53db3774bcf7f5d02d9befe62a0d1f7c5ddf902151a223a264cd63f3b821528eef8a6736e6fae89f8ddf0b71ff22e92c570d996d9f261f8da6d12e408dfe7443dce6c2e14a54717bd1b5a343d2199822b032e249f0fe54203ad773ec0bec130291d617fcc7e17743d01c8d942940e3107bd404ebe86545b0831a37831d5b2cdc88701260d56204bc7b9fc290b348ec9c87b2ac33c00c911dc4fa9df259a9d429743bb489cb53d0989171ae3a960b86acc5cdfb79c19de396febc07c5bf9d586b2fb45e7b84b1ac6a8588ecba7698b1a735d93b51ffacfe5b4eda75dee165e6efbce71fb712ff8f1bb0ca036ad68689a19d987d0b55f88e7c30f765207f012c2cbb9129064d2d211cca35c63ead81af66aa21728709570c1f68220e245cbf71e8167b95ab7b5f961260c93ff7e56868fb54988d6b481e250d81c391fdd1fee4a444b93e801f2ced5c6c7063c45579a6657c668d3b253b4701fb1c2cfaf3255aa6859fa5edc760e4a5c45e0da48449802bafd456a5b404ea94d076a6bdaf8a19ad2f334e1c6d22b4ef8d462381e6a211d2712bce6e097466dae013d6941711894c285d9e51bb538964395e7a0248c49c731f2db4682c6cdd0693ed76051d8bc2de63c93a3b197b4bdf7de524a2953923277072606420636998deaa9f13882d62a1e6de2dc7844d2e09e4106df589445d23992f8f6d7429066105f5b7f3a28abba035bf319016ebabf36b659504f58c764c2aa6df646a9adeed773e639ebd7b18e36baff493dd34c323d6a3afa3880d4335d82ac95908d36dbdd48773f0d6d737f1a74acadd7dcdd7776d6e157dcd4ffffff365cbfc937d953d75a6bb5a3eddaaf4db5b5d6daec75a74da7bef7e2d15631c679b4fd0ecb222e64aeb5222e9f0ec12cbb9dd8f7661dd67c46ec7bc3190d478835240fbbfeec9f3dc72313481e76d61eae87204cebd69e3af4bb9f05f544e8628a9083abad9e988312b7963f3fd0d8a6a3cd4783b9bd66eb42ea7da33eba7effff7f3ab3cc351dd3feb670bfb6859bee7046c7f61c6de10e2954383d9c6ec64b8b87030b8a121e0e281e8e259e930cbc272cded3d59ebca726dbf7e43d7df024e4e9eb898b97638b97038b87c3052f4715b7d65aabf3207c762f37e94dd514302823f0e041746500a255a38d943463d28d213855d4c907adde7b838d95b5d68a19851c5221e88874b970a1c313932164689830c6c6589691b0c28427bd2e164f4c3ca57961b7c4248cd80c372b93e006ce05291e5c41c94074a3a8e061c2122d224bc43737b270ac2eafc68b18d6d6587183f896c76ca2cc7098efa376cdcc82c15cdea3505d4547986ac1889696334e5f886ed6141242f8c1e58d0d3121bc171ee3aba49d92ebac79924e7e2bcc7befbdefb484365f883af3828785088fa6d20d9b1a595650d302860c01a000004246ea7994a1510c529410058631bd28b905f43ec0598569d3068d1b1b5c70b00b68f6bd4966be2590f212a685554e460e0a984085c98513743c1e6d66e874d5092139d8dc68c2fbe226c9dc9aa105107446a69eb4c2462016022b82b461f1638753da00050a4a49316c94a0d4821b397032f9a18031c6387be6b2d65a31bf58925a5a1103d716364b615858c1c5638b129165b3adb5336badb5782ec9060013752477038d17302478709d691384098b4a0c334ea8bc134f5648391256c54d182c44b603534f23e470523283099115c1b6f5ac9bf518e3e70292c34a0a58aea8004684c10051214d138dac1a4c88f09a8d7194d91ce1842b354d6d947a2031419225389cb0e8a6c810610a66638c03579e632006165e4b56e8e1569c6891c3123305c90c27b080c18617afc90b8c616dd39608f53f16264c48902c50ba9821ba54a238d162848a690c0d73e38510c83b960486b469e1440ad5149b3946494c095c5452519cd4d0987a1a516636ae6455c142e44a9514882cd5d7d218375ac44ca9d0731a38700de2f3ab78ae959fd06511dbc1300390255e227a78c0424a962c245d2a152725d1a152e082054a170a4c6388ee8e14438c000183e545489a1a5a0000e4bbf7de5caf0b0fe491384922010a9aabb10ea8f01283428b095247d0d86083634546ea79f470ed40f385079b0f783c4de95a800232029add99af0c89f1054c6772615cb810d2e604164818db32038624666e848063452def85c7c06c68344992ac302fc0acc92a4274c17620a142e3ca969617645ed6851b16eac91d4ed8a85053c66a0622bb020d8d2b1e4e6048c95186c645a7469b20253c919245ca091d0b52a23461f1d56604aac268459b727fe48756551815b2ce2099c1e4051437764b4a5210bf6ee070804c11ee5c0aefbd37d77befbd36097d40112554643e40a10b1ba2ab7560b8bcd8e8c1234b6c21c8bdf7e6ea80aa3162ce603913660cd135c1480e8b0a6abe0c497a35369c6456eed95a6bf3bdf7e63a032aa7430a13197a41769c388581e0c548921944166ac010004bde2bd65a6badb556cc29dc9470a40c94342b8c1059ad1528aa58d1d0b9b1513758686a61adbd21a6325d7a6fc6e05a31af0961861e329eb27011d934633d1464a27e7860456686d4cfe0914fe49444f8200a084b5218a3802860664270c3c535e625e30d6e62437327f73631dd592f391f631263f1801b312e64c86205aa843650603a2a597c40d1c261f52d7df84a1628142a5c4c8de520f2b2458510aa58ace0835a395d11e9d10f9d8e375d6ad8d04a011819b800191b1215c3984c2b90cf31a105194458e1890b3644370ac8d4901820b4a052939c5e885511d84aa346850fa82ca513503e3803c392d396315f65825cec578c18fcf71e91511b225c0d33a0deeaafb842190c84be29836489120a5072444e20a50d161317aa2a3fc42e1b247c95842d6aa414896205042a770b5499332b4459790ad373fcc58a181b5838a094105d15455a7023564404152ae854d90b664805b22404324bcc00c399319c8d314688ae18345d9ca658e1c244ead9cc181bdf49cc2c77f0a66bea4a9797274c2cbcf0ba6861f203090b5c5f6456d42bc9470b30c8ac40660bd1bde20223c4051c2b5ca56045de8c18594a4e09901b5e5688e93891ebc2064d0bacaeecd42ce932c318638c31c61863abd3435a5cf3243f20b635054a4d96226e88706fc9571919b92b5231d42234de6c9c8930d6212b141f5f7cd932864893ae235ddea871a1d482109872882834e9d0b1a2022041abcc0d2b4fcc440131c66acb042a0fa6926cd17031d62f4786e85003c68a1b28376076230ca9d19352977834b0422b3a64042d27fcf8b122c609584458b3b58407d80b36ea937bbf6a06395c6c9f3d793980e4809211563d27a59eb3571badd5a9767ab8398473d657dbd0abacdf629bfa5f491baf3e040d67a48d9666adbed17a1f58f9f5fca7ce12bbd6b67dffa0ed12f32930b05eaf36e568ed5d60b45570b4d9d0e2717ca763799b5ee1f512b1388e36fbcdea6cf64e67b7691c6d79b47d33fbe52ab3d10692a32d0ced98537372de690e0846137172469bfd34540d1adea9865d064e9533da645433514783f5299ab843d3f1541e9e77cae360603d4fea55c9da65ed6813cdd1a9deecea5dc0964894c483d8f4671d497cbb5bef7da7d7daa8fb578b2bc6ef14fbd76a6fae39bfd35c2d16efc5f90b6b18bed350c4f9fb421104c351945599ec9dcac0501465e238ca662239da6ca5551aed9dd264e22823c5d98c246939383a5547e79deaf4e46ca896c368a3735c40b823fad46a3bec74e8f04e3bd070c49c31a766426744d21949fcf3ec8c24be6d6b26c89edad3f34e7bb2cc67c4576b1cb26ccdb67a624c5f76c36363632fec2f47ac395ef9cf88e53fe3d515ad8793e4429bd603a385d1c4acbd9a43d7ce396b9d462190f53198ff78cf7f5cd7da17e63f3b629bedb4b02b1acdb59ddbd7a3f5c4de0c72ab7762150fe15abff44b6262606066cc78796de7e2dab7af97d5dbaeddc6fd6ab3767a1a447dc15db766cba2abcb772debffcc54e6c4b2c82588c3355993596e96fb1035e7f3abf5b25dd6cb76b19841ae411ce8e44237cb623bce851ecc814d2ec4620e4d717f75134e0c6e39bded3ac4d52673e8ea69b5b64a36eb6b6395c0ab907ad8e0d58790853d906bc7656dffaf3bda58ed9b2c4cd6bbb59c29aa6fb2de27cda01afb713388be05b11cc8b583578fe53fe05596d10ebcdaae67492ed4039385c9c46cd6d79c9e2ef41931b5d5b639e2b5d5b6d7569fd894babf28bef51afd11a9ce775a6d687bfebfcfead03a9dd973b659137cd856bf3bb5e468cb75b4556d6b3983ec68bb253e9d35aecdffee68b327361e6d75cefc8120187e1f5802ebab39c03511221ee8036dd8d31396c0d78adf67ad06c711ae6d686badd6abade51944f537dae60cc1b1e400539124c59103acaf3896c0b5fc40741c3598dbeaafb5563ab3ac8eb63a2285bb9ab085bbea2fe958b86d2d1c6df46d7944fac271e61194d91a58825d9d6c1186b3f06aa4bbe70cc27a166d2171ed6675dbb5871a6b30f767a363bb030ace39e79c21fd9a6c774d29a594dab07f6d77edeeeeb8cc4e5fff76b4595ce22b77aaf58eb66a5d5b7b6fd76a86d58ab6c8d1e6b82cda22b3fea888471278628cb5a8f316ad76fde0d676240f239207b0760371dbedd6f61a2ead4ec0dfad5d6b28c8da21b0ba907e5aa688a0654532dad5fa3f346b06207e0d4e81424027d0ca4ad91b42a690a531ada46c94d561a1ec93cd3187b0766d71cca16c6f80bab7366c0ddb6469d8195686cdcd211ced3ad0c952d91fdbb59db276d3369dbf3f70538d4159398aa493ff5b4349b5cedd54e794b4d2375906c946b19c3308fc4c40eeab7169829e7d6b553c350d9bf26caa69b300f4f2943b656dcea0bbbf295fee6bdf0ed4e5f6cf03510d36d90eee3e5d3831b8cda6ac684561cf792367b9d9d3fc99e184664efeb353823126906b9e125c31815ccf9ea6109862feb8930b8149fe130384318766da35f8620e91da35e8620ed1b46bb0c51cc2d1ae410fe6508e760db298433ada35889b431ab46b70c50cf7216cd203a99843a1760d32cd2151bb0697e6d0a85d8329401473e8d3ae412530690edd19aee900b80c8876f40db4b15d833947c04e69c3903c7a5656e14410f1681a4ead4a83d53aa509c86d754e69829e6d6b553c35fb6502d92ff3c7bbcc1fdfb15edbb58a0c88e624c0cdb2b05ddb2e2f806b9b9437b5491a4abb35835ceb941605cbb329d04acb459616ccacb42ac84a1ba68ea5d5124beba5b427cc20d7b6b45f669097366b06b9064bbb6506b9fe4acb6506b9cea5ed32835c8717cb304f69bf4c20d73ba50d33815ce35a98496ebdcdfa1074d25a7ad849d33fa9a7076bbde7be619f73961bd7e8d4b26fb223db359894b565373069bbd5a67a36154e095d87b3d9d3e3fe7daffdb5177191b7ba5dd37d62d3f1c8699bbaae913368068d361d773da2d6caaf953eda70b2c69a09f47140d65897c818ace5af967fb4d16c7404add11944f5ac9122ac6dc6412e916b22443cd0cd01b7cb64d4c2a885518b0b26e75fdfd66aadbdf71e19ad305a61b4a2d7dbed8e8c5690e302f0cc329f116b2c94d0480599d53445a33763b765d05cae2b068c3db5918a9967bd705ac38c70d48a53577aad0cd758e0422bda32bc62aea52daf80a0cc6704d842cce3d1534abfcea13a837a6a28e67ac55cab58b1a8a3d30183106268cbf045d97874479dabd359abcc66b1bad0078e101ebd397ae355384d6435d55eabb240fee39118ce20d7b59262fd7f525443ea4d10a918a4c8f490ea022105464acb93282c512248ed723ef242c7938b2a595a30ad494187581210a418c97d5413d86a730294a719407841847ff080526346992d476260ac24861421fcca18e314c817c828284aa2a8a072ce6c48126aa7c32b4a4907988f49b30d69ca9c36ceb3406ccff9c3c23cecc7c31ec48718b592b8705e39334e7b04dbae47b1ede1928d223416b76fb6f7f3abec352e41310702c3a29037db03c55ce8d603b3612e54fd47acb2a4aff0dddddffda9cd47b88ece4c9cff5ff319018254d3bf3308ff632b8a397ff5f3fd07ff45d1dad236f7ebaff9f86b7f6db323ac769f11af6df3f18894475bfbc229e1bd187f1fc6df877fee7854a486f42235e4ed71ee3a0df9d56eaf0b439fac73a83f1d726d8cf5f7e970ce39e70c69d8c658534a29a57eb531d6eeeefe59a7afffaf18eb5aab6db231d6d65e8cf51dbfaf2c62438e5af685b550e71d86dfa765e5ede7f65b1b6b1f6da316f58f23c6bbb5b1167108e26bb5eb4d05593b04afdb3fcb708aaef5288ad5edac5d9326c25c28cc855c2c2fb968d2504eb5a788217bce9dd3bdf7ff0a99427fad5ce8ffffffffff3a7d88fbfffffff7febfbdd75a6b2bded57a39906b2ba697ae8bedfa366dd737114835dbe53f5e8486bcfd7cee8269c49f39a0fe68eb7192242dfd5a2b526dc0125338138bc2bed1d685ac3a8fb6d10686dffca87fb5177f32ab6d96f075d119927ec5f94fd11972cb7faebe79568f524a71ef6be7ee5eb57fedfeff6b77542bcd1d594b715d477fef78f45f16c14062bc3112d6b9e693f71fd9ba9054571bade5470ac2b5e9618f43b2516b362dd23f29a1b7a16e2b8a7d6b75ff409074b12fa5d3837df5a7b3660a35a8bdc49743d059ecabbfd61984d319abd6a0d65aeb0a0e3e9db51d4bdcb132c04edba5148f558f1acc5d6b3e5883a0365f2f6d706b3e23aa891a7ea38d92c8bbe68f7e32abf1f519f1b1a09eb8fea509ab4fd520a8d9ba90e209ea5f7dbfb621bd4ca20e657ad42564a318628c31c6dace39e7dce0044949492f760641b67521ef6d007ee557eeeedffbffaf5ff4abd66a9bd026d65e8aa3b88b6f73ab47567d7508e6eff6f365fd5d0dea0face97c4b0fc3f873514b3831b8d95e960b4d4d77e8a29806eb31e3e5aee521e61c1ac0ad1c6c5a56dfd26a9fd47fcff1abbd78cf11e76fcff1034371cf511cf71c47d98ca4ed39d270f61c7172f61c7374f61c7534ec396ad8d973dce1d973e4e9d973ecd9b0e7b881c39e23079f3d479f0e7b8e1d2ed873bcc0c39ea3870f7b8e1f6690768d95b5fc3600eff90f5818add99dffb8469a41ce206a7bb74818ce6879732dad1169da49e7d3f07dbecff759dffda77eff5d0637103e917cdae9f3abdff74ebfe975319e3e6fd327e6fcf9fcbee933570145310cc3394e9f1a0423f1e33867d3a716455ace44998c6a36f56cd2683ee9f4a9c1c07a9ed4ab92b5cbdad1269aa3533447bd7ab3ab77010a62cf7f3a2bad5552948d4874fb577bedc5f9cb1f188aa138ca66b21949c3a189240d0727476747c33b8fcf9e1e9f9ffb881c38f8aca5973ce2ce4ead3c2312cf48e26939bf6682c3061324e9537d7cdea90fd574539f1ba2c2b0e80c3941d02a7557a9ce4a87938edceb480a83fa82822201ca8a17b5c58bc2c283e245893002299dd4946a92caedc9934a8a7a13b526dcfee2d37f2609b899e88bac7bf2a0a0c0805292c93d795039e7a229a4b8270fca89480528184542a05840a9f8a7b0ea05e23a0181e9031c572e5cb139810405ae97634c871316238a22b3cfc8498f2867763964b8404384b9c048f265cb05ad1e4c447854daf87b84186311465af9fdf693e5668c7119720689f7e43d5141b9e03da1f000a536e7c00a7354c919883a1d72acc1181719218b92c8fcd502a86f07d83c195ebc1c1a23263967221648ec05220d89b1d4905709510c24d4be91446dc80f41fa9773ce394fd0a80949f668ba272f5a9452f8d82285c7170c581650a29146051f5bc4549df8c083162d764c60e082a48e915a6ae1832c5824787992a2e94a479719686ec4305a05216971034bcc052abb0c1869a37361c56a04b19aa40612274f525062a243c18c9a224b7c44b98165acc221c17dc540442b051d44534f11f0e8f6cebb96208cec74c9c824956fb6664685655e642ac09d15b6eb5975608d36730d474752d9aee76ccd763d6754dbf59479d9aea74cc5763d4726dbf5dcb51c4011f286a3dbc9cd21faf589386e58022803386447c6764dbbc4afaf86a313716cd7342c61bba6a00cdb35754d3f30db35bdbb961810216f383a0dbb3944b5c3b8590ac63dbc236b98b25dfbe76a1f8cedda6f0d4797a56cd78e7bdbb5e31ddbb55f2edbb5db5dcb0e437a7a3705b64a2a1935dbf5fb4edf6e8aedfa710d47e7fa2b99edfaab8dedfacbba6ba9234467eaafbc875d9d1ddb75edddbfb25d577720db75bd4641c81b8e2e6b0e519ed2769d9334872c8e2e670bad8b4ed1baf48df2b66b6bdf565cf5040ef0b7d69ed655abaeae6b383a1cdd761d7e9fec79743b2dc836c9e2f0edfafab2f5dd73ce229037c82b641132d77b22abc824640f5d0539ecc9a302b3bf3d79545a58339c4591d4ffabbd387f3f83a887f0e5e457342c6cabeeb2aaaaaaf21c02c1ebf7b7777f3977de798ad4efd5463e48d7f4c8888afc4f46abfffccf2e87aaba6a5a7edb288a7ca41d9a9695b799b5653aa495a4d34a12ecec0e5890b469f7766297287385b2afae4d446de6abeb5efd4e7e55c5c27a59d3f2e9907d35b5a2938bd2ab27702b40ef25f5d5e37874a92e3101b2bcb59b4c5fede3026e3abc65483f19599bb3b25a3dcaa6ff7c5758de3ee7bbef36bb6e746a84358a22abf67203e505a648d71bbcb6b9d90ad5286adf4eecea3f358b54c42425efeca2555fc0525df5a4afd4bd7ccf9aa2619ee542ae8fded41355ff14dd1f157a2caaff772409b5c9d73bf955d8ce79e25e93dd64bbce5394deae2f77eb579f7ba7d738e9bf86f9ceaf6afd5e98b54ea7a8d57d33fbf5c5e3113583e72def5da63af7642bc299e7d0f41fb7465124196e70750774cc963a3dfef3a4d10ef20398e6ecec2142fdda284a8b93fd3a2c1df7404653a4a8739ddb71fb352e4940779e41ee425457eb5d2754d951dd1087727a2a1cd55205ebd92eae8b75b5698f263d94f4d06d3ac3b8885c2022c34309550adac46349178a3ac4d5d32806ea452c9076444a81abbbb5d6daeaf933c2fa3de9c720431193117ad30392eaa96b5d2968166fc76e532aaa5dd328e10c674254013ad74ff2b0a73662a16343e9a474524a2ba575526b2bb5b6526b2bb5b6d24a27d594524a29a594524a29a594524a29a594524a9d3a9d93d63a69ad93d63ae99cb4d6496b9db4d6496b9d944e2326720ae5cc9f9fda2a4d21d26dd286f9f5b83d7df74b4dc474605666de730f54435c0fdb7350ee34c4ad5c47c19cffbc46c2418a5b8e77fee34b449cead0cb5aa7b845c3cd21d7af695b7388d2ba685d752747c59ae94ffa616f06bd76218b9b42b6858cfd14e31ee875ce24d9d3a335adabca7e1d7640c7685b342e1a0a18275e89572f5e89b68558c5e25c489c324335600e6c02ab80504025e010900a84c2587887ab38108d850c6ab56fb3aeaefd9a96332bdc87980d997135d1d26159559941d9ff3325fbb5e8d5b55fd752bca5c8e540afb1d768b81b165f67607b2dece1ddc5f90343510c3f3014c7998cac24f94e49511c6533128736236938393aa2069d9dbab3f34e777072743468d8e1117b7836d40d1bdee9861d51c30e4fcf061f0ed53bd4eae102a71fc40b4624badd837ff8e0b4ac65f94e4be7206ea81c442f3b883e3e17881d46244ae24b5a3d881f3c54d755eb77aadd4396f98cd8936756dd4ed70656443390614aa4d48e217947911b9d3c1e557609dc47c49ee1ef232be42d6fabeb6037092cadd37eedc681bd8d5849e183f43d79534a3b5c4c89ed80dab79f1d4e0d9093376566ffecc99b62dae1cc080639da66d007a31724d51ac92625cd20135f43f2f0c104d287ed35224f3bb2a7aebaf915c2bed8af6f34ebf561874b4444ab3debc81b882b67b849800c6c599319847bb0c90bc4812e1ce835addfb45fdf40dc7e3d6b9a397908abeb911762d5011931911fe60ab6cfa6fe84f00847e63c31a6f7bab55f6bfdb7eefb96f71fe1a6a6aea7b398f9ffd75eadd6adb5f7528d8d5c90b7aadb54e77fdff9aed7a35353592e3aa063b55b99a9a854ceb51531e80c733300800004012317000020140e0ac4b124cab22ce6c93c14000c619842644e26158662e13092c2308884280a8230c410820c2384188314547a03fa776805206e616073c160151b41cf8dd07bc51b7a2ecdabf8dfb5c90d4348744e8e37798dc2b0338b82a56198544e202fe59e218be9f5025f9273f43bd114105d174ce4a4f13bd98086cfe154dcbc3908920194c8b6a5abdfede1296796a1e0a7bbf5b8bb85a6399e2ef8bf48e7febc7f4200550d812ff31120b62c8080bfc50fabf337e8c58539ac874c4aba359daaf6dbf9a195a51c942a0a75fe417a3a22304809f956aef5b4a692e6da2be17a0dd913a44c14868ca439550253458f9ef4dee600a8c277f235f760a9b3e9ec394a09341e82832abf260076d2759e15313fe8377d624f31c84dcd5d032589b9b5f90a089c035f01624b0c79b4970399a575c11aa41d126708d1334f4f31d063f5bd8dc1cb6a168c7cfca1b4cd40b1b09e9a2a04882d4de4e021a3dfaaa3504ad56c1677b29fdd1a64f9b3b44995dcf00ed9813a663a90c0285bf431b5817d770186bd1cb707af218883e6f0a435b13d4ff58b5a104a30c09905cae3b1271e042407228de28ae46d7634c2fde6758f6ad421dbc96e182f8906b729ae908221c8adb824f04dc57b7deb31caf15f029529394a36ea52a8254b5c71b83cceb6026fd36a795116e07d286b559a09e7a4ca99521e39ab874b06b5f4de2e2e42f461e3ab30ffa5aa3ea0401aa7bdd4ca097a262156857980b07789b01122fdb0cf62455c592e1e277ee631ab853834122bd2293d88aa0cc958480a804589203a120406a9c05026d90f33b72c28e933a04ef0d22749932fcebb190b320fb296dfe65999a88834cd0f8a0f0b040fd6449378282a30ef50c705704173cf2a17829351407e13670e29abd5e56c4a596db5df3165cdd66db69f41856bc6a1f049555a131a878c2a2be0775a6e19d793476783b7669e832ce054a3dbb58c93dd41fcd48e4e754415ee4fd2fdde29d08a5ebd9c72e49c13079c4e9c23da13bbc8feca8bd11d3c0f9dfcab931e6fb746e5f5a20c01b8053401b515588e013cb56c57c3e0761d080ec6aabd1c956ae555059a77252fc47d036e971073fb3e2513f1b912545ec932a7ce5d7c2ab8dd1d68ebcb42963c7b9656e525fe39d569a682db1d580f59c8f2710094f28685c0fcf6bd952be07637d14f8a24955775cfe92aef69a29c2f1fd2d6f373bbfe8b4ea7bdc468e5b0072cc16b8056a545dadc2e7a7120eb571df888c8a3ff6cc7e42b4928edf924ebe3a9fb93cd5a0f1f3379ffd49e6359197228f64d3671499ef09a08a2d0521cd988f2820b934fa1c7251871ee250087d7a309371195fe6d543ced0e13319eacdc22b08ad26c0ac393cccf8611e7154e41ef22a2961a42557647b5550ea9657e492f26c704091194716a6ffad6f3e2d65e8e096f0740924583b47930d6ea3977a863f09ea5031956d53ff0d051e1bdcdf7ae701e00fd79427a7e84c1a4a88f350deb41cb60110a31ca609bdd947b1c411f9346ebff7052035430322bfa09f43006e37f6b0a61e7833315a6e280969da1415ed06d78faa6ca084a45a66ccc884d282e394df7ad26724af07cd2d75b2ae17b5e70ba92c8f335c5cc80a0540061d32170561e87944aef364f09aee603cd3c5da6cf38fbc603ce8310c148d353da3fe59845a83c12f1cce2824af16cca8bb35dba751811419161d226c0a38da155c9a4e0185fad312761e677f4d9320885aa06d415f7730e9f64a704c8748760d0695217ec8e86c3db858a5f95b8f490c5beeff0aef95f8f97c4f3047426a1ebb9054da2024e22f082aca7f19e3292c516d9b8bc7dc4d43ab47c99f4c2844c23fdaa2551c249e26078facc06f33573c44bdf7840d8a75153040516d164dfd8e334303ca2f3f74589236859fe3663e579e1c7e573fb0258260818ed9a8d9b5258cce71b740babcbbd0b657ae1705b1bc045fd29b8cfdb8011dcd4ff1c8ee0e8c1c0a3d4c63f32f975a053b3b7c35f494dfb5340575672af42a088879553c4baa8252e0a552d18e691d2ac8f041be6ac8b5cf4327ce7c1eba4fbe047f93b8e485bfcbb97144331fad67a62ec1b182e04321087ae2a1f755a81d4aedc42ea54a4745dc542981c0d72206ca740782e4f00b5ede3d3a2a7a97340ca6c85db8222138b4e8edf15943d01270647c454f0bc68e2c68b11722f16a8e8412f5be814c36a99beb52aa21e67d1de457e66648e6fad72c9b500c1c6dc0a51fc99bab648620294e21b4bcb0ae4a32a76b0f8dee4bc5de82543c06d69d25580abb11f50e85f9358093f8b7498fa3a527c250ed823eb0795a2d1bf1369c335c0d4c0e82209b2b17fb91f0a19b40c53a0310438e837dd8d86c16ad52e26826bae7913680bcf3e021be6170cb5add688b5f564ee8b0f81046425d8e4dfc8871008f805d1aa44c6e03aaea7cc0d2907fe167c20d645e66ebde2c80401edc2dc4c66b32edb4ac8c23ec21bf2cb69dac019af5719ad2ba6b30757fa8f09072610e1d8bc59167f3d492a60fa5ebc1759efad9d1c6eec4e930369acf7a8b39471162b53eea1233adb1b92ea0a1ea48c7fea094a77531017f1093c082fb68ce8e5c4265e381b589e8988bd345075aafa73460a731f4610afca8d0db13bc43d1e528d3cbb99b56ee628c5e410efb7f973c00bf6e6c9d1ba04ac41561a82798b34a6d574570069e501116068593323f5c43e34702a6fb37fe95da67c458d68b0e217471a06d0fc17903c8068e2477b9507b0440614c829071a59618ff32f0561b43d5a23bbb63963d503e5e946288c3c55e63a3206928438cd6c58e611246c2aa3c309089c817e19b12aa86ab794fa42db11d5027fcb22669a3fb69a0a7c343344723c89825019909d8bd4dfc5d7be61725440f301f4792a4f17d2add932a9cee54f43fd2809fa3311ebc601d5c79cc88bab6dc68f0a636cb4854cfa7f16d517aa58c7885802eaae235ce89e8d4c218d8e53dc11769f285ba19fbe11a3a999f12c281b524159580d1eba16c6754aea4ca91c37bc2ae25334e6916050168a4dc1a71c70a572f4a55f507d3ed403ad990c3dd76d184bafdab8104552c2ee53adb7854ce425b86f933aeeb9eb5de2509b45764d8b8e55990167742ae48ebb21b044044a926196ea9519cb39a01abd6343f083a605701c8398f3dab51f51ab4c9b41668f53ed0d398e5915fbebbd15bc31f56f7689f98edd42b2cfdf193dcd79e0dc10b4de39a12d05679ea1b680fb22a25174b1037d0fbc3419dace9caa6f3fe649b7375d9fc316884480b4d24ed08cbdfb127b54496b3ee5b9b1e2832f4281b6e34fff9121d567864555370ed42f49c53c48e418570327377d53a1bbfa85b10ff5235be2e8cb65136de11e3744b6d4f461c4c6115b1ab8f20ea5d16c57f98872a467beeb4943c090a89cb760c7c6133076c3d79d23a6f8289e55ca03270c9e61cd7d0efcbd8b62c6fdb3df71c0b72243d5ec3b9f29ab8185eafb55c2ffe3a3760833155520452d92a411a51ffce949be116fab0a32be11521963bd1e9acca05ceff18bf361feb0a37e77e0c06e1b52c8a5add4985157e44b837c11f625bf2820ec8c6c369e2dcabe658b0384ae918d46f905dc977c414cf825d2d5d8d411220cff5221452ee6ec5cb56c65a4dd75e82551587384639edd0449cf5c867d6ec1d4ee4c0e9df83ae40ed4653176f8e596782b2c98f0092d7b91f8fc0d13bb832c7ee2764034f1cb43be4c1605845f91588d4f9dc1c2d86f05527401df0a37e42157b9cb9cb66dd608a358160e997ae5906ff90b0242776463e3c962f625593042e08e643462dc0910c6bfa9914e153d1b9c390381ce1d6e7ed8706318dd6ea170d2238f7f912d0c11b8223f1ae51692eff94541424764bb816441f6255b3c20e08874343eef0416c6be9548a1143d1bdc700649c81e77be6adf1daa690b444e7698f457a02812635602aa06c0a23ab5fde3b773ab9d0c1c0d615395daf6f1c63bd50e864f86ddab46c3b6dae75b57a460b2856cae2fce22960e86f201cdf9275ba382022590b1f4555ef61e7f695956849c4b5f063097dc1dde03ef92716cf6ab4d96f5c8bd3537f379117e4bd14453915a2a03e54c6cc98893461d8851322dc2c5b86c430e1733b4b32c5cbd51096c1665c1d56bcfd508caa9aeb3f6f170ca7eda8e298fc18e97fd4c10b177028a7e2b15453312b6e04e7fae3826e0f6f22453be90d86e0c01051b373f966698adcc7261c56890eef7f39470cbc81e75cd962136d27b82273aa7c7330cb2401b42e5344dd51b59513cd51cb380656489ec0387888570143990deb8585cd2a317f20fc179b0098e9a08d7e32876a5079070e23cb7d3c0e28676731044942903e0deae44e1c76445e4f0757b0621878f6e57835d4c440697d8f97aac6fef0306c43f230c9cba3a5b1332eecad81f494a3002f0e1909a4dc70990076c63d8b03f6a68e9d2ba4f2ab74b02e4c3a848754619a97adc4fd7d8acb9cd75b2e8f648966a0b96280b396c8d2205a13de121ed195045ac4a3e595820d4e940eaea0689c77fbe71c3f2b6a011ff38828f9a418c5b96b64d36a936c4f4b132a6fd949533a0fb7f2f27e87908d5f76e96718e680baf25ce5c0085b9ba6f8814c159276dcad4874ebb013c0d48d334b43b29335cbd24f0a9276b04fe9624a9d117d359e027ec487601c60ea21ab27d2ef9558317c8009e5a0462e3a0c212e76e1a2dd14972848480791a5a28b3e46d11914dd059f24fff4163b88241e1e273450fef005841261dc817aadd2cb78e0c865a760728a29d9aa862fa43de6095add7f77e933b877c111815c4eca710964456daa88ae9458051b2020955c20739a24ead5dd2befc83ffed460e5fc9084aa2f24d1da64eca708d2c0757dc67719fcf1939ac9454d2168a2e3d052400fc17b3e7ded768012262209a8fb078d96ed507ceb1fc72fb44850bd5c87c5e2fe4127200a79c611a1faa7fdd30f29c01023cf313e088d136b6ac2e36252ab7128cfaed9000344d4231f2ec8edd63af03ffba6f3bab4587249301127a09ea34b849d04d29256a2b958cb5bcf0aac241c41facf30296de7a492d09b7ac64c69900c796d60d4cd011406e512bd6f943b209012873d56c3f1366cb866a209f5c8f2b6a026689a8036069e6aa619ad2ccf54e5c0e6b3f43fd6f8f7dc2f5811c602d299340f87638ae642d6e9587338fee764ff35a8eb97055349cfe1bc9deb22b49a22951d7cac02af11f3c75ed3126225b8323c52f0b10dcef15314f950ff613541d5d1f213602c4b47b7c1876bf984116c670ac8c06b00a49787a0135777816abaae87fbaa23da72ce80d23637ecfa479ac31565fad5734881143d51a39f12cebe20a6c2c1c76649fb322dfb71ae52e30c2350fbb92ac968aa460c08112e85c3d0924d09820e4824f4516b65e255e7b3a1b744d051c44e1b667f29e89be9a928ef105423e079a919e950c9bba266750143cce6dcce6c48e98054cc8cf139e6be2bf57d8443ce47fd9d28256b30e6d494ff74fc009ec22fd7e85f29b6eb2c22a18902c9e627dc350c247aa25c1c1b289f11c503b2b64f58174f0bfb476bd52cc7397ec70ed85954883ffef159f6dffb78facaebb0a1595d73750da18594246ad141d86d9c71b181f1dbb7df1846bdff209f26df991789009dbbcac731439fff93c98162acb2d687389971a163b7294bfde764bd5b7d244cdcdc40f07b0d556923b594c4d1cc6259acdf0e8324bc6dfef5724438a6530c20a573346878d1391f55155e9fa4a762dd578dbdfb10060b6c54136cb5e41d78729a5d0a6a505db514c008fbb6c12c760caf2b0b0223510d1a7505c3984d6fbdf9f6320c09eaf1ebb6d7d03afcbcaca1eb837d940e68dd0a1590fba07fc41dd0cfa67278c785e3c21cef189689f2a3b965b732e3ea718beb0c94c1ed8e6ae269a97e10a624ba8fcd249679b4fb268c494cd2f073d35037868b475d7833fb83f350d1fbec974a765a42444e7885228233487728619534a0c19c48eceed55cb1f80aedaf637719425c0408f0c556ed764f464ae28f300aa6b2dc592150db126706e05bc907d6b18c56f0c9b32755e024470e5aecc4859d00bf17f2c531bd6c51398589132eb4419bea8b81dbd552ae16d3552cebaad418ae30d8e2c0b60a02b281c5389297b27daa1b757381f42be9538211a827282836c47d1097fc6e2929b9d7ae55f50f7db08fe9b48a7befd7a8ac618275acb539bffcf1961e37b626648bf975d38c304d811810de1a13859dc4294b668e0d0a55952bb3e66f329d32e7ce07248b0f5794c1460c05bc11d7ec025f2e6369500ee83f41339b52f629737bac7329b5033c6fe0f9e9833c1bfff38353a32298505700d96861c41f6a6433c270b0912cc76f82dc205d624007c34a9bea495064f85b5100c3613da098982dab1e492e38cbbcd23b0c1995952c84de6df07f9b02ad7a161aae6fc80627300bd8a10c74a9b431e77f0d1049300dbc4bf90c213894ba7611d81a274da269744112fa3babc305423fc1688541e6131e793850d89d88e63a867f7cd69979ffff067717b8239a79afef5c9e3607d6e616e5cefd0f7e73532d3f0919125bf7a7b4df3197a5019408c0be5058735689ce2b02295572b25019feea30950d7c0e2c534e40ff3594e37e38cc3f2f6f4b57bf697f1fb62e660df960b0da6f91dd6695f28d7e01a3fd95e1b2d29eebe9b2e59b6800cf25541b23181611ace14c614ba984460c12c3e1f51c02fa62e2ebcbe43484ec16a5841ce3f21c60ba45c3012409b8b8a29ae92668ca6da136fe4ac809073e2ea1207fec485a5f56021369ef6b7c3107bfcaccaae87f85b22eacdcf2c4a341b13bc7144cc7a2eee7218e9e20cd5fec8ddb705bd6fa805f4c8f515cf3e185fe2e5a9313fde47c38373517098ee37033d7d2596ec448c2156a4be9ad3bbd0a778e7c62b15647e7f60d4cd3dcf87ba732ee210e907f6117e7bdd0f6f6501854d83b47ff9b4136007c4e8e9f9d62db9b8faba8ca00d52fc40e306e8ba42e5abc0b51f1896916ce1a9778a88dbb85d829d36741af5b072a9fbeaf72deca71a38b1d8a6e77205c5ad0f1a45fdc12117e632a13072a670b0a876951ed888aa6603141fa15b3efc430b45476b33428758ee39af409c5a1172f0110860d210c8e92cab55af8d72b6e02acc79078a73ecf5029dcdf048c78af82e653cc5d61c25c11781b001a5b939d5e1170904eb4f9d0169c29a29fffe4b531201735b5fe8dd4cab30399f6145ca528179ee1324dae0e62b7ba41355541ca4800368143985aa89884fdc4470938c20dd25694d3f54827a039a4800fc998829221f572a194d876628106a8cca71cc230fa3ffb894e37a334392ed121e82992309ace7086868f537265e5a993168ed289b7960cc1220941ac44d7eeb722e4a6a5fe90bb4705f48a30a8ae9c1442f50aff27f97553b73a193997de1e46946f037eb216f492e84b1812085372af9d21560828753e208931feceee0fe8b50493729efc18caa0d54f3f6c515785fb0972506c43794c18091cb02a7247c11fb5d23484fd7423209d50597d99ba73742c9c2502e50745084a0132312b13131c901b4a8ee878c8ef982ed997bf0136422f0694ee5e108f5c14bc6167227ec6e43a1058105a7172a811f06de6007c9acdc374b30932a1018d192f1c656fabcbf9b2c5124df265fe55242e0f594605d05d2c98f1d92db454fcfb1e83e7d5bbc30519217d5c8a1d27db05b25e48a5545ad035de5ab5989f43843e1899486061206bb60161ef06943b36e3face13ba8db333438f0d7e1930102569247bb9dfe8c7e969aaef0d9174020f9289d821a0c1ac77f18fb7c37a3f253c0cc81b56e12b047cc5f6291eea6e7e81ef51ccf6fbcd67b1f00271554096040bf7c517ad667d7af90f0be22b7ff15a407163eacaf34c9c5f11b2cc2429afc61f7b6c0b4425804ef732b924c56e598d3986fb88bc442c8fb8dd2ee4c890c23cc8d1511e98b407dcbc9417e53e035cedcd77b8adf3cd2940fce232beea130bb967d6b9402474017ea87fe057c4629b0fbdbb5d69016519ed592723a0ca8de7b8e9eda3b2f21c88ac8249ac08f8f2736a09ebf37f90d6baeb7a15173136b90915540637f8de706f9563c3a7af08054a2582ce7c47386c68d13329f820f200119b14491b9e49a90d6767517f74dabfe26e412053e09070c39d96c08637d1bea13372e250a92904c203398d54b30ac2f2a5164566a5cdf9d97498bf5d6b6106a53e0c870e8250a77979ff9f048250a697dac2ff01490f61ea115c3ed61a5db36f1eb27cc76ad754dddea4a7b376c929d28c686878239eec5138f1495128338fac27d8328b6d4bf779bd7d9e08ddb8e105c81f4874009d5c5876b33c4128cc28c921a0b2286881b8abff3c6a5a579c0301f91ceea238386ad2bc18eb0be26172c283f6ac2ca2c88c441196a35f3ff066fd291a2b3c840377e61f026a14f53ee10151243a8bbc395d9a33ac0a3825be8fc8ecc549517954a5929abeb502e6a45b1a0a86c1029107f264d10371e77c902ddfa7cfa4bacf06a95196fe97601c08aadc13f2214bdedc6d6c65efecb1de40d3b721aeaf607bea2fc7fb5ce18d564a97fbbcec1e3e14642ee865c38eb866a0ff6eaf067603c3c05c33678859ba5112944d870d866968f99357d728d5a0c04f913ae08767062fe05c1d75f6f4b093b134670502ccffcc9e72b60f8c5c26ec930cf437987eda4dffe41e2ae70d80bf34f3d8f81f2996b657f4c65b2f78e39cc12ef1bca47d0fb788c7e7cb1139b8523a03a98909869869d6d05ff48c22fbce2a00be21013947c5c0f29a84e08811f7d947778f2c1cc2c5ee121db27b0b2f6b5c8432a0cf1a991876b4dc2a4d127b58926d566a0144eafb89cd8b72607fee33e9536f48bec2889cd7ec2d78ee0eeba97d8908cf8f6c5200b3c48659a140509243b0c7ee8df50f8e174ab8bba511be0481fae8c57354162ad659d5a2badb91ac3edc1a2aa1130621e3f6b63967c9ecd08018829b57f93aec9f2ce140caebb5eb2bbd7a91e83f590a266ad62500086e9bf63bd8ea3bc21c7f6a3c4104449a667f9672cd2421fcf58b15c2c139d59cc0817bee161a314a62b82f33ff50b03f0325f26f21d27638ef1287a820777a1909ffc8e251c9f4892b46f16d53a36159611015384a1386b036c1bf7fdf338dc57cbcc9c81bdff49531734d564eb95d2e9e7a5dd5703f7a4dbeaa945f4fa2e941caacd29537b2cd703d819d3ddc421379367ceef4810d664ea1788acb561f6e9ddd4b4a74f9b42d81258d1a74c7162546f05ba63655abe5fae1bd17ea8ed7b26d5fffa178660a2501b0100f34eac7c2798c001bfe939bf8438d3f891871e8859b6e3bafff4f419ab157c9fc894906f54907a7ef38398526d6a8506f90ceb5f32617aa6da5bb54cf3b4bf64d1b4c20637e513218a2127691a7de2d590928e63c881fc63c99e2f895707125f79bcbc03f1d106ace8bd5211a384518604d11e6145b33719cc7a55ce29793e56b041fcf06811f26cbc6a740ca36e7fc8df6546929017601f67f612af4a00043863e2ec40ef670c61695f4542b683e6f5e62b9a1f17e56ddf452faf6b56ad2e2496e9af04105c61f6982f3a3423024b9dd16a2e25b2bbca0cb631549cbc2db77fb44c407ee0157306dd21b5d44fc5be3260ec82a53e45cb9af78222468439c5ec360989ef6061b7781d04138e07ac6d1f9509de0368049314f76b10cdb6c032f86a0f02602b599e8c66ead76fc4eb1b2d3e509776401f5664d2d877755777e428ebba2cce6a364f63947bef724e1d02b542905771a597a49b1ddaa41220d8eb8cbc6dd971725047a50e496169571d347ea56e006e30786a15d4a102f629d8147b42816248b6023f25320c0b0461a2ee0ae5cc1adcb08a593a37c1c1cd975f9c14fb7c28ab3fafb9013b01dc8675ac3250d2a7cbd0078f103c696260731ce63d0032887a811a50b63469d8e861f5263e5f43ed447b241850ddf1e5368c04ac205b7a8d00f50d054f1237230c7f15dcc63848c87d8f36076f6ccb1b63ac85e21587d3a1b922d441c6071e5a50c48c8c0edb5be526957e86c36b051ff00a294bfef757dce5684c49c7fed73abc72f997408282759048fb81c80add0a6d7f1d0c3bf899bc6640c4e47fed15a63a88081d58ceb53729eaee8ff143af8decea5d31496bb4b7a1073f44925497aa0ddb50c9b46eba929abcf31db8d589f6fcd3e509c0a901ec6ac2ef2976c180ca2bd64e4b9adadeeca2e1d019a18101d2a133b844aecd09dd0792d9a418e28b95cf12afe4cb50e398e4dfaf7da834ba8ee406af23309cda2e1969185f64471235b3231b5eeab1b81db11e71473661ba23a2e6da2cc88643736b66494e1c9bac85bda66c9fb8e3a1ea0549bbbe88daffd431e6d24641643764fe4d9dd23027b62076b96aa884a2001ac2aa71db08efc8ad29a4854783c8cbbbdebdb8c8472bf0e876b90ca09b7661ec1119c85a68a9d6ef77a9b04d38bd3e5fd071792e8aa2fd9ea4bf5d66c5eedd673cf0a8c4a20f14281661037aef496d6b924bfca1f7c864019fb8c788be48e32857cf79f858597653c9d9595e85404c1fcaa942f5608312b13db73271e136575369f37ed4ae9c2eca053c0c6943bbf4afe2d7eb579636d1b41dbf3d5f53cc51c3fd8e12263d892f0721fec2f9eb732018e600d351a4297df373f8d59b0a7fb8a6d1c41b34f7e3f68fe7d877fde7c8ad9e8d358b528d62c2a1df6c67d9c4d16f28b4df235dfc32cb643f5c17808b6221190d4017807288d623acd4ff9431dfa88b15299012b27e16171ab34ace37401921e28445d38a56b2d2bff951939500bb4cf1c90dbfe663ee3cfa8a0aa5c6a4ebc9c3efa48e714c9701939fbc368665d0141193ffb8eee436c0667a94775b114705d9857320a1e097024ee20db2d7890a08250e06577ae413a62b816670e17af4885ae4d27afc538f28a53bb954ce382cfe1fc5bce2921188375fb48322e145b9f626fc253ce41fd43b190aa4fb4c120ab49bbe8bc6423411364c7b01efe47c0f42796f5391fa49cd659690dbec9f7392eccc7903a3dbb461f3942f2194cc2cd5a9c5691d23b1a1f5c5326caa72ca79c8b3fc98d33dc36a8f8f59552a39e4cf166036077a602fe05582d29ef6b44de1b80011c89d5cd0072daae1891e033d8f0fef5104f7e33fdd64cf5e5cf7850dd6d7aeffc283e44dc8008178cf2b2a281fbc11794ac05dd6734e72923c0b8687b58311f747461730eeee8c4bea689dc5f06077d0d819911202ddfd9cf1930e90b3303c5e3919fb2f72b200750567bce421dd2c0d8b6b0746fe8e4cc96ce6825b09b560ce307d94e1ab136953d7ccfdbd32d6e0ac832a3d597c96c2382444867f2327e2f0d16c1757207101839d3b0914272bd9ebc917c49b72dad842b2c316cacbc0e7436e64efb4d5808c887b6d996826b99e33e08cfb7e540bcaf86fd194fa1f13f66c773b7831624aa89287424d716d3d2bc02668b6603bca49195bb5ce390867bd27f9bde399e0304d091a2239c55adb033e27c4e1b00f4ff6583d2f4d824422df5cddb487f53625554a0314e232c31f81a4004c49086bb6065e391b309b41a5250cfe4f23a39996c9087347f6361cd4ff633d32b98f47c84a40cbca1138b8a813792c1bb6b1920b6c42d5e71f8b0d4a6ecba701b09a401254d8140869fcff2e95673e878d955cfa05856cb31b41464f355b0a2677dd25f8e7b8149297f383d47125f58fbb5685f6a4858c9b6e05a7b576db6e21c11e56e2141f3b35c066ad9b551707472bd2d02a30609b4fa4de8fd9ef1faf2f5ddef21ffa0f99a28c32cbae16dc6094fcef902b2805873b47bbdd748210d71ce54a8b4bb0cfc0703478dea8f420528ff2c46914fc5accabde9cc4a18d61515434dab15c8206de75298879649271edc6d9f0ca03bf9dffd71ae891069641fa9f29dc7935f7dd7b6331ae031b39bd9a88e698e8c76598c9cf7ee75a6816cfa8457c26790a6717322fcd36bdec577cd2f8323a03dc1c292efce11be084d9c5335576e53c91cbdf99ee12e006d6c93b9949ba671d596ddc761157e83cdc33b9ce62a8d088401e988e1e7aee81a50f147b603cb2e596cc29d344156a30ca70322c7e238f8126aaef8aaed95014b942b15603211bef4125658e288511e3cbdccd8959e5956b4ab19417178d140f780b1c7e3f6b517d7dc002a8979b10172d4743392774e8f0463a5e37eb58847ee520e0eafc2383dff95b84864ca6664d2f47c54f613165af85cd03b863d3cb9cc4fe1c79fd21e3903f23d28be5f59453cf49b9bfd0c9fe1dadf3eb01c17a3fa22e751196f21f4b170c0ccd0c0eee9d8348b2425bcbd830e33ea4d0b9215e2ae81bace33b1d3f40d1ad1512436bb2f0028d587c4be0904140b5f4636696f3388a276fe8693c243250d77f1260a98e4aaaddd106a3138bf1a43d532fd02f0534aa52c4becc4e11f97d1f0524f4f01f144d404f6c2808d52ee2967c08c3ad09d95cdf190bbf1a8d1561947d910f6d042c7f93c1462f895303943d01875f7758c340631ca7b994768858657c6b7523b04ac08ebf5ac8ab831bbb80a143221aa8bc5242449d0e9f21ac7d08b82d987b1b813d2fc683b1364e2cb12415ef47a51a0851b066a9880708d4d7d56da0b26548582deb91ec4da8f073abe7e86ed9e059d6cb5c376da262b96eda675ec0a3125a12b23c9a0ef51020f012e676248a8d86a3918d2e0bd666a521d9b089d4d25214e2c17925bb4826ef506cc8690021fb5566abff2cbab5b9ef33b682556de88d3ed00f0622b7166e2c5f6d7a09a74c68fb0c870aa1bf94d367a37537b24e4eee039682119fa025470efd4335026fa490bc08d5e01c742aa136982c5ece02cb6bd7c628d14091a8181bcfe1bafa7f6f65af7cfc78b3e811f4a9a3421b2ab197c64de5b29f85cc7d82068026001d56ba1d251e070c6da5645e81b598651c18e2212b332c63431d05ac39a31058cd8b482ccc454cb69bcadf7363d454801721759e3a09b4f143370b19ff1fcfd49a145766ea18a034c38ef9cb0821c8c5fd0356c4297e54028bc4be72995687cc4d4e111174b500662895455b6e0897953f02b3e3110dcbbf723870f1834ae7825cf4dd1858a78596e435905028838854d1d026b9377f7bfd9e39cb8a173c02b17cb0ad4c752ae632cbd85676cb397976e41447910ddaccbc425fb27a48b65934936d9cc426996630125b34cba4762f0b56b1daf7b3d067312de67c9b05dab6f3f169cc8b63bf6d22d6ee9646115f4537f838d9bd188ac79d0a6b78b95f8e9118cd93ba6c882d5d64016cb9288e7158ae9a15067d2787ba62185ebefac2a29046a94bed2d34a5fea66c5c8301d257297a649d0a657a137538857e45f59925cddc1b9baec4809fc25d0f3715e058d1dee8e17ba1a4decf35c248e3b35847d0a9a80cfd97c70ba95531e70c9a227b3cd8db6a7a041ca8881b2fa8e1a62069d90bc720bccc9335b5c525d3c5c5cf1e6f5415582e54221138c386690493e9c086f3552c7aebfd6a5748483b42c076285675cc10b87c379b1da4d476d9e9704ba30950c9eb95ed69e07a0794ec23b38b7808295e1737127caaa6dc9075dfb9a0b4a56c3984374f5308f87e5fbd8907406cf218aa65783456079d817ababff572e45fe6927ca0c7929e3bd0074b01afeef16181648b81cba693c8e4a1720ee954191775f7833b7c3b113e9161780c23231feb9d06907b49562aea342b30645dc90a9fa15705a611e56e18b10de741debef67a5c3e2b99870e970d9e9757363c58484a1268ba0fdd1451373a521c787d9ac57d641613ea5748fef3b7fa34b6e064befaa007968a997ea6f646ec002c0aacf1042ec8412f72a1288aed29e027d32ff2f235024f7ca8e350150481c6eeca5ce1e82eb812f0fe176eb31bb516d540eea8ca9ef5e1ac14d8273dee2a148c507652b9f62dd36b2723ef79e647c23e284bbfc41a48c2608a5aee48fa8181a669eaef6245d640aedbcbc915b8fa4c695fa15d2a36f72fb84182b1f460bc590cc03d2b5b69290c5a215eff39c7906d4230c177785d7793e09079ffae80f9442188e08c8bce2e435a7b4bb2a6c33b5ba423a029c34581787a2380b1593b973a4c170a58c19d41c30e15e5fedf4928b01224860f239a1fcfb9e1c8828a1b966eaec0830a4f1c860168ad969a8350872a2fdfb27066b8edadd55f82e0049e95e5912d65e20eca2b9f56dba2533a0a478ac643b245a3772e853338282773c6db34ae2c1f74f9debe9a002e56f7132814faeeed7af8da6b5ee9e9d6cd136e299e82a3aee3081b8c3996116baf44fcb7c9dd535753170c11d23a859d742a89f35dfd8988398388857c095493916a8b7b54314f08d8e81fa2f345a84fba218c0eb15399884a140ae6729b6922d5e176e846001d169f78d2c51c93a1948c489224acd5662dbe851e957b69a875b256c1e2fe7da510b8f4b0efccb0eb826a8c0a57b49b03572fc26029c33822fbbfda737362218e1a4a2afcebe579f96ca9259599b431e95499ebb3bf6f24ddd9d4ec8ba08dea620128167e721c5adb7e669d35c044ee6df196811b278e671ca68bdb3b2f08463aa1c58dbb9afcca7e5c5cc164c912de55f9e6d5131e26b6299ba80b1276ed36dc8d64d01fb7e0e1d3e7f64c02db397d8fe3889d00c3368dc489393456a58a2e54ccb6418e7290cc839f6bbd1a91808142df5864df723b511b502c2a909e1cefaa1a0c769f677f79cab096e6911b1c66680c34865963cc3c453cf5584f9e4d14c011a62baaf0c15b053d7e26aff408d27973b89c6b567ef29515c0a16ab89e629e32cfbe6c632b39f4860bc7bf854ecb3a7fdca05cb2ec1d242b6c65e79eaa00a860d1677558d7ab3818b5fcf59943997817cb6b74e608eec2865bdf510226f1f5aaee00935a158f04c5df544a28196618454036ec27d7ce70545b98f78770183c2ae007237a187fa3b06f9e03a876b8a1ab8290820c81871be7493307e6ca03f21742bf7f029926c3ccf7a2fead7dc87e1bf1341d0ed661e19d611941aaffaa79e2d80c766b53c8fc03fa67f221a1e1d52db108facfc82cb2c94ad742e38356a5314fabef55a603b32ac46e118c897cf5df6a088a76eaaacf2928aa0aa381c30acd536b37af2717fd751c54bd28c987814ddc698a2c3137d5ef07add594013fe727e3883ecbd0b8f177f18a7751ca54363c97b0c8ad8830c03ef8a26bdfe1f7eba047936908cc7dcee0be737e2dbf326195143cffe74c602c439b1b6f680c4d33ac2817ca0bbd2a014dc650a2ac888af03490347ba21bd04bf6c482d2c4106042468b821981f97605a513157543914e21ce9b8979781e23a3f3d4d9a60faa99a088ea8022b8c80d98557792bd928825e21a8c9f71bccaefc6f11c67cca0161baf4a8776695ff14a5e7529a2363f8c930bf3722965c87aad081351fb5f646c516d8a2a5c279de359ab8f7895050b1102b7d18dfe31c48c5af3e52429784a970f4b59034a9aa0e01bd44d9d42a9d68206f0330c15a8a0011f8d58138deabec7949addff34d8925b40a1a5d3644a390d52cb605e1b4b18c37cbbb66bf151e4ea46de158f3daf2b5b2badd9731dcb4de96d9e134e085e2067304dfb49a0980806f4edd2a06a0812c0a5416d36809dabc5aab17153f866a19a6b7420a2dcfd80a4d32edddfcba29d3de466b90712ce96eb2f9ff91fc1c2e589b787d88c7255ef88a57a88e7c2dbd1eb9d02ba01a3fdfbee11c20770b0a139e49592a47e22b644ed42793399789c6729e3d66c9c8c20ee9dcfb4061381bd33b7923ad248a6e921734f5560b994dc82fe7f05557e625919cf268ef07caa4cf3ade1c7f794634573856203044256629a9fedfef51ab4b1652215e6e5a2a8599f170a4ad2b217e4e27b8449a88a7231c135ad3e4a6794a684bd71789dcd23fbb23a85c7a7f2a54bbf159bd7855601b4e80db71b4aed47567399945741aea67591e5b675ab7ca1f1aa9d6b1b2016a501abbc50504f0809405e12e32840235d1641838af38b42b0e5f89dcd2937479bc432764c160d078d4273381aad2fd31dfd2daff53ade3867bf3cb9024688f46fb6ee7b80b282b41457015d9dd1f792fe65b8e8dfddf20d60551a29b4fa5587697b00be962d33389704be800bff4c19fbd8ed6bb23f706bb15eeef1dd8c52a47d334663ddc63e7f24db30b80f23bd7a98844e712cdd89af8b8bd6511ba353af8c6b4343453f8a518479ce8472bd223360b46b52c06202c749ccd833bbdfdeedbe3890394f95f1cd7d6f3b52ae2cb1428f55ace36d78f185d372099ad972393176871acb5f65286feb3f516d71ff705d85f3bbdd3094265be4e5f834b202986ef7f8013396d563631c5a3f681f0c017a9cfc3d48bd23c68a9b90c00f3be38b4402310ecfdc092a389574febeff5ae6c83934fbac9b6147c555ee1973d44d21e0e41a504c9b58c791e1c12c8f1cd6a9c4c4601080fbb1cabce286432c51906d2e0940d969809d57af04a59eb0f82e45c9033539626690ff5e2add254f6075f5ca5db796415b79a3d025f9867d26ce4407870d20d1c83a04672a95070473fd2c38ec0519f8b883a62976ac496183c7b6c82cf57422c9a41668d59b1ddb37f2b03699dd62f76b2abcfe97873911ac4769e10c7e05a235c66e045840f3c227c058ebb0bb2cda3b535edb9f3a7082ed0d49539d57af7bc4bfc374a28898f25c8531a750337d0121fbe9595559760bd456275d34a65062a39fa63be6accfd9a79cf7c6d544def30eb318e3143d8c5c4c52fd01419d190c032fc30cbd4f498d222eaf11af385fdfe752a545a8e8361d8822f43c89282f90722a29e41a7eaf7b8214c8b6ca8c9a9fdb24245b40a36ab74e8b1f9a78c776f54bc76eccfa2dfb0f79bff155b89154b52bfafedda69bd693a1326fb17725cbb99d338ea2cb778a0b70bc2232a4608a6ed47e96a09c13fa8f55b3d142c54bc189a5ffcb6b31380095fa29685233686f034516637cb60afadd131506a9fa57d851aa34d8efea669f107760ae7aefea5d704e8aa118fe7295b12e70bbf4e55a304e13c2477ca4c63cbdb8c2083d8d2c6ffe58a6024ab7e7e72329b0f38426b684a72a2e76dccd0697f8a8006af7492198d60d03c50404c9c5ce09264cc4b8d0036484f7b25bfdcd8d1b4be3ac3d65ad5cd4309f340482ee0b05124a8814c36f468f93f024d158bf8986865c401cb2c3b2db409d1ce60d3a9cd891e43494af1ba52b5381ced66ea0212f0813a847886c3a1a02e5c4335e3ded0fc8e5138e79a2f33828d55fb71a98845a455d65ec4e568580c8a480bde4c24529c5fc65b6b6b47a7fcece7d2d1c8d30ccdbf8df7ed1d56059dc44eaf18b73e83c225acfff22402f574bcbbc22a052f4c5ac947b8a6ef8f0449414df25276129dc9f747833570e1f4024f909753f13f3d8f89e04d37c85604499bce9fb0ceba6e60d0d0dab96b6dab03f20055b64aafc37555c4eb542c57b1fab2fffce18dc55e24e85ec810f8050156b041acddb85656bd8ea1cb705fb55bb8ec1bc0ab412105ef61b9690596e5ceed60a2845761a341b84b07deb2adbaf4cfb3c2f7aa75673dd1e6616549006ea57b15c7e8424c5dbc7f0ff5951d9f66dbd51bbdb4cb3a8d54570bb22008e151371cdb966d2fda3d2829cad72d390d8dd0f6e4335d47e50f3c2cf32a5c653e6af5dc374fd33b18c1416496c0c153b0fad0bf27e49f4f2d15976ba744d737361aff265a3c345a9af0d8a65d8ad7bec4bff741983ba1d0ebdf57bc11b405f504ff8d96b11cec2de2f2d6b097cbc3c6b161e9121139040a8b13ee946cf655cb0052b9cee3417e193d7449f1646236cfa62cc9de8930bea7a25622051e2f53ff7c787df7bcc2e12733cb9c63262fa96c7338188e2331937a6f2fa732d8b0cf8c6542fece0422244899430f091dded5073de33d550029da818c33ac0e74b3bb3835e06a5b5c821412eea3b6931383cd2877cc8f08ae9c931816232667be7e9b75ce8c63981021938a2514e88614db6b4ee9796a171617735f49c5bcac410f68ef1ee7fca4cfb2e2672d849be315d83f6f5d203c025706c24ad424d424b94667008c28d8b44dbd4855d4c7d3a9f37a634be9b53171d5fdbe27462536a2f6b571b1c9ca62d01052d8e32367f2ec496b74217a189a64411a6fb383c48670b7b00280514278e0f53b19ba21af01285eaa63f48755ef8102978ab0ba9b1889c5cb67a5da80210c6161ab26203e532ee65b940489b528d42f39aaa4b3e011993d95ed53359dc4f03ca6ace70b2d0cf3fbf72db0650bf15f0d24df6d3ac5625329a72a415c44d6ab271dc54c4e486e921230eb8e214dfb83f11fd12d9d19782920474aebe651262c0df898839d5695d3a469c5e368020000c29e5a327c84ea75295dc23f48ac94c7bfc6202132e13d3b56122f4ed4d3d62a2e32c8b9ff7337764b7da18cb696be52c4d6296d9c9aeb202172457e6efe77825475efa0d7c632d7359b5b00ed92598197f235ce190c24cd64b1ada3a39f1e06932549059e04f09caf17411cbd7a701b997ade81fd321fc32dbdbca96ab6f0989e9a1ba72c43b2c0cca730ee96482ce5f8e47b026dd9b1ec2310aa4fc420d8eae012fe83385fd668bb4bbb842538c676c0d974c2e9c529c77c3d821586b48ad3c3828903a0c8f9ac7d1abc81ed24f092a6232b0847a1fb09f02ea4c301f29917d7a6269a2b924b60db8ab75e9a313991b13bb437fe714214337359c4b65aeae470904347d7a48a1be279c94a5e0ba339c359ca59ee670911b36ca37915029e48ef804135a95589ff2232d47c44f27279c1b9767fbd672959db41a086dbebe071b16098228a1dec6d5c50a6f10ae3e7326087eba2b86a51a61be309d637d1a32d452fc38cdaf74b9528cc414b798ce47f984db04d5c86294c1848b4df6b0f2258cc6d6e1b0b31b95ee0f899bf666902e4f710726fcca1ca020549eff01c950cc94e70fb65c20ba573ce9c8a07f751b1501e6c5cc9a4bc0e882383ad6a53f4a6320b584c1dccc7f12c06188b67d9b25306b22d680cabcecb53cddaf1719ff4d865463df0e28a49345dd75d7738a287b31fbfdf011e0b4aaa8a3e781bf618d5ac1b70f1a0110b3db356a77e62d4db59b1f95e23567019c2391663a509c5908a7eb168e1f0b57030616e5bb559d626965bba548d40f464fb2d08d90067ce02eb8644fd2aa74ff43080c20a9acb1434651fde0114b02c56666f7c871321813974db2d481e9f1ff57299b99506b002e91664f2b3412c29a6e4353f656fd70c2b488bb641b87d1e4fd695abd46ae910ee50d0ae415df9d7ed1b781b06fb284b097930e132247f45e88c43fc10ea758598a37cf482c498e4b79e28bf2baa883e57fb029eb98a37a4d7a7ae7e64687ec8b61dc57b7f0bdd466fff08ef82805b4de01ae431796ce2a0a39057ed2d0dfa7bbccb3ae974db084127d2924d9344b4d271ef0935c92139dc90a708f98777f9bfd3c168baae96fc9b88df7bda9090d5af21fe1d952ec924e0dae1090f8d50c3a1d889d43d5f896d2472f73bea4e8508f0bd31fb3b46f17a00786689032fb96f427cb14b168aa0c81335658c1dcfdbc01a8852fc34c1f024efc41f2312270c676f1ce75950880483fada415eea9c0d66e480b6d1186d992b76a7f1d546c2953a5e454c0c1ab6f8eb99596ce5ddd39172ddf8dbaaa85cee5aec7dfa0307a4945ec45964d6f399fdc09304ad89a4dada0892df8f46cd31ae66450771d124a2e6800c212c3cdb0709fed820ee05c3f923097c5b1e45ff20996344c27c813b8e00db478138cba90238289d50382970c14560102a9686b6d44020d75e9a7ec8ac58753e85d6e771b23dbfcb406d11904d8a1b735d2b5c7a4575a0a35297e042c383ed87f47e25c5aed37ffb7f0ace10a8661767b6c3ce0a5265cc6157d4d10950c67d29320548f9540f3d90bbb9ce03b601c770b8fc1a3d1dc0027e14997fdcad8aabdeb7d000bd7285d13aac392254c000d329dacbfb6736884fdb934f05b17761bc15270f69fdfe4c594b885f785c63f8a25f6ef92b0dc14331c18290841c8fd65eaa1adc031e129a0af31188829090bb1981a9f607109616e7e0f1122cbbb272d95f77cfe6e93cd9cfe6606f0de1d783bb7f9d8a82e7bcd418440c21f83272c134b558b7ce17d02891c4f1b3f6ff501a15b7799d86154153d41cb1bf2aa5cbab112123576df9806019a820918fa6afd44a32b96820a39f053a31259ea1c74acd6cf81811f78361b9cf527e18a8e12f08f5cad021af339675e404ec24a07b642ec2864959d5f33e7016f73676f51ec7ea0b0bfcf13c5ec1def05bd641657e2267b5a45d02a13297dc6c9218701fb0e28be69102aaa5bf33c5e2f9fbedfe61219e2b49aed751746d7df08099284ec2df796524a99a494011e06250659063458bcfc19decb9791a707735eb4ac930332424b299f06441e0e620793762d7ec5fb70f138aad73020b4deaad71fc8223167fe8e98039345e26bfe8ee8fdcd7b2fe50d683790111ae7c391dfe247f859f1e14810c78315ffe273acf8172fff05e8812509e6c0f916a0075c3cce7ba0c5aff8117e7c1c096df3fe358f7fba7e872c03b32d0fdc21cbd87c492fbee64b62f1ae173f5fca2817afeee387be551fe3ab787a38d81a024ea3d6803460882be0024182216d7d2f3e1973c67cd577f161cfa9dfe28baee3d4942cb2a7ec657f460ee6dbdfbe199f8c9963dffe8a4f478f77429afd2b54830ee5131ba4344a6f76280075d1557c784d1ecdcad88935fc6f3ee2606fbebc6f839833ffe60b40cc998f137960c4d7fcdf60003a3204a041ce2b00b1067e1f0064106bd4fcfc18b186cdcf87017e1f6bb8b0f7e10cef439e0478ae166bc6a6ee1a1a9c378debf44ae5f9b85aac996d534383f3a6719d5ea95c2d96ef199b1a1aec6a6dd68cbef9d5cdab3aeee6337e0d834937deb537de058ae9f0256b26f641bad6837ea7e172cd17fd201f347dccd1a71504aa414f15a886af0ffc777bed736c1abed65a6b3196f74e6bbd564a6975b7735e8e7e4030d059abff9a2f19adb536cae9b45a1e3290113ace2430495e769c25392559d975c7599214a41892129210a42224a2a33147474747f1c812218d4152c111121236692a89897baf0aba86da8609474c9a8e8e1cfdd8363bce8e821ca910bfe8107f415f74fc39a7e739714e1036e03ba903feda8e5d0e2abf1c9288e8274794fd383871861c021b08a01f6a4c52b152a5c6663df2a7ec3660430a47a68828db1f6ff99982a600e88718dcce0c0fbff070606cef819ee88801eaf9b201e4a884edcd1cf95550201e3c1e492406fe98c81476f2c4199129b6dc524b96324a39a73ba5b55a1bff823194b19bc891dbc21d3dd3d2dd4ae5bde66bf20820bee6f76cedf34ae5bd04e0ad545dbd585b00b771e06bbeb4d7be72b39e00534dfb7bbf53d51baad1f6927e2d721a2ab02af1d4a6f9ba41a9367d886706c3fbf63730461ded7eb58f3faf9fd451633824152b54b4e94f5477777777b74f410e081db763ce5da1e7d4ab53df4e5063a35c60abf5517fe84844f0221be74327c2e2431f127a90d081bcf8d07b7872c587af2d65ec9d2dc3df30786cf0f8cc97cd4b0d03f42607c1e839fe346d441ec7da0518ea1660e86d1660f83860f8fa3effcf8b883993c7a374883c0e44d367b7031179be441e9b9fef42441ef913e733ee8270e49538b2eea8cd8f6e8f72e9369f6f8fb2f9e6f6a8c913e3cbe693dbbfc422e201622440a8b79c099008607d8c07b82a9cf79936777f8f03c6a8f3d5fc4dcddf3c0d4d4d0d4dcd8dfb186b3defe3ff3c6abee6d37c5ef33998f9b246509ae6b5bff980a0f4f6371f1054fe9b0f088a7bda826cbaf980a0547ff30141e9d5df7c4050daa6e6f1aea9f9bccfe60b5fbb86060c5badafefe3aecfbf157a983d7fe60b5d893d5f7f619c62cf5f7954f78554aa16555958a7426b1465896cea311c5349131736751be562ea155ceee0b17f6dadb5be5e5af8daf5b5eb8731f665b1af8bf574d268fdbd200b8c3367068c334783e1ef57925ebdeabbf7b2e77339203069e818dde7cd173773eae7d71f05f187512a04ba5593ca3aecb1ae73251da8c3631e637de8484227a23ff421ab7b3f76f72799795b7fc7ecb0b6401b5168eec3cae958a3955b3bbbfb992f7cedeef517feee7ef5855ea877078658ca9ecfe1198fb124552167cddd7bdffe0bbfb2e4ee47ed5fe0b5f17781d7d6f1dafe31a8062d9f7b414b719c7cfb2e8edb3e9d619c7dd9c1b0ecba2f7a4e95bb477e76fbf9ae157b6e156a45500efa023d1b84cfb50a15f668608e79d1e1968d26cf18af186bed79db982de395639988d44592638cd08646b6f1b69f3368022df736a9bc516e3a9f9bd9da6b34b28d5b506badd6d66a83a4685b7ddc7a6c0719e9b0e2a6f7180c6f893fc42dd8f3437f09aa8c6c00a1c35694d16ee1a6f99a6195edf93e8e55467bfeb52162d2a39a2a8c83c61652813a7ab6cf30ed319eb16f6dbab5e9d6a62b63de7f4d1ed5df26cf99af6d155012bafbb0cec74a762855608c3af8db7a360575d49887f18083f198528d9570a347481c618643130ea1a70728082c897a80be0081f992056bada5426f9ecf1359b3160c93f1123dc5da27b602dd8832cfc62e65f1d61ab10e74c316b1014f16ef798fa46d30e9d0f3bc7f492146988c2865215ed2a89139f3c3d7b6d3034a1a5afb9bb3d570ad94d64aa9a555e56f02eef1a3e767fb9e8fd37acb5f0f1eb18c093d3f9cd6ee59e5cfb333e506f2ef679e1d1fd9b6b3e4a6d39aadef8cddc1f99ab6366e326615fd0f7b8efdb2cd5f8f25fbf96b240d2b733e469dfbdc97b78ffbc956d2883227b432277f26e09fed4dd8f9c9dfbd63f9d20c905705083b4ab3ca8298bb1e68b5e77c514762fa5adeb8fbc9a803cbfb0b7760793b68bff0dbf22f2c6ffab7aee687a7a6e2517f3b4e237ffc1e4f728039d7eebe1ef94dc03f3d9642084104bd45f0b6f69ffcd12efe64d4893a72fe68df46130b302381129cb4efbfb8c17cfb715f00624e4eb8018d983315f0b1eaad7d34eac84ffbc996cb1ffec997cbdffdc998cb9ffdc91a97bffa93372e7ff427672e7ffe93b9cb6d2a9c211d7f30f77d77a537dced8049dc05ddee8b3fdb120e0687e8b6f7f3de7173deba1db0eddb3e1c0b0ed17df70644f04ddffb11430876f4185c77a96d6d19a5beb3d3632977bbb087d32eb76d1986b70ef60a67b2c6755dd7c1e6de3a58deb8aecb995375411df4f0e12373dcaa83ddaf419bc6626d59e69c73d67a2668e35add079d4a15279ee960f8370c721cabde200bbbdb7ed69cebbaba0f60337266666666264eacb2ef33b7b7cfea84b89666bfd5c1e80cbe33f83b98dc1b188a80e5951b92d215252a0ec837e8de0fb60d6d209eb74a59b91b7b30e6eefd78f1873d5bcedcfd60f7b7adeb38958abb1f0cfff6ab6e0883db10be7775b7ee8238dbdf1f61e7edfba0bbb0dbad3c6fd5dd4f6e98dcf087daf6793557abd56a2523566d5bd5c1badf30d686badffe7eb00eff96b7edef86f3bd78ef9065aede70a7bba10effd67530abb91b73cc685507ab33975ecdb56d343499931cc7715ccbd571afc13c68fbdcd168adda3eab6a3caf0667b937ad375707d37ea3e9b8efbaaedb345028ef0dcc335b10f7355d8ecbe23eb3b86d7b9b6de7bf9f2cb36d3a0c734997cbe572c58955dcd3dcee67ba8dd3b8bf1bb84396e940a1bc395607939986bb1f6cdbc0dbea5cf8ba3a30df97fb6a98458218a4bc68caa6a4d17c1aa343172f328b9628fc196729e59cd3bb218e73da0d619c5fe6fb79e670ea7938029a46bb9cdf67e67797cb6b28f127f7f7ed0b63550e7f1fc49f1e3e56af7a1f33afdf76381eac5ef53a8706f18cbddd9094b683e98befed60abef83d5ab5eeb72a87a304cf56ddd10a775300e6f1d8c66c5800cc6a8d3c15c7bcbf93e0681c868edefe72ee7dc4dd9e16b2b8dbea9bac7dc772097c1500430b43fb1dc18873ecc2938e4dbcc469234d154c827b62c62a4c3c632e5c9ac486c56c4c8ac880db32242769c15f941c54c49cc91104a4f498024f9b1e36c69cc0ef58e7429cc92d48eb3a5a81d7e3b2e71d99b4cd218ae4b41a44522c65bc025718b78a9522156fda0140649d48e3324b21d9134ed1ded286aaa1db2cca646664852981d7981981d6747c2cc8e18313b72829991a9ede5c80e479eb6fca4eb3eabb5f627067ab5e32cc910a7a51568f9d6daa530db5ea01b16bc61e38ade643f2b582262c3528f2648927841ab769c21f9610448964a8084c835d265dfec384be2b4f18eb32496284a596552a1cae5ea3353207ea694a2b0a0b4442949496906a516aae8bae34c0988120aae4444012d4a5208e3648a2e24f05451060926a829aa40416704ca56c30ceb73e3c88f2e47be04010597197e6e10433ce121851999228a5c227cceb0da954a313061ed868ff63e0949920d5b1a004905484824bdb0844efa8131469a81747474047524d33619d20e48b28e3e0dfcb1077e13fe67e9befc76c8325fded5a509e04b14e3fb63cb187566fca19ff62c9e45171db2d833eacc7ff5f8e36cc759e2032da143eaeeee4ec3df67eaffe216aa41871b6cbf11f483961fb7bbfba0ef051fa8062d7fda4f474f5ec51ca9053a425b30ecb119e37befb41666bd5658a594c2687587b99dd37e413e740c836172dbed8637b68e9e3ddfe7047185414e05e5a0e953aed60aa3d65a75ad5f6bad55fbfa9a8783583fed7d3c673620be6607f395bfd6aff85a3ccee7e2b78ff52cbe178f6940c0736840a800ce73f0923103da97f4e37f7c4e1f394e264e4ca4ec386322648795888913264a0d881174a4e5e7fa9528d6f0af4cbb82302f3ad2a0e9d78a2bd15c41ce51ca194e32938c94b48b83994f71083a4464a2ba9c3e1dc87539ad1429daf4f985d209277227e7366448e73ee717ce2eaa0e87775975387ce50e66c739642a4d214e8c19c38494a7a72609444a8ff2c7f62987905232e156f3cfbf8b374ed3f2c66d1ce753725be63a4ed56d9d6aa5b919cdda582c9f92a567582dced5dab856cb4553e36d9ee7537a365c4d8dcd0de77937d2b7f9b9e05ab470e9c2a50b17ef12a420e853822b3a1c2e634729650bce458b9e17f9c50b9ff2c50bf9538273cc7cc557000c394e1e59e3e48978636da9c3f843bc31f63666b1f16f1c6363fcaeaff5b1beed67bead7bd5c7a972507eba0d11606b1c3b7b057e71bebeedb96f23d25e7b7f5f49ff214aa7eeeeee6e048d0b2e2c2d31ad235610ac13288d11342eb8b0b4c4b48eb6bf6405b1fd25eb84ed2fdd5bb8bbc721f20c933e42bfb0725249a142a29485bbbb3cb2755fba1f1c94dc449ea15677774985b675d162a025c14558fbad70779f50780c2eba562c14f7ba171772ed0d5e30f6dc7d095b7dd8b088b6d7c4b67b4d2c28051ddad4c46c88b63f8ba866db44b990ca31467813b5a7f45a69adb5565babd75a6dadb7565c2bad34527bb1b6d16df329b7ea247392c9a2a26456cc9498a92917918b684a4ea7b58691ba61a4f0d49426b549d9eb247392d95654a452fb3b3b21ef84625c0ccb561059144416b58a5a462da35611954eb27b9d64f75ed9bdb27befbdf75e4e93ac1e1dac12a96a2d2ada9368be6607abd9b549ac494c268bc964b1f99ab983d574f7330d23595294b2a4286b8a35c592ba324851902223a32223a322a9b59c64d6c95a4b5bb23dad6d45b5a25a32ed5b625a534444ad2922a2d6d46729edb4ee96e22ced472917595cdc74e36ee66eb86e4f8f4318b1633ee22decf85e146b6c928a6965c79fb258439b502dd8f1e554ac813f7e0fb2043bbe348a35eec7253a8835ec478fc9e6089b176a9c68a4a041727df9b0dbf3afd30f6f8824e831edf9d6e6883dbfbacd0b7bfef6618dd39e4f371a299c0669cf9f7607bbbeec89b1d66038a3624d442c2216118b884544b4270b5f1ceec2173f0dbeac6b5dc8da6233eda98fd02fac9c5452a8906a9e46334cfa08fdc29e6f574e5325850a691a29c59a644f32994c26931549b162ac182bc68ad15c1befd75c1b6d3a1cee32baf1ae8d2b582b56f8942b6ca6546e16fb4bf78383929bc833c86daafbb2e7bbd67150e4aeb9893cc3d49849347fcc2221b258134b8a25c5926249b1a4581e87a3c5404b5284a462cfd7a46cebb2e76b2d067bfe4a4bb2e74b5c84ec290a8c141332994c2693151515151515add845d78a8562426159a4faf05ed042218b844823a9146b92c9643299acc50bce4527445fbca0b17f0a7e14068501c3a784716fd8d38bbcf6065bbdcc2997d11897516baa07b7a6c2d654d89a0a5b53fb13fa0e871309816e90fb3aa1afc3e131b0139238dc68c780515db1f972c532a01964e05366104197d17ccdf7b60f5fc2863b1bac3e9cc68e912cf6d4b465ae27ce66df10e1b0e7c71ba2a88382961fde10ed59b36fa2421e28758b3186a2914409e1c106912e5174a8c36814b40fbd6486256196c46089181a9352d38b7ccae8549546384336a84887316a84a0221deb144b803091611ab3e38c8909262298bc3045ed3863923145618a3119310561ea2146da302ec579b94e954a8863b198516cc88eb3189058094aa650c28223254a2801a3c40725504aa82871a2048992214a8228e991844c923149984862441222b268898a8f7fe0611143c68ca81832661c80872db93df35e3b2c62cc388017e94295b84cd5a4278b345bd2b46393254476a897d4b0e56bbc64862d9f6cc878048921c728b73deb9e73ca9c9d6bcdaa2f6885ea1fd80eea0fe78328fbe900fd0ed49fa14444f4e3ae1d4e043ba8714b0dbcd877c5bedebe363509d879db32cfb62e3f9a506a3bf6784eded26e49b7f44f839d7dce293dabe68353d217c0d63a006cadcb21e517636b547e30c09d57a1dc91cbce9c3b9755f3bf7865e34e28eff9da9411cf117c5e1328758b31364213a153d02de8234f556bef910c81418c71ba7b371465724b3006efa3600d890a1fdd4b026c5dc8d55198478834f7b981021d7a64f49c19e9e21db9c284a3481592798f1c938066172a0a47ee9411268c80d9213612b5e5638d062f3f06a5d49ddc9de6a079de112de70cea88da273250314001d9e18e9dc1d22a9d73eee52e9fd5da38ef95b76ac0b9aaacdd0e59050cca6c11e8cb8d391c349b06ddbf9d9006fb05c68ea9aa3eee8434d814bbd8f78b9a77b0d7a6137f78e6d87717c8cd97c61544cae0146a416885a01e2c0c64b9030f3004f1d0ac2c75e8e2a548051d66b870e122c5050c97272e58b848e1f2e46989a6a6261b845880ca128a0b08353c18a30466bee291a9f851470f20d82a31f5fb801224914487304f4ec8429becc89db0c4d10d50525042f4133f86b01969d2a34fb1869c9e9116558db2c491877e2e09eaf98a6d463bc250c24f423c65c1e129ca13932722513cd1f024c31310188a3030786a8104a8a42a7e2e91142f40c2051290587832f10d135b625b8cb60cd971b605c81612b48cd122460b0ab6162f926a71d2d254b528691122ad961f5a787053dc2b52158a10670993c54b96a81d675964599ab22c6521a2b7ea2b4d7291b12023a10a1555a0a8b24415145431c1143155a2aac8aa3455698223caa4dbef8abd57b3db66add4b420346ec949772072cc2b097a200b179091f6975c500f3ae4f6942e7d538d10dba18e18b5a5a4afe911f139a0232ddf3aa59a06a3550896ab06d2f9bafe576aa08e3a3708f6451dff2feadc0e7af8f01175fc65d4b95d50d6b69c356df3a0c773fc7b364dd33c901ca769db6bbf6d11479dfb38eae02ec833f6e072b30beaba0fb0e7f8e30e2625ee84f2d6c04e28633a5ff7f386efb67d0643ed45d858ee9065e8d45456e22197da6439c608e7d4f6a01e74e8ed5915223bceaa0421c08e332a488420a7903c426cdb9a7d9f4aa83d844e201ab49c433038858cc1391c8835eefbcb9ced54abdc7c301c21046dcff7587c8c8d3354665b900173dfb71f0e8efbf62d18f77ccccd6f0e9942a6513885d850471d7f1c1c7687188c38eadfbf200816c449ddc7ed333b704e552aa800a1f2834a0f076c01b385871d675ac26cd9b2a54a77430c541c2d410392154630c1ca143a68c161044a383c85e08984274b5568e1c1c20f5694dc80024a862c3c84c832031149b117b8c0890909549c10c4053a5055146159a1cad2966e8829504c8962cfdf7136e587294f9e4a8bf3a5aa5beee014c44c001c4b0b002cdef37c9ca4dc0c7c6ef47032e2347cdc49042d184e28a8c032db1705f74d682fa4361733dba28b8a05162b384bae15586468ddf8785856e0eebdf7622152d9cc2b53fa8a10577ab862e50ad3951bae88e08a0a577a586181951358d962a5c9ca0d5662b07282ac0a590a6864447032271912590d3211388dc9a242961faf59a5614a95294c538c4cb1618a08a6ac30c5c714228c352964b6248114176c29850552523093a2c4962db8cf6aad2da29b64312d832681ce4143318222a4362154825329258833b4514a23cdf677bfd93ee41fa52461d7cde3c3190aab83610678ca78691474f284b043968934383cb7afc712cc8bc69fe9273f5bcb03674d851d339d20d8f64bb0ffed4c03c8cf07d0f217a5b6441fbfcf9cb1c6062207120c4104bd9dc61a1bf0f6fd1837709b285b92335d90e4e6773bc78f33f41bff6ffc519bd1d932c59fd43a0d6389bfb8e9d7c339a930c676538520d8f8c3dbd7e3393d8836065556dfa8a93ec697524a29a5fb87c5933b50e211ce426b62a229cc8eb3262f504db2a6581312751cc634c9409b80d0fa848c4f413915688b03135589503f0183ef93a7274e3bce9e347982e4490938fce4c713214a48ed7712b5e5e7f0ab5d7ace39b920f69cb52066de09ba9eb3674f1c60d8f3a937718861cfc733831d674ea69cc8944879d2ba895dcf869166d130a584a0550385941360c0b956a06a11a15939f4a09ac9010ba77380b2ad728869aa1c64a8e972f041c345c1ca51c2acb6283dd06851ae74380a93d57523da2c4ad10a2865662814256e1c0a0fde8462a593130a14ec79ff8222a507295c76b883c303c8a9db6187afd5133d1c79c192243cbcf0a3e702707002c916a71024e9e167eecc9dfd24388132c3494c737224bb37080fd6f3a2b5df268254c141b6dc7b6340ea664e8258234250c50ea3ec4793287ec4347182059a881f296dbf00419d000942837ee2a4c99226476e932c3e685c3c8bc3207327d9022958522244d4095800f373230b8c0c41840a53beac10c5cf85a1050a030c0fbad604c85eed386b328409143b7c6d4c729c34e84fcb9b9a6188248c48c2e48932495696b00045053b50113881c568f7be90c474e145031ea761a5a67d3d78acf0f3c880ed605286bdf75eaf95561c953ffee28ffc5e7b1ac07dcadcf1e4c989140c27e04736bf570393b6d7d9b16340b4b2ef9c3c1bec3880bd7d36e86679c9d8da17e96b9cc762bea4067bdb6cced65ace6e568533642b183e60d39c6d87e4bcba58fb28a927e50f99d7a8a4ad75273dca108d08001080024316400018140e08442271148912610ceb0114000b69a4365e4e309389439118c8812044511444418618600c41c6186310a2b91a14fd6f601a62ad7753c9c3bc58a4ff0788eab9d76daefd9dd0eec0365194d7a4083f2fd6c08b980fe9ff40a393c8e5d603b9e0a805af0239f9ff752e152794c7c17d40dd01566c1536dcd1a69b2499204897b413a9637b59d42075cac9a50554c68320334519cb9dbe48e2304c95b45a785cc334a37797aa3f44ef5d7174bf1bcc3d54c65e539e9043da3a70254bb09fa6c677acb54529930c1ec18cb7b60249c4a706c51a5242bad83fe08b754f287f30e2f328a579b14c462b6f11c951664b884b16fccb4ee122ee20374426bd56ae94e802cdaa77b3e83ef8944bba09281f6ecacb6fbfe8538e50645b395bdbbff42f3e1e2cabe9e597722b9e46431bc1975a62244efd2d0f399519d5cc18b0a55f8a286403c413452b07fae00915d10f704d36714b854f674bf25a073fb0040f5a16526b5a702fb7787e2330ef5f8a6228bdab449e70c92dd3ad9fc3112cb2c949cac87305d7dd1fcd2db875287fe0fd8f6cf010c6b32ecdcd8997554f66d939da2574c176d16faf97e2fcad5f7a12727bf405284be6ca6e3953b798d0b05d4d8e86ed99bc5f77f2bbff62b510838973722041e657a78e9977c5132f3d754fd7e55db1e059e7934840ab2687d7dc46883b4e49a9d969f9c0fcc553113dedc25464a903fbc1798f3bf539df16a3cefd3bc3b7a959d4beb73ffb3b68335fc5e93e8a9eec3784889ee96fa4e54e10f5300c93cfe7c37da17b4a5fb1677ec82663aa201a8c28304b06b181977be7f70a4a5dcdeb6e2573eb2305589c12caa74f0ed2d261e8c0272c25ab0b14c98bc12c16b14574b620123a6c30dc151b4760e69d878f2dc8e523cb0c33cab27813871656437580bfe6e6ae1fcff9ecf4e118062fdb12604f0125d262fea2d2facd4d1da5393024115b990ee8f084feacfec455316f81366f436c95f1ec74ba0b34286bccc6dc7ac481101f99cae6bd18dbdc265756d660e49172980593f396212d724824a6658d0240214ad6e2446b200a5a35d0214de04502274f8ca3de702a314dc04446f555be5f01c85b70ace063d3038cb05da9a32cc07f3d67a509df21166fec5f3e1fd0d204cadcecdf3e38b5038e03c36acf78a13891722f4c62757d7ce1b9725080fcf3329f7c6571f0486389de86ef741478b98f755814bad4c458846216f21fb1f0e580fec3f22c643a16b1f73d200d504dad58e855f26360c665768c668a05c4c7625163a6428dd3ddf84cc0eed94791a19ca489691b27b1cca947bfb0bec06b71d7456cbcee267e5fa10d33b1a98924ae09b140b76663289345ea16876d1e2c7a28935b86403b2211b8794a88d225c1762662026c4cb2dbc429df005cb26d0a4c723a45c8f205c9b6de62709a990beb463cd8bf49c820b410c33ef542420521a4f4bf20eac3f9786af8ea6a0f67448f29c3ee8eab045e3887e0250a37a6d58e753fad466588571b53926980071aed91ed52c25fa3d020544b42fc44933d78f81b272bd730805b0cf0fac05fbb693f72629e0ddb3052a4f625792351b5148115f48ea1ce94f31965566973e75a2372a2532dc2fbd5cc5ef4fe9dda279a0c6c8ea54fec368d8ae480a26f32aac55f5103f01e2aaaa98370a732d07e537d9768e842f1c2390f1aeb6f9df92590479aded61e2834d6d5763250f0e55af2f8d1af62861366c6731163afc7dfdec0d1b25b992f713d1b726050c501e6775089bc4d288dcdd9ad854cbcfbcf93318c6b038e52c277dfde5889c3c7cce97a40a4ef8479f2d9e3848f79822a146ad6d96484059cb57db67cdca96829c93f2c98c04e5f74d503144cd333c84b9584c773d4de4c3c217baa0e403b9810c2a593fe4f4924464d8eb47b791e4ca5a87228a5e4800e2ab4c25f72881bf36e8b8322930c574f41d008e6c794e618aa4279c8ffe991bdd425860f835c47057a48b74db2589dbc3fdc43d052306dce95f208e8ae0a39a4f69f067dbcb7c559172d909315d878c886bf15182bc800cdef73e5a32c9b8612ec88a2e3b8e2b19c6e4c40d8fa640b12134a8863812f1a6953de463803ebf24683d59217c5291a0822f58a6270176dbb6b67a650107465b74622921d65bdc5e5d9ed7f00adc7a96f5b9492aed75f1957c564b35824e8f4879b6101cfb614db7bdb0ee15a6ec6dda1bcbd0d69ef40b384600b0bbfeec3ae4a52cbc73b2ca20f52b4a267ddaf5ccccde5b83b5f0a4cc52d4d91c696e3b9a9987c5a7a686da39ca523c72ee8a622708616ac943fc0666b7d0966c040bcfe6f1f98c0206333fd002b0df8896a0c41187c94016a06baf9df7cd5a6a4b794197740927a6fa46059545004b91f6b3c50b382170497b4041beeb71bc6f3765a381f27999ce85f12e0026dab703ec131e05a100365abb95e06c449f52da85a375b7bbeb56fdaf4bf02cf648fde42f9ece010100cc4181390c6431525fd70d433ae41cb619b59b2d39242d1f26a5f65f94182be932ad5ea6a108d8c64b4168351a01bfb797d7e29731314db009397d2d5271efe6a494208c541bf7c29a6aae2c977d4ec7f290f474aa3a79a9382f130f3f4c8a619fec3345a4e30b32b79e495cb4a19b7d1a433a571bad3f6d436b261cbe0cc122f37268e0a265102646db8211388b24aa6a4ac5bb79b027977464d222dbc6e9b83d19f16d68de49909069836263cfccc6016fa3779fa2be9a09d9e13451586fa269bf64a3a68ab076195d50b7564d12896fecc0f14da6ca4173b8e16a8c2d7006b4f0601ca88f5a11a39bd97eccd8eaa33b592b2a1548bf39a592960464f0981ee9f2b0fa0f9a21930b6a79440f7cf1502e8bf680b18eb5352a09be7544057dd216207d2fc442f2b6d5929b4e6da4673e60a03c75dbba0882bbcf4b6167da1ebc401e4883079e63787fc53a0f68f93f34dd03ff84089085e6a2880c1792d2e194f6022eeb3645b1296dedf25dd0d4118578cc6656fbe3ea4b5cecd04e7c6e00c5969a7132355358eaa30116ab27f557bc6e0b4e8195319c83594579e4536b3fb03e3f598fab6f046cf1a775ac6d30bb66be209c3505a46d00da3146db55f4c650709b70e990abe106eb3328546f3324619ef4473e9efc9762d38d6bfff096f6a6d8169d82f51df7b1f2afc65e673749d56b277332b43b9a27366b8988dd21a14639bc69194d0e9e78e1ab40a9ca3011ded35dc6a2791b5f5ac243fb8a6075a54585b08d51d384efa53afba8535ded23fdbc90bd8c83527489fb5eef3a4eee35edd3cebbfe2d6ee39b6496be2a850a1787faa9abebc377ceb00fc8cbd06258e2522eb18f0a379b9a2ebce93937ecd43dabc96ae6812648be0180d2a674c60d4235e2bc170e8ac395962a031a8e070e81f87e0edc5c6cb24b65b4819b294cc7771c4114198f03507c7f42f713c91f3e6915ddd5c37273fbbda380930ec1cb43f15a91281ffb355640e324e6ab6dd12204c4532733d766462cca9d8e74458e65e93e30ec6eb3a6a5d9123120c292321bcd1d35c0c22e344331f5b346711b5213fd5b4409669f4fcb4d8e3f5603fd7c276d64439712134619679c257738e89859c2716d50f71a2a079bec86af526c2f7a1ae70638b01dc391201ba62f528a1b712cdb894bd00b0acf064e4d163bc3caf3d7d9c5b9d80fa53778d714894a51644b8b8fb667e7406072dbe918acd8ba452685ea43c170021578bae38973770b87861b1bed2a43dacea42da8d49c7cf8669dbc60c2d9dc6510ac39247800ab3ddba72b79c632a4908ff9f5b049b27da50b1a0e857413a736563dd4e08b118ff7c8a2754b8d835a1aacfbf9029b29e9531c6825e118f30b80f8ccbdb4d31d65f9f95fa70988af86105372d4eb7a915d62da2fef2a567780ac49b4ed9f414abe65a1809824f707b32117feb2ac90acf3814f1c75fb85f9bfd8c4c98c6d4b73281b627164c414ce09c3c82cf48e32279756b1c59864426248259472cf29ba2dd8c9f993a483703a8283ac07d9be23fc55c836526e44e75fca274dc3c162c36b3c1b1f93d71dc2e4363b52e6a692bb98e050abc71a3ec9445fba113b95d6695530bc829b526ec93b026eff1cca814354768aa74c37e40d097bc70ecfd62c02fa840483a648f2855038c3b25f8b3007a347f18f54e528476a541b16446788a450dd1255b795ce4ed03f0015b8eac0eb71bd110eb77cb54374a0b307dda7aa2f063d3b157bbe6d271bfd5f83bbc3a34cbd63c4f76b8cb5f4a959819d65bb38bc397040ba7c23d33327dbf09fab1c14528b5780a809c648f21b249c3b721f9493fb82d9d0070fb6e6d22aad81581f76c8bf6711434bee80f1352750befe5798fe4b74e19617369e558b21832d098ee6f09f5e5a6c868809c3c70569a963205831222dd6573c546f73d808d24640fcc2e5079aa3f7ae5ff20ea205ef05df9048c2ebdbb24a16676d9b5bbfca83ea60a00db6c2daf0bbb5a980f01bc135b772a54761f26659f130a6d0cee07b3ffb51e407ed7086f275335d3439071c5a7ed26191c9bc45431bd04095764da7c52e1cda4a692f516e450b169319362be7f149b2a66d4094a3cea2ee4bb61c19d59d16eccdb3d651a246dfbad0eae0595cdfb4430c598f7b6dad42900d5640993c4043a6ec435c1bbae497c87da92e82f5014f23b04f30d87557e41abc3e155b662ad73ac56341ce3cb63dfd7f27faabdd04547d7815830a7d0a926c2d582b9b85ca54bf3228f92da088142ed4093d8c18ca40385c17f2bd3483d2a37f28477cf3316ebf04b5daf1d4a9e4c067bd68e3f737beb7adbeaf3639349afbc6b7f84ba2dbfdc3712f720564815119cc04fde2853b8b719786d3c8d433c7e4392e0adec47fc1e227021059669156b9712f365092495c0457c7e78b7b088e633a138c300c739206354e5120c9856ecb25794ec3c5e7416d099ed17351f1e549ea8403c67cd0c463b0c347302b9299c48d22ff12b734217cbd625a6de302b1771aeccff6696f3695302f87779eea66a9b8cd2afaee0ecbf9aca686b3908d5dfa87fd22a87ff7bd00a0630c52a73a1533695e15eb637005c807f5eb8525a25ffdb54e693164aa672253b4a47a2f399fe6a71d5564a73ec63e6781aa6f78b226c741544dd9bc5597906cabe136ed065f3cba8993c14170ca22a448ea80226fccf640772d170979061262ce50fc857d8bd74544b20f524f85ec7df20eae656e40e70b74831713245250d56ba919295e7aa146e4779ba7fdae62d24327b396f23a5780b0cf11ebd63a39dc91a41ba95eec8120ae1654003f8b93834e77a03c2ff5e26954342b4a2cd3ba3d65b99011c42a691b8c994fcb882fc614b2867e40f1496702d8186eda3d1a6ba64e23b0e2255b1afa73041ab9cad4ac29025721828487f92c6f1baf4ca659fc21fae421b76e7bd8f466b25348b616c50fedb2174fa96935d30e032ad3ec08ff0ea6469fde8d8282a374bf4254173797e7d429b62b36247982cb3c24c6fa40071e0132f7bc29463fe38925b010e99d9ea833ab3b9355662e1553b5a9055d28fd2e04cac43c3ff0cacf1edb604c4121f93b72eac5af54970faeb1ceedad6ef4682f03187b82a4c95689263c0e92f6091593fb2d43fe4b9d8c503539083e1dd93c7111e08a92a030a9d31c86eb593a698fc11053696da15962da6ec54b33746e474ca0409e28e8360bd7c3471f72bf16c544e8905365e44ac53949c775c39033ea2ab53b963f64647257a987e23def90453a36ca669a08a98acade3ddaea87c3f96a2177e651b4e0655968656468e864d1575b50c71dec64879997cfa054d036fa5b776b1f45586942801e8dc9f86bb3fd451412486d40263c83037c2e36f63d29969d21fd10b6d0f83a1162736e9826b5e9030e40fe93016c845e2e0a64b70017946741d4dff8cbfa6ff8c5a88cdf9097c285b37dcaae9b4d594138015b96b1ceeebe45fcd27c7b833887db4246b5dbefe7048a9e32b4ea4932a13831772944a827fb94acbfd0dc5d0baaaa356a7b0e19ade914e47bffd048d9e849a5360bd165ada8a554d264bec3382e537b697b4bcffbeb108932df8c0401b45889841c841354f9bdb439db4b42d758c17d16e41493e6ed580c36820d85643d871445299ed4acd1338d62826d2d875a55be60f1a744552ca17a3513b9c4d88ccf23c761497b2062328c840e48789ef56f422c7f451bffe0cfba396252e8741a07701bc51ed339e8827bf9e39118e85c0a1800caa7281101cac3991b76f49a288a3740c954601018e9f5fa5eeadf0ab27edebfccc23779e04b5183850e4564d6f4bc6af2248bfe461e1ea6e8c41ddfd393119703812e434c153bcb6d10a2799e090c0108e289926014644d929a5a78003835b3ff9f998aaed2b25055338f14295391d384fe859cf436f8e64b384b83216ca1ad73aecd7e0682bc4525e700818a3f88f8ca69cb95e2155442a8fb66316945b0f7213d0b64aa16b7b3059436d2965d7ecc164cd60c456a60010e17c3d6b843c527428cd7410aa25c215b8702dc5dfb1cabb0c1317a107c951489d4a83eb993a0a85829a8014e394ef203412619d6fdb0f4a5b48987ff32a91163d8fdf42048148446ec816569ee893bb4fead5c504c8b317a9970ed20bd424eb6af0f74cac4974c2c073e0b4c30e4511ba194c748d6e0a928cd39131938be245b5b9c3035f7fbc195fb7923735788ba159dd62c8f90e1a26b97db389f7119a4ef5b5e91cb3314982779868292534a05d2595d7249b673eef35f88ac4496c676a74c7f1d7af66f0fae77e63240f02cfed63296c57f280c07fdcd1a091dd4f1096f8ed5fd2503988099c670b635015eb2dc76bf88c20e48f0bfd76bf65851d4ec681fdce39ca7e508ed3a012582b3ace4ee5fc3cd4dfca60a4f8c5e60fe666dfcddf7cf5df66b94e9abc3920062db9b28ababeee483fd1d404fc460f54eb4b563e53b01dab1fe951745fd507cd553e43ca07c65a58e2d60fa160e2dc14c2708b8eeb862964fb254a28ab5c9a2cd68cfb3a335eb52e80e3c6ac2b371882a0b7c63f1047ab7af3b3e50cc43777849ebb92cf0418e687c8ef09d64db75031208de34137c24fba3de254633073291cfd1d673e508f3c5091c274af0539fe91a3bb2708b9d5771e78ccc2368a2e7d5672be6ddba4776bfdfb20e1ac55b85e190bb40024d602b052bfcfc2a7fc2703cc78ef1e6daa4c85e50e86211f19f2c8236bb0f9c87962a4e351962b8f92207b915a31dcd5227d01e2ee00c71a63706bdfb8476f5f20bd2047ce1a754721c3a01d5d3277ce2257f761869141cc0ee2cbd69f784ee9a9fa0dab81184f3ca7928d064a7a0bceed0c4f2b85e27eb08b2d5c0cc140522c47530b8298f709938c5f9f91d0cf03c489c7c1e4c47860b624716f0f34f13a5307320ae7c5c87a59ed132b42d713077a607d80e93031913c5c9c206ecc8094db827a1f7d68ef1fdd39530844cb085e1d61e1e93bd70f4f96d04b87890971c46c1d95fda39ca8b4f1cfe6b6914c00271913e0e92fc80851431e224d1807b365ae62c1bedfd3a5a44f7dafd21e3c51d1bb0d0449c9566f3a116aeac5e86c908ac6c67b77f0897ba6dbd48b3e19996d8db590b7215b128d8b2d123ace791f4db2df3389c5e40e05f2f2284d857f8a8c99d94d14de8821c2199581c46c48963a4f6f84fb8de509a259aaa9ae53c9b1f99d06af0ec15449c846574e28460d2627c61ff666e6f433087d97223da49a4cd6f5d8850e459a556364871c3b02618243959298efc4426a48f7a1d305c48bdca639da1b7b20205d87cc146114c435414113640c045ce29aed7895b3dc8efb22204b78c4baa01f74ba3dba3b9e484617d6207472337dbadad879a39da95ce43bdbb10223182985d749468c3be27f417e2d776a9ce54527a0ed77414bff5d369d4d632f6bbcf6c4750dfcb943ce41ff799060d74eb2081886558d7c3a884b4ba368c830cee1852740c319820ce40cf3cc3bd0935f1560613d38485c9ac1182ae6eab44e9ccc143318c43541a10962a00424783d840baa1087fada7c074c707c70adbb3b85b99b90a2faed1e2efb44e8fb94a5edf15850585c7f471bfd4b41d6a2bbc0a7877519ac9ddf565716d6d62b2fb1505e4913d3ce3bf5a0da0b254bee13e002765d7a46a1f002a792387608bc5ee314518abd1464c6dca2c25c4c1d2cc3d132e109b8c709d64834bf3b49a19f846444285195634e0acb640b9c37bf37d2edc7e6e89bd63f12c0e91af1fbd09c1e02b14de972369272af50d2b2069a35624d5a20774136d2020a445d574bba6d2c45c1c17ad9da77e1782cdba5f064d360821b520e8c541fc402b515906376190d12a85bcb915be0e352fe96f24aae03c49a0c0b5793ce9fec57b3987212af8184eb4ce9c7d3e27c671fbc8a8d626513d8619c6c1ff43f545400ffc48ccdf66b16f10aefae50f12413729068428dcab0e630776aeef0e18b0792c03ea8b69327dc2860bbae712a982674f141f6149fa8d1d4558816995cc265445246c78c4e15c5538d87642a8a5c13c78013ce6895b2ecf6d18a84bdf2cb3b002919c0204156e1355c690582e94a9d5fb2a6dad69e3e881d125db3ac473e6dad6e1bb387e863f1ca5c39266debd4811fca82f4afc89acfc6175449acb4e570188761bf3c1bfb7e691d5a882fd4596196ee193221d8dd086728258c65721c424c707075969d59eac24d21cc8e8dbdfc22fd99118b7cf94f6511cd5b096fee385a1e948bc5ca0d4a7972588986db58f4971f47d6c00dc4b5655a29e216b3aa06e903ddc5655a4ace927a84224962b73a0aa9bc65bceacb230420cb518391884cf15181fc312aa350951ccc22a7e4c1dc0ec4608796f5ee0298652a19cc7d775142ae08f7aa4452fc4365b4e4f406e83c5d5b9f2dc96812122d8490051569daf5e8915f3d55ab430d258d0276fce081d5052a90aaaa5e9deacbf593113e3ff2bc3bb09a28d3b68f88666710dcb64a1580a0fae1e5f761e52b7276a5cb40d2fa72a2392358b8151ceb35f4c0b3e46295664639e13a7a2086694b3b573a7a47c1723e9717e472c8245a32c8711b87dbe83d138693159c46c8e4b6b92a696c296b77c3eeafe8813a4fa8c5d440b79319ee4d615294622f36b8e627b58df7c22b831cf7a234ef9906ecaabcee2c34fecb4cbd3c9d2e62c6376f9edce12aea7ccaa4b2067b08b72cee298500958e56d3a3a600de20cb390fc1660cb056c6c2343c18b0f538026efd48e229009041a0efe8b73262fb73128059858d92f7651b3af30e2bb150f23b326ca94674236bed816ba323309ffca57c6a140d105c419f4efe7c91cc0ae89f1614ed9de3e8923e7f47755920727b4027245a604b2eacf3443da9312a62cbd8c1f62ab7f1cc154fc2c45d63005f7185ef2430710f9106258a46d31ef7c8f07417ae0e6479ef3881c680439b81ed0ace242252b990eb35399557d538353d0f25034d831a930f0dee869f39ae09133f2dc44f031976c9cb594aa671858447345d12eea0c55d07d440e494412e190bb932b6e460b61bcd56cf407326564fb7a974da6df45b34965cf51b1a5f544650aaded375e77e8bdca68983ec3918906168b8c95fbdd1e6689c43526cd62f6586dcc8fe61cae43cee7440bc3b0ce1aed155dbf6d5b97bcd6fda7aa1639226ab01e4423c2e6060366ce87e6227fb265781a4a8514e4c4b0903b60964450fc7b3882ffb8737e17ff31c330d71356419397375a869d6c305e7605c8e634d38e99ae0df1baf2fa921adb46d18e9f11d08c4596f202652b3afd4872a5db22f52420e79ce4b6b60a884cc48b3110faa4771e7d0675b358a2c114381655c8af4bcd509d75e38d54a2daf0cd2b572264bc6b12a70d45cc9dbd9876fee6405efc0b5a39bc28769c0f6b5706d3118447ee7f1cde0a95d172d5967a1d5f0b3ab5c2206bed6cb9823ba8389272bafda4b010b1b57932f1423f5493fdd02f56507d0e61e4eec127b1f71d5c06e70a75af00d528a2b65734b46247d226b9049fef34f5cbae23c91b0c02df7423c607db862987890fe9794be0dc9626e0bfcbf7aedda6d2b2cd68a2bd20e5c9eb21819400fb45b01bffe61a863321a0b6d90eb81096ea0ad50a3fe0487685ff5718da581f012da094821fb748b8389d8dba40e455d6b52958227a7d28256b062ae5a09d7fee71eb00a4bfee65729c0a4d329e7f5063bcbc98220f395867f2ed2970eb73b436f48a53b1a660cb22c5307da0eadf9b1cb725bcb2ced52786c1b2a9a0022fad7d3e7c7e220be05e38680289cb8609de0a3c9fa88280dbd6fd929ba7bf43e998e5256494c4af408c7124f08f5a6870acc8c97a7e93c1699bcb223db978693fa420ff1a7b813b0913a941d2168c768b9f6fdf2f7c380b53b4dcc048095a5826e89124a4800b17d49790f5846d9906a70fb1c0056068b11b64f6d1300e7e841d40e2a995cbda6986fb16a52cddbd576bf3fb140d95c35ba426498e00907fc6080d7ad5f8d26c6dc78e80a307175b7f84353715d8a6a2bfbe83cf26845b0c812dda30901cd1997b40821075714dd33e0242240eed0219172e4b901b4c7f16b3b9240a3591db51aa146337b65bbe31189663cdd794602f592ab7d6c863553d0b27ce4c4ec1ed6dc62ba20bbb6ab0331eef3e0ded02b6457763632415ac0c63d5684f0e8d4a5924d2889ae1d030783416d36f574b1d5cbc75eee97caffd1f0d896fc27b8a5e13459d3568e47c4008308735fe36e0f058c40f819f82861ed1e5deb4b95dcdc02c79d10016a415507a8a9d17e1be321387405e2a7afce457c062af48560cd3ccd90dfa390066db899ae2c8492c222ea3c73dd4e0820a7d602c176042c09160beb92703a8fe2b9ea4ec3ad6e06487250109f0b42b457f8df02b0a59ef6e77be4a17a5db47f4fe7ac74c23146e3aeef86b214867632481e2d1f0b1d1090c9018074ce731642fc3bfdfa57be016dcc5c6c82b0dd8e03914afb804d09fa8e018168e92041c6827af76e238210a24e387323018e97d63f397e0378e6551a8e916f23fab7780496d7ba116ff851a1e54a7f14f673a77a9a0eac40cbc9f4aeffde6f00e8029b79c95eb111594ff0c4c8dbdecf2d80f8b55a874e6b8bba25846d84b9d5c630848617e5b3e0651e2d8fb7abc35e690110b9a6c0703b0dc3a6b2c93ad5c82654bc9e814e0f70f8038a465f4e4bd09c291cf43577a0b6db3fe19fae4f88c4f26d8899c5f49733a48da9b6f813a4f8c2034f201c1e2b37b8c1e393c84c97189aaca58f3c8f6a7644253d538ddc4f0bdf26a70ad6d38a23f35226af5feaf346f76e15a6a382f62dc29f8d7668cd2c5777f08594dacc2808efcfd97318ffddcd9af8a887af940338823418549753677643c407a333fdb2933593139b7914295e49619cb8525d6c362d1e73ddb192aa63a9d29b7d823af105176b031fd5e526e81fb00cc226fd8fc164c14636cad0299523a4cdbe800d834054c9889a0a228ac0b8a0b04cc209defd14a0d709875c46e2eb8652a71b52462f549ccbcdf0074e59aef0a859d92c8bbafc9c0c7d6ec99a7606e222211a520a87b5c05b0c6e3789e777ae6d8af4c9ec1613b961c0f52655e3280b99d5e918a54daf2f20428978de71a54b5b26e09f8f5642d117b515a8f6087717612a12dff64bb3134de544697ee0857e74703751906e091369e19093ef48c277ca61be316146741cbd19ecbe47849d3c6d4c11f66ee589b498ab79dcb5200d98e0b8a81fa4f5c99b45ca8b847082c0707459837e1012fcc5345e60828ea71508c24b2745cdc16a87c40d7a6f5e03d2ba54e6ac19673f30cc4a59cfcac1d91eeef3ea6353e2a17959b570acabe63b8d48814188025fd1ef42414f3d4a91b6230077c0c16aef9cbdec752d247e1653d0237a14608f284506a2764cebee80ad3608af65940d4b2184c8b8c50ecb366c200844b51233e07a1616e37c58a3c47ce2bf5a4f9f577f42a2d45772d9936b451e0c4f0ef650ce2de830d1a1921fa4c60d8bb161b16229285c4abe70cce8ea533e5d9733bac385126368fe385a05b7d44ff1af49c5292e73cc691d92e3103a6522ee9c28ddf3f5e74d78e74f8c3448201a8503c68225e0a0c6213f1e87c4040c4436cabba12af8803bb62b1da22e4e370f41667b8b261e7f9a525ccec03ebd9391876ecadf95b1d9fb9446aee311c06e38ec503a6ddf70b0aaa87702a1b26227b422618604dbfe438bd23fdfb6b20d4252a3611e45159d1179a2595a1112f7829fcee2db38a9b011edfac39a3447b43c1415ff62f7321de69377594e0fd623b6b05a2aa789ce61e836ce21eff5953f9f015fd6706c0f258c6808c351e2d6e2d2d8e15232b3943d31abf1f4bcd8b12e93e1f4d95d9f0f70c94159969a3e69ce7c43bfed9b85b12b0cca0a6393f70c8b860bbac320b47846a092812d238bbfaee2dafd826fadb4281bc963c4ae406ed293d86533afc827b4e8815fa100594774ca92b0ee23496be36484c7c56711e29047b3aade5639fa64853ecce951aa14ffeb5d240e8c338c096a2b3f9f487c42d23d3c11b54e7ff933233fe41a35540ab0cff880fd309eddefb891c8cd3b18667f8da3c162b3ad62a141f77961d9c5bf08797501f51408fd840d3cce3b5f0bb6b9483033f7f8ff24f09974cc9a8e3ecf3850fd82635510bceca3f52db8ef37871ee47f44aad42f34a3eccb55e1864ccab77826a6ada03fbb3b39fcb433b39db9a3bb7b5fe0a9f0d8dd34c8e056319bef0a68486a2756cc0aab96a4ee7cc4017e8ba05fde5c3ef39c3c8c09725aa576a41d05f2a4b0773f75105c11249b8fb4d60eaec8c06c7a3c054a154201c5b5aff657ea143a76a66d9b08f0a93187502345743c5a30ad0e07d9ae03a90f497e7ffd42072a9b529839dc1a2e8896a29ac04de4da78564fc08bf52f2dd9532ac6ce96f9781a4efad65d92c3f6c10678b42d3c9f1e5a54275b7570d0250a80e67a349d0aac7304d803c863a27e0582ae1cc8a48acf7854ed0c5f4ba08fa49a52c677e929f007e427465f2fc6a57ef7ecc10dc1836016f75ad868ddfde466b0751e2ef50e25104595ffa2b0fd2e83096ae8f6762b7f9a370b8f89ccb8a736be79ef18d4fb2431edd0bbad148c78cac8b0224e746bc0737eeec2de194029a1e177c27e7b0e7ec4e6fb0841741f6afae6ea4d79b2a4a0b325f348b33d6b3c6198620e13da3e7dac207490137e92832391cf3dc64729aee4004507983bc685cbcf9b566e46196fb282dfc272cda814a42ba6cb345a15995211e2702a056965ad3741509af193ada5ac33560078a3e7422222b7811ba78c745c0c1da06a6da390d88bfaa55bcfc652cec9080e6fb2d642688230d5e4bbe87f1615823be8572c890ae448a90bb361eea7055bdbb7847b50d6257e95321db647e5708a8a3d24f41775952e5a492c93b6d63c638e997e06f08ae86078a4613b2dbacdbaa0cbca9f7b6c62647eff548a59492854fcde304a2a192094b794ceb718782f6bbb536625891e29ac7c6e300b10f46427776bbe9fa53a711a4dbb4fc2cac180d8bc7b1eeea5e0cae6629a9cf78e5886948a45355077046819ea6b7bdb73ab9c603e161a87d89b77c048c288e2d12f01ee5b47ea41aac3ef257ed7b4c3c85de7c27ffeaa1f103e20e0f396c092d888bc0b619921b2bb8b8a4f098b5ce166d59e4dd39b684512d00a89b9db6434ef4a0de7f9f43c1bbcfebd6e9385a326aaee099bddcdb6d3b26bc2aad387d45840f1909b2ba0796db628bae200e539801b4089a74b97cc7cc3c88dd516d6859d57416bf1fb518e9ddc76f3a101b9168c57a121a3e2a519e17b271929bd87228411eb73d7f485197c12032fe030d6d08593215bb30826d86896dcc180d5597650dc0b29d4750d8ed4965cca6cf573f3b95f763b0bf949a9bd3e9276c2f199027e80a7ff9218473e03f73d350b73680eb0ce9099822652227da349f01b8b1c7e66774444aad0afb6d4ae4b602a1f6f30cf7795fa4f06e764292a97d1a0879f8efad3a45327536fb9bce7b5bbd16a889692d3bdf31c312652a08b761bc6566d2cf639b9a58db1e9da17cefba5ab2c176c4f317bb22fbe01b9007d382ed87b1950ba38ef962dc1cbe9c5ddc6294ff35bf8a6a06da9ed97ccaa387254e69e1efaa996511438d2e2d576810501e543b74f8b24b66ec9649698c66e27e2e38f96b6fe662d0feb96709110a0155b61cfaf6878b57b0f51b89225aac6990980a371b27b2d2a5b7730672018f81b5d928c77696fda423760126bf601254546819deafbab44549d6b900f16906147bade46809e54f3a897651eda354728141b0fb351e916437645b19932467694d5ec1cfc58637e313fb842894f9677608e3ec40fe5ad54839d43f6646d7512d2ff4dde0f268650205b4042563c6efafc07969b013f3e0e6bd8fbfbbe741b30ef5b3b89977dc734091b634adb44af2c5c511a8ab08bc77bcc36b85abe69e985b6e9fb01ec2d582d51fdd10ad39e3e8a409f1f70d9fdc0ae046d5df697ea753ee03ba4786c020778d0d64dabcf6c6c93c73217cda3d7738811da8be4cb32ed1c76d2dc9b481ea5c91b6e25bce98255d4c87fb8d688d423b5de21d4bbc66764f2ab9b925eb81b5e4e79ee8f011f6e49d95e15fbbcdbef90c10cdb1807cbd9c5d96b978180055286306674b0eaf72c15a20b5aa7c7817eda4046a7eb9fe2603d4f81eae58b51f0962dba7fa088046081911fe9cd7c685c3b38e6c41c1cf6d7339d5a3c5559faafa4b613b7c7e02030ac60fbc281bd9928107b70248f1502111107ad60207259043d56f2e0a9e27825281bad2d18f47f546be69c4d423b54a8ed2aeab98288e8d35dad0676bc9075a93334e03fc979c7cbc9e580108aadc9def3034f3f0a29a59fef583e4c71d0fc4e2e7f3c66b70d490d29d32e62c6da4b922709d8bb7fafae3f495e1c09bc995200e2c33c0d7b983bba9d0af54a55e441444867a10a611504138a0542142eb60eabe5745aec4c53ae34c740871aed413332dac7e92ae6c85d2036566533777cbc408d2946928dbadde033d8248e06a085c4b14df86d2cdadbc946fb5e0ce6281689e5514d32a8068598706ee4f198d0f9d6a4500363bd5bbf4d22fb15dc80108c1c033d3040490386a2829cddfb341c9ac8389bbe37377ba80624b780010cbce0af2036be81f4b7ccfa6cee8d2e42284cdecf600da5636255defb65470be8b0b901b08b2771eac002e0795a4f62dd009c81c51a21ae6136a449897ebf499d7554be3c2ae9bf4449632c4085c6a3cb7ecacf1936b3fd4bfd40ddecc5e81d9ce1cd9f9f8d4a7268dba26665cd4311d006bafefc68288799e0d39eb392500c3c4e7f7ed814dae23d877c0d554cfb1bf4eb3b34ade04412ea2883d5dc535726c91e7b989952aa41bf58924599f98de2c4c32f42bf449bc7cd869eb550743b24d03560ad9cc89665baf6d471039387760fba218f79b827a3efa2a52399735064c410116f2497af50d66f4b4e14b3eb0dfa3246332e1ef3d64019b84ecdd85bd756713beec08614a95ffdd92b7776fc3b4c280ad87a26f64c78addab6b03f471c3b582acd9f232389b88db374521933b919a9e730f94c31b2e7531155b8314b3804c19f33b8df806fc87cbd3239efaae7d75017094e8b5071568fb20b748e644192404834f4cf0a7d194afc47c745e50b6b112457ce50a3f5759514924a483866b150981aca786a17ddfb81680f616f06b173560b9770ffd0c32e40dc5afc50ce65a807e45606796696ffd5543d08ae1ae01e853229a763f3d3654e9d7fcce0992c28241eeb47f67e4fef300ccb638206af600fc442af8170fa08223a46b75dd83cae7c400974ecc4eceb9c5bc291a66b96407a1c80cd7bac733958b86000527d55ca83161223cc005eecdada6187a91c980a18c10a4b706a40deb0ffbb4d1a2b59e835ffbe0488a11a8b78409a49091d5e2e396277e5c5b7426730ebc630a4f6f53dae39f4b177ad0cbd9cef0c519918f1dd6ec35f09cbf10030e478ba980651ecf581e168ddc52b73e0d84ed86326099e383dd4170ec18eb539622badafce08c097d80ab1aad3232c381a090f3abd3661dd0ff0482c40ba025baaf5b6d5f6aee23d003e88a1302026a01cdb4da2eb81151bc9275ac52be66bd4d1d6ea1fc7100361653002ecb684549ec4c88453c8b35412c2de3d2e12d3fd03816545f88080ac5662f88c905849e0cab044f13bb53d29ca08098ae9857f4bb4e4d532b564876b2ecd712bb62cc938442ee63f9cc713b158b2d021da1620e698232d8b1374f8c1c968e222380a820edd0416dfe1880b9f69663804b2d0b02975fd564beeeacd8d8b247c61bea1cae8a45d2474305e05983a9436bfde94125cbd5183954757d0073178bbdeb61a59c0aee3134ca3ce2abe1942e27ca2cc75f3a92e4af4f91f78413149a04b1b0eaa1f16d858d88a5057d0052a6cac77a668515be230ac6ec2a83a73c868e78c11420cd2019f030ecb5f88a258cc22282470148005f065760a66009314fad512a008acc9a39f99860eeb518d5d9b5f37980051d58d038e995073734da8d2fb26544df251f9803f456d997db97b4411bcbd863894977dc111445095cf074daadec1ca06ce74a7a99f16926837fda3dcc7974a56319f4421a89ecf4ba978aeb8bfe651aff60161f168fa20d7daf17175539c85dde3f3ca5b5a9d73954a5eb38b7d1adbab0f69c60a7d8b0f0ff43bfbc30e2a8cc985e3bedaab0c17683e9dd815719d03332cb41239296fb9f0f14fc850386fb0f804faa7a92f120234528c591ddbbe8a650a78cd6102036d23d086c5f7f09185e87f7b660b7c5c7aaeac94b5d53916e7cca17f20e4d02c0e3690741c2848d1e16c0821c8737981652ba5b0884a8c58c5430b20d962793e5ff1863d57bea2afec31c27b600ec71c4f51b47c0ccc6ae339512026b08825f79fd36010784ef82f5944bea4fa61dd1bf8d1c1c66cf4f1b845fc86e032297710c614a82a1e5747adf222771cf302d5ec2c9bd4fe54b5223d2e4b269570c1f661ddd983f523824f56d04c8d3d2a6b26b06024590146e6114ef531acb12bbc1ebb12104306d26970cbdf7b50c330bcd0aebed1ae6912aa54a10f88b90fbe15aab91ba872284682a8dd201fe8a80ee95185faa852e3a22baea1865ac42584a210ee9a1ce2ae4cf49040db11b91a97bcdec499a4608d987ceb8dd0a85e44fceadea7b7c7eb684b73588aae8a9e830829d8595c898c19f066fc2b3d84a90623335b84ad83e30ce95cbb11be14d61ef10a1f18904cdbe3270d5e66f6bab435aacacbdbfac8cfe3958323d8092f54590bb2f0e42ab95c3975f4647b6e6c59b5a4f286e8799cfe17439b6c8d1f35b8c27463977b199a3a505593cf52aeea65990fb307a398306a80d39a170f84ddcc60ab0a006c1bbf1ad2c9fd64ddad6e072fad35159460601c3f9a4568158c2a20ad23879c83b6e4866c283a10cd8c1cd21cc52c61a5fb6d6af17e4837ac61b8ecb0633d3644b852d835de0a8b67ff44e0ced6e6a92260e17c11850c532a8e79b76fd86ba434c58da250700ae74595fe3e5a65f64322cc48fbc34ae61d2d33206078179811474b95748d8dba02651f0726ddc263d60aed79705a9337d4128c0c91ee981868e009fd9ac6287cbd52bae6969cfe4439d23b8f0693197474ce108ad26e62a80ba8318e9ca0407bd2d6f85c67e1f83edaf194a50b3d85da869e3a1e2e7b03da601d1935c3389cdabbe829c963808f4b1ede2ae4f6217613df1758df1fc64c092df1a5781d312f3c193cfc7d5f87959a4590c601f442e6b8d451e4e669d82132f100134d0282108a0dd6b23d7c3528808119e38b651bae857b27364f5f39af20ed29b6ffdcf4ca840281e2091cf2ac882043ebb74d1756895c6c31fe249b16ba55e0a99ab881986898886e5b620d4e24ba966effad85f6a0b18dda177feb66be126b396d0935ed2bc8e84a6356692331cb893401d1ca7b04a61725a1e8c9ba8921eb74c4087b9b59cd56d002e2c86a85351c599daf96dfe34478ec32a25881c996bd97a3979a8e6430509806590537d9961e55a97f4fcaa130eb90a127b901afe9a339f6a29e6bf042e61053965db86579b41f634f24b965373210b31484862f43acc00874e845b576e6534560ce2c8315189d8a23878b2b1c5eaf39f8ba21e37fd0bbdc1b0548291e53603c571a28cd0406b17e5275c879744f19375d2ada707708e260a0ae9725abc3556c451ae2312b2dac5902e9b905aabf031719717f9a1c8540ba862370ac341dea469b27a6235da8d11694843e38057e43694ea9bc54d702369c52b1b7878d6a33b14726a680e8290586bbecbd529d46a5ec50c7786e4ee52f95c6a9f530a960ec42797957fa0b5efc29b01f96027144790962deb69aa30d0ac3a9f717a89e68ea10320ff3f4e1e80c71645ff715f690713c605e119e519e304f81e361505193d50389cee4c60076acce16a6df2a84aa977449b0e6555f819565399c1e37804c40ac20bab1f761980146240f00a595d6462824933c5b476b936cb7386d331a737ebb194f11785207709fe23bd7b2c6abe2ae1637e4ee829748f112222f899f17db95d6a49746882b6efb0d097d34358ad37e726a14233e786a145f5c885470e351aa5254fe3f06f8492d0ee3e385b1f4221bd4ac81380d7acf529b12f340ffc6a2972481944bdfeb0f32a3ba63e8eb26d8ccf370545e4f03f7fd9a6f2706fe41fb6e27c89fd6691d3ddbcf14977f82b6ff2641ffb9dd04348def3ed45f20b92a83c5821fa66b0895098ecfb810922fb10127eda18bf5696758a06cf30ac38204ec84caff4eb930831e4e4425636cac0d220a7306fc8c3d54f54e1bd576f1780f5c0f064c4dc76c49473a65845ab0933ef973716e424c689c5a95dd75ca6326b2938c5a670822d9eb2ca324c61bc163bec8af1c763160fd67250cb72857e2ac84b6d2fcf48b1b22a6924210d1a1ae1222d1a3078e0a65b0f943b55ea84cc12a79f3bb42d60146454862ae1222eff1f8c06484bc2ad17f655668cab5f79b7007125729d072706d72acd2544c1b38c32f9e4e33b0ef030654f9d15586e5a31f049584e150b8229aec03054cfcb43807d78f5fce81d64a6147e8af0d0df1ef1720e960de010c245bacfc0c6cb1a7f0c192eab1ee1781aeb74ec6e27460aaf4b624b6066598b089072ad39bf12d5de52576e4aa19acf4a8d6f22480560f206741f5051123869209976025207c7a70b4128c164f927fa6c4eb2e407894ce81a0916c840578829ba2a33029ba715e46a3e158b94ec3b4ba2413a3d93bb6b2b08c29628cc564ac086323c6a8cea4b35c41bb552a763ccffc19ecfbbbeafa5d241208e64c63a934369dc4d25efbb3da62c7dc5885181d46e7471deae80c950ac224ac7b0684c00db575f881e90b86c32cea718b119e0e6c6c69430a7c03c984acf5e2defe2bbe1a82003f7923233104498f452874bda3636d8f5cc8b756837500ed7235c8d79efc02067c7c3484c008719e77a3bb3b302094bafa18b85ecb3edab34af62fc0f954986a816f226ec6e97e52001197b985f1e8e1268231be64daf83b1cdd4896ba0d0bb1049805ea8c865df36908a89e6fd570c35e475fd17958dfd418a2f24b08d537ab4389c77c3874044bec55e7288b55596277a50d83ac43a91f91be0ae5187f484199cdd6e524800057e8341749de6c9cac9e88e0db6e3af8f15d1735a000ec4aeaeb3cb00dbdae15c3b34ae5233986897add68c3c481626414072d1f8e681bb4e59f2e582dd6fd98c4000f6d80a2f68c1c50e1098a62370bd6dbab70ee5c2252f578b3844b98db7f3468fc29480f1c6bde65ad80c4427012a971be13fc4d8a6ada098409f7c323af4df5a67eb8a5dc2aee319a64ffe7fc8d5825de565fb2191728086e3dc1918a5aa6c0aae6ec60da0a168e62105e8a1fe5c9843a27a29043a5168d4485630fc2c01bf03ef6d0bf45db32c800ef7883b9830c1e88820724472a0ca143c7c8ef60723f8215bb661355353f39509483c710e820cd955dfb046fec981379ea04cd090e24ac4ad7cbe980cb6a6709601d00c8daa46eaf0ed5fe5707713c5aaefb1b30961e2d6c259824c85d8ec822b566b69c1e3f9225547e06e1c7001aa4a6aef6be3fe3ddd395a5bf02b806489c9a774561c297d60999c1e9f6e31da96e0b568e5a7b811c5d06133e1772e4fbe5736134c585a111fa2571addc8853f6dde1ec010cf72abac074fcdc67826191ccccdb005fd9c838381b327bb9c8eca5d7d10202b255580a981c7b367460fe20a3f8b14e47d5a5936701c3702a4ad838ac4bfef212b8dd9e496ad81a75884db1c366a12a4253d3af32018dc7b989b51a864c7970bd40416ff848334ae82c999f408a1d4db0c60283cb224bac109c58ee5a4cd27065cea75c4a4e357630ec177d1760b887b96c9801843f54dc3e9e6c59d00c11186b70c373e156ed6aeafbb193d770b02f44f282ef5578024ccf3461541289998d745727ea697616030e4b0dcef14dfc705b25600b0e9bd895524efcdbfa3f5152e61311c80442c5ff9ef4842b2a75f2fa1d4d5cf3a8093bb8eaf6ae349bfa2f41dd19dbd333f68e625fa388869fd6e227689885d57e0f4fbb7df3f63f2a472c4e04b4d84c7b5b820a98d67c362d1eb02608e98756cb925c9c8ef9125f5ec0aa3b4d50a2403621c99016281e000627bbc1662f2b7f1d4ddf2cda63740ace54226d511208b5d90a37d2f12076304536c05842118402119918343959932df979583ab3587017d820db3a08cbd9aabdf64ff90269623b3bb24c6471e03da00ca96598af400085c1f2dc9a27c190238c774cf5cc03aff9a5bfd3d4c78a728aed0880be191ca41bab92e71294b9ed385928b6240aa3f84920e25f79e582485c19259eac239c7fb5efb4a8355dba1f1dcc73ae6aebb3e25d1a9270a2f5bc004ff67685a155335505b2a8e0fa7da546df528baf34d1a9a99a75f6909f70b781318f7f88f16227f27ab6498cf9c5860951e51af4e11299cbf6626a579fbba71105640cf9b456110dee9760444b1fe3f25345b78e93af985b85dd6b8d22478a79ab2fb4d1e9c1d2df3463b70da729a7a8b662b11416c23555d896af25fc9501493b8d6e1e3061f321685bcd00d7c4868e3e5542d6e44399f3d26f6c3cc6a5be2a90dc673ccbac1829503bcc1748ebe822cd91ca178894f48249788d27f1b3addc82d1c932e8ee05e62a4f817ba791a01f748186de05a80de0dab5872bcebdf9f4c69dc498b34ba984c8e3ae0a8382680269e84244a8de3e980fbf885d357a57f059feea1f54b09495b5a8e393b1afb869505ecbbf1698f07079b61260078883abb35c04471c40647b5a80e531759fc4bc26956be947036cc5217f3500dfc1e01ca2b49d037ce067ac5678619693c9024c38e183779beb236e028f1f000cd6cf351d9248f87a0247e2428c0323f29a3478dd66ea5f482dfb51a0de4ddf806624fe7fe15f3b0608ae862f3f852537545f144ea023431e4a3b215da2dba11ccf1a664c4404ca2a939f5920d819a70d65d5e5cccc0ff766df3c642c96fb9c2c793bdfdbee6f513f9c21a107d03348b3dd579d5d62c6ee9ea28c0066b73df445b6674563afbfa0a23c3344f8d156b9a4030a4920b33f0bb4b6b6422c114924b2bb37b70cfe097c09f909993d692e8e1511e5bb7cc718a396f1af8c7ff7bcf2462defbda7bf7f6136bddb2fbdfd93fe30f797e33ebfa9d3df85ddd59f8e56ea489dde34ada36d8bb1cc856977e24edc893bf9fa64095696b0c49eb348764b4862076043a125f864d906d850c88ad796fb93ba42245bc21fb68472d72e67e7c88e0f37ecbeb985bedc89ffcd22f9cded72a85d3e8ba4f4b6cc5e5e3e7439953eff4846775fd5412903d3c5e8522fdd95357eb7bc9eb7cc9eda32e5bfe5bbb7a5e7ab2d5b5472a6756aeb439283e92f7e525e9d13df7e7c0b7f4a7d720fbea3dcd220460ab4fd2c3a11c5c798bebbbb6bda514a230eadd87e4cc73dedec675df73074f5ff5f98f1aa18ffc27a1764c0a45c5e937ee4cb321a43966d5b8c417b1ac3478f79d7623cdaf866b6c76c97b1dddd750cdb67ff459a69ad8ae1ebdba7710900b2f72419d3005ed38f93887ea4946a6fbb8ce2ad477dfd03d0df4a00ba48467f9e0e0000a2f6568bae67b6bfa9e44ff2cfae473fb1581c0cb4d11d43dd3174706f943efd26edbebca51f71a773cbfeecbb7c12f9576a63a63fdfddc3f0df2cdad666f6339d43bffbf844368666ac88f9647ca7692365e6c7874fbf7befe8c7ad07ddf463e8ecbc126bd0b75babf3bf91311df73074db771ddcbaebbaae8b4bba0e4e22f7e8eb176c5cd033f49755fa4bc5d0dfbfe8e9a25136f7f4716b61444ea629b3533d6995fd8d88ac894b4cfa5b7925fd79ff7dd6df9df4d3b1c1dbe78cb4f673eba1edede31239add873ce69b3697a62893526d1b4f77af4e8d1a37f3a36f42376bf76f7ea6d6bf4a28c2d54f85069324596bdda50688a279bca12a2adedd31709591124548516a12aa008550124548515fe2af99798a4fe8b4df675fd45fbdbd68a9ffd741a685f4eb3e158df702e6d619af4233d6cb7bb14bdc9e74fb89d923b8908c84a977bbfa6bf26fdf9b57faff6b7dcfbbdee84bbdcbd9e659fbfb4ad75fa78e3f6e99c4e31677dfddaf877db8a388e1bb97b13f72899fb7d6f72fd8967d948db6bdff5e7af5d7ff46e73e267efef9ed2917d8c5c76e3568b41ee595ddfd4e54f75a8972f5feab688edfc374ed23e578cf1494fd22afbf5abbfc5ec47dbbf742e1daa9b2ec38d64367a772723ed4e3e06b9938800b8377f694e5c7363aeb9b3ff5cf373c1b4a8c83adace740e76efc31bd7d136a6af7b9875271309e7a62f306e1dd13a02ea09b70d5d037246e9d4bf8965848ec5eb5656aa39cdd49c465a8d0583ec9ad344e85d6d46cd69ee9c2f75ed2cdcdfdc3ba47d0dc70499d64d652723c55460777708dddddddddd1dbac3ffdcdd1dbabbbb43971e5042cf9661432129a6e0ef6effa5f0e7d97abf1c9bde9b732af5ff79b57ea43f4b2f6ffd4c1b65aa35a7bfacbf94fe7ebfc6b4ae4fbfb4b5e8d39ffdc1d7b1d93eb560656b2ca01c378fb823952dc5ab03190a2521cb8ef15817374c8b8aec92fb2b82e4bb3bf5a98779979f4ef3f22e39dce3e73ad26b1d167ff4648ffe858950128cc84fb69cb2c4963a4a8f917ae0e75a310cadfb6c34edf3b6f6adb6a655a4cc3df6dc633ffa52f7e587bf80d393b86ef47063c0486b3fbf6e3c488f7fd47d39f6e8ebc6437b8c1b71236ec48db811f7df6a8f38adca8ff5a76ac53036871fd39f2a6b560c6373facbb1f1c39d63633fca5f474fb71c719f1e771ff724dda29239bdf538fd48e7bce44ec7668f1eeb3e4eebd8ecd46b2f3be28fde371d2f7aba97d24f7fa43f180ddd73f9e99e8bc643d35fdca8373ddc78a0ded47d406c93b64d3c3eee473f369672c78dc7a73df72397dc28fdfdb04d3c7c9b1ee3a13d918df547df25b7e98ba13f24dba463c4f81bc7ba18fa8b1bd37e34d29f4b6e6cf4a3ae4525bb7ef459e78a23d7dcd8b7300b28bfa673de371d38bef6d9c639f8ef63eefe8d0b4911b467361492c267e3b8f1c07fbfb340fc2b940425fb3e1e759fcd1ebdd67d39b6a67a9894cba944fa193260522e275d7a28ef1ebd4a7f57c7d05f4eedd1bfe82ff527fd797bf426fd792592d67ef42e74377264246e8efb7bf5879ffb6e14b79673fad3bafc52fbac3f9badfd8de43eededfbc6b1b6ff6cf6e67ba473f0474debd86cac6fdef7b3f972e0501d9b6d24eea803b5e3ab3c9fe07467a6a149f48f1291119129119988093345c62a55ac7c39c61c75de3ec43a417418a7155380a69c600a09a680408a16295190a28514275c294d9052851429528e20c5897aef5522437182238c2621e80113f903f9899c852c65055298704288277ce0042982f0c4090e3b82287270e50644a4800a320b48b8b25dd8f24d890ee445f235e38f10281c128210f2b71282108a90f083842136148a624b14528882280a2ba28812c5125104450114c5cfa451f4c82d532bca75880a7d394a946ba32c11a5c9864251964479411425da8de2038516276018f355f7396bbd99f69af678c46552c984727949c580e9095269a3918f0c8eeb2191fc673bc9a9f8ad7265e549305962f5641565c377a098c56b7e6c711f1f62c89578111b6235f1e727ca0f959f2a3f567ee22b2af19af87ac5225ed188574ce2c564899a7b2567496df1d9f1e787d3d4aff2545251327c32f3312919f964c36b1c08fec4abd56ab50ad2344dd36ecaca19843337da2a26e9ebc9eb255faf1f25f2e7e7e7a74a0f6212141414a4f5f4f8f4f4f4f4f4b8f0c2cfeb279562126363c91831b0977bf2a5fa3134f4fa91524a295714cb210ccf8ba77df27abd66c5d89d9995a1a1a1211914c4040bba4136a806cda017fee725877e6060a415954a0ecd98218b64d10c14ecf8f3f3f3f3f3faf931faef0e414cfedcd1a6496c5f4f5eafd7ebf5a3e4e7e7e7e7470ec92169450ec921392487e4d0bf8a2850f7f3922143c98c1940403366fcbcf00210d00bf1f57abd5eaf9f9f9f9f1f7f79fd65ebebc9ebf57abd7e7e94fcfcfcfcfc74af59e4820b4f5e78e18557d7cd29734a178b5edffd72ea656351d524c66e96a5a8a8a868bee66b3ec1f385cdd79d2f3b5f75beb4c62a41669520c3a0fdc799a5ebba2218620fed81e1673b1010909e73ce398b62ac1128a340148802cdec8fce59348b66163c8bb0597467919d45751619e11e0c30c00004002d8618280d72cf830210430002203d06e07d8af4fe53a99c7dca97ad03659a4e1c268c704c7f9a763ac9901113333333c26122c718cda7388d4f9135948acbf857b1e2455bb46caae914f798a0537ab818e4ca0b2ecc90a18289917a71816f9d9057309548991b6d1ace367cacc9f4027ea5104208a386910a1293b2c44fb431037c12654ab44e76fc9bd5cb2666c6c60c0e24a5c9ea47460c14445280b42249831ebce61226f18722f1ad3694a2033804059194a0951420292e90b2822120210a129e6c28840426fb934850020940d25649292d22db211b5560380a1492520a4510f6075f5080e20657a058028511138a275388562529a5501ca1524a29a5734a2884483d0e2e0c467705d61ee104b71e2104986ec1e79c4f5461cf39e79cf389a2fda5aecc27b4c896f0fae273dab0a9a2ceb9d25ccacd272d084f1c417342d6d7134dd85fcc6b063478dba6e3eed2e3adcbd95edf9c1dbbefc38d6d5de9e1b6637749e7c80d67fb91ed6c1cfdd661d78efe76d8a655a3cf8f398c3fcbb82c93406c99d99a6533cbec8ecd3a6d0a41c1881db7894335986923e4ed71f6a74782a3665ad500d39fde87e94ffa8812d91f31e94cfb30fde94fd89b34121cdcc30d87e54486db5f4803bfad3772d3de35e7a8c3de76236b1fc3ec6f8fbf8875fe92d6de8d917e342269a3d7de76a3d7ecc8dad7acbd1bb39dbf3e245bc31edbb159ab98ec4f47e3ba4f7bda7d48ba91a6fd68a47539da6f9dbfa4a66ddb1e65bf7d973dd6e486a36959f69aa6699f75b2be86f58edd55fa86d3dd79494e0ac2bd76ac2cb9a351e3ed73e9f3fb287dd64794d8fe48fe92deb48fd2939ea48f90bea491e098fadbdeff6356f0c6f6a4f711f79fdc387bc8e9992332f6f9497fc46946ef7f83c645261cb7b9bfb2263fc7bd6f381cf7373e33b71157633ae25d53e7b90c6b8aad8bf9269943a2f4a3d2c36dd3d73d77f5e035a5f787db4c862f02609ff7f7da965fe18638ec1058585858543afce5b7fc397f7cadb5b5564ae79c524a772f728c9705fd0bcc6a2267183a2c72fbf5fbbd845cdffe8fa11a9ce65bdddcc89a1f2e23ff470d0d372b5963ebcbff0c03cfd2358e1499b29ac89fcd962c2bf207a1ec9ce3b5bc4cf93b8d4328dbc6068a4df4893e31490ef76496a92a6008315873a50cbc81df6297f3cfddf763e74c6659f6163e263d26d13022d13022d13022d13022d13022d13022d13022d130faec31bca52fb54c5f7ab8e930e5d8a42ffdd8a4afdd77b349facbb99bcf75718fbaefeefb21a19a4b07a14cd5775754874199faa7aed6c7bace56fdb9e8cb963f3b177d92d720b03ff66b6dad94ce29a53bc77a428e712291d179f042b9fc16e363a83ef52f30ff823dc6bad38f3acd3512f7d868342265ecb51f3dbe375aebb54a4ae79c54caea8e699876210decb3be9086867da9fbf0c35f80ea33d661aa8f7b4cb7a84c0c7b186fc6c6ca9b91a7e71eebbe1f1bfbbaf118bd86318639ee35ac7762183fee8dd67aad92d2392795b2ba5b0d77ac2764ed836c0e933ebb67fad2e3a86d2cd26792497f3fb6f6b9a4bf1f9bfb3036c654cf9d7aa81ed339aacf3a07e6b1c79dd67d9c76d1add2d0bd1874c3c0e8e95e0cfdf4e5657bb8f170f9ed6fdc6573d9b66d73d9b60db569140af5fa1f2ffcc954d25e309146a49fd141294392e1a2ff2c21bc8bfe8f1d1b4618610c6dd77cc57053d0d0d050100e0b0851c0e24910b06032048405958c85114ab0f0b9c2882b8ac8cf15899b048452cedc67fde5c77238cd0242fe727c39767e58caa59c8330f48385952bb2e0b0800004207050c09faf911736a76a40d53ee8de8961c0293de6305a5247bcf7bab5b2d649a9dc5a94ce59a5a45b4b5a77961739ee28c3a021c8324dd3f0bdd15aaf55523ae7a45256f73db58ef584d8643ec6187efa1a577b311d6ddb4a27122cca2e906cf78cb313c3e03aec2fa3ccad392f6ec15d7abae580bb44fa92cb9b3e08d49f5cdef43e5c34e94def03a5497f7abbe164d8dff8fd5217b76f3a384d2a3dbe375aebb54a4ae79c54caeabe69a9633d216e5adfdd237d8b2be9e0348434e447b8b524f73a367b63d17d1f772cb9ef6757db0b69c8af1f69cb6701be37e7145cad7c16995e3ebc99362a69a34cbbd9b5995726d1c472c3500efffd0e26961d44a0ecf725b767d1facb3d4b297d5993cd1997a8b141ca74b5f3a7dd76274f3baff3a37fecf48d5c7536c8ff23447a7a7a7a7008f138dc4934408caf65bc91b35226d97f561de0980d479f392c6a386b10b51bf5d56e90bfd5652dc939d8d3fdadb6b6729a6b23ff86861cdb7db869da9bc41a31b33762f16fa4d531de4c0c9e81d4d6805a6b839819d6921c57366c66b8a12187d36077126b64feca6ca2ac6ccce04e32ed4d301c8330126ef461da9dc4579652c38e95404e7821063388e14bde88dc63ec57a381256d56e79312f98343908544cee19e929edb72e94991d495f4f6dbc38d647fc7dc9c8c56fbb881023e28e03415524b03b8a9b5ac2472fdb8a950c069bec84222c7204eb3bdfc1c7488b87a709a910e6d7f717f134bacf15454f9e0961f5450d9f2835c811ba7e79558e38b7b64bfedb34969fa5b7d8fa524b68518a30d6fe6635232f22926792b2ba534524a29a556367dd61554d374e579496e92efc6977b54cb4d7949b413452d927e7cd1a758a63f0fc3aad662b5967b73a634880546a6ff79d0a69f5fd93426e1668023a594d2184738c639c274c3893152ea366ea48c84314a29a53b918fffc65959b291ecb3ff3880f52a6aac2c990a59feb7da926218f6a5a6cb58ab7556cb2dedfdeea8837eede3ae6adbc55dbb8cc66cd3ac9b89e1995bfeed78e686533626b8674724e2c412638c31c68925fec701f7e28b9525cfbf9153bf9452ca796fcea9d4bfe74d2cd65aab63b3ad340f7f96c2f2c442275111ad72ce229f58628d998335851ca14c2c3dd4b10ea0d3c4181f6e35cb680f6a3f067913b9e1d05aabd3c439355cf5f7454e3e662dc939f5e996afa54a958d5dd39ce6adbf20cd4bdb41961137cec28285450f3ce18e1873f5d41609f2078bb0c8c4e30b938f047e22b206eb786f962c2d64f95ffc8950b6d4b3d337d249ac317fdaaa77e41489e47ae6041783388e72f4b9ca71dc7b138ee3629037e138cc699b9655fa5223bdc669dae72e1b69a329b9d1c83577e24edc893b19b955c265264aa3497ff44da6184d2639375b25967db6994c2653363299b62d7b4ddbfe466ed9bbdca477e4687b8c4ddaa665b694b99166d25f112f39c9b3733ef24ddfd75e3eee26965823d3f0ea6fc7b81572f9d16812b9503a1a8d46d465348b66d18fb8b72e2e2e2e241797fcf34ab623ebe2629fe35c74866951792cae5cf45704c96773d25f367d4fcafa5be18965629958a629de24aa44d902d850a84a959f1d4db0a110137ab44fbeca1f7fc996b4a54fb29ce97d4bdfe53bdf876951c9b0a7ee24e75229974ab954caa59225954a39739ccc7947ee524efed197fe73f9e7947b4e7fb47432e5b791c4e94f8796e20bca9a2576ccfa7258f7d036d65f86e9ea4e628d13d59973ab05ae18e3f72618578c710cf22651a03cf117c618c7206fe24f30c618e31615b9e2c799d41ea3def476fee937fd8db26f6fba7bdb1ed54129b38decf6f96dce241992d657c30eba87994a9976cd8d9db4ecb707424510ce9777f9b6d60a0d0935115ab20bb0a1d012b258fdb2fbb2fd2a5fbedaaf52ee295feed38d8564df69e1d49fdcf6e116d79205eaafbe74f9b6d15af9d3fe9c5976e48e15befc378b2a7ce96eac9f63f51751d67adb4e9bfd8c4e46a77a7998978ff1f22917ad63b351fa4362b2d96dcadf032cef64b8cc4aca380e9006c21b29e332d0f39f30c63d1616390661c79c883d2ba727d736fde9353fa8be45396ef923d3986e451d817af6f4ff5647a8ecd56ab59a5646b6feeedabf55c622c716c62242fe22d00ac83d6749517fc0d1a7da963025a5fef28673c6a74fdfd64e7bcdc08b2d5e0879f184174f3614f2828917415e2cf182082f7ebc1081173e3282f227238b53c7e6b497c81f8cc2f6977f736b04f9fbf7e831f5efedb7d63e8cfff7e69c4afdff5b29f207a3b0a4c89f6727132b226fe8adb0912bfd69313e666521cbc71147ed78b0ed0ef0cb33b74f1f61ff168d32fbbcb5d65a2bfefb41648fe1bfef03ebab318d6dad68bfe6d07987b525fbdb60786fcea9d43f12f7594ac8d771dc2218614a1759ba28ea62a88b2a5d44e9024a174dba60d285115d0075f1d3c5105c6ce1420b17445c58e162888b295c40d950888b265ce4800b1a14b917466ba3d7ea925239e79c544a5add2b0b4b66c5efa03ff1c73188205252267e4aca786e2901db799373e7cd012428e39f1f4f8d6e2d083df924e87986f1b3ce90864fcff4df9f728dcbcbbb74f95139bf297f293fa9bbf73fcee034f9e9e7f795f71bf7b9ab6fe3dc68dac89a176ef49bf6d24d97a9efd2d547756eaa5f824e53e9d7c8755ae7f1cc8fb4b35f25d8b0a29085165958914512b278220b26b2e041164964a1240b1f2b5bac68b162c5cad00cf2e28aa7808a0d1614ac106db1c5165a6cb185165b6cb1c5165b6c9125562b7248a3629f5026beab459016456c28a4c5105a7c208b2b6451441658b850011726e002045a3c210283880a445f106d4134442444240511940d85889a10d580c8082d8088581083fc35fd45843186db13cd5ae7b472f3674d913f1d9ba9ddeb9b0e79e31895f2ebd759eb8473ce2961d5bafbef1ec422b58221ce45ee8444fa5afff4b7fb32f6ced12cfb0b6f943ed319eb8137c53fb796a7f4e9d4c990d75d7bcd5492a40eee9bbbf81c7ebbe1684ee34e1c8f3aed36216ffeba8ea29aa6b913175464e24e62903b2979760586987b6d390513bbf5f8ec9b6836e20e7080031ce000a549ca349d5b0bd71cdc9341dc93aff3d03d4cde7bef36e272c96aa6ad861269664eceb06516bb116d5d95ace90f8997e1b97a9954b7f1433825066b2694918f31fe0b6f608ff153dc036f5cf128974c553b6d35a030ceee00b6fc89b1380ef527456dc8de88833545fe56373664747fc51a2bf7a44b296bd48037a0cb9021a73c82930f63b2cc22f7660bd2f0af6195c5bbf256a0b07a903fe8c40f941b707bfc913536367ea8ce82da8b03ca1a24ec63d614d9df76339da78ec85f6a7f369ea49a0d95b1e95388033a4d8d4c7c6e38ae65afb14fbf9b718fca784db27b9bba8c4f0103c78731ac2932dc9ac80cb213716fcea9d4bfe7c51e98a5a7dabf11db48992eb3b93631ce9735b506dabc67cfa9cb109189f8418e4440f73865ba7d0207197a332b1b3633dcd090a3061b7cdc40811f4172d0712755c030266a5106ea20bbe3f0cf51830d3e6e803b480eaf43c4d5c3919ee8e33449e2104e33ef8d1d9c746ef1ccca41de9106a789cf44fe521b4ad99b6c25c932e579534680572bcffb4fa5a4cdc432af4ca2492405ce4e356baf94f65aa7f399106d1d94f6f09f52cae99483ded10fa254ce291f6e536b9d571a3c81c9136420f404256ebdbe44a15028140a8542a15028140a85c2268dda3014c618e3c7b97442b958ed65ab01c3505adb70b0d309c3306f8263c241690d1bd9da5d48237bbf31892ccbb295291b678d75050d4c5e33b0b070284e53bb2482eaeb89d3546d63c5aa9235f7345fc26a428ef5336b0939c6a71e55b197d8e41acae525654da68a423da4a13f1d2d4697323df61866d2f6b1cebd893fd918d5e3fe67f3a80eee98bd84127b53875318c7c018066315c632309e81b10b18bf8071455d48a3ea4fc7c665c3c9dee2ee0362a3bacf506f3febfcbdab6ffd51a8971b4e757ffbb0d65914714c26edf43deeb628d47be7af5a51f63bd48fba4865cf6df438d96cc18dfaac53a1aabe277dd2e42aebcfe65328ad6a408c4f3dea8fa43e86f60103837a7f2c4f49868626ca51a8d3a35028140a653ab969c6497bcfb7f291342e894de00d7fc99a182f495c4972a5cfac29f2e73d4930712f2631c37ba466eae0f61ee9fa0648a3fb2165e4a73a283a3239226f3d5b1649898a4b6cffc8c453efee4c96c4246290bf8cce0693cef1ad6ae86290cbb0a6403984e2c9771bdcbf53b9563520f531de87ea613ef5313e87d3985c5ebe2a757a980bf3f2a27a7991f1f232e3e5c5859797175e5efee5c56addcb0ba7b19ac8369cb8044289396ab001de30bd4ca560a02a060c518b712d06a901606a01a09a573599ad06019c4e1a35b5c9e4d29d986c7189936cd2a3bfb7e652f791ba8fb4bfb8c4ebb6bcb18ecdae38554f973e47d57670bbb5ab6d239ff84f0d9fc96a227f299650fe52de95f0b59a8fe30932c1069f20ea631f84fdfb8312f4ddfefdfad8fba88f691ff6dd6b923dfa8d4f0fd4e03230465616fcd11fe317971719efe202f32e51c6c3fc1783504db46871192fe5cb19312832894d62509c118362247299d9048e0d3e321ee6318b09f98b44f26f78f9187f43ea5d7e50c207ccbbfc0f32b48af431fee563fc00a3550d88f12fef23c6cbfbf8d4bb6857e29ee7496024bae2f24870d49777791f2fefe2f22f3e52292d5dc911d9f44544510beae7bb7a8844a5d27f77567992a897d2e5e58dbb12a741d53f916a54284dc43d18c5d5f5e01e11f04612a0bdcdb7bffd664d513d25eea93aff71191bbe421af32394db446609e50845d6a41ee62793f88237e403eda969f76148f33311eecde7665cc63f55b51759006988f02769dde7ed2f067d245369d4b1ae708fffc3bdf937b83763ac9d8f18b50d5f837bd37f76b7a1101557368eda0c9283d7a47e7ef4d74f2429d97912f79c88f92c1ee448046f40265a625093cad382fbb29ac81add308d86f4036f60ee73248a35e6f3d8b8e5b5ce7f208df9a4ce8964d69f6f2931ad6a9113cfce210d87b2c6e55f1ebeb84c2cc254d6b8fcfc4fa5728e31e8de9c5329f75c3a1fc265a6b683b41d3d8912f2078b88388d3ce2343d4e23750b6e9f986408953fdcda090bd612b2cbbfbc4ac7fdcf877bf37f10913531e8a58b2f2933dfa5835226882545ae442c711a1cb70ff1a3c4692a90d318e1345f7978dcff5c6748c3bf76dfdc592b04d93da7f18736eecd399564cf19af71262e331f2691d55951f25737f95937a5479fa3fa58fba49ca3aa553ae4aecf815dab36bf061f43fe2a79cc1330c41c24e5206bb897f29e7236a552a57f4e4bac06afe6e083fcdd4cdb70b2bf5a8637b4e7be14a99439ce44b5d35683cbe8a1d3c04d630d671a36c2da391fd8e59e7c9d1cdc93f7b1d79f3fd5ae9d401ae6e4dd4ec38d7bfe3ec80f778acaf92fefc52630812b65e2bbb4eb24d73d9f605db1854fdbee5fe16b2c2cf22aef597fea16dc14ee958d46e14b26615d616d66add634740fc3cdc222cbf0c7194d966d8d8a8cf5a7b1aad8b02668d901b20884b000104e298b40084d250833849083108ea006330821568447061b3210804611212e1f22110c6105607622214186e02024c84a8603c8b0a26173802218a8910102ac56072000100c60a00005085243800cd0d018a2830c4584b880f0e020830f3cae223a6840084f8d211ae00182830c357800a283ab08100c08295243c80e4372a831842064ff0113082110179020455c3a602008102139f00809c233a405d98980300757101d38e03940970e3a448afc0f17901f25987d06087580bcc0ec1a84f00473d40213c023a4080f3a400823ccb18a1120842e30c72008210f42747e861782810fa2b38121391479992fa283f73d0809c2830e2fc4c8901d84f05c8008100e1481101600c2b80108610c98a30f84b0088f0c38f0e043912b64033a408cfc0f1e1e9c1fcf0390e761c8ff90f18800e1e1000f1bb871c3a5b38122421cf0e38308d1d101820384f021f42010c214ccf18bf0c8e0da210316425821cf101e1e21cf03900f2284079e0db884f0b87810b283101d223be8f02e1d80f0b85e033ce8e07201d9816748061e08108c318010c2c00c8940083798e10b20842898e1088208d1d1014806be8810970f18f8cfc090e761880e2e20ef03cf901d84ec50844706bf0121940133f420842498210d10420e0cd1c9008f102343de07970e380021020487223c32e020c4c805380084a7060e3c456ae030444707480d1f7880f06040071d08219510c20921d42084eedac0101f80d4c03384870747d513020c5f3d3d1b4a954f08a21462fa24892f0414386297c493f824995a891d05e4c8df81af08e0d6115a51a4726bca0c18c6dcf81007d63ad734d71c6a55ab58f66b8ed548f8e05f35123ec857c09e3fb3f999bbd661ef9b0dd8cfcea7fb017fc4200eef90f4f47442280087fcacf3491271c88f5b1771b8d3ab7b208eadf3d93ec9e3c8fe763ef885781cd947ac7b7c7e00427ea67ba48f108f437bdf26f00310f237dd23df5ffa9036f8df78d6258938b2ef7c8450008eec93441cf8b177da4f4dd33f609ffbd8c3ed011087a67f50c207fef83f64ef5d96325408257614b0eb471cad2a720e123ef823e1c37c1bfce3a66ac07c7f1ff2e35f1be6c3cd06f9375e9148af44e02b6b8e1c01c25f3e10f167f6477c923c0eeaa33e7d20b0bfaf8f08f138a83e0204a6933c8ef8f4ab06a2fed5560351e3532d1f3e1035f2805b51349472078612ea5c9f0f7820fafbbcc1030c91e4c4b77a476e6cce39ebdb9ff3a7fc7b7f46f9d1187f4a3921f62f3ef6711e31e27f5df28fec2bef117bb5abce23fe944efde554bd2369b773644f7ff83108c3ef3ef6f631ce11f77d1e9711ff3abb9dd4cea90f77a6bddb49edaa5d39e2373fea9d23db9f4a5dabde811be6edde048d750b59b6d0a3858ccaa26d36c124f3114c5e6b9d738691833d674c0b8a501846c4b4a0842182307c6a135a4ec4d42eee3923bf7efde676ecaf9c89376cfb71d321e36d0fc08efad39127ee096f18995a8575737f73abaa55dd97deae5ea4430881310486151b8c2960bca00430f417172384d11dee882b701a2d0cb1a1d09622f677c128da570b45fb3714d2c2948d65fd1695fcd203f5ef55e9f0b7eff3219d57b36f7f3e6500dccef2b74fbb4d874c8cde9e9e1c226a10cb8fba3ef6b452fa9352cbf2b71f7deb61a76a52491fd237a20124bb7ecda95a559fbeb7a9f68c8061ccbd1fefcb0dedc36d87fc2befbd9b8e4835eabbd68ff5a3b57fa7380dfd48e515e3b6437ea55447cc628c998edb0e79f5bcb53eede9916f83b6b57fc1f8d9f42ba944227d8c0cd3c68a2f0cf5677d94f8e87bde76c45ab94d07663ffabe915a2a6635430e1f3f747af0f9296289eff9f8a4a17cd3b250a461d745834e93539f62f73de7be756cdb11c100da1b0f1df7ad7daaa77b5346e874f4dab090059f2cdf9c13094b4b95ad25c98631d850cb950d7f3e03307488852c58b8b2a11016aaec6f6e212c50b1eb86425898b2c3752cbc3614c242d0feb82d7f001b0a61c1a7da64ff98036e7f19677005255636a4b2a1111b3e7d7205241b4378c3c854491c95d470831f77c41d5d50de8d078faabf0fc9f62deb476fbae6ae1b0ffaf0675cb3da8d47e4f121d97526ca29e557a96776f7cddb03d217602b18e1610cfb873fbaab70c4dc5d7363afda89bb62588ff9983612f754eda0577b312e9760bf4e1a69dfdafad25aeb6e6df56aedb77090bfb929bc513f47db3bdcfdd8c37eb571d36baf8462cb962fafecfab4ca869b3e962fa2a0052d14b1a95065dfd850880a71cbaf15c3ec573bb5b7d8dbfad963f46da5daadf3afc4d2c8dc1b0ffa55aba2a6afdae1c1589faaa88a664f59ad26727df8df5519d1c08764cf4d878cafbaefedda8a5a75f50ecfb37ac66966dc833cf53f55d494aaea4355fd586975cd5d67200dc8ed38e31efc7b04c633335176fdfa4b6cb8e1ce92c4c67efe276986bd8cd8ed5c5373dbc8dcf65d734f29a5fc4ccac823210d2d3efccf5f7e46553b3c4f1b89aa1dda9bf33fece3e38b752d2264181f3e8c5f59aaf85e942aa9927a87f6f4cc8c16691262d18690867c557c0ecfa8e67f7343d5d43bbcededb9e1dff895bdcda95551eff0f6fc3903c48e6f6d8efd78b1779bf3d1225ab5c3dbf1a3f6e2a63a277e275dcfe04499043f666bddfebeddf40e0ff3581742ed551bf6d986692372eb31ef26f58efa2aecefdbcf3a15a67778fb6a6f46e7d0a9454f02157e76f6f8312765c772d1207f336ad5aba4f69a4a83105b08e1df9dc8036b230f757c2a352b7efd1b1955f0ed4f15d43bbc9db86b0e9d3e042b9bcb893fb71daec77cf9543ab9133b2311c98c710913187bf064fb6323b6fc290525db1f57a12858d9947e8e7d1d7917f18d85dfbf8334221098fbe8bbe2d42a1df2f14b9da373b06ff850eac0ef1bd31d6e178190c6871f527f4c3b23d148bc8fe1d66a61fbd8ab8ccc1d7f87db71eb51df6a2311661b6e57ab74d8976f75ce7c57dc35c7776216e70ca805e85b29f8400bd0a22c30e6de9c53290f6ad50e6f665f981693bc13b7bf948f2ba64366539d33ebd683ea88df8c2fa5b783be6b2371c7eb3a64b6eb9cfaf7e7fdbae9a87f5f6e3bd188e7447d5d71afe813308c3dc850a8c8caa63b716aeead21e48f7efc6f7edc61246ea9ef10300769c48f28161743585dec160932fc1609728b04d91fba1471c58a16095a2080220a952f7cae68b982456df95c19e20ba22facf862ca17af2f9a7cb1e48b185c21faa2055f28697da015c41528579e6c287485c9951c5c492216c108535a470c391094d7f4287231c6d88394b9716b3d484c7ff76a2d566bd19cfe3cada54553f4a9f6f6a471071161fdc5ec0f428931c69865594c76332ccbb26c285e71197f0d8b4491287f11beae5002d110b2967b734ea5e6e4e1991e89b21b601853ffde4d8fc41f753f204d11e8f97f72d3879086887b10d871b43dd51f0576fc7ceca8bf2c85ac8a8fe4a3808d7bac2b32f630762a966ffb1448cde049b4232e9324fe1481efff037ad9bb8498ef1952fea5aaee21a5654a116c2b1bebbe1960a616086970809e5bae8708697ed439b56ac79efa916cf8eec5bdbdf9be05a8d6a8a4edb59539ea149a1100000020006315000028140c07c442a158340cd440511f14000d8ba05264461c87f324c7524a29828c41060c080880000060344c0400eb428b74afe0002ecbbb9003fbe1b9f9673dccd971c878b3568e804434df361b7eafe236f2744e06a55c8d338ccc0fb72c90f6cbd8bce7218bda9396df40b856448874d6fa19745e54542464e6183ca56f9080caa6e194fff9fb1fa4105664b8e004aee77d4997232480eba75c4e915c8c00bd0859f59a0a8c05e4f3e78fffecb33ffb32e5431494e1c1b413d0f221f7b7511b6de709f049e57289e93c06fbfe560a0489007e1273575eb6492d951587d318858ba285a63dd04782a6c43edcc070917e0f8ec7d5978d80ca0b60d61b15e1c29060b9018f88020c30f29df987209eb0a6d0dfbfaafbf95fa6e41883577173dbc8ff85bf79ae9a6af8e732ea13c7af7ee8e28d07ba9fd885899018681c0406847f83f4bfb9790c654c97740f1e5ef3b124364c2b4522aab029b8a9b2c702919ec2770ba8f6229c6efc86140bf3ca51f67935172697d54d727341adf05c4cc2eccd55a32f8df7aecefb8d269e4ec51bab5f34e32fe554b9437731e083d2ce1d85e9b6aada6383b460f646ccff1f788f164b3ca42ca2eb810f386ede2211b04e462eb5ff5f5b7eb1a81d6edc01772362117587c723b7dd7e96c1ea03b332406493f655afa8c1d783de35e85fff4e676675d24b71a80e2e20c9c5905feeeeaa43acf4826b971b443fde9bcccecd6018d68f904bd1de65b81fd009e8cb53bcafcf11e044400c02294410e4cfffd20c03840365a0b0c2474b338f5174984112cc6e43e1a450438bcfeb14e0856837bd81a0ea4464ec51464608b0844fa12df62fed0eca042e39c9c1c912c49f4de18c72881422ec0e6d5f42a102b3bf5dc081e05d2ac29b5270844306189bc454efb48387c10e88137bdb521a9f6cda29eea6ee4ad25a72a95a4f7302e179604cf3b1562da79f22a8710cf5a154e3d223cfb576195bc2142af588164e6a9c17603a4b6eecdb26197850ef92cbb43e57971c1d15fcaa00396f59887c438210e0c49d40a196c957add876c55e2ec454b87704cedec25b6c63492c553aff7238c138f36a158e650e2a65cc0ce51a8e87b5667db5d9f598d7b19f1503747970ddf425d74d1ab07df1c0c40fc5a856fb3d372da79f416cd559a1520505c3e61b63b30e54aa0a1028f93dcb4901e78aea6bb4c6271019b6f1914a3b9ce00a67e90e75c7b8954732b27486e62e5d517ccfaa763a1c1701c67c4405a7b8ad65061028035fd1b0f72beecbfc3f4c703ac3aa1062ee61264df0a1fa2f356ff068c45ee19c7988a0b1f167c7569f4fc86c206ead82ca32e0339522a85170c986bbd3b359ff7952557ffafa2e1646104cd4fbf847a0c6788f1246b03461c64aaaa04fe97708717fa1721d54036a3503929d77f73416c8956a096477d1c3581821cc26f44e37d18d6586d2465381dd16e8e873442664bc711a44c7e6a5e5099fbba98763c8186a60bd7e92f896b3993cdf352574907f3e53b738208fbf73feb43cdd804fb531c39e6dc719236f58cde58465595145a54a497e427bb406bca805d8ae5649648e1b67e7a906948379e2b159c4e1f01071e8809c23c7eb04221a4b5515b9c3739053c561995a7b12573073ecb5e5f290d0aeb383c38a0098103b0d9db3f5b7a998d5d0dd73c70df95227cf099512d6fccb69cea13eb00def261d32242cda9560bea69d4cd7797071bada388339f537b934be8f74848ba264b54f07e2391b6d12241b842ffd6490288792818469d39b781e2675a237005aa5153e1a5388f4e18f5acf6201e357888c41358cacc31d118d4b26db8dea75747a1d52a3cb2f0ac7fb74660ae9829e3fb2d0e08f6c48ca2453544160af07892d206550588081172cf599563ef6d18c2b1feb1934b4b05a26b3d365a8f98cc03d340ec23c967c3f552a8bfa1948c048a131069282db1f558886fce6db91456ae873cee88b0f472798aece6d2f5c0c5b3d1a15dbf431f12e3fc7121d0eb4b5415c11e11541d97c521c486a664658b2606210e03dd183405f5a97396bea3a4d05a64a1861c1ef5dd8db5439588c2f0602cfb89fafcb2b702bb53a4b1108ec959744fe73b194c6d96d96703660db1b6063842005a262ca635b8f546d2b618fcebf06c5b77bbad0209f540c975a7ea05be899baa40e832e7cf161a8b328861b1b742e06fc161cc7a1b4480801ed22439737f27c3da1856222f41c6900ff1f39cbbd673a79954bccc437b92236c5daed634cf2d68e1ae4064cc41793faad53b0fab02a564b7e082214c7967ce5a4bc9e4478f577cecc16bd802ca1f7d4d3da66322b2d80bd1d3a79e8fbc83eca28109f3ffa5e50729ac2a3230e8481d11ac261a285c147c6204fa321e4baca17a89d1144a814c936d5ad9fcf270e987890adc2ed2e7962f53c9bfbab198b3bd5c8691721e55b3f741910a93f40a821ac2b19769765c3c4af8029f93c4afdddfe93ea618d955efd41d078dee31e08b894bd11ba12a2950c830b966cd11633092038de315db97c79a0e3f39909e4a16cb7abf214cd30fab2af94623db5e5caa53cfc20656532d118cf4f777b85224c1be78b28ede0fa29c2dd79e9ec7c8d5226d4a1a16121bba6f7967eca1ff182039b58c85e470d8511007a2a63346b4aef118b824a3195ad7515f8132d100640bb2703996e3bfde719bfbe8fe3914ea660daadaf4693656674ba32dd2e7a31cb0fcd89de073537a2bf6bc0844a81a5dc8ea8d6eb6d2a5c798804c473453f532a07a96176237ed6635128c016927500eaf25707425feab08aac3294d377699f14b04d1a060646c4ba5b21c1433abee27f05aed2437dc54365f3a406358fdd00048e7757d0bc4742f47a48a0c40cf0c3f77190d339b2286b8cfacea8a006c622552dca224d5f35e5c346fbb72688f63d8d7e2c95d2a400822b4989b8bdc32459e235d50a187e24e8bd1e6dfc0fbb105b62d6d951a3721331857f28db0987a93af81a611f77f2ba7888b76d948fbe81817f73757e17f8d0995b80058e496ae945f33f1c480e6877a9c046e98d8fcd6e8b74a496b02e895a4dced913edeb9162cfa42b4476b9f913ea6ae40976a94773e98bc05cda7fd67941aaf484d4d8801356ddc30aee288c223f6ad63b9d3780ea9b20472c02f43ad902a86f2563b2539e56e48baff709a2179bdd7cd643964544627ddc7ad38f46e5275f3f278f14b2c08dd817e54728aa5278eb62c8ac043ade251120df3104d3ea481cb593d241113551e064abb828629f1535f0c010885827e364d8238353b2f45e3e951149f95465b6e00a0691306e1beaed44d2e6c583fd559bb8299645f60a37c76229540dd9a8808f864dbe5e058b5dad625d77dc8b111de5ac838af1b3edf1ff8280d226b1fdeed8081015920c80d98dcb0489aaa24d3a27a9767f70d8a04ae8feb5d15e79998b7c5085ea45b813efe6568dc8f15b05ac4accb90f79d48bf3ea2c43c38cd7bd75560005c82580bc44e22e44184de51fab263225caa9549065f8f7880b1f8bf8e5d05f79bdee2e572c005265feab201b630de509e5034ed9e1f5fc670f8015bac80849fccd74c5dbd4ea0f16463ed86bf9ae8c9db1b68ad20997d8e8583be1e224facda52a5f707b5891834dc04a2d80e51f90b0088b03c23290727ad95a59913254a8415b9b781f2c2f0e73fcca0809c19c9408eafab751468ac382654080094f765482ac7ffff3ad74941d7a9b3bffced40ba4358627a0ee61c674355cd178ee0badbabaa25e4c372a53db9928f191424e201aa734a191979780248afa27f8580d193fca314af6ca46f3898688dd201857d38cb6330886d08b30a43d2e00dede41c722323329a0e551e5c49f4c30a6f74b3b3016d0dac470a1b01b77cea2c390a41833f30531ec572275afc13b567669091cb59363203e56f7e8d5f0839921e3a570408014c300d6b83e22f9b085f06e8cf2faf19b7a71902ed1f0bc7ef1345174fa01b462a5ffc60207891da4ee49f17160efce19fc1453f979a3123e9662546466ee840d86e87be90a33bd75d4fe02ac67e891d48e09a3ba4441049b885d780aa9154a14470a8bf8a442765500e8b503c0e0134f80ee08372dd6f7c74fc39d4cffcadfc496974e10aa137ab77c8c3d1bd590b09dfdfc88b14b84b8dc2f85fee772bf338cc0f4e4c1dee69f312c67ed487a571747df82ef517c903db7a726f5bb3a33d7544f00e0b72946365d655d06bf1b157c643aec9bb89a7a23c182f1257cd2bc8d9649c44d8e7d165acbab8552cd6dfe4b289d629e36ae264f4781877f6c2badae893fc27914bad9683e1cfd10eed1af68785697d472eee8472c05c20e8f70cd8688e5b24833b5d762b0ced15bfc3f4f3e9dde6e89cc7cb5ca2aa74f889d85c81df8431500d98d416bf2cce28f7881617528a553d7033121f612ffd83bbf9b26cbb08608b81eb23b03defe2a66346617c5a7399a9bfa789a0a1fa899171e0d1301cd3439b714b006f74f9156441b55d52405cd84de5e8ba49714340d1742bdb57486a92b6ef85c1a719be687f8613657242a68b72961c567113f4d275d4c24cf8210db8cbd8ed57e4ddda1671c361c5230732db06b1d8a0412926f1ddd7a689098d50200d0ad6584046530a70729d2fd6aba4e9dff40e26ce135f6c615abc65a90fdc98a3177991daf469fa465f6932ffd582e818fcd498e6d18af57111e45426c259710cda73b07f2b4960d42c4b7347932aabdb024baf1d426084a3ca43ebddac58d6f82d6ca53fcc80697517249dd8ae41d073ae49db4b2732e38655e220b082f18641c0f41e0da524c0a74271627883cfd243d5b58545ae10da9bf25c29c843ffb454f6354084fc0d925c8a361c2b2484023e44c608d6d2e9ebebd161099f51a2847c17ed7e025d2b77c41d5ec381e6aabe78dc48d9488b928bd5c98cb1e6b5c0492ef03fbdad4a7ef1dffa1242a45f9342d2c3f596d6cfc661fa7f17b580a128172496843e3cc82c0c74e40087aa833c96852e56466cd4ea66e9836d521b83016771e8479b02dbaa3db0be1ad89c3690f1d348b736349113a36986e27d027e93780e3383a75f58d2028548e59bf91088873ed118bd0c17fedafc313a9130abfcacd0b88bf70d02f57b5e925e532b15d1325688865993384278c3a130f06b162a468cca213c0498d14d21700cfc05083217d0691c6fba096193b48c11002ea2bb751fd514accf239a90e685de1b21db6ced2bc4de5e908475aecd93c49c080c9c2d6271e91b61a59c3573415f3c3c98116c53cccf8d88188b06c44c8710910568961bf548be35e0e1ee631c0b285945d5b94da1841a8c7ba73caa64c2962562a10b14ccad744b75b5bac28d17c1ca9c0397de3b8e1adcb274649cd73d2f56c7166dfe8a1517332a05aeb9864e89d1c2019e85cb11df10f6545b465928381df606271ae892742486459137dcdc5f340418fc8642e56062128e21021d0aae5fcf1832cd66a439d7a230db2d59f98999c9761eb1cad64a759c86fc5174bf918e7138b2dedecf75381fb260a213b2856729c9235595da83dca74e34b86865d3bce8f457465d05eff4acf7ade0cd06e44e8ac45fd7abe4a5eb13a764b248ebd1c1081ccd21e19df9cd0ab74e6c93347e79e7c19110b28c459d08880c3d9170603aac4c9638d600cfc375d6c7a0c01b0256091ae79b4cce730ecb556ed49520abcc04a97059c999f7ba42a566e61c5eadada15e4d912d601ed8f2773b0eb026ac6c6601132bb714792f58df97d603a8f98a607a6163a91eb3a4aa29285bb89d586fd2ba21f2ea36cadeb46b858579b4ff357af7017bbe5ef533f4fb93ce5cba7d0574f3528eac34b296b500fe50364fc795e6d94dbcf7b72b65f851f45adfc50f964fe174881a69e2b4917221a7baa99ab25bb3d440c97f5c5fbfe20d7430737dcd594cda655672e894749d6f7fc0d0470178b491b985010524a6dc1073a0c18d88a99f27d30a9df89450848c4a0319617fe7775f3c17733d8060c7c89cb98b33b97b93c836bc464ebbb928157626acb76805ff8f7a2ed9039d2b974cda2da6f1d9aa110fc4e39d672c79ed6be852d86b2abcf32d6faf192c945bb401261f169c36930638c33e49890975f7eeb5fdb6c71f0d00df9a408c1e9f3625f0d2c41a3d06bb46da8dc75351c261c59c0f28d672a3e8cbc79b861bf1cf05e86d1320159a632f49e73e3e9f6683ea31dc24fda4395fd8816e6e40116681945090fac50ac9230f8f520c55315d5e8821936d9989133410c1183c238281a0c6e56c5ea8e7bb041c1e8de9a34e230b48a68e1f3e68ef177526abac90781ae0783e28d9da0711be7072025443c8a8c95e8d4c93279dfbeb348f9381faf2010a56292965b369ef970f9423f80798fb3eba1b8e3321d91628d122dce0043294d6b9b751f5326c55d925966d6e84b642cc13412ec24f41a442d214c401c1a13699a277554934b4389e09361ec236a4a6d3151a32dabe31413627c2f876242a08ecf857ade767244487985295f030dfe481cbc4868d7ad578936a9357f27648745bb330d4aa0007d986e5f50181d7c9229be620897f62582c5d3b16a0248355c13ea03582bd1ff4e94650856ea823f78bca06f849cb99fe163be5fe47c9885f28cde32dfef5a4b31b416eeafed7bff3cf84cdfce7f7dce5388508a3531b63e001aaa71f0670f56c535b112850a05328dbf6822cdfd2986393d952c0892207b8eb8017ab6c8a65ce12b2a527a06d080100ed290adfa3f98081fdf948df8195e43d51eab40861b2aae07ba5313c8f16254c1986131db8ffd193bc5b54de5945affec307ae23f039a77fa9051eeee74c3c76d44295f1e1cb0874e49ef717222bc2dc02c3213e0e5189d755dc515411bdb87acda1e10ec203d29ed7cd8b510ed303458c7ea23146b9e91803585821d2756a2eeeac8cd6c64fecf78bfc3fed324b1e9c52b24a0c5443c4754e0cba282209e87c639ff5d610bc843d8bf3a32af6174f1d5f8f7d909828f01048d373fbdd5ee70e0b8176c7b6efa3d6403127f0502c7a75635b82777691b78751b442a190b43ae414492b1f0ab0047efac1919cb57ae638cfa4fe88f138ede0905988ab8254bde5f55051d2b8b05bc38925fd0f0dce28a5913a81b0714fd31a0c8347b14fe60873ba49bfcba03e424202ca99b5e6559b30101c552e97fb2a91172563a13e10238232d782597f71efb86322f46bab6e9af8fd3504874900498562e91ab16f769eb2267b49c5b415ea58fef42cb7360a139ad8180bd02e1edd000097f268e48e82241b7d7872b1a4a0fca0860fb60c7484a5241cae46a6e38b438f41ba40165d3a141baccb487023f4dc0cf4cd25d4474c52c636225b7f20a84f45da8d2892d83406635b8ebeb5311f25ff742a5ba3f3da31f9ae3e70a344f9c6d6f66eac49f910db5ef44591e29b9e56e27c66086fed4b0224e631da522ee58e40f1e8d1b396116b5f10f68665301aba13c9e9760ee3d07fa6f6e868bd28f13c8fc59920067d599e8aa3e29336363bc1fd814e04ef1610a2a6f06f94c822c925949d9c9d91032126623ce24c8469891909d34032923d10cf24c824ca45909d9133390b224cd22cf26934198912cb313802c38275615dcc7e42c085909331167136410cd4aca4c9e819095641679364936c28c4700b2c3915855709f276620642599419e49248334232173721642b68419e45949b248b39265266620cb489811c84036b9ff7f2d02fe7c3b055d8b6a8cd8149d91f2407c5c2b4d2a7626308f946e26b5db5f49849a7a8158320280f8d59f19a962133d0e56a76f0fc538b145c29f1c6f61e95e7146da4c3050db48801365041aeb120400a626ae24ff604d5cd04b3471c44992b34550b6552ac705e8a6e2e3b0aea7c36719e90fa63170fb70bd94b708249103242c1f3e8da030f5292238ddeb8b4c464c97bb7185272cc3c1dc26e6f8eb1186cce239dae66a520cef26b9ef7b8345a2acf4071e759701e645eea04c576518d81791095bcb20fc5ccad476b3a9359aece1db42184a548d45615fddd35eed0e50c77e7577eb6db1fa2d31a5dfe006293f785a3c202376af2a0e11ccd0d4890a7d53bcc28025a8c457445fec281300211f0eec4db7fa74840f8311e1499c63e327150f65e39eed24897f54c21bd93d4161fb82bae3db2bb427b001210588f969e44a97c340a150d77f4119625ff6556b58278e24ad984388a0cb4807319e2434969277c86da342295763e91025e635cca0694e384a2402a9d1127de750f50d560e7897720ffab0fdcf20650c48966ab033d76d422126b14b728f351f80738901a8c281fd68c88339efecda5a9d0bc54f37f04a1f84027fbce207b37287a9f74060a65ddbf53b1190ff84a73eb084226594d5aabf511ab0cc7a87bbcb8b60a3593ead3dce309e5b5afc2fc3eab6834d410da34237168ad5df3c90e938afdd6f389aba4637d8f5d343287c408c6400c228a6712a3b2038aa1b59d7882fcc6d118a8a7087a9bc61864e31836fcceb03d3f8c4bc431f9de8bb4b2d840ba478c7e1e4d64953f258a18605f1e0ff29d2ecd5ff473d5fa3ee0c08556dba5d32c05ad2c19b234f942e383b2eb03dfee55f705d4012fa2f7a53a1063a2f56008486fac0e582bee4d1c7b8eac2bcf2544b5d0b9ad1eed283774bd901392b7e589d99990b71d4c38810a65a4ddcb82980c81d3e2bea7e14b86a158847769dc60120efd0bce1e475cc6d4312758e7de01e978d8202b746c74ef5512fc0b5b55c7d503a18cc522876f4ba20c69da017312d6c3ed628c73fd1984f2f3e5014c4c79ce70e919e926d857daeb20759ace8faf56425b09e8df0d085640ac27d91e112ad1ac32a37548fcb072b4912c5efe31a2333d6d5d5c470c0a9603c3692cf006fe02f5c2256fb2bfcb33f96739b11002de65d6f9ec686e2b420aa6e2053750300c64473f7c151831809669ea51c0be1b3d4f4ec1523373b9a3e8dab9b81d5c0486bf53fbbba032e317f7d506b4d493fbc36e054b7c000b97997b303f05304b45e42d85bda342160a797c20cc6500f8f0736abd92bfc6035e456d9a574e1ffb1438e2c98d4187e497c83828bf277ea1e0bc206c3d05df4a71ebd7cbc6a6c17d9f1dba26902ed420f5f2de7aada4ec3e50807ebbd3a319b1eda20f86e16fcd0dcf4973495ed7c7ce38d3fe2b61fc736e3d2431936e9bbc49c4303057658fbe7fe063f36b7003e16924858edab134c6ce5bc4eba28f21a5402161a32e0a409102fe7a0346cb68dd7abe5fab488bf8e5ac012a49c9644ee4b00453277c898d8b6dcdf0ff6e520d3ec5f40ea4c925dda1dc5713feaa5cc8c4dcfa8174c50860061c90a3b4c387dd3e01489bcc123faf64d946e02e4373a005ae902fdecfc5c80f226b51e7b5f209f98f7bc47b2bd9de711b8d0b89947deea4b0a38a2515c2e6b57629accd8d2038490e4b79396356b3b5ba58630d2b1eb8f2786cccd0363d99d07cd12860c8d1a7f795b57adfc47f6b39a1841d2a172c65e621b46e1cb7507f6dc1d9d16afd6766bf755b6372b8662a5bd435b7dddae19f0af4b58e124c1d05d1b7db76daec173607e6d7f23237cda60f600ea9f80b42b3faf8909ac481a829310b91329c4ed583ca54918d46a75e63f14812d93f656d6c4959f77d3870d55980d3abe15b023520fea8e2fe7fe014ea2c29dd948be4b961ff3d6b5818f2dda9524a634264db0b43a84cd42f053f38c107144bc606a29352aa40e418e1d0f8b434f2c22491d957254463d49310ae710d960b6b5f5fe347d5391c536a6d79c9c0003e2abf7237ac213de94f8f3346728a71aa6646d5539537714dc7f5e60bd1fcf6716594796eb5f9a7486f969f5f78f0244d68a41500588ed9963b706b490434125c8d5c91496fca573a74d5db38367b47220f151dbceb2115a77c795c482bbc05dc442755cab9bf43171b6aac504bb48aaedb174a3090461c9556d78309228cbba023b02f6c83c2fb0846fb87931fa980fa6973059783808852a8b2c2bc1d30724cd4e920ddacad76d071a2c4ca2e24edbfa11a66ba557d77560fb7165c53cb3f0cc642e3d95627f1508c17cc59812546fd9eedb2c287bc72552485c38f3f5326fd981efef35f3d3d64718e645a2fcdc061aff913eacbe7941d9c3593cb6e34f0b7edc69165f5006170b379c18ee714214cd6b3fd77978560a195e2149e559cf04e6e86f6a57d1eae790205fb5322906d18a66661f906bed225c7e6cd30650c0e8c028c324bdd4d0e804af691222b0858239ac44e59e155d5971bc84ae6662d9c058ac76fd116ec330b4f8e57dce5eaa8e8110e2b6aba138651a87513d2b53742f92ef364c88ca137698c92bd44cd9f1372573b6313d175c133b030b41fd98b93c5bba8f6cd273591f67562ababc354c6c80384dad2ca8c755f49db1a22eeb1dc7d88bb51ae9d784db69627bcb0921d4595677061fe6c517be054607e1bfffa32c4de4dae9bdcd44e76661fd261e47aaebe7347d369e561ca64c5239ea207945dbd8c5e619804d07ca46ba59631811b36c70a51e23f0bce7e00d8dcd2eb3bc16151acacd219078a6fa47363889a2d2b1fde7b16ab04a09df037fc20f920d726a748bfd6d210805b856fae0b3e8c666500c992a0c48e7ac701eaef942b2b40e3986e4cc3f7f95948bc515bfddeb1790b8c2e31413f462d483bbedc01dc35aa2c5d802d334d6730906a388a1305c1d892d2168046f54f056a5bb0ccba12ff8e64f53bc3bf49dd57acc13f077ced326023fb4eee7e3d89764a7faacee91e877e51938996cbfcde4e5c2c08e35bf1fc7713c5fbd1064d55ba1f6671e5566ba3ada7ceb49375313d2881835f70233945608a66ae5f0932b31731fa334d25d50985590326bc53adfc1e5b0d5b8ca7645300f59e664a49d26d7093772afc78a0287d719221baa226c70fd12fbe1beb011d6b0cd5ce8446822f53b7b2ad3a000c6eb6482f5aa534898fd5f1847d77e1935b7062179bbe93ef208ec998bb9c05d148b9eb7d80dac36226dba5c51d65991208a90896cf669735cc141a3521b245713d0b072f0d7d2602d879423ec10012e65938519d1db1582aecbf41c5a988117d5890c27795ca6d96a4191aa31dffaab898ac8a208d1e3b18b3b329d1f422da614b4be802dde547930ace4065418ab73c467ed4532ce493008ad026ced84de366b2f28c0c9447c25d46a86b9880f4046237c888c450f248971272dbd7e45b058a282cd7d31e38e1227d08a4e0206aa8d4e6721ee3f5b254ac07f2462d8394ff31977b36edde69b81a1ff15200d4a22edc5b147a28a4a474291e01817642df61c3d365d318484771588bd93e780e58fee45ccd40093b2add3d1fe98b2c5b8eed1582bb2e2fde9affd0f68e28a27eda015b2562050b4cce6ed114030880e920fb214d5e4c54018b43d6e50d89b3831657eb9c7bef4a39908a7400d63367c3c3750a993822993e27ac13bedab32362e2d56b5edc78b42544c1664d4db1fb3aac1f1c10b36c13454c4a416e257ed9d5c2a0619ebd414032a20c2f3ae44110fdca5a80f56e691a50d42d77ce3e37a2b121c3b2a1ac77f8cf65f062f26518544fd4b5231475d3d5764111a56ffe5a6616366e2257a3d686ea4f688cbea44c07ab16f4738b4ebf0ee689a030cce67422ca9821dce6e407afb8964a12bc16078e4bc28be76065c05479c7d07f0d9a356a207fc93b0a3a933e84dae6d256e5f2914afa38c1796f97e49136c75518017e6a2d4864ef9328eb99456a9fc03dcd08c403aa0dd5074657e5fccfe0d616407f04c5ce4cde4869f983dc85763fa53e769dc4da617da85fd32c4e3941a86045579fe41aaeaa3f07f5cc3d1476ae927c45013f13cd33adf879fc07b1e8d912eae01dea7bf2ab5cd035cd66837029a671fec29f0f8c3bdf181d2ee5a4b9446b6b3b19149750e4a01b905bddd8fc3e8d5ebeda8e6b5dff9e2fc90c8c74d8d89604415a08720fe0f00a98e183b46d6f7ef7e84d0bcbfee169b9ec57fc08ee784d36b6c6bdb8c378147f128fdb9b8adb26068e6827716372937a3a98246da056ba2ca0a320e439445b8988113ef33a090540b64e7e5b40d10bfeb1431acbe7ea6fb984717bbfe37ef3d5be77e37f00d18bda83d186edfb964aa3e77181ee78ea7f59572f11a1b56e821ad17da64b3ee8cc8a53401d32f96a4d5259983c90095d6925af63a5a830977abb0fcbab694bb02f96f730551f934501cfa6948e5f15705db422b83bd3172557a7f4352a2532b618a9d3f9d1d5cb9c50f9189cc9a7753a110e115d470aa657adcb16c5a6434e3a33fe1c7dea85ea7f4957c3f4e449d2b629970f975f7a3963e3704a559d6386240e6e7d2ea1f527746de6489b391c661a32b8a3a17502b18038dc622d9cb4f949e5b211bc865e303948eba65d134a43cd28558b4241cfe371abc16a103aea04df19f226d4c683596dda9100b7c5f031a66e140908554685457448f88da673a096e2dde22832ad60c40d82f44cc272655213271b50394b8615bcd100e3cca9e2234b13eae1f8d6e74371be5c37c664896d9c83d994de53dacca30fbb0c9dddbd6ef67c111e350adaba510551888c676dc1815c0e02b28122a326e31a692c65f4713eb62ac994ce6b84bfdf779f7202d669c085c12cb642aad1ee3b5d69a6097f28e0c5b773ec064ddbf54ff7c820418b33b792602c5db7eddb26d80e5ef54ce6eeb3b49d214068b9650e084551561a14a65d5848f07c603de5676cf0c336b41ae05d3c00f34eef2a61a3ca7265129c6faabe4b7632c492f81f5ef470a6e8743dd8b05fcf787fbb1f1b8863d62a7c9285740086fb81bca1ca117efb3124a1dc40404b78fc6a99060ef112f7f64d72efb3d8289428bccff3a2e1af4bbc20ec9dcfae24b2820df4bec1b0652687485c4dc314098ded47eb77b568c3f89e817a64b8df2bf21be989ab842ef1e04c4f660058c0c49bb74c372090aed573078bdee7709ba1b72670d8d0c88a7e211d1cdc203079f2fb1cb3acd06fb8bd601a46d9e70738b9b82c08dc98aa17458e60bb54d4b95664d54498a0af2907440aa6358c884b57946e45c14f432de5391e59c1ba3268506c16d742e25e5ee3eca6f458e2bc261b934bde4b2aa737b41f6194b5d2d6c588a9f0fcabe1ca7edaf3ce769c20ab31656b4165203c4559ff22b989aa092817d13960c6a23c6208997c53efa51a3d28b144e8d72cc311c84f5d7bc2193bcfab222f6b805502e4c09bc541be764c6a52c68738397f737c20d67c23ef845aa501e5bb778ede795fb5ec87bff8be155b9c49d24e576114a888dca0b8b66dc1cd2472901bd85004041c67e087d3f0f868a37e3db973e4ff485dc109fcbabe7d551eecfd6dd9294e1076b7b416828f3128fe4f8aeca76c3610d8d42e82f2b3649f8ab8fa750da8cf7c410010c71dd7acbe0a81f777f5811fd36006fa01c04888620a50879f50a46c43e23afde20fd76557f7ce8f2767fc81081258c605410cd2d2c4d0a1734e984d347523093c26f81419e2bc04a54436515dd3c8f1b23f741644c68ba928786816d6ec18464b0796f142908eff8fd3660558288a45628658fc09a8e6bc48afb394d3c8618cc9000afd4b4f1203f9aa5bcc08f706969fa3f1b7100825e224ec85c323c143f74e204eb09cfddaad490ca8ad57f35414cf32e01c429e6707e656ecc0a94d386161cb8a854fa9b16353c7ea5a4a55e5a48920a771b1ae42032035a39fdb5cbfe26370c1edcf0b31e55601eb839d1e578fdd96a1c60bdf5bd8ce089c02a9f58b2a35b8ccdb95b9a42b5c7e1d6e5f25fddf9a4efbfa2b86f21b11f6e57fac6e6adb2f1bac0ac365ea09f67a4bccc4277ebe7e9a84382aa14d44b1ebc8fb5b7d8fadfe2f09134b172b62251558cce0525b53a2b315e1a8097b103401577dfa01ddaa23b7b0100f62d02844958896c8c6a8cf5861bd9be196a77c47c9877253d7b36a70066e9e24bd0b4c6f92dace474c2a60bf4904997f17c4596ea056e9a99b1372e6ce1eafb77c22c32e0b2140beaff4c9bd111645236980d86c8f1c21483d8d6f5e29b2b2aee2ae8218df6ab2a34af47f2c7bc1c1547247ad04391d2c4de6e19caf8b7ae0c3f821efed877d49ab976ede05642d8414d722e4821a8860bb522280a5e913747605aad65b82fd194fa66653acffe74c665cf684f18c42ea9a1231b674de204cd9bd4009f5877232e25247311ee58a508bd918e22fc993c03d10aa72fc076a047a7e63ac5f2c8f70aae511ff620dc02ab6754f5cc253be4e82dd91dead9ac7a6fe0e4895e5474642236bec21f0f79716943132dafab3d1d29137f679319f442f58aa22d371fa6346b45b4ba34b6acf256ca81fd3ae2ce98ffc129514dd19d72f6dcdfdf4428398ab251a688cf4e361591b17ad6478cdc467575c6a76c1823e90ad87c5822b14ad9237fc890ba5c7dd9360e1c5e8fa5c108f947242bfa516ba31852f9db26c18da2d41451850bfeb447ec9e6d945b9b0adb9285d62c41402b2590917e45a781f3dba0782027f49a48bd88ed2ad42a1474cd84db296a906cdca53c59b87d56a6c40174fa04b8f45cbeb2f796c1de758d1a85e9daa87240d27a0e08789c79c95adcb8b4fab0818f3247acb3da23683effb25a5599d510f4be5c31777b881ba310bb97acc40aad6f9966dd7fd354d0e2d7a7b9ceae3604edaaebb6a6d82eaad03e09b70e6da481f8030dc7e44a2e583562cf3e1812a1ec7743cf3901e6d456c09c3ef01da4f263dadbdee46104582819bcb51437fea7f7290e445a38db5ab3446ed65c2e9935120b729fba197353b3b3d2c69f6872a710b82774e5c131ae84cbb95f06d2b8d9be380b8583f097c9f86a8275527e6d17240fb962c544981b553dbf9d5b27d23152e2554b5c61198c75ea456da8bc7e22e374eb4da923ff6155ffc39751838899e2472006a9ebaed43d9e771aed43d4f07f55b09dc89e7884831d13fa06e5707d4329e4c03c532ebb8c8107252c1e10bb51bc351b54e6e0f08f5c3121940367c37a59504494111926a5bd4cdd1a394984296dee5ec40e9afb048a4caf3f97c92d991fb46bcc02850ccaf5777ae8985d7283df308c54940deed54de461913074138de3d8e56860faf08d6f9c4221840ca2ad78040a5a93cce7aedef4c2be9dc1c3ed97d8123b0056ba5c90a91d92912acd12b45d55cf9c076a08b409041ae06096ad0b8a5926c435290d7a716d0094fa1839ac6212b5e4ee133d95ac136f523eef22318af39097c905ad5f17b43b5b7f431fb5d35fedc5a56fece5e88a53ac063231f2d102b55cb6865632a6dc17c459510d6045309992b37838cea5f3c8abb3db4b19357766833981a3cd9e1c105f13ce9289648563708d11d1bfce352856b1aaafdf4d80f909b0766f595e1dea2e9de27e0fe2807e6050a9a0b2bdad754a3196ad97e5ecdfda0e6dec5e8938c3918c4c1f231ba342de036efa1e93ab1d09840a2ae84b9b65959091199902604ea08cdf802bef900ea5927ec8e8dbf9e19d8dcea9806fb34a79f6c922f47109b05e4dcfccab5b0e4364e1c46cb9d9eb26b2823024f1043b80f4bd62c520248dcd7d1a070a47d972de98b93f166a9218b2ba6c1bc29589eef1df7abf1c0b7fb4e2f4ec8075391ad797c82abbca83b3022522c460833afb06bcf8a4b31842937a72ac7147510a02c1f5ab338f450835b32656866f120f961294dc7b211d1fc882a3b6101527993db14eaf5ad3fde9625ef49bc6d24933631f85d8d427a1e14d19ed171dccfc66dd57eb6d5759da67a24e0dc5f194f23916843bef2699e23d56a6af5bc0c693b38eddec0d428da461aa504e4d4a332b958d5a0b4f966ddf82fa0510409ac4d3eeea0ff7704d31d3bdf2c6f01214c96bb1d8e69cf2f773e31089abbe3ee3839a0237d07593f00b43800d6b5de42f399b99c25bc82431d01312ee274893a41b2953cb31e8d82b23df46aff632b6d67d19794e545159533f6400438c0c9ac4a0b58789cba0ae5d810db0f83c7993dcdb436540f9400ce1a0966d060dff90aff62da2fbafa7ac0e44ad5658f4749803c50a1df103bad293e1262e9ae55055dc35aae3f9454534e4a0ceb11f31912e36485af3da0d22c81a4576f3f93089b1cfd736a58c3409be9fa120ed5b82f952021c72942774ac7e796108803c6c543605fd90203485c567b8690e14340992d622aba36ed49ccdcc0bf161b275a5aadea03ee1ef20583c2beae2beb4ea13058e65ec8aac9ee4a35773ceae74992512ba1e0ed19678e5645ccf09b503ab905e125a8a8349371dbf3785ef53e69f2cb48dbc20f395edadd0cc6a98be121f35d9a660d0790828e636a468e68a19fcc9540bff06c58e9f61e373e7e14dcf55b34caa094b05647c194dfa27a53510e78232bf0521c144c8bae484c5b1d2debdff8052693c2913bef1d3821488dc8abcb7a00e95bf0e1e6d5ab35dd1b87c1608fcec11a2283ee4013570d5bb9db873da1101eadc54be08d5fe39d310a1df95cd720b732b6c7be347c0d3cedaba737eb2fa0973e16ae27978e59453d9ee791a577bd33b60b0ad48418568a1fbeffd034a243696ea7a4eb0d289a3253dafd2cee104fe608edc9548763a10956d3a1481456788382ce48893d7839aeb96a0717b24d52e2d91e8dccf61081ed56b1130ba1c09855a1671c1bc1fdfb250559f7cf41e48f277e6ea5364791b03fc35c054d75168afc6a627aae6aaf2bb0a3675c3ffd25421cdbd3187b63040bd62dc1d9fe8769faf6106bef1de6d1ca388e270c1ed3bb32e0cc6577cc8677d5ba866228050e24386b9265bc601a3c44c530389ce837dab91d6d35783eadd8d1798c5af2a84c770e25a2edf01ce01ac1c28ccd2bbb3944ef3562a5121807cbdc2c3c982cf4f6d93f438ebf4def1c98d9216941ddb9c889f1c4d7fd8b7ed4183676768e9c757d8db0c62d81c4fb0d4e4463d1c658a748492ece7231990e8d74e904ff1b430db015427715d8e99886949ec80ff7ea7b35eb220c713c8301e6ce7e90c93390945779155ee5bc5d7018145ad5ee8cec4f030bd181c46f9ee28f948369df6120e454e2d96d6b7b69a4282e9b7c27a82923e9b74ef62d83f4fb5cdcdd03730c4ea05605a85c239bc5d4bad125ee18ed247a3ad5340cb443019be4ad1651126150808a9483efe9e3e9f8bbdd2ffb7cde09d444aa5c8e64b5e6e45e3ef3db2410f6f4363db8065c51a632fb71ab508ccc927f82bf5c2cf823dcc01d17d5f03426c9db69dffd49c3ea77fc9211fc3f7747eb945f3a9e51c85e4de976b8e6fdb9d4e9d04e56f42195c169a358603310b07b3ac930e4bf5f539ca823786cefefe4e2f38a758c0e88e9fc995c1ed3a04e38e38df8e876b78a48f2dca43456e6205740e756f4aca86d5151227daf6bd753273bbf55a33d2ebabfbc32edbc4f35d1d8d835fe1389333dd031c911752d268cffd2751df4b71185f44a6221671395eea4235b4033a2e8cfe7419e807c126044fa749c4e14f2b5b343a75ec9a76fe919e3d2854eeda9c40ba2d5416ceb4f7d2f36e8934811c30ddd4ad96f456439ae262bfded507bd4a643af50ecde3f577b455a102d6eff28d374bc9ec2f5b6b97f88a1d3cd96ef2f578d2ae135e5d29b71f048f95c81589da7acf044492f36116dc1833af2ca70c5aa84bbf0988199740612733e10c215535b971b2281e7539a9bc2dde2cb8f9114ea07c353152393022ff7e00fa393e59bd8c81082df1f153b53a3545770909c04426ca12401660eb0fba19b92707d9cb6815945071172eeaf19ac0de0a24b01044d2674c4d1abb829f74cca078d1fde2ca09d594ec670940e3fc83cbe92ff83e72dfade19e549ce859a6e1e0fdecb7294b7e27318c8996c845eff50a981b9ac51a8265d2bf4d7a4892a826c69c289a00a2a1acf2fe42c53aae701b215c984c5aa39cda26c4412f6f3153edf1120dce289f263b40ccf57fd263117d5f69634738e44af54fe017883bb6a561edee97da6e5ef8549c9f83a08b7976ac0e8f8c3270b80b9e28dc65fc50c85885bbc916b1b20c0c5a5dd0f33171457778adeec49dc0b9a999780b181724624bde5e53d8a4b1ce4cf96da01b9c66e35762155a9b74d368cda8e3dba03df8506fe811ab31b2c76a3992164f2396fe8796c36f5fad24ee8694d28038ead3d18c32f09716a930b5e6ce80deefd7698bb279eec37efc8e4c550063e838e09eb8a0a1ab5b06f31549019d65abce1a9bf1e41263b2e55ecd4936201b7a8c2167238643eeecfe95e267b122a4bbab02c98cb98ef2399d8b96ff9a88268f36ec2cd006e13bdcedd0e6ab0252f974f01595a5feaf58faa6ab0958ceb2094bfa40702a81a7d972bf0af918785f4e8677f842b1c63baca0ce88522d59c08e89f3e0984080fe730e9e319fd5a77084c4bd8d2741e8f2cd423480021d11c622acf432e61c534c508c26487ef3cb0d73968064796fec2858cec89b8dabcadf1b828bc1cc8cab56bde993415752fd716f11b4621511d58e821d11612b619a89570e376e324ddd719bcac444aa851e6e37d382d58bcc5843f00f0ed4bf8c609e844d51364d9a2093ecc86d2e983b3e4f194d3bda79ea9055863ab6f41f345930dd25d04d78120a9a11254cd800868a91aa7cf686597faec59a98a1a5c1339207cfc63a92057eaf2c7816a3c133b88c90c8fd809420a5154c24b43bd6970b7dab514e5cc0aeac5ae9a83bff2f7be4481b01460fbc07d001da056a0764ad01421f8ceca9a70acde59240034c1bb9818e8421c2c02d87a6d6c9807e5b10e11d657f9080aa06e23ab6ea6b037118a345e140dc9a09df851b7cc6ba9b89d7862b0979a26005ef11a563c5732012f072e5c6bbf2aa3776f65e90dd353236d08894c0b5ce11676b4884e734c5a5f3f5cfe611d198711d2098db33b94174772c378dfb3cab00470aac4433efefdbb97b166aef3af67c97b52732282a8dc55a94b6b68456ca9df0c7fd6ad17ad70851de0cdd4a1407f52ea7023fd569912a47bbfba89016be35d6da5a80bc98396ca69caf4ec70a10eb1e45a9d00e04fcdeb61e4405fcb74d947b7b3251d8b957e1a79d43372be0da6a30217f786ccc022660638bdd25ac7c62210c3136886b503b6a678fd23592379c5f8bf950da1e0a72d518727ea1a895e21d842e61e215ab2552219b6023c02718a853e19868d399c60d89b5bf71e4af1e5a0578acd6c5f4994b1e7dd4823c8e2973290f989c3ee77d0f91f0553ad6c57f10a824f1175af16f3397dfaa1040af88891201c67a39a31fb466bee425bc7822b394fc1513fc6975250bb04f2010c8e4c7af9d3a49273cb3ba16096e34c0bde9756995a947e7bb9fd94b8102226c9ea2a699cfcb5b1790c1da3d74b405245713328bcdcbe90ac4b52a203b03e94b1400e43a1c4e59eb3384ef2f7ce8b40759471e83e97fa000540cbb64174c834f4ee60848a6c7a612b19e761530a9b5bde319b253c9252285400a71a387a6994e4825f249f97b62275cf79efcb67d2f86db39b9e8ee8b2662ff944fbe5d0c9d441efff54d2fbad874e1ef6733eef1b55944e2aec75ff2b0e228de1d8d70f9b30d5d2b9964cc7588db1f164434c3881c815272b365e40db1da3e42b14160137348557cc0beae4a2c50c062e60feb4471f53113a4dc6c74a49444924309932bcb2fc5b1087cb3679c28449f2d3a0fa32a25fc971001692a90b422724a679f26f43e70575ea126e2a81c5a91210a466e563bce0ade3c5fc2d4c27556ed1079b75260bde2a537920e55089c0821ce4ccb20ef979a6b7abd8508c4a5f9a2c55a683b427cb2a51e846e59bcf71834743e5445c0196e7cf86789c9a2b02d29eae96eedc242289da8a23fc3c2451f8fb0d6b53c3a95bd851aa83e71ba4cda1d2a69d4483b703d3f7956dd33d4c5ac728d93bec6b72c9bde51fc17fb41e3a20e22217bb9edcb3032c1c80b86422186421b8134b58be3c5717d7406f64c26731fec922545712c7826f7f7f742fe77050bfdad89e81bb3ab9999ca8eacfd22871769cd8c7a3f5db241176994c55f708caa516f38839b2ea338b4f117a2be01e85d1a150ef43ae0be1fc719a0762e1e570bc644f446066cf478b45f301b0562e87bacd3385ab98a8651488d33e8d83946b9bec158b3ce102fd418dd57ba5e7c78ad310420442c9003e4051dec22c6560c74fe1c77c583d365b8704c909a4c48ba2e5bc6a1a6810759cd69b9f71a3f22703d04c9e1225404d23739fa297fffd4f722195340f88de94f1df6c03e239bdb0962046e2cca3f4d19417aa4c5d2047d551e817952c0aab3f2f9a11d9ff0f35860e457a597d30d94bdcae0b9ce3ac4373ed49a2460fa03251837c112ac7ef08009a4dd64101ed9dd9fa8a212a901851c384a554f78dad582b17b0d5896539f1bde95a7eb6bd03fb4d9f8d55fc5219f640c74cf0cf1c7bdf5b6c8f03174e0142e20d217ccc8e6f649b3fe1fb22e462672b37c47e264bf4328a4033e14371958476d88676168a0a2dc7b5344672ad42388952830f528ecd7eb311ac94c54371817bb41b3c635181e7f3fe1338bb3530af9ff14ef784c5eed26fb67900cde2bb04869b01ec25003991ec981410cf1cb3928b055d712bef79570f7173c11b90a9672b0eede73f47c59e40b766ddcd9030d6e562aff47b257d7141d6ea0d195f20fbc70e5398f7958631cbf9e2e486b083d315940522c84baaff0ad845087b1a781b862dd6f72e2f88e29e616c7d77585e2d1a8983349e5b381d0ac8bf223a413198255fb7bef61d5522b2b561f6efcd3c86f9ec103504fa37ce55aab841c6d4e0a80266b18f676d8f0d942eb7543b754497ac51c8c913783bd4f66a176c86c2c30c1816b4367ec415f5fe8bf35820b77c7fef87cd8493f32fe5f2a04f6eaefe66541221681aee0a5a299e7fc433823ab4713af3ce2c9a62efc67a28bd0bcf4b98c236f76baefdfac21e1d9f955ff19a9aa0ea5090db6541ba6d13e41ec84b9666dc7b36d96285077da2996143edf9b6800b3bf05f82fd1310bd218cc8b853c8ba9dc39d1ff6f8ff82503ca1bc989a1c8864f00b449fbbf40ec992f92c703c327e07113efdaf9b62ac5eb679a36a7f958275f287054cd6ffa28023be68ff4c6f7a6f7a0560593d6d78f27fa8f669c73dbffa61078f5a48e02fabb0f5107aca01a0c56e4cd510a7846aa234999c455eb89d414f822bd60dc48466e2ba91fc9e3107a9ed9497d47db3b0920bd9aa5501dc0e9d97aa0c7e66de29629bc6f4c791fecb832c8987ac268a9a4d4607a0c8e6967fa2be134519f1c835be6e6c853521fb882251070f3766fa40a72a72081b6193142aa762bd46665c3ce6a6d15769c0f3b5ef17824ca38f30dc6ae25bf9950f43d0d5a25c7877bd06f279380ad748c2098c95cbb3dcdb39f8645ff78349953c5059b06c4a79c00c20f67e90fe1c2c8f2d6a62a75474346d432e6d68116b803a035f114dadc6021e7577739b20fe899e9bef17c0ef9ab4b363161b6ffb7abc8a591d156f92382051036e95f90a49ad63eddc83b7b9c41bdad10daaaef4261592d6521387ee28a4ac9b58a29abe2412352bf5cad63664ae109025d1d2225cc34fbf937fdbb952cfff13b4c40b897ac4d14ff835d824e306365c19241884883516c5efb5699a8ab8631e34681149e60c1422ad7b7a1cf030adaa39b6e81c06edb173f3e87d500977559f05b068fa49197dae862479f07470b20d91bcc5a126745366999160a82124920c787d544f26466d1b6a08e0cacccce3a23014562c3cc947c481e93d30906764c28355354339b08c13838e84f2632c41793a1ee716f47404b5ccbd0f7a5d220222abbeacd954a150692e638cc1c9d0b5b085dcc1ff6775f67e0af3363fab9d7f812a8891633aeb943a6f8f8a1498aa8f75e423e5393c44c70cb86c641e9a97e674afa02f927fd786473996b03fec59fd14528822a80c830d15c0b50ecb67301fcf03e34ab7279c0b4a36afa95f82b5032a76ed52ccb8db04650b035dba863b703cdf6d728951525ab9a454e3f58ba380aaaad89ff23b23ea369aa931f5344ca424aeee94609fcd20e401b3770202ca88bcfae9256365912236c762af6a69d6975ba1976c1912b38f2083e06d4a46a68149557385e570db480c09350b3ef916dcdcb9a81101806081bd08a224935c394b092cd186f0a062420ee0bcdf70a819f594e7f8f3eb7eff77385139303ee741db519b4f33bf1a5edc2e1a37d4543094a5c5db647c28dd025e6d0800fbd8310b36a2fc6dd1c14db095c735772aa9827fb9082f2dfa1f5584bd33b73a45663bfcb1f94100a422954393fdf3dada554715a75a5cf3036a31290dd6a27741bd6207336e9407b9514795f7d2f6de9cb1a69ebbf81f3c58700aee32ea178fec35ac221b042635e547dbbb197d6be577723bd82a5ca95e063f1134f1e9c1104b5396de627733e603d908135d106a4ee9ff73695f716a1915ae8cb8b15fc352c94c019ba5e8097f1d5aeabc670a1bb3084db6eafb117f1de44de5e186cb73595dca6aec038fc550091c28a4af2cdea1daefd50d7aab68af227a5c213c4c9183dcefe3edfeb38cf7ef5aec16fbe3b7eb9da679794f778d9849ab6adb4c22adb0f59c0ab84d04ae61dd24ad4ddbdd403e7627650aec72318b872d9756dacbe48afc1e25d67b1458449189b6176520a7778738ffb161631252b576ab67071281363e84b777f08bd294d995085baea3cbb3d04b1ff5fc69390fcfe9512b044994304442ad9b09f6c83cb9d8c333b9a2d7630ea6c05f5ab3ed699c85b87554c098f318effc354403ce970a4d58f2ad1fec06fb6b8e88f1a907f422261598a609ca794430deecddc37e469b3bfb2241f5e78272325d221f53130038a379973c0c0a21c59f28e96a222f08ad699bdd5aded81bc5cf805686a2f5b0ba33e8ef92b634d18b8c978ae5e75282d149b15495f7994fdbb4fc0e9a6e93c9ae0eb04f4d68ea40cbbe7cb8eaf729e6094441be9e75da7fd5c1b2fbfbab1bfb6bf0189334b5db9cdac1be5c3c579bf5f7757b346d618ea1c43787101dbd04996f9270bb56d581d846c5c88fb322039c12a353d6249485a0ae97a8dbe6e9cb1554f759ab56e4097c178d3c1752528fafe458f41fcf4d2d3805fc1459a9f01bcc84198117682fe540e80460aa6016497347f6463df5e0bc34107f2b7957d9da2ceae26d192a35a5cd96349eabab6b9458f0f1db4fe5e3b6f6893bbd94e32296161d69b4a9c4759d2b4a631ae74b7d865912ef6e21be00c8894617c7bc613c1758830c0cfa3116ee1b677be0a700dc1787ede8b46465ccb8792a53384a350f4d39d143c3d8c3b859ce736ec53d923bc189e4937a8aa0280ae0d001bf34c3ed325bacae4b63ac87e7af9147bdb190806362f4c49868031d615f263a301ac46c9a6009a32e4956be41f177ab9c36331ea5535f26e7ae043e8a8326e559dc210b966483665d11a3d2619eb2e122c1680f7f997ccb3f4ef2963dc095332673264d17f9244fde44f2bffe972d8941598537919b10f0060bd09c868da477530655657bb4b1fab227ba2dc64de6896cf369f2b814d78097d4237db2baed03ed006ca039a6a48717c7fbe55e2f4918b4210a752d6a73c6967b54e8e270f02557a26c5d2a682b5a1e7218f6a6285e4d933b3d1a8bc83aaabb82bdf354172015bc505b4da2c38431e35dd8529355e1d5a68e11f0149f8da51bbe4e7b3933c116b7fbcfbd33df7d7116c79b77a0b67b3ba872aba0b4f7795c018a756851389f580923649ac8189080c98a9bdd67888e56926ce09ce179230e9be4314186c4cb6ab9ad683bf5797a96851ed1ecf986bfec8152b12d2f3ea13391c439b9eda6d829b94a0dc8aecb48232f16cc4425bb23c55ec8dc02b62a5b500e4060d0cfaea4d9e14c23dbaed1eb54a03067a17dbaace48b70f989d55c065404268783cad353534e41ba635909a7a06ef2826099556012a6ac7cb289d1f70a8a8939ac817f7bed4abebbdab1e5ba9937585da200134a5ba5a648311c11531917ca3740ac336cf6f02e305af20b3fdb6235590dfe09c72e11adacf9cce64090d61ba10f50e97300e6388b3d131c65042f1ad6f5f4defd3419992a83583286dc1858f702bbb53b68c96c21fbbda8189d4fd35c1aedf7b066c6b47f7b91d232df06006d0a027ab8072db2f0aa443e9587e6493758084c6af165cde13cace6b94f36cf2345a945aab93bb042aa3100490b07050e867d701fc4f9bf9416096528dfdbef6e506be8181217cf1ee0012f781219010196fdd154231f9b9ebd4dcda79b675c06e04f36f4ad9f97b8452e0fd08ad092b6121708808c192969c6264631fdb69cc8b424dcdf882b2e6b516328e96db65e3074d4225f6ccf9b5fd49d8cbf0e9e15555b3a5e125af4052cd3e284c1db01fb9210d157d86f700aa99f2e6730afaaa1b294f911d25edabe595ab142b0703262300bd393ff559ae816116cd00de56f65a80e30a426886f10fb14dedfd877fc3e531528ef1a947fc53625a1e03477248309fa358afdb174ee7a136c776047be48b6dc39823ef91e5618caffe28e1bebc70e5ee0b98a5ca94cd033e73a81f676e809705df17d060a8fa78d00dbbf2899b90c4ec077a0dadf1b3be07e5ffad689e2971d7ad4d012e8aeb74b58f44a8cca3767c18eda21a1476bffde4aa28d4743759afd7d9c600227dc260d97a41ee4a24ce364709eaa4462560751d09dc9e0769c6858117cb59c40ea944b243ab8a5fbe3ec11f006391db67d188b69c4545e95239f0de500f708e3965ef7b98594ebc8d4d7be406e480581cb065b80f36e438b4885552475be1ca6f0ee8fb78cc6b0e4180bf8f73b0eb8551fc1ab92177fc9717c321a8c26209a66d76acb7310001c48c009700b4a06e6f183e026487189d4f8344a89e723da96e23f508a4d14fc1c098c621ad5fe41a49fc8a9fe4b064edc452b00d3f90dc0ea4ceed55c230f2a2c1b3f94a9099f5f4af5e7ac589f97f1c5be788c3477ba20843bebce1e52110140c209591c022b944d6ae8f7ffba7bf4ce60ebc6520bc8e338d652c00d54c54f47df551a5e253401547715594a7fb87640e1d30ab6d3200ba2fec3121995bd75be990ab8f5b9ce9b9dfb247afb97ebe05f63625bf027f0cf313bf97a5fabee9ab95d758a89dad0f5b357e582e426aacddf6e8ef148d4cc94f21cc9f7e9e4cfdb76163f980761356d820c84cd653e6dbacf765ad3734e256bc950a823dd32e9895845916a8f492ed6d4ff638715321ece29b40c6596846a6ca005a45adc229323ee2914410cd46c490632506d88ece680cde45359bf2d0383dac99a07c74e1263fe3e45366b6daf8b5da3fd5e6bfedf3e88894f830ea75a7673f59e4b69b88508cd6a4066d1d979b1083b7d98a302e64cb7bee29ff76f5436e2a36716125e36b2f2f05af7e5f07dbef6029111c7a2ae171b398e738c9e189456b532e5d47daf2c9993f58acf85532b478b68aa718958f8e7fe9e1e25bc20d8661a9f2317d28e186831f425051be1692b08bad16845056328434f80a1bc1e39905a8e5cfbc1641786c98f7937fd4bdffc9eecff27e310a5bc83db09bb4f1df387e121888981a55d97e7d9201e7653417878fa81629bf9d1bba8cfd42f8c08df31d343c1b8c795ac090e89a8daecdbb1eaf0b2987d6ec4d8f56d2c855b4145089980da941dc8a0cc9bae558e319fc081eba90855f29401353b0b635fb9cf2c08f321ef693bf1ff2abe4c1d9bf2fdc324fbee39e5cf0a00f9b1104307513eae799eb208ce190ede1cf199c5b0e9babf40f786076c91fef8a9898b29891a23656183ea181aea7701d47bbd3cb01b01508a8ad87beed76cc21413870731ea8c5e4772a66c4d7ebc56b454c03cdcb8a941da1f83db2c56f5a11dfb07528d56aa0485096d53e6fccefbbbf49763e7ec20bba8c2e001266b949df1203937a3e93a4a58fcb4df2d62050e8c7ef594f5aa52006cd3fb176773bc21c14daf36942882620305f1c033a7f537dc7dd486c130c869e6a72deb880bce3c2ceb72668609b80ec85c5ec314e69e56fa2cc8832adff103bb0fdcca359461b2a9ab0dabfeb69007eaaa71e8ebbd802e1bd5eef29df9a83cf1045020c6cf67ceb447add1f48c5f3cdf1fc06f7534af80c2570b721f5577e88f6bafc36c68466172adb974c82a5a9206786b3b4c4c99935ce42fb5a77209b17d735f56b06ccf58e7d292c7646150a9c2feb4ffbaba9b469366b2b6613cc29e6cad73d5dc7394956b85fcca06d084a3a6c6be756ecba904d2265782f77a4c45d723dec0004120bae0a4166d07de9c15b95cace0adb38787e179cdb533466dfa4b7f7927e04a315e9bf05e5f5c90054aa14dae2639fa57f2fb0f551daa6acde5c2d745b5d400229bccd2bf642065c9a19bb4df4ca650cb416709dd36a5592a761a3c71da256a590df2bd3872d0a0744133a0714a8d2b206d4d60358496cbfc0db847d46ef7182379725065fd535f6125b56a813d8c918bfa0c5d666ea9aaa9065f3a97ca6e4a004d7780181182c3507895cc3ac997314986f87e0ac4354f2eae81f87a66f287e139cf5e0ef073d80d2ef5e5e153937c3c77e573a25f37499c6c5af7bf4b9be3a09583cef8448bcdc6675c022e683b810e1c05c46eb225b9d2e48988b1520a3b690e586925fb0b2bc0e40008bdb13025c55fe33ed940ffafeaa176692aee936f2c472083bce7c53ad44103afcabd3b9081fbe6c4670b74792bad9dd720c610324a6503ad9b4187e74ea11bd146774be71ab4f4e7efe2512dc5eb54e7647f04467cb55473c4609c6473c171607a794abe29dc338214011b2c502de02c116fa60c549ca7f645d6c229f65901db50ce43ae8205ab4bd1e0a7735c3c55cb6abb808657c60c24010e18ca5b9c6e868fcabb10d0a15eba358b43d0d9459f2ba0c181aa80e3429e7faa5a1875d73fb7bceb401952d5cf4c22df72abc059d3b6405f9e8c0975dd39a23cdff17bb16b6417c0392d49c315eae532d7026a11cd34998534179128f00a218853b9085b7750c7d3cea3cf39ffad056d6d93a81b91e64d13cdbe5f997e447aa4d81961a69c97fea094c240fa7f1b8342427e2c6080412e1236e42e52547a380171d9a8b357f035e4eaddf236f204ab7eb5979a07c961c5c1565cc0c797bb3b7a0f7bcab0d61b837c0abebb9279bbc69b02de496c990e73325c580d5c8f8fd5b3f823d2e98abe7a35bfc544250dadfc2fb14eaa13dcff08fae06488d211f0f034980b291d329635a4911aaf78469e364bdde36f402b192fdabfeea01b3145c2677fde3e6ba8c8564cff6bcae976c50cd70c1272334d070a954b2fef5ed2ba09a37ab02f4e6c0e68d8e1dadeb232fe81ed93518f10e82a5a79947ee56fad334f320c96153cc02da2c6bbc21a3352e7ccf04cc753f42832619bdfa8070e39780a5c7903174ff5dfdf1068f26d5eb737292657e3582cb6dcddc3678072b84fa0bccfaab0a557eb735464b6df67a702aa670cbf3fb22f1f5aca304eabb1db8035552f69231637ac9f7ebf5ce57e82b2723f21c6232b095caae00b9c747871a86687a52c6fa9ac6c3d5831d129e05b3e1d829c57be7988cf4efde78cfba45c04fed6295f1097a59a0cc0bde29fab9ddb39eba5428cc773774abe14ec6dbbd9e26d5d549e33686e1fe7ca8d174a863965270bc1d703e44e0de94cb60f83d7e50f6b3c5c6dfeb4bf925e477e2a33fd5fefa225bcbb3d4ab9e70651beff589595643bbd7978cc96310af3997519167c5aab501851200db7430bc5db434a1cfcceb9e3a96e9870d1ddca2c8df4acda3a7f47fc163ed8e0febc612adf8d27dbdd35e0fd84a00d7b72e5cd310c4392b0c92c70264b33cc31012cec1942d545d84a31f617e93263518244145678759b74798c8264da9c3f54e6abe9bc02d69cd5934fd99b035d3b9ee43a31afe346b05693c7a21b35e955f0e7a9d78bf7246c242a68b626b30707b232d360a96ba1883114cd36b69bf1ca127fc83d0cf62319c7b6c4a9f0800e1fa4b4c51457e866f922bd6c4cfe0fb26f53de8f06482cce4c54bf75ec888cd9f7c512c6a3d397c2a604f71d0b28c1350394233e865cb1d41779af5a4e45984571069166ee850497edf13dafa80f123572bd8a7d3e8b0d36cf3c662291c3d9b23ef946d32c30680c33bcd1568648a6fb36beb9d4f940c2934c9ebbbbce94a46dbc21c12cd8164e2f213a80a89de22d60e5b5fc932edc1daea6cf1b3a28a0f2ef32eb5363d1c402bf052b080fcf19338a6c55b76419320f0415703b95f7f2762a3fc561befd412fd8694ca5f7e9860be8399dfed994b2648aa92e8cdddf669b1e4af2fc74cd5cbd5dc571fa9f41cd82502ef10d4c31c14fddccf54a6bac6f0e751f5a38e125252cb2d74d80f02be07325f109cf085457a9e856dfd435e526f3057191265f3f4fe49837017f9e808f51553cfa747b41f7ac547afd85283710b24263b02950a825d50f7bd9eabdf95611f98b8f6d897b7602efe7b91bd131b23c4eb937e876894cad99bee3b8e42a5df3bbbacd9d1a4d893435a94a81bf683fbff02894d0122aac28fb77d569f0c9b57ed798f4507052fc48bda8f422b78df6d09aef4bb4be9b41b80af7a92f7757c394d2975191ed928f93b6116a227e98fd2194154e53b7194a1de118ca2dc4a4179a0b268ce41e039e54725eb2c6c3ea494c61d3d7471a27e6232f65396e8f705a33cf5df17b8ad4ae1036d9c332377229fe2f7c831845be0b6dfef926d864ad82f5c0d05aa6248fb1efdee4ca23442015689388887ef3ce8f72b49a09902a5c29bcd919c60b2dfc9291f8fa53c0ae890efef204d1caefa1d16ef50037fa85c4996c7756abe1377fd5c164b104a812bf1f53bf549db9871878c20b9eb21338c30303a7331ba039bc7c8e2242a5a8b0329c0e27e15e16a7e27ec517a73ca64d8a157b30bb9f7f15e8e8a7d5ec0a7a9c261bb9b4ad5e370e03155eabddea5c290687f1d90130b6db44b94c0f904c50403bd2f6a60b2d827a72e6f1a80114c151b839f6187bcb177e58fec4d7ebf7dce4deda78ef4746d18f80da10171f2fe023974fe1595de6ff69d03d5a392fc1edfa15e127e47d33dbef9ca6015ba77ab993a8af03c27ceafa18bc36b65ae074f56d77763a2fc4455db690618dc33f4f96820d5f6a8fb2af50bdb8501cebb309731ca0a28e7b9f2f7d77a2fea9f40f2dfb9625aed7279c384e9f362bfcfc61dfc483ae759fbe2f3db909041b1df631125457defbcaa11b36d18c0f31dee7aac2ee779f4ee9d7fd800c311f007ef9c548f8e7a12604925f292aecfc8d70d478869ee3b5153e3a2373cc0b07bbd4f3bb7efd3e2c2e81de7e9903b72dfab61f47e9af774ce539da77bde53880f0c4a1d4849e7aee0507eb7a7e53b844e03c117aaa2446a342cd29b7bf455c3571b7f8242cc595a752558c86601146a96337d9ffd3e9a840fce9fbaf1fd2a3be4ef8b35bed6690f4020ae4541ddea7440400bca93a1bfe31f27ac238c96551047fcab29abc83c1217d971b65354bcc76fdcf1373eb884f1ba2b11491863999da591570f448c03bc3c11687835fef8d014786ab95e12caa00bebceea89c0434301c1daec98f96483224d41e5689a53e927696ed15752364ce67841e088c92fe3193d16e2aec4c2bbe12436fd1ef11dcb7ea9a2b2a620fabbe484e90f1230552140ec62faec9ed7023e00f1e2475f679beb5a016602acd9c5bb33e6cf7644fa763dae9efe8ae6d1d21adcd6173b6588b5a3a5b36699132ea9ebe0ae0fa1c01c794c8c461cf9e336b8677bb68af2f1eec5002b3220220cfcff07a6be0a44f785c6305d06d3b57c23b3b855ab06591378a4438cf0d384617b4f9b918c196989462b140639db6ed1568e192965c137371c0cf8507b58b7875e046d98050a9aaf2fcdff13c54c0955d0058e969c26f276a6068d0dcfa63dcea793a535d85f4593a05bdfccc254dcb74965521fb1eda0e22027498b5ecb42e686b8e5c57dd1da8fb84f8a263cd300105f0ebe0c6266916dccc0f6fe88bf15c6154950ef50fe6fc14be8eccf9df4c326d4430cc0d3a7b6f34c43afb1b85022dcd078c7e615ed660a7da7d6dd473f741d1bbf538f36b34775a638c3d203b0aecfe1f2a97ba80df9f2b4e84fd8546d114a1b4e489f4ea651c095f64144b1da70cfdd97612a1a0188b0093deb8f9011a9edbe54e00a2019718155d78ecbed01f7119e1049909d0150357b7a1c1a9d5c04d15b9d699fb4979ae73d30f33e1ac2325aca3b3efb66168dd0bac4041d1d4a25603ca760f984204218bd5911042b915668735cad7da762e2bef30058e5164758db07a9217f64e070e65ec27fd0c0fb65f594bfb8ad35021d1c517352f3b4057421ffc017f3116203edfa2fea1ac541148e2261e7884fcc6c8dd3df44af0f0f0b5be7878fe44a3936954f21aa38066e54bebea116f3a46f1ea035b9a5bd763cf2db847f8d71a2ec3945ebfbe7d46f5a746f90982f0678ac26b3157255a08be95eaeca862ada0b5aef2d2bfd1d4f0e6c2b0c6aceb1b4877ed286d0e8e625333ff208ff2a67921558ada0e00f6eec690cf446e687cd34d9b041a2f3fa2a51246231adf412822c1bd6a766674f0e0ed04292df24bf6f388a3787d51087b05fa9019ea4568f3a55b02e3ef7ae6035a2ac8ab6e13c1046f29c0910ebdec9b7ae1aae15d816caf02c12ea78332a4233b397ba0df63916a7443124f651e383e99e404e3eafabc315d4d98fd1ef2033f2ebce324a8eb63385931dac8a99a48bf512bb1691c8467680c393051bbdb6b56aa120f50ddb0e99be3e59c26a2c25f2d267636b9f530d83e42dd20e5acced53d480a77fd39d9a4ec3270a520e66402083c4816d8bda1ac9bc06df4d7308c8f9968c48d461b85b0d168cbbeaecf4c091feadde86b5971cc7aae7a6a96e1f6b00bec3e83ab1f39dbf0b0b53c827b55d5fc0f21781c3909c0da4b60f8d41a08f43fbd1d56ac0d289c2f5c1076b8ae071a869a0896ce865b3d79bdd6b4064ef97dd809547911962bbdd91815ebe4631de4d45d1c4311340d623244a07d7c1e1844e9b507ace0f66f33ef8a93177803e18bb1bf4f40d3a1a9a81c079becad36426e92e0f49deb10d26acdf0efa60429c1345ace6eec0e6eb6b7fb2e2d5acf9a96d97cec6d4e10e9f9a052c141dce9c8828beecfac574f7832868d94844e50a0e9f6e8b49a1b008622fffb2dfefbd99c7defe636cee52feec1112637a42a10c758ca71e6b58de928aef55c8f6d91a062b5b76e7ee8d15a6e428cd79f1b41bb9c661365264ff0781166b9e4f4988301503894b36684a6c6a62e250304dbacc24eea0d85bebbda6cdf4d3ee5c06a6ff17cb6e90b81cbd421c143396737e71d1e9142360e663fcd624f1b40e0a69b86a327ea8448d25700031d9033c1d0b6ba16bc1d98ce65b2ec86b36201da746e80ceceb9e81e64dc46b60da62ba4539114786e3e10431b43c3f7661ec90877be01c995f527e89c95647b61101a9503c1aab613007358abda89b448584bc1d005177d83228ce48ee60265fee91523f5f69e7128a8f57af66796c8c4a5697f4fd68933eee23c895ca7733189543365c21088fb3c65c7c6d678b28120b6720966e1923ff1e6040062c080c813b4e5df7248f745eb8f775cb10cf0dfe103fd2e4af83a5a4411b51419b7bb4b5673920eda34428b5f824a488ec9a89ae72f94f39b51e563420bacb98da75b70457865d678dabdc23e1b861da4717d687ef05d727a4447e647d8cb8c48289da1663b32831eea38142dc5707b8a84331a32bacffee377c07466b048db27ea608bf47015065eb6adc0dd4e3f88a5135a30df6aeec29154832d217dbbfd9cf255cc50a201999446f499568db9c9ba146e11b012c5d1da51bff88de22722498fe84df9626ca3df834ba8b4a15551728ae2e1e0e87034e978ea827c26f1eaf9301017504c92c27ffeb6a0dc9bd0f88b41011badc2b0bd6e6e7bec0da72849d5289c143f5aa4a79596e73cf961d6864be772e5b588dd15d40183efb203eec583ede613ecf217db031cb90a175bc1fe89526d0336df0faecb3d350bfb0ee52cc4261032a5002b525d692fb56d61d8d6c44a77bbccfa90aaaba7101dfd389e50c7282c66513126bc3cc06949e09028f005c1432de3034d248afcb7b56db50973550967270188999a88ea139c9c4aa544c6da85869208a96ae6f526ac53035243fe425f3651c1c20c77b927a4ce6e33b20372d5dde9ab06afe61e769087f17f2c93a52822e6c5fec0d40af5142ef1eaf885c09ba03fe1338497a39e40b912ceaa44f291b076443164c05c6fe60122213c7c8a272070400b611b90a12f373884e16125210c11623e1576a45d6a1040a6804e480882e31ac99c5cd1ce7180e4c39ed99ed9578ce422e756dbb6add2c7e97d243d7fb79b95de8c6fbd1b8c61a44db0166ec48865f0032eb91852581c2df8f9c250954cb20797e2450b31d920c450275b557f0dfc590edadb2e70b674cba4904f367684f12b2f263fde719187dd82c203d5b8caa0195d7209edf8853a250f09842a4f1d72f5554a53600ed6efa5cb65c97b6074111b6462a0b585e8b6b9e957c82554719dd60da8d7ef1c056b04bcd61d2ee451cc5b518d954e880f8978498c3b305eb48719d58badb9b0b0cb6594797c9950d7c508468b639789495604ef0540b446be51b8f618c8e97bdec9c785485bab2bd47d343bfdeb8ddd1e570ff912b5bb84ba94ed46d7c8568dc7dd7a15698b97ce04bd9f3b0d5e8f1969906d0dae021459e25df2aaab6b6d0de32543df7130abc1137f29d5f17585554eea0623518fa8d40bf62c7fae09e6f11384c526f26f33195fd27b11cd807ca0329498b36c9f568d3a1395238de9c2b2777923e43646eb5d99a8988442b702cda7b226ed0586371ec428a7d6d8ccad65fb8efe867e99dd3fbdfdf7de38de8aacb7a9d048d721db1ceb2cc0df52384053747b12cdb951fc7c064b3ebf4ae24c8ac53ec88079cb96c0b74e1f2acca2c4643269606a1b1a1400f5027b628e11ee74a85f08e8747b5126ba4f2bc2735d998fccaf7c5e11a91a720abe2f1eb41ff963d10e0bcb50777067fe176c49acee8f6910195bed065777911b8c4b7ec2603d70483202108f3a4bbb9712958dcd289386d9203fda435915983d0da2050e27d167193f386562a8a74bb5337c0f434f8f53412171b3d9811486feff182d3067e6ff499cc6702255ec608914b40bc69a039aa886902f53b855c5e2c7280ba5593f92989ee24038d6647afed868b3a339c05eb27ba33fa2fad99b53e798ea6996741e02b58488f1c83e7ceae80f61805880b577f5193f28ac135e23b0f0b368671e39d3e0305f50d293b6d3c8451f36b331e83a429c29f3ac06acfafb275dbc0f9a48834de186c882c1889fa90aa699c4b361b7793c6ee6ea5ee627bef131391db9b7908c98cc5e36b778cfb16129046445e02a989c8098d20e440e614154eb7ac3d12b3ec2f8a6e73564eff3b080bcf9e7b4a72ab1ed60d05ead87e2882a6535e61223f524ee52931db2570cc78ac3f8abbdce99979088947ca5de702c6a6afa0133f3cf927701116c4b95d822b1c0de3dcf6399b2324fbb6c559b35bcfe1b55850f518ab3a9100148ba3338c633b54170c405c7ccca608debfeef5dfd87447954344e7af4c8f56fe55a6ff12fc53a6ebc71b2b81cd68cf756a698e08519f87e855532813a4ff04696cd6d0a03362e90ab4fe322101f4c1350e94590783c1b53859b4035f8b43b71ae92a10826e4a22b7c986590bac41eedbbbc684e8cd37e2a1ff36163217e58de20677b8c15deee58edbb967dc80931866585f4328d6d70c524cc30d8a57f4f85dafb8a383e3ba1b8f3beee1867bb9cb1dee3b770228971390bbd33e90ae91426fbe17acab4c48bfb6068be4480b1091a1f374bde3765d9be2cd2913558a651e001e71a5e8929af58ffe3fedcaead12484c5da975c1d0e9110b1870d0f25bccba7781b22171c5007f803edd1018fcb490b0b5471bc8f60b54cf7664d2f1abe71581be78f727e89bb43c254392e80dd9806789ea32f0bcdd6c2cfd328f02760b151086a873557dbec0e06e8d34740acb1544faa6e61dbf5a8f3d56ad0320d75ed9c02bf4046ceda5cdfd830a51a6bea56cf405357fe7811621495c04aac119c2b3144156b245f91ce2380015a9a4af2ff4c242ba31c10cc09126cb96535e9515ca51f65b0d10b9112d3abc15f1b3e3d1e0568ace9c5ba9c2660d5cdebbd090140a13b72ac8157915c7d3e574501e3fe386207fd124a6ba63493a7936d0d18654dbc32cc8b899f5411dc01eef7c64a93da1500493e07864a0cf61fe012f928714fadfb33cc4228ea7e70c189e6771325e3a65309932b7ff7111e842cc0b0fd15ea99a135e7d0c8564c17ca54564378641286ea8c4ade3f418b68843e08d32abf6753d43bd3e1e7cc56ae247a3759cfec4c699f7b974759265b157bd45b9bfc90ca2a1f405f32fd5d53cd569f2864fef7a2f8e2793f60a17308d5c369019665c229bc357d8bf70fd8fb413b29e7fe1fd8df7357168e86ddb65f1f50b678f00ec4771b2c52efe6737dd8f680d59cb3869a223e045679649103f55741a1ecc34426f5dccb44045c60c639de0b8668477e85922751851ada10b1f72d03ac3e316d093811b040a4e2e9c712d7912911f488b5be4c19a0b21ab2d0353358b57090a3c5d78e491130c03107312941a821dcf16566205218a0517fc1f5d8940a90875380ac29e08441fe05c4901c1e064411aa195768dea696a63ccfd8e338116de29fad05a28ea0d917017ce3059e79857112511028b26a3a99a59de867f02120bd488bdebe8d9a08091efbf487c62afd50d43f1702895b92784bb9dfa5b59d6437591343d5d6b1636ffcdeb7175e6d9bbab66d6b17f4521da505bf044f23989875233b054315641053117367525132f7eb30c4344230104098548466bdafc59d7505cb892aeeac03b046d0c09d95e42c24674969351993b176d26a828527b9fb8ebb8a8426b34d6d368a3e4d1bbe6f89c1494568de17693b7c9156456ce364eb3aa95001b3564d4007cb75f29f77cd89bed86ef04511834ea0509e1e202850a2843f3f3e359f1f283e1508a8d603063d79f240413b600ff581c253eb5327e0d6657642c22c8948d624239a53a654b53a1ee8e0e8b0664c6a27c7466763dcbdcb349ac9b4243935e538e1de6512251d251119353dc1665c8c664b4c44390bc8c1a1fe06cbfc5176dbd1663267b77250c8a9f34b97b9c4943493112561696a9235290d596db5fc6867f553b022cd7fdfca8f764634cbf2449684bf5a2d52bf5ffc591368f38fe5d2cce8c98868c9284b008c9e6cd7e6fd147434cb52643493391929655932c222337272324a3a4a9a2d191525cd1991d108434c58b06459329a113159594a729a3dcd59d290939115a3d952d292cc080b13d390b7418416ab3da2f8e92a68e103aa01d41e3a3fc82044454554907f1cb842c503131ae808093341a78297a4fb21c05831115ee1483a3ea82c0f47b80f4b76ac46c8e5743f4566e503c2934e0b0472703c94a6e3c832a0aa21042147c2478f2a4b1e6e38e9461c2e811a183a2d4e08814a08334c9d8a7ca7591175a63b73e6cceacc993b3a0f48c003f722c8996e87a1343a2a5c9cf12e8d2aaa2d0517b7800688a8b69411c54538018c7fa952478714c104546f50e04c17060a3dacc04cb94097a3a307efc4e8f80938465615dc29bc8c0cc38a042907b49434e0630a230d3ef044018e80231ac8c08f32f0f0258ae8e02c331a741e78ab9ac2d2806e10348cf0298a7cfec4b2e0371c01a293a10b0da88c8069c2714862ebb218cf743fc0c1b3aa92c3391f64ecf86acac9cda0400355933652e88a9063884a022120c19dccd4e736a38db39c45a5731b305da57175362e4147634167a4bbe96141f1d50eac0d6c54373734ac55d7f9052acf55de05802542e73652685c829acebbaea3a1f951115179d7752b1552d7d974aaae5bd5a4a0ea549d8dca02a7aeabe96c5cd545e0ad5435353938b363a9542c1c3a56d7a9703a3f54dd10a7e958aad577dd09aaae53dd6451255175aa1a96aab343d57535aa2e00dd055db752dd6080666563a4b3a0eb2ab859754074aaae46d575aa15ad53b17086fca88a7442371d8d072b2a9d8d4ac5e259e1a8549d8e04409d0a2c1e2247ab2695b35cf5808eb5ca61d1a8ba95d324a07ba37395b75a2defbc6375aa2e8fee46d5a4eb54342ad5aaeb7c3a27dd4d5744a552a96a883a262a154bd5edac3c2218dc80d045300112150f1d8d0a838ed5ad3a5735a9264ec77295adf1f9750658b9120c745e450bd5aaabe958365d04ddaa0795ea26b6ea82569d4ac59aaa2243723a9aaeb3d961f170b0d3a9706a6e54365d17eb542a0eac6aba212ad62aaaeb405576dd0ad60d21a2ea6e6c3a5515d506aa0d541aac7ce59d045d8d4ad545c06aad582a0c542a5557d3b1c26e88071d111a5547d3198192449564436488aaabdd14b1517501e86eba6ea5ea581d52a7812a8a2a031511958d8aa65b75aa4e454465c3ea5634abae83d2adba9c6e4857a4eb3a29dd062a9c954d77c3ea545d17ebba1a0b5414742c5547c3eaa2a888742bd506dd6aa552b154ac2e8a4ad52151e17443ba1b96aaebba58a7810ac766d5b16e585dd74199dd912637535621d074ab6e48c73ad20d191223d225c906dd1256a752d5a86cbe6b55b04304a9eb549daaeb3a98db38e925b0d09121210f9f240841c718242889e38e2df48d25b278608ccf94ace14f4290f14f540c7712420a209c9460a6000871029926fa53058b101bf0814433d88922c4112751a81124a07820020fa028c1e9803cd01102f49d6900d02cc4bd6f900d605f18d56b4c11f835779a8400e6a50707df2cc2c1bc60020703802ffed1e4e093f582fb2aff6de39f3965ea6d6db6e2db25e1ee1b784bc918b7d99a93b1bceea19226dc5d85d28bcede9314d4efc5bda9a5e4a6b34737adb408245825595131c532c0140b4b4d93d9d9f8d142ab88291a9a223620acd1024b081ed605458840a286862916962116e06470e485a92124b04a586d4064d714b939ba09aac15949398243e3c5d44d145314786961089415107b1471638ae6cc144d11241b982ab23ba0626ac811232a1b29344e687698a1022218f0e002cb8629099448a064057339b939e23ae3024d08374136535612aca6dc1031b552e27152835393c4d48a480d12d68b08cfaa631561bd708e6842b021a106490d4ecd0945282842c19023432cb0216145880b3548564db840c3c5d40727b0c649fb400356ac8804352e56b782ad88584d452ea851d96cb14962b344538191ae86c88a865564b55aa95636ab9bd5109c0c582b9b2c361348d084e3b2a9b1e95636ac1f9613567783c12a490b4338a04162ca48122db86a58496e8a5c60b9e14207b4e9670af9801a69903146175c94b6a71c70301a12810a147cf5c8c30993960437365d4a605a3a1386191ae0e0869d1e78a8c20037d010638b2aa060c208271e080a28f70d3afb1102326c9c6146164fb0300013bc94c08569c9ca11071b5c60811417608189250620009a0619e0cb8111373a80c23875a61040fef0d2e5020b5c686ca185155540418108dc708002d04c20610bd3529218616801c6143d2071600d31b6c8a20a2a8a20a286185e08011934cea8820a292400c3d4d72423570464e488c38d2eb2b880059c382207037ca599e0a5cb96242329311d57046284d105103ee400c3571346483a3292e272c421461819d0e2021670220247e8700018be8c9044454a0cca0f8fce042e969f91238e0e64a00b2db2b880052270840e391cc00030bc41fbe24504279e9941b05c91c0481b19e060430d5cb6ec0c61801a72524a0c39b32a444508cd202a416e906041407584ca88ae47c5b3dae93c22b05508ab690107aa0cba24364856187447581774160c01c00413ac5a2c098a18694580a408064432c0710db1b9a9b151d5d4d0d0ac3aaf8101e7032fa66c86d80c6119b901b219b2d2a0c8ac85a50e6e726a706e82584524e858456a682cdc2a82958b95c60b0c98aa31a2b219c27a45a041d01253385a8a54d6cb480baa9f243459585dcd942ba6a8602972bda062e1b0b0e8003235870b4dc668a1a389b938a8d2828a856405233b254234219c315553c341130c15483014c3ca4a0b0498c260c896221414a12085a30ac81b8df3c7d4943dc4caa743cb66c82a021a2856016c68e18665a446834e029f163e30c490261b80e1a60c0f46544468aab86ca2b0ae7c97265c00004d0ece110e08355e584d6ca2b8500121acb800811b2c68edc010018885062ca68894a10f2f44d02341a7258395141b0c805ac0b18952837363640525c9ca4a039ca33fa6706c922278ba414a6274843304a9c8539d5281a90b582f209c9a180022a8c12162d48109454ce1dc206d50ab618a66d5a2e96a0250834323a5a689d010917208931ba41a1c1b0c22281ae2016b69c80514640002120b9adc8470c5098416706e3c1b9f087ca02435d91461d920a189ad808614613199556c86d8e0b09cd05c610555e96892ac94d058b033e4065c45319272e406c78221505a205a22f27393c3f280e5410d04a69a186115d18440b3c1100f581948c0b3d2c08529cf49b70a5730d68a46850e4c400015f832b1c418629a60020244d0c08200a43454f8e067829712b868c9f2d4846504a458904f0e081f2c992c2db238a3c71d1f1041e8830e90606003068c2f8c2822004622c434a8a008911a2ca4b08012618c20c201428001224b0e13279e0f0c983d9d31d347ad043df2a882865d3adc6043212938366172c001ca1035d238224c2c0ad0051410c1b9b1c920091414f0f295696984a423a3d80f8fce042e2311b01a708002106082314fa660620908b0b0450b14a02314b0c818830f2d42548086d8d44440060b4860080520a00615826840036e605a1292c2a44837c84a105519169999878a0ed607541ea019d3ada14243b581216714314345864a0c9514aa08ac985041b14ee83ce838b8d18026830830505da0aaa0a3c005009a0954aeaec532a2224283a31a7273a3b2b1a151b1ba55d7d5388e2369252142acd17d6d269d7cc5a0bd655724895412246d672b0906ad24ae16123b5a48c6f837433c7566ce9c5fadbe766a3bb79d527299667a0327b573e76a48aa40c20412245a4880f8be69bbf66fb8a933a94c993954a67cf13cafcbcd561325c7698e5a48725c67efe6df9b924ef2d6ce5aa9bc6b1d91e3c818d76efd75ce8defd48febd4c979309758b78efcf029585dceb11cad141d27de932c5b470670e4e6f5fea6531f41aaf75b472c38c29ae20cf17cd08a7a661c66baf510cfdd93f89027ee9e24efd7220ddd5d09139b31ee9e8403779a3d6a7ed8d1230acf149a39976093285182a240890214e549949f283e517aa2f044d98912252828084a1050d093a09f209fa09e209ea09da0285082a040810204e509941f283e507aa0f040d98112052808080a1010d013a01f201fa01e201ea01da0284f829e407902f4e4c9939f273e4f7a9ef03cd97912e527e807ca0fd0cf939f9f1f9f9f9e1f9e9f9d9f283e413e507c807c9ef8fcf8f8f8f4f8f0f8ecf844e909ea81d203d4f3a4e7a7c7a7a7a787a767a7270a4f100f141e209e273c3f3c3e3c3d3c3c3c3b3c51768276a0ec00ed3cd9f9d9f1d9e9d9e1d9d9d991daa9ed580b8ac6f23ad96398871977915a3a6fdbe26eda5edb43054eb8e71e6aea6de7671c7e6dd2b9c252010c3a7b3a7f156d5973b2c7f0c85b15fcb8ffc55397d8467d26e7df5e24470cce5de2dbb6b899cbfbfe24e938717f279dd7dabe36f19ef5bfa880f3c2c9c911c01400ce0b4785395f538539e79cee21b87b1326149099312c9c709fb116053a50a0428b02289f319c19dbe18b73e27cfb66b379ce1dbef8fd0ddc74a4a2840a1577d7c9614241062d0098719fdace5dd6e6d476de1763bade12d76688e72ef194fa0a82bb7fe08e139b9bcefa50a0bd9404c00e7ff1d2372fb69b64ea1203c0cdc51adde50800259fb1fab599abf4b3489532ced9088773c643e157b046a30441017af2e3d3c3b3d302c01177cf9be04c6b8232353fe8d01ce1ee49bc35c117ad096698f596389cb0f97d01f299af9e2edf7cdba579fe6dcf6be75b716e5d8e33b6afa549d94a332d6f4d1b710e552cf87d518a8e3be1b54b74290498b7e351e13f7a674a4ec16487496d0acd2f3b5dc2b22685bb2ff1962b09ff620477951e2a3854a20a48e523850119701a3f3ce0de8302a65c82a12adec900c69d49cb7d4587bbd7ae035d1b1d1b39b94d8e4fd3d60bcb9a922494a8d24580f3a73073b5f9d546d93af19e9b1c7f6fdae130a1c30334a74c993c3973ca9c212c8104048e10404b82a952db6cc3c292c00e0554712de0064e8da2951f0dc080033a3801479223a6acd630c3e702207eb0210ad9cf4acc016c3f3831a1e8cc0dafd503aa5012479555126dc03c58d5305574c584148c1023860c56641239538d9a943e74285865f940cb874184f8a108104556527c681121070872e0d1e958ab3906077ab48ad802c3cbccaaa606240ea00705aafc80a40f951d1788c282c508228a5a77a8c618c48715d420c288a22971a82810460d329ebcc0310105b0a1f2e10d304fb0c103073b3133542df46041097ca8a0e4c98d2f54e117330c1fcaf022f5002c54586630c3c7057b74207b430a150f146c54f1340301156138a1b2e00f2d18901dd043105e92e8cc3cc0872b7e3810c5860f88e83cd081a320a65800181a1c3f745b24a089135e04e101cc0476e892e0e2c953165c28e00b151b3a1d64e822830e5d7cc8e20a183a9c13b33884c8b57104b742e7658f21522a382100a818763734c4e8800530400fdc0862c7648d2e8f8a8434401db58b400725fb2a22c907b878f13db0f8a24120432868c08099a7f1c21637074082c473c07d8a263af0413670a14498221f020f70081e33b0188489fb0c41303101e102067460f4e3e3191a08220209104cdd5efe74c3007ac250a10e2fa47b90181ec250a10b9b0a26e0be410b2244912ab3c31018dc574a48d9914512b52267e8a0c38c07b4ce84f1431533672640061417707903837ff57166013648f1c510dc34c317779c19801472dc541d5c48ec88e30c4808019ed8e305cf801136ce2441c0030f1660b50e659871c68bc34b0b8b262148a9f9e20c050b10e10d2dc650818524b0282410309af820cbf3f050408a42dca0e1864c992a24a800ca8942b0a8401189801bc2f8204612851c51e6089a18336c01ec4044213714e1c614414421471437fc50c87623109c07a4ce00a6d8a1901214b014830d395800842c3614224217529cf97eacd87982a1900f0850a3d1882b8c50c30a85e03cf18412612070662a8a4d881e7cbc5106011dc0400840100939c30148845c22a0adf14725c4021c4842f44000b507c0e085103008800a228c0b7cd085026684c490451b454c9094018605b0100205031766b8a1012d44905244489304826c8334792281034c21e4891e3f383d5cd02409397e084902460631c0e0a10a1efa7811e268ec18bcf8c085d8161e9899030705d48183907a60cac08c1757b47600521a440b140acc44c0852913e4be50208c2d45cc2860892f9272a822f5349e619951a18e1f3ac02dc9a3062fcc98a140a090c40d4a14d1c5137d98392a23005e7278b230e0853bccbc0c3006074ae0c082992971987151a125073d64501b28c2c6207f9cc145c00c1552b0c164c6206c20411672c1160cd02203eeee857c31881573201163450589911b1174463a70efae74ffc216f72eca03f70e8522443a1ca99c5a694e27e747ac69da7a3a39b552d3ea43817f03bd7d69d70962450a4fb3242b4945342b494f342e32a5494568eae4dc17bdb0ace14432ca7579ede8552f5b37477c670acd7de9e8d58b6d34572739db6f9ab776027eedd962e8642c2fcd13203436f408a38f8b071b536c6c0148162972f6f840f4b8e08b2c5a0c78666664ca50192568500190074a68113601820450b86724200d09c418e192501d68d262820a9c10200d3582c8549441802e3d782b74aa25107000c2aa081f163090028c26d6c082c5c64d1962f871c7921d8713092a082264e5c60286780910ea8e30ad402042207dac61040f78dc203c6a152770d0b9b3f2808db22e3124a1470b4b64d8035be18e7bb28313b1e30aef7860ee1bc030e5ab08aab82f4d779b31dc9d0bd512167757e2ad1a3336c56248cbd9ea642cefcea42234e916bffe8c69aab357f1e8648fe1670c6e5c64bb56b434cf349865375b89afd1c64bb76dbb8f25b7c9d1c8dd9188b4dc20adbfc127a58cb6b5d9a2a01e9ed774c86687309e8159e6ee18b0c04cab1569d44d02b3ace688bb7b2dd6173484d0dce1ae9393df8676dfaf491bfc136a4c61dc9de62d9a15dc7d3c72e35e7fcc3814e9388b9298a6b8bb13f7cf5bac2f74f63498e9132f8ab703ab16c3b6be181ce2eedaddbb788b4575f66a56dc19d7a87b05ee49ee2c572be14d72fa3e1cbedfdc140a47bdc637dc0cf19c55b43770ff6d6332779b5f5fd3daac9f82c5e1b538cff9b7ede9fd56b2575fe33b5fba8a6fe9bcb3697a5a3f586a2cde1f470c7e4e9a9eb673da99f1ac5f6d54d22ec9592f15c532fcaa7397ce8bf50934da7be4e74fe89b7427e17df5a5352cd6e612d3d308934e4de7b6361b5e4cf4cd2d9634fc4a342d29cbbf7154b573effd9a56dfc9d5a5beaf2f0671d3db209d786bfd22adbe9ddac2e6477de9321f8361c61bfca8f9cd6be7fc91ce90be38eba598d4b4d47a7eedf51b2fcdd7a5b6359a0b6d7e2d537f147df1b56834bdef7e4e4a4aaf4fe7e6fc889f26956f8649d3d333ccaf9d949468b4adbfa669217d9196c751879896c7d1bb619ca79392d2fc1a1dba6d8ba3d168dadb52bf2f06afbd4cd3d3b9b9dc35d3dbd436c74edbb5a19d9ecdfbf9d2a2a5e1fe0c66a88c71fbeffcdbd614ac14e7dafc1abe3993b4372d52108b33e3f06bf5d2afe97cdfb574d770cea433e33deb2db71d6be5d3a4e51eeac557beedfaafcbcfe52e8fa677f1fc282b4e6d7fd33973974eef3d3b5ffb66b3b66bbf362bbeed1ff1d46fc5cfb3d2df9ada8cafcd4eade9fc3616f50745f74c6a92d94a7cdb336634635a9a9e8eb2250a6f47ad1ffc3b3f533dbd49cb3ae9d6764f6d67eea128de22056dc65bdb9b4896187c1bd5e594fa7965138778d2a9edc6a2d6a90fde12df4b674ecc99527f6d9fe7c5f65a1acdbb8198fcb9a9e8190dc9866e69a3d3766d6e5b91de6c4b143e7fb5513893d392747e34ede13d739946d14dabfedbb51f7a4733279224f536be33636dedd4ff23067789e7bc745a529647a55cf83fe4e97ddf8aa02896e1eb722635c99c6ca9bfb4fd9ae6851867f2a372226849d91626cf9274e687ca18470b43ec69ba272c0cf1bce9dc5ff12c499fa6977ba819c2c4d1acada8730f55a4730f45fb6df3c8597f1a6191113ddddf14bc18749ade1714eef29b747eadfe5ff7a49edaa8595f6352eae767bc77f5eabfce8922c5b9870a319dbf67fdd70248c105f4a4072947c68b987ac3dd55b92fdc9d26b5e3eef89d643b5759fd8d972a7d24dc2f55fa4859be6222a9df787c279182188ba681428a2513ffe9e96d59668566da14864c17878be8e7dbae99e2da65d23453520473e087160bcdb4e91ae542d9a5e357dac54fe666b49c9fa87efe302c87dca1c47248c4b8e9e271a499369163968bad2e45f0dadfd4f6d966939163bec5625a7f89c23bdd2799c83123f94c7fa19bd05e3450dec3bddf386adaae857d26e79196a65c6dd69f9ae2f213f9fb2a06bf398fb4344d5ab319d4b552cf6ced4f9a2939cb47f424e74fbca70c8531f8e2fe4e590b0530ba947d5ee9df7cbc85821277f7afda6f7a34d3a6496925cbaf18acd75eb9160aa44569abffbead0a5572cc2274d31489fe8d06a260d329584da349d19126f5f56d9426625cab3f661b5e0c4a55dbe3530a394d21e923e532bd76a8fee750bf28d251975f06604bfd0deae1c902da30a479d7249a69d3ce0e1094272193de993601f1949710aa2b68241bcbcf7fdb463ba44f998aa5ed9df468a9086ea95faa9fe97ec2b2b1f8e4ee3f5a7cb468911c6d2c76f1386290f6628dd67fc0d8833badbe940d41bb7fbc6d9ba993d618f593b45f6b59b5b4fd5ad358cc27eacb13a02f3b3da210b42fbf44811613e280c680178002b1c20c0ed0a0716c214310047cf0324252d0da91410e36c458b130fd30029506541250414035008a07bfd8da3ecf6d6bb049e7887338f52e996a34f0e6c09bd332772d574892922425ed4de7bf38a6dc5fd16fbbb6de6f0a31ce4d5b5f4b6d327c64bb56c762f345b2dcbbc43fda991e3f168312cba12d65346abac576ad7e1b6d5292a24aee63dcdd63319a0154714ad6f1b97b2cf65176d32529aa2452d0da30162890ee279b142b322c3d584c4c40c544483acf8485e2eb4985cabc796fab4ffe189d3d27241d1f86a7a006e276ee4b6da6519f29f9b9e97318d584432d57c624fd7bcb72dbfed3b5575e24ed164ba5bf11d5af1783ff64bb160aa443db825624a58c76c63559a57f93612bfbbefedc94b77ea7a9b5c8fef3d12e996a2d45f0268da5d6324b9620c8f46259ff063e7dc644557c1b6e3b54a3a2a551322851b1d867bcb52a47af707717bc559beefa5a3ae2fa51f436758ee2443a45d1e2a6aef46f2ffdd2f9f78f345352a4250aaf61dbd666ec2bbe81f4f32d67fdfcfbfe8c89f4e6df3b1e0facd422c6b54d3e08525dbffe5f8dc3374dc3575ffd2239524dc36259f1480b7354a6fd0dcc51f12bedb671fe14f415129a2fb2c4d90a59e26ca309d5242a54938a720f45cbe58fc2a0b655a8d6d7b4faa5c7a7fe6bda88eba559e8415b2feda3ec06a9909629e06b11d2c99902be16ada780afa55e7b65d3fdf4a07e9162904693a223582d8d664a0ad5a48c3715454c34a52609edd43496582c16033f6adbda7c6d3b746df629168bc2f3e4494fd642750a4995fef36c48e71eaa562d196f5aafbd62bbb65e0ba57f9758d4374d6f4223cdb429e35d822f6534057c2d374d91eab557c097320aa39aeab557c8cf4d6154d30f5049d32fd27279d3eae3b028d21e9ff2b6c9af34902645c72f5eee5bd2829ff3d7fbba26f5f894374d91bc445193c4bf97de88c83123d5a49ba6485f31d1c5766b89c5aea53790664ad22a7d242f3bee7ed31449d33e639076d314e937adb65e4ad4c54c97191cfc8a893a255a259071afaa0f4a9872f712a04a18c127952973c6be6f6e4dc9f9e0a551f552108b90505039057c12224083092d2e4db448c800852945dbaecd8917cf4a5f9c784fbd6d6dda302c437bd33a7b2090e70383e5b6cd9434c2dd8b78c0eb8b49fd4e23c8e55a9bcd4c5564aa57a6f7db329de5345efaa71f41291bdd4f5adc79b4ec68b1456d1957ac9b956a65a3aab121e2ee3559cb94a6b8298a142cf296961d2bdeca3286dec6df76be68bb564f592b4b1877f774596b6539c1dd1ddfdae35366f1dc3d8bb7666a78a2f8384de7cb76edd6d98633c4737a39512cc3596d9dfa6788a796d51f7f278dbf93f46ddb2d44bf6fd20ddc746826da5d62c073368262329af568d9f72d78653c5af6fd314749da6bfae23b3db1c6dfb6c7a7fc14ac76ca58f02e65f5afcd3efd2ec9111329bd52c647374dc5279b1d696ff3a6fda65be74491ceeadf4b8772fb2d88b59016dbb537b0c451fb9698e8493f94cd5beb133eef5b6ad122edf129458c6b1f853349d2a60c34dd9a90b8b7f5db6ca59efb66b3e37c32b7e9bcf36ffbf5b73d96b64c6f7bfec4fdd213d30798b4b87b8e26f50394545fca1e65bc411a566cb3aef745fb60c6580c45d1d6f237ddb6ede24c5af09dea93e4ef27dbb599feb55868bd9f3ffc1c954ba2a521ff8db5405dea047569568a408e2e7d4e1645ab0f7569a6d58cc177ca5f1b5fc9dd9bde4647fb99c4e205169f4a1428c954afbd52af85c242babb92b7b02c695d11c3bd2f5e3616f5ab5e0bd5c58ba7ffa6a9a867adff75df8ffaa9ed6d36bd8d453d7fb47bea8036b4e0931a56af85caa997ce8f76b1d5faf5f724496ff3abd7427df37e94b5cdafbf33263fcf79e9d4767efedb8ca975a5097777efc9dc9efac1fb6188af70e0be49fbe03bed7049db5b458c3442390216770fa9ce5e1e47d8b574df128fb017a1f28fb1581ec73c8e494db8cf184d43d127dd7d013d24152199816401cf6d4ba39b16013de9f9cfb7d915a0273df4f604f4a407e3660f45c5a11e1f1c75e2f1c151a71d1f1c758ad283a34e413d38ea04a507479d807a70d4e9490f8e3afdf4e0a8934f0f8e3af5f4e0a8d34e0f8e3a45e1c151a7201e1c7582c283a34e403c38eaf48407479d7e7870d4c98707479d7a7870d4898707479da2e0a853108e3a41c15127201c757a82a34e3f38eae483a34e3d38eac483a34e3b38eaf4172f59b12d2b39eee523413c72dfcfb924dada62c9edd7b4a309b87bf5ad489274deffdad4f436f7eb999bb85faa3f96fa9deaeb9236c970bf7484dd433cc7f2fefcbef9b7592c1665a4df6e9bf16d979446c97a69b6c5c030b2e252404f7e7c7aa478ea4381180bd16f1c158bd9aedd38ca465d0cfec65afee2a59a04a5e9ac28c8a1349d891837bd58931ea461fe7d2ded47bb3f633016cb0f85f3be3fca3e63a22a1396c791960bff73e17fad45f47277255a7fae954ea499d1c47be6fe0a68c55ad934493832321a9a3b7f54500f4f39f4c417bda69fc19b946dd1be3f6e5d9e5065da46c5239ab7949128ca406d95fe8ff493b91d8be91a8dd4176bfa4e4ebe868db8ce30e49295f189f7d4f56d97de4012cf2fafdd178336ef59621272f096ec077726573faedadef6bc81f6869b2f1b15c339abafcb59621256b8d14ca84287bbf7783b1e4f94d11093d3ece9ebbc0bd3e9ec7d0de7bde3f9c0ae15f38ff8c2aa549d3d4b52da6f1a653349a3f5d8b058a5f5b9dcf4c3f945417dba9cf5c51abd3fbf562f9da2cdb0dc43b9bbe8ee50ee7e82b54304247757325bcac244442b5acac2e4443ba25d911111195d9997def6cc4fabb7c479ca7e3c1e6f07064541f0a1a66ebaa9a916a670a6dca7a65c35e5ab292fc094d750833b8e0f71f719dc6998f22153532d4cd530e53e3545834fb970eb620bbf4bed0276a975a15f175a1713ba4811e3ee5fba78712f810b095c5a527e7234673a339e5a67e33b339ef561523bf3b6712dc7636849912056666e3a5f33967f8354ea6f31366cd76a6d471b7e26a7d44e942017fae139e2ee4e745a5136e03db349089367467d7ebd03fb9a5fc34472b4523b25b4a234f5783e3cde0eece270aedd34bd4579cd79d314a91565d248fd23bd1ba4e488896231f02b06a37a7c4a215a7e528a8e5020166b59a41b6f9a141da5e8f8b4d7b426d4e3534e91a2231e67170a14eef99b742c06056271a8730208cc063f670cce8daf9e33b4736a3bff369b523e5ac6b4affe90ce9ede76b4e2161cdea4af34dbc82c4e5b532c76db9b948215e9b547a0d5d7e62d659413495236fed6394d6f4df99b9c0898d69324a22630c15b4fa6f86ffd97967f5b1af8a476027ed41325374d6fb7fcd1ee5b66a99d9f187e5098b1ef9b9bcedf74eb595f674fa4311f1adc3dcf63b25f7c6dfad936375e9a9e9e22a562098a14b45d5b6f393fd3f95b62e247bd48a3fad2bc63374d6fb198cf8ffbcef8a627c6fba6e96dc65ee78ffa3c75f66e9ade644abaee859e8ea733d2d1b87b09deea99f9b7a58df4f3d64ede4633deda89935aa99d40550ddbb8522811934e34263f3b81ca18d78de0ee9e8484378d2c6941e1cec223e542b3dad17d6bdc84c39b94cb78d37aa99248f3934c221d335eaa39dae4ee78493f093569bf28d2a6fa51f9f53bfde72350db3116d3f7a1f0d6e5a6fbe9c14b453ae4ee5f8a548bbb1305853b8bedda6be9f8b9d24d7fe76a43eedec9dc6f161b9de5af8de5928dcebe62251b9de5aff49df2473131d9aecd5f33d3fea7df14b4225916ed7f72f72a2c8b2f0e5fa89ba55a26a56a99440ada8b2f052f5e7277116c74ffb6d78650dc5de845daff4d3afad1ce7ed32277a7e2ee3ec56a4cbabb14776779bd16cadd83625ec5b724e48f62aa7fb36cb2cc19131d553aa4c7584cc7623b63922c35ed479ac38c73367a1bd5fa95b47e10e726a1fa2469f3d6b15153dc14770f625d6c757e2db66b2b06afd1be1637e14de632118be76a995bd182f9e0ee4f7edc46f7b43a7bfb5a4cfa7850bc1d180ff83fe2a7bf7869f625684a092abb084da1e91c6dfa0f693a4749ada94874033725b52dd29a8ae0967db3d9c7b94bc0dd416fbdc0d0d9e3f17878bc1e180eaf85bd48415dffdaacd6b74d9b7c08d5055bbc5e3e800042a5cdd646aa6dcd983a7ded5a5d65335f1c25b55e02c892255c4b6070ed5aa2ea208b0e56e8c0032565dcddc3cd9ccef7e5e86c75ea5b299cc99c49e32e254828e1a2048379866bc240457d71fe9c141eadf8e597c219e79f208cc18113ee5ea54a9e1307b00dda706dd0843769e26d8d452d8ab2264da6f762cdd26b6f79719da1c5e1db7c7d9f4bf29bb9dac4378b067b68708406a0064a3268c395c10e1950496246537cbfd77448d3f965bc417a5424fb668869a5e3f84951259c3f05f1b3053115edf7c16e3ac900928080040e7727e22e2469b8907c8124e7ee7d0de6892205e7d38c7d60c6219ea1486f5f9b7714e9e76fc2621fad56fa5951a4e09793c29914bf8af4f34d53a497d04b8824659ae24c79d5a45cf83f148bcde60b83980b039f236cb8c7436fb1cfe52ec34f5bda3737adbd7e27d711248e8cae233b17e4f1b73df36f1c85737e1cdea41eaeec02f282cb94e31efb2eb8719705695810054971329705a4cf1f3108bbf8560bdaf2c98296be786a0b93553001570552eeee69999f484123a9775510e4a2800db7e592bc8ff3a700bb14cc3086f86f3317053777afe22517053feea220021700a67077ef1fb7bf36ff3613cafd9529e06b11cafd95dc5f81ca158300e0126217007626f8c335011b5eae46e4b92690c00426b82638e2aec4762d6ce37bcb3c37bedea771c5bdcb3586bb47d2bf4dcd04671b757fe6c4daf85acb6abf65924f2e570fdb8e0f95e9f8d9e5bac0d5e2402b869657e3ae568e4b8231dc3dfd79467b5dce9bdbb94b497af3f26f2a62994b8230eeeeee47dc258115095646947019d12e234a5c117c218a322fe391e2fed699a3e3f74f97e99b9a09fe22afd2db2d7fa477824ffe14450b057e0a5efd14746a39b3c915c117570412b88a78e1fd6f9a4b10ac95ba9c5fedc6d829b7653669d2a489a7f5f85bbc72d31429169b09cd48bc8d5ed31b49372dca3a7c279a8d62b159c6d7d2ae1dbf62a25a8e2a657c021d69423af3d5e353fe482f6ddb134618412e22ddf55a28daa5b8fc423569098737693f1468f7d678a46d4ad3f5da2b19db176b252e1a41a91fa0528a8e4751d616d34253c0d7e2f313356504b9c4623d51ae2153eeae2149ee9e76dd00a2b35f8736a78a58c4ae1b30ee3ab158ce174d69b896bacb94b96ea4dc3dd74d1314c6b21caf920fe5baf1f9b7fd2485874491826409853116dc5f774fe22e1b03b86cc4264dbcbfb8c26eb9ef5f3ae66f72d96cb171f7720f85fbabf3e1fe7e39b3babbbb6ac0b8fb1577d56471d5dc78afcb896bf9e46d8c9d5c341370d138c045d3e4eed1681f9d1ad77dffb64b5919192b8cbbbb5852dbc5e220cb8484a6184d91c243196fb2684bfd522c3673ad72ae954b25864b2595bb5fe94d24bd8b6d36fc68dfc4f76ba662934b65a40b5707432773754f5cbe87cb23e072ec9ea656d3f9d2f9ea67f972e2c5a26871afa88c6d14bd7d4ddbd1492e7fcd5f85f23b156dfd365b9962b19ba64842f92b7d241cde241c7ed9e93903cb517204b9649cf30be9e44c19412e4c404f7a906e9ade8468180c2a45918235a9da0f6f9a228d20976a6932427820a48a136264a609f774bd6f66bafb20760ca28041aab897f17cd1fc517f371d291de4c6dd13640941b86c6d472bf3b6bdf856de043942c78c738927de1b086406776f9c97d64090e867a7405afb9fca48e1e9dc7ffa7e8738e752fd7f5406883233f7b42e3589b7ce5bca580088184044f73e9df9aa49f395f3cd287a2bab944f1429d137e92d5b80bcfed8c01f2ffce1e3c7183f6c70af7e7d8c6d359cc9a9ef47d9a648cb4b95a6f7b7ad4b9cdf7669d5c9d866927e9e395e4e8ce22d3f82fa78a30f1cc452dbfdb65af651dddd93f5d1c3071b18cf4a6f323e8ce0c3690f33eedec56439eb6f90e23d5f798f23f6d0f99b712d676e7b657b801082313c4d6f2100220448f5a3f088420872dcdbf76564002103c63d7c690f45f7576900c848b94726c8bdfaf6fbf418e3ee303db6d08374778a9bf84efad214a7c72c6fdbe611878602b1b8f3009347937b0da4241448c549a726e92d7f9377edd4b15dbb4b9c71d51497c7742fff166d28da23dec2a30c1e613c9daaf5e7dab6397834b9bb4745f0ebc4fb065e0afb7c0719fd1fded1c3bde373774f33b963fa1d44768499c1bd2fd7f7de96697d3b3e6f7eaed971e3fe3f66bcaba5641d4d7817e33a316ee6744491e6cc8bc3ad3a3eaffefe4c7e6d5647d0fe0c5e0cc22ebe753c088228e8a6321070f1ad77fd5bcebfcde82893bb749c18cfe868c2bee82080bb7b42423a394242a2488984a6a6733665ca087299228587843e05fb547f04b90495f5854690cb96adbf0ae9295278688e38dceb7d5defeb39ee1cd3d3db4ebc73146f282d93a30a39463940395a71b0e1de57c3628df6d3b3d333ff9623ccfc3ba4ff4dafc868262332726a322a9a312b4b494b4eb22d39f17e363d7e71b410474f1c1dc031867b9fadfe9a7188f75422e2327397ea72e642fbb68bc5e9d482c3043886bc31c6ab8d5fd137e9ebfed31bb637621e88c3ddbd6fc23c9d4b41baef839f37bde584543f8d1133e68ab7c64c37fa70034ccb0d283728e8c0141d38a2034f6d0cd2461d3cb451d4c61136c4b0510036a270e00e0e44e13a393c5c74727ab838d9d7ea39c389c339a777f168332e4550ea73e6d4f9b4a6793e78ff96333dcd810ad6f8638d22d6605a838a1a77a821c6ddfbf28d2097afcbfcdab5d34e7caffda4e8b8e4659c13bf827fc35d99f7aaffa268288186096828e96203286ca0e90c41ce78c019349c01c58c38cc4880193833a67b5a2797439bb227d9d37c8d7fdb73d64b35136de7c47bd660fb5a3be9a533c4d7663f7f14d613ef18def5526fe3f165ffb6cbe8a20c1bdcddfbe6abe2d857bf7e13e665fcb7adef93bad453a4352cdaf42dff490310d0c0101ac042461fde6b7a0373492a117179e52e85659807a56d9e9b6a4bc397fd682f320640061219ae1619aa319a70f7f40ce67dfd26cc1bab6ce66af3d29aa95882784b198d6181bb3f794b0c0c887184184f62c0c248230c0c8401d50aa303771fc15b60a4010612603c7d71e68b28bed8eeeec5601f25f5feaff76b13f7f87cf3d219e229cb78beeeeb2f3a9e9733336deaf2cdaf89768b54d18c7d304f8988cbb4dd7a298ee61a6292829acefb50748be2abfe2dc7df96f61f7e767eb5fa8f9a34f13ebd69f5bf58fd4dc1cfe4d7264dbc1fb19ee2cf5a5ef0e105185e44797125037f78f5e7dfb6935ca6f76bdf84e5feb6e7df72786f904afd5f9cbbb28b9588b8e48fc23b7c518f160ac462500f4f29a4a5a8d27ce904f5f094f3459453f38fa5be18d43a41e57c059539532e4ddbfc42368f3887ad2ed07077eff3e3ba70807f5fe6fdcd3049c4b8d645ad7e06f16e7581d4c59c7181c5b6b5cfd562b119179f7f183e174adc5d683625e3a32de870776f6d21c6dd6b6d31834e4eccb9b22d90dcd3c9992d2dca8876df72d6cff86a91f3879ae2645af450e9b82d68c3af322d82dcdd7b89af4b6788697d92c45996051977f7b4b6330b31259e394a8a7f9b9fe9c64bad2c4877f7f6a5a00dedb5597ddb19e370f36fb32c90bc2ca67b89451f332cc4b4b020ddede789f7c4617162bc45b19c9a49b5b719163beeb53040c6c3b9af4d5d6a0dbc85012edcddc34b2d0ce0e017db6a6b186872716fdc6dd6c240ce6f5ae7e7e6c6435790c15d41857b7ff1bcf46b3d3ea510ed6b393a0acda6844c574c695911877bd38acf8aa796151488b942cc0d6288aae8a30a3adcd391a2e37c28bae7d6e50939f3fbd245c36252def7cd9bf138f1e5995fabb6367322eeafae76e85a25afbeea6327a19d5fd37fdb534ab5b56b5f9c9b82546caaa2852ab45421858a38a8c00206f3befa7d33c4d5d660a268eb975a5bafdadaac9f13e97e272a56a0a28abb7b5fbde5d1a7c9fb1b935314cbf071d7c8dd99bc35051d5f2f9d02862960eeee81b7a61822c51ceeae450a1ca4c0b5a498eed919ce30697a37f67d13e6d918cccb5d3aa7fefee29466ecfb26ec9618ef6ba70d0429484572bee8d6743e58d677ba4017ee69d076cb70de5cd6447acb717c28aa24a4335f395372d992520f056271686b2a5611df6817d3b4d4d79b541f476f5b14edbeb644217f537d1ca661126712df70b4c3b9b12942858766480411f0b894f0b8f304c0dd79dc8ddcdde52e7b32e489d3408924147577d912574243c58c155526c0469526a2f6fda86ab196fca2488944911251e0a130b344123ea0a8038a39a0f0000b3540e10514584cf1c4cf130e50228e1fa0a0010a17a0504189315094ee2e458ef976a1d8f1f9659cf3d376497eeeeee42d0a9ce17ff19eb69caf230ae8d0a28075af9b86f3e2fb9a3fe2275c4b5da3a4bde9116f5de2729414a69956a355d1de74aee4986f38a4e9ac29388252d8e26874a46ddac618d752d39ebe4687c8916efda39d25c934522e979a7e9e113991f6a6715814ff486f6dc5dff6b6456779272dd966f56feab45f6b997ebb6f8987aa686f44da2ee94cc9fcda2e11d5cff4f694448e45e4989170989b3275d29762b1e2702622da2f8a79540ae963c9a352c6f94992e62db8964f9a66daa437169f64f96df452259b673fdb183be15a3ed5e1de81c089938e0ef7ee03eedd1cdec911877b0747f78607dcbb319d1bee9ef487d73432a02181f1d151e4e407a6a82a7860820c21b0591294270fb8c30a14a4702aba4c4f32f1c14b896cb51c21b71fbcf4e68fc256f287172fe5aeecc9dc2c27857353cc8988c969e628ed6bb4764482bfb5924863cadd93d062aa958498a96e037a5841a302b82c0671f7ee6b40942c473a98d0c4dd59618638a2090017e042041dba30e1500020a470f7ae063b38d0c934539070f7ee8a150b658c60460a3777571160090541c0f14106bc70f7951f7898208124b258001eeeaee22286069a38e2c61939b8fbaa892234cc9230514792bbe350198586e041f562c2dd55588c4490a306263500e2eeab0a6e18230f1e7a904203ee5ec3800494e9cc881552c5dd5571f891c30a667880038abb7753643107173a3c3fb0bbd3f8f0d92ce0e6c5096eec783d51300c62106725a5cffbbe89f7dcb47ef9742c168afff47599afb34cef55dfceefa33b6322efe9bfcf98e8f33ecafef4defb0f69ff210eafbd2f6ea9d292b2072f5ef2f0a6795f4d925d7c416a49d90872f13e4bca449112355d6cbff9ca5fbea4586cebdf54fcbacc8c432d8af4da31fffe3af16c7a7fdb187c3599af4b9bcc98eddaa426991211971962194dff876fcbf406d639e7eb52ef6b8ba68737deb14fc1ea393f538dc7f9baa4e0d75efbbe66f2b759f875be5e7f1fa83f9cb9fc5156fc3af75bf90f6978d3b67cf3c59a0567ecfb6ad237ebff879312cd1194fa4690cb3763df379b4c4f8988cba4341acd9bb1ef9b4da696cd25d3d373be58a38da0942565b2fcc19c7c96a4faad542eea6db6e2e5c430c4f5d2dbb535630c8a18c41b6772cf9c4847bc4b3aefdf361438434c637abf9eb6104ff12b1e75e9bd86e5ecc6b6bf36d3d166726a5badaebdad52dbcc6d9a6dbfaf4d6a92cd6adf4acee381693b43f1f5b673c8f3bcf9ea096168be784218cad997d6fba0fe3a27de366f3b5f43f76f5ba6575f6b4a56f241a99fd6ca9a8a96644e56bc30ff0e67f56d363afb683f352667ee6b7a9c22c6646de6e8b8a4a9b6fafbb4fe8bf7fc5ceaf95074d4a2a5fbebbc994aedad3192a773f94b14929a64a3a522919e53d3f4577c33f6b428526fdfd725be38dfc09bd322138f664a8698a64497156772e2a2a9c476ad8d6e3de9d4f6da11df70537bb987a2d5d234ed96de93dadfadb7c622d517db8ba728529246d36114e9edd719e76a475a9a6e345a18458a189373fe6deb3d6e8dc39e39b7c6b769f5d4f5433b5ffa378ea2d12ef674fd2811eb9fafdfe59334834fb91a4d6f4b23c77ca379588b74c497687a1a0cb1de9786c258bd4c711787ebbc5614350dc43abfde21a634efb5c57ddf8ff8e99bf9fba072b5fd47b48c439af711d9aebd36fbf44d3af1a5a068298ddafcdb66505352ef127b4c727fdbb9bf78ce4b5f345312d7688893e6a4d1685ffdcf47dfd496661a5a3a35cdb4be2ee7a558a4f3fb2eb6f5b7b63a3fa579e3a5e07f3e9a1efe1c7e269a9746bdf8796a0a4e3cffb633d6fa41b0fc702a2ede835424ad2e6f5ba493fe08be48375e12e9d765c2f45cb26489967db21ca609ab4dd0fd3041f75d6b02e7c0042ec3042e65e9e74f975f2e454b93bcbf787a5aa41993e36fef0c18678438937426768602f7a8ed5a5a3615324121368450801092902466f03013c64c0d667c06f1c020490cb26590969dfb7336fc9c74492d82f3cb67e9f77da513effca1f7e5cb5f5f7b579051109b202408f2234806eeaec393c3b464f627042206128040705c81781937ca88a9166bf1481c3565de17af5aaca5cc90320e88168044017203c40b204400f13f98f803883fb0fb97af7e173d972cf1c6ff8ac9977e8dc95c92ff50b09a8f8ae692254bbca7efcbd7652e59e2d55bafbd722dd4a6b49f42a36d8d453ffc20ddf3a3d507171e963e66e863c7f9a0c35d7c8071f7c9c7872f1f4138ef51c6dd7d8f283eef7173cf4d4b717f9bedb1e33604654220c6a5e8a84330e5b21004f98f21b87127330625e383efd7b3bc3516f5e8438f0ae8b1821e4ff4c8208f34dcf3f29760ee25cba3298f2578ec81c706f0c0c1ddeba0830e6833262627fab9191393131e34773c71c70c7754b143103bc4ccaffd3f4daf7e2df7fdb623db91a48e31eaa0a18e2a75b0bc12e7e6ccd5ea6f4b71f3a53fe3fae08cd59c886fb80e3a9820d820f8a1a30c1d65d051031d23d051f381263c1d9d1c2f376469f85afccf697a739899e388398298630439fa9023037248c931421c81c4b1441c5c26be4fd3cbd16821a62d994de63743f872897370a401070e70dc1c067b8390379e7883f646086f48a085079470f724777940eb894b50d3dbd61d7430e91839c62431e63686c7dd0b310c76f1acfe263ad2f5becda11b74b87b6e8871a387ebc6672a73e388d70131eeaef1ed4007aab8b76bb336caf8ac8d28f2b7d1c57bf0bb8225cb10cda848e664a5290b0de9498644e322535262630e368a60c3c6c68e17e217615e7e92fe0d9c37b01c2715bf1926951ce882033de4c4283a4749d867522c6bd388031dac01c61a4db8f7c277bed690a971871a3fb8a7b3c550d452d8d597568a45528d286ae0781fed9b4b32a4d97c32524a9a4d232726a56f2e31cd22232c586444d36868ce9896e6ec298bd27c4a42ca89423d3ee58b423ab39c87026dd7daae4da3c94b633a1a64bcb4a1d184cbd020dd43a38a87c611f7329e3db30d8c71dc8761443bdb00970d9cc105d31952b5b9995c29f30c24f7b4ce673ce6ccdca566907137a3099719377ccdb080e272f335f19206aabb7b648021830532a2c82022e38331c21803883190bc9c68b31a76f17cc1c410420c2d864f18718481837b4425e43079228dbaa405338c4e5b7f1c93c098e08b2abe20e28b1ebe28e18b0fbcf8c38b25bcf8e285910c7020035b6400870c48e9428e2e82e8824b17405d745c28c1c5162ea66c71c7163c6c41c31652b420a305165ac8a0054f93394398afe9d087569cafd8d3847930af1c270fcf8c313949d2799a21cc271b167398be9c0966fa7a3ebd08932aa1841ca66fe6b6957a31c4204c91ee2729aa047af37bfa3e9da71ca6eff5ba4c13e6c1b284304b9821cca7ef6533b6fac534bd8fe79b3951a451b644c1a32fdaebb25e9a33b7bd495b697aa04eced4f5c2329e1abcfad3a548ced7a7df664cfb78266c7e33c4a105edd636639914559a2fa1293fdad9fd1bee5a3a66818343e92cbe2c5a8ec5182c7070f7be6f6381449658c4c2030c00820130ee3af69563bbb46220278a3b5f3146bd5476050eee57dcdc7d5f31ddddb3a20356f460e9582bb515a4153b3e6556dc78b62b86cc919828dcddc71fc5cc20e6ea2731d313f35588d1ae2ac05431958302ed7eaa828bbb5745952a8e14255191bb747a5a898a30ee4ec51317f7252a82dca970c7637c0a30ae293e6f8a2a9bc9d5568a32ee9e9602cca5a01453ee695d2b754eadd41a2716139a9a4ea1586c2624349b522bf5055a2eb340032ca082056c1698a0025cec7f0a2feeefce94242b9042057e3e8c028d289488e2baa268aa5596a190020a2817145ea070024511fdba9c1b969f2cb5a79371938d6f939ce95180070a6079029027cc704f07f737676a26b5b2563e7d97cedc7d62ca3d51f6048d134e3811e584979b65f613f8c0047298c01477f7be9c0eb55113e7cc57b6259e4def5290a4f3fb64126043023748800497044690405004e0880018ef9b93469b5f2bb5b6b511c3e6f49292889e64f33505f3e3b0386173c6b62ec72c1e9e1af699cc11e8a08932eeee89af471a36a14313056862a9094f94892225622209263013569838e215257999e625e058020777bf34dbe697db972ed1f47d4a4c40090228b182121f245146123524414b02070936a2ac153db5fdf2e5a42edf8479528f63df37611b09209040820019eff3be79addd1687ef2e6b2285400f1e04928e08c111701c61c3115ebe19e25aa9eb6f6af3a664582bf5111884c1c2ddbd4c5f04afde6fd36190b8c25c6004088c68c388198c9019012b624c116b141143119fd3f77dffa1e7e9e4ecb7793a39fa454b8e18c4f7fbbe98a6b3929884e15d9e60e987d6f6f99b301ada99f1875b9669a6f3016a3c408a07d81ea0f38021444441c44744eb0ab963b1d9f76dfd5fcefb6e9a8a4f9f582ffd74add4b4fdfad34c3ecaf662ed7142f96dd78634d246ce970eddb468bee8a645392a92da56d1d2f137b6996e5a947f6f8bdb425a68be72340e6f120eafade2dba39a2465c3b07c92920d4107ee978610e343e0e0b9da1043683bc411f7ea0b41468828dc3df06b42f4208a0f5e2148176227bf14216edc3dcd248349c3dd1d2f8189e243305edcfde270ddb7c44c9cd47f0b86481064dc5f332f88313c0830365b9b176b1a04e9eed5209adc0bc2ad0836a08cd9002620b66c7a2205a2064415207a7e60c3a3e00f2cfcf0e487967bb70c652fe2ec43123e803ee4b87b99e25c0c00830161dc3df229169b7d4ae102c65880d40294f460460f02e8e1031ed4e08106170f443c78e07e93a607055a1207deb759d1d6f965cd6ddd410793be72a24e8d6a0bd2715b1c1eb74c8f2ca7edda5c0d9f50a96c7abac416b4221db5f5b22840070524296027017b24408d1812c093800cdc5fffe17ff8367a477cc3cd6fc25edfc5fada1b487fe786f237d14d8b5eba88b4b3af69072676b061072b3b64e0eec5becf6d2923044400012c20008b0e8578454973c6be6a69df8481b1d8ec0bed9cb2e9cd9c5fff8742b97d4b3c542fae7d59699bd232d634da7f0e7540ba76cca14ccecc210d2f8730eed57298d5be7ecd81080e51e020e5e9541caab87f4922dd18871b77ef06319ece0d606e90daaf6fb0728032589cbbc42fa35dd60e20c6fd6efdd97500f2004d0628e39eabcd9901d2f00c8003de39d300b72703e4fc87d400379fdf8631ea8ff4da00c6ddfbf4a740956c206da8e2b01fb2c1490d74d4104656c3e7ee7d42b3292193964f5711df966a98b96d6948c3fb4a030e22d54283a5e1fed22d7e9d15808602fccce081196a98019cc167862504d000015420c01219c090c1062ff3ce9993fc87d2c9f91a05e74bd3db1445ba619ee781fbe74bbf74fedca56489732f0b35e96ce6afcdd7475991d2c87fa82f676aa84b37bd6dda8b35aac51add57062e32bcdc9b3131393d58cb22c34d0c4db8bbf79a9a4a19c5d013430d0c57c050c250c5bd8cbfefa5ed33c99f8fbe2f51b0e20b66bcc080175c78e1e52d11c77df3bc58897351a240d12fdf6dd3af34dad7853eb910880b1670c10677a3b9c4fbe88ea239ea02500b73b490430b630b4d2dfc783a3797b717e76fc9991fecf08822fd90e23ecb141e53576c8cf337b5cd4e35090ac458aad559dba818fee7702ac8bd2e5ee665810d1666a89f734b5dad58b280e414378032b201840107201300d1f4fe625ddeb696a24adfd4f426802eb4d0141cdea4a7584c08b49beea7a9e98cc5665356f8b2c21215c050210615b40a20a84024853d5260400a23a45024852e0781dc4cea4c989eb7e5e7f97a42983a399bd2bcd8d7a343eba92f8f27878b4ce99bb1ef7759b3796f3a95eaa520beb66b6df9c7af87274c7a1bda8ac75bbe7e9cb8bf9b7e1405a58449b3de7fd9f09e1ae3f67c5b7e25a91a5c1aee8ea382f3c08b2aa34c88eaa0ec4049446983a7bf1ad2bde98dee33ae3dc7d66157f7be2cdf37f368a8f3d0526820bcd266ecfb266c4edbb5f9c9aa4b70178ac56653a4f010055f8b2b97b903305068018597f77d33697ea5e36b7edfdff6a5f3b5f55882d98253142914130906f9837b780c4602dbe09b2cf3667231eebb59bc4be63e713fd79d60bcc078c368652ce2d527d221d2f9341d8ac5be49c95c6d6aabed6d96333d6dc3244fe7da1c5afd189e1b5f4f14b528ced0d644118bf8861bffb647bca9a801118cbb7b308fbaa0027141ad0125039477421b272c7102092774e0ee7db552d334fd680f4f93d9f4f1d0aa886ffaf36dd3689a7e5307562b35d679d6bb35deb3c4b98d6f98a42df5c6dcc5b57c4d0a55a1a4f9aa96f61b47d915fc8b17a84b73172f1bdbe6172f5dbc58a55b197717c5f2066e5a637203b7ec26e626856fb95aceade9d67afdc58beee2c59686bb7b3523eeb24161fbdc7ddaaab8fb2da7b6b623211daeb00977a7e1a703e6b8c299ffcdb8ec99782eee5ecdf6b6737f311886b85e3a8b92a66662abadfd8ecbea98adbf56c5b8bb5729f7caa54ea84b7305b980022d940b24455a2b9db4cc24b87373f2bb46c6bd07b5256b5cd4c26cbc549baa7d5ebb71d131340a7ad39f6d3893f35a0c5224778f4effcae0a86f0cf73e30df1459e26ce5fb76e87f2d4f7ca271a1ebbb686174169a94bb0752725eeba271714f89363dbd6b5f67181e99e00538a391764bd1512869bede84124c607d49c2bd8def972a9e17eda5032f38507489a14b4f096d9470801282488883841ddcdb549376366b09ce5c621266ec23ed2e716e637cc3651cd6484b9638e7bd6aa3dd627971b5b56c7335fc23d66049c2075ceec8814c5c5cc8e0b282e768d9c445b5050bd71622b6bc6bcb8ebb67339ed9e6b0ce0d5d0acab49ca1e5015a685a28f08cc37dbf44e175add4f77397ce5c8dc9f76591220b54169d2c37eeeecd6a6bb31766b199054f5fe01baedaa1a619fb34d6c95f6f60099531ee96746ad9538e53194e46b89cde0984009c110007046029002cf7f4d4b0f9e11b2e27e6aaadcd9abbf465bbf6b5a9edd2b1d29913c9d1eaf9b8f9ca384cba27344da069ccb84904a63a987660bab97b7fb1488e5fa58ff41d7d4ddba2a50c2cddb00465c91d9f50bbe53775b5736a2697ee12cb94a050aa1ecf84ba7467425d9ac7cf5d9d13df494985450b2c3260a9ee9e4e4eceac39aae98b18d7a66cc6be7fc9aeb8718506d79511aeec8c908687ef91c6fdbd768e20c208ab24255c49b8a40f3c8004041217a409ac8061458729d7e1c9619ab19c7eb1ccdf8479a4bdd9cf393acecfe5e838a5e8382b6c7ef9ff293f0d8365beed6b279dba5ac9e0288da30b1ced23f12803a32fdc3ddbb5d7eadba6d952bc3d5df3b6b38e46a0110577e6ee47fbdbd7ffa4e8f815515114a6e889c88c579bf5d2dc957933d317c14973f5661cfe0b1fcd279a9e66f250948e34293a82afa5a95a4a42d140bbc987d2d5d6ea2db193d0143b54af85ca8922dd443bee4b4363dc99bcf0fd2131de500ff599b86ba8ba3b5e1aaa9135e192ade0923da962c65d8f18fcda96799fce3dd437f19e4f55a2aa30a9a212610911b688a0da7197900684c078f5a56cf8e9e4e86a69b9878ac5f4376788ab6c7a76de34dd7aeae04c2ffd31278ab4d465ce2c4a9a5ff3b2cec93d94505192d0744f276792e5a452860a172e2a338814cc94cae7e2c6b9a8e4b8bba680c0dd9d7c0a53309042464a15526290b2f3fad8177e13a603fb9c43db183be5b236da2afe8d8219c7a2623057943351c2686b278961b109837dce3951db281e84e0aea040823a1034832b682a68e7e8da4f01e71076f1a5b68bf5fc14fef3119423a08c2e2840505aee7eed77cb4b275011400b0092027af264cc93023ca9ee7d3a3c394cdf84e5e692255e683f231c8e79384c27593ed1f9a1c3ddd3a91f65c51f307edb3f5553f162ac27d63f3a3e72e4c88484e6cb4789ab874c0f103d483c7df000c173858f1d1f5c3b58dccbd54491829e28fecd663d8dfb5b49dc5f8df10d9cf7efd76c362aeadf7467678767d6b7650cfbb114f1bed9ec6d7eed69b5d96cde7a6a7a135ada76b458a6d4a54d6955a4b3fb22d25f2bdea458ece87349d2327e97132e329793a05aa9cb33931337e86de1e1e0deced5641e29f390dc2b913761639e60605ea2086bb2bd68a36c26371529a89f08e69e76bdd298aed70c9e6602c4530add344512454a149b8510c2a773f6fd31775370355180ab09d924832645749ed0a13a443964727e70e5b4e0ca1962d2c7b5af7fddbed7e5d6e50925cecdcf4c4a9cbb59a6a7f3ddc04d6b2f99957a31c47bfef7cd8ffa9a48ffb6e7be34d3d276d39fc349e7c551f2c9c5840a19101ce0028104103618e303173ef8f2818dcb03413c0893e32e0fa63e9764fed7146cc24bdfd137611e486ff36fb3db3761dfce17ad76a8d43107f8a19a644a2166464000000000931000303024188f0805b3e980487c0014800167c662a65c1c4aa340c69442c61832020000000080200862001cfb56d3ac1d243a6c1ed5df775951dc10f94c758259a02ea78e0a111c672defe8bf7ad3e009dcca4c68737ae7461708810779a6af0cc3313e55e170345f867068c1fbd223ac588355f1ac31e418694af8be6b6b72abad644f1d0dd993976a1a8ecb9d6d2e90f1dc6c811c62017ecf3cb7775bc6274997af5af38ced99d16a6a8dfefe60711722dc516e7e723e4e253ff0205c2cc4e365ba3e414a05ceec2bcd10a87a1dc4a26b242e8e695a0c4f0b17e8f07fd262abbab50464f943b5545d2cbe778691ec5e028200dc3d5e21efe28faf934a6ea44dfaf26ab5c3a9cf9e049d671b8479bf16ba40817322cf390bef1fd454199025bed65c962590cb4bea593f8a1febe0ac20f357f803b838a26f9cabd33784fa8df05fe529ebb160d4ba97921b39e94b3d41622162851108a68b11259f9de2650155d8f52f5a3d5d9d41222928b7bb08000768ec186a7527a017feb48eb4506e243ad69565fafc328cce1ea01f87e5bbdcf01f57fe36e24504b907915f84b23215bc53d44f83d9487b863ff35829a07378b05759f472020654415f9f4add2f0a12cbc71d9fc41ab746313ebc4b961ab2891b9e2e3ed4185fabdc5a9a06b4dd8d18ae81b0c72de75e06ea521b83e188532aa131c110a903fffca405ea902ec754e0a4abef3ca291720562b55c663956e038043937d1b8818e3f69e94953441d71455af9b2a8abe59597934a3a9ff51525bd90ac9852afbcd69527930121bf653ce59b56e163f386284957b6e187f278e09e8e584573f2ce98f0dcb402e8b46552358c5db5d028cb29e2a1439181f4342c47077c86e9511aeb3e9c47494efb8f038336f0f3318ec95c82a43cf1d06d5ec7e3969b177285b59758953daca5b5633e0c91f917471e81a167d97afd22a9ef1351b73ee2f6d992fe3e408434fada68ac816056a88bf0cac1687cf26b19d7773cf8e4af1f542c04898768101259cfecdd68e8b1df1260fb5128696704afec1584226dfb81cee790dba00ac636343124377d125eb0acaff6f5bf3f2fe0fca7d8bf75d8cfe775aa805cca740f81c666947fea43c2cfd5e98ed71d523c220f454de351a29a44c4c8e2d9f63f123d6d7903868e003df808ce854beedaaa044b13e7abb9bbe553222fb281b68a68b86075ee532517c24d960e689b0f68db42ad87660cd583eb2a538f657b03b9fc20ed89fe03fff203836ccbe05163a2010452aa893ab9f053de6ea6c21706a4e82c85ea9f83738081ef0d5576258476fef5d6bb11d2353aad5438177ae30c9b0b2d1b56efc1919e0304b8aa09005bc123296eeb38fd77fa67dbb6716f6f389d14c523d066b7d873107e80e6528298696b0c7e451031860518434d2ac1cfa6e63e7e654a68c1233829a6ae47e2228ad981267030cbe9b4dbbf3f54630fbb72340e77949b8000f069a1e1f4c5c00b45b4a3fb1ba1fd372ffacb1f77a09ff06f85df6717674a3ccf11b8f12cd68d4fbecefd459a5701896ce74165591cfaa59c0eead8539da176618f0cb83adcc5da412d5f6ff445abe9bb7d9b8f1fa2a1527bda86a93ca356ce74292f2482fac63ad81d5548c8632d78442e4f9118b7b75b25ab94d542561a9c67ebb4144d0f6df8f40925625a4f788fa063266d08a72c7c9c82214644e5974f0d9126d5f13a5f10fde2ef316144c0270937b379150e36128362f0ab97586905e613771b50884046e921290a62385bcb5007b187d1cec390d0b283876c159800a9f5a4195ec5eaffdca91dd30386f945fb4cc9f76709b67b720930fb3b62bb4513392db870d0ca86233ca33c854d8111d0ba8b8a3cac66980f468ea5f0ac39e678343d571f48916c50abc76fcdc7e43a917f3a342714eb319a5c590b9cbbea1631d7dc28a64d298ebd256a6ae85a197bf09ec7c8b09edb584331be4ff473701f31bd58a4ac75c0fed6458d45de7b4fcbb8bd522bb0e4b34d6a996a40264a7c0330881fa455a902403f6e65209917fa5950854315cfdf047683359106f9d8ee384687ea3a0e6681fcbae9bf9377ac19249082303cfafef42620dba3bee7eb26e4ce2ceb54fb4fd55e59c37e51092343e7d86153d32fd9f493a3b384a767da3c29c0ca856d75b6928665a78cc81fc5d0c663a7fd6bd0749bcb0e92fc4b1f4eede4322c4e77b96b876c65a4e3645660497b8c0b2bebf4070926b29a3002d0dd268289839854000b2f7ac15343727af6f37c9358f978f26f1004898b0fc48fab02f681d2ac74b040049a2c1c6931ef8b3665a3583963c88799fa2719fcc8347f4ce91360f7cbb0fd3fa6fa64a7f7192f62b6d7071b8dd4b859fe5e04c8b66846684f4966413d0e35fa790d3a73123e50941b119ee1a97c600ac6e09555cac45f227d22963868c6e12eb00ec872d51e5f897f24940a262cf52d7089d09e5ffe8dd38e3c9ddd8a31c0fafc9b863f660ca7b0c21a491e68e3d6f1d278c26c0d73f0e864a277e8f9b1c2b272fe06b2d80c006fbd933b13caf2f924439dea0a0d421959055a7d7eb8b1369694c63593b81b2a4a4a55ec99286668d23bae2026285c0de7f00a20fa4c4ae77ca87e59b6f520d7312ade9cea9d85eea29708502420d6c114c85a5ecc4742d6a1c88e30003e34429177e52dd8c6f30b3b03c9d45ee661117e0723243d101dd5a15af008f2db396a4a44ee0ebb160c5e63f8c70c68efc9fa7b73298cc025ff955ce3c507cc2a475edae7e89ac507dc0dd8426217ab8b40dff3a538b8ab647baa235327b989835f024ad6bc79148c99c9aca67e31ddb463d30d3b27ecef94d30e4dc79a339185d91d8eaa6817d20a6022d622f3d694995dd91e5041524ee1064764a1beb06322df72f7dc89df609dd92fce07b30ebab19a295c932a22633800526d44151694958e04aee5641da5fc75d39bfff8a4a8485709ceab5c9bc9b004fe10a3eaa92239d35894c24c710221aba75a8f9dc9c38bd8f79cfb6b55b4bcd89dfa94c587d6903d2fece0ae934657e1c7a692c174c72092cfa1e78b311ecb07837be4fcdea0e63c75568d649d3170d401236be3b183287d0b06bd0f1d5e8d7bd6623fff1fe6726892bd86be687b31cb3bfa4fa2ecc91ddd5a5c3c32d8762fcd925280527ee548b3dd9e9204cb44358e165e848303df83534d7d9b55deb75efd6ca97c6e091630e7cdf0054f587634d01d8b2b5844cc9738123c8352e18a08637fbe4d319b68335256548941e27cd1c4517fdd01e6b4120af62b42599c4c585d1106b2543386d658a8f5fa27ed792b16ad47a88c6ab9c7171f225bffb62b28124cb2ff5779d70c664ad0e51a92fec11c5583f6b113fd977b34002b474c1993057b255429fded59c399ec17b192f5327f3ae6d318e120edc233b91d99e2949c84385a1d8dedecd5221c3a2805ef85d90aa259e80baa9a8b0e9f14c81b84c8ff4d0e282641634f053d190bd4e009ecc9eaf5367383bb4ae6647db5a3866132090d4aa2a89ff5dc84ff5437888fa4e59338fbba5ca4bf93833fc35c4788aa2bd1f24d5c9a6d2a9aa062a23571d13a59b92a51d5ec68b56dbe60f6ea8717b5396d516b9e66310efb3ae1ced4c3ce238ed2dc4e7682bd7d3e00a71a8f07843877f78f903548fd6b45016156646f4ce90b1d3d25c1236a8a2ad7e3e0d22448ef2c5efbfb3467bbd726ea46dc27df6f50f23dd2aa48bebe37c114ef6d2e85caf39687a47a3edc254d0fc68cce599377f3cb7c630359d2fd5f47e32bd5cf3c649966dad4831cbee0460d45587a503ff38dbf2ee037416dfc7d26d061af3bcdbcd1c1dd5a7eaa0b1da5a49362d66a0fc686bc451d14a1ea274e8b5c00e655f4d9c31aa62afefcc39b40c8da498b5272e88715d8442e6e4ad967efb771a9cd9a67b48fd58752771807250109c14b73ba5e4a81327ee4a189e381fc978280054ec650793360c7a91709051dc3a6aa251e236212b178c097bd0de20011571f22b576a758b26738d3a1c4f2eef7f11e4751b581e9d86846f8782a638b5ae714260710e4d81733a6d8273fb4b18d23eea40d2d6353d64df4965de37f8d2064cc20f2f8e3627f27504cb93ad2a7b7dee3ef90de964b4b37d6841e39f0a947b2ebb215af814cc4ba050462fcad10bfa73529a0c0d0e867e2c86ca069b3a5fd6e2077bb8723c68fe16bae326db87fa2fa0ee464c68f569c5178b3ec1b2bf29ab6d03471ffb2db77a47c8704a3f10c8051d8772f974773e7ac5af84bdcc5d4c5a232ecbc318c367cc929e7b48f7391e8f6894d9b2ac8a5053774a30b6f52eeae82611ebedda707d70dbbf6df3e1cb32d171161bac8a03f4af49bf1fc6b2c8e914bab9f72bc7d95481f72dde6bc8044510b796d613927f3db53c5efe0ef37f97df79925385fea1be75108acf7b0def025df341ad894bc0e5c6a19c9d9c642968652ae2b6759b3748d1d2297390426a1ee3d5c06ddb8e37f8b71a4fda838ff1d9a2010f7bdd2c139823b8e9bf7c49a73638c4e59172ad4ebbc6bc25fa56138c582a38b56f51f78df38bbc809639c12cedf517c714e9753728bd9bb92f32716a3a58cc388392fcd9058f2f428d2680baeb1662d3a32a4aa51529fd53b6287c87b1a023d72832a800fbdfeac5d929edff7cda5017b2307103a05f69412d0a7c940c9c1ca5b240c5aea2d154e88e7312197117cd08478ef4bef048fdcf002ec45c9935e3c05422f18e75de88de36d788620aec643f78fc807925fa3e66f25edf3d17d0c597fb7deff52fc34ff3f4bd4b731ee4a4d0f4cea4b937c120cf9ced37d04d51745dabfa4bd5f9998f693978f7d8c17bd83d5d366a5468a713cce6c36fd11135100da1e654c5eb78da3f8884a8076621e24f136fbfc79e63a44a933ee7fb452536d9af1125170d30b21faa581c6b6ee76a1cb1d1285947c6c78d39ac0a0756b22417144f2617128bcc59f1ce1ac3b237554298704d3137945b4f65b8fc5bb98689d3aec3feb4dccabb0c9515c227ee2d22e21519d641d2cd12d21d30ef250835089f41cb0a8dd510084b1e5882b9c7e73e35d074438baa8914026c7cab2cdd2d1dee45bf785c49295cfd385ec291e8523a539c38ceccbc5a00af8b0ba6d1fbdc86cbc2f56d64167d39ec05d70b0c05bbe7b1609621ca531e19427fac150a5c0ba2abd42b18a6bfba031c69e9d292e62de15a6cdbb36611cee27a55de4e2a46113f33f821f36f858d4e6feddb7fdfcb6dadc9b01a44a5c8a2822232298c3c2e6f4439f38fcd8c736175c7467b86ba32f64a11334a36fa09fd0e1de8a0596b1dc9555a502a6b9074dcd82fb3ec0f3e58936d7c28809e8cb0b2027d9de8d946c0719ca397c730a65bd903305a17e1a01ab968e970605b2916478faf701f2c5146774be9ad7df2f612f538508cfe1171565ceaf53d9727c072a3cbce258d2172114a391a8bd9ba07350636e14e97d68f8e1d770c3604b6533992e4c2f2a6776b2964ddb42894b88593baf696d0740d0634bd0432a663cd254bfcabfddab994cac4ab36b2a8b007a2de545d8d27c29386b8b64cfb3304512bd191a02ba21606db381187170f4769e97377bd279d6032208d30d0de8e37bdd0453cc7f656b08190aa699477dea45284f20f657df33f9693826940ee5e7411b2af8f19f7cf75c1c6ed8ba4c8b55d9958ed25a26de8009063319019d28f105c055ca22fd418b7655956ad390e7c59c83d4a066836f2c197f16b59e14fae41d57e98f8279f6565d46a890a4997b9b9a93f05e63538d262028e275dd054c1b5d6b6540304428666ff19c08de8220329c11c6d2db9b9ad05d57d608808960fd3fdd627d68dc9cc518117c5209642b6a33674d6a6727e5d906a21df3b450b9e01d3bf8fc0ee4818c0698d36010161e6245431557a4cb9dfe98cbf781b09ac1051455db9bfc6a66989c66fc9d6e848e7f32e4efb7e27b617d5e7d19040921e28e0430da6056cf7aed8646fd4d30fd66f381ab38821fcdda7a19497298990fbab5391907c05f90ca98b51df363fa6c5c5e2ec06d78eccec212240014b3b47589c53fa2a7217d0973b082f0e7f95fe150aa1844c4138b0349716c84871345dd8446213007ae83c3a1ba3c23076d0e60b75eefb1711552d4da4308f9524678a393ae274b5f510e0e324f32108906dd7178ed5c7e0c6cb12f29f1244f0d606d7ffb9ae22b9f31f56cdae100d7ccbb8c4ec4c4c94561ff330889f019addc88526ecddc94932fe3d2394f3c5e497f48ca8ed0502c1fc1739242f9100bd95fb8a7ae6bd14e21b36cda685384a5cb107636db0beffbbb6c85d0e2a7a943e975d831df21ac4a7d34f47cb8450c36d117a9087dd889e62944de80920218cfc0d1442012f288c796d761af0470dd52893a3631a59120520e253297472abcadf7188a8ab90d8e1925311dac3d44adb2dae09d3e2205b5ffedc24d6f0e079fbb927843712a2d40944d9e284b7511c4325f786ab3b7ce7092ed1f7db16d5fcf6e8bb19023a6f6af239c693067729d9284afe234c4a4809b920572edd1b929b74369dd341fe4a4146b91d79de40a204eebbb213c9e7e3efb1e5b9c878c898a7b8f58846f54f5b3978f2fb47a4bd5d0e1070a1765779ab2bf01f3e762af99866c6456908106f9f2daa863a618f757e8fb56bc200539937866d070e1c5ffb1c3838694dbcd32555ef53d8aac0ef9456a24e9bb0ee564ffde240f388c8999bf76e37f37aecc4e653d71c20710afd02a406d1b56dffd9dbb99d0379260bb3f73a7edfc1057a01cbb3b1fa3f0e0474da3c616b837026a8937ca3ae7e32f94e2d6099df8e5b6cf6586b79f73bf9ea78bb054fcf9b0625d5de7451188d24cffe09334e0bbbe2fcae7e58ccfe848fbf30cfd7b8bfaa25dbb12c2b639e5ccdcf8b44b0c7eb4cbfe538a2aa0222374e128cc7a02205248ba2f873880c3df6b52cc26ae1431740a2a8d42202c7d1da74c03d23c080d4e4d87425b12288b1e335a8787854f5d84ef146f440d4eecd90e7c060c174aaeb8febb7189ce6cb2dce57008b62bf8309c3762f468c58330174ca53945070419f52eee4918713bf214f1c8539324f0e3661f0682e931ed11f08c6f786bc23514c80dc21e8be213b615620ff0b3f83b32c1b8a3fa27ebfc224ed7695a81c594c2258d9f0285df9d8cef395bf2cd61fd2405f53d90f364ab067614cad4156a41312c38b12cd008e1086c4d81f90789789fe5e55aadaf41dfd1e881bde2141600f9f1fed4d2bfd9f19c239df1b6fb3d2f954934471fd4438f3a8f459bb00b5d4884711951d26c5f43aa43b3409dcb3f5a2dd0b0758403c54a08ca68967dc6099e34296ceaa402ed03146c147cf706de03723f5b6a7f14280d8b653bc0301556b75f34fde3ce5df06045768a9dd669aabba713d3606593481089e824c77b853830981726efab24a27a82344a75c291bc3bbd0f907ce4e7ef85304400e9603a7d5eee6f108795e9e113a2203d58033b9cc145ddf1a82e30aaa139b7dc459f4d4a01949a4a87c29f18eb2eea42368643ed55a9e28c3e0fcfe54c3fc48506904ccec7f6e41e6c371848d4138e2f1eaa94676009fddc14363033ad2ed103d4ff4bb9c194df86a7dcdf3e159219e3291e70245357f5e220243b72ce3e7c0920d569c17efdb2de30ed67fca2464f68077ff14986b1dd5f7c8c5c7cd11588b95228d53a62bd696b43c8de10b0f376dcde5075fae5d48caec36b7520c8c81524b0d83c7bba7563f85f065a50be17c92bdd8e4ba021326c28e6feb8f51d1ea4e38d6829d3441ed3e2d7b89da2ba36fbb71814fee34b75e8b443977979150faf4c3a622cc3fcd9f402e7b97879b6f3dca88de5fbf7616ffece1e1fda7eadcebf4a3a384475cf6b04d480b0c1095cf156008a228b5f00f2c6bb43b78b3fd5276234b47153f3780d17a0b60bed14e01100756493280ba56b5ffd87735c70d4636ee645f958533bfe04697a4717422d4cc5fc0c14e06a29073e7743eb930b5afc0598f0881fe80583d6fbc95d7ca6e8a7b1ed91a924dc46f49a779610a44e2c639ea0ea6867c85da1ba5dd656f2d3ff5efe3b00d2f93a2ca81fd9541d58f963fe53b5ed2daa372c58426f2b30ce17118c025f9fe53b804d5bdd88ecf7c4649ef42f40eefe0dda3d3aec2d32f83874efc1e265dabe5fb2df00e059bc7d58147ed23f0729b6be65a2cd8f858e4782996f9715298b4f57c8e9dfa4e370c6cb894e56e1b01d8b8db18d4bb65e6ec91651ea07736f472ce0706c5c6197a7451bd8cca596db22461f5aeb54c2ac526d8a9e35d87e88b4ce20750e063314ba5b7aaec87d77f8e8cdffebce29041ffec69357cebbd37917ef030bf9e3a2f0053a3fd5c8903444bfec6e72c77ee3656d4d95f95fd3c8f4fc881fe83169a872b8c0ad9203aa5a8ea0a2f877feadf62b74336f59395a431562d9580b72d34e75aba9a36e63f9add736a1db3d13eee8b8752bff72456aa94c60b968d2025d5d2ae286ad4319b1215140e556f819bd4d0e13a36e3aa7d6bda9e76141d9e9b9595a6bd3e4345380c598bbecf2649ef9ddc365010e8556bc91696a5bcb5b50e6e810083a5d0f95987192b153d4f6c686a474da14fd4254c8a0e2e5709893c1c5a1f552a9dc1aabbdaf8c696d9c30ce913cd37373a56d6e9ef3ef3bc98220b2141c37c83465c389939d214482937dcb8112f8407224d2c57a21ce357c32fa0d0f2903a1f49e8788eb5a60a86e875b14db5883de4ad4945a999c48d0cadb6b050de2519dfb1aa6155c8bfc3b00dc0eabd85a52c502074697ddf4a12a8871e63a1f6947341089ddb7e38b4aac145b0fef33455127018ad225faac0929a6f4a989b0294806521a6273f5c4eaa6abda43c6bf1f006c13fb3c9ed317158e4dba8cc7c81d3eb0619f32fcd630d88054e025ae167fe21b4b2675bea6f5aabad3b72266e3f7d9f2625df1f89c236a0a1612bd7c18133b41e52e767ba3ab3ec46f8b906e07a32319ba4964c6031dddae2dd8e042123f0c728abd1bc71ac429c40f1b533b1de125a730af639a6052f1b3ab3d9d1daf95214ad7d1736dc9b1785d02a4fbbdffd7a71553351f1b438891642a762c2740e51ecedff8b47a980ce9343d9648af86885e188110270ab7d8d25a26b1a2f85007ea890e733b58eae065ebc29ac63f6d4edfd312c2962d0c8363067265cd4a06c378878c63895db8c19dc18105a013ab9eac5b882b53d3440457804b2548be5288034cf548ff1b40bcfff9a037170c265859c72ad9405bd93480250c8c0e7dbc7c8fb2dc01bb8bcbdac64258241df80b0c7de818f43b3d8d057b5b1fa493f67ed8f3d1fa46955ab0b6c99a5308ec7c10736cca7bbcad6f1cae2d1eaf1f3e8e424e7d9c2ee5de6f263deabcf14667d203df4ac63ac1811a13325069fcdfb9fc5eb31efe1f9e575e25526b8c0ce72d2711c0cc13555b0a8ea9a4b9af40c9f8d4b52ce4fc07a2a006fefe15456bdad66023ca5b8963b4e63ea4263cfb008b53c43fd61a3d7620be6f2cdc33e650cd55909135a6ba406596a0197ed81ff0ccc0426acfe3455432a2e15749e75459da206ba0643b40736b373d75a2b547a6b7b16babbfae2445f48d876b4b6d5aeb9280f9d8ffb3bdc381a79be5cf95780a1dbc945578f90843878da6cee5b630a20165b17f2f063a02a0191d88fb72583576991daac1a1b84c5f705d1aa9328704b694e73b18b1c7fc7a1df6bfd5d49395da4b2b1235a794f0fff2de21ceab7f6f14f1251f821540e9450e7ab3f7910094a6d53e03b0f72908f7e5b9fbe2783d66df04a7595435d746de67e507f990ec5f3079bcc7c51193b611b5389798e756659b3349c7bd4c1d96db0bbea7e92ed7287f664535d9dcc25bc8af8fbc4398472b5900f9287392666346f12c3268ae5947a7765292f5256c82d8f1a52c1b6837a3e01564f3e0057d26cec94809b1819ecb802898f5028f7dded36f68c5fb203cbf931692d5a4974b8fbbca8154d826c53e5b5900545869dc5d1ab676676bde85d66336fd6b57bb4d7ad9cfdf9e16a54f27c3c4b25e5c91722522f49c3f0340bba68bed017c66ddee22920a932b35e6529f6e4e8d67622fe2b40a9707b50f5531793c2e730547986edff63d08df309231b6802dca7273e058d0a11c492ba8931e985932c5129c21d398b00a1acb906fff2e86c187926ad21478bfc13361c8d8056360381ba0799fe93f65d3eece4e84a6e945a21dd68f5785ebc7aec71bcfa129504023c6879ee2827f6831c2b186666ed2de520c5e3ee68903d3bfe66d90448c4f44e9b2b5b827794dc0d1658d110c2d10681861206e90dabc724d40cc528e745ca06dd571bbc3864142783824280c37cad9a97c2a23bb66918c9530b2ac552a8931be85c31e4a109c8c5b0749d6d631304c774b4591429bfd0d4ab8c302feb22ad291beacf355908d263779d9111f2198006b5ac1244b240cb70292d93bf60e0f2e8a77a4ba3bf17ab9636e1732d09d8ae702bbaecb3e006cd2c9f775c6fbd699d9885874f60bab2dd97754209ac58d4b03b9c16ad1eb00e90f8ae1ca3eb8775e0048119fce59bfd183014742e8f53923eeb3743c6a1f5ba1d857b78d9a8a0ee012046cd6ebc41506c4d5c34ee6d773bd377ecc4c2e54b1d6b97590a63d84c0a898e81a11990a4fae09104e18bb80d786277b71ce83820f9cdf9392fa6e1b8670bd07086beb907f2521b00311ed3f202a85f5e82bca32af01b44add8ea09399cd647269a7eafa39d55b0ca57893b0ed4e72071712478ddd9432ab40cc97f2df772c8c49bf2bfdd36d0b7e8b332c13a2598964ae0ac9d6cdf6d77ed2dc2b2e713b4db1aeb490be1a8de5e0ded11729e859ccabb2b8533ed6f212131ab8d6221ec906ba9ae16685678421f7b4f0e7401a108ec28add6da79485036d4215a8bb8d89952c5f0fddce18f140fde1ae5b08cc9937325479accb45581c847a48e71d1b4af4832f626ddd27435ccc2f4f68abdc29bda209115af92daddae45fa7cf0f904e0ca84015c22557bf77d8c3e6785019a525e7ed92e5d5396c5f0b110482663d40d31594fbd22adb464fa11e0dca4816f9f3e7cba188af7e965468546eb3a9d0ded50bf5669bfeae5b65a07360c3698f80d8906d3a0f6feaefc0b2ee67094bf96679b32999c14fe7d221de2e55e15cab17c9c34a20af56b834a41a0504488d4c07e33a39525327ce47f4bb471990c07484a6f51c8706c7f3e1305c04aef2532e25e3bc1f0cfef59127cd9cfdf2b64bfe5b01568c9a5482a3cc895a2667e35a2867314cf191193da6676f22e728e8aa3acd92637f3dd2e650ff04d53e103b7d36bd627ca705466a95bb0bc9f95a370346a8612ec98bee1cd0e4b2676d01165dde143b07472118eb63c35763383344ba09ba726ed258d728cc877f4e9a49778435aa3666eca32eaafd82b1d5183242afe7b7a746f3771816404876adcc05e761b05a39d87bbeff20b9c7ee2af23b7fe8f37b40fa172cc788c55fb53203cd9c346ae10c8e247110dfdabd9945daf632c6c76449e17d44439810e93d0a37e422e058df2cabbcee3ef75b1689d6a63ef17e19b798ef1571e8910e2bf5aef2535172f99de02f3c3989d5931a8e1253a368a25e65302c8c4d0f0fe9ebdd3dd92b51fdf132d02ac957af5dfa1476f465bc6e0d340992f24f3194630ff01f48385f5a3a736dad68988ca5d9b895266b8d74de33e26418ac8a82c67bd1414ce5b0fd9f4718f0ebfea4b6f22a79b9ebb97769b56930f61f265f114489fd8854aad7c7178d8bec28cc3b6f629484b83dde74562a0317a25ea76c8090158c72bfabc0c4e57def013fc717a4abbb512335b6c9801050f79ada4210637e6b493b39f2f9e5026006a5dfe910bb631b075612ef1384c2026b7c8239772a74af8740d2755413a7fa2acb5d914aca3790d0e7b66a6250b978fcb6c16f6b3052de0d6b0d9da8941d0720ae37feea3590ebbaf0d8f4ffb5f07543c48bf283c38c80ac4b363dd8d18c2ca7aaa88fce53e686d707d6ba92d51ebaf7a0f127363ce8cf6d2d291ebafe8d64e08a24aaf3d0cf875090b659b6bcf7ddb55efa555c98edcdc0e109925a593d6676d67cacf4f4c88d3921aeaa67ef1e7b3dc5b9366d4890956df62d06e288cd5db3f75ad31d918fdefa84cffbdad111893ec2e3a63b11d2bde0a840b4d044b069428073738745f2a7213f2257795f92472cb926c8fd25807f3f72b750c57d01e13161a37b885539ce58d222dc1219e8408cbb6fd0d16680ac9b54fd0d26a55bb8e011b012cec040c6398bbcf63671304e4a8661d17465de64c0405a9e7c3eb47418ff4dea94eeebd2f8266a0a8a8c9d438bfe1d919fcca4289f0234a8f14bd9496065b6ce38a63073d9e9f4d8eb6871e824cff547827016c2bb0ceeb63a86feccc421585dc63c2ef17da01f9f1e10c21eedb598743fa8b2cb9e6147448097105cf3d764d826331573b712e6da484cee88baa179af3e7a2edf5ffa305a860dd94acb77055650ffa48a3e7a635f43fe1c309f48f133c2b87ef8101922c08d0fcde63b2b20e5251422c8d01731df3b4ccea4d1c5c27c68e4c7540e1a9040108f283753894e7f45e127efcef0986f976589d957bd1e90c3ebc015e55472d49b0b12e6ae9ebc87e84c491f8204bdd739f734022bbbe35464ea38d168c5ef11a2e798828d2e0a615e2a5879821de05bbb64c883d82733bf80aaea42b6309b14d0042529a24a1f8eb1703c6bee37e410b0c8ebf2a4eeb046e87307d70890376ca386098d6d2ae219e0461723bc189e43d93b52f3703668ad65d5f59b312d925deccc6fc284d00252096c34a594e7f1008d8a448c133eeba4c6e82c209f38eb7d1662a5e8fe48a42817b6eb698172cde0dec70d27b1875eeea4d71bef7fdc94031e8045eaefa09abf4bfef766ca738f3f6ef28296b6064fc89e5fdd3211668a9c845de0a674f3e0d81bdf70f75f139eb0c3d354f883273188638ef6a371208a84b8368e8ea81715ae14a4af2a93841617dc67a1ef2d31d2bf2358deda09093fc7783d98d3c10b901c5aa7bf615b6f792673174f5d1fef238df0a8f5152c2381520f6c964072507626ca28bffaf377d9cfecafd7dbb9e7180c145f713247889fdf3590ce004d287681388e3bc4d5ad93f78ef83ca5c33c33019a34d4e8b6bc050b4d9629d401904022416ba2d4e1d1e16c4e8826e37996644d05bde7226ea80ad5db0af0bdd1b191dac36b9051b4a153223c4d7e3573bc8d1f28adb5e65c82f044977c31925c7698bcbe43bb860187c3cd303b81c2d548c0fcd9fb0259d1098742d881b93402b2843433aad223f76d6016ad500be07afaab7d89f1a6b2e88e704e6cf8f7af77a3273a5e19c530e6d672c7494d16066984da511f4bf4106c12422c1ae3b788ff857ec8c61a98bcb4cdc1b5be48f91ad5e19c6d4128c7599a5216fc567db75aba959aae5979511804959c2ff129e3fa345d252351cde6bce28a689d5e9f6590d30ef7f9b1ff1d558c2798ba6454d89a7ef0f6504f61bee6fb33fe3f03911e4e4dda44b7fdebf9b73115587a5dad16e21f5c18780d5dc672fd8c3000a90cd0c78c80591dd40e7f5f037090f16ec0431feda84944c6c3e376efbb6fbaf3809267b261f048d2f16208efb4f3e122a342cc915c5f54b00256feb3eac62168cfd0ee4d9ba165ffe6f6851847b82cc7200f0354e098f9ec2c0e5ceb068338b69fd64a7be020326b258760b5a39d9db9515a8599387e9e4aabc2580475e8c63c7a1cfb28be46221b4102148bb5de264d91170116b0a5cb0b42801d979819e6f5d2df355fd83fb0cd9246551d00a9d016f6e5f4f6c04bd91d1800a9feb36cde6ec4e514fc2afed7e098b696fe8c022710dd397eb34073ba86027c3652fa8b984ab00d81f16de9ffc59f39f5afe3061cc237d8cf8de627d4471c64762192408eac8c965419c00b2ad7a8d9a09da88e81846ff4b0b01e54753a1340b8725aee15777b05011a0384774714d31193db04478069cfc08e8c49f302d3a189753413c1477900eaafbe86fb227ab9c740986dbfbc8e49112bc17721da9baf25c731894e1f7887988021db085f87c401cfce002d85dd7bee887d99427cb3c94a0cf1cdcf351f69598d15224e5ab16132359fa1024ebf889d5f06f7cfb994c1c58be22f3a8c7862034fc3c62cf7950534db76c9c8ee9fced2150ede09afcd645818bafae210af93796841ad97584042ab7b21c01f24c339e47034f8022fd648caf0748a96d71a08e74a559363b1e7796b89af7fa1f57fbc811d7b4f7a9369221c80699f2fed8f0adf85869ca24f6ad92ccacbb860d414fd08d0f6a7d726019a79cf9d3b7f56cb24d60145b8cb9eb7de14e9dd8215d4a81a1b4d55005ddfe62344a753eebebb082100aaa8ff117b41d3428875a209f3373345533c4b18fb7002e9d1486a6ad73b54b2e266baee980b11b401e6f394d66827e11be1555464522c7072998144a4ac5ec83e36b4f4d2c55c4bce36d084613aa99422362ef0baaee502090ef6bc25dac64a74974ef94583fcf272877a7e7eada61b081517343098f0d52dde22549f62f25490bfca0dae4fe1407639aeb0c605a339b470c4407493dcce2ea003b18b0dec6319cedbf70a996e4dc8001fdbeaf088900ec329dab0e85dfbda5e3f5be5d79febe8df49a14fc2eaaf1cc99a7d69d78a0e244ea27e021a78e2214297cd9c77f9f0316dd499d34d45cc34501769642f0d160c57c294f5880ce3f3068770eb860d3049d37d09077d4af6dff6dd940b3c5c32d70321db80be8acf8297e92ac3178d245ca0a286b861ad9d500a25c6bc1755b33fabb5f239cdf111b46566694bc4c5d6f4f25d9d6debd69f590c4f14358dea076ed35e8a8dd2baa13f35df5974324b58a4a0913ffafb8235dabee81fd1143e22d26c88bb996cb92d4958b559af1d39d2056b0781cbb3c91b491c27cae0ec8e40993f80a78d33ca7b773f6acf4d35e512c8a3fcc1038c5b4c40ef9bab8fc78c9f634f8ba4a96244fcdd82f9cdced967ec0ce1abb1f9db12fc61ec27e4e0707eba74b2291d1730bc6cabaf035e2576392b5f37a2e879f19ab091a19f9d62ed96f762d5dbfd4471dfca1a7bbeb6788039748f0464c9eecc3f08630ee92bacc649045e882884af4e54faa9f3472ebb16dddd4c392c24e96df217e13f813bc51d98b7720d96f19c901a7d01a88d9a5ec0bb9e2812049baa2a83d018637aedf9e73e64a38443649fce7c25842566648d38a8d19ce03cc5a3e967ac16039f72f77367c4db714d42e817c29ad987d60c6a06670fcb41f869b6897a277b9f4c370fcd8eb2f44bc271750fe32f4b9f52a29f31f3518c8f8f77f10f5cc0032d3f39fc4797ff2fc85d2c4b151e8f2e4879863e4edd1ab3b9f05d4791ff8fd234cfdce8e700e0bf84d332d3e0f53a2e0f8d4b2aa261319912f88da50469b53a1fa91c5e98c32a0b37072ad97f983a0cfae0391b584696775dd9460f17ed1c0e4aeb34466ac4cb948dc14089f40ebce784c989dbeace6e6779c74181e3440bf99808ba766359a8cc12c51e7ab6f072d40611bc14eb916928a5162287ebb8e891d9128006e99d8b93d175d67b270833f52c9ddb0e6db861e0f05b844f895395045204e03023b402d4d8f23486835389ec19d65775aa801d335f07b8ea8d6d8d160d1dff23386f02eff770805a9e60dc7a6505d578f13459b6cbd3c46c8f9cc7c715233d4747535549492a4f283ff46bbb0331355e9bae0b1f9d139d7ddaab9366177a5f9bf43ec5f40f33b1db368e416b97bb8b7170ae0027a9e47ce212b52d8b8f63afc6475cffb8dafb9c7557a42246000c8eadf449cf0e8ec4415911cb14531282cbca87246948e2f9093a8c30dfdecd3e41d8e4fd0d549b1ee2e1d38b574318d1850c41a32b2c5805fc199f3ea84eb0a8d42e44200f0c012ad6b5f8a583588718f47811611ab1aa13e5df98e57c26d918c4d2981b5c854a73eeba8cca4e779a0a21978434a322d01185a42d4a4ffcc57f5c73119fcd90fd6da648272f4ea1d2297caaff67c4f109f27db7f49a5f72a6870fc05f21e43ad4b1b45f97984e7d197b499465b52e061be2a13f4b00cc785bd26e475cf37bb73fcb6e47997b83b05f6254e612bfe1c993171d4ed09039df08d729ea5beb15fe70fecec32db2bf8e3cdf16fd0f8b432737b91053dfaf43bcf622e66ab06b3ffbdcf1cc2605a245782637f71a3d745b2f8bee01548a6141ee74a483daf246bc04b0550b5423ca542cd8d603b543e3c4b20d1c904622410d54b65546a5ca89b536e0790a814b993961c7da0a5f8ef92f934192fa6e9ee29cb3a44ff0d8085635689aa121112aad19629c7999a1d1f52af1a180710a0269ea07ce03453bd3fa24fd7a3338a10bc593709363c6d436fc719696208e91b7322c84d9b2fcba1f74e354cef62ddc176e478b6c2e1a86dba6d63e152d9504af53e1b7cc5703d2d2a6d88af3e58f117647edec98c3d1e20c39e8dc634480191aca4958dd1283c00ad7a4e325008d11351aca402f61c6d011b07ed756a8c7a98e433cae6fb3eb881a1350c2712d5066cb4c5e70b428bf5c67f008169aa9209c02f2aa7e467171fa11b87b7430493b2aa5183b4e076c499671fb78a12e95e8a4f120ff592589e08c96833f8e03d88c7631b083797d417e4ff591b93687761d76376e7b60586da756e5a56d39653d0591271ba08632953107f4f123dd007a8ffbeb810cf812a17844df399d3439b921d02c71d414e0a033b7bcde0fcc793e0921378ff5e9bf9a5dcf6888adb11b66593402eb571fad368be2f129b2b5cd1dbaf054ea56e43f0831bbc7f2ffa2e7291437b9dd017c098ad9cf0b66874a459f80c938411f3cdbf2072f8d9902b9b369287e56f5e8640ad830c16c219b06255da9f05e28808f521e3842a6fa9e7dd20c8bc81cc8f48c7f4e9dd7d8da2b4959975dd48f013674ff4ef3d0a718ce63fbb61dbc2352c948a6a6852c058d4bb5416106b925eb1897b75ec267328449d3033c2756b4200e67c56bb13a040cd506e6d388516f1a601c7d6a4995667da10193025a5e55c26624ec03888f8643b15916da22d67adc251f10761284e90998f53518aa3e943a94cd6146ac8ba9a04c072c99ad60de1c136a38862b73f2d0a8d61e80b92ccff097e3ecdcdbf6d7f849ce16a3c97010f250efb111c3c6a115200551676a66c6611e905d2dc6df18d39224f701dd6085fb4994637c9bb16eaaf7d192ad34422ca2ca06689f2959af60fcc77896b6141143f57ebfd3ffbc3d1f3573fa214f166ac2c4b1a304d1d6237b37732d659cbd42c134d0dbdc28c5800d9481fbf2412be343206da4855881686241eff60f041338f44e46d18e362b0bd45daeaf16d2bd496675293970cc36ddb92413d52cf4c3fca9dda11123b5ef0c670a56a42e914622be3fd96233edbc0895b6a07285aa6e0425d6a45542a382b35e5a76b75f3a38f6ce86e08666cefdcbc62e49e047316f2cdec838c6f15b74dc41e21530330672e45e35353f14a7d4d4a43924ff49f33dd5c78576d3abad0402ae840381d0eb066c443a048cc46b78c17238b8a7b1af093768c40edff1541a133bc465e331deccfab10b805179c9868ac0579cdbcb74ec8a51037bfd826cf44c4f5e9fe49a2ab9ed52619d111518a2361b2bb082761f70301f30f1ddbbcd6d1fdd308e150bbe53b0191b0a93fb2037fa64959a777883b3af63fd0ca76d0a1ec7b54b0db7ee9d5dd567daa97caa7c6732b3a726c268ba823f45afe493b5478936f63d2fc483db6489d46043af482e6aadfe5ebc7d2012eb78fc8a964fa16edc4d995fdbba6b4e809274b5bf753518cb82dd7d740570c8f10c192a788795ff4172d690875ae92f3f80f9e00870718f9d6f4f02e1b6c463a4e58960ce4a6305e05388be52fbc5d8b7269f00cab7976f5729534e0f5614ad1aeb6e052ed473b46cc6fae70f2adc9325cc38dc2d5ac84ef09b7ac7db9f8129620518a6084838ec17508b43e0deef9a5261d427b91d84e1fbd5d0bf33765caab226c68e68ebbe254eb833bcc067d0eb8cc09329a34e5f4117397e50374fc1fa6cc42c599470a7f03d96d3377485f830234851f7db4af19369edc416bc8c3b6176649d8179a26180e530d8d81db9db1f32a2a582f2fab0e247a29b2dbb59a3c8f854769eefaa074e07ec56f6cf9dbace461fd781aa3ec46a0b57b0d52f89444ed44d4e4a721925d36d78db169ed3833cb40e0c70ccc9982c60ba4eb64c971d1b1ac29eb708152ba65e54b42b8de6b4f6c9539c423c43fcb5f5c961674e39881afe59fa6765c15a33f8b485a90b049a36741dc0d16332ca728e896367e7bd473364532ee893fe89f75143c1685268e0e33bd7a3e6a81c753507c0a7271385a33001e991dc3662c45cccc3c529000bda3800aac00936b0f887a05ab43ad9979eca6bf40b9fe0328ca20d1a9bea698a203da85ca839dbc55ad6a06bc374f7b4ce04a30378f1b10f27d5b67f231845a60907c88f488186747c8c278ca6acaaff2d272e5a78b31377ccf06b2e1e304f9b40eb9edb985194f76bdea0ed6fb3c1bd987d4c133bf39589cee1974faf5535737ce41632b4e1b3817314312b8dccc5121a3d8f2d69793b01890472cbeda0df2528dc63eb5b93057449ad66e5c01072303c529ca9f8889c464d972e4926aead7bdd22c971f3f17e2845c3dfd69c8bf4684f4a99af4c77d4b711583768777c88f5f4fc240bdb4740c7e597b7fb07790d87bb34cfddb3b0f42a0e98615965eed40d6532f63be6e1ba63aae5ee4490b04943c496fbeab286916b60b90fb8321c1a3b488812a35c53c5f7a011f31e2e2e571286ea2069a9a08df01c69e823611c311ef86885c350ad04df82b9f77d0f62516079c8c138448493d02f87247f9c93a62c17c4494b19c8750a72c5f7c720576b4596eda028a16392a56927e9c3fd5a10548b00ec376686fbfde987eed7e9f627f53b24356dac3ddeeafb6eb171be41e486b6701561807f0463cd77d96dd5082a13bd071343069e4208677ad7693fa8cf1fe6beafd6708acdab2f34f415ec2f01faf52efe360ee0e7fe19f76ba69a9927b8b9b6fafe6223bf20cd49986e1c3856d776cee14cd35305cc6c7777f8fb172d44e8e136128aa86f1eb088e11164ed4a84215d3b0cb6b0421ba230dec64abfe2880bfe4771b590bdcf8538a8a86e4264d586a3213d43da6c3f421b567e148368aedd91f5fc374a7082dc5acc958b0d6ac56283bcfb39a202848207b413b404bcf861847f6958068de91256b9be27658841d42999e70cce30b72e924c968c5fd5077211876efc7e4eafb96bf053f732668e09175d051bdf460e1c660f519092106af4d018b0d730c01c01797d239f97cc86ce0ead748d41186794a18cc6b76aec8cf57bce4fda129916e1ddf5f2fb9df9bb6c5eb227c37c471e507024f01464faa5c4075995d43a2a09d7843c71911e0927d7d6f1adc6b307b7cd09e639b2465256f589873b70127df57739d26369aa4d0a4f145fd5df814b7ce8707f611b38a406d8409022573c04cd7ab8438456596fa04ad040cb51ae4fac5de9865a5832aca8236d6cd9942ef312257fab1dcb03a82b6f65761e096f25bd988631bfe262b4f65ed68a640be37c046c4653facdf8721eb56ddb3417c590b60527382a6cd71a26eb15abe865d6ceb0c3f542e01b878631b837c61cc5782a09e938db0e5728a6df7971862047b4fe4333752dfe0a0f3ff8f927d22b3e29f323f9dfd303d8e28a00f38157a48add3bd6b1d07f7d49c681599c6238689f1c6cc1faf47f01482731e84ee0a8c74a84731f111dbac7f60f3cfa3abbebfb05a28c57cca110b267946c8e7a795aa883f7eb1a71f99e7b674fd3af6e1d8aed4ca99f2697affb9c28df08fd2f487123eb18b8483d7c9c83caa329f6efbaab92bc2191fefa391799cf9c0fbbbcb5436bab512dca53f23c967f8f920c2ad37baa35d8e303e97ffd72f70050313799d46561300ccb254b2f9c3d19ab736a9efb7de522cbdbd465e52aae63702ef4013f4a5e768bd5f4248331a19adf11d1aa659b6c72605ff75f036f88211aa7bb0db8f962861a263044823ba797fb5f25084bbed14644158b6b832335bac116cb40b7b2afbad44159e58e385cd3733cb917051e2ce51d0dfe7859a7ae95055782e5a0f912f06626e17017b6799a0053f554fabf5d9b9e83e70c6b3ffb1f1ecd8c8d5c7866b72e70727ce98ad6539fa2610103e02a7c091c9790eb652bbcae6c91cf70e8ac2e4da06e00d01a7af1e3099debdc7c74ebf73e6d667b177f5b135aec93f09569463cf804003edb035cfb7762394011302a8392e7b20ba5a2f0bb8321e958838b8f757201f5178a6cf49e35b5b442195d677bb9ff02ed77cee570a9db30242cac41c76ff66c9ee48d361411403bb7f8599c40c9e00ae0482e647609435eda95b024583111c2f00f4c1f32a48d774d82bbc5d71f7fbac47585d83919e1c78d2475020f17ffccd935299e98019b14bb08c62fcf04f5df4688f9b81d5ab298c27131541a51e99f07371d6c43a1d33830595cd0c5d87abd06da3f5aae59a9c7cf161de3b575e0788b79da44e51e7e3a4a86c0d54afa393948e04a53538217c43f2a91543f4595444f749f03a14e745663b7794d77900ea8b218422bd454a5f5f90a60f190be2d738ee2f5211254093a92ed46f43343bfb77aa7992f34ff621e55516ba0e7a42a9d748949b05621ccc8db8b1bf6bb6f9e17d690ec04537374eedb3678159b9239a2613df88ac8b178320eb618cf1fdc1a6c9e3049ec41f94dc5ab63bab6152ac34ac03b657b02d271d233af34f3f34a5b30f435edf44938bc61ff9fa767888c0115706e30eb77694bcc1624d42007364da286121e4edc4717f2017d75c5d4fa0e835c0e574e32384c96372ddd3c296dec07436a18af197af05e58675a19a4505eaf0d636f2c74e11ae946d570d920a3bcaa5afa72b2f66c0114c9575e9f82db95b0e86e53b99b74f9054c3617ff6e781d664fdba1bd2df0e3fcbd79dfe06206d1ddc29f019fd5b6e51d33a12ec664faba47c786fc43949a7deec1625ef23f0da02fe4277db13b502837f253ae891b99a4d93a73313ecf0065c9241a560aca4738cc4dc97177ac6cab881410ad3dc4170c09914eda4a7fe36578741a53afb2ad6927ec053694064556cab70837aba26481f2f031a5baf2815b48599c415f909e2d869da7f5213846fd3d87164a77bafa50c23b0d786fa48cac0d33da21cf155ad22118623a12dda2fb8cd8f87bfb00180feb641c0f881a38f60010baf8999d92e4c1949d13cb28b3851676f51f7d1ee563a6e2c8fe601a24b5c341e8ebd9890be3072f553c3a89df57296408c1f896096ea47e809d578d052cf8a90f52bc5a4f6ae55b1954b12ab889e20ebbeb617609520bb367c4a1821ea9ce79f15792a8f72ee7b488cfe70bf0bb57c58310cd0dac3e594d181639a9f7cb6fd7345dc2e55482a2749c5d796c2530b903e4fad6e7ec449607229e560bfd7843bf0e31df21bac5da125f6b7d707be577af31d9a9bbe0111929de7454ba59a4904164b12086ab1562f0cc8c7d03244de3b922219fc364a969dff87a07d31c0bd666cccfff7db8a4ba5f3d9042b0ff93af2af73cf9ce640ed650a04fa86ca01db34853c6a729fb67d7cbb8180e85c2778a8ba4befc00d330830ee93f83033155f2dc486d2c2c61c6644cbe3da0118e94e81086f3e8bc821e9ef335a0e97711e686999dbb712b7b0b6c17e6a13b80247748529ebb545f4b9cc603ebda5c33f50f61399522ec4389f2a26993c723339fa49d96b2400b5bf5d76f5cc97ff71b8d62b7bfdb3a79b28ffec1d8612756090e5960578d0a1881cc25bd2b154d09e047c6563b3f51bfc2726e1a3c21f7be56e6e9cf14cfb1a25ea89150e125be2eae6420a233e8e440397c80aeeb94839efd885be1cb1183d950f265669298d455cfdcfbb50ba8145824fdc7a9ac1494a5b9b427c6ccfafe00a6b45a168345fc28aa7cd4c344666a99ec2ae7b1170da4c5c4de083418c30fed4b778325ba43066d1a83d124423b7184e9fa0a77f3cad17d32d437ddf3f5031a6523d4bfe1f0722e658a5d1d78dba65ac46f9dc96a46523d013c2766354a159a9acb1173e086452d9be2fd626e7c70ae7be2ae57c9883e1ef9f0f518245a9e6f7c129c0852b0e667b313e800184303d730c5f756da345d739f2351cb07322d5a40ce5374b9e4c40e6203e576c32037ad9f30f643bb278e0b7a5309580bc983bb2aaebed0048720c0f8b5df500ec4a33e06cfd83542e4181df4c45e8a0f4a0b6b69fe2f4678dc83f917967cbbe2a6849c3097df63474671afd612f5510dbf9743b4274918385bbd2c185fd4af828da5aeb38d0f830603e7e4e7fcd677a68fccf777b3952a187f0cda7d655b7af91a22de66673fe1f8bc38cf39dd976afc465adadc96a3abf2a70a3b7c1b13c85b042db2a99239d3ad74e7f60a4440de94608e75de9ba0aa6b3d790af3c019935b8680dda52bb708f46c7d6ba25924b6a4fca1ded318a93e15139293b0b36e17137af87171a4307990ce06330a8f9cd8dd4432d4bf4f707d7ca88d6656f5c74eec1cb060438e9867f5caf04ea99200d0b022d50ba5574bb394b3ead89390d7314c14d79181e103e6153b1ced19bba5d0dac61ca5ab5b35c1738d1a2b3d04b13f2a93ea8ccd94548a4cf69c9eb2b5b805979dc26df3b6ace51b28ce98d5cb9a7713eef820648613bd8b65a6ad48790363400b21648bbab682eb0df51d2811641acf3b825b53ef1c08924c33ddc0468894d2a820f7cd8ff69395f2b80a94a734d35999dda811a9e5d3fe535b74170106a80636851a0081292a14f38d98eb49b2c06999f281b88de17e01de6dfc8fb7ade9766a9095e0bcbeeb90210298e60cf4d01bc2610ca992e839cc4b7f2d09b3be98241e82e90997e441a7ed564ad7af7683fcd2b1decda5dddbbba3e938804b4738823288bb289eae80b16f7eafc5df06c8668893cd7138a7752e7ef6106a6ecad58e8204f3e0c1f4042844e596d6a8a4bf9b37e5283b3f00c56b5c2b7f9e6180b301696b00695b1838eccc1852d2f54166351712e35d60a275c1c3ed8db22c570a2af589fddb8c1bad6a8b0572f1faa1966f8e6cfbae608043fa76921aad8f55d9878053307e8b2b15ed2008f70d4af549b3dd390eb6aeac84c5c40108bd762dfee76ccb110a2a16c151c0931de698be3b588ec9b957ec0ff6ce33df2d87a6cb106688eef5d124804868d61140d001a2f1e995b93ba772171a8d75f508df2d97abd57787fc89e0fe3f21b3dc9257d1694448106795ff3769dd9c3b350cdd08116d045c71ef47fd607398d012179608ed3ddd2038b8123689ac94c92d1eb5dd56a3948bc997401e5cf44eb7679178ddd066d77c23a906de6af59c9a527f0642bf96a00956c01c969e9d229a60ba6c6d703ca76c6acf0af87f25600937212c90b3f2d92a9f001eff3b590c65c41023c9fd86525dce4dd6047033c6a7d1ece6199761173b6228edef42b83c31c9737163bd5eb0fe41760373a46a463e5870d5bd182ba06f7b7428d0f71e8cbbf73702a35fd9f69e08615f1d985be4db13a338a383f44fa40e613ac159be93773b3305050b3205b9bdbd978610c7a58d1d5fd399ae40eeb4dc340866eef3d09ce1c8de31beb6d2225fc2f85b3a54988c821bd7a23fe68ec8112f9e7c19ebc6c09aac6478cadcda22783806d4d4313c09e7e0189cea0c79ec8ed6b512b79c504a4606ae7b28e2bc06315470e451da752f5584676842db062662d3f24d237b5129fec2094d6782011947070d89e571eafec05768efa7ccec2f0850fd9960a34688a2e66551f7469c604e0978399a6ebcddd216ec5abec2e6ac59a670c0023bf3a135961c7665bbb643b4b4a22c1c1d1d89290c10b26bf4fcaf8aa99426c73a0f28d1d759b00aea66ac2d292901c4a2e74ca90739dbb249a17b352fbfe7bc8f02ca750f055cb8a929ba62c6768914fc2f801d7151184d02d4e02ba55522005522125f59d717258a4c0e98c741e2aba594e25599fdc47d19498e1806291ff579c01e372a5a136880b194b51b17e55bd48ae8ef06f4355fe8912c3fceb1a92f422029f21afd7e231cceb03a1ef24bd172fc02b616d1b7b37d832a6c41de6245b9f545b8d951657e9d8fea2c54698bec2fb854d204c57584644cac3f503ed53280b1a6f7322829f45e746630aaf6be6cab071f02fc46483200aa0485dced08667c6021f6ebff4a4f1ca074837af45c4fcc4399a6f8ccc970e1fd80854f6036f31738fe58eea63040541f4ba913c18eb51e9174a5eefdcb85cf97b53a19fe3c4050065918788aa849f8ba16e7f9be625c73abba12950e6a83b4087ba6a6cd53161f4d7d7a6ffddb3e2003324aa9cfaceb3ba00e520a870dd17c165fd5a7e666dfa66ea75aed10f85f8cb008622bf30d1bbecd49e8ace853b45534d007736dd050de195475c2db08292a6d18825d07fbf4dcb89972e53cb787fc2c5abcd9ac7b17e5975b635e28931a80c211dde7cbc450f730cb1e4916879265c014421b9d495ed776bd100ec926d2d741dde4dba6131a2404ae3f093d667010c27a9d35b5b172bb4a9efa4161eb19940e9e7ffefa56f876b92b0e739c674b6b0fcad0675179c325851022084c9458c73363147f237ad94392b09a03fd47438bd1a19116dec67e9c8541204996b9230d8fa296be8f0464f669e88abee040ac299012a4b100b1c4b2973e8e6fcded74353190cda02038b4187c34928b344a86f536e030b4775dd207e37ca626295c8970bcf945948c3f7d9c87d4e4daf53bc406e33678e7a9438eabe288c72105dd6a4eab0dc764c16172feb06c8e71edc5de4497c8d60dc439bee2e4ee10682c9725ee00b097c93cfac4f0acdd54cc0b52e56e3190f4d7f36466f321577fe1fa4050f20e6ebd3614d9ef8f387051c0b87eff30c4f5cc75bb1b92ab0dc4d8f78df70120384d4b1ac6307a2dca6334ececf417866f21a38955ecdacc9bb20d3f3b7f8418ffc4fcca740eea7e143ce682850b50498e3edb66410de4df57c8cda66e5f3a92a31dbe088725fddd027a85331339d631c45b7f0b09dec7aa41512b7f21fecdae0ceaef561773d3159b666888b774ad7e9213037282123b03658958adc2175b7cdccec52293a3cdcfd2992ddb4a2965dfbe69a4b43b1cdc2150e246c8bd5eb1ee87167b060da6eca6497fcb30c6398ea1f6899e2d6ac59941310be737dc3f536965c11088316571e405ce0d2bbe6dbc2d485fe5117e813a3ba51675e6d6f56e52edc3fbcf786eb1981cbafde5334c8aa3e95bdb0684fd5543a8be384630508dddfe75a109309b9218aa67ff400a5269d1ebbaa83739e5285bdfd85947cc031c8db0013bb2d32a2d0b6b488d68a3dd3d32ff07cb1824efe2ae56207a19412f0a123dd289e8e1b2719d425552d0e8b1a82e348d1a63eb789eed08bb09b6f36e1b404730fca113d9486308b68157a1cb62b1602e77a7e3f877ce9cd1357073b1c7a6156862aaa7f4ea9e8445142592870d07c6dcd894b3c1ec1708520812f880fac57f205c15426d6dda16ae31dcf5ba4380d2ecdf8f02468fad67bb80b1947c8ee828c1f74222e874285fbd8b253b024fc229c4db4751250ac1b532f0e8168a9d12cd8e4156e0fbe53dde334203bf7430cb6116545e1a31357e623f9676405dde8c6ac2750604fd86d9e7565b8b1c47047e3006219eb3983470a472bbddd1130ed191c055d895012abb5988f90fd1c9a71ab41a67d9755840c155646e74c3fac9a02ecce3269384f26fade0667f0171356b0be4494055f919a82d090b4bde7e4cb2383ba5ee9a0e603e39ed9aa1f47574cabb21f6312b0903bfb14914eb939a8af275f8e328fea2d4b4c595b55e5a33d671691e92f95c224ab2fbc46e0214d5ef3db441e1201b9dcee00a504b68a25d8a01901bcd04ff77d07bee791b72fb4839d9bed6478904c87483c55f183bc89f079652fbaf16d16138c455f832ec488faafc13f6873055d52b14ccbb04a2adf174104b6d792e7ea8cfd86a1a581ab0ab735cbdac3a41509de543d578cdea7262dd0bd9d03d55524584bf912aa79b957ddd23b16f8fb2d968e61de0bdaecc7d724ceff23f4a54bade29dfb11b3d9e1388073ccef9fbfe454534fe86058786a839f8ff51177bc8aa17846caf77f8992e20af819029e2dd8bfc672a744c9697278b7cee95f6714e16468bad243da6a0a7384e0993c10f408a8e872c8d01f78890117f73b2f85ccf1f3bbe089efe4850929e2799d3baa0002a49d5829fe44d15999dc7692d266ad129415329bf68ad5daceb03135807c04748047298581844002119c8c06076032b4bebd98c9603df25fd774170c2a27a842ba8507f8e0a1261b3c530d2b2782edc64197198563608a7a8c204075fc385deadfcc37d5df70e9c53c00390f0770912340074101eae399c73d8df9b138cf2f64a188e2a69f1e11acc4ad895af13ad84bab581155a79182aff14ef9b0b4c6988ab11d8683e536acb3d96eee03df10c345d13621920715965255cc0d8c678a60c163f41f3bd44010f417218c444ba5baef50bf10e92fa346e30c0e7483c3315be2489eb726fb6cba138c9d96fd1ae2fdaf2cfbadf829ea37cdc8ef9e89929fe41630a84ef5a7af8f747ca26f0d8189071e300917cd9300729b96dc2615c51494cc193399e6fac709fb13866b1afba7f0128e61f8a788a90f11eba43381a4598eec035001065f009ca9a00ace209f49a1187515ee4b2c36796b144bc04b0d2792a721b2fe7e92365162ec437fe1562932cfca6be1cbae4f4614c8451895e16068cb8b32218321d528cf51582edeac7f30c02c5be71e1813fee9b3334053f634f86e6460cc18d6488ce15438c5c44393506e17e9e3006df85c4e9b1887e5d2045b7cd38be68a8b7e6769894fb70351cdcaf1dac6797104b80803d9f4d9edd91bed525e88a9aa0f77e83eedaf155daa748916dcec6d67ae4dc21dc7c57bc69b972694b81a557a3a2357fb9a705950f1629e08e0f16f3e50ad0e7912f33b1fe8929dabaa09f983aa53a242359a2327f3e2b724dec743faf22c28a31d7143d1ff33bbd8e0ec1258fd7c62a81d13274732580d1cf2915018bcfec3daf85be6ecc3126856d2ef5ce370628578f60bf8a27b7062843dc0e431e9ecc6e1fe120f0cd892f21ac6ffdd8ffbf8cbcdecf02f470b857ce271a64ab58e995d2c403d0845865de82aeac4d50aa546c407fbe65cf5bdd0a35b1e89ffd1169c6b1d24bfb246fa5724e05bc6bec2caa62898c292af3fca7d6330ddfc1277091e195c5099f52dd6874e1a6cccb0cf8de62da1ee201246727c3cb1c9e2ea51885868618bf34ee3fe027e69982864fac41cdb43c6b884c948902bc5e4babfb09a9c13e70b2cd080f0b319e23d0a798748c39e06b02582e5b7f63a50b679f415a6b6570101b12d9186c45c2892cb7b7a0720e428fb6ced39f56bc7b908740684ecbeb28450530bce38da62fbaa66b9465ecf2daf3058fc36089d4681cad8814c433cefa3b6175bdb64fdbe0c5dec64d6d5fb36ded1d58d28ffc463cd329e8db688cd64e79ab6e8308562fd6882a5a09bae95f285d2c1d11e17c225fea270125ab563048411330e22e48ca4e0c21ca5f92a6d484306624de95cd37681d35cdc6356ae5f43729b99ecbaff7ff25f7f9ac3749bc00e3d032caa9a927dc20dce0b0dc9c959af77801a5bd7c6271aad0af5003eb85868eacda858e905af2ee438a4efbf6bca9b967b4f6a00d7045dd13bd6553d84676b982d35473e50d4bae26765ae49e20f787b627dda00b77873db9a366310d7d57e87720cadc2ce8ebeff018e43a67b69d5e3a9312e102a16717a556fca8543b8b36af13df18d2a10d8ef04e45580abe19e662ef7eb2efd1b4e5b4e8ab72bea5f6db83d756bc49a7888ee832021072b99b027087b3b1c9616c4bf8945706f8bc834ef9ba99283977b761e26adc6a175b23aea3032b228f38745a5f8f5491695b5c7cf1571c716a3147806670b7559cb53281f6b3d69fc4af3690502d5578293a9933407a09ad0c71ab6c74fecd17f316186cd803e01fa5a20ff42720691e223c7c3ab49840d5d2b1385d7de0b701c6311bbd947ad51dcca198e6f3d72980be1ea2b7b24a8c846b7bde5886e8b813dc5fa28ab0d53c178d3353714a05a4dd5157d648851d656fc4aa9fd8cc278b38b60fca96b7e1da7f99b3bb12e549de8234c14401d973cf0e0a3d7ad4471dd1e14b898191b4a798f5b17341ae60b90b336405608ca357e5089efac0d5a91bd466be501b2cca7887e41d5f9a3235052045f7c4d490c7b09209d545e08a815368d64b04a31149893b00e826e63a9eaca80b4132870c3f0e39187fe0d0923ba204a4f959779017a5ea80a68475a2a65f4a1ed5bd94311cbdccdb95317f1283387b92306a19ea7564dcb68d77f025b95707f0e01fddad4f2aaef649dca32401c16eceac40b91d0bbf5fd647b826eef75ac4e2c8739601d003a092c11871a0e8bfa258669ec9b459c610c0496309d577708da0e20ebf9e6ef7635a67c90a98e605d0a16f6dd2e529a2ee7906f7b5328269208be6623f00dfb14aeb1830e4790c73d5d6c5051f44abf4d3db57359280743f76c8fe3926787acc183315de531a72c023eb46653beb50242d747158c04bded75d335399f7a80f8062fa2fb9e3de82623468c73660078875c81a863452ea1dafb257b089af13f5eeeb0f10c6449308e45cfa778230d5a3ce86a77887b6a731866aed0a651899107b8a01e3e7ba0b49913edd77e44a82ba6633b5e5edff3e0b6696cbb0b050d55b4659d383cad103823465b26d3300ea71c1feb3fd03441b3592f5e0dc5d5a677b97d84bbb81b1abd4975426a74a369e294e0d62dbde748cc2a65cc8c700b3c47a9aecb0bece23aba1a74668b29e2aea818f2d84a0e70616b75f284f71be1866fcefdb710beca221bd48a5436752e2f1991d9f7427cac5985b5d346c1eaad03d3d16202c80b117520282a715e1c8c6310ce016e1fa0fc1d0ed7c189929d20e478663b73a6549d79f4230948f97c04134e1c2dd48ffa480ce167a0c604cc39a656ecf2600dd3dff962a2ed2dc51eb2e8f6085d35409dcf1d6909220b9eff08654ea3df01538d15d664e4c51687db29722d0f1ee58fa2b471774fbb4a19afe4aafb8202758fe6e0539f2c45d85f96b1f3cb03593d9359e0f09e1a56a7c4088a6028ca3feecc031b2fbb98e75c5c1302a917c81c7d8e5642f02b3521b96b2ac5ac22c7417482be4323e3ba19ee5d1b77cc81252b12ac2c0ddd9e28768ae19ec6f3324911f886d3caa35ecb58c7c9020cec8aef92189ef2e0b2e1c011c8a1726c50fd07b83e752be81ee8d6fa189f913db2056fe7473f20fc4d6f33c237f9dfc60ee1ede95fc2ce1a1a86d619000b63d2007c9282aa64fb1feb69fe2100de42b4e7d55f388ced8c488691cc894161f8e48e1ce38ad8d4393cc1e4b8558aaa3e728cc9fdaaf18de560efde0a2f17faf20e78b5c52289245182ee1c9a594505ada53038a18e187588784c8f496fc548621118c6011a15a7bfa4f98cddba91bb426b42350a89f38d87428061240c655cac759c4085cc12fad2fe58a294a4c4d1d5bafaaec2101421b11efb71410bfdf58a0c9b26415f9305cb0b0de13e131bcf22bd99cfd7f4012911fa11c714fed4bb5aa34fe120e4878404b4fb013699d23548a9de451666fc91062d590687b8a460b48ffc4e7641abb189a38cc588952952bf185b26fa695858bcaee84514764e954102b6b00a4bd05829bb06d6de7db16f2acc296baeaa62a06e3405c488f77a475841dec0ff90888a5ad90d27be2a815585f79a0cc8c42e23f32417ae9a2f45dca6b341e33290f65165e8ee0bb197c885ff254afd8c49a40079864adfa236db839a04cdb5a4b383fd0cf9fdfcee60fbaedb87b3a62be6e3c7d8831a665d819478e11f2a76c49746c440477479403ee0c61da58309c472b1dc88b454a0efd439c3356c346f367b551d5f43f781c3d18fd67ac07740e6c9f3a2e45dee263b669d89b412e1c823ee78ff5e95f19f875d87fdaaf3917d42f4859d5c7b4bbde776a73cf2170c60c7d763c8e290abe322e1bf1e7566d0c009918cbba53bbc3524b182a9bcc78a0bbd835cf87f34e6ad6473f5040ab5cb9f2899c1c79ee53193f72645f1c1a79df901b1c5850b9c36705740892504bd8d7b01c9643caf9e11987f99f857a1a64cf11df1ca4d7416e121fa55f4b702baf0b4f9a9c6a90c4baff2fc4ed1880f22ff902ba65090182a37816250455bbae66cd0053618a0f85d7d0a4ca886150771f7ceb4dd89f4bda5d5944c465e24f2efc0b48a07f6a46e64bcd5fbcd377833642beeb0dd30d7c63079190dfdab123cc5d55d3962e3736999e0439cfb49879609298f4265d3b37aa1797684e8f044615c556f47c6110a6a05d0d1db7a9fecbaae2ec1c276ab08eb17468890dbd1a95108f017dde70ce5a1c29a348a2cf85ba95783c8dbfa665dd603a8dd6e392a1d0699135dc09271e0339e7e83f692c37063bb9d531687a0a8949849c4238ae20f736c55d5f7ff4c1f462764745a2e06a3d2d83d540cb1d9110a6e415190b9230fa02eda1d71b28ae4d4a75510b97b603d9a6060a5570c0a40a8bf49a107843da5d989bd6ed61596ccd893d679782344c48098c15558b772cfc1dd0c8c8a53323047c84b0d915661c2d9c32158d7f728f7ca1dfd2ab0103267a2610ab628ef7ef036a7207cfe6913f3fa854ac3c7db72d1d4673c7a0a4300e68e93403527d38dd192b91ba1159fd7acbed73990c4fe2816dae98028069e59985e1ef26e531ffde6a0a910463bc6e2f6aa17d96ef8d780a60af4313bc5f4d0477b57f78e2fbba4ef7a1ba07bc3583cf4025ded7007f07f70bf8b933cbf9ef1f883b999a9bfd60db6f29770ebcb62d7bf3cedf71ba4051cd0d89ecb98150b462beffd2e77f2453afd0eaf8e317444043c4abee24cae436608a3c53540c22e46dfef2b047b3aa3d51a1cc61d2fcb090a441842af3a726edc173504f22607e6445cd6a17dd7707fc2a4b17504969283de408d5871a44097422728e2647db44e8a7140d66b1bfd5523839da59ef3625f23d7f3df910a41fa45a2f03749dee2010128d1999dd94d2c8584d9b41fddcbfea3e43f97aa1d64bc767deffb81d8057424b050540c61047c2875f05826213cfa9cf52798a70c00b3da1680f2257ebd17642b8f84369ac85dc4b86ab862c4a223eefae82efe7ef1b3615561135b48d59f706f04c0d8bde85330867c55a1805d9ea7b5de97c8f2f679d2fbc6013df4fb12a22c31fab36d78a402b9aaf68a2a464f87a558135c125c2ed121adf4833d92d8a431d52a11d5e7dec945ecb21aa0034e9a8f217190156a86d77debf2127d072050f74d05ae82a608c18a648497bf377ae5967e7d95a01515ceca87abbf436698f1c9ccebd5fbab81356fab2424412ad6631d14880d37a68cad1528686d4eb924318f930452cf8f30be92ad9b82a55f90c418db44ac3ad8b128462f0f8f1561f624fa3d2158e418ef98dba79009122bdddb2c33731d55c270899f8818e134af373f567ce0604bf976231833e238411659543301946109888588d0e2d9b7ff788db25bc3c00de29752aba26b1c1ffdd8c05fa6f86a6011fe1cb8acf5069705045264eaba5ea2db52e923e5c3700718eab32cb1444f7acfe414aef0df3302f25ae08261e722c6528db55549157f87dfccaacfe64f4e00eaf5af7e3b27e296a85a69bd93be4e8864ce0c27248f05f19b937cc0f8c6f926faa0fc2e2b82d9cb9befc5ca2698fd7bb9c98c739cc1127183a06a3743ec0862f4672fd71681ff23005734d8f5d7420c09a9e10dd5ab52017375b2d73568595e1d2c7a4317192fbd08c9bee1353a6ab30eacec065886c3e480240e2b723069a424351202701532f925c2885ede215aa1934853b10a13f353bc6cc714c4f4a3c53588847a0cdd6c9dad8c9cfbc4a91b255e15bb07e7b2efd0d74f0216288b919c448eb5ec1c08df70da554c2c05901e3d8b5e069d0c14b113e13476e1971d6da5dce82f60ac8fab429364721f69705a6440b26ce9f5a7ee2e0583f49316bcd734b970cf68c51e3d02296497c773cc34deb5e510ae46666248ee2b1c280fa4876a5514ceec4a9a2ad1394f531088b0e24806144c4582ddb8d1c447650c928a8f3c9d039577c6f0add58e804c600b391b79e3a5c6cf0d75014f94796da7e31d3bab28bfba1337831a729cb931c02ae565b8e13af5fe54b1221edbbe4e60eb65e23afee148f628221c72379d7a860d298810dbd59b05f7d29942c0281b63dd52948aeb107542988aee3c4a9f16bf762a869f3387db2341a544212f1b9a1e9643215e683d364a3388ee547356535c9d35125fef87b12967430cce82b281d71071e0aea551527b74262ce4d07e78499dc4a80b0df7655d25aad47027b812c6f7ec77db7d485a6718fb5ca182680ef146396920e754ea1aaaa43d2df16685364c3c45d91c87e5cab16868946d2fc17be4281cc8f46d2fc3941d04d049d4526365c1c43e49179046e0bd5e1f4d6d6e1ce83aed7077c00814b4c6c8f64ca40aa78489aa89ce5cd858257416ea1cd66939309e6f040ad150eaab1a25be77b10f1b693900c5990ccde268bd4074fc5db25b8ff0baec741079a7d8c4b8b19f892ba994e20abcb7375a7cd1bdaafa671386bfeda1afa498fd11e3ee18ac19ebac5d4956b93c5779b1fb9f20f24c5d561fff07811405dcd38592737e812c28954007bf6aca6d7cb0c91bc299044cebf00233e3c51cfebef0eeb2e41110c6c649ea608883e866e507206e970824b3a01be0706d0b327ce9c8f309d373d8183f34bec8d48398562aed2aee5cd5eb642184fea854b2475317178bb299d35b24b7ff5085a3a04b0296ef58f37a89c0c38a0979ef3f58f74f6c457b9bc9c016aa71a0f2ec04e626eba8ad9f54ae5113610c48775716b4fc0a407ce28952892774cda03421214c453515269bb4fa08f708585d19fa5a2ef2053eb65520c01f69c0605d7ee0fba771c32b0d6c26bbbf7d34ed1f5c6c045cde7dc8342ae4ab85a63196b3bea04e1be72043a716a90e2f493ab6ef6a0f3133c9fbebe5e3079d41d85e59e145a5a3ff71266acfd93973642aa8722906463a39645cc423fe8837a4de88c631502960f13a5c586c181481c2d864cf43988347f00e99fe233e100877176b2311db483f106937c1e162570460d0c9c2129b481af241044f77af741ed8c83d8e468872296c2b7f1ca64f3c41c49152427bc80e31aab285b150781600e14a114cb71492d54cb7fff427e526f7f2da5395107dd56bdab3ee329767de845159f6e9793297d15da136d5973588b245056f55ddf237b4b01ffcd521f5afc6c0994ea78e18fc9fa2cbcc56bad653b1b98a91f2feb93973ffc4703a8c84250e0eb237b58d2b1515001295dd190d6e414eb21c2556f0b839704c97cd9005298ff2b01d32c5f27112f384e96cef379be2739b03cab4c18b3b2b9f9b7b62c4ef0bf4b788fe9582e2e86db20926daabdd8f57780bb97c4e045f99a0c9d9809233b8dc74e728adfefc0c34fd856786192ef03533832238050c0802de0975670d9ca683c2c2a11b8d60828e90c93626f1374530bf0c69451a6430f43d6d0d6d2a7e3659c4cac9709077cbd1f9fe79aa75d01535258bd30bcd58c82162a4840f67b5d212458c4e752df0cbd7724f18e8e35aad17dfae0f964582b00a2d65238fcea862af2e95d1102ad9f6274d8fe577886629b41fc466a4ce8c8fc1353c29b574ab3ceb0bf31d8ea53ce44f5786154e985a42a03b706923ef44ba481459116c4f291a6625e2058cd750787a70c341cc825f299507c6484075b43250da194fb3bc9b2af1de47e5ca373eb7fc1008eee7c467b441318f22728f1141f9d657f65cbf12da80dd021608bb1fc97434f499857c53fffdb4427fea4fa903c8092cc1a29e6a5599870f4da1d8ff180611060a0f7c7ff88f0562206d5faf324c8feb79510b1bf71ce70c351eed1f9417f4ac1b6e7d1b820fbc28c0100ca4d458b541313376e9cf7c0ffa254a3781882fee2981fc39ddfb01594843d76c6bf0673093d0e84107d6a4ee09a697ebefb3b514203e5757dc083066b147cd9cf15365acf48f92dd215f00ebf6ff5e2e55d0b17a888f5def383ee4598f8e31c4dbc77b215f334b5a475f3136c8e90dd01ced0882bc3ce0e1e947832d663438d1cbe6b889b41d86113e48c8671eae6023443d4782e18af6e59422254de6b153dc089c5a3ce922b5691bd91497f7c653a4f2565d0fddc9421aa40e093b69f6b0beb4d441cb5acc8eebf0a609bb4c4a80cfefc812d05c21a569e2864c45e7783731b0c582de3d58f2babbfd04de199a460fbb36a4f1547b18993a89eb4431222dbb3bb194c554b33e6321d413410ad76fa3bb0ae57f342b39dcb83e0dc5caf3aba5c4704a414699dc0a5d3b55d1379954a3c95eca11481bca86b2431575bfab731bd79afd2dc8fdab2384cb5342eea9bd5baaae0d896cb38465892076cde831c274e310be2c3226a12cdac327d95e242c2ccba9e9a1d170ed0219ba6540a65d5af67051933ae40b1509214bfc297ad8489048b76ad413ebfc30bc3ccdb52e09b0107d810939836f761f4a789e3ce5315aad83df7302ae3ab643695f85cdb35f0a57724987c8276385a02016775129607503058bafc10d166115ab35e7b7db5dcec21759fda0bb66b2864fc1230fe85d568f431a5d9bf87abf167d5c1d7a7dc04947503b838cfe04b0b427d50cce5937bd5aadee34226c2d83c8f8180041366673de40027863f7c7600f08c2485e17e3b2860a5922adf64c4e997e6fdba16bb123739a8f40a4b88b241ac48097c4ffa83e8ab809751e594c2ab0b09ed64d4e44d3f53021fa520ec3b3ab2377c53d4828bfc989d201bbc8e284259858fcb9f50223daed5d315ec7ad3107ab90568c68ee43b45659d46045e4250058045bd0ca54d18085d9a1f6d765050046129dce910efcecfbc427b1a1b3c8fef88f1dedb5cb99f5ade32191629c17d5f9b4000c82a4b7be1bb012be53b0b5065791fed68e69ed72b0e800ffe1c59cb96ff6c3a11164d210476d664a5becd22f241c242f7f11851f3006ed101be2be7bce3a72e55cc6193a198fcb6a609bd18b0e2b41ac05fed19883c07a473a3afc0f2a3f49886afb619f38a40f1ff564c82ef655dc5fc45533672e170ab88913095fc2f882507c0796795c8f660fa1e6a8519ec5ce113d34c77ef3a32e202299fb9b0c60332edec736498634597f37ee490ca6c38c2338bc26acc34fd15453043672606dcc7e353314a69e9cdc8ff077c84215de4e8284945ada642f9d192e07cd829d96750443168ddc8b7c9518c877adb495f3f1dd145e3fd420d558a9cefb99156d279a1ba351d205eac3d9e15b6dbd68a718d61dda903c2e55f7f020751c2adfe8027417818dbdb8711e5e1c1b4a8532f25e9a1b84ced0b341a86ebabe74fcd8e9da330907cc7a0141a1d0c92cf73d2ef877d1a417881bd9cf298618e2f36531e2d5b4217fc442c6840f7d018c3d1e02884e31a8a317df7715034a3a6a272505bcfec2e8666907bf5b58c01f254f0fcfb6bc34e8b59f4a9de6e78e7e2b80f4e6811330e30665809803ab801d9210af76901145a7c5f043cd45ef049c207ac92c6f1b685a85bb37afef511e80a00e593d57b313372e777749520fb34ac0fe3f8a301a8520a89d8a5e8339e4737e02b23a4b5c795d47465ac48e4281477c561d052c0431af19bb061c4ca82898d3d1316360c26e6041a811bc77f4716e2551c585c083a699be148cb79cd03b5f6571a94c5fb66d1c505da7f2a40251e339137b3d99decb8fe01e98afa7a6fcbee61ad59f6526676e5f811969786fa039f210de8213a3372f9fd90069423bd55fd8b8a1fd9d784735fdcdf87d09274befd6f814857024c1b106ba587d31c28f04ef6417e210730e4232c92ed2888fb2b0d9d609b4db98f3f618ad865c8c1ffa8b51f894f49771c4575511aaf10e136a03e90ed0c03d9f9c29abee884f416a95f58ecc0ddeaf5d5ad9eaee7ad896492fcbb5e1ff3f1c5ad65e424601070cf54f7e27b70d25e7c95534ef15c726b6e5616b23e940777e0a4028bfc6168b1d5fa91c9c62f6c7f40522c5c78e713284994f8ef48a59239df119e98de3b4fba372e8ce398eb4b88ba6abfc82ec6b6a970937d8deb97df85d2b57dd3fe3f99cf8b91d7cfad50baaf0fb499a574e6131b29c831b172c8ebf2bb82192e4a734ad6206efd945b3c3ac844f65f2bf9897af30379f1b1488cccedb5edc7c4dfa054f29f27434b4f86ceb710c844f42cc6369d3040c58ab204833e7372d671ef0029dbd617f09f482a0c8a776ae678db63fe392dfda45e404b6f35e3755285d0fd3ec3f770136641b45c33b4055024117169dfde602cf722a04b497652c8e6191eda2e02542b169a3f9731d7fbb2fb1cce7268d0e0865c13939142ea61d1daae9dda030cb144a9226d89c49615319913c8cc85f22c68c8efa07250e032f4c178a127eb1cf658876087948123649b836d62a16670d5bf83a522d4f8b72563ad935ed48f45fdfd48b21ed4a674579fff3a2c28437ef06ec7b3ce3f286d011fd226b0cb69b3e4fa9fd92671cdc0e6a44fef26ba0f3b080155877497dcff89a2f2a770cb660e7e8cbf31c4a72fc4bc54a174dc5ca30dccbdae6b1b049802475458487ded53d13fb0193a248e445eedb61cd52944445476e728d3270c482a62d1d3cb2a1ee2885d27b836dce3b9ca8cdfeff2f73efbaca00d26f1a3d1da1b4941a5776d869b32b0591afaf02dbed3fdb37fa2a7d1c7783dbfa4953b9c406259b2f90c50eb44661f022ec989f6c23faf79492081caf3c4f390fde1ad92bd892112ddeb9ab0d08cbe35709ea29941082a30a7fbf199b4249582b7f70da283537870e050e0460dd83b8d93cb1349ee0e838de0eb04ce6c8fd314aec18ee79638e7777e24da88c2f03dc878a83472592c9e666677ee527f03e4fed3ddf49b77c979e28183c798845001f175fef388f5f166a76549730fc2639dc07af888750a828a3f48a178599722fa1c21d095dcc49c92da5e58d49bf63a42bc8c21865aa9c325b7fa2800238e1f2548a252d4ed40c95b3655c7dbe08178f2513ad5e8c1a925c9bf396fadbbeafcf58c22edb091ed680cb9f23ebd1ed724a37b520215414f0da78ccb99a2fd418494751492468961ba5004ba8efbdf04137e3796e4d45dd929ff6ff18a1f3099a89df583f00dbe7cbf96216313e143a07f7862757ad4c2b610d7c52a37af2f599bb0dcdfa9dd639b4024d8ce6866afc462069f784415834663713767127fd79281d0ffcbe6ce0035693be214bceb0a128ee5d86358c9f911007df889d500c6b07dc1c36a9ea79b275197796bf956e630bd1700ca4460e7f495e43571c61a8759fa1e914f47adabe8b4d5dbc6e3c1ef230ed678fed8fae807d0030e00f0b121c81274007bc0c87148301d5c831780a16384fc639866ca3355e5aed1cbf09500b9ea4c576e8f0ae529e41da18562684a792c90a11afbeda1fe396484db2f020db73fc9f7b929fde4060d434e50e238cb846dc270b5200e32bd71a8abc10035f95bfd8f2801d1a062c55aa06292d75c3dfcbcabd64ff78c0a0d0d6b0d5b4790e47c5ae72c6500d3f53e179108a68a9babc21b486f18517429b4f6c5924eb63f8db0842dbd4e019bac30dd4444574fd8db865d9bb0a3c9c7e7450eb0ef2cc12fb53986fc0ec23f5c31a1ad88badda2ca7600ffc22456e4d7742d7e4a39de7619235574a496a1df428ad23b77be88dad95012f6a58c80dc92276e224900edf1b11b49810819bb13ba0043d4902dc77d0b14598c780254409e09207b1124faa87ca61d5e8b0b5e1e5139cd407278c6a9f304d41e3dfb691ba10c29ac20aeba1dd666a029fab2d329ea68ad3dc9886faca4b41477a365ef0fdc0130edc76b04e3f0162c2d394a5f4d4d5d37284ff0fd06c80df8c60748593bbecba1582735f1283c62f89bb8b9df7956c162edbf950eedc5b1f413bf16ee299c174787ba50dbe5655a6cb18c895188469f7082f32b3e9cc079306b3ae93e14dc545167fd4b86141699e6499ba84de077867d4c1e0e3c85553ed57219a1fefdd63d3ec7e64cdff08782f28e57d0121f0213f3a21048dbbe7c31f781e578c0173f1bf5ab557a948d11c2e3a1632f1705072056633261eb850adb3f76d72b453beca4c8c367a8ca305631a3786c408c57f9909462023b4fe4f2a444ae2ab56ad55637345cbdf068896f567e97e2efb221850e52f95c371a4ef321002e9779b76bfdc3678531440fa62110e15fbbcb2a393822e23079d4681a0a34ed5a9f12f42271bda6818667ce3f768c0d114058e8f457fba2bf6c10b908f07c1bc35926bf3a66a3c79a87fb78f940ed8fc20a3410fc87cd14dfb166fd2dc770e9c695cb69e7613af523c6d55dbfaeb4a5311bd7c58f4f4e6c8aa6a6f2d1574c44d32b578576367a9d3f39082f01ed27499dfbc0c8fb481206187511da27eb64c73eaed1592d734e40ee6b302175a10ff3763be43b0b03758b1bbd073394910c2534d29cf782dbc8961da0418820f5edb4d358d4cbc3be9866da4d33f3832cd2fd5b5343e2004cd449ae2475a51d224548109d445376a997ecc361879b019e6808320e3c6fb94b659d841375abe2fb873a71b28162b25f7396ee91a0db83346f99434da5f695fd3c85f1426358500937cde6d4e58ee9b6f453b7b7a37366aa040822e84aaed9297d8d048708d5ebf30927aef3bff5bf687962dcc49cb2ecd844552bcc6fc66e0579d7f811167248c535fb082c09dd47cdf327a8fb112d483ce3622e4b5badd9a04be46e1ddf087b4cb9b9d605d3d72fb4d4e478e7302bde19a2234ef52058092200186844ab6adb192fd1070788ed29180641b578542848f023353475bef8e5967af75d79d71d60bbdcbe8308dfba11849c964ed98439efffc992c8c014aeaed0cf5e480627b134137183aa67ca62aef78e0fb11b77e066adc2489074443a2283b096cff1bd5c6b794417df2c3d9a76e7c3434713b834c351b4a0f1077ce3fb5488c4ce421406933c8a6741ce4f059382f25c8101053f9108376f8fc0e9fea589cb452127fd028013eb5d7d27963e379d3a93486fdb9a5c18fe906bbccce524d253b81e26c275680140ca1d171adb171cb7a24f972c1b5c6cc13ed29c7bddb3660f247f83143d8eddd1273401c3145d54ecabc8b96d1e0d7fb3dbc43e7f44dec7a6c1a63076ca9c500db7cfc2c34357c84fb35ece50cadb53967f40f437039723bf4ec868a95074358086269ba38a8ec303560bddfa101daa8845e1bdca2fd5dd0eacd8acae4aa4bb81fc0afba9b07a15714cbcf075a8096e3c652a60e003bebf790339da6a49770e05a5a9d1821773a9d3d4be399d1b7d891b724a3ffd0671f5d4cb986cda11ba8b091e040f667fe41a7cca3d62f5181f2c55d1d52e9a9b5bd28da9f773b74bd46546b57bcda65e5d82badb919aa845fdb6938f505f9256043ec87e49b60ddbb7ec708e262d270a7b81c09f3ec18672434d269aacc430b7823bcba6514a19ce497da0cc9d1d929772ec67a6a6275447afd5c1fb2a62b0c70ebc61bc849f90bf6dec8f13fefa04fe491137a0224a71c45d8e271f2f90f9758ecbff139b5a73d21469fac52683d4eb405f5d835b83f7c12a4fe61a6f34bcf7e0d9d7ac9487042242fc430ac43e8e9835543197cde936c1a307af46162ebc9c0d9f2ebe417e17fff359de6b5f9ec70f77db539043ea15ff431d7befc4dfbbccd05da56164ff3ce105136d16c4a5eb7e392cd7859503a0b1f4740ae49b04c28fbd02bf030f8b23ec8c29d69094f36f64abb7eb2796838ae3d6e378046740befc2d1138a1df23f729c7fcad1f43fdf7f1986ed043e94672def7fb573ae56a11bffdb002dbaf55a09f30fddfa0e3afeb8aebc3a89efa1dc1fe9212d92f2df7d2c8523475524cd1ffd5d8e7af46c4b538df75e83fd1418009cc0230cb9f7c171721afbacb91ff13f4d4ccfde782fb17fee36ae9df9557ccb5accde3a74c395f7a874324e92f7151da105ed1bfa6ac93cf6fa48621e1da343638c1571c973390b5346f4ee0a7af7ee074aba75772031bd563e7eeb43d56ebd764c64d6adc6ed9f26a5f99b23a56b96d57a557e2c6ca8da121dad41be74f05003f000ca212f0a701e4c17999b0d002b14e1a795c6a1e60d97f448c17e595c94db86d5348f1b1fa3afc5fadd9806e6540dbb2616ce83d5aff662f0c59e780678044ce6db434090660022d692b2dbaadd65ca38e1be16c6f52a02fc5c0fb1b4e0349415e786421686f0f2bcc77e0da01a98d7462c37b0f0ee8b8dce77a4ffe07f72aa0aa65777813678cb2008acda9b103492fcd6eef2ad7cb2e81bf08a98e9f73ea7df8a1ba2772c6db38c3e38bea0af2c3ed2b102f18d7d74ecd0fa9975b2036ad92bbb8fb374e882a3469d8aed2db909c979c23bc28e3a1c736fc814440cf91cbdbf96b72cfe6b2628a2ebdfc21f9b2048830763c5627a2282349014dafdc1bdb2ff0ea9ec6e6a36cf3ccc466de01b151692335f8c7e5eed42e044794c1b8776a2e47d4fc9e54511af58d4d99c5417f4befc604e18bc74f813e7e4b7b027d5c36f79cfb214e148b22af7ac613b7578945105a232714f41518a2aa23197805b24af23c3598432e67015d45dfec170b2fb29b46d0712679772706c8206e3a9bb7faf540e36c6d3dfd8c7a7901c4da8aeb1522c647e9f1bd899fa5f7f72e7e959edfbb127b8bbd56efd2ebf7163f4bafef49fc2cbdbe37f1abf4fadec4efd2e37b133f4befef5dfc2a3d3f467febf3a171e22d039a8de7c76877c821cee5a4145f995ae20f3333e2874e7dc9e25429f5a589d3a5c497264e96d25fba38554a7ee9e24429f9258a93a5d49710a794525f429c544a7c69715229fda5c5c9a5a4f3917093e8d42aa994fc52624f77c76b1b4f53443431f3d9b94aca54672033141a1d131cc9e7c752c64aecf481a3656000e57e829ef8f43ed9e774659ff93cf5c084dba06e8ac53f5abf45ce8ef9a294b9a580778a7751ec81fb0ea0c631d3cef43e59d6fdcb5ff101ac624b01ecefe2ee75ff460b0f2b4fe4cd354b1ed7e80fdf381b6b73e45ffd3c64900a03b8c55285ff45bffcbf965967b43dbdef347a761bf057ac06e6df6c13e12336cb84eb67738a3dcae2f4b2debfcca8043a3e123db094f57f9de70d5fe2177a330757d45bfc8559ec2305baeb4e9a541048cd361d002825bd92b71433b76f3586399d34be30a0e9c831f25a1243accb933ab989902d25d196726f27e4ef14d2e49b1618cdba753f978fd17fbf47a8d5570536df647b9eeb6a669480f06dcf1321472c057909e9095609531cb91811828c53f8b26232e5d0f08e1043423801c2b8cf9a0b7fde7d1177db5e6b328961fef1e4a5e05fbaf5fb10804600264104d165e23b666cb5e619420509ade4c572e39b832ad562f5b4c6207edc1d05841e4058000822206edca747a3e1f4e47f1627cd54fc41a40ffe70c40f517ce26fdb5226ff4c6ea9c0162b92e4b53cf961fa425b726a64a6e749201e2bf2d2ef6a61dc69a662cdcbc6b7266eb5550d87f686bbebf1626b2f0d69609cc6c5a7a47d18df2d56cfc0ccf64cba3b9d652a4169233706358d6f323c7cd694d4769369814a6d3205b84fba9afded68a6e2281b6d76997d81bd809da377a033a0b568263907d90b9f9ebc3a9ea76d4a130594bd2d735ac6f8949b169468c72656213e60131120da20ceb08940f005700bffb86eccd763c69f94a8d4873facff7d6c342a25e5ecafcd8e9c4031ccfbb04d1a92136fe9491ba14bc5dde1822009158a110e213f0cba00ec02eac4e8d8620d70772bbec572361f7ae0831e3e4cb1ed6ca4925483bf6c7fe454a204df30ff2e5d2c6b20d6f22bfe9086b2963149a4a1d4229de94d92a228d29926793453d1cb9824d219cb8719ec0c36db85e5c2929f292a4553926e9b43036b0386042c081893a2146c295af28df936a0491b63211e0afbfab2a048ab9808af64edd2bd6daef8751fb675e4fcf0676320c6aecffbe4bfe15eff0b06f54ce73d777f9eaf38a8785710c3be5699b1acb0b9d5fa63d68423a9aa2f2f2fef6564bad670bd31c8c222b5b862a068f8f4f2d32890a76b1ff64c264f7e76dbdc9d3a2ac59d7a65bc30ee3a1ecdbd5a6fe4496d3b3e36bead6e8401b86000490cc00003d819400b59f2c882812c0dc82294c5841e5ab0f500c5d6c31073d39e086f696d161afd4ca5383449b0a211db106726b256aa446259024b88c5c9153bae8cb9c2c49523ae50d9ae98caf0b0021ebaf040c5ddc1f14bcd8c7de4642235c9d3d6f3a4b698ca69050356442b3656865411a34a05aac0aa9488ea709795098f9c9f8ba8846d3bb358752d910943660c7519ba434f8698b468b0b5be709dffbe4a6ddf676adb12c26a838502561239b08208b9e1d3e4f12851f2f5eea0c40e403b105989594960d5ad5e581909222389a09f2011547da8be50fda0426daa0d680c10901010122a6c6ce1525bfd12ef1e6da738caa26b3f536d6dbdb48a24499f490584292d9882c594094c19c09416b6292ab83bca371d58a00307361d663a04400714dc67cd93a5292a5122c33a9267c6329ee12ded6a665cfa8d65a721a46d579254533f1450c2dd7351e9affde4c4b2b6f7e71f2bf307c90cffd4d76387c796c3981ca4709f5f447380e580c4478ccf0f3e353e22b8fbd4d4b50350931af820d64dc0df55b4ee19e3ee1e941a703a9c8f51d0e56d3de2487a197bf2a56ded91e23d45282fe6b5b408555fa41b2aa32a88a948573c6478ba5c9d8d27c7ad2cbfbe3c46763cb0ed74717752ddf8c25e23eb6abb63c533feb46de994d10181972e9ddb6afb4554fc2d966532b5be888a3a373e7f93828409be49a1495122803704b0c4260094006c4e6e6ca710b8cf1a39831c0549532cd310f6babf5344c5222aca6cce54da7af14b665a444557cead29fb2c6edaff16abebfdd32947a5f3885db022fbb72ba2abad29f85b2ceb2449bfc5b244fa3f39384f86f0be29498a328af461bfc5ea4a1f466318839ae2ffbad7d4d5fd7fe0de5d385ea2fa7f87b44b08f593ff2484fac9d9a1ae8c3fda6ddd0d89a31866a01f90ee8b75d79dbe629e8ed6aed2879d86d49c6a2449db0d8e40322c6e8c73f779d4347fb51d7d58ed75bf0e6fdaed113fe8b2dde933e61971d789636ddb9f9c2dd6df5affe464ac6399ceba934a927e724eaa1c1ebdafa5f9a4aa5dc5322caa726eead4d5c034fdf98a792eb6aad1a946926a6a34e2f176623876341a8ae1783fd3dc5d1b42014266750745badd34e34f676390b531a8f39b4cdd3e49524d491226629d72786c18e2d7a9a6569562b046c5564ded67bd9ee8f4d1a792f37aa2af5845c311a5cf17959234fcbcc69206177ed3bc3d99627b2265c36901dea9adf10ab66d151c2fee38b0290695b04adeb0e148c177c371f201f729b39d75f74193a935c3f7e68bede60237556e886c36743cc06667b331619b7c6cd38a6de6e9c236f7eb2e3fd85dec4979adc96451de6b242fb64e64a9e60679a3daa59fa51e298cf6ff3b526edb7552dbee2f5601d55c2e527ef1b495d62845a0f4f3f9611b090f771785690a2385d9485f4830d28f7f38031e3e677f3f4b30ee7ee96bf3179a218a4ffb3529e35eba588f4dc2b88bb689133aa6692ba6e9fe90aa629ab6b62647dc674d1c5b8dac06866d24c65d6ebb8dbcf81d793e4751dc47466aa01e7158bbf8ead0344183da98ecc144024c82605273c612142c912d91d3f33c4d63f3d7bf187c91f2d6549268bd5f44ebc55bc6346d4d5d7f5bcff3aade166b2903194df796a152a9bbd387d49e4eb56d4da6dab6326c318c71df62a0d5e89a2b062926d316c3911983bbaf36256336259b12292f254264923766122db624de4cb225719f720d1d09c6e726b9fc482330bcb1c100c65dd3c060c5dde7c51b0c37ee2f9009c7babda085bfc065c65eaa177e3ec435bf70c485307473c18bbb0b5636178efcdd5ac0a3052b7ce6977da70f09161b121812202440361672c0c2978d85edd363ddb034a5965edd5830b2ad30c6b682015698db0a43b623626629637943cd5f0c52f932fa60c9243d4fcefe9b6d47863892653b2205dc54806353810d15885021cba602005288637aded65894da4a4d137bd168bc4a018914a0a050070a052f28d00d859c0d0521d3ab5f2ff53c3b25bc275cb19df0e5842927c8b0715e7d2fe3104bca12e274d8381136196c0cd836d07dce4a3f992950c6dba6c4dd91f8b689b09910c6670d6be08317cb70ac7433e100e1a83f2ce587b675eda926cc143c9d622f9af7893484244924498abd686e85e3e9daf07ed85d1beefb2106b2afaf45d756fbfabab57cd13079591e79ae0d4f61ae614912d128d794c974aad195d49a86b56abb2ebf0c8320ce2574f1b995e091e05b093fee3e55258c4818e37e5fcc2fc3596e0abb81c2581b0947cc48f821c1c856848cbb4fd956c40bd7d98a2851248acf9d92b388119f44def03cbaf288e58737221b112ebe1191e2da5e0a7b7d4844885bf0b721633c63d236640a77f721436eb41da15e1b93db085f7c6e23c0dcdda6b58d70372179d4f095a7534a92bea094084e6c2260d944905b08666c2128600b01e5ee7345ba29a92dfd6df567517ebf81b0c40602121b08a2bbb37c03c1852d080fb62064dc27564d3967166f0b32c33683c63653806de6669b61b201e1c10684051b100a6c013cd88207220f96ec20053b0863075a7c8619976a14d47a86615297a457bfdb58d43b18511d1dd4e1ee33bf7dd9efc3a20ec0d081e89346431d4c9f9e2749ad323b9421f9fcac7c615157997c78e163093eb4f051f960f1c1c210233950230744e4c0861cf81e601c8b2c1a05ba14d6ca0f2bb23fffb279b5b1c8f264c903c1d1c77beda43c599a59d64c256c8fba3d7edc1dbfa8dc438f3ae6cd0d141b6a90f5f538430f2e17cf5e8f29ee7794add34935feb8c3499593712ce399f85b9f6ab078aa91a4d1be16d6d5fb3858e160e4ee53e380843cbc98f56554d72d0f983b38b6f2c8e1067af8a49ba2f40d6852de9e1be0b8d38c7df01883071e2ddc3b7870079849f5d07efdca5be2bddd41739f77dcbcee90d28e313eb51db4fa17d74b6928a91d3f52cacd06643c0c8e1503f90811d528f8421eae36004314b49236b82fe23a6a75bc51c711b38e1f7729651d45a42cd540043588d5408a2799e11bfb2c475cd316b6271d6fb8bbd3d1c5e910331d37920e9f9a0635a081171a48f1398a34304269342413e623c3656f32239764e47ed61c63e670cd01244799d95fd67cd896728091834ba924e518b9cf3d8a31faa2dcb2e8da4d0ebf43363310f3ae197499f2ff9b819438de7017b1e4e2eefe6129e3902b20a11f79e98b1806626430c67dceae0cbab80c3c9f524a9b5f3218f9fc2d618d1ec98be1d8c3dda7cee0de9f4cfcac71d7d168e8f315abee0c5710e357b73516bbdf63ee9cc0c0e70579bc405310a42e5b743f75ea44bc7944bc4fad9c171cd9b8c805634a5adb50667c5dc00117c0a6f77b1443fcf2f2cfbc1a9288f7c873419498a62375811b6426dd71234ca53b6ec05eb3dc9032358d02b511471b4cb431a50d222d18a3054fcc2c5eeda76c4da9984c940acd2cde7d2ab59f42a3401e9651d74b6516cfc32237486172d6ca8969da8a69ba4f15b43011ef5577eade55d39a0d30ee738d34d638c01a35a8710335a050238d3dd298220d21d228a1a1061a46a041e58c3dcef0c019de6fb1da7bd8f6a4de546a4d4589b3781777dd9b4c314d5bf2c3e30bd79da9414ba97dd8debabeec2df82e2d49545b793316c18749ba3b6fd3eae517c5b18b69dada54eb2fba1656644bff9fdc17e7af244a582d8123923844daf65da08e9cac1ea2544bd5c3a34a491e84745a3daa202019a4929ac234cf193767187110b3208a8d05567c7a5ed65941172b50c00aa0a820062a48420556dc41d1beae255dfa1247a98bae85615d036bd933cdb0a69fa58e9cdb4ad1c6f47d9775e14d7b8dc7e860cc14635cb36874c9daa535593c0fcb48e6a7adff8aeeb6b2e612f18f9929a8b948ff1fec6549deffe7499dffaf03e9ffd7d1074feff35f872ad2e1a6ddbe6f32d5ad3b519bf186fb7c1936c34bb69b19a2194366b8e7796578e1eed38bddad8c23dc67195e19a33c7e1b196fb8cf0a6e7cc9b064742103e6ee43648c4032dc513086bb04412c6e28c8010531a0a088bbcfd2c5b7eae0bc4f40c609c09c80cb0956ee38af4c808609b230c1024c10c5adb634a8fab54d5335174a8c04c47c6268c4c03046196348600cd07dd65c9ae9487a35341a8e823c0982549a3c1a9578df4d8c3ac4808018a31834b84fbce5ec551d8dd27a4a104709b62881ac044125a0c17d7a35b14b3d598add0f0385b180309408c30630e400230a30b48021058c2093e4d538f9ffa89ce0f8bdab35f1ae514f96a8ab466f8d02e9afd1ee3375918004563c4b0f240c9b61e9416e0ad32181bbd740abe936826d045dee5f3c821f9f35e3efa3ad111cf1306f6c61c280205e85f1dc671df10bef170d7333c3382a25821288407477ab45b0e3a7534e08aa84004a088280200d1074c178d422f1963790bc9ad1d768a7ad873726fae28e2f66f04502be28fae2850fb0e0035ca6ec0690943fe5010e7800090f38e9400c3a80800e801d40210c2f32e085e7054f177574e1812ebe8b2965a62737bed7ea1249ffc3f6f67e6399942359db165fd7d6e3e76d47280e3ce1828e8d8b34b878820b22b8a0618b3cb680628b1ff74941a9292c7b1517dd0fb7e61dda800a3640810dfcb081d406783450c714aab92d898bae4d06cac800101990a2450db4d862d3c28b163e5a90d00506280670b2e0411661b288228b22b2b0c9a2042cd8c0e2092c80786191c386050a8b195c4b21215984413983141a0579d2845f26da2069f2b42e4d9ab1fd7013dce465608d8634329c5f5633ad97ee52bd94f4a5ae47659d936a1a694958347da9098258d7e8d55fa320dd56a42f49d294e7545345f7f41b139140bc1a9d622f4ce584d217db8d896af45e4bb776d1afd12bc8f8e87385177ec515148357480bc8c0025eaa0560f4520c4a10d4b18005bc02637c66fc15d0c27dde0a1c51012b15188159e309182e4fc04830ee9b1563dcdd0a2e567817db6b813c49a2b32aca5411a68a217615611547660d5cc9592b6d6d5450a1822649fb6b5444a1c288cf2fca1487bf4d41b729bab8bb8f10d136c536450a45b685c30f4f14d0626e5b7b2840650265e404b6d82690659b409509047177d7a6a4224bc550024748408a0484b86b5dfb299ed474444d9db1ce1730eefe45fcd24204c2f03b7e1426f1871fa45a7e04ba08c8e03e5938fc10022d081c810011293820454c8a1c296ca270230a2ea2784551c40d282e80b7a6214d4fd3d43b7e19cb1bbc7abf7443e7fa70e9865b32bd2ea2e027494dae6db23f4b52beb896711528ae408183b6746479af2d159abdca8be195485fa79cdffadcf13bf15cfc7a6d697ec287278eb838e64a472d156f49fb6a5772d677220f27beb84f27aa7539a1f252c67d8a34f4aa8834d418f67afdcdbc84719f1a0475a48e17d0ddcb42c2e2f9782935b186cf6a5f76b6bd706fa28b7b13b0ad8995cf266edc9b7840085cdb8d41ad530f00e2800e38e01db09af5f3883d99df45731b004503524ce880892e9860620a03ca30c00d0618b13120ca12702c115e3b93d5ba1eb6290529698f20d62efab09ddff364a9a6562f1dbd18e2574842a54aae51bbeae76a77e4ac7919ed479182f96598563b865603d530287ead192d41b4449459ba56de25dc595dd6e8a245179a7b1729ee5b1723eeee3a0bd063011398b40682138b349f1fd63ad58c360590ee48001509602201400930e2c98b71a51ef57a3cfd79e5e5f1f5faa6484af0a1440d9490428950092449d4200909240173dffb7a9e1cd16e4a24aa40a222e1e4883d8e38836e9df1acca7cdd15b58250a1a520d011428cc8c3080f18f18311da086ac49022ce28e28a228a28022c02a88822449421220d77b7c9999e9e7b14af3de5cc97611795321cbb707c4f96a65733aa19c993499e4c1fd631c9a95b4128995f0f825d47f3a63d1143cc2c583c224e43d860882fee53d3d0bc7da61eafddb321c46d8813de0e30c6c61bc45be23df3f6883b6fbffe5efc923a6c0710e2536b1034001406e062009c02c4a0005edce7e8d29f1f168297be6a451783e0f8e1dc2a00e805f8e152c6dde90a082575b868e13eb9885c7e02d5eeb46614d69a5b36a3340a04165dfa616a660a7b51d8d591f3ebf8ba16687e76c6ec57fa51c6422aea22eb12c71a78b138bafe35ce2f2affe230c41a7fd6677a1ebe413e291f49613be395bc4f85024d6d37961395daa46a69483530d3301c5972d68cac6bf46e3c4cd29ebcdabe286be0eb4c3128294b4e4d67fa087242a288fb0c08ee2e6426487d2d727e16af48820049b492c8719726b969ed63333340f66b9a110e3e33826fee3f4e47d0fc46a45b87766b7b8f08c33dc98f1f21b8fb0fda4d15235ce034c8c217cde65a3d7a3cee40c6d0ff3e40bfc5b27aee10ea71be43ee40c400520277df198b0fbae8cb82a2a8338bc8d26432bdeb5dd455041367e93c5dd465533322c201ee19f3a8ba8e8828ae453a6379acfaf8bb29a18d5535e54a3dac05e2af436871dadf19abbe48672cccb3b1ea8b32a58271eb2be6d958b56b1abf28de9fbf9a89b5c4a44d47727e0d5739b548672b8941968d8de6d286bbcb1d558fec44edf39b13c20ef71aa8f374e24466636363e3c489aceb8418c19d3821c2ad975be31fed53e399bd0fc6ad8d555bb0aafec62a1d5963f45ad064f269d5affff5da977ea15a85583b40f55142fbb7c654b61e51f567b8de1e2e081570fe2b74838f4269fa2817adf7455a8f16a292e280e0c1dde7a5e3b59a02cd8b2da9de4f12a319254d7f2d2843bc37de9113e7df9247b9bfa846475c636194bc2f62534cdb2cef0ccb2cb1eeac87f36f914d9a240912eab922d4d3d2e911ca41f6ecd099379248208090f5250e27090410b26684f36fe9b49dfff99b3f2ae9d938a92100384e6c4070143df9cf9273c432aa3f5c2f89b2f4c535f062cff368ded7d324fd7df82bcd1bbf76e4f43c1ea4e77932082925a99a4c9294135a184ba440384829e50f524a39e7b677dc45f408dc270d8d3455db91f4f7596698731a0777a9235f3ad244abe8d80b53915c00a1e530dc5dd29e02c1b9cbbecf6598eb2e1cafc401072d5a703c5cc0ddb568c05dc35ebf43fc9aae11b66d918d8d498b7bc3e416e50da6991c2da2a3505a6870d9bc77443d36c62c1a442f62169ff8bbd6644a6910a43cb54b81306e71d806ee3e61dbce2808d2aed3746aea1a754d042b0e1d48937b87eb3c6dfe5af0a66a2f5af4547ef4dcb48f82e364cce109ed08c9f02477862b9030808091248623eed6b9507aed631d485fb80af72b5c010ce0c02deeeea404d2fab14cc31752c54ce0eef30ed520fd38ff958b553c17abf60bb7704bd7ffd78bac0fa9eaf522cb873df683202be39c7b7c88407e91070429cf2a4a0d2cd6bc56cedaceafc4274a0d5a2b8952038b2589e6b52ed4a42fba69dd77fcd9fa2b8847736a131339eb6727cc7bfcdd2b3f2b6b46f235487de4f4709e8c9e7cb156c7dc929e27f538939f258d3cfd1ffef417c94afa65459c43475252910249efd4cac91f2ed1f08e9cbfc55a498457e077adbc3667929cd38bbd5872d6d04d6b3892728a14688f2248a5d472a252224c2024003282fa5ae40d304d61aa2c38cf8b1248709eccb39ce7e23c1e3c14e7ed783a2296354b46d264236b9648495a224d2296a4257224a54966c1f215bf4c4443782a709e10ef70d0b1e12e4d35235a1371def7bbbcaf35755dadb413e94c07e1b26c202bd48c6238085933aa26136a4e49fa41d24d51524a0c9b8d4ca6cf78b3806c5580c85283cf6ba56c559389eb818f1eea700f5fb4f045eb7e8080eba14b18202270f71fdc951e481f5cf9e2dc9522dc7d74ee8a09dc951f3e25155d228087c9647a590d82b48482735606e04444014777c7dff8d6df028236b647fc15bfbe888a9df85ae7e922a221fc9d0af1be14b6ea3a6972c20d6d41677f41c822882124120e271c640daddad1fe9e8a492807edefa94829e5901f24addaee8bea77b117cd545a0801898750c40d1c726690f7c1dc5510bb661092e2ee5ff1951bc04013ee8ec5b91d86706ea5878b0085bb5f716e8584eb3c451aeefb325cc7aef6fdc3ba7cc239391962324912d5ff2eeaaa1613994c43740eae23ab3e4ffeb12a9b8928eb5d74e7949331e832998674fb35bebaee7ead16d6599176a236993ef0b5c99453fbfe5da89c2e27e7bc8beee4bc8bba5eb82583d454e63479714d503576703538720679f76b1d0accfdbaa66ab2a84eaa9c5adeb747d34c57a3357cf46504732f8b2479728e5a708e060c9a23269dc91e394b350a7234523ce34defb85d231a2617f88b759804c164e43e335e52c6e7b54bbc58c2e5c7dd8f38b7c45b22dd3919c6b8bbad3280719f3288d2c5c97013c30c62f8f22e9a6d4d9ff16b05e762a039f859e489614584575c0c3523796d5735a7648c124e8914774ec9912464b8245e4c8c771259ebd402f984bbf33827ab70f2c8d614dc74dc816d3be360680306305e961e48d54a2f6318ac64e98184a507396118bd4006cb17c04c5da4b1ea05d1fd05293eb3a43adc0b3e8a2e78e102973be48215e75c1032c7fb32ae85304e755a08fd337e21c900122038243e4890702c9c806341042c589f55c3bc1f69f2bcd2f44ab37ec62faf34e5c37669165d4bdae9f1843a498269fa33caf951cba35e4fc4425d618c4f6db117979ac2b8153c77e75690f5081ed71ec13e442bee0817ee4814578153218f985301c6a94083bbcf1d6e9d82184a7709cea510012e05570a3278be186b59a3a93269c6150a23400174f7297b0b7bd1bdc151d74b497504b9133c70c2c79dc0c30922b8bb90731c171ce7e2b8211b07b88d00db68f3f93d484b78ac81d7ce68ee3e86454fa4e0c3b68ed107f5fea2af2fabbde87743b7be355047d6aa63c2053813669c09344654c01939c267d1b5f76b1d2b7eedfdae1bc91991c201800f773f9df448794e372e4dc5ee74b5a2dfb4dbb43b9d54392f0ad65c2590d1345c0962dcdd5b70ae842f25fc642ae697712518b1324ed3990e4702181268f3466acb91f083f34c6a2b391284b8bbd322607c16e1e2535baec8ca9d23528623228623d2457244a27044dc2737440b9fdc10988b1b32c2dc08643037c211ee3e2f3702370227640d9f9c900c84e30dc76b3b1142208215410a17020e4290820b010121d400c21d1c085eb6b654b4b7f56bfcd55c2f0e8414b8207a704120c005d9af310567e098490037f3dc8c140ec80e3820530059713f7ae05f4aba7407dbd8d5cddf623f46379eed1e77bf71eec715dc0f22b81f37f2f3a831fe409a7f53d0de917310701e05e704e07c73fed3871eee73eb94483ad25432e93ea2e8c3a33f58c10fb0f801961f04719f72beb46afa400a1f843e60c107427ae0450f3c1eaaadfe8b278fe7795ecd05eac8e979927af7c5a01e0809445643003032c017427c39e1871c7df4d1471f7d20014380db6092a1e12c4064b8e13181fb1031d5fd851d40a0f521e5841f67d45c01f801831c690c0164b309c08e0a39557e30b2a4893a1cc75d8cfb0f9b26503a5086cb093fc6b850c6fb132768bd808784931a5e645de168eb87f98bac2bbf28dadd81200d75ceddb7af0d2bedf26f8cb3fb0f18dc7770c28f29ee2038bacf1019992980fb0c97192174142b36588162a5062b34587962c57d86003856dc67807062e5f3ffb8cffcb0f3965a1ec11578836a3fc57d86e63e33bbc1a9fd141aa0ccc84677c7796243abb16ac77d660bd5bf430fbae81d8abd3095adff7d40fa28ac7aa18c455a4f05475c25057b6d1a6a0bf421558934b77a306ee97f9fa26b55340af420fe79d045710b74d99d5f76531bab4070f469dda13b34a3eff8b9cf642d5eadfb8ce83e8367aefbf7d97d2604633e5898151a523d4e59d5aeceffff83d4be6c1d7500b52d7a2a207dd90b7b7deb65ac9922dff60ed58ca6673f70fc5a7a7b9ebc1628f5ff713a88420709d0410f3e6bd2f4ffc971474e69f24ca68c759e45d776ff9ffe160a04edc79599c2c71a65508e336f4afa62ae8c123e7e30ebe39796fb5559af977531fa3393495f6c061d40f848006cdb2af54190f2fcc62a0d829487e70e7d110d539f57fb8542aad279dad8e0ec5102c79149bc47fc17e7dc53db16a4e30e334ce53745558c7378d0452d5dfdfb5c6c774de1efa6567453941e40e83bc3778a1e37ee2ede211ce091d23a2f2be2d67e160e2a502d5d812f7b2a226eedfb99ae8aae055d9685831cdca5c947b3eac658684685b83cb4707964b1e9ba1b08e1eea6fa795cd5bf010beefe81cfc2aa7a87eed0c6aa8d557848e1ee78004581e2799e24e517670d1427233a5da50fed5ed12850cd68ca1924ce138f7aa028719ed41a0d8bb3d63e5633fab0d4f6d2dac7469a92f0962fdd755d578323b582a00e1d78d0e808c39d96f2d3a1003a86707729e9c07408e93c4be18b6613be683abfcd99ba4ca6f045b382064ed000091a88fa2d499a24499a48d2c4d3d279dad89039c33d06198e642ce0d3894c66635ae739c71e73886123e798c2a5698ed21c22c851c6460e375c0fc901861c2a394ebbb431ceee59ccc0e51e7b3d8ce70607e7c98c0ad514edebb51b1c439d388ab8cf7cd53d46bf8ab6a1cd4bdb100e32e0d0020e2ddca5c9ddeb87ff79cca3d8e9b7258c6002189ef4f044999b376a70d20d4cbab43083155e8a78c10699174ca8c3072ef4a1b202050d004bbc840d048e338ed00085000050c3102e5394717717024510477ce00029eecee3e23450a66608148c3809028423940c400d3200d0a1c23d0a77772721dcd0c6102b77f7282db0838510be04600605a2d751c300013830900e6566e6dc600a80cd8c8263c38452030d38f3098e937963334ba4199ad4c830a261b244862431245192244912ae440d0ded860687860fd31d37401b52dc69376d8c7cf6b70d23ee2e818c71a9c8729f9150b8cfc0100bcaf93b7736dcfd9d63a30dfd35bfe6d8b0c2b151e2d8906cc0c0c6111688600d206c5aeede83736b18d179be5e06431f7df4a1460ed458c3dde5494a53695b17132fb8e03ed3021013841bab36c6423dee3348403ac3828efbcc0a1aabdc678e3cdd012286bba791858abbeb3446ee9e06911eb8a3f1061a5d8071778d8603d028c2ddf3c2fa3d20dd628aae759f516188dec1612685991f24f8d1811f64f80f152071ff31863b63747fc8131690e13a4f20626a2005a9fb0c0aee3327b8cf70339bd78c58b082fbce2f7b211efd1b67a0af96c5d29394f177b5ada2e9bcbfc5d6fa3b726a5067acffa523b914d0dca5497e323105347892ad2d955bd39c1964dcdd9a710117473360ee8e5d3a727e35438afe3e9b918297f186bbcb8cbf329c7009c31f69f3ecd7fbe01a3726d25fd01e8340ba593c1e160f8b246d0d9bd7ce1a9d519992b82853a92fb64372d63bdb96ce68d67a266b60af518f68f833514e4b67d4caa4ee6905a9f08f241abded2c6be9a279ac54d257164f7b58f2bed8f6c8a9c5d1dbb4c3e1844ad5fc2f9d5fac2f359524908edb56aa33b6d9feec330e6b974abd92738fb85a52160fa6e94f6de7ab8c478e72a9d287a152f28220cde23dec4579b4872548ce2039b52752a04fb6f22c6869a30e7d5999e9a6e4f41f48fc37260a7aa0af2b9ae9aa2b715f9491a6676d2cb24070f4694d396bf008d7fc35cb9a1982e4d48f6721051f0469a6229d22e7b5e27fcc93784b20c9da5895d21655f3cb82a677679ef7ae1afb9bc266b8a8366bc63c52a6dfd650727a1b87397bee0cd76b6772e2ef2d98e97bda93fb5a4bf317976aaed2f7611a89b768532b1d390707567e31078a7021c6b978400d4f74d75363970a7d48595562970a8d39631ea1bf78b5b12a452292d7d2eacd79e3d2343a76697ebd0c037184216ed5af55a7e2f081ea6f5b7b3638ea9f0a823aabfaaa9baa51f0515f26ba291c3e106ed52ad55855bfde9ed1270755bb230baa2f521e9edb737b7628959bcad407e396a6ab9bd2d9fa4c10a4af1781e4f4bc9dff45bd1a25f58edfcba6262a713519e9787266fa49ac65b62f9bfd95bb560ac35fcfe7557ed9ab86ac00e4062f05707f197669557dbdb525aa7768e3155669fa93ff1659d6c41b9522e9d2e7959cb54b5d13262791d4f745fc59041387bb83d980bb7602eedd2980f3f2837bb66206dba2152ab8bb7ed255fab08d45ae0a37aa4003a42f6432d92033998a64baf6b1dac7aaf071d738afdf7e18a76aea591c151af88f6a2ab0bb3b719f31c10413a6f0c27d7a92ce1899193245760dbec481bdb0d8f32eba33c3330000c0d497e65187f419f320a71e376dd264c63086c9af35972ca18241af47ba92592a55c5537f4816e7bed0bafc3324cc14f1595f0bde5f58707769fae10e040261660a3043c44f709f19b269104e580181e9ee52e789bf6b4da6ae3399b4c994a78dc9d475ddd638ecf2ee6aa55da50ffb8a5f312ce26debff77fbda3008d16f4cf479f5c9562088c5ee37967d15bb5aa983d0a48654fbd888f36286cb4d6b1fd379d67c546f89bd785009e5e00386f9a0b369e313fd151b6cb03e4457ac95980f424f5a5b563afcc03e18058af558a901c30d9b36739aa8080d8de4aca9a07c4f5c3a154a0f0ad6eac9415c0d551982bdec953c24647f0847545509c013169496161eac3879853b40a901a7a4f3c30af3ef9a2bf580341e401fb04309a6e90fce7f2508f7991184cc8830138207e9e2419ee01ad00327176b1fbaaff935aada9dfad5ee54bbd380d07d05529ead4794fe1805aa3e77a8da9d9e8d55334c05e356b53b4576070469c8c2b88562a2cb165bfbec8cc276675d5db5ae8e0176780b04294faf7da8a4b456e3a47488440400000001831000202820168ac50312a95838adf60314800158ae9c5cdd942cd2e324a89041c61823020000000008800003af913d84f9d9a567deb3e05ae619f4edfae888f53404a608dcf6c3cfeb2fe4eecd7a65ef561248cf03e263b6e58187bfacacbd28d1373364d81095862a8cbd60b68ecbe169373313863227f59fbb52ef6b7af025e6e7bf73e5a07b8cb3f74dd3174da774f5ce04bfeeba41a01fe8d565c0dbd0b6d2958c3a34097fc456a9117eba3605818435ef89a50c1d3a470de84a0828190f0117bfa63a70f1ec98a7b1377affc0233c86dd16c3e0ed837d1b368ac623f625eebf4fc8c420050418e3f05faef802f4fefbe23c1bd6bec435992c6e0f86ea5d3feb467223d2f36113a543b329dbaa1ff6b62a31b6d95acd41fd1f603164826364700f146ffb3c625c517f410bdd38e8b5aa776ba68f778ad20b3aea5c6461405b7bf0bc23eee4a8d3b15a1fd865a9603a4338e213947433bd8e15de8489cb05f6d68b3b5b66f7691eeed9870d01b8a856fa9966239086ca48cd6644b4ca0f2aca62a5ed2767a4890d352ab5ddbbee57a945f427180306d0ac42582a95b9d10e637fa144e21a74744e1d657c41dcf4913b82e7b6733bafcd37c2028543354062001f21b420223e68a464da7be868e042feebb01a1943f58e68ee6a144fe71c469c10e1b8727c34917ca6f0066a2d25d75546297f5531d2e43c2d8a0742779196bfbfdd2b2110f0041b420705b9f3c293709f41044a87773cc1602dc98d82c400ac9cb73fe67f81e33b27a36de47412242e315c91755f549efeda00bd990bd7c2538d0f3dc909dfc835ef5d8066c0287d16af9c2beda3eea4c3a802f075d9f63d7f2d84038ed2a8089a84154db253c354d9313775d85957d7a28fd5acea52201288894d8ee2515a3e7ad1552cb229bc56256156e7be4e7190a3faf620cbbef9ebeeafd7a1a6a51961ffd780bb3f239bab24cc9fb6325506227879c1f122d9bab382b95b3e450ce92b6a4c985291e084eb103bcdb53b68c0b4c3c678c5b62961a9c621233bdff27ee09f3c7a32f3f1119d203ef115bcae7ef14bd40c810d9b73b89f6cbdc0ea0f5d027b41a8490d1d40ead78d424622ebbf0a85d5d1606a2e94351cf41e5daab59f7bfb9da6f1622e220b316d32901daeba012321c9a88c4ffc49ee26fc8283eb2e583a435f05a79009018a113e2f9ee0e4699d3545f6f57a37d690f8a91652dcf71d4038a879939633672890c0224daf99e187af0d66c2d8046002d707485955a0e57bf71a7362060de1ad8f1919c0fc6a64a9e5d7ee554a0644ce38cd75bb606f34580fa160911da25535c62f2c45e6d7bb99a4f1281717b4726e3e76e3dd90b22c91754fb33deff476e778a658b1e87875de42240c8ca2a33bf87f26012bd2d87c55612d55e6830ecd7037ca39f0f84b944e3079d0f9d3d379ca302d41a6a8489ebcfeccb0258e29d01c3d38dc885706de2b9dda42c75a7b34cb0c5b5cd7e7ed477b5aef36cf65c1ba4232f911159e40facc805b9a5e05ae91b6368908adf7e0a210add29d41cb227d00dbf7de309ef7f1c907e0e08a780340dda7f3cfc0da09edea94f7c21ac7ff84b53ed738cddc2f70817446abf420610025be0e5aedf1c5263633d3ec8530f89c4c7b4866fce0c27285a76c0c00fabf5eec936eaba9f704e9761971a3252d845900a585e8aabf5af0bf145b8020a2ec9173a0a65d5c589ff1cb74be47773e6575a861de248fa922847d0a4ca9ac40da44a37aae3548e332b7abe292883358ed1c0c4263c129085945cb10820f35c6c4cb44422a4a8129a98a60f8936fd444c31f10f62245c2e9689317d484ca3298ba44cb24c1bfc67d6e2e2ec96bca433f6a780dab376d2c4f19f5cb98012353c548c65d5cec2ebc31b25cdf5e9e068bc50e71ef3a9ce51eea46c777591c88e8105f763fdd923544196ef356a955d121ff7e9af315c30e624874ba7f6036b51c6bc59cb1c3f22c23798f97887069c83b6c30239b80edb4c732133b086e7bdd183fe9b3038eec79beb9bca005249a68b1c07a81f0c27aa26ce10fe9bd2aa9234ca6e8d11980eb189aa8a994436ca885bd7d676abaaa0e4fd6675c94e3ef7b4cc356da3d5e4bf79b3d6bf7d597e7bbf95bc0fddea1deca7634853171af8e0993111143d173ea7705dbf3014d0a522bd73429a51357431927598fc2fc04f76adedd4bc49cf71d0ca948e01167415d50a30f60cf51e1326839f8be8b60fc5f6230bf3101f4c1f9e043d92e1837b58ae622acd46dce096bdb331b7404f8319d44a1dccc7de82bbd27e8774c8a4ffc730d52cbe9be6cb6f73b083156bd6c78cd77afad9b820f93a8da7d669880af63a93cf9bff411232f8b897f627f5a087a28a91d4ff6e35943fe471557b9bab232f39e8c47aae5679f795e2905bab395162e864d84fa75d725264b67714d72cca213cb967b306405a71192d397baf85b68ed376d3481d7a210d782c991fd8f1fbb5e194d0e1777aa576cc40b6934f21b67609b3fc7a8b4145f3c21969f1427bc84703130df1f695714e11a0e5d115bf4dcd3b142e6966fff0d101aa2a0316f487c05b50c1b59340376e33077dc3f8c458f87b338807fe851def1709c6cbd6e5d2e678466ac184c0b994361bea38f3f7372d729fcdb335a90846786ca2c3191f0585f820c31aa43b66ed299fa1ac9398fb797b90a5ed454e4960cd0996827baf0f3f9793dfabeb55c150e7b16dd18bed598fdc1aeb2b40ef9141cf4da0188b1331978102226e89301f47bb8b4293ad3fa176be420c00aab608d1b1515235e78022418f057d90dbd945e88d4111d1b71f96b47dc23abb0f79af4c39b221b4dcee8c312cd2b1f26082d941b3294b2994d1a10fb721d2ce0433ba4dceb430c24323272ccdda46b2ea891c26c375d9c46be6bf42f5ec50f99851fc0330098012009200180f800a481188f6480f38509d57b8c48ab8a29fb3e7aab31e9e2bbd7f07df77d69088321f49646adc6c114b54c2c0e6c45f4fbc7d9c3791a0eedd28abc9b6f8050e62d092c0d0ecaf8801f949abc147fbe10bd20b450b82dc7bf74dba44ff45b4ca90a8d1690156d618b0dc591354cbb16a0e217bbceaf3b309aebecb27431b88eb7db5c659748d7c1f5bf9dccf5b0fdd26570f1bb60ae9bed952e01d7dff59b9dd815e93ab8fc2e3617d865e92ab8e45d37d7d945d2f53088ffae9b0dcccc75bc69ece4d18e4f54611165eba294ace7c337fe86b6abe24a2504ffa910fa2a88ffd7fb29b80cce21f29fa234469d452dbad88e7d50f85347efd8129813dc9db62acfb072eab7b0d1f9044dd8da07f6557e12df58ebe932a5dbae0f1db213880fd939722f8e7ccc15de8fe0e5096264c26ceb2d401a2a92b27586498c6e89c1b6d4f91572fe4dfb17c906615b79b760c47548d09b735e84f306158b07e50bcc27f2eb8dd0e563df8e8bb2eb26eaac5f36b0232d7f86e42e86e387f559cbf67fdf1defb7ca9f8d6c115fece74b5f74828ccbfdaae0bc24cdbe5c3dbd828de209bb3a4cf2944afe175930c5ed010d9dd2166716e14426530c2f1b37ab31438a6d32d1fe8591e22360d1898d2008f419799eeb567e59e5c3f18fb9b1b0c268d67fd2bc1da6ce2718664e4b7c3c8716f0ed710827792b5fca6fba536d51bc85cbf5fac71d3460024a18db34e973db52c8d1a6dd68cd52a65c07e66942bdab13a0a5e2d4536db217e7d5f3de084424236191cd3adcdf54d93ed5ad71b165b379ae2be9173bcf5ac3b393d3b10dd1df5e34932be33748af0a57a3a551949c977b8adbe0f7935866287a1dd4cbb77b76a2de5f22cb4b5ed935f13cb12de0389b2e0490657bebbec9ba6398b8ad7c3ab7c69f2db59ada10c175550769d43503e96cf1163860107526c0dc4edb1ced942aebf381acd653bb1dc35df682e5696c341bf0726bf8e368cd7a438c405881eb63309a454e7fdbdef0a9321663fc3865976dca7ed50213f51d16e5a390a6a72712c4a4c30e0b8a90b77258252e1f2e1038108be13d53e582d3f014e574ae3d0d524b1a7cbc57a12bf6b94a0e788437eb36800e8d354c018cab20aa762bdb6a30e4168f86336fa844883ccaa76e90be5eed36f8a1e4a93764896d8a8b60c790a7ae8edfd2d00db7fdefcdec40c00ab09e6eaac31c43db8e3f7ad8e729cfbdc273e281e77cefdff2656ce7df31a1faac22498af5c3a6375a304d73ed4c8f80d222ca12afa40eb15be260604dff19268d5c0cd7d031021fb19c50e92bdad103ace337b83721d9a62b892f245095d9ce96bbd8a33520682916607593706f6651a91483a2b324987aa75c325fb8317edb45d77ad1020272bd5e70fd8d227ae1b272bc2727b38ec3806f85c24feb49c217cb40c718665a19cf1a52924bcb7cc7409bb7ac4aeea2c24cddeced77363684e496e223247f8f16c0bd66673c72af84acb37888ec0fd769d8bb59fe90227b328a9c0777a9e4eb2666eb63c98075929053e654f01a8bebc907354141a1b7859b0147270eb6e7c0484c20736c5d2be97cbd6a04905ca47a97cd0b6ef8edf464c35f48cac7c130353a06fd54dc8fef3184bf675311da075959a3d377fc904b084661a3ed871ab3d98ba7c38ab4b8237218519192c8c6f13b92b262cec6f599a2389376cf99661d69eb116d0825a5d8e669c64154a226691a25150adf919aa7b8367e330fb3d1250a2865e3217512de0c18044a0d031db8363ff379b2528c905788c10cecf9ec440b768a3bbb8a130f3933694d164bc00805355c63a578c770257b9f9f10ecc2c2f89077b42c7d15f897a9b1d2f641e5e2d817907cdcadf1b7a50eac03452e845293f96e58a9d83ce2317c23ba8cbbb88d40828f89c95034f07839c11939aea71793a63cbfde48c7dfde8abfc8cca68514a54e956410795ded68325df8c7911b3ec56537ea2371679b5cabe65222cf3643b5d98adbd7c984f8af39e2e46a10422f5b78fc8b20edb87963a585139a980d24d3f826b961d3d3a0820e734b5381f42a244ff4168e474eb243dbd803fdbb6cba5a0fda6f50aff8ccacb8e6a43d23d5a117939050d1777bc1c5cd3173f152872a28b7500cb2a3d64adcceeb1d719eaf31cfb098979024dae21e38857f82ed3145a0d12b59b6c8d43bbc31694456682650194d2a007ac53a5e656c82367e0457e84ac0b343b3d43161c4e25440d0f34b6c4910e68d70b9a86738b5f5d41ebc959a4d3c28d05ab3804bf91cdc5520c5efae9b23316b7429d13ff1c3e743bc28bde6d4373cd9bd01f6b97563baeed33b12e6401fc92209da4ab8a48e9791236c312b2adce12e640a7ef1c28ec94fbf44ca0577f5629de6153569d01c485aaef8e3587d0bae04948a2150d521fa3f695ffbe21ed8eb580ec8e3598a596866221190098883e8955044ba28b431c7c6803b1dbc12cb6688d71ef54a72d34376b11d0644de854a60fa3c5320184d75fa40b84295b05ee2a35f5d07936d3b4bbeb86cbf7a47ac4e76c2a53811627fd6658b8ddc62336b9375101ff2e974512bab313bb70eb3fb21c63a54a2bc70cc3fe8941714059c03221ea6cd8e47305fe4b541d4bcd460d85f471869d482859b7d1f6d60c27694f395bfb84b9f443cd368fa03df24d9290765ed36aa411852c8cb360e012b0c3a633373861e63b173f3dde4b3668fac1398e4f87d03844b5bdf91d3d781287121b621db8cd23542aac05739a7a227241aabd831613e79890da827352ebbf887f1e67cd4e1741f3f78b56e2cf3422573738944a29a163e34fa73d3f189109a062a312ca015fcb2ff177b0d323e208ca16c3986b72944fb1122ec5e32dd807625e8d449da53257b87b4021ba2fda1dd82916bc072ceec405c86395faf8b82a0a7dd0d010b77699c0531c9055c723b4a7623e5a5cb1f873995638b465e2983ee41d63c8555adb52a9c905af1ef40d4d7a54843b308b6a48dbb3dea3fa05e32f140042c4bcc2c0d8d961d98df1ef654d228966d368f66e26413f9b76fdaacced5ad78c75f4d23e497cb430c097b13c3eba1ae87a7aaa320e83b8f0c3281de30039b0638c25a0ec15579ee2a5f5ee8bc74e224648646374d24d5a4947589cdf04c66f03bf4129b8e46af3c7b9355e6356b91cb79dc5bc9a789f59a0b284c0d11d02989e53a61835153e4c375326f922628e4f293a6bcd30e8e2c617e19a4410c6711f3057e890e9eb7f293e2868ad9dc2ff1a95434a68123774148d16d109a4e53a3f071a7c34f4409cf9ce66a58e76d954410d636452fed63f0f6926f0c32e07835fee7a0fd1fc0e9c13f2afeda25bafc421c7051f066eb5e1bc64bf6d8cb08a0cfdaa738c0d4f36064e91219c0b0d6dd724ee8addc7315144ba048eb8b1fde2494aa1917d1f648a0e084a48058602f9af1700c548f4431c8396ab8fc4fe6feb0dc283d3bc9ef320f8cfeba03608fd86bec55e32c6e08677870bb7f878c1f8176fc3873f80dd90fb1e0df86c4b42f4572732a3e6dcfa1bf4fd7ab196de98a05926d8f5fb1685141b200185afd6ea7ddd3b5921c9147796da0f1a05971a46ccd60bc528c7e11d56716c85f7787d3c3fed29756350654764198970e58bc68247a13d67709b63059de021b9b8997f9125d9e899e83e878c7fa3c28966142195d3b56e862672ede0cf52d3f28bd517706654430c384de8b43633b99e977283c9284825116b934eea66862cc2cfa6c1ea9c3595992b9e95749c3a3cf64f9f880ad022f322ab29d81433ad1b12c022ac7344cb6e93d6f2a98a6db7e541d5691e576ce72819998ad7c7728be522cb5608ca39bb0250dd06e6ac9c2400470a8715c8c9fa1be0c749bbb6bc33699e7732e97128194d450046d27f6f0f76aadd7016e93615c9fe740e0cf1a45f3bcaf7bc9ce7c474a5a47fea3e8e214029fad516676b3c401d98d299473ac595eeccccca18132552d2a4c5532e2998d042e12922c5bc16bd380a538b53a631e466c1490384e1d3609c092ec8f5965595d0796269fd8a95a7fa9a52d464dccf89426a1ca1a4cd34d87ff2b8b3593072199975552bab951edbf282fe852a4eef48ad3a28212515ed2a7c489166a624552439bee80b700d914cdcad42857cc1412f740463bb9bd773b49593a6288e47b5c3419cfa4be70669541c1fb4269542fbc8e1bd5213adb31314540c48e840ffa42ae9484638fe3a4b535855223862a5dca8cab4551967553b9593e9f45f8bc49dd6686f1c79149e0dbcf2ec06446a06d43148455456978168d91e5117b6e66fb5f9a956025f8b33af7783e381945c5f930b6ede9c3e0be753cbcaf24cd02ef95c419fd10c380713053ee014bcf3aa6ce8215f3bec0118f374aaf61a6b659f8ce07613418d5be8f7026358d90755e9a2f5520e61ef3d2e4a4ab3a41737c3042e76820ca0109982d2703cf746b6c0f68a32bd1804d92dd93165d1f7e46cdce50d608141696a87f334dab03136540b90248e4e68dd3d9d56fb0df79030cef0255537ede7304150b36375d8e5b9327b7be7ea6b7424fe8faaa6033ebac1de4186989f10b09b64a3474238fccaa98e53889bf25a0c361c5fda992d2e6d756c2163e6c2587e8c50dcd5215803744829e4d3594c8f39fa7f1599b3856378214a519d56f6425dd5dc2bc4eac24878181f7d4da8e4dae38a0992f760b693274c361b088e524e7db9a186fcc072242bfb77191f88cdd42974644dd352ec693a70ea262c49a1e3be2a7ab5ade383aec09bc4d286aa05995bb724f1977bcb8006318359d4e37d674181503c921c97775c6b7f92520688e6e54023a6773b9f5e4336f01f0ef255c0b33ee996c543a53bf07493403de2fad2019194ec2924e02b7e5a0f8106d4fdf022f22cebb1dab91c14e8de2205d7e6dfc5807b1429d66190485a796864e6cd21900ee2c952c7723889ba224a8a401f210683e66faac8b7638b0f45d2310dec0de3228844c83a7516f1e04162e4a4a234a99117ed264b2eb7756d2129e82fbce8d22e9006518f2f67e60bfab82cf442ee9d97d16a51ca926e7c9d8e2e824f1ca8bd01928517a38efffd48246a2203a669f2306253d78400aafecae9fd210018f6faa3d169d5ef59950c6c204031792f56a18a9146e0f079dfac899883dbc32ea90e3c20fa68e1624d10703937b948f2e3d0e65f1186bbd85cd525faf4dacb15c4cb7c59a180cec462eb58f72351c3d78df6c6a2bc5a3463fd9c6e613a3b01de0d98172f41dcede573350dcab361541a5b58c2f0b467c80493feeda3a9e232baf12da2ae83c44edda7ebd246b2e9ec1c173869275043952d3bc09c335c1194de6c65a9c6c0f7651afc8cef654d2b4177f7abbed06801df0f68d2a5d54165f4a97091dfc969c6ec95c81acb0dd1c69db598363b0e8ba5ed2c2a78ed5ede06eeec317a8f0d0e95e3af56ff0d6a45fdbfab04f004114c58bde9f7ff5f47f9d323e6fcdc4bea831d72444704e214739a56fb7dbebac2108f35baff12461b31cff1ddf610a78c5168004f5d002fc18dd4770f1d82bb0a9fbe52c1ac2b222636528d01f75c3b42de285934cbeb7bd66a374f9838249ade84bfa850944b9366fab2314c7e7aac6431b4b2224a3c4c5a77063100b58d985937edf7902c7b9a8414e46ef01608eb27c0e96aedcb78ee06fe151e45c4b0f8eae46400582aef529d474e44c141fd6ae1e1e0c0204d7e35367b1f0f1a13846736c22ad611485c4eb019edcc18056840d4dd887967949f60112f72ccf07b5530bec4ba326e57f530058affdd72456b1f10be3311bc6bcee07d3e158255edfc4de35916db47b54c820d70ed671d42a582081a1868268aa69de55fd42323782f5d2e6249fdf855e1ef70f22cce1eddeb41894f22880fda6a2b6bf545e1f40bee5367e0f14e59f49eb383fa2c33889f781a9ff1b2c91f5acb6d0b4aa6db5c1d7a79a7c47266e9ded314f400550eda9d55f34de31a48c7b3c10be2cc1dca892794b082e6ed5d8ee8c2dfca412555d465f2d81594ea98982f890b0b9fb782cd96d751ccea9e88286096d7fbcacf6443ca89e136a8879494f7eb9a3378f0339631895a281e386967eda4355e045f7604b861cc66789a8681a75dcbc7de126464b79b0d746f3eadaeb8d25ec0ca76c16e03dda80923694aed6f6fa4d71b2ceb53a9cfb205710a42694ab0299057fe4dfade5ed7ece4d055c8403ab076221621dca7f6494e03fd32e3feee4d44a872df025d93c06a98e0a793f6a232c8ff4d1e0840f45835987bb7135202fa765403971bb6b294cb004897c321c68b80d0d2db7ce3875956b38e35ce5106dfc103ad7ea9e9bbf7f5466e4ddac809778b5238f6ddf5d75974da7c89d61cd1bc58a5452b5bfd630ce54d1ba1c8213015ce7dccf941e9fd0e4333b3cbbfbca60e0dcecded086fd76df985f21e609a185d6a2532c388425754ea9a681d89d49f9d137b1ed3f446a4cdab98f42c1e99dc1e2d74f09e1710bd5fb28e25c1ef6ef9e8e6559b659b629c5b3637d93d5502b1daad045f2de9478af9388f9329857fc18809099be67106e8630c5e715e87f7e2d45b34fcf423382d559c040796155784281f739b92eff96c624e2671ecb4591810bc22818a87ee8b9cbc95f5376ff31e102b7ae0dc98e7bab1a9a8366de1e2a447f3f247739ea45723ad74f866eabd037fc81ae7198f16aefd3e7706deba032eb284511f2ff492b18cd0d29c0212c2647546b1d7f80301bd9f82ce3c8a7d7a0c9b262dc03ef6cf024498f85fa858a10882a834c37ed191d4fc474a81ef0d0c7398fd42bac70c6d5978ae3393663b2e17b00a148dd9c8fffdc2914bc0693424b36b888bd4ec6d5292adb4908923073b0820ca69e7994b49d022f1c4f54d398795b62843496b59e096272864f333253e6d37c5ac5bb2ffa16778ba3ddff0c6179d10e4b02fd15eb28191815ef5eb7b621c49916079d46e03c893e4494e1283bf890687a9f7e4417fb802ab433324269b7e8e34e69c98634b5ccf4f9f520f38bcebe879442b9be9c472b482cbf9b8bed92a4f105c056b44252816973446b22a35b5070af95cd929e6a80255983eade3f4f61fbf73c4ce2cd8bc74b92d571946cf27c9fae682b3b39385f156c567d3ec308430b797e1a23c43c3482d6fdf9c16fc285d896b4570e52b00469d06b78446ea2a30458826312cc58636d7dc4d85f479bcc9828ebd25553d86b2affe57d95efe60072364f86987d94f8f8c23c0b5983128af41cfbd5bc8aa52c71419f22a0dd8658370d039f69e7e0814fa2917d550f353f1053bc94a6647152386b0f1ca2680b1732b24b7be76a658d0b5eedbd35d2dfa3ae022653f0a0c761b4ca6d38fe57742527d8719280e7e69108344127c6f02f6b94a758e62ea4ef508acbf940ad7602071eb3ce9404abb3e7c4e0e1d732af6ed506d5b1ccad65aba0687c63a9122f58fb8795059c514ee71688b8725dda6db98db6b2588355bf3a6371d82a0c1e5d781f08051d8d0629ce8d0bd02b60dca4882354b42cc085c0cb69d5568fce2dbdf00496599da42fbbe67299a4f9640318ad642f1279958edc76277a6efc13dd74455e3c37d3019702b104547383de6977cff557b34973316617b3aecff2c0e1d5ecc53e7706a998cfdc10ee58ff91fac1496b18de75d0e1050e9c54e4cfb8bea11d6ddf07039a5b9b36455c6f72389aab3b1eda70dd314128e93d81adf193ed3308bf26e4ef4b4448479277ec6bcf632d40ebcb4162844380954043f6ba772d19e87a9ca40523280dd0084c4d9fc1f2dbc561d229b4bb3b460fc65287333235b03c9d563cf2a1ec43440c299367a32661385058e1b6daea5db0f8345237f572733c7c254a56698f186f63f5e92b390f936b79be06db3f0d26a7b626fcea2af5e9ee6073cf23497090d635b98ad972ad17703629a3cdac9041b4c190d45f61df62e269499c384d403481f601a8d95c296182ba6ea6b69da81871d545502bea276b59da82307040ee874ccd9ba29be6b11eed2e16d9007f5c93b472e7b94ef44eb0d96f400769b0cb58a6cf5823a29a4e57a3791b1a20aefddcf2d49f4ebf060244ad4103d8645b176462c23a386dd7be085c382e5f43a240cf14f25456ee2fc2aea6775773764bf6fe22a6ddc9aefea058be580829811daeb8696e0e2cf7d197b545cf9d8d4f6939127ea25e44f2e30c4b7f3adc72c78adef9df53c5606ad7c501d8b30bd4da23083e82cfda10e7f50a6becc56c970f32bf7996bc2ffc32dc26d107393609e9e51b46b18e03812e0fa9fde22bdb114af67faea3215337c90b4244a0dee4de572c51035dd042857d891da11e830d31d3f6e132ba455156eab5aa033df4737087e0b6c5ebf7c5522ed99d4411680e4846092e65c36dc66eeb1f43ebb0f25cd94fba0ceb021e67454948248bb90cfb053459ecdad87bc90714308e0816883db6f2a2198aa4575d422bdbe05ab2b71fc28d397fd5594cb1c1005bbdfde0d98dc3e76d9a93d18f14583486b25d22645dfe821679e03f0aa4fb471191832f662c6ef57396bbbcdb268d2dc718fed2ca815883146b91fba2597cd2fdfab03044778d972c85d4cb457862e6a8805001f840817a79edd76b0759bd815afb773aefbf3dd4dad31543975499c9c1362d65ac1b29e086d04a4d91ea881281f2718bee6673a2d3b36c2775922535ea4c9b64d32156b67674e4328ab055cd7ca47f98d06a27708a0f5eea82bedb332f94aff79a4d2df0b2c6df792be3aecc382dfe062506ced4815b0db07ed0dc9e7ad289ef9f37e2543e70ffac41b11820161905cc8ea4d34d462a6b2cc820342fc25bb5a196a1bf48d05a1eb11f8458eb4df87e58b20f5edfdd56c71e704280e045bb3754a148ca217b1a06bc399aeb204f88630e49da83fcbc26e528723718d231be8920da01a8175e8d2dd3b044ee0730102f88e907fff884128c340cd739802dbc665f7796d1baed10d4e3e1190a8ae043a4bc987f02743f15c7b0afcad4d7108a67e4168dc90cc1e683db48d3b2b33ea8c157bbb0a3e0da0c7a091429b83ef53fc339ed8849c5b8c3de35507519b7ce4453ace259952b0c13ad6bc94e50af5598ef585b1bd54ebbd773218732fcbea980ff681a77ad898858f8bbe345e1bbde214dbabb44cc1f399936f1f84b1d9009fa379903aeec5e31f229c3d774dbf13a5bb52b74cb6a8aa2a73e429fe576dd274a1eadbe4e5746c9ee2433053ee61889d52af7cb86f5e1163f91d4a78082072560f44874f376be54f7cb4fead99c1517cc3bb0ce6eaa94977cfef830d472a27ac42855688250ea444ec6f93a0b5bfd1269ac03616743f6f39e6833b1a95f3665870aa53460f0b8ca6e1bc9ef40d71be22200fc06e2643bb01a158112d8b5fe8d02f115fb7f67fffa42ef418f7396c0a5bc1ffe82beb10760c6f9f52049ed362e4491fd168455dc64faaf703b7aad0251f14c5a73967756edf5e418be23a889ae49dfda5f80f4e044d47a4caafeb427fbeb47eab30edeba402e812f2f58c57ba1de55d8249b516a06a99820a2986afd6d697884a06a498e0cf04dc10310c641b30672971b7f5409fba7d200b21d82d7b416a1b888b53db29975a53de6c9b45ae3b78a0233b59b7e63950d470d9e46ba13ab3c8286cc6be738c1d325a18c2eda3ba63114c5d04b5443e795f1c02e4d1301ebcbcc5a700190d64c76717783760acbf5dd3a3d0faa4b9df5bc2fb496bfd44d1e80fe517cf91748cb22137ea9990ee8a7031fb40d901e1db90984530fc6c8c9c1a9cefee533d4f80cb3dec193565e6ea48425f67266200721f5fcf7c962d867bebf3afe283eef658180cc90a03011e079523a41420b274546dd2f3b4f3252700d756872e444b8d4066c96f8e5fd58abb0eb5c305de8bfb0cfc752ade0cc556ad82351a2b06d612b8911ff3e0bb6dd2ca960b705cea08f35892554d313dce02ae58dcd329dcb9c2f173a7862a7a2b645a0aa55decd35a0590424622d4fb4532127f0ab7a0fbfb1d024b983a62258b27a3c29d54d1e93c365162c021dfb7085d791f04d01265fcf3ff6bd372c619242b5580bce49f0ea5fb8710406d88ba06ad6e8825ee156fdd3875bb745af1d2f2e142563b22c888c199c177abb3c3ae1b68c9d227a96258ea87140696fc161fdf0626849c0ffe58423c8a6bc4e9b9145b54655d270f3f368108254bc96bf7102b1b493f0542017a8a6c6d8947a20565945328fe15d7d298b94c93172a7054ea8630c9c1f4e8b10883095f0b546bbcc1979ddb35cdbff7f71e12407a6ec00c42027604c0302dac0d0d958dc125260631e718848ac590c79170097447496f7bb0a9738400274b16ddc73ac67cd768331fb2662ed43ebc99c7e210ac7998576774939152498e5afed3e05e889002e0390caed85abfb264aa3ee2b192dbf261a83d6e0b47d0baaac3f1572e58854f7229a25266787b466df8afea999f44d12d116e1ea2316ce34dcb4a6196dbb8492e78b92e3af6d27fc42cbc90933683bccc0c59f748cb50ae8086f6ae0734ba1823abef219ff5c5383c37d0cb2a936cb5a9e961d8fb5781eda556837eb62cf3cdc5e1f197fa0c7cc5c2a8fcd967bd1c5fb63ccce2e32daef8078cb735a0e34792375a3b240ce4ad7f3ae0384ba53cb191611be85b84002ee036a41a6f11813ac399819507e116218583ea9495ced8ad655e1285657af02894e5494acd876898edb83b02c75e183392dbb3b34a2c018723016b85781d8776e4dd60910f7ac6f7609ec8a31b4393257f000473cdc572308c48fc0d34a0b164def4cc3da85f3414f7740f7bcd696f3c5029544c3489d606224dd627ae9b5ca11c4ab3e4b251f80cfa507ca09f206f6885358ebc97c9cb1021500d68c7f0cdb8217e9e16a577fa0c2842744d1ae5893e74c67ece7e1bacee6e18bf32f603668feba41ce834dd2c99951cd65e7e8dc49239b67813865351c593e873e34411d4850d7b02057478b3989d44d48e3c064e30ec59612c4ccbbb952b95d71ba793b0167524c21738100bedd6b23d45519c736f084c19ba6be4e6c87709b1375625eefc0c6bf5ecfc64ed65a758aa70e4b127c642a8316aaa7dbd896f93b1f80e5ab295be6e45aac2245b35c18b27fc162244badac6477c5785e5f165b1cf25c902b2ee54c61c4bb71a9628c114c3ee211099c36a47d05569c8e91d01031b8d368f7ebf15807f19b44b8d04cba7cea1c14a260080f05b5cda934d92da33f0dfa6b07f3e46fd95ca3ea3c819c4168d40bffb212077b4c68dbb98635cc2ada3d1d596fb7ed2fccb166847cfd884dd62d1b5cf4702857e9d56f267751ecdf01b075f84222c1c2cd29935c095dae7a4f2813b9471e8fd8d55f7c7e055e606f88b6f77c60e399806640aa102021d21cb1d3e0f8bebb4347490604721a043d949b26ea3d6d341d1e9070a508cb294d2b5d6edb36ca8dccaa65c3ca7b77470f55f2e98fb599446bc16b8140ad30c72b2b18d5318250e2f58217b542b617427c9af51ad4f045cf0a5fbd1a93574870cc6f8ee830131f66577f3dcd4964014a22d4b71cbbf4bce516658088054e0646ed7d791a6293a1710a956da21f27cb50055b07a02a3cdb776b4708e7d4d9f8389480034242ced90560f7c55c1cae9e27ca1194cb8c380ed6472fe174a47b8b7a5d8eb81712a9bbfb5040694cf8f225cda9a063ce101dba10325c5922e1b12ff00e0f7234f23643131b81d42fb5d2303de45aae64d014d8cb132535059dfe91b3c6c9cff6c242bf92fef25a64a3496df6948ba3d9701192373a0aac189d5361b3dda1e41917e43aebe4a21221dac5630edd1846d12736b56244a1ea71acd67915339ad8aab18d3455dacdf27598f12f4e1a0f7b3130af3fd962f2b8a8f9c481e6a5cd7b02ad364b0dbee10e899f9e2955662e93e2f37b2ffda87b1f7330cc1e9e531bef7725f8110b477081161d47ccd494e5c3ca9ad0d4e19f905fe4449e23bd49d6cc70c11997bfc0456add8ff7c06dc0dcc8914c96cb1087fea0b41dbb083ffe8341d462042c48282daeec2641bc371da4c5e5865f36bac400d152ed539c2dde1188ddbdcb1fbe0ac1b2ba18a7ac357a7b9222617a2d2602f9b73f5e41990f07cac00a66a8239e895ab231f5c491af9a14a2ff6106b122d9d08268685a636bd424f0a7d54115ddcc2261794676c7f7caa99677b344e90842d115a137c9852c30e7d2566600cb68381db38ca5269a5c618f588a45e0e9d428dde755b50aef40a563b02003593579400a915eb921d2c55e9f378cbf81f8e3dbffdf8daac1f70de1ee3aa139528100564eb9cd08fcbbb59bdc93a20dfec408f70726aed6f4d4d1842e1d57e3e4478328affe21a56703e4412f66092d92c53beb0a4f8b27f78efa951169cabee78cb9c832440977de51a31c0168fc5259888598b4552450b5da8dc8dbf0a227fd97ee2cf8f3b3ea3f5e2f0bca6f05696065c3f16f4bb3d4b658e715f52d4d2720a1f81517211614969c1d4fdc36a059c3896c54ed8cb1884fa4a9c9fe439ba6237c4ff895fca2f8fe7141041db0d012bd21deade8db85995d54d4e6932f056941198382afa30040e5087c6c7ffdfc213210a81f8e13f30449d4f1cb84aa0d328e50f77adc0fa2511239952ca7804801429b72cb1be50cd6d4b6b0a87208fadf3b700dadc570ac003bdcd7e1b1e4dc6d0de1b425185743000f61d9cf3f32fe8ca4ef7bea94e9c3e7bfd78ef1882f21c7274f5d4ca9703c15ac4291bd3ec756bac9fcd64fb6d3f6322f1ab641796b94eea609f7a03794d81964273245e9aef89f61210be6fef23f120d86ede3bf8ca712fafe5993f4b7776583cda82c9a6f3296787d7b62bc1a68e8479fe194cdad16539a87bd60a552c22d0bff41b7500e00fd0ba570813c181b0ccf6d7f66d7716eff6addc31eca2683d759e44b6feb56d63fae33bf61193733e50ea83b56e37f46e0c947b58039696643d2063f3d755de24f9d3702b583d2bad185ff8b756624b90c3f86997e134027232c78be2342a2a0ff9d5003fb29a0bc01bbc11de12bec64dc4c0c223c7333aad1a25cd189f510a2da0f465a9f19c81e67e0f59789d18b696258dc5e3584fb18fee96bf264d64c2848cdb70e9cfba53415ed27393896a30ca644050c8d51e37d47c84e860ca136404d4ec3a4120cc0c4810cf87b60d331c1c06f38cd92c43481563883dd040af38140583856e995a140dc91a14fc4877fd7b204e3e0502de05867026b8801a9c9008832a765c83d743e4d6e7d273d95b21506659e52a96956d40569297580c6234b18b3574ad4703fd7c84c7441c0f429299dfc08ed61b2771503395ee24ce79159d0b9daf6b7a100a418ad878aae3fc065f01a93b8712cdb2c0e54b3d490cf80998969421fd0829c80256e793d73ceb7b452233a30cdcca9c18bbff58ea0504afac586fd9f11315f6d95148fff2f7e7c81afb9b97d943a5154048c0b141ac70de4c345544a401b6d2a8b8e4bcf2272816c50c538d2522aa91be0dcadb744580edd64428f62b7d57486c9e5128483abf316738a871a8a8c874a4eef645cac68e51d8a6a1d871b879cc850f05c87311ae2c44300800289aac43d8f63469e315147bb2d90ce75818000d24de338148590f0ab652d3e7e11583c20ad354d82816c5fb906cdfff4328850a928f97105947092fc55dfe5eda830cfc3e29e5939b0d7f5df14a9b88c38ca13e13d3a0930cb173a35abe7a8d9e3c8c1c0f848ba7b532f0596aa14f3f7c649be40e8d4bb3049040af595237118a4eafc9d3471b32cd0038c04c705febd0fc9b9d63f102d8b17c14411ab0920c119025e3982dbdb88dd8b568ea180a9a28e0403d1d20794312062379b609a2104a077a351892d68694846104a01959506334ffddde4228f07b1eef7125deefa0f17462bee6568eef9d10d51dd1a35ec8c995d4811b55f40098bebddd8a00cacd07b0ca828cdaca2a7d45589596f006988c51153248a58cd5a089a1110b889c92c6076d20b33102d7630821ea088a9ff4662106f75ceaa371070da0949308857cd9479800a98bdc7050682db3350031df5a1dc160f88f40a17109cb9e84f8ff1a197f4cf3542c4ac9608cc207014b583be20e4a480494efc884ce2c5fe650005dcec782f35c3015317de0454bce9187c109088dd9ffd9b3182a57a8beea126c76fa8505f85afa9e40d27aef67467d425829d6c297a1705e91366052af1b45d9f4cecc241c2676a06c5a81230fbeea81fd2c3204282f8a60aa10d544bdcaa1688966c33e9454ee8e8ebc1eb72c895269ea2e10f490e0deaf76c848ff81df4778621f8538ca05277125a8e6729130e7a34cb9d89bc3401fcaf1bf06a25cab1be25e0f2b77f6797fbcd1733e2fa595ad009779d20f08cdab931693209b089396cf2c539eeb1f501c29b64297fc8c7aaad4f98a241988c903adf5ae7a0c61cc0a899f4113182ce06d93449606dd40d76c3d6707db393838abc97a67c3bf02a9ecc45850cc4d92980f976bbf789be2570cb6d48b3805cb75a5bebb2b0082e32441f62d0ec9d45c06c80d52ad6c607510dd5b95966706489fd8efbce92da87e10cdc762772c18d6beb75bb2d0106758bc6475efde763cbf88a49fb13d3fc12f43ff04c6fcc0954d45bbe85208c0e530bfa04d7982bb9981c4894a3a50e0706899a517f87ea871bc0800fdebe6639c06a80fb1896779310abf29b9c9c933f50e6e626b40f4d35a0f0815975118a74b68486e2b98645acea54ec4433b13d4599a33c0976d132a073f5b1ebd1e1d38bdd1bb4c56f4cee1ea56e1457a66d0cbc83060c25c8f792cab448c9295f37ec4f0af69128071606f59cf132758ed536eb2258bffe46fe1867b475556d6717c5c9c184b3350ea09bc91292109b1c6118706d3db24e03f3b347b50fdadf24829d0bf17e55a7e6808ddea865acf0dc1c638a2098d67337a644ae47951034557903d4624ce2ebdc1acced334c7a5da6ad90c03128e7134b35832f088f43bf04034e0c7d23ba439a3fdcd58d37157f692b0e4417a87326ddb9921dcb9951d5bc0bac40995be512209a71cd0f2d912b49fcaf1436f5d54dc0ba021719df86dc4602a0f13a31c73f7328a7b08f6f39af9ae964f5ca5a841121918cc0de2caef3bcc4372109c7f0df184866075fb61b4ba3f7ac4eadbb031ce94eb03a4aff9442da071142873b03d800da252f1b03a840e59a6da6e608b770843590c792c0de2dc5e37cc861d03a5836eeb60ebdce8182d851950345d5723743f00aad7ec04042f0c576c66f21ea80ae4a2d7e58e781f9ae609c219ddda32e10163d6455fcebef683bad1df74183d3a370f26808deb34d36b98c6cc97674b4d3c10235d1ec7f5aad11aa9ffbdba72de1694831468ffcb762dc88c2b7f4fabc5d21063a7663a08de54f3cf8d15283c7209f24b63899fd6425a68baccc6f1eb173bee3b159915db8059befc7655e0e9472738ef951ca81e1d213f97d335e5627f1f2deaf4ce1394a1c16026282402aa49d32752fbd94ec6afcbacd5ba20f037340b10caece279c3ac5b0f6baad20bbe91eff8e89ac8a505aeb24b85c4a9f9aefb19779ef9c2e4532ea35646afd9221d84423887badb4e0e2ab5033b47e227f3ce2fe6d00ba2392e0244af7496d13faeafeab27ff0b3d059a3e2d5b7100afc45622845517d6e274788d2a9f1933776750ed2fc4b2c57fa5d6470c2d3eb1dd210d9552db8756f894a7c7072c83a86bdb62c91618c5df6478d55b7d6a08f1043ce335aae60bfc4238391b1d3e725002ffebf5b401bc84978967f95e04aa990c57d72fe3c17cc9f691c432133445d4df445ef2231ef02219665a90c016c7bd021afcf499476b450c255d3a804cc05b9d52ae5ca097cb2a775aa5faf0e0ec3c3071350cb97d95b54ac2dec7d34ea178dd0fc9edc34c9a8ff9c5504dd25a813197500853c9901b5eb39595983cb8511e326af1ff70c55dfb4425b7446239052d51e89ae02ed8fbb3c505fc34fd1255fe6d42b50fc4127ba884838e9c8795214d3a038186c006ac159ae1ff39384b8e1ffa4818400c71ffc4635dde7677781ffb70e299b4ae95cc190a94965bbc3963612fbcafedac92909afa7aee0e88e6a5cbcda0d12a9cf83084200be39f4e1f947a82f0e946206a36dc0b06e7ce3d4dd3d3c82266b1b8577459579e41af416d21f23b717fd97f0b55d69f231c540ac18164e8889b3379b042a6f1d6f37ffdb532ebf05d5ed7bf82f8d3bd8ca16e3e13f65f92738b165a89db50482c01cff4aed9430ca5f67e83e88d3a01e433be8fe84af32c2ef403b1a254a1bbc8cdfe42ba1b8800ee6956591c961fd3b4cb3592edb44ff95aca5fb402b6f51d11c53596dc271da80ee78d46430aadab27ab451fc8e077fc20daf20d69bd4ba1ead5137067ffdbde9f58c6dadd59744ac1bc0db7c794dffea1927845eb439884bde18e32de1c61cb46871576ef301bf1b1f46f5bcab82fe2b3d6f59bf6d5f8a9c285b0dd18a3f8bd1fea2a40af2cb27b601a1dcb09f9bea1090487b7ae3b444cdd7caa881d1bd36197c43a9d64534b30cb8ff4dafc511da180289980b6f9588d143f8957b646f46768a48336742ec52b44558b4e1c933f98c569c2d5e017ea4564e206f5caf6813defbf194057194a4117f76fced026433ea8031f28ce5fb40b05233c17cbb8b062442e268f348a2f59700dc35f64630069c1502654c946abc31677030db2d3fc24cc9fb4d5e51069c39e3ae02c78b16bb9470a6845d26444ef1fa4e490e7612774aa5951dac7905e72023ea3f0aeb80316ab4940abac80a026715a98726102baf91654da6cfb0d0b11b58efee7de7eb4cef871d2113cda76a8516a1b486bd7f6739dd02058d799a2fd2ebb2e16c13ca4cf5198e7c986d810ad862debc393d428a683ddd5cc37346c298f7794e1e9c9ade55b5798c210a92c269e76c4b4e0d88d957ed937843dcdb4ee8086868dabf4b71c83d1abe5db1942b71d2718e60e4539b7d33101852bfe5ade7939d00fbcbf5ac05e39b8fea4befa93f7c63218474a9a4f4459ea43d45b68be0edc7166c5d047f695ec1df9fd2835328a7b69e5c5702b49339fb41d655a1a09e07f00b88e2efd004051bb83785690237c14e92ae917cb8ea4ad31f7dbb2132f867aa0cde44cd3acba40d716804660008013ef99d84820798bbead18bd49082697482613429342d99eb8dc4ee355982c125137e439c0a0d7ff2122f6c04414be4be2e4dbdedb568de8524ef7976296f21451215079944959f264cb1612aed890605d269690e3e32d0bf60aac8ff456ffe9d1816cced973f217d7eb78db4fc343ac74950e54a01a4a995ea88405964b7a6e27e46a389b1c879e7f7c103dbc38f50a20bd18676f64b69047e1d4d6310f3c1f041ae9f7303c5f6f5342b08f3aef85cae5d5b9e138c9ff7c5da6ad5039daa449c6397c1e1ffe34cc9754303baeee0001d31816cf55f4301d6a3c73cb0dd9ac223b8fc2aa1b7f3c5fdd06ea388e2e9e3e00058ee69cd9ef63b277fc5a64f956eac070bd3d51f65e340c33f36863db116af4bf351aa8df58b92eb4da0750d70f3d8ee3c8e5d96769ab450e168b6083683b8207d01308d96e2c6dbd072b486384893ca1d1e271885b8c94ccc8f8cfe2af42889b7b4bff8df710f49152626a0bff43044b137e901f6a1e772538185d406d7c7806db888cbe7341067905261a290d83004d7cae59809b68bb8f795da667fa02879dc4dfcd95c7851b985d25a84502ccdfaaafaf3d7601f3b6665d372e51ead7e8a9243ed166aefd84cc9c897ff9daf8199671fc0397fb76c1d8ce4505dfc0fd75b5778f8dac0178a0a24a1b1aa9bc9ac1a62dfffc2415e1f0d8733c64d1bbb6196a119dda85292fc7ab28cd07f8a949ba3ff8ca5c980f16b5aa71ce76d13da3fe9d488081833b29cb21aa062f039b5b31cba81818d943ee1ba49f0eaab581017614caab356b5cfe0dd05d3f42e16af443bf0de390c7fbdc250560f9174f829cf4d91707e0e145b81569a9c61971c21d502ea40540720d5178517c7c97ab55692c9ccff7bc2e738c0f68c4c33fa659f754bde86c7fff61076556fb895473f1b76e46f5c88afdf32943a59bb09a9ce675558f6ac66a0cb0687b657d441569ccc14bc41d954fb3e81794c24cf88fb45a2ce4f0adb8fabe0907ca22dab7c7a606e469d61d4c3e0a9c002b18bffbb75f0299cb0a8507e609363ce66811bc76a0aca1892526fe788767126104c0b47019ef9d1d053be640c412624a9208351f3b3d08a6cd44b363fa99f87a00cd20d31db9dd7eb3093d97d339689ea52f539eaaae7f915b5fa8cfd76dc8580d5a9fd6d18be5bf418e8933856c30db216ff82990b3ea24614dbceb796375b0ce361a4c730fb19d29bf85d1c1e9fbbb2c094d0d32cd7bd1d604a03a60b701a3b589d0009a04a9088562d9586a629715a799327b01509373a536f304984bcd2530f1e6e270caca45023a1e0ceaef234018d8ab23538689633beedc8efdba8d7d6d5ab0bd5e1a32129eb41594167d6cee847e1acae40b75adc4dab7bdf5429d433d73b898c312a96dfd75a8353b3d711359fe39679dd9602a37d3eab92cfeacd70f7607586f336be2768697e5169c2b566e89bbaad62a9bf90cb467b7398c17e4dd46ea6f5c6d6d7c8ce43637c5a345c3a16ba5f2c47eeaaa8d008f1e82cae87ea5e4f48939e9ba30ee04721ffcc70dadbff69fdf84fe27fc8da9509017138cc77003a5423c4bd8e083f43cfb102aae94b0279a364bbcd8ce434631a29597da380204b7e31874ff432d03155b97d12652a7de09150b9bdc4aaef3f14ebbfd95549e9388de9c22397d5ff5ae9e26b6461256890399370ef62a345ffa0747775bdeb0f8cfa3eec87a73fc00e4b41bf1ec45855aecc26258314778171fa92e70de32b28d1cf915edbb716dcc200172d953ea9d20564b984853856c01191951226af84e620d07625b60061d33e4ddbab92ba4090111253573ae95d3b6699376c1cb800118a0000f59d663f52ffcea55a13d97e22fb306388806115e0d62f01921026db2b683d62167158605260c02560a3e7f99e3115e10b3f2d83bd95d6f88fe09140a7f05ca260330434f836a1ee14f03c6e16240e6c00893b5ba1b77b1b2c4218a2873a8befe71460e557ca80e5974a2a90f69b14d11b43b3f625d372c8de42280d2232cdd57a7dd5a52f6ef1bb61ef5ede9489e2e2993ea56a3bc81941a0ac4379d3982e171118c1bdf6c1e6f525542b0ee184b0fc47d34ba539b036020f3f4fa5f8e15154f5d0b7e1f767e18dbc08b14a5cd001f8ea5f1faad6ef598a18e0f07ffc5652bf18e766043944d6e22f0c3cfb2ecf5de752a7b0a688065f8fccedf319f8521e8a8a458d2556ac6980c0c548527166154f1740d0f40880006e793454be3d9f787f14e892fde59d2e606067862c708dcd8cf1212e931cd58315d36be8278ce209074975414da88deb9cd546e13273f1267a584cad9964e939a761d6234ab3705242817c4f291ecf2823fb987b2c8720f37dca417a6ab16071fdcc20835426d22b79e74b5702b4c00b5ccd6001d82f62ccce1fe4092ebf15ff4d80d1f01026fef5a611c6a0d0c4173082102caf11bb960e91042f9e4c3ce3ab05ee089b7677f6e2c11671e8126d9f57ccb0a63133ad7fd8a94ac8d45b63b752891c606ade47bd4bf9bbb8c21784c7bef2224af2e87ac4396e603af8f94637e45ee6dc1ff725dc33036e65aaea5395ba86d8ac766a59e0a87aa16970713b4849397995c9feb21dac8761eaa6b1bdf50e09a14163808c70d51e767aceb921cffe539643292e16ae8cdd2c81999729a9f3734d3337fe94cb83700d6ca9827dd4fe5b277fced7c42bdb5c10c6dcac16bf90cd3a8c84a661c0a3291fbea3e9ace9aeede90e49bc40e9edddef322c8c5cd5e6eaca12820e35ba1568c68c54b3b4683bea111095f1dc6ed1e1c236d5fcb197f98344a18b31f5469d266284d86d772aa9ceb18f9696f43c5b563ce6de19b218deea896c10b0c318df7e582e4caa7585dad854f530a66ee747e47bd24fde73267fed4b7faf0ccb348665d647c88f402522672a01a463256dbb01787bf96ddb6f4759c93297edd21e1dc4b2b7a75b559f0329b0a3ed6341952b0b1b016190cec1d54d6c4c756c12f035487e5f8d7bca8787d4833f09c7a089adb054a7ff1b34cdb5b406eb216aba7ab5765a8c81dd5ebf6f7a6732f48681c442ea598ef2705217ae91938e3e2d4cd197f95fed3cf0cd6d2db3d96514485accfa56d22ec450ce34d5dd3f12dbc4b1e097325f065268fe4d3efb809066ff48616e585cd2e00e70bc6cd8d62d539f2c49fa46d8481e83a2536767ca0f4bec6ef432622c25a3603c7e455d8001312e81e14ce182f7a66779341245de141e38c16726ee0d488d80fffcd35a0cf5bf55c6e93c23b285220181890ea648d6f34ac6cb737a8ecc763d5ef9460513f5879185c3ebeb3f7e9436a486c853ed700319db9ecc5d3e780305035eaf3665578b4dbb3f8886a3a1058ab21ee507933462fe96a4ef803477126a29edd8b86c59d0396c944037c33259745227f807a4ce0682a9a4bb437dd22fb9d1522e6c2f19a150b178982712920a67b74d5fe07212c37ae39ed0c3264f415af146d7713c590961a90ab0bbbdea51ccf9b4ccf7dec986f81323cb4039b40bc1bedd9b9cd8ec058c6e0e44244d5f63c42627342c990ba5eb233caaa7bc065a8c828699a3f038786be9fca7f48af6a2df57e9d0d9360cd0b33144a4fa04f24ff26ab874cd795b31a21d09a6025b9406bde294dad9ca203f575de1d7b5e9c01b3c022716e29dee058059ddd99ae03dce7c8af856833f580ba56a0906153dc854d7ffd0cfb7ee6924f15ac8198d0ec80271a9ffeb24a5ef5de00b17996a1bcab37e6699b4d5fe21f77213a33b48f868a7e782491212eaf1caaaef12ea0def07f6f6d20d3ae5482674bbf898dd78799ea1902d4fd3d5b57d64c13e8e09a8e5340a960600a02f350f65e1df8f4a5e92dff8b0942c413421bb6baa18a7bd904342dbdb79acc4a9268093fe472fadec10e313d3022f75c64b43382bda741d982357f86b5d705959bcd2e0f391e1766687b0b9190606bb1cbca2bca211a305420405f040062d08f432707dc6cc65a5530743bd458b81cbd3194a3ad8470dcdcc28d6507826013818059f23a176a518ab8c629cf1b9e55184d26d39611d1a72c059e5f48949a37c6727fe52893af5a03a836476e5deccb4b1efb66578e99d98f135ffeaf3da74bc1b8b6e80fac07c1ed8d98689af54f201c77876cbcc122ee79b7d11d90e9faa9b57f30c63f5a3bff7e0496f373841a5d1a3c4d5628daa0bc35c2546e53e679bb32c9da176eae3398741e4ceca3851524393935b8e77452fb1a69024555bdad1edd6892f61449e6eb29305b54aeb09d0a6fdb79c95f8929d2677f51c4e33fd459ff185988dbf10309b97b041211b87fb1e3416a589108195d8938942eb9e448e449868d1df22913e1630b4ee650d8f27f7fc8c2b9921a15234d62c053a0115ceef3349a24312cf4c7f93d0bed853d1294474ca4a031f355200eac9f9abc8db2f6ac3a2c1e1575c6cee5f78ca4ca8b92916a4fc61cdb36c3a9bc3c7e6432ed0640a54d42b119be5c63101b8a44f0ad4472492f9d6982d9e793ecd5badc363130809309464565cf2190cbcd599b5148038d559ba0b61395aa6cb7dc6501a9def75c5c31f4840e463ab8c0c5e3776c465f6c8454177f955a82e2b15292fb23dbe767bf2a215ded2a9374b4f5649e56c338c9f2245ba7b3e60ca1f3d367c8686679219541fbcaf5825488751c346e52b7dfe55fc4f6f2353f4645279c348135207a3943291f5d257f8f143961f072f184281aaecec78917ab32403badb97a1e03b666975a9725d016787f58f75f173251fd38153babd802cdc8bdcb71103f81d71638f63a1aee5030f2225bf5bbf83c93bc01f293cd606a3536eec3fc5dfcce6e97503055d5fb7d8e9cd92353c90431ec44a7f0f869f98eb4ac558e844d60caef827cfd7846839ac6c832eb72e6be3ee178558c435df8acdb8edc851a6e2a36f1bb00523f46494257b038ccacce7a1eeb8e70b6890c95aaaa7723605505a8bdcae370d48877b31ac4f3c36293708987125537b730d2c6de550d1461818890f959c7e59d04819a944f62317bcecb3341f08793bb1496189b78609e09843104471076310f4bcaf232ffa15f1d4973305f9e27ab5eb53499727b4803a37ce025426798498df3061f6deeb1edb1ab1b0970a355737b19248eb93cfd8a64750f355802b1f711e77efb1a8bf1766e78fe08fb52da14e57122ce0dd9660fb61b2ef149790c2aee8ec35e3ccb4125a61d0000fa3cc19cfb0c67a3d3ad1eb39664031575c02bea0ab3b5b83ba4aaae4dde00a659beeb2598492b59a68360ba28587a55912955c9889296aa9e54b18dacc3d2539a0d0d30cd4e7ad9e9297e6357be10035ee32e583093130c287a236cf54efb7e50b2042710d56b0c5e62cfc381cc7e92efc61dbcb95497e95559b510934cb062f90db2d5c6ea459114ef46c7309a0ca150621289c227a58ed2444a41708569293779b3ee129769d45c1ba9c9257b8fc1c5b5ea21b28284ac71d87b481306558a90c392241ea40577c6e2a31cca47159edb8710c437742fd1117cfc8ef7871c319e29adab867cde3e2854d6a95a896650b796aa5d4d2b8264b30d67320924ccd2986f3bb90862052737e55cdb03edc82671a4782af095a6a936e4a93bc36d199bd44052beecd9070e0ed0261d32fbb124332a4a8ae5f2f2a3a1ee4d643d1fad9d40763d3e625248822e26e77d3139881cb8eb34b72afeb51be30bbd5060520506ad3be7fe002b369824d0b6cc405ab0bbf6cd3e44fc9f2f9c7f9361cdfdb3c26bbb88371efc42eaba2f8241acdc19aea8d8c6208ceb254e98b72996a2cbaf95599ccd527825a86a54bc6b7f89aa84fc7b137537c106a58b4c8b4e39f8466f4e72117c291282df81622b4495ddb910528cdcabb4c19732fbdf97b9314201b91805ecb2434d8e5b7d74554d6787a261ca1bae17a5548ebf7a786762292b181425032de48389ab5192fe8947262a3baea7005b3553ce4de9d4f285b0aed366539bac0bc4c8b83dbdb12f00fa35c9d4401b45eb106e231c4fd1d5d2ec609e54ddd423fd0ad1913241a788fcb3b313ce084a7e17f0dff3b13c56a5862dff7207e21466f69980ce21186a9dfb3cc1e0761786de500a3662f45627457be103f0390cf83a8bd51c3a3c011479c8ba330bd319e8f422a2757e69a42124b57ef4942f1e733dd0ce0528596d58c92327f0ad9289094e1c8b80231e3610d9ff19fe4a437b84363f1a2ace776b16b230f7705cbd5f547b9f178d2694f89eb5b416e7369452f8d39efe241bffe8938c4c9fe327cef8742c2b73be599b1f56b641a4da29940b3f9d3413604b457dca090898eb30bca39f5818b67914f3065e8346e0d72fc4c584c7caac581f9a85d5db7051dfff877588cc798217dd7010fd72e693d8ca6bf312f163bb6a8d8b2c87dfb211d08ce9cacf2c4d9e44dcc0fb348774d1f0a2e7e4b50ae33db2f26b946b6a13f63b61bdacc6e89a14447cd08a9ed8fa6e3cdf285137d01daf420e872a28ad4c1351712d4cea55751ca19d171f9866f5e4012643f809edebaa6890b5e4831b74ac8131c5e80bdd83820615b9a795e73ae10d74f4103962af3de1c59479bc3a61d155246011fd3094416bbe8e64f172338ee51dc0bb3fb57ad58dd1a5d684616003122955d3bb6035730078c41574376e8280fdf7905eab03c9ed4f90e27700c7794395267b942abde6926be26748f3e1a4a4e95b0507f73cda8718bec5f08abe3483f7fa310ead607616b938c07a62c9b48e44fe08200e26fd7e8b292facaf14beee127cff9bb25be14fbe2cb1295cc77d5faa98138b514322a174ee9539260b6c818df98157391a0232ea6a10bd5010859c74ea8445bb1d47e2e16427cfbd732ca1c7030210c10ffa9522167b2a43cc1cea2f5260a9d726c3745f0efc3d8d0523c7073615563db5d8370fbba76a1faa716e79b42d62048b5497bcbb81416853606e6b431e2301334f0df063635951d909a65c0ae79745eca127305ff4c6d7043e791adc7c1fee7286436d0f72064fdd4f0a8f7f4b987f18ee6f705885b0ee4621532ef4e077f052380e7947b76647dd2ad080165d732572323c0a351376e07a96e14e0632f3835e9a8dd795614b65498e19fea4656135bcc4bf85d61f7fa8915e87f3813e4b347c61cb773ff45274e36be061c485ac0a77374b11be3b16ccd8165e1a24a2ae373ebcedda8919aa0ca646ac59e4085c660bf0c6d79e6b7ab81f71f71576d4317c008dcfdd3d9909996eac3c5882d3ecef5000b8c70128ec558fcc24017d8b67e941bfec3705c7238bf1ee0d802b2422d169301cc074639a2063f3f1656c617c88ef5d67989df7d70de48c8f3037b62d297791ba88cd7ad0baa933c06f6c41dcb417162a3b27d40b5b1841a4bef80e3b7c665f35f61bad6fb7f07737a7d040c714c1317a28cee87dad48a6519639d6679ac6a13edbd60e308555c7406f7aff3e317bb11b4e236f62c832f5d481c18902e4ea7267a805769a50542b00d8d06e0c1f02b84c83d04f7d93f62bc79f8b526bf745df06dbc0ff0912f64560b30cf02217e302b992d1dde58200de58f6d0b76b4ccfc8c8a49a8a5df13d56c50ec1923ac8cedc1700b14957581a11b9a841a947d99a67e7b0b71f0e6f742224879537168b5dccd297df65f4073487791a933d89fd2300cdfbc87a014081c31811d89c31a7a40d0251d816ca3a1bb4d0871cae8eda04c3016c90d54775008a696e6329415d9a7b98afa30f6478f9d3141d5a18b22533efe2c6de57180c56de9cfd4e0b1bfcf7d26c5d0d87bec99bfb4a58488b5753393f4846aceba3e58dea5993bae2df096a03680a68fd38a3095e9517064a215bb90bdad32facfcd30bb6dd03555377c8d7d23c97e3929f0a8d0f46fdab465d4409268874264d7b06c03eaca80d4937631ffe3054982fa5ee93d23712de3657d229a2f4002e75d0ebbd5b3b98d44f1db6aecea9f9038697ccdb951c1cd9323afbdc831ee05370a9ca7884f650e8ba6798acc85bd5d7fabd3088fa903382390967dced47e240e658be3befe9d29fad94bccf68199d1669df3863b5ff249f5d2561c2207d4bb418439830f4f675551b640bf16f8fa931b86edac13f50efaf890fd93e3ff4c090a6506a252b22c4738e4d97bd334f736d0a7320051b65962fa89a574cf0ad5fa9be32595cf2100746d43866165ed29e79209f0e2b58afa91490e654169b1952bc5a82786d37a42eb25316a15ff05e996415e7b2f7bad0c8e0fb2e59a60a56a0fad42b8099c6bc9c4a48f80a86a0aead5f87e3fc03bb40546af265679ce251355057ea9a6a568656f2ffd1c6b62c35b595ede903d81f67d720b82c4ea5f1cea153f939e01a2b58a5cf805e8da370eed156d810876e9ded958fc0b92b13ba383c84f966907ac289fb928efba47382df682ef7b1bee71791d3caffe8d1a125b1d280f106d7cf5d556086d09b230b5bd38998176d8f9cf0be7b131e2363b15f39d80321f6cc4163ffc3993190f87539b8c7986cda71bd4c66ac42a7df04ee77aa0f8147da511d8669e79a941ede052cccd16ad021ac2fbef0453c73ea69cc5956e6e61017d3dd7752cb6a2ce9aa8baa7c69111f3f5e5c64a220e540087d84e21f8c67f35d14609d4a415a7fc0c7f2ed3695ddfe43e8822bd96ab781396949c4a18f100586ce8ffc0c9a7069472f24ab2e8ef2a04e05f4b513e371c93b4e83534ccdd915e1dd5388de23150c0c96f033c75a7a4df61847473f88006b2660774b406492b37189c604b577280184074b7c1bf0a0695ab81fd79c931f07ca661aa7be4b434e9be993c4afc1f48fb540443010896bde7690db531cfe2d9dbd54bfa894ade4b902328f9105817e96b8de57c19932b7f7916d8a055962cc9ea4d45dd0962f93b65f1133996473684c9bc18705d4456e6b30cb23e49c5de24f12b9bf31392aecb7e05e8f71de3cb996c00606581febf1567930645f1e21599186c974882a22ecbb5065448a2781805d9a6e93bb98536a9b256d597f6ab847d1cb6d342b0aa057fa0f8ddec007f0c53fa3329674eb0fe9ad6554faff105d76a61470304e8e8eef302f32172ea84056556cc150447569b53996b96fbaaedaa6418372fc6a21c4b929a2370802fefc7f80a42a40d27ae0f2555d7c8745740039fa6fbe8f835ecb04c3271adbce0aaccc2c5a4b78a8f424f56f69b89e268682668eca2eee5076776961f26bc32181e2a11fcaf0651f6c16067e14e7b0e4e5f3266c3c0b35488525ecb22046319fe567daae6de45996133d0c77bb6f49ab956c3e04225949d3af8a5d60ceea0dd11ce4d8a511c6e02e3e3e754e6c5e519f2d23e5a969c8429d9494b2489bd260fc2b285ee2c9e05b78dd9bcde8f499334b3a8afb75cc7577152b6a257960052bfff4a7fdc99729c855603e928d03b3eb60dddea7a684aad31f45388d3761d0cbb104172e9d2763255daaf88a5693e185f122c34ecc77ff63c570a1118d8b21912fef0bc9ec83b17faf0a607796114ceca06b4782b8c53da1177692b0fdaf5260a57ff88f36e2dcaadfe5fd7cb3ccc7851182782e083b487d7c1b9d097df07d165d1fe8e313f1336479efad8278460df1c4cf31562544701b83abb6dd4728c83b788ee9357786fe33808eb80f9742907c31e0eb799377f1d15a91e00f380a886102d32d311892f44d109ecc9870039f06e37bd63c977879bf09dbbdd000faed9cc81a49ad8a9b8127a26bc67a1802b3e8ac0c38f1a936c1b195b52c0defa7c3c74b4a0bc017844aedadd706bd796ec6e8ba252730d1c1dd1144593af828d989f36c50ee9b4bd56b20246a28cdda403e60f51d448e7a766d94c8546bc0ba14a37a410157d08df4e5cd3f29816368f848908e153d350bad93a21a4d0ca8267333179d8f3ec46174964f000ba72d954b2a4b0480d4d1e7f7df3f4b0caab7a05b3dc4836132215b22c7a3f0a12eddcd1ec1d225a6042dd4535282f50235777714653400cb11d20c02ac38d0a4329ee1f9784d4db42998cd96b41990a5df5658d776b880d87c8337309e993991fd33e4121ced94d193bfca723d989808de4bf49c40043174c0509ae388069d064b6bde6a2b1a6401fe6be9c06aeae7b7fa15e3ef4ed90f5d7857b334cfa6f9d1e0880482008307c3a681919a68ab6e340990cd033c6f09a503e71628070bb36ea00bb756715478303d8726e5a69247e3919c9571de01de0b59155eb7a8d0c5f68fb0564045b545306ea084151466262969119ac47a02998ab62f8c41550b8053587f05838272b7ce59c7a9b86e729636c56864341c5a5023f75c47aff386b16386f3af55d54f65f01688dbc2d68bf2765fc3ff78ad10e90a560720c2ae0a08ee2859671117b0bc78258c1ca337a1d98a632973a81f05222412168f93875a9917a2ac51bcfb6562dd50dc4acf218f1d99f726feb5ed76a2f266e47cfecf8013efc807a8aa94173d7ec8b46bd32560f42626872f04242cbd7112cab778b66b08815227fbc96a3d0d90b735789b813efacd2f1b9ea7f76560eee5714b7853d98b227fe5941fc8e0957cdee4111ce18e7c742a96fded189db9851fad273406ece94f588177cb85c1f8d9b21b132b984f7250b886cc98cf2078d31c163504a33f814f968def3b9017ac7f60bfdbc42d25b1d22eab282e224882e809dd9f806cecdc766a976a2a33b26ee6b1973be82a2cc86fddfd69a900370ec7f53fb078032a2015000ea8306574258db686389777112774b3f857a0da455b5816d8ef49c2bc4fc69d273a000e73535df0b431dbbcc38b43fc480931995ab91030e98f1a5e4c84a4daa45c3b51b1ca145b4da351f02988b90103df44d01c153baf1ac41fccee39a4a1e3b8bf3d8c5df0d98cf54e06850f644a2a50091ac4961282eb57af21eec28bb26cc29d37373fa41ddf8f52b98599949ba00472129342e8b8200222ac65dc5ed398c7c086d191c56865e625b9a85828e5670c529f6a15366fa576b9b40912ae02b991491e3793635b1da938911a68e6ead00db2872fc8a6ac64edad0f7aa782d064d5e2c50672fe0151e44436dea4a45f34df28b64403e3c04f0d6ad9c4878afc37a2a81e79b33cef5750796829a0f3d967cb581cd0f561db38050f278866b1293679db986684248249263b7643c29a2853f37b7f4fdcebcd94cd627cf17b69f069b1e0caac64fcb1a5a7a1bef70e0502d5e5a4a7305e59db7cab005f0bc689bb4df2fe20c2904a1ff19a66dc765711101f087cb0433039373260803fee73eadb7bcf307600e9a7e57135478b6c57742e3910f1167c7a80374b5b7dc744fe8ebd4c5b9abed781cbfdd04f02ccf390e5e181b64a195c6a59e6e72bf56e299c86e19874d24d2969894490216496bce466fb29fc0cc9cb02697139411a22e3a6beeb0c687cfeb83c54846f8c863e32c573d0967a16383ac51c20f0e9ba0ee5afa035c08ddce76dd5a9372a74f7a212ecb7d5784468b7a2fb70b905a0928ec58ecf5ab152f016fac7ddab1304a2afeb6bd5593e47698d5f4bbba8af4abd036ed05c8a25273431d7560a4b0cd2d2a760f90d9943b86d305dfc13e2cfb6efeea674689d3e82c9cea0ac91bb5794856e92acc6ac83c49807b90ead805c6fabf871313f2fb4415c2a39a984f61511cc1b18556cab64eb2ecafdfd98643ad5e94121d0c07a3012fc33a366dd1922620b2723191d64874937b7573979a52d7d6f39d5c59598145db410722592613286286448803d4c22f00bb36883598323aad90850257e457e75651e3e737a00f6268bdb6adbf6ace26c0556e035fe8aa3136e72fe772ffecb654e9a7deb1a0706fd7a463b3051a6cfee87d66d00adb32433edacff3c4db632e6733a079fd969528f94e2a59526e5211b6dc728bf512c89cefe1baf4175b69839d7d0ebdde94c15f5207e6b86582d56ad39ff50ba32f72c2d3a1613fd4cdbf01113230f30a79c857102f21e817902a03a98ace9a3d592340f3099d663574c82ba088da452fcc02f4b2ad272c6d19de7546e037d8855bc356fae4521f7c4701861200b0d5f98c6187a58b767420c371802c1e3e6ca92bd42d4eacda04d0f4fd4121d9725b70c1fc960df8eddb60fcb410ebbc8dbf35dcf1246dbcc96a40de955f15676c0ee374106a887e8c7401b54614118f425ee8324eeca6e42b93eb7ee41744a68099490919cedff4235b9d964dda12e09fc1dd3a878b3d4bbf7df05309eeaad7a077bbe8ba0111457da78ef37f5292fd5b7cf5893d0286846a2bfde2225e77ded745185b2673c5a8d77c218f51a7659fad815fc65fc6c3ae2b1aca5fd2a70e1188bd6cd0186ec7153a02f980c9076332401179b4a86b9977b699e7e3176731ce7eeca3b2b3a77049cd314fe0ee13fb1c27ac04f2d6bed21c91eca4eb5749a7125d559828f87742e889a090f1d8c07d145e834869766063fe5081de134d7f246540891df6803ceb2310535106cec4d18ece335e72b2d2832f7b93b725feee87b2bfa1ec28c7d8e435e639c598b5c2e282c99605b67b835c216f3a6aa1d3277c488ce0ccb4e652344f642f43d060937c7614a8a7f208036f260f3844afbd3c2d12296dcb5b9ccf4ebb1f3727f8363fa407416bb485f31e590f708d69c3dc19a1600fc52babec48db05646c7914f56d5f876d83e1e32f842eea66b7f5718ef580f20feac17239f709d207bd84e832b758476bdad67207c7a3335623b785a82ee9433d05294419d159c15904f3f1fc39050ed0cd4818881c23371a5301b3edd1086ec996d019827aa0720ce9cd1708a98e6a19a83557bb9121a6d9f5024c18943a4747a4cd092e10313b478f2fd2fe78fa93c864abadef17c90265d06d30d013e72f5ebc67319fccf048c4f02dd1850a4bd728835ebaf1d736705aa50cc9202f241eab43dbea3166c3d76df7d0a6507a19811219074213cc1b64a960881141cfeed7588b471195ca9808bbdb673ecf61c2fc99780593c3000bada82942a5c599b6d7af30dbcbbe49cd96191faa4d9de8ec32643d9ca02fbc3f1999ec47f53d0c5b1efe86b1bafebe913349857c612af798b40e744959ca9797ba05f51b843ed112cc632bd053494140ef94fa564f5baecc47d0a7fe25230f7bca539f9f07014385a2fbfcc70052c4dfdbbe56b5f0f5a1df76dee2eded3e81734fbb60b369a9d5f037fcc6247d3895cb72389c438141ede5b53bdc19349dc52c1e6159cba9839174769510b8c4d1eeb67cfa1803f8a286659f482841abc3372d457c4b8715e66356fdb107bb602af79933bbce4c321e19450bef28b0801643a4a0605b1e28f8450de0c561e976a2d60597ca5f733957dfeec17dd207ce7a1de96d12e6de0b364541db99f35f7d116685f8b421ce0ad696303d31c03de4aa96f2c1fd7c9cf065a9f23c756ef44248e60bc4aff76b61cb123386e1a315901c985956b5182fe558393b65da1987ce6691f5f315fd89954335fa341fbac1c9d30da6e26be4f146ce705d01b3cd9c982cd2b3b64a16517c74b1c504ba2cfa7a04732202f36a7fe5faf93121701e0b82161fcfa12984801544872af2719be2387a7b10ffad33d1ede4c22a348bcddb086e6b5149eb881f0a8a07c58512041ce0bdcf05b46b737d8d90039db5f3d774fde3eaa9847729b09ca0fd5aac2d1da77d63eacca755a9a4537b7e1d79eef3d81686a55e5a929ee77de9ce9d5ff06871abd2093edc1ecd81bb6bd3448c68fa1ac2454cd33017964fac3ba86d29fe8742f0177b539a6a0fadd9ddb59015783e698cbad07f604b8c2c71a3bfe0c45900560bdeb92d1b4b25ee09c04ac9ce3bbdb58a12457e8cb53ea8fcad1a8fe40c31f5dcc6ead2cc9ed8864c90a71c0615f3eb6152195f9cc22c3dbaf794e1bcf56003441780db2e16f398cd62dcc141f7c9f2542f07c628e979d287030b2cf51fd60ddfe0730605af08106f6b25b7cc401d19c5ffe8009297f0473d9e1aa8b55f74cbf1f5e9bc802118b3eded81904998698810f1f34e2846827912269d966a769a830fe40518b115c735739a370cf45d6294ab62345341e7d67496523d2260f0b3eb60065adee054f3d28f2ed0efb930d218d28263c06e7f61814739cda5e95bc864f67090aad52f6b797eb3276035b3e4206ee326dab5b1a7a2d64c7acaecf02833c3627f4a110d53d3ecc7aed68431fa268f7d7c7d4f0bec85534fbd322d49f0e8cfe1c4c1080c8d9b1c187873861a003009445d50dc5e5c8653ecc229e18399e26ad013c08617e115e4a5180c0c13206e38dcc088ca966e9f68205e89752daa42887818eae03a6f678edb95f8d8bf4a2ab03d30545af4eca87c66f37f241140521388cc0dc3e4edf6f48abf79cc9e3588e6df6065d71e69b7624bf8a42c79e2b3d2666678f6eb43367ef3cd96ed6986fd3592d6573f7e6aaacca1a4346085e014ed2677e58d3cd07f117aa7e04fe097b343e73898acc421109ce369920df8e44e0f07d45b75278642df0cc8434b6c9f2c205e029a93bbc03a623a9eec2f6c9df8919a95c7170e905f9e6cc212acfc02b1dc0691e0d2705509b374570d34dfd11830aaed11afdb1ce81a6c973761e329b7ea28c4e89a26c2d7eb3a6fbb82548e890a5ebef20fd52032801f2e62d81097266a9f9c88e766b48f264583d268e2ea43edfb7ce3fbec8447802215c85967328be586d4e3ef8e48aed9b9fb53b975f30b24be71ff2a3a10d87fc269e01f2b123a1005cd6c51056b6d16ebe4a5772527071b98c89881bd4f6ee3100e0b083872af3269e105e1b05d24445a396737c8d62ecb90a699d311e798041e922b4db750b1ae710e60fe574ac69a7e475a5f63ac7663cf2851c8bf84de430013924788c8f3eb9ba2337d2fc4a29fd4aaa96b78b4f38e43de06013b6dfb33d6f04f4439ddaf8e553238f37c6ee71077ce2ba0d2c2e9e3d6d885dbef742118629e2d78df299448929f01008c71c2458f29aa779f1a9471733f06cf4c8bda195d0966d1d79585bd2e24b52166188307bb8f85fcff608904de5cf44820a9a7d6e69cf24327662296b0975dffd71a56c84a67733689d1e467f35c3a03d3cbe6465ce56cc0300885d8585ff336da0440ff95784b9022a8a0fd482c6b29802b097dee96339e22592532c701e97307be8d6172030b23f8415dfcb2c4cbd2a05f56b3b330793822f60f0fde08f3f2bc9744554d14eb455654d5b60536eedc5dbebabfae3a6408c0e511895bd1a0a1996de5136979602cf28cc7ca616cd1bebe38a97ff04bcfb29e739bee13bc4ee3308a16bd64f4db860eacd40c4e107091d6b3610e451d973e2aaaa8797eb7f4204f94b8dccd967dbf8b4656c0c8e0955c021b51dbb548645c44bd53e85c699f7de5ca519bfe6ddcb2a0d0a9c228511d25249dfbdedd85f1303e872bcf48c35bdf85b7e5b76dce5e184e424f66d46990553ca0064551b91c557548ab6c30ca076b0b53796c396b97d1707883a365b26eea1c304a5d4134c2a4cc0a9227f37d09b740aa6f962d3d464763dcce6edb479cf8162efb984e6cbee2d8556aa9b5c037a195b265847acc59a841625d6b90c9cc015769b377b48d33a43374a38219e14cc304918bc9d0d7b2e461277727c713f749852c6d1fb97a59ff6c1d0e5c450aa444bcd383061efd66b9b91060288ef26a813b3f0be6a3d0588962338468f84accc5f8d5de09cc0c2284e0a4f4901f1b10fe8c660883c1fd1dd1e1430c865402b6da8ea054eb3ed704aba0cf2374d5d130d023ff7d5696b1a32d5db6804a4d8d1c6f438fdca34b84cde8e7557bbfa70441a3ab20dd76d6b0a0eebc5da34f78fa044ec31730e88a5422b8329f7c81c3a281a4528ef6ac6a1655188d1165e30c561921213eb783ee521e528c7ccb9c8bd4082145cf7123db13508eb9b8951a4754fd9164a011ed258efe142c91b541cefc651a56edca3d8ce6190cb6156a77663ef192bece148e8ebcb02f9d8236f7ef937fd773f86ee4748be38480aea0609c6665eee61207864bb6f062a9b9e20b3d936b7e440aedc2188b3a8b42c96a470d612350f656317f987436cfd1e693736231bfaa71216bc6baf9cf23dd4fd80ad15099f445b80c2819b4dd880017202f6f9e22f86abe7680bbd11b9ca5e860cccffd805dd230f404303e8b17857882034257ca7b2671b7a225766e3a90ae687fa374941f288cc190529f4704d47db20ac1da74093372c127eae6e82c990acb74c232991ca211ee8f19108251bc9d8f499821ecd9a657acdd96129f3093490302c11eed0f724586d848eac462f9807caad8a20b20d12c6986b15158c1bc8c4551bf4806a4148980c70f256b1e59f21c59a010d7e19e680add0792c7386e3c433783e383686f1ca3cdf242d4d078d8277a48160811528f9472863c3f74bf361059be7b0bb3cfe353a6050664392226b86651e700ad44c44c15b114e323abe51640a7f64432b044fde8f732436683340064f3d3b358e09d334e4065bfa89311a4c527079dabf262e8bf525f06b93eb8dd0e9c62cb16c19b7f62ef563ac3d7332cfbc5b3e0dd906c8a080c70df682fde853f4e16c6d301662c51fb1d1b220471b7fc5ec00dd04004b26140f78bd80c6e19edec44f609313ccee5ec3c68699f5d8b788be2442610a82c36558680d486e05be6b98ced0e614cbd91fbc3949aad8571b6236f0e1e627c53a60d144a5694f1388119f109fd30ca28780c52dd50946827bb148948aef903535ead7ab59e55c4d88f02bb47af218e6db75135062e833c1e564e021459650fa3b744ce26a72809f55d27752f6f3858621c5f560a15af2e28cee02e91909e9adc0124d8ea6c5db412fc1a050a8488a0ae5f7132fd6fdac730663b9ad7e9b9affa318c1cd34d73463b68cfa334d6eba0ffbadca45ea637da0fc01686634731487f0a37d0f462b0fbbeb9f4f8eeff789156b32804843782d03461b0930ee32b4b0adfae25dedea084a226fc1acc9a0c4d694e61e42b6a6d86ea1efb60b94b99eacb3aa0f077aea0ae5b857b7c525aea1f0fc35ea4f99f56d4e7bbbfdd30af6647f97697992a1ddb5cd2cf813fa684d2c61c9b08704a0871cbc2641a24fcd1e5a947257f61229451fb371697224c03e6fac5b0597a06bb29747471a69a59cc036c45a4cc2738b645d64936589254604efef1194472eaad0be37267df1248a1fcfa4437a28fd9e4aa6fa96a15fc2f7438322b250a88bdb6b12e118bc016d492dfc0cf0840c5056097db5c473396a143389dd18de4c4ee5566116369e4c5733796da1cba1799a82aa77eab46388d081a606fab5fb89615f8bf037244abd590857239323608e4df2fa60f86ced0da7d6b7c2f81b542aaf116bb759e908e1b811233fd328a1c0f0a2712751c986bde5417211afaacc1955e64b6b48003b526ff96031b69f7d33a4b2a1cdf3323b2de9bc79c334281ca1baf44ac23f1c7c190c8d35d318801db946ab0fffda27d15613fe9acfe80958d69168de5dafaf194262a64af67cdb0c9263a3df4bc35345292504539797f5728e327e67bebc7396fd288c5c3ce2096df3a37918430ff76c8e520143a73fad335b2ae2254f9910159b4260610d6e19742902bd89e1bb32f1bac94c20833952d93b1f145c908b8b61d2819118761a2a8f7e2d00b99646b75380bb0744c695755848abed4b9f006d9310853c79663f928ba36e00322270910cc9e1b42058f3ce5e6cd71cef7a7e22aff0cef062c82ccf178f9e5ed0f2c6b8231748cb4f71b9691bbb2df22c49ac0858afd320aec1e7578d8352baf7c03a8a2e36867ae57d21a48eec71843d73e77f4ed798143e2cccf58dbfb5e315e4082c1eef91e648b0bcd7e2f60a2c13b079ff8d1bf4a5bb44135f716edf09be4cbc07702d1878627035a1fcd755184051df04e2f5f559d05c4d6e2714601c59dcbe61fab40e81448830f477c4f8e2a503f69e8cbf028b1c037f7bda3990b8801790dc1da8c5563cb9c0dcbc049a2c00305c2ef66ddf000281855bb8862983339ab0eb9935c37dfae22aee3a7e4ba262fa9c66a71065dbd534abe22573e3571b8c8c87bfeb77376ee3fe5c84008b4d76d02aefa6013759acccb126752485b3b81cf8fd9231e609c636d8b69e4311a99260423e433ebb35fcd220db8da0e1adb3b51b362c0d995f88af9bb593e117782caf1bee6ddbb9a77258c3a549ecfe60d600dfb2d5170fb695c993f84ac08d96af298defcd01c08da45ba4a805dcc0c10af8cda3fab7e1121bded5f83683bab70d35ea0edbdbcc0bb277f2365cd1a9b4dc76cc9b5becdcfd2030b3e6b66493ef48ec9c6d4bc57fdcc90907ec67af0dc729640ba468608db530f54a11dc49303da674d0071bd4ec16e223b5b178716793d12d7771374e09910494a07a8e5853054dcb80811885ab374ccd431d88f529d3806586b3e87a7582c06af0ae59f718c3a5ee818b064b9335816ff5e043c08f81627ddece18b0be9bd50ffaa7c2d5df39fd674dcf51c2dbc30cf7892ca3d251a79e4e6d3cf16496313f83c07529d1f8115744238eaca3ee43c487910d36313bb6bae527efc4552ea0618a51f97d4d821acc0113070c8095ba19498cb34b021072b58a20f4226801840dbc07f6325b632b9a264177004522ba1ef4d671aeb5962b04c9ee7367c3b4bd1a1b004da55307f4284db996509a9d70af2cab42ad1f989a950c4f4bc34a6e5cd398a19353cc4111c58eca7f276487fd4c9c8e9a4bf2cd126783987ec3b94532910be04120934a2add72334ad1a77518c0ac3a86e97780835e8c775f9106bb3332ff46a746398880b3a2adfef8c0df0b6277728c058ce39a8b915f04227e06f2dad03f54b47b73bbe3f196d54c0f7798e691e91f0660e21d83e5bbd49f5cf96e613c9663c3eff295b519fd4613d6b074c6b3e8f1e538c033b2cefc8ae1750903d43dcd11a922a5b8d1b79ad21b54c3963b7b06b27f05578d114bde4b7db57e85dc02d90098bd47db530e389b0e6d8b618df63123df4cb2de5c0de389907d6694a95b0666dfef9d8364fe33824721bc54f39008f7f31306897b0d95bb13f6efc4911d60779e91e59dc5b4fad7360e30283b6d7f4bb716048fff37507f79b6091471136942d702f27d9fa506ac259a7faa6086afdee316bb692d73e24d54abe64be23752430c18bf49f12159f18383ed909247a54bb97c6c9f36a309948a8b519a4bc2972d61048ff821f2e3bbe0fceb8412c1407321b4dff506afadb638f121b0bcb3fde9d39c347a25a29c6a28bc8c915c63c11a2a4b2a212eff24570b9d870512c475f8ef42f67431df7d4deb8afe788f35cfb668325c621b147baa1210eb3446a75a4eacc60016814a2c1abb72b88d2cc01b45b30bf7981554f8269ef56edb7fc0e3baf630ee310afd1d0a0c4082e48446d8857316d914c8b09c088c1f26af46973e94d1b7070f9b90a426a80cfa8144db133f6a7bbed8cad335b8c1ca53cc5f84ad4df01c4051bed01d0cdd1b82e060eb7a2ab584d5efa200fbe42d072862d327ae64b4199a13e37143165c750c2b00820cc172a08968560a61af2a27f31a2a5c0fc27488bc391dfee63f59461bb9975ced6c013db97250358def243df68f339401c36571c792876fa36a98f4bdc8a82e7dcfe2fd05b691a3eaf920ab2cd764063b10fe6862a25c635ad18d8204e61f278c2323c2dc0fd8e2858d8f4974722d209a4b2e6462dd62937934420294a9d392857b317ba16cf4cf6ba63ee879e98eb1214b4426987102869f516f4734762d9668d71091796b437c4ab4a354544d45b9f51c0a88c021038fa5b92029200ed37a4eaa358b5743ab8d9f5031d1f352a2cbb32c52a13cae6e20b948b23fd316cb724efc81ffd4c3703e5fdc8ab8746d00b5a381cbba046660a585cf80eb7ff4b087ad4f5ba0a3848da1e4ccfbbf307d951115e2742dd6d55b253740afc0f2dea96b4e819ab6a23fd00bd53941b043f30de0b6078a252159fd9ae1c071dabc19a88bf20edacc00465f8b6211c0ec4057cfee22433b29031ab54d21ee257935c9cac05b6636b18c246596b879aaa3ec570d580d021fb5366117b6d886767a46e429d4561d4a0e51b73b6a41f482c373ba3f8205e38ec19290a8a92beca5dcff526733b094c5cdb41ec045e1f129d61e59fd8e769034b7ce909a8fd11eacca831da7f746e245837b1a2260c80e413e01405e5a4b6087b2256d9aa4ec6a596c4935aafcd23635c4f14c70284396c8c8cc5461cf77e08d0cff08a17d69366d271e2ba1c2dbf214724d7b7f61f4a830b4f8284bd48f51472995a6d24a24fecaeda57fa47c84d8430f3135a1b9f408218e936af435b29c2e5119c58cce00e5ac2fb38dfc423b3d2e39e8fa45a8a507a8dab30ccf5590969dc03a5c25801a848aea0a02cd9e8f2e00bf18416c750aedc6e868ec3d66d5e8560fdc704319b4c7444109aa365ee2353e5a958d1fb3bc16ef7f828739cb7b9c68d212019439f82973462d34588a5724514bb2156e61b6d36fb5fd42960887080682b456fed99ae82e55bb683a5773d9c8c64a20f4cb23f5af676c82ee598c77fc12b9bfad64978bbb9b8f563d52159ec2ab6a79d84e0e91afc6e794726315c6a62a7d8137013c5690c4c8c3e7f373e75a103fe73889aff40e68578002334da42b93dbca7e2334e68a28495e56cdd5f8448adf8226931b77e9948993a838815d0bf05684aa4537c7274d7bc739c0d3eea6c6c4a814bdb56785e657a5de38a8615355de62760a1658c72b247e4e32aff2ea15896f68b00123ebeec3436cd295bccfbcafea5009704ddedf2cbcbbcb268479351dfaf5f5ccf59920f35058204a5642df36413e73278ac4662220e6a2a282b71c44adf1a11250e6e0ec889d114019ad980a9ff2b9c6c45bc48492c8530537bed37f295e4e2d5398e23346bf00940c4415e4fcff0661d245cd511c0a18cb8d99cb9c8b5f62d88899ab39da18b147c60421e5216260ebc6d54c79d7ae94781d5d2ba0ef7c3bd197e3436d9b2cb3471fa5f3a687a1fde93148e49d1765d0b4f491e7a4c7ddf02c51107f91d57605a1d39b18a52cc849bde9487dd0cf24d56a869dbb8051ee671f5736360b7f4d6fc383c6d71473bd15790b27def6e5ca8347dd8f05514d03f31cbbf9198d74646b798a9f949fa54214060564d995900bba493af79b7bcfd097bbadf8f5f3c863baa8fe0a201d5944bfcd3d42a84d059e7b2ca49a0529eb7c1ef821c13eb76fd549214fe6ffe7fc4d5b1b1654d39a022c7668fa2ef9f8794a2df01c1c6b6519c0fa7a22082cdd1e0166a0cbd2487859cecf8f47d412538a0d2d92cb50194204d53c9c90c17f2b9e1c33d3d90860400a9140299be46b55e3f73ed9caf81e0cc5d87cb696651070ed56758cbe8faf9afe3e3402bc0b7291da246db13190cc81d924021353314020dd4a16af1b08d43df013737a14f66b13bb203b999ed5b6dc5bccfe3f848ac8ecbaa63d3f0f92b1d0fd97b294859164bdbf4c7e78da5e751af77216ece671b6791b133b1d401054f2127c185b7ba3feb11e842554e9a63459c35c67f4ed5d4bd35b135b32eed3833380e690dba1301defcb4cef161bd0c12d72dbfc70a92be18a9d9e0e231e5c19ea77ac6876cd96687f737405c4e6999a3fc274a0b4919017291a045a961000b7d577595c035419e3e81e00b2a479c1561bbe2087ffb62a6a8c10106f3e431472d57562759609afbcca3d932bfad209e4e815b1283a5a3104442c01b41f25d77e95a4d8961d8beee233cbee640ac81edada8b5506a0a7621668b4dc45eef54502f4abc7ed4038c038001632dd42cef0a3d599588f17672bf2f7a1fbbfe83eb0ac09e38ed7817fbb018eace24f1ef1e1316313f684aeb1879ecbcdb01f5cb546fdcb77999a64852af2bb6dcc86b1dd13a7187aa59723005cb0ca2859e0c1fead1e874d1dc59cacce3d10dfffc4b7371a39f284cf4e7e580ab57ebc79c74f4bbae3bbf41c4ead3d6474171b04e5b858811043ed67a5030640fc8114db5d4821169c726db80da23c316ee7a4b2022f037806ba214d06ce3334ef757b5a800ed3eb8bf3402902f2981bfaf9f5819e8b14b191b94d3a2aa294d0bfdbed38a5ef83f7355d380fce8196ea27d12b5d60f92d843b880bbc21ec3c4fb4d04b859aa38c98c142ba1712092733fa92a039fa5ba6a0879f124e9a1d9f995404aa5884053dfe86af436bb4db18481fad6263808aadf45c3b79394bb9048a6b54ab790f36e134da7e641a5baab3b55ed9112d6b3bf50e718c4e0228e9dc92f999ff00aa7e1e80ba43dda01175f7063976972edf7b7a97af4a0111854a74ca80c97650770ae12711466536bd2ebea2809a9ff3c1a99a5e0a8dfb76c428e24a9790c1f07fc12433e779dca13ae4a5c2eccfede4e68d03c95f7c7a8702f06bf460b06220d58c3c3f4899b193a06fc0d619dd36dc5415d20f559e5cadc5c25982a9301a4236ef6bbcf9df586f296db797e5867ce46e67412b4cfc0a9f446a4a9862e393bf6b21f66184e56ba7ff30dc0f75b989945c26a40b3e747ccbf5f9e4cb327c8037e2d011aa33cf3796e0772fc0c632c71c6b1e6ed3f30bdd1d1a06b805b8e0ac508b1d9acb74f28190d57e8afecb5ada31138125acb629b8eda76e47a7fa3492c87a74bfba685e7f3eb6bcbdfff8920093220c241e960f5eb291e2db179947194e27d0980d611858f658ccea22f42a9373882f4b77b45958c94bf8083a4ef003b3f78f42a3098535d4599212461f8e113c1969e22f5570e2062608d6d9d1ab24b0d429473e668f1b361d24ce5f1ebae79baf77c72d9013ea1d3e0fb81d0bce5c550650b6ec3af87b27629475e39bf0751a706feacf2a15b90aa9d1871580c5808fb0490b9625274cf4640919e585f09e01d089711416f747d8ba9358030a678f24579f7a58cdcdd52be3811a67220ee5a5e3e089facc0835c53376c0d1fbcfbd010da4637610e8c69184519ea164b1090e051b4e2e70bd4b3018160df9e9f0891f30fa15facbf57296d6b96f0edffe94cf83f4caeb75b2b313f352d29aa9ee2ffd412c64f78f8ecb838dcbcc4f27a9939b7860836d7eb23018cf0723a0d649995586685e1f38b9c8a68a98b8b377b9f44410981e35be4781da686a64b5a5315c8565251c77b7636f28182e467fbdb66ab86856333ada37b7ef39c5e5f49ab1348d8b4583a46cc1bac79580bdb99ca03ec2156bc4c8123b66fca0b33561e81fd9f4157225bdc3ee90d99f644c06119eb2c11706802f3631cd4498836a20c2594f633d713c56a883b6e1c7d1e8848240ec58a6a31bca0546043780d18df81b9fd8268de42d214362797045604c7fabedcce812f071f3c56ca38f3680410ee9ffee4ac9aa85d278d0e2c151df2a3c210a8e39037414ca3bf56709836bc753dfc3d1a8fe87f2f062ccebfe6ca9b9d8f94ae577d483c519cc964675e13aa7b4c17c83bcdc1977a2673187143dfbd34cce67739228374aadd899867122a34b2701a7a03638447f51e2e3d4908f68a026783f484198e0f924172cf3e6925028f56749b8d6ca89d94fc5706b4c93bf726a3ff09002ba89f4eff1501f3f07f1d95db1e2a1e56f80f169bbf12ee8643c7d685692a69dbd7d8716e9f4eb60df34cd65725731d64a673aa257b037c5275e60fc04a97e67df5b400be3c729d90f473fcc69a8fb565d5630d2810636d50c9f0be73262a84ba620d78fbdaf1f4887ad66e7f0bd16f4f659d4fdcc30e1ce3ea26f0783c26dd1b765b316f58fcb2c6cb7dddd9703036caab6735908b84de87c6d9d8fc43e5117ba4c2cfeb723b141c5e5d59091bc8044b86a0a9602ea4f1e3a8d03d5982e3d90d0d42652cd6a14b8066f32aebd277966865b6a0bcd42254ab4e38cc3c846862a22dabe107e456ab5bb9b7e48f8f37b8fd8a9e151b2a38055c8e88bd7ac19b9752fe7d5467bd13c336f1c6242a207ea1709a8405553032c063ac06511229e98904e966503f113a0b0fe032f282ce9f8c10ea86aacef7a814e96d18554bf5f0fd0bf7c7f8c04d7c0d5a692444701b1a9f6e28459ee568ce957c3f9f610d7bfc493c63a573e2acea0c2f215302358504208b158c7c94530df05b59d449fde08f18386fbec37859ebe90ef337dba2c09c1a8084d25d8d467e03af2072d349f7668d45172011ebd4af3daa09cb6e066d040b6f3c94ee3200cac19fb3fa45e453193c78c12f9420214274540f394a5c86510e3d8998273cac203c351e5eaeebdb71f732ce2e1e0b34d1a576815ac0cd74838899e74c90bf0cd0613d3a1df55249e704319c4193a17a2078cc923c22730b93c84ec60513b13c20e9614625896a6e463d64fbd1d73f46e5888be81a25455303a9de6c1af7df5966e168ef82a1dc4b72c68b01adf2ebf61d40af4b7cb8eee55cc6fa7d3f17d748c4a3417f3e32958c683e996bac8338aa036715d5f7a3692ce5076750039cc89e3e9a67a4aac7786780c039a4af09234b4b8ab711db721625c8059bc6dba417af7ee859c54322b5ba87d86dc788702f75ab6552f1e54a8f20d717a6f11bdc6eb090aa96834141972e8ee6a8eafda61a5cfabd8c89647493bde8f91276653c2cc9d0f70122edbabdacacb7b135dcb7fa2834e3e84c14d0164cf97ea7d910c24512a685e1bcecc5584332bf027f8e4acc7e6cb6a51ada635b7693bf41acde86dc3fc8a3e4dcef0beb20eca920d129ab40ed072333bcf318846713d14138f34dde5a99850e435f2be428b5040f510a07bfab3743fade583022312b4567acb6f569cc7c9c87370a956e6417b9409350c58801c8dd09e5a6c3c9882032cc08890bfa0379fad9e956c74d4fc7ea95b7073280b3f0c5ba774a8050966648bc66c0419ad5e2eb1121862069fb8f903a726237182bbf4b8a80f052efb47fb7f07188f318e0e6d3203cd2463a83b82491ae83dcd29525b6d3f2e69ad7a6a0498521408087226ebc04a252c1d21161af46959ad07233f5160e3a8daa9a4ed8bf57c026a0a7e234ed31792bccea31b39985b3c8f011e28ce74beac239c680669d7c2b5a2c0fb221c5ff24805e555e97ccb144743d893c08c0039a1b4857b81a4c13c3f8f6b5179c81ef44a216de06cad604dc81a72b79d9bc7c68ab8d0e5b6caf50e1cd6f9d776c45f29adc1da310e34b7c7ef3fb1de622855c3f9ec83b744257490afc0acf9a973a339a301876168192ae572ee1ca91e7abba36beccc767e6692bdc9c2588524557a5c31c7f027fb5cf49f38f413e99326154a804fb48765041794c9b83fbccc2b89ea65687ca4867db70aa4d688c515d1f59a34a4001bceb59bcb23b22b0088c315a8326fb25f14f3f9e9fa71dee2d918e7f4bd3adc9d256c0c9b3ae9fa48f4118dee9eeaf507d1ecac59b336397ca904aae5369c56208ad29ac645eb80b525ada9a9a166d23b40be7fe2bf96b11360156166f3059e09f3aa68d7ae53f551458c7bbbabc9bdb7916e44b635b9064bfcceb2d43003dbd67f618bc08dbcf6075acd8ed8ea6fa439e99232c8a6c509870998093068d9b0c240410fef5e10f382d4ff0bb880fe2e0419c0cb0d80d4c29ddbb005342dac701bb6607f16cebcb2d0f5bf86511630f86d583b83e25d5be1aa0055d40258a90590f157156ab80ae26d98021629fc701ba25b932974d930852014c01c05f2bfd5bd9eb0a79e70e6363ca1ea3fa1da90006c6e432d04106db8cb4a00d9710340530760e5361c00940d6bd5843626c8504dd0b2a1093b7e1b0a00cc8f4f7d1380922c6dfe9fda8b0d6b96310b920d37163d36c4b2c27f2c5a36bc52c51663c32b555776d8108a0078f96da8e43500526c18000c5e0216bf0d61e84a90a10424331cef522541564988e0ca7f12705cf9bf79f96acaa90a6394cc3733d54c4dff8f1a9893231e18892a0245a4c99027214eb02618136cc96784ad11b46c88511b12619436429311928a88461c8639336f8c9f4e0d53da40bcff470247478c4dac9f20b5cbc23a00a271f0171155ae20b8bc7091b753a2f85855ae18df2788de300ef7c3ece19d0dd503c22b4a00f449453b383aaad5501e7bcf7f7bed76629bf9efc2ffdd35de865ac7b53bb0219aea4d54b70e59cdbc3714ef6e194d226271ef13cca1bc3bde5a15018e086c4408a3512bb361a94fdcd571d92ac2071e1d551e148f837f5b102c4b9bd54cfe1b99b8ccdd53c7ab6173c7eea6c918259b1ee933a39ca0ccfddf4c94f46c191445acbb8195ac801c2261ff7b6c5cb58353776276567e50149255deb444b1bc69a1bbab5d92ba0b92d510dad410c4108e8480c1f70996b7ae9a51f62263f19737ad7d8247bb369ab71686fb76cf9b2ef1a883d3e327021fd892ae3b15865776dbd20d04f5dfc9ab6e833ad66ae772a83914fe172111591be6c69c489237872407c10f8e1b67db234d2adb23a9e296c0246b93902c138be22d8b62417c6a74ff477a1de11ca9a396235b47473278bd39e03f72cbe006fb8f2c7a33ef625d781f9b0ec34be7eaaed6450f8856881710df5040fcfaadcc768dd908639c95592bb355d4f25f34226650451946b53ab536b5b64666fb2fc26b0d8a8a930aa850400502918995a54af02d9334342f89f64e11aa52f654297b7e8090b1f198379a52fd3f1228b57e60f8e81901878f0d9fa1ffbbd72867ae54a348c9d012d342c68f0a45cb0fb3165400001805402d4cc043821d110c7db00a54ea80e5f8c903c30113ba4f171f2e6db6eeb4b6df76799a771fa8fae44c590631b2ed6e4f367ef28489487da2c1931d55350b4c560ba894538a290527c526458a141f5264f4b80c10468d8ad5817d8227de164b168301c39105af853f021fdcfc276d643db12132c00e701a8075bf90d48f55e40733810534d4e08106704242635af8e15c5a4c60850d4d6cb84b5aff0f844c942a254b7afe7f43846064fdff9690d8f9f2ff4ad2e46af881a6b880057e20297e8e88e2ff5163b5c5ff9c99518cde9b999eb9134f6dbc75b1146e32ea194e0341f1a81eca2b9d4c2a546b2bf489f374fa81eac07654b3ff545e3f60230226021e01918c46f39effa1f293f55304031f087c2c101520281958a25259e03d706f7ccbd7664f7c97667886366110b240325fd4c476cbc88bd3f60431de36bcb71e29d39b54b2a0a96ff8d437ae7dc9ad1f137c3cfd3f40d0f9472c4292dd205b253604d12611695555525689cde29897764a353acd503d4335493b71d5ce99d70ad5246de3b4bd6089158fac285a509f283e9320d99d693423a41f3ca4a422235bba896c3e46135b1f79a73acd65d4d458e6b3a307111fb9f02c67e6d93d6f1555cf6675b78b350aee7c4ff492396b9e3532b569e291670404c53d20f6e2ecdeb7c8bc44f7c982362d22dae3b58d9877b115cedd2aa72ad246663dc3b95ba56758161431399a19cd53c4ae3b85c9310a1577ce61521c716a8b7ae6edba53e08865239505d35b114e13d929228ecac4523d5b8f242f48de328f5ae7ac920571eef2345aeea27d95d42455647367559398b095f799def089b970eef26a92a6ffb6d434f1bfec3589508fd46d7c3ed5108ad1041f2c516a051ed4508550eba5aa8a640fae48ac20c959a0839ad16e782b0cff4f793db2c3489c2341ff8d5c61a403369c1245b72f54ed2c4b262353fe7fdfa55e973e4932a3b411f72e0992b6ab271688bdb21b581b65b7d6badba9afcdca40b077b97aa9ee815a4a5361582429bd459252bb7379ed0636c8deca585c7886519d1535669b89a5d15469cc4b6345d2e99913aa677ae6349ed749ebab10503d3b31aa67635e1af3924985ea99ae7a42f5ac8253541086a82b92bc4c201654f3f69897baee54d79d3253cb046e300bdca57805f2f2d589519d65e29b9977b77b360137ceb2138f16933874632e4de6a6a8331331c930aab3f43ed39bd17931c964c12222cbc4c89e4c8cec2dad056d67de3822138f4e2cd8854711b299da33f7f0ae88c8823d52b4664632da991714b768f1b64a482758b4897e90178d7120a6810d0347eec2ff1f638a0a0019f04ef378779f60c5206a8761ad56e3c2e67fea0525bcb649f2d6ea053caa0f1d7cccf08d6a721f1d9dd5b6e1e973ecddcc5cdebb5bdef1b2aea6dbd94c797bd77a9787cfda986d150075aa05ba8fb8376223f47679e5110c014c2cef2aa1648583cd0fe4e5c7bc39802a80dde901d4e507e22223469509b4e507d2d2a54ed026eb0175022ba014a51f36695e795c79cfbc5793d9567948fd09f8816c6021aa4a80e6c7a4cd96cdde0dc3119b5c5478bc3704fc4035b0f0b4e30c79c2ace638fab30f9157e975716da5e83e45e069b3dc859075391c1e6fb60b0504ad2759585734ab0faa6653524e3c806af2e4d4c4b4a474041ac9bef8c25a50010028988087043b2218fae2ab3a72e0f842e80b1f2a3582abef13d428af77deaec592ff76ea109bff5687a4001d80858d66db0f44c30ce3c5ba1f4886731cef911403f5bb40fd2c503f28cec4ca94a079e9c787a6a5be2555e97101e570e11f4fcdb5f7add2a1b74c37500c47886cda78978e10c1fb2e8d3090e7e974d324a9c4f403bdf003b960e632797f2003a0a9ee5da9167e24c0c2af71262d6b8c9a41f5d0312fdd70d6eedd6ea9ce3275c64d0f0226253d577148d92788a6a5ed481010c9c8361ae17ca23ef7f11eb7b7e015fc7b7dd021f88ddb788d2a59403020194033ba9861850c0cc480036389d88c34b033403380f8a9337af0f14901cdef23fb4f638617f336213962a4089121428298b72969ca299797a668b9bc744592b7a49d67999ab91caf686178821b3d31af0b6713efad4fde5ee133aa8e5ae0fd9cf001bc8413d09029a9cf0f4a9492d880c47d8c60225073a4fef4801cc0faf4b08410732e0ea43c3e51febfc718e4aa8605b490b68215c623f2d41fdb1043a6208106221c50650b68acf015c303c517f5272b0320ec92a680ec78c0165fd40b51157c1d608609a4ece9a0fe387d2b0051517f922a0610fc44e085073b30b62bc2e1e78e0240b8517f62d8a83e7b828200c9e0918197ad3e761e1abc2e71e395cd17af6caac8212309165e9318e135893189abd72470bc26e1f3ba46cfeb9a2bd64cf1baa6ceeb9a265ed748e075cd99d735665ed7fcf0ba6687d7355a84826ad4237aaf4794af47d85e8fb07a3da2c9eb11495e8fc8e0f5881caf5f7b5ebfaa0812d221f485c2eb9795d72f115ebf74af5f505ebfa85ebf9e5ebf94bc7e81af5f14bc7edd78fd8abdaae9e2550d075ed5d47955d32668068d1b423164a8e15535e3ab9a28af6a68af6a9e5ed584af6a86bca6e9e1354d025ed3a0f09aa6ca6b1afdba852b8d94d7344d5ed310794d83c16b1a1daf6960af44dcf96fa3c68743c8c7cc955733fbd5ccf86a86f66a86e9d58c91573317bc9a197a35f3d73216782d33e7b58c9bd7326a5ecb90792dc3431904bc9629c06b192baf65ced732bad732545ecb649569b281a30ec9b8414346990a5ecbd0782de3f34ae6ce2b990dbc92a9f34a86cd2b1934af64c4bc9201f34a6685ff3666040591217a25f3bd9289f13aa68b3158bc8e89f33a66cdeb9807bc8ef9f23a0686d73126fc9f71a3868debb8f1d531f555cc9e5731765ec5d47915d3e6558c8c572f0fbc7a51f1ea15e7d56b89572f35af5e41bc7a9579f50af3ead5c3ab979757af1a5ebd5c78f51ac0ab579557affdea955fbd6aaf5eb4572fa6572f24af5e415ebdc057af095ebd825ec378f11ae68ad73019780d33e7350c13af618c780d730607043168c41082412063068c08c264bd86a97a0dc3f41a46f61ac60231f40a448dd72e4c80f88e180b90f1da4317af3d5cf1dac305fed708aaf1e57cfd927bfd12e5f58bd5eb9726af5f3878fd62e4f50bd23fb403851dd0d71d6eaf3b40bdeea0e47507a3d71d78bceae0c5ab0e1678d5a10d8e201d3c6e50e2f50633af377879bd0185d72e6a5ebb38e0b5cb0daf5d6078ed82be7681f2da85e9b50b93d72e415ebb10bd76f95ebbcc78e5f2c52b170dbc7281f3ca0589572e42bc7219f3ca05cc2b9704bc7261e1950b0aaf5c78af5ca8bc72c97ae5e2e4954b073720e011a3f1070ddd88e5a8b1e5cdeb1635af5b8278dd32e6750b98d72d5e5eb7c4f0ba2585d72d0178ddc2f5ba25bf6e115fb758bd6e697add32e4ff8d193268dcf88d0b2da00884181de001ed0187133872fc9005891caefe7f4653180c8ec3d896c7f49ab97dcd7be6d06ca6ff8f9a2e52e8a2eb22935449d71885e625d11675d1c12d6c06a09d0c3fccfeb0187e1808036cc7c618f7027951f372e1ad9cfb612e18e0c4b0167e180b3024e5ad0bdd78dc286c855c0018d3e6e901e2fb04ab1ea11f0442612ac05218f30f43e18451e3cca81f4680019cb877a5f4ec07d2c2a5a66198093f4c0076ccb52c58ca9bd69c377996c823813c44fc8fbde24973ea106e89cb6b6a1cecca610128e18791a07166d4a6c1ac981a36c226c974f6c3aac07aff7d605cb02eae1f28860ca0192414e6d2245eea9126d506e201757db0addcc550f7bc55ba7da178e509b5f3d4135e794245e9f685bae86d3275e6c2332576848c515d7834bdaa16201c1951b3f8609fe0ad600185894508df9b6a9fe01ef18f972bde0135074132a32999d1340c6bb50e043d67ea73a7f515d01d14c88e1552bf1541552c5145117f1504f8510bc31f26e6518db8b637bed5406b773e319a6acd853219a36ed834f1d53db19b6b9bf7eaf29db220086e9b9395553915555959149168a344b1cac886db16d9882cb8cd6c8b2e91053118b54f7c644659d05611d5760ec38ddb19bdfb8a55a235c2c2a7527aa2a2a865653522514bb4a7c68945352bd32212edbeba6c5e5e69ea7cb9f489a1585d51f918d141f6bff704172cea506034b19a76cfbc5359e874800bcf7cbea874a0a05a5b8d7769ea2eedd14c73660f3bd945aa135a8caa13265cb7d3b32c9d806235e553c51c1fde003973ce234e902d7072672a80c30b50010dfedaadab369e97ab06e4cb0f1b9f9a0935ef79abb8b8591a3149c3ba72da1cf9dbf0f88fead9126ae2f336d426d0ff95091b86a0d70a8b454428ce8521932b2561a8af307aad2c902556b4600e74b2a08ea12620c67f211fd9b4f0f74892bc4cbd13ede1b1b2a171e22a23f15a9bfdb19bec06655ae63c64cbe2258bcf6ba643b62c13232b64cb9efae94a5970b7afa96dcf668bb27a96234383d5a1f909bab39e99587aa69bf4d5789748327d1af78532c09a0eeed1519d804eb23788c5e95b2730142448908a04529024588aee53049e364b12b6fb6121fcb0fcc374b9ff780bd533259f037cb9e053a4668b0b3fdd001278f3ffdce3a96f692e6f2e3c03cd14145234c4c43c9d33f5f944cfcc281c159a529157cf22d0d4ab1a313eab30cd96d28698e1ff10bb83271e8dba320ed77573669675d96616cc38cc03cd1f25466de9c6686fbce57d97c04c8e178f3c3c450c4392bc4c62945eb637145b99ec8e6846ed2d7ba80e47856da288b705b58e0be7c4a2d292789749227bb36ddf9d95d02ed94673cf872ddd3ec819ae48619d50c9b20edb6c0f35f5ccc4bb7ba5673d2c54cf4efd644b69288a73e76cc4f849cf643464f133d918ed2d29d9170a3fa54cfb3c1764927caa8c29e2d252a852cecc7ae683a3ebdfba163110fcaf616ab3ddc34ef4ac879d8ca3d24f0440a4b951ef4461b81f86ffc360e30fbbfd301bce27fa1f767f98f8c36a3f8cca0f9bf2c3a4fcb028ff613028d73354cf9ee7871cfefa830bdf38ff807fd0e1846da3b5e153a45970d675a7c05c6a33b566b65d77ca925a34d2a27a7265c13de28c5e2e7b2de6324233102056c982a5c569eb03c5db47d1c639df72a94d7dc3e6353388736011ce91d7cce54d64436b6a4dd3faeabbd103528ff13f4234903fec090c84f70053c7c8cc473667e67ba25d4ea90fb871de38ef13acfd60000702ffa15e77b80241d4ab0e23f0ca53777444b56f26f1a8a7308db45dbcbb69f4d4e4dd27deca26d6999a58bc325f92a98ba7b4539277a634ab5eba844926262b13f3a898b8f08c579e5027c661aba6215b6158deb4f498d27c98a4f8f5986e2a06d41b900ebbcf0d3abc7079cc4b0e2f3fbfc699515728a695372d2cf2deb4148acf9ba9993696194543b9d0948aa667e35dba4b54a4ed9a584ff84c310dcb8a2d17806955c97be31388aa25cb521395c5457b77b1a9773e68353565311eb5594464ada6a698aca6a6a42c68499c466f4846088801c5630d23bc36e250bc732a822ddd36b3368e37d7f0c63b841aba6be3786b18d5669da1cdffa85aad5ab1e1d54a0baf56b0bc5a416d7c284bee4359aa3e94e5c87fa11d1fc272e643585ef81096281fc232e44358787ce80a171fba12c587aef4f0a12b297ce80abac10f239f8cc7388cc70e3bd07feef3188f1de88f75f00321c980850c5764088a41cb68c3186430dcf96df8e31586226e43185cf86d18ba8c099de98fe1fe1f3578e4e2f6c76cd7a6c9a53f26d6de020c3546658a9419a2c4a0c440f8635afb8f3dc9c28a5dd150f86356ff8308897d5024a977cf088e289958b1aa1895cecc2826c974099f9ac9ccfa86e6a531d79e588d2646377ea2db57b73bf5536fa9b7f4c362406f4a7fec2766e33b6ae5ad2b36bba967b1a991cc4f7ed80878a74c7f4c2ae644c645eff8c73c8829e961275d2552905d544c48a9cd1d83fa4161c424a984a32249259254fa634d76d9d4536836b1fed853cc29d6c4f431eaea8f2dfdb0177e981249a64f31a55807310e6242624c624b603268a13125b124b1f04c9930fa8bc64173f91f43f2c762c48ec48cc48a00d16244fe22a2af9489e0a9ab767abe2be2b7e0e6655c2679e515455e99daec95699a05455e46f526779aa468039be4c499e4e1270bc46e6031c62db1bc8cd6504c2629e26594e846de5b6d89258f8eb20cdde9298aa2058b781925b2463df2bc642ed3d30835ef4d246f79ea7cbbd76a5414457b66cdcbe899b77c8822c65925fbf3c5c704488e482ec86a5ccec455310787c45f6e146f5e89d1f2c4bc1ab82da849b0083cb3ec96362336c6381b0bb6126ca44db4a1a9f72d6b1b635c88c367cddaa46e432b2a2b2b27dba3470f5b0c1b8c5bc5898f8eae987f97a9796fb5ebc2edfa8fc95aad76a5fc7a7695fcde10bdb8c07fd05a718de8438a13ad885dffafedba539f78f50f4a9e2857c41d7f6d4fedabc1b14b962ca9a1a969b90d535bad82af1644c58bff688dbc2895afdf9e96ca0e545eb0a1a5224545890a05b7e1142a6ece9a6266cabf294cdf1409a604ed13948285940b5cb699a4a4df4a4184d4f4d8300a05a20c1185cc17458622d0863d4c9d71140fa22cdd86359b266d50d0fcdf279804c2107fbe55231eb3ce8a1aad50f34cb57817c4e5335daadaa3b99553bd042a597077bb366cb3a07969378d5a7497196f232ca7f2def052142633ceca962c88cd3c65bbee7882a299ef94257518879af87662f0a2b8075ed436b3f37fb328a0889e5c783635e4ffa664fcfb048d6c1d19f9a48e1871427372e436941d1d79308107420741bc654562119148d45b3a5ada6346f166e26beafa9a9ebe2622df387f4c53dec361bcd485968761f99682fed890ff32624268332c0f6a5a4a53b57d8247438470c0c1100e34383675d356d22376d2c34ec63ca6b4eb31ede1ddbe3dacc7748346592cf9fa81e6db1e50cf06ba2555ffcb2544fea7ff94a0f9c90091fa633f6241fedf27c99e2455e0dcd975859e7a6a77c33a1278f7e4fa92049d774f2eabd110cf9ff2adda183f9d1fe4fb74b57bb88ccbb9375e4c4362c4884d93369b266d3bef5e6d34f1fe8ae83871c68d175b35b120cefd40f3a92dc8a5cd1d1788d3b6c43a749fa9de76a73a9f770b4b8d783759b088246f52bebc335f9e2d12f796c5696b83e0dd256d4e2cb8c924245f52d26f4dbc93607c4997c1b1b9f37e483fd84fa685f5218de69d00a9c6511736dcb29a1ebfa32a1bd68e7eabc70f6ce1034d0047f8c01207d60ede9862d21ab3de226b67aff6c984fed7b6d08db7d08db750bc3f0d7efcd3c0827f1a0c0559f12f031efe6580807f19c4f01f48484b072cfff5f4fea423ff0e2d7fd0ec87f1e307d271e53e29a081cd108be9d1b131c6e56058f4e8c1bc1e1a0342371effd84fcc078cfd8b0fc0bcf87e20fd89ffe7883d176f38ebd380a7819606a13e3194ded2566e82e58179e0c7037a807827de69177ab8d0635edd153ef59452a94d3cfeb02d4a6ddef3e907a2e939be659db5e31995a611eedcfa31f361408022a258efc3a0be76c35b4747df052158ddd677413d07bd138263339337bc35e227fac455f256bee57d6a7c3e744ca0089995f5e8d24386af8709b7a14571eeeb912b318999f689b3be1aa34efd6452edbd711ec7287d85b136ceddaabd7366de7864da681736b79eda38aa13f3521ade9a64c2e17c9efa69e38cf153d3a99ff63ef5130e6af32ed71e2f86da7b63fc64e2b30b8f6694138e6a6f9c770f3593b236cea8996e7c6aa6fde48e26ce29612bf29ab94ceb612768179eedad84a39ada52a77eda5b3f699c19b5f752cecca6999fecf362723b7d3c92d4d06c5ba2c4e22af993804d022438e1c73f09c4db3094e0e893a086cc5a596a0b4d34a51a7199af7a2479c7289c1935a5716654d452aa7b5f04117cdc27b897fc1b1ad16c793c2eadfb862840f27d50204182e4ab5e2009b2b5a551215b5f4de1ab28fc41b644f1ab631896b7ae4fc79adf861a674651e0cbb1e37fd13f1d2abc8777b70cc353a3f7d321f41eded953e3486d6af39ee897c3852f071a44f4dbf0d41f0e2950a5325f85b5da8c2a8a66e59455736aa264457545abd5429f193e210fbcd4b45c0e019f360992659264c4ba9df2c2f01372e1e291eafff909f9fc968ed88652574e1a677e37b8f86e64f1dd70f3dd1882c8daaaa9a62043b2846405c9fa821ef00535e03a0cd1541be1ce2d331be1cead27ab27abac1f265f0d157ea018cc031f0d3a1f0d361f0d08fc766b9eb58df62ccb573c25bce211e115cf7dc593f58aa7ea154fd32b9e23af7864af78ec2b9e1841f50e045eef28e0f58e015eef70bddeb1bdde597abd43f47a2782d73b335eede479b533c5ab9d36af768478b5f3c3ab1d2daf6ede6441858eafd61d3aec50f06a07f6aac515af5acc79d5e24b8b26af5a0c79d52283572d74bc6ae1930515af592cf19a8598ff39724800002c6cbc5ee181d72ba678bd2289d72b7c78bd6286d72b02708508af578caf6e7cc091a3c7d08c5895827c95427c9542e9558a1faf52c0788d2203af51ac798de287d72860788d4284d728b05ea340f21a058f57283ef00a059c57281ef00ac5015ea1b0f20ac59457282ce8f1092aa0c0020d2eb0a0d62754787d6284d72776af4f4c797da2eaf5890e7ad43a1078ad63c36b1d145eeba4af75a4fc0fa24167f64a87c82b9d0d5ee900e0958e8e573ab05727aa9c587a75e2c8ab13e0ab133d5e9de0f1ea84500d63040d1a754e0eaf7310f03a4785d739595ee7a47374af739ebcce819ad3c1eb1a2d10e0902147895739675ee52ce0554e17392cbcca29e155cef92ac7f62ae7c9ab1b0cc8517a9553e4554ed1ab9c4f0eec350e9ed738745ee310f11a8787d73835fcb7115443c60e09846a1c1faf71865ee304bdc2e9e215ce065ee1c47985f3252454e15cbdc2697a8573e4150ed12b9c1daf70ea1bd10d06de58bdbe59f2fa46f6da260708befac6c7eb9b085edf04bdbef9796d83c68d166e30f0eae6cdab1b24dc38e0d58d0fff6904e17053f4ea46e8b5cd075edb5cf1dac689d73649bcb641f3dac6ebb54d0e124060438236305e9bb0e2b50938af4ddcd726b25e9b60f2da84ecb5090d5e9b187a6dc2c66b13315e99d85303c68c255e785dc284d725d0ba44f8ba44233e451088b536dc7be947de2125d9c28d9ad7cca51e919092acacd7854730e36d4bb7911537b8874e35740c7eb69063c117e6175fff1732d82fec07bcbcd1fabfc19dde1b9788846ecdb3f73473897557f604b9d8f35c6ab3b7898b24fe1e2293f87171e53d3830ad14174fb880e202c82dcb8cb6a0c2e2b650620b2fe7e56d21e5bf8c690bfbe9f9faaf03c3eb4165fde5318394b415866158ab05d90ac3ccbbe83f0f44f0f2ee7d8248495b4724afccb5ccbb5f1e199eb79cf2e86c98472a8f077976583c1fc0f385cb8ca25b57e191e17874c7737447cf7fbc6b77ce1cc5dbded1f2ef8e95dfd1faee74dda93b325ee62b3b52d8f9b223e6b7e1067657c9343b28d829ed58990db79d72d13bd6a2d8c9f1bf490b0520996017de51554a3ff688c1b4ec315950db6efb048f8eb6c2d08a1e76a2b595d4eea6497467a9914bcf504d627c3eed9c9931c9cbe755102158fa6ac41be72654695f28da9897363e351356c2dd6d62e1726729f25e0c45a6561ab799ac46bca350a56d45ebba534de3a8a4aff689a570541b77666d5a179ea15d788676e15979d362da3dec645685ee2b25a5d1546963285d85d1bbafd4ded8c4e8954235491b71158a69daa6549e788a2fa628faffa80d6ef26e95e72595c0119ba905f5d6d11e2f3e952c7862bcbb5cd6bce907e02dadb97b3633e7ca7404c122222b8a294ee7aeedbc397bc98ca33d5545d9535b5e998ee2167be415c3501cf1ad4ccd7befee5a592cc76154feeb8c860ffa8c1aa7f1c4ee892375a8a883813a5f75ce58f426399918591b6ce882459d06d4a1d381833dbcc3e2188579bdab1e7622e25dcdd4a2796f7aa33cbcfbb1edd676ce90ffff79adb64ff0e8288e8e63c6c1fd77c0972e58583b5aed13fce01c0147cb7f303674c1c2f6983955552941592ba72ca7996d92c2a282a281706ef8bc02315460ab0236d0be71f3c688ff208ab7d8b3d971e6330413507f0c879803a6a4d21fd48d93ffe3786b356cea32c5b931354932ef6a35b4092a9ad8f23181051339fcb933e5c5ccfcf7899551c28612337854a04a88cb1ba81940dae601c3059b1dffbca8fcf372fae795e49f97d13faf0bfe79555c256fb337ee12a3d9ec8d7f2c01369ca7d125b26c78f5e4130b7ac3e523fca4f351400d9b2cd7b312a31957c97b872146ef1606ff8f9a7ca2e3d5e447811d3f59309294a8e1ff94d85282f79c794fabc490ff7bf778fa0683e086b392f89248829604916321a0065493b46f8d0813389a808e09c840420fb87b7827db76fc90c8e13fa2cd111338c20b511151172e22928969f31d51f52f31316965b95dda9cf955e70bc9d79aaf057c25e0ab769124f3057bb6aba2292228d11ad97db996446b64416c9e3a14456b24138b8aa688a0ac6cc9cab6f0c923126d589e1a67cd4c327d3065b73d4c88cf08218cf0c1a2fb725923ba3e23a47ef0bf937f4560011641a70834ffd196b62915918022be22463be622c0ff1afc2b42c66fc19d66cd671c8423a47992a6032bd3697c8880f383b21888e81121deda8890d9d0eadf106a8630539535953333796fb45b46f7259dec989f624d92624f493b0fd13404d110f607b70dc77ccf5b85a68aff248c60c7bcd13ce04363c5ca6c884d8da6e9b66bcce80ff332a181098147082afe5b21cc7ca3d9565bd2a336864db0966e1062490f7b6d4288a3104efe6ff04f087bbb8489b5a10d62cf1f041441d0f98aac124bd4c386e8be24d0cf0d6f959a966b411cb90d83a820081a55f2aed58c22b0c27fa36d3462bc8d7e8838b3e74747677cf8d1fd9d19fff7f8ce54f0db1002649e33f388f10d9f561cc5700791c92e031c00840358388d308763a261c30cb5f199de6edaf66eb9efcdee546b9c25da5b62342b59505f5970c417cde9665244a444b41b67e67c72d9d2d428ce896211d1291611a1788b38c555729951def994b36e8ba4d636d19ab7c4340bead29209fa98366372c8999937c68431a2de633e315e8462c41c2cc50c116343af29ec12dbc3bb1a4fa3351993bedaed7b45f30ae1c4a619b5791ac5358da6b7f685b10af3c16f431a72e882859d1285c9d18d771addbc65646494d3a4eda8d4373057c9a7eda226d7d56d908b8b0be36d35cecc4f45900c2962c3708a8853f26619d9100c9244c4ee8c6e8d1725af897996bcf8d47a0b252f94485e1d9320438a24251d29b1a1a98130555959203933ebb2ede4dda9592846c9dd9d9e3dbc739a52b27ab220debaba1edea178636ddad9de16dbb46ef3aeb9714a65463d596561db5df2c9f970c6872fd738330ae3a728fc042ec009d2840db22e93129a491e6dab8735ff0d3c1480871278c8593ee0210a0f4c42789080871960f68069c2083065c028004c0c60b6c0d0c01c01630198195ff230f1c50159667cd1210b04bea8f045f7a5e98bd1971d5f7eb0d4c172c3ff5d8ea3526f87f4ffeee15d167a72c0629f60ec00391420872b99b54bac89491b963924c941860d431caec0610e0e5eaccd35f0c38183ef0620709019d93aba9d1b871c9f02e2d8255666976c1b5a356d39e1f369c4e845aba8c6536b9c1935e34119d90ac31189e837d8b801c67f2f467801e345cb935596992f59451b4d252f2afc377115ed25c9ff77e1f1c43ba88bece7828f4b9a7d82bb76625e93d593d298490d757454aba1b886e25d43f1eedd6a3512456b28de78d7363e51bcbf1ad07d8247475f0d4046160e902547c307fe5c2ee32ec9a361c465bedadd34b954846de2cd1ad92451bc89f84c731997b7f289dab4d392d2d20577b77cda94d07dc92e8c6f190929092cc25bb41abd38229905f569b9349405372fddb2dd3e6dda9a9988d49af7449c2519cd444bcacca24b44e29bd1897916972d11d8bb3b3487d1289a28228956a3d63c539424f1d985a1ae9acc9ca46a5733a7a9264eb49ad5156d46c554b3726a9a61896999c3461b87d346173f49ad663770c4249736774666d63723bb7b67cf86f28a364984cfbb6f59c7bb674ea3bcde79b33d1094a64eacdb2989337379d31ba6d90b2c08043531364b3d9af744b23b836417fef1e24361cd811ea36186abfc73024e8714a112e4bce513a000b1eda1bc32cd8f13d98a249977a23db5154fbc95e4070950b7ef791b5224b5b86c9360530f297275295c2132803aff455493b47200358caef489a154c934a9abab2dc3c6a8ced22786d275a7cad42cd359d79d1a71d79de2da51596e5eddd5de58aa7749dcb4a5abbaee54d79dfa816831fce7851ab9b48ea667fac450ee79abf489a13ce91343c1b2e30a0e5762f84fc217802a303e715f0084782c00cdb289b8ba400923192818424107784cd1d0c40fb51dff38b8faa743f8a7a1fcd3576880ec7018b9285f12c066fe7f49122c4574a800cecf0fbf1e2d1f9fd72172508951b38127b684053b84401b4243810f0db25e40c3814f073874c470feff5103643081c2474290150cd0b142c45fb3321b12d54c6d655bc156aa8ab48ecbca88485e9903a85aa884b4d7da22758844040000000000c31000304020188b8562c170503826916b001400025c9e58aa5c4499c9b32c4821640c310600030000060406446c9400d6d5094c9ed0fd42814ff8de86b65648b49f4bc762213cf85f298f1d631303a08be84785c7362094712ec39c9aa86a17335322a4467393e161ab380546433e214a2ac8085cc9fbc1ae18eb50290d0a53d6666cc40e9a44f9efb2566c3c0630fcd14109292e75db31bf6558b6af155a43c9f71416f09ca86db8b3db04844a4169368e84faf0d9425810e937b507ae6d8f81559c68d69c5e1d90dd9c952e83f5db24b6a94998c3aaece91f5cc811b94bc319f67c607f16a4ba7cabbf60f1c04e8adde2d9aa845a9d096dd4f92ffa724cd6ba1dc48364c833f6c2562043296b2c129972032393b11c8185f210351955e026ff0463f9d46e4c480d1b76702c44f282add785d824d4d8f0fbc8b6445c23597c822cfb0c285838f7c642bdf2017721d8737a0b41f8838a7c53dea602586e05b83ef14a13ad23eca6389a2038e0537b021f7794dc7867ded844b042f1ea236697e99627432e4be21c8a1b1b4fb20088cdd526ad59ac13ec522ddc01dbbded19e214f42ae79ea9a8db1de0cc2137f9cb925238f80d1b148f716bcc25da04f64e8159bc6177be65842eac99f217ee99a88ac54c0f24e3de9089e310103fc3061e055cf402b193af07efe89136e3f34b5b23f3c13ed702f7e18a43e7f17bd43a79868f49e347257da7328205082154e05224e819e01addb858964fb150ec8c3f4c3c38d63c0d59f0ff95a60945d0cb3d4476e95604541573ccae16d82d45fc3bfc6b92ebce16cbaea48f73c780a244baca8a0df619044ee2dc71fcf7b3737c15c542fbc6574eefcd96d32600470c14d446995dd4b06cfcb27a23b6ae2cdd34f02d1fa5d5a7fabb98ef07dea52d0880cbab5e87abc4d16affacc99cc3a6e9b97d08b0dcc7c0e59e8f6d772452bf481ff839f22e76a20f21c44a9624f67c8e733a6eac1a88ff6a9988315e1b40630cab52dd25404a61398323f675c3f6dc8cfc0f2c769d473570594253c85eb2fcaf6ec3eff5d37a896969efbbfc90de44d0232e17ff9c55b6ac10055b9520686e82959106a8efb2e218a311c523d364df9c35f4d1c12f579efbab9e67db6abe4a71c505a6c1c8012b957a9cf163515d2015b7285df6676d0e397f7224b135977b5c7196830bfabf79d8118e70902aa0a996e3dbe581c4a99d8bb0b7caba7f9698e7bf1936cb0d7303e902565b1e4c172ff8fa9209a7cb38e2f8ed04c7edf150f23c596c1660d93774d7c013248bea63d5b6a0bff5200559385fb295b7937c0b05b7c8789db11ad196ce148bfa17c2e1d2df96b857fffb4f23c93455fe982a58f29460c72d9464200ab25f7b47fcf990e475b39bf7483b49746e6db52394f4c852724f4682eea7d983a604dce2ba7a20e97586954b775ec12629ed9d5812bf38b3ee62f8733ac55a296555db8b041df93b4365e6924a6fb07efea54a418896f794deb16d653359ae41e654a7d0ac4cdc382d85b0a3e1776c160ebbb27f250bd5781c4698b95922af2c4071824af7d65325af590298d079e2fb1d06c152938b8d83bd179214af978990e2b9be2cf548dbc09117faa1540531a21bc2dcf2d8ad7cd5359c014d028bf949cae3410a18719759410a6e55a124ccf5431b0f520776ca81a9e4b79739d994c79a91f8d0a9c9c49f95b1a55016e526eb191b41adac5a61f0ce4ae5ce10008fbab9bee2c0a563bb2cf5c93bdc91e38bc3c3c28c452a96233ca9749e71227e9c3f2568aa34783f3d5161e00e73b20236a526373b6934f691edb687e9b6637d43f497617525f977e74c80a41b01617fcf10d7b72ecd8d0c81c605b5b13334ca481c6064fc4cd0f2eea35bf8dae958a097baf1b9988aab69a842c8b7ffe8110d9773e62e4092a71d8036f270fd4acd60ca7e143120dfb3c4fb911425a121a18f091cde2a2bf03b0364dbe3232ab2fb8b4d32e0c4067510b35a598cbd834ba699cd863bf2c0d9d4bae011d7d540aa60588814cc6d5b171036d3528ce6f0c12ddd0b003db4ec7d42e454a8584cfc5ca5429ce1c12f4df8a1d59f3fb51ddae8c591d31854d612361c239085886ff1bf30594904e74a805fc46f6c0426cc7ee539e1ef3f531019494a70d07b8a90d05f5771f42ec21ac70122b011fe85b6ff44581c572a9e9d7dbc476cbd1bf96c0c280400b24dfd3e4af142528b409a75e6f37632290551935c18f12cf647f0e7c489450f5a3ca1a26b81420ce0aba5d35eb1e89ae71e85705e69ede6b4f94bc9961d71e11d1d94940776d073b5a3fdbb1f71534a17e760bc389818b9d1a3e4eed075d954042925804dd120058e17ecef9418b20018fcbd65605afed0b5a810003aac4820b97e9b1b9519514daaf95cf8ee97a9e5f11e9bdb923cf8612fc5cd6b1c9338e8041c60c5186829416309956257b2a90ab488c13a59c34aea5ece1cf8d2e07cdc0bfc815e48210cee97f0ea89a60416359cecb1f66b906b59fdfe7f5e795654d20a0bd5e4ade903d5a4569a5fe5611fc7a8c30f0b3d5ec23faf726d726bc0889e63e6bd116021b71fcbcb931bc10707f7823b66f6898aec3229e77bb799a4b66b0c61c90bfb3b4efeee5a7601bfdb8a01286f659534fd35118cf0f1b1650e54c0d74e9a592f21e0fc551b02d384e3a695434e3abb14fe65c101273b4ac4dac89b4809f0eb4e934451089df0b4737368dd7ce18750ac71acf1dc26b85820854a244be5bc487b96643623a2dcc67068ac4bceef5f64f4c3c588785ce81e96317cf0e4c7e22fc6c9ebb2dbf1c58fb123dbe9ef3bc96709586523bcdf1a72222f2bb4596c3aa9c7c53e5ed09c7d480dd43c3ef834f7193c78e71f5469ced6e79aec27bee8f10ee37c3eff65680b4fe61a81ae1433c0ff5264f88c77359701684791d8ad2a10dededace9b0b6c8e707879ea2dd602ea0bceec4f60a3c20142844feb30a3445b78ecf1f4a25724a5eeab0842484bbf8533595a15d4f7bfa38de7a7c2de2fc85209bc27dc5927f5eb512ac786e32312244805cd713e7c6370c15de3cda278005fb9202890f85d3bf8b749433ead0cdebf311ec832e13c8ad2eca678ad265544417d2c495bee7e9a3291a7883d86f3ff0703ec46d1838c4d1abef5c8b0166ef027bcdbcc78640d30919a2363e1f149044346df8b07bd56504134000fe22184f4b0121e8ca4c3f0260d755a3f1a5bf5644d89bd8b4ec68a0cf08837897be3e3c9bb538459ef4e81be128a0dad251780e46edf703365d4dff6ad644323b2071a4e4e86d250a773b9cec7db6fd31897a96941deb1e525e931c9052f75261e720bcb217f57f6844bf03c79dad748445cc4c7f7f535705fe33df54a96024a4281def4ab3fd74b2dd1332b5e54cf4f96e95936c6642985b7f73ca575b3b5e3f5526745ec641b47c60f79cee63cf9341527e9ce1f67df7060f843adba0ba1841c2a368d396453621832899aa5cd1f95884cd5ecaf57f5e08639c502522238e759061bd119df6a8a6e54a6e6206ef1d87cafe2b1203510e0d62704ae2f66b262c00b75290023594116c0883d2bda06c0e9c161adb35547e4af28a3f9f825f2e8bcd80526c717670e7343d7f829ab0f41ca27cc2317fc3e5a7d8d360bae3ebbb1bf848ba46826e1155766a03cbaca61e44f69c9d1617dd88bb751909fb4cac05b83442b9915a13aa0a99cf10401866849334040ce83186d9c13e92d291c8b2c817feb121ae99d566d96a3cd00e70aadd2e59f8ceca9397470e8a969689049bf08d92a536c3fa2293a63a4216560471dfb08f27fa171ca06529a00b751895bde3ee769973db57eed880766cdb02a1046a4115c99b022bc85057f5c867a2a8f9da5b16a62cb3d4de59067f06c1de0c53d1edb8cef62aac408d682618cb382c0ac590cee1298bce5aa9926eda42810e0f88452817c0e108dedc20b196776b2c7fff78888f948061e65697891e40000bba0e2d90b94f3796b979437b9d89cbbe192bc5839d214954f4b6351b4660b571f7f6579bc25666ebeddee64ea55a00a5177667c79bd7a31410e6b596ff4c23596b277cd89928d8014ac44f5331b1efdd1204ac900ea036d8c6ebb800348d5a3c7260853989fd9bce112b66927c1a70733ed44145da005319b1d089ac0b33972ee2db286a6ebd90e3e9285439eb76a2927f1b8146e47912c71120f5e804029ccbd19ccc36e45138152c82a9902373fdb06f67bef2df3245c3c25884eac76c801bb0797ae6ef6d7e718b7b2da9ae3ec9642be90fea0c51ea4a38b9e7eee647063b99d2df0e2e3a60b7c49e3dbd4e03415e67c22cd0088f048b9c7ec8446c8d3eadcfed7bf1e94fb989d9ebe0e64ab73eaaae1deffb459e9d3f05f38df0d0f8afedb936b10413045632a2190befb5469ae996216fe14e06293121a4f06e0432081596a4bb5873090ee27b5e9e3d73e6b0eb4c41e95e3e1f8d7693933bd5b6467e71a65b01bd62fa05242ee0ba691bd96c46537e68d82430c3b1e792658315e3b29dacd00b56b5a72f2fda90f4aa97e558bd73017b7c5fb583a5aded57ed642fc5c9a80e855f7cb50919c76055df42b4335364cd729699661e92f6364408b7bd1168cecd4e4b4bc4d35f950b27add3e5b3584651b200b8eb7e8d919853c66ab15945c7aa557d3744805c4e23f5e9765d23a6290c2e7bc4ba9ec350944768564318ae416acfeb52a54591a10ff612dc698c29927937cbc6fdf0cd4a747d0ccfe4d121faeeff4370970eacf00bdf1e4b41679f2b88de9b2c7474e8d7a4ed9a651bd2b4aaa777e111e716a925a3062c7b5fe71141f52a4343892cc0e4ceb5c7f0b57ebe1e2a38a3a649317755dcc2e2a09e8236065929fb69325d9a04e2a1fff5fb788e3313aeca086487c02f00b94ed541b625ee43c3f9ef40e390cec902b30370b181e05f9853e83a12217e0405c3b3513d4014f4659434cabf99db8ed247d1e3b9f291750b0697b197c21df29e1ef2b8a57a8a979aff271b206ea2f546cc83bfd16afc95c0c24da3635f2cd3f53e9f391a47fca62231335dd3f980d46f5d25d0abfd0d3ae835ebeb3290b523d1abf7180243f91346cfcbb46314adc6df3923b28e0307400a7b5e0abb88c3c1e1c31cbd9affa59398af43f01aa64c90f3720aa71a729f343cdd47ae617831706983993d473e107faad921042c8582538edff673b1a406243d81773b914537900f26a7c60b079b70402e0972640c62f89fdfb9c486350473dc9f090b85c2a82a9b199a9657bc70323b1db59549b7b45fc1be1f66f13258af718ee15361da6736d398766f6425ece29b2e4e7793db64504f21e1e466fef3f8c7abf182a3b2a2f96f14910233779b9bb5423fec71f2a21c89c8888b82feefd84863fbb38e1f073f47c6789fe1978d2e6f70529f21159361a88eba875a37eec73c36fb68f30dd7e60a6d5a4dc5e3b891330292afa7c3e44785b33d4e08b9d4cd6a3a4b7672eb9fda7d266e8dafadb8d17d8ea663525cda70c43bc37989b311cebbe4e45341ead21855b30b8487f3a9c5dba5e64990f6b5e98c4508e10ae3b0e78bdff0d4e66062ee8e1b6e6ed4a55e71920e33be0a6183cd63962175078cad9ddf876354c71f7c99d986b40f813ad16ce51d6260c26d91212d031a2f567e491a7a66f2d4b501f1f16009edf86b14b19858cae234ab6d52190d5e7edd453b9be48e209124ea1e70ea2fc3d5a095029e71cea6da162bcc2e461c4e8dfe3cecdbe52bcade06d402496dc509308fd6ae30d02e9deea4ba217eed4e47476f9cc2c2737d26d52d8fc10568dfd0319c70e7ea59b062bf900ec7e992c1b6697fe46ea23794020719493c35c7ffe9baafddfe12cd66b35f60a012559709f0d9ebbfcd87924aa75ed47b39e08d3016ee73a980a6c232f856a9af8cda4bfd83147306ebf7e6d8f058c96bbf0b80519b0db55649951ec01f8f63732fffc6874067fdabb7f8e4ba2fbb4b13e08780d343dfccb2c54fc307d00f05ca90aefb468fdde77e84a3f68f6366bcbfa334d8aa91d5c9a273700fa678ff50d8b040665451c5199a1abb7d12b626fa2897aa150301ab28a6f856baf1c6f2a774fb3c04fb2fbf878137798ae12a9df9fbc08c386d31198644d98953be376fb858690ee0884751242278190eae00a18fbfa59ea9885793aa03f196dc38785f8a01bece87fc0727d87b10ac388081ffebbef035c45c1f74795a21d50408d937ffc04320e41f4095c9aa840bb6145b0a436316c1ef31cb0d34f804de8ff14e672447f2a3169586505bcf9d9ecd270a6e620057126bf8bef2665940f228fedc2588e246bdee5717ac1ed07993f2f4de8525278e0146f7e24cfb057c7e16d3eecbc466b996e0d347d88145eb681e16d49e73bb2b09e6a4d727a985c075ec7ac367ae413cb49539460b217b916e8b9452d6e3142747dfd148a996ce6412fba19b4506340e671d36097b38c881f569bf7340f24050c8bf5ab5995e4683b74514ce792453f5714b51aac38e3de05a6ed1fecf7dd4d7e4f7057c172771466400cbe336210486855f508ec6e2e950ebd27cff73a07ce4f0bce6bbcae1df3d4287f100056398a01f6f0ddee8ea44fc3769b9916fd22c12c30df902503fe5a927198eed5d3bbcf113a069f04df92757fcdc5ffb62c0465ec9750c9c16d6922f906f1ef3e401dd553e60a21a53fefc4fa322011dc9826369a67744b925bfc9a8a893d47e9e98e94b3254a25972d6bbfe752164c5b5ae65c9b509b160038049761f6090329affc087ddd46e9ade96eacecbd98e11583f736f526aa69a34e6e5b0b0eef14298421e2e7cc909e74e718a40b72f3cf89a54a35836a268af657cc8783949d545377ee8ea354273583a32abb6bd3ace00fdc7e71e7fdd06d278a36ae68bee8f54c9c345021dca1dee8612d8a34b941c12a3799c2bdd82de24bba7c1817b8fc3642667dadd74d395ac1f7ee548da25e7ad113f36e965396f938fe218d69708dfe3a23185792be3ca578442c83f284d254fd65931f01f4f98eb7507a52a3d85d4eb2b6061defb270f4ad1bc0e6ca2d78975d312a5318f2b41a67dd97f8333217b960d1746628db3e0d61d79a3a1ca11bad205dd79f30fd9d4f382e2db794ae5b06e645e2dcbec62128c70f39cde72c7f66a90be3c64c15d6e6c9d194ce2a795cf5fb1a397316a8efd6347c26aca5ec709a75c11e42d051cb4549149298277287aa5a11eae9655bee5270e55a6d09b1ea0878366d6bfa67f55ffc9ddf2352d35a96d35a29714d5bf33acf6007c29fbf8063897b63e189b6f453be850fe20e789582e268122de8db26ebf1569d2c107fd489edcebc23b86b3f05c19d4152fa84bb4e1aaf2620248300812219f63ae02634d1b60da4d66432e665c5fcdd0506114e85fa24720ef2c0c34e3aeee58173e2cd6620e6f44c079ac787d904dce4d9f7551fd00b26379db7e3fc85ece7572f29fe8385e53b0e39653adcf9710c44492b11cd95dfe0124d4ee5afc031cee7c187dfad031f72e5257d1c2f23f2ff5a21ebd083fc03702c44a76503251c055b09d0db84bcbf324473c3cde102a54d24bdb21064ea4368599377a700747dd0a6df39e5da6fa8d7ae44e18e070b84de63f137881348d6c304587c08180044d828c3e9a14779f7f53aa19d3310086a97b2d5d8d491ee77e9b74caafaa96d11d159eb8e744a24c9ac769dd27277c62a7163a1e103e940b57c7081aa0cb4a80ac5b4c4121d7cc8913a11045dcf7ce3b0900c559ea682171ae8b60f42a9515c3f03c9e5c8a8ca2c8497e7da0312c34b5b50189dda071a4e07a4401324bc1351dd27b24d0ff4682b3634423525a5dc1dcbf3a4b63ca116329a051859fa2d917575864fc43e6b730094f1554cdc0b0115717f0c5ce0bfa9f4da70882a653108f71fc441d745b58a6d37ef4e5db07595daf9d066fe34e8d5857b7e3f1810e625247f707fb5f8ca25699821624dd8e45c725ba07a4a5fedd83b65655e1b98b8408fbfa3597f538238c8379769b23fb908ffcc3660f0f75901695f4cc6c3f14cfea67f7a40d6c5c36fb46ca83f5cb74dfe702e1afa355296b1ff85c06a5b961cf6f6328c8665bedd48b4086ff470ee2b96bf607e5aee3eca33c6e8d2b7d89a7f262a9e440c072efa3d8cee1f6dab49d8dfc1938ef47c39b119653d6d1c2ee405d3731eedd801a6f4dd5277a17a1df0e197e6f17ce81b7d55d746052bd3bf6e3d6d16a39fbd097b8742788c352c8fbf6807067146b8e421ac2ff0c8e63c4792918cc2e82d9625a838682d0590f9ac5db353717fabc7c1aefd37b3881c7bbb876007f8800d633fd35de45ac71be0c5cfa33b664fd378c112c627bc0799eef19ded785e458ed253b179408caeeddad72d3d45d03cf60c9fc3ce389a62b16991266e1720b333af744d07857d08a35845159453288c4f9e9909ddd67a931d3673c653f67ddd973aa321e14af8ac19bf8dbd3c968e683ec4e7a6b17a0518db5a45f99d7b0beb67defe96432d2bb9a0e8e241c79888ce0755008a88237662c060cf03e43a3049e43825dfcaa72f5a08ad20a8b240dd00fd3c7b50cb7db1343cdae8acad97375582a472702461844e24ee8f0ccc42ba2a815088ec260a0ccd5616bef4a7663e435377da4de3d6e564b5c9861fc4772be0ec42ee81c690688ac1340bfdeee96b15ddb4369e10f424ca6c679b7690ee074f575df28bfd8f7d1d014dbe4741f53c5700dc0913ca4e86e4918157876d46d4a0008a51e2f3d3a0cef140fbb26c2d0ac0c883f3fb1a6f451c60dfc1a0abb14cf860cbed94d81ab9cbc21d96bec91e34dc43c815a5a1f4d6aa44e41e099b5c33e36bd181f1ce8cd3eb4d94fd6331505e54400992969a4b4c070133e1cac749c7108b98775bb6a8ce707b6296c6136504b47bf728215f492f7b01c7decc97e91baa4b41907cc60738be75d0261e0f7a3a8a8533ab68041e5690113540aefe4c63d03944c7c3d48ae5f4deffdc75be5a1d00d5fc9a30398257335da117cef2a6c7075b51bdf2864414d714a5689048f15a2334c4d598e755ca8293a1ebbc31585461ebd1932e194a1cae48a3b6407f230acee64bc5ffe3080e15aeeb73e51333cae7e45b208b0f41c7afdc7be928d487438c5a34422e271e874af6f5f217914844e557646f942b6e2a5d2b7038d81cb780c8be6a51efbc2ae833ac1cc24748a496739f0da5e5b8eadafdc9a90ab97e1ce6e3e49e0e33cbb3c9171d55969bbc6600425df8ce9eec274e5ce77d7f193f70f67e346a29fa043c79cd65cd028aa1387eba129c3ddd8a23b882e9f24f2b36d67c659b0ca777e803f1737dea7308eb7a9c47126ee18b11425824515518bd9d6f56346987b9cd0e8729ca41bd8426593dd79c25af0468254b40fb1a6c92a2afd7052fba67926ebe56ec67e57bc34461df799f7ccbf9f8700cb6d24a17a9aeb1d8c6c6f67535942c7efbec7103f47758d973a8d56497493383a660a16f81fb9faea0ee0a4c6c989e6fd5c899aabbc2fa5d323462dde067c810199330c9d7f2b5af7149e244dfd8b9c85537147739fac83da83a9d03dcf12d793cd53da504d28735d86803391146ab9ea3b8938dfb9c3275de0adb02298b2920ad4549048f8772434df72d423e2937f2f0239c78b17a4af0d9cf6f77ff2feba28d7c163458329233444750f2386f008ea64aa864675d92aed3e74429a5022bca6e6e14430ce6c8a01a0c1a0f7a0e20e0f52e58a152c04298a5944bf4221984e8d3e51a02ec73af9dd14a91b007a0cba5024da6d6d8dabe62a37deeb6b389703e87e2cb5a037eb303b0c04aa1366254454c34d7175d68c1d549121595acf9fc75341fa5f5bb56f4d3540f49284b8001b0f678a87d76a45584eafd6142801f268accb64f2a45aa36ecf0ddf7b44a642fb1f883e713bf7f32a948daa4e6e348ff39f7177f100e10a064b6fa310ebc10c7f0b54c6f21e1b2610f1b9c890d610d7d19a69827fe13ca0435395a73f351e12c202a06f375c456628669a1078da97835ce68afc8324618308ac591301545b5826eda8358a803914be80dc6b0fe3df6cb83b67c9186f374262bbac960525e0332180b61c7bd8d04d41cc96fd588b57eaf238c9ecb2f1eec9948afb4e899177ea19066e31f69e1dcf80df00aec5bff413264f1d69cadcf63652c280008ec6741df0276dfe452a19d19672a4be59eab40300de37bff676b87e3f102756cca2a43ad53bc3e6cbf383549a375f6d1c89d0efa55e539537a04a586c8a844b87dbaf79ee6785097788012de6a5f9e5cac3bd88f97f9f46ac07026e2aef2d1679c4bf6b086ba96364cc8f8dd93bdac42d617ae8d65668383c55b3d9d68a1d03dc5886e0b418e519b061112ee28d7e6770173787a6b6a94ca79b28fd062a5ef8e969414ea6330125e33e278d04c7d31cac94bcc28d86eba781a99ad69d6d54f5b90b941b2491d4399ab85a7c218d03d6115956873cd7fd421f410a89c8326c01b25334841072cfe65087a58cd56e61d61a24b61e325c73c5ded8161e1c4e6d584556b99891bcd2b1d4223061fbb824111bdafe8c095454002057d0b55534499c38be3ade17ca4fc19eafb07a023525e39c15a15357ce84ef461a0603a580614328600cc99d6fcd3d908d39047137f37a937b13c7545c0cbb8126feef00835ce6ffe2cd6e3d0be1edd59f227770114e3b320359f90237825d2f3af37601d0eab861ad95d1c6d9d539986048f64fa6ffa1ab8bbe1d29077e2eb2915bbd4949f3240a9c2df87b1e1c7eb2cf3511bb22a9ff1b5c2064de4cd2704609df9afa05c1ec7046a2e91b7ea604e8d03a8970823ee8360cb469497827014f265e4e3b82eb9c367e2fb320dc10ab3ce0fd43622ca65edcf0230547bec9ffff42fc4ad9f5e6e498c4a4777f5efd33c30156e08d6c85522e3f22d8a0684dcd9d52a46dd8af73c364a9bc786a1991d9f00e120025d9b18dbbe1d86b4855465cc2ac955efb88a9b6ad4fc578aedc6e3fe8dd6008c8f55feb7db5c7282087cb3251345b43e2715c2798236f3179fb1cab4e42db9e43367b783583720d4e6017566a53c394f4a558f5933cadc30102304b50c6cdd47526c57bdf5f5450ee77d886817c57affcf25d8a2057f768120e48dc2dbed805e2a30ff1b620e5bec093117f236e8ea402e1881530fe30e44e39e2bfcab99c47efca7ffaf018a1c86cb6ef1e3d9b23f85e0b1b58062fde37b858c065ffc8a2430ee1c693df8cac28873570a8bde8056cf47809e56e261e9aa990068ad41502d1cbbe5172ff266675a9e07d4effc961a57e7949170bcf3e08336be2bb90042298921dc19d97494e1759c653967d39c3a9de6255ee6906f73727451f224f8e19d249c2372b48c112d3d4984cb0c4dd4685f2c1d8ea3574309205356121ea65c4f68a663ddf9f8bc6f68efad2f4129862cdd309b902c2bcba20206587cbf9ffa9e7c9067210609f13b8e9e39ea202e8cb9a0b874a92469a1e61cb86c008bf158e2d5b07557f8c9f7f301a60c81574904b0f5ba2a316d1cef3b4e8e79aaa77c88e90b90473eaeab24ec8e0afe897f7cf30fda6a5c009bc83f2263db69c8b6b357cad215fd6eec7b2f5fb29da76c2d6c92a08335c5c5e63b55d3c529cfdd0b3dbe36ca61a8564005ebacc0c21fe55de8cfdd1ccfa790c188293ee3e653927edccc7a27da52fc7a65e79e3a2a8465e60c0ff8e27e7a02f89e56bba196dfb6ead54553654c5ae0dc9822465bd1c951cee4b9fe1e7be3456a51273aa0cc85afabd88d0bdeb37f1a4900925e91cf00ef744d91994ff8a7875279ced0218183006c6014260c303a847a5470c45212ba6237f20ed74d243fc16f2b4b4334807917bec897c3082977d19f870662a65180487f92ec7b3313618f17ff90c8235e6978d4b7a7eee195f7f98ec8c57e17809463d86c0448d2a62c3ccb238a8f0ca0dabe5f78bc5f060e87f7b8005e7fb3e18790774d1a3d0b3b6e18cc7d9b304ce3f96d0e05e6b7da9d7ebad73b8bf7cfbf17ffedeef6b308adbd0151f3cf5eabffb170b2e504c247c0e5e69fde6bed8750cd07f00aa51a3a84c033977736ff84e1b3f9eb761ffff900c69f7bc18438d6fb28aa8fd68ce7e8e1ae9239c511646a771ca8ebe2cf83ea8f19b0840c913c310ba0733e2b77ae2d5598e37b8816e62b772af61e959424823b1f106460cc40937e80d243c46ebde59d2dd20f6acad86e2bbcf32f46697d091fbd0e35cabff474842d9fe9ae43eb6669bb0d9f74ee6f9f3c6e386eb721fb35d602f3eefeda7c4394388609fee40ac6c0f35fdedb3a958c3f7321d6d6496905608fc72834f3bc5d93aebfbae91a605eac135a463b452a013e5907162cb63f962a0ceb80866dcce01907847fdc08f2a0f25a40400af5a8cec9395c759eb793d7ff6d339e977ee0ca9f2451a8fdbf061e200f1271a9972666d9db2a721bdff2943d1be2330d1dc4ee91df6847b5d38feefdf4f7b0ea01032d8209c4218775fee05dbedb7388ba26defd4177cd2d85eebd04d4dd95d20076dee51f9739df07cac2b7be6cf8b304d39c77ca0a859bec63d1e3df8fef0ccff9fdf36b8f9c1b8e95fad26472db1bf66ad4b6daa5d285a171a6a2fc6ddc75874b793627c039ded23ab630bb70fc558833afc6349955c8f11b6a85ce373e8e8c49014f578438e9fa0c0eea5fbc176be6e618c1179791dcdc336ea34364353680e5fd6182eb9a1c4d6abe0a2a131d7383bf78e91f2eb3238395fe93da6adefa3d5d1e2e335afb226a9a0cc585c4acc58c64e1a8fa454ebc3f1b45a68748720b095000d30a7ac251c41f17068a4291421a13cf4b7e15767ebd26e6eda2e5c61818ef2beef1b1d68aa5e82e3e46991d78ec9c42a02badea8fc9dc719f8db8763834dcc5b5252c59a80e63c58a9e2606018a6203ac9ba340e18a855d3df7671929366ba2e96ce2c651c7e823db25da5a6268bad0ca8ef5c9a702568e8a63cb90e6787ee692050d40016ff35c5943cba2f7fb097b76c2b6e475d705c7c91542565d0fa4941d87bf10ba4b9c7616f8353dfe305930f16366939c58bde475c02b2214890b1bf5d797986782b75fd4416490a9b3d3090b85b4092dab4e738d1a3db8691f2793ca3ab043124a8c47bfbb77d0a36e49b09b629271d9f5516681cf7502f84e8e20d938222f5d1d3011e268b813849db818a9e087f429b388fa91de48852e422ec73824786032b67515790cf453d764737e1b2a741ea2dce8a2624ea1d7e2524b0674a347f9bf4bec1b4cb74d38920f9973d31eded1ab748c150bede47d36b1a756da7e50fde7130e2e1688a4b1b57b4533a9b392bb0e9e1cd67c3299404c0119eabf2a7a376973d5fc33ef734481e66f73c90d39c059bbce9daf4564a47c29fa8db8cd3ae936273d8414edc58d11666cb8d2f44bc3ee81721313590da1779c2a2b6052bc3cc8ceb402ff60d55165770b828f16c07dfe92eb536048d3f8c4f2228b8b05777172f2fad22ed10910e6ab8bd27bd15d99f7a9e1befbcdd131fc192d0a8bd4db7f5156d6a6569020ed9307082a2e1e50da6fe26f167799b5291043bf832712b2aa9308b697ff58fa4798d4c43b51ac00548a080e7fa49f731f20ceaf8fbb311586f457f46eac699752e3a0f55441e8bafaf40d9be8355459386de102c74845729f90afa94efe5c5500d995ecfb9ce05e70dc888c46ab0a218dc3d17d4f87531104fe3513cf8ac39a259edff91707bce03464f97686eab179efe1bd004848d9ec8b756ee9011b17199b93f29d15d0f308238355b77b22e9cf11bde85acd1d1c695ce998f76ae74297afb9c91b111e11f896b37336916ccf647f56d93a3bbf661f65ed767815fa5b7c10daf8d250ebf152c68972c7e99a5b2fde3e6c679b74a3c81f74e9b68acff4a6dce302f2307a03dd3908d36ffa1b06c42fabafddeb11e55603c85901b04303289c1eb285a562d7b457b7e3534cff8e2a864c073cba314004c2705df98e6b286e0a71d6eaf28b623369b0f0cff746e34804f3daf2af652435ed068bcf97447c017dae0780cfe53f3c32ca60fe068b2092de0e07bc82512eca4d9bd9b543caab4a240cd62f0c1bc0a8ec973ddf5fa73de2e942da0ad33427f4c69a5ddfe03b1cda7a151c3d15f21d8bcf13d1c445e158073827421530ad55287c38dcb7ef5606f288024243e2204fd7d3ebee1d45b91da5f6cf480a57043648f8f8906ce0956c336a90da3930758a6998ee0fd1dcf31b0aed642f1ef065d9b2c6e878271e68321a7b3e72e73e0bbb99994fa4585f3847908ac648ed8402461fe37e02cfcb9f5cbadbf12df8a0d00efdaff70e10abfb4d402a77bf0c294cb4f7d4855626c455c73c07d27e90ddd306e6a076c8ed6f3b7d19112b566d69108e61d057f04260d30c1f524d5cc3924a95fd8b9bd2bc6293bdf49f28e537248cd4991ca77459a386f35dd2b01bddb39ea4f8560dd4f97b233cd5a6e7d68caf398566ed1c92d6fac328db31a491381fbac6e967755b3563720385642f07a9e9f6d7196d0b5a17047943000bda3f90afe30e5252b7d608ed07aa34445544b854d896c666aab1e4d7c777b412442c003a337fa65869a27b24612859e7ad664345f4c00fa8d0e42ab8d78df34480a63246207f3de5453f72d0c580c68ee61a1402c8c573bbd295162c8cfae596956992f0158241345c9bec84bcc8d34d9b6eeda10e4102f4afb7a33cc46f458cb59ee6b29858358b0c1b2de20cd247ccc0e2d429344c3ab7c637b9e22e52b6606535f09addd102e66a92d6523cac108e9a6026d2049e8112b026d9a4d99ad9feb221b40638bf123e4be54996de711f0866d63d32850844cc38075c00449e0f9d4283c005fec2d4ddc9e1a0e1a2447bd3e8014684fd612d32b3870c376cf66b71d54e261e6697a116b805cf81072fb675e662eae5fddbd1ee65337c09899c99aa050a616c6c827abbc2f2e4e9887242c7eb698a435a9651e8e480cebdb8484c8a041761725c617c082160a2428f480920758092240ae67cc7bc0a8c8f6c3d6148a2704143426d099e4021d53616ae4aff301d9b73c46b9c27ff7081e872560feabb270ce2424eb967849081e1ddd526e024d59d66c0ee5b6d46f48a8e1396417048782bf87e6a30e6e7d7c6cb6caaf4082b86e2990fa0b0576337b9009195edc0d47d2d1b4316ef0c404f654f13d312e60382e07e73d071f739bd5b6b268296288c5923d7de7ed7e339260378b3fa561970f5cb756e58ef5c0a015d3c1b8ba05587e50a0631fb3f9665fc441ca14cd91a2ae8e1b8fdf437804e23bce991376b4f310c093ca56ba32852c44baa1ac23df9b55ee11038b127bde7e037902fd9e1b71fc31ec475d7f584eafe06f7d4032d917dcc169a477cdfae12aba2726eeb91907238fab1d775d0bca283fc49e296e84960b7410d365b87fd91cda5230096c8901425c987d9495d1177b7fc1ece4459930c48fd4282820bafda4f14fcc2922189d160b1e8022ef25a2ca9080ff905d08d2e6667dfaf363be3c96b865a1f850a21e469e80ae31f58cb046a3a11e568090cda6ea80468a1ad7229f7da837e22accadf71655f173a8034952575a1e782b5b176009019077a4032031df45f15d1cc275a63646950990fd81dcd5796a4ada694dbca5b3ae1e2fbddf0078160322e94f029810cc81ba6974ff3c8e073c500c7341495259fc3d3d45f65fd65b96866c00defd71271b8c078e7c8ddeb81dbac915ccd22c08a115e963da51cb3dda2e8bc66617322f8e40196f2f7016bfc5000f9b65d57091db9599627f2ca733031bf29280c0f585b0d1496fb97c09791a66ce6e4acb0fbee5ba76a0c17c52f4d1dfb0dcd74e1e60b9edc214277ae8ed351313ff43c06756f5a54ef05e39d33888e9f9881928f869a66c29e1a485db60cea0caa9bc85d1148860db722ac8ab421ab9b15d74e7998ff8dd2fc711dadf8ec7f59eb4e8fc82d23743f70fc7d86174c2b1e810ff975146fcd82ee6e42a91d935a7a82df0e39e62ac7958730c79018d9c6d03187aa5d0c2534c066a35ba0649ca8850f484bf85d682ca2b49f2db8c96771e5047d3d3fe6d5e7a1266f92669ec02d8ae731bcdeb286992fbb5b834b8dd5ba13afaa9d35290fbfac1d2eebcfa0661aec0b6aa261b8757c9a24b62780d94ae396002b9efe072b2f0d3fda529471dce7c9efbd6b20a94f3b1b6ea498848ed8cce76733b425085f81f5183890aa35f9e4f8e3a97da21d43e7e95ba5e8d464468df7ad1844947d79d62d97914910f979389ca7f0fb46ec97b35e5840a6f98b8648be7dc0a75dda0eac7b35253b5e1621058b90a03d771f3604cddf49b3c05f3cbb371b3aa1b37ee1f042ae60be50dca59230d05e5099c1c87bb69f4a0bf9a7bdc0cb1269a5da5e8dbf6ef56cfe87eca125c56b4a583038c5d8a67a5da13f767b06bb2ee04d73c3908270ad22b91e9b699670b477fb82d2ccd2721bc72a4072504d6bceeeeceed2816df06ddbbe895eddc317d78c22f888ec48177d4bb1db6095c47e9e8b9b60c266210d9aa18898189489beae599003823c91effdfc9aacdd70e915e82bae8f9c85cfe351ca45fad1153351553607daa50ae4e2e03b20693d3774be179f3ffdf532d86fc36081778c9e44a50cecd91d989c7149fd4ce7d1297c6dfd8d6d53ce8e05929392ba8ecc46d6576dc4e1eb903e03200103f25e55c07242891667af0ef08365235b50ec3f23da046f0454dca49291aa761438f728ae7ea4615ca010f41a26117c70624367e9cdfd8d63994f2dbbb1518241391f05ef40fabd8d1ae7dafab0d88c36eeffb7b8ce98fdc3106531c864a4604cc6164e3272cb8283792b24cdcae786e720b2b90a15b562e52469c391b42a1ffca6c103da1ecae888d0640d7d5bc32fbe420c66606b6d63c9cdac64d2f9a86b1f1f49a5d6c477f206e33b8c0be94583da97e843b465b96fae7d3b64e6ce13fb771db542d5a169ebf229eb5ce8e61f6f86530d12c79bbc38b8a96ec45f36c3be5ce6462e6c8e7be83731b9447dde1b46e29add5ce72137f1b466ce1a154050b0c4ca2a0116cd040d9c71d8742a87093f9ab5a8bb8c9be93276cd59b67d5feb446507fce731a63571e2fcf0fa9347f68143c62113ed2ef10960fe2aa42a183707f65d7108c8f391bfaacd71fc14450a7cf27528e5c81674aa0cb990a734414f6e8826eb1cd4e9c05f11db62be93a835a148e859319e7bd2b1b675516d61164bfcba41de6644d94d3460006b80ee34863a8f92700144b48543976447943903a7e9990f9c055e99f82ee1d481dd2f8fbdacf16522ab278c96bc38076ffc3222904dda43411c0e256c98dd22084fed938507c6d4202124d146f17393ae78518e896d22df2f71664edac54d478f649703ce14ed75a89ab567e2e0f5899b9080376a7bd5589e7fa06eff95e804a7b92291b45d66588c2fa0d78e7ff1c022684448845d62eb93da3680f182d7806c91dd99cbdae173f25488d8660f79f2339cb9b2e96830755a8f51a5482775800518e9928dcfb25e31c5b988f85c1aaff57acfef3e41131123dbb0d88391e8e09ea0177dcce8ed22afea4aaf1eaadc03625c44369b21dd373658847917f7400bf54c99b19a4d6e59efdb9c24e260ff9bfa22a7f7794b72890e896b591bb82fd9aed35196a4ee31b4735eab64d08bce5e883e82079694cbdf63b9dde7e8494c1428ab74409789119ec8eea72fabda5c83b374c5f101009ef9fe946235a7fc091118a208e809706aa593b802b8302512cf95357c599e582bac6d7e3e2314e81b6edb73a47a8484b9decfa024f8809279ad73a24a27a81fbcd295a805f93ad938eb01d40fbadf21956e174c089a793b28cd0f4871c6eaf85b9c025177e92c3df0ad18731ab034f1b12f7cc28cd671e789c1cf83a532fe91c88fad06123616d59550329b9f1c0bf9ba76e7ff3325cce0e4dd16ffcc2b3727055daf850ead1e263df0126b85279e3fe59a172d5710ac9e075ad1f6d35c0d2f44d0735a6fb81d1c5e2624203d2c6f93d78be757e130e0b9ef84973197a082e9cadf9267086a76351aa819d8b0c1ee7908bc876785ecad1395b19a56542e4c2dc22b5973f47a3e12030aa114376cc872b40e52f9c05dda5eb61e7372cd6746e61accbee3dba39a6881c9833303711c49e125ee9937f691fe518e3d227a6165732efad5832a693589ade6d3799f210c38edb18e83f0758e6de91156aad048e46cd40132d37669fd450b89e9dc75559f0209d9e37e0f6e1af01139daf0fa4da9f246d358e5fe92e78fa4e9eab09eb7c95bf72be27b2f697128a22466b533587fe3571f73dd23a6a41424cb201595936dad225d6eea7489408c24ecaa0ae5037e393af50cf8e11feb8fd2fba57632c29785e1378bfd2a335426e4e0e1bef98f213d0e46d354e7023227e60f47df9644fbd140b2217f46bad541cb764ef3b384f994c6b410c9d1d0ff0114a2b53f8a3bd57b92f7f6a16a57988e097a9f82e61998d0cb6d73d2a23740becadc65fbcbc9cca6cf9464b16e47b06f9156b331962413899b4a5dcdb98aa222d5a107404738aada308bd04fed71fe91d3206af35f6fed7d5c856642fa36c19cefc29b0d87415e8ee450d0a403c1a9f63ef3143c839b423c0468d8de4022416b26f5ec8a78bbd59da852cf1ce4ad14dc42648d944085b440a31a17e0326c75a13768eda8a040bc2cad3ad3bcab314d9f33aa700ed71643cc8bad13ffb2ddb622a8a5089af9584b7a1cc0558d17a9677c9c7471258be908408c071afa90e97503695970ad081d98d8694ae95646683df0b7a8a073eb08827fb2e06d89cc69189b0057bccdc67956d46ba91e78c1d20421c2d05244b54765c3866768d80adb516cb0745e6614e80c1736f738e8e1fab5996daaf8a3dd72cf66d30a20e98255f1b2950be3daad551c547f003f6e256a853641e59ab2c3d52a71e8d3e152fac1fdab51812cbb1f295cf71a36361bf3b7696894d24e2e8c82a25040e71e87509f1f5116b0a14ae23407bdb355a946384622ca884cd74825ed16d1cde474f921ed1ca56c4f53a65a5c86010f0338c15ff549b0b8bee64ed970a567e89287c9c51958dae241980afe479f4c38b0a4dce7ac31bb99ef10c9f3aacd264fbbad66a86ef8e855704d5a0303042d8d3c344b73f968118d8ad02c12f8eee4ff56d55c39aa900df2fa898f7b15988a1e65aec00ad922454360e8bf85a30ed8e035bcfa3abc7e3019237237021386b9b776cfe9f45e9d4ce7f55a1bf4a51f189ffc92283ac70422e528470789927eb40120e8dab79206de2ec09f8f858e42cc02cc26ed88677762c1718e3ee976772fd53a52bd3729d66f0ab0c77aa44fd2e10f4c7ae8721a2375369cc35171535817dc6526cf6a6bd350aa02c8bf31a12caee04fe49947ebb487fb0d987a6dcb84460dfa9e83fc9917dceae52608bb88a31fd615b2391d810018f42777746cfe28f52345ee9cecb883c010e92c20b2d2122e0e81c8f14d03ab583e68c7d4ce436337e2e20e228bfa218e7a6e1dcdbe547d4616aff04082b4c38207146583a9d0820e20457e1e46d6288112c24b22f20724614c7f2f3ae016e832221bdf45936bf29dbb537cee4e57af9f954a3e8224a99c2657504b3df7c03203362ed54bb47e2b14247a8e35efedf79100e4eab8c3016a1d827e7af546388a5df9ac882bb4f27d75e1c6472b0fbd83a2c48f2a67710eda19311f309e70b6239c718e08d438056eea66c9d2dc949f402aefec2c36f1a1014fb33fd6a429ade77b299a8a495b369610e142c2e37a10d09fbe0b63dd01e5eaa2869dda8a3117d9f506dbb5dfff6a5831818782dc7c0166439f3e5beb608dd01173d8aeb17541b33444663408751e7a88ba38bf9270bb9d4903c73bef566c010bb1d5d4e37c1a1174980a57091a96499805e4ee381853abe3456fff52c8c4aa5f87a8b746a6718a943837224e448db37e36caa1d36b227c436c80973886d1394584794b743920af33ab2a1122a7d6a569cb393adf91047a38859cc911e81cc591618d59e4462313990520002d92d2a6990d343d62fa96af56ff87141b8042efc3ffcbf9b9745c6a45ce5f1190f10d76ce4d799b5f95be80f95736ff8a556dfaa82b0913afd8d0c0f378ac3bb22f0639fe8664c798d2269bc02bdd9b5b064f7e14c3d9fbc2c891549dfe6cd35f94aa469b2953c692368752558c820cd0441422f3fd0695cf96f12b1d3475a4eee644f44b4c7f81f018a9d6b7dcfacf43bf53f128e09dbaf0d2ba837a2bef4d2968c5d09bc3ab85f7e4da1124240e547dfcdd938f535f3705e95978e12e0bff772da4d05b5030ed67285b6a97c4bbc77237178c7c87f7be6264895aac02f11b69f2617a9fd36a00714f3478a3cf8767a97f2847a89f633b3fe8664d13e06fdab4dfc8463a1fc7077d1effbef1f3e03f617d993ea4dfd66efdaf6eea517618fcbb5777a54f767cf7fdbd2e5a006a867d55168cb55d30b462bc8f1e7edd222fa54cc8be30e7c1896b375fe67be8bc3c56172c4534190f145c8fe885bbed7776e67998fee0fd9ecb0f411a027e70f46b7fe2cfdf14cf0d5ff34f7f5cdc37e7f00ff2e0c53b33a8f8b30d82fbe2d53f784d3fdbe0dfc45d47c13f3ed5015ff975babfc35ef03fa6a8bf93a8f3bc1a4e4a4727b96c8f074b82f5086a97a26c4218c7ec0ce5108b1d7c718938b7273ed7350e8307c4ab301f97876dafe07eea39179c2fa36decf74d65809bf57ab70d3289861bdc9f9dda2f64f91f97b43e90aecbd74fcef4b8cfb9d085af1095fb09c1a571fd393e381e015abdb6d2bf1ae0c3d6abe6faa0b283300df10e1cc0e6fa7d279a66a5c44512be3f090bafd34f93a24faf5961fd7aab5aeb6dc22c521e53bce718a33913da3fd8aa3d5733a7afe2a917ac2f5228f73b1a039bb7975b70df62f4d35d8533d65269be343f5b2107f86facaa13c25dcb3fc0d3f71ac0016815e2c1ac97b6be2ac25f68feca7501719f6c93d6756af3bdb56e22805810e541693f5e9ba16b4799cdaf7e778c889916a65714f633de217f0a62d01e8db9a07ac2a3bf529a8f7d667f8f196d068a9c19c141eea3a9c77e817854cbf6c4ce4d5ec1e39ae712eaa6d8a42604f333b82a98d5eb8538be87f07dff3befeb43d70fb6052250e9e95f8a43361d3f6f30382772e6bba6f7a076c96bbd8f79a84f9429ccc974a42cef68240071eb43c7da3dc535cff5b1653fe9a255c328e7e66efc385f1261bed107c2451e58a44c6c4c85221f3b973f7f4eb849ace65c04ee907f07f209dd387b7e9cb0f2e8ff5779c5c710cdca6c643a887fd3ccbe581fd7521047274f84d84091d20060abcdf39e1b8e65445e9e65cc9d9c3bc81179cf4601fc038cef3bf9751039ecf507d98eb83f81b01541f1d119685f70734e246f7506f0b6510bf1d261c42ee936efb564886a808169b4d87bc25651b05a14ec637764faa6fb944f75ef907f6a4d829f95b943e3bec779f85625e947d608be31995c4c43045ecbd5913233fca27ad6cb7fa5cff1cfecde5d412230f427a8747ec9ce388945be3b13f21ee91ec8472c985fd628e6c7d7967de330b26750cccc28cb9f50703c60b74fab397bfa72ab53a7d767a2a8106d29079d54482e8201eaf1a4081ad18d473538fbce6ebf17e0fb8c9f3fce1a199184216abe395f98ef2b212961540a5fcef5260223b7f12ae58270b4d544356516be12fcfb1fa978e42e9c6e0b026774e9d8a1461f47ceccaa5fb31bb2ef3d9b8a47991c11b3917b845af5ae8c7771ee81923e1d8dabfe02eb56fbb909e49f761b38cc16fdae450e49d6e5954cbedddf3f642f750fe41022cefdab752270aceb79ad1343a23a2ab7973b13bbefd4b5e3f1f888fe4059eb2ca6607b8f60669866b4bda552395efdd75f59fd12657db2631bd9d5daee0e6ad363ca5980d7a14e40b2051c0f8c60213f5792a404a817ab9a013fd65b5bcc446c23abbb902b9e1cf79f077bac5f845b3001c3445c50fbc265cadda550d3d34998c2690642454afc7c60a6942b94d2c31e3907a325228a01e4f2e6da94a7db25093e46b574fa011d5304d93b93e052e7c92d10fded72bad2b31c48477519d68e0e57214e6b10d38bae7906ced540b2d49247ba5a96f87f9085884c9febfcd583caf6a451f8dd1aa12e2255702fec4622ed43754e1f51743f666fe193bfc39c8d5a42d1883c6cc94fed882076c2db8dca82ca99f2b74dee421b88f104df98e960c2546dddd66e0060992c52f49c500d746c746f9987c5efaf433129826ace11b58844fbab48b025bb9aa45c55f1520bdf9e6d1b59be1b495f78a3a6bafd2796616383d36ef541c8ec0b56ba2d90951c2a499563f4c10a098c43ea0396316ed0be3875ddeb74f8e76e34842eaa01bd5f7203e063bb801a177baf6d500f25379febd73c97a5f0c19feb4f0b157d3f085dc3e4af516b6df47ebdcde244cd33db0f04e41d172425b7614b5dc553c2e9470ef5c501ff65775fa0d59b6bcfd60a966f8142f8548da3148a0ddfb310e2b330996676083b3f576e99f8e3d12ae564c5bb5a237eb59e4be4b41db87c6ee6eaf8c433f24f486a979e2f7d7a26f3a9719759e0a0717f9ef9a8078ac65718d125a5e8e3f7528a0cbac4b120c51aff5fc08da4bd462b5a8f0443e2af89825f57fd76ed40c8b5f1e379b034c95c8a57fe8b2c468b9f41e17e080abd2065460ecaffa5cdf51ec43826feefc42ca4cab9a9cb277b8274c594e05555228fc83add365cd498648489d601e65c1c1de4d448db2dba9d0d3651479705f2e58fed30a8395293305e10d0bd60bd11671191173142c2925c457a2c9bfacf3323e1fe7db5aaf833802587117440347d406d3e44fc00e00eb68185a627fda6c746c86064cb8f2c7c6b187cb392925b3afd4ffa377c90c902d5b31690686a9b275fff5f87966640946b250ac13b63b2df9b7b761d4aed085fcc0d29b0f942b719b4b841a11b4585e848e19bd69707efbfc159c36bab22eaee3d1398f65fca5d2a2bd12fe649df7fa0dfa3bfb7b543cd13f2f2035144c121846c85647df00f9cfb572b24d370190c826930faec1ac908c50630ec46e62e84d99ce5de9ff9a69e7897f572420afdbf213035c1eaf6cdb3a7018d78769e9cce87b5f2ac081e1871716a2de4ad578106e05ca63e44428584985ddf83e6b0b7c442418c1f68d772f5cd3b79adb0726f96466e70c34682d6c7b135ef1b3e271f9a3983dcad5088e05f50abab76242be71968d4bb29a0717f1083ab87bdca1586d9f39877e02b5f0dd2fcb6e32515d6326e0d3a10c360847108b3ee075725cef792879f94fbee534774eeee6dbaa70ef1d92321ae68b708f046acda26a3161c23435fb1a0884f3d3aedbcefbf92ecc6ebc1ec2519c16ae0e1643a49f16c88a31015a5d384b4a05b1d83bd5b546af756f531c95e554b7ea9d25a2addf1891e78abed402bbebbf7f63a1b8d141c7be4c91f5c3f1d44de172f6ec18e4c87ed5c9aecf52959c68b43c137f9ed371fcc039767f2f2555ff85afc432c167a98b9a9be080fb8c4d491685b3254b86579de81b6da113a956b7b25a3b92f4550888eb2ec35522e3819eaad48aa9b0ec2a583e785b0117b7e22d3ff633ccd158a640797121be049a87d4a34b3a756c78eff1c6c281a5d7948002bbc723f1cff20776397a40b21a280bf596999079f3d3a8ba409575be8dfeb4930941d2945ad1c44a3cc0699abe595f41850378fda0178d2719a3d22feff0ca9ba0baabd84869258541d6b918ed23f57741522aea8848095657a9926a22ee1eec8fdc575e182764c53b134a9e6ef0e61882d6c761b45cd3aaed8317db50520d984cfba70d5b8adf11a4265bcc4a13216fe9af2b96c11ef970a6e0ba6413d9ec6c58760754730e6acef695534eb4e8c5694bac235736512145ed933a00f749ec16705049ef24a5aee4a5847ccfe22b6c027679cf297c2a91b8eb4e31b43b08f1b6b28144392af8be36f64d716d73d0b6b121e952af9413f0110fd5ae46995f548d359ed5fc639bc3281a8868405089d0a02edd56b5f77a28e2eca2a9432d076f10f436829bdd01df69ae8050426174c5efc7779796a1ef760e236781f0094597b69df54bd60ef25af608adb51b5df47ad4802a965144f7bb42017cc78252826ae0f30e83377b2a5d180b0ae1ed7284702a6ae92881ca160011b668462e8e835b452628bf3a1cf3568ea8a5df0079e91155c520c65a674822c94519e5574fa95b5dfb298168495c76cb97ed59fb282618b333e801ac4afd32b53bb39d2bdec8cbe47a96df4163353fb69971392ed0abddc8bb80f01b1bebc65cc0455fd2541f4414a69935966144800b9d3c9f47026747cb05813ff888a2054c2f8c48ec296d6e27be6345a62f78164221471a76c3b8a95c8687b8a77207daf8e70081dca1816476429ff604ccf7a63dd4243e761b126837c6afd286c152105b5a8022f730cf9df66158196ea1ac2d4c66672c37a2741691464cb39cccdde0c072efac4c878874384165019470d5dcba5d868ee6859b014f9a8a771e7bb0316c36d9e06832b099acbf948f73cf6841a5336c0dd3179d98eda49055cad662300e386f57bd627945028a4018fb2ae8ff9027800361b0290c510e1afaa8f162c117d856016c15f55a97966c09db62203f026bb8a40e25849740edaf3e7654d615af91c7594202f21030e6f186b580a1b98f0e68fcf8872c39c6b83564d1b97ba9e751ebdebd48cc117d10dd1d437b8cdcaf3aa541cdfca2eb5f232bcfaad084e8194af57b21e956910f2806e17f081838468be6a069e71a03b5c846ec3b21fcc04223e29351fa6dd4394373608e0ea38bcd3d18fe1721948b2db31103b5dc6f195c7054f48eea606aea5cdc74dc8392f2d7d698cf94b549d1be223d8780973857490ddacd8c24706714094d73a2e51bf11cb241f7a16356d68a3ac5398fadf22412e5bf3785d4befe7199a8d4cca322b1bf1d4cfb28128d944c4da7a5c968a3eb35044534ea0fd1593e50a66f3675490fb68f9f9d21b636589957b26b9fa56b97b1bfbd707e2ef8e87df1e0fbf391ed2afdcff64e7cc6718dc0e5c1541c55a4eb2e46c29a1099332fcc4ca9a39ee4d26dc69019a95d6dac5c4ca5e371a44133a27eef06c548a2746bc5b4c93de79dced801bc226f2fa2e91f22c91f118bc5449712f1e2289d7e8481f528b249ed43bff56a20f16132e2ae4e7d4234a98907f80f635dfccb17a4cbd5a15667ce121e4500ae42aaec56e646e8d1a443d66890a7f7793ab971177cfa8100e4443c8867605502d0345f13ed6ff685e0c02c8c551a78fe1a9e6b8bd847d28dee52116bed9f2966b70e3901c712a83fdf4417016197acd34de11210f490a30045be7c5aa1684fd364b0e1f814a066c84958360d39385b41c668f46f824f72b32bb837d7a21d00d48448d0c93151c9914e87cfe2e58438db2aada6afaddbd31dcd8a10c8610e51f935c51d2328b4055938030025d5374c2e09729848aeceabdd33ee017c7f8a7ebbf3ae044cde8d7b3e3973eae438c68aab074b4b45499a0045a35796156ab2695ee43d9afbc4e1836e5c035361418fe455f2d9c9711992964a478bed66f2be551089e65876a1559224a7712964ad4a688dc512804602661b453102ffd792a820c47d01e6e5b934683a1834cb61c48ecd567226f06268293eb2c868df4aed8774153bb986c878f8aeb8c6ae77cd8542a3250ae3d06b811346ba95b6109556352574fb7420e26fbe7990ddee4a680ffd5c882213f19b625d6fcc0d5a155184d7fd88da2b15a4c5313a10bf004133365fa47a4d709fd78d6499859b8b94b169048d01217efb502b957e6b4adc868ca81ac27239d1919f5a30b0f56abe5c45b157741fe20a02a716953454d2626c604bd48dadf484b8f08b52d72378b3d97a5ce1c6e6a4845eb9e7fa768c15fb298c9cc9a4a306f2bf7b4f176a9c8fdf1832bbfcf3f9b4f57c7ffe649e115d5bbe2ba7de72e0db1aa40a3d6c5d502524f87b3103d77a1aa9aebcce61223a0a9414ba6f389b4ea87eec1616294fb1d66076176f8391e5a76dbdd750872122c108cd72214bbb2b3fb7da431ae9b16f9fb5b75e56413c67ccf98a094459fa6f38bd718d7558e6fb0d308a1974d8c11ad465dbf06fa8a83fe23931c2fc6807a234d48efa22f251129ba4d3bbe5a7e43dee2e3c05ea28a0c38ada0bf6def0e3c1a8630de3959da38bb4fffe9fe09c7dd505c2fa7b9d3bed05ef300809504af78e3735d205759d6fa242dc85ee2b7f0dd0eaa867dfbc66c703a4c9ce727c99ec7028e2c7eda4554307e4661e57a00e6620f0813daefd81ddc6ba70610510ced50018403cea7d88a7da66cee78fa437c0b19adf5209bc1001ae18e5bd5b15d36944d39c1b0bf625948c1b83c2702833f86449bf32b9c90d8504a0801527bdd30e32300120e12cb1981252572ad4d9507f03c633519112033cf9ccb60e7485852986775e2a89a6d37409beb48870ba4e230614bad211724570a39350de1f77882ff316dcb591c138005a2d048f0dea9c46570127261ddba67cf8d710786a41524991757c3ed91b1d7ebf10356390de024dac1eb2b90af2064f495e4c962877cc009fca9b6d8210e793d62af27eb4c159c74609c5899e3265d215eaf9136bc967527fe8607985dcd30c4ab29c72e84dc268586dec8d0684a60182a91a462ff6f744a04bcf814430a2a88c2c20d6c8fd683240ec111e336c7475e45837f0651000452e6044dfd0e29016d7d9317edc933d03560fddfeb19872291e698bd456523a3483cd9a973c0245aedad6156af965eab65788e45fb9b44ca74e1985de1eee4c542318586872ea42ec90d29a40901fc1439974cd75d0b5c42267ae1cec51010199caf0aac5aa70328162ff4011d39cc1c4b8eb82b04e5562347970ebff23a126192c0ae2fada520440e5258fa2c56fb9c152d1f0f005a6b90b6a93446e171507ebda087ce77ca56af882afed4d6bdeb89aaacb6a0a6b3940af53ab814b7937d900b33065cc5f5d423f713ea086a2bc582f56ea7be0f50e75421654732999983f551331315ab3864851a0b255f21b73048b18f2075b1207a673fd9eb03072efcc7539f09292ba8f51de372974c40780681cf1b1612d7879252744f420b9c77c7c4f2e92adf2d2260c61e0cc04a080321dce7cca837220fd9c08c29e1a1bf8dc01e56fcb9676b64ccafd25d7bc2834e6e5345563d45332e74dfeb4de5810c034c66d828e2704b2ecf1f826f0858f3d4b88618d8bb615188edc987fe53b4c1f64db8233046ad93f31f22e8272f4d47a6b664b5aeea052b2a910a81cf33fd95079b15a083a38cae5480501b186868ff8bb4be3bdfb6ef9da2c1d17a9c8fae2325b5dd64f0213beffab74be9911318e43896fd1cafa963876304cb48ed05be54bdd8add319556de84dac3ddd6d3fcd58bb258444baf4cbf8035e44b4d79c3064eb52e3617029a13b07a52f1f5d125eeb9a50a908ee250389142a9422c8b781957618ad613c8c54a24cea57300c13dac96d4da0d40d2854f1ce0b7a98dedb64ea98d33a528163df6ec0f362ddfd183c2f0e3ad9d3e576861c37072f786db9a99f74b4021fd70282bd5e8a3f32dc93ce32acff6d6286eabd5153982d707f76115e5911129994b474dcf51029622541ae878a72996583147444c628f37634079de1c69a17fa12553b8bf4389f424c910ba50f0724073b885974e2b82b8adfe8f96e82479c8312a4175ac573ff26303707718529e70ac90d7ca3d54e3237b8069a5efda6b7823a86d521afc2332ac07b4f69d1e76715939d1f6de1bd1aef5c05f16a59ca5f45a653210891ed277cc6ec87a2108bb675b7cde7874d82c07476c97679402b725d89242ca2c68c68151e5851e1f24f90271f9b3661844012b893884e2c04be35f5002354301eb67d8871e224773aa65a88f775231b8785ffe338cb47c1ebfd4daf611e46c4936f784de6e12ce0a1b9c975a5a74c990cb0d0d9d66c34048011badc91bf1dbd5334be1bc3f153c9badb0f933a9b86e20fa25f9dd5fe1045c711489043218af2edbf82e6e04a91a81b55824ad6a32812b46a80de95c7889dbe8e7461b7e7628771e86a88c378ad3a8cd14485038c91d4b292d426d68fc8cc69060a7cf562a053cb7092e9694f128bebefd4f4e117a8aab694f152aa2502e7b8e69500f798722045e956efd42ffc0e835ccb0922484d393e452dab6e6b6388468faf794da4be4fbdbffe925ac21ebabada6ee041e0eb35fce0de70922e242c36e5b04a259c99effddbf79d3afacca1819b070b03dee7c77eb41d7bd6cae94e02d52198ad5439ac04bac35542aad6cee7c0855d0d7e227f60bb8b94710409528d1b76b34a1f0504abef020fe3fb37caaf9a6afb7b0081acfa65224f234392938e3f143cad6e08a377b6bea00113f7b0e1dadc5ddda4c166d032c44749bb36da835e36233f40dfdc25ab16bcdf6f2f3e81208dbc3ac57126e3633aed0234ca4aea5605bc5eb7d5c3d275573bdaace912315b28f05e3701183e0a0bf588a82e47b1747e5fa91d16a182a856ff11d169780b28f12d44a5a868b1d08f87a18fefcd42027af51cb9adaf3e677b251253197f2d185be86c27f67dca7fb180b949f86770b562cbc03544235e24d7ee341db62ec8c2d0e536fa9944509e0643c20c0a6c02cd9f3f6ede620cac620579077ad3ad6b79acb1340c4e00b627c292ec932b262efd2558f3de73bf2c8a311ec8e4cb7285669d85679d5c8e4c71153b540c5940b0ef3f659f0e88e44df8a0adf6f04296c121ac7a059fce4f65dee1d56c5f829470545701d2dbf6b04d25a8f76388200568daad9df8781680a8a5b18ecc38bdb010ec90bd672351ee039f5d2a6c3c14b8f9dc8278c6e17de022eedeba268b81f9ebed6df500510d63798cec7e540d6872d24d5aa8e3222634b45ca71ae9932b24bb624aea5d58bd1340d9db8925ea6c6b8a3909419b3ab177376c124159616b2bce090abb39093fe3464bfb51708060a49a20d15d56f4419521d369e5beee15504c1e4e4d7aeac97daa7b8d57e344edfaa21477791a8dab67d02ed3a2a56ae619f0dde3c001883cef9e9bd6c62adb656a57710b83f118095e7922b217cf90b61883495f2e4264a3e38996a48b1ed79222956d815a61341a43dc5466a4a640bac0cab3d8a70bb28ec5c970321427f571fafd50707435883ac3f79127eef6683b10bcf2ccacb2b1490868037552c431d6326bca30e5c1da38238286eddb3cfbf0237df43198bac2115215f978b16b4d37f1fc3902eb3b64c9c9e2de1a8f2486f1854ede9ff5932e34e8d921903ce6d17af604d1268029375060f0ff3add859c31016806d0911ef20ea5af580004cafb55f343986c89a737669823875376653c9ccb10d91614af97b3bb81cf337deaea551bce7c7d9cebfd7b5cc964ef103156fa72c0fcf896494fcadee858a5eb16ceca08bc71c0439d057afc5fecdd9e06e39421cfee645b2fdec3ce44f5c7fa1452daedb9958ad2ca87607dfa56f0da769e63407064ed8d134f86c0e95aa73d351eeb4aac2e5ebe0685f2ee0ad248f94a77a4ddbecac75049c87d003d479a2da55b5b40e45dd1f24bf09fac55600127e700118f1c188d2877217ec6b475b8ed22f503a86e5d5487fa9bf21ea0258f807715b5fb19c8ff1642c5c9643069b14aab11582016cae0d4ee8e78053cee7a598711861d5d552f054037005bb96aee79dc76bdfc536b5a3b2778c309ef265a6879e03aec4dc3e456c87ac7e05c1f9d6dd5decfdcf8938fd324ffe3400e1bb92f9f34d66acd96d37d5d1b5396d2c054c1aaf03e1355a9a286001f5483e30b2b60625ed815f308fa284c620aef2d6ab630952a5297d5bee05a30eda40a5a6d71ce797efbb5891bf37d64fd4992bdc7dd27bf377f765c5076a44a23f881c6dff436f849f93c64e5ca4e0ebec2ae34be221da33e03fca7730c5fcbe50bbacc5075a21cdeef6344f0583b613d4adb825c7968288d5e7b7f0c3f5ec62e87259b74e3c1dfdbc450b1db4887cddce508e0ada8f31450f75481b30ebfd59003297353c9d80d0f9889df3e7f339feedc4d2b3ec4b5f798d28949f0bf3979eb69da9ac7ff45adbdf6053dce3ae2e3e016989489ce9f1fa4bc7892b0c92d7a33275b9301ae7ee01e9eaf45b36251f3dd8b3e721b0e462ccdf5e2388fe8c3a0f42013deb318423b5150403d0e50125e472f197d231c60b538899d7c13e1a23662246f7f685f536f4c9da61a2fbc98c4299b8d499e9f7b4994c4c66ea2fef3bb20e46eed23e3812ec7f2420eb4c72ebcc71a35d6def4f7e74dd15abddefa5b537721fa7c1d08bfc93b4d73d8dc3f81e9c9536bf6fb48a7a4212ff88b4646b34e9701ce2193f43160726a22372d4f87e2cfaf5a71a116d4e9d11ef0df9a82cedc07c211c3bc82ce7a46059d5b450ea3f0e15a1b027a65332985b10cfc94be93e1f3988c7467a544c54d3819138991e224275910256e3608c80fb401e68132001ee803fc813ec01fe803f8813ac069b9b40f761f5edac1f1666bd7ba0bbff3e2b1d6cd9cbd7500ee9832689fc5194c89a5bea1551775c48a832388b38d8b7fba84208e76497a1b3dffcb6da1c15d9944b9eb3a64084623ee6afefb0aeb81d618d2dd6eea1d2921c976a797488e7ab6f6d36312e14b2d708e040f1e17d143628724d071ed04c5e11f0cc51509c61988fa68fb6c0e3ca104f11b687d0d94cc2a19ebecb614e72a3aa17b99e919f350f11633c1c1f500d92b31b86269eeae6180a7998e40ab8b88cd332f177942bb7d3b6776aeeb9d798a3e4bdee91d6137dff698fad2c5e3c534442a9499c0809961c4b6a2d03f0d24e62f9656c86f0706baae20dadddc9b0c1925b526c1fb9e01966b983e9f39dad64d3b6209e2ae6533a9cfa19f0575ffeaed1c04dae6e859b9836383190c49c172317615d81836565c83a2f1e209ae82e6e79e1fc1bc0956190a98c0d59dcabb7219e3986e70b7520afddb0969c664bb60e5238a1fce0b47cce6f00f8cb03e57ef9c4e859a101d12836cfa431c5a0e5ed618d17fdec176065cfee122a639aa0f69051419a8e50aa28984fd2ab086fd5af6fa722e74773f2be2ced5de94aa5910bfa851e98981c3b9c7f8ef1610d49dfb5ce6dda3e02e0e1aaf1bafc620f55b731a1f6d1921f145ac597a8abe1ecd5bb40873968585e5903cfd759a42545f80eeacd59217a534f5f80e167c15e5dffd394fe5cb839cf3bbca6a4a6fe6d76c9976676b77de0a85541bb209ba7225468ad4081bff53fbd341e8dd21444eac9a4537d375d0bb68796ba08997d5a4ba9232fd8dea057d39c3ea6ae61e32ae6ffc94f0592248d0c70e3387da5df072e17dfc8988b7d0c15b86b00a56c551cb428b0e3bf061aa48e48eba1f08ed1716b9923ee3c9df4919ada971cb47c4c7b0f266042bbfde17a193bf8ffcf3faa62dd378bfb2cfdf143325692375a71eb79771f81a3a1c0c2cb668be69e5cc387a9d9a189f9ff5ea8c82f72838da2af6cf98b22f369dbbcb47390a4bcfa1890f7cf78fa964f900b11035f5730db37d816e69cc370106c6b44fe374f73836fb573b18c57f94adde237094be616b86e1fbbc1edc6a36b4a8fca2851b15487691404fba5ba65e27c316f93db92e266fa32f3fcfc2b90332a456fbc2e3bc631cf8fbde2c3fbbb17ddc56dca9d1cdb0fc42b44de4a3b566b066f14b814125fb69d9b166db622f970d9a7be549acf5d4dab8d44eac33fcceb59a62fddf81954e27de17ac0b70d2c0010d2baff8ce868346249341bfbdfb223570a690f69abc3bed76d99f5852318ae5932cc1fd8d0d985ba03a5fdf1cfe6e4be0d0a3eca40df5e4a7de698cd203ce2afc0d409849202b04e673f53f23763a6c18dc43c0987bfe31b1f4c7ce5f7d930c91ebf8751f266e62697ea60ce1c66de1205474469917e21e1fe41b3483e6afe18b29575a86a39a17e3089b291f70b6544b5f122bec4949edc73b5fc98843fcdee07e6f5d68e5a1d8bca27166fb4a6cd37174d8cc2df25b20742674b551670630c902bd830f48a8dcfc75f2f9fb5f354fe3477f5d1b22abfa5777779bf1aac25c2106d1c77d38961cb7bb230fd57bca6ac368f9b6501002482880a235edb1a4cbebe9f37264cde2c2922b278713a2e6fcbe75a233a6aba5cfb78b3588da3319166da607c9529cc5356bdeec3c16a27456c70a503b65323360a80b5157dbcc213eb8c6091ecf6e7ba4e11581356f36cc6c52e83f825da86196de93567c4b36faf1a69504879b6f7334054ab736427304fe0bc434497f1c7b054c30f6b26d721108f0d6a09a81b5cd79e532cd7589b8252906260221fd04d77b236def247fe1b8c01289112e5f32e8b166b1ca79efb46d379da943da9a07740e0d6bebbdc99c63dd296ed08077f2939d59b98d67351776ec667058397f00ddef70f8e8a4d983964343322fa68564470ab390ebac1d1e278bf56990f46f2a04c069f9e73fdcd2fe2bd58ead178d3b38eae830b141614a65d1a1ab4fccea590a9276141c0aeefa37d6eb9925d0005b5847e0603f0c1ca602053d5fa3fdcfb85e8e99fa32ef4ffa1c835ea94e04a6263c5e3552b77557eaa14f9c42913b9c89c599890737e657f7fe4b29782b055f922789d01a95becbaa7d07bd28e93f108af2c0a074c4393920a284b5d83285bb51a2252ffb839053be12979b5a363ede46fddb18585f73ffde20c5b121564d54cf9a112ba60fe91956dcc6ea301c46821e987a64c61ea164c60a3f19883ae819c61a64ee90f16d2600e67257dfc00972187e26bfbc84431955bb91425f9e54d74d247dba4086ac1b796898207166f6c71a63860dbec8ff16f441ff0fa57adad6b84cdf8e5cd2b98ffb09115017aa86e55ec2ad6fe7e1dd57d7ef9ed9713f463bc9fe86f816025d5f2d14e522ebdc887bf55f584e3dbac4f161a207c7581a825917cf3278a91e18ea2404d12375fe7b7a473d1e5c8be89e4a7e3a628c2988a7bbc83274ef7e5eeb6bd03dead7f99007eedfe7afa75e99e6f4f078646e3ccfacfab766eb6ffffd2e312d3510ed0c2c90d118dbbf9d3175e012bee18e5d144bb40dee87dc60d41b62d7cbc298b5741ec0025b67eeb513b395cd097938892f03e041adfa000aa6e4ea4ef25b35851b2b801a62e25802bab8d2375da04d8ec0af687272c5e80573a4c4ea21bc7dcd2d29463a0a2134699ada9467314b206335b5479009d647247532d77ce81a3b9773732a3a037e5f3eb3a4e8220bc7a835bd22585c5821f326e7f3d2f7c9475d869bb5dc8fea57e9a7abfeccb3066af5a484e187c37e3f76bb6942fb3f6294bdbf83e6a284fafbf093ff0a8358a0d8318c780c68766416dc81101d94702e8312501ab111dd742c05406d0f21006050ce587723d910a993fe6e9b7aeb3852b8cbdd208fc9889a2d80901b324b43c8c2317949c88569d98a29cf175a91146a41287d4196651dcd08b92be0dd019521f32e8bc10d4af5eb88989f1a22a77e318c270a4b3d0ace843a0ff1fee2541634b65bb327d0137d74fa6ab0c7c4eadc6f7383dc7170136b6d51288b5b3761bea3726594b4bb0cf9231694760a0fb9b7a33ba446c9915e77b6f53e35e1f578d5c7c3d04be304ebcd6b82ae4cfa37402952cc0e105604e8bc927eac346cc85189bc569484721a116859696d6fa08aa7f4c76786011cedbd281a317eee51d6b656851492b3d38cb4adf6d9f707c61e9a95bb5c537d62c14e9f55dc2726b2c878d5e0282cb36950b27de2d9e2f8c561b0e01321a77b57e4520623d136d50f4fbc95d1816055fb3253892f1c0133b6b73a72f75a78adeebe9aeaacb9d6a277b46b1c13bff01bbda4ad8f019f1542695791da455705cfbf0f353585be4dda9e596db848d6098d5c6c7c31d1b1a0fb1aec3b0469e2e922462919ddcc7275fb0c9b6533ab091c546c5d7455851a106adf3e3fba58e1bfe1e1dcea081ff43a7c9b557fb509e62126ed227d2e70f240af4e5314d85a92068cb6b56d47d859f2e464a72c4a53b56c7345f553fa7e211573a31c00ed4b5bc64b5014c9d8784b3fda30481c0718085bc096186518662bed4141ee07a1af05b9f091b7b332a0eda90ce5629c7023cc619408e0a7a3d282988426fa7dfa93cbd160df09dd646a95779005a223965cc5aace7b9f765e0addc0ced0745222ae048ea92d0c16daa0832030f7702857688b5b8f69e6e59c68d1ea6b08c0b6ef0100432790f36a0c961f99d375dcc69b6b53d266f28803761c6d7e1b3fa49de9286621677a71ae51b1cbabf569e1a5017ccf57d4b7c42000e1272abb760956e775598266fd7464c407e0901ccb5f09648daeaca32cf6911cd0ed8b285b9e04a48c4340be00aabba1f3bfc5dfc834b7fa5933309953e79e327b5fc9b3cf5a840673289eeb4022ace78f71d8cd092d142ee4efe94e47f9ec25965c5b7f483b32c81ca6b99ca7c7e91ae852869ee1de9cd5f22c714a6363fcdc0976dbbf146777b284fe0162a6ac8d4a18da840aa3a52c2b61e5ee79675675c0c9597c46229638a6865cfa069df968ba38fee047490c4086873fa480b4a4901520c482fcb59747b12680f5323b2e299bdfc1e17607ecba0853cb1339a81d0b9658701080ed3b7292909530c69ed09602aea24ddae2b6c2b119b32d84a37880c04ff70db45d78d6e849503ec7282bfb3c21e2acc748eaaa3d0048286c8994b046bdc91efb0834e14164f493e1d6add77b017f451cb4231e5477e917e6a58f9858607a088e9996c814cf12bea233b8eb8ecd964c272a74bdc9e0cc87e079322048134c8ae9703a0c2ce5da37770750755440fb5f3544c0c0fbc77a885090fc8b05c116ecf13babd70896d4879d955efd1058753383d0841a453bbae59b64a6438c3544508ee1ec45056a3ea6f5894976a791ce20ee8280ce8d0be670f6add23a9a787136e2f7720861e0b56d96f4af67441f0afb1329f67883a625a5672bbc6924015b4d2dd221513efb43a65fa1da9634320da16a443e6290eb0e616604c162c7db5ebb313a82ee5aca9728c70b2dd0bd9367bf51ade66f40c1b972ad1c5496886f40edafb89ce4c6108cf61c9c5fd86c1ae6e8d6353d26f2c766a6ad780b7f361f0bd42cceaa2e966c4145a85cbf57500daf147e83cc96d2c44623c904045f29101454c6f50f0c8b9731accfc4d0ea63eec838bde85229b4c906eacc9218161b003ac476a331870cdbdaa4d8eb2c35c06a331681c04f2cc368e9f9174e772923f659cc530086b8c108f53ffd081d4cf2a5904a925d52a01c94afd483101b97b30a6c7eecb914c8a146bdc874b2620f133ce6744b78b3ebf8bf0b6e794141a5d88e0b7dcd3825ed654bbf4d92ac0ae1d82d82602043b864c7197ebca1993d28439b9e9646ea4dd0c529332a9743c3a6cbd3c158566984387f3c0f2a308e581f67ce0f2133499cacee07e2ebbfa44076339a4a8720b19f1035a3f9fe44c1b11110730d70af7e79ef9cbac9ee5a9c8ebe09d5dbd20e4d0d7cc15883c076ef66c5fbe21e69af39a79af52717cb12175a97fabf312bf8e541092b5e65ba1b48c1df69ed33e5939d7ed896ce76074684ca68e6378972fa02b302f063b0c6ff9aacbd81f83dc5974dc851d4260cb382fe07dda2c645b5d18695da73b8da131e6a235b06a9b35657ff46a50382fb2a9e482e3113b3f015fdaf66303fd50910e999100b99cfab05159324cb4bacddf4ea00e0d9738b90010e0d98ea55608b334b295e8b687fc1981abfe968dc136de95695f4fdfb27b8774792d364ee5cb25c737d6abb8025741b18035e0c6b58e0b80470b059fc10279c92746c984dc6aa18fdf78e1d7f57af980af44b0b8d2c1dc4afdc7472f457503eb087a4e5666737a86f5eacfb4454c33313519a64c1cc163e0cbba1856028c85395e66e4a8576c3a892defaac14596198edadc7aa327e3231715531b6d46dba2e9c8931bdf27a1248978b8662587de829a2fcbc01da53a0d1cca067c38cf113282e91674fc05ff5e42a5a28ab7257522e4e9db9a8621f4b1ab92d4854c2268bb33dd3419287911bc5475a3a0f33c90ad0f44fc08d61dc985dc345726b8a2e7625b604432805b610c052c522ebd5c31e16621f971a9363b60374a324322553e0725fc25c495877ed9d52e4202aed2947269a373f2f73b9b89928371b26f92d99388e444cf837d9a62e10a46645174f023a9301d0371b3bf5b038b18d920156c7237d1087443135311e06c6a8266261a139f9f062d0a18691417cdba58ccec1c958e67f415142c47f710eda00e2493772e7b599acb259517f5afcb446d074cba921c3b871af9d3c94799fb3454397249378f6d043e9a325cb4c288392c6d0f2d336048aa4b2816c51431cfd7a10bb3f08ef0e6378e6131e74824194eacd453882286005f83ba687cf069dac7bf2ff48d20e92fec2df9524fb045d4bfb6993c87f8331e37003771786558702f1b5593774f319111251ff5fc5e9ba96dae9d77c7f2ddff8ae6a6c7f9b78ee7ca1418f1cdc6045f6b8f97052ab9d64806fce9b69da9b8e1995230b5d2868db3811adabc72bd46f2298806f579f36aff7e5f789d94cfbc1c9b17b138237b18c08df3fd9ad5c5c69f480b813edf4b6253d2de6094bfeddf3c3027273ba817cf844676a92fccca9065696a75716d597c47a271222fed2c7102b0ecec1024f002bf94193f5ea4629f116c4e8b6c554243f43326457652cc37479af38f4f438fbb5f95fc8a05ce81da3f9d7f01d38943e47d68b8f97341ec6aad51afd68e89d1b41594d8bb26421a7997be239097118859e7f01ca1199ee71d19086e9dca7af031e7c7687e68d7cbb701c8661ca6f4ea982269dd07d4fac47cb954a2f74e7a0b4806bdd4d5c1ec0a5e821be2502f3973d97cbff1fcd9db19b1d6860e1818acbb5b0a2b59e49fe7d0aec390882b308ae70354ebaa5902ddb413be79df10c0b8eae28e0b8a169b9ae1bca3f471de191b6112d3b6141febaab93b0a5f03ef56ceef0bd42d4334c9a1d6324877a1330574c775804aa9dcf599b7c288ee5f4b51c31addec4d6881ffb10b71f546bf102008c9598eb9799fc0daf39010ca2335ce4614decaad347c0e5f167c9de38ad39016d7368729ad07e112872ad97c0ec78f74df550272db3ed3871008e8304f0b749193977b8da9874ee8b6dc2aa650e7c79bbe784a9d27724e567e639e9ef54a6e4188e0cf14fd8090f45f2c7c0bda5b20623315a2e20af967080803030e10a295a24de321a85e603b822ede652031a50a0c30c7a5740ac6b2155062b513ed1216af8fa59acbc586a39a68e26b835dcaed0d650305476a6bbdf6a5ad2b51e0a22edd68d98131fc3ea8b52a8e629f5e1be75857d47c92e64f95fdc9e5a0a50edb0985c238473e288772416d53c49911aa3dbde48b6cbd5b56e472051068dc22e8e288962a0b39f202debc06d92fb8bd4e166c6763cd989f92c9bec0573acf216b54bf9bbb9a0c5d0db548a2dc86ebb473bd86bdc3427aa1bb27194d46252429191319f39c9327e73c50130f53487f307c7b98b1d42abd63f791ef5f63c9fcc2d8540fe414d6d5a9c50cc5570c5e20f827f9aee85a3ed27c41477bae13a307467c68ac481ead2a9384b566d613dae3668d07043e777a9604297a21a149b465e2819710cec218984e77f4351f232b99bfc6d909f733f391c7165126e9e68251886f4b098b7f7c26f67d66042acdff5327a2bd06fcfe8021c6c2ad4e57a2d605b9150f7d0e6551c31fee6bcdb83418ba7976c95cf61fbdf3df0d01532a39836cbccccc4395fd0caa7acabd40856d3991506af626ec1f356a2a54826162deca0b69f1dc32e1ca5a574b2e1f8b6d86d97ad49c9568075855c0b6ff8977946b36d2f79927addec1c06734ccd938528993ecf51c05d610cb99c7944edb65e21e5590c1bcd7a6b10578adea9b588b242c04b0b062ba26c5ee12e9573571556cc2b47192ba95946af3a6b251a99f9e077ba649cf8e154f6c9b8f32335484f0a790ef3206eac31d7e9fa448e4ea149b2a1fa7d9ddb665f67002151af03387dd0747ee451eb38b1893fa4efa22147e5597307faf0a0bb88171ef55b76f75f8b8b55e592433efc368a7f112f53ea691b24f64d99eb46cae9443ee4c974705bf371fc9d831a5481f6dac6c9ee907523aaeaeb4b625713d653ad18bc9aabe9ceadb151793201fb020ccaeb0b90272efe8654a6b510b8dbf75eaf4c984c8eb5f4830990a0e2a7d27fdc9371da793a34e138fd3a8b59d08935be887de82b7db18496c49d5df364b23d152ecd1d57c26ddbc73f0b878182f9fdc365283586653b0367e5515179daf69b41cb67a0305e81b6f885764b8e5f71a3217fbcdefcad6f8ccf0d179f5f236e6de3b1349ca37d625bb735dac409f03a02ca64bc1e3800a0b6a8ff77002dfc21789a9608b6cbb66defaf8017dcf3b4964c1814fc600d6db5fe0334fb9f26077599a3ac449320d735ddbf6ef48ccea605a37f0120da3ee1525eaaaacb599b41286bf670d980e32d77325ac0e6e9595ec9f649573c2ccf98abfb5aa0ef489622be10a41b444b89b36653c3941e801ebce66110f669f4390dbe7e414de9d3708227bd802279068fa6838b4850001d3c80b97a83280420a9e57ed902f140a2e33a3ef29093d95edf3174c1f97113374c092db6e14f8efbe1f9abac2665aabf0e08ccb2df55cd14292fef0813e329c85f9e9afa438fd01178de7837ceaa6f77986a3fdbd6f0b1f63f4efea514933fdd3dffe1dea0f182e8a4abea2841f1d7e93e9aa3dca98a17365583ecfe70b2d66d9e5d6d7508aeb93afc149e44caf0bb082b84307d5f9a364dbd0f53d65b39ef746003889fab641312e03a19de16afb82e1e3ad5f353966df3369d2d73ced7b30406ccbec8db69d64fd2df4899ef549892c0d2b6cb2c9527c8cc7393bd187e7172ea286d83dc7cf80c5385a8f632fd642bb792916abfc849c9ebe34ab55daf458fc720c0966bc02c4969e7101f440d3f19323f237ebf7b9672cff59c4e8f74add47a6bf150a180597c0169e31f16581c0a943aef301336d5d1dbd0eac7458c98e997a27f8b59df2f424cfa2d4fd6a0f954b059fc940619ad845cff7ff38afbe42e53a6fc89adfaccfbbe3f887bfe7fc89773378c1e119ef5f35d615e13f797809e5033457023cc4f26e86fee66e4a3a141fffe91316fb32679b35986723f88d12b73c914ed1bdf7ebbf947957e1fff32896eced337fb2c542d533b80057cfb25a7d88d7bb98d820b1eacbb4e5f1c1200625352a8a14817c62fd74dbeb00ede44c83423aa405d72677597e16f7ff6851e2753c300385a086a138dce1e3174ca0a76dc433b66264dfebd93aced8553242d98c83e09a02ced435eb6782f5487ee0235a2787696201bcb6fdf926f21afd18122c3153a0f5e560f35aeb5caf83122762052022cab140b68bcc0f5034b6c983d4069e219b7b8f71d127694520cda93b8a0fa8024759ea5dcd706b837b831d4f7c8e706beef0d319e1db0e11dfc9d6de5b3ade60093bac47ba54a6ffb68643ea02fa5fe5b3e64cab43bab6b62036865ae54f7dc17ba8364af51ab2fd015defbb46a099e1d225836ad9d6192ef2318d92a7b2d4e93d9865db6a7792eaa8dc22aa2e8b10da84f738ea5607bb258e5c2b01899b9e587849ec785d58121d6a108ac07af7196d9c7a50b424af7b4e4e60671a4d7991ff7fb87e27fbb59560ffcd9d2d7bdee537c2505cee1077b1b3a10409872e266940b8b10c436c4338c73b5b5984ec4aa9d9a16bb2dd1da47b4939494a8a62f18da0783929292921223b2dfe5dbf6c507f2f7df929522fc1e6d16a02ad589210b0d085be08811bac2438e9418860f1725d0ed04192662cd045336101382a541fe39a0d1a52639cab818f940e141e1031f0d8ca0226d4880ce98e473498dd2e3bff6e40081951a334044b03ac2ab814598229556a45900e5c31d0f275aa8a8054ab74221303e0e060c937363ac10a83861741a3ca9a44440539563ec04b02761b050d291d132c2a214acbcd8f213c009482bb822443fc86283152495a60a8315321a3a62ac716289a39161a9c9d80883608141aa8c18d07285081e34609eac50521305059c999da458aa38a0e38708a54685486c913962c10037598e5801a9014e80ffe2cf5658ad1266091cae272da47112400704249192a285121a2e52d1d935f080d50784aae40389b33f3b32080c3a61439d5d8bf984d302617a92a0a963641559130ed09cadd92204a66841c927099129541220fa80708173a2486ce23405001e2a10e4780fdca9b524d68a112440d540831002ba27a04e89aa05c10c212ad2e429f1a414150b66580a0242d2ab20804abc7d99fbe40193181ac180e72d8f0c00948c88a0ee8a50b041592d5067207c39c3c669850f2464a2946c6913a7ed9394abc3532d135f7dae240a93b407900d458c4830c75005625e486444d16469c5074de0e47290b90224a26b87d9902c7e8454f0e3050c399f04a94cd861fbf2a4c3c40ed02427e2955b035ec4ba28c186cae25e28e5690401264883838af87f643c0924820c358c9a7349831a3a5765353af978f369ad4ea81b37d8c047cb3113a335e40b862249423570c21b35349479022342d25ba52070573ac04165474f890f43b68c5319a930234c40483344a3089a3d65928c71f1b1088726084e60c126161c1e536c6160d2ce1b147eccb834e446a417440a382377220c6d21031f216802a11082cf963a3a4e91717032ea108b1a0ba0c1f421112d5029a4029b03e4c808a1e0f03c23167023a914881050c8d091488100d054ba408c0c459c60c09202d999396e6628902704a8ab0412a1129b81300f5a743820eb4baf08ac115fac009df028326daf2632e880291442071f5a049260011263276e16b32d5caeb6a2781885860f0cb3e203164c11e5bc3a2114db184b2c0e4881660f2b139088f05665c9e3894a92389748e0313582981d06b8b43201852104ae4030226c1423b53e26267d9e073257464a80f4820a1c3306a8b206d05b052052a1418441dc0425a8017a5ef5521dd0290026966280612337c209a952325c80502a54db06608cac0009a8880576c5070efa27cfa72044de14e063470948994ab043611470a8c8020cf4f962e78e58c113eef26211111240c8aab5480e21de8a446aab74394810d206c1cebf82a58296094d001b5d7d200f9a371f20ba210aa80ac48614829b4f4ecdb08015492568512a4688b0f18295a34168688804cb4d0551a64a0c6062d60035d019c5c9d30b8e848001f14795103113e00e204103975182e4bca55942e5288f883bac3a1861f68f809065090d57409073a86c8e074b3aa051c3c809138830a64607ab803120b047096e6669baa4411a0c1fe60d5fc03c1c50a7920849643c08603108cf9a58724edca83109cc1918a31a5b27ccd065420209c626d1aa51318580b3e47c6041494c2e07d89ba49ec0081b11c0d96081b21b229ea07042949f15aea830218b01a062b49a144a9616322335bc10a5c41d59a5523092a086180a4c00d3a48a8c100f51b3ca7c82c3275e3f2da09840c5990ea8c0cdc0c1d608ce8b0d7fca90bd50a20dd62a27069c90cab7da52838a2dec072003dc8890a5d40704c28c80c207556752e40884874c9ddd0e18f4dca121030f235648a4a131948518c001540343201952419304618a0078f2e82dc51c447136682410e2478e14ade4362642db8d038966bd80414b0e0e245e3d1905c8c9d9a6118f662d2ad1690a236490a04189960f9f065821eeb91944704145a034816cd07fec986860149d352facad2981264f2317670510ea11a78844063f50f546e099c127c28462cdda13fd474c07556a564c190080174b1e05e9f4464dcc03880e3e9968d16353142803d0c50a191d39cfa3146227d47cb04bf588c60931d6eaa343f89308b20f921c08616d4600665025f095409443263ce0e427843af76993065d7658f273022a3138269250188f480139a5bb61057c4040c49518c04440b2b6c8cd6cd22b4d44165851d664eb9017122c246cb9d363950425a2c8b1310b5e75edd8b7022f5f4f70003211820818c626b0744ef000512f12521805a265b26a6800552c28b52018d386c685195a588cc13140130233b8c848d801b74e3698d005ec43e4494ca30a58b19500e880216b3cfc13781a516aa15693163f6ac460c9d316b84b642726ed018b3366a8432fe467947f3107b681255321c4c09ed401238207894891718342089a113f1219da1554aaf468cd263d8ac8f2e09163c14d9b1380e4e4d6e04820821486c28bab4d3af6fc50d2060623179c4ac8286e504bf3267fe093e684953721a4254724768a2c6d7ab4c0184b59787da838fad2c2d040f2f3a90eaf0336cb04120450a043438a3f713c685450a7cfe0861512105a22414082d10b1520613191824c9f279bf2c0616187cd5a1422c7ea01a4d2a9415b50cc5531a4628f20c39a573db006b48c8af4c805a31a46f4d4c87ccd2690a9b9331f4c902a855f91424ecfdb9cb241589c8041538562592af1094a0a5582c69840fab18749125733601831c3a74f8e54edf0618786291f9f04693858f1c29db6ae0ed870e8a0f0c8e48114964326b40c4945278a1229734b1db1154e419240acdb60f269485807ac6881eaa3c300361c228a444f456af099c0552d1504a4d080192d3331c3032664dd30d588160573b68cca3488c540a68c58a413ce4c194626c9542c331185d6d636b5d9f0e06295a6cf0d152452658a7a88bdd10205088126810742659a448ce94a5536cd0221002a9b70d859e363831b60274290b0a5c7b9b36ad0d61006d896e84e40d9e2c1041a6bd4c878911348922717ba3150d1ce1d483d4595502033c06d140b1d5818040815b2d304121f0c6008b3644c171d8a2f3da6d066090264bad3bf5861a0d3914d41844a87930ba84050a888579b223a1d580d252c49414b900864b1b9d1157743a743c181a55625205d914106a1387614b1ba3242273b510c7df0a20721483a9d2eecc90db7cc44285792d0b2133b3a9d2e057f914a04271834f293889526f185ccaa394052fc16b1601442610518647706a9f8b2cbb05141a2031d4ad44e740e9432752911062b8539169e0ea9c179d28dc8a17b8f867c4980cc9a512a28c92185290b872b9842dd2891810c2d78449a13059018dd880e0c19f26a2323f441976e45043594f120c8cc48243b266c2cc976d2cca089852e62b1d30da12e1190a58f4e0402a266ac08f302cb987081ca275a61b644dd1003b40a91e44013e944a08111c305171b37bab22b3ae65ca05388c5980cae47310069d54504aa14be86b42081ee44d9274b9e6a2832b6418a2b86d2dc0073e053943635742742609372064947469588c164074c84b9dba90b8a29ac0ea03a320f4650c1260cce01752345991b3c3a123eaa8c0ab3c36341e25218dd88304a3a1561ba94784037a28c6ec50d133a9d4ea7d3e9743a9d4e17e6872c8d086b7f1a01e000ac20344c057748207961c6aa1e974e49dae05eb0a5e703135224704481544b4e20b5458e97982f03ecb2842920e65505130b0ed6b090018eca0f2d21c822b9f0c5821a179ce40c288a0c91f3420328b210f161661021b25a7978d75c2b78b0130645906480014ef14a50a1c2833b23ac20c39102951f095698c115223d194c31a122704205bf66c94a994f727ad688f8f2c01115b0cda97f0560484d2432730f74555864c616c1a9d121826d0304332819418c0e2ba34ec0d002e2c7dba20dca640064280337483c89b8410d028042c90d794341489b32280c051acb71509c2861764ed8e26488540132982823b32545ad0e48fcd0e55092a7ffd1c449849b40951aad1022023b2faa94a0c2140053c4126522e3f6a852f43059b092c19e0f259818d5c08b20894a6004e446a4376c8aa0d081882813a58086c29ea5699985457a996235b8a4e97851800e4f5c74b2606a444017134238e538a26a4d2c13981d2f84383503a7157648848d42d5a30ccc8c6c44581f0c948c1821c414152888f106e45004924af5c900510943615f24c44294e6498f3642bd29d255784a52c60a163d6e718c6aa8b14303032d2386541903f2678fe7d38ac79c995906289460b182057494a8c0c0888989049b0c4a5f54bcf0e065072012d460d2a190c2c7dc0e3c612ee82962822939733d745d2a0d09624228126c4260306b8f2325158070e7abd3058ceaa4880b3bab01c6010d5b5045f25141096c5f616968de422530000b6e49b49cc0cbd26546822bd090158656888426468a1b889a78c94021c2924e52f2f85844832b3336a0620957c06e2811e3460902c8c529aa92690d03283e905db9e01671c5a6920a3388b59921640881828c04120ca8721dc6f02586b85492a302981a05e45c1c6a66846895007393e10e1f4b65c2172f3011d83acdba604cd20b663c38d156a3c59824f4c7921a5e726cacf0270130b3507502569d005d2aa1002f1d76049133d6b6c2d12b550eb83004d11ffd630c8a97b2487b0821823306b863009c39394c0eb510f181074a46b6a4501b01d1963f5b2506b52046039a2e29293018a18282a2640b0a0c40ca5cd04042175002b0d201c590a9100ebdd92462891b396f6b5c2402722212821596a28f981b2c474238b041d49c3bb458b84aa267cc049a579213a70dee8031418b0635c6199315a75a3100e7921c339f18a518f1c58a463582d512511f840ac1ee5ac918f10c1d5bc206413a901d2a601411fa00510d1a76805931c30996321f117cd2204a202f40da1b0c46688933a9089b0381667861ad960bfd844c89273a067a994099303852c6860d738546a988bb41a4469f4c6d86a43d70b64189162d4678e013c79c816401259d838a0cb7b124244ca85463940c2c2184999b40802b2664f29382d198133676810a2838ae28599ad52649180571379e7032a2666cb9c1d31828582c915800ac489c076a9d6241492407815626d0a4f83086419b526196d0b0695ba954d5391576000d63344d896884bdb575b10e566482f88c6a53ab963784c50b0e315f6836a070b2428b435c6a31d0c20502da84ea416a07a688032b0e06a84546ee51a158334cd9f084cc4518552a26a8a57624e3c9b146ed569de0208319a1702d1d7c3c0400098b271a83c088ecd954830c75cefcf0fa6224e484bec1589e362d4c7981cc9a261e3ed6ece818653a01a20a901256d0c04718894c6420e968684084a848a73cd8f1e3840f67a3dc6cd2b939324680070f4c41e2e4c6590b3c8ac46e249252f6400262be60102aa2fd04498b5344540822be34990564121456e3c30004f02ab171410c4faa5aa6547042366948a519103daa0398901488cb282f4228b8e81e18189088cb888815430648c5614daa14e64c2a01ce0477e2c410607184861d70a77480a9f5aac615332a9880a3d246bd6133030bbd562b2196fe7c2bb4b400d342112bb31f5b1850d5098492242302d536ac0ab960019d12f56aadc3210a4ac471d40aaec50061963c70a71519003050400508b3d000a426f06e240089733149002023308b22666c98b3c26b3a2b13874b99b3125f2efa1f371d083060a4058c469c1ed82a3a70a0e5129a11a90638a08f21b74b3b6e081b210535191c325545832b3006f950685090a8c2a157a4ef7173c4527dd2288a0c19521c0973f6498b0a7369921c199a81b393303439e80c053ca562e0b264500d300564229b81812778be04c9c0054e30451a194c514291674dfdd00206366c92c832438562541758a8ece5005692ca98d82770c8c2c03890f11ec5f046a846275422ac92a58982373a4eb84ae4c2a44e022c89b1ca8605c2b2d07003868505172c407850e28109121e4d0418d01973c18c743140006c7e563cb1718a8a00239c20526a0b0761270030268aaae9234003140c4cd58c194140300090a02e2ec0f0612484b1246e37c4522168860914770688cb24854ad99f0fb01285724283138f74c408d8d610117ec864119b010b0349173c616104103b94c42ca93531a1c02b01688961f5a3448a1f5d6520380ce274a615d816047a72a098c9f944f4f8422481432e98700ad39e3b6596620021b6647b6a85019b1a7dd4a86046a7897366c26d919c42430a0d1993624a25aaa1119e1592fa7cb9a30988c2840b029fcf940dce8ce004a40d062f147a01afb962e7858e21874a5c4a61438cf0348207a12490a61b02cc5680f804a64d05992a28112506961b732fd846a485a844a356993a032c7062525a90449f4ae4081b13a9d10325acf0a145a32f50f83c5161048e8b2c33be2b644e28e5b65b19890b5375c1dc103a68a6a0752264001d1754992121680c893b5da778c028c1a906af226f5352ccd943c70c8f17970ad52141aa040cd28c09f332ca919ca44c075092a1cd060f0eb8c40289165bd5081b94048941016483293002482848c5da005388302f64c09f34f9640da21116b6698828004600208a56d9920f8c4e914006c7cd9d2892944cd2b3ecd47006e8812a286acc45ea80968c4658b40090400b0748180196c19a8a1117bc00e78f1a0314b1b202410c32111d0ca860cc048ce00cdae005072d2c7175c28d8753b4f8e03fb32e285bb5e28c2039b005c4bce1bd28604dc5174a98263814e8c7189a0c6e38a46aadc701058809d101064b34959d6293a80beae1400d7fbe917fc29b11112d94c1c1702a069c37921aa9ea72e3cfb100b4084b1a206204818d0d504529c205843221b090804033e04fa6104d4c5de9750489783bd1020285e0a4f1e003169c241b32a02096a6850954ee30720ba0c9a5f44188398e4c6c9080961001c43061920d5e23d020810e1b440800c1ce45094d68814042871c31081eb02226c205581cb8b281d65b0a312f2e58f08d991813716585a11a3e0061b6044f119d25262b98a05180409e2980d6c8780be0d3d68754232a88db84a9840284cc65f95f2874d963a5c41609c6ce5cfd5901471397325f58a880a6e2026b011e437010d05289f7001e0dbc3418d1c2130b3d83b65c099407023c7a34c8738644290bf8a4900206b24c4298a0212206622d45282f47b8402199c38613955d0b170620132648c40a31a480c44b26341978d0c2230d0c917032e621930e189e1ad8b159fb90ddb44831cb828858819505a0b05032213ac08211c600aa365261e6baa4b0168585b4116229224bc1d4193d06c08981438f3900beb4a2a1010a30a2009db5cd726187092541642014e90858a5b7490d7841d963c21a4b6bda8a3c6181ac07885a9ec7a10618cd49f3c727b91f27305162c046053c548c2e8d6ea07822811c30295f1020b3c2869b264a56ca802982e0ce58087b509aa8101f2a8df0e601b21765664ec4454f4460a1829a47728a469043482720a2d658599c555f602da0811b45311441b168cc46267d834a1e4468568035431c0c0a2055a6860d2c366a40e86983f4aaeb0488f149449c32393738f04894af21c746170f0b0c20d648e778750a560c3622e00ac1228020234cd490274004a383256a608e367c406cba24a2829165040ba1fb0a86177200f010c01eb11c9f62493111c5cbd558a12d4940042862e2c805346e70eaa0439c2602b86ca06083c10a3e6220a9402203008c80cd90e3843c854e1811e9089d2f811e91b04290180984310de84a2ce21346062673887ca4a0b500dc03ea860a52126480229630a0cc002d921650010636238cc8d9a3c2051b90804adaea7c7148a0ac040239da94f0c5e405596c40783c02c32a06157184bd6452b951a0cc1c4c735dd5923018fe6c792ad44a969eba3b04e154a204090a947035d974110a5f14995161098614292030e5c8061a21907254805a023fcd1b3d616c70b02ef5443251120216b120b1890c090f945e0da9218a8b143f7d5e8c4ac1c20c282479d92811681e0e0adc14da060029008c960c386439e04453195a285031527296846ccb9c3008dae2c2a6d4c020862940049442a142078932206024be0410002380e9810f26c10ca7deda8004e2905ce828212a47973157183c00c2cca625b214c9239c0818c1e2845c0461d6fc411304c1a80f46599a41c928b017577a2e482a746a08152b0d8c69c052aa31384b6bd8d8c0f3a2d3092d18202a941040659426cdb8332085966c0171d39c386112e1888b1d17824e094264070531741228254a4cd58a3272130c27a0cc7021d05525540c6533443dc0809bb8552a4ae51044821b3b71443c4185478a07914a4c700480401064f914454c6e4dd2969f58503a40605259999314574c48f0689623b21bec8f8d58d85165666985abb959724e0722d4fa60372ad28c531f46dcf0c70603775461e1626953035a18ad7a5402969221299c795bb262921b3d9b645081b5e2022240071b0837298d12a5807605052b23be4ca226982140829d4b2c10e0469297004a702e3864018a88001020d20b58b4f410155978611060da6226a90105e2ae6881656784008ba64420e5cc52ad30125c483af3a08b840a3078bc85d022cd0797aaf468b598e2958284384c20524d99712a02b40118f9f12a214c8e5a070f649e66b12a8166c6d21919e690c8a1c3870928e430ea4151fb2344c61c3029c258289395c7d11f145a7591e0650e79c2121881cda6504bfe6c2d71a4460e183c3cc80e193234c64345624bd09439fa194c283a6fc1049129148e503040abd22c406ac03e60c4ea0a07aadac06a604f2d1d30a49923dbb1f52c711254c54a0660b5c42ccd807342918714d2c099e3666c0d055b327d5894050cedf3820886105e8860ee83017cf440b21bd3208927032cf58e08c2246382b22530e64e8cf863c10642428ca21302bbea54831c0911a6827402b4c64c03db850c16987aa3c18c3104a060c2a46a8a1e45845078d9b3680496322a76cd0090c79a173c19f0806980698988318e4ca86d8961624ed3a92f48000860313ebd3a226c42b4029391192cd19934e8cb44a5353d0ab560260a05291808f918d8d443440171d2a8e07545c4a02b61033f3d4809118bc10595178f302d98b8f1aa0905263e713271eb98faaae08000786d6c0f023b5048ac10434694071b33d2b8920b33405919393a2308c5a1f2076ceaa04c839e99b7373fbe94b06324c696b73707107024850426299223830a481fd1052014b969c0c751ab4633e4d034a2c60de9e8d12a3126003097e9a68a14a90408360cc0cda5dab3001a4c454838b580022a062844a488036d601f02a1d05da94902121689d22009ee0e13f60cb951ab0ccf8a1024b2ecd8d48a84b1590db0686323062019544ad124c9585c952659f4a4195213874e9131614bc64e488b044b86284d658e05971134b21a9adc7024cbca9cce275c4ae30a35030a3f5284aa456f94242a8363480e0e76f28091aa05a402243592acc0ca05a51f39767c32df28858d07d2fc2963035c5713095ae872a2d6ee931aaf1997fccc1880849e95339cc0b86839c324428d5026cc52d324e5cca149639c9ce051b34a80285a3c18c1080eb6cee5849229490e12d1019d04587d152031ba008cac0b945a81fac06d05e6a2e8485105cc981316551a598044040d13947470e4130b6665845cb871eb420aed47161a324883018018223680e584044112c4013a255666eb0c091e88697245c8150a44602ea8c5e9b345839504cac258d95925c3274b4446d0897d4963819588202e848913c2cd2b55a62e2054f022a64c0c4a0aa01a1909e0515b032c4478c5102a8a892a6038cd382082b91fa0d2c43a30e1bd5ac18299a51b50c14b73a03832010074d56ac427385f4e2ca91813c2a24c44cf0716dc506293078f567dc8c0450f46873c6b76383a58319600ac5421d670a0a69099343d58950e18c1a64016ab818914e2c0165c3d7aa100074af838d364c791283ab868f920976885183b154cfed8309686d1784ece8eb8e8e12a87bdfa4362882e802e8a234815ac1837842171e8520a1689d6b6487549015d5dc906a4c020cda734518fb83c0b332d35498fb6b031984284c0e605cd8592a1800389293d245ca809a3c26ac41ca72d145e54f023050514360c8213a2e780034942e0787890e108218c44205a6a1dac5c8b61f8a69c308309323a167cc0e107122f0e8fc62c951002e7a1f8b6d8c29ce8c36347079a845ca1e2c105f3c3e253af0d9029a454991940528f313c646333a45853e97c811234e5c80725347d38218777551cba7cd44131c605a03a602780e150b182440c9e00712a2bb8b006660a8bb1363e834d999a38e0c1998f141e61f08d2a63d548c49b2236ec4a694d1c1245a0648b7001ce034f8cc0797224850b4f475e25b9606c80593b56eda941f77c822b1bd56aed2b3b228b82a802082f2a6c5a13431eda218988382d9b38b5d8a3420130e668f8d285a140ac0d1d24494a3540c2145625d27a74d1b3c8c4a1ae3e7f3238c0966003942f4ba2a40043049823527e445df2b4801208c0acbce0050231b2a927490c276492c4b6a4851656b8e382891320a8f963018e06b6f8101424888f3344566c411c280141053d9b32bd004545d91f1946d009e4560513980e7df844525489d29f1025c4947d40539327d21b23b25e900973094c450651d4bce040c8a21bf62c9a337c1096462020cb814c03b8b1cac2a7051d154e90be48a48ae52662822036685a21801b6a9428ea90e21416202c74a0a206091e4da23488063e66c20c81681b41d508248b3ce8c4e546cd2421b1899ca93203530230fe94e0f061cb8f9f143464601bb10885ca4a890a0e2738227b13b60305b31848a2c4902849cf519438672ac82c6d01ba0f242a43e0cf00bd578deee84181e64b09319f942883e08c2072a8863321c02e452247824499d3466b0dac1292433fc884cccae3420516e1cc071dc878942a40d3894e353ed8604009abd8d8ca68c2a4c75425b0b50310b0a2648e032374393352a414e230f668c6202432c0b4b1d22241a91070dce93a8163d1e973e513100e5e7095c1200900f8c038d0c971068d9a401b9850066917eb9334b623cc0432763d264d3cb8838586221236cadee841f40a4b085436f8898429521a1d0144d02123412c213f92c0f10305012d316c176223cc6045d18a267f6a5050073d59a2880313ad0a6881cf1e0947482c11521412f48227225bf266d2b85cc026c5121bd89c32a149cc47105aa51cd51943cd04b9d517768c986002855606847a480941c60b68b8e23c485921a8d50745a298c03168ee082011c002e83202050bac0d0b0c102944291684c42195019b128e6e8c1048d28845463288c403c117a12a6ca0c42a93164c7d1028020122415b30c0314289a3387cd4ec79c0010986184181c8011a949041e84618070dec3875a8d31e2f9e501d519159882001051405307a052aec267fd2c264281440083944b464dac2e9cba6b92021909873078404390a78d2800a38dccda50b06a5001389c8a14a7fa89e5f63012c028c7912d67ba242251d7eec88e285fa26f980bb814408563c78b0408119022ea74b0c3061030b45250ee06032e341026a622e9d3040ac378cc30617884a322687005519747ab125041d6461e48cb993809c2d526f6c2a983050990085018ed27e54f1e2c88328f4c10d4b02bc028313c78b0c526026b82080aad5283190168dcde212c35c7fc38321150d14cf1e1aa44e64e1e4c225468a10590a94e6455203006000b6fb30ea004b6e38082563ab8115611974189b53e309a6c99cea748043cfbf44a44cd9251b2cf060031f4ac864602404081114f08088125cd931444304b6d023553fb003b685d82b43656448431546c34275624c9b0e3f65d65329143a62e8c17265ad451a002c5020620fa9944a8358a2d6d0e878e3e5cb0c06312c31f4083466228e052c740cd01a138b3b29e38a4f9321f64aec1299d8083a9d0e0116503726eb956e4c1627dd98ac49ba3159857463b2eae8c66471d18dc9f2ba315968ba31593c7463b2a66e4c560bdd982c30dd582c59bab15834e8c662b9a01b8b15493766c318dd582c415b5b703d3723ddf7d47c5a5c87ebede0907d309385ec438fecc327fb8084ec030e4af60101b20f24c83e8020fbc0812c805664017c220ba013d7a35199c80238db410640173200c43c74d2e912254a942851570c641dbaa8e0821bb20e98eceb06b2af17be12e9743a163c2b6e6d6d6a2c7a6e7e32e9d1e9747067bb1f45706cdf8b62e5bbc5e0fe7fb517715cc7f052d40235d34cefaf31fb1ab19c190f236657d650f2e979fbc6b87ace679d5213d9edba9a1b2f0eaecdf2924c4ba1c4305f5be3a432c61c33f6bbdb4abffcd3fbfa2947f271befbdd3b4edaa3af39a37d97d3f829fe5952daebac68663c8c98497ac684d7e3c8c7b5d4de6f4e75a4daef9b76232fce4bc996c7e3ed29bcca33263c1d46e6c5d74a9bb1bc166388b1a536476ba5ccbb5fabe9b6bf810f6b7bafd57ed6baaf8eb4c87727e4f67f0f398f9ac6f5dcb62e804886b8eb5b35fd9f7239718c3dce2edd96ff7e2b97b2d7e9d36efc3164c2c8e1de78521c33ed55461f423e8fbdd63df34c29fe1bc7dedd72c4413e2e23f795da9f3da73bc2b41bbb1b0d201faebef61f3b8436fa7e7fef6e3fbe7babee1ed6aefb8cb14a28b38fcfe27b6bde7dfeb9a7a436edc6b53736351ebe3d3ef8259ed64e8ef1dcdc622915e0f14969b78efbf348e5f5f7c35dfb7dbffe7d7d8d91f66b3dd56dbe8a8e92c68ecf3bcebcfe7a6b975fdbb41bdfdc7a3df6d0f1d12c69d73cf2a96dfcdda65db7b82973d008b38c3846192d9437629ff3e691f31c699d5d7e1e578bd3717032d633263c1f38f68d6ffaff7d9ebcc21fad9c550903dfdff5727df5bd5adbbb79da8d6e716d6abc182dae709b9e31e1411b5fc4b9cecc2fdede76ef63da8d5827d992467bc684776b7c16fb5ef7ef79c63c6facffbbf1b290053e49e9cf18cf6967943d5b05be1dad9db2c72a27a6327bfb83c6b7e1fc1f4b6b35f61ade9876236fc6186de4be0a91fce109bd9533e76af5d5b8a6ddc8e33d2d276f9b83a33bf0f5b5631fa9e45443d9d36eece9340ee3dcc5f05348adfcf7ee79bb4dbbb1170787eb19139e15fbc52ab9efd9ca2f69ad96a7dd58cdd07a98f936b7351dbb1db4674c784deaa723ac70e64f2de7d9c39b7663cfb7b5a9f164b4716c7f5acae6e6c65beb3d1e0f80f9f198e3a4f2425f279c9fa6dd980627f7c6ebb97d1b85c80ffafebdd53e7a8aedf639ed46dec5f1bb3777eb2bac78f72e774ebb11c70bbfcc6df558439871c436d6b41badb8f5a4f0a29cf1d1a92b85f47a9e338d96a6ddd8db7494d70cad87190e331d6668666842ccb84f72eb1913de92dde471d26a21861276ede56eb796ed19135e161954725c63acbd767a218c538adcf63be0b4199472bc59cf98f0d662ccf831bcf7c22c6fd7d1ee76bb9da43f01aa6d87165f0fb7c799f6b41bcdd07a98ed76716c7f678626c48cd7a6c67b73ebf53b7b716f1a069d39e69c69be51562c279c38eed8aaacadedbe9de99f34dbbfaf8f9dceb41be3d83e2ffb38b59e921ac7f6a7efb9717ac68407e4050f4eaec7e395b9882d10f8717207449e4fe3f1389c1a1b0a03ba8761864001315a2040c00b166c2a56f4dce2340a15917745b3ad4811796e6b52dcd64ca07871c2459934d133a0847c6373e397848c536c956fdcc3c5202b60cc00311eaf8011bc306a5380a91071c5cd4a9c8a0142d82a59088065e4f1d2588040e0039c890064190053b8de6b6b6e3d181eca3accf9292abe22cf4b31e115e15074a9b1b1b9b9e020df5a70f5b45fe327b6228f1777c5a3d0f5c0f4ed21b5e5d9745bd7c7c78e4ef741a7094c271c2b424daa74ca0867ec64c44800c60b17081c608059012d0860b142450a1427ca4c942041362636220c4cc4003a9d4e078302110cbc0ac201d3079da62e6570e8d4de34cffbdf088cec8318ba0e303ab8e8f0a2838b53ba2d1ab63231daf280d1001d10e8708001bb83590101bcb068d5d7ce03118b56f19e8e4c8f2d3a1d175d99453384741044a6085207023ab0a873814e37878c0f9d181f713db51c0a481606b068f36b6d7e4da7d3c9293ab24466355aad7aa1d3e900e936883a5d1c366b8a30408668958e0c5196af5388049053458714f8860e283a709de850d6c14487125fb4b674ba0e24c83a8cc512d3e9743a5d871138ec82591175001a620ad00144870f1d02e80080870e1d6475f87ad5c1eb5587ae0e1c3a70bdeab0f5aa83ee55ad57b45ecd9215ebd50daf60bd221bf469d08e2f57ad743add161b418558e9743a0f5fab747e8a8edbc06c030f6481ca90f91123ebe3808e4c034873dd2d878e4c03433a320d00e974647c7690f171a153b547ca1e27367ca54255c3a952a50c95a2c194ae944ea72335836ed4d721516cdc015985060db5201858c1608d56a14103140c9f6090c1130c30c01003a789a787478aeecb100c647550e8745f9dbe3871f07508862368716a6d48e6da704822b20a0d1a73c0ccb9a229930b3add17264a972c7d1d0a63a8051614ad50e908da970a9474baaf1450d0e966151a342ce820cbedb7b94932211224dd8cc38b83f6f5e82b8412402001841144000104435f651c85a0d38100c2170720e81a7df0c5e86bd097075f8bc27c29fa4aa4a6d37d7500bf107d1dfa12f366ec4d006cfc8a219deeabd017219dae8cee8b83413a9d20b80dbe027d01fab2e00ff5e3c78f1f3f0fd0a041abd0a001a7d37d6580f55c0c6c9e8a87de9976beea7c5da0e31a6000383a73e4e8be2c38a3fb9a208e4e26216343868c4d1605c8d8c8a04966920adac06943c1d71b5d5773a39b40aae1a4860509b6db5a8e366ddab469d3d7d494f0f852f315c1579a2f34baaef675664eca9799380f0737abd0a041164107b234b2becac849c6c631580cfd0af30546a7d3c1c1cd2a34249d5568d090b4caac022767e309beb6d2296d3c892c1468b200efe1b0b100f7496cfcb0d1e685d868f3423c9bf66cda061c5c5f5353626301ee93c8fd6e23a6713d5d64aebbf51f73dd2d870d1b722e202792b818586e012ca31c969bf353a85593b351868b4ee7e3d47a56baf63d6ae5c86cdab20a0f8ef70647860b192a64a2bc6041c30596e33e099cda1b0e38b5372da56ded8d4ded089b6e7b8343b3e2a663cc121f0c9089a9a4d3e9388fe7d57a716144e9e6d6da88f8ee36e45bd35ec375fe1df9ba9fd36b2cd6348e361cfc4ce7808393db6a7d05d916443ab22d5574645baa4ea723a153407700095d26dba24247a605938e4c0b1d1d99962d3a322d683a322d3b1d9996017464595ee9c8b2a8a023cb52818e2ccb159deec711246e673d9fa3eb1c3a8cc0c5f5d472e81c7e4d2e4e6e6d4debe0e998e2e6b6b6eb7ec329a0d606b7e6b75ec311d753db9a45db567b61c50dcefb3fa7df7ee8e0e2d4742f2ecb0e9dee6bc85710203addd70f9deecb874ef7d5e38b87ee79ddfb6aadb5d64a29a594524ae99c73ce39e79c524a29a59452c618638c31c60825945042092594504209259439e79c73ce39638c31c618637cefbdf7de7bafb5d65a6badb5b5d65a6badb5524a29a594523ae79c73ce39a794524a29a59431c618638c104208218410c69c73ce39e79c31c618638c31bef7de7befbdd75a6badb5d6da5a6badb5d65a29a594524a299d73ce39e79c534a29a59452ca18638c31c60863c6d7563a655cd3713d3736b61fba2564bd12743a9deef9195c6d4dfb23be5744f7e463f2e3086fc7b783888eb38f67848811231fef1382640791213c07700c1152c586148d56642e4ecd4f7143c37236d87cdc0f296e6b36b0dc8fef2d8bcead069daecd8a5b5b903838ffb51732f7d57a3e495c1a9c5c9137225cade7d9e4b417d2f6b579a07be142f725404fa7fb02f1f5618b4f9b90cd8383d36f5cff00be00d0a9f5389c5a87d3bc296e703616807b83d3e9d84cacc5f96e6e447cafc8ef2589937bebbd3da14fe49c82ea8beb6b4bf7a5aba5d3e968cdd2e9a670e974badfab92e4813fbadd6ea7d379bdf272d54aa7f362e5b58a4ccd89972a1b743468f89e9c5c47d25491a5a5d2e974ba17bbddce058bcf48115c8f1c219342895a392938baff13e868d0a061e3850d2cd77ff834b7b8b7b91ee769b8ce7dd76e6b3d1d67e385df2ed478d4caf1e2dcd6e05e502bc72206b5722ef8ef25e1fd5e151a3476adb7374d83062f26e16124090f2349e068d0e815d97afbad736c6d218b52c64a9b1aff72e0c8f1f6a6796f703c4472ca6119e5a895a3568d0819af4b17a7b6b18c3cb89e7f5bf36950d6e8741da2903de9606e7b50a4d3e998f068d02073b2f604858eccc92b9d4e47e6a4041e9b1a0bde1bdc259dcecbd2993efb6d6a327e9b5a2d00f870dde07271694b85ad13b6206de559e242fb9e2e8ccc01416e6a4ee47a5fae2d6ecbc5d0e9b806f8c0c5b5156bcb15599211e07abb9e5bafe7e5da922499a3d3e9a29025c9a24b022549119d4ef73617972446921649ca9288d1505b6311c30592544858b4b1c9adb971162c7c9b9a9783d36c6c577c1a8b36296ebd9e1c9c6f735b7bf1dbd464cc488045cf8dc5993e6311e726c5050b16703ece4d8e0a8bb63dc54f79c1234228e744068410ca397111a585962731a2b0a0118505f70f6c37166d3dfdc683c8b7c62b4ea77bd1e682d7d3699c07a7c645c057082393746446debc58f05ac1ab9217a514b8c4304995985290ec70f903c18a05fec44d2e55208132a100362fb8e4a0d140db171714711100c6894f5d6bd86cb98426030a4abd4c5bf0f42102e446134f5bd83605e9a39b80c396fb6981323ab9395b38a09895e3b812a4050537909cbc4823444b0556be04115023002d5c82292094c15140cb8c227f3e9b54afb2c01220490770ab1e651921003f258800036761e3c1cc9414d06ec8b2644f0e1e25c8b4ca622606850bb07cf1204035e5c3a0585808048a7670029340043c2010c3211497991a9520289242a94a038e2608ca427d04b85a02050b28315d2762f4e08265d0b5590a58f358204073260a06e4868507000a7491a1240d16303bb2fe993f6f732fd0470158c132642e033675149000528db99e004266f0b113e716f034824bdcfc32d7e1448e494e5a6d5da994a5be018122e50a9d09ca10ea03f55c91a2018d1768aa3ab822698044800847b0acd0fa71838abac089154834e288606a8b202b136cb1398ce40156781cd064c402f366c5450a55d0cc98c3a48a2a1712c09346cb58954621707a008b5e54c58c1450a7209dcda88276448503766ca4a9c222c716404268599223c5619627311352c9154a81d699150f20c875c9c07f90804d8a1c903c2c702ab2c107b931229bb8c0355a202e061083a4a35a3cce4f0f2fa454a8e08238b94a282089c352220e871c954dad2089c57da80105054a32180367c90119fccc19e982bbd3e9508b477194e0d62c60d4d543f302673d414a4daa9c00c77516015c16de87de094020287543f4d383d316c98c9b55667abb51873b3a5ab1d09341ab27a74eaa23545cd1724466228217a88820290c582ec94045cd2145b3da2c9942c5010966441c6249a814c0c78010749bc0de6a80739343ddccf096e8c5016322f4417b0bc3a2d48e396574bc1579332182075d2039e1e2f6690e0527b0914d7213a4e5a3621656c30dcbf660e80b8c1bb7ef040d1853e6547113e1c9cd290fb4c468d3d44580961b34a7363d7344c189e5854b1b15204638c99212a74d813e2aa68cde9ab62f0206393ae308049b0a6f6c73d0c81649204328b6af819f4839889462930424a12107ae80b5595c05b079d5c15d7b54c29a046c1459801fa9b0f6a4d01311d480f8b28680085bec871a758a2a2e4950dc3a8c291f4c2983844b9453164d3962a582552e92c0290f8c2ab585c54410c003846aa0322e061e1ee0028a858f255f700ffc78404c2d500e484940a87542439366678725b53e2c380970028d546a71a24a5cbab499a8dde8a0d39f3f671ba8051082142c80800c4a6b418a98588c5a60927667c5059bd60e1f6953d26a290f314c7073296dabcc0a4a3c58192165520815a9f69895924201150e98984a61468a5ea566830280b0202586222da0bc768cf9ad62c121f5001dfc1d6d4ea7160982f52378a0d6279e97355f49994987384001c46fb182a5576b3ed4f0a7567cc064cb15ed3b30e1c722ac511e4c8f3022563d32e5cf30ad70860627e64b0092c3a4638d8e2e0323579d2c08db37a060c9f7a053923ef789198184aef41d5d448ceaea455a1dee42a7240ee4b8418b6340e80a0f3952247f5b33c1940dc484c0697031f281c29302f7927c2ea9517a36a52da7858a5aa0742c6c5f08549c303a0d76d4b120ade08a1005a14ba0a123c61a2796741b489511035aae6827abf4018e5830c04d9608516ca855c22c81c31585511432677f7664101814c5889e2468ea18591525450b4a3e498868e089dac4690a00bc543c422440d540831002bc2d69f2947852aac7f3f1f665ee93074d785038f94042264a0917281a7cf5b992286c1294382f2432a268b204e5061400ecb07d79d2614f58e8a2041b2a937b62e7ff91f124d0084f1ea8d1c9c79b4f6c4fa892273a496f9582c0cd3931815319a930234d9cbce1e263110e4d599c6869e70d0a3fa09304863469c5c1c9a8432c6a3409610e9023238482d3248d0c1d891408204d93244d5a303195697b35917101134463276e16b32d4cbe4826439890c0636a04313b0c2cf1b424d0922b4b7484b0244475009303791c7073204f71a0ab062594d22889d34949efa20426b921090940608f12dcd04ad2264993b024064ca255a3620a8124d59ba49ec00806902c4232c6480d2f4429810749039a549111e2310a095aa8174ab4c15ae5048d831f800c70238216342d683dd2d018ca420c400b5304c093476f2a8e6c6a25b73111e247f610390207e2888d406902d9a0011df1606664851446ea185133428de81a8884a50137901a88c2d6008c265b87bc904050845511108a9ce1154152848038444a11394446c40b112144ce3c9dfd017166a5c6598e7e26c0904b43f00c691b82897098810158ac8670e8a991f9ba8d901452c8e9799b7342480542b8901941600519614410361a0461822388190a4050015104440c90064e8420614bb700c80f50703f0639f991e5078f1f427cbc30e72303eda327ca470d3d3e3af4a8d4e3821e6932f4983c68f180c46302123c783c5e90fa567d207c66b83eb4fab168b383d40e433bbaec08b243470c3afce8a8a203870e10392ce5c09383adcc0d9eeba3ca289d4e9783cb0e8fc50927783897c2f0304a387661babc7a4084326b6edc5872c30c954e47ad9c9c72580eee78c420f3c1c203a81e75facd7107775186ef3defd9e4dafc9b66536b9323eb5182872c5d141e2f440141a7d34561d1f3643cfef0c8a3d3e9a24461a1759c5a9b9c4ee71549a7f382a4d3793d2aa1d1374ba7ab3b29c3afc56d39b82d9dceeb03463a9d97078a746cc8beb81d7c743d26643b4ca5c5e9b71973718b14c119498bd36f2cd6d670d0a0a1d315d023db11fde8743a311d6de08613a243013f042022cbf14696434776a3908eec46013ab883250a0570664a4716235762886d513000236284080af492cce17232baac72604891b44c2b2e20010ca3475e657ca07004040808656a6522880a36ae75b175f8506552f0028257620bec8112012a0e67d60048c0c9150266dc20028a016563c99c360f586821284a591a4826442d70679613195a6ea0a16bc86713c30db10e669df51f8c686d251603230278d189986016a6223468f913575e8189bb64c12f1bb355116a03c74302ab40a8849606468d314ce48593b82b2b24792225441f00167511b030d120039b281a807d32d223e0ce3e74e24513322c6a2b04982f52456a0a5d4ac6146db0e30623526ca48017c14161c0fe01db06508284c3946420ca1b569f6a41417582d2025e6ea8cdcd504b57430d2c4892544676034af98a1e9df2162c49d367013c10804d5225a614a43aa948c510430db45967915040b062813f7113851f0e5bb116ed3ec59141026542016c5cc8e0019714596f1aa5801146a381b62f2e28221249ce18dea716903229609cf8d4b5860d173eaf2e79c1e0770840024d0614947a2ed45214e54fd72052732e85f52102e4469318e2e850a838845046cb5c8a4d41fae826e05ac3e183893a730478a386c4a705cae8e4e4e899e3210621592ef5c13402c5ac1cc7d50688047528cb0327ac86112adc4072f2228d9025263070b56656aac48a1256be04115003804e31142101558a329d4c8c90600a08657014281b92e9aa02b242282c2b8afcf96c52bd8241f642950a18565c82614280241dc0ad2aa10cd82217a0b670e1842616809f12448081d732c96281a8822f4487080f66a6a480060bd506b02cc65ca9376b624f0e1e25c8b41a02ca8408589cf809c5484c0c0a1760f9828201a21e29bc21aba1940922a67c18140b073904eb8b813e571ad5d042d90e4e601288e04ba5e6cd6f8aa056a816631c427199a9a1829a0f11a80072a956a933112994aa34e064c204408d412dccc531f3a12cd44780ab25500e909bf1a50617acf8848d89e93a11a3c7163130d2a4353ae22a111fb06bb314b0e62f921a2ce20c004b1f3981e64c140ca8ed835390a80b136bb8569001a04017194ad048b2218b70a4871e3942c0ecc8fa67feb8596aa2d506580b93a5060afa28002b58849c492085105cc43ac8d891b1a9a38004906a289084011b93447831fa204c002133f8d881b276d4f26f2054e815a0f034824bdcf432c19d0af0088981480726244ee498e4a4d5560e5180cef288eaadf908cb52df804091929648490f45221749eca498a00ca13e504f5c9346286e082193d924a1018d1768aa10b1f9e105419223368308613440224084235837682002c14e16118bb854fcb841455dd0248eab3452a4c410d5864e091a714430b5658340bc3c624c15602a6ecb882d3687913cc00013442e4802a600367d05073419b1c0bc29d084030a50a950a9cb9d122954413363ce9248642eae80b047930565235c48004f1a2d62766018f34837e6878fb11521707a008b5664c12c0ca858f02677a3850929a04e413adb79ea60d48c1d30c23c133ba2c2013b36d08c2aa266c38a11bb868a881c5b0009a165e9081c191f0307090ca829e330cb939809a8c488d1d306c87af082c452a07566c503080fa8d080014aa0b0a938404406fe83046c7f51a63d0d840d42f5a954591e163815d920801260e8390b4344140b7fc6886ce202d74801151621ea71805bb12909188841d2512d1e620609ab5258236450d8891e5e48a950c1055a4c2ca0081407626760c62aa180240e4b892e06df845153458f0593a3b2a915a41160743001b398a0906a73a206141428c940cc05955e18328ba0f7f942e6800c7ee68c747109416684143548b5e002eb74a8c5a3384a5e4f5613440b6dd4160a0b1875f5d0bae0b9c34a4ed42cb40cd4c83c414a4daa9c7026ca559b315d470768616711c065e105a0670c6fcf0587e64c50250510084add10fbe0798b03229ac9e8801189b64866dcac2ae34515a03c4cc02829815658a30e7774b45a41ce0b25863c71fda91353d0eac9a993ca481b4d8dcca8d1e944eb10095a8ec84c44a0698fa75a77080852e6a18c9014062c973c9932146748a105c65280527148d1ac364ba68821713446438c53142850428219118718120d60a030285162c00e5923f81810826e1318da20114085fd494129d20a383739d4cd28325f56f090a2d38c42554cbc38604c843e47eac879e16b8b101b5a8d20c6a2d48e3965728422fb7181a437473c0e22ca9050d292535071850628b708d28470302182075d2039d902e78011f0081983fba382d81c0a4e602393f46705074300f471846a8f082d1f15b3b005cc70a0f6e40e923410c6946d0f86bec0b819008ca6485c2d70d000c64ed08031654e955e0a3274a0a3e88b3b223cb939e5819604d6803054e7c91836049c9de82240cb0d9a53901e6568c90aa04bfd313647149c585eb8b8adb15510098f0ec61d30204638c99212c700544a00b59d9848869ce8a362cae8a9c9536680a71f24a83825031901831c9d71f4c150a030863a5002856614582135550114dc464043e7499d4c0d2ca008051ad922096408d5e183f466121b2f378840a6819f48398894ca5d76ac58cab4f5462d8c802434e4c0b570c381d004613eb676a0a5e02a80cdab0eee91bca281432ec8b13386049de14609b048784106077b48c0e22954a530368a2cc08f54c892aa49a2072019122397a2d01311d480f8a2bfc4680283003528708a84085bec871ab50c05333294f86040243423b8244171eb3020c0d44684875b036d00a8780086595cbefaf04010b4e552892f3ff89440c225ca298bb89cb0a45618962d16c68cb052c12a174966c4a122362904a4ad2a95561810c2980c50097151e8d408202ec84955a444a92d2c26020014c170600037b12c210830a2062ae362d00112019d4038b0095af0b602140b1f4bbe7a2ea430a9939a5d21186726c2985801cb94356219d4e842e58356656c88a905ca01290908116168e998d44ac08e14818626cdce0e4b70742ad0f998d422949a32169c04388106aa0e641df03375ba978088892a71e9d266228302312bc6bac4f8a380880e3afdf97316e80c0c9440f59984ca4ca4b210a460010444100cf16c811d109455093126454c2c462d3009c20483591cde041a0113d88a0b36ad1d3e16f00166d61c2b8d38743ae14db8b3680820e3c60a33a234aae06b8e95f210c3043797944819604999ecd4d50aaccc0a4a3c5809fb63a40728d01a1374daa008a122d51e3352808a20ca0264cb9afd858c0a074c4ca5287326035850810a7a862ad82a351b140064053c2b64803003900b36ae5028d202ca6b87184ad1d30926c60428d4882c161c520fd0b92e84f0a506a03e549ef8b0cde9d42241b020d8a2b4ccca3019a422c503b53ef1bcac49a01240819d4c300acd225166d2210e5000d1828d283f84625824c2acb0152cbd5af361815170a6cc38294481ed2a567cc064cb150d670a101f3768059ca151c2841f8bb044ad417586061d55beb0106b448f3022563d320577400b67e640494144241598563843831b518a0a923e1398f049149f1280e430e958a3a345086048747840b442d10846ae3a5910d590141c605c6c3c216e5650b0e47bd009490d1fe49c3de0a3022c644c7c624620212b36b86d40e5949db95875c4ae8e38558e4a6892264d130386ec76281131aaab1769176c90274f9614971c20a2c244a7240ee4b8312bbbdd4e07da6e6747e030e793dddb7a6bc63d5a6da7a5d9020e72be0ce98db44298b5ffdbcada8683055fb6ff6ede39df34620bf16eb7db615eac95439c2fef5a638ef6d32c79849d43059fb67d4ebc3dbd72d3c8370738f84a0ba9c416cb4cef9475de587d979152deffdcbe7e0e147c157b8c2fce9aff1f31efbcc6371fe634469939f7174a8975da8d34f2e0e0e6c3d3eb2977edd1df6ef9448311461a1c26f860c79cca8bb1bd506beb7918cbe8b75b2fee48b6f68c090f739060e2cc6fc61bde6e2b8736dfdf59fa5929efd0e29c7d0d0e6cbecfafa47c576e679fd67a0e6b3e2d71a4f8567bbb8fb27e296e6b58ed4df3e61913dee4a08656bf23ac3ecb993dc56bbf720e11709ea5cf7dcb8f7b94e2b636358734b37a68f9f55cebaf65da8dd74d88e780a6d649219c325b1a6d9477de4b799c7f72fefbce726eeda5487113f2e676b6db49715b9bbdb8370e672ac4f44e28a1ac544e99e5add1e7a865d5d4eaecff4dbbf18d87ed19131e0e0e663e4c6ff45d523fe7f4b27bb738eb8676238732dfe59bef3a3dee1252ddd9dc7a3cf47020f361cd63d4d17bbaa3cc311ed9b1dbed76910e87315fd617d61e6fed12f34c63da8d3c8ee3dad647e6d6fc6ee7dbd4fed7bbdd6e67ab9c328683982f4e48e1b7f563aebbc4994398b85bc2014cdc29e1f0a5b271f0f2ed0d71b655f28e2d9ff373e8822b9dd0de89338653ea6bf1b551cb5fb7af1e72d5fa2ab7b0f72f2fd5d3e7fd697d94f2ed3be5f042bf33f6b3be7cf9b53ff30eb5fd7576595fd536e25827bffc4bae77acafd79b29b4945ab9bfd5fa864f4f7bbfd5d3c7da2b8e17d657b5df75f7ade3b79f42f9eadb355ef8eda57756782d74f5757e2da5ba72987ba5f4b68a3b565fa7dec3ccbf94d6f299ffaa0fe77dafa551ce6c27de9f0a1ce5217170a9fa3ee696c24dffbfb1cffbd36eb4367c39e3c8bbfd9e4afef9a446b8527d585fee35bd1657dcb7ce6937baf53c161c517d574278bbde1ad74ca1c7a2966bf86ab7d04629e186b3cfaddde2f0a9afea39abc736637d3bf536ed4679a3955760e4fd08a3ad720aa5e1db1163cd77cf144a05b84c7dd1df4d71b45276cb73d53db73818b3ef3d0f97b94a7d785a5ff3f53457a9fbd7a43eeaefec345bfdb5855ccb193e6ff1f7d2c3a831afb8de519fc59ddee9eb87157effada88f5a3e258c97d77afdde31d44731ccb55b6c2ba571e3086ae6982b8ef6ca496fb5b566ec3dbddd77a97fad9ddb1884ebd367739e545b9ef1c4bbeb5bd770c9f0614d25be795eef29c7d07afa6ae65f528b678c3243a8b1045c317c15eeec31c5735bc969a6d20e57a70f4bcfb9e417d3ee659fb9a67171faaecdb7c238bbacf5e31a314f0d170c1facdff64bf7f5d9e60b635a8ebce9e3b2ef7b7bf5ffe7eb7b9cc6325af9c285905e98abb511ce98659cb3e75b21ff365adba7876937f6dc7abd6fb75bab56b8347df167dfb5d6fcc7e871de993e2dbfb73b5a6f75d6d04617be2efdad17d67e718d9d5fbc75860bd347f1ad71efd8f1cd107ebedb5d5e94f18c096f8eebd277a38f16cb0d63a7fac76ee9a37cc33a63955567ee61dcedf270b5f0f179bdb6b55fdf31d772dbccc207a7fcd5ee7fbb9dbbdab9c2277d8d1b565e638e174aae4a9f9456e36c67ccf6eebca90adfdf986709efed9d7a6925a5cfcb8d7f8e16d2bcb18f3785cf4fcbeff57b4fa9f1963eedc62b3e4de639ddebe918cf98f0765c287c3b7e3a69f455ebba3dbc677bde133e5dafd5d6f71825841eee9e96ebb1a6bb704dc214c35b6b9e32cb3c719e55fad8ebddf0667971b532ed462f25ca353dd9b8247d3feafdeda572428aedec5c267c544f29eba67ef6aff79e5c91be8b378c144bc9af8fdaeab41b7956088e1c4484f4b036f2e082f469ddff84d74749bb86d9f7a8195a0ff9284678eb9492e65a69b6f0522a6fe51742e829d516f6b41ba5a86d5ed7be37639cdc5bdb0f196384bb54b84af87a94b8ee1bf5dff5732ed36eb4b217f7b60017091fed7346ceb3b536fbceb584c235c297e98412f288bbbdd7eb28c2f7ffbe34c20aa9fdb35f1fb987ab3accd08498e138e7a7f060f4557a726f6a6b6bde012e471f86b4f31835b690d35db1cc71b842f86296b2f74dfbed79ffb8cf98f0a67081f0418e2da751cadd63ae77e2375c8dbe3df1d6797a5821851cfb4c01d707dfd4335fb92bf574c65cfd9c2eb2dbf12266f475ba29945bfe5e39c69a7af0598ebfaf75efae6f967a2efa6a9697facd6dc717db99fb0f5edcc2a5e8bb5cf70e2b8757436c2186938bd371bb1d875363dbed60e4450ea7c646e3ec4cf4e58923c693e3df61a779a27175f0597b399414db8ef9fe56f736b5204ab8107ddad3b933c5f67ae86584bb9dad674c7848b80e7d747bec61fdbfc36f3bbf69374ad168b617f7c665e8cb50dbcf25df9053187faec155e88b7e4eabfd8f1256ae7f27f47d3f79ec537abd39ed1773f0591cadb4d7d75c077dd5ce1c3dd6dff67e6d9e82be8bf985b963c8b1cfffe38ccf98f0aa706df04159f7dfd9e6896fcd34633b036dfd2f97f4da29f3feb49e31e1b571018a31e66965c4f5625ab1cd7c473a69ce98e72e6fe47e72ae3f5fc61042ee7fac7efb0cb9fc7c3d7eceb5cebfd2bd79e55c7dbe5eb7cdd5dbaffd9cddfbb41bdd7edb6ee7dfe6d07015c3a5c13733de354add33cefa62cfe7db5cef797597344aae7f4cbb6842cce06eac3bb8f67c3d6eee6796f546d86bfc197c9dc76f27cfb55eca6fdf7a3e5f2def9f5f2b75f7fe6b0c3e9d6dfe5ef2cefb12ae3c9fd67d7efa3fe4937ee8399eeffaecb9a5fa6b1ab7fef5ce27eb9e39daaf29cc1ec768a7c25c719591ce3b2ba5f7ce1aed9d5f57eabbdf11faeeb9ea7cdcf668bbc691f75ffdb6b2f6e1bae08bd25f483bb455ee8e63ac95ce576da7f87b2fe7c49df65e6b9df3790923ad3fe66cafeebdd65ae57cbf4a3da9f4fdd32f3fccd5828fd64921ae9df65a27861e46c015e7bbbcfbba3fc4fa7b4d65deed6a051fb69a5e78f18d96d75c7bad703ebcebf4b76eae3bd7f852f0dd8b25d7bd6b9831bf16e6ec85ebcd97b3cd9ce7fae5d67d763b44ed0d478d5562e4c51aab4c415c6ebeeae9ae54c288e387d1467bc684d7b926f862c7b3737bf99df2fedf27e092e0c339f2b823adf3f7b8ebf76b3c5e5ccf0d8e5725579bafdb1be9cf9fc77e7b8713c6b89e1b1ce562f3c93b71bc947a882da4f3a6dde8b1a8c1655e74c3b5e683175adf2fa7d3e35b314dbbd15a06b8d47cb85228efdfda47be65fe6f73689987e77045f0e1fa3feeff6bfb37f5f626d9ed60e4c59be6b354f26fbdf510de9d3385b378b8d07cb7ee9aa1cc53ef9b2fbffe6d0e6db79b8bdbed78712e4e42395c67becaafbf5f431e3d8695c20a88cbcc47b7efd77f0ee9ef57769d015799efce2fa7a438726ba38f74c23b5c64beeebddefcc208ed96f7cfb41be75c2f9f31e16d7de11af371eefbd6f767cf3d97fbd29804ebe012f37d1ee1dfbb5e6bf38c94fee10af3c5eae5e7f0f6ef799c5fee76345689911769ac32037181f96cdd377afea7de79469e773bee7b1cd7bb1d4dc3f5e5d3bb6ae837c5decb4c29f7f2dd3c29dd9376d9e5dd50d337b7de8eddeecdadd771b8c5b5fd708b6b538be3eaf2511b69df9a67f97bbefed6fa7a847ec7abed97d44b49ebb3f15e3821add66aa8a39df575ce7bbdb36b6ce3ff7ecdedc76ee7e3d47898e930fb618626c4ec4d0fd9edde34db6e276194f545ce6f9f57f6a9b3d5f14e5993db794db7f5887ced85e8304b62a6c32c88990eb3eedbac10d9ed7a7e4a4fb37d6fc477b7b3dd6eb7dbdda86d8db1d556acefee8aa7ccb94acef7e770eb063b25cd17e29c29ccf8527bf7d5d06bcbef8510630bebab55d6ebab9f5e534f3f4ebb91cdadf7bb2fb2db99a109318b8b346ab0f5eacbf4d299ed9417e63927cc62b65c7df1cf2cefe41dda2d3b6ff5651c61b71462efe3fff2b3faaccc5f530cbfe416c3ed577d19f72c23a7b3f76b69d5aa3eccf1fcfdc21a219d93671b3e4b39ecd1762b69cc37ffe8f9b81f6c6e3d1edcbf1dd9ed76dc57c130f2b6fe6ca5fa2afe14df5ca1cc5bebd8d3ee5cafc86ed7737bcbb517f786eaa334f68e7fe4d55f89dbfc1acfad8d9763e5cdc5a9f5f41b8e357cf9cf0ea1a59457d82b9c675ba7bebff1ae18d2aaf9c67a561abe6de5965a478b73ed1a67291a6db793a2e376bb9eef674c780d6c99fa3ebeb5533bab96da4fce4b7d34465fe3c7b0f3fbefcd5ba4be6ea38cb74bdf79dc918ae7c551f93c9b1a9a8edd6eb7b3f88c094f6e6b86ef566ff19c916f2af397b0e7f6d5dae4a292ad5152e28be58c72469c2d8cb85a28b187b2fe4975e63db72a7aedf3a4a8adad792baf6c89fae8cf5a5ec9bfd45ee23ca990ad505fc511c36a31ac34dbfaa9efd0888e1cdde2e27c2f0e4ead97d1b640c908e19d78e21a63b6b14a58b78738f7992bdc16439d76a3b7f6d397218fbbc7ddaff7d2fe2fc36767fdb8f2ea259cd2c69c76a314df26c59f658866cbd3e7fd9c1edacaf1e5f37ebde58ec4f045c8a3b53cc798a5ff34a7dd38455a717bab4cb63a7d9bfede7fe5d37719658f6937aec9b14db41e6b7243b0a52d4e32679af1ac93527c69ce50daeb37a5955a5c7be6d4fa9e96a3022763962d18befa6fef3d662efdbc598d17d7a30227773bcc666bd367e3a65befdc33fefad30ea77195567ef6c9d60b1fcef37f8a69edfbe229313e63c26bdbd2f4e9e97de415d35ba5e4d9a6ddd8bb9edf6e07d77bda4af7716d6a6e45e0d6bcda99afe2d62bb2dbf58e63b7b337c2adf9eec6c69371d656a6af4a893185dc633d319f31ed46185df8b4e75fffd8a1dd195f99d36edc727013cb2937ed2db285e9f31356a833d45aea3985eb376a86d6c32ccb23bbdd6e27a7dc6eb7dbf5b6ddeef6f49ae670768a5fd3dd57e9c9711bcf98f0b6bc6c5dfa38b4746e992b9d727edd2d7dd35fdbf9e4b96f0c658e2d7cf4d63d6fbfd9de78e5f7722c7cbbf6b873ac7dfe19b99f2b7c9147b82dbc3f6b4d7be695bef9aff6f27a89b3ee57ebbda5c2e731d535dbeb37c7dc561fb728417e31a774dbea63fe30ed466aef1b9bda04b295c267e5bc70d2887bfd937688c21763dfd0721d37d4bc5b4b4ff8e2c69cd34cb1ce5f62fd277d53e3eba7e733d31afdce923e0b7d945febef7785ff43133e9fe3df1fcab8ffc7b8df485fc5b9eb2ea9ff10567a2ba46f6ff8f9c4fc6eca6baedec6475fed56f3f925b4f5ef6c79099fd776fa7cb9be33c62bed15efa3e7adb80921e1e39f5679e9d6f0eafa2fcee1646b848fe299758dd1cfdf37eefb47d912e1db14c6b97fbddb5a9af38c695b8ebe9a7bdc9ec3dce1d554d310be0971ccd0cf4833089fef3dcfadb9a63f666a71da8d985ab5236c6e3d1ebbdd6ed78b83b36c726d8d3e7cabb7d9ce08238412d60fbe7e35f51f534be3cd9e565eae5b8c3eeda985ddf379b7bdd58a6f9b3d7fa4177724c6b6b7db8b839b1e7c9ecfee3fc5ba6a8b29df6937e21f2797e1702f0e6ed1e7a9e772620c2df51de6cd6bf36b377aaeb6c69b7b73e3d5ac57393334b35de5ccb2f45b8a3efbf98e9edada29bdfee79ce88b9ec63bfbffd6e33ca79437b63af8fce7d3da4f6ba63b5e287934f6d2389b67b388bedb67af157f98f39e546ebb63ebd017fdfc125609b78c36661fc7f6793d7fe3dc32f4e52975b474e3deb3a57817fa70b6937fbe35e455fa2e751aa10ff76ff79ed4cf99e9f5708b83ef6a4c2b84d2fefb3396d7c65e1cdc1cf459de79f430e379b9d673c6c109faf49cb1c7d9ffdf55db18d7dcdcf6069f8d9ff3dd7f84dfe37a6b3d63c283b215e8fb70521afbfc1e525d794cbbf14db301fa3a943dcfcbf1ff76efebe1fe7cb1562d6f8cb77ebeadd46a6b30faf922ff974e0df3d434e71ae1fa7c5fc20a65c4f96e8ea5fc55836f63bdb9a55076c92dd598f2f93acc9d6bbc23def06bcfe79eef6eab3ff4d4f3ece9945066f0717a778cf7c34e61f65457a9e793587758bfdf31479abf4fbb31c6bb85c117a1ae7f4efb2bbcb4fe0b97e7a3f4522a25b6b97e8dad9d783ebb21ce79d2dc63bd9a6379e7cb3e626b77f4da5ada65e6f1acb4f3e1cdf184d94f1e65ded6a6dd58e79b71679badc77b4a6f37bce0fb3a537cedb6d477de29a45b743ebeb1d5b2cfa823d4d1e228716ccdf96acc705f2a739f76caabdfe66e4bce17fb8497dbaf378d5dcb2d0b3e4e298dd77a6d6bbc79ba751a6b2f0e2ece77e5ff1446eaffdd5e7ab955c1372fd5b24e6b618c115e9e76e39a8413a78576773bfbd5d7dfb41bb18c72bc38b68fb728f8f2b572cb8dfffeff4a4eb18cbcad37b44388f3f53b4a9f75a5568e77b6e5e6abd9fbecbbf5937a7ee995d3c7d604dfd698fa5ae5cf51d3497fda8d70713e8ed7f55b8e3d1fc72333b025c1f7ab879c5ba8bd943ef7bfa6d9d4b2acdf569b2fc21a3b8717ca3fa787f74d0f61f36d1a73bdbf7e48a9ffb7a6ddb8e6db946e68718d14cf9ff54fbb71ce4f996f7a88dd52f3f1affbe6bdd7e9b18f77bee921117c92d73827de5f42eb3dd4706a42328dad345fff32fad9f5bdb6f2cce7169aaffe796dcdf4e3fdb3ce34edc61ae731de3af3fd6aabf5574a28bffdb242335fffd15b8d2f84d147b8a95f7b9343835b653ecbf1b531d7ef798599cab41bed16992fde7eaba498f68febaf4762c4716c7f6e8df930ff9f77e973ce79ce29d5b6c47cf6768979b7f2e26bb3f538ba2eb2dbc149d90af37dac33b7d75ebee7c4d16e81f9e4a6def34dabdf1ed71fe1723d63c27360eb8bf63affeb77d696c79df596176f2fac37e2bf61b41ba7dd38896c75f934bf904f9c7ba67ecffa33974fc61d37f6d2725f39bcb5b7a9596993736ba3b1e5abfdeab8a9de7beb5d2776fb6d3fb85a9b2eb2dbb9fd3635de3d63c2fb5aa4edd8eaff39cf1bff6e79962fc32b779f33db6eb9c4107c997adb71c7f7722eefee335a89e5bb107ab9b59e7ffbe8f74cbb3c383519fddad679eee377d23f75f4334fbc6b4fbbd1f636cfe66bd471baf364bc573e583fd710762ea3c7526f9e14b9ed3bcf4ab8ee9616e7d96e4fa71db1f26d8aff9737c76ab7df9da6ddc8831347950f4fbeb7f6fe461ffd9c3bedc6eeadb8f57a6e9bc793726dcd732af76daf698db846de3d857ada33263c27719fef36df39338c75768af56eb7b6e6f96ee77b70dfd5bae29abfbe76d6da73da8d5d8de7dfe6e26e1b8edd6eae4dcf3326bcaff7655e23c4f9439d3dc75c5ee93fa4b46923bbdd6e07f7e616ef19135ea7f2ddf8b5efba77b8abbf94a7dd580f78fb9362caed9d93429f311635383933342166bb9d5bcf6369736bdbedd8e4daee3d63c2db0ae3d6e98d9cf33d2f969a5e0b6b95b62f470ffff770ff1b7bcd1ac76eb7ebc5bd617bc684a7d9be7bebe77ec33da995b25fb8f655ad69d692e76a6594b8cb29e7f6cda0945b7b6353ab6f6c6a934dae6dc6b1fd3d657f5c23d473dffae1c76937d2c826d7f6c017a9ded8c73927e5b0ca9876a3ef3cb738de8d0aa87d3f7fed75ae9ed6cbe1fe6937d225695faf7a525ca9e73676a8a195f26528a9bcf8ea5ea78cbafe2f76bdfda6be5648718f3fedc6b837375e8e72706a3d295588ff2c8658460ff9d71fdf38aeaf781efdab7f6ac929c7517e2faf4dbbb1c6e05fa55b62293bfcb97fde79da8d12e7fd697f35b654fb9e7df513a7dd1807e7e37a6e697035fed05f85dac7ace5bd3a4b6b61da8dbc3539361821bd22a714b51cd8b2c9b5cd05a27cf55bfa618f15dedcfda66937c2e128a54d6d4aa6c1fb28e7f6777a31f4d653dcd36e6cf36b3ccfa3b256285f9e3a4f1a639ebdf6b961da8d305a717be3adc9b1e5363729bad72dbe6c726d399e7c98665ce7a534ca296dc63d9c546a3bf438770fe7e5beebb42a7b716f489a483a27cdb1e20863a619660923add3727d319517cb7ed36ef4bccd8db7b6a679f6bc8d481b0ffb31dc9b1b1a93afefff399d954ac8a1f77fb75bb2e4eb35dedcadfd18e3aca74dbb31ee8ac770bc8783c2f19ea6f98c098f3af0c1db037bbeaf7984facf3be5df5ce2dd2e465ec419d0c977d435eae96f35e14bcfa735ffb7eedcf9a590be30f8f08ebf6adb6ddff852badbc5c88b375e12bef27c5fc36a2dbc93e77e39ffbaa7df76bb3326bc2b5f783e78b5cffa46ebbf8d32ebb41bf98cfe6d0eada67dddf9e6c69ccbef25a55f76bea977fe1df22f21f55de6dd8e17719cf455e78bd14baba1b431fb7ebbffbae0a351422debdd1bee763d8f452d46475f743e3ca1dcdb52ad3fdf1777315f733e1ca3df97e7df25cc19efdd6e6743f892f349fd69b73076b9398fba72f065c1f7f9f49eeeae67b7d147bfdbc5c88b6d6e6a70f983af389f8c7b478c339f98cf5705dfec9ed3cc2bbef95e08ed1b5b2f6db77b63eba551b82bbfe07c7fd71eedaeff6e8c3f9d6f73ca18d1be28f8f8a7d4f788f5b47877eb7df0e87cbdf9ecdddad6eeffde1feafee5e6e3bdcf1b77f494ce5aadfd9ae0bbdae77ee1e5736719235cf225c10773e675761e3dde32f7dbe6fbf97edafbf6f16b3d339b4f77dcad8eb372cb278c764da6d6da7829a634da58e3bc5fef69bbb7f04bcd77af941876be3df4195efd15c10779fcfcca882bcfd87ef895e6bb9cd21ba1e4d46b8de5179a8f4e987dccdf6b1aaf84faebccd72decdaf76af1a69de6f965e6a33a67a9ad9e37c6adf9fd2af3e96b6dbff4e38fe796f393f9aabfb567af2dc7547be8c77cfa4efc69a5b9e75d6be762be7f73d731e75a27d794e7309fd7fd7a4cf7ec9a421f3398ef57ee7dc4fe4e6aa7a6f7cb67fbce36438a3dbd9ffbfae5e5837ec6b9b1d41bde2871fdeaf2e9ade587deeb0c7d8e96d6fab8dd597f1835bff0ee3f697d35c2c9efccf76ffa3b9cb3bef9e78f724bbda5a6b94b595fb571d73d3b9dd9cb88637d76d25da7a67d57f9adee788fd70d9ffc52eefce5cffac68a3f8e0ceb93987f3a39c43cef9efbdced32f07af549ae39bc3dceaafb9dd2f774dc91ddae9197abefe2fbb7961e5f1de5b690a7a6c665b49f57abcf4bef2bbf59c2196d9f9dd5d7ebb5b44fcdf1851ce7551fae3052aff79ed2ff5bbd547d7b66cff3affde64f3ff6367c5fc38bb7bcf5cb693ddfa9be1ffd86bb7a6c79e6785354dfbf96dbfb758fd8fa4f770d1fcd797fa97db4f0c31bf3a94fd72e23beb3773af7d496866feb292bbcf45689adadded41773f5b5435ae1cff266af52dfd55cef7ee38fd1d74fab17299bafb415637c23a5f6ce7aed95be63aa29b4d1eafaadd70c5f97b6df387dedd2fb29fb94a33e6fe3a6106ffeadd43ac3dd8e56d9eddadcd4781831fbe425ea8bbacf8fb1f774d3cafbcc674c785abc427d3963092bfcbf6ede5c2f2ecee9b7dd4e87199a5fdb7ab7dbeda417a80fffbb3d943c6b4d69ae33ed461e9536c638795e9fbe4a35fff37aff6b8d196319be88b7bf3cfedee1b759434fdfafb3ead92bfe5f423a7b0c9fccd54a7a31b491ea3e75a7cf679d6daedbea1defe790d337f3df9fc6387d963b4eeb05c397fbe6d8f68aebee3c5e9dc66bd32727d513da2cf18cbdee9b0379bdf075d975eed36e1b61a57c5b2ea3a6aff38ef1d51957da7bcd5dc76e27232f96e095e993d94b09ffb6d8571a6bdceda60b9fe75ef39d6bcf90678dbb17a6af4a5d6fbcba4f8df1eef8d277b5ec79c39eaff49a47c933431362a663b73b63c283c0cbd27773af7fe77c6d96d2469c76ab7cd36c3389570bdfaddd4ee82ba6bacb39fb055e2c7cdadb6825bc7a4e2aadb683bc56f8e09437df0f35d59776ea67acf4c59e73fdbc527e6dcc9f5679f352e1f396460c73a717f7eb75a7f4e9d9f7ecdf422cf7ae3663365e297c3bc7beff85b65b19fddc6f6f9a47e3065e287cbb538b35e67d5bec67ec797a9df0ed4dbb977973cfe786d67a4dfaf686106f8af5cf997a7cbd247ddffe7e259f3c732c73d4b99097091fd6506a6fa1b7d9c26bbd1faf48dfd415fea9e78630fb1d231f2f485fa43f639f2d8f555f8fa77cf4e1387f95dfceebe5fe5e13d9edb020af12be9bf9fd966619f1f512daabc88b84cfeabaedf5d2c3bce3f47eb7e325f21ae1f3d26f6f6fec9677a86b4cbbf1461ae1d82af712816f3e23bd32fb99a77c403bd21b5f5fbbc530d61bc2c45057de23c757439a76a37e83c351bc40d8bff22f659775eeac65da8df58957238b3bffba4acbfb94bac67d5023c694520a23ce554289e5f5b56fd9b78f3e660b639a8c4474980d31431362b6634aebbd187d9642be3fdfffc2f8fba46842ccdad4749a8eddcecb838fef08f1bdd4ff4d23de7fd1e73ddd52c3fea3ad1bffaee8f378cba9b3fe5fc21d234ff451d837cf3e477c29ad3a2ff1eae0d3f6df1e2b9516cfc97747f471fa23acd8e348bfe4d1eb5094d5e2782bcd31561c73ad3ae788f387d9cbd077a3fe335a08a9f5764be955e88375db6e77f5becf89f34ebb514a1b2f4ae95f9cdc100fa3f4ddad8d72cdf122f465fd719cdbfa69658e3c7a71f0fd99f5d67eda5ca18e3c7a0dfab8bfb9e6cae9d782beedfd967c4faeb1d7065fbff3729fabf451f2082f20af409ffdd2d7fba784b763693fa06f7e4c6bbf164f8b6fb4fecff7fddfbb4eab25863b6aede7a355778b79875ee25c2beef345a8afb757e38b75ded96af0757ea78ebff64ef97c724b1877d7705b99e5947bbefd659590f26e67beb5f60cbe4f7f97d84f8975ad3eca2e5e7abeeb39aeb96e6c3fa71c4b0c3e0b7f85bcc75a39ed1cd73cdff455fafdf3aef8d62df7b4c00bcf377b953dd3de6de4dd42eac6ebce77f9be14ebcaf3ff16ef6fe7f3f05659e7dd3a4f8abfef3edbf1aaf35defb5df7f62ec31d4905ef0550bf7e57b77c873e7defa2373bce87c55f3dbbfcf38eecd73f5538fd79c6f6a8ab5c4d2deb829df36e6f192f3597e7de654ee4fedec126b9f86c3ad8705dfde17ef4bf9b7f4ff09b11caf389fee7977edfffeb06b782bf820e55ef61d33a5fd43dd71d4f182f375387be43073dea1f6d2f6dc74f44c8117051f841eff1f218cd2433b2b8e1378bdf970b552de8b69e69f4f2f371f8c38cf1f75c4b4df3a3d96c06b82af53bceddcf1d66b65f5d0d2f192e08bdf52dc6bb59ad2ba634fbbf18d0757a38d46bcda7c1b5e59a1b599720e7db43a8d4209c48bcdf77bd59df7997ff45af3712c2f967c4358651c2f355fdedf5a4be7a4d0fe9fb10e331d78ce2b820fee4b3befff7fce6796bce776abdc2a128e579a2f46acbbaed2dadba3fc57ce0bcd77a39c32f77babf7b17f0be775e6cb986f38b597ddd37d7927b2dbed76770b032f335fe4faea7ee1fc653ec9a3ec3c7afe6ff51a7332dfd796d3ff7f97bff34bf9980ff2ad3da5f25b9f3bc45acc2739dd9bd3fc750ef37d6f39f797dfcbe1d53983f974a77373ebf78f75c78cbdbe7c125e7d2fbf14eb7837c45e5e3eaaa3877e526ca7c7d55faf2e1f9673f77d7da4b876e86fadaf6f4d698e566b396de794d647efcc1dd7deafb737633aebab93dabdbbfc9af68ef794f5d9582dbd1b52cb3bcd1fc6faa2de50f64e27b77b7f3e6fa8105b6af385955e1c6dbc75da19a1d5f9d219fbec3bc3fa72dcb6fec9ebc635425caf075daf3edaffbdd7cf4cf1adb94e415daebe6eb39653f33cffa5f8fe70eb6af5f16ca5fe55de7d65adb8c610ba587db57b6ebdde5a7619b99778d5c7e385fa438a37ac58f60d6346d4a5eafb5aff9839fcb45abdb7deedbe74d9f0511f77c796ff38added0a6fa70fd986f5e33b6b052ba517d367a7fbdbf3953a9b9dd357c5a6629e1b4b24f6eb1dd549efa38c41b676b77cd32c63dd3e0b48fdd19139e5a170d9fd6ffcffdebeef8f6496997a96fd329e3847e46bdffc4fa96fab4ed17c2fd2dae7bdb4de3e4de487d15f69a6dd5f6de6e71e6bc2b73d70c1fc4b27bfd69bfbdd3bd639cdc5b9c1c917bc684d7d635aa7bfcb7c753d29be18cbd2e51b7e69b258d99e25a33cdf8d63bb5d659e6696bbe54ca50b20bd417f1dcb9fa8e31fd3b76def5e9cb51ea2865b410db592d97e18b9cf21925fc175afbb39ed3d357f995ba47dc6fbd334e9deb74c5602fbd365649ed85944e6ab1bc37c30b73dc7a72afe764d4d5e9f3dd5759f587bf6e2f25e4f4d97fb78fbc4b5abfb7d9c3f0d5cb21beff4fcebdc6506ffa3a8d58eaef2ba4797a595ff8aa8612eb0ee3d4f4e94fbfb530472f3ff531d608ba327df3d3acb7b6357359f7a42e7cfa4348b3de17eb88afbf5d98beaf63c7114fe86fb459d24b1f8efb4a9fff8752cabf6397a54fe3993d9496dead35ccb4850fda4937be9a5aff6fcc5d2c7c355f5c35be596f0a675ce1d39b735b7ba6f1430f7da5cf76baa9ae3bffcc3b9e1550970a9fbfbcd7bd23f633f32d27a5f4d9c9a9a7554f8c7dc5b1539aa72b852f525ff3cf9ff78c21ac14dfe942e18b11cf3d2bdf34520cbbdced64e645b9a6eb84afe7d879d5765b4ee58c78d2e7eba57f76a97d9df26adf25e9b372435827ffff7e2f39ee32e1f31b7fac35bcb05b4b2d5cd215e9d31d668b3f8dbd6a28a187f46198ab8cf3da28e7863d3eaab4561a61c518e33a658c747a3bb9b6d24a49f19c3197f075dea3d6fed34ce5efdc5f12beff29ff5a536c31a7d972367ec54dd708dfc73e669d75dc32de586d1c9c8fd3426e97089f869ad6eef1a4b3d7e9e11a5c0f878d8ebeaee597705ffcaf9df4f6103e1f7fe5b573b9a7a7d55b10be1aa987bdf209f98d9aeadd6eb7a399eae96af4c9dfe5ddd5de7da1cefbee76bb9dacb2dbf1e28cb28afce0b315432f2bd5985fdae1e4452955187db25f6f6dae79d2bf2f861e7c77c76a699c1a7fa879948bbe0b778cbf470ca3ce7e56451f867546c9ffc51edf78ef8cd395e8d3f7537ef3b7f977f045ed3fec7fcade73dcd522fa78d71fda3ae9c43ceecb0f7d91e3c977e7b9679fbbb78660c4b64e0be5bc304f5c65b415ca3c218491dfdb23df85bece2f865f46ace3d5dbf66f47e8b3f2e72971ae3fe20b27f446763bcbc15723f491c269f5961ee338e8c31f7a7ab1e4f8d32db916f459cda58e91ea29fdfeb4ce415d1b7cf4570af79d35d6c93b87726f6c6e3a38e80af4f5ae2ffeba56fbabf65e5e3f5d80be7be5a652ce28398690e3ae3fdf847bcf0e77a63aeb7ea91f4bf1c4935e386594586fc825efd9c32aed967dbe2abfce514e09f3f7b95f0d3e6c71d7fcee7925dd70563ed65e2873a414537a6f85f2deadf5dffcc71f33fc55d23d1fbdf4ce7b63a7fd4e8c7dbe61ba32f8aaa4385a5f25b5f26ae9d2f379da6bbd7fe75b23b5f8c6dd2c5d187c35d2acedeeb4c37ee7f5bbdd5c9c57e36e7063baf27c3dd3ba73b7f9cbae63efc2f3e5286dc577be1febce524bbbe79c93623bdf8d9c4e582bbcfcead86d9dcf527d63973e624d61edfb826feb5bffbc3eca2ebdc5b68bcea7f3f43adb8abdfcdcc339e7bbd5eb89a7f6135ec8319423eba574d608e9bdb0e61bab9e58f759efff785fc97b97059faff4c3c8fff7f34e8f75d436ceb777f796424a3f9d14d6ae0a3efc698e16e239ef96b0cbb41bb3afd293d3512d035d703e4c21841bfa7fe1fd7e760a3e8de39f9f472c3796b9daae371fd7fe4b9b219c3f77bcfba5a0cbcdb7afb75d668cb796b96a5a41d7041fbfdcef7f2be477d6a9b5049fc779cbaf6fe793e2eb679b38ebcd375e4ab3a5fc6fd8a3ef75ef2e369f9ff3d75c699dd15fcca19da06bcdd7bdd515d7cd39969defaae6ab77467ef986faeabb298ce09b567668319eb1f74bd37c525f0df7cc9857bebfa468be69eb8cd1477ea7adb1ff33df87ba4a3d778d3f7ffca75b9799efc36a399511538cf59cb6abcc57eda613c3ed3bbc91d6bfa58bccd7adadf65299f396b2e20aa7d616e1d4dab6cc748df928e476521ba5fd77479bbbc47cfa4efbe9de757e69f1ee5d613efb619593f7d87fdf57c7b41b7dcf2d0e8ee716c7a3b2c7c6367b6c3fbac07c3346e96fe6bbcada25d650babe7c31533fadbcd5c67c27e76937621b5d5ebe6963e4934688f99fbbe3ae2e9fbf9267aa3fae5b672dfd151f27c7c64b8b53b3822394674c784438d4faa4b5fcd29ae3851fdf3d39d0fa26b75546aa339c99661d677dd56ae96dadf6e72cfbffb23e2d7db779ea2f6fcf13c25814db2b6b9cb8de8aabc51262393f9fddfb0ebbc51de61b3e2bb7c6bf6fa8afaf14a77180f5d17bed8f745f49e5bd9b9ba1f5d881cf98f07a1c5e7dbe723fbf8575df9cbff7aebe7e73bdd3cae85b7d38620a2fdf7fcaaa61efacbe2bad97b3fa0dbdfd79f7559fae7e56dc27ad927389bbaaef767ff9affa66abb79fdd862fceacb5ae74cf9eeab372fe1b6b8df7475e6147f56d4de5dd18dea927979bd7f069886fd53dcaeff1fd999ffab4a797d64a61953553cb69f8a486f2e6e83dfc3cefc94d7d9a5a287baddb7b9965e4a5bedeabbf91cefc37a4f96f525f9f3c4268f9af3f53bbf70cdfb49bf6ed25ef39e6ccf1a86f6eba77fdfa52ec33cd57d467a7e5787fbbb39c5ada1beadb1beb7e79b6d86b4beb05f5c95badfcf07f7a3f7d3d625a2394f4d22de7af327c315228fbd5747ff8f1ae9e3efae3ffb3639ce9a799d6183eaf75d4937ed9bf9d9fd24e1fdf78d388e7e79ad367bde77ecb4d63c6ffee09c347a1cd1df66d638f9cdab909665a3be571dafac2976dec985bde37de3f4f4d5f8c546eef2d8c9cfa2865a62f529f73b7f5d6b935cf2e7cf1c24f718f97c31e2b8d983e3a21df32e2ac31c43ac32d1c2e7dbfcadf2b9cb4df0ae7fd96be0af7bef74bce3bfc70fb16be4f27975346aa3d0b9fa55ad37cf5a4d9d729fd0a1fbff546aca9f6d9df1b7da5af7bb9b7df75e79affc45d856fde7877ccd4e688298f9dd227b1d613dfbc634fe1fbd2429a27857d631b3b47e1f338ceda2d96b37629b53ee18339e77c23847fd658719ef471dcb9ee3bc60c69ef1d4bfae6d4d5d2cfabfdb27e8c4df834c6f44face7ac71d68a237ddfe74ff9a43cc23ae1bf903e58bb9570f3e9e3ce1adf471fbe335e5db1e43fe7bd6d091f95f97a7ce1ec33dbbd2d091fd433deac2dc776842f7ebd75fc7ffb0c2dc556840ffafde3975dfe6ce797d6d107f39efcce8d2bd4d8471bc2a7a58618e2ac7f957b420bc25771af52cafd7f8496fadae8ebfb6b9ef7fc77cf2f7bfde08398df196fa61ed29e7565f4f1bdbbb6b3779e6dedb87af065d9e1a4b1cbbaa9cdb72efaf2cc1bef88f154f4413da78f7d5bda6fd6b126faa4b654c69a2fe791ee4a3bf8b8aef34aae77cc3572445ff5765f09318416e7dde7a18f7739239555733977ed863e8cf7b4ddc26f77cd14ca421fc7be776d6dec56fbac097d5f639e39eed7e24fb5851c7cf06fe939c4576bbab5dcbbdd6e67b7d27018f4417a239e58f70ebb765bcbb15691703046419fe534ea0ee7cc97539f7711236639cc7498e1302b22c48c5a390e1b7cd9660d318f906b5be7e6b70b87405fccf8c77ff39e1663cb35f7553800faa2de3bf61823ddf3dbaf39fcf9b0bc55cfed2fbfdcd21c39f8f9768656fe5dbfa6537f0afbe03ba185d4e66c33ad18d22823ced35b5cffe71defadbd069fdf9e5a0e61a73ed6aa967911462a0371e0f3c1fb7fff53ca3c63cdbcfa38b724bbdd6ef7c661cfb7e5acfcfff82dd77c469ac1e7bff69ec30e778f384b3df45e3ae9cd31e66b2f8636538cbd87bcc28c358f7f7a0c3e28ff8df64faf659c1e72c8f3fdccf1aedf464e6dd6b4e2f9328cf5ee9fabf65e5b0eefe06bf1bc9456496bbe345b58e19c584e5d73969be7dced7c9363fabddd7bc2cbbbdf1cea7c365f6f3995d0caeaa3de177c53e21aade4b76b2d69c69e6db7dbed7811470e74be08ebb6b3c788b3d4f2e7b41b77019522a844ee4a96692447410cc4300cc08098d24a00000a03140030301c1e0e86a3f1a09e478aef01148004426e5a9a383628954663a160240ea3280862188a61180641208661180a03a5446b46e391a7c9614ef23354406e47b73dcdfc787b9b39a0bf01807a3413714ea6c7aa9a8127e29b1b3f43c6943a4917ecc038c17c337c58c29f80b3a6773674539a6b3b2fae35c5dc5c88a6f019c4408a8271d3b331273d76d0878bbe5c5c02ba1ee261fa78a685e445bc282002cd593ef195bd204421319283d9b356f50c7992a1c406572f97c2a40dc09f80be3f9a5fc56ee5761bda229260ad847857b9439565aef346b840a0758f96a5c413a4d47c540053e8e051c93cc4b14ba986751fae0b79116ffcb0d4e4d45355341e7369406b9e4936d1985ae0f362e87838b86d569140a6248403cbae6449aef385b07c0d58ec29510f06067aae6f308b4369e76df9d0679bb7a89f802d3ca6eea09a57c118c3547658e89a7fdf785ec059e62c7971e7da2d74037000ca672975c05d64614515e2d7b6400dd512bba57617840db751c1c5d9ff321de6a8cb40e65903c7c4944a3ec33f08833fe273700c7000662b6b4ad508a208d26f347795882031e733692ed975a2a941d64ffc1a0deca3d005962825b29bf4b2682b75a1f241444bb558784524cc404229eaa40f83a6147aa83f58dc0d3207bdbde94637d1b7a360fca74b127c295a6a3ab5821233e5996229f414575224b75416346042de95986f5f7dd9d1a7d7839366d36316039750d82cdd8cb5224f704743cb569ba1ae66b61861edc24b195a93e403b8226677f1ccbaf0371071c66373ab15a55b400aa75061939e0f7340698374dc74168dbedd66dfe75e6809999f11a25bb7fc105a236bad6e9cd5330e8d6e881303eed3d9aca3a66e50b5f19624cb923513331a9c094dad2b1d425250ea8ee4966c54d714433fa924becc001135fde6ccb5086f86c6b9666a33e82a95c3bab75f12a5870ebd62cda4f41f3a8a0b51b086bbc564403875f84e75c06f5b81e63f0029f50709f2993efc570e558e840c689de80e4ec64cf7f5d09b28a416a47c78f67d7a05518a35dbe57c5efbb98ee828deb15efe29c5ebdbe13750a920e328d1da87c299acc40c0d2d54c618a84b5978a12b5fa11934165a779a50ca9021ad9c140b8fae98241576aa28a1ea5fb664bb33f709128d0b5a28380491b9dae597b54cb86db8c4ce4e91a27561b63cf4d14d90709ce6ffbe905d7c9da1f96e2f602742782776972fc4e4f4fc0f32faa1a3d3c85312abb5f53af675c7df32b232369aa2956ddcfcee8348af1460ee181bcb46f5f2eadab626d3d96533a6292c73bc0594b3df5318815389ce730bd721c326acb0faa02d2a4230515bac2fc6a207f8d23d88223240d35f1f4f0063cfc2affb8a9eb5ffe05aa69106e8b080225afd7a957ee30a792ebeb88021546c142ec22fff2408c3e6c6c1da7367f0cb165001049be80593c72cac6529e327991dc0a9aa591057bf07146ab927be16e104be44134cc0bde33ae4da225f9576602b58c0bc983161ef4c488099a02e20dcb2ac3c2eec8776a0140b9f35508ded1253ff8d5a4fe04ae9c382369c5abf06e4a0b0cd24c170e29f2f8333ce42df998827aaa945c34552ce8475216a2f627717f67de02dce988ca92c719b0b96343670b55839de4e39333cee21097ab9a06a710251141a030d18a488918564d17da0b434fafffef921f6f1a08bae3adbb89547bf300dab111ee323dd2635b1864832906c1e3280b31af67ee0de8b5f88b1f4c8bc7b2cf0b8c9d9b26a8de9d5fc84631e1496b586beedab8ef584ffcf58ed2e9eea95952ff59c532cf37ef8b68a64ea3b8136a1ff00fd230e70b2a38085b79ea2d83e843b55ee7401060502e5f25f9a7470929f0844c4f601c723a40d3fe627b74c62ae93707744b8af880b10fddb31f692f24535d9fa1712b5af5644acbee1b741ea7eaff8669f1cc61c01aef3cfc46fe2e3e0c6f065660debd57be02bd08daef65403ad3db537e9beb099475bd64c31db9b3f7932f0047aae49f8a15423ae633be2d0e2d7cea5ea46f55440d81a60c3934b2fb75e68bd5cbddf63d551032ef5faf45c34ef10b923e7e20fc4358a433e7d1a3cc274a0b38e66511b28110841a05ae8d5c9017188c1dd680f2c851b8b9ce09a99c308939d62a1ffcd72b28050ee71ea832a00a140f0d2d21b3849463b7fbd6edc6275f919268511620742714699c9364d329221524a395d9fb0f18d5029b4c9506091f103027fd1282b3155fe6fc251d70a22fd6e6dfeff466137b2f3bf51e2f97c6d4aae4ed39e2302e9bea7551cffa4a82d09ca790ccb6685a1ba3c1608a2b727778cbbafec1fff0daf5aa44e448f7e3cb7a170f6f246e6722e018715c09ad6b4503d73c86c83e0c9e125a7846c2c50ebd878433423d3a5ee26e839c23175146e216519d19f6b39b950e4809810b711511cecb3b476d731c5adf7bd73085ae0d3b5177314207bc28d090dbbed1320021a61491ace037e39a6f4432cd105b88806719189167d110d920c1e316e329079c1c37fa5110b957749e3942a12b430a75126c4f82133dfaaafa7cbd00af88605e53e3d714d04c7a393851aa8ee27470d555d4f49884ef84d417c0e93c7306dd513c3ec41a4d8a269a744610ace08db142a90098949e4ea247cca31c5a14043d8ae52ee094b92d2e117d1864104d5bf83994196fa9054e0b585579cd6d24a6713b007b38f94eecf13ea78ec8ae897f7cbe544d50995be5c4865e527df076ae5d112b3b769a09793f83487782afea6e443a7231f0c60b09d0cc4240f14389a3fc8dbaab9488da67f66514c4faef8d0b4e17bd454da07822aeaa213c7d69f32b234513d8d10158a77a6790b00a256b6999b33bedc11330485ea1087bf8b07d61d41c05d91b13bf4e4617b4cdd7c14fffe1bc2de3463a5491491024e5cdf2088370595107f24feec792199b0cb8be32893d335d8d791d8d3236834da75def00f9dee1dd499dbcbebbde6bcafdd21e417c81731c22a33235b1d245d0bd4b028b3b03bffaa3c41b57b21f694dc415272f80093384bb08d4cbc3214c77fc11722edae0b7b8aaa8dc3730f0ed597d0f76f47ed404de084a690802e2a771337831dbda035494da12b2a26dffa980f5968948f2336199cc04001c5c365450457aaa229cf7f42896633f63a7db6a1914fa60b390a0e0046068413d2b29162f43b62eba0d8a7761491eda6aaf4b8d9b6ac7ddcbc4f6cf6ba9b913fc21d12a613278c4330c5ab637512a2aa542241d0ab1a7f23a608a082ca02af7b02d69c0e2d6f2a8b46ed7e0d59d1147444a7278e7e2ba964cc8b36eb3e10a1badab19643123f9e7607be19cf7b0b7a77a9ecad56e8de031aa38fa8d011a0ce490996adb6bbb9c41359bf6d1cd4e470a0ce7b6f1e75c246b04e100ac1494b03901180162fa0081ad0561b73ebf1391d66990dd6731bfeb468f918b479fe9bb6573e0f29cbace6df217ee772a1fe5f42a19d4a32e2045ecc507e3a4f6e7388f2b2b971303b3a5e301e4fa330cdeca685d6a6b9352e9f62f910dcb58c7b15d1c6eef1abc8beece3e59694a357ff31a5ae737944fea13a3ac87ac6e61a11c9c57356a3d5b631da8488b36c17006243b243f000f8740df953d0bed25d23a62f214d1606c5b8f8d6744119ddff8af78eaf698a8511c165d1b66b264c75ba8ddc2d80531deb6dfd44d3d1bc940afc40ca52a6b83c93662d459c0adcb21394c143407a432c870dd47dc34c6011bfc909b7f811dcc67896500732c47323ae093e29222155238d9aa56f923bb0f9d7903f6624b189a23a0cf1b5a2845c947543b772e9fd92c89c161a78a6ff1020d2c95bd5d56b695596d2f0ad12610995f526f3628b7e3365403a8e090fb68758470fbb4291c6f39d4f0f89470f01850fa08c7c01f113a43ee80107b1bdd85cd6c95849656fa1378823f8263a04d0b240baa930d90764f400b045012577b9d12f6ca69be8ddfc6a8b2aca5a3fa7556244a5069619ab3e8a2fbf915960d20155b61ce8fa586a15a384fa4f8df5e8eb248946adbacee03c51f21eb7d1c3e740d8117046d7e4ff3af6633c138c3db3d59b3e64747a966a85bd3111788bebd345671585e5ac66ec6d55318494413bde5b970e7b67340bc6b8d2e193344459774ba258b11e1fa83ba00d999474f70d57856a11fd4fd232b1b48b1d98a5ed20fda8550515ea5bfa59376205ecc4985b27f1604d3a2793093af3375a13072b0d8bfa604b8ef5599583caa1a54fcdccffaf595c74068cbf0983209da378b10a5f5a0c453300752a95dd5b17206b4b4006504aa9b1faa89059a0b92dc56614de5be98a272110287915a40fe6c84b0dcfe02e4246280140e53f41504980689b5923cd60059c6d74ca4591e85279747689ee5caceededcd381e1cfdfa139737f621140d2474987ee34d0e3f73a92d959ca9b5c3b9696f8a5cd3d9dd18b9a24980f2e8fd1a4d3a055234b562c723599e240ac8b19a273613d44ca580e31d1c15c0773653348f956f2161b43044c4eb01c63a1c65a0fab0cac3f58626371c67288852696eb86218afa035f8ef50543640cce1873a7ccf090df9256982b605f8a21ba77801c88d396a89a5c97e95473b431425ca1bb73eb219eb4836456d4febaa390d4c43c6a055531134489afa9754e472110139709774409820f419b982616128a0425b368dee6988e43a021ae12ee8992045f8212314bb81eda61d2e4302ed87a88dc5271315455d75aaeaa5ad694e32581932ed607adb79b3a3c69c80ffbb7364fb962482da8c992beba25e6caf63f72ef822b5077b7261daa4494ae1d35243c33e8ab2f71ce3e174d9bda9c1f0ed93b1e30f713aca1d69da4bd801efe7e22a679ecf0f84870aea08443cdd84ba9c4853f082a90f61520c51433ed47275f519b5f44c778845de791bb9b6f88ddd0492b9f77485450f746ca480f803b2be395bb7f5935a80da821a9ded20ef18ccb8628b6d0fc38f0a524061dec8888532c820d349e1d05f1acbb440df43c90afb0daa293cb2d2f6e807b2efd871d58cf5ab796835fd1f4e6999d3d10af17c868f660990c00fec600a19d10ea9efb88b6c0f2da5d5c48373e6243b40f52a051600309cdb793ec9f978cb56f68e9656a880696649f144a4951e4b68d70ff53297162ea2e1d5d14f43e54c05dbe6691990e945919cc2d9f0cab024d1971ac3ee9f6c6fbdb39f728bf5519c5308e7108f1608008f76489d229b6751236c421dd108ab69cda0b43c50c0094607ec2f47d1872bbb4d3200abea499dfd6eb128ef8c6611a7790c3e4daf28f8405709501623835c4e2fd736424dc69cfe61805a2902088a76d33ac461641a0186b4927b42c76626ea2eab9b87ddd4f6feb63872d1a762739d72f4a98f64324c6c0aba5613cee11308fb41567a30dc47301124b3d0cb88811a8c7507a3f88afd2cc82bca686326c6491b975e079fd8cdce8eea6caec234e4a7aa25093321f3f0d25c14e855c3a25ea7c182e4ec7015e0414c42fb3ada94d5cc07470f96a7c89a2f15102051e19cec067248ba2581f80f16d61f3696ad8223a5a58280860f1da1a0c011983003ce4e4016c42840394c51aed1d311e6821558dcdfa818c827ee819af82543b3bfdd4ff2a7635e75a098d8f361d6de0acbe6ff9352d4308cd55b1dca4a4c5ae5ca9b7cd80a559456e07b914d9b067260cdb817b70aafce8c854caaebf33e8fd63e10852e63b0a81d09dd9718713b9d0fc7842f5ea8b325cc103fa2a625c62e6b78287bcfd2d0da7798565ac26802a6c40ad960058cdc460ffbb2208829f38fdc5cf592b21441d4fe6801415415d7d3ece7d1c4409c64f5cde0490c7ea26308a4ead331794fd43e9a0617e8eda95db1e713a58d7131bafc686764965a645d20e12d2e33f0937be12bc475f449d5c170898610bd92c7ed1f3c8ac216424614257478429f630653e6321967c4909c599c28dd7d6119d9d53e0dd80f73928e6c75315673d76bfa11aa6df9525534f7ef3324096a6e03aa1ca709e97ef970e13f1166805d265b8f9ff851b23cd3d0f4e7987f3674abf4a6601ef8557f6c5d91e958396d1b7609bf7a3685998be012ff6298ad3a834846dc91e693b595f7d8927b11b555ab12951035e21619f1e93072a45b12be960c040295c4482b6db4b37dfb41222926299c2217648300d55af188ebc013934e8b545864193f3ce8732ea2302361482ad520ce1b5670f2a245d8f65c70b094d177ac491a06b79a1691bd7be917102e39bb4687634b159b0a30307103da72f40d1cb08c4b04e1d15a935ffab367c35ac80822ea00aecda35842a50ccf098a01268436e715b8aed02cad60bca653c10dc0954baa765eca6b2089519ad02b4280064945720b2ccad68d2e0f5f6e9bbcfbcfe364e66fe9a88cc76a708dfa257214f055aa940744054ec91b3240de164585e35169103dc5841d3c94d27ffcd94bd2a753f96548335b8228ead9a7e3d8cb22e28044b6126507ca9d4057dd062cfe1731a64fffc2aa600b75120e575b11f4cfcba75c1963c2410709b239554a243a9eb4897f0e14d84002389a86a1c08945cfd54cf4689660d11368fd47e0b89196185eb1f527555c0569e20655ab1ae4faa0b7c7867338301037e855061cc33ebd68177cde14b908575a0fa02a6aa79a8075c4276e4dd663f40b6430f381674f640301f5a91ddc0db8dfb9487fdf33309dbd9d63c8f4e21e086a949d66e74617960743f6880d17c34fd0e4c260fe8c0adfd4689b3da64fae86e726d688a3671cb1a612293800ac7837712fea4fcbd1109138065b2079da47ea907829e73ffd53c1caf1f046212ae46e9d9275a24a7bb0774ea0f0077758492a84f05b5b1d60b20b937773aeacc07c8631dd5adbf319b7e5a61d37a05267200ceb8a5e7115465a29214d9ea1cae7d3c30f7da65fe1f1b749d06027514a222057652326f65dd4b0ca984010e34e453b913078741c87d9a5cd1986b0853d72d791219497a99f61b90ee52dbc56c931ab0369ed55e6ab0f4453e66cba418dd1b67e0aa75d240d0a2a0a4f40f1afaadcc86c269a8c39f00b4224820343254b806a0e34db85b8ccf0948e16c9fe0d14ab171750605f0221585ecb7b48339c8119b258243a6b665076f5bedb768490c6598991190e2f0dc43c0329ceb943d3af628e462e5c52954f475b71ba5960634750e89dca978638c6844ae78a0675a7957db231cfb7f6fb6008447aca216e8cb1fb38b75ccfecd0b0120cb78f511b5879144a333c79423929580f0187128d321a36d4c7548cc38356b4df99c84c76511c81503b002aac2e06af3f75b7059f52d420024ee5b23aafd34bc410beae840fc7aa6d4488198515a2bd502830e349ae3a939e13679238a79bb4d9d05a5308cfae559db0b7570443e2cab40eb22d3e052c30ad8007fff2a1c9d2de173d6d25b2bfa0c35aded83c4139ec4fd1805c5d9765dcd5eea153367ac3419ff450b26f918cc5562db5db858fba455ff056e229989a0cc7766f4cef2744a4ff320e54197f8385623012ae4c96ad46185e89264b9120fb33b12f6f2bf42056d3d39417963ab2f335de844188a8b0ad81a441311d8949926316f92f21fad8da39d599e38fa6a779f30127309bd89e0ceebcc18159299d80d40c003d9a647470d2435e1ebf7d3b855df552923621f81e817d1e5b672d1a3e5bea0eb82d828fc73846bf64d078f15e91cb16ab8f16cc14218a115fa310ac89cbbcc7f9512cf950c4718c98f21a41ecd85ccc04ae549d34235a9cc550a5631a9d03fc62b30400ba3bf28843cbc09177ae4e334845397895ccf28ea24a33bf462521e09fdce0801f13e9bdecba8a6574371dccd9a336bc636da58e428309ee47f570d81a5dfd500fabebbd7faeb87d28fea180ce71bd8dc139bf5d8e66ea6cd4c3757846f64b0ed2f5f5aa405cc4a89afac585687574bed693f80d30670b98555f2b52886f3e7dbec0feca4ca96aa40a2627e982c00561d5839e6d74782e57e3c05a4b88085908e3d1080611377173d97356b38365beb89a0188e0e2f723bf96cc127669e874a54b1ef0f71329cc69f5c93bdd3f2922248ff0bf451fc2a67ddfe4d0a3dcb1fd2e85afbcaf983dd4129158af3642dd32105f8bff18fae6499d7874f0a9a61d396ab72c35016b02b77f09fb2601d6df8a315a1b8f822c85cce984b513fac84d44d9d92548f3ba167d0348b6f93b63d1a721b76747f797df57f91b98d6fdec850562146a6b49e0add83b84f4b5b109321e3baa3a8face3d8164a643e8dbe582dde18275ad8bf8022baa77f36fac4b14d07e00af6ff4d03da39f5a6bb9dc69e8dd78348ed82c79be4e2c251cd25fed2ce360d6a42deba07bc8d9d028ca97f3a9de728788fc15613d077d9b2eb4335a09fb7955bab639f5bf581663ff9a1ed87a9d85b0145c4000c752bf0314cca76af0d7f16f65de4300a570bfc1d7038c1bc0fc2f1f726d20e65939e239905937a875d8fad0c7db23d07cf2caff0d357b90888773f7497aa5a0709df5262d2838325778a27c2df475d86ab4b5e1e296cd6c423f1fae388222914ab5312805103a7e04cde7599539f305cfb9177b7fec03de0f49d84452d80561bde69b0e610a317180f2b5d3544f41d8b7e323c83d9fe9fb944f2538feeed028b0cff72e9703704c53b669d911733876fe187fc42ccbb6a1ba147d74ac719bb47e5dc28579214b521d0db39e03c1894634730a08985c34ac22c67bec406658fb108f74dd541d210c760825d61ab492c5d55bca698b42a19c55f849c04b0b1800fb04f2ddedb31678909bebcc849e019194e97f5ecf64da8f4df1c632c90eefc592da7c2773565334379574aec975afd2a6b6ffe6b857415267b1e555bad9c9e456406d6ca6ba54416fc4414da3f62f924be53c1449a96322ec86bc932ea3074036f4213b427cf9ef28804da6fcad53315fb0a4c5115b3ed10d8c4139cf886007c131bad0b128bde1e37dfd6015a6e4e7257374d2649c8734224de28c5a690c806918a9a3ce1cd5b429c03b471ac8500a960f890ec5927ce19faee901504225db306fe78152698dbf50c47a3d613a83fb169db9af65e14dd1fa89176fe7aee9bc23d0168bbc5343f815042da50ce154105ad7d462392c9807e9d855208306851b7304af46e7e4886440f348af5341ccdab1301050eca2f781a856a3f580fbac1373ace1c140415eb45d421dee81b6c6004be39764ffcf8f402a0699d7a4f0b40f8f370625af30a04a26059f90408fa2370637454ddbd2df927998350d60d1d613211f23f3424123c4667220dbdfa2989a22fb19c8d91b4507379e1cf2b98e5ab13c3d64b1491165582167abc6381e769c030b9d0e781abfe415753d0010f8f9e91757d9581d1c3a6accb36da694deb123805d0fc31b2ace16afa012a35f3ac23dad732a93cbedc500750535d0faa4bd9f77ff12629ad69ed83a7fa06f0ec02d680d55051ccb0490eb097eec7033ae2f8b8ec0b4463330e63202561511990e2fd26b57f4a232f05b5fdb89b176029badd87b588c4b3807290acd9b9c10453f9d613b19c99cfb08c9a751c3a89566854d705def6457a1f0b694c3ea2227b440089285975d06d83b867c8f042ee06f70bc45a97b1be9114c0e0dbb268956ad2ea2b2165d65370d393b8c434b30ca0b1d00cf0d7f27e3f4aa30133220b45071ba89480501d79f79b2e59cdf0e263cd85437d0956ad5ccee5a8a11830a74ee2bc76a292cbf603f0704242c0cb62c11cba2eda2c78c7f9968bbc64ac66bf8857b8c4ef829aaec719eedc277d22ec2762965ef6bdef4e0de2fcebf2aed48319475b13267b8d44cb51c78478e996803d9927d9f90e69f4d13b41f0605dff884e152f9ff52d7ee2d9e6a778dea0ff821f890638c924ddacace97617044b67d59ccc139798f2da1a9e66dda5c8b7019a6a5a0555f67cfad9a8ac3734e6e19b9558517e06e07ddc7fa15c1fe684b8a3174d2321f71c1ed4dd0c0f28bf642f7d7a5e6e874d0c6b0360a004f27d188918a2484f2a6493ec6b08c3088f57bc67e29ad37cd4359842117e62a062900c9c02ca12f0989e41850a8e9740bce10bc20562e68b1f2545267d95c6b17d50f0d5bc7638260fb6ab0d11fb6048b84c351b941f1e07678b92dbbcbbd64381fec1c32ed58da39d2675f3af9647c69bf46873101f29965762ba5310d5f73f0a5d3715e6617f594f54893c04a705214e6d7482b922a167f4730c84e5ef967d5a462a6beeddf36085f2027ade60ff81d8449a35ac07de686291ca2e36a1a999b75b8a9b87803931bf186ea2eba7dcfb26a5c0e9f9ec628272e4cb584ca151d7a06f4c694cb1d1bc420def3d75115737037eb95936167061aa8f28a8277a5a7f1016dac2657dd11c640f2533cc1ede1e5fb13adf38ebe6314bbdea680976a3cfdbf73e7ee00e0106e550b5232fd0816679a02612ef9b96d0ede0e83003dab306f01c31b5e8e9b5c8295d7bbe67f9e5e2515a482e3270d2c8b6c09561010814fa81762302f9b584d2d888535bb769c3b9200270cd11aed7df139f675bdb172441c507407c5665bd224a06c924d234063cfc26cd95b07937117d233a631ffae4775886791768242cfd3eb9c063b79f4e44b13593bc29db10f1eb0bdf1cb817f37945093149d24d861d5940242e1afbe9ec3ce40460a576f41cae852a016afbefa6a10f4f8ef96b2efe345847d8651703149e4df45b6cff0ed784abe7f76a43534b1cf1b28aca481eaee66b2eaa2269b6a53058e138d7a365c832b3557c437d964f0a8045955b59d0964b539b4b89dd5425b03af93d6661b9c9681918b4d84ab8b2a0816eae7a1e76a5fe969f3729f36c096a50bbd42b2fe3f75fcf442c840937e1eb510282c056711e1026a3692a48029fe7f77d1459c0a447f3310779086d2d7a3e31fe000a6ca1e0701be56e44a2746573c9219710cfd880536013c325043ef8924102299146874d8a493cd2078689246b7f5f1e47b0e450b0392d5c324c87eeed0aac22701ae9fd6a8c1ca2369ecc5605fa512b56dfdaafa18d9c976895ea12971dcd87bc5bffacf093e140f3d070ed084c8a50c50a0c4d902c651340857e8b1b7b31d93aca3b6be6da909446b5564e5461997c936a726cbf36354ccd129de90825d84ba40e0be2e72d7b134bf65478e3e0f7d1aab1e0b857bbd0c56513693cbdf7d941e9ddd48620025bef30d7b28acb6df226e909027ad9c3d881c285f8c0b03036b465a3575777fa1d253fe4d2bc67c2280808b50c9acdb1ed3a7e74983bab75e2fad56c293959b47a865f9ffba13a7aca23cba2f22444b576b464b75b14ca86a8848e8769d56d91695c2792155a11121adfb5ab202abaceb4c4bc8f84383cbffe3be8104882222e3ac8a057d8e3684687510792f606d3340b5a3469724769694b928f5e2fa9f17e87817c90199b410c64abbd03ffdf2c1c0c94fc0b5bd85329a220305b423f7dea822ff2dcc2b7ca43aa5edad8e6e388765866a780ad0d46dab7f8c87051538e6dbacf5037f88655ee4180fe23ef624aa06bb13871215b4f90adf87eddcd4bef3804ddc0a30fe65546f8d4bbef39238ff6f0a84cd542d7998ea74a0f5deeef0ee1679b3468ce3fb8bf93ceb919a8e67e3c59c7b867dd2bc38be3b6624e5df055377b9faee38cc74fc3116d9b653d1533b2d3c2c78e6fc819043693b16edc1aecc180b7ee2d36b01aaad9331e23298f4b49c2bafd055a3b33108acf2110b3bf836d884015e6ee6874655de7dcc5bf74c2acd442c0da8e95594e04efefaeb203c18bda2c8c71ccfbdf90cca3738eabd2d4cca76509d4fa78d11790e9f7660c7c7bdacadb8a591051c60cf0751a3d8fe7f3b15774c4b22e195f7dddd3c225029bb7ee914025920ef1389b357749d14a8a822c7b40836c7074abcbe1d7ca8d6c6d904b5bebd1e90fef3b9bb2d3e837e9c85bed20f3af581362788f23049ece1d6554d75fa7bfd579d82fddc521c84827a125050263237baa140049049468d96c371f1785fbc5999196626e3c312ebdeec7668220c3d5c013d17ac53b03efbdec6df3c99083327f21d543455684275b0b9b224ee7b49b25ac601f4049d5a710caca980af89161c0b7513163527ac118f91a3c544f56b5bf6273bbe6cb22ac11fb932dfb5987d530efeb91fe281ffb36ba7f707bf831adfcf9e3e445982b79b418b5f198de25b6adf4141655b1f35625bed9ecb55cf3000b5ed2c007fdcb8a16c56b168eba8ca790aa00e4c1ad7bc388bcfa580787068c1ef8fcc28ec4ade468bd8fb867c288cde46a56ee1e91d3a2372c1dd08823396f8fb7c182fe5d9dcc6f55aa1a6180f9990758dd5ca04ac0ff91193d5189568d9fc0ca4ff56d781f0ebb8a2d3aa810b4b807c5637d434d41145fe54381006588a4b111e8f5112d14d72d6e741890faa3cd2331f03e96832496d9ee3cf32af1541ffda6abb91ced704f3fef1a94bee66f42574cc14e47db64f5ae548a440192a3e80b4aa6cdf7aee3117c4e9fa302b8d1f820d75a7c4751d9465a716e3e793630aa295bcafca7a3babf11b3b82c17f9a1feb27c0605e5f28b9f706e74c74f21cb847aa4fe6a666aa1a5e46193bbf93456fe8bfba8707ce06012dd32b87f64b68e494e2ccdc1ccedc5ca148591479257ae53775efeaba64a38f418ae2c36d5fc1b06e4559727550f120b4dffc0d76cb276183fedd7d75c2f63d7866a375cd7b957a11b774ce2ae4097b8a6389f465f4839e8d7a0171a28b52f266c04cc336b0569ead98fc3bd266c74c84829e546e0544b97b76aae21bda14df11dc06cc1b7097b12b24b379f7a9d6d7684e4c5a91744551c860c8917d5a93f8cb1c7263c0a866f049d53db59fffab3a303a5afe3161fb8a3c7c13ac79ad74f36f2f3235d78368261a332faba57836779707ba52614ff0dc664fec8fb33ec2b10fcbcfdc5b4c364609063ff0efc3af9f8c0dd754425dcee75170abd463d7d8e13de4418fedd78aeb7fe924c8902ec85409ae6c06f3490b9aa85135a88f352ef33984b7e7a8d51be21a7ccb00b8f2df4e12d6c814d3cf770ba4cf6b15cb540c77e417266b3d876ea37026a0cd5b08586fad6eeced31c7c64e1db21478febed69a0e72599ae6117190e5c21406c711df7fc2f7c9c403faf0cdf336b485becd71f40f94975f6cf8924622bfab4e35cc81f677bb3612ff5edf779af3769942c471106c30fb8c2aab8f411e322ab97110262636d86629383d092966a47ddaddd9a7bd41342c15230dc59c347c86d3fa60451ae4d6f1ec6f06e95e4792e148d372274d14f661ce9b909ede6f7013c2b9866d0119af3cb90a224d7de40979b66f6d1d2420e3f1880dae8eb1b03c3223a58e0103e48df5a683684d3fed8a7001c1c66c58e487d00b9517e42d98f5e3f6394f3027299d16a9d75dfafb43fe23d6cf08325ef8978835b0723ac6894e3a19e4f102e4e36b10ebf53097b64bc6d1de8f1bab940edc78b24800d1fe430e8fd13e70979cf402f8d966336cac0181079c59068d68205011dc0255187fbc42b2d02f326cffc311457673410c087194a983b1dceab8100d0f195b58f34da5feacc904dd9ac51cfb42b9147585d53d76591c0f698c5fb76b0a619257e2a7a8756d5ec05b3a8843ac27da77c6c97d0137c00a40765dbe458f2e2226a5bd03b4e1ca590075b279cd38b933d4c01537c3b7abf21c6441cf4bc88b2f3bde724786b25f281fa7c1dc8a1a8e190e1e657579c1d83fe0a90af307443ae6a085fe314a981eb560f9a4c5fdbdce262d0a2c773c6be10add53ac77ed678bc325b6c09d11547e1b5631796ead7867b9c95393698d5e33dd14d6b03b0a12f57df8384322d79262e69751ccf67d98464cc17b1865a75142856084f748ef3d865405da3d3fe8e199d9c4128be13d499a8112b98a2bdde9c2493bd7554400b053c80a84f28e567a59e2af4efc0dd550beea1e2095a94b1b6f8907f8ddcf45f29315020b6003eb566fe81cd70d4f78c4644cf8e6d1bf04fe5fc2e2a24c18db576188813144bb0a33a82272b1e6a86dfc7214f4377f838af535b04fca084797b1078b5f270144565e2a648266240ee1574a84cf58b5bf47269c08c3728942b7224e3081813e43b3337512744869406767c2ee5c629ca6c157a54acc95729afecfb889a2e8b66a5f9e7e9dd8293bccdb1519fe63a905ad75d9345b4c3cac328f33a06ca775ce55fc7564e65ecb521cf623e6c15bb728668aea9a3b8dc40b9377bd980f18a018e279c0984c16398418befe7132aab3b4b16899a55d03895c30425c1d6ab33cd4d766706303cd355facc3ef427675ccddc299ef584d691c6c62eb61f01d36b494034387093784422c96cc6addab999e17ac64f2299fdbaa20dfc1852033bc11a7a41bf51af2e63e745cf8c0602b6939b3872479348e2f8b875505c062e05ffff7557161b459715c67244a2c48055e2946d01d2cec80718111188b436a7ec4b4eee4ac89aae3c2a8129886a20c998113f7aaa3152f65a76cb1f3cc8a3818e55a48187687533f1837cabaa71cc34de22c0e3362de7b19ae528e96cdbfa3abd6444c0c18da061d30e837750b1798435c6baaafc9c4dea9ea5fa9b07589dca999551ed21cee139b5cb763f176cbbfd10653226e30abf89963a099bd5150d44b14aa117a39871cca54a1fe021a951384a359978858c0caae6fe297dcb091b46658f277dbadfdc7cddc721a7ae5fe848b67dc8a17ecafec33169a2bd568aac3e34c50835c8a36af69b406fe23ede22d18848275dd1b280090afc1fe5d8426e15004dc79cba6402a137da91c20cf6a4de8fded1231c4f7eba678aecd371c5a38ce5de3781b0ff93db072fb4ec1af3074503aa6c468621c94caca9e831198ad00fb1d72cb6642608b2b579d29dab0b912b7dd57f6a58bb67e9c192a7e9170fa811f3b870114b735de23f7442bf5534ac5c826ad322bef9f0baae82d976eeb4acc79c1a0d1d6e149baaf66119e81397a7b5b370f227455156d9229de1bacc64c875553f8f150249a0215811edf88fb04f239bc357455af6bc1d3c1a08eef0d09398c61802d7afd569794f43728a2dcce9f504f61425b3f7cf50f6dacab5d9c89c8382596a1aa8c40ad8c98963a0e15336909b7598216ad0c5fac841dc5eb7b219c1e06266b8fdd932e7dfc5f91f0d604ecaccae1b50844004de267c7639b54137670d7c954a11242ecbdfd713f7bdd40d822b7fd6df0d4408104f55e5237dcd1a6e932e899bfe8192370714f24dd5a01221a8581b9f88c8abcad681fb0fd41d9fca4c4db3cb9a378be62fc7f6acea0cbda5e426a1b99f9636ff1e94390181c0a141e8484808090f0304002040648878102103050700a14024081c28390101010121e069894597c941480c30542cb09c660c05081040c6a1881890a2030d301444c0a80988d02223250c0640c2a9080410d2330510104663a8088490110b3514044060a988c41051230a86104262a80c04c071031290062360a88c8400193e174aab95cd8526f6e3fb695a54dac6cd8b1397a6da335ddab7d432d6461ad44bc772c448b4eab6c8b4ae1bc90aad08890d67d2d59ad1505d9e12aa1a2215abadb655a550b6442d7854485b6e8b4ce6ba92acc08a90e1709d5dad192ddae52281ba2123a2ea455b745a6755d415b1344252ca24720a31fc239b334e2626e5dde30183c725b0b7b39dab158fd3ef64d1dd70bc32e595a8a815a86bf53c2c641a06596a50fcc8391332a83b60597e2bab9b5835dd52c3be864b74ce5052c673d79c1affee0399d82c2f279742f6ef07be850117da8deabef042cbe9e7bb0f061c992d6c1990555b30c775c420be999c176bcb24042b600299ccf286c526a43027a8716170ebed17d0b6616eefd50ca5e290664b9bd1b97dc76872c824c683b859cbcc8b45e7024ab12abbfb58fe813cde6597a096c2b01cc26d2c724d00eefadc6d5c17bc6af3960d04c1067b74eed47a137875cc7645caa9ac5b92e3a3413cf347481375639e9ca111e436284eb23dd1639e50ebbc7654caff7d9fbd6fe978ada3f1d6910997d3258792c52f355c4992573fd2dd01c09a8612a3dd70c4694f55405972ede7ee159af58a48a0bfe49647f5cfc45479160f3ee21f36641422e63bfa511bd5b3a87eb3617451d235dfd5849fc9b05abc61fe57f6c44c15d29ca6797ee117f7a9f584470fc82ec450dc84f1182fe72c594590e902524bcd47c90ca5a1d7dd7d1c4740f401a3231162919e1b42f45932334fc6aa521dbd12b86df4add27e2f744a3b7fe493bb7c7efdd489c22cfcaa29d89c9d2dcd7b145737e7a500a0ca187b50aec19807d17fbe59d69a9af921318fa69b48465081803e08cf54d25ceee62c2c140da14cf5d439dc638f9bd356ac72d8e3721d1d8f5c813fae4e807e03cdf8d2e411cb45ad76ec57e62e87f50a231d4ead06764c7bea2330ea386c9fc359e1803749176155e90677b7b0999746909f71765eae0b07ebb4cc3d583e5c20cb492adca73704b0b6045981db62a68a9030d157709a90adba649b2715fd012ea8561312c6a7121297afa1ddbe08ce037338d22ebb733eee5653c29c348defceffe081cdb7037268a4903c8bfbadf29f4cd0b12f36d907ab9c92591eac9e9653b8f6fa319e949d789f2f3e31aa236a3302ca2d949d41c24cfaaa819a02360ad4a3c4d12348f2d90952109b8bc93d7a8a2ad1f1e160a28078ab9b40c23657842aa2269ea5ec50284bde68376433ef6c1c9c96e0953a50cd170791b346c3f9e9fad3768ac3b8d0653106a134c7ddfbe9cec95df76bddc5cb6d9f3084ba3fdc089fa76d4c0c1e4b2c12c0e6ed08b2a417b3f4b80837930389f052497258a4e94a378b6454fa5eec18c6d809e2d69e094d688300dd502d3e1d6036acb2d2f9c23cfb974053a6fdb632f015218850b0eef3348057a2fb20061ae681af3ce33057ce589ddbcbf00b09c34ded924ec2b1189312d760c53537edeccb5da83ae0f8d74e897b3d04741c58d3916d5cb0ae0c209074716ec36becf6bfe14c01c1515be998213d618773b7a48e69ba1ba26079726c7d1dc453f5904c7bd902027f04ffb5071ed387a49faf2f19a7bb301728f3008a911fec1de93758395c4f806cfdb9d62c5901599ab6bf78e578da132e2243908b5dfe4f183d712726c78bba8a73a45341385e0470b6a5db2b91083075a8478ff07a3e201e84030b58684aedcc7031fcdbdb5ed8c149f33feee617fefcd139637ab81c47476420e1cc0d0cd9c78e3358359ebbd99a5ff6c0f94ce4fd6f769415810743fc31824d184f07561dd37cd78c8c39183fe3cdf61e204048fd3d33716aa630b9df89301867c1ebd22925aebb6b7f9387251ff9e831c2b2b23d95832c46739980bbc86226f3bb6eb6f17522ad3f1db1f7e9121a5b609a8c2853c51bd1d11fb0b2228aae318c88808da939761a5a8cbcfa70366f174095003d9b58aed5d3b7fad525f7da236aabf18c69f86fe722aa00f5c7767433418072c5640defbe21e130ed07ac1221c23a000611a40a116e8a65382b9393cb1f085db48ab57f37bdc28db018f30e837e0e76fa0b7d933deec040ef79f06b325e4ce09c25c8e5c7af8190caee91fa8d232a37322e7208f8bc064f10bed17e37c65a4672102c748bdc1f0f0ddfa7533220a1617bd47abec2fc4750aa266b7d6c04c3a436d9d9799156e194b17784275b78075877bf2c4f36fcfeee28fe7cd4e55620698dc2a61fe51575d424a0ced7599c4d8f762ff72caf5f9d4dc75d12ebed99dbff1a77e745ea5de65b9651570c3af891879ff04cdf53f553bfa4b5b344d75e3dd1014aeb15f23752efd227f39a682a3b44248d762e8094c3d3ce6ab8bb1d8d24686ff0964cfbf4abaa194e94e2a87ae96a49b5c5a2d98f72b66d44a262f34b373a2698d6aa6209bf3e9263509a7f3ca79a3d2194aed641af1ec917a9a2df94cb5800ebe8292ab22ea5e3a7aac28a5f19353b6bb9e764751fd22a9e968eabc45959aaa6a5a560fa5ab6121ac8c4f656d4f5bfd896b36a9ebc4e59538f4d58ac09e58610322b18c35b6cb44d6b3ca269accce4467a92fb4e62aedf5a53636ade5a415db7e08aedb8a9babe44e4073e92eba3657dd6bc86edc7597bdc2db6ee5f558a43715f19d68f525a2fc7a5b7f6f0b704829304724b8ff1a6c2f114e800a8f5986e9d7615785f8a695380229e6ac16b723c666a9712ec9f1f0f5986441b65491ef2fc9e1aec9dc14e5e655d91eb29cbb2e4f26cc745366bbd27c096d8e5b9cb9599d7b9067c7fa9c5705facec9c412641d35a34380df975624b5c4e5cf81bdba0f8ea4bb507dfd0d588610e6799a84edd8db01f718d00160ad25d0f077df75b7b00c9956f49446a957f7988bc69c3950741a9ba849ac51acb8c27204b2d8e87b9f4e3746196c3c02073204536b4565bcc6782977bda4f51b849d8cfe8cb4f981f414439da9ab6744292aff6317f2ded44969e7732bbf9faddc3c3a1f5af92c482f443982aaea3c7a64126d1cbcf30ee174c8fb21ec7051ceccf4e1bb1749e4d50fdba8b3eda0de31df2ed86b5435dced9a08258209d6bbcb8112cbdb40db03cdb5b1d2e89c9c9715fbea1f88ce2482619bda7ef5e354ae5cc7ceb7dc0ea064129cf8fc0ed67bbb585e6fd4efbbf1a0a8f6919363feac9166bc269480c4eb52d41e6690f629333487249003f80dedc20fee9406f74a7602dbc4d66822328d19936c06d63b16ff1e8a1edb3b96281426295080966fbda443c327b483e6c3b0d28eb4eb6844de69c9e024e77961e65dde0c9051ed6b8af321091414cf5144fdfd26cc1341f3efa77fdd72f200a2c792c79243100804012088023503459c801270041081f1cc0fef383928c7c9619901c90e57a3048e8016807a021fcb28d48d6957b5679591867c27d5ac92dd35d3e7629e7207e9d71dc008e31f562e4a20d298e6ab01b9b70ab5d6d5e57807981ec5a7d7e5387fe63d5f55b36a084d5ad6bd3bafabe53e911614447944bb4b7b5562f87588efd9f8d5cf2484fc4adf2705bdb107653ea546c3eb82d68107656241dbd0e85d1ceaf5b7b783d8a30278461d17a6c414c661beae88cc6c29b2821c176aebcf91a91066165e1302d550ce2dae085cd0b756db0bbd23386bbac6179620fe16015c4a93d6c8d565587cfdcd2233f2bf75e196fdcad1225b5356beecbbe2807d384a3991b997a14bb682ace4b21f32c5fa6122417d5f38411d56bd0b0ce753fe58b1414f91f0139128352e154021fbcc77c814ae1b6ad84bbcc0737241ad545414e09f29b16ad6b549daac5530f1d17d779f8a1f57a5688c4febaefb12f05e5da811c289b407cd7615627a1b6f44580edc86ddaefd626df7929a0ca7d4610e63d5574f2b3f02e120510fa5dc65d25aab1dde47180e80edb5609699a3c054181eff0f8c89d163e2173fef9fb823f07a4418ea1121b39ec767f6725021b07af52203f28928eb9c8b59be1b9b867195a10c223d40666d5a463d2f96cfd662b4f56980866ca0ed302f5a1fc0dcd4c88a53d8b198a44a48facc0408dcf4e1e7db8f54d4397a5e48b9438fae79887d8c8aafc4a6d2f1459c8dc0cee0306a46b178166da610753a4e2f3bd51ce5b4611f0257be81c9ab2bcd40da4ea120b360115f62558e12dc33cb68fff96098558616735072b8e99441816c65666b3297b8b90054938b9a96939c03ce881a93c41664bd35f123fdcce96b8918745d029e9d85b90d2b70b61a0730c30c33cc30c30c73440cdf99d24e43a7797b0d8067a6b42b521b1cc901c9da40c9da1e27c50c7c0e4e0d4d0d3aa8cd3198d8c3a35e8c8eb473c54bacf2702554d8da64a225969c1aa79ac65dfd6125b68f3babd25362c97111a771f0b3f824d6af8e368e1bc6689c24d6ad5089c41a921f95a10289d583e66aa89ff4e38f5825f55dcc0c2a333b6299b8294d4e196ece9146ac491a64981639e98cd83487e45a9de81867115bd44939c567be149922f689e518660ce7399f882544d88cca1fe4bc11b1788d7a0ec991e57a882d42330ae9632f5f0cb19d5ef007f94aa38558452b5a0c97be2946882da7bc601b957f433588cd3cc7e79f1b9fa42096abad99b48d0a2f108b8ce687490488c626ce26c6a3feb0e49421432f47f961fdcdf0374a6fd6a40fdb475cea6479f618cf87356ebc4cb7f2c9f23dacb9aa71e5d8f5b0c4d26a14349e87ed81d76446d54f19c7c31a7330d98b9d27847e87cdd38386cfb9d73ab7c39eab1e53649893c5bc0e6b32c9937933e6859c0e6b88113c478c41fbee392c317ae3ef319bab5b0e7be6b31b89ff33e18ec35a7339694cca57b4e1b05a68480e9b7c26f51b969461f058fdb8618b313df28619eaa8a70d5b8c0ea5daa051c50e1bb6bc1fa25e46fb2075d6b07d7010b673ee4bd251c3de2072deaf10f3799386259ce490f411fddda0618998ea185539be8f39c3fe0f72859831c33eba139331c3185d1956b1fc6b749fc427860c6ba60b59214f2af18c612d4fe7fbc0415a8c187610bd8d36c49b4609c39adb21492d64bc1218d610fdc8aa1ace3ef80bab376c1c33a35e5853187598c15dd8a264995ae4daa85cd836c5c8f0f938ffb8851d3e544912f3ca5caa854da348254d17eb72b2b0e448521af333724a6261ed94be81e4188278aeb065e831a3e9f5302b2c13e1a7ba2376eaaab08e54a6b39e0c3a845458457543c8d120537e0adb555c59950cc996c292c4ea7f92c5553c0a5b8e112c458b319c0d853d2e364e3251cc3a4fd8a2547c4aa61f133d272c122754cc0ce252dc844de26aba588d4c56266c29318a448c351f2b4b58e2c71c3f7dd7398c12b69479b4d1c5189224ecc9f2368369a80b91b0864716b941a5f01f619d2b39751c2974458cb0a698b5b1ce217a8ab089e41c3773452b9108eb04eb90422793ea86b0864ad2fbd3203d4a08dbfce97e6e641429086b8a9ff246a9ff731810768c1bc3a01977fc46fdc07bf8a8bf2244001f6c9e62dc769a682146bd58d2c7f7a28378b17405d17441f22c67d02e96ccc7f1d2e530df06e9624929633310c721daa05cf43319643568102ed6e4dd6b6171393306dd621f4f3a172b3c6eccdb6247191944b81cfd305f8b3dc7499a56f8bae4d36295f4284eea67b148b02dbbbf78a191c55e5edd3b6952d9178b35e6c33a9eae8a81c5bebfa211651ec6e56300af58a378ce2185ac8a0e1f0370c5f6f73086b51c3d883d06d08a35ac5994ef949b588f01b0623f4fad7ca59329eb318055ece99142fc9cab237ec60054f177fc29cbe949c5ea384e75238955eca0629b90d736c4c1dfcfa758a56158fe911037cfa658c2d684a90f9762ad6456296e45fe9049b14a041bdd4d1e7be3516cab217e8e17ddd0c1a2d8a178e9588818ff3514ebf55ece6b9a272415145bac4d5a89521b8b7e6247195a8651613927ea89254acd8da58dc610edc4b6bb29722f4445a59cd83235f8ce1352ce20ddc43a31c28aa3a4d718aa892da39fe8738e82a73313db6d268f3d13138b896ada90959dc27989757fd2f55476ca2169896d6b2f499af4a96aacc4227b7d2b994f420729b19d845972d4f126839358bc7ae22ad52c64a024b64d7549367d728c4762cb9d227d94081ed29058cb5326cb382615f3887dec2ca494d1f6641cb1868793942186a8f51ab15aba34d69752c43a462c196e4a8d53a614a35bc4de114ca347904b8e53c426711db1953c369f884dd25f359ac819ea88581c6664d8240fa23ec40e5387a89d7238fc18629f9e8c3fea7f4a9f5288d5e27fcc28e221c414426c9d248634162da56819c492c373ce8f6bffaa22881d487549844620f6a887a61b714e6c028835daf55f08cbcf1df9c37e55779e713a928cf8619918e3aa56a40fcbfdc4da2f8f39a48d0f7ba88ce65846152ab6873da7b88eea0cd3c7f5b0977e942d49b9b1571ef6349e1fc6d547e3141ef6cd8c9d956ad6d7bac37623d3b7c963deb2ecb06ad5651cfa6953aaeab05d08bd63e972d24f7420459c87799fc3aac9fcd4267b4426396c49336ad6e3acf671d8824ca40559ff89e1b0f5c5c865308f61e40d7b9ca9a09a8d310037ec3579ab52c899ec62c48401b461b3142a4ea8e40e6967c3d69fb1738e94217dce58c39a2e5f38bf91d8c162352c19a99d59994d988ad61306908645d3559c9786bebc8f0c000d6bf8f918ad28b762c933ec283bc27b42da29959861d1cd384c8e65d82c07dd8c3fa764586349da6c76b098a13786ad4c7f652c684cfd611a062086bd2cc4270baa37751946620061d8cac1a805bf7b10262505980300c31e628c947107db1c46f38535cc895f7fc94d068ef4c21e9a1a52777e9dc365e034e01b0ca00b7bd9afa44a6a71a5410d6060758483fde20b84c200b8b087b3cccd3721f3eaa30120a8c0175fcc60052f78410a8e30802d2c5a976945c37778f85ad8a27ee74a21268b1fbe01646173fcd9698f91a575a30703c0c20ed2570c19570cd1d00ce00a7b798af1f6a249aa5c10822b0cc00acb3fcaf166e7e249440711065085e52b47eec5f2f2fd7c0635002a2ca59227d343e498bc62840d0398c29aa9a32589c71f73ec303131002924e11b59d294d88d951f0610852dc7c4577ea88d826a50d843aca24aed9a8c265380444c3180276c7995573685030d91e3c1009cb0572c31d1eadecbc817bc400664070368c25e12b3447f2fe75c2b05483990010d98b0f856540bf6b5312e4b015231c200965038dd9b38871ea3a2012861a9fc8fcf1d3b094b92ae787f9f71a3200c0009fbedc53393130770843d36aeec6f4628f00ae4008cb0f7ca9aedfaaf448d1940120328c20ebc7af46463e41c73c3c60d0f2d390c8008aba6c74907379dd1d2c30086b0a57d686591bb62aa7c0a904e40a80120a880042cf0c517250215c000023268810664d0821660113e0c40089bc4cacf9ffc5151f1142015220113810a600081b30300610041583ba5aa49ff868f284901d22506008435b4eb3f6c9e09e97129c09103f8c15213afd2851c66bca414209d806a9008683083175880063378410a4e3003b3c4007cb05d1a3349b6610d32250548278213c06006d50701f4224fbd4c19c584c84005272042110880176bcece50f1273aca6aa40069065caa0120a84003fcf871c10b5cf0c5175f7cf1c50c24208106e4e02fd000106420045f7c21810694d5e08b2f8e0a48042d383838810c5ef02760c1f1fee20b32402504b08b35a3df9827838991f1a8812fbe3801e862b9d0285758925c1eff1f082017cb77854bf90c42dc8ac1c5a269464e72c7c491790b3ed6380ea6e9920401d862071772030fe96be5ef2008a016cbc35c9fc6331e079dd362cd8d7b626d9cc56a96b5d7173576c89c062a98810a6ca00d00410568a08219a840042738c1175ff4175f4ce00477248b452384d87f95e16c84208058ec1197d385b23b31cb096ec03218058b6d1de6983225f2383a53809433200708e015dbd775c5986c64723e196ca00427d081005cb147547faa998ccb99a3c02e70820a7cf185005ab1058b0d71ee3c7c790218b4e018c1a00512e840b1624df12ba40779538c8a29c02180552c6123ad6747649c2152c1bbe00512f8e28b1e0840153bd0e9348b8b8faa53b124fbce781ddaa7ae382a369ffc4b297ea532499f628f1bb573febcc93f35c51ed320c30f91a7cc2cc55aa296d3a54a951f92624fb5ce1db9a4c132ce2856d39c530e1d26f63e238a35e6a98f6ba63215cf50ec309987b347d135338262cf0d62eb1f68a5f4dc27b6fce339834e5c38de13fbd645db58cbcc63219dd824ad35f8071d266d38b1e54b31fc3aeec867d9c492a6111f79ca40d2324d6c1e2ff737638a31739589b5637fdc999aafcb1326163109badd687c531d27281f18810b6af0824bec2be9c9f6332547a6b1c4e6b561a3ee861c27c46740b0123b2caf10d3061507494b0152033a9081161c1260e6400094d84258e3e8401a944f9402242a2110c024fed8f88d764b015291010d602089b552eaa3de231def71f082087cf1453b0e5e6050063480c10a0410891f8c6d0c2164be0c61810020d1e5de9493aa6638c962010bf8045f182804f088ac7334644f07eddc0bfa8b2f3af0c51739c0c10b6400832fbe28ad007c42008ee8d747f51e7646614c017ef1450b5e2083ffe28b0680a0020d184732a0010c00b0090134e2c974f151a7f6d37a460c4562534f7090953b8b203ecc597414bfa1d713649da09b07a98065000200e441008a68b43c790897e6c9445029870bab1bf3f49802a40634d6a0012d50410a66f0850d1a60b0060d188406024044f2217248aa062d38010b58c0276950030db88002c5030238c450b28185470c512b49d19a8eab8f719734880b285018108021969b9fe09373a464f952882d1e5de68bb9c9218d2fbef0fee20b01106207c97226d1f218d5c28358c2c5e9a6a956fc8a3b4100825847423b621411c9d12180406c7393e22e4439ee280362b9503ad513d3e7fac9021630fd61ed4ea943422ecb30fa294022003fac9d7b52eacf7512726a05d0873d86f9a98894f93b7e3e2c9f5398e0a1e9324b17c01ede988e1ae351007a309ee8a3f2d318f7c74000795872276d3acf88134dc7c330ba1ca528c761218dfa27769d6728c9b96901dc618f6b1ad323a69bd22902b0c3924194f9066a9d165301d4619ff1cecf30c49833ea4a59e00402a003e9289667477220d141899e6f4a691a4d034f11c01c16b9e0284377f886deeaea20003924594956d3a54f1c96ebe9958a91428e9e60052d38e28000e0b09ce31819e2a5a649c7e2208037ac1b99e44f7c742fe6e62000372c9f97194f8e948ce14c01d20604d08675aec398acc8a33e90942810001bf64b13a72b7e4e692baf0401ac619fcf712d7c9e6810be1a969bbbbd58f13a4ae3328040b5410069d85266ee349e34e789b408000d7baddc6f0af1710a5969197020cfb0ad848435df60797b238375c10b24b0040198619bb2be110b1a17fdb52077288265e5be28a51d96b89f6324f34a8f9475d8c3976fd66fe59528e9b05fac4f3db2cc20a29cc3be72b971555d6606a51c168d0d2476e8126d50c6612fed28f369d2a93d120e6b729491f83af20d4b8c35f14c31e4a08e74c3e2e03cc3c969767323dbb0aa078fc9937b0df36cd8825526b19842acf86b58ab61c8c9f5e05d7935ac93e9fe74347f9a7c1a168fc97a531a71943d1ad6dca0a3d85a6eb0fb1916bd4ebfb8c973a86e862d53a2e2f13a48a29761c9d360efeb23fcd36458ee3ce507dae0c7d363582b23ca3f8cb9a3a5c5b05745f192acb1d8e8306cb33691d4ca83f6070ccb95863fb38b15fd7c61d9e04836876031e4c70b4bb86f781bfd32ee4e17f64e9e922a2d870a1d2eece0518a12ba1a1b6fb6b067e0483cd6e4de6ab4b05f9adc1b92260b4bbc06b5b5311b8d060b5b47e5a88fb721fd5758cf6c3c5fa6a49db7c2e220c3718afec954aec28ef651567cda8ac754d831861b55b44b4388a7b06af450d5dfdde857296c6a214745a69b0c6b1456552f91de4d930d85c212339939de9dc6e609fb87a0173bf54587d3095bc794b7493e468bb3097bfaf0e531a4c6492613d62b6b8c3c43a8d0c1252c292b31e8a54fe850094b3d8e213f4e191a8549d8418c91c3f4a22e3d24ac791e1ce4fe08eb64ccc7f470b7bc62842d478d6d9c933c7b11f6f120513c4c84c51c568ab1081e6008ad64fd34ec181e40089ba459899c29d367c303046147693ba65c0a692ec30300617d8c6432c6103dc7141ee007dba7bf491e1df7870b0fe08345e44bb472ce44b3d000bd584d65fe92c53432161a80179b4a9de6573259afd000bbd822cdd806a9f5fc131a40177baebe8f0dcbe8464203e462ff8ae71bbb3323121a0017cbe44e294df7358e111ae0167b5e7efd26ff8df94003d8620929c7d3cdcf31d3030d508bad73909c527235f40c34002df60e1d42fc9bbe380f34c02c1649b5103f3fbeccff0c208b2dd565d4b02f854cff0c108b2d4c878ebe0d3348ff0c008ba5547346710cf2887e0678c52afef97b27c576c4cf00aed84275c4791cad3cdf6780562c13f6244f9e8e37f71980154bca74c1d7a36cc43e03ac62db481adb93963fd46700551c54761c5f26156b84489e212e8778a162f5f5f48ddf94149d53ac9de30f55ccf2a7a65852358e5adbc1c22cc59aaf519474f0eb90626d382141fd7cc61bc5ba613eea664c8717512c95275fa7cc84623d8df141e741b1de350a4dcfebfb135bd2891779c2c2ec9ed862ce8dbf119f34dd892dfac3caef3eff9139b17ae5fdcd191975b98965d722d36daa89bd1b557ab834137ba7de4406f530f9c4c4921ee5080d9397d8d1e65579e3f598a625f6a4ab9f61e47c129295d8fbabd287889f1f25257654dd91a72738f471124bb4a93987a32496bbc98d51369e638cc452ddc9ce73847a304262f3df330926baa1c3472cabb33b8ff368c6a123960c31711e354552b0114b6ea9a3b0be340e64c4fa9d8da7231d667c8b58a51f8e493a9d7d9c22960c75331da5faf44b22d6e9c93ad568ea2905113b0a3fe7d02787d8372775601de206df0cb147cce95337d23ace0ab1864a932ce478fd2046882d72c4c8e92978ea6b105b4cf75e9ff879ba4e106bbc09de5b1a22e9ba40ec192ef47c8e2695ea00b1459c94a3593cb59fee0fd883be8e31747ed84298dee4319eef4ad787254e6de38c289291e3f8b07d48f3d19186436fdc1e96a05b5124730adf8dd3c3b23ab1b37adf71f37958553f3f0eb9f439f27858e26f7ccea7883efb1d7624a6e934e4eb64713bac97225d88771df6b812f1c366dcd9d061bf0fdf21c6bb09f31c76248f242ca797a872d8a3c5de7894f889c35633967433c662ac8b01e0b04ea30f41836daeac8b01deb0746a68787ddcb05d7f18f5141ca9e7b4618b5aa9c3a1a684ce61c37229974a668c3732670ddbee3aca1972d4b0c65379d8311fe6c849c3a21e2ae747b80bd941c37231cd4e108be9a173866d536690d6338d7d8c19b6f818c58b8d21296ccab0497e7c92b4a3996ac8b0c38ba071521bf23063d8bed3870c43d20f3e8b61bd142a592709936a0ec3521223cd768ef74906c3a6da134ecd62cec85f58627c18c31b854712f6c2ea75220e35a786ae5d58d365885bd9906247b9b083e8bb95974f77d52dec0f733fd9a55a58e6f62c4e4e398ea15958bcc37e4acc8ccd130b7b52bdd81fe97b655e61c9415338959c725c6985a53a7496a4ac0cf258856dd3a7a4f2dda061488525a37e90b7fab50f9cc28ed7ce7e23864ff9220526e7fa3fcf250a7b9474b1314ada331728ec9b2a2ec6c88939589eb07cb2d1f3106d62b038618b97cf514a0fbf5169c2621f194d6ac80d3f61c2ba31564ef51948869025ec5539475cc30e29842861b31cee34549684fd536ce429c4ef4f171276143dfa434c29e95347583cccae68cc93ce534658f73e2dcdd8a7c7a9222cb9c12e7488b086c8cfe81e25092a0d61dfdc311161b93c17c2721519a77810527682b0e6ea3cb9d2a3180008fb5d90da87de70cc510cf0837d273ae50d1dd59f37800f968d51edc670fd3bdf8b453a5ea74af31d25cf8b1d37e82ddd7e17fbc6835c5b29de64bc2eb6d0741d92ee7edc9e8bad92694d4d3dccb3e3620f8d2a35c5d4296cfa167b7cb019d94a3c9fdb166b4c698c9f34e792bb163b469e2ff8d7b458f6925ffa9cb174f52c963ed12f29c9e1e2b2d8ea72a44b1bc771138bed639c94278d782761b1f9754a382eb3b1bc62cb371739e9f34ae5b8622de90f1236e844edb4628de952eaf98e4ada61c572b1216a4ac11ee866155bd0f011216d0ac16354b187e87a5c71afd6e4546c99994a66c5d2a551b1c4a838fe7029577d8a356b2c628e9a62cf50e28ea687feaca5d82225a9da57550a2b29b694f26b9682a3d82be40ccd82e40cc114c5e2315764574fa42d43b1fc6ec81873cbec07c5eab5f6e04384eafc139bc7fd2f098d39e29ed8b662c8b9394d55de891d6dbe477be5b04ce4c43ae3512bea6e8a15dcc4728e56a653d8fa0cd4c416b93f4e0c8f6beecbc4b253d99bd3a614538789653d67797f9290c75d626b1c11b2d1e9d763892dc5543f1aa68a5a89652a3f6d8485127b646dc8fdfd7eae4c6293194f5ef39f635224b14adc2d12db44ba5c9761ee4e83c4be7da31e931265b4472c29e56b24a591d433472c9e6155da9a4e915823f68d9bcf412a9e6d8a11db5ef4ea1441c6cb5ac43e29c74fd2a65eae14b1679998635c22d6acd9cf1d7265a32062876b21679f43baeb105b4c2ae1541c5a7e9421d6a8ac0dcb9beea18558227464d266103e21d6b49b38b2671733881d654c9daf4244104b488a201925109b9c6c863b16593140acf13be6603d413d83feb0f6df4f1af34bcd0ffb56860cc22467a3fbb0869150b91e6c52ca87fd63ce0af10a3e9141f6b06ed4cdcfa539f7d7c37ac13245ccf7b0ccc396d52824c5910b130f9b778ce942ef8424de61bb0fd94d71c2d267871dc3ce537e9e91a47c1df6d11cd590d3527da7c39e43ef63447dd9670e4b4e87e425e293c27258e4f2fe388e955c751c962f4d5b9b5d19e7e1b08e75b0f35c9d41e70d5bd0188df6764332ddb05469d8f559559c9c36eca39d330e1d4dc3860d4bcaaa70c122454e9a352c0f42ae6318f71cae8625a614f1d3f9a8721a96ca9926413acfad68583b3f8e495733fe149f61cd7f8c3194ccb0ff4a8ceba49661db6a70172f25474125c36a215294060f19121dc3e59b4f316ce791c156574d4a6718b61c7f1f3356c50e130ccb36908d1c538a0ae617d6090b76154b6e1ce9852deee8873c9a39f3d885ed26868bca9f2fa6910b5b588aa5a6c88d346e61898f6166c698cc68d4c29e213a3974a81a9dcbc2927fbb39c96460e361618fa2b16183d2a0db5d61cff57592a16122745658f5cf6b6a3ca7d1942aec152748a7e467bb162a2c17ed3f54e48c689629ec1fc11c44cdd496450afb06f9f07119478c9428ec18c7a847e49c9b43a0b0d7c78fcbd9f877429eb0853fbca90f671237272c55e9c8c4738357ac097ba5887b161da323c68435fc2267effce6af25ac3d7e35f1e18694534a58e3f797df448a1a571236c92541b3ec52868584cdced3a3544f7c461d61b9471a2ff539d88c119609492199f8a3905211f68e5979238eff935400222c19e342837abc19490518c21a91a957f2869a480510c21a2de7e351af348f0a1084451aed59c868452eb20200618932f163cde6310759017eb0a7147386502331eac30ae083d5c365181757c2eb61bdd82bf87daa106a9367182fb6e8531357b38bb5a264886619ffc461bad857438c8ef1e92435178b5fea8c73bbc782b8582bc630f9601e44ef6fb18c6f7ed039d9476e8b4da38c4afc5295742db6b26836b13a2dd6bd70f923fa2cf61e33bdcb1c31a5b82c560ddb7c232187a4792c56c91df753457f1c72586c179fd347c487e0f057ec999bd2477693f7ed8ae5374d7e4c96c163ba15fbc36833576b41e766c51a2d3477d4b38ad5527d69147d1cc9a38abd4fafe2e5d8b8ab938a3ddc798ce8b56175838a1d5a05f15c9a53c8cd29f6ff08f346fb973fc6149b4d750e2b4d29b6df9830292fc4e90c29f68ca013a5672233338a3d9f97dffd77069511c51e736c9c530ae9c2e750ec28792e9fdd7a602b28b6d1fa300efc1a68fa897d1fc5d2f2ca79917a628f92bc8c9b4eac19bdef738c994a2627f64729ca49aac610929b58461b49c36a14f44a4d6c2977c93ecc317d4c263609526a07694879900a6b7fbecf13733794dc1416473f7e529e317e9c1436ad98b55597286cf35053c62907c96b81c2e69f247594e5098ba47d74494ac5589cb06dca67cfe3c87b9426ec713934cd41bcfc081336f3f0371f12113bb284d5c42fc8a64db713a284b5a2269906df7d1a49c2f219c67d64103a348284d522d4c7a9d461713bc21eb342a6a8ff616733c28e378e4fe8aa8f551561d94b561da122c2f631c492e98bbecc10b6e06b9d63c8d93349089bef5c3a4c53f905618f9e61c398a162e440d8332c63182c26657eb0a4dc27bbda7005f8608b0e224db0dc9fe3f05e6c49a364fc292529795eec0fc2274bd1ef62ffa8b78e2647ea8ceb628779436eff4283cd73b1c60e9988bd21c3e1b85863a8558ec953fedfb758c323cda5a54ddfdb165b4a711f92d58698ee5aac2bd2702d83597d9a165b48ef981c26e4b17a164bf2e8595efb39335a16abc4ddff5b9978f389c57abd1b6aeec2686f60b148088df9a6d23b6d5eb1a766249bc72f7e8e71c526993136c5f8a02ad38a3d56d207394aca9d0c2b96d44fcbd4755f9159c51a2397c23fee47cdaa58926a14590919aca9a9d86f3369d2d02086a7a8d8c342d4784ada0cd1532ca9218ead9ea6e4698aad1b650c1c74e7bfb314fb6478699e939c67242936290f63ea60225e388afdc3fed3663ebc148a62cd495279620cef980bc5961fe6a9e17793e640b145a6b8b05f9b0cbe4f2c55159235c89a8d9e2796f50c7d272a16e775622d8d9b23a9d797769c58e672fa0f4f95fa2c9b584f32fea96c5e338b2696749cd14935c35d2513fb055191fcaced1c8289ed34e7285fa39f3c7289bd74e547fb3ed5442cb14df8346be176236e9558433265839fef4c1b25d6c8d0f7a3b2496c1e93a568f840452f49ec615331a723b1e6cd1c6656171f0789757c25770a99d6f38825e3e2a3d0c6199172c4e668c3cd47b14b7f23b61033a7f3906cfc61c49a726f270fe9d3318bd87c43fd5f7ac8f1428a587387f077a133c39c88edf1ce4e32cb603c44ac0e2336c7e097fe43ecd1d2ee3b3eda106bd2c8387ffd8558e563c619d539fdf78458a54cca2b5930f5f820f60c9b21948c849fb820b6fa1c33b7ef402c6626a6eb396aa60d88f5bf7a37c5607f67ff614d9dc92eeff861eb1f87296d2ea63b7dd81aae370871f63fe7c3d6331672e48e98e17b5862ccd15c09f91b470f5bacddf9873179583fc6bf4921d835d4e0618719f668facea872e60e6bdf68a5a38c1d5671b0db7d1682fd75d8c4fc916e7c4ac57458e33b352ded517473582494583cd431bbc861098d635f4d9e8489e3b085df8cc7e15ef570583f853c5b5d4f02deb06dc6f0a1ef3c1eae27016e58746c6accd3366c1522554c63979b52362cc9ef42c5101cf6be86e572bea81c1f5447356c3babbf3164c860cb342c391eca4aa62acd48342c97ffbc81c48869e419967b8c435ab299f2cdb04fe3d9d018848a7b199614fa3ec2230d9526c312cb53d86c90a7f118d69427985da4effc500cfbe374e1c0c6306c310eff41ff8a640886d52a46f6d2489d7f5fd82a8788c7f07961df7fa40d2435d2c97561cd116b9341b0abeab8b04c861039aa689d745bd8428c53a59aa7139d16d69cb4535e79941a5eb2b0987587897c699259b0b0cded57e574778e2a57d8b75286abdeffa151acb0e85c2c91d09c419a5461db181f7a5c49717aa3c27a553a0e3f3b3ec6a6b0c346d56bb9e3926952d8336cf0e80c53215a14f68f2b963933286c152472d464d3185e4fd8642f1baca5adfa941336b38e4b0e2724c36ac2daf962caa62657860e13569b8cec71ce384bd8834d4673e14376398e12f68ec1a2738a8fb98c938445347fc8fa8d1d691c24ac3948a3f4bf5196fe23ec573931648cb006eb890b7ea1925c84fdfa72266df86b2411b69c14ff3caee749fd103647d2113a8e3d880861abda10626810c7360fc20e42f7e2e945a4301076701725466524f9075be8b2b86563a56a027cb0e977ec27b3175bca36acab20f228bcd8cea1459094437d48ef62cd50ffcf3e86cf5c176b46bd13315613e6938b35e6fde478630c0270b1f7058b717261ee340601b758333c5677ffc6f76c10608bf5539dd5c5ca0c693608a8c562e6f872d829a98d1a04d0622bc98ca472caa416350898c5fe284a92493988a7d32040163bd24a36d7f5bb631a04c46259b9ed902f67f8381a04c062cfbd39fe0f1e4f070d025eb169c6b418334c0d0d1a04b862f5aa3acdccc1a28a0601add873e51c765ee36741830056e02ab6ed4fdb89b6b153a88a2523ed8fcc490c13a662bba4a11672752a84a8d85325af70217c8639778aad4ea25d14cd781b678a65fed346d7c38f9d528a35df74461b24c57abe7e3137c235b08c62753c3ee9a0833caa88628d8fe8bd66790f2aa1583d5facc81831851c147b9ed86790f2a3ce914fec304423a6945ae6114facfa39a68c986972229dd862c44e62414eeca1247fb80ce3f9b6891d7c48c655f9e24fa6894d3d62775ecb2020135b9a0d2122afa6902a83004cecb0638c6f1096224d06019758344cc348da3d412683004bac1e42f36aca5f48641050896d2eb54108b9db9d67045062c957e14ca53652c8330226b147369cb54c8b1b7746802496107efa9572b4893b2320128b3906c971e4f91d9d110089a52b4552d1eefd8733021eb16ec530ab3829723523c0118ba3eef20c32eb41cd0868c496d7f0c3f787cab8c30860c49e7e3547277684d061042c62fffe4de13ba4b2c6610428628d10a29ea60a9d77c30848c45ea92532952a348c61042062ab9d8937793ec41eac3e86b41636e7d2108be787c1329eb3756421d6349dbe4c0fec3292107bcc8dc1c42829a43c0e624db2195ee9f632060a62495149bb3a77977d81d833f4d5c8bdca487380d82786fa5cf49d95ef0f8bd4a798133af6c33e7ebf9b6ab55174dc87355d0a97b116eaeac27cd84a77231b69dc510bef61cd8f17a237e55994b01e9654719f81fc9d0609e76131d9d128167b22698c87c57f36c5fe0ddf614b6d28d763c132566c873de30c613a83c65989ebb0ad676e6dfc475dc474d8633a8c3c8dcbbf229ec3fe0dd6a2efe6cb99c17258d74b929976ee9cfe382c6a214daa89e971fc70d83190ad949ffa33f76fd8614f9c0a1bfb47bd1bf68dd570b8350e1fdf86d533655c88e99da8b361b5bb1424cea478d2d7b0fe8fed4d06d1b472352ce7952627389c90ef346c37a22935ac4f876934ec384a085f6b9f610f4f369a311edd489b61599b8e9a06b162a4cbb0a66f24912984b9f421c33ea5f1d369120f9d3386bde1d5e7e0f5317e470c3bdebcc17249d4b29c306cc9b4b7628c796e3a60586c7b4663a30a9d9b2fec639ef141f2c46f8c17f6fb9052f31722a6e9c29297d7c2240d17161149fd061f3982660bcbe37c23211de798d7c2ea2043cfefa7d6998535580433cbd0d11d63618d07dd0db3d366085f6175a431691afa64bc15f6f0f3cee89178c655d8523b5397578425a9b0a570303d177219a753d827695d5acd358da152d84e267583980acfc9286cbe27130df2dd940985a5a363d870e2c1fa4f5853fe6e18e7622ac5094bc615b66c62bcb99ab0e7bc71123b3eaf854cd81f6aafd985c463e012b6d81958dac6617c56c29e6763a4a40a936a1296da8d106cf304d50e09fbcf47ce0c3a696a77843d3a2611abfda9bb18610f9e8ece3c869037a5085b478dcc2854a3be89b05e7db0879a216ca149fd63c2d344084b2609a9414c140141585369eec78c8e1e6d8a0020ec7571c23dbe157b9822e0074b0cd17278908b939722c0074b9c0c6737e6f89b4b7bb1e793fc1a3147122ce5c59644d276ca8cc32fa5bb58fd32fac38e9ebb94ea62879d95aee266b491d25cec681b36ea903375558a8bd53224c9a39026c7496fb14daeaada8b41ac24b5c57692a2470a61e51d692db6e0259d620a2dd68a9c3b553d73229ac5a6d950f39a748853164b4a580dc9c17a74b1583bd4e348a647190416cbe5d0fb8d9026a2572c9173870eb2a9a363a82b56f56d5816ed2b3fad582dfd3347c76144c38a2d3590600e339838af62bf479f3ac67c14a3aa584dcf52fe362da33e15abac47d20e155d1f156bc6999feedc5f939f6247912b888e83fbdd14dba4f48d9592c55e4ab1996774ab274153a449b1c85579ccc051ce28d6cac72944fc47c78b6271bc31cca788cb3a149bf87e1adf609d37a0d86265187b327f7ff07c6215cd1d428e3903df3db15da8e8a8e1af52d3894d33c5ed3bbdc87362d9fcfbdbcae570dec4e2311cc64d58136b38fbcb98e24cac1a29ac3c8c7a31c498d86e3632304fdbf85f62c731fea82a5dc8b425f6106a113cac95d8e2a1a3fb603aba2a2596aa4c3a3997779c3a892d63648eb75249ac1d0d3a263c8cfc64247614e37f2383461f4a48ec386c8c55585864e423968899ccc4d2855ad011ab6a6c5247daf953d888a583c424e1e2869e8f11cb49c598173534cab788c566d242c88f9192a2881d4a3f8a658dd2c44a22b66839dc5c9d23ed10446c33a296953f67ace410abc5c994fe7edc0931c45629ba3f6c3d720629c43651725ad3102c8c46881d6c238d8d298b101bc41252fe0d622688fd524e8b1325ee622a104b9aeba4931693e70a10fb5f0c1957e93e5fea0ffb790ea9738e29cea4fcb0e35cc7e0427cdc91eac372c1aa538a92f3c38a0ffbdf8cac075ddba9f6b0456af74549f7fa7ad8f268cc1da765dfe761cd8898d961e2828d87753b26bf10520e5d535f7c91031cbc40063020051fba2b22e9a330a87d087b8d3be79c02a42c35608028ce584962948d2cc180500c3edecc848d7ae8b917740d66008a2b87ee3508b9a36ed04d2518f0893d6410c9f131ccb971ba011258c179010b4c392a403630c01386468c0a95f135a70089ab5427b6289ee1536da4b12c8f6e3080133bd4de9ad0de35c76f622fc9276621e635b174cc98ce2a5349cf9f893d542445ce3f122c754c6c12f173c6fe87a7a55f62cdabb8769b32d884e4175fe4e0300a9c056706065862c99493058f465519ed4aec29664788b05262f18723591f34e770ea2496b821621dd5c350f9b3810648a0011668000832d0807fc10b64d081fde28b5161608024b6f1e4e172f4ec1ccc482c194d6d787022f94212125b0cb15284952099927bc4f2506f7e3b6d63521cb167a389ce19cb918cd28845bb91c54736e8b40281018cc0d2724ed2a929fb45d013c51aa314e3fe5728c100452c7f39f151783c114b6f0812f20711a1e5c9a603334d19b1815a810187d861a569e4b039f27ac3107becc58834152cc4162f8a69d2cf51451ac70042549a163c1c96aa4ac392aad8f0d1c42fbe301bdce0052ca0000b5e20031adce0052cf8137cf1c50c06c980063038030306b14cee48085b1ed2a78c20f6cf20c2573ef0020c08c4b27d96b11e65a4e23f2096fe1c19563e773eadffb04e1e099ebb197acaab1f36dbf81b457d3b649cec8337ab331ac207f9b0564510b5aacb1ed6fa2412e2e35039d2d2c31e2a21764e6db082bc4c30200f5bc7a3947634373cf0f1b079a7550cc79ffcd47387f543d08cfb2192f88a76d8a154ad84e8d46153b1104f3965255f0b1d96e8e1a26333d4851099c39e42a5103a8347eb302487b5b3f63467a493373658c1099e9d1006ca6df08216b80c02b00806c4614d7db153ce8b2b417a38ace1e2a8a58df2fcf11b56af92aeaad5f01919376c16f115961f2a91ba362c1d56216eca071d1a362c9542a786c34c21679435acfd1d723288b13b9e6a582354e4507b0c62592a0d5b55de4c9b51ec143d346ca93ff776880d069c610fbe0e33ccab1945de66581ae6b8884be1326c3f251d356884c93821c326317df824493386a5d3518c64d207d571312c7221367818be6726188625cf2f86c7d7556b12306c399b517cd8f9ab37f68575cc733c5d9d8988a3a0fd04a55ec0002f6cd29f525e3dd48cb1eec2e69f2f96c77fb8b0679cf1c5e48a5bd84c73a8a4fef33952580beb6e9cd839f37824a5b2b084a9609dd4c3f5e958d861e578eab0618e88fd0acb5a83f3ac8612663556d8733c8f9529dae96aacc28e33f2469b3a519e53a8b049ec5b9328d914360fa9a123c246fe8fa4b0e68f132ac737a6953c0a3b941839e55c53c9e486c29e71774e94e0c12c6d9eb0438f747651b9714a1a27ac8f335ade6cda1c7d6ec29639b3d63c34c648cc84fd51beed34fb12b6f3901a39563eca884a582f895e1efdec0f414cc2ea784526570849c91024ace6e8ff936d478bff083bf29433c29651ea8a391bc6a9ca8ab0a494ce435c9988b0d6780cc93078c64f430b0c18c2961c878cbc329bbaa367801096863e9d19685d97045380748217749a8001415853ba0ef5934d79ee62013b0d66708215b0a006a650034050017506006199389351c99d749df68213b40bf8043850c193e140056f4660c00fd6865f9b6423c787f19480013ed83aabef2755d4082ca0178bdd56e6b4b5514b262ff648ebc9acc67ac00276b1c56b94f247886c65ad8b258349a4544f2ef6d0f917c3e254b0a8e162492179cc1985908b1e556001b758efc666462587d398638bcd36d471e80a7256995a6cdec87f2587ae57ccb4d852d41852c4b88f378db3d826f4e3cac921b2f061ca185cf2a862b18e4885518b11156bc062cd307543ed1dafc9bf620fb1463133e9247457ac9aa162eb719a48b562c7284b34d267c5b6fa20ab51ee57b1eec6d4f9e9af6f26af8a7d2c432a55d2c7449f8ad5710a3953c8c132d0a062fd8c9318c38887709e62bd8d7dd55fde2972a6d8afc66f3346c11ea74ab184e81d2d7d4a1a797252ac63613b2ae741c8201fc512d2b471d08e8aea70512c8d314a379bf31a7542b1831c12777552c48f01c516e7419888b93a7ce6137b089d1a7846a3fab83db1ee7a4aee4ea54ec9eec49a6ab55a9ad19c58d34e838a71f3b1f926f6e8a4f922e69021e49ad89255da1c4b9f4cace12b1b42d3a9da7c30b185b8e9402642cca19e4bac39cde77a4a9777ca6389d5e2cdfcae3690184f25f67b8c53fdc32e42c8a1c46a9d3ba2846768d0ce24968cf2a1ee85b4131947124b87b3befa3512ebc7acd087a3bf7a1a486c23b6f941a8e7cc691eb144867142c8d0631e348e586358e5c8786d5545d388352be5f1af8f4bf51946eca91cf5c9ad69348959c462bd791a5db2fcb519452c1b42678c31431cb94c22f6d99ff290ec2f6f6410b164dc21776da734fff321d6141189fecfb9616743ecb93f84dd789d21d85c88e5637ea409a163ec1826c412d61a77d8a83b27f32036f5fdc77396313c0a0ba2dfcd09d98c02b1e4ed78a6464d9b3218103b8c1f25b19a1d43fe0fab989d596abc312eea8735d234794a9791c4601fd61096317f9c5cf20b1f369d479f510ce31885ec61cd912b6f55a63adcf4b0e32edb48972a99459a873dfa63ae899ac4c3daa9db41269877582f98a752cf0cef636987c5e3264f889972caa0acc36a129d528a5d51fa917458aaa3322ea9de0c8f9cc3faf14fc28ef9c56fa41c56598b6173a9443646c661f1caf20cce3f49fc7058235e4ecf558ecdf31bb69c688c43d0ca0d6374c31afb31665d8c6d58b522e7c84f47cd28b261ffae8f111b993698b8862de55cc123e78a9e4354c3b6711cac6314732fc4342c513786850e317ac6100d3bb899ceb0616908f79d614ddbcbd1da9861f34a3ab31339070b9661abd199fe58d954c9b0aea7fbf10cc28c848c61b18d2985ee880f347462d83a78a74dc16185608761db1c1e2f246798a201c39e55d9957323e9b47e61cb6d9c42aa114f152face319c5be399fa9b00b7b6670db995247370817b620961cc310362bbf85f57c2b529c6c0ab969610b87f1738ce91f94a36461cbb0c2ab2ac7c2e2504289a79a5c61739031c5baad3011132b2c6397a9b9815eec935461f3cd0f73c58b134b112aec1f29cf399ec820293285754383f24871292c57579a318ada5c3916852df587dabf9853ff4161554719a406a75ad5d913f6cae82eef4a99728a396153ad1091d17b9f2cd684bd74d2ef4f3ccbac1813961897966298303952b684256ddc458e99d31851095b658f974ce6fe18b224ac3a9a43f3ce279f4f216129af981b4f887ba953475862af51f2588db0a4d4491d4fdd74328bb04c6574dea0b7953c222c39833cb1267698346a084b4986aa8cc4d24385b05ece5588b17288a10761956435191dfb2406088bc3ef8e10f3027eb07fc44b172e3726575a800ff609f12b43cd18a741eac5162e578e8d8e176b8455a44a29a33146bb58b667b673578c8717e9626d903153dadc39e48372b1c7fe5ad9d24a393d2e96d02955461727a718bfc57639323e79d816db83a8ca0b9ee4d4aec5fe7967531153f68669b174038b9fb38e59ecab531d2d2bc3efa464b1c7931cf43f6c4c97c6624f2933e7c2cba19ab0d88223077eb6115fda2bd6b90c99428af9cee38a65437e9e8afdcbab060514d08a654f82ece8c78cc28afd57cfcb4462cecc2ab6d4db4c9fe1f9a12ad6cb0d639a8c8cfca56275f42856ea94f9208f8ad56c4b3ca310f9f3a7588265fc508029b6b18f52a79f772f7f0594624d57e93ff4a4d8c189995c84d08c1fc5161d234fd20d3bf616c516df20a70b6b659f0ec5e6402aa5b541b1c40ab153c96124d59f58ab524233c3d3d8f1c47e62630fa26f56ec7462d14bd1f1aac3891dc93e9288390f4267135b556edc79617b8da38945cebf32e464681b93894d2e8a6dcc6062eb114b562133e83c5f629df49724a36169862db18590f970c26eaccc95d8c6d34c28931109332556e90f318834a84e79127bf0d88f345912eb848994e33fe72b1a892d7f424f7f9c4c93426293cb78225b93e2ff88352ee6bbeb066bbd2316efd871f36ee6f13462df68305d97996b4e46ec212957a8f88669cd456c12b7acd7438e144c45ece3ffe9367c7ca06522368fdde32936d1572262bbad0fe1391e62318bcd2417a71982865865ea3c5636873fb0107bb89436a4e3c7103e422c5e29a32e62480e6f104b741073609d20b6e894721d5231fe2510cb7c895ce548789402883d640ca13e8e61dfe40feb97a61d8dab541be2876d3f68bad59edcabf5610f9d6f572f6fa9687c58b261fa6853f1ca537bd851ea84f9cb5db1293d6c537163fca6ca48531ef607e6f197f1370c131e569fffb03ad1de08dd61498dc39874ce4e8becb0cc89580e9a3aace92f35e67b10364c87f5ec3456acb408ea1c96ce206bf23e7ea48c97c3e295293632c6c761c76053e47812e539705855b732cef037eca84cd362c78f5fde0d5b4c12d30bb52ceddbb089879e1ed9d9b067d45da1d2a7f2c5d7b0c764cc2887ab61b3198df2d210279e86258c6d7a2831888a8d8625e6d4995e8d736a7d8625a74e17d52c52ef6658c673a49189cf9f2cc3a62a7fb1de6062900c6b5654cd9f6b509631ec6953e58b8f19e2e388618bacf447923bac71c2b05ac72ed5950fe161c0b0a4a36b9c7e5b8ff38535624af5cebc2b652fac172fe35f489b1ac85dd831fefd89b39d32e6c21a1a9b1a6d887142ddc25ae19255f4540b9b679e8cc3b47fc2ccc216f35a92f0d115800562ee4f7c8ee215f6607edd5172d4f9adb06577ca59fe391c5f8535e3482a058913a8e4676302a24121012101c1c0a00060e0c035be06f3170000000c16899220088228cee50c1400023e221c2a20180e140e0c080e0e0a080a0608060000000a06060000040804080004040806f01562da5d0cdf66343863d8eef11f4f71b5f8414842f52b2b35343e7fe5d872894b66272deeb3de72bc2fa29609d7d290004e4508f2008f649acaad66ad466683146485aee5d62e4dbfbd46df52a495f63216d757c131b0dec64ebfc4bf5af92d463ddb0d80bc67cec4abe651703ebec147a05cf01be1f0746fa657faa40ceaf680cf47c79678827241847826bb812feaf1c41e9632d6b710f8f047cdd98ed545d31fe58418d92a85283c9ba8159842a4980f122e7132319bf7a0dd88c72a167b8bb722877e9061e0db275942d82045749f3a19200f0c0e9fd020458e15500743c82b74a922ba143a3eb0170c02ec898f4044aa3835f658dffaa2c2c631df85cf5de0409916ddc49ddaac7fcdd43484ec21da8ea190a11913a7046f3fa50fcd7e831807a66f2b1006b09fb831062995772f09a0022cb8bee411de8583b997fe89f6f6fc075e931d38d38bdf934e9a1e2f4e1d1c12348dfac7eacddd5f9eeb781713f238778311c8a13aac9e5247bb591cb06b84c8d6d4469b7914775aa9e942583be115ee5102620cf184221f5b2b0c2108552a62eb5ede7caf3e67a280b0c9e247c3527adb64a4e334d9cc0231552229d7c597f66fdccd010b04d4b1d69c4e1015db36b66370079bd118231109bf34d45520debc4c41fa5aaa83f92e52458da5f7b2f363f07b7627f5ed7271172552ba2aa5b72969da95c41879da4b54242a0553e252863aa3d46e4c490cd9b35148cd546b3f207febe62b15e6e43983a35407aee9582c03fdf174c7c3561ecf517bb741c1033d56c3e3269e49c343e568e60b2c820fee593808ffe7f3b1e7012b8c853f7dcf92b8e5f20fcc4a2a175bfe9979d97271987f9667699afb21af2076254fc61736adf30e55ceaa83a65aec26dcf1f50609d1a465465df537b4f13532dfb5d2872a0de77b4177b2d2cc7b09696894c6ab4b2c177215208606f2593cbaad2a6216a5348965ac28de61ca4ccf60d13493cdcaa16fa89853b3b2b10c853063212d0bd0b3d0a5052b5960f758186de97061e81083db16d0b110cd85e92286217d90f2cf177658080373ffc208dae2c0a5b6b130e21b36f23a2a0d20da517fd8b110e65d9865939c3b22fb2a27641b74054a07708a8de7995ab6a542c24d1b2bf2c852fd8e8d5079708a37e9caaf74f3c2cce61a2caec2499f4077ace5e48780cd291009c774bd5a9c5372adf4ae0cacd35bfbe55a4c5f6bbcd0bb901ce1f0e72eb62788969a988f2e756f7c9b378cba2290a9a875c8f2358f3b48c43ea597b0cd6785add5b4c9161155e85f68b1a1c4804926b3e23a9bc84885ae3984074632d9497379907f741b8ad0ccc842b8433f46259253e52ec1c44ed86e6dd78c1b97bbd9ac0727412f81f34225f2368fba64b0aea6408b8416077efc985172927fae1a480b2a6438f162c30f336e4cfcf8b163c74c4809e88c33866ba7b7b69bbb9d3a4e32d5efe46a0ece6e8d7f7b96c6850d255e7cf8ac5d3aad14a00bcba8287ccc88b1e081311903f8d1e6d0b5464b7dde6e43afbbafe9a043486648792799abc211ead55980140f2d6610df028d65b5adcca71a0f0e5cd8f060c2862b9f02e83c3b7d6d831eada11c30f321552f5d864b6fe636c02fc2d1871b95bd696dbd907b37bbb5176dee273734b510d3fb3b9d61a6467c04c313ee101a72e8d1f019b63954c63f5b05750e8c9cad5ce1069ec2e69ec4f7e172b85ff2c49af2b68f8dea8caa47a7dbe55a2d5067713dba1f5cdf368338186c513f1f9bf1317977b7bbcbe9cc32979516ba5e9f5e6ccdf375b400f7d5e9e87e7175bfbfdddc2fbcec235bb40b88c811738a1c6e3d1f42ef46c5ec48e6f967248bc071f51bbc3c6e8e8ac8fe37b3dc89151b1393fd7263cdbfb166525f044af57c3d704dc14abc941005879935a65884cc5bc122132239efd06010879ed8886ee7e7dbbbebedf5f262b256348baacef6f96bd4ab1c43950a3e48a4d9f2df3616c21838b1fbf9cdf5ea72797d79bfbcb95f5e2e2f57b7bb8bfbddf5e2727de5727bbdbf5f5faeae2e3797f3dc778602af7f76da0a5a42d86e4241a49b1125895e05c58db719591f0ec0eb410fceb76c879d9ede9e4fef556686b6c919e8c68a8673492c25ada3e4707967f41c812c6d2b020a3e4b6d3e54d90c5571341db986cca09fedd072f7771b0c363647f1b08ab7a9e0b3a7172bef5a41f95c5c0f2ed7d7cbbbfbedf5f252c2cc0415b0f3eba393b64999f1a64b72043d8ac49abc095256d5ba211e5eca2a67c5598dab5360d0fd4cf1e41a32bfa6244ea01d63decc9133274e4f9e3d67c2a4092690b2184aeabd87c6ca7cbc38bedf5d7cb7e3e6bb3b9b713cb6cd5c5f680c7b4ca83fa1511278a7e43097bd1b316ac69c49d326ce9d3d79f2e4f4e9a7cf9fe46cebc54e4eef67b7bb9bfb0da9d1b3906e8b12a4458c4a9a94a5698edf2e9f20399a2469d26aefb797dbcbebddfd867e10c7540478ef07e7f7abfbcdedfe763479653aad3dae0da8f9177b58bcecededc21a8395b9b361e56faeaf36a58c04db10073d59f5557295e48f3d6bdac859f46852a449919e32055ce57c57114994b28dc6c483a1c0c662652d32d63819c3ce8d8fcbb0c3f6bc4e95caaea21416f23e6c1aadd17753042ab1a7b5f08c8ea7aecdb1d6c2ccc3e1dce5ee7277bfb8be5e5d6f6e371d77b54706ac5e9caf8f9ccf4e8648c4646af495eafc3750a348941e3d4a7c7588ccf34f0f61aaf2cbfdf5f2ea767bbfbfdfdfeeae6e5797dbe30524c73bc7ddacf1a957f7dbfbad2df7f67e75bfbaa81cd61f41de3d6b668e8ac4e9571946c55c4eb3a807a696abd6c4913387078f1e3260d01043460d1b3976f0e0c183c3c78f1f3ecab0b26f1ff053a6f89da7893b4265c8fb53c37cade26100e7d055e839cb1a2ad971ac6cb9452006760572e99e99b5df53dfc7bbf32d7d10a9e9c2c40fefe7b7fbfbe5dde5226382ee4f7aa95ecf0f772d50a243a1481014587e4aa7478714b5eefa72633433ae1a74321a2e72c83cacc4a14e01e159e2f3d9edf1e6a8e894f29eaf0f17d7ebb7bbbbcbd5e5ea7a09304121f79a3fd7b7c78bebc5e596723b98fe49070f77c78bfbfbc56966587605aece4fb7b7ecfb287f58e06fad22caa42239e925660827bdf41dbd18928fece27c7a77b9dd58f941fb585a77f6685caccce5f5fa7a6dc3392596bc9ba560af973fc78210a59dbddf98e1e371b3ae97d7cb8b25ae3eb1dbbfbcccc77bf3765c93b15382b10a75f7767cbbb8deb2465fd190658e884fb7357eeb3654d94352e55005381ef9b97e48393ad6e1c7a367be0e1f977761c7ccd8e2b0f2ac72ac78f8dce853a6c007439458c04bba9beba56b9ce89882a70d9569fee6f2fce67e75b9bc5e5e2f6fee97b7dbcbd5e5eacaf5ee7a73b3ceb8a04e9d7efd4933e6d02289bef0d1861f4b0c3f61868c40854026d6106c3b3430538b0ecf3717d7bb9baeb53a602f26cede0f6e6e18db3138269ce27677bebb5fde8c27a8b0d8b4947e7b6e83cfb95c261bf6e87e25829d914ca9186da06047afd5aacd51cff9dd9a3112674937638fc5c058b626db8249938a242469cc3d056e7b835d577df873d892cd9b9ea3927b0b4bea36888e2869faebcdc9fdee7e73bbbe14d98e883b2de3bdd3f9fde272d3dc0ed5de6d7988741b1c2e3ec79a8257b02fb1729cf00fb21547c027dbe6ec0baf97b3439c0e063ecb829bb7043c0dc56da84d07038b95b94ca7e4ce0d5d4edcbe0fd9a5ac2afbc4091299219f17692d79e1fe56641f4581c5185c7c267a55c49459c3068e35bcf7fe83677787b4798e0d8e38737f3dba5cde2fef9717d75b15237337d9b4bd3c385ddf5c2cf1f8f8fcdbdd95050b8795bdb977db621f3cf7cd5e1dae61968c861d0b5f9d4df2ef57f78b4b7c667224aa05e518a360c450016934dacfc0376c3738126cb74dec6519d5f1589bb5a298e00d5a1f8960842a3906fcad01d20b902dc857b61a7fbb653a5d59578a35a21630c6722158a4ef7b95af079ede23431edeb6b1d044c3ad412303fe3e3b06506fc21a6c42643234c51a8d0c72855298ff57ea2c1df1ce4ecf02cadb819c5c8c4636e13f505c5e170144ce10b2af763614262bf38f90e80d5c449b2489dcdc1c65aaf8c84ad022c09f15aa555c9574b8a05752c6875e77a63bc4808b45ca76b4d41bdae83de958b37f6fdb6cc7074f567abafd04e09b7751ac69270138ecb86df464de3e9a4af8e37380ef72bdcb82ae2ef5b9a1d8dc266b9c86506b59bd48311579f3af2b3b7cac43c7b408b64c6e35132b7310e27e77f9588fa83063ba45facef422a4e19c1c0462ec0a94e6c48ce50b32b16d00297cdc86359c4a42baf3049bdf1d8d7c00444a216953fab7ad4b6b3c23b18fe686778dca4adf090f4544003388ebf9b67e3eb1d69a3ee9466f441ad764c5c9ebeca4c45f34c11cfb1a25a046c30cb938ac0cd656009f89bc32771c6c4445446f1e68f856e1adf5e7e0543100fff713a7f4e906a4fc6495fb438ed7b51327bebc4e950ecb1712de616fadbefc5d8cc418da298422c2079b1bc4f817b25aa7e053426f602d2607f40103a310a67fd841fa2697355206e61e0f1be00d9d3033a4750393ec038ae59b0a47c6452bf5a034ec88157568b9b4873d15c1c4dfdb63762e0f9b52423707e6ace1020154a24e8ea71b6497308595bc4784ea2f0fd8f610f3ba0eb1c39234f19b4882e36f5e8fe30916f4525e4c2a4e163592b2df72a5e41ca04b76e76d84b2922a8a94911513ec23ca7a6c1bee4844905d9335843b9b66be51f986d949ecc5d13358f2801d14d535ef05405e94715d2d4eb7bcc2f26b15da690f73ba446c2efc5fda814748a84639dca9fb86fda582e1cec015ced35a21337f46a1591d1ebab5aaa1ea6f61decc8a6bcff9d9347c14cbc079a35cb3c9886e7515c6b8461c3e7881558c393d4cb747bd929be91c55fed9210b4b3f0a61af77c36a48c4b6f8da1a605330b32726854f80e236e2e46034dde887cb4528fe27c1a127d525f0a5387fb44d0071e17ebe9cffe1845df5cb45a3f227dffe948b82255d911e8bfd584f440175fc7cb5d77c91871568ab140214cf1bf9d7645950c94a768076d8a8c21bb966f8cdf85f2d6152720ff1f44cf689a6085a1271c468d49122cf48cb3297b11f49edf563aafa8c67034df8fb8629e4ccd03b586310e1098c9c6a01ae58d5e489dd2651ce68bea16aa82632d5a67a8c2a8b3c351d251533c5baf4732fa3f5e849d039ce5abb201c54f6d97ff8a84c26c6f231bbfc659f6a577262b73892997fd57be912d3977b9c64c9e509fdd784c20a7da2ff820d35f1df5c4ae69b8570b208f2e6938f739528df2494f3e7176ff21a1d905aa712325d0ef63aafeac9250a75c92578dd25f7c71cc3563deb9fd16cac3d82ffc5b1f29e2dd6306d2a9e6bcc498ac3955788318aee4cc153b1a9bacfca1db89b4444ab2f8702c4711454e327cd57e698ac467e92804d2bf58e87bff99da84940d064e3e1c45d68e939cf15c9bbc249ad97621f65c2617e1fa14bdaf652fd00da2e55f296c9afb6de1bcbb87e200dc19ce88c8a3a7fdcbf1adf896eacc9ff2a40eb70916dbb49bcb39af1f7fba449bf960db42033e58807cd0ac1651138b13b36a55c5249e473baa2f842e30b9798d3b2160c07891cb25079a149ca353ac5a803d71bbe86a319ec994e1f725a025138f0cdda971659d51ce8d81bee1c2dbeaed0535b426db832d157076fb921f88a29c6be3964302715b75d021e8e0c161b197127ab53d947c4f0360e942f2c210cbdc9cdf9b375b00fdae809ea5c2791848c59fdf94d8e83b6cdea85efd4cb357a51d42b628670a283e8e154b5798bb3e56e863ed4a350160942fe7e411ce1fa340389b18b06c61f9e76f68465f24367ac20e221d350d5e00426003aa5080fa86c12328d2b7b7087e5da4f995452cd3472587ee8111a260f6e6500d2b8a92098976bd52d230a8245e2534de97e97715186cff8fdb5a0100ff7bef95f2502a8a9d2bfe2221d517cb25e67ded6c67e5a85ff2cb92fc1b5c8c3a40b23ddfd1095cf8a9d7a4d7692a1607256537c292b70c7a91c84397be2439315596a95485fc0b35830ede8c7cff7f6029379709f6a58267c06937bf17bebbdf2bdc72f1918ffad85e5804fbda4dec4eb1da28a88676ba6efc24a6c02353c2bf8dd85fb43dd58f554b80847994520f0cae115fc08e1ebc50f6bd0ec53fed8b2e9ab0a8896df99af75047e0eec21f68a21bdafe5de451ffd484ca4b07c0ca87141e62c257910f852725d275f7fb556edced00d1f29c36c53867d3acfbb906fc8d146c5da1975a09d7a86f7494cb06b47653670c89d09eb28065c8404363001b1ad1fef047c69af5f4a430101b4c880cd4d732006748b5971545c5fe5c8e7c9ea9752fc4c802be37314d9d10adfcd799168a04cb08eb7c1f0d7eb13b1642ffbe4532142defd5f21ec06cb6f0d5961f802465b45c317dc27934822b573d7fc88bdb9487be7ecad700a3ea45f180d5471ca36ca252603823b2e5048f0048d7a0381d09b726caf2da643768ff3a87ccf72087d22ab7bb7ef6d3e8784d82739eceea5f115928138f05f03bd238d49498b1374ad7b0eb4ddf40173fe4b58067f40f7452887274ffe13bcf19fd10b8d61ef9eaf33950332125dcec9af1b6d4a68fd0bb9b97a3189ed011de827d3ae86b06a213250c9abb15364a2329361da3f0d101c756dc9d3ae48dfd2bcd02eda00b859fceed8a420bf654d573b195ef784a2aff8a7b74cdcb5d21089a2cf310e057a4e9c809222f7eaa8768db020c8c5e41c446c14e44bf410fec3fe7fe218ed421ccebc3699af8c1ee5e58fa3288473ed3cbd078262ae1cc82e8037fce92744e28be2c56dba205937a2e06bb881e89943a4dff4a57f7d470c79b1b8bd1717707deec77a0276724041a29c18729bd5583d9cf996ecec4c34925ca572093c1979e9cbb813c765f49675464156c26df280d187a2f2388c44eb929ca5e3276e16d9b6a9e8056f78007935f2d8d84d31a8cf1d1842cf321d777f79fee3521a21ee3d7e5272022df952655f12de84ae30a1370507a64fb936cb97bf7f7025d0f28ea7336b333cc0bb6249744d554462b8fa688d8eccda7bf59b43af0138cf5f6a0cd18b9d48bae5ad4391f3513868f9476129e05d15f021eaf42086cbcb021b2016337c045aad4f994d01b035582600c053ca209c006f23e8eba981ab6eea4f105685a644eb9fbcba4287e256659deeabeab590a47bb64cb20a5b84637f134c6e8f0dc41dae38e9ef10f32065aea6523c6e7e0176823502b86cc01212dd3415121d360b77429e3a68eead708138574bfac63bf3f9c73304dcc0f206dc9902aafe07a83b60b0a6d00130333333333333333333d354fa6f6cadd9f70b593225393fa0cb5f241d5ab49429a59452929ececce1ccc4a7cbdf12420d3e57e68807680a8d0a7f0abc57893e9931e3b5e82dead47052ed50d9a9a7f2e8d0f4c0230da7b5e86afd334289a59a41c359945cba352194e30c67d3769fa33ae5bfebf7a28187194e52932a8b99d2e7ba2b7894e1b4b1243179bab77b7d0a786046093cc8701eef93f27a7c236c395e8b1c374c3086a3e7662613b5259d6719050f31246594ce1454fe9552d1e0367884e1984acfc84b9b674c9d5ee306d2b185f000c349caaff14aff42e656236c2a058f2f9cac4f857ecb78846da7e0e185735b8d5d387b4e5eb893b56447d8b4b8716364c6c918d94183033a2c50a3860244648888c810d97182df61e3860c1119225dd028530f2e1c2f644c92c414c783c716ce75e3a14b6e7586e5b5708c5bd265bca44aac834716ce216ec3a624b5ca09ba880c918f11e3d6e08185c3c6556e8dbf31a93c7a5ca160d2ec448b8f6888e06185539e93d16f8259f6d5cb103caa70deec1e9727b5a5565e081e54389e7ce2848bf7f1664fe130a6f2c6eef352f1580a87dbe0994f52ab5939858247148e966992576fcc24a813144e6abfc29224435fb6091e4f38883cd777913a76fd8e1b1bd871230b1119223a7ec78d0dd4a8d15938e1a446db4ee9d2d4ae97269c2e8949ae7072ae89986af060c2e192e83daab1e2968d9670cc1227d5aaa5ba921a251cdeec5f353fdf4db7337824e1acf26ac24675f153fd034464c4d001802e7820e124fa8d1022dbde71c346e1f038c2296879b9ac6551529de8e7b8b12303587818e124a90c97e9b2ec292539c236e386b399c0a30827999b25c9947d844d8b7f1c443826fdd3f53abac4ec3ac276c34d55e03184539ed24fd37da1e93012f010c2493a93cd24c94708710ac241e65fcbca536bcb1f08e7befa321594fcd697fee0b096beab49bdd5fce6839325d724b9296d8d4135c34cad07e7d6cb0b17b5f3e0984f68909e97c4edb783c6163b386792829ea8c86eea45072725a7c52b35e1965a9a0d78e4a0917ba7945e383876ff9d6c5a448927497283e39c9431edc7593ef0b0c1694f3d4f2b1af0a841e1bcb299678f65898e5e2be31578d0e02c62a78212fcddb7d2a8d8800067c06306c7a0be82da74e9085b0ebe80870cce3ab2d482be92fd451c61a380470c4e7a948930b9c9ee72ce20f080c127175d4d3865279846d876d0c86102c42d78bce09cc932dcae5494d4703fe0e1825358d5b7966a236cc66d6820460caf716324468c2bc28b569c4558c9aa984e466ce4e02241fb1dbd838b09acd7b83192ac385a9e2659b4c431adc4e0c52a8efb55a7c414d508db4ee0852a8e39f46d5ccde49fe4a0d13852022f527112a23363c828d69e6d8c183162d88c1a38b6a08116001dbc40c551e3ee86935b2f9b8246d866ac1514a082a7385b12aeb324217469698a9312f5af98cda3d64ba538c90962822e0b3dad12290e32ae66ddb91a53fe8fe224c9c98ff886ebec5f14569ee5b2a0823a14272d6bf752774dee3b28ac4b7a31a98d9f3828f19777d22b948a714f1c756f94055ff33d51ef44e229313971d494afbfb2066de25841c8af12bac1b3823471d0effe91c92fd6555026cee9164d64dacb27668489e3c8a7668c88502fa24b1c540c93ff90258e31251d39df6c4a9354e2e499ad9e31a6d54c4a1cb5e229154f507f4a984ce2949756622c54701d49e22c266b6976c5b4b744e2b05963a7ad949cd942e2242997cfd8124e94e8234e55ffa1e9a623ecdf8cb26a234e2ac5a5ba5a3dad6333e26892c9132fb7ccafea4570baa4f82b66295e28e2a46f7ac14688cbac9b449c6bf72daf979d9474061197687feedd2e7f258c87386ecc916b52f6cb5e32c4c1f296f816e4b649a55288d35c9ce913dd4a92bd10e23c16bbe7a41db3b994419c8208139dd12b82389f0691315f44c30fc4317885f988ba54190488631242f3ef86b0edcd1f8e55b1d32cdcfa92f8216de924a15521767bd187838cf23d952c8b923ee6c36143d7d5de633f53bc879398296772c55a3fafe8e1144ad096bc2de347bc79b0622e4d469bb0d3095ee0e1a43e4209ff8c31c9ecdee1e89696f24ad988f9d60ee797cd242a9c98295feb70caa7a229f9a7c62f573a9c3509fd5a7dd942373a87a38c9a45b7fc21bd5239e8979470f13d262b677138552e65620ed9a07582c3d97d4b9cfa4c95fbdf701e132eb7fedc6dacdd70b6d1b95fa36d036a538a89a1a4c98653e653a53ba3622655aee17c2326837ed506954a359cd6e6ad4e5abe78264cc349f6456591491c8d1744c3f92fab6740ca6d9e912527ed52663896982b9d602985a913cb70b8b0ab12bf2d0925886438e549b2444f8acdfb700ce992c92aceec54124a6238d7499249a14cc2703ecb9ad29b2ce9ce05c3c1826ceda556c898bb2f1c67dcdd2c5dd0e926f3c249631c4b4a129a2e9ce4bdedd332357a3fe342259b984a77da49df165e6ce114dba40e254a3aa99d69e118afa1d6437e97a0f6192fb270fa4d39b18c269d30c1c23109276bba114be29a85f566d8787185f3b59c5cdcc635255638fbca7e9872070d13240a5e026c28782d4c8d7e7cc08b2adc6271f22e28e14c1000a2784185b3d34f50a32f188a1753506eee4fdbf4667da5b08bbc0d6162863d21275e4461adb05592c97152d41014ae2c4db289174ff8e3655e4f4fa50e33f1c2092f9a70bc3bf146f7d7e4507a261c74d7350835fad66cb384c37958563d599e77df125e28e118fb82d6ca169384e3d78c5d0c96decf5524bc40c2e9b65e4688f20807a16450257d2d56d7e21fbc30c2c9db334d4cd810736a1fbc28c2f1e76d4e4f5588700a95d48756391993a9092f86704a76f19649aeda772384f36ee9ac4bf22569118eb08e1d36fa3af02208a7cccb7c7d977726c7236c6b5a81174000c18b1f24b46986dacf7cee085b71c10b1f9ccbd544bb77dd70b24cc18c1bbe2978d1034c96ce7c7166326684cd240f3695df2a5446d1cec677f1762f76708c639270846dc75f8d173a786dbd2f4529a98446d8ca62f0220757b4db28d78e1b3574184cbcc04196a46b5899ab34b941a7f2653f1546c9fe59e2850d30c924b12fa992a0fada4abca8c1b14269ce5149edab4ef2aef08206981237644aaa4ab7f347bc98c169cdb54f2ed1c3e4132483634cffe763529614fbd98b189c546e8c125fe1173038ae95282677bf3cc657c28b179c84082ba12bc95faffd115eb8e098947caefe57725967233a667c76710728402b8ef7e76779645ce9335e8bde7176c78a73baab69efa9932bbc183162c4485bc5214f2ef14accffbb2ab6d171b3ec59c287d438a200a9d8c44c5bb024379ea8d8722ee96b46d127ac533cbbe9e43551539c7b294b6fca78b134a200a538759a748255f47155c78d6483868a64e100110594391480140711219312e2631b378a8964e1001102f4a100a3e8ac727c2cb8dfe60a230a208a535ca6ff122eeec6748db0d9b851347454c0021810d1dddd5d55555555d5cccccccc4c44444444c4bbbbbbbb3b3333333333855713cf6488d40e1bbfc5d7385f030717598858000b1102b8a100a1506df74ac8fca9fc7717510050a47be7e97326acfe84a1cde3eaff334911aa220ae089c4929a769731a72eee44e24de9154b965194cf89f5949ad8658e80868e4d1474cebddd64b5249c89288026d4706df2aabc69fbe5bbc88441978ce6279848e8884c5946e5142f612865a194da882880250e2a860eaba4e2e6c9107f50804a68b52556e9bf4e9d288ed769f99e5c32ad1400d1c1c92daca4d2d117f682396ed818018d1c1cbd354c09a24d7c296b04366ed4281700c1c1492d9f5452bec1a9cfba324fee3400628383fa5ac592f264baf76b705ad7d520c2bfdc941300a1c1a947a5de649bbb65d982067a9fc1e9badd948e9a85f16e842dddf819396ec8e024e9ecb5a4b5cbadb67103c7091eb10089c1b9ea2ce4e5493ae62419616ba40306a78cdb2200f282932a9d255773d566131f61d3e21f476140240b2c4472d84100c4054711dbcc98a3258af25b71121a2795286f52b835c7ebc8d116387b3f037cb0e2246789d7caba6e14ed91a1e16315071d2ba25663d8ae4c15076d52ea7d08cb66db394044c6119121c20019a938c9928d49e650aa47cd2232560b1fa83856f5fffbad9514cab47a8a63edfadb9af505091fa638e986bda4f7b13168bc14e1a31407b579d2fef8a6129a91e224f236eb7e72ce52c9288e299fb954bc1ce1431427254c4c2a081da3aee4a138e6b95aaf3415227c80e2e47982a9df996c52947ce29894ba1ecbf2391367ddc187270e429f5023f6a27e26bf13074d299d5879de73a795e13416c0840f4e1cd7a46ae58d7675626c031f9b3855b59ef4953495fb4a860f4d9c35d8683119f4799b14163e3271b014a14749e595ff043e307112d4fb33dcac6af07d065ee2b4a52bf7877ad54a254b189b2d443c3e466397663f2a714c4a63c56c2509d2d343c14bc09451e270ed5ba258b6f88c4946d866bcfee063122729f3fd87d0d8934ac9085bc688e1830f499c43ca98fa924da6071f913888b5a5249892352ea80d0f3e20713c31c6a8e98269cca103800e3e1e7110697235af57b23771f0e188e36991ad56935f44c91b717e913f2905715b4d3b230e522c7754690c35175fc4c1ed34e9fcbdee12458a38c5922eb8dea9a978e9441c63691acb1b42fc5d8d8863ee892778eb5dc85f0e71ee4beb16af44475c8a218e659549debb102725b7a42f794b0c8d21c4d143cb29bd5c53550771b8d8d7276b6930bd208ee9b24ce4d24e4a2307e294d452958a62bab4051067939a4caecbcaa0ccfdc361a47d8893bf4ee552fd7014b57f634ac43e9ce43e7d49d6203e9c2e94d87e82def8a3d9c341a4575d967a7a3826691ff2d44ea58ca9113637413e0e146491830332f8c8c3e2e168269cdad151c9c46cee70122ad6e79794cc1bb7c331fb98750675b2083eea70b08d255a451383a634e970921fa1f594c935c1328783c8c6242941a689231ed981e3fd041f72389d9e545e419ed027c6e3704a35ea25c96c52416c547cc0e19424ed8e31c5c71b8e16fae4534e6544078d1a09176e38f9a653a2884cb251f868c3492a65ad2363d57684de6974f16916c04224468c1831b01091216201111922181091f131627ca214f0c08c013ce1830dc791dd306d0bd77092672768b730f2a352236c25c7efa0911f6a38979612f66f94dbf5c63976e0f848037626abea8ab24f1715c7071a2c868d8f33580c157c98c1626cf1518673251326377e6812aa64ed10f04186a35f3e195aaeb2849069043ec67010156561b5766406b9188e97b5a62aa36fcc67f21186e349c9c20f309c337f6693369a5e8b5e36c3aa8be3527c7ce1a054d8d6ba944c6a59a4f0d1b59b121963a5a77ef8e8c2319d34316de749ad74a27bf8e0c2395544a82416caf2a4b77092ba1ac5c5942915651f3eb4705042deff36dfc4955116cea3524eb32d79b2d2a6870f2c9c475c3ad1279fdca5e40ae79c93559bed369c5f17870f2b9cdacd2c2fd3877877e1f051852fe916fd31695a93dcc6670059f04185c38a543b4db17123cd044f011b15400118e1630ae79262d49424d132c2c610b051010e40183ea4702e797fbf34c824d53d0f7c44e1a44bf6893c794a0aa60285532cc9424c3cd9e458e90927e9596278a514c735c663c38713ce5e632fa3f937a9694d3865b6b3cd2a172b63d4c60d317c30e1ec7769521c2dfabe44f33e9670926d747d4f95c997f4399e069a51c2f162d81226a6d2e026c986096eccc8716346e7681c5ff848c22948d7fc92f566ccb071a38e9170525b52a7a6e8f5a29940c70c1b347a04cdb8e17947385db2106e5a9b2a8f35c296e346163e8c702a5f4d6571d44571c60dc7297c14e120e6a394d00aa2b3287c106139fd1bb165dd085b41e16308c7786a66e924f152880f219cfad604719bc4770d7911c447104eda94d2d36327cd4c098463cae2239735222d957e700a17e5f6f2b6d4e625c4870f4e62beef25e72669e9eec1a9544a7565b2a66ec9300fce1b2f65b8f8255c16dd08db05e263072799dcd24b12b20e4e21d69b7c43e4eb88150f1f3938460b0b213bc428a12e77f8c0c1d994dccd2517b3e3e306a71f15a32ffda8d133522d3ef88a295c90c174272243240b2c44d2111f353808bd6d19e1ccb10387053e68708aa1f25c9c4b963abc067ccce038eb5d96479d5c38496470ae77d368daad173e62701097c68466eb5837d9070c8e26c428d1e2a44c499ec8e1e305e7105a7ea4c61ad711dd1b3e5c70cc6ecb2df2f55ef912234659318f569ca2c9b58db66051f4efc18a53b0a02277ece545a812e0b18a53e88c9e55d86c654a5471fe4b62b853393ba7da549cc44dc29a9463b3439fa838b69816db50e29a54dd294e6963da783fd1e4bee5618a530835a6c3d754335a1ea538ed8da65c6263a35d29a0a1e31ae0410a943c39325acb7a46091ea3389cffa9898a31d52d64b681b51966d6059a00b8c0431428d17c7c2b8f501c4c6ca6780d1a5c24b9001d27e80988c81041c10e1c5b1c1b151091212243444486080a5e022232444e40237d0e0b88648185888d4a7880e2647a4a0e39b143a98ecc3660d6458c1882f0f8c429491ad4ddaf8e0ad53d71cca5445f8d317a7a48b11327cd20d6a12e34aefc9c3805b1a1b937a9921a4319596021a2801831bce0b189a3b5855b9e52bab34f34714ced35a1b222b54d53048f4c1c4f7e1f1779d28a89c38b6b5296b95574fb788983b213da3a930e2d7156539bfbefc42599fb4a9c32ad2857136a4a1ceedf56afd7f42dc94de29847bc06cf0dfa2257499ca4ec6f223247cfd7f9048f481ce489e66bf56632851f031e90288de9b7b17023db471c369b4a92a054d655128ea06df4166f63043474e4b5c0c311a79cd75d4b91294cca236cc54ee0d188a3e6196de2cb9dceb58c385605cf4b197236a38ec16311870d6d2a29ed25f39fc5c0e0a188935a88be686f27e274da649b76dfac9a2f220e5a6ddb2cebd342ac99048f431cdf24d1af314f26adda10a7d89a5d36c9bf8b19f428c4c9b2dd09a2d965429cd6369a5c6a73279820a682c7200e2776af745ed57d5582380895e4c9712a6b6f4a208ebd793ede269d2035b48207208efd55a7b4dbd29fcefce194adadc12da9a056abf5c3e1c40be2be4ad84d99d2879398c4f79c98746565970f077913b349993e2dfc3ab8f01923b041a3241e7b385a69fee5b5ae68b9d4c3c14dee053d32a89d7b86471e8e7f9ad5edb6235a93f070907bb61ea6374923ec3b9cf437f5069d97d12c6c878316b5e0fa1a544c06eb70b051fa948bfa46d88ce04187f328b3d0bacc4ce206091e7338988be615ad15132e9a9c82871c8e51539345114236547e84cdf36b24dd458ed7f139d2091e7138bf88b2245f3caba4b41dafa30cc1030e272dd14e905b256f782f7f65599211361da785871bce9a1563e6197586dbd7485a8b3b82471b4e9b7f53925d84bed01a0f369cc4e85e1a0d9a643d003ff058c349160d6ddac99dd1e3441c4d1cbd24698e12d3e54210713c7997ab71824c4acd8690431c36756f8a5e089d16376c88a3c92763640a6d214e4a9cf1fa8e0dff0971f259d79227832ed37091e3061725581ec4714f865a12ccc3f4a504711e7dc228a9674dd4c95f06e2681a2d7e97687280386a12276633dd18b452f3879389fe1ba1994e7ccd7e3889d830226c4eb40caff6e1ac6ed152b46553eca87c386bda2b1125bd9f69933d9c3c83052d7239057e027a38eb65f3127a52bc109287b38fe949259e5427f7946ee0d061ce108287b3798cb8fada6768d008dba3ae8163c60dcf3b1c4d9279afe5a299e93989103b1cd3a5d5d8e87a392eac9008a9c3614bd52f89103a9cebdc422ca95082553f87633e49eb2d5b92649bf82342e470b20a2a5d7079d978ba389cd64c4f66554c9a552c860881c3c13628e53d5a72c91a2d44c81b4ef9cbdf6d4e128390ade40871c3e94f9294985e94eb887fa38616396e98200c216d387fdee8114ba95d9a2144081b4eb56e1dbe9b4599cc9620640d076da1dc62989eaaac0611a28683ce1026f753acdd364610216938b59768736ac47ec87b7f0841c3494f9e122aa9b860390b39c32949254b38416599f310628653e838514bcceba34d2e035c8693fed98a71b2fa694f4f0c2164388beda76931a9317b89d60819c359f58431414959838b9ac3c61d1742c47012d177f9fbdc7fac1f614313c9c2011c00378484e1241e5aa265eb749a924d4308184e41f8e5de771f4d2f5933847ce194c335539c094be1435e38851ccf3fa1c43575d485e3ae58883379c137366808e1c249b389269a28af74a2ba85b35e90d31f95d2c2b9bb24753bb113e52c9c629e8f3a495027281fb9108285633219457e93fabc5c6e21e40aa7aca144b356b6bf3f67dcf0a5116285c3bf99b589b5bfb6b131c3ae0ae7bd36a12b4c4c7a83c82208a1c2295d698dcbe2272d994ce1f4214dc94e0fcde6ce0891c2c14ed07d82124451380899a192ed8965b219371c4110020554d0aa9322624ecc972c429e7014b171b667af729abcd370c22908a1da4ba6ef0ba119371c8d10d28473aae52e7153f9a5550e0f214c38850b6f7332d5d4d279750859c279d3df7f283f9570ca7382d5c9a204cb5a27e194fcd5457f5c95e6158284535a5551926a7984936049b8fe65cd9b7f740831c2614d185d23848a69bb5484c3e629fbb9dfdd328b594308114ede9a25859ba8216408476f114bf26a489326dc2244082755417ef60571297d0f09c249d2cd938bf9be440810ce5b82186917df848ab611213f385f92e56de48bdf9b0ef710e283b3fe5c56164be29b9cc488d183631aed5e62aa8f12452084f0e0ecf69b55f4d85cca909143c80e0e9aa497ebdcaaaa3acd1b42747056df2463b6f3b398931c9cbdff04d7b7cf147ec1c1f18492b61654ca0a321587901b1ccf4a86d353ba7daab6c131d349d24a68f8860e4b0d0e325a71c1e45f2579dd104283631c75eef717bf5dd9199c35bee8d2b66bcb10228393d0ab4c96f54b9b86640889c1f136962a65d2a85cbc240881c129a50d3e32889bf495ed90179cb66773497149b43639c23376d0b0c1c50e1b4d23476f005310e282f386766afed3ba76429f011380b4e22457d80575ddbd9426236c66ac38caae8d4ecb3b9acadfe2468e648aab388c09fa2a1bb3223244bc6fd440417b8c18dcc51c4054711e25676784ca2f15a751b24ad26849ae74061507d12d396fdee47c01e414e739f13d2dfe49f70beb16404c71929bded56a45bdf5b62c8094e2741b945fa5edee9858068a14273b2d594935299f4d1ac54186a63a29661325c5258a931473af58dfa51799501ca3de28aba04beedb1e146793f7ab9252d9a6c4b4dbe0a2014613209f3868d015aec1f22649127be260a26d523a316d89af9d38e5ae8d5e5963648c990e2e5a068270e224a3a69c9335a855526ee26082d2a2042b65d19292268e2653c5c654f9d48d3ec310209938c51864f467fc9a140f132735ee56622941063f0de4129aa4245113ea7e362232441c027d00b1c4e9d7e4ccda7b165435904a9cd2e7da57ca5b61404486485d404486485940448648554044864851404486484d4044864861212243a4242062012c446ae0d882c68c5d0308258eb93edc759338e1e72c9806c8244e724d2c496ffd463338c22689a3dc6e2631bd34c2561c011289d39f18d406b5b4db94c10408248edb5b762a424a803ce224a9cb1ad46a29033c0910471cf3e53c69931835d5c88c00d288934c295bacd4ef3d1b33e29873a95e5971925db88883cc65d944e593e7ee56c43157b25f9fd5f82796441cbd84b986d0b4b8a506010822ce16548a62a9f5439c042d15ef696929e4ca308018e26456d2625ba5d10a5b8214e224a8f6b02d619bc49323c469cf3c4efb5b5666ac05104449d5cb940a208238c6d3f9297aad1d4aa305a291458c18500009c4c964375d49b1cb020b91a20310401cef4d34c5e4edf2b98ac810a1c088ff1f4e9260727ef1a414e442860f207e388ad88d71cc4ac8306a1a481f0ef6e9a64ad7054d42c50e207c38a6d5b85177dd4d6e690fe713db94daf0a51ece254bca26bc626cba14481e0e42454d6a377ffa6c078287838dcfb67705698e1d383e007287739587cc49498410178a11e39d8b2d441a80011104b1c32966aba4a4d297d208f108dbd91d481d4e2ac7e998cb377f931b3980d0e1145f2d44c62531c9cb399cb6329a38d17b0f2d23881cce7da5a5a34acc797332c2f65bd0d8a10a0805481cb4f735352769638631912c1c600610389ca46ed1bb3e16b6b6d52a80bce1245e10ff2cd1c2a560b201c40d07d9a1cbf27b6baedea400d286b35d9069a32593c4debca11740d8704c1553a5f6caa2ade33480ace12406614a529994b0d227351c37891f5d1be29d2908240dc72e3964d227e8683897a653ff56fa55943e0a206738ea857ed12127fb74df0510339ce4b9783796ee64b56538ce970c21e455b6a412198e2625417d9997baea7c0ce7135966796232cdbcc570b2cbb2f92f799c2064c2701c1165252689a82e01c34149624a6751f5a49ff90ba734e1c5c4a0e2859389f8deb839edc249c91527c4ce85f3dad5f9652b3b25995b38c698bee2deaf85838af5563d3566e124ddaa5470110be74cad37a1ae6b820caf700ab24c6a8e92fb4adeac7094eb9392e95ad0275485a366c973314ae5ab132a9c2b89212baea75925ab8b1b5b3c066c544044c61040a660e52c7164c89b236c72ecc0812c0091c249d07922edc47b651c6f743143478f14912c1c707903240a876f4bde5bbd974d92644f0081c2495a1ad9322b2bd1dd09204f38cba88f4c7ae1a791230baf4163440610409c703ad156820931a5c44a236c233b1e7d00d284e37ea9f415a6d44bd51bdc26c8808d0a0401840927d37525c69dc78ebe204b0051c23166134f4a75498d5838c2a6c3dc046ad450c0154092708cabaaac5b9abc2b0809a7a0a7f2eabda4981b730690239cbf4fb6c9fea6456b7f204638897ea2e8ce3d73fb0d48114e25bc8cb889931e968409204438e9a78927df35433899ca4d56f13342b41c612bc1eb10c2a945c919e917dd6286db783e204138461bf517193294d81895010204bb84b8d6dd7b98356ea0193bd09320b951b400f9416a9287b5c57c959811361b3768cc38018d74a6ca01101f9cf76e416316319711362601480f4e1ad34d56ee1079b5a3c0466f05407870fe714bd120f326f91f3700b283937c49026d38ce29f17d39294ce66c38fcc7099bc64ccc9ed1359cc2578cb0bebb6872aae17c2a864e93b2a33509a6e1a4b57ff2db6bd2f6a3e124449d30b3b3275672866348d16f66a324b91b331c5489154dec642a31bc329c2a99542a7e9a9c49890cc718664d89124e5e4d6c0c2761dd2ecfab673431623865a515d98a2b0ca752491236f76813d724180eb22421937c928e5f115ef18583886d39556df2c2d1e412347fd5921c2576e11884b6af8ef9feee132e9cec7dd3c4cdc69c949bc1155b388f383146476792c632223244100e5768e15cf12e96be4d5f918593ba5029765295ea9ab070b210152fc9a4662f9b5ce120fbb733cabe4cb8c20a27252dbbcbabe68a2a9cba43fd9d9858070a5e0254389d9467dc2429e2f62c574ce12032f392ec92a570fb65543b9b2b0ae9d32565123406d5cd8c11d8a081022f53289c37b76ddeaa4bdcf09e704a59f4dc8c16bbf3f8055738e1243b93d01ba3872a41a5852b9a7054136b7655c2aa4ca6095730e11443f6f85dd099352c28842b96703c9119265756ca68f24a38987de5ec9dcb089b11c9c2010cb02b9280ae40c2154728d5d274c42b551242c11546482cad52bc066bf5f2ca14e1bc5d1a948ab971cb943fb88208e7cc10d37bdf26888b730807935a15428b929492f442386d6a19d5d1592fd1209cc77209960479b6a2424038888d9dd525c916b5fe070713fdf1234e8a1d7fe283f35ecf68ca6b21544af7e0189abb242da1e5fe7e1e9829de6ab88aef8a1d9c35ef967ce3b2c19414af0757e8e0942575868ced39388fbe0b7519350e4ef6a64bd630b1d2fd37386f381977446738b94b1b1c7fa4bf5decd1a9a71a9c7acc4a1455391a1ccea405f519b62b6670124ff549b29fd0122bd31a5c218373f75788c5b4d06f658fa08e11030657c4e074b997dd7eff6b7be21d57c0e0144f0529a7a2c9e4d15f70b612ab358788500557b8e020263667d64c6ac5b92daca528693e5a93587138490c2b31aca55855ade2ec26967c229b31954a557194dd984a9292502a8ef16ee2988ceb12eba2e29c2a3b631a5667c23f457b629256cd5fcb7b638a2d94ce246ca5402f63567ad1985a523c9b44d5b5124fde4ba3386d89226cdf4e1a47066c340e1da238cac95362c654eb53ab8e72a681183162c430396084e270924cfdcc278692f40914a72b315cdc1caa2a54fe1327a552e44f58b59864d0139b92a5c4c9559611b61c3b3a7194dba85769b624cd224ea0f1ff4d9cb7ddff82868d8d514d1c4555162d29f7ff689909d4cd863c55214c1ca3e9b5dca743752d973826afda60dd279638c8fc253c374b4f506125ceb916ae575dbd2e544a1cbfb44ff6f14ab9ea9bc439d467b7244928d393240ea3c42816ad8fc4e924134f4c29639038b905b99cd7eb981123c6bbf223ce5a294de5cab646b2c5ebd0d1c806170da880880c111b10109121520111192259a48e4d6038e258419c2ed9646c8ce186d1884ccb054b62d5848f4e00831127714b959dd09753620e6311e8bb0d97c1a380076670014311c7f026cafec5fbdc6b1291011d30107152aa654fcbe2658bfd21ce724966cd3695a977431cff3f53ac0831c1ce52885392a5a29eb4f2a36c429ce224b1afda274d533f888358cb18c399d8175f12c4315f68c568920cca4749200ef26d4b4a7b1f10a714acdeb2eba4eecd7f38862f7f1ba5f324edde0fe72ded268ff7c58917edc34953509b99bae7c395caa49195e2be8753da20f2b76a45588eb8d0c341960915354f756b10cac3316ec67e6fd1906a41783856ea708f932f25297f87a3fd8b4e3b6d6d153b3b9ce29ec9d551c2d4345d8783d555094a3e4164d7091d8e7f71fcee92e5123473505463497f7f517b527e00430ea7e061e1f1972c29a589c3b1cefcbd4ebed6a813389c34be889811322180f18663798b0565adaebabd1b4e9f25efabc6b52fbb0dc7375342f39cd2681a66c3319616fdd5b5ace120cf2441a878460da70baa54e3cb9286736bb61453b9c8b00aa1e1142fa68b96e6b67289cf703c1f932c69f9893b99e1944f6acd97a28959841446194e9268624ad2c4c5151332647a5a5c3337650c47d520538e658c7a73c570eecaf225555087e15c9533ef3b47533c01c3d95f4e66ac99bea09575a75e38098ba77d261a6bc2ecc2512c8acaf94cc285b3084b362a28499015730be7185552ea79d3b4a869e12c3ba692785a8598b270b8b13841c679eb7f13168e3a76f24aed573828617527957d67eb563857a593d9a4fc259f8d5538df967892acdac2a0c26963fb682aa167ed640aa7a0f372d35a927dd949e118caab529914a2271b85b3a63e19e6c4d9cd1e72a135800185933e8d33d1378d4c417bc27954dd5dacf6ebf8cf4af01928309c7012e634896cdf46d80ac268c24986ab65dc7051a3bb28c3d113304c385b3c6d16379a259cc4bd9c306fb2269dda956128e17c9224fe49492e7d51c311b65c184938cf7bc97181044b992e498f4c1dae48160e38c2f12a559b7c5f754154466003df4f61180146116010e1959dd321beff2539844c122766336fc8788c184575c010c22955873cb1ceedc00c184138091d7bc952a94b4ac84718053080802cab935a32ff6ad208db0fd0dcb7591bc66f183e384952494a5e253985d103b42c7d8be9906b5f26183ce82471e976cb52e74a87b18383692b39daa26812c6c7408c4a74601123860c91c28548165894e0751414801360e8a01a55419cea97df60c3c8413276dc9a8c2deee5d8a1a303307080d0e03156d51fde398c1b9cd3a4747f415f98201d66596071f700183638c54af78bff266530a9198c1a1c2c89f64d974ce700183438d7ecbec9e68cd9f79ec16163d6d2d654c1f2c6c090c1f1a2ae9cbbe6dba43f6b008c181c7b645b5d6a5ebfaf3f92a80a18303896921ae4fb5b4c729e2860bce0a424c943c6139378da3ec25b40204b8e1d38ba80e18253c6b71733299414f0c08c0984b4e278ad7aa5de8290fda611b61c3776d048b4023b68243162e8c0712329e08119140861c5d96444fe26691b61eb1ded661321ab38a6a8921954ce422e950851c5299d094ac9d82f42060b4e222415273729d4a7be9b68525848010fcc088021425071d034963669ead36d3ac5694c38b9d39d2163a52fc414c7ac0a3a642e8594e2544226a1762a6d1247298414a7ce54c245b7a4c4686238848ce218c2c40b26283949ff1d228a939e3631fb8e9dbe2e19619b51788590501cc352d5924ca94208288ea28205bdb2d833e1c45408f984274ea932b624f17647f937c2d6895312af6449294b034723fa2e703971b4d8ba99cf7f5497846ce270972449d6b05c4fcb8cb06514423471f44c8292478459cc9672dc134232714cc24b666697863841236c0813e79219b72d9ab6468b46d8ec9c10728953864d329a6792b466473f8ecfb1c6d077810808b144ad39be47c5236c29dd98a105a2a14509a9c4c17f7e74f888eff83928719272f2caa69dda246746d87a46ea02c78c1da86d7c5942c824cef2f11f7fbaedc2f43966b012422471ccf5116f51a5ee5476846d93101289e3096b992cc6f8932526781bc890385512faec37f56766ee8a10f288e3c6ae3d499378426c75c4712e7c4dea142b1547dc88c3cf8bce14d5fc845231e27c4283dc58627c9e2ce26019bccffef3e43139459c2a5f288e6ca83451a71251280c85a3280a82288647dd250033130000000c1495c643d17848228961fb1480044d3026502c301a2a2214142c168a45c25028140808448140280c0806c3303007621dccc1380001a66a0a144d1479a53a5f21e68a89eaae297c2a0ba67689ca30cf0e5d4e0f65ac280a8a865d17ecbf24442fbe0d4c7bb06cce6ffc39e7821020c4af0bd3ec358ec7ee6110ed35947d396c150f6adf0f0cd740866cf2b98e8c0e4ae47712f13513cdd21f2b08cceb1240a7df124067e795bb56131b96069175995d1898bdf75790597a994756b8a4b0078588c1e6a5d08548118b6a78cb8dd26705f870cbaa15ae795d45dd40b9f0474f09ae2fc454a119a9b77b2cf0c35b12b22d4c9d87b468f36f4183461a8810152c79f070fd5a510bd8244e36f85c2ce7d8a570134487d5e2b09f199e5bbca529754e59028c8a15347fabfe721afc874db3bc382dd0c58b6d0c9fc8dbe10b6c0818606050b08f28c017c7c223628393b482bb268e03380b1362051e43390427ec7a4f903db420a4700f1a9b167818139e1c5eadd602dc7eb2f64e1b9693c858e68ebffa470c7492e9cba9191c21e12da7a1e1df5d430dd14433bf8121d56c9a5131c2c247e580d1e4213b42d72c4e2b6d5c6080e9957a8a420be31cff5c8e7ff31481d5a6914806c316d20911edef6e19659b3d817d416484050e386ca3fce0f94d2630908ee6efd724e563f89fc99258a7b722bbee51d5cbafe248263ae190fd39e0d2035e70e90c9034545984326a6512656be488850d9ace79c5223aa04b2e0a1d43422536709819013aa4d1be80100d3bced81ed26d953649741d2f11baf719b28e66ac3f8d72ab17517a8d7847d3fe9b49c3db68f92f18695f1c4ddae5dbdcbe5be8612399c320a1d5bc491e0225141c60d8ae815ac792cde1367a2c1beb1bb7c9e642164b81149afc0e9043e2140808d3024ac234258114f4df86fb0368e3c1035e2bdb17cb56c9b61e58c7daa64059f9bc5222822c94dcb535cd197430980f3e1d0c977b4485d4ccb484c18ccce0c3795f0633c2ba989a8fc220e32b33aa65e9157bed07042c18209ad25051fb4f75a1c47aaf80d7b20ea4e855c23d4638424e4347fe45ff4361ddfdcd3f7eddac206dbbd24b084530170b7f35ac5917fd2792a23c963821b20735edde4451532563744b4f17c6df17bf4d5fe5370b15cf563af5911351de2b714681787d75758bf1313d95d333b8b2307dd36ba847502dbd7bd5e60c24435a26ea8bb5247de458aab9f45190abb391b44724d62fa59385b7b126e81537cff927accab9337c0694a336c04d4fb874514e9953bffde8bf426f5e1a7ce40ea76473b0c9d41e56dde5d9e24e0ad4ed3f645870fbd23e7a28ef963f181dfde63a039be381e7f806cdbf82b958292c95d80994fac039b1ca51ca29d5c887d3604d299f78a4fd2c95727b06a5e020334389e12e07964304a32560da2a4ef308da2d434f921ce709a5537079aef0ac530b2e0060ea0a22eef911af14b10ace0b39b896d372fdf42243fb8721037e1fde2f1d40212aa08a59023b92040a4ec791d9bd87b02ef52c703f749979905c17993bac12c7be3d90a1ccdc0dc365cc01c5cabcab0be70d6971ba812cccb334b31e8d74d3ac65c9e992247b66651b405b14fa2a998df4171d9ecdd093c9ca139f96b06c7af1d6d679898036356024c7069c6c664a88b0952c990b83813239392e26eb848108dcf10ee28c8a10f30bb33148456526f92c8249cf117972323508308b7cf7786b3b3c089850dd976a53b0193839daf44410e091679e27f00813600fa15438884520cff44e3c9dfd8315e841289eed52852eb2017a7e362d083cbe45d9f3b43108f2a74c6524d5fe395424178a5569ec9d0627405e416d30962a9448ea5bc7eea1d3a978d043b46c13b5c419647996c6086210aab64f9e9711457a39c384a43ab7f73560e8ffa710586797bac69e34a8230dbcd69a3a69bfd7b42690a4ec0e02f46c8cc0973f368e1afc355fad7b6902cc85e99dc3034a9bd71531e88f7b943bad906eda2f1f5e6f8f6068cc95638a808e1ff6092958b0232d54c635500886807cbbc5a0625d1c99aa637315c9e357e7feb0bcc49af7acacc1a5f8ba9d3db5d00a294948f9f95867d2f985c2056d9fad1803551afec5c5f09129bcaaa9ab14fe0df5208d40d4f9afe459195f0ea4bf812d50b3e333f91b39367f842e76a278013dc139b4a99f6879066494763d507dd3c4ca5a98d1dedf1a043087cd728d90d592cab3b38e89fa9af03bae2290f8c36ed32e52cc616f36d55c51c32e52c3c02c4c17dab7e9601acef6372306a68764436918e37f78cd7e284fa4ae454c61a193856e05ca5f68efb5cf159901e346fdeb424396f9a092f51493ff9cd363b75bf043cb74624509dad328b85714f0565504ef43b92eea8c238b70f28039021a99d74023867f1c9c987bce8fd4a929c24095402232177920f632af1e0a3c21bbfdb2cb182a382c3f2ab1c015d12cbf5365a909ed89ff0760ba45428eee51a8218ff0068f6e7d4ff7893c25fd366a4d7df74644717be31c761367a9bd03f709d2321ff41abedcbe90bfdb1007004e4b0f5aee96d2ad11ffdcd10ffa57e7af821c436effbcbc2d4a6837c6b23287da9269553d71aa476bd3076cdc651a4158e64a9b8cf32cf6f7d9b694adc878af44d4780ebd250cb5794643a9be1d3b5214d1ef550ef82c35b1eeafd7049e17264bf897519b614e1b6f2a92a7af1dfe307761578cc6043b2a8e28a4edcc630c05493d0923f46b8455c0a6249cd4a488fd9e68676594d80c42301718c1b57e97237fe5518119089dbf796233d3e072b964ca2f1d7b0704a547519c5864776644fd620c852c1eb7d66d94313f060977c4e07933dc5ceb6d8ed5b17402c77a8845d8c509ac8952b9ac38a2e04258c78a49206a5f00ff6f416b0f0f0491039bf20e9f387b1a07fb41d52b939f6fc1c03e23a7d83e871fbb288a112325c68d831bb4f404bb707c06deaad42fe0343cabff85a5a571cce67f63ef54f4d8f60097bd51e4d7f2595c6252ca3da117d4ff310d48f0a108e3a133c2b923ab3a201f20a95e49728e83d2d13db08c4cdace1a6281bab0a9e8415bfbdf7cfa1910abc6b18db67b66205606b740f041716f414667225124d8ccaeb13d4e1472ae3bb987c105d2cc8acfb1d4409fcd42d44186fbf97b9cd1c31c52e8e3a25882dff84089e6d6ac8223eb677254cea6a69424349b554a8ad162ecdd627817581989dd669022df5dd2279c74f72c2c1e6b6cfe2f228ad49189c92aa1c2d81fe9005f416c8be206f172b0c3da307dd8fcb0ca4d3acf19cd765d1772237a22db7b9956e5d51a406a369adfd4117b8fba95c7cf3753088818f8fbdb9bb7a2ca83a7989a359c409f6caa3ae314c5631ea974b66e4bf1b3958ae3f50d678207f2f80e2d72c98244679533ba7241ac1c55695d07f95489ff1d2b710a3e060b90521c1987c6cf86fb1ce1898982b709b71cdad4fee0b57470d1c7b4d3c3a72ac4802a3e0cb0af00ff27fdfb3b36c51523b6c55852920a3126f246d50391dd95a39bd115398f4a5c7e47cf4ad9f02433bdfe88798c9b950fba92462bb78620acaa2049c33a03fce9e4406466f0a8ace8ee0cbf90093ca3575749008814ab00aef748f8d875f52e26b162113e96891c98087e5a1caa2821818ebe74bebfcee82971d23c42a87e3314394b6f220bfd92e20c90a086ea5620c74a420426eadc19148d457d068fd207643b3a3eede1b20a3cdc88d8b4fc41a96fdf9aebe8f5aa7587e9da20d56fb4d14d1f4c2860ef024f71198e9fbc2900fc3c5f3b89585084d22274a44a8764b9f291a744e7165b5c4bf02773806878167427aee6c52afd7883c4711c18452b357e8cdd918afdc92ee0365d9b87c129b1bffbda58892606286c817055116821054f6052023f55ab845d18b1561da98eb100a1b5c2abbcc78edf278388dca6cdb1e9058cc9b4cc18573604f19bf3d101357e091842e71774654b076a27e28ced5734609448ff98046583de9b980d9b6d10a9cb98e6a37db8411cb744d54eb7b0c9ea3fdad9a43131f173e9de2f8f878488b4a2901a83d1726520d6eacc1364a9a469ec725ac2f5582f394516aa67d112b48d67754e48944d849c2d1de784c72fa1f1566efd30c71f1f8169c6fc0308fecec15c922f9dcd65664c70e3e98962bc1e4e6643a895031cd4067c1bb1f0256da36a03272947d4e75c951b812948b26ff5b09e3e16fff553bebe4b4644016d9b955581377eeedb20e81cc8a16e201dbc900a5a3409baf9a026240d84ad9b7c2de86f78803ea88387cf9006d14d00eadb5726a1a80dcce7a193be0fb7ed606d84f4c0aeffdae1f40000ed1e523e1c14a21eaeea7bfaaa42a80633cdcbbb63fe69c84b33d17c20fe7ce9f32a47e36da86e9e4a3efa68413c12228dac2920a74bcacb36d39e1d2c2a116139c361ce130c576a525da493a26c992bb48cc0a793e88b79dc6d769b172fdb2e379e589372c7024fe3382e6f70cdb4729048aa89faf8a815e178d90ce9176d8ffba1d874a43e1866bbe87bba9e8706bb61493536d975b6286bc6268e7130ffcd3dbe96efb694070d2c963b4b72290951a2bc0156d28583aedb0b7564dbbc382d2f3fe1939e0278da5d5c5dadc9a2f98697c2ba27eea52570916d38fb41eaafe220fa8450778d691b6ec402817270b7a7ea004f39c38eb41b4c2378c802daf654953a4b9f368d2b9cca834b90d63062e4f5bbef5009783d0d26cc45ecce9baf48e3ec5bf2c7ff9c56362db4f9a3141562f77cbec75ccd999f97b1c70bc5e32b61693b402d405ba3eff39c563bd7c5cc84912f377cd1d4adf4bdda846674620002edb4bae443fb25ce7987d460885c7df3385c24c5a56359e1308c09df2e5069ca01bfa412f2859689981294494f3265d07f06b7a92f80ab3d0b04af636014cc3182a714422981a9db5dd4243d4cb2a4443f318f68fef9e872e3b29e831e1ace4227a6533494bb0d8ee15e3468217c35d4b0892e4745bb5265474f4d8137af14012e0f6588c6392ed1380657411e3de90c93c11b40339c9b50dc60ac639d97741d1c2aabd8b23f980c4f40a1bf60fa390b23a213a8449321f7323659882a8e7ec865278630b67c33f0dfee177ca7c84dba3f208a895debef10047b357dafe653d00ae4135c7286a6f5d7071122ca932ee0559505c8ab8087fbbeb7e13225e090ef2653d54940c8a0661afc9613325d7948e43ef49b025744cfde4188fb90d93edce6660c91191aa1be6ddbcf69ab0885a5256be86122e73542af49c4254440a8e8a556d15b959a8696390d0f7415e73c49d0b434b6e601892105d69b28c2e4bff83404ca85793bf0c4c7c63b1609d352b0db920537ac96f06e5acbb13cda1300cc09a212cea2d8337f641686c7908f9c0f5c8b18c9c6aa2471a086864dcf1f2983040963aa90da35bc55c8cd3ad09e0dc8ad122742deb3243903347c5792af863d8791b2f511cd497fd5bcd2585351c908eea3365c543d18b3178d4d696deb5169442228ea57b04b65f52a06b5f19bdd90dde7bcbe34f65a5da3154542055f8478aa0a90652e4e1c5bf9bee0789e7972c7bd60c7e81e4dac3641968693fa8ca1a170770d4a0d3bf6e99162c7a2f31e5ca3cccd79398447e4f9320872ce56edc33c498774c2ff951ecbf9c8b23c7000e8fe86b1a2152787a6c3c09d1dac848b8e951cb071c1f21ec4184f7611c6d8c7809639306f25f376a2c2c7bf74249e4186e5bcd884fb33a647cc4f2590ef08b508dbcb58aeeaaf53cb6ae3c7f7a32968639785c825a0c49d574e6d8d65dbcb573458ee98adae8ce45ccae6a42cef2a6591d194c5d7294be662586a3be4519ceed2ce52d4914447b12cd1c0c6abb43686c5dee36181b2c97d7e0d3d894a608978390c721e4dc5b4c3d069482571cd6d3fa1f374b23a977066fb45ffa0820621672eeda4a61e33fc933b56cfcd05fe778b1b37d55136ca06b585d361b8f5abd974fa0b523a54c2c04c3a6076c72e4b0745ca7c2860af9f3529b0a56c5b50dcc9b155350f88b7364b9bfde446e6bf6e46929aba79d69343c3bc76116db7cb994486b53a44be4db3ab38b8dd58830bd5522e3098a1a96324ac0cf6510b1e39a344c217392f5b51cda75c8eb0153765ab94759f19f80a8709059de78bdddd78f78800d596dd2c85c8006902a06e7dd6bcc5a3b2144aa4cf77cc5ab2b560d903f5603d456dfee4046cf427322b7e51e01122c30705e8228f4fbdb006d894d47c421ba72c45970e2d7553e1e258273d1f747aa388294e02a9887b4fd1406a15eff605101710496af8e4b2724dd1c34930cf4fd0ec4eea6ad75599d691b17197af3afc3c9c12826621d931d1db2b1da5b27832801a64308592e1a81a0bd9f46cc7658f1bc7a6acbb7a6f8d849824a9cb52ead5fa796ed0080ca9163a5506c0e04fc58b8330f1162d79c69b85236da8293d65600bd2ca81879c1f38298af7afc51b6c594e644e5bc63cf53cedccbe95d4ee3c34b878244c856d7c6b1918ce7f35c259ca153f0e610d08600b9b8b5762ae2b52e16d2f0d0394ccb2a5802f14e01a8e13c9b7775bc76cb80cfe67f57487447599b1256dc82c67b7f7af87b4c0d3e9d708a0a3ae748d22e786b8198dbbd82e1f2364e91608a3a4980055d3a08555283e8dc07cbfe2a141f533837ae25d738a2ea095d57550581f048f08c647c05c09b453b0a7048e851022c5b60a1c38a02adce9126a2c66408ddca6f0372070aab3c4151c2f70ac1d579796450088ba69be01a8a019810825acac85ef54e0dcfd2aa794cd7d8af232f4a666d767f1c7c340d4e72db00541ae6da93b29703b3a0461afaf1a3a3bc042e5fe8c80259ba435e8d0ad32000ba2603810703fd8ad61362c9b7d770144adadc162b50dca60f56e1fd62c961414df32fdf9740de2ad04ee427b9b566e7584571172295e7b0564c772dfa69e01c10a514f504f629dac9b2a086c36328087026ef1f399533a6646432c03d879df026438642a31069eecfb98a4194523637f2ad21017aa057a86d7e5a45a141b9789a16f56dade3ca9890afd11b523ea27af5eddc0a487aa8f6eeeb1611262c7327366b0bce91c496bf89c20c6655628a02931c53a9edda880eadd39662820248a83afd64517e41fc08dedb0664b698a3a17ceb2e172b3087eba8d34c24ac43171fca4b11dbe2adb29983ce82f10c50788bf47c58e01229e67abcfb473dbf74a8b21f26f296d9129ada7e4822dacac7a35da3f13487ddafc2b4601686daa312ddcadcd9ce22b0d094327c1a7d209a1082fdae3843c820fa6eafd8b961016a7eda24ab1a0ea5dc6292302a592eb6661e113a3a73729fe398574e864aff84a7ed27589efc72e50a40b3f9d5f4636e7609abbc4a5c0093d55a3eb1a80477235538b3f0ea277c57142eb2a1b6a4b12bcf7db2821bbc101c3228891f39bda32fee7c43f333cef0c09de4cf38b8385780c8ad9499d83b46132f77cadb7471108ebc38b9611d71126391860ae9002dca6b497350036f46d2a3cb681a7f121f548775b6c93e5a07e0369f06d5adf52bad0fd5510ba0d934b80ab3fe04d4ae3bb4898c6985956582417abe04dcc8030d3994a23c03a0bbc8a13a78ba2323f6026325dcea9889e855a3d708d228091f00e7e897dc760e686aba8a0345ba969833230180181cecccccf0f4cc3576000d3c5554646d94d47c61024b03590078f8266c23e55c8ccecbce83117ea0c19f3d7f043a80e3d5fc7e110986b1e423e293ae0fe2e04a8d4e49081c35a5337b7870d0c844bb6d029d15f575c2395bb85cb1a533a49930d34799337e8456df14f85704ac129e7db858e01854c2e8090616f19b5aeb3cc6d8e02344004ce0d931d8e1be1b2118cc77c4ff8f095815163b19c8c24a2e331825f1cef97f616956068d620305ad5afb6228a15d58eeafb344c2131620d9bb0f01884b03c533b4ee4781945d91caa78f5c3624a02e49c8d095f75fc42cba660f3e386b17a2c73169d8cd662c71fc0c19b663f824604bfb6007c3f2a19903984672568f67bbdeb09d3193ec4d6bbb54af6b8060294ebf4d120ede90ae37011d6d360cd6151be2e646fd24bffc44c7f10ca9d72bb6076b67f73fb920cbe4c46d8d507f9da88744c1d30faf3c753cb9e9e9dd69283045a796f9061a98667e7160e0c3c33f3e684ccd0106c872acc4d0d22cf9dca189fa0af09401e0054e1e9b94c22181fd1e8d52d20bb7b5ab4182ea24d5298f79a9336713417346767e216cc21469c2b7beed5f6e96489ea5415e08435ca0ed3bc9b0b5b2c366ff23c2720ec23af07e94046178f3333e827dd5c74c6901f3539f2e1f9aa3372956cd8ab14f98392104eb0cf5751d291d19a5d1e0320740ffe7b40e135d0e2e00ca4eb219388972c1aa317f27d53ae102ebf9dfa76a949e8ce0630cb36e609c767ea98f148d14c2045089ae84423b138222b49a2f067a50ea3149b8400e7a2ac97c80a195ffdde9353b91208f84856ece6943ff757ebab7df800e461b361f9bd1b300efb46007533ec2f56c5c36ca245d46545a1e6ce90b853714f6a4a5907df9ba71d2a741ddeebbc28157d71700db0271a12002aeef666ae6c547498be0ea716fc28fca3f90670500534fe7da9c5e5db7adf4ef3fc63fd71974b21b4ec21f5ace518b8bdb8ab5111a800f7224e823ce0336fa0c8b77328bfbe5ef5441b55a7e0e32d0a41f4bedb46538d915b8f91a5335493e7a8afc8a0368973d41658310358b4183acc32cb30fe30bf8e487e79cafe6e6dc386219a3dd0a5c3b05151df7f3db061edccdef8bfa086ed1124b9a28d4ce593da6077816d3e7b8a11bd046fc6469945cf19af0146342ffdaf4bec1eb0a1fa7591f3b31b5879179f8840e1d822fd5d006a34546d61d40581f8ae6a2491c23eaa698c0bff6ac3cb73a0abc8f3775c6baf543a256146e8011dddf064c4361895b8648780faf28e38ec0cb26920bffd40cd9b6ddb885cae737c5fb584f6f3c26c7f4fd26e356ae49eb953697d3d3502c4645c697b03e89cb39a9bf02859a2bb7c56e5f44014c59807630d6fd66e9a47327c954c12967d1d74c145aaf995a517d16a1f8ea2ec185a839e559ec97150d54a29aea29e6d83664ba427c00713803dc687d8801a4faeb15b7eff466ca4cf206e21cbf0c730f0a81e6b276a84943a1315ed9ab8c89fef1d22ba4c52a6897e7a9780de0708e99780ee34ba9db3204fa13c16510f0f78795bf0eefc8c7b59528602a7491bbaf8edb45681b7751c095cb3d94b03baacb346b7044ffb52b8dce014403c5a0418b8f8e2dfe60be020daa0234ef7021ab8f950c185a765179d9ede47b1bac7e781c139fc5008cbd3c612e68fc7cf05033df5f73120a18cd32ade1967fd145ed7ebc02b6f7a497387193c25e5c04cab6028abcec0bb33d3c14a3403cd7fa69a9112d16f3426bc1a9cd5eac1385ee80f5dd199dbf07220039b5855da138df0185d4d080449059000c5d6c3b18f2357ac3a971c9b3f52907e1be8adb335a800b046d522f6601e5da0ec2a00661a053e462c16419bb1a0c1a3d1aad566718d15b10ab8d91a427a33f38efd5b2c75d72412fa07169395f5a040389d86116676b215610acb6e54b7a513de7cfbd168ddffb559be970a4c55278c2c159d2bd51fa8b51f3844fd420c091ebc1563073590ba0f2d535c86703f818fd9ad5ca7be19480540c742f56a9f7ec85fabb5fbb65792963afde54681e88aadfa95fce07a7c92160054f65ee552a8d80d778e5ca18571743f800908b5c6a0827143adb29ddead951916438536e3a6914b1bc3b17cb9fd36e03be04e432365ec3481bdb0f1c46bb4cfd9a5690ebec4029b684d164b2edceda09b1c992cf04c802585e14c357f759a11a04bd4d24ee1317354a9fa446190741924fe16f2acea8e4ce43ffc67d7fc17950712ccc8a3ea9ca292b4af31a978caeca7c5f3f3822dd596308a64eb3b4e8f897dd4863d4437a31485e47c80420e0da644865330c6a6da8d2d0a72d1b44792e54e14b5c3f7b98554a984b160140792e9c8211b038cbc7fcdaff02c5fa95430a4228e93c1e61cadcd5da6c2b3f4da36c53617fcb8bbb9da317b0448145a9177b15c450cf8122654bb3ca6ef047b1f2677514cac30a046420ee2aa5e63afaaed8b8259aed4e2884d6e9d7e91ca5e981de9cf0534acdbd08955246b6388194bdcdfe36ffd735732b16c237edc021d31080360998ee63261eb35dd7924643c2d9474f094547c3b5946de1fa0266a3ddab3ecf53355ee3dcd054972787c6c779c638f44e14e2f28e871ffddb1b892c34ed42fe61837635870525cf08c22da088ac6393fe4aaa727a4e904d686d85f73f273c4fc77bfbc47cdbc3a487aa5179a9e01f4d4d365d2b17d68463c033c97e5c2e095bb98109dcd6252b70d6941a947e7857fa601745edc3977e60d22ac975a5e819ddf7698ff723a96fa39f7e77c88d8a3fa8546c4109fe70f8dc09b4d775d176f89ddec30ec870c597983435241191313e48da113ebd22272e302a7f8bd7a19cfcf13d97a735825aa8f35968fa9c78061032fc669fd97dba1ae79ca1f981dd31c221ee5a50e5adc517361e8a41d8811c11ca24998a51bf6c8b11026c28e5d4d90cdaa796f2e75912b9460648d4faa0e02382a18e04ac32877c7b41b01d42f5249b9c20bb5691d36e6b06aa2c7f31cc764c54e3f9a0aa48f844747ba28db0982eaaf1efdd859b4e05dd3f6d1fece58f283676b0ca3a6c7f6fd2a77715081aa2919027e8d3f71a89322978b0075871df329768878577eb297d687a1a9adfbd510fcb6bf7ae290c9ccf317fac92919565174a382c463fa22b9098a3f5295832c024b53584f4f13a1d935312bf9a4ce36d51a84c2414dc0b641bc55eb7e1c852643e7387b834490049ad88d08727ea2fdaa22264222d41117e177a11aecbf836093314b56e144928db2a26650c1b204a02582c592ae9d976580afaa75db7c139401c8542555940d0bfd8bb45ea4769897711a0c3a05b3e1d7ea568cc24aedc50e4bde285ab9c438a29d81a4f4f8c4310456de2b0e5ee9badfe1b6ba410a0ae68404890318a535dc88a84169c3dc03d6850b2838adee738c961cd1049d174f5d0c9a1251f25dfa237218fa0559445c49d0c22723058adc6b797229d233041675e3841eff6b7b73eb0a9019ac4ab06ecc9c244eae1ff2460f511684115c281a744e04cdcc9e4620d062e1cb4adf4a7f40eee7dc1b2df79b978a1a875c8e8fd90e42aeeac381d8f9be16bbded1dc179f6f735bf719aed019e996caee96a6026b23f1414b06fcf0c48c02b154c6f343d6e28e45cd0e1d4f962f05095d9eb9b696996bf427cd92e8fe244fc11ac9fe6a694088e9fe5c49400d52ed05e53e21f438a079348e14ecb760015ac6781c2881f396cb6ad982abb5672f555fbcfcb2b64911a7bb609c5cef052901bdb5f6cc40fedc11794237b4521a8d82604bf80c6292a960646c68d0260927097276de0bdb0e149f13cd7c018a5cd8e3e1e72e4bb0413735043f292267b808eb084a84987e6b1add11169009defd9d4f43e7434929a09c821ebc9ea3df11d49eaba1a870aeef5ad90e2418e96c8d5072c5a569fb551225dd4f55e15985649e189f4122cf0f79b4e73e457e35f3edc979dce32a955c8c49e5a025684e8108cc572de175141a8ca1842820ece16a722f864c3311b0914c1a9563b17e2342f241a94c1112c250b3ca1e5218feee3bdc7687d6da95e775bd83cdd9ec277eccc2c8475b23c19635e04cd016b16f7f50e372c1bff948d2202d2a5cc9c0eb293d4ae29b74a52d1745e6988eae73f07c69b9c95ad16d48deb9e658adf3999a672143f871aa59430fe23347a12bcc10dc6d7107f774a2d8fe8345fd46520d7625decdf47c420402803ea91f08f169459a1e5a0a511549652776b19fcd7d10469d71983a88010545dc105f95a35ac20471a8c758adf48c700705e0c2106c1e1ee3e7b03b027626fa9fc22c16397c8fa3ae868e48a5635da214e2b33ca6b8b5615586917324e06e8c38646d501cab2195cb990823e0e6bce67b86321a50407b686c4c86820c9f1c0120f3bd78e9704b158d4d327007adb761fac811d744d7a8ed9337376831c6c5388896149e0095b96efc722831933149d29990b421b9bd801c6bf9e77d9b18b6be9f022c1f31baaf6771c712b70d7180075657eb58bde1fc9b540c25bc8ccb8336b06aabf7a3eb9b6959b42ab644e443e1cf158bf86d807543582b5651fcba22a3f28eac4d23018edbf99ed5816c6225b63bf638261cd878f6e2d82d510b3e25e9f9dd1946066245dcf1b1ad4dc0de147cbaee064c2822461355316f405203d1cc7fce9b0b543833c026bb7e6f4edf1bc0688a7593a9b62cf4d8708c9086a6edf3e4e413149c6cfaa0a35fee57a873632bfeaec5939691738e0c79474d91cb7eb15a2ea8647ed52a168b729c0bd69358193f89d58ad963fb38c9f01be7875724ef3374a9f87bcf27eb197abccb27d4300c4de15033cb8b9e5f80be3d5269ba65e9602af8377679ec62755bad8971b2ec6e33842996fd9e467ef6cfe11b0837fbb45703335bc844268ce19bf8c559894c8e4525f1750a619a90fdeac83b846ba103bb797d6283eb65603d4f0f32dd55b4d3975c8c0a0d3902fcc5cd3b90ee19e00f838410d090d3f4aef01220e1762d974957a357281de77edd6494566ced745485a77f3de672794e031da2e720a242eb918b5832c37a68caae47dc6d39b348661a471274bbe12bd43ee201857f47b3afc2352468df6ee7f8a6f41d439b5754660d0b76892f939d88147b48fb3bc339ce976e66c9f8afbc1da3fd790b8423cab8f43f9f2fb7876233ffeb9b5ff9ff36bdc3842cd0f672a5b1b4873269c6cc7d0cb6d58fc1ca714f7c6929f0fdaee4d68b3d6f051d68dbf199d4220887d565768ee55ccd6080e17c3f8ebe2baf253393915dbf70f4f63f448a25544ce7173aee7c4803e9991d52599e927cd70fa7438c0b20338ef182bb7a9c82d644ded3967b46dd382958faa3b0e09e2d668fe5328f9e1d657832fa6c9b916dc0fc81e84bf910ff06a777d0b95309f69f71768ec348f3bc30f95aae21635e964b2e2ae04da58e7bf7e8833d1a54ee8087c4ae8daf81240eec9cd0dc1e681f975394ecc4902d44fb8f6e63e86c5fd7acb632fb00d48013f1bf7c04fd252406c545e8d7b722e434504308df6071c2626832e6dcbc19a3f050acab7af82f14a5151d10634240d2e7806757f776ae90875c1b33c659264906aea3e0602a10ea5dac870c48fc2a4e2b7e6752a0bc97d1c23c5293a4a92ac8a4e2a6031aa96fa1125da4a37b55e3039150b1482cc212fd5f0a148ab88c7515f10aea015ff894fadc359836e7fddcaba2564e6328f5e970c30a4214c7a2302329df5dff71f1556440fe1bbdea38d2614c624f34c1a8e8a1609d45453f683c208013015889201a6085132795d0f0986ff4ae129e96bfb66c9c9b818ee260766161234e5737f0589e0da107a73780708041ea23884d32400865dd84f4f483f12e2442e34b57a69cd19e19511a749bd4293038b43d0fde25086e0b8151ed48ebffa6867edfcc896dcac501c4fff71c9abc63be3a7ad48c4da78c78fd2ee8ac015360aafb7fae76dafb430a68d4de4cac3f72ba22d7c54754d882b08c3f691cba8dc51c3f485b00d712f1aa92c3cd5660c25525fdab48b22430a0d5ca72a2a8c840424c2ffb2046758ad1663ebf00d3dfde092c9c34551b834b14876b8d14fc832e095d54dc69fc83528eeb3e0e70ab1f89b71533159dab87bcb90db905f05bd76304478336092b2daac1a8ed2fe9e7e2ba91e4bcf7708f4739a318df751809e4f264500b664c244ce0cd8d5577eca2b1fff7229117dcf8f967d0c58b774c4a69e9b169b0674018bd8a1c7ab6cc15e5fc07b355ab951862b016522584bd6dbf9454cbc07ffdd9a501719b63314b85dd103ca32119b9d2afd955a48a478f12c44e22e64062640407d8763099e13d9989a62a80619124ceed4a1e408c9501d89bf196dc9de051540d18ede1c38d2d0686824ace0f038d18609e4626aaba4fdd927167003751c840f51869448859ca580592062ab302913b34cace8489d763c7970cdd89d735650e762e4a6207872d8e4c5cc404089469d3a1f22fae2929093b15c3410b56da402bd1f74403880dbaa0d75ef1c203d8c3269a78c1bae558440e59693f7c7994285a63691446ca92c0b9a65f98dc66bc6ce71b8b6b0b6471173d5d2c9ae94265c713e6492c32b7145e0c63303a24c7b19b8180a6564c8f8cfad5cce8a56c084997c108ea5a495a3469ab40a95cb5f3bc20844f35930fb518be8636e7bc05393d61cd01e6dbbd6f4663dacfb4657f0c429242527b475931c219f3adacb6fe0e777bdf9be46a6990d98cb64371a00b0b20cbd66287d10c5b805620c1a1e67c9973d3a0f4c3db9da747eb8831823e77b70c5e5a3eaa238fc7d523ab90efe210e17db571eacf5e11b459bb60dcd565531b690c2e3ebe2ab91717a9357cacdeae625845b554b3505139118aa9bc141791985c95cc9c6c6df0e2f3834bd82f45a7471d39a5bc8891429ed86dae5e431f88db0751a880724b2f4ffa711cdcc12801bc380704474bde72b09a826e4194673b1b931498962cdab583a75d6dcc64ae13c54f11038cb6a6b6b711aa2ae2e4b9f53c43b8549894df60744134ffae59c6dfc4ef65ed62ba1dec1cfbb92c9c42bc99b2028818104858db8d4b56ef2301b0424a3f3c53e16142164bfeff31af308869be02f97d18cb0d5e3c118da3fa904cc471c1308adcf8d2167cb702bedcc45b0c3860f26439ff00000000000000000050b68d70532f221152262995ab966bae995c524a29c99422e1ccc4875fa5edb68460c4a733139f6e860b030c390c760c78b09c494ec8a1c3893ec452a22d9394b9cc261a114566966935d19c06d5713bce44e73d5659f271fd624cf45143835c9bc5a4ee25da5c5a74feac5aa20f971b3b273df221a5128dd8682a58f4b21c51a273139a3b69929fe24da2378d899deb137d3349b4952da2740e4991e834c60c3a559220d1e99141759812d2f547f4612a9fe3a93476ef88ae4524bc9cffe5896944efb96743275599a930a24b3a87cb51646811cd0871add135a4887effcce55d3e99104189e8c4ce2713555e3ef94744b355caa4c559bfc4ff107db0ca319e92c4757e43f4fb2d41534efa2dba2f4427353c9ac8c4f03dd50e0210a2891192bcc5e936391a44232f6bcf7f4934ff05d126119e636350cdca04a2f9d7a099fbbc64ca01d16acc9916fd43ff65d9af4bf603aa928a1327a8a70f7d5e890a9b533e74f2f4a568228eb4b69c3db4d1cdc2ff4a6cb6901efaae9c16c773f2d0c9dc0d1e1a9faf92158d9e11be43a3e2a6214b6a87268b349dab415cd0601d9a0f9572ead1143624860e6d9609f3f1fb1c9af192123687e5d0a6146724c8e3d06ab05033571d0e9dae981f449b6f68444fe88d944208bd1bda8e4ba9c974f2bf0d4d32a5b1d7c97a52c4d9d024a1ba122deb6f29ada1cd399e69a5901a3a69315a657ad2d0a6f82e9ba14143577162cef88ba0397e862e5e5222425a879c743334261753d2cf96a1cb0a9a438b640bcd92a1d17cd996f817525cc7d09e6b454ba68aa153ba51be4f8c7c24390c5d4c5903437f42ce6c9e13614ec55f68433347916fcd8dbdd0e40f6941a2a90b7d4c1621ac8fb8d098eb05ad934ca58bb6d004374f9e226a10eb6ba10f79da6362cf42a7930a8ba9932c75c642231749a8781df1c95ea1bff8103ba7243d22b542138378895762740c57a111ed92943dfe679b4b854ec546cf26444a8029742a7342d0c87947ef4a0029f429616236dd18272b254014fa3c154bc9a4a29e7e92005070c26c6e51324fe8731222e209e1bd9e7142a3a31547438813af6d4233aa940effdc6832ca845674598c878514a3b8847e8310f91d65fdda534267fdbabdbf6512da786145a6ec49884b12096d36d3d89f7384fe554350e12d648bc908fdc611bf1b5bc373a8084ddec813a1df1c3c84d9300ea18bff9fb3c8ac10ba0eb32ca1ab3fa31684b65382bf8a90ac124320b4de9784cc48cfcb14fea0f7124997caa5647a08faa02f1ddfa664a8bb4bb007cda58cc9e61782c70f0fb0f0f2a9e46607fd88f87ea96f8c2946077dca216e0aa3a324ade6a0d7ec17374ee257a838e8ccb47bb0c8dda053d662293fe308d9066da728bf1e362d8e3568d722c5bf7bdeab140d5af7183dc6c958252565068dd01cf9a49541bb39f2e88f244a3699741020068d8ebdc1cf53e545440018b46d32c4178d79ddd02b3a3d967b22b2b67cde155d9e96f7ef8e4b8fb7a2f198543ee539f9c8282bfa8ced2f5a29ee98b98a5e63efc99c2baa8a5e236f4e4eca53cebb54b4a76592620c7a4aa70e15bd8a5cc9cf9b39a7ea4ed179ba4af81032457b525328f9300d1a548a2698a8d2314519bd3f293a09725378348bab9c51f4a7b1ff57f96549154523d4e408abdcf26f09451b418a5e453025530514cd27b9415c1c99e7729f683524654177181db39927ba103485b80eeb099b75a26b8b905b674f64d18c136d58fc89a39a3197b24df43b1f49bc57e7ae4913ed868eb154a7cea1fc4c744a868916dd9352ee31d15f897f1e9dfd27379768a3051d662ccf7c8c2dd1565ba7e69467547eab12ed6e8879c27ee690d5a244ab2722c2286d12fd470c2a9fc820638a9424da0cd9da37c9b0b84991e84d7c5ea58eafb1814497fd3548b3a047f4db1f6223e71dd1758f5e8fe137a28de0a9e3c4927e4287117d26a57a6eb233657811ed041d9a3169b3a0a6221aed73517f463ca54a22da142745ec8f1144101d320e21c310bde928ff1fab2d558822d081001c6274a1012e443f5641eeca5ea47c1e4274ee5e3aff6bd4242e1f442b226444919d2c45cb05d19ea7ea509fb554490e44df139246113235f29c80e854a72925a4977fe892ef494bcfbc1816f4436b9e37fc2285bc15bb3e3479c62c7948e2433f314ede7032eba5bf87f6e2e34378afec95313d747a6290977723a98e2126230f7dd41232f2f8285d31660128030f993c799e15c8b883dbb1640a793ba5bce2d0ba91021d62e840628c21012d2ec0c5165a7021011d0887185db41e64d8a1594f42fcf8f879c9ac729051873e893e49ba440c1ba7a143e7d12d053f8fe995c27368e2a4185d222487fe645e891e3cc8c98771e8ccf2344e67103a94e0d06bec983187e0a7cff386b6fdd37452c9bf6237b449530793f8ba1933a50d6da96efc19d3552237196c6836aae690218e12c1926be873ce0f1dff5455c48d1afa4bc2577be2a6d2a4928636c94c41521c211a9af5107a625495bc0a51828c33f4a6625cd1f95c1966e8425e8a6f49a4d4293f32cad0c46c39f9173c4c89cc8020830c6d4c8ff7320b7111b232c6d0c7c821549f7a9820430c6d0525aaf1a67aac471b9011864e5f8f57a4f49c1d89046480a13f1984564e59b38bd0e2d05a11c8f842a35f257e061de2d0d2314618e6850c2f34a9a2899a846839775090434718371e8c2e12a914a020c7086474a1f1a8a7a66224a1e36cb8d088931b352eac6424790b3bb4d085a9cedf101d396e888144508a0132b2d07f6a92b137b3e27832c70548065099800b32b0604c9a3de410432f088716d2a132aed0c67039a7c5b3fcb37931c8b042bbd639859cfd163f4755e8af4ae59c10f79c93900aad85a4a344472efe569203c438850419536833456b4e7a253588480a8d56f851612f4a8ca58b4217c5db33fd342c89070a5d578829a7544f2ac367011b9604194f68e59330a9168459eac9097d0a3263eae52b1b434de874953efd31834ce844fb5c75f00c2fc19cd254c6594e5255830c25f4294fbe6cbafb6bc14d425b122cbc261db25807454106125aad4e3905cf16e36fcc0b328ed0a7fc5c4ecc20baa36484f64dabaa9a4c9256d922f4a5216979d0706865076410a1755133d7d9d8cf91b34e903184ce34c787c5149b31d607e016640801d7d1391e4279be202308faa6cae0bfd973bad80146173ac4400132b3810c20b039568f8effa5f55c19c8f8810c1f7449f96aeec8941a22d783dcf54d734b2a2d62ed810c1ef4fe1d3bf27ceccc215b00193be82ae4b3983d1d5e1ecbd041b92a89b01ac7a1750361117b818c1c54a634c78b1ccb760d0e0e4b794bc8c999ba01175366f44c670eb141ed218324cde1f5ac014ac5d5c91f3eae458e068a059f1c399508ff0cde0ff2329b52c1e2c5648088c972ee16ff473262a003193068e4739041e7d419296eb6308057f4592b6ee8260fd356ad0d0370455f29c39a94a8b1c3005ad1e76be6199544f64a9e156dd0294f160b79157d4a35d91e2d66d0a043017a30ac06a08ae6d275cdbb47a968cd4b08d133e319c30815bd97ecc9d925c4cfcb9fa2f791215f3e5d7d423da6e84fbee82827449ea09e5234faabdc433491b2434e8a5663482a35e5690eda1d45bf3a922db455aeac54147d6c8e6d4aaf8b47eb42d12511672e454ea9a414289acd6cb1fc329fe8b74759e50e194b764f304ae7a9bb5b48e94497ab3d7c99eaa0548713ed263d9a4f24ab8666138d7b1c11091651249c34d1a8dc6591e44299683da8fcec971e139d9e33cdca697e49e82fd1b77f091da2ca966823b8b7c6485272f2af44bf9ee12ea6a44a4a3a94e8720af33a41ba856ace249ad7a495f7fd2f825812ede6df94274e10f2b189449743f38e3ea5d2b73590683c5fbe3eedae10d123da9491e49ade11ad56bf09f7110f136f441774a78c683ec8cfd193473e3f7d11cd460c41a307cd5739574463c16359325922da0dfb1b3e620c22248e885ebcbc2fe40d13171da235cdb816ebd0317d43f4a5db5448b9c385685306939733c284e875f54c989c9064d41d44972cc87c69a222847105d177a624947e1888e684a860714b08770b203a1d4bc48ffe484cba3fb4f239c69421a414b15a3fb45f2a7c96dccc6b22db87d62fc495082ae6f3203e34c954e359b614f4a4e81e1a4d1fb76422e899a57a687310331797c943a34d6fe515912a5e8e87c6b5db9350f9743b9b77e874d09682bac85808d73b408b2d74a8610076a862a96c1dba6a0ba1225bc52d291ddad4598379a8acd9e21c9a9131c89ebfc4201739f4e1736a0d1b9271687484a6e8deaf3d51dd420bf48547e046e998c300e0d0c908c264e550ed13e50879c93b8346974e7919fe3d5b9441bf61f353cebca1e49531e882a8ec4bbd2393946bc0a0790d317986fc06112caf68fb2afc53e451fe9e73457349638b127123e5c65ad1ff471232513f5f6cac68257ea96a6f644991e218d05845133b6913396a9d31521aaae83b5e7c62ec502184782afac8d947845538f405345091329d8bb02a3a2a624e51a9509a835032856f4d61c9f709d6e6f9524ce1d01a63c78dcb2bd028453b3ae5727bce8d3968053448d16fdc90313b249d80c628fa14429097b99344d14bdc28b2e284e895a650347b315fbc1421090b42a0e833f6cb56aea66cd27fa28b102be5d39ad34b773cd168eaf67ec862dabee9441f83dc0da55330a58286136dc89f29e68fe926faf09194ce9a4bacc55413ed5c6c5cf0d4e82195996894ca16d6847a7e250b269a54a152120b3d11b772893e8c0ed13a8b857fd059a215113544b8a094f694ab44e32a3f2b29ec9baa1825fad095f11c2faead6293e873c892fb7c4bfe0695241a11c28c6e5146a28d19496a8a7e793ea520d14ff0905f642b7e461fd1490aff2235471cd1af875c979ce9dc6c6a44ff66d22b5ed062298618d16adc0e594f2d58febf883e4664fccb8e4e123c8ae89472b118339944b421c32b2759b44e798388462ebc686ade492535876825c551ddf2734a99d810ede71c32337490da1e2e449742c2c8d8da2e965f42f4311f7d472b74ea6607d1c9a98a9193eb7f8657105d58f776a7c8494bdd40b4a7844ab2c25593fc1610bd774fcc3515fd43275f9edcfdaacd34e9872ec9207489604169f7b10fcdca76e9705163951cf9d098d6deaa7c1167f7b2875eb297b785471e1f8b1e9aa04310dd38133f57c943179f41881899332152f0d05aaa874e22b3a606dd1d5a932c92475b5288ddd9a1fd28312611c38ec9ecead04b4e0b1dda984a44c9d493823a872ec810b26aca1363767268365267341125f61387e67a43fed81ce4c954c1a15d134ae7506e32c7bca137f552e2456e68b2f985d068431364b2ee34d8d0c7cf1446a568a9800d1b47870d1b86c61a1af170b1c4a4fc5f29357495e5d473e4a791862e8ed08c3fe71d3e7768a0a10b26e4e2b958c915950334ced00809a24d05115341af66e8f46ec8570e27b44d331a65e87268cb9d2594c8d0b7c829f738ef33513486365634a1734e0c9d102ae5da3af37df330b43155feff14f62a7a180ccffcc7d82933fb426f71beaae48fbcd085ff8be8dcb6ecf5bbd0e5580a2172ce123a72b8d084f7af7ce6262de4660bcd9f9cb948aa2e3967b5d0047d2157b6921254a85968f674e65ce5a9543c5868d35444527da9ff54f20a4d88215629e1a7f9336885fe4c72cc2749fce9b80a5db27899c5a45965b650a1d3df2c5551a1334345630a6dd6d88a112a86578ce2d0000d2934975325b1e1270ead3072847117a011856635f4437627e9791e0afdf649d027312f8994794297b3b46aba7545729d861352f2420cd79e53f031510648701cc717349ad0cf8b8b88cceefd3fc390001f800613da983a4949d399e3489797c612fa8d1223a89044c30cd05042e79daa3c4f4936f1bc52804612baceebcd2fa1bc7339011a48e84ccc8b9c059d12011a47e8b46679cdfb15d3214618348cd0e78a92a2bd4774928be910230c1a45e8b43358b61cab92de6ed86971012eb4d8428b1d630115d0a21c0d229c0d0b018d2134e2da9a37c72a1159444308ad64134a5588f31fae5c2e3482d048b4a044ec530242333f39afda7411e8c00d44e3075d98e98a97fce3835ec4f297b978c81f353de842bc95cea8a49d3fce833e83e4bc7d2525a6ce3be8bce285f56b99459675d029e1291a4a8439e8b4efe6133f31a8f0200e3a91731df53fbc419b8467b05619f58a161bb49dc3e5f9a816ffbed5a08b2195f78e94d0a0411783fcecee4164e28e7068654280c60cdad21d56ac65c4aa5352a021833ea44a4247aee7f88d8181460cdad53965e6a5e22b7868c0a091959f4b775c10d0628b19af6884cc12b5e59289fbaee83d82aa0a5fbf98458fc28c56f499824aa9443c4678133f61062b9a8db2a231ca949cd0f32afa102f5752d7b24a8c5c98a18a369eae5012c4469668494517838acca6d76254b4132ce3d293c82f2d3a4527eae2a34ca6683fa4243d8fc7678fc152f449c8d2514d2fc8c896c53348d17ac5a434e54fa36855731cb9fd6172799228da377de2329e50b429c9c7d4a1cf64c4048a4ec565e8a4ed954c953ed16966fe91542a0499234f349394b98752b9af32d4892e8ff8a6d20fb9749613e620b92b3dd7df441b3474faffe9d45c794df4df9ea3a5b9cf44a73de639fe7638e93d26daa047b9bba67275fd5ca20b226bae14c734e5792cd15c67d6cceb0fcaf4a612ed9e1239b96729d146d2abf81b29a6a89849f4ad2955d3c3e5a4c548a2c9ba61aadc538850994874299798ef87204e7c8744932b04a12295d0a23ffc883e842d17a573ec8846e8e50c16b2e7fe146e4497a2c8d78fa5abdd614497444e9a5bf9223a35a1b73a4d6f865711bd883f3d5a64630433115d88b3612149256b8888ae653cc518df1ea24d517cc3b5a486e854eca0f943a8105d7ed027b54fad54274497d474c67304b19deb201a9993bb44251149c754108dc9351965f925bb28107d060f49ce3c09882e734593964fbafa27ffd0990c1b23ef676a0cdf0fcd069147e288b10fcd59a5f8861ce67f3e74e5a32fef779bbe690f9df6ced09e93450f9d7f0eba3c7415e4e968a1644d670f0ffd888be23f27b9431f6b1abafd21e5d2cd0ead78d2d31b2775c8b0d5a1d16f72d62f3bb352a343a73766773859b23d687368255b7e08a5ef3e1a39f4953108a51d7412afc7a191a941c6f0339d4d2e383496bb246ec895e4cc7a432f935454cfc6c55829377411fcb3ffa9db86cebb4c3d5b8fa6c9d9d09526616e4166cb29afa1939dfb63d8ae9049a786264cfc3f2bffcf494566a4a1d14969cad0d5a341f5fc27f3996df2dbc08c3358ca5f92ccd133431f834c9234c9b7242a2e43173a07cd709adb2544863eeb86e49be2d93cdd3134b9828831674ee5a54731742245f95ad09da83bce0843f396645f29bdc0d06a32cb18b3b55266d5860d2b75a38c2d31e30b7d448da115fab21df142253e355c62924d000a33bad0474895d52956d352870b6da7d6111bd74555554e98b185265a4a8ddf0bcda7a7161a99a4950ead5099d59d00175a2c614616fa182f795e11c9a23d6406169a9c440a191d39c9ed6fece882675ca1934965087a3c85883da21d3b1060c30a9d97ec4a4273c4a185502236104a082d408b2db4d8f1c8045db806b4b800175a7c9143c7022080d002be381bb051829851853e86a75ed8149db2ab54682cff5a525e1a2761c6144ad6eda13c6a3b430abde6ee20cee728f4a1c3c714d34406612a7985195068f63c65e3a6b25e154b3ea1fdc8b137871d4d9d9113fa8e3342e68e499b4c6c46133a4f62531223fce3996a06131a93d71f13a12fa149a11ee6c2cc3394d087a718db39966e4bf9c1f01b6038f2e224a1d1399c50296f14b99a0e31908e1b3b7c89aa6006121a6d49c614adccd1e469a308338ed06aee1d13396f7efc75a01b67821b39c4b8f1851a6086113a15a33f06c9ae41049122b4496c0cf135f90c22b4f29f2225d5225a3a3c63089d8821547ecd1ab3f4c30c2134e143d22cf9307e2de9c28c20f46a3274a7e89e932103843ef655c34ac90b8f976961c60f7a0ffb5b1ad9cb4798ba48690c0b6871012eb4d82cccf0416b2208615ad4638e729961460fda9883c8e4dadaa139491e34a632c7558920c3dddd411b2d4db25f0e3ac6bd7c61860e3ad91ea14bcac45609cec841df514b05cd1f474b8a8d91e30b04bc038e0a3370d05848885be2c3f4479c0427071737e8f47cde2c5968860dfad6fc3e092262c3860d1b336ad00757f75555519e940e0ead52efc518397058c00602038c77c00e04d8b011871934e873a7c6ea9c57d3858eb30329e046b92d2a123366d0c6bc273dc6fedc321af3c2bb1043874fc0868d30be385dcc9041635d962d04a17328ddc1a1e545da80c38c18343a4509196f3df23d8e61980183bebb3437e5a49a8000af68afacfbf286a4c04000577422c7fe514289e01508d08aae4dc7572f95c895455674aeeda743dc18d1bd3c8157c0a8408055b4336f42e84756156d3e19b74212226cf46e0a04484593f28ce90dfe95f145a868f6f3a7e56e1e93b93fc5d539c372336f4cd187095fb2791d5554b414cdeb8fa9efb99fffa4e855ad2be78d19456f7962f3b4ae9aca45d197c852d1393f29ab48e06214031020149deaaf8ea1d9c1b40914edeaa50c1d4fa232f4892e88b9ba0579a24d21e62355656cfb9de8fa7d2ecdcf0d29038466b642363599848c10fe41731d7cf57a4b0014c1c3075da8ec21973bf64689f7a0eb2b4fa5e34c04bfea0618e9c6173bfc04376ee410e32e011e3c689347fe3c316208edb2083c76d0bf5fd8f829c677f52e21e0a183de7f740e9f57628ff75b39405ee4e6e6fd49e280070e1a89229316f7b0a1734a0e8f1b2897493e7e26873b76dcc82106da419f638bc51d16e0931a810edc780f1bb43b49a765f9a4f224c9171e3568fe62048bcd79a2e762473c68d04bc816f2573ecda0cbafa43fc5352b48f2c1403ab2011e32e88265f11049e2b5cfa518181ec68ef68841d94327f3881fe5e49963021e30e8620c2b2739840f1ab289022c5e8168d39cc3a90ada25577c41c5825289be6a62b6a26b59fd09ff254398b5850d1b58b0a2310b41c97c5945eca05574216a05197e93767f5f154dea544942122dbe2927155d68cf23e737a610ad838a2e8a5927f3cc293a0d49afa710c2f6c7148da9cef1fb82be3029a568be73ccef0ffaff2a52b4bb2e428a7b4c8c12338a5e247f56f5ecf1098ba21db910cf6992bccd5074228388dae3a9d9250e8a469388a216c2fa8976337ec89db4ea89c6642e95228feab8aa76a2492943f4f2a5e6c8414e34da5f2a3b8a36d1259913c1e3946a93299a687ea2886fcd71c2b49289de6279292123248613263a951043523def299aee129dc590f2c34b0eaa9bb3447b5daab4c5d72b1f55a251d1efa1b2e831cb29d164d5be58ba197b379b449752a4caa329e49ccd24d1a8fcd3ff9663849e158946c5ce105462ce59830589ce2d798e1164e754cf239a89a653924a93a3e28ee873d0fda45a6e4493b2e5fe3c9349a96444a3fc7a4212f9a92b23651cc062116d9752525ebc529e7052449f25ba7ba90c7d4a9712d1cb851931bab3470e4988683e450f39b66ffc5fe8105d44d3195c945c77fe8638cf06b5d41bfc42b4ef293d650b5e96ba274497297a336349d2977406d107fdaadc413559c81e41b491a39e98ac99bc4c138836e389fb875acc9706106d3811bfa3a2b793ef7fe892e7e8568f15993bee87762b6910cd4c3a4cee7de89412c974105afacb743eb42967b71ed17c0f4dca622a59dc949265590f8d5f4ab4e49554a8ca79e8a34ad2de9a63f9a6301e1aa15a2169921ac33dbe43b319e446af1084548fedd06753ddecec6f1ddad33d8923dc2da5dcd2a1b758dd31c50f7164b7736835494e9ea28faa92550efd878ddd269a5e22d338f422475a6e88291cface41a58494e3417bf20d6d26c9515bc3996c36ddd0284d4a4caca06c4393942e29ff95f3f609d9d0e7959baa0c4f9d235c437f49b397ae5852431fb479c9f89d34344a89d0b31c3a61356868478e7814613924c9cb191a914986f9e9a07784c50c7d90223c7e78a50c8d34ad294ebfc28855c8d0c7a7dcde224250b1b93134deff95b25c0e49cb626892501ac943626168bd2b249e18fdfc8881a1d1d93be226ed17ba1875269e1691552ae585367bdc2fe3448af9ef4223ba99f3f904cdb1e542e3c1f389cb8a2986ba85f63a9f90939287ecd69fc5d5cb42bf63a583b21054e72258e8944a7a711227c8a57e854ef58256f52aadd0464fa151e52c93ea5555a82b5388ea8a23246eb0a0c21731e624fd5a328536e54a951e3156101596421763554a1a3219854e5dc4c7532e442ca0d0ea86bc272a9aa1ac0b68b1851618d062025c6881c513da5425d42c9706a1f777421b3e8c70eb0d5d31dc2634a393d409c15bc4659009ade5eecda1fbb20435bea504b150426b3d5163fea5e0d8e138ca08b048429e642de6df8e98151c5a6bc34602c4f84205293881ea000b2458392c869c2c5f6b18c0e2086d853699257c238c66bb8085113a9194598e31e5645a2fb02842df7dc253f909716865a1cf0106b92a6041843692afcc66cc7952742c86d0be8664219f6c080f1ac90010b010422f17f3f9f589b39072b00842df4179cae02f22a5240384e652095df2236b29f1f1c2c1d081709c30c6b841821c39bc50a300175c618c41821c39bc481360f183be547b09a1272bf9ea3e68239644cda7e7adb4d98372053da565441c5ae5072c78d0f705f7602a23fd33058c1b9f438c2bf4392250168b1df44157e63ca5935b0e0d0b1db03fc954f4cd7bd1058e73c30a8b1c18e5f2e9b01f0ecd2d5e011638e834a5d4a194562909c1e2066da9f220a784d0026cd8b06163470eb0b0411f37c788596395c58b16163538011634684b083d4a6f78fd8ff919f4da21456413e2a44706ed9f27b18a2443ac7962d0652b15468cef9f87060b18f41624e6fcb1bd2ab4fe8a26aec613a5733e59d9155d10492967fe7911416e45113ee82c2bba10da8348d1a4abe83c288de5214f55f423c47742f2f60e1f53d17bcc0f0fed9cfc840a2a3a9963ee751411e1ff3b4573dab26f95470e1f27a6e82d8444f9e0ffba41c74bd1c7e5acb06e41ac9aec62e4c85101e4050974200824475ce8f80202c50f3548d18b0c1646c75122c5ebd8b0715f7c7169a8318ade52ee32310f65b2f2a2e8373fb8fb6a26145df6894144524a25863828ba1c62a4c9a0c37645ef13ede8ca37f5a4e48886788299ecda49e4d87d42a80b1d62dc086387d6e84413c4e485d3514fce8438d14aaef28cc993cef6d02696183a984e5551239ae84fbc48f4eda44cf451fdd45a334d634831d1097d1a56d979662cbdc41d2529a53b9396e82bf573477552b25d56a2eda044ef698b111622253aa1cddccdbfd4534c27d127b5ac21ceccc6e88a249ab1923152e9887953b846241a354bf9ca1a8104712756a612b9b1425de8b800171010638c2f7a50e3117dbbb5a8cc59d67044239b42c4f14936a233d3f9c29e9c117c127d39999984013516d1ce8b4596185d4668460c2482d5e2020c48800250173ac45004e36d310491f3d7d3d648442f2abf64be2aa9983e227a8b63b145f3bc9fd2146a1ca291a0c3045d33d530441b4c467c2bf9d9494c1c7a81137805ca4ee03ab6a85188e637c4e8df3b3b21e92d00011c3bbc01cb11e8c00d07d420441f34a4c68950422b2583c8c266786c9cb87690ba41e4a87395c1a1b5653e021db8f1811a82e8d4e4c9a4e3b77c72188756f6a146205a9d90ccbd43898c311c3b74e43808b861c3068e1d8ec34f0d40743a73b2a4eef590521887560a10096ea8e1d8e1386cd81823470a9c0b2e50173a2ec0c5413a6cd8303f891a7fe88476b8603968ebe98e1fba70b14b5ea48c4df79450a30f9d502109edd827166af0a1cf39d9dcaf9622e6740f8df6e438dd64c940156ae8a1bd545f0b194923d4c8433ff192484173d2f58be2a10f0ddf609a4fc896b8b450e30ecde44d9196da543c78a850c30e7da4b6d8217a6732bdedd0620b8d428d3ab4a6ffcb2bbd52e4cd1d40873e8e0ecd5ba184428d39f4252fe8474fbeebd76e71a50935e4d0e7ee5c1924aae61cd21a71682f645a37767461c38618fe858e1ce9c68e1d48476e0a1677ec68410d38742ae4bce6392bfe451d8191e3062a7b408d37f42985ff203f67e35fae43045a1b810edc30400d37f461c6638b28f164ba7e81c470400a5c870e042ca0025a78e1857f61011b36a450a30d9d4821754c5bd631553a36d460436f2124397f312da4a425438d35b4d943bc5852e48472bf50430d8debc43839a2868f65e1a2461ada0eab2e73f22772f020e00a35d0d0cca450fa3c892cdfa633f46e3127a14d443f9d213334db2243a2c9a4f1a252863f9fe651d10c22439bc2ebce5f8b248bed187a0d79aee27ecc4f591543fb95fafad7ff8459320cbd7f0a51ba5bc206d9650a6a80a1b5b49463424fd0a39fbaa0c6171a8faf4a1ec642cae1e4854e24cbcb16235963475d683fc7481aa4999e5911177a3359ed137d0b6dbaa7e9a8b31f63f95a683f9a4af2e36a76cf395968b3e7318d596eb147060badb748133d7abfc2b961dd55f2c60a9dd454d390f3e51f11af4213f2a7104bfb460c51a1d1a72a6252123f65134fa15593e216d264c977a5d067898bd1539a984dd928f4216aabc4de91b21b28345ad3236b109fd0891c8444afce114aa64ee8e2e98424749c4d68bef283101227e6984a2674a253ea650cad96bf2131729800083596d09507195436089550482a5e98842e279167d9ed994253366c64d540426b4ae8b82762ca11bacae415f46b2795793142a3be217e8250312b7245e8cb532f75b28a087d0c2179966c1922da109aa03acb43e990292324c7a82184fe948a3f99dfbe210705a1cf127278e75fa476b106101a2d3a9282f451991243d4f8415b163e3e945c6af8a0ffacfc633959d20dde4182c3841a3d683c926f92f152244d3a0f1a339f997829e6e70eeea08dbd99b49ba7eed4920efa93913a4ea57e901293832e457f2a95e24c7c731c34da274f7efc4e51547e835ef46208d1bddaa01351b73a5bce99c3646bd0c520d3725ee4ea8569d0ae5b14513f03b8593ca1391152ecdc913585127168b11a14b27042133e868e9a31c6e7087143164de8d772440cff93831029280b26746e2ac79c5263d88a1f8716fa1b29d02186e1208b2534fbc164c788b21dabba41164ae843e614cf42f6d7cf681649684355aeaab2484a7e2ed1900512da99ab281f329e8c1a1ea12f8baf9a9465c6b89e11ba4a1d728ad3144b462b8b22b4132766f352325910a15172367c647e4c5163590ca1d3277d4f86491142ab3144973c729d9f651184ae544bdeb494ef421640e873654c0e92b479871147163fe8f244778b712b654f49163e6843057da12a48d3fb8d1c5f8e90450fda7829e9972cba4c0861da220b1e343a2853f23a2485872c76d0072fa5c2e99139c4ec571db2d041bb294ad251f368b55b72d09a0a396777a99896411c341b515312b92ac2c7cb1db2b841d721c886f5246308b3dba0c9331e2983890e59d4a0cda43de59d9c3b791069d085270bafe8311bb1356431833e4c5e632a39a9210b193462835e04f90e2792c48b2c62d05a6cb6f08a39ace793050c9a512677ae5d827ee83a848f5774512de57dd179235a8643eb06187e038c1c27b8b1c3716c0e3e5cd1b9c9249dfe93f264c3a1b5638c826e0550838f563439bf42ded3b05dbe175eb82a113e58d1867eec0de925f455b572f8584563492f8cc8b12c27e6872abaa052cc4b285d195dfb48455779f3c293d26c315954b43da6536f8cf1df4871c3c7293ae522b2a288c614ad7e9c361172ab6ba8b00c1fa56854c70c3924c78b163d291ab3eeddd6d4e231a5baf818459b1a9e73b66733958344d1c6e8a05453cfc6f4cf0d2ec54728fa0eb1bc83c992fdbface20314fd6ee69cd5a584fe3000a9f8f84417f744fddab36c8e9d457c78a29520316836cdd15a7c447c74a2131fe15f3a2d457c70a22d5522c7d3d48991ca4d349a53dc0c9f33c4ebcb87261a318ddf78f9a31f996844d0a96f2104d75132da870f4c34aa55cd945a65488a5fa2533263d0b14db58269390a1f96e8659387871091e4b75a2ad147ce9f3cb9ec94e8b20855315369fb858f49f439736a56082afcc5b45cf890442ba3420c1d52f2cb6c23d1a927b1a3cd7c48b462228427b56a33e179e1e311fd99cc90416664ff90e4883e8b1031444fdbc247231a99def9346521f8604423444e26834f88063e16d1c5be0aeb952d37508e57dbc187227a4b918b17355f769d75dcc8f19b884ef39e7ccad9211c31f8404413c4bf2c539b573c8fdde0e3106d9614a3eee86586af051f86e864fefc9e63d84fb1183972241ec44721fa926049886c50cdb97e10a25dd795948312e505d602b0888f4120e2a83c2f09c018e38608c0e842c78d14bc231d2a88aeb4648a6145a90b1f81e8c54fc85594a07153be01887e5c3f878f143a5f3737858f3f74be174664e6d5620b2d900abab080087c027e782dcdb275a5770c0ead1d680c3446096eec18c4471ffa19cb6b4ae974570b0ac4071fda3c4f218232a9a92772c4c71e9acb721d9f4b88fdf0a1874ea916cf187f13878f3c349643d0a7a2a56762ec0e1f78e87424b9fe14535b141b3eeed069df386929b5ff660d1f76e8ccba2cc535a70eed67c85136a374686248962ce5efd491546720f8984317939f3211cd2c4b4a924317ce738ab9280e5d56d25432650c57ede1d0a8d4d6905377aaa07943db2763cc5f737351ddd0870bcb6943f326f2554566cdd21d36f42be1ad3574ca2fa5a4cea32692d4d0850c6bc254a4e7069934b4a119d9c28bb0181b1a3a9fb5681622a696103f439b3d6e84f059dfa285cdd0470adfabdd17eafb96a1cf98a37d5266542b29199a1454509fa89a2aa83986de630ea1bd79748b8762686445d090c72d616845747efc2b0d181a09eb6331a914c246ca17fad417f372c4ae643ae685469cc9c993c7ea42ab492c62d814d634cf8536efa9301e5742868f2d749962f4bc9c8868875c1f5a6844d2fc22b4678aeda52c74e6f9318998f497b0d028153da97296b2c6d1151ae5e1b29eb264398ac70a4d2e11e79ab35e8536e430f1d9cc456946a9d085d44958f078a6eee714daec94a27af4e8a662478b0b70a145043ea4d0a8494a2995e4eb60295168ce52124b3dc263b61c141a4f399f9f09c9131a616149f53afe5fd6098deaaa8e1ba795414d4de873850d2a417b2634225b61364c6709fdc9cf66594179098f95d0ee07199fc2464f9ad524f4f143589a9e79800f24f4f2193a5c540e93c372845e72d0b738b23342273a25bd41bc33b56945683462869094cfe4c91411fa103faa2174a6cda35710eddf9210daf0d41e73cc5e9d148426bc6ebae7edca9b241f4068e25748325f7291fa49287cfca011d1b2f37576566c980b1d1270315c012200a38bbdc2870f8ed9f4fca333662985051f3d28739fe4cc0c56eacae083078dca32c2439c08ee21f9d84193444a52f2480e1aa3041e86049017c6ed091f3a68634627e8eb8a6aa26dc2470e1aa1e226cdb02ea7834e0e55c2070e1aa139e4d1e5b1838af1068896f314e3113e6cd07ad2af1382109da2c6d6081f35e8bbb74f5950315f92dc55e183068dca71e5f1f38776127dcca0cd59738ae49297415f255574a9bea4c27a62d0f86b7587c56e8ed952e103064d9875b310676367fcbca2c9a51254fe458d518451f070456b225592f9fe56ec018f56b46fba33e91133bd49e2c18a36e6ecefa052c7bf9074a123ddd8d105afa215e93a67c1536b785c157dbbe9f0a7742c0bafa6a2934dd5bd27e794ca8f040f54b431aec62dddd1f520cf2b789ca2d7e8f9832429f95494920a1ea6684e4409725de3a708a15274aeb9399ebe1c222589149d6a56ef2513a9e2f556f018451f1e7fe6a3b7bc6993285a13e7d9d51dee9b543014fd8971b12452ce143c40d155cc13c735a578a23b06028f4f742d17eaf2aa9b326830e0e1892e36ee5e3c3f3112af4e34f2372ec79cfb4789742427faec9093a890476730c3d831c68e62028f4db41d33c9f12054d6cf219ae87c4296d43923c619e3c1e82213c4ee974d11eff0810726da0f59628a7b211c5a3b2ed19a7bf986a9b50781d185251a9153d8244d9cd0501837c2f8620c533b3c2ad16cce6d49553caa98c8a40e0f4a743a87b68cb7e41d2296521e93e82acf72fdf5e42189364e54e70f3955d2cb59c023125d7ad06bd36fbd9e2c0e05430236068fc00312bdebf6f66ee5cb9a7d8f47b41e3cac7d44f370442b32295579afbf367834a2973f1129974c353d18d1be668e134f2a74ee181c7a43871861901c3a123d16d19c4a2d91b3a4227a13a22f77502ac52d2f05e6c60e22868e1c167000173c12d1894f952744fc52ce2936060f44b4de9b937770d317821a068f4374f9bbfda3e6a4e061088f4234b22234355ca4e5050f42749592aaca22494f8afd20da5d357731255a133c04d1842da5e7317f4e314781e84a7c655c92a672c41120fa39716f8b9afa435b1d4cbb78f091b78e1fda2c8dd1155284caf9f6a1d5115ae6c4687e4f950f7d44b9e439987b1c37f7d0a852e1bd7d16534c40f0d043e7ba2949d6dccf174379e832b6a4f212eb581de2a19121390831654a69f1eed0e488bfe167363bb4569d73d03945ead08b75b5a6a6146209113af42a323f62923ab22b3c874e4b8eb97299f22d09caa10f41f5c95a0e4d415b71e83a26b19f653ec80445060f38347271b2d5d783fe3f86c71b3add939c9f3a28a535c6c30d4d0e1d79e7946d68f5e23dc8aea4257a860d4dd25f79f1539279d03cd6d0e87ecb552128a9a191a762942991928676538815af21420ee7d90d3cd0d0572cb124226af4d8a00dc1e30c5d9888a0ebef21de4c6668845ec4d6ddced3ee97a1cba0b96b32c3ecbf46864e89b0734985a03faf690c5d88318951fa4762e85df4e5c81bc4bd44270c5dbf4e8e7172c6061e60a82ac4948bea5e969374518de4133cbed025118d5bfefd9fe7e4052d2f698ef9848e7494e2c2a30b4d0ad318c5e258106d0a3cb8d0578a9432af54c0f0d8421f944a3179cf3dc0430b7d507add733e959654f622c70d1d5a13f0c842eb264ac8184eb349cc612cb4f9cd3c49fdf7907cefe286043caeb0a56750c1b3752b74a95a3e9b6cce593f5c383caa60d21234548aa814973a1e5468de7273b88ca92934c9cae43f89082929746a99a9348f7eaf2a45a113b19e524b639249ba55618007149abf148f59b3472c021e4fe82ce44294cd5db1a2cf01063ac0c309cde989be97354fe46c139a60995404f93d4b9a61421b4faecbc8ef98204e3a72dc406074e105185d9425b4a543fc5cb92389d4f016e0a184467c5cad73cc38babc24a49721f9f9a9557ece0edf2a46020f24b4c9455e724e9da9e4ec71844e3393b6d81d37422fbe6a424cd0c9ff4f2c5208f028426f4104fd18635699b861820711ba529172e80fb56c41b46123e930810d1b4987098e0bd174ecd024780ca18c7fe2c154f8201223842a62b6e007218d3ea8142f45026124128b830261381406844db93b431408001038260d46628130103461fb14000358281e3c2e2c16241c12101418140d03a15028140c06c2c0502014068302c1108a480e65e0070490f6a393c289f04f66d074fd2ecd4e988dcc329826bb58534a465d018b804e948a93c0499061d7581bdfae0b82287434a20a9dfaba9f2dfad11696a285ca24e26463ecf071846ca8627faa93f173406f67c363045582c084057bf5bb003f52b20d11bf6def85d0755f9667304e8812692312773a53e08d80747f7fa44f0e2019035b667920eda4000123e442bad0d125a920e498b2a2808e604c77cfd550e92859d0e95e6d83519c6ff7a8326ec41bb7ccb01490061190ae927f7dfa2048497b77edf151d3c64b8b6c21bda3c26fc7d72390eeca466fa46f0819df1352d1594a7587c032beaef25e25c0611a673697549651ad9cdc90ee409de73ca5f78944e395d3c1e8481dadf25d12b64b77e302952376c995c28c791dc1ba740d40fa7297ab6566612db1d4de50a1fa36b5a0fc467fee40a283c46a6e0e5539b039694f1beb989e6cb25258cd9a2dc94e933025e7481526bb757c25975150c0ab5c6dee90af8c873284d9ad64a180458c5f191703640a8bc1c2bf451106e0f4d28f094493349854279d595572c933b627e9d6bf8a2fde2d56cd7434b76484e50343684d55fd2b92857611d3333595f153fffa1f20facb841a2330c6ffe770e7d62a413feacec99744b4b3567caff31400babcb7e773d0553102125bc1aad7dfbd943e61b5408f5e8cbb51e1f62ceaf7cb8195c70119f532e6198b415e1cafd404ad00b502e4bbc45f8b5f66119351f123b0a03f08d34d0142749ca7e0b4b89112a656b11c89ec541dc5055cf4265dcbf9f26a027720e31babcd32f066e653cd2d8d7a37892232207b27220e6645299159024d113a678fd62de1845819b86e6a879ed093e2923477840ffead21291200b3a7809687f9a34ab0be1b0db3863c76228b60aef25b01d2959fd96aee02b7da5d9aa847ce6cae16e10f2a96ff19fdfd6eca451e3562651968f6e9a9da26aa15d38c1348688fa88c61e40f6f59a1cb7ff3357248ea45c9770b4e09a69fdafd97f74c592689745e9a22c70b376c9b8c31664c62444d317aa956ddb5321b75bd48b2f8d4033479648194d5ab62b3a33706392559678667c523d601dc8fea648fb9ac8d2c944973b0f57280b24e7a38c15e993ec6308d20a654245b196993acee0f49145566bac54e2870fe7ffd0251798d6aa67ea5460871c5cfbb0c17df53a3b60647d25d141a3ad965982325b6542fbb776065ec9bb1c061ab50268d9cb7d2eaeabf776f8f7071880071166712a9cde02605daaf5343fd5e977d6e31913c1e09d5c83ea8888225922c4fb453d718a56a5d3472885c9feea21ac5d95b3c4560718618ff63fd2fd9d124b687bea3d0591a8f380a8f8222a12a6f940ca5fa5c839c8609dbddd1424428e849250ad1a771b94cbbe1440c65aa2c4ae1f413e8a11133dca155c7b03391115ed87618213007fd2942cafd5e0d8fbba02c8d8ea74525f9efdddefd6688fd97ac530034733d86867d2305c636fa166ff8c22b560bca5292df1fb6e7dc06834ce5cf88adc65e65731bae4fbb6625a319e3571dcca4c42e9fe704958d8162f427072edac5d1ea52a728c7323df89e088a7046eba9e9042174bd06bddff2cd20731da534465691c938d704f80c1048383e0a098faa2c0856b3cbc13edd4ee1b85d8d1b2c16bb4ea9fe5cdc8bd51205e23637b65d15eb174987a77950823fa348edee0ed45854c75ca5bf49121a61cfbd941352a1b69bf4073f9e0c61aa5474ab125b46a135106858fa9f3787d647dd1836946a0a316aa8da3bc3694fe1eb54c9158d780277c86db78019a3a61dbb69dca2dc034377e8359010a548afff3b7b07f3438839d2d502c62a3b5bd572c7eab500a690b0c77842f398fcb2034f705933b4cef2c524ec6e065902991ae7bf5791ad56ca539cb418e0f4b6df1bb16d1e6ea68e4b3d4e8bd8c8436a18ee6d118aa0d7319d49998a217c32cb0ab04438c839f2d6e1e9ab4860c1800a335cf892b16deb20475286ab38493b1ee72a6d9d9ee3e322ef9849f56ba12e2e2649a5831c8774bb6b94414696108a33a6d1384046d44add1a89f3c8ef92a45d4873e9fa7624aff84438467ae5d1cc10c5e4e2b9f6758547df9172edc81ea494460a8d446ff4bdd12e46dcf5685794c7b36130335a61f22a0269467c1aa9654673979340283947ba206937ee7e17a487a3bb1fbb7b63ec248d60084df6d7510b6b7d78d2e9816a5ff9c2d4ac435302bace0476449456710d44f071e9b0bd9cbd7862af3713cb195643bb31866aa272dbb1244b4e76176547fa595f1d3cfe57d8a2287e094796f50a4638e2dc90058097c7bc6df60660b2c9e845776e4d22558ba58dc3dc47ac7593b18adaa73f5bc06fd839010adce9419ad41b0ee3b368ed698b1572978473cb9ba666accfd569a32dbd68f92a40145306918e0624d0792fc801cf93345103677fc265c00c1b68065e89b729070a83e0b271b99ff0d9a8ee2df9d86a683d98d491712f046f77b468338a9f6b7730c6351fbf8ecfc1808770f8cc24cf6979fda6f89a516b8bb728dca79c351388b4460948ec607e2a1aa82141d9d1c8b3b7b185e07e2b52c5bec24aabe2bf75e6b59d9f4280752d333e60e441454bdaa87fcd2448d7426bc7637fc78e5e4f3ccd5e84423a505c78d7f91ae2caa6daf2f19191c1cbfaa05a944929630b75f8f48d29300a55ec46a0a2730ed8a099f49448116b9e2eb24f38f69ee44639b0d86415e97720ae769b270be71e85a0fa1e84b5dd50cc608e345cabf31e31658cedc695c742350414c40075924a8ba99e74d73e10d4caeebe0242918667fc96a9b379aa7b4535d6c6d7dafd57c0d00ff429f2333e4b72c7bbc20c8189cb73b9ca9d3c61cacc20406f94f423a44089c690bf6b5389d7a62741529510ad10926a92cbb7d01e2a0700bc79d922c6627efa2245bba35f4b891355697194103408070ff41e932412d569ec68595b16545013b3992a92ceea5a12f85a297f15a91e6b54a15b8dafb8c15c0fe83c0c286e202dbf077a5bff31aaff5e70ffb8674246bb9c166bc7f30adab38194b3ca6eab25d55ab168e3d02e3e897ee06517e33f2ffc5373d51b70cf071d74acbba9ccf4362d164494c010b7b954a1b5afaaf079b508a5749f86ad222c18f17d96dc8eaf4f250532a59185b8e671b2f36eb499a1475bdb9cde4d611b5a4b965f35dbd0f267fbe240155a91fb895c93a3945bb8d418bf2b029c772b5694a7258dd1fb37077cb90f3dcb2aa10efc2f4ab36db4a81ef25f86370512d9e6c72965594bc0501e92bb92bd044312dc7403f92e21cbbd8fa28424d6b0563abfc1a13531859331eab45021c803d4fdc9b529b7744724089b21d71e39bf25a855def68e85d152b33010faeb770f4b6f9be3632752089fec626c54c821597bc47c3046b997a817d99681c572ff30d294ba2661fbdf5f43fe041e7d81cd0cbfbf534db8f77b066e5db28e61c263e30c869524dd1bf8534e1cb03f19f33d0318d5fa78a32b517c1f9f88b6ea0fbc8718282937bad7e4162859f85207cf303266d273df926980ad647a0f156a65fe6ae62d1f179961b586d63911dce7dc0237de237c071745a8ecef2cbe3a8238d09e72e5a52650aa9815deafcd9d8594225181df9fc6dd2bed8f98feb917784aeffc4dbfa26fef2fd9ffd259106aff574e2ffcee102046c88da0cb277036aad609850a0207fcf52149d818aadee6525fafac7c84d8fd1d9d0b25e50c4a9efad1540c46730cb78c469431f369c969e02add7036d5a3f0e3a107f085e05cb7ba5e842d14fa64fd85acad34b87589f0868ed77db8a8a7a0df76257618c01622fe57f77008cea23b9a3d517cb988cbe9c444437dc566c1f65e88a269888a6e6a2b4539ecb322eb00907580a1601dfee3d0585af49ddc9f9a135d1ecfb43c0d6455a0a2e2dc707c02301684d0a806944ecd30b5f9fcf87ba823ada2e8060dd86fb793d37d832e53bd20b2ee9a48c5c9da988f30e6e1cfa6c9ee96d899ca7fcdae4a3e4790949a77ca78690253b3d5784928fe50e93209e23cec7e0485a4024ab3924bbba00e2ed9662bc9d9c6f6a4ba13ffc851c322e930db3faa90b12af489103c9fae724aed7cb390afc57f93964f5203d856c96691b94a2a44c0a0ade6a3f6d0182fd1f332c3cde9ae68bea1d303862a81f766696408228b1de9089910619cd00d5643875b28451b390681c68fabbc44f21a9538059bba4e494fcca8175aab93e739a45cccecbf2d1534ceee4c14707c94cd4956054a3d764e418978b6c4a9a47147be0c2e9a12d10662039002a67b29c9025bb714eb3523444a6a152d56d196cd6fa6dc65e2db8b9bac1bd5b3fea02f62dcf148da0d1175ff148021cb3ff584711e7122b9fa97c82dcbf8e686576a4b3f850a89353a43c66a678d10b14a61b0058ac770379f054bb99ed37cbe3e2bba9b552404d08bee95312623c5caf9d0e28ad3eacc237f404b8eba465ee14944b752c429803ff3fd09c8fbe532e07ea6be87bbcab55454514761ec01fa618d442284cfce9cb14c4433efe8fe9dabdcaaea51e4ec5d978d16fb20a8c8081c87b55df525fb9e2b7025c54470a73b5441d12ecb9fec2e2078cac814a484937009820ff112f1947cfb4737473020a285f3bbad22fd863bd44374dae17f0b547039bf7a73354575f15d7dec10a2225432458713e18f8651a1482f0c86a1d18eb8bcf58354072a84db3745021bf4a530b4d934ffccf11a732000c2e063478f5560ca4cb363b98c5f6a9833d816f268b5bc0a61f8541880fc5ebf1623413b7fc1927e9df52c2c11e11b24b5cc3be55a918df0c8970dec40b0964caab0486cdc9071d0c5ffb6a0a6515527e2b1c9c950d1cb7f22e0cc23889da0e34b1955c4e7f035555c7f82c5fe560966bf4d7779d5e9b56413cda9c689cbb9af71559fdf4969b68585c3d7075f4efdcb849b499055f987f4499a91a9cc9d3a1e86aeb72fa43605062f9cd3e7c47352d61b0796c90e2d09493bdb1123430dbe01894b4120ed7ddbb913a69f70173e3d2e61132e901bb2bc85060541456bf034c7e627196ee006f990254a0417ce7767ba7b9b37696403e3aed0ea4de3e92865f8f1a15d28b652ed281ef597732fec5429b54ec2d337a18cb3fa7d830ea9193a8bb646cc9179d41a392373695ba0ba7538f9462c091e529146a44b122c27c7c240f91d99c8a2add2b37499080e9663920412df68f8a49febf99cb18f9cd0f9ad2d608cdb4f6abd6fe4e469c99e25c8847ecae7c89e61c427cabb549d0b2db4d1079321c8911ccb122880a1f64705b74bcd539427b59c5465b1a1bf9ce41b6c12f946935d1eda2cdbf0a13f68038507a7fbaf65b88b1637f8a93330184fe453e84ab8c80d561eef9ba26780306d4e97cde1ec05c2dea51bd9c9fb8c2ec4582c2a03f5e4038064f97763e45b335bd5a2762e80d2e44f7ce7ed140bac12f930ccb3ef3db9fd6ab0b7790d4b15cca65546f90efc40810e9da4a92b6a82b06d9d7d57cda49d61935d4a2766b282890cd4572526c61d5f272f6536af1b4235f3fc63fd9a3ea04f9e46811e31c40300cc8b48a0c0c6e4e5e0b430056420580a772bf7811101bf56423cb4ac9f751802a99948d05071b4bf08da8905ea6eb30d6c1b61e63f20ddc891c6977970852e3927cbf8830a47fb0c1deccc5c2cd45c9c07c969d3c10facff48d3b3797ab4a5ec86ab146191ff91a98cb238636e04d917e28929626cc80d994ade3332948be6f01427e3028c8d749c69f49ba5d151aa60d2ae1f8f7f8f310bb3e2dee6823dac61d4f14d66d20240278b37ef378432fa437089b14d56e7516f1cd3079ca904548756ff331579135890a675a39f8f2624475ef1876f66b3a31ccac1677f6278a39c4cd39eb2ab40770401f100da1e40694275a91f52326aca228f84b936385b10abf3e91b24bd4c38f99813829c24547987500bed8608220a0d6cfce10789f6471bab7a0525b636ef6be72547aae46f2199034a95fd569f4cb6566eb1701cc5408bcb67b6c4ed8450a6f313c1419cae7347a25f1c796b59d6a5e4029b6fb5b8ce3bc0e0856155d71dd7297995c594ed5d1b44c611b5f77b9187dfdb5420b76772bb425c64e2bcd643b5848eb436dce093256290a16f47686084225b904fb6dc481af1a649fe7dc1391e95472e64d8307475a72bfd9106b7762dd0adaa66f38b69b9714fe6ad7fa51e2fac01e2237d4f4d8bbb2d3e956d668273495703781fbb421faf81627811da5110c727a7d396abafb398d9db1cec3e78c488bea16f28b524845ef619143c1a2e15cc355dc6ef50464114829c269bb8b551b8f5611c892e81d7f512a7127ff22414c94a733ddc3240cc29436275f35763ee954f84bece5eba488c1c22be18da78b04e9ca08451215017d65828e35c194d8cae21cd18de219792129d0451aa513bce1967fcf29fb67e332b4bf90d41734cdb5062212d0d560a88ade44a0a01d8c1ddae6e0e295f8f159adcde96d80f126d9a7013fc5849aecc38775d34c7fbf0944cd449844c159cd6c773e6d25f614a54a6642099d6a2c12a60d9093fd0c9bbbcedff8ae29b25c0947ca338d38dcd1ec7998774c08ea6ec1b1f4a3230ad2b3b690f004b201ae832674fbb34cf1759fe8375cb08f3e9a59308c1a9040edfe8d92fc843b7d1a25343b88c16656a0315468e92441052c3a6e2b57f364a267591655647dfe03c71756718d75dccc66519ba0ee16d258dcec309d3b2836157b898b88020f7ea402898a23d175d57a3938cb71e7b72585bf736f7960a6682b561d197f3c4abcdde8032d86c0d56fa6a65b3d033895039950ad16d8227ff3696a6724d116984d79b13fa255785028bc242ec8fa99fa37055e303467f09c138cf59161a94840cf1bce5facfe176652bbbb3e00a57d09bafb261b8dfa555528a13defe7d6f02ce33c217eb458c0edf2a114327c2a1d728d4630fe04c638c34838792ebd11d2395b2686a34ee2a39d043b9f6c60fdeb70f641be44a0a053bce2891ef302a8bc2593af4c973d914a7c4e7b7a1f4336f973023daad5fdd05a833e80d70082d704502fd20e9b1225516ddbe8746edf87e98dc97473420b7a91a134db97119d1ce124ae29a326374f349c1f9509b35ae75ba241c2345b6c6f544f6115a19f10f420d7d5af2940ed8574163f685a6f9f1817234d27005c62cccc990f886200999e806c2c5af76e8102cc986fba1d4b5d1dffdbb27616e6eb0719b0d0f7f07d0013c158a27ad9558604c03a083ca817fac53b2c2107eeef915cb94d408e7bb0afcbf44726ff2d433eebda736d813125ca36d0c5981f413bf512840d2bbde8f17bdc765ce59f5f7582fa0a2dc59c04de001af8f2b7cc24d50b896838180710690dc53e65366c203710934aeb3f8516336cec75a6284d8c7e06180441e8e33ea0077e2ddf9f751cbc3af14388ba9f7e014976949e38016d8f5855d254dd146e5b9a34651c3921be39207efc01b22c38062e8a4636fb5682e538ca5eba62ba33d62ae715c01e2f08b843fd4dbc85eaf30099d90dde71bff573d9484b47161f08671e89c93bd86d5988886eb5617c8c8916788a22b48ed4fbe4e03ccf130a64c51862bce0e7d196780c1340ff1c98e237576aa9d04151663c4c8a463bed9f3ffe9fa0026b22fb925ec76056e0d9082dd5d902e89797bb49d456d6ac6bd75e50abf560e681b56f12e3fe966edd0ac99647408c905484fc147c66ac3f1d15e67813aa95d6aab3a04399f884e24c87be2193378c91801a37b264be4c1eab946d41b1928f36e8f43893246fdc3444ea6ffba26e0bb8b9dc5bfe5857751cdab8beb30e7d1b694fbf5c92257a8f2b369f5eec641202656b0622898462ee02bf00c543280a6a13db7db827786d41ce91ca38b728653c3e7201250957052113128737aabf082f14703542a064825e0217c16a215c6cff16c3e900614300c761ac6d677d7b296caa5249ac7ba8e9f89905a1694abc0de2d93484620717d02e58a350a052102dbbb415d20398101e3a67aa528f357d796523bd8049d96315971b8abd4496b6fdda9ff28857c47f2205d882e442fb2bd25bdb867fe6209598f2441542187905308514400f947141ce286fb989bff292d486e96c2a3789ddc9141f6c08a604b882468eee19391707c21adb04bc025e812f60a3b027e41bfd02d2847858a4890cd026b21bdb05c58231012cc09838240c1a7302c8c678763191c98f73ea16a70841507fd8445631b41911a79598fc96a4916f9cb19195a40242058a08e1bfee0983abdf409b3beca0ee45bcad504508e694633b3d3cfea71b1f947f49e88ff86919132426b8547404e0a1a3c341eef1737fbb1bdbef51860beaef045bc8a9b1a9c0dd3c3123f1107849b7500991028ce2559cf5cef4863d84e41a1c173d1768cd1a3f747960fe9f8c941881e6da547198a4023714bd2146b492e40bd7ad61b174ac9d1085f1480944612a30ba4df8a54e44669923a03e2043c83d30e65fedd0e44ad4ce982cf9721e03c8c8389351352e5a5473591d5e5093392c4a8aa8b550a65dae5c7d5672fb7fa6b1f9c2b2fe844db85bce3c9623c2ed0e05c1a9f40c7bb090e9f60bdca920980709ebc37623f1f503cec1e6ac45c0614106a9e08b44a765d0b9f689d5ab1b8e4ca80af6328d1062cbb38fb14cc8700c6788a6442b064b16aa88d96db9354be21f0704cc9704eaf8a47104fef186488491826241de0688572066711811aa57cb26a08acff2e90d37b35eec6ea58aaffee7287c1f22ee46a13811de9c60209f513ef9127a587d30ccd85b2a5d94044b1033806518b7c4942a99c98945f7035e4bbb70f2718b3cf49ed5c8c35d7da8d9396cef76c86618325e3cfd74b114ce78616b0b9d0ae3252df543cdd307be988ae7d5ad574d9705c11d2e299baa140a1365b905bd1fc00af1f8cd87215dde3e90d1fd7ca1da3ad4a060051aac8ac54471a80dc3af67a3d8022c32c61d8600bd2b7bfa12d4fe8312daea0da970288e521ec8dafafa0741e7a26d8b224757e959c58459bfe8f72a93c14e8d81e5f560ac97c9c3afb99ea6f50f15dee8abba19649ab197f202d8ab44b66420129df21fd6aca588e871882f39f645a5a176b1e5f685018a6314f91d56dc7abccc22831b0791c6f2f3ed0d49be825cfa0f21d2fcc5beb9879c5de078219a5f437a826e657ecb15abd3280bc19dcc492ef467439263fdd576ef5d4d5526a72b044efc455204b442d51a67e9a1e7dbaaa4a033b16c7e2449d9fce7a880352e02822534e4dcc732d27612f36da4ad28a1ec313b3633e1313911695025a612ed92691e0f4eac0925b5c804f090c52d733f45ccb79b1f838708d54c509aa4501f03549381b4444e875b628176fd7c5431ffd89f2571e48e85c42fa0732665a87507150b645e821e0707787b53c172bc7416123d6d65d52b1945f4c468a481157d1ce981d4f63648c76e4b7a08c66aeeca4aed32dd0b0584a48a0444619e78854c34c276c791d6a0d68d8e7e76864640d224a8fb80d76127fad366a50237fe380738862507770bd497b419170694393e83675c19cfb66930482d9395ebb728249da2345eae768e6353a670d8920c140530fb0252bf5542c6f2213d528d172d76b98a696d4439900177b7db2115ee0a2fd683ae38c3de516b7d94c666ea9e1f2950a9717c22fd8b570427cf6e2f940026b47ec2e1396f4b8147a4351430122a84e43dc3ad3b6c9b043246b35f4cda9b804f5011064b6e69a45b4b09b48a73872e35e90d4780ee9ef30ce53247802107cbfeba68782465382c9f758bf7b46b4b262f0e5c03e15c834246a9ba209437f1f13e146f78203c58d55efc1be2611a0b351375ca62a20522959979ac55f5110403e295c487d61622ffd0c326a65e0f44d18a89f082d1415f0207223f54d7657ebff818c790c7567b7a6a2255a965c79ab66e1d51a6325be4d852fcdfbbbf26ac1bbcecb90245159ea6c732105b37198fc0035cbab65f0b33497e764b6df1bf656cb347de95cccea9890cd004414a40d1cc3e3b8476403c24b6e7aefea352fb9db9076c551486eaef12042c38fb93a145f396ee2fa16f476501ba56aa505f44b14137eaa9ef371523e4ea691fe8d45f374b6e20dae0e22b644f922a87b46f303f23814b23ec43ced494c14ec3ffd0096d368fc831b615c931ace0c2f13e3514cae51b664bc5bd62aa848469d766ecfdb1f160864309412cd1913b41013e12d623cd8fdbba342135962c09cc12129b5b9fdb400cf8831645ddcdc9a17705c8be370c63a326c4f1df6f7fba25cc9306d7f7674feacfaeeb81edc787f7d10a62baf34d7eaa18e0942021ac45f0bb4327deef79f0b49a29923bf3d150b5a00429a948a48b9227558c61646f1069d6044fe7da561199de3599e7baa93a753fa21c564e19365a2e3b820b39f0b008ff623d283b9539bcc2f4be7a0610b87bba844972ac6441fd1d5527f2e961335578e1ae5356921f115638180a49b4a27baed56a18ea6ec75d72dfaf885674cf9fc8cf40fab6b896211d1ed63048164e0ea4422e2de6acb5955b4d20dae38293f432a910b69ee5314d1baf65b607cc03a532f7f226d9d7294293882dcdc9285559522fd399706d35afee639e467c31bf842f1971a65a96ca87caa45443680d8aa8074c37147219e9f29d0316c1967390bab4b988b75eec26f18f4959d7fcdb56995809eab4fd6f9230bdd988e3929eccba70bab0f8ad46fa0973ed6957292d284cacb9dc2d8c08a0f21839dea1da369207e9d3ff386be555f1de160bfe546751158be32505e3564d1aff26f90d40574d64523a1966e0c3aaad6265be825582a0688b0e64d9eaf159ba0e9de1aa9893f2181f45766b449d683ef0cb240ef86bd1e0b3f2f5f3cd007c2047c07bd0ba00e189976064c3d3cf7cd131cc0f7b317a6251c1a9c74da018ef68ca1cf0cdd754bf70a73b43c9b7b96ea093f38d7ab270cfa7c55660ecbd9c4924b6de2f0bc57976e070deef7b0d24ab4725248ddc8541d69eaa66cea56a34f15599b36d953ea9d4e3b29b0d582c2b5c8cb40f872a1a70a0fe81f41f9c51a6802c34865ab1eb0dfb9ef3880692c06e5e41d04f9f1ef9aeba165b22f27ac11cc5ea86de612a51a096616ac555a278dd7807dc141b9ed06756f6e61377a70c05cd998508e33e3429496dde2e73076126d06062858864737b8f9ad5b6a6a4f9d5193a3edb94d467bd12ed48386cdb1efcd5f8de46e7a4500522fa2ddf594ab305817a191c27050a8a9983696bd1e53f356f5cdb0636defeea7782a72c9a8693527cff8921548b9155e58823b3ad223ca6b3e4749c32d1805ade1ac62f62fd1e75d0c24ebead170a05ca83a46aaa60dea1dab9dcc00b4986720eeb099e9b26a9db14796b81b91f97222497a77b3ed9e578c190add8a97d2621d73b8dac9cf9f10588fb8684ac40b1c6684734edb70a2024971903ddd04a1cd34b4963cdaa45b2926d5a06f1df7b6a19844555ee7f5d3ac935403e066527c378fe65f9d74d7ee57bcd4af1ee9923edb6bf72d1ed5adfbb85be0e9f6f7ebc5bf50b8238204ff83434e4b82a7063867a7c4443587df2fb7ae58167b5b5dad5cd8c0437849a57a49a95873289a9a26856ce6698e92c719257ab3995d3b069160cb7405c80bd14f188aa84253b1013c0a24b0d07bb8f05d5c7aa2804f983c3db90048465a644c6259995dab8ec5090529e4802b46fa702bcbf726cccb7255dde69c2f285c8d7252577886da2d79ed8cadae2b204efac103b3ac28461bf92b11db4effa0fdfcf79d48017e35823f35748648273280f3f4b107eff9b58bea31633f12562fb008ad25be619a1df5f413625a4c5c76eb1284b1eca149a6f79e545e853abf790b00286ca6bd372374920eb2385cbac1590e7de244a323419b5944afe1befe8a534b0c104b0cd2283d5333123e97c84f48f66bcdd853bba590470b244275ab6bb8978f35d0a5326d94c07231cd281014452599645d42698488c19838ffcc08d7a14ddee4391f248036f998e4bf8b097d9c2c0fbab11acdfe40c1fd4bc748ab505f1f2e752a2b619b187aef9f2419ee327f0ba93610bba84c7a10cf0ab640ca8a829670f297949563dadaf18ac708eb079970e419867c0707f3041d0c0b21e5867136467a7a9b240acc1b97a90b7b5f8ff847e04d294b8916f7db2b8a914f6525cab10068383fbcf2e7c9cb0d371f3100c4ca10b76ba6726bbce427502569e08d4f9c05f3e4ad0eed45b020d6e330705d09400cbc1802084b1871c604cbe57b5e08c30a36d3ba3584739f03c671f8c04bddf08c0ca934f9353a97ce21f48b3a2e5f9c90ca339b107741081504888aa8c4ea37493c67d18ccfc59711682624b13edbb85841e8b02104ead895094581796cb1b7606102d1ab2296c374e08de654f445bb838b18a7d682fa8b79401af8e49cc2175edecce719d1f35da9e198b58ed666a248c3a65d0eb02013d51ebc7aa4ba8ebc58f9a66c4ef5a846e7b226562bb04b20c83acb63aaa8f55f2ba52d6e483ff7e16a88bef5bb34c90b9d2b19d6cbdd192777815315f4b29c637c443e71c5560c300a3536c7440bf1534e0f2414bd253c516fa08b30815eff13b2259dd3696349d4d02ea698b43f1115cd98f8756fe21161dfda0fb82956fbbf30fc36c7184488f9bfdd2a16d5997419d864ffecbd72f04d9374ad8acef698a7398c432f027551649f32409e14923f42ec8ad137acfdfe4bbf5d62176e5dadbe9129e0bbd57974be3dc0e4e136b308afaffa5f553fc2f7175d30111d21c153d4fef50b6ed2bf7bd2da6b05bd7900fa338c22a8be4a9ae41e7fd921966f04f699d746f0d41624c316d0957a75697ee9be0306c56a3dd669b0984f11df694abf0308c6f0c50cb61771c2015b5c4d0714c4d1aae828fe67ce404c005263283926306d871f3d76492c3f2e41b2c3412d19fb202c2db847c243cb949e71a64377df35a93f3bd32cc0f6125560b53870a3b11f6ea0ff071d2ef255fce01f14f8144ed1eb638316e28bc336257014af27230c061602fb8407c2bf61ceb06eb80756fe7007ccdaf65d3587528698c295936c360a89e1666b5f802fa9d3cc925541cd66296341e01e8a0fad88eb35bc300a574197b8855f012c4a07b584ee4da5aaf2d129d231a45648f85f24a6b73a9fd593c889255686833b5567288a494fb0d80e05951a737adffa44ad0c43baaba4473de9b3a6f0863e428974ba842be72bb7a6159675439588ca9c4e579fa04c525a1135d0615a595953756b19ad0628ffbd53067bce9788b39c5c28418781e5bdeda7909d29929e7d9d665ff995c9b772baeab79a772ac396974d5005b5996a0dff4f4a0a81ac7100bd3a7ba567f9e1e70c440ff707ff962d8927c383a144e50828d7e8656537fbe460e4ba1bc190cc6f02ae9344c50b3140b2140a07fffffffffffffffff110acfdac3280994cb4375809512a9b3d3333a55d910facbf2dcba4c41db6ef0012e702b50b690b2e0b66acc183873f340365d881c921a49f907b343e0ee93a70a9ba4727d6c3f8e3e8000dd3061dd81c0f3915a99b0317f9a3ed2e7246b0ef8c0441197260f492f8beb9ab94ba7160aa335ff8040fa69383035f1d3c56bd6efc94da1b983c5c49c9d35bfb250d94e1062664698e9021c25bfc3630e99272a8bf1acf8ab3817f138bb862b73ebe7a0ddce979b5f9c8c731e8ab06b65e3dc674414d036323f91b379d686062fc20d179836760ddf3b04769938fff6966e007ee03cd1c5322a2566450461998fce5e3acd43918944106beca4b5a2c59e5e4cf18f8db9cf378a0d689810f2e9ee28f0791526f554618f81ff4ddfa671ef6386bc0c0a63cf29588bde9638494f10522e44b2affe83d61152fe479b4f6e370086574810bbcf8576aee8fc7a5b3a08c2d9032b470f4d86fc38759c332b2c074548fee49a2d553689481852094710592461956c8411955a042e928630ae7bbcaeb1acb6c3923ab0c297077913f72f37cf16174461a915a9411852f06bbec3c2212a10c28301a7ffc25a6fa19594ff03f7a57dc306bcd19595a8613f871a7d60d953f4d60629ad7a6ebeee18ec98147194ce07eacd1a9f3364df4e58c4ce3c4806a0a652c81cfbfed833c1e6f6d380b94c0970f93e6fcd09c91e5b98631c10d78d0fe012d2309ae67af494d629132a4a041652081f14b5169f3789c23f0a34a5616d26518811f7b5a774af20e215b0cae624ab49c4bdf7fa41383ed61d2ce31a48ca17ef430d8b6c86f59a2e7f6a430381f5e764cee152a053518fcd78f25ef98c02852774bbaf5ee17fc6ee8dbec1fbee0229369a86b8d8c5e70393f5f77578a1ef4585ef0a3cb8f6fe952c8d80517530ea63e8e99f22a42862ed83c0a31e5f0d17f8a956a828c5cf0e3fd883ae5a38c40062eb8345bebd175a768d22441c62db8bd64390f7ae8b5b1525bf0e38f1366bf3faa94d90e4590510bee7d94b616d7264efc1941062df8ffc83e8e16c5b37bec2cd8e8fa9d725cd38c2125820c59f02b713357ca3df2184b250419b1602f32d6aac792246501a1cd3863070fd6d80e90010bc6afdb26e78cef5eff2bd8bc9c15293498a8ef0a6ef2684829a57abcf76905a7597a78ba292383156c0f453c7d27f2da6d64ac822bf7fb1e27f31f843cc850052379f384e67cd341f34805934662a95decd47c1d2a58bbec6bf9475973650919c83805df966ffde35ee5d1fea620855ecbf1d693a460d9b52605a7a5dfaf2691e7eba9200c648c825dddf4116b2da260f7f359ed8e47efbb43c15f969c781919a060db62babd31d51c3f650e647c82cb582a65265924a7ab6a411dc8f004114525b6a4e8a6559753c7e861ce12936c781b394003042707323ac188bf67b64b98478d7282fd3e3bc913d3c7bde30974604616c8d804776beb62e9a35be50f5fc39c1d5a6cf88e428626d898eef32873fcbc92c767824f55ffce914bd3ab8f09deaaa27f093eaaa7d7749b829bf796604763ba5c1ed9f3a6af0413439498664e517ca504eb29d6a41c79982bd44930a2da39620aa9d1d425e1998f339a4619097e5097197d18197a287148301e93878c9e3e3d963f82297fad1e7967dcc93b824f79902cfe20d308c67fe83ec8f71ff4ab0f46f0ff49cfc7a17b2c82b5cc3c6c6f0b2eda51043fc8e389d0c3cd49041ff3658ccc038d67e541046f2945a5ecde3904271552b2b9ae69a81c43f056f6e3614fcaa1d23a8560a279dd8f47ca2ba74308366a43ded479fb27a407c14aeacafbadf9c27b41b03ecc289e3a5bf0a11e0846a2e4492119c3ce8701047b6f3dae509fb4f261fec088b69ec6f4f1039387398ff2d8536df418d3073643caf2fc5f2a91327ce0e2d8d49ba5f390f93d70314ea5b839cba2dd7ae035e4767968f2c0fd4d8a21d84d8c50c1031f7d20ad5ad6de816915ff9cbb1df8907d3cdefa3ceac0c7ffb4b5afdadf241dd8f410fa8376736025eda7c8ff533f9a1c38e968ae5539f358b26b5cbaf228df44e1c0454f31429dfd384fa26fe07b83be4fecea7145ea0676f3e9c5d4b134badf0663d4eacbcc33d9c0ed5accafd243fbb1996be0b2585f8a193fe46c4935b0219b87d61e24d3c025fbe8691b3b86e68806cedb753fd362a965f00c8cc65079e817e296b36806de82e6b00c5c66afe952cd9d1c19f8b3cd92ef3346ddfec6c0aab5c4a8e91495918981d7689ec647ad39bf260c8c85b46cff6f01031bd7adf205c653ea44fcfab1974abcc05ef5fd70cb42bac0756ecb9a2291c707215ce03efb58f32045db68f92df0ae3ed650a9579a345ae0c7c94f53fc2e99be59e0a6937834bda8c15a2cf02f5e31dbcdba02a79a9dcaef8716935956e0b4728f3fa35705368fe28f53c85bb947a302e341efc72ac79c34a5a6c0e87df4cb681f88f9900213634eaa1071820fcc28f071f392eaf47e4508057e9c7f6ca3b9a352d29ec0d8dfe49e10cd6e27e4047633fdda0f3225493db009dc6d67d474e533811b1fcdfaa231e45c394be0237eca03bb3c48b1e995e08df6a875ed438f2430e53ed0980791f33fda48603ce75859f41053a90f328ec0e5a8fec7e4f7794325c3086c4a2f4134e5f561d66484318ac1a4a8d16d397e9ac703c720061f2447ed8ad49073bcc718066bd1a30b217334863098ecd5d1ae37040536843182c164d946fda0060613bf425f48d7e1c118bfe02ea412493de9a35cf1356c056ca451700763f882cbc34d9753531e3bce60c38c1b982e65821598c00444d848238d3283317ac18fde6ca3a4ee949af918bc6027a6bef0943e63ff54025f03082d48c304561e63ec82bdcb9c8719e9e259b21dde8347830defc15661238d343630862ed80b1e3925b11862fc0963e482e981e7ce2c8b5dd1efc04307ce81c78d1494e0c618b860f793dd064929497ad018b760528f3c243dcf4a4245878e316cc1a9f74827f5f887b12b5e0b26d284d886f4c093aab460a45dca07e1cf82918cacb174372c58260b46a2f858ba96fed3c4c297b497d5af2c58701129c95345c992c7d91a66ecb01be8008d360c1b3c68c3b0a005afe0736f3bc522528e5fb9315cc10f93c6f2fdcce3ee1cb5a28b93a2a61c753eaa382bd8ae36bf9b902c7e8e0d3576ac61fc0c1d6315a75a1e5546fe28ef1d6cf0e0381b29823154c1949489678839771ee6910a7e6816c2479edad2670e2af8bcb37813ddae5fe12938cb3ce9d2e3b26bd3b4f1689cb1c30c24a66062f654361d25b6d9a5e0479dbcceee336f84754616d1c018a4e0930fb742d3ebf7d8cc51f0d9c7e7e5218fdfc71b62c3db68c3ac61060e8cb3d136866ea73d2126311e0a2e5e9f69e4490cfee341c1e4a14b4474ed3fc125f761e5ee1ff8e49cf7049f430f2bb574e8818ddd093eaa2a07e9f161c6e939c1e7f128e7d029ada67b37c1e45c3dba20b9f9c7f2d004d33ddaaceb3ef6ca3e4e26d8bdf7aa0fb36082ad32dfb4d3ea88ee12dcdf4f7cbfaef49cae25b88b26d183949a873f7525d8cad0ebd79042097e1845b2864eee51c29d04bb999144639e24c1261f6dcaa8e3d59ada487099eb2bf7578558114282b7dc8358d92fd986a78fe0f3a5ec9b9df6e7b9740413bd79b8dfe934a3cc463012c56a32dc62041bb61353edffb8f3bd082e744737fb1ab1147545b03d083dca1693fb451713c1dd4fc7cdc3cab9cf0721820d1d6d752f9874eedc21985c2615615ae3132b43b03faedf6eb3ff917d0ac1989424cd7dbfea5122045fa17f95276f83e56c10ecdec6f54979d4dba31104a7fb39f338a74a20d8f38cf43d5a0920180f4143fec064089aef3f6f1ef4b8f203d73ad1d93f5a158d571fbaf0acd0aa0af281cfcfa89d792f644af6c06f904879ec1152425ac7d003a36be3963a55a764511e588d94265bf2f832061e4ac71877e0be2fee95881eb8410a0f0a018015c6b0838d51072e8d0f4f43fe9e0edc68a74de1be1951ef3930bd19d3fec5d879cf9603a739ba6e5676e3c0c69c4daf3ac510f387c281d53add6c193e8c366b8c37701a3d680a2105c770033ffef5d2d4bd1c79d3186d604b5a2742c81fe9c4186c60f340c56ab33e8d6d3fc61a381fcfbc2cb993bd65571363a8818ddf21c5d0ee7d1efd31d2c06749f1dc9257e5b829001c31061a98fc3ef6d1640f4adc321dc41867302749a1d913531e8f1be8600537d0c10a8898333c60cef0800e1de68c63d840c21866e053b8c4dc21aaa20d4cd7a48f07314af049b2c70c3977ca1132095eafa73a4924af5049820fd2d1a3e4d4a53e22e1b7bb964e9208244a070f6e3ce214328f436af3e1371cc1d8a8e4f1f0d2b88a441ac1bd76f8dd66c9d19e11aca7ac3e7269e920f145706d9b7134629e465c11dc65c9da69f34804ef43496a29480ead792082f714da4d2425baf23804975d2986068f21f81c824e1e6a4853e929047fe263a9b7d46d7513822dcbf1ec93b34fd20c82eda85b1d5d27c7ca0a82cd6fd71242cad9221b08f6538b685dba90fa0404779b11dd7c944b43f20f4c0ab57e793c7c50fb81370b9ff2b14efa20f681c9755a19528e6904f9c08a7e1edf94c7167b0f9c84186afa3fee517d7a207a6faa1cdfcb03efa388aac95eef3d86871b77605f276949a59f7cdb81970ea973ff6f255607eec76e7922b7d85f4607368bb7241f7f64cccb1c3833d19cd32463dd2507269eee7570a9e2b0841b70a8bbf106b62b65a91e88770e51b981c92afb3f9d3cccfadbc0e46549fd7854747336306ee72e99f61ab8fbcd21c76febec316a6025a27aba6497363469e0cd5e35053ddf0c31687814bf2aa6fe67606d358f7288905379ccc0f628e4ec98b126346560c46faac4a2761cc9c08448eb876c1fabcb31b0ea3fd22aefd05914033b31476fa9eecd1986818b16cb633fd4906f30707d714d32424815725fe0d54333af65ffd3cd0bbc0fdcee73e60a9d47e9029b7f628e16bb2aa6ce68030d1f60e5c0b4515070830bac8f8347d4cd1eee057d0b6c8fefcc44adbba1057625269f1e9574b697dcc802e3b9bd6bedb233b2f0460b42a0c60d2c701bb17c8346cd8312f1c6153849291673e40f4208b93374e8207fb861852a70a97e53eac87cef4d9f91d5860ed460e3a9766c086e5081d33b4db7577d49d23705d6335f5ff6cbecfd9235dc9002534993e8468ec9221e053e7ece6972be3c4a950a14984ed59ed753eaa85668b8f104fe7ce81a3f9760b8e1042e87f5783876310f7db372a309dc6aff8f93a41049f45a038d16e8c0d740810e1d3bd640a38dd2c30d26b0a9e28f3e96e74abcb41d6e2ca15049525a5aa2775b6a09851b4a60a32b8fdd6df4be7beb7023096c8fa426967ebd8698470223da192d4fa558e9a37c40878e3676f80dd07898e1c611f8b4ce3652de3002df99b9476963f55e40884031380d99cca2bba9473647108408108373d188984ef20f3ac360937fb049d1554f1d61b01ba3bee7d1983d4a83c1452bf14148673d6c81c19d55ffc824f90bb6f3060b7924795fb015420ee9aa4154acef053739828f73abe7051f2da19a6d7349ccf15db0a14793cfc3431cbb5c17ec48c608fd4d1e6579e4824dc9421eb8e0f4cfb3ed32640ff2e7165caea6589ddb82f513fd517b1e551e554e2d38cb561d41227f987568c16b59ee26cf1f69f5b3e02cd52e69dcff189e96052f21b277926adc09e958b05651b939a38f86cec082dfd590123b5dccadcc2b38bd3c52ff5dc156d6a8dc9bc952c55ac1665a160b114358c18d76bcc8d1553031dd8f360fcbdcac87aa82ebb74c1fee27154c10a9cdde252ab81439674af34ec1a8faa78f1695392ba6e07e54df7924799be2a4146b84c790514a52f02729a488d5380a2652ca91f22709cd104591e5983ba92287a1603adbffbb7ff5f3e740c1555fdfc7ef719a6aef138ca408d951f70467d9b747f1729c18a3eb04e39af5c30b49e739e5042719f24dd694dfb6b2097ed85d3e1ea4cbe3fc886982cdd13cccec97abdb4726581f8feaf7622889a16282514fbf75b987797cbb04975f1e736b4ab104ff834ceede7925d8a824954f3d26cf2925d8e81acf763b3209b67baa73245f127c44b17d774f5aa9890493ef6fc47ff8e3a46b4182fdf1fe84e732028f603b7bdcd5135d4730dd23cb93875e3521028de03724cbfaf7b1d9a4be428800235873bd1fa5d0bf0df5b6c057108145f0c3fef8791952bd675415c1de4aea8aebc3981e3c8960c5fcad87315a652a0d4ff4410410c1e47c53afe3d7be53f5200287e0bfa3f399fa5f0fb3e7811b2020c10d0fdc10810974e8e887194060438d343c8d1d1130049bc537e4d64db175f742f01b7be05da61af4350f4230c96e53564c9ff2f567109c65ad3cb42496163a41b09ef147135314cb48090497fbd17d78353ef60b104cb489ff2652ff81f5a9f43c0c9af5031f95579376cae693a37de0222ff57275a527967c60cbb3e976ca39b8846e0ffcf0233c2d66cf613de981f51fc449b9a131441f7e03364c0b7840f2c0c4f3eb7c3fea8107c6b2c71252a77b07b62bd2b97dd09c272576e02fe378be093d7c37e98c2c339a073bd20323a82144a00e5c1ef9b64fba93da9d0e5c47dbb01cd79f039b4dcc47a9c7b91cd88c6992a6318a9bfa88039b2a7896bddb585a1e7060f25f43fadcdfc07ff678f8ba132553ad6e60eca7d552d7786bba0d591e7ef07186d6d8c06b54f4d866b5064e3ae74d3979d4c0557b4c1b3597a4a4a108a4811dbf10daa915521e471140033f94e861b6cf7a15d19f811f461f59b2db1f6660a2aef828033b412b4c24fdd537870c8c9b5feb24d1fc1a3d63e026df7a581edb62e07672f472edbd1e583a0cfcc8f48265f50d18d8b8f76d69793c88d1b35fe0f64e7783f6f00217b1c7123ad55d602c35865d8ea49d32b9c08f2d32c5b5d86d6191ea9c6c038d36230d35d8f85236888016f8ebdc8df9c3984efd2c702ea65ab13bc3029b6f4a327b05be420a31a507cb19d911b0c2ef59ac7be0aad14104aac07b48bafc653ea8c077551e9ee4cb223005c6075e59f3e50f29f0566312653e1ecf9e1305c62c57fa4f394b8ffd8502572197de4ec64ef7e39ec0f776661f5bea04266f689bfaad1b4b5913584bd9af425fc204be3d3d8f47837b569322b0043652d23cb4ff41a76ff91150025b51524d48b1a03e2e098b76aa4d913e243065ede6e2c3ec21c48ec0a510e35679f411300257e11bc1725ab509fe19596610366ecb28069b72f443e894187caabee6511ca99ca70f03b54a21e4e4d085c1079194f541f295fec1e063fa099e8759607025e611f7f7bba3f60bf66b34b752c8c317bc873a4f2fb8f863cf49a5d9c31f7678c14e1ef87be5d1bbe053e814bf3c2acf335b17dce524da3d1edf9a64e782cfc1bdf35698f7e4185cf02935af4b68cc2dd89a1e776764bdcf3c6cc18765ea0fcfe3118ba9059ff747a117e2d94795165c691e67c1e5467065c15ba7fcd2924f2c4e1b0b7e7d1039b6adb060af33f7745d524b697d05df796caa2da92b180dd9aed4c7a51ef96c05a376eb51cb32c7ee242bd43cd5dc3f2e73155cd214710b9a6ee2a90a5e7a28968276569624a68209db3a4bf9433c84880a46d2a6fadbe6b048e12938cb4e156adb25a54253709675c13bfaddc79c2b05d39dede3105d398fc623059f2c69cca33b9b9eee46c126e951270abe7637a78f5493fe63a16032fc53faa062cefc919e833578d082d33240c1d88e8f7bdfda2b7f3ec1de75e6d1e790d412344f30a5495cd233ed22c43ac18f5e43d74b67ee71c838c175c77493916e8275ed68a9c34314d535c14487b2fdb61f853e13dc54a5b774136f3d07137e3e1f1f7a69c4af1c1bbea32ca18c4bf02fb17c14b9b10423757727c9f3f6e7dd08653c0e899193df554a30a5ee16a4cc2be337096e273a777eab4882ebf16afa3cae9048301d332ac571b5dc1accf2229401092e43bfbb692a4d519147309d3a68d497d4d96f4770792841635a5a8de026efc721e4510f437ac88cab358c09c806ca6004eb5569216b88e3c3b82f828f4e1f0d1a639c34b92298ec3dced1e8e39108be32461bc9e4e9bb47043f8a7451f2e8d7d27fce21b8fa51c87153e61882d5a42d669e3fb9bf5d08eec7eb1b42702fa1634caa9a4170e982fd3046a5d4ef2b0826c6205996ef924e190826e571900ee956a2a42820388bfceae32475d162fec0e796b891df87d761493fb095bf5b6a7a32c4c63ef0a3b0eaeca1679e148d0ffca6fb1e79b6aa4e9fb20736451fe5b567f51c2c7a607d2c867c3f12953c217960f22866f68fc6aa528fc2031725b252c7beec9ea232eec0a7d95857261f1f541d6618dc88f6e94546187caa8c90b6b198fb0d065f1762f0b15dea30171813f805935e9249b612f58e2ff8518945308f2eaef682d3c856f9258ed8c90b3ea562bd8f7453487417bc861ee4818b84ec1ea90b3e7ade9fa66d5d08e6821f9a5798bab840a5c57e3c486fc1d8d8bf66e41a0d9e2d38b3c8d582b50a12adffebfb63b4407d989e825866c1e5dddfd4a4e193155970a92fbf66cee3ecc3542c184be981c5ee418859c1820b692c86907534bdafe0cbaa5ef5b375ecc85dc1b4bd8e9d4baa4ac85bc1a64cbea1b382a90ea9292fbfd45e05abea3649a30ace3ca342f6b38d6d2ad8fcbce4371a51a38297f6907f52859815d533b2be949d099c82efdac9fe63b1249d293849f595ccbe14ec0fef73898df6469e144ce5b08eacfa28f851c8df6fdf5d1639a2e0ab6d82b6a67f083b144c8ea40f1a72b498c782826fdb8b1c5fd54da39fe04272f64d9f2ba6ce134c6e4d3df6d83e26d009f6f3c0f3644dfdb1878f09b8799c47dd2698bc1eb1a2be8f6c639ae0ff0721e19d738c18cb04ffe692d6e3497c58c104f7173525a7549f5cf2b8041fea67a669bd3f883c2cc1e56c12122a6ed64a8f4a70eaaa9faa724a70af1dadc64c93f88f49f0e947ca75344db78724f864ab5a3b3d22c18fd8f44974f1417620c19daa763e1f56fea4790413cdc75d31e8082e4b484aa33d1eaf6d041b2154874e2a23f835dbfbe063117c8fb73a68ae9f9ea9082e7fd86b15433a746851fd620289e0ae7ee4c1237e054b2282b1097abf4952c60e0fc1dd4b6753cf0cc15a26ef910f54524a56082eef8fd53e588e470b2118bb103df29c115f4306c1779667f83882e025b945b39063e8742098fa717e0f1e7a2a5880e0ecc77918b452e70f6c0f6d2a8a0697ead0f103db6553da23e9f481cda31ea5949bdbe3eef9c0edd464cb2031d7b8076e74a2e59d5c0f6c8a9123293df2c07490d0a3dad1a53a78603a7d889fffbe43e928c204ecc0950fd2bf63dd4d5f07b66b5b2c0fb7ef87361d78cb3eca394954eff1307360dff328663c3b1f8f2307ee255a7ba51207c647a1c73e1e07075ed33ee746b69e947d03eb9d2e84f8c31e58ed06b647faf741d43630a17c5c659ed27e65b3a14a30813530c90721b647f65003e3eba979945a1a188d1d9647e9ad3e1c0dec4df27156cc31d6e70c7ca738e1bf19d8d1dccdc3d2720265c0c204c8c06b471ede78aa3ecf8d81c929f44bdd7f477b62e0e2aae85508cd34b130b0eb9ade07d9f563ac8081fde8f1a36d47dfa47c814bfdac936285640ef102b79783a787e74149aa0bacc52c22d211f17e507381118bd0a13d729e24f516d8f4b110278f53488a5a0bfc28277b5fc9c3f0c96781ff8fa63f5aa6597a2cf0f1fd3d225549e5e157e087ee293e1d2b7031a7727f18a536e555e0abf34ff32c7b640f1598ae1f9e4ad853e0f2876f4eca4881db4bb942a654517d4481ed9ca4da54a26f67a1c0f9bebae6759fc0b505d5cdd61e58309dc0db4ff9da8d4de076bf33f3d90fa5c3042e27ba49a85dbeb8044e757dfdba3769774ae092588f3e84590f3b4b029b36756f8e9fb10712784fa72f7125fad247e0c2363dba4a380123f096639cbece9c07519962f019515611625a0e922106e7e3e18f2f55b9f5d81f061b528ace1ee77afe2e0c3eada6bffaa8eb351e0ca6531eadef05d1fa1fc060523b7b3c4c39da873e7ec19dc71e65fcecbdcac3178c74ce5c5aa1a9a2a717fc2073acd87df3829bf4fc83c8631ffd20b30b7e5c659536da3dec5617fc66891d4f3a777d3017a5dc3ef41f5f880ba6372b278f7a4344ef167c1e64cf561e5131576cc1eb99a4ec1ea416fc58ef7e1431b4e03c7c90ad5fed2ce84a967e183ab4b2e06ab3859ba6dab8bfc682cdbb2da6f9d9de748505e3b963beb1965c16d757703d154452967508717505f7a33c62fd9a7bbd87b6828be6963e9a3c8a963cca0a56bf332b5d3567b275155ce6ee116f0d4977a3aae02ca4ec1e7a18797297a584218154f0dd951deccd42bc17155c74e841ff78d74bdb5330367a3e16e1e3d1b5a660d5076def63e93c68b3148cbd0f6a24fb7e169314ac97f9d082f98f3d87a3607b22d95d8cd4aa5014ecefc6943afab87b2c145c588fa5b3a3e6530d14fca710ed477993e65f3ec1f558becc1c538a6af10463d13a68dec9f92fa5136c69b0d31f7492e0837082375b754f927dfa259be0f2d087d9079983c79168821f0ff364548fd24cf0d5c3507a65b79221c504fb1b35fbe5614c9b24bd0417248b5f14492dc1a979944a3f1e5fc8578209d129e458db294b9e126c2ef7fc63ef1f4bc84f82f74899ecdd8724f80a1527a79f88da3e22c1e706f3cbe90109266d7c643d9993b3fd087e5c113b67e5a8215447b0a126d9b34bf9d8473682f361b21ecd4146b06521e49487df22184d1331b25c557d9c22d8082a21b8ebc6b45922d8f2419eb4a5a5aa1922b8aeab3cca2c29ae5bf210fc684535bd07a521783fc989923648fbf842b03d6ccf31a74e08b63445f11e8360f735837f2eb1fa2108d6720c5dfbfd90a54720d8fbcf9cbe3b3bc50082efb1e74190aea8de1ff8c9e9945d6375e4da0fbce50879943ea60fbcda7deac8183ef0af97c7565afd95ee814d539aff07593d705de9538fab477109e481bd8f1e3c641e6b8a2f91001ef8710822b15fb3dd3b2e813b7093227b84d60e6c7a4ad7517b5493d43a30661ee2a76629e7940e9ca7e41d3399a467390756f353e8470d79b5220736fff83bc4de0eedc781cb15492d8fd3e183c0c12ab7cdf597bc811f677bc9bbbdce7937f031e6d48cd4a09b72e79d98351d373c70830d3fe3b4614c70c303376eb4a0043a74541224c0067efa235a4f0413bbd6c0e4f194498f338f2e57036331b64b36e9cd2984696022e7dc9e731e98478468e03a7d12c9b933701a3d9ed2e41a1d7a3370feef9b3947bb8f97a1746c112440065e2f458f834ff4d63e062efee8073d2a5d0cdca59fcac324c987eb230cac64ef95791eee45070c8c4db67bf9e8fb0257d1322aa984fc1c735ee03cb558f9a4fd71ca5c17f8f5097e49f285a4ec7181d1d11427ef43661e7a5be02e49b4185cca631c4f0b7c759c7ca9bd2cb07b19a7e3b8ea860c0b5cc63dff2c297a6c5f810f163b2d84a65eaa58810ff659298d6aeef1a40a8ca60e494b33b9fda002d3d3e3f541cc57a3a99b02a73e4c21f5f63dff782970e9f972854fc7cc3d0aec68b764ccffa31a28f0d7115915dfc5dd27f0c37655b117b74d1f4ee0875721240bcf587e378111b53c9de28a7e8409dca8b8bf5654e85166097c08cdeeae222946096cd6af8f74281fe649e0274357f0cd2281754d9a473d1e476027f306f5b71e792425600426fd283f4f4d70bbb0185c6ac69cb2b954f089c1fee44fee107a318fbf0fdc18063fbccabebb294bb70983fd9698edd2c1e04decca3c42d989060cfe7c72dabce192eb2ff8b1b4efd1a4f8e26184dcfe1021d60bde26af978e84179cb944ced05957c7b25d305173ca295ef2a81a325d307a296ff4b8b24efc73c1e9458e902f6558d471c1f8843cb6b8e11df55bb0fbd615de237389da824f5997ae72e64ac8a90593b982470f3ab4e042fd7023d4a534f92c6ec882cb9cd987ede6bdc6824f517b325eaa4406169c570cf18b9a57307df9d9bd973d23eb07c60445e5841bae60adca3ea5774befb7159cbaf430873459c14dcc63cda3cf1642e856c15fa8f443158c4a745ee44e5e4e9554b03147ac32970a2a788bca9187fd7e53a1720a367b9cbb2da80f52fda660a3b562aaf7fc6f9782d5ec22f9b69382d38b992d86081a321f051b47ed620e41513031e7913c8e58d5e39850b011348e55c78082d1b36e0b9669b36d3ec14690ac3e9193aa663dc145dacdce8e3b11da4ef0a38a9e8759325d4c514e303d0c2e9587ed699ddc0477ad6259c2dc35969ae03e5b6ac43d137cfaccbed65c122b8809d66f73b0b74f397b7609de347b1c628f3f5448b1043f2c9f16cb8354227fa0002218b11209b3358b1b6387e07a98c777e239c63c0cdd108c8fa6ee5aae10acf74853b7e864bb6c2104ebe2a31e47faf6fc9519049779a22dc775326d4810dc76f6b16d4e9bb6cf07821fa9ff94715a40f0c3c90b4ffff6e13df00f6ccebc39219fc60fece636495b93e9039f176cab8792366d1e1ff8d5e99cb20fcdc634b607d6efd5c7af9256ecd303a12a2b250fac4757ae4f37b5ed3ef0c08464c52dfbdc81a95ae91e1d8b3cac941dd8b43924eaf8544867d68189d9da29f6d874e0fa63a8182bffde739b0317d4fac792c783e4c00feca2d34fdf6886641c98f88398f515830313f33ada2d33b5eff6063e75598fef7aa493c37403ffb7eb993a44e8f6a836b09b7e73d8c0687b1ec614827456ddac81d38aea5ee6e3a1065e3fc748a19256dd926a95473fcaf941a4001a1891d0ebc389a1d1231438033f29e255cc655de1160a98815b0b1f6b4821590626e4f47f99242f84e764607de8d1a3a9e2699d640c7c48927b3bc6106d33450cfcf7dd85a714067e9421e49072d2adadc0c07eba8afd74460e999f9115060a7c81ff1fb11c3263fc64492ff0daaf3efe5a159eb25d60c233bf5e646db59b5ce0c779c22f885a5be04762d1029712b5ca2ea7596043d7352576040b7cdf4785549f7f37d757e03f58fda424cb0a7cbf8ee4bd1cf38675aac0674d653ffaf8838857a1022b1d11caeaf3668fcf29b0317efc51e7a6690d9614f85b8992737e96a0998902fbf94e35f62044bc96a0c094abb59aeff50476a2fe879b3ec8d6387102af41f23a7f7d3481abe45925ba8f3c680699c0e7cd144cb2627b1c7b096cea34291de38b879057025b3f8a6cb5603e0c5f93c0b60f576bab07911b2948e03584d8a96ea107fe1f81cfb7e9d8a13e058cc07690f6187fa4d1f437c5e0526b0e4f3f9e108395dc1bc93df29cf328360c7e9cddd30f925f84b41fc2e07a9cda3ce5c86d5291ebdf5e99531e0518bc4f48a651bbf20b4e424d5a2abb487fa32fb896341a725eb2175cc8f4a1bbda33ba6a78c1fe78f230f6798a2146cd2eb8be28a5d7a3c8619dd305276e2945f658920bf6d6bcafce3ae7ba880b2ea96f05d349c949de2d78b3ce0fea69754433b6e04286e0152935b5609296887e6eea41109116bcbe8b65eece2cb8aca61e3a23bdbe37597092e34d62c10fa3f6f893f5f883070916dc5404a9dafc3e088b5ec18ff35d72f9305e52555dc1e4ac88f879349969592bb8ce2cb79cc97b2222ac60e26665c7c9a39d7821ab6062a69435db47f1246755c1555ecfe3410eb9fdc33315ac8f479e422cbf8c294751c18af6a78c96c749ca479d82d31421444abc0821664cc1f4eac5fa517cebd4a34ac19d5ab256138f14bc6f7dde1cc98c82f3741bc163e7416d2e0a362bd40a45b9bba38f7c145d50b0d9c7d3efeb86ce187d8209174fb9df131d3de8097ebc5b9553d2931efdb68f52f0411ea8f4584e70dd3d281f859ceac5f64db02d9e53ba68af097ecb52ec1f669609de3f755d7adf986072d2c9fb5dc943d5fa127c54ff8f3344b75ac86109ee2d0fc7349a9fffb0ae04e7d9931682e40c36314a705b1e2a4f87b2182167128c866b1e6b48eea9ac8724580f2965e861a558c632125c6acc599796f35af07146fe210724b860b7955125e58d49b51e9030e478c4eea3fae1087e7c21d9e7fde5b2f43f1e72348237b5d817b38fea3fa6d478f0600723180f91244bc3d3a6732c82dfe897bba3c75504e79ba3d94aab3912c1ade98f43332c68c88108a6a63437e6dc1e8f0769ff57e3106c70ef4148e331049f5529995fb697734a871c85e02b327d8e7464ef0e1122c720d89463fb20ea3ec41bcf1c720882f31f844af6299a9984ecc04070baf61f73a47446561a6ab0010220b0d1024038c154731ec7cec8a23f30212194fe78549e47cd420e3f18b9c583a698931d72f4e1f415df5afdf3e0839553a14142baf8efa129ef9177b614d2073ef4a00f234d7cbc29da9592878349e8681fe5a6b40b0f554a768d1cd992b4229846a98cae55bf532dc521c71d58d534999e52480fdc0c1a69a8a10320e4408d14b88340c90e10e4b003d7531b430cad4421471df89862d58f3f7b848a5a3a21071d98c8e8a53ef0f3715a160a39e6c06f4bcec37c92c24731d5841c72e0c7c3724bdade308b31438e38b09bd23fb3bac5ef4f6963871a2938a30d3460c0851c706093549ee8cf1b49420f30e4f02eb477aecbe32f8df30337f083943772d4181e916b6b438e36709aeff6d6c55a15e460031b1dfa634f495b89c819593f7033d468c38c427c90630dbcbb8f9aa45e082519d3410e35b0559a47f26248962c75a305213836d248238d1c696073cc111be9819a030d4cd488eaa1d55a4a65e63803d717994e7a903d52cadbf01010a327e430039bc3365bb094f37feb2c68c377e428039331a55fa80f62cefce4200303728cc18c10dcc821861b39c200811c60f882fb5320871770e4e8821aaf0334c6c8c10534d670408e2d402087167600c17140468e2ca0b106073e40460e2c5c8e2bdcc8618502e4a80215ce386aace166b4c1801c5330e30039a4802347143407141e6898d186ef50408e27ec70341e90c3090ec8d10403e460c2120e90430969986000399220811c48c01c4768c377e4300202701483013888318c1b3884b1238d6000e317be2003472f2080831708c0b18b33769833cac0a10b33767c0fd688008e5ce0c0450370dc02086d862d6a418b1d69cc428d5f000e59ec684307de038f850570c0c21f6a1c331c80e315ae98008e564800072b74a0061a6be0c0b18a1d660c1caad8b1060fd460e306663c00472a76b0a1461b3bd410410270a0c20c34d6e0000cc8c0710a332a80c3143b4ab1630c1ca460008e5198d1001ca258008e5018331a800314661000c727c8c0e18934ce0f1e80a313387070c28c0be0d8041a07c0a18902e0c88400706082b790ca3a9daa0334cc20375a10821ee8d03102df61bc044038e6065e82363c043a74ecb84ce0b8c41d5ad361e97a58826ff19ca5cdc521e0a8043fca945e4582b69d66070725b8cdc350d94672fe91188e4970ab1952cc795c9fc1f260430d6b1c926043d597adde91e037a4dc9c3421e44d2e1510d86843074c481ae56a80031205c7234a07067038a2746015703482fdffc9f271accf483638a003042bb87152c0c1087e7d93a4cfa31ea8f65835d68f0e5010051c8b60735bd9fef062f4204345f019f132aff5872311a50311bce671e82df7fc10ecc7c923d5fe610cc1fa30251f49764d21d81c592a454f0f0721f8ac3f1e551e7fb0488be1180463392d85f0518f627e4cd78043106c104be998216a47f1460b42a0c60d38c0ae0314a4a1061b20d0a1a39c40066604600a3802c17750978c64a639f307087e9c43a5f88b8f5308fe814ba9d4d37c3cb02cc983c30ffc2893e4f1fa8e21e2dd07b6a7a4ca3f48d6489fe5035711e9be972b53d73d23ab2001c71e58f171ff2035848dab36d850638d1f389600871e58fb6188e77c3d0f656ff788ebba7600071eb8d50e596f4fac54f23bf0a2e21f93e58929946707ee722ddadd66ca1fa570d4811f8f352be50c97e0c9fb030e3a707af649bf736395a7e09803bbb5b9a6493a3cc3c32187c7692973ca21e65b12005fc01107de47a43642bc7fe43e70c081f368ab982eebafba83e30d5ccac30ff70eaa9b4cd217609951da03320c1c6e604a27379ed98e6e943caa14471bb85cd5abdd90a30333b676e4008d3678708c830decafa51b4ffb69018e35f09dc712244af0617fdd6b98b1a370a88129d71c2449ee721fb9696033ae8ffe438a1a26b8e1011d3aa8073a7410338a70a08109091f46fb950538cef0d8e398a5cfef9125cfc83a45b880c30cfcae0489992fae69c37ce08d97e00c38ca20041c6460daf72f996efc56afaf6e78e08607d23831d0048e31b0e7030935d9e943073c00410e72c081870e38e0021d3a74c08363d8386aa4e10fc4210646936e4a93f33297c4779814ec381c6160a73bba53f20bb9d18210e800052e40c10d0fdcf0800e33c845020718d8555dbff38a1c7f62860b4a1138bec048e62b89d1a47d52840638bcc097addaa7b1141924d30536aa9e55df8f1ea8c1c61a870b1c5c606296654a1cfd94cce0d802a31fdf3b5f88d117a8d102ed810e1d6838b4c0c512d5dc399677d6ac0b74e8d8a143c70e41e0c84276ba9a7e3f1c0bfce6d0701ff675853caec09bd96db28a15b8bbed8f9653fa51ba0a5c540c4b0b6a93a3029b93e791b98fc71a554f81ab982433849fe5bc91023fae6c13b73ea7b86e14984af9539e9a90d74281ad903135bd9985603e810b6d79697d241d52e8042635afa63c0e49d3e39ac04e5d5ff2181378ad7459023f1ef9787f94e79beda204aeb36a4ade951fd2f54960b232c65093c7bf29f53890c0e58c7be7112b324f8fe3085c554f4f1ca91ed40f1c46e0ac269974861ebf768ac149f2aa7c4183c7b489c1b7eae96ac8b126258aa5a8c46be4824382d1582c148904c23018e8de0fa314000018181a10c6e15040200c6369de03148003632216382c24181c1a1a0e12120a0c8602c140180c0803c1603010080c02c0c0e068141906fc0150e007453b385314f3078508f51a2a1d4a118ceabb16e85a3b94c98902ca7390604b79d41480f56b1c41e982ea891a6f8bd719bac8625fbb440b813224a07404c79d194899858a6b507da10c8742042a01a1fa6c32bd33a486821fa87b38056bf5450a07d40ea8f8a0fae8e51cea3f4e358b507813549f626d00235009a0808e7e9a724aa7bf28fd2a183613ae8f099c417141f940e91f517d42059a8ca7828ba96cbd28f4840206b529a2809fa3700b9c2860d03877d2d244055f50c06b5780d7f141f54584c386082af3857209c9eb06ca86720d150db50065014a03d41d80eae3d7387e4728ac4e289754707af250eca1264055805a80d210a5c752403a0397effc74d5285e87b12fa7c282ba81920265811a15eb633ee3a8be8f00ca6582125d50f75a8f11ed0d540aa80750b151d43d441dfbba855a016500b57a42f53dcb79a20dd45300d597b14a3b45029535a3b2c2c2c296bb65a80632e885fa850a86320fe5026a0254a451bc8e252845286c501fa1e61d0ae88bd86eb80bd597badf54be28a74f018b3edef0b8aaa87c0075cff64875de85ba07450b6a47edef773fdaa1b0090a28ddc857b40405acded669b118545fd0b1374786825da298b865033f6f509edc9bb6882b3e747578fae2ef24d434a84950d5a0a608141056a15e220f1444e68c2ef0628af59ce510085f6896888c8ca80dc19a331074beb9860cc4f02102fa53a2dce3ef458ae620697ac1e3396f829ee09be7693d702e58995f440ab6529b07dcac09619f6e62bfa90893e6510bc395a6c09e6981161c28d045eeade8924e8a9a690c9c2552fd1525d6d62e74799e9db272a9a7a03b1bbab63f72d1ac1a3fc72db0441a927819e0d9124e59d53fe27df262be2c5db01682af35b465592efdbf2eb05f6bfd2f43b4cf0ecca97dc81a82f3663c85b0a9c98f300b62daafc247f96212345185ae7ff713ca6069bfe7ebb0f4e91b2a53b54d28a81a20e7d339b615f16908508c225a639129085f2802732f6e5b9d3e6d0ced8d55a02a1c758f5f1860b0908353d1f01c50fe4871f328d329b9ec82ee3f29a5f8f03ef68aae49bd6bbe8b3faa9d8ddc9206e5917c7de6c3b2011cc89b2d261910c104e21c1b962feaf0cadc413243b8e1e735ae17cb20434098072e1bd263e39b41ee3c38f415ca7865b713d5f03b04c860743e3f013349a8c0621438a0d8322002b245e36123228123db5b62c670dc50859ca34c74e5a24894a339c409c9c1097d967dea8b20e32c095348fad76a6918143bbf5b42678f9138015e4b9b3d5322acb37fe2186d50e20808aa242a03964fc71092bd50610599ba68e221c6d7720099e99af1c5cde984488638a72f2acc858305071e80a2aa3ac999fed121fd570e05f95ec24c5470b6643d3ff91521fa7c006bae40ba821b57bb3667086ef0d49b4afd55f35123a07c489babd67e1f4616003ae562d9632f617de9ae27d6a227c7816f0540a421a814a4ebd4bf30dbb7ca1e5e01803b27d11c0317aad902765f4a6446ca43566d34c80dd0e700ed064b6ca61b72160c7e33e723a69032f38ac5353eb27260cb332580b6115ae4ac4716467b97a9aa152498ec9d354aabd9543ecb9918d4dfa44468e0d2054aa161775b3927c7928ff27441393ff66af7c5ff83911b404d56a55683c63ed7410899dfbf40ae9de1be1e0a7646077310405fd314ff405bb92d10dbb06000c3db4475a6129908702c857820c74be9aff5c7c81da1ba524c31d47b8a2791da2ea054183354bb9cb5bbe8bb375962d7b2d88c97f7b95ddd79014220c66034f2953d77e1dd9a835f0efe0eab14913a7d9605b6de4aa953b2730a94561c98d82c84e3561cda60db974f9099d28c1166fca732d94d9e5a939a83098b4696210abe6f0ba60df94fdc36f3c38bf9d6d741fd999bf27c4061779c492b683dc8df1fb80e63e6be63c29ac9bb571b6ee4b6f28d6ce9877923475923231db89831eed75d960e80b9e89ce66f621e22bb5e0b886e26c4d5ba641560689a6ae37e80155a687a151394db691080ab9b8046bfd8fb5cce81a8f17aed6bf61597ec729d5e836238e2121ce8eccde24d562641da7a4871a81888cfd72d1579aee6904a69538e655ddb3e46882c2abfa585d7f1998d6fca6d6b69d2006b8031422a1eb006cff05fc5ec72beec814531c39b47e5cb7623f26ffc1ba51b1af48ebb73b191b5aac1469a048b6013915f77d5873a27180a7b91113fa2e112c09777bef957ef45b756fb2705eb3c20d9bf54c34ab9e40dae880dfb4dd29ce5959ff301640b562d193f7fc5207063c2395faa216130a6862e008050af9f623034d845147b0c56bcdb4e6802a665f34b1ef42c369bc6596e275dfae73c84dc70ee9219e678a0265d3150c8fdf9847a68a88c50998d231c67c8140454f719e947daf7c62d935623a178c4ac1188a9f960c52ce21783181ab786a2d6914b208e97228402218cc501b77d8224027b111ba87a69960a4dc8b932aafa6f25faa2960a54bd8af59fb748f0080b27fb55539eb518e440da8e7b6712c3665b9f45bc3068c91967c7d78d8e301ed4c7e5bd4a25502a5d91e1d0020f8d1822e7d35c19df4742b95d702117041c464884c30d9f463740a67683c204caacb8fa90ad50b006138a42146e1b12ebed97f427d8fdde9c14afe5856661f02c50d07130d58637162b8c0de789c1d2f0b21539066bbb14112309f2aecdad243f207a3fdb984c7f941105b98fe18b7a6442b5d527fcceb7f49f5cd1ed7d1681ac140b0566daf2ebbcaed46f750ca966f4bc283cd5820d164a2aec929c109d4bfbbe0cb8ee592563d32a893c4ae88ba584caa0874e658fb8abfcc2d796319e4ee272f1d7d225c45f1fe756b3a1f2f2930b14feb22cf3700091f88f21a05cb221eeee4e3cf98ccebda619f624800037ec0afc2bccda8cf9a1c4746ef396f50708dc3661cd24649ffa16797fdc1984c19a76efac9b3024c062de0b85be806a3f202154dd0a6e9203992ddfff26787ada9b9144d9eb0661c46bb0b7fd66827ac3709aceff177416e46c4ffd94863e57610d93bb48e4c25d640bf9062440e640b21e05ec713ccf9f622282c889bab6be229c9e11a484b0aa44babf3786088cbbc2de520a102e2044d9517acba30750c7104f0e76d4e1c02c410da27e0908c23a98b4dbc8f75bdff5b392f62294958f60b90eb4b9e2310de7885c439b3f1e4604b6dca9b3e5560729397cdb5c197852858eda606c5e64f0fb926a4cdca66ab5063e48598a41b515c8878e6b92588f209e3d56780ce4614860ccf442f8b2f531f8da9892152e529162e63d42204ecc377197115e3e21a66afdcd3da86155e4ec5be489d42ac4f4f885b645b41b0ea29074163266843b5a2c3005fe20cfaa29a44c66f5aa296b0b5260dc24f8ba5ff1ea6a78740cb4bf4efbe29107ee92caba14d6553cb446af30f5dd8f3b54d31b5eb784608392db8bd21fda71dafa5fa47bc8bd6f4581a55324e79aa96ca796a1f57870e5b0f7d835a6ce0ae0f0050c1baa5a63258e2d1d47cfa41fc75e15617a0607dd1b1ab0e5231ede80e545ec2a95fd4b61b970359a6605f1cac7a52de057a4dee5645fe8a7d8743fcbb95640a43bf104b9f76ddd7b987d5c939a445d80e716e98ac005ab3ea63ae447608172affc03be20eb49fb3aaeb1475e9a913b8235f29e09b5a3fa2ae57d508d8749a71e648b1fa5637db8f85dd3359032b0bf28c563c8e9604ba868ecd8aa71053e3ed3526a8b042fedf6ca098f07e77ad8fc3576ad9b3fb88425a28e7c2edc22972ce95e13a1402b787c43f155c2f4463de4468021fb6b7005383932abf9c42e9e75c33253b06bed6dda29dbbce285d11bdd42ef498ba69c6a2d136cd99499310053316d7d03127a8e80de8aa4da2f8565d2c4f652d02f4d8896fb1e8e86d101bd7e196f19bd7062033d12fcd82bffdf51b439bfa3dfbdd6aa46100ecad2172170a0831d3620803469f16e61128dfd517e070a5fd2f551bef56946a8001526c6628c1595c9ba750fe7713ddd395974fcff1eacf4ec09fd7cbf1cbed719398e552f499a4f5388b4a0b83eb75a308b4622279cb2cdba199c1e2512e9ad6f51aa52fd12898ba2fe519e0d5f169dea96381ad494e673f1db7c9d0f34db1c195ad47e87b864e30f3c5a00f5cd788a8a56469d0f33c4b45f7bf0ff8f5bb9cd28571f94cc66175eca808e53942085b81b9337342367e8a586bddcb9effcd9a292929ab487d6526ac43cad0c0ce68f5e24af7190e060ef7fbf7dd6a974c5ad34efc2fcd36cc45fff7edb7dbaf7b7d4fd5d74f63c380812b6ff917c3fb4deaf2ceb371a0e7bba23ac4cd5bd7e7ffabac371d401dcc8ab1873d82598de7c22ac402f394a805739b6f682d843c4177f028d418a7a87047e973d12528c766e9356e907ceca57dc326617982a19d9ac5448c5eaa929f55ef77054bdaaf79aa7ca096e6d3bba5f3aaf6705d67edd6b76f029b3c0c7a1bdb073552d1234b1e8d31dc57542ed9302931e968b4443b3dd3df2e262cef6457ac96bb272a79f50a704f44700d1b4c8baf104423e1b273799538d79f76a007c98869b15d4b50413b4e4a2c2124710f3c4cbd3f5391a6b69ef002f45a1dd957087747f8f7ae781fb0a01e2d1572f7cca0cf094587dd7e661fac333f2c2f0f47f55dcead6e7f884cdeac711764ab92268f09201ebe680c76dcd00ee3e389449aa21deac795d35130ab8a654ff5ff7b0067b15e2cd2110ce9babbaf6bcbf66357dc51f004fdfb92a5d49de5fb4685ab795660148f32683ee4a9e772e7d251cd8034b3d5065c07c664d5ce830c44302c7b3c285f9442506e3569f3206b610ebadc2def6317ed0451aa59f9e68dbdee51e8da8dffaf6e24e48e7afc8a4eb78d1cd27ae24798671889c6f768e9b4276fee0e1d35b2b757676dde720e83b92a49ccf9cf0ff9606be23080d5f8d5a7afee7bd02dc572fb5489f77b68bdb4f7a2994410d9034634fda17ce2b93cbed084dd0d27305eda64833a2abf9226d231eaf885613b664771666778a13fe7551ad7aaab3ce6b8536544fb58b23543e30f270478ea45e3c4a3fb95888993d98d3dee6db5c4dd4957e6e733fee98deb446ebf66e6766e7bf3cf2feb60eabfce8d28f08db5fcaf8eed61b9f782040177767835ed2a6fe9cb553baa187c655d35c5e4f34ee0cc140b0662ddeb2bdb3e9ea698b025ffe6d5174f55fcf2cd083df75ebc87d1bb4bc8417f98a09937005848653195b9fee774a0b67b279f54a3ca4a0cc6d2bd4d8b9fa7b1d6b2a6664db6bf17b2bfaa7463531535d97aceb438e9884ff3e2b3076bb5d4ea0525ea082c37decebb99d761b1f75f363c7e2de9e26eee57ee6989fa64fe0688eefcee7f72a4a53b1a0a5f489fbb7337c9701d5bc3da395559aa43627419ec1942021431008d7cf8e6d3d2dc2333163344c46a667b01cf0c5e20d7de36a102d4729381a4eb8b31b712fc0ca4d96222ab80544dd3f25491d8b61b616856521a5275ded3cefb98a18eb34cace7baa937246d6df852b23fcfaeaa4f66b59a810e9f4081f6236bc2f3015033818afb895490633e4e4cc08cbce57eceb0c329bbac787dfffb527fcae746d5009bdd30cd5bab046556ba36f38e3b7bbcf66eebf473a851f9778dbdee59f173bf60918c22b9008e841b73e959c455ffffb0a7e5cd9f59c87f888959529dabfee2ae74fedddd27c2366e857521f31a01057b38aa7033d7b27795387de2f2f29cbcefd9a25fdeac3d1a74bb73355f0e65e91db8d4cf3cce598ef835aff6ad9da37ff9cc38b3347e90ad30a550eb1b8995bdf5d0b91b999068304b46d90eec9248258759f70dd8503e74e5b3ea5fc8d2d625b0ab76eeb2e71cefac4d5c562f25dff6996e1f6a87610f1096decc5ddcec441562b0d00b4966aa576f54cef5bb9f2d23f16a109f8c926f55a74e5a4f7e557f01204125188dfa493d9e1af327a723e8a5d0ec1f80db3f4aa4748910b344def6466e356957319159998ddc660fcce3add23477543064c1304a3f70a5abd0dc6f949866123d091ee85b98561e8ff8077a4bddbbb0f774a5fdac0ae3fdb3bacf766f06962b380dd77c9b78095ca3f53dee7b03010a68870f787b7dfbe2fae245276722a9dbf7f0c2bd456369c0e1943383772156b8c35013bf0fb9b8e615b71687a793651c2f6944d1f3ccb8ad8e2cd73ac8db4fb288bcd70d0bb64a5dd35bd9443ae8dde166ee2de6227ce1b28605bdec7693ef0e6bcfd2abb79b9bee8f0b95afbcb3f1addc2de9cde423ff7caeec821e747061ffc6d4018720bc02f9531f565568330d8d0e737d304d50d64d35c8f5e7096d5900a86be26aa70016ed5ae1083730d14db8f6e7a359f3cbbbadfd47cb2ad68150d046fc2fbd6c0689f596dd819d58951589ef2d4388d0597de9bc748a0249262f55140ab9789b08cfb9116e9e48980712485d2b09cf5d115e3f04239eca942254a1d850df4011b8c898ce51678b58ce56e03244a5050f19e22eb8af551b730361956544ef1221ffb79f08849efb9fa13986006416f99ce4640d19f61f4d4f224385b52470958545986dfc64e78a461a788c17c8f935ed3d6349ad9eed9c04c11ec8f2ac1e03a8e374d71691d46ac3bd10f1b8a848e4506d83a851a300bd3001c580d61222a954313a67fe37e997b57c326c6d7c799038df0dadf352d5266801bff5aec15ba7ab35ac658125f6b8b5ad13e4ffc52d4ae424fd4368fbc4bf483e6457537688594d76450b9cbbe429dc7e912e3f7ec4587ba1fb523ed542da036d04b6850462bc84d7cd17f1b8295f133bcd047d18a9cfbafda651d3acaa81f8f8e4f5e19dfea9eda4bf54c78f091e82a65e581ca301bd10dfe9ab4e2bc83b155d0f2423df3eb4fc4280a0d1d23740972a4524c8bed92da69dd57ab4bb7564bab525406fdf0197b2fb482405bc1432b515b19f290dcd03aa8a701dcbd43708daade4094615f29140cd200ca5e59578b0cace348e30d31c7ef3c96d4e977bcb4dbb892af2340b4dbcfb48dcc5e7d17f12d112c4e7d8ee9421d387bb9b3fe0d10827c789b06962ec54217b7db587ac2cd8b187707b776f8f27c8a74befccce5bc153f1bdc8ff23730f7c7d5501df180fc8191cab8fc15d298b52069a49587fdf2989f623182b8b2599d4de93dda6fbaece86b82011fcbae61a503fc3d6c11fbbb98fe9633ce797fc04103fadfad740fa202c6b281e69b923d75343c9a9c637308176afeb006062c9667002bf1790d925c444b016a550db092d8dba549aaeb6662e41f27d77bf9f0f80f256536c248b3191046754b5281eca8e0c8fc1800a9242112e5121c226f1890620a1456cea87690f3984881a821646b6db3292adfaa3678d2a829478b767cf3a63ea00586bb9ba8804c2adb3095fe48a944804ba0a241932d7aae0303d245a04987b4899905b95e40e3b2ef0d853e9af5ffa3428b8142801e4a020266c1927264dfb3e8247de61117d9790ce2ce21e3a004125a272cb8ab7bf802fd2b7cc09c1ca0825da99229074d50c6817974363b6b3cae5681b6aee84e2a19961410b2575a9acb02a72355e74a00dd249c8a4cd4d864ab6cfcd9904978c18224241fa0c48a60beb1f3d80e988b9b9b121bb12e3b62f2184bfa740493b3da9163c5faae0462326f77bc141dea353469f691ba2cc1c09e92cdc3e47b4203e04627fe98fc8645cccf87955eddc54bbac314966b40e0a9ca548823ebc92dba5f9fb2a0dbebf4d948f3f7a8b95ad49076169bb896adbdd2693471c20b6b23847fb1ec06b0218e6d0c33f1014bb41e594d68e2fed907aeb9c53849f89900fa997c98e806b7086887b7e9336303824492cbd35fc0f209858bec98905d9830c3714aa9fd961fcc325e8de26ecd217ec669a2d4775ba2177eb577a42c8cfe900fb5f294c3a6fe470dd5a7163ec3c9ab175939891ac00f004dae5d4703f865874e165c6492995a7efdc22bb0aa0e83affda4c56ed589a5d2a4fc50fea1d332dc0529f3ef2f7ab523da72cade101a34d9636e084d616d922001521346e86b3a1b0b6b8fd3fad358e2f6f5afe3027d2dd294c159a4a8c802a9935e533f1b39bd8aa3c3edb513362adcc93d88d2e0ab0eb52b0200da2b4c04382bd3ab2bd9c630db4c08e10237d36ed2e3d0a89bb17f4b5ed56c2ae6662672e530478730b4759b21305e6024c926cd8d21ce831b5b38b76deadb3cd878dcf8c4196093099bd9ad68a63390bd585eb8c1d70570f1a105d3110222f3d19341aa153852d97f30787a31715aa55c865a882f503af6559cf41e739cf824848968ac6bcf819dc80ce13d2824a87b2018c87635b5b110e4042aabdb5bec4197e91dd7204c42701d06ab2acf2f7288326e2f627a2200e92ecb3bc380625d3ed4cc5f69dbcb438ed7563fdc83fceee65ff3bbdb937d0d1c7cc6d46256304126cb556706890c0040f0c9019ada84f7918d42880210ef9277cb27bc8084f39e87f80c749c5a086d55f6e1112a2f0165bb744ae81c5e07100314e7eb965230f6c53cfc8c08cfb81a7af6d54c22e4cf97cb1c2387702fb51d306e6dc92268ff040c770b7f89a75db535d9e5542f0204fb1ebc61d5c01869832e30fdce9ae9536ed0f3a177590148e3c5787a541e0f701add964b1546fb1e0c60ae8cff7c034a0f801187b4b18015dd2a4896d9cfbe59cfc67b6d0355a0bfb6bc8b6cbebafe266a21290fe630084d615d9fec613f5785486b2c4ee91b849d5e493e9edbabcac16495864ab26ff80a0f8e2a52adcb59331e3c2059b45fdd1271bd072fbff452fd836ab55ef3f5293ffc3771d3d8a367a1693af1602b8d791e25f8212ae70ce9ffe4e8629c26e83878b819b5e2968ab23f399967a6c0dd77c7f5cc85411767266325b699a2bd86c14016c6278405233694117e108720c092a009b92364cc07b723862bac113310d0587323903662f9c55426c11aba349661a3afc485c967c2369068f8cb3e7fcf58a8602b453e00b4115a21372ea036991cfe5f0e6f9305208584b8d99c44daf0544e654ce564166a01ddf52cc2f1698201badd3187491d66419a8884d311f83c073ddaf74f9cfebd4aef305b327299b0463521f2273190d5939256abe148d910304be79156af5974afd2c86be681766ebacf05055068d17521787058b3e5bf63c22763e22151971fb7a0390a9a892a41471f8a27216d80a922539a26caf4cbd0fc5d8bf00093477fa2e816edcc2b6204ec87bc8e701b6254c574bb8d5798f86d37868640b12359cfa3fdfdcc6f31c245aff346fad2b2fd1b62aa05d6e0513ac97982ba4246187b54aa0243d95e183d0de26a94be2e17ef18f3c3c8dfa1ad2a4490368f6fe29d224d817c5e3d2d884284de1b0c938445b3fba933b930783cc95e524036dc1ae43dfbe3386a3387664ba66adab1a682d9a8386c17a2cd6f23ca59c63d0a48b4157d35ea2d1d1426b7731b3f55a35c0c89d3a6a37615100e16e0ff5f3d4edab8983cbac41089b568c03fb3a273538dbdbee500aa8b4ea061a81a30034e461a4680c7f8e6825b3a8ca74d426be968b0f974fe19f9acb481327ba0c89ba23c325295776a9f4989db49edd4a3ec6f23c2f3f51c720e20e6e979163f09e163306fbe09f90465f735d8cfe3fc7e8770214ea9d80ac020e75b9053ae07992f780517141f3f54ca7bb2df29d737c3afa4c7e555f36c7a57bf94d039e8ca1b43bd4ba55bbfbb03be79747dfbc3510b2e682ba417214cd9e1c1816642bde63b6cf3257950092e7093f0300e218e848f106ba89e17561546a0af56a353c30be8b97eff143ea6b95616383c066f48ff26c4d438e7125e4e4fc9fb7bbd4b2b6686ed012422c8c3212e7a763fad141e086bdf701a6f81623baf0f809d3bceabe2be8d9819bd74e3d9faaa87124346c3d90d17fe4976f7ceab9e7a2368dbcc9808ed4166dfc27091b04c18033ad63be8fbf7174f4257c91a69ebbddff8d891129434eeb233baba2f167f6daf7a4ca2216c8ce86a0bcad58b02b613b9acb758cd7b2d9f7e28ab7c2e73530854ebe98726c00cef692b81a31e218cd33f92880fabecf31f2eea86fbfdd41a74a575676610660254c119fe27faef0634415d7cd1193c0d0b18223b87a7b1d809016a688c0fb6b177ba91357d585a5a156230c02ad3a08964b63d521e2f2e10ba6600af3db5d4bb73657ec73f4494a3ca828363f92429c19230bafbc08b071e751b57d846893de367a75f51b852acbe25521e0c0c75ba283be5b85965903166fd4127275edce8947e8516d408f9587cd3a4da32cd63abbaad08631a7a7900bddfb2a04c5e3491b953280785f81e5e6d338bbcb4f4789d7e4d2f15574e094a94b35bab35912721faae1c190d46005ff3f67456e32e39659ac0ee6f416220537531461816a2e066263da305eb08dab3d3d91f8fc122d1052b92a0f9c83f066b5f8052c896119396f3c6c010c087c5a864afe361cadecb1a0bd6efff17dcecf98434fe9193870092740abfe10509c0ba76804b7cfaa4bf6e7933f5d8bcb1d20985395c2a62c244bd7ed73faa270bcff4a60ba62abe80d39441109c2604ede8e54a899de9eb981ec00447e94321704e183a0ab2c2519b03874f628c5dc2d9e6673815cdb91b74cf1c8b69377051e5b813d8b2fb5e3ea2c440902bc03fe357ec1deaa286bd3bbe9411b1c7bde39123ec1ef9783cc3d6f63c375bdc9ca441d4943509bcc74f7b6e252e3949c4f94235915b23a2ee7f830711835317b33dfb731c54cc8c612aae4df8dfcbb9eaa44c20bdf6b455d6ff7e7a95e1a98f0a2679b63993e20302f58c02a4448d5ec05bc50c8e9a91b4e166a09ef6b2895a81df97982697b35143f64b8d2763b8ecf98b4f2afac528c20fc59227534efd4ed8c17eef09bcca782d350f37ad1a2fb0745ca3a7a5a6616c27a18c71e9da3e816849572579c629a393e49ac4ad9a8d87d139bbdf65dde94121e6cb0eb290e9797db2332ae1bd7189f8c8958cb0657ef55307fd7fed539b670b82067defaedb9e4c370a342202aa9dbb923970b0a490033ccff33ccff33ccff33ccff36f5fe3ff29fda3ab25922425de3bf243d2d4b97645a4ac90cadad67cb299d0b898d0b898d02cbb40340973091a094458e28e76a71f4d8fe3c822680c61fd4d953a7f0cc96b3a88a02184258dc4d50ef13054b404614d126b739083cc8e44bc296800614f41637c50d0f8c116e3aa757c397283863e58b63c980e791d47dabf07cb996d4a7152a4a0c1833db4e43a65f2ec608d7b69193ee54cc7319fa0a1835523c7ad5b8f9322afe9018d1cec519f84f48b73991ec780060e16cf908e7242e463e7e009346eb065da98f921ab9662d7e241c05790e00b2df847d05769020d1bec29baa46b3f6fc44cc917344c69e1eb5107114117ecc515c485060db68ea399f6c797d673cb82b5b8422b051a33d83b865fc8943fa74bdd0cadaa2e3464b07f1c8668de477f98f38a2ddc904023067b0e55211d2c85eb8f6f2db8b30b2d12404e0091d080c15e95f769916a96ebf382257e9e585a91d2814f3a060d172c7d72795636e6cf61ae8a20345ab0d8f96cca69774542d760c11eab1a35cf8f44cd65154bd0edb01ca48d90e2aa8a752253ca1c163fce64a662d31cd252a604dfaf011932ee0003155baa96655d6e5548a759304eb17520a1422ea6f27ca1d2c01619b032810c1909c3144b1eef38f4f7d23f3d33b44a1f609462af92edd0337cdcf7fd25000629360f3e88be0cf32816ff2094dcc588289618fc7e3ab0106636148ac5336fe69f8864f3c100c57a6721bd830f11607c622dc941a71833e489d583598e433e3267eb195a5a9c600b2d4470451758a419607462eb10a205e9483ca7f1e0c4161dfdc143ca1542d037b1e85fdcf810a303fd94195a0fa0c0058c0c3034b1c6387bc9e43c985e9489ed724338d5d0db8e6c4cac3976509bd6fe4b2c9aafd7c388954ccbb6c47e1d97784c29a7127bf833f17c2ea7848829b1c7c9431d4bb127b17c877790a63f92583ac4895a0763f7e74562ad0a3df13b8f793c1924f6f43eedeb8fb9c9f111ab54bee081ac460f2b3743cb0b188e58236dd97707754673c1dfc51527613462cb1ff9e4f413e9fc163a02188cd8a3c821c7e50cff29cf456c31a47a4f88ca68bab8160c43118b9787e19149c41c2b4722d6d471be3de978083010b1c7699ee3a704e3106b47ebc0ca521c8621969cced762fc0c4621f6fa281742ecbfb1d3647bae3e04c62096d0c1c7566642e97408620febaa2e2a8387aa0d051881d8a34c61ec73f869e2c301b1d574ec0fdb1c8c3fece331fedac5e9c7f105861fd61f95d4239f02a30f6bf2bc1fd26688a5c5c0e0c3b67dabced04a13c0d8031d650e2a3922c70cad2ff00b187ad86346fef8af66d805187968020c3c6c221d36927b99a145aa0b1877d8c310ced2d9871d96903b4a489f75a8945287ad2667476592733d08c1a0c3fa176d32aa6f7758ce61aba4e6b1212b4cded200430e5b590e571a9737a4b58b37411cf69ca3c8e8c1426747311cf6dafb50cb4bf3e618be61fd4836a76031c6842add40c6e54cb475863ec08b2db6b8c07bb1c5048ac068c35efd7b12bdb462870d4b6f9cb4e83b711d7f5000c61a2e0c30d400230d6b8c34eb510e2dabc7828b0c80400bb20dc040c3aa1e2e7da9769c61c99f22d9b51252ae9400c30c6b8ab2641f7254116094614b39494a2a797a63e50c0c3b8a793453699230c6b094858a1f79482959ca8121863d679e0e3adc168675447b43a46e7e983a1816f3dbf2f9702684109d00e30b6b6d0e1e442653eaedbcb085d9fbf06244c44a524b80d185cdec76e356fa6ed27c07607061c98ec3dcdcef7d18160bc0d8c21abe473bb2e841541cb700430b5bd8bc29e84ee87e0aad5e00230b4bda3c1ad42787163bce0e30b0b049ac945f9b7eea938601026420025f7c01c615b68e3f480fa5d12906198615b6ac9c27abba42e48e02a30a8b9748a85a9cf10f0d0615f6b853c29cd5e7104218803185bde2dfd8a7d5f9e01f52d826947cdc614893f33ca2b096655ca688b167c3030a7b590e6bf672a0a952c713f6da1c4eb438953a7e38618ff97bbe2bcb7ee2df047ef24b266c21736343e53004cd2d6151bdcf201e468f337925ec71c678217dc8c89147123abf1309fb477b7951523fc27a31c3c37c9436c22a693a850c2b113fe814618b98eb6052f028269d08dbc7a0113f3e435853e2f84f7f87de8c1096943f440a51258698202c9a5666e36c20ec9712e652587fb0c8aff7840f6aa583f860aded28d94c88229ef560bd8c791a3e9d27a49807db755a69fa8cd9c1661ec5e867a10e96f428e8d44e6aa82c07abc751a5fa47f59090c1c152d1eb1dab2687ce2937d8524cfbfe3e4f9e631bac1f3f7e65cc69235d83d5eca222a7fa2bf39406fb471adb943aac7470067b1afd902659493b4b196c29472a93cab622fe3158630adde8810561b087707a6551c5172c9383281729e12a23e882d52c7e33444e4e9d81d182ede340b7a3c9587e773058b0c77539ac1c4e525ce956b16f471a4abd423ff830552cdd77a9e285be0b1d4bc51643485391119a238f8a3d0ecb634e39a720a939c51272102ecfa78a2936cf08bfa51b324e4a9562fd28b2e3cbe1a458364f5a68b28fa219c59afce3703b4e8e10b228b6cc9762b05409c566e11d7de59cf1412db0b8428b2fb8b8728015a058ba7c4309a00964c8e8620c567ce28fa3bf3cb7bf91c00a4f2c93b5c9325afd449f3bb1448f6253c673cc422b38b19746081e493cc8d9dd0c2d62c526acd0c4aa39da2d8f2b450a5664628df130544cb16262cf71981a3b67c72516cd519cc4c44fa2669a159658ff425e0f3657aca8c436fadf5362b95c219562cc9437df93d83e7e9c3a45ca92d82ad7a4e421463ac48cc4166573a5685696c9422b20b1c60ef15d671fc4d68a472c9e163547071e07899923f6bca9f9a86a53579a1ab1e8d668d2541e46ec5d91972c36ca6a9417b1c6546b9535a3713494032b14b18e4fbe98f17185e8cc032b12b1487cca714ad20a446c1d87f605d1e411413fc41e7cd20eaf34363aa6090dac30c4123b2eeb89f92cc4a6b2d3216d75a7e0192196982b860ab7da21e203ad18c4eaa15276601dd2771c2c8835dfe6dc6955bc492f107b524f89377e617384e8c00a40ec614eaffe8e434ab0e20f7bfa2007ef5cc9bc7ff961eff8e0f7aba30f83d87d302bf8b079f08bdcc08a3de01756e861ffc86ee24e4813d2a779d8e3428826a97a31b3c4c3e291873b8bbb26359e3bec659b9372049d0e74b3c33edb15713574f8d13ceab065ef447e7e90a3e94d872d7d07a57169add7c3cc61b1cae8e164e7d54f49392c96d1e3c67f1c72cae1386c1de7df0c4949346f0c1cd68a17cb438c12cfb37fc39ef2a46245f1dc316800089f06cde1672ab17ddc61949c26a934e703de045878c120f809c890d1850c1994d846aa2a773da4f4b74d62cb4d9ba38b0f27ee86081b925822d243256acc89de23b177d039c86d88f3e1d790587f2e0762979fd978c4aa31661e3b4a87cf8f9d04361cb1668ea3e0e1c5df88832029fdc715f2acef04c8400408d0c508b0602f7e010a870d466c369a6b6726751ec6bcf882045a6071c58c662fbc602d2fbea0c0735101065c400366118b7e67f830dcef450a4e95830b139011bc08b8e0620b2d667417548ad8f34287e9725c5321c478b09108cc379fa5feb875f1c1062228cd4c9924462d9554b963e622ee7ce838843221c383aeb061882d684d940d93e1799a422cbfe1a3caa92f8458573ffe60dd21a76c1cc45a32e3391199c3da4f105bb49c4c35a122224e3602b1468e227fcaebf0c74380d866bd7ba3ae64e30f6b8e3a3acd9b44c23bb3e187553478e4954399fe48e26201326468810573e132646cf461b30c1d4d7a0ebbb2c187ad72949357770ef5e29ea175fc0aa6ea22017b583626f5189f27cec8758549c1861ed60f3b54896a399c7f230f8be787a79bef37f0b09e48a6fcb4f02fdb6cdc612dfbed3a0f1dcf8764c30efba4ea647834f1e23f5e05587cb15187b5a7d34eb2af8dff4ec0051725d8a0c3f6133d685e880ab0a8aa321b73d8fc27ff7a525aee94a372d8d3fa7caf07cda1254b041b71d8c3ab53e5f85db5de2b1c4a060836deb0c43f0d3e493b65d81037ac3baae7a9a355f6d174c1461bd690ebf342d2f8f94c22c1155a6c810509f80a1274e10f48c1f13f00166cb0610f2331262e8d1b6b58c37468e72885d44c9eb3a1863fd03812b57ab2cf346c91f2dc689ccdb3104a342c1daa53de10e1c619961c663a4d62f1195a58589917df050736ccb0eae5669affb8a55d6e9461bf950f3f4544aad8d164d8ff838ea351be8d31ac92236452c72962d8b3d64aa7ab3ee54a71230ccb268f540b69ab9bc4056c80814adac9eae30bed7ca03db66115420e2f904c43237374c11cf6c5103b36e6e8f15c60ac72187f729ca2da026992e6881939e3470bb2a10525e69e0f9ad3038d6a230bc6471d59e674c142213bfc6f0a6739ee4c1136aeb06f8a1c64884a3ec1dab082579d739afc99ab3c0510a00203f8c34615ee4c9d7242bccd19fd51e10e193f94d578781f99c271542d24a632d890c246146c030a1fd878c265b1e1848d26948c036c30c13696b086bf9b8fb2681f4339432b05af004d3b6c28213792606d7454457e9a33672871c30612d29c21698895c29ea15501326c1c61b5e89d39a6bf8d538dd50f368c50328a601b44b08d216c0861d18b0f9631b9076c0461cb5fc132558c0fff04c216735a4bfb902259f43f58ae762243b2db07eb07a923c983ba078b5e4ffeedbe943e7978b0a75d0f5565f2c788f20eb67479513f0e4b1dec1f5f885f990373b0e72087b5b525c1c11a2465381bb3ca124908368a08eb28a97514b1c192922a4e4e35b71f5683edbbe35da6caac011b34587fe63cd37918ff73fc0c9670daa1c1438f6bdbcb608bcd711c79a6740cf698cae3fc1c3132690e0cb6e813cb2343f38275f3d3e6c7e1826d735430ff308d6c9f2d58425e1c1d99708305fb95e6e464173c3623abd8e3f1a41337f6f33ca68a72ca82968a3da6a3068d2b21ac898aa542ac70d64148db903ac5b695fda9cac3145bb490bb6fb42b6888344ab1a715e9c99d33ca4183144b86a83995c94c1f0709001c3446b1e6b47b5165955253c5002d28a0218ae5bca27ad254111aa15863d090d2a6f010146be4f0a14f6cb93cce716c48a1fce3534f6c2a17426f5e6e5e44b8c0e28b12345b19ae40a31354ba9e983cde92136e8a66a93cb34363135bfaf8b167caf6b6efc28bea808626b6bbd8c18d77befae89ea1f522e02c888c000b2fbee080462696bc14257a1459b617c6820626b6cd719fe6647d6125a271896d362567f229f0028b6612705f01022db0d0020bcee2b950d3b0c4626716f252e40a1a955842fcf66e85f08a19a6c4761f2a7a9663ab52de02045e7cb1c5155cbc17075f81e6048d49ec41ad03f1a0638e39de0c2db2246848628f63b673dedd20be7224d6f48f60c9f39e55fa676841628fa3fb484c753b481eb1594c95cc3cd4c88c418286238ed24618c94ba5ced02a60d068c41e06e9dcda90b5ea031a8c58f283bc721639da7734434b17b17dd449d55e451f8d6aa10513216828628fe871189304597031e38ad7e20b2e4840a53fd048c4b6bb21e592648a0e1a88d87356473dea09d623a938681c62fdc0d279c7314556590cb1faa5e83c31a99de66021368db0f3f93fa64f5211628f52acd43998c7aad50c62cdfad13c1debb2d3258845d22c674e95e1a01188cd62744aea100208b7cf736e7f2855e30ffbc4bcd3c941878f2262060d3f2c3b5b7733e17b2acad6e8c37a532a6a5165824c340b2e669cf261b19862ce954e68ec618f4feb3127c4184b369bd0d0c31ada41f09b10b9d23c1c47599111c73cc82434f0b04ac839f20fda31f67d5a078d3bac7a53fde1a372bca5b1c31e075e9b3b6e7e2895b28509ae9883461d9649e925e3212319a1a3c31ea777f7a20684c61c16ed28e449fe2973b294c861ab2829eee3cdbf580fd183461cf69092c4dc41ea193b1d0edbdd4de46c9de74fdfb0ce74dae8103cc779224468b8614ff5dd771d9a677a9c362c1a45c653472939ca5f2134d8b05e5acd4dd44c88315ff8a0b1866d8377a093c2c761da700f1a6af081461a964c9534a8854e493c48030d7b45feddeed81ea17186753c0cb1d3a4113524efaa111a6658a2e57da7e474a183080b4b83461956dfd44e69ac83f49872060d322c69651afdc1c718d6b9ccb898c22286c5f747927ed4e62805c3b08d07517244a9f87c0e011a6058eeef363dc8dc25f92fecc162a7b8657925e2c30b5b9e6c9cc5fe5034fe5dd8e3db8d962a878e82e45c5836c47777a5cfb173982dec51ed86b014ebf76bd5d0c2393ede1ca375a74b6122d2c8c21ec3890773797398d850519980b040030bab985cee7eb45e61cf1b5772be142565cb2b5e05588ce0890134acb06a6748cc8e72ec3459d53f175e5cf1231001179f45d1a8c2a6a13ea7cdedb842326768b9165f12902123111a5458e2a48493097b62d19ec2b257d16a42d01c41430af4d8c7c5ff2b8da011855536c6fb60b526b433282c9afc83c7d44739b06415349eb096f958a558ab3a618d9362574dbc953bab094b8e1b4bd73ea4aea699b0e7b3f03163ba2c8f1f153496b0476139f93edc94b0860e3c779ca4763a4a51d048c27a41366e745a4e3590b0cf75568fe58948e3089be44c6669a2250246d8a3b636673fcc53e12ec2da9d2fe346ff7fca5bc58a0e4372f088e3b07ae50797c3457fdd0a87b5c3b81fd66fd8e24ca5d2df74fe45ddb04547fdc925f681c46dd83ff268f32b54ae0941362c3934cfbde0715d7c0dfb6e4c123c4a8e58fba961cdfbfbbd1f57e3e62c0dcbfe686858a52c69c754ceb099696ce81ca5e8939419da4ebe97610b2104cf6129cd495647904186f5d35a88d9d549f519c33a3155bee8e126430cab8d5dcac568391a1d615827e7747a721423950f06be277fd81de6263e434b0104e802052c01b20a195f5827fa468f48bd17969cf4e25dd8c3645e39726d2e6cf119327e458a8c2dec371dcf45e96861cd1c41c736b32f7293853d921da94e2907f32716b6ef94b3f0087a7be215f638e68ef41ba21596eacc99536ec758feaab086dc34b9795361cb6021691df984146f0aab5cf4686cc8a8369914b698d9497258afb47914f65caff8f4633df1292890b423a40e7c422bd24f58c2cc78b892f38365a808329c7087318307cd8eba8c049c0541818c2650db351aca83af3413325f29f10a11c4b284533d639d07f219252cd182e7ec153b095a8e52b098d267223990b0d7df46aa881cc48f3347f0a3fc6a46d8be62e80a8feff1cd15c1983ea9ea9a44d83ce73063a5f7c48ad80cadf2e201460c3286b0e44ed1615e1e42d82b781863ea090761e9dc7170329942ee2801c2a21fa5c9695544ad837eb04409394ca239aecc31ee83257eb86439c5253bad7bb05d8e42df8dc478b92e3cd853fc70eee32412e4a41dac51eec3a8d3a492cb43075b8ebfe25f4a9353e6e460ed8e3ea414c2e7c8ebe060918fd7ef347b2756bec1f2a5f936d7c739523436702a576c7a3424243f20a306fb6f5498f978176292a82083069ba694562ee24f8ee993828c19ec91a3436d799fff2f832565cee151782e067ba4aa3907da1d0cf6b8911d7142ba34f917ac627e134ea5ecf34c5190e102363ad849de19a32755460bb6cd713c123ba658b3be17589430c860c1f2e9ca435f7e154bc593980f23ea976254b14cc8bece57fd314533154bc8f3f0267d1cf6ea03154b94345ffde12fa33cc55ee1bf420e317b6572a658fb227430b231ed9fa414cc77cf4c8ad5725f0eb6e28d624f5bed705515c59e39cd52fa387a857542b157dea4dd20d651e512144b489b2266fc10e1428c4fec1fe495599ede137b9473d0ce4a67271689d72967ac88a176e4c462dd1da25e6733b46c0b3136b10493ce8d67d3e5e18726b6988314f16b9e4cec2158840cdfdcdd946262f9caca0fa3ab04428c4b6c3f172ec4b3b3efc42fb2300810400104a82cc4b04496693f5e87d1dc75254ac93e981cd59438887ebe96a77b7326712a4951f732ce96c4d79f714ec4a2e3483ce619199a93334618128eec4ff81e9114f3884ccde73fd09e1ce8c5118a47096b5b7a7f23ee70bb630e232e0fffe782ba087693c5ca90b91055c4311d07577f314efa60220c8f1d3d25228234b90ee3cc87f14310d62744afdcc1e4e30c7118414368b4f8715385a83c8831dfe4c69c7a115c518c042c8105649180b3b8e24770bed8c2a962106231d398b3438445cf9c2ed8015548c059101ec418c41ec46418f30c0b628fd3d4769507115281d8b3439b906363348f03c46a6193857429767fd81ff688cf1fa6b01fd5a6da0f6b8a19c1726de2ffe63e6c1fc550cb7b9d92a8c7876dd52fe2ef957bd8c286e9a4c6e4b91572430c3d2c7e1e6b3517ca028b0c9021461ef68c398c9149c9fac0623a10030fdb4c8e43eb087f3197478c3beca158f0983247214cb463d861cb90fad43c8e211fc2408c3a2cf9d1e825cf8a94c23e861874d842fe9c2a74ae3ed552c0450662cc61dd9cb36fac2a76801872d8728eb41d838a5c8e9d20c488c392a3d44795298303d9b1638f8e070c31deb0240991f734e56b84186e582e73ce23b1fd382b07b9186d58ce57ec73e86936ac9234787c1dd7620b2daa2cc61a96e49b42921cc41c85ca4321861a62a461153d09c9bbc9927d4a0c346c72fa31e7719a10329f053f175e60808b57c08f809b0931ced0450c332cf953c183917e0457bc53312046194a460c32ac29762adea79c1863583453085d89d0a9427f103480049c05e1620b43c4b0ffc7b3fd3b0c7b78e9ff42dc5833f2cdd0520264a0015a3c062a4000051060030450c0175b5c40868c2eaec8a251604d880186753c4e79fe4f43eaf8bfb07d561e0df6f93cd04d19420c2f6c39f258f33729f477efc2fe6154929e142eed4773619f8cb936fe8c3b88b185bdcc36079b6af56198b5b058a7fb8a699a39d04b0731b2b0a68f1a9e92f6fb716061cf29bbaf8368993ceab8c21ef6e338333b74a70f8a6185c5363b78b0fda143d382831855d8f20391105277a1d95161cd5d29f3e430660a5b79ca218565635675d4af90929d28ec71f2f652495ece1386c212ac738731e6f5096bacd899f1b7d386ed842df63c8ae7e9d1e6093661cf141fa2326398b08575985f4b95e27fb684c53f0a972762f4ff4857c29e792179107225095bce29e9a869f81c3c48d83676f438c29e53c88b0c39b0983463847526538e7248216d084f11960ab29e543dc73b3124c29a31b252771c0d61ff8bb13c648e1b935508e59ac7331d97475f6668c508c21672984f0b5a9f313e202c1e5ee824173e8eb4c11f2c217760eb918ea72bc907fb0739ee4afc687288b8077be0717fbcf4314dd88f078b4e8e9a837cd10e169b0f34e5e01d279d44075b0c136a264ebd4a723958b73e9c0d5d5bead138d867b3d442ffe67d4937d8f273374d698e0d969539f3f06cabc19a32fa26e47acc33330d16ff0b669a42c6209ecd60cbb9b46ef6fafc3296c126d3d1840e8f37ba4262b084dc8a949e43f3c03436c480c116a3ff947c1c47399ccd09315eb0e4c92b777da9993eef822f83c7981ec46841613257e4f03a44849809a6108305cbe7ca7988be54b9dc2ad6a8c9b9520e57353d6ea862d39eed8e37f38494a3a9d8b2c3dc211f66699da362b3a05b17adaa43fd580e364eb14d0a134274d849352d53acdbd7e176744ab15e76c7612abfb9e4db20c572e9b123c510ce3ce66eb0318a7d53d09c7b62c34677512c514637a37d5ad7efa15874346ae44ec67a0a28d6fc1d7d65ff2645f87c62cd8ea183c7e179620ff273d37e789dd8227750eb616258e938a2b0c189d53b4aaaae703257dac626d64c91ef8ee834616f7a5cfe7161d8c8c41a3df0fa8dbc21610313cbe7285c5defae86985e62bffc38b249b5b1e8628b0a5862bd5bcb1d01525863a43f4761b9332351d8c256fa27738ec54aa1b0e5a0576c4dd227ec41ae18e9a2a408f5e184453caa8e19e34dd86bac23df1a8d1d47dd0b2d3e0b0510c0b5c0020204c84004082043465d518720266cf9c33e9af8714ed3c9252cd3617d86a428614d297f8e195364c893b0279bb0ce19bf7e52242c1663761021afaa8647587218265890cc5b3a31c216bfa4223f879e4294455846e4a483bcd79772222c159f42d250612ba587b0edc44cbdb4b41ee60861d10f393efcadeb9409c2def17df01d8754d3271036eff39c9837e7d507f9c19ebe6ab772ae982b3f0030201facda9fbbe2546285901e687ba357f133e4c1123e48596f7c76b0cd9fda5ffd87251da783255a774e7698aaff5f0e96bdf349091d076bcec1c6a3ac79fce80d164f696b26a9b4423d1b6c9633925efca590c4abc192c30f6a6fae234d7634d8732deab6ce3c50e966b0790a9f37c40d5b9565b08499258b7f1bc2c53158f3dd556ce7cd241918ece7511d6ff8f89d27a117ac29f973674bf3a51c21172c25394c99e3fe903a88500bb6890919f374743a22c4823de5b40f268f55448f556c398a6b9bc3a78af5446ff27e187c6325156bba0eb7838cd61154ec6187753211df18d153ac2907e33927688a25ccfe460e3b2bc5d2376226eb91624992d22c6d269d0fb3516c9283b0d321bf317e51eca9a7929a698cf408c5124565a3cb2cc4a08362ede01f5aee68e783f9894d93ecea54ea8ed979624ba13e6f909d91d1aa137b947298b4e3a0721ca59c583e744c497936e61237b15fcec75c9e6a629bdeb0ddda9c2953948925ed4978eae6bc4b3b2616adfbbf3cad3af3fc2516dfe031e7de85a6e45b62f1581a35236e3bc2afc49257375c66ca61daea9458d385e9c03ce793586c35528e3e1d879743124baa4e1b625f9c073f12dbe5bd0e353f4a4b21b145ef4b1e43e711db4e8ee29958da11ebe5b0b12f478e2c54ba116b87eb4a126a46ac1e3a39fc198d91c38bd86b25e6aa88cd618851c49e99b5f2a9c38f454e2296181d652709b5fdd041c43e1ba3cf482649abf910cb96e434f9c91862cfe961e2c3f5b82f520ab1f8a5950e825508b1c5ac6419b9ef563c7410db74fcf7716db2e8292a8865b63a8e9d537fa4cf40ec41be4ccf1445737704c4923a92182ee6d5cb71fcc36a27de1562e6c02315fdb0650e5308b9d27daa24f6614b21480e71453e2c9b5133d639a59aec61ed4e3abdc9634791e961cb18323b9e9152569887ed83e48e32852d8d3b1e960ee213d3f788c67977d8825ca7ec8ee742d8103bac6135c7b4495142b4581dd6202abdb3316935a7c39e3c88e774460ef19bc3963b0e4a7e22ef4f5272d8237ce5409245bd0a290e6b88eb6142ca20bb31e77c500038aca7a927c5ecc891945980376c9f3ae40e91bb0b37ac153462884173288fb761ebf9c9d820177f4e366cb629b986453d46a2222207361e6ad8bed38729b59cddc1230dcbca870e731ce96b27071af6f071acf838e838c316242f9976bca7b99b61138d72df69397ef429c31649937cac3c0f733019f6983ee5a763d8b462fe382da27fbe5e0c7be69c595fa10fc39e2948d8b314dbc1c3c1b0adc6eb6862fb17f691302159a8e48e56f7c2fec1a34f65d7cf9cde85553a763bdcde98a6742eeceb19133a1df26fbab7b0071a2ba6427c7fe7b416b69f4d91fcaa73ceb3b3b056caad520b9eec7360610f999498d471852565732a058f19ea6385d5f247b3396ade0f3555d8c67bbffa22e272102a6c9642c7e726670a8bc89955dcf035951c292c27f5b12fbebe7275a2b0e6aebf543b1496c9f13647fe2945854fd8e6d2f64ef87cc7c74e588385e9eb34ea4179dc84bdc3a57d8428a611c24cd873faca2371b38425d23c925d776d071b25ece144f5ed10f1a2c59824ec19ce234d9344c292127fc37c465d0b99236cf16436b7433dcebd11d61cc87d14d753f86817618d4d29b1624afb302b44d8f3765cd3fc31843d367f944548084be70fa379a407f90461fb346999dd2b5b6920ac661f7ecce6fc60ddff0c9ea1a33ed8e398622591a429e48df660a98fe2b9f3e78258ca832d7dc777b07f75b02984cceba8d6c19e4314db0962db393473b0a6b892b43b878365cd4a337c32e49edc604f71359a42ce1f15b3c15a59a9d7f2c7e4b8b206dbdfc8c99aafa78d69b0483c4f21ce0567b0448b1c865e8b0c96aecc311a66a6771283e55272cff77e0ebb210cf624fbd3517de84f852f58ef030b913933c27eb8608bfdf73987d7b7e5518016ac79f3c60abea13bc80bc082552fec52674bb36256b14586e8c7531df5a1aa58245d6e4ee7a562cf1553c63a891d3339542c9242c7b318dd29f6991cc7af0e63bac98929d6108ff3343144624d4ab1e630e3c187ebfbd521a458a7fba36f3d328acd7c3df0903caf644244b184cbf99ba37c69f5118a35453f983cc9a3aa3c28d6dc9154c7df418eb3ffc496bf1bea4c2486f19827169958934f8f2995629d586f628879bd7362d3cef1c4e58f651aad4d6cfbd1c2c39d68629f0f620cb17c63a75526d6141d5a5fc7bfca614c6c936c74835e988b31ba84e1227c4d78144bacdd410ef3e5b4fa112bf1c6c4dc9184c941897d22e2ff6ae7181ff993584df5b6a3f52e893d5546dda6c750d57524b6b1e87198c39c1f478781c4be513b7868b53f620f734c580e3f1f85fc71c4b2e123f97cd949ce3b8d58f3b7f473fb52cab1c388a53ff2e654ca8b783c557c8814456c1e5adcd3def31c3f2e116bc5a6d58f3388586ec4c3cbd7f981e5e014783106198758535633fc8ea67c9236c41ea410cb3e4e66988d14620995dde147fca0a124422c5ac9ff2ecfc4041983d8babf43254f1f8258347eae9bd09b3bfaf840ec9d638e73a74b51a3a301b1e5f8736959ca7b51178204197fd8ea3bbc3031a9787c39fcb02459cfe0c1e4e8c3e6fd1d9d27bff2503d1fd6fbe82fda5e58dedff7b074e6befcd2dd8cbaeb615f4d9f730c9363c7c19e876da63a45bc27e5f81c0f8be8c7d6df774e3947df618d394fe7ce412ea9bbedb0c42e8d18fb382ad5aec3f6d147dccbafe9b0279dbc7cfe312ce6cf1cf6cd418c58f2a9bb7e96c33a39018ad3a804f06422592c1488c401612814c58051f30113140800182c2a8c0542b1489848d2ae0314000342221c4832281a241e14161816161c0c84c2814038180603c3803020140a04820291393c8aa80f7108706730e332dd0e7e0fa29ab079f96f4ac088a0872be8f66842c6079e4ee7ee304c5dd545a773401228bdfee78a018c1b60d1d9f764b958d2b208462c32f1a46ba68e829c1bcc17a586504e21a45970380137010061c941b3841c098c26c04cd8081761d549b05a779d173cf35d2984492e0a15bde08bf61c0aec8a480799e23132f78f70b516c154b09f8125ad84cd2d14966cee192c076b2cd418b81898f7c17cc01bb3d542c205c2cb00c780c160f5419e8482136808d405c405c80568022607614ce40fc2ae09584800bc6112091b67230f01dd089b43fed2721d07f36d025810d808dd0f422034ba1033217a421042ab833209652d6163728a8d16c2e6ac3e8bb2f4a6600c8ce8965ec099409ac09c006a0b6c016a1b67ec0f2c57304220b8830c6b2db970170b5ec20020ae24a0000287a58492e7fd0bac145811940aa40a54ebc04be42344ca0bb49c8159e61018d9b8809f809c004f804f604d202790bf05ea94d5d70cfb04ef1fe008800f2010b0047004d818c02dc020402490917a8c2942a33387d353f085b9a2e5f9a284598b2ab90c1af12fda3a6380b9085c89b886948940fd90290005c001788d802bccd7b26d7b80d78111036845a005856ffdb45c00e1035a10e02e0baa00883c6095e2fd19610500044804600440020002200ac08bc0153249221eb401c2063806fe3420cccab69df90100024419805d43b99d2b3a1b401340032c03b41c205cccaf052806a013204503d891cd5e509800d600e207ae045a07c08880a31b653a20cc7bd7165dc0b260d00960ccbf1100741f107eeff0842cc021c0100508a33dbe7a9e21a2393cf023f06101ec985dd1eccd00600329026c0320358011c47505491f4060a5938b370f3005c401da0da81cc80588008833501b055a82ea9384fa01b47cc095b02135ca008e00a000b03ac002c101af8b00c03c207100d3011201220096015a2ad5177778024d1740b818491493057a0f882280115e00193335e030b2108d404e1f43588d011e27cb7ee099f531a1d87b886680277c069c195abf06804e8f7193c76f0c86c3ec8fd34b845a8bef63a9b8d4c503aa47053e4e82fcba530b72ff6c51c6df42e7c4fe2456a06b1ed73e85ba0647c5cbd549a7a241b84306b12780e186e6f1033ab0c4e4d0215571522c939e535c18041e070de886248b428b2e2d46b73c67aebe1d51199646159a451b3c151e143b8a318a328a18051d0518051c0563293c0606e4fbf51474143c8a3d8ab859c185abbdad79516221a742c422114516a38322f714a2661cd545a51faeff1641b8dca2546e211985e81a95fc8367d4042ad84274eaef2e55c6afe65f953781b3f5c1b47a6e8472ce800fc610c0c8110819bbe15ab41a276bc5b260aec44453532754cd0032fdae48c0a223520a307da29c289155b29645be06724e257b1793eb067bdc4456d2ba1db65082ec69ec51580a015a4a0e374f7b73a8010122bfb57e5b0f82e1b167c444287f2b51367cba44401817a122b15244cfaa5f68360fc19c1177c888f24981043744f4087c0990b8200616ace356930f6bcde04a8229d02aa25ff3f2ffe75567f9533ccb8a2bdaf974e63a1e367285af16185f392ee54b0cc818531d158ad6b2ca4ca5615a03dd52c3083deab434913ddfea586b5168f1b41e0f64ad34b149e0c9fcdb92f10a77aa7d77733b7d55ef8d082146ee5688c2313ae12ff72bc9f39797ada93d670fd685d70b5a8e5916eb073b078f8b830be90b261c5f6d2f3f430e865f5430b82e485d5eb05e244cdf195aa7fbade79220a773b9a451e2affad120fb4972f905785c613d47d06779a454c1ac9b6e8814c954587fcb4e6daa207087588258700100256b8f28249f2c025440916883b8dd3f7f3ca35d8a9d31176329365124358d76171a41f97200a874a45d968cd0df01a8d5487a33e0f1000bcb85ab770748d4ab158e7d1cedb64165107af8384e248c0da32390079c06942f7c92ff73834e4b07c5014d30e89fe50b860d632bd19fea49b3ce749bdd3c57ecb171d0fadeb8de9c859a1b43797068d64ce3e57068f3118709ebfeaf0fa08dc3902c251d737190571cf21cd5eed15283dfc69b8bf9d8a98cb6a9fe9654009b5510bbed078441581bc0531e282941ecaa5ba41d060dde643c8bf0937f93c3c610381771492841520b1a324af5302286ebc698adc55ab19b8d65b5e8c1435a81308d1c91a46420b82925031208484f1a65eaf32a95199b5f2de14ee73d4ed58847aca112908ef48f6e872d7b854b0f348a6919e1a846d53a07e53ea2e486f03bfed023f1b3fe3fb013705612546530f7e7d104ed9eea8e75570507e945df65497b1d7dc5bb4e8844ebe84d2bb6200c594afe3029719b30ed11d0e491cbc49474533b20e7aa54bebfdd7c443bb0aca9605cdcc85838feacbd48a6aea7581227b9c6cb747b5a5350ce3b56a252f1fb57681dc84bc71692269bf7c2c26c723d95176e0326625482b8c2ca8e2d3ad83a553764ae0248686009204f0b1c20ea61a9ffe8690eeaf70322c85369442c3a92f4d5b2245beacdc181f629b6e710b4d882697e3903e6d789898367c268ff87088527a1165856b74cb9253be1bb5aca33a1d06ccbf2c317d448d2d0361278b4c13e83ff73ff653c5d2174f874add2e2558b64439e9c228cca01693520c4128ce8f2217a7da2fb4e235a1500040828dd06c2d153930e0498e4de21e6de131cb24b68d71e0028dd443d546dd2bba2a64ce04e3f83c3b747f697f5f806900119240747a1e739c8fe8e6d93a58322018cc0e9467850571b03053414609f395505d178b0b4cd1965113f26ee376a09e911d1535f0c3e140a681e28e0b26ebfc880a0a85d2570ae7101da30bbc91e7e5ccde3bebef2c4dfcf9f10d9cc1dc9f14cc74a14f8531ad13b5b6735f87efaa922ba436ebd405336d5170c81b6aaa4c5c640609a9edad2048fce4101afcf341e259f4fa10e48579d8d87d4fc173a767108a5b496524192e7fe334121dd5eab800446157aab79f0edd839b1afb45eb768a742c727ae1b3145e8910cbace6aeb4e5297dfe05f1e95892d8613a52da8e1ecfa95b5816043f5109c5eec4931fc7225bf7179122860f980e30bb0013f440b7d060f5d8b0192cb9692eab1868cb7b80271f558e0c5d77af6bf202f2e7c03c70f5a69372d41f98d2415c204ff52ad82547680e5c2ad28a3572826a41afa811c651f6ca7342de912362f24068c56efce2a2762dfe1cb07bf325e73821772248d6f0189c0bad6350e400bf1558feedca6242992ce1bf640c23fd7a1e535e58524af270467c852efcb1a6c1f783d81f72b9884d789d718f85ac48b76fa945f88146c22b87d70b0ec3d145daf41af45af4a5e47790d5d48c95edf44329222db9c1bd033784ddb1618c1511a14bdbe5296483a91bc96bc405e00e575bd854447fbf1027a55fe020003d5d791f89afbc8f9d7757e958ff2d60bc2abee05ee05deeb285309b5a8dd2952e633d3ca1745fd8a100d4748f60660681d2f9760893a68256364b1a34ee668210b088f22122e1184f1b1d96dafee9dac24b243ca2adde549f4dbbdc7864bcd408ce2c1ccc5c6b713b235c092d451cd85734351a2367e8899274ea1c692303e19bc1949e2d83e22b52176e72bb5f864bfa8f1c5be919acabdd620794992f115e223f472770aee012596f6f1fbe01ba78fb3605fac5c7431b25d2dbffb1051d4ee8853a939c753a031e4d70d284f562e01d33e8ea7f75907956a11ab111c24c47f94a5d58be85910e5934084769970f40162d2cdc564021a569abc887e7fc105187d7c4eab956a211e357b4f841b2c9fc70f4e348798acce920521c13845e8341ca055bc3c139aed5fd7e6a0ac87016acc7e1f33f940dd388884a726d0881939de9c467258e8f4c8da58030a4377c18d691f09942965c918cccf3cb1364577313c701e3e048d4cbba262db8ca341846c2170da6254a7c55d2e0925d790e0e58cfba2365b6f3bbc670df63c575886a77b867676cc5c4cbe754f069ac3ed354de42573db191a760bfb348171c00476af680bdbb33081a150a71f8d2eb7e57599a774b5e89aa9efdd73da823fc48da37966003cdb377950d365c29acb5cddb9cc51ec1cda47584d2158d6556fd9515c3348c5f28af8890b3ee05a8f70654578d21cc92400f8cf29e2d0f847c1cc72e22e823fa42cd30dcba4561cf8c7d7f40c9e2a90c02f441fee30dafc6cf7c532647bb0308bca6f1172d63be8aac1b3743ac122ca5235e2abca35a2bf552374f4a0ede8ff055782816961918ef38f355443a47a23069506a9347656168115aac1ebac48249c16526cce3b8eb5f2ba3693dd0641272136a5717cf9b3f7c3697d0177025a238e38154fae0e471c503eb731c9aebee7f0dfdcad7783d0eb854dfc58c8f93aafee0f08d060220034d417761707bcd4ccf3973702149d3dcc4810609d0fc1aa23440f16850e0641a8e5be264225bb008274b35286a89250af1e529d286f1135e0a41658d388f31ac356cab07020cc01c73a04f749a439fbd7318ccf98ef7d32087c8774f25b74977ab06f4689dcc423962d4b542039e585d777ba0380d34b49442cd1c1469032197ae88ec321fb2b545df5ee6c76bcd578dc9babf50cd3a5d985f30c0cf0fdc812abce58baf3addbecab0016f4d3752afa07f7d5462e76c84e3581ba83fb486f1090cc4897e93789fb767c09c148dcce7261db0ecaf70160da42e3d9e25f72362d07efd93956fc38bcf9fc58573738bed7c58f15b8636d0b491cc0e522889d479b16762493a456ac8a5d6eaa54739100cbc37f065cea8ff51503704d8f13e91e34e8bfc62a1c5397d930deb5dc004bbc15f709be6046393ed6f6d5e621e3238b8df57e195a0f317f7813f9da1c0c1dacfae200cd0112e2a90732d19ec29f96b79d7811a385a15f89fb33cccf5ebc45eef15943c0fe96cde4c146f23b29ef428823790148a2c6866ad0884d21b32582549af557a44d5501eb013153cd33b118fcd3ad3ca30b16332f59bc607984ff6a339345084cd079f738922132590cba0fd02a5bdce85b14b3652e6b7a90741051cf8611bba41f49aa4bfcb229290d2b85db1d3232d7005462b71e1bd5d485e024426b697c9a0a44b102619b8ef99cea0105e5f06ad194a781e543cb1d30b3b66a326710b7e3029d261961a6cc13616f2d672d0c4920c41524eb9382c9013ab070b3ec3185a8adadcc66ff84114be5fce4de213356d2124d0aba91e1dd5e693d431f8d148b740e94b4b6a35deb5a7579473b48451ecb6b15ee4a497d6f99067761457c81bbdd0cbe9fc0c4621a4b9d77938ec3c6a3aeb213fd9456bbe68503e27d18556501f7c77370b4c58f20552a0d956cdc82fe27660d0ca3b0c55e94843b538cf8440974296b0feca939dabc58886ab86423e77ec5c0c8c2e94af803294344b7dfca209a1219c08485b7e3572c0996806a98557ebe4d0c286ea0ee130565ac405234acba9aeea3b478ad94a803b642cef70accac1ed70a0ff5630594a78b8b865be3228836f0f6db32486cac83b20f0b20eaebd5a419bf2e50e3c5d60524fa61688f8a1da81abd8a66171da3b244a327f7dae3afe4a48dde8b8a71f0f5b7e80977228df514b02ac1a060fc93900c3282272e0333dd82cbcc19681122c9f5946385f464b706e12ca4fa3a5dc19cb32e4a1734cf5bf8dc3c3e2e9f5b7ea4652c8120fafcad29972af85d82a7a3b5897a3aae50f7e8b994891ff3401e830b9c0c897110dead2c804480c6e70b9071ec4bb0c011f5b26d04ea6b5d010184666f802d8525ad6afb2a9d5ad7a6a2a16f29e6d03bace136ce1da26d0f38c62e38c6c24cd036bda3160de168f8ebec0cc2a7609474a80d33ced78681daec83308c06a94eb9d04c6b7e1d3481bf0dbce894a66807ee7870cbd8761bbabae26e3cd60107d2323b317ebb3e49fd09229549b818b1726a3a5a14a04a2319fbd324cb3b5919a5416dac73bf9d4c3006a1b1fc48638ce915e50323ad02953e32bfe8981419467f53063065dcb381f764de0c661269d3fe42a4a3da0b0acc69961c547458759b7e8544f06a25f3c6cc3d5c4fa58b1672917660c44c0f10d82f8b6a2e27ae24c6b47db07e9a6a53019586fd5243e8493c752ca41868569ccbb27c36ab0914b7aec8cbb8f5ed114f77c876d4115c6f6be7241400cdb085072d0eb6d2898e0a6153942d6798db59e82ff68c8b4fde5ca6802f8e2f7732f1750baea76bdc797427548b63f51f12e275a6f0980b3589820554e78f698ddc4a2ba40d301df1e40312cfc613ebeaf1d5999a30a099209795c34a88759505e300db042479abf24e8d0f715e17d7393f20e91d0b733a6880ad80deb53be68a29bd5afcb9fa45e6a50cf27fe9f433288cdac99a6240d96954d59190b43ea4ab2479d6f9dd5a424cb022d8306cd5b8180f64a05cae374de72937dbffd6577b04da2e83723995456eb8e97732a228c62c9f6298b009b44353f12264887015f69b20680b049729954fc7c67b0e6f85dd9108dab6c48ade09180ca988b89c5c6c72adaea3375e4282b7d1643976b449de71be669002fa4beff25d1dddf91ea8272af0d841c92b9bc4c3e6a1259184240f3b55cfca3b02d8a3e43eaa3f0dce66d63fd15274ec007b75f1a012bdf3946998d364d0c2e7998a707b80a9a8858c4a4d2fdc2c353c31b2dc1eaddb9212e5c121fb3dd2e54da714bc9c4b51992abc966c03c04103ea2bbc9409635c02d8bf51b76de21d1b422a04d89ca76fc73c0aebf2506040472dd3305bc6b840f08862f4d710b12e23d282906899979712c4dfdce5cff4aba0175b4b7abe29f896bb08734a08d467821941e48433841915c5ebb22621f05d9096f75088bf8a0c657fe607ed5a4b6536e51be2af52900e9238b69ba1da19e59e810c68d606f05b905e58ecf7300846e37e24ce6985bda3ce95a8cb42d0d3ee3ab443543825cfdff3ef010519ee713c7f428f9814791c5768f1a0a84de91b15d2d60b612531d2b82ef89775d936c4c28dd76daad6169b7af743ae2fdaa854e3336bf1283f9f3396ee8c6c55a15b4e57a9ac6a30fb3686fd44b896da88d34d9464522fb5999214477bde1aceba5215f680541a2343d0f6e973ae3d11520d57c6b4a2aeb1b03e1924b1961ecd1de6008f55db105d217f75019594b8dee4640801469b364920c5e96c6b607737bd643bbfea46da96dda3bffe4a93a44ed6c288eb61d6a100574c0081e8f37a7a510db7068c9ecd358e0a85d46d641bf181cdc5ad519957756d56f0e6ca40fc0dc01c0b0d43e205cfffc7da194921c1d021040eba05bd12a270df1a3e12646dcaeb1fa901334eb1477b86f36bb58dbc1b5b941cfa2ad792fe61cf049f2615df6489a072d50d1fd8b25640a2f285205a5309622edbb91bb37058ec0cd58da8786ca76b6d46abe39c0b174c22534b2823af49aaefdfdff1e1749ce23544306c67f2520704c92a1a3a6b8455c964db8dd6ebefef4013ac95ac0561101b9c303a1cae7d3854426c428a04620d31d88a1c2bb1d25e483e3e7101ee7a822e14093ffede24a558be9a383649bd83b2a152bbb63c2115ac1016ecb8423c4aed52532a5fdaec522c907020f6217cf7131801f082f87d6637a77dafc235c0963ea8018944033f3bfdbc4f29edcf992880ebaaf063c75e98c71d0b0ee0f2636ec1c0856301bfae455ad8ccc1f1d767c07a855f1577927b448a7111ce5305f1acd8b460ac157df50e09905c05c0baa744796523e2e943938719620c04ba12e02f135d3de9e8efaa1237424acb996e4ab453bdff385db029d1d153ab0f510629bcd4364f06ee389082018bb12c672e7cac18335b61266971105a6dad3489b0ac897abf144882e2ba3ed9a1f3b92136016031d0e54535d0e5578a46824f48d675aaf48c1a8545f22169c241a1afe285e49da739ff2cf6d224419eb6ad0c1afeac1a85870e8aa03430134ef398d0d266f78315b5b544812975c75599a01f8716cfb025b09ae8da101801750174afc1ca7dda94f62131b69d098eb17544b5a28ba215d153f21640ee27c863e1cefaf9ec65e24b77f6ca79d85c4cd908974550305ed0de77ac96602690f3fd95027182c548fccfcd4b8c38d22d2268a79f3c738bbcf39fd630ef795190ee00f603a450b8f2a5ea96ab319bbcf8ff4b6dce392decc6aa69ba0b4033c9bfc800a433749f7ba6040b565a0df696a392c8cf26bb60fa6871517520f6e401205199079a1af4c816d863dbd69050a6a1f91848da1e2d106266d94dbd62c99010b79ed588fdb5c44d7987300ea33d1e7b84cc671ddcac575182a46eb31014b0be45719d219437d8e17d3175814415083dd614a7187c92e80a3f06bfa09c6724f5f2c8be3fbb086d83b9b9f2554abbaa243b607176809289e90fab6dc562a025c4ccc988d3c36024951c308a2d7e1a59a744dd0c6ad953227911ced0d3129298136886285a450a9d249524232c435542129ffc6c269ff05f1f1749ff87e8b1f948ffe00fa2020694c0b58a1991d48c9081ab6b04f087e7781b3e92b64c2370c2fea6a139edcf35d215e9d89c4e7a4c5d8b37a7d67bb04f0e4451812fbcaf80d0215d2d6987f961df85099b30ee57b3e35ac09db4582631b295bed951fcf41e652c8fab9900389002475b978b87bd515dc0f7256cc3fcdfef65c76cdbf647398dc2b665c7801710ea4b38544c05b719a96f3b0dc3d087345a3d4a770ffaa0f8aba02492a8e60e327ef28e18a8776797353c44691cc0718a1d6e95bbf9778316361cd153443b1debbb06e1e3803d6c58248a26ff6ac55d6641e899c5ff2b6b7036974eb037036d2915615f4e895744f7a37d91a0e6839015212eb5cb1f54d62ac94a04c94521f1e5c34942ae66f5c3cb0b016043d95edc8b1555b67a70d0101d67a2ff75b2ffab273ff8a798519499007183bfe8e409a83884a928ef145dc629db90b2149a9d3fc9a41c7dcd1043267b2816bb15972e23a4eabce092e6e219e1678fcceb88fdbac3f6e5522c7266002b4e2e0b5d023290e72350432fe0b561e43a1d15146d12a70ca01ec19b3229cc5705701f40a8ed662524d9c22ec922e61b2813202c28c2095a2e690287159b3fd6d50b87a5c733b407569e92bad61029641d7cd04434150e1fa513ca0cd0f0f1d9487f3a00458b25f213997535cad56bd32c86a36767402dab98e321057d92df4a1bbf915c4d9b6b7a75c51887a6f182f2e22ee776c46fdc781201c14d6a3eda11fbe6eaf5d28a9b5ee58ea463c106a51161b223e2b313ef1fa5eb4646886b1000f2ba58cd5ee9d8fe5d23aa822a459efb05471e33361c98296fea19223a7e8fb42e393b67e1ea14ec2230023a4315ac41e64a13ffe8a7c9a8e9e21452b416992b315e1098635e9a1a67e7aecc92b9d22527e03f6969333b89f67818c7ca57d6864c5633ce0267a05c28a02837101094f47db5a80e062d3ff14504d541e8117b72b1b84ac5ced3aff9eb47d92caeca05a36c5ce24fd8b22556f85193871baaa6e19c4ed3a71584222f6483385b8982f15d0a4c9823cf8cbe38a1b86e6b049a2e9275abea897bd5bd3d60d0e11a9dda50123882680bd0f518004bfa4c8d6c1e16be4ab2043c8de15ca1326e0f284b811123a019b64a2a82cdc710516a0f01f09759895db344345be12a712a0223f1be23d2c4a38e3303a78d26ec6c40842c03f7d366388d6c09cc7c7f052b9322c410cf4d6d798d29f4e96dff1e935afb31d4246c722d6fade241d0181b6a087692d4ec22f37b8e0e6babc04aaaf529588b7fa547e274b233066b279c8836f50b7c9b9190b5f2080f2c935d5c905989e4235f0c0183a38081febe316804479ce3216de6c86bab83ac46387997a4da2d34380a19a4b67946ab2f01b6c19904fd52dd841d27a189f9f862e93a6860291e5842424f3ae8cc447626f36a81a18f5302b55089516d4dc974c18afbd2e9b738a5afd898a1ac1d66f7b131bd56026c04b4a65eb501541a97d4a3141bc5b46c5550cb81699e10922b5a26663afdc492836ab7032ae037b1e954af7c3b06828ec8979835905d982321e7e56e85440660b2408b6d534475638ca43746958076692750061f71864a7772afe81829002e926a7aa6982f043c8a0560e871980ef30b7a76cfc83d4ad228c3572df87f49e169122297ce984b85f958e543b83c4e9571f51de70c4452ede2e0b79a694e00e8aa027528fa46a82240f40a5a8f9a4560d240a5a532905e122b4b594609b5b1a797016e39ecf25b37ac8aafa44687dd9583b6c09882fad08d5e23d6f8ba2f63484784de6124068935f951bb7576a5a60f3110c8d47056180988936ae45429773277215c84b466cb981cf3d3af7b83f8a5a864c4db7ad420ef2fed7eeaba74c76831d802ec65098f2538f549bb109f33f9629872a164efb64d7db2111a8d0bcca78b93cc0c873f5204eafe654f769ca0f4037df99d42b6f36cf3eba47fe9783af37c37bd1fee7031911b5f477c2044d3e7a4353c7e2727aea151be4d56ac637803d97efb54f35d567928c7bb8bf7ecbb672e3eab30c988cd64f3e96e94e2dc64437ae4ceeadf9cb314dd89ffaba348e8c6a368d57844f5700a150ee5e910890fe303b1ce3700986e5fd4986166b3f2e7e0d9a7d198f4d58fa520973b34abf71e2c275e64791e67c19449ef88a55c569619337524c064ee4385b094e8ad990b18800f1616bb83ebce53d7807a9734ad3e24b557d83b2510e06a7f7e2a00ba9385a5b24aba5ce439153a4e4c808a615f0e636d379d6028404ce4fec5212eecaf477b6488b752063937a2c1b6210f4f6465010fde38937db85bb3a6f48068cd9439902f4c17619d34208c430faebc48bfcf7bbf6701983ee9889493fbcaea15e289d133459476271926240eeabca84f6f91f58ba13cad4ca562d1a1c5a84b14bd85ee7c8d660d0eb0afa07f67dd08d1bf9423e7ef62e8839f9ebc35b095c009807e51f1dcc32967f86f5a9be65f022e8d274a3666452a03f92d3188ff7f74475131dd991d3a90304ef34bc883c0dcc7e1343b2aea8c524b45e4ea7bb78549cb8d47f3a26eaf11f6f408a1985c1862ba7a6ad72815a97113504541d2499ed34db3c9dc8456d6518320df0c35b8943a3e26409e961c933e0b86fffa491b2f25b8f0acda56da4dd5a73e691a2e3e97b3db69386eb105c136cd62a14941526ba030162adc28c5bc1a4944ed56d4b46e800977a845282214271422142314120a100a118a098509c558b28201367cea017a49f7813280b4940ef030c30c33cc30c30c33ccec1e6e4dfdb96cb373a7f12ce677dc04f8a6a4a4a4e938476d0ec3749fc330dde78a3ce107fb07370865a851749531e71e0ba59b1fc60e258ae63d43d3c26178cc700b10a142615e8b39868c8e5be35c7185200a143d0a29de534588d2d57de22061d9f3968c4379a24b0dcfac8c1e71a24b2a5427dad50d111e27b7c392631427ce6b1375c5294d748dd7e26687f2b7988ba132d14ee845d29018e9a87da130d185cb8e3196ca2048f4b9509768da7c244279bc84b858a2d1d090e42f1d529e56a28d52eadd9e6136489012bd777470dc1372319705cc5b000102a840165854e05f6cd10517b8869a44d9f2c9b3e3b7300625891e86c38c232e4778b310b0c501ba5091f0737a9c88603939586c75918508b2084107bae0428b2cce1070a7a320d1fc6771c9fe1997ced523ba64591e65584613ca11e866edc638897556a511e94634df9311c591cb70629cf10fea22bce05163af670f95a3229cc8d1ff4e268e440cd7c7573738ce297810418b64781943a4e0193bc421440d9d93c38e901a43944426848568e5a8429c7b61265142a861dc62ce0c828dabf8318490cb201244295e8559a9758cdc09c452b13b51244090a381aa597fe872861ffbf9e3873e54595eac9418d1f7a16b8b8fc183904245ce87aefcfaf43d56aa5ef6d09e3e7c20fe397f1e470f7d929e5c39a6dcc8dec9431ffa32cacf313dbc3b78684303176de9fc9e62eed0e6e5ec941bb143a32e2eb1636bb49675e8c523cf57625fc8c1a7439b335d1144fb39f451f2bab25ac2e795439b9361a7250ead56b27ed1d5c0a17f9ce21e1dc3dfd0e47597bc9064c15b7743e75639c39e99eee3bc0d7d059fc99ea69d5d391b9af86731c40aa7295eca1a7a6b7fd1d4cbc9372c6a682fb7647448250d5d76c6c893f73c6f0c4143936762b686c9653e2567e8f533967cef83bd1c3143a792277563688aef9132b49773d68cd5abf1e40c32b45d59d1a36f6c0c7d5bc6278edd4394cc1043bf19580e31e5151a36c2d003c7b12c4cbe7b6c180cadb6c5eec819838c2bfe42af397a3d55862727592f743217c732deb60b8dc47896d817e39bb55ce845427990f9ddccce163a8929f36e86512d7429f534be780a1219cd4217e6c2cce1a55868dba3c5fcf9e0f37eaed07b98e45fcb396f88b18256b9df41f04c157ac914b39767939638151ad774491625520e494ea15fd518c29f9852e81f7634bdf05626a18c4213930da3fcc1c64c2214fa4ad94d2ceff784beb5e7429eeef5e6e7842e6a6fe752dd9ad0550cd9df6afddb1563428f530c578e61b684fe4ab38f66765fed95d085c81d3eb5360a225612da94f34242b35df1e2684e25bd1fa14fb11bf49ae7fdcb2023f42f113eff9dc1344e111ab570151b88c51cff10a1cdd324ff113b43e86533fd77f53465ef85d0060b1a3387f54168f334c4335e4e510910ba90a7617ed0068b0dff32ccf8a087befba941e3d5eff4a0bff059dd4a6d6f2c0fdadcb81b64181999bf83266a0839538fae83de37c4e47921c8c6d173d046761cc7413fe3f99e3ddae285cb0dfad897e4f1060f59db62833e73c629a43c85775ca941239934e844c6aadc0e0ac88b17640445833e574a9a7d3b33e8235255769c8a8ef332e86184357c98cd2def31e8ffe1594ea12f884661d079d638c7698db1582fe852cc70223f1f1944a45cd0be79ca5f492b3a0d21a6d0a1491d9bac682ef986943a64a40cc72afa8c4a5745931955a6f0baa13ac2a9e8356663d028e6780c1915bdf9765cc58e748a4ec7a2e714e5a9bbb2a66827748c962bb6a38868299a10261f24b64a8a1ec40c239849c9864a47d135ea187763ac2d6244d19a487eedbcfc313d144de62c97fcd9e47e014527d1190489c727dad497a44357081b5e4ff4307dcc4e7422d923b9bae4445fe1b935c66990828e9be883839318e2a48926be83862eaf95420e33d1747f67a3547927e398e8653537cc91729768b3bf7fe4d0cff38f25bafc91dee5e1b7fab44a345f7a268fc10473d328d194e54b91b187d0243abdfc9624d1e4acd4883c9eba3f8b448f343bb59ac34e3243a2d5d8d6e258a2489ef588262615c70fd2f732981cd175c89242aab6987e23ba9e0dcf166462cf88a64db735637e16d1a4d49934ea7c14d1857af430595a65d7938846d33f466a640c92e611d17f4ee54f680ed1ff677c66c141b58e866872d479abec6de6de17a229f3b9b6f81fd427441b56151ec7c7f3e20fa269bc97f1c9b4b14e04d156c7bddc393a57e34034bf19b3e827478da280e8a424b55bf089b0e31f9a8fd429b1a187dc393ff4152662ff72b54efad0b55e08bfaf193e7412fad21efab0b9aa17ae92c31c3d341f83a69c536362cae7a1dfca387c8c6faa95c143e32903c720c37e87267a2c0b89d2ae18bb1dba086aa61a3d3583d6ebd0f825df13939c0e4d08ff9dae9a43f47f0e5d8a998d2f0edb728c1c9a95bc1319e6311b8d435fa153c89868ec7f70e843c6fb96a3c698f37b430f438ae8fce2607a2b6ee8ca4aa34a97ae8b56dad068b2b839ff838bab61439f7c52e3c5d42e92256b68b57d37b46b440dfdbf845c0e25acc7a4a1978b9d91ff0f34104bb35b33f80779f12498c0d1197ac9ccb319c68719fa7e4739e6ca57dcb2656826864cc77f1cad194286c62c4a7bcc6492f01863e8253918b108c94de12186663cc59816d1543637c2d0ebec6b7848661c63030cfd575cccd8e42f65d0f8429f325ba3e0bd5d92b317facb9f338ae476a16b097ad2a962d353e642a3da316ee50cfb52e42db41953f69062aee51c622db4c9c33b585546544f163a6d940e24e4658a792cb41675a5b5236464fc0acd46466a461d165286159ab0953fcff676f870159ad1bf9067c31f7a2e8b6f9943e75e2a5f31c78df1ebc9a107e1375986b321c7ef0c8082171648c1c5a1b57055d1e2e0d0e690e232bcf0ebd01f2cd61050827b43ff0e46342493b9943c6e704573cab5a1cdd6e361a24377a5d8b141f7edca8c53c3103d165ba6000a0880f8451723b83518054e0d36804b43ff1571e3423f34dc19fa9883ef66e863426e8c33e80d164d64c095a1cb9f263e56e517df2143bf6515b35b3248f1ce183acba397c3e7ebd9ee88a14bdf101dc47c185a95e8bae142e5277f30f43145c9ddd84fa61c5fe872c8ebe539858834bcd0654e215f2af32e34135d24eac68c2d9373a1b5a8175f4a53b6d0a5fc0e42f49cea284bb4d0c490da5bca5aca32596873fe0a89216360a1cbef51511a8d2b3416a2abf725f479cc5aa1ebf2f4986d68157e77bf1cc12264ea81a3423b2e950dfb7277fa3985bea37464e029a41c8d14dadc0d3e51683fbd8742efa6e9f1c3257e739ed0e5cbdb15e720852e9dd09acaffc7c5468a784d68d3f53b2634f21a2ce5881e23af2da11f0d639d26fb7221754ab02b502f095dcc7fb21bb124c321a109c967fc4532de921c8bad2efe033c863b423b912fbdd4246bf2fc035a644181073ce08a2b3af0420422d8309c11daf11c3167fd602fe414a18b9f51946e7cd54d89d07855a5f08fb03add0fa1dfca88ac3b1a211c5c2a92c67204a1d5d27d289e31ce16038436fb05091b9f3f74e31f743165289e63848ed27dd0e6a039c4a464980dee41e71152d06b947166ec78d07eb028bba22945b6eca0cd38b5a58610d7dcd441633117fbed9f57529683367c7e989d2387b018077d8f38f2971413375837683ae38e78161b34bf1d2a2ae3c8ac50f03cb81a1c446308ad12be1bca30381a74f9e1e5b8e7cfa0d1e0f225f935a38a914113a3e259889035ee31209ae4dc61210e833e4e27ae4cfe823e55d4ed4b7a211f792e68e525aa7a081a1363ad68aeaa5174f82ed15387157d6709efd4a6bd31b38a3ece424cbe1336a9ae8a7ee4e33b3436b9baa968cf3d2cca54543496dd1d96244fe1aec454b94253f4133e939ceb86e4ee4bd1879cf1619945ef6b4f8a3e7b85dfc719fb74ea47d1c4b196c97f95c9aa1745df1192f23c2355a93e147d068d723f86014517158d57635abae19f68b3ac7b449a360aad279acc7e56954ce42f643ad1467f9c3e53294bea39d1f8bc6e8627d944db797d5653eb9ae82443681c72b29c63d433d1c3d6fe8c2b3aa2071d135efec55ca2ff298b9fc105f90eb1449b23534c7ed6d0ca5602f7d4484af44872b0d08d3bc4ec26d1fc48061126ff9c47128d83b7147f61e27f1689de344449981c65345520d1a588137e2d278fe8b57a729a8e685364d0e3199b64a834a293bf7c1e612469ce32a2cf38757e7019549875114dd6dcf229e753668f28a2c76fa9132c73ae9c44741ade818898abbc07114d59e8082984636bff109d5785a68e9853f08a21fa3829af657c14a28914e25ed07610a2ffcb1853e515998bc620ba3871d1f83a82e8dda2650c1baa5fa770201a9d548f0b992ccb8301d196657af29d0bfd2fffa1ff4c9d234eff5408f143335dfe302b7cec83f4a155a9a0eba5953d267ce83dbb5c8e9bee1e9a4dd1454b925546e9eaa1ebf39451a84eda95dc3c90b4f35f8792150f9deb3f92dd864136a977e8f72db36798d6288d1ddad2ed1cf1321d0435ebd045dde81b1b6c5818930ebd86a43959f05d0f5dcea1cb31a5289ab7b2bf238726c56198a4ebc9e1260e8d5cb6ce20b1f41b0e87e6625aded0e790212ba348ead0e28666935988c921564bd20663c528394e65d9d0c4d0ee48a9766822aea1e94d0da1bfa11a9aeb09b9a69f41a3260d836c89d1d06b960a971d52f664cfd04facd813b5dec8a8199a9e901a6aaeae0cca2b439f51ccbf69a810a43b323449f4d22326330cdb8da1f9d4d9ed51a6f16527862eaaa6ac9e307421462263dcff497630741eb24e57989e45e50bad4cc4a992ac13a77a418f1edf2a74d6852eaa7bd893ceb8d08f6a10f789c657395be84f35b3fe634d25bb16ba0663f1d37118f76416fa14611d91a2986b120bcda6c61a3e5757e8cdd72473069d9c5d59a1b908591f06999294aa2a341972c9070715153a4b59338a395a23a94ca13fcdeace782fbb8648a1af8c65bc47731c95a3d0a7141bf2f185420fb3f4f3c37618a47c42e3495363390fcd32d2e08439a1cf0f1de11f5c468eb909edf676956449e7ae94128c094dac4e8aad29e7d7cad812fa9cfd77bf75438cff208029a1ef8a21f543bfbc328d24349bc165cbf81fbb3d23a19d15890acff908fdab59fc47500d9762847ec3e30791c4fd92ac45e864b672c88c8e3b83ca88d06bfea01972980ca12f893153c6a821040b4213bf217e94a420290f84e661ee1492ac57c6bbfec0ac4a9a41451cdb7cd0bac48b6c57d77ad05f86cfb9fc90d93dce83619018af31c6379f87eda08bae16e3f29e0e9a942a8e5ce3ce8f63590eda966cc1475b1f18b8e28a31566138e8e751b684396a53f1ec06ad7b38f6cfdd4f4d71b3419792d127f3b9716614a30509cebf3849580dea0a6234e8248548c577d0b5fc60b1f5c2028601ff0ad8c202fc089bc140bb4188680dd696e0050910000031980c5a0739e959c5af6ec7c7a06fcd928741fb971acb986562602fe8718498ceea3a16db05e005e6823e78d48d9c2c3588aeb4a20dcb2121ee58f8d4c953142bbe0c5357bc7e92ce2a2e0f293ef44c31442fb954d165ece01aefe4eca592162a153dcef81d84e7fe012db23059f827a050d14ebefc1251a7e87f2f448d96f2e61a638832459b35f8a78ce43246925fe1832a85495acc67e35255598922c5eeb8a45ac49169186610d641f3712eca545efc4c1227640e9aed99b3389ef463cb41e2a0c730c786759c32a8cadfa0e997b7181742cf638a0d9a94e3aa26c97b0d3aedac18c99c32843c69d0a4ca144bae251d7b9941fba6331b215d2cb6929032682e8e87f56564923f1483a63df531e81482418fe343e4cfef2065fb8236c5519f793ed3054dcea65944b356342feb28859d8e156d8ed9a8b3658c51eebe8aae827f5903cff0238554d138ee54e153cc693f2a155dc62964aaa66ec9d450d16b8ce1c83b1ca768a3425a16d70b8d2b9aa2ff984be90c166329598ade5c274248ca97a28548d145778ce167d8c11c378ad61a5e4ce5b08aa2879ac381b785bf7660283a9d08d51653098a1e86f7990c99c72fa73ed1550c41727c94f3446b9a591addf37a4c5d279adf28917319e5442b2bc122ac4c36d103ffcacacc194fcca1267a983fe7a6769c89467e25f28fc430d1bee65097a4e14c1c7b89aedf516669ccd8ba929668234342960675cf59ac44a3971b841cba3fc7a928d123bf90d22f6589f3e324da1444a7ca2d6ceac692e8acb77cb77adbc2df48f4a5491d946bf5be5b90e8320c932e1361211d3ea275c991a17b701dd17936f1606e8e46b4db95fd622de52326239ab88cc3acab03bd2aaf04b6884e53369e27d115d1eb3ab2a8101c63d13711ed7c768cdd93de122744b42f8d5c737f77883ea7731809cdfc32314374d135048711a242f45e565943cc4488de2b95c48b9761848507d1b754c39c660aa26d9c597b244c02d16574998f3ab2101010bd3f328d3cd22291a33f749d2b56535cef77d8fcd056472f8d792a7d6825c5ee90ea197c68f3a13ac6216acc1ddb3d149aa2c68bf974877a68e23f43df9c1be6a1fd8ff69891ad52061b1e7a98d565e7e561887beed0a30cae719e85646995b3432f8ebc1c75c78e9163ae045687fe63fe38a1323a74eae1e6995196cba5e6d08f5783cb30562cb87268c38496e4e5514ff1eee2d046cc9a2dc3cec1a17d47f22b9d194aa4d81bbae8c813a2e4fdd46a71435b8ee2a94772dbd068e65658cdc8630391b249d3325b08275943a7161b7fa40c1e9d1afacb9b57315a3ec98c71e3d24059c373f1110dc69d0bfeb2ef209a063c43b3335ba5f94f3d864817d00c4d941443b6cae8a3592f43938186d4792683938f8716900c5d04cd902146750cbdc6ac274bc13d4ac3c4d086763189ca295f453e0c3d9606d59f7b81a1cb0ecfd2fc33d2219445175602a3027ea1918a214885bcd17fb6432f34226d22e96026aeae5d68f4638efb1f2284183b2520177ac91f19b585de51e5e0e7d0419cb86ba1d3102d766e58b9963d59e8da2f3a37889e04c4429f1b58a3e80dfe2a72852e236eb8872c19ae6bd80a6d67a4a943f4c26557abd0c4ce54d13ca772bca3421fbc3272458e143623eec0149a8b87b9fb9979e1e0014aa10b93cbb2aa4621805168d24fbc2484549a39048bad2d0c098a010885fe7443a5764fad8cd727f4e61542f8b4e798e25c26a013469da95204cd2063ffff6409c0020b900236a1ed2c29cd7c8e3a8ac37609c884b671ca0f56631df8c6ba055c42d728861ceddd0e1e3c50095d84249532f753b67bbb2434617efba5f37a89443308888426427744fc938ba1593c42eb39375c22ef584023904cde5176d6d52a065884ae2f5e849ffc0f900838c021f439f447cf0dc67bb64221b471c2a4386b11030306a147b1c91c9ab6fce5af764020749edf1aa78c08f3017fd05c9b07090daa1f6332e9803ee8277fe309ed900fb8017bd0a3968d31e93f8cee11165b5623202f3270c5153b401e282941f573e59171074d8acbaacca3241a01758035ca392fe6091230073d94f472f9938b8038e832a784a5557603df2a5f67e38cd93a77253036a00ddac8a41e4c2c5fe2e6d4a08991d2a44c2a27d90869d0a6dcf05439f26753c70c0c65705a600c5a7d50d9ba9e2f2ebf85412f2a96c9347e48e1288308f8823e5b37cea852e53c390a0474412b5525d620a3087182d78a2e7f45698c79b1b3d6b1c25492ffa1835b459f22be51453fedc172f80b2a79297eb8543439c67fb99024172f5e0016708000f8e270a8683b4387e07dad19e53c45f30fe3f3e728bb992c9c29ae144d4aecdefcfd5e21cb563852b422e1fb12634642e146d186c3fda82e134e149d657012a911214a5aa168f22f6aa4d0d164b6355a3c17a30f149d5457fffb8ba5d4fe7dc2ce133dd2d5b8f94a1f5cd010eb44177b25385649d1cea8d97bc171a2b738fae379b1631208a02409244001093840000028c56da2999c8c9723543f384db471565923490a9a53c6626b9416e032515760a2cd18db7d596736362fc808fec5084689c035f04d1881bb441721c5f8f798275cb256709668337462538f6ca48cad53c155a2a960d23b9ea248ca87c51617ff8712ad9e6c147fd91096993326d1c6f879e283ac0a5271a14516078f052789be62c5855a249a0bf94b75fed48204d8c541a249fe6612e551ce327b718f3847f4f0717260ae19c5d28b6731822d2c70012cbac822035d90608b1705846b4413235b76f81c728e476d718ce8f4a16f9a6bfcbc460b92d7825b44f3dae66ee1bc835ecc29a28d4aa973f2ec5d59c32b2e5efce1420b11b806b65efc3997083b44d415770834445d7185e82347876929d611c2ec6ff2b12273b0d8e21b449b22a85e144fb95f32165b1a8213441b73a37c6d39e7773c62b125023f4107b6e8a203c6900c4457b1192cef584ecc7fe005c1c23f7080682fe587a6af15d19f17a40b2e920bf787deb37a8ad4312eaeb8828b2e9e0b2e8816ce0f9d64d0eaf68d2168863fa04516fc85ebc3f1811104b787d3435d2182cb439f7196e77686f9134f2cb60387872cee0e6707bec1836d4d8b53098e72046dd81676deab4357b963f88c3dc362abb488c01557bce880165b60e1e8d0c4f170120c2a87b672e3c8b33b3da61b2c568b2db2384f812d2c60b4c8a2015d90608b1741161610000204f0628b2c5e7c175a30e0c59720026404661a873e6243dd3c29638f325138349539d4cf43e30e1b33d337b431eca4c8ba5959b2af6e681d63a9cc4c1217e429a06d68e44443e56338debde109281bbaa0c16348a44c78f4d77054a390efbbee0b540de6ce0e3d870f2d165d74c0684158d3d0650617d37125649684c5160f19281a5a3d892816232e22ec586c51ea195a7f90a75fa461bec498a1079afda29ca6668652cbd07759364e59f15286960cad3f98c928c49e678b63e83c3a1473ecf13c74c4d0a47c31399a42ca137d2ef0011a862e6f8acbca396ef6cd4a40c1d059e8f31cb534fd4293b1e5f851c3aecfc30b79c5a7200b2e4cbbd07f480a29a7103f44d74c06940bba8566938c845bc6d142dbb0730c216792c80cc262ab032878d1859165a153d59052c820681e47c9628b2eb0d0a9696cc792430adb3a5940afd0e8c66be84e07cb9481c5d6224003024080001e20000454e05f01e6c93ea1566863c81bd3f1722cf8a60a4d88cdd1d61273575b2af479ea311b5e58a7d04fa4902776a3a4e7fa220b22012eb82008b8625842a5d0a6548c3965a651e82b8826732429655809853e5c7694dd1d7b42bf1151de677373ca973aa19ed09e1188e0051648066d422f49b232b8e5e4e74826f4e9dfa7d1213d76e674099d868f613e6af4adc650c231ab7736c9159383d06a12faffd4bc3c11e7223f262812faf1480f39e2ab94f68b812baed83d422f0da34b2d39dc91523170c515aa6a846623394c112a05935e8bd044aef81c63be64a92d25429372ddc3a6f8291525410846f082045c60a5694087d0a79c36cff074731c5e71850aa1cbeb417a2c543b7e4583d07f9086f3208c68c3ac02417fd05af83c51c5329070d92204a503460b04bcf81084608b175d68b185ab0f1a9fbd5c13d97bd06636adb01b421b770c1785501ef4f112727fa84ae614eda04f1dfb910f26654739aa832e1d45de2021a6cace204173d03fa8f8a898328cb1641c741d7d933488295678f506bd5bd8c659428afda1a136e8f24ac6d0d57e94835b83b6a36398acd52b0d5af38c5491adda79d619f4591a496f46ed9b3d5719f41b53c6b119bb3aaaa93168bd33e544d8ddeeca5118b43919d7b923af86f2f405cd7952879d43786eb1a80b9af08ca3a7a273856db3155d9b4794858f4c1983242b5a8721a3faa44a951fb257c85534dbe3591e685a502d55d1f66bc78afd3c157d1ecb27ab0d1b483550d1fcf4477e574986db29dae8358df230c3149dc8c674ce13d22c45938dc3ff35ce4996fa24458fbb3245fc8b72144dfc4a88af972d4b5b2cb6507025000b2c4053146dde388fcc189567896528fa081d25637109b351038a3e656663c90c7f65e627dac993d2e4e9de0e82e989d6a29af4839065271afd7ec75e193a2d5e2c39d195a610519349168bda267a7c19713a86dc78f3a2893664a40ec572854266a20bab90114d7dd5f760a2dfd0bb396697de280d36212fd169b949c6a9c196a31237909668cb224aeabcd39f3a3981ac441f99151dbb85797021586c2d25520d3bb085e112e424ba6812f92586982eb2786102d22225d1efc77acc2167cb93eb4146a2cfd8dc73360e165b5a6ce17f82af2d12123d32bd03c610321de4239a70a9c8ddae61b16501a8413aa2099ea51b7cc846b43179593ba778e0a0b2eb8664449f438810263d7279c25c443fb26145256385098922daccd91d43cf1f8f3b27a2cdb02b6c287d7d64262292fe4d0d3b3ee6217a8b413a3ab3c498c5ae0269881ee4f88ee3e78b286d66213af98d996f9e1e79c25a64d100e34012a2efce53adb858e61ac1b280032e075157a4205aabfc6e4dc11b691c03d17f8738f9b4276bcc1c10967f2022c3be5021fdd0597f4cf0d01bf4bfc473ce86f3a1ffecb0162ec3bf735a42eea18dc715be161e495a861e5a8d9f5106e2d091873ef33c032b0b258d0e1812120f8da39ce71c448aaaa5ee1d7a8f92221fee558ab9b4439b4bfcfb2c96756882790617af533aab8b40d2a18f7d7db943dfe33d11e41cdab20aa32ba9dbdd35268a94436f56397e2de5d5c9b8051987cec2fbb44368f98e72a620e1d0b9032f93f97cbea11f0fc1b34188cbb89a74831727d427a55bb256856c4313fd439888c38f9d5336b4ddbde16383a9c0906be8ab72768fe972be0e4f35b42f99f3b4a64f0ea9625640a6a117751055825fccef31686867256e9e0aa94d2b3f431f43b0b0de602c679198a1c79e65225c96ac17f365e84fd5e2fe248b8b5392a1f7f5100ff331a6ff33867ee342869c9e3c76f48862e84c3c384891a1bf9a8861e8239a68f41d0db9ba5a015860018a4830f4fda1373b7e1c624acb179ad69c32d41a95b8c7bcd09ec5b85af93f5de8bb8305b70afd39590817fad4d7d6b58c8e2d34fe58737ef8db3bb231426aa1b51e33d9773859a29285f6fc773f63b3ae9e2c16f86c8eadaa723484bc026b128d3fb85630067fbd2c19f2c18886ac429b25797808ef1d314e85269a49066d699942135f1d4c088949a11ecd221bb941ef66c82874d95d41a1479653a38a992bca7184904fe82bc5c820afff73e3683aa14dc9fce15e6c6fd890fd209bd0c31cf9c86a3119c933a1cff6d42927f996d0cbccc795d086cf481d635861b4d3db4126a18b0c1b23acf7838ae144429f7356f764f89886cf077984c691759808b182bb5c4668fa4283cc50e26409910db208adc3d7b8186ef172e589d06794bf3262480d774286d0450d119938f7aeec08a1f70ced1f562941e8677d421079950e110542136266cb2a1ef7737a78903f6852e56868f1333091890fdaabdefd8f9919418251c81ef4122f432a554b38779f903ce83ce510ca5f2de4c6e1312177d0c60c7f92e3cff089d2a8944f653269341689c3c180300cc3d0e9e9021314000000001292876391501887e3809807140002482218401a2a2028261a101a1a101e1086436140401c06030261501810088642823041308ac50f0e91b0be1b59fabc44737b6f7b6290775350c713b3c1064e8980ea09ff25732cf83e0833b3002d665400417198866062e5a75fa10dac32e2f6c09b13d2cfb8cdaefd2a0cfa229b5280778ed7fb6f3541b30ec15db3407b763b583503c64b23a714b9a789fe5b3743655654017f0f9f73853d3ee59dfe8bebff32d2d5711257a36fcbfba59244256a7d22859a26052c7ec1da4bf6d70eeffc441f945d1dd85649c9039509078ba61846e49db2eabe82054b699d0b1cc40c45a28bbeb0af1e4aaaf33d660ac6139a860ab39f6c480c58949395771f12a0f4d20ebcaf7fdf5e2ca8f69eacfb0d5ec79ee7349b5fc866f25c0933c7de8f31bb68145146e79c0029d0cb967aaf1ae9151d614214d0ee9a0ea17a1c42da0da32a0e8c37063e2aafa14f16ef00ae2532a8018bbb51b1a419cbb50b55092d481833adc9a3da65ad3816985b55a1e815dfcab719a05f8d563ab6f4d978c710cbcc17128b95b5ed6c837270d565b17046bd2630c328aa8405f64c94f7199ab0826162bd5f89e3106b7f6f68991133cc33da74385053e6eccec05baa85ba1157695ba65794d43c014b7be4a470ad6950d681bedad3812bc22768896a0fcfefd71f106655ed67083dff91d2621352e89511c5f09e54c35ddfa176cd49c6393243986d5eda353dfd67a5078a0feb9b2473b20642f72488d5030289620ef084a929ef0e0f2cdcb6abb0a55726be347c9d114a576ba65ab3d5dbece0d49817a2cd6473a64bd5a196d4d83cc9116a23a17d1271cde012554e1ae0d5993aaa2b69926a6431939849542d4730be366e08ebdf98977552484d3163cbd285f105408294219241845ca2e3bcd2591a22168d595a61c801c5e039afc85b00daf9627989110c5043843d0a215591eb05fdfa8ef5e1125b5acf9b95d002e79e8b9e18ae57653a25765b88c5614f05580886ae334b36768120bf0c7ba7878ebfa36b69a48143ef102eb8989b3c642af9c87816f317ed21717d2bdbd8f0cafd906ae80051e68af4b10d52f78e95e94f18ed3312628e65a44651a3c103aabaa61d718c1eb4c7020b6ef8196540b357b6b10b208f0e9da6a7ec6ce3301840c473c7596bdf445fafcc7c4f6af4bd0196f4c82ec10dcb6d8bc3056ef314fab1d49f30194c40d62abc1d952963c2b03e27cdd89ea25cfa87565e1f58260316675eb4b29868abbe383c24263a4196c5a323e2e265f9053394293ecd9d5bc704a4b4ec6b6edc5a25e0a56140b3e7e62bf14c1383343b6a1ed3c95d3329397f532713ddce6c3c7a3e02fe02ec9f89a22ca8a7370b7cecaa3b8560df8239b4af1ef835ca0245b1b007365a80282664817acbf6c5d294eede226b25fed11f7a806cf29bb3f23bd986a1a10bf66387ac16bedb15816b31859757de44dbc1757a262b557d5becdaa0af1b6c5a99499a5058967da46848e9c1eb6dfd14bcb9f930074b795c353e9df3c7871403a2a4e0f86fd745b15988020049e74972fb6f618c424d2d51944598a110643d50e01611a6c85df8196ca4e2756348c096f98963b3636ad6c45c78cd7175402069361c2303b1916a1384d2a111996445aeea0a72dc1ce35cc9bed224fca46422734e6a3421904c8511d1aef25633707e27b11ff2755c3cf15788fc48ca93113660824c5494cd606274b2661ca6098f12da276fb74c22ac901df00cdfdb644910f0aaa5d715308ec55837a580e872409682958e288e0d0fd5fbe81e3fe0119201b0b1606423dbc29a8869311281565cf2c5780297b2792f68ee93c8a1808c88a2d4dc6a4493c641881a2e24504554029d6b3456cc2b67207a92981b413a441eb493fb6bc0d0b7cd121a2e59d512b217ec0084ce7c76445c0d075b84647e095df23f41e43a24ec203620c5872a862b871072e434725ec9b92a3ad45eac016b2a97340bc56ec1503c4030a12c8ca3dc13fc66b29f69b35e9c775cd263713f8fcc66ca0fcc35ce9cff353693137651c7ed92c08b6db8387f468684458a21bb4e5b08cc1362cb3cd840ee7e7d64a3a446170cc7b3ab3074ee415e0903c5681b59f2d74c9378b887aa2ad3a095cda715c08fb41c4e503706b1e42892cd740dabad783aabc7d4a659ee939e06b460752641ef0b15341fce72dac4cf1ad747f7cf89f24c7aeab399ab39bb98760ca1938e165f271cc802327935ed80e7fb99775a6158b1c8590d5ca6be9a7fbcba4b1ed3c065dafaf325ed790c8cbb94ca021540b1ff553e9650e07f7528f4aea835000986be9ad484720e894132a2d576577bb84c194b84b8bf8a7d1a4ac6e0eb1bc7b5c51b985481d2aa173520f4a61b398f5b364e32bd0bae89f9b5fcbead816aea40c90222614584ab1fd9311080b93465fa722c28a370286535347368fd5560ac680c2df02434c0bd04fb5d0601b47e8be78d6060d8b2f2b1e2f3130088f905ad1be9acb9502a8f977902f4ae877787e19bc0a76490484b42ef7d17400d03d738dafbddf1691e1a54d6119130e9aae135670650e7776cc980109b33a4610c1bf5d3876be4072c567cb9ac543722733647472ec71c7260795565af585e036f966b079008df913080cad167034eb8990373587050640d8fec72561955aef33d4308027dcf6f16f8c7ca31bf0b218d8b2adf2eb93bb97f42c0f609c00ce116ae2115ba901ad0c26799d2c42d69e82c04bdd4cad0b6c01f536b3d4a239d51ce44686cd1f12b1f7b276ad3d78054a3d4e6cdcb4d3c0f456edad53eb030c066fa0582823ff4295b5274fc089bc6524a3fc7418237a4a04b485b4844a8393cbfc2dbb54c30364a0507f68dd8db24c33801acd9070e187066f11f04a0c53d966e08cee91b9acd3578311e34e50b97fe584700104be0fc883be06fa4756ed52885555051f3c60762c0e90a97195983662540419f1522dfe91f420847c52ec66c1bd86a5a47a85d30410fe9fcd1ce47fa0868099ceb0fca7a44ae803a097ee8a4125d34450663786030b35dd07f1f487093533c6c5a340c745f85d6540fef87aa3b4aaf2532b3be51aa38c64a700360b3518266ef77b6738616f3c794355cd2c6807c1ed5f44bce4b0f5a271acd82dbbfde13fa00fd14a0b2c8daf1746e0992597576c063d5ca71fd406ce316227f9eb55171f14d740be3d90d0dab8c7c2445a4a56baa30c8fee5e9c8adcb031424a0e16a35d2b2fbc739831e046e6d7ce83d9708d1e214bcf5a2a0471dccfc585d86f4a8664cf968d0365a0c353e237821d9ad148999c32fddc7410e9bc13df56191feb4de0e676188dc2073be488c00c9626534d6e4dad4468cf58fc63f3713575ea8e7ad4259a44923de17d570864e1dc23ee9416c47d38deccea899e57c8f7304db5bc3e189c7a2d448dbb43831c191f3b6df808d5de885590d38323f51ce736d024e1c0d72ff91649df1a3418702ae2da82fde06dbba5270508402c229d4171074236c4321cc507dbb0bd157e6a87e4b01bff88e7ed17dea63d2f21c50f894c8e127e917074aac31840a856a0e0055d2d1c76f6243fd41f9a0b84601ce549fedca27830bb5a250c00fc42b922d50c0bb455508acd0f81ca879ff4095880d731b05aa6f85b4c571a8fd1b057c5dc399b05191d536ff307da04ea1f6c3daa350a5121404ca1e2a6da83e72504aa13e805e885253a9211a7167bf4206a8da50cf3243eac4faeee64d14cb84c8d48b1402a1e66d7528a7caafa3059d5dd5744a7c4021414509d57760e2711e50981905a441a611cc01d50761b34ca25001200ad8e82722fd1450678ce1e336aac2814636fbabb1ef81e5e9e2fb4e6f288850ea8e02ca4ddd48b31daaaf370cd51aaa3614301e416b8eee498a5ccfb5f7ca7b90c95dbdbee3bf21ccb6ffc0437118d255b4daf7ab01826b8d2e7d8ab4e0d6b53b1110044a0c8fcdba16c7c8627d6e3d33c020ff556039c2b0b9cda32d9f87c508dd7c2df23b442eeb98f9f076ebda0048fc3d7489d4f1d8c81d5628f97bd9586e5f5b17e1cc20dab8c39aeb2da497f5a4600606e68c80996a231bc60b7c555a5084c09df7a9b42c0ef729d15ec8b0f6174d4e50f3be858cbb7f8a77e8a42307b8e6178d9affe54be7860fb49ce22cf9e6cb28439f51179c912e47783408fbff7d9c3c78f54784ed2480f1ef7138efc640a7c451c88a079ee6ec310c1bcdf72a0eeba6cdacb80025ccf29417df9b9b2ad025b0536d0eae3d18187604cce36e00d82a05889a72a8b4d074fc1c54abb4de72a04e6e1a2db0b06bf055a85504b007b63c25cd05d00d6ebd9f0299513474cefbe6d6e982bf51fee8053f0871bb4f455f400b66fcd35b415a99c80873d3b3d5c0956eb1d53fe8d126f8eeb8210bdacc88cc838b42d42c4b35ac92319e9799b70407f1f12529154106e395b31abbb8e6a8f98831b7c88831ff2315e645920f086bf3c826ac99821e140aae6251062c2e4c7fb5ad604d4b795116a9d83613c61ceaa9ba92aa92ee34a165a1fd676e3aec602d694e7bc121b9168875abcb413da51f148b761f73ea96a695dfd0e9bf98192bcd12165aaef1bb210ff030a57414955f9210e4ab987bb66920c13990f724850bb2d9183e4f78134548f0949c9590e59703195f83705b9c01ce289919ea0ebe4409fd1f5a7f762750020a2d16cc779a1723cace38546316675607f6e3395242a30402538c8ca4ee34edf8fca81b1738c8ad4267db1453047b72015ed06e166100744043f621d2ccb1082409a187bc8fa2dac89bf2c12a12c3cc80d335fe00a99eb0a006e9b35921702fcdda03f4c654124855012b3c11739ea297afe80a9d60f0739588b5eb26c993ac34a09b3e59ce9eeb1a5388b92a2a371872aa7e3d52997f7483c7c4d2bb8aca9f50023df4943a68c4040d13accd2861e64a14a188656597ea67efb1a24c8eeafdc0442cee2300852a11e4c0f8c3f3fe482daf6c34b306f5b04c812921c9415a9224eebcc3ac5875c43137dcb4ca4e77bd7fb8c314eb491a93e345d213fe43b4d674ac561973301c3fdbc7043da074782ea1da4d217832f1fb920b11d44104f9a91b54b39d447b0ad7b4134bcfadf581e31876693d0d289aea8c4201d45bcd390f24e7bebd50909b10457a8a59d1e4a9906a950e1a55c2a394c022e4ab1a97222a62a2c6e5d19101745eb9c2ce762c818b2da1c74337ce7a0cc3aed5f858973c47c7352e4180a6e36849360541c75a47e9ae83a617429969fce76ea863c2911790c33d4a793a6efbb00191197a6857743e682193b8bcceb5f80fc1d9d83990983c2df85ecdc071aee439e64d4e337e207d4a61e9323d0897beebe88233fa1c1c21e03dcca00fb8d9ee20d49c11569ce1be49b6ca78f5d2e4ed237363a548ceea66d7a052f0485dc973f38d49aab2482981de6ecb2be1352ed6dc3674c5084c3a6e42cbde2c95ab13e0e5147cf8c964640121403926870c9ddca4028b5db0454536866116a822a30fc0705989e9344e28d6735e4e37c026bc94187eb557417d733caae7d0c9c40c67eaddf39cf48b462f59a39746f357510654d2227e97fb905d78d161cb0f9025c3330d3ad14a76f5fec1ed188802211c9be52f660d6ce6be61e23666d1a5e64addc637520f479e0611f80d232af8c8764d2c02ad3869a168387d28bfae04d90c75007c2b3b851758b9b97589d1539e5867e6e60107eedf91d199cc811ea26505731b792632f6a9ce26a8cadb13516ccfaf03a48951bb02868b9c7c574175c5c07d15ec36e7f9b5ea67d70fc78d817b4ee5552a872376391161d5cf3aeb55f823057bcca4493c74e1c729dc46a2f09162b798086211eaddcd2d76068e44c3c1321fbdc9872cd1936c316015cf1cb4753fa343d8307ce96f686ecf09ec7badeecfedbc4d7541176fe7038416f93328d12b77096a901b3e7288dad715ad20e957ab6f11c5d546831d91303cd7b70674bb7c0f1f2fb91c80d84e1d646fa71560ee22930a2c609807a6f5371dc25fce3de93e7fbed5a6a12fff959eec6ce408e6422ed03c8f5ed3f3139b386ec28bfd476205001f1841aea84233298ea24a055a0c77d74b17e1bb33800333063e1ede0d34adab033c690a35c41c1eb6c2af4413771571bfb3fc6d352c8de9f2c46c56dbe1a4180a3253a9ee238e0dd37eee6e82cf55ae9fddbc09a3fa26f64342ee8704210801ee25beb98411fcf72b2a15b804ddd40ee3f5ac6f651f10dcdadd87ed796b8441ac9a0cd868bd4f9122e52ed632145e42b35715f094476bd61dc52ec1f63526c007f2a0202bafe38ccbbfdc5786a5b8de57ebddb680b3e5bdadd668a9ba16f55ddf2c06e6c765c6a19e96b68c20d6264c2e946313c334e6367334bd8b140146e0b9926496409bcdb2d19abf015f9544c1981196ae879642ca9f91944c81bc9b7f00ecd07049cc81e1088185a8569c458a8fb038458009b0c844103116953cc1e81afa6248c7460006abae7a04ca00ab05e1eff805a98caf1e96369a39db2024deefe049946513351c2969d807472aab48c04eb503bd11f1c3224a9d49284f6de3bc957a1b95484461a39bdf74a6937947b6c0348fc97e3b54ea136b2ca793b3ed82805b6d10fd817f0c08b1c20c353a4a808003c48fb9f13a75af00359c0b6d64c4471d5fb301008c00a3113a18b40f1443d3f612b47c24eef476e5b3fcc00925696ff30cd2c04dc5352c3b4a7ba09106f8874b45d50900fa22cb13da6b341a3d980590585c5104deb20944931c918dc46514bf90dc7844ff78f0574e77786d6e0708f59a153079f06c14828d2faf0c39577caba93564fc45b23406f985865752cf88875fe1a929c9589f1203bf437d0f23783890cb79e36a7b7d130cb48779d4bb48e638e332156890209ee50ae655c7f15bbba5720520a3b1f9b31b3dca866fa612a22f57e3d59576c00be584a0df5d113685e98b8b38bb89d5da921bce2630a34fd7a12c4edf8dc5ee360896ea85bdc3fa06d570a836035a194cd1d52b654fbe9263da372e408b1b476490d0409e204b575076722bbf4f549abbfceda09873f552558abba799391f5e75dd69c348205559e3d22547c9dda42392644a009caeed7122d2a9631e5cf380a3cfa3e8da8110b0c042a77f142b81ef3646cc59d625132126b1cb713626cf5dbcb3df24f82210057f50047f962ce1c41d29b07f2f2a9a8306cd929187f9cbcae910f9c7210ce33e0362a11c461048a4d80974364f34daa816f775fc7bba5fd107e53168b89f3c96f988e8e13e017fc83eabfd307ea67dacfd087ea4fb5c7ef8f72b6ea9967568fe2bba57e8603421f29ce0be82a0a9032fadf3acbff4eb72c23857da700b087207f72590d381c56bfa75a7d363bfa5c8e121d53c46bcdd463c74bf0a8e75bd07bc23ffd6b9e558a1fd78cf2738fc0b32bd8174a3bcecbb587b117a598eb7de89a6a9cfdf5b6f73906fe47dcd7187510318deb06e50175417a78b9bbbbdd4e0d6396e7a9bf6f6f102eff291b75e06ee17e28ebdd9ac985deda32e4b3781dd6ca80469f66d28a8acedddd2fba2b7171e43dd2864e67f67f72af2ceff82f2d2be5b67c4f954a4bedd42f06890b3ff7e397bebf7b27909d085fd45e9e5d10b716f3ddfc2ba1ff59ebf949b046b7463a51b6a94075295794774e9bac0ee22f592f4c2a3375bb6f98c0e7459bab6d92d4446351177ab3bb53bc5ebd315d335dd75ef95bc57bede6c01047d46f60bd877bd7e7a7f79cf7fe7376610afdeef9e772d2178e45dfbbca17e11a3a69954cdbbf5caf78e790374b3741975f9a2bb7c09e5bb161f0ca417a277466f9d6e9887608abbbd049bdcf7c55dc3de6bbd417b3bc39b6d7bfe1affadbbd145a3dde5a0d36e3ae5bbc87b91f7beeb3d7f508a614aecfdc35b1fe9cfda5f020129900d8c1ba001a9d56bae5a9ad9db8162943a850f332f3a3a533302252d469958dd848ef84a4c905e18dff7cc3a5d3f504daf44018ba6522f978136af5c3a1fd47040a4031bdfaec68f529bb68e470be025a654dcc12d0d65207ec8de9f27bd8d05247512349d049d324f648230f3d8329e8b2ee26915a855c853953a6406f4464ce12a7c4318964a813362a64324b16ba50d6577cccbda09616894288981b7d1c233def4badd90d617d31dbd8f1ab64cc4e3c40cc735a22aa7c3f8de1ee08b1c637f98b8dc77201395db073c360bf6c2b4bf4f981d114baea372831c063b9a61acf51c7b850fccd4a7e7cf1580dc0ac4241d1303c53103fe33a9a27849040efdd4a224c415ee4d0a03e978158046b3417822affa6a76809b906a8030814a344e88cad63e45fe4026326f429f231672c11f605bc5d0450599360f4178c84122e8e485f064b41700195ca7d1e8ce2c48fd3e1593981234c0259c54b467268c6731de9d5dc6e7a3ac2a9f896d6145f8e9c2e763be78bf88e897c2c02130a970fcb9bb27cca08a79d4c7e221564b0c559075165ddb1737c4b34b7e5e48bb3a0ae0e2f69fbf1e0e73c5d323d977b94f78facc52c1731086fae6b610c4d95708405c8560619153920f6fe58b52c9accd1427cc8277bd783d4a57a8de2461a7e2a1378fcefb1535ee58185d2855ea86cd4f564229f3e7a6f0fa22face01da0514a73bb88bfef2c8cb3ff0931c431f3cc54cde32efa2a79dc63bb56c7d49f02bed472f584b7a9b426b24bdd5b721eca06047ab531815defed9c356489cf02252127b201529432096b49c77a1ead4bb03cf2a3dc6586551ea05743df08e0076ff0ace83a8ba5ecd24d094f32052a65215feadd2fe3e7e3bce6929e6bd05dbd49f94b6e696a86cc806353b3e867a8b8843da96f759e0d86c3e727aa4e0227d9797b3a9ac80fdddf9cc39a1af78b57280d1f373ad20407c004b6d17ab005bebeecd155aeabe0966fc1fd990b0f6f455c5248d7a4af4ea59c31162f43d07ee233747c2ca0302871288658955178b4871d15af2230ae094527359395dcd1209c53448794a8c6ad7b986e6f66c048718b111b16b9aa9577e4dd01333e330f5b8921ea77b46349493e74ff9845c2dd370a31c0f08fd847263231a7808f1cbe260e433a04bce5b8d501d7ae95ad084e36af887d615cef92e54109212aad2880fb31327a4d9dc042c3f7585d56e43a7ba6f3676c3ea48ba7babf74d52cf87dd6029a576810bb6d256ce345610aca4a6b3b3420de3651da691f8e916cc9bd62ff6b6da429f4ae328215dd09d1a8c28c3b8bee15ec29fad398dae4fcc544192b57f66671e4c90d1ac5c07f5436466fac30353494a5483440236811ac806ee038e59d5896b2a20ecd6fec70a920b7e28c858281cb9759d1f0ffcc8ec1a0592b1ec8acc3037f78e1ab697b1a9ddef73327e7bba54c6377be7ffbbc240522dc0fd28415982df041602cae0c720f120df212cfbcf049768821182b91acc340903acf2c07a1136a15d6b74868d9eb32c97ee3398bc09387460039dc19e41ca20c50001069311f34c43dc40ccc065c0630037f82d0793cfa9755606660663834a83ae0167182c0f6024732706d7076f99307372ee9edb0d3e325896ce42b5c638604d0881b0fcf2c6efc54c8820b4cb60798ec310c9c5a06ad04f839911a667663278edc18cac2a04f269a07707cbbd5d592665077304b31ccc3467fe371a730f751ebcb09962f4b2b68afc90bcf621fccc60e6c7c697ea1a3c7530234b89067a75a01a84cda3933d19bfd6fcdd0763dcee0089d883c904ff08b45998f1bdb681a406f7df604ca8df8785e73f9a609030483600dec00097e0e108acc792e5d06b0156872a65f2203c5457ce21cbaeb0ccaacbd50451137c1340124010de25d860e66330fb4d3046f078b03180e3353830bd5d4298c133f0b441e5e81db96218e487aea5c1c30ef6cd0702bb0b03e7838b048b09124398c928c450fb252497b079a25087458196d7e860664226de6b0677f860392e191c62049303714dd804ee09efcf0e96ef0854060fdc20ccb741fc63c5fa64faeb0cd864ffea2a539facc1413282ca36c29f5ece6b87326fb40f2efcd9b0016b6b5820d2601960e570460c7a0d7ce260d1818a146292a08b60de60cd824b026102fd84e909851252109048617300f6299c198c9129710182f4ce491db427149e002c61f94279909635e83768b983f9b27dd8a9b783f1096b098c26f0248c10820c320fd811f8603033dc73c3216610f80b9b6182b519ee00d7183a5e79816fd92ee722b2fde5a771314f1e86f6093b4dbda880d682bb949c0d54af684b382f58473e538ab360310c7e1b800d9806b8064c31d82a62d1397c45d836181aa03a204c984fa83da129812308cb0305dbdc79937f335402ec6c028ab15b963a60f0663930333333cb9959896735b31b5755f8771a22629788953249295ac688315568939d524a29c914a1a73333bf8377f00edec13b78872e782b09410972097c5ecd2ead215c2eda8d8b1384ce1211e3689bd0e7eac98facd1a287cfc532a1539232cc88f7202ae15d42172bfc847c0e4b0baa55422376b4ef040b9a7ae526a1cf3c532a7bf4458257714ecc698fe0b6e8cfed90cdf6943542a33977c6a0f4cbc2160113c123080e4b84465dfb93c492d7303060902a3b842e65d064ed2e12622609a151d22beac646d2cd9e20f4fbf125f4b798ac7e40404696f8832605cf7d3249cbf85dad0f1a53217216952802a8384002a83800153060cca8b5c3f6a055b398c4533619834c79342c0fda9423369208ea59c2c863d81d74d92194662615ade267c5b05b74156e7e197d23a7a0ae0e7a93dc9ec972574895516173d00511fbabe7498516f18e2bb2f0843e09ab4527d4bc2f938eb9fc451cf4d9a28bac89917cf2dea013893e42ab6c6b83d6d2c45cc4a4c731716bd046992442fcd05f251aa43b8b690c6b091e6046ed173b83ce74ae7df478ea0b412b83ae77b37854ad6a5509113606fd08d39db5675f18349633e6c41c11974ab3c5bea0cfd71024e751f953f60cac0bda4c91a7e4a96004f414bd284f52e493ba8e08d1d02aa668a2eb7f77a43853e1a2a145434bb1fc65c4bdecf3818192c29097267725866dac05600f3a8a4647cf3905992356699786968aa2170fa12abdc3c878694243d15a06a19df7578386c80a1414ad7acf5e48ee9966d243c6cd27babefe941eb463ca11221d3b74202b6abcaa27ba145b43474b3d91791b35129005ed440294136d8ceda1a65454efd4f1107413a9e76f584b9d6212a926fa1439647512beada1925d682614137d7608cfaea1a5f961bd445d5dd9ba528cb885a42239e5ffca955aa24fd14f755029e78156a2331d5dfe3355e7cd11094a89dec2f28310529d449f1b4559863025d1c5e7e80ed1a289441f734e2aa714f334b4d28d193474380da5a1c31770aa90e8733895ab2d678fe862ce75eed924ca3aaa0475449377dc834a2554ca16d14674422c9e18d1a9c5521527e6f5aab4885ef368cb162d6fc52c52441b938e27737793884e7e48af6c0da2ffc488e8b325211a41b9492c8913f410fd86eb8a6149884e5a364497339e2a9d16530c91dd71030368c70d12c080715bd042f49dfb3b26953b39d42444a7f3ebc7fe9472b33a88f64c09cd923943c4f204d17f8e7cb293486dcbfa8cd240741a4e6ebe643140b4159b3393a6a0abe56240498005fd43a7a27e22fb4cc70f891f3a0bd12489f22dd11fe9431bdae592996e9fc9497c686674b79f99cc1e3ab9b9931022f4c63f5f0f4d8a1e2d35e4ca4bc9e5a1893f1a1a628c8722486ed5944fbd433fa6636b8a395c945666873e5cd32da2a4feebd0480db2c9a2a20a05e07054011b12c8817038aac08d2afea0746874e8956c55bc5be81cfa946376ced2152292ae72e8cf3c79b6b02a25e2622df48b3e4edca47e7ae2d04ad2734966a5a43699c2a189192f2568564eb94bac6f68a206cb97a51b37f49372529d192d5a6fb40d5d77d2a717bfb229983b940ded660e5397f16fe81a0a86aa1a9a33118be0f23d965f0d4d437f99272686444dda4f6868f37f76d8159da10b65399fe8d859ae3743ff7a9ed2b3899cdf456568462711f97208623a3e64683d89ef0caad3538ef918fafd6031fe27f3582f86f6d3349804ddabdfe130f41b9b42fc7e168b990443595bbcf28f087ea1b3523a67331df342a3938a2743eac60e1b35229043bbd0ef96a710d5ae70a1cf6a39e6f49c44103f6ea11342c94e8ced6ba1b978cd911e3a39051d2f1a152c67c5a769f6f8c94213f6c2734d46b1d0c8e83162af92c748eaa253957396f88c3731962bb45e9a2bceb6bb66d474c60e098ca04fe0397214e0eca871856731026485466ccab11f92930cd368150a8652a1604ca17d19995296654a895129b413347687123ebe9ad328140c8542bf9224497913217152aa787d4223fe373782aad4099d2c09aa4598e6709e2b179d9efef99ecf774cc126140c132813fabc2e41e5ff580a4d9103ba04ce427253393b86509550300c935052a048403d4222df2f77460d1ea7a1c51a5023142d4223dd3263ab3295a4ca074a845d3355276fb518a91c3b70e8108a0aa1784083d0759c4c31c7e049c820203431a7ca17be428c8fffa051fa3da6a632a90f9ad1eda625afd5cad4a23d68e354aae425c64b363ce864124153f66c92a9a11d341a3e31be77b27af95bf4612c42380d1e1db421b76789a9cc41974ccc2f984ec82662b4e8f3a5142b278f2b0efa1033979c6431f64fd71bb46da9732fcda3e5d2d5066da8142d678e649d49d21af41e73242fff68d05fc5774b713cc920f1195849082596415b51d6524d93501d8fc121c65ed0f31d657216280cfa9842c490dc52b6107e41a36278e8f8515dd0a5dc0917439c38cf9da2c9a12aaccb94694aad293a1d398894b2e5373da56882e8efca318cca4986144d7c0db1c81f2d866e147d5bc5bf14b3605a6a8aa211a3c456f5b649b428d9e44da5bc210714cd55b430194c6550ea27ba641ac345544f7e2f3dd1c746ebd3f9f4d396ec4493c52c89f45399f5839c6854e6c6b849fee694bd4df4b2294dcf85a7894ee47cf11093a9381dcb44eba7e9f3164cb4419f6e4e4a1acf6476892e768811f710cb73de125dcc3f2b2bd18a8724d5d41d8d1d494a34f24b578849b3ac3392936843cca4695ef9fa61a5241aa15eb2430a2d23d1bac52b4f3ae22d4442a2d3b94b79ce17ff479f5fe423f0d1fb49ff3d4c473492a286ddf0262f6423da73939f1b236244bf2726c7902bcaace5e4229a379d572fcba4882ec4f8902c16a6da5a3d4426a28b9644bcf0d97d41784cfd908868434c9edbf3244d55691ea291f9c46cac29e1484334a3dc773e37e6e591c942702009d1e76092e342eb8a5cacf0cd41746143337a891a8034a4205ad1791579ba2f42d2902103d1248f33ef2275641021614840b4f2a2e3853671ed49080cf987aeb279b624e34f8ab98285f443675a4a96e678a1416f29fbd029bd946388a5e3439b645ab7898e982b7a34b4080d720fede54dcf4147cb93413b4b3d7421a95c2d49a83cba953c7442e74aba1a4f9ab707471a15552860bd483c743a93dcac1b6e2ac6ec43dea1ef16ebb2b06cf982af7a483b3439c598ca3a34316e482256f8d0a14dc13c9570cf2926a4398756cbe754bbc5f39072e892cc1835fbe7902dc65fb4957ddee4a88ab5bb17878c4333236743bc70d7494a09872ee9ad187e66eac837f4495a8c6841494ef29d10a41bdab70841e5d720267e02c7514c108fd0a21abe031444b3ea5eef0ab74afc093fd6a47f48d5263c8586d60976e0c00279a28f3ede1354f214c09de87432f1ec133d4ef41b3e895945590bff269a14215c765b34d1c837d7f3bc247de425138d4c49c72cefcf74b560a2d92c3db24fc82ed1988f92cfeff1c955b3442f393c8aea2ad1271dc3b6a40cd9646294683db745cc1a39c4cda94974623d67cc10fd3c7c24d15ce7a02b4cdfe33591684369bba9a6c6880c89c662488b224f9a50d147f41d93f46b67fe507244df29e54f17cf1549336e4467322491bf3584115dc9bcd89fe6221a653183c6985e10ac884ec5a8d97b94fae9d825a2f1af3c522d6ab0203f22fa78327f1025d9a26ba7137c88f653de8cdeffea2f2a1ba2ddc9294f25d9db1fb810cdf567d8dca51d9810adea48fcdc8ca9547b1e84a59b934696bd08a2939fbf9226b3de9c9481e883d27a614cc7d5b31e106d12a6824ee2c207d5fed08868921db273fcd00939f173101e3e439cf4a12b25debf21a870b97b3e749243ca103f754822e33d742253cebd12f47e603d74f9a249ef68fc9f9f7968f48c9932f3100f5d8592a5f3a48eefd09578b976e853fc2d2c33f482eb400e5f3232c853a9b281e9d06a6ad3a22d6301b802cfa1f398c39a4c4fb21cda6ed794b7b24e12e30fe02fdad8ceb9e366f7e57f69689d61c17168df747e9e53310c8736575231e858317990497e43bfa684843cf132887cda310355998180ddd0482b25a2e2c63061e368066e43339e648c7a264b68cca902c7c06ce85252214c503a3136df35f41741cc6ae863ac85d8257ad7dad43474112b6a8c86ae840ab9444ff40cbd6ea6a03aac640da23b36436342fbe41c4cc50e71e3323463665dda7d3f017280091c023a500e2b6ee49840513234f2e75443ea94c7d0c59c5a3ca9f28b49c688a18b9341c99997cd0b0e4397838821052da62c30187ad1b13ae5d231f65801fec24973769feb76c05e68744cd2728c183fa7cc154ee328c05d687fbf738ce1b182b9d0a4981f7e32257591df16086ba1b198a4680dd1742b67340066602ffa8a41e46ba54e324ae60bce422fd9474214dfdf8c6dc142ff5f42ab79e83e2f1525a08b3e8bb6054b7ae22b34a3226e0cabeae125cf56e8332739f23b5a70159ad936dd30317fcc6136634e4710f2149a6421269faa27b7c5c88a1c088b2a64450e040174004ba179b36cee16338ba9cc5de028f4152b074f1223364a7003010b85764f770ae549732459ceb6c04fe8227abbe68cf64a11dd91850460c0a8023ba193d3f121fbc57cda0309e6a24d622e8472092287a4330437a1d9fd104352c1f7df4f68c70d0c5c71c58d095071001d7e80bb3d3013ba987e1da3d1f4069d5961630ebc84aeb4e51cbc62fe8bf6948195d02725b95393e6a8d4e19d8193d08ac82b29891031c79cba233012fa2d15f34912ddd0a53f42b31b72379be7f88f3f8dd0a9788818447b60e02274a164e6b89b7d4de9929d8289d048cdf3bc5ed1ff3b6ee02134319baeb8924330ef5408ed86d8174698640d1c84de64c81d9bc40242eb397834ed94e11f742257e4d0292ea590492e601ff439995cd04f1225a6dc83c67292c9f05fd28185e7f009e4800183041b06e6415719378b1e1154bcc03be824e8e59453b5c60fd917780bafbcf3ce5b07d6411b5c3ce39c855cd100e70015adcaaca37588c975d6c23c1adab2bc895690daa88103c3925bc494103816f801be411b33c66b29fd0c2b2702b6411f9693669f5e5179015c834e868de1daa3758a3cd3a0d973ab8cd93999169d99c033683c8ede15af8a65d06a95ffa6204212f9a30e25700cfa883976e5b1bca3710283ae84349dba73e61aa445e01734d7d697d9a3646017f4a373ca41682e7711baedc29ea2f10a112ac6df14bdaf48135659e7c296a2911e2b87ca9b545234a3a6fb4aad4de851c251b4c1436a5919d389a28f619626de9e85a2539683c8957d5dc55f2d2c28fa0dd1904b49a9338e3ec182f504a6ddf2dd6ba2b19dc376a2bf18e3c50cfb9ff255e144179e2b680f2929253764135d98dcc91fe73c84b468a2f90c9fb945a8aa143925135d526a3ac6709a52c7858926c6949d3a5bc989e8129d8cf039c4b75201042c808a2a1eb096e87b940ac95279b59528a9e4fe6c2158b60a4b893ee65422965934445653d849343a75876cb2b26a7c0ac202a5b092e872998ca98388ce25d548344af2f96b72bfbe566ddca8b1c377dca88041a20d3904154f8b684e311b817d44a353bf674e2aee883e68c8e8161d8285acd715b6115d7876eeac7cb242b618d1670c49ee975648bee8223a15a7af9458e9d77915d18c128f1734b689702dc7951c747ab4ce6d558d4544bb25ab524cc6a8b57508567d5b43c42919a2911083aea9c5568938ca71a3bad8423442cf08519a7228010c78c312a2f1bd90938a124348f133884a5489fcb7f80b5841b45ffa4b289dc3f22a1b88be2a6210b1235ac85501d167167d9d47cf53437f68de35ff8bfefdd099145131372c8510661ff0f2574fd9c7c2872ea6e61ca1bcf32519b287ae920e7d5e2a4c189dd7036e3a09d37ca625aa0874781510c8431774bcf00fabef9b793c341e84eecd918430e59b3b74c162757b0c4ba94165edd0e5e678aa62634b1e6d1dba8cb124e3886f4f9da543af33f241c72c1fd5a4736824041154272b873eac78a5e94cd1d6e5176d2eabe49a23d6f3973874a93a55f3751c21920c0ead04adb6207abd238ef60d9d90416ebb5ee586ae3aa7e84e7ac4c41cd936b49adf4167ac5c6272ce862e451219827ccf13760d8d6aca0deaffaaa1cd232c3d88a59b86aef373a68ca0712ebb4543332267dfbcc5ac4b67e8378f7f926c2517da9980199aac9a748affa7f3f25f8646934edd49450f19ea5c9de28a678f2552ec18da96373d9531e4c4d087203ee70e3ae2f76f1b862e990c41ab530a18da24dee22c5b796ce6cbb05f68ac24899056bdd125680138d88bf5427f315a12cd675531ee8c3ac476a19f38e32b52e25f2e5d14960bbd849fe09257e2264b31bb85f627a8f820673184eb10b05a684305d52829436e4aa12c46e0382450ac01eb451fa3cbc9a42f9c2eb560c0c842eb155d6667348b854653cc4b4cdde461bb68ff53c7b0909a3f7dbe421f54caf1f32e66616346ba3183ab582bf4dbad1a927f4acd8a57a1f30832880f299783a734b4d20d0358a0148d63c37398cc0a2c15fa122172490ebfd9fddc29b497a4b9a985c9c833af14baa0a534939848d5cf6d149ab95431837f4b0e4d2d141a1522a3040f71dbb3679fd069f5650e1d848bc86a9dd0c4f0099bf0d06b10ba5af99f2593748736c6ea9d1d0fb2436b2a31493229e31982ead09586f7df1ed5a7e5a7433fb247b7c638aa9ef2393432a5ee511d92181d713934c222aba99823e88efc451762f5274f9e9ac3c6716843af07934f7152b22c1c7a176fcf8991e4c6a66fe874ad2398c7cb5222e986b6a3cb972ca53674bd2943548779f74a614393a46b896cdfd6d0097dad18f357e4cd1135f4be9982ecd8e99962521afaf58f2a7a922fc58ad0d066b69abe27fd19ba48ed17c42fc4e49f191a5995d55250f92aa99832743a8699242f7aee9443862effca6ef5e96368e3521643fbffe14a66349f2413067635498f4955140c7dee8f2b096b7ea191dfaaccf0d20b9dccbc48c9c9639e1376a14fbde65795f1d294c785765389ebaffc58c56e0b094d7e228ad04c0b4db24a6529aa2147ea452735dfa46589e8a4ab2c7064a13f4f1282b9691ff512161aa5b2bb8632a12e5a1d4f72f3a610e2bae70a7d321539a777acd07af4104d1531649fbd0a7d9878499f9ad4950d15dacdb1da27e93ca5e314fab68a19e3c9540a7dde35153e2e46a1cf791a3a84b09727090a6dca960927bb3b4bf6842e689cf050d31c7d9d13ba24c383677c09a2742e3a3d0db9acf6204613ba6039cf8649fd2d21c484be62108d71295d42335f3a570ab2ed297c4ae873df4b6f24d516b202ae7045595ce124c01849682409cd3ef29e3d551e095d889ebac5a477888c2c20c611ba98b3a88a07ff502a248618466847e4fcc80c2143c3bf5f8851843e7c0ce1f4ea6788e9965151850288d08bd8fd92a0150fa1ff54b1fde5d5c25a88109a391d29ff2759176204a119efa47b155720b4417aa8de94424842c7183f28ac58f8ac265eb122c6ab8957ac48f16a6204363063007888e18336c2772461e1c74c5b1ba3073178d0a5cbec99cee79dcaec22c60e14bd1b3ee5f01dae1d48c76911638b46637558f8118aa1833e46ed7c914289cf41948346f3bea596ca61cd3f34b466bc0db7ca818a812086168df676191584eb7bee4eb0a3c61a62e0a0b11c171f0f5af747e9043b6a101b438c1b346f22fea745f63832a3c373f80436860d1a19a2ff257e520dba9ea4245eaedc1e4644834687274b8db9db7335336873735f88522ad33f48841832e842922945897aa21062c4a01dadbc173c6593953c0cfa2a0d51dcdf2c89682e08315e608f69902979bcc86189e182e6744c29fa07c97272748a4ea62e5542febc526e84200b1d3374380d34533473d23775509952f871c9fd335234af115276687414bdc9ce1c493c298afedadc3b79942423c450342baa3d7a129f5fe3a068749992584273ec38df273ce1d18956dc4fc6bd6ce18461394ff410e6932a9b68826f8ff2a0d90d3c34614a4c195290fba37d1a5a3976e0b88247263ae94936bf45ce69573d30d128a12fff0793b944b37bbe3964dc128dca2096640e295b695e89b672e910928ce6a4e7a54432f4b5e7d4fe16daac20784c82081e92e825a79c64962375e72d12f69aeacadccf59a4a1fa080f4868aa2a9aaa222297991d57b25a745c15212f2e3c1ed18ee7cc91829cbedc120f4774226341651795352c85038f46f4d59bc2e665b0207205060c2c8e09080c3c18d1ffa5c773ff5113b1792ca23793b17c4bfc8a68ab67720c42b734b460c04056e4400f68814722fa3f152178962041d6e48188bebae2882433f9664216e043b4193b24ebb8575c5163878d1a598cc054e06188fef3b5756eab10ae56211ad157966d513df24888e64da4c997c883684f4ec8492e82a41c4241f41b56b3864fb92b8ca9616306dbc023109da43061ae8308109d7886b4f4f12f061e7fe893aa7f09691542a8e8873ecb34cb27cb8bb6564545150a800103d5c8b1835de0d18736f28ace717a7dd632f43722c0a43e3cf8d0a8d41d3658cef26c128f3d3817722c0de0a1873ee9d410633db88e4cd9a83163470ea4438727043cf2d0e8ab49cb1493c9efc886071efafda412b4b6061d54dd51c3ccc0a103efd005b5c81f2caf8be676c60e1d396aa41938745811a3e38a43418d2bbcc64138745ca5c0c30e4dcced9aebf9f5a8439b7ce7adb3cad23cf5a04373494f8c73c13c54cc630ebd8bd8d1799272f8e2b3f32dcf975ff41f947cfbe6de207471687674d4497a3d454a793834cadbab377cc5c550dfd0c73c5e1e66271e6e281e6df060432797ca52a9b8dda32a5943f05843179b1a7b7b3fe2be1e6af048832d22e6101d5341436b29b5e6a5aaced068bce9dda4246668a35bea7c5aa62f2b656873c873d93d081db712191a49a61d5e46695566c6d0a68528b96297eacf530c7d96141b47e528fa530c4397a348167fb9205a0486d63ae648a992d6a8a9c717fadf109ecdbc43432bcda0a1a3868d2c70ac0574e4b891001d02f8c2c30bbd478e3faa5ad9d5e42a088f2eb4154dbfe94b178bf1e742bfa6cc352ba6ded102d0630bbdc7704ae389f3e0a185d6434747e95566f90f1df6a2d16e294f4f6654d151810d844716bade2cba4d7696d827f4c04297317ae70b93c902c78e2c6ecce8a24bba92a8fbe50ce17185be735d4bbf75ceea4983f0b0425b4a2455e6d5a6e3573caad006612999cca649860cd1d01a01163f03d9c822070ede810715da0c233f3adffd7a332aaa50000e2cbe784ca1cf414f5b6447bf180f29b49d322b939c9486969a7b44a131d5982476ab86502a2834228ec476f9b0664aebf1844e46e77bad24c7a44c34b48c142e818713ba14fea274fea807177d9824c297b569d249038147137a9f3dcd83097d855ece215c2c5239880485051e4be8b498ff072fd7d8dfd0d04257cc78bf718562e1a1842ec7e60e234edf4767458d1d354ca92a095071002aec6d1440078e1bc5230966020f241ca13d5d49593643bc904b3474470d3303a1a0c68e1a365c871108272787cbad7e35e0518446b72865f26398242c1c3772ecb0812ee04184ae352ce8482922236908ade8f9fc0bbda2da1542fbf9234c8e39e72f4b41684ffa6aca2073740802423b22c94eea29fa41a7f2e6a4373b3ee842d8f135d1989510d4833eef0753f14ce1b2cc83c653cc64079d58ca8da6a1b345eb9f5f7d3f8475b54607ad96ceefe71ef5546772d0ac84c915529bde12315a74956288114538e87be7644ec9f7944ccc0d1a1da54f6473f60dbf0d3ae1a6925b888cc6b506ad5bf2a8222774a48ad3a011cbd198a35fce19c233e84364e425e665d065e85021a47c0cda9241c6b8da5531c60b83f44c628ae0228f17b45a6a5ac69310931af5704133394c0a3198fa87a89ea295e81a840c57b132d514cd8e5f7b7b254bd107315e292124595952f492a3ce2665e24c44a3e8345e3fc7ce280a627eb6f09cc45f950650018702a90952686408a9b4dc53728ba32874d9538ccf7921b4954a5e00c78d1c08b8408e8310c05040194f38c5383a08117696e1844644de5e93181a5a3976d84058608176d4984143471638eeb8e844d2106a9a3c4de8a3e4181ea245a3978886968e1c37b29c2083096df0243d6b568e297448c612c81929f45d734a07194a68841023f49acc0f417b68c848c2cb4042a7d9ac4588a484a6f0a1a1454ec6111aef4e97d49e9b791946d04d2f7c3374e4bb9051844eba57ec670de7c1e2420611dab60eb21d54129196e941c610da8b1272e8cff81d6408a11d59b9fc4b2da64e82d077c968d2982f6e9001842ee60b9f3786894ff4c8f8419f3427f57fcd33c92a1a5a366ee4db90800c1ff49aad542e3dba26374943b1a8d183ae574d28257432b190c183e627a55255322995d763238b93b183363cccdf3b7a7220047009818c2d7a8939c9fe4f99e45b391c07163766fc590664e8a0604840460e0ac6046468d1670c3266c243c8953334b4b0b8912391d261855f91002d1cf49b4b2d8693a3bb3ba5a18503918c1b34f22a396509132acb4f43abd8916183565bc286d9cfa1358235669cc0ccc8a8419fa44e7e8dcd4fc90764d0a0b8ab26e63492099f86d68d64a306171a64cca09711416a4ccd264b9f1d9021833678bf9c106fc6a00fd1faaf638a86161659e8d0e1c8011930a844bc570a3a45c60b8a00325cd0e8a6ac616634967c63c70ca3c2c7299a55d39855b6f4334534b4ae98e139dc145d8689a0bf2aa7a18572e020a5e844ef7a5798e4a891c508508e2c6e202c6aecc0f2418a82e1818f51e0b9248ad43d0b13d7f81045a7a3e8dc0a8d2473ecca85a24daee1e7ab9ca1038b0e50f4219256f68c0fb7a07ea211394c328b2d1db36808f1e1892e9ed4ce9c45633bb59de884875be97c684b41ca89fe2d668e4949fae5f92c1e3e36d1c7670a1af22ce462a7894ec7ee091d334173aca08d8f4c34d93f88d0e103136de9ccbda231c877d52ed19e909679fca4667c9c4ef8b0442ba7743fac452ad18c8c102b9ea946cd51d6c20725faa05176c6c2c7247a8d91112ec9abf4e449a28bb8952a314852099a4874faa4a9a01fb9920eb1171f90e84ae84841e53f3d7a458fe87352256fd56b9da943baf870442255560f7e61ff68441fa252ab28bd086b2a0d7c30a28b7ec2e2c329d323fa8c1310a3c1c722fad4d41bfb3d7f28a24b39586692bbb13ef904a02c501614283d7c24a2cba6a13206d9ee19160540203e10d16b105196e1392baeff38442ba672427e0d3f0c5188f3255315737f4fcb0721ba243f32fcb74de88a6de163108db82063e2268d0160c0c8c28720da52cd7f622ade524c0a446fbaaebf7104882685582495e9ffa131a53f965849f74afaa1cf127378dd2b4f3a76fa504a103d4d2ae4f0a12bd7182f49480f93337be86494c529f95c0fadc753152bc6183d7ef2d0c6c9d37e5529e7bf8987fe73f54afcf11c95395482f65fecd07589d6d8bcd7a1f72c92da2479c5d18a0eadc87851f33c872e9c30cb8f2539349a41e670222f3dc5e81f3ebee8347986cc21ce2565501cba9cfb2a6292140ebd24911f49a4a4522d8649f87843a39a92e4d773dcd05a8510520a2346c2471bba8cf12a3a53fed2efb2a19149e41cdee268858f35f479cf6208a9955173921a9a5c2623ae419ef856770a1f6968b27cb070955ce3a50a1adaed9033a7af3befd93334a2171e4b6e7c529e99a1fd20d934694c12b254858f32b8597a99a74b4c86e64d89a0cc5459ca18fc18431b4dde43cca7e5197a31f425416f88572a083ec2d0cbeebb8998a4b0210243ffa9a63926e4ee09329e19f8f8426f399fcaa1e494fc76201dbce3c30b5da55b6af76c8f99f12e74625a59cc7b2eb4195db208a93a5b4a48436bc70d1bc562f0b185fe744f873d958f3d59167c68a12d15a24b2e9179d199f925cdfc221a5a3fc3460d2b9039147c64a1197939a2c6789e663158e892fe5ecc9854bcf472828f2e9a515a7ef5732d66fccc40387c5ca1d7c8bb9bc2275b6c8c153ad7b810a75b47348f55e82505c967426cc373d8161f54682c441309a653464ae229f49335a37efb05f12582a4f89042a33b29bd95931485655fe3ef09fd6391c3aff04cc107141a4f3a555bf78485d2153770ccd0a1039de3058a8f2774f9fa74d75cbe53d09dd066580fbba7311b3766e8701830ea131f5c74a6f2e91d4fe8724b6a42f311f494d0995932cf847644a6f2542da1cb96bf233ef4278704ae43097d484f49ef78e76c0ddfb8e2a8a8420126405f25021f49e8ab541e99b9e3c945b3a7840f24f4c162ced1fe38773985f07184e6428854b2f183a4ae3e8cd028cd8a9d840e5a35897c14a1cf7d4ae76f28193f265c7c10a1cd497edabfbe15411f43e84b46929baf548f77e54308fd7c86a47d84f911843e84d46fcfc81ddb1937be8ce003087d0ccfa093df1b1f3fe8afdb74a5d28d21363f400098f0e183deba822795527e2bc5500e1f3de87236488c289afd44c58336676df9f8e144e6129173c3c70e9a0b2532c8b02179126dd1a64688f31b1df4f14f3ea9c7a41c7421a8e72464c2878593169d047d52f44449bed184833678966ed0c7642fcf3fca47256dd0e74592aee199f484a01ab4a5f44ccc644f16320d1a2f8b154c44381dcda0d7cb1047c8dcc87fcaa0139264f56cf23c1631316882f8e41cd334b90c0cba0cb2f3e89c12dbb37fbca04d4bd99c455ac88cfdc3058d529643462bd749217e8a46b2c4e47eba23e50c1dbe400c53b461c367e4458aa77f2e452f9afafd529667279914fd590c2acab9c57b8e47d19e5071494e46d3385a51b4a2345a4e2597a32885a295943e3ac49aa7900745a3e4c6a9889df32d473fd16f2c9db4a59e7a87d5137d4a2239e27599c6ab9de864ca22f48ec841659039d104959dac8274cf666ea2c9e152ac980915c7a29ae87fe52bf7bdf375a29968642ed5993b4c12f960a2171dc242bc9397684dc26893135404efd2124dd279e74b872bd169ec7e85e9d1512aa4445fba23af16417b4f93e87238215498e4937925d17cec244e83d60b35125dfc989162c5a4494c48b46d4164ca8d3d29888fe8720c13374ef218bfce118dde3da1b55f92127323da0a4fa267e664ceae30a2096242ca9882ae3ea54534ae33bad563b2985b8a68fec4b9556610af399688b6a2fbabeec78c7b15225a570bf2d1e45b4e7b88c6930c6de11d3e2e512bae8c2710c3108d1225cb55279fca69219a3c262732232144b359ff74b8e538b13d3106d1fa5e7585243f4c874f10ef5e674c1e2e2410bdc7944185244c80281588f187187e88d187369798bbaacf87469278cccfd249f77631f6d0e5eae5a45d63a79c241062e8a1b728b252d8511edaea4c39251f8d7ea8c471a5d260281409c451180741084dab070053131000504c188b45c3e180a407cafa148003512c184628321822221a1222168746a2503010088984816030140c88828150502416e220930f51c0613025a46be130334bf66d6d13a6998b0593b6de2fbf409d2639b7b5d03b7dc6f6408b2e168d850c0584e5ea58688d9ad5a5a649e4aa2e9f8988e3311f14dd45cb73d1e67328824912a7518ab2dbab65d47f212456fbdc95713f702cba81500829488503d7f5603c0f3de6f9e442c78f12c5dfc54c05e611d1525cb67770f5b3a9b615e530faf59d263ceb94f868d85976d4d8d0c556c2a5d8433c0f3a87ecb337ebb3eb4b0aba1144ca219ce99a08008672536b1c4ec6dfb1e4751cb512c191d22d60e8e16f74e64c540e7dd1d60f06c85989cc9b377fb97f4bbd28662d972a0f1b3560e6c45f61683ac2bdbe9507e036f998f17e63136737fa560871933cd5a9ea5eb6c3501291ea68af9efc0f356dde438a78181b417eef25c789bf4d9c104c16b585f8253fbbc90a1839cdc6acded06df88f56bf08dce21353409c9ad2dd563817359aa0a70ce8c3f063590e1063c5ee2d4c8b12278239dbd14658d8e5d7c567f427adac3eb32ac7859188a3119511813a1119e4f28a8ae3caf09a120b3af66a9d2b097826dc06de05cfef7bda2b52dd21525b16cf1004b4ae775cce64ae4d6688cf0105bad5a571d1ec9ea6dbc88c50015fd8fe49c1db31efb59c6a50091c5c81335f58a20822ee3d64ac8e1f5b3db4d2bb7e9196afe9dd43a0758f4dcf5181f8539a56d3c84a95723940c8da5aa44cab77b54863f417984963a0f0ee2f81b9e79a4f944c965513bdb494296b5a824c1c6dc9194ae6993aedd23946e1557a4e88d3752767fc58cc7378769117b0e40353d9a847695a2499160fb71a4fd65fef9a5126a9940631ec3d9e5c352b6448ea48ed1b3f08540970e5c3665f251a27d6756dda7d2ad538265e5a60254b0d0690134f145b81c2c8fb1a37c39cc38d9af82ce77787ce60529864663b0c852ea9ad2f4914bf11adbe5de51191079b3a58844eb9270e98ffbd8b3a82c32c28660549effa2f24cdabb43dbd792cde9e7006792d7348aff4ec8b3c5e06694e2ff9b81d74e7484039f09f2d0722fdc9343d8efd9507cfa319d31cf5a1254eaa5cac93e2d42f4c4d9823a7e92e89ec1c35e6375c489cdd4a80bb3bb223e48850136bd518c0688edb4178e0e8dc6f7cbbbcc564de646426e36521c13ef84686db262be530da9182abba3b38a4ac4f6609496af6480e7a00db7af02ec0b498b27d862210e3b79df132ae16635b47be11b84919b629279abd190048a548162fa8cc768ff80b71e3371cb56905cd40344cbd611f68c4e13caa1a47efc36c87bbdec628970a9f797949956b13401bc7907553c5cb6b011b98ca7948bb60ed0be2547b87a082848b00ef6e84111502febb3a7d0e5cc40c9bcb34e5ff874c36eb7353da31ae631cb195a97e421c9a9ba658a0d46df8cf16cc411e355e2dac4692e21790894d91983729de41aec3de900da989f0c1983dc392fa5bf5712b922b38af3266cb848dd1617abde48b79a102d00f6b32c3bed6d5fa42c28383d768d7cb8caca1cb1797501d89b1a1f122a0ece24ee5d7209f908b1d8386cf6c405dbcffcf71ebc1d65bfbb87463381485e89040b04de698b2d01a3519c3a2f50ab5a9fb7187d5d486caa9c5069d71b6951dfdbaed628b6ca75e4047ad846edc94b3dc1fa7638fc60c0c7aba5a36717c9c3cb156f57caa0f4e4d19d4fdbc4b980a89d804a44b2cb2a7921610c6928d8a8f3e937cd5222dc11c17489c986b1bcb1eb8ff5f8d9f957e3402caa83d17b8dc3b793ab3a7e26142db694063fb833da4b0b9ece2c03e3cab473fd1aeb12df680a1beed1590ce63c47828b62085dcfe563083d89967800f18bdafa8e99097f0464ae773d101093486e6e872c6dceb1ea1291e46cbde48c9ca0f88901a8d3d383a1646ef261e7002666cfaee0ef4b38db9aff81e7cd6f16419bdd5df2d834004e9cd02654f60a547af3f8057a978813c74ced27278d639418f2a04c39865189caa30288b1a50496756eed7c14a93f8ee5d4dda7c06697ad153e4463112388b51a48a884477bd3daf7aa99675308a5754a0a2cd8b11c3a7a9cb9d08b3f9e4baf18c906118b9635be6356184744ee5844696cacf7c760a90c1b4139037c4accb8b8d4b1045da980d861e4308374cc69f0049cc250d50640cfb4c4c334365f1f4eca920125d360b001101627125c3eb905ede725e2a8709797713a008793c86c830fb354f47a10ac7b889c75d23396c9d1eeb29bfaa7bd70f508d32a72bb5b1a89be3be22a9cdb69220318f2db900a2bbd0ccb1d9023439e10f74348982976546c932e76404696524de8f5b393ef9613709c0e043095c7b110081774379a43567b251b4647a7ed7fe6ed07f95e06984bc03935cf369f341debdc35e629c2ff029a8ad27c0ddf4c0bae54f843ad7ae0911fc3b26769abcf3b9ba8837c95994ee245c34e410235f4cf13ad9dc7a202f7dcc612bc9fc61fdaf5835ac48cf7d856ebef7b2b2101076946357ff39b63072d686ecb7463d3da7016be433fb5f12be1f8bc3e33e539e8c6dc9c4c89aec0cd990066d117cac14cc8710285605f8ea09e58b9feb81cc657d3368b6a2a5673fe47d16a6c6e311c42294081bd0c1ec5b36ce2a85a2148a6cea2ab5c2c5ba79ba52fd0d80bd62dcd6e9f3454dc1937b0651207fd4cb2d5e388a70edbd7cc3112485e8bd66275181b6f1f42840083a6d68387b6e699510c5494ec4acf4ee4d1b6637bf599be8259c894313439373dc98a7cd15c074f16a52a80b29107860d4ff122f6ec1d719a7d5e83a16bf30ee349a88f5b95f0cfdb6e25c17c9be665d769f9df84c6607ecfb7860206653bd0ea008ddac58abfb9f4c1011b7f978082765e997791d4d5c38010d6d47273a1d2daeb919b09298058bc0a0602a146395cf3fa08c260a585b243548ec5188ce826a1d300d1ae2a5780f82c76cd1a53e6c7ccbdef9026cda897e96f91461c3c632f1e19e08cb0ec33c34ae0de01a48a78361a480bdc841e272b42d07492338fa20e422cc6ba17e04573d583fc226de020c0bc6693022ec9b03e1531c459e239cc831006ba0100cc694e460fa252443508a06dddb1ab868d0385d243b86e0cfa01b070945c24c018ddaa39f4165d3600aeaea651d0c82ad1ff46882e708625e083609a710d2ebc02284f53a7085e09e81790dd6ee601395086ee9eaee875d8e554469d2638a7732d90872ac22b111362cf4eebdf20cca539c7871a30e360eca49160e509155d21b8224b3ee5c067c0e22ea5f588f44bfa4524dcb7b63160a9615d84c4f957625dc7f710a9e5ea41c08181e7a1ab87d491a8616ff85a0b60913a1fc794743e4fd0a281da0180583a6bc18e74f9242e3075af64900fc0f009b07505df11d84ba30002d00f4026801e027c00f00b1002202380930fa03b4b0d44ea5b305aa2800936de8338215c68168e15151557781d60e20bf00ae04f85640fc04cc2660ef002f4b0033053cd78c3c40cb3f75bf9e05bc60790076053055f68f43140bc024f9a0bebd00b8424c53739003f401e00b90d09682485fc15cb866d337c00c26f9e9166d3a6d41036881e42d64f900bd58c0156f544ca40e40030e28e7802a1ac054b8ed3d289100766fb48f18ab05f03520be8058033cbf00661ac245bbf5f102d172494f881e1b378e818510a92e02d42b664d814819824c9c2412d328421b76abcaab62efdd8241d93d655d43aa9721ec38b0a0d5344f1f8cc0b8210ac77037c61e74d6b8778fe4c3a5e9b72a4f593e36c7aa68c4004cbff77b037b6c1ea03ec70dbb2d25a12874f80adfaac06a60a3a09507d326ec5d50a98327eaf05ee88dcc9296efd759e648c0147b5c3031bfbd5e7b26bdb03f4db304a0aa4b7ddec768e1a2ce00e8f445cc3c809d8e206bbad487bcc4627aa603cbe14022e16d074db74da0ed949f889dc03c10229d4d45a10dc5be899bc81d25fcc907f5c8edc796027d124bba321ac8e782c8775cd7f539efad52574303ed4bd043b4d9339f749e5333fd94cdb5b6a738ed0ccf79de29ceface4b9f2bbdea6a9dd3108c26d60f92a7bcfef395d7153d25899d576f04c00563b652857a6a8f4c12d411a682adf3fcfad0e1db155a3aec14b45ec7fa54b4651dd13f081da5cff67c7d9a1f62308199c437c7771b804dbb49810601b7cdeafba96ca39de406b96c920c20ea86d77835d9fc2da91eef49563478b1b031aa1bcf83692d35a0e8415e49111026634e9e3291e846a51a6624155aa742eac0b7d54278d3b3a5cfd472e4f08e421812735826e53363edd0f533ec33e1d64e7a54d994e4a0d7410c1c3ef719e725e39c4108e049a675b6e0de0512e72327ed236183a98935f19371711de362bd5d5318932370d4810fcc9d752c1dd4810af63739dae3bfa55b46dfa522e04314274180f29712782d789dddc618f7aa5244934b3cdae0e3cff7734577fea6cec8bc21361f663107514cd3dee5ab0e7d08b37d9777f173a3970be65361d5bd9bc65fade1268f9dbf0c195dfcc9d5762338706309bc12b713d6d6c57513b0490150a549a5e0268101827c7c08292316ecde32afc18b6024158ab6f4b53c1ec937cc127d7852f446ec98aaaec809ee00c82d17fbe261358d9b96b1074a1dcb2060b81b788fc0bc6abd54a46682803891c6fef89a01204477061c750457c543024e21b840362cc85bdb721e39c2bbfefcb1db4588f81bf1f742d968856d8b0c9eca6adaa28c464883670eabebb94335340e9996b9993693b55c065d20fd2aeea6184004745a1228bc67dfa5c1a5d1a01d4e75df33c58f120aa953b1a6237a6b3637c13fbc6c2e01aa99af8d8f8606aaeaf7aae74e01790a80fb0efd9e612af4ef39c46273200d40e276848c7b2176a3c3e697a419c5f0dbd8f834f60fdd49691be7c14f29a9c00d37119c4896d0daec962c17b84090412974c2eb13c7993e9751398f1bfc5610a32a3452383dc26096cda3f25241b7306e914b6fb83b2dceffb04ddec2fb4737878745fc4cd3cabaf9b07fff964779ec54caa1c6bab027f959e02500549076e92c5c5707c41c09464192aa938b9b2ad7489cc1b1a1435754861cfcdd6b306b62be9f37e6722a7967083e389dd11eb55c1c771f9fd5be67f7ea9c6709cd60cc802beaed1207ba2015babe5c962a07f3607f37e29c6bbcc33ec3ff9d19d82d5cd3ba1ec04656ade12a9265bbb210b304c620118c08f58d68fba147d585e9ed8aa1d897a3a6fcc40353ea86505cb5f8d7222e539482e58f493980cdcb84dab8fa3a1521f49abf1eb76d3dfadcef88b8306d0d27c73700d901be2e3dafccc20340e4474ec9b15702322f45bdb579dabcaa4adcb504ab70d13e5ab0a238a2a69e8267b1f4127789aa49890e2aac08f21ac667a3cf8ce3a29eaceeb2e95c2829287c8aab14df650218dabbf90abcbe399ba3ec063d86beb8933830fc4a684fdb2467088bceca32fa0ea774c62e2754a7f0f431344a972d6174302ca945b5d3dda435e9c7624cd6a328d5aad926acccaeb885a10d21f4734021d601eaa72aa2ad2840ccd27cc75aa6644dd282ef1272f78961f84a43a3c90ec2e0b7122e53ea6ec1db867829dfbae0255f9dde5316df575350366edf31484225850281e4f8e841d92db3a3a5ad0836185af502a8b564983a97af6fc13bcb5e13841433b55c1b1102de1d86a40087e83943e25e3e97bfab00e5714b764123c095ed269a54bb0efbdefc39bdbd0958d63402984d4524c03b1f5140fbb2b68741dc6a09dbbc300d2a672662f2df8b5a6cb8a9566e0108a90fb6a31afec8aede81916114b9b4fb64f227f1c1ccb3e2f058ec4f2be16c9b63b3fc84587a3abd668b0e3417e42a69139b236b7bbc6f75ef9a54881ae99c984adf8220f2a5d286b4d2775c1897ae4b166a04d4379303c626d2f1d4e66d9df58a0bc7f92f91fa29f6011222b27213a7e71254a3fc825b0bb8c51e4514ce67321f33f8dcc82102ae6b6356c65da4076eda255a31237538d658543e650e15026c87a9378d686cb063451494732cc4ec5810bb1fa5211b5e4d91ed0605f59de4435d2ff596da43832369b474d2f4b726e2f63274f83b3631824f4d18aad998b186d677cee3cca960aeefbc99eb1b36fe2c5d0dc6a2cec19cc01e73fc9373f15e9a6925ff8f76e21d4391d15fc6e9fa28a3c489be88a6ac9c8c848be7f9ed7ec66bc57a10041029270fb9a4c7c10a4520c18a65b96a46434ceb9a7e62a81dac7b25edd5c0299b46d5a2221712c909d13214d673e1ea03335bee180e788d33127c8c6ca0d8f45af81f43fe15ea025dd5d1f1ea570f2dfdf485e32169e61b82bc1670eacf05a26708eff018bbba0c079b9272c2d33990c47480f61ae069a6441211a352057b51ff6e76483deb6bada5c49d86c88fdc7e8cda7d228a5305762836a586ac69a1d7612cc1befc8a4038c7eda510c3f0dcf9bb6c368f885ef06fb41c2f203b324f028694da771b221366cd23bbadb7fa4e71b6c47b98bc8375652acd53441d51720fa94ea25c672f5b8cc00995b062822315100571c8a314e53674df04e472453c51a16de3f8bd64ca85520a59406874848ee069c4d11364448543362fd2932856a17f2194f364a321c41fa2370f5d22151822348472e1a8c7b8da90aa414a85ac02a11258e5b3606008b9f8513a13e5deefb7abab2cb4763d9b73d839b79b23e9a1f22681e120a6cb8774cd1912aca90e0ad9ceb1b48301a360a063eb78999471654d1dc626187a9a7416c8b84d7007673345cafffa2ade12118ce6b603a22385c68542cbbf804e895af38b5de350308ba8040ef25a75222b08e58ed0db6c723d2f17a1644f68b6f8f105490f22ab09b57ac8758be45594fe8aae49548d1ae5a8c99f48c2c03baca675b419900497c849afca403512696bbc31b36148cfdbd5333fe82634767faa642f7cace06dbd2065d84bcf193a6933b0553a5b5d269223cb24e3b510a758c8d7abbefe67db8b789e856f49aea348ed2d20b6852b643979bfe242658644b44b62f5933ec84534ec9b725d2297a4e820bc48256e0ee26b04a0829dab8bd065133323dcbeb3ef24dc6b0dbe2774e442a5bd5f4145d9237eee3daeeecf373769df8b88f0e028bd69fee5fae0c2d0450951b4b74feff0e27be76c85b2b94da68bada1279b82b70d51a641db8ac47f9abbc24137990eabf0fafe20f16c80492cd4f64a2c1a10666882bb5a3ad3590bd6aa2921632b8201ca90a4fd1f69901d444ecae6d891a0d76896779de2db9c729123cadb432a3102802bb0420debfd0c7d04f74a49fddd12f3914b7f0743e8a3ea3db947c6ad07faf097b51604db472d3bbba86a38b5b065356811f2397c06dac931e6028bda1cfb9565e8528cda1b7d6a37396bd63393b92083c3f21e238cbb8b7d13728ecbeb925638893d697f7a94a4096a00b44d8f2e2ad15c42d5bacd93ad06446f49eaabfb53202a1c5567ad7b789f88618400af145962734ae9ce8050c761531367b91184860c4125d0ba8375f14924af03da7bf23355d78499df3c26716a588304f633744ae8215903407f5b0d6b1467700c99eadde2d91cb2462446d269a6453cd1f72d81c53a764241700bc3d5f476d2973357edab630fceb06b0236fd68dce3564da2dd0ebeeca0803871b3005eec7f880198e4316745efa79d02553785fbcc38f976988c6ac745a81fa5a3d05dffc181406b0fd6cc88452bf7ad8a60fd824f59bcd5024199af03da41390f58f0108f19f2b8454fc0012428d58e0cd0e61c7f9a4876b8ceecc00d5a75c347b10748c6bb83e23660362e1d8bf0f2b02d637816fa02e0f9911fac9becbfbca8742d6cbc12ad6a4dbe2f5e611b157be65b5d240f2a3718634714fb36c23cb2200e8188684bb8de26f0e75d5de895a423df6a034477cc9798aa0c57d145077ee1d71250b39ca966bebb9f003a33c1dccad168d0444c10245b1704ebfa0c2a8f3281a1b33c1198cbd27f2fc17cdebcc9b8f86b2e9c0009f3d6072f693bf007f81aa94ee1db2dcec9d48b4ce806640ffbba66ffdaa00d525e26af77d3d946eef9163a7d81da2666a770167205696d536c564f5221fe76ebdc736724f777f7de44e6de251aac6edebf9c878667554f878e52f702d3f129947df5c35992e607c5925205398acc938030c7b3337474a35cab2e0f16794a8d8bf01a97b024441111998254accef455ea91907aa56cee8b8bbc65e6061022f6dfd7f3b66af68bf01a30ea55cc44097b370e5f1e237c3987980e0f266f1760a490dc23cc99b1b5dc3cc6e2233721bb5b88bc13b2ad929903c0bcf3414666fb501960bc0847a1c5a613ffdcdd904f7ee9c95d03598d745e2fa9cd04e5562f1d767fa8ecd44276223b2ccd2be29e375191b851515358e8445c436d8d279daf5fd652914a276950b7a40df0f067788d77501396729b9f922cccb88b2164a1047391aaab8114b75fab9542a5e4331c30dc8615bb1a66a309d53436782f371998ac2f707acc784baaf79a96bb72c8b263444a4c8058d5529e148f45e7136c6c4a760d9d290e25ce39f8481aa64250268490d952ad805fd2d77cfb0132cb24562d1c52c192fe324863679e6c8f9942b35ff7e025186c58c2a6651f83a353bd166fd0f58337916be7f4863d052d14c24446a078f5c0144be6f04e4f0b381f6bb01867bec193e039dc327a5883b07397d98154f40e1dd432a8efbae01b5dd23dddadf88fcd40493570e281dc1d573d20088c5e3686faa55d03ec61cd20bbfc383a84824bfd02eaf380b369e96c1b59b59847e377e48b145dc1b76c34a46f26cec5bec1734c0e3ef40e44e632c829f3349c56527d4dd2b1afb0c952efc10e458975fc744a1a88be12999966790be0ce565f34c43a85c7214b246580f77f4a8669cc2f19b9d4d9038406e2d4fe86519493bc9348dade1502bfbbc0dcfe120f884e9cddf66acd345ffe729064845228abc20057ff4d8b9e8eeda6601aa7867c75d732528ea392b6b7fb81b1a014f7ae07ee9d63cea9850f16f1513edee49824a5f2ca9019025ebb1679f9268b482725da6243a073ffc9718091be3a72ce1cda4e863d734c99c5d00e565aa4d5f0964c4b450df199660913af4d04ece4e818c89dbf53c6b33a7df8fabdc977b4feb98250a037ef0fdcca172e05e7ef8d68915cc39960bbdc17a134aa71bc2246d6ea7a111da0b7636ead5ad535f692e23fdcf897fc2975e894d80009ee76cf40b4386c5384a32a9214bd0dd0a4c669a57928af73571899d864c2ccef2c6d8e9b04b53105b9ac5702f32d4242bce453e9b3c3147301a2dda30321607216577b5a3cf8be190006b2af2088639b504039096533ec22baa589a94a42de32d51b0ce2a485e66791c9513adbd4e98673b482f27c369460b43a1ed8e9a0096eaefd2c838fd3409b9b1e30e3d5ed7b8b7c70aec3b5836c648ce88a2ed54bdf322995b3fbee3f242f1416623d0165a64c6fee8e60a2daab0d80c5a4f44c515ae2405955ddf3c92165417a26e5dd467092b54ee82685f551121302748059519da66485ab635750536733b4e779cd98f0ceb6e0d7b9d817d0d70f4985c38cfaaeed107ff2ad92f0b5d6cc1886a35c0dbd25b0dda98a77d4671e47fee00c973ef3092ecacb4067daca4b3470f51000289e4706c30f895166663783f7de569b01b154e2e40f3c01364d23e88c13f386207fb3664a2f8490850fb8cc2426f0f8e480669a8a40fbc760518d3b0d73d4b3a902e3ab06dcfeb8fb72fd5914200306995985f0af363eec4603eb75b58d0b81fa279fa4c15baa1be4d1d7d8afa585e681c6a9c50111731c08adf789cef85902a95824e02968c497446485bc055339ad22f381fec9ca998df34780e508e0d6e22ea6273f047100cea746e23e3509412539006fb23df17d1e2d4eeb12b71b9ce5abaf2187bc746cd546ce84f3ce1c910775ec1a210a4a14151f63258f15998a5a286cd87ef50cc2d720732890fb097b7a17dbd72c324b017a035186e09030ce89cb18ecf8e26ee0ef38151ad1d657f677a0a2fd6543e40f7013f0b65b8129b23eee4a11f67d0df0e9fb8c32c921453a30d51d0df7d37d7a8430f49a20b5c1797da83fc3664f4e8e693574da04392930043489d469615484607baf59ca80be9872bdac2fb983027a6744aa9a249430ea87252a17bd250bdd88bd456c2f890a7292cccf2f52b1210796b7fc959d31c1a0507b9bde2869921f37e7d2c872dccbe681ef8f7f3ce325a33e479c6f8b92c0745ba655e5abe138ef224e18d99a5ee0664b66d4549ce5e999ab3bfadef92294e9a7d65c3d8689e3a5ec512f9bf8b4b0e6a19ea2a26c031e457b434ffe7b2294b6fd8b7d8d5b8d567df66a17f8a6be1bdd91f44dce0e762f80827e2cf000a804c0ccb5e87e644a659e66ce10ca07306f7800b239020e6bae4d1084d966d834452b8a4a36340cd8a450c88bc6ca31112745a702d414727111fadd1cf29e48b36712d1705b2ce5052280b2ef16d643c3a96f77e27be7a2c9841784b0c3f61fb60f0a1b56f78761924662a29a7400657f582b665b0bc2c254bebd96b72cf31e59860f25418ad11635e13489b7e504b2878cdda2a13d910f0cbb1558d1768f7ce9590d8680ed9a474528d80a9a25cb0ff36ed5f4d1e219532299a12ad910edd4aef978d3719479a93e570eda846e3ec6c4b974a06a4c3e29c3b7b53905b54cd628c20f8f686bbc4da1e55364a3ab274ce4b48828f18fb2d2bf09eeb7d242545d0900251cdab84ca408bbad2ccc4d8bce5c9ed86090858738bfd549dd49f48d49d5072385ae915d9a186a3fa99bfa92c0501a6df80a9fe028a38f0893e332731fc7f0a7cafc4b6e233347b572134116105cda354505de0db3fef778f5cb198b5e6bdeead7c1c3f8a610202a845817d27786034766ce10b66608840a838753c81510f52609d3ec689cfa939f4588800a4923b2aa8412496180e144916cd908b726cf131100c10fa8ddc8b3035c43079c0580f6641e59a0daaea5b0b600494dca50394c0275b87ad17127e19936c0a0d6984b3b8ca95f6d333e47e01883836f15a1bd90cd6d42ba69588ba75ca6f5179ea765bef35e689ac26de6acfbcd01b290c7e7babf2b385cb14090c2e1844be3749f5cfc89ff1599c910e38a746d5783dcb5879b0a4305e56339df20830cd101f8967ce377bec2c27861a348b0299fda1422b2413a2c9e3e02e55d530ae514a59070470b91ba2b24d8de150bb5465e9cd4c2888f9f093dbc80bf6aace4f735410ce56b72e8a3143a62c5a101180cfa1124f4cac0f229f648c47c5304588663874cb709ff506116c413ff265d0dab047536a05dd44a6878c60596a12558bc48dd412a8c2144a2a6558a3bca24ff0a46aa440bf1f2372e0fa6d19143b504d30b201f432c66d2ecc843e058a03ec90079c637d21169821837a39417b135bf39d41bd05dedb0cd11ea6bc17d6fe48753690c80a680d60d41ef4577b29f94e96305380a12a8236cdff1f20d3927a77bdbdc027a717ee64be79cd91186e42f237793cee488fcc072ba0cd936955b9ba11c61f7201fc9cc2f71a7c352f2eff47254d4d4024b0a96d9ea6a587893eb83aa61ccdd357b85ebd6ae549392ce6a94ef0dc21012e9f1d36c37a00b5a67ecea666c3d51ce06c884b8f676a58c3ea10f9330dbf33816c81cff0e04ac3363ba1990f91955a388c0c68446cb35867a19ff06fd18631eca1112b53355d6380248317ced0331556cf8a1be16d05eb143bd1077d0cc2fa82c50aabd2d4671b5968e6977b33c5496bd4af59f21b2dcd8bc862064f8ad3d9c279e5b8e29639e8a2af13689ba97b0c048e05e9913523a1da513998d0f321e44163e340330207018550b2aba5b458c567fa2f4293b4e85f9b104b827f5967f8aa080c52354cf7fda766f4c6fb7ea0e1eb428cc1281476e430cb1814db24f52492794c7ebd3f285f68c29748955f8197f33a21b9b8f75b3261acbb6432446f05d147e12355890f3c1ff487742ee388b14f74c509461810613dbf3d65b1673fcc6e046d2e8a0231ba77562667dc36a8d4c67cc1f18ddf9390c86ce4076b9ca47979a54b29c75284e05ce12c45b18cf553e5e0e27d734dedcfb9775b46003f8f6984226a49b8ae8a561eb50de64682eb76f989dba8631dbade7109dc8fe570d2aa330d6f006ee8ede871b78c204b302a941b7d9a315f1cd5e1491f874cde266a2bf07e4c21566704ab9908c969de14c891b953f5aae23ccbf1d61f830e401f8f47004a287da892ae8cec1533d821a5776cf20b8846f16f09feb0fa36d42ae6ec41f9c2339e90871ac47a09b8e3ed2b67a5ca7a0e7e8f4491a4f6555c0e8950ece47622d01cad76cb2b1deb1bddb1a4c789116be22967de028226f5c07975fe3514c996a2879049eb8d200bc3f508a98b4ef66cf982a25c75c112b557303d6ad9f9d36a2900cd6e42daa319e7f8cf865c2ad1ee322f299bfc79520ba136acc2b3fb2ac25b12215ab7a78959440ab380d1c5eb36a933a65b1f483931338dc7ee64f952349b8f7c86484dbc990b123f1361c2960124f54d7322b555785aead21706617fbcd18cc64aa88a492d079e420a54c8b875aedffb9a290beca13ff6afa746cfeeaae60364eb3007bd810cb85a2c27adde5bf24127832babb6130297c23c3051e9419bad63b865a85d5da6cf2690fd9f0239837587d475f14b245435382fc80f4025f170453b02e304b00fe6cdc2338c30c705ec8b70d3c01b8acda5da22becc1826c3fab624cc9ca0c698a9456c1e147314e2c1ca97109947aa444ece18ec1ecac7f5240c576c63005ab025a92a11246d434344cc492286723845f43a277701e9f5cc52fe0217f6a6d0d3bdfc616e6f4115462c193864a8377d7ec3c10c21d52999498916a0ed943c59018dea20b9a175f31ae044d73995bc18294ffb3c0883836b252f8d12551c3984beb39b96201e205cda989eb85056adf97d8fd0636f4c994244a56853fd9110e02c11402dcf8a8c349948b70fb13b82bcbadab8630be88e8a6e34f53585c42067e17b284a4a3c510ff580b55b4ca7fd1844d26bf39a8cf62757a777e19e448ffdadc222a40947ed39478a62ad6b068635b0d9571d9ad20dcf56d2e78a849c7d27ea93669080bb3997933a379fc8bc5d21e3ae0145f1b481565afe07618a4334a4257ab118a61ee396287d383b1e01ca043cb07a80b64ccc280dcab0a5c7165b1daaa7d6e08b7fd30a4d33e9be52065ad258e991a3cb691815c7312eb4526a59463f3ea366c88968b480224b3c53f6a83951b8f642e2c7a2f5c1c4791b2a36b141fc439c1b5718f0ff824f4c90afcd836316227bd0feebd96679cc4e47691c913704de086d574317341dbb1c7584574aa6e3718c6351d97158f34ee950e7af0a763c9fee921d78e80f71be6c84e9ff55515358dfae0d78bcffcb22857290d1a16451dbe02e354aef58d1b127fd9a8d9dd0693ac645e9912647609165faab60c2c04a25a4e2721906cc9ea1d899f8166f6b8668665133b0bbb92b28b556ddd8b5ccfd524b760eeed0fe5e4e1c557a09250ccc077d2a0173e1cb368f8c1e44932a283d9de8620f3a39bc9ff25a133fef066d728453ee3f2ec611ca43ddd3d20a4a2699dfd866d98a136364916ea51a6396134e1a1972e3da73925860e60384b3cfa8401fa05b5d6d32e801ba4bfcb31baac3dae82b44d1907756f04bf33ab33e2008da6f81cf888c7e24279b32d78fa44183e9db24b64dcc7746801767f2f07ce5aa70ef49fee052932c4f2df4451443614e0a28d2c034385f2e461361e1d7785bb5d4dbe4f3ded0dedebadf6eea338836454f94e477ef335f8954e6d9c9afe6eae9e3e1425e09b19700d3a2578d62c90a68d402ce0a63db0728be4f4efdb6ecba3e99ef399d3ca3db07d82229c32f874e929386d4d14228fd5c1df38725f3aed6a86bb4f85ca8b95eb2a80b49b3e32005fe46cb429453c28e934ea02e13255009e9b9cb258e658575f7c4db8b14b57d26e261779ce9e0e15d31c218d90a91e5796882978da2059ac6be2d4cd6beb74615c4992cb2c800b179abe072b9fa2f0a2bdbfca4f91ab4afa21154bf14d52123a6aa84b72af12ea55f8d8c2ddff7d562bf095237cb343c7c8af14542fac78272117e35a200e11bad5c823f53cd2712222fe958827ee26e3e168f0676c41f7f5975af61d104b6c1b1e9d482d8ff71836d4e2120e121f4b85fe50e5e67cc24734e5bc31c03fe95a9645f8461ee987ac2a8d9481cf932c94f4ea4dac33969ebc6515ecb814b5d3fa0d85d0f1ff7d14d1e3198e84bb7b2613f684b0beb4bb1ef28cc9cc0a78fb046ba22ed5da36ca2b8f40b995625b1eb73489b52b0cc4ff02ee3305450d3960b024850330333333333333333333332bf5d9f5ff3f467677da2b1714c4dea42d2e6bab29292929efbc119fce4c7c3a3371763a33f1a9e502bc0db10c300de4993d3b66dca18db9f3c763cb1e6e8cb1b54313a2b4f8480ef58c3af4a1195e24538a0e4d844c330d29c5f7b8b1c5165d94bdc08c3974a107527920eb4660861cfa54f9197fa13f5b380e9da46ee80b619345165fe4e8c246165ce02805cc80431f665b7dfc9ba9b17b2db4b8d1001830bab891851739f00d868b1b27e0a2040298e186196d2836941b5fe01a1ea9fad0e5870da5fc628b630898a1067d983ff65e9624a70d252e0dcc48c30c34dc5672de7272da2de1fc338e7c863ebfc8485e7d6f9c73b4808e8e2d72f80960c0e02f7ea830c30c4d4c21effeee5586c32a4c5e72caac4c84ec1c791dc62732b471531ee6dcf8a1400e1ccc18431f938f5298ac3e8717394a0c6de6b1645ef6d80b8bc3d055fcd039a135c41cb1196068f38670d173b27ca1f71fe7d26039b6b4564a30c30b7ee6940f438590195d682fc760ba51e6620617fa41ca78a2e5d1bfe35b6876a73ff9fbc8dcf3a285de426753a4c489967b169ae4c3092a968776610616faf1f6a0c75f2be5acff8c2b58a1ed8dde3cdf14c9e27acca842a7d9d593686a707c81811954b84dc2645a49f0d48ef8b1f328be5b450acf98421b3b7faed70c2974663d21d52a37230a5d5b300d3e3071b51efc83195068f3afa2a554d924ccd3451735e309cde6f1e8941a33060dab13faf08c605af99ad184de278f34c5893e3be1c78d2e30905bcc6042d39623346e442798b184fe53630fa30799b93fcc0c25743df8611e061fc778bd190a5e0130601814bc8d19499881045a420c09ef3457ef9295c8e2b33de58c233416234e8e29937c39c308892098518436ea6c9ecf93e75c248b391e640611fac921ef84c6986e0c0f418d10c2b785a498100955e161a9525a483947089dc6e5fea4a11384dea3e3cb0f5d0742d7e31f8fb58757cdf8413f112e75ffe0f378d82164c00c1fb4d7f93fa85e484879e08c1e34a6c942948f62f7300f9fc183deb2cec7399798d3a5147c0334063376d095871ee9faf83243076d903cc81f770ffb52f667e4a0ddc9efe5d99eb9736f6331478eede20b2f5280a3240166e0a08d10978d795655a3bf41276539b66ff451e967833ec6ee6407296bd084d01adbc00c1ab41f62caa3ca412cc4109d416e922c35562d3c7f907a941dbae91e7bcc9001c163cae31e77fb9811833643531ec41e3803065dabc7859c7e75a1450560c0a0818c57742186348b1779643df8e10ae52248aa5679892ef16c41f3f2ad28f220a53f65052fafa9261e19b32512a127e6c1ff7fb2f8cbaea2f7f453cda2dbe381c84b90a18ace3d851f896ea7f430aa1164a4a2fff5d7d817c939e7e1470a15bd868c1f8f524b4ed126f57099a289321d891afbc5873992828c52f471a387fbb043a6842429fa1fbcfe666464f33815c91845933eea8926b115459f963552d2b21e564fa1e8622e9f8cace4154e0305214c4cde237b9ba87c799745cc29248fc3fb89f62a8507cd9932c7bc77a185a6e0fcaf279a8a1bb2c73958dc103f9d68f72de35a4a319ce8c7aa9d477ec1b3892e269d8d39b645137d08d7921a2698892ec538eaea83903b268b897e68c17a4307fd126dae3ebd9c522739ff2dd1be848debb39a8c4a747d1983e48979a0b9e294e8071e76f3d8837e579027d1a6f65188d952f2f9b66448a291a0fe7aea9afa433222d1e7ec48968f5f2a5e8744932386e6f9b18f38e471089f0c47f499f372d4b69454414623ba90573c6590a870515d4106237a51e98146f404198b68b28f7d6284a82a152d3214d1be557acec36c520f6424a24dcdf13e1ee45110d1c71e8d33bf9643fe927188269cc7b628b1c721558e8dd285173d031986e892ae5c9fc5750c132d44573eeeefedc991c7116322c82044ab6132a6209a2967e8a103198368279f5ef0a148e6affe0319826882c88f327e84b46471414620bad41b3bc4f81423cb074417f6c352e7de8f1c3dfea0fb38a307522ef9a1cfbc1e4fe33c7de8c24f9888ce630f1f9f32f8d0a6aca99a83650f7d88cabe1d7d98e3f6ac87fe3377f8a8ca9463a27968dc63e83c085165aa7fe0a1c9ecfd338df5d968ef4095a76c98c5c504ebac9e2cad29e7cf9e3176e8c7a30c9195c7132ef9e485176e5532ead0e7b144c89e4f6354553a142955ee221d3db0949a99dbd51c9a9dd210b1ede38c495c810c39f4613af78c07dd246eda504ac1238b1468e1c5591cbae4c31e270bba5a0dde223e38f4910796c7a1a61d135b7e43afd521a775e47ccdd1871bba1851c742ba7c1815b2051641461b3acfd967dbc7a253f4b0a19d96d98c62e1357479374b8a1e0f1f65490ded59bc780e1f22b2e43474fa971b1accd66e8db0f126d1fbf1244e9a67e8073ecc931fcee73ce81433345f3dfe09efc30f21c36568aa62efa95929830cfda71c532fdbd37b6cb94012648ca1dd7709cbd0dd1b3131daa20bb018da7031558f724e334f1780041961e8da7ba0918359f68126b861b228411738485d2e60090c5d889d16cd1ef1a1a308c8a20632be4030bc40305c46170846c9e0422f2943e71c31b7d05ade949fe3fe30c60fe2e8828b10dc202390a1852e7c8f24a6f26743e974f159e0e882280bad2495f5ca1c42e38fe360c8c042ebafd32966f0d8ffc30b2f393e0b14bc0d1c32aed0fec5f89dcefd0389bec8c1376458a1cf98d33fcc4b933c791623f8f7c2880b1955e8c7039fd4d1de9cc20fe34f011b32a8d006d9e47945b232a6d0ee0f373a34453a0f7f1952d8442aabbbd5652daedc52f9b855b442a6146e808c28f49a628c563d8c669d452fb6b801034617373e20030a4dc843ef320913370fb24f68c75b93c590aa13ba947b7821da527f88c9e73095d18436bac7f171a2879527464ce8c79ff2f545795c749183013296d0fca9871c216ae4d8a291a18466f3877bbd276169538bf9f052d1be50cd630d7e1d4e13c84042e3e53d94d164fe19227140c611bac831cce5e1eaa5b4de3a20c3086dc68e2d1749f69384b0905184f6f3bcf3c87b182df3b7a1d4c58d2a1944f0808c210881602c0601021cc882023280d087a8d312fdff2d1394f1833e8e498ac1cafca73bf3412fd7c1abc73562e654918c1eb4593ee461b94e6ef4c40a3278d05f67e584fc16ffac2f6ee0c8001564eca0c939e441f04c8bf0232f02cf45042c204307fd8495d5eca13b40460ed00ab23e922f1f3270d0e6cf124163aef88a0b171790718326fdba25cf8f85c784a38b8e1174d18503b8b8d18504b4f02d6e94af61e38b1b19906183be2d59be98cd3d79141935e8733cd1494b3d64d0a0f9d48d49fd077199ba05c89841d312397207d3d8c35d860cfa61f93855c7097d5266b14517384e16385c0b2f39b40e2023065dca749d389987fdab910183469246bee666b55ed1754eb1473d8ca9dc58b9e241ac85f9ea375bd15e54cb1f264e2cf4381b4a599ce0b948a21183154da468a9c52d741cc9c6172e81b3f1857b7129f8a22ec62afacb2dcbef514b7f74b3c0d14516460b50c2f15c2c0462a8a2a853721a34b3c4d786928d2fbe702f52d106cb0d27665162f38f18a850a555c3d5323533b4c68e7a217bcc29c6297a59cdf7c91f95b2079ba2491263f22227374ad144bc84bb44f70c176d510948d174de11d953fd4b1aba1c45ef9a6566c4dbcde24414cd5e90c8b12a57debc5f28fab1567988d41f6aee71b604a0682dc227cb8aaa45175d3cb488f18956aa721e5e7accf8fce78b1c25c091458e1b4b39b4b8f1450930460c4fb4c17cf86e797fdcde3138de2805bb356274a289975943ca31a6c78ccfd730410c4eb4932cf77753ccc6d8443f3168b2f0d7a92cef369472bc8df2856f91c517386ee0f862717c91a3013134d18fbd3a3e5f8ecd204626ca54a13f69561913cd27550f173633a474390631907099d3b244cec1400c4b601262e63c2564593ccf10b2e6b158ce86d21638bae8d80247172746255a4f29467b8fbf18946853725dc9d450d5906343c968d1c5b949f4d3eef2a952c4cebc9144739ed28d041729f2088946d72f6aaae4a3b033c57844b3f363499d63d69c08b3c0d1459223f608a7a525d3316bf2229d2bbb2949fc888a036234a2bd9cc7f15a5273480933a293f824da96c445b4f3eff2133f1e0fd4b2188ae865e4c7c1fdfa44b4e1c1f3d0f3ad188868ff32f5c79c47213fce897188defb3bdc425cd4983d6218a2cf311f87ca9153886fb910a310adf7f8a71cf607ad394388e6a5b2a77a2092a3893106b146886dd51e2d394a4c227c2ac6a8c8611144633e575625d69fbb8c1188becb3c353b050bbb5500981003106d1ec58cf769afb7456d285d0e20c61f9acb238d4992246d2885808b2eb4c882c973e4b8f10517bec5a6e08b2f1e8717598214e0303ff412fc33b94c7a5ccea38b187de8db2b594b46d9101f14bc0250f036b2285fe428018e187c6822fb30460cc107395f47ca4184e38b1c3262eca18bd17f38b9aa43f450d2439b3f83f7f0726cfd2ce7a157f9897453cdf276f1d0749c6cc98490ccc7963bf4a1162f2e2489d14242f010c30ead4caf497b446c88518736c6cca38831b467b1c80e31e8d0e7a8dd96295c1cad340f31e6d06b8eee793c1fb1932463c8a1cb3b59e172cc71e85b56cad7e76218c480432b1ee72ac3cb37f4ad15c3f3074d3e7990186e88d1867e6306974d3ac5604397ded1f207965553ac5c20c61a76910d0b294a8aa9a3867d98e1531a74d2471a4eddd691a20fc4f2308b0662e4a16bc82f15dd190cbd93b345fdfedd6ec4304317a543f35fd87c39b465682567fa206a8846a72407629081609c1863882186e32246182e061832c61708460c2fb0ed3ad7a316dde97c8c2e6c0c2ef4c33c6e1fefcbba85feab72859cb1747b6cc5d0421b7da653fc9c943487488c2cf4839833fa25376360a13773b5fc493975fe1246845759777a96b5f724cd17344f471e870611dab914a67344b7d8fc10da183e745f1ec5f64508fdb8f443c96b82708ff238dce20608fda8f4bd75f31ff403df10be47267db9870f1a8f21ad19e51e341a647fa25559d496076d55858b21bc83877607fd70b424f3ab3ae8e78731437caa7288e6e0b17b1007fd4878cf72f930156fd00ff3669994b341134ef320f8846beb6135683a76ca460fa3415f1a9907e2a3f883aa66d0458fe9614ac64d9964d0be5ee7481a3931e8a4fd75f73d3460d044f7907ab822c1aa7f45a312d3a5390f26a3774597373f63850fcaaad28a5e43736a89492c536645df43cb90d0e3abf2b1ab6823a4cee3c16b5f0cae2a7af33cf498f44234d45434d9a4cf5b53543463ea2639e496d59ca21fc63cf40d1a63ce834dd1f5749a449fc8a295a2cd31ab9fece60f2a52f4ae2dc1346b48368a26f6f8630a9977244a51703ecec3d4978785a231fd18755403453fd097884cdde3f3eb13eaa7e69667e589564bf35b1ecdd97b5027faf9ce839424f49c682c68ec0c1f2fb50ff29b6852ea14348e47134d674c5939494e6f2713fd3863540dbfe6317230d19f0f7ca0123e588f7a5ca20dab9cae2be6f9614b741d4124c2f6285adc4ab4d72b290f27f7fd574389b6c735fb9e93683c6fcc987368cf2f1949f4a12cf65448a1f21a89a692c5e71f4790683f7f7a30d93fa2f14b0b3edd51e3f97044bbd957e61f9a3aa78d6824447ee79ca4ba938c68630689587d2ea2b796fd0cb296a7574413b23a44f671b61413d1b6f6407fcc73900a117d590e89107cd029040fd14c6cfc5888dcb9c719a2d5309d95391f04ab0ad1f6e97b0f733bb6480a219ad023c99cf71f44ab3ee8f7716e04d18ca4a7ba2610edf878f02611d1735f00d1b744e98f82666dff0f5d4653f1899618d4f54397bf792b5753d469fbd0fc591499d99910937c68fafcf27f58eea111e99c2ac4943c6ef4d05b52f751f0300f4d9e603999df030f5dce0e325ad91dfad4e87079742f58ecd0b677fcd0fd43d7aeead0ea7cf45054638520d1a11f27f1b390b59348e431872efb67ec870c392e72e8f35ac6c9799c38749ae37e8c0f873e2e63a6478a9c19f386f673c7ec4bebf1e047714313dfc7dd9eaa6288a50dfde5e1c7fe7198d4a31e6ce887a9cbc739ce8fc7837c0d4870f790c25c35742945a56572d48c6a1a3aa93cbc1cb1ec71553434f1fbb1eba398ccee0c6d6925e9209607b29ba1ad70f9dd178bed9297a194071543f5242743af791aade995b472c6d0f4205c4bf362e83cc7cd030de130fc174dac421e0c5dc410772e2558bae50b6dd4603dc8db3359f142932174d8d831c3eb423f0ee32f29ffc2755cb0935cdcdcdb16fa4ab71072222d341ffdc72959cf42fbdbc30bef1e6519c6421f218eac67afd00f3e7d363ce55e7eadd087d4e6299288f4305b85a672ac1031aefb28aa54e87b987d1c7f68de1b519e426ba93d957af458968ca85bc83cd61ec851e887af294f4e8142ab313e388bf2ebf1846666238428a147ad6227b4db39b2a7f838f936a18dd0b088314687ca84a6734a2e7d39f7bb25b419627d28d92ba10f1ad533f88f24341ad9c713f27820a16b8b15ddbda92ff72374962567488ab929c746688385b23c48791cb72a429332a977f54a845e2fc5c55e87d0ff78646c9a42e8877f21254d8fd6510c42ef39480f3be596b010087dfeefd89ddb1f343ed28f2e613e7ebdf541eb837016e27d2859def6a0d53c901c27b91fc15b1e346a12365244ef0ba9dd41933d8fcdf360e2b44b56079de78aaded9e1cb471b95324cd8cd90f0efa143f74ca909747961b341fafaa3d8faba4628326c7147a7c941937fe3568d4d444dd37970f7f1a34961a928fc79a19f4795839754c16379f0f19f029eca72adf1110832e5a7726b6a78c4147000cfadc98c7d395c797417e45d3a39c73881ace42885dd18612efe4315b7f485bd146fcf91f5b0fe32565459b5e19cc37c7f74aaea2cb0ad152dccafa8355f166674f6d256a2afaecd44d993c9e25a8a8e8e3ebe496cd9da21f072dcdead9cf3f33455b2199c5ffd9c921558ab6c7f1c5720f535287147d1e69c57d6f9fa0a151f423f7dcefabddf9212a8a3e85e50f7ff3389a7b42d1a4eaf1c6d3b9fc3e40d1e6b10f2662623ed1a96a86ffaf78a2b1ca1a82fa389e4a9de8c57d189521ce897e1895d5e2c53cc0265a8fb0fc1592a6a86f1e401359674e9ec69a8926a69cff5ddcc4443f8c1ce5f2a259a9949768b707167e98ffe31c4269893e7a94fac825598926429a8fb357977528d18fcaafda8384503193e8cdf5c3e36c048b8e24fa5c5393e463558d9848f426412c2b44ec9c030953f547f4e75f492ee5e188e647e6fb726f441f7c273b7c2ecd3f9611ad56b84ac676116d44866bb4b298c7ab229a8bb167447aec834f26a2f718b5f4871f7a2944b4d7c3aafccc8389d221faa0aaeb21730c1a4143f4d79163445cfc10b24274d12ae6b15cc89a3184e8d242464fbe3379140da2c9e3beac3ef2f15784a020dac89c872ed607a2d5787a1da90744d7c38aaf94bb967d983fb49b4bc4828fbd47f9871f3aebfcd10712a2eae4d187266689992a74e81eea7ce892e7c1464a6e5b08efa18d107de021bd6297ab87de238a04512f0f9df7d8b275e8a9a78787264ea5f6bcebc3fd90bb433fcea12b4ab4879c07393bf472fe8390faa943d399626ece9c8f244f87f6b2a7e333660e6d744c967a9057ca879143efae71da63260e7db290989e534ed1028766a7c743cde3cb5e567943efa32e897e3edcd04cec71547c8f36f41f3274cbe7a8717636b491fcfa62ea6b683fce3c8f0f2ce78a1a9a98bddfd52d42aa300d5d9e08edd7b0383d1a9a509ad24353676893e76c1295cc0c5d44fbf7fefaa490ac0c7dca31235bf46468aec7eb9fc2e857700c6d4c793177ece67156aacadfd3a99187a1ad189e93e3f287cc60e88267f7e8e1cfb9e70b4d482597de294cc578a1978990bfd076a1b1d8e6f35f72a18b9f5679f2cc2615b7d0873c1276472b3f885a68824b8c0f428a3c302d0b6da6d298c35a524e0c0bad7b06391dafd0e5b18432df942baeb242f3398478312e98a754a14f9adf7968a1e2674485c6aae25e4784b23ca92934e2573e48ef48a155f7d453d344a1b9aaaa1e8979bc9981423f0ef3b36cd9fce3f28426a374f3fc8fc7b93d9cd0f9986eb2ec37a195dd54d1fb2a87850966d2af9c1b675a4213acf544d5d452cea484f6474e23739c847eecbe123ac4102fac48687275a7083f134dd223343f9edd309af99a492334226f512d94f850c622f4593e8c32f151acce11a1d198ead2f312627934847e78255a1a52caea3112427f296b44c654223d8c82d08fe2c5f01f92229b4540e827964f9ec7d9ce887ed04fc8d0714244d510221ff43162acc8ef6e8a981eb453d69a3eea08eb161e743dfccdd6f561aa94efa04dfd8c1e3dff782bac833ee764aec187e6a0cd6399cc20597384240e1a994d4b11e2355abc4193af473187a4ac3c8e0dfa81995ff4711ea7e65783c6c256ee8bc192758c06bdfa7b26d54999728a1c60068dc4cb2fe5c3921eff64d07edc4992fd7d42c7500c5609d924cb58a4bcc57844b818791d3c000c9a1444e34535834548335ed1c4e423da7934e510d30c57b431e791142647ddff701066b4a2c99c27233f63ac68639ba7d21895c34b7c378719ab68c7abdd47d6f98751db3b55b4fae2c17a90c7e30803776598918ade53c976b6b8723d8e70062ada1ff7a7f6798e020b403281e1b8918517398e669ca2e99f2492d3bb3d9efc0c53343eb9ffb21d6531276d2871d1c58d10e0e8e29451717913d88ce3e7b5ac67993ca4e8ac627e609547e1a27d8ca28b882e9d3b655174117385f50fc9ba83188a3e0f22fd7b38bf3e12c90c50f4efc3f2c8e1c9f35fc886e227ba982bea06ed81a63c186d28edf9a204843cd1666bd888b1254472b6a18482b79145c971638beb44d39f1f3e9ec96761deea6fe0f8e238d184d823afced323c726f42421aa9ae82548141fb467990ff24cf47967cbaca3da4d42a830d18eca46d7fc937b947b1b4a5be4259acf9c7210cd1ec739b644a77929fa8ffa925c4e2bd168b56a4be6e1e524d352a25d97de50ef6912ada65fc68692166f82d74212bd7e6f76eccd8944af6d7172e7516c8c5021d16a2a951e662b89923eaa06331ed17fca8df124e26647cb0c47b431bfe5529c92e83b6f239a94b267f49c47290f66d365445f310477119d65a8186254284d51447331d67cf298c55922da4d4bd61fc7c7e3b2d6869215227a9318b3be1fa20b19736b86984f0acc30441f133475577954882ed62768c579ee5861423432ee61338c3306d165f9205695bb2341b49d5ab232738806a2e9ce153cb9868ffce2806846ae2bce45ba7fb8b1a1b47f687e3a2ee9841fc5ea87567f94ff6321f9038db1a194587de882f8a7f04389d93f846c3c60061fda1eaa556c7bfa3054b2c08c3db4f9071e3a5bc7a891670e3df4aedbc153ca439f2557f2d5bf3c527868e5633d3ce90156c30f7d92488b38653dee9cd4a0461ffa1ec48b91e38f42880df1a177f1943b3d7bf6d09b46e696ac46fcd0d703c1a8cb439361e3531e5ff290cd030f8d264db1b462aa718736c60f627e0c1fb9fec40ebd7e594e7dd12b63c6ebd07bbcc8b6bedc3292d2a1d1f738412405d1c9e71c9a799714f3f0545c352887aecfc763c9e3122e87e3d07e4c49520e99d58043ef7998f3a83f888ff228abf106627945d20863de32fa3e793c6f2ae1425250c30d6dd48de14731ddbf52be0dedfca44a79acc286cebf426fc8838ad8f0b186fe545366492fff3c8ed4d0a5a0314c1ed7b68e2c0dbd75fe1e87d4101a9ae8e3f1c8f22cf5ce4f6a9ca11fe4a69c07637933341a73aca8754c8aaa2943d3c3e891755c8ba59a42863e0f7fc5fd257736f918431742f42dc41e0f2d662786d6a57a781e3daa118626577f1ce4320fd62aa6c0d095441fcac493cd70fd7ea177fdcaefe33535cdaa179a983bc414c9936231d985ce3c95a674871c672572a1d1e01ade16ba0e65d9b9e2f9f8d7372d1ca1797e1b4a5b7481e310176a64a11f954e3eea8a8bba951a58281d418d2bf43d4ee143935732f95c0d2b74e2413f87b80c5f79bc0da52a50a1cf15b7747a3c8a096e7ce15a3c0e52408d2934315c5eae73eed1851621c8828b1b36beb87102292895f2674f8f2fb8781b394ae08546a1cdc3cf15b98759fa5225876b91c51737b4f022470d28f4a6955173b6bde57a1cfe4516378c7230036a3c218f8973f598cfe8c86ad6704293f7237f96b2b0f49e07359af0c0f2f978d03aa9c10456fccac73a85635063095d26dfd0e4b9a37a7bf0033594d06a1e06fdb1c5ce43c9e3615ed4484217932c65c903ff0b950712faedf3ead196a821fe52e308ad8be4efe0dea3889e6b18a11fb469af8ac569468aa951845e7db2f7602f2542975f2b7ae8336908ad8fa2a44e152620d41042a7ba19258f5765ccc7c9a046108cd1a2d3470d20349b7379c505dde8954950e307e703fd072a71f9935490a4cda0460fda2b530be55a3992935683075de64c795d57a9b4cc6aece01e8f3a35b4c7c3f86d0d1dfc9234f68f42b4e500c0418d1c100c10d4c001c110418d1bf49ae3b56488aa860dcee83c3186dceee11a35403eb3ad2575b4a4c5305b212507228e1a346852ce6535a4533566d0446e94674c1d242f5a5543065da8eb47069354d5884163b95cf3e67fcfac3faa6ac0a01f9c4f181fa7f88abec7e33c1f2f46ab5cd1ff26ed61caa09edaf3a86a45dfd5394987fe714e3e4c152b0846ada2ff3ccefaba29af52455be1253cf3c7e663c10d60918ade620e3d4815b395e62451d10f4d5223c628b13a45ab914b573e562509af4cd17718ed41fb50ae5234a712233c48b448d1c66b8f6496f4725cb21a451f159ebee1c3901f7f52145d4f2473331f4fc8f26c2865c145175c6491e30612910016a1e8c2f4c7789190935eb840d1a5d889d97b901e2d2cf589e6525a7c7eeca5d2c9137d284d4dea221a2c3ad1a7ff78de6cb53841301080c526da9cf3ec4e5b4cd2ce6ba235effdd4c3f9612c3d13cde49ce35b6964884862a28b3cea5197e887aafa4397f291230c5858a2ad8af810c587f2529d8c021695683dd77b50e52abb397b4fc08212fd657fca1d939f6364724ca28dfcf15c86eca3a853214bc04212bd87d3e81fe996559b58448260d8c002129d5c76158b47343f1e6fb657785a5f0c39a2299f8ebf90ff3dbcd81739b8588039018b46746a3995b945863dcd83117dd2aafe1049cef3302e3760b188beda47615db1cf73c85144e3aebf12152aee7b120c5824a2ef7168ccd0e8185b772209580e2c10d1fc58a264362bc2466f2b077d008b43b49f79f2305373a55585095818a2c952f17368cba36a61322b6051882e7df8c3d3c914bfb35302168468f527f307c193af6c1c8b41f4d996db3b2ac98758a46021882e758954e586df1eae21c02210ac5c49791ec7a00d252fb6288623025800a24dc1752426f541a7640c8b3f74c187172d7b1ef976af36943a2830030b3ff49e34f5459c0f66d5d3872e945b799494ff0af3a12d4bcb79bccb7c18357be87cb0e9c9079fe73f6b58e8a1ef0df9d1e362c5eb71b4f21e5584f1f8c1437b2691217bf0b9435b12dfa3dcb157d7b743177375c8f81c413675e8ac53dffc7f90e1163a3471ffdc5adb9f43db92838cfb2887ae071ef32487f678c8c7a10ba9345e2dc5cfacc2a1d30929eaf5702777ee0dfd78f507a32f1937f41edf53aefc6943177358e8fc96a2a49c0dcd451e48def1d6d0cf6f24d177d5d087e81745a27c186299865ee37fd4275a596434f41d32490f83a49ca1578d7ef1bd197a8d41c327cdf02b793ccad0fe30e5dfd6f8cc263fc8d04509b96326c7d0faf6f7284ecba5b61e62e8e3bff2436767ce7d18dab410fd6edeab3ec0d00f4abe336c5f68f224b724bf7aa1f19618d631ed42977b9875f2ce0fc6c3853ecc66b5f023cf1252be852efc454f99d7421b734c95bd67a10da137c7970f169a4e29ffd83573857e9459b1f1152b74d9cf245332d5f61e5568772d93e579d613990a7dcc4829e52f8915419e42fb39ce65ca399642a331c4982ac6ea91fa51286bea68a1d06f47ae68299532fbd827b4d5c9a2feec4e68323e7b8ae81ccde636a199543d1e058df181c730a189b9d8318618ebc31f4b682efa32564fc8e38b123ad5cbbd72b919b39b84366f9cf9302e8bcc486834d507b142798466347f0f25e58cd08730fd29372d42e7c3134bd6eef13fa444682555b4478f3384a63f4a36e737ad5411429b2e3eca1eeb41e8e3c743efdc83dcf413086dca17423b7bfca0ab24297522e5e3067dd04e1ee769cbe3128b1e74dd79f328f765d90a492c78d0c69afb404a3f54f488c50eda2c9743de4f259287412c74d07ff2a1c6cde3cc7d15c422077d0a6132a12a338428628183ae5f75520e221d13221637e863e771d4d6731fe48558d8a00f532999b7c7b338412c6ad0f56aa688184f72fe382c68d06aa5d298c1df227c1c1633683f8fcf84ce47997b58c8a0ff1e49a74c5aa6173d2c62d0ff9579e4f1e0e2e6e06101837ea0d7237d19add82147e3157a79c54a99774513b2129721668fe2c35ad19c9be98fb72caf6563459b4be533850ffd1e69abe8b425e484fca1f5455345a77fd903dfb54eb1b3543493347f7015527357868a360f3d79e5fe14ade9e4d148b9b354c614fdf82a05b9283f8cab94a21f0fff7c903799cef920451762aa3cf21fcee5eca368f592c70b9f2127cb258a368fdfe33ac4a168e385891fc2c741bf0545bb1e799c345e47cbe027da1d5595ce1e2b78559e6833ff67843c1e4fe74e279a16938e760b27fa903e1e9b687462b3e5612e4fba6ba2fd3c881fb6c548e837136d8ff72c49b6e8902826fa9887f97eb15da21f93ef9249cd358d2ca1a458d1737c4495687ef64d3be496898712bda867958f9f441fabc92544cc59e525d18e0fa6a2b545b93c3c128de4c1695fab90e0e387794423c9327c0ad66195734493c4737375d6882e4c7e3cf214f28fc5228ce82d2a5fd2333e4c882ca2bc31d379643ea6147159b757cc7c5bac4b948f4314b348f183e6fcd348445bb15223522b7c9bf4c881882ee73c0c3fceb1f12574ca0459d03844bb5be17358458ff8bfd33044af12ac528c0fd2284493871db36cc4c9cb3a1262a98c49ea2a313ed47d983c8b84dc203a7f751f589cf2718f652f04d146353d17f1813b031a81e8bf6214f9eca3915b06441b539cd54fda315b6268fca1ebb14569f8a1c9fe0a6d15610cd0e883fd653ec8c3f89c101f96e8a2651a2e677211dab2fdbb1a7feda1ddf649a1c7b1927dd043b378010d3d74298490d2d1be214d42230ffdfe5f84097af173a6d0c04313320f2ecc5aea8b8fbd43d743b328f914563545edd0ca57bc3c92507900da80461dfac1ec579c0c3f90ef1fa6021a74e863e80c319c06b50534e6d0c6ddc88cefba96176ae132a021873626232a7a237138a4448ec3a149954d7ac2e66f682ae7e1545c08e7517ab8a13fcbd69e7c43ca0b34dad0948711352bcb978f701968b0a1f314317bc5688ab75c9ca00b2e46c0c505d6d0e654c6e992fc289b8401e30b34d4d048b4d86f1a2b17371e99867ee35efe3cf80f1b68a0a1fde8fc89d1622c6945e30c5da4f0711a6668ceca3464cc5f84ae6894c1bed4c324d2993d8a1b19faf16052f2a6fe41e598c618cafd8ae142e87c7973540c74ccd1785e2987a15f2ff1f150b298ee8c607898f2206c5f6862ce9e16e72f1a5ec8c2558284387917ab8cc83a12a13b5a4a19c78720045d6841a30b6db42095f553b828c1b4a6c185f662f4b896e2523ec9a1b185260f437f86a67fac1efe5fdcc091012c1a5a6834e5b31e8fddfc3c3f34b2d0c94ef61f5eecf14e0ed2c0427b197ed4153c360f621e34aed06cfccd4a9ff56165c78692164ee4252041132b349949a264988b9734e4381a060cc7f134aad06f88f741385973d0a042bf9a72349d93025bfc170b2837780a5d1ef19042128df12a2c852ec6ad081f3e92dd1fa360562acb3e0ab9eb020d28b415662ee4e1861092e63ca1c9e3302a31583c9f3c39a18b1b36575e9cd068423f943811e6a7fb97e23498d04e8a8a33615296d0be8bf6b8c7573e4a9e8712da8ee4a3caff3709ed8795b7650fd240421f33e56657e71ca1594fe292324c8fe7c7838611faa17e1e7afeaaa88b844611f46a0349a51e2a85a6b37f48f13fe71cd52834925a9d07b1834253c94bdd626e4fe8b26b790e3dcd096d051fc55c91aea1c7a926f46d7a393787e8edd3c3000960422713993f98e57179c470b817095882254009a4810424210148e8cc62578fadfb2334df213dc843b33c8d1523f41f4d82fa50663be98f22f41173f9403fae76580f22b41ffa833816437bbc7c086df6287796f88385d00f437f242f5fcc130f4217215d64c73456b74068c3c6d0a312e10f9adfe06a9a2457124f25c0078da6ec5ecf20d907f904f4a0d1b09d1d524a7136260948000f6e79cf508f910f8f32d1d19d8b97276007cd89fe5e1411c95deaa0edb4082720077de748718bf3dbc12409c081f225b1cdd3632609b8411bd5a24e1e4ef20b2ebc3806368b04d8a0997cf1b2d43f6ad07ec88f9339c58bd12369d0e44c1a1632a9193479638e89c44e497d2440065d8cfbee99e2a6f4b02f400262b00980417b59f2c62415be19e2afe867db63cfe6e5f1e94e3a5cd16a8895c98c6945072bba14f9877a39ce8bcc5c70b1001cffc502ac70fc173756a1745c44c85958aa0a82918a36f7383fc53cfc0d93f40e54103a45a3b3d5e3e0c173c6cb98a253892c99c7a3928d1c2d05293899f1d08e08c1cac52579678f7dad62fe4e157bb145e918459387e13d7e1cb305785102f335cc63a143147df4089f3a2b1c8ae63375e58f87d90e502c57b21222c4b5e5b3ba2de590a9948e4f1034b4a4b25b4cbc5344130d791459397be23a3ad18fdf3dcf24bdd4ccd90e4e742eb9f9faa388fdef756ca209ef1f4b57440be7214d74b1531ec674c5ac310fca44532ee1962b723a30d14f674a9141423a2ed1552cffb1c95f6e75adc312d85109a644a33e8e71827c99b9c53b26d1c638f71fc7f7d121092eb332bec64b249a3edf9c51b39c8f2508893e8fa4ea4184eb518edd239a8ad9f90e472816223284f029a734e2b6b019c45d37bc57e860449f645436e58fb288f6e59244b98e16791852449b3d368b592cf4c71e27c23c231a3d687c88e87d52301f470a1662cce310ad8fe5c5f08f74186249162146533aaadaea28441357f26ef84a8d0b1d84e8bf35499c040b73791d44235231cc44134b592f7c8b0e4190836af0cc0c3a02d19b861c7bd49b7f30da7500c2dfad183ec8df8d2d6c011d7f6862b2854d1a52799b4714e8f003ade6b17af3c8f39c85165e7d6855a2435308313ecbb2a1d4c187be7df3b02b27e5ccc9d850da4353498257590a021d7a68a28f4392081aa1a7fd23a41c5f5ca0230f5db88a79f3a976c368d18502b85800183af07022e8b8439307df41677c907af7edb043aae1e41d815ba0a30efdc5f8717e1ea5a412f2a7810e3a3479663bbcf37f90bfcf41eb28b5f0ae90f2b0a83ae4d0eb07cd12db2373d01187de4fba42ec94c27788c3a1110d997dbcb27930f3e97843ff977c4a7a90871b9a0bd90761c28f363431e72cf9333ff5384736e829664eeb817bdbb186a6d5925e58e8b2b8af1afa1062cc9a7b6d1a3a4b294fd623cde361070d5dff2078c4ac69e6196d28d17b91020bd0b05170f8e72844c719bafcc97a63b26e862e737f342017d15186265a8f92254d1e9a3e19fa1f64cdb187691636043bc6d0a4f7c07db8b26e39f962e8b3e3e6b294380c6d59681e46969ffd41098656720e396bc5ffb0dac3e15b60c0141d5f60724c8a3fd898e2853e79fe1e7b0a295de8d27c9c6f3a3fb8d0bbfee6f8a8ad8e2d749de1a3f438f75a68c7f3b07ab3674cf1639e8e2c343d218f2aa4c8bd6e1d2cb49a7126aa73b0e30abdc975c894a1f3c8079f0e2bf4e32d314be75187a0514715dacdc3ec9bc7c9d341855642ccd5b7fc390f4c32854e65e265cf04ff09e28c0e2968da12abdaacdb3ca2feb807219355a1230a8de70f2ec262c9451737b0687440a175d56f9dd2d23a9ed0c7cddf7970917742a39327cf5bfe68429735499c096d941fff20f720fb0fa2b984de734f54743a177428a14f8d2b1d349847ec0e1a3a92501d48a88e23b43f1ecf985a5049d35887119a8ad3c95322551d45e807f1c2d8410482511d43e862db7d53fe4053b2a443087d8bae8b8fb3f372fa2074faf163a6731e6bf838107acbebf09bafb13e6a3b7ed0a6e5aebff5f0625faac307ad7affefaaab0f7c1855470f0846053a784030ae630707c3001d3a687fa0c17ab562ded8e9c8c176e0a08fabf0b1c7e3dca07daf583b6cd04e648dd1a1324c838e1a3493cb5c654b349e7f34e863e88f523bfc20adaa8a41c70c9a14bf72451e758c31aeea90419fd9dd21240db314f17b41470cfa4829afc7a3d8a5953425830e7208391ad5e3d3ea15bd54fa54a8ce962b9a0c953b62fba45b4130ae59a1bd8a3e6e8ab78f3355347172de2c316f2a9ae8db9d2a7b1854b46b16517e2ea768724e79620e3147e58f29bae4eea3ec156939f4a5e8f328345424f920c7755234922df88fa267fcde8ca20d33131b12b228da2cdef3eda90d4513325a87f29831a50614fd2845e89c9536b1f4139d4cd2d413fd4710cb6b9dec44b371c12f4508dd3efe38d14f94c7a7bcd907eada269a991e26fd81c6d0f89526da102ba54cb4ed3b133efebe36f581897ea815ad6619bdc4e358d94f2c57ac2dd1fc305ffee4a3aaa99a4af41e1e2e659f184a3412ad2a6c54b659c827d17cf48c893d5c25d1548e7796ffa1bb5422d17a4e1ab35eceae3996906855342333d4fa22648f68c22cc5ed4d39b97988239a900771738efa7ba11bd1f97b9447f1f16ee47cc788de3de494bb45f49ad1d54b357f8a68422ac6081263c8373d118d887ec2f730e6d4f9e3be5c097d083344a3a94a93a5457685e88711f3e31f868f940f65429c34a5947397c5d1027a107d568e9d9d83e786165e6c7123c7d268417465f9f354a72467f53c0e2f2a10040310486685988ba4ccfa0ffd78b89643e594733949e7078231a3fb607cd03d34175f6238f73cf4d09726d53c1a3d777968e42bbcf35c0f3c3467211776b2bc4333d19da12a78444c86b6433f50d99c9b3f55fe9d0938a1ebd068a4a5fe1cf121996e46873645550919d6a5bcb439108c9603c1f840c7a159b98c1edde3ec551f557068ba63f8b1cce787ec9caa37f439f90fc6426be586262c5dac6543889f9d6e430b9a0d48cebc5153b4920f1b9a38bef0e204bd8626ee6e0f2705bfce99b5a1a4136835b439624b4cd59adcaaef34746e9a7d5049def3f4601b4a758d8623454818ed8aedfa0c5a66e85b7dbcd2e999f78797a18da69b1df173122e2143e7d6799c3d3176584f72e831741929f428caa9a7c861b5187ab1183e906ac9612175189a4c1f7a7508f3c3f1c1346830f4e7215a9ed6940efa0bfda49493d5f787c5a0bdd05fb4e4275123e41cf71b7417da8a3f0cd9a2c6540fcee642bf3156669c28e73231ec2df496835a0a2b7ff10bb5d074e60d9f93cc5b48b8b2d0a4e41f4fece003078d853e5d2d84b4afd0eb7444ffe09ac7ed725be18bae425121a7d079a856f661c48de1352974413d8f62a2f4e8282019db26eb124b465b4ae3c984d8e3e32e14fa683976ce907a92f9b07e423b1763168d3ef40c0aed84d6e407ae791063f2fcc37051a19bd0c5249d27592797147272f0119a096d1eab8624ea5f96eea30abd048251ad844a02c16824b4e7c9cdd47d3caac8cf86521fa1bd10238464a78d40300cd045400f3411da5cf175c3b2c6241df510daebaf1c4f73fe4e08edf8e67c8b79738b7a10fa281db3eb7c99c6a40102317e4839f730078d08fd83ae278cea65c6e8f7af7dd08ba6581553644f08dd0382f1fd30c3624cfe17a122f40e9a14bad2abf2c51f6b793a68f2b0df0731798cef8b3a07478c9c766a866574569e0eebcad341a48180c6413ff471c5ea71a8a457961bb4391192e408a6577965166d832eb8770cb23e945c8d1001de3568350f53f3789c320dba8c109b3af6d433683abb5276cf83102aca32687b5773531e4c67bbde3168d3c7a3142b152c9c46dc30b857640d575c8d5674252313f3424e5434563411f444b32ab3ab8fd32f37b4a800020e021cc862023556d1887bf8fc406755f4daf2133eac52751953d165cfc9f323f9dd9d09154decdc890c9fd2f238728a3e4427dddd796b98a21f47bdd8156a94a24df15188a7d129faf4a4e8af32674c0f63378aa62c6cc4f0629128fa9dc9e38aa9f2a855525223149d9ae60d9e328496eca9018aaaf189fec73999daf7433a668a50c313fd305ea8dc3ed2f4709620d4e8843d71f3fe487fe4106a70a2b31cfb073129ab97793536d1a5661e66644cd30c174df429785c0f4dd19bf378d8505a15d4c844ef9da7626cf8780d95440ad4c0449f2b43851c2634a42f16851a97e8c5871b2e764449ce590d4b343e5cf7b1fa40427fcca346259afc912b16728e3fca6329c0821a949844db95962237e53524415c66e40cf334d5f42e6d93d850ca5123126d7ccb5493cb034dd58044c140408d47f4df4942f8f1f83afe28c7115d8815d63fbc55f4f0d188a652e6ac216ffe4146cb887e643fd74b32e73d71119d959cfb6b4ca9abfda08622ba1cf529718d5e8d4474faf11183471e5b8806115d7eb89ef6e487684386d415325fcae3880dd1890fbf4bab730e3a930dd428441fd693c7727e12a2ddeda4fbdb6795e9a3c62008b12d225646c4889c8f53c4fa47d211441336ffc7193c858dec03d1c65a9c0aada496b7044493b73aaa6ecad987963fb41392c54ae1e3f9300f8e8ba8e4ede582e260341608452291200a0264db23006313000000082011c642c17830ce034db20f1480036428182e2c1e1e261c14141a22128ec5c16020140885c26030180c080502a160402817879e030b1037b6e48be0ce6d73488260adcabdb49b51d583be578f22ea0a1b8697e7c6dbdd0c7097479b740b7d3b3ca8b466e0adee47606b8ba16a9cc44eb0212dc793a021b32e1e6103e210d0a2b24824bbd74c7de12858a2c21ecdc1428e4bab60cb14d54d13b5aecad9863f580a93e21db0e5b81b8b6d3fddae0d17962ce75fc2f3f7911dfdb5a52e4c79f52d12e3a6ee5706ba66d82fd6eac145cff9681a6fabfd6fc169abc513a9c6208bf93dfe062a374eb3aaf22fece08cb52002bce4eafcdbadf7ce30ea6ec5bb7d6754e32626f7dcc01ce3bf09ffcd7e08d79401eb8f1dd4645a3c09614286c945d9a7a4cfd43cd6676b61ba3af71d7d2f01b54ab292d2055bdaab5580e697f63273c62a1d628220b9e71b18e2f40f32abb5f232dc7ba3022f03971446a6c6f9983d57ce2b0d4d6056e90e4f75fc883279a402d366eda44db2b56fc7d85a2fbc4ecfac05ede00f8975729ad11ef6e0beb8c785c292632ea7c3de939a66feca1e3f1045a32416b8d046990d2563d2dae6e5751f066b21a6216dcc83226b58859075c93461559210883e50601a6e8cbcd699c48a1016b26a4dd945fa5c1bd0dba8d7fd74b29fbcf45dcce911a5e42d3233d3caeebe81f119ae75d350cd8a36d60a12eb85abd4681f1db75ead32d3ddd05ed72dcac806a87474ab75e9cdb9869b9614eba5801031edc419a72ba00f523812df9cde422e06592bcb8406a8b1ee0a253171a75a94fc6aead0c6621bb8ce348706492172fde3b6093d07a7ef56e3030c349b36201ca65e4de5e2dd58b9d8c058d9121d7130d06ec3eeabc61a54ad708794d482e6d1d5d5ee7a5be406bfbf2c5d5bb0ae5c27b8e817386253e8562d7be80cdea8a224f023d0d89554a7940fed6c073d50ed8caa03bcb85e7b160c6efc42449dd76ee23ae31676a808bd704ac2325c1d1f64f6c64a1b5f1152240cbd809c027d14ed8cad50e0aeccac079bd8f8e6280e4d3c1d75013d0f1d5958695750f758950c37fb9297284e5a47cdc770c3f82f3aa2f6d5656351e808f7f4418ba50266932dc582cc9334f19db1c47af364517b55f3a6e697c8112cc079b8c3a31e6bf93420594428d682cfb15c57993b1012258b775a39de5a2b3d5ecbb81ba7c3d0e5c7a9de59cb6c1719cccca8980f4b301e02da3792d94fc3da57ace7254812dfb1f68a032b8431c75626f405d4cb56a7a53419da52232c1e38f2eb966f57c2fac15c344c25aa7693ab5e87f1c352ea1f43257bb9aa3d8ea29a0438557eef640b36e10eb66c38dd44b5260f4d198fb60f67e1979f0e8caa7134569286dd3dadf1add8a9fd3601502a8e588b692f893896f83154e452f44a75e6e290d9de4966bfe72559ef34d78b92df7639a9e35ee3d82989d1290a879e971feee53ebe78dcf8bd3d95dec0d55f406d583274f7f195c4a04c0f55ffdf1d53f89ebf94ef0b92c62541a20c3d95fb931eaec2a07be4ef811a51707fb7ad463f49e4e8d5fc838b12e0bc0d07df2bc8beb7ca29649ba499f8d95f943e39c87bec5851514609a10c5b9744d3e5d96608147108d6639ae3668497d33508707b0014cf07006e4c49069b8885676636d089c9dcf3312b506ec64e99e4c2039e9fe542f09436ba0ec13115feff55a08dc50321826425718933994699ecfb0ea9ca91768f02534133e561a123f86364577d75023a9d32daed1216424c46de11f85fdab64aef0afd8fa8a13157f3e2d03c7f8fd7249f2fbd2be8e2eb0aba7f128f707e92b79311d22823d4ac04e4218b15b89e7771fc808a78d84dc6082a418fc084574770b20d8a61502f53b111e023b81459d59b9db5f450240efa35a6f72c5b5115b976968be9ce8fb12795654d2e07d124921fca0560c3268c2fd34023a8abdddf8318b4b1310a32b0b96c9bbe188633e81711f7adb862f6ac814efa2f85e3c8dbb2feb6c88db17cdaed87a85344b337fad3a35e9ef85131dc8942788126c5aca7b3b3efaba46ebdefec77ff71fdd974711ac20da0e73f471e0acded98d6eea44997533a0d86d2fa85ff26c2e4e54bc60e555eadabaabe29da28db0a2c8ac037176dcc2581bfd64138bf09516a8ec16284da8ace7488b16e23021ba393e1e46aec26e9a2dffe75aac773107681f1a03f97059e212ef9d14f61f86358e0c7a8f1fef630deb0211c7783079ee3f281e0255db9aa29d6d5f4a9b11e4d00fec1dcf3b5bf0085dc9aad79ec623e48fba5c5b7cdb85b9d42446eba2ef5e9459b486a00e86998ad3ba012d88b15e878ae7fc5cd8d098e2a33720dbf3d63458c2f8d3623375ed037f8d0f640f0d895832b55f4af461a4bfbd5066a6d084c997a2f3f55c9a9378163bd077de62c81c348ed6c3c270e4e53e064d840b9fdadbc811462f0826f423a7d80a153224220430f22e45f08f1f11643d614002d66a302dff82b55a421c7fb5603a0539ecb112d5ae8262844e29d5e7e1e5810cf2e8f77540e2aef70473b6e84fa341421aab5ab5cf7cf7b1a6e346664328058fe0658f2e6fb9357133350fd16018b986811b09e3166aba801306da0e637e8713f38c1374a65fd175ce590e18978dd50a1c0386351209b55181e6c733a11f25128744ac345fb533e1943f5919ecd446eaf06731d9ddb49eea6e8f62e8de6fb0d466de321a5dcf5015f3db2050ed2240c00e09bf0fffe91f9aabfce30616630295a4f9313d9686e1deaa7641a0244809a88fc4558e5fb9ff5f0d6d5a0bfbaa214b1270689f6a2e1c7a8b948c99c108134da751c6120a718ed5af1cae6a73f44117460d8a52866988736f6119e8c14705c20180254b0292b931e10c8b845662955b530127da84f90496791934e091cdab8fc42a7a1a496d6cdcabb01fb58867b5588847bf8ab5d827add804af31774690ae3583e9808466f303b5d1fd56531faa877ea62b9059bd05892a6cc836451c0e20cd4d89911ed5b57c2172427677a4a681e28a0c9f32e51d2694f8bff4f88ab793e02e3ce389f1143582c1d1dc902357ee6eb68dd518908445d2b6e2cd3397cbe2247aeba2319ec10ff4e469e6104701c738fef66c2b85b52b6f6393a168913657bba782cbfe44fece0889c8f04c3120d1e1922471390428863d4a242861ec7d528e27013654f08dd8a9d86e312224962eeff7d0e98bd4205fc2be8207df760985a90e8f5b68cab42075c7333c434261d8356a03fe2b56d432de02c00f70de20acbf733f062db4e271905ac770f1f91e9374a982ed8077046e1555ae1ba8b2b54fc86a81c5cd4e400ac7c56bf51b464d8efe03384e8653b3c7389d917299db9da2aa13e141a291f03441d45e015ae29c06dc3d7760c4e2c980431e074c1674f4eae9a4b5dde891461f9316b293f0fe3d14e9063e48b999552e7db50a14068632bbcb44a42f0f1ba1fd10c8f0a5486abeb0edd89b4c340e7d307bc4ec30549cb3ddc547568fc9f322219253b3103761ecb2b7b148783dd5d3e152921bbba7068b197776e011706f35d4d7b5f76f01d83741e2ce4a2eff3284cefcba17e69f477782d4c9c600cab23baa25e689125bde62b9b2aa59769ddbe052eb7c3bba9459c6e4c005c1f60bece58e1e66a53319d669c02b78550b098ad8d44537d2c41e33cb94090c9d8c388cdae11c7e78759aa8ec26c65db827bb07d1f8b8ac8a8609fbbbae89e81427d2b18314b55bd29a7f0fb2acf0a027d362fc561904e35d75e7b81a4555c9c1971a1178107e44584703de0fa6f54b0bd7ab1a1e98274c4cd2246ee7fff761b703f343874abea9b65aaa43712eaeffb52f3409dc57d1ed14c36c8c45b83ae8c7aa917d7e640f44737559a72b6a12d0b6009d46568746e6b899690fd1b801017a8817c8babbb5991c3d2343a0c5838b25b65e7c939647016b44d9d7ddd3c027db6fe0e01884925921687ac095e7d84271af21787985e92db3e68d8a366bd8aed5cfbd778a8ae1b01324aa13a5a7361396684cbbf123cd81cf3bc31ac68a8bd6f8ee8a4b0f7347ca2e5344095ecf2a4fa1dc4cd7e4e8ae5c778ef88fa82729fe9ec755895692893cf4e4600baa8d9dd1cc5f1cefc01abb458c7554e08d016203b65cb2555002efad6ac09d1beadddc3fa31291f3df0504f1aa2c8059ed16a3622a2fb66be4cc5fa922389992c603bfdec9828221d4421a49dc447e6f87c54bb85bd6239c13405ce6cd2ebfb1c6809251f540cd92e836a550fa6fa2a3e85db4b97b83ad1214c7fe4363785a9d2ca441f90e1ea9d6e3b8228eda981e7470a901701d04b0d54d6b2369125df2a9252dfcfe555b36de151d3df45b236462690ee064738645761753112bb3e8cb6edbe4887242d30bd371efe06a2485be243323c4c77bb6da4778c3b53dbffd7deabb6de2a8c324af6a42f172465005d244916de8e50d623bd5108cf630949b1ffb0a0394e3197bbc6b5b597610f145bcf233e6abd47254abaa909eb25b673e5c62e9c1412569fbeba5a43347482d12c533550f6ec660864ce335143fd16c2e41dcdde310bc815628eef1735130b0630190371c5f1c2ecf4e264dc73f3ebef37fdcee38ec1e2c07f3eecc9ad3fc5a236ecde30f39c590c63a1f604478ec793779748638e9e4b39bf548c0a6d8ed89d08e4925abe8a220882af489bff79a5056fc3799cc31a6e17f8f006b2ead89afb2aea9adab8e9d296dbd0757ce82bbd1fe7d739d7a27d3621922ffdf167563af5b2b4378bfa94941102ea16433fd28173c380021890726e000e7ae369222a45e5d7bc9dfe4d7c02946b0bd6dec3c3cfe70926bcd0d6261fa33b8f1b94c6ac0fa0d7fa4c58355f14495795f6f0a887955d0b6c44dda6286d46e30651cc993550d442a835aac769e29c105ecd3bcf182017e7e254c226dcae177a81f8612b21dad85e1740a5c5a1d9895f7b3ee0d084d6376bf0714f7d53abc79797072f6b8f9af80e0a2460c9aa3a400d9c753e0495212151cec26f9a96a0f61448b6ed02d064dbe7025d988c05628c810234b43b15c68ac21b78b00b005f8d5e0a76873115662e9064ed01349d6bca101c271ffa1a4fd90c33d03e3a894a00f177c53586050cc1d9901cf0f18c1d912ff636991bf2411579b2db741d039569e88041622d2e4f9d134518394ccd60065b0d1482b7d3d58ef4df23293eedb0355e3be225d6b827d45b85f4140f5578cacd8a027a95b1176a1830cfd4afe09b91057c6b6865e2e96935a387bb636f74b564f7898cc45b17bc9563be2dd606541312e748086023236902819fe595c53811e367cbe1714d6cbcc077d6c1cb3b543cd701f9dab40b43c68df43d710c51e54158be1de74751df94e78985d430866dc8484630a305a0930ca665bf7fa13c13e57572c4f2b7df791000196e918c78ef051a623604ca2f040ca879f902f7938af7260c9668a290328d7db8abccf92bad46503fdc85fdba7571d3f0b99d3996fa9f12a86118787e26c421be23a1906b6850d18c2d3ab9f608050a4ac501c5754ab81d22097d8cda38a5b44dcb1c587e1d95a53b40f5a9a36b3d8b143eec539f3087a38458112482aae80e9d0abb5aeb4723b6a9140240d0563d669156603cb08ef4a4e0f5eb85c8586f7725422dcf9350ce03bc2a8fb982bd4abf529c80369b22c1c23c620580860723bfec6e70d0729b2fac52390ccea3b1367ee606b5f1f183dc44cdacd0f58f1f8294c158695c8d68d8d1e47229328c9103f173848110ed2b10238be21636588dd63d099059d99e987cdecb5701de91d864df314059610d2ffd8148a7944fd1379ba460d6e10d1116e7e590ea6226e07407e7e6d70a31eaa5e4924e9cffc1f7a2282745044ffcd44e842ec5b6c16a0b7e1bdb60ef28f9e1ea134255ca5658d19fa200067bfbbb5ca7aa50b61011bd5fa1295bf438e5622a68ab584e374eb6901db4b642af30ca89cb4d8fd82a69a3b7c87948c98f05656c1a374d5c2a351dcbbe22303e27fd7739521a80769e9723bacee89f3382e7eb0e116295e77ec7524032af90f60407ddf1199541297a80d4ab0378144f27f6711e445e0999a9bdfdbd0e87af58d242d62615ed04f684f7c5e667a8141cb703863566205bdafdc0b200a6af4958048825bb10c7004df46c35b665762f52be51d71b337df6c484b767cd36736733716a44c4e13b495b8157a74d3bb15eca6c40925ce9b10fb44ad49eff96fa268d254e4f01da62e678142d4af0b1c1120c409ec12bb1a059aac662a21ece0871a96913a1695f1c5e859ae6a600078fbe14bdbf5ebbdad431b2706a9f14c44e94619ae6a0970e3fde5802a8bc66d30de7e7c6003ebd44d289c540b64b4eb821c7ab00d07acd8de26e324a1cba3fb3f4552c7124f100c8d5580add11c51a45961005bfc0f1ca33fb1fc845023570b7afb79c02943a3f64b573d0e00507f079ce55b8f689d31f222c65223c13f7ab5698e8e0589e836f3d5e4bf26760fc6633c22683025b0e901d066b295ef0a750557f6b0fbdb3d381d981759846af186c73dcec9c6204448550da3b745b5e5521c103cd6ee37604fa142503260b729672ab03463fc9d815dddac6a7288877893a7a71a63ab5769625ccaaa9eeb8c80d3bf0608d8754fad64d5b680e44138d52075135076186beb24fd7b1ae503399ae39217fc68cd95be7aa26c954bd9ba1fa337f5adbd2234a16bef1dfa81ab36d24d2b5d7314751b8da6f5879c3098dbc7b5015ae4cc1d598c88a2614ded42316f0dc4d3e531b46410d6d0fae2b6a138f19a776cecbedcd046a935bc2f062a9a73584a4a9fa2084a40b602d60020904a7ac5d09fb12421fcadf5e6ecc1217c9458529637069115e8a746d5d3a620f71a628ebefa8900d6b94c7cc9c77d02088ca8831e17bb0c27e8ec7027d3618b278f5e147d0617430c02acdc49e8a7946a1c6032a7406dbf2ccb0f5804e6fac99c2a4a5a8a3275f560e2a6d7edf43c9542a9c65376d4f891cf1f7d0c47ddccc385be58e9de333fc50a475b7b1bfb2e85ae49a3ce39bb13c91112210d1b7bbe98c72cb29a657d58066a3b6512acd75102f7d4d69a33b70f57f11c1351ce44fe9e88a34e76691051e7217e13553b5e017011739b54233fe34c794c66b608b7b0e4ef4f48dd5609bd2219af2e73b9483318d0de94011b6e4b70731313a418c694650c46cd4fa3e78073ab9d9c7e92c3b4c0b6199a19f1ffece27ec881bb12ac614f79654dbc6f7712f495e49f9b6e73e80d7f102f8223ba844a366802932773c896455dc1cf61b6fd67d4d718770a6f0168248968b141d5283bb30a0d21f2098823b18cf746b9130aa1301871e23db9d18ee412ce400861b3dbf7d0003a40b85e3f118be0b8523f29c60e4452414a00f0b68c30ba1e883104a83690917b043ea3a829715a510c9a7b11d7dae457226f7f864e464b518ef94fcdb2b86b3d0af8192321fadedd42b3927219312dd5246924c4726c0ac0618d8d20b663b08fb3809c7ba70aa60381bab4053b2a439ca7ae171efb2ca59a18cdf1fe6146428842d69587d952c6d44490752868b81d4e5723a445bc426e82038ef913e03a03982d80464c6d212448208036ed3490e051b00eb6653507e1951ba01837cd889405818ce19114716bdd1b154ffe268f86dc66dd4500c9fa5315e95b0259f8f1f8a8465ae30ecf464ce6a66c4e89d6d8f973e25f86ca94a529d183a8dc422343b21ccbfa118de62304748048c2a1b28ef35de7270a663462fcdb8cf1ce81095e74ae3786d21de2384acbb13d48911b7d898651afe9c11fa8607e8e1f44daeaf1e2b65f74625e1c52418208931a93f8266fa412a22243158b4eb04951c6d0cb0f06c824d4ea6d2765ed854a706781f5808c016ac7f14b2cba7d2c61f8010562850e8797ae42050df9a431a236522edec09ea7215d4c2b6f9418c4b61b2f5405dd48ff30da1fd633539a7c27cb855c36d52ff3f09d9e8e2f8c8b253d852413ddcc9ebe957dafcaadc6f860e7a45db78966701bc499d1e0581ea4e255874ef6b0b4bc4603cd64e3f7fbaaec09ecdae82d2182b787fe4ce164b0eb8a9a267256962328b3c14ff732d60083b10ec894da114ee90574149358496a84fd62e0fd46b5b6c99eacda53e14171a700573363d4f61ffff70041b0a407df94d3f3d3526b0644b22fdee123b64499ba580038e60b30e6f0348b214e0f26663487bc4aca27ca39aa16a2ffd560e648bad1674f87927f8fc1c7fb996908fcf93513e23a4cd274bfc6e82fa4bc9e341483f9899970f03c8ebf6d60f86c3ab8c00aaf14cc863a36c2004a237339d81fd23d1c23aceff8583090d15f5cc0ca05b2c2823dfeaa555ae93a60cebeb46fe2babd00cf46450a4bc8522c33539a841441b10e1f0541e4303c38c68438cb78dbf3f4ac159a3e504a3503747942a2fc0591332d4886d34e092bbfc00bc01f0382838a93f87e6c211ad3e50c9ad37d0b187c1f80efef1efb7c3bb58dab89d557beb3c5f6374aa17f77574ae3ee1acfbd41758827289b9fd14c6bea534923a33563d53a64aae67d60718784b30c8ff53c693a974bdb1a3049dd28703ab2a5046a4f2d10bc74086f536a213af47f021f822fea8377ffd0e5b84f7a6e9958cc17c6eef032e42cca0927f4f1386fd73603d3d3b201797a70ca48890b795721fbd06c7f4f53a1c816be0060ec23183d1bfbb10a087fd4562512da21dd32f8153d253e8555ab948f9497d83e860bec8ae1ccda7c35d94459afcdaf8924a22fa328a37dfd9237bb057ef8d195e0bdba42bc0e0b44150f8a5b267cf98b4ed43bd40c7b4b9c9c37904e976fc4907a980fdc6dfc8749e3ee8836d652ac55973438beb945e1c0683dabed6afc3be87d023da4827e983be625f24bdec2268de82888afd068e1ad953ea0033dfa46af51d0808a5304ed9edf98c0d451595892ad46efad71abb46c1193b21f7e4b8dc95c36badbab9dfadf4fd3bee47dc1ae3d28a98090db8e1eb894ca1df15ea4141a5bd2988eacfecd1307c34f14e8d9d52bf4290ca3ac57a4ac65408081b26e622ce604d82e1ddc55ab55b10b894bc60d7f5791b25f5a23b680fde516addab9ac953458e953211412e581354fc88c9486b3645c442543a96f7d1ed56c09f3defc7dd380e95284b26409ea240ed74589787254801c7bf53e696b3565af38f7740228c488988c0a9b250ab1b1ee21a3b30ab1b7d27ea0b758bac4612bbd60f96293877de5f55224a4c8ee1e85d7fc7cf30c7485b1b4cf38a08a41dbcadd2fe5ea8036d8cb2b2e12daec69fa804c1a30a8c2fc27b2c8512166754bca00369a13b45f946dddd0c6face7b1892bf4b05d998bcea3271a3f6a7d9b2bee0510219c2c311d5e2b8c8a1f348c74bf6587975371a61c8d552ff2e8d360fa2987254b792ca9d5cecb713120d849a21c16e392bd0c21a4f4c08566a878f484621b8cc6d17ec08ff9b15fe78775f64121dc45308f956111e6a148c31867fbe908c1220f0a5ae3ccedc9b051a15114a5f19d2b6a4a4b6d037d6f11f7ce5ad8f53143fba80ef7c7a4463b9b367947c55ef8bcfb2c5238b4374ee95b8515acfbe8748ced040dbba4d551729cad621431150b8d3d54b69919467b63dc753b9ec123780164666824b503a966af936d5b50299db6b1f9aafb1057fb5f7f7aafdfc3ef8b38c8dfdaec2e46b867439b15adbbe6e8348b22253f0e87e02ab80507308cd4971009819051a9c2725c0ec955c95addbf93299f66c7dcb012dbd5db14774ebe60d848a2b63b38f4e525152bd10f10298c65673719ead496fa38b5f574040ac26b39e2459b5bd8c488b4512856ea03c7060192892e640fe31d2d6683a200a6dd89e6c7d5ef4138ad14b6635d8fd98355f8825d577d003812daac82b2b91c793e96f8327b0b1f6656af8a1836a9abe94d59bf9ab508fa846375760f3ef3bcb29b07bc7738b3e727b77cba76fd661df933d1f7ee4025bdf81775c0870dc76c79914533c50ff6b7b6fbe14ab9ebc5f6ae8609315cfb9389b0fa1a8b74eba2a622ac404bcf13c9bb04194c8282352e697343639ee489ff8be9f7fe8cd9d652350130bb7190b294d6664c24e1b23e61e3ae6c66e2e29a8ee1bc285396877db81db26aa6ce3ff98f8a73f48b1916987164bfdcd74527b1a0d49f2b4c83473a7b0b0a17065b227dbff2cf15368bf60ac19903dacc3c4e6ff9aa37d8949917da52e06c7876e90697ac32aecca12d23d81b9e3d8c9ec456e28d710be0d722da19ed4dc5e626c8cc7924b6fbe4530e47be3061c03413f29d97d1da787a2e46744a9260b22eba2ca8705109d092e6e2ea37635d5fee3cc82be0712260c4454401f0f70422b6f7be1dd19fcfe577d6f1735a76c84b9b5333e575b9013aa3829fe99246def1896858b2e68c6e4355c35c8a29f1eee6c8bc4d21c6aea7c41a3c622d8334024484da409a853fbec062080672bb8207f2bd517c584db9394306453edf08fd7beaf013d14f6fd042ae562a96fe121fa5f6878cf39fc705289ce5a5dd10e9dd0d2380e6caca100a9fc144e843f80ad8bb809969851c15d18f66308e89d51860afa7037d7a09db8f9abcaa85f2d9a51f2f2fa17adc279a9bd92e7f08a502da74e1d653539ebaa97e815d249e30e718de77697400513832d7d536f316a4f545e1d79cb91fb26c0ad84230bd84dfaa06415fa7a184eaae1210fe2e47cfebeb2688287b1e864e1d7cda8af9ce7c23bc04e1f3963c4c35cab9a6ee51b366dd4cc10f9641fcc561504675db5a4aa857f4862803ced220c5f84d9c554a6a46c7c4481b5a1d244efe50ab5936ad46125a8195623aa2e0b66fb9425c260a921cd529606ca3941b083d9aee153af8978eef0f5807c246e0432bc30abd3f85725918d2bb26114f0c6f1f648d8e0c4516c5778a506e941d36491820563ba916da81739c4935680cc881c786619aad80884723f6621f12d6b81e2ff559c6333614ec1fff31d7139547a638f1c933649cfa487a4800e467b4033e17ec577bba2220f8f172677cf440798a4effd296b432d8d407fa63a12e7aa98104c0137a4540de06ed3b4badc90c332168a25b15691bb4c53e3e7b44e03fb8785f3230525cd12ae1daa5484d8c5527343494f760a6339e35dac308c389622a88b02ef7e49c8782464c49920f52f502cf172f3fd632a4b5c9882006058c28f10e1597a50a5b3869bc6236479009c6e63e627934008d2ad5c3202d6567f00a6ae5a8518e013d2d68b6325fd4df319f9760f9c551d02dd3aa4e549e54b25fc471a2a6585d212fcbbc5008ec88ed997971f2a63834ff6e6efe6d0d1dfdd3302992e8e0faee851bf7ad70ff7cbdfce7669824b0f8930474f3795a9543fcdc544d181e723477b7a4e6df09c2c452f16b1f9d0d37519cb0b5dc28e4c6dd274836264b8834357e99d3a75ae659536d28f8db6f9ee9a21562c65a2798e5fdbe25d1837b88938498329725df2fe12c6994d629cd4eb376e7c9ca154081f061e643990fd6a9c66574b5afed2f95995280efd04528bc1814bbd865057950d7a6e9108280160c4fec9a2d0436aa894d517e16e96ade17fca6566f34c08fb69401e8f1cc106749d309c67231c92579f3ea327e8466e3e86ad7580f974d92c04a26de96b201684b4a37f419bd5826dd4eac4b4b12cb336a1db2741e526799015c79539f61f319df156f9523b29abb2c25d5d5cb3e18990b8e34c0d3762df0e732e99557c653ef5b4e591b294abbb6db6a7d8ca125d9da5d3037da03728499f9f7ab44ce22f63d33ce7aca4dec03ffde41fb64efc4cf63d6293deeb4e87b197da80e0346a8b33bc3005c95b819e497717c65177787977ebcdde6ae9edfd19284ce5fe1a5ac619a21ca773dd5206cf1153bd4891bf24b7e86c3ffaea879773d407edd607b21b09969a88a8efc6728d84000501389a2048f3cd73e7e0103d03702e1bed84fe9e00c49c3a10e73a4fabeeed09d1348007111a2c79638b08d500e96c26698894612eab4848d2e686d6f18e021ad54d43339a2890ed4a7007a55d233ced210dd1e6e49849a8ba6cc80cac3c98a8427ddaee8efdb0e4733dc7bd44c97981d152772cca5add7fda05b2bf7f8008fdfebc0d45d1ef69b22c506b085db4cb3c780a15ee679602269ee6dfc1f70949cce717f0207f3626649b6bf22e66e2cd7801378411b6ae30cb66a182d3eacca3740f429d6c228f6431e691f0a8ebd3d5bc993239d8c1bf5e1222bf2ce45d8461645fa02110ffa61a3fb9f3b4555f226e346ea4f997034724b1962a76d3af3864dcd4e852ff1a236f882278dda80b0d83c60ade14a50909bbc23127ea0d83a0c92022537399da4a7b1a34c8974d1726833852607fa000ea205e090c96af40ef5cf57ebb2bda2f0098cd24f75d20f8ce92746993c10d3438fe091724fe8eb49cdabb98c3714e484fcb02408d5fa73ce9e49f168018714a3254d3e9c76a36f88e79f789c157b1da13efac5c13d847881d44a6324299fad3728a083b6db7de217242d2b2bc6ea01095d2f0ee42f0d7cfcab3e3907e7b8a3d4b909937a9bf6c7e30217a1c3ce382aa4e7e2bf79a2fbee4d719052d998ec526777c90e92d1175951160e4ce46f14091878dc9da916dd2420273aca70c75d63876c85d27f1e5981862d0e386f85db08a3eab53496afaaaa48827717298b8c4124a5f513a6443047765736cdb21006158bb9f240f1efdd48a208968fe4612a4b03dbfdbbbe5ef85dfbbdf42a2f831134c1c6404ba6ec8e368613fd73685b0626c81d8c232a05372bd953de414ab94afd917f1235958bbb35f7b168eeaf704712c1453b3233600f24c880781ea2287850db40057227e0280fa9a2d24f5c490f3eea9f134f9acf4506a9a32a46c646f2e509fe73ca1206666461338c53920aaabb784c9e94179c20b88e4e5b4aa6f5973326541014ced8c1b1858e50f0fc1ec2a01e900d038bb9433f11081ab8b1f840c99e883fe8894e054a9947823ee571e45c3909c6ac1a10b00eb764a24124a5d278f9acba7fdc6757acfb66046be36ef75d43379aa090248957b59169da7254518545bee40bf379e12d805a04d521a7721715c42c38aabf1c5a8bf8435502df609aef186bfce5be1532c6dee6b026965481d6dce5d2e3a0b74c03e3e3aaf40d6226184cc9c89dbac98ece944137610c275b7f475316e0b218285c9e5b545f991c5bf70c5cd138697e386ee0c1d8203011dc9950e056efcc986eb3831db9ddb9a07614e9d0a97164142559c871148e3e312396369685218bbeb1bc74a71a0ebc1474b9ec4f4ee60cb7d6d2a7bc3cad9afe0233e67fccb1d2f0a80a75d96ffab0a9c5f9d496e3044bb52b1fd886d95181ea20ba31a3dbcbb90f1971dbfbd5398258f50584877a89779828e2b52952564740a070827cd31464309746936967e944f2a58e159630d9698eda00ba12ae1db4734cb71fc56ce92d0a038361fe11c07f394ee89681dabf3254d628509bbe5c741dcce066a4e4e620a2bada80439b35086ed1f5e34e0e18fee39ff750b59df6462eb54d270d437d68e83a0a01a13f086112f9031998279c627e0da9ed7424d9ca7df8ba222c06895647afc8884c22b26872a70be01497574d8c3267446b8080575cfe8ede9c8ab446740d9405eaa9dccda0f677f667d2b2dc1993f663a32f2e27287c74642fa57217273a21f6dcab5e7ba3b0590a4cf31b0e1651355df5de182802b5db7aeeb8f6a83a7a5016e95204fc852ae7e0bc7137ded360682bab1fa8eff7c8a26ef4451f97092bd64b27bde0567626a7c9ccf4a70518cfb6b7506ecdd4c2f1ffb0332066b5ab9bb1f1a0028aa7f4fa631805247915617e3b0345f665d1dedefd593586c5348ccd4517211a89cc67a1737d297f6fbaa09be7d3313afd2f0d7b5971c614411a8a08dc75f0b196b4a134addad385f4dd27478138b6bea16b938cd1b64f501dfa2931f3331630ff4b274bcca7bf716eb14252f79c2e1cb3fe88b71960130e9a207d4d5d7acdbcae2b491de9d94274455b588b60655ad41932b6aef8bfb50546f36883b59ad6bf2aa77b5c1d54ad47679e7c021f1a7be29b53c710555590a9acf56fb7f69cf868385469b50027eb9da2cc591fe6e3736f42854554a42079f7f0f6063b0550460a8d470afec6637f47b843158058157071ed42d4c18f98724ab412a9520c6236594d7c5253ee64310e06e3895c725c39ac14139e236181096f56036df06e9f09330358c76d2411bb918cd1ebf6a0e160c34d0ecf9c1aba60fba2dd183e781e38a5c1bb3426a74c85d0c816a54c22eabee1fe45f169ab82f0c7502a018ad0531628f18673853e4b659eb493703c7ffd8cfa50ea4e5785001abd79007a1bf20dcf7ed1e5eb69a76d46bf0c667a8c69ead6a020a20cac4ec817d9b1e567bbf94adcf4f34663974fd836372e88f041a6e23afa876697e0e42e63ab95618a00dc4844a6b2491dc9d170076a2ab000a2c58d35bd56560d0e9692d2f8b9e347551734ea6c4a5d0eb7b0c0677f9aa9e3a6684e1e47e71617c1607307fe3b4d8c4af7a5a848d7be15def67df69da2e941a65ab0e3be7444bf7ad749e44236793f29ce3298ff3b367d9e5e9957a7ec4aca999670c0975971140d11298db823de5346093582cc6851468962b62acd0052e2f05740b9f23ea7ef9eae130c27e7603b6f70a87147b297ef99544d7a6aa0aff8adb850aec87144b22ef61887a6eeb88d14f1c9ddbba41e86b62feacf7fe59c7eae6670db572bed07dc5bff0afab105c4f8082850000a4cb7a69d613c5b8f41051e4badc0740eb09384a94081bbb04334bbbde1a05309c5efab787512f5c958f67dc141b6a14bb45b006bc96a14c4d3c3b9f06a7429dac2f22a7ed2e7edf48fef31213a28dbe7a5a54bd20be3e3f70d8da9e224471bb1929c2aab80f6dfcceda9ae6ee7e5b24fa6692177ca3537aa8c3ab494166f206ffcddb4e6f2bb13fa8ddfb5585030c64ab2f7aaee1234c74a37825ac3062c227a43bbe9545f0a2a8766672ab02a16334751fde5ae21eff46899b5e0b884417ac6ef74f14221eb21f3b4bda8b8537d2784e0256a598b98d2421dca30f52d128a28fa2f2718cb28a1f387dfeacb577174d1e8ca17b1a64dcc2844e5301f081084fa781e9d30b73a05c3701f8fd42e5bc1abdcbe9e35069e0652eae39d1413facbdc8f9815a04c087479ebfafceb7e47ddbf2962c898029610efc2b74879f2242a0eec6062da2fdbc5fabf16047b58d1649930037a83a05b52cab03d2bdd523bea9b922ba30612ecd124c8d2bcec32f75e464cd80c63f0a94aeb9f322f83a239eeef5ce95204f59c6023e1ed074435a37c9a8f74b01337d4bb0ba395f9c6a1154afcc4fb93728c23407cfd0719ce45c1df20c1e9b0e8014360868123e1fc78f5f1780fc72109167f5fdeba7f48c6f42cf45cea56a6b5ba4b160d32004a49d80d38d09ca60d181d18181818181818967a18a51e4661dcd5461a7f5b4b6c7fc995a7ac46930f9033e5cceeeede5c17b848e0a7b4f4c3bca9e7b7c400c200c40053eb1535077539f7371b9ba8e2a02d2fb4d2596ee7f97a6362fb7959fced203647541b74e6e998636fbdffdd0b6b0d1a2183b8d9971f7aa2a7fa9c98a88ae415458366cb7eb58730dfe576b119d4ca6e8fcbef752fdf6533529541af4b89b1c5efbdf526ae1139697aacaa3128bcf2df49d91a9eedad8d34743a8c3dc8da8f08c2a0df5ccb964589ef6b8d62642712d741763ea8b2250a6a083139a82fe8f5c99664d7fa2f8fb0ab0b1add8d56defe37737bf8b6a032bab416e2e9e4c3b99d05cdcf9e0c0edad0354945926f937041f6f87efb8c24fc414415f5086dd199f5cc7e5ae9d94e23b7ddc7f084ec8a6e2857a4756c53c6f962946c2eb61c2b5189506667bcb8e19a4cdad9621d22455421b449fced646c0ce7b68bd520f421f49ced9c4c3e36250642f1cbc6166edd66bedefd833afb669be3d6ab3d5cb3f4d5cd0450f5415bfff52b5be6dcd8be49d98ca6c524d41e292a8fe71a5bef4d28e55a51ba766cc5e7645b6d36e860ecba837e379e18ba185b8caa83c6bf0d9f6337bfe7d8d613d904f237fb82ae59cfd20a8df81d8e0c5b39abd036b3b3f0d76ab0e7c439f4a1082b15fae433ec8f97b7c75ed113d98dcd0d7d08863ed494e853813e253b911ef4a953a87cb1d9c766f428b17b39b62a85b29f7036e9b06d350a7d972dc36673f5cc13c20a852e19edf3fbfa4a79dd5d030f75390a1b3034a8d0a1817b5bea93eaa4a77cdfae1f764d28f339f3cb27d77b73365ea84cd65aebbde8a0ece8da8aade58cf342f9ee932fdf731fea12babcdb49b86cc3fb8e795725345af8cdc169977b17dbe61105158aa711d57c280310289a9f8100807a52a9f2cfd34c04ce83c8687ad1b8b61a83e61d19c6ef0e18ac4e8c1db6e05654893420e6c6d2e03fc0a9a8520701315fe3a51a91830c00a0487f4b7844b291c9407d6cfc404c184e0c87c351c099790f87c3e1ac4e334143636174477744523023814351b6230080578e3b0362bc723c22750a70022490213d89eb15354d339c180405fa53813c944f934c0553a07ee94f45f250a06992a95e6e6cbad8842e97fe547814dad29fcac40797a649a66aa136cffe77d1e783cc59f644d958a9b1d09326131f3ce19fac127d38d42c3d4d062a96eaa9d08708d42bd442e95c80daa8c19552660211111111919aa40361048410c390420619a5d411dd12408089908531c6184388328a088852021911111109261a956a0cb844e7652427ca50418bc3aa247845cf5716654e352e103e5cdfe8d19db58c3f882b2c3c48fda7e1ff99fa628c53800fb6725c785534f1b272d1c643c3678c38439b1d8bd823c9dd67ba24c3fde854a4b4c012ffc616ac8c3cfb17727d17b62838f22d772fd8f0d30bac61ea3c4ea38881a3d74710881189842453cccc3171e4dd2b01bdc6ef92b6f294d3df5eac7f01ec258627f78c35f46c358f18e93c6e09ce5f7edb5dd7a578b185f4506306b1553a062c704172113f906d7022b2ba5f598e6df9d2fc171ac1dbaf6425f84c7f99c1afbffd225ba45f3b627182372995534ce85574c2edd7b06115098069bedd1689e135e73ab4c8aff095e838adf04c30a6c5d79147e467b1b508c53774d4baadf850c271764a83fb40e8d0e10e3d642defd3cd3847812d23201723214bcdbc14a9208da7c68d5d047d6da80c687a26296fbac6a49f4253da0244d3260393e73587a337d0c6452b13ad0b4861dbc6ac78e52b4135438cb7d2fece02665aab0488e5381a9fd944df569f861cd8487950544055ea0f68aa682df10fbfb3a67b58d2ff5564d218a0741814eaea4edd8a40c762a2b100a6bd51c92394214c403e1c30b1c79a496be607d8d18a5c058b118a738187cdcedb327826f1c78063f760892260ae12efebfe121201626f98c837b67891e582eae2d6e4c914a339ac6cc01cac33b49174d717ac25d6cf7643592f25c8e41b31fab08e32135875fe4c331ba1d90d3c0780a831bc4628462ac58645504d0a2015eacb4c3069da65e06789bd25c69ade59667f4a1066625cdb337fa85e68b63fbf22477dc94bef7a1490e7625a5643bae61e6868d2e1ec0721487cf5ab5e57241cc8ff1a307d719ebd58e84220504076ac8739a678d32944067a398f3fc08aea1b8df0d3a8a8976d36dc98f675", "0x3a65787472696e7369635f696e646578": "0x00000000", - "0x3a6772616e6470615f617574686f726974696573": "0x010c88dc3417d5058ec4b4503e0c12ea1a0a89be200fe98922423d4334014fa6b0ee0100000000000000d17c2d7823ebf260fd138f2d7e27d114c0145d968b5ff5006125f2414fadae690100000000000000439660b36c6c03afafca027b910b4fecf99801834c62a5e6006f27d978de234f0100000000000000", - "0x3d9cad2baf702e20b136f4c8900cd8024e7b9012096b41c4eb3aaf947f6ea429": "0x0100", + "0x3d9cad2baf702e20b136f4c8900cd8024e7b9012096b41c4eb3aaf947f6ea429": "0x0200", "0x3db7a24cfdc9de785974746c14a99df94e7b9012096b41c4eb3aaf947f6ea429": "0x0400", + "0x3f1467a096bcd71a5b6a0c8155e20810308ce9615de0775a82f8a94dc3d285a1": "0x01", + "0x3f1467a096bcd71a5b6a0c8155e208103f2edf3bdf381debe331ab7446addfdc": "0x000064a7b3b6e00d0000000000000000", "0x3f1467a096bcd71a5b6a0c8155e208104e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x3fba98689ebed1138735e0e7a5a790ab4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x3fba98689ebed1138735e0e7a5a790ab4e7b9012096b41c4eb3aaf947f6ea429": "0x0100", "0x3fba98689ebed1138735e0e7a5a790abee99a84ccbfb4b82e714617e5e06f6f7": "0xd0070000", - "0x426e15054d267946093858132eb537f14e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x426e15054d267946093858132eb537f14e7b9012096b41c4eb3aaf947f6ea429": "0x0200", + "0x426e15054d267946093858132eb537f1a47a9ff5cd5bf4d848a80a0b1a947dc3": "0x00000000000000000000000000000000", "0x42b50b77ef717947e7043bb52127d6654e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x4da2c41eaffa8e1a791c5d65beeefd1f028685274e698e781f7f2766cba0cc8300000000": "0x0c020000000000000001000000abc3f086f5ac20eaab792c75933b2e196307835a61a955be82aa63bc0ff9617a060000000c90b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48000000000000000000000000000000000000000100000000000000", + "0x47c9410b11325752265d54845357656f4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x4da2c41eaffa8e1a791c5d65beeefd1f028685274e698e781f7f2766cba0cc8300000000": "0x080000000001000000abc3f086f5ac20eaab792c75933b2e196307835a61a955be82aa63bc0ff9617a0600000008d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48000000000000000000000000000000010000000100000000000000", + "0x4da2c41eaffa8e1a791c5d65beeefd1f4e5747352ae927817a9171156fb3da7f00000000": "0x00", "0x4da2c41eaffa8e1a791c5d65beeefd1f4e7b9012096b41c4eb3aaf947f6ea429": "0x0100", "0x4da2c41eaffa8e1a791c5d65beeefd1f5762b52ec4f696c1235b20491a567f8500000000": "0x00", "0x4da2c41eaffa8e1a791c5d65beeefd1fff4a51b74593c3708682038efe5323b5": "0x00000000", - "0x50e709b04947c0cd2f04727ef76e88f64e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x50e709b04947c0cd2f04727ef76e88f64e7b9012096b41c4eb3aaf947f6ea429": "0x0100", "0x5c0d1176a568c1f92944340dbfed9e9c4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", "0x5c0d1176a568c1f92944340dbfed9e9c530ebca703c85910e7164cb7d1c9e47b": "0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d", "0x5f27b51b5ec208ee9cb25b55d8728243308ce9615de0775a82f8a94dc3d285a1": "0x01", "0x5f27b51b5ec208ee9cb25b55d87282434e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x5f9cc45b7a00c5899361e1c6099678dc4e7b9012096b41c4eb3aaf947f6ea429": "0x0400", + "0x5f9cc45b7a00c5899361e1c6099678dc4e7b9012096b41c4eb3aaf947f6ea429": "0x0500", + "0x5f9cc45b7a00c5899361e1c6099678dc5e0621c4869aa60c02be9adcc98a0d1d": "0x0888dc3417d5058ec4b4503e0c12ea1a0a89be200fe98922423d4334014fa6b0ee0100000000000000d17c2d7823ebf260fd138f2d7e27d114c0145d968b5ff5006125f2414fadae690100000000000000", "0x5f9cc45b7a00c5899361e1c6099678dc8a2d09463effcc78a22d75b9cb87dffc": "0x0000000000000000", "0x5f9cc45b7a00c5899361e1c6099678dcd47cb8f5328af743ddfb361e7180e7fcbb1bdbcacd6ac9340000000000000000": "0x00000000", + "0x638595eebaa445ce03a13547bece90e704e6ac775a3245623103ffec2cb2c92fb4def25cfda6ef3ac02a707a7013b12ddc9c5f6a3e1994c51754be175bd6a3d4": "0x01010000000100000000", + "0x638595eebaa445ce03a13547bece90e74a4aebd4fb28ddd34de9226f0abce9049599a4a217cb299f0997b3a8d645fb8a91861527a0ac25b4e1454f7d27b65927": "0x0402d007000000e10000", + "0x638595eebaa445ce03a13547bece90e74e7b9012096b41c4eb3aaf947f6ea429": "0x0000", "0x63f78c98723ddc9073523ef3beefda0c4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", "0x6786c4cec8d628b6598d7a70ace7acd44e7b9012096b41c4eb3aaf947f6ea429": "0x0000", "0x6a0da05ca59913bc38a8630590f2627c2a351b6a99a5b21324516e668bb86a57": "0x00", "0x6a0da05ca59913bc38a8630590f2627c4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", "0x6ac983d82528bf1595ab26438ae5b2cf4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x6cf4040bbce30824850f1a4823d8c65f4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x6cf4040bbce30824850f1a4823d8c65f4e7b9012096b41c4eb3aaf947f6ea429": "0x0100", + "0x6cf4040bbce30824850f1a4823d8c65fc0b63be5c0d20cd4fb30d6156c3a3619": "0x00000000", + "0x6cf4040bbce30824850f1a4823d8c65fd8c8f17890c80dd71f67ed6c2cc701bd": "0x00000000", + "0x6dd12b3ae7975bb95f841f4505bc193c4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", "0x7474449cca95dc5d0c00e71735a6d17d4e7b9012096b41c4eb3aaf947f6ea429": "0x0100", + "0x766db4ba8216432c445dc77e9766c08e4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x837adc8a2ac1180ee049d9a9f6a5a6c74e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x8671567f6bbc0021f6f23105f33002a84e7b9012096b41c4eb3aaf947f6ea429": "0x0000", "0x89d139e01a5eb2256f222e5fc5dbe6b34e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x8e3057e64aae0fe1c91f7bceb3365abc4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x8f32430b49607f8d60bfd3a003ddf4b54e7b9012096b41c4eb3aaf947f6ea429": "0x0100", "0x928fa8b8d92aa31f47ed74f188a43f704e7b9012096b41c4eb3aaf947f6ea429": "0x0000", "0x94eadf0156a8ad5156507773d0471e4a16973e1142f5bd30d9464076794007db": "0x00", - "0x94eadf0156a8ad5156507773d0471e4a1e8de4295679f32032acb318db364135": "0x00", - "0x94eadf0156a8ad5156507773d0471e4a4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x94eadf0156a8ad5156507773d0471e4a64fb6e378f53d72f7859ad0e6b6d8810": "0x0000000000", + "0x94eadf0156a8ad5156507773d0471e4a4e7b9012096b41c4eb3aaf947f6ea429": "0x0200", "0x94eadf0156a8ad5156507773d0471e4a9ce0310edffce7a01a96c2039f92dd10": "0x01000000", "0x94eadf0156a8ad5156507773d0471e4ab8ebad86f546c7e0b135a4212aace339": "0x00", "0x9c5d795d0297be56027a4b2464e333974e7b9012096b41c4eb3aaf947f6ea429": "0x0000", "0x9c5d795d0297be56027a4b2464e33397f43d6436dec51f09c3b71287a8fc9d48": "0x00000000000000000000000000000000", + "0xa0eb495036d368196a2b6c51d9d788814e7b9012096b41c4eb3aaf947f6ea429": "0x0000", "0xa2ce73642c549ae79c14f0a671cf45f94e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xa37f719efab16103103a0c8c2c784ce14e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0xa37f719efab16103103a0c8c2c784ce14e7b9012096b41c4eb3aaf947f6ea429": "0x0400", "0xa8c65209d47ee80f56b0011e8fd91f504e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xaebd463ed9925c488c112434d61debc04e7b9012096b41c4eb3aaf947f6ea429": "0x0400", - "0xb341e3a63e58a188839b242d17f8c9f82586833f834350b4d435d5fd269ecc8b": "0x0c020000000000000001000000", + "0xb341e3a63e58a188839b242d17f8c9f82586833f834350b4d435d5fd269ecc8b": "0x080000000001000000", "0xb341e3a63e58a188839b242d17f8c9f84e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xb341e3a63e58a188839b242d17f8c9f87a50c904b368210021127f9238883a6e": "0x0c90b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48", + "0xb341e3a63e58a188839b242d17f8c9f87a50c904b368210021127f9238883a6e": "0x08d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48", + "0xb341e3a63e58a188839b242d17f8c9f89d1fb17def62216d598940d64654f69e": "0x0000000000", "0xb341e3a63e58a188839b242d17f8c9f8b5cab3380174032968897a4c3ce57c0a": "0x00000000", + "0xb8753e9383841da95f7b8871e5de32694e7b9012096b41c4eb3aaf947f6ea429": "0x0000", "0xc2261276cc9d1f8598ea4b6a74b15c2f4e7b9012096b41c4eb3aaf947f6ea429": "0x0100", - "0xc2261276cc9d1f8598ea4b6a74b15c2f57c875e4cff74148e4628f264b974c80": "0x55a0acda6b9088a60000000000000000", + "0xc2261276cc9d1f8598ea4b6a74b15c2f57c875e4cff74148e4628f264b974c80": "0x55e078dea726c78a0000000000000000", "0xca32a41f4b3ed515863dc0a38697f84e4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0xcd710b30bd2eab0352ddcc26417aa1940b76934f4cc08dee01012d059e1b83ee": "0x04d0070000", + "0xcd710b30bd2eab0352ddcc26417aa1941b3c252fcb29d88eff4f3de5de4476c363f5a4efb16ffa83d0070000": "0x890100000000000000000000000000000000000000000000000000000000000000000055109f36fa3fe86cc83de3d3d42126321524eb19495fc0804aa495f1fb73a90703170a2e7597b7b7e3d84c05391d139a62b157e78786d8c082f29dcf4c11131400", + "0xcd710b30bd2eab0352ddcc26417aa194281e0bfde17b36573208a06cb5cfba6b63f5a4efb16ffa83d0070000": "0x02", + "0xcd710b30bd2eab0352ddcc26417aa194383e6dcb39e0be0a2e6aeb8b94951ab6ea493f81973064687e0c467c4ab0a72b840a88000bf9aa5e6e01c476008f95db": "0x76201d0052bc537646db8e0528b52ffd00582c9005ce14879a15501080669374987f57ddf6afeed755b7fd3de7df9546ec1ed4dcc2a03fbff9055aff6cd5677a1a76681e52bad49401ce40146ee08539d70cf679bf0e0bf7c2192eee209bfd4f5a2364134208d97bcb2d031717e01465143ffc3621382d2febb332b302ee59e96df8acf4f200c4298d2b212d826cf085477bd2192cea1db2028cde20ab77c80a2cbd3b14a9fc860438ee1db2424aefb9c9d69976d1a2423f599a65559475201e584042d0c9b2b67dae0894acfc70c3203e34fc95eb3acc74b71df945972e3544753cd38b0afd746997d04fd5abda45045c15751dc8fa7201389ed1f19335a6fb8bee693721b0f9b1fac03061c284e92ed5f0165d2e40b7435994d13fdc56362804a7617d56b8fa58409c925ca5612ecfe539574bc11b137e6fbaddd2fc09e915b176a98e8774420d82f134eec10dc1a67dcd1b036e3baf04dc3b9bba1e3d86e09c070505059df83a9cf313df08365dcd3f627dc0e6918d5097e6d3dc00c1a61dd60bedf3c27467a477fbb15d7a3fa116b7444d7a21b56adbd9c2d2aa2238674f5666ac9e94cb524ac883683f5a1f5b7777c073ac71b75702aeeba1c3433c697e0f36ed909050f38580f47511bd5be4187329c0ed101565b4ec1da2e28ade18335eac57dd1be881f983e3d268be0670bb3120d531d67d6f0141504011f86597cfda9eb72352ddb3d507a8f71dff2df78a00c58cde21285c22942d1a4636c1f9e27644aa974b5dec54bf09b71dc9da4c16f27b1a81bcaeaec3179b483f5e57afead5ef92bede9b587b38b6327f70f0dcc37f8fce64f1defed82038ad63cfd16e0c902c82f85c2f2ec1c34759f1e17578d944fac18787d5df239b3af91e58fd621377a5b50eeb70ea35809b232ae211a9572f2ec5c7cfd1027c803aeeeb583530972184f0fc18218cf048e6b26987a00835fc5e5b3a5f146ef60e4d61a5df573437a8e3ab9c052328e8b40feaf9fd1c453655df8fa0f773d787e873a6b48be8ee0ead7673c7871bc8ac1df7fcbb463ba0d65e8bba26403d1f9f7dd70776d1ee10d56e1e7e3b4677776cb5d30eb71ff5b1c2840953878ed76897faf13a5e8727ddce684fac4e5e57e7e1ae0eb720f15cbb54f3b7e71fed5ebfc3ed4775d12725f1f4db8068dfddf1ae037558a33e2f4c5f1751d206c43a56bbd7d833dabdce3e2bdabdaebe3d6e42e2b5ebf0dc21dc0e4d21a5e3abcf9daced0664fbac5dec09d9c9d5a28beadb7862579f733751ed522dba469d5cad7dd2eef5fcae0fad76da95f8e8dd1df3f33a7052f8f9b449e17713551fd8d577aa6fb4ab82c45773b46c5a308244d033fbfe6d405e98d6eaee8e6e569f17a6e7e57733627bd65d20b0c38c6e63f43d6877c85bb4e33f1d4e61af12c13ccc9962f47fad4f51e3d577f0a7b071d105003f4515ef35e7f1853953d8a82899c31b9f42c7e7f717cc99a2c7143bdcc6f73530678a1a1555e3a3d16dc47c445fe3a81a151573731b47d5b8f6d1a78015755de72a8abb058f821575d52ade51d7733ce6dbf71ccc9922aba8eccc9f362aaadee2e13e9caddb388a6fa3a2a43c5751d9b9a36c7c7e8af81b15454373998a82c72a0a3b9d47d1cf8a82f0a879d26738ee5a4549f9aca26045e178760e9e3b4a3b575172e628799cf77014f71e2a8a86e6342a8ac62deb392a8a26c7695834dec351d67ba8a81c18cc71147653ab28cd54d4cc69d0386986068d7a1eb2ec397064d9cc304ac3468d18c8598c6535e03569c811951a5f3662467c518b835c66d19852ab61a3c645473132c33038398b468cc6d5c0341b31165f9c8da8a401250d1bf0f22100dce4119dff21a687cc071f666c4c88e1e01cc5c7c1c16ad4a82f71d74b5a00027054f60004805ad6e8f5385a761c592a1d455ff2a1748d6870af0f808d9807e03f1c55e33fe0e01c358fd303ce7f380a933ef830e9eb4b92c64bec830f3e04e028eb01a8281f7c8881ffa1871e701ca51d07f67a9c1cc7c1438d1f8e73948de3944a00780f15553a0f3d1ce7a8ec3c1cc5d59bcfccb08dd7fb8003c779c891e3a4e3e0e1388e8a398eeb3e1c88a34607e2f5b0f90f478dfec3bb390f3f1c88a36a9c87a3aee3946c6cea6d706e7314bdcd3b6adee63d9048e7214745e1a8281ce7e1a41c271da59df48e92efe1a5a3b8971e007c38caba0f1505001f5e2b0a00cf91e3a5a3e0eb51d881a8a80004e0371545aa28d267666e5351376e9c5451369f9939e9281a2755d40dd26f1ca5559dc579bff90f3c6832c75151372aeac6715cd35e8fca5e2b4a8687d7a366756271de65fec35159856271de7fa8a800d42a1ece7c0f159565a7a9289acf1e3e8fc22a915951d9bc4d4565d7b06b47d19ac4e2bcdb1c45a31ab138efa58af281c6015051b5a2ea7ba0bfa9281efe5a516b86277108234c166d4081d0894e818a2ba4200735b8608a299ca6a0d7b151afc579a715f5fa1a7517e75d475d88b3cf81c3c66d2a8a54f31b15951a420fceb0854b0d6e1085219c6ca4b0108116a620210b71e00283938da3626acde2bcdba8a89aba108747ed4abd478d2ab738ef3bd40be2ec6b1c052b138bf35ea3a268d42ade698a98d354d4e833b58a1ea729e0652a2a46f45145a56870850e57686046196858c309ee16c0f4600653b030030971384d013f3a8aab432ccefba8a24475218e006a3744ef5156edb138ef5bad81387b1457238bf3ae55d4ac55944e5354cf2aaa08207c91061d94510530383861b58a9fa6d0718437f8c0085a802287339ca6e05b475db5b438ef5645557521ce8edaf5e83d4ad62fce7bac1cc4d9ef53100887778499ab018e7f36c1c3c8b109fe864dafe113a186d7d8041bfe397ceab4eeae86bf814cb4f4deccd769cdefcd477968636dd747f71a9e001c1058afc9daa3b1b5f5c1e481691fab9dc88c26d41e85bd39a9342fed4413ad0f262fa87d12d0effcdd84c4a0a0b7f17041fdae05353397b97db1a9bb318305c77fefe027a41797f63c383e14c2ef81f5e2d25e8753ef2de08d36b289bfbf98ce60c1bdf3217ceff36990bedeedd58b698a9fcf08aaf40e89a08cee460dff43ef9008b4f41cc14736a5bae3bf203daf9282c47e8ffd0e4550505050738cdf8da783a2e363f5e979dfeeac7ee79eccbde9b8e55277310e7f3f3708aefaebb903e0e642c1ed9008bce81d128194ee46cd2740ef90145d9ab79d0d70ef3b1424c5549d1fd9749d7f4dde76aeea6d47a4bafa7cdaebf9b6eab3a23fcf672772299e87ebea6f3362bbfa6e3bcba54eeb276b976a795dd78117ed6277f13fb0adefb623afc373ee066b876af88b76efeb15ed964b50f4f56eb9d439d1d7bbeacba58e89beae0321b5aa0faae12bba7dd1cea6e3e7d32cba5dd1eddd84c48692fac0868f74b9f46ae4d23b673d480229c2f8e176488a2f7abbc4a64eab6153576a3e1f0829b6683e0d9bb8f9cb39efd4d900c92206bb635b873536edf97bc3b5a7472f0f58980f21848fafc390f98f99e199bf1b7cef57bf4a0af21eff60dd57bbd70cdfd3325703dc0e0579698e4dfb8b4d3b14c4a5f7da72ce9e3a9adeefcdd69ef7f2907a2f017371b8fdfb6233b2697b3f47cba6d7fb6513bfbb7a1fd9b4bd9fa365d3ebfdb289df5dbd8f6c7abd9fa365d3f67ed9c4efaede4736bdefe7db765edd1703240b212e6df36f00c9c2caeed89e4f7bf4f56efcc9da6e0c902c82b8b40d7f63060b2e1efe1d6e3bafee8b0192851097b6f9902e97e027d41e7dcd1b7fb758974bddd5f03abcdb4ee412bc0eebb00eebf0db8e48357fb79d771dd6e1d47b4f0d736fba37fcdc01707383e0964b1dd7f0efbbedbcbfed071441414152f4fb642db2e97dbf6ce2ef77bbb804afc38f6a5c82efc175340dcf8fefae869f346c8a5cdac3d7b0e935bc0d9bdee1e7d36ad8b40dbfdbbb0eeb70a44e74749354732505b99a7f355752107e3c3fd69fd7af2e97f6bbf1bc73edf8ef3aacc37b036bcf7b7948f17b4e985bc5685c5a2e7535fd3e7b8782a6681a2ebdafcddc2a46e3d272a9abe977d93b1414d4345c7a5f9b397763806411c4a5edc8a5fd6e3bcba5bd0eafcd5c9e1be0de7728484aef779b2b04f7be5f4ce60d19b8810fb2192933229839c18c14334f66a698b16206cacc0864e82073860c1964c220e345060c325f901143c60a32599051824c12648a20630499219921c81041460832269089818c151918c8549171814c0b64a02083850c159912c8a440e68a4c16325cc8d440e605a233c86c21c3029928323a185d616485d116465a1885317ac2c809a3268cb48c98305ac2e8cb880ca3318cc4301a6314861118465f1879197961d4851117465d4653186d1949611485911246608c923042c2e808a3a191114645181161f4c5680823218cbc18fd600484510f465d8c7830bac1e8cac806231c8cb08c6a30b232ca628482d10b465a8caa8c62302ac148cae88a910a462c18ad604482d194910946271851194511d14154069119445f4450103d4144069114445b446188ba88b888b6208a82880a2224889a20d2224a826848748467039111444a7840782c1005415404911044534428105521b26283c346868dcb8685ed0a9b15b6266c4ad88636226c46d88ab03d61eb62f3c1d6832dcbb603ed099a13342f684dd0a2007730bf8089e0f281050349c5f4c2c88aaa8bac0a700d160db0126052b02933095307560d66966983b983c983c98568091307538a19849d4024c6ccc1dce23dc9c0206282a80ad91bb232b2386472c8ccc8e690c121a34376461626ab4356864c0cd9196419b029646364669049c8be646bc8d020a120a390912122211a210ec5236463c8dc90b521cb92e9209b42a6826c05590a32166428c85a9051d1a0646440376469e0196452c8a2c03d601ef00e380beb8073c05cf0168c03be01db80b1f015ae01d380b56019700cd80ac3805f30d130cf30cdf0bcc0cec0648051c1aa8045012b032606b6052c0bd817cc0b18184c0d581a303360646068c0ce807101fb0286056c0c4c0b1818302b6061c0c88075011303d605430236841d013302c605f3825d015b0336064c0b8c06d80c30366052d084b02dda141814649080a900330176c53606d8038b8aac027e31c3209560adc06281a5828b8cca071710361d4829f18bcd0b92045717130c5761e3c124834685a5832c0b9610ac1b585c48324c395838806cc8bc645ce4173986ea07730eb00c0c05d61616106017ac175843b072205320a77011ac2aa2384c31c825cc354826cc32c826887ab0699131c3060558840d09f34be582ec0bcf071916a40864be6461a8d6508191b9426605510855152a2faa206c6ea8805019a11242f5846a081597ea0a928a0c0e2a2bc82ba61a24140643469128902a90b1816441e5659231e262b4c515066982990651983906993164b2545ea8ca009db079814fb0b460429710ae2fae215c6eb8e070bd418601c300c500c7b09e5850ac29aa22c036645c9871c8b49075211323db42d64592915d419a41a2419e614343a5858d0b5268eb82750469250ea1fa4205862a0c9518aa312416d205b2057205323990c1227303111046556c678c5ab0cd618e21ad909181c422afc433442df14b6c4224430c2352016b83c807a21f442899172c2cd695cc0a4c04f88648854c194468986cd0bcd8e2f0e0204f204b00b94c2f96151119a21d4c306c47a8b020c1c0e80083008120aa038b0179c05d980a3c057e025f41a60abc85b1c050e030d80a5b1bb8098c043e023b8187443cd8ca78666c72602f380aff404402eee28dc127601f300998056c0557c1261079c140e0206c6f785f786f10451175f1be3c323c325e199e19b8042c844705083ef082e000261ef0b0e080079c3049d22581648957e5dd008923822400010ce03102c88e024ead23801d3f04c000430071448e60bede8795016388a4c9110d1471e20812268a14990f2eb104499122592545549d609b20e9c0912545489509f6074913244c9c28f283840336aa122c929f233f4d9a2469826409122037aa28dbc406962429a244912636b0844789922614f0a30412254a9a50c00f1509f6a7c84f93234a9ce8c0919f26483a9064c84f932347fc2001c2436505adaad8261f40d253a44911244b34a10492258a34f90092204b9a48d2a4091208e8a884d603499c6826487a9834310121b4a26291fc1c59228992234e8a207902c9130e18b204120e70e0c8901f2a28dba44709244c2831c536f9598284091226962479f56449920d90aa11ac12499a2c49c2e4070a24453ea0c409278e146182640925499e38f528d18492934d258245a2c49226961439522489138d4489254d34e067c9134d28a144e3a8a4d82637aaa03d52c44686d90e1439f2736489233f4890889175d8264892fc2461d204133f4f1c999174d8254d24f939c2e489258afc34a1a44991244ef411264f340d79c62e69c289278a2ca124c9131a28b2e48812459238d13f4b907480034820b00492259e50a2c492244b227084c913ed839c030892283992e427c9922434a41cb64789269468a008929f27944002051219198765d28402b47d489468e0c8cf92273650e44709244c922cb1244991223648d5152b0b13b2d8a23735772828a85f0adaa8e413f9e439f1ac482b5a55376edca8aaaaaa58eec608e5b5d7ae64b99c31334b291932dc65e608ab08655cb9ed4a6b2384d1821c2d0cca5856b6c1b7cc3c2dae388b3163c817e40b8b515e16c79530f24ac9ccd092cc2badc5e4ca5d192384cb08a8e44a961c9923c3ea3d29e5aca494bb95ac76b3462b6584d62e5ce668c33a401172e52eafdc2571642863c511ca65c80c21b62c17c2f8f6c9656ba79490995f8c9188f7686131636861acc3b264388e39c65de6b576374c24c2308c9921b430cbb23008618c5232cb67612c62c98cb1acb2272b29a1085a4fbe0c5a0bb167551163b6de7bb28a968f58a3468d1ab192154b5941cb9271195abc9077afe5b75bc1c8174703ccddbd96ab60841664b816b4ac08a3b570e5eeae947017beb716af656570cb012d86b1e2c85684322ca51cc2929271549688996d8c46b2825525793727c6c8cc32eeee1b312f9b76f7f1473676f7f1635e96122eb37c92658ccc51ca18a5652d365ab97b2d338c71f75dcc7bbd28a54862cbbc1cdf2ebf2857324b667ebc2b5fc56cc585719935c85894bb2ba5948b2d14615cedee3e29a55c2e405cb99910504a08316cd7b22ccb8a1684db06b70d42c63066cbb22c68c5082db9d8b6612c2b6855cc55f51eef6671adf822f38e22c718997799f76de48d71e5ca7dd9ee4208216466b62c68410b62986559d64c64c81b99e1f2eec2950c57ae05b7cc82988c755d578c16cfb08c1083bc31c665189977e54a292b08777739728cbb1b23ef2e3347685916c63a96996558326f84f2717cb1aae483504219258c3146668e11c2181932639624808c31c61acb8a31462865655552f2006a4430881e35b2aa2a919438784801ec9040bcea55225959526e51cab8efc55d295956524a9670fbc18ad08a125631ca5d29af082106238472b1518cb2e2c8cc17c328e5ae649937c8980165963fc0a4890e20e940d581243f4b9e60526936f0f3040e244c14f9599284891345946892a403360158020913244b3069a288a90003409284c94f0008a024494f0f1c1f4a251f4a3480a0e1030002d0430f6e0925499850a2c88f92278e6c00c91238af03391609930d1461d2c4cf11259a50a2e488cd5482c409122545a038d2011d371c684249110e2c49c2010e34a1c4c60078e0e1e70813244b907080490fda0e00499326489838d181269428c2048993269440c2a4c891264b2881a448103da6020cc009259034c9b1d9401226489c143140100528c000964052a4891f273ec044091e0e059225962429b224c9112694d8c0069aa8429870e480a2090ffce4301560008f19620041141900929e234a345084034b9230d1e408136772e4a7890f5c131ba41d40134d30b9d1a3c4110d2851d2049300d4234898dcf800929e223f5020599263871f241cb011d3e4a749122890d85c1bc4922692fc2871a4c992234c7e8afc24e940079a28d1d801409164034898385169981c41a2440912b7c412244e3871c4c6c9122470668328b2a489244d982071820404499a14d940134d3071a208120e1c61d2c44f93223f50202180932548600036307881802c36b2292036b2a9054aa55211020165463605043432927a4040119582a854c41802452329a0070404048d2c1010508a8d00bd1410108c4636554d239bc28052d008d04b0101a5a4914da5808052a9ca48eaa58080de3302f4367519493da067648180d8c80201a552d148eaa564ca3202f4d648ea55467653d248eaa55e2ac5d0c8a652a95434b2a9141b49bdd433b2a9672401900d6f775f079a1cd935c6da69d98b674cf9bde92e305270dd3534c426ebf117186ce2c75f5ad8743dbebbc2e8f8a9a57be81db262a527848194b408171bfefa05c61097e2bbeb08f9ab5e5a9e00ae21987349619cf8f895d2dd3554014efe1abaa470291e039cac241e0e0a6a78a0a0a0eea91d8d7612b74811b274186a5995c8938cd896d765ffb40aaa3c22b6e3b5edc0734fa855899a45bb4b4ac74bca23823bfebaa2051d7f516113ecf8f9203f28624ae25f114ac009fb6b495f5b9404813d6127f177c80a95de212b2c681ed8f2b0650532c3fa908fbfb6c09cf9f88b0bcc79a7f8cb0bcc113dfefaf288b81e3fab93e43d10467be0092da224f977e2d3a424591d701dca3bcdff9d244d42fb453b0f40a1abd813f25b18455daa49496427598f0d9be480ed24ab26b1d5116c1833b0c7e67eadc3b0353a82779a9554559f5198be2224c409fb084661ea7082f24ed89f5c591d8115264c18eedd8ebc3f22bc0b4c2f0f40554ab26585b96c681a2ea5de2b008c91cabf67496949296dde1ae2b6c3f291be8eafaa4d8cf47564b6c27cbfd6c7ab319002fcb53ee0778806609a864bef6d3eb16d76c7ee7810c8b6cf0bc329f81e0de0bbd687fc7e4af8e075581d5687d6e1af0a1e5687104e8bda70a9e234444957567fd549f1afb949110dd5a5556db8545dbb635f47ca54982b1fd747f5bd5c1f8f0ac125f92fdd834bf2bbc14efb80a6d9704e76f922d6c777c7757920d8c471e9bafc1038d76f38e7629cab23699c43c338d7e5178cee846879d2fa782d8f511b2e5d8762d0e15f87a74196aee1d2759d64912ceb3b44032fbd43340843d370e97ae5131bab365cbaea5a54ee8eddb1aff7a524432ee6ca98f71f59bff76e3b0c17323f21f3f59c6fdbc92cba5d7e4efa23d59df6ccfa5adf6bb4b37a8768d0a5e3eed87e50fe46ad63f435fffa84dad2ebdbf6dbda5dbf286fed5eefe7276b1acdfad984f38bc4f6adddd5503c11811441cd44d37c9aa41a7be78139d0214c37d92d58aeb0a2b1aad56ee74ea95d94e7e3acb48b06d96a07454fadeee5f623ebdd1d9df66cbb27fb6ef54175073bfb6e3c57cfda739dbbeb2f08ffbacf0bd3d875a00e474a53f3c521ccd50017dfd5b4e4ce267921d894a3e56b68d045cbdbf46829cfd148f91d7a3237c0edcecc95311a9722cd8d48820652e2c58897b7e4db92d700577d08cbd45d9c1136592f824d39da3a912e6dfd026c826d2d97b6740cd1d6974d3abadb30964bf23a6c33995a5a3c19b4c55dc3a61dd2c20abf85229f17a6976313bc751a36c55bd6adef8d557b160cc47263c3df86dfb13ef670f71dd74e0c452e25f1648a28ba30c516295330a10b639c16e24cd153e0410ac2f81207381ce1b41087bf1c132b974aefdd057396713aaeb7ad62aa1978d1f1da00271ff93d1e37832b9a4fc3a5e622e0a9d39a6a5bc55455e392ac5aefd00cb6e85869b8f476a89787947c3c87f9ace0620cd7f0ea4a40b029474319746908e12fcd02ffa177480663e815cda705c73ae81d0a820a9a61d03bf4833774a977e80735e0f9190198ee525f54dd3d316509bd73f4b4e020127a877830463f307a877660a581e81dcaa2e56d40322878691f23bd0792817941fb0089bafb0143176a60d0dd0f16184c3074f7430230c8ee9a64c1073f08614b774dbcd8d2fb2b28280605f586e91dbd975570464b2c34fc1cf9bc966f0b520430ba258594144462a1dfbb26299f0d1326cc94600c818ca6924a2c34531dfd3620774203d61f7ef33908ede14ae27997e7c74a0af22e1f0f65fd994d84a1fe6127afe175206d4869f3cfec7d4a3e06c3f4f1827ab296ad0f1f59ef7789d8c7237eb43e960e39d5c381dfef7bacddd55da5f30596dd11bfc55e2274bea8c1f2d88eb5e3da01b5136e0e3079fd8ed164dcd4b41d8a4119ed336a2757f588d8861d775735fcdb9ae0dee7db96706fbe282c183b3e312868bd442f64976a8c7d44bc2f5d7acf2f674ffbec1111837a7f6c17ebbaaeabe2eb82efba6449f45e8981438cdfb0a9e341c3a6eea6df6dfa5d9341967ee7d8f4faedcd4342d43b248313ccde21193c5998432a63042ed0e2074f98e08553ca0460e8c2086640a506567c39c1c3b8018ebb624046f3359a2574187213f31d6ee4d28b3f97e267edded631aedd0fecf7ec346cd22eedaaaada55cf5e5d5775f859d1e5d2db80903a7269abddf6ecd70fe47d50f4b6b5129be081e86cfafdd5ceba3cfc84ef65f44a00467f643f9ae6ea8f76572fdc56c6c0cfb86d15a371e9864bf0d7cfa5ab5afc48bbd73e6f5fd1ee07f6fed5b7ed6c9595d31afe6dc3a6373c10ebe3dd4dcf278530f77409eefd877d2fe076a80652fa05f5ee4df7829a3f739eb6f441e17a6010f70ed5c04a077941bdb57b410d77e2973a89bd8f9487eb3da45daa613c8927eb587d46bd5f2c748fee364c77f0bcf46d3ef7e11a569b171485f9be3774031c7f4fc325209a5fb374b9d4d5f43b106c6262cfb761d38de6ef96e6ae36bad3baab7926983b0a02a7cde08b3edfe611f15e17dcfbebe502ec4db75e3a7ed7c75b1faff78fbe9e7cc11c0c4a29e5dcc9a80cc2b73eb8f7f3ba0e81771dfb949f92f26416e5e80571e225cdae1dc6e89e2cca331b9e6b86e7027eee70ed5251db4d4aae9899a5d4301a0517f240d7b1eaad0fd8fb39e1b14f124f978241cb5736685999bcaba7baaa183dc489cf680dc48955130864c76a14d8b347604f58e5423e6e0fa02201a7ac96204e7c0f88137f6d42e065ed92986101b7a7eb5424e0841d7b57dae113d32e158427a6392ee05b7e50d445a039065e74b7431d4f844d5d1146b0a95b2e1760936987627045c72f60c3e8b83eb6f76fe3a13ba022d8041fbf5e225f59ac3ce9ea654bebe81d824196868115791a7bd914df955afec6e6dcbbc51e3e7cc7bdabcee7cab0f67051052d97f6f0e3e18604c3b67245775c4b9acea665ed81e7776f29afd5bcfae01f11dc10891ebdbbe3412e60fc766946228ce6c31790d17c388adafac88e3d6e47c8c7c74d081f3ed2d8a333f8ec3d882935b90981d9a1760d3ecb0e277dcf3af8f76a93c0f528ae1ac5f5ead667a5c12d081f7e5edadb24705500ca3b5d8f02ca3b55d5a3a86e5d87895c8fe22272dd8a0fb6607ed1f0a86a7bc1160d0fe5b357317f35e6151dc1f5ea92026527f95d1fd6ab0a949daa779b90d12621845d4afa4e18e5c22701a30c70d9a158e7623e283bc9c78fbefd822a7449d6f31ae5c9448fdb8f7719ed1ded5132af7d3bd4e892f9ed3af0d16d19daa53ae67d343a47b5ef76c4aba3fa04d75d0c0a7a177d52d2dcb218a369ef509533b210a36f7a87b2c8928515a94d4a126ddbb659daa4a429a2a4b96dd761b9595b90ed5980e91f0e923d604f551dc15551a95356a1587f277945c8d2eabc4ecb8aaae4ad63550592f2d55140d7ab2af45375a19fb00a7455a19f6485229480d314a993bcbc55c1597b22909227cd08c45d280e0a5949f352febd4a9ab2a6ac346f3bf04fcaba10e702aaf8f2c2dc27b81daa824bf39016527afbd288987bd3f5886c62ee40444e3112d80e44c33b6cdf61879a6fd57723b27d07aa7db2161ff63d115414a73a844f3151dbf9b62151dcb8f628627ee3bb0db971ada2448f91df8d484c95301abeca17721b52f3d135ba5d44a3a8b9e872ab808d6fafe8909a8f2a4a749aeffaf894da711c25b2f1ada26aae89e89e646814da6d1c078dc2c66b4e43a34069afb945bb544b691bbd4355acf4dc6dc7baa44bb296b7284fd6f2349ff36d15109de61c8d4274ee238a127df4188a123de6bb55a0e636aec33414c51dc7359aeaf9ecd3d2e46e15408dbe1dc55de6bb0da9b98d8a8af986834681a2e7930c8d0285d2bebdc6f7c45194cd513a8efa737c44a3d0f128fe28721c051405e932a7396a87a3681c35f318b90d117d74b91189794d45a54edc6f50d43b7155d22122f9518d22e6a34f4b839b04b4dba8516c17dddaaa3aa4e65168e7be03456d1755a0286a1c0711ad8ec0c6b57315283b8dbe51a0ec14b3eb43d6ae475f11125dab40d9497bf511e51e43b77702f27e7d3709c45494f6ad42119d8baaf62891b75e7d741d9eb5ebd1d6b3cadb8f77788b2e91afae034760e3a38a7aa75aa3a01575e328eea8ed31c7718c5ed7e8086c1cc76b50d40eaff15995c04a6f14a45425b0d2d565c7c622a8770afd2ec07535b10a2d55505125088b2d580c55e952850c2cb26061050b299a2629e9aa41b0aefe3a6beb4bef18d697ae0e9b7b379e1da3ab033c198a60e022a8ab5b5df514699292e42f4a9295a7ab637df56e3c3cb08084206de339c093a1aea22045741c15f54e281d55c708c751af423fe9a840a3d1698eca51857ec2518148d76e53814855e8a75185c285f5d1699cd0ef3154e8a7988d026da7f98d0ac49d86e32ad056b5dba0a8d4a9c62701ddd3ede3d1ed90142dfd2ebffd4e3b50a19f5017ea28a19f8044d71ef31a1445a3028944a7390a48e63455e8a7ed3355e8a7980a2453857e125dab231885091326cc69ab0b71ba1d9232d4affe6c42760afd6a07b8287427af646925bba59fb2d2d8f600eddb3998b355a1eda20a65ab2348c049b430e7f1d7f680ed31e7604e4c15129dab5044958beadbe3ad2a6b8f5523903a8df8247a04e22ed40b0ae2a0d8a14a92171dca4fa257ef9ce8aa92641dc2bd7746fafd7d61ce56a3d8ae3dfe7a44bcfa6aab80681ba25d5451a26ba24d03da217531e7c509c0347c560db5ccb62027f0d23be441adba76b80981cf4eb0a5e1dfa7d4ded68027b87e8ffe706d7d66bcfd783d3a88de2d7bd5a5fa5daf3621d9bbd73defd995f15f979d1fb720d5b6e3f33621f0af56db8ecfcefbfcb4b4b7fd78d5e7db8e7d3b6f910f932ca59487d823506993be9ebb01c96ee39b14290d9f9db449096af84bd3ae5dd88d1fdb26d2dec3311a91729c8723e5c0b1bd2cdb8663db280e91dc701cc3211acd904838580c124926925ee3a411a7bd47a3039aa18344a25b0c246ddfe1dbe746495bb08974f9c9cdf4dc78f61e3db3fdb8f1ec720b029f7dca68cc1a0e9b6d63c2a3e5b8c69d67f4eb5a0eed1a573b9fd14671541fa026fdd14ed3e86b1b12e93a8ce3356f3ba4c34d0877751bbaadb59ca44bd2f69a6f9fb1dfdb7ebc5fd7813668f7fac6f61bd4860dba5db3039554b8245f83c232b8b451daa13a86762819daa144b4433d49854d0f9ad1f20f96c162b4fcacb48c6ecf2dab241ef89ec75bdfcd886a0b366d979fdbb69db73f3a84d43b44841948b12225cb09864e90e5045638a19faefdd92bea5acb6dbb0ecf4ddb82bcbeb08b8e5d24bafc14b528cb46e7348d094f96cd5fcfb2ec57eda646479dac92d16d4e24cae8f64824c2b620a5edef5b7d5b7049fea719145100fdf5b506fd9452baa77765f4948beaef9b10b9edec50155ffa873bc3e957ab2fb824cf1b125867b5f30023e0f46d3bda81a0e8f7d377283fa17e20d40cae2023e8441f04bb9ce18aa0d3eb13283ffd57ede27cd5bd5fef6495071fc59e51f8493b281afb6e48941afbc69335bc0e6714befa824dd86527abb43c46790b9764a7b57c595a1291e72d2f8b7c5db4a46979eedf967f5b5c5e6304fc326e43e87fb80df951f5aff4b2f65443bd3c00c114897d28a3aba9b1b9c868f8a83590545bff8987b5fbe1e9504c9c5cafea4f7c75de8494ba036ad941e1a3a3afef264472048800a56104a4e643cbeb70dc76607572558bcac3395a19afc39276fc1f6e5290d77c9e47eaa3a3df532d5fd10ed5957cd5c14aee29dc82949cc87edf4d4816d4cf7af00b056ef40e7d41469b2028b362e21bdf5f8f080b4cc3dfa01d37e9bb3e7af4e8376656c091dea3bbb743ba0eeffa08a27966055cf51edd715f7f5b10d23beeed357feef6c300bdbbe34af12bdafd48f5ab68aa1f257d44bb1be78d800d121fddc6c6c606dae4b0f9849a8dcd7598e372e4c8f1f9348ee6c871de76728c462291e8f369232a2a819786874f741cafa1d1b80ea4aa574df5a317eddedfb78f20195625a3d467854b1daf37b71dd147749ba3db7307ed6def35f36d0d90afbedbab46c8cfeb0c89e33870e0c02171e8b80e1cc78143070e1c3617dd46249af369718376af4987392e7a8eae47dbbc239d5f6d3fe049af6d2eb271634e112443249a2211c5c1a24a0ab2c3717c87e3e818c70dd2cc144d1c528a08078e8903079d1a8ee3a8a420359faff9fcb4a14c62db9c6443537531fa6e48bcaeb2dd84e0d8f8e8363e3a9db7a1573f2b1a0dd1713449b5c8e2f21a87886e6f3b33880ddd7ec748f4c675e00dba6d835a627029be865659b814bf0395516887caaa2e50bd353e7a8d7a99c1a5f851a5418970b03b8b4bc75f66585c6828118edb12834dafeaa2e31f9da144b8d79dccc2a65127a574fc845fd814139365df82f8d0d91736658f9399b564e76d273b83c1a6f7f8c971dce7d31ee5be9b0e739f1b010c42ad7b5a3477b8ed707f743b866e7395c1e052fcb33231ec618f18fd4c75f5a80ecfcf1d52822dbda377a804564ca0a573a49c404a9b7a874cc0a50452daa68c311a47ef5014303a4a176dd33b1485053d6534eb73e7d476bb6a87eaeb8f765cbf532af413d51ead287aa0ecb45c80ebfa9c1aa57b7a34beba1ef6a9691866849c1525bd6fa79a14e47a752057ed20191dffba573b54bfa7fa6d3bef3a90fe70bf5b9b109cf9d1e7475546e1529c8f9fd616c4879edb276b6fe379bffe369eea6ffbabea72e9d51f6eeddd75c6b623fadc6d543ba01ebda2ddd5d51fedae7edf28139eedd77964be7dd974d58e09cff598f370bfbed5aeba4c5d2e6ddf964d31b5f379bdfdaadd72a93a37a25af501aae846b745d4e7f59cdfe8b646b7e7d3e6fc16a4d4b3928264c79e55f8854bf1d8b32a6cc21ebbeb8c8ec7e8b3c2a5f87903025c7508400002dceb1eebdbf1d60d225ccff5ed0e92c15a6e10e1dee3559f459fe0fa87ebaa5e11fa09c55d5881420c824e40f1cb115c808453141f40a54e37a7a2c7094a8f1317ef320a9b20196c7a5da5b73b08a6594bc773183cc02f3cb01646000fddd3a2e31f96ca60d4a70523a03efec6cc0ab847a5b7bbabe3239b48d5af08fd44bfa4aa0ee1e8b95fc72f23803efed19ac7e35dd21b0bc4bbdc90d886d4d3c36dc8e97973c09e78a81cc4797f9b03f654eb0571de7773c09e685d88f39ec5140ee631e5596113765867b0e09e958e1180d9e77c5a46a526ca245fcbb8aa7e5dcfb24b48a9b38bbe67547b45adaa7a4665adb24fed97dc7e6ccf0ee9758dceebc06bee27dddee4f722dabd1f6e7e9f1b81eb1dfbabd877dbc9fee895593a106ecf9dab3dba1da3a420f0d821f609a9f5e2e126a4d4b076f2f30a771d86547eeea6d50ed55ac651a19fb82f2380ab28a0d1970b901db55c0078eef0711352eaf73f3aaf513e47f734a25c689f8f6eb58bfdaed12ba3d8f6a3fa3ba4d927bdae03b3ebf13a10db66fac3fd5a56b40b23c9c5dac51825dd2ca6b9d27b2cebb5d78a600c5955747707ac648c514612cc95118a209a1a9b8ace60514929658c75582d359ad0dcb94170f22f569fdd26e5b530e6025cba307e949fd73ead6d479392864d319eff68f66d8b723b22d5f149ca695c8a0b21acb61d29772184bb3bb7ba0e43b871a1d6bc9171787777bbd8bcb05e7b1516a264cb8260b494d2b2a4654929a58c51d2b96cba6a17af0bca4ac618658c74088a315e806cef0eae62ee962dbad4d4764b959eacf15655d7c5252b26fee2123fa5695c7a558ddd4f8dc6a6ee61895ca49d55bb6829e176680a5a7af2bbd8f42e36a57ab81d9a8217fd62964b4f52c110febdf7184208217c0f0a0afa91cdfc08b928292246088c192829e20a3f1cb97938282828e887b1908449c3a6c825254334bcfa07368f8c164d4841bf47aa64888eef5de1bdc7cf097c84f0db0cab9222fafd6d416284c09041bfc747c55c3669a3f9a43c845ce2123c3f8622b3571814565fa91745075a402d25268408cf0d97e22d20ba864bf117b5e1523cd3e5d23b0277bdd33a729c837202ca4fcf8a4780f7780d55e563a0b6beef3a02b75ce268d558bd1ed28a962d5ab600c38c9e23aeb7a3b9be69f1d5f8765e8d3c5fddc8447813fb93f4198183dbf6a3dbef0baec7baecee3d6f5d87cf262c1b4df9e808fb6ef355225c7a8f3a505611ade1127c456db8043f696a6c78a3244294af085cf58ec6864dd8e1df17dc6b991dbe87e8b07bdd3d2b1e8f772d55ba7b11d77245c3df00b15b569fd0e3118970290a91a228bf518d462ec92cb8ac7bd62fdafdb0acdd76d91bb83d2c07f369cbf2d511acaca8aaaa92af1eb79dea0b1d18b79d674594c8a6582b0877602585cc4a844b5b557a25e6227a45e8a7984fcdfa1c5551f0220a557a424d5a89552015bee2b58427f284ea8bc22598fd5dca77da65ed5e94d711bbe8ddde928fa99dfc36ff2eda44978774060b0eabdd7bf5add9e8dd828fbdd51eac6e9566c9ae7ab06f3c58ed8197bd7529b809910db17a99e9f08f89551c8d7955691cd7d5b446b763a8cc31ab3a4765bedb8f59b7d732d5648dfb46e727463badb17374fe6df3ed6328d21ee9c538ef19e5686a6c20ad8787af6897ea2a461fd81108a636dee2807da3d09bf1f3cd573b4dabe2a736927c61c7340d7b1af634ec69d8c32e8aad61dfb6aa0335ec3a2cd29e6531a26fefb88b24cb4c1991766c54bb918863b2779c68ab17c6cfb01aadda55b21fc71511a210a503d03b0405286ce96782dea130863a92787f5d54896a57c52a56b51b3d621f8da2146e39c2ac2eb6cc155bab4622914834ba0e1cc58844a31137ea9e941d51f58131b403ea9ed1b7ef26643b4dccb977338fb91ebf9c43e3dd0f8c390dba8c13532b99fac38d5d8f91918f8934a36fef66ea0ff7abdd8bb90c5d2ec5d48e1355d9e337aa75563bec92d5b3e2f1a0e112cb0af452316c9d208c2cbb5156fb595561587982194ff8d203e81d7a4217b4e37adb587eabbef17560b57d9ba5f5ca07f626b71fa9b63e27fc463baeb78575a9f01552a2f4fe7057efdbf6aa82d5a194adfac01b335970ddf6fd6e72dbb6992ce4acdb37edf21d8bbef554b57bb383a357e72a51fdc13ed2ea0fec59bb54865df5a2d136b6ac3c410b279cd17314f93fdc4e20a37de81d728213ba6802f40e3921a8e7ced8ddab1dedb84ea180faed8944d1efd6c286b4c707d5d6b7971fb767d5ee75dc2e36f67df7eaf2ab6dc7dab1bedbc6bc9bbfbe9cc3ddc2d9ae7dd9945d84233fa2cb259156d51fd815bce80c16dcac5d265fd51e58bbc78cd5eb62ee79af2e5fc9aa7149ebc855c4b20722eb7df1a268d8cce6b317e5d6239b626ed5ee6d9737eb459b90f76d0322b2dee7f6fcbe286cda769ef5b9edcc3a27157d4ecbba88c01ab7ee036bcf65c523e28aef621dd5286d3dc60ae13bebd661edb93e1f1fadbf1a155a95c4e7b1feacc7f7596157e3d545da0644f417dfab472bd6a8a227ca3620d67b62155955747d71c9e6ea7acfb2ce90517352e9aeb22c2bfe093d22ac4729dd5593adee45b1a2e8ddf5396bf7a274f5ece7cf6a89ea0f37d79e7757fde1b6d834f3f9c8269acf3afafc6e3c31abfcceb03e2b841e0febd60644f44e8366a7a1319fa1dc47d575a088888c364532a3cb3cd11b89ac6053fcfbc36067ef7e60f5acf660b73edf659ff096cc1f1559f188b05efd51085bf4ead9283b47974bdc6368e41257bb1fb88d2c51dd5e3d2bb6faac783caa672792fd59915d6e3bd98b3231ba6d557d7da0b1f3e7a1466b56bbedd218663d2b629e8c13980046bf7748096630a18beed13bc48427ad842f585aeb1dce5a3a82e902f40e35c18b6e8250977a87b478e92650e9d92f52e9d86fa8a5cc866d5875e677ec65995907e254f5a24dc86cde80cc1c7b6413577fdbef5c558fd5b56da7c268dc765edda99d068d7945b55b74e634147b0f791a8fabf3f66339ab76d7e3aa763555bdfeaa5b9665f169acdaa5da7a453b293af0b145537be02d21575cc1236287eea746c8553b6eeb35910a8d6a5d87155fb507c273255dc7ae198138d209d26bd47c64e3dc8d8b5ed58e875fbdc22a6b060bee87bbd2b0cf506d03b2c3abb903ed5e3356e324d16fd4ae86bb8dda71a3d7d4eada0e589dc182ebb40d08bfe7d598639b10adf92f0b26b976311ab6438d5abb9aee9e14aebe3aaa9796aaa2555f1fe8aaaa8070ed62f3ad57b4e31a320a8af77e5a8beeb4c78d07364c55dab1c72b1e117cac8b55bad37c6077afa110ab76dc33a77917a9b4a67d725bef5eed2295d6fec35d3dbe5b7fe73f8de3acda537de67cedf3693dc8e80171e43b1ea369bceada75715c4d8e0ec49133afaa6b9f39c786b4fadb84c8ae3ea33d5ef17854b7362033b7ae51be0ea441634e43479f99e11aa570a907cc3192c3411cf9ee1aea6a6626f3b70189b91198f3b27030c70988232fa3552f35351cd71dc7b5bb28e9fab6c56932efbdc7d59eecd8653e9ff6de7bc764defdc8ce2e5349d747affeb2c01c1d2760ce930271e465969a1a8e8338dd85bdea44a33a8305f723fb69afbe3d862e9746971b90f71ead728f9b102d2732cee8f24f8a76f96ad724d5d8b951c52eaaa9d1de710bb5dafdc8c65e5d4acb47296cdade1e57f088d8de0eb79d2d52698bc64c567d751fe86c058f880abe632fcd1d7f69aedd4f8cadbdfb89dd4fec77ae1d7be9eac64c16dc8f6cadf664b78ebdfb91fdae8be3ba9ac6be9bb38bc3b79e452efd3064511782ce8ed1ec70e3919dd58bc6be78665b35aee0f1a8de0e4f47140877e32e97f809a208a44efc28e0a780958a049cf85c81f8fd1160bfa20d62bfa219a30fddbd73d723252fa0de30d0eb924a8007168e10e6b48f54c21d80395d3568a32025bec31afab0dfad023ef4ab424e8e09e223a9fab6fc459f085d1615ba4ed69776404338e8741da350863859249e67a5a5ac6a12d6b78770a7abaaaacfa865bd7205f565d18538ddd592594ace0b22158aa778488770a7f85d08abcfa8af44e607032c2044a24a168fc70b72aaccdda086b57b41bd9b10aee32175123bc2efc2dd1dfb97c57c2208e21e97dec21ff64c7d5ea35eeaf1017a2cccb1de7195b510275aaf0ecfa40a60af3ee4ba755dd621d8ab8ae2421eab6732a4fa55511cc481f10fd8530dc48187b27af786d69e2abaa748bb52d31e90a10ca69414c5453c5076923356a0baac282ee2e19e2e8873da933c943c31cd5cccd829c91a3e1ed62e5ed62b1590ed2b423f71010fb720584786106bde65c87cc534c265ad4d9f26afb1daf38eed50162cdd3193b73be47faef6d930dab36cca3feeaacb63743f7748bc96c58bd626c6b44bf16edc6141e2b5bf2d88766c03627d62547bdc825c7f7f7577c7ebb8629fb463ccc9d53eb00e41ddcf4b558fc3109f135cd40198ae0e2f8d88912ab1e5cb9104111d7c01737481a4ea3d5a3e09795932c2049bba9ad572440ece6859570bed6ebb8cd1b2bb2523479e3a586213bc841cf77bd5db577ddf7faaded7376c924cf63f559022cdaff8fbb8ee02f1767ae08ff8c2bf1782ae8e8a220aa00b886b97828bd5ab76f0fbaefa511d06a96a57a3a0ef67137310f8aa0679e7d7b0c9babc0d4733c445195d51d91c9bb6baa4431dead0bb855920f6157d617ab7a00562afc315e52029fa9d21186c0673f4ed7b9a1a9bdf94d8543dd519dd6ed1d49cd9e1354ab28e7d1ba3e333313a1efbdc21f1c180db212ebae8ea5a74fcc605181d3f3f33ada2f173a61e3c8651399f26e72d1fd8737b34df430a725dfebab0ba21915d98e8b23eb1ecdb58567f58c78e697f3f32792ccb84c467b547be8bb736213dd5e3afda55d72af6ea7535a290a1ec06f14e4f4687b21b44f577d2811acdaa0f0a7e44f734a736a27bcae876976a8b06c16acff6b833e3026e7b370f23dc78e6abda6d9f95347f5d9e379ead92660d62bdca7e59578f8504b42eac769376da49d89784d51ff2f3b3b6368ff5649fb57bdd554266dddd517d5e18ec705ea3737bd2d719465f0bd1fbae88de2fbcb447044bd17b518f21d804815e2a63ad8a0981c0cabb4040fa729e647fc2059c13a33bc43c59831a46d7cb7644dc84c03df1724306a44ed097901e0ba6013a7d1d6e4178d4d6e793a20e488a113a7d9d37204bda0788476b1d6df1c680140cfafa91b2d23e46fafa6491a803b2d2d502d15d7f0c4819a1fabb7569d955312da37bda78f855cd3aa0c6c193aece1c3dac70b95441de84441fd83dd0aa4fd4f44f4d57f00ff6bcbf474a0ad27da0f95cb134e30664c01b54d1c2264bc2582dfa3a9ead18abaab2acda44be765152253342d130c81565edde8feabb3b3a797e5754eec44ae281f1912f1f6b319f8c795670fb4e9b4b636f4e64465b6beb637745bc09896fbf3b4cae65c6e24347dedd5159aff6d9fab0ea65fdddaaef593ff9e58a7b9f099935db1dfc829abfbb83598a9695f3818f309f15dcfb9cfb66c0450e4b19fde2f766465a5bbef9783b423bd3778df66c40f8efeffb5ac0ed900d9e74f6c5169db5f639a1f63620d7b1f7f0644ada763bd317c45adcdd31ba3c53d147b4e3773ff8a2da3dde7ef0b9eb408e9282f045e78b2a2505c99a9f35d71bbbc33ac39c3dc133a5e112fce8226b1392b5f61beb035e6e4248bb035eab3744d7e117d4bb0179415762aec31ccc89a97154bbababf7f0b377fc3d2265842cd3e119f9bcf1f0b36f8f6877c08f76070ceab83b6007b81824456f139b5b1d7d7707b68d2ed23ad8f3a2f99faa451b65221a69d7e19176d1bccf0bd3da31dabd9e40ccdabb32c6aa1c97aa5a5b561a115b58cc670516343c2b38d93b84e5cbee8e1e7698eb83a90cc4d03405c0300cbb6e1dc3300cfbde606db02c6b29cab22c0b0d94f9f36dccdf6d7748a61797e49ffc5214175bca6feb6387d70719b0f5b103bffc1562341a89be5dfbfc68341a8dbacc39b363bf6e7dce392715a6199a66cfd0343ef1f5b63b2c6d77587f34045c75d95d6d59d7d607dffab63eb6ad33bdb1b4ccac8d295f7dc2659a7df223fdd15d4de5bc1359cfba24e38eafe4bda1655d92f163edb25f5963e1d2b2b3cfa871d5595d2e49dac5ae24cce893b24ac6ce941f8fea33bec8a58af973879a6ba7d3fc896992caef50ef10162abd4768ae914b55855d56c35bb453a2b57cc5c79eb462f2588f9f915af11676ecbced54d7b4a893d756a4d627f3b6457b2e24ae57c76abc62a45dfcc33eaff75efcf5de7bbf22ff7aeffd621fd8fc84368e9892e2dfe39992e2233542c7fa9bacbdc83e2f0c931fcd091e230c58206ed1eefa8c875865e2b3608282fa47a6af43f8a3f5f5ecbb0971a231263e0968de1df13f55671d33c9fe530529d2d875f824a0dfee8811abbb40c4ed877c5523bd7abfc324d6eb7a5619507e4afac0384df839537dd18ebf9042b60eb9faa0f6906e431ff8acfbd8589f1797aeeff6c38a5cb2acba5cba2aa41dbc13ae95c42029babbee639d2145987672613df1fc79ab5e54b3de5dd6bbeb3ed7131148d14c9c54fdeec4ea26a9b6ae032d5a6d7665d5e79dd1f1873b9ec4f3869a5fd1d759afced4095fe796bf7c3af82c7a6bff68cfab16857cd5ee7d6f9d0776d724d53fb663ed81b567cf6fc3dc00f7ce53bd7a85ed17fb62cfbe4b33ca614e5e57d5abdf1d3b9f6669d9eb99bd47637faffaccae595690eab3462e8db0bfed55717d6b0d97f658a5e1d256c79ed52ed5d93b761df8e6ccb0ebea778c5ad502c1977181e01fb15ff541353c46212f10fc8e012923f45b20f80c4819a17781602c5b8c3e210e9e87d3986e27ff7e51d2ab3eafadfa43cfa75d7447efab94f5aa224c29a5e3a5bc0fddc9ed6d24eb83498fbeb24fed18febe5babfa04ca8e5375a199531436d174bc9296efd11d4d3fa9fe46c0752f4ac7772b868e47ed3988e3862a40800110b278090a3a557fb30a8a3830c10c442003229c9e40d9717a179a39ed9f40e1937521049cde2b2a8480138a8b21efa824204efcdb82e26288f5aaa274204ebc55515c0ca9fe2aaaaa3d16e20c0dbd77bb65df404513aea0410b37f80215de31a5823088f082171c810b0fda70dad3beeb31e44141a717854d3e747c5298630ce69b82835b038bd01533b48f8e278b8f11a8e19f1ca363955d156fd5254ae00ec0b4ac4bdec1daa1aa431a05295dc97740ddbd437925a92a6d2dd9284869f90e045d5975c98ed1b25a728027432deb162c45e0810524d40e8a867ffb58011dbe82da038dc2840953e5845d09c251021a5c6185490f5674a025e8c7891da3af04f1c00212829c1ce0c91014411b0529a77d07829622d8314e580dda314efb0ed5b276ef7079743b540319f4cfeb2b4135bab08311942128e8b415b5075af2821864418a3382824e570deae25fe744c321315fe8420deaf02428e884c44c730e66fcdec4dd92c41022dba5e16795075fa2914bf0441e0ff8215c824f824b49c09c330e3c84bba527b05bce2568012ea65b2f0ddf5dabe81f11dcf0376fe1f5d7912f4406295608ece97a3cec180f82f5110f6f04e664876702e6bc13bc1330673b3c148f08ebf0539e14374a8a1925c52c7ba7489398b764c44eaab493aa9a8476c19e5925c9ebc2ae48841724bd98f29263d3f5fdd787c513e77703221f75583ede79c75e9db71d1a2a67a44e5e77cfc9eb183f79df7214c9ec3deff0f03f1d3b8d9278768c9e87cd933477e3b1bef4acfb7874dcb2baaac70b45fb784818a912ad232505813dd5e1b7b79963538fde63b4473fab4a923e1270ef355cda57cfaebfcde76a9bddb1bf28c7a5bd45bf3bb60ad7611d969903d7492911f23e29caaccc44997bd36d609a5f25466dd7479757e5c60c169cbca2bbebea02c1905584129e34c6e1334db3ac5d09c6dad5540cc1d8805c1d2b1c4a01d7bd31869ac7b8b8f44aef57d30fe6ec697dc0775f082ff82dc17d3fde713730f25556a64c993265ca942953a64c993265ca942953a64c993265ca942953a64c993265ca942953a6ec462bb1ca19667011a38b2c500a8c42c6172d6068c15638e88c2e5cbce8e28a27058c92dd31250c236e76c7144e0e4108f77e0960d681ebb47e2ee0de3766be1be0c0072f079c0eb823dcfbb9a6def341e1525107a160152c5ce845bff9de6b8e2ae8964bfba00b2f80d1a3dea12e80d17314df7bef3d78d870f72f0d5cb760748c5f801147d070ce108cf31e2f44f402972d4074371d77a8e307a0d81defbb25288c39da0d430b162d9e0479e9f2851754ae2803cc9630b6c022f4640c2f435f54a1624619626ce91e40ec8e25435ef1fedece9630b6c01285e29331bc0c7d01ab402a669421c6962c5b701416fa32061843afca19662c97b70f8ac4e83d14ee5528dcd6dd51622cb84e88de4721b8b4c7e9d5180b4e4618a1a8c7eed8cf572d644b8a8430a7e0f69319c28df1410845249ed87c6eae4d5e96b937f0d99966b76877d356f71a8bdf412320ce8b4430f178bc7367281c57af2938ebf33d865144e291cd87cdb5b3c2840973465b5eba34071942d16e3fd808987331f188b8a9a9e1b6da715af87d4e3afa05734a378f88053c1eafabb96efa01f5a82ad91dcf092ebd053c227679605bed6aae7771770b46bf4fcacd28e0f8dccba6ac764c9e929b96d7282908d7f25ccbfa03d6f8a470af2202a98abb3ee2c522e0deaf7718cc74e8d09171edf3c0f4dbe779e90bd3f611c1524ced7af6b9555224e34893cf0e6356b74d887c027ab720f21d379004f4557d12d0d727f7328651d484db49b573595b83709585eaa420d5e5abcb77d73124aa63efa2dd0bd35798c6aceaf2171d55357249d60bc8a853d67b41604210979657a98b42502b1b9e2706edf278f1150f0739e17e164f149109415a1a3ed5bc0149750cc217e4d71d22216b4c598fdb50460ba077a80b183d474fabaceaa7ab4b788b3e8ee752256ba744eb7ebadb2bd19adfa59a253f305c7a8e38887bfd9078fdb474972eb6f04506793dd335497557d7bce6c677788d4736d9788d1eeedab9679f1c9dcfe8e85df3a2b5dbc0b2052a9c170d7f69214bc36b1bcff651ed9468d526443bc73da39dd699ccbbab33d2ac3c315554b98f9e89bed12ee67b06dcb80c4745dfad01af6fcc60c171cf1e5f6d48cc6be768f7d3dcab0d89ec23eecb3924996bb5230989b9882453796244db3f3dea625e19f1fac6679dc182d3aa122d7e3721372eaa3d372e537b6c5c53a2b55695687da3663682bc6be78dc7468d5caaa9dfa1462ed5182131aadd6b1aa7f96e48d038cd69d00ea86946d73e35faa496519abf0d898ebb66a44510f6db90e846e7ae55d8346a1745d320c14df30c89d139275a543bf91fd8345de452f6515d2e6533b54b354d9db93c9cb90e6774a676af334dcba8368385bcf68bfebcce805ccf1ec49182bce6fe9afba8f6cc4ae2791ffd7d54bbac67cf3cf6c975d1a281e81dda82193ddf86c43c86d16e9efbe4a8e81ddb8250639f23ba9c43ba8c4ced628f1e73125dc689197dd9a43d866e1fd14e8926a24e5e738f1b0f3777ec58ed2647456f13b2ccdb0fae8a3ea231d768a7b576b8f18c1ec3add14ebb253a474755e3d2766e51ed997f9d5695683d2bf6e5daa25d4ddc76649012ad9dbcdd7868f47b0d6b588852ba9f18a9c415c42ba294b882482552914224c6f89e7c4f3e6626c21cc798bbdd775b2960e9aa765074b5565b5f2b2e7f2fffe8ee5ecdd4c7e2b87f4bb765096616cee8f934c82da10c6b1322aa1595c1ced8b5f858e50f3f2b648c1b1022cf8ab8ed700d8d0cb5b915c3d111ad28c725f86ebb58da4584a59473dbe13a072ecbb4f958675e6133f03d76dba50b7f06fc8b5e435c77b512ad6fd8140fa17c7cef85e162c7a3d3ba887e34a420b56799cabfca5f5244f7bcf3a7ccbdd9d7cb263e6424701d8fe6ff864d95c531cebb46735d8fb18af445b9acbeaec35587ed30592e2d97aeeb9645adec4a761d9851583bad2f8650981b04b7437df55c0d70bb842ab8f460d33bf786e8b7842ab4f41b1a5d8bf372fe84e382672e8d867b61e08a807f17824d3d8660d305b3b8418b2bb861087590c109fe82391d40811844288210983a8ce194d3f0352fc11e1cd7834b420cc1a58bfbdd98ba1b82b4023788a00d549ca0092638755c33b1e50c61708213c05045164e5da9611dea2024852a67d88109ca382d971c14a0e1af83867520c30dba84610b2e6da0e2b443bd23cac25dbd6cba9ab9d4e0ea27cbf0a2a366715e8ece85f150736353f30b0c4922892144b8a484514da2269545962c36708318dc508735f0400b4b5042183628c10a0d8430430a3833cca0dabc26ab49c02be5c5162dc0a00556a0810ec4f000178001032478c10a2d4001019ae04319c0f03084c8962c099893d59a2d0c38011729a8c0862e70e0c1c92a82184154a0e00a5acc3034802db432781163535323448fdbd4c09c1bc6797f279244cd4b357a87b848e9ae87978b2f2ab67433bd39da8e36a7c77e887745ecf0233b9ea3f912a5637a87c840a5370c47744a86e86a016cb24cd6df8d6093ce2dba0023b8f40291f50558d408eb0a762b07ab1a02b6c002291ce1044f6802164ed62f9833f3450ec230b445e8c99793758e4d41b4558613b4751b368ddafae283b67ec339f0641d08ce8927ab764a86e82570ab69257a436938edfd8181eb76a8df8dd0d16838674fef242202b758d842f3d03b84052fbabbd92d16cb26c828816cefee88518bd40642369062032a56a016737dc4debff511bf97dfacea07b7ac24f96dd28ff77ac7aaacfa4a62f982050c16336c100485c01a97586a2d237dd6df132e7c5e988e87729d301c4b003e941e271d1b04dfc616205ad6af4bcbe2b15e3150c74beba12ceb6c4979ee42d0f117ed64d7b7251904b6e584fbb53c979889cdee603e8ee5c1dc5b6bb8c4875514c4e9b029892216c0a66e8823d834844d1d0fd10c7376ae042dce0a5d57f84ae4275e2caea24869f88bb71d2e83db8ecc02746238abd316b0ede87029092ec1d96be31181e35dd5fb9ec47ac3d81df09dacb1b144ccef49eb23fbde667d60df0f51049b44df9bc38e7baf0ae71cc13c1a763b7ab8a93a8c63736ab4684823b3c3870c49624818470c812c54a386852c8b2626a6460d0b35fc0e3333d7e12338e71a3213f3dd76b8eb70a5712374bc1b22089c8e76bc8d8d361e2fd7478ec7578f081c8fbfd86443facde36bd6c78dc7da2929a2e317c02523b470f1dd0e01d131e249a90e4757751db5d3d139280576073c0e5a81c703de865e804bf0246a844bf0377409c6e91b55c9ee80b74189ec0ef8a706cec6e3df9f16eb831bde067d5b9e16296584b1438d18af304c361ebf6bb27662ed2705e6f0f0fa51a5bfbe30e7e73fa6669b07ba73e5cbe26c57ba7305cce26c53ba73c58cc5d9bee8e90e96a0c5d966dad5740dedf849b76868f81d680dda5d4d83e670463c30b8ed8a6606ca60c9e20596a1f8c2a06f0b97b8fab470091e0c17eb234308ced9a122d8b4434e082dce4ab9a858c1620588e6b85d8f9513515290182b4dbf2f5c82df196917dd2d69af68dc9236aa3ea307813dd21e98fac8582e0d7f8125d8a4844ddd8641c408134e8411c61157ac5cc17225cb152f6275f556536af29decfd5acd714bd60624b60faaaf6fc9dad870fbf1aafaa4b0100744c7a1c5592dd7168ecbe26cefe6ec5c29ada9da8940ec1c5103739e1688035f53a345cb72e9a705e6eca9bbe7856e2e0ddf96d60273de172df1dd0ecd1bcffbfafb027f49d9a1bbf7a5a1f549dff2b09e51b83bac6334ee0e4b2e8e75687385465b70eb77d547854b90c9bb6277c0c782867f2a581ef0bbfd88b13e295c821f5293100571ddfb12061952ca60131836752fcb33834d5a38087ee96e874cf170078b96c5d92d1797c55998b383c5cbe26c770f4b7cd2ef2c45a670300f62c44f2850f0fca4ae1940aa6ce91df28218ddb1948e7f60aec8411d9f191d2fc9715dcd5f2a75576b571db88ea6e3e3fad88d01db733ecda2d2a99debf37d569211dbdb816c6f4fb546bb4f0a6967a4e137aa7dd24ca3d6274d35a43fb233eb18edb84b5b34efaa7635cd677095f8bc80b2721637bc85d797c913ec50aed3f5368827507eda254047a3e5a1f438ed06d1ed5000de80685e38a64e361e0e6aae4cacef60f9b62443d02cbbad4fe6cac43a939fabdff278ffa9e9dd1db14341270c378a76773c9a479970332d1fb33c70e2a3a61db29462ee4db7606856886e47efbb1e3a1c4eb8e677b0f74bb33edef73456e3de1211b914633cd3e5117b71e285d0b1a3a687c641b330a70471e4d5b24647a7a3e5d5d54b30270988237f69a59eb5abe999045cdeb2bca576343abeaba1cda257697647fc6a5bda52bc45e39662297e9570fdfa3157225ca24c8630f9e1b0d0f211581eb226c125ae8690c52d6dca726ebe9f37f409175c649f8c05d7319754f6b7ed60db11296db7eb3b5305372f2d4ec95c326d3297f571060c6ac9b5c430ac729426fe51ec910279c7a215399a2c2c7fa1e577b90c5ddff11a5a3ebe97511a2a30a78671e42bc7452b2d392e9d814371491e8a574438c7c8fad8ce798b532f171ba356ca5cd8d4859ec9e02ecf5ce4b98b17366597e731d8c4bfcae0f80cee1d7cd2cc855e87ad8d090fedac96b8544fe3934defe268f7ba5ef5864bf5136ada630d8a7677d46714d332f6c25cb80b1ab8f9eadd9af18eb9d43a0f4f836e57311c97b6684969bd72731af4758c22058aebe2b83563cdb8a95d0ffa6a7ed5fc7ad42e2c071455b5ede8b8b098411c2a110bacc96a57e222952b52b9eabc828bbfa4b6bb5c4a5f7abd709b43e4fabb26d4d8df57872f7a5dbb94c0adf6c76d47c7893c22b2cb57607d6097b7c09aeae5cdbb2ba787779c0f99efe6588b735de695c22d5dcfe82e8feb51475fef6187be7e33eaeb18037947dacd67af2c1e7ae0a1d66f8d188661d5c9eb58bb9e772ea3bf780bce424369c603652d5c92ef8172188c233fdff5482f2e5d1ffdfab42e2958942851a2162da3b47ca4c2a6fa9c9bcb472d6296e8451c8a58e216b18bf845cbfa4825528955a2154c89f6ee24f6759f515f7587776bc6e85775f2fadc67b0787928604e0ca2efae24d8f46a97fdf5d0ffbcaecfaa8c1ab86eb5505a697c62695aa4c238f2fb7d63e0acdb1cc7e15962d1069ba8b009c765cdbb27d4f245e92b6cdebd2a2dffd4c0f5bc73ef89425c92ff791d9f7049ce4b9347bda09611f25b29ca2ae51bca438c23b1348d77cce5497951b8248fd12714545d56a735a8e575608eac42c12579fdbf71d2a1e09c545050509050505090084ef22f884dbffc7b52637bc7758d9aaef1dd1aa7b10a97e42f1aad7049c6ed41017388401cf92bd6eec26ac75d55478d36c7f12e5291e23a146cb221372135bf5e6d416a0e059b6c5c1ef582d6c7d6fcc29cbcc66a1793836ee3b021d11b54de06dd78e5e63568c7d1a0ddbba2e56968a7cd5026d63c477f5e8fea115c922722aaddb5552e5aed6ae48d8039377519275eceda5dcd65dc55bb77a51e5d8f129bb6c4a5f7b84507f75087b9371d67e96aae06697402e6d4a0b9f68539343e6dd4a06f71e069c4343c0dddc5e9b08670860a6eeeacb42b86abe29f97f5c1949b9fb0099ee78c10f7bad4abcf0b8bc6f757637c5eb0095ef4eaef0b9bc3419cea3565f81aba2ac5a1abf78038d5af8be3aa571b7f72cbfc0b28df453364a3a56fb67475ec8a0bcf312e1033323232a2cb5427af676ac797541abe876fc14806a63d296280d1a2bf5f222e5a561210a78add59c80bae765c1551f5c28be945a9e1f342db12f4e20d79a159d6ac2ade8070efee80b5ebd19d929b26f9bce63b89fdee33eaf7447fd5c96bbe9569903e295caa986013d7eed5ea53ca36705dc9d244f47dc1a5ea3d60ce1b629ceaafa9e1aae7c51938ebef7979e2450ecdabea91f1ca3883b76053d7839fb0895fbdbbe7a5460b8eab74d509d1ddf34285a374c5425d9d86260171aa5b34d215d121b6045fea568c2c54c0b012069615a361f5f94474082ec10bc12558ed26530677852f5fd8b44357f0d23f74f5e7854d3b64852baa4746579f960619caf5eaddfbd295b5ed70edc125582fb04f46c85b3ba0b92cf3e7a5daeeda1dfd09d132b507975ebdc0db2eaa593131df2131c4e8ee79d1d5bbe7c58b2e5f80196253b75bc090a2854dd59f97eada47f31d57f3ae60d3f62a8672f40acd47f4e7b5a82e21c50998732d0e7cf5850be76baa1b813934b5aa7e018c5e3489ea7b53d51ece22621c5ee6e7cea7ed9eaba979ef116c9a37623e892117e09c1a88337f8dd1b3868c9e3d7abedb329a5bcb7ad487dba12a84d14b46ef1015bcf47cdbb5c5a85d357249889dab0a21e163b9b2129178aabe1efbaa1d50cfcfaf154333448530ba2ba2e76511d334bf0023b4d4c09cb838ef5aedb4cbaa1d0db757ed6cfad5f4c482eb6a80ecace9defbeb7a8bd5cfe56eb518317f049be0e735ad1a5f637d9e864dd7e70ba2c375eb4c98f2a4970952b0fcd0cb84139cc1d0a6210dc3431c3ebc683a9beea6f7da6eef8d8a0b0a0a92e2f47ef9e0e25f77574db5e112ff6df0d5fbfb2fd6b8c5dc086c196242942c104cf3271cbaded5bcd46f680b1c82396f0cc6e1aa76a5eee0d0bb8343358f8ce66370e8a5a08bece785afe0acda3d2f3656a73509fe798138db0ef402cfb0761c94ef9e97fefbb23e5efb3c306dbd7b6568ecd10b9bacf3df186cfab23eb6395eb7342e59f59210cc12e6fbc261d8b3c2ed1015be68ecef39ba3ee30bb231a32f2620cef5374563d82d2b6e47a47a746cde5e8f660266d87bd8df2d0b8b707b41d8af3bc1a6f7eb3f28ce1902e25c5f869e705bfa7af7ae30c2a5eb8f2e710118a371e9ba1ce2ba386c88be6e6d406e619fcb311a97ac77fba5aff39978d2d79580e9ebd672c9ba327f9de6baaef76093f5eb17cc99f5b2e9e5d2d5d74d5f40f4f5bdb96acfb302d9a262ae929ae62535dd031f854eef73cadad53cfe82391897c493298468c10c60b4000e6774210727ac2e9c62ad50832550210a1bb270821c9cae0aab56f769997b9ae2bad87c0388dba12f55bad39a5500293b59328492219cb06488ad2e27b27be0357859bfced5e3758c5e4de062f3e5d591735e90763979fdaa559dc8ae6a4fbcacda0fc8b194e5d2edd075ea560b8f179e9080086ee8328730a71a3605a0f7490c01737668d9b0862c48781226085588e1b4df9e78adec2e2670924b90b7eaf3a2d8abdd1256dfe3eb78699694f587bb0a13264c98d8bb5595c4c3b23ae18e35aa215a9594d665ed16868c525a96b4ae4ac64ac6f82b109913bba63d79cd5745612e332403c6c8bc0619ab4a7bfbde7befbdf7de7befbdf7de7b4f66cb16ca88150562695c823639c4e8c8257e558c314619218cd20b57151163acaaaa8a558c50460861846f98cb504a225cbade454853c37f979239465955312e84324208ab27cb20238ddbce0e8c314c70e9ba855d16a7c5eb5529882f46dae4757c97e27d609a9963e4c8cccc4ce74a09f9bdc72fca418a33e65a7d51f82bdaa24c5e432bcdf482435408b5f5685d351e569b182d4bca275facc6d819a7bba8542a5415ca44cf9290318466684682000a331400304020140c070412a12aed3e14800dafb4504e9d4ad3204752c818630c2286800103002000404302024f0c1f0620caf013372f849414a1631ed97144392e8ce47dd608d40f7155b85d7cffdc7ea86f17d30c16df0767821cbbf36df4b1195e99556fb0f911bade5d3270d03cc1e13a6d2d53726b6965350f0238b8ad61ad3b1c510af8f3834b5ac2e5f83da1800c02a6cd240307c73080ab4fa633fdfa8b5c3f4a99e47f68a7dbe73db6a693283dab53bd1eea820642d1f9a7247e70e54d2ca95bcb2167f6412cd52ec703f4b7b055b4962416e74d7dd08bd40e1bebc1dc0763624db1ad10270e2d4d4ab4251ff620142237db7034e1de82826e4535eb7b6edfe1b8755ed71fe55758418c9e2dbde87cc9a0b3a516dd9718f45ee2d05fc945774b1e9d29f5b667d1fb9283eea50f9d2b5974b6e4a39f528bce963efa53f2e83774b90b311d1ace2e0bbf1745efa5887a558c7cdf113d156dcf8ad0f14597698af6aac83d289618d955eb29213bd80bfb02fc9895cc226981858ae54d8d01ca55bfd0bd1a455d2e68a48749ac9e11806d550b2fcf1030b4a5862000f5eb57562d5ceabc134bf79fabaa1bd300db26e3e7b76f5bd64b4e9b092fd9ceb0988e97c12d1872af3477a2218b7b20d44a9e1e59ba7ba5ac050800a2ad2ec876c896bf376ecc6f6d4557bc503e55b639fbcbcb25044f2aa654054fb49924bc27b21111a6ae7fc7b343764f1db49d2eb1318d84df9323e4298be8ea30fa2783959c1531b5fb005460e2eb12bcfa8858df68c9c8d37c3369a21b840d79124e65368c5af5ce4635d35b51b1d58075393eb73bcd145b713fb913548d0b05a50746213cca05df148b6f574166db8c9815ea4935d6fba37d326321f299ed553776dac4f7856e78a8df73eee23989e1af42cb38c9b406148324fd5390cdc9f90b006623bad525268db7f505a3de2bf5e357d9216e56c4ce029159227e06c46785a82c11373be2648ad8cc11231b91b24364a6887ef6a117b680b8e0b7560c6f9518a059c73755c565ac3f5dd04c55adc5b76803f91e1228c08c112b7e243bce049a2562d80fc89653816781c86c882f7f4956ce0526236274c59506710b71188196d0d902d178f2474e06c94bb8a48a45781cf922525d6b455d108d18818b1289bfd235bea77d39ea048396a1408229523bedad6643a456c24533f117d8ec5251879aa3ae83b87f27f228498f32e8dfad19cc434ce1f69a48148f7a1aa849f51e3c911c410364dab60ec881d25c21a31172a65104d067b822f9ae3c0f199d35a8c5d9f42782a9cff7c07d9b91abf975da0ce1936692d5b4aeee2851dcda99c32fc207bf081409718a914408565631162d1a4092acd68537d4be8e0d362306404003ae74d0eec6a4606cf337901b90e0d98de06846f006e157e9ab38bed7b797ce99ad616b0f406c7d426a936ebc6331cedc634c397711b244c7366db9da2d8a1c5dd834ebaf59febbd4619746ceb8c41cb9b535ae73646918baf841a05c6ea157b431fdcf0d213575165e24a2ac95e716f628437c7525061e67e0da6b5f23061a1f89e27ee28c4e2a333d143908fae35be56299d7ef71491b5006dfc007f849bdd3e2a853b6a21f673de7c4155bf0d98e8e5f090e7238f0d8bc92341f37a28228cd6b34172e9795d23cacf41241867715a5ac283ff587ea021320e522d8f721fe4a8dd042fc07064db840d9e3dcec216e137b428044a7859626c3c81e1090ad18827df4bc7d760ae5f9b38d96bb654c3c92587ca4a24360e9061781fa774ae222f97e6045a7a046aec58895fbdf95f9124618e6f190e26c098b9250759b5fd51e2bf7ccbac5798c784fb5b1a981cecb348db72739443e8d299daa5ac2d4ea24691e6df0439ce64ac95c0811752075e4a9a1310c2aec1894494f727c3fc761841a48467808c3a52e7c8a10f7ea345267f0277a4ab3e2766ad8a6815510aac7e1d4548bf4c24fd0bc239bc533244a2709e49598247127b5fe91eccd8698dd720b51bc44cef74d5055c9d6400d3783495f9cef1e5ecfc8cbac772986479ef03a2ef06fa97edef830b2ac416d62bdd21d6d8665386a949d615ab8ded0a08330752435d61a2f72c09d05e651f9665de880294bd93b51eb68e7c3ea6c1707c90845fd0eb13ec6445215be725618cad52fabce95e969557be9ed46dbc03c96f452f74af522da54562e3e831844cb87bf130c5dc7309634c83fbbc0728c46a72f339ac9e2bd12ee54da1c14e85f4f0db9ebaecff23f3bb8e40390894d3a49998672c414160d79e3a1b9fe021a62dbec7246ec895cda5970d4cef53ecccb78e8bf1a7d1d909fbd65c88a9ee72aeca4959967337a1a2418276717e1ba2e98a9210aaa3453a545be2dc306b18632a27634ef60eb22602c136e971085ee64717113ab021a56abb418983ce487fc314a3523f8e61a2fd0d8b20db72ec9aa1101e00546452fd48956436cd44e3cb37554d835f3a34644f2ccba9c01a400df41a7219003810eae165763a60baed1c1c919d8c37c13296c378b7392bde328a7d387d7b5507aa0c78e25140e9042a56f006f6916a032cfa0a3016b44f67fb7679beb934407d5650c36b1a1473ff012c77c539ba3d2dad04f628db333ece3814168a7489379f8711abe6fef5f3f3ddac1e2bc414846d116f8d0146320ea8a55b3a254be2b8d7b94109ffeccaf3e8cf635d095ae756f30a1caf71fea49b3cf3fc6419f39c33ee55711a6d31fc87815926fcd0989b19fe869a71a4ad1604407dba7eac8e8105c37f7b9e1294d657f14078c02f4595b907d03e5e39dfb74ce0e7a871e5d24304e55f2533eddedc6143021e0ce5b11055d840fbd36faebc080e34f1aee672e7c97029351ed456228408e9ea89fd36dfa0fab23ee05491454f5e522a3119d31d6db5a1137840a262696e68b9dc0db7ff7521a5a6fe2325520c55203e76ce3c6181f56d52a8b8f05ca0e28aee7070d19371b436d5001b1298bb231c0611416144fa01961028e3c1f81cc94fbe400a2a6dc4192da8e0f6e045b5d06624ad8c0b38b5b65c227f196883c070ef214855fc670077e1a5d35a5ecf4384bd0347cdeb0329716289e41238934698ad6e2696de42ec6c5631ea8e104325b1cf3b4974141115216bb44830bcbab817e9173a82e6ddba3926a161c593920989b7888cd86044302d2268684cdd5fe155e3b0aaf462a298264eec4964a83f59bf2059289cb95903fb8bfec0ffbf05496c33306b9d705be89af0cf06ca066e52e5956333ed7eebbb26d078e1633686d4788bb4564708ad08eb9dcc5f5f6b32fa50de19685e852f5dee46d6ce23d176919bb3358adb8df0bc5a1e0d03022084ac5bc59771e8560fdad6c1dd2cd47555f1cfd77608648e4d692e59189e1aa42dad6acdd49148b45e1ea0d0fbd2f1545e01666efa8af422be83c38bdf1999cd49f90a6f7176cc39193d32d2c1b4b7e7e212018a3b1786283f6121af7b29edd801da236ea2c3de1f4a5fdda1d49109a948462ca95fb61e6669c8fc6ba42311213c5fe8416160c859668ddcad13a6529cb5b4f8dc463266a5e33b00c06adfdac8c882dea2166b0054f8f4a33e820601251941cfe13525aba5b91879e8b1a8df4f8a4ab274a37f8da301f254a0305c7100309ab6411c57110e7d73ad90269f537b2bada273de885b1cb4154035bf721e4903717839974d6af3ed78ca6750788c06ce475063ba6382e9c38a3b7262a405097afa4fc77863508e39583c962477fa3e731eca0d3d9b4006ca909e82a26a273344e8c4e49b117a4d81a83c8e6b489b4aa9abcc05405027da17738a02ad47b080825c8d34d16b6c89c9304802d8ba15ce8614497450d02896334205cf4637bf0d7df57f110ecad5640b983b2541580b1e20900f3962140f3f9e65d433ed41ca03c4eac886b8e0208232ab98583a4fc4e762476276208c10d462a16072e4c71bde384104f5d1ae1635728f4ac2fce591fdcd07f67376e4eca04159117bc1b24031e13aa7fccf80e4892a5beb407a9f8a0baadbfcb0bb6039154e31b408da7f3174b11cf4d04c40cb9a4cff1ac349303894500ecfe15fdbfe406c149d74ec3b91fabc786aee8fd433c57d064c1f591ae7f5f745f99b83a16e5f859f16ec23e306ff60158d3f36b4dfbba0dcb72b16f46738baf4a70e3ba7ddee3a5b0314bdfc7842a08eb45f18df885962ee92b078768eeb775213f97ab9d6c88c3056f4e905d7f1ae01bbdc42a294bfeb1a8be791f4df5fc38266d250d996ab258dec74a110556938e01d1244e0f069cf7d4b4043237f80177c43d706a438400a76b22043872de20803e07b00f8878da618cea202934e45b8961d138bbc196619ceccbf0ad3104f382f1ec943155de5a9dc0c6ec142561c492de3b90d2f7531c932651db57b6fcd5b0d7e1eb4c54d2047f3dc5b160d22406aa7debb878345a90aee41853d1345b859e5d1308284596af92b36cef197cd948dd6c164ea3e0f17546a1ea003241a2c49b5843063a6afef6d12603ef84e64b70bb7ec38ca625d9d2be00b50594f8e08d1338d4b51591aec591e78490a95ca929448265278d001ffd895b6e515ce9a49b9fe7441f87ec9fabdffb029a129567040614da6d5e071dd6b25c83dc9ba03e4b8309d11112478538cec9016a1081fa7bbb1bc5c7dd8e47e535f438d53047b181148c09a0ec44f906d0ea3096fe75e205479b2601eacf2b3b438c85ab6a8c0b391d45fe1c6d67061a05728811d8d11da139aee217f7eef8d4b6a47343ed2ff7991ca9a0eebed29591f1ba13c0cfc8e55fc4504f3a590e1f171e7c9145a6fbc52cad6b7fb1e5879c9ac4e068de745b9d8280dea5be67e09ed78efc93bda379d4ef08549aa832ba093e121338f6870f134670435e7ecc86a68d48b4bbdc6528650fa370d7eb77efb4baa0e8197a410a9f4e6831951551320be2eae72a10d6352e323d8a3ab7520c24a539fbb4ef543a928ad30eb277c9fb4100ecc781dd7ab77401cf3a56474baa3c0e7e199355e62dd62a86be5ac7f742473dc1f31b7375fdafdd545a483890b2ea697446f2a6d47db8235bc2381ebfcc11f9728d24d2dd7735b254b36414f65e83bbc1204e2c91666d9140026c69440cb2b546e586aa1bbac0dce8889d0b88c341885ecd2433093720cbf5ad381bd32e787008d71d9b28e15ade5b7484df932d3ef8c1eaec86b62b97147e2b0376c3afa82b5f2f9807c2e5c060ae9cdf8e325e1aa487065955906487899fe79d5e56ff65ac8b666c8ad31ee4bc83b651851b57f06fa9769445ea59ad44df1c77da82d951cf62224c5f0922c4eec24fe66f20749a9fcd956bf7ed42e26158058a6036dd7d340604b0955c6cc3d708221c0e84406c19908b6a650616c4e0553197487c41b8bbdb7abcd200f38309b000d9af33e17b7f9e4d0d205b278b397768186ab3ea7ba54fdf040a192aee471192390b8056278fd0c0907ea37a7614f94c2b1cf298e3e45dc3ea0d590eb321ea723ece321cebba66375de69e9406669f95a54082361c68532e17de6b79fb1692644fac656678d1c8f78a3f95df2cba9a8d058e094cc87982f8c6bdcf6c5b89353424ca2cb76a0e5fa656c0aa0c4af7382eab54d06240d22242b51725b8762347e943c16db702e72ad08d009f11962f08d06a407b8dd5c35c5d7399dc2e65e3519303a826b8834ecc1399ad6b3a2f51c5a1fe529777459a0e0eee6d6a4befbf5998d9befa9944371bc0617ad58cde450264f216fcea8692e0c8989a0d594a11d26497fe1b404bf13683a8fdcf33f104a819546c9db5925effdd2c53a0897555b1ed4cfc3a582fdbb73184fff8e17f1a28fc23ec7b7cc5797b3b665156ebffca9a7b69a4ade04ef3cf1c3f67fb6894d3471abc3720dcce1bad83e9666fd308298a167e9989c73bf8c49ff21a581b785e952338cc8022de2d9eca805e3d5deaaba94057b8f0a530f5c2152d3130a78f5b6630b5a43baa8e013ed5c5dcc5185176dd9e895346e0754c778c549d4d4d42e69c9113d98f54b0adda9d05d471982dc296288986ffe0842ee75d2987b426d2ebda136dc5125c746fcda49c618f579a14ecb8fd4321aef8773cd84a8b5b62299671e5cf6667d1695ba1d3cc1cc2b0606086e94e65a07fa8ea75ffce7fb0902c26fe45d139a110fb9aed245cce00a47439313318f298b89947b7211bc04f65c206f1270b0966eb2cc2d0c29e4bf6ed9d2c0093c7e6a88becac00fa5f2714b121d73b3c81b1f99bfe944bfc301e98a7526c9cae9b21cc9ef099ed1c82a2ccdd0149857570890cbe1c463e7a41205be345886809bfe34598796409fa50487a3566ae57b3471e66dc3f8d9ca50560fd0ac9d5518d85a2309f5ef372c055005c270808ec170232f2fe0d43084e2b159ebdbccfa4ce4a591fabfcc10d3b54f9907d564d10c3142612a834779fc2e41a942fca86a7b3138a0742fe819867ae523e60282ce186b79d04c296b537a45090515979b9fae91dccb0146ba5eed6581eeb56c0a8c4c4f97b55207c4bc0117618a854491d19599a8550a8876ca0dcd0f6b83ef9d5c1d9145a792f55f21809a9ec4e2753d37859867a312ce6c58a224c82d708082834ae1b1c104558a9c18695adfb927f6e54a6298a26a550967a82529e688b48751025a5ab60d2713264ca6134115afdeaaa4ce0dd00e0465d43a4d01733764bb42fe454c8a4f93ce49fa4994ffc278d57c5451d3c79fada3e52f7cbc092771f47baf5453d5ce6e22f8afd14fb2cc2e43a9c6151295a56ddb757da0c9a138088ad2864938b64ffeb61710987ffb42e19e0015fe0bce8876dafcb8191d33d25bf4efa3fc73e46ecc6ec08799247ae663c5630fe335e138e9b4cd83210cf5248f444aa0240a9bb137ea84130f8555c1a1417d11945bc82e318e7b742e9ac1391eac428efeefb1013ba3845b701953068d604b2479ad57a99d2de1e00b29076c017c4898d3732b09aac98934a1cc6c99f6f5762d6fa97780d427b710c6a613bd70f4989c548cf821410280c1ce6b9912251cfb7a01de164d78662fe8965a21460a506678da7bd3ca7c46f86a3379b79e60ed19c07e3ed4ac0c54da809ca71880ab34fe55b289e9cf55cf12d5c1a5d20433586e399b791f75f3b488b803191314c8d4beacbbed92f73214ebd93f33925d8c3cb105688365506555c408ffc0f16b6f7e411c2b644519cd010a5202fe4d4d0bc3bb6c1c909d534de9e3706479cc6f601355dfec7f9387cbc682716677c9508745fad5ebe1f38ee0b2dc3a6f3edba8c7550a630b5d0d07bc1cacc6692d5beac0346d7706353c6abe4bf20e70fca0ef4f54215e3dc92d9ffd5f7fad1fe2842a6691194c84072afd4f3f7995f65712d5ddaf60dea1f655a39845675508788eb846f4c92dacb80b762353e20616711bb511e3449be4d13f36201e9b45582b82225ca4afd240d890ffeb0cc09929d4bcf7dcaa31f579ad45a91b4f612e59e17a7efbdbff6ac4b1771766ac9256d2554c72b9477299685afba256c9b24eec26f9993726b7f86a268549bc1a40cdc1f8007716aed5b84ee3d6bc32266e343c21b038a46887de107c28c17641e14590be68b1f8496ed05ff29da441399a804f5bcf9b9ff3e8d4c891f116e80de3a0f65a4eeb4e1b852033770da4ace9bb74422b19e19efffcc5e011c7211b01a01a61604f9b000756432d2b1a98000675000d1588c355e609d295c9e7c543adb277d56f2bb410144d07827144f3754f9bcfde4d6cafd4e6abaea6562f1ae0059714e16a22bfeb77f1ba2feada267e559838fdc6875e0979e5c56c7dbbb4d635d1547b4fe8ad4ef218eda6d5d6f870cd23431abc55c011c8d3bb27c3fcaa972cb521e0f835d5b03f4f1878d657f23e1897ae920758e4339c89c2152f8e963989ff861fab23324068e8dcfb1c788bec28a8b9394244a75764b422ce19de259ab9df482d02a60a42346e182c560f29df1ba2e0d3e2091cadc4075464fd5e43f84a012866201c7d061573dd17d7d972eb90ce37ba0d4201e379ffdc94be9d0fcd79e7db9db86195be498995ef0d3398d400e3cc9687f0e884ad769d0e202a757f8c799adebc3560c0bb775419b29285dd42451e3ba7b9074fcf212d0ec40c377fa9b146bd1b50963dadcec0b5f914d40f6d7de3af9dc13651f3829f51d0b5394ec8e2033868cc97c1ab39495406d7944c422bf88f25dfc8047ad2b402b5c1b05c71ed335a804122f5d3138a513c6dde1a1e262664659168bb3e70559d23dd080dcc8844179cebf0e348e3877c682b43a3b660f661fdadc9b99f0aaa530acdbdd4a58d3570a40e24242650e5a78a830cfd568fc9c1b76f2d0e489f1bc61f181d8a69657f09b50fbce833cb76e34c07597dd8c01120fb646e4b48c6cc55ec9c592eed0d30d0df4d73fd54d103917d109481b839fc205a4f619958fbb1ce45892cd0c7c37d7694909b3d48f8730829340082ee49ed60d4b9637b7a40fa324237e4e1026dd4f045147152a8a76336eb316f744cbe1d6b18da51c0b9b9a82e5658894c7476a00ac09bb022326d68f316bc58484fab01f5a484446255ff339114147655ba2b51f8dd6eb44eb94a507287f942467dbaa639c5481b561b91f7334c82d96a1c4d3d1615bd743c6143fe8a41bfd15af1ad8417fe1cdabf100634f5c379cc9682e9a8cb601e86be31ddb5ec926297c701951e6973f5e99c1dfe22ab06026111f876ff2aa12d7166478f28086d55b2c7eea76471597bd0a566ee345d56cc5edad64b938b5a3d068b6409178cf0e6c25edf923b3045a47f3f736135a7fc56a7a1632ee85cfe582515697d2e21290200244c9b52a5da29c577c86125b9f1606bafcfaa979fbeedc6ab241f69c06e6482d5b98b09cc8e0ab604dd821c91285ea1cb67360ffd6fc2fddff88d4b35d4d82a0900a1cb79ee3605b0b2942b820cc4d53ed078ab8b7be304f26b1abbd96cc189fa959fe91da4c370c85c31a12ab12e567ea699f0343908ae6dc2fcada7ef9c03784a97a05a643d40c75247f60e31d20ae94c302825c45b936c242fd788845b56fc4eee66b45f0f89d5575e2426076062c22ae50d295245a00559ef740e4adeafa9ce8227071fe353492837f479d0c97b4aa2e8b5c13a3a3abddcbb518e6c125d2c4677a49ce8c9153898e215408d10c4583efcfcc542e7c50e88bd15492fa73234256f72bd391109677bb4982cd20ace26c1efdeb0e480b54d136b05289a0cae874afc02f000a1e3b37bab7b73d33feb4fc1485afc4dc5ffeccc285e8b61650112905e5924383711b55cde088d76db36c32d9af86ea5167b63cd745571d6b2c44a45b6fa0308bf7da0a0298463cbd34753f7a5f7f248ae8dc4fef72884c484e6801f6500f15eec74aa951a552bd9228a7a2f8703b915e01379df093891fa1e695af9685ffe65ce1c7344c9ec41a2ec2071589b757b9dbc8dc380bc9c9b295ed8a547a2fb12a7b4fa5e74f35322b3f00048fa7ef13623126f0b1b8b3ea0e9048950a8c0b258c0637ead0e48144b997c3d6c82b6e1f517bba1d65e042d7a694b48c269183fb6ff1bb898ebb7539d47c034a0bc85e08440300d3be2e5fbcec0e7579400b565c5b99963a58a40bfc6eebd44cf1c2bfbeaa6bc93981f47dc554e588e86edaca52244b1856b59716cbc363aaabadaf5c0167bec7c82482c679de08b196d4b841f2bb134024e1eb003277e89fe781fe217b0c7c6139d0009cc74b5e401c48e57dd525c03872465308280baf775031eb3694ce88d304dfe046144dc570da2b46449102eed727d508b02463557dc815d6b45396d852fc50778b0ae05c1fade4c6d4fdfcac9d3fe8d5f4f537dcefaeefdeac8c028dffcea39df69f3888451174ab1faf4b36770ce3209391abc135b2986db2131fef6f9354e314133d7978d52c07519057bcd809708e5dc94f3ff60ba35abffd804ed2517bb83f57edc8cb22457e66b4acb1138d814a4592736f8226feccf0769ea6e3722474f20ee5c961ad7eb3991fa2810da0ac785046fb418ec06dd64db753430527db42a6457a1e7a2d1d8ce996685a29c888691eaf8185eabedd62da5f15bd3817308f5265c2431693cf6911400bf226fac910ad141dc86882dfb73e56becddf52e8ab061d2f1749f0b913d8433014fa783e51b532dd0ed9f5c07e8fc25f07f39bdceb89e28e557c1fa70257ba74ba60aa125b610bcf89c5495833b5644995187b42432c175c9058ce04985a9cdb525aa1cb160a6bdc825cc60559a0cb21ede0dbc32d4fe3ad573b1a550d2892bb7aba8b31b031ee85399eabc6dff5f402eaf0fec0431e6aa32cf05aa09f3fca2082d2ad3efdd7e9cdef814f72eec597d5652200e3dc5ceef45b44ee0b3a933f3a2bc4600bc3db8e5e3ceee771b0d4c2eaeb378fb4e2f24cdf84d81a3b7f171b81c3a061fc5f2c04a334757152c460ba0d9f540d402ab69522fa741def45eba5182f52db013bf03eab4e2173610538b387d366a950f4b3de00c07c7ab08466973946554619e2097cec37e70ac0364cd9580721f76a8ce37f4e3ac3ee2c8ea976c610619ca8d5de8d669d43a912d6a7ffd2ad6ac42427b549b0616da8761c13d4ccf0f5a39d0a27ef0567b748606fa8767395f82f1bec5f6209a052ec65d3005a4b0962051a6d298964db91e34cfe0a2e12a20929de5cc78dd6a13201fb429964412301564b6ef972421a9c77d0b9979ce5942c9b31aa5ecd9b950965bbac3f69f573ec929c0a77be9f6923b440e9bc9b5562dad163cd227d0d5d7a5f968858455ba120ca11b1e2927ffd3faa0489b5404b6c08cb0907c3b2cd7f44c72cb11a2e1c0c82a4656261ae7d4eb58eaff7e6f04e7431dba6a1e173b12209aa6c1519966f302721b6c35f2e94185380eab501e9e1a47ce82c8029d8355590baee47b3503df77efbe54774ab409f5cad8706271e4ad80731894028f95548098e4812767ebc67a6ba907317880acf2c13c291a7db205dc95d070001f005f65e6575097a2554541562cd6a3c16384906d7aabd6895871c498352d06bbfe7e334686a3719a08ae8c7805682d2cb8dc8c5bee88889d30271708f8509600d67a973e451ef72ba744e3f60daafb425613e0f9f39be0407e8b90509de5b070fbc9c2f6bbf44b4fb1ace66c61b10f95616df1d8a9aa188880846792a6e6cd4f444bcd88b924a5c81daf006150c5093234a53b48deeb0cc6337ee1d85655c8274729603659cc02b06d3c83c36617aeee510dfc217c44f494a858f355785eaf673318925af7415087ae8ed47a6a9f4aa029fe1724e16e88f080063aa4d90cbd782c02dca20684081a09ecae37e8439c5217097653ad460d341f50156f95a6634f16b3a0edfcf27a3bf90e237b59b702388a893bffb6b9da047e594d527c3415e83a66548641bc8e601d4ef402c213b6b0964de63c40c1500d7c5330e061ea302f89718f5a55e893bdebe8b523209d83641cc42c0eab219b933e7a2df62f05c205a7811311142c922fb2f4ce762585c02e52dbb2b48e7a72fc36d9a6c7aa4776217524caf8ca92a8b1d7c77051d94bc3f95c0c5aac08cc47da0f4e9785300015404597d29042d288aa58c8722cb2123738d07a8ba6e40b488167bc0782492279ecc35c919eacd0cfe06acbc087b603210a0993f4a73665c90132a2022da83a7bc95abcd125e3d41480412064037cde76a4f02693fb303346511212d50f2f7ad17ed3853972bf8c5bc5c1742dfa02b80ab73c85ee36bf4e22f2bfc3e679c8743b418e9affa1685453d82e4272c3a36f7006673167d2743a05a7f92112f4aa869b8ac1a2e3af079d6d265aaad7dd00a2e4510455a2c6e68c8b3ec9c24181a3af680ab26631ed66e615ab225f8cc6516aaebebb872971c1380df8c1a5bfdb6b8347c5c3ba082ebf3016f2571e369c25a9deec50b11c3590fdeea14c5bd9dd65d7a84f754f3d5dcebb882e3155718780661211f3bbdfe6737e694e370ab06ef183541e6b79adf0cb3b30507ed1688c76f074b0d397f7364548ce32086cebab00d5b8dda55dd5016b29942e11a31480c6abc7c1bbafc8ce7835ec967fe8f1e1ad4ebe707d9467369f21d270e27a199d2a212ea49ecff20f9a116d1e3f77a9ee22a5b295aded0303ea42c47f0c5cd8d056ec39e08455584edf9bbf7002508c375b2d5d439293718fd572fb03df20fdef7fca3b3533e751b44c77efd7b79d4457b9d7d5ce315a9dc7953d63ff187605e6c90354d656a752617356e909b678741427bfd70216537aa81a3a62400896d1f6f703436c2d8571565ed9aa4cc90f21fa39632820cd7b141285536fa19711306ba716698f1de0866d7ed0f492058a788820ebfdbbcc196811905030f6812106503271d16a3a31b06df275c3ddbc87e4b8076383ff099c840769425dabead60ce36d83aeb7d06ba10811ef5897f3fe189f9dbf241971c07fa1ba9acc66b832c54774ac501ee2fe75c377f3a10bbcf3ece6e0ce28be1e26d7778ac248600031ff6b6e2d9ec8769503e0449c6568cdb13d1ac410efb2fa2ab1939e543d5ae418f394d1ab1b6f808f6402cd88338b9c34204719805fd20db4874f481965172ed2fb777d077f4105d7edd148b67aad8bb01d690f5ac2f0d77ee611350012d6555387759cbf159217eb176dc3ee80445fac3f35e2161bf19daa30db53df2833c94710ad8da564cc4fe9f246a088358e505111d732dd55b1a01db8ed4b4bb7c1dcc3bc5042bd137474dbc7497eeb50bfa7d0b18e46bc2bc0b18c769a59945eb0ab778f078599e67ac98b1a8f936143d29d71750c0a138025c887352abb9208b6637254dcd1c3d0d969e3cb26c274d6260aad8ad44fd0938ce4ebd8d0a12a4155cbbed7ee91d43e59238480276afc91b8ed4a1a82a7d2b36dc8ccd652171f1e75c513237daa79c7c23bd536cc35e51cb360d51073c72d7bc51f61c6b4cd0454466079509f909f3827bc7034d319abd4c3821535f235d2aa54bbb62bd21536726afde9fcc3cce555b750e025e443ff42eb2971862edabc233438f97bc9e2e054c253e0a72c5e8348130f46e5e46074e873e655f967d3f82f8664b915381c0ae3251d6b7973d1a0e98f0ced49016bfe43cb27c22bf242cd085a0eb9b4a0eabb737c5fe94d78900945ebd6124c584bfe0815f4344dca95bbe04550d3db491c9c76d1bc85f0048c2d52f07927d7a35a0c266f379c5d3151de0abf2b2536de6f7e3e625b327799bf664feec9331f23a62cca0758445aeb591facf24a4d18f88817605848fff54757d61359e50ab9851e622e83dc32cdffc8f02a567af46a48dc2c4781947430181c0250a4e65ac0d6ed2d0db05d115096ae5af8e6b7850d679c2761aee67a79878a6693c9b4c5960af25aa8b0aef5aa154981688f6526c9b6b76670ded7a32e34562f6a36bb196da77f219b9dcb85156cf57317623e168d9ab887ca38acb61bf6426a5817ebf81c063d497fe70a97083a7d1f8195cf9b9e64803cd742a7ff10c305cbf01273961009621fae903bbaa21ae84365f7887a012e57b94d25e717d80d9ceeac365975245a0ff36e095dd38a5c2a0c0c4a35b01544f264e6b9e0f0383c4f0bee233a0604b7a4c20a4c594682f983eee98847afc8552a8256e4f0cfc33950ca981a5be62dfa53d06dc8a1dcfe4417cfae05a6c5faaed0be0318f1734f9763fe4d11ccd682faec3dc2cc977066e663e7f28c85db917f0a654c13aa65fdb8d0b02301e72b1d77da5783779d3e0d2eb81c5dba9a561618e4a36684b83ec2ed031769108298de96dff6888e768f4408f389643675447b185e52feb135610081e5e77d9cf40243da117de365994f5faa1f91f2df7dff3c896ea4d820a2bc73d0d5450e882da14f6331e978a2e4eb8607e0af75238126eab7670db8a4ee1595f24eada33b812e72d6af5f54f4433784e6b698b1c60e4028181675d66841306503ac5e984572dbb1130b9e801ffa6eabd73b58361826cdd4606c5a5ed5ba78b0a8fc361bcc11d47f7c6a740cf3d22440970949d3143d6b43c2de20473053acc3b1f7a4b3d14cd9a7023595a9faeacd7a789b2ba3e2b93548080c3420f5ce61d25b2a272dec42a44b31c283ffbf54df14dc4b5915f280affbcda6a316eb2841242bfc58b5cf08a7a2098027cb26880f8990a90240a227a147aea834e835f8d33be087a089720dc279ecbb42e45f676886b8622a63c73ba77542f88570076d502970f91cedbcb6b4492e122aa72f100568bb45c6d6a55271f475d94d8b0f29abcc1027c66d5a3c56ccca32b2a4a3e01d240e6850cdfb079451100183fd1f6ff45b2d21e4094417750129d0fba125b545fd700a001e3f712c72d8a60e043ad1d813ea19cfebcf1001d51fbde352c0bb43e87d6cb05a12ea0c6599d0fd32f4e90246a49bfd2167ade7b93e948b1e901eb994cd3103bfe391c2f12f90d7b2c7e9b66a31817d6b91a7329a498528c8f9f96095ab5f9730d7faba79d51db37528df5e877d24ca05e731bcc7380a432cf8089df28193007fd6a25bc990a9a90f9e93d3218c28bf10b5e58333f05fe9ce2297335d62898c9457450d0cb9d106b596c7e00915c62a7c992b63097eaca5c800474f9d514a80736caf79c6ff3277d8256d93ae5e4df250fa19a4d0e95f082110006f1d647f5e7968f4a1fc1c2dee2e1b6a2c7e366732cc97ee440d8a72904d57a37229c4b1d071efe68e5517cd8ba766207a7e440622161cd1bd1a8692dfbe589779181f82e5de1bf18f40890a0896b14540adceb0aaa04e2d27bd21af60f5099d52c690e221fb4db1fb2ba4ead2a90729e244c1ae5ceda6805b85bf06f2f9edf486f0aa3afaf8899a4c9e2b098105fdef7ad02c3dc5a84a78b64fc01cf609a2668ed371be7d6fc80e43fb8895a745b6e4a82cf0cd002616d81a0c65613916aa3c61d471c413656413285d9990b885b051dfc85630a5d9f3c8bbe5cce873ddec3f7ddc80a9418ee43d0c5bebc6cb861cdafd061001dbdf6c0cba3dc9b25e19892ce887a66e1ac2610ec1c06f68c30cb9c081fdf3cd6f3ff5ee4b8893cecdc0d70a716e123de738b5505925752235f11797de5b7d1ddf35c2250be76913c73651cc87a6510c313ec5be214c9048e41ededb0ae6a6521ed9dfb5bb2377b6e859d2da96a412340b5f6fd07038482a46ba3a7048cf90a9b3fe1b761b9ac4f8e9440c762078ef79c0a4bde5a577a557e592655d6f6b87a90262c0c20532dd50613df27e186b05635bdf8d8164b33120f4d84f726fb02ec33a81354169a60ebf377c3b67a9350cab4a886d165672c8b55e45a2daeaf827fff09de393f0884f6746ac708b8f4290ba588859bb36c0b8d6b2aa6d8bd9462272a4d4454fd3d00b0eb07a8ddbc37441ac124f603a4d5e194818496d4dc363f6bd2c8422047abb54750b824432ca8db10de4ea4abcc3732c1f4de080ce21513020cd6e34eed2c71d895a80487cd2c239b0bf044acdac1792c785c458a3c56e8d8905082d5c84046aaa677c41c7b971ecadd6e9e08740de90f9e84da0f859966d99b8d7365e99e22553dd94d574b077904127157eb6b7ad31fc48e472d3ee588b1d64fb5b278e46f6fd1325f5820269fca5d53482ad8eddf90ebd3b0e0a9e8965aab7256db431835cef82188aadfe0bafdf7271f4b1f6b965226b228ac09667c770e28ab1112c4d821cb022963ee4380c3030369bc26aff51042845f630cbd3628d300f76d60893ef6a740e10288ac73e966d89a47b874e6787782732f6b193a7636c6eb54d41c6c26bbe0ce4893022fd51a8bd9fdd989a4037f944eee52ea9432bdd69d73a22218a536624e83075eb1bde137287f91ac0bd148c8613650d44ac345b9b0ece71e78a8a8f68b62cea5a8aa3cd4dce0469d34e884d1ae549e5a5b548488fb4160fb2d7422d92181b53d946f9f155aff94c2df9e8b9f22f2a5d9970cb422520be7886b5ee423206493d091d01fdbbcaabaf4238ee8637843f2bf6b2997906c79806d76d49b137b175c9a0e0f395725074e40c1315149f2c168bbfcf8c87c31843df2963fb2f4d9e7d22cff84466ee6fa494b8e026331213e97106709f9a6c1e22efb97fccfcc848a53b3121b90274edd85e26caf49e343b86a5e493c2e44169184049e475dae8601ccf3f46dcb817b4b352adfc7cb43595d825590bcc033483052785e9a6ea285312678509c60e6441ec403ffe2f845a560c00fbec9b990a45d9bbc5ab0c6a7d2b944c61deff734913bcf3259210830e7ab8a0e19d81fb82ce2e1f3f318daed7afcb69ddf8e7c5ff5d777f402baf33201ae857089e7d8e4f2bc578dbe71261fe789062452eeef1a2a720b7edb47d8f469de5d66b832bc760a8390268408f9994fbb3310fdc3b3d98f3db6eee8e60f32fb7bc6c0e4860ffff15a453e1c4e5540d648498f201da2bc32985c3756328c1819c03e9f721439c90a0e57aac80fe2e072a9792324411537d7bb10b02044179bda1d51c9b67e1b8ad128cac0b81ad2ca70353966c91919b6046744a8d8a4d0e8519bc0af51c0c9538cf9c9f226f8b2b92ceb94b7ddbc156f4e01e645a40f965b12659ecbcfa43015f07b954dd62cd3f84fb8505327c6d0fb9eb099fff396fb9a451ce92d220823d78f028bb2b28553ddffe09cd702d18e347681e8c73071ca1268bbccb2919ec9c873db5c54f1c264a70e3e724ad253aaa882f5160d8ebf7d250a3f6a9698a9981b338970c1425864a008280a78182f60d696e4ed88879f40c57e68534d6e463601db6c45a2e622373fc3e69a39d1767412425a934f032267b9890869e2ca8737e1f15674408494ebacbe261e3f765d8bd93228672a4e50b9ec845b88ed78f4e9658c1fdaa2160125f3990f3b73eae22e7c08a753ce68f4c3854bd47f02d3f74c9dd02676fdbb85151251fb1699e35facef54f76c472cfba3b05a98f6ae2ce7f42ecc89f210d4837bd99e3aa43ff4863695d79bf16346ab01d254f29feda8ae28c25910214bf957f739a6a48ab572be0bd1d9ee7622cc19e1a7e6c5e5e35d5c8637880e567f8f079f42c25221248bd5b8fd60f88eb574ae7ccbef39808e80c513d9a315bdc04aa149758afacebc5a1764419665b3e2f473293c6dbbac32f83736be7c2eb59e584b6786b10ad741df8a5dd9a2c77881eba5407d499c7dbee89ffcf4c66b6ecf0e86093c1ade0b526495f008b19dc49008705074e3209e688a4d7e79a56b34c4b14b2d578ecc6f58d7a1729b2a40b2a7ef97a753729086fdbaf1c04e297ee3259397feeb23cbb78a8f2cd2dfac515b167f2d3be8feee118d4ff5e0c19d635d72ba68ef7a5ee0b582e873f1f62adabf753de8b4ea70373f3723775072ad0f08ef3950753c2526133641e4c60af8544d0d4bf6f3d62134de49bf247232888f37615b23404805d7c5ae13cf22aa0213bbc59cf98d46d0729eae21b97c23546295dbec6dc0e5e0665f6323a5a1ce6060441e04558225896131980c4a9a8b9d3318780f58cde00c133c8d60848e595ce8fd0462c9dd7e1e7c414d010b4875ce31faa1b082137d18b08a5134fcbaafda8a0dc2164f120f77e8c6f6a1ea60ae145c769588e88ca79ed0640424b7533f24c361cfa5f02c1814ce00c95716f9761e0c74a65935b9cac26408899cab49061c660eb232c76f24616e1832c30758b96b736429c8a24ec76d41830f2933c27b8a690d7be5e6af452728b8114d01ed7c966ed3e30dc14a342311be297abfa6c7ee5ab6635708c2d615619c34771dbd635886d4f606756d9c0e901dceb00e0b5b51df1298fda1373ffd1ddabec7d1a3a1e00809b0aa3d822b85253bbea916005847e51b1ebcd2af9bdac5f71f6fdd3f44d318932ab373c72c10faa5294d20d245a1a93699e60eafe3e60aca4397c49cd2857866432b169294b7ad5d3399fe93cfa8cea2197de48952ded25781226647b4286c5fc7086259feba94d7e0680cc1d02d379c7eafe385ac3868f4b32116299c48a707c2c33576d4e866ea99bd954191fc2e9f29649b9c3cba600d3d2848c1919429d5c7ba749056359f4cbfd5917ad54cf5111fa8fcfe92771a67d5a7d246d65e30610fe2511056aa0939ba21f0fbf1d97245b7ebb5b718c9546bc4b8b7e459672933a3277512f6a2289f4a1c6de82ce97a9c6f0f484d282f53facaf0fb9e3652006483c726e95f914602803ee2a165e74ff051b755afb09e6004975f63d972c96a1976bc7a275cd11b611c34facae3272b3ee8fdc98b891cf6431db1443299ba27e1955b83afdb7ed0f69a3f87139c3596c1f5f9f85c4b14c63c9f02dfe4c9e1dec2a275d61eb35115eaacef44155caae9204bb7c57be5bdd7f0c231c6dc6c8dc6dc2cad99e705ebaa5a28efa7619923e762011f2eebab7744dd16914a80eba33f7d60463ab7077a36eb1d6519b74c90479dca41d3a40f1a6318248972b3735e36df664ba790b5f8e0504a8c8a8fd29c98217e587d75ce4e2fc8b0220c41fd1cdb6e1d773433796c904f3b53ba82a04458691b13f0aab13ca09fc714ecf82408799009932ecba34d828c08c5e609d306f69cba6446bf41b8d4d9915e93c65e5cbb4314f54d6fcc1ef1453e1979f66810af580c2dc9d0906a8eaf032544f8690f9ccb13c643f519d0a369204f9605600a300958e5a9439a868524902d94236d465704f9e9ffcda1c9363dc4e397742be4846258d0e40ac4d331908716fe8468b3b9d8b794bd351f1a3f42c740e5166660d03f50a9acfac4c4d13f14442fa9887dcfda7573dc5e3f61e11759cb4c3a886e356389567e76bdaee05ff62e4e4401faa72741c1f962c9cc6757b6f30e9d62798144acce5ddb894a9256d6d088845dc71447a28393b1910f6054478e742f91fe7ee31d9919560baf95929906cb3b484a7acacac96f36c9e82b1e14e8f6e5c36ca9d0018bb2b5f4fb5978d7db0a934ebaf65a2a6cfbe5107eb5c946c913511ffa33c2b73a1041dbe6675d0f2477acef1d2043d76b4483a7abbe1665ab57a9dea95ac0437e94933c95fb4038258d5dc5b9fab8c84b5517034b9b5fc4f6be1d8703e562c4061cb9b091aca9ade8a7a4d3e082a1d6e9f2a44acc613733f88231648e47a74d1b4bf5f3f7032d417dbc07e8ddc3a4b6e594011e561abbfb4040681050fd4ded40159463c265b7898753902af7918c55445cfa2c400a092a2126065c3f358748e5d414d2ef0ba823cea8475ad9d707aeaa315e6d7c49c9a156a745a4d0e53e141154fcf23a121c3ca30b3375069c742af5504f11c1910f9fecd8523c9d0e4f6c4d4c2abe6b335e8bf3e7a26e0e2e1aeae1379e0fa9330bdb9bad19346b63dc92f919ec06cd5546ef3185fa6c52c87dd3e7680d90a4d072abcf67ebae374a983d1b64aee8dcfd80040a05646a58d42a9f47dbf09799bb8f68a1bc39e43537c5cd530eccab534ef5c8c003affbd8c9cb71909289e145ecf4fcafe430cf96d4c9c849b8893b7cd189dc1f4a07d760a1e92e0826327285e5ce8e1232bded13d0352a9450904464a0dacaac41e601f9d9bc60341e2b82768f093a90889e03270040974c99178453005513699214c32acbd76357f0d5d8533781f8a3454088b5319f84e32965fefcde53d03d76af855db752791908b8efcdc7fb7434a476089dc67009fb80b4baa221e9e019cfae9fb2837eca17df90b84b0b4a41c8d27c031f6137897769ba96e50852834a580442b5793737720b95ba456fd2c406ddc19a8ec1b78c2da0ae24729000d040324aa4d25b0e0c2152e949630d875f82b9259343309123dc9651c43b23989b42be51ef849aef027c5f19444fce3686c118d054ac9feee27d50d1138ba962870c28c2ac120d3fed3aa609ac4d78ac18d065c97b384b29274f829530016a9f22d7e9357d3a05c3576f964c2bc8c1651c2b55822d7a2e752aa599197c41ed7fed9f88dac17960592a6f2015fcf3330d89a7f918b8a4c033b712d451e4b33c3a5cd40fd859fb647004fcb8a089a401403928d045794af7438768dd7b0eb2098d3560040a08d0b96b7960e3077484c238d490ae2823a28346f9a9cea77903b2c49bf92fa691d40ed068b44aa943df50fb27928333ce167a4e6374fb4a435012f94b5eb7294a2f0dd2d89213030630342c292149e3c829f4f7d37fe8bfde385f28893622df94162372b1c647c00aa7ce1f1099df07d0206fa831c85251fc6cbba7bcbd6a7a2d4423ae0154a4d5c57c37d03f75754b3f3a881376be7adab234cde36f4801d7c6b562457cc73df5ee550d94b95bfe4d4453d3c76af39a71f67c1c8e5205696825d033d5844f65f98926f52cd46577514167a8af4f8e9ba3a86e36a0669381709fec49c5ac7eabd4fac1c9ac1ec3cbb18dfbfa5f260c5b1d094e000e2268f01690d176898e5b632e2db53d160ca7009874933a0b9c767e901160e05a04a070c565a87223b00b197ec190f9e19c1fc4ecd60a3f1b215845ba5f9883e248316bb3b9831ae9ca75bd50526306e8b897777b866d4028a72e535ec9dfc838dca5f5666ee0bca9bdca0b93faf35d48b201821c81a48bff45f87b1388d106813d9b48160630eecad67c7dd2698428b0761f4d420e01ed6a265d593cb455031e566713863f04f02585155a51f095dc23575f44bc4a05be0d625952c68225a337225103ae482ea591142a02608a8368546a3b1c525d44f8f94e2fb62b07dac711225782fa409c41205bc6573e95fb03f6fe14e0f48c402d7254ae5fb3f0de0640325e57f1b20a9def0e7dda000ba7ab72e9ebb8e86d1780426357356dfcd124a1dbc9ede2d3d7bbd7097dfc85c521519da2439dff161283c60f5a81f721ec4f0424b2bf9a08896d632b07b8ed5bd19a0b12639239f42aa8970daf5a2e0dbcf179c8d1d5775ce44cb79f9b2fa88057dd68baeaca8f43734d29ebb0ce43a42b0f72de25da7cf11a5f445365c4341fbdbd284654665d8ac6f7902957056d12141ece19e11672241488aff930b7326052a28c85f88667af6b62ee39d3b13305512b0b9730f013e868b2833e8a64a32ae7a5208cad79ffdafbaad28af08b83ffd3285c355cf99cff20f7db8bc6578ff0f89f88230ea62070fc39b1c462859b90578d47be6a2ebd1a8bc9f866aee1885e12867c8367fc54c0b35996a069ebc77d2321288962a1d81f81dc5f224e9bc076f2f6456446b264d7a9a3f6f7988ca98f8923c08f5f27f88f2c6581f4e892c43c0ce33869ce761aaf4336ff235c6552eb59632b9829dd538c9d52e2df49cdb944be84bfbea6db7bda7005922584664f48d1a5395037c28fa935720a491d92da105989ce518ce82e2e7c3ec22ce5b96487979edc34a0590a700ddbc83eec38d6656816bde799e56a3817d775b4e750bec0b3841c8dbb6c6954868560310ca1120763376ad55dd93428467dff5347d76eae4959738993860bc2244f032bdcd821632ac0bf8325a300e2b3276b4e0d4885ea0d781e15080f724e56af0ee8386a7a3e500d0050f3976dc66bfdaee01f6fdf2e1d01ebdeefc9f9801efd44b9d104ec809edc879d3b04da9916720faa307735b1e01eddab2d039018fc82b74316f13bdaf2037b8647eb4b5c80a1a7456cd011c5f0b6580e23eab18cb3b321f56745c034d2a881a7dac3007c5024f462128e0332e216e9bc247dc45ea3573906f6ce9cc2de4c124f92afa256cf9af80ccb8316ae167cb803602091081c6e1e0fbac79d586532cb27b4ab23ba8195bcbd9fba8087549b4417e3fe936130b32669b9f76cdc8852d1d50e041c45ff7f00baefcccfc6243806b2010f895eba30e0126cd89fcab948b92501370e107efd71fae53e7a4025db08060f184d06555759008399a8474b014d373b45840436beb7a6a780e551acf5c55b0ee4292b1a72d46bde0a01ec9fc8e194a936b5871244b54debc114b6b99286d33c2a75947227997196a5717538f1b704a240faa6628d005cbacf186c86f81db4ff4e84cc2b8c102a523ce2f4da23ab643155e947d4c5c70ac5cac69908f014f495b5e825d4ad579b25dc77922bf30d7f6d1124649ecc9081f1b9a991ee8a41b520595da9067266772fb71fd26985a29df2aeb2c9fbf61b0c194117b1295fb35c6e0e8719e6ee29620e4444eb1c5cbcfea20b1d9c8fb7957eb76d1b3310a2f9f3e58fdb5f13b6ab9f264312d6eb043daa78416db7505c910e468e717ce633f22e9d3d6a2d90b92e9462030e003d5192ebd91a304303b1c34b7c446067184120ffdf19a0ecf47696c70c1e2326b1004686a7cd934016fa618e42c29ee78b5ea0b9692045188a88889e3c84a09b2bbcfc309c7649b9bf84de0c4e5dd0aff0e6fb1ec4eaa40f20458223f69edef41d39181306a052962405dc0823b28665fdd1959373ebc80eab75e4930298909c15ba93769f34cab71258b6a51d605373f20198ca5694d4ea6f60c8ba81dc957c770614ac422985a51bf0fa548442194554425d14494fd4bfe7e2195b173804ba5af35ca6c39aa4a88d0ba8b2dd71b8e45997b360846e2f7a60c8e709a0aa3cb3c40395786212126a7842eb373702f457e8d146c420e04609ba418e13a092af573154de66a85503e3e73e7d139191ae1dec52257f8b5875a77ef93ffa5c6a5d381873fa02f908b865fb20c19c93493e1072ae6143fa0694b2433747020a7cbf79dc4352c07202ecad1fbe46cfc9b6058933904762469aa2e3b332640de2e3ef9c93e3e5e7ad3f80b7800d2c689e90c7e474dacb195165e0971bc61d2a6abac0abff1c5aefcd30f1db66cdd0f9c7ebf3b7c2279df7ec1ff0bfe2f9db5b976e80b1c7402cdf141f38fecd0d82380be6b35cd72447b142558c249b694591c8ce125d0cb11def9983e01d6231aaec47d8e0e689c655ec0311dc97c0d137307f2104f20d7a9a737a1914cd01b53cc2d204aed63ca56d298c0314dc211bdf55f26ce726c469c89cd2ca4c41447a9aaca43e0c8ce519cf4568306f6d898d93d0e8ebf185f43da0fc5c6610a222976e3125930f6bc63954a047e97fb667059ebb3e6c673930e817b0801139f5a32132d448495c8f4843255908f4720c2bbbf9d9754ef7120043af13176ee751dcbe15a97e095bcec9ae786fde03771d80162196c9cbb6b22897d9f7c93c3f9745db26a91afb92d79a973f88da898bd8cbddac11175267393f13fabd706e72a67e0c10190263210b0fcb2402d8e81f6a22d147eb9577048e5aeee60f40f0c5b02c81e61c92fc7e09dc2ed1f5ec13db316984bdb718d7289bb03e53819237f08ec8cc3e5999b9573647b9f580310c2621fc8cbd93dea3a9790dd215c191da2c9cf5a7231f2ea64ef5978f43ac9b7a7a574da85ab4fb4d595bdc80ef9d0297e6768cb522f3014976e275cb55cd25d78c1567c84063e40adba2184abc7f83bd60eb617a356781fd7b1c0b27e331e6fd8205ce50bbd025a7b36554adc8f63237811dd48c29d8bf25c9097cbe111715986c8c86c9a7222714d5ab5b3ea9bad9eccab4eab59e5f86e42ad924f6460a41bb80bbf531c18d950af57a755859ce47cb2ad1540998cef3a4f26b004b3bfdeb2612c99161c976ccc87523f222e22e03707f1db9fa4bced9bc2a24c793e3e70c34baa70af9afe231002b0a1b3e05e45b04d661b963c4a1fdc06bb9ef9e2dcdf46198604968148452c1bc73de45cdcb50e3a0608066d9cbfb02d368724c6cfd795fd80d17039c987ec113d4c3ec362681ea8af37a53de66ae5f1df0ef0cde5e0a16aa1683debcd3349a8f7833476f492863379630ab9b84b8b4d8fe358d23a16383fb9b286ee69aed1bc8530d909524bddb53122a7a859b11aa893cc86017ac6b0ea8f4cdea2a11a04ec8e4cad906a5f54f26b9bcca147cd6f6395fa19775dc76cb73f468744743255e31a56f21be6ee3c37c13961960b0aae18a9ba39bb7fb92e3d768ef0c3afc163084f261631e5b90a957ce2562c69c43feb872f894664185c004397569a7b02c229249c33737043fe67f9f4bd6c2380c4a54e6d02308d0d415fe2f10e853e10031d63bd98a1247a8de391c429a9665c5567a1ed965c2c83820af675cb6a8b537347e2a3f2f566ff65f986fc2ad5783f92c79d55975882eab53d301f199c587d7cfbcb951d4e47c90b98c7be7dcebc0a67f2ec611b613e50b7be60c3f4c59066ed90cb107a026d413fa0185b45e81dd1fac1b76f37c4fd7f259db319227b884671a3730171f6aec09abf9023dc079df8307f21b946cf67fccea42a2f3b9f38a4c7f97efc580a840852e5b5e5d2db103307926977ded02f62faf3cc31265a91217a68b50d5dee01d8e7146ac9bde209b483a482a163dd9d240331cd65a2d49e28d2f2bf74f9841c57e35014164364f049fe219bfad5267ccd03f383cfd960c40aeae5ec60e23e50118c25a08ec9d33a0dab176d126622c2d572e65f6ecd90ec84e350cbe5153c940d9c11113f7309d32a14b8652b91a734225dde40dec091a828584f60d191e7214b28bb446e535286c1b0df441f9438b0d82884b5d19063ca020b8f52780bb9de65c8882d62fbd0267533d684607f81202693d7f5ab2a21d308f031978c5f4e45aa4f29904d8f9e7f381a8bff90e0439f6d86fd0dc4f786cdefdc9b48676626eceb15f7c2770cc4aad5941ae81509c7d2a850b4f613a2062782ead4478362e370f8734ae8bd6feb019375b8ac2e62bfd55801de49912387ef5631f4fd717f711041814d720a93411f5eb630bc2af02175f80d957b22fd67c666527d898cf0bc13c2292a592ed375df2aa9b1c79ac2a586230f2a53ecb46b751a28de0b86ae0caf646f4c5bb6ebb712774cd26361d62e80dee904d82f8198a721cc8172f8db2c51195db34f4cac41c9421e5acc51fcc080579fa6659c79dae7dc63344b309e3096118a4c38076ab17d438216b6034e78e7ebe3ec305d50445e9d965b3730910f68544179b097004d92141b555ae1732a97a2bdaf4ec39e9225fbc2c7d23d6de71413ff9b8d8b525c08f6a4efea45ef69da2abf03da97078055377f8f28713077d673724cfea576778618743abc704928b27766720bfab1b80b372e518b4ab3504f5c75eb493e9756586cfef0c99cb238d3177454a382a30d101e61c43076306fe7a8379cef9208a1a3486c6ca5d5b42cdd2414c91fc88e0153d8625838bb36c722132ffd07836d69ad15a3e40ee05349393d80318323839f5eb4ebab8ca0c06e909e03d0f91eb79ab1a006583311cdde152a6d3a95840254d0a5e3bd1f97c792ed3b77be8e59e39d4e429c2b4f3be02dc432278a37de2e7790589e49191e1750767525d0b9fc51020636afeeeffa0ee1164d89e35adae115dbbc6a99fa23cac143804a381afa4dcda69f3e96bda101ab3401b14b9c9bc37dda6d904009e07d7267164e4df10453f720339a7b9642f6f3970bcf1bedf7fb7592b3629770509a4b263d4f7edd754dd248dd0671222dc58aee125781acfabdc88a61bf91bb109f096ddc773f43c81638f06e8563a02d3dd7e03baaca2d83f6b1de43049968498d1a1a29d6334049a33ad3f432b1efca4e331a12c05121fb77384b0cb3f685d3459efa155be45d218cefc6396e9e1b0892b92c81905801ffe6c32ead6955b8d016ac930e77c1e864d9ee6cdca0650763c20611ad2a13b55bda9b25a54d3741fdaec9fd6ca3c7148ee83039fc6d41e177acbe1d5bc3fd1144751ddfb7f6ec97b435eca9d434dc80371c00484b142a2f909903a0640355aff915ec4182372a506610167ad865267723c6455d5e7ab7cb1726153a6f4f70191c6a0c158eaed20e1dea95594f111b8289989a373c93db916063d5ee16fe1b97e3067b6a27460614311853af11beea4653c71c87b23afd591411325331a47c24cfd3612b568bb0c168c65d1d2a9fcc059cf9556e5f0f059f55801f19e6ec0da111d855109a7e75d18ffb75a2c92578245f1a7403b7c9989c7407903e7b2ce94e42f2344cc0ffa628a2912fd1f1d1de082457af3a886a658b7a870632c53795156acf93697a9448f2e56ac85aa844a2c142d62a1351dde29f17f8c0a3faf872330eddd08a782cfc7c2f0317eefb4e2b89bab6d4c483bb3f7ee659119ab99bca915e56d0c51ac4a531c30a33972fa25984c702014d23aa70d1d7d08e9458b053620d5134eebe945ae671ab9e5d2d6630c398445678dba7a28495d6d2652ff0ff2018d1a420e0fc966046b962bf20b013a106c05da7a224854ea2bb5e0c6591b4a4477cb239abd5c774f2e7c7f7514b42abe452ac177e75b839012e10e9c68bbe5f0d3304f71ce5e3eca671805015c739c9952fe250307e173b560e32d9be2cb5a82dc09de9a2c05a172f5ea58316446505ecef6dcc3fb22d2f08e6f110ce2b42ab9ab959b1e0af929b185915a14fd8e9d1bb50f8ea195d0174ded7e371e17be36b0398180c2536a5c29b65b555927ba67a647a0a8d2dc53a371775664c481b63b09fb8abe5f238eaf10e3c5eb178366226f5db25d10b9643acbb84fac0fdae92521d5c1e8cbf2cebc6b18742f64cef41ab0d5d34b0b7e1b34b6098a974e7562c84fa53aa30a5d751d1ab6791f7cba7bbc3869301c86593347ccaa63c35fe78e64f2584cf050a9602aa8333590c554827b35458aa2974857d3b292f5ce784b698057893409adbab34880fe565c9e0d7f9f06407dd31c590bb6109bc5ea605096727e5a2aa742b716dd63681a91d2176e4be7213b5b9dccc284786874f9a2e9d9d6bc6a668efb8be5dc3d709a6a033d476ae7ab1073edb651ecbd2912de0d1e637579caf303a4f290670be2d04505a46286bd83f6386f31c7372548c00ddb8b0ce8426055e9a5b6cda80f6c53af6466b020371f8cc9fc7ac0f17e90c2c16f24defa05d8e7777e066cd6e6de953b619e09ac01f2fc82c60d1c408d81ae8eb63875e17267ecfbd0e28175b4b313ecda8bd7657d0e8279704f39a50eba2d7cdbd3894e808da42266cdc4bb07fc2ae865b29218c77401fb3a0a6742184dedef5e4ddd9b10f8e8fa4f02656c94ba21c45041d553638f8e7a5fbd57038d3b5dcf2940a88926f5ff230b9770f0d6cda6e1181f474dd041dcde0fc724cab7315206e659b66e5c6b4b157b03b22570461962a1487d69baf2605c9492777b9ea3a9a2cd482314b4d2550a9b9900e8bd4f0989133d332439629ae50ec685e28ca779928e916505cafc5cbcff792b1f6964e9a037f8a04f9864c39299bcdd6029d52f22de8b0df77e4e6bfe6c706b77877f9b1300009d4ca00f42b10c288141f1bb01d34e68d50d27a40548c26b3d880d41a34d0092e2c77dc8e81307f536fbb8f090128ceced9af560aa111d701a90569c464261ff6b5646ace50dd080b03989ed99efa0ddd908dc9988b9b9065c36b9431bda05f93234983b89a1eac2e40b2341dea75e5721a24ce830dbdea9e471bf70399079fdcc5121d1a5baa5eb04ab74b43cab3ea32dfc0791797477fc8c17d3ad7cd113d29cc947d58ee00dffeeab8bc143f8fe46e4da4b579b92038ac36b40c23d463ad665e004cc8ebabec0fa41b2ed988090b82363bfa4f91205b885d26d035792a065cff1b206f563a1be09d12e90f369f7b7b8558cfba590a812948b6c4d941eddabf775b98e20e4c9f1d44e0ce5d1645a030b4da85102860c886c2f68d7e8ea819befd6996d0c4e363928bd4b6e6756ebfcb8839ed621e485e8b191e372b97a136808cf2fca45ea2a13e2960d57f78c2a41e84aeda15a4540980e27669a458b60106dd79437222fb770a241f33035a87790a7101ccbca1bf8d02cfb74509195fe3d1284004b69d4e77ebc97090a5570b3af65091e30a2f8467fce7612dc7b520e15329a79329a61828fb608bfbea248a2cd34db13178df59220801c86584d2d354a941a38d39f7819f637bc7b94bae826ac0c6f1b1c0d97cc1b4d1d544c9f21abc1966b6b9da051624b320279b81c4149e2a504813441e74cc48b69a295c0ea21949efdc64dae6bc6e41ff53c023185ff786f577c4c95b48bd9eea62a94704873961c6e5525bb7f78ddf220192ebc23716869bb2a6be77d6cdbcf188f334fdc87b464ba1fde95df338109b6066c43f4f6fdb4bcce38975e13066c226d12222a581e1572beded462ad209f778292207bf20e3ace5ca2e5089fc3cfdac0692fad289422cc783b9321c4baac0843ef97af3a68ad192795e4de995e17e54c03c276b67675612ab76da6007796c7c96e66920893cc0d26c32dc2ef9508c8d77932184269fa8eac46a7d6a85c6c4f03fa079f89cb9ca474e14b9e92dd27e9e48da5d0af79f19cad29fce026656c1e79a27fc349b8080cb56bea3393436882234ff4142fdec0c67233ac1087a2b9b4c71abfa4539c2ec90eed5cfcf227a65f9cc9bc4b9e35b19bb03e8f00c9eebab4364cc741163cd7f08c04696438d2422f23b1d5d7050dd90de95812e2cce961b3e40af101fce6751c5c934a425ed63769b11a7216b1884b1aee9e2a3d895bc26e2a4d00a808b4608f67907817ae0c2f1b1a638c40b060028e039381c4597d632fbdd2d5f9aa9b162a2eedaad26a82e95bfd0739ca98911b88a98b4d5a35fdac0e1af7b1ee263568fc24f8be6fe48db5df16c3e0ce49454dced0c05aa7fdf0fcd039de1a5ac67abd2a80701dac334a6efdb9693cee0754cccc7111bc30ae6220e23d3da49a7e3865c2ecb38e4938ffb7f497eebbff9eea838a11e57e44fc8fabd441e85e62c4bf8f49ef53332153450b28a08b9a9b7fb9003e39243e60cb1f0c9b68787fd655a88a2ad71c1140f7c0ceb4294a901680802548c553887536a7abd95239efee0b887c4fa7ff96a69e6e806fa9fe6e0fec89e98d93becba053f5c5b576e1e31e2a5e0a61d5b8af6b3c1d3a24a9dea6eb354049e9949bb5030dafd25a40abcfefd4bbaa51fdde97bc9282eaba7612b2ab575870e33d2c6513cb834534736b5f575b08ffb8390365819b53e05b49253d5ee9067f238d63b19941f0a1c34ceee508c73ad25ea1b8d9bf5cacca430ca75b666a89de57c70914b50d965e6f29d15a513540d9cea51b87cdc6a1972493fa055294602f22a6b2bae6a399c34113156b965937894a47942f848d1a9050ded0fe613ac0831e728b2f7bdf8de7e5a4b221488c8378bcf1a238903e15f2861976bf16ad6fbb81901ff2a43e6d9def62686226de9bd7f4240eeb66a88e1702f8309aa23f25300e8362ae100eb77a9c71699cc8fbb0b22d02c58b19a7d90cf250d80ed69c4e4e73ae4bdd2b6c731f639cb9745c937833677ba6a4e6b1f8913c4bfbed36d326cd4d5aab70fa1dfbdf766e089913ef53a6a93c8254db846dce6f86e0f086b2597d7b12a9c10219995507d7f8840a45c81cb094a68781895042728ce2c27ccafb7259e47d7d634ca24dcd983a2bc62bd3c1224ab843d6d84bdd2717bc84159f265f7838adf67e02ae5eac688ff27c8fb92453de72fc41829b6d1db7d314a17388c4bbebb0fda45d22636d286b73c08f5329aa12ee61006e997387f7d7e733beb91d7a7d633810e9c280526c5cd0da2bcb7970a74f8567af2aa80bf207203b42e69e09a566f4d96f2622f1a4d2bc5aec4b7fc232c49ff62c454a8742b222cb7ee4fe9f04478fab02f2702e5fc9e25596a53da0cc0e94767ffa79196980c48b7f313c554464d44f1fd4723f147b9743e5659ca8167cf0c66520d25d17365eb71ade5b8814a1c9141e826ec09a88d7309d2a78d7f0e9bda81f030cafb7a4296eee447e042762f808b3a868eb34f76f3aaf89c24cc49ec71d8daf4bfacbd52fff1680f64f43a1bb375cc3ea6bc4f0c0fa1d223e7cecad28d6dc1852e63137aa6239a37eba3c02028d04613762721a0c2415ef9f40b91c182481d9b47c760d679eec3e787c0e32014abe3356cbd464c90d1686a9166091069276fce0d8054201ede1f12ffb02fdbc7b93dffb2102b7f786a11df209241413e47450db0eec0a5ff0b418c3f1dc0bb42677ed2d31b912ff1129e11f30f1bc200f3cc3a30b11b4c8261e87df36ca373b048bd3afe3c09d73cc2c8e3805bffe72c061b1058dea82489afa58b8eb4e049490e62c30d44fbc2df085e50867842eaaedf5f35ab98616f8869f9b93f63f82bbe84da68eb65aa8e09221fa9b0f04f0ce8ded2f4a383f498eabdec58c957efc270166c4380e97fd4afa605fcf8d29101077b4c0b362cb0d8a49634f05e59513fde24f60df43b65afb7f7c2ad74614fa6cc367f655bb4abcc6408bb54cbab2068ff05ca174ea795320ed444c78335a818ec037fb662983e77c78f6434864ff7562e7c0b30c9153f498399e5fe3d4a3ed1f406befecfc4ce6b5c44bfc786a9672857e164ceae37ab0791faad48dfbf87174a01037e6fe2dc1b3185d4ef4456b9d4c151a0338cee92130391a31b4e65ebc5cc870440f30b52523ac5093704fe2d5ab393eec32654812d73b408852bd822e18aa9ff8721f6a36e1c6587a648281c72116f439f3fb4b04dadc1a46011ab18af6651dbad186653f284e3db70ef24673370f832fc141f2dc0c3800f296385a5491702a653c58bad0a07bed8c8cfa28021a4f73dff0e078895623c5a9fe63be990b5a73b02bc07bb65b5b104821e8c12f07b760281e77b10cc88369fc0fef549755b708c9270532b2008e284e2a48553c67951a81e8e6e9474537044508371728ba1952fc128986320f7f9eff905d30438b4019816762f410c829274f735cedce31514a91af3a3338e941d983d302343b0ac5e783b09140890d01e9a7cdb2ac7278216439ae543f3adda6f35f50b33be6cdb7688340c175aab5916cdd24413f9a06152d601af0ab25bae78f47528c5f13b7a052e4c5eda18855eb34b1bc40d6f07693d2d24286ab01f568c92a28ebb1cd195f7ecc97e904de4f2b5a7b4e69e88c5c152ff53cc0f51f8b13f7c6291d5ca163ef971d0dd43eeb2cf2702ea93b65d3ebc23831933a2c6ccc0fb5e765f25a13f7c11df4f47df9025d6e99b52c1338090a43862eba7e9421d3e2ef6cf1738d8315e87360463a19cdd665078a627c1d65e11b3034f60acd6f257f2be8573fae510d6c5fcc0810cd0e2f7ad086bedfe117b11aa5f8a11a63755e18b95f94399deb997c13b655347ec46435153dd1d7b62a8f83a8ae994709f4375565b122d69533d1913ecdab496c446c55305aa47f4b551a2b225f218f4af4655a45e347445606a366fa58abb07888ebaa79d4409fd62a3c1e445e8da19d22fd5baad35811fb2a6974a2241699fc29a12b80ba3e5732cdf3f511f9dc63fa810aca5a633257b6c8c56642856de2b35d1e93bc52e7a3a25a55f07e5bf4fb7a2dc3e9d02b0d7c5e56539ddecc622e16b018d84807d496ddb5a7b11691973a661848f49f02e0930791a2154e2f95d1419ec60b123fa396cead0efac24eab577924c94d90c5ad345b19171e78207cda6be90e9d605a9696c2b4500cb0b1e7b587d937cb14499b7b05a9cc4d0d329d6b5dc3697e9d25569f4deb965b8e4f087043cc661aae312eb3df2c0089d1635fc93a0770e4f4b124ec3a5191ca895d6a2615be6c3e4a6673e20929d7c61327195b67b1ad5e0ff6f6133dc88b43d2a4221e90faf95592eed0b1d4ccc21bd3efea208c8ba5b2dbca1f44a5409f68871862614cd38c8220fec90c3522488062a866348da9215649c240eb9abae3c8dcaf8a26d64b773a59291b3e25058830d4fe5736a513f3c47ae7ff645b7cf75442431a59db092d58794fa18800e9f045457b219a40192483ef81e1fb40e7e3a17cc31926e5dfacaf997887ad1918fe31836d4820ce353ff80200801c37c075911c1194a9af06e0971ea900c6427e15b10802217a156fbfee746bb2123c012a4b73310f14e74ff2ae30b9a059a9ff33d9bfa9dabaef6b6e2d14dd85704ee8863116726ce2ea7e6e515b5908166567688095f41a5b49f10b93b5b6f549cd1804f53e4e0f0ae8efc47af6c20353ab463aedf76279b8b61269162a028738ec850bd00a2b0ce770dda3a7326b9d99c2c2845ee51bcab4b6a0011de3708761d3a3426bec0cb50fc6c0533b7202a3cc51c0e5b47bc814422ab8e6426d895077068d76ff6663a02cde8011deee1e819e6a8950efe1329ffdeeac8b6113d233c62d7bf2234434ab7f1b7e07ea900b6e9700033f6d0170232371fe4af17bf0b9afd38b9480728bb4ce17d75628f4af287ffaf676223abd3484abebcc1687d1ed85dd2746570ac8e757aa7ef409c4b9ba3916e35c1d0034b6b8ae7f1295a938265e78ebdc944e19c3c7010c2e520e9876793d72d614d0cf0ea21c2f0e657f48e09734421bec10532ac612c7f3e14cf12cbdcfc28b2fa4d8abdc1354915fa7107e3f2e5c5ff3bf2ca52717b4f9651331f7ff24adc6e243900ee466818f69e68f15b553f6fdde56808a95567f16cbff7972193497649f05dda21a77c36484fa48a63c56a699eade880ea73ceb077ef1208be3b741da3caaa80069d321a966b6bce0e4c1002cd5bf30a51bd57ac2a0a1b2e1e0fce6270771d0fb582f199753aa488fbde18c4d9fee2507a9470ff8bfee40fb288426330aed59fda6147ed0ca5cfcec0ff018cc48f02cf7c45c72780b4dbbbc81bcbd0716a2a68f8c917de80f6e078a1cffe76ffff48c81cddae923785846c6241af2deccd3600f4d361c8e41f78733604cc1c3a391011f281232608bb81b334ccd16df96081680a6561602b5fd086496655b36302b9026c7d764813f20a8435b4b1e66feab41871bbd130ddeb593a1d03f3555e75a51bcaf4be8109bd094c077c8b620cb45d84e4a0f526dcf504dc4378dcb80f0228565d1b4d4ae0b04e15bcc38970b3a6a9cfd216be947a8ed9ecd8cad9df3519a1748145314a36b6381005d34f0cceeaa36a242c5aa2983f10d80cf821f09f2eec0608b9a6c12078ad56b0ab52c18e07e030b41fb36310cc28df32903d404d3002506e39fe019613fcea516a6b19944435482aeee4ac9def3a71cea41cc511a603f816b0bd981e7ec7c9667a088d86d5312702f326dac7011810288317db862f5eea82ed1d8e68da61a0f99530cc81cb348a5ba286426346ccc261ecb9f03d58c520a8dbd8978ab08007ecb51da85799717b2100f89cdb5d7cc1b98b26431e815b46104eaa6c3b356309ad9a4394949086b64a91b2758d702bf83b1bfec7ae9c0d7284e22bdb71205fa4c06ee8da9e0db1c027b217c8110f8f9fdeedc89ab0b322f7e68973bec5d9a62dc7fbb51128fc2fe7f6badedd64d4837a126424276070c8e0ad10ad5559b49c3721d96934ecdcb9a53912a8775ea3373b7f140993d4bb6f24f767d12c9d4558addd95799dbc1a8eace5dccb9aa4e97d8b10ce484ab770139616d6c6a9e4fe0fa78659bc6939b086c99eb92b7262826289c0ce9f59348cf345c3f41e168341c7532424d50f0e067d378f0b4693cd85db2a97852cf36153b8a3ab5a9f389494e50bc1db6579e40a5c91a7c50c182ca9035ec68c38e1b72dac0a40d44d840a50d476c83bd852df8d05db0d1a18b35ec0cb101144800630bce056900e30b5192d4000a6d60c2041182b08626aed0a2758108573899620639b82267096e403f2c20841042350099443d72a31ef55502ce23260f08b425082174408f8a6085118688010c3308030d36a0448a2228e1891d43788116d2a0451aca80a1cc0d08218412f6600d5800c3083088b224094ea600a20628205902852ca4c108960625bc84445cb096450b426872832144a164ca0d58050c3dc6c0022cd4600a5848830ab034d060850bf6860b320429020fba90020d708a50852c9e3c498111d4f0248b293c53ced06277184d3404c12bb8eda061099c47b28929bc2a5c2c66909cbbc29427e094222129a72091539a4025fb841a00f7a71750c01fdc76bcd0c1b1c9174ad03005ec9a153618d0687ae81ea2805d37c0f680dd619e6d4074439db282f776dee701a6f0883165072e24e2829d2fbef7c518405fb4c135c001efb9edd8b0d27def8b2ce8175f9821bbc308c6002d5bdcedc514b80f80fb3f02ee4f98981c1c789183f388c99cc2b1c3f46ae9a64be7a6cbebb0430f35621ab636f39ea7acf6d4d3e19b6ec7679be7bb1519ec71c319b667f113bd9e81b83f1f8459a030f7a5281dded9a3da35129ce9432c05f1708d747809562983b8b5191034ac5256b35991c13adc30a40102876f5aca1abb2a88465ffbe1a6f102701f3e24d4093877919342a30245952240d270022fb0c10a385350210831884212298e10b9d1de3c506342d58a686620a0d1c474a681dd1bd096746b6145d166b6475e50431498a881127ae005161c610c298882085f80811a8cdc8055c0f0a2063f23c405db70ae9809b6630a1a8ab04419bef0c102c22082132278e10832e8821729f0420552c00023060c3c7774d0a2f427eb473ef4a8bdcf070522f089500f990fef79c6fcfbbcb55f9befb60b1dfc5e12fcfac67b37dbf860e3288b71378bb07303ee43d114e58b70db9112060cc26d470a139c4538571bd06600fb1116c18c76e8417a7bed26d83cc23bf4cccbc72317ea51658285b8ed488902ce22d1a319758b37e26dd3c01bf1222956e07898efd0460db395f284b6e4126e3b5276a4ba831d8652b4137c6827c4c0e878d11363a5e71a188bf97c6840d3b81d316b800d07f4a80b1f6618f26866aca0055de0c1022e1c414807a8d04514dec00418c8c00b5490c28249ca8f1906cb0b11846770c2cb19789e0dd1c3d90117a4e0c30748aa84410637282878c1841c7c51851f5b98c2195e70061d0000e622796d3c1977071f6c820c3ac842167070052ee0fca00a307818f1820f94d4400a3da035887c70501eca2b6a98739658421650f828821737601996ace10b51207922851bdc805860d8451330845d5801c3cf0d085f5bf17ad869c16d47ca102945c07946ec89865e42802c74918316fc800659fc8882159ccc608913dab073c51518a04219a208d2630a18e840c109291862862f6040e4c8186214a280011628708119b6b8420a41b8010caac0020cb4d0851bedcd4692664804f3f6838bc1d2a194cd2758e96df648ca097ab8a00b40008393296e483ca4200c67608314329ca00b37a425589224498ab7adb00db786e23d72531842189400018347ce1612c8c20b6040650a0a5e80c50d6905942f5450a20080c9f598406942f52adc76ccf002490cd4f5b0176e3b519060f76655306cb0361eec992c8376abb8abc51384d32724249ea617f8861faca71ec5089e81db4e19aa604ae99ccf511de689a979bd5570ca7030cc5c965b932430adb226b8cee3e0d8a4a4a49c4c00e1a5390f33f7396fa321940e27499a53c352ebd1cd13d7c01eb99ad623cbc92d50306c6ca9a5571d177a602ad5d6200894c9bf08f495f74587e8fdbe99e5a2e3601b5d8628b8073aeb8b405fe9bee85879cb578e83af9771b07552cae7702ff4564938580a5defeb33cb49e0eb36a346a08b32d823d05b32962ce3e0e993cd6359041d741006814ebb62d93ca8468fe07be811bc49b03984dd47d56175f87fb28663ecbc7d28cb383844ef4b0ef7771c2c335096270675f6568eb362ed41594e02dbdb78a1ac0728248279cf7c0e1fd33398bdb347d0b2a465496765d2a5b7aae9755d92ac705c92447b384a2feb9d49bfb2495d28c120e475f745877c3b0e866eb0f3d1c62c4fbce22a11da13708620c9c216b64841146ce08256062ebe5002133c9ab0c4144b28ce158a0e856264e2220b8c00dc76a2348912052c5a2ca8d1c0176cb1c83a31d86cb113c1f4cc710270bff5675f3471ab7a86eb27d0e604dc7ca041861c2a0ce104528e7c71a30151720517ccb084139d33dc704fec6c33f84c63e8841f206955c0e0764d036fe4d90d44050861a80a36cb59ed7befc9f60317529292745bb0f958cad00ef2f231a3900846922449cee8135c67052e88427ddb176c4804d3fd6a5dcf6462b3c5d0f60c7c48d4330fbec218a3bbc2493d92241c6e0a368bb024ea19e9308f19d54b0f35e99c749216e87cb31bfe49efd6bcfbd2f23ea0aea865e6e3eb508fe69c73ce39e734cd5b33830a0ed318ea50146c3e8e87eda44bddfd196a18430e1e40132e60b105118c051ad40b360729d8becb4016e69b46d0d81ebccd75215ed462a212b04758d8fc70bff683cb340ab7850ffc82db8e18a6e056cd26b65951032a384fdc1a40b570698e865d8ec6ee6a61dddb0c6aeb1586a0ad724e2cac12a02da6c1d62345187280a9ab31732f3a60bc35f1fa20de07f34a872e0b2b8428c1195a24b4750dba49109b2786621822c4f6f040f8d9a3d6a3d755bbfd0a1262e3737a07ee39457f1ecdb82e870a9b5d8e0ecf922c70dff1bc39a9a6fa6e499eb5671e8dedf7e6691aa7d3323e589e67cbb3153d8bf0a3fe2ecaa8b764d459b2d6646085e35db7d14e077bdbf79d92241e0dcbfbce48cf5cefbb2352f4cc4acf48a719e239204d63c493e9b73c4f3cbd3d9a964b596e6b19fae9d607a6105638ec5bac49e0569dbeec06d70734fcde55fdfae754d695ac7aab3e96653d47c3d6b58e83ad2cbf5fa75dab0cf4d0c3c121d0f59ae56ef2c96c8faeebd6211e8d0f4da63f2dcd3e58b77fd86385037bcf3e5438ae838458fbcabab6aad9c332871b7ecf3ee0feb477d855d54ad6561bcbba7397655d593601ae5e55ff32f7fa5edff07bf2bd3b5735ec5e65ef3593543604b711dc97199c8fc6dde8877087810886d746f78e505b46a03453dc6f10028103440f9430f808c38e1e2952c4f004ee273cdd33a3368ad214cdd411de01b71db205f08b69a3f8361a02bfc71051653037023f118c066816127180ca6cc866caaa9df5c1a823bebb772b075d70b9965202ce411787a928514a9fa3617a1c4c65f998bacca6cc65949ab2f956392a8b9f321cec66bcac50e45e14b4c5e4b803bf53500bda77681a26a2a8f26fd2a9facb3d405c331f5c97d777707e6e0a7e988219cd715ceb850f498f4640dd7a3b5868d123e555c90142c4888e12264da0f4cc147a654c441161b3403feee0781a01eaf0e61b6b8cd59c2090cfe11ac30a87755b9391e9fbf1ad0aa204981e490c225ede7c4c21a5b05659c33088a7d3a3d07d48b2aeec096c7e52f443d2333488789fcecd2370783271edc911dc9f950e8bdde7a78b847b485e92c6c33b8daeb916a3055f82a7a447aff1f0be84cd4f0afc9e9f144fa76790f44c8b3b6a4f16d03e18b0c0ef9f9854262126304c627698532cac2262e2b107ce0182db619466f268262a1315264c983099aa5040a81e59504c683155a176c088b4c842e498f4c8411eb8029b1d9348335179327d6a877df481272a8f06f2b44cdffd1789ec4405f2e09ea8e0863db00a9c02a3e4387e3d505c06da612116d82d793b38fa681f361f3f266c1cd233f9447a26439ee8a3673204a204bbf76310c8d3336f00077a1cc9c25119b2d33d394698bc2941da0f48da0f8d7d543a6470d4e9514c8f464166581f443b6f4c627a1403030049336a191a5993d16f3f6cb6126e3df3b2c0e24a7a689a3feaecf018114cf4117dc4344d6b322ed7c8219cdf8f558ec7b84019e8e066850c805491a4f8e0bbb6472ed065f5945aaf95a0bab950d4733cd3416917eb89a331df2eef3a15f3473da607f7a3976b1701aa7ff57db14e5d526fce1eea35ab558e774729970340bdd9dddddded3a00ef35b3dfdd9310545503b9ae6bbee7789e149ca5e51c8fa3d1502c1b0d635cf2cd6f763df8fdfdbdbbc7fcf50f2fcf123f09e370d87ec801005387e7f6c3ffeeda0fd97dccdda998f765c5f0e090571e0099bd59e85906fab3cf75c844cf21c38e43d672988ce52fd9ca5db2ca46c7a0593d6d506238cac58821fb325f59beba286bc9b03b8b84dd5732d77870ff64dd7870c732d878b032ee5eee897bf221dc1347a3e1a85c4fed9edc937e574e4abe4fc5533d516a9aa6ce209e4f70743041370b1576daf58ef341db4eb3e39d73eee68e4d5439563ac747cff4a3d4f2a2eca2a41f3b7d36f4f9ad3d62ec11a99b1831f6ab0a48f58e716baabbd884a311e3dd12ab582b1fb8431445dd18d55df57edf9718972e1da0438aef187d48e92bfd582b21aa93ee522f8ae5ed5debdd84247ba78a11236bb88a31c62c5bfc5a89eed1437096dd393d237be406127ba5e5b97d741337b70f2c2f5a118572a5113d19f8ee95471b118eaeca627c8c15d93d9c8cb872ea52547d256b9825cb563aa7812ebc9868dadb6aa7ec45be61cadafb225f3d3ac09a015faf0472c2da88b0abaa031e0d0c6951dd6c23ea266a4e37e1836a225a1bd1b41161e766134e4614b915210cd1010e89e2885494f5dae5ece86e2e5cfedef4b8989e11f9cd93b95cc4b2027aadc47b541ae64da983918f0b4783dec14c42481d6eee28d8fdd676f5efd39d688ac073d5dd173923464bf6eb0365a2344bef2e5407171dde8dc0e179e297b7a679c9ee6f0e37cfcec1d2e153fc8c49871c70b8574b0ccb8243aaac954e1394294b729a1e94f7a4b474b97b51b8a051b0347dbad9a6669b175f7cb1ef029a40d3cdd2e4323d972a5d1e1427c3b9f46132eb2e93aabb640dbf64f9528c2bba795a96eb8a8e3f33465c3c778f14dcd42d7d5c745b759aa6497e728e0bf9fb7823b408c0f3efb30800cf36e601b8ce47cc9c00b8f13e2ee4b5a80ffaf8c705174e8674eba2b7791e179615a5aa8e72e160de10449282500d055af29f3cd2abd4735aeb5aea86d233d2bb8350126d61c1ba5f2be128eaa62d45754f47f95ca2ecadf9dc6d61fbd3a24af481d272f3c4d062485d8abad3e7ee7349ba2fd8a9c7cf6db40d9696875674507da9414e64ea5756e590de1275d1cda216965352455539a4d75437bb495ab9a10bba529f0af2891893309635fce9eee9b512d925d13dd2149c63d53cd4bb87ea2851baa686b2c5341b0a8ebf69dc50821294a65bd3bf2449ca31f727eb3ed63dd7a7c7ac6fb37a9745faebea08ade59c9b97eeae75ebbec8bb3f1ad104a92b51afca41bdc6510eb6dec2d1a06e0ec1eb9b678b8632e5dcc2d188144551b7c645e9949b1362d95b3819916765c9e49e9207249e5ad59f8fd7e2eb9ef7dcfbd4f0f4f6e301a9158e276985636a795b0161a7f4b512521279f4413cb9775f1b6fc2e14ed2e987a3d1a2cbe9a20704bb95e7097ab652deee2b2f8ac0e4fe70b8f7be541b7779398c0ef93ebd8cc325f9965ae598fee8247f987f5e1e62f9fb21271ce474a7e930f7e5badc7759554fc97befbd374dd39f8f8908ce527d3e5e1069aab7e6b57b40e474f30382a5d7175f7cb15dcba7e7eabef8e28bd395a6d752ef7beff5f970325cc7c8aa8bb2eb2e93ac779ba7472c77e5e6892fe8668b3fd7d25beb64cb1fcf55ad454c4fdbde65f9a6bbc7d9f8ce549fbb0757d2469452be1ff5be1f6f9ef7233e20d64451b566dd83a9e9fd7032249e184e84022493757ac55f979b7dab5fb55ae1e80c5638a6cba8535a5f2b21359723058959f411a5aed8a3646f6e49ba187dd31a047da99f873da324b91e0ecb1c0f0c8bb7ea6ace49aba3af9588fd2875bb1c18ef78c05be3e261d3802e395a25d8d45d85035e789b5507659f5fd96cd69451f4b962ea6edd465bf745fa3c3cacb2ea669bdab7cdd970cca2842512381e8e06bcb4463e4e3765306652de09b164a3e0e014aa4462b10e776e5ac9e7104208e10d813e6fbe71d7aaaa1c2d9f873d0365ab022aa9150e39a1837d98ec73d9320fe3f282c35b9bc9e15d01f16e9e54246f160096a09352c21dc86485d21dba726b5e05ab703456a80e773a28c130878bc3cd07e3e566511a5c6eb638cf80b990bed3bb0aab58713e70f894c3311d7e9b5d042f6fd6012f2fa7bcbb9866b9e75b6a95c35dd2bb297a76b3007ef375b859843d878bc3ada271b820276c6ed0fd6414bdd94d0e8a2cfc058f411ca6c32a665bd694951529e56b2576a0638273430887803b8e06fc844b70be71125642b41c3e43254da112dc1f6531b009bb3b7707ef5e5ce45bee9a161c134cc05892861d3360e703969e9b1872f302cc736b22df2f772d97b3e5504a29bfd2d2873b2dafde19bc8d07937dfe9285ee92811e235b798bcd7c60590bbc43f4484e3b03f7b300709e81255965c67257e5789f37e9d259b200fe6e3e962449aa59d52487c5393a59ce725fa6af5cde8827094000bf48c4332fef02728262b72b17e4047679eba10cf4c9629583be06bba86b32eed2e808d99118453022eece5b5885a341e7af5b1fc23aacc2b2945451c253158e4693d963a388a66057054377e5e90eb8a276c0f2d5ada13e4fe17c72e2695e588593211d8cd3c1052cd20d695140a7f544381af0b59277b94579af084703be21888045d8f40c1cf22005df10443c2ad729a57293f22e5884a3413df81e6c51b0fcbc3c453d4ff9de1f75f5c15bc423c23927bd5ae560b9bb9425cb0e3f97e1599e84ef39969b1bcf54c4ab7508f55a0949046c54a424e23529d0c17709dedca260e9501ede9aff107abe045f2689a0ea4359f54f86fdca2c087439d0af22f27c9efe5e849301bacb40f765fe73e94558bf3eb7f21451c41045d4daa2501475f38ad8b1d2511a0986ee48eb58c9fdbda602fb3b94dc91a6a2913cec9fecddc695d36725ab757a893bd23abdd35653613592954b51d76ab16e4d5b2dce72f7c5fafbfc8c47f3d05f2379c756b09517baafbe47c9eabed951dab2b286bb5b274f77a4755eef34863592a6c2d1788d04cf5313d482c92773036ac11e362dec3615ad835d6fc958fec9ac63983b621fb5bf9a0afbf662b4d52d76eb5c85ddaaa97032ec64efcbbc75e97f34336e41589d142c196c992ace88d6cd37b0a9682adc91a6a29150729a9a0a77039d144d05d62c6060d507e5c110ef90e8a75209628a3aa9b0679c4479282abb3e15be56823a6d124556927c4b6f5951278e867559517d4761a7b09b1bf7290f96b7669f3a25adbe9b96ecf928e5a1bfb00ba32110157aa0f7a60a07ad3ebafbb5128d36a151707edd68134a7b5e5f17e5c1f48ff2e057a54a96cfbaa43feba2d7eb793ddae43af5675d57833b7a077539773fd707e2cf7d793b9c381ad7314aabc89c1d4ea893377aea8452ca439d54c14faa82a96cd3aa60978329a52845a94d85d4099412725393c908aef2954ab73d8be0be59aa2a212876fd496432422b1c528543de46e7a56c9ecaac7fb2be84495925a55314259dfa4c2253913c1d71d4e79aa0703440771f2adf5ca1c90876d9c6b95fb7e65da7ae52947bbfdc7db9de9fceb9b7a4a8e7c94855e5085daaa1aeaa19a2f2664755f2360bcd395538ead4e4ba5e2b919dfc5444eae03cfb4939894c451c0df79e8ee03c25757363eb6e3282fbf3f4f2e6c9089e97a72eaf936e5d3edb0421118ceb8633a053de2cb1cc526e3f54f5f961692fefda0fd7e5bbfd605d5627ac7c1b49d06657e61a0ff156d68d87f82a838d87f89ad1782a7e8a8773620867ad0d0b5060018a0a7b483e60f85a043bb10dd55a79c0300018e280a15c69341308b51f241bba8185cfb58692a88d4964122729dd1d1a0fef3207d6f1809f0d451b1f3e4f5cf103c3bfe838bc1ff0013b1f500d52ca60431c765a78a52056926c16514aba2d1b81a54fc7d2ed20a084375187302edd1144dc66bc37483362c7185b930e33244c8023126ef628be4319dcfabfc396a6252c8efae0bd81412c208c30c2c011e21a8867140162da0e60dfabd586423d9acf3e1800c7b726836386e363341ad1937991d6ea7abca8fd803dde6c5303cb5b097360e5fcdc3c2d18a5273505e4c0504786ad53d85c5bd815c5d80086211c96c8ba990318da903d02c35993985a923ad33419a3143f5003c3c62325c90e26793e81b34db5693c3389c9488f609468fc3bcce25f36157132e024425d8d13140f4ad752d427b4d5e9e85f9f4e67655496452fb3b21c0d5b1280f0d6b50e6fdd17fa1aebd2e90509b12f3aac4bb7ee9b5ee160ca4684a783ef38d4f51776727af8c8a13c946707bf4f3b2e6787faeb23d4cdb54e27b449a34e88147902bf2aba791ea1429d5027549e704060432049d49e1ec9dad32389618c9db940f8dc4cf0bbe8d1d4f7a379ad65603f6659dfec789c0c78e732f8c4c9804f0a7c043fd113cd371b6cbf579f3804b8ecbefa044209669cc806db7f6f11baf6984c2d65b1034406c1720896d7cadb601449a3bcd365d50b9bbbc8945cc4893a171f2bcf64e3b9ce2962e448112347ba28b213054a29bb2822850e929d235c58e71e2fa5d041b2539f381953ca224790143122457d527962e748203877115b444e29a7a88b485944de6c23aa4f76a4d07797734578ce6a0647ddb52129363711db65b035f391caa9d2e8eacd3892367132b29bd711714f1471447ae689220dc63643c330c63e83959e5d919ec9aecb60dd135da48d1c69295aa76728eac4c9c8806d3b6c90a28bf44c7e4688f44cdb618311fcde4fb411fcee2aeac4c970b409d55c0e95eb93f3d334e19344e6931275f28e4c4e602c029f78447ac80342ab4c1f1067459f30cb8827f32e896e93a16e9e3b8cb0d8dbb597b0872e76d04dfccc7b13f1bcd5153f1de2796bb079acde9bc6588f756bb04fecd6c8473ceffb61290c935c856118863d200f813e34369eccbb94dcfbf17cbc1f0f8812ecfdc0de8f0744c9fb8161ed8f66e51a81dd2c62b9745b26cb6d4f46ba9fd3f668dc8e9679077dc24ec59b637033424a391c6e73a26edd8877d0cd735a7b258d99db11ff6284c131d2c7eb36b3ee76bc3cdff52bb33238da61460f3d6af7ec03f27e7c3a4485ce14209d29402010488ad04321a7e3a0c01958ea014bf7014b534831850e14d0143a2029a6d0810272207808231670c953d23b48b07452389d1ec9dc8f4d07b238eb17bd95ee7cc0923b4bd6667c56ee5e1d04baf495aa56d8eb655df556b7f7e6da0bfb55dd3cc306b65d7b337453381ad8adb1ae08ba378d3fd6144e86b4ee14909a2c8cd8053128e59521e1b03c166fbe812380b8c6b9cf3f9694f273c904183b761b2d21e1b0db68eb578c9fcc072b5f7996c1d932f12ede7259bcacaff408ce2a82912ee94ca133c5a73f3be893b10aa4f2a6b4140c21bc0d653e3714e97ebe220acdafd895cfb36422e92b59280365adc97cb2d664a49b6fa2a4ae8bbdc5bc35f6f0938513741242d9e24167453e3c99177b8be6e92d1a4a6fd13dcdd35b3494dea2797a0b1f1e4d124fe67dd653375b7bdfa91589ac0bf2646cfbc1c95701414d365677ed523e89f7ea6dbac4aebd597459d3f496c4ac54e8939e040475e9724e6b5b9b97d7361e2a1604bfe7de6b28bd858b38577fa05029a594f0edca786f1ac7cb5801e1b0bb6c9ff294a44e65a8ac9f3615b7d743dc6ecd74637bbc35d2236e129451ca9ac48e1d3b5080e19d4f5a089170d28d94ee072a86b7c61dc2db72f4e0d183470f1e3d78f4e0f12649b0659e1034558d6919c9c3391e92d423e6341e3d90483c629431f1093b9febc1a3078f1e3c7af0e8c1836acb07d6396bdf2a3bc475e7e02f21609537432979dc13d7032b1cf27ae25c8fbdf943381ed7239d1d226b18e8f482613009430a4c5f8d54e09427a5a3382cc9eb7a7a24af67275d577aede67afad66842cfedb2f560c95ae94acf3e5ea63ff79dd5bef4e11a73d4b8435c6f8d25e9751a31b4b7e6bafc756bdc2396f1de284952356d4258ba0d861c706f380ee16c83e16db4e4b0bb1f0861786be443d63f5948fe5515f83c740aeb9d52ca4b198555923e00bd5540d0907450565b2684a57705c40c659f4750465bcbcc6a43a2a9c4754f9c0c7818917838c65f6d65705dee45b9ba65f7bb2a94965e2b71559e8b6ad67551af5e79aa0ae5aa3ddda37bbc9cee21bdb66a5b2daa4fea93faa43e81a252edfae6762fc6f8e2839594de4455dddd54b320aeaeebda781555f5751b6d55a7f4eaaa29f978e79a899a5dea6d55cbe5105856dfbfd38c3a7132a869de8c5b4c37016574323a199db5d646487b2ce5a13cd489b51246c120b45986d8bed1261fda03298fcb7139cd84cb7118566d7b34ae56ea843aa14ea813ea84278c27de40e50d50c0d002d3ebaaf3edff38f97197ee1f19250561ac50a8bb809ca0a6e71aeb932aadd74a7c3eaf3c9f2a05fb7cec2b8f95f6f3b1b7fe79be91d4f4ec2e173fcf2fe7ca307727ecfadc1c029c2cc210b3177dbc25ab3a4d49caac3e713242d2ad4f2e27ab40ca23a594124789a9d126f2939c6814393578a33414dcde68931eca334d729a5a467ba66992d3347d7aa59faed74b4a5ad6655996fd25e5b18ab1b7fe1cf4c1ec755b46b950ea3a09d539058c25b43528753bed0643070c1f60eca882058e12b2734a80fbf23d0c9f74d8329e52d8e06d523a0a941edc6ebe69d70d5f618582f383524ae9b9f648296d60b38d48a22e2feb52d7f474978bbe9f27ac949e5a5ad1574a6bad5e29760a7adf6c3f7dd1eba1acb5cc75f3bcde9fecbad9ba36223c5dea9b6d44d4743b54af9e7488e0869407e228d1681348a3501e4a79e4291f4fa63fe7f4f6f1685cce93e9cf4aa4d66bf55dcea3f9bc7370cfdbac628bfd63addbb27973a524cd992a96cff54e143a18a913ea8488cca982a40a107c044b389f5485092c00dc76dcd0040b37046959b6184789d93995674eb34ac1ef108987670f6e378d61edc16f4e97ea569027233fe7ec208fc6ed7832f2b2de2059d47d73f7c87d04cbbb1d8fe6bab49f8ed98f9cffdce95866334966ba77d6f7ad2c571b1196d4a51c19a786ea811ffc8b7faf4f1c8d292f4929defac4c97837f48e542d9fd0d235b0a83164a579a65797de3d2d1275f7471252630895d94b9f83b2e99214833c19e99294a496b21844de207db3085bcd5323488d2220a946901a445a826e4db56a0871345ade20579db3ea6b0cc1fd7e8b756b0d21b54e9f4556582627e5f44f55a7f75856de6b08e99e99a3a976afa5f57c25b2b6bdebe6f9aa1a58d45a9f6b259aa746901a45709eddf3d36b04a941c47d64e71a43f09c3e65d71882e7a1bbbcebbbf971d227c5e4c9bccfa538655dadcfad21a446904fdb8332eb9f4f8e3af89d62f2686cce93797f13c5043fccfe6594949c47638b3c99789b93532407c76372eec07db15a430896292938de16793451e7c9c4db22b6882d82e36b0871cf971583e00c97e0586fb68943a24e0d213584449da853756a08a931a486903804bf3804572a0ee9a16a087132a4151687431b80bcd74028d743a718a72ed45d9e73ce39e7de73ed09351ff5023dea539923d2a376457ac6a3b169997e7ffa14dcad0a6e2670f7c0ed80e03ecc33709f031210db92b060497f27e42c2ad0f6c3b6244b8082336e4996a005764f40bbd14efb10f8e8d140a0c9b8bbd1cb76053725644082dfcd560b9c1b16590e8dd91ebd3c81fb2ff002d118be39e10712fc0e81a691a458c008ec9e44cfb4242c3882dd6847f32cf1069c2b9e88b4244c00c1b9f52459020a0bce6d0a76f846764ce4b0c113590e213a590e21487ad4f0a867f273c0eead8a21bc003bec78f0174638870b03bf04f1f07b8e87dfcd6183223839c05321d6022f9b408f2000b11c4ef8e851c3363e81801dd89d0455ba4852862ad0f00219e04411062158684111d2c023c80aa0ac8067053a5260e76405465c4e9099d3332dc90aa060f7b9a3675a921c1fd87d32d1336ef6c02e0c8c840b634ed994fc208a28a4782105175cd1b008c2128478d1a385334441c2858121bc2f167805024044084b76dc901707bb7ffa78342d507ee4a0063f8842831edc709f411e8d8d1f5920429532c4a08a17dc709f3b1e4d93020ca4b4a1c90d7680852a6eb8cf9c47d39424b9620b55bcc0a3093bfd37bf60414ed8b903c70827b43c6d265e8a2ea019d8b903379ce70eec84786e2003ee6bed0ea9a51ddade626e1c7e40d618ce5ec1c1550d47e32a8dc1b61ea1c0f50c549083330e7e495200058f704bc284134c2bdade0ed7007795e3e200d3ce01a66f0798421e602ad5986509c71324e1a2096e87b1fd40dfae848388b88e0006c1485cb89e4ad50638490aa8e0f789ca7e14a4282a52944451949b2e56c67902d3b7ac2551811398ca723b95dbe3619ede965563b5e7e95295e52bcbaa1c60835ed555404c41e0986e6e9f3eb527182982eb6d597638c648dfe35f7c8f8735314faf99fe0ea7f7611581e9afe9cd1aeebf10e0e0dc0e5bf6034b9de40503342f5020c812aa68c1c98e2259dc683068410a4e98820227ba70c18dbee808958926f808230441083c94f04515bcc039c1133380a14427a78b14e8d06089231c810a3538030ba27421ab6109212421054258b0c5a56913a23e7bdad88486b0094939d252633c06bde820d03459d6ab11e860fd0ae169ba6eb1af643974d17faeebb2c157e8a16c83edb30db66ee550b6feb921ecd6d07f6e4d75cb26842d1ae353655531442050adb5d6696a6969693912b26f3d63dddec565e52e36a1199aa1100e85aa1e50182c4358522a4f049697a4a812611343844d8c154198313e55a2bbbc865ead9f5ad9caaf0c0bb11c5b3976a912c2de1202f4cf63aeebf8ba2f2b5707e85ed359b26c59a27f2c9b65fbe95e2bb7445cd68f27d0ed878817d0d5f1b9d6b56f98088c59a2db956b1323fa746b44ffdc9ad0279b183c5d9b182cbaad47550c0e852aea526b0b7d0b6db9684b4b0b366174b2b05f588c18316260188661d80b02e893e518fcb9956522b0b5f295ecf88281c1d85bae1e61217c892ed16561b92b19c6c212baf595ebe6facfad4c8ac1f6f5a00f867d8e653906631f0c8be951cc1222629edc4cd3ac724656ea93fa3cc5011cca35148c8c40877963536deabcee8d4db5a936d5a61aa937f0b2a9b5ce69dba3a0d34469b699268abad4e76df01098ba59be5139bde9530e6a71fcec379bd0930114d36b9d93e8547d8bcb5d6258d743f4ca3ed8c5de9510a15f21c8a16c3195610751d905c4caa94b5d19f54f96afb783ae8ca26e0f29ea56e854966d22608f51d9628a3abd32ec5716ba21c0a16335a08b848ed62320560e7ac3d8a9ab98102bb7f5c80663a15359bea8509643a12b4475ead65407dd1aebd4afcc2684a96b13c22eb756a5c3bab0472e37c7c0b09b5dab22506b0bb5b5a5a525747bb5600fddd69616eca1abc58a5aae48741b4d65a29b1da6acb5d69e6637ce521414f625080c3a766beaa75bd8295c5f5341b1d251bf72330e5ef995e510be1ecab20d0e61d7da97167b33cb43fffc25ab7eb58732e92ca0575fc946e030e85d05e174803eddae84683dca44e06e361a9435a6ae824e41d9050afd93ad1ccb720863a7afd2f1f9ca5b95c33e741bbd9275a5c33e6441d5e71dc8ca817db2508fac77a5c3c660ebedd6d4bb5c5d9b10ae7684db65967db009595f5049f466360247097ed6365b9cee938946e0f868233e1e1499f493e82c2f2daf8f1163fa45a7ec736b9aeeb2723c0217fcb9bd34ddcaf2b1655956e83e00077faeb5a6afb43c346553cb6df474adcfaf4f5936024fb70d6b58c3b0dbd0edaf10e0e0d015810e18bb4660fb6c04be7e1d9b5a7e65f9fae7829cb0d76df9746b5a1eba352e9f62beee4dc42fb75c74b85cd8a397fb1a2386e82ca2b38858ac534bc4c2c2720b63b96e8958582e8cc5b228cba5945a9665595691eb0e5f17bd42593e0e1dcbb211185bd1015bb75fb137eb90430e38e00003f3f2e2e212238648d4d2c2c2b2b2120a81409f0f86597b5d965555b5524a51d3d4627d65e5e6c9f22cb1cb5fdeda0f2bcf11dbb7f643cb452f374bd87a8cbb64adf110e36609dbb358d16561b91962eb2bd65b9b59b965dd0c3a36b237d787dab14c3ae87afde7baaeebba2eeccf1ebbf9d836b657f57c1c8de0c1373044c44a1a7a8fb844bd4caf999797f708237a490fe60c7d0255d83f14cbac4f99c530242c1ec10ba6b7972a213ec72e76dd977a1f808329d67a646f8f7dc26e65b9befd01d5afdb682a552cc35edd46631feb9f63589ef5be3c00075fb7ff8400075f57043ae07abd5eaff547e0cf3fcff51256fd93e5cfad0be1b15b53fdba35316a76033f1586590b0281ecb1530c04027d8e55d0e7180864ffa9201b02dd502884611886613df8dce1cfadbdbbb51ffab15c5c6e8fdd25b3f1b0acbaad9fcfe7f366fa8fe5aa07e07c3ed7fa9581b0ec5dbf2af6eba08b35c63e0e68f8e5f31aecf61fecf6f6c6b4b4a58327a6f7841696d0c105c02dc9123954cae96697c5780496973e511d4fc52370bc74c40dec1f0c793ae891040554f04c820223739aa6ecaa52254a921334a99264c7941b2804762bdb699a8e988e38e288236ee00dbc81d3cd37709aa6699aa669a2a6697a3a9873ce24288092040548e69cee33c909b0c0d31e3127ae57bd8178ce69adbd8198de69db8f90826f5e171e6cb01db6d65aab204618237c84af89ef3df8c000e17385efbdd77f7f11c208fb3589580e278ef4a8e1ec1eff96d51c6f635691c1bac79a784323982b8630b0da109462866d982e7d369a79492d7617ae7153363377e595806033c4cfba30628e3146175d96a79406716b6fb95d6a92d42ebd5f23c123d8173398dd4031b42c57dca27477c9dd19b3f969811d5551acbbebc284104208218c31aec186608c50e402983f1981255aab69aaeacdb70a020671011cdf704ed39c13de0997681a26a28057c16f44f1207e1442e8eebb0de73967859cd29426354d5914391e7e56950e38e7ac89d7ce20441fd050a86bc7d8127c8c31c688a5ce44943a8410429a45314f6551c43778f979e769ac13c77c1336388458e108896060ac4c44b646181ad9888434b4340d21281a0016a0c082c809d039581b4226e0ac678038a4c70c091360e8208cd355f01bf3f18a609c0885607af4a2889f5914f0f0125eba7b849711bee118218c104a332482e91a1b7e21e7d4a81604427b38ab1463c4f0c2f704086384f0560be78c31c6186384104201c218e26209112cf09c600325583aecebb2f0191ef6a80aa2d201fb0d477cd7c06bdd156280564c5ac5425b2b4e765230848e0743a70586774cde9247431dded6715486b48fe7c31e2fc159a443817783ba8ee7c9bccf31d858454082113a2a18faa822673a2ab8b51e39b8232e41bbf6cb21dc19ba3cdbb906add67808e1186fb56f4e6b270cdf5ca319554b8339ede85df8c27914b174438d8777e90aeb9e43f881c0e11c9ad5ba0e21a006586c11da81462e0a39173b3ae79c736f30a1100c0c849f155e042383500826c7cfbbf819dfe0a5a8235e1885755702c7bb17aa4fa824cc97c5490b19a21900008020005315002030100c880383f17820899a1f14800f8dac566c4896c85914a41052c618400801030020200230330900017317506ddc5ad26d10ee45a77708e95902b3461f4f96143c0a0a29b81ab0989c38fc8eba24aa2a3baa712a3404ee2d27fbf60d7c3bec088617902ff8d44be80ddc4abe48577c7cbe5c4b310db51427c2bfa5b75e02b36151c504dca05c8ace15652c77856030f1acd7b173fe0793765808e14fd34dae60b6e30de990fbe7ff5083ddc7a2aa5a6a0679e7293d8fe8dbe2e1ffb77214597ff9453e89557ce993749e6635a6212ef6b4571d69a1c6d1814de3d013e9d7e42081a422fa2177558a5a12e5cec755bd366622e32daa1b9a7c0e2d8180fb483da21b7ad46a1fb9036872dc0591e97ead986d0bec5ae2d756c7d7d258aa65bec1cb40e8e2b46d9b19c0fbbcd851d1a3d51513cd6911d9cf0dacefb8285cecd3515a671e6d42a8fb5557f2868ba52e30e98b023af6746327aaeae37434fd8a9a1227023c38084df164c3486fd22b88fe32e95861af131c60d8d4ac4f8a365fcf5e837e077962591671de7de60054827d686a1f206f6e1e86448e6afaa6f6af61e82b2b227f62e9b46104a526aafe0d72ed77f51457ab472c99c040baa9b65bdeadd90c625692759e7c7a71ab8b477cad1f59c2ef36896603527b6658b9c0d03ed0c80b1e9691b99d03960d5a93b9a17bcba5e252f74ad6a028b9788b2996e3486e1e8108ddc7048ab95cb9576acd817b5f64b27e8869cd586538026e95b2e920de3458d19ca6a0b36911dfbca008ac6b39029c4044456d221cea529df649a54c61baa6f79f2e8781b02da0693c1dd95a01e089e7d509d7c6c3463e2a9cef012c1ab768e65b0fdff61bbbfae996ef01d45ffcf0c31493a02e65d7ea82a9ee6c7190d745c34de188551e4a1cf6bc48fb688a9e43d837345ce61ef48337edeeb6f5404440b72fa1c427e637cbfc6565fa5d8fa6773ad75d4d30a28e7e69047cb986b9d274b28205d1130c958e70063a68aef8dae5545471fcefaabe46d7f0d50015aec0088f6736d24dcb0602822557a8a33e53971fd08d7d314498417d5b3be91040e6e959d83b20f2ed93ac82a6b19821a86128e1931d623c627dc8375273f33d98c0a2eaddbc03cef2d8ab19582f81ab5de67f9808f44e0588aac07051ffa7477675f6c255fc87153e64c3f0c4115fdf7814e9790eb7737849e5e43623aa9709d2496acd55eb1ec7162625ab861c89c5b19188d740c558557ce7d16e30f641c58b9d7fe6582983eeeb37921d1b6156c41467271f6b42dd6d918de6ca5b908fc50567eab834bd8502a6a9ee82e45931d25917053aba829769c4a5ee23c1a2cfbfc217843d9ce399f3bd2de00a8d36b775829c4fa14a857d0af1a7a3f68c31f826636c5d4f8d8c198c4bc1cc0ece0e1d0b75c3ac526da45c8d518351056ba6a563012f64b06d44b9c518d418bffe9e806a61d8ea2d4bc9169f3694f29384c22366ee7f3438d1ca772e990c932d7792f36d322c9aac2d9569703475df561ab21993956feafc8cab4fb15303a14c06ee21c0e863930f2a67a1455b008801a52e83fef544d4bcfd5fc551d55764328ae65e86ea88d751ead1adb297add1a0c357257411a3a1376cce060d963171b8f858aa0cef25d3fccc553bdc0f41665ed28ae2c6aec65fb95bf51ff42db6ee0452f8e2962b54f263bd227c58fa46fb60434e254c6004eddff95eaf448328a46a66b7919c8e682d8ca296386bc64972627c5e20feada79740f4395b4bf441b5947a3f7e50c652a5156d5626b35810950a7e263603ccc8c440c6b2c1f0a9784a23c25524acf5f24bc94a238e344fd554a96ba55980198a97df053d58c3182d8d9b2d9eb1e3d6336655eaf66cc1aa4554b744b34a8966ebd49cedffc5d6c59c84dab6c467fb822656228f5041398ccbac411c8edc4430b689693e4ea82a39857037da34b8df79e110ee4461c8a929bfcae9b56dadd4bb5e53c903fbee497f26e209dae9f0be5b715f4ee9a947b569c08f51720006f7a47ce1e992939cee61ddd121029b06abfa470728360dd03104de02a2c37242caa2e7a61393fd7c4a302dddab53ac76c09c4d0337959c5294333e951e3fc6b9ada13273868d342694585a0c552a62218763edd35a646eed9b01f4ce9186a24c519275c4a929ad98af9d623a4716e47ef8d052ed0c255855c40e8e59d7c07979e7094da65c291449de71e79b6a3a8c1749fb2b99fee063970b65816dc589a618ed00a00232949ecb1c25fa4be8fb905380522c427be86dddaa3fd0d0a00df4d0e54870de510dc60ea2c09a8e44137590266e8d06c01d864317120269e0379402e4eb730274ee730b2127106936ed003dc6c600cfd25d26660ea2ba3b544cd83709e14e54879981929f76eed1aea10d92ccb70e9f32965e6abf0e64ab49706144e0260d9d58c3f76d623776b0c7fc22d4fbdfa226c9b291267938b4a100c3039338589ee875acef08f5a2f674301e857ab3a98eabeabb37316a59e948b26dbf15260a7721e7173d701ba322e1583c14c77a29126e3b4ae99c9bfbbdaa3b4d501e77a4fd5d66a9378ebbb2e35c91a42466454feff2b27235a1888715a2e432196e0eb5da2046e46821dcc23c297c82baaa8cb0c5a4cb24a8eb912ffd3fd52f006ae9be60254006c5be813a244d72670419a7b047a99465dc2c21f92716e460e843fe7f0cf2ce0ac2d8d751f3d95339376af38bb6363c2814833c5c0650916236be8c4bdaf537fa0d3685bc816ff3f7616d4c43ce2b001124e3100f191435a58a01e7857859726793e1ee065f04de17c414c776f620fd123fad6e88fc257a18ac16bb4c7e85bea1fdb73ee15819a1d093f5b420a79fb4f2f7c35240411a46f4f8229e7765b40a0415f7e78828f960bf40277e3c47ec5d5fbebf6452f28e847893422d8f26b8c1a2cb266734db8b018381d5f6952e1d8f00729538f5e82e1a1362b305084d2a85e225c8c6d0653b8c12300fc021d475e96e20b7194003cf99ec018ab68fdfeb041895bb4ed71aa0ed07b87301d0d4360ac4883cdee2b9ace868f29b4b6d7f277e23491ea09437b57d26493ac66438d0fa7ba9adfa20f6a921e7c757ffd57afd449fb419492639b697434811db677447161b6ead18489c38c5891a03a103f4b5d6f24f43ab21777b7acad040404f4266e6c5afd6637f82011e1569d720f358ccf5aea7de7ef9eb07f239337bf1a73ed7eae9ff7de941925c6af64107432ee6a72ed686d0bdc3e65b31f9645e35ab03e208cdc4be6d3aeebdffa7006a3e041e2579a5162e42c7bcbe128671c0810d3daca3b70c55c082b6f4b766022286d23def8d21754551a74dbd84d8c8d0e18f2b61872dc986fdbed398a83116eb357d0bada1700712a50810491b4729c3512a2dfb643241421ca7b94b1404213db544b96166d96f94baaac93d04b8b01ca1084126f4568f76453b4dd0c557c8b6a3cd9bb0d12732da25ab2c2616df36e2cef812ccbbd2cbeb1320f40724a6fb36c29b2079de5fc22a99b76949754498c667793922f8652a586f8555a0260c71bce5f2e6a675295d72b7a3be227d11db4fb9bc69da080857edbb59a0e8cf1355f45c6d8aacbc753b70b3d1db1d74ef6370b41ebe4d2eb4a7b3cc1a8d156419a29797a8611f0727f59b02885c2700c347dcf98e9171a26583cbab8cd499d5252e8fb4b3847978a3dab9cbca523d3e0ade19c03da5229855edba89396550030d4e652b658cfb8798c462fcc15eeb457c69ee3253c31b4ed2f7625aeb4d7c29ee33a3c21b5ed277625ed34b7c69ee33a1c61b5cd2f7625ed15bbc52ee33a3069d128f18ce05f1de3f3e5983c89f71f0ced2971f8a61ec08a87f447e4ce89334b618dd180b52362657e2a40d7d41ca3d7d276bfa291403ecdf09cc00dbf2c2668840f0fc95bea18c2b9a28cea9475809f2172136e40dc0cb3c7f60850e6e72de8d7f9afea548b0581c140011fefc112a1922a49f43e3282d29903f45fed4b2a61196f93974e05a2449288cf69433a48b8f6051377c0eaf5390ba743a565c83bae7f739619c4b5624ec5b1cfb940ae5a5251a2a7ab04d98e70994ff0b84fffbcb85d8f99b8189d31abc645d98e7ecc708c3a03b5a3250f6609e53144afff07d96919edf79c97762328b49664cba1bb2648aef63448f3e8d3db84fc4dad871923383dcee3b59967a4cbc69d2c5a8e9756322757bed4e2f8a12340375f2e71c63ea22f89a0044f4316dc65a5b8405e85c496eab879dc6a8f98aefaee14ec68ff9432672df033237396c8e7799f7d022b39c87ca9514b2071675088b26c22e3febc4c99e3aa515517f2a69d9e52dd51b80e9d13de398c80e0c8d99371e069460c8a1c4b502d7038b3570b5d1a466ad713a4f66ba85291c9df35e63fc0603146141097cc6a1a78a95139173074a05edceca510c5ce0219015f1464405449c70b5082c58ab0588fde6294d2839ec7b4e8ca9f99de89cd6a905509b4bea644af36e8cb5d33b335ea777109c1ec6f63f0100fbdafa9a2ef95faf4aa85430dbe1cab351f09be661f18e6d6181f6942c15061b5eb1e6ac8269adb0fcfe8e1241bbafc9b340b01fc00b303eaffbbf83f001aea1c15d72bd6471c107c1d6d07db38abcb5f265ac963faa051ad861ed85a07493eb589c69bc20105b3516007080cdcf64445b3a3d0682959549d1fbd8ebe196577dfdaf01bf1eb2f93a03dcdf60fbafcf0c2e8d30f39fff354e03e9d97ab2f15a6943cfbea3d7f7bf3e48209fa2e7f98dccf165ba8e72e2adaf1523362444a422b43fd8b4799b0bd384c4f2f10a2167b7e40852dc8d24ee2ea85c06a6fff5e44d4801ee6bc5db4141f835c7f5937a27c5e27a25f64d67b6ed68e87f5d7ef9eaed46b21d8dfeb5e8e0d2a89b5989ac5bf6611c72f1b8637b7f6a57d5f3f25ac4f6aaf7afacb60d3e9ad049ae092843d1ec7b1cb991f8a5d95abd5b1a944646734296100cc8d6b987e4eac3cf560685d5b98e75253129ac3a964547e88ff1580c65cdccc2db2ef4304fac20f9b705c353701627440096f8e27c97edae66d71b42d815dac05b19776d39a465e0404e8afaa49526868b4a26dd8fe3e452fa37edc676d81d400abeae0cd6e05a3e862da5f25127c2b90d5b7074f3e1bdf38340b68a6928aa4e1c0801b1cd8953f2054d43294015df5272295585f1427fec4e56d345f94bde1eb008858296a87597c3d013b20fa8f3a824ddb92346086488748b975882a3a54d142a705a34deaa249e0ab14e52b22f7ad4633f518bd11b04d3e373bba9df07ff7319f42ed05b432be0aac5671529f52d528913178389996213a2c8a745d9c15719c76b3851331c23f52382d511c1760659651901c87414f0723c1838df7ea1157bb31e5286d1d437075634f1ac8dbfef0724f8a6c4f5d4ac6994f0ef224aee0d9902d534239428ada9f5c409ffeac1cbf8a6d85cfd06f08c089ca8282ab1b4d218cfea9182978ff49b8a90652620366e381766233d98e5f334750188c6afc861a5391f311e3002f029ef0e81b63989e45134ba1958cb2e60b0116a196d261f78070427e81cb79f1365f108d07ec96742d9a55f27470968811f25ab64ad1a50ca6dfb4e3850237c34190faa87b4d9f599b2e4c2aac53efb44a7d9b347462e88b47fed0627977f016ebf248a6fdcff5677e5f7d4bbc878c8503641f94398edfc2699f30a0c2b7df8e38dfb0f45d21d6026fc60024d080916d36df00d8dff30d9e07fcd56dc5075d719ff3f6cd35b56f1ad0acd88dcd86809d378ca708d19086d4780ec9f43d05821c21b7a788a9c56154e3885491411993e543b0ca699f569104fbeff44a162ac1a1089ea31a8d6ded5c3ea2f234778475724d807bea6eee6507b1a44a8e59412acb63d9fd35908371d82195d270e2dd6ea9eee00b2a90704de929b7571d7f216bd14f868e5604f5b298bf18ea80e9737ffbe68ea927d22b640928612892e199cd18669b89c7bb9489c4177600f74efed69461d9f4cd0ab6d4ff33062762b0cc1295664ce2acba573130057e58ff74dbdbe6f92ad99d482b76c44ac4e4f8f65f27bf9428658b6c004836c8f0025eb91fbefe6eea3563053fa07e61b42d6c4b2873061ed035a754048dcf0f78eecf78b31759d6e60fe1da1347c3cb23bbbde9e90efaa9dd06d3d2bc47b626f8e70245540a814a7a892800ec2f4198732c1a12c79b3c24affe8a02c085bab6711cc800a669760e43d184d145becc41bdc9eded13147ea1e8cd2a312b89a2084cd1af5f28d2e8343d56d6972160356a1f4b60651e83a3df2c9e9933f2c2da161e2bbf5a290a554729782ea3b8baa53404e8cac2f0876941ecc2a99158cdf77ddd1772d8b599adcac3fdb927a96f542e49dcfc5a1373eaeb7e5d92f932ea8bdff6b4505913be0b7633c422bb1f1e865be744f3297a98212520d9ed0927fbc0427efb396b10a4572ac0b03202b8f336fa04891a076df94c82826f1415b2745e6d677ad73a66db707eb65e6b567700c23f2bc1c95e042f248f82090a274076e3647a51c00be9a6ec281bc90e07069c0637112bdc94d71c2a043ce4f93132e18bcaa3b03136ea06f40b14a5af136a1c088b8af347a49d32a69357b8b31c1266693fa248e93c5d7bcc1ac92309fede456e49b32976c6ec8a82d96ef9298540d7c655ca9b6850a53a4476d22ed407617179670693e7a1e936b6e4e2018d0b12a374dc7668272e85349ae06af0cb8e2a45d43ba0655f5dd9b7883fcde0d024cac5152ca5622acec11f36ef94adfe9df835280bf341161bcb2623c2cc49570032029f34155c61ab20b400b7070aad3d14ee6299ff40ed0a2a7e8bafe87226afe54dded75d4a18ed75271fcdac5e8b5d08766ba1911be7c0689c6047ca58101cba30067c29e7243a2fee091c491826426db9175151edfd168c5087712bc1d8386abe4ad074c1eb53d83db18aa278a116a29dc5c3b5bcfc13a82b7ea250b51c101d28552ca13171765a54acfe078836a1cff35e1c428d16d458142e3c8720f302c86d0897fe16c433cfd5cb51c026e686615a49e46daf2e847168717a1a527c51a978a319e00ba01632e4e469006e619835d7e904fc7b04a4168cb007375c52af8260bfbabab2b06eb8024487224210f3e67a6bfb58a2039d43341d3aa1d09d6083303475636551ba138721f9a408e6c6282c7b3905c918cd5b0c59463bcfff6a5ebc960af733340ef42a53f19418d52e2be4ba77ba483220a223f397ccd317619a9cc018fe287a84f4b48ac929f7331db6abd91c7bcedd33754574608ed1ec27d13710859d0697f0f073c1fb22e9319f1a06e2494e06a3a2a91a4c8c785402912800645b951a8b0405683965c4323c3720ae60efb1e1b93b6f1701ebc9bd7c5f145c3e20b54abd6ad1bed638b0361b3fc49125be29bc7c441f6483452654c5306d6d9a1ac395d6fca6e4e3509cab99484a6c2f29e793312cf63889adf318b304325990445b4b8ec3db0188337ed8e2c52ef73172759bcfbeab658ea781491260556f1894a90cb1c4511afdf4fdda873fa4dc2cfdc4610d1a118e54c44d86a151ddb258a6ca792b3c1819670a513e9d982357d07089248cef0e0c510d7b2f4617a3359ba459f5ca146a93bee5d2569ed1a46533289e8dddb86b2eb3134434515415fcab9f8c013abcf57ca349e181208a1adebd0222339f57755d52d27c5bd2b837ae2502028e57e53a8efb013351aa243541a2a62c0fffab652e437f42e5ba3a72c3ea42071323d8cbae2259148a7f7215310eacb48df60e64044a5ccc1e0ba2416acce71e8aad3ff00b0193d4d35b7c1f8ad96a6e012cee30c8495e4bd8669760a455b2dcf12271374634aea35bff9b029ae3ebf7c92379ee4a5a147b53cc441fc00e18b6f9bc85b2d0c6d61ca4a3848bcdce38ed491fbf525b3d26274e30ed835e5532c4e962c3bee6f117d932c2070418067d5dd7b89c9d3adc6d46ca45edd413dbc8c39a6aab5641bf2e8b49b3f554aedf079a2d1bb9426208b1f24267029158e70404d2643525710354f600963f104b36ce324109f84961ab7a72ca51121c3a09b388d1394e09ea267a58c525ca3c1e1022be123b8b03102f47d7a0eb77a007eaa0f6ce0ded537025f4bd5f93daaf3af420ee776c19cb4893e4cd12eba1e3e63abebfb50f4bf8e19d088e21483d17432174f4b2358f0e8befe708e20929d508a4506baa95e72d603c7836c658ca4e279c9a4e9a055b649731f24d500e50493814134bb02d723a9abfb4cc9515b103bb38ca52662e7473b95e3614750a8c30e470885bcb7650b4b4331b72c9e12ed362a69fcbe12427db11697b203c4b571e9a4f5308a83d1c61b7fe0b46ef4c804bf4acffef77e95cf7d09129f6fa73ffddf3593ae952bc38129edac255798285ae7d2da91de1bbe95d1fb1f028c51d97628396bde696488411c0891658b3719b9856763c5d4da3fa858a089eb22582b9062e0fa3e10edf1a58aad5668ec469be9d6d6f8617bca5dcd9d465a869dd5a9722dbeca2011d09c38c11520ad09e2c06c5ce8fc198f9fea32b8b1dac5039769acd317de2f6bc26de0da643abb6e7e3fdd7fbf9f0bb8818dc359119dbf0ef21e29247d7dc295bc6cd54abe24ba77eef0808ceae33d7b9bb589c0765d853cec6fe06c02065901c510db3db55890ba22916bbe439690dff4c20a36564d849f2192ce6920e1954776ee5c90f8ac9fdac59154a14bceaa1890ff93721165d23b770935b7df42095f4d0b75569342ef8a4a4090e4f333714b9c416cbc8adaea6b7eeb51d24c1adcc34505e74735a35b709cfa58a9919e211eec21300119c09a107b3dfcbe314e6561b39b549a426b9a1ec4739356ad87fce84cbdf347023c25983e8ab5aaa813ed171bde02ae2f4617732c6daa5f80c7af27a4606b8aaf4fe3a7c4fb2b88316a6dc38983624b1c6eaa4c3e2f920b2b25abb0a6603036110d90c578f41cd2569686ac7b69c2d6992bb584c0422921191fdd35f94fc3fa762b4105e2f0d7943ee95d31b2149af210f90f448e514bd295a15248c370100b1bb1feaa21c20c4c1a2b0bbb9c009fbab47a73ea0ce2868d501e7209c9bf94525ec3a225cb96d623370d19dc70dc702c000e34b4974c9eef277c2c96dca965aacaa557df4dfa0c73e2f223d491a3dde916a13ba0c81e253f9da0fb74bd2f026e72557a5254b2da5d1dfbcab322c560076e256fc335a9ab3e56e0fe832bbc43d64e2e62ca8b943d681e75431a1e8da8fdb65e4d78cb24f8d0e78f80b15061966652f6f0e5b0719bb010414b0235c1dd2eae850d66b5d5680318b44a3802d5019d397632921c9586d20707f7ac1cf5447c3f47713d5d638340170fe4a73d029ff493fcfd40a4ebbcc959e133a4d1d4d91c070ca45e6b2d6e20a62e383b3e212ade981e9f9c5cbc316e827488484a5b7543dd91e99e1471afc893bfc3f475ef4a65925fdb9e798b1c8d86b48ab86101486d8e193e8f463d9f8e5fc14cd9a3d5d6a1167817cc33499a3b0dc8c81eaef4ec931a926a9b7c10386ed6a8da13c2a1be0d793d99c732c47daa3850367560b3bf886b53ebf126e0fefeec71d733506fb3e0e177c1e1f7c771df1920ebb1a56070eccc0ae3cc43da127483e7c6e46e4e4472fc95a47724bf378d9dc47e12d074ff71f4d43b316ca8a263cfc419baa63234603179fbee293c7e42d5284076b0fc7de7521e4727635eab1a9f4a5282422e3c8c3fe41bc3215e67919443353a6b4c05390e1e316129f0a9979a1c07cb8119732d760e7aeaa0e27eddc9eec0b5254e4523c5f5745aa3370eba9af79eec75f7c38507305958551b2aaa618246d942da8c6389d42e02a054aab0a507dc50687715b46d05112148a96210ae342d42f0741ebfef31eec0c5817d6a96bcc8e94f909e0570f006dd30f4eb37717576c0ff591cf1df408078935d1647c31fc9e52b1116a25c25440c5344721fdda06dda17a20a3d8ab3b94a626e95ccf367504c9459fe921185990122df0bf04e79e3902c43abe7f47c01ff758f981d1550daaa5c7e593655079f5502f175f26b0716fbfc7938d633b1ee54b463b439a817e2f2d77f91aeca215e0bb4a01a196d576c0f08a85a45f70ee8da13bb9e9f54a3eeb51192ca6e66ac2608a1b9b44712b5c9515ac325fe092cb045c194580708311c40a0618336dcd013c23f306472161dd7c26cd45884e2cd618ecf7c5c076d89eabe2575f6a1e38e8bc316efe42f14c1ae48260a83908228c2c3497c8fa6036de62a2391b701ebef461559be33afa54253ecbf5e4d0e95d82e0c50518d2029ec2483947471f2d742e520f4b5dc6fbcd30d15f70d38603d0204eab9e536162237d8a5eb19edc0309a7335a3c16051401a67148915861e32f380e4f2a6e32d63a27fd461005536140ba26e84c305fcc535609e21960475c1c84905308996bc48765714e2ad4e746f1ef590e2d49d2ec2e29569bcd8b54bde23d61bea9f81af268048a3e783fb21138c9967cbc81efe5efc15c6864b0e6099d16602363982cfc71c669e998dfd4eaaebf3c5aff0bb50de9d588b7d047044d53cf1e6de1849cdc4a47319d7acda942d380762a5645720abde6e066ee2eb132569f05147e945b679dea80ddbe4100cc2282dc6e9652280d5c08d51f6c95ecce7bb68faea0351acc92b6f293a101749a1c0465b6ffd00380cc3772d478895080939c1190c51e212bcc4f980ff714803d981fbd8a72fcd8997182f009212ee94177183f6ce773efc0ee999c4cc6d1e885d495a4b990bf044c685b1851143bba903dfd2acc106ef5ce531ab32d80b08c004aacc3bf0ac609762643605fd2a176686decb7447929c5ed1753c70031c1c38e63e608884de628021630e264768959f82c1d9ef623e5509ed102b4d9359cb29c8fd26942be966cfe34bfc58d5488b093bd5e611d1ad6983db5b1ba8a06b9f02af7466515bd16330216c2a4dd17e4eec29ef69e66040f3c5aed5dae3d7657b9604cd8b16fee28504c8e30f672ba820e9906ccba798606428490ee58c45bd9abb692ecc897a04bb9a0f27a81ddd57e6ab5a93b9ae0ae6dda6f303f39034b7df702b4a505f4dadb9d1e56a5e634377b5a1fa251a0ad0a906fa3497cd27a66b76ad4c3165bb618bc338e61832c8be3a2731044438c3bddcff81766726e1ce5d8fbe9c76eeec1c58e87ac457418e70d1a57b1d3bcb8dacdbb9c238f1b1b68167a450d91815ab0589e2fca67dbf17a21710a9cfe52bae8795a0f1e92192861a57260c546a58ad77122336e138bd299bc5e73219245dd9ea0fd6ebc6c187d59bc68001131f9c5173e82b4f47aa0552c46fe402bd08f31d78d698bbbf0d995204e2b9bcd68f5e9433d5b3c9333d49131150b1be3ececdbcba66576719f05a6c2da6b10e28b6538b55933dacc2686e7fb9cd72dc356a21faef7de4a03191b28fdda181c9db8a2ae04a4c815ca416b8e940657544da02e51c7c49470f0dbc5cecaa5661c3f671242b5c2f0df00ec0bc6729872f166c28172fd6d6596872e56ad9811750182b178df4334d6935d06d267b79efcd888401949edaf1c398c9ec6f81cc362f786e36708af3581f944b4799e95196c07eb12bfe75bff72454dc54ecf867055581801c0672f648cd6b6e924fea6b1fe28aa319e016253d5cda20a827b75a4817b212bad56513c559f9d389470c7d98a6153a8cdca90212bc0f8695307f30329b2097b76402173d7be9f45b8b142c7e98a0312e88a287b6c0cd6b3c432161a24a1b505116c2f834555bd4cbcb515a0770d7ba625355a5b1bc1b1021e346169198de4a097517fc48e601da08042c2a35c9c2bf1940ea55f9bdd6129e3422eeaf7793a14b737fce3f75898ffec8cff74115fdf5e90ef44aec8f0767c4429e6624a7096effc1f79b26dffb79cbc315ff8e40d449652940b0980fdb291fd64c823543f56d4567e24eac5364c3685f1ac61daf149f5f7f17394907f61785227eaa34421a9468926c33967a4a661559b395ff516de9371461ace32170405befb432d3c1020d8cbeb1498d3162d823da26dd343b54e766e80076d801c7f030fb5d968ff0e6524d99af97c9b949756bca2a8761884189bf2720f6235fee0a86034ac7ba4eac994b61abdfcca4861210d8c170de34ac98a23176864ba865d168a9d5191189a415f19cf5ac54bcd79c021d941564959033c97e7bc51211804d418423f4d49d58627762b0a9c7de9d8ec9eb612925671e0bffca98a658bedd6a12d3db36dff9b3673487e41e534974d3f6f5e30542007c40453389fde305c5b6505aaba7dc25fd48887cebc32326af0c10be5afcc1e7c45629b46d0f18cc2f3e1c8d0918398b90e9b90d7009be82fd814ab0480ee6e5c4824aaf11a0c6c3bc7055a480e6871bb57bc42adfb50e09b0f1881612df932d8d5d26b8b8bd63ca295536919f1b9cb8a96e8148143fcda0901683d0ae56d65e3807f80cfcb1f2f5dce0b2edf18175ddbb229fed134a239c1a49200885a40f348e4450dae7511166e67043c2882ab8621d67d2463f59a159ba2191fb7a7a650f1af59a0a21cf8b77b41f6591eb317b103cd05d02b7593adf005da0c46b56de1131cc4fcf23a48ade95c9e130a1af81834e4ec4088eb3f7044135301b23ac02697c3a33d362caa66ac7c8b445f2a70b95e14d93d2441761fe620c76383a15e07e1d235c7b87b0bf69014282a8d3b890f0ae2c23bd04402fb59ebf1c4a100216ab2c4cdd352a1bde9a8dbe0474531cac1b0400ee6c689a86f3d058fef3fb180476a49d1ce0fd18f0b97b5d6a6143a5b5642ba24ad903fe44bcc13921d886d3d2c0c29b6e82214d28d1be422108b067266b03a0c53419223768014dd3c7966680f655987cf39959dd2c43465d464f7646d2aea7b356e792c959b95bed010735b57d71b32cfe70eec449b895554d61e75f62dd1cda4f536395731140fc78e9adfb4e6ae8493d1006ec075123fa63838cba5c10c35cf7869f7350e948d9ba1a6a520843323e36e0ab8ccd2d6c4e1460623f36c04f2772279a805c780ea883a19773c82ac3a11179da1cbc35d20c02dbc8ceedb1c1258b1601b5b3668dbeccbf8f84d9d4773e9601cec85fe083e324a6e1ad751aeab46d01f5f55b36a83a98b9e90e75eeace76ef2835ccaf051d6f4b7944b858d10c7d6180af2e1416814c939ef7b9175fc0fc373bd8127e2a1803ace34542f645299dcb542c35e3facf4232674ac3e95728895ee62f344034f6453774bb1385e095c5a7eadeb70f5c9f8e7f62399cb601735a068dbe4da70e95b29759327c0a02097fb2b322c4ca2beb63963b390987e5a15cf9901fdec9d072c495f2ef756237e74c32a0def24f10d585907f599a906b4fed7b4d182c08e09916f652f04c0ae14a1f07f8d83cd62f7bf30d380efc53a29bcbd9e9a452aacd7936c4a83dc9cd83727ecad15e938e25b88f942925e8a06b19711e03793832e150cb56ead2dfb65038c01ed5669f9b8164f3ff5439978930270d11154481f9951f762ce1185198b5abd80084aa8de873695130d1df86988183b35b0b9e9ad494e31776108f050aad27ab03702a896a6e692f7a9cf750b35889cef62313761e977de65e1c8ec229afc0df82dfb06d8ef395b6f0cff466d506a0b90e1e488d65d766c8e5898163fa9968c80e5c26ba84c684cfe75f46383ae8183c6493ec35f1caf995db24e2198cab1a059d2f56af096edc7bd57aec6499466d78ef51f5d24ad9fea4758521e0d7147502ad9c38aa7ff5820681fce679034cfa416a5322c6022145b528272ada26b75750fb9021a4b2fa43067b4ee293fe2fdefa08e0d3a4fae9634921609e15ad07ff0a5d5bfcbc96da26e4586dbf176b78cac9ce9545c979d244bc8b60e8ee6ce1d2bc88f5f3c52fc70bea124546d9a5578d2e1ec287c6008b3850906e84662cec6519ab07acfd94210ea7cc43a989a91ddbbf08f25911af804b4d90e729cd8b47e6df629c624d231846d115408934ea7199df2c834f470170c535655b8d7cec893860722afe0ebdc5de04f8fca28f6318e42e1696e7b7b6e8491123c0e88651a0c2bbf065f7f20b58400656db227cb440c3835b891b9d394e231f8bd7a2b4b9976c32f48d00e70c00b048a3398e444d0d988e8395da1b025aea1a7b704b8d0166f583e9b144f5ee71b9b9baf9016426f3157a1dbc31a514707b622a4a7014c58c24d215b632d0a8242acda9c7a7d7cabf39c419b6f8c6d95509c219d6047e9b8715f9669fb49fb90c969e1370fa1d066d65ce85e9dda690e9ce63d8edb36d46679c48246d80b1cbee781c8e327b44598fe1f052f1001036c701cdeb1f872de2cb12dbf9e55017063133c2e5902ce600c6d5523ed5a5625d0f9a7aa242ab6a1cde55357fb5ae66b9b3edbe36ff9ac00c263541578df326aa1a1cb4b572a013dc5e2e2e10eb3e42a6023c75697d50af13675851d588beb07f7060787141a4257184b3fcd9bcb608c271e816dd9a8be1acef675f66fbf452379990c3f92474b69611adb70a365ee9c9318db3b3a51660720b62d52a023a7bfaa9380b6ec4379f472e07365143ed946a78324885e04a1fd22713a95b2e7b97f2a04fd2265a109864bf0d6681149c3be678c3ead930187ea9c74a897af2e450cd44150ebc57081d05e50e58639dc050e4412ceacf7d2fb01741fd4a1c5c3d0d0288373637908fae88e297c9f84e5049a08b880f6624930e0484d049c6798a715bb46a5c6ec3f05ed96e355c50d9a3bc59988cf836e8440ac43d5bff12be0ea49d44be96160af7c4a3dfde2d6b0c197dc47da40f7080a8e2ec2921d7ec04ddbd5267dd94d4003fd9290529f7b802a1060dfcf49fe3e6d413641ce56a2e7a8d40927beb8bde013ea44596610c6a3b0d291c0b1c301121e8439f2baa80ca8b4cee0cca01347e2b47f075c771b812b2154d37e9209614665b3e31b28b894e326f26443141fe08edd961057d89c3a506dcf1d0560ea81d2f6b40c966fe96cc228aa6f7cd1d6dd7e40bd8bab3ead812e40d0ee0e4c483d1f15490334304c5abd0cab837fa7ae44e5f3bf13a43fc2c62080166d5501c8d97aa24d280cc3425c5c68e37f564718b162355139a617232c2ce11a5d3e9fcbc6de0adf8bcbfa0df2a494fc0477b74c36e0d211a44a0e280affc3ec5153a377f6421e7462f21e5531737284881919f0299a47a23994570ee3d58372b484ae229240e14f94cbb5b01f2c78bc55e8d0c10f68f1ed0cf4fe8b9c7e0eddff9708d8916848680f3da79a94e4a0e6bc013863884c315c0d9d39a493b5c1e80d9397d8211342131142020753c7a83aa12ef1328183d1361b5bba81641f80eb6b7637ebd55e7557186345c9e8f81bb92f9a2464b9cb9c38d250943b2b41171742c9b9cb631285ac7aa7be600a1584434a36af8aafcb0388a248804aed88b69c19ef9b12ebfec2a2e1bbbe85f49e5b66235575fb2a946e9c43ceff5769bc801c2fd14889c7c2a1a46c2c177927cdff73cd11cf177f1a1cc3eb935c031414964d8aeb2cd05490d46cc930803f2a4600b2416400088bb3b5166dc2be700b080a429cec7e6cb4803f49ff190bf4c27aa168257d7d7bc68cc5f59dbec3f02f61d3f66b383e371264090130376a77bc7acaef8c06f263f86dc37a4d1c925618083d07802de7630d29d18ab1635953e1313105525a5a576296af55dd47aa1a18e4653d4b14cbeaa7520228525e0bcc3349f68766ff1182251b48d90302c3d50db8e0bd2e36e26d0cd1dd85c5aae1ed9e42f6cb7a36279a096982ece3b98c232f09aa1746eeed03397fc1249b4f6027a4220448c7fe104a99600057bf0e1871b9b8d0cfd2010f55448d25996edb65d9ac50978f259ed5c3fe70d3cf2d6ecd3120cbf2734faae5f184d59cc5bc069056c9c19d17f592e31e5ebdcfbcc6a91834919b9869f8b1a670c189fec209ccd6a8b3f8f0eca00324a2c84792a7c75e3a44fdfb8f55476260f60ad34d1fb8e9f5efb23d9d06ffe90a4852661f2d2c1efabd967a3fed31821cfe3a4509f98df0ffa1f5ef08f4c9ba85c466f88c4d4c303b6ab724fa6c2a2b897ef18b4157f29f3d69dbc1cf054e5138e4c35ee2aff7d381285df216be014b6aed2065e9de284f7e31a3c00ab30ab98324bd59b52d07865b012ca5d15e17b847f0181562e351632d2eee39341ad15759607b7cece806c45f1b473c93f810c6a69bedc496c1484937e06aabfc9d6fd9840b1e926c6a338d430373c123c6256301604a2b5f890cbc6b0b302d2762dc057ef9292a18c6cd746da84c105c22c1945f6b5da7f62f2e519074debf4aabe43b8b36a09210bf7427b82116152085f615eec918d6538482a4c21f080ed847bea57b7a624cbef967c0dc203c7110e2814cdfebe4219983696d4de97584e806acae99613e921088bd5ec47303444dae1e2e5801b9ac44acbdbc6288bb36dc4a37c04f8a90a87ada3aaaaf7e6eaf8530ae260133da02dd80beb5804a8a80103312854550e19968aff80da05db221b2a9f6382632b440b67c036e7b2da26084257729338e466f016c63f65cf94c957ad831164b34fde79a12ffb60fedcb8ae4c56a38c45ce157b45d69df052b6325ef4b3d5e78294ad209a138a0485dd413e31d08a4c917495bf078a9901f5a944a54e38a03784621aafb2178d5915aa53ff42277207b1a7f2fa9d3a701148692b179357a51ad478c4628d50103dabe765840f720d30e0cb8b159e480da9c60fa3b8efc1bb2f8c02a46dfcf107b028c3671c3d53a059f31c4e70019887330e0cd66abe6dcd6548cefda8ba1d8cc8bf1237cb7d7a994dcb39f44ea397e17b9b81d64dec106a95a6ef8d2014c92b24f2999c36f8d5b521217989dac08d05b00c6039e779710aa2e1e40cabfb57016cd2b7392641004c96312e2a198c23deb46087348911e10f5e3d3dc260ac5d01966b244c0f56fc5881d967863ffafc55585367c00478d88f1135ee214bf07a06c3e80c74b2fd1e6982fe703dcc67968002a27803ce030284fcfefe2b09e29531ff0652d48f96e0a3a1ce56579c381d40748d935136f4eef9b3da68de19d577ebbc4a093f1db046e5a20fc01d1730dfa8fe0dbdc4162b802a3c3508d52c1f7f00f873c4f6f870ed9ba4108e643480194ff82f7c1efd864b0469dc6519146257f0078a3dd467dc356289ed7a1897f9102156cf956374b9407dae8a41ac813840c024bdbe81d240bee20365ceb0ea1600762500d981d9a447dd79c888db56abdd1a4dfb800d843b38c43ef3c9cba336cfcf9d1cc39599184a60ed2a4b64288baf40926777fcc5c4341c18e352ced74ac1cf7963fd50d0a52498ca4e43d59641447d1e1a9df835f24b33a2e86977ebe51c655d22a92f574b220f6c2cf899319976c596f2c9a7dbfb9947e3940ff6fa5a7a7d46521a2070e29081fe675e1ebaa0939538e7140bc0d99e3c6b12632a96f7aac555e7dd38c891cd0a562087d0f341e48be3178168695b219322f4faa29c8c88a3d389e49e4bba88672bd87febb15ddf6dab97764db4bb1775a219fc97f60ef64f271826b1e3ab323288bab3bb14e2131b71b8c8127b5c867c0c02df0619dcf6ab554db7d2bc2346fb33e9dad2dde763379efa56975deb2226a19934281555ef36bf6b9a34bce0c962dd053e4738be00983abe5089d9b0d2e112328ab4b2ecceba3213646881c64db8a13f09eff938382035de5a2a7ee8a25af6bf8e4f4942ba8b4b04e1a2d061ab31e79230836bd7bbc7b76541105306907697cd306ac296fd30c2d40e1561243d60780f874c667a405087cd913f15cab3b97d2bed79e3d6a68050fdbb4672d6292e48286ac20374d20a312b075f044e925a2a895a2bd430abc555754d03ffdb51dcc53bd7821e2a9edf0998074f8cd871eb4c9c9ad167ec02d02ee369d73c3313f71f119d27bb01f1ec84af45cedd06bf13d1696a4a55b53c071c98f112697202ac192d63d2d9129461398d7354382f8ca3ec4dded5b11cf76c5309a020e598af899fe7cb8289a94f83bae8211f3e232719519bedb1a9c67f879b46f6413965687004c0b070a7f7e00d1c16362d0ef59c3774494e519d5f427f5532c004c42d81466a633d387b2461de8deb1c9f70253eda751d7547904dd11a9c249cbd0719a4cec29ca2f08b3a978f90199d662df927229e2e9d5fc1f915ffa12dcf87f749efa5c34d90405743f489d8383d0d37eaf07da1bad2eaf20ee4afe515ec21cf06753b32878b43bb588ff459166398da9f15e1af8127840bdf2c665cb4379f584eb4f755377ea063db2309f90fcd79d79e4f229860211863c079e0f46878e585a8c10d5291001e0d0d9d1ec27f409f343d55d5a115e74de3d364486fa76415b870a7fb2b284a4ca5294615dacd1f95a06b6bb65098858abd861b385d42e29a3df350e189846a59b23e290e53e5179c5e2b35428eaecfdb4d5ee768fbc08928ce5015b8ebfc9809e72166195a804bcd7b7a38368341fdb014a484f3501caacfe3b86f2f8be19f78695504abfed403b7920ff067caf52b69ae1ed518f928696560017286a1f98371b8312f82d98372400ef36dd13c82cc069ca1ea2c8b703f97cc7d29972f71a5b0b4f5885b1f9e240380e957b4cdab276e380f16c087c220e88a37300d806cdc1120d5015c20b43417f33c8f9c67e4c3a2386d51d947c01a893fed9a8b7c48a453f936918d85981fa83e1a9574a29f4aba0a1c6f550e33386076e7026c86508c9b1a786455305907c7ff2c5cd321e92ce473bf2f3352623b70cecd7d977ca6120fb08b7477871e7a0622b4d19191fb6458c7f576e3403e152101c554896b549affa09fc0061c6955f72d99c4fa4e23aa2502e96d4f376df343c2c186d2f3f138f2e958f7194fb3b701d2dfba284c7a372a94d65549aa64437f36c9562fc239fa27e425302c31cf45eb61bcc468b57942ea21f003d71736225e764dee1754aa4ea1d16e54efe0a29d5c54a4d8ad41056ca85b6de2ddc8d106a994cf631992f35291f62f89d81f6d9d809457bf16d545c7e3639a56facd26cfcfde491b26ce0d5f2929df31a42d3b71eabb6b54d93c02cf6bced1e67d4b88d330823b9d0771ab1f279b558c064cc6ed9ec21134651b72777a8114621fd56268c9c6f38a2c6e5e2c2dfd0403424a8f1798fdae566f762b915da1605887062b3f5804504a239e3a46604c79251cf40894cb4d488d63b310858e84f7645b4c71cda44c05daaf6e1e62da046d54306c01f8f0d023ac3c94a7b72e772787bcbc76f1405dcf42238e4ee9d3b368e701a445a426c84e9b0aaf57cefc38dd44018d287752b91ca399c371940231c9966d591f52d4d71c35a9358725d63ffee0998f01a8932cd389cc2a268cb77a11a5211225a57f7e873a643f9700d30aff3cae2d2be2a0cf86519e300206f09b82809d4d592788775fadc56679dc5370004e31009be0b7dff1713a9ad39eff868fc085b4bd892610e56ab0ad9ac0b51bba37b0563d0118a737e45e7224801c46044829d48fdb4828d8e2a1552bd09c61aa6b90e35dab060bb2a91d6fc25bc5e2a3e5498ca66b82f1cb9da8f888dc3948f4bfd1860ecdc3b12079e5ed08d188c418ac12946716697754aa3ff5deeb80097b48ebd6d964937f0783cf383253cb2fb9123eddd641c7acc4e7e166961e2bfb644345709dff938c35c19c760675c2f46267945ceb7bea72b957e8f9f0930a5034a41c5885baadf3a4dc8a61e69f444164aa95f0b381ef031ce62916e2e3c0a3abcd327942edc063a38f1aa4aab69b089000421f49186fbdbf1decf1b5969c4cc658120dd2c4a4dbbb5cefd551c984347758b91863b11f5c917ab6854e9c6af11200b97307fb371872d1bd9ab4cb106c8e1bf99464a3a53ef38df8a35cd30562a1ae4f6d6ae2ec142a3b7ffb2849cca2591f2ceb73f16001aada377f382a29cc448f05d315dc2f7fde6dbb5168f4fc1a2d58ab6aa88880c37d493724387ccce83da9a008702a841eda1e55b7ede5bedfe9c81f267f9becbd00b25199d4fdba5c009e29696027c63ae7ef81b29364bb7c771a0c97914ac04a247355867bd3342533b643c4b8ea42fe0a29c671190bf002951186af4ba3158ea261ecc376f9d449a4b09b84a9e48596f29303856b93d280e36fa610e4b92c7564335e5f513f14f64ff6ebe376dd2fabb103d001cb9de1b6a875f68354a0be6e16df3f220e5d28ef851ac76a0f4843e1fe74f75f824dcb3113be02b7d4a430313c1f8657871c0ae2bc4c97f892b5a41322f57d876fbbf2d5677633c8511b3d531228b67ce892586bc9a13dc85f58f3ab3683b830982d5594feb84c090bbd7604db76d9277753ffca3b4e3333eaea01e180c5c13fa34240c6c129d403f8163a0bf6e15d24045a18b25a5fa81ab31a137311ced807023cce0c1ddb58c68e6774e259808f5dd6df18f2ed5541e93f902c270de169091f3f7a6d50a376336ba3f8ad5c5348b00022e8678952d6672dd43f86a052fe75325fad2a55de93eac2dd2fe8bc1b1e78a329ff0eb24e839a81d500be24f9ad06f4f0e9c620cb8b0da5d73698fbe485d6d8e9039dfd0a29c12dd6b4308aec59a650034e4b0375ba6d507c415dc0dc5cc4a923f7538b18265b8ddf55fb0370c2eca08225ed5092fbc8413f9bc5c5352d4282612033cefbb2a70ab472c6de69521b80f7d5addb3bc01b7cc576eed0dfbb446b9c9aec9f4777e4994d7f0ff4dadbefbd00c518185fcf580ee0971626044f108b1ad6b6af604fcb50211a5d47dbfd41a881f2a18d4599db206d4d22d017ac0383b1eb500281a588ff2089bc64e4c89091d9020c16f332cf0ea6fc984e20d603e85c4abc18ebf54eb87ef77738ac5d84392b396edce76540dbec5e2f9aa455175c7a982a885b49f18a34d8645b499c7f3d571ade99723fcec5245699e7d537e2e6217eb55689a2501b8e804a205cc2f137f9487bdc45feda7021c1f133714f824e29b5a53b72a791355f49c8ce26dbab343df8caacc8f629485ce2dafaf857c2f2986f105b2887631441c048d078193b148eb6e441480416ee8cb06dff58219f1513006511ec30d6ff79f47a6fb99ddfce940258feecab2e96fa1e7a3f68e76d33eeee421a553b49e17aec42becedd4c78197dfb21150cd3570cc959f749d10307be0867510eef58e275dbe786e4c74f248b82f8abbd770729d34e57ff7b579ee78488f3ed2e1aff90e1e5c921f9dd08145ef0b6321ce1d909b1bba0aa4ed2a1e0b65f8354c8d4d9a94c6c9b76ba1f0b8f2b96aa11bb9702d58f060e58393fe7c0a479c7dd6b615611a1687c229afe032e299c94a95a31716612514765d45d238860e1920e4289dcdc950cb7ac5570c7f0c0de58affcfac3ba38ea02e1e1413b22e3583915317a7d382c1acb5d17b7ae88a2900ca51cca2495c0b7db48cea326218950b71ce61ce11e1f13c558575922ddfed4b976661290f20d5c5d638d7ab2b093cff259a167afd15d392ad39e77ca08bc282c021937761fe05f683da84517fe69c7c4efdcb9ed8a9b026de7811ca5924c68672c0257401339ba86e135e987dd31ae0c29a1572ae595dfdbb1458771869c89c98f3b6026b095358c59a73c6253c406e1debc500098c19400e2780286c1c77e9fe649d229fad3342626a01493330e453e02005bdaf7d64def83ddbac54ec91c925fab857bce191914b7e96ae3fc8cc66ca51cb42b94d1188b607b04ade3b2fb860b0f23b3aeca4c632b023cf4a93790537576cfe439e1a4906aa35dd2efbc7e00d73c4e3a09c42757508a57e19056b98b52b56d09df6b062a9ce1d3d1c050f4ad61708d18894e344b911593fd0610d45ed6b584f7f0403ec0b795cc5dbf7bca923bb07bb6f97d84deb55b7a831f6f1eb06cacf4346ca0228dfd7a32d74572e4de563c5ac50b02b17ad46fdfc7d85c0bfbdf5e7d13a11f7b9267bc2237e9103b6a24a2eaf091c453e94bcd7a1d58f07b5b72b20b7e3f4317709356ed1f9531f47d021a5eb00d3e4c1afc78d9bef96b282e97ab22253ab5cc20e48517742157bb1561f55be8f4b058cd5fd86006ae45ef8389f24147a5f8e6bae0e41e3a1b276c950abbb3b68ee2c5f707ea3a194028829471f7383f2160844bb3e4f5db90489db1dce4922847f03f9d14abcb925666593bb6c7a01e9a127f16bc7c7b4fd41c28f317273c77b6401c6e379a5122dc6e86be227c48319b165db69a87857d104c7c6f6b14d5252335419c5599a4dea873d0cf629a37ba74595160382bf36884dbe759ae16fb3ee912eec0e35fa757a8442c5771a96080341fbf03d4cc82f0a916b8653d6ba91fd69f30e8dc715f15100c3d0b8433c811e450ed4b62f6a6c57c0ca869db04c00db747a5968ed828ab84c195891007aa0409d86fbd8208c66c1e988ddc6bbb5db884d0a2ee049a447c38ccc00643b1b0790a3ed04007877e3efb7f2ee72f444b9400d00296c37c1d097dc04961a147d66141adcae004561014941bc5e472dc2b4ce45545197b05bdbff28fbca9ac01e2544bb08a5f2a6df947afd4f6d32a5a8afd8b09bc08a136b9e6e83a774094d3c2a35ec0f9915420c5a2ea12d5e3c6204b36d7d2bad674b8a3920a0c0ff17dfe19a67f2f4256f46305faa9594dd1d811ddd5108c8953707846bb54c8eaa60eff03bb6f5d137ca0ea475a56cac272c97c830a72806c49719878505a212c1a1856b7299febde4d5bda2a48ce1f8303dbb3aff938a68a1ea34cd6596a1f9fd9b5f5193538003b18ab801fa1dfbe84af7d4a188b02ef0404b94d16ed3d4a97a6a93e620feece8a4c179865ea72de521be2310a6a39c13da102278d1cbec1f51a583c561b4d731ea0565247e02be38b06be55f2f23520dbe47e24ea161ae72c5950d3c55e6429eed15ffb8fc82f7b8e17abfa519f670827c0d8cf6c17b19ecdc28fa27949a5ad1d5ac6ff73bbb310654a6bf1f096354a7d02d52499350711da8b932644e09d8e469531205f28215e6bb5a3349f626fb7b2c281df7fa4dff63a8fd211432a4384d8be870dec5a0c62210b518ce96724bc703f95e18d04400afe0c1c94ed8cd159d41bd8de19770e06c867d05a1b82d8d882fc835b5195a83a9255d6a4a9dad9b48f7586c4c47b84f4d4ac373fe1a0e806e56cce3cec44523c9dd860b6abe463b51381f22b0923660a61d3f6f37ed24ca5562ec538e10c629bcaa62c009d9537411dbb08438b5bd11aab7dde5991dc5c4ea36c11e360a2ba628185d28b2ac219da6d2e98b4df166fbc648360df9ac0c46cad7f73e449b2e45c69a1184d164ad714522c13e9248e4fe428a9087ded339065056e4af1967e5a6f475d20cf32542490322a3663deaf9a55a7e6e6e7bf3facbe39578486c45433945908c60fbab205c407771235bc95fb2b5ca0f326453a19421f26fabb24d5ea3f5c236b025798266a315b746c648c85a021d6f5990953cdf2444d4be7ba6c3806cfcf0e8c29f16b3ccdf9e4d8436f4524b6d6c93865820297ea30a7deddc467dcec5f1c02697132c101b476f55c6d492ecf5bfc7dcb235581aa18447cfb4347a0b62f53a29745573ec7b6110fb4efc358a885b2293059b0c1d79527c9166a46589a540b039d0230642c964d235b9a6087a10bb2725566b0cab4dd6b8254d382ce5a3274364d3cde0ecea882800edef020afa938842bfbea12d4af63d52f6972740034b46b00a5a03851d68ff15a87ff230479042c2f376d0564d7d5663428acb3e6c6169086812a9bf93dd61e1abbf8a55a6fe4a3f613989fa18a4d7e6363cc4a46c5fe2946001d10cc29c8532982520c83324f6305a58d8c0f8037c633608f261a845b97402ceb9e68565f1f4ecb8880df480c2b0066aaa04922057beaad821394bd6d3ba8e1a1bca53783a4e069b4095624e910a0b2aab4effd8b0cdf82c8bbd328236af52350d77a1b83c80d14ed0125638202ecb2a200d36c34615dfbed32c44d64e99b8de1cd4e7ca1c6972692bcff2d7db78086f224c7d3fdc56ac7ca9da8b56561fbb996f391772b6c0af8d51c8743e01a1e0a2c054fbb405d5701dc7fa2946a74da55426766eda29214d5b4093fa03a7219828e5bf31a367c0e8b7090ac7859dc140c6ad9e7bf608563c5c5821f65ceb41dfb9ec68682742039f60827ec07487fb57686685f6297c5398c7c6d7ea733f747cf68c33c09b382c510bf2e642ce23ea13fa21d235336c7512c76f7bf028e5a7f6fc0181e20de8689bfad11ee193f57379d83dc94242c8f87acb4a2d3fa0ed89b3b539965f0615191fc0fb4b6cac4bf897c485c62fe5385bc3c0d5cef32f630a08fbe46256421aec5f064835ddaf1880d3c340d050fcd6d0e2e326f1fc4774d061390e610cfdff97150c47bd335876466cd312c5304cf1992b76723ff5c454f55fc6078bcb6d48ffcb499eadde9ba3130bd26230b3e87c688c3ca56b3ab78f5f06cd64536bbfdae1bf5c2d751851d4620601a6b331ae192d1b7dfd6c80139d6fc834309ed2dd0081f916b8b51a4c3c1fe1199cd936efc627dfeaddf023785c0426c40e79c95e02539056876aabfad55160426f0fd8114be8e835594cd0532ef3c23473cd34062606adceed7956447419eeea85ce36126460ae2475a2b8440590e153f2dd256b2c78072801972616b62af0bcfb352eda4106901012cb94bd3684cb9a6dbacc501e0aeee7ea0ee053896b0aa771ca86a635640d1c8e0334ee4c11dc04fa28353585609a13074e58bd68acebc46f731cc1d4244b20d32fd57fb476093af3f120f0258ea9f896c1852b8d79074ebf8f6a63b932ab252e81a4a5b959111215a0c89c48e22148d009f1a04934079bd0360f4c75a18f4c30072b53401158a164767caf32cffa81c95db0c1240e0eaa4be460c2912cb2db95c20a2429c9cdb1e3ae41793001bc2ca2d460ce42ab25f0c366c256360fe6f44e79b4b7f083f27904b78c91915027b943d0594972438794842ccd724be3154aab1de4cc803cc85f7e03806b89bdccccc23bbea0dc263a988466a7de180a794966058922cf506608ac611b789a8a1f991d12004149a05290c88e5bfe37eec1badb0517cb2298ccb9b27df751ec175dd989607bb247983aa9af8c5d8c4d2d461244932ceeba6df12f236be422e76667b997bba20a2e0528c9f46fbcf3d76a884423e595ca0ba46d9e2495768544a19790acc6a46141a83bc9e356eefafb8f5d612899f2d21758f3944369803d3dee0cf4d96edd4ba1d01bde4b852cad70db27a4dfe5cbc64e129b99b75b145d45f4bc259741c19815f238bdb850d0686ac5fda9444850c79b8978adcc600cb90532ff77afa5217368b637d31fbc84f3d6ef0fb4ca4644712dc2d01bee1ae86a9858a9910a99a8f7acd964482c73056991cd48591874f034fbf6cc4aeb912a8235ffe930d2a16465af5fd2d719cbde8d68ed9443a403782609a2585c9fbda8b33d49f898f07393335be0c973458363990166f2625e171ccb7324bc9c9e63cb5cf33ad01a5ac64f5ca3e875edd7d3e34cd3452fbdf256609f4e0bcbafb14e7653bfd3a0ff1d5064618b3994cbfab9cc4a57ae11083e613582126012080881b30303e7f635b183eab640727ade0a9f887bebfa093a2a5aa69b4383453fec217eb47c957a492c83714b7bd11328ad3d7b1d99c12e5c85bcfaf3daa99ee50648af15d118175cd9097054c49970ea3550012cfe3d47b9120e9606f67aced37be1dab8d7dbd129db1ccf65d9cfbcc0a2d73bfed33c66bd4cafb106921469f6a52d32ead5e8cafce51c8060027be941153f8caef08dce1dbd3085eef4bd1eed34966567cb070afdd7389c68ad50c631a891ef093e561327390d43919cb36d6d45622bf2555473546c68918876e93d7bc96184026ffa700451f8a601773dc35cf2d3beabc2abd6cf0a0836fede354870bf179350bf81a42316ec7ae48472bb54808ea83aed5056d63957bac6f8724c35ae4e9486e748ce8e344207a4cb09b3bace5c015d28b0ebe27e485aab3c2f6fd76423847a95eab34f2dee92597f1f480e40706bd9232bb0eec3aabbab448eacb390fc25a2c0a7441769105d30fa676cec07d97a7c00b970b5d446f2cb15a8c68f0c3609e5ea09b669cb4c415c73d959772eef569a579174129f587cba1e68746067287a9f0dbd623e095a80f6f4ad1cdc20fc9430223f9010941fc956a356433734e2b0c6c6a135219723239085c6e86cbbd6f6464858604bd2cccf95dbc19f532ed23ad24452e5a6159506fcd6e7e6ea13cca9b53e89ae83ce43697f9d43811c8025b74633179657232c5829494478a32beb1154a403df69ad1cd42a06fac91ef19dd5efb25426953ac81f9eaf769cf9f61913350ce2cfc6a37029d0a5e11e64e59a6daf291448ee23d2a6940a70bc95918ace497efbac19e866b0e7ff6d596f8265327b560d1e5dd9844150657e2ad5e75b92e1eb27e1a26aaf44642d622b683daf7e0f2862fd6e6d66375fc7617767e2593df0e0deb0efe95a1474f2d855e96e8552ad4cdecc7e693b51ed2570701e72c52d1518ace44b6bf9df985b3bd7b0099bfd3fb6fee9b0e11b7085c42bd9dd765150a40a04a8284be5a220e7962ac2dfe4a9630bd18b3684ebd816096e6b9e89bb56ce7d46ba80360d2a5751cef659d8b28f415fa9c6df27e46d86f2b71a0347693a271a5c64b66b51b226d120283632ea3b0a8c38f09116c3f43f490a93ec697d636eb5a18c65c2f030c51bc8640e9ee8ef39923cb5f655ff8b2f07b876f0d111dfa5c2a54f902c07b0aa05eb05a10fae0664c27e9cc9d0073b7bb98772d58a5e6f1b6e7eb2b816cb8c18d51c7fde3893a86054154ce5a2f7e8839087c91de43b46cb87a0203f16bdda02d538e11a618bcce3b6a0230bc6ca71cf88ae65c3225bd8c510c608401a33a3ce3479da20cc3acba3fc69223a4fd237dd2be731f19fab699607545a642d81fa174b249c08e45aca3da43070538c6b0388a6e66eef2444d90bfd415cc24f595bd7a7c5f9b08137478c12b64d3b14d82d20874a851be89414bdbd9117150260a39a00bb53a060d6563c60c5d887b72cbc21507098c84a27794a3f9285c30ec1aae2e03cde9eb06c7c52e417ca7e87e022ec7a4cd1a08ff80e01bf101a4fa5388346deb728ebeafcc7c74886687a2c79e79295d443f3d088bc6bc2e46af662272180d5096e2515e99c473a88b1531ee43e72bc9362b76ea8c63d847e0d12ec3eb86edc8419f737b9e3e0e707be4d7de16e342f7dd2b010ced94a493dbf2332e116fd36034eda510ddc2594ac5402129683fe4b2dc72c8302bc07ee8e7fc85e778de75e23907e42096b332004209c4f4dd387f7fbd1133a73f42a4e47954538f056b2a08912aac1c98799d9236433b189a4c79cd41e2a39ca62a4828f5afbbffb37bb4fcff77909e0c42d260d3bb040cbca251ee063719c95d5ed329c4370dfc81bcb084f9471347639933a4e95562efb26c3a52e00e240d3977ad5194ccb99ccb60bb39bdbe59922f7d62a195eb791d2ae2cd2612f407cafdd5d037381ef001ac67bd1a802076bef5de7846ca5273c81c745208a1e7348920a993aa9508d38e3a8db5ed53b146cec8ab8df4cfc852ee26eda4bbb8de8431aab6ca2b2d8f66a6e4062d0bc815c73b17fff7b469eff837bbe931081707029f3cec5fe30e7dc1697bd6c6e655e3b0e57c745ff400ae6b6a7ee2eb97b21b80ae84502e8334b822e118c4f13de3ab2822f31f71ee7279d14c917c65cca504ec2e3f69ce6ff885b82539965b42487d3cd92ac3bd829988c3455e8537f00522871d96777f1c0878f00cf4b25aa87fc701c0d31438f4bfd4256c6638314f5e5acbc375bcbec8b9f68395094b675d36969486da0cc9e800a2b72ef5c9ad4c0070fa1c1339929b0b69a7519727938235b5f9e4c4e1b3d210af1f12a24b7b50499005869eb40a458f7b4b5a4ec3dcdb5516af87a986b8a0d105e9069abdbdea2913df010b9e18ce5331a3ff68d427c4a710411a1028bb24985af47dcb04cadd3592ab007b7c4633a54c6394808ee217a539adfae0095e80ef1419cb1334f4140825263ed4885a908024ed14ec70eaa180d0e145afb1839d5af08aa37864c052a09cf8dc9e64e07b88e321cff9c40bbc8fcac269b5a20ee8195eb3772f7023b2d8761624788a324669a45c1f27101661feccc88b2770fda1651cf072ca44b6243ec1a088f1811b96e2826d8bc7483e9bc962006e324d454f729e8794de91bae005b5a9fa73e45fe2fae283843d4c6e96c941c227a85274a2c169b815ee7c00cf03b05540f9fd83bd9996e341c3d72bbbedc7faad7598271b09bdc8c0481302b27a87d99cd4abaf6ec2d7ca190bc8b4c2d83145c50d08dc435f720cc32a8e3243d71ac36a84b2dccfb77230e911154dc0f59f603ff08bdc74a0b638636534dc4a6dbe64ba48cd0f2e22f79d7a40e2b15fb15e707bc21204e8f3d262fcad9537194091572b48a8b20540b5097e7a5033a5f40c067ec8348158c577149079dc511e3fa218f3749cfcfe7b079ffc64549a4ef7c7d95548ff097f9243e1fe83cc804dc82a24901101e4dc56b59b851f3d19f4803c9bbb77549c093a11790394d544663c66308078d60afaa6c45b4ed53ee9e493cb7a55072e29a7f819e348954dcd3c846d8b396fe4e63ce8bdea8a8a34bd207d58d08a9817a0c075aaee29b2c19889801db0a248223b7d1b759d9300149b91b42ebbc60febe43f9852534b849c62c54ab15c0bf5e56db3e13ee2d64354cc3fc16f1ea2936fb2bbcd3b0711c8b8ae89687449c3cfb5887bc96c8867230f35f3bf3138343869e7c530d1d42c46bd80051a1784fad31a48977bdb4a8f192b2d2a10ca6851e89f8e032ea17e0c5be588b40692fcb85d73b84f406cf78640ebfe3aa0b904007ff4e4a79fcc172101b870fae011da86832f912fd7c6adf3270f824fe6d07c9e6055a6d30f0debd1f409b66ff050f07d9f5080c36e46b7ff278fc1e825da353585728372bcc5e0d77d764953a008f024433602621eba50923a397c8e5af08efb12df72018e1a749b24c5a687632622a8c90ce6819a5c74055783bfc4a3f1551815673c3f7624138da2b8d36eaa5ef054577509fc1daaa17b8d7f1b7751015d246f56690dfd1d76f3f7ef409c89485a40c604483130bb60939d130ba8d7b405bca885682557d4b43fe293f28e613c6cc63b32053a2f386407bd5040d2495068833138b516de67600a0e03729e207637ed01b45a7fc3e6f674a608319f880263959260936b8726ec2d9aff77062f65ea6f5150b585a5734a12ab8b57c7a0440c9200077622c377dd6f492cd9f8e935b44cea581a419b005c998b5cf77a3c2bdac0550bd42457797da9c1fd7b599b2b76e310600d3f1df927383dbee38d2b255012b73088ee18ba7bccbf06819a071344e1f31add113c3eaf4fa540234d1fbdddf8f8910f8b0ca17dabed557ab48e341ebade6c6123ad3c3d33fd2999e176abfd0db64d04dce7102f91a1f4ba0c0162ef3d8cf5534ad200221f0baaf212e5ae0c1af6d36edc73d7ded885c3c85f47a15fdc8a8733ea7d51bd42e09b519ce2a9fa5ded46d0ca0c30264a717248853e3074891c45124e186cf4679de62ec5bdfd88ffb2a46ebc540ba7cefbdf077567844eb726bbf69f627e2ad8fd2397d91e30b24d62e1f83447d45359a6bf3084d5f5c8318f85432ed53809e010cc800c997a3622ae5d02db22f85cd38e924c5a66834439e17cc40f14b4d9a4124513b365be51a5bb130246921042d04a91addaea414f0e6f504501d1e1013543645608d7cf4cc6c0d864a1504ca36dab4a6e42c2c8483f35579116fb568c1ac5a8308418fdaebf4ce0210fd9b6901898a6746a6788a50fddfcb98d5904b70843285eacbeee0b4e2d44e0e6259655d8d0100963202e4878242f70bfc0050c65798b26dbcb7f842b3b7ac5c27f41627e72fe3e997709629dbbc80ae70b923e283cae6c555fca23e1d8e92d9c19a0b7c67ed249b3d73a312cb59959ce8d97ab8b830a453261089d3c8e4d001d435dc5853fcaa0a75ad22216782e4a4d1e36481e0dd3d0fe57652c085910d4297c05d6b30ab0b54e372cf5306a04039b12a64f4bba59323d1b862ea6785285779a510f1f3ca87c3c5f8f4ae7a6e91a96e49b3da24f4ff7d4ea1ba3fdb472fd69928a9a3ed12758427ba5bc7c8868683a220faaf9a82ef56ed07ed611a9238bd9ba03dd57ccfd105e0e596c66cf7c2b939a342d0f5639e72b2a2557ec05ed1cc856178694408919fbd51bc77e1c06b2eecc3a91981cef132f59d35cd93fe2d881cb35420ddfcb54d411f752ad29b3d9fc85d9a77ec4105a47753f1eca014c7d329e1138316e57546c4d49fc82928a13be7d13017bd6009e75b8cb2731268bd53d85c3885dde5a6deb5bab3d00800268c69b76ef06d7a55abfc5779eab7f4d377322d5185fbb72fddc4986e299aff816503129c8f9d9b403d1b834109ff237b029df0353e363d0eef603e813f47377e530003380463e1d92b8b7282a0956141e18609f4853bd21c09dc81b1f42530171f3791979374b9050b7418fa1edc6d71fe09b6f35132b4ccadc2b05ff83e0aba3f30592df5d81ad73c1d769ed761bf8dfc8b8e3244de1c8f04dd6d56bfccabc0ba6e9d65fbc025e66f079221c5267414c689482cc8781426faef977899ccbfcbd7a226ed8b3f569daecd0018b8a109bcdaa638f74d77e1e6ca1a158287dfb746419972b8b72b31bdc17809428d1b482a367983063df61944eccc1c5cf56717f50e19c9dee1a40b2e13096c455e705d15bc4ec5575272979ccefedae8b57e1df397f83725638ba5e37f967f067cc88e4f1493d6e402977526c2b28700f34058569bc5f31d6ad91d6cc9aee15277689582ee2ab7b2944d4fcf66d6d61319b34a9a846c4154346e0488d6f8389796c3343fab82b91ed11949d0f2bb8ddcdcddd7cdaa1c0edb0a56c28d5be9464f0d05d0211e4e23445cf97b09dafa51c4c1ed13a1a5944f7cbcf84e999f703ce3f4cd1f101a1054ab44a4be44e8e88d04daa2bf272d2ad56472cf7155764d0e322bb6c5c353c601778ab22dfc761ced720583b3fa663a7a0164f3d87332707e87c29ea09e485cc8cc04bdcf63ceb86639296d83ed1686186f96f0341f23e2d076ee2f96903f05002461c0adf3a7b158f94f9fb59cf7745ddfe4c6db035a4f1fefeb15a03a15205094bb2cf4728307f3facd35ed0482ded0ce97722065314cff214323830581606ff2601ae80787d48a09635aa98be05a36b9283045375e87b630c03a568c63790e0cfa0500409e3b917c400101ccd0bac4d4605114809d5b935994991fe3443ca0c50c11cf7f94527d46a64055e9b888e0a901b2da3d41c51b44338d5ba0510e707bcb8c663701b3c58f076370cd3413c13883f5d07d883ee6ec0c80fca4a1d9e5666d631b40986ac7c9c552f30f8b19185a85a5e632235557451ed5e853b765ffe8fecb1d2dc557a5b39704f1b2fe4fd7674b14e5b29dcf235c7ef91f7c22596a45899ca83a431744fab979d04d8af07b9bb0ad8a20ce694708b3926e27bf95abe1a42d1112ce19c008d6874c5ff1dbf3e0275906f49b594a8c5c50e2e25658d8320fea2fbeb43f647d9ffa06e9242395c65e2383cee4c4d0359d070623f10b7f03426da5ec86b9ffcc174643e843cc229f49a098bc2adffa15a3c3a998271e4a0ad305b4e4208058045b464300a9fbe4288071e01c5899b4d33552f1f296794e69e6db50062955bc633634f63862fe9cfe9bd05f241384d381078ce61ccd8c74a561ee2122def506a35b1ddac0b028330df1f478105d5a7a3affb8d74b487e7fe944d049ac6c347c4be48252030f7d903469d4128cdd81e99e892b177ed03d4177354b730d728af3ace506ddd02460d7b598b2aae9495cf79de797973ec7a3c90c0e79900d8acdf963f2e89acc41f96aff159fa75517c5754954db798075e0d47630599a0a46371605b597bcd5bc125dedbee28a4857cd5de0b04ddac10f0a6c7b17794f810aec9d1d63aa81d5dcd74b63c6b65e4932fabf2b91edf2566e3455dd10e8417735e544bcfed1066139a3ef7ebcd0020e678972eb15e25a5d71fc9fef0b31a31bbb1a331dc259ef998a31b6591d219e393c9a51860dd1a046cdfba1df8dfd95dd8513b9a861850d74c69ef997d0bd6cd631eb9bf00423864228011d5ebc009d0ba7511fdeabd3684cd17fb6db743ae5b3d3a47edf20cf5c4a855bc5bbe56fc535c4c711d2335761f55a92299a446b90b7c1ee66899c1932f77b108e240b7fddcbb4a2f0955f2a019e25fd3a41cac9f1936526e94e4506a2a7da3788408539bbc0bfc9dd4d8c8dc81738959ac79810d76e46cc6a668a234887f01571c67d65f256d0734ec390f03c0642b7c78563efb708a0af75dbd9d6222e74c01aa720809a829ccd08b6798a1305010c34b21af01c0231707f1f3b6a56e70d0516662c3573185bfc556c1aaf259fbd13b41be9fb00b141e718ce5586069f76600975c8a670619db623b8eb66cd0f9e712404260fffbc29f393babc3de31d52cc44c3f51ad09499ee01797cf124d6e8e467d0489dd7cda13434591bf7f15acf0ef62ed92820b999e43a48d52b403ef1c1a6aba9194dae8d6803b403be867332317fac100cef3f7d8fc43fc58633b5c45b68fef317727d6a46006b568051116133f26d3101e76a3b634d5570d341936e72d10dc41953c3f6228dc355100d3a476897a8f7bef8110502eb741370610950be55d0c53d520134455c45fe6a1d59c4b07491b997b060900a600f73d4bd83078ea36760c00d53443d45aeeac570f9cf63e32404f23213d3e3913b0466d54b03e79d1607de93736633a662648197b66cc7573ac68bc9eedb38a2757cff5607bcce10cbb8f027e2a6766d8c33eb3e3ebcf7933e450d8da15ce4314343238b44a3d0847b8c07f433ad3e6dc174c825b9f615bc53da9973df0eb207f4a0e7234ef60bb041693c5467970b989de6bf080df0e5d6444ca7e1a743d357a7b67f448dfd4e9856178db72ad04327cea09edf911e709c62c3f7f905a2b7b06db3bba1a42babadb54ab9e3e13852bcdacd536199a8853e957dffbbaed41d63af6fd551a0dfe9dacfe0c58bca8eea0a374cdb1df9714c4e46076c50e7ba18462e711c774ace7816c10353c67a012ebeb683f7a171041416c2b8f02e0c400a04a42e8b34a3242161516d541ee2ec65b8c8f24548d87e827369206a3461376a667472316ffb6c8ebf6e6ba1d473dbff0c201ad60b1d127b1c98f0c4325208d2c1580d2159226d49c8ab20b1c4d0b3129841748a22a935b10744abbe626ec3d295821707d49d7f3a89086b0166989b9d851a39acd19a24c1d53a80f9b6d80a989c358ec585c65683218de049f03c629ca444ead4c6e6e311b51203520cf65092009a6dc9a3e8ef6865688f895daaea3b83db13b61d32726f5453f116023bd4d38c94b7fe18f7261b983023bd35113c8aa0077c5476557304f7a8eafa2b92b7ab6322a1907a6a316737eb4d0bed1ec4e242fa547d93cfaab9ab2d2ba1ff9d68d5661c82b24c3933fe635ad7a43188e98263d6cdd1d133db63d319b54d444e5f3af54a55b40d21970e8846f556617791046ffb5baa17964e40e55a6755840e71d5539f7293c9b7626e05d17129d774282d4afb53096489e04cca15027b4395dab7f61b3f8a008d734bb1198283776de1ef5c9c10417066ab328f56327ab92620ec8bf5575d14e63882c2cf3fbcc5da2f004c0d94d386de7ce8298640fb5fcc0263e02351a315b9e58271381f1f593ae13f0cb1226cef77a168875231215ac563892dd0b504c9cdb971e212a9307da546053df0b67e3876628c753c072054dd2589705e79294054435d2a72d4a1c7c1a0829b70371ef598a0b31bbc36a50606aae3db978bcf23e14b613c64fc21de92277fde12a91a480b64a6165e613c81129230ad4fce72c53c45ebd119f78f945cf90a33b6100676913f78fae832472635600896573240f1c27652f871e6b337170460a067c5e2378d4b072e603cbfe198d454d47abb638dca6205950c4c19d1ac75508b0697b96d7634fd98e822a8c0b8fa827254266c46e78048ba6624eebd95a858b789ec4ecfdb847a0d73848cd0637da8e63ddb9817a7ca0e18b0bbbf79b3a302ad1bb29d704c41ea99259c9ed8e56930cb5528a5f8b9dcccc33ee1be949ef35f6600bbf8adb8361fcebe08c8063f243538c920589174466094de62c8a609b10cac4155ec1b0118c11e80d6d1e66bbf27b64bb20ebeedc5105506ecb7b0d84133ef47664348373ea9cc91580677ec3a332226bf03eb14ced2da0dba09fa9c610a87f48392ac91ec23a6c83336b771055442b2b343e0ec198416e2e5994f6c05042a8e3bb9551040eb6a3a050189536fbf8d0634ca5874934789e2fe10122870569610d008b6c187038507c4e8e6b4fcf1a9d6dcaa6b1896d9fc5bedd208ca321a76fe4b36336863b4f61da711278ab76d6defb626b79432252903b10b710b060b1df5fd258d6f9cefeeee13ea74eac417f593fe6caa92579c19753c3b65bf55aa3cfbf7aa32c4b37b9534cf2ef6d0f4ec920730cfce2e57d00e4fa8d1024b1417b28061367e0d100389cc104f60dc80073324276ce0848e4d67c6c133d3b397c03db0e73997f846f1f5f48dafb1ebd979e9c6b7d3a6a2c5370f41fc0bcc37762f1dafc92e5a3fead0c1098b22228ade78f6d70e363cef70c6a449292008ce9f9d877b60f4637fb1cb0bb257247eb00f61e7f1b1b2b4e5e80a22c6d0408b2c4b31c852450c525664607fa5a0851521aa70c1c28a9304a6a25e08d3031d482162c10d2792a6f8420c196538500322a498aa52e6098dd5958f0b72228637da988194124fc4f0d4c41464cc88a2f484144de657283effd85fecf25a2738b93372d24fef96f8547edbf89e49cb3e10e2ca1345a0d18236268c2e86cec002cd905318549e78cb33d10ddf289fbaa8c18088344a74a1430bb3e97cd4b200441195049534968881092e4ad274bfeff572f189e7a9b770612416a76f44dfc844bca5b5746bd181a69443d2ebb0f45249872de14b251d883e090a292c5981ec05b1df210addd4b20a237fb8659d73dd129f0dc799840247f1359195db706e61510b8bd312691bd6975e10de2e962f8410e2f2e4458d9912c07849e20b18517290c184923f51e40ffbf45963d934ead8f4954f9f4edc63fde8e9615b18847f86913ba64f2d53cbd432c3c81ffee9b3399984744a1f7d3a9dfbb07c3cc8a2832c6a523a4881a102163ca809e286237aa86105be7486f8c61e5cb7c4677d55c4d7c4b1e9f736cda629be26b904e6891d7ad0624c182e3c6961893390727061ea0bcbc6372ef1f14e7c1532617182b3084461098b42941841163d109303251a8c109178c2051e66f032c318de321438361dcd4f9fb37d7e4eff2985a93dead24b5291e8be0c49b5a024e5cb172f2e440d3121a1112a339b9834b80485242c4ed7f2f97414cea0428c2b68087d719a4d9f512d93383843cc94a92996862862367d36cd5a8775898f9f49cbaa1627a4d090e18634a282868061cb1b3d9c61b4a605022851856685891cacb18332ca50ea41081dbc4c3123844ad4c8a4652138020b1829686cfc6065369d8596492bb0a001430c2a524338cca62749819356ec3aea8c9ee27059dd067ce283cb0eb327360ec5363134336a1967d431ea3e5c38f2a8c25174ddb0b74223bb327a2aba420f5fbc326a998f0f0f8f78c35194d4bf70f416676439a3ca193d0d9a591f923ff295549fd569f649961a4ab963d23a469b7e55247faa73a3f875e4a9e1d82488f6351c7ffce62df7f1c9999cb57cbc4dff64d2662aa2d17acb864de69a2b4d2dc3618d1b9866d46f54cba85fa99651bf532da3aea2b58cba6aa865d45544dd026f72f8660b2f7f944c3fdea6a7ac70bc5e387e5d38beb870f455388aaa70e4b9e1263d24b689a1197b8334dbc4d0130778c1c18c439805c217d8385f335ff52bed36e09311baf0a2cc0c8a8de3009f6c5ecca080c034b309334063316ce032835980fdc66fc227498200c2881987b023424133d891a0d9912741b30e6147846e1c0776c4e5ab33b408a3c40f6910cd682030cd6016e8272c04f1836d4039c301ca997c410c90909ab18b1da37ea4411cd005ca8ed9f006941dab216b8d4fcea89cc9d98d0e9f9c3d7172c4ac5dce603c339f8ed1dac4e723cf533f42fd04ea3fa80fe1c8ccdaa587843932331b90d5b001d1ac33f2986546f2b0287ddadefa7687b55eba514b3f4ab9a7ceaeb1a04d9b6e76756dc82bbe5c995eafaeeaa91bf86291360edf9cc1141ca51df750caf3124ff8f6799da5e50d7cfb6da76e99080d3b9aa5c5a02a95f7566f772d0fabfc8afdc98dfa262a5139f5afdbbf151b5179e0db554adae9edbc222ed89c86d7d6cdaf4784fa168ed50362abad35544291f82a1125fc18a24397378e78bd84e0f27a49d1f412e2bc70a9e1eee430c53c400e57947220fa9107061cf6ebc5fe81ae8e45065d4eeae79aa10af44d0872827a65fa46139a76b7993e9ddc3ca6a9bb12a495c9043aa4e957b00416e5ff686a7aa8f9df5d81dd05efcaa9943be42aecd52a1c556177c3eb2a6a4373e8a43bfdc6fc9f6e7ac7a20481d09f3fd26fb959efad4a399b65c3fa72a7a97052f6482ac51d5aabb3286bad3ab4524ae9ab56fbb1282fad6cebb535d46e94deb1f82991afcba2cbd5f5294de21d24c1b5ee95e1c84e29f3666b374859e4100b27bdcad9d647ea55d2ee90522a290def1c83ab6b7cd3f57178bb078e65f652ea7c3b367fa45f9e7287ac210d39a4dc47afa7f2faf0f4a0df84e26bad618f0afa549ed087a863d2f2b4acdb78786cbf120e4738362b521c93354cb10388685cfdf51dcb64120e46e24e7da934658d1f77a8e091d2a9f6b73770c7f216c6c7a1b932f8b8974a536ef0e3cebbf1d9bc549ad2f4d3c79df953983a269f5e50677ef0f4a5d294167e7cf1f410c752caa88fcc4af8766c32b7ea14333337333333734fe168e5b62b391504d823725f49edba2be54ae5155981ea765ed7710ff54a2f0f3e29c5b17a45daa95faf880bea5325d59b5e8f48f5f6ad7b40e9ed19bf9773ba0413030d1f8d46139a96164006474078cde79adfb9469d9da73ab8f8b1c7f37819838f3da5fed5a0c4537f4979ea4e44c653176df0f2d4797e78ea3edc23956ee8c1d3a5286d050d54b02ce374c31aa116c61051c46cfc9ede96257981c98a2d49ac41438d191d63a98a339ec230a36e4212d3a79e44fecca7e1b84446cd20e6371b5d21132bcdd04589861ea4b0f1ec521586932ee5a4ddd36b97207f3f953ba64b70bec5e21b77fcf4e93be40e2edc31e74dc0b8809f5f7efacb709462286da93e7b0f2b95e4aeababbcba8ad615487f7a4554bea9ec0a02d38d1f3c552e89d8a7bedaba157865c8679c57f00a1742e96659d8abca571656bdc2aad797e26edb3a50e51b48ef974fc2b66ef3fa9ddf2ee41ed9bc81d7bbebd2f8e67fae97ef7c1b52413a33ace4b6eebeba1f9774d2a31dccfacaa991db1c08b36191aa82b994bdf45997ced6da2dec58846daeba216c0b8b541bca0b042731804536e132a59cec92597a40b8c8a4523951898aa1974a534cfd78956450e6afa3797fa9444598e77a8a3c7cde5c77d4af5397957675f3e94540fee6d4763502f2bd20ec9b57d023127b7690da903a0d4516a70c5460799b974a54143d37bb76297fae8f1ba8f2da5d3ee9dcdc60d5c5dfdcd6b088f85b28b2287f34b881e3b413665d7a8559179fbea430d9d556faaa4b1f2f101811feea2b9020e8e54f8fc875abc48630ebd5b71066c322e25717bf8622189a0f1f13887df878f1cbc78b7db49ef3e183652024957064032948897a49292a15831a1f2b2d2f5cf9513a3da19169beaf8a9f3f5d47cad48b99b9841f3ea65fda50d29d7209356c34d142962528de7002840c5ab800a206a12231be7858d00394517db17d9db823bb2ff3af974a32689144cf7879100cc48c91861826cc10a3c4017c08b3832967c808a30828a922ac5412160c2aaad4d28452851b44445a64287261d644909103336ad0e2421369c260028a03f01005123ca0218d2cc4ccc6ef990c18659eab544942838c24987002c20a8b461731d074819ae2abe32ccef6db3790b2814ae1c0a16106f7e3155634ded0f1d7cb48d5050d35eecb0030d42e52522aede1d5836772f20669ca0071c50b49300df1850f1bcc08438c1dd4b0940514d5004a325031eae85e2ac980c4732f956410e2479e261515afd26938aa9cb2e8534a0944ba93fa7232cba806dd7af1f1cf1eea63cf9e746ca7dfdea114a31443d14b302f9562d0f49cd3a5328cd84de01e964b3f82847bbaa21e44cf3eea186219f583572d9736f666def8e8c447272165118773dcdd80e30d0eb7d6559cbb70b8ebaecf752d07cac751625df538bc7a44acab9c931e178e4c9efbae13fa2ad78dcae7a9ffe091e7b7576d2acea567ab73a0912d93c774da847ca43b91eafc2534a4fcf4bec9f20a7a6e0376fead7cc5d995dbdb029550e77c7a44a873ce51d03a5764f391824d24e8843e8c2b96cf7fe4f9d1b21e68a8b0f14494177a10c48c7d48cb82a4504368eac88d19701066c6c560831e5cf1441aa82f33769f96ddd8a08b98269c187a7a62c6feb5cc5368194f47c9a8b9059c482cb277e0e4024e2b0133f62171c62e34f49ab10fdd19bb90d00b77e6426b8a467bcd5cd8d408bd20ce5ce8376833ea2ff8cc6818a5c32cab10c68545c45ff92a14bf8e4d0f6228973b2f93485a39c391e7e7d62dbd65a844ba005e49a770e573241e04e5c9fd5a2d1fba99b1787e35debc146a39abbb47197250dfe115cf7fb077a0e70d5a60d6b994fc0228720cd1cc0b69def9d8fa0e47495ddf75e113cf7ff07772c6ea7ce866e609bdc033960f3160d6790b1c62c08cf5240b92ce9f9cd031ea9dd79e844f86b458de854f44968fc8c4d4f9286ba2e7a34fd7dddeb1e91d283bc6d5391de078f3a38c1a65d4b884e7adcfc953125d6689b9683ca18a810c6dd2477d9c944a29b1ac5cf82b79d86aa8a46e5badb5d65aadad95ede45a57cf75277b6c183328e38cdf6811dbe6bc75b7ed966e5c4a29e527b62f570a376aadb2d6f6f116b17a2532bc2cba0c92445672b4e108e5c10ee39b5d82ed0c16e1a185d29a974b24d408e55909c948c9123986e83b3c81f4f1c97338dad54bb9fa0bda066d5bcb7aa98443162e7cf3a5d20b452f410e23396bad27430ecc57bddd5a6bedf65209872f5fbdda36acb5d6d67ba5cb99342fbb9c81fa515ed1e50cd27341f3d7f97fbefc2eb84ef2dbb4d3b2cab33cede539edf4d1b2b5d35a673bdb5acbd6b2add3793afb366dac4f2ba5b449de497dcbdbac3ac41e0dfa58afefa7f449252e6a7e944bbfc2fc128670cfe6638fa74ebdc7cee6e38eb7df5087451d210f0c5ffbf41dffadc3710b7742f76fdfe11ef9d3f31b9caf824cfa15f89b4c352f7f5458e1fe7527f6b7e9fc7dc32672cd9adf42215492260ff942da4a33dddd4debe674b39bb5b576664cc1d4e2aaf868fdf9b13aadb24a19426ff9d85dc78fd66d953b24ad52ba7ab3d7aaac0dc75aabea6ed4ebe772b5755b3f944f73c0494ee25dba9822550013c594d6cb2f4284f1049a7fa9f444d44fef7c5c2f9570508344f4d2e9a592135c9e6b3d7dbde970bce958dddd0de5717883a3cee32092cf847b8cba22beae0b93ead5092c1f7ba9e404ed398ebbe909e17c86a38f9f4475ce5aebecf5938914b5e19bb3d56ab5ac6dcd392ef1f1ecb37279a209272b48b831868da019c0a0439a2b5710d1051851ed2db0c3d1f52de72bbe71124d2ddd3ce66bb9cb59e0c762cb1ba4367cad4904db9c836d4e8db887d560cb6de614eeb19955b887e5d5c6c6adb59d735d0823d2b9e742ba503254d0b35863bb8d73dcb1c0957f41ff814ef85736fea35360b1ba37857b5a36210a2c5622aa100877e302af070487a3b0847b4e689913ae7e4212ee61c26245fa5ceaab2413060c72986107324c916256754491628d2a61ae5ce1c3acfa24aa3e8baa77111f0ebff12f6e401c60e7c337769feba5e35e5dd4c15302f748f7c09637f87907ca22ed9e77a0920e61456c9ce5ed5e082362e32cf782d8843ebe0bc7f615e6773e7fb007728ffd7d36dfc7627dad6ebec772cf7b6e6997dfdddb7b9e7352513f3dceb9e9712ebd96aa7d3bcb37b09db579ab89c4e2b65a6dbf5a01d9c09577e0e61ca8720fc8752a44c2b650be0de7138e119c94d66e6cadb5d66e7eb7cb2335fd07d36fe76999cadb7d5ac60031b3f61fd67d0bc77b6f68439af571b1f2157efdded798cfcaa5eb3a5cfe80f0eda2fce97f32d1f8814b6d06a51bda41ca2c0b756ed25a06ca587b6cc80044af80221a51918f2ecd24f1658a1ea8a461c206161c41c69311314415b9316b9fb4f639d44e553f70ed93bb253eae4125ed361c87bc053996be8d384b7cbe5e1625159fff287eafc9424c2ddf4d3c35518315793681c5212cae8e8630854756467ca38c4aa16562b718d562548b519b964f2a3541d4c41013272c9333266acf448989a66f5f22c5960de9587b4b26a61b2a4c444444f7f5e3241a72efd77e65acfddeefbb62cb4a2063ed3ae81ef46ce1db6927b64cce787cbe53a8517c6e022494805ae20731516298b50957a85183a91cd2188a62d6498a70e8c28a0ec6702262d63e8b5ab6021ce4704393184f10a9612adfe657b6504a7dbbf466a8c21216db85c84f61f2e09b5a5e92a0c2c24797b55cbabc2e1f565de5f461f5faaaab2edd3a0d5d9eb3ba1ead9087877d27eae31d1628728cdd73624807de0ecb5da940712769670375806205779ef83184c7e773611987f0f8746c67405b61f1f50f8b5d5eae7bf8fc7982ee469f3fdd24281401fb9160c2429214be9619f10266a8062f5508417400228820c208286a50e305223ee7ff84f0506dd03c81680bf365d9f8e40f08cf3e8f26104779f669c4944d9a8cb177385e25b870fca0787639655d9efd5a6bbb26509e5b61f9926430eb413396c36c784428c61e34931d9b5ad6b0f1cfb3206939cb59e1932c3009b0dcc691b0dc267c92c5fa13d931962361f9173e095ba1919cb19c15ce30922883082a2e30a1d1663c1d6339cbb2c2eadb39ffc11de7ee796e410e1cc771e436f0d6adbf95dfe4c9a8e3afdd2c7d95afbc3d20aa90a5f0100b257142cfde3e7ced3b50417821f58214b51882b49c39e2c1920d55cce0c0822b0f88b5b408fb1116d991309a48d3681e5d26eab83352e39b3ece975d2bcf4ba72f47faa653a4b1bbbbb9a5945252d9537ab52cb642c849c170de7b6f48a98793a3ca9874bfdc33cef62967d7c437bda97ca38f977e95f8a6f4eee29bdd9435063d6c48fbfcd19e31b961e0fa9a7687b076f9b02072c7a494524fe2427d716c06d52e612d6d9edda194d28163eea0e72492cdb60783966db52cbb3e1b1c9d7b23ce98e3a7ec556141e64fe9019952ee18b716cb0b1234861f64f3578f2f6ee515f100cb23e2af0407d7d22b628954a7dce62acf84a0ef8ec58f22716f5c5dedc7d7bfac129d0b5475a5d4cde1769f8b5e183031c3c521cd8fdd15e27b9de9b628c1f873759d4b4cada3be9c974a5b8ebeb985e835a6a863f26e195ac28b1f776cb8f7faf0f45861b181615229d9583053770926ba5a03da76799628ca41bbefde4fcade374268a6a2eaacc494e5eeab56205991c431f9e3b5d3a712502e1a34dd6f2a61831b0754c1d43179ff7e3bcecef241d2db044526862cb632dfeba5520c51407d372f95623812c04ba518d4ec707d5c892a9e57cf54f6f1f4e09ec94aecf0edb207465d427d7ba59d14dff7e3f74999931ab83065d1c4143718cda6bfa44c7eb9c2431568c44094c410b3e9c3633efafd7cd197fbe4117d5ef38a4f79a4e41732337f99e1f9f5cccccc2c977e74cd4086ef1990f976f0f5e54c8e1626caf82706103a50aa81c8071c8af871e6cc95da17368cb1326366a983252921d432054842cb77fbd502c3b78fe001e9af0a3140388d46136266e61e11a88ff68b441a2478f8f61cdf8e93165ea069ea618aa115a41902075ff080031a6ba4ba78c1341a8da603d1cc93ca52068a2888aed4f91490058c6f87cd5905124e961cbe9db687d08d469734581d4db61904c861ea06c2d2e59999fde501e117183233802062a1f2ed1f7840fae5c50807e800477cf17d44966f777940fa85230d3598da30c2618c230180113346061d4441a2429f329ff1bc83e7ef9999b92be25b922fbbdb0833dfdddd7ee356d0cea5534496051451c6b3bf8cf0f2ec38fc031ea8a1060d98d8e20b22644d8b348048ea92458a3272d0458c0d4f56da7840e83c0ae3d9bf2a587ce145883266d8004691358240428c1a6af8a188edbb1bcd3798a3ef0fbebbbbc51d16a76f81c3a5b3a3a3c795a9e72d8e6cf0ecdfcb459e9607847dbe6441801f759cf1ec94881f9efd45041bcfeee21531cfcee22981940f35305fe06006a920211a88b8b8a287292d6166ed6678a1a1a9bbbbbdcea5b3237bf6fbbd7c08275e0cba020566891cacb101aa89d9f8bd18646420a6072b86d8c1accbf8ee72c377d1aca9b7d4f6dddddd3fdcacc15e3ff6e8228834841023449495a567a5217e08a2e8d987959e9e77e0a1d16842adf280501ad26eff8050e3db2510497cfb15c3cb135366ec261ce99fe9f36db4c6b75b0f48df1a3393f1dca58567d6333333f317de0f66f430fac1a88c7ed52ac14c61a363666ee1c30d5af840c60f303cbbfff0f4ec54bc48da7e7707653eea632be993b295d44ada3c0cf78cded3e604f26f4d0d7a4f1e14cb625edd43e3497969b66e05d66fa496794fdd4e13e89b3caa77b48e55ffbe6ea476baf7fbbae8abb362ce792d45eb0c6e52b49c7ff69503eba317f5f53d21fe6cbbceebe64fbd04005942208b466b99f7c4b1eaf77edfeb46ca375e89f9e69bb386b847f26c792babdd89c5ea0300678d63d575487df52d065ed0c11d5064b14a794f2d73b1f59ea8f7f4ba7d234347eb8458d6451da3755d51771bb958e6418d9d0dbd2716ab7b4f5fbd6b35edb00a4970f2f9e50e8b92c52977ccf782f0b780dc50f9a82784393a597613c7cd0975014ef23c01c74d9672870826f76416873cadc9b55aac935954eea0577cd23909d61d6927b3a607e99f2ee5194a59302294c7273fc3e68293d3e8934a4a6abeddfdbb45255f22b6a056ccc9dcfd73852b25ab207ad9e5a5129830cfd11a7c13cd0c6794996fd69e5af18ddf73bd9161dc84b62196dda7de84c62e8419356e42cf7e9fba6b789fea4f34e38c7a1ace2816d999be39cea82ba506d751d973464143460ecae0bc396fce7b730ecd377deb3832bed17f8379306ffad66d1bb76d2e52aebef9b6b5df101683403b3727ecfa742e84ddb088f8d76f28b2d844078bb36f28250e363edfa8d42045cd773eaba0018d752e079f6471a32c4ea97a69f332e771acf15597657ca3bf85b1602ccebdbd70bcd7adf529371b1d16554eddfa8e287f38b7ce714da654082b22fe1883c0f40ec639bb2432bde39c0b4516b91578844e0671b0f155a7de32894a714f6091276dbc4fa97bf984b2a8306b8fe4046c2eed04b7d0d2e48fa645be97fe41a1bd93fb4b76a694a1c93375c8d974e88496dd8eb1dffb7dafd7bdcc6304c0749e1e3b24d0099207fb744fca7c3a46e7f4e19bcedd0c7d27801b60912728dd4a594fd840ab4058b51756eb94a04fdfcb3e4026fbe8d183450a8e94ab92bbceea208ea98f3e1d299aa7944e2a99da2a6828fa9f9755cc70e6b9d9f5e8c1a28fb0099b6111f1a74fd9d1f08df719261d26a7ac92874576f19d5015e88f77850ba407f7ccf0048eb1dffb7dafd7fd4efa4698caa56f305558447ce9b376c351fc51d644166d28a991c706479da37cef7521f2af077d95a7495efa05379f7503d92d18f4b2b253707c0153f39c826ba77489552a950b91af0a612b5739bb2ae4a097e078471ddf1bb8025532e837d049bf6d70e49141774e327858a49476a88345feeef0ca1dd4b991fbda61d0f6148b8f5d560f487702a46cca583bed217f36a7ee63ce8f3d469b1f7b7cfba80ac11d91c5f6a72a1cd1d76e829c1421162b93f1ada6befac8097dbd7735d53ec550dfddcea59475b34a3d539fb887f35acf94008eaeaff32758028bf5bbf0074d92b1bccaea3d7c7c704fe73abeb29470bef9a8d2799ee7791c38b600ea390f1ca76f2a97411cc848bf029dd4576d9445bb6d21476465c04919f4d38b9a9f23432d4181732ed419e31b75c248d598f4bddf7742cba4daaf5c8eaf954f46e3f978593e7e2d1f5f0cb55a794056d504243f4a18c2c33296b7ebb0ace5edde075e19636f8152c658e1d74a4b529ee38e0395a82a9ada43e4772e447e1706bd0a1c9d80a33fe71d38725e37bf41af025f70f41774527fab41df8aed95abb2c979e9b3a5fca8f337c3f1c5b383f8ec2a827c4003c68d18d4206548066de83843e5061f8e08838c21da68a349083253d46020c3b2e1822a636e30624c0d6380b1c4be942e471e263ea9e485f6e34beac7fbd2f11dd81195cb47c2b4d9cabf965d67bf4377a6f20d147ac167a6f2a13b5bad98c0da9fc8a4190b3667c175047c0fa5cdeeed30191eb9dee104e4ec8661651ac6a6c42795ba3cbd5297dab3cbbf61661729cf4c9b5d1a8252fe5cb9bd390b4fdb6d287b4e254ef869b842ff15166c7ef33d9436f79a3540adc27cb966cd6c9bed4ef8af6c2e3d0b3460c63750ca5286b287d2e65eb306889df9a54f15e6cb356b5eb23be197b25fe0e9b8e63a50ce382963b30b5160f3a9bacdf3ce2de075dced40a1ce65c756b33b1b5fff9b570401bf39b7a29d8e950e1d3b628c99559ed7d519777954bccde0abbab2b6aeaced153865cc7ae5421b1478406012e89c730b74a1056eaa7c4de494ca65d407cd826644ae5b0e14e25c76ecc687af899c7a2733290db0790d12f47aee2208f82b657b2c55b8025f6b3950ceaeb575b6bad76eb6d2eecb354b1a8e5eea59a0afd30dbc141ca95f2820129a80ea824a412473ca986a05cf3e2bab2fddb2acc04cdbba7634cb46bbd1e0e44e96eab282f391d004b800c9a449191bab535fc1941ff4b7b3de0943599af8bc12f183662bafa0547993b9e68556fe4296263eefa40d3056b75b90a020d5fb475ae4e637e75477d54d574da06d63e65b5937ecba9a6505fe6db3537275020989a45bf2395aa7d30ec7f69acc35f24752c6a176d057eb1badded6ab75229446bbab2011bedde491c4c7dd04baf2e7faa87abe5eaf7372365f6a89586f214a7044e8946275417d2642692a588f0853cbd352e76ad72bf05be728ab49bf0d9bc322babbbb2d667737dd6287f6af30c2a720a8063e2e7a03778d063b3c324a85e68a1232aae68307c70832472ce171b25d1a8de664a35cc6678a127589c154ad23630499233a2d5e0320634499176b5167cdc285801dc2e0c05566a6a13be820c34c53a337509944b5e0c131828c11d2492d81427d2ad0d1c7a77d28cbbe7e3154df3081e60429f76a999cdd57dffba25c9d5d487576961274c27fc3be011c19ea93c86ec241ce2116c5eebcf8c68e369b641f8317cb4bbf565826a50744cecfc904a733bb94e19dbf8489fc39227798c0e2741d2c9b441c6bff7c102d690983e494f4dd93e9dbc7f6f249e11e5891fad265d83e6943dc235fcaa79a8694128d77dc1c77eebdc1c73e9f8eafd7d88df24972920e4ca02925833c5c974f7a02be517c963ba0420d389f7dc8032690bd74fa98e38397753eb2649e8f96f3eb237ba1d831ee4211841fef0d62c7a02b270043056a9e7f5c218ab7ce4de639e7e403b0c6a023d552982b2418a96f2299a640fa95f30b692bd50b2277404610390697b7fec50f5eb4314614f20c16b9851cf384147385dca20b2fd878db1e0482a0f042015f282006d648e40b1052cc181e63c41dbcf5108c1188107510429431363a8c300490265289d6c23b993edf7a455c3fc311054ef7f2b0462654d8e4d0e3c55bf784706882dc329bb5765bb146153409d9c278eb9b17c4e2f0d6b9db6d9e904a2548233dc04e79fb804be6ed05fbb9be77bbf76e77dbeeddb6eddebbdd398635fe03da8907b49288fcbc756e25d65ac706c81dd52fb8812d794cc963e552f218af2bb9bef91116f9572192160cdf0d55d85e7a420af04de49a37de8ea10a4de69a576105fbab06fc2a9c72c7a4dd05e9abe0f54e5eb63d22fc5b0823121e6191e753118868c2026a9867e7462b7f1b6dc813ea6091451ecb03ea88e263161adad910baadebb690ea80933b1c0b3c8dc82b2c704fbb6cc2c5887dae1edfba59ebd323629f5d6ee195ebf286505eb32c5e10ea1656c322cfde94d2cac2370627a7777beb48238d6bd37c63f753c753ef70e7474b9039943c06271d0796f95561ce868e42887a2f95a058e327a80485eda0a8bd5e2a4131c54f7ec9c44fe7aeeaa5121458ee66552c3979380d9f5482a2ca8f2f95a098f2f7a5121452a694ef7ba9f4841a0c705fcbc291c9af546e37a694524a2955853764b2854c29a59452dadddddd4d47166e142963d2575fcb6200c22c0a94ee6e6badbfe033b31ee549f557c76694a0990da3586fea1cca8e252001e31389006980d58a86521a40fecae56cf52b18e7d2a1c8da911b519ca0c8bc9165f6a43d0a941d5488514417346c10446d469d99fd059f19875082ae680103368ee0c18816b0980909090df9042c2ec0c739f5ecf30c121fcc45ca6812908f73e9c7c7194601ec399f3079b48f8fd309f9c372f6592465344ae6e334eaf1711e25803befc11b70226595a863ed06f051aa39808f53e811c0c36e020994a4e5ccbe44feac78f828a30ae0a37cdae14764eb6027228150983cda633ecaa501f8e8e39900ae43ca5648260c913f9cb3e8a3005edff396c28efcb13c25d092c9a39d7d6a69990c81161068f900cf049a5892cc5acb56441e98b50ecc1a077a4ca079b4811eb496a9a23440cb000d03b46ff79940d3ca093edfaaa40b1c59e0a8023e26d03442e2a3a965aa220a84e39d40387eed12f83181669523492dbb5246782a023c05019efaf61226d02c3261c9a86597a988d1038c88187dfb900934a70c61626ad93512c2148409c8049a442584234bb56c9b72404bcd5aeac396faf62313684a993cda7f14b56c6bea58038a1850b480707cb52399403ec2919f26b56c3bead8049a42934754cb365ac79a3679b40325fd2429204cf2a95d5938de9e70fc1210f60847fe4ad4325b4b32819e4c1edd32aba563138885c9a31d01440720320011cf138f707c15201cbf1da18e70e4b643294c20275c51cbead39209c464f268bf0408c73b80b03d168ae1c80208c757004200843be188650255a446c20282200882208330cf4808823b1efa4e08820e82605308ce079b9c90a8188a8642d1335740b1b313664574b4225a11ad888e487077777710041d043d04cf08e84e82834e02e8eeee8e850470be63d152c44f67a24914891e01822109207f186525ca8a083972e4c89123470e7777f71c399e11cf91037477d073e4f01c39728840a5d0283fdd0aad42a75018dca9902ac9282929c968041d1d1d1d1d1d9d1c3972788e1c3a2fcf480e1d1df71cee3974745c4747076a0470be0e54d40d286d4a2a8c1c399e4600f94500f9395551952a21e4e4e4e4e4e4e4e8e8e8b88e4e0e089e119d9c9c1caee33974c2717e4e4e4e4e5208e0fc1cb0975a8a334e619a0a1d9de6225574a5aed4952a82bd5eafd7ebf5cac9c9f19c9cd7079e919cd74bc7735c27e7f57acd7f816dd43b34526be9a3e62127278481fc215ca62997e9325da6291fe0e0e0e0e0e0e0bc5e2f7fbd70703c232f1c9c1c7f79ce0b07c7717070a63e00e7e34ca949a3a5b4d01aaf579a6b44748daed1352202c1e572b95c2e170e0e8ee3e0b85c9e111c97ebe538fec271b9dce57239cd7739d56c2015f594050e4e130820ff075352a6a6a6a4e0b0b1b1b1b1b1b171b95cee72d9dc78465c363638ee721c5738ceb7b1b1b1d182039c6f03f216ce128697980b27e1723196a6a1a6a6a6a19beffbbeeffb6c6c6cdcc6e6c3e119b1f93e97dbb8cb26fcbef91fc8441c839f7ec4465cc432d8d84c1c47424747475388e5799ee779def77dfe7d9e8d67e4f33c1bffdce60bc7f99ee77951ef45a111e3a70b4d3533cdc4c1f74da88db6d136da469bb456d7755dd7759ee7b9e7759f67c4ebbacf3dffbcaef3aeeb965ae0fc6e8949e9a9d6e425e927abf6a456aba959a9542a954aa5eabacebb4ed5f28c742a95e79d7b5d384e956abe0ab4327be0b205cbfca1ebc2a985052d5ab44c71f7de7bef55a954ae525dd5bd9dabbc5385f7aa997fd54c5a0f8a26d11c6a43a50aa7af407ece0e39496329a594527aeff57ba9e719b994aafcbaea8694da9a3c23c9a44103a5c5bd617d6a1957d4b1d9afef7bfa7e6eabb5d65a2ba594d6ce33426ba561ad3d6a0f9f1f0df0f3470b5392d1370278e48ec96f417e0ed649967145dd75edaca0e04962ea015a214d660e83d93352c3cb61f7f5c5f1f0edb48b8f9d2b5a21ed68f93edaa0b8b1e11bc5d7e95ebdaadd767dbea4179337714553c61571ac81a438bd820d90e2f41552cb1c2063b5e9cb8faba4ef11bae93d20e86f6cf846ae8836cfeaf46b3842e9682f4908fac09c5494b8d8e2cc993367ce9c3973e6cc99335c70c1051766cc983163c68c193366cc9831c305175c70c105175896b87c8bf6bd9f7b2777b46491a7bb67ebd993a8084f75260fca953b56b282cb4ff9d3e9a43f7cd33bbc737af1b44aa079668ef96041eefbe864fb195e25302261c76238ced1f5fd6a91766602819207754ae799fb3574b983cc386993522afd636e0bce67b0a5b8491deab66debadce53d03a73a5b58293f27cda6ec0c99db1d5f4b369b5db55adb8ce63b5929e3e6783e3c685f30108af9c10603a3944188103bb66eb3d716127e5cfca73e93c3a442427b08c00fe0a53e4433a6d2fa5f790feb1ac913a56db69f2a85d9b3c1aa936815a495fed6fcfee48ca9090dc517d451445f2682519f15407c3576f256db5adb69d61990e00744e00b0b3d219b148ebbed91db56a744b2b00de6a01c05b5cad56abb576bcc54d4db548f01687848484d40abdc53939b5406f7145ad56abe5dee2b66c698de0add5d4d4d4544b046f71535a39bcb5aad56ab5968eb75669d2b460de5a21212121b542f0d6cac9a995e3ad5551ab55d46abdbcb5dab2a50582b7545353ada9d607de5a4d69b570bca5aad56ab596cb5baa34695a37de5221212121b570784be5347954a7968db7544545ad566b7aaba5dad2bab55aad96a675d3b43e6f3913ee5179cb97c81f0e0909a9e5475876913a569d5ad7a9d52a6adda296e7adf6d696d6546baad5f2d5ddd26a6d53ad964f0974a74c1ed55b2e01e001690560ec683500d4bed64e6daa56ab4d7d75900456c8213971481c1287e4f4d51df49c2be2b670455c1157c46df9ea238cd08930c54d999a9ae2a67c751172703ab534b55a2dcd57cf015b85b0427242424272faea3a39aad7aa68b5a5b52a5aad8a58aba22d5f1d06c2fd4035b59ad29af2a9d594af1e02cee652d5546954b595aa564bf3d5736e2c0e1592ca4985a4425221a99cbefacba6f6d51fb730aa22d5165591aa4855a4daf2d5b90f6cf97cb55a4444b534b55a2d0d3fc7819cab40e0380ee93a5da48b74912ed8ee7dd0b7e86eb945b7e816dd2d5fbddb2f4e7fbdd5268feadfd71fd702bba3ce4a37d4097534b9a39352ab3265e3e2ab5331df78a7eed455c3b201b815966db58e5507808f14cb07c047ba45003e522ecf726ac43da2b39cf62081b6343b3ed21f9ee5b48afc21c1594e692cdb8e8ee8d011253aa2456ab8c77b20813626a636a6e44f788665db10149a3435ee01c948a0cd8a152d9ce4cf08482cb3515149514c514d5bb8476706126813da8496d0227f447096f714965926a6aec2648509cbb3bc89b82787b3bc679040160aaa6b7896b714f9039362993d3a9a3a6ada510fa1e19e171912c82e2d9911257f4208c3323be474068a897b72be48206bc54a154bf207842396d5a8282d51482c672bdce37296331012c80ab110cf7236923f1f38cb598865958989a530f11496338da71b12a8424d1e759c6ae4cf8db3ead151d491d4d1d419eec1b18504aa4b4b666af2c7860bcbead0d0521d0ac3f289c43d2d67f9644202552b9347b5e2c4b37c6e913f9fb37c16b18c46454da3a823d6ca65f02c9f3648a02ae4846594a963d599d4a0f12c378104a2509348fe4c6739135f227ffa28eae889e54758468f3a56594e4402d1a5c9a3ba5cf2c11a32817b3a67f910f9b339cb47013ccbbfb19fe51ed80f000944adecc81fea2cbf2ceba88e55673995405468f2a8ce729683e0016125895b6d4b2380b0168070ab0120dc6a3be196e6ab4b12b4f85abe1d316d47be1d6d474c5ffd266481dbd066651bf26d681bdaac7c751c23783a519b50944e5454751b11ba1c4c504c3a4c4c505ffd83712f7bb4648f5ef6c81e2d7df55608ab1c3b64add8a1971db243d6ca576781a0724559a1285794176585bebaf7c1c561826231b99898a0be7a77b3e1385a0a8f8e8e96be3a67635b75a85a7979e1f8faea9095afbefaea8a4655a15648a368148daa425f5da5c5477fdcc2502628262626a8e754b3b284beb2848e968e8e8e96be7a6f607b77db9ba24356e8101da24356befa0652bf2ada466b387a6804d0b55c001e91d8736e9f412faafbd0b07703c9a37a2d52e3a50943eef042ef49ee28f3757d86d6d15aa0c7023d2816bd288e5567794f5f9fe9a786e2dfa6ee946d6a9bdaa6ee949cdb9ad22a62d9003c3450511d387580138a63d73baa6577aa6342138853f38a8afacaa9a1425f9d82fc1c83ec17f4d074422cd66e88636a2650d782e4518dbe4edda93bf59d0b7247f5917be3abaf3a9adc519d06a406a8a4ab574b931e55cad140000000a3150000281010898442a15816a9a2f60114800e7caa486656184ac430c77114020421650021040008000088c88c460087e8bb0041dd44019c20d0a1757513ad78fd76ed2170e317bfcc07fdfae326db4cc947bbdc1949e8ede28d8506948855d812fc9b588224e647305ee29956190426b8be21133128bd303e8078203598d12851a65efa1d36c002d1ec18761b2b43bedca1d445d158bc5b52b71fa09e432e6ace659821627d33be632175c421bea37759f18b4b661453d705ce3d0feefa18a23b6e0ad69001e4972e053eefba1ec881a0f9087362fd503dfbb7ac66040d59de55d8a8ce90c72760c0d80bb015395d39ed2d13256a9265dfd63a5b41487b30435852b4bb6d0b6bf36cc5f04764060e279cb29d04b2b971f6b59fa136ef469b66520f2a9b4f75def42ae33143001cf3f7dddf4d043ec0a63462c2949efc0499403101736db357ff5c16596a3cf809462b113b607ef058bf3f4deaad002a534688e9a35ed32e1c7b211d643c5bebf735302c1c231e394a59fb6bf232f596f98386258a6e09d014d3d856e74ed0a16f535f9b0404b58c57500169422f5789e2c94a8c1912660997c3b45981dda1560723d53a6fc6db5b64f044e51f9721ce8e2650a098c735bb7da24fab9b093256accb682becaa7449700de70a90fc3dbd630a683830e6598ef40c0f5eba93b2978ef2cf3493db1ff72fb81d749a064ec0f25dd154145fcb2a99780d485b3da27db67af68ab2cd59b775be560da7ff3200a21d2a8d766b297a7c7118ed5c0a5a5f7c7589eea8f114f967beb9c269a0bd4fabadf992790521dbc94c7906f917140a0a95ab3117ea4de58fb2abc07e0eb55d0917f8c6123ae6809e6a81eb1881b1d1762615e891854fc39dd0b0d6a1c51eb04c8248ff8708b3a421aba810a0ed41677b6079748efe6d99c022a776b4a423db579adde5b655f2df2206d39f4876eb182d9119dc45570f96e7db1a31972162ccd3a1314bbebfeb92348fbc32ff2f5baef76bd34c2be399eabf2d06626dc8be3e7e4ee83ce702b86ccda8a307b1d79b00ea24a9b07960d8072619f41c24258b23e5fe5d49deb18c9942553ad09c69024050c3d2ee10091198458a06015144cd874b3bff4a8eb57f3838bd0298c3db6ec275c8b0e392202ebc20ff2f523ef763d3482bc399e2bf0d06626cc8bce2e198c8f24fea124deb9c40f48c3801ec02f0fa1d2c8eeacb0b60bc7be232da9a3c2eb23e5c177e50c977ff8711ac7f5cffa391d53e68922280a73292b0a88080758c3ada43482b3ca01f4bbfb7eb27250ebc24fb0f5a3ae7e1dc912b83ce3301001066f62420a237030abbba5329f2b95de1524d6b0c147bb8c0f9166737308879f9012858479c7700bd2ce7fd069f8478f085dc7f4869b81fab4eae684e82ab2d3810b135e18d0b7fa1f35ff8d9cae1f10d3d8fc2001a61cdfb341ed292c15032fe95c87770ceb844655d08be342040ca12bdf2094d1b9027f627c5026207f57508a9543ca1ba64d6f091921d9ecaf78f4a8edb71cdc4aa48d77d68d4f6c3673e3aadfe8198237f8fe62661813c502904b6d16708309162a27acbdcf593985eae9afdb72d9de7e9ea8d9574f727c0d689d98e2188f5cd70f0ae32132e4bba45a1fa0fc0024ed07d397ad406cfcd348760ac686c6e0a812a1d8c268413a6ba0f646724fe333989764d1e16d94fde0e37a8fc3b4d0832a97e7cffd1198a885213d0798712823750aebe76cc2e3f59fc3d08884e569a2c04fdb2f4dd5c11dc329e6857e47990e9e1fd3093aa3da05dd34480bcd5f007f85ce27fa3a2892b7ad82d8b3c0abb004713482362501944e7764cac0e19357c24448711e4fe49c9e3725c3942e5c9690f91768250d0059517d7b51e34ef7c02da03d5b5269b5b21d819661aeb41ef8bbe1ae71a8e2e275cbf4c7b1fd281e59039ff5c647db82e02aedcc12e9c8b3381cdad5eda20018d9f195905596172b4eabd2a0b199d0dc7f6166d35d18f39f995e472ff66c0e288ad4bc5ad36307e97b63780d1eea94ff42bf238c8fbf07e9849d5dea18745bb465e1463ec0585291258da95923c22879d1443814381b3c154b98a4fd0b004b9ed7c6400f9073f475eee4454ac10695cf8fe202ff880ac338a090d11cacc5d8beb9487a70915f8129b30a6187d40d4692259337425222cec0eda716a1c7a117d07b1cb49ef7498097f7b7e118bb445aeac04801fc8f6d6876653ce53a4f6b137c4196a1656f583028db0580dfb2be485ba51b42030c8f01d81a3c6c6197688c6957f46b50260062909a516c497662c6f8abf48fba0068648551c5139dea5fb864acd2894e60e84a8544d4b5a6d9b1d3cd45700f26b8d800959c8702b4a11f9c034c84033f5a3b973984e513cf078c4ef1a7f840d7f35652357d7e263ecfed445ffe41ccca6b08159b1db2b842882173660792d07567ec57e128c0cd7206f3d5767486e6750ea1ec714d2380602f1259859c4c6560e1a4c345abba1997c3be4680a10f95b8a2fbd528c0f3f306b64378a1b5e90f8a32e9bc3d66bbd8ccf33af42c2cc084ebf80095c042262304e966ec0e24d05ba1d6d1743532b7e2f7d2a0f0ed4580f55b3878e8cc32f06b840750725f8f126daba0d1abca32a3f9a833f6985e197e1ec1a0cd937014f282abc14541c286fdb3806a1c6c515ce213e98a5e6da129f3bf8f22e5d809dae4cf135f46643803b6d673ff39e1b195741cfe21a5a2c5dda48ffe960898a0b14e8d547fddda6ef258c17f176614f44bd0a6f22f614ea19f1a6b057443d933742b07ec7f573b4fec8f51f47f90b6f22f62ad41bf156616f443d85b723f616ea19f176b2d708d6efb83e44eb93b6fe04d25741d247d3e66f349edf14c12e3618a44a3f8952cf9c6ba382e56e440b84aa6eb15aa619971aee488474b7ba7e7dda9a8682abafa93b4ad136cb71cbdaa99d45809c74158213295d3b232e5bff74cbe5378a1a3e163c536d1e08731d76df0a83a7e56b4bec573679669fd99543ec703b27defcebf88b1db4f2e51a6d96a213dfc4893a559b07ece37b5ef4832f2dcee0f7120829ed5e7b1c11b876f936f0db341661af5c392e668404483067b94fc2723f24f4beab29775afa99dfac2d33a425f3b020861479a7ed2316591536ee83810846a22b1e4b71743edab6e34bc8ec8961af28b1d546842fc9981cef706d32aff5a98f6dea4920d2c1dffec6964800933253eb67957d2842b3643886371df20532e0141e5cb7f822c15094be737311fb401e8f9124e366c4cc7e49249b634b59719fbfb85d1dad8395365e872406bc0ee100673c7ae6a1285ad3728278357fd8352c127c38f3e9c814ee43a919561badfd302fc4a8e8774e8fda7b249b68550d6eb5200a194fd085646502bb61af2070fa290d9cfeb17f5aad70e0ced796ecb44e4acbcc39de563095c90994f100ecfb0db2e5d5e2acce4de74c16ba4b16cd616d98aaf05607a119d7a5dcfd44114714514411471451c41111226a2271694230e4a9050e288080030e34c040030d30300bcc2e301d9d9bf2888046d1a0749da4f166e1d7476009afe60f533f02e2b33d7f60a2445b97cfc83f570be0311398499bcee12fc6507bb0951233744e4c3fbd046057c2bf5b090dccc748d6f09feaff04449cbdbb45d07c6eb1ab60c3230fcf2752866340cb7879ee81404e567654816792eea769e5b4b206a3f93ac8c40d7ace9eb314b41379bfa56223e6a8cfb73fd6f909feb5c8be8681da87934c4ed22beba6681efc87b6bcd60a554d44a33833f99acb375d9ffc6cb411edcae6b2f48a70f44c3160115e0da3868b893993b25621c780513556205436a7ef2ffe445143f84e6ab85d461333d5c2df7d88c09ea2b2238a45c0e14ef672be8575dc94e0c6a349d0b1d31d4c217affbb103f85e33f35923a9872bddfa2ac044c21c0ff5da89fc0913f999b224cb99edfd6c50d132eacf0d5943d81f3f4c5bf96f51a4ce598ff5edc174cadb39f84a43f5ef23f374685a958f38dbbb9769204305592ff7255febc933f1c3435985a553f829636985ab39f03a1ffbec67f72840a988afddfc53c0b4a7f14053d4c7d13884fbe794c0453708d30255aff45656f30b5663f7b606aa771bcdddcfcc7970579a1e586668d7d30556efd7391fc79e53f1c247530b52a3f02391d30b5e63f07a1feb946fe642e45602af6b329e72d98ca63cfe243177c7e5186f957af13210f031132de70a29dc589174d99c7cf55e864b73a2093a0a3c5c094edd5e695692194671f4361ca11001282749bb00a4f78ce16aa82a9ca6d8c348e0bc378ec85f92b87274098fac6ce83cd76e610d36b35c06b959f99ee8b52e8358ad2fa3c651f2906a662dc9fe51a749dc8cdfb51ca5dbbd0f418d740004bc56feced9ae247694eb2f16faa76a56f91cc2ba9ccfab1e5a76e0b43a8dfe489593499941f920e592c11124378e065b12b5d4ed8721ee6ca41fd44ead6f5a0c774279a7e16cc1121d0040685611e140eee2b86b96c901d83541c35389b053fa00462fc44a4ce2749e0ca913494346e197ba1eee858cc11a4c2958cb42bef27aa70a3a486b427e0c5d0d09f25df6d1679055c2b6fb1c656cbc4c7527a6f8bc46a83a0ea14e579ce60318b00d9fb5def64aeb41819a119b549548fd1afbd0b398f89eb126262677dbedf2cdbb83fa53bd884d4208daae5941855dd5e1e1a9f64c261c93b43984a688236e554eb41a0f09a622b02323f9493da2351f1021a3f6a5655294b1de99dd8929192850328ef3ecc4dfad83500d7c98182be1704d51335e0d9292d5c199c112714c6d2c0aa46ee56bd992fa93402f565c0cd4cb6eb69885cb8b1287681daa1e7077610bfe349f047f035c7486775bac052830853a1ac0217a9345fb90a41c26fe67ad8c25ba0d1347f8eb7970661082fc1fc982f15d7510b8823d02ce83f9c0706e43f7832260d2086841b930b4369539741b7fde38cb17144e881cb80ea7fb6a2a0beb11f90638e0b0df984af66f652f1fe341606e70ebdeed4938a5983631db8692a806aeaf9b5f211e3f6183b36cf4efe4388a9e370a889ab9efc2098e84d3b3fd5ccb3692bcc68bfc59b4aedbc4e1ccb0f63afb240e5260ae3d08248775b805e882e34aa9d63e7d015225c7d5dac6462851dd4d08e09379aaca6decfe3794f6bba9d8b63b906749484818c0067dfcf74da7aa8383d34b3db9d6b2283c6ffa49a0c3009b9afcde0ee5007ced4a8ce6994292c0c11f08ee93a27b426514b9fc33320ceaa29dc877825ba8158fd3ff7fb8b5350ee69d0d6230a7b0cba39bf128d50aebea5c7b46727983d5a8751959ad6b753ed6f6dc9a28dc69c492d8e19232401703ef3e22a3b26c906e82626405244ac004117b546743760759ab5d0e1f00b500e9ddaadac9b3dcc4572c26790911414f75faf5e3432153e92ae33039442820c19bc5bb74ad721afda42e4c8368a2d3b19abb309b1d88185e8155d0a12e4893302c1909ab6a2d55a38c886b8b7072478d66cc2c4906450f493ce321ab1fed527edb42d04c532dc4f7cee1a49f5ed74b3a5a7a4a892cf52fd70b3fb61c6c2958899daa8936ed246a2bfeba60c755cd92a3144431455a2b2006748dfb81e44a24df4ab1e195c75ce5a04a12a1e15500c12af4f36aa652c2f0dc17a014c782ce93b0358e564af60dc107b2b958b513af001118b491f0e6244887587ad71dc9d1f96e4a1d816065b1518823fea41da873cdb4b6cda4ca19c74dade9323d43272662d8e919145134d084ef45325fd3b222005074bd2de610c13fc0e57b8c5800af371133fdbf1e1e3604118aa248d6d062628772cc226e9e3f2183b4c4d72fb763462244d5d330625a7e116236252067e7016a403c6c35a1ce837e99efd42ef9600cd16fd6f61421b27691a98dc4462d5f7505602854af41c49af47b8bb01d1b57f006d0263508950e8d1f3b0ebca5a933daec65a0a420054ef421ab0f3409ce73c4dd0a1cf8e52b5bdc0fcc4eebf30af0357859856c4687c0c276642f4cc0245398aff8218ddac04d6c056a45e5a30f745618c569e9637eec206a634128263cc15efefcb97783f7e8a61331807dc9e5c54d605120319f2a787bb8310a37c5a73faa9c8ac74a18f452236d4a4feb9eaacf625071b452f18455c3b12155cb245578a4d0b2a17dcd8532c3dcdb876705a007e6bccd2b29877858c2f1ba975bdcccf13162277961971fb88f2372832be292b1c401ed2416aaf50ac235dbd38f05707e955949ac8d773a2545c7d172dbf775d5ff935f145002e89b03d44325744ca229bf7f36278627d7413c7f359830f462577c2be4ca5e13a3db3aeb40900a2cabee9d8ad4193dbfb0d594a0956bfda570e5f64770de4e3dbe395715fd65bf443f3ceec2155ddf9c49839002d0bebcecfdb167423bfd85ffd6d6f9771955a6e094cf8b101455a6c4c00b6daa9bdcc6f667b516e2ffacac088bb948618defff853c2f7e238608ec6cd04fa45083f109dea787a0bcdad48969e29cd24b11f161726ac346acdde2f8c05aa7d5fda1eb1e53698133dd710e0782467cccacee36596132cb2af718b73aea1e81727954f4884c1b276515a9a519b1223878638cdb7ccd3bde81d53bfa8c415e03f3e449816b57dc4e2d2b5deaee40655a9778e955d85cb4772805401d915cd310ecbb629465b47e5a4b68b2d8235bba9b218f439fe0e8aa5d4acc77f459a3d3da2f2d82eeb30e43a76daa7e046ad80dd13b3d5fc4e3b057cfd3e0377de6cc520f3d4b60b4481a183adf5d05aef428af8ac9c83b359a35df10816bcf2c9bee8ec8fb7a2c556ed604713aa351c646f0c8b069da194bc1ac88e095925744d617c93c1aabc363a1df4bc14bfa0354879cb3afbb1d64fc60a49407e8893c8ab65dd96390ef35306fd1b9f4c81e6e40d22d5dd57c80275f4a62ebd90eebd4835d87deabb242b1d2473236ba5fa39dfb71593445f7ad188b9af14a29876563221d5b5b293ad66703580def4002f429cee939501b66104dd2dd4f7a023abdec254c86d2f944ec4fb021c4d34fd63b86652d38718b6740f224ff62ffaa35c458be8c3d5ac0e54dba392deca53286108f6d72cb20905b11b973c4ad358881d04cab42c84a4f7b0687a61b225f06cf22ef33e399246cb3fc36ee0ce418effc0c1b9a5e019b5efea3af1f0fead29229c6b7062a8ac576d1b4b4a1ac8d724c28bb7669e69049f8e1f1b73e4ac044a7cea6920af712b20e24135074dea79d81b72639e8a5dd08d523dafff7de456d6cb95b878e33facd2093eae5c930f220151a0db7061745eec3c33ea6f1a312981442ee460685e6f8fc72b365b2169a87cd4b5e3023d61e11d098c234bf865fc245a8258ab3164c004461577629b61f4bfd73cf28e5861df6d6202620523ba3bca2f59c603fc45f17221e208178a848ed13fe6d61a538cab1133ff74ebc8cd08b8b4ec4cec419db2851f0fb95ed858d1cdb030a71c48d9220ad7f3665c39961fe9ac3cb8d224bee072b08f400a5b4802cf6df830468f98c0e4a3eab609b201cbe27a148a28dd5495262f400dcff85c13950e9f8bf88efa268dc182e2196975d1952101e1a225c4a55e3d9580a7e87a96c183857a18e8213c8c9bb3fb81e3b4fab4305e4608010dc3d7bdc1644ea8a1c25019ca2014c89809840b73ae9807e9c4c6261c2ea8f40c409001eba73a17167da08ab9859a0e195115786ee870e465e71bd1da9fa4c44d7a25c0caf416bd80a594b3f2f39ca1de1bd632529e0f107bdd4b9aa322c762dc05a99b09e536ed6c3df7f77d00de6ca1cd4d1a7b2cf9abe939281451f8dd15dee5b30444d5f1fe218e1d7cc0ea3e348b2124693f521f05df50e499b62e87db1c90417605b8cfe29431a30ebe32c5a2a7a7f2ed4495b7c2f546bba96014b20a8a9be613ea66b7dc4baa431e19f183e79e924f751960c1a861ee3110cf1b4112d0e2f93e849555200cd62803cd9834d15a65a33169b3392bd906e3201b0ce6a0fc02197928427728e4f437ccf73f6efc33c1342cb75587ba1523b1ab423566ba12013604bcf1ae9a16a1820cfc2f5848693f358a2c2a6f24e0f2823e491e03213dbebc37fa90074d8bb5faba6989602b151948f842781cc09d32e7d7c4d56a6ae4b74e8bc0cc7ead71c42aa9985b50a69f5c75d0debbd465e75fda566934fb29afa4a6f071e91c03dd2a0524f8081e33155c5b6c603f78e9cf542a7b43c8e7965188f0c346d8774272a2eabd95ed854752421f31283867180b91c078ecef9d98255282a813a8969126a16c276e0042e6d09be12240be96f6298fb91573a308738f36f3302bdb2dea0dfade4090d0c0e9f704e5855ea8ec1f979a774ef4cb9bb9c59940a56441cc926bc35dba071d18445864cee606ed06084dc748e4513bce2ce43aefe78479b2e788b057b2400f6b2eea3f8bbaad7d0ded1448a8bcd57ba22e30628435780fadcdb8f0886938ba32e6d14431236f62b27bb595b9d831fc036723107d7b93ba84c7faee3f4f50c7b1c4080a1bdaad21e122228c0b048efc681bd3c7fb42b0397c78723de1bb7da15c3d916023eff8d424b24f3a885c765eea18aaf833ad18192fd78cc6cf781c927b2a2fac24a17bd0bf121ba3e0fcdda589cf9b49a1a40fb4f2108c0f5499dd053ebc87df743ce863b91c644f8a2800e7106d3831697735e10cbdab7e89b5ebfb03b7726bba648976c5b54f7203879ba78359249d1f5008d5bf69d2e5a4a1f00dc269805176b63e2183f970ebeff98e83dcabd5bd664682b710d8d07deecc21786c4f7997dec82f4ce3584114b339902d2df2e4a2d4ac5c35e3d2c54eaecec35706e350ed3113fbf3f358e21b4c5602f11220164705bd2772dd6e6afee32f5ba4009aef0b19cb3eebcacbb00ceab492b4278f3120cd8d507f53877a5e2373e53a1a0b69fec271878a67cd89e570b792aa4b841ccc8ce47c57c5923097c3eddc2a3c6aba6c44fbd67556f6534a2a949f92cf3b5454b61aee81f65457d4837d5ee6c1f961f37042d3032909047e80407129604f2430cf11200630fe68c8f48bab91df8bcdec6d13487a033a9ade0799a89dc2cee0a37e799b4365d7efda3f55fa7375b733531d2fc24fcb072d08f65c85abc885df87d0ac6ee4079b4c17b738102f5d456b09870700db2bd758e8ad63b3633b551ec291d5582dab9f301e704f789fc0dd7c365c76fc5ac0bcbc21322cfe4d7c6c0541d8f89d33b8a2260b766456e5ab6e4f56c008e57ba0406c4b36b253a4bd5b4ae5a22c377d4b2bb86179530d3fb1c022d50bbaee308fdf8f1e0b4bba1798f6fb7db33cb3917501ff0581e5b05fbb010e5db3ff5354f771cec5a8c3b82c2e099bf2acbc882c7c556f2babea491786caec48456f3924897e049d996aeac94833219c60f5f6167a41f96b83bcb9ec775a3d9c1eb4dabdeccaaf083fc277a983de911c7a065d014ad22c07446cd4431838ff2ff66f5fed22c6a23a4ae5cfcde935e50128e700ddeea4e42f6b6781eea26bbd38b73eb6e2b9cf8ae547e03adc51ed270b42115e59cad7ca8f4cc734f87b80d51847d8047ec3d91032459ab769c9e9020c6d979ec27bd678a0c1fa212779661d9ea4ef11ae759f4dae7560788160959a1931ed60720815a96d65cb373185cafcc6f89529f37d52f44f516466c9bd7ff0e2aaa79cf33279412da95cd4721bb8e503f43d36efbb932d87a3e02c7904a492fedea1c2163ad6dc11f6ddf273922c63b159b4391eb1a9e36616202bda16ef22c8dfb029b0b9b781e4c682ec11c6d6c66a519a9545ca9148f71cf35c6de923c94c15b9a240f320aa9cc84919fd6219f1aafbd5b09e5c5214be7b184a8d9b4746d5a5426be48104e92e0ce5196bd505125d4ce00a108aafb0d10c622b9be4b89a81e642970d8324049dcb92ca74a832966089e430d589047ee3e059cb30053baa92e5f3f1537f791099a374709fde0b13c3a8673b36799ce7ac574ded27f1a904f987a4b2d2a9f9d8efa412a7af64eb0511390cd05685ffd8662a917d870b584b3830a0e8cc6c8fead192cc84d1937f3790d1fb28dcb0428c779b9f6f2c2f5929e8143906c83513e3b288e1edb3f6f7101733d892225a5926817b9659f1eaf5b137afe5013c7b321c120ff767a7a119caf4914e71bbc4f024346bd8fbb42de110cf4d7d0e0e226f496e8227e240eb760d5dcd536aa15de24a736770d23baa94ca2d615c10678a83445f88afab2956995676caa1e9242da65f5be780e6866b579a19b90b2fded4dc36cc5cca9a08544f76d063dc7ea18524f5b4f4104757de354f557d9432934d1363e92d64922cb090bcee15af28325866bb00233d8c1545cc8126be20aa841552993c7c09e64f597fcc32c505f2ea62b95aa2f412c0d549ad6d5511c83b80263073e22a29465e1c117b28033afb70b0243623f518719a49c3995912f789afbb1c71ceb1086da63fbd535b79f7fa95d7b9e60064896459a2af500ad60ab79aa4db2da59864aa947245172901b29494886ac0c96bee1ec1a0f4bafbbbb3317893c0a84f4e13463f13b94858a71320a931a639959d5a1a952a1f6524d7d58a8a9f6d1568990d6a3bfb8ff71f41e536f528bba9535c010715c97d48d997fb9100bd1b958fe6f3db21d4f9bcb75e66e149e0d3e378e57db8172ee23e2cdfe0adb9c72c4dec150cef316e81a635423823190e4a6d8f0decb80493b6bcb0561d19a7c1ff556410bf9b9cddc8e43b1a543350d1750247c48ffcc41c1a1aca038b4a3a9eff615ee8b624b5efaa4d5619b6a3fa334e8ae22c283a0d4c205a6d329b8a14dffce7377d4005b14f06db542841d54fb70e6d550052b06c4f26c38e3b8bb8d6b3be189b29a8004ea2843f1365211050201aa5661c530d620c4edb1f19e36f5c8c26aa7ef8607ad1478afc342a6f3389f0c1f118da808aa714989ba8f0963e087d4abcb3af09848bcf729fe8c110e340e5559860e0e835961102bfd1117d405f1fc6c321be592fe7a62003cfba5c71c14ee5ba67a24f322320b7e05c756908c17572fa9b93ea95c39313082393c8d25537d933c169fcd6b7e9b5bb4bbc941a93f7e7ca982b4b641279dda2df727439b5fae704fe0587ef4a59c4a5cf1ed74116edb715cc09dfef9476726cd389a316473327cdecf27f23e3b640797a8fea54a9c72e741768d9cff5f5140ad85be7be5966b16485e35a785380cc0b31c43cebc6c6642b0801c45184cbc748dde9a4647b11021bdb6478b56684671b59acbdd427232118e600297e819bd139452e4f537117ae76b831daf6ca9efbc30a422131cce67099244f042e5d2a297a03c745e25607458c614b13862485f3f1404a26bf5b1f281338d7da40c8cf7bb910481f1608089520d382c4fd1813fb2ed21ddcd18c01223c8056a3d28a9dc83b022e8e56fd3d4bc5b4c411669a09a8a5c904489ee3509361f6cd6a3b7d8cf69007f14a4d2bf36870901fadb17d2941bdf7e323a24d2d115a075dd9f0c1da917eead8e877280a27e3267ea07d8bf76d01787ce0fd10572a78c95695cb70e7523a4bfe191fdc11a44c9d80bb7d277320b931af272e4a33be2cf9c367b681ba3512b23105b90389963243356ba1dacb2696c71400cff6cb527a6192bfa7cbc85842c39e3d1f335894e9dc36e64937f1728d1233e544979b8dcbb69f6d7d9d7dedb057e774ec6ba777e88e451f78f9fe4b54a74287acec44cfbecac1be4dbb82da8801bd99eac569a3ca02a754bb17d833dafa89529a2b134af7c0de97c622bd2ad9299427e9a597a6eca237116c714ca5942b9221a7c07b937ad098692bb073415112334b23b188a6909430289aa58916a35be8d13f9deb27a568574acff5878fb57e602985bdf592b8197d161a64d63923695da97b3fb854b4452fe2ccbd5f40a9dad5ca7d4fd7bfe6a4f7f4fd626963576ca9d7e13c9f4e554add8db3d33d1dff547aade7a0a8a5be460b84296db9f22a48bbbd8076cee8954ed5c53af7e247d50c3dd10622a4e48066a7b2658604e1435612301a03467c9127b89d9eef342e581a3335569776880be3f096332a7ed8f50c86283795f7a443c9e0b5544a151f9973fdc4607d40221e1209d8123e41af37fb93dac1f6e8c2b17c8f202a41857b836747265aef83829bb10ce79da6835d4631a92ba7f2aef05f2b94ba8ef10361880e3671e74a6a01b593d32bb027330645c0476d90e8a5c57964111b08d2c5f69669ef7de71e02ea71ebec687a2d28378ba8027b745dbc4f000026a398413450091c0075cafd64a93359eaa9fcc5e7c3efae36a64933d03862fbd05eebe25d9731c0e52aa5ad65a10a1ee34503435b48c1a478a899236c7a156deba3a4eaf62efeeed993b78e0b9f7421600be4a79158e5fc970bce4b9db3db339509fe4cf9eb3be7513234ad629089658ccb779345bbaf38bd5875d1ab42c9a5d738c6a3d52d1b5e6dce0a74bbdbba02101390082d01f1dc686807032881020198e9579566112d83a5eea5bd0e59a1ea4b66067deb072ac8a72713c073e28b6eb9d91682227209ddf4e716d0b3d91cdd3fea83f75de96bddf38a374778c73fc5ae01f5e84406a643e9230b163b1ab4f06bb88bed4a9c3eadeb7b7851cc43cc81293b09acb37dd1d4334357dae6555b0dbf3635160626e8c39f9ef7119b8d768aa3f392423d26ce5dcbeeca4ed131f6512092abe123805bc2392d8b4f8511215281de2c97bb1440716cb2a1d608680c9e399863368bdb3c77f5ef04809d1c65f40e334e3646a51368ff62ca34286c26464a3d312d6c996705ba082ba3d407d83619ec44271f7513bd5b37af9ef4bf628483d8d4f906906e928fefeedc08c38218f03eb1162cf3b74aa64a473e198fd1a71ba4d8658e7a70bd961bbb43f5e2b0670d4960fdabb4f8478a36701a9d0da83d9d9b1dfec42a111ae82226682e9b61e88f523b197a9080fa70a2ac3dcd48f88d3e1f6ba9535c3d887efebbf17d8071cc05c7df5cfc9d7904899d5baacf4627116fdab7f47e2953465c83e406827ad4efaccec36ebb28c9ee4c43909970df2b951be5167073ebe73253f1b4526d7b4a35581b6fc3cd95d964c4c31dc825f04038ea071edbe8e6551f6407ac8b51a7884bd71e4b067cc8b71f3d961ee08df4bc855e948c7ced21f264def48da6e01bb650463972a0d547d54849a09bade7bfe1dafaa82483ed5a3a942f0da51153ce4b4eb0358b2b3ba0722192e288c81b27d7ee4c8b91677df024fe36a496cc57092ba9ad61f7116f4ac369c903fa7f83038a4d11a66620951a72254b2062b610844f9d0c8c41166da81439d9c55a117618c927f21693cc8d1c1694111845b67b54fb18d109aa9a8b2b67239d840fb1e3544d2202788377c52f12871355b55f93fceef2d60db270a13d093f823c163f79ff3aa90111721b765edae78e1db65a3a867dd0b70f9729c689da3f98bf91f0d6b43904b312e6cc7294f8b017f5415618a21cb2976697dc45044fe6d1223754fd34ff991c4951dca1e4202941d375cdd29b7d9a8e6459caae9b6defab3141bf3ebd762df91981108d89c0c92a9f6be635bd7ab8a08ec7a90196178a8cc8c5f7617d0181aa240ebf5e3ee1539053d39788943aa4662c98dce88cbde82118737c5e46726c2ef70ea97b3a64f12dedd68d0dd9db127937e7e6200d523ff0b0c4630d20dd7be9a65721c371bdd63b1ebae9cfd4d23e0e54caa004c8583ac21ac09b2c299eee4e7aa2d2dac7f684d6b88287b9fe2a9ef09aafa95e45eac78cd25bc19277a653f76bd09f07a1688073d6c827b27ca7a04320fa702b50dc1e629d8201b472c98c7df2599f659802e705040369453a6bb66d3d5ef2364c5c1d20d87612f02684bbae42de27fc4b1b8564a5bef3715c6c935cb9a96aa5ae7eed6e5111307c63e82fc12ce158250694d712c700d034f0f8958c92d9007d895ee7a33720fee16db1eb9ae2b5c5f60d36d057503c4390239848ca60b2e6d8068c4710c110b16143a1a5df0c8805f05747e35aaeb3cad49a64377625a67cdca29f9ae24768ab0a6d872c0b108b589ebec1e761c1d4a515ca7a523f80d75ef3aeca9052b38dc88bb8066d053610f211afe0293e903a0dc2fe2f02518f6cbe048222beefbc02e73e113f519761d88fa92f54dfa48f44d1a28062b566a36a38a5abef20444e2f53a2ce63d50e86fdc7e1e3ee61cb9eef8b0cc4558fd896355cd2ef1a8333fc78df695e34e202ab60ddee801cfaa44ce455dce96226d7d8f54affeb06fa226ebdb44122d2d7616bfaf04e33492ea29dd617d0b92762bd52008c69e54dea23b98261d7740dc8e141622ddb0c9f9f0401a8081f47d202a7dba51f52a9cb643ba079e3d22bc1f77f08d36d78adea371759e9b8f5d6d60a4a41ba7b332d2e4277e6a9bb60a6f24e91006c33cf0f9d9fbcee1bf1789a02d7ffb15e82294c897d2013b777921ced3af620c0d380fd6c9b62f5d53e776eb568e75b5261276d86d9747a79b1a4950f597c9cd9651b1843523fbd783db58f073d725c08ca8ce16810b5239a287908aef72b0378fceb399e54337238b1d172c327fd88a287b69a34625c130f79f0eb59e42150df0ce6f85312556f56eef3a4b9fc6961e9301e308fdfece1b247844839e32ea700b878c249d39da32d6afa2547ada24aaf00b84ae468f5dc0a57610d0e6816f9b72133bd4da6b5bb4e2ea8bd99242808b7698a46417166a573c0eb548862e5886a8620de164cdde3b53e3acad9beb85fa265fe43fa75479b6c0b95468b8e7775c1800fb3038445ff331021ef47aa12120abdf46635aab9826f56dda0886302498da6836d6198e8cecd21a7a1c3eb0eb55b2d160b527a44febfa0ea245461d2238eb141b379777baa65d6e5db20a5240104875d38a6befaec5f5d1116b3360922d76e30aeb6c8d36329e58f8fc4596760b22f20e76210b62f83ae28f542ab72ef6f550b59dfa69b5215689d9a6d9a54ef744d6b98d5cd14e5ac493f3dca6c6cfab24bb4d97e7611051061a21b644fa88a622dbd062b0a323aa2b6fc588527064bbaff2d3a154060e02763e88800e62c10826fa1ecc3fb3467edfcb052528db64524948407357de404e75c9ec866fc95a007f97dc718d97600744026ef4447103f0ae53406bd2ada50511e66e563121eab3505f133539894e8fbf9d4546b0d791698184d818f531b80d20c68fca52216489b5b9349b6e6568743eb3e7c5619647b31fd7054791081ed3accc92adb33f08d1234d766e023b275046cd760713760096f50d20239e0d12e794a678ee86636c09b429f3d043456e1c7f2a8637c31c25f5b8816d61146d7a8102ee784a9386adbcadec57a67bc9e479c1afd0a90a2d12b00bb7b7015c3ea754c42968c5672ba8df2fb50ac0ed37d0c86158fc3bebefdb2c6c1da14698bcfb3be403bf425c0f56853c2c95bdd38c54c53e9bd45abd6864c23601335a11318ee6fd226a79f13b44c732e2d562478a28dd4b9650f4165e991ba19a8e50f829b330a85026a5605b4e339c1efc39f46a41f4f71c5022f8af2458d0a83e573352d127ee28af43509250ba5d3d6f226528bd1e1e46e430934b500594da10d5c88723ee84da365303194291051a3650cb094b3cf33896bd1ac9d65aeede9d48cb3cc9f8e2f70ac3ad65a64690d951167b83d07a970735a09935396e76facc127802837e8239b1302407ddd7fb52075336b6673db8c0c836ab91999de310a3e2aac5bd7e4d28dce4bc9ef1f75c904e905904b6a1a562a983f236fc0057e5af655757dd1cf5991be7681beba60165f33f6cd74aaf8c339b9eb5c1d1992a57a4357d81e8ec797fad7fc00b8b520fae0b0b64b908ad6d391eb26014f24f67f62e11170917d782c1e3b967045773cedaba7ed4bb2907d6d2fa917eeea51de0d1f68077ede22a5497da6f4cb14291601f9ca0c4ff9f53ddca62c6e7232fa83c644d1e77a93c2d300c5a6ad30cb13a487607fbf2d066dc866458cbd76b0f42a395f8212dc93f6e6f3151246a52a97fc7504b3b590f5c094d14df1017ae552bb6f891ac11832f735d12c0fc16c014214393afb1734534853cdbe9afef12f45fb1c2a02b06e04e34e5873b7bf0f7e615bf7c0772832a5b2d78f2c31b5a03828d4580e3e7df058987a8fdc1bf697e34384a2e44b97c8f3d4a3082e740978f280a907944f2884965ca6bddeed6380ba27c36c372211033e226f684a594e194901f2c28b31274cec2759196fc6172007b8f963d955cdfd085814777c523fcd31e852a41996f261c0eff3c24d91033ab60f8d6410081a27f20c6f88dfd9bff1b2315c3885315add384da078b45c9f20442628218803e09eaa29b1a0ea818551cbab48dca83da4b873f89137032375cf2d75730103399d50d7e1bf7be1a64dd37fb73b75a1275ef11624263e7e1f5be5c3458409fd61b7907fe74a9d1e52ffff3ba2ac74a38d42792539b4f5d572c7557a31b5605e57b865cf745f8a3f9060210852df96f243bc8bbacd5d7b197e643b255f54d59ecde6313c1d41f0896240c06fc235249051526a61dac7a174e270ec0d35650629a655a56a7d3a6a6dbdbbd786937f309a0a9ead7914791ae731e9eb39d077b7c8546487066876f884da3342e9841c0ae0d0606d80b136a3a453c330729ca81e6029a3e4200090c40f51459a74b515a7ace3d8233163054dbce495d5edaab8e2c9b9db12ed6ddfd7f7d9bcecdf14b69c82d31766a5c0518c78848063b7ff1bdbc1b369cc030cdac3c3f3403145ab4fc0988123e2ba4a8bdb1fc8cae9e0ef701c019598a317774b916c5cadf057d193834c1aa485ffe85b7b8bbede8e81af558e41f74607617b2fb5eb74a8e9b1c312c15dea2880c3606f1763bf8ddf97ef21861f98a212c7a5627566fcb14beeedb33f992d4360b01bfac8d74f1b2e426baf1458b5e8dacce64fe3b575a17823f06a0accaafcd45788b1a7dde2f4d99352f169eeec27b81c3a2a4576900be6b3279979723ef6372d8818153d15ef3a2d814177020b0070292455a9cf6ea317e8b0b9e76f572862bd0ab94c094ca8cf4559db6ec3ab5e31a49a9cf544ad12d00d1cb340741e08cafd3817e924add50e85d378712f839e92fe6f482c077d1f56eecd0f91ed7fbefaad08f1a6e92fb2744ea20572f11eae1f5a4761da9601a0a9cfe2cfb01561d69d1bedd269ca6bd943ecf2df4a505abe07d7e2e4c4c877a7ae4104861d91e88fe797d7f5e5d4d05c877b688055a7b6714b7f172a536be432e37654e0caf9d8f0833bc552b14bc005df67b3a62896aa673b21b32285a3fc5d25a1f425c349c1352c3bc010bc044f2b2d77f5f2ef647bd35ac6040cac41d691a26d4c35f43891612f9322b1ce80620f94b019ac9c796a16ee827d369011c928117897aa1fbbfa99ac1f6cfd2d8782308a5ffee3b6378bb51ecb366de6d24f21e4ff22eab0e68c6454e68a53cc1979af9cfc042537f1ade5b7b3384eee84cf94c0ba2b07902743665bd79e104aee0a14c3047c6f3403f34985a3eeaf27876dd7fd3cadf94a408af9a36b93e9606429412a7b09caf5a5ba50c09e9bcd0cf6331c3e19a65401a2d286f17a065a97502e9da16470ce2f3ec4075bf74f3f0b5e9e84cc0c8c1efb7fa1f45e1321ba27a392102e410225b8f3487e44bd6ffdc00d76aa47b97fb298593c6b15a5690b05978c96181fef187e4b98f39a30a7db5d8e91a376b06fc40c43a903e4886dd7b448d9ccf80e49bc3a00956384e46744ba233addb8e797d3f97e6194c9c1f2313b517127c490bfe2929f4c87847cbcbb4deb617e924409c1b906a9bc2e981a7cede367cc77df95099979bcf22c27b9236324da6ea86b751b49e48a41a8be115cf0e52fbef944b9cf3852967e7558521eb4da569e102182829da45f28d98f521a8167fc28616f1f17e3178f9c74e08541963082110030cf9aead6cc0e6ccd551273cc474ac73813259d321aced460324fe0cf2639a9ee4b8e6c8de439135c56c9f0c2f889229a34daf659194a9b54f22515b22986654618af634ca028b9e71fbbc1f7a62e8fc7b7d8dfd0a2dfc8d3b9878bf05f91528ec652fba420b25d4e85cdbc1ffded5ff31dde3240ab1e5445628622c6869e6be99bff5adda294493433f9fe30333846acbb633f8d22f24e75feb7d9d15ae63a9f37713f24c199bff4accd31c202d9559f3b91c809564108805b815aa8cfce5a0fb2703e0f36289929e3b4771646ee2c64802123f0e648f2b43daa95f10b779416b10c3f9091fc3d4551edd10f7d81c8f17a5b75f54d2c8969480ef3ce204a10d6c510bffd369007f24740a710657118aec23da1b585dea90b85a6f98b0ed2121ca52174c0e930e437b071f54c71c0fe373e88b30b02a0cdd0beb3f830315b3a1b527a1d5d5513c369782e82f63c4c98a190093d3aec9533cc98b03542522a24d0ea3ee570abf53d6dad14c143775e77bf1fc33f895d4f06e5858e502711342ddd66bc524a4701e02dfc3e711586fcfc45ba428069e96218eb1aee340c412a2fa44b18ba51ff23406d2ebe40fd077b353cab950a5e3bcbfe4c06d744676f0ab201274fc5f366f9036863fbe8bac947a1b633abdd3d730344375b47ac4b27d455d119c915ea29beef30c0ea9d3fd1f60e6c9aa4fd3db165e457d3e468c08a879acfa79455b15da09798ea9f2663c5b19c798f8d41272d7b7f9e9fa939c020f029c9e3a9012160e58abe1375c6184b0c77ac0e281143d9e098d54bf45a93fc4b075f5d3a0374e102ba05facc7910ad40602d38081c20de5ab5c0d6fbfa6ca5076d20f8bb4b0fa434ec17840d711ccfe42fa56766829a713c0e399aba47d551a005df8e5b63c7ff2d146af92e2f9d7c8b524907ad332fdf4571c71a758142203d4749310561ace1e95efbf51c5a450ad37f7c3c7470cc502fc04b12d1730aef3d8ec6ba554d9aa5429b9381c68e9ac0d96e20cd54505b7a50bce67ea68a6fa3dfe86c3981d2a1063c1f71b117bfbe32b59d03618adc19e2a7b9514812e5488b5c85e22245de0cd4d1fc08d920d50faa609a96531fcddf9dfb993f7634eaa7548604e4a59209b1f777a08c7e6efc196f3d4fb52a2e83d0e4e72cc74e84a76a8013f6bc8ef1bc01edc7ce06931ea6b0fc9ea6d4df4f30fdd5044ebaef98f73897883e41c0885455c242a9248fd6cb22e51d6dcd98f8c03d5e52b92fc2e86720fd5128be0c1668f727eee5428397170bf912b6722a9d975cbd4514e8a500043603d70d39aed138b497c66c98014223060bafa696d4f9242e4c097734d075c8ce1bce78fcec5822f4a156719ea71619b6e405f043a357c9213bd20e4b8f8118848da1d391f4b74b441482243c9d7a3d7c9db16df96e83a3f99463dd31dea2720f1bc83df032a20f21f900b9ec69a0abdc3adccae9ca59f105b1bd65dc917c8d119a61df906696c61630e23a97c85a848cf785d43422d431c8faf4342bd221045bafa2753d2ac989243135161dc0235a38eaa2213b84a6eaf8707dc66fa60012205ef885dd669b711e6a25758d1e7bdaea26f162b434653db0311eec01db1b128fd5f7424e1c27e830e711690cb271cca603a12ad01e846c329d337c76e20e4dcf745b0ac79e39a166506809261f1d5c8668bc8553d74842717b7410a955fe3ae802395444d63f6cd2aa5f52b0202dff9f9ad5033af8505fabd2a29df61cf80a297879677a06e0f5553a6c8053a2ed24d28e879807d7b839e0260bec4310f1ae9bbee31da1d8d0226d5fbde4c21c4f189cce305da404931f8a05d1fed0c6d63641a724c587fab6a4ac47c7f94800a1e72cdc0314c0392f06260b54a8b869f6336b1580d33f23498a4d4e58700e2e80471e5812030c1f435c74d0d8f1bbe87c771adc9062c771d6c3129a3125320ab2c2daf7f6f685a08d0fed0cc4abbd704027af0eeb89103689012ef05acb2e709972d6422d69eac04decbe992e5f82d0bc8fe79ad4ff012c8f13383dfeec6b42e0421ebe7635f62d74b229d0148bb9c31e5f4c0fa471c6d1cb7902814dafc685e1e877cac0289f5dad36781f4c233a6c2bbb0a8a647e9b7ee4c33e8324a5315b4284e91f477a9fee30f2379ec5fa4b4487b32c093ebba6db0260b662909b47b8a579d6199927fe5e97c1312522afeb0743b7e5f5c790fb6a7e95a89b8d8effd785f2066a76c2b2468925eb814463eaaf4df54d2eec09fa0d0427ac262648b9192baf0122733f5514f4f54ec6a2aa7da6ba39b2c8247895d39a339c269d8cb4cd629d6bf7c418f978a7d2a71a8c0d2a9740833e7c9beb9d258af5b718a6a506d2d90262586a90bcdc521a68ee56a84770e7065b1e3bb2e9a1425249bf405e5b8ef7a18b67207fd43b0f2e8600313c98cc0b462ead4f55ff8f83058712984e14d305de579e04fa47a222c64bb20d2bd9c90c77a314f4d73d65020a8c105175aead130351a07d62cf73bdc544eafc4488950b44b66a22ff8fc53f6ff1ab060c6f32986ee1a3c42cf52d79b8a53427c6df18db0a133c9601944a1e95307288d1f8029888b6fc232113806e94d9bc618db01be38c4f208d161348f2b5bf600e819656cd9e0867531546697cbf071f7cac7f7403eb3fa68f684f862abe12f36dc7c19edd5bdeeebb68de8d5e99a3153383a77f36d1b2f47a1126ff744a7e820d235ad615ac47150447f1cf8fd5054555a8c1da6abe47017137aab28758d204ce710e349a80ab5b744b58cf330201c9498c443e1d272dd1070a685a655cbcb2414ba499f000ce7ed3f01deafd06e440636a6727f30dd0a7d1a8af6c50b98e938448c8b97518a22787079588c0b88299eb107b189ab10a1f5a550e2aa33082b9de94ba551f1c5f801554f356e1c8e89894fa2337647c50e5e7736b73edf979d0d1e7b3780dddae69b82c4c5bb3eb2c3ae99fe75779f9a192c145983bcbfc237b8dd0ebf09d8c1172e4e1c39471c0cc40c5914e54dcaf299bb10225bee9c620aef9d65c4cf582e34e312b4f5687d6fd7cf254f037c4fee93019ee76e228c25c9a8062bf0cb63e6ee22750851b1479131995a7ebbcb911c2d5f1855ef3faac48c58670b11c3e11d51f4a4ee01d4a47fb4699ed267060c69635a2471b7505f97547577e7ea8d5179efd25c4d2f06bbcebff800b64d434ffe7e36b3fa7cc5df4b333bfc4c57b7cd4fa686418f00204ad2b2d0f173cd2d84f431af91f3726d151ba512e6ffce5be93165f7e33ddb692cdf2a50f87105daff66f200653062c298ae99485f21740f4e4008b01d4296810dab8c1305d7dc83d3ca2be68a01f5264869f902deef3ba7620a8121299cf088a8ac31c1b75b790cddf511ab06066a06be8fb3b238bd333f7161734402655b185337b2022b32e49bba5ead36a5e7f6d564ddf5089a91bbf73ee2a8e949756ed65747312957ac556a8d0915605a540f11888303fb523aefe228a7ca30b3a2cb4623d0d0b15cf0030e3bc79e393189aca125026eadabb8dbb8b140858d7ffb2fe44c046c86cf23c5aea62d1041511282a23720bd4b5d80d5c50147cf8774f53c856488bf4643e3562c5e07e1d23dd8cfcaa85d08d7779cc60db1adb69309a4807aabd154311eec5fcfd6298c40f0d6f3f3aa712273a1be6518799014c92ec7c9533ca5d8ab75ddf555f5a5e203e3c10a62e305ca3481bc377ea6806da0e81498ee40303541d065acde47f967e917cd0862b1030d049ea941b3859073f96689ff896ec8aafe31a5700c9df2a79e4e5517c34f6b0d09acf61031bd2f98c8bcd7993bb3c327d07a62accf85b994957b24e0ef22c59c33d0e92af028849abdd52c8a7e5118802deffdb82d3b3cbd0f2ed8caaaa9ae5c976cc6e8c81064c67e03cf7b2c711fa907504542134efa1dc904d776b8b432c5aece2f4eb2ed0f681065103750bda9f33571dfbf2a540ea8453c5b10fa8f46a093f93d286c023302c12ee589d7b07b976a3991c6d49c809186818581ea2a8f419111cc2030399e375892066aba17ef4011a36833a8c7930838a5cc04f68e87fdc09975e4b240e21754adf1bde62948b834cd9b63aad8766a269839aa1585d76e88de1a2818c63e4a53b1ac0cde1c3e99a6288cab4c262441858c205ef53f3df8f232a6d291572b3bd5fd6a50387f25acdb16e7beaf81def3970ee317934596be15664c7edda34420b71da9adde34023b8d25b41f60427225ed46da7bea7fa3d9f7ab200bccc5c1f2795a0b0176398bc646808c194930305e150c083ca5071b8492c3b0a850eb04a0f571b68106ca35eeec4ac73d257532089a92b3aa9e89481c6a358fa112b5254e5cfd2bf19794439882127c557c424680fc4ee816190fe354a2f8d72840d6a780c6bb6acda1049fc5b8bb0a47c841249532172af7ef3ea45c10373474a17a200b19390d4cd0b9304377aa348b29bc44937ce1eff9ed62f290d7e2f4e76ed9a240b58bc317e39f66108d2cedf087260d7b1aded007ce40d3eb9adf9339f0a1f2f3dc28a5e49df8814a7356a77e864553ae2eb043628cd7d73ffc2a529446f12843d02c6b9500ad308dc6432328d02f191e747e7e5e8e17d11124f46e0f4802ee963f955a61e48211b2683ca82a3b784f417652c9b77ce953cd8329296963affdedc24f419217789615ab0084253bda99bfed734626187a266833523c615e90e2e372c1b5a33c1215e477a9f9846c67f8214126b10c32e4718db6a585cb8f1b7e3c34851583893cccbaaa3f79475e0f85d1bdf528f659d3efd2e88d94b3c0b57e696f26f121fa016701a4fd540a34adcf75abec662ec752d0c0991c8a030bd3837297c0e160f95e3bb6ab803bafa7b4e21f252ead2d2c99639913b3c5d982e95fe57ecf4d4aaac65c429f97e1d632e6f3abe1d8d7a759d117a6c642d164dff264fe516824e56a21687cc3ac502549bb43f77a31e1b7c439abd6a275bf20421407f4f9467c5c7f2ccf6f885191934e02a01094f120074a423592fc4301357a9b83e545eb51a6aad4f69b9aecac05a651021a1f04e0c04653bca4b939ab718caa50813b911ed1911a613cfb6404d748d35de666535dd6de3b73df1a33e2721e8c2d84c033abd655b3b3dd8a39d9cc249d37cfdaf75d757a97ac9c87f984564d07ae0271ceec4709468754984f20867d1e3196f3cb73acd0ab5c728797819ffc9fe8983b20022464de9a9901d748c509ea3dac10847afee595bea78456fb65479072f216594f3018382475d531d8c26ff1087b45905c32cfffa85491effae5a24c647f483d264dc6b53270d1a709ec3c27c217b3834495bdc00dd7525626c098d0376463d428ab74a89d4ce37cd05ae32822f6f2dca7889602c239ddc811f236627d74dfe90761e95f64c0f46fa996b65e8608c81d89b9bb2326f01573e892f3da46423e34c2b4b6b69d5044c1e398fe6869983774bc20a3675086b7a70fee2b99aa5e099b86ff6e6dd3553351d4981b3efc7c000bb6095bd4d3b5a31d5c33a35c169a58c94a0fedf0335b2420c2270a3d18af14ebd3e1d2a21eb85e46b9d49df0c1fcfef4eebbfa15be6a69893954153d5c2e906f5fe4b5b50ee82da42aacc859e2c7e0b3aaf475ab8dfcfb5d0f3957141a781710bc7410b1cb5c1abeca99d8e7f3def941c9bc4cbbd43c95a97d042e6d797bd1c1fa91a2a5bbf72fe0bdb91796fddd3ce8b6cacff0fbd90a7dbc08ccee00383cf353b4179281bb3ea0591beea401ee8f1cd1708062c89e3e05fc5fa61a6301ed13aa1b0aa506558f16025e8ac3233e0790844884a6f524dfe901e29bf9cedadaaf031cff3697adfa72898960754e94119986ffa3d7d1334603a2dcd9af0cb569f9765647909247150869f3789f7c7b99f8a0544d74ede955b2171eebf2d63028aa47bc6acb269475e0a836e215b48775922ce5a452c130a4b7ba904beb2312de5656938764634ca17f2e70a270f8a71ecbf45957bcfcc3139b002da5a86f4e618857166a3689fb59ed1bbc29cfc18159a520832290b79608aa00229621615f704d3ceea228dfe3d8645bef6ac47cf5371eea78fefcfa6c0ebf2f6173c2b58f49be11a94131e50675b08c06d618013c4124aadd51628ae825d4c2db2bd786f2b565aff72ee22a12e54c497226a1cf6f8a369eb3c12eb35297d42b8dee188b07a1ba10f3eebe2d47b08d5f3ca803635efdf40ca43fb05c217ba5a28089e3d238b412b56261d53d254f9858ec94faa14177339f080da3fd091a61d102417424a1581f0b15710caeed8821d8ae7186c5f1a768a05cc1c033a525fbadde790f83edfb70ecef1a9585d084ad6f73c0799f6d4e5dceab81ed1c52070d7e229d53823914d129d4ae30dab6805df3792cd35fd48f53de177270210f6600259f7fd91ecff94a75152e24b9e021fd400f0a732c4660277451679f1e67c2963dca93d918c60c8305fb07d2d75ca18d37778c11c658e2b20aa1127774b6b826e408c82b2c5cbabc52b78cc1c3f670a7d611c833ed47e4aac20ea2595bd80e13611c1e8627e65c32e8dfe230e9946ccb95983134d49e35149f8aa086972b25fb87d3a3c3499f90e13da7bd39f3aa99f5a4dda98bd8ce95bed2b2f3f58a2a7354d719965051955e0c75894e990676bf40de3424754d0cf9645a8a180ca0fe2b672980c03d11ad353b82383b1dbe39824c2fb8af626936f8133019b4f829b4fd05815fc8b071e45a2e4d199e131f04d8c2d3e0adcf5ecc8a184cd57d004fdfe324b61168d3c7b1d9710ecbe5a19a6a9b8785343926d31bf33ee5ffdde8b6764426323cf3ef0c16594cd80c5acd0f1d86a465898af7d397e8e0864d2f945ea5d430b9a6dd0d0a875c21a0f58b9834ebb996e06eedf0df5335025bba861fa5896402ddce5add04aee2ed68d429868173c8f43588070efa9319e825bb03db4152198f41621559b9280ea58e2351b25b548b0f894e043468c45834bd6b636ddf5b60593c96d97cd4a83afdee4470f614a56ea81601f888f705717ec967d0c89ca4beb0fe7842adcd769717d260bbab872f19ba793184362dc52be8080d3ffc3860e8251f6298b3790b4871413f4b14099beb8c1cdbdaacb5e2598722bc34f1af4ed3b5523ac423da83fd42e2e2eb53dfb1669f096457f88ab50f62a9c0835d91614f4149b36d75c8e0ade5073c58b706a815d80371573209c772513c14bef2c80d0bdc505fdf976b795d29e01781b2c74facaa647f8ac28b9feeabb4670e524b99b00b9ebe3d22d60f66d3a4a2a24053edb1d3ef3d6426158db82602b0d16d65bea8f69c13b2dae3e88e102041fc4fe21c21426169f47aa5ea50484e53b723ad429fdac59b879ca4ddbeef0217f169a043751c68a673fd43c39d7f5b7c03643f4003464d8abbc32ac06913d10bf4b6ad75f79d10c49b318dba25f9e54e0ae286209a0bfbac0beea0e94ca25e607d81903458472231afb2bde2b12d8edc4ac8d54a7b18da45e559842fd16512d57366257071b6b1fa05e52e128448f99cd58e687a403c2ab7c6c2d9fc797d9b4bd16a5586dc50aabd42f39367067c7a05d7d6164f02e98e54b12011429fd50ab01a1462947c1bd23b7870b3a0fbdf2aea5b1495d547a8ca388f3ab2fbc0c45a417e2f44d647edcd266470c428d709c3916c83e87bb646e89b2f55bb2e363c99f1697e0ce3980fa09c7a41896f660bfb09bfe0b9a89b3ae35416f093a6212371d8614c7ea934068f759723004cdbd307b1afa421f8e47ae9a918e5a41932b0e8b11233c220eba459312919eb7ecf52470623e52066482a1402c0db586d5727a65e7793d25d30d94912475e46032ec30d37192311b3305065b7bc750b121fc7e76b44f7a118d5c6756cada637154f8f4d0b773cca41931dc5bde88b6e8145b830ce587c8ac3e419b1e5b207149e622a308ebd64486486071eb020a7124f25b24cb5a620462fc148579c064f1208bf39a1688e9fe8b183398ce5f3d1a86f317c7ea7ecb181e7075418a998372ea005e58de3caa4880bad780a7ecd611f54de36e1c314fa4bb294eea11bdb5d270e64cc3010b298bc8532025c0cd41f8ec37dd77f043cbe140668799a6175cf4a9934c0609b6aac824d9ed55a348d7c38bca78e434c8036a622894d7cba5a5b2c66be1fc97e759b278aab8e872dbb421033c8005d736b2033bbd236cb3c7d76a351919a212e74cafd47833bd2d8033b2883e68aff073d1457d152f865bb27c825e17404f09081d965b37df4b08bc1b8bbeaf2401882b7123852189ebbf38eb0e38db4cd4b15a0bfc1a0ee3cb075b527cd81c93d3b8760a611da92379b488cb151952e20a9bf7e70de3d1eb3c4b9ef5b8bbbff6a209de7a942f3c24e35b0fd54872337ccae162eb0a19755ef45e11f188dba1c90fee0924fc795693f48806c3c35a7c93d9e6b950524a4ce06bdd69216706e83802d40fa28159da35c900a9cb9a7c4d5756f5a7f727859c18a4412913d48f3446116990284484182e9f410a4d944413c9750bb5d0cea7bd0c98d55520c3c214c32b17b16f98f4f40f82db243d1b7cf3849e7d182d28e4f381ea5c19096e085666013fbb45f3ebcc491dbedf6b3165fa6f7cdc0c53e044c91a4ed3a7894d3fe4b1747fa7a58cc6a7b0a0b16ac6e212eb6849c8c20fb7aa04b076e171bca5f3c1bc8c9114ea85d1ce5f87be54c0974ce4ac72f6613e5f559195d2aa936bda1ff6394346cc515e8fdc408f53b6c9333537e6cd4dd3e8732d7069e5c545cac03eab678d2706ed3347137f3ab585784364ec83afd3572b2c3b1be3df0895f8ec48782babf9346d51a30605f41925f2f6ed9a5745321528cb9216e63411438332af1aeb9822d989a404ccecc9a2bb2de4406625fad6e95938844854a49ae56767ac536f03317cfd977380357411463699b727ab932a755a891d5becda34ac11d5ef5de6f4286e7ac6b3e011de5e8bf48f040f9deec49acb0dc107ce8007618d09eb2efaf3e91c1bd1dfb22551bc458e9ca270f30359fe2ba22afa6ca5a72ef9dbea172605610bab786bdff6838d9e7791d3529ffca7de85a8035e9afe61257466b841649f713eba372f19d05f5576db0edcbdf86338e55955481dac88ace2a2b87982400ed0bc0ddb8eb722450727461c9c8fa7868160b35329d7d1cabab0cd0e211e1ecbd1429dda28d9806086b8afcb21dc6c5f671df1441bf9529a8aa139ddabbae490c5481cd838ce54cb6b502dbbe30eb8e8651663572e28cc88baa877c0e948dc3d79a41d261616dd7a0259212be447cfbc1514086a3280f60e9356614642418161a9e532561979d65b79057eb27a5a6f1a6da2110b3e4ac32911e0c418949457928ca91fbb3054806622c103d8ae1a5b93d60aa23ae896bc759045bb4290e4556c2a969cf1fafbf440830c09f2521d9a0d21d4528af68e1e7be3558f716de15b8a5de25ffa55d5fb2d0d33e8d01b6ebd39faa9e43121a5d8d36a47a3ac438485e8ef727ac298cb58965850e7c52028a240b93e4169ac2a759cbce2456abb146b0b528b2b6e4b34aadcaa565b17559c54bc5f6373c64e66555103c322d22c25ec005d4d87f9707b41b60129efc44c3b8b41a9c3193f5fb349af3624c9cf33bf1a3bc17d06a3b87b6a598c8dae6e66f0e877de48fad04f31a70530cb6c4b28e406e30f2e7a6a68647e4ef69345b21b329d1c3681150c182bc69280bfa6abec07e3f126b345584b0299dee7cd92cbbbfd53aa55101f31425dcf03f715304c104209510a311111c3b2bf075c383473e7b8b828cc79e34dd6d302778e20a7953e510365f6be1c3663b0b3634d6381e96ff2b5cad89bafbd4aec800d49e461ee32b36e0c5868bfc6f7b755cce6a9dfc9f85c3c4262d13864f13d10440faa7566e40d90ac2524859cd9abd10b6d6fd507edff599cc0f8ecf30b0769473f051fd5930b16f912ff7620773517feed6897a49f009f1c82a98343240c9248e549bb1a5f2948fe44164bcf88fc6207e82211b35d2207116eb6a865821d65d5a4e952486325bafca4c5c9ef40f4e2a3fa0fe29eb3824c098521ab09f69fb5acc945f71a5752bc2a5755f5b98c841248f2055ca7ac501cfb8bcca87a4d1eeb30fb81123f932675398900ee2cd1d3f712101afe72d8425ff83246431d364edc03b10ddcb5d28c7b1df73d63fadd6c1455b607c9a74bc36ac5c6fe231d47a0062d06e0f075ced079cf2d29a68024a771a89c11f80ee0e7b43c14bf7fe0581b08b8cc86b37c7ff4a9ae21ba9a5c851c7daeca78bc18cf8e4e7e2b44ebc4bcae037e23c4a0d31fddbf421670133cdc38361b6e3597a270ab6b943ec58dd1ac386e7ecb44d347365e7958d90465371d42b2367d9e28818724b7762b8360b2badd0d939c7214b66ba2a1ee162396cf63c3b770e09a5ce05b419aab50ccd29bd576b7c669c93586cc3732ab25a6412a2938c6f09b0f91670ca7c24f8f21ab8096279b1a2e0235242b53812f251dea85ff0fd83b56cae53156629a6ddfeee9aee74d8ed0a0b2f1fe542e2d2d4e7a42f5f94c49aa016f45e39e5b3801bd9ac7bbb09f5ad0458617fc148a4fcc7a4987966d38baa645ab29182d96b1212db13f99d4f5c80905364af5ce98a548c304e7f38502fd75d1ccdc8b316fe38dd3baedab2519ca27cc5c18597f0f8a1c20b84a420dfa7d8274af7d8c6a43ee3a99026ab0bfbcda1bc17ebfddfdfe0a26a5053b3eab3d1c629d75aa4e61c4eab354edf99f27f2fe8c894857a672a298d60fe3c711c2e2a29a2719dba8502d86d6ee841b76d442e861e63b924de0314db50fac5346bdcfea14a35ffb08507ba64f351a4b0ea6d913e64549ed11909d1094a864dde7a2fe25437ce332c3fce06768804866f46f6bc17dda73e229e6af619d39c45197a1cdcbe5cf93eebc2e5e803eed0c895e4f3cd7e9f1bab770a8a41280e7ad27f14d604aa196582775d91efa0760428f5ea9724d03ed897f038378ef5f7d9dad58485a38f09c9df3373ab785d496b5f032cf25e458981ad3646326ee73974e81618cba92627f38de81705a2f5b7c4e9eedab152cc346a2b8450a8b253309392820967bff5ae03bda4ff4749914e5abe07f10f68645dbaeebea73fb94e58dd822419998b6d56d9ad3ea4f5434ac57f5d0dc87d71891b06c8ca9743c9ec88bd610b2b2397d66bace2a04f6acdbb0ec406d3367cbf5f087e584630c46facbb38d8423adca77cb52188942634c0b8e0d1845c46b0a05ad957ea9fcd0ef21370ffbd2f2253309f61a812f16b805511b29eabd97441c3599801db7393b054e762760883c08a2f32c2dba3687644ca0d45c658b8c7c9fc89f4557215c0eec520282694c3398e50828868a8454c39a2269d5c3c7b5d4296f54317fdcd1a0926a6c901262ee6b980fd05fb9419ea3453cd9392419df1249a8c0f1c01c89492d759fa97a78a6147922d85eb5bb7dc5712cfb5729505e8d4cf83ca3041d05157930364dcd77d4c1d5897cc267afe8ad4c1284d9d21c0249f676e252b2fa74ceae6aae787a62a3c24b98804c8e0a70e067c8411db64f1bed3b0bb7511909eaaa2d23041569f7939cdf9cf3ac0db3f3c6d4f08c50fe238728edda6409b45a0b739a4e98e334e511681166fae8e20c1f5416e1229f2c0213699ef25ab08ee7742476af1922b6dc225a16846838126342d6d5433cdc342c28a21c8b34e3c88f3188260a1a1ee3787059a3ec73ccef9f3ecb5dbfdbce33818f278b263e8607137d16e61186c0e1105fd9238494094aa24c506a5cd6c3b13cdd45c07137a212bb15b7c501ab0a1694d3020a7bda7a5b4058554d3af975e539dc4ef728881c405fb67227e5b1145a17917103d0a7c1e451e84dabc5b7d5e8e6190f6e7edf36625b3763db7b6ce5a0a671afa9275dd0e3f6d415ab32754e0bb298ceeb76dd6e3f91468834b237d97bcbbd03bf074507a307b87ef844a6cb9485bffa90dd76444f7afd8aaf150766b2d00429a41822c5b66df286c8ecee9e4ce87269ce3679a04d538b974d7f13864c309d58e85ad6621d9d97367dbae953081583a469de66b2a6f418244d482011df5edff4a73d770bb76c4fa5e7b76d08f98dea90dfa8a4a4b610d540d034df417f8ff8e3dc407dd3df8c5e07c9609646e412d9933da1cb33488f7e1211c74d0ae9539e3c989ece4f9a3e65ad87366de60d4c893e3f978029791f1c76ed8a6ec42129fbce993b6364ae5ce9b42966054597e50aa2b82b7bae34d226b8ddc61dd327cc53c16430aca5267ba0c98f8873acc130ef4c7097347daae913e5bc066aa08c48d703a73f8983e7a88a2ecf20282b4d27e8a0134388e025ada4836c683a9b554dc9a6c384e3b3787fcc68a43f960d871272497f53f6c09659a4eb219f445ce1392f577dca3de877a41098d23e2f8700537decb4db78c477d31bdf4126cecc89a2cb1227089e9f34787e06e9934a7c9e3837104e9f82668ef6f9a9ea9344b50ea069de075608b2a78dd04a50226df0943278c66997686dd337dc76237ad827c66e8e44f0bcc4e95326c99c195971c88d3cb106b6cc2803689a87915232e964cd6da020896a2592e632a50e06e1f92c74a50d193a69a44f59be474e01a6e2a7f4b93e384c23b64890999157aac8671519ffe11c6b228bd6489b3e853c190d2451b2a74df3d6765da9f406ca1f6e09bff9a692d4dfb45d7f73e2d2c451d5db107df97ddd4345878418f6f785a8e8ae15d25c65fd1b6410b244526c48822674b9eba449578aaf2fc154e3eb3ca440540e69ba7e03be7a4cf8823cf0672a910124fabb7e71d04ffaf9e9cdfe42a1d3d06dc80c2091a354ea3a78b3d09dfd85e69c734e7a8969e836da9bfdcd10dd6e843c1ad78cf282d79c874e20e1e67afdf50cf489fefa65ed75757d0afd3a29142ae10b0b3d0b6121ecb2d7356bf5011576e89c7083cfe0c50131963586f6f26ea006ee016f6b6008bd2cd63311f31fb633b1fdfa27a511104218823226bb7657aec7e2bd3ffa8f08da0f4178435e66e9db9016cbb77c36638604ff613b7d24d2a71c876c96f2607a2a63ae44983e15d11f7d9ce99ed3d0e15b25e4edf8709c895efe2e113264888525060a8d0da28c0841f8f7c752830e3eafac782cfdd138d31fbdbc9126c68b035ec219299c32cef489a6a54a3f7f3014f254da2322e268844475e79eedf65cea3cce9be18106a6d19fbd9cf0e68e5e32c2ab2ff889a56649dd4a89e532f0fc3065e913a4d65a6b2dbcc4906ad5041e3a718420d1884beaaf7a105e1e07fa83a4687b04832728a594526a034a29a594ce39279d944e4ae9113a4a29a594521b0c39020dce32f08441787e1e4106cf7fa04f32e667645c6731dae3be3987701ce1d802658434c578b845d8323f7ba4e702034d247433cb38cdcb80a9c6f34414a1923438e2e3e3e3e3e3e3e3e3e3e3e3e3e3e3e373e4c89123478e1c3972e4c89123478e1c39728465c22ec88dc7a49fa7539b5a8c2dd9820c6a2a2ceffddeff77e1e22b2b4f4979a97414949348373179d77ddbae69c7b05bfb394f4f3416a9c9536c0b32e3c112fb892e6f88fdc419ec2766dc093445151ce7268445d12084b00515d299e822531577dd09cdececec84387802bfc8029ae6331cc048d98450027f6616da133d377d6a61f990903e65357d824e3c619305c1f24a3cb79964d200a2e2aa88e789033c77307f8080e729e49201a2620f11cf3304789a60b260881a05886a9510cfb20a5862417641c7b354e2a209886a9c1ccf3208583a21a1b8f12c5b47750b8867f9022c692071809f654e0aaa836c341964087a587902a2e40d0fcfbd04dc51e82aecf0dc4850509255e3b97380bb890e820ecfcd53a2f1dc23c0393c770afa05373cb78d096ace788e51b83cc7295a483016894b884fc8788e43c0fdf88318cf71157360c3735ce27b8e32d8de2c7104353cc333bc788661c07d0dac788651e07e8653c0193a014531ed2c7ac0ad03ee16dc9d82db04770c88a23ed26443d62a60958015025644f4f038c010b147881d2a03a874a87072e0e0c00902e7064e0b8856015a3fb470cb06017ce8a1837878b949ddec70c3aac142b14e2c1d583472c0e1060934c3a56600352d353c3832785a3c2d181f0062cc1f1825cfcba5ae062f772f662c0c2fdbae85973b152f9756781906f561e16518239f131f9167bb9097bbd295d5ec48a1c5e2615508a3d45d979767107c6fe3cc4568860738a19b50cd54fd275482902a08e85e2f4b23383676711b67293c477a5aac9d15ac060302b6c270b01b172ebc2c69706c9c721b672840d80ab0184c150454b22c2df8f4b4529a48e93646b98d33137b43849d150e0e29c8c6c0ced818ab42691852e36c6b51f1e3d3e3d3559c8a84ca5377eacac4c4cb51088e5b55551bd49a3a5363620dee1903d08fcfb6798db1db38a3ab26b07876302fab8991a84c06d90e134ddce4a0265b02cbe7cb0a5d3fcb90015b6e637a1b43545c5de079e658e079ea54a0ef7bc611edbd3f5510157b28f03c6326f03c6724d04d23026d04a25a05816789e401cf328903dac5bb8611fd6207a21aa701cf928701cf92b5806e1e8ae8bea481a86e29e059da24e059064140a7bc6d10d12d8020aa83783c77d0019ea56a8867990408219a0844c99b1dcf5dc400cf6d4447a3bc73e4e81538102559389e7b15c473efdc68d25b0820badf301025810af0dc323f3c370d6e9333c017226cf4c807a2660d019ee38f0fcf112852a6608ac3b00be3ae8dc3360ebb300cc330ec0b1cc7711cb771df384c136155641a966559468570228e1369dd560526eab86d3bf6ac13659948a45da4655d966559161289ba509685340cc3300cc3300cc3300cc3306cc3b6631c776dbb17e644518b5fc830eeda318cd3362cc34627afef4427a38dcb30ec1d861dc3304e74e7b74bb176938878c7313d966558d63e88303b96e2179bd0c5d9f016cfe832ff192151d68b306d9acf90956be0f9e16c336b435d8795a657e7757afa1c61aa97bf796a6dd7e18eb0a5b312d45bcd9e54c84b29a594524a29a594524a29a594524a29a52c61a051b1464955798b9497cee22b504efac9478f9fd127938e7b3c0f7d3a6d8f0722871044f4893ea2eee38fe89316493c56beb2e27dfdfd58b98c38383138313855bbd42eeddbdab77dcf6e596d36a1abb7f3beb876b1cfebe294fefa764317ddeddc4d6ef7d13521dd93a35cd2575c94d265b1727d804085fbd2da2ee2a8dc176f71559e725bbc74539ec1ecc0458b6a842efe742db5aa0b2a55226daab7d6e2ae2b959a48f6e70f675e6e98e726722f7f78252b71203bb6f1d0766897dae50e6d65e5700be2c5ed223d465c5c1904a74df51103d0d4af167655d2832b5ce2832b12bc722da6ad58ac72bb48a7dc3672dba7bf7a16b791dcfee9af1ee536e936d06d25a3db26b797a8fa83e9af5e74654c7f32fdcdd0d4d8f47773af0cd2a67aedca1c1c4dc40b482af6faaed5f6bb7f04e788dbb6b51866431eb63591fe5a60e8724412b398c43ec72e60247db2ef8824fef4a9ad676127658b26419141967cd5a8b7b5fe04595240baaf4f7d9dd4a81cd2540fede12d168a2fdb21cc2ea2b41b4e9d3ef5b1673b77acd542a177666b586badb5d6da66d95ec2f612b697b0bd843d85a85e029aeaed766b6dc6c36656f4eca2cc5a1f1173ef204da487b490d6e91c5cffed59f4edbbdfbca6d9915de4018998cb1eea9a10f6b689d9b11c120523d6342cd39278a15bbd44aafa2473b22a6d647db764fdf7974a5dd7ddddddddddddedc9cdc3bc0cdb9a664776ec75d3d1c7aecb5b956b7bc4a411b92375e44aa3c1f5cdead3d5349b37638f3f10f60c76560f0e00864eb07270d6752752c7487f75ce6e161a76e9af3b1f2b0ecd986b464aaf63649f663a628cb2264d4281fa445ffb9aec5ff1f3ba9665b7d9ed266fb15bec9a3d9ddab36f0f69b728b869d1e6e532283a114d5a0c935baf8e8aab9e54a35a87c19cc9948d477ba595fea416d2fad2a46781441cf272e8d84b1b8fb6cfa2153da344e22a53568d1945eaaa8ebcd065585b2013cbfbe0b0bcc86e3eef51a950517571c71996c5c6a33dcbadf467bb370a85a657e816894422914824128944229148f48bb4dd10fdccd0a64c7ff533361d263c75faabd3095d9f45e690a8ae296ce96ff78a2e7d4ed238699c59966997ec912dc9923c2bb9bab492a6c9955cc9955c5d5a0865db71691bcb065b1dd68b4922902aaab4a8dab4edf2724844cf5dfa08f104ea32655d3f92e870e802b1787ebb40ba164c455cef04cc62e391dd5222b455bf62db916d598f984436015deab92b7d005b6ac986ec49f64cbbb348d772155f20963a3bb2489fe6eb654f9fe86c1484d8e1475de8b2ec340e894f64af8f43604a7b4a8a8949f68ce11c87e07a09614bb6d97c79ad371e212d7bb7e9d01e440f4df37a88322ffb8f3965a60e766366cc9859336f264ee6a2455904d7b72cd25f85d0932bd8526fa35d347b2b8e57ae6413b2075247eec8962c227bfaab39244a0a21520fdf564a297d707a6e707d0dae212596b7f0a59301210d79292d0f69a526a576619717dc76609a6771d04ed9291532626008216541533d3c5582fdc0702e94aed05101d74398291426ec292f15d08804202ac208c0d453524c4ceabbbd8c044b3ffbbddd7860d73c205b10ed7598a7f557a746aacfee0ccdde8bb6b0226daaa74a6a24c1f579c66704d7cf3ce79c232f74f64662547e7e60eac215369de9938f88b753195c290caed85492298db5e982947270a53a54889685b4671e9088372fdb67cf5e68d9a54bb04b83a8924b812e6dc196fad0a54e802df5dba54f882e452eedb9402cb61e25225197aa73481435d2a6fa183bd3d55c37170e0f0ba44870ad5fd98268ec0598aab87eee4c199892b8258ab23a26baa8009958bb0f0e6bb7cf4417e2ace4954a36e8bafee2573d13a7d59d6ba066cc54b1945c7428320adca71025a380a67aec307585bef1e850e81bc49bc78225923a614a4b70c5ea678cb55df7982dc4c59f6dc7f690072462919723e6581205670cd6492f6b5ea6b507e745a08d250712333ab1272eb9e921fd23b3924564908dd5eecfc643bbf580449cfdd9b57ba38f5dcaa244b0569beaf35fea3a7b99799902e1fa9ffe2cf580448c792f2811d8523f2f6551116f71f4c8bedd02f557bfdd2422d6bc98c4def883c59f98441ac1f54c98bc3e02b50fa3d78bee842dfdd0c8fb4cbc1992d56a79dadd8268af87e6b54d7ff549449c795dd35f3dd6344db3793fa6d4e9afa64f6f9b3ec955fc919aed4a72255133dad43c1dab245737681a7dccae8f88ed4b1245596daab796554b012aa79f4030e5e23669b831030e32061c3060fad905f86273a6802f768505f86275a2802f7627ba24812918a787a995d34f1f987af11c2a565cc03a5ab057b8a79f50a8027cb142a20b350253a397b8135d6814e04b5d45179872027ca13bd185fec8a4029602a6cf56ae00fee2ae7c745ffcbaa367f7fabdd9e70dc0bd3b65c8686919c0005c5c66ccb8e1061c70c821071a3474d0e17442a16ad4d8618754caf4d90080183786000ee3fe2e2e8cab5c17a45bfac925dde49ebc0b5deed80ddd5eecdab5bfb7ef5dedb1a79ed6570a2443c6b54ad2d292046800030052e2e2f21a3463c673d3d72537dc5097a870c0410593430e30313468c4c8e8a083cccce934438342d1d4d4a85163b3c30e3698dedea49e7a6e7a1bc484f3e5d8b002408c9b827c3836e46000ac6258961a4e1f77bc7b7abac3b253c3bd9dfbd5bd99e27aef660cd7d770596e8c9b51703d00ae0d37bbc0f5dfcd17d79b6e8e81eb5377879b5b707d8d9b6fc0f5a89b75c0f5a79b77c0f53adcdc03aea771337402d7e770337c02d7e370338402d7df70335c02ae9f71337402ae77b9194601d70fe06638055cdf7233ac02ae9771338c02d7d7fa9eb0a5feba16b6d48fae065bea5fdc0eb6d4af5c126ca917c02dc196fadf15d8520fe31eb6d4bbb82cb0a55ee57eb0a5bec595015bea53ee0cd8525fba34604b3de9d6802df5279707d8526f726d00c1dd1cb0450822604bbdbd45c0967aed1a1101d8521f807b046ca9f09b4ce8fa99cca0607d17c3520a5662c960170c9d80a2066753abb3c66983efb7946252e394547cbf98644113d5ae04886a3340137d0d35a8a89c9ce02c5919ce8db364d5e87854e47fcc4ba7bfcb08a6871fa1a1cb92d53ae5bac230c5f529ce257d3231d227a412ad49d2ab9dae2b959290833f0c9de081c1196c08e3146525705dfdb2861836985a3cdb909f4b36a1674a034c3f81244a7e54c5f25c03f248ea7db64c5eb69f97ad0d5eee62782c5e0d5e3ec6244bb2b04fe24854efb4899e07d37b5eb6acae85e9af87d330fdf54aa2e214a0897e85e9efe50f07d3c37071ad6ad840862a30fd0b2f97a6a8ab28ea0ad34723b0855ebbf4744706075501fae43c48c906d3d3ecb40dcef03094bad061a1630f6ca162c860113c49b081620966c1d009287a70e81d7ac305b4fa50c46092c60204d83e839b0ed35c5d3aab8ac1d41460ea0844c51d69a2023c69f1c50a698da16b2a76b480e7fcd472ec1942fb94b39b9dec548e5d95f9aa127355425375803c6526cdb449992f8e3dc35ea860f3aa602f7d62ff70e82fb0908bfb83c33e57545aa494e665687ab93e898939385febb76dc7cc3d4e9e44c42a3b3e6c72938feae9ad90f842777630a5d50ac1f45ad76d38b8eba1d0432138a3bbeb84bb1c8edc157177e3aec6dd8cbb21ee62dcb5dcaddcbd7aa8ce8c331273b7b91b3b4f063e19d53082d5145911a1434861e8200f30354f5f03a62e4c7f4484814b284c823d61b2044ca38069ae81297decc1cb48b05889b296b3f698c2d48623147b50f0078a9dc29342cf60c642835b105def0c6222c1d3cb2c1809165c9fd5dbe1eb7238dac096ec1cbeae284884afbb15d9f075b59586af9b49990c5f37f413c2d7c58660f8bab66f2cbe6e5d52f175af1eaa43f175679c812d59951809d892dd46e7902cb0257bc4990bcdc5a6c38427ccd79fe870bb3155fd514d65bb315bfd1551d2b54e2c4e514e579c3e460153dbe92710a80fe0498b2f72c9aa0998461c24607a082711e40a5317db0eed55abef3aebc4984a3f7b7fc545b92a7dd1278c4acf9c98fe260ced69d5b592a8d96a13bd0d79b9345bef6b65dfba3e38d06d43f443dca6a31ff2a6d730fd51956e610a030364e2f9b6176d376c34d2df8c3dd1880aba1c7bf0846954024e3f55330701cf330811cfd386c701ae954425c09b2d0410e1f1f0ba0378247b67ab4811ba3ca3c6c401b8f7e13f7c7f84ee8303d8be674ba20ee059db8dbcdc755e7efe244fd7cfaecd1bb1e8e689b79bc4c4a14f95d46cec51b1cf9f8afd972faf3f0c73df6254863c5b983ec7d62c327bfaa4eacc5e1f1cc87eb2f1186d43f4f47c446c8144dc26db8e7eedd71aba3e38acf2634a22b7034a60c9b24f62bb511fba59095c3d1525d836b6a4b4d2598a064c69f394be7a6308bb198cb6b1ad573f71bd2c8f8e8e2dc8c114aa40bb5b3b4c7fb169d3d8fd03d4999cb736c2c097180211c096798b2f2faaa2d0e5ee0809a58f7d9ce979b2f548f76c9ab46ad2dbaed4f14689a01b75853427eb07c7f9a86ae951ef08527f44406a52eaaf559817aaa8428988dbb4ae1369dd5645c6619b48c46118866118866118866118866118866118761a18861dc3308c7b87615a08c3300cc3b4e7ee9a1589ae71ef445ed78832fa0e6d9762ecced59ce9af3e878c98e322e5445ab755b1659c26ea300cc330ac13695cc6651af76ccbba532e520ea394d28ccb44775ebbbdc2f5d304300573f29ca119b76d1bb66ddbb67130a55128608aeb38ca715c96651dc61da3931389b663f1fac6615748240a6d9717d98eebbcdc9d8bd73b168ce32e6e0b89421bc7710f7122961c48cce8f4c4253743fa476655c466db2e692fd2ba1869e468c63de344527471258efbc65ddbc569228ee3b84b3e73979776ceeb44f4da9d37e9b24c7b96755ad699d8ee59a6bde3606af39a8029ee0b1cc7711cc7691cc769a39393d1762bd63a1187492903b98473d703bf4b9133944378195d93b823a20b3d79191dc26cce6cb63aedded0e6a5b52579bbfb91ee842d725e12495aa019d972464a29a5cfc949cfaa46a18bbc0d29a5541d216564014528200aa6b8ac1de527a413a0a7a4909e4d482c8e748ec49148a4c3c78dc78937516efba347b9a53c357666ac3e141414f991fc487e848282f2f94c84f2e984ee9a1ca76917dade41a16f1d1414945ea1a0a078a49164b56cb5ec69e9d3f267fbc99538eb349dce445288e461b57a7c7e465fe880500efb1b01a1dc56f547475dd78de0c99558db70f4b0fdd1fe7090bc11151dca471e4a9ce90fb669341a8d46a3e76f0be548a3d588ad6a95c454cec89a2c6580a5f7d0c6437e34338229b8437aa38fec49cfe855af5650d25caf7d42b94d47ca2b38cb99cc723d4b212737b4973009ca6c8576722bc6217106604ba4913893d86c510601d63c49d3aa0e0144ad80a9d7afb831ab4f4969957679d08b34fd71f49d4c9c81403c361dd9489ba7db3a9d938db4d105623109499be89358253298eaf818e9d991a816d2a6f8d24d4097222522ed032805a6275eafc6d04198baa8dc69545b9e8e556af550397342ba10e74c49236782f27c648d2e8fe25956775b051373611b2d0391f040243c10098f49ab72ab64103d648da4f1e40c8e58cef44965f41f13e7865119793b3e3cf29858d13e4814191a954ad5aa56f1306129a43ffa09d4e556c55013e0baf140f9ec134cc75cdb0e94cf9ff4d09ec4db074dc097d1e97ba78bf4a9eb55ebf489eb56af7a1589c49645b9d3443bb914db38397d7742fb84f649d7755d86523fa2a2a3cf9155bd1e281f9d7c74227daa9e4abd7626569caa546fc78735cffb31250d8ac7048bd3936e06600bfdc9e502a61fdd292012247246a258789166856763837439259d0bc1f423d9118ea848e4893eb168f330005be8b31b711c0253212f08cc4b82d63b25900f5ec8204b9e3398be794a9f139318b266cf747777777777777777777777bf88fe111d234d545a2d0bd50b8bdac663a557e457de3112d5b6cbb2d6a69552ca4bcacb4a29e594f2c53117a16bd3070854d87ee55a4ab339258ecc19d209c154075319064c87dcaecc39256b6508c4d8cab78d47e9f3da2c7dce17b789b48ab8b8d2e6a64df413a6ec8f88b3c481a53b6d7f2da548ce66758bdb29b74bb759dc36b2e236ca6d24a4db3fb79334507ff426b795f417d44ba44ac2c8982b65e44c7f3457de2b6dda448f5d19a48790a193434e32f154e21c1cd1ddf4bd0d71d96aebd5439a4587aca86c02e3d01d56e2e4f46935630c8d3376c775fbebaaf59a332b5dd2190318c60086592a35a92b699a6422832cd9f230a19b2dd8425fdfb607f640177a966a67f4f0c4204c5bd5425dabaef01f06208af2d45aab0793d016a6af007ca9524429ae80eb8f80a9f97a09c0979a852c1cc1f5118029eff50e802f758a29a880eb8d58009402ae2f02a6eceb1100a180eb898029ecf543c026e07a21602af47a1df5396e4024e07a2060aa7b3d8646c0f53660cae4f53d1000d7f3005327afdfe105d7d78029d2eb7540e17a1a30557afd0d39e0fa19309542e382eb5be08ba5a91100ae37c1175b63531f03be589bfa0b5fec8d0c986af1fa0fa6545ecf02532e5e7f9882f1ea02bed820f529f0c5e2e4b0c0f528f0c5e6d49bc017bb5a81a9afbc9e04532f5edfc1d44887c3f51b7cb13a3bf5187cb13bf514be5821d085ee40177abddec254f6fbcaf25a493c6ad786b1a7ebdaf21b0aca215c2100011cc2979743c8030f87b0871e0ea10f3e1c420210e010dab07108313e843ffc70080b508043080410370ee18d200e6110380e218e439823870e03ec10e230371ee210ea38840638843b0ea1102c3ec433ed7ab7573b869dbba1936b52baa4a7dcd25bdc141757e530ae8bffc2f8ca3dcbbd1fe2e6b823644767958313e4c6a68666462606c6aa960429014a324516a428759d94a2a9900e4317b13cbc544b302d4524768486ee5ad19dfea84ae83fa6901045127b248bc55d218b5dd7b5e24216bbaeebbae8cfa43ff4e7fba4b447e8cece8ea43bd044a91020eaf291267aba02a542090a9d12b08f11e80e15d22715cc7a96c5ca624f07d99e1b07983e0635d63598f64d9da13109a65109a68f5480295a730270fada7dd50ead645dd9ba42398bb39891a80e9239f185ea449799d6a939978fbc56f53e2f95baae2f1f4ce7f4325565521be20a71775c035c1d37c7c571b30d82e983b8372e10b700f7878baf8d4b80ebc3ede1f2705fae006eae40b926c9758a5cb350a5c061719fc5fd21e3e619054cdf72f39c02a61fc0cdb30a98dee5e61905a69f71f3c402a6bfe1e63905a6c7e1e6d9054c9fc3cdb30a4c4fe3e619064cafc3cd930c98fe74f33c03a647dd4c4380e96bdc4c4780e977b8999a00d3a76ea629c0f4a69b290b30fd77337d01a6b7e1662a034c0f801be366ba04a6afe1668a039a03ba034cbb864f5cc3cd33f64813bdec913d16539df872ad74303ddd017ca94992f02007a6660ee04b0502d2010e4c7938802f5589122682c094b6047ca9414137b881294b03f852972cb1810d4c6132802f56a59a410d4c855e005f2c0c4c0c68608a63017cb131312e9881a92e05f0c5cac8ac4006a64c4c005feccc0c0a6260ea6404f0c5d2d09400d3531898229d9e8600bed89ae8424f4580e9a90aa64a67802fd6860cf0c5de8401bed82055c0178bb304a6524e3f8360aac5e9a712980a99d0a8b40b584b9320648846440000000a8315000030140c058482d198244c84d10f14000e7fa2545c501c094549122421848831c60000000000000000009021d2009935ee68e3a5dd2d415c524314a39622baae4f0a44a789ce9649538c17628a108769a732d4aafe3d1eb571502f394f7f8d4fb6dd5124dac52fafa7ffa5b970e6ce8562d457d350502c6cace0865b3cc8816595caf644f9b348d174a180dec825435922f1596cbabd0986e9e8c9a48a4f0114b6d202140328e8bebf08aecb587b4f6aa2210a7ad6ab8b0982cb74cbff1bf750fbd0d94f0b403d196d9d79a6e62dde24f9673a984192f2271ba3b71d1c45443cfe9a06c19d3362b4e126b7390e20906ac70cc00766e18972daf06c42f6275fdd242a95d6832b1ff61fae2864e3bd5328d0b61f1e4e5e2508c2fdff5f324b01dafb835733a440c646bc0ceb1736dc7a1d624254e0dd8c65fcef352619cdb2df4de2c026fe4b9894da6d5a738a4a10bf3f906abfd905044875d9499cecff56c54280a98ac997de738021c11df5f35d7a74ccafbc4ff2dadee8553911de83da2b91792cd47395a6e8f4e688db33fe79ef4042ac36267333f41cd2c73300fa91f9e9c1d0cee90956867afa827fdbe2577a76ae0fa5d90c7f71ce5ab9666094cdfc5aa9842e8dfbca1209aa465a32062ae8a582794f66336a7d3f728b973c0938ebb06e4ef68fe32d81bb3fd54bbe86a1d43fa65b08032da8695d8d1f3baa0057f31f7877da1c311c4f6ceca177704f7ae14016022d8aea5a9b8d4a8960c4473f20ce70ea1115a9f456c4dbbfd4b56e9f9804809bf2bd858c39bf25233e90736e9999b1bf7dda67b86df47ce9aff22f7e9a5ec289c0239d165fab05cbc41b43e05bf3485a83319df692f69635cbfcb8e92b8e90be12ff43b1f0a6542849a26b4ad6211119120f8f354b2b30a6e030c9b4c18ec89637c930acdfacf6473b8aa849f98b98b4906c335369e11aef2f2d2d30557d83c41eef7d719825a62144ff8c84c2a7cb4fba8d8bfefaa485f9d569e28fa05e19f745f8ac40245142f02375eec90d910a42beea34b170428e644e2494b28767910367265040487dd642ccbe767186851cc487326217a240260092444bb28a26b122a358257cdac36018e8f29010cb158163229d53f7120288fdc6baf181e8d26680fc237ad9c76a1438805925310836d820ac8d0f9ed52585b91de29f1d8a2b9a2afd8e9bdc6026d4f48c8d3ab15c540c5cd30a232352a59434229577d6068e689a350411bc0e172ca3eff7d0922560c120c830a7a1122b1163f98aaa852240750b6992f95bce421161e0e6121c0e7a7df472f18d77c1e9b02ae920890d101580ef0ec743faa7d76dc100d70670e96a012e52b537d20b6e47c2a34b8fe6ffad878a1853b08bdf0bd82ef4875dab310bb677d09f575b985462b0f4f1408b0c18bf5ce7e8ad07317d6abd2cce57c644c61968750be4fa9aba51440490998ce1f28c9838d6a5688ec5a003846b312f618e04d2f8dc04192f6765db7a3ffb1948521e5136dc32b0da38cc1bc3cc625491fbcec0020e988a1bc2518c07e59f1149132ce70c283005675069371724d8daf0f48889a0f23d4c9ce32084c7d4da755c4a179031537aa2334f70373c5cb1e7f9ecc3c613558529d86d8ce262d47d78e70f52bc5076ced6777cc211b9bf23459a43041e947bb61df8367da7f28cf6c87aea92daf6b81a988b69bac349c2bc474a4c411a02e7200ba009854af6d483c03a6088e601d252167f0be8589947237261f4fd2b0b286f47680da01397e72d0357e2f2bb1eecad72448a53589a77ac893242134727d0aa18d8f4d8bc53ccd6847c5cc0be595acecc630e6262de5d8a6b5327a9b9c20f5013b161013009d2404823a95dd34450609e14a1778b5d0b4ea82d7f2bd89bdff20afd438f1b19081fa9e013b497714e6a517c05e73c50457ef0e1d041b76f32d3f10453f8d7682eb96cee91b432680ed35071799746fd16dcb0f2a3e0978a1e78d10f61473da2414ca5fbc38b84f985ebce2789d54c821b7e491adc646b0d4ff26c8b9b006229417f8a96f07b20c6011e4b4323ad01eaec258209c43b19f14550d990a6b17a29184ecb541378c7a6d76c7adca47ad1b62c8127f815548368211064eb95cef704421ad8a044d0506a74986a6e129045ff33a35946909493d9af07654fb58b866f98f4251a7c8719646cffd341f6a563779dd885b7a85b105c2a4a948b376ddb38bbfb824195c701dcb1cc03363e87eb32dc8f8adfee569b8bf7dd40d8fd3b2f64dd64af77c9b32c975382c856fbf21b3d62bb4914d4f534a530951655f13aba8569da36ead6e1a46c1456233cb84bfa8edee26942c7bcccd2781ecbcb8971d623dab22588cf9ac825a9e8d4d9b0ed686fe2d2a7dd8b450b5d32d2567158350a77eed89a5bc61b405d346925c94240f7789923b187caf1e63dc1cc91ea118870fbea86c849a4fd7348a0862db8dbe73321d4998d09ab722799a69bad863d8194465cefd880f6b2a8ecb04a3463ce900f92f0000c7d0c1e44ab7c42928da722a43e28b1a66625d6d44505e9029817cc35cbc087dd21391dd5eb5b58944da5f1f5a27d5557ad3c3a0f5e99766a52129e83986add1f3d520b42bb86ca6727d7c268b504d24e78e707c43c0198881a366da242a7fd2a740cc6f04482cd0516f20231e1d592eca5b563d0a083b9549ad4698b72a5f2b478b022111fcac73f9270f855805ca78dcfac3872c5589e357ca5299d76b08c60d7d3699be56dc30871fcda893c813a6dccad1f4fde27c01eae9dab1e23acd9307b65a60410c10501c54df948d28786308181b3ee646106adaf5165a77628c72d01470b1700e4ed491df819d7b2551bc2941259f573228068b8e488c85a0185642e93198db9d4ffa8115743ed6b2ab5e0d70c180c6929b0535fbb0e87cc69c95ad830dc0a29505bdbc6d6741c08f6bf31d7c906dd1872a30bff1904b6af765d625afada5414365d36617f4a9cb2d5f05aff93d78e14d41459da08fea6067b1a43b03687ba1661490c3684b4670e47f69fa369dd7f84333e93f6a744e7c3b21b53ebc8d94590e15dcd43fc8c30a51848bb94d81b2053206d5acb0480b49b1ef36ebbc32bd025ffec74c9b543a3d62ad1c492fdec83b43d28fa473b8226e32163a173830f77b457ed30b09e9ed829f0663a61769d3c0072a05149b774760d3c4f363cce810928b1b2993c6edac755ac2775ee2921b83f16ec04b6d7f3396819d5dcf5bb460248d8b4ef728752c05027195238218969cc5aef3ac560652591519b5211a0c67722ef974b2a8027430d970fd193e39867798e76729387136a58ae1d941b3183e7079101bde52abadb5d1ce7382c75ddd25b0bf186e11a6c5bbc4a86737b5d95b5cb56db1434910b69bd72101b5e95df6a8844e17b1cb3bf02dd0c3dcd60468eb3990ca702a1604225faa083e94e44492fd0f092148f58925000038f1140b85221289c85493904151ad089301d927b11bb0f0a7065f53fa32d92b1c04e280085c1d4229c5182021d1cce6b335f28b0cb78cd42c1f73f284866a5c4f497fa2b0e78c71f71a97f18e91b8bd39d624cefa87e4952d0a1223d3219e9b357573132a3fd74453923349266ad0ea1468d4c8be0e0cb01ec888a44606ca4cf5e5dc5c88df6d313e58ce048326b3a44e81c554f277284da91c04c8e45a13cdab9a69e6cce2882cc43e20f98df59bf9a26c4c3a38a957d0bbd1261a95b9d1b84b194c0afc0c1a2bb61c0b33e9c4691adb1157600e259fbcccc498611574ec6b0662bdd4f4245667cfa03b01ba98a5ccbe105ac176530116179cddd8bb3bc0b6845192553e71407ba2e4852c0095cf4140b11aed62b764e2ba032a908c72b16227a9988e347ffcee03d0afbba3a256333180a710985223576649f90cea38b26565700ece266f2c5050185af6e4cabb8d0379eb93132cb7d365db208fcd22d56dfbd5f99cd9d0b951c35222229fcc525a65c8dd1c4761a51cdf347188e101f0537e46c3c9aec8f1f0a447c036aced9cd73c69f728e94b2415e1a2500cb8849cc3a4ccd26215baaa84e0cbcf8955e52229e1159cfacd5382e2756f997b83d1160f18fb45487306b6c0fbe5ccd28c7f09cc02384141e2850874772c3dce45ae5ef1282510e5ff192f4453a3f376b4eca66f7e7c83405ac829d7133ea19266b374a3df157548374c359b61f9b653558ae81f34311420512987c107ae1d6f4a652729ea7846627c3fc1b69feb632078904d96c841292ec7711b524dc90d42698530e0140744163c5a9900cf896abcd6a02cd0311689ac8213b34dcd558f7c2f9308712c8682c0f4ce73e8a4752fe9c1c90804c589909f77aed7f452ef7afd866dc2b1ede14432ff56ab3fa9e15cd8b115d6ded40605cb0b5a5a376c3e7a0854164688a6c17d230af8e1526ff99c854c60621eaf5ef21266289176b7a057720c3e0d6812e300a10cc5609440130a0ce8849da7149c07b1c2da0006a92b585eb63b1ac6d4baaac8d04891040784a02e60091d0e44c4fed03c187e44372a30431aabb19808ea07b80e0b6970c83389a33c2a414c6777aa69cf5a242185cb6cc9ef90713f4b887791d16d4850c5f0d9a9eb1fcd9f3fe1c4167a0f26d4d3b7223c873886e4829176313e17ce96881f2774b96f3790d27c68e459991547e5f41ec3c111e0a746930c6638365a126368fe498d6ab1189790223f142daf725cfa5b868659ddb8c2055d01b81a93e8277d391f7af1df9ae0e5424799941dd8388de0b114cf6bab7ea381f0ac0158cd2a8e5afbcd8d103dabe9cb92dcd890b9e6628307a9915c36a318b26eb310ef20426940dd98be6bce32bb6cdb057a376545a495a0a29aa7fd722370ebd0b1b63398cb49ae60d5e0899a153e03f5db09c0e91279292b469bb78cfb155d1ae678c3fefd56169f97c48c78f124d39250f83263a41c20848c4a3aeac2642513b959616a9b85caedcf07f7d8a04bce3f1243001272fc6552cec98a36f3368a03a4b9ee82ea5a056c43302c9d59d63d986161f13f30afff84b11deecc9d254cf52d45735e5838476a4ea8795d6aa7b6fd68a53f6926e7cb52bfa3a312e9ef8387d93403545894e255b288f1261240d58860637ec84f4285c6b98b493ed15553f0fe6dbde535e22e517b71073659467e344bde56b5395dea0cf13d10d32bef552259742e78b426b94aa5ade85c88b019fd8c3f4904fd708d6d3ef265b9df94cd59287258e4979dfa685d01dfbd60f165ea8f75e242f5e9dfb6422525f9846cbe74199da8ce15b1422af9b072e35f3458ff03cf32ef8ae97c90e0e1c434d6692c69ca084e133f529b821299bc0c216fb83c511c96f32f25b0ddd21eb29a4e6ea1f194f91caa57f30362d3557ffd0689a74ae7ec29692da76a72a633d59cbeae9bffecc5039ce30b3130b5f9805a888950028cc6366bba60dc099edb5b23bf4b2d1193e6ff5196eae6f354c23cff5f9971a36737d0383cd4337d509b796781cbc65d28cae593420f280aa76cc117b48ab3cba7553130456cc4f8882d6903f75e56e654adf083f3df38ee6ad3f11bd3ba4376cae6562b54909cc2c13d8c579ff0272373f2b47b2eee09ef61d2771b0cc7b81131735a07fcd7e02b1430fb01f3073f9e2de459dfead2e0e54dcbb0aedee0d9f021913fc111752d0a0354fb48bb7dd820bc1c106a14f6c19fdeb895e51d3efd6af2a1c70971ae232fa6ce9f9bff9fe696059bc7218c12256f3223f8b3acc23d20d168781942b453959cce45d82c4719fcd9096ad60a5a86c8eb90a7c266b45f20fb1553ed8f862aa41d7844694076d8b323550c604d8812145c1297238a16b1e6f869084461c6cde2904604615575a481f8f6a4d6b20a793f8122cbec725b253f98ab8c1c7d1ece278cefb1625f7b5d287589061060557443e10a4eac89d94fe2980b469995622393c27eec297a0c40da6edb15db0ce03b145061aa8a2e7d1808e51af409e20a1f22908d0e4cafb46ef9e1ab6ebf3cda7152d9c5c4c60fb22c464c1c7a26b15a9e2ccbf8528f7bead2b9f405998729a56decd54f20417fb92b5c43c4f599990a64e0d5425a07b84939c145cbf43870463fc818f23c3a89d69d7c496e7948fd8c8d29607d06a28af5270a2d4352f033cf5ca8c2464255086248c745284fefe27b9762f350b42d020307b19ec159e7aaf8bb55123fae5d0b95860704ed00aad0aace09acfc0b613a3183ba9ab3a6430548c50c3b29f43199923fb31b8b0b0d184651e49263b7205112d774d48c000c42145e99b20ee20a63b877f8883fda1712b8b704704ddc26e8c714f9736129492f71053e9e94dbc2049b2382480547b25c7151eacde717ca0cb10681ceec8556284fa4527b4bb2cb16c205e29629b153a1cffb09ea1eb6ffa06f55ac26713f630da47edc831be02b469d5a68f6d86f4d278888437a6deb0a7fb437edea83ca15da4e34d5ddbd54037751ed28dc54799873d2832eeac427d6cdc8ab45ee514f7abc3a04ad3f5e29e2c7a74e7e6a1e7025c55f0ac41be003a163170567a8f7d516bf1e4db8a5948487b341510a9519175297456617fabc071395db8418af2811554d93d47c00b436b7be9c5440ccbc2386f2c4287e5ff2a33f4b5f64c65de9bc5812e08361816683b1a40f1615af93d536d31269f8ef64e11b5d47e3a5b8d146b7c1b943c06018b7ac04bbd3195c8b6dfed076db78323d589d5d25695df9e9991f772ba6dd645131366a05126c9723a38d2454b4e2838cd4f2ce911d84c705d2b70fe91c331c8d6a895ceda8f6653e44e944dcebd55d05040856c7df30ec1955bc6d038f95be3b88ad13adeb2581ba25f7e9bdc76d6c756604f85d3bbc8762e57050493801531bc6c487d43d88f1053c8c9a1c1e75236369dd86b4ddf5298e0103234e7f1c16cbb0c3acfcc1980fe5d35fae0dbbbd1d66c640e8611486213eb7621f40abf10ea55935a875ca434314da4d90f640de9e702d060f76440dd558745bcc4ff0fe29c01bd33cb34e55d5e6b9d8b07b0f528e1d765fe3fb2f3b928bdcf7d8a46e7b38e41077ae387fff4da422b156b86978f110cf72986fb73b680c1de63a266b1500a8a4461674d5e5672b3b04d06bab6146774576f9ce977da039324aff67d7adc736538408db387010be672a9fd555fae371879418ae7188b5c3f8a4c734d05e15038a5e6a4ec60a945d756ed6c2a35b0baaeb52f2ab231e4d7659e898857425468fba3361cc3e92240ac8f27918277e4109a2858c8901b3748c2b30d24e03dfe23f18cf411f21ef7487976790428185a8baf67839f068275e90703d91f63f29f9cf0384e9dfec695ce07b7d1e11691963d3d742c1588029dd632cc50ac144b522d2fd3173c24917a09cc47e4a8b37d4347fea5475cf42e4839337f6b8da71af5c5b192cff4ee9fa98f556811f3bd2fe0667d51e063584bef172e20d26655a7ca468ee6d4c2f3cdc9854828fe431edc10001eee42d84a6d44e284c991d71f25a6e6ac1f97317e7e3086b8e894005b0ba866427fd2de916804fe0625cee34192040d5c8075125b38993d258884f27abf8b335c0a827293e6d59552384cbcaa726e60cd80a42305103214c9402da62314d727fd32d9d086aeda41ff26f5e3e14417c7720db9086f34d67d5ad2ef192c302ce96906ab9795fc2b837d544f095e4dc51b958261226a2f7081728b49558b6c8a4d7a6e3e4231be42232e61bba63c17be670decb92b2aa3591d65af7083d5914d93b1bebafbaeb6d51ca2d684d7f618c56d3534f17649f17b54443cde76941ed2f6973fb1296f0ecf1887f2506af1f494fea25b14cbdc73ea16ceca2282905f7ca481429c335205f9583b8d374cbd71bc84b692a9f224fdb92d8805a1937260bcfc68d7ec730a6d8c8502130568c6055bbf75d0ba2208c1d13d3a292ed8bcb1c42d8b4269bffa329953a7b4645e57a23b88bfa01403be6d0936652562b7d13519ff7bd4b424ca2dfe49e2d569dfbcbb67f0ad5934aa28038d8a50bf2eec0f41bfa3f394f7cfdbcffe99d2f4fb3dbbd5a54e0b9cc6c25a1944a5fd498b360c70d36ef9a8cc03b5f091cfa853063b87cfaf010e4c6f7e6645a21d49faa3791fb86f852e5bbe3379bfe9ad1e442530e26159f9ab1189ef029783e9b536ddb5c56c37ad1c18366bd528941c1c0e06fd988af82f8d55b34260afc3505ae30f0a503885d70102d36f237119a42999943895435e70cefeaf687bdf915fa1880ea4f4587faab535be72a9ec3b7769715a88b410e1a68e178e7188ac7209020584e39547ddb6a829ffad6860fc99f886d17c1997c7fff70425bcffa70ab279802255a837d8b671e83c4b55544d626b6043c5cec26945f6b311d7ba2c5337381eb4e1d891947eb267a6308ef91a3af6423e6f2f65f0a27fda0042b828cc17d4106b8458743798da6217e9834123891657630e23b1236ccba1cda78c63477053c98aee135c4e00e1e2a3596f9f3f74a35f08b3a3c12b49352b20327359c8db59a13c4c1f6147d574a6b69198957de9cb00323055d81a3627a0139e51175e20d9bec2d216fd5ca2b522db66b0bdcee64d926918fdd8e631bdabb160c5b9242369e13ef8e6e0cc55a2b381b444aee5596a0b831fb7b7844e59873ad663a0f0b3acc465496cf58ef44d002006b742de1f933725b104ec1e19ecc46299612801a4bb012d90a43d4e69460b550b994bd63e8429845937b7b31481349e5aa3484ea238023e2fa98fe229af97d004c707b7631ddfbee00f348fb8292888ce8a6e3463edefdc19c797299bd690e456cec7a9f8d8f6c1580ee9fe10196e95c750c564033ecc4d1811c6f6224028b687a917aa0e8b6d72e8db4d7fa787601eedffbe1ea993de766a7e81f8a010cbb5ae921d3194073c489db175dacb56a73f823e77a3281de3cf7d3babf2d283748aae164f25c0fca5c245476433ffb8ee087285484b69c208ff9471547444a72e33aed571c048130f0ff56c8a94f96e1aa9826552c1bbd5ca1b65ff7506fff5c72eaca8862eecd6bc3eaa286a9f3af2e5bc7ea966b9fd7e160f56a1c521cce6e7bca0720414fcd467c879bbbf50ea1009d1d95371c03aed4c8e7e5fb34a1b3e3b58db4595c172626177167eeec48c0d9178034ec4e9c3b6b73b3fd24b82002b6775a5873fe518b38c5187025577996b514a15460f2288cc3b948254120264db4735f637e2f737d2fede41284cc4137764614a6a2d3a655a3f2d2855c1ce4a1e27513ea94b604ac99f0d7cb7967d3d9b68c01c457d279822bce00a81b4cc1cee137350cfd4d957e4ac77e2a5648b0b0cc96144d7e4a0ae96a87cb6c612904e497911ba2a350eecfa5489f6c3f884960e1cc7d3abc310c5cfc1e52b124aa747f2f15af4ad65e881e72e7545c672025373bf9c1b10bcc1f21b9c46dfd108800501cdd3bd2715154b99282e27d5ead2ffa51bde0c58508340539adb1c96cee1689b980ffbe3c2c777e17ad34f3cb3f5caae82fbee6b5fdc7a3f0ab05e56655c25c0826610a3060458b8b94f3401b048f10c2eeb254871900ffb2604ee602095ba2fef4ce1437c000bd2dbda3b88f775f35695f2dbad0016dec049010d498ad67c6571ec09f940d89a71000b4890fe9fd6d09624c24391b021eaec971fac0fb614d3e3978a164558ccbd5c852319a525abd8e7a09d2b4568328b8d9bda8fa59b17cec6a8bb228d395f5e27cb32adc7a54fabadd0ee8ae1e0840e6bfc0f49450326013c4429805ba257509a70c191e3d7c0a3a1e10ac015a69cac9b65be2400fc74a98f7d21777716720a5b92dee6fe692caa8e9fbd3f58738a20a588f17e8723c7cebdff7538d7534053e9b02702c363ea8e96b614900ebe001ae3d2491726a9d72c5b0aa40ea300061a2c2f9348f204529153f1250a5a96047f7f3d025b363642f8734ab15c2006d4e06747733714b8e1a0fe7f874fe846b7aea5f014fb674f4b3128d223131c827f9a34e169135324d5f01484a0bbb0daa5e0b509a2df63570c4a87849c1b5ac727907393c69314f074ae6bc044acfb328d221f2129ac863df24a7d9d51f4b00da4039807b3af39503db21101ccff454052104c3065893598b316b0e5d45f06d0d45d3a3863400accc457f3b2a8c4ef0bc83f22e32eb4912831c928de74de6e1b8df443cc5d233dbff789581212d74c539f74b8aa71eba6627a64d42a4b328e209b6e34f6c3306241e143e21c14cd2bfb44620232e7e2fa05c54b2cbc158e096b8bfaf59d094588162545c9f15100ec7b32acb8f00ffbd42279695e463e9750b84f58a915c52755c1dd54bd5a62138b8179515b35eeef9da89c7554bbd8d2aa4bdd7917f904f921fe9e5dd9350fba68fd43904bb21b3a13cd2e74fc5dfa4e90a26941af615fff217e4919e8bc162e8b0c5fcb5bd8233a11a0dc57ce37890e6e04f1cf2c8418c66ffba568acd69526161d8a46547813908b831fd84664a834311a66558c1b37be5687e5412d9ed702d03681922cd03d8a73b08c727de3216c476d75f5afe566ec994b51e95991bc8a909b18de307dd2e3f830f7f22ec948a7a840048baceb591338e1a782f2fc812ab706aa829255d6e6eb7f6426e9a1782e013a1bc4fbcbb2b0fa922be9dfb88ee7c650b4914cb3aa6761872fb7e23caf446f51b4dc27a822f25db6cd19d10dbf43b14d306aae4b1dffc37edba209b7fb24949ff73088c025b01f37f07664c8c71161560eae39e13817b610597d8bf000bd12896a74d11e09590309fe0003ff738db315c0bbbbf3595eeb8669a7270d0d5d97a8d807070824eb5fc8d6a598db230c23d0e87c142b288ba3f202c30142a5c90db54cca0d244e87b1c66ce413715b535616cfffd455ae8e08336a1b13c0ca3babdd0c230b313ba47bad4f1fb3dc92da46ca29f49b82b6c8b8a1051141261750618bbb3bcddc74029efc806e982fdf3dd989dc368ab8f631448bf767517d6b5b8af15a205da2b028981cc0b143a00a7534e9cf2e25e9e53d8d7d9dc55cd63a96712cebece6b4572f90d667764fbf5c2e54bc927e5716e0eab855b14ee07f5e07c89326438d78b8c5cc57278c5bdb6f2844f05316589160d01f53faed09a7a039f424eb653290e82633ff3c30a95ea3b204b85992a02bb29727c2458ad1a0cb8aedeac8a77fac01c01c6cca2e7204f72679bd4c15ae551c0e4fb3ffa62601879fc3ea7aa4156ca097c74e70d71f46a9743e28a1327ce99b346ff0e41b2c7a192bad92fbc0ddbc4f4595325fa330e828b978845a2b3454c448b06614cea93c3181db61e18e45414da1b42597470525a57bc7a6d05befd09f0b16833433c70465831d2228ac97208af5701c57fd615108c127ba245693b4d65e97d47706c4a019b77ee57e80550052827ffcca86442145702171b1cf775bc13472cb485c03beb5090302808dc70ae1191e037eef721753887688915b7f86dfb559687b5889a15c4eeb5a6328cdb873b0a929ea8c87bf71d9d399c57aae1f849fdf9cbf9c65232e7842b9ec6db4c28baa94a45658d12d682117a752bf00c84db20da6e65535af7d3abcdd174062daee2caf7480b0a851a006000f0e2c2a7c74994849229d5e1646ed0412097dd67ad9087b458f39f78a326f7f64a715ef8775071fe7c147f9fd1bb703534b816f2cb02fcd9a5ea976363b81b94783f767b0f26970af7ca3fc33466f86424376e2dd400a9f1aea1d7d781dcf31c4daadb442d68b4b7f5c371ce5a32a16a1d1bf932bcbb654bf64cc5ad9e1b762ce19551fa4ea3effecd5550795f17b2cd3878a2bb442416590bdd9a8fa9a37dd0f74684d224e65f4f24aacd376ec97bb4e72d57b203bd3b1abdb79bf0c5aae6050efc438d5cae71b3cc1fca9f5aae3009e095ec80d212877279188b948c725403ce453bebf91119701052ac3c219fbb3bcdc521cb05a9b1e94c45018fec2a044eadf2b069c119eb7844aedbeeded89809d307219f455dc81831261435e65b5a7b962360f6c03e81c3e291ce7ad7fe81711be3b0dfad7346c12ec554fcd4a40add6013cf3a7178fd4474cdb4c9ca91e110563434204c29fc98c4309a6f1a55cf0cdcb482a5f55d95ba5d48f70a67a296d6c3edf83b24c379c656f7b019bc2c93af209e0bfcb5d3fd7e4160b8ef3d009b617dc3406aac99b1396b407cb1935d40809a842ad61c262dcc5b09d07c3abcbb0ad936de12c053e2886d0bcefceefc7f922b9d8bae046b2acc00c2086e9d4fb0cde007d78574b4a4a8519ce29dd629c66833db173edbc43a24e5715f577558226ab85b61580bbdab4dd3b18fd55f258210b62808b3a599e47ba404b773a28203a2bb1e6eb422678c19d78d1b5d7b8ed180a47821602756e0aa01c2508319ae90a2bd9cf85bb55ae444e2517cddd3c9cfcaf833dab6d97478caa6c839d83d512ac9673012132028f61667b24dc1eb9bc872977016ff8d82c70cc23e4e343e7c9170b02e0085af17ded2d91f93b278c2cdf34af3c17a5b6a37736ae17b0ac0345f6bd8525af5bbdb6ecbac7f1e2b3faf13dd8eb3d6f231b0885ba55b91a1dd9756a35bfc21c53a35f387f37674ef4b45cab675400370e72abb86d98c9d117a306dc6ec6c087c8b018f9f2e0e2f5f8881ced3451b0894196ff4104ffd2e6d8cb9261fb94e602f894d54bfd7f39e50224fd4871f1aa00b759a8f394dc6b54e59e64f3b666feb2c60279aefaef159fb1452c7fc60be0c2910c7dac03c395f0c10ed63ecc842e4870914b9757c2af7c2f615d8980d04e325f1128e06e243c296cd71d1c3106ecdb94b896744a1d521780d70e134885c40700e13657eb4f2b2af28a920224b9219538edc98bd3699997d242bd4eb9ad991cfee854892f947dbf2ebefc99bba1f0c069e5eee07f1afe65beeef99b931cd4d6e26a6b87e96b0c7a9a0a5f6e330c4183bd1ac22bcbe3ee08bef56d313dd939aea3684caec8685d181645d3369464039140f28c7b0e528ee2da1c1dbbe78ed7575da18968201a7cfb6e28b6d935d4a4191aeafabdabea2a14f7cf7c82ee5c5107c7cc404775da11728b14e0e96078d0af8a039e8218e4a3bc12e638a3fc1ad40fe4c8e5b431620980ff9388aefdcc477b2614689ff1464e3a9724731ad204a83f532c8d66b7c55b8e5644c10221892f9e4f8a7900c69f143984371a299a3a86bf7b34c6b45928f457e0391922a7501aa3029012ebbc07f118a975406d02e6c6462358a267dbc8e00b71fc067ced5110afbb977909efb112ef8d8e2916c344e1e9da62f27c22bd2b41120e5a2dcbf4536aef9f6d0b4870f8543624f222fea8a8570e8c1b07def6c8274f302d4b1f381f80cbc9a689f0e42fd4c0c250c46a2a6a3118f449f6a9b5c3c09f339b813c1e01bb35b0f37b653ecdb2f53238e4220d1238a5d0cb1c8c6833b7b2709843fbd016f05fb9a26b888b95cd0bcde7cff1549046742fc178df40a70b39c1b0e896cbcd66ec82f6364c36e598064bd0428c2333f5102acd146517cae8e12e7c74a612ae341a25cfbc0883fff37b7fe7e57b3ed3e8c224e88bc3c98d1f8fc1b56ff5644d50214d0b81914138a4dd748c0544987592032d4a6e2ba961aea4ad11121307d5a5deb40e1303aa0eb766c1ee1d24e5616b5dfa2a6bf3f53f324fa8cb47c32b53765d0e6858c4efca7ea62743d5241e4f4fe3124b14542d9f8def50c52096ba8f196a3588f673ee177bc3d3a63c7fca44a049404128b57432eaa74c093eb4346cc8bb46ab365ee4baf06e122af0b5d5ae23fd41c8f8c527a4fd7d6b54d0d46b7df0e08fbf75e1e625c65b1cedbd600e3eff93a247e1c2338e7a9f30841e3f648422ca6209cf8f9098ebef4829fd2c963f49a85b945afc6796a637f8e4d5e0fac9dc1e8d9d4b0cf627d946ce686b5420066cca24fb4354e5fac3e34f2771eac587b12f66c9845ff43424567da1c013844351342d0127fcdcf00dfdf992abd3d1fbb7860de52e85148490f88f30121646216607974e6ec2e68b48d635deb270969fa2b3d9512f09330234e9614674782b852ccd1f6eaeb9d6dfa058f88f245bf0a72284ac3780b323cda55311abdc6b7a38e3724c6da6c196192f96fdeb629ff7d119b54a01bf609b064846666d82648ce309f424ae2bc9f5b640cd24d36b69468ef4231ad175769e8b4271da9942c1cece6d4fbb6de0b5c5916002b6d0ffb03282a8225bd9786f54166b995fff368cfaab8c42a22de4d158b7863234af990312a9c1140f7e0289643b786309c67e64ceca117f2b29654a89d01b2b9df453f58098bf56bd1147acdda6e93840b72357614e379e831d2b78c80c8264fae12763f5bbec19b80d12c9997a38635517ea6837b9785ecd38179e1ae7a2cfcd1c5965e1eb8ed37246381704e5e40fc6c648e05e68631999677a206c2ba3db17e2722f1ae2d8785f923555b7e822ea66f4f07699a6cbe768a5665cc08f79684f39c3ee425a28435c3f8ac613fa0289a2f347438c483356d3cdbe8bd456ba80bf938019a58cc81aad69b6a71a7a6e18759d4b2f26cfb0a41277ed30f9185451cea0014b9a425f39d5499fb835c5a91e3f50792d1c5c486341a16f345d8d113193ac3d54358d3c33800ef25e547daf633d48cfb77b71f247c9489462ad17725a0cbcdc61a9e5edc787aa6f10a23d17237477435eefcc2b2c7047ba12915728e2c1841d075530ca2758ef9d17eacfde16f27566e8d7ef2ec5428c6ebbb063ec52004042849cd281f621d77f92f8cff440cd275d6ed0687aab3bdf629f8ff9ed8564ecf99bec673c0f70f4556380a8912d7a395b43d951508462da3f1268624ee85ebb37ec72af8305a272e58a7df6df41b8906bb03ff7f1c833903e9dabf4073f8c9444fa4c22dcca1674722396b58dac5530f732897587bd4e04e6fbb31388a8f54212d5a885d3a245d91fb1951d5da3db4cae3db87e7288b4c41453e61489fb8aaafb5a4e85069db38ebe43698c6c60e0a54d010d390626719eb4efb52a6cef54a592cc6af8b55fe0facd4e5b52fd8a13fad9a74b13b55e367bd89539dda2b3698a808db669f45a5de5bf6caef5b9f99f4443acc1bd193953b989dd04770043b14f8f8b7448c91b0ab1bd976c19b3233923dc1f464443af2868a578e5a5a94ace54d39fbd6bc9ce1a9211a1a47b9a0d365acf82954cd74db158297047fc3eced3d00c141bf909254e76a4b22e382e36b2d7c82742b491ca5393bc20d354f94d4484b26301e60cfeca69dcc7dc1ab3689d0dc73e0d24194459adb29460400830f4e15f4ac9937ff046ea939d2ad0e5545a9811133c98f3d774c432644e3970de19561d231238ce7a8af708d9c1b5cf1d10971ce3eee962a238b3089d2a49433dfe4b8eb0cad72922dc5b9f42e448aeb22042bfca0ca67d410d955bb6d11d7325b7043df7dc2d3d4a36e46b08bb74658c1589f80fb02bad66c851ab84acc2bc56ce5cede49be7835f97669cb368569ff82a057b2daf939e35e57a9fa184d5105c9bcfda4f4d55b94ae1cc5a1dc1811225ad146aa8fe27d36cb64c8f3ceb1627976f50ca335400f41b1caad407c6aa572916d67c1498b33e2f25c1680deea42fc87feac93463b9000c2ced8b19d111bca9b0980d115b6e7967f677e9076631132dff77b8ca459bfcdad859d4a14e7873ae3d38b369b0e2ef4e63f686bd506f3d9d8cfe8f3f8043720c7e1a9522a05c246b95a76535dfd56213e667922704390ed7b2161cedaef1844df24dd05eab2ebe8469985dd29d5bfe3fc06d7cd07cc75467079503835e25cb993b0ea8327d2103012469ee77d1bae704b67c7757f219c343530fbed929a0ce2a96193dcf4270807c2a3ec1fba04d3c2fc6944c7c1705c3115c8704845d70568d4c57b34ec33481f387a7ea9a44e3fa5896ee80d5ee5d172bc3a2652e37e401b496433e14c9d15baebaa3ad497791e36b9041dae98072b358a5c3396fb0c65e0663a72e414a38ce55cc22977d16634630eee784dd0eb22c61bdc9096fdd7f014559742a1be1c88c0c23320519a931c4b85105dda0b05e2bdee0e3d6bd1be2a497dd5060270382b817bc0bd8c50addb79cc8a741748355c81418e0432c815359529a404c5c39a278b6273600b435d705df0835b9ba55b32313c580f3ca235326062c976d9312033364f1e6c2208211c31cb78ca8f190af7c68c6a5b888eee11108511619855c021a8331b6dcdefe5ffddf04173e831475721616bede51a5fd50d39a603e04065454035cd16a11d7dd4602eb279750356c81b561e6a29a0b3b42609370642bda436aeb08d25956324e1c0d5a264d7b7d7c538f753997977233f10d6d632a497dabba4606b26320aec1727d40db77572c0b09fc124abc5d855324e0deb13d19d211f8d5d20dca1ad62dab2e3d965ecf5a30e3bb26dc81085317c054e66abf74e63c585ef213ad2cbb5ce9831cd13f8643ac43af9813d3566a016d3764773d63c94fcab48b0092eb2923697d4cb2fd87360919a0793ae27e914f10e7e878974a561a87367106451cf0ae9f0d16812c22d8ab8c584a4e0cbda261a0591fefee0aeeb5e45aa3fbfc22341e82cb967448ef163592bc0dc9867f6c399307a8c4b1ba4d60e23a95c722ad91d54b5c8c64bb01518201796ff5f2b19263b3310bfb75d5d833420e1a07a07f023237dcfd413aa1c57af41ae3f8b0981c0f6d5b1437423d076822f81cbd7340f30ab4fcb207613eb336423d0f0e8f884e46983fee0e0903a1825a7ef2f1abae70e818d40e6d2e9f0d2709115cff12baac8c9edb89b2365177b0f182af3cd946d69231943bd3f7dc4d0e5b32273ddfb7cdbefaf502b52a7b2ab78c5e14d1f388870412eb210a24d0c020e7dc611f7e18f87d3961572aad7914c383001a78756d8b86e6e2739f966d467c9eab1d2762fcc96aafff2056fbc44df4431203d57c4dcefad852aefd00370dbcb89b14507f80fe6f02f55d4f3144e36d6a98257de02ad1cdb7629bd2e787d9c5a4a3dacd7e83c8beffeefdc8b7c532fdd585e6e0d7c24fb595f711a857311e39d3abc5bb36c44fef3605fe0883b2d28097ec251fa53e504b54c32e23efb2456dffbbaf1bcb019add4394438f3a4704ad7d63f44b498fbd06a320c21c368e9cfede516147986755fcebc763923e34092e1e86fec0d17bb3627ec6ac0815db14a713c79ffa8364812ea0f1221413e44582dfc99610bd43c88bf546ed3e49f6a2893a127598b4a10a3bf678a2bbeb07c3d390c63abd68baf9d68534971edba5af5741c9f3f0c805dd3c5395883ede6261639f7130aced47f1c822560f637558aa12bc9cd7be5abcba289a6191ee2affe2eca3ea2278c945884ae51667ab2f8fd57b45aa55c74b743aae0650c23a9a419247856289f31277b4f413557ed2ffc284c77f15382b53642b13a0ccbae603ff70f01c687d49a0c5c568f597077219a366e917343ac020566cacb27a2945a5cec5ba17d6396b3f745439115307d8eec0a6067682acf2fd6b1d9bd6fbd71230777d703c3aace8ac97a1e601fbd7a2a8effb4bd2418714d23302f875cb9304b034148b0c77a5e08b99a4cab4e0f304ae9be497faef67c9e0c93370014345e29c27374beb46469af0fabdfd0b901a87c04106f6e5cf8a0a3b6df754a15cab42047a9da3006dfb37155cf201717d61ecf70bdccc3f0b09f47e0aad6bd405c57f9a8c0508b793663f6d98976f9df41dc190e63a8bce9f8d52eda457a66cdcd00aa9f94203626a7b4796147298951cdea20a522fe806519249321483ad6ad40bca2b55e699b7a50dc9d318eae2a95b6ea835a813828e957fbc764c632fc0f2627a7b1506c69d081494c6d1c066e91b30854c3b78575673efc3d8d3e8f8de4f483b67525d099d6be1163f514455cb919faf062a66ec8097568cba993a58f6ec79cf8be2160058a1e22ea95e52eb043ef6cbe41bdcbb533eaf230336f18ebf8a52064365e426fa30609b9dc80e4fd5d983e59278c41d6a2272721de12daa81d6f834234f4f7044002a39558ef4610ed12f0618972ffa2c639ad6508077acf8eb05c16691049b0fece5bad938c126480c59f5ca6e4516b519f714725b278ea876ace6f98c27f1b3577163b2e737aac3e271e32c5e7bbf11d6408f3add3d2f31f2f374893b719d3baa988fe4171b83c128f9a7adeadfd1b3ea2917df1156e69be567d62449f38ea253e1115492bbdfaf343516dc0da39bea707e7042645a027ffee6cd45250af9e040d32d5a38c561eebc1baa7bc89f84a97f3ff1e6b29f1817503fb5136797b29d2ec73337b293ad57328237ac2cfc4c11a99920314558a2794598e446c020a497a2123b8926cca543ffa874c30972982afbec7dda348bde8e2ea7c64bb842d3d6555cdec1992c24158ede7df186e8481e76f048c169c0bc3ca2b3270358a48c68e879e5f23e5122bb5f37a4d2927f3d73ca0ed0d0d06339c60f2c18ff916ee0cce66383390b68e879c05a192d4919970c45b686f3cd4221f1fcd0db77a24314fd1044bf0c8e3bbf73bfb3e08e257f282d1896e991374c09d5bd86c5f55e3648bf9f3999b38047012c228cf04be0ac137df0b58eb025c400f41564d02d1dd09e3fdb85a5a62df43b33a93cc5a32428e741deef786b589f9ed887521227246d3daf1d1498a0a2e9e6d9e564097cb247ee2f429a620c21f70197b8a70de030e4872a13d5f270861073d32677ebf481ae0b3c1ccf5e34d7ec047b7189349978cf39db785ed6daa84fe6709597a9a904ca613b2ea8ab5ab56b3c97c012743e9cf6dca460ac5d6f4b02d33939e0974555ec201fb2ea03bccd08bf4159ca450e4082b055b708a4e587f698f199276aa690378963f95c5ebb1f9afe020d30e92382229200ca0868c75134df163d70418a99afb51c65305ec30894021e9c392d91f41af001f0ae26f5e8f9cdad52dfdd67378a5abf2ba95eea28372f004297f1816a68610e99903bd529e091ac772b33b0ea0060179c2a4af0f827cf9510689a1d6548c1faf92b36b2e3754448ac0a521142bac1a6db3026c1213368cf6d3363c6043c932ff41b7e4ad3465df4377117aec54abb9bdd70bb81910d2115b59a6210ca4cf85213c177aeb4eaff419412a2fbd3832d0de1f12f9c856877cf86e246da05a43ef4d829d8b111d0a12917699b70a8d085f8f2dcf9021fe0f15a879b26e00f3393fabf6cb6d7ea50bd3cfac18473dc4c053f4847e91f5a9af9dfa112520fcf10124c4109671d81e6de26a26da850cbb33c4ce03438e1308dc27682a9d5f08478349ca9995995dbdf19ae6e9163a4c2f4f124594531282f7e7048b149a5d1e3cc6e66eaac7020fcb1ebd324ae9ac9d1c955932149f940f385836ec8f880d59cc29c18fcac01df1d5a400c91e488c27c06053bee24658837856491ce3a29e7c7330caf4ca3e2f945032982049ca88ed94df5f571d5a1c9ee88e2fcbf6940f0e2e620abdf6ff9cbd71bbd326de286dc88fdb90460ec7829c058780980b1f0520063e1a50063c14b00c68297008c052f95edb6d3506f10eac1504f10eac5502f08f5c2502f08f5c0500f08f5c250ef07f55ca8d707f55ea82721adb7d4b6033a9ee9e995b92ebcde0146cc3e2ca6dfd53a6ea108eb82db17f9abaaa715c202a0d646633a33fb33d36d5806a8a5bf39dff176d058c5d4f8dfb9e2e84c623343a099cde63b51000d9f42857646fad299581136bf5a664ddd985acb56cdd8b4cd526d71754b4016c223947105839b5c4bd98454a85ceb6e5b40dde3b6f3aa2d54acdcf853da072dc59fce1d0a1bd64682a311a88bca24bd73b1947624faab6f91d88c6fa200a244cb48da3baf9334d169c8e25263a73ec99e401609c6f4400770277bd2cc98666096a2cba6e556f2c16296ab686bc6f9e2d223ae7d482b0bcba5101e342f7e660283109995dc04d40c5f98420c16c4872371051d6b358183e57745f905b2f4156b343496952fd31857d22138381feead78d80c80660b97954469eba7d948a8d6c6e18575a39e711112a1cf5b56b77cf0a2ad06d30007f72c86a2ae82f801f10afdbbf0b16adba756916130bc8618848c738a3541a9806716bf5e21e2632944f1a3870e9f89114fb19bd75614ef134a8258fcb5ee29bb428045d52794806070aae77e2e7dced8c964515e9fd438c4feefb34fa2e5342d0acf93bb44f048a4f8ea9b2679985bb79fc74a2f9a8393fa9d9551613eeab52ae6e2dd3305455a30ab82bcda3dcfded077714fcf5442d2a530096b7d845624f91a981e9897e4ac26e84b8a31d2e12964fe1af03ef054c9073ac1325c38e97bc44630dceb46a2d1d9e2a439fcaa794c0023368745ace7f331a09034541718cf98dd666202c14e7ea00423460a6bbc2c9f6114a8d961d5631e12489bd4fd512a861ada277d7ccbacca1933abacc1e8ac640625b68ba538389555987c4fa2536d290a1640d617c752dbfabc9c437c7bca2f77c6eb1ebd17fb64af50b0d4a94691d3ad9562c8426d3222de0aa123a86196706e6a0d731fabc60430984c1b4addc0c8f79686c65437efd82d29aa297172199a5150ec6905f3c5746ea8f072312909b9c5f412c4dc91a0db28a4b5593f534e927ba62729662009ba8d21d9cd7a36e584bc6c7a89627f49f0db4afb389d46789c2e132b24df16c669a658cd8bbc12145f735772274edaaa84dd490af3b9d302ae084a9fdf521693f7964fa7082e9f56e2c855fadc2d8430419d5c1841751aac92ef4904a573b0cc476ce9f6be902b7928ca8ed5c20f358ee23f541d1b114ca50f90311aa53069c90f0e758e861531d36bddc70ef5aaa5de0ad278c6bd82e551457bad7403a0f1d1a076e3c97b968c92423d2ae3d7c27d3b9fba9a3e7dad4964eacaaddaa3e5743930a8eef44988e1b74223194e2ca95eb0d95a433b1dbabb1154bd9486aa1137e2856e0a36572eb725f05c3ffc32a26603c9c3754ac18cb322eaeb849f482e39b4c68003dc485d017cafcbbe932eac76cad4ffa5f82372976f86bcb8affee73a7ddf8dff9973f034094f18e091040839870fb40592ad78c99fa07d043145f2f7db4664a3426aeabab606bacc403f741b8178fd92b9eedf9b9e7b1b164e84769d0603a1cc74d8868da66605147940ff298dce65ba366daa2276c5907bedc01879349da6c6add19f351043236a7a01106c4dab881d64b0c38bf54a4c140ef9eaaabfee57339db31a117cc4d434250734ba88e1b34291388b62fcb4287d56fc31e39fd9469ba851a3d26b3cbccfab2ec37983bac8215ebf84e71f76029978856580a2e7162284ce50629a55d8b7a0cc0c53842dbc37904d5a615e083c40e53c21098d535c1ec16a8601fcaa84d20c444f8ee50794f2d76cc5585c1aa59cc475b091059e1100a6d83742029d30c0f97610d18ad726b0f8442b5bb3dc227ba91b41f4ca012df4a9c00211a594bf158884893916f1b6072eb0f8a22d2fb55c27c3f41de1223c2731e9f6d8dd18d013d196ad0c8ce1d7184742a4d071d5c05fc5e7fa6db1010ff04d87a850f0c78162247ac5f71cc08b89ff1fecee111727a651f4a58c0bd786f14be389d513b204b4a3031acbfa8d5a3052ba4a0795c8d808f8a676a39a0ea36d5d6069be9a1a659a76132afbd067e53b8e255a75861e923dc9a3aa802c998f1d1f772f85941981ac37913effe6535e5532618b087034e8877d08878b4a542b6bc9de7bcb2da59429a56f09c00875080dd444c56988db0dc437fd466cd8400d4424b61aa83691d8ae06e2c17ebf1bc51617450c5e627600525205d8ef5862cb0049c04891035316658c80fd4e145bac30c0982289a231608c00fbbd28b60e0034c30c5c0801041210d84ed1c80661ca8411932131c3c58549746dd1c1a8092f5b8290c8ba497f7db2f10fa9b75f363646105cd7c3b041622bfbfaf37770abd3c13b05507db1b2bb52fec71f7213f55847ba5799ecf6dcd3c756d15bc5f83e1d141fe5f9b42bb2fcfba5df4deb56fc28a7153f8ab5ef91bde74385bd1edaa33c1fcdeb89aca62b351dfd39f80a51f18dbf0cbee9c7fee3735bb7695dd6ad7a685ed6ad7ad4d823f93f121ca41e4e6471d71ff7e9b4b18d3be82e669cd8c29e9f5f27b6b2e7dfb0ae411a860deb65b6b1953dadbc53713c1b59b46ab17ef9d6cfbe7a2bf93ed94baf47f5e1893f60d6e1ace46bff03eaaca4b7ca40f6f57b64ef43457a3dea6b9e8f8daccce3f803fe800c561c3d35b2289821b1966fe4cbe01bf991257fdae5105362b4db394a39aa3d337dabaa791bcfe11e5563f328a3631fc91da348f8694254e40b1b94a0d2c50ad0bb6cc895d135a3421f20dca5f9beb653d16859d8fe99aef29771e1905b3fd6fe32adbdd067fe985fbf6786239b8da176ccea491453a1f467f5987a53fad4e3fce37752199bd6bf540f80680013e689202d9840c9040ec28861258a1dbc880294385cf9aa2daee44069f339ab00978faa58da82c535625d3e4a7add1497205af3431b2ef9b3694ff54e48e9d2e5ceb87cb4050837b4f921a7d6b40b6ef831b9211bdd704356b2e186ec54c30d3b6889d370c32e6a12868519dc2046e8052ac0f0af27e9c215a5a8c89126e094232bba24696252c20930e4d714202870d841910b3400b3f040b44318488864e00518b68b0349441431c31130bc7a00c3669282302c047184c88a1454c0b089aecfc0d3c506277830c209242c401f22f3430cbab84086226a083254460b186e004516a01f9716601801c50d4f44210401244c3d782992e505260f306102872c68f0c10f45a03f91d8c2401551c674f134c30fbe80fe73c48823782882a98821b08014e8411647e8d0840fc03801b69191ecd2e4062b5dc670810b182fb822c30f0db210420b2c9658f2830b8e5821b403201d4891e1051a6e40c5cf1136a8411733a8f2e4880989978a24861f22c0c8208b4b092d308851614b174f84b1820a254e27d0810920ae3c55e9c108060b0698a623305d9634614456f778f968cb13b78cf5cb475bb2dc50d562a3ef24bca50626303438a9d2841390715eb8f1df8931be6831a2450b17497001a3511249242191e4207e7d610b55058a1186252a181ac201891bb2803184129f323634b1444c9623b48cf991210c0d6030050d9ea878810b372ae1c21818c2240551a549484a0180281214450b84c670d1028f3283305878e143122830d418709eb86265871faae82283160470831648e981898b182e60a8aea41c6c488a52a40b0d6408fa2962ca172ab6a8f2c409c9d303a08461d4040c33400185052a8aaa6851c4c90cb25c89e14fe01ac2444e3d81e5eaaff221ac5475bf7fed8d3961e5e5a32d47b75f75848422bd256220c40e86e801134c700186768b119d240a2c522c71814415604c39da62658b95db9f12da56256c5a838c45e9e7d69ad51a99a8fc8b3660ed18e4f1cf867f91ae28edd7e1ad68d473828f214e6e2c235d48dc90bb1a0eaab8212fe1c0877b69e7c48e01c7731ac98d4037e4eeb6c42f1fe160ca0d6ddc48a9b7b2405ffa39fad2066bc7ccaa777a51b0e7f1f8d5bf18f46d13a54b24dbaa049fce8208d43efb217d3bb0ea1f4011e833802270fbecfbb24d88d34d20fbfe1f5b1808a354c5919425367801e8ffc5d64f0d8270c390162296380202b90b2d6c28a24c931b5870bad1c2eb87213078808516ccac2798dceff29116a7278a2e1f3d21e5de5c3ed272836b65700ba788890f4b3419028a31a05fa6ad4322b78fb4d4e0d26754c76e301d42fcd9859c14598c79747205d2154468978faea07205942b96a02e1f5d0134c7684d148c12985763608cb62132305034304bc0bc2037301c77f9e8cbd3fdd274438e8fbe80b9fd1cb769d94c6c12c6a6a3f3e9388bc6ec567947e0b617d6500420cc924fe3ca1559ee166d5cf9d1867f728b9527f08c3a7c239ddb07dfc8113cd9963f2488091840021ee16b20bc43df3d3156be0e0d1ccf8977d64f32e0cad9f2881736610b599c4b719ce31bfad273ee472fa5cf27f00d35c13ffa920b1b720dd441ade445c04997b674228b3efd11808047e8d121d0a78f02efd4a72dae3a357ad0a6366808b73f641cd0982fb38c976af65b9649ffe88e9ddff379277ec1e28924989248a27f83e25f7b162c2946e046116edf48d385b1f52351d49ebd50a5b29128ab9e7b7125ffe2e39001870c3172189924d0f6b2f45ba8ef975e3c27a97ed7ee0fe5f30f49546508192586ea80a8c847fd46933cc82e8274e264480343f2a52424d45c467ab95d378ccb3ac9c43fa125534848ab5c31e97231f18a4b9ec3e42d947c7532e90afbda38daf975cc5bc925f26b269e937d41c01340060b65efb7a3a03e26452594f74342f1af87a494b8f4d44e9c1851bd2465b9d24f234476647220fffa47d62f5ff27fd48f3ae01dec53a0915f5118888fc5c79eb3299e43d4914942914e86fe629d10bf615cfac23b60ba255f91d54a59442f3a8611bfc8576cc91e98d50fc4ed22e4d29547b2e9f6732829856ffaa512363ab9fd728ce784d2c97df54b25f9d471896ffa9d788ef456d887f286b1ca90e7446f85154928daf7526cf915ccead7a27e61c550c5234bb7b3c72251cc723b5ee9df2ce7499ea3e4395e1a47bc32ec2bb71dca9dd26dd446b42fc556cbc0acfeac46197669e936833d430c2bb3f89ed31b0d87736badb5d6adc61a51a84d98bd15850159a37c4dc6c85cdcf6c1ed316e370bb74d60827fd1e3a6f7c411c43fae85f8a60170fbc7b861679c619f3d5fcc3f7e8d0bdbd11881e7ac76d43b1f087651304f40c173e6f3fbe831ae4f2964e31fd7bf7d240a5ba8ca12ff8ae09d3e2216715d8f1eff421fc1a17408426d04ef68dfddb5db29d69a3941e9115aa843e8ed398792e56633df73b3cc9be97c7e4094a370c8d78ea0dee70744bdec5aa847d072b3ef2d37fbcd0bbd5febb2dccc0b7f886e08845ff7070ae28db202d4f38d3d280ff5598779a88e232bfbd8852c70dd88a1fea2ba233f2ea321a1202023455c20921af611b767c74d9791c0109de01f4f57fce19cd5049930c8902143260c32618821c698d84adc877f728b8d412cdb6750ef281c95c548f6197e1e8f281cdb6fb2d9674215eecc7b35b25802bfbde6ad7a66fcaa87f65c839b47a50451b68f22e3195cb5d70384faec519e0f959eccf36910f533ff03868ca567fb6d25a57c790b01425289493a794e992997621328123d7143ee6a43597870d9881bca3197cea04b5f7a90e784f4e966a9722997e9ee9ee101a53e7b1ea74f9ec34756bc2e7d5ac6731070e96fdd6a6e5ae7ca7ec633aa275bf5cb7800fcc675ae544fca5bf5d83ef59b479b228b7e6afb06b7e771aefb01b5ee07ecae870cefc807ae0b008fca9cf1d9cfa04e2534c87d83dcd32c76d558506cadda5b6540c6cff81266782a50e991bd36e355d05e86b7ea6750c633d82effe8cfe85a4647e9572e360cdb14e94b25f9924faef6224abeecd3bc5b6fd534deaafb859ae6693c9f19145994c7fb69ba9b463e5dda4f335d9776b7d7437b1acfa7e9d2d73ca91459f47d5e7209e3a217ffe8332d5d2a5ffe51395dbe4f259974a937e6ea11dc93af0ec108efb427a168148e9e0c89c566386ff3a250148a4ce29014ad63301215f14e9511158df8863ef5c2cec73ccb34e42f3979ce928ff1966472cc155b99275f95868d8d7c51d7a572c93fda83cf895625642a689f3d83d408cbcb677b158c64bf79ab12b4df7ef354d85e7b067db2df3c1b7b328fcaaa99dc76e21ffd68c4c4e52e0f722167e2432ee5255fd1e8a5b4d4e4f434030696d2efa196d2445dd4464d53ae6bf403d2cfba1f30be62548a2d06a904e9c726de698cfb897e002f9cb32ccbb22cdbb66de392a201dbb0502da152b61aa615c21fc7bfbec461e68648040c1c4ef5f75aad55a97062d7c5f8f243b212048b53bfa387f36df66e9b1702d1b99ac75529b62fdfea615e8843bde9498fbdf003c28ceba9221bdbcc086548680342edfcd8a5b0c2e5e7e771efd9715bdf816fe4c7ce79e81066c0c0869188281645a38825be624b82ed2f7fb9922f79933bf99393533fb9828498f00efdc2fac78e5e46f910df502f6c7ccb37fea10f195d232c2fa5a5a61662d2432d85a808051f4188b4ab83421c1c1d1e1d3d26cc808195523e57abfa8f777e40f94e1425835282f21d0bef745caa40d8840ca9d7573ceb675f02867de6a940a5077d2c7b15b0afde8a9fc1fa0cd6eebb2fb2a6fdcac5863a3d4098d743dfef7c629da523b2b82f8f6fed4d1d6c7cfff93e62cb4197d2a35c581e9fd1882af1ca720970598917d1dd9ab33d427b28cce01df742c03754476c5121e107ec892d8ded55ddd76c6cd178284416fd995a51d6722ad5f691977462061ccc3c1e9f39d8f992474041bdb57ef5e81676fe920df97543dbe3f56fbcd5ebf14fc809fed137c13f7aeb12d63f030cd6c8eaa6580b46d090ac3ff6137dcab069ef5587418b1add623f2d808cc1862d458ae75022ce721ccd0ca51c6737ce7a1f88349df46f86f3789c52fa1bad5cb5a9190cc33ec33a889b2966f5d7541bb150ca2ce3925c933e625387f3a7f8e7529aa82f87c5caaf282ec9767c75c4566d7f2c53ead8d0e1b941310e6b29b54833a2caec87f238c67595f8d1f8706a448deb6fdf53a4bfa66d5cb7c5fa18867d0ebe98b742fd0fece76328d98535ec9008d685327b9eb87dedd88a9b7543e28dde073a84ed7922d769dcb679ddf130741969072c8eb4430e98ca3faf517d4ef85346f97ee5184ed30288b2c5297f862ef6de2afb1f1e0070b0ef4dbb8cd98a4bbb21f14eef031d825f46452f361f0d177aa2a90aa51a950e55b4c0c3e0d4d601102eea76fb2fe1d4e828a050aab9210d2a8e6e4cc08df12d154c37beca0b1137feb770a30ebee0b4065004ba776c0fd3d522914989c5954739b8b2052319bb70c97142ca144da67092020b8e13e306658e74e5a4e472be237ae6a0030e644c91a1c3b6437fe516b51547474aa78ffd463bfa4d63e3cfafdcf2c7a8175a6969ee8fe9d5e8dd8f5cc1dd79f042926343563c09e3308ec0e18b2646923069f2039c17bc0a48806210a68b0bb05c01baeaeb0d37b4319a5074e3f0c4cb0c2cbc8a7882041855804185862d56b64cd12f5002d342449560ee42144e38d154268622a25c89010731aa789a620929ad83152f9a9142098dd2bd812a7610842e7030050c0f988ebca0c91330395822069dc30e3306da0d1d3536a158cdab543c93868ac5af610805492125981448ae5f77015c3e52e24289094b626320968f94a0dc8d866309d91a6b55aaafb1d5a323b26813a10ec39d524a5f629c450c46bca6e6520fe321f559eea4224438365038a1c947109f6e274ded6a25b49d87e784eca5c70f3d9c85bdd8d8aab576358a2ab2a41036e42b376ae8789c7f22bf227f68a6dc1ebdd57cbf31c61831cc8580300cc3300cc36a70347ab0218d1b3929b6477c1bbcc3b53ee1c2300cc3300cc3300cc3b24c5569955abd485603bbae048ab163e4c89da36f5fe61be937bac0860d4a4484c4628f011965ad14072a82b0e898bb7489611886c9465980053764414b8e33324a7d1e9f355e09034a29a594d2e6b854aa26078b8e28850d6d30cc07f67296655dedacccc16d2eb7ecf67629a594722251d9ef719825ffbfd8c26196e461960e1e3ded61903b29a59e9c55b65af99329f8dc89d1e0d863ee986398466bfd46e1d0300cab956ab4629562b57236a5ac19a552ce7965f3c765f527cab655af355419f3f211932bbebb5ff7e715b3bbbbbbbbbb7b747f77ef678f3146148e193d8e42dd9f7aecacdade423268b3dc4a41103100c2c9d093273500190b22264e3fe8c00661b000f233f357e6679e8d3da776d9c72edb72c88fdc86ca91d1c7ba39bb28dacbce939eb3fb4c48b9ba23b1b1cd36e3afa65701bff33989198c68a5865c2e5711908787094453e8b51925fde086aa1bd2482aba3c3d4679e3e790376a33b0218d1a3a9e13be8d8fad558f7e7e15d8a3fdd25bf5ac4a601558be8dadf656255015bc1a599e811f907a0c00193970581285dfc93de6e0370cc3300cc3301d3058ec439beb2b5cf951ca8f3364c1951fc3fe3c677a292f4afd185988ca90858f9c9072a58db8fd510cf5511442b7fdb6133989445024ddeef2111444178aa19b80cb475c88ee46d344b4206ce843de0af2f4a4c9c8d14469c8f4f1afff6fbb88bcc8699375259ee3edb22190d4b5fe35d74898d5ff42d7703b87db1d064c6ee82d5002442b462fe52917ac4cb5770b6088b961bfe0fa2fe0f2111857ee46439f6d50386188fc94edd1c32f9fdddd9de5c72e0556ba3e74f8d78df2c26a596cff957ba383fcfb3efa830d3b480913cf616623244337766c942468327137a4c18161c4f5b72a2636e4ee9544d890b3b1298913654e2a6c4d6f3590492a2277d880a8748cde1476b301a775fc7332505235fc739caa52d5a4ae6c4054e6277910fbaf46cda7ac945212f10163431bc5d890c78c1993f960c38e29bafea99a5594f90cca9746ce6503a2d2d308c73faf791dac8e57c33f7fcac586aadb9aef3f811a5f60f146758db3fc1b95f254214e05c28638dc6e713c27b4356c4a1ac52eeaa72c576dbe2b6c5863eb8657f9f24b11394c1172b95c43a064ff74d46099c61bde62231eff95877f1fd690aff40e5fd0b85ea3e3c65f6109440d632d6c0d16799134832dd7dfa59429445e0c553142beae4f3aa9036195e522c7f6deab78d1171b5a8d06369452bc0566f9cb40e482a2eb3b5cffa71bdaeb417cd34a91a539d9b0dafb72024a85c244e4cf4db161cd75e6be716ae8780e7b956514c19f4eb1a1a45b6ce8433e145bcd444a43a9404d11364ca554446036ca2fe6626417c1bf96b1d1b3f179fe4fd8f0ff6dba20bafe38dc146b8347c7fd3c377474a370d4e8d0e06460c3bffe36aa9a18788cd353edc6300cc3b018b17eea55ff38223e2e824b8d081b63d8e8bb1225ab55b1a107bd629ced45eb4112c885dc49c9f57725be248ca5ef5129b2fc9594a417f6d2127b61373579613bddd083321041eac557dd810d25d0757f09248338c9c4c7635c7fe73e2e94ae3f8d1a6ce4caf13185fdbe5d5c700125bec0ba932bf1b7453d73609dbb2c5c8ea60bdbcff1276fcf4024c816aeeb3fa44cfc240fca679bd09d9c888be04fd3c4a25c36e480780e75814b133db8fe9c3f8d17366427aac586ece4e43490b6074eae7faa66be9094ca45f08f39b0abfe557bf6fd3fdf4113535ce021085f38e54067862245be309283152d808ee362c454016a577cb609bf014e4e461fc793e5baf70ebfdd43befcf97ee31616e79b32b07fa1b0d5eb33abbdef3691dbeed1cbd64ed7fbbb87c418a347c44713c20e21c263987c3c27b4292d985c7f223c27a594522a258d5d8796888f7ffede902cdcbf72ed54c5d6a016840d3ba84c03794ee831f40ed7bfb358f22545369437e4f857fdfc2ee451b280728f78901476b30acb474d4637470e523c679391230726db96230728716bce8b922edf1c3818e139ac0418236e8e1ca0784ef41a8a4dc6d642c352babbbb7f75a7ed5e3a4666666ea3ad7ace2380a665bb91e95d7f44598005773ee6cdee8dca717f68f714f33554c32e149f19e8c6c7ba31b0e71b1aecaa79e2ef26fadc4bcdd45e70ee74eb2dc79ebddc6d722e27eae4524832a19ef2af5fa2b2a41b3ace8d4bd2975cfa5a7c72167d8a71dfdbf8b27213853945fa1cddf356d9cbf738c63f3a2fe745a72e445dfa1b165b3f3e8abe7c2a1570a9174a035cea8501e8fac6ce7629ff3ca859f4552a6b9b15d64bbf72313e0ece7b508fe0027b0cdca2791a4473430f1a400dd2e20c8aa63a2a76180a47c42686610588118b28ec1995cd176a878d6db6ec43958dd35049faa1ca86673f71aac264b96d6d0a73c9f927e7872afaaad86257f9f72ab255cf611a3454ce5e181fc503fb23d2b87f3d772d47581451faf488c9cba594fa4b97f28774e7f71cfa3a9e53a4fa9523b4778782dadf0d11d2bfe2dbce2db1a1bc7467b5c3bfbe90ecb70fb9efa76f7987fb91bd3feff00eea5358a1e6d2df505d5f7f7bb50e0133d77f66e6fed5ba091ce0fa1fe0007773a331da75b5ae6d70b36eb54302d75f0212b81b5700fbd55c9293fe0c4ddb8e9de5ac9fcb287fd9f96f5ba509e3a5ce8a1eb597ee1ced6a17d66d1b6a262dd441ef85acb4f42137b1d35319ca463a349c17aa7e4379969370b00f69b450de33e760afa5e0736bccba14e2ade147c48dbed7109676a2f3b12e0522d80d574801bbee777ed70990258c10d765c7558a2f4d03f7c5e8f217a2dbcf0dcdb87cf445c9edafad6463f7d706969caebccd1dd8b644661653e62e79b95e997bd950ceefe79c153daffd753d6218333373770824d5dddccad80e3284884fbbbc95d9eb939fb2a6c14aac9758b0fd95e9862de689c97b896a61fbc35ef29794229fe3529c75810db9eb3d85cc3b44be0c9429a594aa640dcad10eb3a719a5d9d3ff21bb5453ca5a131b72f487dc997a5bbb54a5ffa3fed651eefd5395d655053c9b7933cf5beda05fbf7af2621e10ee6a8d0df144694b29513c321b96d26b1f604f5615f05bc337d15bed90e1bc9253fddc9f6bc5441dd0607e285fd6e09bc6f1afa7acb4ab55560c8b1f4aebd1ddfdf34fd269e35f9df3a5bcaad40c17e8d70f2de785f5b9faacf2cf31b676722ee70cc0951e10ee46efb1327ebb6ff8fdf5b7eeb83adbbbbbdddbbb3dd9f2fdca78831a44bc40b8db4d5fab3757e39f77fb5b7f1fa29592931508297f72b3e32bb91b3d20366ebd406cdc9fab4493fdc092b1dfde33977798e6cad5aa02d88d5e1ff98089902b3de61b1bf732924b7136e684f1fbfb6d77a9f8de5e8da75ad6e9fbbcd1ab9185aedc5716599fce592765e736763f50106f1415d0d72ea37ac81eed728194513dd808a46136b69145a82e11e1777904f9618c31462143e48de25a95d0e0fc06a717c481f36d64f1afe2f75deda0b9f1696e9415cce85d66f39feb34f463cb41eca9b7c2aa8406e93748bd200ec43e488240f4935490d901a1fc09625e922334207d07fda3e3e8a11eb30378dccad07ad27d08133ab2c2e912e0f2d192ebba4731728c74924bb249325d5a2bfdd845a40e81fe36e5d0a52f87a410151961e19d8e4eab9e8c7e7c922e1924852413de7101e7c8177ff4a98ce252fadbe6f9acfa3fed7db6e79e0406df47b57d990ef7344f0283349e0fe7852a9d0932d8264416154202833d91455ff37c74287df63f20006eb00c6edeaa87163d2c23f5e0e5c6771a3a67b85846e18855ac7caea181c3bf31520f626ea87351d037ac61c3756a6cdca9fcebf8a567ff027da367c382e577cf55aa5a3d4f492143e8f54be34f1991909e10213d19427a5203d29320241ec440e2410c120f5e9078402a028907a2397932cb399f797af559b2f62133f3f6916e1f72dbb77971abdbb669744ec995e5632c3f52666fb563fe64b934e78c625c965b2bb1592e3f92104a97bd21fe7d3441965b5d461202c8e51c19cbe304203dcfb7b78d5a8cfefffff7783c886c8f1e1e4bb20081f1f8a1c7bf1efe7dffee3cbcd8a66536b689dd9362149b5bab6aa6516c5aff7a493fa77dca66af699a0f1cc76ddbd61c954dfac728742798105d9653aa3e5026edc43932d6041f443ca7bf9df8e72300e235932534f08d7ff5c186ac7447e03961d3703da71f051a6c77827f2838cbfffb7e0adb19d38d5b3f765a6c7f04620347ad31d68a55af659d95d6ea851846a754c91a1ad3f11c395f47c59cc7eadd70a983878f6125151bfee6b7cd093fe7cf9f3f650e1b86d9d4f0cfe3b4e1c8f228594a0ca02cc0821b7f7638383ceea82c8a36a69a3bf6eede5e587fd6fa655996cd39318f526a232bc6b8b5dcb6975b742a2a11d6bd4af95246effd6b1bdf227243b47c14df707cd3ef85f48640c06c6c13ce027867a7a433b061aa65fb872d3251314c097a24bdb0fd31c6e8b1c932d6826db9b4d5bba257bbf3f6ad48b6bbfa85edf8da95f34a548f8ecdf50ea5f6563bda5bede06e7bdcdd24e5563b9a7fee1681704054937657ef56b99a659b1443e9c7678eed7fa3779759f19970e2f22445c7c337f159cac8d1048b7f7ca992917f1c726477ddd9f17493255766feea85d5887f461d9e53b38861cf235be8eaf01cccc36ee8f074f817fb75f967171bb21195c10dcfc1e6ff2081c14d7b156c2f43ba5cdad355f57a6e0f3602354f1559b53e467bb0d20b712ea3a2a86e5f5967d3c6baa50aa3f3bff2b88b91bd718d3116d9c861f6a1f621fd10fb30cbb24fd3b48f2c4a29866136b2b8a5941cf7d326662ec1c02246ed47496f442d360462e3ce99f21cee43fa36c5a53c07f5f151280ef51887f2626da150f537ae4b598e31aa659e8a59281c34462c949807c4c69dd2fb2efc336c296fb5474ec5ae1490dbcf1d856281a46e4b95941248eab6ec62db9adeea393176d16bd7ccca52703bbb0d54933c485984f91a0a28b7cf4ccf09e90a6e4b16dc9eb7bb9d9bb56d6a6c5413bb5b944672da28d938d5d8aa552cc56c6c766083c598c5c6c6c6a6be7f2bb9aa4d66a3d96c36d795946abbdc15d4ae5a315a9988fae624e765ac562c93ce22d8125845a266d14b63a95d6435b6302c08db5f81d7362e950a63b1bb358db751d5d814f68e79416c6a5229add6ccdaaa52614e41f8c69f05db5ca5d8ac5aa6e9b0b98f2044624b887bdef8b90928788acb0f72ebe3b62122101dd0bed66fb06af59354b0d901f4b3aec1d6ea3bb882c7e3746e47973e12128cd451470707875267ca4777dae0a276f0d1f77d9ff4d8a9636036b609ddc726391f2dd41dd474c3ef32d20ddb4aaba518b9de431c8617d78338d6552b36ef839053cf83222bc9b61530ac5cff168a2d6767e931fe941ffe953fa4e743342015b9726f2e23b98c2e9291a21be21821bafe356c60562c231571ba17c77318a948d33d7a2a131b858148c27c3abd15090cba1ae004720d922011831460a000bd014e2083f3ddfbd8aac8f2e7892d1e6385a905268298c81085e58291153328e9214b10407f1c7f1d37a27419c908968b80cb48ae1d2e8e037887df2f3dd22015c92c6f47bd3a426af08db7aebf081c823bce5f36ca0193db1fe244974f9e9f2f938112046e5cc0d8ad4a88dfe54912b8022f71640b30be7b3e3488c0f800ae20b1e430058c1e9555f81383b08508f48ec18d866f68b31baa1034378862a90b4823837738b662113c44d1c208dcb69800113d14614d9677daf6f70d31241bd6dbd80c777cb28485fde9f27b0739b594a1cbef38646c3fbf382c5c801c5bf3434bc3bfb5abacb258f77d64bd0e8e7f383aa2f04496bf910991054a212cfd696f322fdbb56b543f44d6496cdd050b36a02c20d16560d0c553993b80cb476560b8f6f291184180810cbee197926ff8ab950d0636fc3b1f8511f800126488e770a89fdff3b135f3139c8f136fe8e09d662670732e7b4de33e85ae35aa2c27eb7397c20a29f4b6837156b6f47a66f04e7b24f0cd44e1908fc2d19cbc331d8314c5838b4b5e72fcdf96a27ec900b3268e46f5f0cd7cba039b63bbcc3758b3cf5cae1be2834864cdd7ba2040465051f08f8b9551f44756bf4b0bdad826649a64fdfb9d1de5aed264b0f4867f39e51f53b1d1706a83e52c0e540ebac5e8830db91a1ad795925e3afef1a7ac1147c6fac472fd99afcc4abda37fdf50ca395138704449677cea9e425f4f590c43e1e060b0eed59a659ab6711bc771adcd843fb7f20dff6ca6339a906dae727bf315df5f525e43af7eaaf6c53b3357ba4b7e3fd11b6c6399afea81c5420757528fcaa85f9f4bbad51289693721ca9957bd6d8aaf281459f2bfef5fa5b2363e262485a40db37f8b43d8ead130b6c7bf76706b8e3f82fcb54788a176f91b4b8f103d27ea109ae09dea79105be4a290fcc652edabbeaef426270a9d48f54464554e84c5891acb8ce74b91b5453e91f87dff2a55a4aa8bf23e730bc3e6ad99c7b6ecf9796ecc743a9115028d4f0111c52dcbc35b0d2475fc8b9a8c998679db6f9b6759966575fb79519c0fb5ce5951155551dc0fb3ce5a5173566ece592b6ad6ea0941cd396b9d28d49c9c17fedccaf5743cfc8b2f64b3562cab7566b3d69acd592bd6401d444687093eb4583ffb9a790d74846f80b0f148ed23bcc3f76e5a9655ed6bf651d3be661fb3aa659927a46ada57ede373d9c74cabdaf3b8c669805991c798107af061117590d451d3b4cfc157abb566ef2dbf629cb4b9fd61634c08cb4854cadcfb75afe2cf5c1957f2373d2e8754f5db08e9570254c40b7019894aa041a8144d5685490c15aa1901000000005314002028140c064462a15838205354ed0714800c89ae446c4c1bc9b320c7519431c61860880100000000003030303345007f6095a748364c84cb7353643c1220919b489886264b337c2ec6ef8a00e96cf314b74f528bc82142e436b0fa2a0c0bf2e060bbdf6d6634247d6840d70f9df439e1dc252ea06e9ce40761a93ab0b0fcb0321b448d02ed1a1104ce7b8c3b816529087b22c04554d01495235a933c73801212287a8e1038d59eaf5bd2ff95db3d55d5ca1c0784548d7d2b377993cbdf176af28ade620455bdb62db4de54597458678898e8bcfd005e31c85163edac7705e4a096d78096fc735209fc55a882f3b5d13c4fe808b4fa2c6bd00ddb455a121cc63e48d2f4589b5a5626397651b6a27ff4b036504f415f5cebcf47852df4c0d5379c7027498bb54dc1cb93c6de5edb1e66b1f0c1e98327fa368c7b11b44277ead2fe85e02963adf13d7a743933c94d78b1aa4421ae4d114ca97e5acaae824e1f63806c8936592863e2498464a916099eface0afbb7e1d0c23c3523d016122aa5f0e697a2e089bb6853f061162e9db6d09bfcd47d92ccf48eef8bede7cbf42caad2f1d09f4794f59d2ebec226e184802467a99194b539ae80cda45824321f4f243c44ea04c0605a6bbe55d942dfa8eaea0e02c979669efbfcf780c31e6faabccdc0983a86d884121c0b857e59f0d82d0946b05192d2aef28d5ac8283b9082432cef21b94150af4b5411a0b3e4da021b5d9d9368518f4a71143b485ecaeeb448b07049c4345c7b72146f6bb358bd7c7fa0ac8ab3ba7887e50337c99f669a419d14f53f8393c5ec48b45dbd7c8b0cf900441f17eac38cb4e535f962aa08006fc1571d8988509007a7a388f5473c3982d0ea81cbdb95864a262042c17c6a4f89072099ddd6b7d212b74f66efcb6f4c6b7fcf022bd910a4b5286ffa613f6871f928c91603f2f3277c4301e8cf598a82efd406c1213510a2f81f9ca35acad48a59cf449fe5478b229c8374edd35c1eddaea4867e665f7ddd0290b9cd8b0ca03c82e7b4acec968e5b4d826b611a970efcd904201d67eb59cc93172a4c9d17ab811d2f93eaf3f44786242a9175f91bbad7cea1610f8725c34002b4eaa1e9932579852da72734c716f968b9502f28cde95cbd116005fe366f7cd8070417ff11a78c716d77f966b59d6ecb3bc8b898d8dfe3333d7e2a302c35597576396d0b213f490f699b0517835959235470c51fe5336b3289ddd98d2ac091948310db7fc7a1a2e15d76bc81e079371791a2164d7514bb03fb999647e8abe98f1d81b8d9ba3ed1c72d8562a1d18b5bab7815c7935a60a680dd81066ad8801881ec12edbc86677fe656f9fce0408e3421a6f89b1700074e2ae1b8339437256ce3e3c514ade4c9a0549945118cb3fa48a3b44f1db9eab63f184f77322b696f6d8bf45412ace70e135cf9937eeedaab76d9b670ceb832f960d4d058c47d6f468620b8d6ad0457f0e35f5bf16ccf1db452d32d0219120d39cb5c52cb2a0c988acefa82fad45ab264b003dc8d2089c02b35f0e24a9b90f4932ed044893cb4a656242884ee00ade011c6b7ebda8514aa942c937093b32abe6688402f2e85962e6b759e4fef0d863d782b3994cd2d8808fc02b6ae3247a9095b01977fbbce2235ce6c4a7762efd03d4bf86da2798b9cdb3ddaa0becbae7eaa3431d217b0eb1d1aa2960b4095a119ef9c57b16aa452ca615727c7a08258eddab9d86dba72c1abf18e06734b917903b831a2fe859f0ad08e4cf49e82e27937b35d022e44e6388a538d4f1ec7822bf338af79f79f92a2bfbc0293a2e2e00b6bbe184a50967c2de0cf2d9c23a690bcb5c38c6dbbc2d66fefb2bffcaa92895a18a9739976af7c725572fe50514ff3ab7646c53d5bc03aaeea958bc27cbf3b4cba115ad0ccf050d654477e52bae8205edb434026495270a8998459a4055f15c6304204d8349f625b092baa845742cf1c6152c4808e6b3e9005a67dd95f798184c88474073e43f87b5dc188fc5540486fd63919cc571ae6b314102630a93e44a30dc72282073d85fa3217d8d0d5d9da42c8ea3990c9c5bb894d9b7db8926c77c68ab991e4df0e30512e68b2921f7459b61027cdce1484afc2a0031c5d50a187fe82b963bd8939b043f5b530383f8787d7ac0fd699c0f8eed666028da393ac41a10d076a0a600d7676bfe850bf05f72d46f6aa9ae91902a0627700c91ab8664d4d49850472e5b17ac684c094c4637873221df79e5050563deea8232f2c5c4bee87bfbf85bfbbaa9d34d4550ec43458fcf18404d2233b0f4d844ca3e102f85922b65c19f5d0f2ca7030fd0ec7c030315a6aa29848826829e8519ddb7bbcb40176423337e00fe14b2f85af79190465e747bf291e0d80b1fb6af031bf1e8272d91a277e3f9e8d6792098776967e4f7883dfaaec49307fd23d79ce0b668dbbb0d115490e840bb4dd03af59d6d5a4acaf5af8eafc15319edc47290e0e8ada04326a7e0da51716aeca610113681da9249965b88c515b5aae3343802ffe257e885f91c5a02aab6d7a81418311361e90ac6f41e5bddbbd2b7353346259111c25931b621003074c32604a6e8d2f8f270c30385b563345c57c91d0a6f5c3121547ce72f07107bbbe3a7167e99237bdb5be499ea7a8f5d0b66f33e995341650245186fc95b52564332cca6dbe21bc1bda4b5aab501392d10e2db442e38d9b1f73ccb4e104caf7dd79cbf29fb8559050cd2918b52ba36c5da94c8b349d95dc9e06a025ae6abea169ed8e0159a8217aa9570da6d457557bbe525136529b8208a49dc6d3092d245e008a1cd4ca993744109e62ca0ea839b65b191b45055860cb93516ce631316789d12b75604e58221df8f90e35333fe88b1a8b6fac72fc312191242f1ecf31d273894d152e79bce5aa1712c155c941270d0739dc819b9e401376c9d982462f5077c6ec3ab32d782083273c0398637a80933fe771f026b998d30e1aef8b1960b970f68612cfb15e5d14f0f29dd529ce27d1ff433b887e79ad928ce6db8ff5c2df7431ab94227e4c0bee58d610656b7de7b45abf8a805ea2a8bd01b949c887b311ed50f9fc4d8a7c76d5ffade9c4ee45ac2a061f78cb7b80ad10d2180c0501d7a361c8004d66ef413b62596e1f5930595ec8eb214b14e191b289a35f2e39149e77d455bfc3287ad155048d842859e46991e042d241272959444774242665d0cfca9438d8b48b97f9ec69164414f415b4b7d485e441f5019117813d4fb58b0973cf05e91ecd6165f236ac0cd6277d81d1771d82e872ceac74d2f19f97e90c150a2083ccb5ff62c8e84cd28a12f17e7fe1e90adadcef75be47d6717ac8b14f896b32fb6a67694b917cea067cb4c4b6cb019c9d58ad1f25d3196031871dc4216ce09a76b76712808004596341495315af0b1ee91e843bff500520d67bc1da35ab25e6a08451558f38802caa609ca60bda5fca627cc672d605ec7ee531fda2f8103338818530d2bd8dda9c78aa73ae621209260190401608af39486f31a2d62640df9582832ad6f65e48948bc653c6ce004f84ab0967ea7022bfd7ae40008e01a52f7af978bd9515c4717b0624abacae50f6c9f90abb93508393547b87e0884834a4431b1940b2af1e34eb2156635c252de095753d20d1436e987de36192bca9b3c0d349d72f9a431c847af382ef86b73a3571d8731c3b90512dcd23b0e2063f529ca4136da8504f355248e4ee1912a91e5d219a641aa25dde6f1af4db4c3554520e197f14ceb6a792b008d73e3778343280050bac2aa803a65ec9300ae8cb1868c196d0a5200127469080e6f8f94d7786151aa42343d52defe96e470488943020c2d5339a0670627040d4d906d0d2244d2789d88d47d2543131fedce11425830c10213c936b2e87a5566c0b7150d02b522bc40ea22f4b372dfa67bb84d03395a075db1322757a053ba12acba782101bd1c0428a10e79838ff4abfba055462e8bc59bbe062bafbd442ea0e1c321a9fb89eacbbc12b74f3edff384e2fcbb7df4215a056e1638008a81742e222bff93969ba49a1b7cc301d87c4031d52039d7c02725a238a09a5f188e92b08d5b39b54f814f4ece72a427676ab517c2884974f2501e0a61adec6f24a08d14e6c64403c2fd1c391463977af21d188c17a9d1d6647bf225e9d3027336d821ac3db1b9e1f308c2acbf6a41f6ad87534caf876582d9eadf789f922cbec59c1ff4d71aa1e72e8bc777e3a186c9224bfb8a2371e20524b468aa6e971ea0c5b44d546d95269a0fa3621298f7bc4628255922e2ed8a102c91f066f484222388df560f5579ed491805322ac84047c4ccac3d5616be90095688d9a1e5d0c018917ec9a326b8e48cd0727f7906aa6577204f79a744607a1a57d7d315b4e69a7f82cd9007a96ba26145c3314fa3fcfa53507e79395806ddd2454c13b91767fa59938154e42a946a34d94c882c1d45f259f0f6791e644c15abcdfd811a9b874a057ea5d191614827bb48226b9e9ee80fb9e8c667ae368a57644117e1d8334adb60b5e6d6f8854685fe5e0c3938e8a8aa459d8473a78106611527a01074b4eae43d068e09c899c5846e21996218778b8faaa75065a62f9e767d056071745822ec652fab06563229821d14b49e31949d36fc10bc11a8ab0b765738e0c832b018b82118de7ec6bc4ad9f4cfe3a6e1c5fbf1c0d94d8a7d7b68cf9a3e6f5678721e09a99412243fa1aba76dce1cc8f53a9306a88c8cf3f4368a8439604ab4969f93130e2429726fcf289155413929734a90752c1c3e9b5318915073a321a3074215fb19c2af0789efaefe9b0912ae9012769d053da4a98fe3291a039d8ff204da9d0207ceb5943a10c76a3224d5abdea1c01801a869d27e2ea5e5a2f4873304039d25735440c03f46155b1e9812eb832739c12fa31e9d7fcd50045265bc3d8499d07b43bb4009b506247751ae36cb6f3d51464037fad6946e3ac75fbc429b7e2008c259df29b4ab0dabd2278e67361e01395940143076e4e89b3471d0cd3c0d5467076c41bd7d811849c50a6215de8f42f5cc863c1461fc52be225538fa3de1a248e9c2406b5a975c721fe06a4012095251deb47cceb74634d0e8eb98af7eedb1ad5ae208ddde4a8b1ef08b932c92138a63dfbc5077e59b9f4ff7efdb27d310b6744fa64d4e5e2497736ca0369da74902bcd9d0bb02e7c8c1fcff3e72b5d17a412d10a4fa7b39286613935413d274258eb42ede819f2b92a1e8f05a655cdae10403a2b9dcd2253963b9c84438a8a418895465b4933b995382b9ca8ea27164604c3c5ea093547517034c075b14ee835ce36c3b2399d42f0f16d678492e47ce24cb4917ad12c2c0604e81946d586b0852da754c814e7c919e71fe0f55680161117f520a8a63f6defcff739ac9a5d6a2878fc324a50b85832df1472e3c266b78b9c40b91edae7f2c4ca292e1e12a0d26ecd4618d6ee437d040928316ffeb9954eeb66bd5aa784077bffb7d681f579872c12a58ee6e57019f546c554ccaf882e89c7b21d27dc98a8accbb337c60345239c3048e88c56588211972e2544aaf494618ca56e48b5745f4768e65ed4f10152ce69c82ac9ed1b282be0182bfe1bc268f9373d94e0f4d01957c6253e08f873a47369a373d32be74e0b544b67aa62b8f575ea3c106cb2276febc5ced671030548715fcd46784e69b024530268548905ab00b49adf0ff721c40333a35fdf114d5a845ed40dfaacfc871e2d5e5e5fcf160221f6bb06dfc0c8a4ba67fcaca2dd1d3a239cff2fb9a0f4c80992718395e7ad831de57b8a70fc356b80cc788bb0fa3c1aa0e4ac7dc64b325b3d3138945c3afd9186d9efed0bedf49e747e484e9b1c9bd1f95a32039d8e8a52dd153fbf892b0aad41e66426381f9599da0b51698b8d27f2d0af9719c95c1ecf7c2d332280b0208a2fd9d27425d84a038bef462e22c0315d15a37d3a399edc08aac26cb398c205216df2a0ed2185e0d179fee61e11fa8b3d58b65f2004388287a9575b421250fa4a04a3a6ed0dabdf4b046f49f4ff7ea4838c2030755119658e8a482c2c923816267861ca2df30b658599da007a85c40a9ec923ee1f1b778979c532da3c99a2207b29f6e29d92f6699269fed6c420de6c9da9709247a6354d8605813c874516bb28c7fccc35e299fa88ae88cd10cd63a37dc1607a4143eeee12828dbdc8f8504fe560e5b3be8f248fce5db1b4b9758dc6a5459fcb359e033fece2e0a7659269e0fc333094c1e2de2dc1ca0bda595b0a98741208fb831947c644601f5e00fb4e713e8b9c9af1e2d82e0e0420e7bfb1ae9358081299e8325af2b11eab0f57d5dc82bc302db577e60c0033698f82d8683b033abe6379e51a81049c097cc387417e8e07ad056fc29610ba3e2b06e079dfbfc2395f1b1211785ee79616ba0733398644ac3bcf66c9e58a44db1ba33c2eb49b9fe0d80a5c807b5580bbc875a68442cc0488bae7d377920e241e7ee4ea1320f8f52c0401a2faa83230030ba338e16366a5d024ce22d7e459446dbc29aa75c290bec91ce5896c8fd727cfdeb7ce3d6b4296de2c52203f6d956f4f5fb2786ed5685f5c5b8156fd80de539b5be43659beea079870ba227133a7aff20df255d9297971cd8bc490f1019a0dfbd2bda21e19fdd8d678e0002931db7614d523ea10222d854ec918c303644ef3ec20a08e68332ee4be1b3d855b43fb8d02f94748cf3142c96d1be81fa7749b85cba751e38e68fe40533edcb88cc9b30fcbf61ffaa8c5a3e20c1e2220bb791d9827f4719f9d7ad13af9eebd4555ae0ccf8fdd37b4dec912b78a84f05fcc87842ccaf64e5072c0dca4c2a968eb181cc26e05d8bf1ba2ab379849803e4bc6d1cc31452b6882a709cdd0c054a652cab3fdb6e3c7e64769f19738f091ab6437be6fec872251808dbac81e2c8cb7b05905c7064cf7d4da21c8ff1c3c4e78425efbe288a1ef26575fe0151aed1fd4702b35d11b6ae17ce10d9b3b3c0a47f158571fe0a0337c2207f6081fe3c128fdfc50dd19ed6a3fdaceede733ec0aaedb45bd135c373a298ada2164c16e674f34936747aa4f6ecc04051e4ca04b0dbcb004fb110614964b32689f00322bb0660d400303917f98e8f383763a2375f3eea19fdafff569bbac19029383e88c6484f987f37ca3dd690b7ed0e7a7e9fb74e332402540a691ce5f7623876693206ac02fb13b1914e475344ab7b37042f3e244c26d499fc62a68cb2a4a24d9cb57c610002be29bb646e5803fa58dd1a8230a606651e1894113ebe08b759915a2d8e15f4409eb582416469e5a600f4df9e6d0d342a72ed1fa33939f343e0cb9bf959b90abc62ac05daa886255efc956cbcd07092b4c84db5a2b45550507fc075da4a7c99811bb99e628c3a26113c7c61c8a2e63d6816426d034989a986d3ea5a23476b99662c182af51125c0949601f45fb93b1086b47e247f863f84e2dd5e06b96b4d1c8775685836c7956c88de88ecc5e501c0034055766525d9647d1e9ede27dfb49bf6388450ad68d417dc1696a30c05d67cb3a125a5e584e50f6842a65562c50c92f67fe1488c8bc88acc06e365596c90a72d791dfae1e547e5f9f26f3bd31f8262bc9aafc82e735db5670145fe225e692da16f44f074a101f4a25a602c8d168c3cd50e52595dad1555b80aecb4d9e02fada64d8d0e6729cca3447c27718ba24355d6cf8592ffca71ab80b204ca4ecc4bee6da8d5c3c8fc4aa7241f1b90fe960545bf26280c1decec5cadadd085d660f14a94ecb99842397c2037b0014ee474600028472f96acaba89f5d58df70faafad0398556914657502c8e0d0948919440952bb5d98cbf141a788d480eb66618477f9a42e2205b3a803eecb87b12d483d93625700eab2bf46dde5070312a95169c4aaa98043dc3518ee4eb0eaffd050d24235cac581a171902563221b081a14e24a7addd69b36ab56b685d511811e3fc440f57f3659e214f9d305b4e14003b9aa7292be31d6edc5317bce06abc1a34b3d060d091c6a075722f8942b9a95e729e10076ec2a6585fc871af0214845a9f16307daeb0442a9196c799908ef246042a8f15483a32cdd2eb0e14daa709260a7702c24f610b58575202a93f7d2d25e04c035e5e896d4d92ed6c507d02d01224c1a373a63e135b09162dcecfe981e0a39b94d3b15dc95ea9e2a76156ac74bb217c2632f837f005d5f1ae8a252937f137c330eea4c5b244ec91984f267cc8b2fec8b1af011399bd9f4f9086269b48aac07b51cf32a3c07ba1e6f3eac0e88bfe2eecd9107f6468fb9078b62bf9f174491ade9628d2be94826da3ac9f59a8375dbc474c59f27484772cbfa8b71e34f17c10a45d6bccbcd1d4c5c7f7d5a5506ca9694652f1af35384eee069b9d64785e1f695e3e5177ff4a4b4030c5831936d19ea9fcee983d813bdfd16bc8935d56f2c930eaad8864b622231ed3e0bf34ffe5c252733aa1ad804ffaf8234ab447aa59a2def21c81dc884d74d672ca1362a455d1aab4a8dab009fed188603a0136a389d79e89bf813cfd6a485d32899beba6361b0c7fcb350577602b852c9cd4bfae9f87a6322346a31c6dec5ef695cf3c86690dadfc78690026595e8e86fe1a84588fc1b60b190e84c1e81454a29b8082d1b6a7d2e43d889247aec4177ce94f47fe2482ef66994da678ef58b5c2c554409b642e3b7f6df6be24d586a0932dc74cdee6d40648272e69ac3ca1ca8200cd5ca9324bdef60c361b92b49ef12ef4b5a1637119b65c08bf27f248b31cff78f4e1306f7406816011fe68e704e145c731d17f31bfb2db3956ebc7a203ef35496c0ea7c110417b1185bd40b063205b2a2b31ca5807ff194e057579a47d5252e44934eab4ca22a3d5908c8b547833c4bf00cb9c7371bc054c01191d00eec4be838361c57730262401a2476116dfd63240a8f23c000498012f95b2fdfd50cdd8d0613f2af889cda2a9ceb714017339d1b94b175f6c293c439c8eae28136c69a1060050e383c57db6dceb1e3903399040a500ddd5505d1f151e51d011c27a7654eaf2cc2764f3111e19b573feb3418a7669c25d34151e30b084e181012fd384a6f9dc5c0dea4160272da4bb85bbe1d9cd723304e510608e37266cb8111c3b3cf202f81b672e76895ff39b2f2a090dd241d849a6a5cba1a4e581803fb01b80b70799d0b7a6a587191188ef40d6a9961642925f79557647c9cd687e23f9cd5fef1f09de1dcfa99f0afc988972b97bded53864cf7b414b0f32e477025020e72c2e715ed773730fc4b92539b6efa0b1877a629a4bfab8dc7847d29d5ff0824d31792543f2ef276b3c7a06aaab888d1bfbf61b40dc8b64e3147f735550d2d909f41cabfe541e3a9423b8dafe410e42b207f9141922db99c28aefc2b634e5997af16b28f6b5ba839d3f13689fcc8368e0f70671bc906a8498b7a97869543e543a0636c02642ff36d3ded8f48a18f7bac788f2b6f7aa6bbd0ad056942785258d1352337ebb376203a31667e5adb3ba442739fcea34221f2ba3c2ff50615e28a123d627e8f69cb1f28db839f6bbfbfde4a8f3ecf5b02d42f9d028d587a2322760dfa3140e4de644506b243d2a1a5ed7c56c723a46981ca84728d745e3421d75234c7349dc4960aceb267a42f6131974e39de398d1aaee4dc1073b369696384c2274521a5b4e585a269028a8ff2a1d3312a669f9327ec2038c4e8d44b5c4555d484135b33f1cf9b6091b37e91be18a858262db994379e6c348e744c3bc2039f9216384652d753cbcedab9655b2e8a1b2ad1d445c14ff05923a4ee483cce8474042d07720ca241342a71d8a48374b854051d22faf986671608bf4f9e5a1ef39cb7097204a1308f7b48ea45bd9df6803ee1a5e8f4ef0945e51680d50d3865b9922689b26b4c69f6a875d757aa9e5cc06e84d16859cd08a01b0407fd2c7efa6e030a01e15e711e527a703821e6ac7096356e8e360feb7136b992893ff333cdf55560f4432752872eba6e0351cfbd030d34c0680bd8ea8f1ef1a4e126d754bc0ac6b0b182be0bf59099f5bb87e5c9ae20b8a28618f9db50534875ff00443c4d95862e984dfcff4e8ffb489972ac65195c04816e6e555c3d9a55132d4fc76b0e27a8f6ecbcf7a456ded09207210ac080ffb4845343707282287cfddf3820ab956c6c03827134ee08843538005a3dcb2f6d549db39709dcd01aecb5d8d22ce7d59af4163c31ae97ff15d916e93ce4f9084074d0cdfaf32e549f5fe2cf6377f08c19b80aa4249a94f050f0d285a93eec8114d87ee396d89401a12a948bf86d2d2eb38a8686f183c593c2866e674480af874ee4206d9b2b994591618efab24d7b86e7d5b9b2266f151d9019c3da3213b10aa63857cb7cd08808ad085a2f4c2f92710c75f28bcd8bb3618625af55ef7afbe999fc8ec721820dbe8f0224c306dea9f619f48182427ced3193554f6d10c956a2f52f203284546f07032780b7b78b61960d047fbd350c44791e89758c0d61f04d87250b6a604dd8ffa4e287ac68556adcd7c37a53a05e6210d6f0db807ad2e24731e470539d43a210812a2f95f860df4a2666cadc85838a1d207431cc02a67662a0f5b616d495f43d3c839b787180eb3d912459230ccda95bcbe76116277b44c239f0be38d0c0ef51f579f36c978a6605e1640df393cb56bd17cff732c2a93ad666ab207c7333c8f325505fcb4b78fab7861cb19754438b5c81513b56f3f8e2e8b6165af95bf3331edef6d36c0577d93390ebb1efb67d4ffe5e47ed69e478fb86bbb20c1e1c584b4f1166408f875448149f0db82460aef838bb8e0c8912ff5f266c5ef88c0d420a0101dd72978de53ca8360f67809b40d880e01dc61a73f2303e580277bd4e855aa21a25208ca7c571bddf90c2893c981b401ac056e0b6b864275601268dffd804da2f095b3a09927fa03216c3995a60c0547bc6f745126540222b035a1be2254517ea4e8d344f755ecf4cb7b514df121a93e04c40fd722babd60ef8ad1f5d0cd1bf5bed85098557e7f14541af26682c416ab643e367455c771c2fc5b881958ad409b085699e38970e25a5a05f7cef3679178664ba7cdb48f9af3293f12963b80ba04b37d0fbaf23c0eda83d9161139672f2d8e5d5df919fcd18c9b26ea9d797f2a3e5bf9eb8fa00f4c80478fa43b25ed53bf27e44f879454c2d41fddfa44ff616a9d82ff93b30b3e546cc70f0b62e77539dfe6f4d1dd3af0697e9079f6a1bc192a245c7fa835ffa1472985c0d05bc5a27707f4d592467dbdcf4dc16f9d78727f501be445f0cf214be46ec43c8a1e55487a13d1d2c58efdc2993309e36d62891171a696746e91f66a37e89c0b30d2ffa38645eb2f2884200faf3450a5b91e7a07a69372e8058bfbad5306a9f8b1b12580111e1e5236cca443b6b47350cf11b5a04eaa73a528fef7030ffbb1a8e4b80305b2909e88404628957272ab89731052207d5b0a47a051c90314a7ae81b95f715126fef382f8ea8d872294ce6d490994cc950a9b25c3af48b67c2582ae5b297d431267eb4826c464f7b640fddf479067aa825b22ff67177b14cc32802802608c6300dc5380a9d5dba2740eac3b0ae7ace55671e2ed801eb839e989cfee95da2be225a7aa35616e97f3333e858495b3b12037bfc42d8e64cfce053e45948946fb3a86cf205361ce8b8faf0058dc1d6e72fe6f484300cb16af662cccbbc40c20b9b710e9f3e02192015e85c73af5a3303025336e77436a64a89592b2babd8648dff1eda5e48b96c88b48d60b5867b5afba38936d2ec88013767956a39491cc4ff80531b101ea801e1e869987c2f90bc6fe567ff5c20b34b1bfdf2541a4f6743de8ea4ee40c34580a47a64cf2c1cb4e3af0b3fa9a5afc561bcc0e8d27fdb144478aa610122c257cc132011a45a9c332710078c65d3c5f411516da0073c9fcd8eb470b1652a18e3082ac15eaafd1d3f0880bb46830957a58250666ac6de4023e4bed55262d663498c59cdfd4fd1cd5f3f0fd74d63f2878b085b3746ed9d3662fe5da43600fd8dfec4113482e0f47b78aae31573684b80ccc759aa20a1c4909d43d252bf6927fe7b0716d0e48c668e5ef369d6ca152f61ab912038ec8b8ab66b998964e36c84b4d688f90aef47fb839052593142087b28524c8698000eb333593936489a77d34289b6c76d932bd1ce01fab85b988458f89d0cf45489cff3521b3890fd5d269842f53a97ed543729d2cb677298d6dd8553daa4ba851cf43264946a0bce15397214422087fc2c23775c0da0e4cd05ec1385b42e5e625c4f6e7f4b43614d05ab2db597e5f942c33e569ee2a089b11f5915f2e38bc3df039252411c5d239e1bbe012cf03bb6bf72530248a71947bce038d64f45ea375c1caa8855b7a40a68746068a473c040200b478ff1570210349fc8f19f0929a3c906c1be6243ee9e6ff49cace47ef4697b9eb79bdf3649e30384037f0e40e3e2e8877ea40b03b90f77c3185f6d8428e22ba230db4f169cbebf0dfbe767da33aad069dd61341cc73e19b7e255a16ee748c00234f51ebe86ad0bb2504b922748e1378c75381c50f88bd45df6513811f3806dd2770ae54bfc77528c384147a802e29da5fd02c221a798d2219e6c42b8a421bdd09e472dcca14e1b793ce502cc46a2773aa91814eee65324b32ce8b23f41a3de215bc15085338158a325816582a80d34aa75844e5dd9d1cd1f3f23c18d191518dfe64b213a389f602858066fedc8abc5f091c0b629a8d5cf1c81071bfe5234eaa06c3dcbb36cf72daafd07c4ed781ff5b9ce1bcf7c25f0bbf0639cf1e9c32e66c4d0ae08f8ac72c8da9d6816b0a52f614b16520d6ebbb70bec08444e4c3fa21147fdc2814bfa628bee1c794a37dd15b1681f85404c3355ee4534053f03f7cc279a65befd8d61755ec8a8f8b7d75c9fb8f5dc3b9822356e9b8a3aca4fd76ef123cf50cc0c60b2dddf21aa6cca1b1692142bfda0f2b4d671f927b194524340b3730689431fc58bbba160e31ecad64dff3ee13931d12371022babe1283298f8cb7dbce061009095bd89dab11ab1364b11b31909bbdaf6a1871a8168b931be2f09d441c92367b03d101c00484a3a679b0c31371b8709dbae68329304243f03f31b2650ae605442e280adf8901c70d9e335547e59c36bea9f577135c21ecbff44af3996ae04b5f38024e4d87e912507673fda0c5449f4de17c5d217f7604e01a2c281e8ea04d714cc9501e2abf6ab94419052cbdb9b5abdebeb02f3589bf16cbd0aed2d2fb7716fd02f5c2ce7e30c2e065a43672c19170e4c3d6051857b7f284ad548134a57d7c368b18026732b514baea90e1bf78ad559b3a0ca9f963a2437e3d491a48b89f00f395061a6ffd89f43f8689d1935ec880fe12ba2aa28eba2e3bebbf1089407c9078ec64e0fcbd56513cfe55e52116b5347a3b947501cf916985b2ba7689292daa2f203a18f23ebbf78a9dec8186ac12ef49b31b31e7ae1b8e5ac13c04846a7d0593db3b6cb4b82115f492b4cf07469da68804dcc6e7072535a8b8d296f6a2a0b84d6a53f792226337f7228038bed1499c023ff40afd902cb42fadec882c7229a3bfefe4c3406d7135824d6713500dcaa3feb710b8ea413198f840243dcccbff814da47763553f47a821a1a09bfd635608426013a0430735754a480844c7dc1e72eb304bc259724c59b9bc365289b2af4ef04566f4bd7ba685454c589cd07900f865cbcac0a4286a5572bdb924907f6b504df18e7be4524a33728bec12a590436dd13693d5852d461b859da1a0b4f30b70c95a769e8987cd8ba9b12ac3127deb59fe7d9165fbc6db7d824b7a2687ea956d672c869cb1580fb91345d01813922893684e2ced0eca41920d3fd4b343e8e6c62e0b59dd3b79cd5fa322640e0a0f56d73ebdc0fbc75e5a55c495c91e58f00ee3722ac6525463ad290eaad6c446e97b39a19fd82011409d287d621a78e0566c7ba0b4b39dfde60361aca70386fe95516bcfe7a2ec7a04488b145679628fce382f0828359b8c0ff81559d046587df163ca72ae3ee7646299a6d00085095fb8319b8d75e43a0c0e6e38af01ef8b9ae2339e6c18e166d3e04a01d4eeb657e703a42dd8892d38220cff22d1c8d37ccf013dbbcc5d0ce6021ad28ef84120e144631750498916d1e3390976296a0a9be284a830826c3bc2b899a34f74a5708e84bd95552486593ff2590f4cda55648a6fcd6a0dd2f6ad4d8ceb0ff65a30230bbac1b8bda9fa66ec89e77ce01ec00b7c80d4cf78278269e52a5036508acf4177d5614ab8ca5f6e47148e0b60463bbca457b2b316041fad663849056bae082a2cb65318ef292b627d409632b58a2ec8a82d87ed219a52f4f8f6ded5576429d5470b6ae093749a3aea5f7efb6c34a382d4698c610e1d061e27d579a7fb80fe34ffd6e624986a692ee90125c628be0191ffd324bbcfce12df9cd141a763208f291a75ad95478c6c0aa9e661dd07829a3dcfd5200e843cf83d367eaba49b063ced778934f8522c6099401b7fba99914eb45254891001c18b1f6548ee05350f8d98f2c0d191db0f7b8d18cd00953e3c978f3d2905580d46851a22f6715d9da7b6e2e7f0ca415dcd105dd94638809cf2bd197ca35d57fea0d680919573a6e5b88338698f167221b5ae3fb43daee7c71bcefd77ef033634f046dd3b79cb2327c52062236f94a21a9c0ea835688c5c69f0558469244dfe3a7ac36f0645208254dae344fc0c7a6dd979b9be9e79b393b29d233b2769fb7c9ced587863a6311ecfbd7a7f9b6b6f2e0712cfa30bb8b5dc253e2ec3fa9f896cd1c30536a04c8e27ecae82ff19494f15485c66b513739b9b2d315a98f957d5f60774c002e8fbd79c7921b90c00daae61a6d7b4fab37d8144766efd5414ed05c2f7b9b8b878a33850327c1ccc6914ac85b0808ea60dd20adbe18798071840de2912337c0ab96c1d3115db62e2adfd8790aeeed5137770a38090c0a7d83d7b8ae2ce7504e7039d104080dffcc1dcf7b8694f74deb0298dca2e0dc918c1485389894721a9ed71f5680278825370a40be8b111425798b4596bdde96b33cd653091cd2999edf940486526bb59cfff7723f08d5a20fbb806a46821638222f6b3aa0857034b8acdd7aaea27c1554d0298e68fff18d1e50e8419de9241a92cfdac50b91304368795b66c6c9e35280a08be7cbb4485999cd20c9cb05913675fc6e946085e2e61066bd04909887aa816254da3269dd8c4550707629ffc8b7602030586bed8e900575009f62f7224f4ed2d09221a4633901b128c38bbc25a898481afb04353a02f5f40824c184cc4580b1e0012daa6b985c20f56040de8819ee533f36f6fe09fcc5cc66caa923535f2a0cf9e3cfac85a44ab7e684df597fcefaae8acde3e06530aaabcd51c2d3bb15ee78bc76512a00aa90ccc5065ad0436794c74618e9d21914a31b750ae7c585a4ac1e222217b50a1021ebb28c5cbf1b1e5ed9f7b527da54bfabc773b743f947947c56cd08b92564eb9054ff69ba31629a9fcfe1e720f89d001417851f42a0f5e7243eba379bd552b8cc3c894b45e0bbf8f7dff49ad871398d2ad7818deeb1bfc85ca36b7fcbc2467bdeb234060b37fa96d44b94477df1bbdfef5b3ae306c842816eeac97883716e01ba978fd08cdf8636ae1b58e1b47062e985214f1e53b5e9dd0bb1a4a2ab8a3ed6df51048a6b4f4bfd9db82d3a189c028b4a7db7f94d50f8c49687a9417f3ff9f046020b5fa51485640040498d38eeb83ff1aa5ba0e1a38f182e1fe9514b868623ee40823654e7a00e43462decb3f124d070645d2a1e9cc3f9d5ec9f81bc90b9fd8db0c4f187988f1fc13b20f11884cd58bf3cf9885e499a2acadf16cb0319ebb3ea401509cb485502e00e469173b18a4740e6bc0e739439fed197e83bf19cabbb54f36478ad6e262b06d89af63136ffecd6543ad2e9eccbe9695e0c70b4ec4b98ae3122ba719673e8fe366c2cf9e18be143f81dec43b24001cc601c473d5f6591ae1fa1c85408499b6a2c06c1a51848038b63816e22b100fdcf86bda9c2348d47e3e44d776f24890234f676f271e8e900627e859d2d9f43acf1a61c22c7a8ef4201e2df074638c936a0ec4a359f0bc830f3d989d4cb80d789d8e965c572dea62ccd05db0e283b8f3a4973802c38b1dc7c5bf62b36cd12b3e54f32655d25b68718c5d8d190fe9f865001a867e4d2a424be9bf6c074375574811d6d0f8e0e7ba1ee6eb1a3107dddaa3b0d7838b279cb37778ab684ab44fb30766d8ae99883667450f61f52349971c01398cdd0cf722d66f1211ccc410e9f265c83be7a99922b4c39f705b46ab1843be9273d0c0afc6bca50c9879ec627926b842706fd00903077f980d265844392f71982f257f2fa852b816e3c534818ac6dfe868bc98fd061c1a376ca02d36dca6965c8fa1d40ac5ef9a47c12d76376c399d4a6f728dd7131c789ecd9436eaea913f67a9969aac10230e321cd577e659a05b9a4d037171d26bd4340275a2f06a9feb230dd922c08de58c8c492ecd30fbe3fac5c88a073471464ee802aafd7b7f40ad6e04ba0774147020db252beb4221fde9839b8c528989d50e6a3c0151255f9e1b2f74ce100dcef9f07906cd0715f8a34f64a4584e4243b5548d095529e124ce01f75341ecf3a418a273d2253f6af04b05eb7ff81302016c304231e2acd680c39e704b3c6806a20e8b885c7e6855e68e0fb164ba57c3a34c9f47c7bb4060dd7895dd57f2d5a7345d2f12c77e4f915a3710345adec244c6f2822937bbf30980b826e42ec2ab736026b53bef52f302d529fab1b077de86bb6a67b8d52e21764e6e343e239001f5324509e9fb97ec9a9ce088e08588fbe283c1b4a2641f8de0d6d46a451310747e4cb8ae013a5431d5e13549154ae5327fd7a964294a37a64a8f3128eca8da0d8853cdd79036d71a2ef52d51320d002b09478610660063574e1fa7ec4098f230ebb1edb0e2eb898b5ffb83d0d5406f7e48c9a1756fae108584d144eb3a64cc2e771ac7b81139d5a8c24ed83f3f42d932d8560dfe8a50cff581aecd206cc924e4dd450c13e69413d3ae1e7b33c80371d34a5d3bef849706e86512062a69a01002c344266803c87eb67d41eb95db34f772a561be3fa1d6f118cfcf7e3c0c0179aa57a33992a4d5a5f59329f64a067026d8a0874d93cf817950f04b74f1c199a175cdd50d7fdea6bb30df60010e7076381f19406335f8e885e838ec488fca5386302fa2a9205954a32ffa28c027087019a06749df255da8e064c03d07b5be55b720ca9ba5da994a1088fd2647b5549cd9a04695df0d0571ffcc186a0480a7532d1ed73dc89acf9b1ad76898f12c76d83fd7d0d72608ed9820f5de385c5aacd6dc2858aa14198d562d557fae0c99ba78525bbeb02bb19177f9ec27866a43f67c86d5346aba443a3a80d3235adece0116b6f9081daefb44aead299ea48ae078782f28fe8bc27df8c72811d7b05f2353ca8a192caa657734bb2393ac3f12c857ca82137dc39c629c4d445d3b0491575813dd8311639afe5874d95ecf716554e5eb8c80cbb67e0a50a0ce58b548216f018b5f96cdd5a3da6fc34006ee6ca6219e3dee77c158dec1f8ef80dfc498576d9fedceb06d7a9b5b3c011d07ba51a44a7801f19c3cf0c858b6535dfee89b32c8d59aa9b93d32f75b6deb3b507b1600fe297ab2c5db9a2d147a56580d59f7bd8be1453e20f413dac2ee3cad367a725896a7d71019fa4c0ca8fe141ed9fdd0835b37bf706babf9d92262f1e1f954c9bc188f14104c08f08ea6f73c3a2f6b4bd16b35586ae4b6e845d9cb487160a86bbc43dd468dd75486ec4fcafca66712222e284964e27c9c7491a0c3ea3d331bdb8f44509980367a40a3c1e94942f30e6a9c89d85b48f1bac1a57e74887ca18034ca5c2cdd032ade100198795697e4bcda51a7337404fd0089fa85b41a63dc15e3d0b823f4d33011493ad232948c3141c73392cb60a4750346773c263630bbd3425856aa1a4b4da74128970726b6f03e0cb903b3197be126d2b9c22d985ffab610ed42d2bfc79a523340fecd28aca73bf40f1f1c7671f629c9d6cb523330bce3de1101f39aa973c6601cb398021f51706c936be9da7ba918fd596490aa0cb5dc7477d30161709eb20f9403b211789e32daa326ef48c156aac507c62ed445f85c9ecb228fc1b2b84c543fb8cd40e4692c1eba8342be62711021b7bd7a26e304a4dc8a026a2dd94472b2376a937c86fe8335e9695894d9620468c4628ea023bd91e8a43f7414f400d5fa52f1c44d64511c185a48b4143a5705d3eb173fca8121aea7916ad252bf71ce12cc9eff795a71a2a5dc8292882cd95d86831966d684f8c16208f80a548c5e271237dc3f534f56115ad8c66ff903c6c2e52f7427adc9446bb781d83a97c04b7a0621297901c79554382e9644f4717fe3c0816fe08ac3be7f9a527a37b6cd7925b27162e2994d16fa9114777ddd92d34989889aa721fee1aad6c1ca18302453dfefcc67c38b6ad0b69b9c82bfe12b5b22dddd957c2911778d4a8f9ac0f1d8cb40a635116c21ed309be8b25d0027874500a0cbe74d46eb2d597e5d6605d444e2b575320a313fee2606b7027ae3e2e254c2607cc8da35d17306616ed5bd35822298f10867cdf19a0b90d78996f7fd61583690690a17c27ac8040c3705ae212eef2086c00f3097b292d733382c1fd529e8ad48642dc0f6565569ea0db48ae55c8ba63d3818d871dbd9893c596a9c518f0d4b5c0a57cdba5e455a2514ffaa5d47dc8edff0db8ff406ef676a9e52a3f320d5ec7f7139a0af70724bef5f274978ebef9686a58ffefa8f7d30c17b85ee31effaf62bf255bcffc0c708c5d3bea9f6eeb77341944d570900ed163e807d8126ce9d27a6594581bfc0adc83fffa46e3c9712ac1c4c2ef4ab858a47a321209ca6cb88f07a3839ae40def421b5fbf84ab95dc0b766b34b8b135474b65efc336c13eac35371a6c81aac27d0b80ecd1c3d6080e3730766a07674150ebd7aaeddb9992b4b6faaf35885a6376e11ce9acc1d7bf82aa3a0184111470f0df24850093f19a18f1d28d5fb75ca6fa3b2ad8e9c5238101410c6d200f29ad407e0a3ad49f1941a92d33ed14ceebcd47e95d4367919687be4c1527274ae965efc0f3682f366b3d61a6f1f5c497af1f088c23cc9c818146e1e73c3b1667b658e81042e7e2df7edb575b3b750a10ad7d92b0842b673e3b14f0e500a9f59041ad186626a3e4b37eeb314b990f5574096e15f1dc925ab499e96dd8261fe1b4e8cb53b3440f6e52ab43ab8619400a474256251c54a0d6b5cfc458c55cf0eb4aae8938f2c929168ae6d2ef0ba7f41a24b65a1855e7ecc82acc69c8d73fb02226b8d4755f345480ac770ac7e411eea9c7315c6629d17190515098d4f41a39d91eff04c8d9506a48197a2ea6995b7dcb6d7e2b8b5d8000a2fcef1d49aefed2664faf2d5dfe7774a61a49faca65c5450d393db80a3ab873faf392c920db56e403efc608ab27ad9e1ac1f620f7dcd7bdf4ec6a3c8b386508fa01bf2048cbb75855fd428b479c0cf5ba5bed6f9fa9197d183e00d0595cc53c96b3ab7fe16b6e2f2275d6a84ae5905032d642fd1769f0db7cd3a4e73f95eac603166a5e62aa45c5bf897faa17d0cd7d347ec0f6d5a487ae45b021ab1c9ceaeed45e63ac97a10b0cb4f0ccb2a60aecc5a978764bf2e03dc1642ff0c116ab911df716bd4099d65e71b78457f67e76b67e8988a75af3b9f9f3f87aa0182da9a6541baeed86add89def76a7d56cbdadd0eb16a776ae1362f95ea9435fe5cb23028d05201fc9bc1303862ac58a1a13c847727eb90c466f389e4e8b54b476f60e533063dd7d4aef1799455dfda81da6ae09ad9e9052da93b57c23744d414d4a757831137f610d00206dfc9b523af813383e814cc9a7a6acdc9c8e6834f933fd0b3fef62079384d643edbe0ff2bafbeb131e0a2b238b620e4e1f5519ac96ed108869eb4fc66008f5600d1309a72829cb6bdc095039c7d9de8ee110b80e7146f89f061e001d605e3c23b08d8ab0b0e35b5f6e79d562462101e61b2284875827474975b7afd08fa8d081632baa1245ab2aa00444da237df6b2f17900a0c24fdb1f64847e69c7a3550b12c730f5169683507305b259b40ef30bf4190c0d1d4400809125d262d4060d93642abbe2673f6a8ae51c3c92a228b65f0cbe1188108be96c522932007a9875aa329549f0889f4955fa2f59ca507f49ebf9d602f6a0df2ce69daa47856c3723fe1aaf154873adfe6ad573fa6d99bc156a59e06d25665b79b7ebdecc461206b90b949d2c83077efb93988bd959d03c4362825493a16fc16d9f10411e76c803c2c606dbccd17f8c9a0d16a6c7ab4a264d86d34b99a657a49613ae8685b5ddded9ab49ef699433cd78c2d930a4263ea839b7e445f6464ece7e2253cdf297c7b9944495b918d5e1f7e947f5df3491b942d69492eb5913341a8c334e4988463a92536fbf06df3e370ad6801dfd04a7e17a09137c0378bb096e35cbfa64559beb6e5228367aa398f806b420e46991efe039074b66a3fdf992a9fd82920132d94a6cb22ad2bcfe8f1576c1e53e5304c84725d7ec006a7d54463bdab51282fbf4d2af85dcf725615f9e2fc0f4f6fac155e8d7f25f77f39e3d6195b16be1215375313f7c231081fc9aae53e6f7c187514dac90d94336b22105655f9e3dcf014a1298bb6d1020e87a2544b7f5bd956ca468e8ec6f740059acc568ceaa098c89d405da56e2d6ecada9b1f6d93af27451c4f06f9e0683ed77790b536f80fb19d4fc9cf52e18e133ee0297eeb6304069e6fabed42e1330f09dd7cdbccd0f71bd508f4e66823ebb10df353844f91efa4b8f9c26705fd63da2b28f4467cb7850f6b006bda67f458f00289d7d7858e2bbd4e1e7a60210bcee561f00d49d08324e59e2bf1e73578e5f333c775578331f9d051ed7e219ab30c7df1531addee06b03df96eafcdd95709a9d51293377e12ae61c78543824403120034bed6983c1fb808b3e143296747af9e721fbd1945bd72014ebd051dc5f74529de0d051daeb3cb53ee0cfcc05de25c5337d9253b6b554523220df6cc54d5fefef02d1b279e49906182a11f4c0d2df830ed9d1eda1875f7cb6e0f3bb140e5f592ea8a9145ccdca9f170fb5dad6fc5a395cab0c150a09f54e973a2c2bea4dde65ab163c1cd0136bfb6eb8fe0559bac5897c28aa306790883b827aee185b27761bbaa0b48f8b00bba8ff806d28f674af2f2699e870c6c41480c4a7e8e8115320426446c2520ee5eadfa8d1b92a09e0e1b07b88a9e2b4704a08dae23d09f70e803cfc41ee7e0f206741363386d3e02d7ff801afc46832a3443cc7342c6da91a0c73eb50fc063f05f1c4aa3fc464e92ea2572e5fbe7d90d7771d9271bca4d031d451d5e66dcceb3deba1db4c56d99f26915cde81b04b404f9c1379ef89e150a44fbfdf13ea15b29156e6c38ff178aa003138f4732298f2b788d2497e15da1ef0b59987ca3c4a1f452ad01dc84c2653ee226d48ca626a223595bd5ad080641ffd1c00ce1eaaef3db5495bd0482128d9d846bfe74a90213eb82fe23823933d25d4b8b0f12dbde99a817fe2d168c2d2d4aa3fe7b2b5c2bef1233a3c0b43c4c26399d6084dcf88d168fed00e3bd8751d6fd12683cc8ead210364ddc0f5f4edd823b835c571676a8301c041664a72fab5dd8a651878cee13a2e01d9d9e9fb8a8edc5e01bbab2c971dbc7810caec735f3dfd408fa1ab56670a400dd4a378fe252fe84af774e70dd2842884483f1021cebf1f851d9363e68eac6485c49b0999f1025f16923adbc1da4e5ec1bb26ba152ab939871302a1a160c5825ddcf17fafa199c12dc973a1a46f1fe7fe33a012dac4089b3794f06e207d62f76b8a61a2fcec6b358abbe3d8cf46ac44ffaafce827292f5473bb703f4da7617e375a9066ed2fcc88111f184bab70512dde34346e271455656b230d8500ecbbc58ed9d2b9c4901f0b269899d561752820a44c3c9e296a9a4bcee5c9df28f803e6af8fc9fb51ea41fed1f2dc39f821f481985d4bec70c2ef385f3db4b7ca157637628db4a6d3ff682ac646078c201e64e25c07b5212b505a293397e755f84877862a0a434c030bcf5a51da86995ec27f6bc7f01787e9b0c51986f286e9651e8aa93aabbf46938d366fb72a17c05bd0c3942949d786818b12dc7ec9335b6533e2b1dd154b9d001359de1b1fc24396459e0fdfcf4a4b92b3ad671a38801a4dd91638a7875887a84e9471fb93b1840a92500861d6d5929de2d9e043c86a11284e589ff9828a1d840092481c0daafcf2dc07a3590c44576376db4e1614dbd1960983bd89f72d52f2c99020a2ddbf9a0f62eec7295783d9405e151ebf1e3ace6e61b0df0a85000a13ddd170db632615b2e5cb2168005daef1c61df48f71b263a86d9ba8274ef003c145f19191ea5608f4bc10bf97e490597c318369491b449c13bd67d16da34632eb9db0d9a05ef706fb2a0046830fbc51d475b9822b2d861241f208ff28a3eeb03688322c83c00ef05cfd93ba0a9bb682dd04a8b2d59f457c303abd5e99b8afd5a83694f917806f58f79edc196b66a7879a484d7feb9b82f9bf954a5c9f830d2afc1ad98e455df26bc07091e6b51f178ed4fbfe567d35887aee145472573cd88a0f4da7e3089bd3a98d91d0b65fe4bc3e9e28b893d656ee30da514b56f26a1e67f3a42c6c73cf99023fb585c4cb32d1ea88b0d52deb302fa7936c02bdb19f86685cca6c7d89417ab752c141ba45634bd0cc4cb7a3a0cc23bc53d1697e25313eec51b0be00a6dd0baed2bb7db3f343137318f61c526768a2fca346f65a79f9bc0f364e37000f8930f18a0e538ca86d8f6d81036718f80bef16ca63f7250602405e1b76edbbbe9c285b105b36ac1d9f8833d376748b2c632c0a7cd785be51ff264ab53f90cd2b456fb355bab4314a7580234132046352751582a0bee8dc0d6907587b2ca778577043301a129fe6bd130ec526c563e0b46c4c049094170601c41ee883065e59e8cae78cdd4e6663c62c4095040f5028f86f2a6f3e9b2ba18108f06ce749596ded682e7bc16358ce57e5c5e0c3de01b3205bd59f7f7c006277b5091785c89d595242cb7bcaebf1c660aaebe70b3b4b44f9c0b50d5315c938c703e60ca5f9b331413529f8b7b0d9178c0e70ac1cee76689a334eb34356c1c2d76281081c35fb693f8dc4c7af9dc9537c2d393d942a1083a45d19cd4ae1a725b2cb6cfd190dd44fc7f9a6bcec53b50cd8330c58cb10963489b930aa3dcb78f031d8fb518b6b74eda0db8e0c0f017c5c2e0056368564f8c421f36258cd4172b068911d50de8c641a4d4f20f7d6fea3f3d75fe7938e11442c8d93c72f1c323bd471a576c7a662678308acf489b0c9608f62a5af50a1ff7d33166d05c7dce0d636d5272518a6b8cb6d25a333247aaf153c52ce82702a729735aea9b798420418ecf9183f89c6cf1b2b9452bfd9a46f1233497680396ac89befe47d5c983e0e96fb5e391bcaf2b451c1e9d4633d55587d20a2f4c2eb0dc24be175bd8510b4d5eca1da4217539f5edd2ff2f5d6d60c9d3a80fbac591c94e0b4608e5f669aa2443db9ee0fe95efdec07396c58bce12041e4708147fa9c7b056b6fc375bfe02e608a02ed2f0d289753e9062b5109ecad154dfbcf1c2db44dac79a2c379b4e6f1b05699873352ac7fcb3bc548806d8beb568883f97afc33e849c7ad102a32509ffd8210abf0faaa63b8ccb41761dbf9a4f918350d13fae40669a264471d1a29d578e77427be2b9306df46ee712c65497904c47dcc29eab6026326683b78fe7cda9133de47e26866cea33ac1516824a22d23d5098a79ef006c109bb0c866b99ae8122acde3cbef24f0e0531a0c1c4506f9b9614b29d78bc224bdb743e63f4efd2069525ad4d173cb51babd9b965066475944e048d40f599a9ec6b110625c3d323fe6a2a4cef414c7cd879ec035c2358d907960f2d7a5f97a5f4b80fce8956b5caa873d1f92e09d25543ce6bb4bb8850463ac39edf0849cdcf4667a0f2373dfd0a637fcec893630f1c86b68575b47ef8f1188609bfa8453a82d8274ab09261b7a19cf26139cb5db292fba7465c8c35021f3725363240c564f9f389a71e2e7a33de650fa64e8d7178fbd25ed4bf0de8ce9049cec10f0ef2b961056983c9fb780e1dcd5ec55a36207a04bb494884f8d800d96aa6f436f9ca0d4c765f1bf107a30fcae2926f4d962042e1f271d2700f94ed461d093d436776372998fd076f1b4db7cf9ff0b64845535865389144082b25116145122f48e6fbfb0a5d874a60ab220d1ab1fde4643e95e7ac7855a2ae0e9114f613ef3210334ccdb7151aaa3458a2480608f8c2ec53790c3bffc843365f6625f02dabe7ff7077090135154c8fc88e10145bb4a51851bdc7dc19d38248c7afec8a010752262984ac8b4e1c62bbdb3c59b801c0ca4726fa57942affe82389820a6bdd0b854a419755c77f628ec8517f80c4e5b821c5d9d94ae69f167b1fbaba8b178a22a30cede8fc92b5819c24936974dbac8a2b92ea00b83f7493efeb70d3296fc0c357bd45740933505585862a894426bde19efb7065643aab079263b2a1205f9f3e1c5222631944c0eba2e8b1081c23148fb43cafc715caee68cc56d80020f63a4e028bf8ede362dbd8f3c46011569055eac02945d3ddd2929eeff5734b0e1384ef6eade404947add540caa8425db3fc4ee709761fcbcb77c1bcc4d56e55bcf4467979fd42881a9f52d11a4615d7c9c4354588d361883bab319d1ae813e1359d539ca8c0f9a2675ea6e23bd07f06f20a59dae595c7b260dd9a301ecac00d917226454b870bf45a386be94427caa662be25cf7159106c738974a663c202c9e668024f4ea81261ab8c89e840ef30e0638da550f0cf1cf23e3769d05019a4302cc9d851295cd8293dce7d4df68fcc434622fd13eccc8f93f98cd9c08945a5642d69e3ea573c568ce3938127b41cccd0a65ff78b231f4767be8ff37cf36e82512f1ffdf5efffb0f88cd60edc58ede5c7cee0292bbb52052d181c6cba58c37cfe2b33e80f406334b43b935444dc3a9f39ae043fd1ef2f4a0537e1af9f10366c39440a197e086a34beb9839d0c4181ab4987d0dc64c1ce0e94e49d2469553e53101e0032ba01d2cccc5233217c5f67d6c12d025857bb988ac7c61ef58ed5784726642c3e491c642db6faf90ea0582110fefedb58c4cbae5d3c0c45fda00415b09ef3be477a9e29a31ce225f3febe831093071a350076b8c7109a3834c15fe653346bc142865129da063443feef70fde56f848ac6005e2fd49058ce74ab28c5e41dab01c7402430c79610ef91e73c8f53b3a9398da51ec94bc70700996644227711c7acaceacd42ba7d80d0db358c051ecaae304e1b8947e095de5889e8c2fa1d97f2b50ca52bae5113dfe6cec615d9566323a032a95ad14107c4d0a869b4a8bcedc652e424f38322b04a31519bafa456a9042356e8b20436ac2ead5ad410401e58781471c5f8473a55b0bfe292e585a4efa7dfca40fa5c5e1f4100ca7c65c3d5f9e78454d40c431980a3d3c6add065fbf18e6d037c1f11da7c6f9aeabdd8804c46277237ca8b5f21e45dcb0733dd8ea1000226a77b6d478321be3d18912cdcf394481c0403548acfeb6e044434414741fc2d22211f12991470023148c072338c15da560793cd71a6f1739ebb0b05d60718448e683068c8818c350337ec395938d696d49a6bca1df7a058587baa7279f1baad869b942ff474e99d2dbae2363a0fecbf0c1d0ec46cd35cdd1c4fd5e6c5509c2b33e945e6a316a93d0ac264d9e77a4a83d5c22b05475f9b12b13b31b220df240f8995f8cf2392a316b5060ce8d955900ed001ede463b697a558b410a84e3a28f02cfb90b3b61fbcf848a3f37017d3c016ff7bd20d2b0f830fa78def97c5fffdf9cc4d31e81d546899292c844e9647112a8431d248914bd5764c8d4c5c440b5d04163fc0021919f96b0407d43947d53efa02d1d0323e24fe02f8aa431c5825cdf0382ad0819b017b1a7d4e125f1352d259c9cc373ff37401af31afe2118e0397bcb27759201bbe26d80f948a2e0dcc88353ffc08082b53d2284dd84aceddd76c28b5a1e8376a4dc71c9d4e3a52f83ed6493907e8fc725514e936ef88df932db7ee2e9f9f6706883e3a5a5a6f51626fc4d9d017ffcc975822aadc7a1cee0f5d84ca88aad21dcc8f7d616005e1385e47db580514020f308cc2b12d7b1bf60b866d711a64ea7acdf834a516c08805380a8c2bff19a6ff91bd76b50fa996338acb2bddeac17b86490737feb2f6bc744b86bf60458fffa6b70be0142684deed750c249a41a139f7cee99c15997b557e0cedd88af35e0467b2b4ca4d59c49490da01f0829ebeba411dfba5a8a4ff2ad4eebdf9a7a349cacf6bba9a01c69686b75cf4cda8c5f8e70ee715d1c59d62b70ae0fdb259308ca4627cf2329930143db749b146b9a60c376f177269780a19f5b6c49ec1f9de273217f34ea41380dcf5ed4f65dcf893d79c5aea318e758e257330b81c510989fa6dde14caf7915456cad153544a30ca22c2c2061f7be08953320c72815f3507c07d8663ae4df41ae86c0ba31a42e7c815e2725b80aa45f298f9980ab6b4a1693e87625f7ba09a6b96c8ee5fd0d25985ead36973a8ae648d76484a36c2b0a66a3888315ba332bd4143a543af326f39278a7e8a6537ba056171f78bb8dcf26814d651e7b2488af5366a9f42392f3aa891b1ee27bfe07587ecaf401252557e6079619119144319f7b217026afe3deb21dfa8b19946b463e89d08290af6305682659a472e6ddb875eec0008b392e8d58e35a6e5d3b026794a2b7a6bb7f3d9dcdb0f6f6af784d4917e00e8110bd23cd15751bbe1b9ec2f41dd82097e68d4b86bebc8883ffc9c59d20edb81b7f4a4c4191c7600b3d9b68f37b9e6e7e3ee96618290b18c75e51904b5e06cd152c379fea665dcc68c781c7b76cb43082341dd0f53eea3819b1cfbbb1ee8d1f36cf049eb43bfeb06d6468eccb6f5b7e7418c7c1d8f6c4638be5dc8e8f62e3927a21cac378ee4437411f0a31e24cbfe6543789d8256751d83bdb672ead2d941a589c75d467ea77d0f1403e3ec236a6186aaa38fa75dc6e85a2252b6f57c31cd6952ddc3a585771b861f18275ecd384d7126f46f4212b3a68a520e59f1715b2f55f82f2bb1a1dc3e9d429c1556d4527d2e44840901caeddf2a7c058b6a58dabbd1ea3524625102f936ca921f2c33ba5c9ef15f408c6ca85dd6768d4757beea8575bb043a3424a2872a73defd2015d3839b13e23cc42e180ac6201c4d5f0a26d2fec69a8ab32c4ef3d43474d5a4307563d77999e8f5b25a9e75013a2d8c75642308b695d4107855815d37960f610334127574e05d01ffe6778885ebf98323ad0fff6ea4bd1af822492a3c48676875280b04ab1bad053b69eb40b6773416fd5dca096ff8ec6fe0131a3ee73952af431581548c7c2086005693296d51e71314269ad55e3fe8c89fcde926af38e5c8f9cc16c30a3be6970045dd3bd3d0f7c3acee0e781f9599ea4298ca9f94ffa20c4fbaf03a7bf58604d3adc5ce41ea05dd46d5d10ca79bd67b0a2c630612d228b0e68e12dc2be8bedc0df145aceb76e9d20f81f010be0adf7573ebe8e9548a11466653e9899254f4e48460a5db378809f2f26ad2f024a2bae3eda5715a46f97a98cb3640c39756a105675660f04d0737770f0a51ce69a6229dad0760b4e7c6f48a5f07c23c66ec8491744e59b866a2613062e853a48362d2f8aae1ba3771b5ed906a3c93b135b94f4f8946cf07a0d1dd377d8722a70a4e2c83d627e9c69263d3c3d5d2934f8de336cf33a3ae188e5d594a1b7b7aa8462ecbe155357bd9a6bd8bd74ad4ab2e264de7f4ce328c2074280020bc2a613e20d189ab2b60e98a645abaf6c12f5592359f49ddb287d2e141f16d71a7f6ea25fa5cde4ec8231b652c4afb0ddb4c30a40a7182b6612d8135a714dbc10aabe0e4f3d421c69ce868b52290ef7651ed8db714b7f7a535482ed479273a5e30af9b7afc3af0514b7aebdf77940a0532b0d7fd375dc7c1d7b357500a303bb5eb431fec9c9190ab0bfe49dd8a62b2f2d965ce43353fd8b4f7eeef47505fcf503b266a1b331f9193f87c9d655327e735970fb91dcd3a211b68a6632dd75a6afebf89ff8f133f91188e79f2b745251e2ff44dbb2a1fdcdb0c64b954bba7d9c7be4096b7511e49752354d12db5d86690db9474b1fbd442743a28801edd07a460c2d02cf19944fe3e2a892cf94d36c3c9bb8a8f3945ff95ebef3dca70511e6283613f631eb1732a82bd8b9f21a2392c56a9c164ce7965ca9c25aa63e4af961e569ea3130b64f9770b27f391f1ec64310a1080a72f4dd95f750f0415b08853113f28917ed56fcb9c16d1ce6150d54158efcf3c3d32294f6cdde2e4e9620fb8d6f57a59a6e4283d1ed9be222b5fe200763901ece9164d6d1a942c581c672c08188f07a38baffce0ee4d6263ebff185af7c92f6e40d2034e65d870402d068eb202e03683e0d5a53c2fd799dbe6ea0a512cdec0cdd4c714b2c03b3e4a275249712d4050075b7281660fced8a2b24efb3504896f7f303c83386f2db039f85183c0b3082b46943774ad2a0f07781a9f7c583e04e77b8ced5364b6700af2f0cb8da91163c99169caf1611e00a52cba3a1546b96df14b9cf82680a88a0d10a543d301bcd473f90a54d1267405a5199670e5006a061aa5d81cb515880b6736d6427c0d91643eb1ba7523c92ebf7f305390c159f808fb4963b510d272dc2128591c3493d82a802e985ea96056473bd9216caa9182946a806f3ecd890a93c6099451cfaf21ead23a4daa60ad661bf2cdd6be7d8e3119d4916f30518437e33d5da64f19c7bd9a11926ca3931ea5195859e5a25771441bf65bc9a1054c4694f99c074a1d6d80a406bae10e7b3e2f70ee4f6a7aa05aea3e222fc322fd8f4e61263fa0aff90d0629dae28e644767127973d083cafce311044a2d89f23d22dc2d23735fe4d840ab45f97a5dfa26f5a9609df796f9dd928989d4efd15b55b0480820b635f868f21f1c32a7e3dc7d775f175283ecf6eb466bc41de90e3df4be1964c7a55a6ae2d52eb89cddaf77b3b5cd5e0125101af0c4f2270f926e2cd9d8f35270264323f664dac71fbe21d551c84ff7edca76b94b659084471703ab6f36af74f5e51c98889ee29b0bce1a59faff72001b42604ba9cefc258208e59b539d48e9028ece0527c637d730275880e142d52f31982c2cd1db209dc0a3f5ed47c206e6a6f4c3913458e7072507245744723fce46eed0f97e3c45ed06f53a33cc57d6d499e4ab4b5b5354b7577f7ca95bda594328d0ce00b2b0c7687af32f060ab5e53a4afbb366e8ceceef069c285b6b9b3e5cb0c6b5af0a185a6d52aebd38a55d57c5aa9101003080e526aa8f0697a6dd12993e381e60611b45a3db6ce3522bf9af95a7d84ea3697d62e211a5e20c28449060a6fd0d43e09c9e2440a8e3431e41882a6d6c98989961678e071f2660b1a634f0b7684ec99e1c485a6362ac581484ec60c4786e440539b24c90e74b6aaa866a0a9a5b26c6a960a90be0424ac1c3eb5bb329fda29ac4f2d948dafa18a5f6b85516ef9cf85bea1ffa070ff951052c4d313b56e4f6b5dd27d5ad39af5b56ec13cad5cb54ed49d4f6b575af5c43cb54b4d324fad938e166e7c6a9f70a045521b15e4a9957a92dbf1a99db281da2aabff7663767cf9d462f140539bf59f65b375f3d472d93a703eb55d9e5a3d2f4fefd275d2f1df8b4fef530d34bd405e83ef4a4965f9f44e39a1e9adf2b7ea5a6de0e9dd8d81e2f1e9c5d281a637ebbf9ddeadff2ed77fb74e8ea7cfeb19132ffa03ca24b149c8f8230e3f8e227c1c693e8e37b27e14c730e3e8a3d51ac5f167740af323399219c7d11c3d1fb382d40f6094e4aca0630fa81d0f5e7a3853039ed1c72339dd161b7264d86067140375031d2a61e0e450d36b2af4a6d7366fba679a3a1c32bce994c29bee8032c9f42c7e11c3883651f49a9e78b15689a257f14d539217f50c182ffab6cd9881f5a2e390bce8454834742f3a0a1a2fba0735cebce8296c4879d145a0f1a28f708daa0e85352fea6e5079d14f9449a2091dd674d1020546c80a68badfdf6f78778d8f48e002070f1fc028b9730675af2fbc7b03ca24771a1f1a191a091a0d075a8de61ecd359391a7f9d63131795a0c254f9301e369349d0ca9a7398a26194ff3bad4e5696ea24ca289102142c4120d2fc21950268970a4326934fa0db47e033f2a9336d0b4b7d9316fb3d96c36db112b1abe10c1dac10319d4d6031e1db0e8b84073a3d6f036070809a93200216b5880fad18dcaa4d1455114455f4099247a8932c9067b0d34d040030d34d0a0c96b20d5a4803269d4092893344012c2b3f5428e803249e84ed6bf66ff7abd7ce81ad1fce5b8d7eb5f8e74c3bf5e625eaf978b97f8c2af97bf7e586197648916921ea0bc582045063471a0d83043cacb8f3e95dde912001e212f7a519924da6c369bcdeb0f6ff303944936071a514b68f9d175921f7dc3f9d16d8ec37227ea473b6d7e7403944923d289344ba2e47ca9a107142dccd3aab08903668791183264406958eca8799a932893683ea24c7addc6fccd0b5026dd74cd6d35f75aad56735dd3f235155e149d0065924854268db832a91642cf87f0019449216616cccff0cf449f39e5723918e86cf6332b6d5ee06103970d1e3fd099577cb401a71d707e5ca943660b9aee9f79ddfad9388a19458ce309a24f6b558ea91039c2fce8b6243fa6a0e74715befc38aa10e7471d33fce802b01a7ad16b8af4a29800d1460c78eec0d861d9c10a5af4a257b1ee5e14772fbac3f0a2a358f2e20d1c42f63ce530e344062ae630f2a207a04c12b586caa459509f291fe400289382927c06fafce5b3fbd0357a5115dd12d7c8fbec48633eff642f39e759ce6ec294cfb1dc25675aceb59cb1f441f2395f7d6aa9ae766a779f73d6e72f6a5aa8ca31078d1034cf69b374274b4b052068bab38e2d31dcd8e0840999cc23871c7ef091e64a13bac3c79e1834c6c02182a656ea33982b517655497ee4e883a676ea6f789b7b363fcb249bb5611cddc1fc388e6ed6f6f4f035f732a9a6f31d3442ae907859d2074df7d368363c8d05a91eaea0d085c79e19509a9aa7b9883289e6217ee655869ff90665d24cd754f6a2d08bb71745df35bcb8e7e945262fba06659208b547479d19acb2242182a6fb5fe1bf6af8976b7c7422470e505cc664f108027d19f9970bf9ad4cca5afe32a8382ff31065922c16731f725c6cf4582ce6693e06d5a4e8470f2a93469d73d64121f9ecb65a9914a37a58d4948739ad4c82b900e743fd6118866178a4ca87b1908630a40a73e88551511fbe42abd06b0dc710876138a6070b417ef020e30a2d938509139393332b843178e10d1022503660201216400720a6fa289913e64ce8459fca7ef4fae5c7713cd2f5a3cfcaa4d196898c08f9ec3623685c00e2b3288aa28b1e2b93c4970b35fccb6165d2eb5526857b49c76fdf65d2d6405c1ec81d08c88bf0032dcd78a011680b90d71cd00804e41a1f89a06b4a9794265839d04181ba84c0a9f365060d2634dd0fc4a3c60e3d3fecf044069a56aa079a9272f243c99293d61c34ad56373c90573503f8d181caa451f619868d175b9ffda74cca651210574a3e499266c89224491c4802905c4fba47baf661e549dfb6184ffe58f324902b4f92406c783208912783e079d2c93289fcf99f9ffff1211c3eb2503f5e748db2ff78896b24fecf8fabf99f2eb29a0e7dfe74c4e712273ee7ec3588cfee65d73caa3efbcef1d96ddec2e71580f8ec45d991607cd63d99f9dc2386dda8c338a6453f8ea3fb9c1f5d8f3b76f8d1c532690ccba41fa46af5a5573e3fbcd65a5ee7705a7b09a41cafd31328689ddfbc7613e2bcae53f5a96dd29e5a1d1aeab5768d8f4090b1a4073e68a274d941759a234f86b05087ce982fa8d30b3b8c2903840d52685abb7e841e2d366d7c588302149adadceb22429e241d2c93c818d8803a72450a0d2f45c6fc63961ff3bcd0838dad3b5d7c4841c73c28fce8b94c1a835eec7a51e32314f010a48cd41e209aeca0e9fefc59f7d9353e4282228285c91717ecac80663e579f7de843225d3e0cb58efaa42fe701d277968074a96e9530174a78a1846118d6f9fb69a8672a9c0aa7b49ca2c2a54fc3f0a2a02f0aba8fe6ea4ab59eeba4af93be50fa42e90ba5e554e353adaf800081004110acf317d4d305768129a885e55390ea5370864f411c9f82567f3d05affe4a60ce133d2e72543386a0323257bc78e95344460b680a36fde380136487254a86f04053f089852f7368e8e85aea81a620d4bba18325a7a58c550e680ab6a0030d1d64f821cd9720d0149c6a804d530f603dcd7b6c9adc27e75ce76fd6c3e612594ff3183639ebe3eafaebe9a7e7caa7d929f3f8345b29d140d37cf5d7730e1f9d3064d9e5b04503951c6a474c933275787893064d73d3149b9ffaac3eabcfea4b3d36de9bbf68ead5794f8f954fbfa80fea7e570c9873e7450b79aeb851014dbf14b2c40982028f3857b8a0e90705e5417950f8eaa9f2a947e5534f864f3d279f7a567f3ff5aefeba97c3474a568af4785281073936daa03c6071e1bae18819ac1a68ea35f1302285091d36304cc54053efe917c084e90a48953571dea0a907a5e543d713ae28387788a0a97704071c90485dd161f940536f0a066cbadefc6dc2445829d8bcf98bf557ab6bcaa778ea532ce5534c15e5536ca53fc5577fb9feeaf9eb38878f6a0d6acc84b13207871b90a024e0b283c3e78a9e3137d0149fb943c5429e313f6ac882a618ca0d3eb4c1c3439b1d78d0144389000a0b60b6308521f2054db19412122e46789822c5a6cc1334c5531509135dabe72f9dab15aa30411192034d6f133eaa3dd0a0122486396ee8f4805eaf37bd565437caa7d7e9cd51c5442caa890ae553ebf4e4531bf537864f2d55132e9f5a2b7bf5d74dc04795ca3ab14dfe4afdd53521f3f96fd09015c220c132654710281f2f79bc2039c284c5044d6d9306dc18c143a5c78b1c0c9d16281f9af6bc60034d2d940a39ad3331a8e0f132836a06143335e878810aad7c9674d1218a983b5684a04a5231bac8f0a4e98e171c954b1123343859b18a83857a80461a27333c76dc2082a6fe52a2c8e953c586a61e76e865e2dae2464e8c3b5d2aa0a18b9ddea9b72ebed8a20beb98cb0e65ec30c6d653b686b3b50fd63f1bf657c34eab569a0dbad8d6c1dcbeb9bfa61d6149eb6dd4572d28c0f0554b0daeaaf5558b8dabc74ed504a6c25325978dcedce491f394432d170c3440c1051d5039d45eaa5c0eb516b52091175c68caa17697cba1f6c3d30595bb53d66fee36e1a32a030b4aa8eeae6beb6a594b858f2e17978db2d67a0a7cd480177652a875114640818f700e632b3bb5bb5a1b1f61278c73fa9bf24e7ca6dae99eb94f6b69acaebfea9438591d3a25b94f81b83434b866e501c0854ffc91f30e100618fa0788d0fb417c698d49761f7ed525a97aeba42ec9d45b1f6be9157d55c866cb57b67735818fc490c4a1a96f25e1e1bc269985b12660e7aa856c3650df508b5aeb50cbc2bd3549865ad46e6b28866128da27b5ad24bcf73c2f24f53dc24e42c6e507f8f4bcfa550f5fcfafde61b7d5de7b8d3cafb64b74b76c0ca29af8be620fd7affc003b9894c58ccfbd44df0ae6afd66a438cb7f09e6d1d8cc173b1adc39cf06ceb200c7ab675f1abcec9908a5659953d10eeb3ad7b5f754b6c7cad80f524111b6820740b1164abd166b218ecb5817e4a7214430de6cfc3b5cf1fc1673d6399e85e58d22589c205a083270b25d4aa003dc04ae8ce2ac06cde54809e3d9f15a77ec327062efa9d153be1abf70cd9392ca31b07d802b140ae91e7375dbfc83a928c8975245b917524eb8e83dad56a6d75075f1df8e0b2ef9feea24a548beaf835cb1e14de9ee92653b1d4dc1163839d20a468a0b5ee8024e90a0246932552d05a6bdd21062c4376e0caf3420eadee013ee2009b2c5d53921833aaa0b556af4355378a3936b6628e7dfd86e20aaadf988f4dfbaa5b52a403da5d81e7f9da841c370249b68216e89fd503606f81adf6dfb93f201e5c9c0784cad61d0e622cc1148e184398dc19b3638526437078714323ce159db5ada74a5fb5deb6ea44b4e6d2c3d49a3e3c7ce941c20897172b74ad80a70ef611d7e8cb4e099d243762d4f002c5ee4198292f84d1822506c55e8414fbaabbb2fb7c645f997aec25701116430b832586090c9c247d42c410c507152034a8a8f07d0949721c47d90f49c6825e345b5963b2a8e86379c99f9f1f1f7f480f322d5a9aa3bf4cd2afb982ec373d921e6456941c93f0e7374d8e1874f2c19ad31c665674144d8be2f1d6cc1fa7992f9f6dd1b46836ed7fdf56ca57ecb25cef852244c84488700d3c457a9a9090df7629f0d1061e73cf4f808f6036f7dc36e1a310ae05e4cdbca78bf3464b8a7021df40668af09829249309b9cc45c8847c03d3a27706b71928517173d167a081d73c84d16b1e02e9a216212465872c790fc97bf8626c87765a75772fb677cb6ab1f1acd6bdf75eef4925e179a085aa243cd7428e315049789e8b303360893c97e5f05e78a6a8243cd043d0c3ebfa4c21428490b340e9f18a14b7ec228c5e731148177d14326fa00bb9122ac2bc81a783a0c77c035742c330d49ee21edd44288109587870f23ccff33c0f3568ad3cb757d7a8ea790fbc6140e6225c85cc459c2c9468dfe064a1c1597399eb5345ec8681d16bae421c67db83cc1fb7992f1f6b66454518ad6602b968c26e2964b298d34298150d322b6a332b6a516cd69f95be7ffc05e430d9197b99db73a0d114b9684af9fe70d1d8f64195588fb1519b2f3515a1368fb1d120231dd698af3a7cd5e180e4c74bee90823cc57d0a1cbbdaf1918d861dc2b19b808fb6e3d0f1ccb15b287c5473ec4ec39eda28ab6dbd96f609976ddd4a692e29f0919dc2bb6b66a0a24b416ef3106645837c9b36b765d20d034ae8cb33a084be4e164a280b252a6cfef22057c10205f475b2606103b57908d3a2d7acbf24bb8160ac960d63cfd81c1efba8d3ecebb5f43c6f68779d609e7d72c27e756038efd481fd6bbbf0916583d974593617db1dd6be8e711dd4e63a0d0a2a09ecd784416a89b007994b311cad5601e98f5d405ae73cd6a726b357905764d767077acbd6ae57dcc033455090cd59a0f45e8aa5259acb7c69e6e1092e11d6e309aa891ff3e53673bb5865e31b066e1ec245b89d151385386fd943784545a898083c6ff9bc61e0e5213c8497873867a04485cdb7cf20e8ac98e8e5216c0ff2a07306b6b362a2bcbda2a2d7ccd269e6e833f3c7479959d1d0ac28695614c8ace867c6cc8a92b5c4008a7b4bf1f20c54f4e521603ae8f658cdac28cdace8ccaca8ccac68ccb4a867d687994c4a392f47ff211d68e975ee736322ec3fa66322eca5598489b09326977d634af99653e30a70d6cae5722e8470252e95c5f55a5da3f44a5daa6b5465df7c4afe95c2479f5bcf45f05c87f09d1a13a5766a5712555fac65ccd9da00d2161d8d504812f01efb07b81e93184bcb7a37b5a523dc874fc94feac0fb7b2fee7e6e53f2fa3d6ff5951efb0703760fb01721e172b99c0bae5c0ea5cae51e7b649c76d5a901a242bad5347dd5a5e94a23270d9ab70e82f17e1d3aa1a840b97ff5bd1efefbfc049fa710e17a8a7b647e2e42094cb846df7fce02eb3fafdf57bb72f95adb35fadce0231176bbbdb3393eaa28ae7ab5fa8a3e47fadc3fc7751024ea8ea291fd8919d00ee2a319881ece403be89f8fa2e8a1366f2a4017cd509b20d4bde01b8febef67235c5e94e74147728881a4cb0e335172aa88f488a2c7069d1df5cc7476756be637016fdc11de81673ae2539dcf74e8536d1bda09ed64f7c44d4fe4710655858dadb5d65a96b155beea64a8f3de4b45d9f86b9f845031914e51844b112a26eaaa18ab9621e0294c749d0b13a96081b54ebcc34437842f8414a3d75009b55e3df5a28e62549e54956b64758dbcbf5567e5c95fadd47bf277dce964d8f1a9473545eba65ed65f6c2baeb57a07de57ab4f155c7fb5f00ff632451126fac6d386893e37d3bbc34f18ca929f767db2a8f88e17eaa642bbe8a25611da2d4c7447292f0acbb6dde661fdc5d2da72dc95818a7a51baed9f7ab9eb9e133eaa595280b2e50a0d19324fd0ebde133e52e2e1254d0e3937e4f8e842af7bb9eb5ed3b550452eae854a62883dc085aa24ae5bc7a7c7b5e98c7528ad43431f592be85e7d08e781eed5c82b934210fc400f81436fdd2b080ed5f0447171267e0a780066dfe1f9aa9b52e16bbd8febe283cb499618f21c61001e182f52305224873076cff04685274e76bc6822b3cd649dd1e1c215208680d94a4dba80016383cb911e7760b0428f1d7ce0483205ea51263b9409d6c5d5d7dbade3ac6feb36eb59fbb7de5a8680891a8364070d2d686afbcfcb39873e73f83c335881cf3d073d33b5d83f1f01df5aabe7a063730c2fa0f1b51aeb90c5de88bdb552d4239b13ba4755ab16d5a3118adc5ba4480a456c2e8747d0d2d22ab5cda6a9a472182a7deb2d5184d4a54d9398c20f766dbde876d0d3e64526714375e8efbd52d07891b2c35f295afe73922c2117d9b604d97f1f96d6560aefda407daf93808b2a51ea3ffab58de395a55a9f23defacdd84b908db832d6217b1442e03197c707a84458dff231f071f0f3f74cd1b5afe7d8e1030155134595043e424025c21e140483899f8a9ffe3cf67a804a023b969daeb2a3ca4c9f2d6198a015f8e204c6ee8b9e287650ec2944a85c78ea5ebf64e6618f5d5e1b2d1d80af3a2a512fc62080afba2972a4446dc04d8c25502e34a112034a829d1977862041b34bb3b5856d445f7556d6fccfa743545272005f7556aa48b9a1a3d265c457dd151bbfbfeaa2f0b997450d21bb262e60d801c54f32e47123646bcb15cb439bacdc464dee02447e50225922cb48139326ac1c1b14f7c022c60948560d59286e832573c951746d9090ded48cbf5338feeaa450fdedab4e4a9ccf5f7552d0e83a63d6dad52b38e22b30a4f1e92c9ea7eb6ceb18bbb1e08b7befbd69fa157719d97c0b2eedef87553bf5ccb7d6620f7ba77d5c71fe0161ec547fd7b335df3ec89ffe3db1bc0d198a932a7fddda12ac1597f3e4e881ced78ac3d7abcec990988f7d3350e938c182d3a646139d1a74043251c67c6ceb237841b082200862d07e19f4807e52167f5d4b26c376d25c1cce5cb69765a727b4ecd4f6553b6fd9797693ac4ff54f0e1b869326ecbdd89edf799ca42b898b4fbc677b279d4ff56bdb809bb3f8858dc9d84ad5448d833db605736cdcde5e84e4d671d6433c1b47d9a9cddb8eab3a35566aaede73ec24dcf0f283ce193d59337c408e0f513cb800c39a359e89cd8a896c0e54ba6a90c161e4490a556a415707eb099c233fbc08e1839c147a8001246a06d42e4dd580d5d4648c19d43ae99f7aadd7773bf5b79544752d3b2dfaafba265a9fdfecb4baf9acc6c506718041e823e0171d0389d696d9c0341bc4a1956c18548ded39e961eb283a09884546b975c63a9416797aa27a26ee12815f7531e83e1df232d6fc7915e9c4c559af6507fac60671806fb6c8c3ccf69ce817b68e029ed9e11530cf06fa126f5dd3d8f92b1528fbaa5be2f4e3575d0c2c7c8a6b1aebd048d2d9e9759241ea09106da354d11837a5b629d51a97b823ee25ef143c752fbe17dfab8b3c0d454bd9277ae3a6a6eb347e4f6e53eede2e8f24e9ecb0caae5c7c00492f90c78e357e2ac247ee36dbde38457a6cf18522bb0c7d1592919ef779def9617ceff5ec95e11bf1f7b957896ed2f723d7a0a187343f027ff71bba6630f061aabfeef9e865129f425b57187bf5fa07eed1be44d7e22e0edf8b2f463176a11127bef383614bcfbfd28331db7ad3164d5f82edaa98e87af6b1eec2d9847aa64aa39e7d1d05be66cef5deea9e7b306ca111a3693b3ddfb2a15acf9a77dbfa10ee232434f4a1b8217bafc6444c4317f56c970764579c0cdb7a8ae3e15651ae6d48565a5adab95eefb4d636ea75eebdcfd93b154e5c5c5c5c777777980a46e3a68055adbb4db8461ae8c76ba51a855e86028fc820d0cf0f108a5b6badd5f19175c244d8350cc8bc4feed4c559a9f294daed76d6f3acfdbeeffbd212c05b7670a5626cf24a6122ec5a83e6c5ba591787af1326dae1232be52465b3ed7dc7d8d8b28bc3784b4949493979de75aa9f5dba388ced92c5b6cd75ed926ddab6641aad8d334f8ae838b354a70e1b36458a54558d4256aac9b6532546d1cc9699ae37f163e95ee9e9b2f43ccf49d2fa75cf6b35e161e9d851e0914f1549b01fdcfadae63e1dfdf3d26d7901135f9ea9e835bde7a28fe3256d79cf54e9afc881ae9584751418c515c333ebe93dd7baaca8f79cc465e9e207265e1c5d3bc98176ef068247fa78a6b7f4324db58f26e8b59a20a104132f9e2a30b102d15ba0bf5612d82b89d082feddb991a64c1a2b089c61a33b93957a67accee870ecaa43a3034dd357dd99ab337bced43933a0c362e382ed39ae3a1dc67c4e0e7d429544b5beb52585aa09ec5bf47a0a5da2eb57285b7bb3b5ba7effc9e0fbf2e70ddd23090879d5083202bb0f6449a1428408687936e8c7a46c01d5047612575665b37a848489aedf92036b4f5b497cdfadf6d62c0226baaeb508fa9aef85e0b15bfc9da9d0f5d2a197a5484a95c475d2c94e2b9652bd15a7bdef0e006c28da745991a36333a5081d14ef743893e68615131f5130e6cc90f3f3e7ab2e87a6ddb6da0ad9bcfac0640b02002a3d7c72cc69d2e6070b5822931e9ae4b9810e958efbe28a999f2b6ec20a27c7421d1a3ed2b050c603605ef89124882e685cb82eae50fd5cf152ea7290a1874628e0abaecc9832574cc6b0c6ae28d00f8a16a37565ad56d55b1f1a6d7957d83ee9e7c2c66876dd8d35cd549aa805387d3986fe9d37151f0bd0bfed4a28cc95d0982ba13fa4e8f9bca9c8dab32ba140ae84be3c666a1bb67598f9323726b21ee6d9260efbd44e5de481733c44252449b694a9010f179a25a85592f2648b4c0b7d7860d9825aff318b4a13e96aa745283c8822420d5b9b2398276061a755cb044c64fd336130c34eabdb2bdb80ebd65e55227b1585ed559415620f60dd5ed9ab7be44e768cd5b26fae117eebb66b0a0c51377765d9586bef52941502658b58186e2eca0ad96fc7d8ababa60ba4e4dd9287ec84d18c414367090c774d46aa8e4ca93ae254c3cb5c381c20cead81c2a5a60d0f7100390f4aeb8aa8a5a505058339496545d15c593438f16a5c4f972bcb19205259cc40c9920515457fc9e16ac8fad27425ac516989318e6081b1c505c81312ba47ee345474c283ab9be24a4419f3d6629759b7ed4bcb610497bc1a200e91070caa7a4eac8e52c32b3773f9ea6e1b50bd33b5bdbbeeb3a5037880d8214a14d30a70fad8a19263a14617344d6c88a286ecaaaaded498b3e7070e6d5e14815293874f095800f342571f304ea6f6641aa46cdd9023f343169f7bcfe4502012c30d391f2cb013d263090c2d532be8110105182b34d1d0b3d4431ea516c850a1618a181e6b5ee873ef083658525ed881725103ea95e9aa424390392ad4e0010f17936ce3e09091c34a0c2bc4b883a6dbde2933640b87973d403091212406ffaa2bf302abebd3a11ce8df97eefd18e849c0de4572efbdd8f7c5c930895bf03dc6f8de8bb3d8c9dacb0b28f7174f5b8bdd3d7bf5c591f624bf27de7b7f71df592fcee2ab66ac26c6ea7dd83bbfd67b2ee0b3b39f5c8c3d7bcb78f016c481e4795e09486fad7b368d8323c8b07fdff79d2ea205df7bbb7e397f1ebe3c78205812d8ad09c2354fb81e8e95840501df33ac38ecdee79d70752581fdf63d0e5f1dfc78fa3ed5247e1a777dc0b86b755bad5e2b8ad18ab856cff33c8cb117628c31c6f5c3fb23b3973df53ccfcb35d52590fed5333dc1d7ae6d1d97604baa5eb107627d6b3dd21a635cab18eafdea8173c6784713f131c6187bd8f3c2f7f746b059972802490f7bc5980217777a788757e2409d33c62934d161ce18e768128a3963bca3893862dd445b18bc2531c63963bca3494996a318961acc64394485078ae3a7b5ea04d2ad2640f1c5901c5f5fc3b75efdb12c51f443fe94499e0391de35d2aec9adc75db3e7810446e070403b0fb9efd7b7c216b2d95e304fb6613172c918236b35212b491959af04bc837a147a78aa30b26354346d6f46ce46319c9165f9c18f0e399b4818e4daaf1e3270c8c1020e4b2e90c163737a67399fb3bbcd9e92643e654cb93164b478ecfd5547664745c60a37a42353c4c6de577a6b7224f344ea9c9358a4c9c8788125908a8a90725ca1d6456f6e99dc5a6f1852ba486b7db91d0806c85bd2ca5762d8c5d457845bb82fa82e51b57ab1db36bfba1b64841883f6c9da7e7563ba8060e8b944756949efd7f7a8526dae211fb3fbd477d3906dfbaa8b02c4c8763dfa69bf7c98b15f39c8f9a26d6c320b9c3d4ee9b06b5f75505ac0b3f5571d941e5df6cf571d941a7ca030a163aca2f4f0de579d983c9fda8a9cfcd3ebf75ebfb66ba655c706864ae2de317b1a13e11f3d7ceff5ca8c6e561215e3eadf6973adb512690454372f76eb79185ffc7936db995e7beff57b6bad3504c2e61e55343256046cdcd5e4dda5568f6d29460a60b0b8c6ec30727356327ed803c3141cd0f442ed2ed56795de2a77aaeb02f9ebf7e987bfd7e9da68f2d7daf98ab565428ebfde9347a5f9ab6f10775fed74c37bdd6ad1b0a9edba44d6bfe401e2ef8fa514b86830b971014dc113101f2e82d0ea7a82de2534a484ac892125889912a670b8c1480e67ae3441531b878e0e316c4cc1f92104381869d262d203c60a7a25142607017461a8881173c38b2e964922ae0104b84260dc983fba2e93c61245a2e8b53c63c3ba44f5b5705b454cb890ba2e5145a57297080c0b1f7ae8609914ea0d5601b591c5e3116027e3bf7aabbe7029a1b3ecd4f6bb276dc9a5b7dd6924adb5c8e4ebe20d13951c54a26ce8a8564da6347153a5c54c9e5a47cfebd341f7658335486e540d4e3b8f5d486b71e1c9af2577f072e3b187d8baa91d36484c172a8fdd26d30222cb9c2238c0b8a086016982fc10c3ca141d70a0d7d2f95b65e46f0a2eaa899abde1aacd63a769dbe327295764c8a1871427745711395245898e1d783ca1587cf131c68e748dec9cc718638c319e9549d89395499e0d801003ea09ab267f69b0c243030b34d0a9a1eaaf17d5b0e7af0d62fe5e19f9ebb132e9eaaa291a4bd608e659c178ec2f910b08be752e256c800099ad85cf5fb769f9ebaedb72e7af8e4b15924883161f27441baaf808fdf59f2c7dfeba04622c59a3d2d3555579db5fdfb8bc95658f96d2037c64f3a4ecd49665bd3a9649d7f35c2c933c9b05ce63f7b0877c7459b8fc4dba5bd438d95d083b6598e2b43963430fa5204fe4bc4982e38a0d28a895b51ed81faa7e18f3929ddaecb65677c39f8ffdd35b9e9cac47a483a16acd8d4ade5396e4613e8fdd6abdc762a9fa7bedd01af71ecb93af3a2c453e1de5bcf5115f75545d5c6febc9816d8f4daf655b686caa23ea918825854465a59fe8a957073fa246ad66a72d98deea797cde72542aea79ebe9d8f4d6453dd728372e915a0a8fd9d845d1f44a20dfbb01c90d48de5285e667657e551f5593ed5422163ed24d2a91f5295a58b6ded2f0d653914bc412b5c42d914b4b551254b2a9bd31ea1e591d46a92a562395d35ba8916a8c1a776f47acb7a87b18ca469493948ea91e543e7eec70d0ba46e9b7f4cdf0d653b0ce5bb7a966a299d822d7c8f6405619fad4425d4165b1e1b2723eb57a7e6fdf1e7689392d85f5d6c13ad708ecd239b00becd239dda49dc02e0d65a5ec9485b251df0c45288aa8481fd32cf579eaa392b2fa6fe91aa5dfd3d7f4397d4edf93fd9a3e291c8e94296c79c67aec8a963e0226b25ed9a0151d3d84d2c7f3966274d22b5acb14e579bb5ce8d54eafa9a74c287ca4f78db26db769bd75a82829aba53091fda8defab7b3fe6159ffa83eab1f26b480cb4735715d05543718b0e8a182122a1b102cd7cde696d8fc352b9bcfe968b2d1749d9c74a4d6e9669f8058eb9a4a5b69293d355acf1bb9b092784dabec15d7a37c0e9df512a5a39197c6de0cfff37aa7cca2eb48d71df7837dd8d67948fd69ac4358ccaeae5d206923630d931d17565058549f195a706eec6440ab6fdb58568b676bb1859d6aeffbaa9b01c8a718eb508a9dfe3a16e3d771374bebee7a71f6ef3641fbebb66ac2fac6c2309c017feb206013bdf997ea6605fda5e395a8c2f83c7f6fd1d7eb6335f191c5b3abba19727fb32cd50c4e9f92a1d3932a25fee29a758d6e8a6ffac9ab75e364c1e0d771d7b7ed621b6b2e9dbf9f5713d83ba86fab243c8d8f6e2ab2075f01a0f4d91b659b70930de38a47c725aa4042144f11db92fca2a25007053d37966ed8b8a1e30690efbb114379836abc1126c45d2a0a168a182a755eb8289d2670df0b82206865ebb3c2b5afbcc0a495ae0741bc3f1f5646910ec19c33fe617589ea4e636d2ddb9647e00717aee8f311f589200882a0172fbb96a1ccd4ed05cd64aa461710d0f77d5fd7d72c4f6fba3448848ce8e59c73ce52a4c993b1411084a33dd035e81b94e3f420f8e3411f027d44d135b2af49540ed6a763c06edcb87173a17ca0e3d91101822008621f644c325314e83adcdff77ddf37c72acfd9e53958798e56cedf57044c82411004c1efe32326f329839720f1b8a0cc684109931f3398b1816620be3439b2a4090a97cb42d697a6dc215fa123e7fbbed97fdff77d48c250833e648939e79cbf2f0e95080367d7533954110182a093d748e636210741104cb2fb3ed906411004411094ed8abfad0b7aba6e10049f5c3d08822028dbfba39173ce395f4585da4bd5cc4b99d95583973479b02452368cbf1c5297a84e45200795cd073432a8aa252a57a54a192d4ab4f6ec40f34c2a4892295254543bd07c857ccea2856b0682b7c6530da81a5135a46a4cd5a0aa61955db7b101cc722389be222ad902b36baa2c66a06647645251d9e966d751c63089e39e87eb3cb944b54a5588d6b90a433087cdae71bce065d755c8d0a86e90944ba0c8172fab6a9b94f94128e76ab7307dde62a3749273ce3953e9b9447549dbd83a6c40bc080c1f962797a87ee4f77d613c100441f0fbbeef4303c2b14c563bd89111b5264c9f205737fcf02187294b9670b94162709531f690d649068e1f19414a2652aa69dffb7ddf17c3561803d7968104cc11ba476e591886611886429c2e517dd2503bca26e55338aa4b54855851c56181aacbea468f1968d05ca7cd913643be503db982e60be4339139af5df839c4d5ea6b169dd4e76c955d6f65f19e806e6c0c59b07a3840d4d865d13bbbec3ae7e143e5331f2aec35b1caae6d8c243b67cf39e79c73de9f73ce19c953ce39e79c2f9beffbc2cfd3553f99c244f5c390fcbe2f6721b2253a7971dbcb8ee2ca3ed79f8d373cfe73a1384dff7d3ee21e79e877a62520d982ecfa32ef4591fd321e5184d9e0086171238686468499fac2507d61acbecf06648bf8aa5bc355f51821db1a282d64725f235097208060ae4b34bef662186375ac2fae62cc018c11bbb5fae23c0ff3d975cd991b464bc291cf491ff557ff19f17942902577f9d3e7817cd4f833bef7b19366f9390aac4d25a9af3a1dc3d15778e17942d08758ff0acf594082f61f27413b1ebdd1f3ec6336b56b1ff5b922f41c1693bd5eb3d9cc4c95a4d2142cd2193cf69799a278fce3f547dfe6f80374a63f27f6d1c7cf43c4828c96fc70c54b954f1f94e6309a40944909a59df54c315e81f30a9b76507f05f89f7f25e62004297aaa24a524f57845e8290c1e9f27047de929d6f85c117a9a69ae434f35a6e57345791e994173a6164c4a5eabd56aa1d78a8074069f9de6282ead46a3d168341a8d46a3d168b6b35604d04e8f695b4f537ca6d56ab55aad56abd96ab55aad56abd56c2753cd5bd04ea65a89308d46a3d168348f8184d24ea6da994fd1eb9396f45c2f8e84ebb70fc2c75e02f82760a5188f1dbaedf3a976f102609f3e7dee7cf65b7ea03d9f6978a6fa08cd2fed6c5177a892db07de671fc1ae5a52d0f1d6b58db75a72fc092648955e05e06757fa5b7ef0f3f96c01feecf802177b054eb0fa3d2f01fc7c9e80ff3bd393b4b37bda193daf43a07b4a52ef2bb093e48feb7345edf347b6a7d6491fad797a21c0aa5deb0afbde497aad23527b5af7cc547b6ef5cbce734576eca42d3350d12f2dcf547f99942286455ffef214b21386cc5928a1321f73c9c10adbe7bd4a22f41b90a78ef33ab801013990e779e89d2bb0a73f7e02fe233190952964270c162dfacc80468e9d3c7bfaa032675242652753cc5f67ad44e9cfb9227b4a524f9ef5e2b463174f07fd88cc63660b9ba382726a5a7ae1028551fba0fb6c0a4265e70c9933b56052f2d7ebf5b27d2efb6a97974c2693c96432994c269329f14ed9e931edebf86431a38632b590bd5eafd7ebf57ac55eafd7ebf57a790c24f47532c980862b2b5051032788141a739833b5607ac11616187e08b2c54810e8cb5bc84ea62d93c9643299cc6320a1b293e9e5311b6ab468fdc0d2a60abd1e3361e6be4476852b626ea8995266067afda55464c9cbd2902b3d6b76e8cf8d79feaa26ea5f6c8e71308ed3630b6d3132617197be48a12d4e0cf99102ea393659d81cdaa26e41bd53c9cdbad2db6f069827b4c501fadca12193d8aca867b2b04b5a4f688b221a5c472e171c3efc30858e20e9992cac0b2458680b1c03ad77012909661b5638566bb8506c8e5dd06bda6f7195ecbd4a463b83cd623b8b5d756aa63ec7b61388c58aec6c46ca48d2633e9bcd66b31969d68fc57c1693c562b399c7623e8bf94ce63199c764b6d94c1673cc66369bcd66b1592c0673581ae4341f6126e8b4a01b0d66de689e1da439ee613458087385e53a718d6867aa14c26fb05a88101ee4b510305a6c46abf9cc479a09faac36336f339a799b797670e6b8a7796d4683d1fccefc04cdbcd13ce6b5e631d879a3cd66b3d96c3693c57c36f358cc63b1596c16738f91402449ce622ef35c7e20f358cc653297c962b2d9f9658d3f242e3bf81cfb6c369bcd66e44c369b91b3d86c36f3912467b3d96ce6b64c9a91defd977f5977765ed8cbb4b937fb89c9622590ccf69a6d598c8cc93c56d3342d7ab877edc45c234d7692307399c7ce74e6b1594c76ea98e95d9ce7d5fb0df45392a3186a30579bad91d1eafaa1af3aad315ff5f5eb0375d9a9fe3ce3235b7589ac937035f877ccd6e1a7773649f0dc063a76a15c4d68c71e806ae2fb1cf4f0c5effbbeb04cbaf6e6cfd6ef67c9cb814cd9b14756f7be5abfcffb3e0f76477fd5444a9ad971760c42f615d61b31e2e2ec0ab0d79a1dd713841317bbb16fe60d3b76dc7f9ef10902ee3fdcdb11b8fa05bf9f7a7137ef00641b50bf367d7dbb85f53db25498e83a6e80ddb207b88e1d9f7a63bb75fd5612d7087bd7caaeb22a93f0e7736f5d9cc5fd67b7467fa0fddf1626c2a5a7de7fd7469aa707ddb35bfb4cf5d55bb6ca86c52fda202b0e63b4a883fbe369a92a09ec9e959d7db45fbda2a54aad064b20d31270ef390840d8ef7e5b31fe495bbc939653775717875da7f5e4614ef3ab3fbf72b911f53487e9a9394dcfa849fd86acf3588f47c2ccdc348eb54caa695d1c96791a1483c1d854d89996807b9a7fbbf202b0f31bf361d9d924b4c0be9d4d02cc5b609f36defc26e4361f6fa6e736219b79b3ddcc9bcde6b8bfb990eda6c1cdabcd4f5c23db992add34f0db2de84c955e0317f220735f9c0642677abb9d20e0de769ea099b8cbc47a2e0e7bad266e9e0639cc479be939cc0c32653736ccbcc16ce60de63feec11cf7364f6de7cd5c61b9dee6f784ede6379bd3ce54e96f1ee434739749b7b35e5cd099de6c270838dc9fa8f7e2ef8783ef2bccf5c5c14e72ce06b72e0e7bed04d95c5c05604e73b0fc80e630b7e505604ea3398d463b4fccb0619e622e9a874e435189b0873a7471cefe605e5680e635cfe50735a7b92d2f40f35acd6b27d2c5d568e609f66be7898ba399f561b0f3a339769869bfced39cc663d3c02b3bdd5c309899992a89a54ac2ca1e4bb2e6a9e682d91e46f3d41f56ef1186f95892decc4cefcffccb7a39ae333384d7120b08c675be389b0dcdd3bc9497aa89fb98f49a290113563a76af76a61a473bb9c2f37bda19abb1695ef3342fe5a51b22f663e723502be8c45c1787412d7c643bad36ed2401e634af9d29cc6b9e622e0eecd74aa2e6e3267799e479b0ac8b839d6909b6ce87b570eb6130580b1b0f6bd1f430af4f3357b4789ac3cc148f791baeb04f736bea8ba3113d12cc2b0c0683a130bf6512ec84d17ca499405e33b78f967c9930af9934535fdccbc96b043b53f25f1be6b5becc4c6d3133dd9f7e6c1e3bcc4c32c96d7a3ac5952695c9957e57f6cb4b8f1d09835c376b0ba2031b34555f75689ea04182a6c8db0a60aac71a6b03fd84d68a0ac936b4851e869d622728ace309082e123a760cc3351ac5102834b18e3d62e7e2e2b24e5c58077eba52a7b5d8093b61cc85a77095cb75b99c6cb6bdf113fc043b393905a380a8b44b178b2335c9944333030800089315003028140c078442a14894e7ba9a3e14000e7f9e486a4c9b89c46192a228648c218610000000800060000cd114b100895b9575f0b8b1be65c72e9f9171bd12c71d5069bf713919645c5f5654b58be3c9c901eb5c13aaa2f15b1e421055c97ce11f21aa8feea651e00c098a40c0928ea93a53bb680a12604715e46a85c5beb18a822a327c72f52b53ca6dd5561e7eca474ffdf68c8cd056a6dd142bb59fb9f74b06b0f8666e608d91d99a422f055a41577adc038a14435f4e84c36f8a20d299d07de6aa605896e38b4069e2536149d6ef54deb60fa8ebbbbdbc23085d769d3279e516907e78bbd22004ce89ef0984ddf9701eac4883b27fac324cda4dff72dc8dd2c77dcf32d6b51211a4213195bf9e64ba60c9c43690f02b9c8d888aad2cbbbcf92bc083a69b09d04345bc25ddd261874bb371dc3219c5d0dd7462ffafb251b7aaf06fbab26f986f49c3a9b457c6edaf72038e54efd7acec6ee242b53b7dd95ff04785e3a0361abe1fb9785aae0ba70f1489a0c82c64e0d5d5647e2b8b1b10e1a79fc88226b09c6d94bdb650be017ddbf54861e9506fb0092cc2cab98aca81bd7acff49d1bc4288d5fb209f99e485eb74e27cf27f5a2897568c6c8f486f5c4e7379c81cabce12f7253d747bb1b021e038b0b0e830388d631f20e856af65677c1de43e3edbb6f11f4a7d6adabce68e0b107c894767b888d7d9289d94462afaafc70c5e30c218ddfcb9ff4f55f7ed0bd147d69752c12ffd00c7cd0ca93ff26d9dddfcaffdebde3d304e3600770303771cc76d2f12d1c59f9c6d99d343e68ffb15c6b1078d91aa7b92a0b8cd33baae79f27032208001f53c2a40a6895106858f24b5784eb330d2e66bfda3ac27042dc69c4ae99a750e0a17fa1c56c7d7dabcae65e381cc57a317f5a872c96e486675aab5424b0bf8fb99603a1f55a6b693e8c52191039ac3dedb4b9229f69926e1302eebb9b572f0038b500182643e142532b93686a7a84b9e4673fc2a28e6402a74b551020a0da2355e2a002a0854e7bd0a680a76b6a073dc9101977f2cb726d6d4ed5d9024e9bb9dfe77a87d97a816a81e86a92840b3708011d2b70bfd423b9eee1244bf73fe16f2d854cd95e26e397a36bfcd2675c870fd06e27486b83cec70f5474b212d13ccf8cf630919556dec320ef5621ac785989403018179c09edfe44355e1ae358e196a2eb079ea51e9bc181a4848f250b0537bd6c367d819e6ddd5c99645e71a346494850ae61c0d351139a5901abdf9bf0981b61934082164cfe67969583947fb0518b7a60c2155ea0ea1f9ffd55fbfa3b02b4cfe37da8bb724c1d2bee45805f0a7e898ff449a7ff105895ddac373537e86216eeabd6f5afca9b0009e4fa0553199a58d1e9bfc0f8ab5fce0c516dbd7c03ae4cc16d05737bf9ab09ab57c16e8217d33e12ae602c3618f7d735ca5ca7fc95eb2b619c928edfdcb2d5278a5cd156d35b4612e54a3b56b8d8e9b87fd2f2fd33616d65c1174ff9e6c509a9ddd24dd96f98595af4974d398497c8e4e49c2f59a3d3b709e48fc8ffe69589e206a6545581ac2f752b6c067e4249bbc65fe9b12b03262e146ea96763b5bb9b336f4c33dfad784f1ae8289867262275ca892ef8ce824c66f36c131b42f5c689e29ef8905072e19e44c171ae36e3b29971badfaa21d00f5bc9a2dd0f83709827b30809c7dc73dcebbcb1c8ec49e829ade3d9401e39d52ae752be5e8371ae74c55843670f6f63e697de7cf2129d3a52e16ae43f0278a8665dfed2037307b0807178147115e44a8dede68013a5fda93f9b2079d503f5055a44f99f5b98d154746176fc23b72c1f6373bd077053627578605520544266df56e8e7002036d2712922ad0197bec074029cf6bf5da464b39bbf1f936fa90423f8a046fe62f6f0bee53d6c92c5f026ccbed94b285ed458c5e5e76bceccad250d0f5b53f1cf18ec8bacf8a0a7f86431b418473b42967d93179a1566982d214d12b37ecc526b31c501cf64df222054476b102813def930d57d1e44592c1783e934d43a85024e5dd2efa6773fc5ed2634a7be9738581a2ec1992d9ba6dbd6d4112a57d464a894b437965eae2dbcf1d489697754a557b5b53ee54639b16802e74b49b97bfee222c2da1909a321aef9025077f0d02ca767dfc0aa34b91ed5ddec64139fd51251b574a3cb92b1d32c992ba5efac96f97ed74d198060e2d80dfc9cd87fa22c535d0d59f7617152156c01ebd434681c2f2d57b626ced56c88d6521ac906a0dfda0c2d2d9de3b56914d738246c218ba01d5656539851e044e7b1225a5dbeda55626bb058bb1d1781c83d89854475730d4ff8f22c51c8a8277f5bd6a60c1497d54587897e4fa8c7e1eb6a0cf6e561d7ca88470569173f1b9a9ea0e046a047e678e28c7817aa00aef25e5ac391d9eb576af400988fe15fd3ba159b4219c3ddc1d87e09c53bac215dbd5a10654078d88ed66a2c9a02f17f8ed027de61db159682255edad58c810593c0d23464dcf584d35f9c7ae25863c206a4a07c65381ea05887366faed6b85c21abe03c0b1237d1456a0addf62a664e2713d7b4ee3f5f0bc43b5cbf34e8c7aa15436d351f6dda320108a01fe258432f61d01f967b6f5ac4f94f33af928b6de7f94cfd5639f808ea258d9bb24621ef5be657b26d60547c1a23dd91554de2f2106c22424616426ca7f7c0313f0d7de4894bcc0ac439f080a77214ca3f34312922d7f14f2888d6a2fe4f3a3763798b3d23e70bf68e6653e2bf4af8bc8f16cf1e5b8052523e7d9277cba8ccc224e260885cdb6fdcd1695dffb5d129219724083f36243a4bccbb84d6862b6a7a28244bfb0728f426685c2d706ca40b01151f9521b62b021749747cb43e02858718cd4ad18f12890f519ce655e6828bec192d6d5e08d51fe412adac969fe0d84f327302a27e80e1e2e0663c4943d40c757ed3cec7c3800adbf48790b942794c444b15089737606305d65ba8eadc3e4a6b029c6520586d9605f93f48aa07d14d696f0312cbc33611653cd1f5bcccd2a7b4e968116556c18a52bfa89c36b714b5a0ab23b22d6d707d7ebf33faea441dc81c21f2cc17751a42d219fa717a03379ebfbb4d8165e0158ee7fac4e5cd8da7f3b797bea3c5e26266065f3d7f84c2d6c5d643b01fb1a13eaf6897c3a238a78feb698f5c046ec377b759a6e873b1a2960e2ceaddaafafabd148f717f9ffe232b25d22e0b5153a3ce4008bf7b61fcbb6745fc77f9188955793b8a072faeb0c022d624dfce741689cfc801715a026d8e183b20435d8d605a44971941ccafc767a2d7acaf227ac86851ce93ffd3584d16fc555e6f5dedd0dfa2aeb7ec9114a216124150252210d3ebd8b081addb1d047d7f103e03d8cf86a5dfa2c746dd1220c32b2a0435945335ff8cbac33c93e7b44b01005e374b77fdecebaa0a178ef3cb75d6cc1c1321b0aa07033b9ea206d883dd03cbb3f8033b239c3412240451051aa0b705679e0b2a7ef9d4dbb6af2ff324824adf90024b529c0993d3a0be45259c7afffc62fe5e813258dfcf2e9db0a1fef5e1e5afd58f1d591d5a91549df91879c7345e086c51820ad327b08e7cc62df493a583ca4b673517acf925f38c71460bef467dbd5c39aa527eb16fe67ca062f65641b38cc2cdf732a018a34ae57701aabf717fc53a2a727ed8552c3560d68bf22675d9b01e6ba04f40c30aa5cb0f34d060b6b220356dce8bdf4b7ff4c71730804a3f9e6ebcf7629d443b0c9d90d362682b336e26bba6c0ca7785449745cea14ab7fe77766f1fa2d4637aa44d3ef8bae01fa58d2a9ba6ea736a380f2e34c7135350f327b186c95bb5251734e0bb32f5eea2b80304a4d7105051dbe527f1d427a5339c40e537ed6652c67c17341ae5cfcba48bb96a29dfdecec49c431004c98b094d5fdc920624e39d68164e03257d7514dbb8d308b49fdd79ab37f5d198b729dd5dde7c29f12a10b85ff0cc207332cdb9f8bf9d89fc8ab6666517397224b1b334141873bee62e8513a3b4d6bcb13d9de9ceb49bcc125b793410a2906ca192f97242ea5d37020d2e4724ea8ec1b6979a93c39d24084c3245380a38ba4661f1c804d340cc200b2b4b036594a536ff5eba01379e03c0b0d73ad27111eda6e23a82a40950ff717ba172b95d281a13d532365ddc6d9247ac685b829d6a84f88d65e283a94426363c8aff6c21ceb5b38b3d2f405d9030ba9c164b4bda18d87a296793c4ba354056e817ce57ac914fa9e5d6edc1bf81d4d9883612f8d4d6bfae3ab8f7e95c9c046480e98ec1c83519d569ca50d6bde29d040572573718edb68dc987d92c770e5f6aca648dd09d3228e31b8bcc9c4489a468ae1e08133d7b18ce7360702b07b333fd727d4cef98cfef13331a1e7be38d8df46a468a8dabdc81135b7666c82505833319bb5cf487d4cc271085474ab8ed5869b2b83a667562aa0f5bd2c61c47f412f305cd87f46d12e6e1203c32d2f30d06b1792d1d560b2ca91da23d8f096cf0c1ffdd5a2fd36d8cb7d3ccba762bfebb834b06bde6a079944501bdc2052b8b0abef04ef98c8d6443de1eac5d0cf9315f678820d91e6b636f272bc34ed041f24b8c9413f6962768b6369ab8dd9a5f13740c9bf0c861a27635dd6c6b5e017c56bb84a04fa253ca7a65ccf769578e073b1d93dc5172a90ec3c939091832e1242b0c12f100026fe59b76258012f326b96e9cbd754bf667f26d7af713624ffe7bfa151fc7bada37d12e1847183433f310f1ae00c6dad5a0139b3e76e199bf5521506c0f757b02d1122f39475b9e37d4bdb2e42ca9e2d1afc175899687a8e98f44eb0c17923dc19296ef0a8d3fb8840e9119e69aea4a58aaa1f9e9e87c10c061782a8c91ec7a5ad468f17b497fab11a3a509097710ca1bff3e41f3feae77af6e9c8f8ad13c06e8ebe205d5cf63909c6bd02124ac21f22e01d4751225794753b7ce59d1715dd4d22f8c922f0359888f519895ce53f45aec72e59f2cce849ae2e78ee3b202af20fbe82217e7a8a6c0fdc2725d1c61bb319fc11bace174be74490499bda98df63204dc73ffda2961a33a30e2b17f93f8d7ed35bd14bfeecc4aff151155d20662555dbabb392990b22fd9f1d0f55df5110a0359853e7993e70ce9bebf57123e1bfa12468e07b30199118cef957922ef19d9eb3a344d63c21a5129a86be5a2a482fa9a8f055aa05eaa8c3b4e7ae275e54b1e05cb5a12989a9a85e0e06404f16eda52811416b11a09275768fea9945bc4918922abae5e344bc9b79c742dfadc1f961c20854e2a678f95ce76f680552d5a4c463704052a930cb1fff5473f739414356d834f5bef171547241c1829801574bbe0cb56a33b060b61a98b9314b941f8f06689f84f5da54a1b36bf6fca6f2aee9be5330734d148c8ba71d548d6fdf67cbfb37cd0f3751328fe201bdbab883c4d98d3f3eba677b03ed2c18aa0c389077c1f4a11eda43d8d472a3fd4ea6102f10f09eeb5822b4995c41dc4d342792658c4c62a81ff13dd953a65e4d0e2d04643a19e83bec6f535da3a4d00265cf798cc2418503d94e8581ffb0d36cd7747e4dc3e687e32bebe4a59b68de3b15b1790277b2e4dfc67a060485d56207db9ac6eedd6c8c8a9df34d2d30b66bfe37eaf28644ea1dcd5413ac4f0580cfdd805b227068ee4dddc7c1b39974dedb22ecd38ac27ca44cbeb21e4e1f0fc8a2ff689427ff265ec0d5e60b1e5f08884a9b6a00b6d0b0dd8a7f67b36d2e8b4bc1751767b6bbac4f6fa450464e8c3b9430dfa4b3b97c2477950bb4aef53ffb8b878fb8ccec0ab029102177ccdd130a685faa683dc0ab498a9128a01675cdebfbdcbe81d187f016858a4eaa94f3ab5123e412a488d1455c7417394afdcbeabf64ab47aff315deb461ec189d1f6c51b23c87f227ae1125fea474e818dd5bba1c149140e339ca56fd413fc93191ea91d7950138f913eba3235a457d73bbd5738903b718e39af38dd65d23ae8b1959e0d02ae33e1a8c35373d48364f7b852c414ef700a5db43036d47e6a0ac0a16d86b4018d34a2ef58e1450804fab4c9936a81d6ee50c40e6a9055c72d073d64c010757198f434954d3904aeac68e003e17ffefeb24f3745f134860700bbe0a6e59ecd46f1f0df402f4a3258622a758b683a4ef4cea35ca9ce6fd3e141a5b29030f8d002a90e72d4f5b7d3009ef16060178ef218773071bb6a68b3b8f8d317ef15e4f35b9df0b8e67d5facf4fbf98bfef3b90f30a57f0401271645843f45eef16a18c5f71444578bad0ed47a4834a80eb4373c43b60ca33eb4a3792618705c26cd1a57c5f85b8adba5160a2e3cd0383334e2eae3bc81f3def938c76b9c028b664ab2812bec602ec48ad3096c803ced0fb9b3e425111c898cdafd36f2549d14cc368c68df874978a8ed045450ca9849233f85946c5ba2fd92ba029912a838239e1466c3f15ebd77b1d9f70e9826a888124bf20448d2fbadbc4c24ed37f99eaf018150e23269c68bfa66fbb8cadbc2e6ca0deb70fbb4b2cddba2b1826ff1903319562fdc8d68c6186b8f3e2339d343e45c2a52ccd195d3abffe52b518d901b39836798344ce216e20fb53d40a5bb65fb330267b576a53a2c540140e732585ed0446ce3ddf5379f4723e34f8858f75b8df848c04a09ee1460ab63539f2529a50117662a4968e020c571d063b577da5f5156ceb3114d1767b5513c8f0b7fdce6f30da63400f469e247caf22e1f1fc21d03833c35b6310d01b4e33409f0366534275bbdb2b9910bef5560b2f2da2f1eee3e2aac79334b25e63ef8b4b603c62553ead114874d577cf216ed5524ddf72be3d53865833c9d14bc116780e70206045e854d0bc4dde07ff4f6a3354ed989d61803ab2736905c17d5f0c58b00fb012e066d03c34539654cb5e5910d051af8b1a8b1b29befb95689ee3345ae146838954dbf65a8288b6385b7be8dc2e84dd3053dd5032c0feed55371b452b1332224068a111d6b677f9d743346a470ea782e54cbc423ed40662f403a38bff0ec27dd4bee8f207bb39546b78be252bf24d67e2d616b9df646d94de3b4a9f83971af17a8b200e6200edc0d706226c3fb8a48e3143d3b89329208891292619a13b3ee37fcb204598295a08a098711f4c0e63bb0f822284ed26c430976650fe09f5b03f043869e8b855bece8fb81b89762bdc7853170e389eeab192ef41f3c28a820399ee0b6c7d165172f7e40afe8dee5b956839e04b16ed31733948f72f90226d45f49d3d3a9099a926e83272e64345c1ca80a91c50e3a30333f83abee8b630e51427fd3d43f71a8351082da67ab21c63dffc30d537ddbf893f27df0ebfb53d950ac08ec2845b20f35df4837705040da3679fd73588ffd0f32ae94f60e861930452824412ba3793499fcc1cd5644f99843b0fc9bf75038b593f5f7ff5ccc60bb5db639ae70a5f86759388eb2c1870553f24412d39b90fad4dee9222ab182cd07023719d3069c38ca9814eb174cb310550881da8a89de256c675f023130589d32dbbf07eac241bd5642d38e2aa4b7ad0e2e09502648435b248297b0b9ea957e4608b25fe64d38a830c0044ef942fd61d77134c8904d747ce0ce400131f2e1248e39edcbb242125a0c9a5ae524da34827697076a3feb01d08b253948650a643fb5fbfcd4b7af4bc201f46598f3fd910fee6722736a94ec1c3f8d9af3b810dc05fd64e6333632e205d22a13bf52144410cd9b09124cd2bd1d8e75b09dbdac426d9dc58803422d45880244f9e3dee80b2739a0554ac0979ea002567c0bb82ca51402d3c8deb47a49634613f6e5755906265cddf90f13a7b50f0f4cb083c5036701b10e3b1f8584d6522798ab658b109f889a9a818d6c4c5a456d8f1a043a49f2155f385014636d201f90dee733865a9869b380ab2e1dc8283ac0ffbc504d38debe5485621fd51410f4d0ee82b55cd50603b03b0fc6abcf55b24f803e2fad2b4825ac1ad15d9d50510d39739ec054190ad0ac521033e6348b9e898209fc44796a8b95fe3de7670648224cb89079ed56f7babf969141343493be1e04f9ffabadf915bdd41a61e641e8f52da1d6c8fd5bd201410a9db43b04202ecdcba0d61fda406dee1e56cbff9ad9085764dbeaa872587c532caa669c92b7d56032ab72c2f715309ca228b029194d000db613f03f1eca6d0c03f67ced5cbdbbfb1f07671786d74306e1f0e59847e13a90d29cbf5ad81e00ec5f2c5c424baa1a66141e624ab2b401a03fb423c2534b7352cbbc20d919e4d621b0332d452a0d08aeaece7f2c4670529de80a9e746a5d4cfdb23fd15391ec8c582c5bd653b998bde732b09eededd578658665c7283b000967a2ffffb56cfbe176c20ca860542e8c45c48b83ebf4e759df06d29570ed222804aafd0f4a9536f3df8ea6f19dfb0acc76e0e5955ed9795240a3253fafa1b2e58abf791753886a3a47f3b78927d974d44cfa6c19fdd1d5ad73de45d87b25d091cdfb0646108eddfe58587a437373a3b2a68941913d422be2d4cdeebdf757ebc373dfc6768b63eb367671f8f5e3f72e8c374a8e2efe1e7af85f082a3227d6e396cbc93035ae9cd840d4183f6c096870c768637099aa57a1f3c878b8922f0b88d0ba7f1a1088ce51f7e9d2e86c985677fe3b30f64d6b1e44b19b4dc30af8665eacc3d707fa2af1223de75ee56a45e01beaacb0a39b072719b8f28b5679b8f59413f7049d05af3fa3ba354268a446ed92a38c6ba1b5af3527ec27e3531620099c463d17e0f1e22f60061cc625f7a323bef36f6e0b2f031989597a0b1d3e05c82c62d97a3b316bdab19a527cde01eec835be28d872a606d816ab054f822e6aff5f6f98688529e3570c02097f50d42dbc910eb5ff3346ea2b354c6d7a00968dd4387dffea51a9613d269f2a942c204aeba806ee03ad3f03b0a15fab75127a7bf815c2a8c1ee2c2242e53b73c4b29a2b39336e9923130d5bd069bab517a5657f132ce75ab1a36b687721fe3dc9b50a7d2a8b466906a6e029da161344f8d5f668b407d2a3d6f6155774add2591ca57f59990b12d3d1f5965c86391f8ea6385acf764cff0310d9eb17ee8c27a44ae8aaf86095085fe0adc721f7ccd23df165f52e3e87677e4095da7cdab0dd25acbfa376335370c2cdf71fb5f004a32b18a16e3ed000b4c016e2d437e367610994825e96108a0666eb5cc5d9f6f97d54e87599c5cd116ba84154c2262c39b08af9c73701c3d8a04da29cbfe4cbb28f70b7f795fb8576ac5608b081fc0a30c26d9531a9685af1b6c1eade6519e10681db3d945729f89cc6f79ffe99201604ccfdd53aefec03658062e77a944671fa5366ff065f0561114daa47533261536f9383528fcd6da07442e62fce91a8781c252ad4c77fb71ab9e54221effc7cc7889b28812e940df96c1535deccd00b8aec89c19d6e7a15419976bee9dfa1e5b25212cf35990b39b41e0558f1ddd743439e589b68e0ea01452296e6bea9a6348af650001a5894b3ea6720fce18cecea4871647b74fed524322c48928c8834a5fced3d78f734176e96e4bb7fbf3949a1e77ffba80692a032e89952061c959d49c46e4633fb07229758a412fb8a4983cc5137f523a020c6960e9a55fedb7c6a2ae1ccb309828d73f5e0866bfae1af0a190b619bac44df7a1d5c3734557fe2628d2786486debc9fb49e6b69d3f0471088ccdba64aa355b1936ec13755dd6336ad71e05ec1165b124c9fa67aeb330a0588edbb5b19b30dc10052072dc98d8d71f5a2d53cd15b97cb5dcbf42944205999e890a89285a2373f4844292bcfaa242703b49f4ffdbcebee9b11033d0802d356b0ab69d176f09775e95681028085cad30344a8ef310c95acf4646112478defacbbd657c13f3fb236ee46710e4de56ea11525e627b5cbf901f32b677d6c15ca6a1a408b06cb2855b991c462c2ce377ca5ef1f733bf66fabd52d101b11a6388efad4b1aa5ed24cbd5bcb9b4765edf088ae00edfdd855fcd0aca63fae22097f33117817e5bf82b7d6b093cdf36c68ab5bc19daa1ed367004c86154448e6d026251d08c2c3de191a0d9504633a9ad277575f5887e9500ea534def13c1d4897fd89a0d5100e1cc2db6e5336ed8fb95261883f71012fe99fef5387e55f753d324df6a1b86e59bea753533374a15141c67532b52f1359fa9d1a878d85320268bc28e934339537198cd8fda5a7632bdb7e1b90ceb79c2477121d1cc05cc725cbde6b885d41b26d83523afb7c0ee25080f2aa183f2dd3d6679231fc111e2359f1dd875f1185eb308e92de87c2529be7b70b2955437b7a049ed9a57d51a4157851b4a80f5b6051feb76c0340e00786581b6e07e64977a96eceeb74e7bf46a7c7f1b588cd083f7d1c0f94c67f9e30e1c00c098a6b097aa5780e359c6a38cb91a61c6bc635f2c8fa203b4dd8bd2b10756daabcd610b35bcc2bd37f4d8e67eb50047cfdbc34e6ed2778b63f4ae7a68f0ca83a2bebe150c69b44b867ee522764d4248a41121e5a5d31980d2382a45aa473351849f789b2bc10da5930c6eb4a448b3124ff94aaf2e18bfb51889618cc969f956176a63347cc8db756a4aa5528a387dcca43f99248f64a4db8e24b15d66c6d973fba788aa79d115f55ace9f03a6b1737262b8b75216be40daf25e4245d89a7489b5884246daa11660c2075ada0ed8d20781a9103a9c10b11804e91cc2d789888b01fe652e82f297dc08e02bb322f4f9f0ab1612f589e95fca1603868d4efd8815e75c220b73ce8a786978cecb7f50b9c9cfb6b7719eaf509a213b2bd5c82c1b53919e012417d451c179a9c8f3089243ff68644eb7b57e7c503ca16c5400dce478d025e8f88db8e92104bcb17fc7e10403719f4fd81601e96dd84106e885fcd505700aa0db04e89aad07c4143d0a9eab39930dfa451913b34f6c8510402fff207c620b78a600d7afe7170d3a26c80ecac6bc2e370640ae146430c3bcfac45a1fc91ddf1fe99129470c1e8dab7aef58e893e69151b458fe5f8d800d1802341fc12123776161dd7aee936b4c454a1054316517a2e831a64482a448c5ae48e847ce2e6de9439453eee52dadac34333d0470f884e4a2e5a78b058141dc0891c25676eb70f9c6c6f537b31e2ae88731c4b1404732e1a56112a98c58d697b0ad14d9cd0dc49993184dabb832d51bd033b4a2bd18c3445b3e6bd491303a35d73dab9c45dfa9495b43711ae170dd356bc3f579273ad6c092996c589e6dd20e0819a433ef07086520b0fd46163e6f8d385580309482d1dffc255baba635a84fca42015864c11dc2a35e6ad9f8d93c5c51437a210adf5f152d7a69edbd015a74a5a9bdb0b8c5f38f48d2a5b61b6735e45c4c6684f8d2feb797debbb7b44bfcdc1b27c9f3d2ddcf152f8c5b55e2ce32f5ede26be232d43f1b22ff3d1de9342cad5779cd9f03d8b890c628d49e24b844dc264ce93948130486f622f5e9a354be12325840376136a27bebccbf5bdc193edc84793a06dda58a6a3b5432c83e4b44a95d4aac4814b3449f3be628e82c1ae13a2fbd8da087aebad8bd1e918d99b3467b2f100b6c93e3d5e19f1d6629b3edc23ca3434fda69596d804884a21a204799c8c1c21ce98944cd34e5a51875a0850677502455f8f3fa50ccee839aa80d9fcdf64b907e5311946800352f2f8c5fb06054edd29437047130ccfed71466d36585d42271d818962cace866e9a9826cffe88fa1bb9c2977059d8f13ca3a1827eb997119d9bb2f91edb3e955688344dd0c5cd73ff3be6df30729224efc4c917058945e9f15adeac60c5d3d3fe26501b11029986e9ff5211cb8a05685193461b966a7ad9676c2e8549ef122a467804d8935604b542cdd41574beb55b196203d88b17015dea32e937ab3df28cefab6127f4db5b06cc6f7eed06590400e9dd021f585f8d3a24b61e475c010fbe24c0acd6bcdf233536c2dd01cf67c49baf94e388de1c568ae4965a141313d3f122d8149602fdbc1285d826aa29ca178368d33d9fc5ca04f91500df438dc97cfae01e4011d6751249c189fec816138f955a25db7d52d6375e56416885693036eff23723998fd43431b0c7e7eb51b6f135cfd8fb1010a31488b7ef97de45e1349c99077e20dce2c33ac3556822b77dc1e52d75a6779dca2da5e3979830e2fd8db14bb220cb9341594c72df49fca264f134653938513d765d2385087f7c5004138889792718cc2237abcf59893790a8541041f8c8194d03a2215b9a4793eb0fdc0b9b8fa7194dca9047d4d00643fa3bd60b2c461eef18dee42c2e2d93b2a8b88dd467c71072fca3633e455b22a7ee6813f2f200d962d9d4a8d8a2f03a761b4be5b2934c40642361074d409c585b8cbd2ecb4921225651d4e89c522a70897c42d9558439ae5dd59387254b4ef4cdc272641381dae6dd3c4c6b408dea60b6e1b84ac3b2cfa0412f14ebfae7c357a6b8fbcee16b9671decf168c605c09ffc3e9ccb2410502d62133d2462a6819a947c466452f77e733e76cf0a3153dbf8f5854bf8344f4e12368528cda450769ad7409b5d438f57442e887a3a5eca45434d2ee7a0e2b3efcf61f014a60e99c27186cb5347f03e67b1aa75728742ea2bdaf2608ecb464669b3c9a43480f5fc896cd5d8dc8a01840ee2d64d15cfe5556b9d88344a14cf4dbb60883840a555bab5fb309fa2b2fe87ca4a74fa7602f26ea20234aa39bd711f4ac3af6a7a42b1c4333030d9f50676afb46c370fd1404c623c2bf3e8ab3b640b399a81ad001668a46c3f5864044d229b506ef73cfa2687d2ce0b839abd21f7e6ea52829dcf33a023d00d2342273f8b6b6135afde0f5406a179d5287e63f7a446d3948858a6f04bd46e0671d057f3ca85e03916c63915450396dd9c816f66b0bdd2d68202456b75891380d45258ded2159835ca383e995428f13cb57b5665711b934636a283e98377e9f9132af3b5fe23517452ad3780f9bfaf5fb2fccba808ad6c2ea5588b253504cca52d8361a33c27ba7e08a634793481948529cd252bfb26d12c720ba9d229d1bdd3d0707bf235a087180609fa20410daaec93f9922cb8fdaf5d364b516045517f5e3ad68bde8b49df85e634c21d5d4235e8e4a3fa4afd6ba51b40a342327eec3a801e3d53db231504a60eb70ecac2499dd8b157cf686edaa0d14ca3f0e0e92f554d08d696881738d29ac4398735b64b05efc6728305d072b992b6ffaed2f00ec5fbf72c47b77d65e85b1ab92279626afa94df9d2beaf3d1bf661caf5eb26dbd45a7e0c88d8db6a5c33e0b38427961f3037d0866643586cf54aaf97352f19e192aa142cd305f548126d25c69a5c0624f08f30f61cf7f9df36ce589ed0a9f50920d6433788234bbc56debfcd7b452882f37573e91445009db2fa1f875d6e990ef1761a1d041ae6f0c2f0655011522abb776ef628191e86c700b89ab3e0dae3ac51f06073e34576aa169d23b0142c9efd3310289b898ddfeabbfd4cec2fc5c0510ef1f7d16dd3b3c388fe70106de04b6b65ea3b5f261887d31824375b8520b034c72db25c5c15cad061f5d462e87d270a2dab49b18e11d5fdf0d69265ce99f9372af39a0cb3b70700bcc8787b22523142e48ad4c78b278871760826d4e3294e6ab4d1ed085e73fc8ee11d22c8c456161f0cd181940e22b5e1c5e0a71535baf8e01cfa11f437b9c72340864c211017334ad5426dc1e382eb481c4c0e82b1a0b20d60919534700946c43f93f046d81b661959bce7419fcc7c127b528b2e51441b58f835849b9fe8127ac5e6e06013e93ea9526f53472e68f6da1b6b19ccfdf72aacd01318632df4d7c49bd867056ed2599b6b800c4010ab93034da6601c9198aa0edb9a9a9e954880c0120b81e21922039f58a448d19e89d2687d06bb7bd403d037ffe50caaa59c21d3c670b8f960e081e2e9ee8bc2c9123a64b2e5e2d08b34846489aab4876d68eb22499fd8909bab87a9f196525381c50a37265978af2368d9cd6b975267c83aef28934507c054616c608c0ce5a1cc53b1bcc037b9c2a54b3e0a75c0b699f21edb5da03d69a451b91adf325ef8bec5d18ac8dbbc7c85f1137352105dba435d90da2572038e72b80ac66d05c2475700fe2fabb4aba06b6e6fa0d2b0dd41502bc4815f799e2d9ddc47187f67c7b444d82fb9ac273d8a7ac70a91e2974c889fddc8a0a5786973ac85e7ce294588bad34f871831c7924c209f2848398a9bc1f0fc968a422173d4889cd28289ae2a73926cbae33fa774681e835422ef6a639c634dba2a37956bbd8be4862189f05903ca2d8d8e3bf9eb320f45584560941c7adf331ca0a754db52144c12b715a8c5bdebd2988c4dd1db18e87ee9c99c0d8c2e94c35d2447cd17b624ed62b5a11b8315a7590a6f1273d36c7cc3e07f9858c127b5e7fba59cca9e7a47db1ca48d877ecd1caee62bbfdd2d1c0f9b6748b41398a946949abc02049b3109b91bcfd6420f75c0c12018e50935086a7dff10c670bb423428a2b3300e9ccbb60320d49134753d645c42c51ca545081b1fd2360ac19fbc1862fc7a1607d30d437cb01b06b6bef5cfef93196b3d3b295e6def7ce411c88a94ae569ed6e5c56ac58fc0b0afb3ccecc951bf1a345dc60becfae11482efbea9e886bb8245292b335b3e4216114979d267931842d2b7ae64b5a7d4ba5fdfb859ac1272e1d42df0217a69a19039c5c5c41ba334a39971614a5be8b763af13a597132aace28857978276cbb22ac437867cd456eaf936b86bfbe5d58b35324384860e6e15a5373c80e3f26a297434a11183ca759d551d82de74a8535fed926532215cdbbac0ca0ac1928d4d44a867bb694d0360dca30a0e603abaecc19cb5a5f531f2d094043af9f5dcf538c64fa46c378d8684bb7fff8e23f5f9af1fc5166a74fca94e205171eecde6ba94c022c16faece7501b2eeada9142ed004cabf03626848976e2894f317c8b2aa8924c395738a2084d3b34050d936e4346c1a145d8776800eb76fb3b374b5a7dac6a01d04b6b070839221ef95c44908be8db727a688379873cf75c5cfc3c233127070d13e13a42764e048423565d523c85782847a2c6ae25aaa4d77122cd000a2ae55be0922581fc78720ec0254bf242cdcd41b4d82522a7ccc8c766a56c4ed3b0602b7276c4c76943725c11957c88730baae70431670ad8f3eb4a82eb426b9fa40690631e4ff100bc44c7783aec89b7f6b6474b6474a694488761d50a57ee3318c916c96fe3faa6233aa4eb3484822cb1424323f96d667c44c86aa58a15343f9c982bc7146ac0f8c70f1ba558fd3ba9d7824ce8086c8b5e47a716fb6489bf49a723e087badc527283c9f56e9b2fa1e77de2301cae32906da01117a6527687aa6795e28f74670ad1730d14f19fae39e2b440b0795db8cd02afc9cc0aee0704b3eaac2f33eb62e210f4e3d70de02c600f2c43336424603b68440aa79c6349042ce717ca6cfdee144459d3eb6ba24ae570e71ef6617f1fac23420afce32e4a3c843bb7b7ac474f08c5f7ab606f749004017d528ae808ce01c904291381dce1090a8785b2a890880bdca5f63822e413f85b52fa3b7b7a62370feb577f722a5cb7a6e50e5852f495f9156f17721ecb672bad248ce53fe2e6ce5fe8b0e4449059384669439ecef346ab3fcafb852273874aade00c14b02ef8ed8c027e236674a3abc6d4e90a58f93aa0bb61a096464183e61a810677b09c43ff8dfc037486285bc940d083b871348d00d56ea70da6919e032ba9c77ba53bd55f8ce37df4f6b89a294c97b8d165f4efde6fae0f0967c18257f09bb6028137c21ed5a41bea4d36f405e3047cb10d2316985bc49d0712079884cab8e51c47bab0dbc18093eee69b09a6331050ed226b7f40a70bd9df36f6d795e3e3455c312e3c57c8d5fc850ae813610643bb4e407c4ca1cdddedd91476783ea76527a695155a97277365329e94e94c815a54b130a5be5095e74cb6350a5b4d0f615725778802d8c9b1cbcd0766ee822ad65171fcaeb5cd0dc45e7c3a262800362fada100f85bd56984a2d535754bfbf1037a6fecd6922e1729b7a26c2bcd68f25fcd6d1d9a2b7d8072deec826d68aca696069704e1baf7e8712f2b423b513b0c9f1485c7079aad8402ae9c3eb84531bb5633b5a2200c6f79dd6f6d155cc174464ad3c9678b342229dc8f7e576a1052fc55294fb7c109121c150f2d375fa95dd7db02816efab81a40e6bb2fa5b34ea28f1b33beac10646f3dd158480cb17dc0326e86f881f6e08f19a4b5080dd68004bf1a9b61c8c7659880f152e38783591769c5527bab7b6d150715d456bd735b32333222d0bbf3ce102b85e8df2c48b0fd43c05982938df2225c29c8fe20003e74db8ab522aad9e44807139d4047081895b2c21e16f17f83ca069ab11cfb33c3d2b36fad9925facaa0c890e06e66c788da57412114cc5d609dc81cd15ca3890bc665a33a6d2bbf39cf2092ccc4588cac73445cc121c487e6a4d224a7192ab843790e3203b6d2c391eb4588507f198ff3a55e96fa17eef28d840e873222079a0db7a6d2700389ae82c93205c113567dbca4b0e5ad3c187f9578a889138082f333d2bb377741aa07b50f9b44f69700cb820a77926bac2f28058845b88beb932fa216c23c637dec8d80a4170ed0dd7920f0237b117096b91cde1d62db484f371ac0ef6272bbdc8c511017a7aa45254a8b4c2c217be5155cf5415415c913806b982165fe70220c8aab404eac74e54b49a8428c111f5fc023f2c9fe770b73461455c32f4eb39234e5d9d1ed853d7436514c54f4af2b80349733080620b5a2ec51d19daccc952caccac8f22ea413278d6081862d7bd5aab49f46312e2250bc106a3b322292a3a4f2c5a283501f40116ea7dfd0e4176cd111c44b7370b968e98893c5de84258699205c3856dcaf52373eb9d1af7ecbad4075034a9d0458b3f76c14ecdf40a64acab55eabdbdbbd402443754bc513c492d1267cc8171e299486872ddc1edb47013d1a7c0f1d8c0d4100e9d7f82f57db634735f2b6df9a27677003e927096ca7017e09702ad713c5e058691f23b2e111dbbab24888c93635b0dd4fb6cd3fe5946e5028de607f5f614c90d99ed42c7255d9ad74a355bc3344a341e1586efa7cf0499b24edf15c08b093e8ec52353a4a5181f2cdfba5f8560f7431d6cc03c6c40d835cd25bb7bc2b278fa0aadf1fd8199ac3be582e0f789df98491e0767755b8c2d00a65a33f621a9ca1b6aad5804c4cecfc9b0229b6ba0d43ed5d5b4d6fda98d460650429e13c5ff56516675a5d46a66d1d45ab4fdbf32994515f52f679ed8148509a4b9c51b400472e3a201f837afe221448fba5c948c3b8f3a813d93dfa8bd8b6f0c9b8f17f8f9a43d0d066282f4257b019ebdae4fbf4f113722c65f52453208fa91d0c8ac3aa737ec4ce3a9ffd0004c055405797b1fea6de41cdb8ab673900af55fea8184e44e9ab0a7f70da9efa55a0a5f21f5cda9fb20f1dd24e084bdb42255ae6651439aa62c999cfddddcaa9deca6478c6278a6e94023f3812a6678bef8ff41783abae783290ca09db42d03b6fee4c2a80c97358079b4a120e66733f587844898338c23a1294f27e3aa4562144bd6813edd42e54ff8c1f17c788e4e4d216941e3a51789dffa8f5b88c6e274c34ab89680daa84a424cd2a572214990029d0eac2a6973e85af8ff320206278c0a3e9c2a491ab60c92f074be316c8022df17f9b4f54217c42dd060457300a391e9aa143e630d133e1514c5c283b4830ef7851143852bbb71464a392fb2122a655a16d6b59035a6b3a0d97dfc8f7119a22e04266515acfd7dcc440fb35589fea92200a5c2f464552c8eec2dacf968f043c048136d332e2ebe5b77c3568368d30068987fd1cc900ade55e6712f1a240142ce80d0e77166301fffadcb7c4417017ab1d97fa99aa0a4c1454ec8a0923c34e93e028909a492fba088ddb88dc15b50f9d8b14c4246eef2cb328c0b2211842de388a667fc250c8a8e600573ae8908457d15583230f42935e673c946f9f23709ac2fe5dc0f64e7795469d4c32f0c9a9518ab4e8e82a778463e99de01dc39f6fcbf4a4f43f50b5f3c7fb86214242e03843c27aa5eede01642964be5d92127ee32e3165385b7f4afd15a86025bea49636eff9c520caa6cbda99c1eb47bae90721e5686e9904e787f8e4a8e771d472d36f0166ced4c9d34842674ed9fa8be26ea4c71603fe885fe3b5a91cafed33e15075431b71ded7c130fe5f798cc9b48ede880134c923cdbad26d2a0cd16ad431fe8b6fe3dea5db968d22d327385b7eec1899a098db7a8cc09f9841ad3d011dbe8fb3ecef8b491ecf83b0187fac2a09d9ee7e87b1556500209b8121d8f85a9acbc6ed9e4f1094c2884a34fe7cedf3f97325862e3697e8efa1e53afe4d4c0d120670c013e812ea8baa018d26cfbf6e2dc546f1accd85261ec6cff77d8309d3771a77d95187995239d6ee4c9bfbdfbf28f7f9a27f88ab3029f74bd1005a3bf51972a88907701231090ab8c7bdb76d24f46a43ae19086a2760c491c19df6fa286d6dcd2f708324877a175bebd362cdcdc674b250bcd20ce27d6a5d1bc263a9ce73414b73d68624db0b21b9317a7ee8363007052209f8471536c9b9cc7197e871bf8e6deb6aca35c73c4c02e8a39c050326a927957e1ba42ca9e6912838e5947711c816eba19ee73481ae5febeb4df968f6c290f6dd280728a695f7554443fb9e88d88d2b659772f0c70858a9fd33ef0038bf618220133a1ba3cef9b5ab709a84f58152f4483af779c800568f74d163e79a2e99dc993f0d7766164b94a65804add0dd9d0d394ae62f436d4f4d1f1e053c73c1e751b00b19dfa4eb3acb8427d91224692d88d3b65d3f04a994ba4e343323505a640b8fa53be92ef477d845cd566a047ed479f6e6e549bd8428b70d18af1d82a197a6194111799bd2368d123851afb2b6a26dd71513d02c9d4d8b09ab2b3bcba27b35702f09b140acb8252e0f7709145fb97a03b649b928e789f59ab3995f0686acf7b6df7483ff595bef8061207df727d05e53720d4c5041a035574642fc638fe1e506386e77986b2b40660bd464b8118cac477b1c058c17e55460336e161152175b22f9653a64ebf503db94367f430716a2fad0a90cef088709d10dc05480418cfbbcf61618c1f2259a1002369376fc2103a9a71db7713297d3bebb58889fd4953e7fdcb7c05e12ed380a995a8cd4f258d8fd6408c3cde6769b82bef7f7e4cf73fca7a334100ef871f66d5665aa983f691b8a4088b507e2c8c15e55045ec7c7b790a4b1fd7bec084f0c5c774e41cd254d14f9601db1ff022a328677073dfd1f6a8ed35cbc77f823bb8d21b82b947e10dc2b3b5bbce6c931f1390d483d0d6801521e7321310b9ca9e0d152c9f60162979828843340d93936fd705a1bf2d0324cb64ae083624d4cf9a7ac28c99fca220fa0f935a4272559d0a86ef45e29c80672fe4d376f8727424a5e0a4b8fac413b6cc0de64a0320f7b914c6ac8069acd1ece6ab3a342497d6c76e1a3fc63cdadaf87a2573eb4ff41ce7afd2692662f63a46f4ad0b64b302109243794d5e5ce88751083a1d148bd1cde4d1792cf3206f8e0b35d8212548be3c9bd7d658f798813d34ee88a4649f5fb0fd6a6c6639101405f1ec1df0d503883e58947716ecd43646424ed3f30fdcf42a06a6b999efe743b51a6a50936ebae72df19a01aa042aebf9435e5252698163d8d4da87f6990b9536a3029953600761df6af4bfe44db3bde06e10b84c9b50e1e690382cf881b8ae0ce7169f4e208507d891e8d82aa8e4dbd8990ad1b46ef1c11b43d6858c1c661e8a497ce3cc966e196fbbddc8f2194806934ead1aec58ff1f1cab0bfedcfdab26383c5b5def9f9cceddd1589d2b80bc925d4f2344602fe4cccda67b55b71bb0741dc469643dd6c446136a6ac14a43de80aebc2c367b4600aefda861e78684433feb07a01d425f86fbac9d13e3a6241337217258262286390c486d78a054bbb50365e1610c2b49c85553b8b299889ba351aeca95e0482a6d4ddb19c913d4527d915d8279db52a1f0488d721f5e498abd48c3c2f0fabd1b888443751dc2b3b90b7b5bfb481500d05373030298953075d1fa0b18a075cd9535d694062b1a43bccfd90ec4e97087ccfca2fb3ef4c912999659c71a9c0903ff9d14c2c05ed7b11d178ab364223abfd38f763e87b2aa76e5bc073717c4e299b4d45e76ea373df22084a0eeefb9e896b520478156068c608af90501a257fabe17f6b469d0938348ed2567e9b9239dffc382067d5361ef1149e7e885e3ae2ee453dba03cd1c52129e2f6a385b56dac79399ac98a2a32f37a73cade9555e156afa340cfb900dc99cbbf46e0e4848d474d4c54574f0ee3e51e8c0c561c1e49a3a082cca8dd86c8fb238e5ae6b5ba1c526a516448d2d883600db913d196aa4e2113ef2e5824bad7d350362c6e64f1ae464374e0dbff2bd2c93e00d9f7b05792209206618a5f04074eae75dbf91f0926fcf6ef7760d0e53e2c0106361e2e3238ee42619403f3e10d01002a640f503c5dcf92fa32902f3d76701bb29cccaa042976ef04d47e8cdf27a774ec99e035d3e47deaf5794a92795316df76539298fd5a9b50f6d78ab77dbc8864062ec94b6a736ffe209f9b953d25e1a8069214709f2326e1e76b28f881b3bd694205c05f0fc77f4c360cb3212b719484aa473eb768f4bc80da1050638cc7a89d0d45d54d451828b93ce9e7e8a70e85b482faaa9df2bf9a8444d8b70a2085931c890ce9040ef31a72659466a1590ed5d99c88b76dd5d8314f9cbf0500ead86c58a25fbbc50e830597c812084ec527582241215eb70d099d94ccd508ce234e629cc49b4536f97e687df3c7fc354484aafda101ad00e6e0db6ea01436998941e400a6c99d1a09a1833883aec8e416b84fdf982a8eca766c472c57c3e7898b55717713c23fa3c4b0144f9294eaa1fe5e321197ee8f7b9a0e350d62740b49efbae3d9eed0b35c676364635e45dc217bde8e0a6076ac2bb602cd60e2c192759613436b05c839a27923759a381d97c398d6182b4a4ae7869ded3bc6de54bb7e32596706e1df32d644e4b8350377c56d941b9e994b2d0f92bf558645d862f8b192a93de3c916c9e629e50dd2cecc24f8f6ba4f3bdc49f0d56047f56f2c122c282330e9d3afe000e10de23982cf846036cb65173676f755a4a5c68242597c9787476fd539c9622eb1bdf7e5a5583afb4958ca6c4f019c04263f581a6baa29151440206787f2be4928b8dd0aea20f4914212ae3705e8e238ea8ee95b51789f446cd00c2389253ed21dbb3ce4848fe2383a21bc45a5084c2748e1701a2bcde00af1d3aac5dec346b5dfc84c20bb367fa9514466c0a041752861e5192dc99515cd1508e3f1365d62b3b0ec3435f1189d0e753011d58ff770751327af34f9dca6bf790865ea38a9184a37a227330aeaadcdadd6f25d0199520a2d26d97c97de2ea34ccf21c04d8acb9f002a82ccf274e4470b530ef82ac42755f7058bc960bc61269b851c15ed7bb204082140e0b37f4ad314ca6aac5b222cef6633b765ede1bc45155d95102abeccae6f6a4afe699a62b97ec99bec51cd37d8e1471546cfa0f44a6c12f9a3bfa318b742652687ce91fcbca5bbc21316ed6d32c443ca438a4f03d5f7b41ba38c667044d335f9841a7fcf4e9f5e9570d5a0d03f59cc6d9b16ea7ad3372c58eb22043af3aea7106f0dfec5462e349e4ee69f8582c8922edf71241a05f6e0ec0f9b66f891cb3d881b883f4d152bc41083efda5a3c3fba9f651a5309343f2592a2d375923962b1bcb2cd7d268ac832c92f083eb88463ffa2a277911ca3022a186c61351cd32735d9295a856253e1797777a9196e1ca8d0c00a4634cd48c5104327e55223f778598f77b965f85a806b05b818b838f320dae4e1ac1e88a1ac4f7959bb7328f195180f27c8e9af487c03717dd0916773a664c8b5a60131e8bfe341068e30f1498691718f51c04c4a30635306acf4d0c5a45966e8991c85c0d8b418bc90abf83a534c287880a144b3435812fb07e28f9647efceb4f8fb541b4700766f4b22c8fb1ae606b08bb17889ed5a8d23ae3c954f730b8e07f01b633f929281813fc0254e8489e5c74c22eebd050f7c54b790b84de86a37532b3dbeaab22961b1149458211f99090f9ddb8a77417c2cb2ef9481e38ee6d5669cc430060267c4696ad39d689892ac35ccadfb427d34212e121c6c11bdee0360903d3fc07bfd87628fca3addd1da1e88f1f6535c03768cd39812e84e0501359c1f5be7a327c43b4a60db5d0d14d0f671906f0971e242d516773d8cd9a77ce3d4a5e0ef4620d3d1d4cade8f11628ea23fb6a659e4e256e2333987cf1559546fffa8152692a61defc021889d573db02cafeb3832a76d5e33c5c6cfad2ae32e71edd2239ef48cd20ae93e615aae90800e09653146caa5fa50e35ed3d581a79f679288ca067ae148ad652123f4db42e6fa31b7da4add97d7b5193615bec163dabc2a46183f0148f739d165a42378e8795ce147058778f90100c4f78d756df2f63bda41d8b4dc909e547fad0eb7f551481691318a2ec22ccf24231439b7628ff7ebf3fa3a1d257090ad2d0eb277223c4ce73dcdcdc35aaa3ad5b0635ca211033b36e3927f9b39df0c252e291e06dcc0b09f428917d9369cd7825d13d91a14b42de3c3feb62ee347b472f50a0ea1a24ca75ec9074f1b88cea1bf8b9b087ff44497c0855285aa8126ce4bbd406d342c4e43a4a4c6ef1e996a2dc221cc0958a10b1af0d685af024b039fb080b70c842181aef6a3deef59264e1474740e44c1cedca0a13c87f589390a490fedd740300fac25cb4d999c478047ad2230e6f4605b6a41766ff256417d064e12d95cae46b09c5036679fcc6f0b61368e6b401dfa8174fe1cb0d6ff1799ebe6da7fbc00e5844d3cf34a7e90c5f0aa5d770b2e191966e780b34ab9da0f6c4e6a0e25fde6a498db2d42c8c824c94714b3750e88998a6074c6deee0e2967b0b3e162e0ce34b790e6bc293b2856bf2caaf90eab142f441e4591851e45e9a88bb84285cbd2b16ca11b120c4e964cb4e8f7180fde8fb70c82b9da9e22728c868a5886fe797c7abbed59487b17defabec4d5b7317c55b14d20dcb7150515e8cc2bc2dc2398e17105ca6a0cc980578d9472ce7108fa0ffdb7e38ae1db82bd444052ed2c06a7b73d7a492180da852100d26adbf750ad0e90431a167c52a0aba7617176304f0b83e183dd8a6e13cb16412d4d0e0e1ecce9535015e463174f2a8ebe9e2ad4fff41665017cee064830408b5569f9594980ef292389be390183d92bec5006254876ec59dc5f10b4d3e8993ab2374c101cba32f946ea2f3168fa39a3973f459700829ac842085fc1f839c2bbcd36418b3137f704cb6d9bf2200021b94fdad72440426264ce03b91d0d6988c31735101ce123e32614bb5c7e5959bd36259b23d0557b1376d578654de258f5e66488ecb4c410c89e3bcc0cd1a4878d0acbeae8ab31f2bf7363996e1384aeeb23381c25b0c2b256d4901652af9ade78e8fd1424a562cac3fc6c90cd7d52457459bc42fc9af9411e3c3d7afa3a685d832ffbf8c929bf41545d74c9282798a0b73b26f88cc2ba8021cf1b8cda90e81d58be9ed90a50dd7c06ea4015d44f668aa96ebdbe0d44bdc7a7800b38185e9c6a321318179210e59e9a498e004f208e15e4908a32a25d5ba609893436c04ee68504a9214eaf5342aed5e7cc1b648068abf60b90106ab892712c2d59763bd211f9c54f3e431bb31966d97fbd08e4a7026716d9da0ad336e048396c96e0020df71ef8dd2188cb484afc27322a96a7d127a757e21634468063eae4b54be606a439eb018d6ca128b3144f70e90b8525d1a6fcd0fbaad99081af5b50bf0b92b0182596ebef365a967c0c5fa0aa2817c4e70997e4e2d2ecf4a664e850ba17d0237c4c85dc3ee7601911a3eac5cc83c90c54f22400b7863a17e70a9acae0988247ee6177e73532a6f57322bafde2559169d164c2850593da062c5c962aa872edc15152f58a7463f5c96b16da5c631d72f7525af72635c03a88d62c0086390bc7a0228402581512f7b5e88692290e44ae0b8e3aca3afdda0e2441097d04b05fca80ecc652b3836026b693cfbf4cdf6a78055e816767c0b902a714722d7e6b8b74337d028d038d2fcf88bb02eea09a55ccde381e94761bee20f6977218c3be1f5eff039e5849e7bab6e567498ebbf1844b0c205a3857c33ba4a75580c09d6ceb1bea927a3451fb76aa82d162f98cbfd928cc644ef02b2995fe578fbf85299edbd4865dc586cd39b9db50647b48e6aa85daf8f0ddd93c6578e79d2097f98c8bff79e9bf31ce6a541bed3f9e4547f4fb02ddfe21c8c8d56017d95f12fd5fda56abf7f680b9808a52307bfdc3ee9b612dee77d81db620028f2f6a3c440610668edb48065350846ea2472d8001201b48908c4bb10446a93104d21382c83102bddc1f4be7a94a457839d3c021a0c7f78c06db9f321b0d5b1fb38ca2f5bfb41faa18580ebbd4344664353c2dfcc39252d2edd6c16e0f52c5cd7716d38b75f910e7e73c348b17629edc3c5711d3654d7ca83487589b1371c7bc52a69d45ba4a0c98c74322feda8a2bafe38bae5b6827aa4966154249423df2876fc6a02212a15cf571d36da4b060229876c3e18e123ca584899ee212a09b71a15182b0495509949f673d621105384f6cf176dcf17d5af7f4982beba7a5159a02c51faf5c2dfbad7d5b01f6f9a3c03c3bfcd89ddb064f41a14bce420ee62cad8ae594c749c925263653265f131ba510c767ea2dcc257bfe6820e09c0eb55493ef37edcad134378e54e826a0a374097cc9cdd57a5afd7507c5d426b2919a1aed2a3076811063ef1099c8a6bae17f803b8bd2433191d42deccbfa15edd47b687fd187dc5b4848cd03aa6cdd1a763818208d5f0b46d77ddb4025ce1df1460bdc3f1b550d5dfa7e7d174fe85dc7a21dea816c8511779f474ebd4e9ec15908ff9971537c6fc7fd87278d9fcb29a404450ed42cdee013c99e931c5d5e6a0d926d031c8bc273951209077fda7a80ccb03709ec0fa750732c0034b497aad0421c18795fb7fd134541b28e97ad3baa90caa7be73e4c94654b0900ea5a7312641cc59bd319880524481a8434925a4d256111a2517275d317dba9598832919ba43871e8d3a56dc46337dc5881a8cb643b1627d6120eccfad2e7706f834861d5f226aba2ae6772dfe7ec9407866bb94a107fc20600d94e84870112d944d6153313405de7693aaa75b2b5d2b02adb1089f859a1845721a9da1cd9d45481110741aa456754f0940cfb9c4a328bcaf62b6303dd9eefc4390038af619bb4c1fa25906c10f93b4fa2eec686d3f5f181aac3affc70a0f762f159e0880e17211299da0b285880fa385128323d27b7dffdede305a66d3a20437644d7994aed880aed7513f58f406dab97186f1590b456429b0dbb89550e705b4742420ba77ee470480e36fb3f9808a271b3a1ed0166fa8e0c5a80720c9099325a34d50c16b3446f4de626a982c27af008603475e70f4071d92ad76c9e00fa2f519c19822121aa3b943ff024e807f34635126c0a4b0002aef048a6874673e6e04627c9ca5eb6c0b0764b7439b56e47ecfa29b00d12f1814da3286a69dc0e495a725610d1703251d1a5003cccba2372041f4b0ccafe0d84b01c4c3cd3106370159f9580d58abfbc20448d5b4bf7248aad0184053d7ff48e7ec74872c6c5a4679f589b281187ec68da3f06f643a146019c7e845bf292c866e720986eb97be04860de1793ecdf2b475206a785b3045169135bcb36630a498f8af11e4b7c6d9b25f9257c52ff8b2ede19384aad5c3b1f2987bd261a2f20daa39abc2e6da85b0e260be75e29a24bf93ddb2ea448f07051eb3bf4bfbbd80042856bd92022aeaf9c1a5eff3cb8fa15506665400ba5a61fd1c802fe76d2eee4850c31def0c2fa76278041b23aa45e04f466d8120552ed369deb4e950df3cccb97841e6f5f7635d7eda423f4bdd318c0c0b52dda3b604bf8fbf6822278dfd1e3620770bf651cdfc6d0df853778109b64f589a0c9221fde6b4b804d94434f44f0bce7f9d93af4099450e467752fd1d82e9c13ee63b79b329f9e1fa45c591db1a47292d1400cfc160d0e59d42fc91fb8bfdcaaf355318e6a7d8fccdf98eb7745ffa4bddce39efe44a40edd40a75aeea15a87a13bf38a6247cb186f0750579d9a29bd4f61b256079c244e8385d9083775e9e595f580e80d36cc4c0daab597b764adc5097d42b854da09dc151e727b27a804f5e8650dc432bd940095b14374942397df8b7530ede1c1acce53d1328e2b37f12c9b38dd46d63e1788452af8f1902f82f38e564770adf7fa7b577a800b18f64b66ced9741e4a31cb1dd6331fb9caa4c9d4d5abe49b3c40c7d2da24c36ae5ef66a5fb1577b8100f1aa2c433c15318877ae830da7711784b9de439c3f1122f6bf4030570ed8d12f8700d841cd0de55ea5cf02fc2cff974b50a046fe0aab0af06815f39672fc8deff828ad96c2d79793c52901914a728b2aaf17b7bf91fc9158fa1639bcaef7cf250f3c820ba613337565acd9d49b3f2d9c1652d6aad3e3d8d63866d55111ef93b1209c1158e5c7f510eb6f24e38cefcc95acf92e5dad553fcf8710b5306a280f8ac089255f9f3ace3c93b2e3e33ba37b3f4976681ade3306583d3c26f899d70eea8b57aee967a4e866a6cce11ec94b7b245152aee14c71c4776fb634c16516e76c10f9322aa8c2f60aeba259f43f3ab2bd6b5b11f5f8a890d456bbae512c579b34aae954cc8f88719f6f74cb1632701ce1870c4044e2f46ade7753325f8a539dbccedf2621aa0a9f6379ee8bd14f31b973519b3e5636c33d36fde355ce0d20b8fe2683988f6a7b754af51804b633c6b26e7ba65627fcbad1d71d8e8bbdc7ece35719afe438052133784971420656d4fc1ded62ad473a0bb146556f1282e786ebdac6e8c9a926b1f680285bc1d8804c4cc123d03d483049416554c92e25dded88ff0c31985931721fb5afb7656a274e1b04c5465dc70b2d16cd66888d0d48056e1c47df75808dbffda4801ff7eacbee5245de5bdee79bc37e30f702a556184ab541aac1a7be7ccd043d1a2787c1cb1197c4985aab9d7f8212b3a89e34e58ae347323d29bbc9609b7206ae5c8b3b54a77b2769da1ba536ec65cf3e8f0bbbc88e4ca5145a08c8ceb20cca1190ed9ff1724fe2495943acdae1845daef77428696aa8347de8104bf83411861e00165f49181c2787b4c21ebe9770e52001722e701a541ac43fbcf14fb340945d23e5a3521761696330a58ced9e961fea30d8681ba6125732708b0b8de11a949434d7a19f91515e66d004ef8e529662d7ab91d8c6d205257bdbe8b7fae72ae3b0fcd40299c781a225412e27072d2adf0fdb90accfbdb089602c83f6b6d9345a0b301ed4ca7e73fbd9c9fe2b7be78ad3d0b38f3d6d078ad3f1535ab0edcf55f0bd27a08ddac8917d1a93e1cc584258d537bfe67dddd0b775f13d2df154ca15ff55f334fd81607445b0958b06dc5eb084402fa674a5e9b1b62d555396c8d8336b66246ed31ba3421a3874cb76df0d6543de0f9d8133146b0892269038722d98a830e5534d9ff1149270e774e563fc68972a6196a5948130eaf51e78c6fc0476a45c40569be8032c244842bbd1798bdb9c215f25ecc3fd5198c0071445e9995a89f7fcd5d49c27a2f68b11bbbec13fe57b323bd8813c3a7e1f714d31b58d65d0565b2f1bc40f9c53c5681b0bca8a78050719caa96961f99a161d16e61d44dc128c4d4f114e8c00554da6472296dc518f8a9350c7bf4f6e256084e7832d34cd62f3a72058d9762919be72f4d60ce9231575a99d46cb77b406014e0198e80d593437e3a0929ba849329ec8f47bc820e216c1a4133063605156827360368f239bd43c9c0abca57d7ec01184044b1034c40cdd0eb6328b6c07726ae5405f22cb49b708e0fb5c08e28d93baa24a2df9f858c56c90f9e6142c6ca2614e25455df21f6e1f050da829663ae06b97e2c325e1eb946fed8aab9568a406bdc05de3be8bfd9c4e700795bc8c4e8ef78fa700a58b197badc6ecdc7fb9e6360c34faf4de0e6fcb0dc382d7fbee8b3de68c493ba17c1373d7770f666851d891378c4e8d7d31082625f1500a45c99a04420fe21eee84d2d7bd9dfe098698c2ceccaf029111b0217f89e3ad79748de98e287c41b9c1907e55d7967feedd5409886d2ecf635d01650718d19c94b00f940aa41bcb6c0aa05f71e8357f06bcf1562a3fc7358a196612f354a09e27ce9a0d99707a544a418390d775e2988fa242b85483fd19490f5980ba3dd7e2ed69e60845ff52d3a4f72b602e5b042346e2d2e7a58afd2735763b23c0e47f64e98971acf6bb56d99f557d2da3842567364d3e176002e1a274cd730461aac6bbf17383746858ca12dbcadedf9468df032bdf9d189c0edfa73fefef031ae05c029502a60008e23df9f6734899547627b93adb067405143df2ad61cff43e7f568d2d1e382b3a290434fc2c2dc6baca0e2159d0f35be90bfe0569b3ce92bd59bdad23d941eecab4a1930414bf6252a2d5fb103492d647d5aefcf6b5d72d2ee00f7a4639302089b2209bf800489476e920da36598e8b9ca0fc685ea04ee30c8a53ac6f8857a8032b4ffce2b00b179969e3dd59cdb84bcdd4d50b6224204011f6b3aceda578e44d99ed66e1e588b02fb86f492debf20bd349b58c8367e8f9feeb7bdcc94e69fa1cdb233fef792893732b08356825f86c72f678398a160a210c9f8cfc97110ea9b39e7e830f3ebe571374e6c8c83dc98814f85c9ae89355e620c13766cbaf7fb5eecd4c42cf6030d3dc6ea0df0c108bbe178a954a7510501bdcbb536a98a1fb64567a9fbb29b54263715e6ba0b396301b2737982bcd17b6cff1e943569d72d9640bf0396f6249b9677d8b8575879ee5cc397d989c46ff3bc23b3d22b44239c606fe502b6718df30e1ef28a69e21a9f6754fef20adafc8c1ead68e495c3fb2765d468633790a1cbe0c7628a507b8f0db5ba4119f911e762a207833c72cdbb4d13a0b33aee571ecebcf4512ae758bb97501e62cc116045e3dcf4d81de11592946969871642d9c3a39a075d508c9e831c9dc2a08b4040a341cf973286fc62b3f642e0ab7160c4e2ae3c82365dfc5a120f3a513bf7b473ab60b8d0df933ece153f433884a35db008d6c886b4db0d4886c8c1a599f1d06f9d921d40708a262f3c753831e5c4e021654ae81c14e65a33bf1e77411abcb2ffacd80f5a664a94036fb2c9abc363ca69cb1e4bed73db287f6d268517cd53d90fa05253a28c684cd197142095a737abf287a1c467988289a2ac7836f631d3ba5dbedcac08b5a1502061e71b3083f523ebffa6db8820e46c8162aa0df0661bf8d44bce0d4843f4ec0b581ef3b5a68ccee696f9a2dfe69f13159bf7af9a0801c7a0804cd23182feabc28338d920860065946901bd1095b275c5e80621dec722bc80c5b4eb2a03842a4a55c7faf683f5b707af6f1e58bf79700fb0212dcb011bea68551deb6283c092e671a777cd2562712b4d7c2dbfbe0afe6dab1fc659d2b7e0e759d131a40d2425a5a415d3f631da0726454be87331304c4cb0ed162292dfc9eb2f5ae5fb10254e63c2ca562f819640bf2e78264717af0c6882ccf92a98bacef483487ec4b0932cf1a3415f8cdd1798092d8f0f7a1c2b2628c72d4e8a78cb3754334e05232aadc5fd9f2401dfeb39a753309986368821ddecd28980b104227eab325f63dfabb79fe0867e86561389b52ee5fb152216a85568f810fa7254a1272f7fe532c8f0385760cc97cd6c48377e5588a450017ba6581f39f339d393b96d0bc33e0f50ec671bb5da06cb9e2647773e81d808cf00471bf3430c5726b547669f3550719d723dbf52bff67fa6614f3e932a86a808532bb8a6dc1b0c917c717e8e224af982d64b33c75d4d479423427eca67c25c1c2266ee39e9978b58d1f299625d74b32c9a898fdd6979717ece4e85dae632e030522181055dfe4823f6af404fcb73b2397c6e6298f6924ca06923819684d69514d45944626570d8e6bd573ae2ba30711829895b60eff30257ba49f584de03a1f3db38125c9ed92f65795a7bd6d0ed1f7695e381b2f59bc5dea15bf8cde6aff174496ddb43451d4e75febd80972d13c878374341e20fe0263c36effa9fdf4177d1c5274275da18c40f83580cf888eb3332a0ebac65eb9b430753963a77f87c2cd1eb843b89ff6ac19dd5b26b6691420bebfd8f7b8bebf9dfec9f753bcb7c9dcb7ecb29f0b462313b12590a0601726a75f03e1a6e0637894baacf719f490f55cf46a089d46d90a4cbe2e8b1acbf81c4601821afbf47fa3562029c6b034a7cc67f5b308eba9a0e2333f14c0ca381a640dace667dd3d84e60613c8f0ede6ab6f4ca6bafdffac60b8adb17db46f70840d211145607aa200fe71743734692cac4d04d2feb98413166fd9b22fb6e1f83e3514a238bed4d9b6cb9a5942925192508ba07f307dcd7cfc7a6e66d5e48771068cd6b13dcd8b5b6af87fb1fa2ed7fe47736df8f731f411fffd573cf63f59ccdffdc3c8def877b9b8fa0e6a14c7039ee47bbe8ebe040bbe8b77a6e6e7e65f33d8d8fe08dd7d256abe761f334be9f9bb7f9d5cd07b3f9782258e3c1fc45df7a3c5e2c2675ef23bf73f9f8a7bed76ed72a413ef73ef223e8e3dfaa5f056dbd9308463f46ffe9bba8e484cc466de1e473fcb1f38fc75fd23502f944bcf010ad5f757bf88ecb5ff2e9d274f90e8fbfe4d3121aece7a15c85e20d661269a40f573e7f21cdeda76594dc5f3a1739375de95434027f3911e7207fc9303af907c45ff2c75819d6a29055a372615bf4b56f95d05f9f87bff6fd68ef5fbf1f221fedfd7faa448104be2d6b977c1d6c660c086a5e6cffb8c85f52bef5a01a445843eb1ec7dbfbf340f9f713c1d01a61553d40aa2f7aec62fdfb219afff3fd34f5dfdee7f3e9d4f73bf7fe3ea9efe72483a0dde8cfbd4f7faad52a21f5ddf3503dcdf7c3bdeabbef87c8877bd5ff741ce7b57aba6f512082ddb778f818907b8ebb0934773a42e06e470f90478f8b60e7b5ead72a817bd5f3483dcdf7d37dea55df0f914ff7d91f0aa23449c64648c84603a2405ae581ab15a72c6456ea511641dddd21f0e4a82c2be255b663bfb5a71f63748a4ff68b394dad2a6bbbe7be9487fa98ef5423967d96eb6346494a9d900bc56238c47872c462ec084fc7623978623cac44288c391992128bc562319417f397d61b158dd3b1fb43d8ed87b58bfb6377ee584ebb1896136b8775ac3d2af5b40ebf4f8f0c24c12ebbbb7b857133d3342214638cae3076232c8a6506629baa5c998865721f3655f96bca56cb31701050fb1125cccc3e7ca7d220e6471ce95f6c7cc960bf0faf96f52cc4437c6447bcda7c217c6999882303af5b58306e7f24238c56681f0afef3877af3dcabcb7bf8abc119c5c6cfd1a35dfdeef1ddbf878fd6f1af6bf5faf9685784808f1ba57b0f1f217459ec08add3e3d39f245ff688affe1a8fcc5872fd8b4b33daa81bb88800fb1c4484952c3fd77404e689df47ebc423304e979f031325bdb0e7ca9f1e0a76bbdfc70f16a83d28a55d3c548fe07e763b7cc7a67a0cd3077eb48e73a075b6e707928a313eb1211371f9fdb78f3c2eb5df6057fb969e6ce849c8e9481307313119352539293d5d9914eb8fdef6db7bf16a9fe6b53feab9e7242133c838d3e489a0276429e8610b2a558630028c901668d022882366494b14017e3045ca942d4da8e0cb11909fe3a217c2e27f0076677cce8b5a9020443edca3be20db07e13e7aa882d38d2f44a8e7c63f21c8f5d9097e251ba57ae0224debbbb188cbd12015e172bb134175e327e38dd82e8419045c77c718e7188fc95819bb670d2d08fc8d1ff5c1e284fecd75b7658ffa60a5e430648c8cf3734ee7d89542b13c61f0144faa69f47d677efff4e15b7c5a655671e78ad2ba1dda953c3837b530983da844d84a84dd6eb032b519b15e664a85d3b01a996a274103debb2a5589882f372a546a278276e747231f057945d02e7f3c4c2c7f183b1dd2ce898594d9f87ee311162f48d9d5194c607104aa8b5933b1a81b8fb018428b812dc2627684050c37c451aa74aeec9c4758c8ee5cb50b1493b47a72e1cc1b8fae8082a94639aff072a9e4c2c9e442cae4a20a0b0cab25e560b51b8faed082024be3c6a32ba4d860e58d47570c3de00a21296e6e3c92c2ca91154b4c3015598ba08105cbd1fdb615566ecbd417a0aa048bafaeb163a7e38378a3e307d74a89810ccb104e4a5a10cb8801152c49b0cc88b400fb7bfa7b84733af5f77823b623159182544489a4725445162ab253c014050e4fcc90904801b21721ae386dc104111f7c08fac5c68f9a0c373c4524319a8640ae53ee05d19eb0c20954216a2923460ce8dfab28a07ff1e8092686404ea6dc8b4cd47064095c22072598409e81889912d81eac0a589bc0c1c810d89e8d22a00acd8c6589524a65cbaf357a1c43ada10af1a98c31c6495f9b317a113c4471a2c3a19014191bb2ee7cf9f1ce2fca1557671c0b070955befc0ec386361e6663c58a218a0d1d70fbfd53d5a694d8f08da2cc21c42880f603912a51c830b449f120bee8d0c50b7e25874bb76ddbb66d33034cbfa29831a019668062c0013ca344f32edea45122294455b6d82e18c2c8aa60c10e5ab880da131ac814c900840c4ddd4315259b2a57507fe24a2475f1c2b9229e90b4674dd3342d8694add58ba295088e7499610b952baadc006a4264b061a805304b00511103d4dac9d5dc8b231c5836a4945f10993872b240e344294581912e0469aa294694524a5358b40d556cc832edca6a9aa66928b9d2b4264aab07282d1d29317547599858455ac30d9523d453b69b524ab540ea57d4824bb594ae624029a594d23296b63298b6329ab6329c9e524adf8616e4aa9b36e99c73ce3055fa15b35424cb85058671e25d3950aa699aa6cd39e7ec8088f800178c28a594a62497a62e516a17206a28a594ced9458813b384d21828a594522249fd8a4a0f20b2e4a4c6a6214a6907310a9139ab18a55050b4d4919b4b6f28a5948fdc788485e9487c3281932f362411c3181f8434f982a808a4244b49c0a089104f7e2444191b17cc4534fa55cb135788d1b4d8e44813a126434d664d8a9a1835499ab1a9699aa6c929e656e9d72f8e904a5449bf0a11c50b5a944a134a61a0686486a6508da555ea9bd72543fd8ab3072c29da58556bc254574c660b4e3f48adae660c455243e857fa962e75b111e9d71998521f5c736e4245fd8a42465528c90a29b18496dec5020acb15574c60439009ccd0992243624c12492c79810727316c4e4e70634429a594d22584be1003644514484a2fb4005211be183101a28a309484012993305267d068f42b7d4ba168010002ae2dcee86cf2ac6adbc628251b030964e3d71b8fc810c2a595d2c300ebf65c9d361f23441c51be7b12bbf46c8f7c9edebcf75cd3e557c5b0cd42ee454a696499a4b4296339c6c2e51c5109888174b9cc3133106bcc64fc7099593203313333173d41513b1d5b959a7674354d7b82e16a4f3b1d1a6b763aa8dc997332e0ce31b8dc39e78f41838ef9f1ca154e006ee8410e3b06c9f5678d71bafe4f26e9fabb76f02331b4849184fb18b0edc69b5037125994b8028b145f8801248407a099932a48435bce68a2b8e40221ca806276831058c0d05a2105b794332fdc66c2c818674071a18826430470e3911930b8aa1b8fcc786208b3585e36d29152b6108497322a2003840c5d5cc08a165c71c28312164acc1fe58896a3e19093a366e8f6f75b2153a4a001863345a608b142a4e20b152b24b560054328c10ca5095762c39c7ae59597527514860cb7fbbbfa821e788002ca11636c59b281239e08c1b0822ab27881bbf5a14abd524a29adefe4f4101be6c87771626eb8b2316002c6d3ed47b1e40f2f608cb0000b236704c98e62260b22bc0823054a4079e58fe03befb64ad94357a6e0caf79d1ccec9896d9d0ed9e9f01ba6bf22dd7e0b860c4e466ebfc6724d2bee87d03b55e632994c6604b26e7777f7978ad11f367f763aa644499c9c1c11294a301edc309ab9f25e1c243bb992a52421a39284e256cb7a178c8a2b3fc633428f9830577e0f1f49aefc1f407ab8f24710868aac8b1911304162b43862c59250174b0c31b9321e7961e6ca78f4c5962b8d8e180ab2475ca0a0ca67c9a325ae942188413b802dc0a05c230cce024240965219bbc1b3220e9577f975f90b0f709983e787f90e00766cb43e7475109380581f3f761c6817bf8fe884a3f41ec44230ea8efc8cc446319e10776404729362ef8f40fea6e336ade65534ac065f1413c144a6e84a345f6c97ea03e23bdd175a16cbe5f2ae8408b2a2b08c586f83c542fa5a81bc0d16cbc64b677d97c54adbb163c766c5173fb3589703afd553a3c6b778f8189083af51b7d8f8f16bb95f71f94350ba1c9db8e0c0b660ba618ecb49de919f3f85d6e927b14542dff83bfa461fedea6c74f001e07371e0d9f062ad1ade06158860fc90157f13a241db2f9cfce99fefde0f914ffffc991ffd35eff41141ff5a3df43d0cb0e5e36180daf7883858a31fda07d2c3477c622d7dd5bc98bfe4b7370265b128191bd60b04f4c35f72c9bf67649e2f3f5dbe96b25a27e45fb12a7f2c977d0e999953ad43a1d8feb28d61fb67636151a1502e330ff1c5dd1d34d08d4cb73de9b23fdd57424eba4d13a24be761f3502eb53a79b6ea09c7a1aa265dc81bec6e877f3fd02138ae1261e37334ccdeecc951bad3d06c466c582947aa858b38e1ccc27a8a8995dc2e3539ac458234a1b6120af286ed454c6a7fad4718e6713da475f3915632ea563d497dec783098fa82a800729f14f2d790f727bdd1eda2590dbac4f2875e74fb67837d4f8867dc39394f92807fc8d2a74c19d58243a165373eeab7afdbd7e2ea575f7b9ffab5b87f1ffadafbcc57fd54bd10307a7d535bec0f914f7d9affd9687e68bebee6fd10f9d07cddde1f03757bff16ead3809c7fc4a15dd45bdfa179172c76391aafc5b957f3daf3904ff3fdd897af7d3f443ef6e5ff685ff311e45246587f9a8f5d0f907f345ff4d8f5587fa19ea7515fbbd89a975f23df5bd0bee66b71ef2f046cc1befc5adcd72a417b7f1fedfd0b42d47d9056eafd23a87ddde76383b452fef57fe48f7ffd08da4f08688405dabebe773ddac714773a7a8080a2bf80aabf50cff217ea555ed41ef59910992613964929a59452762c2ec5286ec36e47a7262fb46f2273fb7d9cb9fd5596c5ba6e3c6ada726d6e3c6aaa72439c398b425dc03e9d9999999959c65cb58ff50e2b61c413811e1cc822e97294e272145335eadd96a9f64221975fa23c666666fe2666668ef9cb59c67872c4627c84879b9b8739070f0f3b33b39418733373736dee06c681c572603057acbd3d362c27068b79a0d4e3d3230330586b4b60b01a6432fac7513665ce94524a19a3cb18a5949e45a3c1888cae837517c718638c9d11626c891e638c31bafc39e38c31467719dd638c1f2c6e518e66152b73c478babbbde517e6ba4ae376770565bcd13e824c5529239072b95cae5495b2a664aa475e99aad6e53b52ba5c52ce23242735ef7011bfa8a7ba9c172f47cb582e8a3832b8fe6c147148249880e23a6bb95e6bed21849aa4d496fec5f24f06fd7d8464a075b430deeeea7ba70305ed2b475b1c877a2eea1dc6228b475a8861a32a6ec848d7b7a02cc2dc9095b250ba214b719d9d51b4c6f685d647f332d02ea7de7c972c5dfea35d2edd9d8dda95a55d2edf8d7c4a2a7bc71a394fa7d609b928851104991f679c73c6586591fc82524cfa67cd8e24b22d4a4e8ea482675275fd4b752231383d39691fd09d9fc7e6e51833333333572da2bbda3dcce937c13fc783763933e788e57474cfe1cd39cc3ecccdcc5b96db39320aee9dd80e8339f38acd71e584fe52facbcf9152caf93962392e5be6e4901f2c8b0d73c2e8c4e7e4e47446e4e45c249c8df1a303381be3c7cbd98823abd3971ee73d9ee5d4c414939464f75cf7713097bfba5ffd8afbee6b692d74bffa5a9acd1369dae7d37df7fdd725ec7c7e4dc70d122b230eed3983e717fd907ada65af39ef7474cf7d416c9efb60feeae962279ffb7cb8b7f982f873f57e6bb379cdb32a55f742401ffbddfb70df05a1f9524afe10fa00cd1fb55ceee734dfe93e04c0e516dcfe1a51a765ed6a7ffe0d220ef9cc5f13755a29bafab9f322c89eac753248f107fdaeb8a362a176851ce4c51b1f23a000db7d62fd99e7d75db1a15771fb19c953bbe2a5656c3b1171c4886383dbdf4b11071471e7fdadb81f34dd168a379ac92c74b5cc5fdd2075c2867fc36ec2865ee4451f07b5d20ed5f5ef55b716d9560aebf63ffa5155ba6acd8e2445ed8af7e646235a80e2b6d2f7999bfa3a2bd675432e62aad536ebdf0357bcc1ef4c5c1380086ed6c82f006f482fe02005f534dba37652a894dc3cee51a817e687d5b60e4a7624d4473ddd3edbaef9f5ab1d44144a96a20f3303114d0ee7cbf7a75fc83f99327710e0cf84f9d9afd629964ec07615aeee6cf5378fd52ff99c7bab76c9d57c495f7b9ef65a24d09f4f3ff9d56724b6241c8df4b221d990482fd20b0d6a6e4b6229a5945e49e7732f3dee29d5344b55b4a392ca1ff4e9731b125bf359c046a41da45cdbdcae8af106fd6a55deb9e4529e65e15c57852a5cfb7d20de70201e02cb25bf88d437158595dfdc8742a55ad5de5e6d7e9222c121bd0034a52721330339be0105329cf658f146fff492182902e757a5d7f29941b82ec02904a43a58c97166718609941ed7051871babb97707c6bbba23bcb29f9a7bb7bc7b93bb33727a59a96aadba6b917a9294e2845203a75ea31878cb92721394fb7af20bb704845b298f9a2deb8e585223354f88d5b6428c3319821e3f247550aa69372be4844cc8cf19925cca7dfcb967f04e74f28d60a8fef74000c17496eb8420c141740d00452194bf870c6882dc07e58ac7908824b55d76a55ed6a45032761d1fa941aad2cb578b2f187308ecb0332accd8d4844ba7c371e31b140562b2c24b8956432d9101a9739e504036e88a314919cc60d2318f718ae330eac447543763204690524d7dfb27ab8febf0219d7dfc58295eb0f2b72fd633c505cff119aae23013d5dff1e3e925cff1fb3eb482d8cb9fe23f06719911eae23b940c6752413285d47223234c4138a15b291528726494b5cd19224030e3ea610e3e84a124f60b1016c2ad78f40729dddddbd3b957277a7eb61aefb4700f4efd13b126c99f22f41b7c67c87883f721f6913f5dc55d40b63b7c66e7dce6bd11702b693bfea0b01ebabc6b0117cd527f2e9df7efb8210f96c8faafd45ff08d6fe5a3e2dfa7dbbea774e442ec02244904c06bafc55e70a98eab7d393d76fa6fadd547ff3e493bfea532e7506717b0c38de99df6ab56a9741241334b5d63ab5af9d0e4dd3268d2e124a209b0b66e9ee5960b035d2902214c0ba116908947b7323d210144c19d80503d29638292952840b1723ca18f3439821bad4808549ffa0850c2243228ee601e880812413e2fa33eb0c223a70913484152730b4d78fe48002294f4b677c11043acfc9f2d70c490b1717ce0d36c4c149d938232480db678c3883c9194fb73bb59a63386e05966f3c3a73e49e81e1ded8ed405d7e1d7602061b981cd9c084c4183084b50ab214691d0e0019494b8ac0500688a358bb8b78944440946dd5a84fb2b42facf40bedfc40b992357007425bf0c0c2961faae8020c613bb147e8294b40c84206a41ac690297a02ca2a5d60436b2b4b484cf2761fa45481c8a5a9d6e9cffbabfccf846635594fb5b456d6947f809fdc4ae4f8d94f414ad6f2313e8d77d53af5f349e7d33781fa9c1c8742fd9ca839e7a473d64be7fc18a9c6dde634ced8efb4052ee284d22ab9db18903fd22994ecca9a85e523feb5ba15f2973f907f67cfc2d28f0c4295dd080ed9b0856e91ef447fff9e45890d20c202b5f777250661be3794ebdf430c823b27e5201203b50f5b05d79b108a1f481eaefbd37b0b9a5c7f56d2d35351511310585c8ff282502eb9fe8495df93960fcafb59417bd407d91ef511b540ee7aaa34bafefee43b5228be5c0e5df727f727c9f2af50d878432974fd35a5a5229805d7bf65ee5464a16d5032c9de9438e5fe91c5fc852b79c44af9b1988378c351687f23ac6535b7131dc6de28c164a91115091159d87a4583e2072d09bb0d55214b79a83bd88a240a3336b4c06e371e9929d2c50c0b57586a0614313432b67a51a5584d8beac4da7c4142092e475a9411c4163f3461eb8d4765f85043193c541b2cd60cb3428dc1725465e4b07143b2ae0c176e504fa927d5f664881393aa3da0a6a0d17c08da9ae0e8d0ac961142839982226d4a277d30a236eea4695658929b1e5a9247655ca0c12978f257ac64a89e2cf92b56329c70fe574dea0a1d6565c1b66e3ca2624825626b6e3c9ac24963c2da1b8fa6608281a5b9f1680a26c2b0a91b8fa630421bc3dedc783405151daceac6a3299cc86057371e4d11440697d6e0c6232a9498c1712c7fc59f4d63d537365ed396a6555daa39546ff5dddb3582bfe2d7744a8f79f30e9ddddd4dbb56162b6475770634563736359646d565a0f2600a9b1be78d7e233373a7306f6c177bb0cbc9d49c73d2c8c4a54897c6222ee5b414fb0789462009fa49e07f009c8ff7bb5ad78a5f8fc7dbde95477c8c377c6377f739638c12e8e09a20397ed31d8d3a53cfa7b39c4e63b5ce9641482959376ab45a15123e4e23030de60f9a010d0d58d2add05849d606cc46a66c50e30bb5a7d645a323c14908c10120606f6c6ab49857373c9b591aad65c3a5cf6230186c4a1b1c2459d13800a462c4e112e848d0c0d5b4684141341d04b4f757691c00407aec3967537e290e001c2ade78c13990a61fd1a536ebd143a7f395c840c49dca42000db111e868ad301790cbef2c6bab1771f86f339ecd66b3587d1683c1b68ef5ad2b16f495c5e2d96c360b0a0ad25235fd383cadbc963f8d1702da782dfed50b0139212540d8909b7c6c9ec6b3e773f32b6a743b0b0d2f48066ff32b2f088dbfa92d1f9b5fd1b8f15a3e374168fccd0b01ddc9f29014b44a7dd61736e4dfc1772850bffa6bb596c57ad93563e305b1f9d5df78416e9ec68fa13dd8bf2175d264fd1a917e4a7732f894bf60433acbc0a34dfedaa149de345fcb0039b1c4480f5db000c142175ab86c3112d4c509183a863ef9184eade3d4affe5ae9177efd429706fb4258c780b61071f8f753177887d2198cd01d680aa65c1c147023521224d79d1c8c88a3a993efd05a2deb5dd4897d8ce764e28d1643eeb06444698624e90235f2335a1bb12105a240ad533f14b4efa7445ac79fdae5f99878a39fc67332f183315cf0743d1a8fafe6f5d5c15c9f26d441c35f8be6f9b68cc673f2dd8884e489a7998c0db989432db1489a903069e066a8194b693e8a126a62799aab1147063207ba458c38b46fe2a626953bd1b893cb1aa63b3917ad23a66a4e6c444202c4c2ed8f77ba74551577ca01cc75276f24254837221d71d2c18d484780ee987eb59be947d22108490722465454b9a13b45a329806e47232aa4dc7e1fe3669a9a9a6e9adca9491e716a92414d379f3bd1d06c444dbe23391b1a661ae64ec70955a5aa2a954a25e38d1b954aa5a9549a4aa52db9fd349cea39ce258da7baa977e53168d3373545bea36e52375e045353649d75caba315315cdaf2c7d1ad752646ce84edcfb98d689a92792facb289a8eb9fbe183399be2ba1d34efcf7522cc5029206c488d289778a3e9ac5dfd93057446598838fca33ff46fdd8eeed231282696ce5a6722d1e264481337a4556e3f25b2347446f3fd328886e643d6a5e1ad3c571756cada75e3f993bffa6d3cba830db9c9a989dcd09daa131836a4b3dbdfd23e82096353affa90ce54b322ee799aed87b5e663b1dbcfd18e04fe10dac543524c27bd13b76f7f944b49db4f09f76bef4efdfec4dd5b9a1a6b69bec65a1a276bbfce8aede1f1b48b6f701e2ac78b40bb98f20a9a90ed5812e92edd3d129ce80626ceb818d03e19117d154022e64eca56e582539897d21d7c5b76e1224ec82c67dde6a4a98e3e0a7352e6e6a95eac7f8bbfb6be72ff834af5a050dfe2e163c0fadc4d6a95fad6410185f9f477b60f3d488077820ab21382c8983d145437857ad979e623c9b2a4d3d98341a05f8e99232ef1882002ef44cec120b096f841ef3095feb0016c146fc88f673f64996d67fc6c5f51cf7d3fc701d72dec46e3f6fb00a283adad12eaa79e47fdd4c763fbe8711795c4f6731bf7dbf3407deafba98ffaed43fdcfc6d56b717d1feeebf3d7ed0b5263874229b1a9bbc96e4ac9b36edbb6b49481764d546a3b63c3b8547ffb7e54a7a3c53fbb167f3cb6cff2407d3e3e9eae871796a77f849e8d9979fe6c36abb3b824b3b31edb0fcc79ee3c29f5554dca7610e8cb423a58c91136e4594dd703b4f1734b29f0dd112f7f9ffa08a2bc167fad12ea73cf63fb14eafb31027ff5ff2c31b34b8fbbd1342458ac560d6f3a279d734ee78083ef80291ae9981aa51aa5ee45f7395148a17622a8eee6797581f58b3ebf10049092d7bd8853bdd8302ecd7ab82fd5ea325ed9744e3ae7520fe995290708242847de158404e5080d42341c8955dca6007ded5dbea381f49319c009a4cf2efa9bfb0c4b33286120880645a0a67d2d1b4116cf08b0583f2cd6170663fe3a2bd655adb05c1371f0cb6a64c34635b26143ce9e2e03182026950046a31eca73b7efb0fa504000422a489281db6bdaa61de026e0c6b7c120c80f873fe8efaf6dd44fc5afcdbb2b36b45e6eab1886c3202c207ed05f007ef5f74dac13c1f522b27c43d7dfa488c328e268ddfe8a44c431bf9fab5fbf58a62fbf56f1358cfe369357af61ad7163c456d9ddd19a1fafac464afd75a9bf1af5d7a4f62d36ac464846ade338366cac5629a36a548d34cdab2e56ca808803de9fcc97f35d2f0f581eff8d2eeb3bda6f10752a6783e581ebe38d7e0ec78bec3548cfd81006b346de8ec42ab8fdb1d69ad8ae23903cddea3548cbd89e1a61ad337cdd2deed49a0d623d2289d06511f8524da34a3d332c1efd63e66e9258a79d0eead7e5d79ae681bc12dda3bb07aeb711e53cc1af9c2e650f5c77c57ec7d85d7c06815561e10758d75f4affa8f7f194f50597f1566619cca5c5d8aa1b5a5a8648c441af0ff661b0dce176bbe6f6063596c5e4be2ecbb68dc8767c6fbbcc937932f7f522a5a6497739b9d4077eb4aba534fd68ea32d0a35d1d6529f4211f822da9ba7db26c4afa4f1901863282ac55e6ea17da3e96c5b8371facabdd639d834ab1ab6432d9fcfe979ebdd3e3bb790d5676942774659af60cc276fb59ecc51d1f7ad53be43b3c24befa8bdc0eba72fb65278287b13248ebd0a74f96f6d584544dab9ac6324dbb31694d6af31af482626259c68fba11e905306e8c3b9b0ee66a52d2dbee9c365eb8d331e79c9bf7de8d51ba942e65835e6eb34cb6dd4d027ce64e8fa8ad6a7472ae940026db13bb3db1db139ba35d51faafacc76d0cd3ede7bcc8b778166701bfa2981f5e83fda3755a3643034531edc2765dba4bf7e88178a3c31feeee4a3df423e4a0eb612bf11243c14d5c54c43dd42e0f22eeb4947ef557d192a5a691bcc87291b97f9d151bf4e3ab8c032b6129b7f31a64e68f69197bc40d5b16b6528d26166eff0f0fc41d96a23fdce086b1898c7e4d21ec17e9a656ea256eb26496d2eb21f146f70a6d43bf70bbfd6b5991e5afb56b1405a03fa8940dd83439e954d1080220a0006315003020100c860322b158344e63a5ed0114800b709244765630164863490cc3280aa2188388318000000031002085a8c82a00a5cd43ff5803dd557280ef9b5bb967df70a72c6e677f592f5a6085a53815913aa8a353979b87c5b254dcafeb885963d7aa08f191d4366f65965fba422938124b4f7d9a8508a908584b9203c9664582909f6d17672c229bf2e1e62d2f9e11f810feabdbac3327accd411b8bb7f7844faf646fa44716c55d44755132699e8d002d9711c3c50591a448d6b82165c7e2ded54da64a2784920bf545c0d8a917bb37ca41bfceee4e9bd4d328b7926e051fdd5db2f6a9faff425f358114061154dd3fae462830daceeaa0defab92b918c48419cb0f787523f60026b12b7a4e20f6af8a94739745d57ece67bd792b395594c851a764f914a9fcbefc0e41da9181e858de0c503957fd199246cf9d4d5f7ec6aecd5d6008850b76414161c0633a470ef662385daee1271bf801916d8e4818e14fa0d06ed9b602a6a9a733e7f39c3907b7712927c1bdf08355ad765eb007e0c42907901fca6157149a93a5270d090959f1a56851e3710514be3457a3bd2cfb7dc506d5ffef3d548c43bfc0bd1b3d59bfdff1d8eadb5ca4afa8e058f4028d6bc46870422f4a4ba6d612fa8121f4b52df86aa222fe8372459aa4c5e71f4051d4b27aabed8af29b65d682809ea42e3ceb1939bdbd9f600821e1ce33700c1f3a0502f8c553225a6f12cf8272165539cb025a24d8b5292ff907b00f2854231e9f7aca23dd164eb59c5793789f658941804a5aad54c31bd3eaa5af837c7299b9ae680785f587acb58fef9377c9f668b2d2c1c3eb0f8c4057eb5c2f2a1f05c9886fc0805bf5399b307318120babe584540e179f10a6834a4ebd281a83e7075bcc20c598e6957b8bbd6e348b843400012cb5a2a560b1e6cdfe356ad07ce1696d1343da01a41c68ba6be959608f4f1f4178b3532dc348f382dd5214a1c9302c1b03e80a319905157b22e602de44e6474463de8d4cc3a9a89797be21746de03a03189666da8becfd05e68f20850236f9adcdb0908aab113c1572d0e16cc92d20a6e0b87bb40b8fa34cdfbf09b4b809d31a4efd4a587f0a98055a475aef735062f234d5a52a25b2ba34c4ecba7eda7506709e9dcad71f1a8f3a842eb85e6fc07099c519ed8cf07a144eb78c50d5b8517968013a60e8e057392a54be4b22181a8aa344126f047fc784f21a8b2f99c9beea6ec559cfe96db6d123c2d47b2895d177fcec31234b943a4a164b812499268614151780352418b20981a9836d62fa47f63c005dc15ba019742c7b421e41ab4cfd3e29a27343ba0e8a8e06cbd6f9178afdcad7599abc92403783231c2d263ad5c7047537bb422849414f693c075e35447d59e7fb0558e94049325e911cc10e83b00521ca8d74b62410dc8005ff2a65c43db7b09813509ada2fcb75927a52c02c5db81e6d5582cb5ced6feacda66a23df5566c19a8a94f9dca63235d34d6b7e04cb2117b20f4afe0edbf76123f390c19261134987b0e137a499d1b92765a386db544d5de8011455e2826c43e75f6922fa7b098db4db36e2a494f241996860cda238acd3046c4a0e27a97ecce758c4af98942ff3e37370a3ed6ef40eec9a0b1107051d62b1e8761206c9ed970e894d9b2e098d84366b63b1f923b30d4ec3b94c18433db8da8fb4e87a209c0b629832ca33e908542c41d89b5f44354e4da660d6583f1e532076361f10560943ff40399c5ffbd0f74eb03c349cee1da460d6c7eabcb848fe3c898df07cabc8f329481f2506a32a1e5eec98b0a95d072bdeea279cef889200310735c9bf1430d686dd62e08193b9ce979d0ed17488655515021c558264a21f2b5f5cbe349afe9b65e5f8c46a4101a40fa61e16c26924f0bec3cea493060f29c1a0b33cfbb165a861c702e210c3071c1b7912bb6beccc9af06a78556941f1fff322601ce189c36ad8066c71806ab1fb6a78f66944508934c8a3a1c94b32106abedcc989d5d6d010e92768a060d794d35dd63c0798a710a1e12f50146cbcda21804d03a124850b689a02396b13957288b6d32bf0c835edad8128c345318d3e27797e08625d60e2657b8b906c23f37549ce771c0618e4a554046735b411e456422691859e691eb3087e0dc5c537126673fb40af21f5c2da031c50b41c3e9e6cc4e5ecd1a9553581b51937d6cd56973128e9d73e0b783b8c13706ee7d1016cd1b481c15aed3a3e8002a2aba1d4b2ca41408958695aaf5069a2655871e1123362f63d0232d75b65662d6f66c3470d4c21af7079b0635b03dac0d325c72b014c9537b2efba525684753e9b7a8779c7fc22f884441520afa2c2801f1a5e494a31131b5139c449910690a8590e27c4332a0e5128e8290402b7833798a3389aeea1d5a17e4f12e342ef24ec1bf5e769dffc0db25a37ed5ee4f1589bd03db18e5294ff9c6d2d4954744c0d1fecadfe423290e4e5a5972819c8b0f5d1ffa3f75f6b513dee6e33547a1c2bea7cf733f1e36e5502e1b3039f98e01410226f38ae6e332665106c8faf993165ea729fe5925f03906d1ba0c9537a34f305a3dd339034c8c8701f0fa741b859577712abe7aeaa7674ea8318482d72928f8db9d6f9440b75b541f56846f9b7d6e6351579a811e4f7719bfda60cc549c3f97e998065a0f5cbc9b56190fe75a54804e6ae1b3a0b27eb3230ed2e606c4a5b2d30fe1f25f10c592a4cbf04261a342b536b938fadc46594e75818c2593050e0280f8f933fbc07a19dfb7d97f22493454de7b6941928235875d44214ad712387fe50e7d8e31894f0158f9152510e58a958f3a5bfe03be4e2373d7972879add63554745ad5c2edaf6b428e8865e4ae26ea73d406a43c253a50515b036cb8b2aff204fe2818545c65a54b00091d722b74fa7fa64d69a60a36994e300fe1fc391ef7838e5e1333e785c2e76c75a8c00c6764716a618fef763c5b2b82d38408a81ea5876d0db836bb1a19504a50ae8708e1e62e76d9969b853b6c3f72c287b131e21901ed854141ae5cbf904449a2fc643b9afde0f393925d2f8e33f2bef2823b203134aecba09673af0e0437878bc1e098dae8ea99ef4494b9f3a725162fa2676f4c1b6fe7e760e087a4f21e7182fe7318e081b95c9e5ee42aa6ffb86c34ea1f6214cd42de31904ed560cb8e30457f900056b9546c9c402baeda351598b15e383ec3ae5cc6caf188c7c662d57398d2055304b3b2ee13915c4bd29eff8117c989ae57ad138f901d552462065caf099450748409611f9f43e6b0879ed8daa54049b671a442e5477ec0459006c7197a3924441716f4a589729b703d291f9d11503756404f28715f2d2a53d1cb11d507a12c229fd4bda019ec58348d8074cf231d39836eeafe91d52dff3293bf6c1a6e32d1fec99b7a3e64a62257a8ac83781277ca0ca22a0c775e27e84204dec7e83b275b35136902487ecec8aa6313cab81188d37184fa61281338f591eaad72f8300c7062e06473e846ecb156cf8dbd7d948ecaf0267072b54ab9ac9afee610ee41f6cf8646940e7594d292f26a2ba3930cb850ab32b4a964535e7700b471dc6453acee3f7c299b00b1c69416f0f1378d36985da0cd355774e022333128d2857c0a55f433686e60df862058fab499281b591020e4ce1f60ec3fa8fbbc6fdbddf8f2ad8bf84a003745ba32dc20aab5dfa003d6fd5194a5d3ab41f0644264465861ea6ea96fa0150eff6160c58a0ff2913ebc451f58f16b22535b953824f37b82fc6165202748bacee79c0a5ef4f1a47f58714081cdfec704b29bddf85b9d2f8dd9e6fd0367f6bd1300ee1909149548d0ef424a38ee0bf0902baa4dc88ca2046863b6334e6487e36cc07db595f1df4c2373e3a349a4b9d509cec441d0671caa2ea147e0c2009168e1b4a1e3d41cea8053f6710715bf816517c203b72d41d590348bd29290cf72b9db278abe26648176d38814da5baea3b1fbd95b042679cd4e46265b23e6d3c468e9747c10939ad5cb1025e73405b36c08f3bfdde8beb75a9896d84aca2301a9c83a689a0daddec8b0f865bdf60184ce80ba243915b6b29f5a1519ce185b90f80888e830ab8d62b37a5c742f9a1f81b1938673405688e8b54fb64f509f407351208c62e446856765bb504839dff11123cc2b485adc52165cb256e544f3645c5c43a850d2a1422bfe66412d10be43487fdbadd260fa65e4c128253125c23c215d8a4de084730534287d524ef888a5776f11cd0d2cf1add123a9b0383ca9b129b0748df44d67beb4454257115d5dfddfb61160617f7d06efdfcc7d567d530ec900ee5d2b8de3976c6e32ee9982ce6764c1a5b241b2a2384ccdab2d28960a1d1864539b761e8c088ed602d6d2e7b78470e7cab90b478af85e03c81283cc118d76d71f211f0f2adaafddf6ac74a81bdae08a694bf953b98b1f9c7fa9f862247221a09ddafb0032d3758a595ab28605d5ccd8eb983428997c3acb79b18918216046fcd334e63cdbef97043c7173aee883a54d7333d7d883d116aa4a12f4398dc4a2a833aeded90c184e12fca9a1f2dca1afece129cba42d8a7be78ef633039cb407088f22b115da5fc93d32a80437c3bcacd11b7ed7fb7a1834545b31fd61cf310eeee39f23ac002e86a52ba00f7c5704324ec31f514ce98cb5d388cc083e267b2cabb4dbed78b00ae22bcbc752127e7c8c2a7e9d4f10b5ff989eb6b1c0affb1ced956c57ce8e6be5307fae23f78219bc77093bde929159d007f4920738883da9944e072d24ff5e809e4b1d0e9c80b911318a478743969a72bf871a15fe5e1caeb75259f7db9a4f42004f27930953c42cf198fbf65b35196824529035f16c0ce9f2444b7a20eced0434cba5aa81f4cc0946b76d161b3a721c132a0f073779b6176b1fda4150582eb9246b079d66ff2edbf70336ab5ed975c4759b61698e51e523e6e0452bba1f6544b222c8e2a7912d358e4c5fdfad7eddd39fc3e4daddfe0dfead55193daa28d4ba0c38533154fb68924587dd1491455bb7ecf69a6d1259a50d841bf7c746d10b611c2aca1e628fb996446ca812c932c00cb2c3c66a91e7f4001ddd8cff15e65e0b5101e053b5bfdc4c400b4bdfdc9c9428131d5aa5581dc3c57a64467d5c833c229794e98095cd0d85975eb8fcf886e15b0c641ad23b1f8e096e0a2aaf6d49c22d4f878be6b12aa59c87a33d55a3b32777a5aced4ffe4743c41bd7594cd048585cefc9aceee9038ec8195fae46c328f7aaf2b1e3e041f04c04159109f1f4e4d87858e55241801c4cd3bd489d11e0e8963268d6339d61da6cd92e9b8ffb4a89e6909b3fe750d57baa71d35095b38e0ac9bc2fa26ae5c651d5a137244f40996223ab37d135ef16c0ddb6e08f38bf50c698bdd5da1a33b213a28604392c94474a4ee852104fca734447d78be73144c9850a3be2c5a52da0b3a9a6dec0c310030fe292c56113249407d5fb79ae1460ebe1a596c97942243b2c3caac41b3f36e1b0250100a9b7a221d67d60ab66a2dba9337766c12238dcf0d0e1a201af45b861b113e1db85817f3e575d8447ea129b0d50dd7fa18a389a2e11f9eb8b09d82326665f6fb8ea111b095f7758380ff928877cd084b3b25209fb0049715b611d92fc85f7840e30294353e8ae3e085d329d764475a2fd8fef90717647bdba19525ad2e05b38d49fffa7832ef712afb2870414207f3e2a407e5f8cb76f262f27f5fe0e48ade78ef82721ed563f196723826c1c6b0d15ad87dbab8763fff0306b1dcf0ffdc30eddce940581ea88e773c3cd3e3c6452ff6b62002f9ad3986830e8bcaac8311de6176bbc0faeaae1050f0c2fffbf9fa8df8b1cc20e0b1feb1f8945ecec8d3f6ec94bf44b00bf81d9838c94d1f37b050ee4cd0c6a9c8a8f16b1f955b6b2bf0a5f6c1827b2bbf061c7c185e13e81db3a9d560abc1fbb747d2ad4e5c03700b1d87e564b97b0ea4326dd767cdfaf521946fba552aa547d6a747b99112a2e1bc378f6fb5695e65ccb8cab4a6b2319237fafb134d4a8238bfb32609b66b7c3c737f6b0951604403d46a3b93a186299998a6403507c2f261fce70ded815993a2a8c7246e060aec451246b1ffb680e0f167d0bd32d55f17e26e2c0f6ecab67d49cc84c7f05e09a97a6c24ffeec0d885924412cff49a40284bb78720cab33d2fbaa96bb0e27a5d9cfaa71732b4c4165d428d3e07ef208dd4a4d3e3abb4044b15eb01f468df592eddb3aab3ec012be5c6d9f0021f5dd52ddd043951db7c3ae84f4ca60f66b3b7c3bad266b62e96818916f406975715c2537e4681ff5adcf8b9341bedb16c1fac6ad7eff470548cc1f119482cce6aa4e7ee325961e1194156a1129c84d4f1edb46041d7ae7405a026b1f5a23cbe7c3e06906e130e00e54a77448447ca69658acef6bf0b0089c0054ffc0a45af61332d460708ba3c8712f7619f65ae8c9fdb335a3c31377e8870c6450489048c6e8a4841fc1b9f9646a158603c7edd8614f6d3a68ac930fd46e6712154924a406da37b7900e7bd9998809f51a8db437c5d3db15ac7dba09feba9ec47ae54b4e1f49f4db16e3f400f9cc441cb960dfa9500e10cdd9f5854e0330613d3c0b6f7a04f2b118c4383d7b7d3252f0194e9fa1b511123ac82137bd9370ca9cb1e1f42da8037d581f2f66f79f171721f8d1ef1d794c2d63f817059ed3e7d227a0e1f7feba37e45ec5e00694855b9306df40c7f3df2a4efaeb659ea3f39cd4fc164400eb3ead656d9167b175bb50c2606a892c5cbb21f384fcd2c0afb500a288198c8ddb51a9c0759f2109d5510106addb91ee1ddd446dbbd384a203f940c0e6e60b453794dec3bf1a62e11e3bfbdcd6a908664e4cdc512340e2da670dc610d63d289857d8bcc92aa19e6db0fcbc3ca8c6845459f0463da815545a9322ce518d469f4dc309738643187bb23021b37b263237f870adbe3450314660471b86bd925b5f39c1f468edbee27ca700e5b67ee21553f39561c263a9d2b47f21ad343f104295c4efd9f02808832b17afa1942198ce9cf6ca9566990f9b7f0c2764314d10c8e5bc0a16f607028f8660a39f9290718761c3e027e50fa177c7792a402be7ad0346bfe0b127d15f53267597faaa3e5390b64944e984db636ae22edfa6831bc46942fe3851823318dc7e5031da8f44528e108001aa509f915adef443f3ed05f46da90bf00f91583f373884661aab66ce17aa991c33354329a566aee63830d242d5e28f73b6356a5706a7d499a4fd7bad86d916d899fbcfe610acad8c8ef70a2e9e5cee0d03e5986b191ba8c8b3a15cbb432c90e525c06eaa0927ed15dfb8ddbdd9d7afd561f486192ed370c6e9b9567b5d18dc3051163604e07dedabbd92d5cbb1322a0635adeca565394f44e0e391d90b174b18615a7672741865a532ae4745f9a51e29413b09fb67e781601496f5c4d1a400245027fbbf918d5f87b80006da7c82242898a167812c7a80c8e1fee387e16ead2187250b3a1d354db7c23a81ef176a70685b6511369567ca4e442795368e066443eb9b68b986643c46029a002f6b984a26bcd3af5d88f61919db2cb2989e04ab03435c402cffee29d4ae5f0a43dfd9f10e0b44ad377ce809d9f2e8139973a62944d74ec44b0c03b297108728c9bb356f8aac48637ba4e7b19812955eaba46bf8bc3846fb98828573f546f1824f9dce53955ca1f762aba87e7cb38270e502302524901dbea65f4d60365b083665607d04ab40953c292458e281b848712b1f9e6dffb7a6c3b1c9c1e1e1c97c111c933b1db042be44f6f84a2fce2b3c902eee251c0c6656c24dcd242f97d245934c217bf4621e1c48c51cc897ad610e1426749f0dd70e642c0fa48c459a076aa1070a1acddaf270256ce532a26bb14cdc97b26593e19a8851e386e6c6d8b9c0608c1b899256ec8e01e9b905a7a6b8f51b0abd12a01e313bd2af0f89d1aa4e74c61d2fe403622c9d4381660c7052a97174da538d6f50b420f816b28129012f69b556060de37bc64bfe4a57567e392f291d6c31c3d113e9ff9a589a195a35fef27805a7c77ec85ef1b057869e9a8c987de7426dfa44d16c0470e14f664440d754e58af859ad538fc74697f21289100dab5b7aaeb77c1411952acce30986767ef6231aa7bbd85926f03d94242e7661ddeb4be525d80f3f4894a77c0c5777d1486dff2ed786770c3beb49f593ed7c772a6fb4f62de27060a8abecc1146a3b73b570409401800a9988974f0f3c0b8e645589f9f60642016f3517e5cb8f4aa17ef381ff9809d87b05f09eca7fe83ae5757466409bcef33198d010088de2d47b738404a31e22b814d3aaa0ea100f7711ad04542722b8176f8d2075118453f12d055043234ae0827d81cd685d55b383c7b2e2b426480d84e05a640b01ab4700ae225b29487dc47053ac5501d5421cce225ad0821235286d145df658ac617de2b642b7012563a7b07c934e6ade38f0b4e3d960291602ed079aa1a00e251579b758f32c7e85f06916b96e2311ead7e91f89109972453539795b82131d45359c9b1595c126761ffa3a3853b45840cd0a663f057c819bd193e774fb03bcd7daa971035816108a98ac3985813f6c50fe97cadbbdaaf032fa55f578ab0b4eccf9daad93c6f45d582148950761850f24886995703f8a85c925482bdea4201402f196ed9f4f6e3e6aa8fcf800f57ca34d44185de6fcf8e5966baf908da261c3a9dde0b98522f20fa6dc8fc14bf787328f1f955c60770ea81cbdc1d59f00730634df4f88bfc0475facd54feb2eb8bf4231374eda6aec8180945d916b1b0d5fe6f39d8229201cb85616c9a89bec0fb084c7aabe1c14ac4eaddcf38abdad47cd052f4772d96e62517d273a93e414364e8a643c26ad1cd84dc9a7036d4109e1eac4e6b113f8919b5bc0ff306b87b664df64d791b51ffd869f68af77b98f85154e510f7964f259a62720216bd4935e1f1430244432b2274b13774adf4737eaabd89f82212c042c2b950f422f59de48a2bbb275d2e19fac1c5cfb5eb2278453d6e8683b3a50145974117bb3f1cd5106e14d4434f8a6fe43b5de3f352337d149e1c33faddf6f3fcf40435c5efabdfadfa358eac5dbfc4c708039128dc61b9136523d45982f93ea6c0318085d814db33daf7dd37723d22e1198eb7e22527663063975dbc936beb6354bcb71d969e3b7737c4e0ff3e8298b68c4289253657740d647ed5977a04b9bc21561e988e65ec7d25cb3e2c834a56af7580b858ee68e25a9e36c3170d19608cff885f273311abd4c04e98477229706e4128d93cea4385d34e2dc1993fea2f7000762a5801a18cc328cc4decfa76ec138671fa23c8e8a376465d0b251c4ff3145e3166a06be5263a39b47378d44f4deaf805625a26559100fa68b2e117503818a197fd17321be5a187ff2ee6d689d7536bf30944da601df1cba789accd6e24f1077b39147f30885c6186a00bc1bf308b446c7d7dcbb00308bef3107cdda8001f1c0d5276b5530eca4c708ece679dfcc92103dd5b5c2f26cc46c4247fbc7730908768cbb29b971fda424869636eef5a557d05430bcbad92be031029268287b916654185f26548e689cfd2b009bed5bc8afd08b6d294948ac720c56b6298b35178871e93ca44b0e8acd8ca0b665b87e7821d1fc8e758b131781f6503a3b3d4b079692d15c305010924e4b16d96bcae2f1c85a7e4c4e22463c595a7865859d3c0604e03718dd1d4a00a30eab987e683c6ef0310cff2390db3b464ae3277b4dc9685f63f79cc2465e4f7b75e26c4a3f0e13d2b978bb7f153c0a64f3b298c2aafd5aab61b9359165fbae698170d9f3925e813cb124792f8823a3149ea735c90bc6016207dc50861a3c853660d81563f2d2719382aadb6fae75fd5a4401a13cac9dfae0fe431549984b246bfcfa0697c4c7b502bc306cb043810479fc21abc44edf9ec246efdfe9f538a2ea4db3997582a27c6bac9ca60d4d2c623dc48aa1289965375936b2074dd9c046661748e4fae3af9b3aa24c244cc1e688f083a8582b404e474f44f983ee17a06d402be8bfe326ace8bae1f5e909b69472d21c807facdec9098ad1e8dc5376283f9ae364513896f8ad6c59626cdcf93be79b27c08062e8b42c850dd2a1a1a6b1ae6b06db570ee48460da102b3e96f414b701fa4232c44cedcc8e64ad6518f7d84819ea7db4e130fbe79622cd7acd0e12ea11167e61a6641d595a84995f7705ace1ec1460b4c3357d0d16b51dbe5b2b34842154ce5687010715d82e2e212bf115d1943d86d0e46d20bd26ca7ecad64bdd5277955c656393435eb2559428a29dfefbc17bdc78068eb62f14d18dd20ee89fd8794e59eba03bc5437ad2a62434492eebf200193c65be6b1c873102405d19650317253698bc3ca1d8953d38d70103fca9b83a7ad42c7c938c6c79a34240d68817d95a6a62153a65b953a04ef16b79d38b7cc061db2db8bf5911d8f33beeed16f53a8d2d35e1d2ac8c45635e7e8bd64e2a235707b26b85271de34b236e209d500c0844741785bcb46e237a327a24bfab72efe11baf16e607b7459f76df8ce4e31cfbada532b771cd880a428d763d3499d5c92cf125da9c4e3523aaef25b48d632c44d0945b863847aca424c7ebb0de4dc21644e89cf6a5aa4e6e07a9c4c4d37ed53a951d00801b02878797379cbf32560b0326b9fcdae9385e5063275e04a3605f58588249d143758f685ba900076f842f19269e224f9ad70c523b954cb14e5d6eb329d17e6ca8f554abb6c3189efabadeb877e6307349a91766321dcd603c44dc2ccfca34a7a7bc56c096e5677c40150382061af9af049c10cd44003d96953f981b50eb2801684c4a76d3edd54391ce8f10669c60b09ab48f200aeca49510443e2e53505e070a22babb2668096714a701abec0e7a258f65ac5805ec8dbb868909d1db19eb11228017ce58068480081a7ccdfff4bc4af38cf4e1d18abf9ef73af05111d651b05eaba935d4c3aaa784b6e1a4ea08445aed2cb64126d76a193b58ae2ce8f8b6aecca14030d99fc2de67a34d56d29415f3320c5cb794b2c7e2916d1310dad6c56453c9b5f91f3ea21ef993c4140f45112842b8a07db042d57df316f4050e430540b20223e29928d3dc8d032e7522a80faa3a4fd83e75c6019c43357966945b061d27fdc1d46a30e41e08476d913a03053e378345e8926df09ab73ff4ced1e3044c413e7455d269ded921dfc17749a33380e09a5a7c23d561085ae01ea34bf31531dba3c993b5a300217b026995c25181a5f7af96b0bac1f96240bc90fc20e9f527de7c7076a361cc699d39548621fe34130dc30ce249d7e8326c87acc57d49234ac83082117368d02117728fe1ae7936d1a0b6aa26bad2d2359a58d66f58f23cb78ac824e1d07dd2403c400a47699d84cf08ce1af7c1bcb308a0614276f295574aeec44e7252c5d06818ad78ba786626c7f59f2470fa3490e953ae0e51611274f285f54b0f053d8dc08de6fd78963fd49c0340bc6193c357e279a1bda6d1d0e588b3c3f13fcabdb9128870faca7526a3c29b12ec7b1e0bef9c77d53ca7c94d5add629a693847d6ffad842d8aaab36e7aec981b079028034be7edca5403b3796bf3b405b94a472089cf3f0225f863770386f30c70ae155e61de6969eab948477548ca81f24733b9059e1aec7ff1be1d637accfe4d22730d70615074b3d9d3bfb86e30e82aea120de6c34e1a20fbbff18899fc5a1d59562c6025666e233467695e0f97fc64832bb0913fa3108a048efd541640a99adaa4a5e9f408a44eb9666307a91788f465728963fbd98c3a6d4877ccdd6b7069a9b70c3fe35e1334367bbfb5954141f8a9a766c3cdd1879bea1ce86a56828809c7eeaa1ab362457a39afd64c49c58655fd3fd0b309f65bd5dc6a4683d05ba87d52fbc52987ee5aedf0516c03ae2b2b801e5b7122ee04e1f230f51c4bca52d4428b272223b06106f97cdc06a86f95b6e25b901398b3c5e87a62c510760ca65f86c36b1a100165578ff863e6d17ab8de9179fb88523b91540ab8ca713385bcfbe52b50cf4c349d619536561a6752b9adee08c7658d34199b5648b8cdede589bdb9ca9386956b13a937453b31db3d3147c9c3857dad39382e51be8b6084c73c2233610aedd396139d1a92c93ad7174b88df509905a480aef6eac76dde5950df73b2425cbc1f28bd266404a409f6983384de68c454222a309b47c9c747c7825a3481548e9a7d75b4640bc6f238154d4d3867b8cb8fc41f19a584590a9fa604c666fc225971c098a05075f1347a4a5ba611f2b8188f8522c17e04092b4e206f673a61dab4301c5f5a8237fdeb7771216574cdac5b55ee9f381ec4dc9ce8e9c7edd5e583cc9c51f46a56130f1db0418e2957c36520050b5ba5eecd0049471c72831da06522e3255cfafb1d900e462aede2e38d4b712f9757079f4b5fa8f8e1b4dd454fd2081c29fdd222ce487355779221a97be26a5aedee6a40ca7c478a89e4c7b6193999ce3810ac823c01a88358598b230308033a8bd36693f46f1f325b98bb0ffd9c5c8a075d27c6861c6efd7c0c50cd69da7d2d1a3205e80f82d8c437ef30915e262149eb23fb489f58f1dcec67df077cea152b1e17fa4e9bbf30445960525dfb9cb9dfb6fb55a7ed34eeff53db2a3b23e16417d91f3a6d47708a8641172a686c75b0f67068e4b85bbd176587ccc75fd1c30c77281df1bfeab54362b56621382224f30f7c547718695c7bc88400fcd3fd6f7a9c4087de11ff2b7d6c24754c87e67f62f8404881d04404090eedc63c02684863633c7b01b4ffa3a46e1d8ba4b5c962d7aabdca6c10b1140116a14262d60205e748a458297de01ffdd7b58bf617316c3f0342fd97d20da06d12d949dd1e491a0f5f03d25bdc06a4832d62315cba3938c365203f8b04dc59ee4606a505d49545823785b28005cb9e171c1a90760568482188f664ce7b4c3dfb3ec3d96d6a5bde4dc19e9daa583e8560a0ea9e33c175cba5fd341c4e4c8b4dddc14f90c9ace39794123468b2fc41bd5faab53294647408fe2c44f255f432ec9d9f1e16f6ced2c45554bba6d986923841cd37703a336f4d3aaa7afaf1c44e568f4438df2e6e32ec0f959a93101a5503228716ecd44e2a0ec74ab014805b0a2c0f4ad3dc2dab36d9215288c8d76fdbd91e099a4a0c6711c2d922f806d5004c211cd19f49fec838a40130f44130efa181b76b7177863d9d186780acfe741bfa4e284df9d4c1530a5fee025ac1383f0d66fb7a803e9e2fa27bf44c4357dab40493fcfe4b0defb4c38fa87948302754f7c6464c58805c2b709804d4e961cab0ea10231b8017c98cec7bb08d0f91afdbe94cdbe020bc7a347e252a57893684576ace2ff24910f181694904406a4768811d01dadfa5fdd6d12caa913cf7bfa3cea7dbf5f69452bc6610fd4d920b1528ea40f029a0953c63f7d3d4c4018e27bb943576e71b666454a5fcc64fd41257989146629b66ce5432c50dea55442bd19f2e70f093144ee10897894dbf2cc0f699bdbfa6a30f289fc66307c0c1407b9e6e70b88ae425fef7c67e38b269972da72b5a691b77f567ee0cdcc9e87ad6e70a29a91081429b349865a3c0907a89709d211dd2a130da3b3de3a298ad1d778da6c04a07e35b9fa8f126d9223d3cd404d89d0aa5a110a21abd31879b8a9dcdecdfa70bfd496347fb1534942d44e7ea67c02e8f2d989f571b215a5e1bdd2f8f41e4fc169c7950335106fdc10674e369e2176a02ec695af1bd4e0bf0082f3e25319e5b10bf4ab40af94e91a83918f663e2c8f109f10ecf35eef478dfa0c00002fa2b3b1d60cef0aa40664d3e91ed9eca27cf57fbfa9b3b5cf1f92161d21f134a740adf01f6fd543acd9bad151a1ce21d596226c1ea0e98cc1e8e64cd1ca99478b6f1eb19fe4e50086937f8a9ebc039d2f4660fb2230454c7312f593b14436e853c8c5cdce2f60a64f3697716fde5ea1e8283fc2d3e2ae3bc1c1977fe5e042cbeb842e0f33032f188f2bc934801776a1ac5169ec644061d206104025e0ee8cc1b6dc1c23212411065b3df2f8e4bee234346b588e66fec9228bb204f0caf5279284e460046b5b80c5be35d080182135918641c2a5184f3124d80778467ca8790ad37b342186e6fa5926d2fc70176cb3c7eac8b00dbb2255fd0100b8d235718ba0bec68986945053a9ce01224602fbb646ae63b93e0895c8a7f49379e64fe9e2784e5f0f51e79e42cb0f2c26243b71ec398044d28edefe573f5fbf40d872b81e4a76c2218b962ac6eb7e6b4605693edb70518b2177a2f4d72a6b406ff1f8a675e99d8ad9d997c5bc5ad260d99e179e2dcdafe66fc9da2a92fe2696d5d8bd89460fc0d035e31c071267edb04bf1751aa76e8f2590e9f2fdb10d63bc09d570bfbae8e4ca1a44f1e916fd2b1f35130bd743e9e4ef8abc1811bd59226749c3eb50ccf26a6b6e2c37f723d8dd7546e799acaac86943d833b5e5149718725bc708fc278da6c1ff8aea901c7e7424e1004efa9672cd57fd786b5633c78cfd97ce9bb015ea78e09f8bdc8b5321af4ea3b24cf40b32b0b10d901e14b972a8aedcda67317c942ce488d7fcda52b19470d0a6d52da3281a4726c033df24b07cae1fb92d2829202b55afad20366de576edd71e91b64ba81eaa8ae85c174d1a60a26f9f0533599b5a4a1b536c51698340bb0c1f5e7cdde47999abe4a016eb3bf050ddfdaec9b486cc682f50eceb009925d12943a09dab054421d465d64993713113252240e330ce5f4e75165db448418cbca5e42aad731dade04c7710604e8ca2d84080cefd36762a78820d29ea25f4412e0741f608fe922fe41614f5d4a111ec8511c684822b43a466afd8a5dacba9843f2fc927e5de5d2a0d98d490714af69604c3a55119ded798b26990fc05dcab133ea53e877e96219cb0bd467c42bc8c712984643599d9b87a9cc09aef331fff850a6db50f643f5df59d5b50042fe44c8f1318b0b2b39e11a6640f9ed9316c161338dad3a108482f7ad58f618baa0bcf9583c8ff6b239f43a0aae1e840fd65cef71ca236a5420d1c0c903a93a436260ac9523e550804c933fdaef16511f9d47e3e946623ea6bc05689deafafd974d4e1d27902715e331eae28efbd504e16a8fda710d6b090a420961e5a6265909849c267997dd8b8df5f4ee8a46f2f876ee4a6c71ca330a52d59dd642d544a5179f1bf23f2235a1fdcc9110f020618c52af7c4efb843b3a7238d383306ac152ce41e336da5f04b6e8fddbea438f387ef5486c14adf4704afd9d581e284d8e5409ea3c83f8c57928731f319506e90ec085f19b757f47bb0c1fa9a8de72f613a4d87c55a176462386a9254e4120c196ad20695feaa6c296985a2fe74c4d96132b7e8f0ba232a84eee13a210b75645a5f1add3d5d884c398183e5a3072231f4e99e7a59f960cad3d84a15d10814b69206ed5cdaafb61d4e588c0f9c886c3a61d3142d443909d7ec08ba622dcf3795a90b23d8c70219e298563d11e0101adacebeba175085bcddc5a2d8ce45558d97857730cc20a60feb125be34e425a0bdddfc0605bd10d5822126c4a7faa01a69c00e886c98f2de681513a2b53cd85ad410752620dce8d0a590330adffe596c2858e14e4118abf7a7b016b09bf468dc1093a37619b54d91461175181106d6965bb34499585eee4f942abdf94d649ea745ed651a48abb2a99f00ac8409facb7d4a24f6671e05c6141087f3bbca5ec97c2f8235c9d549132b46bee39b236b5b2185ad36a1ab9f9d06116a18ba1562b15de8d02984b8c0d3c32532b078e724d807372312f94400681932982d152726061b636e650ee420b92bd8bcdfe11a4088257b6a5d667810c9624e07a772dea29fd2f402aa8c7f337bd1ad63b809f5e0730fa59a716c2670385f1c040fff90c66bfd10f245a92e8be6b7ca995519ff5f5e4d50b1901a08b03c1350b51d804d8635df4cd77e395120890a026806a6a149153e60b4943e1c17754689dcad58771902605879d7ef1f7c617b37ed4ddd13144ae5c5d068d616f2eccdda4d25c649712c92e59ae45eb86109542255e1e81deaed1521785c1fc942c3ef80cf9e19237cb8d8d1f65fb9541f7034a33709bb4b487a89638bc6c5adf1e9a1192c9027cd2b56a5959b4720f3c09cbc7dbef5a36d72fde09505c56dbbc35e5d3f10633ad8d150a0e36399c7f56099604dfbadaffa1e258e34f00bde7005542d67c0a786e717a758f67c471ffc8602c12f92b9c2a4d7115e4201e9ed72bb2cf00df23f054e7c68ddbbf536d11a31889b3218daff5d143aff41909396dbc4498d3b385f0517eb65de3900500450c1226cfa08135b39736f9c3388d62f07ec391c921b173fd3a65016083a792d47ef0c29e978304ff1c39e429a60370491b3bbca939e672ad6998b49f96b457acdac96af2c66fc836fb4bc0aead8707142e6596eba054c188b5c67c36c9d316b050300e86cc13a5f4082eae556798c67bcbd9194e3fb0b2e2e0cf2a5d4bf662e00cc80cb16332f107f833cfd54e1e014651436e92451ed02a87533ab347b29dcab6e53971f126a838a51a955e0498ddc6f23e84252af369033f66b9dacc87cdd4f4d45b56ef2b4b87493b8b32d9a8021e7461025d38aebebded19b6f5947434b38500876038c180c194c07166b1a63c4e5156d054372543013d51eca2e93334644a305e1032cbcb592eb551f40f7a108d0ea2270bbcb2632f6134b6331b6d49e4b2b58a7032b8eb28db203e651e4f79a23165521d53cd8b90894722f654e32f41abf0838a4aea8c1b5eb52aed65ba81cc104a4ad59a90679489857d2c7ad32fb57156af322265a8c3d0ca14bddcbd065f0714a679d6820c3df8f93f08eaa0623c9a3b636a0c88f2a2de21206e00842a738897bb4185e2d441b5df38e6582d88237ac0a198484065791787790e5dc1991562920c2da88bc3b2224e1aee2f1039247a466496386978dcbc6d29a854464f1421cba138b887616893927597920727ddf61cc38be86b108a408a68dee3df68335c80f13d852a059e6e05218a73a53414939a32bd4ae4788437080f813c29fbd90fa2ffa0178570fb5332866ac95bf7a170d3b0fae5363585bcecbf195c03473f08a51320b1d34157b193fa8adeb77d271e47c1dcc2e6b3bb2b23c2ddc360b46a068ebb3c5e7923e7ca34620e2529754d774e010517693f729a4902e0adbf4940778d43bd9a64a3ceda2b58bd52fe1c2c15d694ba66e64052120fb41807fe11b437fd54b1527ba843b7c75acc05fa51de39285429a70ee6e0e6cff1fc2a1ff6b3a81c3628347298c0e3c0a690173c94180821e770d061d157efc0278ef40be434389fb16e453a5c29077febc9268d7287c6fe631603aa4e0f045942d851b7ef9c1afee2c4463fa8902f6eb32e02146b1fc0fb06f15e58706a4ceff81e6213e1df3c2d5ac2ac9bd7074d4c35bd8c3a80ff78bc28233e7488684b8e0cb422b5973a3fc8260f4a9a6d411b7cd4ae20e9c831e748fe225e140710539599b69bfa2eaeea9d726ef395cb8932451f1d26031d5575a30f5dd28f0249b3da017870551a15b541bcd02b419919d7b2c17b7962eeba55c829fac3bc29f9394839981288acb35dd07d13d0c78b21241852cd82c4e28e720c012fe7e68aeb41cb23b19fcbcda6674960fd4e82ed2df73c0e824389ac89df99d4dd52ea8175e8be6db21b726e4f61a733781d0e65ca6234e2e310d9ae5dd73f30328496128451acaee1fc246cbf6d78a6f9e3a0ef8baedabc4ad15b518314e1478604a8c54be97e39d4aafc83ff404a1a27705171105fc85dc59a348722541a0edfa9aa6e7ee0ee171928e6eaf54f223aabb11ba645ca3555a227facb3c1fdbe5b01be48af983df7a584667e980ab268937a59acdaba9224c191c3303098fb6d30e0487faa830f6ffdfe8074e5fa228fdcaa517ea2cf8f7afca5927897ced8038536258258c46333e6086698050374babff6647dc08842686a062726ebb5d7d53543eb59e274050e61eb71ec7366e4fb2604e27f6391b75dcf4dfc2f7f9092040eeb8e403d4dad2275821bb98c29c5b36e8fd3c6bdc3a79b758b5908f00948d5ca0e49074aca105dd13e3d2c1a53acde80cb52a27e032dc8f02d23fd7182c94071ab09ce19b03a6d9d377910d5fd538529d0d0b0ae286fa7c3b584af649f937eaccbda50a4d184b888302f35ca07fe9550388f5ca51be6053ec8bb40648a9929a97b49865ceb202aac07e52ce61a741d3405642ebb7a1020af80d4ae83f8b41e2ee6d9a5ceaae7431a1556c81e0ba17cc10223edcf03e6ede39e0b2d469775f46d839887223e489a5f535077478bb046ad596d91d0c0e0c19ec2523503163a1ef6a1317485b4820f57028aaf8a14dbe057796cae0c9282e1a5b54271c81fd750a1b8ae6551f8d6fca5fe798dcaff9afbf770dfd864a72aa0bc032083aba8a0b1b62026852cf413922fb3c4adfa0d50f181bc1bf9b57716e2bf35af3bb3b9857220d7dd5e07b857c558aaff0c5b19a9c813e5e8317311a35874702c76499db29808752b7010e5c499e9fd6653f48432fe45026fa652526046b91dc01f1df18f81590b16f713155c5493c06db5c11e8031a5fc20bc1e52b86e51b65e085ee9023622696a46b170e7010fb1bbc83104079ef7bbf014df3a345c78f91e79c81a1c9b9c84007e40d56e2a01d113bb2dd454258181ed1b123c5c83f8d27419da5a3e550d765a897de75b702b49174e86979b0454327d2292f22412cb9b04d0d4de21292f9eb22c0177dafbaaba7904cd3ba5f93d45cdcfe720d624489eb384f65fc564bdf8576e687b01e7723895edd07da12510b97033a2fd6b7ade3c87f5c487082af801b836be6487f6c6cd6c306c04d84fbd23009a4006f5911d04e87205303fcca3d45c1aa46b961550ab3decb9c2f874209e0eb53886a5beb0062cc56e71f9f0f8dd78f95dd698064ab2f20bb1ee7afe49d00b9986bc83f36385d4cb4ecf2b3425b9ca221b90d9979da34a4a01fcaee9ac6c247a402baa25ff757cee03c84c11c29b2181b8028403ba47a9ae6cdaaf962525d0a9924d0c8e0ce55a16888e11a4f5e0bca26269c8eb029136181c7a3e2f18768378048c909e3a676525f01548371f67d64f47d5ac300888db9af13a181c279ffe54ad074eeb1cc129431d1f854088404d385cc39e15c392a93f056e44f77c800a50a4564f951513cb59bfe528797f6e82d73fc9c25f1783f2377c12f3664c36982219648c0408b4034b2a135e19b26d49f420e2a0df77dba9c2d979609529b9b76853a8b0a270e938e625bdf8d5fa69312da8e535c4921cd47aa2a910278217d1d472b65107964ef73d580cf060e4d80e044ebe101bc0668a3f905fdb6e9b487baceda5552c5cab5debf2e7856b19d68a246613bf2df84a86fb84a148d706a8f57ce154b3557fb71e60ae51cb5553f6c80ddb195819edfa405866e2e868483d6230d870bc8976e18602e903f218f30386f9e9358552ee400d76d2d1a50c5455ffacc6caa5cc568854ef7d3874c7f05f94c050e1a20e4da7380475fcbbd6d8418536782e341223b7bbd0889f75b590636df3703696d789ba2566410e0c68622593e92283bb1d47b73c43d19578e1867399b00c1eb6dcc2dc33dae42c0f9d3493f3b2e1165b9150bd492304aa1b548da4ab5deae8e197f5641d9c713cbe657c418149d72035efc5a8e099925ab066eef38581c8ba68cd21058d69704284510c0fb37b8007aab6e4c772ed1a6b0f96e0204efe1d347220d1b0fddccef94e74bb00a1e6c1b391e4db615a5068f02c2b6a832310bd49c14167c8aed66630b46014a949d5815e5d540dce286e6d72fb31d9403997d37c03c2881c2042c5bbd044237eaa25c42ff1abcc7276ca56c171489ca039b2fbcb59e948b85a524a6dc6d9d0ad018b7519de144b62045a97215e4695bef8a25f4d64d7d1fa612b4bd45a5721de02e44f750c39bf45a9780541becbcd3d89453c63e0d8512d3c627dc237db4216b939f4d9dd921fcdeb2abe5be5f3baa26c2b98fc6e8be6e5d05a8ac21569127577e3e16264bec92a39566817233cca9cc3d9ad072441c24bc1777508f06d3f557e5226cbbdb4cf95d1673079ebc1e31a237daf528279246751acc416b89db81f2e264c32af12e9eaaa3a0d1002c7fac8671ddd2dc96d5fd6374274a35e0bd3e269e73057733c6e23421cf7a9e964706d22eb8710c6c93a7f17ef4beddcf01fc808703974cb61691727d56b03eb41cc37d6c0d295801ecd9ceaaf04f6f9a43a1eee9c4a43ca50897b4153113398b43df4ff14e161b71050d6409e16e2dd03ec558c3e8761b7323e252c169b40a4cc3d94bce2415af1e2ba1591aec1660ddb2057895f0b61c8c70e7f0158fccb1f189e3f942c3017d2c29212014201c3eeff1d49c240307332af7c758005be23a4e3ad41f0438408d8d125d2d66eec82416d2bd2bdb5941a4ce4038c8f298647749ebb6af9e5ea9ac9d9e6c5ab27f3441d590a0921fd0169f3f0e45263efffd985db60dd0f8c6a8ba35ee9845bb8ac6be1dcc825630bd8d03960ec13270378997adf9b14140a821f3b2176f886fdebeac9c088fed28787dbdc041008f4c5fbb72c07ab90c6204e4a07703b6df98543aa4b7e100de9130ef820b6b3651c8a40bdc990c1d7bbd8842828601cffa7420486db44d88a53e26c0bcb951f915409ad43324e36636142c78ea536fd6762fc8f70a56ea4cc436e97b922c201c27197cb1f7b22594b9864984d23192947848a5a00a57bf699083263af55e79d3e525cccfa50006ce4f491061f28f1a3d3b44f8c3d9979cae80dd58dec87958e2a3804123445014f756dd8a2117b62c604c1e3bc510bd2185b329e45af2b7ddb14bc4ed68478b3d6eafc2ca1d582e2cbb1817a8a08ebfcf60d443759ef4eaa046ea6a2f3b4e7a6eb31182c1b0ae71a4ef2f78d41c547e3ff9f35255e5f944b4864b5a4e8c6235c10149eca130c14a3cc05338e1119b40ebde4f6ef575f1972c60e1387b4b7247e985680ff2dea67e283281d797cb9041815af4568dc6bf2b7aa5dcf3d47c704ce5307258a2323f7b6a6f65037fcf79210f7dbc9d39262349b5a92d69dd18a47bf651605077622283506305f9e6d87748feb85ebf223351561a1cec7c66587012776b29a584fed2a76b6307b76dd53e3f78a42d3c9ff204edc877f0f24160591eeb47a22f4e574822662e899d368a10613ccef732e2f55e420cbe2aadb90ffc375114d9fe75a62ff96d9064bcebc0995d6148bd13be8d2930f8db76d9b3b81f97c884b800e38970a0188019c5c31b4bdd982bb79434361fd14f3d22c5d48903c7ea6ce6011145082b6203bf940d431fa9452fb73cd6aaaa6c356895807b78ecdc6d62e8bf75162f98ad770e4edb1a946c3ca893a132981a20852fba55a4125e7c4cf940c1e6881688e678f4fa45963bb6e1f80288989b9bb0cb5fddc9b97b3a4bd84dafbef6ae9f155cf020e03d166b2c442e3fb855356c506ae691b83ac0b5dfc21782504557e1db2d766a1093f91746c3b9ebde07fc967ea3c5667b201d1806916b70be6f4ae33a2989450a88dd92fb3cf63f5f50ce9f62d11084f653bd0a84ab143ef6549a1a2ec8876dd83b27e199ef5b72ec7ff6e1a539bf4db19f1009fa7a5312c47b84de57fb46ac8df00dc3819c212d1ac03dc1aa7850091e653b06b70d6fc095dbc317addca7aec5fc9b7245b622ccf358a7ad12cd9044ac062fb48f02a9304288c2bbb0abd319e91c32f1d8ea24d49fc7439c938714466ce916e297ab6a07ef3e466b6b8dea556d93302ba49182f419bf2f5a4bafd2e718c3f4d9f674585f0f7e1bc4683afabafe1e66f65aed512aa05a1ef51b9eb8108367795d656419a0c72b46a05712ad8fa75014b8dca255db9d9195ff7bc3143715f098fe06117c2b041de851fa9b1e89db6b491ff7320eecb047ef5d080fb69a1818fbefdda3312c953420c2c596a5b32bf9b6d2d8578517f0f1c5e261662e2d440237afe69df25a34425e1bb1195d2106328bf7dea0abff504f8e4a769c0bdd5710e71493d3b2066541b962c906a5898e35730a7c263bae1b44c8a84e986776ceae307e9935ae2f22f42c7422cfdb08fe1272f21835babbd51bf38aebe9dd9a0874bc68d64d09464fcab2f647200716bf0c6107fc824340eeff11cbff6a774d6428eaeaa10d6f5090f64bac967fa95cef17b6e55272622bdab2f1d3eeee88cf7ccdd1e69970dc9f9299d35671472c67ac353adae1c4d86e661351e8064a58d8ac99a9fb5493e8211fcc3790383ae95a42c56c3f283d48c260210d23bf24eb8f235eb0526221e3e807e1e56b4aff46799d20cc556f3d38c7cfdff4b126f3d49b2474adf6579bdd4858f81e99d8ae41fc564c51accdbb6a7f916c1ccd4eed51d23bd67d1823c074935b8870f272e80256ec0e6c8a07373a9cfe07d109f1f8d0e28b175c882fca0794b70fd0719f8f847f4d7955316f4ef3d56cd8402d7a683d4087aa4214e4d662fdb2222425a7bf7a3c5760d7a8a936562fe6b78034a56b56b1fbc10ce91586cea50aaf5ea4968b191cde0e74d4a57415633a6728e44a42cf3dbea2d045539616e87a6816b443cf4a84cb53edc1a220e3e680c96feddce2c08af65ce0f15d8015a0861d7d7f69728a5da4c9150cd0f0931d8c9302264ba9b848e06c8d1b0253a4982e4fb99c8d975745edbb248633e0f4a235af6fe0c9e022f9f0e18020aed6943fd66f6cc03cd282873b35eadce664dfa4fd5c44cfa4602171ff4f41f99e05f7aed6845d1eb3adef3924d5c55018ec4213aaa925689282b47c09f8dd636726081cde60870f936dad5d1d141bdedbae1b627f1eb0f25d6d10a2385ebee39b5459bd1c058954e8718fdda10a103bd62291b9a76db79918edf1c85a668bf4dc9c7161494aabc1d36fd779ad68ab0385e2ef5227de2bf9365a6685d9c6551d1809a746d8a1b939b297690e9a6853a4b7d686076ac66d49402ee3a5b1698d3e416addbfc75f64d372d968b59103195efc253c8f73c84596eb80b4c2b4b2f72edaa753bc2a243cd01a8c3eb45d18b5e47141eaea90dc26b1d4224abbcd6e551feec7301578ff836652e5a6ccc1714827a549db2626e754dbe23cb9da4223b589f5c87eb441f2b496626f1a7cb4d10b86228cd6c423ca2ef891b41de80075ca1fb531cb005feb31f9aac13d17b3105bbc88fb2ccaec50cc521b35ff8784a50c9eed75189f548497367dd0be175867ffaaa701a3f4306797822556b5be6fb0ca9ba9d7bdb6412cce42df31d563cec022eef671f0318ff35c60c1a597ed3693b649b7ba7b536e52562083581ff7f92de8a4552ba14caf166468aa89dc071b8f31054d2f1f353bf2fcaa44f3dadf325a327a77d3a5c09d5c90da0a49aa063873d2719fdd93ef142217aaa60ff17147217a6fd4ccb39ede9eb6e05c19895fb7dcffba55103988f057e8f84d80abd3063de4070031e9b97e313c1e2b810fcc6cef18f0a461d8e17d34f569c834db1568e82f7e693299edf6cb967ab97801eb7f8327a60b9beb83ad85e2c1da9e81365dc9fb5a864cbe60bad119ad8d28b7343337ad06efdc5bbe0cae8d0b36b7a753506dd692021b10fa57eea6712d5c153e29c2a5b99f3128fd6ce2cdbc385dbb2ee95ef2adaf1ca745a94410e060550a584be6991f9e7df62b47e360c4209f683723be3f4975c571a7517bd281ac86aa9cc6fcadbaaa219d06e04827c48b242555e8d15984eea875bb1a1f7840f70d271a9d421fa207d7a5e3544168fa292f88270699f7851e4b610c63e11ed9cdf53f7827dd707539e6088071ce49b5236ad798d5a22c308316b45c529743fb81fb51431c32557efed4725b3ec84752e61eaf3791ca4f1bdcfcfdd239304e4236d384bc094a28c4b44e116e5b4d8cf4dea11a509afdaf7358f795e6cb0c6eba5a682acea6faf7e417ef71248884763d32ef8aa3ea172068223e1155f4973e55daf0b34e954761cd811ee4561db03887620fe2f954a52b1141b6381c68d1796582f4634e6df7d0c70d14459e0038e6cc7619bed1d28741e2a4c1b285c1619badc5b54c70adfef640bab88eb2713de158cd337533514aa29cdf8850fcce431ac876092366ef946f8154ede16301dc4f9d46d674d8c9c24f746c191b98c759e787ef4db75ce19fc204bf266bf07f3dbbb423a7e3478f124856154e9d103baeb283693a967d603937f1e6a20c08bd813c39f9db040180b793ba395b7b402685090a7d065646f02c1268ac1dced2cf0dd5e402215e81a812612b75ff92b1cc92efa54f06f36296680343474233cc2f34c65fa1c2b116f435842ee27fba9c0108d44bc2beed0fa612907a3e8d5b3f4ad6a4b88e30ce8499c556329fdbde1d6a810165580f279d3f8656d94de2287c6cb5f799e2314f1732b5c859b4dd55a18b826ed26afc720883aef6b6b0bd7e0373996ef1d32042eb60428b5403abfe6536db9a963036d3a751239619b28401d31632c0fe910eb7b655e81a924ce21819927dd090206a010c8a128daef047d8230742b801aaa78209ba22df3c5830806ab7af74508b68db2e910c78b0316d3de01cc6b492bf8306a3f5a4f819bd143062a48cf565efc030183941621ba0a39a9cb08c71def1e3f67b02a344eab71370403171c995609db04ebf43cd35cd89716cc2f4b9ca5c1c127a6f0a9a9b8958b29b8d0337d1bbe03d2a3a4d9769c98e28e8b87422e5ecc15e32f5b428f9dd66c20136c86641234f4c08a67aaa68fcd26303f563dafdaf057c6256fb1a62a1aabc086788a918b9890a9ab521a22ccd970912d8afce04ff7ee335b17b2c2b345ad6c1cde5c37cda12e1ef3ea1649456c360147ad505d7027e62b97987492f53c8706824d4b51154bc377812786fdbc11b7a95fa5187c3801c832cdebdbec1f65e2173f1f2bbd8571ab9d5e107030249854f8a53e4e701bb9391c392147c94dc2e4040db55849b78b073f2f053d2b89b87203dd8686f20e932d97fe972fa6db44b96683320bf69f7453d0272a0163ca34bf1705de68105738296ad26bef5e4621623d7870790e7328cefdadd33e1c36135d59951f55a512bb40e62eadb1cda47859382ac82cd40a058977375e68ed5f00096b40fe69f6f297e97befcbe680e872d1952e3638fa965626652b1b656f575eeb36a3ff5f7dba2a334663f3c5de317a34b2ee49cff8aa6c3d1836cd173e3c616d72e2b0b29b871d94b8b673aeede5589b83e0da78a0b00fab96e29651f4f7a133a6f1650553f3d8a1b9ad81f40fce46d6d33a562cd3dd4ef297ff95b5ad69ed2e9c40029f1e15382d1646be57b18f4c0021e1688d9e30d5b8cd4bff987e70d51879346e3235b2be281f8f2bc3a6344e9e687587975533de2511f82681626336a25e42ca4210d0a060e59d232f6b4e8da0a497754ce51e596382c8a524f6ead3c905e3e0d6dd10108200b601e04404a015e3749e74b64ccbe806bbcdc14b5d2b859604e269eea4d07feac83d5a29ea784c115f0e2ee2b61eb47a068b63cc8de95cbc1edb0eb9f22d76bdcfeadb0643d6e1a0d24ef7438fa4d1b1ce506301f2348d982b955e86374408ea67020b5286bc241cea45027fe71a435f64a49047305a06e8844c7113f8e26cb0e386ea447a960143ef5e5edb49ca7f934ea28ce0c0443725b637b916ebed5e9c46c2f0761b041dcf7adbc9ce0421835bfa812e9192af0b36e717fe43ae69baa30c1f34f1193ee7bc276bbe7d585bedb2e9f37dd939abcf4eee9643ed13e4a765edbc60dff4de16e76462ab34e63a00da88912f3544514c797bdc780b1d2f9161d8ba3ff54e51c253e628a8235a5c8d7c5742af397b4bbec27193d00c3436cf632e13235defcc5319d0a8a47e83cba9bc7dd2cad8e15a3d309416e3b41a22c06f51875a434d01046bc60b9ee149cd2841e2de649319eaad1822e56c7d03c59e1cc1cf9ec6c373f042d998da127d6eea35afedd691cb8b9093dceb2d7a10b2e59cbe75ac50527105eded799410c1d379de7a02ce54d3331824af318329f5ac86b5b4d999181af3de91c5104c9f32424c1c234c7c1e145233c6c1660a524110d19520e5b68d8de208832f91a9e461aa515b7bec1d8a2e63d66fc2b904099326c21430bbd53f314f240e0b111d8d92a5b4c6a2842f18a27a181c283ee6a1b34b117601a35ca6a850960097c9cc3c9ec4685fa072ac84b6a41130fb16ca864bb8f17b418680a783bae23ea6d9ec20ea4a1de122327e757c50134003fab22c4f78e04c5a954abfd6d1dd6f0a107832077cd6a0dae4104b514950d2d73849ab34542557f7493f25a5467ef996728b13d1297630ab53080d12d6c98dd9e4bdaa98f7964caf59015d2b67c51374195e5926c81c603ca2c427b85b61aa1e0976930b12efc07189585f19c85f6ee8700529970f4eb81814e47f742a37675dfe103e1262f08377441460e011ea99de67ffaf62d516d2f4a10c3686bdff6fc39e6410a487fce465c21a5c3c1f7b2419412527b8f49648cfc6684be484d216c0496a29f8c0b934b78e520cff2df982257455506e18f55ac8ec563abd7db6877859023f0d060255a09aae57f4f2418b77c5f5e20f4066c559efb285c8f3e090e2ef8975a9b004463ec3bf05fed955a1bc97df620bc99c185d89d6025a9f494d1f994847d1b2696e0fb289606f525c5163414876a10caec5da4e996b1d3f9522a20728be8e4f33f164bdb0df51df6abde5729952494275e20ea592f44b347f74859aef3ad166fef7d5739ce4410cc399cb754200e42914a45756a062590b552e00b362b9a181381f62d03c58e968dabb909feb9ce2316872a5dcbdd481006b174b83dccc329e70304995ea2412c06054b2170507fa74498986436a1f0672d60b3e3104135aef28c21b70954e634f7a3de0f964b95b17942851c37078660c835b95891baccef909fdac9aef1496fd3b99961a81e51907f8e520efa63f34311db7ec3374583d047333e75bcfd93773e55ad057c12024d2e5dbd2adadcf67c2750d706dbcd21741871988126cb95681881c3d0994e0fe988a1d22e088f1f0933d2839c51947ab325e382035c4da067ea6b0f5675aaea432702dbcf0041659240c15d26c869d90ed46ca367ad4814c7a4aa64d422cc69d637b15e0cab7820670f45f5482dbeb18f29b0860d3c6a9c2b46e4fa494b8cb003fee08ee72e5536ce74b5e708252e25ff60bcb45673f5c66270ab6111d6929c643acad193633b7303673d89ae4cd0947345a388cf8fc22511eac1b7b83945442d32af99d014965866288601ccacc314c6779fc0d74b7ad8e2b2c7e9fbfb63f8d6b461ad34243f3f56e3971637f396ad26a54e352c561582778edf1f2e64cba05db917028e2460a3fb0866fa41419018929834e9896d9ac74db4ffc06fe124d2ba5da3dbc731a1dda98ac3bb994301a4d18cf301a30a3e055797ffd9763ba62250f8756fdd4db706480859676224f64af102e6b750a76c3857b8e26d4a7d479fc68ea4065582ae2a4468a83d113c307f088d0ac9c911e47c6e443d964050249e78c4e948eb57603adca8539f4753057e5e992a9a9e4f78644b9a10504ba9b9fc0defc9186c0a7f9dbbe36287a58daf5ed4945f61bc571988a27a812ac8c744487373c8ecad4306f252560b2c8c3ae60af8e961c61fdd781fdd179aaa25ca3afb073c3a6e5dd710d6ca4b8e3af57a4c10a335cbae5c585052c204b062cf9e40d655cc336346c6c980a841d34dbd0b3bc7b5cd17072411d51f2f9dd23ee2e87c89e1d9d52d2f241b26225200e2e1d7c9567b05194f20ec59dcebd6665b3341b95e0906b92be7801739bffb4b18698c41b70424572875f6a4c04fac708d8b9434b2b3cd41e17abe6e27827d95a0017793d86a045b2682cf083d0284ec21fa7b75504b8981beca7828e25955defd5b2d5544e154bba0f04741b5272076e089119c3b3036438e11ffc76843957e9922874009c601cc004fa6547a857309c55a50399049b561299d3273a6ab2bed46166a795b5ae137a5ca74e3bea4ae6c86fc4e2da24e210c9bd40fcd38265835cebe292847225e90f27621471e4d0d07581c4de1e9207dc8f081149c8de7b6fb9b79432a5142e0a660a7a0aaa1b54aea93c454b7195163dc53b1cbe49be1f1a9c274ff15260520ec3350f07bfc10380ca630e29ee1273f0304ff1325779fb3ff44a3638536cf0935783b3f7c24f3c9447beb894b75f4a49a992b2a42a95a42ca53a4f71d9a57827bd5492527a279d763042702e7da300c001862a25c563bcc1db8c524ebe20b04f7197bec10b4d70126ff0941bb63b714e49713e39f1d9c1a4a4f0967129923b214e1e7debbcf3d9b138cebb0ec6e45a471b9c29bea5e0e8142fa43f3b56659dfce4ccbc5d4af12dc5e3e7d9692ec54b7d36783d1a9c5e83b7a3c1e92fbc1ebc1c0d4e47891e77e2550f9572153006cb8c1b0dcecf658766d305553a0eecad6d53a24a3f914da47497d688a8d1a56f8e742cc3300cbbbe336fc3416da79809b655e12ac368304b3598651975cd436eb341d53214d46089bcb0a63dfb929362946350fab287ad0635c68844249973c6d8524a19e79c73ce39e79c73cee973ce39a7c7e91a11553abbd484aaacbebe1b0cd7caff6194466c964a250cc7d6eaa7ae58ad26d3c6cfe4b24193774ebd13222bc84064051746bf65d9f2163b18e6d88803b6936d63aebbaead396f8f5f669737f598d497fcea8fba6c905e9f0af38e8e793ce962d1cc3311b0408a1d0ff4517c8bde8ff6e85be61233efc73e8a6f1704f628df8ff67d988eb129e745cf38cf9b07ce6b0723c489639a7927df2e76dee5271e7597383b1ca68e993dc68e19b719c56c9366f78e9e79b183e10978c30871691eb906a5a73cd40914355479a902c660e955bf74f6188c71b1a046a9723ab1a2f612a00fdb7af41d1d3e7ea59511dda5b5214a1f5933dbd673fac5022335dbafd9fca2c6f493a7d45650a54f224ca0e8548fec6d37a774e659ee2f4863520211d2ab7d20df06642299b9420e796828b6b04d375da41a59c910182ed21010da5f48b1ef5b2a563ce0fe4f0c1a372e8f9e63e7511f6bff9b714977979d40628c2e0dca6f2fa629a04193c5e2a5a92546af485f8e917e2c0dca18d8f418b145c6ae48570065c01681bf182b43ba36448d1e6357a4535ac3182f3be9d11b68a30da341eaed85f14bf952df0c09fbd2436e4322fbb246c9a9b1a3bb3604d5d64a8207bb5a05b183fe88ca3288e152955b96ec53ee11b0ddddc53ec6693032693036918fd228c9122571a875641de8a3918feb3c0dc6ddaf6be44edf50ba2ae921df381667d7243d8a86e79262d388a4a0a4ad518cee6669509b9114a4414d8b422cd42dab05120f1d61235ec231132662247ca4699cf49a47ae6ebb351771a24ffc9630496ec9711ea35bf608d00c17efa157f235ef61e435a31ed28a6ea2d0ba6969dcc22f5c0bf52aec2170ab571dc56b9cf36f937b1ad43297f94cd52ef39d44e42a8a8b34a805754e95df12268fce9a6f94cb3ccc4b9ec9370ff3ec026a507393c73fbda2f9ec705cfdb14f831993aa690e040b691ed2d9c1ac92d73c86c6e443f9a1fc30c66bde1f0b35a8b9a6b9e69a7bafa86b0eb28d7d0dc66b2aaf71be79cd458efb68839cd642251c98304ae93479a99b255387cd49e79cd3a7738b88ce89618ecdd6b0cc57c3228795bc8d5ac9b536994cceda377daa8a79c5dcf4619eb9cc53afe4759d57ea265aea64bed39c7aa17ccd5da2a769d9d5c1508c318a152d6193fec384470f392805a2c1f6c050eb081749a01f235236101e08022409d78435a22ca554498f7e317fa14ac62f4639e7c430896133723d3a181e0db67758b651ceb339a94f8f3fe6a65e6b8dd3b49854cfcfc79c46926e3373d517ca681eab668c1c136a90cba9c7708fb98fd892a357da296d8a754d4c83ed1ef081862a3dc764892da66fd9480ea1869c1157512918ae02c660aeeb1736e93f3734cf5afcb66000c47151a38a943c69cc68b07b1aec99210d760dd344203c10044883dd3d1aec6ec93f9c13eaaa744cde62649fb2238e6884e887a5d2718936d879e9e40af90111937a8cb26c900f5d5ac6af8ba852673234df98775fbf4ac794a979cc392d6af4cba5c770afd257cc3cac83d97ce34ec52af98fe9eca5e9ecf373cd657e9b3c26bd304828e9474ee6b98f897c269730399b7c7630b4c5f4cde89566e1a6a8fcb11c1523875ddca37e23d04383eb2a1df3a34797303b56c6fa69899d2398e8443990b8500a54891c4c8c9f9096d355d1d96154f1d3315f4883ccde5620cabcfaaa545a3bfaa94ab255a7cbacfae5d4e451bfc1e4d5b7ab83a935f8f96dd1c0c8b3fcb66840f45be44c9ecae44cd4e065aa9ecaf4e1e0a1ffb8a5d9d490eb225ced9613bf1cdc1afb979f78b25722fd4c9e3c79ec709c4299d75c75f2cca9a77daa93900633af9f6c302b817f51af205f9552a72cd4e075a5a650b9f517b78698a8573e30fef2d98c5e4e3729b00d7e0a4337239e5ea5fc5a99fcf28d3375adb57eaa93ffa84efd54c1936b2ef3a6921706f9929faad7b9cc97bc18eebbaf51746a4631e65a2332e395b5b49073a9699a636ef218ee4b294ca569ae759ee69d739c6fd79c53729c6fdbd679ec60ba4fc56ddb17725f967559e61cc799e037ead946b5cc359f5ee6dadce6f42dfbe6a4737a966dd433dfbce99a472976451e23a68dd2a13aa74b0f6583a16aaae6fc8434b8acad63527f713d576895c2241197afeaf2702f9f3f1dbb36e9e5af77d794ed421a8c556c97cfd60b92fc36f96d1901f492cb5a55727e796108f8392d6ae7999f3c86fb8a9d54dda7637ee7ddc735b8283a152b957c931d4c87615de7b2c1ce65af4ade87aa92731e937aceb983e13e55e9d3319f73ee9b79ccb12f8cc13af66d907bce31a75e28b36da60dc334ce316f73cedb92b00ed8866d52601db0ed0b85fc866998b7196d9dc67998739ea62df6bd4cc79750123544bd44c5e8f266db92a821aa5dee8653db4d6b451a8c7e3b1e4c4feb0d74788eb57de9c658639fbb38014e50adb1a5777aa5bd7b24cf772aee6e8c73c63867fd6e1c1c9f22bd6a1cd938aae87b8483b97469104b71b4711aa779e29c737231c618656c2cae9742a2ce187737fa15576e6c1e9cb071e227793a2df8ecf039f2db92c1112dbaa02d7d064c7e5b3338da24fcb68ef0c1334fafae1e9f5e611e8fb4d0ee762823777783349224be8f73d3b94b7398bbb63ec3a7c1187d9d797aa5e4d154fa54dd17d46050a452caa640a8a89faa8355d2dbc8e5a9a47b2af90515f92914f483ea0c149d8b449f36a821f328a97cd345ab24ac1c2497b746c839f2dbb15839475a38ad97de2b99cf2962e50ced47809533c4ca1962e51c91d7c5ca61e5246970ffc86f9263e52029da67e510f58a9f9533b4cfca69310f2b8768082b67a8c17d4fb60fb750d7284d3411a3891cecc80110905175a26e2b07451f82cfb2bc587cddecc4dac1913b7c28996a96173e84f12d3d7e3b742cf9713a490deed14f2d7c08c30cdd927afdb6946002827ca564f4f0009f001a6c237e0b58b651450bd897d72fe0ca90728a1aae90cbd00f66fca007317a30869aa04fe2a7a6755d28efa40ce703bebc1412f5f2b0a6ae1919e983da9e2a6a1581f4a36eab08a38f64d8d6776b589850796f901c21e2a1dd2535e47e5d26720f1141c06f4b078bbf80ae22df8ef120a14424208eb2230ef589b70311fdd9e347f1fa65476ce1970f6c0b0fb12b01d30bb99f413adf8eb9db7c6e72baf6c56890656e2cfce19cd4a7af8c99b9ccfcf22df3586280139ccee2600cefe7d7c150ba464398be3e57bba9a1ca4b15b057d1b7cbe3e852720ed6d8cdee9298879253a5e3907e495f951997d8baced767e7fcda864960f2478f23e5380ef3ae2b46ace4dbc558a27e5177891c9dcdea8d72d8ec62d77db4c1ccb30e02cc95dac8973a13cfcde7b6f9522fac4ffd0af258e6559779cc8be1be7e1d04d6a114f425a7a58f4ba59cfb68945389aa69517a187da31273a981c77c634efaf4b29511bd632d8a276e7a46c9849b8fbead25207dfc82f48b20f54152a1a954b90e8b2e637419a59c6d437eb53b8c1d65c034a44b8352f2e0d1ca9c5b94e8a6837a75cd1a9b540d17d9187d350f223dd02b9990fae8d5043243d32bfe22273561224bbd8d43ae871b2f23d6f446af660c4abdbd28534253818f1f7806488c66446ddf9a9b3179492b602e2b891c2b8927e094d48ecb42bdd1e0e59717e1a0066711252a3b5083d38bf48abfe958118fa50eaacc2f50afd8d4c160a51bbdbac0be6a0b035dae0428b6f0925e993e5958403e3a3a5a2bd470897e86e04fcca6d9873d860b42b56c97306bdd19a531dd49fafb81fefc61f6c063c77430b65090afd005ca0545033d5a19d38f9ea72ae918638cf1f2f857b8805ff7f69bb1abe8ab72e261ea1d4b9d7c1b574e5f18809387e09fbeb6b97cdd5b1bd7c747ac83f4072c281d0d6d135b58bb72c4365ca6e0e3042c706abcac0ce92163e1a56f33c639679c2cd4a449172760d67669df3a0e3679d634918fb28f0b3905273fb9aeefe4fb98cccb69c7e93bf9e5f517d2488299c7f6e544fde4351be96032298300e18aa89d4b34d41b5e9986ca79d79e4efd6b9b95217dced4cca3734ef928a4d24d5ed81ee7258f9144256ad8369cb70d1b799c24891a23433e2234c4d28174e5225ef2119cc44b56e2a57c09fd699670f32eb1a5d2cc6d24f685b4d62a650cc972852aafd220830db250d72ed4da79a3238b24644985315a587a6566276e0f25e7c8c72d4612916461b485927d2248624bd3c495e914090d126ed2334d135bfa8a5d999e05dda2c68fa67d8aa82127f1ccd5498f85a29c4ea5c462b7508cfcd32b36bd9158c453a90662ce395b073f7d26cb8c9739a100c34bc953bde7e7376d0de9481b167a6870ce200dce3959f0935ff033885d99409a085113699aae216a9f1717a5bca6b0d933b43ba8c787a7c7e70728a88811c641d2c307103f2059d2632807389403c492b02bd3b5f8e9d9b7e0857d4cb432a6f713b50d65ed8888a3b91c41b606e7375cbaa5342306457134c9f2f0284def264b868171333b3418a7731e0e3cd139a15414e270858476196949ec99066313ae0a95c3426d7623bd0a79e65b3bc051f1d738bdd33c41ec31a66217f988f95edca457d817bd89f4aa6b7a15723d13318cbbae4dd3b849afae6b096bc914357a2897342f49e27c3433135bf685d6f8832f394ae212846df4cc8d1c7ec516386a0cb6550923cf1f19d529a608faadb9ea6db3bb8cc350eed21bfb548f7f8a9cd8511e33e1a49e5912ab5f5e1b4479dfb4d7360dd6d85d0abb8649adf1d3b75d9e22aab5d26f8d70f4cf4be7ae91de35fcd21ba7573cddd3a1dc032d9d6bb888ad6172e9ec02b65172baa432399d3c6422d27be815ca89d3961a1cf3ee05e79be6b27ab8adeae18d7046e8bfa13c18949cee4510eae45593d74cac0cf692d74db00e357849356ca3675a6a70e91c0a46f7d02dfb229d071391357c5caf4807f2c1f1e9169919fe893c276dc2c1b6cc53b735849f97eebf99625c67168f7189cba707b2fce5f581bdd251a5c1a804096c8dfdc2478f914683edcd28aa334c348f7834b8636366668edf421a9cbdbe44e7dd7c019997aefb84f48a900627c7ed5218848910e11bbee1a850433efa197dca253f477a4593043503cd48f433458d7eca8e9b6ace374ca457323fbd677b3ba74fe71926d22b9a1a9be9bc04231f72cfcfe93113fba68f5e4de7c23dfa492987619ba6edc030cc658a1afa7499f3626257a6434185f0d3691152d7c73f2b633a4d6d67a4ad084d05bc725175ce39e7942ea55cd91509eed8e1c30717851a72d04b0ee222eb3e427a3544a6680fffbceca8679e6c90eb38d7dcc78e5ec9bc74eeea6187f41e3fc40431daa37091b24f72cfb97415ce23c7db17d2fd38e39a511575fa6d92903993922ede242c94d570134a7e5b3d287a24fcb69a487a542a9a2656635b3d20c2b75f23a823487dbb63de7abc327a6548f9d5e70f2973196a1344d0ed821392148b1861fcf010e1c70a4cf8e06374da53708a8508c9711b852264f1d17720e225469a9718a3a43c38c3370fa0f0dd29e60d557920f42aea826dd301cf2fe0b7a503a0df9a5b02054cb05f584d8c7157361c213f77acf6e98c7a6ee77d818cf4f6f80d69970152bda8f6535140fa741fdae35782fe545b827dd9ca040d07db898d71965064841c225a3aa021020b2000d8068f1d3dd01d30f96dede06801bfad1df8bcf3002885f3ec95073ecf8ee26dc38a905e775cc70ed6149f616be6c8ac751669372671c4eb9a98a4316b8d25af8c756a03d043aae25262188661d2a3c27a1823153fa28c524ae9004a6b4da5dc41161abc420e9834d8a49c8f5d9d0e99297e5c33eb7858218dc602580eb0e2fdba0e9921fca4e2a56b3f226f7c99c9928b6db746c76dbbda6ed614bba6dc15d7e07a7bedd8ddbbbcbbd90d3615d4eeee560da10ab23244b035fa5d045b839f5dce68501e9952d270cd25835a8fe4c86f93639f34b1856f6ea4cb6e8992cf8f6b58f15b82c65f4ace363998a641e99c12e9d27bfc20dd03472f1d0821ed482f8566b63584a20f57f3c21562ed4afbb81dd225f7f488e6f2ebeeeb688391fb424a1bdcbe6df05d6254b1b0f6e3c73245ede194c66f9fc54bdb0e4a57e9d5b68660e4650e1ebbc29ee479e51211ac0c76adb3262d2592b494206a2941454b091eb494b869f580a1d59385560f155a3d58b47aa868f508a1d5f3d3ead969f5d8b47a88e0800957cea68637b89758dc7049f1ec9e51a684b02d06eab6a830f2a6df96d0cd111b8183236c04d30fc91378fe0936bfad27cc7cc8463c3b8ddf9613923c7730d915757fb234c869a8988715d5ab18bdcdb39f0663a67d4160bf6d31a2787376546afb58ab92b9f6f18e671ee334c8930dd5fdcb5d220d51936de4d1b62a36b8c141ebb765839e76c16fcb0641bf6d07b3f5541b10f96df130f970bb78f62dc26f8be7e76307b3e9d476ce0b95390583e3c6699a0a8cddd466ea5c7e5bf5add56badb2ee9eaae42a2a05c37350994f8c1d11656429a5b462db7a6eb0d1a0ae76a48f141d99416d0f9be89be85b77e939e3e42ab6d55a1a11aadc362aa7f3a3bc2c9562e72825944f7a1763cc38971d8cc9e3e9c4517ce2b2c11397b82828aca15e78fb282ffc843a49f1d387e22fbc903fe57be1db0b47f1a2bf4071142aa2a0f80b941a1cc5067f5183a3d480b2b193f34b812a3f815109695073d9a0a652a59c7efca94f0a71f2c82989832f0e0e008f8e43c40107df9a8b38a4380c18299f8ef9299ef209691086cb0661b833c745d734af895a87c3bd1cbc0ec6fb54bec5941c3eea82aaf90d34075779fcddb1549ee2db608ac7a4de9d7630fea9549f8ef92a577d421ca5cbb19fc3a752a99cfa0d9e39fb8987aa9e0da994f49494263da514aa14ca77e9a3545f8adff08534e5357c613d19c595e927a71dcc8969d88666fac4b42aea495145edd81c86872c2a0fc11b3cf41a3c4cbdf09387341ab1c0f8421610f41bbed06bf8c254dd68e86f34bd327d4bf98c529f910d9f114a8e929f9e06a7cb1d9c06e7747ad234120808683f49839f048a2dd208e8a7bbf4278f3488a4c124d288e34e9f343a91464d33450da5c9a7cb23b3db06a9c4992e7d4e767a7af573e2b4c1938f7b1a7c214f7efa98a741c691447ac533ec2cdcf4cae848c99288344f7c9e7cbef0899a42423b7dc3bc8e6665683415f5857b24d2a07c7ab4893bbdda12eac45f78aa13dfbf505938f12eefe4c99835fa13c73047a13cbe70973e9d502837c19f9c3b18148ab71fb31f14c74eeed228278e79d14fbccc8775c0fc4479b21db00e989f9cf64f1cc34e5f10d89f9c9cbcd6939347ab67f242da7921735ee87dd8342113f1d3352fe45cfe0e13c561734665878a1aa1267bb2c1300c9b3c8d580947c146cc1f0731ca82d2d948b28d9a4480979e032b3989e28af1baaec8354db6265d9c8099194950113eba2ee6c9d30b4910795e38353dece0c2b16c1d1fcd39e7352f366261de82828284e047f2d23b8f7dda88970ec43f3af5068d19174f0fce0f352e1b85bd4226970b96a02269a46574c635bf182c36390c61848609135a519302f3fd7516621bd8c746ac43155b237e5c8595212f9c1aa5a8982fdb3899f9f51a795686c4be708d84281bc515e9b46232fb7a26ae4837e2255552db41896194524a2986c59b88d320196a186ddec6a8572adaa0e4e64f8d3cd2a34f941e6da4471c396da618b65581b9ae39e7bcae197da8c8904f8e219e6fdfa189be61b88ec54f6b284b6ca15e01ead947b1a3874b0ee99c11955e8ee1b8fcf218f331a8972c2c0db6133bda7bb4bbe4e8de75892d3f8e46a1f6dea0b11ecee03816d4c99dc432333f617ddb17158f6bfaf5a978707406ea2187b45fee1357d6b9a3dcbabbde423db42dd442be0eb69151cfb3d3dd2652043d73af63b60dd377649b22d601065b833f5ec2cae8f5388fb035e2f784e7b0c69909b432a61353c888ef09846fe7d25f67a8619cb1914949346906473fcdca68cc5d7adac4161c9f47983adbc250d839c436e2c748586361294001021000950a05a528ae1c51a5873209e843a752a874268a1a67da637b9c89345712355ca4a46f9bb88279875c64d34eebb4892fd8c74871a50c359c58cc14cdc068b03b08f4176533cfee810699bb639c9f071a642098c033a3e2b1a97870dca7e2d139e7dc37c4e4ddd6dca7e2c179f5fa0d297d2a1ea5a621025075999793cbbc7044355ca4a7594df54c1a106a34aaf122438de1a99af354d14b2ef312793adf3c7a3c382f7d43543b4a5efa86f04bc9655e388f59c49fc883e5d418d4708576f4d0a9e11675ed9cb72f9bb72f32d6f0d2b78a267a7e3b560d1f7d7e7a1ae4fd228f0eaaf30c102165a83e620b90189410219d79779093216a036990336fedf33ec61863500f444804d25a2bfa01931f2c31b157548353b2f442da1cc6a0febaf663224cf383223f00f26ba7c8af155548f2dbc1b07cd722411f469a223f7c8305d56d4591f4dd84c8b347d1c32f8ca2acd9c148c91dab7fceee58fc57879253a773e0f44db22e3f39a2ca2f0cdb332602b3dda457fd314d24d2abbdbaa85812b55d73a2f677030d75d3a2a81b735a1455ce48792d6166797ac54b68821809084f9889e2e743c601c2d087dcc33e2caf8e40107af658d32b9b9d67e6b9bcb164b344e72e7d5d9707024efa1fed3408433bc00982508d871a1435ec26dd424f7aaa1041ea472256067b64c1eac09cf4170ed3479a95c13c43f325e76de718e9060ac497527b61f5422e8a5c7bd2b78b21f64920bdb226a04992e2e623cdb3b7a4a879e648d3abebea01051dd31bf216359489d1e06a4fd4e53989411bf5d47eccafbe3cf38c314fc503ab7185d77452e1d82ab62052f940311fb412bc6c90ee76f67ec44fc583f663045dc51644d2d33e7a5bc5163d8f79fb7201d1543e709a73be2fd453f970753d36c73e150f2c73ecfaba480f8dfb3ae55408db9716eaa246d246b3e516ccdc44d59aa8be1bb3c3f0c631c6985d5767f1c3c97c6072de902c80a2a58abe2d28b0f0db82e2c86ffc70f06f7ff218cbc6467e2a769917cc7b7e72ba0f2071a55d7a99fb10267848bf7c08134398e0417d7af3c03cfb86f0b81cfb865cdf90f90da19887d4f705fb542c3f55743a3f55fc5419988e398fe8d2e3c7634e9779d997eb53f197a3c1de1157da27141548bb90761f406c774b2db6cb88d08e1e2e396ebc2851b2f95082c59c7e5486b9d9b11a8cd807407eb5d800e4278fd0ceb429fa906b01ad921650910fb9a625be5c7307f61cdc67e19795844f6ca934559d999999991988b8c235e549cad5065793811284bec66f4b0944b2ef92dc1315a3b41d64512e0735f4181a2cbdc27cf68ba71e43d4d32fbc5c4694fce8ad50b73b28f4022e621721d4f0d8e0b8505a6b2ae50e822c2c346883abe3c7fce69c7372cd9c2efdf2349fdee66057e2617ee1fc42d497a6b767de8ff9a97470217fc6f9e5cdc5dcf8eccb9c6257b76d9c6f9b675977d6dbd659d673ebee2cebceba3d4ef68260edc7bea307bb4b0e202ea98a2724fd1239682581c92f15bfad24003d8b37c83e0cb41fffb0cf12264a371c0b021aff63bf90c6af734f54ccb7ab6369bef9d5f1123038075b63fb60f0116dc4836c8d92b3fb0873586c8dbcf4a156c68b1c31a302f85de76a0e1ffa72117d7a610c8d6f8f53546717c2ee030829e915b655e19ea891baa0fa4b6f30252314c0471cc2171f1db535f8db8bbb3ed68158df117b44193d18f9f5e0d1e02eef687059d669ac3bb84846babbbbbbbbbbbbbbbbdb07e951fa5002e9f3eb6df6eeeeeeeeeeeeeeeeaea9a52b4312c99b063d0ce3bf2e9b3454672346acf801122ba068624514496ba36eabe8e6311e755b57ec6c17c7dce6afda512ab9ca8758f293e7c3db41642596ae9001136870a2a77d48d30f4ca1cca086b4f4a9fa73892b130a1a0350020ca4b003147cc10924c8d0e4b49290410b353d46e8e011701886fc0310dfde410c89f11c3681f858d4bab5eef2ee6ecd2f4a3d149dda1ec6704f3bca6f2f86c3a863ce1d0f5d00c19a87390df2ed6dcedef6a97868191eae4f75b9cc5f5fc71fc3a15ea33cf4c7a9789057fcc187c73436378cb3a3c1a862bf7c5ff354ec98cbf7e983eacf6383d39171847c440722fa8e1e425bd726db65a4fa12a60122242664a1416be4b143d8f7a3df90f5f9c9bc48ff182b4dd568446b6a59e24aaca96823a5d878e789a533c381de75704694a2b647d9f2c3fe543c7ce11585ca84221fa4d953ec4b8bc4199b57aab09fc0a0862c2c33b82347a3fbaba9a56d057bab30d3605b95dd5d8ff1dc605c428de1d2ec4bafd87ebd7ddb57a54760d3be2fd1555ce38a4c0c9af0284133049d9c1d0ba840892eacf0851e296e60445fededebb85a06c711f45cc0eac01e24f536560673ede988d7b7803869ac0c769e1fbfbff1cc9eea286c2ba8e85930a8edacddc81877d0e02897c1c8cc0cb2740b902b6b18bdd25c63e70b93734ef642ee39c86f4839cce3647e39cd59d3e4ae67dffaae54a25ebeeb1886edc6abeb4a238ac4b62a6d64579f510d532f77441a11c6cb1923b283c0363a9869049c41b59e2a5c4b697610d89f99e699379d3b96108fd2ecba2e6761fee3f276ec6a2c5d74e92c64cf547c69db10f9d2c3a99297aba68a5eaec22e2d88218f6913f04b0775ccdbc75cf3f8691f7b86ea15f6fdc47eb655890b50b5e7f8253bc4fc9292b12f1c22af4da54957652a2ab1ebbafa72795d3a501c90414282fb6ed03927a54f2ad490fb8be33c1c74ce3917205c2b5c40f341e25f3a3aa8837020430522310cc185219e1d38ef0e02321bd81db886e2afefc7e521b83e11e4108439848b8e39668e736966e7b8678e9b1ce7859773aa6b72b879a8799839e7aca93695365d954de6b8203c8ea9633c4ca76eda5a507f4c973fa887d2b1edc2f9691ebd219c9b407b899d8e5901247aa41061e1092488b0f004ce4bdc5850a7c78da64e8fdb8fe972fad57d5fb8e3b7ec871762ce35c87fc9647c956133b16f8c317e1d639c41f0e7dcd6982c33b9878454455518bbeae2eec9317e512ad1d3e7f42a25f56619621e5e1e4e55a6c254976a3633b3b78ebe3c54623d62dcf555d404b48eaaa03633b3a3586e2c8516783901ef8f52fa85fc51ea5408971fc12584cccc07e180677f96a87821611ba2b2d3bdc20be1ddcadaab5e49f668a90a93a394dd04a64ba7dee9c87ec753ead3a9013e5302d52bca3240117eaf3081298bb069be69dae65600fd7cc66d9b5f1c4aa6f34dd5edbbc4ed60b821e1967cfb7068afda0f87f61f0eed796560ae2a7d38b4df958179fc7efe7d9798f1ccbc20e2cf6dbadcb6ed0b4d1e7765947cf34a5e885aefbc70f3acc3b1793be769216357949f4cc7730bdbaa4496db7777032e2f6d51b7a505d2c53c6ac909755b2ca8f93007ba805923168087b04c8c8d85d36f4b8b245a1041603f9a244f1feb9f94417497284d913fc54e886c326599a6691e84f545a1d4339a42859472d57b0637354aec9a320b997644dd5805cd33d7362d0695a7d330f32d734d6be6cfbe8905a6f2a89bb5db9476d3a692c740af536db03d669f631d06fa51cc2347ecbb647cc20828f0f9cc6976e2a687d4b50f45a752bf5ccb7cbb6161b48cca8b9170787b446132505c1c9fd7176e139c5772ed8a67f2aeeb8ad2579acf9b1922313db88525e6882da68f86694a218f0d796c8b9e90208fedc7ecf28cbacc47cf4a31c8fcee9332601d3ac967ee12b9ece3c0d842a7e6f15fb2a31c4b3a758d66192635245a59542152e7214eda1aec5473ea5c06ea5c443df582a7bedb2c78ea27a0482aa594d22f6ade3cb145f2d0187986e204fce9276f244f6cb970e24af422eef3f1e2a1367125facdd0f3b72b83f9a657387cc9326ceb619096269a440d83f40f97f3fb11811ff1e32412953f182c67b17d2edbc6ad5c6d0ce44411de010fa0d84045b11451431aba67618da00223f19bae908d7df004911f26a2d0224808a7b26f0dada2a3c792107d485bbfada2a0ff6d15f5e0b7df5651cf77609d7bec55fb6d2b0b2c7e5b59402100ad2c78b2b8f96d6541e4b7c80c7ffdb68a983c7f5b630946d9122a67e3a8a5450deab765042e88808ef41ce1e59e6e99ee45aa1c186a481f7c1599e6aec1b62a9c17d6652b6a104615bdfd0b6350edc57c7b08e45b4a9a1a36915fe7bac04d92b82ff074ef48c66970250bd6b930542e46fee19eab0845303295ab61b214de2e32cdb4186fb1abe8b37397d872f29d285dcc480db98739520efa18c8a7a7c12245aead4d8c647ed83641e6cb19341adc8b66599663bf5de663f4f15252a931a598b71f6394524a299bdbae6d73e96d93526ece329b230824ae4c8fb3fb9b43fc36d833f8d936db31d81646926a1dd9c1b4534fd9c49549e39af1336e346833bbb661250da63c5ed2e054d2c1f0518333498336bcfcb6e3c18667a306a753ee52a8857aa3c1cd370ff9a86d6cf86d65d1c497c66f2cbf81bf6dbdc50d49942b9bed4479a8de34af6f70585890b40d92d836dc3656a828971c3b7cac50164a7e06eaa7cbb8b36d6c1a9c42b568eb141690c083049c2218bfad2b7e9020f4db4202d0879a11ad2b86fe084aae40eaf0e221b27919bf2d241885170f52916fbf9080befdeae915ff6836dfee30342d32fbe70d361635e4962869b039e48e1a6c0ffa96d2a7c18eb18198207db73cfa963b0d6651c346c261d284c8cd921b7c3fc5f753be6f83efd7e0fb2f9c49cfd14e93263d4650be8fe2fb27becfdac1f99af425dfe78e98fc10a909daf9cde833dfbf94bca4791d9c976235229a738d5624841a66464022e9b36c26a3f99a9bcf667a15f6d113e9d5b68878be7d5ea1d2f4aa91d8c6fa0cc5962d42122fa35e6145709674cb0a256d8dfdbe90f2785f488fa8921cbe903201c0176242387c214604e30ba98dea0be9cdb7b3726e7a1551f0fb3778ac9c9b1c9c1c1ca45ec513fc7e8ac7da4162c224a95771e6f7531e6b27a94993995e7517bf6f83c7da99214264c7a6579d86dfafc163edd8ecdcecdc28e955a3e1f75f782c1d254b96e820f5aa9bfc3eca63e920e930d161b2c3d3ab3ec3efa378ac1d9e9d9e9d1e1da35eb5197effc463e918e91ce91ce1f4aacbf0fb278fb583b3b3b343d3ab4efafdeab17668766a766a74c8f0fb268fa5a3a39393d4ab1ec3ef973c564e524e939c263cbd6a2e7e9ff3583a3c3d3d457ad54c7ebff3583a458c18d1b1e9558be1f7378fa563a373a37363d4ab0ec3ef538f956374749483d4ab06c3ef671e2b072987490e131d9f5e35d2ef5f1e4bc747e747e7274749affa0bbf8f79ac1c25394b7296ccf4aabdf0fbd263e9cc102142d3abeec2ef6b1e4b87a6a606a857bde4f7a3c7d2010a0a62e9e0f4aab9f0fbecb174707476b606ebecac0c9c6e9f0f2f9ebe7c7ab52dfb720961467ac58e0961ad6f6ce7dbaf56af32ee6ad22d8d1457aed896168a2beda99b5af3fd83241f30d02cea16a98b0a3e9716be6523c59600841c0025bd24a634ad652bddb454e5342f08ce9ac664ca6884e2c5b3552d8778c4aeb4c7244ccf051a86f8f6ee8b457c7b23359327b665002e000f2f29543cbc8810000f2f247c7b46135b06f05d36d8957601e880aa38f10d848c06a69196d4bf78564612aafcc225facb3b89c8b7771275fac5135b680ffc9a09682ad02f3c1457d8d9d3dc259aa0e6b5af676238e99b48128c6ed22d970dceb773cde4a981e11717329a5ee98c866634d84e8358cf6336b105b3092f1e9beff0e2e1f9be781a8949833d8f6ad8483cdf33bdea468a2d55b3f11a013d9e5104d8681f9d32e17493180105a58f4e638c31464c6633bb328a51f935c159b0028b131c086da10842407d741a759250c5cf17c6b0829a2c185184d642ab8a6f81620b45476022890a1d50213d0b29e0c2155a40410f66c0b1957c24c2133ec6a130c4008920e8c0200c491ba6522dabd862fb88ab05115260fae854522ee216c19e5c122ec9cf0e4b1f71db4ebc93cf30aa9adb8042ba4fbcd30ed2eb185dda5d7a871cbd2a755c8c49abefc9b98331f9d69c4b08c8bcfcc220d2a5b7ea6d7ef2a89f7827e7ad5647f142994779e12fe67ce1dbe9f4e2429d50b1ba4bac0d9ebc13afde963acf3d95cdab1e4af3422ef3b85fce0b35dc231f84caa387cfeb637d7455ecc949ae4114673573070cc316eba1c1a6606549d1109acd3117d16c589d2b62f9a6699fd8128d260bca176e11c87d4d63b44234505fc86204b6a491974140d1e824c6188d9c500204a4a4df8f441f8762eb647462148d8c624b9434465f6cc5a1481469624beb6057a63b01042a7ed208a16242b1d52b2a81b02242bd9a28e75a3f6344c5d3d727401c148d5ac96318bf92c82446255b43faa4b4d6546aa31c77d977e2a19cbcfd1eb61e1ac4300cc342469d3c87d7434e3d79b8ad1307ab2fa8146e35a541ec14cd08000002c313002028100c070442b1683c20986bc23e14000d8f9e4a7c509ae95196c31442c61000002000000000000209c08000109603906bf2be4b630d6afe1495c149bb15c973e22be18eba0e7458edf65f03f9a30d9110487521479d4bd1e47684adb5e944c52c5b71fd5a8c160f74b159555916a9d466c630d9ea810d0ac339fdcde88e41bdf32686ba5d634ea50ef76edfc8959ec7870591be2e945c48f7e9ca88c53b7dc15830886b4d17cb3b0cc6410f4b9a6636fd5871694605f07842dc790708cffb5530687ebd545ff1be4cd426e20c3b9133222b239dc7acad1cab58ea220d6d2b19590e32364b5fa62e7fe12345eed11386563b8fe688c934949933f1a7ec9a4a36c8444edb5637cee8af68277d8dd5841a3e134958c9658fce61273294c187e3a4248c976b70f2cfd541b5cf091c4acc914363ef2985ae9835795984d0b368aadc7fdd3d9754821d156f39c2637a7cf2da2aa5057ba1f6e6912d411807c91a052e2af9e1fec6b292e4cb78945c7c960cfafd1486223c4baffabb6545160fd6788f0d8943996fa5952ce14ea678d6937a730b7f05d1bc7cb0a64f5b10767eabacb27b95ef6e53845b4007e82e09949a633a504195ebb17502075bb30cb1c7405d97bbd425f53d5b0ea14c6e15c50e9df33197d61ffa3a88396fa805802296075219fbaf621570b182f3c78060a61517484878f2b67577218d2761de5dacb92dd60b5622592e68fc45e22856959a05c8e4081c554fb6347695761bbb4be81c0b8af96756a4314a393cc589ed9ba83752774a4279a0f3f87005c6967b5ab78c49aba01547054fabcf8dba938b136555c754cd1d9df57d3b8d4751d6eebb5a0b459058405444ddb930172497a90038c48bfad78cc8304a636b3f762700b2937967265d55c4dc8aa3f0860033be8d348de1c6c86e838fba391674600c80fa44890ed3898e10fd90242d607bb414af641a722935161d18e45a8c4c1f82a702cc6d73d1b4d45c417247dc3cb851e8bec1d5eb269a5113688da7fab4983d2c71b502c4e84ce125be31a72a0066d3e25b2f053620a43c21b9729e0cdca94523da31a46cbc79fd4f92de8ac7a79914f77ae3c97eeb831e6e94521026884667da0069a974582ab5022effe79da847c2fffb94693d3e29acd4766f2ad4e14c4d2703b80c3bfaee2ccaeabd8c21880fe95581b420492d88d071f6f8781746d08c627dd80e7fe310f9d32fdd35a4dc9a8e43eeef2800b9f8cd62d6f44c0516bfba12bbe1b1b72dabfa1474460d73cc0d189563f90ed9102a8fb05862ca10a38ca4b11bc6edb69620beac609aaa00625c202466c1d27be836a87528c56fef9e76f07d89b89f007bccf4acfaf7e09b1b419259a80f8bd4deca8ce561b040809fc394fe81016130f3a7104b5af7429bcbf5159ceb4b00ee98bc4cc387a8565ce6dd103eeb062891adc0c70deaabf198bd659b846461125bff46575305d0f769b7012b384f6684c8e2d148da64e58879fe813961e59dc47d049ce454be4d9b2be5a5ac611c5722ff8b7df6c3ab5776deb9f22be00aebb8d8d2ca23f8ad5a68f308727385038e34da2ba5a0a151f790b0fae3a8024786b34946662b62411efb4f21a5266425a0d0bf124b8b6d778e8584d8ba92a54b110ca351e047b7462c3760a3ed8a0ee70bc14985f1e4c0f4456159d6598931f00ceb64849a20c21685b2b9d76364c57be3077cb989dfdd851262ca3afa5923f20148b7ecc42e7bd90ce4b7fcdcbc272b0d00aa779aded2a0cc2e0b82e27b6e4f5ebf25c7913b04998de0f96214b6f91369b1992da83526c62e0a23e7c8c5e5e3774197e9a86b39f939409134611aeac0f5014f2ddb9112ac7504b60cc8193cbea4dcb7e6ca3933ae56f0f395d7bf24762928199ad596addde8ab6ef358ea53b63091b7b9a3e056c07e0037f5b2f73d4c32c72eeb420e12714d6c2d6abe11f76ca905191f3cf154ec70027b718434ad2a91b618eb65255fcb4c2c916716e7f83b65bd8757c996bf121cd515900aef1fd9d9b687c78a11852c12093fa1e8543fd2ab68337b65cf471a2292d30fc92306fcd996859a5febb37c994ba84707e88608d66aab232662cbd8121e9891caf5cc4de8147b63e51e42ab5ac5a4f0d5210d51b9e6940c502b1abea7ae151f15fe19a9c277d58c66af046e0f2a9d7f07b62abe21842321d00ffbfdb95fab2e56ad5ade9b5bcf1f70d43d01c3e764220e53b4db8b30e9da0418ac800d82ac7215ee389a29b38a96be99f99980c4e10164648735d3057f25bc620daafea52fe8f87cb1257a8d8dc35bfa3a7a75bcba81767166a2ab0374128066886b91901d5499ac20e195e6dc22c9a367ab528033815b6f2288fb71063e3bd1fb02598763fbf3377adf8f14a227eb198665ccfabccaf19343c3f5bace69261e0ad904bec05211d6380bb033a7f7c1f07c302a44b260e56185aaf3c9d2fc27187c3ececf8f8d2abd61ec1f7b0ad7d3c0f58fb1fa6ab191f64e41f1b9806ada1d7e1c376af794b5e54fbe6741efee3131a27cf41d264cc522ff4cc84ed81b9ddfdcd1d5aa6b24465f22bfd8e72732d64f0bf442e69de6f190f683c9e225a48921b77c7df641f1f7381269cc1373bb9edfb1e47bba87aa378acd229266db04497aea39c1a0b60b7cc84dd03d3dae12d391b7334cdec863219693b461b96643abe01765611872c469559bb89df76b74887ea5d5da651c32b9e6f937190b069b1ea3038cf760d934b960186492d35a443261c13833f3d1eec367b59fa1381478c6c68c7b5d0202933fb8359c70ca07a6b0ef0db849d87eb41c43df269f7eeb162bfe033be482d57140ffa9a731a52f8d9f9ea2644e9193b322f2c839d4b0b9baab92db8e6a23f1644dfed565ac418539592d3b1e56bfa4cc4db10ef0e94ee98fb759e9b2d7abac36d0cae0bd3db1d6af19593a38192307fad306816486fd65e44e63c22ba71f2fd8a3ad3cc0119f270608485cf8b4a1e48fc8390006ca79d3c8091cf7e0c8407c530130da6466f1d4a0ed34b1d3e03bfccf73f0a84196a797fe7b32fa34d2939a371d3fd48cd00abee903141b33d1d90d866c5c8e011a2e87e32ad9c5d23a8344746f493536ff7275a8a6dedaa5fc2d1f669c0722cf48a6baaaa9514f83040736830624c81450b5481b25f2afb42199b2811ad05572290f7ad5ccce426a54cc5f49b7aab23f279e3ede0cdfe11e1b7ba82055dae053a76f85807e9bfc400b3067715e596086ac520e8faef7e64e6f50a3e528073767c6af95109ef8a98cd3ce1ab508d9294ca9a8c5ebfb592ebd66138a0051042b8d0832388098e2ceb447004286183c05216a364e5d8349d9f00a04905dab938ae75120ef6aa2ca0929acde2bd678b3aa8b5ad22c3ad45b8b207bb7667bd45b23fa43835555ccb1aa3948de61631a1676ad56b58acedf948c89755a0da9c3c634a740de90cdd759aa1886266ed3d04e370b0e5e0c6b04265fea13e6272d3737c7089c1446b7850545e7ad75752de2a4ee2dbf5c1c29e650d1101617ea8c0144da8dd0909e92ebbda4ef6f9e0a5972bbc7c96f94bd72a3f8ca01c4513f886ee6686d8684a2cdd9472beb6d62c0936734d5c75de47505f71b39586e78e7e4905926d13f9acbacfe8aaa36b820fa69539d392e9bcbfe347a593c50525ac1b594c9029c814f1bb7caccf096993411a395adeaa868cf6591e15a037917b5f7d5c8c2c9de731387c59ccb1ca7f21a1a6da6b8ba187e4e2d29bd123ed7fab614b92b63d745489e81d713a86d83c36efe85b3a9dae07ed61fb591f6a4a4b3a291c2643d93db2b3d3719b678377526cad33082f445570396255dc224b423ba2880ae489d5be482be3694a2afb07d184449511af3a33705ec754acb5c0f1adc92aa98fe90d94cca3ed046c40088767a3d989b29f858c6f5cae4f69bb5c9b026761761acc889e456ae58b06ec25cb00d7e5178dec46f4fa062ddfd6faaa54bea7c6a249ab379ab28b33a1cd306cb3ed8757bb53838e39a7bd9ff290839821f1dd211be8b5788cf6f9f897d72e2a5363f3ebd3c97f21929d4f2a7de02d5ef25294bb18fcca52910f03a51cbffae1c4bf3dda9424ad40ee247f11e36f6414fba8b93a9890e2f8b335c2180e1e53e70ab195b9d292790bd5f41ede843127d94f00e5fcb28bacbbdf93bdcf06e88ed41704b1ce278748ae8c39f90c26e7685cf06c09aa6b3304f528b7b668472dd84b518cd65e1abcb5aa14df9a023c2c1746aba1dd5714279d35f05d3218578797645dc9295e9673e3d390776e56e0093718e09646192074957564bb1a4f128a234d05c55bff937c29a8039cdedc600e6bd5e00adb9e8847a68192a62c50fa0801ebd5f8a5aca34d7f11682722947fb0874af4ad844a0334d03f608e02eeb264b1878cae12722185904675b7184f77ba37db28797b271a9986e4914adf4682274590c7e2220a1f9719e46d0607f172ba84a940fc211952e47f6576c898a2e88b4debbd15f7b6577dbe87bb7bfeaf27f03feaee8db207e2f6df28873777ae7c88068ed335bd3e86a5bf8a50ccfe862cd1dbd01b7604777e8c0849ddb308c6e840caa95edec52ebe32d523e2e267d0d179ba5929bb727f06d5a9573b9fb9cf65708946f489640cae5fb2eab4a65c72fdcb3e5563534bc4ab9a06d5ad2b55c4cc605734fc8d94030ae0b980b3571209cd8f816fc7f8d34e5fb70bb8c7674111f66d9a6a2f3e4222bbe82b01745044fd18d7821870727ab4a7c2ca834c2e2878bf003c33e754d781478f48fbf340efa85c61f2821094bab94dac802237eed6f6a88a78687f70091e54d6391f5bf3b063383728aa4a20bf9258b22c3a6b92923721a50f8e4773b40f48a5cea312ed04e6c74fca0506deb3e4e34ac36e50ecc384ac3cdcc9d58573aedc9c73fc5d581d9e5c841d96b2225e414b904d4784d42f3017d04f24016a14952d76882688e86adb1045438a12808cb962caf7e30b39c64b4ac9a19f13d8db1a7045a68abd6638c111a639755056405030fbb184feeced05297b75aa81c4ad44b95b4821832b58b5e2030fc61f07957ba821ecd89916c6e93680b391aa9c5d6056be44784b992d7bc8f2815cb97548851728ff2116656114fcb0dacd87f8e535b5758dd5b61523674ea8fd69e9a64cb20a131b9fd723563e9fb75a5e7e35d770023aba90934e01a2f259d256c87d0ca524a9c8147ac4d04c8c8e1d45f09634f6e3a7f92b83858c8f6ca4c12df6755a3755f569f21d6080fdff87a3a55c84d67616d52ae8d023616c4e7d1d92cdb451036868dcae3de5e9f61ab66baf92e9c7fbf4fa362b556e9142790bfc02e1bbe62bf7546dee43c5b588fdfb3da9b10931836a5a48f01b0e715f3dff7ed4d86128171d75d4b3277c9af6b169c9bdd2f993eb84b823ed78c66e656f5e75005784b22967b733796759b958ae80a4fbee8e040d4f9fa96750d784feb3ccce23073598872052ed0707b41580a435463a089a5584d3221af4818662cc5eb9bc066da40f03b73ed652c6d5c15e2920abe32a9455318cb3f82eb204a60b0397fc015582395dde801405d66684167a12050bc3d0e4e3dd0c4d98aee8ab2d929e4ceb6f9c4c627aa753cf48b0eab11df99539a7befd62f6eb145279c675951b7775f0f388fcaa614bd83849cacd95dec657fb3df99a6385294330d86cef920ad2990f2d6e6c0868e171334c302a25d345a057a4900c18ef867d1f2de29a1d117d580b5aa50b725352ce910094209e3a6698bc336bea25b733181d8dc4972f4aa5ac42bba95faac327a7a35f86c496c3159ad1d20e2cf3d89be3eb50cdab184b438a79ad5f1c60ec3bab50c9cacaf980fc0acf399bd892d9fc6d0df07f7cb412ecbe6e912863605cf0080558d50f16211928fa7926f8f57c0f96a4a496e9309021e052b5b61f8d2c1ac043c16293d1a9379e6ada6ec14943b7f6d07bc9a6075c5a1189bad96a47cbcc5c4ca23c0fe4beedd4993219d817a12c7f75534ad15129d2b4c742f88bac290b150b4d7b17b195c29411d9a017650d3ee4691c0b3986b1b203a41b0046d904efda972fd47d8c02714ccc0bbba19c9477189f018dd138648e9b22720d5b16f4197f0cd3377fbe2aa862b53726966f1a2f9a7fd1fa4f96ea10f680892203b9aa3b2084b25c3f5729fe0e22e15b7d30713a51ad49215cee13679c0004e820a01b1649779c07320c641a44a808313fa95fa426f398a2aa884715bf13b696d121d47d6e5ac8142a48b97c82828020005ce3040432a183f12b7cb8cec08195b14d228965e849acecac152656627e274fab612aedfa094464cdd55cea6db319cd3cf292bb16bc291f2831a3e71cedbc60c993665e4a53b884b45102d97097006dbc086584ae8358489ded0326ed8ff9bb91aa8622d1c9855b0623af867053513f6d28e930f0c3f30934f1778e82c5a708d2424d5f8e00cb2f511074d2a4fc1d2cc0e365ee5d4de89f53a4ecaff6d39c89975cbef99d5e30119b7f7a286f934b372f8193e80276bf89bd9c0ac8f6390e21be505321e95696407a0b4b257f099315141857bc301c24eedb9160ba39c17c3022356af82749a5f17e021b2852f86e24bd901fc9b36c3bbde6f60b137b1cc26e2c32e8fb003fe385a483f440bee87b6897e1e6902f863daa39bc75a4693c7da423b8fb300fcb1add12d7c155edc2eb719759e26c8ff61f4d07f68cba8f2a8e6b81fd908fe79a43dba79ac6534794c4fd48f2cc2f96175b1f14301be585210791e1c712eb1d9c04da27e530721a0f33385f76a1403adc598fb7f1c0eb0ccf84015883ea901d44b013722c7ac76a0336dfbe31258f878a1708ef637d86f2671535d900ac281d3a4bb00267054f1c1a1259f396cd0d3ecc8e4568853c108c42a190e84e7fd27720bcfc11312b7b5d3c1145c6ff85fa7b40f51c051eb793742b5e77326f4a22096d003641f2e1a84cdd2e3414785470904395425884b96a41b5bca76519481af4c55ac32373f2da365c68cc2da3bc13ecd309eb60c17c641eab21826e02f9e8c1dbb2df11699e0f790563a5d5aecbcc1e3adb8ad054a06ac590bac7a0fcc15af02e7b7dcbea6b6da63e69da5241a148416e9ea8f130140a9b79dfd9aa9d726336dc8b9c307f7afc6202aae69584b372b321c27b1a649bb08b3cb9229b31d1455ce7d8fca37d877204d5433c0c54551c0c68529e975480c5dc0931b37e09ada890b71ebb5ea71448afc9a12b30b9863a872d21e5e22b92473da852404c816a687fb2c43c951a1c8a047f9ccb036abd7e813949928c2b9a1fdadda18cdfb6a091618a62ed39cb331c44e5a054fba194a2b9865e09aa383086222850ead4899b566eca830707868fc79c753be5b99ba4f1a747c6bc05ee7dd4cde924a194db5b8ee1e1c99b148e7e4744bebeb2601702a3406cf291d56dcafb9ececc0c7d5f657ed40f5d8f76793ad315cc8ee032d36f1723dbf4cc0c6da493073bad75ec81703e080a2cc00c6cbbf79c75c107c892e806f3fe9cafe0aad3ac54ff269d219738a17bc30e5e29f5c9973433e6073b250d3fbba51ac5616462099237f9159a6cf345fc468dc4b736d167a4f73ad5100ef9f6e42c308ee5c0215051e6f9f97134588a12c49e6316e4462a3b5dbc048c9c98794564e916dc9118cfaaa621626fcc3610e0f88763596adf1b2539df8edd0e2b687406ed981e60178af61530185d9d552cb8f1417f75dcf69e7ab847eab1d6f2fdcd4bd18e4adf094cb3f88bf5feff710d643b28c22db46ed859eb6b3a648af6f723b3528108307257f163b754455ef7bee1bdefc6175d088c0e395fcfc0cab0bf6b2e4974f84cd03d41ec3e54646e102ddaefa4aa5e3c33b6922fa411dddcedabb27fea3172917162732ab11c26cbe69dc4a620095a1703c8720037fa0ad991dc2a671db96876439bb759084e0e83381a9033b851027e2913f2c5fe6220cc3aaa27e8ea0b15f39f22c323adb9073eaa7fa5952de1e793204b458daddb51fd359b2f7a95569a15cc94335825b44c375674fea11123307c85330ec2642a151e3bc6f8ebb28f361b8ef5d5c2af894b508122ba9a8914b6622a1050d77888e4dcb6406c6dd781c61cd53b29f015acd5a7025d82026426dd7954258c712da047b2d18e7af34d0167b4b81d02d2576890c7b1f9f13858aedd4c4dbf8c5b7a770e620c7024915ef0cd23a4a2bbb49080da7e2c20e5638ad517f539850a9e2a4bb20798b0a4caf21c027388fe6539883a8b04ac7304ef040e1a646efab1e4e34298c3a1cf8c1e676fe875ea4461ffeaa452d412f30a206bb9844f4098041ad1e46a0a851aa05ed31c5c6a7504ec78cba8ed69392b59493b7e7b6c0bf357c441e0aca5777f67c280f7f039cc767d59fa2c216aa4441b61d619b85787531023c3c35f8665311c6b9ac0f1f7584639793d7d836075467b9c811b264acf034e10851d6bc67176065e0db8afb83e56781253942a14a2c5f94e0160497fc2dfc5024976796bcc68ed146e44f0c01735409dd158e8a23d94eef09e871904ebbb64478a30634679810c842f55cd6bf291083d99b87588388070856c145386a1bae31ee8c48978a16d674b1ffb51aefc6172903ed270b3ad26dfe23b168a0a70312e5ea8d814e58c88237cfe364d3533811c815d592e602962af3644ec0f207364bd74bf84a1c7a3eb588e36855b07a032422088b926bf74bb9a75703a7039b2ec77d869cba36755e9f571c669155a3eb3f034cc6f3060a72dc91dfa134f68f10bd54081cd5e00744e066a2ece06d2a59e1c9f14a0053109128825e97ae489f0ecae563d9506bf109fcce837447202c7dfe818a78efe214c6044a4d2a214058abf6f0689c10523cb59cb89ca57fe75fa4ed84bb71026d9c1fc8bac5cb22804fffedf9571700772254d146ea4a0d847c836c526d914a7cd41cf2f9c31fe221681668f80f59268d27d92d8a7f63d14875395f87c4ae80fa67d1853dedc926c5beb62d82a0a7c5a8f8dffab7b255f364c2b9f45f6401e8901dea65954c4d4ba3074b6956c3f1b60b64ecac49eb945dbeb6f536c0a83cd530c81b5a146f352dca1c9736e167b52347999a73d9595340d340c6ceda89e27de250dbe364d5f447e9c6fb545624d74b35545c74587d88f7f40bd2b71d7728fdb5ce13056b2e763786e7dbbe1e7f895e73ca5a7b793e4714d70013f3b49e2c9ede6df78d79b3fd58114734b85f338d9198446d56c286d1717c09aa41392fdccd503fe18d766a2354864734a633d59e0e3e245ff09b0c6f2a3088a1e05eeb678bb4cf1c833a18587f9a7c9a4cbac278cbfdbcf3ff2a3128a1675d6cec1832135385fafea80693aaada35c1264f73af1ba0102ef4bdf7584d7a83481a7cb13a8360eb4883ec2a4c2199309f377e6bb913a3724742703b2be4acd689e0f1560450e10e9f2b19984f8033c7165ce8cd8dfb4d084892093a64ef34d48e965cd0e1824f6cea5d38c26d7c3b5195812d4b5c4be83365878934b77201c4dbcb234ce6398fee023c80e27238e90c7a170d626a9a4093d897c08fe07afa92cfb52ca6fb30b71cd89064a3ff5c4035cd5e62d6a496e21afff170129d088d431ac89bfbfa15d2f03e84decec032837da0c02144c9c2e2197c53e85b80032d6ea25f37838a8c855815bf68af4dea0f7ffc35a85625f17277297842d016eadf7712358929fc68f94231fd572de56301f7c0dd63ad95448c3fcd617a62dcdc7a31f86cdcddeb7be422217028cacd552960e33588f817aaa568e01cc24a79981718b6c79c0486334fd20381fa84497fba977dd6d11de8a52b5fe9a22744a4a861f12f0ace4aebf43029c3274392ee5fedf16c29272565c746f28188d8c69361717d3afee8bcb3bb3cc332e4635b8b1df92dfa2689617a99a8b862719a947a5983863b77416384625f2cb18c56dc01b1d9950a68191b9c943189488d3384369158787bc8cec2683629abf69215f2b14ced5d551ca4a8669f28823d827caf34845e2390f6f7cbbfa77f188afe4986a1b1b71a8af9c3a1e16f017bc5b1950bdf5fc9f160a56e1818bec901a317e98aef00ac0a7567163bc3511a1c01f365bceb9526af9c25b4795a908216e28350c6810f9bbf9429289748255b1a5ed57fb6364aaf06c268c7104f00f1f457bd497039fd5841ce6bde67bacb6375a2ab54a6660e8b5290c4b651eb42d2d16c87e22984f154d627184d6b44d8b5aa5d877ca1e52a5f5e33a6f65cfb087985a1f6f86fd319da5cda03047a3a03d65916cf3c349b9e8ce82b1606a56fcf5009da8c186fd80ed102b5c046aa259d4e83a5ee1bb7cc2938af7a039230bfaad7654fda70d5d9b6b153ef17ba8a9352a82a9baa3bc6cf766f5264a04b73936a4bf9f6abf1f67c55dbd6f0443d4513f9e9f9897931ff0a720b39bfb4e0047a3c8b3c3075e42588977ae7562b794d29d96f37a574e39f85bef373fc1045fc3d0c409549ad9034f9c4b8e80cda75a62d30a4872b555c780d46eec0556a8c44806d429174378fbda6442b0634804f47e897ae32f9415615d320149ac89844f74fc22df8a971d747629e94958af65bee4699e9bf11f20d7095694b6559d5b5c7a235df7f5b466fe70bf3465629d51f0b6f08b6f4d6b21fd2dd9e6995168e48410df6c446aa75fcba45138597f2d2cedeb9807796f14d805707c9970489a4db29ba6d1598925390a3489a5daf54d568a27431777145c4462e5d52cf93c6ff3058b9192de89596e52c1183d0c1e0524cc1917ab4b37a5543097cd34d4595cb8b9d9871d884038f9d9c6f57d03907a1438ac0e663d63565c48d7b0a0e1d79c4ea7417734150329fc8ba7b074dd6d37ffcbfb00f459821480420a1577412152c04e2f54e941d7fa1a7dbdaba6adaba05dfb89d0e052a81c59454d63da9e315c89468383ceb633f48447f37b14434ef08be6a6a6f8affd900da1989b230b05267a95f20adc7b85bf2b9001cbc08b2226831fa1c234fb0f5f176bf95815fc59c29e1b7649bd7bf649b91ea431a1a8b0f20f8d25b525fce2bfaa90a2483511d5ee425c7947d0e1a7e394a69b5e9d2ce480f6f8b8afd23600522f880a6da0d159a44112f81632958fb1ecd3b7b8e4a21940537919b372af5d76d4ddc894a8d40a1cbf2545a6079ca681c7cbf3ce3425ce2c9dd68768339edd856b7252b8990997fc130bb732d1026a2d8bd31e19a2650768466f64d80fc5149093d8f1a05f3ce7d8ca118f1298fa1fe0ed9429d9b687a5b0edf616025d0c8c9a4bdb27484753b5045d5cc945a3fc834815cbada962f2735108d723a4d63d1396c58c7656f202ec7d1285da727c0cf14da8228dc4625c0e7d380c754874b16c42413669dd1726b7da6969e028b82f1129b30b6736d4970d5e7450214a5daf2875cc02878a47bef5e3007bb3522f97fca349af98129de2c352f9622bf9727b0ea36b38972cf07a84c28585adc7398d37b55ef038e2ac6b83a09c4923786e1768bc19bdce8917e130ab630174e136e0b1b91d5588174888c054a0a1f0b80f24dcf59e5226819f40bf7a088b9acc67d0fe348013509d905d7d5cbc3fe055ad1d85a14b896c87696fcb8e3fd3b42bc492c62e0f0dd3863d0e0136eb2a4cb5d0ffec208eb8e5d242432092aa3612664755864d2632a2318af1bae5367af71c294eb0c1364241dada4bd11684a0c416964023e014731810de289c2f022b9f92790dd39c57dc1d0877b710e270cddb9a68df2891a77064352a07bba7b16318d6b3e3b88b3ef1f5a91fc334246ee118e30351af127311ea37d2f329196216eb45db73d1b2addfd69015858409f4e73016230bdaf832176e7952070d14809fe90be512f91e2c998ffdf93d5a8e9af898c0f1b50ba0cec3a2605087b6d398180919e561ef2839ae56a92744c4ca59f36fb900aff7544f985db013301070719824b122959af6180ca46e7a2be152f5052426170c0cfdd033f02e46424e0f3252cce41d9ce8c1aeeff0a62b9163c7605a8f984b85e50445e95ba1c710c53ceff7a73052185363079a42dba2f85569a58f53a98c661cd07743cb29cf483249c6e7f3b1db3fbf85cb89c239c3c52a4eb78821708a40c08848843975184e71cea17184cfa2671509d90c37e114e7e90ca6983c4e63f98b0f8efc4f9621c99015a7b40f5ab707d268e41587474ddf488b7311daafd93ed3360d65aaa7a979d49c2b6f3041b5cd8298ec925903e91b3e99212c2627034e439e7fc73bae06213519b6ad53faa5acf0a5beb27906136e1d3471310864e4573539224eb083bb6080d3c9389baeb5039864ab5bc89ac1c5ec459a24b313c4833f85e88deec1b5422501000a832a59e37f17255bc126b03ee6e50b9afefeed230dcba2578279b8792f8a942dbc94756f8970aa823fa01c52a46a6120901ee20c1f3d305e7c159666b7a30574506b2dd0cdeeda98065c0bdfc8b359c2ea67b167f0c419c7200a04e374b4008469839d44a83d37ffccee2c25a0f1223248aba9900b1716a16bb46da52f44ac1bbdab8fda5fccc1dce0ee2d627abdd470c196e66da36b417e49933d186c70ec12fa8b5e44c5d2197e818cb980fe71b7e9a8da9c3a7fa6e78e2ae00588c465f0874077d50a48af48a25f9631800b13ca53410d6432bcf263b7a04899c6834f52b6cbc175694f8197cc7e3bd28ef8c02421332160d1071c3406deda5d6b4718c03a20d966fa54ea78615d21200be8ed2247185a013de9ce915357724bb1679206eb1a256598e4bbe61b3d5b06afe81d982d437f83ab608e3644c9df624f082f3c0da784e406a3a7503f554e6e96ba5ebedc24aee908280424d835ad24a272b0c201a3ba8e8b4040cbc40b45c60eced60c4cc6c3f8cc76ef59446f8fe85438a7f9f6883ae3460adb1bad4f786c2d1e0ef2cb47cb561d8e0414952f6a2f8887886ca18fa5c5c94de2129330a087565058d0d17d057ffff8a8b3a80f68a647588ec99b8d4222a3500a4e683b411fe1200af6131607445ebaf08777e4e90060aff07d0c1b0c6c9f49041dd2aeb77d0d01ad2114568970b365102b511583373f84510c3d3b3cbc72c0e1effcfe5982fbfb15f110cc86a67527f491cbcb5c38f5d568e1db052c5e104a33d2ac85650549daa5faf17bd15aa4fa6f785f8f539edb88a6a08cfd38f6ebee0ba6ad01cb7789bcff0425913e32d7fa8846dc533c7af8c9500b16988a56336eba4a3df4849862b279ac33a15636c51cc3c90aa10d580275c0d836deb7d8d3b76f71c24de4292901e659378dc04e44a219ebf442de27153d5c453e6db72c373ef710a4a6c64c97b9e04973152915b8bf197628e869c76cca8febece555cc014161b3310ce7ff200585f2fe1f6cc84e98903c012e0d47f9e022f5f709da5a1d351aac3d07a7a7ed7b59f80f51223462abe0af1792133f10d052f10d1ef1bf91b2e00751949400f0eb1f46688a7ac6d00436bf8003a8916903c840a8636e52542ead481e19008421d026b862ab5a0d3bb9a5ae1f11275fd092e0cc16efdbc46bb07ae1234e129a677628dfe7e159a538970b7a2c61e1c46f70ab4b4c722beebb36834a77d840bda8107bffe7e683eea5bc47387ca6bac959b7a34735d5147c3314e56059af33cb16899ce0790c8c507a29b9d6a9b2072907bbf754809d88eaf70af6c9b4458b1057bfc059b458a663f94040f191e9a41a234e26007984544d0262059b0e7c0d4a66069a84df8921d3b15552234562ce252361d95e6e3002d2408ab71abffd541799bca3ab1376a8a8845301046a5fcaf229893c1df3f2215c9b66c45d6c440e6dccc502d49292c9ff22b7b307137422cd148c7e92c8d8d1fcb59529eb242d7f6ae6bcf2534a0e1d24e0d746544c80a1e53f32066b6049e26f8ff8a81cb4def101df00a3158d2bbde487f5e5f0994dd1ed5626433ed883e9adc52b44f06ede2ca4427fafc08100cac3286ee022046c09fa8d0dab23e2cd0588cc195e2e15a2eaf6b0b9e8055a5e0100d48365f0390d3e1ae491d401442ed277cbc8a28dc0f00fc8b1c720bbbf3bd2fb055651024b56dc49491b28ca923972ea4f56cf9f10017a74be0670008460492d4e5cd7cb4fd47c08fd63d4d73d0516d3be9bcd36d252d82cad54c715340b79d4d76235c2ceccad65eede07f31e71272512f186ccfbb430a4863ba5841459dad89f5f8298908e88d54da204e4c118773ea45a40b3d91e3fd7bbdc65eaa886e32e32f67321d6e938987609a17325bdc925ec1aacb8ec96798c3af39c2bb93cc3988fe247c2fe4f87e0fb08521514bb347ca4d7ddd5e17ca63004b5b11c697dd6356e8c02a66cea33ab3a90cd9ad4415708a01e936a778ecc80f806cd9b82f59957d72305a63ffa879e64716b280eb7589daeec16323a69d319d1d6e83af27d39b24916c479dd4d80c4844022dda203b0c84f965791427d83444ed33535b805507578ebbf0eb0093b630e8aab8cc5c6e61f0617257eac291dbaf9625b5b6ccd62a8b2e0b6f17f6a52b9e595207103fef38c1f34a72d7596b9039e5eddb79808babdbec43d40db826091be9c13f22a9d7f406a7cf9a6e9ffffee54b3a0ad8781686b3c5b0a6adc1cbebc9c74433a1c677cb1da4604082bf198ebdedef212c0c88b701877469621177ccb96d36d182448802fcc57951682026fef8099c8def208fb41fb746d793cd7d8c269b001bc8644f2fb6cc9e18ff221fdbb45e781c12f71af44d6a1372031836390f27721c17f05c9656dd222997cb6b9258540a6b7f8b2a7d2c96f09294a87948794062f0da860184ed9e8b55e69a333018afd5e32f127e48ce70a2454b8e0657421d58151dd852007208b515ae179d8b00633c500b14c3c0457621ff025e005965488e12e113a64de2218a30c13222152f423478393f8af3c4ec557392b7b3956d72f758cc0ac228027c2ad3f16db550434c6dd52390c314b4f80f18664de66338db2c824e31d1c3980d4e271c6e13bd6017c8a21ffc00351355083f73c0a91848fa54f386cf21af769bca142f1acefd13010fb6604efde8ce4af877b83253fb8b1c0a980cb32db5b9fbe22cbd7e85d5ffcc9da20f81281a01fce7ca54d45071ab591e28a542a176f74327b922a9040b1880ea9f35120246d563555e462a50ede62b97b99a3391c3d94dfb67be9f26e463a610f1b7d727f5667fe13fb0af3a5e71f40ac862aa0aeefb0b40e8796447cfdbac144c084442ac5fbb9f186ed88967201fe67f267282802eabee5a990f24b640463a9f386dcc4d4a2df45dc6d389260650115093518eb122714d6f6fa543c4f554fce953e649c59a4e2f4c80577e0dbf721ea942981894f0bd77b235068a502ef736c51d3c9030fda3033a714a299d21e70b5803841d5b0ba13a78fa07d528e8554d9e192dd57900770a561830e36db6cf4601407dd4f620b76eaa43c87263cd220de1ed1d8c54a28c6ca9cc56f9e9313a6a67ba9bef377a86402e6f52ae296750ab8edb76807b0869cff0cc7fe85448dda9c5ea5c096e5ab38b4bfdc26f6f37080641bef313227ac19f8a968c4655bf9659517d78d32c99298f27ecd79ba4d7be01d65add3a3d9cf19c1a885e7215a7f56333b88619bbdcbf6b71b324ab82d182fc1b463eb39a1faeaf03f2a37340e18dbb1e87c780512833db6bf2de263aeb864b75ea8af833ec0e90f8aedb48d9ade0c80674ceecbb5d3edbb3ecbb0adc2ce956167c5b44830c2d4eb77eabd1c5e0b71cd4e73d500eef274041ee00a28599b2bad0ccf0ff48c9a1e66b8a917f3421bd375cf2a0a443f83382d3f78b32d4747afcda52c2e2f5601f217815fba13a486919e314b35d3b56c5c95622439adca3a33cb789bf0915759e692f50160a3ebe38c1aa3a5fd4e253da363b0014195b543f0036069c69e1486d07b7ec1f24a4e39bba03a957c0dac49dec30e7e0ed2a08df70b2be772224d34662415451a2887a8a5af253745ca8071bd942952a049bd9b55612d0e76b6192a0b9dd4363894e24cb6994743449a0a34ef44d65a5e2108c64a12e80957e146f54843a2e0b5e973794f8e1a5ca376034b85d62eba70b419b97c9d77c7a6cd5898db86464a5a05c3087df29b4f43f245fca5b51cdac33a8d3edf7d325459c8ed49b67114a707eb120bae1219c0fdf5238c8f4a2cf9a61e10e0d4237db82208d382b210cf63acef7aed965c2657e59c149b812025551f136e5ea30c89bcea0403860d1c16fa9ae0b5926af3b59322b2991666953597f849128df0a36a06548a3cc52bdce4eb55c5d31de8f03fd4fa226d32ce02261b2b6952c6765fecf5f4c94ad8cf8da719a679ef9c94901ef1432b05e399396200cfef767cd1e1d900105a90bf92320335c182625221ee8760b0ef3c4d784641a13f2127cad15218b99cb83e0b103e2f16165d235e01890f71f8245f854fe3321fa56d931ae935b56729719949731254dd312da182b0f77b0e954a01dc7ff09067a99e6d91e3a92941a1643a785e9d0ac190b6d85d277068188a9c5659bd6166c17772a63d96cc9ec3d2462129703be7b61c24b7b0833275ae8a69a446720f6584106f3aea98d8de0f90c97279bcb37583d009711d660857c637f325a1027941c7d261f831c0287e217458864a11153698ee6d210ef03cc72f1e2dd978cdbaab16f0df68ab49a761686678cd7ec8f0792e63117d77571017f2f2d05c34c03659362ef0915fe10d33e18f47c48725e4b2cc0e687294c096e33059670f55bd066cd82f22e43318da82801841c33eb60c4191973a05177a464db579113f66b23294888861902c8069f0fdcc403173d955490f024ecb4031804ce43229d205a091e07803f9d73cbf95815ab8dfb2125a9ee6e585330f4cae06aac3fe59db61ce1cd04b17877fc7f6b8523588719a036fb8be0ce480ab5e6b594cee9fe34585a72b6cfb372d97aaf5faac8124490dcd0fe0f049352f623263735b22c55d5dfe09f77b72b57e106a63a6c5f5a848bc01bb9354261f245f07de88c8c651956f4a84bf14554d1f9aaa199ea29e7dc8974a031b5673c1ff9a3e5163ebc04e0269826e931d5aa1a23cda8fd157452dc87a542d3c89f56172fabd824bb1158263e5b770e5478258a00ce336a83237fa441504bfb3add19612510be62a7416ec5b3aeb4ee492a0d19f37a9efe94e89d202904f6dc342b81a0a05d3fcecb1a6f290b83d82631a71380510f6d81b8401fef43e1fdd0e0b3e5e4f97989ea20b2e017215ea5f5301fd9001cc3d1218172bfed245f2d771377d066e5e46d53fcde2f391a50a03671df413b11be0662a7f6ab99e6e5e47481a8bf56c5ada8903c4a97ddda62c1b11d8e43da61445a8cfccf42761b4e94fdaf4d23fc2c6d95bee090db3e459deebd6a163d4689da045fae526ed3006c9ac4fbbe911aba1c973f60eb4c6a8e7400db88fc26d4a26d42726ed0f852fb8cba1a4912f86e0cef502169b6d28ce498840422abef73743f5d8a430e29ab7dfaed89514e73ece362464f1be869861fa0b2d52093bd2277761ad4f8983c1f95948028144c49d5c6e6108c3d287484d7c62aa8be5ba849252eecfbba42fcd2b7e6948631222df3c6bdac8c6c6c82a54b74cce1056be5ba2019e5b7611590744b8af097d6f1172c05e9717b0af1ac43c98602192d3a00bc6f59df7dd97c34ed88f5b296719a98cb5f0162d7c8d0b91720c254a5fb016f8a0ecf0e742dd2d708a91b0b8d6251d6413c036d3dddcd96e68507594aa19afc033f3d1034b232ac4a52b020be2ea88f3dea0a51adaaadb151d750f31a21c65d59291bdb5fd635f0bd944caf52fa815de5d716696d2e5a637e631ea042fa44ebc76e278a7e2ba58b3ac58809f5aedfa220dd17f543ab2e175c8879337ace8fc2db5ab05a0df40644ceada2db02ab3f1cb7003d590c6490ae336234493efe16390b7866378e0250522a02c22e104034ac8c00fa45ef8619273deb6f05fbe892be8785f3e9743b5d5fae35d6efc1a7fb441ac84e5cb7d2f687c1488b431ccbbce2e71bf765ef2e2e9015dec6c454c968dc47cc18875bb0325aa273178d5561c3e2b62d1fcf9e8d71b5048d147bb2871266cefd99b1c88f4ff464d576486eaa64d09dfdbf89ca2bf05daebda65b82d7df243194faf47a07ff84823fdcf00da9b60c37656f6f468944f3a9445d32557f5a2bbd629e06449d46e48c46263f3ad554119fbc32cf733802118b17d00cfbd17147c8aed37fd0ce0197e1f85ca949dbdc3752db0ccab07cc6829d3de23313ead069f61076264698ed029cf70e6d259111bc45f0df7b73474f81c08fa7ba86a20c230261a2247f9ca16b99b7359e9e409f1034487eb07723a9b21dc9ba82b267aa2270b1d1299d4f6cc8e7c0383181955da0983ec5930c4e0523fbb5492e4e01090a1789adec3b4a3808f436d9befe12f9bc4d65632c429ebec0b958b2ea24cf1ba830baf5fc6137ec67376e118ee1e8a2c4016ffca164d25bc283359ec92d7890448e97175ee62cf94036515835656648cc62ad6a601f2e09dd987ef4ad8e2feea0460e1133e2a4175e2ed5bef2a0a07263a262bfa0e93cace2b217c77fb5e13978495fe4d1451364432b08e9428eeafa82963fa91d5a395120c60772c40566824af48126d2c1d6a3c6385a5c84fc41e2b26f365e69e4064f5b94dd9b4b45100b39a2c2b10397e08ac4f6e4c2a6999ac527b928268b71bf95dee59e9d4946959196e7b602a3830b5706e69440e2faac8a2051fda2f240d5f0f52174c2b9972d71e967bcb66c61394c731d1372de66478aa79adcf012ed60592f47a7ba2784e467cafd95c955bb7cefe588ad90815f17a8dfd999053867eba147afa22d997543a648ae0f0410ef84537f8143c303775cae6c5e9f54ff335674c5a31c45c3a8eb9b7d6fb85a2aa5978324a3c1ae5241b4a31979c35e219a1dcb710d14569743ced675ec79793970190eb17d14d7bb1e81d4d06e34c23eef27b8753993e5f323e0dad29b1b6faaf60152d421df1c8b4789dfe19cf0671d61b852d0e489940c8c2ff38b71cc894626e2f8eb563b0c0bdc123e7cf7d729607ea2c5a00343e0a884f11022e33356e274a5fac770b6ea0c68f15f1bd73c80853cf54fbcbce301d1b117c54613cdb0a3fb06ccfb31016fea531e4eee7deb208d0c603eee193664e61eda331bc54b3bb795ccb88d7bd8f6ba4edb357ed54fa42da3dc8ee348fdbc05b38accece98fea9dc3e3eb0cef287a8834a855ec5899ab89c11c684c1c1794f4adbe5d21375ed0f6d44ee461d72c4eea77db8d35244ea7bafd37c21b446f8ce367dd8395c09a72051da04a22e4224ed2bd513b01f1d8046e6f99657eca0c56a89463a312a764a3dea7ce2814b3ef71ca11893702c5d180342aa47afe35f4a8f0a1dd26c2da8f1966d3a13d6e23ec533a9e7de8e0dd5c9b96025628c01a8c7410d6ebf2b2324d094e3ecb308dcfb819e11e50844a820e2fd42aa852be4b0e8a5aa748379c447d2d74a0fceeee52c500520030adc45aa56579de2de62a0453fae54202d3beecd57f0e353275a1cc5baf2aa0d873c4178da95320c458e108445888126665417a283e8ce1ac7175ec5f579f68c75fe80e1955c75ede3b407ccb3a79ea927b5b9b3b4783273223ca13f32677748e8f80e73460e8db62ef167e44afdd040f944f74824016e99be076ce478aafc16fff4b848b0d25713f152e9f78ea8528fc62ba277205ec18e3264939274a22db003007593bbd6ae39da71fcafab02b53ced90e2b0e6889f1556efa2ed974c45f4c7a4d7e3dd712c92ce757e71f08f3c88d8990b0e62f3b13963002948d3e9a3039ed76a8e223f9cea283cfa139b86e9ed0c59b594ff68a7a131f39cc1b50aee5a823b6c2d7645e8b07e734dd080a5ce2898bc300fd1848e82df53a575f70f4f8d21e7dce35a1bc40727d7c31aabb476e5a390cff49f85901597fe7e68fd03d59297defa58c149f27560c4a13c77ae43e619ab397aa23c7d14749a7fd54d5b6aa5f70da8b8902da9580b931f4589d40536653de6cd7826c855ae13602eadc4a81b5dd5672760c53f85d295cf97fe3c82108b39f220b33b86b240485ee3774bf78f2bb9f050f74f46a610f44ecad7c25b92436485729a6ea28dec6bf06b28fa383e193e6d9e984586117adb63fafec9182420cb8af2c8d7634824fb5e26e332ce9f5614fb3e22d2677a354eb1f596ca5e8c4801e40c8c281d2890ebbd6ecd6ea7ee82229c8451c4ddb48a30729f721e7688234734b310b3edcf2bc26cef22308506d3afbab51fda1fd07c389760ad5d52537f063c091c5f6d4026e2019b023aa165247014aed73b40c337d577f8df0c3b8c3204e249fa1d236d47029e2522c2f98f2085658d69cdea14879592c6ff2a99d30774c9b5cf6923d45aaca98fb4fa4148025d7b64b5fa1b52993e91af0539409a5b750482dafb463dd4e7fdef5cd491ca7d5a45528640b9acbd44765a5259eb3f9a2edbd265dedaabd6646dca41c4913341a28cbd9d0727e5299698a6ec205e5c935339c8d4fe09713af431a31d9ccfe6e26519cc0a54842053c5248278071d06de43a81ab05d03d89e2de8a31053b94a872838e2e78314d9305dd0efdbb43a2812140a23197f81478ce4f2c4254178afe446dbb1aee00a3296f8e358c7daf811e4580e1147fe61d3ed5772e460e09b1c455e721aaa040e64ce39ba547edd8d9254c72787c0eceeef68890f5f79aea5b24032abe8dd8cd4b2568e802ba0b319fae0e3749c45acc8ecff2ef5a2fa2a42c1bd2eb8d4b786c8bc03fca1d4b1539bac25f76aca40d50ca15e270d1f602acabc6a6628e1fc71ab809ab8c12f38eb072a3b4b2a1eced64f9919b5c14ccecc63d027c21dc672792d295add9f29ddc6433dc4bb848e38e213cb357d6e48e17d2324c8bb930d69b0e52f4f3806837866714986c20f5f9cfe3e2ee3616ba0e7b76a7102b61c8ad02cdcffd7ffe5df07cd639e42ec7d402dd182b5a7ce69a023a77897ac6bd1ec16c6d7677a9ceff35c1b4cb3db812cc60cfd058fa0ed1e962b45c3d701bd89676ec5ea33d3b00ebb3cbf65b03daabbedae3acd8a6bf30da929db912163a5e5f51e861296ee4712decd53a53b4b41abe60a50b7f785b005859a2f9a8096176870f3e52d054718fa291ff93238481c78c6cabb9dad3b478711798fdc90b443b92cce2241276bd063680286ebd5df720caf8801c396d6ec3efc571039097b490a2edb380ab31267fd076c0ca69c6a8f1f346bd7027ea716fdff5eb600925aa823055a63a0c6fe2e856f9323612f833db81890ae710d7e7a1e94b02d62026d1098bb1b592bec5c4b78d12777b3906461b5712fb6ca277a1cad424af57d4b1be4bc16338c18770183a59dec195e5f2b99574b341a87475507eb4b6c94c1645b41bbac255c96370f7eda5cac592f887fbd2ece78997d86ffaa5fb5bd45d6d348e4c07b0ccc536e183a018392cfcf7142a1f952fbc13b5b8c389b28244136f38593d02c22e370c6e2c17fd2274d8ac00dccf969f655fbc6c30a9d0dad222226d96b0a7d2a34aa5287d7dc6934e865eb0557636179c495b5538e0008ea851ad1f2c169086abc9dc02d1af00d4c9fd9070e132afb95f528d41b277f2a66ff48151eb48198ee7e65a655088224b9bab397a07ae83d34562e02a75c619df9d0a8dcc8a6168ffc8846b80846eeb6d1c315a88bb184f6b643126a3a1ec56fd9945450adc9e54bba5d35b0523c6dfbd65d5c11d7c3a99fab899bd4e06ea871b779d210bcf6ececf7cbadb219359406e15a556f02b04c9d81e1fd445018e38164faf3dd1fd696f77634bb6d8cca101297e904e4829f9a5ea88284a7e01568fb22478e8811a9c273d604fe21a71f8004605d2846abce83c85d802d9bace1f6011a45a0d9cd44a0058a53cf19f9dc92422b78c648165290afac5bf528ba68197e106232d2e2242668048684e2802cc7b663a2719bb636c24e0628d1476f4d2339dba88a040c0508f50d0564d501c309f5c8b6c017d37387b543fefe55304b8bb25595218aa20b3510ec3c20fe99289dcb6e10508c231ae0fb8cb63eb203c0b1c2809e49112b8b35616b4e9a0da9d520699b496bf32827b9bdaba212fb0c4416bb450e16c8b11a50af2d0223e31b45cf9524a808bf7a844a7684449c01111b94add52a84197d0be4b1aa99f9c57e876b40beb0502e2417471d15c1b23b0f0a29c0c19b31a431463174ebfbf8f49dafac90363c5b897390853b24a6d041c2ad4a15b50bb097650500ec6958474a0530313f410d615f055a13b2ba28f2ef11ab80512569064cb2e8f7da86429e8aa625ff502ace18d667606075596dc5c49cdfeb6a2b896d1b6dd0073bcf93f46c262ae89350ef36586c46709b3df553aab51f709059d96f624467d4ada33704243e6400e83f6c6477a3549e7f420e5c7ba5e5cacde0b277a11ea409dea892e227721dc509619cc10efbc99ac0bf11d7ff54530e73c5b62c55199a13184b75e65b85ab56069fc5027250fec4aaa0cffc348c0ce52670ebf020598b5a883238ced0aeacc631096e377889568099a167abdf9b5fc29e9f430a0abb9e9ac69c86f5d8d7268e29b624329913514d9de5ea44546c1143778397629a4a873ed842b557596c30a09a1610a2ac3d4e6b7791a859c7fb2fd629ef1b3cc7b34e266d36efcc2873da6901688c7c434bb4da140fe3441cb966770c7e95fb30efbf21ab98b5f2ed4eb8f0109638b83b14f76ff8211e658a0cd4fb6051ffb8112514dbfb3a7c622c818e9cba7df106223091ee75a19e973bd6091422b5567e8bebcf0223e0f8f23d9625db038b7691bbf5d97c0fd3a8320bfd35e9c256dfdfade51d4f8098828d1ff80c4cc061dd833e27ed0456a2d752b058c81c4efc740cf22f905e92c11f34ccbd773675c53edb7d308bcddd2668e02025e2a653723b7e088e1ae1d20898b821a711a8c35ca80e1602ae02625b1678c349f6f7d38fbcdfc5d66e3239833ee38dbb79b5e4d66a9f9970f18599b764a4a24aa4f4d7688b55620796a035df01d4a7e4ac929df16537b34dae563f74c00457b6b579011b7e25d1c3df265b1f64fa65b605067ce36f819e833847bdd9ca4bad3811aca4943e741440d4d0dcaf32c9df41b399f4032c0d6718259878b7d5be26cab655a3e74f65136592212ec430988a0cc1cc26267d4fd7be3f632b6d17d4df05495c4a6413e562b318cd9c7eb3a6d13d255160d84f22e9dc6f93a63d3b4a04fa047def6fccda8767fbcea091c3519c9dfd9a12c0c56736320838a287f7e130f5e9b6e1004338d9cc5986ad8e1ba0fec9c7517dd549e11de4913a881303dd63d4ba0afc8910993c823704d02e158260292a8b791c2f320b62491bdfe6e1096459b9a2b1591c6b5080b1dad6654b3f55758e644dbafc4dd60a0452a0e659c6a81270d8b47def3d8012ba315350f80abaf8628095e9b27c515930aa5642d86d4aa3a7258cecdefb252ccc961ebbee818dfab584796b7e1870485db46efaa9590d1215dd0a33a3c2c9be3109b8fe2aa059c97209d80a40a4abc6dd4a0f29c44e65480530a4173bca56debd9481f650fc1c6e4d5f0ec07024a26f81f2caab0c0c514af8a9a4961afda3e6f2567084825b470f13b470c321e771fedb03442eaf0ec603b70bda2b0cebef066996af2177fb63f1321497456fbf587dff63cff0bdd29c90adf62ae26d034b182647e5622a2bd6b5ae6b4a18773b53f8656f841624e933e4016a84ff929ded53e81d8e1934015489a594945a0a3cc628e4b67edc00b460f4b8724b09f13326c90c46819d2d0c85151a00958599f7a335efaece71d2b40b924414bfb722384b6ce051454a20b312a7c0e9b570b8d84e9ec6e41c998f20a46aaa08f6861737452d57b12a983e60f93e0e4608e36ae62705b5ee866015ec2cd531cf347170610da400d6a4cbc7ddf135babf48e8e2944debacd903edb7359699e9792e978cafdbdd2b39cef694c4cfb8a1d71b72698766c049431abea9a56723e34107cf319cb25a0caa16b79e67e48dab4b64ab0aa7adc7c5e4dd201c57e8cd059497e99b370fe137f8823bfeade7fcb4fd757db40377297551920a5734990985146016b98546779590a601e58c5dd4e54a5cbe6448ceb91f52cc02db5aa8e0f8e81e079d501272ac61c455613f5b78bf6e54f9e8fa2a4c9cc14668f550e5115910345692d2f00010c1ade8644794834b0820b2e54c38b703a0dc1c473b2322c79d9c743421ea451fb50e09869e2dcaea03fda94bc541f504aa2de54030f7d9d72ec1d61d657b576594ef7f8c4ccfe0521e465879f8936129169a0b1752cb22734e99e363c3277891f9cd4da48b407e327ac6b1fe8add0b75b39283c3fa94639cd0af0922bc6b08d9497c2cb163be599383d3118583762be67a2383daf3acc8510ea514d79a149fc64bddfa1a6d9b942756655ddf9115279af9b6dbd385c7cbd35e87feba3b5d4488bb8dd0066f3d618cb4eaa935e8ef269b0cd5532b5a19d5c114eb84952b62cf1d53f88f3b3589971a0dd81bccf244993cffd5bd8f7f443939e5c93acf0a5547a4dc1f51bc001bd1f57eac82523b4df60f69019fc7f5f93522ee05a13e3738627af5a1ac02ca06f9847e6bbbcfb6a9f2b75e445aea1e87f6f1522f0e795cd0f422f8c49bbabd5477119711645f67e845fd4bacc190d7d8deb9e9f4d19e2096cf1f4d9e421bae23ce70e89faa608864b89a94cedc49d3c4abe54608a9e42bbc304bf465c515d37102d89f55349a5f339874f56c83739343e3ab0efe89d5352828b82baa56307670db708b83fdade342709870b4c7f5acce3c87cb78a98aac33db95f91c95c3f84c58133aa2a8f8b6e1561b997ea31a7d3c2ac371789ea901708985a405f82a633df2c5984531bee12912edfd84afb4d4af28e757551cbe99d9e59e4b6cd14876b5f1234c4194a4cbf59f004af3b7d00a7b1a39aac35cbeaec923b10f77bbd660a7bb415e5c4b557dee4dfdc58abf02d48b53591bb6b0f841502132840e4dba767c3630ab653b4de5eefed060be8ca7ade5a0550cef1f345d062a3ce10445db48da223bacd9b124ed45c32b2945911805dc3c4a7aaf5403e226eed33943b58568fa36a84161db228351c25438a5cfd74a666b896b23b6395967ac8c5669accac14fbe29daa3a5f3c9c664680d2f72afdb618f34ce4a113c51023c60fb473ce95cac69519ad82f1d2c5bd55562e5b637d91ae951e76193a64ee1562c7b38c13643117d0e65a7cd60855e7ef5c36317e0202051044cce878797063fe9545b97c5550079f95b8cb4351dbd998cac03092f971755684dc337cac4194fcde2f07978507d8af956a84b64f42290cea1d8970a29f45de0ea19442343effd3c1455902619b4e5a4c16de31832e54ddb2db6d5835876ac3b50eaa02220616ae3ba4b201ac667aa9b86e3e9939c0847d387d2dad6d867350cc13641ea9a7771c21eee81444b5249099155e9d9f43f8e8ac689547a801ba6294700d7b7fb170b4d6a1efdd22131eab7880ff9e3396ad66057488ca2f820f8ef58ef7ecd799245d49d55bc162222259e4437a74e89da8c6d7190b76d66267d216e5cf4a97a4f80bd49332141a21dcc6188bab37c3c4153211c8f242cdde090013148068913c6f91dc950ed295ba85ec233000070c0f01fb992cdc44b4979d4c9f3266f700c5939d76247ddc6738d2ddc890afcbeb228f9484270e515ef5520104fca3909d9ba6b3fc114d9fa496d313c4b0e1126d5fe0c87813d4997e9346c1a7f098a5335deccd9903e0f0e1ea5535675a071a42b637ee05ba801470a70069c2143f9e5a84e5d3591da36cf719be3373260b7a27a01f281f1df34a2444fe31af0967cd5d8890260a032b3b771170e27a14c26edb0746e3e99eba75bf4fe8cbdf96132d50ed7af4126cab62290282626e554d4c1260c17c24cce70b781c2a847c828f529ce1d454fce431c81c6809861348794ac9c83779d0b4d812cb94860deaf534c104f70c99a9313468c165db2766045d8a9d18c932d009846b41696c2bc8e2398bc013836c26049f9336e8c42a522e2f554c39be13d61060e58562c1550995270764a85e1c47dabbc5f716836cc71beea29ca285f45e68ca3bf20b350a13a24d829eac5b0dcb339349380979d8a2f4eb30141bc5024e40bd388d6fe018f4e7b30709dc64011d1ff21e8a5fdf95399ebe58032d1636e6c504276a48a83cc1f2814bd294ed140ae746e20b12774564840e8bfde1b07544651574bbf136e4dab5f0eb5e5c73f9164f5090bfa268b4dda8cff6b3c34bbb18037ce4f641dfc21515b4e1044a00863ad0bf5a643eef4736abdcb9e829adc4a204b425c50a4797037d25f5c0e8736091735fe47bb1b3bf0c79a543ef5af1959ee84410c12eab23e0b94a91b5b0c1b4ae2a478a5b1c1ee2cb4115f9309c9d8d1403147d1dcbc0f5b2feab2963601538032b1622aa658bb5607e678ca3a6c936bd8165694a7d83da690587549b6a6b81386ca71c0173256272968dccf5cf982ccd810e754d38d85f51cdfc11834b109f908df06be38b90c4093a60217bbe12eb55a1cfcac955763f7e77dcef0ac511a3976e48511b14231e9cfa4d62ec72bb0f7636d40374ad7007a8eb606281bbd1c82b23feaca2dd1c57d9ea6865efd52ac363b84f0dccb35bd612990f26bc37a64fa805130435a7a91a16d4ad14b170817e3aa300c85636d1909a870f3428189db4047b970baa39a16b43fb4e846682994c340fde7010cc051e7266da085efda34c7774f7f8964ecaeb6c23b4278a51d93a03f75aa84690f8266268169ca6cbd65a57d72f231178440f6ff10b00339a451065dbb28e1b8dbc0731976ec6e2a10b785086b62fa2e8ff4b357492afcbdb98659bf99c4f8ea77ce92abdf85a4e45e9117587106180de1de8db3bb55a9e60c33a96bd3c662aff88ceb3909d578582e5b749117025b9242fd1862b26f820674b28535f6a7892cca4eea9c502f5c39403d06829560361f361f7a96cf82740547197804e11586491957bc306dd2974071e4502caa2a0ccd5aa052f66f75eca3ea3e73cee30cac0950bf6964f8afb6a1a2ce6307cb70ffc3863bd62c248d05b446e011d9ede3486c01170310623f1963ff64eb54e23a232a66194d0d9f05fcb59a5018f160626448098f172aa0bc2649f3806775b226277610bb086a42565f301af9648a7932c73e09a33e8171d313a9a910cd1667e30024644694e58d7b7c72b9da0eac4d2c83fb623aaf3d958f66964139230890676467ede37d02c3d6a0c4b7b6f70d89be1c71be07d2eeb5b4ddc297a16519f14940761035833be5b79184966a8c24be63e67820e373a153584d9787e7a685ea5495806339bb8dce643bfb17d124a2054dc8ba5deb52a5ba38f36711a1aa1f7f9698c5a1885e87a77eb70d0f4ea3461bc5990f50005e3ad04b116fa545efab4e4765e1e96626b202ae9b58a55f26159c288859e237a93ce8a05982bbad8f409fe1c1f4254053e8ceb24b06dd3858273c51281a6d92d87b2b63bc085065c772ac9c9b51f2bbd4b11aaedab613975101e5f9e900b199b3877879aed5d4141c27a7c4a1d0cdec54cf3117ae209cf30b9890f3578031059ee91937489bd0241b828f438134257b11ccd46b391d2b4873cd6244327446fae0e1a423c01c1d7006ac25f0526c6084f883e67bc39d9987b950d35c1dc9105447a19dde9f3c3192517d1574e263da273d2ed0f717afdc9ac60e537e71dfb0fb632f670de2d138785b036ff85c7a6fe8f11ac4717d8ac265bcd4793e18e7d05555e63def3a876a9f939b009746f5a47aa22c10962f347e642bb441278f012a27944337dfbec02cf654839b63423073fc379ac2a959e66db2b27b566792589cbfdf5f294a651aaa26cc28b4c2849240d9a6e1107b76cac41362e617512947cc0b03dc30664314d5ac82cfbfef2883c2e588b097c020f78d2a75bf99abb5e9b9d158b823c0241b433122b6cdba88d99a5d4c9e1c7b441a1be1c9fcf53ea5ee83cbbe6d1e90e92a06e00f515b50ac2d5730d618171a70977b2ba811c919e4c8bf59800fe2d1ead7fcf02b2311b7d8154326d1f0f40e1fdb32fa406d112893d4e2317ab4d440626cbfe1a0c96dcb28dda150618f2985757c43c95c236c87113ba557bbf8aa362867120cd86a33d7779d334c555a76ac27e69d05a12b3018fd4e0116c9c7490a1d0e3fa821723d056c6f858bb1cd14ef0374713f53b6aeb36ea69941bc9d21d723d4de0d2d45b1b698ddf1a0a558f44b7c5403f9ed4a2ea8b626adff9478762c0d20df3c6e557bb949d77b521d7fb4e8270f2906b30382f118eec7c71c3da15466696b0b66bfb59724964a737ca2da02fb603685c78a64c9980be2ef90da3d365de27ef87568da13b50e7fc0080403e0392d304be2bdf6ad93deff240246a5be8b62484ae732844030f916a7e9d7ecaecaad6d506371dcff3171e544bbf8861cdcea29108d95ece219eab4c1b3158814a15cdfeb21b27fc02bc8df61e63b9d6e0850aefa3ef58a45881847955a65be5de88d1f66830f7431d5827245072f43424cc65829fca191a7babbb6a706fb5ef722623dcbe357e75c73fcf97e4d76313b474e267c56a656e82fdd12317f9f4cb526e691c5eaf397e3218d1477dad083acf82d235771b327645ea1c9795c23a72316dcfa79636960d5b0b2b17db14cc2141b720683919b46ac1add683f5ce0d7fef5f7fc70b6c1bfc0fae1c835a2a258b4a37455392bffb190da5ff8dea3d825fba29f8845e492826d0da529c100084a59d0ee5c956968309f0c861ed7b7e4dc2453d9d6fd093b71451aada46165e854ce6a7a32388a61e507fc7a4f5d44062b9043005abec68c19650ac6655a296f7ab346424ae2689036497793a15834f297b972cf977f1617427c0dab2113776c6e441734a3fac9cee3409062343dd48a8d7ce0a3feba1b30270222e54eee8de92a728f859ca8ad4b5c292b0aede5a3c6627a0d918a8a09d548af5ceec00334f31c0776d0f3b59e82d19ee70b57c695930a853141b63e7ae1b0369959e74144d08577dc8ba9807c975781b53452da99452b9cc3cf819b7b41122a2b978288b0447568948da749a6f268cdbc569eeaaa60b75cd39cd2978b94760b1c8e626a6df8ee3e9aa7930d9a294a58dbfcb84f159e99835868c7e1c3fdbd7a022c43f8032029371a340dddb203f56ce196547be3b352d8c54fd07261723832b0a215f54aad9601d145e553202596232692c07f9033fc5a89b0fcbef4122b5831c5a9abbef8185c6828ea72fce645ffb0a1ad5abbeec7722d3693a5e773b9940ba41c1aef4651abb3cc9fe08182f4b422649f6300f8839e1eff37707f24de4bab5cbb8e66f9d6d9b7499999eb49075611a95f19e9069a517f89b6ee02a7edc6a1febb9a8e7602b2e6d6762e0a75d67167dc697b2e516707d557219792a273632d55ba8bf8fd388a3c7c152ff6652c2f65abf3c8c610f52a2875af0285b5c4f2ac73fe54b99fcebff9777129e63b33a475f6c2e9d238a7652b0a94893bee988790765c8f37e2be61df832a244d7b630b9b29b31b72858dc13dc8e5aff54210f900abc6ee21b80f95b2d1bcbd3f89c3efe4311e951542681ab9ea270854738006602ae5bad567cf7ce53c7a3b3ab8adb90955499599362950b90aa107c4bf8544a40fcefc70850260e361179b2ac04a6378c10c54bd85005570f37e853a2055122548522c250a5acbcdc51b8f961f3f7e7fc7cf8b8fd406511c46574e363b38d0da708c6489fbfc8838627773e74c1fb11b268a318ad724d01ed3720b082a27353487134d512720f98b4c09cc0998ff014bf7b07e7b84f27994f76b92827e1644380b88ec254bb9e462462d24c981b838fddc0a9ac944fc84436969c027e1ea3fa0652563f9f0e71281cb2e2811db33efddfbe52aacc23921550e2ea70cb4988f586b7fe6a706edfa9e5c7abab418a21c078ee19139c1497c75eee38734c65748f6f110053c22978d05d0fe86385995c01df16c34dc712c88faf757087e61d513a963fef097953a7161650f47c5f793b595627fd0fd71d7dfdd904eb8b8d75d8c999de155d03098985407635a2fe7cb4a33117ea8b3f8a75942be4e9031a2503013f0bd4a836b32e074d99323fa68884d97b6f899234b094d3870c9935cfc8f7769e40381e0748ac5d9ba1a9a4c74e611a3db352e4e7172f680f3e647589b06b32b7ace56d279ab65adc78fd4c110568cffb780df194a3c8e9535e0504053ce142399c2581c5f9323dba8bfad5d4a0917c9fe082d32ae90d86a8d3236c0ef6eea4bf64a847f4ce242fc754a0703c32df6e69822b633df22d6e6f7df0986049606c0022cec547e9c41d013fda9db424cece5e707ab7500ae12faf53b1478333b1222bec4f41af67b54d679c7259afb365232f1aa149558558269f3a0468e24dd21497af7edd279c3a8f736cf2c485d7ae9906736230714f99a397ebd12704f94dfb3e5401a3e00c1b013bccd58f18e505ff075ac03e8ed335c9d993ae672702c5193643a179a984157478146c1b26cc7e5da0c0d2188d998d6700e68b77ef5953fef87c8a0960505b6dd9f41916f4911705d6981448c2f31fc732f918ff3c15b451dde52e911589994422d44dae2dd973ab1f77e7e709d381c388af94ed872880385d5b03f8e378ac4658ac5b2a051dc6a23943e4944a335842a2728fea8036a4cfcb702398df89ff4061b686ea65678ac4339b91a7824e438026ce940ba547065b4121875fb945aa1581b56057b65882edfc0d8a4f036a0b42ef26e04afcd9cda570259ffc21e284a691ba2a5469668c0b3b13ceee15a9693bdbc6afd071feeb54522c3cdf21f188410a4c1792122f46a16442e4a489e16a4c00489a7044b0a53388912ecf0a473d818b0a1d4a06e02c89bae63ddbd080df080eb0424d39c2083a9cdca04f0700f1c726e680dd7ab5dee3bf3e603464d294415e1b724de99ca8f2b4c9a9d017cd625a04411b83e3758f1078a388709d2d5d20b65d39ca2f702e2263d28d80989cf346b41f2355929b6c42f43d2ac6719c61b7b3f02c7e9d53ac843f880e4852892c8cdbae5abad10cc3e296a68a0c338bccb48d90e26bf16ee9caeb2e822894f4c134c013b3381278cfe92eea0ad7a8025ee129f12f041203347828d1d0f6a6483e18ecba909cc8ad73bee9af4ebe0a83c39ce3ff7510f0cc001e69519d2c7d2bb44aa051915067db951fa3bad7f5d70f01c6cd99f00dbb7eff04a4d65510cde839ad5816c25a059ba6b06a6fa638edfd65912d8f6a5dc36cf6ac1cf476652ff8ee84311931850f1a67c6485ea521b6c2a6f861230589805ebecb9995426e6b27c47dcd072123eba545a5d2af2685a2f33da2d2de9f9ff7d0d15a821f8c4ff50898d047930b7aad05c1a4aac600be1eef074d8a60ca6b96c8c9b79d3dcb220b049a91d8185e611f5b76eec346f842f3ee8869924d2a1ff74f75205a44e76d3dddf921f28fdb9b5e5cd30e9cedf221002b2ef557c626c24f62b0b84683c208ebbd0201c005a0e4bee7e42457aece824431a0b241582ed9650c19b2b2adcc901b52fab53098d9a88824c8bd312a3d6c45e6170e47e314b7da5e2d96cfc04feec0d1adf8a6b5d741aa883d5a2b739957e3d67bc99d52574cbd136ec4443300076a2b00841c85c869907766555948a08ecc0e7abe1504013d91dbe4f70d55a1a0bcf10e8c9e844c5f7a4168076280d62a60985ea06e4b79bee9d702075547f9d6f02b95c800fd9d06d4508ba9f491d2cf422c34d67def09bd60f3ec128d9c9bb9b680ec278bb05ab238578db5e1fdc364ad9c085c96d7c6923026c4fa450872d8daa9fcdb38d0af9ab1358f0018ca0a974fdf6c4a21ad8ac58fd5d02eef3c79dd2f1eb8cc6fa6f7400250508b148966b1d4c10a931e4005a2500e60954d263e7021401b293cb7b3582e5b5da7982b1a92a2e02c83d6495bd50c0ccb8c3b1395724a2f809243677821316399ce091dba0d9bb06abec1dab26d66db48a3559b0cf07d92daaf8084b062e791e7310b71958c9867c4413e693cbdeab50f1e849088681957e8b9d5598b6c7cbc457f94b1eb32d76db872b565656b2305304a0ded9b2aae85eed8332e1a269def415cfade8a3502f3cb09b79fc5b5831471c28e865f81d0678007651988137119f416b17cd02c72a194108f646ba790db39c29dea51a264836457cba186e8e7adaa11651c08d95236a383f38b956f48ef8557055c219b7e01e55bebfdbdd3d4981d64f4f8b9a271889c660b0b5b89d8d0d4435f8e9e2b958049483859eb44e29bf31bacd2a23c11656e4c3214525059030a3aee8e131adae2d8d481c61a72c1b7dfbdf9a0144ee2bee1491287becde87d970b0876a441796f7d89557a445c7ab948f205a0e79a4d1c228bd3b008ee35e00f3502750189206d9d66483e1b7c20ca53874a443a974c805ec01feb142b158dd99a2202397d90599f0078b3d51b939c7bd4ce04ffb91c6fcc11a7bfcabd587a07e619d0d73ac4735de1e9f556697a5dc85e9d28d849caa6a4e8d3628c9dbfd26c9124788db81961dca901e17e5f442c9b49af4d308d810418e53ff8f68dd29a89d82acd3cb076104ebffcf26440b07fe5e724ec403f7ce52559e3a2b37ec8e8344401b533faa9c63d3353301bbf992aee85093a32199e6af2914da176cbddf0b3c04a43e03168826c04b927e6fba8e39bfa87e18f55580b4891f33910eaea1fc86ed1ec1c6f8c966f66853d8698feae24c27844603295914bf1109018b12b44bcf8615fe4f2e6478870b0abcb4b98b2c7040fc3ff77f054be778d88dace17a1882cdf532ef99d2f5bfb0ff266e4931d276227b9148337bfb00ab7522f00107bb0549dad28ce04ae0c7fe37ff3257c3e751f447d9e377e6f3806c824178be50927acb0f9bc954d6aa24e90c4324e159644f1af2ca5a089f4560b0c48897c161385b557e969fda1689995a60912012296746fb720433bbe2e20d34177b659391732c4207f26f8ce774e5792cce3a87b73256cf60701232fbd74700fbf54c05d11ea7599fd1d1fac69dfe9549f472b72c672a124e5702f8e21e10bae5abd2b16228fbebfd69ce64ebfbc6cfdd97332a44294d98d507e86d06e56ddb65a7c427d3eb17ca39a134f8e4976a8ec8a616faba5ec1aab53448daf1861178a4d26fe0632ac8868d771b0cd1b6875e6a8399eb4bf743f5b3b906e4c40728b98f94c765460dcb0b672821a4b4eb069fce35fb12c868f214ac16d902bb497e0a0eab29fac4a8314e46e762b67c66c7cd7bff35d850d26a9f409614eb708538acccd249c9ec7cc914e67293b0167968351b8aa7454f1fe1390821044d091932487406bd4b82b6a3c8a3500d983458b72b31b3ce4131f512422155b9fdab94fd4a49a1232d6afafb1099d4cf8e39325ae24ae1fc0b26748270ba2508437422b66ad69f0591e7fda782ccf4c06b4ade1dcd6b73e9f54c8c2c5295c06d1be7c92b1ab641d10322ff0eda601bf82c6c03426c832512614f9a5758c11c665af0658085775635f54791c804a1c8aa1e8f7c5d6f2dae56b653cdd0e32e46b90b9fa8957985ae61c357d23016b9fc78cb7bf3b68fe16dd4c4784b04609bb7bcde4e01d70965ad7cb0fd7004243c110fcd3b3fa80029ff4e17a46bfc510fea9cfbf4bf9d970ee7eda01dc97202965e7b0a68445ab6c15f0e7c5275da4c4947032d343103437fcd1ceb2f363b221b0a98c9df896226975f57bc7c48a4750552816bf5d6de038533ebe78038b497de6abbaaa99c32dea0b1ed7ed1f124f497ec61b42701c1dfdb01a3b037cc16b605ac85c0c73de839a89a46daa31f26887c83d4551c96f8d79f79b5d620671762104f9a4e250499cb3bab90d60051ee662898145a6777dc731196cf4703d2e4a0b8bb659057f655b74739cf54dd7146cf01a04efac497fb80171cb5d3e571b8a730167cf11fd93412264afb624339814a62c36752893b579f6d1f93b5af0d2d1ca6f0e91ac1ec8c4b2ccfd55941dae505ded3755602b93ce221071dec0087bfc2392590853c4bf925f749405c4c2c79d43b89bbe042888d346575e880e5e8182b341c1b2e9c0d281b6407a38d3c950774eb3285e0f838031ee4142e1118a62c4f24365362d102fd497d44af83057bd4bb996fd00cfe7f6a12f2eedc30e77f9552ac734b6027f680f7656e72cadee04b3cc9049e0415a0c51e2c143e18bb382d7c3ac2dc14b08857bc38861d56da6dc013a02916c658b97bb992d7a7721ae73183efb6a59cc9edd898db4458494a977fa31c1e790332200825415b81ccd7a831f95e761424e7031efcb405f12f1eaaa2e93917be7cb6511a6488c8511fe36d34f46e4dad5e7e779e15eaf27365c6419a2caec98d830a097878639d46939a3561cd2743aa7154df9bb0f886c98c21314fbec024a4607e8e977ba446cf6a1f70bbb4f6a05f288cbd799fa36058258df439657adaaf753fd32929624e676e861d2e2cc3ff758ceb5e67e1dc45428f877d27fdeb70300af4b7adfb79e027ee6ca8b5665006099a816af8f9780cda6b3de93a9e0496cba8cf9a42de917b7696d598beab5748844170d4fd0d8b4c1c185a6b85882326eeca9f93f79483ab4f45b099660c565c08b18970da882ccd7b780dc74375c92b3e5e54291e06ea4bab953bce45bb3341b03ca3beacf37d66878a25d8604a3b47e7842a60bf7a38951858d5ff8a267af0046455b8ac1f8957585044efeb5e64a0481d478687fb2d7bf3002eecd7a05a8a49a20cd28a62ba1eb5c4e90c7be46a1b3ae83ab865603b3fee4717214904b31b5f721cf30e3be72e3b966112fe1db027344d0883fb80b0604b902a3a6d09bb98051d49a4b7ec07bc5878dc50e0f8569a06c323bd7e43c8aec52be0b3755153f54c266e6e775c02b0a08d6f5c976a41d267c444a9d6b5790f9c66a2da7475b5d7db138fb47ef582c812608c26ab511ec3acbe6ecb171d9c401030efa7b1ad33076036ae30d30faef30bbb2bc710fcf5a9aaffe439bb88efd4a9263a151e9eed4c3681bc0c4bae50db34a309c164c2d2c63c27376d22280cf09ed858b8a44909e0b56ccb9a29dd8f50e9abf777ac08ab6b1460fec3f5a1deef3368e8d9f5838488fecc2cd20869e94c6ba46ccce8bc51d7503f8226456866a6cd0d81fbd90eb992634409c2b79015181af9db1de8df06255cc7b05dcf04799834ee2d6a72364ce58db63866d6315be732cec04247b7cc0b1376b317cf30fca1765942b117c8e4ba35b234cd2dacfcf49fee098f79a76404add3247c57ffb0e9e5f779d09749aa979d491dd93c9e96b57d5144961eb64f37cb0ba8426a52aa55205f8202fb84e687357a1c223ffdcec1600d456169cef6bf4da7c8f94fc2daf1c6dcbc8810b5dc779b8e13f86bcd5b249133ececd659a493d23cd7148f80ee8829ae39bc9cc838089e8a9a0c5cf195766add6acb7ec957d4c1c9ea5a9844f4f84f940e52d4604cca379bc77a747d6ca10154e8d4adec5c9146a3c8f45e61959264bc4c4bb6b2f9d20076c1ce5c028c502b540c95962c76043f7c3f06af523ae618d23c122551f9336d54fb0fcb243ed1d348db44d341d09fbfdc2bb9588aa595826b0c03d08e5e442ff470ea358dd264c9b99e9b3fc557f86436dbdfbc4156e1d82a7b6ccce63932401a0e72b13801c28963d4bc720e8127512e382ba80f58b859d8896a9c4a356417c2f49775e419b875d2f340e994abaec6b6c964096e6854b330284b281ad7613828f0dd97c418a4044e2daf6ce786ca03724de60eb72017b226add33ce22aeb50b2ac62362a6e9a8b8e6fbbce0b36a441a71f2a67ff5729c12466a613c63545527bfdf37192614b18867e28d785723d60b88b102fc1046711a7431bfbc2840b2eccfa53b8e1b80ba99b4799f70d4e63b421de108f6fa13a4303bca7f16b500aaae56d686f0b108977731a023ed576044fd35bf712223b0b68f0900f9800fadcebed502fd5eb6f1848398b7b9ec874d70cace55e651c9f14e335a6669db320aef147f1b86f3b9dc104088654e8c4588baa08646864cc78aedd9068ece0a70a68930e7beee3fe0ddc5de7b09cc0c7285bf4363f832717ff9f0d6961c66b1896baa7cb5ff8a0a347c53d1ff3f4b2e06b9da02b1ccd701a30721d637448270837f46a6fc62da7fb1dfe7b4b85f996d9d97e0d4666aafd93c9d451bdecb581f7d56ef684e219215e805a2157409dd77de1d482be9862f876aa74c2038ed2e6154182cb54d6f9dbc3fdd09528fa97cabb66c1617f9d24d70fac0c32a197c0f74e239806f94deb971b926e4b978930c64e0a98a3ff91f3d1f14221fca8d3165d9c7c5a32f29d9a56bf721598d34587bbc2fec7b45e32072ae4be2940bf1ff7a3d2fb52e05f41b94971c430446cba643ad669bde5431082336b1db40d7e6abd5dfc5a36bd938f58fd5a475e5a373e088d9e4aac09f465ec1c74b0e8ac26896c95353b48679ad64c13519f544dccc846446a7bc53433b289e02f1a84fec0abddb0272b6a46f448c1cc9a2c3765281b51709685c85e07783db572f6848402b6f30e6c32639ace363b7096cd5a4c7845266c5f7754cd085a6d314a4f38c68066604e11d0f29d7c2504a7bb1d4650f8de59546c1e54c98d1859c8c9a6c9e3e48b008ad5945eb6ac91fcc26e7c83da65a704d2fa37941ead3a3bed5051a8e9b6ae088b11c3a8ce73484dc4bb3267d8070388a5c5f8b184a3eeb9f344e17c9dbdefd28c965acfa7748ce362e7384ab3b708970ed06d9c49f59ac0463d1e94ff9c161911ed6b962c24f197253619a7670c025145ee9d78b628dd53d7281ea7c532dd395a8e102da6a9089e4e69021fe75b8b516d82b89963834a5a7b0c511509bc62814961a15abe7482416667a49f5881a67298545cdce4a1976225f0e8b2de04920063cc52ff9cca84366a3759bacd1f7e813e7db67141de59e78317cde6720779e8ce45275b9605e47830b09861ff0309e25a0125f47708cb1dfc3f0dbf3d243e658509c789100384556c77b9920b7b7238d53c7cf0a8c013e667e750c41e2e38f1a2abc6e5168ed3eeffa93265c937d4a59c8e8546bd75b3e48e644b3af515e31da6962730ee9fbf1256ee4e3b1adddaf347f99e680ba7dffb5a3e5b7ae500aba1a64ad7f55f2b0bf048c7d81d62acd7473d4e779004fe263d3356eae7e79dc51b2a0838fb1e7f963611647b5a30696c3e99bf2d5d8c26b7129c950afc1598b273ab60d3b11b9de2c37b864fc2c523e3bd8de0dc55dcfa448e02a9430cae5bbf0e18242897585e17d1a8aa0164c6224eb4e69b25596ba977d6cac60f45474fa81cfd0e57339f42b562824870d7c7aacc4918c44156b1f557302260c19a57cc950ece49b61d879386d5bdf2f8fa0ad3e4ca15852b32cf7a625a111303f3fe8e45f48046c715dfba7a0b89bb50aee3189d2a9571aa803e2824766ddeac6c964087d1236e50e7ec4286b529ccc6f0f0d96d115a9f9d07bdb3541755028143cc4acb3ab9afb828f207533519dfcc83b6fdbfb8a186e7230017d5d8ea1eeab0f6e8efa0b1a5042d103ce0f7594fefc64566150ff2e73501a65e9438228953e1fa04856507a06a099facdd8fe45708017d3b274bcb0aa1dff4373eada22cc371b1dd72706192dc7f3d5b6cfaec507c1a27fcc7f28d8f9dfbd58a639039edbaa0021c22a4c72c4b1dd813e2a2c54c6d062aebbce8f4c367e033d4fe9047c9efdf4c844c4e34da65ac778fe0674b94217c667786c212f9b48ed3984c54d26cae7a746f59d72c34b36d9fb65962a25279ee5d8cd9c3693fe8e72bed649e86651049b2310d558c406ca42865ba760c0f62b3a11d4ae2f21a886abae986a9f45e3639946d3193661a53d2a8b979b2311939236051caf348de3b2e55766a1928e0bd12f57099435a35acedc6ab9d0ffc5aa6474ed38764aab07ccb1f021107092bcb4377f3c651d0a276ee02052fb427c69c5044ac7267d44abb89a76723097bce99412922340c0269fe62e435790856a0b79575bb29372b4d79b88add18bfc0646cd10895179942bd7aadfe8f9483b2a7e942d1514e2621c45308a53ab5234c5aa01a13d64391c419f7aec434484d74dd9986e9c15e64335401bb7dbdbc4ef776d7abdc922e185363e3305a0d31a1a3b37ae902fe2eba3c636c380cb3fac59364847dd4fcd74bee98bf5eb4ae132996aff612360158baccb1abb2e83a86871301456ecbf61b7fc3302a2f5664873eec3d58bd49e6befc4d7fcc67fbae985cd8ae14f08c85cadf2dd61be45ef78667038ef3bbc70c6a39ac3227e3c217c9742ff9b3308139764d730e51aa625dde34541f0dd28bae285b8c5aaabfcfaf185a96bd295e4d5e6cdabecb762916990480398c2b23c919d5339ff24200f1aad19618c2f1d392e653e5eab3c923778c3894318c0726486344d663c4632e0b63e7340fb28c84c61259c4cb161bfe39d982e5c43f400f474682d7b1ee708579a880dcb969bc0d19d7df69da2a70b5c2d27eb91aef3c90d99f9e269ebe151c57bf136fbe0f829907f58d4756de3cbc2f830f8ad280caaa8dbb10fea26a5fb12ec61f5e106840ce476ade1883c74dd5f73f2af02c6e716bb34cc3af376e324b8bc02c7897acfe95e63d7330820e0e9009bd6b2ce06d6890f8a610abe108aac60ac7f0b1338dfd90b2d6fddd8a0faaa1ec3a92434d3209fb44b8c1ae53d7d48c5c479354899afab4005ccf847a6d8529ae4fa437564e795d8fd10bd2b6323d2fcccc1190cbb78078fe8112418ad23ad00a27d37b0528bcfbabeca37234f1f9e8b3c6a3763c84f68246f452dc560ca9ff0176468bcbc2e8fe272ea544af1135cd8b7afbfe5caac572213ba704c4cece41272d4bba1be6dc9e4c5e4c76622d9f0f49031f4f696230dfaa6167b47d4036bf4a18d96103b5608808245b962c21dc5abaac80b046b894c6b2cbe5cf75f54889ccf8e01f1bd2804f49cddaca4a9cd4d37316c5d98ad215109c41e4ab3cee93de79899118a15f803193df780b6c5835e4d103e9f0a4ee9be924bb0c4b1e50de022490213d5861ff8f809a16e2cca36af5c50026646b2bf7ec096d7a6bbf519f88440ab4093549e91f518d53f5c18255fcb6590b2de8c12712a35316eb07da6bc25e333fc5ad4bec53efd48a477e08348c5e54f2916f7b5545662333f0105e291aa4ed02d892568728164e88322ea1fbc7fd2b5217288282a352cc2c53928e905492a850999962b170e85950d0f87e309e4b7ad846c702b205c876861e783431f3742e6b8b94c3961b3c323ec8f84b328a1f36451c5356eb1ed5be4a85518b3740c59441b0029af3cfa94e5eaac75efc1a76501afa101eb117ca5dd35846f59330c6e05a2ebb3224e9ec2b8f66f103511f09dee8b7e4e84fa41b43a51f4bc515972ec2cb6dc2f75cbee41272026828c218a3705d5e5c812bf3d1e152ad3a496fad171a01e106fd7d29f4df4312f8a83dfaf02d148c1d4ba0819f014b2bfe4424904851dcdcea08a5bfb2e6f1bcf8d330cc02f634b6e8e7d8a1392ebc75854fe7503c3980a2537ec69f7380c779c32905f41ed1ecbba44f8c242554abf537d841251ed58f525e29703a4331d1212cbd584cb0682f2e5e1fe4aa623224c6363dcb5692cda9e787a10e50adcc7bbed52fb21c0c81db90bbbe6e36e1880d2ce303baa2ba7f5430da15a50d41ca90d9550faef4f21ecc2c7295819661c5b6b6105f3a07889ba844ddb1222f1d04f21076bf6c959e15dc170872c91da4a9af56eabbdb086b5572c2d1239c1ccd2cd9177ddb4d2297567677ef4c32ee07bd0733085da9585d3b1fa7f3e99cb75adddad9f451de55a5d8936ed3d65a6b1d5a876e2daa5eece76710db94563af5a707c53f24ff9882ecb3f88812bc33359c01c8b96a3ae13a7f3bffdebd07dd7b6eea69923ee79caaabd6f7a874574d320ef169e2d3e4a13c14a84cf93905a7afda61ace4c309a15c52905d291b8cf3e73bce7294babd6fef43bf0f990f17a4fcce3b6aa17bcfd1d94e580ca382c4837db46464bac478076b30a567eeddb50cf7aadf9ec387ef3ddab00c6ae4b2534e79c4982735d10902811c647580cdb010209331ae172ec6c5331cd7cb5bfe83d1b01219176776e606c099f3c072809cb90fe6009233c7613338387397a661273eea1900b8009caa244b9662c48891da04a32836e204555daf55f43622454a93c2b08a37ca6f160857799a8400c45f0200aad6039fd99b1f6eb84db7238da6f93499e2a1160fe10dab296930d0a91248595c703f00c1e4d5e8a8e1a18725fd6c76e8114035a4f5340304e056358488ef1080d57c1a06fa12be8335032e51979c401e82889f075b094789250c42082773ce27a383cc4fa36947a66771db5390d58ec8e6e4e1485ad13aa284c57441b6347b738d0822a5de7befc86504a97bef2d42270aa8deebf7fa8bbb5074a5857986c8fe1a5b56f994be2484302a31522aabbb2219636c5d50152dc2653e4f8a3cf31923caf353191b3a45f9b3371413e1225d824ee5747e39294967ad943b7b4351af54d6eab34e497d522adb63ef4d2a298b3ee96f43580ee605b4cc13486396b1927c480e31fb8495b2fd372b52ca586355a3a758d260e0e85e289dc2e0f288e5b89852d575ca6e159daadea553b640228b3731d649e78f49ad6aa3cf6985091a458d5548a7545d595979e6138589af158f6a2f69348da761a0c3fe6130f0f22c91f2b21cae11acd0ded82a462e498c420a779b9e6c7023c50da7d00ad04a45ade821023df319430dcf6c5a64c585cf7cc690f24c29615483de1a80aaf558b7e78e927c8d95ea15ef0040d57a1a0f8b43161e23d4a8eed4468d15e52bb6477f0d8a0b231ca6673e516c50c36d9ada10d51b15ef1040d57a1a0c74ab620d4649979cd800591efc52dc708a436da9a0aa19a16a47e01ca0e3d03ff01a8d7e2a8b35cc91a684c574010717f7cc270a0a402e55f450d57aa8172b9602a0c68a6271e5339f273f5f2bee8246004496d2a8b1a24f6ef4e8b1a5e2a737e80b2ebb4d5b20fc2d8d062ca6464b9c22498d1aabf64497da1116031d3eb9ad0736258d02e3b24f2eea191b2189040ac8cee06155a7a43ad99b48c2c1a7e340c261faa4b5faf466c3f99b0d596b75b9d2dec459d58a9fe812f48946e9d4a552ead335d61a632f14f568d32a7bafd88e1afd346e546c8788a5ba9acfaff89822ca725095a2aa8bbaf4186904d2fee6ba90a721278540d4142510214fc2b13eddfaf4592f89b2971404b25ed99511cb21472c86468cd16facd535bdca39417e5114444d34f21c55aaa22eb8cc270c237f352f3c74e686a75d3cad15bf6cd2e7742aabe9743ad76a5d22786ac529ebdbb1d11250e29286d370666f68380deba74b2d4e83866306dc36d284e0c3c5153dc3fcac69b89d5fc1e297060d1a554b8bbf8a246a79ce396f69711ad525454ec35f45922d4e8a2d4e822d4e12b53cf7444ea3e267273de3dc412edcf6ca7668d00dad388b3712321c0a0da6c58f4a3e4674a98d2071d233226f91370de76f8b53e3695897085adca6b554cca44b228b9bb0139695aac9e8285543e99fbea29564d1a5eeee694f949cf0226dc8cf4fa97b06b7bdbd7d580e26ecd35ad836c10592673e5b54f1393cf3d982e78de0a14934e72a4857232cd8c5bd9819df427a8679be3d088fbadb6bbe5901574a0b08e81909f7ec241f8ce4d9625cbc4c746e972ea53fe96dad9447620544b53f1e9eeee96d3a84b0ab23a007813818f8be010402cf2c060857f9eec161bc1af6d080103206196c61cf8b970ec4f1f034f141224e8d8fd6258297ce1b3f7d221aad616bedb927a36b734e737af1d0a9ecd61cc9c1e61c73f86484d039e8da8d73da1ab49a6bf54e9f96a6d1ce78e71a7ca12e11bcb36215d8baaf16e16b2de594f2453d03eae6ac756b5246f81aeb56b5e598738c2980ba44f0a3f5e4e78432bf0749d03d0827274d534676d0716b7975e0fc31737d45edc9ca5f44ae22c286e974537cd023094a0823fbd5a469b27352422821a45c5d154425a269a8bf201aa6014181719947bf581339051eee8768c165cf2ca3d801cd038a977e736ae432a7b8b8fd337d73ba52c2510a63be3bd130ad4bc6fd028865e4320a63250d2b67085de762b43ca03b87644c28d3f0a266b13fa04b7f729a95ba2ef06853a68dba8aba76a270fe18a398a0ece5a63529bed41cc575e99293edb27466099ff451975ca210895cbad422945cd1213e64de59158b69d6594c73bac4bd44d4c525e67e73ed894179983393babd6e264d19a16b4084b8d69ea357a03405445c25ddba58d43317130d3a83cee07b39f0771ef31128ad2848c211a853aed2026c47b548409dedb0e91e3598e6b33660d40ed06e914b9dc6cab64774e8b412f25c8969077551cf3c0a300b0475c844a42e993d8107029c75fdf0d3fea8ae1faa93f2c9c832c6e663fef879a5f41a2be797a493892a9aeccd4dc165cf76b4b35bf7524697feec8d7496113ae7573b7b9c4893e4a4935ac6179fb338b652da2c0f16060ff6041e0878e9cefa98a4ed21f3535a552865e232da35c60a3e1ecac3454920e0c1397409301084e0c6432b87ba93ce82fbfc07faaa745a5dd375a6a74ea71856d0408b1e981856d0800a4fa71fd3cfc9e10fe92cdd05652f947575763367ec2662ad4a2f3ee48542cd55f76aaca6b3954e61d042215bea12745a25b53d62755d5620a7f559feb2056ae9339f2e9a3cc86d9ace96676f6295538d3e4038f21da555721a8257747be64916caaef8f41596156ba97a7b4656699d4690add8832aa8ed8b1e63b49405f974108420078140ce2e4154ca5f39e050c688897a44edbc083c8a8c91e4658c54e7246364365aeb034a1ba3cb2a3a644ccaf8cef8c95f73b637f29a3cd28a34413a4d4ebab64e4827caa5532e5dd2294eb2a244e8d2f3e9b2870d9b7616c706e514e5a2a626ebda79dac465a291a3d31ab118e6ac8abf6ef0d445bdd0a95724c9a2945775eaac22d93a27c864942e9d79378d53464855e198e560aa84e61cb31c6e0a03b5c5bd5f2079e6e385cfb7d33cf3f1a2480d2ecbbcd4e0d0c172b4275314701d8b0d6e73d7626306bfb5e65c6baf0989b03527c1f69e7befb9ea3914237f81be79d86016c7c6c7f65c7b43dc3a73edd9ea003b460de6b2981e8990701bbbeb196a8451206b290a44515134fa15ea91814c29a5ac5eab4f956c62da1e78e0e24a6ee92bbad34481aca5281045c91a2deb1290ea73ce7904e592e95445672b239d738228dbb07893e2c11471403df379c203901552b0b4d8686f4015bfe502042d0f7e90d3952aed4d65b9a25088c5d6968a77509ac53dc033286041e429d795ea8706532d1e588afb030f24dc153ba916a72c2db146074b9d1525c26dcf981003281f7db2d420065af8e994469d15c5e2ca8a1d8bb3d582a5069349ea1ac147eb872eb1581eb3eaa125246574a851a7cf19023988b2d7a7dfd0a5a8d165f666e298a36779f6c774ea227bfb43515629a5b75af98bf5cb5756ea4467c8eec062d8deecc062a07bf193d3967ae58d9cd568b637515ad52e49b7724ab7e91274fe5ab18886aa7ce2e4d9532bcc1a2505cb0f15e81d2c160f0de687235ce8363bb8a8067549279ebf18b36829cbd84fedca08a2bedfddb7a5e56bd01f04d25ecaf7a6c9923a8c2ed6e6c3824edfc4ce3f599c1acf16a5fe1c8be166db4db6d6d85be4d65a059db6d62c192a042f90d1ce5e7af4add6c8e8305af2fdcd8abf2a11dabce6893684bfaa73ce0b3cef5ce4bc60d416f772cdbc1963cc720cb8ac59c5beb92e7d41f98a7bdd118ef6f962c9777f6b80b26fdd37f59b31b62e8aeef6e28b2a681807ce9b539064ccd9c8f3b3cf1848de8767356b0c9e67cf9e7237e6257403979df93c9932639cd6a78d31fa9cd07546a4684137b5e694d668c6acae203fbdce4aa7beb4a2b3180a77837eb7c784c26d9f3bcfcd0d99a5eb8c9e59ca89522999bb99bb9293db343a3114ecd005478c30aa0006487a0ae70d8323efbc1d4fbb665e7370dd154a7a2632fb382b925b6b70dd133dc324234eb4292825f2ce57b0b80ca1c59a4ad566548d874a6b9ef6e92554a075d5170292788628c288203d03ada6d22527ad36a34b8e04ad36a44bce8bf094d1944b0614d9ddd34b846048baf079063cf3e9c2057f64aa74348cf326a34b4ae990b4240de3dc6794c53b6f57bc731252c8c3afa6d254b87b1ac639928671ce446649c99d8caa75c95c6a5d25d9d3aceb2e9998709b5f4cc5795391d6e4a6f40c49f2f49068f191693de11f26a367a4949e894e384a9387d66b4c4067c415267441e4999297979e89ffcfe5d975136125f63b74b10216ffb513ad270ae36a867bb9672afd13c53171a393e226372d61e2cafef991d2cc68283dc3a2903185ca4cb3984a97784a2fc1c2bdfa07f2c54e3469273df3642eb9dc2a1c3253eac3529792702fc7fc858ff40c1fe9d25c72f96b196ea939d6d84cf3d63d5ba06d3ee15a8723277bba7ccbab2d52f5eaa2f315a4cdf79a9c2415df738eba8abd6d15dfe6a67373d2ea39cfefd7e7f7dfabb3ba28add38c6ed36484cde53dd7ed5c6b23d0e6ec04a4332993724e2bfaacbabb75f4a6b0b29d52b88cfde8eec747de4181bee90429a58c702681b2045c4725645109d840f8758ae89223e28b6b39113a38b8d7cb555f70e8a063879e618fc68110a267d8bfa6b9a23550f64263a5d6d6c71e637ca4c94a2b6625475889b5acc492e22ab1f8a761decfeb23f475bf7ed42badd8f39176e44863662a448ed81e422dda4628657ae45eac8452a98fd6c952d65a97ac54cc88d4c8de502acdd3da3de9d2f3283c250a19fd9ca9b01c54471bb5511b71a3ed2346e9888e78765c29aed35b711696076da9ce723453798d837ffe9a19cf613b65b137b057a0bbf7822c2be9ea08fe28cfa38c7474e93d9f8a5c57fd91fa79106bf560df0d69354daf3e4da09da7a0ae77a29cbd99de94ba86e28abaf49c7d85090d195057e43ad77ac8771166ceb9b2207bc29dadb53939430be7d5173dfbb42e9dc73349971e74ddec103ee6eff79cb96792f79a2be8524a67965b42e708db136e233d7fefdc7115cf4af88a9d89611be6142ec8a5b7cb3ee175e710ca9469b237d0eb344d534fa7216796563b1f4393bfead2336cbad5c5476c0f3bd07ab5f3f2c9156770e53908618c3146bf4f458a52f141f8987c2e382884f039aa271f5058d333d1998f8ea6198d4644b8d7e821f4918b3ff4696a35b6d6b8ba2a6539462a9d23fce1c213cf8522cf7c9c38f11788827ab027e174119f674b9ef9f456c91ea2478be5e01f584c9b26978dad8ff8742699dca5c4cd645d3bb2cd283d56730a275bf3e8aad6a23b07247e84de634a4f79ca0f0992be7715eb921090b306337ac7ccea1d225f5d67f4b4db036dc43b9d7f151056a54a95373c0b09f7d2ca81fe1ecbbcc818b0286ed0e1c1167ac410824f10c0c84116767e30c40b2ad6508532bcc1091e58c203ddb0a0c353d019c20551a8e10c4ccc808c2c987000c90c8e9c600b28ce5892630329dcd0c40a9e48b182897605b6851649a2288314dca0843578800d1ed821528619567481055070318466851a6658c1053ed84113b468824e919c2a3a3b88a1e40a2ad8e205469841b72a5c5ba4c007615091832151e4784001392c4a33a9c55fa59d20c8e0085d48c310923859a2a631f7d0840d6928630a2678810bae4023920f7967e1e6b487fceaf61010ec2d06936f0f396db5d91bca1be59432d77ab09e67b12ef72c4e4355fb93722ff63344a3e1210d139d57fcd2117dc899f3106b5df29fc5611f2bded615f2151667e941f935c3bd58cfe4d69bfb88218694a7bc5d8c9e07f915a38a07f98d34561e0244744a561ec244b848a81aa24bd1592a228a58c105a2d69f3a4475686f2a5555af1eaa82e899ea94f5007988c5757e25545da20f39db1e40b8ca5f97f60765b92e8558ae90335fa97242968ee8a54f161c76e9b70ab94d0bf10079ef8831c6183dfa54e5b45fb7d5d56eaf4f4fcabdee6d3443344cf448bfb8778818721607e4b7673ce431ca100b5d06133de4cede8458583cc690db746309552177a14a3eb9a11e218bd3ce29655d4cf2713de4972564b138db1e2ba150c57ec522f9607190b358a2a75c866e455555f501d15f3a3f2dc91ead1c36422db1c5164e6083cf0422c006243018f68cc1c830908451c50fcf4336a25c0e5a9d4d2097d554dd44a7b59a3e6a343535315650c54fba04594d4d8d75844eb806266678e8633cf48b7be8747692524a90cfea46fa446b157dd4688270c246ec444a7e50c54054acf8894ba2d1b01225549450612eb01ca0df8abb6025e8ac24e42376c2846bed0da2d1b01327954d82c140675418154685b2b13df379f284055dd1bd4e00e3274a8b7fae9327ec2424ab145d0b02896a64aeb658f6c2436fb2ce394154ada015284cfee22ab27904d084eb9938e79c37b509ef3a9db6a83b86e6489f3e489fce608c55da59abc821a7f2c6f943d5cbeb138c51e4d9a9323c7512e5ec6b8c5052687fd43846152fab7e465be0c8856a021851be35018c2f2606c57941d6ae4829ab942cfd8cef7bb2e7af1c64484ea031aef8755924376b82a51a42c524f215912fe13b5626db219282c5572a22be63c545d590257cc78a45c477b058251e91d250484e20939daaea52521a62ce0a5b1b65277b5bd53acd39e7c8c54e95a9c9f2984fa2fcb3d39a3cd7d250ad4f56335a1c1b4f2929a56493e7649eec0faee88c94a53a4009fa14b7e42f8d8266adf8a7175a996d8f7eafb6870d8b63a3b669c5dacae69c93068d00549522f90b02b5494e705de5afe0f253135cf77705973d75c18d617e4e4487c2f3ceb92abab3cd47229752c9bd391d99920b921b3b5a5db214e81d957754ea73afca72f0eba9040d0c297fddf8beb5b5769b5749e5f2f388f935c7ccd15d459a12bee6263a4d30ca2e1ec6d6ddc088410c9e6bfede6b56ce7329a4e5e063bf5a73cd399174911339e722095f739e289421e57178e6534693a7a047297daf3ae239f354e341cf66ac0374700ed0d9a394d246873b65d9aa86adc9ba46d2bada3767762921834284118d66c5e1f4285d073ba086e5001dd6fca8d1ac5836adc1588a081a23a89ea95a4574e9d91ffe6ce97409eeb8bf43d62517be6744cf5cacc7a629a552ca67af4b60840c2ebb94876eb3831141e06cea0750b082cf129c77fb04a5bc20f29b5f933b1c67c9e927a7927a5bd7cb1155107e3aab88c37b394d87bf1819fffc79f5d06d1a1b3dc8af1bdf6a7c03f905fae68dcd40bf7ef5b7ebcd63b3aee9ae92d3dfd4e135bf967bc2d5e18978362c47111d60399c93569ed7e0e892f5903f0f55b2e2cbd0af1bcf56cf268fe0bfb55659e9e5bc739c73ee79adcf75774fd38b315696a33d7b5d0219236b3436aff2dbec206384169362ad401910d21b936f3e7f580f940d06b2c52141fff4d211ec4f4aa9e347f5cf1a41768d4623191b339bd6ed5229a5fc9123df7bef59b74b58e8d0d1336d316b94ec9e69ebe287300a095db2d72560e8350697bd3621e57438e523c1df708a024616ce39070633fe720d0c53be5d7fb9180c1f309ef8069d7cd3d2503d387ac64d2e714ad76455c95e65bec9e8e001882174921862e48929aee8d1c209550da182e24cded665fd732bb2ecb537d5c269a7ce2c0e09704c4ea7e75a3e88c3edef51d8ac0fa52eb958384655dceb053a0eab645d48f027f976074611eada39208ce3f138ebe35a40f85f02584c6b9a1d1e1e1e14ec20810e322ca6c1e0be94a44c22b42b2e190a6a4c1c6b9259702f99ef8b2de1610c2860c1c33aaaa8e482c30439f84e2b38585b1d0b6ef3abb66307b0bf82bae6ce9d6b13bde08c0ca7364d241f3c339dd1841e70fdd281b50010e099534cc343836967ec5197d5cd73ca43a32922cae8b1bf8a36715b4bdbecc045341a264224ca6326dca461da2f3fe129283872e129aef367d1c749ba5485739ea24bfdae56e2739c47ef9ececa2b6ad45521f3177312f696122fadeb39354515948c0e325dc221ba9e53cd0d80ba44f02ead8360e72f06f1d3175bd677e374d4ecfc45db39eb12c183689563bdbaea9c748fa1756859fbaef6d5195639d5adcbeaaa2c059643fbac980acc876a892c672257f8f6e631903473a1c51216b3a408ac9f73ec2cf3ab48749a514aae0ee1b3ecd099f93dc9d5abbba8675e7b5c68f1179be1db1bf76be9fc2df9b965e6a4504d00283f532079e6f363e48789b7cf7cbc6046eda689009d52489f15fc4293673e3f50fe00cf7c7e94bc37cd102a22f4e72ed11be679745951019d59972ee5e0426bd446aef3d63201ad724138085fb3d893bf74ea92363bd2565be59a83817368ad0ac2f9a9ab180a43e9927bf6866b739bc6ce60283da27acf702f91b7e390d1a146240a82c1c082701b7347eea82749fd41ffb89e6f4e74893d6e4e74834157cd48ff341834279a136248173534fb0f3a2f8cbd132fa9b8ada3b8dd3fed73a9cfeaaa50c6564956e2e61843079b83b0b5287a2aa53b29252bb16b2f9dcd2426d743238d6ec5759d9aff40cde7300e2c37b8974ecd55ad6779b0259d7fa0e62f1e3ec75ed6ba6a62befaa5c357bf445f5bbe02e0eb00be364d4badde52313b889dbad6dd74f955806fa7ad8c7fd069e57eaa3e50f3cfca717cfb3161e49d73d5a7ea7af989ca08796751e903192a03659c0ce4e9e02c7d7de9f252f4f23618233f79bd934f6b9ace427c742ee1dc78e9ccfdbc847c748e96839549146444a2d65ce604f2257c07e59375bdd6a8a84e5554f0e4b5eb8f589b753926ab089fe5dac8857af1277270190745ada2243ec6fb835ae148e605028fc3c99e0a870e324820f00dbb3d8145d039f5e6a2f5257c471d392aa2d78a8ae7cc8fddd39fe624fd4dfe7c569345677d3ef8d40e4a33d288747bbba89d198648c2cf08426af200d6d8374996ccec358de6874651e706d9d9ea9e255d6affa13e0b475fb99a6a8648c20f9c8dc88c1142e8eecd70d98974a92b927bb19f22748c0892841012ac698d897bc5159d452be99e2ed5b4d7663f3d3e5d624781fb3983a8a7c7860736a387d5a5230b27d08d466e8d7a64802df8600b67b8ec538b7b31274164f13386915aab1aee3592227aaf416b879a2e75652298948b3d991e2d0f0fd1312d1d5dea765bd90411d2a55ab1778d4652de3b1ab9974aa3ef11954269c3b48bc420f978de3cc75938ac52b3d470d993f0c1d5f1323ab8388e979792371f4aec8284cb7e8d8c4830347a466d211aa6e545e2a14b0c840e5dea1ae6674374090d5a3cbbbbf25e4b47b4001a6811c6935e483548b8cf39e3b2f740c395e2a8782e124d2e5df34a391eafea8c1ae5de83b04208a5948fd2ea9837f99ef3e6f72a16f20990908730c9e58f7c9fb9e4501b4d74276a981bdc9ac3dfd74d070ab8ee9b1afdc00775e70efae4d4779e5e9ed507469fc33e399db5fa65149595ad240f0a54a25c67f4a14b862c1288a2ace64e4afb9e7cf6fa6dde986915895a457ff8f9f3ea6c7d9687c38a2d27257bb63c286595c2693acfe9d3ebb482381c085421e1b877eede5924e73befac6be7bbf22eb9e62fceb97fe9996bc4bae4da4179132d12b4ac6a61417f9cab6460667e3eb8719af2e5a7ea1abd943dad4bca7b5f4d732fefa2a40c3048cd77be7589c970d96714eed58608d1fda49f38f1177bf22d4497da8d70d92ff6c4f13499a639f973faa6a94a39bdf7de332284e92463c244c4ccd3af14b5feabef31796998f6a91a35f62917b62950ef9969f174f9c1e59f7e8d465dea51953c1c09c7397f4f93cba6a13e4d54be3071457ebdfc853ea5e59e571ce7cda150e4297ddd96b43e40ebb5cce29d2779e7d7ce93f104f3417ad239774490e88cc520019db53beb43fb70ed20e19eb118922449ab01892f81c427e1941e8b612fb956061a5d3e772eda34f6f8a3c7764040ff9e8ccc6ca87e51773db824eb3b6f2dea16f2b015937c58a7dcface538af2e7543ff5f102c23f9d7b305aabd66f7bf4e4d0de40323cf1369ef990a18aa7b5d6aaf9c423daeaeac13e47a7dd7ea0fdf5683fb9b53d982561457daadad7ea88202e8b678218499e4d16e74cd1de3c8f93d7384d553f7b57e59d12256095633982f0df506a01e12a97123ff9c462d82b8b61573d7bb33b96a30b68eff0fcf39d2534e747d8fcf31d16c3729ef307b4007cfb11fecc8280a3befd88fbccbad155beab4b89127cf3347755721809e701df7e04eb7966b12a4f5dfd2886fa8231186979f5e03acf811e5dfa801747ebb2ae9df90d1d42875c8532b7c6da2a012b82b9593b5fe1b6d3667bf0e8ee6e2f3df85b7b61af75b7fb6609b1483ce433678432c6982527d098b91988d3a1e363029e2f9867b1f1ccd69de52c56c86fc51c55f17b6bcca34bf6b582cfc6c3f75a03b52b5229e7778dad53bffab9fdf5ebfa159fd9baa0b767a7fc564704b92ffd3a9df686924c595765395cf6d925887bd6064d927249b9f49bdac30e8ba92c66aaa67be736eda6bdd62086430852a1d0a9dffc8821dc89b7c357e418718738272d67315e4223002fc98c3147d53cf388ca180251b652eb5e9d7f0ef95ad79a558ef3d63c0c49fe0725ef13c5c9b7f7c09ab44b0863664731c8af067ca4fc4ac047988fd5c71899d1c816fd3116135db69a9abfa48cb5ae9275f968b2ae2be5081ef6b4544311efa64b67d6053d4e291963fe2ca6337ac67a0884d7f3fbea6b3af5b99f73cf716b2c4ca1b07ad4d520cc1d83425eead41be6ac9931abab50aee9120bf29ceb6e47c2fdb3729a378fd20b102e6b5fe068332e63ce49135713c4b9e8f63c1ddcb460e79c73ce39e7dcf376ceb9578d6eed5bc6156d04cd00eb1202283be79c748dc588ee5d278a57943e401fd1a775358ff64636d99ae522741e2d4ef3015f0e10da16d467bcaec237e7e4a8743a9dce699aa6ecc662588cb3da13f4c2eaf23dffc1cd91d972aeb1be9cc57eb4066d63f2227c13cd102adc9bf27a4ecde43c5b29653129dbfe78cf71b3954e53466839cb352b6897f8a524a74fb45277d5caa1eea8559279e95210f7b206bad6f12c677bb8da73d95ff8be7416a51ca8148e37643d0a118d002040005314400020100a07c422a168342697563d1f14000f8f9848744c1a49e31c4761cc186390218610010000110199c1840d44c4f0fd9ce54efa11a6e3c8578e960180ff71a01fff018488a33dfc0dd6f669a5e811224f6858223aa40953582afa032936f182fcc05caf1542b4634bacad7f253a33ac3ed038508a0eea109cb6011636969a22db4ad7c6f430c0286f9bbe7eb9a3aeb13405378812b22d75f4f238dfe97091663dff24f6b205e3b2518a6003efb0c1905bcbc6dd5730cc93487329ad59429240835be2e0750a9c695012ca2f2fd13b629826b7346499734b0cdbbc0829af1297a1d61d8ff81ddd8ce61d6f2b4e08fd1a61e948592df372e8e5ba9e63eae5437680a364f9cad67e6c52cb4e92d93025c3d00975e560cd81b6ef73585d717e87f430795cd1572d1198bfe2ef4b49cf88ea4e04c62ec53825ab98bbdc3cf6910b78e746042d09f49468b834f754f6cca3fefa84bf037536ef3c1a4e8e60f0cb3fe2157d1e4f6fb58e4d117f899b40a9f9d6c7532e5a04db3f7b05ba5d00ac9b2e67422207d87bb142f0d6f6d5b3f988b914e8db8c2400ddd6640f5fc784c1b5aaf49eca295b04ee39c20954ad235ffed73452cc81442e051ae3f75347d20beee81abf9ad50f653b504d48bbc592b5ed5caf9186012a28408085e0415800892ebea804c9a25bbb3695055d20a4aa26fa0e156738885344d15e2d60a97236a9e3351c8b9303d01b4b0172f5a3cc3ec4e2340d1583c2c5f3b734b220fd07e85c3c73febe3eebda06a0d62aa63a3c51a9612dbcc48a61efcb27a0d36f9d91c09b4dbbe3bbe44fd4e9ab1124187ab56ea32e9b7749430aa09dd7781cf885dd39b1e950cc14a672db8b253a69bec43e49346cadfdc34beae827cb20563296b4c1f0a7182222ce13d33c598c2678c5cb5da19bfed77104beb4ab9af7c9521cbd55e76610c17eb6b0888f3268798b02b4f33e33ac86e36d69fad70f7ad19d14a5d4e939bc20728193ca07f4f2417b03517f940688c1c4a8639b24b0863d619c55e38e93a50970be7d1515c8d3f011ba9e3ba2bd99c42f717cc569e3240b2bc54d18f066e48112a16ebcf8a8959fa1ef0d20a905d7f8b63e7298bb38f87c3bf7c334a2371ad8e2d63a19b501ca3f1551ed878014a49c4575ee47d1f3fe642b723cd9d5361988a430d22c032da88598a78af049bd869d3c14fa7cb7c4d60bcd6c77d959e6063f885b868241223fb20772f5b10878cc7d7a22556ed8d6ee9b3c9d8e8ac9e880c672bdd5cffb9f542599b5febc965eecb59584d6c815ad2661939a552c4eab0d6c91da01e73b4684b1ad00cd22a9d413d2a38a06c8de73a11e00cb3d7a52f86d3c4a07e1519571789777bc5f8c4a84d5f24d1efbaf5e21aab303ee5852a53287539f8634dae0b9c46b63f41e6c42b6f8ca1b9cfbe0c6281598b2bea9fb26ff4ca44d7a2a7c2e907c694906fd0025b95d9e3906faa1305cb1497c91020ae2d5de3d174e53e957a88f2c35fdb642411b9b9c8a0c5075a5bf1bfc824a28039e4e6002b47d5ac96c8e3e702f8492c0212a4510a6c2f7603f6c037c291e141c2f276a483597967a63348935fe9bfb0c5cd795a49d1d598d0d7aa164c9aed1c2ea0b710b97575d5fe4816356d107ffcfa05fdfea5539181b5072c075fe2cde640a75db779ae0ee64d3973b386d3f173b5b3806708c7cd8e6dffe95e14a78bec94f78aa7278aaecd270552e9980271b083431a300ff88d3dacc7eb22da29493ab2d6c42bef5f49b1acfe322bb24cc9be2554e973931cc958fe9b27e41e0edca4f3aff586a6910333bf84d2ea663361c8f0055b24042a80a09850b1b23d3bf22eac5f09887d78d74fa99014388767b8bab12039c18b0f45d991251b4be2b8e8d174435d116df8abba04b733b5e8ee879a1d6918e2f566e442924a4de74d12541c66168a4a2df4e21d0d36f57c68ad777ae77156a7f38393ccf99df0e896c2b9cc0155f55c40516ecf0b37359bc9c2d6510a08604e14398b944fcdd95f4d36d114471c5fa6ebb526a73b472538ff958099db48b091b5ed910cd15f635850aa66d892b16737fa2dd156bebdf3a75ac0b5d76db3fb1e8fa22f6868d78b618007f2698dde545c20f644ac25a64c8368ef0f36da3472087bd58d90234257b02ef4fe7f21341572d6fdd3422104428c403c431b15ab2bcac16895c894a2a2307c35bb0dbab571c08792cc59365ecaa86718069334f5029bb48c94d8c3f8d51e300e4b9d5bc2fbc8cb8f9b4c789801b27767d85e241b46e8903404c3ce406bc156536a802df0352b2f5cbe9b950a92c10fb6d3691de2c2991f8841a751e038711422d0fe90d7132e22e3691e28284126e808bc5c0b9e0700792313df0b2bac1e08baa927333326d76837390213fff55b5d382752b30f8603814d80198e8c8f0649f78b46ac3e56713ac538b67bd0e072e955203ace227e91a99070456a9e24c440e477e98897cd9b15aa3416917d65a38df434b59a14f692fb16b8611ccd6e147e6a8fcbb4281ea2358102baa20d20a36fcce2d61503391cc1f7b4d78ba52cd6729da449f2d51700ca36fcee42cbed5b5c6cd82d6e56ed998ca089b914d057ebb64a91b73b670346803cdf3bafe3ef262498add22c5912e1ba647012fc735ca3e94320fea31d504b343e06afb3144c47940517ffa4b3f2c2c961ead7f5ab3209467227b4ce591f88d7575b10d081953c6c35315f8817a1ee88a45aaec38d1f0776208976790bddf15d3cdabc191e35b9b111974c639d1d706a9cc8e0483ee551917363966476b86f62e8427fe84051d487e1c8eca4bffac20eaf4c66065aa98a263eb20a22cc719be199c545dceafa9a96ebff193d721c602110c73d1ffa21c87a259cb98ea6dd943e03678dd7e108e6010596aae17b29e0a398452adf9cf73c72589901020fa3868547b8049b499844fd910b88eb35d562d63a94bb92f4f39a41ea00d9a1992ad6e42975fdc80ebad2e87e78a73f25c7df27e0ba970cc84b3e20cd8ae6da1cc00702f06d2a9939bc8ae1b0d57abc1ce50a7417677126a24b08676e774ffb5cac1a02cdba2e56abdad8c52b51926fcecf6fcebca18e8b21501b70781115b1939144993c093cf405783a0b4aad89d7e25460fafbd58e107e4b13983fb71d56c0bff9fd43693a11f781cfdcbcf3cc6c7a9c49acb818881c80f47e9666150e816adbbf82f10d54828e5ac6b55416b1a0ecd60144f487f99ce048348c7b67007eaac0ffb916d03c47a6a9419a394f243361f382a27471fe830e66c4ec5d8c165c76cac03cc0f53e24fc28f43c2a2e6a5412349b13dab132028df99189e3ae5427f86a64ac78f8b73f5d505a41da9edeabcebf00985dbf8da0057900a9ad703e18ff9f5e9db9235d1def433e1b960e5641faede534325ee8056a075d186c62abb9464cd5b1d3ac9cf96ff6abc53217d47cc7131365019a5595dca3aa2573a2256975b209a59c3612578a3606d6ea7d2b360c6a4e9768b20898c8848f7a060e8f0435fb57590aed41c3cb1277ae2e6e490a78d2159b87944b4cd5e9b57033c9b83372b75b0e89e3627bf3fa5f7b8408718a16d220dbc9084ad8472eb8b040df9b2cd775067adb0b3e696ca876e5fe0b4d059aef5f8b79d75b0d35a82904c65986168fdc854834e4051dc90c3b9b32c2617e739c16368cef30377e8c2e22c482589cf0a0b8de00dc2087a8b9f98e36e6f1ccb31e931b99f32af0ace5cdc131960a10202dc3302e07f3ef1f4bc78dc71ab5220de6a5904fb791eae41abba382447f32fc2295a58f388e4bc3520090b5c11a53a34a4d7afe16afc97933198ac5a66ee831cb0504e35c9668786108267b3f30f41a82c87d9f33a5fe0979489dbf0c434438ea2430ddd3bd4eeb9c458817e099e55c9c2165364311858fe54a62de020a84413ba7313e0c22e6308a7c76145fafce46c5af3a61003c08b17da46c5672488f253db870d5fcc37747784c76df7c48775c3ca4d2f46a20c15262d6a598d0fef1b233c4e448d0b786ae48966c55fbc3ed420480a613cc822a8cfd646a488cda737b6b74c5cc1cde6b2c5f8fa920e2902b974e03863acb6742bfc73a3d19a4876d2c53fde12a5cea2bc95e46740dface34f249b849cb8116bf54985ae2d9a49d625e03930b8856a862749153472dc42fdc7eda4c5a9b54099a3bc6bca114204d273ed626c6ee3542d78d58230570079dccc6354cf3788632140e99e123df1709a120bac713dee7c1e2b590405522dca37ab76dd425b6d888e0783db8a204b6b69bcf6e6ca5276297ad1428506cece06253a71701bb64e9e6d62a3fc9f1d24e36a85eb3d5d4369e20acabda2f23c64929ced7a087534d1b6e029c2d4fb0d997ad13b94599a0cb0ea57053152d1817e34fab90a245a618584cbd697418ff24970395278e4128cb7bb5521e61802c15874ddb62c825a07b0059ce2c7e994835b952f9f3c2f6ad6e687d70ac5c454855751a86aa9872fd21d755953ff7db248aa9cc6dc4cf71eb5a68be13a311655a84d3942b8304540e0bcfc3549a002d1e6934fadd466c18a85f83fe6d8982a92f9200cfd12871e8c4c872155fe545bfe38ce42ba7dcd6321207110040461e3c2e178fa6880729111853142eac7c7f402c6367265bea2c1649733597f9e008b747d0c55f5b0707b1eca587c19ec4cd7715f378233feec42109c0f328fceffac3f991dd5d539ba1b659809d1c54cc035920966ee8374a857613b90d46747ccaecb9141a756d92cc8d38385393c5996352cc5509418ed12553b8fc9604cd1513fb7e18980e38e2287b1b5eb63217ff95b5809eb3398869fd29ecbee9ac686316b99e55fb659b820899658ceb8361d15511351cd862bceb852a168adf2e4b989f2c2f8725b18a5d1aaa16e73cce446ced791108d62e2eb57312150ca7fc6d56305c4b2fec3df7ad259786c9cc24150ee06ff534b2914d6a104e18d91e882620f4f9f3b1054ec64c1cc7e339b2dd56fcf31cc6c4e918b1242e2295dd826d260ba623c11940ad1bd0f000d5fe9bc7b475b140d608d1a18ec80a111a98df8488dd592715d320e75a198e62b30def78df0f91114d2b7d3180b2d215c5c9aa45e915a055f0c853715422ed0aa965ff19d72ef0be3efad6c880cbc6880d07e51141b1b52646f1e50551fc22ec19682103026e015a4772933ec7f84593749299108bc1a4de457c5341fcfcdc2e69f54a3eeb73624f600c122f1f612bed47e4ad4899a28e71112d43b0b486deb2fe8c164818a6b062711cd9ac100e8af63be55c7bbd01d199eef695e4b05bf851c6399b9541d2f68e29991e095ac96d06f5d55065160c235909303586d5a47930f1c0844bc4716440826fc90efa2a178bb0a816dcb4599ad67c0e47e0d987ce68244329394cc0df3776cb0bdfeac1d8da48f3f02e6b45214dc154ebec6a195fae9f1a256dcfeba26f1a394ad9c3284eafdd486154dd3056a17a72139aead43a0dbf13d83cbaa76e970a10b9c4e5e21cae4fb8ec777b3b7cf469ddfb7bcfedaab10ad171a3f8f94ad4dca6b9e24c577dda984f52b839e869d16d3713c0c44e854dd54071cb1379586b882f429ef938095b1ac19c80c5affe34b49ee8b96ae1187aaa37e0a06cad5a5b5a6a8b107ac932ed811c747b1c84fd782d268cd0d403745aa7506def5c0768661614621e6f8700d66a9989e58b2b305e09c79b25e62e42e9b0ccb8ee812c91c8222760cd999d78e0ab5e81466355031e1d0f8c330526c7671d69f9a4a26b4ae0f4351bfa57bb80088b840dc8b821574c355492168e3ab8e1fd000fe8c3aa980deac4ffef51c7bbca124ecdab41eb3c0aabb31ae92692bc3b99122f9cede8ecd3cac170e8f9ffc0b85b409470ce16b4669b264f601acc314aaefeec0fe09f9700e11500da5bb03640238e6c263accb031d6068a3480cabfa19fe3cf46eef12d2088bec6e1a4825b2ca9c18ff8441fbeca5561623574d14af864266fc8eeaf362d2b96e0465ea06d87749db294f6d4a02dd38d33f2d74c02797a563655c40310694fb956c711f4086672899103b78285a0502d8caeb9304adcc9cad891d980df5d76ab558ad13453ade688c400b1fa65362a78d7f355e143c22a52500c588c90f8bee4b63e41c14e117bf33e9b906d1b8a58f7ff52ecb653538e44d3f2392608a1d94f03c2e660eeb0e5819762a21a5f40aa09fb36ad7d917e796d6df941bef3d27e2c6d5919ceac14524d5a79abc10cfd4a0794c42e01297b940e9ec8d47837b0c19cb3f856dae0510840946c71805e931abaa7dbbebaeaad7e4ef09ed75fcc79d6121ec794fb22769b514d40db26a422609760f62e8b43d3e7b85f33208239f817be43b265b7780f8a56c4559943c9ed023258810a06927acf47bb99901889e30b596f34303fab211876a6df6b370a12bbab9a05359d85336dea7121f41f1938bedfed05ba30e1a532d5c75fcceed500ab97c1256c335cba2966e9e611b57dd5238931f96621c2d1b45e36ac2d505b2d3614353bb79285cd15dfaa9408700988c05fadb7447c1d91540c627833f24cd4eb53487d9f7864409802d171bb957e08bec8ddb8c9115c165774d7c25e20039f3289bcf19692a0231ca92d503a6e5555045bd2a0dfee6121be299c192ea21e499f5595b0da4232b2b65d7c49f3366030e917ce8a8c6e5a56c4a93179be0718fddc4a2b4ae8dcaf3a60f8d862a55d41c33d665091988349c39b35fbec87ebdb23b19171d31373282b3cbf8041bc7c132e343150865a3b9a1601cc182ca3edb12cdcf6165ed919f62604b4beb343b556e8ee88a3a25699adf79e879efa6852de44d3e647e151cae3a3184801e6120348653e3a9ba07ca5998815b5b82c524c1a8810fbfe23cab5f7db59811a7df1dc03eab2e50dfeff21654cc0d5716bc2b803204bdf1cce35e2eec354e7ac179842382abe8081a322b0cd316f5f45136ef998b550a4b353e46ed303aa4b9f232aa4315ea980c260a2c524576abed63827801c2ee89cec2cf68859a458c1197635bf6c0f31255380a2924f9ed73f65bc2e111d8b788c3683e150f42858172b10dd5f1c7ce5a868a91b7514dcf943c949d6c8e38295ab7a81cddd4ba8b628d6bd0b053562c69c60b5ac1a8aa44286c0a621193a2d9c02f8986d210624b8e88d16a5ed67641983f3dd80f4d603d8648e06aec07dc1537ea91b302e2ab689c2be33ca4257c75af64fb818a16cc1ec27cd2962f2ba0d920e18c79e9eb9fb311a6234b95b4613e5c5e0a82e7972ae36034b24fcceb30253b7bdedca36081707cd82b3df278abbc5e11db6138668b2436a6cbb092f289e131d61f65e4142ce205741b560137b6cdcd851b7162e22109a8f24e6e5cd87063d9b9c1fd4fd37cdd79c167040904fddb75b5185d76ee75f7b0aa29aeaa38f14432696eb3eb218596d094b23ee9898d06e998dc53ce9c373ec22f290d077ee6c6ef0bf17425bea7b24d46ed7edd08b3970bec454bb7339a04c626175c7b8f2483c8a325bf9d31f2a937d728f9895dfdc234118c878b90b985eb7717a43e6c8928a9e901759e13354a2e2bec01ac2ac3208281c407e7c18e48425fb97647c094603e42838717eb8c5a58ce2ed646c960b07da80a32d33ad87990910240b34d4ab502fdef8652d89515cd62c6a6f4bd7398552ffd79abc5d7315829daff4429825e58896d7cf4776c9874518309f4ab275308af582b0f72cbb6611687c6390276a1fb20ad8afae47c4bfc30de45201501ea2a05542387888c8c47302f2dacbf5d6a8bea8afe199c106ce0f438118c2ef7c492b26d3ffdc062e285ca5849b8b47819def037036fb30d70a35c95c4c58867c9d1e551dc99c944741a49dd169a0c5e9fcb950cc41bb47b125a16be8e885047296eb3738aa82a701d2321d5a68b23499972859fb959206cca58ebc31811302e0e18340fe3fee41589cbd1922d096152687f3615dcaf20b57824a282de114a06fb01b9c5ad16d2f8d1f955283a6dca5ae31f0e50964c7786e75c92ef67c869c9f899e10371a2632282e1aaa97461045f617ab0270eab444a23525181b47f906734c8dbd997d9b68fafd6d0fd32b11cc2d75b45817926c0cba9edcb775180c32c5b6e15aa5bf1d105ca67a7b5214d29ef225ac979e743b327dc39da252b42d36a30d662fd50140eca707403a727758639a5e1cd1a8394b2a40185c360903f12d13e4fca05759fdf22c4695135181deba275fb16f5b694b95ea238c0c0be674b0c85f5efd28c5e4d31481b2b6cf978c93603f2355c5c06566743525db11021b1ccaeba46ef688cc43d1128f52118c77f148279ee829170ccbdd5deaf12b50ed3e056977faae3f05b221198504a0e4bb0b9a74c39e3a1279ee161a4afab22d0798854d535e53c99306e14985ded9fd34d800bfaf234501aac6d4f6a02e15b2f773b010ff124d09ee2d7ca287d3d35015614c96afd2dfa0512d894a74695818f0bc0d410a737a121620fc74da9b73ec611a620164a67eff4e8df429940a100f16e2ab6f91f79ff5497e0d05fb57ecc1a49610e1eeb68cc2c3cf012ce2358cbf68e0d6889c0af8a708bf9745ea6a1e4ad6a9bacee1036b145ed2b10083b4b727c036c116e728d15f302ada6be492fe6a127f0a2b370e6547c036085f1397ae9d7f8124025ab3dbcf95aaf9d8809d822e02998c1fce4e54be606d9e89c662f39f77e8d247b8ce3bfd77cee37e2941a134739c542f74d1de4cf52605c6a9529169996db71aa2a8fefcfd118656d14dc87808c7b6bb4f134edee17b8c7a1bf4bbe83242f867db586e59d48ce2b4d4b0b4848d548ecafb33886bdc559e45aeef295c164faf2f5f19c9439163d4636f8b48de3ed5472f28b5d0d6fd48bd089b1b25a4c304b5ef541d54340de1b3942229e30a42f71d180a98d25cf5a4604752d56d0d2ca42ca0877f62db8718a8e6db41af4cae5a38a939db29a1ce0a495a64682db10172123f834acf4f369c090a76f9e221a7111eaff854a330418362846cca5584d715411f0f0132f269f7b0d7672c4f78efe882a94efb5aba1198bbbbcdca60a88be0d3f555155a9a216a8198112f86a358bc1c1bf88b5f1bf4bbe4618580cd65cba53c31d0e2279159aaaefa7c545c51dd77e7d79727e7a2adaf3608ce465dd33a1a38a3ac0a6c635d11c72cfc96f5178c3e45076c43c401bc852fd3a26c218035525d928ce4ca02e01df0097560bc015597591648686a47c01815ee8bc9484313c81681e901e83b95b31209aee2b19f0d8f00de1e28f3a5990245afb878c320c6210d1686fc991d095bb888d24672eb00c1fff9704a265441f4acd998f218995e59a46937e19296598db048f1a692afe83d82ad1426a7eb068f45dc346c8812e58457b5e6c0fdced8f8eff51a1aa27207552985e17d72b975f0910a51fcf471595ec767da51952617c9ccd0e81b2e83985b2a9a1f0110f5494a90c61b1e69202d55c55afb392b3e7a3263e741936271418e2f533252e0ea06662b95380b55e783da8f3458fcd0cf369084fe2f1e46f3f8d975a748b7b14d9370124f0d1180c78c0ee8ab23c923ff1a7e1f813d09bcc3e743e22ad81a951050ffb6ba70359b20deb52d6a41fe50675bb6d7dbf2ad7dd84c083b2a795882ad851f4d6fa8e2bf2778f62a3dc3a3c82f2a07b543b32b62650c4deb9b9ab2fb60e9c2ac2ccc9ddb9ec995736eb189979eeb077fbe3d7bd83baf09cd651214ca82c8da94eddf2429826de0a51a81919266bee163e18d370395ed20ed05951db37395a126637bc599c2efa8587096f2291a1764858fd3db05f0cb269167913166249d57820afeb223eba7003a3e87331ff6e4c3785f095decf89d1c0f39c48106fcd7d858b7b5baabfbde07e12c3c0af56d52dee2efd0f0c7a99dfb44d18d1afae1188b6e95fc9c1a9cddab4d0e50f43e14588d220acc8f71a0c5012f044785d6636082b02df31cbcc040c175efc990df8fb6762fccff63337517f692c15e75906104fb0daa25f0c83f8f8fb2f89c13cc084b4ff987fc98232d46afe8dde94e9276e05428de6af50efafc21f34410e199205bfd08a8fc43b0ca28f0b5fbc48714d64ad0f0fef16ea7cb248330a2c9bb7ef55d2e48967297cd9f57da3f888e61e1ec6788396164c66368011c48f0d2015b9524634bf8633eddeded1e9f469c2c0cf9e66cbd5b211f597c856b5b2a8e614302df5cb2870b2a4cb4b3b9f8be7ed68f68e809298cf9749b4a43aa49a85deef196ee779f53e933f379922ef5a7eec3a24aa473c44b1ee91ac1400662f78aa9a96873bcab80d93e9b0f47a20785f54a53021f23f9727caf3ecd64a3cbbf8c51890d1c8ffe7e0aa37b03fb5afd6ddcab3563369382c9ae12303873efd1aed949c82eddd3f60af2a3b14c194b7f6ee868004235e9e704f3a6bc2ee933c0f36172f13e5d303fcfc5688eb091812fa65b036ed1bea9f6316ed71230e309e19ebfd19aae8844ac0804916a7502309648d776ed55a629001e34fb3e431fe791a90689caeeb81c8409a665036855da14bebe24e15e36348619b253c6458fe6eb522c12c2926f19686f26eac2da104cdaab280bc6103ae4b3e068248e4f6bb42f4e65ca6d00289f423564bf6818a901a05170db491977468440836234ece73f4eaf4b7599280cb19c533223d42ee629fde4d0eabf413dc760f777f7487d9b47c67b80786405af8040be942be5c3dd5edf4914d0c14d7dc6f37ba36cbd216725ea7cd9edefce010a16c0a2e6205650091f09b31456569990ac2e12c4ce337bc3d83f2ded09c5accd6fd55f7f459bc30fbaf4355a89637768f391f6e1456a3b331c5b2150286bb8cc7ea7912951d9cee001cc04a6c5db4c6069179ceabf7cd819def1761046d1554441a5b890620d1c93d4163c2f721fd1da18fcba0fc9e4716f4947ac33bce37fe647bd1fea2f4f683daee2fe609eb40efb6e67af183cc014ef1946dfab784a14814270193b0d53092ed50dd75d630886c2cfeb4fbddaa28936bb67e13db40e8977e0992fc2a23593dfa68d9be16bae1cbec8a5c2cf92aa81e7794e44deda16baaa4dfac73f085a5b135a606d71e38d945982eb1a8e321d78a8ffcc0eee652de85091d3938c125f9ced06d1d29c1793976cdd9d6089b5f9b5206c5a3678bdebb7248fd13f2156e0284b05f1001a27ec5db5681300328728e939f268b84f14f16add7432cf3f560f1d6ed7422a8e3939a0d88bc97b3be088a353461db411f3f09cda064101690905dc56524d65b14b23bd1624f32f57903ecc385e5d7c355506ff8fc3afd3a7bd7a02730f50ee7268824c697e76deea85fe5bb1a77c0f1bf3c686a895264253024b2030c6ee9f83cbaa0aedf0a0a023209ad8cefd853ec26b6daa6215e4233d50eeb61c384830f661f761511f2e11ab3c9fc6ca1399060dec525fec17da4da51e61be34b03cc14cdd9c551cbc0ccdafa215acdd6a45c257ce33c70d7c278ff580f9ed45278575c09b1895699feeb1f23a12d36710a2193dc1c6935986a2c07d11da120ac72e1a0f020588e472fd8612d0f662ebb79818ef341cafea4be7b5affa3e7051914e6c3b1c4505fe49d78c51b472661909de01c30018a2e2851204fdc2ced0d969b9103b5f0bb00ca1e4d42f339a01cf786bc1c2f2f086e616e3b6214ec31e27e45d896882e220283c7f6313685efa944c4472d4a26c238c4da4cccae55aeb54a892448d012b9bbe9e0a09403b8f0285b305bb5688940db1139600cc7f49e5c3146aedec49b5c3d52d10c6259a3b28f15205b737985e4abbdfdd398a32e2f8a20cb3f427c92c11b990b334997f940c6053bdd3c86a31f302ec4ebf406510fe8998abfbbaad34a8a93df9186d61a4dacd87862f135efb96eb0ec82d7d356a2ccef658dd005419f68c8eb0f8db396c74a3d6c3d4f24cfdf3788056e76577f74a9ed4fb5100adbc6dda20e37838c2b37f7a98ea425a8ac412fe0f30c49673367c956aa2d81f2f919d75e67a079d814177c1172a55229735ab09e75dedf41c58c87664440870792252b3d7eebe9f5594c863b8047d86053a5feade9fb3f2b1700d513fe2715b8bbc03e68724d9e28c3b4cd59ef68e08163e5e6eb6fea2fc80b739ae080246fdfd431974e6e13305353f75b0a127ea5b3498fb56688d116bf0165d57d62cbdbceb956cc5e9be97fe83ba001f18039340b1fc37f5141d9e64c345d067cea7ab53a1ca2e96fd120b05d3fef54f20154fdfb90a3e2450752cde624311164450a10a4d1a63f242c2e0a55043816fe0ef290abf5a8a549e4ce5c8ddc7335ed85b40e6f1f435a67ea3a40bc5fce0b001196caa821e62604ac5ca0c29ee5ead469cc3de7ab4a5f4db01745c9ef0e3cacfcf0726a93b788c3cd2c28944d5033f4234a8a09d9199e44872efc0de02c8564fc5821d6d9e275a4718be02656f6c495c8013a0197092e1ed2d357c9e10c0791a9949fd47217c587afc788de176e95bd7dd641975e174008e46d1d1e492a47a2299f6b4a4766f212ac20fe41f901a740bf1694d22f7ce6dea7d8eb9cc0006498409a1f3effc6e18f5321a0b7e982751a26a8931e8ada3dd308871222123c14f584d8b885c7d809ea016eec066789ee0cad540355a3b87f635e80df355e0969a05b5e805130db0417dc8ce82e402ce58707f8fe860c6ef47e42f49b7b3c81ef42e282bf9488a3459bfef0aef167c978d4ecf28d40c6980eee88846a2e50bcb31a8b0305d607c4df9b1c688ce4a04741596eeb4b7ef02c8b3a30f004cca4a4690258946553a87dddfbd404df397ac8aa3521dfb719e91147900c558de358446addf73e90afa8b9e5bd6f4fb593ddca1e9726b7f6cc348803ca032f124d366df69bb13d41aea408342a260f3d0a8b6aa17006fdac92fe14397070a96bb482da439e8eb8e866d01f3f757d55b90907f964a56783294a93d589b815f43ba397c85e68847ef4a3ce65c30b58a239ff2a65b51c43bfb50425df3fc2bac9e7df49a341d152705893595de6bcfcc2e32a377f9370344eca1c5179d714d4b576d0493a4baa5b7a6b79e374a7191928785b157246c162f87d4ecf6d57e47ef1f870f234e427b1af7568ffeffa7a2d0033d62127cb6278e51f2ca35830790eb2edd910c57ccc7ac373580b25d342f2c5fa3a836c066a7bd96b26868353aa876da70676fe89aefa6438432d0db225ee4ef3c936760acf2cc1de1a98b2d8a2c21d8428e8504355d758550001bfde49437c204622807b5779010fc831e2db079022c4c4f268241d27cc4939d23dca48cd9d978d4aa9c11c7883a3c0695c56062751bc53693331696ff414a607bdf593d70889208a7f137599668181b480c464214cffa18679d796d609a2375d3a0cadca34e56fdccf38dfb72f67ab5f64aebbf179ebe9214cf61158ecedc8c24d1df49a0d956e8693727fe53f7b26c20eccaaecbaba2b38e27d17223ea6f548e5f7a90cc6584aa0f2518a54eeae573984aeb47d2a913c94ac2fa68090247ed10c53f38bb57638743840e89995b7d22def1d18c0743f75cfa758f34d8130348cb9fecdf5a65857588721fa6d046171c1425f4cd0116396518c9d48a835142bd0ebcacd42017ad524b3f4f0d4e35cc3cc1655501a53bd66ac5ecc211a6e19912d3f8be2b522ef72b35acca8644162e451f044647ca063838a37edf758b2fc10487a2e4bc33a4116a71d886f964b658c08d21d782dbc9c44c60597596d60119a4f54639ab7c7bf1e5ace3977750f20517781c86e913026af563ffd8ffecdc0088cf4de3f286a27c448d0f1dc60ad81f45b1ca130cd29198edd18f9e83e3e922d726704d3b923b94407dcdf26cd7d1b968834bf303ece7bf915c971e7a4987a0fd23dee9bf6c0ae7acfe00710e3158dd5c5b0d84ccec7b4020bbaf221cd1b1d83a00d83e62f9d5a340c38d67bb94f4ce68d9805648e981539b8c4a7223f9caf816f7b6037b00f8ed853d906ac7646c45d2f9ead284a3d3347f49724e4614c417c81fe9d9510278e1de5e741b1a36ef2009c276b8b1c4500d278534626b2f6d007d1f919e5b87c0ff411f6c59e1db5d05654729c56d30dd1e516f9ca3e68d4ff9dfa65dd898ea95c89e848231ef9c6661b7fce3c4430a6bf9f3727d2629aed0039064eeccfab077ec447c0d31a89e4893c9a84a88182fa3052246494003f8fdf49c3ffe8f8f885a1e8135992fa5db9757629f61fc63bf78600a2491b2032f372270dea6042345d7234ab916b5a695b8e8a986ba01ff2da0c763ab46793fac84ae1c88af149a9d355fc8a67145848f3d07fefe81464b595ab824eb3b144234300cff461ee4159c5da82fd7da44bacac3fa5272b074f07be85760cdfab9269dd867f0cd048b7d55ac95860b679a91794638a561eecd860499109b8a05bc2066e5b0c1d3e26085bc743810882f06024efec4505169316a5bb7344f3303253ca7ecc4e4d051fe46e07b6c37c2f0a445cf43b6ecb9282450230735c2430b86aa94810218b143c67dffe26a3d1dc963ee408810fb2befd74a2a5ff848861c00be2c57bf7edcfa5978da0f1a3801e6ca46cdb20d68a7c7eb11ee6a50f5aec6a0f54af435d247c68ec0c26010a2ac28600270bd668fe69a5aa9fb92409743b888ccac04708725a3f5206211c22d7c0655624714ddb3f4c6c550af5801fab52effb2433ab0c170c2deb99fec819ff129887f152208b7eb2015b743d2a72812ee4880dbb8533794dad7a708324933dd869f3a460810c9dec6e94df4172f79431f119e7980fa4113c0f0ff32b4f2fe68015ac153b04926d3c410565140b1b71ceeb00583bf1ad66f85c790a76347c0019763e8110a2f0406c39b4e6b2025d1df0d398d62b7490098fa471d6b9faad6743df1ffa3b34e3fdf5c7dafc5750181f848ba69eb6bcbb4b2c6632226dd1a19b9b852d95e26cc85ac3685bd76c968777c96f07178ee5c37f36cce04b86c776d0deb5b8f5e8cdbc5300a5b0c2364e95691f9b6d11e094aabcc7a48bab564615b2fe43ab67b3bede0524ba21a063e8b935bd37df9cb1fc6165081fbf8e7c30826fdd328e1008f9e3d1d1f52575c2180d96fdd075be4f1ab3b1441e254273bfe18aaa1c1eff8dca68e285927f0b9ca38ad87aa71d8759f004acedc7795cf94e3251103525981092c9418feaf510d776c4d6b7e70be1e449dd1f0f8c8cc2ee0727b2c7cb396e864c01c07f58ca9a0dba63c5665511e5498e390cd74222feccc4a5d27417abed4bee5db36731afe06086b404b0a9e04b2279b3e53932e1dbd48f660e23ff16df0eca40c1e77ee30c74ad078bc5b7dd582cdf06c6f44a0ddae207eec52cc48830db0094a132c7aa4066985e80cd21c24a649dd03df0aa93f46754d4ec2a7095bdb9e37f3052f55c9ff3354b88caa533f2131c3eecedb6eedc5ea547c2898cfa7a0477f512735a5a889eea9c828fb22bcd04f46aa6f1b4c5c88b4ab6fbb4755a3562c56e474f421f7318246c3c5d36945d1d708ebd9e74935091e7f393d8a90d9b768c84dfa1ea08a841c2f5370a234d2be2babf19217fc20d33f2e870cd93f63544046dbbcfe351a2578a10aa5705096db90fbd6c3171673f396eda9adbf414a31299d42e4111565a211a66fa49ced7a5f7a8ccc21fd53be1c296c4caac6e80be138849469aed0a34bc76e78e82644a226015ac704f9c160d66f04f5cae7eeb4927b00ff6ec4ae1b55b044ba4e1d8e0f3c67ddb7ac95ad6b2dd6173f704c37b79d9781f2d5d999737e517a794ab0bcba00ee8b1d406b45c00b08cb183f894c23cf0e5ee2cd198e0b1dd2b6e1311372f3c6169b39a819698252b1f3a833641c174dd99528f135c8c2484d1c279296ea2d714826132b5f43aa1d7c26aa25bfa3133fc93fd705844df3f7a487fb2fc36e5ad16f783476e061330533994da0aab1ca171bc212751c62cc97a9302b5e23eb99cfb0cd193f5a0ccb146bf0d3b35a7dbb431077cee5d2dfd11f3b6d88639f2809fb06378e0d9bd0aad86d5569ae4a010c2b210ec0f78a501900f5780dc942000f4ff86a18c79b39bc85bb7cf7fc47849e936cabafad9d10c27b8d5ed2eb87f01b016263df7c0f192c01f4703cecb87971394bcf740b0c919727f2415ebaad5363ef4b49cd7a08a0b0b5d49b090a0960ba2391afcf2f94a176ee976c8b21e083f375ad7cfb82b57637dd861dc515bb5d0e6775506ab48bafd66393935e82a44b967533f12b563ee13493318761c6b1c70412771663f4c451c94d24f3b6a9400400d7a492e12670ad4096aa068537087c5e07b32dda06ffe6fb4f5ba52e8cb14011b5ce1074e715d4898f064141a4ae1fef69b0a8534a3f7ceadbf3c2b3317da78872a1fa06c21f03a6e8cb4c81b0095ac79aa4fb56f6155cd0cdb27f4af314d37d4df6455bd54b033830d0c07062afb3a358913668195d7890ec7b2a01d7a186ad409da62375cf588230055107342b7f059ad0ab92a05513753afd15c70da7225a079dae14e39aab775f0b010b836bb841a920d8bc01647edb0e18704a792fb93429931162b0ee56916d6112889c5fa23d4be93ff144cf4211bc0671ed2bf6bd4633a03390a0d28a4c52b556bcbbb1c1a4217420efea64760f2690c9617939a787eb1cf2a1513057646c74242fe069189df0dfa860fa711f2e83c7919f9d38002ca2cea9a5acf9aa91b297ac3588d79136770589ab1e85de7e24c0c04987e5881b596871e345907e0e5fa4b72596e33c7f2271e8720ae75b116ac7b112efdc73dd86e5e9ab47f9b6e4b209b53ab5bc6dd8db1776aa7c477f4111b8e20c61befdfbc5c8a51724e679bed95b21e4def244d787a6a3a1d3a1a8fc879ab12a901867bdce54b49b2b08fa96921a1128ada0e0b16becfa5805563556359573d1598310696ce5f0115457f2c12cb9414af91e75c86f18b03665f1c53d3522554366015623e21951166707b0f7a892a1cc4cbf5be2b1ab13911d3633880b3c6ccd437112702ee9278a6ca0ae58f2854e24600aea7f1dac8464846407abe6665847f49e6a414947a7ec5ddb69151101af35e63e2df0fa2e2e7ba7f5c0f1f571a36b3554aad05233a2e5b15a5e7d3f60960b2554f9591d9aa8c5b19a04423889dfa0e933f4b40cf71d0ff2c6206fe9e2126e6497a2bf57c88e87cdd1eca8a0156c29a8249735986bd6794cea3bc975e31f076041ba1b150ae5144580a9f2fa366f6bc23a8bef6dc8af25665b79734dbf31871984e7e8fc988f03bb78a24b6c317cfcaa689a4b217fcb0b7f6cd9c695a40a690e5818ece4a167b3199bd045bf016012c258837077756a5aa972185b4c7988d69b1a299ef07ed304fe1d864ad7c0d58b42067b10f9d5b025ac4b1e8626565210f130ba8df1811f0bc5cc10f7e4be24c4d0249013cfd4dc07b05c7e7bfb620631f5c9d08a3e0fec25854f020e25534ca455c27f3097343e86d29a06d70c3f7f2d864cc018cc1b3ac34aa1fbd06b3f40edd57a8b520711e0ca27905c6c8e0731422c75bc12d93f8df432685cd9e24d10052d83c650c8fa9a98bbaa162b0727110d8f40a6c5fdc4eb215e62213cbf473531d3167672f473ff958f060d9b33994c60786b9fd6dc1f823953fb6e1a201a5bdf2b43e3f718dfa77a63549d176c181e54631604cfd0a0a3e351c18e5f70beb5aa8884e412a002773cfc3ccb9af01fe89dd14e4ca1ef2ad7186a144eb1888b04a417232de6ded251c9df0c6ef775265f09e11d6c2f0e5b4694adc78cf5dd28bae9697f32f9854064e2084baeaa6339c9c6cd2b63e57c06233e7c642779866e84ccc952c83099e5c6552f81bf3c0c7772b104eaf563ac209ee25cec68b2c6100697551f58c40407e5fe713c44b4778fb9cd626eda741f49174b3e9abbedd3dd562e63253e93516d8dce049fb2deda4ce6ac648eb90f245fb063d254edcd44bc12c962c88da587b5eaf5705673eaea8fb4f4282982a0387d53d88d073f17264cea0bfa75d20c1e0730b023d6f20d8a3e2db66e00d5761c7d49083bd62aa3e59da6a3078fa15581e027cec39555c3dc99df73354ab7961899c639d622f124e14c96ce0d00dad4a285fc97fad19522c0b2f7ca01ca79e0f9f1b8488f3374b2cf3c7ddf1e51f16c6a69bfb27d6ae746d2cb446639040da270b1451f0149636bf430e7a3ef05d16e6252e9e9a7147d452a9fa5069d5283199bf1d87f54a7db8df14bb08d1cf8d05632fa328654643bef54179810bb6633236ac49349e8553046118ee9ebcb43dbb851fd6cd0aedfa85e10c8d1733b46df31531684dc5f0be5c88a5716a45b74625bf84bd49895441cbdc3db89f5b1bf6289e18c8a914d6e4c18c5ad12eccc3ac6a22495286dd514c2cb3252bb871407d48572551ec2ff0b115b883559677ca4b3727309925e94b1d871b40ffffbfe37d556fb4d2c007cfd9943a4ee4f42912e7de240e2695ba54dbdc5ef73f7b6fc109437cb683410c3471790cbd90a3cc09b4366cc73a045df78eff5dddd0aaa11f7ec7691a7a4779ef52e6569474ae84ec205c327fed9617ee855229772af598f2bcca9f9f35f2fc4531a6b0ace483111861893269e3b05019e97693b4a047c8e838e38c331fa3684ead563a2dc514bcc9820b6d15bfc83ad1918fd3c2bb5c8752236a0e97001b1551b9f8ba63d2a95b6bab483136ba309c7dd7a81f56ebde6e9fa5f6c7525848390a54c39f0b8abf231ef2d0a76f150ee76254196298088011f696836222e2c11c3c12899369a278f012129a8f34bc26c4180a9429279071c13d6fb9ba3033e93111bcbd23b0061ef129c9ab50643dc610316268193e907e45fa81a561956a01408cb9376642bc92bd04ade418559096db4d58b4ff4b509d0a1758d1d5ea51a0aa94a1045e0ee96ae62dfefc94b34c0051c84977235fa76e912feea334416045750bd2944dcc51c36ada7c158ab5e1961b8770cb6d2f4fb858643231cd813be32bdea3e91fa066919225823f7a2912ffea9942fe586c275aa6a23954c6df3a8625e1bd897c3d107df4376856c4da5d3442b68c44b00d80214a35619730a26a03caaef09450644a192acbce98e983db21fa780398a1677bde4ec06b9b23c60a8133fb50d3f327e5cfaf6bdf17806985d35273c626c30e23649dfb32bbacfb3b3434e936b6cb005c4e1ba7526d7de55f7a041dff7f967380382fc45083336f3b39553a463816ada43b4c984e5acb20692fb9fe9467d258f9b28c06f1e728e373f20f298cc5c3dec01779393f39fc00135f5049a059f646e7572aec686cfa58b5fabbd4507bf576c1222cbed83dbaf36d88c8cd2fbc402fef49b5788ea9d7efd564fe7549c0ee6836ce62632a726ad952cab7cb708aa8f9979db7fccb7ca80cfa633d4d2cb40da787094e25a393f30774c65c3ad903c1698b609c548c85e9a101f44aa0462da496ceb32ed7c460c2bfce1431e456a51e67731f7376427f0cfad4ad167fd61b389caa21dc3a5ebbdd333f2d2e8cb37e3a5d310cff6beb35d90304b2f5c8a21768da0bffa41a2a60f213d35c6484de50de2e6739e8a077f8a6cc5e43fcbe2138058bc582d42a3ec59082e7e105ed7fff2ac444612bb7103cd3d4f8b6f717fb5513aed89ae15f22a00110b7cbb2d8e934e25a8d85dff194ab576077d4fb52e8636fe77925231d3c07cf6cb6d2e4bd55618d3b9f0361bbceaae34bb26cd85f3bfc8bf64e36c1593cadf49a4f5bad95b411ba08ddba4c2f18fc8c1d0f353f544dfec051d92cc6800a0aef6aec56f6835e95e220e6ca28d1ed8eab6bd60b046529ae47c7ec26901877828f1cab3ea57cb0921c86c57ce0170fc0e8848bfe4aeb89635e8307f8dd599973d0cbef69b95217096b1041bb828bfb766baaec5d184822c014c801fd090a78cee30616befa8eaf792cec2f1ffd1d0dbb2798f6bb87c47e8a08997b8c209c103e60d97d95c255ebde7bc0c761c5a9f4353f6fce16451d30d0a84e9e07a0499be401dd75089320c07e1303b4377fe1e074bae0cb0e4e0425a3fc724306882a87d0575be6afba592194c507e84fa00da4468f07081a588095c61e9ba16bb3c2082784ceaf73a1de80ae9597a04b241240be9436c86c7bf3db990bf44351d3c14d6227c4d626a4e8f241c5ec405db477cd81785a93ae1040a7b9d6f1b2196eab38fdf6c16dcab07076f420bba183b10b214acdc734e768c0b11fdd0845b248bb2b2d4c712845787ff4021544cd237582541a7d1e43259520c7b106170c4c93c1d8f6bb92db5bd15c3cee24a525757f599a3ac94ce6ae9974d0beb5969d4f115760cdb0c0c0a26734a0a055376a6645035788f6368bd5863c897124626d6de63577842ef9fb18997cc97ce349f2793b6e39c5c51d079b275d859f939223eadaf299a97572e408b01aa0edf90233fdf8e1360280d9789799613c0acf578ba29e19b5e8885b2f645e26e6dbfd8174ee88179bea3d0e6a1ee2f4c71396558d97639894d09ec4d562d22997a4752444f0729b6ca585c6b4d8e385d91b554d4c10f2a23cf3c2b5047988e7d87b0beb33999f782f0a0e2418bb7708f1482f3dedce988728b87c0ff4ec2b44b1ef03768a835d58e4506570417c5b6be91b59c4d9411ce48797f66ebb3b400741342bf23af47339a93d9152c0938039058e53c2874c6c9cb22359684a28b319ba8f375e57b3c821711b5b467fe05bbc88d8c89db1d47edc3dabc6e78eb6ca2ae79f7375cec1cb7fd86a8e7830d2b5acbe1778aa91048fa85450c32dbf3fed02b4e6804661c2808b3b0932322a30a87be5478de39fae5b5b0dc44931ae03bb3cadac7824b4530d81fbd6313aebd11855e94a169de2709c2503304dd18f7babbfe4dd69c76f11677efef2b4311cb04ae567fc1df06132b25e92394ca78cb2367213b0b621ced897ccae23f8a270e2b6302f233037d6fed40e0abb80489dc939ddb58b465c3fcc37ddafa25c83e4d269b039b5cca94271cf3256bb1387b992f493c89b737fdfd8eea91d2e0e20c59d91232088c7c7f19f8eb28e2b13a84f061b4902f322a2db976309cd83235f1601fd34e06871ca95ea102cef792aa5a0355b1f83ab2b17ce73a49d6c02aa58fa76e49cd74477496e3ae6ef465308b12067c9292ba2ff8a67913caa328458c64182343574429d6fa2c81d1e2dbab0f41cf4f58d496acabca8e7a0217c0e26b22f1320e1bcd9866d0ce9a0b58c4e5c0513c1b007ac02074d94e4d33c077d6ffcb42246894ef29a197c3fb7f44d9d5cc6fe8381b909b62462b61580e029721a00d80576a40af37cdc065c25e2f0c7fcd995a01024c2a8d43ae9f51cdf12a0ebc523aa6c518b27e2f5a6a499b852ca39190eed932d6e19828caa4f51c8c199acaf2ee3fcc3b913bea1721864d52c0d6d34c9637dab89a3a50629c91e4339c15651834ff5aa682f1d4a137ff529fbef9d646972cb9c6675b4983ae7274ad813f39c29a364d348b10694f6bc383823920197a43b258697d5e077a69924a7e64867e6a3176b8ebb1812b454cef3d07420b03d72134be4a871a323863913a7886ad68ff54b399fc58a37014739a0ea5dd1ffd66d218e0ed87abb3f9be8f76a1d457385489abd47101b1123d3edb808b7ed20a6829f6a6209735fed154d7b9176c432814fcbc20b593da517d875f798203bceefab7a142842598296eb3001595a470b19e438679b20775f5ee629206a6aa60df4104aa5bdd3b758d432b3a886f2d98efe0b866eebedab479bf89446aa061287662f56be66cf8e39687fdf51c3f3a7eccda86791292bcf3186e53325bd4c5a3d2611a70997630d1c1469db657373857f7607110fa8c1f19da4dfcea3b32628834dbc3f19411299c609fab27e4059aeff048b681db1cf2a25b96fea47663f97c7e85144ac33f2a17cdcf54d4d5210ee157d1b12e198d1bac28fefc6495fdc4f1a5facbe0b4dfdafcc46c5617f9fbbeaf121919bb95a86fcc095fb1a5c432dca44f12ea8913f70f1600693f8486fb2ce13bb6607c95bbcb1302165a22f6228f1a973f162f922d0a3213353004900fda4bfd25118241d0906d424c1522330b2b48ccecffe80b331691e837112376067d0d206f367b737ecd1105a4f5210b62d68dd0374d660c47bcb188e7c4cffb0a4ea678387fea0924d54671a48392a80cae0a6b8c45b0506c98e7ecfe1d317c66ce227fad820bde7547db2f7c0ec73e260de075651ff2ad29570a511bc41781b714070d57783b67172d7d86732f2fc2f34e9297f8b0eae76e678c58ef2cf38a7157e6251bbc05a4d0cd20274500be1999ff4373d265f49616cf021a9fd63f7c51cbaf221486d96dda154ff36bb41275cafa53e4e15ebe3b062665c19ede3aff4bd3a0b93d6dffd3cb509be6210b48649013bf925da45b8542b4842ea538dd081866515d94461d0a6c613fe1f78626cc2d99b23a20fbaa80bc7f695b8d008046f982004dd5cc2bcb676e7c2683aaaf7a91c78b155bfefe2bd1f1117889bc17ae02bc90df508ba7faa6802bbc9bd73415b76cea90d6b7b4d21b5ddd0d1eb17e24a674c98301026be13350144d48c3e6889b6643f2c85782334e963860168389887756ecf83facd9cefcbbe27f96ab97f43ada69879ad6e393b6f3d950cc67cc86c51119629ab917aba4c613091979fd2af7dacda0cda4af491b87a6def25fa95a9f8848a8ce18c8d386fa9ba9e76332febd622ba07878aa8fe066b01d72ea4eb8e647bb25ea242976256f4f502bd99162432ea5a2289ff766bb217e6262c90b35ff4dcb12c0d5df12341db6df3f480f91268b7da9c984c9610f29b42ddd30419447dc6d1354ceb87288d0fc332a123e6baec5285019d9e998bdd572a91948ce0ad9c2a50a713f39fde998a9e03dffcd8f662e21838c30594fda51202c2a6c516750d6eb3b5671739061c9bea9bf9d1f37d4099a028066c8351778e87f45106bbdae856c60fb71965bfbb9568c0148882db8b7ce7fa39987a04db65992ae41a01c34c328813b5718232482fc32a8a47edcbb96f7e4669cc003d25194907b9797ff0452b82367c8e92e752e1c13372f1dbaff273265750c3e3b322cb83ffee782c995db55c67ba5036bf125dc5ad3c776afb91372b8573132d1e7ff95e97b75362327c97f2494d23c88003353e733e5f4f14aa36f1a8fac775862580d192a2bd60afae1519167dfdb14f39f3b947c44eb55684f895f25d5cacc9663e07771a7c05a6e39f4931bab5ca9a42409857cfc147f1ba930573d7ca6313b123e638924c29358f863658f64ff3b8fc2ad0563eeecdcde468677686a57c95c4a549158026c5434571ef38f4b3b77667044fc9b050d170ee0e2acb3e690bf133ee1bcc4f5059b984d9af64473267d57a2eaa7010b4b636948c537a230e9ba8284c80c91e63616d1dcd05f0de41d7005479caa020216065fe723d7ea5862ac00c2e615c6c4baa7effbbe44396b7d5c1588f6f7ef9a444822e114812fcd94d819aa6096db13b70faca99f7cb301b1d5bad1b04940771dd21f5959620ced27c2e89f21a82f4e3fd318561b78bc30ce666a7b1a2cc38e9fedde0f8be9f1866b3e479b9782da3db17e117a40baf49c9f6ac70f085f51b7a78b45d3a21ae74786eddcc7db174ab65bb9b628f0c45c13216609c2aaf7978ad6731d573bcd93d166e27d65f4bf540692cb7f52d2190223ea699041ffc58ab6ebca7bf562c3cd45ae85a7ed7b91c77779f54d09c9c169629c387949fe543466ffb82aa7d76b2dddeac0b576da3d77fd6547b7076b877b64c8e4481a5296034af4b9ee3712474e7ea3301fc202291a0f7d3687fa9ca37d11b2ca555bf6199b67dba6afb79e316eaa5a7bcd5c41d080410f72afa4cfcef15a8812c6e721359e6c3c9692ff9c81257fa8998bd316771c1442e3a6de4ae3c2e413315baee8df8952bb6579b92e877fbe28da1e4cb7dfe83aad6aa706c7ab3ec5d587205d141ec1bc9e94d5660f897eb1bad068ae36d612129e551ac4789df41f977de73ddc4cb14ebb25b680ab2d84b9d8da400e35dfac310352b21cc5394415ea5e58f87b99055fa19a9b49fdecc3d7c62b8eb3b578b11f5889bb1d8c62deac80c4b55565347f58c0b4edaab4749b2d725a689026c4ae418d12705df9c9cfc6af08f6c0e39b50d43475e7d42cf918be939c289f4ba9c0c861b66654bad79c664f5848b173eba82d877a10a68a1b61c97c40284e6a4845f61c30ad9ee780202c89d8b6746d762e8f69a0b3ae83e5192a359e3ddae594037dea9af5324fc9988cf26c8559de0183e8c835e9f1e2b7d5600bd6b22f586979658dc968969249a692185535c255a0c6e5bbb42bc40dbd79e757f8cebec6b7561b93f35bc6d84b9c1617dc2251a44f1a421e0fd7a7005879deae63b7e785b994a288274702c3a4d7fe6623ef0a8d117f991c99ca8c80247df6b9da9b4c1668cd3c6d31bf77698235f987e45db821f6a6f6ead32260d5bf72ff0ee43d403df803dc6130cc303cdc6753620ff741392f2000b414d89bd45291477fad444d5d79c83febb6258705b04826e2c277f5d27adaa583d45640cda221593fc0b3883581c89a971f0101bf9a549fd7b368bf825a619e4d6b248246f70cc750912a509e2dfe0954f75ae9bceffd71acb19c4a5294c7c3b843bde4a915d0044272f35f1d3b81d3a0d092b0b97553bc4cbc030e6b1c7f7bd396461cd18476a0cbf4e1e8d95f9603361bbfd7d8a45de6d34d8bad4207055c2968a042f0c35410b62d88da571edfe174b08e2b26825872dbf4a9154a6c3080a2d3d0f1e7caa0ae8ed4240cfe76b133ee77d8cdd14eaa8611aa3403b5f684c51ca42c73009c0ff5ff0c331beb74362e4527535ddd97220193f7591cf117032c40ed1ea123dfa5fd00e739ff396ea71b37fd8fe07b9489ea8c48a36893e5ccf5b22e017c007cdd8e62a9673d53a24810c4c1e25bb47ad2e2de8bcf0845ecbb685657eaf42aa9b65cbda9d0614c4277153f29622d8aabc65696c7188292713f7dc52482c03696b292923dbfc58060148aa2c9ac10720e1764df234e23d2f467a9febcc6f0cdb2868ae68661eaed3f7ae70edcee1d2a46056cf4c3d74a9044cff8c86996bd4558bfb2d39a70c5e2e80e4af66b8b6ad1991d3084c43967abf4ddaf4b88228a80f8c4ccf3a563a623fb8d2bd58b281b77da50f0511749c0beb1415f0cf094b7e6d0866fa222378ffeff85dff091105c352fc10bc732efc487815c4a387fe81fd88d4824a86d230e01446c2f643fd08731d9dc48867270729318248fae5246935ef8dfde02c0a183ec4ca3e958a098600949e24f4b510c5cc7a9f2862e48236d14400a323866f2d5ab0053a4e3030acbd08eb0ce431c42068721b47314d87ae9f7f0a5fe77adebf6d4131a37701a72714209c68c3d187d7ced8f9cdba9df68db63bee2314625b8ee58d81ec25e2525a41e5ae857e29fbdc7177b2522d597a6a4a74b051f34226d81918fe32ae99e109001b482e1ba0a7827c02899bb2a46c463d6c97666f4e0a4a6464e634c0cc2d8cadc867f01c58e0fbacb59842a3048c8d879f46dafb4ea2b22f628040019826d73148e87a1fae0900a2e012cb6f00ced21638005ee1fe1cb98f7ae27e2c2a1590d12223f546045c10217f0515e871e0026e49476be202a7f9f62a0b99ebce3287c095aa91925616588b045c69184d71a02c123c64ea889617d3abde836736ec87299502b85fb0b2277e062728e0d4f166e8e5a5277564790f5c1a5ca1f40bb8d614f34d1056c5ad4576c56958b4cd088e6006922ee423b3899e62ac86d98838aac427ff49303c5570303797f5d2112ba9fcb56bf82f7bdfeb38ce58c3e1c3d09222af58f71c50a733f50f0509505f6a248bfe9f903dee2eb92289a335c5ed0299c7cd67fb9c440e0c609880e26cf9be4d2e73d1e8092c0e4b812e50c2be7107e18c1b54731a85438b2360828fbf9f1de8d01a8c847344890d4a422d8d3d056c92d27d6d01d7ee47bc3506c4ebea6fd56e28713a175880fae4059fae727283e628585d8c4c32a140032cdd9f2bb7e0e67c1cb2e852f38bbca562ce94a8791b39cd51ed333b9f29495e5cb879a5ad2768e3ce8eb813969f9285771e37532950a9ff318554127c9b41cdc719e6f205a82bb98986a5a702cdd74f207cc57e592debc0a1615f0e2d954287fa73b3b6fa4d084105d05655271de0bba2505410d4013305249a4f88ae555a39060f04f5f2e67d99b2867120c490ca2d87f3ea25813a8d2f33d7249c5cd93e8104fd3c071d7237381edf456b9e860d925994b0151d241cfff2045a9829cc161cc161cf5c11d5df513cc3d1016680381b8ae8c54f618b23f462d44d93880a473af611630610c61596503a885381f35ef0423f3e667fc4b727f8c7b6080fba8499d4b73b569c7aa28e2532cad1d18a85e31648940b2e62ad784c458b8ed43f7a0663166c3d0156b82309b8fa33f5f311125d41a29f0dea38fbc11970e0861a200d1277372cc96351a959843c721706f0cc9234a21ecb92bf598a08e8f5a1fe9ef4b2d5d9cdcaecf8a09b22b92eb4803ca513d2832c6d27c4a1056a56c152a1812fb1f4155b2e41946e5498cd9a0a2c7e42b8bb27b8d682b42ab38bfc3933ab3257811333ab42607f25a6fa3cb662a1b8cd95f8c2e2a8251c4c0dace7d9baca41a6dd6009d681715dc3c1983fecf711e553d167f5805b38a55d24826b3cb453f344f9199a7a31572faaf8a6ea6246f9028e8278f9b3255340cf7e801398d0e33f6a807e91650cd76e2dd662629f883132a176de67574a8021fee5dd97b1e643249fab7b18f68fc5ccca8300e7927270224d3f9353aa88d6fc8a6a4737c29d2cbb419703e8387643e019f0696f57755f5b4e7f186c01b998186ba41fa360b7e2bc5386256e698d65717c0dc54bed0bea1788ade52b172becae901cda95b8fda372634e71639d5a320434169bd9aab9c4a578eba73c9cfccfdef574bc7193acbc527f02a849820489cc3511a602c79b405187a394eaca007b950d41d183075e1381c1966b5517de92b197e4805edbe4ab3badbb603545f7b0a4b5065dbd9fa6baa751609db73656d53df9221f9b6b5e7b40d821f2559ad0d7d0d1cf66f3330d1d05900009b898f90d621fc4c4900fedb480710df402fcd6e78704d9fb4e90ffc36ff6d119e842ab1ffc3d2418fd02f90b9ad70c6f7a861b079b533e2f09065247bfbb54ca78eae20f6a4204839481314ceec9646368baa213f342af47a959e11826cbf2836216f033258e7adbbb042f5c7d3f4842e617eb43bb5f1e20a674ebf9739967b398af0d13c2a7c9cc6ab13f679f40fc8dc63dda794587b854ea36da90163af69b5bb52123632a3b9532b678d9bc233ee7efcd7bc0eefd53834d74fcefbc5c66b5a1884524743748113f0849b340f3d9a964fe9987cc478cba9e5dbd0e990b39de20e88b61fc27dc79a5c62c4b86d6bc9ce223c1ae6187d20d9cd4a0982ce38b218110f1a0550559c9d73bd72b7fe34ed48a08ed3b6eea725466a265951b439a321aa8ade3d1102b1bffac41e58b1011f52faba79f1fef706d394b41525392daa368f1d4da5e83bbaca878422011a76e6702e2b55b3b2a400fd499e4546acd9f2894c413895b0fd99e6814fd48343e93debcfbc9e23dfa3fe883434047dbcb30cea825ea52f5448077a5143dfd358a9f6a34068d461b0bfcda2720bc467631025b894900f0a0c2a87bdfa4c248c229cd4a5d87d16426c0186fa0cc0906902f9355b91ecabea1b76d5fd945efba00772c56751a2544f16238ea059eaa5d05c9cb59d02c2230aa1b2e93804bdb6e5496e7a3a0b9f78e17fb4b971897835f66dc6024baf6ee9c0934041e9878ba2809aea3c1c08d7dcdc5b98d79a3b09d04c435240beea6e7269f80d396ea7e8b818276c689210a1ecf4ee682ba33f3919c4ab075d5173a9fdf5281446cb8497c96d55153221048ad96405446d9e7905ae472af43c3b3bd5ac232f5b3bda167bf41f748423908dfc0410f2f989d1cc446a5e9f7e0f4a8344406a7f149c58d123e1c67fbb736bdf7d127a37992f9b9fe427c64623c6c613c710de79b61af1fbd862481db174e037a21165444ca9bcb867206791157dd03ad15e0ce05f0d09220d826ddbb5a373976bee9a489177564e790168bb7741e3a946f3a470ab13c947e86ba588bccb26df21d46a3a08b7029b2a71cd194fc5c1c9bb628c9f5e05eb1f29033f628e07ac6b3408fef2c29c206a0b497209f201c0773207c0ff47c3c533f7191e873d400d696241898e13d2e6e9ca07d90bd3d040be8e914652639b71abf8431efcaea80cb3c09b5e78314b02011f3dbb1fc4a57012104dcb6fcfe3d5dc10306495508847edb8345b6fa02f9c797c74df36e84a1605c254b32ed5b0256c9f30f4b6891ef6fbcd629125bcd0997c39c7933c310062d0a7deea5431beabb9509c244e36b92eb36c83276a04cba5ba98af07dad92060b874a831975fb782b7693d268b6e2a98e6ea455501e3ae43e64aee33bfcaeae6a8ed910d29d4a414a3aa575883a20f8af1b482eb7e5497e0b57c656e46d0454e8dbe98bcd6633716ff50dd9b6794a9c3ac4517cb69982c0b12386dbbde61fe75283f8b777937075f0637500afb5b4fdf09e5c609d0e66f7acbb8ed857e7779b59858a854f682e11247475769f57f8187df1bbb83eec4fee8943f85ef3aa157a31b773a51cff7905c75fccbdb0087b5efae80bb4515d7d243d7eccf8b4222bc5b9770eead49629fd126853cbc02670be08dbdb87707ea8ed3ec534bf2ab0bd2dcb3d53b045e376ce66a5cc306b9dfefc46960b072e68d5339d101fea63604ddf3db5cf62bc7bad8e3529997153eb2c7bb276f8d7dff0e5a083164d952843f2dce74d89a3dd9a4a787f1d8d0d8ff18fe050bc484b6820d03007007b712e20ac4952e0d9f4372ac04c638e97be00e0410c6b701984084b01e8589981e441568508b978fecfb00fdc9543257239a216739575d004a82cbf0b003ad9bc273e4af34e7f8bbda0253f291a04e25a36e2f70b077ad33e9ba228ec33bc1e651097aae7cc90b9e21409b6ac90d120e026659049e530612dcb51de1b8b7271b5337129fbfa4c3d229c469c6b5dee0fa3f1448dfa02354412aeccb5aa6a934c2bfdb2c9d7e80d9b5fb7493355660d3183e5806de3325aac8e5c62cd4637c0079704dbaaa99b9c845d5386f50be1d9442262874075e4bac7919405f6121bc696969120a9684ffc4b060e1b65666d19be9451201e406db7e5519391d5680e3e66f191bc00f8cdbc287f05067f8d498fa4b684972e60e71742c48e500d449ab934028043fee9d1fc227168278d9c16470c2e625d4df7f4dd2585ec7685b8046bd73a55ebd0f5e2b4d0dea7143cdcc87551d88ed434b6839726a20e0a529dc49a28f51b3466b7e0aa68735019439101424b2b5ed9d5bf25cc3ef2c0b54a386d9e06239269f0af3ef8eb8aa764651b51a5f4ab972ca32b43191009b906582c81a752e377d0b0922b11b8bb02c296f22f41a4c9d9aafe20595be1aac0ac61ffab4ae815a90426db6009fbfbf22b1bad2c24cac905c49d393148595ef30be8740ae8a55d7cbf06eebf23181bc69c82a6ca0d2fb54b32e5f44493f744eb51ed91075423b438401fa47beaa048ace6f1bcfcfe9a5265aec27bccb218fd6d9016a6bbaff52fa4c31ebb12a3e116d057995b0d645dd84ba525701fea6d936d4e328fd11e2534c9fc0d2a818fa45639a7eeece0ab4052beed9e6268d2b511262eb77184eb614566f1fcc969823512fed3de0e96aeaf33833a307ebf8869f9d4034ef0f8a93d8788b94be72fabea5a68d15c0dd2c0514c46990784663f6b586eb6f38cead769a77cb25f45a53969c4397bfc3d2d944c36bbffad3e7e6c887c99c4ff7fabf571ce94b886b61813afc7e439ed394f751fee34c0396eba403ce1d17e61261ddcda3cc1a200de0a3d70e9cbacd1b0b60b5bd1f1b6e59e66b0a206f2fb4cd67abbdb22725217a8e98251bf13523ef17ecfe71ac83dd10f7521cbaf4ca6c83a05af7a051f2011433066919ae7b0cc9c925db70b73d6383b803e77fd1bbe7152b6a6133a98948bd6021fc57146c59bb277ce8936282c2ba34d0e9c9f1a5a4e27cd35f67539a92d08558b598ea30f600f76b9ff626b8c251b4d40d65ab3b983467eb70b2f92c1f366c46d63f9b75432f9314c55f4527e0685b96eaae766bfcc745213d0a898d9e6c69dbb7bf9ad4c03b13d6a0b138004757610eb6fd477d7270eaab1739552c7ce533c702725c36cc1dfbea3640a9f6ccc2ed97876477803ef47fa26637891b2e37eafa28590447ca3abb28cf855a62f23ad99596326f4387bc0a8c5c5e60b3e8ce42c38552c6d335556549a4321d1140bfac1154cb47f4d16712b67ead7fd0aa36d82222f0fa90ca7372659d5aafd6e6200f81ffd2572f2707412387ce25eaec563c61286cb9de18d7eeee56c140dc1fb6719c3bdb6e29eeeadc57616b6a906d3f15dae0f0490c77f26f7247b12982cfcb2edc883ad4f0973dd6d654b6ce6eb04afb9d5cf51a3dd1dc2b0a3e37eda7fd2db1e5a94b88e0d1079fa8fc8dc877f53ed3eef220a567965d73b4dc4b762337c4f7964533c9ed3db9786cc38b7f2473f9e6b151318ac2179fce00368f6b8d8ed2abba9375b77144a0767d3201aff39ee3f5362b5638b8be1e1f51cf2f08991a4de68b76e6e617f929759cf7416f0c9d5c1b132f5a814fae85ed1383bf83b00a4ed90dee5d5bcc434516f9e8fa712b8863d7ad042f79ef9f49f1f8e863ee58e7dddff6063271818280fbdc75acee0af873b52f6f0e7cb46331e3aeadc9b087d0ad671cbaab8a70a2ddd8ba8b58b5b95e21ca5f66446dd4dc8180451b7eb72c1395ae332ea4c3a14577882ebc753763918d8c6d4fc9ad0f17e8bd007d9cc13e12113baf8eefd5c88942d871ae4c9a67fbb725bdcc458ba5cce123af28395527f2c25d0006847c0f4487ed751523ebd90d8eec5833bf9dd581f3ac1aad1e61377aa507abeefad677ce394d1467fed04136c56bef0437f671007bc579bba4d997bb531ea816a3a4ab9f574b8dbff7d50f4a728b81f28543b88be4cdf552bd29428d973ab698b767023d96460eb53dac61132a0925a6f80a15f8c85be7466161ccffd5669aec834ee6049f4038615a4c218071f9d5c1f57885333335b937b0204dc849bc30adca1d128bc8e58b9cb1292827c4dd820180eeb3e2bef829ef87feb6dc182a0b4700f14cc1ea1555f4b7ae9910407e968631fc1d9440aa05d4d5cf273eda60635e3977d76fd917bed4d87968311b8cd19cf41cc7185d211507c9e3b1554c6a39ccf4ae6d3f92cee871e0444761c2fa0817f6dd8cfe72fed5f21ac5e21ae70edd552cbc066e56062e35e9259dd9e767fe661f296d290a0459dd42a7cae877719f3c444a08f469092f0c7d8aca73b6163aecb486a524330bf7f8ca5145832fd3cf8b54e29d963df2d8f4e1dc589e169d7d01d65ca9ac2c22c0abb7cc1234aa870cf8fa1250b4b6af0f2582408ab14e7d2c00cf167cbd6568867abd1a082191f8b989e9194a098e0f6f8c20726a9ca2b7a1abe35d55613f465e3435317922b9cd0e90b4d23ec5292216f5b7431f01b33881284ae9ee3dd792bae38d20635f59cf60cd728c4adebcb104b7122d6dbdc043a6e5978451157c8781076196dff6104dba14a32e8b16e90176fcfa2d2a3a964f09ef2afc98fc0296075ba458acb9c314fa14e70fc41913ec011fe0b1ae3043a7e03f553deae8ac76356903cccdfaeeeba3263782f982b759f504711dbbde031c2e6d46b282c03256eca1e74b03aade94c9f5ce42e5aabb44a38fedd4f537568c7d9f96d3c05d15a27d38132ffe151a092ddf8fe1dedc6046642863b53257e71434acd34039e1605eec2593b77386fa46f82cc2d1e2c411fd2849a25f147d1382b0f75da3795f131e7c80ad18b343d8b8ec1fedc0bf2e00dec3b8f007cc228e79d8180be9be041ca0a9e79f26f15a9eb9e6fe1a7f0aeea6e2ca64131505a405d475d48d62557db0d03a51dd4b4cee8395d30979108f27952400fe952189385f6b9dc446293403f9660d7f985321327926ea89326f80bd4cc765f435c4563562d3d3b262334d26057ad3dfdd211db9e990ccbdd79b3e9fb3b394cd676224c2c91c49438f946744009eeecaa19e3dcbc1eb6889fd30bd2d44d921f210f89854bdd1842d2f4492000bce427b22bc394dc494f013d14c0d231505a3f49b9ee236bb1804a919f83ad0db3e88d4e33257d717c0a8c6c87672d91004282ed4f4a72b39826c8a881eead38431e528f7f74e1d06f0eac7a8e8abd17deee8682304a1333730b47a834e2ce6431b56ea7a2aa4b7f47fd4c92d7196154c82ba4e49e939efdfa0bbf7324474ba413452578ab5ee08fba410d5512f9f43d4e8fbe6c1a027290dbef744dc46e2639286f27bcb1d7bff047674d87da4c809ae47e1a5ebe096a641ada5e37474380b2b86f8907bfd5b24953923efab08922c83f89e5f62942c680143d200b188064a32cade0d4bf326845a2646088b76ee1af7b1531f188d276cbe57c8bc1002c39a2c7ca1718c9b7ed34b72eb023cbc6b9b52ec5b90da0e607bd76274fbb21266d05f6e416cf8f2b96ad1022df167d0e5bb4a587579b8f6535c790a818138a1049629e1e702c4fc35336ae1b872bdd7e1dd6c0557c02f270169be3aed0dfc2459fa0f012c0b6bfa622321e6939f1ba9f8b7ae2524f83fa732dbab866114dfa55cc7577b2624cd44f797b00373d7a5c73b70629115f306197ff636f764d4c103dd11cfdadea0ee06207818372e5e2e7ed13bedbb9c23ed5660cb34bb018dc956db12c08b3998c65c786fbab5bff934cf82c76e329b8482a157015214388dcf0bece97ffd11b52f77e9e12edf4d41ca6eb57258dc4b43229fbdf7cbbe13afa35d3449091428c3aa7f66136de1d48e9fb3015c808a89f64f5b8937cbf089804ac6728020abd04fcc6d4e589ff0d2ef51f406ea68731922e84a25be8f2d9523bcedd18d13eeaf7c98041f7a69d1cd7299112c57d255d17b7365c8967b128f127b30efc9c64dc786941a253d97789253073e9ac06d8d18b7afe2def25bb5907dfd9c3c4e9f1411219099e740946395abc4a13c0fc0ab8d9399bc3306fdf3021f2996e7b3ea3d6c8ed5b3f002402acb470ca704f5cb759edec1095522cb8c7936f91f72ecad9ba83ea215fa130c3864f6fb6dd7a5ad8b8c1da2d6613382699e9c98c8ace01c82ab79f2863f5f316b0150717f6e1179f7a159d59efb19946a6cd9030da83109297892f8abc29edf21409c3e0db0ed134e40fb60807ce8db260342a9091b15cc87dd954c5a5dcbcfc031a6ea164a976f3072eb5a1015f39cd18afc6ec8d82cf7d08196e1f1bb7008206ec9a033a81927e5e40d459491b515fc07e41af81f84d96c16a78be8ff1a163191c6ff041351dd860994b84de4c049b0596c0041a472115661b00ec18bc18807583c5b6bc9287a06240b976961cabfb89f8b695048ed6da068b521b6d3722923489eceecd2d03d107aa07920731663910466552a1e1b93a085d74107a2eac0ec20db6546fea64dca3516919758a2248140e4dd1b3e9c3905230914ee0d86a6909c53daafab955faa361c79d552e35c4efba1e42d7ab3a1a17fde29e4a4b28d09ef4c3a12992785060c890452f39e48bfebfabfb2fb7bc2c7298ac3b947ba76775475eefea54ba9bb84d9a0eb9479fcb2163687efddd8ed2a44dbf457fdc7ee99684e2308e44de1b638c594bb67ec6773d61f74e9fd59c23af22796fce1cf74f8b22f7317a2d99566e7dabf52d9dddfa566b05889e0c778c41e15f2f246350d0d05f2a9f654cb234e1a546d3e2bd680097a78f029c119f3e00208c8bd70a0a2b2bad5f79179d845eeb5d3a085368fd3461b71e85d6bf5a1f5bacee63bdcb09ffad7f1145ce8eff3bdb4c9ee779f48413de7bf1e2675c0567abd55ae1bfa581c457d5a8be73717db4390ee3e2e95b1d8f793d7d96a7454e9eb83a974e3e79799d1739a1f31f8a5bdd74afd57afa2e5ddc52ececff78838a04420e290479053492534828609134923f90462e2ed2c8451ab97cd570fc7ef1e25d725cb8782379845bfab3c1aaf7617afdaf7aa8dd503dea29146ae430ad2319235d2f3aef71ef1d46a53f97573dfdec74c38d1ad7dfc4ede25db40a14f99345ae4ebae8a413f7a2011ca743e13f160080a135801b0240531cc0177d0a85141484b0e94b4368005a1453a0fff9a6018c416951ebef6d7deba786e377b4017f2b67de50bd0a14f9e354ba46f5ddd7c8274edca3376cfad4c9479f6ceaf22e3adf718fb6742fb43a177a14b934fdabdda0db45e7708fb67e522197ffee365121577917d9ea4c78dd71eed1efba9bb85fb3dca3bfa245ee31c9f14df88ffa09d3225a449f388c094f9f427198984aa51e7a4a1eb987e41e7d299237ab744bc3165a1ab9476911cd415c81dbc13d2d7218164f9f3aa14fb88fdf6ae96f7bd6cf48b8571ddcaa6e4b755faef0e8c3a8aee88755e9be79ea8a3e94491a6d1abac7c9b8dfb5d5ab9d67815c3e63448431704aec1e3731933c63844730b0011dec00e79b463308dc247fbf5d1aa9300de46f1a49d9fef8c9cb18312947369c79647162919efd5d8bb38fee9e1ae7207fb8c7084a348a493747a36834718f8fc76849b8c76124c53d3ddb5f4b92524bb277def83d3d261e51a9a3d1178da2b6e1581af0d06cee2f4e8953329f162787768e9375718a12f2c5b997525abf84bd77dfb4bad279031548540ced1c957bd5c147eecd2b8478cfee9cc7773ca7f32af217aff8e21570867cf93856647faa67943f6e450604a119cfe32ddd2fc52137cbedbdcbdc25c618e3a7afe1a78f6f76e9b5eeb3c11bd371484c41feede6848123dde782905f90f73a8dedefd84358faef66187bdc3581b4250ce8c598095ff131f4e2fbe798d27bf69f8c52f7498c7eb5377453ed4dc414e4cfc829e3948267bf08217f2fdc136ec6656cc771c7d81ba3eb10e1d9717e8c952f5d7882aa1dec3125c79ff96a494e0cc119123ffe41feeee6f48737c518e377017f8fd98239543d7bfcd0e5cceecd1c77bd7d61566db7fded3e18fb96ba4f06ad54ff466e4ccfdb7d2f91266555e33f627af88e59a89a6322cf78b5c61520729df5af111fa226d93126d67b4cfe191fdaf0d7c44f3363e3adb57f5fc8aeb57af557e6f4038ee448de841f79138ee44810763634521aad8d7bd056ca80e9020328b5712fda40e85966824d982031928363046549904f4f94a4a2264990e8e41c19092d29e223258a9317f8454d9220993a33e7c84868c9865f44fa48f1285ee4403bae8374342434e5c90b8ce152c219a9e907ac84dc710289c99011ff9902e5499092c8936493c3956125320ae00ea0ec2f22cd19ef8d42ee510ac4611a0eba5772f8e49064e231f407bb728802d11f49915820273c862af18f02619a0231c951cb26120803ca9302c9210ab4fde550907fd4047b02398c1287098233e00eec2d8f9d22c331c818fdaa274c92ed6c06f99bdbe9a48978ba9744feb824f85c47339fe530ab397dc7586994916a1f27767c2834770cf2c74d0c257f33ab41964f2363cb7870868fb8a7f6e9ca4a314e493dc2baad74d48f06a73c4348886271a02f043e0bf3751022a466213ed541820821ca7eafe4c31e326625e3433d03fc083fea958ccf5122ee0cf2f7e21e91c8e000b20cdc6ba9563a2b8d4f254f8d9356d95329a5f5adb574d628512ca773d229a35ba048f68f3f3e3cf19dc6a835c9906aec9e2c2a3df6f2b30c525bd2f5b18e7e46254f4c814e6a65cfbdb75e6b27cb61708eeeda530fe15effd67ba77421f2876f0a99cf38e3580e829adb6dbcbb186bc7ebd106efaa81cc1d11b0c11036f8d954d7c4f789e3854836e777fed8cb76fdd904051da1e4881983aa91cc872c0e893a710787cce826b946b024d8101892fb8325f9c998c8a0fc643c9387c789f88e13813c3c1ec896605fe227f0a008e42788404b7c0911d9c7411b0e4a29a5c44754eac03f90d828a6e01fdd5f4a69d291011f497ce49e4b29dd6b113946192428c0c463a4de847bb180a283222448a20a2b924003658a28292832841e5c40d6007edecb1320483261e0d01342ec8884093a8c3b95d65e6ba5943f7d46773949f0c3fc393fd6971d14748492238278f0d6da1a6bafa5101e61d8d1bd3f30fac13caa9722914bf88df42fc112a4f6efc5b4fddb51f87642fbd0522a319e3bf48843228c31ee1ced4cc179305e64e0213b42cc09ef9115040581811088e002d006d98fb29b76be3c2a633fef5f1d1474841278445029da2582a488dfcd8441410851131b3f86aae73ad50a919cf343f7b24aaf38bdc3db2bcda2bb993bf53229bd023277ea7d9876ea31fe546a85f9290d24ee963f41bbf1c25548685bcdfec9da9f4eb6b5cf8393b6c2fceac461e49309256b3be6d78740e266d11fcbab7e3671980f7ff6b606fff676d376c4fbdba6693af06f15d7df90c8986814e10c95a4fc390f123b916cbb7911ff61f135dca7e08cd5dbf70cc019183f8be7562ba41ea71e731d7ea8ed48ad3a08246eee7dc7615af4a7fa96b79100990cfc04d06eb4fc4d00708433e05f6c954d2a504c9e1b355cea55ceb3edbb8fc3709a85feb8cfdea6740df7a9b76f4afda6e9e0523138c219376a5afec6762a50a848913fcfd9d65afbfe13dffea6edb87fd2517b294249b7acfeadfaba876fac2d9668245ff6ebc570c6f6b5d65a8dee9d91a86efea9fba60ddb7e9ef11cb7ef3bd306f8b2af430fdb6660dbb7bf753307c6b05ad34532ed45e8bbe79ed369546365bff498fe64ec68adbdf7de6aa4a7c8a02bbb37678efbf76464fc0843db658cb1c2aad15c9ceb4eceb1e9f390614d949a0e8980fbf66553ff6ee2aea9b17473c7b67dd9362fdb75be899006c6a80eb31a29d530c79f588eb8e5534cebf81c5808f9afce21f3f2e279ff5cb5e15e2d05e16e1f3f213b9b53cb706f660e7b1be32a78b614253b8b12c6e76da9497da9c8d979df37117162e7df3e832c98fe4ad9f731d36f98e9ef0574f6c52a53e42fee15fe4cd3b4bdfdbcbdb7b137e90dbba65f69343ee28cab89f5b79a2a8dc634f50e6faf349a4dcbb8a73245aeb989bbc67ea64d60ad54aad3894ba5b6db9d328ff7218c81fdb7c24ecf61d863a7c73ebb1d7dec84bdb757feb4a26fa68f88fa4fe54f9f611dfd93caeaf4f6574eef6d96c7f4eaa477789b45fb88495be52186e94f880af6f657be15f63276def159ac30bdc3dbf529bebf693b4cfb7e867575672eb8c5adf31d4d2693356d76b3f2b74eee0e6fdd177f975ca5c7f3a110793ed2deb64769345bd20dba3f1ff221873131f12670467eb95d09f92b1a02b63799f42a67938aa663fbac4dbec461644dd676c417f880b44d0830fdfd4d07b67db7fd7d399fe5b6321753fe537ed3dd3a1fa67dfa6dd35630fd66faed33cf3b4c376fd974c2990b6f737e66ea7cc7b6eff6cde0fb9bc177963b7732268d66b5c3dbdbf699a9a3bf75b08344b25d659bdf5b65bdc3dbdb9bb2f6aef9881bc318f355a8c8f6f42a35a7c75e3e8c1870c6f561da2a7163ecef3d0189fb847535d8df57e93eecf397b41da6bf8f693ab6bf7aab0267c3226c384445cfce50c0d06156707fda4a87dc1f0d2f72c73d3f7b9195b0172fe896f9c57c3be96f868d6959e9746f83726edb9b367d35a4fdc1d8362f5bcbb85eb4125d3d64f1de9c39ee3d21a67cc93b7d4a08dd93fed4a594106a8731261602148241d29e1ba7166daf4c64157265168ca948e4cb5fc6c964fbcfa45d91c89888e42fffebdfcd389c572446fbbb93490d7b67bbf3b8a77d0709396e4854019c1da1df4bb6fff4993e9e7bb5c82883ae0c2747d474bc767621ccd0ef85ff791a1f659ac3bda9c28bf71508437b3e74cd1f8a36bd592bc95da331e1b39b9461494992f3f2dfa48b790f3ff33a2c276618f6d85da140ce363c1d8666194affcd9c990367207198fb49b24cc31b19b26cdec8e03036c0182f9a3a6c3a7b68f1dfccc0a63f6528923141fc453ff6c0281ec59fdc30916994a47a339c017784af164f319e16ff4d9f163f73a68eeba78f8ba73817fb41e2e2bf0934735c98f6dc6bf12f3e8b5d86e91bf1b3cfb48bee8bbb458bcf248e8e5b3c8661acdb9939eee918e5d2d79c16a5172e973ee27ddc3c9292929292bc522a957ab2e96718c343de7b6f075fde0bf330a3249a64c2f38806703dfd042800c2bcf05e2f5edebd2dbaafc5bbfe7e9661ed84d709f7de9b65afa3356291788cf7f451535cddc41962e22f7aefe788bbfbf89926830946b9b9a12f3ec6e37c26993dd367ffd0df66cecc993a7347753397ff68529765af579e4ea938352749c648292edef599cac58b7749d92eba8923a7e8b8b7e199e32ffa3007bf20db5f3deba76c3aff4a9952751c86c761584fbffa388cfd8af3d59c5d7736fdaff66cfa2a52325d93bdfe9a893365c3304691b2a9caf5a2f3a025fe62a15127e6487121c5a56f66cecc312ab94a46d465b4e9bf4b37a33b6da3d54afa67f1aaa749521ce6a7dcddd2d2d2a2fa19ff6eeacc9d2419930475114dca59fd479358ffcd1c2ab8285252a92487e1a248497d8ca66ff133b2450777ab839bd55dcba56852141e9aa4d2fdb03ba93473786045b5a82826bb77d3ef655b17f77c3013b57e448a41f5e3121f0c45e9198a02c950143daecf026dda52ad3c6ba9546891f4f2df96fe2e502948c5551b5224724e1c55cbcf780e95e9553eb7a2380c2bba989ccbb7f497b7aba583db377d1565d26ab5bea573a8d06add88dffa969eaa9f913954c06204c0ff7ff750b63c003a143a97cf300c2f36752aafeae09646d208ce889b4a1f401895cfffc920b8fe934370f19f3482cb7ff20830acffa4145be710a1fa24159b7e062fc6b00c6737729c7bb4f513c2d89f8dcb858b8bcbb33eae607a170d246e17fa6b7d4deb55e47482bee9559f513a2776b97061a93c4d336514c77ad78effea4c78e2701b57eb81ccad7a1fa6add2ac8f2a0d24eed643ed46eb5522e71ea54c54ba45a3c89f376d90815efcec72e1c252b53a0831f6dca301defe30961b42981770d6da05727c21dbb31ae69436bad87406912f30369e524ab72eb87a6c5c7b7e8dd9c52f3c0ff3a58437866c819bf9d25a6be97ce9d91235420829a5f385e7815216b0381aa5c694039936045f1f9263c3f9da4e8e3f65368430632566600c88a293529a5dd06c5c9b52faf80e99714e58811c9fd6ea9a55d390a94fc0c053e45f028778e0d09e53e6d07ac8f1a58dcc9eee4cc81938230618233e849f1783c24a2e99b8afcc8b7c5d2b64680ec89e93aff8d17bd9dc839bc34bc89f775f6420f9ed78e4985154cdba626cf8ab3edc409051cf631b227f10caaebf6d207f508a0c0ec3f2f583e0b0681c30eef07cb0c8c76156ae8fcc873c64ccfbadaea1bf50f5db8ac05c7f32db6364892dd1f4dfefda9259ba20eea1befa8a5395134a631f3bed573a95eea47fccdc993afc989eaeaedb8ac8fe988afc4129f5baf732388cc3503dffbdcad5cf326646201e60a5d1560a6badb556eb6d5776618c6ae75bd6869c7b309b56068c01ffd6b7ba567d218cfa5327a4f3bb9170ce21398240de3063b07bbe03b1bbc65f36c9a4b6b68b31462637c658abf61a8f1abb278120841046ed4b0fe127134f397e76eab6ec61b71591f1667aff0bf14309e1bbfe34ed73b8e6f3089df11b35f6ef07912092cca6e1233a5f83c50523cb4add11963fad745b11b9946a79d469e5ff55bac9ea64dcb39fea3c7fd96fe94ade8b8c41bdb37cee666cb8677feb58e8813b175e8031ac7d54076dec6c642615c2cf2d43b1b288bb8fdb99fe316db0fb904157fd6be156c45644ce1efbdc61f74c36dadfec7f6f5f83d6a4e5d67d1cd63fe6c434aed7a1983265ff864353707696458c61d8741e4d5b41884768cf1db3f2d65afddd28d9d589e83811e7d17122f621842b641b9b33dbd6345fc9f6361cb262675be1c43e61c3212b86f6127cac98b23389a991f9238bb84fecd9563b8f7bf6b11bffb0ae12f5557fdbdb4f3b75a7af8feaa0bf6af6f546eefbfef94fdd4a07fd95bf1b09efd3bbe9ef46d6c41a4cc79f2fbf1bb9f143fd452027120d70750dc6ba263edd9666536b275292dc0b0c0e7071fb8381db53d7dcb08ffd9531a7972f8f9c1ebfd470d0972a7f1fda57e9b0bf5c0e13b5c4811d5179aaf22b5deef0fbeb06f6b13b7da99330b2eb43c51863a44e84d2cd4f4468354c9ffa26ee77fd04e5c170b98650dc377774396906e2cbd06b2ffd9ae3d42e17c7b9268b42cd5a19d6bd1cfdfa22b1941c3f8376fb64d82b1c367cd3fe7c1062635681ab69207fd966d3186e36a59a04f28abe904d73fc55ba30f875e9b6c2d8b1d37e90b118f6177b945f6bf56ac7cabe906d350de4f8d0b722320c1c9cda0f32550637c8d060841d1c5194917478991a0ef973e5fbdfa4f466df31a240c489384545fb8b3c1ce0d9fe11674a520c31a728481324c0000e106b8495628c3152fcdac7ee73ac3f998d7fba36a59fccd682c8d9c37891312619373d736cba334cdbb882041d010848369d1bebe09699360042778dc438cb32995dfa2037bb14c3cb9eee65197e0a84ee1afaf3736ac4cfe8ef928f886dc64ac81f8c7b3399a7512abd4aaf759cbf4a8f3bec5e29d3f767e46337aad6f84e20a6639a4ef69ff2677727914cffcb30c8d73cca0e706f6225fd4129ae6de0d00e1a76c0a10552e68e0eef03a0944d750d2eda21fb0c6b9ba65d8d33eced2d7dedeadb12e603c69c30c6fc38b7485f9041fdda90ec5fbf566d48f61be977f3d205136b60ee1d9db843a7f0f0f010f11d223cd547c7dddda5a4d1797888f88eeb3811e7e9008c3a33834203879042ac44a645208d229546111a3fd0f0a1f1038d224ea3c8ac62ce09e19c70464aefbd17c3a8a75deec180a53964ad1dba77b6600acd16d03974e710bd17bb7ace596d85753a312b2542ad1249128156e98474c2bd58bdfa9ca558aa413627b5b6da5ae77409290c1a678c31567a8deccf665e3a1d4b8261d8bdb49b3f9fbeff389db35a5badd78f9aad954e7ff7a00d41048a4af667837dc9120f8a407e025f5283709d09f39d73ce5a679d73523aeb9c93d25939cfb5718eef4c7c848d5c07e3d213463b8b79670593de36fbf5deabb5bfda0ad9be3a0ed170d4cab13ed7ea9834658ce74b18fa2fd9198deb22e492fe84eca9c31fc3307dbb1520300cca3824a64069a8ff5b9e4cca0964acd14c227e084931522a95a886b5ec49a286e408fe39e44bace150e230a50967c08a6934b7da2c5a6bb3922dad6c49afac0d0dfd75047fc58fb52558c52a56ad8f17f1577525412525704634c22e29bded289d6f5f051ed56e57ab6419b3106e41065d590d3808d91fdaabe3b567eecffb38c3192f9b6605084a69e723060d01f32d7dee2dcbbd69c3bd1bbeed27c130cc276223481ce6a346e00cfbf2bd039e64de9fd7aac00348dc54b3e09ec432629fdb2764e7983f6d384c0e29a514cadfaaf4f7edaa24ff765ec541c80e841db1d648c654a1bb92df54b511ea330a67c40b2b8e70b3a8f5b7fadb672ce6a758b8d6f975db1e6f8f3ff538957a2ec63f45d970061b0e55f1b3337d82eeba4ff526b468b172b160917a954693e23e95e252dd2a957a6fb39e4bb1562c56ac15ab8b9b058b050b162c5ebe8a858b76c3058e2a49c8a69d3f069e0e83a18a058bb859b6ed6b96d276c45a5b341d5b6ad608edaf68377ca734974a3d8431f063fd09c9cfbd8a46c379013d45f765fef7327b9848e95a31627f2ec902a716d6292baca20728bbbe0b8657ad51504a1b12f5806006d5462a7b68d2f304c9d452b39eabff71d5c88c5ea494ced913049c61e3f2a2b603db93c3b61b12f5e4ecef65964007323a70d5f92b47c560efdaf5b587ff4126d75f2fffaccbfef22f755877ede421cafe300f3abb7eaed2bd870d67061d2e911e80b56a32186289255cae25e41fe0881aa4f0c1610889150839220a1e3e30829c2888f0031e0bf000d1f1500053a25e51c255d020e0c308b4e16b4964d75a1219be902da5943f734e9f1829d5ae03839939c5dd66b827b06d4a1e000da1891520e1c08227413002080be8e00236281102e9831d6aa0ed60b459ab393ae70a36256a11f6f75287b20ffe2769ad429552ba5fe40b7ed293524a8ed24c6789ce4ec2b8658c6eddea1cf2058b88745882211692d3011e0bb0a0872518915463e2c0c91280a8401266d083d10e47e40e43b0a05c1e6a43221d70b0b30d897468b23f9737a121112463b0281499604f5cc708ab3148befcb317644cc9fec58940509bb0c60bf2e53273356cc743be30ef76ab1666c8deea1a92c795afbf1f8406eced97340dd8dbfbf7b32e08112dc4278c4802a746f6f683d0a069c07e061a4af6adff38121963df0b409ff040e25e4cb2e3f358b5707fd5827deced631a4a1e2f5fee3ff2e548b63f10f57a9499542b40e4871acd0f1f3d4a8fbf07fdfc34474c0f352c0261594b711c937e9264848499b0574dfb19477d56b9bffda667f0bf3d562d6c7ffa939ea1fe46c332258beeb142bdf6426a6495ee87cafdcdff6ef737bd62799346b262d13cb04eda1107d5f1d07eacfc0f1f3f5a28bdfc16e81f99ffa34710db234896ad743f567e7bdfdedda7dbba95cae31752235be97eb03c04e2fee1a3c7aa05faa52fe9196a68df63d542e94d6fd233dc2f3dacb13d4dcb6751e3a17dd4786c70a58b7bd3babc52797f213550dde73f190bfdd267516ba13e7d961eb787fd4cbbce0af5d877b683f2c5636a4e6a2135563a958ec78b104a43f68b44067d060f90b191a1818cd319f7a28d3999d8f3593c42d893458d39e79cb3eaec3dd89367057b4e229e18ec39a79441cb93a21c0845a73111672827b1e5b35c45354b29897250c196d2e5d190ffc9d83268b8e7246f1b12e50094e9cdc1c8a61b12e5b081fd792c907f2513ac1d85a8400512a042091a40aaa20792890d8940050f9650c51112477aa4203285c80da6695d730145510d60282e674977b2987d2ad10e17889a0cac0b20079d9d37241a22657f5e1d42e53e8ee5c1909182070018c34502ec18b5a1fc79f4637ed16a90e7864443a2d81fe7550d8556f4c4963fe55fa221481506120d41da318a4a652667167fde878090a86be45f3ab194be6bc462f41184bea5c0148e68c893fd45b653a067fbb35c3b3e0484ecf9255d33e3cf9fd4862063bf02f615bb588dfcfb76de6a6dad3a6ae4d31af9947635f327ed6e850208bda144dc88e37281c0b74b4ba27d400b815086a19f70fc8094399e180e0e0e4e0d324c66515126748314fb73dd5024634727d27dfbe3f0edaeb523727ce8cae23c5df738f7207c1a7f45297c1e2ec07083b42184432091ce109008872a2084f0e98c104a1e6c08657f786b41d93724c241cafe686c28f591fa33ee103ee43610dfdd30f2e410d9e064c787dbf415198ec95865162a739a096464ae014608f9d47084031c8e16101425090f7cb033810de86004f70413c5e53c3304141650c20a26b00410688004173c71c4074d8e000322c81cfcd00e683243646b7bea0f32a82132cc1e1371320c7f79d23d67ee3112fbf37c5074312117cec5e29ee5e258350598b39ee3644c49cf585d6d1841662307148a29694ec886241506cc31c3bd67c3062a912b7c8a4c6d486483ce9e1b12d99023f404bea4887272f66943a209f06ca8e1d04e903f6cdff5e25e2743c6bd28fbee28c3bdf862ed67a29ca46dab8604c7d75090bf1799971a1fcb6543a21c25b6b621518ed0fe5c9bea10831bfa32475cf289cc955b878a1118f0200303ed8864051de168c7d7ab1d9226de80524a8bd4004385171b170349b73a8410c29ba9e5e481da3777620a52ca87704e582780b3a366e55b16dc834c3c00875e646c0854d481a2520ed94ac7cdfcee7f36ea6ca523fee7ffc5cf3e7bac7fcc7d35edefc53a78b39ad50c42a17bdf5e9d63da700f564af7dcd45dbe85687156a1029c1104c6880f5d31c0282f36a80f188665c9920df9736d39270b6adabe2c82e7591c6a02f9637d3e59065bbebcaeafc8dfbbe274f86f234e294f3f37c682c7d8f80b834d84625ef017f658db6cf0902f0cc34a41dcc3b06d0319e6c7b2c601b7d0101387b93d4d64c0fe5eaca4fde4efad3dd92a8cdc2ba4dd5644e62163e28fbfb0c7a2feae9683bd0c0e737aec83d0c7b2ff0ffd1376f2f982bf89c9f6a2755b11d9664afe62928d61d8c72087f96eec4e1281a2120cc330ec312c1615993c49fbb3f1a6cfec993cd387e943afd881703e1039be3bc11bda60974c22f33c48892460347485cef461f6f04c1f7ef24c1f2749443508e5db4118b6c51a665f54677455fa1a4c5f0dc3a65f350f4efe38d130304454031011ce11cb635ddc1f0484ecd4afc07c2dcfe2b9e7e29f94ecd3632344383d4a86ae48c27158f7711bc330130a8542b5b4c0b04f5f3504602714ca86b3e15028140a05034a7f30a05a72cb9f744dcb9b740dfe930d67c3ed16cd86db186b29161c974aa552a8148a85858545c300510d3f443851e25f9c9c7d3fdb360e868d5ac9aafcaa9c5754af5ac9fac32cdd67c36d95c7bfa13814eaf3a3b437713260e04c12c8be4e1322c3f787fa47fc1bbdd201a1fe31b74f87ee1307a7b4b18d63f7dcd0e5a415c71aa466247ff89b53db217f78734de299d152c5a49412253f7ba1aaa824ae556541ea14cd00000000e31400002810080784028158389ee8c2623b14800c86984c6a5218c843410ea3208882186490420610450c9901182129b00219f3a168ea7f6e5e0f5a3d6023f0e03bc0a63a2343c1f6371a48a20fe3703ceea998ab3a20caf8351754511e0a100b2b3182c418cf202714dd977445388f9420f935084e83ab03843f765e082310130bd568acdebbebe221669393e04e5df47ce472329771e5f4b3a7bc7eaa5540f7ccebbaf71cefb1b0be816ed0f6cae31e76f816d637a495b85a3fd494cdc27631e506202a89329a68446eac468ec898fdc3a9e3b4f99ec8a06ac3445ba7173ed551c8d5c2d23dba73d623448725e4781ebc0e572ffc3107a520df80d0e382ab956fb6c1fc928cc814a8d6573ea959b37bb4607cbd057598f2acb4d18fa40ee8e887a7c16929b71d1aaf4b22d2c56bf0466dff9a64dc462c765808fdec03356ce90a344b90e0c6dfd6bc9f15d00ff8c1e65d637caf154869e1f7c866defb5785eab096175910b4ec23c86e87d29f12875d26c3ebef5735681eea0b8e20bf0f142b5551f4c11e4f7ca9b2d33c8d2c14a6aafe38ae8f9cc5a38eb0e1323d511dd294b5d8afa5d50d571222a97f098780bf052c2bb170303bd679112bd7cf667680b097737437c78355a782f82781743dd34bc21409a77053cb17b7227e88e06debefdf576d58fecc4b187efdbbd20e4831b9a20c4deac762097e4040ef6b64a3c9b5ebc487708fa33932886bbfe0fbf8b58d5b7629023068bd0ccc4fdefb368b654099c2ce5706750c8a5a77417ed047eebf1e02cab273338190a7931a17340bea8a86dc9471e85128f54608631e9b77c0498e5830c90cadafd200f760832e590094005959e2aff05f6b59668d1edfb6efcd87e546fa341d0a5f15ed39152656200700f172168ad592f32d2b36229c999af6ae7e6158a8df3a17acb9b899de9b5171464b28352e79bc0dc4541803e7a171d6ab47d2cd329bf858a57ca382eb7a408e22ba30911d018ec7721fbfbb0580ef498d2a73d4f5c373a3af36c2c464d29a7da100908a1d9a2223c6b95a9713456e1d17099c6a44b19a33a79daaf95f02e9683433344f49fbe5f0018eb7da93bb6bbcf8c356a696a33eb5b5fc9bca43fa210e73eedc061dd32839406fa13841d07022e63519c4a392e1887d92c5ad940f711999ad26530076472cfa2bbb423aeb94de584d5aecec1289a8e0caf6c87e863759073baee1a1d88eed425961b8e3b31e34bd97926f16e1245152bec1760a20639a81d901cc90990695460401a1d131099b38e3469f5a649500dc7ef2b6e2bf23193a0b82b190d8452f0b5d9681b52c87c6cdf690117555510f8b8ec3cfc3112cabbe9fa1551c2b56ebbc1b895c4f432b3b45b9f8c72346898eca4d3b54aa58ad264b7f78163f37b8df593ced2d7adf911e514a7dad6174f421f198822d507f1415dcaffd04060bbeb35ba63f19fffc8d10d5c62dc3bd810f20704e6f8aa68820454e73aa2b9575707573245694c526236f849838a8523d2fa64872f1de420621ccc70f7b1e7c4c6042b3b91fe3e90d148b7900f405bae40db99eb0e1b7f5105088029725d29c7b3aafb906d9b7d09348430ab621c29fbd3ec3501656b7f5179b9821327f9c9827d03675ee128681c037e4829e79b13391300e9d3b402894d08aa7a9d3e1097aa22534afbd88d9bfb621cf9b79316776b340e4b82e06043908ec70fe3fb72742bc941950972bbdb4cb05c1f24b974dc6a982b473715d894c30d598304c300bba9fc78e7cb1eb499f4a84f927f2f9360ab1e15e7ca6631b36832f35a7225bbed26f171321689bec8a4823d520596c4c56eb732ebbd5b4c1a0b6a42ac4ef9efb126fc9ff1867a5fefbaf18e0e6b80fda524669d0a04ba79f2935a677cc7b3eed219d2e837f018890a7ff4b804caf4dad77b992ad3daa6b8cab5bdc73b7f565830565620cc3b57b3faebe4740fe3661e6d33cb7db8e5f0e9b2c4d30a4aef9851901d91a8d660c8b3574f3fbbeec302de23ffd434c2823c27864e9d0d90053574f27174679997bb304794060b8368c1e2a14ae9009c2bafe9986349740f37dc21f335f10a7c400cd92cbcb5c82f7d15b3813b9396bcd851fa4ceae812741efeaebfb21070dda021c2a317338fc88ba006e59a4dbcfe365d83ef3a98a197a879a11ddaba55c8a7abbaf86e0b012d7e77c1965478e3786e6052923dfaf053be7a4b1914f44e1efad78989645ea7d7a4dcf786037c9334da76617867239d772b82dfa6086282afc1e419788b9a4b3a5e1b703ffd70c1a111acc87d09b8123824108e827771e723c05ccca95b9282791a1e645718af82c25a6e28b884e60a82a25f9a4dacb35005341a5d30879460d794ce305922641a74139a1f171ec10c9ca0bfa1831e47295ab47bbea1dab453dac712b2075bd98de167aa8eefa95419178d12551d3a5d9826333c911ac31b689bb7153eb5f10d47d14c4d380f9aaa5e0700c345e99865b6c9ed1a5b080dba6f57094125263b8f9950496231709194082f98e7b86782142084437b1457241c911678a3dadaa500de73c6b1bd5bfbcf6989cfabfdb97c402781ba1590ad43bcb4c776202d739fc253199814107ac8b479b0fb94f60f0e29ae588da582ba3f7b353dfcbeeb558cd84f2393dc817c92de217105b6d194eae80277d221c8b4cc74eaee3bd4579f23e44814ae0a75acf90c77b9bc2278dc39c30c5da6969904c4cb221852f601b9a4a636eded669eb29c752f37fa1d2fba8bc5817755491ddcdabf96679fdd7530b0c8a81fa0975d0608024ba20b579ee959092a753338c38e6256a66d2439ade4174d76d6e20782dd374ef3148220f0c23a344368922716c9a37de864f0ab43e9901bbeaf2e8498905c4333c5ac22163b3f20e01534f63bf4b2a840e0a754d3c927704ded78bfa514c140dd911396235c1a74c495be866ed6d15739f4b2bc41f64a1dee830c75d2b2459353b8dd2e2fbcec595ee08449ec36afe1e06a6e1d53758157321ffe1c1badf59d9948cf1fdc080c893014a92ebdb3bccf9be8a5bb0f01841ea8dc12fba1b6d7473127fe72beec47234a2457715e0413164a38b494a09fbb322b85e872f1b39597676d6f89a577cee816fa2314552305ed4564ba57f13b5a0b8549e0dc6c945602cdfa6ab22326c909b5e4e7b4fef704fa0d7fa5babbb9a92e289fa4c512cb98320d1f7de497b0cfbdb563948ebfacf424c23cf7bd429e0f0734ce7e82a80e61b336d13d00f532bc85583a4dafd54cc244d7a0bd9c4a2156a73f5b044c6517f0172f332113aace8eabdaeab33134b4ab4b324617f9fff0de91591af77718568a00fe0b24a167f2f7984319eec82f5bad126c5aaaa3c17dc79f6f4c8f5d2d96ee021998049f5eb34f4e432d5263bb736fb416f5c602d0d2f4a78d98d399cf26eb8edfde6cf748000ad7d685eb1e9383ef0f8b027c7a4184ac36c8d8a8c6afe82b6cba7b8333497efa186a816aa081b9488f31150d882b440c6c2c983cbc5cad6c68f4c371564da09df9fd53722f8fc2029f0446e55526bbb6a135cf00f0a48c1029acf01ad3ed4145376245a20a8479089cbf5de181337959a94f478bfe43daab28e852a250be2d03aaca95107a04634f4c2cacfa519d38d0f7ce80955cc600e997910473a85c23294f1402f8826dc0d8e535e0b22d4bdee52a900b92688d404660f03b936b9a9947150e0cb7f38a945a188f44962bff7c7d2d73776311af5677003754dfe2e599aea3cb108a1cd894afe9d29c65d335c08cfd0b52703d7c1953a19f00fa6ff99ec48594e848b15ac7df3c261bc9d33003fd12e48d5a6ceab9ec8da65cdf3e352b474ef42804004fbb3c441a19a09ce37964957cf14c9019e233e83759638380921e257746649fa769751789aae2bb790c6f123f782c59bf2a2cd13b85afd3ca5d385d18fabda7add304a88e0e96cdbc393812feb3497bef503aea825412dd289b13c343ab4d140d4256110125410ced11112be343ecc406cb0bc83da9e2e3ad1ec49420119147e68f4d18e4f9d71520a1635ef7504255bb3fe853183347c99e55e870d7da73431c2faf02b50ee1dd06cc7e57496111a374be855f9de96247e7898543cddf475e00a0d065bf43f02687da22aa4f753e44292d81de9cf503954029fb0c40f54fce46cc6a581b9e1c7e587dbb3fc2c5f69bac964d0f1c41ed044e3be605239c00fde001e7d82ddc99ecc67e2a30742a7981e45ce3809792a828c1d1702b5d2cadd07220a9d828470d12c64f946d903a9a25c4c19f18356854e7c9cab6f4f765c0bec493df27098234ae84ba29fa92d2577ba8379cba363754b39d2239ef0239dcb2582c2de1a18bbdd5587d88d2b2bcd6f710a800a0997a0d38628096afc268ed32f324ddceaac52342d35a5989e67d96d302c05422d4efc64f1bba5b510ed88e273f9d3c6523bf5dee6384703caab1c31b9e73046cf2a7e8171aac098949e3abd961e9f81b76779863b852c073f18a4f3fbf40a486cdf3d86f88e260fc63448272b2a94d7d6b05d20dc4cc8eed8cfc5eb55e449b809a8697ec227f216f17ddddd8fc9afd225bebf1da130d6bd20aa00593f130d484aa04c58cfd77e656f8a6d52c4d58128c0bd53eeb566e6114582413c6285e806ad37a87e345b035c610a426d3d7961a7f98d6714ab9b343954c9cc820f879ebc0040c1aea7e0433e8e72b236cb3210e804caa33672d0625733734d996958c6813ba96e92b5fbeff3742e7a0eca35ee5e15a6e13ecdd550ccab3146c9f7310619aab8fd592795756fe9880e95b24f78aed80139c38801122846e4b3afd0ba6a7f72f319eaa696029743a884409f5a511e316c4e41e964080e3c751597cacb7b2a684250120db2ef975a2e6ac97de9597f6e3a3af8a8844a182a4e266df23f85f32335d6b724cc6140c68c2eb2dd561a854ba67b3889494957077cf8a526a02d603394601258206cedfda037f715860fa5cb9ab75f4e9e190ed2b6a484ad304ec91a7ffa21cb03bb5364f0eb5a12a293aa2eb8eb0d2d5b69f53e9c6192ec67e967b236c0294ea952b86e8ae92736a18d40c0586b71fc6479593926e9edb3e3a25fce46cca06d140a5ebb98734a146180a1d6c3e71d67c61140ba5468a5650da77ece53cb0b8c42926dcbd2ee755f0d7067b1b09d9d0b1d8591ec6e505ca2250a8eb2cee430400a5e573f63039d1e265d2f1e4a11d688a3bff21c9fd05925aba47a7db5cbb5f63f7755066bfd4170799b54e28095ac6e5a0d202248d98e9b4d53819a347cf85b85e689bc49e340461b9f4c18feb0051ee508e1c9a3a17e6c9bfc7166f3405f4ff3ddd82bd9ac675d6c4fe2088e532483e4a6ace807d9c7a6e3f5eb1d6bfddf2c37256891fefb3442525422048ce9e0983c3000e76492abe5338b284e9e52bc8221a6d1825adc5972876d5c3be009ee7053c544ca5d1b4945e2734d846813b1aa191b6b36653b50d6ed4858c6d435bacd036e93f2038d004751aaaf7cce7a682c587edefbfc7dcd27c37c02ec5d29080dc8265667a418a2409241799441f88f5484c3b7fb141619f66ec664c9ef392162ae59216819e3e3b3a82ac473a38aa198013e4a7654c5f1d6114604fce0e2562d78524d41f6085a5c6adb72d39f681ae55c97de8853ac0ba6e441d09f6498868b17e542c4d034c4b34035a10c61a755f1a84cc3600c87201a88a4a45b7f3e1cdfda48c49ecface2a15f55361237158ed253048dd4fb8eff4a315a10b2aa378bb71a9ce69430b048f3a8255e7c2b3cd4be79be912d6c40f40e75c32d26ff2288f737b2eec942623f8b2e63c22a73f54be4e30ba311b102db920c8f6da7fdfb9cc34aad3600f87db0e5af99d12aef4a40dce0bec7ceec21c148685f14e461d01e1ae460942d236be131dadf0fc219256fd62dde11ee76e9f9bdca5c60e01a0f2bb7f54d8f80ac725b481b01980ac4ccd560aadacf3449dcb4ff1377a5e86d7c72230e2f7f2210f01fc376950c0197c9f59ba311e259802249e38cbe1495152ccb61d6420183d59fa843a7e1fccf92aa0d6b306bcb20726b1d10b119e0df0a88c85643348b0eb618d3aaab9dfc8c52dcf9004de6b8d8cf960bbd5e37b58ddc5d0b99d0a1bf325423926ede6973ae3e1fba27252c9da3f451372550b52bc92797985dab39a5a18541362d564df5f70e743a475554b3f55c7cef502bfd05200a2ef9462c81720db26ba0e5a44e8fc3a3854b585d3eaf81f78aea3b155007276f81903df02ab3c80b098e5d62dd1e8f1ddea22706479439ea2e8be25c2270d76b9638c765885baee5490124301aab2fd93e39118670363460182906b90f88df2721e80571d77dd5d81f3778731021c35d8b6fd3b46b922dbd07c41adf44cf13917f4b43b5ea57ec175034c5b9019d9789fc66d6b01db1f3ff93c595287a03afa1e1f8477a2ee824661d479eb187884d03cbaf2a0f4befc789fcb191946c40d89d1811d5cb9922856970ae47708190ea5ccf820594cdff3e615e927242c7149e4c12e0306de9adf7da32b0e3dd0aa3fe4ac0031bb497dc00ecadc01bea45dd0256f2f1d64a61b4f10e2a7a41242f59a1d1b56547df4cdfdae56bf4d1413c914fcb6ba3794362d0cddbe1345590d5979bfb3ed4ea73b75d0491f697890bea70018fa9fbe5248d9823f2f1c02a81ad49e5128c938a2d10dd17ec57a3903fa4388c385f3fe49795b384ac196246b794bb776db21b5cc7d2611c06244814ced9c0fc6f1905361bcc3fb8f17e3e557ec86f30199d98b8b0caed35f993e786d4be417bcc668fb1f2202c74d62feb459fe9ae03760103ed6507b4b7b33574e20f2ab360590234a295ea205f54c0209296925fc5d7ddbf80045da5cfa9cc8f9c9ef1e43a447e033ce166dc80b2b9096fc11aab762787c269b49866767c9daae10c0bc5f37dde783382352f201359c158132027239a8c130c505d3fd6aff1274d6fa78e8cbf8f70e4da70fd629fac7af09d1b51fd26ef68382fac8664ab673e303c8a9461eb2da2c7fe3f96b7acea633aeece8b6c07bfb709b970bec205f756c3929c714c0a8d8957ce2bd977bbc6fdd8ab74eff61bf6624da9feba65e692c730a142db7011ad8744abde49e50db1f90544b375fbccc7c2855acf0b6fc577b3cce331e2cf8e0c934a71192ce7528c31e258b4ae27bfd8fb0ec9779f3f35cf2f5446c3742a49ca8d69d42316852fc2fa3ee2ffede00a92c200da60e1cd4ee8661ef2bf0fae6b0adfa294f1af17c79e9cd65e009b75b88eba6ec7a68d4a031d5e61b53b537c01a00ab809767aa4888f86c579b6d84fd160a36d0fd08cfd60a6326a0d9a64c9461c03f9706f19023e45f6bb8b6a99270420737d98d3c2d3dd1497fcde60960f128f94933fa09ba808fdc677729b1351aeed322b73994c08a471228a5b5a57dc477499116b3071c3e3cb831046dc49168530a26f7f2a9a1149d10c172eb74f86e342e7700bac9235f3b2a7e9c42de0ad1119d2559b9743410f436dd887a71926a974962da580941508c2cc9b1e850e2238ae3ea2c177b1d40f5ca746c924e7f3353e31672ee739b4eec7d17a232e452c3864003206eb7262651ef351d1745c3198e421c00c427485d2caef272388c429a957b5d19f1f7eadeff262c287399baba606aa20566e0f56e45ee0eb66da5cb05ced07e955e40f6ecd4d4895561cb98b2266b10dfce204aaafa974b3775fa74eed16035f17e367d13efb75f6cfd3cc665db140b42383732b55a907a48e4483543e649c42832a585e46c320d5d772d604b66de3378f9f991674f2ff22ec1641d6c4f05a030d2a22155f8291a9853a6bc485e767f286dbff13af0385c35dc382bc76586db5e9e0226ca15e3eb1e53c3c4cdc60885d869af86dc3b370a933a100545bc01309b5a78e40d843e580661440d2bfbe1028a2b3947584ca5d3e48687b8c0f08733f24c9c6d437141664f1484ccec743171e8584394100e2dafa05fc19653bbb33477b3a03240915a5b7f19f27884c109830d3582f9a13f83e9e25caec2566e15ab39bed72e5646ad12a6f085ccbc20d50c4bbff257cf6984e43d420aa5b027e3a36bc4dc42a41f6b459ac9f47060115196b4c3e646f5028cd46a1de9f2b639cc2382940393f46f7a889716f754735828448a8123a56e03bc9fc02374303c39991f431d11bb0234900adc59e2cbc9a652b17af36ee53b2049f028f9ae084a3d1a2f6f8227f4834811025913f308fedf31b129c875b2a0acd16f88f1ff88c11356bee7c324617760e2d551f12b6a8f2dcc183f2c45533f8c3279c832090b67926b63506a16b189325e1a204fca985169aa18b80c9b7563495b61b78d1aaa6b1a506cbe000fc3a7f09ee4fb80c39439e46309f62c3b0ea2792d6503095424ee685483b0cd352e8d72d8443291369d2e0ff560f8512302b788907e0fd3bc97d560b301e5980b470d15d717a571b89be43bb40095ff875ca4a2abfcdd19db2670f04a804aa0b660e44ecf6ace4d156684e697969a158cdff3f002acf7e7d89ec2d9e835ae099d6c75f6b13c58a4c767d08c13ad5af1521c3e2df7fc82c891c1f4c59a9dac87d6aac59b5231d85d4258cec1f644e0e669619ecbf4458c4f37414b75f30b700301831624ca9758add882db0d543e8507235a221d24e8d36c8592dbfc5d5ce30bfb6530f34b544f13dc7f334ddb98cc694339f12a833b1c37b2286180c75f0670264eedd2563df36c7beb09c1025c77ea14f962112934aaf03d1e0b75cd4aee81ff43063ad2eee0d8b9593a48287a24f0a756150e34269f4822418ac5196626c3b86e91adbd594b4556296fde4399cc2f03c00a6c199509755cfd3d0f3e7a53c65ac385f1b7e31fac692a868e6a1a50c7dcf66891928d3bacd8f379aa29946d4a0f064861cfd2f8002ab8a7c043ac80f0e257af7a623ef1913a00bda96e2a7e0c1a08c28f81dfdc39c9d207ae0f9decf87ff3e4c4dd54b3a2c6383d655ba937715dc34aaf8c44ef26129aedbc223ce4a52f060cc1ab2e0c3bb24a1c243870d85edea1c69de4a3b6728fb1807215f905a8e22308d0ae591813ef67b2372decffb6ed09be054e3cf389c935298d053f88e8b5e3e41f99d41bd8b98cec9e17da90a39f235d07bb9eb14bb1b0b1583a6eaa7043f25e05162646a035243663c596b7a51d3c59900d03f092da71ea08eb5f56a1581207a5ff03f838aafc9fb85d3ec94a393e2e14326132d01ee5b4da3bc125fcb0180e19e08011a943eebe844feb2b94f76739406d68cf57e3331e4e16c507a40e643779017c809e0eca96840af6640197a9ef431499b2196e4feade4c0d02835bc4554a8e0b3fec55f6ab80c4487acc06371ada0eb5464a34b2aac026411be14c2e297028d2ccfa6e9f33dd03ceefab80fac85c01a981731928b29b5ed76d50c0e4db2e585b9e032ce28d5938b297ef2d904fdd44d5869ef2552ba01af6f0d901e198d688bf0970a8ea460389b00e5e252fe38b1c3690e5306d87b329ceae83bad4930edd06313e519185a8ee38e108e7bc7c6beb3e7835f17c520e290d9e3f2e1bd662ce4e0729877c21ddecf6e9934c912c2107078247b00687a7b9b10d5d1e3cbd187fcebb633767c85582b839e31268959c899e67196a3b388719d40ccb8d860c100bd242b39e685f49a0b82bf3de1be6e82228c0b5cbbcd01d6761e60d204a2cf31352607781281e8165f8f6f5a6e40fb3296c267007bde88d58aeddfbf1571c42e9a9733a6f8da2121a420eb4804d8068db31bb77f75c3c6e6e3e5e1483f0bcafd9013e369cc0bf4316b6e5a8106ea7ab67933ee357ae4d16340018988109a53b22fc4fa0b95f48919d645c0cd3ce7ab1650b14632c3b3bdda6aed62c0c5d171f02d165a1dc689fcfa02d5503b2cad9a7bd40d070f90de3e0fafc91137cae12080b4b134c0c173b48f458dd2ef825c4ab53f988cd893f42578ffbdd4062f93b6ffcaf05cd3f580eaad66670927d5b3c21c98caf67bc1bd6fa2638f3d204c9730f1e23cf852f680f9988e6475549f701342f07113a84bc2022203b02b20b05476b716daa760d5794002a2cf826636d4f714670434321ac63f35948b6d4b245a35422fcf6fed9a272b4647ae47cc22fcdc2ea9099ebaf2da4f6636ec1093ebaaf8b4222657012806e7ae492b1de06d37650da6d083453cfd8e3112cf3d620e313e86f030ae131997df28d5282f91fa578083432741e60df0e4dddad9029e74e53c0e66c7e1f363a732f404ac47c92252f229ae9cc9f34d435c03adacc16340a9a595dacdadd6ee37ed6b60ba3ddcd9c7c4b55517710031783b074d6e274043c39d1c3629bb71dc856a597b287594e5b87523b9d94ea0cb9e4483d324690b1173aec2cad3bbcc42171a3e5adac4c496bcd3a2a53eaf886b21382de02f37815bcaed4fd6ca504649afbedb16398bc7086f542fadad7ce5a4cb90277e6d6e7f0de23504c32f016a1e172dc33100f48bcba65fb397452f6c70b606cb4c36ab4a666b802188b557a9591abc87d91ed8175fab4e845e6086e7515a7f58b2fab7f5cb4af78b073b8e909035c8c1bd06d8c75e376ae3a09b388479a5682e3709c8aef109fc02819076fb6f048b00f52dcfd41b309924bd03f22bc844d24bf96297c1a744b256ca4e206d1fccb6ce48b3dc0091a537bf434b7a317cdf5880e45f87aeec1c16000d9311b0fc0f5df1cf399411a511fef98fbcb5709dc051877d8f9d8b3e887ab71f2ac6f2046d0286afab1839f1dc3bc34bf2361dad92b6478c92021f68c3791be9af22a07e6ce2945f7027bb81e4fc221d515f288710cd27879f670dbcaa9365ed6df5b8cb9eeb683cfae6764010182741669ff14b6f0672ecb6a4a2b6fc186d52c47bbf859fa7a9c82d479d596f8d85d7815823f1ca008dc9a4e9e3a8e1372c1938b639f8122e404c849891e5ff089a726120a64b100bd1635489f797262be3a019d08f09114af5fc8244392a8fa5d23c5a6774d3cd4f5a008eee65536086ca22a51b443ab9f47a7018e80e08c4420364fbe30a1aa1206d8326a97f479537343be71a3e25755c9bd26b13f570ecdef8934512e149095d0ce3625baf956d688db79eecbc1ab6c0411ca680ce4add11ba1dfab9f3012f78ec95e38f5c495315dd7fa4adc3d5514db829e7ed946e4c4a284a9c147aad14563548102feb29a430f8a01b310c5b7ad9a0529d60d9491410196979353647bef2516b651857e6847b35151054053bd6f7540e8746fbd09705e5ec0d99afaf0e7ff76c8bf98158dbc501b766a5ad2f22b54c219e3b7b8dfa862529c279f4b0e24918a5151558cb20c31f1eb3dff4db4509033f6cf710350c203c2d3c4c819d9504a7659ee3cf9faff4e81c3cd5dacf60653231e1d815b0d2283d0752f31757221df96d7049544bfd3bdfe7b68e1fcabcb38dcc961a4b1db16bbe662bb4cef031c9089cdef792081ecde6fc1881ebe244d84a96ab82a833db367bf1fb96e5411476a63bb495b99d2a3685e23ffedb754eefd2c7bf1d2e4c844b3cbcbf494187eab289b4b5908eaa9d8715698b7e455ab01fb415c9eff30acd7eea73bc6299e4614d341497cef9b2f646af7ca8402bf16756de453a51254c88fc26ac139708535cf5b248975a0f22ec15bbcbec0fb328fd5c531049f4244cc1958b882375d9ef80aad60f8a9ef574050b10dab943f64c163947c22bd067df9afaac413f16166ae250750002c4b76b61f4cfc37acc8d20f0d62e494967714fe4366c86dea7606e412281f140062a6e7ca10743fbda752e82c6ff69dd3a33bd00c7aada2a57613295d29fdcec4018082cbc1f12c1ae6ecd01d1ef77b007ea9af6fc43558abbbc7097f2ff9bd0f77c45c431aeca3a23e811709998f54dd842f691f78adc4530cbe6b414f43b84bf15c0d84c2db186f11b7c9be92ac4ca57f56ae56701d8f40f678b3cd055211cc3d9f09912459cdca58c89a2273e055a22252f7c0a29d787ef4784ee6d3c8de72e45c58213b2a13702e7fa6c84b43971962e3b93954796f44b7690991d1006302daa7cb0a789cd4b7b566703e81184467bf296322996d83c3dada4bccfbe8dabadb5f0bb29b92860f04132c2e78ee8d855f170f089e1c5750801ed91891cddbb601a07e8a728f4ab6189f6312c3bb9f85e95d02a644b4174984d43be74d97518825da674ecfcca9763c3b2a972d9db99589b047260a46f1f558df1fafabbb717da2295f59506a2c0b79a704f4e822a32b5a1bb364d5cb01e68d1bf37b98cb113a8f9768539c7698fa4201cfa442ae2b07dc3bbaac96d828307790ea6ebf6d3f81093bcc419524200ddc1f3032ad1aec5a551e0309960ce71a2098e15e6ccbd93cf67ddda62afc7c14871a4923482540f1e76034dae6a228047466c59fe9e5916fc783da42a843465eb6995b59f6fdb6cbf138dca731814c663ec0045d6e31e7dacef3e653e15421c2a347ad935f0113d4ec24d9261cbae2544692b146746033a81524bce94e41a9b05348fb39b8b021be7378280415c2cd3b82f2f2de31017d9992d91f191d82032467dacb9eb2035c5d1c393f054e7a14bcd0441c07cc1b5c73686e676957f884c44279df7d41f891d1126a52b5fafc0a831eec2f0cbefb748232b5dea15de0cc5b89ac6865b6803ae5cfbd92e602e10002b2e3a7c0f46b09ba71504c570a4e575d49df217e7624c40b8b4b644adb6db013c260129c0ff9fdc250940f232262a2d878c0cf1c128bcf8a42f0b258c81a1b7503f98bf2f5e399298ddd765b7ac59a13fe2fb75b4237812fa1a9da33a42731f6cab8ee9b928d03f2c81c5cc431cf3e09a9ef2041164c4b9ac680fcb61851dca6ff221a888109d1b09d1be62a9c11c5ee42bfde2e40034b4ddc285f21d36543dc2b0f41aeb25fc695327d0f3e7e345d327a66b4c78ab61377f79ca8aa7a588a0756b5a024cd7210f43cf9b5d63141970b5945ca6253edfdda567cba9cbfc2002d08d29634b17b274bdbe15891a7ff95b8213b855caf8bb77450dc50faec7ffa38b4f2d7c3eed307b50d0cf6049926538c8e890a86160a4f268365c5225db3400eedb108b017352ef06604eda3c9f5ae44dfc5918fcbe8618f5afbac306048d4f5d61d59b6ab42b42e99ca7f927522ff545f8a3eb014d29b58e938c829efcd5e266a6f60ef6e9da156be17ed386541268027241bce13651a3c6f35149f0989822e03ae41acf8e7f30f12a90415593753b739bed0056473a7eb28f999a85a66e1d38c3ca514d7389cc268ffde171dcdf25d8652e089e9fe6bed3e2bba9aedf20499a0797dd871ff658bb525994b227f117d8e2045a14ed64346c8e4edb9fe6491c4ffa75e79ad2ae70d91bda0f76f24ca95a71b12d643c81740e3c6c9a9bf0fafdbd141a105c1d6e9860a806f639f694d91a5530d8e6c21fca850f9282ab3d22f45a6894d4263a4a9192cf1c94df053f65891834463413be899fef0863d5a49045bcc240914fffdc1f2371c33b85800c3f293519f2e27a8bc6f6930220c76a41a0744f2bd858f8c7797de04e692897ed155244015e0830ee42f60aae30f6c7385bdb89ef541c8c9fbf0b79d0caa19a4b331c2f7f8cfe0d93516d142a18c6223f16a37ea4390790027cdae7c42d06fe0ec073b5d24e2168387c62bf0498c751f2935cc6d48a2099d85833f28467125005a1cbac59943a205853a596b67142e4c90d35ffa15372a571b8039e3fd1e6d5b380a7fe830d4011e11e33b41f4bca6a7328a0943e43a7b359cd38bfd09cd31b4379b583ff7181e7a913070bb044dafb8afe3d230ee64aebd597df48df66a026f938e8d10a898e1da3fee0973e2965d324d8b78d6e7269d07a2cdfcd7f0e3dcb3497387d0d7937c6ed86876523aa8809df57e21c47906463099adf6e0cf05f40f87ce806aa98dd1849487c67436ef4160711d87843e4eb439e822f9314280f37ea2299e4a82b8c8f1f02047ca16198bb06b588b6f05b426cd405a31520d2b657ba5ee3b41633e6eabd2b23c663aedc282b8100f1a97b784b4ddb6783dd522261031d56869c056c3ba638235e3260c966fd0f73830910287f16e6b9d92be1c37d7e62f98bf91c98cc339ff16e587d008e372fe25d34bfe35c4811bfdd7dbcf3b064009b5a8439c528e4ec4b887c227ceb40519e5f121da40ab4208e191aa4d9c7a5987d74f7a2457aa690b60ba1c0b40817db61c237c4a499a878c043c76a9f4d7a2d322b80c1eea37be2ab7ae37dcd90200837572512797819d7d39ca0f6a60e1a6437b0682a36d4f1166b10bee36f308e0ddfb9b2950e4bc2696f938d3b1ebf88b7ef0f5b3a7b2f23841eac824e29fb01bb0b0e07bf7c2cf7006fe24b9322055dd9843e213a01dde5076e8abdcc94ad72d383fb8fcfdff1c369093d1178082928bc5b3a3360bf044edc3ad0c02033e2b5c7f1bc8efa407f18bfbb0657a031429b5aa0f143074f460b546dca8709df1403a7d8efa5296354d536950da3a2f5c8e605ce21148ed1847ec6a1a856491a687d172af943ec54a2b200d8f5e793d28de2356af1fd26500abf5d9c2b00bdc9c3a2bc801ab0db4e53c39d54b1519405360c694c20988f691bccaf0ee83ad37a5c31354fe8c79a3e0d8fa09c329820f8783d9b1766b67924d9231a8fa267911af2c132df338df504e099da823f5507c4a475f285a594f775171196fd4cd6fe27f67e75142182d8e002dd8110bfc3ecf0a0d33708ce6d7d765478421d29da86066785fe620fd33d2752f4c8c9e9689743aeac9c22a391ff65a9a5e21645b2df1ca8d637e8de849894dbc9325a74fbd6029664d519845340babff9b5480c3759d71f97591a45d4fecc99392f3131f3553125ab9b19f81d7ac952f0e5b21f5ce6f67aab2a33d1958cf254663f213e18b65b9c023687b1a600d548f6d81f5b959b883d1409a248a4f2356ebdb22515de050533efd9ec661e54fb1bcadef3a63f143c506b9d0df002dcc5db180703294adebb066bd26a6de049b676e594ec04f70c9983a1139e9b952a0743b46fa9bb6bcbec1b2e3e360d794e5d84558dc6467e96f4df6b3c7f1cdeb3e7d524fe52255bf26a063c0e0f986b5d357ac8bf5500ac26a797e0581af91d8caab136bc0af8d32d0d7736b829cd5c82c81f15348520be226048de2eb75ca55a7010074d222ee2bd391023b0c5b2fab3b82bf23c6d633ae6023013dbb92a68950cf8f4e093447e957b351aadb2f03743be0d6f260b476c32d7d824d260f3ba6c60f0075ad2d985adf741e680d31cd96c49debc198e68406ea7dc76bb0ec4e272c9ef8b2630371a51479aeb7ba0e58e12ace13dd455b4b2d22f803a61c75add5c9e9aed532f17b86c7468a83026acf6e2db9d3b500a278c551fada085911fef256f0235a2087f36b69c79331f8af61eceb65258e5fd9996042ad6e74e672b03c18178bd0a1b0c4e1e84478dd73c99f2e47a6279d28955ce6491e4ad5f734772278424b321925091052b383e32b9582df9383d65b092d63e36758bbe5864814de6d235955ede71b097507031ce7791f5ff9aa6e30348a452dd99f143e9d7a7b77cdb2013a5a6fc287ed2cb6ccc1cdd65fede5df70af9dc28a944b1cda740da678c28a466d7beb53b3f67122a911b0cf034916a0d3920f264e486c025f9c28c8f7ddf5a2a5e6e61fa7cc99720b901b0020f87da05999cd9920e381e8dbd5dd33530be56f6c6cb84dbe19fc0fcc8e8c1539a1c8f9c9a66416c3da590bf45ccfabc7a0b7d89f2d80efe6577620a90f192968da1fc85bbab72ce7c3e503ada1f94fb6fa1c51260f1259b99023daf1483410dd9b9a5737f57e8b4a400147877f0b5e12ad9722963ff46e7f2872363d93cc5517c94b0121768182ea878159a35953db41ec1a3119c43189752439b0659408be5dd1079a264d06729e70a5675b6bbc7a984076f9a73de7e79ccf6e288a02efbe4a8a84e157b8290798a9938080a1017740b40f28a532c432c9d261acfdb64dca2005253b8070742a8418b2fa814228bb2cbfea81ae7b42a931e112cf027ce052ba56fc7f36f9b07727d6c0c3be71bac8146cd72a5987e960ca617e25a51193d1f411603e61f2b72e9af6593b5f789c2ca94ba3af0d5d5d2328718efc94c8c77b41b0cd63cf32f217b389497ce239bb42135df07b1e9a2fc7fad658448f2386d6fed5d14dfd4bd367debc17ea2f9f20629b765c4367a0a6f9ec7834c9be57f0add8a8086e172ea064846732e683040ee1053fb6472660e280696b8181190732958075798a95683ceeb060cc69fc6f3969d16a26112e5ebc80f85f977820409b89ed5f916b92ec13841152d95326f789ac667fdccfa6bf4f867218b2d660dd62b68512174d29f183bf83c30c84d9c77db7bed8fd54032361df7650f84ea82351bc266c2e406ad20e1532fc69396067ad8b45711e3280246b27c718b8c1e478a3c24692f845994b6ad4fb4f1955fb7056c3a2518e972c90bd3ddda347f9ff88a0f802e9f093a48b816c3e1415e7c6a57153a6f1d8a9974286d1c09178d65e7f18c70833cb3f76785a926aa9cc430167ded5bbeb26b306fbe4bd88d1b900870886ec1a0d0e38ec541f4459b08edff1b358fe5719a4d1c1841bf9062a7c23942630de5c3281e9e08d9f4e9bf39896d8f8c1836810abb2145631eff4b798c37cf27bf2a2f0f6632355713fa2462bb113177901097d0a82eb0f025f03dd60fdf43720ad6bb664be512d9858b857a6b0d4cb3456abe9652c0c7a0f070144b03c358aca11c7e4c406382c487107b056e10051d10d437025c546cad51cec432348e5903f980f33c33dba3f5c8e0aa0db22c41668e8f0b140fc653a38fead28116328b434360322ee4a756dd485eed58b6aa0caeda1cfb34ba630c8d05e15342be1d4c1929794e695c7de6d9f5229b60833667780f9dc3e542c0408f20a89381567f2e044939cbd9644290e0b1881fa7a2338d005b5b7ae743da7a888f6a5c9ca96247cc8630d46a45571e08e4794a05b33e8cbd588d76f471191d540ba7220f562a79e2ff45f308c0e2715501adc578f637d7b4895fa41711bdbb4c972230d535f1c81ee12b460b4e21c116320f75d074a8578b3444d1794213260f74569591f5693851dc897db372cce82c0989b4df405cd24d082c34017a9e51d89bdf3737e12032387506e8095dce79be8aadde57bf4fc5d38f7c4fc69b035fe784ea9ca1153675a4012df25fb8437982efc2bae5074aeb456de6e82ae683b0e89eee62d440a169e8c3546f457c45c86e4359034da9250748cec8a9111f260da070f0234f6fc8f5bebbe62609a6781a7860900c602259b8cbbc275b5e7147b1a7d6b2033d367285ad29d8fd3914a10af90f36a4152a7153cf0ca0d43fa0407e328ee2c21ad2616da32d582c8acfa77de7d5da192ec78bbb7d6139478b207a536b0bd48e2395d2712a97c698fa138c2547bca85a3a725d7a8301fe465b6ff1d2afdd58402a6bb0eb971a7f7584d6de47a462380b5a612e53afb18029b05d60340a462c7aa06de0d903295249375f6da00b9703245311e46e64ed0a89048c1c7dbca08b30a9eafc77a3753511e4e8e846a8f89c7396179d89b1ac243772ccedb3694acfa61985af8c5691821bad9b4afe2fca6ba8cf0be545c2f1175c7287de37fd77ac7538d6b9225fe85d6508a6a35cc37fbbc83a7a1edb73cd0fee38fc6c9fffff5eb1e268161884b6f46827602aee72bf006a7863ac0e98d5fcdc570912132f89728ad52f427672328b631dc68d5caad79ce4c8e8557a916b77949f51a119eba9a855b32a22edcf0111e40ae79363b51ea76fab452d6d2c398c188ecc24f3a823b3b7e849c0341c497139c5394bd8bc04c701a88a8ddcdcf9553713b783484453a4e5d924dc46f8728f6d5a1edd6d1336f2c3ed73b8e9182bb6ba6b9df752958b051c2aaa65c194ba841d6fac3eb0b7228ea6d6144b28d5ea347702e50b29a05ea99ca158d583689c27766a5ead30830d051b4a73a20c36f23f196c7c8f2985ef4cd32380b7260be741cedfe2b9db8f9f2d568cb67afbbb3006e1156d7c736ea97ebfb4f2a2273f4f5c226da48110ebeb125caa192c852c9ecd09f4e91ce1f79495dc2d57c43da54badbf0d28d481aeb703ef8b4e05810a310a1edf4740ec1b5992747a301d2e02619aa1ddafff0b73a46e5829d71c38ba03e4dfa0d2be1e25ba8e9806003a960c00492c7c6636e91253196e15005a2e203a4ea27e133b433d524aa8d74405d99ea86f2ec7f73d7fd0e422a6041016d2365bc5e07d77b618804db7a9a36a6cf82e744a8bf2ab66e4b40d9cd94d84e7588a223cd7a6b045273e448e0af6863ebe4e72b36f2192ba5dd04b6ffb40fd231ec03edbb8eef2ba81da20b830e9eb272308c82cacbd152823c627fbdf63ff0844427d735fc380ee112076cbaae960e0c5459ff243b3b89facadbb349a8704c829b99b50c5b3f0a450f6070c30f9a8eb87f3eaf014fd240772606cc4adf30063292101f4ebd5e9da3d75ea3ad21767759b78e8d36c8a497203c54fb10c0e6d07383210c8709e5ec49d3fdff9daeec2426402efd8e04dd2a58ce0ad18fc39da1d151379c76e816cbd26b412f14e03c7ab736604cdcfef9b610953b1892001656015f0dbdb4290556f9a9c0c3832317d11f4d9ee6a3f7542042414eaa09f093fef8b80900791d99ef8c879731c3aae6ba6e14f16565838498907d898efaf83f284109180561f43ae7f37828da6518642a2e7358027f57568f4ec01829001a2d916cedb140ad5cfe9208becc1ca2f0edfce553586e7d3299803e11aac7cfb01da06804a01b0c2837f53c7aff91c2d057a5ef9cba395ba68cc2f7d72ec97650c7c1b8843036e310c0da45682005ef53b5c61fd113edececd3689d46334082f7c5f158a6d37a5867d7be00787f1f9e564d54bdc5c5735fbc5347cd56b89667797ad9ec75305dc7d26dddc0baba0631124932bb927a1559eb39ec61c4453a270f8d32545d88c7ea0e579f1d4d610355bc0d7802776c06a76441f6940d47e111dec8b66008eeaa95507e88a56ed67b3e97841d62617d0ac09c6ce06a6ba5998ab1ac40077e3071f3ab2b9ae95c5292b5cc813e391bdabcbfae7caad37b419d57274202b38b2252bc7bf4673d4ce1f39507ce65561c10451f066570800e22d353acebfbf67e5f063cb5419d1648f210fecbaaa69ce968b32dd402ca2bde63ac8e22cfbb6ed48186eec47ca07a918849c3a9b52a1642dfb56e554992272fbf890807dc75ed12ac060e3e65e96fa33e410ed278c609b5b3899f4967ba080ba0713c0546f5097e305930514d60fdc1748166e1d1fe91eac48d4e0925f4907963af35619107c896432b3ed637440ffe5db7d1b023388bdaba3ee7c05f1e97b31726c370e2e7459c607bc1a70783f7830b6e29d7078fd42237ae7c7bfabeea62736d22d5e3cf4fb1536282dcfb99b76ca2c3a770a6252387a420a6fe038465e3d04d285c7c668ef8bea1f8959b253ba593de512ab309e696d8236fe01ec709ca9a82fe958ed2614bc2f7391d034508ed6f4538c31170b8c990f4f4114247e4c8da15a1806805d7f690df15a9117197ff3f947eca7a29868264fd94494212007072d0afe1ce26929da8022522b8db9c66c10ce4dfee17cdd0620e1114581188056328d3be01a06359c960a6c5aa476360670ec07849d1ab249aa4fc6b220b7accd74050712b95366df9bc9bb248614cd7a6fe7740d336e00b800fc43cebffd18db13ddd097488718c5397e712853cb15bd2723dd9524aabb307c7ac7020d5b66a559f47425edfc90d4c77e28035a494bf735640b562601799f17ac3e621f63435c5cddf1875ab16b224eb3cd7459a9c3c4debbd4c499dbd6b1dd784204d99eb350ffe25045fb9e4f1f975c2a40253daa4a4562942a3143f6fa8d93b6ce09e84ed59ff087ceb2231e20a67a9be5308394dd38d43202699a905a5e5de25099915913c2ca18bb5bfe23a60624602dd4e7e8030431afe7a73cfdf92e0006451a4b8fe4c6dd16cf77600ebd84d625d8c015499ffed61bc634c13b96da8c80280d0dd737086687e55d175d89da83f05a1b7e9dfb5ff4ceda18778ed9b9e30dafe4b233cbf96d8686fffccfbc63bd59820e1885770431bad95540564e0a2fbd2983d5d0cf03b6ac0c4148cbdde8c0b72900a64af378408d64d33d3b0050a7d03c76645704d16baa8e32a76820a18be73a063e901255501207b8573de95078a6dc29d4991cdc85c27467bad04f8c1cbc3b43ad65878e0504db48edd47de63c2e41e9c1443bb7966cf954dbb58978692d88d2d692e01e6feb3307140f44ecb34fad9519d9ef06450884d0f3403023071b542dc69f2722ff723613e4986a5ba438701b82022bee5a8dbca0c506b75e72e4f1c2383c174d22b06f1aebbb8ee843830e1cfdf9c5507997f94e299736ccb078ee77e04270248e21509708833770b1c5a8ed323ce78c8f2ab20833e157d6028a61cd0695a499cb16dcb343de578f3b24a6698382ad22876df9b67befd2774debd690c20b824d97561493802dcf52ca63af4b03dbef4be547ebf0df35bcbc82669a024b3bc62fdd4b175d260aa234a040ff5a79f8460fde791b277ab94d033bd26d3d1bab0f2c393ad25f1126841359ba2915de6a425ffaafdaa265e814ed9ba20f8d6bb5f26b5c6208f49e8309017d01ce17496436ee906dcc9ec5aca2aa385e2cb89a5d1b14abc775f22bedb055f784804ba0f0b4e80bb4557d8364328fc5c21704e26c59f56f11d6653f561d8e18c4becbf187d90e19e714ab76023f461fe155c9d08f1acf9b90c02b83340b12ab4e4acf83fec2b639abb46355ca10a40539a611986c8ddc8b698459bb0805b31d82aeb02a35ff26ec9b61816f1c76199b0f91cd918d61269f0e1269411855dc77d27d89135e559d2734dda72b337493d0823a3c084dc552550957d859bf9aba1933879161c4f9c21678d192403c254427bda4b89cba794a7b615a1bdc08fc127aa467293091442cea42aea80ed71ec4a9eb961a830d32f16ed6b3047d896e0a9643296b70a52c41aaf51e251c38967748441e5873998246a6f1e29718d599bfd365804ccf94664b751b590741f7718ab1d7405dad3ac92157f07280291c82c159ca9b5325fa6e9c12183bdc66b1491758f23cd6b0ffade74be86ec7cde2d4eb477cc91ec1c4dd759964533cd97d835d97d209841dae7b43eeaaaedf405beaba25c9ad7315ca38bd10ce669921cb2dec49fd1d22a0fbce97a075b4a8eb48ce4ebe2b3840e355a1df94d0061124b45dbbeb4150a59908f621afb10d71571cdaf0cfc45b86170731ba8072cf027438c3890b3532057a75d63ec9a04a0d031f0080811627e7e034221f87861a384dda53f336e94284ed52b595aaa0629a83d58cfda7f7b8003afbcbca15c3d96ccca02e8fcc44b144f6a2826d36ba30d245650b0f5448b8acd54a0ab74e33e340fb16f4079c26ecc95b97f4bf518fc47ba7367c9ef74c06a9b3cee7143cb024c055b54b28a61277ad8f43c0000400d2322218be6101cf1a57b49df8ac8b5170a618390664091083d00c5762d7c2dca9439f831844a06aed2db9b442001c022a9e2948259b26535060c114bc098752379a16cb196dbd304b411d661178e768dcceaee6d10bdd29f39d451abf3d62a0585a30f79da4f83e384501291822471045cc9ba62d794640f974a27d17dbae2d1931286e26060a643cda9d5d7f2597dc18a6be2fa346ff58e75f0c9a32258b9b968820a81be2d56048fb0a8b5d048161387677b9c0bf256755e86576a390a4e60327111bf0bef33544aed183d06f6ed08b7f67b6d04741a1de4d8cecbdc07a6703e985a541a0a37d6691838cb544e95917976d96981f1475780968edbaa1464cbd8b86b1b4404d0b975ac0a75a48ae6481adbd86d834b6d10634fc51f6cec3b82391282aa113e09ecea2202df3d41ccf0402de5a5ca8806eed5c65ea657a44551980323ff88fb9d55713bf4c4ea6c1f71803a7ddfd88cff6f14a90eb660b341ddbec98e76afe97969a3d030391c6d42d1a6c9a7ca2d42ffdaeee97fd71988b8803114175fcf78c044a079994e38ee76095cf8654a76d75d84b4e64bcf91938b18d2882be797dc3381df6fa5dceecc3736cbd8aab9c11c406e420f897b1651ab572577f1f1ed21d6f65434205238bcfe98ab35b9b0cbeafd017baeb726b0791df6944a4a80ac0c6115c5ace881b5257ab1be30277fd3912e8e9f1cea1033bac0a75e2ebc6db8a0370b5cad1ebda64832555c16266532ccba216036d6dff8d2eae786766a146fefa73cedcc768432ffe10bfd76afee5b62cf16d284985207e920cb0e1f89cf83245c0df17c3db75b2a3cf5f104dc6db7ad36de5f663c95af5f0878c73a445dbc5a6f199537abc367661b59d610d877d3df0bc93e5b622ff2b46cb3ee25d708cfde36c91eb947af3a2a5fc2bf333ac98b294f55dcff5abd7b24064a5c1bd75d3e282dcee8770487a1f7ae3b1da160f146687d333f379b59d34a93d7c0a97a6a4e4cdd0ff9679df12b4dcb2d6e775e7369f4b5ddcaa032e2bb4c280551e33e4541519b6e40d896545ef4af505ee002df6e0b78dbf8810a61e2a35547f84cabc301fee97bcdc4412bc60b13619a86aa7abc4b028dffee627447063497565e9865f934d9d9e863547f813f8242947508aefd08093c56abd5618b3ea59dda7d8ac627bfff483ce3c3805352e3861334fcc327a0b09a11445ccafbee38d17f01efa96c90bb7142d6a642eafcdd3a2547d0ce512fa78e90291c027e62d071ce1c9b8787e6194507182008229f2987e293918ec84cc497699a3ffb6845aa3eb27defbdcf02f5c10cf3acd0da47b2ce39f0ab0efd9be0e6b59db324cbbb4fd8a835a4086aedc569497c4a0208c26f2b97b4ecaf423888eb4efa254558a0369f54eb3c15e948c145dc6bdd493685c848ff823a07b96347aed580972a034498d2a0f2352abe3a4fd7f290f699ded15eb29c040d37d38e672a35d9ddbadab3733b2ba7e9ed6a26f58ab10da2531d6becc004b33bc5078cab41e263d03cd98b870b1beea52600c5d5a2143a033ee99726609b3b47a1558bec1898eeb81fb1653ece586d6028ac1f015015eee63ca2ba9fa8cb5a29b7045635cc2fde2698a540ac8e3755716d12e213426c45604546a94d1c720dadb39a8fd95587ab8d6e473a917c345bc3d308bd3f6a428cda63463ad28418ed628e6fbf7f62e61b3e3c7f9f1ba28650173a159a7ab541e6baaa020dd52d7db940d352eb52ac8d9815e4a0166c25df6a1e8df1889e0ceb5503a52a710635a81dccd3259fbe65d2688ad5d3d8944abffa4750151529e3e54d25e4a9aa05aacbbf1405b3859f52bba2e84f1503681ecea01155d06202fd54f1d303e5a5de8295dd4a5382d08785294224ce233d3874ef9264fb706a202db726cc91ab9fa05df7236823b98b4a83f4332ecaf3dd2840fc871eaf3bff00051b788dbad973c4d5034d9abf6149e3f97102065bef51748d1aea7c9e86db43b5292336ab1d2ac113bd81416f2ed0ea976ba8c143a9796f5d4a77eab09bcf889b99105a262a13ec4c430245398e0d286704323d61c85a21449eda7f9a7931a30b7f68f277bbefccedd30efc576763f6b5cad3e0a01c06942024849652ae2d9d373617bc90bbada28c5ed9971b07b1d5442376827b9a9ba3ca420f707944d911b462aa7f74778144cb887e616be637d5de08d5431e940152ab337120390a42143498b52eb20bfec09dc83929b6bd57de701d316bbf7fc03f59e570829d2f40f091f347238c20d8a269a3989dc613230b9692c217660da77409014c7c6d60fcd12e5d6b175db4b7370e71a76739f7ddab99551fd20b2011a31b57f5ded87bfd708ddfd3102f6de5984f7ab5edf946f84ac41dfd40226869323d8533b1f8a35f83eb1f198d3a514d00ec152f40246665ed562e2269e55afbd461dac41d4e11660905fa4024ff179d573cb550a5d43830ee50cd6a025e85fd597b8d6c0c7ab10b03095bd0d32d2a7d1ae5d0d3a0fbe4d43fa5e1cd1b72053d26c6470d0a7303c2c988f0a06c4a052f04bdc79b91f0791011faa1f372f2165e0db6a0ff03d2085f5aa812ee07a428484d150de5dc650b80145b0e5083a1a0d88418b54ee3818e663365584c6674037aa06512f94c17586bed08c8d1cfa48c44c12c8abb1ee44416bfbe199eb17e8f2d28a62e2c17cec352425b58368b66341f7e2218be727707f7070b597d061825ddd05fd24abbe1ff690cde0f032a0ff4fe839c4a784ca4c2e255d32f57b025481391db6a9f356745ab81a4e563aa37c8e0f670b9539414d940803c5f248288f547c0e67b06df3daebf17886b95ae7ba87c5bf66e67cee3f492089c1490826e778851184f2f861975e538482cc14879e2096638a16020ecf9831e4835a42e14150ad35ab46ae29e9dc6208b1b2c02327bcfc1e15cce8e52db5d3c2335578c8207b34d378cf2a540e5d9938b8a683bc62da1533351495402b47af98abceadfd3a6d865044d91620680612cc3ec54711cba51ec60b688aa3e7297f1ce400c161f8473753442688b67a011c18105094c05586e084d396db7b24174b761e400f42e5bca9c3c98c04fe87c58562474c40c308e83c10c041b7012ddef01195a3d371269c5d5718fad3032f6a7780734a41a85366fa792d0593861b625eb87ea0feefea81962745a9426677920bc5d529efe2ddb412bcfa7a717e998a78fea9c929a4141b2c4b32fb8c46955de4eba463c6051cb7f33fcafd3dbce29f78a05dbb7f769cfdb57c9b8fdecd9b9cbc85d295707a3ffc202546e311f3e00111baa2280c001c3aba2a77049220529d16315b844e10d7c0724dba5d14d8eac3157fc6d793f7add41d483efbe70f0c8c7df68519809504989b0a20136d25457df9dfbea5bc2b317af13a24e06ef2730a7823011f96a6b7c623aa0edec7841da2b52f27a19905dcbcb6985674f38924dd0926098139ad87add61e9287d7e788d484c4b10880b98daecf8516ef8e7e4c80c55915668c5bbd7280c5884e3911b40ff1614f6f0cc7335409a08aeb5a1a9d7ca37da30b2e459b2f33f00c472305a4b1a1d93de202fd831ff8005887f5510aa0d21fd74c2b499bacd16a66d0990dad146033c154c4c1c545b4963abdbe906a240fc47f948d8c3a90b00fc677375f21f5ee7a010d0059aecd2aa7d084ca62e17f3d9cad3275d40665fc8473709ef2f62128d5596478b05fc1f75d0da149a240da92d115d953cbc13bec0f368ac4a95ca9e0cef155b5b55f5a010fc44dc88e5235771c13863d3ff5c9f05418249fc0f51b1334d2e19da59fe27c930f252dc026db15918094c5b21f5082b4d1633cae3b7ebad51fb9cabaa19cea965bf17d1e5ea286160326bf9e43fb6f4fe5842efaa1251f6ed3b433fc0258c06af1ca2f30c7d75f4635e78f1f7395f3b1fe1e512741825b4a6abb1b0fc8cfea3831ffd9573e94edc6920547c0907ed8c3c1d0c90ba9174327958f881ea1742b85f947b4d68743e22284e1975252657cdf3fd18c35267a137f61a800732f996566dc441d580a9bc13b5c25272dd6aca952408192a56e1344a5834a7b7238594c4d8a62ba92dfa7fc62651e25d351b57b0645b1a4085e6d60775d4ea596441b721ffd0800b972c197db9f4023498b9265f9cf9442f4d410c77afbfa760f01c16135a376ab01edc614c64fb9a54714a7a3a3ceb4c9d14c0a1000fbe42d825a6052254a6135a35cb7ad224600cb66abd19dcc75de341d670bdcdb416de558c5a50f0debcedb21717f5d01f8087a129fe6823a57b9f0f95e7ec875596413917252735cd25411ddb429fd7c71f6a0ecce47a6c732825f4e06b6871dd6fc2bd35d00dad70ef3594d84b80ceef21d4f334196947736c77950482d62e13919432d63ce5266479fab3d123316ede7833c581bf6110420b99093b81792cf45ec8c0d4f39bf54fdbfcdec20c4e308123020adffb783fac5b5754530cc099cd73f1dd0b5975894328dd33069a44daa6f590ab8ab39e4c099f25956690ab51af4417d5ee8ba5cfb6ef04dbc4339c12742acd9d4fbb8be7be4585838bb12ef513b9c46a62c70b39169f7e59ce9ef3a2195be1ceeda749d703e5384e3a37c4084700bf9b5ea658946f36f4c1b0c0c529757b305006d8a35778a479ede3714f57a471cfd1542d172343c96fae0977c87d2a42887194fb9f113f7a2a2ac7d8a40150be150803674736587c1a0d24b2e0f01454e7275a9589feafa1f4df7f1265283ea394312c8d114751c28bf59f72bda7505775581ee2ba09b0a76b9a25d56b84b1574b922dda970d715dab5c2bb7285735ff7866556acd956884a283d15b087e0a4388efccc7ad3ba546c0dc114dd2b387551b51567179095a96a3749951bb70c425c29a7aba5b360cbe0646db6f849a7db8a77b362d9ae0767fbb0718caf81aab30011126a54b9a0d6c39e3756180731d98aec9817b40cce962b06fe2f62c51adf172edc63daf8df38e23bc8682c839bfa6c87dcccf21c1b099d6376e801e2dc38321a6ee88934874351939124f8e866c8860372e0261faee41baea4023d2bf742b226615b63008bddb50d09e6c23df3cb866b2fe48a60b904ca8af30ddc603c86ab4d9a4b9bde50bf8db24d62f891d97850a96db44f41b3cd08a79b77223c1a013e38a31a8be4daa2f8513389dee94b49f0b0378ad83654cf93d0b3976a506f924660ad71860a4197475666114b4826b85e589f20f9dd529b5a1d59b51d9b9c4b21a2d598d8235b2b7e77f2304546adcffef17103537b331bb5b076ead6dddd5c3fad0cf8456ecffe7f6e91940699d2f096449b1267b39385ab762889fc5900c81f532ed8be3ec08190256ceb333bab06fd6aad49e978c9fdeecf03ce76dd25778abddb758286d70e1b086dd29d5b61a0dd2149fe08ef8ed1ebb5183224c693c0029399da31e4b05b9491f2cb7b2118f5b25823f0aca142344a60572144a5299791b3c72adfe2500da1e6bd65de68b1f3602a9554a2b964a26c7259a32d2e43b1fcd8c4f3fe1d5be99b6653b558fc5eea41cabf8368a11ae2073b988e694b8ab56455467af11962590a173324801e5256987c73ee7c25254c2562b42d9d107f3e8937849d25af00f0ed0007e9a87c7fa0387f77260a2372fa757b7c0a282cae4cac3c6d92feb04055e1877357324995c6b58c5b585b720bfb5f4bf31f5400374707877531b9b2cbc421551e8e5b86ae13e6085d92e4086d009fc073dcfffc6719706dba4f1851b4b9bcc2f8cf1537d532933bbe9293c73f7603103f78138ec1d5b6bb8df1bdd0e7d5732abccab12d381ca481602dad133a1e238ea8f69ed4e5e15b1d9e5e63e90f5108abfba9477ec809678c02cf708ba75914883ac669f6f8c19654cfca8d5cd548846fdef61ab17ca645a6a14da1272b10fbba040dbae560f79c78f519a57b20f9963853da1e5f3a6b8b436f386e3618cb9c34dd4d0e38d63186d112c85d77ee10576bfe41fdfeca75f087b4f13a962b4a705454ab402d3511975ee0e2bae9d9c89aaa9d0239fe8ac940e842a13806353b03493f2c86e28ce196765425db65cc9b2a3153db4441209a64ea61a35504d0d75dfd0040c5ce9c645155ec293080f272152a903f33dac8fcf237341acc3e917dd959095f5fe68e66104c2f6af6b155aa026870a440090f806d7059dcb67b1d3f4ca39e00d5ed300e220204ecfbbe6ebd29ffcb1761a8e2841da8e0d46ee97db24321c075ed8dedfd8b829cf9f20b4b40767fff5e2f8dc7eacc810fa83a0f494c639cbaebddf3cc4a0f388f07434c0f7fc471a690f2eff4fefbf83543c0a4e3d68795f634b88cb9799ae22c4dc031dfeb0e54f0a8830217a2b99d1f14e769da790785428aa9480c768bbcfc29f76e729db2b36e0d93d9c4ea5c78341277475e1d639cc74481e8598f659ca8a71f20000a0bbfe487f011a752e7c0402a15d01367fa7efbbe2fdf4afc1115f960b0d29b00cb56800353bd0f778cd826eea5ed598c8411987bc6a406e794993c27931cc46967127bcf962fc41536d22837d7722a17a72b76e3f5e690aec2473911175a09bc6e53e10044eceb9c875e92eaca9d94077f62f2b3dd20d4e47dcb360f1746ab5e0d7e2b5c15447e54f3ac965a30e95a1ccd7b4e1199264ee30e7139c1809e8ed38140257e81c07e90369325331fb8e9b19cb280aa32d9004dfe8d5ef20b7e383a4462c243d037ece36cd0872c387ad2a9cfb0649000979455e6889e2d9389fd1b88d1be5242d743f202dfc1cc1bcbbe8ccb973103abf48ca1d4af47f72b2c8f2bdc0f898f1f296c99132202dc2f5d303c36a00fee7f1627a5211b6b6d51acd3b8843a2cd243daf3a14bf466186b7c69e2c899b243138694304098a8686c3dc9969b1c56923ea837d3bc7e1087515ec7f790f87d728a1ed698a95e5f0ec559befcffe37e720073da81c685449eeca9376609f197468bb1851c10a57d25b8f4802b4be80a57162b83370d1995114a49d478116f0f115064aa83c8ec3e9861db7305848ea7c682d90af1f35a61da924e7e18941fd0be7c3e89295dd263ff3fa198905994bb19dc212ffe385b6b3da91a3a1ceb61bb23c8244ebc3a922d373dac257d42ef983f783e207e9f3a458ff4d8ff8b20bea059cea0f9c1832ebc38ab815465f56fff01ee440b1362f15a5174810eca04471ea44c14e4da6d788a23ebf1e06f598f4cab336ac0e57a5154529cd035e7586aa77dc1c743c376ed1974d469c95a9eb7b6fe291fa37ddb83befcb8cbc03a0bca126efd57615c34753f86e6e089d6f9d693e5208675f754d738957be24ef9b58282751cc27ee2f82ec102240613860fd16e2dea68128979dfc4e58837715dbba33152b9d65882dada8564554e0f78e522c833acedcfb366257ae058d7988dfa4bd73dd07e41ad926aa17deba31b851d6e18a6c71b8c29584f4cd38727e659e359eed368a3ae277893fffc26839e1e40117aea1efc4299d71c527bb781e6d06fc902756ee6b0dfe032272b33b4c5a2b16d9c99b18a73707f602860f216cce4330574ab1fbb48722dd83039af29f2ed148dc6ebf06c3238e36be015067d43b3781550cb6105c3cb23b83444ac2f3a0670ae82226603947a30faaff1522bd9749ad69124120c91ef0d35eddbd1a8906320a03000c7b8cc63460a93c1b552058b83270538c768200862480298955b974828fa9ca607d51627909a925a7cd833c674879cfe8e6addbe0dbdec1d9a949457cc645bba6945b53a1b2969858db4d4cc43ec0c4e42f44abd1966ee87a19e65cc0d5645fae3e3e3106b6c93331f9a7b1cf17cf282c98f769017c2fb23681e149a0c6197dbcad8a0c8118c91239a7b3a05c0ba6cee5f3d2017763dbc61ba6ec35e6b38d81b118d32bfb206895524922ff1eef65e0a913989c9af01168f3453a641fac4252523cb22d9ce10f0b5d5e79b5ea975cd6d4fc8f5f086c127ac29e70843193141dc974e21cc0b3cc3db15739f3f47251b3057a1b5f09b7230320b7d6887516d641793864652249219f4d1d501588de2c477c1ceeb1608e191f1a364d019de42350acd254a811bec3ab3cd029a8b96281d4ec3cee246617c16d078a1d399a089d55816ded806916a1547985603aadd589314989d7cb668a3bc5f892e3a5aba18e06b139d751c715ab3a95911955ca5aa9023f22c8dc7226b5dd9f848266429d6b4d65a9b6897f491cca61470a30fd7d782ebb7882bdb7f78cbef2250ed0d38e3e1f928d66107038cae8b4dccc274b94d920d624aa8c5f0b9149bb3927abb605557a0c0f250897f9e91a27f800bf1d7acdecc82d06406fd2270557e75434d473ef0816b148035f289981806c9b7ba3a2391fcbb5b052c29b07548eba12df38653b6ae31cb61b44314d22029295593bab1b94186fe6c16c33edf2ad345aa4409a3ad410f322e9ac8cc791eff8a028a16ceb951491aed43b212f2deaeddbbb2c2bdf552be365a4598fe564586b6ecfab3d47d36d4eca34341e2b6d1607dfff710cfe24c496ac4e1cffd8f6fd888243eb03e6d00b10dbb4d6807a405663666eb57b7895a47e18e3ea94dd324786cacbc1d97238784fbb09b665dcbe3afa14281999865175330ed142533fb0f017f528ff5c4539b468334583c54264464e10a8e5e4136ad88affe7fb8db0012117394805d5c48738e3550452cfd91a207341603fa51d2765a30543a4a070574cafb51c4d7db361cb22c01bf929306642dd8fe9a321c2a70a6167faa26b876584e3aaae48bc6be880405807091fbbc8e25d9fa8bbdaf550491eab880cfe70071f2da3c289855d67eb9f7de72ef2db79452ca148107f606470738abbc38171a389fb4dce07c4f584a1c33be0c23111c114b8f6246c040718657ef248ee72d653c40fa85f30fe9975ff572785d17cabbea26e897745847c05905009c1d07e7d3751a38e2cb3b189d060a4b29a1af2294d26578d2394903f329a6ab95166533667cfdd92563d00720c4653e770e145ffabcaacf309087f43aa6cb2ccef14d2ea7d267a0ea9d5bcf53e93bcfbc460ac70a74eb503ac459e731bcbadc8481e2c3ad8b97ce82c2c9b3ce65728981e25f9ddbb85dd765ea3c0cd7c3e4d6bb4ffa8e3c7d337ef3d1b8cd57dd94559f21114764eacef3c9370dcec81cea2af7d389cacdf6971ad8fd689ed5f84e048a3543a8ab54eea793ccbaeb9e679daf5105f1ccd75c8fce571767383920db770e896a508145385fd4a7981784a61878e3723192eba953c98a813c32fcacb3034a09712682e3717ca6b9f54c044786571e6b7c0d6351f5530ca40147d8c2461855e82e62961093104e2cf34e873bb14f1762868184bfbcfb84eca50a1693df8a3ae6f6da5c8647a9205de7737c8cae9a477b91f218ce7513e252cf17f44e879b25ced826bfd60289cf520702b4d3e16238e7e9f272c9f9e89fd88568642996e7dfbf7016e27ccca084643cd6e1c7ee427e7342ea0e78ac4b217d850878ac4b21d7122278ac90050c55a9df9c90c9c5114b3c9c901b5944917d7342a4172f74d0be392125142541851d33450db0d8be3921005862821d88e0a293a130aaa8d27d73426c6ea0841130de3727c487a5251eeb52c8cc1637805204234b4b3c16072551b7337ffd4c940ffd227009b58211c8638b444073eb2e48a07936b799e79da77d5c673b23ce7764b732d238cdbaf769ce7d9dd38ff3eb2bd27315f1591979de4f048637d2f075cc25e79ac6e3b9c52c2d02f7fb9930bc9175db9c10dcb1341e0e57a0c32c8de7ba86591afd7e0cf0d98873224241bc91e538d7beceefe709b99e6b98d55f783acff28d92308047f3ee137a967ad036fa73f3e85902d337fab11ff60bb27e448867c6634802525d7aa769da0a9bef442075452d16fae67aac8cacf71309c11bb1288f05623344e6e870de32276807ebbced6ebede0c4ea26e7d019f61a879225d05142cbefa4a7a7ebde5c5412d606f1e0ecc5f9e5b49ebb01c69f11706fa912f1d069a2732c144f12b6c4ebdfb62d836c9f5ac60e488100f92a4cb8578ac4bee2785bfa092cc89ee7d9048422b3247f3ceb7685a58b15bb4804544b028e888104f1275af09e24a5ca4973ea3f02b186a9e08095366a0c457ce3d6705450e2b79f374593e47168787a2865be6ac2ebcea21f4d261303d91093439f2d21b4b0cac702a087940cb670f58b17d462092c8637d0863b1582efc882f5d02cd638b784b2fa16b464970f0686e3f23758947c350742cc2a2e98a859e65f8983dc459868f70cea0159148310bfd858890124a2f310b1e04af207a888daacbb022d25f1e0453063dc452848be216fa0aa29f9885be82e825360a6a97c1db1265052c9e8a5937b29082c5f381e62c7077228d728b8547db0b4422e88876f4d5e570f366da8eae18b1458a39e282754baaf78dc5882323b46861bbb7c6f97d109bdb11058b1157e6e3b40de85d035644035396e11bafd460f92eeddc930be01b0b141a40c9f259b5458b0e8e134e4a27009fa2ce11413a993bbfb14099024b29a1547929a5e39c70a0ac4042a102854acb76cc31296d4ab16aabad155b89c92f53efcb246316b10c9351c6b923a566a9a516e7e952c3e6f417845eca79e5d0cdd0cd90daba2437e3e0b6cbad57cda3ddaeae868b61d9b4e27c73285136c77e6c8e65be6d3f36e770de56d5b5e6b06f73c855dfbe159d5ced91ce7dd237edbb59b709b43c09f3e40b855ccfd53db43abd56d4b1eb420e0847ddd6ef72fafda897afae5bbf55e5e4dc56d24d57181d92ee48379422c2932aea132c54c6274c10d5cfdb952d519f1711b00a9f48a9b73f6f179d32e2259dcd8443f38de5c91073490de324059893156c4e8ed09c644e74b84e8e744dc4d89ee0f05995b454b404112b28c24e03ae98a28a324d88f1822e187812840f3ad4c0082a74c053bd68020353931dd03871b24d4a806a22c58681b14851b929c2898c9d7b15b1c4c674ba770834b2d622315c5116b233b274f38dc5091627607823e868e88c18c009199b7841f78d85082416767c6375082e42e040f6808827f507d8105f3ee71bcb104318228ccf292e730889f324e599800d87c9a40481a26344b6b752529726784d3dae69e6eda1e36cd5318cfa31bd7ac51995a20f3f9aea9478c518e917ed73ae1a2a89d98145082ed1a7bcbe6dc68d5eb3874e3ca1b401670c420f224baef135a2cf2e1f3f4a1e7cdef25c4dc7a8152449ac1c29fae6a6cf94f0460ed349b7c8fd9817f723c21bd1af0879c0109f7ae57e4c16eb29c6e1382feefc8c333d671fe34eccf1b2014cc349035ab94138e70f637e60019144dc2e96030c330101253be5e0b6c964a2f18d0508258f7d630162e8b3c97df8b2c5163c70298116586be1d2e5e1357dec4455ed418b97e262c7870f5b2e1fba90a13b52878ed4e9a1891ac885ce0ea5397540a62e25f1a148e6ec5cb3872833292e767cb0a663396092e46292c34f4f4df82a13d7c5b6997a98589139fd14fb2dea80ac9d243a7a7a289239fd9fe281073c7cf99cb25fac60b3af0edf2d1b84f0d037d8b201cc43bf009353cc016bada6a8aa43dc13ce90aa810d401ef0abb700f481daa91a57d0b221c9772b09d11fe0bb55c30dbe87940b1d62ac2bbaf9ae10c42b0079c0a7b08997a469dd5adb35b9d6a678b839351d3a26adf7744bdd5af8d625d7634d3205994212e78929444f59afb5a22220dd7321d13b9740f30c1d9147a27758e8b16ba306b9b8bf03dbb163d201c18256749b865d47200fda1d938b35114bbd484ffb55240345e0923796737e55686421229efa8503198fb8f1bb5583672bb1cc41289ff6df89ddaa56814af800e813afda252e12f4597e431fa45bc8b5105531ebba73edebef0e723d19e75ab592728df3aa412e128146dc6cfad3d76012c44747e2b67bac9366b0d3aca66950eaf0620ef4deec74edc33cebc1e035bf7ea699db599cb8395819e9dd2754ea173b5d57a954176d1bd0bb630eedaad6219ddb8d2aed030f24899c28d7a3551853d8b0ade1177fc61c5d866cf483dffd807d88ad9b0f57033147052e306402617e631a66db4f389eea134ae8136ae8d0efbaa434467971acedbe7afda6a2ef6d5fc669dc0fcc1c3f95f28b41dcac7ad97d1313e26695f47b3f72331f1673a86fd6e346373ca967598c18f6d745576eb5ead1da9b4fbacd27a97c75d4cff43ac3abd710e56b0d4cdefa3cb9d7b40dcc5df3ebd746b99e93cf4f86cb8f9b1c90ea9203625d7ed1e4d967729a6f659dc6ef97ad5ff73ed4c9fb6d661cfb5027bff17e1a339cc687fab13ec3adcfc0a81346fddcf88cdff88ccfb88fd07b3e3f132acb3cb7f93c97f1e5cd33377dd97ae635df8ac6fb338973e719eac3640e759a6f95f98cd06ac311d790654e8cce17e4f702f4b133a50b405b11067cfcd1c26b3f86bce63b71fae8d7ec0bf0b99e227009c351a709f54e519b982dd14ab48b72a7d2a5248686510a0294325b4351c080e122c22b6e54931adddc553a3a70bbae4b07fe2cc1cdf3e749da48e7e63da26f18c7636e2dd52ea0f8190d7a0ab96bd22ab6fbda1acb62fc7ec24aada41c7606a718712a29d1994826bdbbbb9b8556fa2d88dff15988a8087c1676fc86b38f9778657d551db3b8effd70c49ce8dba7237338d78939368f18766f87b96e9cadd70c44b5eccb35e2143363172009592c160b4816d11501346516a91486d550a552f0af9b7526a5107a3ec52da220a1f293b56108a1eae105afd3ce049b5fcf26d3c5f1d3a1e7ce223ff0342e658d4f259a9a2cf4339ec3192b06def8c2c01bd0673e4c0cbc017dc63b6f2a4515f4dcf33c5554793e9363bba9ee333239175dea30e1e88e61f7469ae5ded309c3388b8e8f287d24dd2da71e1ab132268dd3f590ba70ae4f2e0ab25031d6d8300c7bcad9c253bfbee93d69ec7ab8192bc2f3e9393ccef3aef56cf270def370e679e65de74d8ff3c9797fc76d56cbb04a3d468f1d8c45f0f9734aece6748297baf96edc5a083190fce917f7d393fa0dbd380bfd75efcbfedebcd964986626aef96afcc4f59c30eea76f4e3736323e93a9e6a3f1f1bce3dcebd9bad9717efd15531f9d4aa11b48b5a45848fdeaf20a553daaa8caf0c459e9b32cf3f159033efb34cde7a71149b190ca529f55db7918ee7cd038fa4d6f1b997b997799db4ccb28cda183024463585a5acae20442c77c077e3b5145b73e61fa0b347e0c5141ca8f5ba16ef193df6a073720aae84e03a28afee8fa04f845e092c4893932876e5de29a4f7234497e7319e53347fd48cfdce499b78e30f9cce797a5afae63dd36eafcb274191e392059dd2eae87c6e5e779e79843201990cdad8c2d1573b48fd0cf78ad1f8ac66bbcdf4a97f165cc2fb71fea6773936f6ec2281a47fdd4f8f51abf8eb31925e93680cd8cd37c3e423f73bf55e71ab6f50910fa70bb7584cabf00bf7ac6a9205485ebc1f548d48f395f7e733f6ef5e92b1a877dd625d0f616480b8f7911067c6c1b99035daf0119f2986b5986491f3b7ff9600c25f78eb201b14f94010a9962b604562393c72098cc6e9a6f1e9c3e71d63084d72794022dd7a3e1be6e3bd7be7c5fc6a03967e5f27cad3a8661cd34575cad99dca4f14983739cd54db83ac6cd3a27e7da9c0fd0aac33afdaab5fa8432fcf2eb1bd70373686196814db362d333e10c97c026172f6c5b64c2753006699a36e6f355bb0aa5540fa37518aed3afce350d731a8781e27718287e857e5d73b884c359bff9dc07a177f7722de08dea95eb715dabf936a7b171f9ddecc8fbf54329331a076720e4f02acb40f3bb6b890cb4f20dc219873e8351985f2e38c7375f4b9baf65cef53e0ed70e735c402ea014c8058560346fa9436638ab908b1b69c6a081c9fb778be525c9eb7cb766c8e25b2c2d4ab0e8a7112a9f80ef9611d6b768d8f2aaef160d5168d0e2ed7753e927add9acd74b4a9c2dceb0e380d88732cc7529413c4fdf8c5f5fe7f6339d6e68a0703c723e16e72b71f6a7535a2b7fc6ccb2111ccec0ab2c8a813c663804804b00e0a9f410272f9320deb2e5a5c32cf5a3d3607d64c1202881ea5fa8e8909581ea5f78d513a3c3503fe22c54c3a3709ba77928862c1e29c6439f637cf41173f85481d2aacee153c58856f5e7b6e2e5fc6a78b82dc6f7b7744cfa7597ae92ae237d87d4217d47ea685a84456c8a47030d1e6b2302c55a4f7069398183d613635cde0c34dfad27c0fcfc6e3df1c5054d060a31c6183b5a4e0cb5544034716839b1c5eb86d07262871fc077cb0923fefa6e39e1a44c75ec64a1b71683e69ddbaf654ef5ce6368e979fc349f1e44f31983702e711074cead6f11df2b73aa7bdeb98d376e73fdc6af07250591e1d1a17b1e04bae739f40c07397987833a3fe115644e751b1c9414c4c6210ed29139d50607edc89cea1057bf3a412e73aacbc056b4edb33828091581e99a07999907d920d2391c0489644e85d8e2a016644e505290209a471c045998283ac4412d839282408f38880571d01019b4f98c0ecd96e819b24cde3cb0d678f340df9141492bd4e020c8e3f9759a6fe68b212988c5b048e654d73c869a1e2e942273aad7f870710c414912681eea570cd49b2743295fa7771ff7358fc326bafc8cef56134a6f3b76ec8c284f73a8152e9740f35cbe135315afa02724634541ea0b4c765fd02fbe480121087d89c6d43194cc0ccc961ad99dd2cd6dc5015803628e1d1fd5b13a846fa9c006b9230cc8da36134e99a7f1dd6202058f7db79868c1e754518b0a9816135f743ff04197030c8cd6142f59074627e6747215f7dd9a82c57bdfad29563eebe430254a9e5146e931cc76bbbbbbbbbbbba30b6c431ef01b6e74523aa594329007e491a103cdcf9a6720ec31079a507ee651d3a4f699e65d2bc4a89fb98a3ee935299c59faa56555520861a490eb818220bedb0676c119f1358694279efab49a6fda75d57ad55aeb55a94fdfe0556bdde0db1fb8bdc41b129b1bd52e2e6bbeea2d6638b899475f599f59a3914d734eab7df34d326ea6d7ef643da12744b0f459e80916eb5f90cd627dc52e6461fd74206d0beb35d34b32acdc56583fb10dbc618237a4775f2e9c32da8694ae03cdd427682e6bfdae696a355bfdba1cdc9b977eb5c9e5cb30d9986468974535c8a1a07661280cfb68288bca3447510dce4ab99fea13054a1e7240849e2062fd0b4255a4b07c2415d64f29ac9fb88824c37a0d77718337e4970b5d4bd3502dbb7a66d3749cbcfce6d1cbab9ee7615ee6799ee66d9ef5b8205dc6c0539f37debce6d4b4a94daa654eb91e531157f3195552bb32f8d7755d93fbd97c7a6d4909f336d4379f136720ac4ffb619d165773eb9aafeccf36e37ef54dd31cc32c44590ab139b7095dc36fbdbcf5acf9b414e7acf96c29a1e42dce72fc09dd0a2ba544fd10c2604c223d7a8c524619637488270623096ed0dd20092a4844f99e99317147f891161f8fb6ccd01ea7cb47c90f35f10a4e1e25310584782eefd61422be5b5382d8e166557f59150123bd4486c5624141f1d75db9d055317cb70d2b5246266cfbd7c5e066ec7524eb65eb48c9cb9772e9f3269f5c79eafdd5af6c9a68d400713d8b5d5eba0989cc9bdce68824df798d4b8f59be7ef9c912aff3dd7a32c3dbb6bdd1cc7cf791c0c84d7ed47a6fdc8f74ead78c2a783dcf3c86cd3ce636db20e7c3811a0ebce63f9dd7b8e520943b3ddb78e47a64363636be137722c6fd98dcc6ed5557342e1dceb8e791eb31e3b4c33973ea92e6abc1796645bdffce3c077e357d4602ce041048c8a00b285a453cdd399cd72b679cc90335679fa9d3e0fc59787dabead223e780ecf374eb39ebe181df72f69a7be0359ff11d698373f674e65b49a7ee81b75fa61e7f68ceb9357d53cb6b8efac1f93a75ed89ef7cc6cb772d27615ef3c9f5d870df4ac645e39b4f0e88e6794e9f397fae4fbf3e31cac64d5ce56cb86f75f9ea7a15eab6319d03a25dabe91348e71746d9fc30f975a1f79cfba8cfafdb70a66efdc66f64d4e0990ff5d3f9f5ce2fb678d5712a085591e1a710e700a12a3d9c7e411f830cf3137a8f9ab5d9e640d717a9df6dc3db62782cabf25686c734dc81d3039db21075c8f954afd89bdcecbb654492c75e0f5a4dc234f1f2dd6ac2d2f1dd2a22cb5baffda4e35b3e7a113e7af4ee05431c1064031720d22a42cae7fef23742615bd544f8ad6544101f7d6e1fbb17dc0d081b4509e7bb15854b9428a2a020f5dd8a22821a5de0f86e1925d1320222051bd098a2464ad704ca0e50928cd18599414d6b53c18c22687cb74c5043eb4918a8e49ebe5b4fb8d0e86c60bd3eddcce89880a61c9d161d0e98b49c9469e993082f3f6331eaa05d1637625201d3bba18435b09087eb634293a0c4851efdb36db4fb98f0d745e99c52c608db0634e1bb6df8c0874298f05f963cf9296f239908fb8b64b4c84866cee9c543376170c9cda6298425225472eb776bc99787b29b785661a1923b632554b284ccc3930c426b89529fd039e828516214b9ef96921f94e030b7253a877049321553c23a2eb24d061a0e5afe6bdd60450201872b903be17044879d545201528ec1814816a0dd7a328c1b77a0847d70c905e3a3df1bb87c7453c46882a0108c9712dbb1754391853fc01f5a3710b56e48f2330147700652349617f4b0c4051641032e1d4615e8a475702409e908249da32cb440ba220c923c1ae347f08616c20990200b6e80c1d1421ac0511860544a29a5946e18a594d62ca333065a9ed093c9a1a0022975047574411a02d2018eb620f138b28100b84ca95110108417ad24850748251c8d00852f6394ac94a08f9ed85003520b90683082748fb6c0a173026ad9a1c140aa41cd80171c8a9a10420c64d005cf7504131cb64032a5082c92260c74a045a939420269c7d110bce283fec19431908440b2823473f405d20c900270f405a98b1c475005475ec8741638430a4790a8cb1861842403a4118e187054456d69e112a32c41b234482ec7584033b45de85782441f52878f6a4f38be6367884aeae0208eeadb19d236a216e309ec98165aa82c3ba65b4a29a594dddc929bb79de83ad37aacde573edb51ab97213207bae67971f3293591b09dca534ae788b8590e7900bc00590e492559620e1b9704903ab0e7b8f40846ea50b954e5b692dd239597eef1e0c625b4286588e7d2a55f227dc2e603700194e0d27d481d29979d47a97a79657f1941f696afba8f1e229c775ce7de0f6e8e4a60a8bfaa1e8b784b4b4b7f72e99e989ba312a29863864bb733be0c595012794af7f22c899e46ed8c3d0d9cbb4cff573d2a717972e9910986a1120c73fa6e6c3ed54e0560125804a944b8c5fb60172f51a505fcf2c13151450696290001723ed5003e017cb0840f469139d053d00380bfcf49f820932c92482a45cf72878fb806881b590f7d4c54c1ebaab5d618638c31d6320f21f47c706bc82e7c74798566448bd4ed45031de683b8b4a02375e8c81ce83e82b75f1f2b481d2478b7dbedbbdcf3bcd65a6bf53ce7dcc7f3ecc373ce692e8d98131d35c32f93d77c7e53bb130a679cbf9c06cea919f8fbbe963937a757d5e07c2d736820aef117ce9e5b6f626835400236c28783e361aae35c74ca2a44235e45e886107677777737ecf6f861179457586be59cb3bbbb9b7677777777992b44d58c526c37186b9d524a29a594b2d0602ca54d66ccd5b66dc2fa5dd3470be510d80fee85713e1b26d2649ebabcdc1373a163b9c97c0d10b7c9bc7b615c0ec338dc42546158fd2e38e633169acc4f0c545f622c4618d8d574ea524a2975345765ae39bdd4e729857d3a32a7ed7772f9699a86555155339c6a59a3e26bc22f629985b559966559666dc432ccebc1cd3a180a38fab6c51ccda3e656c3f938ad44a81a8000e6b446b54bb8d1511363f8e449d9425ea9005cea38ce3831beb207865d37aa30bfa83703cc371346e5e702fccbaf8b4a3abf5b7d28896238f8a5439452ea75a194523a2509970e591ff823a06a5629a651374555a553895b4ff17301528a8dacef440cb3180077284973ce8792a4db0dfbe073976b9c9d1a7cea5108160745e3b6f715c48b3aea75d1175c28a9cb18c3a8c106f1dd62c1119fbd6fc7f1ddca12842f32e3eec44e3503ece916814b9f853c18f498f204372908a1cd1d4aa2188baa2d2640ba9c59dc280586ddd6de3f6b2fb5ced1da86c41155d2bd16dc5c437a0d1d1c3b508850861525ac0f7cd3952ea321111102910fa78fd04fe9f101f10703f8fbd58c91467c650eb6866626753d13babb2058c4dc35c16eb7a7b57728299e6c0ad175dc88b50b1760b3dbd3762ac7653a7dde0c6edeb67b5d731a55df8952ce8ab14bdd67f0badc483f1760c4467156398694db3da5628e94cef5e0e6ed3fd814a2a094111b5d2e67bcae17eb039fcedbb30a32dfad2ac0bc09dfad2aa84887db8daaeffaa612178edd414a6c94b91524452f8d92384f86e51d4ac25cf3a1247839e6f6da8265513a7cfa3cb0f10e25b585772809e21955584c40f4a1a4ce61bbeb4c0f2188ac60f2f0bd29779ae0a115440fe10b3774cc11b7cf76847076022ef46e5571c443e884ed68e10d562479a17e503e00febc26f723bdca5a61c78bc517ba60ece1ca3821f6b8785cdc436247576cca18a1154a5792cd9b3a4671a6273aa9cc81a573526a83b9c5c4812cd3772b0b0b3eeb501ea808d322f3e42f3f15fd95e549094ac0b4208b1584a182295f7e8c88008c30967802c6932492ec9025c90db0ae313ab942467c50268c1f86f0a2841212a2b4b04062031d847082bd243aab5eea0ccd225a598eb4a828d3a2a2ccbc6236c9fef1771401b7ecf4608c0f50b085122a8a984542374ce10492124994200b24ad16184f070f8937e41d695da122e5bb75a5a875c587d615252d2c5fbe5b57c6b4ae64f14c10a7f703f4b2e556262d23b57eb7a428c22bc10e62bdfcf29462b2624b0a30b3871f989149849562070458219384492b8a28ad28a850315a5270c9f2dd9282cab7dbef9614485234991d5b56583b34b6804faf491f214de1d15726e4a40a0bbcc0a20930ca04c1812b622089428a3190741141995a25089f5557663fdf39a72833c511cf09566b0e5f5b58c6609e9193aac6c97471525e13289454d9c1dbef56152f9f554eaa6879ec5b8aa1ef561463be00dfad28b240e1e5a7c77f78e95459e2e3cf255854a2c2bac6c5f9603faea21746c4ed1614612eccc79d9e2fdfd9f1c5cb29de51837b00fc19a567d55ff874baf7ba709e7807050fc90e1476282ed24b4b56e08dfe9d78d5603b956951bc27da6d453af4e6e0961d9d579c55dce617ce278b491d9751fa2c923ae20e1d956ae2591467d14b219e28bb40d6fb74099abfa8540d76953d2b99a219001000004314000028100c8704029148301e142db37c14000b94ac3c6c4a9807a31c465110033186106208210400400c01c0108398393cfe4959a74807e59829bb53a04f313665f751a64b213645f751d2528c158aae50a64d19312930bbee1ca7aa94d03bfc9d5e6aec5aa9e231a5cbbdbb57d4384c11efde4eae4a2f1f764ad4aa0c25f1fbaeb2d34aa1ecbb1498fb3b57913c42b99fb27e1478e371b96555a74abb80965eb2d8c5a5824e51772f095c6e6fc3a8843f3d5bd66105c23e21fc1be742eed252904f98a9922ef6251b147bac3e3a658cc5f0edbbf05f1b72499c1ab7254bbdc7546b07f474b599d2feb0dc1d6abad15d5f413902fbb871a5d7e8de6985fde300255e4d3bbc921077b8ab94509a126f2989efdbed15e5f0073b594a2f2bec081af53b969de34c2f41eff8563450880ecf2ca1abb7f2fb39fb509f11c5546ad5079552aac9029a2582f82e6549913e652c28baa748ba143b287667bed2cb8d9d2b950794fb52d64be126c55e4a3d29eaad073196b46cc7a48515c072f1041954bbc5ab0f29f4a7a89ff2ef53bad8dfb55ac563cac3f6efc28af4d26157a94a39c57b94bd14f580e22de5fe5186fe67231e08e9ca31caea2d1249e5b7e4386c0f4884f813a1f8b7f4b2c5ce7154e2a1ecca27bddcbc73457928ca7d29eb8dc27d8aeea7c0d0d9353455a9ad77145771097dd7bee9a5e61d5da1603cec4aa9e2a272d7d1a7972d3bc7a17820d48e6f051a285cd2dd8596842c29b644df2146714ca19fd74ac9a350461f2531fabbe84f5b44913e65c7a6c02c978fd809e9acea3b953b0a7ddad2ba8b334dd09a4b063e91ec20a42bc7286befd692a8d9be758699cce6a74204b575f21237c297b0725ad4a5f6c80402290c1735313de0bfc50e6bc0b4b2a45f3250a210a7471a331bc1c067d2faaca633da5c5bbf5bbf7c4ea42e678005f5a3306d9de1142627f1d7a71053fb62cdd7c88027569a632c0ce1471c43ab0c5c148a308289bb8b758e73a95d8bd101a729022df3a34416443dba855c2e4d303babb6dcd06d018d6ff75d2a338337d8079058fe230357468203d76c7f13774453516335050a369598a6c2b19aca834d45baa93d36553c4dc5086c6a83bd9435b8283e021b289a0c0be7bc7d0ff726000e903bb3fce63e24910735dfc6891f086f551959b8620a36b13f8a63146719a67ab3e089a46942e19fb1c79738b677f37912550bf3f94666d4b6098763477496b00edd34b0ae880d5d917fc7e6354e13af0f441c5824759f6d5ebd7d3596230318d963e923945a01768747a7d65ec0bd352c3180a7d462e55c0f1d8d860c0de11c1280a6a93112e5bf45c035a4125bfb6c1001de150e1e6fc4846f2f88807d0d70b61c6d5602172d6f708fdc6c8a3c0bbb77205819f106ca27638fc9f5684454b70f407a8fd115c0580667f37d034d4c94abc73a9c49100a27160fbbca3da3e646cc71c9d7470f4d64a6d6a3a502d81e19de06010362a248df986098dec924359bdaa34e1687e3b842728d388b00ca9e7d3b70cdfa2d1d99001df4c0a4b584dffc9bf01285c236d54fe16d53da4b99901407530accb4f44d04dccb9db631413309fb883b13b5c20514c45f657d9e69525645de6ce2ab7c009d84b381220dd4cb92d14d04e912e5cd0e76a08226dada40ac1b3925a13f9785e560967f1f5d7a1fe8aef3b9a59fefb6aa0b3946cf293e33db119ba311dbfe68115a4fd1e0f3c913a0bac805dc2701dd08e12c65651686349d2c19d4e83071d327a8d169a94fcb6d929556a80023a3278a6124895e3d349a91865c3e928d90004c1ab2b2d0662cc3fe5c1a838e2e1a6b09c0d7fead0e8277bb966bff46c52207c822571452df0ff49d0ea56438cef999b13804d41325c93819160b0a4594edfba5938854fbc31553432861f4921f519068fa636dd942c6234f0af59ccdbf7c0bfbb99dca5974b0179aed1e1b7306aa273be1bf3553ed9f5d2375a75461844208fde212bf1e5081119867a888536892fe9101fc60b1fae1827f91a12cd3558879ef6b9f0618e45b2c52eb7e6d19dbbc1946162eb60139b1986c9cad671d1004316ba1b8351b1ae1459851d27aac1d00c8dfc8c270e62558a39b9b806000dfca54650f1e5f5e6e27b883f3624adb735180903c9128eed8d5717c89afbd220600186d6ac52b84b2e3d8e73c77684b23f91319bccae9534e26dc11384e80a8e18b932b1840475411f04c304466c842dfd704089d3ff5a7c276e108d2d60982c74871c6743c6a06f161b7a876652aa7a1fcc355e4718ae2be738cce5cdeb79375c07cd4527fb803769470a53be259d03abd4fc32efa4b123210083d70687d8cebe51833c4c64b9ddbc57e044b3e2c5cfd8ed39e491ff784f698fdff7a3d26cc23ddcc8407eafdd9f97c4dbbd2270d95449784ed21c856dee6bfaab63db961e29bfa5943173077774089e2ea7802d02d25cbdc3e4a6d5840f236d7310081f544be0c7f94d9faa19951580eac4e2977a33795942d20f8fb93058412413478fe08ab08c1fe12096edbfe7fd5b6b109c36ac3f54fe990fa9df44c2fecc94bd0c2bdab17a65293fb29b0acfef040efc36e585d8109c2c5051e762eff397733de44fd9c0d456e419be1f6ffab6923b1e96f3e2019f0de31aad1eb4d00b486f9ddf04bdeab59d208182d18b2baa6801d2b8c446902f9a00406108336640d8bcc91c24f503779781291bb272ecaf53b0ef21235449e359ea741e75de758132c2abf5afdbe2dee320484a28d21c4e350151f30f6021a41406fda6b24e1f260fc242d6cb9752c1c9a03688369ea448364abaa4c26120d84316b6dbf288e87df8971716a4fad7bcd5c143c43886fef6063676f977c167f96ca4b10d4b76ad611c1093b7dc50ecbe4deaaf812eb116c77a04c748dad9ca8a3d26562290dd92422ebb1f9deb3125d01b27211dbb4483e38eed81cabaa80121e663d83aa635d5345db3b71456c5b1e93d25cf6c354c13b4634d4a786511d23666bcfffcb4b7cf215d4910b0d38c14a929848d8bf3a28d7915f9180a70dfecdec550f0c44b42816304387c4e12e88fd6ec90fe364652d1da0ad12126793f68d6fcd0ca77f9f05729ae8424aa582d193cb4bce08733dd1875180b8e7dc5bb588107b7ddca60d51af90e2c0b1650055ff566f9e61423bbb0f6e3f84c5cbbc55cc645b318fedb08c86915d5602acca80bd57146de64848315a9c7bc1c8d3d74e68fb8b01f78d7f0ba491348310330ff1ac87d886699a3661958e8c83765a9b62abfdc98bf780ae9eab0589e9c6dd4d70f91bec9adea3450cb7ac6e582f5de16236e326536811fbe7f75a5910baefd3bc158fdb1d607a8204be56ce47f25a593e6e0fe2081bbf4e962c67318838dc5c22d1bc830be20bd4c5e7f95c9cd1ea35f05704cb061e6a63d0542d6b2400103c2464598487161d9f023ae8a30dbad84f56f4898dfef81d90fc5a9a71097817b34051a61e480d3d16c7a42a00f422b984aa68c4daf50d9bf44f1a9682ef60957226ca5d5d59610e3d7eca3f4c3f9bf00a7e47c58f8fb09080e30bc2e11f8b21f1f921f37cc71bd2c10557bf52c4f643618ec0b1b61c53aafb295de0a955da1233c368fd1f6e0f23ac68d15e063489fd97488642007c6476c1f1d567f8c71c2dcb7b17a67fa69bd0a04fd32d034002127b8fafcb5cad0307b54779e80c9925610400542b103ce5f48489b98c658e4d001d2101b31ac84d02c86fd2ab7d14551c5524f6ca4df3d9786653de667b1dbf29958e60b9eca8a5da61066638559a3f283c4bb27ebdb3c3c1cf8d95fa764d89659b700b4583edae995070e1077e0c7a258cae808b5638b149a35ce7db442a7de3d28c731207816b4cb9d21c15c92afbab189f71b0032f5171b59198677d8342808c3c4784efb6f8cfca06e10e9889efea62894628038f6c344e5b77cf59ae026465094c7c042a1c21df699f9e846c89dc8063039da9323284d0d9c08cfd6a64ed311a06843e5d0662369f15a61f20748bb028f7d0d5ff0983bf4a755e40a9d1aa569ca88eab140677341659ed2ca8df6f9f36929d6f3bf50ce08f9a9282a73e9beca1591a5f576c8272613b5bf1249a8c9c35271b2d898a18b1074a36c1eb1adb7b2777b0e1898ed2823ed3dd2bb212240731b97d1856f3cabe5c5a93be602dcdf442a3d76745e50d86461e14e3e28465ad425318d0f951f53c9b91843a0e1c07011d9ea748a7693fe58351c4a0b70ed46ebb9b4ef81b769a5553287c0024c17e8a1644d819cee78a1686a103f7299a28fabbe4bd1a17faac3c05b244ec02ac34442064fefc609799cb0fde53276900fbb040c75e86f98871795dcef6cfeac8d20b87e51449a6877632680ed3c35c789c8cef5e631a1cc5d050db4be36e64ac65a34262966000d7f7ece06f5aa4176bd89597b10c883ae956b65cfb9e9995778e9641657ff46ee24491e04f0e4e4c1d2f906decc305e68aaec4b697d513094144960b99a5345baf90f3d173f575ca4aa50f7377cc2ebd6161319bcf3bcf21838f021b76391315c347843391b6a883ba4238fb56d705ebe7655fd706291a946e920161058e76b455b71bdf3a03ff936952f7e8a39c15dad1b44e434821a8791ba1eb5bacc7f417658fd5ab5526b02d24e868e157228d10f147f36d89eeafdd6f5e055f93e0ff79346f8b3df9f0b4905b983147df8e94bf120491182de47bb0ea5d6981859a56fb2ba6c47f1f28ece7b81cdc9611443f10aaad69531f7226377e14b7a0e7e4394e962536c5bb308b29d1bdc4ed515d7dbebe1da1e3824c35a3774f12b838e6a9d5a5b3b5c23104a1603422c14a12098cea6512966cbce90efbc3acfa0a780255e7150237574199832c964fe95ffa58bb8f865300509a01946197c03fedf7e5a259d95c2914eab58d0965f32d8715fb772aedf8d1f4bc2e8cad29249f0542a89b18fc9d231b023910ea6f16a8a4279a157b85c161673ba70098db865044c517f61212240f855dbe6db465822482d22e618f5d91111d9e1f1563d5318624aead0e5d8647facd20513e027123a4d653121a2c94d4a3a4eb3fef40730a0b64537317c4f32abc3b1fbb5ba3c60f43c5dbb0ae2cfea23bb123daf68235c0a52b5b59d8bd3305074214418515cbf511668ec49252cb0c84e819d37d2c9c4cacc8cd3f839ae1878c2e3914f210c5cac59cb767aee3ccea8f0375194ca0d915a913494b7761f1669027f4240253881c3893b609adf80562a695e121d1da0516e54b0ae908a01e620fe4689449fe9bb1a6891a52b1c31cb41c5c220d8315a7afc6ae8e1aa0ac810c0612c950c51cf014aefc46fcf705aeacedc71cc73fc295275e6f2974a1ea581a1d007f8dcca4884d24621f878719f18e8fee9c46b827175af8c7ec97dcfb3cdb04187422857c8d5df6c160c3a807e3a4391c2a60730e5e338994225f59039b637d923c666ebe7e72631a3081415b8b7e292f2d99b38b6400e033dda2ce89f9faf4b63385200937e8a0e15a6043325bb81c41da4aa23ca5cbf126d964df5605994f5348a8e55d85747e8c8f18936355816a6f88956142f07127cbd227c70b5238756a669fcd63778cacc6273f2523cb364a29a00541902d06c6b0d7a0ca351063f77355a455cbadca85d88f10381d0832c5242beabdb9aa1a2509446e19dfe6db791a9bd1234571e2b75e8431bb6ed53e16905ebaccaa5c78c05a91ee46d568187cc762358a2a6f0532f244d13f98437418e72c51f6156df91940f886750133f97e1f83fb9bba15b3338ebce1a672b8ea4dc4785dee6a9155206dbddd4af08d9f1edd41e4de2d2d061687dd8e068e3d0daee4f17db14e45a668b20483512b55550a1e2288858195c81a4afbc4bf3e29c414319f99e13f41050636e2b39b215297bfe89aa4d06f6b0ec38e5197c1bab256ccbe1a345263d289bd1ff1f89e3b2347d8881a28ac7a4053c43037c1923a111ac5de3a0e612fa7a125cee56f12b88f5f24b1307f9ad5d3a2711202d4ce914513e1a84e249d4cdf993fbd4f3e8d4915660ea165d8185f3ecc3afbff972b5eb216f788059e905db243b66e40363f18e4e14ad0e673788b14de343244f0550128a353798ffffdfd5ea86310d9dbe50e82bf611664ad535dbe3bf7b81f0491a44b21f71038d2bcb1206742d5c50b586129ed4783d999de4f61905b9b367896549e6b2bece952ae50cafb9f80c80fe75318c4b25603dd35117c597a80ff706be2a6495d0da152fb5a4a1c9f5d7765cfd02d1445b150939a63828842422f7bcc880c9c5abc5dc3084e706404fb4c119d70cdff025bb44714984114b5c0a9b5ac9301e47b96ccaa4913697a9152f027d6ad388f47bd151416eeb36338f08219e05ab02de960d6a68f90bbc42afb1040b42d39aaf77bd01369cf9935b1320469a928ffaa8cd242e6e738f34e5dd7e5b62d1e23d897c85bc0b16d107188ae714eede6c67c8b972cb52a4e6142cc20c08ff6118de6d090bfc679bb1c3dc68aa0180f2c6b2a5704ff528d556b6e5bfd919d860a624309c67629441044e2837f0a6e927a059c791b842696e86c437df56a30db80906f44491e0f14eaca5687ceb0a4fcbed6535ad587a47e8fe7f1c7ae32cda5995110eec7661cd428b82b3b30b61909f38677872867d6ebe404361896aa24735d204163cdc014e80fca7c878c138b7d69fa942621381ccd85302045d4f44562502690873403627d3e2ad791f94312bd6b91fd36a2e5dd3c780cce27e00886934eda27f0fb1fa740f112ca4b9dec8013935098be3da956226226a9e42c5d729883c1c6260d32e65b3001d9d457e8099b9692494ce3f21e7cc4cc80a296ee6312e5bd6636a4ca205675e94d7ea77fa06a99846d18fc0386d169fd261a8daa1db519020a8ddb325b398857331217225a866390bbc1b29dd4a51c4e6c30477238d9137452496bc0006ce39ef313829ae375938b49d570859deb6e0e1550b47d30166295a3dc9488a84fb727b5ad5435746598320fd0270a6b53022d5fd1083bd1699ca409299aa51e20d02a6847012ab0968f9530d6167dc38ffe4949c37db9dc2a7f7de1d0c328d2be32f86c570bdce0f0e15efbf02e17cccd099a12e2129ac9f81886c02e7e2bf40b9dc4d02fe87e44bf70c152802274da297ac7e8175c1047bf405589f40b512d33b493b79ef8791b3703f52874ee3b2a1faa96fde585f26597b46175f25fb8d37fe587e2c392cf17729cde10fb2105a49f669df5c4aaaecd64bec682c096698fe16f36b9beb218c2236c5665a65a610da5a2d91c63a1158e0ccc85375b23ad57689c5b3fbb7ca0ed42886c059b55963ace2f2f708e9b90c2be063514bcb10382a1b69792b83cfd649659479d3a6ae334993552d58da041c86c62c234b4841bdd83af01e59a03519d4827ee7f2edbba8172044a903e87c2caaf8216703688f6bab068ae22a50518b4cd29ebbeaa6095f6b24293ee4465534baf86ac87d6e41dd72391e8a86320200426eb31be2968e382c81b7fe48eeb7c07653617eb31ebc31a5c9342630763b469d348b24453ebc6e99a3726c98889d5bd894321cbdf4bcbd029efbe93201435228f47ec81adc3eade7c242c31f3e1b00d999cd10e6cc59b15ac0a973d09bbcb6ac7f862376c980b82d1738a3ebfda25c3364e0958df39967a2931fbaf8eb6b1421f962f782c75e5a8c544e03a901f600b31ba4f34aebf5293c11b59d3fede96be359fd5c832d176c2c3bd36d8e966c485e81f5a1c2de855b387981c55b105c7560ee5bc97994d2a1afb21e558bf047a28b89dc6dfd1817e8690278eaaf769c73697ddd2a47592ff639f59eefb47fa8330c985969b05223115d0d0d8cf31b08e5e325d41e9f1bea1cc817aa83e140e62399ccc3ed39a895773ab710f2238dbcdfa860f3d8dbe55e6a8b92b0b830051acd0002ec19a220d2d01dcf6ff2c0eb09bc549c6d2d076e985060903e58b617866e22b0db16760a63b76617e937e683443d8a639c070fd5f2a9b6132e28970e14e924cd4de5933445c5c5aa1c223c30d29478fb46e9bfdd8798713dbc540ddbe1438970f52919920b5bf7d35162ea841acd8f485a69095da64602b8ac9aedeb96c948a0705248e3e8ff729f286d5eca8dd2476500b617fe636f617a34817f9c166cfbdebbb1c23abcce065f5cb0b550cb1e91f6b64faa04a132d76be2497ab212d9f5e9d6f2d6724d7dfc7331e466600c45ee33d255f794644631f0cefe6cc1e51ef1355ee616b5227f43ed615268346d79193147d975bd6b493763c38bc16bee32c779250acd18ea15d5de124c888895844cfa740166c0a94a42d624c8b5f7146624efdc257bd420601d65a428834b789036ed490fd4be3a3f7c5d2d401dc6d984e734e65a019520376dc3e305a8bf7b41647e10180e1ec5f3c3567fa3f7e00486e6fbe53dd0911fc2319cd05652fda97ff429e384b9c13108e6480e8547722746fa04dea319fe682d1aea26db6867da72bcfb3570433a3ad5422b89fa1e79060a9fc11c1f86455135ca4a74cfeb707922b028f80e177f5c3ac44aa5db1b0de0ce46131891013a1854e8ff7442883e9474d170548e24ce83cc3a93282d818e51c6ffb13a658ca3a4e3f6d49fb30da6745ad1bffa8cefec58352ffcb339013294a902937f9a4bdd3d0b0e491b66481f0bcff577ea7c1c73c45047856a2ff2bcf0fe3c74fe39e6fe3864fe3ceaf36567d7db2bf685100683c48cb2e82108c9665d54d2d7b17206bac10cb2705bc753ac701c54c4e6319123121586d4308415d0595480f54670a98ea1124276c039c2b345a79f3c70c14f5a6df00de4007d23d5474a8b887af458a1eeaf91e7689f2aa8642a548da5c4d78c32bdd67812554f32b8388635b0e9d80dc04a659e160e64ac99b6e2a96140adbe2766cd8f32639179275769f34107cb325b5b070dab05dc0f770e7ad0236e399b921e40d27665fd3c5b45d3be9e53a42eccbfe9319b968a5bd38842267ca5bd090c6c834baf6d2cb880db372ed71c5b06ee0aec0d89144f1ecb7849e641b3615da04fce8c579a88e9a122fee826efe1c91c887c71ea43c495b361e2b099c98766e64d4a4a724941bad74e0f2e895543cd794eb07fd0a6645ceb4fbc22a8a5ddc04d2831097a514ee3e1b42bace9319e0f74f45c6ea183bf2d94f31c235692983610e59369ec3be860c6788b2313a95162d11c383bf9aad371de44be058ce98b904f792f8fcc4ef77dac2740ea8ab42e0aad8ab8ce609b192925c2b745d6ddba1decd3c551faa13d2435a41e2669b0a5182ac7eca26e1a7e923544f028ae329365edf0fce818934400d71138dfc30dfa17b9fbb21324eee98ff27d11bf3dfcddb26a142f98869a8279566aadb148d5ef408b5510802d050b7a8135ebca69a2b2ec1c5517abf1e0629c1b9452911c4c39438d62e6f1ae1bdf20b04d69a64d1b996402f8f9bb01812a45c6c456504309586ad323bb0fff12c3c35b8d8857c4b1c661d1cdc4af241c15a3c1bb68e0158020eb3f8d647a89e9188f3da2c099c1a13544d8382568e115ce46ced46ad834b3da7c1e032b3b3139d7a3e0d89007b5e1bd07b24e4aff77f929e6c0cc5eaff4429d21a0e75ee7cc843bee9c12fe08bc4d1b3065ba350426e3b2867333d85d545bc1dd37ac002113787b203f62c6a9466ecae551eeb63fefb0d3f9d6d871d8dce66d29f1d1554893ab731c101838e4d28b52c3c645ac3c2639b25cb32836639552a8a1a7486cd936f3873bc2e0d1b34fe5cd12e50f034ec74c56d5baede9d284e08a1be134760a260d7f09aa7d629d78d08ba2d5ea78cf7514b2248cc47411ca872fb493bc808bcfa305039f010e364259a523b5732baaf5b0188bb27e0425d89c9e4787c7859d72be68b378c78d32c86f6c9ab05ce0ebb65af414404b90a319a7bcf1972905fe0f1eb22b40aecb0739f08339bf7b087fe44fe3237814cfea32d6732027c6c507766149ef555f2afefdfe728ea5ef2c2e438fa0187fb51dbf7c2505701dc37f82edc9d14a5fedc725129357ba6d6560e93581b1bbb6f371edb05ee3848df51fd375a55b011e15b2ebc6e48f02f63f11a889e037df8552b29830eade9d0f9a79515dd40d137290fdf0c90ccda5830a714a1bb6515a7defd3cea48d4c4c524a987c600ce20b89550197f7a6267e652ceb5c6290a5c5454413fd256ea4c82de66c35875f4e8491b3a9d0f62961afd494dc2d9fe851b579fbfa3a19521afefa42f67a0e1d81e328a3bbea238a9a2a0a39bd9658061416001f46f9a51833a0757cc126264a19727b74fe4042f0ec644f625222e4e59c3778a277e2582372d16d173755e4f243f34d6e02bb689a93d5cff22670ecbffa0bc5619c27f79c81f71c274fb89eaa56fac983d06f4d0845e33211cb038c016d8e39bec1adf755a178e72b422b88354bc930cc3c3bc32d6a5e4472a338fed318daca1b3076753f0d36457bc62633ca7799377bee73e5d3e5349aa8fd22567ac5f3436abd83fc4f83da4ae29b254e54b229199a9217dc57f342f57ec92e583a2323e56b59b5e7935976a240866c35a9fbfc752bbba6f94a997962ef324220ca4f77e72d97c02aec0402b3ae301e2aa39b10d627b27bb62a2ac20fea50ae615ea3b319f0ad1b96b9ef68fa5cc4528672f3a1a0b19b7f28512078b1358b36910672c1fd680c6842965ff9c703689c90502f206865dbd7d8d2749450888ad0f37544054d8cc481257e06ff7e0fa6fe39f1ceeb010f1e5e20739362e54e49d23c47791ad13f409bb5a506a9588b8a3c208442f2d4180e620ca34a5ef342a313304fe5d84c7847a352c4b66ca3980a6c8d973c9df3153b79ab1f6b6f17c07eb34fcc9276d6a3310a3a42067441681c04ae1a0fa6832f8b448305d2e7a53ec26c7d1cfd1a49b32d455ea4ecc4a92e4bb68996a9ebb092fb0837a1bde7883e0908729364ef00dbbae2a9acdf61d4b490ff3531609c2ffb3c9fe665360c87b07f87e694f2e5c87d4c4c38407cc315a85eda3ed9a7a899b748e9a1d3140302be3e10022a98aefb0fed3c10cdf1eff06072c3bdbd12d7b90b456601a2191987d79c36345fb753a7867354d1c3b3c14a0a9b0c0ce40d3b491b583d4296aca5257b66633b2d73a0ae78d24a26fd89fc50edfca734f80221e00bb2f23b03ccf332a3e4d96c87686653ece6054beb360d61a5c9c7816b0a6da1b2f622680c2de6922ee5c4700ec2b3d7e09634f88c5fb9a30b1c315d9ee8a3359b0ef99c8f3468575ae6ede84c9d11528ae0ad0e84480a4c3501c63be82f6017c13056d86f7c31a92ef35c179ba438660b046305cfad38a7e7da6660b94246708bf0f05ed1eb60fc2307eed967cab9f9036bc3a206a6ec7022b6a03055af227b824aa2298d21f60b544ac1b463e3923a70730be40b544d35eb1bdd81c731468d114ebdd3a67d0c4c7c3fd72a9e2f3990a164cbaafe07f551c3d583fb50d40c0d60822c49dac12c114fcb3fc3bdf86d269282dba7ab98e39b1f2b46092fbd0873e395766581a27cdc39b90b3037cf513b13f6f49b219165ef450154be5406f28a539c80921bb4f8e33c442fed415a5839a20151570c6b7c07ac66ee7d47e16a8a76b7089377db02e3420242be900b749e460f73b1da41373625beb210e4b348d1c6c6d0fd293579bb34718ef431b8a20090afee52a300b35aa72703c776e8fad8467823911fa5a7735a48811d10bd5f03f1c657490148693756017145065656592dfadf63cc1e36c9f4155cfbacaccf193d231a40d9ad7b59b7a0412fec0b656e927d2bf781a1df4d0d2f010df7ab73de03c2a4a787b94326768401c4e4fc2821a15f623b1a96f7251b41278e4c190b50a36104f11eafb09767433fadd59820f55d2092a70112886a6cbab1684fd38e577f62f5f000b8763c51855821a3841e72f480e725a0925629246c72c1ae13216af8b9c550fa23b686daf464a4b122a12bef240f62c5b3e775e0e95c9f41926c998ebc9bf02725f1b9a53924f805f4b638531484c338709eb10aaa6271b8b2ffa8c4da8e6d4b06671b63a1566bb91cc428855498de0a9d5f1b1da09ad8a8c39bd912371216aa49f506c67b79086cded1d0450017d6b8b5ee2b91fb091c8c302deca553adc79cd85b1160d7ab1808151ff029c775f41bee6015b5c4b0fbaa5287d47d1418621a9a301fc5baf543f4bd3e7ec30422fe070dbea2cdd22fcf8333526dc42a58fca0bf622e4088f95f394f6cb2e6da610c11f64993776c349c616524705669dd304c8a724e229ca3123a1e39484c1ed1f08d4b8de0a461c7b0728e2cf0db03a9cf6917edf1521ca060f8a97f3d73b22a8ad3515bc295c19d21cc8daf22373be9ace238132a0c5f58966a39f43da502424b2d5af2bf5ea24974c9f838c839989e639851ca75210c067b445aac94f405a17d79004c156212de0a8677689321413d086308989161fbca0fd486607e45b1c8f3429493a6ee1b033c5911bb3656ed8b56106d449d33697d8861498b4bc2f970259838576485a765a3b35696df62946981807d45465c00201e08c55b2803e10b1fa0e159728af51e34b4e5ed235d3eda20ba926d423a5365431a994c2177122e87e0c03668f729c584619c4124be2354d667c5d89b002f213644b99a5b29e40dec58402a1c1d31feaea8e217aa4c308e9c32892647d596271cc57d5433b262e30d08329e15a32653a9046daafdb5a21a2bdf80675e125f739fce88d174ab12ac66f928509cd35096dd70249cb8e470d1edfc6f66fcb9c4ccd4325943b3cc9a77b35560d48d5ea05c33fb67b96b11f068ae066c1160eb6316d84ff0d316a95bab8c05798d32b7715178c117ad3d6f2b299e65602b8df40b0e8834a7d017316785957113b672c256e7e98bc2b49c6a8039af2210c8c552e60ba9268a2fcc6a2b94d56d5be8117eca2edc4532b971d5bd18c34200a35001e7db51570ad468883cd2768868a401fccb298fd47751952e35e52ca262d0a84f04a020c4418ee8d99e4ea56cb5dd8ece561a93b4decdec85c762cdf9fa1d49c462f478166f1a55c5f89600407f54a1d6460cb4eb72f7d468166cbc18a08d7b9859d266a047edd42b48f50b2b4d4725acaf36ebbe9ac3a6f9e59502b547b861a920bc741954cd183890c0b5698dd1d9e5e8e6d777ce6d9d12f172948e0d935d15170e95fe44942598872453a4f0998f1ea33bcc5083f29494f254ac1c2cc2d0f819316b92fa5c0f143f49da1c9c6a046749908324b57cabe0f5955d0aab2923da1c8e3320b0562ed0087e83671b1deaf0aa88193a2ffa3d81ff628b56fac8b9d39147ba6c33e30100111bb89bb72e1c051341d7cb845e44ab7012bedf5647ad41ff69600f484c77f416b4c3852ab39612e1db490e3420c3162c05f3f610b8b767ec67acc2d51f6a7ee95659c57347d7dc742ce4308e8adbcfb7446a0f92908eeb7bd2deceed3463265c96040fb4f8d3d597765554f2e37395035f15cda0dba6ee8d93c215bc99a3aa1cde9d0a7b196ee3c9aac030086c209eff7a1b0c40651c60333d9a2fb827b0727560a9e288cf90a299c748045a5e3b5571954b9658109152e303ce44447c58044a29ce4dddf5623480611d3506ce4c33c89212abc7e86c36df0eef3283ba1c2e4eaeb1d22156776a096f41b91c45a670266a1591616b2601d511fd85bb4f734891453019fb29fd27f812a3cfcce4eb61ac9533ba382188b845b0272730e2b64dbea2d20a7152dc0508b8d7b386c6506d70302913bd56aa82c02c71760e823552bbe10c8c93e88a9f9555a56e2c7558856df4e106a6b3d2dee7cc784136066acd44fe9baa420be8310f286259e8e5c514dce03bd043277315ea2728cae7ff6c22d99a81229754e31f11ba286db04ce699a11e5dc18f42441df222d3febfee00ce13e5f652cdafb8908d0f4a413a5c14c1603dce0da411c6d12785e4b8e9f26b9e69cf2b329886e3d4c2ad4ad348f5e3ab6d7ee364d7ee41a46da237e9a73c836ec11f6c96cc49872d2c4f7712da09a9a1c640f8a16465e274dc46a264dd33a306be9ac0dcd1286b929da686c557ba645476f285cd1d0f26c625e38d12ff7c14ae6bbaaa8de28dba9502108de53511e8a3fd047186dff117a4aea073953ab5cd2855498a2d11585e7e7740ebb594ff8ad18bf99b986dd188f5f550a56a65b6ce579546b957d7d1f71afccfef1682d5b4af8998a91ca0aa40394c8c2845bfc2053aaf22c1f7e12b7263c62a7838b0f11c70826d25bdb2b28c97ebbaf378473f0ee1fdccfd24e83c509e79ca678ea6ca1001fae32a6cc0a62849aa4765573a59b05e11f5e0687d971157e302202f1846de5d69b3f750bebc217e40c22530e969c721abb66ba2937714b37db33570b9e6d7701f6ebcbc7d250db845628486fbaa1af56692dc340d98be0ccb8c10186fd9a20dc7e9fe5c5662120b2e1a012d3f0e7dda309960f7b20e994ec70a4c0cf73304e9940383af5b1352eb5f9deaf5d489f0b86883b1003b48bf03dd2f1e9c8c140e3d10bb808e06b380e1a1f3d37438cba31e5bec86fffb15fedf97caf981a014733b31a01d105802f273bc5cd6da626092c88b1c2cfc136027e8deef9984806e6c52e82b9d6d51d2480e0f6728bf8bd40e791b7ada41566cfa705d4c7b5f468fe0c914ffea76957ae55f0d60ea7224f885cf6117b8267a548ce8887a7256f042cefbd3f647e2cded2d6e32f58713334f075c5e780cf958f51f8eda3de9320110cd61c803dca1f70910f89ee368b99ff50ff4912f1bda30ad92961ef569d9bdbe8e6edd05e6d3213504c6db67244675d7c78085f0332984645d6f18b13bc68fb9029b52df174500b55883dd659aa1fe05b97dd549d3c9084edf4d54924db0dc3fd13d5893ee0358234b016dcad17d83b56f97ed5b0d96d4ddf0284ef47af8644f81a14e2b613aaba1e5e8a0e42cff038003a721a695d94ae479441b23e289a7380f4d10472859c915a3d350e280b57ea318e2246465d5b48ba7dd2d85cdd216a0b66d3ded440acc58d35a93f44ae1123793f6d334ccc6dc32fc1543431f3a131f171187010e920fdb051ce2ad893ba52214b3fa29188132d734aa02d033792c3715d30a824192fa4f8f8a9715bc996d948be853e3572db26d1feb291ee0b56e9d6410d5adbb6473df43c77269f2ce7b61d7802b577f214b30afe043fcb8fbcce2cd38dea5ffff2c7b3c4e0059e27d2b0699076cbb169b7fca033b70255d419619448569bc1b7c6d36cf90937a59e927ee612b5bc3eee1ec96b333d25461b7b73edd87408f8fb651434a0ca312e5f87f670b366b81161755cbe135b6ddafad78642dc0c93452950a2d36761911e7ef71df39c9e3395a4a243725fb4b00a75b49f6d1cc2dd0dd53795d36a92fcc43b728527bd2129314a231f08e6bce50350a6616db09c3544093fad11200c29e9582b3565493099a2f0095b3c9d141efc54b64d7878685c1976edb66ff25ff646cd47e6b354af3e38e271a3c4c8e4f7dfd2f72ff7c7e7a152cdc8011734ec4cfff1f06bda81662d08e9e82d020ac05af13ea09e2229bfaa07a1cbe9edea0957cb735642aefc579c9d2a4376f17c9ae85fc98a7b86023aefe3694a6c053e0ea638973118294b6e60b390d3266a437e656916402c21bd3899899a89261915439a50e17bf507b0dcbcecf52ffd9eb623704cd1e87e31a7e9b6da1dc6dbc20aecdb68e1d22a8acb7677cc745e1ef57d1714c50a9b5cf788a7b2eb3ec1a43eec38126a37851e97227f653307ff7ea9d5b38a0a99c444244a21d9a4114e256112c9df339aa5cf27bc0ff31f4c63a1ddb4e5019483f90f97ab06bd48616cd8fde8530972f3d2d2dcd8dbae19ec5aa49da5cf466827bfc294eaaa41e65dc3b8509583872bf714d71cacc4c38514d4fdf7efbea3fdb2cf94b2249973a19410fded06fa91a0ffa4ce2ac005b0b271f7accabb14baeaf5e728783c63df8cbf35779ad80717d202bf67d2fc781b304474df08572784d854baa34bbe6303d77ecbb430fa6ca79d488f55b0899c92bfae9865197f652c71ec79c5f273d3edddb920653a13a1a47f34e5da1b7d204b1a1f2361e4281b0f0f75d2805362647889289b695cb30127fafff75f0595cbd5b06361689b13cd5fb93a9ab3cdbb124984222f517438ac6f33a9c85d331042c7b0ac2788288a6ea22b5a5f16cafd5ac29124cd23a890f99cecef13c1319ad914f592bd46c7c645f74d5218e94515393d1a3f8cf325eec167bf3479d690b7b0e0b97153715f756c1eb3e893f12da3963a7cf9b1e0e69c4b3e0fe0db450ee701f47ec26251c81f756e7e192696f94a5375063233f351756ad3d27259361699fece8dd007772d4fcf1485c22b690c6d29a067d674d5568c9e38a355bf21e1813bb12ea02aa7b93f4fe1742b7524cd23c5f8d965c8657a900e877a9a1e8949b124fbf3711c3cf3cac15bda6420308e76775c185a26ed0b8b0040cb72cf956a7845bdc3507d021f24d71e229a93b2c7584d2db662e7b9a20991c1c572930058a9351db8a2316d96b08b0680a30db580e46433a7687440e664f9ee8e24607c601dd620230b715a52ac46cc7a128d3081b5775a9322ec9f4442c75bd9bcda3303087a0c8b30635e8124c6c64959a6adb2f8821b7d6652a3b976608f13e8396a63f3caa3a0e118b9c169f9d185ab81053a64c1880c07bd8e700ec36095907142f56fd28ded5dcd02a45ef84e5869a1a7c6df6dc45896e290470926832d06ec20ac55888524bc258440317d8de9cff35172dbe8146231923196aa4436d64fe3c119a6db938f23c518c9aa66042e8b0bdb33bdbb2430101cc764f8015f20d73411ea5aca763fe805eec12425b689fd8f356ad568c2d8526bffc22b0380501ce3a6c1470f21293beac18df81fc572345d670791d3087d50afc031612f917747f38e18469aadfd73e27f72605114410f5686b46f1992e93ab8261d9ca36cd3b56ab5780e2efa6e43691e0aae877a2ace38c443c4b7c47c5867cd43e8c32c256a1b331075a5f8000fd93ccc559030f792db0a133bb450de342d04225868cf32bd9ae0f9c6f7431dd5a1d8e31292fe386a37d1b17788a37fc923aecdff6449d334622ed4ae19d538c2c2a57b206e4c966e765d59f29a077d5197c372d3abd1d4dc51b2df78d97ed588a7bf696c917f1e034270fabaa4832e12abec142ddb647aa11b355f54adef21a8e0157ad697da9028037ebfb1480ea3a6dc54a33b5a7099334508f840af38606c41ec02e5e8d2f7dc51d5efcbe8592e4d262ded570346a696ae31785950b2785693cd2204466a199f6c7e3eee4d0038b9f92087c255d9b808b38268e39202297b361079482195e18cf0683ef74393c7a7db2524fe1cc64e79f4480ffd31c84a810216b13092741c48c8ddd419a07428aea9f7c9bba37a8b4ad63c050207c9704faa26fae1a0c43055bb522607b215989281504494bab6e8914dbe9167db1cfde011b0d1c21f2bb633f11a3f19e0488d53b69509179e3add650b8ea36ff7f1fe3dd8b5658dcae782eac4689d2100c80a5103ef8d967a9f6a026ab9e09aa7b0061aa8547778fbb4b811cf6f410bd9b19d2b8ab665d94b5cdee89e426786b5a3c36248626ed5d5ddeaeda067c4e787d4f7cd4f837f5f297335f013affc0cef5878b5438d7137de26f0036933d2082f546cf729d0cff4b6a455aa5e73f6ec3e7c78d01fa67fd6827b6433af77f3ddfe028d2329103fa0ec4c10d28b0eed33d6338224e89ebb38e224b20376f731ad5bf373ac03bb0efe614f9bd31c8c4bd0812a4a8b47322a3c7bd81610f52f68c891be63ada4306513796215b3e22b7e22954c2a0fffea030745cd7fcb7623096d2b3c60281d6444a8269cbabc408a694567e3a915f28ad9171d22a22c4dbd45bdacf7d48a731a89817a741e2b4f2d99d02c164c3e3fd2a0eca789ad2625c858ffc2d0bee480a327b4d40b3acccccda0788283a7da7063035f5fbcf53eb968664a0065b7aa21ab63e1704995c11616870d1e19ba61ed8e0046f0d83e87d19c26d56bab6ad4166c3ec2f066181aca735893be03ff71c742ceef0ae45f140edcbfaf92359ca159268ec1e3760c644c5b25cbde8e8ac5a98d25332bcb4f915dc5404c96f0137a5fdd679ea86fd20d3dab7d294f5f5cf000204ac4ea5f5b85beacdb4b69dfdf7608b1263ff3a245ba102d17e5b3abaa88da8645fa78f44729e1147f2834a24d1519714d7c2e1b269fba83e7e47b9cd0d273d39ae728662c485b7a51bdf0c877d012b8a40d6c6163be17cbb06b1aa37a8b2bbeca38ec22324b6d01e62af0a340cd1300b7bbbd56628a00b8d81066dcfe2346e6eb43490290f0792501707d7d4a198d2acb75e990c4eba1fca2b2abea67661e13dbff522ee3bc81e56106b1a4d7d6b9c0d84f8fc2be2b3eb35098cf88c67994c9707d55bf20da882383f925a296c38e408b08ac88654e454402a54007b53be2e3be54ceaf45619b506b5dc49419524c4741c7c6c9b14469f036a5e68e4bed1f2d0c8574c7952e1ecda58aa6f0ed17961842ce8cb85e84f487a28ae6b17c7840f42e196583aa60a1f9e87c55d57b02e3df90989691e22ed37c881e33b453ec8740518775101070e3aa7c5c22187e935ac4117323fa562e2d51691cd3fcf4b25e155a628e41bc305a96fb34b9fd05f415d7618cf5c69a86766f800c1c7c992cee4978db212915e082d3537faede45170c071c425e6f5db3b7a79805db37f8be4b5bfcf3f27f110ddb42083bb51e5a1f8a2900df94682f11991b51a69823896ea26324ed001b3954d3ead23bd20f247cdc81aa2436a92827bba0ca62c5ec57d30383089e0eb6a3094a0e1afb40d7b50c0479788079a9c9b18a45045ddd544c05b55b84378ea9650f43121127a8c814e387a844cfd4c0d642ef0cd0194a13e1699a5d0203caca721044c2fa854345a57d7a635c845091bb344b7dd9a9fbf8383622292f5c3173233499ed84f148fd2a2913cff9eab09eb1ffbbdb7f6250a72331904d41f917643a8771cd0df95998cf54e34319e3c1b0e02f669b02102320e02de28736ab6c76009f63577a7e9cf483364cf9174b950a84ed32df58ebabe6576c6b1384dfaab9a132ffaf4dbce3d39a1f0de5051dd96eac027defbb6cb5f1b44ebdb2f05b2871a38060eca9c25e54270fa08dcd7b8b3ac1b60528b166c08be1ca8add87d7d51f5e0c1a48bd33bc18111649d8f0ac9e5692818fc515754c3a4dba20b93c62ef021d187ef2bf43c1de93e1cfb756282774712b63248cb55a6ac38e804e5c9eda688547855a9fba25446c02d909a4b8a3228bad9a175bd10b43c087a4696f4775d2647b70509ddd2338864aa9da143d13da55bd629175b7d8688e2a0924e66b4f0a1bde52706eabc393af42c2a82c437790bb404d5c70083e152f595f70354f910d9493b0aadaf4c6c98fc2b19be8c33763f206cda234b36ab59a7216ba50cc12ca26da334b85cc9a33abf51fa4bfa98d1b64d3a266e52b5e68cdd4fd8707b57f2f60513f4168d1e471059734249650ac01d4934f820c51580f1863d37858781d2fe593931068d43c531bd249f7f045e7ca4be05b80ab6a431a4b90eb142f13e721f848c7641f7ed7999382aacd7e41a129bd1af5585988f8c789e956d24f61e40294a523d09973b193b0f4cb0ea276370f9097dd53dd089b0a2c6131391339b24d7e51e135eac2c07a9dffb046b5517c0ef515cd35f013bf116d94516ab7b537f5c248c5917ce762bea4ef44ebb524d46ef2090a7dbebefc2698f6edfe40353cd23995e21b2d739ab0ca9116b1aaaf0e4de29d9fa3d09a56e9a28ad1239d1eba199558a59851f07115c11f20c1ea1517a3f38b0c2188a6fff1507df395f18bdea651137a544b97b70475f8fc94bf325494edc2b96b29a27cb620cac4228d76bbf9cab9119ca28383198a5ea190b2954d143ca80004ea1824e705d197fce00dd4eb5a94a9135b9abab0c0d32e4c153246dd3f705787d98a5b5eacc4278d2248db9262b779f6936d138a21d6e93836e862b08f974d4463ea07488463b2f866116fc79e7006d6a40dcf62e933795740008005001e5910e439812080d20bea2aef88847d031c56a25191998f3576ef16d0bc5230f7419ed8e586657a42e32aad6985207373c39758094d784c8f68161708f63e4d02701b5088ecf93b92733aa58e34613ba066c8c71f3f787202da6927813b24d165f667a831238c2c1b0c7908b081c7305f7657ef52a35baaf8095c8664212ae66b4fd4ab4d35b72838ce9bffa4c1bfe7ad1d79890d230a893d3fe9c255619c9710aa6455639936be29cc74e868e930bfc819f660d8d18e59b8f3a9300d2c4a2ed6122dab1674d90ee62010ea74ee4c0cf108e5f18f8f28363f012de4313fb71a32deffd383ab04fe4decf970075760fc16958008553446f511f94a92d646edffce38119951e6a90ad9973c6aa2489ad481b634d2fb7af75dcc2119ad4c808f8626f0ef622eb5ced110896e91df86638f9240c295d401a54e57aa73cf7d85fe3d906dd8d7f29671009c142cc8a9ce1dfa2dc3cd633c04e20c24a758577a72eb8e6d62a2158499a402c0a45bbc4e4a893e317185c58395a335318803662f13d39e7ce09b32889c4efc49465eb196b793dc02816ca8476f2adbae5adda7ba7b24c43da573d4f4e61c87c8116169ea79235e63eab97f4137e5c69899c22d350818fa325f30c6c31e3e9f5fb055a45875a0513fac0f1120bf23020c7989ee30af475c8fe9ea25378b2f654ed72dfa37b4e67ec61a49fb1d7c1d3b4a6e03eac8f740f4021435244c4bead3a8f97437a8abdcf90ee90f86ad4d8503b04f07d344c42c00c9cc49eda93a25c8b2b64eb3e7252a68d3e2c08748d68e6174b78ca8c5dae0fd55973aae254feab6dfc688579fead857d9c9869daced356ae233292074a7a78bd80f5d59492a28b290763a3d97a8e219b303fa6072573f36ec5869ecf196b77e61ae799d18d0259820172da6184d5345a210d328398b8b9ebb5ae0a233d41a7e805da684b881b53ffae90a9d5bfe7311e54a6c05cd56c8b0e2b84000c75251587c2a487df4eb2476d1f21fa84ca82750d800ee8c372fae308a31856cd59dec87259f5c76673811e1a6253656f9e2d11bb9c22b178c92e4d8232eb895906aaf12b2229a431787a33e3a520b04b01668096efaa5e1716db86f04719b12dec1cd670eeb7074785b06b5751dcd87564b111e65eaf0cb9c562544831d1a9d055ebcf9ebc1d6db65d8a5cbc257d7abd983e35866fde8f9793190cabed4212b7a3da44de0403761c986afe8db78a24c9366e6801f14b96716cc2f4719852c3e8f245f245f88d4b82d9f9e72c3d7fbcb74af5bb03ed2cde7df525b99cc82593661050d0d59e7e7cd0cccb2545e2998a5636cb91fa3c2271b075a591b78654b6ebf985c2719ef7c371f6fdfea60770f121cbbc719dec1eaa80a16167f63a6a0969b837a6d2d9d697eef25ccbb6f8c546de6814f8e18547c74df423867ed0919f6015299c09662f0cbb87e1c227e68fe35ce4f018882e4d42b1fcc8b9741c2b918a00bd50297e4a8866f9e80e22c802a84d1a69900b1dbadc64004f06c0bda2334ddbc62a21e5b32d9b2080b3a02e9c9f90dfe871a306a0b137fe142ad3c6f925030a1d70cc19099113fd25ee754de5fa93305b6311674caba5949665fa4cb0e49a83faed8cef81ae6a3c631e0c267f7beebd00654b58390854840ed1a07dce11d2e62d89951df29fdbffc460c2d8a78eb790864e821c2a1421041c1f62d406b8db86d50eccb336403811cf562320c16a068583beeee06447a07f7abb2684e81688af5419a385fce227c5deb67be7ae8cf1710f36b86d92b0278b1eb7c9435793563cc136afe7a5be50885c4d9e29f600a38a8e2903350b4de9e824efdd102d8984e525ff9dba81ec792071f1982283f4ed03feb70e3829f40fe5f509c5df9c6591ff6ac5c190b8b068525056d1720d302b4bf210f22b5d2798b73a459b1f10a3d8f02092e371e3a2df4b3a70664ea74005c730c86cde5d7c5a8bff56aab5322bf0df5e29bd34d92e9489105cce6165ec226fe55ed63eb98f8f0175ed702c49f5b19c0c5ef5dfb907c2e94a16a7b0847c09f2a57fb7a26806710a9dfd088718b9a1028858adbb7ea702ff642de27ba8aae2e7ac56022bfba4dc669679267e05420a1e4123c162e7422c7f2dffd76e67e9581a9e8552ab41e6a00fb6d3019b4895eac6bf68cb64e95cd18ad358ceab0b9a292172aede6e6e1609d677df1c7ad1d62a0935ba352bebfc2707d890c4e45c3b813f3ecc2fb488f56c8431626615b92e72df580397793a7c53a0e31fa1387dfd2ed1f2bd67e20b9e709445a4ae869e08df0d95b286d4a4664067e1b67108a5943e8afb2efa9822c1ee17f4bb539fac9856d69fb43253bd56409c3dda0667acce9009840e36a68d2e951c93551aab30af95f52706bcf1aa50a9618ea89f3d27d2493384b50c5fddfac0cb53751bdf17852a1a1df6dd62effaf284b47993cf3895d9edafc2061864ddb46f0e0e4e4fdde22e490b39c193cd6a6ecf0cab2985683e9688d26a526b819cbfa2ea77f9017335d6745ff73adc8e000aad736516935db0705a06a94b43a57f57150c7c085eda19ba58f214f1c911f8004c2108000927043939105f9f9402d481d405dab927d8e597d1cc4f5a3245fe7e7dd7014c0facec85abc6660d0bd41a80e0bf979b09bf0d93c3d5b098632dd9cbe420d2ab952f814ac4ecca6cd6e86ad5be7badad3b93a98c935b13c3d566220eca3362d66841ce08b8c98d9ff68f6e6391e6270dff63832b84cfa00387702496d589c5b261cc4e17087d8d6f2c77cabfe71a4a8162850134127ee0aec5ae6a6b6405a12e3f276c7548e8767e352dc9448dcd74d95eed96495cd5eeee6423436277311cffd34f7c6308d2f388b5c26a0ccca300ecb492396d53c204fc5bfe82d24ae3f27142d2f19b558ba3f9c74ed44047046cb598ac71dcb5f8ec0309c0f4b586b5eed16ed1a19466e56bfb6b7ef1c1813cb835da85ba7cb2e86cb5997a399c9c5da2696ab0730e244c081aac37be538975639f8da577d9c466bcb2b277103090474ef65e54a5b6e8854da79d9d0487868f8070c0469d0b3308f1b432f6b832148b90902407e96e9ac560b38ed3a7cbfde850863681ff8df97abe66ed6738326a8902ca3e1aedc10701d80efd44c5dc922798c8bb5060c0578aa878d0f3fa35b1709fa6cd0e90babe19d427eb367fca24a9ff922995ce87cf93c9a5ce23df1d60aedd03254365d2a4641d10cc343bc343c75e27d4e50210cd2f035f6a090a10fcff44c299e923201d94ffde0fa4721340b498009354139035560c29e30829d901b8cfdfe2e7f2014a34b420e934642869a579eee960d3d8b7aed12224171da0cd5ade6e5b88ec5a668f0192c32b76eff01457fc0672eac50413145d6a886552f7020696935f14fe63a9d10ccec26faf31f59ec7c825e43f2e61b61a241241512e903df0305f3fd5d639bd3c5069e7840f8bf1e1a4eb018b3619c42db200f37373d8367f2a84f2c7ab4063220e6d686e615d4b9d01807f662280e5c623139eaf272b1d66c58e7fc4912c0a2baeff08f06e30a70190b3cf42e1928fe21856109676aa3fad1774cca6a6bfc6685405f995efd00b7d2a2dc1f6626e77c683605b90fadb500fdc3a15d1a5904b0e3668466365d1d64686aa8b1c58391ad71eed908d2e3f54eecf505ae87c368178e56c05d66a7c9278b4aab2c3ec1bfd693420f3fb1d067b0715d38868e69828a5199f3c2111d39240edd46bc0e311aa34e8b9c170e777f1149fa26060135d8781350e666abd939adbee221e2df7dbbfac2237f43fb7ea605e2b323c81bd1c2b12f5a16c307753dad5aed05fcec4c981eb8e97abf0bf81681c3c0f79b2d1dab9c99f237fd3c474513e14b69c6a987b5deff6d8f0c7eaa01acb972e36b8a4d808f6740a82dbf6783fbbab656c2fe1961a4a5050bf016c258034d5440d429e096f8eea60cb32068910e28795a229950551365c3c76752d14d68b071d3a0233d68bf4250dc36bb5ab97e12585717ac55a12caa96d7d841ddcc837391ec07b6006689e1a860f5bea2aafc064c2762ba1d72fec814243dd841ade66f9e1723eda227d06f15a868b1ed1671821d6d39d0772075a579f18eda9d2f17a4b36f991f41a05c74d01e5ee873c7a2b2b36fd0a22c2865884aa8109346841bfe5611ef53855ba694b97678fbe543336d673c9579557ea824af8e9039b89d474b99a3a2c02e65e9573e9db53abba8dbf178236520d20244ccedc4c5666dbd3d67410d50df4ab37a22a6b7806731d225cc9881bda5fa1d1c875d529f69d96206f59482afd179cdefadc4b534130cb4ad549efe6b2f445f4fc46cf98a2893c12b35c8094587ad70dc58498c0a23fc7b0f5d2decd8a755b7bfbb5b388bb9b213854c964bf0cc15f201ca6a22ca3fb10f7257bd992f159520e18b7e160d8410c9dc8ebc9c0a34d31426abcf7df32473944d98cdde76ec6a19f7f6e0bbb1d620d9d816a534f8d504ef1f9b6c13e64f8afeb7db7326512850970abd3eb7fc04c78d6e9727a2b148a6dce55adbff36002afe01e0ed65e48ac8458f18d860d67ca7319a144fa291a06cea09635eed54c7ab89a9bd1540f5a93e70a0769389a6df30087cbc9d8a26784dd8d33f3cfb0971a606de3c197bce5d5041c5d825eb669676900d0b1d487ea7a53366036185ede036e1fafd99ecfffd112552b9ec8bf630bb19054f3438cf7b26ea3efcd17236ef58732c9df5403ce3441ded972252164c4f0e808e8b3231dea3fcd07fc8ccfeb5d511392d762792eb65c2c40ea9a4dafe5f29ea910bd701fd6e3fc06b5e6066e7a3b128442c033a4e2fbe4d10108ad9e6c0b382fec74aae1346be986af4ef885e1d05e86113480178cf0c3a65730e8c35a17ed7862ec648edd92afc0a908fdacef6b404870e3956f8d156baf6c9a2dd445b5b2f2d6d22650a650c390bb10c5f034d5313494f0eaa3f3921d15189bb13aef5b696e6926be9f253b816fa6505ab86ca45724926519665fed27c9d434ac75df84a3cc2cab1c80677e1eb7922bd5195866b3e4fa5359f4172e36b1b1c6cdc741d2437add3340f8bcaacdea6c80c8ad5db14755977bbd3772559be9399d4fa4d2712eb06f9d33bb4530fb28cfc1bb9070fa90595bcb1c3d792fc25a9dac989c4caca5ab56721ada01277e83b6afefcf460911aa41b3eeb579465d5bff326ad03c98c8aae4f5aebf3dca9494be91357a469e94da83ea3731d6c4b94a82d1112abb725ead396284f223a6d88faacde86484e1ba211d6b4250293a52dd15a1b22240e99693b44664d576f3b04a6ed50960774ae754f74f2cd9ffeb9a7576549ea957c7b93a18f7c75d7d24fcc39bf568427c5a58f23c67a4dc9562213eec7844b71bf14f73b8de569d2138f7b1dce77c257a251739ee2fec4cf0dade59acb3cf4c794e21ee7483ea21b5a73afbb7182f94ffa29c3317d0d1c1c0a25dc2bf95ca3f0b9c6f170e09ea4acccdfe2bab1a307d2ebc8a393d7eb19bd0e49f3769830d17bdd9b30b122f9f23b5a5c5af34f47c9513da35eef478c57a2ab2b8afa2ee74341252e990103c70c9a9c465fe17ec7dbf9d36a7e2ec57d8a53f515efd34fd26be9ef52a39d9a8485e291dee87548bedd1bf9723ba35d1fa313af3bf14868ea232ef974f87ae24dbcf37cec767fe277e2777fe24744dfe879274e9cf831217dd989c73dd289c7fd89c77df94956f47b9fe4437aa337b1a2c5a555357a2ef2c89d67a4237938d0dd4f35b1254d71b8cf7b7a5a55a2b8d486441b1274de84a2fa7ca2d6fae75aa385e0acfa555523a951cbd0d74f44ff446a414d7139dd76686dc53d8af274e01efd25509fb9aa3dd769d5b54ade0f555fbd7a8df59af220b38c37af64aaaf348fc92be740dfcbd330e17e5e197d732d57bd926846499e174a9ea86752ff7838905a50cbcf4fa27af0109273b43e4fbfceb75bf275b753f33b4f976bee75aef31dcf4bf7db69a7a524b58c4a3e7a3ee9dba5b85c0a4d4e4f5c24ef00cfbc1df9005f99c8ff99d840c599b9d446e813ca20a9ca5a1e01662dd33f75983a6ba31ceadb9d6b749a24894970a02489333f13d25dfd912e8f48f371bf3f3fc99acb7c47895765d7672d91f4da8eb7eb731ae553afedf8ecfae82b5dea76a76fd7f3a1afcff3ccfd6e4f6e37a8779e4ffe7a3f2ecd27cb503f939f537aadf4dbf559f3a73ffd3b3ee4e75dcef9519dcbedd03752faf357a6849a28d7a0387fa75f09e5e19476e51a8d5ea138c1e3f1aa902949e6488d44eb412b7197c9d76b3b94b8f3b312779accfd887d5662bcfb11777dd6ddebcfbdfe9deaf946aff327edb268175e3cc9d468b7db63f4b9dff9f27fcfd743e123aae69ff0adc959928c7216a4cf471a0c92869273ce2ad223fd98d2effd99c14a24cd906648ac9cc54cba23aabd9f892d6ab1b8c47bb3445f3dca5948ac52eff86419f9478493ace81bfd76bcddee473cf51aef777c78bc5d9f1d492c7aa20c653d8b4bebaeb894a65e5cda957b52944923486d1d4446d0db5a04126b963623f6b41901a66d90a1b64170da8c582bc2098f88257828566f23e207384b44e041716f78690c2a4a44999388124e932402845d49c4951dc9b544c405bb408b0215a12e2dfd529f9528c5535bfa403b18f1b896d8e8768164c8e90299c1e57a08c4b6123dcd5295401facaa96405c024151cf404a7426a041bdb28701a0219600f98003346707088eb9b4f44e3c1e6c4001bdd094a4ee965e6a97b402101b8ab6d9c17413c300e8a7e8ab6ddee894d480bae0c007d09695a8ae015445ad011006aabaf443f801c464355abd6d88422bd109510628ba08e7c682d207dc104975929654152dfdc080439b892c351cbce0c06682d4aabaa406b1129d701bfcc993fea963fed1015d5a7aa73f32c051b9ceb42cc9b3f77666257a9a5e0e7f525853555dfaa5d5dbfe6c59894b2b511d82cb99d41549ea92ba624b3bfdb2ac5422482cae3f6b59b70971c3aec9d3f849c25c81085c6ec52f2d71a5764ce0b896b49b5dbae2975e09f55cbdcdcf9a156b8985de2942cfec202db598e4d2921f2aa71f28a89fb5924f2021fc08b1c34a94e259d1a12b3493905f9aeaf055877bd3ea9a49080e49fab84fd2e5dfd4847e53d3af58c9a55cdcadbbd50c4099f9534b5393527443c0c1e36d7f0cadba6d882fab7e4bad5f4c25ee564d6c223eadf9b59e55f391b3eaa5b5055d5ebd4c132f79ac73cde78bce576f426a53ae3b5ece39e79c7de4ca33d2bc1f655a9a9ac6a63b2be1282165808120176248024f103bf0e942852082862f345c1964c25a175ae659d1366856b44d9a2324353e1db09539e79ccbe7d22519ede4481aa8445575bd92eb92e99a2ccd12d5290f074f0759e2cc94a7439fba9c0e15759e8eccc58c76723e17ac242f4776a7fcd99dfc733cf2753af2fd14a4cb408238d60df289bce3701c00b2952584c80aed9481e82bf29724b55af970c44aaedee683a055ed1344d2931e7a41c8e90962a3ce30839a410b3d39647018412da2835e12567a887c8052820f4c54b7436d46d0f133460f951d544038f43850d3cbe3c20a28a84a909042971bb0a846ec89d27b614f935e9444261052d7865093f0e1043a6d6f7a56da00bde042995e0c6c1b80a048cb1f3d19a869f458a0f2b0e80851a12e817ef8018c9d207208b4e685187a17ac30678c1ac21795832d3d103438329427002a0e79d254444a202d29a23702106978d42a71aedcd04323430f0933aa1813d43c220480835ea12abd167a78d2410f4b54274ba8470cda2204525a1e1ee64c69d3d343834ae88c9b13860053c683de0e57b0e0c1c00e1eb53a8854118e500bfd51b4a7178687a3446e06d5d0b3008d4a420a3d8471f281ca274b4f863b527a5aee3849a448958284ca0220457c7a59eaf4fcc0519170030286de2215c4a85cbcf4d836e819b233453dc1cedad1db5b4f85245c20e228893ebd3a77bae8a0c2b1014c1a282c8c50428f8810ee70b142c54b9d0bd42f7594a84a0c49112426881e103df412c9395ac4468d6186402df48c20a33219417dd3410f052b3d1ae840d1810e133d87b61801c58faa821e0d76e861c141a5a24695e342ef0f0a3d3c24a86f5dd86059e3210a1e1e9acca0e212a9015071847a5300f574f841fde0ce0e713c60b3040d5c5c504ba147884df5c18bfa644b1a2a4d7678d253620726bd2310a97b08a98b0095f043ef873b21c44152c2060e0d835c1022852f6c3d16bcf4dcb62ca1a266ce13d586394c542110f5da10da03c8cf0f3d2677a2c4395a824d1a0dbd0c5c50c9a4a0a261ebcdf1d27bb3e50a1519e43cb1400e932110dd4048350308861f7a1bdc51e9c451dbb05942431c17caa470860d062f3d335b7a64a8ac89f3e44c1c262820526920a45e00a867e7071feea839c419c3e6e8100d29b8f0410a1db089e0e5d0161ba898a0c313127460d2f382880da12c807a6a7e5031b803429c9e1236aa0734a8825c504be1a8909ab2f551532f61b86860453d14c54d0e16f4eee490d65b62893847ac44876308d0aa3651d1d5dbe0f45989e9eb3638789a7c25fe1e28343a2c29af72ac2620bb15498a4a945adb5461e301d214754b4aca4a6bfd468555a758b5fe59695f96565b504d326a0d6a29a6b7c21b2f2bb1a957849a5bbded8d96356b3542e366d19a5bbdcd0d126b532e9fe4d4536d9265597ed63a29ab3929ff54940cd205486b59a5ab19205950cab161d19e38359041c10b0a650f467cd9c1c91d35193240f282a789cecee78499c3b6ab83c4a429a94a4b1b219290986437b6372c64a78302220ed6d060c6062d419614ea40cd041df66cc183c3142430f9ca165754882d45985203df218917b20c7e678e2f81035b4e743ac921e739019016b6368ad87c115b2e8ce7a0d74377b2c42901509d305255d68880831238e45173c70475045f18a7a10c5b0e847ba1a54a0b85ba6069d2e6873430c187432b5059618b1d377cc00cc166fec24031826d856c82d6126c50619c8f4f70021724a458d962419e318594fc014287224cc053a7cd1b18376c31ce30865c4d5298ec67294ce6008cdbb0c7a79870e54f1c258160f8a1ebb4c2e54c096212791944c7cd1324304861bc10105dd89c0e1eb617618298812d8a01685c84f11b4a296c4f615824e1039b531825d7418037b64c2583411187ad4d85c361c376224c66b3628e1e36a63044f4c066662a4cf6806d03b622d868d0930e00054a211666b8c002b5b4326e63cea07923738687414760b2a0d47f981126a7014156098a63e58b057094c8e0ca1051fa34c1a1882e3a943bdcd181c96b8bdeb0c1e0428400021b0f6cbb3032b0018fc2d4e07f3c8e9d0ed6a09e27cc107cc264614b21b790851081a7049b96a3c1f8a12260940156b92c4a2fc40061a588a98b9337386089010b124f8a9c87b8091b029668b935250a22832b43b8593bb2fc589188cd0c6a952b041031809594e884255b486811ace0a6815da22b25b4f19ac2752488f1ad4c34c1105c7e670314f1844da2442c0745c4481923820d2a209128479c0488384d2db0019340899e308023c0980c9224daea93a80703035304ad653becf0204ae2edec844430a0c1f3430e223c6c668b94dc3668bbc1dd7d511b443204a1e20d3943050e3d3ca3cc236f260db867234deeb9c84e9773479c844216cd85d336baf0173c04ba700a3bc25fc20d8c5b36e74332002088102f1d5e37be747805f9726045e067d078174eed2e02c58e61674533230e1fdba111283caaa61f977a1a1fb7ac11286cdd31f61546a18ded987d63382ab8855471512cca786ccd204a7ce111e4068996083c6978dc9458008dd3117b09414a6d1680d304df84186d75c58180c589aba6316d62640a40a1483bc70a9da33707b466657980b4219d88b2804e1d0f5e18e25830240b1049d63efe085000294255921468702063474d89278df3a650a001e23e514727b214917ab4e0805668e4a51fe49f1a4b206167042c44b459440863200a908b8032ae439a8811a464002747b832b89fc1a8e23a4033789e82720f402dcd491e97bb8f7747e1b8fb1aeda387bbfb5c2dbfc4ac5b14fb421b0aa38cc756ea67d078362e6ee17ead77c3300bbf40a16b8c8a8d62fb75836a593ae07ea487bb1497bb5bb9c74eee2f9115ee2d915275f79fbb6b57cbd2fd17e6ee387787dd7d88aba416f805860d8bf1eb86b1ee8ec23dc9ddbddccb5e49b2b9bb092477d5dd8fdcddc8779e73771cfc02ad805350f08ed1b299ce3dabb97b04aeeadf4237b8855240184029a82c18705894d89494148c29362c8c8a4a8835257605e50e81f08ed93708447b637838b6df2877ec6583c0a8961dc6301bb6e1a86d74c9a2d44ca74e1ee4ee47b6b01d7e3c2c9ac10f16b3600f0f9dbeddc59fb1f53bec85c5a34b06bf0b17ee4ee59e8fee9ec2d52cc6bd4583a3dc3394bb2bb99ad51c7e81c137ddc7226be4c1de1707d8b7ecb7ee83b9703263dfb3f6a8a515178ff05600ec85bb586483eefeee5ae8ee4baee6875f606c1443dd3dfbe9affbbefb5bf685bb7d8ff17ee3761b77d1cc38fc78c8bef18fb5c338668daf2bf66c17cf20b8bb0a57ddccdd79aeba07ee7ec255bf40b88b4356ece11da385fd8bb9dfbac3987db4d7356e23fc02b596bbaf70d59ddcbde7aadf70f733b728f66e23eea3c5c3206bc606e11718dc46beced8372af8c25151682ffb860d8bee6eba7be9a5bbefdc5dc747178dedf1baef8b03d56248e769d2d25627510ed638c94e4ab5b5fc4ea8a42496feaeec5b5b535b2b7f638ad4d0453c4d033a131a98b0e24dc4374d64d94a492cde7b976ee7d33abddbe99df6ddf963ca81fe5986fe4640d37ffe464023bfc65a7e992b3fa7f5ce877bcd0382fbd2a7e6a340f719c7a593a4a5f99cd4e8223fe7535bcb5de43ba9d1557ee6f97297d666fa4b7befe2f9d478bff65db94f7d6abaacfba5916a4c28a880fcdc2f8d545bfbaedd6b1e04eace474105e4f37e6964e625400a215f3f97f6ade5aedce37c6bb90bf73a9f9a931a5db95fcb5dbad769dfeecbddee47814e2d0de25dbb1f054f41eeb54ff5391953a4c67a7eee32d1815ac4dfd6f35736029afe11d080e8cf3ca604c8efd2651e903309a9cf2cba94c44282a402fde45790bffcdc23515bfb2e53c8f9e65780fbf487c4c977993f2415e07e6bdff5abe0fcf487fe2a38f39b5fc1995b9d892ae4eb340fc7ef47ea35099979e8bc08e9c5546d8912fdbacc2ae83ce7ec2bcb2b5a9665793e8a2bd1f792fc34fd329344329364898498ff446244c7e4235953324582a6bf98dc9189e82359713fd3e422531f31c97afe90ace57b7e27a3731f317d1deedd8b7ce3f2cf9f11fd67e92bb2b496fdb4afc8d28ebca6e48afbfd8a2059f59f9f9ff4955ffe8aa8abfe1974e553597eb96adca7e4532e7d44075614fd277de5b4ea166b5caef9cb37af25d349744299d2374974d566ce2614372c74dcb0c071c3b2c60d8b19336e5ad45677cb52c50d8b1f3f6e5ad61c90a44de74d69fa5947926af415ba264dbdb2b933d7f3fc8ca29fc2c972565773fe93fcd334bd722ee735a728699a42c847c1ace8a7e8a7e49be69f3da45eef9b5698e0e5c86956b4d4f9d4c610cdd765e69f793d3acf4f9d87fbd3fc11d1cf2b17b95b6a92dada2104ac78446dd5657449ba139ab7dbe152143b3751fd381e8f9c65251f459fe7953e9a77a8d7f9337f25995d9b4669784b58491428ebb2d49e43e761aabb5591b356495b1dd1ea55faacfea50f9deb9e9b95406e56faacee66458e9b15376e56d604cff36825df80d5ddaa242acbd2a7a5eacf5c3a042a50f0acde66752eabbf8966253f3f15312bf9c424ab6b192999481c4ca48f475eb393290f81fcfe280f81f3474cb2ea9524bf3411458d4b04ccf77ffaf23c511e0219016292f3493b79267f2549fe493eadeeae9fe4915fbfe981ce7de7933e8de298c8a7b48c8780d6a0caaadfd4404d6ba7f24b629a350f6e53aa1cb969e2747a97b546755ac7250e977ec9c4439375d03f49f451f4d41a45f599facacc8f975089658afbf24dd73abf7c475f77e27ea07fa2e79bf94b924da0957c12cf7abed966f5d5fc0080590358dd6d2dccaa058c962a6b9c57f2cd279eb89c515dee3e2e57dca3e7e71ee7f473a8d49773e42789495e23e5ca43c0fcd3cc65f9c9673299ccd3873381817abe1b194bb2fa5af2bcc8cfcf94bed37a7efe31a53f1e4e4e38dd93be327fe7679d7f26d3f9d9694dcf143d3f1f3d69270f41a71fcd7abe1431abafce257d1d69fa98704fe2e272fddd9399f747ab9172453f2ed79224c9cf9124f147cc39de22799043ed7e4c3c9c9e8987d39ae6b291cc949a8ffbf3cdf471e4e94e4e4fbb6ce6a02b99b2ee48f7c45412dda2e0d1bcf2c7e389971f45cbd0ff9489875319d1848be4d5fc95e5d7faf78423936bbaa727ad37bf6bfd2b77a68928aa7fce9fcdfce3e1b4963fa7b55ce32787723ffa5f977d4ce9eb40c935ebf0df99fbfc2393f8cf485e4f9dfebcd0b2b38ccc89748f43cf93a799783f1e4e698e74f74c3c9c3f0ff724ef47f9e82f933f1ee73bee5326dccf49c7d36f97750e18b45973afcb81f4632277bfd331ed988c94ab7f91a3d57ffe69918c80ee67c47f59f3c85f8efce7bb3b69a7f3f76496aa96c10d0aa989389d4b2364f2973cd7d26074a55956e64cea2465ce210c5ac93d2bf9e5930bbaac26f9ba32f4bdd41576d447ac6045754744f3e35cea9efc691f51f76ef2bc74bacc2b72b4c2ee5044ddfb0ff2877edd1bc9ab4e5f97354f87cef3f9e88f48beff88e4e378e4a3bfb2b24c7b5a8a904688e9f6844caabaff987838ad4f6bbaaa407a53c99feefc5c8f24ab8bd5fc959d8f9e3fcc4fd15de9c4c37cfd33927938cad7bfb2f379f0bcd05f2ecbbf34ce2b1fb7275d8ae415cb9b4c405189e6d3aa3ff3307f6496215008e607656ed17a2448519ad44d0b1259b08625978504c8d04afe1294b52a2b49fe1399850468e7d4e46e4eb8ac2756777362673d57777322e7cd89efe4bac889080988923cddd40cb9a92d718201cfcdc9069a6be990091d7e168599d285ed8815ba2e70632150126c690075994a082a09a13fec96b878d8c921b99668e8c92157fc527986679a5f706378b9d5dd9a6cb01aadeed6044a2e11a99e4ea45410eaa1396d5f9a9c402600519a3c4922cf10164401b3854b9b1b7275b7266ba45b93353200f0542137448ce8e00a9b1b2521f441224907809afc90c20d5b0a2d6107c90e1d243b59483ca42ad20e2a516a8b944a499210120f2a3125ddd494906e4c9648992c91aed93c01498f1b13356e4cf6b4715382a6873c369447bcf55924c8083b39b7257d7a4d295c00420f246ce0050d042c18f185ca920b4e188474e70d8915c5ea6e4bd4b82d31d303f99ad45aa3013a29973a9b658ea17599d4016492d4bad4658ea17556a1731997d352e79cb5320b9d43c95ca665ce19ebf3d28b748b34c0cc64c6e57229e3705aba214c01e401caacf5a9d19dd51352ba1d39ebac73ce508eba994390240f7aa008ff073ef003e7015f9f400db07c4a58c0873d2ec467c7837c90c30ec2be71053e40c381023ef747021f10070161adb87a7c1000a11dec0aa9181f2c45c5608dd8b07ce03561f972f9ca87ace80aecad83ab5fe440304401408181d14f7b44709f5eea85015d9e040900f63b015e09c9bb9888c0c1cc29fe251377f2dd64b16bf55b0fc7c3b1a1d06d03703580adb1615894f1d8ba58003b779fe048047e81db8c0dc29b081095851af805b2312bfce21d914c240c69250669658ff3c567b49012558434d3dca105d851527e30552aedbeb09d17a4953d7028722b9698a4e11e28212003d0c5e72ecd91669d3952c652ce6493969a494b22a20487457270c44e4f9af99666ee54ec90b68b7f30a4e1968c342ac38c32abac9dd0a5c0b2a4849276e43bf29150bda874a9f7b6c43420cd42b7c823722bfd924622301575e64e3169a4ee54513ee9a6c85ceecaa75c0ed300f48153c5993b89bba45d126e0987027d8054b4e45441925962ae492380581aff8b0016a5d6eee8ec959984226d9440764aa7461b4099501fe609a37cea48b3dc9124a949944c495c6e4549a20ba0484740723df44433899656655499d3142493129c00265b9a911825bdb3644a6f2c29f52cf97dbdbf2d12a20e9d1ce0d8b0e63816644a0638ba6accc0725b414544b5508f527408043f7cbcb991a3830052a4b260e1da400f0f6fdc6260c18411a280055c39c652e0b7901183f0cc9153830a492a908008040efcf0a12387000128a140e34212134aa880822f162bdc5600233d798a18d3de1629910491214a287a3cb8b5c910030b2b9c20254a00be2478a0811f3ebcdeb869c3e1852c3beed879e356430c3088f0e5491326460ce2614e0c30a041412d6d0bbd70f4788380e8a3c7861a5c3853868429186ce19704448634e0854386968b1eef8d1b1b38d832456d0b2538c02b070e190e449f376e6e6873e14c991348d0208a5a040778cd90a1856535e502a957fa1b107df2dc60435b0d2e9c3981040da644c1408dcf5704446a44011321eac1e3c8a88715194079e24003522060f004edc818dc1bb9482b3211e943295b194693a047c8547a8a94ca401d146900f92804d02b3213aa824c91974aa58c026702098954cba39d91ca53b14ba15b91ebe1d0f444f5799a2699fd54cb11c0260dc5a1b8d228bd4271248b9d10253e7ea9d3994bb3cadd512e77e7577946f2c85e4987c90669a7914671e5138f45560969390676c2f2c94889b662321728f3b93543da8c1e377a4c74992b7bb850222d88252fe028c9a6564f002e25ba54414299651f0dd3803969e7290010b513475d4d481d4a2c484b816b6097b44b02408e1366299c4b226d2bc6e900d340457124cf2c2b030045495a1a9d2cf25195122140c0bdd8412d3584c548eb4cae1e1aa3e4b187905962c274cae5c8157012295fa03196b4f0818e2561a4a050a5d478c11e17a849d31dc5b630e1511d6506569032d014574a72688c33971a91585e3a4816b91c49a4e5502f5e907407138e1c39dc8e5d10e1560b694ae5d355eed432c13b733a1c3f094448cba53b02087b926692aa99cf04ce9c29e37c41a34b77c4b548779c393405ef06aea9f481534a5a51800a142f520378285080925c0a44ab7855585e40d05d89aa30b5c82bdcae6cf15c280ecd9551268f328b2b9b4ca4cf4421854b83640c1c3296d21c0a1c96121b3e7456a953d954369d61d25e1895374c03cc00704de58aa32992c59234605426c548a8923427f849400506b735a1043869c89810e6cb05492838029789ed2098044420708081058200e971c00eadac2aa7020818e0cbb61ade040512a2060d027e2a52a05d706833820809e0a8a1c5e2c44e77aa4173660c9811be78f9a00b070b38b588026ed9404890b74448844120a88818bedc9e065286623464e450305332c0c2d5a1430218ad18574a49ba5c8aae60626105225bf8c3c7015e397068594db940ea19f1ca0ea204c002a43d305e30a18430491a6000eb6a29a9cc010e210668ccb8c2a1e7094ecea000c2152a4f26f0a0830ea4fcf04143468b5d46441ed286ca415f84f6530aa17d30f7643b9a07bd036ece4e8ece41bfd168f409a409baac24e6a62c40cac25cc14ba195f4899cd4336122e95e564b23ad33731a97a61a454d5d6632e7d3dd73ae425df262181bb7c3d72c6a0bdde0b03d7ade29c951fa020f5f553aaa4a46554987aab4e5602fe6be8b77fadfc221dc0e1f1e7e3c7c19682ffbb264c167871fa385293129e954255445b10418d88fb5c34d76f62e7ec6d63bcdd8fa7638b6c32200028143c8c6ce184e6ee65051b4ef8e63d62cea8d612f49edd900574fac279eda610c6fe17fecb60f6f57f82e9c76f03dbaf0092335c9900bdb1db30f27d111b65b4d1221a9ca93c563ed2ebe98fb3b382cc2ffba622f1bc338a0bb33390e86bb33bdf1868bac98bb0be06e1e5116a504c5987a1affbec7e08b1831b26260c5b88a012386558caa185431a66248c588919595859575950523cb2aab2a8b2a6b2a4b2a2b0656161616d615160c2c2bac2a2c2aac292c29ac185759575857575730aeacaeaaaea8aea6aea4ae62c0c8828105e30a060c185630aa6050c198822105238655961596d595150c2b2bab2a2b2aab292b29ab185559555855575530aaacaaaaaaa8aaa6aaa4aa6250655161515d51c1a0b2a2aaa2a2a29aa292a28a319535853575350563ca6aaa6a8a6a6a6a4a6a2a8654961496d495140c292ba92a292aa9292929a92352ee4324426e3cb651b1512c82dc53cec98982a720f7949be0ffe927f8ff7f7777e1de82002432afa516bbbf968aa400920c15c9007faddc6bc562bbf89f038bc9c686ef7f2cb68b609b2c18b3c619be1933dcbd00772f0908a4f6dac4c7b07f78f8ed2e6ac1c2f6e886bd98fbf1d17d776ff29cd6c7ec0b775970d8b2663de16e5d1f60dfbac3d8ecc710ad5e9617c3d8f868547b2cfcb5843becd184ec7e8b2c02affbbe38cedcf775bbc4b63018c6c6c8c2ba826155453525a5fa710702d537aabaa6e8c224c1dd995c55b9a8aa032f6c8faed8433d58045755ff443504ecf758cbbebfc9e26f87bf87c58fe1a3f1b5e276f875642864dfaf3786bf8cee2ba69378bb8b4758a394583bf4c1fa30000a280584c1ade0f865cd5e6821d522ec697c045243c48e6168dc7d00578f90789b03dcb520fd43515fe92a191bdce066211fdcb35c49f3a32e2ecf4ebab8b750dd493fee2ecc394fee21e371428bcd8cfb0b1e02c58e613e3163b832cf7d37001e2decb7706864287c37fed8ccb8e398cd39135c4c5dfdd6d64f39fdd6bf0125b0852181027707baca03728487ef588ff208d09518da337aceeadc200b7590e28e06657e6022618bb423a74a89032e50ccac56649a28635ca224b8f126e5890c21065f1f2e524c0f504de493b41b3c2400c0086f9aac20cdc4387d9d301948b84822171042dd82e8032e3b0e76a48c2dea1720fe4c9972914bf2e108204815a101b5a744e4f9842d8aa015b8b8a840420372c1488f1e237cb9a106d270106d4152e7cb0837b6fae815c0d4c92108911f52b882476fe1d345053c580490d292a39564410101a1097c41f4b4d1626ddecd9638448e84a046f7584b4448e988dfca078d9e62014f0c4184fc81c14d198d2289b60d5e2f593c202226270a61cb0c5677624021e04bf6214f0e0f5ed0d2e5eb072ed9cdca8b32440e61e99242952c660d8c2035acb912c10c28590327439c6830644b0d33a8e5b33242fa7c80d6c3d219924ce408dc9109ca5050d624ce5d2018bd68d940d0d901c5dcc24e2e42a8c20c83218499a70102c3271198847080881fa12602164b741561b18110a7c3c42d8da2826ddf717f814c9e9d0565cd1830371c042282204cc95183a8c596af79f0a345014a1bfc7058b9718e0e595fd8fea4913d7910291550b99960082266ee5969b0b899c006f4440aee0128a911e388a12a38357772cc1140358809dbbdf9f1232704f5cd0d17ae446f29e4c08292037c52ec2724deb44041d306e702596b13e8ad023440a4420d7a2a00f5790b2ab240852398f80d4678debcc234356919c21ac491f306ec434455f3c20019679bb7242d35f8b4c199208918358b96c0810c010beca9a915d02cd273413ac8500c4727caca2c52d3c20d332a52c06c79236611098648f87ab3165350e5cb222922e879c10333409891c26551ac6789b326331715bc50651104577c348132e54c010b405954c306346f6056324805515b448005615f6611c9014f902ccaa9a0c2183061ded2ccc48a0411e263884a1e1a8c28a0a8688e17363107785f7692102a3a73474cb18982b010d48828ea42a5cc03372e1060c315218a9ad4d0c38d162ae2e070a687a232b53572f4e8d05643c60d454050c81a43f402060a51b614c110141bfe1df66e6c76643ffcba621180810df97d7cb77db1e1b360ed701783bfc3a0d08a71bb8f4536dcbac1d70dc66c70d81e8d4637f83b8c8107bac1b3ddbe11e0b8f1c38696168cb6cbbeda33b72dfb2a16f79996969696193c2402b02d74835a6043e2e17b562c0e9f8a6c3b3684592877ecf8f036321c63bf755df8e1f581c23d2c9a99b1bfc3de8dff3759fcc25d3c0a3759107e16668370dc0ed9e03683f70b9fedb6651778e0034140811dc5df64f158eb1659b430d86cef3261710fc5de63f023002b73dd1df0116e37dcba36c08618dd57ec37590c0f1fea85dbc8bbe130f718dc47f6a315e1d78de11d6c597893c5ff040b5ff7acf57aa070c7663b18641f8e5b56d8ee20bc85ff31bc63b6c7e72e1eabc22ddc3b78643ffc39e7437bb791fdedf0c78662ad6b031ec2bbdd3a5e3d204e9b036a70f7b83dba36e278681cf6d82d0bb75ec2bd1e80c4dd1d28e6bef1d8ee077bdd4d26e475df17c786835ff186d5034c607008b7c3373eb2ffdd661fb7ecf0658d3c6ba358646d00c1c0be7d8f4158d81e7f0f61d8353b136e381e3e1d71c37e93c565af7bf62e5c64cf5eb883af2bd6ee8fddf6e9dd46f699bbe3813b388c83ec6bf6ed50ccfdae210230ae7ec6770d794cfd8b2f8371b55fd718b768ddb3df67f0f0f7bbc9de78846136668dc318de63edb0ec658d64c17687fd51b8df968d5fd7cc080fc9843cd04a82aba98fd937331e891f1fd9676e91f8f0b00cc6d5861f1e8ab945d6383cc21a7fbfdf46b6ddc176933dd4178f6263edb065b7b11db271ecf5c087d933e1868f6fc61a81c5221bc3c1771b7187643bc803230013e28580578faf1b0aac3bbe70d85060811f417028a0a50536e463d8357ecc22f0403002a4a4a6c0cccc58e3c3c30793024e813d106c1785c3afd67d8fc2dfc6a31b3fd8360ee32fb1fd82fdeb9ab9af6b1587a0d7da646efc5eeb025be8da1082236eb7111c6cccded8c1d6f5e18ab55ec155f81507d9766f21fb8e991dbf767c64bf84ed86bf5ce131de30e9c5460bf77763623b848deccb9afd6355554d0d6134f8c618f546d60d2777e0bbf10b3700864576180fdbe18fb5c31df6f0f0a15ad785ffa97587f0bb8d08773b14dbc277db8759b24d26e4813bdec2ff3fdb3e3e840c3c18c466088c8d35be5bf6777c3433ba363850bb92dc15f9516d00e0dd6363c3b0960d3ebc876fdcee6763f60619ccbe425ecc7d222f919688189130224488fc883ca5be2af71478eaba9cc02ff0ddf0d414500a3805d5ba30f16b0bdf1da5a5d5ba717c2c8ec5af6b667684a1b6917dc5b4b4b67118b7c7775de3eeefd8d0f86efb4db8f0e142c205365563cf56510619192cdc9d0c6677d0d80a6e06c45cf70512444b6b0fdff8cb0c66635638061b63f62b6e37bce38baaea68c435fb3ac21a7dc4f8726f872c998de1171bb337c85aaf1bad978f1d5846b4b4d898bd21dc313c84df0dc419e021f4f26d7483ecd6f521c4156bbd8a45d7c67edde0973b1bb33784ecde216437998fb2a05bec2a7b59e3bb63f68caaead89eb9c22fe186e11d745f331a5be8da6060ab75875f67bb3533be3be2e38f221bb72e0086af4b46632fb08d5fc2973d333b0abde2760fcd86c1fdd2c83a6e0537035a5ac16d444b4b18c35f66301bb3c2ab3164b17078266cd92ee18617a021dc6666c33786b58c307bb6e582c084ed363363c19e2c1e9efdbb87c597dd2fdcf1bbe176f8edde610fb7702dee1ee62a8cb5761bc736fc25dcc26331d80edb63bbe1fd9afd0e7b33e34bf6c2fdb2c5e016c643e3b0b869b810ee31e1f00d5b9db6829b0138f805c3fb1d6b875ffbb88f45be846430bb434b4bc86eb2af6011e35711a370036008bf3476cc0acd1628eeb665c96c9819df1dff24f4625f16c8d6583b74c7e2a3fb65667cc9becc8c5f66c6e357918ddd98aaeaf835061bddfd860d14aa48805fa0b0383c864d01a7a6805450ae583b84da453608b763431866c96216880440e18ef303c0b2201be6b66cf063962c0eb270cbbef1b7dbcc7dd78767ae78c3c37fb7f07583472d5ca52a13bbeefb7b8c7ddd18d6511d31a3bae1ee2d5a78bbc217b29b05e2ee504657a76a8802c61b1ec6c323fbb96ad098b1d5814fe0fe4ae171a11bfcda42b71dbeb10552453b7ea202b91612778fe1ee3ee58cbb4be06a5410f7769705d9b0af3d7c63235414bc8d0ce3a171f89a45851d61e1765b77e7057115a8e6ee0ab80ae4c1dd7d30906ff73e8b77d86f98dd6fb01d3e5ab1c80687ad1bbbad6b7c7798f1d87e59d02d86fd4345c151516542182a76856c59d1358b825db3fd4695bdeed996020a78a99fe1fb78c36262260da8020af819345ed86e06dccb19ca325cee65142f0f60e15e7a953bbc94a14265bd2e1ca542ad70af2c80d770f7434f5db4d29314033ccc5804f67e857405d9311b07196b87632c0c6f0462970c36635bf86bc76c0c7fa1b1c5fd6a6919770ca3c15fed90250bb22f6bf615ef629135fb828fc5a3f118b431d60edb216bdc0aece33e2640168c59337878038d2d6e058808c1049e393540f803840d60ea6c0d3971264955c8f5547833e55d00806e09adb0a2c90f6608386ad2438b2f031e95150eca94813a62e9ca929b3924dca840072117ccc8736a3834b8fa828ba3b5ecb72c591cb7fbdd626243e1b3bf8db064efc60f0bf76e9f2c38243bfba777e3762864dda270c7c1e31bc3ad1b7cb462eb3e3c04b22fe692c1c7470b7be1fe1df6b1db7ecb06ddfd85ab2fc8dc5fcba39256f876d5051ef75d0c0b1bb668c25de465c431fb6ccc0a1f4663cf8aec0b373c248b5fd8b24f06b364cf82ed639165404b4bb8dbb31f5b38d60ec9826cf0f7cbfe6ec01dca0370d655273ac732d72d665101a5a0c284507bf8c63ef70196dcdd4975da42db655f4536e88ae0ee22e86a0b336e059c024e41155bf71d1a69b794bb7ec0ddbf5c6db12366c78646d8bcd9b3dd9a2550907b7a9a4163c6bb38221c3ac562bb879602ef8f586cf7f8ffcf4df04784c3af3d26dc5f6541f68d7bac3899ce5d0f336888eda28967c6d6c7edd10dbe01dfeee2d797b0e892834a41a50968540c0b7fc68ce00b871930c3d501e4b8fb16baedbfd616bac1dfc530962cc8eeb73dbe70bf3b6ef76b15d9f6dd713b4cc184a987122b6ef867ccf8986c6cb8c9807b4cb835960196da078478d95881ac367eeb8f088760aefed6e01788f6c6ed8e72cfe18e6e7177085cfd31b9196b8cdafb8dc3a2e0d61d06a3b0d829aa2b2cac18625656556155565855c2abab30aa60160c18fb2a4b2a48c556614d09859b8d0ac6f0f18df24169608e1a512fbd9c911ded9285662fa37e944d14d928a75425969355ca00509da66649e6ec4a1ae8da7302658deca80cd38fceec3967d3b4d23aed396752efc819cd3a67f20480ce3aa31a8502399f19759d7940529fa753ee73a97599412e73d6b95c48679c9bb9d4e4ce99a873d6e9029a49677d963a03d2399f3a2790957226754a8349a2461945ce2752327390753e75ce9afccabacce1acf42ed348b3d944cec8a8d6e51499d33abb38baca139453ba1c2410eda5eb1072493a95a6cea49b56329fac7af65c669d8bc8a97e91b336b52673aeca5139cd3badb53e6de4165a973a4b91405d8ab480cc4352a1b16453a7c86526b36b20fa73b9743d3cfdc13206a4fb68c8ced5a6c97ce612cdbc4c66d13ad522731699b52e5fef704ed9cc19952aa70490ca3a77a61acd592b6b7d873c334e97a491fcd3c79c49a88cd3e99ca25973e90074009a05e9a4e7a37c6a9d79a54a963a85d63a9fb914cbb8a6ac337536b3111693f64275389dc3d21daa730239cd99d4b9cc3b320b1d43afd03a8d6a33935967add368994993cc192b93d929e3f22ee72c2307a073249ad332eb9cb5723e51049663a8244c34c78116548a21694640000800009315000030180e094583b134c9412460dd031400087ec042663a1248456220074110c43008c30006004200018618608c61ca58e8053b2b72a278be0908d6f13042a41657cb910d90152e32fd4b502fd1362e637788284c1b49c0fb94c1a7a975c09539fa24569c8335644e8272826eb9f18922265e5020b5b8ee60fa1cb024e4400dabfcf0a0c4cb27f9de424b02c45502696db00a651cdc387a56813400b306e231954b96befd102e64cb589abed1bd95cddb2129b0f189e32dec3b82d4e3be43ed59bd31e19155f13d5f17db4ee56a42e49c22efb35ed4c3829cdaeeb7c62a909472275e57e3c08545dc96cba3beb95398fd15a01816100624ebd44c9e3597d143da38a5bdcd85cd06e1b6e35d61f15a4a03e5d66e0edf29bd788170e963880f848380007e89f1fb9c4acfa6833f08685873631798198ef19b2484e74155952651d1de518fe5d4760c8bad1f5e6d5bfada09cd3900ad49c3fd709a575ffebcc7dedda34daaba1d8b8acc55bd5f33b8d9625fe08b74384ed894a26cc34abf289dc144cf2c470aae02e0ca811adce7f13d684c2c943f22457e645d2afb8ed9af3a8a7da45b95782381462e60c8a0f6b5e7a4d4567733d633f5ce4b8e49958234c67d1554695f296b1a9148dbe730c150924080c5e6cc0d2c82d9660019d58aa110cf44d8dfaa9ab9ec18c7efa81f78bb8417474013785e66cc948cfb0558432c5ee793ca6ad2d12cf6400d15dbd3f9ed2bf254f6da5487ab413db9fb7f3b10d3c2840d182e26821ba4c68a1d646e55ce23ccd0331067cf387a8746442241bc36e118d22e0aa90fbba9b0e753699a189160233b2d4eb372a7b5926826ea4f0710d9b616935d2942154de82831f5ed30621863be974ac040db82279645871ffa826965b7db36f431ece64f7c018845ca7c7bc2dc45583c9ba167ef96fc35da9d3fa0d62d2ad3b2d3fae5c6a9d6b5a901092501525a33bdc5c1fe8b0fe7d7d7c6c18ba4303d4d9abe9e11a675ec4dc57f7de136157895c5b83c67adf55ab1777b1ada6d65b5dd929e8507ee413e4ccbe20e8145fc6808cd89b3f7cc8383de7fd4c3e637c79bf99990bf33d135b45f7443e64ee8b9f17fd28f9a2872a319885b414d397584bf18d28e6136fe9cf521b9b957f44c773122bad0b94be9489b984a623b2c25dad9ed18f90b1faa1080e0d872bd5f32b841ab6675e09ed135e360fe3da738f453d86089ec043dfc230be6c409ccc3baf93be610a45dfe4cc5efe0b70d61f638bfa822c00c8826ea301d63f8c02b7c8cc93c1a1a8727910109f145f277fdfefe78c7c751ae8ab4d38aefd6a7718f1792b8271c6d4d1bc7f132592cde5771d63362deb6dd8debbe94afdb479665680e220fadbdeed6c32672c544c0af82ec1655f45a3f51f7e1ae169e12d48338b3e02e3086d7f8c8c07511c5973be9fa630268a63a56d07a4c6076d7c810aa836dda67ed6532ddaf573d72079dddc9cf0a2d57e94dd63b8bbb9d778bb5a682fd24f18833c872fae4f127277405d13d13e3650e4530ac196722ae3edb011bf623e05a6bfbfb94f69e9a8276844c02b28f93851658ff163a49216c2e0a58abe10762d14bd591cc774b160e47cb6104a74617e98dde1877f43c5012265975104bff9075d1ed69b6186d197b81f58c400e2e140f5e9f958f07a138468ba8d542f8c51fd690ea33c8d08f890e1afa33947a1907395f2158c405800ff842d9f03c95ddecc14f48ef23f802d7b620a513efede4ef290d3160785445ca698a499ea2815ff0a5c4659f100419d5fd247c303ec5a93ba43447025edef6af4e0c1dcfe7f755da2699a5186339962c6a74bc707f47fc74ca10fcb2e6914f10b7fe3dba03819988a94ca6ae22b982ab7fd0cdfe08029503e2c983898b02ef046b3d6ec4e59ff9f9ea7e4efa9265b5f97b999bd005eea1b51b83496bf310647e57b33d6ea0772e41b5f96e6644534e987d5f780c2a4a2b38123e090d43f7c6fee066ea2930aca16f3719c6614a4c9dfe332277e82583a2304661b2850dfc9363ce9c70abc8af227fc7adcbfd3f85b0b739491356e3b941228a4cd582e7eef3775065d7e89e8a6f3ccada4746122a3280f3a50d9152cf7b2e471eb485490a557ac2975cbf78943c5391b3fff59251b5b54133d4d2f0b586ae9de2039b51923b597d4f58616dc13cb47c6b277f041e160e435d21d2bda923c0933dbaa217d3d92ca6a4ce7235aac1f4ce087fe3c98418857860e7068fafd44d304c27df38b5bafc5ef19b251d6a3944711831d7f35e4d7d70bbd7c1be11918eef7392ab7ab3cc135e8c598ac38020eed88ae899ca97232d9355c83f7f348e63642cd0833c952792fc2c999b70119abff3f82c63db0bd0eb655390ab24c939b077398a764c4e050aa0a8e3e7ff4ec3ba029088324d49ffdfcfbeed1df293b69b0a8778d8e0ee58a23933c6eb974fd8dd9a6379df1ca74cb42faba598f1087820a1624ac238a32c6a7cc5378d5785c81a9b43629a38526a529b454adfb030c90c0bf7ac73273d8513fe91685bde67e67a50c47384f92d24b8da7acfdd82d811f727ce010ca68708b92704cdeb81ddd488b201c4056b1fd21fddddfe4d8bed1877966175f53700ceaae87b5c72ef1b8faa668c2ad53bddc4f1a7db83f3ef966ae5dbe8dc78e0ebf2c48d30f611779bdfe8dfc4faf8734871ecab22c4f040ea24bf21bc3a92490c07abae223efe878cb6a74d503a6b35bcb716c77ecc3a4287ea9b17ef4b8eb9e3c18f673e90aaa062d264aeeffb745be018de5070bd5e7d729ed47bb76222ee4e08095eef875576bf56eefd84cfff0d6efe4ad7737f7580eb7d18f3fd0eebfe912aba97b452af4696568321f5143074a1edd8779ae32fd4fc296be19347ce9e36754cc0fcf113e03605b64bd63da5f8c17632683ff366cf1d4930fcc749d4bf2bcf449f0d3c11ae44dfd63a41c06a991b9f76ebe9427a67dc680acd09a655401f120503b3eb1ec19856a63cb197278c90b7aaf13d35dcc891b60f18cd0680c0c89ac9c27c64291385b90372f6b75ce813311ae3cd8e268f9f068fa70478640d178a105056f8cc73b0eff39206e757fb13bd6703f2bbc6768caee32b75db2ba6fd04e688969391c840d125d75aa343d9c3530de08f0025bc05e2b0fab5b98ba6866dffa10af50695e71df35356aeb31a17fba59c3af28993549eeecf313b178594c2925d8891d9320515c32a2d94efa4b1b7a2a931cff3918cbe266e5f323f79fbb50702b9fe570eb50c43f0e753518bd4585b08e8b9e096ff01deeda687c1ceffafb2fe64d0526c9c7ff1425fc1e7b521eacfdbbfaddb3d5be460b6c77c1ff1be090326cc5d8f72be9b8923b740842635b6ec4b7a2657866f996fcc17db8368bd01871e49667c5c27fca960844756838129eab9ddf17207aaa2a80cf6bb739cd0df22c2c626c4177669b05c6f4f25d54442e32b831fb28fc052cdf75daa91f7a70b9c6a83e5c467f5b6cfe63a52982f9ef67c9e4463f375163e8ee8eb7a2fa9f1811b0d1d6797f7b8823c6a2e33ff3596e35235a0d2f3e297e5da3acc624b565bb1d68a75566f756e596bcd5a6bd65bb3c69a35d6acb762ad156bad5b6bdd5aab60354b7a9f39f0c357f531743ae4c6250aca8d6f334be26198a9113b157ab4d0a0871e1db4e8a0451f2dfa68d1418b0e5a74d0a18f0e5d34e8a147072dfae8d02df4ac377dba29d3ddc407960783530dc81f787626ae879913809fbb27c811380e2f778bfc2baf438f655c82bbd3bbc192f88cad8b5e3ff7c49f933aec89f3e90eaa1b224e7cb29af35b463dbca1cb703be41c62c49e030cce87d51f93a8d61b4fc2fc975a79f961ec1fafc91164f647a74f653fc9e851897d76c433644a86aef0eafa2ca1e5e877cb3d1d3c7eed0f28fc8807430caf309e37b531ca7a5ff3a5e7837ff49297f8497cebde506314f5589f08f79df3a467630e015c0ebe07d5f9a1488f430d4f916e654e3db1b1dd9603cf8e8cb4d30d34fb40c8bb8e7ea12e5344e1368ca67c90e04926839321dff78d8366a7ebfaa7e496233226065fa857a9fe6a2d26f8b1a65e073d24d0ebb251f6f3f98b4663b9b03b43fa2ea1725fe72157bd452a7b7a8a7068a5ae62a8e35e374c42f241bf29b4d4fd722159c7bd4188507c382436de595242ee3babae35d99dfafea3c19b48e13301c99a107f061159c696bca036985e79873a67c9bda9bac2f796087b16dc7c1f6cc86b7430f21e6aa57263d5df0c23fcdf71073cd1a51e09b6b0cd137fc66f62abd71104b9a2e6f88b4c684060c38edecf23855690def5b7d59283b7fa26d6418c4969da53402cb657949cd572c0c9ed0bb69a54609a20a7e257e2da809c6e7457b21a176881a666782d572ae23fb97c7337f659602aa7d519525ccca353ba0ae78b7d49a8c2e92c75a9384df0084405222eb1ad3dac6678aa6c965351f046221fa8285fbab7af56c9692e9b6f110d76e173c1c1799fc15062a85992ef19237447b407d7b1bff04f5aa39392be9523ce1fea2b6c3e3fb5e20d25cc4161562f3b15683c970625cc91fff27fbd356e7795ca3df4f69eb98a0488b503a76a9a7f3e4347bdbcb61103332ee9f583693ab0aed08d343f2b97629fb83202efdfc5e1fe9c7e050aa47e08efe8946ba9a5628c40737c9b199134eee65e85b3b4c47df93e9c85ceb81b0e47ee636d030566a4919c041a082505c82b4bc6014eb3be4b2c3b0c0eb31cf8cd813e5b4c3bcc74ff196402740219f39ce4af7c984b9edd46fb2e9ab48bd237caf8562c2d80759e541136f6636885149e4d3358a78c30e2f1050c427931d4744fd42e28358c28460cb8d8c564a8e36ae8ec448227659fc22f699ac5c0a8517c7552722488c8b4dba95c0b4d45ef33bb33f96d2d11f5f55810045f04ca95d4c3bbbc16bfe8202cd7c5bc42315a650b7b5eebbb86fb542ecac6434cf1ad2916d5c94c98f90170a562950645ce60854675816ad5ac16abefb450229d6df08b33cb8ce77cfb81438f8d30aff8ea402a5003baa67aebc7d8b819c00ef6c45dd1d395a74483e47dd5bff6823e337831276cc93da68263bc15afcd653fb00c12af2b2549cf525750b657ad3a656b81fa4c9075a9565f9bdc2021e320de53d8b43dbb8bf02673d4e58a045297f0091f450f37b24a1151d1896b26ee8fc5b64122469ee5dbdf58fdb9ae136a1f08271721526b4b8ab77bc893e014ed5dde76c7b86707b1e0145cf720330957ebe39a3a38e4d038fe3bedc7ad538d19b5f5ed6ca3f33eb3a57a38dc9cec96a8b757e5b4e03c692d9909f8bce62f8787e4430d5c53a504f6cbf9cba7b998bcfa4c858667794d24f616919954d5af221792179ac1b191580b55fe2e07753a6d516ebb0328790d8a89a3a1a562ba0d5e81f70784b73962866903c6351e373048acd57984c231bc322ae8ef8e810c8532e9420c58e8c510d7d3a138c7a06011a289f7e6cedecd20fee33f3f94a9198e93c5326db7aedf6530f5c6c667cbd5657c8c81e9e53ee7b146519b7ba602aba8cd4cd9d88cd68f1703ec446dc4defd4b38680153e7c514e3bd441f9c164b2b7c0e4b9f902b94a7e075e03d7d324f347b9f8e6f5a80d93cf8da498bf262fa8cdf33559406e2d14c779c99d98e64b9ac9e8a51aeeeacb3f2ab6572ee6b0b217f6c27cdd7960c640848b160461e5d48fe2fc1e910c6d6c4e608dde93c96eb8fde210cc1d8891ba56db51d8de2057e3ab151a086f0f58d843b76820748eecef3bbf4b54bb48ce6f62c83d2ace191c2df8a268c0885d680db97739e42a326219e01a372498ee880ee17d507864235e1998523a163caa243ef5823ecbe4c1ec666e6904fbe4457217e81806d81880606774b3f5cc460f9624c219c2faa4a80d92e12a3a5fc6cf9e81152b8a2922cd542ea527f0ab29fbc7e59e0091471079834640ddbc7c71a2b7382a7797a5400ff84676c638c3c33abff049f44ec9840f3e499d944196550d61e66453858ca9bcf34337d3826fa34089c54b047f9c94cc84e8d9ef55e7408ab2651e824d4104ef058ad18f805e81ace9f5a584a81321410aae6dde00f5da59d44aa92a2a1dcbebc6a6a23c9990f5f99f000161a293f7b8d5381e6b9b8fd17690cd631290c6f944684c1b9ceed39ae791b2c675d38f9c49cece569ba0d99b0e01d663b9ad74f88aef05715709fa86ff79b4be49d78d087789df8c492610004319bd2db67ea5e0523b07df530e01d71c11bc2331155fd64f31a82462f9ececd2016135919ff60e59730dbdb683f5b933071214f09eff27eedc3f85925af666745548bbc5f8082112652428b804f2c72e586f12a3326d4ab7afe3b716ecadf002fdf42312b382d520dcd43b49750fb03fa0e527085ff6ff4ef37a8121869bbdb679d39860ecd0c80d898a59de63ea6247323052a4acc3d84268ba38e2a2d00ed968408390126ef0a71e5fb4994db24f363935d955dbf24e46a1746d27996fa0d1e3310ae5392ad5ba113891dc5f686b5518480e407f448564d76be101bb4870bf44e4c742ccaf544fca04d11675de6bdb3bcc00ca6dfc1013204741f6d73b32eef2fbf17e6021233ea9f55ae335c72fc98452fbf63c110f7d2e39d6053705f7ca52ab0db1be6847672dfed0df96ab8a689454d8772693696b637a082526d8289085014b4c77f26f6c9ecacaed7e3be402206f9b257cfc2445aa6039ef7544405b1b13b4b1355b376e55a9aca17c80a1dc2907085296154ffaedabd0c9e0aab8e383236620b8105823e089464f3a80ab295f5d7aa8debcaf393e33497005b9cb247c7934b92bfe880fa5c18ebedda327e896f421127468d1805b11e06502588494cd27de6ce4aec74ab0a2be08e254234e01fe5906f64ab4e9d226e1481914ed4299671fd3babdc640c7df6a38ac8c1438e8d98af25314725058c710959cb938400abe210c77dd92f29ec0707284b337730ec4463cf21384bd14b451c78297b3eabd5562dd32de9c3af317316e57a22c1ba1016ab51739813a68bd6744394d1840212b99633d0b51f107427aaee87e5b0dd1927989b3e27c1d89e38a9dad73396fc3d8156ed239fb263d26eee6c08c39c0563144ec586aafb333cfa39af3322a3f777a7eab7a09462b27727b37e577e9c4b64c523e48819fdd679e064021af07f12bfd2d2474cc4d9a5496733c7874ebc9527e6c679d31ccfd7cb4ad39a248e07ebbcb3a4157e4804a6e7aa420c5aabca72d648c9d28f3aa14610f66d718beec7e1df094681110d9c00456c2243573a613155209e88e80a182b60e779b6a62cc2fec179fc0cae06b69021f243c0abb6eab5a446005cd298c73c2832937f26b7781b658ed24db3b80a3391773db68d26bfd47460c2a2e08b6aa984ccfb3da2253326f60aa2bd2b1c40d2d0fd71256bd41712986191f36d04a5c45691bceaf9d3962cd96897943872197ef4e4601c7e12999b823e0857c60acbf8fdc1fd750a7ed1066019d3c524190f61b48cc45aa8a2333b6276ba31424adcba2461ec36406381c34243bcd1e3e29a19619fe1dc0c489300609019fea991e9b075af0613e1185f15f3f84bd27da70cf8eacb88e4131694441f016d130d23a3b0097a691660c5c88f4201691aca92d479c60d5f3bde51c1c25cb1b56daea24eb38f993eab620f65fc8b62313a8e55ecbcff9897ac1b89bf782500eb11596bb06e66f9c047d49f299cc53e4e68d50c07ebb11b4df9bb457e3f99c3a2304ecaba2dca52aa84b5ce5b28f4ab94e48a62b657264259b627d43fa3e004d2ac5bebeca7288b5e93ff2e61488b89fd3e53941060ab7c66c8d1ba49447dcd40becc4c272887098421078703190697716918bdf264ae7f7acc567f86fd8e0a8c3bb0e6d85e6fcdd8a406331dd92d4847e3a114d3352800bb22117e60013f158bf135b9764253d82287e02ebb3333570cfe07e4ac5f1361550687d5ec2e286ec71687371346ec7cba19334be0473c48e12c32ea7cabe0a562336c48492ceeec7fea2ccb536c73f520df417f01f171d5df92c553741016725070e31669e14913151a2b3ce00729add4dae66e23469454ebce7cd3abf72b927ba6b4f7e1edf1c1b50ec85e91703602f4920e6ce7a1cde155707b525b890e428adc54cb39e86ce126e05710e021a93e3ec4bbdad39a1e6ebeda07c25c32d4cb1461c29f282a4c29ce2f5e6c2a749523cd2c279c9821dd1d7c1c5113eb11ac6c0315a9936066caef03ccd3f9b210344c681fd312ed61424863f468fd3c3520371943424333f14bc5624d8b5a460f99f59034d9c0ba60fa58321ebba6910a629088e576e5d9eb2fb75aa288caa821cd4983cf19a745b2f0de3f34e7195800291b472363e4193399edf061c26b989835dc7e0796fd039d61f26473228835d6547ea71e67bb59cb457a52314743e36d2deee0729adb31389ed25bcea0746c3b24aff04834b9d94fea99048a0af3cf563ad5ba13e88b7cf3bd04399e2d15c041973db438fe45b5c9fa1704dabd90c30f2de6adce0696934631948968c28168e9531b4ed4e1811e4c1d6265a386794a28fdf77dac504bf2ed0d1e019245887b135b499b9b4b1631d903ab7a079c97f1d6ab90b8f87812d8c8603b6d2642e3a9960c0cc19f3a70763ba05960bbded70da6601464117748884918958025137f6c32d9a8600dabc27a1716f0ec0ac3d2f138040ac7711ef9a475670924485d46a55db620b85822c28b114931c136a65adadafb90fe2c4cb9d788246311827b7ed113704d01d9bb038dcc1926e83ce47adf4046201ed5907a70a139ab17d0dd600d5816682e3a65eaea7862ac88815d03180bedb206e724d7937f8b7e0224ecf7945d15684774070f8121badf2d00c193b2ca7430a0e722ecfcd58a4c8538117a4ac146e5bc660fc3bd092b1c52b7ae364e8b96833ac908423c24661241fe28b71b294795db3a4464c31d94b4478da2953e208de62745e6ff68377151a3cf5f8ff384c871bb4d4d6f5fccbca456a6d917ade66b03f52b556b134e4ded10eda228be76642610aa7e21de42a707b48c387750c26aec31796c11307c561f06f45419b81dae549bfe794dafea2d71b9722813563ebe1ffba5065a27fa9c487226670aea399eb174042580436395f933e35e6e4e68c6025555f1c562ad0be4649f1d9cec88f7189dcc2e1d5fe4904f37b5069c89b5dac51853b848005e831938ce7720a3ae3ba6b018c996667a3e63abd2a3d32c08588587b4406d785f77d3f369c1f2ed63926b518fdec30324d8921fe099db826804db383a3e92126753a911076031c4bdfc153d86d5b692712a05a55555e7bcb2b11666a68cdb7f694fcfda3a84028b8929e3d030dc0ee4b736a19b95a652b7ea55501e934d50fa0870d3e1b119c2140328722c2a11134e5460c2e4ec76a3fea8301ad4c2c29d7cc703a4de04a607675d3b4eb11cc08ba4ba132c9f2582e55a7b75a7bad1527926c33c950c6f27986e251ca65a4d960e074848dbc27f5889f7305e58c4c782a2f63ca7d1caf8a90c1d2e2d0030f5a68f204088a70501890d58604670f6c0ab2e28edec03c6573139a2a05554adf597a704aa1f4c1c0a571eff9eaae3022553766a405bc229c61df240ddc9510c733229a55bd616b2cac85f5a9171ecbae620c9c8e9be467c4992def7141c6c0b06f87d740df6cd266a7e146dff5f574c29afd519e16a415370e7e5963b37399f4c40a4aad1b7f3cd8fa721f0d5a46c9ac72938bb4547d227a0c674c7968c3281a2e6e097052048ddc71f211a96e650cac7868e5ffc7ba85c9ae3b66df66247775e91d860eecdae0fdc2effaeec0ea6cc29090943bd29c8f422bdd0a5cbe9981059842cec8353fd521cd83ddade7e5a35df2a522bc43f98bc10285247da06733202c79d0d05a585f667ca562fe73219736e7e73c3c211a9cee1829fa8a7bac1b43db10d3de523de3007198391a5c336280788c1cee5a545be9741b7efbe077a13f6b798ddc6bd4039856d10ad0359d8258e55d0cbf348c2e0e538d3a11e4bc75f83c9ca88d596bdfe7db864227d1683dee58d10469638481106cdc10df344ac85aa86b7ccb72e9aa82799bac80016203b41942bbb8d8359746163d66291a87194f39a2c9acb4a79350e4f2d8ad65ad638d0bf3487a21297e3fc7e165687b48794375d6f963061771090e97b5b2547b70df8eafa2dab4ea5b760248d45b392d00ae9a3d03a8b6b0a72c65f2a196ea823469db3f88ccb0ee8df28631cd324aef56b6c81b165b8bed7d61615968bddd06f2d5bc506331fd32a6642cb276333a14ba373d6c524583149b1331c66bcc0c43cda931cc7cfdbfc6c11374f95f4b40198193d4574852cfa578e92a323e29530ac45e2f5ee6c7fa22e37a118e47e26791f918d2f35673ac9a955a5d6a37bc7fec7fe5a65c4e864038d37407abed05c3aebb24995e05367e7292ccd95cd2e24484319ae1025f8f4b16c0772bc331cb5741bc5ccba36b9e45838af9824c0c16631b9c5b89ecc247126e7ab0e77fff4fdb8379ce0e1fee7a30756305432360f9481d64e3d31cd78c0264b5ff006ef7fc8071721186866a82b5770682886801d4c7d6e7506ce7ad79bf0d12196afea59b05c62440464e9256574cd545ef93aec25e556f6109dd91726c614b6e8a7a69b592fa830230705a1af28860400be510b50c3cfc20f4b17351bc5e6e009b6acf91e2683482fcfb24fd3230b7b5a1f7e02e72e0ab833877656061c29a423bcfc5ab22b51f4cd7f568cdfab62f44e4099d86473898ccb4f302bbd9395492930af2507b774aa7c6df478dacb21ccac384e924e04854c7218933da25a078ac51b25517b9766ad463559d81dfb8f0b18d31b85ced05f7c1490d3c0454bc71211f60e2c1f942056a0006a190e6389a25160db84bc16105c04b0c02958ff1b80a910dffe074f6917ca7605865316d8be6ece6b1576d0233e4867f3c1cc5c6ab06719aaf91195b89993db4f42602f3c264c242cd9f61a60ae6d85a230e4cd46c6be953c67eaf583653cc97481e44ff25cf2800066b25ae50dd8b35f0bc409641b37c0952913bdeb26d746d5faa599260769d7b4f93a314aed22f0063d8a2541da355067f6ce567ba87b181c5e869d0444e6c8966eb40f5b8ac0826b1ece14025161470b4fdb25eb20ecdb5559ca1c4589c5e2c49a27cf4a17fe40ac705d5cef7727597b8de73e90c0f9e6f0cad46bbb47f9c6294c6aebcb9c1642abe44b0c035621409d9451a4ea06e88e34c217aeb95b37c613b8b89ea5de4843cd30f885b4ce5c2fd0e14cb8879e458667691d034f4d3ab17072e33f8e354a6eadc40b3f6be55b83c5a072b1121da7de19ed23529bf63023c9173ebd46000e84edc0f180c7ee5d7d7f118389b69ba1a7251745f0d3866b141a2296538c55d23e83a234315b05244c06041bd464d9879265d73f5c4e043a961b826ac7ad082ebeae9078d734acb583df694ea7b88aa8f127b0567f0ebf5881878022b65bf239a51b1753c6f9dac286fe5ba04d097091f82e4ff8c8322a10999b8e443f3b8be5973cada818ef6c5d2231032e6a8b31734522ad04e9c1454b2763ad286d65b604929b4e071dc58c5ee15a805ed40cf17a982d98b448c88b6e68cc35ae7c8cc9c0c45e82b2c466652e2690dc68c2d47d0897d64410a2a08971a02cbaedd2242bb546044c8e3d30d0be582c8caa92607c5129a5f542369fd92308600cfcfd0cf11d84063e920c0eb70896a5e067aabc67a37216b453f937b9163c6b77ba347aac964a5d1d114d3b0196180aa5ec061676eba5c63637051e306341622c036886b04a6052a61f59be2ec916facfd0135cd43a26c844996c9518270c999cf504c2bcbb31f68f1fdaa50b07936cf0e823c3f00965fbd84c5129296b3bc87b9f7acbb1a40d80f0b8e36e205039320956d47211c084cbaafc3320c950e8ab682395cca3e6824b677f4e2dc88837175715ee38bf8e692da9654387b910244b41f2b06380827f2e7d8042b7b0ebdb429bacbd65c117f011de45afc85af52029b61c05f1370f888a7531e0fb708ae8b332a9ac5cfb583d060ada8a0c24669141c3719e9fb6eae3e8e4b7399dba55b4a6b83adf8acc8464a7f6fa3246f19afa5fc239edec7f00ae105e68d0cba902145153c44fe3561233cda05972bd1330fe2d4acb42fab97f50aa96c3512fc19fec5acc28fa05e4173ab55d386d0d72408ed20f57bb32f61b85b572eb8d39cc8994be216a17cbbbd3aef37a4ddf395b704eaa742c97defa6d74d05ae239460c135a02f9c67a0211b4599ac24ffcb8daf674e33b3cc3e153dc433c04f3e6b1c5609474f01a33add60c4424d9b2e1f52bd900596ad1b4e453d4b6a0b8db04451ef58f87c434698da56c7b6396922a26d62af1aff35c2dfd8e03f9fd982ef85da3387ad83056e4d3f78571136b5cc6f0a1f667c4e917bae2459d0aa668cde6e5fbf4e82c67ad279cc1c0622863571bc89de14856e5937468c3c8c1467216bc19690b3d24a27477dcc5447811889536daa09bdce0a2003e8cad8c585fe38cb7906d21abf756a0961f0129f7777fe395688390afab910cf4911d1ba50592b2c892f8356292c03babb54a8387a00eb88a6bba32eda9faf6c9de68793fa9a811ebdf11ed9b936222079e780e868edca10fc0a474984e5d966e02d3c7068a7ea01f9307047658014c874e4d3ee5a56c7cc28f0ace71494da532ec401139948cc4850678c10596fa6f01604ef0b9f7c6f1281dc9daab92a5a94636343871245afcc4b70f013638a2f001f0b649d8b83f9009ef6d4051cb3851a52d6725d0a61833ecb51080c0bbbe9ef7965e95d192fba507bfc80c8c77f7e9743294408e770e9369774c6343d84f899c0fb9d4f6838d06f4d7edef6f65486276cfa6db0872295e683bd41ac0c0dc2fe28790751abec9d5b0b06d7698a2599c5c1d2900e64951d50213037822854533aacd9140c0057f738df4638743d3da8c00c0e9aa342684dc8acfa438620a57a206f2afc73607fa8f7d810a990cdac4aefdc6f505c4ba2b00652b709253565ca06cb73cbcc5a9344f1c7cd19c908359ebbe6d54770e77d594948ca89302b09315d2fdae66eb1e11d8ea83319e1a3ca3e49510998d081017ab5cbd9ba4bc867d8ca0ac09baff1b29d34766196efeb11256426d444cf8e5038ff1c6b9242b18a16e92a73fb26f835103c2b60fa511fc5322e03f98fd8d98decb4e5db2e4c93e26edca21d90d96bcfe9daf6a83af1060641f0271ff948dad9230c828d624e16f097a3b50074dadbdb64e8ecac227780c9c9c3e45e02b5bd95992828451c30005b672de291c5c83a93362a0d4ecae88c419049f06a64a4ec3f93c0fc3b93298110c6a8bb3691c7899020db5a799dc0234a527a0c3c090826d982e94619a279c1bd5138c27cd4f1438dff66005e9d760d73d67f3012a295bb0043c2070b1b9259203dd37267a5c28ffad73bf16fa92e074681f25ebff997cedcf8a15d046bed8c868defa70e5a6989ebd200dde1c7054ea9fc8b22214e8e07e176b83a7fa6190ea4302a2f3a5c6f63c8005b377be39b3c4a9063dfc3d0fb495129036ab79311050e4224184f6cf651db98990634317f42c54ab4a5c660e7831d1d72d9b75c44c7f639b3dc10caebf97c1f5c89dc7c554eb516bf3383701b43e3d0771a04b47a1f6bcdf1b10dc711d0c37bca52da965845b711a0b1fdae2a648345eb7ababfad7578f8bbe1678d5a3109d62999c47e49e45233f8e294b05e3602e65353bc6a4f2d28d2b734cd43031b7ce81a663cd77a5430f31c28faeca07755f2e99c641da9ee55b92b6cc6146206008230da18720bc0385783dbc2e47f2b9c75c1766f8ac01bd2c4c1788b5bd4b1ee9c376cb454b988af19392484e4117ec13c86e7c274b69a30845842e930553121e960ba6f44efcfd277e874b0a071101f3953bcd9ddebd1a5157f2dde2dd50d374855a56947b004c7471045ee1c07cd0c1e4ade065e7b848c1a5444c74a28ea74be9527d0322b94d8742c11c0ccf4b76a096c83d201d585e9a96977dfe6e980740a9ceea8ea78b31b05afb0e01088118250abe064438a8dbd0835758820bfc0da8a924a804ae86dca57fd3be05096756374cde86c0422c67cea2f179a342161d4134f6383ee6e93aa309d84fd438b111408f58a59897c76df1a9832535172370f9602dc9fab16aacc4a6405896e6b75176222210a6c9074b16d67370f6bbd916c19805bcd16dc6972f06b9582205d37fad68e8b8a968d4bec8b697e6987c62051a854e4918d96bce4f774fbec04320461e9f0a55274c382cc9a9af47e4611814ea35898f769abc18b52838bc9143feaab37aa9b0333bb36852c26625f9e2169add571c7540fcf4b6454de822c6a5b1d9ca99eaf19601a5a1186112c65ae8cdcb4a31240a42694840336faff0203c6cb6b4e4b7506ef3347b935af9f312c0655675045775af17fe3b694c47af3186b01f4a30f53a82fa5e85077992cd2ac550af78a0c720ea7bcb10ba781d9d2a132d00fd6a812c0af0602d2e3e2c5c2c470f295a4cdd09ec6e1c3072c4fb0530585cf935eb44aa559e093631246cdcc52a8c55075b42bee1d5125661611539ad6e71256c193f458c1182fb919a1a9f7dd4905e424939591049e55eabe1deb655a3fbdd46c0be82aff0623354be4d9136497b2a3a122986d4596b137d8013f37ec8763b2970a520380e926465fa3e91b65183be284557490f4749ea531026b4214f955884e3838b0342c8bb6958d54f6a8d2b6972419a5dddc024665ae3a08a23565dbe57072e8a391b1a5bad665038f44d61109b6f80433b20496ab33f551e1264362f1e7a0dfbbcc6861ccc0048bfef1ea3a0f14785e8826dce53edb8aa3aac6df27995c2c093283aec419d31e905dc724c277d47cfcac2dfc51e418a44673c875872058a312781c2de87604f038ee46d94a5cb7778a47556f3e293c835d073bccc74bc895127417cf5cb3369796ecff5039c02ae92968472fb7678cc3a8e9950c871d05ffa0c778ec2ead65cd791b4d2cc806544649bf39d0aefb5ec5d4748b986c8a768879b55376b3ed31f224d5749f44083db6a9248ac174ff4b4f1ddd02dfbf7b12e29457eaadfed37c1b9a283b8d6d2428cb1fdff2b572b24719c32c494e3ac4ac22b1d74c7b1bf5127b9de5cfd5680044382afb550506eab85236bb18c10b9fb3bdb3ac7d2d3b2a904c1e3903cd93bd40293017639b6b0a9d3bc9a06abf78afa742228ccd15988c4d9fc197b13dc285fa11431e91aa000d37c1b34a3d1ea3104943d4b547f26612761f0ebe0b687a6afaf88f74894d092277e829872b130225cbda3bdf6b4ec81fc434b616d9da02f31a8d02d22824d373a317d24028507904fe16ac339b803828f970c7b69ea031549fd7862b48318fdf3fe9dffce4d4149efe8ca5a2d1eda5d066cf45d6addc1a988def14d6d994708c79c166391b8ecab90c6e423184462b42bba91956752ebc95c5d279eedce922ff278497c586c4164aefde7cc5bafb5587056af72adc76c35adcf934c0ae6077dc82832d50ab6d9df922900cbeb9ce767c95cf950cf9a3fb6c921694d925a744ab486996f2500d9b764ea7213c98df1c066d26d7e4499ef5130abb13deb82dc91e21891b6f3be939cb7e8b7864208cda451f5fc001a76b61cb5b47d6bb3b26946dd22f15715d8657522fe4998fd264587ff747945d1fbdc1787d103685669b9c2de51451c28c021de306d197d29f45e82b4d9007dcc3d9e4bc8ae13cc583f92571c82bf167d972718aaa102b089c5620569e6037ecc6d4a018a43008124c370f559ffafbf81ef2038f1b74ab28b46d78ff1377091e8852ee899a3ec2303698efed6b6bb1df602e9cfde5171889a3bbf7959b89805e24a156132ea360b8eec20f4368e555983d6af7b1e9673abebdceb3a06e4bc6ae46854cee26bdfdf4d92af695862d01ef73f94ebdd4655b81dae076d940ef8ccd8c6051e3c2299609eb74e3a062b7cb3e72d4a4da5a58d51f8a0b0a3d574a436fab13854665dd6b4cdc5448839a4800a5fa8f9295c29314d5d6c5454986404d58b48667c0c31b8f7bac25c91608e8302ac957938089f90fdd375a4310ab61ca4b7c933eefcf63aa00acb21fcafb6f2c48850713b82484344e9afa6f3d2262fa283ec90c78473d08755acb95a215b55825144710f3133e571e40df928bc5424b3d0861e9b01fedaf03ea566bbe5d1fec386efc457dd4b202bbaa7bf15679302381ccb2b708b0532fee1afb87a10b2ec45565ae9eaf4a8ca705f2de18ce2161e859f7aa55d53dbc8de440781511059c4fac9f73e04b1b35399be3f2de92bef659fba9895aa94f07314e0dd0d15fc342990ea567427d3d048815d57e6c0d8167d9ff01c9dd193b6555c3ad30484a3f459916d0ade2f773c7933c4f723378df9a24350951939710eb11bfcc239f48b46367e6f45281eeb6b437b911032b39f6202a313cc2d8fcaa1bdc33a51e12367871fe1cc069f4635c9b99230ca36a9f177951a5f653538c8fd8766b3199c36019bfdd75751cd09d1720d0ee356507ea1546af99816d6ef57b77ea2e5db5412369cb44eb0215e6ac265b5f032deb46dabbdac00bfc26e128765bc2d5a58ac747548cee75d04d2f77e9989695c2e533c42c29ca2e664152201e38c72af79f569b758089de15e36612d6d8dde59f944fc28813f87016ff26bc3f122c3c6db6693c2c353788e66f6289b7e0a778e4976c1529287368859fd6c0538e3449fb2f1f2a243cb6051628836133d1c5b59598a2a040bf933c61e94585e74138ffa61c7fdbaa33cb1bcf18599c626668aa929322bdf917464a71c526e42276a5917048fc4a9d12aac3f8a37d608149424972eb99f09095dc9a172d5092db542f1281c1f0484c12889221c8e681c48b141cd4b14a14b3f200b70af63845d9f944499b66f611e09428f7e4377d72eb04a24cd862b49330462e9c0ec8de4a5153b2ab6bf69fc46cbcd6dc5a037ba8cc1779400e982653f68514dec7d823ff4cd5ee4df4922ea92d91d952c3ca7fcbb8d24811141e741bc996adcfc7692aae50bcb9502dc45aec4ef31b7d47b7c0addd8a100327d2ff4a31b43a720124c2ba6feb6ed0af2dec75e4b52bfb45b5fe8dea133fddcb5276c1942b16fb97a365d4b42a136d8e3faf672698e35066af2b6bed5995e7a2ea4a72f4cd458e45610a8073dffbb160fc120260ed98753a75527d2906d7b0034bf3687c7c7702b6908014cc22a4c43ac9173f8161661af07a0f1f638690c4bac9312e3760265b525f97a7a0bd8e159a43c41dbd7e56bb9249a96da836fd6ed08d551654f9529cadabe2edf24ed0b6c5e2ec53a638b8300bc96d70e2403703b2ceca29d26276177b2d118da5c818e4ed2aee5842ed194ed1a191943731634e81216728f6361fd645612172aedb46bb8596b0c8b942b5443c9bdaa4c0d8e4ca7d34a011d99da347e420b9194a938116889761d805dd7c94a40fc00ea22b77d21a5c68c67598632c604cb7d387948b630e2ccbafc499632e6cc7992148bad21e5dfe923ba453580fb5690b267684f35513a62f501c1ba8196e19450c3b98656d21ac8ab56c260e186a74ca61aa5f5dba2849005403db946aa5354ef2b3103a40198293e4dcbb946aa13aa139c33dc973a62b5c13d6f06d7e01e423547011b621ad82c4e952e68f5c986f00e718d8636d684cc63eab82f5c432b690de4552b61b070c393c8f44402e24599eb5d17f07a4a1db1dae09e3777f244b6ab440ca39a091dacb86e48c98cdc3441315f4e3e92ad8df102ba0df20cd47815a65f287902505bb54d30abfbb12d26cd5a196f3053470b367a2df1788247ea09d5e64d485f181d90945a381f049d32e39143cc6e9146ed633ccc471236bb3231895ccb61c0ceaff7989a622ea4605108152e2d039c0f74fa9587e8103a0d69d63d7e4927fe3b118910105fc07f54507e5b009afe1022e7a3b74796f16afbe2116391857ff0b8d4417aac84e4f968e582a27209a75b8f0e786d303be854c9f556513bdc9a2edc8ffcdb665cf7c70d03cf3dbca4f806e164ad19f0784f44363951078dfc91d9c15f7cfa2e45539315f99aa7c71a73a3e5d1020c077f04b8ea68c0b3aecb3f102b41d2fa83bb1788c65c2c07084a42062423fcddabc67d2e6bbbc7edf4ee8824b7387d3ce8225d4bd2ae97c963f163d429cf136ed0f964ad8ae3906d786465df839d066a03ab4b3ac507f06e37715964693a2d7fa6c76189318a60d4b6596b73fdb20ed5575649f0798e4459951a0f1d32b20d34541cc52f39bc68466319ed9edaf1604a59b8293e7185e4ba13b02b38768901ea37d6540fd311bd40776244939806eba5328e7fdac679ac67c2fb0d370875d6a484a8447ed76c46e6906c7a4663b1e5269e21fadb84ab114163ea2f89230e5c7a9b66c05257828c060c8460ec4eea3b506bd738a3903b1b06e140d8e661ce5ea9f7b4463d8c5a71dabc9a1ac71652b5b066d7eef19814dca8ad031c780c49e66632e6b0556ad54dc71b04c2abe638c69006a8694eccffa9e280a155d7a77045915c19570957f24a5939742ab2e3b5642765ba284597c2036977334d5baadd2d4df8c82b4a76255e14b194e352c640292e14f114e3a0587c0a618dbdfb335146a9baa727211d4533656f94fa53f6a65c2fa50bbdbbb915f85370c0ddae4de2389f7e1287fba930b8767f260a94f44b1688235cb51ba11ebc500435894b753ba5923d4c8171df65298147110333f9aa4fac1d86d9cb80aae049dc3d9da006e505d76e99c287295dde77d8151c28c7a2544c8aef6cec472aa2f13e190ef7ce7f5219a51ee6a5001a5442d608448a63190a55cb875d7baa38282fc6ecfe950a9e8c4912a37059b43f69f747900988510c4fbf3b49561b431f8e30c0240952d2a14c8fe5d7d21194681d4a21207a4d0c387141b07b4a529382ae295d70ed2e9be03025f19b5db2d24bb876bfaa2a79303653392371e7a4a21e055c3c2ecb553af09052d6b4415cbbff13050aaef7f454107a558bcd3be14a5bfa77d913f829104f71b8583bfc255a50ec64a7093c9327eb28ec9ec2035c764a258fa0bc41b9b79487ddefb429f028e2a2d4d814f1c6d8ed9710a3b43b534284126d4ad15312a7dda5c9f4527db754d5c394f1dc775a15e0a2702976f73b61957f25656344578507c74e7daa619576b295c4943428d3f3dcc7fbedb83e07d0cebe042e8a38283e0e858b98dd3f12450aba28f434e27460236cf280e2340ba8524ba23e855d29b7e0b253a23e84e29e226f5350caed8e6dc5051cbbf14f2f14bb94a96a916867926c3dca0bd75d25c50114f7a0744b7993f27dca1bcab7a1d43d059edced5a0adc14f1293e96d245ccdd7f45110a7a9e0c09821434289896025edadd53c9a8d3d60864c43caa7dd4d0225de32951f288c2e5cdc68adeb4dc1c061eb607381c3c1020b6e401899d764044124010d511dbc0a8b054422793dbc72fcb77ef8ec1a20db74c8fe37b8eef912966e09322a408519f1942f33e10d328e3b714d619641f531f483ec8bf520f89599e6f2b2b9b8b42a2fbb81a08e6f6502e881b71fa8e96492f7bdf561d1f57121f57968fcbdf46ef6fa3f76d15d3cc7c5ba7290f6f1bcf1e0ebfb087a2b381ebb0e47e1fb7873199979345dba68310e1f76fffc9dac6bd0b08117e3339f4bdf73e1d8e9efcf1ee6cd893ffa6ebc5f1f8cad0bba95e09b31eabde5bd03ba5de3b8b19dd1741c790f6f3db7b2f863ff92ae0e9b1045f85b96e17a7619940eb587544ac1e5871bdc7e83e0a5c9d1cb3dd62f818fce8a45dd7f3bdf782bdf7803d1d3d1cbdf76ef4deb3d1a3ebbd47a3f7de8cde7b73bdf7e47aefc5f5de93d17b0faef7de5bef3db7de7b6dbdf7d87aefc5e8bd07a3f7de5aef3db5de7b2f7aefb9e8bdf7f6de4bebbd87d67befacf79e598f454fc59d14287aef8b7a656eef8f24c8bdd7b26c66736e6f37d6e2ded4863eafed60db0c37e0fbc24c4eee6d03a6c599d1c1cd00d6306b0be2f72fcffbc05ff445c8d0c99ceec5f2ef41def63c060102040811cec85ffef1637ed3f258f73d10f5c3697fa77131a00e9c0fc4ee7b3096ff13f8af93ffd1a62144a86d1b2f16ed5b26e5dad736599b39f03910f620f81888e8bdbb759f83de3bbe22c591e86b201b2bf4dea354f13148d47bd17f6159fd8b6fb69bda4bd13752a77c0b82b87c7b3cbbd8c332ede1fe7731f7c3edbc48d3c322d1078372916884494fe6bf6ecc96237fb890442166824471b7fdef822c419a20ff9f8161a40ab248e7c0fc0f518815e93c2c1efa18a88224f33f74419e3841fedbaeebe8b11c37dec16090fc15e91c26c7c48a741e46921d87b71fd2c4da7893e5b58f83434fbcf1daa66bbb48e7a4f7424fda39190c1e73fab6e9bb18246fdab64114e99c1c7a637ed37720c8e0d0bf05cdc81ff9f324ed8b346c38d2cb43db93368d87931f2fff774dd3f917c61eff77f797235f49e8bddf9f06daf98f67e73f9dcf7d1a1ed345fbc7a43fc9ef83c68745634e7a17732e66c8ffcb351de33f6e4d8e933b6b1bcad1c9b92ffe3839ff72396eb3e5b8314dfe78b65cbff6fd6ff87cf8d3d270ffd3ea6adacbf52fe6bdf51a3e01a2b509eef4633df4c69a66cbf36d646e84df0fbfb669b9f69e9c871fb7d3c8b25fd3439268e7b97d46d2e46d3492f9af3b7a226eb48f72761a79db3c3c91f464d148d6bf6897d9e1f44dd6784732f7a48d93b64c1aeda3fc81ff36c61fafe920f9e7dac763f6fd7d90258ec3a1ff7789798dfcf016f7de20ddccd4e6c8b877ceec8d7b41be67e49cdc8c36f257ffa26dabb991c113a6ea9ee689e1d05834da777e8eff5dfcf26cd77ecccbd53679accdc85f3048fae0f1f6775edb713048e2f36c7fd9df9f681bcfc8609034da36c86030480621c9152b7ceed3c831722c059116ca157d9b0a922449f20749da75301824c9d9f6399e1b6d72b67f784ed7c6395489501df991204196c934700c9fff4ddec27f1b735fd7d172334ea1f25f86d3fb29adfbd73489670fe77a065bef3dc064c10364effdf7e15acb8138a63ef53e2c1a6553947a3f7ebb5fdb69b8992d1be5e4b8e38f8176fc31645a36ca999a62cb46b938533b7eb66c3c7e3b60fef1da68cb46bc94a5b9e1d0a3f520599ef781fe367a527448a1914281408f0f871e68cb467c54cfeb7f97a2cc968d722bc6e452dc365a59590420fe6560fd65991602e9a2071671bc810d9ffe7c22fe3e8e93b558d8f1df9fb4f1be11cfecfe9fb26ada93a4195cef6f9ea2f4be42887b35625c8368ac813d88b2fc7123b013a662b1d399de7b27eb54ecbd53f993ffc723392d223dc9890927b5de7ff27148bb7112db24e9571b6fd2ce693c9cbee1a2bc29afe3395e248fc34da4a645dd78d3b22622bdff68211e69a6c976cbd2e4f593bfcf7d5a2625bd77b59e956945a6080c7c62200b0379fdf789764cd2f45db4ef62d1933f8fff3c7ff2cb344e7a12370b0673bcda66600b139e1ff9853989e9ed92aa4b607ec7616ed7639ec4bd9096237f364ec20f671f0cae50f3b72fae0002ed3a6091ce1758b4808ffe0bda423cda17c7fe9f655fa4f320298ce9b1e0ff333048fe3f9bb9d59f68b79595cde1d9b525139634540a54c947256225b65594c850c229d9a00461d2a3494326f1f8e51f07de7f28d75e4892763e2f2b93e9b42039db61a49168926462f8d007f32f57bf05c3c8a09819f61624c9d0c810217eb8fdef4fe6fd3a32a77312d80624719a04feda76d3112c2baba3e723ecbdf0dbb91c6e24daf7fcff3d2bb0aaf76ee74605042990d77bffe1b83dcc8d6369af115680a4e57fc70af49fa445fd0767499af2130b2325c1f55252d64ffe785e9847da73cbffa6c3c8226ec42315fb4f0cff3f929a6d9b450afb412ad53b243cbea6895990704864f1f885f9d0d7b48b5f02927e62b74ddf79e187719af8abfbfdb004e8c83f8129bd3692b8c7934ba046ef3f3901b21e0e8df38f6f7b5e7b34a8c35f26c78241dce3cd3dca72e251f051dbcf1e3d20fb77d1d3313dfffa9f39c264dfdf87cf87df519bfeb3735258470b499b862322bdff822ef27cdbf7f1ff3d3b6a31f478fe9685398d87d7367dcc694778dd1d69d688ce4ffeb9bfa3f3d87ff9c7358dcb36b151b1f75f70c55c8af98d46909487b6b011d9cf2893b69d936979fd89b54de7f897e34fa3ac6ceeff7b06e2fd3a8b511ca3118b322dbab228d87fb71d0ce224eea08b60b0f6a49dff7b2665dad8831e2e2253342a4bd19ede5f32c42f1824ff1d4dfaa397cd14fd5004d77fc1dcb6ef2089d377a20812a14934239199880bd1aa9f587d1b69bb1e929f2e8cc44b93cc8d337d477bbc9f2dc40b9264bf32b2df0c445010c5212a3bb4e9176248cc85bf5f595e7b3cd2681f45b82e6da703c7277ab94367a20c693184664843a1508528f5de65f4ac424e0aa18428114a62d6b308a57de39d87913faffded8d75fe0fc9dce762613e26c7702f9cc9e1d093c15ffb3fb46d983423cbc87ec11cff729024fbfd7e71fec9b163ed8f70f1dfc55f1bede3981de9ed39f2777f784cecdfd1430f2cfe6f170c2371794cfe76b13d248fb527817f087b20f9bbff70e8c97fd379fdc93f1322070deac5b1a030f75f0602ef3f0749dce7bd83021854d7fb6feeed2d8e3cc23fae67e0b74ce3757ee8c2d7f9e15c7f1ff63dff7b1674475096de7f38ed8b4798b4f320997f39dc0bc2d17bc73d9e706ec5891a53d078e93a43fe79b48b405f02e1813c005ad47bff05cbb204aac12079dbb36cdb75a419897f98247ff037f6e3da96237f7916a01c80161cf027d87bff0dbd318f7d8dff2169174594a549567bf238fc76f490fc370d1bceff21fd2ceabf604d1365b3207984c9fa2d3612493c5b48e65f6e4e887b216ecff59a1f35333f198e43b9cfaaa2ffb7599f45bdf75ebfb5e9667d98783cb33ec2defb4ca8bb8dc51fff9bf47ce810899e4f8dbb6893384d66d67b3feb597b2440d1b3f6ece9bdff661a6430a6dfef226b4f5effc564b55dcb744c1be5f6d4b0ddb2f66480c999d4b34986f52090a5a7eefd77fc31561c7f8ce3b7fbb21da7abd1eef64404ca20f096675530f871234924daf1bf73db8dfce164fe678f93c7da7f3b9f97bd705b738b33a3cb23274f9bde7b8d9e95a746effd87cffdee9ffba1110f06ed3c63781ec023e9170ca2fd56f42c3c508afe0b499c04791cc2c48fe366f0a7cbd0b3f098b8e3e90e95ac3b747718cce85976daf49ffc8743b31f79db448f47cbe4d113f32f57bf05499c44da4fc6bd30fe455cae8d24fe85f51ff3b5170b237f9d27d2ff2e66d9c9cb6b9af889769b9db9de7fb39d7f393b25ea40caaa33a5f70f75354d96db35e9edfa17b4e53ac2def17e2d4767151d345974e6fe33c6431f93c7611c7bd2beb3891f3f7e3bd888db796edb71473ab2448912257e9ef8737a38a46308712f1cda36fc7edc0be13eee85c51573b1cfbd5cc4fdfd9695cd15d0fb0f1f1af1b9397462f2d026bf706e458aa13d87abf79fd84c879595cdc9c1d4fb4f0e9d293fb928078eb4b3ed9c8758980edce320cde488e8bd935f98d3d942bc1565652b704fcea54891679f0d873e5e3197627e93d7ea384be2a4f81d712369cb46b92fcc65ff73bca687431f07029c4f254afc7e6dcb64b5b14489df9d4dfc77ed89f7878313009c00e01c8153f6fe0302bf704e2eebcd239b0ce6b61d177ca3a7f74ed7b3de08fbeff8ed6cd9889378bf160be2fd3a1846ca1f3f7e3bd2968d79fd85b9d14c88fbdc58cc8d6f656542dcaf48117f1aff8026591dab012e0f69610c04cab507cafedf6e16c0cbcaf0fbd77b1a7a5f5e43df7b2f4356effddeab01a2b6e99c966b3bfe77f108f7c46055302051ef3d0cbdf707bd0bbdf7deebfa43e06ddff7b77360d1086ce77c46ef3daeba8e1efade7b5bdf078d0f879e2867db7367bdf7b47c593d0bdd58a147a1af9920a117a1074145ef41ef53e750ef31eabd456b98f4f03517f0fb777fbbd8df736a403307bdd7a0cbc5ffaeac2cfe34ce146052e3a0cb1f48204048f9932a5690408090626138fdfbff9e7f3f4efec3211d03efbbc9a511ebbdffea37bc8dce87c636f9df3f1fd22e86438f46b4d1d26adb2df6779ef7da736bf61c2effeff689de2dfe453934336efbbedf025ec1b5aa9cdccf93396dc4b36b3bf277ccef5fb4ef2209a255711c44ec8745b255e5e448f9e75ffec169bf6f67dfc5bf68fbdccbb32dc4bd5a8edff44ccabf36de4532c7bf3cb4c3c8e2ff7675359de7db48a211c7cb707c0449fe66fa272c92b52d0cfe5b98db739d8b85911f1f7a17e42f78a2c6e0fce38264ee65e38d7ba2af83b83d14e6245d93796dc7c11c8f9c69f2e3461f7f980c8a8dad984b71db2ec282c2fccf24feeb669b88d3b517c69f48d6d534feebea7ff787f43026cb8575f490c47f4ce7383d1c9aa5f8b3fdef482f361746c674d1ce49df46fe822be6521065ffefdafe441bafe9d926cb8d3669d791b95de7d967e48faca6c95f77fb21e969d870e45cd3f2d078e7c6b277eecd8dfce5346e17bf4ce2e4ed8b6369469bbefb77518dfc0583e41126c5729c045ef4c43092fce1bfe8dbc6eaec9ccc8dc5a117abe9397c38f4e42f6dcdc12f6b8014bdf71808891ec78db2ed06a6c29755a11af802e90ba12f7dbed4f942e68b982f618a362926228c3c418a89208fb79d7bb9f644724c045956b4c93111e4d0136fbb0e23c77052078e2fdbf19720595f62b24c2c2cf7c7a27de7f507fa3bafe9b2f81771a2172b3f591e0ecdbc0cfb2fb7e7bcb4e8bdff7e5c7b1cf7c398ecfe5e2278e9bdf73c4fbceb489c26c92ea1b2ba24ea9d5c419265efdc8f6bbbee02a593655dbab890e282e904973f9d2ce372860bca25449910f76aaf5a59594c97951563bafcb6dbece22f8c7f516e4bda7b97f3fadf7d607138a4ed7020f0cb36feeb7c1158c4ed6e4ffcf707f3435cef327e50ea593f12e8593f1635180e3d1a8a658296b12c2d20b2b46465a9a4e541561656594ef5eef3dac6fd8f9387b65a5c66cb465c0eb765a35c8effb917fe369ae579afbf8d669c7ae7d47bdfd47bd7d4b1a4c00276f788087040ef268edf0e08ccf19f9b90fd57f399de22f156cbfb72bd86b65624de6ab2ff6a718fb61ec4b4daa6e364ff8566f68bdc1ecac9fec7f5de19e8c73baf5fd9ffb8b6dcb6e3ac40e94080f4de7f6dc1204e92764eea08e26565f3f0cb05719034190cfefe6da3fde4722f0cfedb460bfebe6c13c97f47cbb5277ffffd5972a0658a244c97e8e2ef1794679bfc2f48fb77db33190c921e8da48b667233e4d9967fee6f63eef13a7be84979481b6b1acf1e0efd587edb42fccb9e88830041def4d058f76f1c6f0dcecc0f8d319ddfbe48d66b474fe69e3ce29124f1b6d7e0cc7ef3f0e3b930c7694fe2fe787f630fdcf678e45830f7a40a156490fcfd1f4d8e91326ddf79fce346b2ce1ee6759ddb437c8c0cf7e4af6d32fef798ecebfef077fff9fef91cfcdd5fbe6df21f6b4f0beb682289136f7bbe7f7138f4b11beef16030c76bdad77912fff5fdef6e234e7e3b4fcc8d36ec497c48fbfccb647d0f6dbb48dad977c0bcfcce637ffffc87d3b75f237504cbcaee1fc4410a731aef1b7be0397eff645b987f22190c92352dfcff8e493b175b5b948de73b8c947fddfd895e8893c23897eb9ffb9bf64592ecf8ed4831f9e7f8afe9bcfeb95d0cf324fe71fa2e12ed582c6cb6c96090943f2e8c8d3839d3b74d8ec963388d47fed6f0798dfc05653a48d734593ea48df0bf653a1f1afd182e0f3fed49bb86237f384d8ee19efcf91f1689b74dceb9b148cab51f0e8df3fdf12f93f2c73d4cf6b699c5b958c38fb587ed214cbabdc9c1207d302e4892b58df3a08b66fe369afdfc6df4649116e2368efff8d7e41a9c19f9fbc91f37168ff9d8718846fefc6d3423737bd87b6f7befec02965e14b187b8fc5f228f8471ee89384decbd8c08b1e337d0ceed219edb435cf6393df4f2bf69638f7f9374d193c1fbcb43da786617dbc3b320feb373f278fbbb9f10a76bda05f9cb499ca6673afe45fc13ed3837dab52f9a917338ee8768f787a38b66746f3fbae8c9dffded709f93f36c935f98cb91f797fd17e2c71fe34717bd1cf9fbc5634e1ebf1d6982c4f3374e0f7f313d848d45f265334393ab7feee3da8eeb6aface7132d8ceb93148caf4f0c3f2273d7d47ca1fb78b799f3c7e3bfc7f9cacff1d5d47e62f48f97f3c88d957b0e081022c5fb73fd15877fb2c1f95fa27fa1ae8434d27cbb27c0021cbb27cb4e864993dd73430061e171dadf49e1f73901f071ec3c8b2fbdbdd369ed9b3f244e5d121cbf03c2264199ec7d57bcfc2c34496e1a9896bbb067abc1638de0360ee8177647cee659f7fe25d8ade8d8f64606e0f7123984e96d576d10804d63ece320a7bef649931ed9d2c939295573a91e33fcff37aff1df322719e8df0fdf34fb4eb323b278dc59a26657fd6cbc2dbe059884022f522521d3c4012f4deb1605a856d4a5300a07aefbd425d16f440c0a24f90de7bef49280f62378314697aef586c2f0b4e4f483c51d57b57d02565d1282c59f034eabd3718e0caaadea332572d7aef3d165570bc4d69d2054fef1d6b532a2a4026c0a289edbdf71ec127a01c00f4b0d47bef7d0a856e3192f244eabd33d81274a0456888c7a5dec972fce764c3a1910c9c43f7a0de7b5b7f719775cbf8fdbb1974d2aec9db9e63a2ff778e939fbef3de3b9b356a72db8ef3f58cdaa6e59fe3462fcc7b7bef697aef68623aff44614edf66bdf702ecec39fc58fb36db9ec36f38db2dee3ef38746d96eabe93afa7e93fd195b6ed7b599fb0bf337f9c70d7dee5df4de91b8a8ab69d98e7f5aefbd0c99def11ca7f35ebbd8c353d18b44ef58afb26c1fddbebf0fb25afe6445a05d01aeed87d7d5743e34fa3f848db69cd3fe369a8dfd6191e8f33e79db2e86308dd71f273df96b9a78fffccbf7af7f1d6ec4ebfae3b630266fa36d83fce1b831f7b72f163d6994edbb58a284c7f3e43f237fb86cd3f72f92442391ae6922f96d5b48d6f617e66b47d8e3384d848d383934ce38fee3d88893b55d3492c16fbcf32069e7e417e65f4847fe88747e7f7aa6f3facb6b3ef76971f29a99bc6617db6c67f82f1ef3b2b2a18781428674224bece2f4de4f9c10e25e581b15f42cbb0c59760b3a59160c92b92f1aefdb46bbfffd7d006bbb069695e1b54de3f5cff37e591919d909205da9f79f5088d3328967d7e418d9bf8bf21fc2befe645d4ddfa41aba4def7de83f7e861642cb641919a67fe0d27b8fd1b3848e7acff33e99bf8dfe438eff3a5a2687fee3a48f339ad5f44ce6768d26b422f420b4d0e5ecfbdfa86db7bcfec4a3879bfb75b717a211693f8c7f1cdd7dbf766f6f9d5dfe7112612a7aef637aef3d312bb27e0ef9cbf49d1de7763d57167d8e13e91cbf7f314e134fc4384d2c2bc3cbca801f0ffe8d384e0be39f13edf8071b85395d77e244195ecc732199df76f1dfc3228942fe777e1bff1d8dd77ffe32e9ff997fa677b2ac48f439fe89747e02abc6f2bd01951d351a9474d118c7363903e58f1b1b84fdea6afbc623f3fae3919f68cb913f1c36e2a45d93c2b8f6f75903335a0a3a2c4045e7fd0f319c23bd77230f1cc0ddf67dffdc68d35fb66bf9cb765c7f32c78d307aef457aef4486f4de8504f992057faae9614d931fa661270b9ef28373f44e96f51899e5e8bd2e4707fa29bd0b631f039df8863d2b38e62774dcbebf8f3f94fd1f92764ee2390d9379fde9989e67234eca3f9f6921deebb28259f0fb971b89b0fce93bcf635f24dab1fa5b7f2819d931a76f5f44fba4650559f43110efd789cce27420d07b3f3ec8a381f5a3a7f6eee398877767ccf1bb47d1ae89763c6861dd0d1b35e868cc98938b9301e7d6c6160386da0b176f1ada99d9891fd9d82b1325c4c2488c10011602c48757a4870e1c3668f8f2ca80e1c2ab57af7aef5c6f3d6b0707fcfed979f178c7e7cf347f2659fcef86434f946f1b0fc73d9cfcf1ece1d02cb7dd84b987cba3e77fc3118db85dfc85686bbd773c1738fe6f59366b555cae9e21ccebeacf26fbb356fdb83f93fd59effd6ec1f0bedfd81e0ecdde7aef463cb78772048885d9d9241031203986878d00428edd5fae3f1e76fc76c0230c14c6b7ff38f078fb9a867f0b38fdbadbe7a40a15e46d8c173871d59e8583ecbdffd81771d2ae19f46e7cea9d8185ac1b5e7acfed3aafbf1cdc1dfde31f87cb5fbe7d8cd36966722e6c68ea3dafff5d3d43fe75352dcc6d37b9dc76cb715bed0f613fa4fd9d596ebbf9dca7d5d167b63d07773c937f4ec3b4d0bee1f0ba9a2e16fdf0fe776ff3f0cbfd84398d67bcf1c8b4353c8efcd5365dd365657041f27f39f2170c92b38d7ba29de3c698344b23bf30cf6ba34df4f47dff3b1bad863dd79efc37f9f1e6e4dacf765c1bed7ac68d78706d338e30f9ff4c0fbf4c7edcc3453a1f1a6f3b8ffd5c7f9cccff91cced9a946bff8be47048e738f96f4ffedbe3fd3c59d3a41bf9abab69a21dd7344edfb78f499c96ff9dc749b9f6f297bd3dfc782449fa1cb649dce3f91cb785b8bffbc37f93c4e1bf89364ece365997d71f873d69e3439fe39e18fcd5fd3e3936c3e4d8bfedf9df5f38f7619cbeffd093bf9fcf9ecc3f9ed3429ac46bff89437f7fe217166bbb88fffbb66ffbbe692249fc395dd372ed6352feb151aebf3047c3fb6e411cc14fb4e582b21d0ff13ca6ef1cff374de2724ddb646d46fe82353d1b499cce713fa4631bc73d0b72a673bb26ed4f47fe3e7de7f7bffb358993c8e91fd7761e99c27a1727134c9841b79d46892e88b03f91dd8784c41b3860700c3a43660124369410e91b1a9411358706a230298cdc201599de2fd8cd298596c34b8f1f70e0185081ebdd472a900d4541620030c194160bf216bd6f380012041906e569227ba3058c9d54797f308109c64140ecc59b41bd772d1d11b05f5e9d54199a737380e9bd7388c54cf9c941464f9a3aa93c06234b507181c1610621410938891c95b810c64d07233093291d30d041a3a335c80a164d2292418b95a22399490e8d67ea5b67fe16d466c4c412299f3a2cda024a12100579923ab5e81908d004c205212ec135497adfa213270e83fac21b0416f4ee0100524c1eb4018b2304a677af15365c30501aa0f48848e7323145d029d20720687acf22e1e98407ad222593debd14e8b1c915929ea7169d6b0daa39a782b44eef594f4a8c85614db1d2fb571eda51812e70c8debbc8b00431000302223dab94a2066d0954e95dc3d726489948c1f5de650087bc38505a745f8d4d412a2a7ad7c08758e736a8f70b295d1249607af7f939b29888f40d76a946a4bd5fc0f3a7c394deb54a2e9c5a740e5f56c4f48e41edee53ef5a608064e780e8f78e211292deb7b416f59e8147ef5b4c3cb4e0eabdf7de7befbdf7de7b56efbdf7de7befbdf7deb5d25c80e267a8460f841aac62a448b284c130a3d209542f228d326400eba5570681421c4cc8a13065031128215b18243162e107440b0517833b49e40152484d788fb520152e1052a0c1a3286197ce0636c0b56da92463039037b5266ede5c783526963d96a3ef43e406001a162c8c0206ead0014f983f1e2e98712895a68aa30654cd2943805d21958406467f08098fc926631929590df0f4e9e1832fc90d22c4894268c991c70295d592ae3b58543800007ee04703747f92a0e17dd25022c884b5e21d03be34ad894380951999b2228842624d27635b31111b15261be2b0e9724d375a825a6010f52ec501154293d7d712211c5ed1c1b0d6cfe8c6c86a285dcab2c2a6911e47150000237617a8832808765c75262db10535321fa08ff00830232190d727196231ea04ca03a305a12b53e012d1c932cf3a8ae636ac6ec220ad7c9c45502e154384686221d0326175012249cf07225e6c97cee44e0db9261d49ab54615403973c80c1a0f5a9d48b2f1fd8852d2d3464e8b6fe54b06324c05811861c000c854243c09c0c71b41a0092600e141db2b9a2d31538b943261a4cf07c94b1f33c2aa28029231364abedae0b861a33ff0c042e8e60600424ca403a1aa00b1d23165ba8240c44b245463a883d2892b6065014493d1107b5639a182d05cac01512b5e5f8a21369d416a350270c532a906965a60f5d963d611a60f292e70b875ccb4d85ef0007849422a4962510b18196f049b193090b8f6c1a411001812c00c380c5a6cd431c47849e8c716831070703b20d7e6c60aa1ba376c701556053389981f27c1164186b11888231b77337490a8b0d122ee47961e1544d69c4a8012e2a68054d15365c000448846a74a024b6116748a32d8c7c51506c61cd68b037ae32f86c4d61e22e53858c30f0f921626ae5a5cb50a5267834d42a4028a191aed950c160cb0a476a4cf8c03aa901a4c2b42652a010451ca4c5d8d2557be8b3ea540d05dae6a8f16b5d3b8a7c1132f3664e79c2421811588e5b6ec8019185c08345714238d07fe60851d3cbe026012e079e2ca8e340e68fca69075d6fc70230bec21c004484138554683be288e223e78aa52c1b56b614a584d581a1c17cc34a8b031a2e9b551fb6031ef0c4258c2b52158d325d5e4f569d972e1910e648a12005a8636e373c8c82800596485b9a6ccac361cb089e2fb595ca8627043af1597f109c63a6932e6b8607da7836607a1cb1f30681392a1c483be2e1440e1f5f6a006c2a20c8e653105e21b31544cb2138620d360d541abe0af33a9664d0d159c84cd84c2223c764c50347389f3ae42dde54a09944a54dc8c3cd800c20406c3d38632a7132688045feac0799dd450343a1462a3e91f9e083e4180085bc4293d270c8a30411dc2ad0831316558b20b5a242434b80bc858e7889a7134222c8a464870f481852f8e0723c34260976d4d9420202af271c247491a1120a898db255d83375eacb28ad110e28a1849e73fec0bd1edba2a5bad0e6cc272aaf5efd383e8a98256930f7c0861c8e40c819f28a0508053e50e9f402d4cf674741aa032cbc5a621404478213a21ed071210cc9a90e01bca2e55c31ae049f7ea8341c40c0894eed2bb4330f220cf291a9cc8defcd8c25529abe385963d0200f1b22d980ae315412b0abb46448c985da104ccf3349c3843b18811c15a0a68561d29241dd0119599e088dc293b6864882db272b96ba15b9ae0f7878d8cdc8d1c20d84183b5c2dead47df13091a4418937703e4d0ca116384f7cb28ce040434c6aa3a54282850fc0465314e01263ea952846392e1c6a6bd4c01c41aa052f436c867c62f066c310ff828c883a5871591eda2c985220c594222e87026109204cce45829473200d1f8576e4d52a15794d1879959f849fae4c69e091fc0a0236486a5e0f41401c01612715d89a1016a7304da0a3b1c546a5920a8e02eb9a519e560d1dc8112083963e10e0202c20b1c1230c044b209041d1610f0ac702a800be0d08461e7688028cad96846bf200170f9f921b132d4398b865681026abb1d148b088035142cf251e700707070489f464cb94851168e2d891d222d0faa3280a017244dd159057c2cdeff46403863b05379c6cc68a1c2455879e2099260e7248dc36056174141aea13e744ebe6d09a3bddb82512138a812136dca8381262d2850658e810632406010a5c2a3940d1246ad186315254092016983285c60460a5367c5ae0ebe4161991cad0d78d5507960b5a3e051780821828be5181a9941f54135012e00a9a06557514388489828d31540fa4d0025266c5e7e3511839e1011d1e2f0cff090064ba7429d0e40cb3108198c6838e15a37a50f8a3e12d949003b41041e8f2944641434146eaf39d3a7122c61e116bda1051a0845a1c9f2e1a760412746873c26b43180bf9a4ba1e5f6a24b0aad32947d9a598905c9cafd79695660910ae13acc818f2a2e3d1160c308bb820d138bc50aca2e02a49aab50c1cd6167c4d50e0e69213087c4248dc5b76806d79b35e18793321478142a3249909f3058981095c36e04c109099a2024d14464d3c142d6e5ef69d2d70dae0b4759d4942d521a5478c0743688c84f11f8237869098cfd819e064eb120c2a642ac1a9d44ac9032386d6262743240e6b85ad4c5b2eded018845af900e661c2a62354b24cca922138e6a3c5518cb825acd0a8ec15932f16526838248c51675386332d2584f4f008e44802083d46769cd1d1210e4b1890136fde1244a16c1882b85ceb9497635b9727767398de88e8a2c0a92618da28c11066c1281725325c22c500ae68c7818b992e4d5c884582f30503a84064a028d12af2a98fd1d0a4118b34d50fe01911e9110610f0a9ad158bda24d900c300bb1280411b40496080a40a482a1110ebc0f14ee0a64c4bcb529b27085b103cb9fab22121cf284017b0580913344477c8b70243ca6d0d8fbb0d2a8e84e8b822d3e323080413206a00daf21130ecb0e5a51216355144d84985f763ec4296031159940490078b1b03c40e48c0862a0d561e8c7275a655d3cacb172a0f4eda187d29925c018a85187630b248520072d8ac753d21200239a7862f46844852810e191b94be464da923b7795183949a396e46548ccb4ae00b5f60d418962b86f49c22d26246bb22f82c4805ccc9f3638501a5827043f67cb1b19a31614e849a49157088ca93bfb4c92a6a4880041c2c501ea8b1c20dadd094880b0a88423dc2e4b123e060172150814b1f2f034c04a91061acd0a10718fc71a00ada0359147efcc202e170b50703da16ae1f3cf0b8b214607580aa075c15397015516080b7cbab2b2bcf431c52084c00b32106ae43bae1e1c69c0024c6d8ad9142568cb0a927c1d45696dc92a44021d88e40e606898898c1cb20a44a979b2a351eb0501ac2c408c968ae839775003171b09008d208c8434c010c0ad80291892ce346481e9b313fc49429608c130ca10638a388c3021726b1dd78f2c63561c8a15311392c4e33b84cb9d4e30742010b4bb4da64396240d18c22939e108027014105c4c190a3ebc124b4129964fca60c25b856407040bf6264394a3500271fe9920a0e5895d06251aa0685e44844d130f848f847023b17148972524604160614bc384230024159011b8e785ae356b75220cd8b2e86a63784e47c8d8a876430d861a6901448526a381d8f2ebc98f0eabb9023230f7a085ddb645cd32069118b1559e24e6344f4b4d8a0a3ca165f9d11124b3cacb0292dc263e2b3f3234c171fd88dd05305098dfe5ce17141ecab8906f38e0e3f24a328828c76fe6c79e34d64bdeafad282ca08ab140558b1c300dc863b5d2b26f9163dc6cc79e28855035ac88400f515650aab29512694a907ad923b85b14d595abeb644504390a7af62cb0a220f5258e0d2e3cf568d62c5c00a00b02a9011626c799172039853828e8d28e5199533132c45ca528f4c10e7e30dbb6a01b12d101e4430c375b649823aaf2003555d707a86605080f392f352d6e2121d0739a50f582b364c21e3e14c92418c30100021ced7c019a23170106d1192eb62848d20408e629884f62891d133dc398344d38de31c350eae52946638b5e800aa0a011bcc0c22be4404319482d10253b6e2b69861e4c5000c255dfda58102135f19489c5109d4e046a50988305c083a928a810ee6d6ca2e31650505132e928ef2291b5a0ba8e9658203c1046554d8418c4b19326010800e0b079cde4964c44e930e9016e0c0e187a83e0f94f101d527046d628672a58c1611671549ae73d6a1f1e10e89c1d2120c0f16ad6a53e169485d1a34629f383c6a608321066b10000f3413c00a1c58048c103e579acc26a891831213571b4ae5a173a371410817ad1f75ae65a782cc98a8351f426de88086e10b860f43030a145a129278ccbe2a0d8c2ad630d8c483c2d032783a23d2a58a0c8f094d2cd998c0ce2977e9c316a9c1080012296ae6dafcf884c027480dd07df289e5dd0a188233aaad079e0c25322099eac2214999b2428c1826440988f0d4896dcdd7a24368ee06038e8d1e0cdb5fba2429abcf1030616d46b599032651922e264279e23ae581c969a9440e4e4db0482cb8ebc4c0d7094f3c5858c951750875d6069015305ab2749412538787508600e420b0f901645390cb3834d44b23c10e3a240e7d7de5e090e7554550ab3e17225867530f09e61418240faa8ead4e2e74fcbc42e0f789d0895112b62250b3824598533e8640b22423481e548232b0a26b53e4a468c3c3212b652c91f560e5815df3018d38c1aed35347d15c5e22bc2d2387d2426024008189f4e88315434522648887984db0c69c038102213156ae7c5b072040ad1f92848019928122cf0bc20acc16853b7600d4b9417aa50528cc901b9e051818957051e403020a0291ee6e5720ec187000944b9a60caeec42800e62ce449c32090d616dac1830b995aa5ca30d70492134d5c309ca1a915dab025cfbd8356c346c6e50807ad475f138ce9a32611040b30005d0563b44cfc9962a9930d353d1b7da26c3922c6c5053971e274014b61e8b541cf33d989a40d720ce2c61c511bfa6c60e1aa51ab35517c08e4499577c0292aac64987985b60094e3851ff18674a9cd1d1e01be575c904e60d160e781222858b858e9922280904912ee00f1cdbd45e62cc0a7120047042ca8bd98f1eb2a80462611906eb93692c802f8b251e2a8614bcd0006b055f8d4a542ab0a132923862c513130ad91d244061ca6690051570a38d14562872449a7eccad879b3a188993b5b3ebe7aac522c942ea488013589f11520c94696923e5eb49031af23a5516f8c08245aae33f7173f96e6789014d700a42e87dc34f06a24e5059c04c03c25aa23c3f6b2b0f4222b8416288c18b0590cf44006a479018a8d6b6c4829062e9024e0d562150e01bc365df262bf886a906544042095f5fe016607060f4996787ab0e2041455462416be9818bb6cbdc94bfd1196e87c157037295e593392014cdc9890e295111fe414993864678ba60e83e6395e26d8b10b38d307023d0d9c51da52d1e2ec2308559242108e935853840865983085057e346526c51349708046a540d1c1029c37b81ab54f029b44b22ada100c2d428bdc5461d30a99696bf1ea4b8c870a1880a459820050572b192495150cc020a011071c34baf23b1c40ca08e344d1d2054e89968d2e444242acc83cf91e47122b6eee02291c2dfa4c8077f42ea24842ac4e0d6c4873669dba7385ae0e13b3b6330560c6f840bd829165860a1a8e52852d5a3b4b9b2f7c3d1c56f080a286c903f8021c551220a2e1d56f5314062722a5396101d08de7e4926f481037497e54742ad48aa654e744cea1ae4b39c4444145211804cf9f3833a23c44031d6ae8749345a78b895433a34179bcf82e10d9f18a0d1a1c46710ca271b83bd29583bcd333c08cacb2427474e4363d02fb7a1366c526026a6e0d88030408178030966500ab1c80da54c9d78ce262d27302080f1725556f546d98e35380d682a6e7009e892fad54605069da04e9ed4fe732227c942a2b860248b454b019989a446402a32249beb87628e2a4272e82a05a0699c580814e41afbb23974e8c00e0b8c649c8e5e00670958747609022285546e2b2a38f17845215045b9bb034c801a983123e77dcb732080c1041064b7804a1924040d85dc2c118293f333a1eba4cb0325541ca0151e0348172b36a34628b8802c85a8097222d6502aa04550a5123839a131c697241b421412418eb381afb75b8a1e6812e613b07cce12617f64295abb54a0d86361f22bda3a5cd2956631120c120271207b2ceb0078a088752559e2b820319289b849e04617d122c884ae345ada54452053e532af921e9854466334495c1101645ab47aaade3a5de86228cd2d425daf0801b2c15ee1a3568f089c5b8b860c6470b031b57b4033c766d1778ed1035e075a1cb000828589bc14081a02e4881f8c4c00d6f8f8844031a17697428b1e5f5c0c3fad2909b6e2a30ec409d6a62c1d08b2e3117ba1ae02045edd280531b3b3904325092a0614b2c9f52b040edcb0625616bbef810f9cc3a78c0c040a635710f470a0c8fd8915d543e019626e1a881c74d4d912032efa7af547ab2aec03df00be52929a803001d9ca500161e3ae2b0e890e31096496e150d2f5d165aa5a132a32235b309fffa04c1f0fd929b400093d184228c2c4961604cea8046561ec4d22510661885287174a04147220017952e3368849201c82e5506e10b2265ee78c95980460d0123d6400fec306223a8a84496af0fa8349e22654a41f7c38757a9c80fae0b68191a0c209a6488682381041c8551c04bc39e286a0630932144ad4d8c186a4ede3cc06d0ea0dbc3a88ca549957674f852a369ab0b1bfb4ed2110768ce10b2d368919a0a19927c49988b3286d095b809c4962089e4eb4040308ad8016c77223073076d609e00698bc404352659b05301399340ef716950030ca624b0b30288f1002547115a44a1b3e380c3281f301ed1e940aa8aa0438bdc3870a689569c09f59f535b33eee0c18465a74d686080df9cdc9d9064a2849a0c0a24f4d2a4e150a689b87527919a8aae8302447d2e5cd14a4b04363623c8401d1a779fa016b70e1720f5d6b03cea7c915063e15ea5274c990d4f8c6448f2d605dd60d97a9343ca49055f24f34d2e46904bed6ae86b3443ceda05b65663c23ab47e9c20e0e0828b50212869c0a442c2032202a1221299509254465423df7004093c3a2e35fec8c6267575701474093ae16606d9913a55902aa1f8988559a0a195a00b9abc4d300ea8a48a00375520bc3e055dce9c3c89c2c680425f837e12bc86bad2900440f6bb6fe0c013c647991d0c2bbeae9499b3ca4785520fa421248990b00b85ac2e4baa48c0b646034b9a1d248230008771fd6900cf8e071c6a5408a0bad161c3ce015e108448e08c99130b9b047e38c0692306cc7221fd26c2215ea670b0f1c094515e94b8d462b80ad5e78b9214ac8dad8a8189f3bab1c315016f5ed4f121abf4042b7f50e7a10d0408c005bdccdc1ce5d6f8f14520b2956880f5811416085508f5884d0b2802a664e8d3e20f1b435b77e2082004dcf3e1d20e0f2c4a352988243424e07ecc6923848cd9165d1f2d67a298e151a34a5b5ca2b7110564207bd342eb001969a3e4603253245329b90e2e9985610727014ac85918c138d408b534c1895061cb5b9049422e19b1748cc10703973013aa9c85d021a30396d84a242f6e381c21f426a7919ab4ccac22850f0a4a7468dd3a1835424b03c613b0d37b480d8f004385542e5c3c12a0c907f652241637a6b0dad0e8002c929ae03141278984c882a9b25a0a0cf0e28946d7960fa708c02426840fda05245b948431b1a507aa38250bba408f003688e8235cbb2bd2e74f8083400b481456f9b068294206cae735844429083e251974a7abd510068ef215e002a61c48c5982903a501c8250522e5b13307121b611143322090f1fd247c1a01c9ca019dc87a323c6811e0a0eb18255309c5bdf4858e599939d21b93af480f0c80c70035ba2504c455d80340081e5981548189e300002b1c41a7d6da1a2b08ae55719868129642e25995d2a0a4464bf3b5660ab5016dac8c8fbc21082184470264c16d8d4c152081a7e113b42b451a802dc0e58381176cbabcb4681980d471a2248ad688638e81553dd5e6cecc9de9bd03f34a1e092c0075962a84c3845cc47271e7c7038eba54040d41b2e4638b0a4fa95aecb1e285538a286aee089ff4740184e6c11f5243da264c2285c0a91571f8944a2aee2c5054c5e49eb122a123af8af6e95444cc4d9852b391e60010be87418f31376d5279b11c54f4120d0088002e742c6a27465eb105e500811f98c2203ed3e2d9d2522607180a3c5678000e706465c5e79187487e131da30802103156a1c895552ae15449918221642a3f77690b7052f1f62a8a2431432744a4d060258c0fb311872cc52948f3cb534ae881a8ac2cae52dc304e46eff96dc36670ec5d5959ef2b84b8873b8beb236e8613eb6a3aae8fb83ffae197f16c7968db3130cf138144639de7895fb6eb3f041eef1c28ff13350af3e297813130cf13df14f51335ca6b65656ea5fa6ddff747ebbd8b751edde756a38b68fbd47bf7b535f2b5b9e99d54918224cb824132c77df14ef6278ddacca4f1e3da7c3eb64b6c6c4b7aef3f363536addec9fe4d37b46d38a76bfadf3128f59fd8bfc3e4eafc97cb69222dfffc0f873186dcbda6dad334c2a0d3629c6efbdf05d9da14fcfed1450ffcb9bfa3ef2210689ebff45792d5d9c3b514c13bbb207d7feabde7a9f75e274ebdf7b0dee5ee536b83e76fd4fc9564359e7dc342dc0bd5a0a8a911912b2b3b51e30ae0fd8b799e98e7892b52e479e2c73d9ce78943ff0243ef388efb6159191c171da7510481b73d93f70fcf69e2264d2eba0430ef0414695c80f7cf6960fc8bf889f8dfa515f1a171426384dfbfa1f79d89fafd7eb9fd87c37f575666cff5dad176c3bf8dff6f17f5b7b373fce8e1fe9f81f8d11771dc0fd17c6661cc7c2ce0f85864f1b108b3d4dff856903e15483a9621edef1cc5d0d3776e9330d178c7b8b1487ed9ae81765ed340233d3bc3faf6e4bfb3e1db5efbb2ed7696f6e97b8e946b5f5606138d371a9921ede7606e240273dc0f83ff8ec4c743b1a7e3f7efb625f5de8bf4c857b6c857c6a5775f19580f52efbd041ef5c6f8dc2c372ebdb779627a17d4c3b712f2b1127c88fdb038d7d9b064f78f887bbcd8cf649d01a4952da75d1f85de35d8759f0ae6ce4c2d1f9048199501816e6f6b72712f0de0fbc22cee6d4e0e082ceb01a4c1ee4b5bdc852d1b711f6aa7f78ebbbd771161c2c0c1de11458b9e98efdc83df3f98367f25596edbf7204186081522246890a0403d403d061320754be5269fc9fedc02f095f99f9e9f5e9fdefb823b4a88f6edc2774252effdc41d35bdd327a69027ea6af4de71bb1e339e48f39d507befc120595747407f8f3a7ef7f81c87473f2ce2741ae97befede9bda7a7f71e02797affa5387afc76bdf7f0dc21bbd4bb49fa14414188265dead911d57b5eff7f9bf28d81d529febca68bf65cef3d3a26da74b24c4b47f79968511c7e21f0fe73e4f49ffc7b903fbbdbc623edbcf75e1aa7f7ee0be3d37d6175ba2faccd031f0904ba8f849bee2311a6fb4808d07d24a6741f0924dd4722affb480cbb8f44b0fb48c0f5de1d6435989035a141ef5b23c874df8825dd3782d87d23eaba6f845cf78d68d17d1d0c755f073addd7014df775f0d27d1da4745f0724ddd781d87d1d82ddd7c1adfb3aa0e8be0e23baaf4386de3b840a12286c55f07da575df17da7d5f19baef6b42f779b5ea3e2f50dde785a8fbbcde749f1799defb040d163858e8b5e9bd67c00436bdf7d6f4d2f4de43d37baf80de7b6726949595f5de33d37b8f80defb8232fd1f3d9bed1697d3449acdbeff8de3596dd3387d47a7cde8bd1b3b99316216fcde7b617aefbd2fbdf7de97075c4800eafd4efe7f68bbc9435bad9e917f1c374343c3b387ffec38acdf70b936bad8e06f5f6410368687e5a8f7bc74e9f560f0f71e972dbdff1091d77f6844b0553e304abd0b71ef732f93bd57034cad3f39e20383d073bb964343bb3f9cd9afd784b857cb71cf867bb6fab3e1c3a1195d9178abc599e1706945e2fd8745fa9e43937feeebfe5d576786bfd11589710d3cdb2dcffb6e5fb6d1f22f27d369f86de7b177f1bf8bb4139d61cfc9b817c2d5363d3cfe18f6502ec73d9b0f6237e7f5de6d741f19a23740ef3d2dbdf705bd2cbdf7b0f4de13a0f7de95de7b5602e8bd57a5f71e95acde94de7b52cef4de8b22c6e7212dae3f8e7f60cf85afc3231f1cf0f438793e0e357aef64de976b2cdbc7014c887bdf86093ad158932a540089c6dab721ad2b43efddb7c145ef649982141b16f4b4340d83e0330d4c520d63beaf077e72b7d03b8ceefbcaeb1d80de7b507aef3de9bde7a4f75e93de7b4c7aef2d51c0e6f352ebbd7b85f06548a077f2cc9781cb97e1810f03a6dec9b2bcfe45bc369264993c4696c9bff79e9224bdfba0f11e9ffc30fe7b6818c8eec320a177fcd369b93d94fbe53a8236de5c1007f971e3cffdef8ea687439a48d6f45dccfbe4586dbc27f9ba02f6d02bc37987c000147181ed020243706d81d04a570ebe0e5979365edec1c2aa9e6485f63481e7b7f343185857d342dc0b490a2426e05e12cedcb6239480f0f5e0f8ed8079deaf3b383081bfceabc10606264d24da610bce2208051ab04ce0869e0904e67db46f7dc97a0080de27fa7a41d6037e2474415dc098f53819706f6e6d6c3160aca9bd70f1a6a19d99b560b142450a14656ecbae6a8a9e6679e247368665c2c31a58f7ad81f528dd305370464217a46595593f04d68f143152a437ca8149bd3c3d3c861c742c22428608e9fdfba071182b0890089508896af02bf4c04748d4fde3b4252f840ce94c0881653d481bf4a5b719d4fa387ef1d23b97256a3d895a7ed3bdedecfe754d93284e520459ff61fd876aa0a00a085089f5ded77403ccdeb54c9142a3c3b100e4fb43a7c1a83f6afde7f48d27fb7fa7abd18f96f30e585656c4fda0f043e667831859468e916561ad31fe3470ba6886d3455f570f8b44ba88cfe1f5d9ea737c8c29f22f877fd9ae81784f823d957c7b846a2cf4a0ea7a882c78436050d1ee1d47000a568d45f4e551eb1dcbee010f2cba35e24142a4c80f207744759fe3777224f1d9c9d1817544e5d501d3bf5da7f4d129d57b5eede79099c3751cd66f5fb6dbd686dee372fccabd66be3769baef0d8fee7b23e6c2c3888ec17da3d57d071ceabe03a874df0177f71da0d67d0780e8be0314749f1b51dde70650f7b981d27d6e86bd0f7d6cb3adc9e5348d19b6db2dfb33d99fc5e1af30bfe9b3d9b66f38d99ffda1cfe55c0c871eed98d3786df47534fe937114f48fc43fec8724eef1cc62617ed330e9c91ace8db73137ce62f8fff3d117493b27eb3537735873ef581f2bc6f2417f7f7fbfaaaaaaaaaaa6699aa6699aa6298aa2288aa2288a9ee7799ee7799ea7699aa6699aa669966779966779966779966779966779baaeebbaaeebba6edbb66ddbb66ddbb22ccbb22ccbb2ecbaaeebbaaeebbaaaaaaaaaaaaaaa6a9aa6699aa6699aa2288aa2288aa2e8799ee7799ee7799aa6699aa66996655996655996a5e9baaeebbaaeebba6ddbb66ddbb66dcbb22ccbb22ccbb2ebbaaeebbaaeebaaaaaaaaaaaaaaaa699aa6699aa6698aa2288aa2288aa2e7799ee7799ee7699aa6699aa66996a6dbb2ab9aa2a7d9465ceb367c6612f5defdfd4f0cfd97fb379c8ef7c69a1c30ed4d7b43737b81716f71712ff0659b91f6d606ac61d6e67139fef2cf7d9d2fda7791edeed7d5f670459d9f836b8d2b883f5fabb387f2daafe9bafa2dd3a69719eb62611dab84fc653bee1d4b0c2bec0c193c3010c77d91c488de7d4d13e93bc6691927e21e8fb4d5f0a1cffd6c67e32bc8b1143ef772111fd3644c041da91824581db038606dc0d280f585e5154680debfb1872fbe8511f6dfefd73bd685deb1bab87ac7dac2d20293a1772c1f565697d77ef13877fc314eb463c97d31e0cb9ade7b17fbfd7e61e41b07d7aa72725ea0f4743596eac062d19795b9a6aa9e370ed7e543ba1afb1b97bc9ed3707b9a409c0b56effd819ddefb8db23292bced798009b6d0c0ef1f50fe79f47c02f7c0221ea1772c08580f7a77f36e734d93cd35fd0a828233bd16bd48bdc708516f506f0c9641fedf5d0b0b9c4df71cc67b36d6396c9cbf1cc31ecb0296042c2c097aaaaec8f8fd1b1aeb2b6c5752f4de835736742bae7c564af5de8bc7dcca212b7dec5881d37b1723cbc6c6c27c56a85861d27bef644d340eed98247f4d1be37fe39e48ccfbc23afbbe8df8afeda1d85cd364274c90b74dba793732b7ebc2c89fd3353d93f8cf6d630ff2f8ed8edf4ecc855996c61c64655996c61c61e4d00e8208a2632c58168c3f0fd826ebdb175dbcbd52f2dec5eab0e3ed6ffa370f3f56830a548654b2b01c6035c06280a5000b6b0803874e25093508cc10353f3ca45093a343ee06712a14628ad890b33219b51105ec0ca15042c3a60552a6088934a769c3a27b92103168de60b4c0914908d1520c343d000542d84d2998742317210a36b472b5a86a132491954139c4a0b005c982d7a0cd07151182c455ecf67c614111e4049c9a798aa955405851a04107472508c89f086902f929d10299f2a0899da2b90880d83073e622c3120880802549e4c54703e08f527612dc48d0b2fdb09376e98809005cfc48a2a0135613158d7ec0290aa59661a1f4e3abd3fb41958d1d3e382559a061ecc5101f6ed8154888e1f7f1e3899360bbc6f6e102020a226474507cf8c04c303b51533c564a0545c0f3d1762460ca17145506a938de14d84e9c01631e5364da1a92a3468e0e349c1dca01412faf1110b50863475d5e970098bc415396c9ab2ba04c6cee149dbcd381411fb2fab0c273b5d622f5e42507dea0322d7e440969831700ccc525cf39020fa8608e4c822345bc3045774f4e70b971774a011362a004e9bad3c3e7120f1ffece5d933a4ea306b99db89b93eb5003cc0a2877e49990356cae20194129689589ab9029231c45aedcf01eec311221e04ba842ac33c218f3e8129c01128c5d6f9686e07a52e40c4c7073f67915e7695e1401c5288b97dcd828d18cdc4786dcccd8c3120483b87209a43608404780121c520d4d698e710bf03098e48010942fc28703e45970cf15c1d74ce5221c7788702c3700702040093722183f424560a6b9b1d4849a5841d5e486f538088306c1a39bccd5bde58b29b91eaa5cf5b9e00540a51e7ece74011f9134f58822c74e2b2a36ec7ad4a872c234e3a2d123c419117cba255f91146e6f49ad3450ac2336a2cb0f9ab9221232541a17266845b8a2971f3c4406e518626fe2220022e28543769b206f0f302d15b60ff8419c0647acd8af86b212765ceeecac4c5646e1093256535af0214804fe525d868b272c12141952f780117769823a2d350a341d50b25b4adde0839b3e4efa4c20322a12b9cc5db853455327e25c401a42676fa188e7071a655bf010c3565821a6aca2c30e05051a56996267805610a3a10e383afc4499606448c28f9055820ad5ee1496a11db65cc20e013b26338698a7dd1d3b39bc2ca8c26894763c3e85eab5490088c0e30da9948c25f380c7104ea49a8d06388f351e5c349bb3413426d098e69e08c1a441a2d1909728202a3345e79e32448a04dfa05bd0c1a4468d9b0174043e753ed6c070234ca02e89047912b8210ce3c10bec2a4d4d682754433d182b642592b0c7c411dd03bcadba43153a98320316aa4e801e07dc10c5a1499d4715c58010301ed58dd909c289419a92190209b080e2d1a59dfbc09746dd69c36a0680c7ab4dc02252663a2687e41c9068c20cc211a4555224a8f8a33c207043489eff74bc7e97c9ead33ff20249162a41a2be9b24476e7338d7cfb0c628094d0a9aac298f2a4ceb84553640001b331e4c34e4e3cb1557bec993d3e4ac31559598f04bac00261a35ce5ab88ac9bcc973b1a5ee8c8b5202b03320099fb86c48dccb498ca298c1798605f5a90cbc08de02a2c32b4efd11fce170d282a417009b5e82418e54bd4927f840656863527240f25406a9795804c9f33950f9117d1e89b027f0137c40bd4362030b56304f70899b9adf12126e827165683cf912872ac82101bad7d01c07809e2c5db2830034057c838113a9b237248042a08cc9a023d40d542b1a396ec28303b8e392da8c0b9ee886ec28a0019abc3a5a8776e40c6690052941dad162070430c40699bc968e4744e8da385f461d606635643ad8fcd1c1430526b52b9b883a523a1ddd50b1510cfc98a3d0a52f505a7138725c19a276c78c12901cfe047325d15a99c3441b0e0814e4f824875481830f1718727f3a61c101850cad0e8a085070d0c001e286a84930031c645e6ecce9d2c002011372c3c879a3ed060631a2fe7081616123930d3666272cdc49596323cf061a1f1b15d41a926a8ca961d770ed6a2c2045b7080a9d164c743211ba9246043400c1285f04b2e28a06151a38b4688838e44a852aa9c20c534543b2892d1633eecc501247aa523083981932289dbaf0c6c5a719739d2a65a859a1ca3177c0da1a1156fc04990b32f742f8248ecb26624ecb0e041d828a1de42c41608425bd89e5ccbcc9e113e456b081c2e601bf46ee01589c230e715fe2e8b834aecb20e443869541328244192570f4e43098f1032e15dc1e382740b819701fb4bc857a9373e1adc81bdb9b5b26373513dcf054b89dc96e14da22b58969abdbda37050db06095aa4dc14d2f993d1536451c8c658a5c34b065618bd94ec46015e3cf568c2905c4b86116032c118c5230ecc048024386860a8084c803c058e384afb9c9b10664cdc51a9b5aa5a31a015eedf6a4a6a28c9a83178d5e787921d4f40275e1cac5201701607001742106ea45f5ee799b60bd73ea4b5249039516278d485a8c343406d0d2a0dda199a14d38837426e68c78c69e6181019288107d2c9190c45a8bcc7e4888ace2e187899416365a80b128d57b3f5163f94b42f6dec9b1daf629f913ec0f3829419359f7cbf7c7e9981e16f33ed158ffa227e2fd3aa76ba32f099e4e260193c7fef6c23809912099d7b42df7de83e4fdeb7e5ed349e492c008068ffebefd04bdf724e8bd1701abde7ba6f0b62948ce1ca9d4ef1b48c82ecc7df1c4312f450a8f2385b92f92c3a1595959ef21ee236a4616a048f381c11c236d914144800c0955feca0c7022b88942031297c7805907c91cc9daf283e2a6c1253692114155a30d4e38c983174047f20862c0442d91dc9e1f6f2641e01583d16a0e17101d48b8430510fbb18a2b85991d009452e06408c1448ebc0f2722c82a93705a61834b8de7118836c12f2883bc3ca508d32a075990081c58d0364f61a005179d566ef25a1e5730dd4a268e42919e15402b497065aebe86bc5547f24803cc5f4ae0536fa860796002d59e4673504aa8e86adfc472e4798e68e8a8ab8006c21d398b952407344d0916e0db14777f0803cbd12086e342eba957e148035070aaa205745d760c488b20ae6e85a2f60ebe83c5aac6078b5834c84cd4c9227825d5a6573b4a695894a2480bfad8c0ab4e8ad4234386be2eb428eb663b8246fd016c40419342cc0fdfa15349420dfa620a14030ca8986be54668c30f0f29d4e4e886340a7a12dcf96dca2f0ce25428c494304d78b0ea26b8a2874309ad3219b51105ecbc11daa22446f30a06130e25346c5a2065ca9033ab223158e0a751c030a769c3a25b815776826a16b801c52592169a37182d7030a0c5772aa5800f9320470e9662a0e90160495120c1eb0b170a57a260d8948249376e29c3e501036c4022a191b4b5a195ab45950173da38f81a83458bd456072b8372884161b3e14546d5102c54060f19f01ab4f9a002022606e00095e2c00493d75615bb3d5f58507cb54d624fc170d4c987073835f31453ab4a5c103bd561010f914a7851a0410747158889ef4e182721432ecd71454813c84f8976386902724e96990d2deb41133b4573ac4a19507e8d1d4315572f33672e322c81a08d93971f1f39d274cac3952491171f0d769099f342d1950ba44215cab293e0468236861c560d58a0c9d3432a81afb44b474c00f09a8a52fc960078d5094497824e584d54308a2201800e3022bd0ae596a528945a86659224082adc2470d4d244c257a7f7832a1b3b46184f18211596ea8c565792051ac65e084952028a508f9caa3a677cec0a24c4f0b33354905a2cb0f2721a9e3809b66b6a04460d4ac3bca46079b80001051132ba27861e70fdc8bd28b385cd076682d9891a1b120e4f5b182201a262432a28029e0f362726145518c2e580ec7761ca17145506a9404183c58a43590cf220a04581edc41930e50469af7e71022339cb864c5b4372b4480061b2886163e0cdc10d0c1ace0ee580a077e6698ddb184ff7504d0b885a84b1a34e5887eede50278c06180e01307983a62c93e3d0b321023e93c0500c059489cd9d9a3365edb719b485ab013f5a0e0cfa90d587558bb2397bc000c9ba83d561ad45eac90b0e2daaa0d4d58d79a2d2254399163fa28418c006382689a810a272215b3017973ce708115e6f5e681c093145f6a0608e4c82234514380e10a014a34644c2645074f7e404171b842e84e5ed31436980af2d054c888112840bcc024a0475256b6a5d1ef85ce2e1c3db19a015991e03148d2d4078d5711a35c8ed97493e12a56bc41fd48d4bae430d302b9e7c82a357e0c5ad527a649d0959c3e60a921cbee48f99016211e54b41ab4c5c854a254952a65eb33ef86db814b972c37bb08707231922e876103b8cc822e04ba8429cef4c322343cb4da94da1bec63cba046740844025cab82179f3f4484dd79ba521b81e148ceeccb915e01e2cd1f04d7073f67915573801089522296c6eb434bc28028a51162f41bc52d8e1740097db91ae468966e43e32c85ce5152451eecaac3e630f4b100cda3a8276c3b74ada018a8a06521b04a023208997466271c00090d118b95043539a63dc82211596fce1a00214082c1f26392004e58b7e19976ee36aee536fc3007916dc7344c4844965f4d46a8e00fa42a672118e3b446e9e54515122a3d199d372030007028c504609d08c17395c02b8e300e347a8084c34628a5a2698606474f260a80935b1828a4991536bc6dc384217c895961e0761d02070b4458c2e4e262c355f4c0eaeee2d5f4cc551a1a4a709dd05932b39185cf5b9e005002533995e85f910e3ebefd83ad3057c44ca242a8e96363829ba3870ea20c74e2b2a36ecb866f4e972606c940028325439619a71cd28608174013a3a1169136c9d11c1a75bf2cdb9f1c3494b0d8745843ce0f696d4caa725461c3de080e9049c3b2fb1115d7ed0c87dd952a98110b60720f8c345864ae3c2e4acd385352f868a7d800ab2be662c0ae22aea9057c6c90640c8a6c0cb0f1e22837208c132e28f18b62e5c0d232e2e0220225e30a4c683823810d0f42965262bc8db034c2b459303681d616608f728f9821fc46970c48a852394086181304b237469282b61c7e5ee56a4c941fa29150b9395c9ca283c414c489910e78b0e25533eb86958f0214804fe528c174c5c4d108188bad6c5c51316098a0cb187c42c84c4f412617c30e22e4d50a7454429ba35b50674469b06341d50b23bca982f1199d6007518a5e9c207377d9cf49110870d92380e16717af2c907278a8a2291fde749171d5f26c9486167c3dc853b55347572f00eba72684a9108fc5c28200da1b3b750ee0230789026f5aed05a1f68946dc1415851f026002db55eda1c07ac105356d161e55c0f32e428b0058c120c69032d02b1025489ec0033807c64ead4486b8a9d015a418c8098c25187c7a038498c1ce0e8f0136582116f640cc7021448a11885c18f9055820af52b51134d19248820f4640bcbd00e5b2ef14352fde6c2965143e8c0638156431aa001ee6923245206236b6732cc18629e76778620b2f14acb47ef91922dbc2ca8c2689cd0d283eb508541bdbb461e44f051424029b63038a3b66028b0c5145c8650bd36090010ec94a861c1e602c287c216a9948c25e360d0074c136a582a07287ae044aad968702ba0e810a6283f3825dcbc907839f26127858b0015447a20000193155c349bb3413426642171d56fbc3201e6cc9a7b2204930609ef92a5ab1d02d129ca17798902a2b252742618314fc2c44682c1e52943a448f00d32019278e82232a60645161d4c6ad4b8b171b2c0224e680e956a42e88b4f9d8f3530da2c60baa548fbf17557a1ab2e89047912b811e30699560aaeb0f923c9e7c10bec2a4d2d85da91565cf0f428c0a4e117625b9551206be1e844504f96066857a8076385ac44a2abb360e3ebc4b400021f1347740ff0b4d4c4dd6bd848f1ea426543850ea6cc80815a033707080c21526023177a1c70431407264e086055a2c872c7517da8a21810028623311ec8f69c58133645d5063b413831484bb2c8cc84c8ab8b021c3d1724c0028a471756013e4654ac41d343c7d7822f8dbad386d58f5eea0a8cc90d371d38f078b50958448a09f5830060269580d30a039343720e483401c4144f69de3070c74f2b2d479056499190e2132eaa490e3802ac72070f08dc1092e771516bce58990be1a42c83d7ef3259799252ca89036877461e49b0f50249162a41a2f0110938e1b2435116a10e921cb9cde15ba17acc401340a14d9ece645863948426050d041fdf0cb407733cd8d9caa30ad33a418d5367e6c32202d9ac7810c0c68c07d30c5212b6b8f150cbe26389d7cb1557bec17bc036a0c728304709be70b168f9a93e81704081824344db0fee9435a6aa12137a3160cc18201c22d578ebe08589468db316ad3835fa3236c1933d42b070bdc973b1a5ce447266085d69233ab5b2a404606740123eab03a79a117a22e138fb1a12f7721293080135195b3dce074c74e93acfb0a03e95f90dcc9ced4915a5098cac547240522412b8461e8403ec9010e68106101d5e71ea8ee01cf97989526b4b8b2e389cb420e905e85041f9993b75d685c8a703898f457d49903f7714e189f5d244d030c891aa37a9840988ac6298a2a42e8077a10c6d4c4a0e48f113324838bafeb861e51ba4e6611124ef4dcc135f26bc4551821bf0263f43129c3aa04b9ab7457ae060e85de8f348843d419f543048e1146631353d2df50e890d2c583a12809223029d0f34ea3880a02b0b33d50526e582159a3d2a9d040c6e6a7e4b48b8d1f0c0971f0854c7a5145a65683cf91287ea028e039eb84911c256724880ee35344754a92a735e1843caa3270c962ed9410096da6304f208f3ca86041eb630702255f68644d7c16994a7573f4eb075803226838e503d06380129c60443ab62acc9503472dc84e706037a1610531c4306816e0b00f5072780015faf38b9ed31e28478c983da8c0b9ee88450d1526faa63d132bdf26a8026af8e9621336b1e808babc2254e162e0633c8829420794000076e3cbba06a4dd68234b0362069d8b2ac8995d8f25631e50586d82093d7e21a41c998b5ca9651848b085d1be72baf142ad31f0a0140314bb36635643ad8f8d144ea13974805a8e8aabe546052bbb269f8a5538b081e38e3b78071b96a6bb0001c8d4e32105d89e2c057a62359868a8d62e07974cc7aa4dd746a71d6af4b5fa0b4e26eec11c629837b6286098dae216a77cc28fd40444e910017238aa8e53bc15c49b47622525b0b42626f219c1835204941683ac3f6844da20a67847c411b7541418e4f724815299e489250c7152745a67c5c60c8fde984251eb395c28aa15013f86c2043ab8322c293465e9290d9b9b4800f45179c70b17202c5980a9c58ba416f32c02cb41e0441ab3181911b8ed55683546b34fc0d93600638c8ba1c81c3878e04106caaa4c0d0a581050226044b552ff8e0d39333a5169e1aab9283b96515a24e442590c8111c9e9849e535e80d880ac8984c3d68688984418ca83f5c60580c81a0d0863824f27e6c697dca43a3f13a34031f5c5015176850a50e66272cdc495953cc32c1d4933964f20032a422caacba4d8dc014e106a4b123538c5b394085220bdb13aa536d802fcf4ac14407097c796a66a99a319b62bc5d09a1969661d0a44060d21221e4c0a56081c6081876cb51a69688d89d37401326787567cb1ba0873a34aa7e0688adfef1fbab587570e5e53f4ce92a8f314fae2030278220a72c5c6d707054c7a80652e0190ae43d75d8ca5a2196aa8f9b270e10626533f2242a8305af56164875f9742953a53e6c4726a839c5c655081f81c181219fda6c290a2195ea33262b4c2a3a5b60b3dc1e20361cc8dbb345ce17173c36e894a9884314809fae289d55882e18e58b40565a518a54807001096804467c0f467c699465e8828b0fa41b315224d8a2a1858a4347dc7c7954f41035b0c0ab4a95ae43ae54a8922a94adb64820177119cf7c4543b289ad1500603120c5578b2c1d8934784ae328af43212022388d4170a8d304412ec491aa14cc106682501cf25451914480423e4aa72ebc71e1a915934d58ce986c9a043604d0c1099d1ef80933a21ebcc8036a985ca894a166852a870844a63e04bd28a5885a6b6b4458f1032494041248fe249270ca0987333662967cf9a52d50264c992617717818844fe2b86c22147092d136280e234a55b4ec40d021a8c881cb9c7c4599890a6b671c2030c292dec0566ad46925b6409033051856e9f8b426879ba52d41adee649053455b64181ca00b2261930547267c6cc08f021dd84061f3805703c64bc6a72e522a0da5647832464f985b88372f723b1808582b756f8969e0d791b441ca50875793c4c1a9281eec2c4010b3212806a62b34d7830974367981b88976d8b81088e02d4173c708e2c0a5210a023f5382ca108d0d554172da4d59172418aac1677822429352261a9808caf1c273290d1ff5b8c9520144d220a541548a0b8b178db4842050304675562b84041259790cf8fccc18deb1c10eada2f496c2c3178e9e1c06337c001212e605aa2a19826757d700ab16a4c16c96220d7498adf1e293b54057006b170dc03529030c7579d8a45f139092514a821daf7e28a99f28702208d9854504251227869c84da1a36a6070a11f1bd733225d193251531d09a116d521ecc1ac4e85994c02b1c20d65430002993103cd2050d87ccf8b474c57120c349f3e98b1d7d0640125581cba7e3cb113f78ea805a626503db93adb53a71e02c8d1a099262a98c9d0b63c4181f59a1a2618dd138c431cc19a4b5a1882a4b6866d6e8a894c813762990bb21021aca1557c219281af0ae543821f5c1f0b303c992a0144a200101a2e9d1e7156a3d199466d397f88baf95d70c1289ba38c0414deea22ccb17b9012ba9664c0842e807863c628c06f9f0e2b0048d0e4b63b03c82b55adda9e04af00246a3516e846c38dec5e900ffd12465d5ed9311e41321416179486dddf492d94f6123eae80481004c71f81e3818cb14b97cb9f191c3578a822301a40c9b767038d5a6ebc6a035333768a83ab1c056039b36f53995a606a64c94da5b05ca011e2a85a917d0219af51d2e263d00e5438e579036535d827475a8902f5c8e460daac225afb8b1a94d8b4e2a579cd0a089209a65c19999e0549c0940d5ab0e1f14c9004bbfbc1ae0e135410b517a5c09c045c827d7012e069630e12284c8097a6a5d30244a02b02c38c3a1a57ac5833054945ebbd420505f765e705d095252a83057e5c19b2f4a595dbed19da5567b22f4b06406468a9a012d7c1a2a0012226b0983ca4daf8d05d146d7b043c883426552e82545b6b0311458965ef37ff7bbde6d7dd97ed6a342d6fcebd99a396e0b8167ba04abd21bb3eb0cff169d61b884d5d8a5f4b2f3acaa326baaf3accea6da4e6a55f42cdd5445dbf33457143557b535d7538de734565d8fbab1abc09bce732ccba5099f311cfb5295f49e70fc630fc7a569c228acc291de793e57d9fd2bfa59133ee314d2dba61f9dd39945bffb4bd434896025f0aeb17bcaf367e1d595cfb98dd9920ed6a3773e51b36cd51fc766c9c2def5b94ffbfd4c1368b2281e2c472f3cfbd5c3b1877fc99ea99f5b530e56a3b7553fccbab359ca68caa632d81c1bd801588c5e753e659fc6aa29c76e6068271bac459f7567744657365e4b595584966c9ab6686ba6ae79aaaa89a2ab6cceb3f76979ce7e2dcf19889aef1ac44af4b2ecda9ea979fa765dd7324611bd6be9d9ef9ae787d33595517fe86de7149dfd6f65592ed995f58265e895cb159dcf196de5149e5175fdfd80667aa2c12af4a6aeea598fa6f0a9965ffd6ad926c122f4c6721ba7ed0caf6d7cc2abc9dac01af4ca6b2acfab4fd9725dd7198e05bde859ae6bbbae6ddaae65ec57ac402c9b9aa679a2a65baa2adab6ae5bfad94453544d5bd95c67338d8105e85d4b336dd755feb3eadb55867fbf1668a2a7db0d600f0bd69fd78cd352964db485ddbfc2288ce547f631ebcfefb26cac9a6c9fd89ce5133ed1f884ff8fddcf474dcfb2544dd56c4d545dddd235ddb2857db9aaa769ce5f8eb560ed79d1742d515896e5d29463ef4b216bba009b6303c359330d4bcffb61f72ce5d697253cb7b279b2e6222c045e54fef247bf8bc2e5e963d72d4d285879de734e4b7865dbd5abad8c85e7755d369effe93febcaf1c9ca4214c6baf39aaafacbb22d5bb48ce5d845edbceadcc6f0f7b06ba2685bc6e5eff7fb01cdf611569df75c67d37f1895d9effe5335cfc0d0c0ccc0e0d85223169dd765cbd385cd3476bd6ac2abbace31d1525dd9164dd995355b955d51d65ccd9995e1bfb2701acf2c7b62c979cdbfc22b7ab6ee699aec19c371ded584cdf934e3b62dd9d24de99a06025736b3b337b617eb8c05e7655d573d5d9faa6aaac63f8655ac37ef5fd3d4cf2b5c9ef201af3ba770e9a6fe8c67d52d5337ef59a62e7cb2de8d4d9755e7b4cdfbbfff69599a320afb198d55216b0e87b49d8b16c132e095d9964d51346e63768e55d73c7d60b179db143d3fbca26959a25f76597ccd0ba3f22fe3557661f864d952cdeb4dd4976c2ab7706ccaa5baa6797dec55d397a98bbadeafe717b2a679c442f3ae1f567f19b730dbba6abcae42d6447f6015f0c6a8eacd5646ff9fd916854f216b96681ed69997f5281a9beb97d1b5f5a579da5866de123ecd5695573865d5f44c5d21016fea9e260ac7f1caa2b119cba67ae258655e3faf2e1bfb8faea99751d8b6c9bcb397d5d49c510fcb298c9e3db0c6bc72dbce29babaa88ccab3d99a625e774561949d53d8745118768958615e5536539945cb355e61f9cf701d98b7347d89ce338cc2f30c9fa989af3cb0bebc9ff53e755b9645dd5976e7f9dfb82d644d3b2c2fafa9a22ecaceecaab2decf3ef7f2999aa9796375795757954f1586d17946e7994d85aca9f6fbb526da1b85c5e54ddd15f6a76cc631aca6a5ca0ef1db6c35b7b433dab2feafe7acc2a7470790ffdaa2a667e1b82ce3f684b5ace5e9ae6a5bb6e589a6656b9e695bca698a96a7599aaefc3f8a95e56de3d344bfcaa6a74f51f67f216bba88036bcf155858de586553b85d571846d592fdfef763ef7e3fd3049aecdde96209f09a2cccc2a559b625acb25f8e5dc40043035373d33758575e38864f59554d7936671995e52fdb6e6e69a6c0b2f2ae1f85bd2f4d14655b987565bb46cd2fdb6e698b15c0eb67d96d4bdf96f059c6a6e9dab96a96a6195615f357635179d33866ff3aaf685996aadab242763561d408f6fbc1aa110c35cb604d79d5f27f184dcb5985d9138e552971297b7366e1553dd9f83c53217bff2f8c3d5a3de3f74313e25e0dadad64d30555b0a2bce609b7adcbae1f8ecb1566cf740d0b8057453f3c7fb385591fa3ec3c4379e13335e134f53e2e5317f529d693df9ea53fdb9875f136129693763d51184e5bb375bd0aff3a54ed2c4d887bb5df0f968142dc0b5f556d84d5e4f5707ace69ccc6719cc62dabf643035303430393039b63033bfbfdc460317967f6c72dccaa6c1bcba9cab24b5e359559539ecd745efde9d1341d62294151d46551d6355df374cbf2745df44c5d7fcae899b2aee97ab5df0f6c8ecd64efbc8895e46d637776619895675376db7468cfc0e39db7716068606bb5512817d3bf1fee5700b090bc2a8bb2672c7bf9af66cbce6aaddb0de01dd691775ecfb63d57ef4fb934e5ff7dd0b869b26e37802e96915776fff9dd7fc6708aa2ed590a59b0b91760bf5ffce5dfef67964ab08abcdf84d7d5972bbbc6ab6b9e2ab0b669f5c422f2ba2b2ba369bbc6b077d3d2cf4216589af96de3e9abb77467f69ccdf2a3303bab6debea5dbffacf34966136465b38455bbde8ba9eeb3affd597adeac645fb4efbfd8af62dbbaedb0d60af486f02f64c4bd33c53d74dd73555cf744ddb768ee1d394e332f5f28a0a59d3880351d74c4f82379e577955dbf8f4b1fa4fd4c3c5c1b18181cdb19911bc6beaaab077d7f65cd3f264d5faf773da0518dabc96c7e699a5c7ea354b564d67734d67d62dbf9bfe7e454f2c4d2fbd55ef5aaee857cf798d5bb72ccf53ceb4d453f5ae25caa6e92997e78fdbd99c7fbfdf2f358126a81e04af3a7bd594d5d385d1754dbd2c644da08926e9a57ad9d6457d9ac2e8bcfad4fdb290355b233d54af3ccff3e97a964d4b8fcaa82b644d201aa477ea4de5f5fcffc7260a97b22fbf903581eed93bd27be02de51556d9354ddb58365b592d4f53ef29c72e0cab2b9cca7e5de1b9d41bcbeaca96e7874d339ed92f0365ffefd22c4f1325f59aa559b26c0bcba5fbcfd9bb42d644eb8d7a539fa6e9f955337653b7fcbf25f61c78615745cbb45d63557655d397763d51effff28cbab3673f8aae2a2c0b597335db7aa1de358d5db4655378fde53f4b2f644df9d7783650f6f6f0f7cb7fddef0736f7e2d3f7dcef078606a69e36de9c49e3f71bfe7eab822d3d506fdb7af4ab29fce15f9ee93c37f09ea6a9aa693bc3f34759399dff6dc4ed610c6c4f60d108b4b3ed217b82cdbd0093018606c60636c706c6e6c232eb760378d7fbf4ce6dbaae2afb51375dd3d49f42d604935923189116e2bf3b3098358295e98d9ea7d79f65ac9afebb9f754f181dfa38ad5d9c66afd39baebe44dbf89c5b553ecb325e2b4d604f4d8fd3dbfadfcebf9465f9c3f1fcd94d2fdca2269cae2ebb9a721a975ed3dbc25e9561af9ebf8c4dd4ceebb5dffdf335a27dbb887f51eef763d135bd4c2f8c9e67ec57d555e3d9abac2c644d7bae7fbff8dffd7ebf9fcae2c322915681a5e97603d823d263e085d7969565749557b85c57d70b59b3fe4360fcef5c5305025b13d3abca28dbc2a6ec65d36cdbf85f7ae7193667975dcd1fb3a6cafe055ed52ddd1335bd2c97f12cbbb2a557f5e57ca26a79ae72a537657fccca739ba230ea9a3ea6f4a2abe9d5522ecf339ef49e72bbb2eed9b2a72acbf18715785bb585539485d3ef25bd71e9d75685e7352e5b585523bd2c2cafb03bbbf069a2688aba90de734edd338ed176363ddbb66d026f8c9ef0cac6f2c9962cdbceeca3d74dd7b48cbfdcfe582de37475f496e5874fb78c65f79fee3fd5466fabc67039bbf05fcd5295cf94d1fbd75976d9afae65dcb2b08c2e7a67b33d55cfba68ebca6cec2a7a59352dcd1575cdb845fd8a9e895e773d63d43567d9544f739d11bd2aaa7e562dd315f670a97af3d08bb6303cafae47e5f8a3ac30a7f152b0b917c71f83355dd434f496b3ac7e353dddd89fb1eae542af7751b434e718febe644dd5468fd0fbe7f38ce57295d7d4ab3f9607bdb03a7b1fc36a6cca72abc6aba0f794ddefcf394de1d66c7faa067adb585d4b734d4f758de3536601bd710c9fa88cc26979b67159d3c09f7bd3fc839a258ab2295a966c6abae7aa962b5aca250b9730eca6e969ce3d3f6fbbaaa6cbcafe97ac6f7d3b0b59f3ceae5d29f5fabcee5753d8fdbe3cd338fd7776c0d9ff21303569c450cf15518fcffb59b684e7d3a3ff5463532d5db0b9176bf75bcb9a6b0f82de9eb74d7febe7f36463d994d93816b226d0965b1d3d3d2f7c9e7e85bfebd9d8355bef85acf9ebe40f544fbb87c0ab7ed69ff24759d3fb336ebf9035d7b997e745bf9a96deb77e4ddb58fda5903587fee738d06e688455136ceec51c1b589ef7f3da46abab6917cfeb51f844db999d5373455b34bef39ee5b99af33f65535ee50fab42d6acab81abf9ebe4176cee05d8ec3f1b1a180d3034b018606860b9b1edf7bbbfdded89f38ffbb2edf6fbfd7e3fb5d23cbf6cd7a96a9a585c7a76deb85c53143e5d35454f74f6729d376555186565d65d59933de76fa4f3c2aa6cc2aea9cae88c9af147e7bce8ccfa7fb2ff6c5d2fb3dec33d39ef6f53afba2bfbe1b88d57f59bbe17a78cd9364e537855bfe9cea59035d3952d126914460fcebb9e285ba2a9d9caea8ca672f9e6354d192ed7d89b70e963795dd3035e136ee33875d3d6bbf3d9fad9cd8bfa96fde88f513755cd0fbb6ddeb5fce6397b3f7f582de7b934e0fdae39c373799af03cb7adccb279d5d695bd7ca67f2e4b3565d5352f0c97738cb6310ba7b1eaaa7f35d5bcaabcfa189dcf725567d85de36271469af7fb15fd2e1b7b16354df65cf3bedafdf16c36a2b146d1bc698bba5e35cd8fce32dccaf01cec15f0c26969a2f0acb2f0baa6ae8b9ac2de9957756513fe71e9ca25eb539f9a79d1b235ddf2a366ea12f07e597651d8c73e9d4d375d5b216bb660732fc0d2959623dab78bdf0fcf697fe7bfdf9de375bd326fcbaa7f7557d42ccdb23c4b95cc2bb33efd739baea9c9ba3f5581aeda1bf3fa9faea5fc6394855756c5fb357a7fb93b97334df6ce7154ccfb6354fe73da7ad5af6d1ac342d66ce7dce8e2f9fdef6a3b6eef1c47d15e98f7a73f3ed1b62dd7f4cba50b03eb3f64cd63d18e5530593582cd81c1aa11cc3d7f0fcc6bfed46451799ed7dfba287a9e2d7a5f5e564665556de7d27561343de135ade7e5fd738caeeb9caa6e0a9b6c790253f316c6c44f5cdd5e97d7454f6fae29dccab2bba62dcce56ddd158de718f665ac9e5f3ebd70cbdbcaf30ac368fa51d44dd95ff6067859dfa66a599eebccce6e7bb2ab79e738dad3f2aeb11c9bbf745b948dbd47d11ccff27a1435651395e71956fd6a9a43db86b1bcab39c7312ccf6639ff566555d5ed0670474f80d754557fb2a6c9aa730cafa7a787a579e5954b578e7d0b9b2d5ccefec7a8959785573f973ffdb1fb53f42ccf00de386561d364e7524e4bf7a7feacf29ead974b75feb0e99aa93b7f216b9a26dba3f2a6299ba6e7d9aeae3afb765dd129ef0a97adeba2a92b9b2aebe3f694f2badf6cd71536bf5fd7543e5d20703da3bca809bbabbbfe1646cfbfc22500efecddb46557784dbf1ccb6999f6a0bc31dcaefe9451d39ba537d7d63c7b4f5ed5744b984d4f574657f4647d11fdf59cbca68c966cbcce1e4e4dd99fbd266f9ca6a9c9aedfafaac9bae8ed85311068cba9a9de39bef698bcec39cf6969a67f66e17ffeb3b7e445d9d49f2abaaea5699a251b0b5973e8efba9fd7f4d9f6949826ba962b2cafa8cc7af6b342d66c4fd308cc8973db4bf2baec7ac227dccef03cb3679cb6a709ec2149e5b26c5df6c3e6f95dafa6ab11f8f1db17dd7a475ed5fddffdf2fad1f4c76cca9ea85acfc80bfb36fdaa7aceaee953349d85ac89e7b72f02e59f03655f74cdfbe72e8b5e9177567f19c76be9ff797e579e6b9b48b463e0d01369f754df1e91f78c5513455b783ecbf5ffd2e738cde60e79d5196557d54de7169e5defa642d63cde79fdd5fcb7ad9077565775fdec7996e7bccea72a64cd354590579ecdbffa962d4bf39b259cfe61d1385702794d5666d5336d53796ed5599533cd3627cee88fb78de73996cfefbaae8ba2e849fb7857563edb585e4fb6655777fd3f2f7ad94cf670bf1f7effbae33bb7de8d5776656318455b735dcfbcf784d3ff6338553ffc5b7536cd5cd5ed06b006deebbf7767f6c3ae5f631376d5f3eef5315bc668ebca6efa61549d5dd3f89e266cc2ed3fd7f8ab71c9aa724de3d546bbce5f5566bd09a71e86610fab686bcff55a4cd71eeef7b3e79a06b26e3780337eae72bbfa798e63176e677975110796c6f7eb96ec09cb28eaaef21a9f6d8fd74dff2ab772cbb2717cb2b08c9aeb597cd9b2fc27ec3d3ac3dffc302a6481387d9aaefdc62c9acea8373feaa22dacca42d65c65a0bfeb54f334d9fa2dd539f66529c7a7f9dbd3c342d6ccf33e10b89e387b7ba11cf185d3769e4fd635d515feb09c0a591358a266c3b7456318f6ffb3e6373f8ac242d6943f10789ec3e18f53bb17fe3e55cd563563f9a7a54757b71bc01c3cde2faf2e8ba26e69aaa89cb6fef71b0e7f6c837e59efd5567567cfaea8aacaae9035651af88bc7fc589bfd7ec7dacfada8db0de02b7cdd5835cbd69d4beffeb88dcf3c79adaef671bfdfef87176d9375bb0194eb5ed69cfd97bd2c97b0fad93416b2a63a629ed1b44de39545d1b4fc6eeb83c68d60736c60bf9f7d7f1fb55dff7e4463cdb26e37803d245f4e59338e631865dbd3a7ec5aaa77f2eb9abf9ce75fc2336bcaaaebcd7ebfdf9d17dbd5ed06d0c72fcbaa73fce11246d3f53c65b6845fd5fbd4f567ecaaeb699ead7ca2c6532d12699468acd19c38c3fe4c5134754db5354bd34dddd23d4b139e5bd52c3d0ab3ea5ccead9035539368ac83af997ab8fd268aa2695caaa7197f1968e740d604beb33bfbef5df5a72a1b97f02c644db936da3730b5b1e395558fa6ad9afe7835e5d297ab8ed72dcff4645bd6cb2a7a9a5ecdf19ab2873f9c7e552dd3563667216be6451be89a469cbeeb54361cefda96ed69fe329efddcb279ecf3be8b1baf3aa3fe8cd3b835cff99fec2a644d75ccc6aba6f0d99ea75cceae3cc7722c64cdb3756bbcfeb3be5d53ff65f7ab1fc5bf6aaed1bd6ae9bfe9fa9365bd7bae6b29644de0d0482ccd32cd3bd13afaac5d89c61a4d41e355e7359d4bd9544bd6953f9c0a59136fcdba9ab67367bc691cafb39cb26df9d79fb6b29035eb3f94eb0f4c4f559d7b5dd4bb686a9a2e2aab320a9742d62c4d3cbb081c1a89eedab244637d26f7b6a9dbaa289ba6e6899eabdbbe887bd57495cbdfbaf22f5136feb217aae79d1751c878cd5445d7d8b36d7ab2ed29b342d6fc716d0387431fbb3faedf6a176b8b17ed32b8d797e87c96295bba6c1bc36c39ff38fce7c7b319ac3c8dc3229166d73a23fce5e2dbcba265bccef32fe3d8f4697edbb00fe1e696adec59d5a7f39cc627da9a2fdad8145ee35966d5f83c6515fd42d65c632bcdb884e1164d5bd34d65f534d562bcbffddecb6eeca6693bc3ade99a2d8c373ecdf8abe93abb3f4e61b314b2a66c97adbdadfa557936e5b25ccd2fb3b32cdb6a2fcbaa5efea52a7b19354df52c4ff7c5bbb62cabbab08cce288c9ee92a64cd61914803e57f7b21deb22ede723e5b745dd1b86d51385edbf344f1bee7b9c2de84e7d84c4ff6b3339ecdae69efacce30fb55d34c6576fda9afffdd07da44fb2e9a6719da1ccbad1babb3caaaf239fb55c89a45fb96cd17676fea9ea9ec633346fd6acef22a64ed1c3dcd52b3744fb335cdd35ccb9335dbefba706cc6b16ba62a2a9f3330a6739fe3a7a9badd00aab58059bce89fe7efa2b15acee67aa22add8a77865536f6ac6759ef57168e85ac69e7350d34cdb555713875bb012c55bc66ebaaa81bb32dfc57f97f53c89a38defedb46bb3d0df82c35d714efda7e598567d9454d176581a839cf36d05dcdf8dfa128de162dff7aa2aeabae9ef5ad1adffe44e3fa88a76965ec57e5f69be919a7be3c65216bdebe348f6e5bce6999aee7ccb230cacaab9035ef1c6f55b71b40bcf635d533feb2bb9ef399aaea1a0b5953059b7b01f66b7b88f6fbfdda1ec6e5ea760388837d673fc7edf9e5d484ddd397ad90358179361cdfee19df278bf5f566a996a83ba76b1cbbbf6485ac093ccd79cd8933baaa44db060ee51b088490beb1e99a687ab2e557d1129d53216b0a71631178dbf36ab2a16ff9e5f9affe9b3f6d57f8bb42d604b2edf9b2ac2baf5f2dd51696e5137685acd99aacf9baf1aafed697a5db9aed6aaa42d6c4b3ef3aa079966f8a7a352d53f6c7ae9b9a6b2a644da02d9b270b36f702cc0c0c0d6c0e6c8e0d2cfe34f07c9c6bc6ff0e88e76f5675bb01b471028d4d3455d7b22dcf52f6fffcfddcd5ed0610c82f3de356354d5556e5942d4b13ad33c23f0df760e56904a2aadb0de0900c35e7b66459b6744f56f6e6fafbfd7e673a8fa57e95cbb5657f09ffd64d65216b82cdbd00fbfd72e2fcfbfddb8ec1e6d8c080350d2cdab7cca2775ef42652d4355dd74d5dd63cd5f6444bb4357fc4bbe1f0f7c26e3aa3a9bbce30fb4d394585ac991367a0fb73faa65373e28cfedb8e53b71b40182580b8f10602bfc44c10611c4800639c268e2821022dc14884080311f6618c24e1a144879203506c03b183860d5f799ee8c1cb04da43605d4dd7d505a075a8b40f0ac7991e0541a590218620c9660000a000c311003038241c0d07e441e998bcdb1414800264ae749a4819ca834912a4300819641021081000000102032336350e64db8eec9d5fcdbfbfa3ecd99b31b5ff07c3269b35b7865bbd1a7aac3fb35f016e87b12bd3c55619e7938a3412b5e2cb74e375130be5ef87e334e97d1edc3eef00fa47bbc77ddf9c6c91fc1bf3ce92e0de3fb9f2a1f2bd4dc619e9d593ad0406ebe6a0f3d9b7ceb8e8b175355ca6d471795c5bb967926de85e07eea007ee78cb0fdf80ac5f43838faf0cbea59d12829341b88f981302b95d3155ef44b1638fbbc3a64d297e90e1e6be4ab005f15697450529377d95c9253fcc72463a7baf66c0cdda9e0eb3238638fcf76c447cab94792bb31a759b18f8257acb9512bb25567bc4706c65f98e8e1cb2ded522bbf598c647e1085db049cd18380c07c79f41d317d7f0096a6cd55d041c7aa27bd9aafdfd3151df2529999618ec065d07e6f0f7249be2b42ddda130bbf5c65abec67245f2e086aac08bf4c79485e120dd00c3f758f03ec81b65d244f44024b729a1cf67f38088ea394db064edf56b0be94d62deacc2aada8ea3b6216e2e79752edd689e5951f36e9ed8e4a2cc41e0c7e4db7abb53d189886717e0e21dff79b68452cce9f558f58a7e1d4b79a334a61a9b024ebc3136e0bd56a9eebd7a7f182ecd4d36c457c0661e491dd8bfa3df3b71829bca82c320d702173021ad10cd8117649c2b3e3030c117fd50a84bd744fb4775ce763372bda20be820773702a994f5147002c4f57cc6bc67407550b106128e596fd87a7618feed3dbacd9c0403a713a3ef01a336695ca1dfe7141e734e21c2e13f65a859438b54c072098b2ccb077a9a9866db3f0e92ea7b0c816394a80e7ec5d357cd7438217729817d369517e0bbd0e2f3e38dcca6d7765103f2a4e7414884f1158c599a066f3a203aee80862c2aa958f864c4cc7ac565b7c693771a9d2d8f6ad87692907f5aad9a304eefdd961346f93f32ccc3cdb99f07d77a08e8dd8ec84aee47e0116b18ccd8f52466f4ffcbdf0af2892870a285244995bd4f19251bf2ce21ec137eb6a9c8cf02e01a34ec5ce28ceec80ce405bb18b37eff50f7857c989cc0b7de565341c93f5fe70bdb9006e1b8259e53135b6effdcb3390ae2d7550d9fff22a20489d44a71fe6f481e2c4d427c4c8909a5d468e9079657777509c0e0be35f17bf4c170aa0242d3744d174b91adf549d872340db3c9e48bce961da002e99a52b6fb0bf09ab1960f2fc2e0cd2a392ac6222cba17a2ad4adc1915fa435f3be103f6cdea233880e7926f512ff2e94d1e5dca9a00837687380f05e0c77a1677dba44bb89a52ff20153d743a6bab2169a86fdc446bf96b8aaaf2cc15e2b952d246324c04330139923fc6c910c8e75f5f752309f5797ff0e5a49e1d8eebfe9ee42922088723fc64c00a77c266587cbcf244991fabcea99060e3c36b4aeb48c3cd465bfee845475abcb4ac9b0a9829b145e8e4e8b68fd03f9dea06113b5c0183f95fbdc3176ba437a5fb81922cb5e1a48c266ad49b09ac9f1de7fb609fc34ffb271b3d953fbb130ccef1917b52bd273a8d4a50a3b5c84c713d1f886277520b622e45cb4ed090a1f3fb37d5ef90345bef6c9c8323d0f3874e577c78bd3f03ea11bd7e87e60a969f47639d144879f4908b27be1b2c86aabf313c7e6959e300f60001b96924bc8e81b171ee0874eedc7f7868377c509768c4d12ee9b6e3db16aac4d03124b268e2c12fda3ca653082b027932a7e962d68ec98768ed14395aa8150797e2d21cb944d45ad8bdaa25b1efe27493bb3157d8ede711ae6db0a2a8fe35a2f0222925f6b8d49f6716f26fff5c1535430bdc75ad50e1d2d0269f7b1bf5bfb7dcff66e042e671f30198bca79258f3f10a5af84f171741b88985087052e09a8c5b02195364d0aefd1b0b17b8e0ee1e5e7ae19424c1f12a9b1580010529d6cc68f819fbcdac6a939816d4bfe02c07c7bbdfea94ba359ed45d7982130753cc85ef395d367787aa0967a0aa6afb19256290766c21eddf822d6da7ebbc49e731762e6852f05a4cd1383dc247c7df3a67ac564500926799da288abc65abb83a7391cb5734c8b9842e6d5260bf286960155368dc713e5173ffc052ad483ad70882715cd47f8693650a899e48e5791d956c24cbeeb65f01174d74e248ee4387c2ee0953f4d93f0dd85868f4a368ddfd8200c3ee767bcd87f71f62eea13dc93908069c99f248f0b9eef83bdab65a2e1c989ea8efb9594ac73a40fa386b1d9b753a30be7d7b893ab6a7829e9e8ac3f0381f6d22f6f423495c32e47d37733f9b4cccdf6e482b64579e487c86082dc2c2de17a1a5d31f47f7167de5a183613e708ae017e3415a1362ee60f6a6b7e3b111ba28fa2675087328cc1a0ae5271a80059477b9a40889201ee7a33ead18f7c77ebb1e72ce16f20399a14df06c0af5325d7ed8768c9b74b699a9da774173ba52a4be5499c22af4b00aa97f76b43de3c84fa5170cb8d9a720565cf1139938342a0c424c622ac0090803d5aa4a9f761e9f9e7b92c6097a6ef94b82e114cf0bff181a37efcada037b32815ec85f1fb66319794b4c7b8c81547004035d6f49ca56860eefc2d2bbd30d65d4c1c0d0c88c9532e42fd81547910315f927c299b49877349a4c1a1f675acb008588abd168e9b3afba427ba771f8ad8f0dfdd8938fa5f1b1ac8f0ffdd8934fbb41b858dc1654f19f88b1131d5a8c6b5c26c0530bda2fe0c8750e981a1f8d87fb3e94c24312f755ea97a4321b92c8fc02916f1649661534b4798ae52b16d60d74c2c5540a70a5a6a4f1f30fc4f08d9cc6597862000f412f110a9b44b8a3f13a4a2f0a2aca523d3723e8750a308f11a5defda9a9e49c6e7d4616011e6d62dde8638f5f00dcc083a9ee631bb59151d86323895f5b7efabc6b8e6bd721ebfd9ecba95b8ba5a0af82bb9c9be173b6cf6543c6a25028f3a1bd92d06bd93e05866fc8fd813521293645742cf75e272e8c20d28495da50f93b6f86a66e0a9df298d1b2eed4cbae1731909e0bd7ede8a6b7d620f2b451475699108bf2aa08f54c47b9b84ef26085ae5cf11094ca445eb41254cbb36d4e7862b2a5e74517f2d997723c57aefba91276aa0564315d50333e284459d06c42766ff6d151f9798ba1cb96f22b5270ece2959bdfc1a6134a4b48c191dfb711fe11a26c2670458fb259c240a3fd1727ea22e3125854ff42f283c9fa6565309c4236199359a444d96cab92e29ee00776a1d82ab60c40bd7652465e768dd37eda065ad8f4a03be2ab4a6b42674f2707ab1acb3f3d25ac8f85daf5f51eb33f9d01ce7e9ce47f8407b5650638d6d9af767dfaa902d787a6b3d73b2c940fbb6607a7750407e60219abe5343b13e7f692c278c394b33cd0118cde69a0a4483b6165a58ed475f26c491977db84161a752dee957803a9810c99a9dfe0c5e365a21187d3687765aa3057d206009f5b3a68c609ed3ec2a51cde561ff52e280c220600708b153c8a7f52aa034ab89ebca3346b785df11e4f1887a7f4982540ae52cf288382eba72abd13d043945f25b144c045f05e73c67431644bddcbe385bdc12e08221e23ca345fedc558183faeda6047abc0f2588be08528b1cb9549a33f7b3004bbd2dc125601ef61f61444287c785e800898cae3e65abf911fcb51edaf9177435c55e26a88491e9a829d1d7365da23c6e43d80c635dfecd47995dfab4d296f132fa9a81a29f1c5fb543d0ed25448732227090351a077f2940a90cc8189ca90a2b561007214b35f6c2a6f253a10b16896d4b65f9f2212153e4c820da0b9f2cc74d470ee95a411f9dda0c0f01fabcbb57aa52cb0f5e6003228c5547bdff0f286ada6159f6ff9b93ad0dce2a6603c6b6c97ae8aa3329bab849fcb198935b65aaa50112ec6a53391e0a306e26fae81cc1386545bdc5592a779541f34699fdee398ef6305ee410cae94bfa244da4c0ac02cb28b58fd22747ab4fb794dc84599bc69ea329b07d9ce9685f4f8bd05dbe58eeceb6d9f2f01d2b6640616c7a1196ee8e347abd2f2bbca6aaceb96915a961abe59595b90d04a1ba12253451aad2adf22407204460ca646a42946fddb6e6b5fe533097ca262c96dcaafe3c46b90967b0f5f98d7cd9a08ef80a85f985925c6447f3598cfe7614d3f88f7108d19fdcf3fc3c2914fa4b4ab592deb28c083cb1ad21cbb4a48bbcecefbe6241a758bd0a4c393ca0efe3ae7fdafc28ae8f07b7672d2f598f1632ef9c7449f2dde1430bcc66167b80fe2e7c0e88ba0f19be7f216de464aec00c16bd103b03adbb89e0a6da180f0d4697f40c829a2a31ae3227eafbe6ad95f95d0bca01d1dbfa19cd315c84f987588ed5a9f50fc0b22e611ccc3a880de3f289797932a0cd28832badc7d721145019c06bcd5faed487d66245971e88c8953d494c26ff98a05b8ef094a37b685af8386e15b1a7f3fa1d1ffe1595d390cb896b3d8a478a21b407b6bc15452a616adf4f10ff413c4d54eedd39e51d99b6cf335305f1e83bc74658df7af7a59298e5f1a01d1314dbb84f9dee126a2efd5160d37668aa8e9bf40a5928f8c412c8611515e23a9bff27542978b42420dd4a7622ab82c444779807ca5c5d94401e985eb461d8b661ade276ceccfa7fc482379abb88e2dea37b09d8dbe5d706ff8bf0281772b00b18a2d1341f9a7d850409913bbcb0df01283debbe24ee04bb836cf4c85ca1fcc219008846c6004f3fb23cd3060d4e569e66b69ef86ebe802c4af2be6b79c0a5d02998e49494fb12dffff643c12916de586edb771f652858d076a4a56c3304e043694f6b87ae252279f4c47c364ac9d188ce0fb87a176a0a097da41497ab71825bb0a02828aa6d32f9946e8cf6a637b04cc1c1d8ad78b7a1caed2fa115910f82abdbe14b1c288a573749c9dc230928318d4ab5fb7f2100ad6f0529dccfd932c124fd625c263f9d7086299690568af6f2a5d7997959a42fc6d398079180f2ca91a6c2928b01c8abf56aedc701a2834b45f6365db30e8546e0e7a07c607eee898c14d0fe11f066697f7dc16ac7b602839e20bc9068f0ec2379abc97bd7c607771decbee81c48b1e7fcd3dd37bd98d336c2d7d008ea45c53cef64b831babab2449e8c18fda8688a79c764a88d174148d1c150e63b6e44c4bbfa998d77e707081f866a65acb8a11f397d6ed8f4b52dc5aa441b04cd52a1f0358d82bcb1cca2df8ade27c2f3bb90cc97eb4079851df8e66777a56721143c43bdabc43558813b702be01ae11beec8cb8121c72bb3ce2a8e529aa31562f62569cfad91ba5a723c3973d53256d51a0847e76a1216fe0eb76bee0e7d3f780121d99359a26ee8710906746456937510ab05bcc5b942cfbe2cb963baf072cef6050b9f7f0c3f2a1aadfb9e35729d287972d27fb3661f6c3c8ace2c3b457091a1fb09f05f9b2df0e4c063c36d1a11317d6cffa60e318cbb5aa8c50b7f966e9c368c1f8e4bc98366c2e39355708f6bc790daae3f8e9d2bd4ac84f8cd42b0de683d51e7ad07f61b1417340f7766661feb6d8c73d0728b93294832ed3c43ec1969596263b8b6740a3c713dfa87fff6fab69f555bd432ee3339a74cbb63ceaebd49ed28295f61cb3a21f12d53b7b1f77830fcbefc49b208a353d0ddf1cd11b5b4cac1b5ef7047925362819c105369138d716057b134e6b341a5c1cdd57930fdc1d629935fb397c0b906e9a9767b5591c65347ca576c81bb87ba1d4fc8f65cbe8deb2d9c3cb1c6e053434b2e422a7dae6aa6737cff32eb5fc1aaf3476b38634761a8c612eae322c2176988a55c50ff190b7d641ad0fe499fce8a9d215467ced33721ecce8f46de4f8dd8098ee5d1fb4f7b93fea8760ec39cf86c27b156c989a66ad59e30e076f88d9cf9f94bd1ec3106e7c86f8b5a113be3e9dad2eef626714203f740f9e83f5de4f5a953931bdde51b8375d042fe03f561ef8dcdb9ac7e19da0b1f855414fbdaba9acf3cfc21d8461fc47833fe23c6bd89856c60357f9ed92ec4a197c5be1b0480aefbac3d6ea87b85c4cf4e76cc7d43875513635ff6889b4e1d63d73c03b4e5ab7e1dd07f3eb73f3a79dd7b180e1dcddbc4833e1b66f105862b76dea569bdef214f2bee1a8a147b74cd2eb830cd0c0d30254f633b6954a4b4898f5319b98d3cf5c59c88965a13d1763a98ca3e4a505e8b9ffe5a6219fcf0558c3b56d1a6e71ada31dbdf10b8ed33c374b8e3106269bf40ac8074e0739b7cab185a6f1cd5dcb35072d261e27aa1640065822a773ddb5694059888f1931d7ca10610e16348f986c35b862feaaff9a0eb7f6b7950c867b077bbfbf9e6cb5dbc6c37be6fb465e5d95f1e0f530b338a319be385295f3e5e5caff01c2c9354aa0c6af2228e92cf40ed079c44ed1e47d8075fcd8fc2b99b2b0583187e4dda073f23f3801746c007ba6d666a3eccf9dfab5d70ccf4a5621a43432ab3c80795913334acfccbefd4fd47e631d53a1059d92ab18d9cc0376323ad2352325ea04dba8f8e4dec2f8810d78d65de260c4d59390e2e6033fe9068d3307ae1f74ee485a8ba8a15dda393ea4df4f71d04f627a655ba826bad0be3b579292517f91ee652d75d193c9e12c5e6ecdd1ff18a4bec456eeb469c899e51aec89a2150ecc7f7ea598d79c842013473426ae5319f2200900219e2e89361cfa47fb2b9e67a215ac444b024eb48003e211072f9e61c1e44b0d0d01a43bb6ef9d425bf10475e49e47d9b455a3543ec2bc8be3dffcbb05517d15f6ed8da6fddf77bccd97bdb90c20dd9419deb7b244773abe71dcc4a31a3c016b58c3c1970e03c225114d9933cdaff4b65df28d19d49771e01bb99c00cbbd803d939d76171568ee80f102fb7fe68aad562e08f22de4b3d3560b5d8ca76b3bba0a6d64efef2641b375018198a857a90f02460770c31a31b789ca5aae0e45233fe77c8ca921d5ad6f885fea7d90ce62dc9077e02e608fa5f097333f57992b535bd0682d320ea525693d227ca7e75be2274dd06a1edfb5e3eafe4319f4eed73ef51dde5ac573b18aeb46d320c2a690c52c90a48f78b4f9c33489ef1c15671dc491170b6a8045a054fad3160679810793d65c42e3d7b3fb9b8e016509bc1227852eda7cc8ea6bf6b301657afd47a3879e46431d8f344f46baf3cd23ffafbb973e043c387da71466e018bba96506d0ec5d906b09547e67635c02c91be38ec4e51c71b61653e0a9858de00a2e6d8c4b24bf63c459b4cc03a71662843fb0b4115cd1dd0e235248ffd5514362883fd58a8110fd170c5d049774766344b4f04b03ab02548e5b309422fc92d98d20d2c72e0d441578316e41a0ca714b6669845c1bbb1420f5c0c5b808822fc62d09ab39626d2ca5c0550317c1251cba181749fcc688b5609507560da408bf60e822b84837c4a5772d4b706bbf6d106d1bb2498b4dc5b508ac615eed0b6af69e18882be284750302eabcf7ca5a1225c7b64d0aa3f4828f7f29b4bc70ee48b09c33e61d8ba8f3d78517d1153c34b02f94f82756fce556f9c5aa0309c26f983423b9a47f3f6e6497fcd0c1a81822e73bb02847ff2bef5624517e780a533a24222e34c123c2397f430733e522e3f05717c5c179878290e3af584aecbd128c8f64b716e926c8d02eb7df4fad3d482dcdd64cc568390683750ac01a1a2be0d073e1443a828aac8c6f3519ef791702a6f1c99c69d669d3c6993bb011c454a36f41874a9ea82c719f3c1270a8e019da0aa497e533315f534103d2cbec607de922429605e2ef2458515d0c8ecc6e8ebc3aa3a643c7b722fdd746fc15be40c6a76503df1f3f9575c5adb0aca8c2a328072bec1b96c97bf46e7f64fd1b76f1f9d00d70117ff58dd2a2aeb6e3a85eb5db7ddbfcddf1f5c1beb5a8ce3881eed0597747094bde101eb4d0db7f823530532c69a3ab591fa935b8a2c6efdfb28d10069908a8105449e7e94129bd62a37180e8bf9998dcac349c6f08d15eb76eb7c761eba52f3649b8f46893d5ceee8bab4af4030c77ab044ec822a0d50651a6f6d39408011a76e97a03f92ad2701c2cefbc8d8def96c4de1a8f579df1c3394ad1be6da3a4fad91c4eca1df8e8f4fd74dd2a1ba39d1ef3596b675ea5435e652d0a2f34c5f416e4e47cc87904c97dc5f3786b18fce6802eb4493ee480c2336d9f70f2894fa1d8177878e7f188a090fa5f908b9e86264a2497b36f6f8035803028ea6d43ddb73cdd1d0de459da65eb3dd57546323cedb8cc9defd487d4269dc813e936131f6afefd379e1ce3a014d1623f9d9ca35b6f2995077b889d0ddbf99dc2e6887a9c9cd4c77cd38b49825f35c43def44d4245b731a6b25d570b6f3479f45f257630f8d17f34ff1deb7d1bb175975a9cb0c59da4ad1cefd9c7c5d849fc9bc4fcf60fc0194d72c17d9a13bb1d71b5ad8993d9df8f67974efb2ca89a206c390e337333368bcf60c68b52eb76c57671174934fd9905978ba2e208366328a674839ce250f0f383dcdd8c950e1cc77aefcc87d9f1fee3528b93c79538a993fbbdc20bd7897868c951f805193e9894b9f3b23f3c12d634f377842b81446ed28dc20f948210f0f5fb2df4f3b3832590ec3357c89d63e747f50d18a88ff247aecf1c746f7fb3c47fcef07549cec32d65dd67bbc9ea75ec2daa256cb5803ece7928fa991a6aa014bd726c1032d65d03a6a74fe4134b7f5a3149142c85024a4e0328d1f41b099d31a554df4b6083dbc18c86ebb37e735ff4f81d44fc130afb829c34440aefac0c995ee831e7e1257b74e1e4cfaad0c282d2ea430b416e305ea3eaf8deb8a028de6bc1fdee9b411045dea9c20c0a863afeba8ef93554f74bf02b7ef0e83ec05abecc4fbb0c7f35acb3cd076beb6baabb34690646217035d27c70ddbcaa3390fc961a340bbcf98834535b64f7cb1f3f54af4c9fe230239e439fac1e5e3daf06bfa34f74fab22ff13acec5fb510070a17d74b10af76bf46c5b47e51b6882770195a8d2be9756e884da913f995bc54af642ff99ff6d5fc17c0a12228065430bf108679252c4c5a38590db5c9617c7a982a883550c41149944c13838b6222aa5854599ca18bf28531319431006dacb3e2b87feaa34a90c8c4ad4ac6ad94858d54ce2c96cad532935c26d1cbe205735f31c596cc4035330a45b316d91ca09b4a0a67847226259d356be700e2a9a39e19e533ae7ed615d07d145452090d44430344b452159d2aa382843a9aaaa511c5b4b66a3a22a7faf53404418d4d510b2ba9239aaa5454e34c5583e86a2d0aeb12651521ada9da1aadb816afae7391573dfa1a4360e32b6cc112bb4063e5896c04950d95d97aeaec04a155a3b489a5362ead2d20b6cba9ad44b94d5d6ff30a6e098abb2cb9423537b7e8e656dd8ab23baeee8a086f76e5cd97de52b577a6f82a407dc316d641728c9ab6115ff4cb2d46efa85cf94bb63073ad402d44e4041ee364f940618b155d6460cedb5c7f4b7f2ce3e252e8bb439210f75bf90286ca213c3a01c200e83d5460c073cfb6ddef5c1976297840f1c362d05e7e9fba4109d07b443db4711456bee7efaa690625ff2a16e220ccf8cd1830aab8bf826b558453edd52096ea0fdc5e27d62ebc5ad8f484fe95731b888b4062829487c084e957bff6b7ad6e7e78e460fa4c26df19d16b47118260e7ba012e7b46cfd27616fbff048e8ebf5bd483b253cb75a58ef8983bb0265777ca4e6a846113d41af731265d3de063f8424a8c461ce7846874105ae6e07683630e0cdc11b893b9a6947c9954f266e3094bb8f362c0f95ae7fb628d9c6d1fd48a4bf23290ec039c3364e1909e3ccf10758c53c5e6f94f61962885c119f94bf4301facb783cbd914e132cf42c0a701675d157e346644132d6eba6ba3e994bc7671fd323141413180edeaf79b20d36ecc3f27fb2d3293186715a0ee80ba274d442343838c18646490b92cf3ddb0c45d697a4dce645084354a747faee317125ea61eb0d3b6c6042435f2886edfc7902c066376580cb5f0d420533bbdaae99546421560bdf00e5a5b60f7e5ded244f3449cbdb1a285d3b7097f18695382b589defb31722006eb48fc567200833d76df0367c6771700e493fd3b829a47c26bf2aad3fd7bbe32c774e1b6379a63288442854e07ef293d44c72c6fd0cc7dc1c2328a39f6628268f958bca8c8b0e4ad091da84c162a86feeae85c017a88252cd68c423a540e8c9759c3869c83b1ce34723c27ce2974ba9a9268685e6d40f11bdc228c0b97d67d8dd5547153e9b9bb0725070052e2e10d07bbc0a16c79e27dc4ef2c7a6acb867d0cd9e0024334632d99311209292e26cbd0ce41e4c2e7cb29c3d3aa78570443363bf32ac43d03bce588e25aa0c707ba59485b76ac182f6eeed36a9ff21988d7beeb500eb4b420b2c540de361bb929f4b54042d5e556cebbce764ab66ca23affaf934deaa27104e7eee79e365da1aef30a3f7bb75f6a345fccf854b434b6d1e8a2d0c25561f30822da27dee2c5fc84b52da837abda16226f83c2c2bca14aebd27de7b4da062ce4dd6c4881293ddf242d029c1d5e21dfb3e37caaec792e0f5d87fc8c9bc65594e9c5436bfd90af4b5c34cda9961dab3ac6637ed94ff08ee0bd08821a4d36ee6737df5554a76ea0c40e2a1be3bbb54b263246e89b7a649e9d24232bf02b3ea1275e8ac22ac437ed38ba19f242d33fb20efae6fa3d0e42f6374fcb5eed8846cfa17d2aac2d209101d00314e0a8a3d18cf3cddc4b4a680b23a1ea6e8728a228bac5026e11da73882e44824a37a4fc402c43e20030485b14c8cf314ff76ccf4fc500e5c767ab187780f6a3c633fb005bee01cb03ff5ddfabb28a79313e23914d8cfe805c43efc99dcd234fcfd45ffdfc35785c450c1a5619554342be15efc0c0cabecd334f405cb4ebb0c74f0c61b4e03c76286ceff38f5765bfceb7cf906afeb7591f9faa1d889bdbcaabecc9570953623078e447e8d8df88a5c00574c7dce6a4d450db95a5f5256f683c7d33b7da59dee5a21f7327bdfa865f499acefdcf6457094ad8c9cc918b67eca5bbbf930e8d6d8a8bd6c016c3c1158b25eb7e253f44e82f25da12bc77c2e511d13fc2e5e5e4b0a4c217100989a42136b5b4c4d4fb81fb84e3627e4cf198b158aaecd80c6af7dc357458e5119c18ff799c0ff0687f2ff41117182b66d97cc92b70cd05b8641122ded0cfc5e482bb59f4e138d316fe0b2e367edc785c024fb6d33636726b5df68ae3ef7c71607c4f8da1ee3340d0a7bfa803fe8d5d257c0360b693a2ee3b7f0ae3dd22e9d5367e117b6237232ebb4e678cf82f614484fa60cb882f1a76607faef559d8d87b9684e0733c41d939045a1f5a22b65bc6305f2f6d05099bb561e1a2661c745cdd27210e27bebdc87832f29df84636dec468ca28fc19d7f6efe7cb62ac7e45ad28939f0a8a97948ec063c536f07814da64e1223b949fcb8a5ac16ab4032c44bd15abb8bac5368ee64dc87d7b8dbb8f04b12eb165a40301a4a5a93016754f04aa1b88d04b86b0fb5fb4283f043596138321af25881f46467217763ba3f48e1d08a7aeb917dd1b04d7b963d42a391bb6ddfe7bcbd27755ce3fee62169a0355fffc2a772c2fe834374343c58fcae1aa69b8e28e3bd0b68e21dcd9f89f1808577d53fa668d2b61b3079afaff7e846f86c6102ee7000be8f70e9f54eb4aa2dd28912056c48b44ce2764d6b8e34dc2f2d66a002cf322c1df37244bc05d69997acb7d26a08c5e7c14407c13e85c948f17e2796e5840736bcc3101327cee5f106d8ac29bd28f87d2a3fb0144708f10ff63eb0e8ed04c3760c6d55e45c4e5df59968512210136ff577e4d7da1f3aa006c0aa587beeff29c3a47e3b7ab033a24be94102688b9909fe7faf42f255ed8f7703087fef34b0b9fa32eb1c70e44f4a53d213a20cc783d99f80206b0033440812b2000fd7daceb4cfb5fe61906ed194fcbe3dd69edfd80dbe8ada8f17d01dc19a861c0f447298e07b820054d8ddf45bae6c7730b000d83bee30c03f56662ed7c522f3cde0578d76ee0094d4186130631793f2058f0f1ef47e5d39fa002ba47c0e0295f5fb6054539df516fdab6169135f4e8c1c69154ebef0cefc51f71583579af8d97eeaa53f5bda62406cec6b70e29e5ae2a4a6fd5195af5d383828417f1d4356d44054f169bc77f67d05d6f603a7d48b5c5e33883c3a3fee7ef58288f95fe064bbf8964e78399c96a3cee585ab1dfc9fef238617b4ab4272edb039c85aa197da107300bdd06cee03bb1e079b15df682f066a98a2a5526c725c3adec00ba9f5e28fc88417148dbd38bdf1d834340ced93f5c75656eed16530a5173300c54bd302c6a8ed93c2e33fad0fbfea016c7f932ebecda85f96c5023beb4b54e6b1635364e1d5ce9393f8afa6be76b135e4b517ef0e63ce977f1ef7784ae111373d9dac42c18cb6039ed2484ddb5792ca3d8fdbe934035d430974b03e4fe83bc1144d88e6997e98c0fa2898e9267ca4c51e3b77dba601a49792c3627c6f8d58300c129b2cf65b0b35b06f6236ecf180e7650bd4e7f7cb021f39494bf9cd97499b7d0749f1530627f2b7143017c1c464c1530e3b6cf00d20fbd7c4f56dca58213eb25fea945a5a83e8d2b331918fd45d4c0670ce71898de71f35b98d1afa235cc45e316cef8706e4e195487e1db5f07400e95eb7d153d30717e2790a74a35494afaa2723672522c26ec8327a277684d566bccc913006d20f86ca2c081bfd3b0968e8d872e536adef6153ffa66c31d96c2e340e1846f5741a63a5fec62b41cfd075fbf4ef926cfccc02781e1526da60c4d9681f83361bc9dd53a37cb13f299c6e8086f73e01a163e946ddbadecf4f9c346f917db465a73af443b51e0d585a32377998a9bb383fb47de65b378940fc9bd99d908049f7d358367767b0fb641bb00778ea1ef5d33fd2df341fefa787b0ef0beb2fbf31421e3effe2b2d96ac016b483928b4a1eebd5bcc6f36d16164dd62d0744e5814f07e6f66935b23eaab31f892242e9043fc6ac3e9138e46013b72df21f0fc7ae4452200a96a1f452e4054b14f3adf334aef4d2983aec606ad16718fcc1103170d4697710df1d27378bbe4a4a493a7cf9583d071bdce9df3e6639fd475b48bf0c8f195e42f430904288299c80340ad1c38e813db48582be9e685c3ea110c78872ef0edf78f6340648211b8c4c8d5bf5ee59d5136ef229932abf2be807b2c9e543a7ac1b672348fa52c73d0241639c38afbadb67b8a8eb9557a50b03451484a1a42233860eeb3e56cda5b724fc32d68eaaee0ccedbfa337d1f7ab4bcf71ec9dbf80ed448e6d3966e67f02dfdf6df7886f1c4af8eef958aa4f8f8c4c6f78186b0268d422891d095b8f4af755602f69e60938af93d0cb354601dbccddc28d9ecfede280b889bc80d6e4373ba8c66bec65fceb801ccfacb157b83f93eeb83aebfb78da2ddd117ae5bdbc5795d90a7742ffb01e7eb44d26b5d176ef925c0d33f8d89a0a81dd38530b644cffbf47ceb2e3d4c5a44d6653ac85ca3bd031f9fd1f8ac7e5d7e8ec63d1aeb83d3ea020182191de9e3fe23c8e51981e4c8041a1442a483f7a0eb03f5d2f5011421170babed6c57a4d67d8439ea9c19ab8b812efc449eae515e18b2ec7f1378d278c56646f97cc9960724429de348f8e957a603aaab0d3a8aa08c1eb68904f64b7ee22032ef4ade1aefbe5759388b3e5e1cdc418cbf6ca58e107047207d402d81d7cdca591e1c9aaebf63ed55e573be650a605529752637724584c53d450be8971eeaaac8d86c52b02f7a6c9234003fd05c120cd25119acd45afbf6be80154d1b98fb8ae62321fd69d427912464ad4cff5421b8d2ddb22f01164601d6b9ba73aa4cdc3a7115a0fb9ec037771f3fd79737e8f35df9d1698a59c215c1735d2e7a3c3b5ba43ba8c5748e0a7179d810339fe701ebd4751f95f65e0ef4549c7102a077046e9a52f8ef8d8c7b1a96f0d7418b43e5a3f0ebd4d21574caf585b8fba89138777c75da63b4aa64d4bd8759a14b03ab8395e6f810e3d2e2a53316051312ea719307736a16281f633610d0334a9163c3f556ec9beb9725dc601fb935f9e3660ae84f3423144f1effde7c5c711c48c501b390d6baa1e016735cbea7a3df1ef455fb02bb88c0e1b2b5a10a77738fe90ce1db054996ce5d8d00a36a812b27db18e46b4fa83cfd4260f68f14e5e89491b4113e39e520c38f03f3180495887315f2f79b417898c1a625e3835775d321af4979350a07b195c1dba6b84e6bf0272ea688e59f147d7364ad9bfbb735b796d69f42d45b064a7e51fb6b32a8c7f8ff8cdd5eaf2bb7d0ea7edd939ea84d5d596b84bc786cf5d795bbef735a4bb580f8afc71bfbd2e157967245d2a7c61eabc2b9364a59f325cb88407b3120d65ec86bdbb8da6bc1e70e2d259c5032c5bb98ec1ff35044ae2111f1f0e32caaf1d8b468297be4f6f64cdf3e275126d417335004e3c6a85dbb213ea9cbcbc7f3531fa01e7d62a662bbb3910ec4630a3cd137c0198157e593253c41d2139da5517f08bd02171768984288c17ff0eb048b73ec6519794cf64ec5f03f9b03eaac13b003996ead356cc9df318f298abb16faaae09ed8563ec5156989b926dc6a47111804a7ee08e9203f07bb11a863cd42b6932f67322ebc079c3cebd14cd4ed8360c62ecbd3e05e966209e3eb4ed8131de91127fdee43f2906ce06c42c140e23e0194dc7294c6490aeb21d208dcab4cab0c73fabf799ecabfd917f92f540f26f09a27b4ab13259e25bd0339d30a2378ba88375624b2f1a1d6fe2a87b889a3ef002f7caaa0f1893101dad973b64924d91cdd12674fcf800d35e921b2b50a81c0def72a8ff14b17a3a49908f5c281f4701468c5b803f63b1050d17e186aa79b5bdb0ab4f5b0263566d344eeb0fe136363163494b9f19b7da1b63e9daa6e85a5ed4e2c65e199d3913d37a782a4d80d3b919a2e4c2cb40101959c4e7167980e28bd64cb26a4cadaa90a5ca5c3a152ee49759305a979b44b74a7ae36615c7ebaafd0c816437e15eeab86750f517496bbc26f2ba5bfb4be577fbb754d03c368007676684ff5af10a889be9d3d4c0073537861f1950f8c9939c32bce7bf12966ac0228525eb902968183c47387fb122e1ccce3e86665f9af940a96b6fac894f9c3b47f1a52b826e124a3c499030e8144da5773f0d72c5dab51612fbf510ed35807fab1fd0d6b18350e18505b4062495b687a4279e865bc8ba11754c75c35f01af843f30d0c7583456df762f0ed545d5663a5039cd4e3490e76ebbbb92b9679d9a98640b77f3572c38dffad80b69a2be71d785b6a0cedb843632b9f07fadc1959ffad5d3395b0159ec5a27d5902d8b7f3aa061f4ac5a3bcb07148f670ce95855525bd332dbf676791db15d829551cd51b0bed69f4e4257833a0b4bc67e1f3b38f145647e832c4836b65999bb6501b4f88e0791279d611983a7cceabc62a6a0d1badc04b31412f9b0708c8a0e08b7b5eacc7dba1784ee155e5518b5dae16521d1eaa88434eeaa9e1bc7ecd322833acf6ac34cb23f5a8c07171b083dcc184ad6b73b31ac5c4181b5f4ec957dce2d29a1db5daf06cbf57fb67bb8708967ff3cf2bd59fbce45eda798ac1b2f0aba38710facd1246e1ba2f929701f39eb0f33007c85e66c5ee578455fcd95726506419e39d52d3cd390a5019e5993e47499495f168bbb2810fb8cef146387756b142119029043bfa0681c4342d5072f4618ea4da9867d4aa29d981e27f6e04c140e7f157e2427ecfe016294f398429372a639a18b4a3415d54162788b5a9060a5fcac9a4b845e9124f09f1d6901e317b2cccee707d03b17b3160710c6facf9167e5a8c74e3c3854e538edeb9e3585078493983b483b486c29192d69fa2e2a59c17b02ee47128dd4b246009d29b66990262bfeb62372574a6e9ca5190d7db04a6122a04671f740fc9f71599649b6e4ea0253aa689c9c659a4e30cffc804b3f53ad6e212f1690bc407db2d9c22a80c5e985397c70afd51e94d3e857d0ea4204ad4b675ecb20082a6b23a8298a0f87bf7d35a9e268d3812bba89aa43f667eac442ac6a39b55ad0329335ac793dad20750f315dfac6580d0f4c3576ee489b0e16bc1bbe519517641f4922da60cd1a4af2d92f4b2f598dbb483ff61228dd21032345946f8ef707335de53107345f9c4c3198d1da9c6a4d182fe1bb5c5cc134d72409380e96a8b17f182fe5106947744b4ff22ad8a8c187ce0ee639c94f06b4c41dd386a0febe0a071acaf70d216612813ec54d693fbde23de3648935b1d345de77fda3aa2e6a3cd904646aba27bc0ab7b53b116f992a369b2bb15217e37012585703e1758eb61289a9467862737ace328c6a4a3118d23e15e1533239f3b84fb896866183c6d7e982c95386ec1ce6605999bcb471b363bc96a526dc69a5421a26a14d17cc6218f51e044e64461a2fb1d962f801bb308248f53d61b57c89126da61fbe242a6eeea3149f378ce9dc1e3ceffbb206dbb39cc2eaa04a969293110bd2e40a400a7da2802ae5b1c556446ebfa9a193265e1655171d8914e32414693e4f3330c9e0d60a25c9a32943b91429fab29bb45da3428e2de52e5237befb5722d6e0e50c7a4dfa692d5360073b5141b9486ba3e32d0b680b7b5109981a54f0b8c64563e7412692703e6025067d1bcefa549e6fdcf1d252de0227e3181d52857be79fb31c700738960be836d0b3234bc2556b68eaa95802f5797212ea44ba669c3f8a81959395f7d79861cd7a1998d05056541c4513b2981e3d1ce1b791748978c2b120512af596c33c46518f0d4c89f0f4b6355ed52c00bd7dd892b2c8e6305ecc1afd83004fb0170bc353ebf5a90f3b11de180e92e593e73a56c2f7c22c204c6418f8cc6a273dc2b6898bde4d0e8040daac010a39526428a7c70b9ca61824380f080758bcd5d4892ff6e082311d849a0d0dd0f6ae5716ed6f98989a266d18efcc347ae34acf9cc07f28a82ce62970ecc178a2692fa024f62f3abf6c54f9847f4b34eb6ffe63321e86c3aaf4eaf6dd9ef1ef594a8f0dbe2ee44ff24ddaabf74e0149e96a349ff90cff2f824718f7531382053029e7f7b8a029dd827fb155646063e6d3072bbea805c03652a2647e06578bdb7b74d1a1c10c35af20760268213fda990a3a0b96e905ac289200a328fb49ef21a0bbd194c1d7e8c65567e75871c3d88327af7cb55b15d04824362167e73bca95ead95efddbd18a4ed1c4f1f70381bac9e19d9aeba079db8cae4bdf050e8a39c9245bacd672aba303090738f1b95db0b2b6b30ca49d85598f2335f862d2822a71d408c621a19b53621067071e3ea46408e8069ed5eca78fcb4d3e9e9b8ac26e1a47d03e1c56cf3baeb16194b1965bf6a72460c1bfa063a99301c038fcb9af437aeb1beb87237be39dc47ae60afd64f5c21c2f31677b948c8628a4c90a7aeb84c3be11567cc947fb31caa293b11cb5fd0a851b21bcbf0f9a0b44b0d3560102b63e9c196d323ba4e36da6c75db6469630fd369ebf8b02cc4313710eb9b71218338462df261c961125b6e27f6f2e21c4655a05eccf9ecfb2416f471b6f88a7a9d517a104f6e30fbb4f70c2b16ee3b68db59c1f08cf115b84e763c44e71a12a247e4a93855d680c888092391d320b91915e10e971cd57df93da9e58aa457fa42972284eb93887b8c0ab7abaad4adf5695c5105fb8161651174143e56bb7d815fd00394d248fd173ff6d078a1a6d81f0daec959c8f99d49e4759a44e97e9b9d048d94cc4fd277a9821dd11893da3e19d59bb06d3cf9475d88d8179d1df43b5da96c101ee7ab8934041c4150233f84720166573bd1280f7a038c37e968b67fa5a92e53146c940c084b874eebacb811077770402d83c944d93d1ec628d593e344dda1b9605289a485f4806dbc52212def0c8c1946a3513319eef2438dcd790d07e4449bf1375e4a75a600129a2222e7a3680933e151076edf3d18a7f02f99383d2a9e6d044ed60da0cb5e7ddd21b247081224ea7c2eb0f905f24e2d096a50f6d5d7a06f7ce3c58aab94bff3a9be2569830966d98b9224c0fa6e4392bcb0aba34b6f8604f58b44ae462bab699a34d8605fbb00e6aec7c35200b404b4626794a9e669eb7e1d46df38089304a3e8a64744d3ffd27414b7e2762c38621b7eaaf5edced710d728c84dd92469df8c86c6708589cbf8787d46c3b0021c08b710c38f538e42e57ab5011f9cc51420ce6147d40fb6f1dcd4102e383b4688674b944ab05f7269fc2e779c4639bbfd90bfc1345ac8b7b35d2017078b8be7f809c250389f1c9ef7870790d0df5c96978d859f6dde0360608602150c2f815161ef27719d7348f74cdb3f05b353f0539b6430f5c8f453c13c98dea814cba4ccc65fac0bec5f072497512e588159d602a046d91a4819c7032bfeb521d82cc49ccd5735473c9f0f8291667c4fef2364547432498ecf57bb7190717d3d6d53beea59581084a5edc5a019fc87ab10391028aa571838c866273111e2169ac344587fe4e85a4c7607c15a4153c1c63d1318c24f370afa6d175067e12aa660cb607f3fb2cb1122351d1fb7eec7ec301b53689249d5d06dc051b9882a275e869a36a46ab9e9917ec55fe43aa3b96f32411fe928ce184976e5fbcc550180cf3b000d5dc56511acbb31cf666b1f85e4ab064e456d2b4a934b8ceb4f00d3636d98a91eec6d37b72b169c4451b628ae1db71edd5c597a13ed55cda2247e7533e603f374327e0098269fc0a6d13e658bbc281586001001dc33e6bbd46de2900bcf63ca4920b6ba53d9cf1c0093595c6dbbe36ab79f687bcf5b998a98a5495556c6ea41685af3e374b8e7602ce2f7000a1c83984b7932028d8a9717310da41c4bb109101deca250aa0675a11cca5e50ca89c0ef03d665c7939d4807a1526226df07350fed7914e3fa71eb84f18cfad0a287f8e3d080afae02ae84f98cdfac4fc2f3b9489f36317bf035606edc65581771383a1917f400ada6dab5c0158387729c33bc2853459d74d6a2aa539c2db2559158ceff1405ea450bd07d641890e055a70c6d2973159bc5aa5f572703a099563d13d4e37f802ed3dcea84236ea4f55774ce4a32dbd19a2f25248d53812d53806e8e56607620cc73b28b34813539aed20852d20ebf81846550da340f48aa9d7b8c05673b40017825006340d516ddd40434f64738dcb41bf3d5d381a01d815842dd2d1feb5ac2fff63ce7bd0d2c62efd62b9301b27156c4e48bcbe90448019ce1cb5074155b7b6cbe2d85998fa72a10ee9e75425d8b78135a7c06bb6275facc04da0c1d102516f22421ab75ddd3d1e93fc8e97f2ddfcfc498ee2a70f7b881c04d08a62beba95a8e250655268d0106f1d36ee9d0259d8420ae9eca05886b5b1f3e016fc5529279c1c6f52946028bb8654792164bd7d93a5e34f25d390bdfac321ba8383300a334755d3f8c8b1871584d13b0af03554d3bd6abd978eaba6c7261b51a33154908e22df80171fce5621bd2543afe428532df2d78074dfac293eb56c3f420eaa8e217f3196bc3fecc74767e0993966f20a134c5761770c867c7a5c8a4f2896ac2f0b8762024bc17a8d8b590506c1fbacb226418f3d007a9bd7ed938c0bcb1d4cdddf19686a5d3fa8334d680367b0722c537738c9be5a582ca22dfa604b9e0ec7107f1de1c89b40263c735f4129170613a6c100921aeb57b173ee77cf61a0528de64dc224200982b46e26f84cb38f1fb233b1dd169269c1bed03e387846b70eb2c278f226894587441cc2ce109cde6401ed24e72ed7c3f83fb1e129583fd8b8c28fabf1a9ae5cb9085d255357774ea65f598279f42542ef06058f0d86c90d0bc98790a92a5fd360bab983706d6c12425219e49527b7bbb89a67fd01d25fa26f48b7bf4c8e4c2bc99e6f80c9ce3315fa5ecb7eb746009d6a4aeebdc0d32e103d4e645e50586d55f2655c8281834c518dac2d4556bdd9648a1a7fb9ef8651ec3c8a273da1fd20d084fa687ca0553f9bc23552a6bf70a8b3be97bf50d35bbc1790cdc9c79c160579d614e927a56f04995926a09665ab8373ed2d0bd06bc1f83e6245eaa31887356ab2614ab91c52845a6b0e9181f04edfa928bcb865e3a422388e2fa4383875d62e409a828cebc0dbce6d69e033ce1b809223030f640c62f20d318c5664748e8cf8810f1a36725f5a55b909eb960528f85f05f24413149e2cc6b129877e7e47ee81536761a750d0de37b4c376138d71138ed56a211adf80df53723f16436ab177a3f208109a4dd92b2ab2c43d5e3cd53e4e5df0a744b1caf9f249d2057d71805f1e2d0c3f1da68756a015de9d700f775b43fb8ceb45cc7c33eaa6449a5cb0c99c0ce1e407375e4786e3bf8cdd6486466a5c371422fb5906e87e8184f40198ea9bfee78fd642cc9a4180e1fdc0497290a61b9c06595f91d72252a9bb5c8c67cea18b2f05db612afe70905f769b6e2000e77f750dca5441e9e307560d5c207c15649fe23199f9aea9cf0a8737f20a8402ac60b59246c4ae4d4b460acc0c37beeb9488bd4b76dcab50df27eb9bdeeaa53106c0d0ce82b9372ce71568b7df9e514d75bea3ec0e81c104dde3172a21ea2c76b723c227f9a55407e0de72c22a24ddbd4ea1b159637cea27643de40fe06c5257d5dcdbc70871326ffceeb52d42e6495e74a28ab8242be57bf45305725fe2434dd61d26373f8dfe1d81be332973cd075385cfc164c37ab1f277b44f9df3a16816c1563d51c2439ee10abf81256643c3ba54b8bf0986288fc0042d124819dc1ecb173d242132a74c1d72832858969a97e26ec0439335e22b83f60b7b65d4282bbda2f9a839a3a40da6d0705e4f85dc164114939509545c46962929948496d21bfce902a7379abc7e96b6634a7a0a0eb1f953702eca709ae08ed007b9c5461c697397afb7e2dcc56c41908e6ac36e36b54542bb0a651c053fd5d3b718cd243364975ec6867312bb026feedd948174db1972cd9fe0b0f85058664e39072a101221886accdf1b243778f140064cd159977dd3a327dc2ca22299252c640b484262ed4501f9661e4fff473c5e35e266fd1881bd245146086145be610c7002bc18158d929ef61dd686766dddaab9ade0ace9293fb90814aa24f86d6208d83ea5b796ec9d6acd9290a7af3786e5204cf7be28a20896b28c672890102071582c4b487d227ab587e82114c33ec394b783605903ed20e7646a135d9ccc6a797d5c07353da33c3829f0e6f1ff229865cfb573137377a65f3eec3b8bd47444762819d9aa48aefa5784f34ec4fc678358da8aa5f106c562a28a69fe9e63f4217bb25bcc4898451e20fbadb956cc1c49eca29f321654b1b347fd6449a704f812c27eab13034f90e4c6c73409b7868e32ebc412e19964b24c554b887d37b01dfbfaf11b6f282aaa35b74b3276bc57b933c753af97e851c652aeb80156b47bf47bd018ff9869095c0e253ad0d30621623b73fd2f2ef61272b301af80b9dcb09f48b319136ca5e3963906557b89a44d16b9f6edc094e3c94a56a612c705d38692c159f82945e8f107894e295050d1be30835e637d909141324b0ace47ade114464da635a06975857a7f7443ad24a3eceb1e4c842059a30f9df4aaa49f324113ef00a933b0f04c11fba95568e5bd5c3c0df664e34b32f8727e18b4d5006229dca5fd6f5da327353187e695e150d5a7b39368e803a1e18503cddbd2dbcb12e0807925a771b128fd15bea5337ba888ad11d8adfbc764bdafab3ff3ad1579d4e816d4e4814573096b2c52bf18b8726007e40b9d662643602044df1d8d466fb4c3f49e5c27032085ea48a6b91ae951028da5c8f4c787d37b48ed75fc09744b556d2bfcfa0a41544533791832d87a35bf759969601c7571c84b33faf5f88d6954d1b6c843a0180436a523a3d74b0ae0a31da4744604721b914fbb78b15b48dd291b8b84b45bda96095167d7a60690402f1fac9964fe9dac27eec7370c7fb69df9548eaa5fa8b7ac8705bba674642784e11be5584c150b005a120906843eaa1731c42ad96bff0bad1769f7b783b341a3e7270137333dddc9c1b615bc1736ae3cc66d910d049f69c4616e81ccd9782a0dc0016fa10e107625db88677d795bb5cba139da05f01f8e214706ff07cbba313fe2eee4b713689749788f75a434c737ac05e48f8f45834fb960e3da4450f859da3c75e9b373773b207b6b1c772f06515b9ae3582bd7581b366a7d71f80f78d5711c138935357ddfb4882b90bfc330facb82b8e85f4914548d9a247c0bec7eea5328327801bb84c1102e34a0d3f50b720e5ca689d65a0c942a24fe7fbbad23a61b25bb9afe84fddbf0baa526bdb014e2c8af0364f92b2d6b32848f11c98d44b432e8934ad5ea19420b3a3aff1a1696e58442be20d8fc57ee790226b7e4b7005ec9391d5b7226a65e62eaa21b2c1c41ffdb46e0c7fdb037de9c093bce16880cc5ee68aa89d5c7acf60fdbce7c9283988629a9288bb78ad14e89b1f997ab9568c1f3849c056404fb31614ee247ed458c482eff567687e1f4503ebe4dfdd357aedfa6b3c44366a8c77faefbf0fa578ba7c00d62f2bd601ebb8f8bd1ffd5f0e09741267413edba01cdd0802e682f22557c62bd933a710631169336c69f8bd2ddda071b2879bab1b8a66b62c2a7bd7627e824d69e55e3d103f4f52ba2675286abd47876f1b3d4148bab99e9c319247b15e4e7ba018b1bdfe80e61595b5d571cd66bcf38ec3cae822c88c1a22d2b039dd9d4ac25e465f747c194e7f0fc80ec71f9820acaaf0513e2fd8fa8194601b3961b5de59f580b75fc1f1e2d0a85652e556782aef5fe338ccca1beb67454c3b1b9126a0da8c54be88187fa767423b3521e027109ea8202bbb4d3cd726f19ed796c78c56581c97515d35d633da56449d10e3c6d3e2ae95a38e6c2b05b5a80dd7dde849611d8f7110f127b0e572af7a57370f29bd767c3d24ddd67b22867f7738f18f31a54a5d762e9e0e8da257f8d0917f8dd81e2f80341a483dd03b77eb6b2cb52fe40a34386b283972ca17e5894058aab9285045a1dbacbf77f6b3b4b0f97143aea7903554e21d6e2f51b86bd8215501021a61680bba55d0ceecce64335b035475cd2c9f437e2fd0768db205dde521d359e3a996d682863415149d0354a74544fbb042c51191152f9c2b242de26880f70b12243faa104b28eb8476a8e4d87b2f0e902dbb84a437427f175b5b9202b010a5f33585e999b08c099422035d72c64759b6c38f3a57e51b8749b041d0b10d2f5cd590026efd26de00830aa7d4bcc54f2188a53104d2ab523afb04f586880ab8faee26339b9f5ccbaec5481501a051c8967cbf83678f57a0107d87f1a409b2276c900505911c532dcbbfc1b457b38a02b8a1e4691bf515b50cb71f8408a49bf641bd037894b5f7c62b10e7758a3e9d57a6d0f9ee418a7f9aabe8af52d47a0ecbb13d2644cf8d5b83e767ecfd4e129db87419eb959360734d1279938fb55a633d20707390cb3b1cac459e227ed219507a2b780b1af729f081d8fe9e26f85e9f56e29966a4d2814367f9b80da7cd946baffd33d01cd5e00ae48bfbe82557e9d5df756b1ce643362acf5a03ee1e5f101485a1af0334265ba6953809969c130c21957be12c0d3e1a791a16ea2b6f09b86feef060267191e9c9e8a93c872c32d93a44128af0350bd7d16e1b95738b2e51baf4554fd65afa02cdc95035247f8a0285d706e707087071d6bf8b696ce384bb00a2731163fc360e2daf42b995770078b31b2efd58d01ed39d70fc7ff52e8824e60205421fc501ce556b02b2f9f86f20f003259c6a407e0a135ceb58c4361262e241283f8b0f3459d2c59af007e7b8a9949389961eb09be6f705489c2d761022cd5f8ba943131b234b383c7c3a64e97880a87390a42d71d70e4cb97f9f16f3afdf3f7b64fa2e1c2dbce1a37a5a984ac3030168a5f3cb5aa8b83583c80dc0ea6f74765b8582c7cacdfc18679d7a079a6c3a7b615f2168ab5a0642e8cc5982c1a4cbd03eaa490a12dff49347eb08621403ffd646546e42135dfa6b63e090f4cb1c9963c6ba55262bb47325e887241f96c98a7ce24da676e6878489cb725ac5177eaab08c1cb6bd55dff10b0306ac29b8e217f86ffa6ff6456515282abeee1fdb5448d21782f6fca8437a25c4e24209ee7482f37fc10d8a5d30f1acefb854367604c2ad38e3f2d739eace2d6ac9a499dca810e6932abb0834889a75beef1abefcaa958930758cf99605ebba7e182b6886eaaaa79e165e814474030094d99c21c65429679f83e704b5f5d5e0703903b75632f22b120d6e5e8a4d4b1fa0ab75738e8adb061c27170cfb3ff98e747b74c4946c7d43c211a9a9122c56a04023a8b05ceea553f083408da27686661976c2eaa7559c80d52b5dd770e975040570c770166c3b0b152978b56f200f5eb0e7a1392f791fce21e99673c0c7a8aff9f56b6693fbded19ed81d439f27b88465c2fe92b466f63f4a09378010aff914acd08240c072c5fb1e86d35c0822c3d6e5decd135ab4dd44725037e2c96f6ae5687d7c4415de11da7888e3f22a868595b5817173ef9385985bf8ca0d11a3388f6b5c0c7b73bad66b02b493eb0a32e82d5cb6c109c87e3fbe4f0194ff47c38ca12f538a213e8b8dfbd7c3044ff2eccd901015872bfa7c8a189844db8007c22d59f014915283095b1401479c2ef29c30901c0c73f8f89583c6acbc9cb9ca7f132d8e3b84368be69407ee6298f73767a72d6e48a808849bf5d84726d3b8d764e8eefe67e953d085823d920577bf99efbcddb27e0d61a12720cbc8e0cca6928d685264c84783899e15883730786ceaf99850f0d02420eb3522771352498d11790cd2a096bffa2dc18244f26cb39c8acaa91f0b49f83b28575ba0dbc71129d773b920e980dae6100287a8c248c154d34781cb0558ec5febfadafa713ba440a9049485dc4f0a2c8eacdce58b7b569f32406113273875615f3980f7fc849fa225bce9a0a7ba481012975cd03e2d42457f2c8bc856e7040476f32d6ff1b3f7c50f3ad1e038c8ee07cf81d46940d626f65627b2385ce81b30ba4d5e7449d88b7559846cdeb218d3315b46e996129ed970a375e6bb3be4c3f800e6e3f48b982ff4984b38d98b82791d9f337386d6f3208128fecc58495f2b4c1e1437cc763e7d34e90e5ee582ec7594c9a83adb87ecae9270104e0171be466763b885e500d7e4105ad1d4310ab46b8fdc8d3102c5cc007609a8b501d3f88ab78945f2c0727f0d1c1e109d32d5175ecadfc84518d6a348229df755fc381c606cb000e71cd374962ca55ac564b381752cda37cf8844299893c28deb9a28950c0884600e7249aa3eb270ac22c49a9552f124dc36526734d184c67a574808cc565270110f5c57fbd0d5e660bb50a48e0dd2a41a40cd12ac7fca3e9d111d840cce835c9ceebf56c16aecf9f7d0df631dba28816eb8bfe766d571f21ceccb8c2421b801d6fdfb7b183ce495d2e77d7eedf66080df9ad4697f00fefe8e7eca52467836341addf0c728c8f3b96e93ee30d9b6378f107fd620c0b6a2c57a74da45403d9622b3501d80cb5b7af4588905b3ebf42b4e251297c727c605dc0960cb6a2b31b85f30153e9a1bb451301aa08ec24e87fbe2eae947326d02a1e1963827dc5500ee6a711979d1bd08a7890c79dd9e0aa2215619f4e8364665348504e8b6d238b6f3238757c0a5e3ea72d584d70cc64c029be2e2f047a23a66b854d55416f0caf2bc20a0f9e8e4b3f5abe389a3c3bd9e4a991b83418dd3a0a0188cb90ed0394e3eed439044c5ec3d2af939b7b412176cf31eecb638a7afae65330830646bdcbb20617c2e15836cc9ac447afaa8c225577981fd9d391d083e6a60c36a3c4198501615b75a2dcd3b610c9424725f427352cea8fcf5370c60f7077b248fe1401553d5d8d32984c8b1041dd27a289c92abaa5c8fa3b17a0988cc2f92b40ebfae4647a676d79fd2e7327bdbeb91466b828243b27f26d8d054632c746d880d3636be3b53f70b51ac89f68ac1a6459465f8808d1327773a4e8247a3d2347e703589a879d613ec74743b825bc66429172592a1b4c571965c61ed53ef14439dfc2b2054b46461fc39388933b978408a2a74b54b8c0de2a799f195d7f422fef42bff68725913d5d9b1333302e816d8ca5e6677c5bb0f19762e8453568700a6f1dfb68cc72c5a83179e48bc3d3d39fd07cf38d57ac76d6b5c54ddff054db85ee78ef03a32e052637f8671e296914aa0c1816d9739ba4ed8dab652cb4b13cb0d80386cf626333acc357cae4e17f4a1e233b549e02cab44286a7f91c6b21f0840a103392075fcd1b3aa136c543b7ed98547eaeab8a38644c237dab2f3b7114db51821a309b3ccda9b33a90582bb5f4bd78fa4cfd7239dd3ae5a7ee79fee32d0d6df47ea38d6b5dc7f19bb1e47ee2da77d70e865ccee1d9ff55cda08f97ce37f7cfe5b0ab282a66d122f0d2bad9cfaa9cd399f001d07301e512e18bb97bf8cf9ac10726ad4bb0d57914a06883516e46a776df424baae748790d63c6ce219e7f24024a17860d28fb84e848a505b89a83476848634b999c3b83ec07f093c4a51949db40291d302ea66c25c6c8fe868d8b4bae63f1bb80bea1b2eff916f2a210dd91aa5b0bb94bc5cae68fc403d05ef70e4e3148c6a29acea0f742aa1339d01ad8078c2dc6386715d9d2b5556efea12d525396d3df1ad05e1a6f438ba69f837d85614348eb9d96c43d92ea62eb7ae3f50cb29e9885448d91e06bb358556beb5d25aeb54ca28c56d699e8982d6d00c3cfacb83d639e9e9ae7c26d04e91567421bf2c979b61883691013f814af974e45c58b2547e7a1bc2fb391b8bf068415bd74acfd30f654f037bc808842ca615d99650c19451561430b97571063a98f941fcbfcc1fa55c6e5ab9fffe14759761fa9c438cdc3008f69fe7f479ad9a9b6e095f1429e9604384c110cb127be0c377eb2cec69a2f3e4935f5b27f64d5ab0aecca2643aed627f9b26dd28e3fdc77f7ce19811280ada5c9fd63f130fc9ed14e815d6daa0f1f1696ee0ba27522f865da153465c855b0ce7b99670a0609f60f99b6d8eeb048115ae09b2dcbe9c7b5c6cde93d2f265574409a974ebf14e5a3865aad19c140724fff6d6cdf2014d8bfba7c626daa584e6428bf7a2dca962dea1aae99dc05ae710ffcf48e38859eb937448c86f5fac46da3152cad7d4d777405dcea15d7328fb162eee60ad9c51cf30d0ee4fe737f82d80df1b80340bbc9dc96b5424f027badbfd1650bd47b6420d0369a27c45489f05d7885ed23025ed5590e347fe4bcd6419e502c8ee49300d77a0d57bd5644e39f9f5828d80735c8055a1c3c9eadbefb18dfc3e5bc259cdb05d1bcb3c936ba3a9834c2683f81d76ff6c29019c9a3ba787e4e61de745676befb9d8561603118a14493e7edf8fc6666bd3e6d8f1456b8b5064675d64baa0bb9305def21fadf1d15c4fc16cc4863b5cec66ffa0999338070f4331f0b4d84992993527c8d3c95df4f859431715f1a441f98ff794f62e1c9cbffafccf4e06b1e06f45a3c6f0df757e683b7c1af896fa328774058c0c4a06507499ed60218c5bb8cc1ff3cc1138f88b3a425c178b8d703029fecc5ac89c90317065183f007bc4ce7abfa810c801308f16cf468260ad4768f4e0c851bfc76d1b1a96dac4f147fd1c8ed00f2f91271aae747817129eaff4e1d7a166a2b4905e774ff39c4da6ba47e89f7c8bee6b96310371a14058b4b661465d83917082cb4dbb8cc62334bd7d209801cb2a757da613c185e3f4d7b85a08549bcf7a6fb87f4a60389f45d480a8bac95c2b0b70283f8b2f0222cfc33903a2ace39f4cb7f0ad567471acb2e85115651cf1823cc6e8acaa9090da9248adef28b2a0014e621aaf131a2634697b4c377faa10d889525ffa93c4f02e506e8505491a6ab201ececbe9475abb40e6d24584cdad88ad57eccbc2d5d151b78fb62e32f3789e00e4e3ff809d28ab7c79208cf7e72ec1a516481e83ab1440ba9a27d57b4cc595a686b10272a566ff35062e5c131237312db0ddff6d0ff6f4056a091c3206d99f6550f3e77746a3634134709efe8521f78ef12d3528d44333ef4998a68e79b6b4d59748b04ed96409c7d6ebbba6c9af3b81a2a2e7be038c6c70b5af31bb34ef628d5e69e6db84c7ee49e700a34b345f1f2658501faf1c83ea17a9668b31954473ccc507bc7aa791f7080b619602d5da68296e342d8056edd82c78f686c4b78bb6b95bb07a13be8cdd20946e36acaa23a929e3c7f17e11a3957938b11d5a4029ac8540edae540523c2c3fd8ad42b32dde38f618ddab2d5d0905329b0e23c78dbc61ea14c3f45049b955c470d972932351bd08de3e7f8ef2c7425fd7ceaf20e98be48357c9c4109b633903ebe9243ff5d4be6fbb85efd78b9cf26ec8dda3d7f3ad5f652d571165e11e9d1366ed2bfe00d23ecae092df3e5ad7cd63d0ad9a2c531a212d9ed0c09f5d162f1b6c4f68177cff7fa271692a3301885a3fe3fe805b290d6a4d1a403ff47afd13b0a7059d1fbdb96a29c37944d9ca21d611c61f982654af789f14ea462219efeb6365e0181c2b51778dcfbfb326e795986d83b73609d81b7cf3c9c0e179f57a1d1dc589e705e651f62a3ce7fc91b19220b0ce8b38bddfdb681c3b7f62355bdefd9149db7d393ce86b1bdd828a60755b44c879f4de5d08144f5572839ea960d8e9fe8a607683dd4ddc844af52bb985187ecef16a7d6107841598c2d6e648c0139e65e47d5d5174b2e2afea499ef7c90497cffb6734e48bc5a7b5d1238b56a53bc36197382cf7505110796e8e061e66f520742868297fab79daa3e36fbc85dea3f73c73f78ae92dae1bcc8a0c2c004c8d702115381c20b86ed2c4e35953d4c012cf580f5bb1bc01fd2758bfbcc0f1febb8771dad0edbae851394e8f6d4e5b8b1c4513d8d44aa1890107532fd48828843ea66bea603edd9071f79dc1c5c02e5fbcfe8c1186d923a21177806616c6867b57a90c186972212ef173c3bd32b3f1c2388958ba9ed5ee57850c18bf33a325b68826f0d90872345e9d0d60de6b402d019f6f7e255ecb6553b8082c6c341e832ee7a705ce3dafd75b3b2cad580cc1d428a6a7f2ee8f66c23a6a44f9fcf3763c00a25d8d61d890b7eb5825a513ec2096913d2495b1c2d0ac8e7031ebb284883c9017f0c3ec479a0bd786a71c4856eaa8376116d0d370aca183f71664ba587a44c01407c991efa5410c2a4eb8b421ae0ed6af222b81bbba7e91e57436c12bd4e3cd800584831259c60a0356e9afa0733c75f4be18028208904a637bc6c6572a4046ee14fda045d3ca04eb672fc88d3aa0b586fe57097e1ddea0b379a1ee420ce02458e034b498cecf616858c5f1e43109f91b38d5d439d0372d3528acd14a652bf80f86d391882a473d80f82337f049bb9056c1ef05b016128b640bb04c96d1e2de7baf4a95f2be1c59768b736c336a68a497380d34688f8c225ea863e0f81b3d02a1408cc3f0fd841e9ae6a1b1a2ed9cd42d805aea50a0dcf72f29a52151086075d3fe26c40c048b845dff39140805b0cf47bd0881f5fb5adc123973662f106956b5a7f9ef8c8b5a30fe35157fae8a7d8492f29b6b347e8cc0bb2c3631316bf9f3fb044a964a7f15110d564d08d2638b2f8d22500a53000a33e06cd9ab504908dfc88cc15cd9e22de35ed6b70080e36928906ccf58fe64aae51c3768755bb18f474b5bee00a77fd69cd708a4e76c60c78c002a43157456077226d819fea6429d129b219af8c8419465c48595b93c39615b869f8ebfe7ee67f7ef9fb9235ab0a93db8b1adcd908a5712cb7cd663d66438be8993dabe0ab03cb000f17263c7b845d205aa9deb06a33ab3ed4f4785afe2a9a3d51f225390736be3c952f3e410384ef02feeac4f20c3840b026c3013c0c3c0c3c0c3c0cbcc6f05bbb6f169f24a424a59449d010e0366a90644a49a69474f42feeee4f087d015f9c6b6a4ddd7e0001de0c1e0daa0cd557ce672a9a0c973b430cd088c424d3a22f6de78edfcbc06530e1d13b828c2106f2c0176190bc80062426e68c61a93f7505b19b474c38cdd7cc49cd75d4706424530f341c31b94267cb9dbc93393698061a8d9878bf31889ccbe97e29664da0c188897da5ef226e4be55f682c62628e78c7b788695baeb898404311133636d74decaa760569246252adcc8554771131f1362e34cbf4b26faa64cd77fc00a3063e2c303292bc063e8e9638d038c4a48d13e2234fbe838621266f8a68ce64fdc13b598849316d4c1ef3ee629b8a0621aeabd2b9683934937e10e78bf958a1d1326e17c461ecf745678a031a8130c56ce261152e2d552c3175595cc35718f1a9c46347093af38031a60188c9155dccb206afbd3419621832c4c8818111e4a8c0077a606064646404481168fc616288a709d5689e74c584a0e187494109a54cdf5bca96c5ba48d0e8c304a574d6e6504b42683d06243f7c3c094382061f268e52976ffba97e314f12c45f60f21134f630f14b6de690af7a159692b5934880b406464646461441430f93d3ee4757cb1fffce2de30718201841e2b1a344c7c85d81461e26a7243bd47d3275e36192f8a4e3c59c10ab41e90e13463cd69b0cf51859390a34ec30296d977757e80bd7d14c028d3a4cbed2d229834ce959171d26b6f9c5d50eaba12e599040630e1354a994bf4a768467921c2686d1a796454f79c96f0834e230b9b253d0546e1e534e82c3e4141f9b3dca2fd8be6f985415974f33536510971b268bd01be25c4325b1a7364c8c59131b1fc554ebcb86c9ea79c7eba4968f1e4b0e303240c61817041a6b98184cb6a84aa2447f6a6a985c9e2f961c95461a2606214aada6bbe5540f1a26eba5cf52a95dc3f57d86896269695c8449f32435c304f5d10b727154d0a55286c9576fea5521c3a498ef50f375336fdd18268fcae557a672a9945429a0218609ead3ce8a121a7a750fc3448fb9d1f8abe9359fc030795479fa94dbf4854941e57a0a97a9427b8e1726a650213dd8072167395d981833a6181dfb1579311726bc6de8485f3d9974760b934d3d9ae5706a6172d05d712f1565fdc9c244dda4e5634b586cb030493cf605bf8a2ba1e5152689d24bd2f23d07e12956989c49954ea2f64d7fbe0a93740a3ad645bf76990a9347cea61f3db5b599a33185c99aef4f3589cd27a5d190c2a43c25372efaf62e2b1a51987422c496aa0f3f963734a03031a92454509e3dbb9e2603349e50d6b4947133b9983d2b4d9b8c5175446fed000d274c0a1db6bbd133566cb50993337e1c79428e4c98a4cfad2c83d4b170b9254c7e135955117b234d12921f3e8add8dd162e0a1a184892d761d367a8ba5a497ac25bbc0c8c848318d244c4e2b966e47b5d6e88c8449253be9b37053c94343e30893622b88cf94b266caa092b591912fc220f141c30813adecb3f7f6ace52c1761923a5341a64faf94fa4334883041c595d27f6b966ac1919191912198e1ed549cf0cf532df58b30486a4043089352654b1dbe379a1a48979412205df24518242da01184094af709592574dba5381026688e5169557e3a6bfac1c424ec922599545ff4900f26ba7ec7183be9f798d383496341338596ba922fd3e0c1a43765371f7bb38bc95e3a9976b6481793c3f2f3e8b8fc8d31998b49fa2f93a912cff91f5c4cce2922faaeb3a8cade6262d768dbe774292895628b09a73bccc445b99091d562c2a7181946e52fd15279da18fd01125c7e1106090566d0627267ad7c7a4a9945612f09192a6e9eb04b5607173166c8626295d0633178c8f4ec633159d46993a272e77c3e2c269caf8d68973039d27cc5a418d17df7296f5375335c31d1f4dcf3dd527b9d983c08f2316a301919f13432e2e987cf68c5a4b0abeecd2db918e69235922cc30c564c14b99c92bab0f73962c91a09098993e164c8a087238e61c62a2628f1621d83899ffcc3837c93a8629255ee70a3e3aac690f829a3c5e02fcc48c5a4b59c4ff12a48b9182a593b2ccc40c5a4bcfd7933ddc6ea6e4bd6ec4e31c1acd3cff9769051ae92355e534c129b378cd8cecd5e1c8819a59870f94b565219de374440cc20c5241f553d272fe9e0591ac504ad14849e0cb554d7e9c30c514cce9139e63ff1f3a109c5840b26532fe818ca534641315993e7ce1a935c858c65247398f18949e23ca8ffa4f6329abe640d48901e1d246f862726afab9a7dee5ce8ea667462c2e58caff137e3a258f84518245e4462062726e759d7a87ad37a212a5933c3400f103462c62626dfa63e1567f3b706af646dbfd8400f10dc176190783187199a9860e349bfa7ec9589ec0e33323141773e8376ce29e24298989c7f741232e9f049c9f81213cd534e5fca9a8392318f0e332c3131ebe5e61df98c4a4ccc2a119b766697799e418949715d44a554575b1e3389499f37aba269e7946a929894ed3909f99df9b6e5484cacbce699c74b74c69098e82f42fad57a5deef6119394924184ac3a7da9d4c286198e981c352b9d5f9acce96323267a8c3f959eb228d39c11933d346e3b94954e6d5ac444d3a9623cb9878ebb22268670bd14de3e5786b8469043478e12418e107820c7c8c8aa1666246262ca7ad1183a2aad650613e42acc40c4e4bfba64722bec6a477ff8f8f163c2879828377a84aacbd1d2372450986188c9ede71ba3a72da9f27861462126c9347db2aad2c9184e1e3c5a070900b63083109372c3c9d9b6a44a6e5bb2a696a6c5be08834404330631f92d4bc308e571bccc1f3e4848ec26675430431093644e6f3599a4c6cf4e204a32cc5a6af67ae71a101384c574b7be418efed11f26c54b954626d11efb97f7f061e7873a3ca8c51ea5f365d6cc1761909860461f268b0ef59872a7f4e7a6642df510a37ffca840057280e1811c3d3c480d263c78b41824181911c30c3e4cd64aef1073f649f8a887197b987c5ea6f326630c4761861e26e5183df92e9fdcba45c28c3c4c2eed5b9a2e9f74572b878e1cdf03af30030f1336f69d0e13b349f74ea223c72407181ec83132524662678519779830fa2d44cae8db3aaf642d970b33ec90666810994bc8a43c26f8220c12001c61461d268911572a59138384078f26e10ad80c3aa8a229635ba8570ca671ce98c3c4bce8194d795ccf2997e400230389c70e322c30320224063e7c948c8ca43d61861c26b598c6507fab73512a5923f11f639ca9290766c4619228a5c36bd2be119926633f1c083e60061c2688cad0f03a32a367f98689ed252be7ab7bf8f3cc70c3840dcd0a7176d7e7fd8c364cee7ed30a3b331b268a7cb54aa3e3dea65fc3c4cea195525031b9a524354c3ca9f17137babe7c3c0d93b3fc64fa6949b553a161a27b527f517fa9636bce30318c8c25ab9dc305cf9861928cb71e4ea9243674a60c933b48d1a63b28c930796f2f54d87687bbec18269f7a8bb76f6de2a4268649796aab54b8947289310c933ac970f9732b1826ac7e9c109d37647cbe3039e9c8a8316d0ea55dcdf0c2e40f3ab48633d537a1cde8c2c453a6b55f4db8858e28f8220c1292195c989833a859e5fbadbd780b93827cb56bbb91415559b2a61398a18589495fceba310721366419989185c9d164938e65dac9bdc6c224cb17ef4adde67f0b5f6192f4513e6a9b63aedc5861e2570ee2c2e22b57be5598982bfbce922cd1162d1f3d48a8303147b5dc51f3f558faa730712eb442998e175b7e294caaf64bb1172a47c71f85c9fefb5f99664a6d76284c0cc2eb36782e8d31789e3051f6323c27556d5eb313268e55a5779a1096296ec2e4d7eff38c694a58c54c9820b4499df7106f1ded122667d0219a3b55b75aab84c9f141caad85e6b547933031ffa7f7244f3bab53244c1e5d7da543cf45f1e41126e6ba8c35fe756e731a6182921f844aa6a772cc4b1126473129eaf28a10fd15224ccad10f7a74f6f9cab9214ccc297e92da6bd76b32214cb898b37dfe58a332c68230b9b36cdafa7518ad1a1026c74baa5c83281d75ffc1c4944dadc23f3e983ca2c5d34c84fafc7a3031c8b73aa15f27639bc1838996d12f4ceb694ca9f2621793a4a69ff374bff14978b409ce7801092f7431492c798aedef87f53817932a2d87de39dd18c62431f331ca00c30010092f7031b9f4799a0b8d7336f22d26a53c264d26f131ba59f4125ed86252e5268d29a8acd72caac504796a4f4c68dbb260f1821693a2c936cb786273886916139488b18d9e31fd788e2c26ec8d0c1b833c0bf22cb198ac637a6271b1fe4384c5c40f3667b99d5252edbd62a2c62f5da2bea7839217ae9854274b6c7fc78b79e1564c92212d5527f9d6df2c0bbc60c5a4d31e7dc642b527155fc5c44c991f3fa55199cef5e1852a269a0a9953ce7f9331735231f9742d8ccae019c4362f5031299dc6ec1b3bd37bd29e62e26e6d8fea24dc46695e9862d27bdcac31bbc50bf7976282a5a42b08357fb15227c54419eff1cb8d17db3fa398dcdd6145d38f4c156344e1fb98e8ca336f282658fed5d7784a2e6f05c5041d84a6fff7ccfe4f3f314173d7782aad9b97e4894929f7dbc7847acfa2d28989574a54ae6838312989ccb79229c5e5af6c627274f17aeb201b43073531c9cd475846512fa2741de58eba9b2c84646252e9f0ce33c2643d8883ec00b263069c038c0c04d901648709120fdf8101129291919191911192359b08c1c4c4a8ae29e32925b45b5a2e31b9e3e653f1d715bca29698d4aa19c49e279564f05462f2b8cd8750cda3b116252687d3f522e7cb2be638991032898931c61459be79fde6ac238448625285126115d3cd5e16971012894965b17b7dad84e79090dc25ef518291912d8440427bcddda4545a48f110218f9898f2d459aa8aedacd0a0478076b00871c4644ffd3e3e5a1e17bb91911d63b43922a41193f4fd8bceb21fb206a23b0861c4c495932989e8e6d7a694aca53972d4c3478f111d3a7294f13b7eb8094a3032a226e0813c8d8cfcf03180148e41842c62d2856c8bbb9a2e59db1a4c46468a22ceb27b3a8a8a99fab183c46c55109288c92e42a51ab13b2564be0112cf8022c2ab4bf1ed433e7ce390434c4a9f7b47069db3628c31c484bf6456a146ac8f4c1662a2766ed41ef97ea1217f1106490e420831594b754346abb81ef3839858d982cab45f7e26ab2026956f0c931df4bcba0cc4a4ad98ad22cff284b0006272099da58307ef689f9d808c903f4c4aa279b9432699f36898c4d47ff8405108f1c3649937cbb9fe2fa293c408e9c304592aa71cd4a820cd91911f0ee430d57e1106c98e103e84ecc1465c10a28749b229783ceb8b8b79cec324253c3fcb2df67d362178d02eaff77ee7dcb6374808b983f739f7695a75778be1e3c78f8ce81819b92545881d106a4c2921ecaf4e0f24a40e59a8143a4784784504217498681a3d7b4e9f19539e42e63041ac5ac52dc7aa8e6f881c266b9c7f2c4f614ca831240e93e467bc45d39e63c51c02870923938ec6a7fb860976152f3fee7d4527cb0922c40d13835b887ea8a073aea82942da30417774be7652cac6734611c286c9a54cfb25797a3af5dfc3c70e1bec10634790314040028a90354c4e3d7aefada5a929af864961ee835dcee757974ec3e4caa3e6a7e2cad9c7216838365ab64a350b9766d9ece5324b970591359e61d2b9e796e81f6d33a319265caa988bd5d5f34a711bec00c2580829c3e494a3867afbf06ca127c344bbd8bf8b1b5358fd8c6182272553bb43dce939c530614c2bebe7bdb0e696304c768f1b2a6eb1cdf4852d1002864959a76cb37e724b3d867c61c28c2ef526830a73c1f6c2e48bbf227cc4af27753189d55521a40b934dbfe778ef6ad2d7e7c2c4d2a3be9ab623bad7106c6182afcb59fed0364afb256b2431f0e143036504d9817cf070138c4422440b1345fdb3a2e7d11c644e10cf001b21240b1383fa760eaf13ebe06143081626751459497edc201ebfc2a417dd94d94eee57a11526e5ea67ce61e5aaed1f19410ba9c20433a5bc4a99bb49db94ac9934845061c2c76a90bbcac94493255b8390294c1c6daab2f3a9dc0a67c9f2e0d10505215298a0826a75de6cc911da92b5e4713a870eb490284c9ef7b6939d9e3299ba83f405ce2010028549b9fee12a9ee96cf7f7f0612c071819e8018220401c8c9111be42c8132657f9ef7b323d22a4c6091333a6a7fd54e7693e3b32c224a668c75648139800648c03842ca100214a3040481248481c108284233020c4080a08290211dc012143002204200b0809c2014280408280901f2420c4070608e90102427820801abb18400d5d9010a0462e481a50031704a8710b5b04a0462d26680d6a21ebbb174cb49868392c6a9ab71a3f7716933fe5a0c9b3a511faa52c269d10ebdca9629c6d251613434ebc7dfe444b7d33a8018b7ac365e558be80f18a49bd9676e7deca72bc243f7c90d0a07f9004f117ac72a0862b267bb228ea93c8f9a46e090ae26f96a617a8d18a89c173c5f555be3e1d2e5913a39d84151373a8135a4da58b764882f8f0f1438cf61f4148f045182432a8b18a493984edac0693f17354b22686f3601e13319c875fd750c57a6eda3f444f7ea7e4176190f4a8910a356b6b8e12f6b9a263d440c5977f25632f63874a1554e3141353faf6cca05af3c71a811aa69898c6e4a54eb217abf3a59858713cef678a755d312926891e5f73519f19261dc5c4d8fb27d65b5f498535443141c73cb59bb64d65f84ad612117950231493fedddab49dc5a9d3ac062826ba769908d396f3c9a44f4cde0eafd833bf7d234f4cae9cdc46e558c79f9d989c55ae9753dda9d1214e4cf6d70c2b9b3d9b982c3a7bb65a6f4d4cb2be9e8f49e96c27d54c4cb4d8716f44375db41313934b659f2ddd598b332f31a94a8c4c8f23d6f6532c3151e7b52d79ac12936497fc24672ccfa90a2526cce56fa89447c798b3494c52af8d729abac263554312934b66eaba78ea16cbd691a3429043478e02410e1d39ea8b1c3a72d40772e8c8511ec8a123479501200f35223129fd8d5042449fd697fac76464a47ff8c8089a2fc22001520312134e5f6b3ef39472fc11136f2bbdf4d5bcc9d270a286232606b19d7f57fe3f74a6648dc44d51a311932acde92cca34bef7278a1a8c98d495f387c738ca82fc56b3e0998e1c35c911020fe4e050d458c4045319ea4a57fc422795ac690d454cfc0ee247aba6143eed240b020d9853d448c4e45ca13eaec542e60f8b49a8500311933a3c595c9041565abc821a8798bcbda6a3fa7c434c0e7f2a8c8b50d3bfb993438d424c8ac1c45edb6db0d79c109356eecf43342b568b0631717c445ed4a7e8c891100c350431d9db54ba34de3163260331316cc409fb8ba694e539c0f0c0c848660d404cf634a6a5df77a3d252b26697038c0cd86007093450068f1e20701bec20c188d5f8c3c4aacb1fa49fc9b4aefb61d29c5f08d5b6213cea7d9834aaec7467a7f4694a7c989c5d61e3a9c76c3a95f63051fe3559befe7ebf480f13336691ad15bcaf53501e26c5cccdecf2a421f7c1c3a4ec306e9e6373b679ee30d1ca3779c550f2e46c3b4c34d9bb38264e93cae13a4c3a2b9db5a263bb66a6c3c4b0ba27fad1634fe5394c0a8d0b372aa7ebf995c304919d635ee8ec1f7e8dc364511743e99e103a86150e937f636d8a8b9b96aebe619252b9dc574a374c120d36a22c64764c671b26fb6b8af36c57ca74c986b63a5dc7cec1b286096e166fd67aadfd56c3e41f311a94e6b0d94b4cc384ff186f964ced521e0d135b4d744bc6d366ce9d6182b48f1b9f498ae98f192669ddccacd4ca30b395a1f12e4f714cdfe7e08f1a64b03eaf5b0ed30d6a8c6182d4fc500ba3c2b8a7c43029281765aff71f2cbf668e7a7410203d369046821a61986832c51cdafc46991e95ac91600c32925f20f91864244f64a80186c99539aec8cfbcfd27be32d4f8c2046fb3abd59823456ebc30417374111f1b35e71c97ace188de186a74c10835b830e192f85a887cfbcccfaca1c61626796dc6caf3acd018b85aa8a18549325e8c4cdd9d92dd3a4959a89185c9a19563abe9eca8194bd682f4d851521264070dca15fb400d2c4cbe70adf4629eb6633b32a2e7861a5798a83a3797534eafabfc1989012988a8618549aa93b8183c3bb60877646464e48cc4ec4a1235aa30b9ef7246a7184b8fa70ce4d09103033a725cc024a10615267dfd8ea6d51555999cc2a4edafd823f6e1930ea530794f7dd29a52d29ece8bc284f110194fa5dc29a86b12840719407c042323a50835a030d17f2cf9e80fd6b5a7274cf87cb9b9d5b26e0c1d274c9026d33e585f3abd761326a61caae7c3079ded351326ab9dfa9cf9d7af275ec2644f791dee5faa96844a4047f3ac1743e892307153d8ffac9dab258384c9ffba9e54b80f1a5dab718409a3f192c9503aaea59111266e99dc8a0eba42cc2ec26379415aded37e81ab831a44987c22e3351f2e239654630893657312325c2a0ba74c29460d214c0c75713b7f4c35a14610265ba9502ac333884cb779400d204c0c39dae2afcd332d4ca8f18335a7a67026973ce6bb63a6b28f35b2b43e98bc9dadba2d8aca1dea1e4c5269f396906d1eb7524ad66af0605238dd14ea820c9baadec5c48ff334b6b1eccce59235dff1038c1284862e2665a94e1393ed0b9f7331394bd7828ab3d74a0f1ab89878b15dc962f8b4f6f82d2686fe8bbe9099912597acd962a25e0eb3393d97c59ca9c5e41c8bcfd4cf6e91161394c67fce11fdb722ce6262a60e6a377daf6c2bc3c78f20403cad073cf9f8a24e1693f2271399b72dcd27ab063b9e6331b12b5db765154ff267584cccb9552fe6fbf6499a3a68bca2919efb62ed475eb05d31e9573bdc4a476fa7a0564c1ae56b425fb3a99872256b3c7c906c0868b0e28c297ccc5479a56c6e1aab98f4f1f46ccab437ea35256b3f7cf4d801021aaa50fecf4c740ee93997a9b073d40e26cc944e031593c49cfc501f439a6652098d53a822bfe2373cc99c76533c2ebaafa37c749a256b568a893a6237938efb9f39448a49d62754a4efbfccbea398949bb22861a776d3834431419fcb6aaa79cab74231b1834afa553af582f7a0989cbf5534bfcba88a399f9824afcfea4cc59e986852e3acf5bcc92cd2b3d2894915a74f6397da1fef3931f1c3dbe9f7517af6a64d4cfc28ae795566ec82a5ee0b1a9a98e4967f5492d5bb59a292b5dc008d4c4c0a2b422de99866d72d9898e869f3f676b2cf95fd121394c6a43c7514b5a0632c31299b50324a0525a233a91293e28e57e8bca0e4544789492344c51315e244631293c7bb648ab42eb19623f9e183a4688086242626c64080f88f942a50de70e3131393079536da6b8638a527267f523a5c296571f1db4e4c3673395942de94d69d1313838b908d5a557263d026266e09659d83ca4183506a6262d2d4972c3b8f3e371313544f7dc988e7d855c1c4a4cfd82998b5fa052d5e6262a9a0b2c54ac8ccc72c31493dcc468b655562928e9d7d15b5ffeb2c176e506272f44c1953f792692b9d4d6282fcbcd3f04967f5dd4bd6caaa704312936acf64898b54b9fa38e1462426cf67e55efc5c7b2d061da4d4a03f9043478e32828c21c6a4070872e8c8917aece840193f9c0c11e4d09143478e32bc033974e4f8e166c668319009372031c9e466ced1ae4aa5127ac4249bb599d10edf9766474c92ffe9b6f3f7db36d98809fa272b27b11bf38cea0623269fe99c9b5a27cd4abff98096e0c622924166523269fcdfca8f8c8c8cd491f018438c1d6840d20b35dc5004232c6cee534469ae644dad4709cad6799c1d2fe841c61bd51cdc48c4e4fc4909f529b7db73acc30d444cd4d9ca4e6d29416ae02472b87188c97966db4bb3675b513a37dc30c4245db50f4f13f24a5f8598d436e749a6ba9ebc891013d46ed4ecf40753bd09370631d1c2cdeb072beb4a66608c16037ff808d22c88c97ba6c3a4abb6a82c1093b43e6c53940619940c101343a328bde4f5d53de23f4c54df31a1e92797e2f3c3a4d510519f4b870a2abac28d3e4c54d3b76bf3142c5a9e0fc58be68b8677d875f730396f2d6eb7ff63eca4d1c3e4cb39f8a65493a970230f933c4d7cc97ef8b8238487c941d65692a753a3e5740937ee30299e66111b3c87084b99126ed861722cf19a46a9d6caae7f71a30e93b273f02c3a9a3726b564cd472203c8066ed0a1b2ca96ad2934a56e0d971b7398949eeffe2fa3a26f66b821874926fee9ae7cdd6b4e719894e37f85297d7b17ad0f6ec06152d810b935dea3197328dc78c3a4fdb399bbdef6f2f90837dc30e1c3834a21d5adc3636d985c2a6cc72f9d795e2a1b2607398b7e62842efd3602800837d630b1f305f5d4a579a3dd2408e2406ea821915651a3593c0d13b773f6974f5a3fc6a06172d8aac72ebbf4db9e6182fe6c371aa727f46a8649ab6e722ee76edcf4cb30f94f09e1d941e7389727c3c41c6eb73a6fc617e18f61925c0f1fd4c9242d065f0c93e37eca381926fd7f0fc3e4d2f9154b7bdae01d07c3e432995299ee6d79e95f985cf1b644bc3ce65fee85c9729774e58ad9dfdcd485491e43e473945039afc485097ae7c2529f92e63fdac244b930ea639c4c32a9911626b76dfe72d150ea625016269df84ad565caa408111626f6e8bf9f9cde08fd1526be8c5f88a7fa9c72ac3041986c58fe0f274d73aa3029e779983c0f152686ca41bb5aaec7d19d294c4ca3952d9b348ff31d294cb09ce129aed5a7d3771426fd998ef93c14262815a62df492aa313d61f26b660a4aa8fef6ed8409233494f851739de4264c10c2834c1bb77b7cd34c9860e24459e92a751fed254c0ea375631bc456d456c244adaecb76158baf27616209533abf778ca34a489898f2caf353d5f9d947989484ee7c52a5ff3e6a8449a775646cf7a7b72417619207a1198496bda5c84498a4b2c22c6a87fe8df110268f79c5138f276573214cf670f9b7fa584a988230f9da379aa90e1026b77c6c932a2aa6a87f3051835905e1ae17c5bee18349b5faa934c874b7991b3d98f4a94bf8794abd746ff06052f4cdd359364a6bdcc5e456b3689f34e7fd6774313189ce41a73ded95542617139498cc36eb9c4d5a061793d37c36e58c714f7a6e3149ab6f27e1a782fadb16933bd88da8aae5eab91613ad47ada928111f312d26de5610fdcb795979673131c81d17554ac82c9795c52479e9f51d631b8bc975319ba2f32bca57584c8efd1e44ff9ad0a3eb2b269726734f6d72c5c44f1d9f5e4af3a8522b265e4ca3ea9db29f08b1626290137dc13cb694ce2a26b78ae6a8b09c623caa985869d777c4a9ae0ba762c26cdc8fe6bd20ce54544cb42e91c1c452d6977a8a49a2ef6de4dd37ff6f8a897e49f3c33de7524aa59830234a63b888bfe52429265f6ca8f4de39a9f7721493e2dc59984d63baba2826c7a61c3298b412e609c52459f5741ac6e28318141377454b85772b8df127265d89ab9e0f97d235c51313d5e29d6b97ca1daad2894921e644cf28b92d724e4c34b1de9536bc899b3631412d8f9685533ae6571393b352faf0d29c226e262689cfa573d0a543e4898909d6b9e7774ebfe7798949caa427f524a2252666c6d0bd1d63acafb0129345855242c79c1293ee6b93588fbf2ba2494cf61e3d6341c7dfc79298f0a29f6b532671df4462722ca949da26f9361b484c0a4ac385cda32ac9cc2326a86d6d17137d9f9973c4c4b71ed11683dc10f71a316994bae7c620b466ca3162b2aa7fe8d075e215bb454c9a950db2d19209f34d1196d72879794289989cf1dbd24733b9e934444c52b99ce5c56767748849de69f6cf6e4fd66a88896ed24429fdf0b12c1b85986caaa19efe324f7a071b8498947ce452cde3d3361fc4a49ebb9b8bd15973ba09614310932bedf5cccda8a88a2c10360231c193f686cc5e1ef64ffea3181834e811d8d1a07f78c00620266df46ab54bd1b1c1ab808e1220ad017363b418c85f8441c2011b7f98dc1fb2aaa4d96cc30f93564c55ea9efafb9cbb818d3e4c92f1a19535a9a04709f161923ea544ce3efc82d88061630f936f2b4f98fe322f6bb0e38390940021638ca28709a2b94bdb2dffc65712d61103d44148f0e3029a87491a5f29e22f9bd8c0830d6cdc6182e61a93567a594a8d232323232436ec304976471d15c436ca5dea303967e9539f4c63b0202c59e3c1a383ec1063070f12b5418754ceefef1abb214e62d898c3c4af4cd146b82987c969c4a985d13946cf1c874931ee37fbc8cffaa881c3e4b41fc4ca6f9a15f9be61d2656f568eebfaff6e9894396d10966d63dd5ada30b16ad7b7646b8aa3191b26cdea87aaff3c52532b59e31cd8588329775d9ad29937c86664c4249063430d93ca4ffbe98d7faafa97acdd8f2063d848c359f6e56775d3c6ac646d64040323c093830d344c4a4234845855d9136a6c818d334c32cd99930e3a532fe32bb061868931be678e4f724305b559d928c384cf97825ff9e5d1fcdb20c384cfd323a7b76df4eb36c63041a95cda46fb94935a36c430397caf5df05ca722636c846172d898727e91bf56ff6c806172188f517cd3b46212dbf8c244bd54fa83505701850d2f4c4ef245e80e6a61b6449ab0d185c956c1827b7c708d6f594bd8e0c2c47cf16acfc236b6f0e9f5b69cc45ff4d21e226c686172cc98328d8e576bfadbc8820c6c606182e95dc57832659cc5e50c36ae30a9c27cdecf736964ca0fa560c30a132fc6cd6947bdd7e4a9647bf828cb01460672b0b92fc220f1620836aa3049ffac54b757db2c4e8589a33a33e94dab94a43c854942a97c29e7d1da9d62a430b9d2ed5f756b75b8940424867c06660c071b5198e86aa2d545e9a8773f1426652821f4c8a9ed8ef513268d29bf5119375c67cc8613265b8a7537cd39a9f4b809eb9fc7b0a083cf994e60830993df426cb84ae9cff5323252b013369630297d8e67414354c24437a53bbf1f2b9a3e03369230c162d0b76823d37c5ccb038c84c9a196b5ed72ea247c3ec2e4cc9632e9ba9c299bd4861126ea7ac7d049875b0a9e2cd828c2e4cd3c174c84d29a59224c50bf9b358b888b8b67051b439858396de60b9665d4a88530c9939aac689aec93a769828d204cf4a45c6333660a15938609368030f994eeb84b5263cc563f98206fce468378bb196919c9166cf860c27706cf932aaad4ec28b0d183c95742a7a0757b473d08021b3c98ec27fa2a87d727997941c82e26d9071d54a3a5cdfe1a898fa43608d1c5e410153fc3764fe8f894ac0129b9986c2b1aee63b298747aecc0c5c44bf9544b5dcc78a54bd67cf4b81984dcc218633a4bfb419b6d9784105b4cca9e9e4a7a8757f6bd87cfc06b31c12c5ff6d096d407cd94ac91f468743c4268312928af8d25ed34573e4bd6ca6010328bc91ebfce4cef9c1a1bc962529f4ca12eefcd3d786231b9dcd49cff88f220af203f82ac8dd11f4824c97ff80802a49c176c088145dde6a3d941de5bb664ed2e0821af58b774989117fdea97ac915c0f425c1124a415faa538327630ad342b269b67864d1f132a8dcc2aca7c2a97be30db18121f29adee7410a28ac9f2c143839bb6e6204fc5e473ab109b51c974c8435031e9a2a911d161fd636339849ce2ee0c736ff54c2953e6d24a9ad64be76139534c0e613e422e26bf911d124b3584946262929bbae3a899379193627285583615ad9377527314934253ecb071917ad10a11c5c4602d966642d8fa6948ccec10128a492a5cfc724aaf51737d790801c524b5a8234bbde764c9cc4f4c4edf98a61dbb77b2634662c887104f4cac51f190417aec18352331638a08e9c4e464f1aed255ba30fa1c3ad010c28949ba7b357a77786ad2433631a9b36ce87e399547a489c9772753c7170523a2b09116e008c564cbbcbf956a4e884db9a80007282677fba9346ab469ac9f98e0e135c5fb888f8e254f4c4c42af7978fe4f6b391c9d982c428e59d234716262c5e5a0d4e7a437f34d4c0e3642f65b748ee9439a98143efe63cc49fe467f323151f4c78e667c78d1c1c4a458e2c974b068fed9bec484cb5d328e30dd2b8db1c4a49436df698b7945d35662f26ad03cfebaf1f4a7c4e493bb3f7e2e7ff2d5494c107afaae714954c75212937e83a8a0ca3ea9fe94484cce99b9d3463b1c9098307257f7a7d2694a2b8e474c4aeaff79ee41e4ed848dc0e18889e2335b418bd88d60c0d188c979dc4b99ec744bf3952c1034464cb2b0a926bbed4d5c0e8e454caed94e62313b1c8a989c34c8acf9e25d692f256bf6001c899860e2ba29e99cd0204ec3818849327309b139651bbd1e6272cc3dd3b54c72742a196282fa0a25338a56cafe29c4c4d3f8583afcadabdb84982467d5c4d99b76793b88491f44a6f24fb5f32d05312935ff7b58cf795edc404cda32973da5d286f2130c1c8098742ad3a5b0a574e49422c0f187c9f9acdae4f601a4870f64a687c30f13544489cd336219eb22e3d70338fa30a953a5d40a9f6b6663ed000e3e4c4e41f6e7ece6a792a5057671ec61d2e7763025e4d6c304cdaf39c3e63cf2c29b874977c274f8f533d51cbc38e0c0038e3b4cf8bcb771a76e34fa5ab256678789bfe3f6397ed070b74c1f70d461924a5f62a1dc3cd617831f3e684007e3d2aae6e3dcf2051c734035aec96021fcac92b5dd030e394c10d7b89fcb948e297a4ad6ca681e89870f04442781230e13d357aa4fad31aa060c38e030c193d8f1987256b2b643df60b657abb0d7db0b38dc90dc203d93cba5d8e92809b2e3044078f0a8400e1d3972e8c8a123878e1c93529676c0d186c9b75b4266c9349d5ed6030e364c1295565ede2c54b95b071c6b9860fa76f95238e580430d93f6b27252296b6c74340d93d34a558a9f740c8fa261e2eb097dd1bac782e50c13763d6f0859bdfed0cd30493d57a8dfcc25d3316598a083c77dde2da119a36498e0c95e4c676829138d61c2ab5c509331675d26c53069d4a69e7f689e915a186cdb68f179f1d2880a071826092bb7eb8d4166c6e60b13d7448cd85cba67f9e285c9d94b4ba7a8c80a5284028e2e4cd064e3d93f0593b21b1726068f37995f5cd37fae3801c71626e87cbaaf424d4911be16dafa9464dc8d978c31b230c1644c49c39bb8dc99b130b93e7edbf9a789e30a133cbbadc5cde1b463e564f0e8d3000e2b4c4ae7c162bacff2494e861824e50d38aa3041fbcb76e8314bd64e2201d265402ab0061c549824f4d67a74554c997d33e098c2e4a44bdad785ceef5996c2e4da7cb16a339f3bdb5198a462ebc5ada4fa6f64256b62f8d200071426c794971a7f969367d21326e731538f9ee9ad741efd639218061c4e983017adde6f2ca9e5dbce80a30989fb93c1d7ad458cc7041b99038e254ccc31adf3cf39a70a1d37e050c2042b37cba24aa609d309e2c3c70f2be048c204ad9a3ef669aef00e1226edc8a68b41081defb751038e2370c2e347d370a592351af40f63041c4698243eec4beb35c7dd2034e028c2648d5a9e5565b5d9a232461c4498143e6527b7b3d2ae8d8ce018828dc400871026e691dda2f45a64c0118409d2f3c4dcee9810262e030e204cb88aff9a3f9e52d2960a387e30a934c6686ad782c91c3d010e1f4c504f5feef27b71f3ef1f64348e1e4c4e2ac3fee61819dcd46347eab1030323236bc0c183c9295ea864394498f81d825d4cccb1adf6e62763526da05fe05f88b183e40922ba98fcc9535da4ecaea92e17b8981c42f4a7cdf68d2617b9c5c4cf1b6399ef775aae6c31e962e4b23308f941a416933a97c83b95b191913a5a4cbef8d2496bd6cc628206a5fb419469f5f7b298b4b6bf1594b2a0a29fb140b3a9995a8cf38ccb4ab64107cf2cd69ed21ec37f8cb134e81198ab8305e339e469581e89bc420722ae9824c5bc3c57de94f57225db8a8927a2bbe288ccf45095acdd4084151336bb376f10de695363eca041294364159362deac8b525d6a744903efe186511051c544731d0f155fb22e1ee30491544c4a9b599de3e5c873f350314959a7117ed1638af6a798a44757d8586cd1b92a534cd0c145d458a797cd839004f117e42d41a414933ec8f968b9e0ab3b9262626ee59c9bcca345b5870491514c5037cdb224544cf9aa4b900311c5e44f9f7a1abbd519412414933c53ee8a4925a5a982181493c6738a97e52b3c78ec88c12726fdc76c2adacdfbcc9e98a8fd6144765985c5602726755f4e19ef793d2e6c8820c289092a374d3f66ee20938c0c1f681313e4830efd2163faba740f1582882626afc58691a562ea0f792626a778f93d5f74e3e9be6062e2fb67d07ffae7cf2c209798f89a74b54ce92054505a62b2e712a646c8f493f9dcc1c383ec28a10149107f41252629195f937cf7501d235262d25552c2b469e6d9a8273141f6f879880c9ad42b8909f2a69256adf0a364fc2231412e9db68f137a198b4062926a760e96b139caf35f8441e20291474c921b7eee35a3469f8a2326a806b59564a8fb305619fde347a7482326b5eaab750e9efca35cb2fa23c818228c98e4a3b52374e8d39872c99a6a5642641113d5af5554cd74ff572323590211454c8c516338b38a5b15da8f2063b441241193ce5d43ecd65a6e7d18042288985c9f965a77643627c9530b5203c7434cba1451a2e2a95cc41093f2a88e6d675243755e88093fff9d54df97f2ec295903e283075acb202284987c5d9abd84a5f298f2b218880c6282543f9931c7253b95c64144101394a660aa7ec34058babd3fdb7e614513e0e14004101384d5a75a7cd5d0d60f2fa181e920030456c66b7f9818bdffd4c5b958a115fe80881f26979b061bbb8ff7a02e597320db01913e4c8c2a427eacb28caf9c92453e4cdaac91ab7b2ab46b36419b88ec61525039677dfe24c734ae8709327a07d1f06321734e1e26c54a556769643c4c1c4bb2f632e8b2acf70e93826891a163d2d9beb5c3a464db966bac63caa9acc3c494d644475c56d68974989451bbceaf5a83f4104242640e1384cc669fc355dc89278789d1b4062533a744e23049c4af4c45f5b7d295081cb43bcd58f22bca6f989c9d3d9a0c96ace357e80811374cf24b1daf94af8a236bc324659f53aca462d27f962044d83071b6748b757aef6af80f226b98ec19db6c5b936a9edb0711354c9049d467d714c52f55d230c16cb35d7f12a36192967dd95ac6fe52ef19266f45d7734b3adbe8cc30396cd24989ce5daaeb2b5953e3d128528689ded9328b5651353bef41840c2c0391314c8c1afd82fa919aefa4a60711314cb84e1d540a3dd17a5f182657a6184229b9263e6d487eb827c32f888061a26736cd6aaefd9f5248ca38244e3206100be4d0914303934205912f4cbad65e8ba9d63dbd0282881726a5d0e5232c45c92cfa2e4caefbd2b213622e4cd8d24a5eb2c4e7a8e5162677124f1e16edf2c6142d4c90e6f9316e5e8a41e5b230e9bf8225fd9b7743695810b9c2aa29c3c9554aad295cbca9de0bbae7442d4110b1c2c48a1553a712b9a65d6da00822559898693e57774a699765646464e4072254989c152aa975affd3f9d8f2032853d37ba75b24d59296844a4302933494ddf25d3c7ac256b12108902a2fdbf1dce7478b7642d0476108182e72968dda9d8a554060691274c5c8fd92989d508b9fb6540c409134f65d41ca489bfb9b3099334dd091597d51b54c88489a5b94ecd98c80e4ab78409764a9756784f8fae2961b2a611a7721061717189246162274d7f2a7b90e9194b84081226870d3246968f8d5794ef8b3048bc2884c81126e6186a3d7c3c2ffdf81d448c304955b41167559d3b9e83481126cdbaea68ea8cdf49488408933f8a3ccf68aa16ca7d91214c4a7622834c29a5783286052242c82e96ce9e8f297d6f256b34e81f24ee4fe241c818438c3088046162ae64ba2e7f98bdf6409818fc937ed157164245f120f283c99f4ab55526dda5412fe283c926fa83aeca8721d28349bd9da275154206eb2e17223c98e05bca92fb8e77a76817133fd5fdcc6b44697d743151c52d64ca9c2c66bb94ac15b31bb99864f1d42ea9c5ecfc9f09dcc0c524ff4d37edf96427a35b4cfc18338b5fb19af9ddb0c52435617baba1c47bfcb5989c43c91cb448068edc0440788c21c60e5a4c9ed353e1369398d2d52c26fb6b0e52fc82cad94f96c5a49467d333a7ec495a6c851bb198b819d6c4fb745242a86c196ec062a29b905dd5ef495ce95f31a992abdd65f8c870c315935b84888ee1736d64d98ac9f13d537f3e2f25ab941593c2c293798e7169df2709c38d554c381d73f6186b4ca77fc948242fe8b1c39c1baa9898642e99c964e564fa24375231b1dae5b34e7823232323ea871ba89814cca265cea6172d654d70e3141383c56d4fbbf771d93436c524b1d5e81fad545e7a90c165a019fc70205706b2c28d524cb69eb1f22037b555524cfcfc1e6fe1523b05fd287edc10c5e40e19f77b36a94e417e231493b4da2ac3c76764ec4f927a34095e0e3032d00304250001181ec0401ee2062826dca5285e392333078f24a8349165f350180a84c180301800c320f97d36001313000010101a9386a2e19050b8ef7a011480044148325834301c2c1c1a168b456291301c0e0442213120100683c28070200a65111185a05b00d5dac294272d2fe1a0511085d16adc370bf7937b4424aa5d14b93bde9a3dbdb244c3061c92ee0f866a2e40d3faa0cdb06f748ea1275c0a6c43ef501eae07fe4339a802441bc4b7796dcec2eeec4d603419811f8f89dc79c3a6922e2f96d06458b13282790a3cf9a67ab76aedfbf9c5b4f6cb4f355922dc06176d4e528d385ef2c9a969b39099134ef45465d28a684d117d5b0bfa3cea275a85a90a097640b3db51ab3c98b0ec3652501d93a878f2b198ea1040d64da8eda564928124da84d842dda2de571c6815649c0f322cf1cee253c7b231ee92912246af3106dd8ddeb0688fc1dde4d2db9c94f903bb7120ef56404490e9b195ca81a9170279a903dc764e24d37bb04957e6a35eb294d708bc1a726d5846ad6ef0c69a73c8ca48cb34f6fc82ceb5f7a59dd18dbcd1b7dcaa82712e25b13f72a4391a7fc43b0b4720c1cb0dc4770e84fea20f65f76a28fd94ff308343fd61c2be62c010931b135245d1cb0ec1f3e572a92e06d6584b774db17db5323ab82336dc65fed9aedc088042189e9e050a103fbe24259f7791340f043a8cc36aa75c1f4c5875ac74c859fa3c5130321689017831deb15192f0dc86d79a33cbb31e45238618f7f0d2dbe0463a6201ff45bdf7dbcb68f0b058e562d696e8f1a9fcaab1720226333bf1e0c1acba67d57f4facd5a9265d18e76e4e31f925f135fc88c10517cd9c838e331f4452a9c7d2a6df5bf0d8b5f31fce200b7f018a558b6b2ec01f63f2686ff0c018e5a1528cfbdee0a8e0201ad87d6c677101e7dab5405dffa24f234035317cb417749f8779ccfc82adeaae9388bef72b182b9c4c9bd2269fdacb01a10fe0cc0dfc3e9317c5cfe825baf4dc1cc7c2262c260297061636f8a2035022a8a5c1c68c06856af27b6f36fcdeee2a742f1bb9f69e958108bca1f20dfd8c061b2fcef5c32c4af848d1044d67267c077c44dca8185ea95bb6162a49c7d2579a550130418a792c1d5d9c2695e305cf398ba7eb02af1cac124510587070cb0938dbcbb46bf772d0aa5a387f97852e0afe699cdd85c3164a7c2774be442c09db416af6d495fb72f3cef168d33ace9efe455a149aebd986eaba024d89b212f4eb48a9efdb155823d7e8b9a643c354623dff8dc7a8e2e4989e4f820daca1101de5725d5f15867fdf57082b6198d95a94b0bdbe845ede70689f3f9909a32ef1035e432aba3e4554787fd3383ed786ee0476d7fb51503d8738ef4c3bd28a82cc2a08d5c8ad392549c86822ad4a4e600720f234b1818b30c5dccccfb6b18612bc9e02fd477065b1d4fefd67b558a18532693d3fe0af69db29c3b769acd49c95fafbc8ce6b93d3c7f07ce2e34fbb043081e5fd7d7d0dd283a8b10d9c8d97a13512dd4e903a48cf2806d7f44d53aa5752027e9f1f182c276973ca3047847af0c1f069c5ded5de9c67fdb4799dacb5d6b1b744969b8d065c0033acc7b6195cdeacdf27dbcd95bd6a4ceb626ee4e5dfb713335854985579b2d320c44c0a5bf3c8ef88e38799585ed631dab381514814f7df885cc3b4fdf61612ccab722b7f452a197c5919d9a2c89982f59d97e8727dcd3006f5d5e132d77848160884daf241cb4c78852a1d95384dba387ecd9c2a3f3d41eaa436d5c47a00902fba5f3958ff7b1933f8faf366281813492872d2df6180a68687df3610968881e27fc6493295eea2b5b2fe71f2848b2ea27ab8a540aba81cf7c815048a236868675678a6ebc065b1c97aa5e2b6f6b8d6442ea7562b0e25bd2c152dc5a5f8cb7b6838775a06e38792556128e064fb29b6ae00170e2b3d3a27b98a8c508a483334807ce3443bf5bccd6f7fc2e2d05f661cf38b60f4b78c7bea254667554f4eb7ce541e8c669ef9852fce20e854fecc8aaab8d2fcafb7c5b405efa6e4a6bf64d830cfae1ba915fbff1e29f69495de78643c96f6a784e7bae19976c0abd1a5b7fd05289da9e54797bba185589c482398a6da26298ba6b52624c08bffcaf50461219735a919f7f868ebdaaab6e73ae2c786c1d55bc4848c3d5be9b00f1e2bd54778a5b99559926651c12b22ae59db6f1431dfc979424e1a48229515c63b2373648ae8b0225b6f6f35667df198753f94bf2758613c08df6a39c147166762521ea291f64414686fe40bfedd247cead41599684c95ffa9ad5419da10bf901645dcfaec1c120bac4400762c2ba7f7a370bb4146f800a17092ec6cf814b324148a10c5bd9b8482dfebe80d6e258e1a423a55c54a6e9568edfc9d768db91389132c261eea1e7a8e0f8144e88638cd725d288464e99364fdd8d37d7d382bf4768489d03ab63cb71dbe6fed8db22592bbd839fa72a10cdb372860d9faea754bf90ba5ffef56fa68114ee8fd8d5a4a8c019301b2bf74cc6a6130fc044a1be1d176a3726edbb0732c622815022932588d2e90be14e9fc2ad94ec0a5b22d5de561dc5c0b8b5aebc2a0f92e44df7df504f29629a14e8f012fbd68806f6c654e87fe7c4f2c3860e9de3c8d608ed632a0e525732931b23c584d114e148925050629698e5b663bf73ed0d295971dbe2de3a1d994abf33d2cc22d68949e24d859d0a4a930ccef47cc0bf0f1a1078f4915eb122063d524f48a153a6ac349dce1b4041ed441fccc6b5e57241241d68f5adfc14c39b4a64fe4f53a46f89a5429583eaa204c2ba7eab86a01c3201df26507776605c2fde0944b2090f254962be7d04e32bf0ed8e8786b4535922b40fd1768dc1912d71ce5537424fb3ed996ad59581c98a9df4df0228b3a94b3dcdc7ee9d230b91c8a7ce2beab4bdf3335fe687002166fb52a31e9c52f4a55a8f381a52c39f9f925a627be2864f16fe96e18ec30c126a5c4d5fe90175b5571517e189332b8027cd851658ea9d60dc9227bd704d1911343b2c74735e16974e1d8ce905d64adae79c24bd67e07aea5f0c7613590aefa99374d1c85c0b67afcb255301cda8e790f0dfb220392c5860172d65e4dc9cca607bfae069bab4a4c5b07cdcffba9df46d6b672838cae96c6c1b194d80bb5900c4212e013e8c4092b4a683811ba5fda2b2816a2f0840b94661885a4c20f4876d5323cd4df09bf55a069bfbe89529ae9494729110474abe0390de397019ff1317d52e78ffb159024df1e863eed80538647aa2bf94a5ea95623c63d81b94a1ca299ae73c1b40e2aab2e3faff6e68ae8aa2c2106dfd081a5f81c843187ef0fd3138604cff8d3fcc4497fec0b28ffa9f36e1a9ddb21191fef06a9d580f2c122111cb48a8405c37847429f0f7a3a995ff21c890cd05851c69b3afccb451d01d4178c0cda4196ca3aeba4816369e979ac2aa83a4e3786126a4c7d7c9d5005bad74c3d4094210f807258564ab21d65b421a6c19a20f7f47e0ae3ab320e58fae07de8a42ba76221637958ba58e4f09ac6c4c0723f4000839f1f5c59d5abd0630797fe4b853f123813d8d1a0a1991525791d3b98310fb1240a41e60270f2d141364df6bd1d42532989f7201fd40b32f8dc50a9476a34907c8f2095d8a700727679faeda60885240ebc4eca46d0d2915886d2e049d13bb861aa6fca4e2fdbdd3f6fba5d61c4bdc69ff275f781598957482ffb1ac5ad27b0bb70486ed060253c3e076b226a43b4e400bbd9e0e5b57947cc7289a66eca0225f9bea95617b4202bb7d9e32e2f012590a3ae58c2e0e118e105e0c85c3aa513afa07f8365313daf9b39bdd299ad4568f32da6614db2e04aabf60aa8d510845815115e1269c121138edcd046e7351be2d197778d516104d3a9172c4461b5ff98750c7374185c48d6312a8d25424d588b186db7b658154282a904bc785b38ca71377402ddb674b73ef606f51493332376567b83f4b4ce0825ba19cb3a1080fc80222dd395e01c374b058e85f74df1147f2730a0790fa9d8592e9767abd76167eb529b5a52d3b4eb4b6d4ee3f4967fcc48e3fff72a6144bfa99a2ceb6f21caccedda08d31f60ae59d93584957e51a734a1eed5cf076554733f0eba32decdf278c0838ec40736ed9026ead298f7f483da5b03e1a2753d21cc9268fca62324461406905dc3c3fb21ecc57e4ce944686503d190e00d991a1fc01617057881e80cd49ee424e85c9971c5a06ca7837049e598340e5059bc16a82d41e89c0d12b3a56c13e64214857571548f2b4e76836f087727c17da2387935b6c5da03a550d6563e38a7e8dd51f3fc2d9bbdde8868a14b085a529144ea5ad13f5c99dae562f1fa0067c2b266da4c8b2a898863dce76523391df19dd88409961bceec5d0c0f23d6e0418e6e888bb8f7ebd646ff8d4aa31ed34a1d0aae87cc5cd24fd755c7c4dd0500eff9919b2662a0defe039491757311c2169d50dcda6e53cf1c949d6f0a48b7af4a15af89d4116e4b7114a03f2dff084dfd5e1886987eb072de1dac094d79c26bd406d1d4c7b39b071e9a8898da3db842c0a3c6b26226f3ebbf7652878f5090f91d85471fd9ca136c8eb814c37117a7093ca92a7e9734c774144494f05226c1a4e5be6ecbfa7e7670d79a9a0493450b04eddefe5296fc1c509074f1a9a9943fa0f4be2feb3d1fad12837e0ceef201e91136c9b2bb049c9e5735004363006639746936578030d1cd1244618a04d3e4397f5afc63a5d223f17a0c3d41eb133d1721aa1b7dbd8c5b1d53a851202c4e827a31e32e5d15430c7f60a67877965d379f8a4e12e6177281c8ca3fe03ef6d5429878969fbe7d55196b790d6f6b44437d457b83186af6e5772b34c7e706e0d4120737381be8cc265a53cf641191d284214d41789fb22dbd8a6556c33859ec22cc45d84a8ad0a8f834703ba8ecd94a332cdd345f1cc22ffa7cb7c07d8ef002693bd27551334cca99a393bd054555cc4882e2d589090217bfa0981db82f3359508749f143de6dcfd7d3808f84925f1a948d398a84ec26f4c66b2cba92ae61f80bcf5ee506359b983f56631dad079a05c2b53d5afc1937f6b58f0d86477b2eaf8ec3ff19415ada0a0d06b214b81a54871139199590a221c4748a0b744c7bc8c1fc9195f231eaf38e10f45e090a9cb36c162f2266b3f29cd46bb48994b3332fd86b3c1f5c9ef38149c2d5578b01670b99ab0c30834236d9ffe44ddbeb06cb078d2e66a9c9bce2ca461934e211f003d8f27c00c3d963c6c9b936ef056f84db7330a0a3de5447bb2067028b647017ea15b2ac9ca7a67a006412ab7398d03cdc62a1cc90ac2828711d879d2af788087234ac7512a1930bceb990fcd0bf6b2fd2a609eea9856914a3afeea8a551451ae8691a1315f8004ef9ca6b3ecbdff58098bfb29d23971a234f638e0107bc6f96a0425e2e668a7c979f9312942c46f76ff16207056fa8a36f3b790cfcd19e05f732c077ea158b24bcfd20d40159c832de9c7539a9641ed2163ef0881e308c62bd043aefad94bcabd3f5ea767b00cd400a9802d2a1048c04d2a1048c04d241048c84d16104ac12e21d6204727d18dcf9a7c01051728e22989ae38a6ad092798dbbe6df06e68c3c20069703ef938f11e7c83e2386e4e8faa8e32c868dd914a09fcfdbce31c5a7d149be9927ea64ffbab7e3ed79e7fe306ea4002eac71938481858092c24eab36d0a4154307880bd41df6007e42ed00024e09ed0e36e024fc3afc03e009f90e326024903a8803d4097b077e403b05db228e12b1b2b2904209a2a0d8a7a88d139413dc19fe01f084d841048804d14144a0fa305c5e1e603140934165c09e32e0952b04408d803c165ff089a72ce69a9874868c913665704bbd8c27ee01a6f9ca3bf638f9b03866fb6217d68ea72b78865bc86447b66e1c381ccdbdbf763e707a04f19331afd47fb2f9070f798c8dc8ccea2e7b35f6e172bcbb60a83e869ddf5a8358fe3692444ceb1155434c3fdbaf719c0a9a627cc4e8375cebcd003d5b707afdbbbe3a7e5c564e98106a8eb48fb60aaf1d6ebd21dcdb56f71c6710f1ca966eeb04c77f50a4624c314892879599a887ea6653065ef48546466ab34f803e58987e56eba2b518d08616b4e70effdde021efe14286fccb2d0cb5b8c8825acb2f769a52159c254a85e16d8953f6b975b2e13e7f5ae18c28a1333de0365ebfd589d8d6f80b243adec96347be5d3e6203eac4fc94e6eb09a9a8b471f16c11ab8f8d8666e81eac69f7d5de32aacb9c4522a5489a796a6afd59869428f0ddb64d8d0195e22d9479199d9ef6d553b99b3a95afa012f4f61c70b09f25e700a3955ab1de50f154fe8218d3beafbddc42c13507075b4ce88ff7d1d3e34c3e8fa2f910146359638ca2df105fc339e3c2588a5498a20949f03fe46f3ff96c9c13507784861d2a4d255bc8a185f81ce3b3806d4deee652124ed579f11530b9c9d648fe53fa8c791630fd3f9fd8c1d787ff7e722c119d99d7d2030dabcac8a7950405025e171fb3218899866887df854043402ab27241b8f50e2f4c8958258399bbda2e799f4012eada2207b1cda475455d29b922b0226156af1ad5f848607da2f63028de4e7d3e800ed790b53032de5b55cb933cc9bc16e85c3e12fb9ebd0b6209e9d7a977a69531b65452a3c7a61ca640ffa64a7fa483ae98297d997ec81c98df887e429f940a9e567221b0ca4d3482e91c219e3e2d97befc62a90d20bceb558d1065945f463b77c561a7244551181a52dd1b8b8d30bf4c32c227c9374612902ab48910755bd2d0482c502ba942d8a6eb04574691b59576fe249a39668f3d95e9466891c0cafc14152ea1b919072f0300b4d16c29174eb1006505341440fc14e6e0e9dbe81173ddbd32cccbe6440b5e5278bb849ec80102cc4244a7c7d82f3239862d597ffd7b046411e29f87f8294249574510386302f47dea4b6100973264808ac098b0298e122f7c7981658400ccbbf3a144b130e84e75e9108d9656bbf822f9258e9a11987cd3f247470e315f8f6a33349c9942dca074fec2253f12d0e956f1fc080b5545011389faedbf8cd171c2a3d9b31c5a29596ab53358d47c41bfdc0e297b85e5ea932ce85607d701f9c8a6e902b150ba8377eb81a77d79659ca049ac0e6a038bb0e5c2c908095c1d2911b7b499387525e3527f6b5468baf949700c3f38d261cbb42a9e9f2b2fdcf7fc3a328bb06a130ee92cb08dd10937dd07ed651f37ee4ceec0cef7dc086c82ab00b8b722e6953394613699501b1434d7139598fa964464e184e83eca3feafe42f32dbfb1e5ddb0cc681fd9a4084612db5646cd44b57f5021bed3e320d34409cd7b4540151a6ef1f6f672ee589dbefb2fbb01024db64459919569b8473f8eeafa0c9c66204df64e005fb404b37c3ad0cc5fd142ff616028dad51de81ac9b774eacf6cdec57da74215cb7c87de406b7bab1678e25ec01e8edda42f7f4eff7b0bdf3479ca09876c3a3d06c060c80e99d5c3b7846d3fc6fa48ec1ec1d8655459771c5581c4daec54d65286dccb3aba7afe23322440e06de644793741cd0ea1d94061347168129fefeec714bdf62ccb339b1b0ce6761049338e3ad3679b46032bf1d34b599d3587b6e9f9ce13ac4554a4adaecd839e96a809d3ec30c2324feef44190969a49dadc11931dd94da425d3d1098fb5bd1175493b014239300a0235b58689678adc9ab93c9da0824549068c1a830ea59978701a800f0c1d67e13388d043c3f56af5c94196c76598f95527c146088620af85f2eb72909fb1ace83e265a87957c27687d4307093e34baf30496175b156842ec4c4becd3fec76a82ca765afcd09dc3ee04390d274d4e41d387c30220415c5d064ade041fb37c9350c9178e0cd218344e8c22df145c2f6bf6d9fda7682ba226e2271ff622ebc58413228599b05e04b838f074b06c64daaac1cd7dda07d52cdd95a710cd5923253d0f29effb4c17c734d36208fd629df25d562b3ecde02731d372fac6d48403468aa4257541ef5dc48dc41921d95172bda6a2ced55482a385ba6c25293b7bc6b0d2d943048c81a2f2cf83943a059387b565aba71e1743ca4ea7c6c587bc0c1a41a2e0b2c1e50a35faebd84b9ab718e2a1eb587120ae937bf8e70523a8fb860bac46338922dab740e8d55f5524b7ea202f5a5032e42f3ccac827d6aa676484912a51a1a40f49ec214388d685000eda3242082ba43408f87820ca6b08164975fa19249fad264aadc6717f6f6c5e07c554805939596813f7c76fa5330e740b8d01d9c713222d82109d458da3871cc55e8ba3218c36acc353e6c95534ae46bc677ca3d093b45539dea876a162a2cecfbe428c2f67aaa359a59e11a1be6493c43201b84d4b4fb0d651a22be0780c84e27e8b2bcf2f452e949bd3415168b44c2e2d50a34ee4e410c2487c9166b3499a468e4ae0a0b477c9ec3a8078501f479369e316498e42339088f3b493ae97457868c2945431bd23e0481f82921b571b6e1d8d25a7a6ac256f61d664c77b5c698bc1e28090c7f54717986137468d5020055bc717247f3d7d37438df534a8105270e23fb10a14cf19344600123c5b70c2e75a3bacea305b1f36d9377458976062b6856d8611a1393e01509dd2ec62ac747279855d0b581bd431fdacaa3a04a2a7c8524fb3919643865c146e536d3fcddf38813abd50ccbd42193709baada62046e67ec9092d1020ef34f44363006ef6109014d9397a1bc1ddbd78c6e84498bc9f80702209bcd46c11ad30c6e62cf87516a45903c65fb312429a930b1ee72b3b2dacf03ecd8c268fca1ec19e42f60e3e48212c7109dec2445fa1361964fe87848032264e97724c4588b255a829d82647839265c93c166bf0e3754909b7cab68e1e3abc512702c898fe33ef3280b6bcc5b679349a4de1081f1f01a07e00bb12406505da0aaa5cc41bd85413a15adad60ac0e54f0811c9e43f4a1a2e1f96fadd2eeca5002eeb1208319ea1f393d527c4e87d8c4138a4ef7c86b0de5a796bef1f48ad7a7e7aa8cfe0f60124ac77a13600b56f636e54e584542f15a12a44512e91994405c18e5eccb9f045546c2c912d188503f9ad83882553fafbd911e6932c1b9393c193b81de9bc3379a56e1d3be1ed93f14dd59ae09b62a50e623e6bc5f29153ded9cdea5e64d6c7f131f676509a6468dc9945e4c2ad19142cdabf7e09f3655378e9f26a40ce1e7eab895594f6a530fa66c38d9315640448ad5e13e3a6b52c487057a1f1626711e67b0b402494dc743c001bdf3a252a880257169854b1a9c44069a5dad51d9d2ae5341337d6b19de3de973f629d95da7ce8a5725689aeac50276a71b5714e252acb9d1af60a8bc917c82b40806826cafac928bae2ec1b2016b526d28ad5e9ce0733e8716a5318683318680fe5101c19b074bbc7721c8915a9efd2381b6418c257055358e4d62bee6f61f85953f37929e87ec1195d70fdb31d77fe808f249cc8f2c114de9cb4b4c8eacac6137a150c38332393fa11a5cb373674280dcfe3876c0a18b63c54d38d928f18069d005d87963f511a124cbfe122cab416c3aac9c0c1d715753f183d04580dd4a3af4c3a6b3a52c70fc8185595a81cb2614b662df1baf5499311420224902baac05e6776581b0e97885f1314c4d71c87a6192122562fa50dcea9f2beff7d22d97cd9cdd7179c205cf24551d02c4e43f193b6de408ef4c5450fd2c63692ae75d80c816298f4544b69f5caaf5111284ae726c16c3b6e7afa2fa28cf57cc9bbd38de585a5902a4e9cb58751227844e51caafa0cfaa4aeb5f16688ddc49ed5953a53023908842cab2dfacc68c9b4bbf836cb14f438cd6e4377ee1c59274f8551488fbb01df2481221fd96cb6f58c7e462072c4c309397bb257edeb91121948dc2a78187b332ab4098cfef52e508c6e0b3342c0aa2c27b462468079964628bab5b457edada4a68d5a42ec62252fbef6aabd45919616bb80ed551b932345a2aeab13983ca2239af5ab6bec3ec8b1b97d41185993121a7962cc6f197f412cbafd2d936ee5eae8a644a2b38852d0590f4a919b62e2993fe8123fe43db9e071c57180273fdfb190f435a4e2bb18a4238f2da4f390d5a0e66cc4868d710b6c848ca1f7aadd7326ca0a94de239d23c71ce1e9df91cc449bbfe916b509e2b805f24dfc9ced8e29040232fd3ea412c94934097785b6ebdb3fc460152bcbcd007a407411ea4cf57bb5bbc20a8da3de1843dc8d1ec349544dd5c9cdd6b919a8b841ac6d660e0dc739892554938a925a2591af6b3b173017f4835ff858b24fe3518ea69f32db44ab02e7c76f1c4568ef98d1f2261f31ebc731a0ecb5832e61e0cba11a93d24f0bc1549b16651255a6c57490d078736940bdc080e9cd863a9a050482a4cea3f0d12617c71053fe427db641983e203774f38641b3120fce36308125c3848d1e7d16f40304c6e48955a73ddbfd7d4207202eef8a1b1146d889fd7e6d93e761f12b88b46fac5fac89cb0805565f9b5329f401d184921160e73714644c694e05d205b3d611383873d4de396480932a871dc21490ae2fbf6bc5a65f5e8e717e11d714458848e68a0cbb79b683440aa82bc28967dea5a8c5750789d997e9a994822f357a6d71e9ce23def6d8e1c0d765e2a0d96be9c75cb420a50e3825c62af53cb0b3255d2e7f130f12642e642f0ead99bce3a7bcf870f1f576caddc36f24f9981a108db418c92c906d430dbde9cde406b7468e9ca5f79b470111f312e8e608fdbd25cfe0f0b87bc02e37c77db9f6b34340c88ffeccc64f5d75ca0bb9012a428000cb9bd42552e6931852ef48434a626920698c025148a7707f79b23ab6f95bc46355b52de30ecad0f571f5c98aec4b55f9f5511fa9c7ea1d47f3461599dd0200da08bd32294d9f32d84e9e199f7728d5852366a756d6b1571cb1ec0f283b63e817d8405295ccca2c7a7fd06f1cbc75be16030ce7601df1f8a77097e8722d139a2a518270ebc9bb21a39d8ebe834762ab6c5b72c250fafc500cd53802569195666d5976961d139725423daad02617f54ec299bca823122351bde8109d915952932bd81dfc27c291e6ad2b0c497b14a2a9e90a03d4299a77e2622d3155bc220834058ff1b3432ae8f3553c32a322a2be5ab61860688d6be48578f82bed23c8f85682270430e82137004300e9964af634a247836aaab50184cfd91481b66001ee92f0f5bca91025f0edb00f4f037aa545fe7cad026b6d4f612fc47fa702624ac0e4b19b08cb6c2174d9c5a42823a9212561da1bbf5fd0387f481fa73f5281ee5436c47a1bf237d21635331e630cfafc8b3495db00986ca2dd27b08ab8ecaca1915d68aae016ad8693f13a4f08f246ac0ab3443479ca545916896400d6fc7f0365c06119491b8d07347c9585ee4ddbb455aedb8ef0e2050ce2ed83f7fe336a87be6fd155cf49f5608f72d2d9828f0059aac90d1f1a0df2f4919028459dcf58e890d278857a6867ce705a6f2a0d07e164df29e589c0127d13d27ae81f9c89cc897fc2170d29b50b302a3e618bc5976ba0c425981972fe247cc9c123e616f2a32d9b9794144126b39ba065e5a0cc0c31ce3926ed06d16823cb3af44a01c1f386cd1b86d883d89c3d679102770fb2f742d147e6e84851f7504ba2a4a28a472bf6b80a47eb4bf14465d8e4ece6ec83b14f46983b54ffd601c6a4756bc5766b323d92b0c320ec3029662b8ac27be8dadf0018cf79ea0e0fe4e29e6bcd9b4b6257bf8d0c95cd83c7c8c1558ee6546e8e1ab25e2a7d80ebe6e5b00c5cd17c9b4415c181015d33bf9514ecfcc2d6a3109c558d03255635bb316e9773f1697d053f01a3e90838654e9e7aa1ff572b9362eb55e854a0f2025d856a91e1e602704a3309744c97b200c1c99e01c40fc08df595e589685e86716a44d763a67fba742598466307dedfd286ed3905c0063c417b0172e29cd33699bc1ab486b3c212df3582d9b56d0318e7cae34972c0484335488882ea627a193ed74450e7b09e27c62f949ef36be2c323547af46b7ae9da0e51ddb0da312be1324859d1ace7fb0291e7bfb7baa57d9fe3f837ddf08cbb65052a85d880af88fbc66cce50d2acbd522d8fc1a4c126b222acf4e7b41b1ab020c15653472ee4536a7ddbb835dbab566853af0007a4014d6632ccbbc149180c71e8a096149a5c59f3fa63a30b75435a8e486aa14a1215320d5b06cb561c2f2aa39efa527f001917261d078f43226bffa62cc7c32898175ca3a9f35e96a1adf6257164425c1b9ec6dca29400adb3c06e4261885c7d77461b045e3b98fce5a8ed9f8245e95f84c2881c4f7507160d490cb9e6d362f62044194c718537d9115aa4b31a09c7da1ca1acf530180ad8cdaf1154ad7a72b204fcd89bed316067db6635351228dd0c405eca362370889bcd2aecbfe9115b36a5270e6e805487ac63213b9f28d1b8c4187c369900e956960209e74662b6d9d7108b60fc990653642ef3a8c9bed3c11525be53df43908e2e69e66f958910f12e137ad8b14004f13eed3dcc3cac60f311bd71495856e26e97b7802e18b37cc09080ebf6d860bfdcd4f86d8c0ba8ac69cec652ad63918542c4a1010e45572024b03ba53a5fd6e6f9ffd8db587ca6f21ec68a0d1b019952b470a92d716522f3aaee535b99135aad40693932064e45a55d81b43410000a8087f10a539cb130ad7fc4652cf1d3924ca42cf59959a2eb9e4ac589fabb825a0d19df15bc48f6abc0402798c89b9ef8522a7652ef9a5fba0fadf2ea181d38445c802101541df4fa13e0867a6436a439498f580d751addbd9afc561f7914d9025164fad209c2dde8a18de2f785bb6919a76044c7d3c7712817044ed343a46a7d9bd3a7333a033a5291a34fc185290b51097d29ed3a0f96fcdf5246a35270f8c4805f771e39e477d5464af32110f2c5b2691d4e44b44192cf4da64977ea0354a0a082ebcdc6f4a236d4896a718b6903abc6a9d1e13caf57be25f9ad652d11580f4083d6c631d6f3886b7bc5c41dfc5deeeefeff76cb061e6ee1c0e1ebbe3934822bad9ca60c498e0be4567d0e7912a91d4192dcac281626c2b4fd0a8b19367632d5fa3a698de6a3b48a798801c678c83f8d4e1c0106828984bf8d715c56fa938875a9e5a1d004512c41ee0000b403faa668b4fa3f61ec20cff9d607d73c5c18daa4bf2f05c705fc5f020236e9458e1407c523022dc154c9985887ec9e69ffaaa828906f38d53545f5fdbe7b09906aeb08a4925789b157bbf2d273ee6b4db39aa189b59266705fa4ec0e2d0412684b953cfbef6b85562c06d115b1cf8922345bf39df94265994b2117943445c41a59b27ebb146c9f857d10d80455745c2d3c83f21328a3b77a62c82e334b9fd2347e19b3f8ab5a4aba5622c59aa123076d6679a9fd6192691a4b3b72fcd0e0f5aac92f4253e308c90c8b9f3013bebdd820287e13f3fc3088238a8284ecf907d4b7de0f5b1182c10c897b3fd3439b1df21f2d005a2597714bc244d575195a17661485247c2ee46b2866473651624ea55ec27ecd2680c7154a744eaabebf669295aa28c5463e0361f995fb1b9df9790852829f6817c393df08a24447ee850a2498b719bc0cd25254d774a8b252e382e03fa8f34d893e64338df1a8922c7332c893200b204aedf7be9418761c190c29cf3df43a64f430e8509cf458035bb776c34d8a50189938011896f889db08c0ad82e68b314e146662775bd5994d09280a7bff295c1a5ef83d72cfe15035abb8776cb46b7d3f46d285855e1a3d9a11660aec5daf6a17b3d97179d7eb2a93bd9b16dfe9256b84940c32c66c310c19ac27ba543bd5149a2757626891e3fe6970c64875d8e77315a49174006199dea6ececed43846275d2411500443b768ff08ce5a22d7f7f1f311ff0ff1df46706351bd041f8aa2b7bf78829b572c4162894a885f85d2c5aa26e5651f7491b16d60b20bb956924e210568ec89c74e1f483c52fd97c3e113e490d419a74c6a0dbde1493b8cf1944aa848a1f57d6c1ee0e9a9bbd6bc002262e437fa8253d0394aba8b489817cdbd7665043130c881aa36c234b8ee34b5b40fe478d663b9ce1c57a1fb74cf4979c6d9a41313b866bfc3d54314613f366a888ec1be5d371223d41382908d71b4c9663d3b8475a21add0adcf2996b8a804d471a816db43398cfba73c464d30fb2985ea92efd615f8f5a221d827b85077eece1f1a7a667f25977a6e9e10acfeed8b37c9bc0dad9694024c380390743507e60fdd232a63a5411f7e7773afeec587830fd911df7320ead2d899389de540652a3eb4b79b26c0433157d2db179666f778574814eed25e8d0c59892d350387d42eda4db725b498c2d405c42ed3203edc8a3f8967991ce8f2d6264c989d2b04c8018b9dbb93ea453467d51768684dbb99e5b213a07392541a97573fe1fd7c88bd027eaa4e3c56a6d610675981b2084e8e4bbeb2c8cc48591e515936e65747581a4792629ea7069b72b5cd66120a9b7d22f63f890f59bbd7c1cc434808d7224cf80059c594f08a71c9769238ef19fe77ad52a4c7e80b7c259777d745fec9b580543c913979a612f0a58c65a0a90c0ddf0f4bfaf62500246e9924cbde415a2466d7914401a62912f454592f07940d0c33f3c08916f2adc3d13246ae2e41c3b9c2cf1de7307021cb5af7897a386c8e6b3b999e30aa391be03fbb23f20573fdffcf494f974aa4f533623410cab9fbd1413ee33802cc1e19ba12135951193c53f63e7b5aedb3ac3d90e37a60632955db25651c5f57b3ebbd94b14b5ef00602d95605f8820518851a0528a64bb8b10405aad0794fea13b212687cc3432aa8fb6840442b0d3702ff01173ba2c60c931ca5a1298e1d87c465fb9a3fcd462bf8e5ae7273ad5b9ca18f43ebe32dea871cd17d318580249f92e1944604784e7b1318262c844f2121548517217b54811f2073748e9f2373748e1f22c3e8103f4566e8d0bc59a877d757d8cb7ddb9a7132e473eb9f39bb02d03f7bae7dd47362064658f0e2cef42946dd326380b22240348eac7f237235d9e8880147fe3b8b54b37c6130efa8d32aecfcf1e0693ca12810b894662dde82064a62ec630c290d4763830b231e2af4e60eb8788f32579441a3ac85f2f1bbdc9fe865ff4efddbb1bf67276ada43e99aa0583ae3d14e06b11c7b86398b6ad6bfb66c717795857b6941bdb500bd5b18cd4df9f8657b0bf6c2827bf1857a8121f52e17c6a283d2d8d618da3b0bda4b0b23f5228dd497035db102feef44a70c3240b0a6d0013c0c3c0c3c0c3c0c3c8cdffabaf51c5b9049a622777f344320a494524a2909873a909dfc3bf877414609d15c6aa70cb60c410cbc9dc53a39a7d08dad1e2d58418d1e3b78d4a89136a0e10b835808712acfea85612c969cfbb69238c28417c60e5ae6e1d974e813da8551674e2ea5723ccf17ebc25829e774ed41a668c77361b0a89b9e4ddaefcc860bf395f6ca6a595d64bd85e94f122fa7279c4e626a0b83361316d3b4d8eaa56a61b2937397583e4f6f420b534a5352dcff3f4fc29d855946255b33af311351167f75e5e073c1938adc0d346261d2a6247d72c9f19d64d7831d1fa851a3073b7af4281ab030a90e1726a7434e895dd37885417c12ddd3d4b5ad9bec0af3651356fd22caba746c85c12f7cbede54e8141dfcfbb0a1e36ffcb061345861ae0e35d3eff3d99171e5021aab302fda5d328feef62a0d5598a4d3593a9a18bfb491462a4c62944969753a4fb4d983d76127386a8c0ac3c866959d2739b6e9689cc2a02ee50eaadd845b2f6998c220479498d355d12885d9cedcc75310ab3c220d5298b47559ac688cc224fe731613fdbbb17518ad053444613a29eb2696d085c260727a0c7d65bad53e28cc1eae9e92146b1a9f306a9f24b33a4923f429a1e109736ea5fb12bd7f26f74e184fb43d2926773861be2427888587e5e5d2260c278d28f330d9d449234d98a49ce4acec934c18e7f7c205e52126cc6d4a4972ee941c4b2b19031a97309b14a12e88cd12f25e4b983f54909fe74658ca5709e3a95cb05869cb04b3d0a0849e225b156bf15a3181c6240cea4ece71663f88df8586244c629c0a2d2af73f7a452312c6cf295b9e5a4ecb12244ca6277db894d49924ac341e6172ff9811f1d3131115a6e1085358be0b7676f25b07d16884b9b2539a2d41c927cd087349267f1a53b78b212b0960a0081a8b309bd221742c391df55784c1b4996c157a633fe5341261b858a76da2150d4418e54ca8190bb3917f7208735092745d495732214c8630495e5a7b7325cd94be10a6ec41c97e29432f549e10663751c2c525a141184d92b46a5c4ecc5610460bf5e14ce482924b1d0873f60ea63aa90b0853253d7dca6645b709561668fcc1683aa8895722f3637532d0f083c9a432612fa204bf92e328d0e88371947fc9cadf9b31273e982ee72e499ed4edfcd983593ce7b0a2a637af6d1568e8c154a13be728793533cc3c983ab4c5136639bc738d07834a9fe5d4de7e4833ddc1a02439494a12a372ee9ced60fe287a2774d06962a47530457511a25410fba17d3a98b2c497e0d14b295db939184487ba85e54a0e06e97e3af9982a39dc8a83d994943cc489d4f43569c0c124db69db1acdfa0834de603e39c8f3243a9949d24ac30da64f59829e13bb75716f8329db5852728c4f52ca49d86072f7f09444cbd8f4cf1a8ceb1df7e49cb61a0c3a98cd4927c46930c56b0fe25976fae28c0693783e61bd92eab9ce9ec1a0bab276d2b9a3ed5e33d85194b8b311d232989497b035694d4c5e910c66d90f93a47ce1a268380673e5bdfd203f880f171483b94367eddc53180c3672926c26c7c7f40e0c0679d2cdab4857cba52f985252e5dbb6ab1eba178c2ada996f5fd2fdad1b5bdd34ba600eb16b95e25c30986cdae157949c9bfa160c5ed6b5a5b2a8bdaa0934b46036c96eb4ca7d8e2fd1fe018d2c984de686ec9f288f0fd3c082d1849165d14d07517ba2710573125b737f925c86e9a0610553d8532a4f4ff298e357c1e8d7352e4a8b9bd410158cf39de41c31494e8fea148c1a9e54c979384fca4334a460d4abdc3bbbf39ebe14059358e9e41a2525fb3e6128984256a77c1def1f6d6e42e30926d9dfbaa762b5728a9cb09ab24bd731499a600aa29695c4ade3749809c67acf96473b4b6309a6cabbfffe294d4309a676b914bae2c6e57837d0868046124c9ba254a9d227dda85e078ef3e37b940dd0408241678f9583fd35a0710453ce5fa9a0fba47f7632a06104e365153d21272ee9e0298679e59468cf7f16faea0c6298f3e5d52e8f7edadbbfb1356af01ac00f338671ac7575dacb67e51a0bce1086b96349a73a7a2cab958261d27e55c2d6c496a44b609846cc9560f2a52628b919bf30bd49b2e7c95e5b67428619be309c5877a276eaca76a55e9833e4af5a54e7a9fbf0c2b09e72c9494e9e5495da8569363f07a5b4df9ebcb0200c337461cae35631dab409df4930f8717284a0460d1dffe3c7c99166e4c2f42a4a1e174679d3f761699663f55b189432592989c9417a3ab18569d4e2a2bced97984e2d4cd9fbd947897692071d5a98f26479d2affc79645d4e153b27a14a491606654254ee50292771e7589894854ae27d5cc9d16158983ab957fa18c284f95f612ccba19e45764f9fac2b0cf79ec27dc429d3735b611cb3ea5151462cf4c90a93de3239159bafc27ce2d56d9cd29fe4a82a8cb6e7418cfc140d115361f2f550176474c9370b2a8c27df892fe1253f957f0a7338694c85baad8a159b610a739491da1bea939c706794c238f2946c97296fb288a3c78f528119a4307bee0effa252a84ea15198825fd0a79d62b97a5e1426f129de71d2d75594a13089967b897951b4971c280c4ab6ea91595a52cbf509f3e83461de9324eb5f8a27cc9e4413c4c94dd39def1b5b766574c2a42cc9a898786e633b270ce727f69b9cef2a9a4e3661c6264cf1dfdf04957b2f88481346935496ba9c4d509ef6106664c2bceb96dd94a46ea53d26cc26f4f5d98fce2e21ba8449fa371b0f27ad52674b18fbf399c989a246aa560963c995a2283928fde6a184693ef5497164c80973c991243874d86827cc9884d9edb49ad4fc1495a492309fee7472ac5061126644c258d9c6da4b8fe5cd0d095365d5fb9c788f306ab65af8b27416fe9383078e1e3f6638c224d7e5f9b83255561b5ba5a006367acc6884e9fa7a4d09725418d4a8b18c30ac9bbcf9399f124fe48b3025f59ea278b458f27fde878d1a351ead22922e1fa7cd4cf7de83198930a8bc276f5d504b151e4418e5ea77bfd37a1cf4382f48661cc2e833e626a5c88630c953361627e4853056dcf7dc8f95320861d2bc523d39e79c4a6807611415ba3f499e8497d1da608620fa3ab5373adc1b086378da8bfd7fc5bd8030282994244fceb6efdcf983d9f2db9eae8b55e9f2e1e3dd3bb0837741f30c3f183564bf3b6953827ffec6968ddc197d3009763ae53d7f6b3c449dc107835fdbc9122dad99ee7b287f5934a5afa208fbc696eac16c615a62555ea263e31e59cec8030f66e0817d30e30e76309464a7c45907a19b5187740acb49501933f2e78d197448deff2ce1af1eb582e6708e5ed25c5a926e9921078392ba9328e2ec1e3f7ccc8883c94f0e193f4a99ce3f030ecd6b69c61b4cb275f4e7af4e676dcc7083f9e2cfe550825de56c9741860ddcc18c36986e774c4a729adcd8ea814ac70c3618c7e457f3f738b977d760da731debb6351db6538c8c196a309a24a7695362c4ccea3966a4c138e37b929bdcd94c123498822839dec8f91c6dd733184db01e55aa7debad66750a6a60c36698c1fce521ef737e1a259e6e6ccd2883294e0efaafa49247a918190c7b23c62b895c08cfe560c618cc5bb1943a73abfd24ab6230a8f96866e11eff43c787c12454ef0579e283ca6f4933c060d2d114e1a992fd27f9195f30e7f1cc4adeb73d171d019ae10583ac14cec6fbf3ab5c107881086674c1a0735a4db2ddb98afa8dad32c10c2e98a267353d31daf24ae8c65629b32d983a58eecbed8893f3c1dfb0b6f183d3a3c7a931430b06cf717e4a1e3db3f5c982392b29d922265a293a7ecd0c2c98446b9ae47a8e1d6ee30a7889ae72d556e6fe8d2d1b3ec091ac32ad90c9ad245bae8a0a0e1b3af8e7b1386654c16c4af611611dd6933fd071540533a86038b3a0c4fc119d4f49721683195330884a7b27d8ffef89100e74ecc8c12c982105537ab17c4ad4fcc656144ca6a3f2a42e9339713483c10c2818462dc743092167747d824989f39b951eaa3f77d4842898e1049324fcee882ef1d7824c060e7fd404f30956db5e92d88dadb4e36df4d8c104530825bf993a3115fbe0ef04339660f4511d23ced2270dcf8d2d1b3a8efb508249d6ebb00b5795956046128c9623c3655f74632b7df4382bb07a641798818431cc38429766bc6445bb34d56413c30c23982cc775888db44ea2da415040318c1e9674285de1e4a4424d0c639af8a1cf64cbae2445050ca32cf6e7f6fa311e82028461bc9c4688bdb81e260e86792f4b7e5c8e960a32609893ce9393f726579824bf30c9490a32cfe4103be5fbc22498deffe9fcf20b592fcc56e2d4c7ac51d225252f4c92b839c94a1295c3590ad885b9c7b57d2f961cd1ae2ecce9241d334429932e2c1e00017a3f3c5cf08337810f05e4c2f8ee298e12df2900170ab885d1d5a41ad1cf29c0167e3e5deb275685080beee041e01f83b22f63078f6cf8f3a06bd109eb73a2f60421eb8dad10b400023c0505d04201b3e043e56472504a502a4016550331a08058185744cbc47b1e93f5f8c14301b030af5eea58e297fc27cc1bab9050c02b8c3ab75f3a773e45ebd915a6ad13bd7efd74cac2d88a54ee59ff458b03099ec3c51d1ff25d966b2e7dcd5a66e5f5271d2da7566f61924cee6827a7dd16a6d192ffd28cba16a6ccef8f2aba53aba6b4309f3cdd1e3bc6c5849dbf10320be37b769c4fe6e541a5bc10220be38518ab53a5ad51836dd4c5a26ac0a26a9c9057540d0b7185e192f6194fa6b6c27863725796b4bafcb18a15668bfe26d9db8b8652253adf036b84acc2ecf3a9e48732dd7f728efb781b3ef81bd5234415e6bc5fffa9849f64d575482a0ca23bf5c91ddb2b1d21a83049925f7bf21e25efa418022f10c1f916bce3c8e1821a37424e61501ebcaf469a7eb3b029cc39c9b9c2bccd4ac9f952b026f272afb529bb9b26c89be785dc9b14869123b466095ab5c4b903478d1a21a330a5248ba85aba1c9414168539e9b9274146eaa8764361dc31395ec56e9faacbfbb80d0185b9c2043b9daae4fc4bdf274cf2c9dfde4a51f3a4d3b1c347093ec413a65f37152c65afa4e3ec84e93b87ea3c39c7febc0e0e19a53284135cac6bdd985c8a89ba796fb92861946f296413265131d94ea4fa78993508d184b19250b727678fdbda8764c21cba74dc56b44fd252219830078f225abb1d38cc422e6183104b54c2f0a7c52df6cfb8251d8750a205219330a9ec29aefa7fe42e899230e9a4164769aaff85789130dc9612ed93af1c4a66050983b853494ef9d4b9fac286904798373c3ba53cfb79b562218e3025a59294c45b2b9d28aae075a8e005218d305f7a7b8b6f9f454698929294e7d99b68a32636421661d027ae9208a1355a7b88224ced1b72f9feb4c4ae1e3b42a0831d3b4ea003c78e1580e0c60f1c32a8eaf1834716421261905dfdad1be197c4431061523a9aa7d62d398469dc8390ee27d5860c49106208535c050ba65474c9398548aad7bbffb024680f84104298e3bbfea9ab35bd12fc1e367af03ab43c10320853c5d78d93bdd2c9d21b3fce0af0c68fc3037ff0c3304410e6ed9cdac1c4b83e2df7d86143478fdfeaf19c829040f89ed2569487b8dcf8715650a3c68d1f87478d1a3ff8913d7ef0d811020883d20e6a4df5ad469f8820e40f576db55bbc97bc767b878ad1a53d5e38dda91b84f8c170ef1dfef2586e9794159c0002cd23a40fa6aab992b92c236a2b3e984a7f32fbe89e7745b507c38cb8bb339159fd143d983e9e55d299a33ffaa3853a08c98349f84c53d59ee472108207b356f9857b17a1b3dc1d3b921c2177305be62939b6d89ddf7f63cb070e2e1f3970fc282333106207835293c3ec7f12644ce88a39a40ea61c437c9bee3a3d0878104207738adaf14ed9e70f72143207a4de6fc9d4ffdcd82203478f1fdce3870f39183c980c99d72745bc1d1207d34977537bdfa162cb217030e849963684eb5c25a59037a416cc36abee56dc52a7e8471195c228e174327aec0801193d76242884b8c16c72af534eae1893478e42481b0c72e5b3757bb98b4a3236982f66ee646ee5103d5a83694db67cdeb64baebb1acc633a6dc5ca23f5649906d3a7132e9612e23b558906c6d27a7ada85ddabcd5978b60f722d07abfc0ce6784ad231ae45a9b6b4198c6a1654aa93e6b16b96c19c7ee6feea244972edc860b8b393946c9dd4bffd18cc65ca942c4a1a0f0f5b8818cc7943f609a5c4b29394c260181f31d9ab7dd15d8225793572c8174c73d97d599259d26a7a81af946333c6e282a5a955987c7e39bab282e96908e98249fd3635d3b44f88ca0583a88a7b973cbdcf59c8160c4aac3bf1f57e917d7f1c327aec481308d182694f14214d92572b5ac7870f1c3f741c32f8073f7e7c0f1e5ac60f7a5c0a6a6083032159309e9c93ca0a2d49aa2761c11cf73cb8ba09b23bfe902b24d7c54ab13eeeb42156489ef78b71e2e40e4a3b08a982a97f4409623d7c6cfe102a942be592565c746dab9494342946fd04854cc1f837dfa9b4cb7f5dbe36ca478648a1bae47159ec52fc9c924c540555597f418644c17427fb4d46e9f829778d1a0788102898c345a9f674863cc1144f532faed5a7858de309214e30968e6622efb4eb959c2698524ec9ea2a67fc8709e6ce76396f6f747bbe4b3089df29e7da8aea39476910a204f328f9547ffcbcc6f22498f3fef6d4b21982044c64d45285932da53cc856a8fd98fa841cc15ca7dcfb82ce26fd4797106204e39d7439e9f7cdb3a5c530aec8b89ff858882e89615251c2459e249ca0c46c182615b6946fcfdccdc94a17408461ceb982b6ecd6c16018c454e774da1130cc5d6a3ea67eb0fef97f61fc92820ea12fc53319fbc258e2e953ba94ac095f02d20b93861ab9585f73524e7861caa9e67372350fe292c0407661589b4bf94dd293db931eedf8000f02441726f525c6999ca9f0f12b05920b939c5ebe5872beb18583c7b141868fd303b614d4c0060a4070614efa47abef9ddcc294361fe4e70eb76702b18569bc4409a757a498cea905a35d6665a9cd2b45afcecc517d25a936255a987352ba24658278d12182ccc224785657feea24e9f8ac2ccc51b4a52449399344138c85c982b21529b7dfd85af3d1a38c0ff8f81f3ff040c3023da7e4b95cf50079c5666f1b5623673636efde39a7ad4fb317cd5c51350ca41586cbe72eeab9bf8ff35e00618569ec2f9a5882d062527c15a616b17a82aeead3f654613039c49fe869920ab37cd65c5031597e6254183baf7ac8ee8cd86720a730c9b1942826e9d256615398a455c8f174d71f840918404a617c7feb6a5126f80795bc0208294c92789274e9ff3d1d4a3c0a53bcffbb98ff50b29a88c22469af1e2154503b61868277d93a1bb56c4966b44c967c56175b634d5098635cc89bbae8cb32e160470ebe4f607edbf523e748e9209ef0b66f9458625438d891e30e48272ebfa8effb39e9ec8e133c082732ad154bcbf6d62ba1a4ed92f338c0c18e13f0d891821a3570b023c7f5f8c1036413a6d45eae6f4159100fd284b94e87ab9cacbc322b08403261deaf148410ab241a7a4c98736789a72d7fb6bee81226b9d47f698bd75d7964099389659296131baad75502910bb36075a96d536d2c4dce23f444fbbd5748095376e71d9d4a577cc659059049183c74ae79d54fad559284512cd69ca5b6c5ce222c8044c26c41647e123da64ddecd00020993e8414dc7e7c4bc0add007984b16f3bad4d0c556274a800e20893548d39a5b45e9df07b7c8b00a41186cfa1464e4aa1e7c4566a8c48cbeccb2b58ca69414dfc144628b98fee01c8224cfa49f80f55d2e760418a305950a5e19fcc2a9e6c228c5b92ec17df470605104498762b869fdca3ab72a5468db5513f003984a952b491a752ca5f2a3284a9d38a096122dd3bd5690029844197ceab25cfc55051062184419ee89a49d9340863f7e8d335c13d8d0a8308c2f81e7c63fdfc7ad414087355fc242ff4070b6302c23c9fddf37f89ad39ed0f663db5a0edc27faa6841fc6092f3c68d9f980f9725ea71ca10418fffc139811140fa50c77a5df24edb4acd7ad3edda7a8ee7c1e7c041990e103e54ef01440fa63469d72987ea4f77f9e1031b5a2100c983f14c2879515ee1f917de02081e0ca3a32e9a3e3927ff4e7301e40e4611fd93d4a6c5c921fac159811d4c5284f2f14e929cf2a3fbc0410682d4c1a4a1ad4e7872bd180f1dcc352a25cdb0fbb4923918940ea62b565b5e8ba21c0c26ae8e999b38c14a1607c388eb5879d51ff3257030fec949e97e4f7e39ef1bcca172fa3ccff204206e28acccc8d9557b5d58a68638b9fc2dcf0b2607a40de870394af9895ac201840da6ecb7202a9a9620aeca5c834945c8e9dfee18214299a906f3560a3355b7ee412833330d26a59d437b9430592a9d68309887851371f929809cc1aca3cf24153ee90f5ad7a8916630ac07b72c6fa96727ca2c83e124ef3713de4206b38b4e69f6d572049031986e6df7ce64c9418714edb8f1e3518083470732ed002206938f49a295e24aa5b45022903098427cc8757dcf36259405103018eef24a0af312aa240bc8170cd22d4c9dbcd02254ee40bc606c8f6b11bfb016bcd50248174cd9a28f789311840b86138b6d4ace9727d689c500b205c39912a7045fb7460d2d187dfd5236e94694e37184a0460d1ffa831f8606902c98cd24bb58df49b6d777053ff851a3c60f7e581840b060d2f7379de2f55c124bcd01e40a069347fbc90b26b4864e61038815cc5eb233e472d5fac2009c01a40a06fd9fc4b754d1e47ed00309205430ee8f92b3a9dfdf2d59ac18f00740a6609257494992abda578872009182a97c4b5e16a5f7ba641fc0e2418d1a583c383a8044c168265befe94ed257de5200818239499ef209f2bf35a23fc16c1f6272880cd926e5fc007182412d4ba8f7b7090655f9a4f668327c332618addd720553f59453ba0483dc51eea1c35a297d2188124cb92fba3574a7f5d4f20224096693e4b3ee34f724790141829e616fe16e2ccd8bba9bec297fd4774b61d612801cc1645aeee7df1f7c4cfcf806102398c6c56b3ddbd277578a612a5ddb9ea3a28921278669ae82140bff574a968661d43a1de592bc304c336a43ab982718869d2fa12d5905efbc816114d5b07ad1fec224270c77ecd17d5a84a5a5606e53497eb5d2513056687ce812e552498282d1c3865eec9aeed013cc2925bb4ba14f3adb0966cb5a1fe54a7f0a7f138cd6b183ac134aaa0e138c595278eaa8f1efd0128c164be5682698788f120c5ad7fa533c1d334e825176f48c574941291d09a651639d533fdcc7473055d95ecbed09f232c00826493fe9b52ab9d0926298bb44e7e52062438918069deb9d7716a4efc3305cca757ee9b1bf441806a5a704932f65933707c3bc7db1ae6341287781614e0b4a9c869975fa0bd4a5960a97535f98b4a72afd94e45e18e74428d1bb4c5ffe9817a61ab75129eea54f32de85d9d48d8df08a75611693d99de72a89a55c18f37c5434f4fb97245c98b43ea46d986849dec220473ec94ae5a52c6f0b93163fa5fb04ed026a61f035d58a22a68541afa734a7424eab390b538ac9232c790eaaa62c8cb75bbeff97174e180b73b6a7ccefa823f4080b83d80cd3de212d09e12bcc752baa2ac9ebddb8ae30e56f7b7b6551d256db0a931c7b4e96a437d552cb0ac3e59ca42919ffb92cbb8a3cd344ce8e655561ce5592a0fb72f953caa6c2fcd992941ba763d7478539969c7d6b723f557f0a73cc9ee7f037eb2a3285a9d3a59c539495747b294ca3f4c7b5b093c224dda9cef923c384c9284c4ac550294aac7b1485415454271f75252a1d0a839f60a208cb515a040a934e522c592fd64962fe84d1f593bdfca99e480733e97984503b6152e9a49cb24d3ee7a79c308e4e97c2c725f146a69b3089134ec5b57891d7541386ab6023af16e3b39409539960e9842741b4f29830a8394f9f2e7f4e12ba84d9e72f49f2de29ad234b18a4574e6f1f2bff419530a57b3079c47489e69430759254ecd149caa9c9248c26bcaabe4474c3441226ed1cbd4cec0e723c9130b65c58ac247799751212a6b99c21467c6a28e97c84d154f44ebbcb1afa4d47183b977c9727bde5fc6623cceda1648858196192c37c52cd932664ba085390d7f1947c42093f531126a545452939d5d56126c220b4969c5ee94a2e9888304719cb3213cf257f7908839d474b59d74aa24b4318e7b3ce4c49a5ba4b8530ada5a7b5ffaffd13429874d8f64afb7839950cc22488d1d0dde673fa1584f94dd4b074af03618a1e54aa89b012468a8030c54bd2e74dac6789e21f0c4aeef04f4a2cddf9443f1894322f593ac955d2c43e98f353a88b72e283c9d4695323fe95cab407c357b08e35bd174e5e0f06158452d94e103d93cf83e9ea5db424b94b12111e4c3dda831c511d4289dfc154a37737dbaf4c98d8c12407a54795274bdfe93a18f3d44893ccbb3fa774308cad9e142fbd3998c3ccdcfe43a964ca9383e14e4e5af166a489f0e260923eed7945ad584977703008a1849c887fb7fbee0dc6bae4c144d349fa243b3798a41347bbb7e7247a5d1b8caa7d2953a4d6092ac7067ff4757f7bcaadc12c7e4a4a2a4931552ca70673388d2b13695250531a4ca72658d63da926e9d160121dd49d6bfbe7e49fc11c9a1a17db42c90a99c1dc960479493df568bd0c269d55ef944ecf309d0c066973d2c7ab50d9f231185b47f9c99f0b671e319844c89a60372aa95387c1dc39f9768aee949434184c614ac9b93a76daf3174ce1e4bd1b1f5976ad174ca604bf9c9370ed29db0573a5fe24ada8fdeb930b663d3d42b692786c730b26997a7ac7835a309ce5246993e28550b22c9893a8bedb962b43595830d89f542687aca866d9154cb3f1419956cc0a06a926aebfd7c834bf0ae6a464b3501d51c1a0d4592731f5bb5b3405739ab49e2b859a5b5d0a26bf24f23f4fa2606cd11f45c83425b950309e76e89fcfd517f2134cf249dfbd625232b9758241982ae5e59efc7c6d82495fa9c5fd8e6b924c3097dccb4bdb23b5c225984f922435fe15dbef5382e977f477db8c572e09e6e8fe6e1d4e10ba624830fda5f4d9d5aa051cc1244375b6b8ee41c7520b3082f94455a58cf178da540c73aa3cf70f4ba2264e0c7325933565a7fdb43e0c93e0d59ffa927c1f4e84612e7d6149882d756249300c4a122a5cbe131806d125987a4b2a54f217c6b731a132cf4491a12fcc29eeed716a4ee5eb85d1a4f09ab5f1398b4a11e185b9d283cdcfa9dba714915d1874acc9b4b91a1321a20b73128d39514b9fa03d46cc85d9c399d2929224c85131ac1820ee4104178693695f623fdb9660a5c82dccb9d7c4a6b74882ab2c1e5c0f1c3678f8c03e88d8c2d47fd1ac537f2ef9f222b530f975ceb3db781cf4d891eccada9f0727420b730a4a27fd3a1f35a4696761d4ac3b49f3c4db8a135918ab921e315aae84b81d0b6305a1f77e2a6a983261615252b58fc9e9df44b388bcc224c42a48534945b13b6f6cbac220edf76d7545cf3df743472b4c4a99b22c59b7fc6a5698532ce89c75a71b5b67387afcc05518c6a42a932354fc6d879c8d99b6959e7da4c2d417afed49c4a8307b52d7ea4adace723f8559344c2ecb49ce9d953385e9ace2b59bdadce594c220afdea4a7f43b26c5486114a564fc948831f1e5288c69692a59d76f96eb65a230fc9647cdeb92a37bfcc616191a0a5305dbec13adcc4d30f548d8a0307e96b809ba5bf2e54f983d54941f51a588278ca76ef227d7be1326af10ffb7a0e76794dcd86a4e98f3ad2e499653b72cde84b972360f17dffd3ea93461d4bc24eda81695b27a914c184bf22f1546498960c2e82174d4aa0b9fd4be4b986ccc04f7a072d05cab05229630277d5ec27b524b211e12a98429ea2769647c528278fec61616254cb19f73e1f22459a6f3244c17f4ec82096f9ffc2409c389cf1f6d31c68a8449255136266c5b75a91712069d7292dbfb1ec36b7f84414c7a2d6969b345496f6cb1238c213cdcd68abe94d2b4469882580d79555e793abdb1550a05228c30c922727ebc3dd65bce0b441661ec3e6ff7125faa4ad68722ccaff53bca9460924e76224c72923d8eba6b11615e35754228b1439844cee83c52b62ca81c43183f749ffadd37252223520873bee593fab232ab4e086192739e8e491baa72128281c8204c51d4a79252ce7d2923158808c27025b5745fd26b29a7190883a974bd6bd1bc210208a403470f749461e3878f327a3040e40f227eb03e88f0417793e592dcd80e88ec81bd5196551d4f50cf40440fcf9fca754ba9e45e79285bac930b5ae5e26ac97eaf4655b32fe65f7830e5f46fffc851468e1c384c50a3c60e1c3678f8c83b9883cec949eea7db10358e94b0cac8716240821084a0460d1b2662075390973f8b8c79fe1cab03a6596a73c1eddeae5287752c55795be7171d0c3a281d1a7a82f0a0939c203207939026ee5d677f27eb981ccca184eb8e33f6b1b48e83313fa9f094625410962383081c0c7a54daf76c424d49fd0d863f49a8283d1d179f8bb8c15c173d78a73441e5a5f8106983b97392f6b48356b12ed1ffc041068e1c369ec70ef77115021136184d12ff1e2c48b1b35d87c81acce1baefcd74cc0525ad06d349529e382a8e0eed9e34185774f83c56e1abaf081a4ca95a3b3fca5b8e508b9c41c40ca61c29ff152f6efec544ca60aeac24749d783962ae1e3f7c84a0051088810819f28a0d8b29a21ad7b635a6ceda553e5abc3a87c8188ca275dabd3fefecba02113198739712a6f36387db5c240ca6132b4de9ea9c2feb14018349ac76b85c7ab2cea7d8a81e887cc1d82f264ee71b8b9ea23ef811d4a8817cf0375cc40b225d50bdb36a462e9bdbcb88c557bcf06632b42a225c3057943fa9f294b82ad78d2d15d982d90d44b460caaef19d2b9fe6a3a48864c1a0cb823cf7b04ada162cd475265a5e292f2a6ab6598b1e6520720593dc4f370f1a972c432b98f273684935a62a98e22715c3c438d53c45a8603c57b536cf5b9f2ece12884cc1bc67428c526be209168b48c1987a2597c853416ac945a260bc534a36cd0ddb597b8f200205932eb9b2e83d79a2cb2509224f30eae5922bfd8568f94dc40986cff94b5e4e829c0931a70f1f6c01912698539ac9b0f51c94ee9c09e64a96459df4e5124cbee91b163f69354145031125183e9a54c9ab654f2c5112b08cb37437bb346a6d5e92a868499238d9b3224830f7b78d5c86f6ec58891cc1fc27874f9d4d7cab95458c60ec2faf64b11b9e333a0e2986973ec3729fb2921a36cac78f1d397cb012428861d25ec9d3f227a1440dbde00410d8f183c70f7a7ca0468d20840cc37822ae04eb2af9596461984aca2d9f8418cf499083a189d86bb7958ca5fa7433399450297ff8d46a018641741055f9a478b9e6abda0df985490e974fe81e95ae4ee90b93381e754d2e49ea79f6c6160f70a00341b355632f8ca6c4dfc79f56c937f1c29ce2ee43bb8ca7e9bd0be37f1017ab4fccc4b974618e5a73a6d4a9aa4e3b17a67bffe8793bc7013f7cf015d081031c3e1030011f394eb223070e2af0221310800f1b3f44280000096c55e04a05d08a3d20020f2835766b9403fc878f327a1420003f482ac08306007ef828a3050408c0e3e09481031d27070204e0a3c77b1968470f1e0940810f1c3c0e8d008c6106222b00800f1f490d0208e0fc38a8460102707e1cb4a3478d030060000d48408fd7819f1f3e6cd810014000460e70387ee4b8e1e3d8b0918031c8708031c670387ef4b8e123870d1b0918430c3fe011061e6438180ec70f1ee04065d8b0918031be6092d4f78f7b3ab54ea51bcb56655891f13d6cf00007b2811e0838ba7ee8c0c18231bc70387ee428830c1b36103046177ebc0f329e0c038cc1059328237a3a45d19293780b66d123da448b61a1845b0bc63a61a25f8ae975231eec20838c2763758c2c98e42f741e957367aff070329e0c25e3c9381f3a70fcd81c030ba6f026793ccf99fd1c2cc8657c6005278040085a0081c4c4185718c30a77cde9b12efff0128d510553a73b3d27973f86c98e4185524ac95c54be452b6bc7bdedcae9c9cf99088331a660cab943d6929cfa639d31a46036d137d44e0aa6a3c46ee8383956706344610c28b8b116ad47fe77da06fad5c179192c11c67882b1ef844f4a5a036338e1b09b279e937ce9e8c18e26d8ad356fe72e57972a586330c154d2ebe8b47471d2b6632c01c7508231467f285d520a49304612ccab9e9492eee2ac668404839ead0ab2b34e7eeec6388239f596d84176c55e0b97c139c63082b17b3fcec7291d4af2da078f1d36ca48310c73a94f84e9981df5ae6a1d21860e23d1aa64b63297b28c875536910d75478461d0a2647f871a29ee9a1b468261f6fd34b13cfd497bc98d2dc791c3878d1cc70e1806d3bf256b8fa563e417e6d83529bb633e950e477c61d6b51b259f4a82fe7ef838397230d20b7368532a42c99fda6c5e982d598a67a9ec0bf320c34f05bb309d1a0beb93739fee6afe31a882c3882ecc6a29b224d3278e143d0f7ce4c278a567a2ed9f3e07de18c18549497db157fd2b23b730c56fb37b779197b394b63009df9d2dc71d9fffb08e1d6490b1c3af6a61fc302394a0cc2cd9e864fd18a18551e77f6436437dc776a4a0468dcf912438b06a6416fed75de9b33b219305aa21a37537b2f5729526a9f88fc4c29c9fed55ed79236bd9a8228cc0c2784a09ea2461a3c3a592f1c046fb18798539e7bc13a6f96239ff23ae30bc25cd5933d5af538eb4c214a2a79209bd659296acd0c5b44c35d3a2da5c542b17fd493635adc260ff17c674eec95f9254615cb37c4ad65af11c354ec2482accedd92d9b5a7c17fb51610c552abac5f64f49fda730d95e5c92828c4c610abbaa97ce2d695fa9146693cd455fd634a9a44f0a93765241775a8e1bff8cc274b7259abc2549144693bbb1a2a5edd2cda1c0b2eb2c2d54ac6cc42c65684b7d7a2b467da030c9eb27f44febc7926c308c7cc2f0a319ff9624515146dd84114f984f2e310f169ab757d209730e5a5a469c387f6f3961fcd0e1f7bc74549fb90983b8b09763c9253a09fa88268c992abf16dcc44fed493b76f458411646326130d9af3ce7f850ba4637b6d2f91cc563041306d95ddbec20744c091ab98459be247192d52849f61c1bc576241d24403970dcf840174b6c59265f3c71dffdd51e2395e052b597b55aab6abc9c89fdca63c25b2e39a550c2d4e5af268f5e6c563a06239378544d4a728da7d449e2542fb955db2a2f7d7171dfffd9ebb74898f64258921715d2531c1206bda32ad85d8afb9691479843ac99b032a22d793ee208e52cd5d98cb6c87d9da551f9d97f43bd845d8d30c81c3b71f75207ee03238c10c2c822cc6ec9f5d6e4fc245b7844115cf4ec76b955b979f5b43835fa932c294e92be914498af94746d2a9a28174a238830fd78a5606184c68730d7dd858ff1a14a90fb8821aec60d460a61f65179f14cd8f70f428430bb6e28799efbc8208c234dec28a7422382180904e72662eead9a2e77b14af4cd53729ceca996ff0019238030270b25ca96e63a3e47598e60e40fc68df74e51fa669475237e3065d17a5adb69c3e33fd207930ea9a7535e3d781d367aecb0c1759582113e98dbc3638aa8b0fab9e8383d6c1c1e3e6cf848e7cbc162640f065df139eed39378f285078f32f4603cebf0eec1ad1edf831d39ac47f260d0659b258c3ab9a224c183e1dd4b8f10ca337207b39994b2496ef2927c2c993062075312479e24dd882f4ba603c2481d4cd2ba86ecb02697d21edd218cd0c1e8a7f2bffb8b7bb646e660d2f7d039c835717490cac118636f7279bf83d0561c8ce2596b754cec5cab0a0ee68d4fe9e46cf1a4d28fbcc19c2bd6291d2bea3d8cb8c1e4ed6a49e8f9ce26f73618cb7456132bfb0b5352871136982ce5f5f2122cc929791d38123276b895aec19c1527d7e8147e63f51a82185183b962a86c6ea9a03b278da4c1e0361642e7f3ac16e23246d0d0cc57754acb9364fb0c26399950c2720aa11f3143aa66a3d639da72be5b06f3299975515632189494fd92bb46c6906b78cca8850b35e9418a057d22caa13d7ef0f8c188184c9db9de75b57a313a6446c2607a75d1735e4aa8fa72040ca6dbce6d39c5cb46be602c3ff5144dc95d267846bc60529f4a922dfe3fd205739aa75452d29622d4aacc85112e984cab4be5e86a9dd62e63077fcad88119d98259fda49d7c25a893961dd182d14a56e89af83449d0c748164ca62ecfe8e8a82cca6e4163c15ce94dc5327f53e2ee2357307a32a1b4849283d6af235630d907993a6f27d99df2057318a982794429f1c6e29a2cd653c12425efca5542e44f5330e9933139f21d918249dfc3a5ddd44bf6d64814cc6b82166d6265cbeea060d02afaab64b31c3d253dc1f03d42871ae171c272fe1ee3ac24479a604abd665a4de59960d05a3a8e8508a54dbf04b38efadc8812f874b914965aebe635eb5db64a98def31c1e8f24c174f9c2b6c9232d8c0909e650415cf0108f603caf35a5b28f18c1245bf88c7faa9033298629aadfe738310c3a4b44c96997271a86c13bc66e7f9294290c635eada78f74b3f006c3942c283d4a3ce1a4598161caab2a77cf134288bf48eeb0f924e99c2f0cfaa2764ad6522fcc23b65ede7e4187967861ceef964ad0a65d18b67f4d4da78e2cd185494b6de446f6929ccf85593cd909f71a936f5c987387b8bb24da9f9adcc2582f165746bc727e6c614e61f73a79baf09e5a98d3c44fdd4e2d16655a18ded2287139dd82d22c4cdf493c0851629e5f5998c39318a7d5b4ee2816e6caeb612bdebf540e1626257dd6b9e9dea8ec1526d7fdce9ec4de1586db922aa69f5a61b67c92e76d28fb102bcc79ffef4f140b2d5761f0b9fa58975785c98435d974dc5361b6eca3c2e9a85e9ba3c2946c47850ae27582e71426498a09d3d3140653d54beff8b27796c278f96b19abde314c52984a67e6a24753fac551183d95251df4280a73b48a27bedfa4130d8541d773f0383afcc40e1406534adaf89866cbf609839aec99255d9027cc614566fb963a61faa0df6a64a793b2c409b35e101e96c44bca479b3089bfe06aa6522d09d28449ddc889162d522b9e09c3b9faf5c68963c26c1e9e3aeda29abefd12e6adf0386ea2e4daed96307c49a25ad2e9727ded9530275373eb289b7a69a784d1c38975aa4fa8deeb93487d98571286dd12275b4dc6e83612c676b58ee7d9aa6b858449fc3a8b27ab8f30cec6983a5d9594d4118613c7f69424f7aad908f3ce86bda851d2529211067d82494959078b7f11e6247c52b6df79428a8a30f928f1fed46ac553220c6f72b5a3a58e08539c3c32f4ba4398a227594a775e586f0853bab53369e9728cac10c63c5d1db3a43ba18410a62c4fd765a1ab750dc2dc494aff1167a1e48b0bc274e9e33bb4d3c81908d3ac6f49c2b86a580f08f3c91f99a2a7a14f7f30883439a89464cb5e1d3f98a42074d0af0a27c5ee8361b6ae04d9295f8df860aab4a02469e63d18ede2dfecdf84017a30e9d3517bbd2f86d0260cc88341c512be94ced1bf3561001e8cb7e61f4f3cc9ab241306dcc130a3e3524eb1bed74c1860079368234c3ebfa40e06b710ab5c3a3a183bc9a19b6e5f9dad640ee65cff414377d6eb92c8c1e416764f52caeadb92c4c1bc6b9a7f9209163c090ea6b856fa6162550efb1b8cf537a3e4274109d1dd60ac242fc5765e2c7ada608e594a3c8b9a0dc650c2b2e45e1b51f71a4cb28ba509e253c5c7470d6615752585ba270de652693e7aa70c4bd283067314fb98a2e3d2a378ce60caf79fa6c4911d2c78cc603e51cc92b9fe99ce9d329884ffb3b425853fd50e19cc66b5efae2662e1340663b9ef6799c4601a713b7166cbec466130e5909372752aa72230982ea84f91b72487d3bf601247a90e67d2cddfc70bc6d1598478532ae63e5d30fce58d47cf17563ecd0573bc5a517a46da499ede8239c6a78c70f1377db7160c166f743fe7a7e87267c17819f3e92ffd83521b0bc68fb5ef1c1e34bdec2b18bc2c53bf2fdd9db0ad60ae95ef300d2532baae82c9f22cbfe47ce5ad9a0ae68a53d9a4af38db979e8241ce018c68a8644e8542d240200e0883a150201408a4ad47007313080018481e8bc682d158220edb0f14000352382c3e322422241c1216121045236130200684418130180c0a8342a10030240e376532d50143215c6d80871e47427984479c478f3aefcee922df914b592fb59614f895b2834e16bda1d3a80f0f7bb8f4d654c47295b35ff927930d1dfe8813937cf5c18d3d153ef99ddaa3dc033ca811a40e14bb9c85495ca6639595344ee12d2f4ddd65a4c69be75c21ea16201b9154e8f312bad215c8da25db4f90fbbd5c65301cec9ab89609baf53f92a565b394816fa29e3e626c5b9f13e23b4fcbb785aa5fe5d88db1416ef3b98afb5704503217586f289c7cb3dd4002ac5e74bf5e34235cd13341800eabe524a199a4a7a63548a1f71e0bbbe2f107b59823770a30b652b8b3aad6e59859f1a0d640dcd374a20720722c5a006b336198bd95b3b678b70cb8f4208126daec5a3718c8e02191b866eaabf08c7a23d7b9e01a602d6d1080b6ccc254a1dbea3d4a115855acf1fb94f3c6469786dd1c32d30da68411d4dd3df1c13c21e8c5f4f5a4ea948051ba1799291bfe842b5094da87a60d7897a023eb4a67e7727496bf11495627341c5c1e1e20f7c261792a6670c9656adf4cd2ce96b2118c48e1cd87b60306b86b4b5037335888de8c4782bd6dd0e150ca68b9f5bc9baeeb5673ccc6b7d0ad89406004b5369c604cb2cb0423a12dd0250c93015cba5cd725a4de872b0d64d5cfa705502bcac49c87b0328b7b133b4483211c680c6eca3b2028cc798671ff1848109190f2562ff3c8765f14c0b8e67cf724a6ea3859721516a08cc4351c2c33d1832ea005f2a39635327e3ee05870d707bec73309b8e6da5472aa2bb16ed361ec951c41c254b13e738147d0bda155261aeaa91c6adf353d03f274b7496f61d1d4926772503a09c7755e8a2adfed4469ef2df9657fe07c10bc0e8366afbde9faf1f29f2876892c8ea6715bf42bada3ac01adfbf1628480713fe3a1a81d976d63d5e5689081b0837aa7020e421a7f551581d93c55f00596822c80fb6b93a7bb8dc9a397806af58d279c9af600231f58f4d5cd1e47eb1263716d09cafb04b3e02979ddd940c8ac2d1409c450b77152bda2d3f715071ddf42e5ebdf7fc913cb5da809aa1c6518b1b34de2efc6276ce9360fb5dddb22ae19bd4b0aa6f98b1e4bd3ab992539b890d85c6eaddc67489c24200439df814e9219ead327ef43056049efea4e405c24e9f6451c55b9939e750a587f4af6a3236049dabb3f6244a5aa9c71048cd3acf40316e05b661b7eac59cd1887167ae2b404e5f52646a18111a4cd2bfb379d878d321f4ee580d24195faba3b10d04c717eaf8de46daf43b7c9993b0d8a3b21771ee7dbea088e288d93b2c0f0c675be91c50f21a16d77891a601b714462f42043410ccfb8cdda18974619278b961e2e26c8d8660e7998db2d64d94f88d5142a13f0aa332ef389100a663759852c0530f1befc8f73a658acede58054d0024083da8b102e40ae2d303ef1b500742764a9e019cb0d9a2f582b27757235cf2a39e896c95451ff35340915ba51021c3f46a95a68c9a801a07f58ea5f4e9db21e18b7b0eb73acbdf9977a22791cf6d3b2b255d49f81e8de1ec288beb9e7c6ff1622bc7764103c169a4d39e9492a67d9dab8515e53d4b1091216348d1e7e884debf92f3f1a7002225e373cf9246e8c5f6b9b4eede50eefbe066b0bed759632af469e06c995cc6121b86cb92057575f4e5cd549a1c5c31fdd5eb752d983869e8dad25443799d2ba727d59b09bdff1a0048d2e04a4b825f7d65f27c3ee1b72377f99ab3b26e45efb828ba325f32f1c0fb356cadc13b6906ea3c0fc0dc9818cf4c92fdca7870316ae93370577aaa9e108fb1d130b374e16aaa1c9de6e61a43ef93d2759a17ea77c8da30020e129e122e5c324ce102d00540b200129185684e2e0341cbd24e0b288a09938f6da11cec4e142a09ed945ed02b85336622550b283466890c05c0761a9629c6e023b3d27f12d72d64a982c574f76447948d0961f6c5c786a1c7287b991fd0e01e36d0169bcb517218daaa477f6c943411f3aff856f6c751e603592bdbdbc9afe2d0b42b877db66bbce73d426042dff8a7fb4cd603516224c4375dbd57ce0a73b5fee86da70542d0fff1752274272764cce3c564a2b5c239cea638470208b111b264a46dbb2ca97ff0cc31966056a4bfd75ba7c1b0b6ba15404c2d1b797785d60eae7f00335d388e5d433a762fb85c4fb23cf29b44e1332f0e85c4a8beb2f6030131db379426e9f36fb4c764c8816e4b0e78b44630aacd8b638d421845db03aa5763d8567a9221e4efbc3aee20f4eb6f69cce2ba7ef0272cbe73fbedb847337e3f420c7e96ed32c6c2ac13ad4c7132ea972c34e76b1b916859fa3f723d08523a186eb262e9be95bd9b1d837af786e3f3cfe633182e1125b9878eba5dc8680031035a440bd13af902b0dbf59b9669e1a38f66a4f25636f51bbc7b897b7935be3140eb758b2772503ee1aa4ac04706e432bf354e2e1633a100482c16fe5fec11d3f53e515cda0483cceec8dab37ef3b58b532d3a7c6ca560c06f2f45fde35f04c21a13b3915df29f012a047a5c820132e92043b3da9d7990d5d41f4dedaf150c0f72cf4a7c3aa15f06bd64053c37d80b93ba0fafbf8f31603fdde36f102043fb1ccf5d899a4b95559878e978109af619ca5999d4dc9dee65244a7d460411497fecbb5a2690ad757ed4f3259c4c7fba67d8a509aad47f145bcded0824750823c1b04c8d0da6cc924232633dd6cf63c09189f49893125999bd3a7a8decb134c844d5b97e89aec7e5c022a6814ae9ac161e90bc93be97b78af701f7a1d463a9707ef581e80701f50a880df8c775e7e3878cac254d76e2c32abb0b1aac24f9b0374541dd030417bdb1b498a50088c70691e6994c67af329e0aab19eb6a7aa46bf5e2a5db8a5c441598d3dca63067753893d83b2695db5e9f8e4b98c8684694d49cc6aa4d9f9dc00243b0f8ac1840af13f023130532a20c6f2d33999619377d62e3f91395b60edb0b02414b6175a427eeaca633a662e4e0ffb96e7d5eda7c7a65aa26f30e06c32add31eb24333c4b238d0e98236234bb2bea4f7e9e83ad2aec1c6e816c1114702115d82a767124036e8b87475fef2fb98ae85360277243de338491b77c43e1f9892e8b5cd8d15328ddd73837b691051c91bfb83e0b261336c1e8c4427f4a73253d9c9c77112ce89da88e7004e11034d7072177770ca80e5701fdb8fc1913c2edb461a644ae7af563899cbe0a7bd6bd325bd4ff7bb5a2bc07639d0df3db6519ab26f89869cb26b456ed2a40bc025571ac9064d203085f360b9a753e63cdd65c7fc18b81ebb446f44207abb20a26dc16bcc87c3a852190d6837a12aa60ff8e17f40809921ee68d3a448bbc9061d73091a16e6f0d2f425b9a1db73341d6747fc381c587e3b76e49842a6797aa111a24264888d00952ed39e685a277da8d51f8323795c77cd6974c6eefb51705c5e91fbba6b8ed1d1d87df472f2d61d37e6e6349551c492722d96d50a1dd6d785a546dcfadbb8972ccd8115ccb79d13f5317ee00d87447947264caad3a758db1d3c73e464d30b79b76ecec1d1fb3812762f46dbc21ce2529be271346891fc3f60beb146cb62b50b57bb2fee3b881ff2a69bcd5091260ce70b917478d337af55067d02b456918cc9060ea20e44a38d39178563173202bb8f0c27535d985e27dd8f6ba5020a3dee3d10b937f91daf953ba6b4948a4fa00ba47bf123d04b0f02fa637be11fd041e61b542be86ace644597a0f15138c67232dd8f8fd9175dc4d002ac7021acb9e01d9b077b521d2d801de123f800806b8f21e27a36a1d8a46e9b99d2b5c6fc499d3a84378b438b504f09d5a9deee05f427c39f83ce22014001eda472e7adedb62583fd7c24e4ad48804ca1b373d95d2087293cf82e92cc00ceac553cb550c7270e759668d675e675e939761d748be86c1361eb4190ec19d6a2d40dc70e89c4d91da1e8a499b8ccaa331f20250f018d7870dee01c3476520b0f9d3b50069b704d96176a33fb91bb7efcce45c1ec8971af3b5c72410c37a7c2d9193b1779db4db9b72f40ecd211c8f293c9548e758e34d78bc5322e7645bf938c53df28f1cfac7524a9f836a5e50782c1d5ec6349ea66c862c2758e0d0472d0bed357daf23150b424ca938ff3150ecc934fea387cd71972bfdc106f56930e7c99f52cd4b1ea8875adb4a6f139728428215447e9ef7960701382da6f52d7405311304189573dd32fb6bdd91cb9f0b49d9106b160481be0c9d53d599fb91526e1eb8e820b52a798654036cadced81afbb6002edd4c80f2c7ff211b9f24c211226d32f2cc81edd1021b6d71320be267524baee42a7f6209831a7d2263399668e89acbaff75d7b86907a4061c50c4dbb48cc47c36cc74b03fcb11282504cf573d90ebaa8f7b9fb462a39fb11c32dfb1fcf2903ea1f372ac82a2292722ec8365ada53c1de19ae08f8a6f9eb705d75d2e32ae46398b27a6afd4a808f27a19c33481a313e6b3b91bfb3d44895678a2ff175cc5512eb967281602166894c4b93e5271785dd92c038a7468237d7380eae6854ec3a9730ddfc91ad8b4071bc18111b9300d9d1a64e12c015aabe466cfa820976ec007850fc095218e5c4ffe3d10909140a6c3039c864eca00b042343c58da6a120aba7b012928d75b68f5dfb1992984037f2830285cb0adc4d1c65137b343020ab5f4742af0eb24469288f013b307fe252292f2baac739e3b23ebcdc565d5c35aa04847f99d117e4232899b910bcf2f2246a9161bac7b9b6a2b0ad4c4d7c9005d0b117bf2c12cbaabd1c7435103ffb18c52761fec2813d91b94e6f17c27391367b7be65051f55f9e8728e0bfe56f0cda19d7b0e1ee451077dacc00eda0565b8399f3e4c330223f5acddd3ee347e5c269328261d21397acb3e85e6ee73c6cabc2c57752d7291faaf87880288e814b1fb20c811ad0d1109050b4554b3f7b07ad2a356ad6a45ada6aa58aaf0f171bc56598562bbb4ae6f4305045dd2fde624b88ccdd686f3f4dced62907be08be9ffdfbb4389a0ec61919cb9d73867e889cd27b205105ce806923bb2f6e7222ae42ab690818a1e650944692523f07a363beb552e5f561cc668e3987b5dc1eb8fec5e0ba3ff188ab08bf7d20e10b1f7a2886f10ad9efc49c55440f40735d2b514c434a8061c0e80ea7d8aa84f7a20902c3f6040df87d417d0bcbb6f39f2860dddd8bed55a04ba27fed7218b2ffc4653521e2352333992250d6b46a6bed8cf042f23cf24c5988c1c68b83a62d937dd1f6d50bd8f09c3ff6d54ac9b8c09e4525cdf6a81b0888010144095f406bc9080f218bcdbc2a99dea88bda3ce3d486d4443c103250c9d0db78027310dfc3534e80966a23bde928498d2e2187cda7f7fbd3336aa3d5a75a661076bf0dae39a7340ea72dfdb48025ed47edd2cd1946aeba9aa3d6da9f959e46b46f9c6a15d5b45f801e1d066199c3ec16e15bab7b7d6fa78864de9b596214057ccdca349874da612ab09c3574bde21d24f98d318acf95eacf8a0d0fd541f1210c18fdb7185504614e3190c6663dee79db88a6b68905987f2409838d783c1660bc9b0883289cbb5410ca302eb488470fb3d81865636c6ac6854e54cb69ac83241494831e3842f66f97b9585f71a916fa87007d4c7083480a383d2c26973771eba391003573f45dc52b5b75c2fde623a045d0ee63b3496b34ed0caedae1b1a38844b73762a03f7d60fc208b0516cd7425f3e91dbfe90c329537b4b9bca2f96f677cc1f09b063543b982afd64b55a00dcb2af5f8c6b878079844d4865899d3f6b31653d9b5fd61027d0ab1ebfbd93badf49106670d84469c7754437b4c95c26063cc3273e90da100f7cb155a6a1aa6477fb991182ecc36359ece4fc398f44f2ac5876293fb891fb8a5f1662f99e7a2416f27a64e16b8ca8c7f382730ee4b125ef38740642184f8b34e43251550b1472778c0d6553c4fa957050876ac26440e8ed0954397c4b4b955944ee89f50d050c3f27bd60705c0c11568f192f7e7919abfc14bc995e808773bcde7f90a96d05c2102f58074de29a7fc92ca6338a9efea08248fec7bba4ffc9d84754ecc46396cdf4d6c88f33647c89e8b799c9dc688881b8596c68d750423d1f71e39a7f87ff548a55107867fadb893e7c6a6a2ea44a242d626b4c2a0674aa3d0da505f086ef4f240c0b8f44c09cc0ac4d20c93301ad19067f4cd6322c6016bdbcdf87f942e2b9fb9e2ef0d94b4e1a751161f59dc991a0cf7ce023c2985d0067361413f8c76fdd295132a52ea86d3c80ca970da5ea0b4ba9ca92996692dde6f35816d7d1ddc62073f58a8031607e20561c5a53299cb60ddc52c146c2c28e166755462cdba86a0503d3cc06c22906701f5d8509834c4ccaa7573c20a16adfd425e9be1f5484c443ddddbfbc789c0ef2f4d54d8d3202a3dc94ce8cf2e547b3dad4853bbb51b49ea36ed3698630967be14612766d718eb4c3cce9be7e71714dee8263544ee341ea15f880a034bd6be661c927e406a1bc1363c0349fbf5fc181bde9eb1638e929ceec28be2e6afd33fdbb88c5aecfbfc725db8cb01a9073bc9d6fb381b56ad6c83c2980dc6e855860d5b1268019d03b78111c10eec41ce5fbac47ddd84a3459ee8d701e95370b3d6dd41f50069440598e0d0094b64f82f8928dd56d66a77efeb551e6a5aea68119ebe56c969df648cd7e0c44cd5e0550605918817f550808564b7020fd14a3c779008ff2c4bb712983dd2de70ce5f5142191f3d7174475e9b2dee127949775b072fe1c28248c621e9f6eeddda272c26e445137ba5e454b6933e5b9c35c6ac343193dd1c70095bca7a7422737e8fecf34d9f6c1e7c28163295b130ab2e4dfd498fc6c370b6725ae59c7ae988ce152b546dd42d1459e25bb8fc6a3da81108a88235d161e66e4de2f3ed11556654dbdb2c683587c51e72b13cee34f18842ac59276cc38654875b5affa9dc476ae5db8157acfba56f75e93445ce7ace809c7c92f79e63e176559266989bb24c1f0ac6a5490298d33b7d12109fcf844d505d24f4c318453a62b1c7685539c8cf2bc3203270fff6c16715106174b45634901a75ccade91af811181ebd9921d76b62b5303195219fedaf48f6aa2200d673320a564900bbe912fbaa6d47bc24dc889d22ae582cd558f75a69d03a27b11b00e33369fd8270a578cd70de192167389df4882d78a49fcec9063f87ec41e05c4379ec080ef15c64ade7c5f013e97e42032d176241457b8f6e2e627f30e49b140d19b24134f53434d8893ea1cb716cab7341a3875501d86f416828ccb566d697488f44a8c16c29acad721950299a7cf6615ce94f281465d99a4fe7c73d9d1a5a61993b36a914714653749a43c3f5f82f413ad0aaf49eb4332242b68fb4c2c05ec8362327cb2a7a50f4621eed66aa647e1d7bb9443ddd782c66f44c34b0ed26ecca94a960a0d9f1d14fc6876ae2ac9f91901ad2438d3b7d11bd704430a8428346837609732c59070fcdf630c3188bd7eac269302e8e8335b2bab648281161ce60b6f56cc9885faad85bb825a0d58d1097421442d77c32876fe1da49734318708d1c36fc98a5065bf55d80eaabb363dd12ccb3214723f321bc74416d05cc06dc5dba1af0ab8a18205f98f34693784f49c33542f69e7a0dc0f40a70c7b1253eebe7712e621a257b7ca081556cf39896245ea59ea4240abaceedd9111547cc4c5a13ea0e23c365c6aefbdea0bcf64b5cb305400950dad142272767e593a5627f44aed041ff3c79c440a091e828de6932e66c3db72c5ef2e8513a461a1b1ee3c14afae140dcccc3ee23952e1d8867c16a189eaf2831c7d7fc49e277a0b782263992721dabab81383329396ea1e2de74cb59d56a7c93a5b6a23cca15be500a5dfd81fb3a183e34207500abde75dcb0d1a144168aa6fd5850b039216aced229d42a4192a577d4af97bd2ecee0b3e9f7be948ce012544d87831a656086df4f83c452dd9887c85992718ef5feacbed6cbd27380a562b5045457f4ba44dd43ab803d9606d1d795edb596da68c5b1c1b4f1cb4be240faaef0bda668bc71699daa0f690e4c10aaba6ccee50150d9efaa0d71ab28e9444456843c80320f5c3c7c4d80b250446a791f7039f1b5291f780a61a65feb6b904a6036ca3e7733491e7ffa0cd49d1c58275dafc39e248291cdabb7da59fb89f93e2c32cf452da3545584eaa08f3451f65c9e9a5048657350aea915ddacb6cec3cbc88ddd8c0a13f4e82743b9f00e59f92267563db17852b444398f8432b7cd889dc27f6b45ce0f20f4209c0a0ca891c75acffdbe1db0ff1960920c5bc1f3b9ec2ba786acbca9296b8e77d4b824d2671fe26a95f76ce2e2a904b03e4df9cf86101a626f78bcdb1f20b541614870805653088abfc1e568d047ebf5bc9a5b67feb02d261dc4560a94acf2938a5f144c104800535d1958c6c3df9ce7b6074f630a02f105085dc67932eb1224b554749f2fc60a223c2130399e11fea97b6471a1c6e203b46994a309bac54f9ed8962c039b93b0013b1107da004c0182b5bb17056450724803121608cf19ba1b486a1580900840e407660124693a21170e4d9c4ce34bdaea53b9d8ebd257e8643ad5361277f226e142cf6a1a23b26d41d46404998ed81df84f6e8249400648dd60fa002ee56514c742a4dad242c036e56488e18be6d7187e56d95c2ec87c3bd2b6065cea80f497ea88f2ecddbc3c2c55113d1623296d8db9ea0c8ce4daa82d0d585ca69aae6d46a11a009b418d00d476669c583aa28b7b624a0fccdaa327f8c6a4820de883a78a4a63f4a32d3d24159b2947bcd827aeadb41b228aafd6cf0e436719d06707c6f36c02278cdc25eeeaed6c6eb01b438502cc15be38017c5268154a4d6150f51f974680d12aa6bb4e589446485b0368f45a2ebd74b8533fe7ce0d65ba2213516badfde2a1227e2eb6e00b58dc56c4fd5661e9bf17107f31a21b3a9a2a8ae8bf929959d716f812e5f48f29db16cf8cd845ae349db67b186066d8bcbac1a8abc1e8a58e990327d04b9ddfa916a8135de641a3fea9396428e3f8c507e1c8b5daee2ab1c70766766428f3bbd3aef6ab02077c38e06b89221b94a9b4b9e262d5b5d5c28c31ebdb688e298de1377625f6c651deca5c10d42f49fa5e6d240d778fc2aa88b135bf0817cc66a24ba6d1de1abbaf02cb15959381055cc9c81847032197a89fe38a330dfde45a5f447e9b1ab9010d91d472921197dc14995f0d07ba0f167e9f836d3ce2c42cb231cb5090c489aa4e6ccac71d6d537335fee4f4ab4673376f2f0739a6c4c7f3733916b58d3c7df6066590f37371bb3ade4e975d1f4d50f2d974ce3f956fafbc803bfc527605afae740d7ece0e41e07f109c24cf948739ac5074652c589c970d2c1562026f27bb24d04ac64a88038115219c16a80083709a973ebc5ea97e7d2b27af2ce08db17494fdd702a2619bc1d87be99dbb5f7932cec3479e558feeba33f92df590370ac3e9d44b49501f6c9297bb219e613828be43693b4a9ba391017cfe74abad1d6e8b5c928bdd574a8e3611f7388f4d2bd3a01d603c0526c58bef248e3ebb10cbb123f5b349bcd4b6cce7621ebed08df501f0cdd68edaa8eb060f2db3692283094232c8d48bc98edf3aecf47d464c4adac0397c279f83e5c974e596e1fe17e583343df1a2314f84d8980c1636701d8b3b32ccefe5f3dceb488d332690e885d60e903aebec39241cb3371b7ef01d0891447f19c52140871db72a694d8dcb8261d0abc0aac8c584f9d01227e1abcb6d4c14ab45b25ff89743bfb7f95f3252513359667b4a4c4e2a6753d6580aa6a2e0996eb21d163a3f7fa4418d831df2e283e08489a8e54ae6275fe5412b44d45e39651ba04a110a4663f818f63570768ceb3a5729441180f8107c55030f92fe82602189309141329ca2641338f92e4ffca66d446df724e29b8e2e98da017cc1c8e5a19a16bc5ef05ac46160b5d10da6bdf282b4922b4336a1b6dd083203704eb260172317dadae7b82fb20bc5b11683a6256b7378146d0e7e9abbc8ba8a77925b7b852109f1ed97b9b293649d3f5742245d73d2cdb1319e6f40fbfb2922d0e519936ae5a2e787e5f6f2bc812ce2e29db470dbcf5b9e55b948554a8052272c6e4f438131fa38f0d4a7ad93497dd7a4836e88093583738ad23881e1cc66a2c354b121b64dfdc9b1d23c5dcf28f38b4391272cb2b5c1c1645f2a8b93b3a4dff644bb3bb24b11a1b46a0a14ba1d00865880bb5572b4e4f6c07a6b2137405746c68fcd21316c311bb17ca1b5d007d12a5274886182dabf34ce7b8468895f1616695f795b6d48154271f7068d043b59506ea9af6c11b8d1fc5a0ff7acfc2d5455eb10ef96240370d9aa0dbe37eee0c32341d4d08b18a9fca432e39a8d0fda6844daaa71f97261577ff0ae7691c495b70f1c94f32be120f8b24affecd8ee6470c43ea4e1804a2e2785fb0946d0c9c5b8d00691aa0d69c08a34ce12308210f0d705185274daac79c3b939e6e99e2f39f52928351959586af2d2a1c76a4059977af77f1e83a4d932176061055de9c5ba81509d19e7c78639d98eb21bfe042a6b0b201e15c776548061f7af9699b540a2be18a2efd3f2ba9bd586ed783f46eb4e096a568991a287d99daa6e3e3534e4ef99ab972a8f4999c4eb24fe0485a59eaf26fa8e066d121de19cef68f476d10e4af2abcdafcda710cc884301e29c6940db6b5ea606ee0de4d4cbbf105357fa335470e1a5c2de006c1aaa0e66b9acddbe9856247796b8b6204268ee933011648a76ae339021000c90c7067db1f1007614c29444971ba2844a38d793b4106fc9e933ff6526cd5850bc7e4cb33604ef3559cb17c61d1f1e5feea55ccf916d6054f8c08184c41c49c7b6fab377c8f1d0f8b07fe3615a63f69101c8fbd5f169038af5defedf42d28d8f709e73b0b7850b8dea07b1e1bc63fb85def0ddf2732496384709aa6b4cfac00dd867279f278657df205e4c8e6f6c930dc0f4638eb201dd01606200a8f02cf6b1041383748573cd546ac7436d734773277971782e087e0c8c8056758d43982432abcd16d657ee4c7a7590acce4def31d18d38e8590704fd3566d3d0d871eca2f4bf0127a9f388ced1e1cf3d6ce6221db2adb7ba06384c79c8797cf23c715f3de5bcd2d8943966a9054e94f644e310c05529b1c4fd3aaf9937ddb4837ff06e38123a5f4d5449edd1420cd1c00139381dff09b9ce69cea29985a5fb188e356d921c86f7ffaa46490ddee9c62bf882412fbd5f23f9d4b5a3687b8e1dfc40ef595dce4068b7d3c67ea713c02ee68d760d698548e57f6b5b20065b24863ae592e2da1913066ea7eb0ace0cc151fc5494c9ce4e4e754fbcaf450f9a8377bcbc153938a8f9c52c5de5ec7acb8a0438b78732a8ef720ef4555bb851830e8e893b6de28a49b045fa8c242103a0fad32b05c4cd1de1d88a16505460ddda23cd0c90ab6fb24c452027971292d6122f723a7a818ff2ed04ab0b6ee411d37082c2639219f0a4eccb4d625e8c63889d82541c67400c8fd37522a11ad93fb2463c6d2dafa6a5e1751328a6a5632a8bb0fe484dc17a4372cac08be809970eb5eef84c9ee97a8f2abfadd35a7f5026bd910ae770ee1abfb25a5bc011c7516b7d17f65a8fd037fd1b5b41d8931e79ad3543c904fd99c843b7cbcf13822335e3a426ac0ccc80f2b8461330c59e54afd3183f1a4074d781851e73bb1c888ed0836c57cd4a63127d19ccbd1f642059051987147de88313ad28b5a156351f1183d6582b60032abd01f2fffa295dd29ab21ab3310d5c94b33edd6ad60be72a889a578c799894bf4211fc278523b7aa02a411f6c4e79adbe751f190fd8ae1b3562935764626148a1643c8f858aab1dc819e54ece618a11d6e27459bc761d920d2530e6492857836d4e918084303c4133db218ac8993cb47276d18eb870cc389a7d562fb8411ae94c3cbef8e4425da0900b798ad46ee1f4b6a4e50efda27aebc09e77aefb40a885ad31674b30fe662dcc725129d535ecbd71359c885ca4ec05113783461c3806c73d965827b2541455fbb1e16f9885098d5260243c3638cc7a9dd60a3f827c7d25550f1d347356aca6fb57c84906bc99b9f5c28770b8e407da8f42c26de3092881bd8ca888932b3e41f303aaa897736a4e8e33bded508a86d282dabfd1760e364b3f37f01b9e71fc61e69c4464b3aea352190ec1fbb965fe3285d2f4688eca346062cbc22afc26e598235f9f4a62028c457f007182276d332d02445ed59cbbcd77212179899ef9b34fd5a743b45c022bfaaa6fb08d05de7c8ffea95ef025ee0c3152ca6a0a5c71a1d991a996b587279000bab8064938988387196de3620c94d4c69b7a319697f5e6a102334f7eaf3fa1250c55c91dce2cbf5d6a1328cfc3ee507b84726c3a70f6807eb437596ff2e6db8c5f442331e0238af1836021d78f1729dd99c647629cfa1c1960dbf4f91bf9a9104922cb77d12808c1032a3f44a4261c54201fec6ff040437f44679b5c87504ff5e80976432a5499d13a592d8c1215d7b934c6c67b11ed74554b917c2d888043e319a14b3110ae9361812d53006e0fd16c45ec38527b99182a764383ece98d7088a98794ed21fa5a81816a1d7e5af407e32d16e428f85ba4ea219ed80b78e4461cfe9662bbe3d00b879ac549b65d44a8519f596eacfac2066d5f7df6583e73522b888cbbab2b97a3e3e50b167cfd0089b5a17580ab1ca06f4926232005a163e6be4774e55802", "0xcd710b30bd2eab0352ddcc26417aa1944e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0xcd710b30bd2eab0352ddcc26417aa1948c27d984a48a10b1ebf28036a4a4444bea493f81973064687e0c467c4ab0a72b840a88000bf9aa5e6e01c476008f95db": "0x01000000", "0xcd710b30bd2eab0352ddcc26417aa1949f4993f016e2d2f8e5f43be7bb259486": "0x00", - "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb30e5be00fbc2e15b5fe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e": "0xd17c2d7823ebf260fd138f2d7e27d114c0145d968b5ff5006125f2414fadae698eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a488eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a488eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a488eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a488eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a480390084fdbf27d2b79d26a4f13f0ccd982cb755a661969143c37cbc49ef5b91f27", - "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3ce4f6702f7c0a2951e07379407fecc4b89eb7dbd287c2c781cfb1907a96947a3eb18e4f8e7198625": "0x439660b36c6c03afafca027b910b4fecf99801834c62a5e6006f27d978de234f90b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe2290b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe2290b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe2290b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe2290b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe220389411795514af1627765eceffcbd002719f031604fadd7d188e2dc585b4e1afb", - "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3e535263148daaf49be5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f": "0x88dc3417d5058ec4b4503e0c12ea1a0a89be200fe98922423d4334014fa6b0eed43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27dd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27dd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27dd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27dd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d020a1091341fe5664bfa1782d5e04779689068c916b04cb365ec3153755684d9a1", + "0xcd710b30bd2eab0352ddcc26417aa194e2d1c22ba0a888147714a3487bd51c6363f5a4efb16ffa83d0070000": "0xea493f81973064687e0c467c4ab0a72b840a88000bf9aa5e6e01c476008f95db", + "0xcd710b30bd2eab0352ddcc26417aa194e3f24c2988a2aef4958067be0827b8a663f5a4efb16ffa83d0070000": "0x00000000", + "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb30e5be00fbc2e15b5fe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e": "0xd17c2d7823ebf260fd138f2d7e27d114c0145d968b5ff5006125f2414fadae698eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a488eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a488eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a488eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a480390084fdbf27d2b79d26a4f13f0ccd982cb755a661969143c37cbc49ef5b91f27", + "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3e535263148daaf49be5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f": "0x88dc3417d5058ec4b4503e0c12ea1a0a89be200fe98922423d4334014fa6b0eed43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27dd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27dd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27dd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d020a1091341fe5664bfa1782d5e04779689068c916b04cb365ec3153755684d9a1", "0xcec5070d609dd3497f72bde07fc96ba04e7b9012096b41c4eb3aaf947f6ea429": "0x0000", "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19500b42ace3b5fab73c6265656684020a1091341fe5664bfa1782d5e04779689068c916b04cb365ec3153755684d9a1": "0xbe5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19500e3a507571a62417696d6f6e808eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48": "0xfe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19500e9b1341d066bc7162656566840389411795514af1627765eceffcbd002719f031604fadd7d188e2dc585b4e1afb": "0x1e07379407fecc4b89eb7dbd287c2c781cfb1907a96947a3eb18e4f8e7198625", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195021cd04f63ad37128626162658090b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22": "0x1e07379407fecc4b89eb7dbd287c2c781cfb1907a96947a3eb18e4f8e7198625", "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950246b6699fb8b8db670617261808eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48": "0xfe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e", "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19504a8e42157609c6c86173676e80d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d": "0xbe5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f", "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19505905fe216cc5924c6772616e80d17c2d7823ebf260fd138f2d7e27d114c0145d968b5ff5006125f2414fadae69": "0xfe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195062190f64559b55c9696d6f6e8090b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22": "0x1e07379407fecc4b89eb7dbd287c2c781cfb1907a96947a3eb18e4f8e7198625", "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195066b8d48da86b869b6261626580d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d": "0xbe5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950721887aafd517d296173676e8090b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22": "0x1e07379407fecc4b89eb7dbd287c2c781cfb1907a96947a3eb18e4f8e7198625", "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195079b38849014a07307061726180d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d": "0xbe5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19508b6d3621e5bd57f16772616e80439660b36c6c03afafca027b910b4fecf99801834c62a5e6006f27d978de234f": "0x1e07379407fecc4b89eb7dbd287c2c781cfb1907a96947a3eb18e4f8e7198625", "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19509d4a4cfe1c2ef0b961756469808eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48": "0xfe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950bcb9c3677bfe9155706172618090b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22": "0x1e07379407fecc4b89eb7dbd287c2c781cfb1907a96947a3eb18e4f8e7198625", "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950c0cadce9c18510226173676e808eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48": "0xfe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e", "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950c7e637254b9ea61962656566840390084fdbf27d2b79d26a4f13f0ccd982cb755a661969143c37cbc49ef5b91f27": "0xfe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e", "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950c9b0c13125732d276175646980d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d": "0xbe5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950ce1dd85a539ac289617564698090b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22": "0x1e07379407fecc4b89eb7dbd287c2c781cfb1907a96947a3eb18e4f8e7198625", "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950d62c40514b41f31962616265808eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48": "0xfe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950ed43a85541921049696d6f6e80d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d": "0xbe5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f", "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950f5537bdb2a1f626b6772616e8088dc3417d5058ec4b4503e0c12ea1a0a89be200fe98922423d4334014fa6b0ee": "0xbe5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f", - "0xcec5070d609dd3497f72bde07fc96ba088dcde934c658227ee1dfafcd6e16903": "0x0cbe5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25ffe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e1e07379407fecc4b89eb7dbd287c2c781cfb1907a96947a3eb18e4f8e7198625", - "0xcec5070d609dd3497f72bde07fc96ba0e0cdd062e6eaf24295ad4ccfc41d4609": "0x0cbe5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f88dc3417d5058ec4b4503e0c12ea1a0a89be200fe98922423d4334014fa6b0eed43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27dd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27dd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27dd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27dd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d020a1091341fe5664bfa1782d5e04779689068c916b04cb365ec3153755684d9a1fe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860ed17c2d7823ebf260fd138f2d7e27d114c0145d968b5ff5006125f2414fadae698eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a488eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a488eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a488eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a488eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a480390084fdbf27d2b79d26a4f13f0ccd982cb755a661969143c37cbc49ef5b91f271e07379407fecc4b89eb7dbd287c2c781cfb1907a96947a3eb18e4f8e7198625439660b36c6c03afafca027b910b4fecf99801834c62a5e6006f27d978de234f90b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe2290b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe2290b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe2290b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe2290b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe220389411795514af1627765eceffcbd002719f031604fadd7d188e2dc585b4e1afb", + "0xcec5070d609dd3497f72bde07fc96ba088dcde934c658227ee1dfafcd6e16903": "0x08be5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25ffe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e", + "0xcec5070d609dd3497f72bde07fc96ba0e0cdd062e6eaf24295ad4ccfc41d4609": "0x08be5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f88dc3417d5058ec4b4503e0c12ea1a0a89be200fe98922423d4334014fa6b0eed43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27dd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27dd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27dd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d020a1091341fe5664bfa1782d5e04779689068c916b04cb365ec3153755684d9a1fe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860ed17c2d7823ebf260fd138f2d7e27d114c0145d968b5ff5006125f2414fadae698eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a488eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a488eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a488eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a480390084fdbf27d2b79d26a4f13f0ccd982cb755a661969143c37cbc49ef5b91f27", "0xd57bce545fb382c34570e5dfbf338f5e4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xd5c41b52a371aa36c9254ce34324f2a54e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0xd5c41b52a371aa36c9254ce34324f2a54e7b9012096b41c4eb3aaf947f6ea429": "0x0100", "0xd5e1a2fa16732ce6906189438c0a82c64e7b9012096b41c4eb3aaf947f6ea429": "0x0000", "0xd8bbe27baf3aa64bb483afabc240f68e4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", "0xd8f314b7f4e6b095f0f8ee4656a448254e7b9012096b41c4eb3aaf947f6ea429": "0x0100", - "0xda7d4185f8093e80caceb64da45219e30c98535b82c72faf3c64974094af4643": "0x0100000000000000030000000dbfa19dafecc6c6c04586ce02ad17e404dd9aa1ddde5521f3169b192ca4a699", + "0xda7d4185f8093e80caceb64da45219e30c98535b82c72faf3c64974094af4643": "0x010000000000000002000000697ea2a8fe5b03468548a7a413424a6292ab44a82a6f5cc594c3fa7dda7ce402", "0xda7d4185f8093e80caceb64da45219e34e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xda7d4185f8093e80caceb64da45219e3c52aa943bf0908860a3eea0fad707cdc": "0x0000000000000000030000000dbfa19dafecc6c6c04586ce02ad17e404dd9aa1ddde5521f3169b192ca4a699", - "0xe2e62dd81c48a88f73b6f6463555fd8e4e7b9012096b41c4eb3aaf947f6ea429": "0x0400", - "0xed25f63942de25ac5253ba64b5eb64d14e7b9012096b41c4eb3aaf947f6ea429": "0x0400", + "0xda7d4185f8093e80caceb64da45219e3c52aa943bf0908860a3eea0fad707cdc": "0x000000000000000002000000697ea2a8fe5b03468548a7a413424a6292ab44a82a6f5cc594c3fa7dda7ce402", + "0xe4bcc010e9d7e5be15c4809b64d6ca7d4e7b9012096b41c4eb3aaf947f6ea429": "0x0100", "0xedfb05b766f199ce00df85317e33050e4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xf0c365c3cf59d671eb72da0e7a4113c44e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xf2794c22e353e9a839f12faab03a911b4e7b9012096b41c4eb3aaf947f6ea429": "0x0100", - "0xf2794c22e353e9a839f12faab03a911b7f17cdfbfa73331856cca0acddd7842e": "0x00000000", - "0xf2794c22e353e9a839f12faab03a911bbdcb0c5143a8617ed38ae3810dd45bc6": "0x00000000", - "0xf2794c22e353e9a839f12faab03a911be2f6cb0456905c189bcb0458f9440f13": "0x00000000", - "0xf5207f03cfdce586301014700e2c25934e7b9012096b41c4eb3aaf947f6ea429": "0x0100" + "0xf0c365c3cf59d671eb72da0e7a4113c44e7b9012096b41c4eb3aaf947f6ea429": "0x0000" }, "childrenDefault": {} } diff --git a/docker/dockerfiles/binary_injected.Dockerfile b/docker/dockerfiles/binary_injected.Dockerfile index ac1fd5317c67cb4cbef1044a6e2e3379f8ff4662..c8930bd83f0274990aff281e84d75b7add9d1289 100644 --- a/docker/dockerfiles/binary_injected.Dockerfile +++ b/docker/dockerfiles/binary_injected.Dockerfile @@ -2,7 +2,7 @@ FROM docker.io/parity/base-bin # This file allows building a Generic container image # based on one or multiple pre-built Linux binaries. -# Some defaults are set to polkadot but all can be overriden. +# Some defaults are set to polkadot but all can be overridden. SHELL ["/bin/bash", "-c"] diff --git a/docker/dockerfiles/bridges_zombienet_tests_injected.Dockerfile b/docker/dockerfiles/bridges_zombienet_tests_injected.Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..4bfb73acda05880ef49570594d0769d1e5e4b147 --- /dev/null +++ b/docker/dockerfiles/bridges_zombienet_tests_injected.Dockerfile @@ -0,0 +1,58 @@ +# this image is built on top of existing Zombienet image +ARG ZOMBIENET_IMAGE +# this image uses substrate-relay image built elsewhere +ARG SUBSTRATE_RELAY_IMAGE=docker.io/paritytech/substrate-relay:v2023-11-07-rococo-westend-initial-relayer + +# metadata +ARG VCS_REF +ARG BUILD_DATE +ARG IMAGE_NAME + +# we need `substrate-relay` binary, built elsewhere +FROM ${SUBSTRATE_RELAY_IMAGE} as relay-builder + +# the base image is the zombienet image - we are planning to run zombienet tests using native +# provider here +FROM ${ZOMBIENET_IMAGE} + +LABEL io.parity.image.authors="devops-team@parity.io" \ + io.parity.image.vendor="Parity Technologies" \ + io.parity.image.title="${IMAGE_NAME}" \ + io.parity.image.description="Bridges Zombienet tests." \ + io.parity.image.source="https://github.com/paritytech/polkadot-sdk/blob/${VCS_REF}/docker/dockerfiles/bridges_zombienet_tests_injected.Dockerfile" \ + io.parity.image.revision="${VCS_REF}" \ + io.parity.image.created="${BUILD_DATE}" \ + io.parity.image.documentation="https://github.com/paritytech/polkadot-sdk/bridges/testing" + +# show backtraces +ENV RUST_BACKTRACE 1 +USER root + +# for native provider to work (TODO: fix in zn docker?) +RUN apt-get update && apt-get install -y procps sudo +RUN yarn global add @polkadot/api-cli + +# add polkadot binary to the docker image +COPY ./artifacts/polkadot /usr/local/bin/ +COPY ./artifacts/polkadot-execute-worker /usr/local/bin/ +COPY ./artifacts/polkadot-prepare-worker /usr/local/bin/ +# add polkadot-parachain binary to the docker image +COPY ./artifacts/polkadot-parachain /usr/local/bin +# copy substrate-relay to the docker image +COPY --from=relay-builder /home/user/substrate-relay /usr/local/bin/ +# we need bridges zombienet runner and tests +RUN mkdir -p /home/nonroot/bridges-polkadot-sdk +COPY ./artifacts/bridges-polkadot-sdk /home/nonroot/bridges-polkadot-sdk +# also prepare `generate_hex_encoded_call` for running +RUN set -eux; \ + cd /home/nonroot/bridges-polkadot-sdk/bridges/testing/framework/utils/generate_hex_encoded_call; \ + npm install + +# check if executable works in this container +USER nonroot +RUN /usr/local/bin/polkadot --version +RUN /usr/local/bin/polkadot-parachain --version +RUN /usr/local/bin/substrate-relay --version + +# https://polkadot.js.org/apps/?rpc=ws://127.0.0.1:{PORT}#/explorer +EXPOSE 9942 9910 8943 9945 9010 8945 diff --git a/docker/scripts/build-injected.sh b/docker/scripts/build-injected.sh index f415cf43c0eeefecbe0fe2a0649bbe9df0e2f960..749d0fa335cc1248fcde1770046fc7c1e31e9fbe 100755 --- a/docker/scripts/build-injected.sh +++ b/docker/scripts/build-injected.sh @@ -20,7 +20,7 @@ PROJECT_ROOT=${PROJECT_ROOT:-$(git rev-parse --show-toplevel)} DOCKERFILE=${DOCKERFILE:-docker/dockerfiles/binary_injected.Dockerfile} VERSION_TOML=$(grep "^version " $PROJECT_ROOT/Cargo.toml | grep -oE "([0-9\.]+-?[0-9]+)") -#n The following VAR have default that can be overriden +#n The following VAR have default that can be overridden DOCKER_OWNER=${DOCKER_OWNER:-parity} # We may get 1..n binaries, comma separated diff --git a/docs/RELEASE.md b/docs/RELEASE.md index 6d681d78f367abff313c63adb1559ea6aa06dbc7..e73be2779a99426203e209da846f938c0f73cceb 100644 --- a/docs/RELEASE.md +++ b/docs/RELEASE.md @@ -18,10 +18,16 @@ Rococo. To easily refer to a release, it shall be named by its date in the form ## Crate -We try to follow [SemVer 2.0.0](https://semver.org/) as best as possible for versioning our crates. SemVer requires a -piece of software to first declare a public API. The public API of the Polkadot SDK is hereby declared as the sum of all -crates' public APIs. +We try to follow [SemVer 2.0.0](https://semver.org/) as best as possible for versioning our crates. The definitions of +`major`, `minor` and `patch` version for Rust crates are slightly altered from their standard for pre `1.0.0` versions. +Quoting [rust-lang.org](https://doc.rust-lang.org/cargo/reference/semver.html): +>Initial development releases starting with “0.y.z” can treat changes in “y” as a major release, and “z” as a minor +release. “0.0.z” releases are always major changes. This is because Cargo uses the convention that only changes in the +left-most non-zero component are considered incompatible. + +SemVer requires a piece of software to first declare a public API. The public API of the Polkadot SDK +is hereby declared as the sum of all crates' public APIs. Inductively, the public API of our library crates is declared as all public items that are neither: - Inside a `__private` module diff --git a/docs/contributor/container.md b/docs/contributor/container.md index dd44b31bfe96994ed54e3eca8610e7d8778f5261..9c542f411c81f4237e69ffaf63d4686eeac204e4 100644 --- a/docs/contributor/container.md +++ b/docs/contributor/container.md @@ -16,7 +16,7 @@ Parity builds and publishes a container image that can be found as `docker.io/pa ## Parity CI image Parity maintains and uses internally a generic "CI" image that can be used as a base to build binaries: [Parity CI -container image](https://github.com/paritytech/scripts/tree/master/dockerfiles/ci-linux): +container image](https://github.com/paritytech/scripts/tree/master/dockerfiles/ci-unified): The command below allows building a Linux binary without having to even install Rust or any dependency locally: @@ -24,14 +24,11 @@ The command below allows building a Linux binary without having to even install docker run --rm -it \ -w /polkadot-sdk \ -v $(pwd):/polkadot-sdk \ - paritytech/ci-linux:production \ + paritytech/ci-unified:bullseye-1.75.0-2024-01-22-v20240222 \ cargo build --release --locked -p polkadot-parachain-bin --bin polkadot-parachain sudo chown -R $(id -u):$(id -g) target/ ``` -If you want to reproduce other steps of CI process you can use the following -[guide](https://github.com/paritytech/scripts#gitlab-ci-for-building-docker-images). - ## Injected image Injecting a binary inside a base image is the quickest option to get a working container image. This only works if you diff --git a/docs/mermaid/IA.mmd b/docs/mermaid/IA.mmd index 93d3e92814cf1307fa7c0ea9f290ed21edae58fb..4eb50bcf96a8932de3fa90748fcfeb3ca7f02a5f 100644 --- a/docs/mermaid/IA.mmd +++ b/docs/mermaid/IA.mmd @@ -3,7 +3,7 @@ flowchart devhub --> polkadot_sdk devhub --> reference_docs - devhub --> tutorial + devhub --> guides polkadot_sdk --> substrate polkadot_sdk --> frame diff --git a/docs/mermaid/outer_runtime_types.mmd b/docs/mermaid/outer_runtime_types.mmd new file mode 100644 index 0000000000000000000000000000000000000000..c909df16af1ffbb697e3d363634fa218005a9c32 --- /dev/null +++ b/docs/mermaid/outer_runtime_types.mmd @@ -0,0 +1,3 @@ +flowchart LR + RuntimeCall --"TryInto"--> PalletCall + PalletCall --"Into"--> RuntimeCall diff --git a/docs/sdk/Cargo.toml b/docs/sdk/Cargo.toml index c998a601486aa1ef15c2481180eb9db41a3af29b..426c5d9de4a022093c5e3c792722021601817c69 100644 --- a/docs/sdk/Cargo.toml +++ b/docs/sdk/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-sdk-docs" -description = "The one stop shop for developers of the polakdot-sdk" +description = "The one stop shop for developers of the polkadot-sdk" license = "GPL-3.0-or-later WITH Classpath-exception-2.0" homepage = "paritytech.github.io" repository.workspace = true @@ -17,21 +17,29 @@ workspace = true # Needed for all FRAME-based code parity-scale-codec = { version = "3.0.0", default-features = false } scale-info = { version = "2.6.0", default-features = false } -frame = { path = "../../substrate/frame", features = ["experimental", "runtime"] } +frame = { package = "polkadot-sdk-frame", path = "../../substrate/frame", features = [ + "experimental", + "runtime", +] } pallet-examples = { path = "../../substrate/frame/examples" } pallet-default-config-example = { path = "../../substrate/frame/examples/default-config" } +pallet-example-offchain-worker = { path = "../../substrate/frame/examples/offchain-worker" } # How we build docs in rust-docs -simple-mermaid = { git = "https://github.com/kianenigma/simple-mermaid.git", rev = "e48b187bcfd5cc75111acd9d241f1bd36604344b" } -docify = "0.2.7" +simple-mermaid = "0.1.1" +docify = "0.2.8" # Polkadot SDK deps, typically all should only be in scope such that we can link to their doc item. node-cli = { package = "staging-node-cli", path = "../../substrate/bin/node/cli" } kitchensink-runtime = { path = "../../substrate/bin/node/runtime" } chain-spec-builder = { package = "staging-chain-spec-builder", path = "../../substrate/bin/utils/chain-spec-builder" } subkey = { path = "../../substrate/bin/utils/subkey" } +frame-system = { path = "../../substrate/frame/system", default-features = false } +frame-support = { path = "../../substrate/frame/support", default-features = false } +frame-executive = { path = "../../substrate/frame/executive", default-features = false } +pallet-example-single-block-migrations = { path = "../../substrate/frame/examples/single-block-migrations" } -# Substrate +# Substrate Client sc-network = { path = "../../substrate/client/network" } sc-rpc-api = { path = "../../substrate/client/rpc-api" } sc-rpc = { path = "../../substrate/client/rpc" } @@ -43,6 +51,7 @@ sc-consensus-grandpa = { path = "../../substrate/client/consensus/grandpa" } sc-consensus-beefy = { path = "../../substrate/client/consensus/beefy" } sc-consensus-manual-seal = { path = "../../substrate/client/consensus/manual-seal" } sc-consensus-pow = { path = "../../substrate/client/consensus/pow" } + substrate-wasm-builder = { path = "../../substrate/utils/wasm-builder" } # Cumulus @@ -52,7 +61,22 @@ cumulus-pallet-parachain-system = { path = "../../cumulus/pallets/parachain-syst ] } parachain-info = { package = "staging-parachain-info", path = "../../cumulus/parachains/pallets/parachain-info" } pallet-aura = { path = "../../substrate/frame/aura", default-features = false } + +# Pallets and FRAME internals pallet-timestamp = { path = "../../substrate/frame/timestamp" } +pallet-balances = { path = "../../substrate/frame/balances" } +pallet-assets = { path = "../../substrate/frame/assets" } +pallet-preimage = { path = "../../substrate/frame/preimage" } +pallet-transaction-payment = { path = "../../substrate/frame/transaction-payment" } +pallet-utility = { path = "../../substrate/frame/utility" } +pallet-multisig = { path = "../../substrate/frame/multisig" } +pallet-proxy = { path = "../../substrate/frame/proxy" } +pallet-authorship = { path = "../../substrate/frame/authorship" } +pallet-collective = { path = "../../substrate/frame/collective" } +pallet-democracy = { path = "../../substrate/frame/democracy" } +pallet-uniques = { path = "../../substrate/frame/uniques" } +pallet-nfts = { path = "../../substrate/frame/nfts" } +pallet-scheduler = { path = "../../substrate/frame/scheduler" } # Primitives sp-io = { path = "../../substrate/primitives/io" } @@ -60,10 +84,15 @@ sp-api = { path = "../../substrate/primitives/api" } sp-core = { path = "../../substrate/primitives/core" } sp-keyring = { path = "../../substrate/primitives/keyring" } sp-runtime = { path = "../../substrate/primitives/runtime" } +sp-arithmetic = { path = "../../substrate/primitives/arithmetic" } + +# Misc pallet dependencies +pallet-referenda = { path = "../../substrate/frame/referenda" } +pallet-broker = { path = "../../substrate/frame/broker" } +pallet-babe = { path = "../../substrate/frame/babe" } -[dev-dependencies] -parity-scale-codec = "3.6.5" -scale-info = "2.9.0" +sp-offchain = { path = "../../substrate/primitives/offchain" } +sp-version = { path = "../../substrate/primitives/version" } -[features] -experimental = ["pallet-aura/experimental"] +# XCM +xcm = { package = "staging-xcm", path = "../../polkadot/xcm" } diff --git a/docs/sdk/assets/after-content.html b/docs/sdk/assets/after-content.html new file mode 100644 index 0000000000000000000000000000000000000000..30ae5c7ec430b46c5854cbcdd39b5d66d1ad3fd0 --- /dev/null +++ b/docs/sdk/assets/after-content.html @@ -0,0 +1,2 @@ + + diff --git a/docs/sdk/assets/header.html b/docs/sdk/assets/header.html new file mode 100644 index 0000000000000000000000000000000000000000..f55c31b53216cddc5da94099efc3566c27bdfe63 --- /dev/null +++ b/docs/sdk/assets/header.html @@ -0,0 +1,146 @@ + + + + + diff --git a/docs/sdk/assets/theme.css b/docs/sdk/assets/theme.css new file mode 100644 index 0000000000000000000000000000000000000000..a488e15c36b70ee76b14f429434daf0717bc0320 --- /dev/null +++ b/docs/sdk/assets/theme.css @@ -0,0 +1,17 @@ +:root { + --polkadot-pink: #E6007A; + --polkadot-green: #56F39A; + --polkadot-lime: #D3FF33; + --polkadot-cyan: #00B2FF; + --polkadot-purple: #552BBF; +} + +body.sdk-docs { + nav.sidebar>div.sidebar-crate>a>img { + width: 190px; + } + + nav.sidebar { + flex: 0 0 250px; + } +} diff --git a/docs/sdk/headers/toc.html b/docs/sdk/headers/toc.html deleted file mode 100644 index a4a074cb4f3153cb135da8608462d4ecf59144cb..0000000000000000000000000000000000000000 --- a/docs/sdk/headers/toc.html +++ /dev/null @@ -1,54 +0,0 @@ - - diff --git a/docs/sdk/src/guides/your_first_pallet/mod.rs b/docs/sdk/src/guides/your_first_pallet/mod.rs index 29cdda36ed15ba3fcf964494732fc8364defff45..c6e0dd0edf8925105661591d0831d65ff8ed02be 100644 --- a/docs/sdk/src/guides/your_first_pallet/mod.rs +++ b/docs/sdk/src/guides/your_first_pallet/mod.rs @@ -105,8 +105,8 @@ //! This macro will call `.into()` under the hood. #![doc = docify::embed!("./src/guides/your_first_pallet/mod.rs", transfer_better)] //! -//! Moreover, you will learn in the [Safe Defensive Programming -//! section](crate::reference_docs::safe_defensive_programming) that it is always recommended to use +//! Moreover, you will learn in the [Defensive Programming +//! section](crate::reference_docs::defensive_programming) that it is always recommended to use //! safe arithmetic operations in your runtime. By using [`frame::traits::CheckedSub`], we can not //! only take a step in that direction, but also improve the error handing and make it slightly more //! ergonomic. @@ -128,8 +128,8 @@ //! //! Recall that within our pallet, (almost) all blocks of code are generic over ``. And, //! because `trait Config: frame_system::Config`, we can get access to all items in `Config` (or -//! `frame_system::Config`) using `T::NameOfItem`. This is all within the boundaries of how Rust -//! traits and generics work. If unfamiliar with this pattern, read +//! `frame_system::Config`) using `T::NameOfItem`. This is all within the boundaries of how +//! Rust traits and generics work. If unfamiliar with this pattern, read //! [`crate::reference_docs::trait_based_programming`] before going further. //! //! Crucially, a typical FRAME runtime contains a `struct Runtime`. The main role of this `struct` @@ -250,14 +250,16 @@ // of event is probably not the best. //! //! With the explanation out of the way, let's see how these components can be added. Both follow a -//! fairly familiar syntax: normal Rust enums, with an extra `#[frame::event/error]` attribute -//! attached. +//! fairly familiar syntax: normal Rust enums, with extra +//! [`#[frame::event]`](frame::pallet_macros::event) and +//! [`#[frame::error]`](frame::pallet_macros::error) attributes attached. #![doc = docify::embed!("./src/guides/your_first_pallet/mod.rs", Event)] #![doc = docify::embed!("./src/guides/your_first_pallet/mod.rs", Error)] //! -//! One slightly custom part of this is the `#[pallet::generate_deposit(pub(super) fn -//! deposit_event)]` part. Without going into too much detail, in order for a pallet to emit events -//! to the rest of the system, it needs to do two things: +//! One slightly custom part of this is the [`#[pallet::generate_deposit(pub(super) fn +//! deposit_event)]`](frame::pallet_macros::generate_deposit) part. Without going into too +//! much detail, in order for a pallet to emit events to the rest of the system, it needs to do two +//! things: //! //! 1. Declare a type in its `Config` that refers to the overarching event type of the runtime. In //! short, by doing this, the pallet is expressing an important bound: `type RuntimeEvent: @@ -266,11 +268,12 @@ //! store it where needed. //! //! 2. But, doing this conversion and storing is too much to expect each pallet to define. FRAME -//! provides a default way of storing events, and this is what `pallet::generate_deposit` is doing. +//! provides a default way of storing events, and this is what +//! [`pallet::generate_deposit`](frame::pallet_macros::generate_deposit) is doing. #![doc = docify::embed!("./src/guides/your_first_pallet/mod.rs", config_v2)] //! //! > These `Runtime*` types are better explained in -//! > [`crate::reference_docs::frame_composite_enums`]. +//! > [`crate::reference_docs::frame_runtime_types`]. //! //! Then, we can rewrite the `transfer` dispatchable as such: #![doc = docify::embed!("./src/guides/your_first_pallet/mod.rs", transfer_v2)] @@ -280,20 +283,20 @@ #![doc = docify::embed!("./src/guides/your_first_pallet/mod.rs", runtime_v2)] //! //! In this snippet, the actual `RuntimeEvent` type (right hand side of `type RuntimeEvent = -//! RuntimeEvent`) is generated by `construct_runtime`. An interesting way to inspect this type is -//! to see its definition in rust-docs: +//! RuntimeEvent`) is generated by +//! [`construct_runtime`](frame::runtime::prelude::construct_runtime). An interesting way to inspect +//! this type is to see its definition in rust-docs: //! [`crate::guides::your_first_pallet::pallet_v2::tests::runtime_v2::RuntimeEvent`]. //! //! -//! //! ## What Next? //! //! The following topics where used in this guide, but not covered in depth. It is suggested to //! study them subsequently: //! -//! - [`crate::reference_docs::safe_defensive_programming`]. +//! - [`crate::reference_docs::defensive_programming`]. //! - [`crate::reference_docs::frame_origin`]. -//! - [`crate::reference_docs::frame_composite_enums`]. +//! - [`crate::reference_docs::frame_runtime_types`]. //! - The pallet we wrote in this guide was using `dev_mode`, learn more in //! [`frame::pallet_macros::config`]. //! - Learn more about the individual pallet items/macros, such as event and errors and call, in @@ -435,7 +438,7 @@ pub mod pallet { } ); - #[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] + #[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Runtime { type Block = MockBlock; // within pallet we just said `::AccountId`, now we @@ -714,7 +717,7 @@ pub mod pallet_v2 { } ); - #[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] + #[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Runtime { type Block = MockBlock; type AccountId = u64; diff --git a/docs/sdk/src/lib.rs b/docs/sdk/src/lib.rs index 075d9ddaffe5bd95bafa4ca1d06667c253d4a21b..e211476d2514419a3d0889ef426817342155c178 100644 --- a/docs/sdk/src/lib.rs +++ b/docs/sdk/src/lib.rs @@ -15,7 +15,7 @@ //! - Start by learning about the the [`polkadot_sdk`], its structure and context. //! - Then, head over the [`guides`]. This modules contains in-depth guides about the most important //! user-journeys of the Polkadot SDK. -//! - Whilst reading the guides, you might find back-links to [`crate::reference_docs`]. +//! - Whilst reading the guides, you might find back-links to [`reference_docs`]. //! - Finally, is the parent website of this crate that contains the //! list of further tools related to the Polkadot SDK. //! @@ -25,6 +25,11 @@ #![doc = simple_mermaid::mermaid!("../../mermaid/IA.mmd")] #![warn(rustdoc::broken_intra_doc_links)] #![warn(rustdoc::private_intra_doc_links)] +#![doc(html_favicon_url = "https://polkadot.network/favicon-32x32.png")] +#![doc( + html_logo_url = "https://europe1.discourse-cdn.com/standard21/uploads/polkadot2/original/1X/eb57081e2bb7c39e5fcb1a98b443e423fa4448ae.svg" +)] +#![doc(issue_tracker_base_url = "https://github.com/paritytech/polkadot-sdk/issues")] /// Meta information about this crate, how it is built, what principles dictates its evolution and /// how one can contribute to it. diff --git a/docs/sdk/src/meta_contributing.rs b/docs/sdk/src/meta_contributing.rs index 7ecf8b0adfd3a2038bd32b6d6b830c71782cd1b2..fcdcea9934bb6b8cf7ee6ec090ebd0939888238c 100644 --- a/docs/sdk/src/meta_contributing.rs +++ b/docs/sdk/src/meta_contributing.rs @@ -101,7 +101,7 @@ //! * Before even getting started, what is with all of this ``? We link to //! [`crate::reference_docs::trait_based_programming`]. //! * First, the name. Why is this called `pallet::call`? This goes back to `enum Call`, which is -//! explained in [`crate::reference_docs::frame_composite_enums`]. Build on top of this! +//! explained in [`crate::reference_docs::frame_runtime_types`]. Build on top of this! //! * Then, what is `origin`? Just an account id? [`crate::reference_docs::frame_origin`]. //! * Then, what is `DispatchResult`? Why is this called *dispatch*? Probably something that can be //! explained in the documentation of [`frame::prelude::DispatchResult`]. @@ -138,7 +138,9 @@ //! injected, run: //! //! ```sh -//! SKIP_WASM_BUILD=1 RUSTDOCFLAGS="--html-in-header $(pwd)/docs/sdk/headers/toc.html" cargo doc -p polkadot-sdk-docs --no-deps --open +//! SKIP_WASM_BUILD=1 \ +//! RUSTDOCFLAGS="--html-in-header $(pwd)/docs/sdk/headers/header.html --extend-css $(pwd)/docs/sdk/headers/theme.css --default-theme=ayu" \ +//! cargo doc -p polkadot-sdk-docs --no-deps --open //! ``` //! //! If even faster build time for docs is needed, you can temporarily remove most of the diff --git a/docs/sdk/src/polkadot_sdk/cumulus.rs b/docs/sdk/src/polkadot_sdk/cumulus.rs index 60c4839f9e2d680d6604cf12c0ba28f8d81765a2..9bd957c7c1c07fec93b330ce8a8e7ec8118d31c1 100644 --- a/docs/sdk/src/polkadot_sdk/cumulus.rs +++ b/docs/sdk/src/polkadot_sdk/cumulus.rs @@ -72,7 +72,7 @@ mod tests { mod system_pallets { use super::*; - #[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] + #[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Runtime { type Block = MockBlock; type OnSetCode = cumulus_pallet_parachain_system::ParachainSetCode; @@ -110,12 +110,11 @@ mod tests { type DisabledValidators = (); type MaxAuthorities = ConstU32<100_000>; type AllowMultipleBlocksPerSlot = ConstBool; - #[cfg(feature = "experimental")] type SlotDuration = pallet_aura::MinimumPeriodTimesTwo; } #[docify::export(timestamp)] - #[derive_impl(pallet_timestamp::config_preludes::TestDefaultConfig as pallet_timestamp::DefaultConfig)] + #[derive_impl(pallet_timestamp::config_preludes::TestDefaultConfig)] impl pallet_timestamp::Config for Runtime {} impl cumulus_pallet_aura_ext::Config for Runtime {} diff --git a/docs/sdk/src/polkadot_sdk/frame_runtime.rs b/docs/sdk/src/polkadot_sdk/frame_runtime.rs index c9eba7d64bd46b51230c1b06a96c6b89ffddd73d..f9b8a381365c4b3675485f3f32cb0cf751138275 100644 --- a/docs/sdk/src/polkadot_sdk/frame_runtime.rs +++ b/docs/sdk/src/polkadot_sdk/frame_runtime.rs @@ -87,93 +87,89 @@ //! * writing a runtime in pure Rust, as done in [this template](https://github.com/JoshOrndorff/frameless-node-template). //! * writing a runtime in AssemblyScript,as explored in [this project](https://github.com/LimeChain/subsembly). -#[cfg(test)] -mod tests { - use frame::prelude::*; +use frame::prelude::*; - /// A FRAME based pallet. This `mod` is the entry point for everything else. All - /// `#[pallet::xxx]` macros must be defined in this `mod`. Although, frame also provides an - /// experimental feature to break these parts into different `mod`s. See [`pallet_examples`] for - /// more. - #[docify::export] - #[frame::pallet(dev_mode)] - pub mod pallet { - use super::*; +/// A FRAME based pallet. This `mod` is the entry point for everything else. All +/// `#[pallet::xxx]` macros must be defined in this `mod`. Although, frame also provides an +/// experimental feature to break these parts into different `mod`s. See [`pallet_examples`] for +/// more. +#[docify::export] +#[frame::pallet(dev_mode)] +pub mod pallet { + use super::*; - /// The configuration trait of a pallet. Mandatory. Allows a pallet to receive types at a - /// later point from the runtime that wishes to contain it. It allows the pallet to be - /// parameterized over both types and values. - #[pallet::config] - pub trait Config: frame_system::Config { - /// A type that is not known now, but the runtime that will contain this pallet will - /// know it later, therefore we define it here as an associated type. - type RuntimeEvent: IsType<::RuntimeEvent> - + From>; + /// The configuration trait of a pallet. Mandatory. Allows a pallet to receive types at a + /// later point from the runtime that wishes to contain it. It allows the pallet to be + /// parameterized over both types and values. + #[pallet::config] + pub trait Config: frame_system::Config { + /// A type that is not known now, but the runtime that will contain this pallet will + /// know it later, therefore we define it here as an associated type. + type RuntimeEvent: IsType<::RuntimeEvent> + From>; - /// A parameterize-able value that we receive later via the `Get<_>` trait. - type ValueParameter: Get; + /// A parameterize-able value that we receive later via the `Get<_>` trait. + type ValueParameter: Get; - /// Similar to [`Config::ValueParameter`], but using `const`. Both are functionally - /// equal, but offer different tradeoffs. - const ANOTHER_VALUE_PARAMETER: u32; - } + /// Similar to [`Config::ValueParameter`], but using `const`. Both are functionally + /// equal, but offer different tradeoffs. + const ANOTHER_VALUE_PARAMETER: u32; + } - /// A mandatory struct in each pallet. All functions callable by external users (aka. - /// transactions) must be attached to this type (see [`frame::pallet_macros::call`]). For - /// convenience, internal (private) functions can also be attached to this type. - #[pallet::pallet] - pub struct Pallet(PhantomData); + /// A mandatory struct in each pallet. All functions callable by external users (aka. + /// transactions) must be attached to this type (see [`frame::pallet_macros::call`]). For + /// convenience, internal (private) functions can also be attached to this type. + #[pallet::pallet] + pub struct Pallet(PhantomData); - /// The events tha this pallet can emit. - #[pallet::event] - pub enum Event {} + /// The events tha this pallet can emit. + #[pallet::event] + pub enum Event {} - /// A storage item that this pallet contains. This will be part of the state root trie/root - /// of the blockchain. - #[pallet::storage] - pub type Value = StorageValue; + /// A storage item that this pallet contains. This will be part of the state root trie/root + /// of the blockchain. + #[pallet::storage] + pub type Value = StorageValue; - /// All *dispatchable* call functions (aka. transactions) are attached to `Pallet` in a - /// `impl` block. - #[pallet::call] - impl Pallet { - /// This will be callable by external users, and has two u32s as a parameter. - pub fn some_dispatchable( - _origin: OriginFor, - _param: u32, - _other_para: u32, - ) -> DispatchResult { - Ok(()) - } + /// All *dispatchable* call functions (aka. transactions) are attached to `Pallet` in a + /// `impl` block. + #[pallet::call] + impl Pallet { + /// This will be callable by external users, and has two u32s as a parameter. + pub fn some_dispatchable( + _origin: OriginFor, + _param: u32, + _other_para: u32, + ) -> DispatchResult { + Ok(()) } } +} - /// A simple runtime that contains the above pallet and `frame_system`, the mandatory pallet of - /// all runtimes. This runtime is for testing, but it shares a lot of similarities with a *real* - /// runtime. - #[docify::export] - pub mod runtime { - use super::pallet as pallet_example; - use frame::{prelude::*, testing_prelude::*}; - - // The major macro that amalgamates pallets into `enum Runtime` - construct_runtime!( - pub enum Runtime { - System: frame_system, - Example: pallet_example, - } - ); +/// A simple runtime that contains the above pallet and `frame_system`, the mandatory pallet of +/// all runtimes. This runtime is for testing, but it shares a lot of similarities with a *real* +/// runtime. +#[docify::export] +pub mod runtime { + use super::pallet as pallet_example; + use frame::{prelude::*, testing_prelude::*}; - // These `impl` blocks specify the parameters of each pallet's `trait Config`. - #[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] - impl frame_system::Config for Runtime { - type Block = MockBlock; + // The major macro that amalgamates pallets into `enum Runtime` + construct_runtime!( + pub enum Runtime { + System: frame_system, + Example: pallet_example, } + ); - impl pallet_example::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type ValueParameter = ConstU32<42>; - const ANOTHER_VALUE_PARAMETER: u32 = 42; - } + // These `impl` blocks specify the parameters of each pallet's `trait Config`. + #[derive_impl(frame_system::config_preludes::TestDefaultConfig)] + impl frame_system::Config for Runtime { + type Block = MockBlock; + } + + impl pallet_example::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type ValueParameter = ConstU32<42>; + const ANOTHER_VALUE_PARAMETER: u32 = 42; } } diff --git a/docs/sdk/src/polkadot_sdk/substrate.rs b/docs/sdk/src/polkadot_sdk/substrate.rs index 5021c55e581f3d9fcd06f8578998ab60db0abb71..69d74d86db1b585692d9df8ae9db08ae454ca9f9 100644 --- a/docs/sdk/src/polkadot_sdk/substrate.rs +++ b/docs/sdk/src/polkadot_sdk/substrate.rs @@ -99,7 +99,7 @@ //! demonstration. //! * [`chain_spec_builder`]: Utility to build more detailed chain-specs for the aforementioned //! node. Other projects typically contain a `build-spec` subcommand that does the same. -//! * [`node_template`](https://github.com/paritytech/polkadot-sdk/tree/master/substrate/bin/node-template): +//! * [`node_template`](https://github.com/paritytech/polkadot-sdk/tree/master/substrate/bin/node): //! a template node that contains a minimal set of features and can act as a starting point of a //! project. //! * [`subkey`]: Substrate's key management utility. diff --git a/docs/sdk/src/polkadot_sdk/templates.rs b/docs/sdk/src/polkadot_sdk/templates.rs index f60c75b8f219334ccc52a9ea8441d21a2dbede8d..4bf0e839c798fc55dd1fa0696c6bfe8411c32bc8 100644 --- a/docs/sdk/src/polkadot_sdk/templates.rs +++ b/docs/sdk/src/polkadot_sdk/templates.rs @@ -22,9 +22,8 @@ //! - [`frontier-parachain-template`](https://github.com/paritytech/frontier-parachain-template): A //! parachain template for launching EVM-compatible parachains. //! -//! [`substrate-node-template`]: https://github.com/paritytech/polkadot-sdk/blob/master/substrate/bin/node-template/ -//! [`substrate-minimal-template`]: https://github.com/paritytech/polkadot-sdk/blob/master/substrate/bin/minimal/ -//! [`cumulus-parachain-template`]: https://github.com/paritytech/polkadot-sdk/blob/master/cumulus/parachain-template/ +//! [`minimal-template`]: https://github.com/paritytech/polkadot-sdk/blob/master/templates/minimal/ +//! [`parachain-template`]: https://github.com/paritytech/polkadot-sdk/blob/master/templates/parachain/ // TODO: in general, we need to make a deliberate choice here of moving a few key templates to this // repo (nothing stays in `substrate-developer-hub`) and the everything else should be community diff --git a/docs/sdk/src/polkadot_sdk/xcm.rs b/docs/sdk/src/polkadot_sdk/xcm.rs index fd4d7f62aa702f5808552936404995ad67efaed9..5dcdc9e1de076c4507cb64517360df73e6733dc7 100644 --- a/docs/sdk/src/polkadot_sdk/xcm.rs +++ b/docs/sdk/src/polkadot_sdk/xcm.rs @@ -1,5 +1,71 @@ //! # XCM //! -//! @KiChjang @franciscoaguirre -//! TODO: RFCs, xcm-spec, the future of the repo, minimal example perhaps, forward to where actual -//! docs are hosted. +//! XCM, or Cross-Consensus Messaging, is a **language** to communicate **intentions** between +//! **consensus systems**. +//! +//! ## Overview +//! +//! XCM is a standard, whose specification lives in the [xcm format repo](https://github.com/paritytech/xcm-format). +//! It's agnostic both in programming language and blockchain platform, which means it could be used +//! in Rust in Polkadot, or in Go or C++ in any other platform like Cosmos or Ethereum. +//! +//! It enables different consensus systems to communicate with each other in an expressive manner. +//! Consensus systems include blockchains, smart contracts, and any other state machine that +//! achieves consensus in some way. +//! +//! XCM is executed on a virtual machine called the XCVM. +//! Scripts can be written with the XCM language, which are often called XCMs, messages or XCM +//! programs. Each program is a series of instructions, which get executed one after the other by +//! the virtual machine. These instructions aim to encompass all major things users typically do in +//! consensus systems. There are instructions on asset transferring, teleporting, locking, among +//! others. New instructions are added and changes to the XCVM are made via the [RFC process](https://github.com/paritytech/xcm-format/blob/master/proposals/0032-process.md). +//! +//! ## In Polkadot SDK +//! +//! The Polkadot SDK allows for easily deploying sovereign blockchains from scratch, all very +//! customizable. Dealing with many heterogeneous blockchains can be cumbersome. +//! XCM allows all these blockchains to communicate with an agreed-upon language. +//! As long as an implementation of the XCVM is implemented, the same XCM program can be executed in +//! all blockchains and perform the same task. +//! +//! ## Implementation +//! +//! A ready-to-use Rust implementation lives in the [polkadot-sdk repo](https://github.com/paritytech/polkadot-sdk/tree/master/polkadot/xcm), +//! but will be moved to its own repo in the future. +//! +//! Its main components are: +//! - `src`: the definition of the basic types and instructions +//! - [`xcm-executor`](https://paritytech.github.io/polkadot-sdk/master/staging_xcm_executor/struct.XcmExecutor.html): +//! an implementation of the virtual machine to execute instructions +//! - `pallet-xcm`: A FRAME pallet for interacting with the executor +//! - `xcm-builder`: a collection of types to configure the executor +//! - `xcm-simulator`: a playground for trying out different XCM programs and executor +//! configurations +//! +//! ## Example +//! +//! To perform the very usual operation of transferring assets, the following XCM program can be +//! used: +#![doc = docify::embed!("src/polkadot_sdk/xcm.rs", example_transfer)] +//! +//! ## Get started +//! +//! To learn how it works and to get started, go to the [XCM docs](https://paritytech.github.io/xcm-docs/). + +#[cfg(test)] +mod tests { + use xcm::latest::prelude::*; + + #[docify::export] + #[test] + fn example_transfer() { + let _transfer_program = Xcm::<()>(vec![ + WithdrawAsset((Here, 100u128).into()), + BuyExecution { fees: (Here, 100u128).into(), weight_limit: Unlimited }, + DepositAsset { + assets: All.into(), + beneficiary: AccountId32 { id: [0u8; 32].into(), network: None }.into(), + }, + ]); + } +} diff --git a/docs/sdk/src/reference_docs/defensive_programming.rs b/docs/sdk/src/reference_docs/defensive_programming.rs new file mode 100644 index 0000000000000000000000000000000000000000..9828e1b50918f3e832523c686797091db034a985 --- /dev/null +++ b/docs/sdk/src/reference_docs/defensive_programming.rs @@ -0,0 +1,395 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! [Defensive programming](https://en.wikipedia.org/wiki/Defensive_programming) is a design paradigm that enables a program to continue +//! running despite unexpected behavior, input, or events that may arise in runtime. +//! Usually, unforeseen circumstances may cause the program to stop or, in the Rust context, +//! panic!. Defensive practices allow for these circumstances to be accounted for ahead of time +//! and for them to be handled gracefully, which is in line with the intended fault-tolerant and +//! deterministic nature of blockchains. +//! +//! The Polkadot SDK is built to reflect these principles and to facilitate their usage accordingly. +//! +//! ## General Overview +//! +//! When developing within the context of the Substrate runtime, there is one golden rule: +//! +//! ***DO NOT PANIC***. There are some exceptions, but generally, this is the default precedent. +//! +//! > It’s important to differentiate between the runtime and node. The runtime refers to the core +//! > business logic of a Substrate-based chain, whereas the node refers to the outer client, which +//! > deals with telemetry and gossip from other nodes. For more information, read about +//! > [Substrate's node +//! > architecture](crate::reference_docs::wasm_meta_protocol#node-vs-runtime). It’s also important +//! > to note that the criticality of the node is slightly lesser +//! > than that of the runtime, which is why you may see `unwrap()` or other “non-defensive” +//! > approaches +//! in a few places of the node's code repository. +//! +//! Most of these practices fall within Rust's +//! colloquial usage of proper error propagation, handling, and arithmetic-based edge cases. +//! +//! General guidelines: +//! +//! - **Avoid writing functions that could explicitly panic,** such as directly using `unwrap()` on +//! a [`Result`], or accessing an out-of-bounds index on a collection. Safer methods to access +//! collection types, i.e., `get()` which allow defensive handling of the resulting [`Option`] are +//! recommended to be used. +//! - **It may be acceptable to use `except()`,** but only if one is completely certain (and has +//! performed a check beforehand) that a value won't panic upon unwrapping. *Even this is +//! discouraged*, however, as future changes to that function could then cause that statement to +//! panic. It is important to ensure all possible errors are propagated and handled effectively. +//! - **If a function *can* panic,** it usually is prefaced with `unchecked_` to indicate its +//! unsafety. +//! - **If you are writing a function that could panic,** [document it!](https://doc.rust-lang.org/rustdoc/how-to-write-documentation.html#documenting-components) +//! - **Carefully handle mathematical operations.** Many seemingly, simplistic operations, such as +//! **arithmetic** in the runtime, could present a number of issues [(see more later in this +//! document)](#integer-overflow). Use checked arithmetic wherever possible. +//! +//! These guidelines could be summarized in the following example, where `bad_pop` is prone to +//! panicking, and `good_pop` allows for proper error handling to take place: +//! +//!```ignore +//! // Bad pop always requires that we return something, even if vector/array is empty. +//! fn bad_pop(v: Vec) -> T {} +//! // Good pop allows us to return None from the Option if need be. +//! fn good_pop(v: Vec) -> Option {} +//! ``` +//! +//! ### Defensive Traits +//! +//! The [`Defensive`](frame::traits::Defensive) trait provides a number of functions, all of which +//! provide an alternative to 'vanilla' Rust functions, e.g.,: +//! +//! - [`defensive_unwrap_or()`](frame::traits::Defensive::defensive_unwrap_or) instead of +//! `unwrap_or()` +//! - [`defensive_ok_or()`](frame::traits::DefensiveOption::defensive_ok_or) instead of `ok_or()` +//! +//! Defensive methods use [`debug_assertions`](https://doc.rust-lang.org/reference/conditional-compilation.html#debug_assertions), which panic in development, but in +//! production/release, they will merely log an error (i.e., `log::error`). +//! +//! The [`Defensive`](frame::traits::Defensive) trait and its various implementations can be found +//! [here](frame::traits::Defensive). +//! +//! ## Integer Overflow +//! +//! The Rust compiler prevents static overflow from happening at compile time. +//! The compiler panics in **debug** mode in the event of an integer overflow. In +//! **release** mode, it resorts to silently _wrapping_ the overflowed amount in a modular fashion +//! (from the `MAX` back to zero). +//! +//! In runtime development, we don't always have control over what is being supplied +//! as a parameter. For example, even this simple add function could present one of two outcomes +//! depending on whether it is in **release** or **debug** mode: +//! +//! ```ignore +//! fn naive_add(x: u8, y: u8) -> u8 { +//! x + y +//! } +//! ``` +//! If we passed overflow-able values at runtime, this could panic (or wrap if in release). +//! +//! ```ignore +//! naive_add(250u8, 10u8); // In debug mode, this would panic. In release, this would return 4. +//! ``` +//! +//! It is the silent portion of this behavior that presents a real issue. Such behavior should be +//! made obvious, especially in blockchain development, where unsafe arithmetic could produce +//! unexpected consequences like a user balance over or underflowing. +//! +//! Fortunately, there are ways to both represent and handle these scenarios depending on our +//! specific use case natively built into Rust and libraries like [`sp_arithmetic`]. +//! +//! ## Infallible Arithmetic +//! +//! Both Rust and Substrate provide safe ways to deal with numbers and alternatives to floating +//! point arithmetic. +//! +//! Known scenarios that could be fallible should be avoided: i.e., avoiding the possibility of +//! dividing/modulo by zero at any point should be mitigated. One should be opting for a +//! `checked_*` method to introduce safe arithmetic in their code in most cases. +//! +//! A developer should use fixed-point instead of floating-point arithmetic to mitigate the +//! potential for inaccuracy, rounding errors, or other unexpected behavior. +//! +//! - [Fixed point types](sp_arithmetic::fixed_point) and their associated usage can be found here. +//! - [PerThing](sp_arithmetic::per_things) and its associated types can be found here. +//! +//! Using floating point number types (i.e., f32. f64) in the runtime should be avoided, as a single non-deterministic result could cause chaos for blockchain consensus along with the issues above. For more on the specifics of the peculiarities of floating point calculations, [watch this video by the Computerphile](https://www.youtube.com/watch?v=PZRI1IfStY0). +//! +//! The following methods demonstrate different ways to handle numbers natively in Rust safely, +//! without fear of panic or unexpected behavior from wrapping. +//! +//! ### Checked Arithmetic +//! +//! **Checked operations** utilize an `Option` as a return type. This allows for +//! catching any unexpected behavior in the event of an overflow through simple pattern matching. +//! +//! This is an example of a valid operation: +#![doc = docify::embed!("./src/reference_docs/defensive_programming.rs", checked_add_example)] +//! +//! This is an example of an invalid operation. In this case, a simulated integer overflow, which +//! would simply result in `None`: +#![doc = docify::embed!( + "./src/reference_docs/defensive_programming.rs", + checked_add_handle_error_example +)] +//! +//! Suppose you aren’t sure which operation to use for runtime math. In that case, checked +//! operations are the safest bet, presenting two predictable (and erroring) outcomes that can be +//! handled accordingly (Some and None). +//! +//! The following conventions can be seen within the Polkadot SDK, where it is +//! handled in two ways: +//! +//! - As an [`Option`], using the `if let` / `if` or `match` +//! - As a [`Result`], via `ok_or` (or similar conversion to [`Result`] from [`Option`]) +//! +//! #### Handling via Option - More Verbose +//! +//! Because wrapped operations return `Option`, you can use a more verbose/explicit form of error +//! handling via `if` or `if let`: +#![doc = docify::embed!("./src/reference_docs/defensive_programming.rs", increase_balance)] +//! +//! Optionally, match may also be directly used in a more concise manner: +#![doc = docify::embed!("./src/reference_docs/defensive_programming.rs", increase_balance_match)] +//! +//! This is generally a useful convention for handling checked types and most types that return +//! `Option`. +//! +//! #### Handling via Result - Less Verbose +//! +//! In the Polkadot SDK codebase, checked operations are handled as a `Result` via `ok_or`. This is +//! a less verbose way of expressing the above. This usage often boils down to the developer’s +//! preference: +#![doc = docify::embed!("./src/reference_docs/defensive_programming.rs", increase_balance_result)] +//! +//! ### Saturating Operations +//! +//! Saturating a number limits it to the type’s upper or lower bound, even if the integer type +//! overflowed in runtime. For example, adding to `u32::MAX` would simply limit itself to +//! `u32::MAX`: +#![doc = docify::embed!("./src/reference_docs/defensive_programming.rs", saturated_add_example)] +//! +//! Saturating calculations can be used if one is very sure that something won't overflow, but wants +//! to avoid introducing the notion of any potential-panic or wrapping behavior. +//! +//! There is also a series of defensive alternatives via +//! [`DefensiveSaturating`](frame::traits::DefensiveSaturating), which introduces the same behavior +//! of the [`Defensive`](frame::traits::Defensive) trait, only with saturating, mathematical +//! operations: +#![doc = docify::embed!( + "./src/reference_docs/defensive_programming.rs", + saturated_defensive_example +)] +//! +//! ### Mathematical Operations in Substrate Development - Further Context +//! +//! As a recap, we covered the following concepts: +//! +//! 1. **Checked** operations - using [`Option`] or [`Result`] +//! 2. **Saturating** operations - limited to the lower and upper bounds of a number type +//! 3. **Wrapped** operations (the default) - wrap around to above or below the bounds of a type +//! +//! #### The problem with 'default' wrapped operations +//! +//! **Wrapped operations** cause the overflow to wrap around to either the maximum or minimum of +//! that type. Imagine this in the context of a blockchain, where there are account balances, voting +//! counters, nonces for transactions, and other aspects of a blockchain. +//! +//! While it may seem trivial, choosing how to handle numbers is quite important. As a thought +//! exercise, here are some scenarios of which will shed more light on when to use which. +//! +//! #### Bob's Overflowed Balance +//! +//! **Bob's** balance exceeds the `Balance` type on the `EduChain`. Because the pallet developer did +//! not handle the calculation to add to Bob's balance with any regard to this overflow, **Bob's** +//! balance is now essentially `0`, the operation **wrapped**. +//! +//!

+//! Solution: Saturating or Checked +//! For Bob's balance problems, using a `saturating_add` or `checked_add` could've mitigated +//! this issue. They simply would've reached the upper, or lower bounds, of the particular type for +//! an on-chain balance. In other words: Bob's balance would've stayed at the maximum of the +//! Balance type.
+//! +//! #### Alice's 'Underflowed' Balance +//! +//! Alice’s balance has reached `0` after a transfer to Bob. Suddenly, she has been slashed on +//! EduChain, causing her balance to reach near the limit of `u32::MAX` - a very large amount - as +//! wrapped operations can go both ways. Alice can now successfully vote using her new, overpowered +//! token balance, destroying the chain's integrity. +//! +//!
+//! Solution: Saturating +//! For Alice's balance problem, using `saturated_sub` could've mitigated this issue. A saturating +//! calculation would've simply limited her balance to the lower bound of u32, as having a negative +//! balance is not a concept within blockchains. In other words: Alice's balance would've stayed +//! at "0", even after being slashed. +//! +//! This is also an example that while one system may work in isolation, shared interfaces, such +//! as the notion of balances, are often shared across multiple pallets - meaning these small +//! changes can make a big difference depending on the scenario.
+//! +//! #### Proposal ID Overwrite +//! +//! A `u8` parameter, called `proposals_count`, represents the type for counting the number of +//! proposals on-chain. Every time a new proposal is added to the system, this number increases. +//! With the proposal pallet's high usage, it has reached `u8::MAX`’s limit of 255, causing +//! `proposals_count` to go to 0. Unfortunately, this results in new proposals overwriting old ones, +//! effectively erasing any notion of past proposals! +//! +//!
+//! Solution: Checked +//! For the proposal IDs, proper handling via `checked` math would've been suitable, +//! Saturating could've been used - but it also would've 'failed' silently. Using `checked_add` to +//! ensure that the next proposal ID would've been valid would've been a viable way to let the user +//! know the state of their proposal: +//! +//! ```ignore +//! let next_proposal_id = current_count.checked_add(1).ok_or_else(|| Error::TooManyProposals)?; +//! ``` +//! +//!
+//! +//! From the above, we can clearly see the problematic nature of seemingly simple operations in the +//! runtime, and care should be given to ensure a defensive approach is taken. +//! +//! ### Edge cases of `panic!`-able instances in Substrate +//! +//! As you traverse through the codebase (particularly in `substrate/frame`, where the majority of +//! runtime code lives), you may notice that there (only a few!) occurrences where `panic!` is used +//! explicitly. This is used when the runtime should stall, rather than keep running, as that is +//! considered safer. Particularly when it comes to mission-critical components, such as block +//! authoring, consensus, or other protocol-level dependencies, going through with an action may +//! actually cause harm to the network, and thus stalling would be the better option. +//! +//! Take the example of the BABE pallet ([`pallet_babe`]), which doesn't allow for a validator to +//! participate if it is disabled (see: [`frame::traits::DisabledValidators`]): +//! +//! ```ignore +//! if T::DisabledValidators::is_disabled(authority_index) { +//! panic!( +//! "Validator with index {:?} is disabled and should not be attempting to author blocks.", +//! authority_index, +//! ); +//! } +//! ``` +//! +//! There are other examples in various pallets, mostly those crucial to the blockchain’s +//! functionality. Most of the time, you will not be writing pallets which operate at this level, +//! but these exceptions should be noted regardless. +//! +//! ## Other Resources +//! +//! - [PBA Book - FRAME Tips & Tricks](https://polkadot-blockchain-academy.github.io/pba-book/substrate/tips-tricks/page.html?highlight=perthing#substrate-and-frame-tips-and-tricks) +#![allow(dead_code)] +#[allow(unused_variables)] +mod fake_runtime_types { + // Note: The following types are purely for the purpose of example, and do not contain any + // *real* use case other than demonstrating various concepts. + pub enum RuntimeError { + Overflow, + UserDoesntExist, + } + + pub type Address = (); + + pub struct Runtime; + + impl Runtime { + fn get_balance(account: Address) -> Result { + Ok(0u64) + } + + fn set_balance(account: Address, new_balance: u64) {} + } + + #[docify::export] + fn increase_balance(account: Address, amount: u64) -> Result<(), RuntimeError> { + // Get a user's current balance + let balance = Runtime::get_balance(account)?; + // SAFELY increase the balance by some amount + if let Some(new_balance) = balance.checked_add(amount) { + Runtime::set_balance(account, new_balance); + Ok(()) + } else { + Err(RuntimeError::Overflow) + } + } + + #[docify::export] + fn increase_balance_match(account: Address, amount: u64) -> Result<(), RuntimeError> { + // Get a user's current balance + let balance = Runtime::get_balance(account)?; + // SAFELY increase the balance by some amount + let new_balance = match balance.checked_add(amount) { + Some(balance) => balance, + None => { + return Err(RuntimeError::Overflow); + }, + }; + Runtime::set_balance(account, new_balance); + Ok(()) + } + + #[docify::export] + fn increase_balance_result(account: Address, amount: u64) -> Result<(), RuntimeError> { + // Get a user's current balance + let balance = Runtime::get_balance(account)?; + // SAFELY increase the balance by some amount - this time, by using `ok_or` + let new_balance = balance.checked_add(amount).ok_or(RuntimeError::Overflow)?; + Runtime::set_balance(account, new_balance); + Ok(()) + } +} + +#[cfg(test)] +mod tests { + use frame::traits::DefensiveSaturating; + #[docify::export] + #[test] + fn checked_add_example() { + // This is valid, as 20 is perfectly within the bounds of u32. + let add = (10u32).checked_add(10); + assert_eq!(add, Some(20)) + } + + #[docify::export] + #[test] + fn checked_add_handle_error_example() { + // This is invalid - we are adding something to the max of u32::MAX, which would overflow. + // Luckily, checked_add just marks this as None! + let add = u32::MAX.checked_add(10); + assert_eq!(add, None) + } + + #[docify::export] + #[test] + fn saturated_add_example() { + // Saturating add simply saturates + // to the numeric bound of that type if it overflows. + let add = u32::MAX.saturating_add(10); + assert_eq!(add, u32::MAX) + } + + #[docify::export] + #[test] + #[cfg_attr(debug_assertions, should_panic(expected = "Defensive failure has been triggered!"))] + fn saturated_defensive_example() { + let saturated_defensive = u32::MAX.defensive_saturating_add(10); + assert_eq!(saturated_defensive, u32::MAX); + } +} diff --git a/docs/sdk/src/reference_docs/development_environment_advice.rs b/docs/sdk/src/reference_docs/development_environment_advice.rs index 4317695979367b32bfb673d2d368399c5ca35faa..21bbe78836c44b8afd70cab68e4b9b2f929fb4a0 100644 --- a/docs/sdk/src/reference_docs/development_environment_advice.rs +++ b/docs/sdk/src/reference_docs/development_environment_advice.rs @@ -111,3 +111,74 @@ //! If you have a powerful remote server available, you may consider using //! [cargo-remote](https://github.com/sgeisler/cargo-remote) to execute cargo commands on it, //! freeing up local resources for other tasks like `rust-analyzer`. +//! +//! When using `cargo-remote`, you can configure your editor to perform the the typical +//! "check-on-save" remotely as well. The configuration for VSCode is as follows: +//! +//! ```json +//! { +//! "rust-analyzer.cargo.buildScripts.overrideCommand": [ +//! "cargo", +//! "remote", +//! "--build-env", +//! "SKIP_WASM_BUILD=1", +//! "--", +//! "check", +//! "--message-format=json", +//! "--all-targets", +//! "--all-features", +//! "--target-dir=target/rust-analyzer" +//! ], +//! "rust-analyzer.check.overrideCommand": [ +//! "cargo", +//! "remote", +//! "--build-env", +//! "SKIP_WASM_BUILD=1", +//! "--", +//! "check", +//! "--workspace", +//! "--message-format=json", +//! "--all-targets", +//! "--all-features", +//! "--target-dir=target/rust-analyzer" +//! ], +//! } +//! ``` +//! +//! //! and the same in Lua for `neovim/nvim-lspconfig`: +//! +//! ```lua +//! ["rust-analyzer"] = { +//! cargo = { +//! buildScripts = { +//! overrideCommand = { +//! "cargo", +//! "remote", +//! "--build-env", +//! "SKIP_WASM_BUILD=1", +//! "--", +//! "check", +//! "--message-format=json", +//! "--all-targets", +//! "--all-features", +//! "--target-dir=target/rust-analyzer" +//! }, +//! }, +//! check = { +//! overrideCommand = { +//! "cargo", +//! "remote", +//! "--build-env", +//! "SKIP_WASM_BUILD=1", +//! "--", +//! "check", +//! "--workspace", +//! "--message-format=json", +//! "--all-targets", +//! "--all-features", +//! "--target-dir=target/rust-analyzer" +//! }, +//! }, +//! }, +//! }, +//! ``` diff --git a/docs/sdk/src/reference_docs/extrinsic_encoding.rs b/docs/sdk/src/reference_docs/extrinsic_encoding.rs index 9008f8f835f5d6cd1705c9dd4e4e4e78fd3aa2d9..8c8568a228fad140115e68feb3eec717ef30170c 100644 --- a/docs/sdk/src/reference_docs/extrinsic_encoding.rs +++ b/docs/sdk/src/reference_docs/extrinsic_encoding.rs @@ -127,7 +127,7 @@ //! runtimes, a call is represented as an enum of enums, where the outer enum represents the FRAME //! pallet being called, and the inner enum represents the call being made within that pallet, and //! any arguments to it. Read more about the call enum -//! [here][crate::reference_docs::frame_composite_enums]. +//! [here][crate::reference_docs::frame_runtime_types]. //! //! FRAME `Call` enums are automatically generated, and end up looking something like this: #![doc = docify::embed!("./src/reference_docs/extrinsic_encoding.rs", call_data)] diff --git a/docs/sdk/src/reference_docs/frame_composite_enums.rs b/docs/sdk/src/reference_docs/frame_composite_enums.rs deleted file mode 100644 index 6051cd534467672b9831187ef5c8b814712f7d18..0000000000000000000000000000000000000000 --- a/docs/sdk/src/reference_docs/frame_composite_enums.rs +++ /dev/null @@ -1 +0,0 @@ -//! # FRAME Composite Enums diff --git a/docs/sdk/src/reference_docs/frame_currency.rs b/docs/sdk/src/reference_docs/frame_currency.rs deleted file mode 100644 index 6987d51aec824d370fb4706ae7d5b942a2667a64..0000000000000000000000000000000000000000 --- a/docs/sdk/src/reference_docs/frame_currency.rs +++ /dev/null @@ -1,8 +0,0 @@ -//! FRAME Currency Abstractions and Traits -//! -//! Notes: -//! -//! - History, `Currency` trait. -//! - `Hold` and `Freeze` with diagram. -//! - `HoldReason` and `FreezeReason` -//! - This footgun: diff --git a/docs/sdk/src/reference_docs/frame_offchain_workers.rs b/docs/sdk/src/reference_docs/frame_offchain_workers.rs new file mode 100644 index 0000000000000000000000000000000000000000..7999707e5ee018c4bb7634e7a506ff8fee8fa8ac --- /dev/null +++ b/docs/sdk/src/reference_docs/frame_offchain_workers.rs @@ -0,0 +1,115 @@ +//! # Offchain Workers +//! +//! This reference document explains how offchain workers work in Substrate and FRAME. The main +//! focus is upon FRAME's implementation of this functionality. Nonetheless, offchain workers are a +//! Substrate-provided feature and can be used with possible alternatives to [`frame`] as well. +//! +//! Offchain workers are a commonly misunderstood topic, therefore we explain them bottom-up, +//! starting at the fundamentals and then describing the developer interface. +//! +//! ## Context +//! +//! Recall from [`crate::reference_docs::wasm_meta_protocol`] that the node and the runtime +//! communicate with one another via host functions and runtime APIs. Many of these interactions +//! contribute to the actual state transition of the blockchain. For example [`sp_api::Core`] is the +//! main runtime API that is called to execute new blocks. +//! +//! Offchain workers are in principle not different in any way: It is a runtime API exposed by the +//! wasm blob ([`sp_offchain::OffchainWorkerApi`]), and the node software calls into it when it +//! deems fit. But, crucially, this API call is different in that: +//! +//! 1. It can have no impact on the state ie. it is _OFF (the) CHAIN_. If any state is altered +//! during the execution of this API call, it is discarded. +//! 2. It has access to an extended set of host functions that allow the wasm blob to do more. For +//! example, call into HTTP requests. +//! +//! > The main way through which an offchain worker can interact with the state is by submitting an +//! > extrinsic to the chain. This is the ONLY way to alter the state from an offchain worker. +//! > [`pallet_example_offchain_worker`] provides an example of this. +//! +//! +//! Given the "Off Chain" nature of this API, it is important to remember that calling this API is +//! entirely optional. Some nodes might call into it, some might not, and it would have no impact on +//! the execution of your blockchain because no state is altered no matter the execution of the +//! offchain worker API. +//! +//! Substrate's CLI allows some degree of configuration about this, allowing node operators to +//! specify when they want to run the offchain worker API. See +//! [`sc_cli::RunCmd::offchain_worker_params`]. +//! +//! ## Nondeterministic Execution +//! +//! Needless to say, given the above description, the code in your offchain worker API can be +//! nondeterministic, as it is not part of the blockchain's STF, so it can be executed at unknown +//! times, by unknown nodes, and has no impact on the state. This is why an HTTP +//! ([`sp_runtime::offchain::http`]) API is readily provided to the offchain worker APIs. Because +//! there is no need for determinism in this context. +//! +//! > A common mistake here is for novice developers to see this HTTP API, and imagine that +//! > `polkadot-sdk` somehow magically solved the determinism in blockchains, and now a blockchain +//! > can make HTTP calls and it will all work. This is absolutely NOT the case. An HTTP call made +//! > by the offchain worker is non-deterministic by design. Blockchains can't and always won't be +//! > able to perform non-deterministic operations such as making HTTP calls to a foreign server. +//! +//! ## FRAME's API +//! +//! [`frame`] provides a simple API through which pallets can define offchain worker functions. This +//! is part of [`frame::traits::Hooks`], which is implemented as a part of +//! [`frame::pallet_macros::hooks`]. +//! +//! ``` +//! +//! #[frame::pallet] +//! pub mod pallet { +//! use frame::prelude::*; +//! +//! #[pallet::config] +//! pub trait Config: frame_system::Config {} +//! +//! #[pallet::pallet] +//! pub struct Pallet(_); +//! +//! #[pallet::hooks] +//! impl Hooks> for Pallet { +//! fn offchain_worker(block_number: BlockNumberFor) { +//! // ... +//! } +//! } +//! } +//! ``` +//! +//! Additionally, [`sp_runtime::offchain`] provides a set of utilities that can be used to moderate +//! the execution of offchain workers. +//! +//! ## Think Twice: Why Use Substrate's Offchain Workers? +//! +//! Consider the fact that in principle, an offchain worker code written using the above API is no +//! different than an equivalent written with an _actual offchain interaction library_, such as +//! [Polkadot-JS](https://polkadot.js.org/docs/), or any of the other ones listed [here](https://github.com/substrate-developer-hub/awesome-substrate?tab=readme-ov-file#client-libraries). +//! +//! They can both read from the state, and have no means of updating the state, other than the route +//! of submitting an extrinsic to the chain. Therefore, it is worth thinking twice before embedding +//! a logic as a part of Substrate's offchain worker API. Does it have to be there? can it not be a +//! simple, actual offchain application that lives outside of the chain's WASM blob? +//! +//! Some of the reasons why you might want to do the opposite, and actually embed an offchain worker +//! API into the WASM blob are: +//! +//! * Accessing the state is easier within the `offchain_worker` function, as it is already a part +//! of the runtime, and [`frame::pallet_macros::storage`] provides all the tools needed to read +//! the state. Other client libraries might provide varying degrees of capability here. +//! * It will be updated in synchrony with the runtime. A Substrate's offchain application is part +//! of the same WASM blob, and is therefore guaranteed to be up to date. +//! +//! For example, imagine you have modified a storage item to have a new type. This will possibly +//! require a [`crate::reference_docs::frame_runtime_upgrades_and_migrations`], and any offchain +//! code, such as a Polkadot-JS application, will have to be updated to reflect this change. Whereas +//! the WASM offchain worker code is guaranteed to already be updated, or else the runtime code will +//! not even compile. +//! +//! +//! ## Further References +//! +//! - +//! - +//! - [Offchain worker example](https://github.com/paritytech/polkadot-sdk/tree/master/substrate/frame/examples/offchain-worker) diff --git a/docs/sdk/src/reference_docs/frame_origin.rs b/docs/sdk/src/reference_docs/frame_origin.rs index a4078377cd77dad6b3aac78ba6acdddda14251a8..a2aac7dd3554fb614658f71a2bf88573379bbf9d 100644 --- a/docs/sdk/src/reference_docs/frame_origin.rs +++ b/docs/sdk/src/reference_docs/frame_origin.rs @@ -1,14 +1,260 @@ //! # FRAME Origin //! -//! Notes: -//! -//! - Def talk about account abstraction and how it is a solved issue in frame. See Gav's talk in -//! Protocol Berg 2023 -//! - system's raw origin, how it is amalgamated with other origins into one type -//! [`frame_composite_enums`] -//! - signed origin -//! - unsigned origin, link to [`fee_less_runtime`] -//! - Root origin, how no one can obtain it. -//! - Abstract origin: how FRAME allows you to express "origin is 2/3 of the this body or 1/2 of -//! that body or half of the token holders". -//! - `type CustomOrigin: EnsureOrigin<_>` in pallets. +//! Let's start by clarifying a common wrong assumption about Origin: +//! +//! **ORIGIN IS NOT AN ACCOUNT ID**. +//! +//! FRAME's origin abstractions allow you to convey meanings far beyond just an account-id being the +//! caller of an extrinsic. Nonetheless, an account-id having signed an extrinsic is one of the +//! meanings that an origin can convey. This is the commonly used [`frame_system::ensure_signed`], +//! where the return value happens to be an account-id. +//! +//! Instead, let's establish the following as the correct definition of an origin: +//! +//! > The origin type represents the privilege level of the caller of an extrinsic. +//! +//! That is, an extrinsic, through checking the origin, can *express what privilege level it wishes +//! to impose on the caller of the extrinsic*. One of those checks can be as simple as "*any account +//! that has signed a statement can pass*". +//! +//! But the origin system can also express more abstract and complicated privilege levels. For +//! example: +//! +//! * If the majority of token holders agreed upon this. This is more or less what the +//! [`pallet_democracy`] does under the hood ([reference](https://github.com/paritytech/polkadot-sdk/blob/edd95b3749754d2ed0c5738588e872c87be91624/substrate/frame/democracy/src/lib.rs#L1603-L1633)). +//! * If a specific ratio of an instance of [`pallet_collective`]/DAO agrees upon this. +//! * If another consensus system, for example a bridged network or a parachain, agrees upon this. +//! * If the majority of validator/authority set agrees upon this[^1]. +//! * If caller holds a particular NFT. +//! +//! and many more. +//! +//! ## Context +//! +//! First, let's look at where the `origin` type is encountered in a typical pallet. The `origin: +//! OriginFor` has to be the first argument of any given callable extrinsic in FRAME: +#![doc = docify::embed!("./src/reference_docs/frame_origin.rs", call_simple)] +//! +//! Typically, the code of an extrinsic starts with an origin check, such as +//! [`frame_system::ensure_signed`]. +//! +//! Note that [`OriginFor`](frame_system::pallet_prelude::OriginFor) is merely a shorthand for +//! [`frame_system::Config::RuntimeOrigin`]. Given the name prefix `Runtime`, we can learn that +//! `RuntimeOrigin` is similar to `RuntimeCall` and others, a runtime composite enum that is +//! amalgamated at the runtime level. Read [`crate::reference_docs::frame_runtime_types`] to +//! familiarize yourself with these types. +//! +//! To understand this better, we will next create a pallet with a custom origin, which will add a +//! new variant to `RuntimeOrigin`. +//! +//! ## Adding Custom Pallet Origin to the Runtime +//! +//! For example, given a pallet that defines the following custom origin: +#![doc = docify::embed!("./src/reference_docs/frame_origin.rs", custom_origin)] +//! +//! And a runtime with the following pallets: +#![doc = docify::embed!("./src/reference_docs/frame_origin.rs", runtime_exp)] +//! +//! The type [`crate::reference_docs::frame_origin::runtime_for_origin::RuntimeOrigin`] is expanded. +//! This `RuntimeOrigin` contains a variant for the [`frame_system::RawOrigin`] and the custom +//! origin of the pallet. +//! +//! > Notice how the [`frame_system::ensure_signed`] is nothing more than a `match` statement. If +//! > you want to know where the actual origin of an extrinsic is set (and the signature +//! > verification happens, if any), see +//! > [`sp_runtime::generic::CheckedExtrinsic#trait-implementations`], specifically +//! > [`sp_runtime::traits::Applyable`]'s implementation. +//! +//! ## Asserting on a Custom Internal Origin +//! +//! In order to assert on a custom origin that is defined within your pallet, we need a way to first +//! convert the `::RuntimeOrigin` into the local `enum Origin` of the +//! current pallet. This is a common process that is explained in +//! [`crate::reference_docs::frame_runtime_types# +//! adding-further-constraints-to-runtime-composite-enums`]. +//! +//! We use the same process here to express that `RuntimeOrigin` has a number of additional bounds, +//! as follows. +//! +//! 1. Defining a custom `RuntimeOrigin` with further bounds in the pallet. +#![doc = docify::embed!("./src/reference_docs/frame_origin.rs", custom_origin_bound)] +//! +//! 2. Using it in the pallet. +#![doc = docify::embed!("./src/reference_docs/frame_origin.rs", custom_origin_usage)] +//! +//! ## Asserting on a Custom External Origin +//! +//! Very often, a pallet wants to have a parameterized origin that is **NOT** defined within the +//! pallet. In other words, a pallet wants to delegate an origin check to something that is +//! specified later at the runtime level. Like many other parameterizations in FRAME, this implies +//! adding a new associated type to `trait Config`. +#![doc = docify::embed!("./src/reference_docs/frame_origin.rs", external_origin_def)] +//! +//! Then, within the pallet, we can simply use this "unknown" origin check type: +#![doc = docify::embed!("./src/reference_docs/frame_origin.rs", external_origin_usage)] +//! +//! Finally, at the runtime, any implementation of [`frame::traits::EnsureOrigin`] can be passed. +#![doc = docify::embed!("./src/reference_docs/frame_origin.rs", external_origin_provide)] +//! +//! Indeed, some of these implementations of [`frame::traits::EnsureOrigin`] are similar to the ones +//! that we know about: [`frame::runtime::prelude::EnsureSigned`], +//! [`frame::runtime::prelude::EnsureSignedBy`], [`frame::runtime::prelude::EnsureRoot`], +//! [`frame::runtime::prelude::EnsureNone`], etc. But, there are also many more that are not known +//! to us, and are defined in other pallets. +//! +//! For example, [`pallet_collective`] defines [`pallet_collective::EnsureMember`] and +//! [`pallet_collective::EnsureProportionMoreThan`] and many more, which is exactly what we alluded +//! to earlier in this document. +//! +//! Make sure to check the full list of [implementors of +//! `EnsureOrigin`](frame::traits::EnsureOrigin#implementors) for more inspiration. +//! +//! ## Obtaining Abstract Origins +//! +//! So far we have learned that FRAME pallets can assert on custom and abstract origin types, +//! whether they are defined within the pallet or not. But how can we obtain these abstract origins? +//! +//! > All extrinsics that come from the outer world can generally only be obtained as either +//! > `signed` or `none` origin. +//! +//! Generally, these abstract origins are only obtained within the runtime, when a call is +//! dispatched within the runtime. +//! +//! ## Further References +//! +//! - [Gavin Wood's speech about FRAME features at Protocol Berg 2023.](https://youtu.be/j7b8Upipmeg?si=83_XUgYuJxMwWX4g&t=195) +//! - [A related StackExchange question.](https://substrate.stackexchange.com/questions/10992/how-do-you-find-the-public-key-for-the-medium-spender-track-origin) +//! +//! [^1]: Inherents are essentially unsigned extrinsics that need an [`frame_system::ensure_none`] +//! origin check, and through the virtue of being an inherent, are agreed upon by all validators. + +use frame::prelude::*; + +#[frame::pallet(dev_mode)] +pub mod pallet_for_origin { + use super::*; + + #[pallet::config] + pub trait Config: frame_system::Config {} + + #[pallet::pallet] + pub struct Pallet(_); + + #[docify::export(call_simple)] + #[pallet::call] + impl Pallet { + pub fn do_something(_origin: OriginFor) -> DispatchResult { + // ^^^^^^^^^^^^^^^^^^^^^ + todo!(); + } + } +} + +#[frame::pallet(dev_mode)] +pub mod pallet_with_custom_origin { + use super::*; + + #[docify::export(custom_origin_bound)] + #[pallet::config] + pub trait Config: frame_system::Config { + type RuntimeOrigin: From<::RuntimeOrigin> + + Into::RuntimeOrigin>>; + } + + #[pallet::pallet] + pub struct Pallet(_); + + #[docify::export(custom_origin)] + /// A dummy custom origin. + #[pallet::origin] + #[derive(PartialEq, Eq, Clone, RuntimeDebug, Encode, Decode, TypeInfo, MaxEncodedLen)] + pub enum Origin { + /// If all holders of a particular NFT have agreed upon this. + AllNftHolders, + /// If all validators have agreed upon this. + ValidatorSet, + } + + #[docify::export(custom_origin_usage)] + #[pallet::call] + impl Pallet { + pub fn only_validators(origin: OriginFor) -> DispatchResult { + // first, we convert from `::RuntimeOrigin` to `::RuntimeOrigin` + let local_runtime_origin = <::RuntimeOrigin as From< + ::RuntimeOrigin, + >>::from(origin); + // then we convert to `origin`, if possible + let local_origin = + local_runtime_origin.into().map_err(|_| "invalid origin type provided")?; + ensure!(matches!(local_origin, Origin::ValidatorSet), "Not authorized"); + todo!(); + } + } +} + +pub mod runtime_for_origin { + use super::pallet_with_custom_origin; + use frame::{runtime::prelude::*, testing_prelude::*}; + + #[docify::export(runtime_exp)] + construct_runtime!( + pub struct Runtime { + System: frame_system, + PalletWithCustomOrigin: pallet_with_custom_origin, + } + ); + + #[derive_impl(frame_system::config_preludes::TestDefaultConfig)] + impl frame_system::Config for Runtime { + type Block = MockBlock; + } + + impl pallet_with_custom_origin::Config for Runtime { + type RuntimeOrigin = RuntimeOrigin; + } +} + +#[frame::pallet(dev_mode)] +pub mod pallet_with_external_origin { + use super::*; + #[docify::export(external_origin_def)] + #[pallet::config] + pub trait Config: frame_system::Config { + type ExternalOrigin: EnsureOrigin; + } + + #[pallet::pallet] + pub struct Pallet(_); + + #[docify::export(external_origin_usage)] + #[pallet::call] + impl Pallet { + pub fn externally_checked_ext(origin: OriginFor) -> DispatchResult { + let _ = T::ExternalOrigin::ensure_origin(origin)?; + todo!(); + } + } +} + +pub mod runtime_for_external_origin { + use super::*; + use frame::{runtime::prelude::*, testing_prelude::*}; + + construct_runtime!( + pub struct Runtime { + System: frame_system, + PalletWithExternalOrigin: pallet_with_external_origin, + } + ); + + #[derive_impl(frame_system::config_preludes::TestDefaultConfig)] + impl frame_system::Config for Runtime { + type Block = MockBlock; + } + + #[docify::export(external_origin_provide)] + impl pallet_with_external_origin::Config for Runtime { + type ExternalOrigin = EnsureSigned<::AccountId>; + } +} diff --git a/docs/sdk/src/reference_docs/frame_pallet_coupling.rs b/docs/sdk/src/reference_docs/frame_pallet_coupling.rs new file mode 100644 index 0000000000000000000000000000000000000000..be464bbbf8359c77fa549ab80bcb0008244488f9 --- /dev/null +++ b/docs/sdk/src/reference_docs/frame_pallet_coupling.rs @@ -0,0 +1,296 @@ +//! # FRAME Pallet Coupling +//! +//! This reference document explains how FRAME pallets can be combined to interact together. +//! +//! It is suggested to re-read [`crate::polkadot_sdk::frame_runtime`], notably the information +//! around [`frame::pallet_macros::config`]. Recall that: +//! +//! > Configuration trait of a pallet: It allows a pallet to receive types at a later +//! > point from the runtime that wishes to contain it. It allows the pallet to be parameterized +//! > over both types and values. +//! +//! ## Context, Background +//! +//! FRAME pallets, as per described in [`crate::polkadot_sdk::frame_runtime`] are: +//! +//! > A pallet is a unit of encapsulated logic. It has a clearly defined responsibility and can be +//! linked to other pallets. +//! +//! That is to say: +//! +//! * *encapsulated*: Ideally, a FRAME pallet contains encapsulated logic which has clear +//! boundaries. It is generally a bad idea to build a single monolithic pallet that does multiple +//! things, such as handling currencies, identities and staking all at the same time. +//! * *linked to other pallets*: But, adhering extensively to the above also hinders the ability to +//! write useful applications. Pallets often need to work with each other, communicate and use +//! each other's functionalities. +//! +//! The broad principle that allows pallets to be linked together is the same way through which a +//! pallet uses its `Config` trait to receive types and values from the runtime that contains it. +//! +//! There are generally two ways to achieve this: +//! +//! 1. Tight coupling pallets +//! 2. Loose coupling pallets +//! +//! To explain the difference between the two, consider two pallets, `A` and `B`. In both cases, `A` +//! wants to use some functionality exposed by `B`. +//! +//! When tightly coupling pallets, `A` can only exist in a runtime if `B` is also present in the +//! same runtime. That is, `A` is expressing that can only work if `B` is present. +//! +//! This translates to the following Rust code: +//! +//! ``` +//! trait Pallet_B_Config {} +//! trait Pallet_A_Config: Pallet_B_Config {} +//! ``` +//! +//! Contrary, when pallets are loosely coupled, `A` expresses that some functionality, expressed via +//! a trait `F`, needs to be fulfilled. This trait is then implemented by `B`, and the two pallets +//! are linked together at the runtime level. This means that `A` only relies on the implementation +//! of `F`, which may be `B`, or another implementation of `F`. +//! +//! This translates to the following Rust code: +//! +//! ``` +//! trait F {} +//! trait Pallet_A_Config { +//! type F: F; +//! } +//! // Pallet_B will implement and fulfill `F`. +//! ``` +//! +//! ## Example +//! +//! Consider the following example, in which `pallet-foo` needs another pallet to provide the block +//! author to it, and `pallet-author` which has access to this information. +#![doc = docify::embed!("./src/reference_docs/frame_pallet_coupling.rs", pallet_foo)] +#![doc = docify::embed!("./src/reference_docs/frame_pallet_coupling.rs", pallet_author)] +//! +//! ### Tight Coupling Pallets +//! +//! To tightly couple `pallet-foo` and `pallet-author`, we use Rust's supertrait system. When a +//! pallet makes its own `trait Config` be bounded by another pallet's `trait Config`, it is +//! expressing two things: +//! +//! 1. that it can only exist in a runtime if the other pallet is also present. +//! 2. that it can use the other pallet's functionality. +//! +//! `pallet-foo`'s `Config` would then look like: +#![doc = docify::embed!("./src/reference_docs/frame_pallet_coupling.rs", tight_config)] +//! +//! And `pallet-foo` can use the method exposed by `pallet_author::Pallet` directly: +#![doc = docify::embed!("./src/reference_docs/frame_pallet_coupling.rs", tight_usage)] +//! +//! +//! ### Loosely Coupling Pallets +//! +//! If `pallet-foo` wants to *not* rely on `pallet-author` directly, it can leverage its +//! `Config`'s associated types. First, we need a trait to express the functionality that +//! `pallet-foo` wants to obtain: +#![doc = docify::embed!("./src/reference_docs/frame_pallet_coupling.rs", AuthorProvider)] +//! +//! > We sometimes refer to such traits that help two pallets interact as "glue traits". +//! +//! Next, `pallet-foo` states that it needs this trait to be provided to it, at the runtime level, +//! via an associated type: +#![doc = docify::embed!("./src/reference_docs/frame_pallet_coupling.rs", loose_config)] +//! +//! Then, `pallet-foo` can use this trait to obtain the block author, without knowing where it comes +//! from: +#![doc = docify::embed!("./src/reference_docs/frame_pallet_coupling.rs", loose_usage)] +//! +//! Then, if `pallet-author` implements this glue-trait: +#![doc = docify::embed!("./src/reference_docs/frame_pallet_coupling.rs", pallet_author_provider)] +//! +//! And upon the creation of the runtime, the two pallets are linked together as such: +#![doc = docify::embed!("./src/reference_docs/frame_pallet_coupling.rs", runtime_author_provider)] +//! +//! Crucially, when using loose coupling, we gain the flexibility of providing different +//! implementations of `AuthorProvider`, such that different users of a `pallet-foo` can use +//! different ones, without any code change being needed. For example, in the code snippets of this +//! module, you can fund [`OtherAuthorProvider`] which is an alternative implementation of +//! [`AuthorProvider`]. +#![doc = docify::embed!("./src/reference_docs/frame_pallet_coupling.rs", other_author_provider)] +//! +//! A common pattern in polkadot-sdk is to provide an implementation of such glu traits for the unit +//! type as a "default/test behavior". +#![doc = docify::embed!("./src/reference_docs/frame_pallet_coupling.rs", unit_author_provider)] +//! +//! ## Frame System +//! +//! With the above information in context, we can conclude that **`frame_system` is a special pallet +//! that is tightly coupled with every other pallet**. This is because it provides the fundamental +//! system functionality that every pallet needs, such as some types like +//! [`frame::prelude::frame_system::Config::AccountId`], +//! [`frame::prelude::frame_system::Config::Hash`], and some functionality such as block number, +//! etc. +//! +//! ## Recap +//! +//! To recap, consider the following rules of thumb: +//! +//! * In all cases, try and break down big pallets apart with clear boundaries of responsibility. In +//! general, it is easier to argue about multiple pallet if they only communicate together via a +//! known trait, rather than having access to all of each others public items, such as storage and +//! dispatchables. +//! * If a group of pallets are meant to work together, and but are not foreseen to be generalized, +//! or used by others, consider tightly coupling pallets, *if it simplifies the development*. +//! * If a pallet needs a functionality provided by another pallet, but multiple implementations can +//! be foreseen, consider loosely coupling pallets. +//! +//! For example, all pallets in `polkadot-sdk` that needed to work with currencies could have been +//! tightly coupled with [`pallet_balances`]. But, `polkadot-sdk` also provides [`pallet_assets`] +//! (and more implementations by the community), therefore all pallets use traits to loosely couple +//! with balances or assets pallet. More on this in [`crate::reference_docs::frame_tokens`]. +//! +//! ## Further References +//! +//! - +//! - +//! +//! [`AuthorProvider`]: crate::reference_docs::frame_pallet_coupling::AuthorProvider +//! [`OtherAuthorProvider`]: crate::reference_docs::frame_pallet_coupling::OtherAuthorProvider + +#![allow(unused)] + +use frame::prelude::*; + +#[docify::export] +#[frame::pallet] +pub mod pallet_foo { + use super::*; + + #[pallet::config] + pub trait Config: frame_system::Config {} + + #[pallet::pallet] + pub struct Pallet(_); + + impl Pallet { + fn do_stuff_with_author() { + // needs block author here + } + } +} + +#[docify::export] +#[frame::pallet] +pub mod pallet_author { + use super::*; + + #[pallet::config] + pub trait Config: frame_system::Config {} + + #[pallet::pallet] + pub struct Pallet(_); + + impl Pallet { + pub fn author() -> T::AccountId { + todo!("somehow has access to the block author and can return it here") + } + } +} + +#[frame::pallet] +pub mod pallet_foo_tight { + use super::*; + + #[pallet::pallet] + pub struct Pallet(_); + + #[docify::export(tight_config)] + /// This pallet can only live in a runtime that has both `frame_system` and `pallet_author`. + #[pallet::config] + pub trait Config: frame_system::Config + pallet_author::Config {} + + #[docify::export(tight_usage)] + impl Pallet { + // anywhere in `pallet-foo`, we can call into `pallet-author` directly, namely because + // `T: pallet_author::Config` + fn do_stuff_with_author() { + let _ = pallet_author::Pallet::::author(); + } + } +} + +#[docify::export] +/// Abstraction over "something that can provide the block author". +pub trait AuthorProvider { + fn author() -> AccountId; +} + +#[frame::pallet] +pub mod pallet_foo_loose { + use super::*; + + #[pallet::pallet] + pub struct Pallet(_); + + #[docify::export(loose_config)] + #[pallet::config] + pub trait Config: frame_system::Config { + /// This pallet relies on the existence of something that implements [`AuthorProvider`], + /// which may or may not be `pallet-author`. + type AuthorProvider: AuthorProvider; + } + + #[docify::export(loose_usage)] + impl Pallet { + fn do_stuff_with_author() { + let _ = T::AuthorProvider::author(); + } + } +} + +#[docify::export(pallet_author_provider)] +impl AuthorProvider for pallet_author::Pallet { + fn author() -> T::AccountId { + pallet_author::Pallet::::author() + } +} + +pub struct OtherAuthorProvider; + +#[docify::export(other_author_provider)] +impl AuthorProvider for OtherAuthorProvider { + fn author() -> AccountId { + todo!("somehow get the block author here") + } +} + +#[docify::export(unit_author_provider)] +impl AuthorProvider for () { + fn author() -> AccountId { + todo!("somehow get the block author here") + } +} + +pub mod runtime { + use super::*; + use cumulus_pallet_aura_ext::pallet; + use frame::{runtime::prelude::*, testing_prelude::*}; + + construct_runtime!( + pub struct Runtime { + System: frame_system, + PalletFoo: pallet_foo_loose, + PalletAuthor: pallet_author, + } + ); + + #[derive_impl(frame_system::config_preludes::TestDefaultConfig)] + impl frame_system::Config for Runtime { + type Block = MockBlock; + } + + impl pallet_author::Config for Runtime {} + + #[docify::export(runtime_author_provider)] + impl pallet_foo_loose::Config for Runtime { + type AuthorProvider = pallet_author::Pallet; + // which is also equivalent to + // type AuthorProvider = PalletAuthor; + } +} diff --git a/docs/sdk/src/reference_docs/frame_runtime_migration.rs b/docs/sdk/src/reference_docs/frame_runtime_migration.rs deleted file mode 100644 index 0616ccbb6f57971823c7347a60574ef0c0bef2ab..0000000000000000000000000000000000000000 --- a/docs/sdk/src/reference_docs/frame_runtime_migration.rs +++ /dev/null @@ -1,9 +0,0 @@ -//! # Runtime Runtime Upgrade and Testing -//! -//! -//! Notes: -//! -//! - Flow of things, when does `on_runtime_upgrade` get called. Link to to `Hooks` and its diagram -//! as source of truth. -//! - Data migration and when it is needed. -//! - Look into the pba-lecture. diff --git a/docs/sdk/src/reference_docs/frame_runtime_types.rs b/docs/sdk/src/reference_docs/frame_runtime_types.rs new file mode 100644 index 0000000000000000000000000000000000000000..32cda5bc5345d7eee43efa9e2b99ac831c8fb3a8 --- /dev/null +++ b/docs/sdk/src/reference_docs/frame_runtime_types.rs @@ -0,0 +1,306 @@ +//! # FRAME Runtime Types +//! +//! This reference document briefly explores the idea around types generated at the runtime level by +//! the FRAME macros. +//! +//! > As of now, many of these important types are generated within the internals of +//! > [`construct_runtime`], and there is no easy way for you to visually know they exist. +//! > [#polkadot-sdk#1378](https://github.com/paritytech/polkadot-sdk/pull/1378) is meant to +//! > significantly improve this. Exploring the rust-docs of a runtime, such as [`runtime`] which is +//! > defined in this module is as of now the best way to learn about these types. +//! +//! ## Composite Enums +//! +//! Many types within a FRAME runtime follow the following structure: +//! +//! * Each individual pallet defines a type, for example `Foo`. +//! * At the runtime level, these types are amalgamated into a single type, for example +//! `RuntimeFoo`. +//! +//! As the names suggest, all composite enums in a FRAME runtime start their name with `Runtime`. +//! For example, `RuntimeCall` is a representation of the most high level `Call`-able type in the +//! runtime. +//! +//! Composite enums are generally convertible to their individual parts as such: +#![doc = simple_mermaid::mermaid!("../../../mermaid/outer_runtime_types.mmd")] +//! +//! In that one can always convert from the inner type into the outer type, but not vice versa. This +//! is usually expressed by implementing `From`, `TryFrom`, `From>` and similar traits. +//! +//! ### Example +//! +//! We provide the following two pallets: [`pallet_foo`] and [`pallet_bar`]. Each define a +//! dispatchable, and `Foo` also defines a custom origin. Lastly, `Bar` defines an additional +//! `GenesisConfig`. +#![doc = docify::embed!("./src/reference_docs/frame_runtime_types.rs", pallet_foo)] +#![doc = docify::embed!("./src/reference_docs/frame_runtime_types.rs", pallet_bar)] +//! +//! Let's explore how each of these affect the [`RuntimeCall`], [`RuntimeOrigin`] and +//! [`RuntimeGenesisConfig`] generated in [`runtime`] by respectively. +//! +//! As observed, [`RuntimeCall`] has 3 variants, one for each pallet and one for `frame_system`. If +//! you explore further, you will soon realize that each variant is merely a pointer to the `Call` +//! type in each pallet, for example [`pallet_foo::Call`]. +//! +//! [`RuntimeOrigin`]'s [`OriginCaller`] has two variants, one for system, and one for `pallet_foo` +//! which utilized [`frame::pallet_macros::origin`]. +//! +//! Finally, [`RuntimeGenesisConfig`] is composed of `frame_system` and a variant for `pallet_bar`'s +//! [`pallet_bar::GenesisConfig`]. +//! +//! You can find other composite enums by scanning [`runtime`] for other types who's name starts +//! with `Runtime`. Some of the more noteworthy ones are: +//! +//! - [`RuntimeEvent`] +//! - [`RuntimeError`] +//! - [`RuntimeHoldReason`] +//! +//! ### Adding Further Constraints to Runtime Composite Enums +//! +//! This section explores a common scenario where a pallet has access to one of these runtime +//! composite enums, but it wishes to further specify it by adding more trait bounds to it. +//! +//! Let's take the example of `RuntimeCall`. This is an associated type in +//! [`frame_system::Config::RuntimeCall`], and all pallets have access to this type, because they +//! have access to [`frame_system::Config`]. Finally, this type is meant to be set to outer call of +//! the entire runtime. +//! +//! But, let's not forget that this is information that *we know*, and the Rust compiler does not. +//! All that the rust compiler knows about this type is *ONLY* what the trait bounds of +//! [`frame_system::Config::RuntimeCall`] are specifying: +#![doc = docify::embed!("../../substrate/frame/system/src/lib.rs", system_runtime_call)] +//! +//! So, when at a given pallet, one accesses `::RuntimeCall`, the type is +//! extremely opaque from the perspective of the Rust compiler. +//! +//! How can a pallet access the `RuntimeCall` type with further constraints? For example, each +//! pallet has its own `enum Call`, and knows that its local `Call` is a part of `RuntimeCall`, +//! therefore there should be a `impl From> for RuntimeCall`. +//! +//! The only way to express this using Rust's associated types is for the pallet to **define its own +//! associated type `RuntimeCall`, and further specify what it thinks `RuntimeCall` should be**. +//! +//! In this case, we will want to assert the existence of [`frame::traits::IsSubType`], which is +//! very similar to [`TryFrom`]. +#![doc = docify::embed!("./src/reference_docs/frame_runtime_types.rs", custom_runtime_call)] +//! +//! And indeed, at the runtime level, this associated type would be the same `RuntimeCall` that is +//! passed to `frame_system`. +#![doc = docify::embed!("./src/reference_docs/frame_runtime_types.rs", pallet_with_specific_runtime_call_impl)] +//! +//! > In other words, the degree of specificity that [`frame_system::Config::RuntimeCall`] has is +//! > not enough for the pallet to work with. Therefore, the pallet has to define its own associated +//! > type representing `RuntimeCall`. +//! +//! Another way to look at this is: +//! +//! `pallet_with_specific_runtime_call::Config::RuntimeCall` and `frame_system::Config::RuntimeCall` +//! are two different representations of the same concrete type that is only known when the runtime +//! is being constructed. +//! +//! Now, within this pallet, this new `RuntimeCall` can be used, and it can use its new trait +//! bounds, such as being [`frame::traits::IsSubType`]: +#![doc = docify::embed!("./src/reference_docs/frame_runtime_types.rs", custom_runtime_call_usages)] +//! +//! ### Asserting Equality of Multiple Runtime Composite Enums +//! +//! Recall that in the above example, `::RuntimeCall` and `::RuntimeCall` are expected to be equal types, but at the compile-time we +//! have to represent them with two different associated types with different bounds. Would it not +//! be cool if we had a test to make sure they actually resolve to the same concrete type once the +//! runtime is constructed? The following snippet exactly does that: +#![doc = docify::embed!("./src/reference_docs/frame_runtime_types.rs", assert_equality)] +//! +//! We leave it to the reader to further explore what [`frame::traits::Hooks::integrity_test`] is, +//! and what [`core::any::TypeId`] is. Another way to assert this is using +//! [`frame::traits::IsType`]. +//! +//! ## Type Aliases +//! +//! A number of type aliases are generated by the `construct_runtime` which are also noteworthy: +//! +//! * [`runtime::PalletFoo`] is an alias to [`pallet_foo::Pallet`]. Same for `PalletBar`, and +//! `System` +//! * [`runtime::AllPalletsWithSystem`] is an alias for a tuple of all of the above. This type is +//! important to FRAME internals such as `executive`, as it implements traits such as +//! [`frame::traits::Hooks`]. +//! +//! ## Further Details +//! +//! * [`crate::reference_docs::frame_origin`] explores further details about the usage of +//! `RuntimeOrigin`. +//! * [`RuntimeCall`] is a particularly interesting composite enum as it dictates the encoding of an +//! extrinsic. See [`crate::reference_docs::signed_extensions`] for more information. +//! * See the documentation of [`construct_runtime`]. +//! * See the corresponding lecture in the [pba-book](https://polkadot-blockchain-academy.github.io/pba-book/frame/outer-enum/page.html). +//! +//! +//! [`construct_runtime`]: frame::runtime::prelude::construct_runtime +//! [`runtime::PalletFoo`]: crate::reference_docs::frame_runtime_types::runtime::PalletFoo +//! [`runtime::AllPalletsWithSystem`]: crate::reference_docs::frame_runtime_types::runtime::AllPalletsWithSystem +//! [`runtime`]: crate::reference_docs::frame_runtime_types::runtime +//! [`pallet_foo`]: crate::reference_docs::frame_runtime_types::pallet_foo +//! [`pallet_foo::Call`]: crate::reference_docs::frame_runtime_types::pallet_foo::Call +//! [`pallet_foo::Pallet`]: crate::reference_docs::frame_runtime_types::pallet_foo::Pallet +//! [`pallet_bar`]: crate::reference_docs::frame_runtime_types::pallet_bar +//! [`pallet_bar::GenesisConfig`]: crate::reference_docs::frame_runtime_types::pallet_bar::GenesisConfig +//! [`RuntimeEvent`]: crate::reference_docs::frame_runtime_types::runtime::RuntimeEvent +//! [`RuntimeGenesisConfig`]: +//! crate::reference_docs::frame_runtime_types::runtime::RuntimeGenesisConfig +//! [`RuntimeOrigin`]: crate::reference_docs::frame_runtime_types::runtime::RuntimeOrigin +//! [`OriginCaller`]: crate::reference_docs::frame_runtime_types::runtime::OriginCaller +//! [`RuntimeError`]: crate::reference_docs::frame_runtime_types::runtime::RuntimeError +//! [`RuntimeCall`]: crate::reference_docs::frame_runtime_types::runtime::RuntimeCall +//! [`RuntimeHoldReason`]: crate::reference_docs::frame_runtime_types::runtime::RuntimeHoldReason + +use frame::prelude::*; + +#[docify::export] +#[frame::pallet(dev_mode)] +pub mod pallet_foo { + use super::*; + + #[pallet::config] + pub trait Config: frame_system::Config {} + + #[pallet::origin] + #[derive(PartialEq, Eq, Clone, RuntimeDebug, Encode, Decode, TypeInfo, MaxEncodedLen)] + pub enum Origin { + A, + B, + } + + #[pallet::pallet] + pub struct Pallet(_); + + #[pallet::call] + impl Pallet { + pub fn foo(_origin: OriginFor) -> DispatchResult { + todo!(); + } + + pub fn other(_origin: OriginFor) -> DispatchResult { + todo!(); + } + } +} + +#[docify::export] +#[frame::pallet(dev_mode)] +pub mod pallet_bar { + use super::*; + + #[pallet::config] + pub trait Config: frame_system::Config {} + + #[pallet::pallet] + pub struct Pallet(_); + + #[pallet::genesis_config] + #[derive(DefaultNoBound)] + pub struct GenesisConfig { + pub initial_account: Option, + } + + #[pallet::genesis_build] + impl BuildGenesisConfig for GenesisConfig { + fn build(&self) {} + } + + #[pallet::call] + impl Pallet { + pub fn bar(_origin: OriginFor) -> DispatchResult { + todo!(); + } + } +} + +pub mod runtime { + use super::{pallet_bar, pallet_foo}; + use frame::{runtime::prelude::*, testing_prelude::*}; + + #[docify::export(runtime_exp)] + construct_runtime!( + pub struct Runtime { + System: frame_system, + PalletFoo: pallet_foo, + PalletBar: pallet_bar, + } + ); + + #[derive_impl(frame_system::config_preludes::TestDefaultConfig)] + impl frame_system::Config for Runtime { + type Block = MockBlock; + } + + impl pallet_foo::Config for Runtime {} + impl pallet_bar::Config for Runtime {} +} + +#[frame::pallet(dev_mode)] +pub mod pallet_with_specific_runtime_call { + use super::*; + use frame::traits::IsSubType; + + #[docify::export(custom_runtime_call)] + /// A pallet that wants to further narrow down what `RuntimeCall` is. + #[pallet::config] + pub trait Config: frame_system::Config { + type RuntimeCall: IsSubType>; + } + + #[pallet::pallet] + pub struct Pallet(_); + + // note that this pallet needs some `call` to have a `enum Call`. + #[pallet::call] + impl Pallet { + pub fn foo(_origin: OriginFor) -> DispatchResult { + todo!(); + } + } + + #[docify::export(custom_runtime_call_usages)] + impl Pallet { + fn _do_something_useful_with_runtime_call(call: ::RuntimeCall) { + // check if the runtime call given is of this pallet's variant. + let _maybe_my_call: Option<&Call> = call.is_sub_type(); + todo!(); + } + } + + #[docify::export(assert_equality)] + #[pallet::hooks] + impl Hooks> for Pallet { + fn integrity_test() { + use core::any::TypeId; + assert_eq!( + TypeId::of::<::RuntimeCall>(), + TypeId::of::<::RuntimeCall>() + ); + } + } +} + +pub mod runtime_with_specific_runtime_call { + use super::pallet_with_specific_runtime_call; + use frame::{runtime::prelude::*, testing_prelude::*}; + + construct_runtime!( + pub struct Runtime { + System: frame_system, + PalletWithSpecificRuntimeCall: pallet_with_specific_runtime_call, + } + ); + + #[derive_impl(frame_system::config_preludes::TestDefaultConfig)] + impl frame_system::Config for Runtime { + type Block = MockBlock; + } + + #[docify::export(pallet_with_specific_runtime_call_impl)] + impl pallet_with_specific_runtime_call::Config for Runtime { + // an implementation of `IsSubType` is provided by `construct_runtime`. + type RuntimeCall = RuntimeCall; + } +} diff --git a/docs/sdk/src/reference_docs/frame_runtime_upgrades_and_migrations.rs b/docs/sdk/src/reference_docs/frame_runtime_upgrades_and_migrations.rs new file mode 100644 index 0000000000000000000000000000000000000000..f9a69b892a3152854cdf7b5f97d003e500f64f07 --- /dev/null +++ b/docs/sdk/src/reference_docs/frame_runtime_upgrades_and_migrations.rs @@ -0,0 +1,137 @@ +//! # Runtime Upgrades +//! +//! At their core, blockchain logic consists of +//! +//! 1. on-chain state and +//! 2. a state transition function +//! +//! In Substrate-based blockchains, state transition functions are referred to as +//! [runtimes](https://paritytech.github.io/polkadot-sdk/master/polkadot_sdk_docs/reference_docs/blockchain_state_machines/index.html). +//! +//! Traditionally, before Substrate, upgrading state transition functions required node +//! operators to download new software and restart their nodes in a process called +//! [forking](https://en.wikipedia.org/wiki/Fork_(blockchain)). +//! +//! Substrate-based blockchains do not require forking, and instead upgrade runtimes +//! in a process called "Runtime Upgrades". +//! +//! Forkless runtime upgrades are a defining feature of the Substrate framework. Updating the +//! runtime logic without forking the code base enables your blockchain to seamlessly evolve +//! over time in a deterministic, rules-based manner. It also removes ambiguity for node operators +//! and other participants in the network about what is the canonical runtime. +//! +//! This capability is possible due to the runtime of a blockchain existing in on-chain storage. +//! +//! ## Performing a Runtime Upgrade +//! +//! To upgrade a runtime, an [`Origin`](frame_system::RawOrigin) with the necessary permissions +//! (usually via governance) changes the `:code` storage. Usually, this is performed via a call to +//! [`set_code`] (or [`set_code_without_checks`]) with the desired new runtime blob, scheduled +//! using [`pallet_scheduler`]. +//! +//! Prior to building the new runtime, don't forget to update the +//! [`RuntimeVersion`](sp_version::RuntimeVersion). +//! +//! # Migrations +//! +//! It is often desirable to define logic to execute immediately after runtime upgrades (see +//! [this diagram](frame::traits::Hooks)). +//! +//! Self-contained pieces of logic that execute after a runtime upgrade are called "Migrations". +//! +//! The typical use case of a migration is to 'migrate' pallet storage from one layout to another, +//! for example when the encoding of a storage item is changed. However, they can also execute +//! arbitrary logic such as: +//! +//! - Calling arbitrary pallet methods +//! - Mutating arbitrary on-chain state +//! - Cleaning up some old storage items that are no longer needed +//! +//! ## Single Block Migrations +//! +//! - Execute immediately and entirely at the beginning of the block following +//! a runtime upgrade. +//! - Are suitable for migrations which are guaranteed to not exceed the block weight. +//! - Are simply implementations of [`OnRuntimeUpgrade`]. +//! +//! To learn best practices for writing single block pallet storage migrations, see the +//! [Single Block Migration Example Pallet](pallet_example_single_block_migrations). +//! +//! ### Scheduling the Single Block Migrations to Run Next Runtime Upgrade +//! +//! Schedule migrations to run next runtime upgrade passing them as a generic parameter to your +//! [`Executive`](frame_executive) pallet: +//! +//! ```ignore +//! /// Tuple of migrations (structs that implement `OnRuntimeUpgrade`) +//! type Migrations = ( +//! pallet_example_storage_migration::migrations::v1::versioned::MigrateV0ToV1, +//! MyCustomMigration, +//! // ...more migrations here +//! ); +//! pub type Executive = frame_executive::Executive< +//! Runtime, +//! Block, +//! frame_system::ChainContext, +//! Runtime, +//! AllPalletsWithSystem, +//! Migrations, // <-- pass your migrations to Executive here +//! >; +//! ``` +//! +//! ### Ensuring Single Block Migration Safety +//! +//! "My migration unit tests pass, so it should be safe to deploy right?" +//! +//! No! Unit tests execute the migration in a very simple test environment, and cannot account +//! for the complexities of a real runtime or real on-chain state. +//! +//! Prior to deploying migrations, it is critical to perform additional checks to ensure that when +//! run in our real runtime they will not brick the chain due to: +//! - Panicking +//! - Touching too many storage keys and resulting in an excessively large PoV +//! - Taking too long to execute +//! +//! [`try-runtime-cli`](https://github.com/paritytech/try-runtime-cli) has a sub-command +//! [`on-runtime-upgrade`](https://paritytech.github.io/try-runtime-cli/try_runtime_core/commands/enum.Action.html#variant.OnRuntimeUpgrade) +//! which is designed to help with exactly this. +//! +//! Developers MUST run this command before deploying migrations to ensure they will not +//! inadvertently result in a bricked chain. +//! +//! It is recommended to run as part of your CI pipeline. See the +//! [polkadot-sdk check-runtime-migration job](https://github.com/paritytech/polkadot-sdk/blob/4a293bc5a25be637c06ce950a34490706597615b/.gitlab/pipeline/check.yml#L103-L124) +//! for an example of how to configure this. +//! +//! ### Note on the Manipulability of PoV Size and Execution Time +//! +//! While [`try-runtime-cli`](https://github.com/paritytech/try-runtime-cli) can help ensure with +//! very high certainty that a migration will succeed given **existing** on-chain state, it cannot +//! prevent a malicious actor from manipulating state in a way that will cause the migration to take +//! longer or produce a PoV much larger than previously measured. +//! +//! Therefore, it is important to write migrations in such a way that the execution time or PoV size +//! it adds to the block cannot be easily manipulated. e.g., do not iterate over storage that can +//! quickly or cheaply be bloated. +//! +//! If writing your migration in such a way is not possible, a multi block migration should be used +//! instead. +//! +//! ### Other useful tools +//! +//! [`Chopsticks`](https://github.com/AcalaNetwork/chopsticks) is another tool in the Substrate +//! ecosystem which developers may find useful to use in addition to `try-runtime-cli` when testing +//! their single block migrations. +//! +//! ## Multi Block Migrations +//! +//! Safely and easily execute long-running migrations across multiple blocks. +//! +//! Suitable for migrations which could use arbitrary amounts of block weight. +//! +//! TODO: Link to multi block migration example/s once PR is merged (). +//! +//! [`OnRuntimeUpgrade`]: frame_support::traits::OnRuntimeUpgrade +//! [`StorageVersion`]: frame_support::traits::StorageVersion +//! [`set_code`]: frame_system::Call::set_code +//! [`set_code_without_checks`]: frame_system::Call::set_code_without_checks diff --git a/docs/sdk/src/reference_docs/frame_tokens.rs b/docs/sdk/src/reference_docs/frame_tokens.rs new file mode 100644 index 0000000000000000000000000000000000000000..57b493fafa59c053f2496d5e4809f7deaa0da316 --- /dev/null +++ b/docs/sdk/src/reference_docs/frame_tokens.rs @@ -0,0 +1,131 @@ +// This file is part of polkadot-sdk. +// +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! # FRAME Tokens +//! +//! This reference doc serves as a high-level overview of the token-related logic in FRAME, and +//! how to properly apply it to your use case. +//! +//! On completion of reading this doc, you should have a good understanding of: +//! - The distinction between token traits and trait implementations in FRAME, and why this +//! distinction is helpful +//! - Token-related traits available in FRAME +//! - Token-related trait implementations in FRAME +//! - How to choose the right trait or trait implementation for your use case +//! - Where to go next +//! +//! ## Getting Started +//! +//! The most ubiquitous way to add a token to a FRAME runtime is [`pallet_balances`]. Read +//! more about pallets [here](crate::polkadot_sdk::frame_runtime#pallets). +//! +//! You may then write custom pallets that interact with [`pallet_balances`]. The fastest way to +//! get started with that is by +//! [tightly coupling](crate::reference_docs::frame_pallet_coupling#tight-coupling-pallets) your +//! custom pallet to [`pallet_balances`]. +//! +//! However, to keep pallets flexible and modular, it is often preferred to +//! [loosely couple](crate::reference_docs::frame_pallet_coupling#loosely--coupling-pallets). +//! +//! To achieve loose coupling, +//! we separate token logic into traits and trait implementations. +//! +//! ## Traits and Trait Implementations +//! +//! Broadly speaking, token logic in FRAME can be divided into two categories: traits and +//! trait implementations. +//! +//! **Traits** define common interfaces that types of tokens should implement. For example, the +//! [`fungible::Inspect`](`frame_support::traits::fungible::Inspect`) trait specifies an interface +//! for *inspecting* token state such as the total issuance of the token, the balance of individual +//! accounts, etc. +//! +//! **Trait implementations** are concrete implementations of these traits. For example, one of the +//! many traits [`pallet_balances`] implements is +//! [`fungible::Inspect`](`frame_support::traits::fungible::Inspect`)*. It provides the concrete way +//! of inspecting the total issuance, balance of accounts, etc. There can be many implementations of +//! the same traits. +//! +//! The distinction between traits and trait implementations is helpful because it allows pallets +//! and other logic to be generic over their dependencies, avoiding tight coupling. +//! +//! To illustrate this with an example let's consider [`pallet_preimage`]. This pallet takes a +//! deposit in exchange for storing a preimage for later use. A naive implementation of the +//! pallet may use [`pallet_balances`] in a tightly coupled manner, directly calling methods +//! on the pallet to reserve and unreserve deposits. This approach works well, +//! until someone has a use case requiring that an asset from a different pallet such as +//! [`pallet_assets`] is used for the deposit. Rather than tightly couple [`pallet_preimage`] to +//! [`pallet_balances`], [`pallet_assets`], and every other token-handling pallet a user +//! could possibly specify, [`pallet_preimage`] does not specify a concrete pallet as a dependency +//! but instead accepts any dependency which implements the +//! [`currency::ReservableCurrency`](`frame_support::traits::tokens::currency::ReservableCurrency`) +//! trait, namely via its [`Config::Currency`](`pallet_preimage::pallet::Config::Currency`) +//! associated type. This allows [`pallet_preimage`] to support any arbitrary pallet implementing +//! this trait, without needing any knowledge of what those pallets may be or requiring changes to +//! support new pallets which may be written in the future. +//! +//! Read more about coupling, and the benefits of loose coupling +//! [here](crate::reference_docs::frame_pallet_coupling). +//! +//! ##### *Rust Advanced Tip +//! +//! The knowledge that [`pallet_balances`] implements +//! [`fungible::Inspect`](`frame_support::traits::fungible::Inspect`) is not some arcane knowledge +//! that you have to know by heart or memorize. One can simply look at the list of the implementors +//! of any trait in the Rust Doc to find all implementors (e.g. +//! ), +//! or use the `rust-analyzer` `Implementations` action. +//! +//! ## Fungible Token Traits in FRAME +//! +//! The [`fungible`](`frame_support::traits::fungible`) crate contains the latest set of FRAME +//! fungible token traits, and is recommended to use for all new logic requiring a fungible token. +//! See the crate documentation for more info about these fungible traits. +//! +//! [`fungibles`](`frame_support::traits::fungibles`) provides very similar functionality to +//! [`fungible`](`frame_support::traits::fungible`), except it supports managing multiple tokens. +//! +//! You may notice the trait [`Currency`](`frame_support::traits::Currency`) with similar +//! functionality is also used in the codebase, however this trait is deprecated and existing logic +//! is in the process of being migrated to [`fungible`](`frame_support::traits::fungible`) ([tracking issue](https://github.com/paritytech/polkadot-sdk/issues/226)). +//! +//! ## Fungible Token Trait Implementations in FRAME +//! +//! [`pallet_balances`] implements [`fungible`](`frame_support::traits::fungible`), and is the most +//! commonly used fungible implementation in FRAME. Most of the time, it's used for managing the +//! native token of the blockchain network it's used in. +//! +//! [`pallet_assets`] implements [`fungibles`](`frame_support::traits::fungibles`), and is another +//! popular fungible token implementation. It supports the creation and management of multiple +//! assets in a single crate, making it a good choice when a network requires more assets in +//! addition to its native token. +//! +//! ## Non-Fungible Tokens in FRAME +//! +//! [`pallet_nfts`] is recommended to use for all NFT use cases in FRAME. +//! See the crate documentation for more info about this pallet. +//! +//! [`pallet_uniques`] is deprecated and should not be used. +//! +//! +//! # What Next? +//! +//! - If you are interested in implementing a single fungible token, continue reading the +//! [`fungible`](`frame_support::traits::fungible`) and [`pallet_balances`] docs. +//! - If you are interested in implementing a set of fungible tokens, continue reading the +//! [`fungibles`](`frame_support::traits::fungibles`) trait and [`pallet_assets`] docs. +//! - If you are interested in implementing an NFT, continue reading the [`pallet_nfts`] docs. diff --git a/docs/sdk/src/reference_docs/mod.rs b/docs/sdk/src/reference_docs/mod.rs index c16122ee4287b17614f5d61acc9f26df0429c2cd..145df8844f26e5b58d737a4290035e3886bf63fe 100644 --- a/docs/sdk/src/reference_docs/mod.rs +++ b/docs/sdk/src/reference_docs/mod.rs @@ -43,16 +43,15 @@ pub mod extrinsic_encoding; // TODO: @jsdw https://github.com/paritytech/polkadot-sdk-docs/issues/42 pub mod signed_extensions; -/// Learn about *"Origin"* A topic in FRAME that enables complex account abstractions to be built. -// TODO: @shawntabrizi https://github.com/paritytech/polkadot-sdk-docs/issues/43 +/// Learn about *Origins*, a topic in FRAME that enables complex account abstractions to be built. pub mod frame_origin; /// Learn about how to write safe and defensive code in your FRAME runtime. -// TODO: @CrackTheCode016 https://github.com/paritytech/polkadot-sdk-docs/issues/44 -pub mod safe_defensive_programming; +pub mod defensive_programming; -/// Learn about composite enums in FRAME-based runtimes, such as "RuntimeEvent" and "RuntimeCall". -pub mod frame_composite_enums; +/// Learn about composite enums and other runtime level types, such as "RuntimeEvent" and +/// "RuntimeCall". +pub mod frame_runtime_types; /// Learn about how to make a pallet/runtime that is fee-less and instead uses another mechanism to /// control usage and sybil attacks. @@ -66,9 +65,6 @@ pub mod metadata; /// Learn about how frame-system handles `account-ids`, nonces, consumers and providers. pub mod frame_system_accounts; -/// Learn about the currency-related abstractions provided in FRAME. -pub mod frame_currency; - /// Advice for configuring your development environment for Substrate development. pub mod development_environment_advice; @@ -76,6 +72,9 @@ pub mod development_environment_advice; // TODO: @shawntabrizi @ggwpez https://github.com/paritytech/polkadot-sdk-docs/issues/50 pub mod frame_benchmarking_weight; +/// Learn about the token-related logic in FRAME and how to apply it to your use case. +pub mod frame_tokens; + /// Learn about chain specification file and the genesis state of the blockchain. // TODO: @michalkucharczyk https://github.com/paritytech/polkadot-sdk-docs/issues/51 pub mod chain_spec_genesis; @@ -92,11 +91,18 @@ pub mod cli; // TODO: @JoshOrndorff @kianenigma https://github.com/paritytech/polkadot-sdk-docs/issues/54 pub mod consensus_swapping; -/// Learn about all the advance ways to test your coordinate a rutnime upgrade and data migration. -// TODO: @liamaharon https://github.com/paritytech/polkadot-sdk-docs/issues/55 -pub mod frame_runtime_migration; +/// Learn about Runtime Upgrades and best practices for writing Migrations. +pub mod frame_runtime_upgrades_and_migrations; /// Learn about light nodes, how they function, and how Substrate-based chains come /// light-node-first out of the box. // TODO: @jsdw @josepot https://github.com/paritytech/polkadot-sdk-docs/issues/68 pub mod light_nodes; + +/// Learn about the offchain workers, how they function, and how to use them, as provided by the +/// [`frame`] APIs. +pub mod frame_offchain_workers; + +/// Learn about the different ways through which multiple [`frame`] pallets can be combined to work +/// together. +pub mod frame_pallet_coupling; diff --git a/docs/sdk/src/reference_docs/runtime_vs_smart_contract.rs b/docs/sdk/src/reference_docs/runtime_vs_smart_contract.rs index 099512cf4ee1254b9b1e522395b9cff9783d3e3d..379b0c11b2ad077eb320f72225e513d1b9ed6d67 100644 --- a/docs/sdk/src/reference_docs/runtime_vs_smart_contract.rs +++ b/docs/sdk/src/reference_docs/runtime_vs_smart_contract.rs @@ -117,7 +117,7 @@ //! - **Contract Code Updates**: Once deployed, although typically immutable, Smart Contracts can be //! upgraded, but lack of migration logic. The [pallet_contracts](../../../pallet_contracts/index.html) //! allows for contracts to be upgraded by exposing the `set_code` dispatchable. More details on this -//! can be found in [Ink! documentation on upgradeable contracts](https://use.ink/5.x/basics/upgradeable-contracts). +//! can be found in [Ink! documentation on upgradeable contracts](https://use.ink/basics/upgradeable-contracts). //! - **Isolated Impact**: Upgrades or changes to a smart contract generally impact only that //! contract and its users, unlike Runtime upgrades that have a network-wide effect. //! - **Simplicity and Rapid Development**: The development cycle for Smart Contracts is usually diff --git a/docs/sdk/src/reference_docs/safe_defensive_programming.rs b/docs/sdk/src/reference_docs/safe_defensive_programming.rs deleted file mode 100644 index 9d0f028e570d42d223e656cb7f46798d956fd173..0000000000000000000000000000000000000000 --- a/docs/sdk/src/reference_docs/safe_defensive_programming.rs +++ /dev/null @@ -1 +0,0 @@ -//! diff --git a/polkadot/Cargo.toml b/polkadot/Cargo.toml index b0d71a18eaa13f8e7d188ca6420effa9dde4bb6b..659edcb041c35625b6f7c6ee7841eab27c4c1175 100644 --- a/polkadot/Cargo.toml +++ b/polkadot/Cargo.toml @@ -45,8 +45,8 @@ tikv-jemallocator = { version = "0.5.0", features = ["unprefixed_malloc_on_suppo assert_cmd = "2.0.4" nix = { version = "0.26.1", features = ["signal"] } tempfile = "3.2.0" -tokio = "1.24.2" -substrate-rpc-client = { path = "../substrate/utils/frame/rpc/client/" } +tokio = "1.37" +substrate-rpc-client = { path = "../substrate/utils/frame/rpc/client" } polkadot-core-primitives = { path = "core-primitives" } [build-dependencies] diff --git a/polkadot/cli/Cargo.toml b/polkadot/cli/Cargo.toml index 3186e31f39e80f28e792842b3809e524fdac2d03..719d00490a9d031c48fd8d047eec319d60b8e7b0 100644 --- a/polkadot/cli/Cargo.toml +++ b/polkadot/cli/Cargo.toml @@ -19,10 +19,10 @@ crate-type = ["cdylib", "rlib"] [dependencies] cfg-if = "1.0" -clap = { version = "4.4.18", features = ["derive"], optional = true } -log = "0.4.17" -thiserror = "1.0.48" -futures = "0.3.21" +clap = { version = "4.5.3", features = ["derive"], optional = true } +log = { workspace = true, default-features = true } +thiserror = { workspace = true } +futures = "0.3.30" pyro = { package = "pyroscope", version = "0.5.3", optional = true } pyroscope_pprofrs = { version = "0.2", optional = true } @@ -33,7 +33,6 @@ sp-io = { path = "../../substrate/primitives/io" } sp-keyring = { path = "../../substrate/primitives/keyring" } sp-maybe-compressed-blob = { path = "../../substrate/primitives/maybe-compressed-blob" } frame-benchmarking-cli = { path = "../../substrate/utils/frame/benchmarking-cli", optional = true } -try-runtime-cli = { path = "../../substrate/utils/frame/try-runtime/cli", optional = true } sc-cli = { path = "../../substrate/client/cli", optional = true } sc-service = { path = "../../substrate/client/service", optional = true } polkadot-node-metrics = { path = "../node/metrics" } @@ -42,6 +41,7 @@ sc-tracing = { path = "../../substrate/client/tracing", optional = true } sc-sysinfo = { path = "../../substrate/client/sysinfo" } sc-executor = { path = "../../substrate/client/executor" } sc-storage-monitor = { path = "../../substrate/client/storage-monitor" } +sp-runtime = { path = "../../substrate/primitives/runtime" } [build-dependencies] substrate-build-script-utils = { path = "../../substrate/utils/build-script-utils" } @@ -56,16 +56,19 @@ cli = [ "sc-service", "sc-tracing", "service", - "try-runtime-cli", ] runtime-benchmarks = [ "frame-benchmarking-cli?/runtime-benchmarks", "polkadot-node-metrics/runtime-benchmarks", "sc-service?/runtime-benchmarks", "service/runtime-benchmarks", + "sp-runtime/runtime-benchmarks", ] full-node = ["service/full-node"] -try-runtime = ["service/try-runtime", "try-runtime-cli/try-runtime"] +try-runtime = [ + "service/try-runtime", + "sp-runtime/try-runtime", +] fast-runtime = ["service/fast-runtime"] pyroscope = ["pyro", "pyroscope_pprofrs"] diff --git a/polkadot/cli/src/cli.rs b/polkadot/cli/src/cli.rs index 30f35ebcb6ffa95f0f2384821e168353d95df94b..3737942e6e53fb61133cf66227129dedd4bf885c 100644 --- a/polkadot/cli/src/cli.rs +++ b/polkadot/cli/src/cli.rs @@ -50,11 +50,6 @@ pub enum Subcommand { #[command(subcommand)] Benchmark(frame_benchmarking_cli::BenchmarkCmd), - /// Try-runtime has migrated to a standalone CLI - /// (). The subcommand exists as a stub and - /// deprecation notice. It will be removed entirely some time after Janurary 2024. - TryRuntime, - /// Key management CLI utilities #[command(subcommand)] Key(sc_cli::KeySubcommand), @@ -122,7 +117,7 @@ pub struct RunCmd { /// Overseer message capacity override. /// - /// **Dangerous!** Do not touch unless explicitly adviced to. + /// **Dangerous!** Do not touch unless explicitly advised to. #[arg(long)] pub overseer_channel_capacity_override: Option, diff --git a/polkadot/cli/src/command.rs b/polkadot/cli/src/command.rs index 7319f28a2e2aa0a952b9f5d4d956fc9fc2321923..6af93a75638891f0499029574da93dc57a291212 100644 --- a/polkadot/cli/src/command.rs +++ b/polkadot/cli/src/command.rs @@ -451,8 +451,10 @@ pub fn run() -> Result<()> { if cfg!(feature = "runtime-benchmarks") { runner.sync_run(|config| { - cmd.run::(config) - .map_err(|e| Error::SubstrateCli(e)) + cmd.run_with_spec::, ()>( + Some(config.chain_spec), + ) + .map_err(|e| Error::SubstrateCli(e)) }) } else { Err(sc_cli::Error::Input( @@ -474,13 +476,6 @@ pub fn run() -> Result<()> { } }, Some(Subcommand::Key(cmd)) => Ok(cmd.run(&cli)?), - #[cfg(feature = "try-runtime")] - Some(Subcommand::TryRuntime) => Err(try_runtime_cli::DEPRECATION_NOTICE.to_owned().into()), - #[cfg(not(feature = "try-runtime"))] - Some(Subcommand::TryRuntime) => Err("TryRuntime wasn't enabled when building the node. \ - You can enable it with `--features try-runtime`." - .to_owned() - .into()), Some(Subcommand::ChainInfo(cmd)) => { let runner = cli.create_runner(cmd)?; Ok(runner.sync_run(|config| cmd.run::(&config))?) diff --git a/polkadot/core-primitives/Cargo.toml b/polkadot/core-primitives/Cargo.toml index d3aef89cb74d01cfe3293c500d981a38b09b6a8d..8dfa0b87328b1af0bc4cbc1bcd677919acaaf892 100644 --- a/polkadot/core-primitives/Cargo.toml +++ b/polkadot/core-primitives/Cargo.toml @@ -13,7 +13,7 @@ workspace = true sp-core = { path = "../../substrate/primitives/core", default-features = false } sp-std = { path = "../../substrate/primitives/std", default-features = false } sp-runtime = { path = "../../substrate/primitives/runtime", default-features = false } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } parity-scale-codec = { version = "3.6.1", default-features = false, features = ["derive"] } [features] diff --git a/polkadot/doc/testing.md b/polkadot/doc/testing.md deleted file mode 100644 index 76703b1b4398a0cac8423183a5d2febfabab0e6c..0000000000000000000000000000000000000000 --- a/polkadot/doc/testing.md +++ /dev/null @@ -1,302 +0,0 @@ -# Testing - -Testing is an essential tool to assure correctness. This document describes how we test the Polkadot code, whether -locally, at scale, and/or automatically in CI. - -## Scopes - -The testing strategy for Polkadot is 4-fold: - -### Unit testing (1) - -Boring, small scale correctness tests of individual functions. It is usually -enough to run `cargo test` in the crate you are testing. - -For full coverage you may have to pass some additional features. For example: - -```sh -cargo test --features ci-only-tests -``` - -### Integration tests - -There are the following variants of integration tests: - -#### Subsystem tests (2) - -One particular subsystem (subsystem under test) interacts with a mocked overseer that is made to assert incoming and -outgoing messages of the subsystem under test. See e.g. the `statement-distribution` tests. - -#### Behavior tests (3) - -Launching small scale networks, with multiple adversarial nodes. This should include tests around the thresholds in -order to evaluate the error handling once certain assumed invariants fail. - -Currently, we commonly use **zombienet** to run mini test-networks, whether locally or in CI. To run on your machine: - -- First, make sure you have [zombienet][zombienet] installed. - -- Now, all the required binaries must be installed in your $PATH. You must run the following from the `polkadot/` -directory in order to test your changes. (Not `zombienet setup`, or you will get the released binaries without your -local changes!) - -```sh -cargo install --path . --locked -``` - -- You will also need to install whatever binaries are required for your specific tests. For example, to install -`undying-collator`, from `polkadot/`, run: - -```sh -cargo install --path ./parachain/test-parachains/undying/collator --locked -``` - -- Finally, run the zombienet test from the `polkadot` directory: - -```sh -RUST_LOG=parachain::pvf=trace zombienet --provider=native spawn zombienet_tests/functional/0001-parachains-pvf.toml -``` - -- You can pick a validator node like `alice` from the output and view its logs -(`tail -f `) or metrics. Make sure there is nothing funny in the logs -(try `grep WARN `). - -#### Testing at scale (4) - -Launching many nodes with configurable network speed and node features in a cluster of nodes. At this scale the -[Simnet][simnet] comes into play which launches a full cluster of nodes. The scale is handled by spawning a kubernetes -cluster and the meta description is covered by [Gurke][Gurke]. Asserts are made using Grafana rules, based on the -existing prometheus metrics. This can be extended by adding an additional service translating `jaeger` spans into -addition prometheus avoiding additional Polkadot source changes. - -_Behavior tests_ and _testing at scale_ have naturally soft boundary. The most significant difference is the presence of -a real network and the number of nodes, since a single host often not capable to run multiple nodes at once. - -## Observing Logs - -To verify expected behavior it's often useful to observe logs. To avoid too many -logs at once, you can run one test at a time: - -1. Add `sp_tracing::try_init_simple();` to the beginning of a test -2. Specify `RUST_LOG=::=trace` before the cargo command. - -For example: - -```sh -RUST_LOG=parachain::pvf=trace cargo test execute_can_run_serially -``` - -For more info on how our logs work, check [the docs][logs]. - -## Coverage - -Coverage gives a _hint_ of the actually covered source lines by tests and test applications. - -The state of the art is currently tarpaulin which unfortunately yields a lot of false negatives. Lines that -are in fact covered, marked as uncovered due to a mere linebreak in a statement can cause these artifacts. This leads to -lower coverage percentages than there actually is. - -Since late 2020 rust has gained [MIR based coverage tooling]( -https://blog.rust-lang.org/inside-rust/2020/11/12/source-based-code-coverage.html). - -```sh -# setup -rustup component add llvm-tools-preview -cargo install grcov miniserve - -export CARGO_INCREMENTAL=0 -# wasm is not happy with the instrumentation -export SKIP_BUILD_WASM=true -export BUILD_DUMMY_WASM_BINARY=true -# the actully collected coverage data -export LLVM_PROFILE_FILE="llvmcoveragedata-%p-%m.profraw" -# build wasm without instrumentation -export WASM_TARGET_DIRECTORY=/tmp/wasm -cargo +nightly build -# required rust flags -export RUSTFLAGS="-Zinstrument-coverage" -# assure target dir is clean -rm -r target/{debug,tests} -# run tests to get coverage data -cargo +nightly test --all - -# create the *html* report out of all the test binaries -# mostly useful for local inspection -grcov . --binary-path ./target/debug -s . -t html --branch --ignore-not-existing -o ./coverage/ -miniserve -r ./coverage - -# create a *codecov* compatible report -grcov . --binary-path ./target/debug/ -s . -t lcov --branch --ignore-not-existing --ignore "/*" -o lcov.info -``` - -The test coverage in `lcov` can the be published to . - -```sh -bash <(curl -s https://codecov.io/bash) -f lcov.info -``` - -or just printed as part of the PR using a github action i.e. -[`jest-lcov-reporter`](https://github.com/marketplace/actions/jest-lcov-reporter). - -For full examples on how to use [`grcov` /w Polkadot specifics see the github -repo](https://github.com/mozilla/grcov#coverallscodecov-output). - -## Fuzzing - -Fuzzing is an approach to verify correctness against arbitrary or partially structured inputs. - -Currently implemented fuzzing targets: - -- `erasure-coding` - -The tooling of choice here is `honggfuzz-rs` as it allows _fastest_ coverage according to "some paper" which is a -positive feature when run as part of PRs. - -Fuzzing is generally not applicable for data secured by cryptographic hashes or signatures. Either the input has to be -specifically crafted, such that the discarded input percentage stays in an acceptable range. System level fuzzing is -hence simply not feasible due to the amount of state that is required. - -Other candidates to implement fuzzing are: - -- `rpc` -- ... - -## Performance metrics - -There are various ways of performance metrics. - -- timing with `criterion` -- cache hits/misses w/ `iai` harness or `criterion-perf` -- `coz` a performance based compiler - -Most of them are standard tools to aid in the creation of statistical tests regarding change in time of certain unit -tests. - -`coz` is meant for runtime. In our case, the system is far too large to yield a sufficient number of measurements in -finite time. An alternative approach could be to record incoming package streams per subsystem and store dumps of them, -which in return could be replayed repeatedly at an accelerated speed, with which enough metrics could be obtained to -yield information on which areas would improve the metrics. This unfortunately will not yield much information, since -most if not all of the subsystem code is linear based on the input to generate one or multiple output messages, it is -unlikely to get any useful metrics without mocking a sufficiently large part of the other subsystem which overlaps with -[#Integration tests] which is unfortunately not repeatable as of now. As such the effort gain seems low and this is not -pursued at the current time. - -## Writing small scope integration tests with preconfigured workers - -Requirements: - -- spawn nodes with preconfigured behaviors -- allow multiple types of configuration to be specified -- allow extendability via external crates -- ... - ---- - -## Implementation of different behavior strain nodes - -### Goals - -The main goals are is to allow creating a test node which exhibits a certain behavior by utilizing a subset of _wrapped_ -or _replaced_ subsystems easily. The runtime must not matter at all for these tests and should be simplistic. The -execution must be fast, this mostly means to assure a close to zero network latency as well as shorting the block time -and epoch times down to a few `100ms` and a few dozend blocks per epoch. - -### Approach - -#### MVP - -A simple small scale builder pattern would suffice for stage one implementation of allowing to replace individual -subsystems. An alternative would be to harness the existing `AllSubsystems` type and replace the subsystems as needed. - -#### Full `proc-macro` implementation - -`Overseer` is a common pattern. It could be extracted as `proc` macro and generative `proc-macro`. This would replace -the `AllSubsystems` type as well as implicitly create the `AllMessages` enum as `AllSubsystemsGen` does today. - -The implementation is yet to be completed, see the [implementation PR](https://github.com/paritytech/polkadot/pull/2962) -for details. - -##### Declare an overseer implementation - -```rust -struct BehaveMaleficient; - -impl OverseerGen for BehaveMaleficient { - fn generate<'a, Spawner, RuntimeClient>( - &self, - args: OverseerGenArgs<'a, Spawner, RuntimeClient>, - ) -> Result<(Overseer>, OverseerHandler), Error> - where - RuntimeClient: 'static + ProvideRuntimeApi + HeaderBackend + AuxStore, - RuntimeClient::Api: ParachainHost + BabeApi + AuthorityDiscoveryApi, - Spawner: 'static + overseer::gen::Spawner + Clone + Unpin, - { - let spawner = args.spawner.clone(); - let leaves = args.leaves.clone(); - let runtime_client = args.runtime_client.clone(); - let registry = args.registry.clone(); - let candidate_validation_config = args.candidate_validation_config.clone(); - // modify the subsystem(s) as needed: - let all_subsystems = create_default_subsystems(args)?. - // or spawn an entirely new set - - replace_candidate_validation( - // create the filtered subsystem - FilteredSubsystem::new( - CandidateValidationSubsystem::with_config( - candidate_validation_config, - Metrics::register(registry)?, - ), - // an implementation of - Skippy::default(), - ), - ); - - Overseer::new(leaves, all_subsystems, registry, runtime_client, spawner) - .map_err(|e| e.into()) - - // A builder pattern will simplify this further - // WIP https://github.com/paritytech/polkadot/pull/2962 - } -} - -fn main() -> eyre::Result<()> { - color_eyre::install()?; - let cli = Cli::from_args(); - assert_matches::assert_matches!(cli.subcommand, None); - polkadot_cli::run_node(cli, BehaveMaleficient)?; - Ok(()) -} -``` - -[`variant-a`](../node/malus/src/variant-a.rs) is a fully working example. - -#### Simnet - -Spawn a kubernetes cluster based on a meta description using [Gurke] with the [Simnet] scripts. - -Coordinated attacks of multiple nodes or subsystems must be made possible via a side-channel, that is out of scope for -this document. - -The individual node configurations are done as targets with a particular builder configuration. - -#### Behavior tests w/o Simnet - -Commonly this will require multiple nodes, and most machines are limited to running two or three nodes concurrently. -Hence, this is not the common case and is just an implementation _idea_. - -```rust -behavior_testcase!{ -"TestRuntime" => -"Alice": , -"Bob": , -"Charles": Default, -"David": "Charles", -"Eve": "Bob", -} -``` - -[zombienet]: https://github.com/paritytech/zombienet -[Gurke]: https://github.com/paritytech/gurke -[simnet]: https://github.com/paritytech/simnet_scripts -[logs]: https://github.com/paritytech/polkadot-sdk/blob/master/polkadot/node/gum/src/lib.rs diff --git a/polkadot/erasure-coding/Cargo.toml b/polkadot/erasure-coding/Cargo.toml index 8705c14c3a4d026aa6dda5cc5232e9fdf10baf82..677f15c4b9a1446c7828c78f92933f7811733ee8 100644 --- a/polkadot/erasure-coding/Cargo.toml +++ b/polkadot/erasure-coding/Cargo.toml @@ -16,7 +16,7 @@ novelpoly = { package = "reed-solomon-novelpoly", version = "2.0.0" } parity-scale-codec = { version = "3.6.1", default-features = false, features = ["derive", "std"] } sp-core = { path = "../../substrate/primitives/core" } sp-trie = { path = "../../substrate/primitives/trie" } -thiserror = "1.0.48" +thiserror = { workspace = true } [dev-dependencies] criterion = { version = "0.4.0", default-features = false, features = ["cargo_bench_support"] } diff --git a/polkadot/grafana/README.md b/polkadot/grafana/README.md index 7350001bfa1fcebe367799cc36426522c4cf4f97..e909fdd29a757afba3ba6c76ade6466acffc7bda 100644 --- a/polkadot/grafana/README.md +++ b/polkadot/grafana/README.md @@ -8,7 +8,7 @@ monitor the liveliness and performance of a network and its validators. # How does it work ? Just import the dashboard JSON files from this folder in your Grafana installation. All dashboards are grouped in -folder percategory (like for example `parachains`). The files have been created by Grafana export functionality and +folder per category (like for example `parachains`). The files have been created by Grafana export functionality and follow the data model specified [here](https://grafana.com/docs/grafana/latest/dashboards/json-model/). We aim to keep the dashboards here in sync with the implementation, except dashboards for development and diff --git a/polkadot/node/collation-generation/Cargo.toml b/polkadot/node/collation-generation/Cargo.toml index 8c6644ad6da59f51c2eb0ebb583fed0cd211d821..ebc53a9e01bbe5abc6ba18e500ad3bafcf35ead3 100644 --- a/polkadot/node/collation-generation/Cargo.toml +++ b/polkadot/node/collation-generation/Cargo.toml @@ -10,7 +10,7 @@ description = "Collator-side subsystem that handles incoming candidate submissio workspace = true [dependencies] -futures = "0.3.21" +futures = "0.3.30" gum = { package = "tracing-gum", path = "../gum" } polkadot-erasure-coding = { path = "../../erasure-coding" } polkadot-node-primitives = { path = "../primitives" } @@ -19,11 +19,12 @@ polkadot-node-subsystem-util = { path = "../subsystem-util" } polkadot-primitives = { path = "../../primitives" } sp-core = { path = "../../../substrate/primitives/core" } sp-maybe-compressed-blob = { path = "../../../substrate/primitives/maybe-compressed-blob" } -thiserror = "1.0.48" +thiserror = { workspace = true } parity-scale-codec = { version = "3.6.1", default-features = false, features = ["bit-vec", "derive"] } [dev-dependencies] polkadot-node-subsystem-test-helpers = { path = "../subsystem-test-helpers" } test-helpers = { package = "polkadot-primitives-test-helpers", path = "../../primitives/test-helpers" } assert_matches = "1.4.0" +rstest = "0.18.2" sp-keyring = { path = "../../../substrate/primitives/keyring" } diff --git a/polkadot/node/collation-generation/src/error.rs b/polkadot/node/collation-generation/src/error.rs index ac5db6cd7f285b266da2fa2204d92a1cb6331b1c..f04e3c4f20b41f3a0934c65c0563d33edf45487a 100644 --- a/polkadot/node/collation-generation/src/error.rs +++ b/polkadot/node/collation-generation/src/error.rs @@ -27,7 +27,11 @@ pub enum Error { #[error(transparent)] Util(#[from] polkadot_node_subsystem_util::Error), #[error(transparent)] + UtilRuntime(#[from] polkadot_node_subsystem_util::runtime::Error), + #[error(transparent)] Erasure(#[from] polkadot_erasure_coding::Error), + #[error("Parachain backing state not available in runtime.")] + MissingParaBackingState, } pub type Result = std::result::Result; diff --git a/polkadot/node/collation-generation/src/lib.rs b/polkadot/node/collation-generation/src/lib.rs index cfa75d7b44119d8ec388e80b7bb537b0adeb42d0..374f090a2671a1c3a0f9c5f945cd16954a53bcce 100644 --- a/polkadot/node/collation-generation/src/lib.rs +++ b/polkadot/node/collation-generation/src/lib.rs @@ -43,13 +43,14 @@ use polkadot_node_subsystem::{ SubsystemContext, SubsystemError, SubsystemResult, }; use polkadot_node_subsystem_util::{ - request_async_backing_params, request_availability_cores, request_persisted_validation_data, - request_validation_code, request_validation_code_hash, request_validators, + request_async_backing_params, request_availability_cores, request_para_backing_state, + request_persisted_validation_data, request_validation_code, request_validation_code_hash, + request_validators, vstaging::fetch_claim_queue, }; use polkadot_primitives::{ collator_signature_payload, CandidateCommitments, CandidateDescriptor, CandidateReceipt, - CollatorPair, CoreState, Hash, Id as ParaId, OccupiedCoreAssumption, PersistedValidationData, - ValidationCodeHash, + CollatorPair, CoreIndex, CoreState, Hash, Id as ParaId, OccupiedCoreAssumption, + PersistedValidationData, ScheduledCore, ValidationCodeHash, }; use sp_core::crypto::Pair; use std::sync::Arc; @@ -205,10 +206,14 @@ async fn handle_new_activations( // follow the procedure from the guide: // https://paritytech.github.io/polkadot-sdk/book/node/collators/collation-generation.html + // If there is no collation function provided, bail out early. + // Important: Lookahead collator and slot based collator do not use `CollatorFn`. if config.collator.is_none() { return Ok(()) } + let para_id = config.para_id; + let _overall_timer = metrics.time_new_activations(); for relay_parent in activated { @@ -221,28 +226,47 @@ async fn handle_new_activations( ); let availability_cores = availability_cores??; - let n_validators = validators??.len(); let async_backing_params = async_backing_params?.ok(); + let n_validators = validators??.len(); + let maybe_claim_queue = fetch_claim_queue(ctx.sender(), relay_parent) + .await + .map_err(crate::error::Error::UtilRuntime)?; - for (core_idx, core) in availability_cores.into_iter().enumerate() { - let _availability_core_timer = metrics.time_new_activations_availability_core(); + // The loop bellow will fill in cores that the para is allowed to build on. + let mut cores_to_build_on = Vec::new(); - let (scheduled_core, assumption) = match core { + // This assumption refers to all cores of the parachain, taking elastic scaling + // into account. + let mut para_assumption = None; + for (core_idx, core) in availability_cores.into_iter().enumerate() { + // This nested assumption refers only to the core being iterated. + let (core_assumption, scheduled_core) = match core { CoreState::Scheduled(scheduled_core) => - (scheduled_core, OccupiedCoreAssumption::Free), + (OccupiedCoreAssumption::Free, scheduled_core), CoreState::Occupied(occupied_core) => match async_backing_params { Some(params) if params.max_candidate_depth >= 1 => { // maximum candidate depth when building on top of a block // pending availability is necessarily 1 - the depth of the // pending block is 0 so the child has depth 1. - // TODO [now]: this assumes that next up == current. - // in practice we should only set `OccupiedCoreAssumption::Included` - // when the candidate occupying the core is also of the same para. - if let Some(scheduled) = occupied_core.next_up_on_available { - (scheduled, OccupiedCoreAssumption::Included) - } else { - continue + // Use claim queue if available, or fallback to `next_up_on_available` + let res = match maybe_claim_queue { + Some(ref claim_queue) => { + // read what's in the claim queue for this core at depth 0. + claim_queue + .get_claim_for(CoreIndex(core_idx as u32), 0) + .map(|para_id| ScheduledCore { para_id, collator: None }) + }, + None => { + // Runtime doesn't support claim queue runtime api. Fallback to + // `next_up_on_available` + occupied_core.next_up_on_available + }, + }; + + match res { + Some(res) => (OccupiedCoreAssumption::Included, res), + None => continue, } }, _ => { @@ -259,7 +283,7 @@ async fn handle_new_activations( gum::trace!( target: LOG_TARGET, core_idx = %core_idx, - "core is free. Keep going.", + "core is not assigned to any para. Keep going.", ); continue }, @@ -274,64 +298,103 @@ async fn handle_new_activations( their_para = %scheduled_core.para_id, "core is not assigned to our para. Keep going.", ); - continue + } else { + // This does not work for elastic scaling, but it should be enough for single + // core parachains. If async backing runtime is available we later override + // the assumption based on the `para_backing_state` API response. + para_assumption = Some(core_assumption); + // Accumulate cores for building collation(s) outside the loop. + cores_to_build_on.push(CoreIndex(core_idx as u32)); } + } - // we get validation data and validation code synchronously for each core instead of - // within the subtask loop, because we have only a single mutable handle to the - // context, so the work can't really be distributed + // Skip to next relay parent if there is no core assigned to us. + if cores_to_build_on.is_empty() { + continue + } - let validation_data = match request_persisted_validation_data( - relay_parent, - scheduled_core.para_id, - assumption, - ctx.sender(), - ) - .await - .await?? - { - Some(v) => v, - None => { - gum::trace!( - target: LOG_TARGET, - core_idx = %core_idx, - relay_parent = ?relay_parent, - our_para = %config.para_id, - their_para = %scheduled_core.para_id, - "validation data is not available", - ); - continue - }, - }; + // If at least one core is assigned to us, `para_assumption` is `Some`. + let Some(mut para_assumption) = para_assumption else { continue }; + + // If it is none it means that neither async backing or elastic scaling (which + // depends on it) are supported. We'll use the `para_assumption` we got from + // iterating cores. + if async_backing_params.is_some() { + // We are being very optimistic here, but one of the cores could pend availability some + // more block, ore even time out. + // For timeout assumption the collator can't really know because it doesn't receive + // bitfield gossip. + let para_backing_state = + request_para_backing_state(relay_parent, config.para_id, ctx.sender()) + .await + .await?? + .ok_or(crate::error::Error::MissingParaBackingState)?; + + // Override the assumption about the para's assigned cores. + para_assumption = if para_backing_state.pending_availability.is_empty() { + OccupiedCoreAssumption::Free + } else { + OccupiedCoreAssumption::Included + } + } - let validation_code_hash = match obtain_validation_code_hash_with_assumption( - relay_parent, - scheduled_core.para_id, - assumption, - ctx.sender(), - ) - .await? - { - Some(v) => v, - None => { - gum::trace!( - target: LOG_TARGET, - core_idx = %core_idx, - relay_parent = ?relay_parent, - our_para = %config.para_id, - their_para = %scheduled_core.para_id, - "validation code hash is not found.", - ); - continue - }, - }; + gum::debug!( + target: LOG_TARGET, + relay_parent = ?relay_parent, + our_para = %para_id, + ?para_assumption, + "Occupied core(s) assumption", + ); + + let mut validation_data = match request_persisted_validation_data( + relay_parent, + para_id, + para_assumption, + ctx.sender(), + ) + .await + .await?? + { + Some(v) => v, + None => { + gum::debug!( + target: LOG_TARGET, + relay_parent = ?relay_parent, + our_para = %para_id, + "validation data is not available", + ); + continue + }, + }; - let task_config = config.clone(); - let metrics = metrics.clone(); - let mut task_sender = ctx.sender().clone(); - ctx.spawn( - "collation-builder", - Box::pin(async move { + let validation_code_hash = match obtain_validation_code_hash_with_assumption( + relay_parent, + para_id, + para_assumption, + ctx.sender(), + ) + .await? + { + Some(v) => v, + None => { + gum::debug!( + target: LOG_TARGET, + relay_parent = ?relay_parent, + our_para = %para_id, + "validation code hash is not found.", + ); + continue + }, + }; + + let task_config = config.clone(); + let metrics = metrics.clone(); + let mut task_sender = ctx.sender().clone(); + + ctx.spawn( + "chained-collation-builder", + Box::pin(async move { + for core_index in cores_to_build_on { let collator_fn = match task_config.collator.as_ref() { Some(x) => x, None => return, @@ -343,21 +406,23 @@ async fn handle_new_activations( None => { gum::debug!( target: LOG_TARGET, - para_id = %scheduled_core.para_id, + ?para_id, "collator returned no collation on collate", ); return }, }; + let parent_head = collation.head_data.clone(); construct_and_distribute_receipt( PreparedCollation { collation, - para_id: scheduled_core.para_id, + para_id, relay_parent, - validation_data, + validation_data: validation_data.clone(), validation_code_hash, n_validators, + core_index, }, task_config.key.clone(), &mut task_sender, @@ -365,9 +430,13 @@ async fn handle_new_activations( &metrics, ) .await; - }), - )?; - } + + // Chain the collations. All else stays the same as we build the chained + // collation on same relay parent. + validation_data.parent_head = parent_head; + } + }), + )?; } Ok(()) @@ -388,6 +457,7 @@ async fn handle_submit_collation( parent_head, validation_code_hash, result_sender, + core_index, } = params; let validators = request_validators(relay_parent, ctx.sender()).await.await??; @@ -424,6 +494,7 @@ async fn handle_submit_collation( validation_data, validation_code_hash, n_validators, + core_index, }; construct_and_distribute_receipt( @@ -445,6 +516,7 @@ struct PreparedCollation { validation_data: PersistedValidationData, validation_code_hash: ValidationCodeHash, n_validators: usize, + core_index: CoreIndex, } /// Takes a prepared collation, along with its context, and produces a candidate receipt @@ -463,9 +535,11 @@ async fn construct_and_distribute_receipt( validation_data, validation_code_hash, n_validators, + core_index, } = collation; let persisted_validation_data_hash = validation_data.hash(); + let parent_head_data = validation_data.parent_head.clone(); let parent_head_data_hash = validation_data.parent_head.hash(); // Apply compression to the block data. @@ -551,12 +625,14 @@ async fn construct_and_distribute_receipt( metrics.on_collation_generated(); sender - .send_message(CollatorProtocolMessage::DistributeCollation( - ccr, + .send_message(CollatorProtocolMessage::DistributeCollation { + candidate_receipt: ccr, parent_head_data_hash, pov, + parent_head_data, result_sender, - )) + core_index, + }) .await; } diff --git a/polkadot/node/collation-generation/src/tests.rs b/polkadot/node/collation-generation/src/tests.rs index 9094f40cca8419b608d451c1dc6f09854f53f07c..10c391cba25d1cba13df33891e65f0abb10944c4 100644 --- a/polkadot/node/collation-generation/src/tests.rs +++ b/polkadot/node/collation-generation/src/tests.rs @@ -25,15 +25,24 @@ use polkadot_node_primitives::{BlockData, Collation, CollationResult, MaybeCompr use polkadot_node_subsystem::{ errors::RuntimeApiError, messages::{AllMessages, RuntimeApiMessage, RuntimeApiRequest}, + ActivatedLeaf, }; use polkadot_node_subsystem_test_helpers::{subsystem_test_harness, TestSubsystemContextHandle}; use polkadot_node_subsystem_util::TimeoutExt; use polkadot_primitives::{ - CollatorPair, HeadData, Id as ParaId, PersistedValidationData, ScheduledCore, ValidationCode, + async_backing::{BackingState, CandidatePendingAvailability}, + AsyncBackingParams, BlockNumber, CollatorPair, HeadData, PersistedValidationData, + ScheduledCore, ValidationCode, }; +use rstest::rstest; use sp_keyring::sr25519::Keyring as Sr25519Keyring; -use std::pin::Pin; -use test_helpers::{dummy_hash, dummy_head_data, dummy_validator}; +use std::{ + collections::{BTreeMap, VecDeque}, + pin::Pin, +}; +use test_helpers::{ + dummy_candidate_descriptor, dummy_hash, dummy_head_data, dummy_validator, make_candidate, +}; type VirtualOverseer = TestSubsystemContextHandle; @@ -102,9 +111,9 @@ impl Future for TestCollator { impl Unpin for TestCollator {} -async fn overseer_recv(overseer: &mut VirtualOverseer) -> AllMessages { - const TIMEOUT: std::time::Duration = std::time::Duration::from_millis(2000); +const TIMEOUT: std::time::Duration = std::time::Duration::from_millis(2000); +async fn overseer_recv(overseer: &mut VirtualOverseer) -> AllMessages { overseer .recv() .timeout(TIMEOUT) @@ -132,8 +141,45 @@ fn scheduled_core_for>(para_id: Id) -> ScheduledCore { ScheduledCore { para_id: para_id.into(), collator: None } } -#[test] -fn requests_availability_per_relay_parent() { +fn dummy_candidate_pending_availability( + para_id: ParaId, + candidate_relay_parent: Hash, + relay_parent_number: BlockNumber, +) -> CandidatePendingAvailability { + let (candidate, _pvd) = make_candidate( + candidate_relay_parent, + relay_parent_number, + para_id, + dummy_head_data(), + HeadData(vec![1]), + ValidationCode(vec![1, 2, 3]).hash(), + ); + let candidate_hash = candidate.hash(); + + CandidatePendingAvailability { + candidate_hash, + descriptor: candidate.descriptor, + commitments: candidate.commitments, + relay_parent_number, + max_pov_size: 5 * 1024 * 1024, + } +} + +fn dummy_backing_state(pending_availability: Vec) -> BackingState { + let constraints = helpers::dummy_constraints( + 0, + vec![0], + dummy_head_data(), + ValidationCodeHash::from(Hash::repeat_byte(42)), + ); + + BackingState { constraints, pending_availability } +} + +#[rstest] +#[case(RuntimeApiRequest::CLAIM_QUEUE_RUNTIME_REQUIREMENT - 1)] +#[case(RuntimeApiRequest::CLAIM_QUEUE_RUNTIME_REQUIREMENT)] +fn requests_availability_per_relay_parent(#[case] runtime_version: u32) { let activated_hashes: Vec = vec![[1; 32].into(), [4; 32].into(), [9; 32].into(), [16; 32].into()]; @@ -159,6 +205,24 @@ fn requests_availability_per_relay_parent() { ))) => { tx.send(Err(RuntimeApiError::NotSupported { runtime_api_name: "doesnt_matter" })).unwrap(); }, + Some(AllMessages::RuntimeApi(RuntimeApiMessage::Request( + _hash, + RuntimeApiRequest::Version(tx), + ))) => { + tx.send(Ok(runtime_version)).unwrap(); + }, + Some(AllMessages::RuntimeApi(RuntimeApiMessage::Request( + _hash, + RuntimeApiRequest::ClaimQueue(tx), + ))) if runtime_version >= RuntimeApiRequest::CLAIM_QUEUE_RUNTIME_REQUIREMENT => { + tx.send(Ok(BTreeMap::new())).unwrap(); + }, + Some(AllMessages::RuntimeApi(RuntimeApiMessage::Request( + _hash, + RuntimeApiRequest::ParaBackingState(_para_id, tx), + ))) => { + tx.send(Ok(Some(dummy_backing_state(vec![])))).unwrap(); + }, Some(msg) => panic!("didn't expect any other overseer requests given no availability cores; got {:?}", msg), } } @@ -184,8 +248,10 @@ fn requests_availability_per_relay_parent() { assert_eq!(requested_availability_cores, activated_hashes); } -#[test] -fn requests_validation_data_for_scheduled_matches() { +#[rstest] +#[case(RuntimeApiRequest::CLAIM_QUEUE_RUNTIME_REQUIREMENT - 1)] +#[case(RuntimeApiRequest::CLAIM_QUEUE_RUNTIME_REQUIREMENT)] +fn requests_validation_data_for_scheduled_matches(#[case] runtime_version: u32) { let activated_hashes: Vec = vec![ Hash::repeat_byte(1), Hash::repeat_byte(4), @@ -242,6 +308,24 @@ fn requests_validation_data_for_scheduled_matches() { })) .unwrap(); }, + Some(AllMessages::RuntimeApi(RuntimeApiMessage::Request( + _hash, + RuntimeApiRequest::Version(tx), + ))) => { + tx.send(Ok(runtime_version)).unwrap(); + }, + Some(AllMessages::RuntimeApi(RuntimeApiMessage::Request( + _hash, + RuntimeApiRequest::ClaimQueue(tx), + ))) if runtime_version >= RuntimeApiRequest::CLAIM_QUEUE_RUNTIME_REQUIREMENT => { + tx.send(Ok(BTreeMap::new())).unwrap(); + }, + Some(AllMessages::RuntimeApi(RuntimeApiMessage::Request( + _hash, + RuntimeApiRequest::ParaBackingState(_para_id, tx), + ))) => { + tx.send(Ok(Some(dummy_backing_state(vec![])))).unwrap(); + }, Some(msg) => { panic!("didn't expect any other overseer requests; got {:?}", msg) }, @@ -271,8 +355,10 @@ fn requests_validation_data_for_scheduled_matches() { assert_eq!(requested_validation_data, vec![[4; 32].into()]); } -#[test] -fn sends_distribute_collation_message() { +#[rstest] +#[case(RuntimeApiRequest::CLAIM_QUEUE_RUNTIME_REQUIREMENT - 1)] +#[case(RuntimeApiRequest::CLAIM_QUEUE_RUNTIME_REQUIREMENT)] +fn sends_distribute_collation_message(#[case] runtime_version: u32) { let activated_hashes: Vec = vec![ Hash::repeat_byte(1), Hash::repeat_byte(4), @@ -339,6 +425,24 @@ fn sends_distribute_collation_message() { })) .unwrap(); }, + Some(AllMessages::RuntimeApi(RuntimeApiMessage::Request( + _hash, + RuntimeApiRequest::Version(tx), + ))) => { + tx.send(Ok(runtime_version)).unwrap(); + }, + Some(AllMessages::RuntimeApi(RuntimeApiMessage::Request( + _hash, + RuntimeApiRequest::ClaimQueue(tx), + ))) if runtime_version >= RuntimeApiRequest::CLAIM_QUEUE_RUNTIME_REQUIREMENT => { + tx.send(Ok(BTreeMap::new())).unwrap(); + }, + Some(AllMessages::RuntimeApi(RuntimeApiMessage::Request( + _hash, + RuntimeApiRequest::ParaBackingState(_para_id, tx), + ))) => { + tx.send(Ok(Some(dummy_backing_state(vec![])))).unwrap(); + }, Some(msg @ AllMessages::CollatorProtocol(_)) => { inner_to_collator_protocol.lock().await.push(msg); }, @@ -390,11 +494,11 @@ fn sends_distribute_collation_message() { assert_eq!(to_collator_protocol.len(), 1); match AllMessages::from(to_collator_protocol.pop().unwrap()) { - AllMessages::CollatorProtocol(CollatorProtocolMessage::DistributeCollation( - CandidateReceipt { descriptor, .. }, - _pov, - .., - )) => { + AllMessages::CollatorProtocol(CollatorProtocolMessage::DistributeCollation { + candidate_receipt, + .. + }) => { + let CandidateReceipt { descriptor, .. } = candidate_receipt; // signature generation is non-deterministic, so we can't just assert that the // expected descriptor is correct. What we can do is validate that the produced // descriptor has a valid signature, then just copy in the generated signature @@ -423,8 +527,10 @@ fn sends_distribute_collation_message() { } } -#[test] -fn fallback_when_no_validation_code_hash_api() { +#[rstest] +#[case(RuntimeApiRequest::CLAIM_QUEUE_RUNTIME_REQUIREMENT - 1)] +#[case(RuntimeApiRequest::CLAIM_QUEUE_RUNTIME_REQUIREMENT)] +fn fallback_when_no_validation_code_hash_api(#[case] runtime_version: u32) { // This is a variant of the above test, but with the validation code hash API disabled. let activated_hashes: Vec = vec![ @@ -501,9 +607,27 @@ fn fallback_when_no_validation_code_hash_api() { })) .unwrap(); }, + Some(AllMessages::RuntimeApi(RuntimeApiMessage::Request( + _hash, + RuntimeApiRequest::Version(tx), + ))) => { + tx.send(Ok(runtime_version)).unwrap(); + }, Some(msg @ AllMessages::CollatorProtocol(_)) => { inner_to_collator_protocol.lock().await.push(msg); }, + Some(AllMessages::RuntimeApi(RuntimeApiMessage::Request( + _hash, + RuntimeApiRequest::ClaimQueue(tx), + ))) if runtime_version >= RuntimeApiRequest::CLAIM_QUEUE_RUNTIME_REQUIREMENT => { + tx.send(Ok(Default::default())).unwrap(); + }, + Some(AllMessages::RuntimeApi(RuntimeApiMessage::Request( + _hash, + RuntimeApiRequest::ParaBackingState(_para_id, tx), + ))) => { + tx.send(Ok(Some(dummy_backing_state(vec![])))).unwrap(); + }, Some(msg) => { panic!("didn't expect any other overseer requests; got {:?}", msg) }, @@ -529,11 +653,11 @@ fn fallback_when_no_validation_code_hash_api() { assert_eq!(to_collator_protocol.len(), 1); match &to_collator_protocol[0] { - AllMessages::CollatorProtocol(CollatorProtocolMessage::DistributeCollation( - CandidateReceipt { descriptor, .. }, - _pov, - .., - )) => { + AllMessages::CollatorProtocol(CollatorProtocolMessage::DistributeCollation { + candidate_receipt, + .. + }) => { + let CandidateReceipt { descriptor, .. } = candidate_receipt; assert_eq!(expect_validation_code_hash, descriptor.validation_code_hash); }, _ => panic!("received wrong message type"), @@ -551,6 +675,7 @@ fn submit_collation_is_no_op_before_initialization() { parent_head: vec![1, 2, 3].into(), validation_code_hash: Hash::repeat_byte(1).into(), result_sender: None, + core_index: CoreIndex(0), }), }) .await; @@ -563,7 +688,7 @@ fn submit_collation_is_no_op_before_initialization() { fn submit_collation_leads_to_distribution() { let relay_parent = Hash::repeat_byte(0); let validation_code_hash = ValidationCodeHash::from(Hash::repeat_byte(42)); - let parent_head = HeadData::from(vec![1, 2, 3]); + let parent_head = dummy_head_data(); let para_id = ParaId::from(5); let expected_pvd = PersistedValidationData { parent_head: parent_head.clone(), @@ -584,9 +709,10 @@ fn submit_collation_leads_to_distribution() { msg: CollationGenerationMessage::SubmitCollation(SubmitCollationParams { relay_parent, collation: test_collation(), - parent_head: vec![1, 2, 3].into(), + parent_head: dummy_head_data(), validation_code_hash, result_sender: None, + core_index: CoreIndex(0), }), }) .await; @@ -619,18 +745,515 @@ fn submit_collation_leads_to_distribution() { assert_matches!( overseer_recv(&mut virtual_overseer).await, - AllMessages::CollatorProtocol(CollatorProtocolMessage::DistributeCollation( - ccr, + AllMessages::CollatorProtocol(CollatorProtocolMessage::DistributeCollation { + candidate_receipt, parent_head_data_hash, .. - )) => { + }) => { + let CandidateReceipt { descriptor, .. } = candidate_receipt; assert_eq!(parent_head_data_hash, parent_head.hash()); - assert_eq!(ccr.descriptor().persisted_validation_data_hash, expected_pvd.hash()); - assert_eq!(ccr.descriptor().para_head, dummy_head_data().hash()); - assert_eq!(ccr.descriptor().validation_code_hash, validation_code_hash); + assert_eq!(descriptor.persisted_validation_data_hash, expected_pvd.hash()); + assert_eq!(descriptor.para_head, dummy_head_data().hash()); + assert_eq!(descriptor.validation_code_hash, validation_code_hash); } ); virtual_overseer }); } + +// There is one core in `Occupied` state and async backing is enabled. On new head activation +// `CollationGeneration` should produce and distribute a new collation. +#[rstest] +#[case(RuntimeApiRequest::CLAIM_QUEUE_RUNTIME_REQUIREMENT - 1)] +#[case(RuntimeApiRequest::CLAIM_QUEUE_RUNTIME_REQUIREMENT)] +fn distribute_collation_for_occupied_core_with_async_backing_enabled(#[case] runtime_version: u32) { + let activated_hash: Hash = [1; 32].into(); + let para_id = ParaId::from(5); + + // One core, in occupied state. The data in `CoreState` and `ClaimQueue` should match. + let cores: Vec = vec![CoreState::Occupied(polkadot_primitives::OccupiedCore { + next_up_on_available: Some(ScheduledCore { para_id, collator: None }), + occupied_since: 1, + time_out_at: 10, + next_up_on_time_out: Some(ScheduledCore { para_id, collator: None }), + availability: Default::default(), // doesn't matter + group_responsible: polkadot_primitives::GroupIndex(0), + candidate_hash: Default::default(), + candidate_descriptor: dummy_candidate_descriptor(dummy_hash()), + })]; + let claim_queue = BTreeMap::from([(CoreIndex::from(0), VecDeque::from([para_id]))]).into(); + + test_harness(|mut virtual_overseer| async move { + helpers::initialize_collator(&mut virtual_overseer, para_id).await; + helpers::activate_new_head(&mut virtual_overseer, activated_hash).await; + + let pending_availability = + vec![dummy_candidate_pending_availability(para_id, activated_hash, 1)]; + helpers::handle_runtime_calls_on_new_head_activation( + &mut virtual_overseer, + activated_hash, + AsyncBackingParams { max_candidate_depth: 1, allowed_ancestry_len: 1 }, + cores, + runtime_version, + claim_queue, + ) + .await; + helpers::handle_cores_processing_for_a_leaf( + &mut virtual_overseer, + activated_hash, + para_id, + // `CoreState` is `Occupied` => `OccupiedCoreAssumption` is `Included` + OccupiedCoreAssumption::Included, + 1, + pending_availability, + runtime_version, + ) + .await; + + virtual_overseer + }); +} + +#[test] +fn distribute_collation_for_occupied_core_pre_async_backing() { + let activated_hash: Hash = [1; 32].into(); + let para_id = ParaId::from(5); + let total_cores = 3; + + // Use runtime version before async backing + let runtime_version = RuntimeApiRequest::ASYNC_BACKING_STATE_RUNTIME_REQUIREMENT - 1; + + let cores = (0..total_cores) + .into_iter() + .map(|_idx| CoreState::Scheduled(ScheduledCore { para_id, collator: None })) + .collect::>(); + + let claim_queue = cores + .iter() + .enumerate() + .map(|(idx, _core)| (CoreIndex::from(idx as u32), VecDeque::from([para_id]))) + .collect::>(); + + test_harness(|mut virtual_overseer| async move { + helpers::initialize_collator(&mut virtual_overseer, para_id).await; + helpers::activate_new_head(&mut virtual_overseer, activated_hash).await; + helpers::handle_runtime_calls_on_new_head_activation( + &mut virtual_overseer, + activated_hash, + AsyncBackingParams { max_candidate_depth: 1, allowed_ancestry_len: 1 }, + cores, + runtime_version, + claim_queue, + ) + .await; + + helpers::handle_cores_processing_for_a_leaf( + &mut virtual_overseer, + activated_hash, + para_id, + // `CoreState` is `Free` => `OccupiedCoreAssumption` is `Free` + OccupiedCoreAssumption::Free, + total_cores, + vec![], + runtime_version, + ) + .await; + + virtual_overseer + }); +} + +// There are variable number of cores of cores in `Occupied` state and async backing is enabled. +// On new head activation `CollationGeneration` should produce and distribute a new collation +// with proper assumption about the para candidate chain availability at next block. +#[rstest] +#[case(0)] +#[case(1)] +#[case(2)] +fn distribute_collation_for_occupied_cores_with_async_backing_enabled_and_elastic_scaling( + #[case] candidates_pending_avail: u32, +) { + let activated_hash: Hash = [1; 32].into(); + let para_id = ParaId::from(5); + // Using latest runtime with the fancy claim queue exposed. + let runtime_version = RuntimeApiRequest::CLAIM_QUEUE_RUNTIME_REQUIREMENT; + + let cores = (0..3) + .into_iter() + .map(|idx| { + CoreState::Occupied(polkadot_primitives::OccupiedCore { + next_up_on_available: Some(ScheduledCore { para_id, collator: None }), + occupied_since: 0, + time_out_at: 10, + next_up_on_time_out: Some(ScheduledCore { para_id, collator: None }), + availability: Default::default(), // doesn't matter + group_responsible: polkadot_primitives::GroupIndex(idx as u32), + candidate_hash: Default::default(), + candidate_descriptor: dummy_candidate_descriptor(dummy_hash()), + }) + }) + .collect::>(); + + let pending_availability = (0..candidates_pending_avail) + .into_iter() + .map(|_idx| dummy_candidate_pending_availability(para_id, activated_hash, 0)) + .collect::>(); + + let claim_queue = cores + .iter() + .enumerate() + .map(|(idx, _core)| (CoreIndex::from(idx as u32), VecDeque::from([para_id]))) + .collect::>(); + let total_cores = cores.len(); + + test_harness(|mut virtual_overseer| async move { + helpers::initialize_collator(&mut virtual_overseer, para_id).await; + helpers::activate_new_head(&mut virtual_overseer, activated_hash).await; + helpers::handle_runtime_calls_on_new_head_activation( + &mut virtual_overseer, + activated_hash, + AsyncBackingParams { max_candidate_depth: 1, allowed_ancestry_len: 1 }, + cores, + runtime_version, + claim_queue, + ) + .await; + + helpers::handle_cores_processing_for_a_leaf( + &mut virtual_overseer, + activated_hash, + para_id, + // if at least 1 cores is occupied => `OccupiedCoreAssumption` is `Included` + // else assumption is `Free`. + if candidates_pending_avail > 0 { + OccupiedCoreAssumption::Included + } else { + OccupiedCoreAssumption::Free + }, + total_cores, + pending_availability, + runtime_version, + ) + .await; + + virtual_overseer + }); +} + +// There are variable number of cores of cores in `Free` state and async backing is enabled. +// On new head activation `CollationGeneration` should produce and distribute a new collation +// with proper assumption about the para candidate chain availability at next block. +#[rstest] +#[case(0)] +#[case(1)] +#[case(2)] +fn distribute_collation_for_free_cores_with_async_backing_enabled_and_elastic_scaling( + #[case] total_cores: usize, +) { + let activated_hash: Hash = [1; 32].into(); + let para_id = ParaId::from(5); + // Using latest runtime with the fancy claim queue exposed. + let runtime_version = RuntimeApiRequest::CLAIM_QUEUE_RUNTIME_REQUIREMENT; + + let cores = (0..total_cores) + .into_iter() + .map(|_idx| CoreState::Scheduled(ScheduledCore { para_id, collator: None })) + .collect::>(); + + let claim_queue = cores + .iter() + .enumerate() + .map(|(idx, _core)| (CoreIndex::from(idx as u32), VecDeque::from([para_id]))) + .collect::>(); + + test_harness(|mut virtual_overseer| async move { + helpers::initialize_collator(&mut virtual_overseer, para_id).await; + helpers::activate_new_head(&mut virtual_overseer, activated_hash).await; + helpers::handle_runtime_calls_on_new_head_activation( + &mut virtual_overseer, + activated_hash, + AsyncBackingParams { max_candidate_depth: 1, allowed_ancestry_len: 1 }, + cores, + runtime_version, + claim_queue, + ) + .await; + + helpers::handle_cores_processing_for_a_leaf( + &mut virtual_overseer, + activated_hash, + para_id, + // `CoreState` is `Free` => `OccupiedCoreAssumption` is `Free` + OccupiedCoreAssumption::Free, + total_cores, + vec![], + runtime_version, + ) + .await; + + virtual_overseer + }); +} + +// There is one core in `Occupied` state and async backing is disabled. On new head activation +// no new collation should be generated. +#[rstest] +#[case(RuntimeApiRequest::CLAIM_QUEUE_RUNTIME_REQUIREMENT - 1)] +#[case(RuntimeApiRequest::CLAIM_QUEUE_RUNTIME_REQUIREMENT)] +fn no_collation_is_distributed_for_occupied_core_with_async_backing_disabled( + #[case] runtime_version: u32, +) { + let activated_hash: Hash = [1; 32].into(); + let para_id = ParaId::from(5); + + // One core, in occupied state. The data in `CoreState` and `ClaimQueue` should match. + let cores: Vec = vec![CoreState::Occupied(polkadot_primitives::OccupiedCore { + next_up_on_available: Some(ScheduledCore { para_id, collator: None }), + occupied_since: 1, + time_out_at: 10, + next_up_on_time_out: Some(ScheduledCore { para_id, collator: None }), + availability: Default::default(), // doesn't matter + group_responsible: polkadot_primitives::GroupIndex(0), + candidate_hash: Default::default(), + candidate_descriptor: dummy_candidate_descriptor(dummy_hash()), + })]; + let claim_queue = BTreeMap::from([(CoreIndex::from(0), VecDeque::from([para_id]))]).into(); + + test_harness(|mut virtual_overseer| async move { + helpers::initialize_collator(&mut virtual_overseer, para_id).await; + helpers::activate_new_head(&mut virtual_overseer, activated_hash).await; + + helpers::handle_runtime_calls_on_new_head_activation( + &mut virtual_overseer, + activated_hash, + AsyncBackingParams { max_candidate_depth: 0, allowed_ancestry_len: 0 }, + cores, + runtime_version, + claim_queue, + ) + .await; + + virtual_overseer + }); +} + +mod helpers { + use polkadot_primitives::{ + async_backing::{Constraints, InboundHrmpLimitations}, + BlockNumber, + }; + + use super::*; + + // A set for dummy constraints for `ParaBackingState`` + pub(crate) fn dummy_constraints( + min_relay_parent_number: BlockNumber, + valid_watermarks: Vec, + required_parent: HeadData, + validation_code_hash: ValidationCodeHash, + ) -> Constraints { + Constraints { + min_relay_parent_number, + max_pov_size: 5 * 1024 * 1024, + max_code_size: 1_000_000, + ump_remaining: 10, + ump_remaining_bytes: 1_000, + max_ump_num_per_candidate: 10, + dmp_remaining_messages: vec![], + hrmp_inbound: InboundHrmpLimitations { valid_watermarks }, + hrmp_channels_out: vec![], + max_hrmp_num_per_candidate: 0, + required_parent, + validation_code_hash, + upgrade_restriction: None, + future_validation_code: None, + } + } + + // Sends `Initialize` with a collator config + pub async fn initialize_collator(virtual_overseer: &mut VirtualOverseer, para_id: ParaId) { + virtual_overseer + .send(FromOrchestra::Communication { + msg: CollationGenerationMessage::Initialize(test_config(para_id)), + }) + .await; + } + + // Sends `ActiveLeaves` for a single leaf with the specified hash. Block number is hardcoded. + pub async fn activate_new_head(virtual_overseer: &mut VirtualOverseer, activated_hash: Hash) { + virtual_overseer + .send(FromOrchestra::Signal(OverseerSignal::ActiveLeaves(ActiveLeavesUpdate { + activated: Some(ActivatedLeaf { + hash: activated_hash, + number: 10, + unpin_handle: polkadot_node_subsystem_test_helpers::mock::dummy_unpin_handle( + activated_hash, + ), + span: Arc::new(overseer::jaeger::Span::Disabled), + }), + ..Default::default() + }))) + .await; + } + + // Handle all runtime calls performed in `handle_new_activations`. Conditionally expects a + // `CLAIM_QUEUE_RUNTIME_REQUIREMENT` call if the passed `runtime_version` is greater or equal to + // `CLAIM_QUEUE_RUNTIME_REQUIREMENT` + pub async fn handle_runtime_calls_on_new_head_activation( + virtual_overseer: &mut VirtualOverseer, + activated_hash: Hash, + async_backing_params: AsyncBackingParams, + cores: Vec, + runtime_version: u32, + claim_queue: BTreeMap>, + ) { + assert_matches!( + overseer_recv(virtual_overseer).await, + AllMessages::RuntimeApi(RuntimeApiMessage::Request(hash, RuntimeApiRequest::AvailabilityCores(tx))) => { + assert_eq!(hash, activated_hash); + let _ = tx.send(Ok(cores)); + } + ); + + assert_matches!( + overseer_recv(virtual_overseer).await, + AllMessages::RuntimeApi(RuntimeApiMessage::Request(hash, RuntimeApiRequest::Validators(tx))) => { + assert_eq!(hash, activated_hash); + let _ = tx.send(Ok(vec![ + Sr25519Keyring::Alice.public().into(), + Sr25519Keyring::Bob.public().into(), + Sr25519Keyring::Charlie.public().into(), + ])); + } + ); + + let async_backing_response = + if runtime_version >= RuntimeApiRequest::ASYNC_BACKING_STATE_RUNTIME_REQUIREMENT { + Ok(async_backing_params) + } else { + Err(RuntimeApiError::NotSupported { runtime_api_name: "async_backing_params" }) + }; + + assert_matches!( + overseer_recv(virtual_overseer).await, + AllMessages::RuntimeApi(RuntimeApiMessage::Request( + hash, + RuntimeApiRequest::AsyncBackingParams( + tx, + ), + )) => { + assert_eq!(hash, activated_hash); + let _ = tx.send(async_backing_response); + } + ); + + assert_matches!( + overseer_recv(virtual_overseer).await, + AllMessages::RuntimeApi(RuntimeApiMessage::Request( + hash, + RuntimeApiRequest::Version(tx), + )) => { + assert_eq!(hash, activated_hash); + let _ = tx.send(Ok(runtime_version)); + } + ); + + if runtime_version == RuntimeApiRequest::CLAIM_QUEUE_RUNTIME_REQUIREMENT { + assert_matches!( + overseer_recv(virtual_overseer).await, + AllMessages::RuntimeApi(RuntimeApiMessage::Request( + hash, + RuntimeApiRequest::ClaimQueue(tx), + )) => { + assert_eq!(hash, activated_hash); + let _ = tx.send(Ok(claim_queue.into())); + } + ); + } + } + + // Handles all runtime requests performed in `handle_new_activations` for the case when a + // collation should be prepared for the new leaf + pub async fn handle_cores_processing_for_a_leaf( + virtual_overseer: &mut VirtualOverseer, + activated_hash: Hash, + para_id: ParaId, + expected_occupied_core_assumption: OccupiedCoreAssumption, + cores_assigned: usize, + pending_availability: Vec, + runtime_version: u32, + ) { + // Expect no messages if no cores is assigned to the para + if cores_assigned == 0 { + assert!(overseer_recv(virtual_overseer).timeout(TIMEOUT / 2).await.is_none()); + return + } + + // Some hardcoded data - if needed, extract to parameters + let validation_code_hash = ValidationCodeHash::from(Hash::repeat_byte(42)); + let parent_head = dummy_head_data(); + let pvd = PersistedValidationData { + parent_head: parent_head.clone(), + relay_parent_number: 10, + relay_parent_storage_root: Hash::repeat_byte(1), + max_pov_size: 1024, + }; + + if runtime_version >= RuntimeApiRequest::ASYNC_BACKING_STATE_RUNTIME_REQUIREMENT { + assert_matches!( + overseer_recv(virtual_overseer).await, + AllMessages::RuntimeApi( + RuntimeApiMessage::Request(parent, RuntimeApiRequest::ParaBackingState(p_id, tx)) + ) if parent == activated_hash && p_id == para_id => { + tx.send(Ok(Some(dummy_backing_state(pending_availability)))).unwrap(); + } + ); + } + + assert_matches!( + overseer_recv(virtual_overseer).await, + AllMessages::RuntimeApi(RuntimeApiMessage::Request(hash, RuntimeApiRequest::PersistedValidationData(id, a, tx))) => { + assert_eq!(hash, activated_hash); + assert_eq!(id, para_id); + assert_eq!(a, expected_occupied_core_assumption); + + let _ = tx.send(Ok(Some(pvd.clone()))); + } + ); + + assert_matches!( + overseer_recv(virtual_overseer).await, + AllMessages::RuntimeApi(RuntimeApiMessage::Request( + hash, + RuntimeApiRequest::ValidationCodeHash( + id, + assumption, + tx, + ), + )) => { + assert_eq!(hash, activated_hash); + assert_eq!(id, para_id); + assert_eq!(assumption, expected_occupied_core_assumption); + + let _ = tx.send(Ok(Some(validation_code_hash))); + } + ); + + for _ in 0..cores_assigned { + assert_matches!( + overseer_recv(virtual_overseer).await, + AllMessages::CollatorProtocol(CollatorProtocolMessage::DistributeCollation{ + candidate_receipt, + parent_head_data_hash, + .. + }) => { + assert_eq!(parent_head_data_hash, parent_head.hash()); + assert_eq!(candidate_receipt.descriptor().persisted_validation_data_hash, pvd.hash()); + assert_eq!(candidate_receipt.descriptor().para_head, dummy_head_data().hash()); + assert_eq!(candidate_receipt.descriptor().validation_code_hash, validation_code_hash); + } + ); + } + } +} diff --git a/polkadot/node/core/approval-voting/Cargo.toml b/polkadot/node/core/approval-voting/Cargo.toml index 5ab823f489454e8cc8f3b7fa3fd32119484277fa..ced7706c40a288759dd0f5336a8389c60c8e533a 100644 --- a/polkadot/node/core/approval-voting/Cargo.toml +++ b/polkadot/node/core/approval-voting/Cargo.toml @@ -10,7 +10,7 @@ description = "Approval Voting Subsystem of the Polkadot node" workspace = true [dependencies] -futures = "0.3.21" +futures = "0.3.30" futures-timer = "3.0.2" parity-scale-codec = { version = "3.6.1", default-features = false, features = ["bit-vec", "derive"] } gum = { package = "tracing-gum", path = "../../gum" } @@ -20,7 +20,7 @@ merlin = "3.0" schnorrkel = "0.11.4" kvdb = "0.13.0" derive_more = "0.99.17" -thiserror = "1.0.48" +thiserror = { workspace = true } itertools = "0.10.5" polkadot-node-subsystem = { path = "../../subsystem" } @@ -35,13 +35,13 @@ sp-consensus = { path = "../../../../substrate/primitives/consensus/common", def sp-consensus-slots = { path = "../../../../substrate/primitives/consensus/slots", default-features = false } sp-application-crypto = { path = "../../../../substrate/primitives/application-crypto", default-features = false, features = ["full_crypto"] } sp-runtime = { path = "../../../../substrate/primitives/runtime", default-features = false } -# should match schnorrkel +# rand_core should match schnorrkel rand_core = "0.6.2" rand_chacha = { version = "0.3.1" } rand = "0.8.5" [dev-dependencies] -async-trait = "0.1.74" +async-trait = "0.1.79" parking_lot = "0.12.1" sp-keyring = { path = "../../../../substrate/primitives/keyring" } sp-keystore = { path = "../../../../substrate/primitives/keystore" } @@ -51,5 +51,5 @@ polkadot-node-subsystem-test-helpers = { path = "../../subsystem-test-helpers" } assert_matches = "1.4.0" kvdb-memorydb = "0.13.0" test-helpers = { package = "polkadot-primitives-test-helpers", path = "../../../primitives/test-helpers" } -log = "0.4.17" -env_logger = "0.9.0" +log = { workspace = true, default-features = true } +env_logger = "0.11" diff --git a/polkadot/node/core/approval-voting/src/approval_checking.rs b/polkadot/node/core/approval-voting/src/approval_checking.rs index 0aa6102fbd6d243b793e889fefb80297a7bb1d89..693a28800114c5196076fcabc2a194bf36f7a218 100644 --- a/polkadot/node/core/approval-voting/src/approval_checking.rs +++ b/polkadot/node/core/approval-voting/src/approval_checking.rs @@ -1148,7 +1148,7 @@ mod tests { } .into(); - // Populate the requested tranches. The assignemnts aren't inspected in + // Populate the requested tranches. The assignments aren't inspected in // this test. for &t in &test_tranche { approval_entry.import_assignment(t, ValidatorIndex(0), 0) diff --git a/polkadot/node/core/approval-voting/src/approval_db/v1/tests.rs b/polkadot/node/core/approval-voting/src/approval_db/v1/tests.rs index b979cb7ef45f6bf6af02acd8fde1d04e6bee8206..b0966ad01f7bff8242e3255968b3e85b4d0239ca 100644 --- a/polkadot/node/core/approval-voting/src/approval_db/v1/tests.rs +++ b/polkadot/node/core/approval-voting/src/approval_db/v1/tests.rs @@ -254,7 +254,7 @@ fn canonicalize_works() { // -> B1 -> C1 -> D1 // A -> B2 -> C2 -> D2 // - // We'll canonicalize C1. Everytning except D1 should disappear. + // We'll canonicalize C1. Everything except D1 should disappear. // // Candidates: // Cand1 in B2 diff --git a/polkadot/node/core/approval-voting/src/approval_db/v2/migration_helpers.rs b/polkadot/node/core/approval-voting/src/approval_db/v2/migration_helpers.rs index df6e4754dbd63ba81e736495297bfaf017a4e3dc..1081d79884f7594be12ebe6cee3047cb2b9feebe 100644 --- a/polkadot/node/core/approval-voting/src/approval_db/v2/migration_helpers.rs +++ b/polkadot/node/core/approval-voting/src/approval_db/v2/migration_helpers.rs @@ -79,7 +79,7 @@ pub fn v1_to_latest(db: Arc, config: Config) -> Result<()> { block.candidates().iter().enumerate() { // Loading the candidate will also perform the conversion to the updated format and - // return that represantation. + // return that representation. if let Some(candidate_entry) = backend .load_candidate_entry_v1(&candidate_hash, candidate_index as CandidateIndex) .map_err(|e| Error::InternalError(e))? diff --git a/polkadot/node/core/approval-voting/src/approval_db/v2/tests.rs b/polkadot/node/core/approval-voting/src/approval_db/v2/tests.rs index 6021b44c2765ff12a03e1ad85bfb8117c9fcfb03..5fa915add4166fa1f042dadaae063aaa83941b92 100644 --- a/polkadot/node/core/approval-voting/src/approval_db/v2/tests.rs +++ b/polkadot/node/core/approval-voting/src/approval_db/v2/tests.rs @@ -269,7 +269,7 @@ fn canonicalize_works() { // -> B1 -> C1 -> D1 // A -> B2 -> C2 -> D2 // - // We'll canonicalize C1. Everytning except D1 should disappear. + // We'll canonicalize C1. Everything except D1 should disappear. // // Candidates: // Cand1 in B2 diff --git a/polkadot/node/core/approval-voting/src/approval_db/v3/migration_helpers.rs b/polkadot/node/core/approval-voting/src/approval_db/v3/migration_helpers.rs index ad5e89ef3de84035ff3e9c79533edfc07bf8d4c5..d1e7ee08225bf96ceffab8842972cf53ed5725da 100644 --- a/polkadot/node/core/approval-voting/src/approval_db/v3/migration_helpers.rs +++ b/polkadot/node/core/approval-voting/src/approval_db/v3/migration_helpers.rs @@ -60,7 +60,7 @@ pub fn v2_to_latest(db: Arc, config: Config) -> Result<()> { block.candidates().iter().enumerate() { // Loading the candidate will also perform the conversion to the updated format and - // return that represantation. + // return that representation. if let Some(candidate_entry) = backend .load_candidate_entry_v2(&candidate_hash, candidate_index as CandidateIndex) .map_err(|e| Error::InternalError(e))? @@ -104,7 +104,7 @@ pub fn v1_to_latest_sanity_check( for block in all_blocks { for (_core_index, candidate_hash) in block.candidates() { // Loading the candidate will also perform the conversion to the updated format and - // return that represantation. + // return that representation. if let Some(candidate_entry) = backend.load_candidate_entry(&candidate_hash).unwrap() { candidates.insert(candidate_entry.candidate.hash()); } diff --git a/polkadot/node/core/approval-voting/src/approval_db/v3/tests.rs b/polkadot/node/core/approval-voting/src/approval_db/v3/tests.rs index 08c65461bca80aafb758e42c80b509bc37c47ece..7c0cf9d4f7daaccd1887a03a2a06e9bb4e6b587e 100644 --- a/polkadot/node/core/approval-voting/src/approval_db/v3/tests.rs +++ b/polkadot/node/core/approval-voting/src/approval_db/v3/tests.rs @@ -264,7 +264,7 @@ fn canonicalize_works() { // -> B1 -> C1 -> D1 // A -> B2 -> C2 -> D2 // - // We'll canonicalize C1. Everytning except D1 should disappear. + // We'll canonicalize C1. Everything except D1 should disappear. // // Candidates: // Cand1 in B2 diff --git a/polkadot/node/core/approval-voting/src/criteria.rs b/polkadot/node/core/approval-voting/src/criteria.rs index 1ebea2641b62198c291951448c8c552d9cfb34cf..57c0ac272dc5a5cad8b9c69831faa5ecfc778033 100644 --- a/polkadot/node/core/approval-voting/src/criteria.rs +++ b/polkadot/node/core/approval-voting/src/criteria.rs @@ -148,7 +148,7 @@ fn relay_vrf_modulo_cores( generate_samples(rand_chacha, num_samples as usize, max_cores as usize) } -/// Generates `num_sumples` randomly from (0..max_cores) range +/// Generates `num_samples` randomly from (0..max_cores) range /// /// Note! The algorithm can't change because validators on the other /// side won't be able to check the assignments until they update. diff --git a/polkadot/node/core/approval-voting/src/import.rs b/polkadot/node/core/approval-voting/src/import.rs index 7a56e9fd11293d1a96debd5e98b719a19c48045f..f4be42a4845080ce90fb87ddc838e2c1ab792ed1 100644 --- a/polkadot/node/core/approval-voting/src/import.rs +++ b/polkadot/node/core/approval-voting/src/import.rs @@ -45,8 +45,8 @@ use polkadot_node_subsystem::{ }; use polkadot_node_subsystem_util::{determine_new_blocks, runtime::RuntimeInfo}; use polkadot_primitives::{ - vstaging::node_features, BlockNumber, CandidateEvent, CandidateHash, CandidateReceipt, - ConsensusLog, CoreIndex, GroupIndex, Hash, Header, SessionIndex, + node_features, BlockNumber, CandidateEvent, CandidateHash, CandidateReceipt, ConsensusLog, + CoreIndex, GroupIndex, Hash, Header, SessionIndex, }; use sc_keystore::LocalKeystore; use sp_consensus_slots::Slot; @@ -91,7 +91,7 @@ enum ImportedBlockInfoError { #[error(transparent)] RuntimeError(RuntimeApiError), - #[error("future cancalled while requesting {0}")] + #[error("future cancelled while requesting {0}")] FutureCancelled(&'static str, futures::channel::oneshot::Canceled), #[error(transparent)] @@ -619,8 +619,8 @@ pub(crate) mod tests { use polkadot_node_subsystem_test_helpers::make_subsystem_context; use polkadot_node_subsystem_util::database::Database; use polkadot_primitives::{ - vstaging::{node_features::FeatureIndex, NodeFeatures}, - ExecutorParams, Id as ParaId, IndexedVec, SessionInfo, ValidatorId, ValidatorIndex, + node_features::FeatureIndex, ExecutorParams, Id as ParaId, IndexedVec, NodeFeatures, + SessionInfo, ValidatorId, ValidatorIndex, }; pub(crate) use sp_consensus_babe::{ digests::{CompatibleDigestItem, PreDigest, SecondaryVRFPreDigest}, diff --git a/polkadot/node/core/approval-voting/src/lib.rs b/polkadot/node/core/approval-voting/src/lib.rs index 456ae319787b07740bb0817dcfbe260500eb9dd8..7ecc2b2595bce78c3c65569369a932c847552b1c 100644 --- a/polkadot/node/core/approval-voting/src/lib.rs +++ b/polkadot/node/core/approval-voting/src/lib.rs @@ -54,10 +54,10 @@ use polkadot_node_subsystem_util::{ TimeoutExt, }; use polkadot_primitives::{ - vstaging::{ApprovalVoteMultipleCandidates, ApprovalVotingParams}, - BlockNumber, CandidateHash, CandidateIndex, CandidateReceipt, DisputeStatement, ExecutorParams, - GroupIndex, Hash, PvfExecKind, SessionIndex, SessionInfo, ValidDisputeStatementKind, - ValidatorId, ValidatorIndex, ValidatorPair, ValidatorSignature, + ApprovalVoteMultipleCandidates, ApprovalVotingParams, BlockNumber, CandidateHash, + CandidateIndex, CandidateReceipt, CoreIndex, DisputeStatement, ExecutorParams, GroupIndex, + Hash, PvfExecKind, SessionIndex, SessionInfo, ValidDisputeStatementKind, ValidatorId, + ValidatorIndex, ValidatorPair, ValidatorSignature, }; use sc_keystore::LocalKeystore; use sp_application_crypto::Pair; @@ -1102,7 +1102,7 @@ where // need to handle these newly generated actions before we finalize // completing additional actions in the submitted sequence of actions. // -// Since recursive async functions are not not stable yet, we are +// Since recursive async functions are not stable yet, we are // forced to modify the actions iterator on the fly whenever a new set // of actions are generated by handling a single action. // @@ -1253,13 +1253,20 @@ async fn handle_actions( Action::BecomeActive => { *mode = Mode::Active; - let messages = distribution_messages_for_activation( + let (messages, next_actions) = distribution_messages_for_activation( + ctx, overlayed_db, state, delayed_approvals_timers, - )?; + session_info_provider, + ) + .await?; ctx.send_messages(messages.into_iter()).await; + let next_actions: Vec = + next_actions.into_iter().map(|v| v.clone()).chain(actions_iter).collect(); + + actions_iter = next_actions.into_iter(); }, Action::Conclude => { conclude = true; @@ -1290,6 +1297,21 @@ fn cores_to_candidate_indices( CandidateBitfield::try_from(candidate_indices) } +// Returns the claimed core bitfield from the assignment cert and the core index +// from the block entry. +fn get_core_indices_on_startup( + assignment: &AssignmentCertKindV2, + block_entry_core_index: CoreIndex, +) -> CoreBitfield { + match &assignment { + AssignmentCertKindV2::RelayVRFModuloCompact { core_bitfield } => core_bitfield.clone(), + AssignmentCertKindV2::RelayVRFModulo { sample: _ } => + CoreBitfield::try_from(vec![block_entry_core_index]).expect("Not an empty vec; qed"), + AssignmentCertKindV2::RelayVRFDelay { core_index } => + CoreBitfield::try_from(vec![*core_index]).expect("Not an empty vec; qed"), + } +} + // Returns the claimed core bitfield from the assignment cert, the candidate hash and a // `BlockEntry`. Can fail only for VRF Delay assignments for which we cannot find the candidate hash // in the block entry which indicates a bug or corrupted storage. @@ -1313,15 +1335,19 @@ fn get_assignment_core_indices( } } -fn distribution_messages_for_activation( +#[overseer::contextbounds(ApprovalVoting, prefix = self::overseer)] +async fn distribution_messages_for_activation( + ctx: &mut Context, db: &OverlayedBackend<'_, impl Backend>, state: &State, delayed_approvals_timers: &mut DelayedApprovalTimer, -) -> SubsystemResult> { + session_info_provider: &mut RuntimeInfo, +) -> SubsystemResult<(Vec, Vec)> { let all_blocks: Vec = db.load_all_blocks()?; let mut approval_meta = Vec::with_capacity(all_blocks.len()); let mut messages = Vec::new(); + let mut actions = Vec::new(); messages.push(ApprovalDistributionMessage::NewBlocks(Vec::new())); // dummy value. @@ -1356,7 +1382,7 @@ fn distribution_messages_for_activation( session: block_entry.session(), }); let mut signatures_queued = HashSet::new(); - for (_, candidate_hash) in block_entry.candidates() { + for (core_index, candidate_hash) in block_entry.candidates() { let _candidate_span = distribution_message_span.child("candidate").with_candidate(*candidate_hash); let candidate_entry = match db.load_candidate_entry(&candidate_hash)? { @@ -1378,108 +1404,121 @@ fn distribution_messages_for_activation( match approval_entry.local_statements() { (None, None) | (None, Some(_)) => {}, // second is impossible case. (Some(assignment), None) => { - if let Some(claimed_core_indices) = get_assignment_core_indices( - &assignment.cert().kind, - &candidate_hash, - &block_entry, - ) { - if block_entry.has_candidates_pending_signature() { - delayed_approvals_timers.maybe_arm_timer( - state.clock.tick_now(), - state.clock.as_ref(), - block_entry.block_hash(), - assignment.validator_index(), - ) - } + let claimed_core_indices = + get_core_indices_on_startup(&assignment.cert().kind, *core_index); + + if block_entry.has_candidates_pending_signature() { + delayed_approvals_timers.maybe_arm_timer( + state.clock.tick_now(), + state.clock.as_ref(), + block_entry.block_hash(), + assignment.validator_index(), + ) + } + + match cores_to_candidate_indices(&claimed_core_indices, &block_entry) { + Ok(bitfield) => { + gum::debug!( + target: LOG_TARGET, + candidate_hash = ?candidate_entry.candidate_receipt().hash(), + ?block_hash, + "Discovered, triggered assignment, not approved yet", + ); - match cores_to_candidate_indices( - &claimed_core_indices, - &block_entry, - ) { - Ok(bitfield) => messages.push( + let indirect_cert = IndirectAssignmentCertV2 { + block_hash, + validator: assignment.validator_index(), + cert: assignment.cert().clone(), + }; + messages.push( ApprovalDistributionMessage::DistributeAssignment( - IndirectAssignmentCertV2 { - block_hash, - validator: assignment.validator_index(), - cert: assignment.cert().clone(), - }, - bitfield, + indirect_cert.clone(), + bitfield.clone(), ), - ), - Err(err) => { - // Should never happen. If we fail here it means the - // assignment is null (no cores claimed). - gum::warn!( - target: LOG_TARGET, - ?block_hash, - ?candidate_hash, - ?err, - "Failed to create assignment bitfield", - ); - }, - } - } else { - gum::warn!( - target: LOG_TARGET, - ?block_hash, - ?candidate_hash, - "Cannot get assignment claimed core indices", - ); + ); + + if !block_entry.candidate_is_pending_signature(*candidate_hash) + { + let ExtendedSessionInfo { ref executor_params, .. } = + match get_extended_session_info( + session_info_provider, + ctx.sender(), + block_entry.block_hash(), + block_entry.session(), + ) + .await + { + Some(i) => i, + None => continue, + }; + + actions.push(Action::LaunchApproval { + claimed_candidate_indices: bitfield, + candidate_hash: candidate_entry + .candidate_receipt() + .hash(), + indirect_cert, + assignment_tranche: assignment.tranche(), + relay_block_hash: block_hash, + session: block_entry.session(), + executor_params: executor_params.clone(), + candidate: candidate_entry.candidate_receipt().clone(), + backing_group: approval_entry.backing_group(), + distribute_assignment: false, + }); + } + }, + Err(err) => { + // Should never happen. If we fail here it means the + // assignment is null (no cores claimed). + gum::warn!( + target: LOG_TARGET, + ?block_hash, + ?candidate_hash, + ?err, + "Failed to create assignment bitfield", + ); + }, } }, (Some(assignment), Some(approval_sig)) => { - if let Some(claimed_core_indices) = get_assignment_core_indices( - &assignment.cert().kind, - &candidate_hash, - &block_entry, - ) { - match cores_to_candidate_indices( - &claimed_core_indices, - &block_entry, - ) { - Ok(bitfield) => messages.push( - ApprovalDistributionMessage::DistributeAssignment( - IndirectAssignmentCertV2 { - block_hash, - validator: assignment.validator_index(), - cert: assignment.cert().clone(), - }, - bitfield, - ), - ), - Err(err) => { - gum::warn!( - target: LOG_TARGET, - ?block_hash, - ?candidate_hash, - ?err, - "Failed to create assignment bitfield", - ); - // If we didn't send assignment, we don't send approval. - continue - }, - } - if signatures_queued - .insert(approval_sig.signed_candidates_indices.clone()) - { - messages.push(ApprovalDistributionMessage::DistributeApproval( - IndirectSignedApprovalVoteV2 { + let claimed_core_indices = + get_core_indices_on_startup(&assignment.cert().kind, *core_index); + match cores_to_candidate_indices(&claimed_core_indices, &block_entry) { + Ok(bitfield) => messages.push( + ApprovalDistributionMessage::DistributeAssignment( + IndirectAssignmentCertV2 { block_hash, - candidate_indices: approval_sig - .signed_candidates_indices, validator: assignment.validator_index(), - signature: approval_sig.signature, + cert: assignment.cert().clone(), }, - )) - }; - } else { - gum::warn!( - target: LOG_TARGET, - ?block_hash, - ?candidate_hash, - "Cannot get assignment claimed core indices", - ); + bitfield, + ), + ), + Err(err) => { + gum::warn!( + target: LOG_TARGET, + ?block_hash, + ?candidate_hash, + ?err, + "Failed to create assignment bitfield", + ); + // If we didn't send assignment, we don't send approval. + continue + }, } + if signatures_queued + .insert(approval_sig.signed_candidates_indices.clone()) + { + messages.push(ApprovalDistributionMessage::DistributeApproval( + IndirectSignedApprovalVoteV2 { + block_hash, + candidate_indices: approval_sig.signed_candidates_indices, + validator: assignment.validator_index(), + signature: approval_sig.signature, + }, + )) + }; }, } }, @@ -1496,7 +1535,7 @@ fn distribution_messages_for_activation( } messages[0] = ApprovalDistributionMessage::NewBlocks(approval_meta); - Ok(messages) + Ok((messages, actions)) } // Handle an incoming signal from the overseer. Returns true if execution should conclude. @@ -1811,7 +1850,7 @@ async fn get_approval_signatures_for_candidate( gum::trace!( target: LOG_TARGET, ?candidate_hash, - "Spawning task for fetching sinatures from approval-distribution" + "Spawning task for fetching signatures from approval-distribution" ); ctx.spawn("get-approval-signatures", Box::pin(get_approvals)) } diff --git a/polkadot/node/core/approval-voting/src/persisted_entries.rs b/polkadot/node/core/approval-voting/src/persisted_entries.rs index ef47bdb2213a153dc7223c1018ba8ec9b341a5aa..6eeb99cb99ffa017492dba93e72556eab9104c8e 100644 --- a/polkadot/node/core/approval-voting/src/persisted_entries.rs +++ b/polkadot/node/core/approval-voting/src/persisted_entries.rs @@ -454,7 +454,7 @@ pub struct BlockEntry { slot: Slot, relay_vrf_story: RelayVRFStory, // The candidates included as-of this block and the index of the core they are - // leaving. Sorted ascending by core index. + // leaving. candidates: Vec<(CoreIndex, CandidateHash)>, // A bitfield where the i'th bit corresponds to the i'th candidate in `candidates`. // The i'th bit is `true` iff the candidate has been approved in the context of this @@ -588,6 +588,13 @@ impl BlockEntry { !self.candidates_pending_signature.is_empty() } + /// Returns true if candidate hash is in the queue for a signature. + pub fn candidate_is_pending_signature(&self, candidate_hash: CandidateHash) -> bool { + self.candidates_pending_signature + .values() + .any(|context| context.candidate_hash == candidate_hash) + } + /// Candidate hashes for candidates pending signatures fn candidate_hashes_pending_signature(&self) -> Vec { self.candidates_pending_signature diff --git a/polkadot/node/core/approval-voting/src/tests.rs b/polkadot/node/core/approval-voting/src/tests.rs index 9220e84a2554a48c14468567e87e74319ce94151..f7bbbca4b8a1c0c5609898d714ad045dfd33f3ef 100644 --- a/polkadot/node/core/approval-voting/src/tests.rs +++ b/polkadot/node/core/approval-voting/src/tests.rs @@ -37,8 +37,8 @@ use polkadot_node_subsystem_test_helpers as test_helpers; use polkadot_node_subsystem_util::TimeoutExt; use polkadot_overseer::HeadSupportsParachains; use polkadot_primitives::{ - vstaging::NodeFeatures, ApprovalVote, CandidateCommitments, CandidateEvent, CoreIndex, - GroupIndex, Header, Id as ParaId, IndexedVec, ValidationCode, ValidatorSignature, + ApprovalVote, CandidateCommitments, CandidateEvent, CoreIndex, GroupIndex, Header, + Id as ParaId, IndexedVec, NodeFeatures, ValidationCode, ValidatorSignature, }; use std::time::Duration; @@ -78,6 +78,7 @@ struct TestSyncOracle { struct TestSyncOracleHandle { done_syncing_receiver: oneshot::Receiver<()>, + is_major_syncing: Arc, } impl TestSyncOracleHandle { @@ -108,8 +109,9 @@ impl SyncOracle for TestSyncOracle { fn make_sync_oracle(val: bool) -> (Box, TestSyncOracleHandle) { let (tx, rx) = oneshot::channel(); let flag = Arc::new(AtomicBool::new(val)); - let oracle = TestSyncOracle { flag, done_syncing_sender: Arc::new(Mutex::new(Some(tx))) }; - let handle = TestSyncOracleHandle { done_syncing_receiver: rx }; + let oracle = + TestSyncOracle { flag: flag.clone(), done_syncing_sender: Arc::new(Mutex::new(Some(tx))) }; + let handle = TestSyncOracleHandle { done_syncing_receiver: rx, is_major_syncing: flag }; (Box::new(oracle), handle) } @@ -465,6 +467,7 @@ struct HarnessConfigBuilder { clock: Option, backend: Option, assignment_criteria: Option>, + major_syncing: bool, } impl HarnessConfigBuilder { @@ -476,9 +479,19 @@ impl HarnessConfigBuilder { self } + pub fn major_syncing(&mut self, value: bool) -> &mut Self { + self.major_syncing = value; + self + } + + pub fn backend(&mut self, store: TestStore) -> &mut Self { + self.backend = Some(store); + self + } + pub fn build(&mut self) -> HarnessConfig { let (sync_oracle, sync_oracle_handle) = - self.sync_oracle.take().unwrap_or_else(|| make_sync_oracle(false)); + self.sync_oracle.take().unwrap_or_else(|| make_sync_oracle(self.major_syncing)); let assignment_criteria = self .assignment_criteria @@ -736,11 +749,13 @@ struct BlockConfig { slot: Slot, candidates: Option>, session_info: Option, + end_syncing: bool, } struct ChainBuilder { blocks_by_hash: HashMap, blocks_at_height: BTreeMap>, + is_major_syncing: Arc, } impl ChainBuilder { @@ -748,16 +763,28 @@ impl ChainBuilder { const GENESIS_PARENT_HASH: Hash = Hash::repeat_byte(0x00); pub fn new() -> Self { - let mut builder = - Self { blocks_by_hash: HashMap::new(), blocks_at_height: BTreeMap::new() }; + let mut builder = Self { + blocks_by_hash: HashMap::new(), + blocks_at_height: BTreeMap::new(), + is_major_syncing: Arc::new(AtomicBool::new(false)), + }; builder.add_block_inner( Self::GENESIS_HASH, Self::GENESIS_PARENT_HASH, 0, - BlockConfig { slot: Slot::from(0), candidates: None, session_info: None }, + BlockConfig { + slot: Slot::from(0), + candidates: None, + session_info: None, + end_syncing: false, + }, ); builder } + pub fn major_syncing(&mut self, major_syncing: Arc) -> &mut Self { + self.is_major_syncing = major_syncing; + self + } pub fn add_block( &mut self, @@ -808,8 +835,16 @@ impl ChainBuilder { } ancestry.reverse(); - import_block(overseer, ancestry.as_ref(), *number, block_config, false, i > 0) - .await; + import_block( + overseer, + ancestry.as_ref(), + *number, + block_config, + false, + i > 0, + self.is_major_syncing.clone(), + ) + .await; let _: Option<()> = future::pending().timeout(Duration::from_millis(100)).await; } } @@ -863,6 +898,7 @@ async fn import_block( config: &BlockConfig, gap: bool, fork: bool, + major_syncing: Arc, ) { let (new_head, new_header) = &hashes[hashes.len() - 1]; let candidates = config.candidates.clone().unwrap_or(vec![( @@ -891,6 +927,12 @@ async fn import_block( h_tx.send(Ok(Some(new_header.clone()))).unwrap(); } ); + + let is_major_syncing = major_syncing.load(Ordering::SeqCst); + if config.end_syncing { + major_syncing.store(false, Ordering::SeqCst); + } + if !fork { let mut _ancestry_step = 0; if gap { @@ -931,7 +973,7 @@ async fn import_block( } } - if number > 0 { + if number > 0 && !is_major_syncing { assert_matches!( overseer_recv(overseer).await, AllMessages::RuntimeApi( @@ -944,7 +986,6 @@ async fn import_block( c_tx.send(Ok(inclusion_events)).unwrap(); } ); - assert_matches!( overseer_recv(overseer).await, AllMessages::RuntimeApi( @@ -984,14 +1025,14 @@ async fn import_block( ); } - if number == 0 { + if number == 0 && !is_major_syncing { assert_matches!( overseer_recv(overseer).await, AllMessages::ApprovalDistribution(ApprovalDistributionMessage::NewBlocks(v)) => { assert_eq!(v.len(), 0usize); } ); - } else { + } else if number > 0 && !is_major_syncing { if !fork { // SessionInfo won't be called for forks - it's already cached assert_matches!( @@ -1031,20 +1072,23 @@ async fn import_block( ); } - assert_matches!( - overseer_recv(overseer).await, - AllMessages::ApprovalDistribution( - ApprovalDistributionMessage::NewBlocks(mut approval_vec) - ) => { - assert_eq!(approval_vec.len(), 1); - let metadata = approval_vec.pop().unwrap(); - let hash = &hashes[number as usize]; - let parent_hash = &hashes[(number - 1) as usize]; - assert_eq!(metadata.hash, hash.0.clone()); - assert_eq!(metadata.parent_hash, parent_hash.0.clone()); - assert_eq!(metadata.slot, config.slot); - } - ); + if !is_major_syncing { + assert_matches!( + overseer_recv(overseer).await, + + AllMessages::ApprovalDistribution( + ApprovalDistributionMessage::NewBlocks(mut approval_vec) + ) => { + assert_eq!(approval_vec.len(), 1); + let metadata = approval_vec.pop().unwrap(); + let hash = &hashes[number as usize]; + let parent_hash = &hashes[(number - 1) as usize]; + assert_eq!(metadata.hash, hash.0.clone()); + assert_eq!(metadata.parent_hash, parent_hash.0.clone()); + assert_eq!(metadata.slot, config.slot); + } + ); + } } } @@ -1072,7 +1116,7 @@ fn subsystem_rejects_bad_assignment_ok_criteria() { block_hash, head, 1, - BlockConfig { slot, candidates: None, session_info: None }, + BlockConfig { slot, candidates: None, session_info: None, end_syncing: false }, ); builder.build(&mut virtual_overseer).await; @@ -1135,7 +1179,7 @@ fn subsystem_rejects_bad_assignment_err_criteria() { block_hash, head, 1, - BlockConfig { slot, candidates: None, session_info: None }, + BlockConfig { slot, candidates: None, session_info: None, end_syncing: false }, ); builder.build(&mut virtual_overseer).await; @@ -1240,6 +1284,7 @@ fn subsystem_rejects_approval_if_no_candidate_entry() { slot, candidates: Some(vec![(candidate_descriptor, CoreIndex(1), GroupIndex(1))]), session_info: None, + end_syncing: false, }, ); builder.build(&mut virtual_overseer).await; @@ -1345,7 +1390,12 @@ fn subsystem_rejects_approval_before_assignment() { block_hash, ChainBuilder::GENESIS_HASH, 1, - BlockConfig { slot: Slot::from(1), candidates: None, session_info: None }, + BlockConfig { + slot: Slot::from(1), + candidates: None, + session_info: None, + end_syncing: false, + }, ) .build(&mut virtual_overseer) .await; @@ -1398,7 +1448,12 @@ fn subsystem_rejects_assignment_in_future() { block_hash, ChainBuilder::GENESIS_HASH, 1, - BlockConfig { slot: Slot::from(0), candidates: None, session_info: None }, + BlockConfig { + slot: Slot::from(0), + candidates: None, + session_info: None, + end_syncing: false, + }, ) .build(&mut virtual_overseer) .await; @@ -1472,6 +1527,7 @@ fn subsystem_accepts_duplicate_assignment() { (candidate_receipt2, CoreIndex(1), GroupIndex(1)), ]), session_info: None, + end_syncing: false, }, ) .build(&mut virtual_overseer) @@ -1537,7 +1593,12 @@ fn subsystem_rejects_assignment_with_unknown_candidate() { block_hash, ChainBuilder::GENESIS_HASH, 1, - BlockConfig { slot: Slot::from(1), candidates: None, session_info: None }, + BlockConfig { + slot: Slot::from(1), + candidates: None, + session_info: None, + end_syncing: false, + }, ) .build(&mut virtual_overseer) .await; @@ -1582,7 +1643,12 @@ fn subsystem_rejects_oversized_bitfields() { block_hash, ChainBuilder::GENESIS_HASH, 1, - BlockConfig { slot: Slot::from(1), candidates: None, session_info: None }, + BlockConfig { + slot: Slot::from(1), + candidates: None, + session_info: None, + end_syncing: false, + }, ) .build(&mut virtual_overseer) .await; @@ -1650,7 +1716,12 @@ fn subsystem_accepts_and_imports_approval_after_assignment() { block_hash, ChainBuilder::GENESIS_HASH, 1, - BlockConfig { slot: Slot::from(1), candidates: None, session_info: None }, + BlockConfig { + slot: Slot::from(1), + candidates: None, + session_info: None, + end_syncing: false, + }, ) .build(&mut virtual_overseer) .await; @@ -1741,6 +1812,7 @@ fn subsystem_second_approval_import_only_schedules_wakeups() { slot: Slot::from(0), candidates: None, session_info: Some(session_info), + end_syncing: false, }, ) .build(&mut virtual_overseer) @@ -1824,7 +1896,12 @@ fn subsystem_assignment_import_updates_candidate_entry_and_schedules_wakeup() { block_hash, ChainBuilder::GENESIS_HASH, 1, - BlockConfig { slot: Slot::from(1), candidates: None, session_info: None }, + BlockConfig { + slot: Slot::from(1), + candidates: None, + session_info: None, + end_syncing: false, + }, ) .build(&mut virtual_overseer) .await; @@ -1873,7 +1950,12 @@ fn subsystem_process_wakeup_schedules_wakeup() { block_hash, ChainBuilder::GENESIS_HASH, 1, - BlockConfig { slot: Slot::from(1), candidates: None, session_info: None }, + BlockConfig { + slot: Slot::from(1), + candidates: None, + session_info: None, + end_syncing: false, + }, ) .build(&mut virtual_overseer) .await; @@ -1925,7 +2007,7 @@ fn linear_import_act_on_leaf() { hash, head, i, - BlockConfig { slot, candidates: None, session_info: None }, + BlockConfig { slot, candidates: None, session_info: None, end_syncing: false }, ); head = hash; } @@ -1983,7 +2065,7 @@ fn forkful_import_at_same_height_act_on_leaf() { hash, head, i, - BlockConfig { slot, candidates: None, session_info: None }, + BlockConfig { slot, candidates: None, session_info: None, end_syncing: false }, ); head = hash; } @@ -1997,7 +2079,7 @@ fn forkful_import_at_same_height_act_on_leaf() { hash, head, session, - BlockConfig { slot, candidates: None, session_info: None }, + BlockConfig { slot, candidates: None, session_info: None, end_syncing: false }, ); } builder.build(&mut virtual_overseer).await; @@ -2168,6 +2250,7 @@ fn import_checked_approval_updates_entries_and_schedules() { slot, candidates: Some(vec![(candidate_descriptor, CoreIndex(0), GroupIndex(0))]), session_info: Some(session_info), + end_syncing: false, }, ); builder.build(&mut virtual_overseer).await; @@ -2323,6 +2406,7 @@ fn subsystem_import_checked_approval_sets_one_block_bit_at_a_time() { (candidate_receipt2, CoreIndex(1), GroupIndex(1)), ]), session_info: Some(session_info), + end_syncing: false, }, ) .build(&mut virtual_overseer) @@ -2395,6 +2479,173 @@ fn subsystem_import_checked_approval_sets_one_block_bit_at_a_time() { }); } +// See https://github.com/paritytech/polkadot-sdk/issues/3826 +#[test] +fn inclusion_events_can_be_unordered_by_core_index() { + let assignment_criteria = Box::new(MockAssignmentCriteria( + || { + let mut assignments = HashMap::new(); + for core in 0..3 { + let _ = assignments.insert( + CoreIndex(core), + approval_db::v2::OurAssignment { + cert: garbage_assignment_cert_v2( + AssignmentCertKindV2::RelayVRFModuloCompact { + core_bitfield: vec![CoreIndex(0), CoreIndex(1), CoreIndex(2)] + .try_into() + .unwrap(), + }, + ), + tranche: 0, + validator_index: ValidatorIndex(0), + triggered: false, + } + .into(), + ); + } + assignments + }, + |_| Ok(0), + )); + let config = HarnessConfigBuilder::default().assignment_criteria(assignment_criteria).build(); + let store = config.backend(); + + test_harness(config, |test_harness| async move { + let TestHarness { + mut virtual_overseer, + clock, + sync_oracle_handle: _sync_oracle_handle, + .. + } = test_harness; + + assert_matches!( + overseer_recv(&mut virtual_overseer).await, + AllMessages::ChainApi(ChainApiMessage::FinalizedBlockNumber(rx)) => { + rx.send(Ok(0)).unwrap(); + } + ); + + let block_hash = Hash::repeat_byte(0x01); + + let candidate_receipt0 = { + let mut receipt = dummy_candidate_receipt(block_hash); + receipt.descriptor.para_id = ParaId::from(0_u32); + receipt + }; + let candidate_receipt1 = { + let mut receipt = dummy_candidate_receipt(block_hash); + receipt.descriptor.para_id = ParaId::from(1_u32); + receipt + }; + let candidate_receipt2 = { + let mut receipt = dummy_candidate_receipt(block_hash); + receipt.descriptor.para_id = ParaId::from(2_u32); + receipt + }; + let candidate_index0 = 0; + let candidate_index1 = 1; + let candidate_index2 = 2; + + let validator0 = ValidatorIndex(0); + let validator1 = ValidatorIndex(1); + let validator2 = ValidatorIndex(2); + let validator3 = ValidatorIndex(3); + + let validators = vec![ + Sr25519Keyring::Alice, + Sr25519Keyring::Bob, + Sr25519Keyring::Charlie, + Sr25519Keyring::Dave, + Sr25519Keyring::Eve, + ]; + let session_info = SessionInfo { + validator_groups: IndexedVec::>::from(vec![ + vec![validator0, validator1], + vec![validator2], + vec![validator3], + ]), + needed_approvals: 1, + zeroth_delay_tranche_width: 1, + relay_vrf_modulo_samples: 1, + n_delay_tranches: 1, + no_show_slots: 1, + ..session_info(&validators) + }; + + ChainBuilder::new() + .add_block( + block_hash, + ChainBuilder::GENESIS_HASH, + 1, + BlockConfig { + slot: Slot::from(0), + candidates: Some(vec![ + (candidate_receipt0.clone(), CoreIndex(2), GroupIndex(2)), + (candidate_receipt1.clone(), CoreIndex(1), GroupIndex(0)), + (candidate_receipt2.clone(), CoreIndex(0), GroupIndex(1)), + ]), + session_info: Some(session_info), + end_syncing: true, + }, + ) + .build(&mut virtual_overseer) + .await; + + assert_eq!(clock.inner.lock().next_wakeup().unwrap(), 2); + clock.inner.lock().wakeup_all(100); + + assert_eq!(clock.inner.lock().wakeups.len(), 0); + + futures_timer::Delay::new(Duration::from_millis(100)).await; + + // Assignment is distributed only once from `approval-voting` + assert_matches!( + overseer_recv(&mut virtual_overseer).await, + AllMessages::ApprovalDistribution(ApprovalDistributionMessage::DistributeAssignment( + _, + c_indices, + )) => { + assert_eq!(c_indices, vec![candidate_index0, candidate_index1, candidate_index2].try_into().unwrap()); + } + ); + + // Candidate 0 + recover_available_data(&mut virtual_overseer).await; + fetch_validation_code(&mut virtual_overseer).await; + + // Candidate 1 + recover_available_data(&mut virtual_overseer).await; + fetch_validation_code(&mut virtual_overseer).await; + + // Candidate 2 + recover_available_data(&mut virtual_overseer).await; + fetch_validation_code(&mut virtual_overseer).await; + + // Check if assignment was triggered for candidate 0. + let candidate_entry = + store.load_candidate_entry(&candidate_receipt0.hash()).unwrap().unwrap(); + let our_assignment = + candidate_entry.approval_entry(&block_hash).unwrap().our_assignment().unwrap(); + assert!(our_assignment.triggered()); + + // Check if assignment was triggered for candidate 1. + let candidate_entry = + store.load_candidate_entry(&candidate_receipt1.hash()).unwrap().unwrap(); + let our_assignment = + candidate_entry.approval_entry(&block_hash).unwrap().our_assignment().unwrap(); + assert!(our_assignment.triggered()); + + // Check if assignment was triggered for candidate 2. + let candidate_entry = + store.load_candidate_entry(&candidate_receipt2.hash()).unwrap().unwrap(); + let our_assignment = + candidate_entry.approval_entry(&block_hash).unwrap().our_assignment().unwrap(); + assert!(our_assignment.triggered()); + + virtual_overseer + }); +} + fn approved_ancestor_test( skip_approval: impl Fn(BlockNumber) -> bool, approved_height: BlockNumber, @@ -2445,6 +2696,7 @@ fn approved_ancestor_test( slot: Slot::from(i as u64), candidates: Some(vec![(candidate_receipt, CoreIndex(0), GroupIndex(0))]), session_info: None, + end_syncing: false, }, ); } @@ -2623,13 +2875,19 @@ fn subsystem_validate_approvals_cache() { slot, candidates: candidates.clone(), session_info: Some(session_info.clone()), + end_syncing: false, }, ) .add_block( fork_block_hash, ChainBuilder::GENESIS_HASH, 1, - BlockConfig { slot, candidates, session_info: Some(session_info) }, + BlockConfig { + slot, + candidates, + session_info: Some(session_info), + end_syncing: false, + }, ) .build(&mut virtual_overseer) .await; @@ -2740,6 +2998,7 @@ fn subsystem_doesnt_distribute_duplicate_compact_assignments() { (candidate_receipt2.clone(), CoreIndex(1), GroupIndex(1)), ]), session_info: None, + end_syncing: false, }, ) .build(&mut virtual_overseer) @@ -2997,6 +3256,7 @@ where slot, candidates: Some(vec![(candidate_receipt, CoreIndex(0), GroupIndex(2))]), session_info: Some(session_info), + end_syncing: false, }, ) .build(&mut virtual_overseer) @@ -3061,7 +3321,7 @@ where // starting configuration. The relevant ticks (all scheduled wakeups) are printed after no further // ticks are scheduled. To create a valid test, a prefix of the relevant ticks should be included // in the final test configuration, ending at the tick with the desired inputs to -// should_trigger_assignemnt. +// should_trigger_assignment. async fn step_until_done(clock: &MockClock) { let mut relevant_ticks = Vec::new(); loop { @@ -3314,6 +3574,7 @@ fn pre_covers_dont_stall_approval() { slot, candidates: Some(vec![(candidate_descriptor, CoreIndex(0), GroupIndex(0))]), session_info: Some(session_info), + end_syncing: false, }, ); builder.build(&mut virtual_overseer).await; @@ -3491,6 +3752,7 @@ fn waits_until_approving_assignments_are_old_enough() { slot, candidates: Some(vec![(candidate_descriptor, CoreIndex(0), GroupIndex(0))]), session_info: Some(session_info), + end_syncing: false, }, ); builder.build(&mut virtual_overseer).await; @@ -3705,6 +3967,7 @@ fn test_approval_is_sent_on_max_approval_coalesce_count() { slot, candidates: candidates.clone(), session_info: Some(session_info.clone()), + end_syncing: false, }, ) .build(&mut virtual_overseer) @@ -3741,7 +4004,7 @@ fn test_approval_is_sent_on_max_approval_coalesce_count() { async fn handle_approval_on_max_coalesce_count( virtual_overseer: &mut VirtualOverseer, - candidate_indicies: Vec, + candidate_indices: Vec, ) { assert_matches!( overseer_recv(virtual_overseer).await, @@ -3749,16 +4012,16 @@ async fn handle_approval_on_max_coalesce_count( _, c_indices, )) => { - assert_eq!(TryInto::::try_into(candidate_indicies.clone()).unwrap(), c_indices); + assert_eq!(TryInto::::try_into(candidate_indices.clone()).unwrap(), c_indices); } ); - for _ in &candidate_indicies { + for _ in &candidate_indices { recover_available_data(virtual_overseer).await; fetch_validation_code(virtual_overseer).await; } - for _ in &candidate_indicies { + for _ in &candidate_indices { assert_matches!( overseer_recv(virtual_overseer).await, AllMessages::CandidateValidation(CandidateValidationMessage::ValidateFromExhaustive{exec_kind, response_sender, ..}) if exec_kind == PvfExecKind::Approval => { @@ -3789,7 +4052,7 @@ async fn handle_approval_on_max_coalesce_count( assert_matches!( overseer_recv(virtual_overseer).await, AllMessages::ApprovalDistribution(ApprovalDistributionMessage::DistributeApproval(vote)) => { - assert_eq!(TryInto::::try_into(candidate_indicies).unwrap(), vote.candidate_indices); + assert_eq!(TryInto::::try_into(candidate_indices).unwrap(), vote.candidate_indices); } ); @@ -3799,7 +4062,7 @@ async fn handle_approval_on_max_coalesce_count( async fn handle_approval_on_max_wait_time( virtual_overseer: &mut VirtualOverseer, - candidate_indicies: Vec, + candidate_indices: Vec, clock: Box, ) { const TICK_NOW_BEGIN: u64 = 1; @@ -3813,16 +4076,16 @@ async fn handle_approval_on_max_wait_time( _, c_indices, )) => { - assert_eq!(TryInto::::try_into(candidate_indicies.clone()).unwrap(), c_indices); + assert_eq!(TryInto::::try_into(candidate_indices.clone()).unwrap(), c_indices); } ); - for _ in &candidate_indicies { + for _ in &candidate_indices { recover_available_data(virtual_overseer).await; fetch_validation_code(virtual_overseer).await; } - for _ in &candidate_indicies { + for _ in &candidate_indices { assert_matches!( overseer_recv(virtual_overseer).await, AllMessages::CandidateValidation(CandidateValidationMessage::ValidateFromExhaustive{exec_kind, response_sender, ..}) if exec_kind == PvfExecKind::Approval => { @@ -3882,7 +4145,7 @@ async fn handle_approval_on_max_wait_time( assert_matches!( overseer_recv(virtual_overseer).await, AllMessages::ApprovalDistribution(ApprovalDistributionMessage::DistributeApproval(vote)) => { - assert_eq!(TryInto::::try_into(candidate_indicies).unwrap(), vote.candidate_indices); + assert_eq!(TryInto::::try_into(candidate_indices).unwrap(), vote.candidate_indices); } ); @@ -3943,8 +4206,7 @@ fn test_approval_is_sent_on_max_approval_coalesce_wait() { let store = config.backend(); test_harness(config, |test_harness| async move { - let TestHarness { mut virtual_overseer, clock, sync_oracle_handle: _sync_oracle_handle } = - test_harness; + let TestHarness { mut virtual_overseer, clock, sync_oracle_handle: _ } = test_harness; assert_matches!( overseer_recv(&mut virtual_overseer).await, @@ -4006,6 +4268,7 @@ fn test_approval_is_sent_on_max_approval_coalesce_wait() { slot, candidates: candidates.clone(), session_info: Some(session_info.clone()), + end_syncing: false, }, ) .build(&mut virtual_overseer) @@ -4040,3 +4303,569 @@ fn test_approval_is_sent_on_max_approval_coalesce_wait() { virtual_overseer }); } + +// Builds a chain with a fork where both relay blocks include the same candidate. +async fn build_chain_with_two_blocks_with_one_candidate_each( + block_hash1: Hash, + block_hash2: Hash, + slot: Slot, + sync_oracle_handle: TestSyncOracleHandle, + candidate_receipt: CandidateReceipt, +) -> (ChainBuilder, SessionInfo) { + let validators = vec![ + Sr25519Keyring::Alice, + Sr25519Keyring::Bob, + Sr25519Keyring::Charlie, + Sr25519Keyring::Dave, + Sr25519Keyring::Eve, + ]; + let session_info = SessionInfo { + validator_groups: IndexedVec::>::from(vec![ + vec![ValidatorIndex(0), ValidatorIndex(1)], + vec![ValidatorIndex(2)], + vec![ValidatorIndex(3), ValidatorIndex(4)], + ]), + ..session_info(&validators) + }; + + let candidates = Some(vec![(candidate_receipt.clone(), CoreIndex(0), GroupIndex(0))]); + let mut chain_builder = ChainBuilder::new(); + + chain_builder + .major_syncing(sync_oracle_handle.is_major_syncing.clone()) + .add_block( + block_hash1, + ChainBuilder::GENESIS_HASH, + 1, + BlockConfig { + slot, + candidates: candidates.clone(), + session_info: Some(session_info.clone()), + end_syncing: false, + }, + ) + .add_block( + block_hash2, + ChainBuilder::GENESIS_HASH, + 1, + BlockConfig { + slot, + candidates, + session_info: Some(session_info.clone()), + end_syncing: true, + }, + ); + (chain_builder, session_info) +} + +async fn setup_overseer_with_two_blocks_each_with_one_assignment_triggered( + virtual_overseer: &mut VirtualOverseer, + store: TestStore, + clock: &Box, + sync_oracle_handle: TestSyncOracleHandle, +) { + assert_matches!( + overseer_recv(virtual_overseer).await, + AllMessages::ChainApi(ChainApiMessage::FinalizedBlockNumber(rx)) => { + rx.send(Ok(0)).unwrap(); + } + ); + + let block_hash = Hash::repeat_byte(0x01); + let fork_block_hash = Hash::repeat_byte(0x02); + let candidate_commitments = CandidateCommitments::default(); + let mut candidate_receipt = dummy_candidate_receipt(block_hash); + candidate_receipt.commitments_hash = candidate_commitments.hash(); + let candidate_hash = candidate_receipt.hash(); + let slot = Slot::from(1); + let (chain_builder, _session_info) = build_chain_with_two_blocks_with_one_candidate_each( + block_hash, + fork_block_hash, + slot, + sync_oracle_handle, + candidate_receipt, + ) + .await; + chain_builder.build(virtual_overseer).await; + + assert!(!clock.inner.lock().current_wakeup_is(1)); + clock.inner.lock().wakeup_all(1); + + assert!(clock.inner.lock().current_wakeup_is(slot_to_tick(slot))); + clock.inner.lock().wakeup_all(slot_to_tick(slot)); + + futures_timer::Delay::new(Duration::from_millis(200)).await; + + clock.inner.lock().wakeup_all(slot_to_tick(slot + 2)); + + assert_eq!(clock.inner.lock().wakeups.len(), 0); + + futures_timer::Delay::new(Duration::from_millis(200)).await; + + let candidate_entry = store.load_candidate_entry(&candidate_hash).unwrap().unwrap(); + let our_assignment = + candidate_entry.approval_entry(&block_hash).unwrap().our_assignment().unwrap(); + assert!(our_assignment.triggered()); +} + +// Tests that for candidates that we did not approve yet, for which we triggered the assignment and +// the approval work we restart the work to approve it. +#[test] +fn subsystem_relaunches_approval_work_on_restart() { + let assignment_criteria = Box::new(MockAssignmentCriteria( + || { + let mut assignments = HashMap::new(); + let _ = assignments.insert( + CoreIndex(0), + approval_db::v2::OurAssignment { + cert: garbage_assignment_cert(AssignmentCertKind::RelayVRFModulo { sample: 0 }) + .into(), + tranche: 0, + validator_index: ValidatorIndex(0), + triggered: false, + } + .into(), + ); + + let _ = assignments.insert( + CoreIndex(0), + approval_db::v2::OurAssignment { + cert: garbage_assignment_cert_v2(AssignmentCertKindV2::RelayVRFModuloCompact { + core_bitfield: vec![CoreIndex(0), CoreIndex(1), CoreIndex(2)] + .try_into() + .unwrap(), + }), + tranche: 0, + validator_index: ValidatorIndex(0), + triggered: false, + } + .into(), + ); + assignments + }, + |_| Ok(0), + )); + let config = HarnessConfigBuilder::default().assignment_criteria(assignment_criteria).build(); + let store = config.backend(); + let store_clone = config.backend(); + + test_harness(config, |test_harness| async move { + let TestHarness { mut virtual_overseer, clock, sync_oracle_handle } = test_harness; + + setup_overseer_with_two_blocks_each_with_one_assignment_triggered( + &mut virtual_overseer, + store, + &clock, + sync_oracle_handle, + ) + .await; + + assert_matches!( + overseer_recv(&mut virtual_overseer).await, + AllMessages::ApprovalDistribution(ApprovalDistributionMessage::DistributeAssignment( + _, + _, + )) => { + } + ); + + recover_available_data(&mut virtual_overseer).await; + fetch_validation_code(&mut virtual_overseer).await; + + assert_matches!( + overseer_recv(&mut virtual_overseer).await, + AllMessages::ApprovalDistribution(ApprovalDistributionMessage::DistributeAssignment( + _, + _ + )) => { + } + ); + + // Bail early after the assignment has been distributed but before we answer with the mocked + // approval from CandidateValidation. + virtual_overseer + }); + + // Restart a new approval voting subsystem with the same database and major syncing true until + // the last leaf. + let config = HarnessConfigBuilder::default().backend(store_clone).major_syncing(true).build(); + + test_harness(config, |test_harness| async move { + let TestHarness { mut virtual_overseer, clock, sync_oracle_handle } = test_harness; + + assert_matches!( + overseer_recv(&mut virtual_overseer).await, + AllMessages::ChainApi(ChainApiMessage::FinalizedBlockNumber(rx)) => { + rx.send(Ok(0)).unwrap(); + } + ); + + let block_hash = Hash::repeat_byte(0x01); + let fork_block_hash = Hash::repeat_byte(0x02); + let candidate_commitments = CandidateCommitments::default(); + let mut candidate_receipt = dummy_candidate_receipt(block_hash); + candidate_receipt.commitments_hash = candidate_commitments.hash(); + let slot = Slot::from(1); + clock.inner.lock().set_tick(slot_to_tick(slot + 2)); + let (chain_builder, session_info) = build_chain_with_two_blocks_with_one_candidate_each( + block_hash, + fork_block_hash, + slot, + sync_oracle_handle, + candidate_receipt, + ) + .await; + + chain_builder.build(&mut virtual_overseer).await; + + futures_timer::Delay::new(Duration::from_millis(2000)).await; + + assert_matches!( + overseer_recv(&mut virtual_overseer).await, + AllMessages::RuntimeApi( + RuntimeApiMessage::Request( + _, + RuntimeApiRequest::SessionInfo(_, si_tx), + ) + ) => { + si_tx.send(Ok(Some(session_info.clone()))).unwrap(); + } + ); + assert_matches!( + overseer_recv(&mut virtual_overseer).await, + AllMessages::RuntimeApi( + RuntimeApiMessage::Request( + _, + RuntimeApiRequest::SessionExecutorParams(_, si_tx), + ) + ) => { + // Make sure all SessionExecutorParams calls are not made for the leaf (but for its relay parent) + si_tx.send(Ok(Some(ExecutorParams::default()))).unwrap(); + } + ); + + assert_matches!( + overseer_recv(&mut virtual_overseer).await, + AllMessages::RuntimeApi( + RuntimeApiMessage::Request(_, RuntimeApiRequest::NodeFeatures(_, si_tx), ) + ) => { + si_tx.send(Ok(NodeFeatures::EMPTY)).unwrap(); + } + ); + + // On major syncing ending Approval voting should send all the necessary messages for a + // candidate to be approved. + assert_matches!( + overseer_recv(&mut virtual_overseer).await, + AllMessages::ApprovalDistribution(ApprovalDistributionMessage::NewBlocks( + _, + )) => { + } + ); + + assert_matches!( + overseer_recv(&mut virtual_overseer).await, + AllMessages::ApprovalDistribution(ApprovalDistributionMessage::DistributeAssignment( + _, + _, + )) => { + } + ); + + assert_matches!( + overseer_recv(&mut virtual_overseer).await, + AllMessages::ApprovalDistribution(ApprovalDistributionMessage::DistributeAssignment( + _, + _, + )) => { + } + ); + + // Guarantees the approval work has been relaunched. + recover_available_data(&mut virtual_overseer).await; + fetch_validation_code(&mut virtual_overseer).await; + + assert_matches!( + overseer_recv(&mut virtual_overseer).await, + AllMessages::CandidateValidation(CandidateValidationMessage::ValidateFromExhaustive { + exec_kind, + response_sender, + .. + }) if exec_kind == PvfExecKind::Approval => { + response_sender.send(Ok(ValidationResult::Valid(Default::default(), Default::default()))) + .unwrap(); + } + ); + + assert_matches!( + overseer_recv(&mut virtual_overseer).await, + AllMessages::RuntimeApi(RuntimeApiMessage::Request(_, RuntimeApiRequest::ApprovalVotingParams(_, sender))) => { + let _ = sender.send(Ok(ApprovalVotingParams { + max_approval_coalesce_count: 1, + })); + } + ); + + assert_matches!( + overseer_recv(&mut virtual_overseer).await, + AllMessages::ApprovalDistribution(ApprovalDistributionMessage::DistributeApproval(_)) + ); + + assert_matches!( + overseer_recv(&mut virtual_overseer).await, + AllMessages::RuntimeApi(RuntimeApiMessage::Request(_, RuntimeApiRequest::ApprovalVotingParams(_, sender))) => { + let _ = sender.send(Ok(ApprovalVotingParams { + max_approval_coalesce_count: 1, + })); + } + ); + + assert_matches!( + overseer_recv(&mut virtual_overseer).await, + AllMessages::ApprovalDistribution(ApprovalDistributionMessage::DistributeApproval(_)) + ); + + // Assert that there are no more messages being sent by the subsystem + assert!(overseer_recv(&mut virtual_overseer).timeout(TIMEOUT / 2).await.is_none()); + + virtual_overseer + }); +} + +// Test that cached approvals, which are candidates that we approved but we didn't issue +// the signature yet because we want to coalesce it with more candidate are sent after restart. +#[test] +fn subsystem_sends_pending_approvals_on_approval_restart() { + let assignment_criteria = Box::new(MockAssignmentCriteria( + || { + let mut assignments = HashMap::new(); + let _ = assignments.insert( + CoreIndex(0), + approval_db::v2::OurAssignment { + cert: garbage_assignment_cert(AssignmentCertKind::RelayVRFModulo { sample: 0 }) + .into(), + tranche: 0, + validator_index: ValidatorIndex(0), + triggered: false, + } + .into(), + ); + + let _ = assignments.insert( + CoreIndex(0), + approval_db::v2::OurAssignment { + cert: garbage_assignment_cert_v2(AssignmentCertKindV2::RelayVRFModuloCompact { + core_bitfield: vec![CoreIndex(0), CoreIndex(1), CoreIndex(2)] + .try_into() + .unwrap(), + }), + tranche: 0, + validator_index: ValidatorIndex(0), + triggered: false, + } + .into(), + ); + assignments + }, + |_| Ok(0), + )); + let config = HarnessConfigBuilder::default().assignment_criteria(assignment_criteria).build(); + let store = config.backend(); + let store_clone = config.backend(); + + test_harness(config, |test_harness| async move { + let TestHarness { mut virtual_overseer, clock, sync_oracle_handle } = test_harness; + + setup_overseer_with_two_blocks_each_with_one_assignment_triggered( + &mut virtual_overseer, + store, + &clock, + sync_oracle_handle, + ) + .await; + + assert_matches!( + overseer_recv(&mut virtual_overseer).await, + AllMessages::ApprovalDistribution(ApprovalDistributionMessage::DistributeAssignment( + _, + _, + )) => { + } + ); + + recover_available_data(&mut virtual_overseer).await; + fetch_validation_code(&mut virtual_overseer).await; + + assert_matches!( + overseer_recv(&mut virtual_overseer).await, + AllMessages::ApprovalDistribution(ApprovalDistributionMessage::DistributeAssignment( + _, + _ + )) => { + } + ); + + assert_matches!( + overseer_recv(&mut virtual_overseer).await, + AllMessages::CandidateValidation(CandidateValidationMessage::ValidateFromExhaustive { + exec_kind, + response_sender, + .. + }) if exec_kind == PvfExecKind::Approval => { + response_sender.send(Ok(ValidationResult::Valid(Default::default(), Default::default()))) + .unwrap(); + } + ); + + // Configure a big coalesce number, so that the signature is cached instead of being sent to + // approval-distribution. + assert_matches!( + overseer_recv(&mut virtual_overseer).await, + AllMessages::RuntimeApi(RuntimeApiMessage::Request(_, RuntimeApiRequest::ApprovalVotingParams(_, sender))) => { + let _ = sender.send(Ok(ApprovalVotingParams { + max_approval_coalesce_count: 6, + })); + } + ); + + assert_matches!( + overseer_recv(&mut virtual_overseer).await, + AllMessages::RuntimeApi(RuntimeApiMessage::Request(_, RuntimeApiRequest::ApprovalVotingParams(_, sender))) => { + let _ = sender.send(Ok(ApprovalVotingParams { + max_approval_coalesce_count: 6, + })); + } + ); + + // Assert that there are no more messages being sent by the subsystem + assert!(overseer_recv(&mut virtual_overseer).timeout(TIMEOUT / 2).await.is_none()); + + virtual_overseer + }); + + let config = HarnessConfigBuilder::default().backend(store_clone).major_syncing(true).build(); + // On restart signatures should be sent to approval-distribution without relaunching the + // approval work. + test_harness(config, |test_harness| async move { + let TestHarness { mut virtual_overseer, clock, sync_oracle_handle } = test_harness; + + assert_matches!( + overseer_recv(&mut virtual_overseer).await, + AllMessages::ChainApi(ChainApiMessage::FinalizedBlockNumber(rx)) => { + rx.send(Ok(0)).unwrap(); + } + ); + + let block_hash = Hash::repeat_byte(0x01); + let fork_block_hash = Hash::repeat_byte(0x02); + let candidate_commitments = CandidateCommitments::default(); + let mut candidate_receipt = dummy_candidate_receipt(block_hash); + candidate_receipt.commitments_hash = candidate_commitments.hash(); + let slot = Slot::from(1); + + clock.inner.lock().set_tick(slot_to_tick(slot + 2)); + let (chain_builder, session_info) = build_chain_with_two_blocks_with_one_candidate_each( + block_hash, + fork_block_hash, + slot, + sync_oracle_handle, + candidate_receipt, + ) + .await; + chain_builder.build(&mut virtual_overseer).await; + + futures_timer::Delay::new(Duration::from_millis(2000)).await; + + assert_matches!( + overseer_recv(&mut virtual_overseer).await, + AllMessages::ApprovalDistribution(ApprovalDistributionMessage::NewBlocks( + _, + )) => { + } + ); + + assert_matches!( + overseer_recv(&mut virtual_overseer).await, + AllMessages::ApprovalDistribution(ApprovalDistributionMessage::DistributeAssignment( + _, + _, + )) => { + } + ); + + assert_matches!( + overseer_recv(&mut virtual_overseer).await, + AllMessages::ApprovalDistribution(ApprovalDistributionMessage::DistributeAssignment( + _, + _, + )) => { + } + ); + + assert_matches!( + overseer_recv(&mut virtual_overseer).await, + AllMessages::RuntimeApi(RuntimeApiMessage::Request(_, RuntimeApiRequest::ApprovalVotingParams(_, sender))) => { + let _ = sender.send(Ok(ApprovalVotingParams { + max_approval_coalesce_count: 1, + })); + } + ); + + assert_matches!( + overseer_recv(&mut virtual_overseer).await, + AllMessages::RuntimeApi( + RuntimeApiMessage::Request( + _, + RuntimeApiRequest::SessionInfo(_, si_tx), + ) + ) => { + si_tx.send(Ok(Some(session_info.clone()))).unwrap(); + } + ); + assert_matches!( + overseer_recv(&mut virtual_overseer).await, + AllMessages::RuntimeApi( + RuntimeApiMessage::Request( + _, + RuntimeApiRequest::SessionExecutorParams(_, si_tx), + ) + ) => { + // Make sure all SessionExecutorParams calls are not made for the leaf (but for its relay parent) + si_tx.send(Ok(Some(ExecutorParams::default()))).unwrap(); + } + ); + + assert_matches!( + overseer_recv(&mut virtual_overseer).await, + AllMessages::RuntimeApi( + RuntimeApiMessage::Request(_, RuntimeApiRequest::NodeFeatures(_, si_tx), ) + ) => { + si_tx.send(Ok(NodeFeatures::EMPTY)).unwrap(); + } + ); + + assert_matches!( + overseer_recv(&mut virtual_overseer).await, + AllMessages::ApprovalDistribution(ApprovalDistributionMessage::DistributeApproval(_)) + ); + + assert_matches!( + overseer_recv(&mut virtual_overseer).await, + AllMessages::RuntimeApi(RuntimeApiMessage::Request(_, RuntimeApiRequest::ApprovalVotingParams(_, sender))) => { + let _ = sender.send(Ok(ApprovalVotingParams { + max_approval_coalesce_count: 1, + })); + } + ); + + assert_matches!( + overseer_recv(&mut virtual_overseer).await, + AllMessages::ApprovalDistribution(ApprovalDistributionMessage::DistributeApproval(_)) + ); + + // Assert that there are no more messages being sent by the subsystem + assert!(overseer_recv(&mut virtual_overseer).timeout(TIMEOUT / 2).await.is_none()); + + virtual_overseer + }); +} diff --git a/polkadot/node/core/approval-voting/src/time.rs b/polkadot/node/core/approval-voting/src/time.rs index 99dfbe07678f2f0956565e92ffaf196b6f482af9..5c3e7e85a17a212eeae2e8b6b9b7cf6dbecde036 100644 --- a/polkadot/node/core/approval-voting/src/time.rs +++ b/polkadot/node/core/approval-voting/src/time.rs @@ -126,13 +126,13 @@ impl DelayedApprovalTimer { /// no additional timer is started. pub(crate) fn maybe_arm_timer( &mut self, - wait_untill: Tick, + wait_until: Tick, clock: &dyn Clock, block_hash: Hash, validator_index: ValidatorIndex, ) { if self.blocks.insert(block_hash) { - let clock_wait = clock.wait(wait_untill); + let clock_wait = clock.wait(wait_until); self.timers.push(Box::pin(async move { clock_wait.await; (block_hash, validator_index) diff --git a/polkadot/node/core/av-store/Cargo.toml b/polkadot/node/core/av-store/Cargo.toml index 68769fb8cc8a66b94d52251d1e203555e900f43f..bc9b979228a1db8c4adfc01bd2d60470721bfcac 100644 --- a/polkadot/node/core/av-store/Cargo.toml +++ b/polkadot/node/core/av-store/Cargo.toml @@ -10,10 +10,10 @@ license.workspace = true workspace = true [dependencies] -futures = "0.3.21" +futures = "0.3.30" futures-timer = "3.0.2" kvdb = "0.13.0" -thiserror = "1.0.48" +thiserror = { workspace = true } gum = { package = "tracing-gum", path = "../../gum" } bitvec = "1.0.0" @@ -28,8 +28,8 @@ sp-consensus = { path = "../../../../substrate/primitives/consensus/common", def polkadot-node-jaeger = { path = "../../jaeger" } [dev-dependencies] -log = "0.4.17" -env_logger = "0.9.0" +log = { workspace = true, default-features = true } +env_logger = "0.11" assert_matches = "1.4.0" kvdb-memorydb = "0.13.0" diff --git a/polkadot/node/core/av-store/src/lib.rs b/polkadot/node/core/av-store/src/lib.rs index ef7dcecac0755084efbba839d12b532ff0f336cb..68db4686a9740bb052f7d05031d148cd5b05e0a2 100644 --- a/polkadot/node/core/av-store/src/lib.rs +++ b/polkadot/node/core/av-store/src/lib.rs @@ -1218,7 +1218,7 @@ fn process_message( // tx channel is dropped and that error is caught by the caller subsystem. // // We bubble up the specific error here so `av-store` logs still tell what - // happend. + // happened. return Err(e.into()) }, } diff --git a/polkadot/node/core/backing/Cargo.toml b/polkadot/node/core/backing/Cargo.toml index 1c69fc441b3284d1790e03f6896b67e71f32aae3..26fa54470fbda6c1e5a22999a34022173b003fe6 100644 --- a/polkadot/node/core/backing/Cargo.toml +++ b/polkadot/node/core/backing/Cargo.toml @@ -10,7 +10,7 @@ description = "The Candidate Backing Subsystem. Tracks parachain candidates that workspace = true [dependencies] -futures = "0.3.21" +futures = "0.3.30" sp-keystore = { path = "../../../../substrate/primitives/keystore" } polkadot-primitives = { path = "../../../primitives" } polkadot-node-primitives = { path = "../../primitives" } @@ -20,8 +20,9 @@ erasure-coding = { package = "polkadot-erasure-coding", path = "../../../erasure statement-table = { package = "polkadot-statement-table", path = "../../../statement-table" } bitvec = { version = "1.0.0", default-features = false, features = ["alloc"] } gum = { package = "tracing-gum", path = "../../gum" } -thiserror = "1.0.48" +thiserror = { workspace = true } fatality = "0.0.6" +schnellru = "0.2.1" [dev-dependencies] sp-core = { path = "../../../../substrate/primitives/core" } @@ -29,7 +30,8 @@ sp-application-crypto = { path = "../../../../substrate/primitives/application-c sp-keyring = { path = "../../../../substrate/primitives/keyring" } sc-keystore = { path = "../../../../substrate/client/keystore" } sp-tracing = { path = "../../../../substrate/primitives/tracing" } -futures = { version = "0.3.21", features = ["thread-pool"] } +futures = { version = "0.3.30", features = ["thread-pool"] } assert_matches = "1.4.0" +rstest = "0.18.2" polkadot-node-subsystem-test-helpers = { path = "../../subsystem-test-helpers" } test-helpers = { package = "polkadot-primitives-test-helpers", path = "../../../primitives/test-helpers" } diff --git a/polkadot/node/core/backing/src/error.rs b/polkadot/node/core/backing/src/error.rs index 1b00a62510b7c634b3135a56ca6412c0948ef6a0..52684f3fe3063e95dcab48947cf86ca62c321372 100644 --- a/polkadot/node/core/backing/src/error.rs +++ b/polkadot/node/core/backing/src/error.rs @@ -14,6 +14,8 @@ // You should have received a copy of the GNU General Public License // along with Polkadot. If not, see . +use std::collections::HashMap; + use fatality::Nested; use futures::channel::{mpsc, oneshot}; @@ -24,7 +26,7 @@ use polkadot_node_subsystem::{ use polkadot_node_subsystem_util::{runtime, Error as UtilError}; use polkadot_primitives::{BackedCandidate, ValidationCodeHash}; -use crate::LOG_TARGET; +use crate::{ParaId, LOG_TARGET}; pub type Result = std::result::Result; pub type FatalResult = std::result::Result; @@ -48,11 +50,14 @@ pub enum Error { #[error("Candidate is not found")] CandidateNotFound, + #[error("CoreIndex cannot be determined for a candidate")] + CoreIndexUnavailable, + #[error("Signature is invalid")] InvalidSignature, #[error("Failed to send candidates {0:?}")] - Send(Vec), + Send(HashMap>), #[error("FetchPoV failed")] FetchPoV, diff --git a/polkadot/node/core/backing/src/lib.rs b/polkadot/node/core/backing/src/lib.rs index 98bbd6232add4d893293fc948c0a99bba8d46bf3..23acb0450944e8eedea437da545830174ed84449 100644 --- a/polkadot/node/core/backing/src/lib.rs +++ b/polkadot/node/core/backing/src/lib.rs @@ -77,6 +77,7 @@ use futures::{ stream::FuturesOrdered, FutureExt, SinkExt, StreamExt, TryFutureExt, }; +use schnellru::{ByLength, LruMap}; use error::{Error, FatalResult}; use polkadot_node_primitives::{ @@ -104,10 +105,11 @@ use polkadot_node_subsystem_util::{ Validator, }; use polkadot_primitives::{ - BackedCandidate, CandidateCommitments, CandidateHash, CandidateReceipt, - CommittedCandidateReceipt, CoreIndex, CoreState, ExecutorParams, Hash, Id as ParaId, - PersistedValidationData, PvfExecKind, SigningContext, ValidationCode, ValidatorId, - ValidatorIndex, ValidatorSignature, ValidityAttestation, + node_features::FeatureIndex, BackedCandidate, CandidateCommitments, CandidateHash, + CandidateReceipt, CommittedCandidateReceipt, CoreIndex, CoreState, ExecutorParams, GroupIndex, + GroupRotationInfo, Hash, Id as ParaId, IndexedVec, NodeFeatures, PersistedValidationData, + PvfExecKind, SessionIndex, SigningContext, ValidationCode, ValidatorId, ValidatorIndex, + ValidatorSignature, ValidityAttestation, }; use sp_keystore::KeystorePtr; use statement_table::{ @@ -118,7 +120,7 @@ use statement_table::{ }, Config as TableConfig, Context as TableContextTrait, Table, }; -use util::vstaging::get_disabled_validators_with_fallback; +use util::{runtime::request_node_features, vstaging::get_disabled_validators_with_fallback}; mod error; @@ -209,7 +211,9 @@ struct PerRelayParentState { /// The hash of the relay parent on top of which this job is doing it's work. parent: Hash, /// The `ParaId` assigned to the local validator at this relay parent. - assignment: Option, + assigned_para: Option, + /// The `CoreIndex` assigned to the local validator at this relay parent. + assigned_core: Option, /// The candidates that are backed by enough validators in their group, by hash. backed: HashSet, /// The table of candidates and statements under this relay-parent. @@ -224,6 +228,15 @@ struct PerRelayParentState { fallbacks: HashMap, /// The minimum backing votes threshold. minimum_backing_votes: u32, + /// If true, we're appending extra bits in the BackedCandidate validator indices bitfield, + /// which represent the assigned core index. True if ElasticScalingMVP is enabled. + inject_core_index: bool, + /// The core states for all cores. + cores: Vec, + /// The validator index -> group mapping at this relay parent. + validator_to_group: Arc>>, + /// The associated group rotation information. + group_rotation_info: GroupRotationInfo, } struct PerCandidateState { @@ -275,7 +288,10 @@ struct State { /// This is guaranteed to have an entry for each candidate with a relay parent in the implicit /// or explicit view for which a `Seconded` statement has been successfully imported. per_candidate: HashMap, - /// A cloneable sender which is dispatched to background candidate validation tasks to inform + /// Cache the per-session Validator->Group mapping. + validator_to_group_cache: + LruMap>>>, + /// A clonable sender which is dispatched to background candidate validation tasks to inform /// the main task of the result. background_validation_tx: mpsc::Sender<(Hash, ValidatedCandidateCommand)>, /// The handle to the keystore used for signing. @@ -292,6 +308,7 @@ impl State { per_leaf: HashMap::default(), per_relay_parent: HashMap::default(), per_candidate: HashMap::new(), + validator_to_group_cache: LruMap::new(ByLength::new(2)), background_validation_tx, keystore, } @@ -379,10 +396,10 @@ struct AttestingData { backing: Vec, } -#[derive(Default)] +#[derive(Default, Debug)] struct TableContext { validator: Option, - groups: HashMap>, + groups: HashMap>, validators: Vec, disabled_validators: Vec, } @@ -404,7 +421,7 @@ impl TableContext { impl TableContextTrait for TableContext { type AuthorityId = ValidatorIndex; type Digest = CandidateHash; - type GroupId = ParaId; + type GroupId = CoreIndex; type Signature = ValidatorSignature; type Candidate = CommittedCandidateReceipt; @@ -412,15 +429,11 @@ impl TableContextTrait for TableContext { candidate.hash() } - fn candidate_group(candidate: &CommittedCandidateReceipt) -> ParaId { - candidate.descriptor().para_id + fn is_member_of(&self, authority: &ValidatorIndex, core: &CoreIndex) -> bool { + self.groups.get(core).map_or(false, |g| g.iter().any(|a| a == authority)) } - fn is_member_of(&self, authority: &ValidatorIndex, group: &ParaId) -> bool { - self.groups.get(group).map_or(false, |g| g.iter().any(|a| a == authority)) - } - - fn get_group_size(&self, group: &ParaId) -> Option { + fn get_group_size(&self, group: &CoreIndex) -> Option { self.groups.get(group).map(|g| g.len()) } } @@ -442,19 +455,20 @@ fn primitive_statement_to_table(s: &SignedFullStatementWithPVD) -> TableSignedSt fn table_attested_to_backed( attested: TableAttestedCandidate< - ParaId, + CoreIndex, CommittedCandidateReceipt, ValidatorIndex, ValidatorSignature, >, table_context: &TableContext, + inject_core_index: bool, ) -> Option { - let TableAttestedCandidate { candidate, validity_votes, group_id: para_id } = attested; + let TableAttestedCandidate { candidate, validity_votes, group_id: core_index } = attested; let (ids, validity_votes): (Vec<_>, Vec) = validity_votes.into_iter().map(|(id, vote)| (id, vote.into())).unzip(); - let group = table_context.groups.get(¶_id)?; + let group = table_context.groups.get(&core_index)?; let mut validator_indices = BitVec::with_capacity(group.len()); @@ -479,14 +493,15 @@ fn table_attested_to_backed( } vote_positions.sort_by_key(|(_orig, pos_in_group)| *pos_in_group); - Some(BackedCandidate { + Some(BackedCandidate::new( candidate, - validity_votes: vote_positions + vote_positions .into_iter() .map(|(pos_in_votes, _pos_in_group)| validity_votes[pos_in_votes].clone()) .collect(), validator_indices, - }) + inject_core_index.then_some(core_index), + )) } async fn store_available_data( @@ -895,7 +910,7 @@ async fn handle_active_leaves_update( } let mut seconded_at_depth = HashMap::new(); - if let Some(response) = membership_answers.next().await { + while let Some(response) = membership_answers.next().await { match response { Err(oneshot::Canceled) => { gum::warn!( @@ -971,7 +986,14 @@ async fn handle_active_leaves_update( // construct a `PerRelayParent` from the runtime API // and insert it. - let per = construct_per_relay_parent_state(ctx, maybe_new, &state.keystore, mode).await?; + let per = construct_per_relay_parent_state( + ctx, + maybe_new, + &state.keystore, + &mut state.validator_to_group_cache, + mode, + ) + .await?; if let Some(per) = per { state.per_relay_parent.insert(maybe_new, per); @@ -981,31 +1003,112 @@ async fn handle_active_leaves_update( Ok(()) } +macro_rules! try_runtime_api { + ($x: expr) => { + match $x { + Ok(x) => x, + Err(err) => { + // Only bubble up fatal errors. + error::log_error(Err(Into::::into(err).into()))?; + + // We can't do candidate validation work if we don't have the + // requisite runtime API data. But these errors should not take + // down the node. + return Ok(None) + }, + } + }; +} + +fn core_index_from_statement( + validator_to_group: &IndexedVec>, + group_rotation_info: &GroupRotationInfo, + cores: &[CoreState], + statement: &SignedFullStatementWithPVD, +) -> Option { + let compact_statement = statement.as_unchecked(); + let candidate_hash = CandidateHash(*compact_statement.unchecked_payload().candidate_hash()); + + let n_cores = cores.len(); + + gum::trace!( + target:LOG_TARGET, + ?group_rotation_info, + ?statement, + ?validator_to_group, + n_cores = ?cores.len(), + ?candidate_hash, + "Extracting core index from statement" + ); + + let statement_validator_index = statement.validator_index(); + let Some(Some(group_index)) = validator_to_group.get(statement_validator_index) else { + gum::debug!( + target: LOG_TARGET, + ?group_rotation_info, + ?statement, + ?validator_to_group, + n_cores = ?cores.len() , + ?candidate_hash, + "Invalid validator index: {:?}", + statement_validator_index + ); + return None + }; + + // First check if the statement para id matches the core assignment. + let core_index = group_rotation_info.core_for_group(*group_index, n_cores); + + if core_index.0 as usize > n_cores { + gum::warn!(target: LOG_TARGET, ?candidate_hash, ?core_index, n_cores, "Invalid CoreIndex"); + return None + } + + if let StatementWithPVD::Seconded(candidate, _pvd) = statement.payload() { + let candidate_para_id = candidate.descriptor.para_id; + let assigned_para_id = match &cores[core_index.0 as usize] { + CoreState::Free => { + gum::debug!(target: LOG_TARGET, ?candidate_hash, "Invalid CoreIndex, core is not assigned to any para_id"); + return None + }, + CoreState::Occupied(occupied) => + if let Some(next) = &occupied.next_up_on_available { + next.para_id + } else { + return None + }, + CoreState::Scheduled(scheduled) => scheduled.para_id, + }; + + if assigned_para_id != candidate_para_id { + gum::debug!( + target: LOG_TARGET, + ?candidate_hash, + ?core_index, + ?assigned_para_id, + ?candidate_para_id, + "Invalid CoreIndex, core is assigned to a different para_id" + ); + return None + } + return Some(core_index) + } else { + return Some(core_index) + } +} + /// Load the data necessary to do backing work on top of a relay-parent. #[overseer::contextbounds(CandidateBacking, prefix = self::overseer)] async fn construct_per_relay_parent_state( ctx: &mut Context, relay_parent: Hash, keystore: &KeystorePtr, + validator_to_group_cache: &mut LruMap< + SessionIndex, + Arc>>, + >, mode: ProspectiveParachainsMode, ) -> Result, Error> { - macro_rules! try_runtime_api { - ($x: expr) => { - match $x { - Ok(x) => x, - Err(err) => { - // Only bubble up fatal errors. - error::log_error(Err(Into::::into(err).into()))?; - - // We can't do candidate validation work if we don't have the - // requisite runtime API data. But these errors should not take - // down the node. - return Ok(None) - }, - } - }; - } - let parent = relay_parent; let (session_index, validators, groups, cores) = futures::try_join!( @@ -1020,6 +1123,16 @@ async fn construct_per_relay_parent_state( .map_err(Error::JoinMultiple)?; let session_index = try_runtime_api!(session_index); + + let inject_core_index = request_node_features(parent, session_index, ctx.sender()) + .await? + .unwrap_or(NodeFeatures::EMPTY) + .get(FeatureIndex::ElasticScalingMVP as usize) + .map(|b| *b) + .unwrap_or(false); + + gum::debug!(target: LOG_TARGET, inject_core_index, ?parent, "New state"); + let validators: Vec<_> = try_runtime_api!(validators); let (validator_groups, group_rotation_info) = try_runtime_api!(groups); let cores = try_runtime_api!(cores); @@ -1055,18 +1168,24 @@ async fn construct_per_relay_parent_state( }, }; - let mut groups = HashMap::new(); let n_cores = cores.len(); - let mut assignment = None; - for (idx, core) in cores.into_iter().enumerate() { + let mut groups = HashMap::>::new(); + let mut assigned_core = None; + let mut assigned_para = None; + + for (idx, core) in cores.iter().enumerate() { let core_para_id = match core { CoreState::Scheduled(scheduled) => scheduled.para_id, CoreState::Occupied(occupied) => if mode.is_enabled() { // Async backing makes it legal to build on top of // occupied core. - occupied.candidate_descriptor.para_id + if let Some(next) = &occupied.next_up_on_available { + next.para_id + } else { + continue + } } else { continue }, @@ -1077,11 +1196,27 @@ async fn construct_per_relay_parent_state( let group_index = group_rotation_info.group_for_core(core_index, n_cores); if let Some(g) = validator_groups.get(group_index.0 as usize) { if validator.as_ref().map_or(false, |v| g.contains(&v.index())) { - assignment = Some(core_para_id); + assigned_para = Some(core_para_id); + assigned_core = Some(core_index); } - groups.insert(core_para_id, g.clone()); + groups.insert(core_index, g.clone()); } } + gum::debug!(target: LOG_TARGET, ?groups, "TableContext"); + + let validator_to_group = validator_to_group_cache + .get_or_insert(session_index, || { + let mut vector = vec![None; validators.len()]; + + for (group_idx, validator_group) in validator_groups.iter().enumerate() { + for validator in validator_group { + vector[validator.0 as usize] = Some(GroupIndex(group_idx as u32)); + } + } + + Arc::new(IndexedVec::<_, _>::from(vector)) + }) + .expect("Just inserted"); let table_context = TableContext { validator, groups, validators, disabled_validators }; let table_config = TableConfig { @@ -1094,7 +1229,8 @@ async fn construct_per_relay_parent_state( Ok(Some(PerRelayParentState { prospective_parachains_mode: mode, parent, - assignment, + assigned_core, + assigned_para, backed: HashSet::new(), table: Table::new(table_config), table_context, @@ -1102,6 +1238,10 @@ async fn construct_per_relay_parent_state( awaiting_validation: HashSet::new(), fallbacks: HashMap::new(), minimum_backing_votes, + inject_core_index, + cores, + validator_to_group: validator_to_group.clone(), + group_rotation_info, })) } @@ -1519,15 +1659,16 @@ async fn import_statement( per_candidate: &mut HashMap, statement: &SignedFullStatementWithPVD, ) -> Result, Error> { + let candidate_hash = statement.payload().candidate_hash(); + gum::debug!( target: LOG_TARGET, statement = ?statement.payload().to_compact(), validator_index = statement.validator_index().0, + ?candidate_hash, "Importing statement", ); - let candidate_hash = statement.payload().candidate_hash(); - // If this is a new candidate (statement is 'seconded' and candidate is unknown), // we need to create an entry in the `PerCandidateState` map. // @@ -1593,7 +1734,15 @@ async fn import_statement( let stmt = primitive_statement_to_table(statement); - Ok(rp_state.table.import_statement(&rp_state.table_context, stmt)) + let core = core_index_from_statement( + &rp_state.validator_to_group, + &rp_state.group_rotation_info, + &rp_state.cores, + statement, + ) + .ok_or(Error::CoreIndexUnavailable)?; + + Ok(rp_state.table.import_statement(&rp_state.table_context, core, stmt)) } /// Handles a summary received from [`import_statement`] and dispatches `Backed` notifications and @@ -1615,8 +1764,12 @@ async fn post_import_statement_actions( // `HashSet::insert` returns true if the thing wasn't in there already. if rp_state.backed.insert(candidate_hash) { - if let Some(backed) = table_attested_to_backed(attested, &rp_state.table_context) { - let para_id = backed.candidate.descriptor.para_id; + if let Some(backed) = table_attested_to_backed( + attested, + &rp_state.table_context, + rp_state.inject_core_index, + ) { + let para_id = backed.candidate().descriptor.para_id; gum::debug!( target: LOG_TARGET, candidate_hash = ?candidate_hash, @@ -1637,7 +1790,7 @@ async fn post_import_statement_actions( // notify collator protocol. ctx.send_message(CollatorProtocolMessage::Backed { para_id, - para_head: backed.candidate.descriptor.para_head, + para_head: backed.candidate().descriptor.para_head, }) .await; // Notify statement distribution of backed candidate. @@ -1654,8 +1807,14 @@ async fn post_import_statement_actions( ); ctx.send_unbounded_message(message); } + } else { + gum::debug!(target: LOG_TARGET, ?candidate_hash, "Cannot get BackedCandidate"); } + } else { + gum::debug!(target: LOG_TARGET, ?candidate_hash, "Candidate already known"); } + } else { + gum::debug!(target: LOG_TARGET, "No attested candidate"); } issue_new_misbehaviors(ctx, rp_state.parent, &mut rp_state.table); @@ -1722,18 +1881,20 @@ async fn background_validate_and_make_available( if rp_state.awaiting_validation.insert(candidate_hash) { // spawn background task. let bg = async move { - if let Err(e) = validate_and_make_available(params).await { - if let Error::BackgroundValidationMpsc(error) = e { + if let Err(error) = validate_and_make_available(params).await { + if let Error::BackgroundValidationMpsc(error) = error { gum::debug!( target: LOG_TARGET, + ?candidate_hash, ?error, "Mpsc background validation mpsc died during validation- leaf no longer active?" ); } else { gum::error!( target: LOG_TARGET, - "Failed to validate and make available: {:?}", - e + ?candidate_hash, + ?error, + "Failed to validate and make available", ); } } @@ -1859,9 +2020,10 @@ async fn maybe_validate_and_import( let candidate_hash = summary.candidate; - if Some(summary.group_id) != rp_state.assignment { + if Some(summary.group_id) != rp_state.assigned_core { return Ok(()) } + let attesting = match statement.payload() { StatementWithPVD::Seconded(receipt, _) => { let attesting = AttestingData { @@ -2004,10 +2166,11 @@ async fn handle_second_message( } // Sanity check that candidate is from our assignment. - if Some(candidate.descriptor().para_id) != rp_state.assignment { + if Some(candidate.descriptor().para_id) != rp_state.assigned_para { gum::debug!( target: LOG_TARGET, - our_assignment = ?rp_state.assignment, + our_assignment_core = ?rp_state.assigned_core, + our_assignment_para = ?rp_state.assigned_para, collation = ?candidate.descriptor().para_id, "Subsystem asked to second for para outside of our assignment", ); @@ -2015,6 +2178,14 @@ async fn handle_second_message( return Ok(()) } + gum::debug!( + target: LOG_TARGET, + our_assignment_core = ?rp_state.assigned_core, + our_assignment_para = ?rp_state.assigned_para, + collation = ?candidate.descriptor().para_id, + "Current assignments vs collation", + ); + // If the message is a `CandidateBackingMessage::Second`, sign and dispatch a // Seconded statement only if we have not signed a Valid statement for the requested candidate. // @@ -2059,15 +2230,16 @@ async fn handle_statement_message( fn handle_get_backed_candidates_message( state: &State, - requested_candidates: Vec<(CandidateHash, Hash)>, - tx: oneshot::Sender>, + requested_candidates: HashMap>, + tx: oneshot::Sender>>, metrics: &Metrics, ) -> Result<(), Error> { let _timer = metrics.time_get_backed_candidates(); - let backed = requested_candidates - .into_iter() - .filter_map(|(candidate_hash, relay_parent)| { + let mut backed = HashMap::with_capacity(requested_candidates.len()); + + for (para_id, para_candidates) in requested_candidates { + for (candidate_hash, relay_parent) in para_candidates.iter() { let rp_state = match state.per_relay_parent.get(&relay_parent) { Some(rp_state) => rp_state, None => { @@ -2077,19 +2249,34 @@ fn handle_get_backed_candidates_message( ?candidate_hash, "Requested candidate's relay parent is out of view", ); - return None + break }, }; - rp_state + let maybe_backed_candidate = rp_state .table .attested_candidate( - &candidate_hash, + candidate_hash, &rp_state.table_context, rp_state.minimum_backing_votes, ) - .and_then(|attested| table_attested_to_backed(attested, &rp_state.table_context)) - }) - .collect(); + .and_then(|attested| { + table_attested_to_backed( + attested, + &rp_state.table_context, + rp_state.inject_core_index, + ) + }); + + if let Some(backed_candidate) = maybe_backed_candidate { + backed + .entry(para_id) + .or_insert_with(|| Vec::with_capacity(para_candidates.len())) + .push(backed_candidate); + } else { + break + } + } + } tx.send(backed).map_err(|data| Error::Send(data))?; Ok(()) diff --git a/polkadot/node/core/backing/src/tests/mod.rs b/polkadot/node/core/backing/src/tests/mod.rs index 1957f4e19c54bd9845e5bb5bd03383985d9c9636..d1969e656db673b70b070c9b708bab867bec9fcb 100644 --- a/polkadot/node/core/backing/src/tests/mod.rs +++ b/polkadot/node/core/backing/src/tests/mod.rs @@ -33,9 +33,10 @@ use polkadot_node_subsystem::{ }; use polkadot_node_subsystem_test_helpers as test_helpers; use polkadot_primitives::{ - CandidateDescriptor, GroupRotationInfo, HeadData, PersistedValidationData, PvfExecKind, - ScheduledCore, SessionIndex, LEGACY_MIN_BACKING_VOTES, + node_features, CandidateDescriptor, GroupRotationInfo, HeadData, PersistedValidationData, + PvfExecKind, ScheduledCore, SessionIndex, LEGACY_MIN_BACKING_VOTES, }; +use rstest::rstest; use sp_application_crypto::AppCrypto; use sp_keyring::Sr25519Keyring; use sp_keystore::Keystore; @@ -65,19 +66,21 @@ fn dummy_pvd() -> PersistedValidationData { } } -struct TestState { +pub(crate) struct TestState { chain_ids: Vec, keystore: KeystorePtr, validators: Vec, validator_public: Vec, validation_data: PersistedValidationData, validator_groups: (Vec>, GroupRotationInfo), + validator_to_group: IndexedVec>, availability_cores: Vec, head_data: HashMap, signing_context: SigningContext, relay_parent: Hash, minimum_backing_votes: u32, disabled_validators: Vec, + node_features: NodeFeatures, } impl TestState { @@ -114,6 +117,11 @@ impl Default for TestState { .into_iter() .map(|g| g.into_iter().map(ValidatorIndex).collect()) .collect(); + let validator_to_group: IndexedVec<_, _> = + vec![Some(0), Some(1), Some(0), Some(0), None, Some(0)] + .into_iter() + .map(|x| x.map(|x| GroupIndex(x))) + .collect(); let group_rotation_info = GroupRotationInfo { session_start_block: 0, group_rotation_frequency: 100, now: 1 }; @@ -143,6 +151,7 @@ impl Default for TestState { validators, validator_public, validator_groups: (validator_groups, group_rotation_info), + validator_to_group, availability_cores, head_data, validation_data, @@ -150,6 +159,7 @@ impl Default for TestState { relay_parent, minimum_backing_votes: LEGACY_MIN_BACKING_VOTES, disabled_validators: Vec::new(), + node_features: Default::default(), } } } @@ -285,6 +295,16 @@ async fn test_startup(virtual_overseer: &mut VirtualOverseer, test_state: &TestS } ); + // Node features request from runtime: all features are disabled. + assert_matches!( + virtual_overseer.recv().await, + AllMessages::RuntimeApi( + RuntimeApiMessage::Request(_parent, RuntimeApiRequest::NodeFeatures(_session_index, tx)) + ) => { + tx.send(Ok(test_state.node_features.clone())).unwrap(); + } + ); + // Check if subsystem job issues a request for the minimum backing votes. assert_matches!( virtual_overseer.recv().await, @@ -477,9 +497,20 @@ fn backing_second_works() { } // Test that the candidate reaches quorum successfully. -#[test] -fn backing_works() { - let test_state = TestState::default(); +#[rstest] +#[case(true)] +#[case(false)] +fn backing_works(#[case] elastic_scaling_mvp: bool) { + let mut test_state = TestState::default(); + if elastic_scaling_mvp { + test_state + .node_features + .resize((node_features::FeatureIndex::ElasticScalingMVP as u8 + 1) as usize, false); + test_state + .node_features + .set(node_features::FeatureIndex::ElasticScalingMVP as u8 as usize, true); + } + test_harness(test_state.keystore.clone(), |mut virtual_overseer| async move { test_startup(&mut virtual_overseer, &test_state).await; @@ -630,6 +661,354 @@ fn backing_works() { virtual_overseer.send(FromOrchestra::Communication { msg: statement }).await; + let (tx, rx) = oneshot::channel(); + let msg = CandidateBackingMessage::GetBackedCandidates( + std::iter::once(( + test_state.chain_ids[0], + vec![(candidate_a_hash, test_state.relay_parent)], + )) + .collect(), + tx, + ); + + virtual_overseer.send(FromOrchestra::Communication { msg }).await; + + let mut candidates = rx.await.unwrap(); + assert_eq!(1, candidates.len()); + let candidates = candidates.remove(&test_state.chain_ids[0]).unwrap(); + assert_eq!(1, candidates.len()); + assert_eq!(candidates[0].validity_votes().len(), 3); + + let (validator_indices, maybe_core_index) = + candidates[0].validator_indices_and_core_index(elastic_scaling_mvp); + if elastic_scaling_mvp { + assert_eq!(maybe_core_index.unwrap(), CoreIndex(0)); + } else { + assert!(maybe_core_index.is_none()); + } + + assert_eq!( + validator_indices, + bitvec::bitvec![u8, bitvec::order::Lsb0; 1, 1, 0, 1].as_bitslice() + ); + + virtual_overseer + .send(FromOrchestra::Signal(OverseerSignal::ActiveLeaves( + ActiveLeavesUpdate::stop_work(test_state.relay_parent), + ))) + .await; + virtual_overseer + }); +} + +#[test] +fn get_backed_candidate_preserves_order() { + let mut test_state = TestState::default(); + test_state + .node_features + .resize((node_features::FeatureIndex::ElasticScalingMVP as u8 + 1) as usize, false); + test_state + .node_features + .set(node_features::FeatureIndex::ElasticScalingMVP as u8 as usize, true); + + // Set a single validator as the first validator group. It simplifies the test. + test_state.validator_groups.0[0] = vec![ValidatorIndex(2)]; + // Add another validator group for the third core. + test_state.validator_groups.0.push(vec![ValidatorIndex(3)]); + // Assign the second core to the same para as the first one. + test_state.availability_cores[1] = + CoreState::Scheduled(ScheduledCore { para_id: test_state.chain_ids[0], collator: None }); + // Add another availability core for paraid 2. + test_state.availability_cores.push(CoreState::Scheduled(ScheduledCore { + para_id: test_state.chain_ids[1], + collator: None, + })); + + test_harness(test_state.keystore.clone(), |mut virtual_overseer| async move { + test_startup(&mut virtual_overseer, &test_state).await; + + let pov_a = PoV { block_data: BlockData(vec![1, 2, 3]) }; + let pov_b = PoV { block_data: BlockData(vec![3, 4, 5]) }; + let pov_c = PoV { block_data: BlockData(vec![5, 6, 7]) }; + let validation_code_ab = ValidationCode(vec![1, 2, 3]); + let validation_code_c = ValidationCode(vec![4, 5, 6]); + + let parent_head_data_a = test_state.head_data.get(&test_state.chain_ids[0]).unwrap(); + let parent_head_data_b = { + let mut head = parent_head_data_a.clone(); + head.0[0] = 98; + head + }; + let output_head_data_b = { + let mut head = parent_head_data_a.clone(); + head.0[0] = 99; + head + }; + let parent_head_data_c = test_state.head_data.get(&test_state.chain_ids[1]).unwrap(); + let output_head_data_c = { + let mut head = parent_head_data_c.clone(); + head.0[0] = 97; + head + }; + + let pvd_a = PersistedValidationData { + parent_head: parent_head_data_a.clone(), + relay_parent_number: 0_u32.into(), + max_pov_size: 1024, + relay_parent_storage_root: dummy_hash(), + }; + let pvd_b = PersistedValidationData { + parent_head: parent_head_data_b.clone(), + relay_parent_number: 0_u32.into(), + max_pov_size: 1024, + relay_parent_storage_root: dummy_hash(), + }; + let pvd_c = PersistedValidationData { + parent_head: parent_head_data_c.clone(), + relay_parent_number: 0_u32.into(), + max_pov_size: 1024, + relay_parent_storage_root: dummy_hash(), + }; + + let candidate_a = TestCandidateBuilder { + para_id: test_state.chain_ids[0], + relay_parent: test_state.relay_parent, + pov_hash: pov_a.hash(), + head_data: parent_head_data_b.clone(), + erasure_root: make_erasure_root(&test_state, pov_a.clone(), pvd_a.clone()), + validation_code: validation_code_ab.0.clone(), + persisted_validation_data_hash: pvd_a.hash(), + } + .build(); + let candidate_b = TestCandidateBuilder { + para_id: test_state.chain_ids[0], + relay_parent: test_state.relay_parent, + pov_hash: pov_b.hash(), + head_data: output_head_data_b.clone(), + erasure_root: make_erasure_root(&test_state, pov_b.clone(), pvd_b.clone()), + validation_code: validation_code_ab.0.clone(), + persisted_validation_data_hash: pvd_b.hash(), + } + .build(); + let candidate_c = TestCandidateBuilder { + para_id: test_state.chain_ids[1], + relay_parent: test_state.relay_parent, + pov_hash: pov_c.hash(), + head_data: output_head_data_c.clone(), + erasure_root: make_erasure_root(&test_state, pov_b.clone(), pvd_c.clone()), + validation_code: validation_code_c.0.clone(), + persisted_validation_data_hash: pvd_c.hash(), + } + .build(); + let candidate_a_hash = candidate_a.hash(); + let candidate_b_hash = candidate_b.hash(); + let candidate_c_hash = candidate_c.hash(); + + // Back a chain of two candidates for the first paraid. Back one candidate for the second + // paraid. + for (candidate, pvd, validator_index) in [ + (candidate_a, pvd_a, ValidatorIndex(2)), + (candidate_b, pvd_b, ValidatorIndex(1)), + (candidate_c, pvd_c, ValidatorIndex(3)), + ] { + let public = Keystore::sr25519_generate_new( + &*test_state.keystore, + ValidatorId::ID, + Some(&test_state.validators[validator_index.0 as usize].to_seed()), + ) + .expect("Insert key into keystore"); + + let signed = SignedFullStatementWithPVD::sign( + &test_state.keystore, + StatementWithPVD::Seconded(candidate.clone(), pvd.clone()), + &test_state.signing_context, + validator_index, + &public.into(), + ) + .ok() + .flatten() + .expect("should be signed"); + + let statement = + CandidateBackingMessage::Statement(test_state.relay_parent, signed.clone()); + + virtual_overseer.send(FromOrchestra::Communication { msg: statement }).await; + + assert_matches!( + virtual_overseer.recv().await, + AllMessages::Provisioner( + ProvisionerMessage::ProvisionableData( + _, + ProvisionableData::BackedCandidate(candidate_receipt) + ) + ) => { + assert_eq!(candidate_receipt, candidate.to_plain()); + } + ); + } + + // Happy case, all candidates should be present. + let (tx, rx) = oneshot::channel(); + let msg = CandidateBackingMessage::GetBackedCandidates( + [ + ( + test_state.chain_ids[0], + vec![ + (candidate_a_hash, test_state.relay_parent), + (candidate_b_hash, test_state.relay_parent), + ], + ), + (test_state.chain_ids[1], vec![(candidate_c_hash, test_state.relay_parent)]), + ] + .into_iter() + .collect(), + tx, + ); + virtual_overseer.send(FromOrchestra::Communication { msg }).await; + let mut candidates = rx.await.unwrap(); + assert_eq!(2, candidates.len()); + assert_eq!( + candidates + .remove(&test_state.chain_ids[0]) + .unwrap() + .iter() + .map(|c| c.hash()) + .collect::>(), + vec![candidate_a_hash, candidate_b_hash] + ); + assert_eq!( + candidates + .remove(&test_state.chain_ids[1]) + .unwrap() + .iter() + .map(|c| c.hash()) + .collect::>(), + vec![candidate_c_hash] + ); + + // The first candidate of the first para is invalid (we supply the wrong relay parent or a + // wrong candidate hash). No candidates should be returned for paraid 1. ParaId 2 should be + // fine. + for candidates in [ + vec![ + (candidate_a_hash, Hash::repeat_byte(9)), + (candidate_b_hash, test_state.relay_parent), + ], + vec![ + (CandidateHash(Hash::repeat_byte(9)), test_state.relay_parent), + (candidate_b_hash, test_state.relay_parent), + ], + ] { + let (tx, rx) = oneshot::channel(); + let msg = CandidateBackingMessage::GetBackedCandidates( + [ + (test_state.chain_ids[0], candidates), + (test_state.chain_ids[1], vec![(candidate_c_hash, test_state.relay_parent)]), + ] + .into_iter() + .collect(), + tx, + ); + virtual_overseer.send(FromOrchestra::Communication { msg }).await; + let mut candidates = rx.await.unwrap(); + assert_eq!(candidates.len(), 1); + + assert!(candidates.remove(&test_state.chain_ids[0]).is_none()); + assert_eq!( + candidates + .remove(&test_state.chain_ids[1]) + .unwrap() + .iter() + .map(|c| c.hash()) + .collect::>(), + vec![candidate_c_hash] + ); + } + + // The second candidate of the first para is invalid (we supply the wrong relay parent or a + // wrong candidate hash). The first candidate of the first para should still be present. + // ParaId 2 is fine. + for candidates in [ + vec![ + (candidate_a_hash, test_state.relay_parent), + (candidate_b_hash, Hash::repeat_byte(9)), + ], + vec![ + (candidate_a_hash, test_state.relay_parent), + (CandidateHash(Hash::repeat_byte(9)), test_state.relay_parent), + ], + ] { + let (tx, rx) = oneshot::channel(); + let msg = CandidateBackingMessage::GetBackedCandidates( + [ + (test_state.chain_ids[0], candidates), + (test_state.chain_ids[1], vec![(candidate_c_hash, test_state.relay_parent)]), + ] + .into_iter() + .collect(), + tx, + ); + virtual_overseer.send(FromOrchestra::Communication { msg }).await; + let mut candidates = rx.await.unwrap(); + assert_eq!(2, candidates.len()); + assert_eq!( + candidates + .remove(&test_state.chain_ids[0]) + .unwrap() + .iter() + .map(|c| c.hash()) + .collect::>(), + vec![candidate_a_hash] + ); + assert_eq!( + candidates + .remove(&test_state.chain_ids[1]) + .unwrap() + .iter() + .map(|c| c.hash()) + .collect::>(), + vec![candidate_c_hash] + ); + } + + // Both candidates of para id 1 are invalid (we supply the wrong relay parent or a wrong + // candidate hash). No candidates should be returned for para id 1. Para Id 2 is fine. + for candidates in [ + vec![ + (CandidateHash(Hash::repeat_byte(9)), test_state.relay_parent), + (CandidateHash(Hash::repeat_byte(10)), test_state.relay_parent), + ], + vec![ + (candidate_a_hash, Hash::repeat_byte(9)), + (candidate_b_hash, Hash::repeat_byte(10)), + ], + ] { + let (tx, rx) = oneshot::channel(); + let msg = CandidateBackingMessage::GetBackedCandidates( + [ + (test_state.chain_ids[0], candidates), + (test_state.chain_ids[1], vec![(candidate_c_hash, test_state.relay_parent)]), + ] + .into_iter() + .collect(), + tx, + ); + virtual_overseer.send(FromOrchestra::Communication { msg }).await; + let mut candidates = rx.await.unwrap(); + assert_eq!(candidates.len(), 1); + + assert!(candidates.remove(&test_state.chain_ids[0]).is_none()); + assert_eq!( + candidates + .remove(&test_state.chain_ids[1]) + .unwrap() + .iter() + .map(|c| c.hash()) + .collect::>(), + vec![candidate_c_hash] + ); + } + virtual_overseer .send(FromOrchestra::Signal(OverseerSignal::ActiveLeaves( ActiveLeavesUpdate::stop_work(test_state.relay_parent), @@ -639,6 +1018,107 @@ fn backing_works() { }); } +#[test] +fn extract_core_index_from_statement_works() { + let test_state = TestState::default(); + + let pov_a = PoV { block_data: BlockData(vec![42, 43, 44]) }; + let pvd_a = dummy_pvd(); + let validation_code_a = ValidationCode(vec![1, 2, 3]); + + let pov_hash = pov_a.hash(); + + let mut candidate = TestCandidateBuilder { + para_id: test_state.chain_ids[0], + relay_parent: test_state.relay_parent, + pov_hash, + erasure_root: make_erasure_root(&test_state, pov_a.clone(), pvd_a.clone()), + persisted_validation_data_hash: pvd_a.hash(), + validation_code: validation_code_a.0.clone(), + ..Default::default() + } + .build(); + + let public2 = Keystore::sr25519_generate_new( + &*test_state.keystore, + ValidatorId::ID, + Some(&test_state.validators[2].to_seed()), + ) + .expect("Insert key into keystore"); + + let signed_statement_1 = SignedFullStatementWithPVD::sign( + &test_state.keystore, + StatementWithPVD::Seconded(candidate.clone(), pvd_a.clone()), + &test_state.signing_context, + ValidatorIndex(2), + &public2.into(), + ) + .ok() + .flatten() + .expect("should be signed"); + + let public1 = Keystore::sr25519_generate_new( + &*test_state.keystore, + ValidatorId::ID, + Some(&test_state.validators[1].to_seed()), + ) + .expect("Insert key into keystore"); + + let signed_statement_2 = SignedFullStatementWithPVD::sign( + &test_state.keystore, + StatementWithPVD::Seconded(candidate.clone(), pvd_a.clone()), + &test_state.signing_context, + ValidatorIndex(1), + &public1.into(), + ) + .ok() + .flatten() + .expect("should be signed"); + + candidate.descriptor.para_id = test_state.chain_ids[1]; + + let signed_statement_3 = SignedFullStatementWithPVD::sign( + &test_state.keystore, + StatementWithPVD::Seconded(candidate, pvd_a.clone()), + &test_state.signing_context, + ValidatorIndex(1), + &public1.into(), + ) + .ok() + .flatten() + .expect("should be signed"); + + let core_index_1 = core_index_from_statement( + &test_state.validator_to_group, + &test_state.validator_groups.1, + &test_state.availability_cores, + &signed_statement_1, + ) + .unwrap(); + + assert_eq!(core_index_1, CoreIndex(0)); + + let core_index_2 = core_index_from_statement( + &test_state.validator_to_group, + &test_state.validator_groups.1, + &test_state.availability_cores, + &signed_statement_2, + ); + + // Must be none, para_id in descriptor is different than para assigned to core + assert_eq!(core_index_2, None); + + let core_index_3 = core_index_from_statement( + &test_state.validator_to_group, + &test_state.validator_groups.1, + &test_state.availability_cores, + &signed_statement_3, + ) + .unwrap(); + + assert_eq!(core_index_3, CoreIndex(1)); +} + #[test] fn backing_works_while_validation_ongoing() { let test_state = TestState::default(); @@ -793,28 +1273,34 @@ fn backing_works_while_validation_ongoing() { let (tx, rx) = oneshot::channel(); let msg = CandidateBackingMessage::GetBackedCandidates( - vec![(candidate_a.hash(), test_state.relay_parent)], + std::iter::once(( + test_state.chain_ids[0], + vec![(candidate_a.hash(), test_state.relay_parent)], + )) + .collect(), tx, ); virtual_overseer.send(FromOrchestra::Communication { msg }).await; - let candidates = rx.await.unwrap(); + let mut candidates = rx.await.unwrap(); + assert_eq!(candidates.len(), 1); + let candidates = candidates.remove(&test_state.chain_ids[0]).unwrap(); assert_eq!(1, candidates.len()); - assert_eq!(candidates[0].validity_votes.len(), 3); + assert_eq!(candidates[0].validity_votes().len(), 3); assert!(candidates[0] - .validity_votes + .validity_votes() .contains(&ValidityAttestation::Implicit(signed_a.signature().clone()))); assert!(candidates[0] - .validity_votes + .validity_votes() .contains(&ValidityAttestation::Explicit(signed_b.signature().clone()))); assert!(candidates[0] - .validity_votes + .validity_votes() .contains(&ValidityAttestation::Explicit(signed_c.signature().clone()))); assert_eq!( - candidates[0].validator_indices, - bitvec::bitvec![u8, bitvec::order::Lsb0; 1, 0, 1, 1], + candidates[0].validator_indices_and_core_index(false), + (bitvec::bitvec![u8, bitvec::order::Lsb0; 1, 0, 1, 1].as_bitslice(), None) ); virtual_overseer @@ -1408,7 +1894,11 @@ fn backing_works_after_failed_validation() { // and check that it is still alive. let (tx, rx) = oneshot::channel(); let msg = CandidateBackingMessage::GetBackedCandidates( - vec![(candidate.hash(), test_state.relay_parent)], + std::iter::once(( + test_state.chain_ids[0], + vec![(candidate.hash(), test_state.relay_parent)], + )) + .collect(), tx, ); @@ -1422,7 +1912,7 @@ fn backing_works_after_failed_validation() { fn candidate_backing_reorders_votes() { use sp_core::Encode; - let para_id = ParaId::from(10); + let core_idx = CoreIndex(10); let validators = vec![ Sr25519Keyring::Alice, Sr25519Keyring::Bob, @@ -1436,7 +1926,7 @@ fn candidate_backing_reorders_votes() { let validator_groups = { let mut validator_groups = HashMap::new(); validator_groups - .insert(para_id, vec![0, 1, 2, 3, 4, 5].into_iter().map(ValidatorIndex).collect()); + .insert(core_idx, vec![0, 1, 2, 3, 4, 5].into_iter().map(ValidatorIndex).collect()); validator_groups }; @@ -1466,10 +1956,10 @@ fn candidate_backing_reorders_votes() { (ValidatorIndex(3), fake_attestation(3)), (ValidatorIndex(1), fake_attestation(1)), ], - group_id: para_id, + group_id: core_idx, }; - let backed = table_attested_to_backed(attested, &table_context).unwrap(); + let backed = table_attested_to_backed(attested, &table_context, false).unwrap(); let expected_bitvec = { let mut validator_indices = BitVec::::with_capacity(6); @@ -1486,8 +1976,11 @@ fn candidate_backing_reorders_votes() { let expected_attestations = vec![fake_attestation(1).into(), fake_attestation(3).into(), fake_attestation(5).into()]; - assert_eq!(backed.validator_indices, expected_bitvec); - assert_eq!(backed.validity_votes, expected_attestations); + assert_eq!( + backed.validator_indices_and_core_index(false), + (expected_bitvec.as_bitslice(), None) + ); + assert_eq!(backed.validity_votes(), expected_attestations); } // Test whether we retry on failed PoV fetching. diff --git a/polkadot/node/core/backing/src/tests/prospective_parachains.rs b/polkadot/node/core/backing/src/tests/prospective_parachains.rs index 578f21bef66515e49042d7a11692de67b9642d41..94310d2aa164650db84b78ddf361a9f465ac207d 100644 --- a/polkadot/node/core/backing/src/tests/prospective_parachains.rs +++ b/polkadot/node/core/backing/src/tests/prospective_parachains.rs @@ -185,6 +185,16 @@ async fn activate_leaf( } ); + // Node features request from runtime: all features are disabled. + assert_matches!( + virtual_overseer.recv().await, + AllMessages::RuntimeApi( + RuntimeApiMessage::Request(parent, RuntimeApiRequest::NodeFeatures(_session_index, tx)) + ) if parent == hash => { + tx.send(Ok(Default::default())).unwrap(); + } + ); + // Check if subsystem job issues a request for the minimum backing votes. assert_matches!( virtual_overseer.recv().await, @@ -305,10 +315,11 @@ async fn assert_hypothetical_frontier_requests( ) => { let idx = match expected_requests.iter().position(|r| r.0 == request) { Some(idx) => idx, - None => panic!( + None => + panic!( "unexpected hypothetical frontier request, no match found for {:?}", request - ), + ), }; let resp = std::mem::take(&mut expected_requests[idx].1); tx.send(resp).unwrap(); @@ -1268,6 +1279,7 @@ fn concurrent_dependent_candidates() { let statement_b = CandidateBackingMessage::Statement(leaf_parent, signed_b.clone()); virtual_overseer.send(FromOrchestra::Communication { msg: statement_a }).await; + // At this point the subsystem waits for response, the previous message is received, // send a second one without blocking. let _ = virtual_overseer @@ -1388,7 +1400,19 @@ fn concurrent_dependent_candidates() { assert_eq!(sess_idx, 1); tx.send(Ok(Some(ExecutorParams::default()))).unwrap(); }, + AllMessages::RuntimeApi(RuntimeApiMessage::Request( + _parent, + RuntimeApiRequest::ValidatorGroups(tx), + )) => { + tx.send(Ok(test_state.validator_groups.clone())).unwrap(); + }, + AllMessages::RuntimeApi(RuntimeApiMessage::Request( + _parent, + RuntimeApiRequest::AvailabilityCores(tx), + )) => { + tx.send(Ok(test_state.availability_cores.clone())).unwrap(); + }, _ => panic!("unexpected message received from overseer: {:?}", msg), } } @@ -1419,7 +1443,6 @@ fn seconding_sanity_check_occupy_same_depth() { let leaf_parent = get_parent_hash(leaf_hash); let activated = new_leaf(leaf_hash, LEAF_BLOCK_NUMBER); - let min_block_number = LEAF_BLOCK_NUMBER - LEAF_ANCESTRY_LEN; let min_relay_parents = vec![(para_id_a, min_block_number), (para_id_b, min_block_number)]; let test_leaf_a = TestLeaf { activated, min_relay_parents }; @@ -1555,13 +1578,14 @@ fn occupied_core_assignment() { const LEAF_A_BLOCK_NUMBER: BlockNumber = 100; const LEAF_A_ANCESTRY_LEN: BlockNumber = 3; let para_id = test_state.chain_ids[0]; + let previous_para_id = test_state.chain_ids[1]; // Set the core state to occupied. let mut candidate_descriptor = ::test_helpers::dummy_candidate_descriptor(Hash::zero()); - candidate_descriptor.para_id = para_id; + candidate_descriptor.para_id = previous_para_id; test_state.availability_cores[0] = CoreState::Occupied(OccupiedCore { group_responsible: Default::default(), - next_up_on_available: None, + next_up_on_available: Some(ScheduledCore { para_id, collator: None }), occupied_since: 100_u32, time_out_at: 200_u32, next_up_on_time_out: None, diff --git a/polkadot/node/core/bitfield-signing/Cargo.toml b/polkadot/node/core/bitfield-signing/Cargo.toml index f42e8f8d22ba3d92e799bcd5aebe1cbeedca83de..0663e0f1b699bbf44e0ecd51dcf646bc27966a2c 100644 --- a/polkadot/node/core/bitfield-signing/Cargo.toml +++ b/polkadot/node/core/bitfield-signing/Cargo.toml @@ -10,14 +10,14 @@ description = "Bitfield signing subsystem for the Polkadot node" workspace = true [dependencies] -futures = "0.3.21" +futures = "0.3.30" gum = { package = "tracing-gum", path = "../../gum" } polkadot-primitives = { path = "../../../primitives" } polkadot-node-subsystem = { path = "../../subsystem" } polkadot-node-subsystem-util = { path = "../../subsystem-util" } sp-keystore = { path = "../../../../substrate/primitives/keystore" } wasm-timer = "0.2.5" -thiserror = "1.0.48" +thiserror = { workspace = true } [dev-dependencies] polkadot-node-subsystem-test-helpers = { path = "../../subsystem-test-helpers" } diff --git a/polkadot/node/core/candidate-validation/Cargo.toml b/polkadot/node/core/candidate-validation/Cargo.toml index 15fc8c940d338c9aab1eb4d23e98427a597a2df1..0cf4707aad29b3931cab7d65005799cf58c8c38e 100644 --- a/polkadot/node/core/candidate-validation/Cargo.toml +++ b/polkadot/node/core/candidate-validation/Cargo.toml @@ -10,8 +10,8 @@ license.workspace = true workspace = true [dependencies] -async-trait = "0.1.74" -futures = "0.3.21" +async-trait = "0.1.79" +futures = "0.3.30" futures-timer = "3.0.2" gum = { package = "tracing-gum", path = "../../gum" } @@ -31,7 +31,7 @@ polkadot-node-core-pvf = { path = "../pvf" } [dev-dependencies] sp-keyring = { path = "../../../../substrate/primitives/keyring" } -futures = { version = "0.3.21", features = ["thread-pool"] } +futures = { version = "0.3.30", features = ["thread-pool"] } assert_matches = "1.4.0" polkadot-node-subsystem-test-helpers = { path = "../../subsystem-test-helpers" } sp-core = { path = "../../../../substrate/primitives/core" } diff --git a/polkadot/node/core/candidate-validation/src/lib.rs b/polkadot/node/core/candidate-validation/src/lib.rs index bf6e09fd1b69b702206eb52090cb4a12812c00c0..ec24434db24c30713e106b99b3238f997ba4765f 100644 --- a/polkadot/node/core/candidate-validation/src/lib.rs +++ b/polkadot/node/core/candidate-validation/src/lib.rs @@ -617,7 +617,7 @@ async fn validate_candidate_exhaustive( Err(e) => { gum::info!(target: LOG_TARGET, ?para_id, err=?e, "Invalid candidate (validation code)"); - // Code already passed pre-checking, if decompression fails now this most likley means + // Code already passed pre-checking, if decompression fails now this most likely means // some local corruption happened. return Err(ValidationFailed("Code decompression failed".to_string())) }, @@ -695,6 +695,8 @@ async fn validate_candidate_exhaustive( ))), Err(ValidationError::PossiblyInvalid(PossiblyInvalidError::JobError(err))) => Ok(ValidationResult::Invalid(InvalidCandidate::ExecutionError(err))), + Err(ValidationError::PossiblyInvalid(PossiblyInvalidError::RuntimeConstruction(err))) => + Ok(ValidationResult::Invalid(InvalidCandidate::ExecutionError(err))), Err(ValidationError::PossiblyInvalid(PossiblyInvalidError::AmbiguousJobDeath(err))) => Ok(ValidationResult::Invalid(InvalidCandidate::ExecutionError(format!( @@ -780,40 +782,50 @@ trait ValidationBackend { return validation_result } + macro_rules! break_if_no_retries_left { + ($counter:ident) => { + if $counter > 0 { + $counter -= 1; + } else { + break + } + }; + } + // Allow limited retries for each kind of error. let mut num_death_retries_left = 1; let mut num_job_error_retries_left = 1; let mut num_internal_retries_left = 1; + let mut num_runtime_construction_retries_left = 1; loop { // Stop retrying if we exceeded the timeout. if total_time_start.elapsed() + retry_delay > exec_timeout { break } - + let mut retry_immediately = false; match validation_result { Err(ValidationError::PossiblyInvalid( PossiblyInvalidError::AmbiguousWorkerDeath | PossiblyInvalidError::AmbiguousJobDeath(_), - )) => - if num_death_retries_left > 0 { - num_death_retries_left -= 1; - } else { - break - }, + )) => break_if_no_retries_left!(num_death_retries_left), Err(ValidationError::PossiblyInvalid(PossiblyInvalidError::JobError(_))) => - if num_job_error_retries_left > 0 { - num_job_error_retries_left -= 1; - } else { - break - }, + break_if_no_retries_left!(num_job_error_retries_left), Err(ValidationError::Internal(_)) => - if num_internal_retries_left > 0 { - num_internal_retries_left -= 1; - } else { - break - }, + break_if_no_retries_left!(num_internal_retries_left), + + Err(ValidationError::PossiblyInvalid( + PossiblyInvalidError::RuntimeConstruction(_), + )) => { + break_if_no_retries_left!(num_runtime_construction_retries_left); + self.precheck_pvf(pvf.clone()).await?; + // In this case the error is deterministic + // And a retry forces the ValidationBackend + // to re-prepare the artifact so + // there is no need to wait before the retry + retry_immediately = true; + }, Ok(_) | Err(ValidationError::Invalid(_) | ValidationError::Preparation(_)) => break, } @@ -821,8 +833,11 @@ trait ValidationBackend { // If we got a possibly transient error, retry once after a brief delay, on the // assumption that the conditions that caused this error may have resolved on their own. { - // Wait a brief delay before retrying. - futures_timer::Delay::new(retry_delay).await; + // In case of many transient errors it is necessary to wait a little bit + // for the error to be probably resolved + if !retry_immediately { + futures_timer::Delay::new(retry_delay).await; + } let new_timeout = exec_timeout.saturating_sub(total_time_start.elapsed()); diff --git a/polkadot/node/core/chain-api/Cargo.toml b/polkadot/node/core/chain-api/Cargo.toml index 9aa017ecba3d27c8f85c8055a1fc784d38efbfbd..f4d02d3f47b23ac4e71fa44c790bf4b0d1538902 100644 --- a/polkadot/node/core/chain-api/Cargo.toml +++ b/polkadot/node/core/chain-api/Cargo.toml @@ -10,7 +10,7 @@ description = "The Chain API subsystem provides access to chain related utility workspace = true [dependencies] -futures = "0.3.21" +futures = "0.3.30" gum = { package = "tracing-gum", path = "../../gum" } polkadot-node-metrics = { path = "../../metrics" } polkadot-node-subsystem = { path = "../../subsystem" } @@ -19,7 +19,7 @@ sc-client-api = { path = "../../../../substrate/client/api" } sc-consensus-babe = { path = "../../../../substrate/client/consensus/babe" } [dev-dependencies] -futures = { version = "0.3.21", features = ["thread-pool"] } +futures = { version = "0.3.30", features = ["thread-pool"] } maplit = "1.0.2" parity-scale-codec = "3.6.1" polkadot-node-primitives = { path = "../../primitives" } diff --git a/polkadot/node/core/chain-selection/Cargo.toml b/polkadot/node/core/chain-selection/Cargo.toml index 27c2df85235e86d86860496923c3f89ce5fb0199..318f27a43086e4c6bee0bf0a0b18a78c9cf525be 100644 --- a/polkadot/node/core/chain-selection/Cargo.toml +++ b/polkadot/node/core/chain-selection/Cargo.toml @@ -10,7 +10,7 @@ license.workspace = true workspace = true [dependencies] -futures = "0.3.21" +futures = "0.3.30" futures-timer = "3" gum = { package = "tracing-gum", path = "../../gum" } polkadot-primitives = { path = "../../../primitives" } @@ -18,7 +18,7 @@ polkadot-node-primitives = { path = "../../primitives" } polkadot-node-subsystem = { path = "../../subsystem" } polkadot-node-subsystem-util = { path = "../../subsystem-util" } kvdb = "0.13.0" -thiserror = "1.0.48" +thiserror = { workspace = true } parity-scale-codec = "3.6.1" [dev-dependencies] diff --git a/polkadot/node/core/chain-selection/src/lib.rs b/polkadot/node/core/chain-selection/src/lib.rs index aa5bb9548ad2484b3e0bdc0499b250335ea57f35..6f864fefb6110184233d52620dea923f8f0b1e4a 100644 --- a/polkadot/node/core/chain-selection/src/lib.rs +++ b/polkadot/node/core/chain-selection/src/lib.rs @@ -51,7 +51,7 @@ type Timestamp = u64; // If a block isn't approved in 120 seconds, nodes will abandon it // and begin building on another chain. const STAGNANT_TIMEOUT: Timestamp = 120; -// Delay prunning of the stagnant keys in prune only mode by 25 hours to avoid interception with the +// Delay pruning of the stagnant keys in prune only mode by 25 hours to avoid interception with the // finality const STAGNANT_PRUNE_DELAY: Timestamp = 25 * 60 * 60; // Maximum number of stagnant entries cleaned during one `STAGNANT_TIMEOUT` iteration @@ -237,7 +237,7 @@ impl Clock for SystemClock { // // The exact time that a block becomes stagnant in the local node is always expected // to differ from other nodes due to network asynchrony and delays in block propagation. - // Non-monotonicity exarcerbates that somewhat, but not meaningfully. + // Non-monotonicity exacerbates that somewhat, but not meaningfully. match SystemTime::now().duration_since(UNIX_EPOCH) { Ok(d) => d.as_secs(), diff --git a/polkadot/node/core/chain-selection/src/tests.rs b/polkadot/node/core/chain-selection/src/tests.rs index cf021c0efeb0638b5fe1db4ef5dbe9dd4c7766f6..bc998f268a0da6a4ca3703f929be3e1c19677b35 100644 --- a/polkadot/node/core/chain-selection/src/tests.rs +++ b/polkadot/node/core/chain-selection/src/tests.rs @@ -406,7 +406,7 @@ async fn import_chains_into_empty( // some pre-blocks may need to be supplied to answer ancestry requests // that gather batches beyond the beginning of the new chain. // pre-blocks are those already known by the subsystem, however, -// the subsystem has no way of knowin that until requesting ancestry. +// the subsystem has no way of knowing that until requesting ancestry. async fn import_all_blocks_into( virtual_overseer: &mut VirtualOverseer, backend: &TestBackend, @@ -1300,7 +1300,7 @@ fn finalize_erases_unviable_from_one_but_not_all_reverts() { // F <- A1 <- A2 <- A3 // // A3 reverts A2 and A1. - // Finalize A1. A2 is stil unviable. + // Finalize A1. A2 is still unviable. let (a3_hash, chain_a) = construct_chain_on_base(vec![1, 2, 3], finalized_number, finalized_hash, |h| { diff --git a/polkadot/node/core/dispute-coordinator/Cargo.toml b/polkadot/node/core/dispute-coordinator/Cargo.toml index 8a414a35f39cb9e1f3246e1afb83a5ea7a93cff1..cd3238449bea9d19ec65f418237282523ff3448a 100644 --- a/polkadot/node/core/dispute-coordinator/Cargo.toml +++ b/polkadot/node/core/dispute-coordinator/Cargo.toml @@ -10,11 +10,11 @@ license.workspace = true workspace = true [dependencies] -futures = "0.3.21" +futures = "0.3.30" gum = { package = "tracing-gum", path = "../../gum" } parity-scale-codec = "3.6.1" kvdb = "0.13.0" -thiserror = "1.0.48" +thiserror = { workspace = true } schnellru = "0.2.1" fatality = "0.0.6" diff --git a/polkadot/node/core/dispute-coordinator/src/db/v1.rs b/polkadot/node/core/dispute-coordinator/src/db/v1.rs index f0f17d2325d68bb1d70f40a2a761bdf5f35ebcfb..4950765cf510c047b811f50d0459c0add4c75d78 100644 --- a/polkadot/node/core/dispute-coordinator/src/db/v1.rs +++ b/polkadot/node/core/dispute-coordinator/src/db/v1.rs @@ -341,7 +341,7 @@ pub(crate) fn note_earliest_session( let lower_bound = (new_earliest_session, CandidateHash(Hash::repeat_byte(0x00))); let new_recent_disputes = recent_disputes.split_off(&lower_bound); - // Any remanining disputes are considered ancient and must be pruned. + // Any remaining disputes are considered ancient and must be pruned. let pruned_disputes = recent_disputes; if pruned_disputes.len() != 0 { diff --git a/polkadot/node/core/dispute-coordinator/src/import.rs b/polkadot/node/core/dispute-coordinator/src/import.rs index 278561d5d00c1b9f4ec5d4e87287f76bebe8fb70..d3a4625f0d24b2ff0fc3bcc914d629e604909193 100644 --- a/polkadot/node/core/dispute-coordinator/src/import.rs +++ b/polkadot/node/core/dispute-coordinator/src/import.rs @@ -52,7 +52,8 @@ pub struct CandidateEnvironment<'a> { executor_params: &'a ExecutorParams, /// Validator indices controlled by this node. controlled_indices: HashSet, - /// Indices of disabled validators at the `relay_parent`. + /// Indices of on-chain disabled validators at the `relay_parent` combined + /// with the off-chain state. disabled_indices: HashSet, } @@ -67,16 +68,15 @@ impl<'a> CandidateEnvironment<'a> { runtime_info: &'a mut RuntimeInfo, session_index: SessionIndex, relay_parent: Hash, + disabled_offchain: impl IntoIterator, ) -> Option> { - let disabled_indices = runtime_info + let disabled_onchain = runtime_info .get_disabled_validators(ctx.sender(), relay_parent) .await .unwrap_or_else(|err| { gum::info!(target: LOG_TARGET, ?err, "Failed to get disabled validators"); Vec::new() - }) - .into_iter() - .collect(); + }); let (session, executor_params) = match runtime_info .get_session_info_by_index(ctx.sender(), relay_parent, session_index) @@ -87,6 +87,24 @@ impl<'a> CandidateEnvironment<'a> { Err(_) => return None, }; + let n_validators = session.validators.len(); + let byzantine_threshold = polkadot_primitives::byzantine_threshold(n_validators); + // combine on-chain with off-chain disabled validators + // process disabled validators in the following order: + // - on-chain disabled validators + // - prioritized order of off-chain disabled validators + // deduplicate the list and take at most `byzantine_threshold` validators + let disabled_indices = { + let mut d: HashSet = HashSet::new(); + for v in disabled_onchain.into_iter().chain(disabled_offchain.into_iter()) { + if d.len() == byzantine_threshold { + break + } + d.insert(v); + } + d + }; + let controlled_indices = find_controlled_validator_indices(keystore, &session.validators); Some(Self { session_index, session, executor_params, controlled_indices, disabled_indices }) } @@ -116,7 +134,7 @@ impl<'a> CandidateEnvironment<'a> { &self.controlled_indices } - /// Indices of disabled validators at the `relay_parent`. + /// Indices of off-chain and on-chain disabled validators. pub fn disabled_indices(&'a self) -> &'a HashSet { &self.disabled_indices } @@ -237,13 +255,19 @@ impl CandidateVoteState { let supermajority_threshold = polkadot_primitives::supermajority_threshold(n_validators); - // We have a dispute, if we have votes on both sides: - let is_disputed = !votes.invalid.is_empty() && !votes.valid.raw().is_empty(); + // We have a dispute, if we have votes on both sides, with at least one invalid vote + // from non-disabled validator or with votes on both sides and confirmed. + let has_non_disabled_invalid_votes = + votes.invalid.keys().any(|i| !env.disabled_indices().contains(i)); + let byzantine_threshold = polkadot_primitives::byzantine_threshold(n_validators); + let votes_on_both_sides = !votes.valid.raw().is_empty() && !votes.invalid.is_empty(); + let is_confirmed = + votes_on_both_sides && (votes.voted_indices().len() > byzantine_threshold); + let is_disputed = + is_confirmed || (has_non_disabled_invalid_votes && !votes.valid.raw().is_empty()); let (dispute_status, byzantine_threshold_against) = if is_disputed { let mut status = DisputeStatus::active(); - let byzantine_threshold = polkadot_primitives::byzantine_threshold(n_validators); - let is_confirmed = votes.voted_indices().len() > byzantine_threshold; if is_confirmed { status = status.confirm(); }; diff --git a/polkadot/node/core/dispute-coordinator/src/initialized.rs b/polkadot/node/core/dispute-coordinator/src/initialized.rs index a1bcc1f01707c434a7d58eaa801dfb762b573007..5f86da87f21ca060cfe14de536b39e652d12b7b1 100644 --- a/polkadot/node/core/dispute-coordinator/src/initialized.rs +++ b/polkadot/node/core/dispute-coordinator/src/initialized.rs @@ -17,7 +17,7 @@ //! Dispute coordinator subsystem in initialized state (after first active leaf is received). use std::{ - collections::{BTreeMap, HashSet, VecDeque}, + collections::{BTreeMap, VecDeque}, sync::Arc, }; @@ -99,7 +99,7 @@ pub(crate) struct Initialized { /// This is the highest `SessionIndex` seen via `ActiveLeavesUpdate`. It doesn't matter if it /// was cached successfully or not. It is used to detect ancient disputes. highest_session_seen: SessionIndex, - /// Will be set to `true` if an error occured during the last caching attempt + /// Will be set to `true` if an error occurred during the last caching attempt gaps_in_cache: bool, spam_slots: SpamSlots, participation: Participation, @@ -970,6 +970,7 @@ impl Initialized { &mut self.runtime_info, session, relay_parent, + self.offchain_disabled_validators.iter(session), ) .await { @@ -1099,36 +1100,14 @@ impl Initialized { let new_state = import_result.new_state(); - let byzantine_threshold = polkadot_primitives::byzantine_threshold(n_validators); - // combine on-chain with off-chain disabled validators - // process disabled validators in the following order: - // - on-chain disabled validators - // - prioritized order of off-chain disabled validators - // deduplicate the list and take at most `byzantine_threshold` validators - let disabled_validators = { - let mut d: HashSet = HashSet::new(); - for v in env - .disabled_indices() - .iter() - .cloned() - .chain(self.offchain_disabled_validators.iter(session)) - { - if d.len() == byzantine_threshold { - break - } - d.insert(v); - } - d - }; - let is_included = self.scraper.is_candidate_included(&candidate_hash); let is_backed = self.scraper.is_candidate_backed(&candidate_hash); let own_vote_missing = new_state.own_vote_missing(); let is_disputed = new_state.is_disputed(); let is_confirmed = new_state.is_confirmed(); - let potential_spam = is_potential_spam(&self.scraper, &new_state, &candidate_hash, |v| { - disabled_validators.contains(v) - }); + let is_disabled = |v: &ValidatorIndex| env.disabled_indices().contains(v); + let potential_spam = + is_potential_spam(&self.scraper, &new_state, &candidate_hash, is_disabled); let allow_participation = !potential_spam; gum::trace!( @@ -1139,7 +1118,7 @@ impl Initialized { ?candidate_hash, confirmed = ?new_state.is_confirmed(), has_invalid_voters = ?!import_result.new_invalid_voters().is_empty(), - n_disabled_validators = ?disabled_validators.len(), + n_disabled_validators = ?env.disabled_indices().len(), "Is spam?" ); @@ -1439,6 +1418,7 @@ impl Initialized { &mut self.runtime_info, session, candidate_receipt.descriptor.relay_parent, + self.offchain_disabled_validators.iter(session), ) .await { diff --git a/polkadot/node/core/dispute-coordinator/src/lib.rs b/polkadot/node/core/dispute-coordinator/src/lib.rs index c3038fc0953c6bcc7cdc979f259f7e9bf80f3039..daa384b36ffbaf2c8d3c004e35eb537a3c33e4c0 100644 --- a/polkadot/node/core/dispute-coordinator/src/lib.rs +++ b/polkadot/node/core/dispute-coordinator/src/lib.rs @@ -341,6 +341,8 @@ impl DisputeCoordinatorSubsystem { runtime_info, highest_session, leaf_hash, + // on startup we don't have any off-chain disabled state + std::iter::empty(), ) .await { @@ -370,10 +372,9 @@ impl DisputeCoordinatorSubsystem { }, }; let vote_state = CandidateVoteState::new(votes, &env, now); - let onchain_disabled = env.disabled_indices(); - let potential_spam = is_potential_spam(&scraper, &vote_state, candidate_hash, |v| { - onchain_disabled.contains(v) - }); + let is_disabled = |v: &ValidatorIndex| env.disabled_indices().contains(v); + let potential_spam = + is_potential_spam(&scraper, &vote_state, candidate_hash, is_disabled); let is_included = scraper.is_candidate_included(&vote_state.votes().candidate_receipt.hash()); @@ -461,7 +462,7 @@ async fn wait_for_first_leaf(ctx: &mut Context) -> Result { // Rare case where same candidate was present on multiple heights, but all are // pruned at the same time. This candidate was already pruned in the previous - // occurence so it is skipped now. + // occurrence so it is skipped now. }, Entry::Occupied(mut e) => { let mut blocks_including = std::mem::take(e.get_mut()); diff --git a/polkadot/node/core/dispute-coordinator/src/scraping/tests.rs b/polkadot/node/core/dispute-coordinator/src/scraping/tests.rs index 748f9a16f493e2bce191091638771aa5be57fa9f..726dda596d7b8be26da55358c95c9080ec89d962 100644 --- a/polkadot/node/core/dispute-coordinator/src/scraping/tests.rs +++ b/polkadot/node/core/dispute-coordinator/src/scraping/tests.rs @@ -542,8 +542,8 @@ fn scraper_handles_backed_but_not_included_candidate() { } #[test] -fn scraper_handles_the_same_candidate_incuded_in_two_different_block_heights() { - // Same candidate will be inclued in these two leaves +fn scraper_handles_the_same_candidate_included_in_two_different_block_heights() { + // Same candidate will be included in these two leaves let test_targets = vec![2, 3]; // How many blocks should we skip before sending a leaf update. diff --git a/polkadot/node/core/dispute-coordinator/src/tests.rs b/polkadot/node/core/dispute-coordinator/src/tests.rs index af384256c4f71e2f78e4ac0baff2558b9ba27f46..13cf2df88223ead28dcd98aeaa3c36db13444991 100644 --- a/polkadot/node/core/dispute-coordinator/src/tests.rs +++ b/polkadot/node/core/dispute-coordinator/src/tests.rs @@ -61,9 +61,9 @@ use polkadot_node_subsystem_test_helpers::{ make_buffered_subsystem_context, mock::new_leaf, TestSubsystemContextHandle, }; use polkadot_primitives::{ - vstaging::NodeFeatures, ApprovalVote, BlockNumber, CandidateCommitments, CandidateEvent, - CandidateHash, CandidateReceipt, CoreIndex, DisputeStatement, ExecutorParams, GroupIndex, Hash, - HeadData, Header, IndexedVec, MultiDisputeStatementSet, ScrapedOnChainVotes, SessionIndex, + ApprovalVote, BlockNumber, CandidateCommitments, CandidateEvent, CandidateHash, + CandidateReceipt, CoreIndex, DisputeStatement, ExecutorParams, GroupIndex, Hash, HeadData, + Header, IndexedVec, MultiDisputeStatementSet, NodeFeatures, ScrapedOnChainVotes, SessionIndex, SessionInfo, SigningContext, ValidDisputeStatementKind, ValidatorId, ValidatorIndex, ValidatorSignature, }; @@ -2226,7 +2226,7 @@ fn resume_dispute_without_local_statement() { test_state }) }) - // Alice should send a DisputeParticiationMessage::Participate on restart since she has no + // Alice should send a DisputeParticipationMessage::Participate on restart since she has no // local statement for the active dispute. .resume(|mut test_state, mut virtual_overseer| { Box::pin(async move { @@ -2390,7 +2390,7 @@ fn resume_dispute_with_local_statement() { test_state }) }) - // Alice should not send a DisputeParticiationMessage::Participate on restart since she has a + // Alice should not send a DisputeParticipationMessage::Participate on restart since she has a // local statement for the active dispute, instead she should try to (re-)send her vote. .resume(|mut test_state, mut virtual_overseer| { let candidate_receipt = make_valid_candidate_receipt(); @@ -2495,7 +2495,7 @@ fn resume_dispute_without_local_statement_or_local_key() { test_state }) }) - // Two should not send a DisputeParticiationMessage::Participate on restart since she is no + // Two should not send a DisputeParticipationMessage::Participate on restart since she is no // validator in that dispute. .resume(|mut test_state, mut virtual_overseer| { Box::pin(async move { @@ -2645,14 +2645,23 @@ fn participation_with_onchain_disabling_unconfirmed() { .await; handle_disabled_validators_queries(&mut virtual_overseer, vec![disabled_index]).await; - handle_approval_vote_request(&mut virtual_overseer, &candidate_hash, HashMap::new()) - .await; - assert_eq!(confirmation_rx.await, Ok(ImportStatementsResult::ValidImport)); // we should not participate due to disabled indices on chain assert!(virtual_overseer.recv().timeout(TEST_TIMEOUT).await.is_none()); + { + // make sure the dispute is not active + let (tx, rx) = oneshot::channel(); + virtual_overseer + .send(FromOrchestra::Communication { + msg: DisputeCoordinatorMessage::ActiveDisputes(tx), + }) + .await; + + assert_eq!(rx.await.unwrap().len(), 0); + } + // Scenario 2: unconfirmed dispute with non-disabled validator against. // Expectation: even if the dispute is unconfirmed, we should participate // once we receive an invalid vote from a non-disabled validator. @@ -2679,6 +2688,9 @@ fn participation_with_onchain_disabling_unconfirmed() { }) .await; + handle_approval_vote_request(&mut virtual_overseer, &candidate_hash, HashMap::new()) + .await; + assert_eq!(confirmation_rx.await, Ok(ImportStatementsResult::ValidImport)); participation_with_distribution( @@ -2710,7 +2722,7 @@ fn participation_with_onchain_disabling_unconfirmed() { .await; let (_, _, votes) = rx.await.unwrap().get(0).unwrap().clone(); - assert_eq!(votes.valid.raw().len(), 2); // 3+1 => we have participated + assert_eq!(votes.valid.raw().len(), 2); // 1+1 => we have participated assert_eq!(votes.invalid.len(), 2); } @@ -2832,6 +2844,7 @@ fn participation_with_onchain_disabling_confirmed() { #[test] fn participation_with_offchain_disabling() { + sp_tracing::init_for_tests(); test_harness(|mut test_state, mut virtual_overseer| { Box::pin(async move { let session = 1; @@ -2968,17 +2981,23 @@ fn participation_with_offchain_disabling() { // let's disable validators 3, 4 on chain, but this should not affect this import let disabled_validators = vec![ValidatorIndex(3), ValidatorIndex(4)]; handle_disabled_validators_queries(&mut virtual_overseer, disabled_validators).await; - handle_approval_vote_request( - &mut virtual_overseer, - &another_candidate_hash, - HashMap::new(), - ) - .await; assert_eq!(confirmation_rx.await, Ok(ImportStatementsResult::ValidImport)); // we should not participate since due to offchain disabling assert!(virtual_overseer.recv().timeout(TEST_TIMEOUT).await.is_none()); + { + // make sure the new dispute is not active + let (tx, rx) = oneshot::channel(); + virtual_overseer + .send(FromOrchestra::Communication { + msg: DisputeCoordinatorMessage::ActiveDisputes(tx), + }) + .await; + + assert_eq!(rx.await.unwrap().len(), 1); + } + // now import enough votes for dispute confirmation // even though all of these votes are from (on chain) disabled validators let mut statements = Vec::new(); @@ -3007,6 +3026,12 @@ fn participation_with_offchain_disabling() { }) .await; + handle_approval_vote_request( + &mut virtual_overseer, + &another_candidate_hash, + HashMap::new(), + ) + .await; assert_eq!(confirmation_rx.await, Ok(ImportStatementsResult::ValidImport)); participation_with_distribution( diff --git a/polkadot/node/core/parachains-inherent/Cargo.toml b/polkadot/node/core/parachains-inherent/Cargo.toml index 3b2fa634102dd0537408a041443b301ffe073c08..4f6090f90e9535a7cee8da2e333d5e66a0dea972 100644 --- a/polkadot/node/core/parachains-inherent/Cargo.toml +++ b/polkadot/node/core/parachains-inherent/Cargo.toml @@ -10,11 +10,11 @@ description = "Parachains inherent data provider for Polkadot node" workspace = true [dependencies] -futures = "0.3.21" +futures = "0.3.30" futures-timer = "3.0.2" gum = { package = "tracing-gum", path = "../../gum" } -thiserror = "1.0.48" -async-trait = "0.1.74" +thiserror = { workspace = true } +async-trait = "0.1.79" polkadot-node-subsystem = { path = "../../subsystem" } polkadot-overseer = { path = "../../overseer" } polkadot-primitives = { path = "../../../primitives" } diff --git a/polkadot/node/core/prospective-parachains/Cargo.toml b/polkadot/node/core/prospective-parachains/Cargo.toml index 5f0b2c0fdc96beb8c90a3e207307d4c9d5a2619b..ab3cef99e54ff6da279ec30728c308ed8bbf3da6 100644 --- a/polkadot/node/core/prospective-parachains/Cargo.toml +++ b/polkadot/node/core/prospective-parachains/Cargo.toml @@ -10,10 +10,10 @@ description = "The Prospective Parachains subsystem. Tracks and handles prospect workspace = true [dependencies] -futures = "0.3.19" +futures = "0.3.30" gum = { package = "tracing-gum", path = "../../gum" } parity-scale-codec = "3.6.4" -thiserror = "1.0.48" +thiserror = { workspace = true } fatality = "0.0.6" bitvec = "1" @@ -23,6 +23,7 @@ polkadot-node-subsystem = { path = "../../subsystem" } polkadot-node-subsystem-util = { path = "../../subsystem-util" } [dev-dependencies] +rstest = "0.18.2" assert_matches = "1" polkadot-node-subsystem-test-helpers = { path = "../../subsystem-test-helpers" } polkadot-node-subsystem-types = { path = "../../subsystem-types" } diff --git a/polkadot/node/core/prospective-parachains/src/fragment_tree.rs b/polkadot/node/core/prospective-parachains/src/fragment_tree.rs index f7b97f0782739a10926cd252e9c7b4184f93db93..8061dc82d8358ae9e7c741e3f785634601eb5d03 100644 --- a/polkadot/node/core/prospective-parachains/src/fragment_tree.rs +++ b/polkadot/node/core/prospective-parachains/src/fragment_tree.rs @@ -96,6 +96,7 @@ use std::{ use super::LOG_TARGET; use bitvec::prelude::*; +use polkadot_node_subsystem::messages::Ancestors; use polkadot_node_subsystem_util::inclusion_emulator::{ ConstraintModifications, Constraints, Fragment, ProspectiveCandidate, RelayChainBlockInfo, }; @@ -756,52 +757,217 @@ impl FragmentTree { depths.iter_ones().collect() } - /// Select a candidate after the given `required_path` which passes - /// the predicate. + /// Select `count` candidates after the given `ancestors` which pass + /// the predicate and have not already been backed on chain. /// - /// If there are multiple possibilities, this will select the first one. + /// Does an exhaustive search into the tree after traversing the ancestors path. + /// If the ancestors draw out a path that can be traversed in multiple ways, no + /// candidates will be returned. + /// If the ancestors do not draw out a full path (the path contains holes), candidates will be + /// suggested that may fill these holes. + /// If the ancestors don't draw out a valid path, no candidates will be returned. If there are + /// multiple possibilities of the same size, this will select the first one. If there is no + /// chain of size `count` that matches the criteria, this will return the largest chain it could + /// find with the criteria. If there are no candidates meeting those criteria, returns an empty + /// `Vec`. + /// Cycles are accepted, but this code expects that the runtime will deduplicate + /// identical candidates when occupying the cores (when proposing to back A->B->A, only A will + /// be backed on chain). /// - /// This returns `None` if there is no candidate meeting those criteria. - /// - /// The intention of the `required_path` is to allow queries on the basis of + /// The intention of the `ancestors` is to allow queries on the basis of /// one or more candidates which were previously pending availability becoming - /// available and opening up more room on the core. - pub(crate) fn select_child( + /// available or candidates timing out. + pub(crate) fn find_backable_chain( &self, - required_path: &[CandidateHash], + ancestors: Ancestors, + count: u32, pred: impl Fn(&CandidateHash) -> bool, - ) -> Option { - let base_node = { - // traverse the required path. - let mut node = NodePointer::Root; - for required_step in required_path { - node = self.node_candidate_child(node, &required_step)?; - } + ) -> Vec { + if count == 0 { + return vec![] + } + // First, we need to order the ancestors. + // The node returned is the one from which we can start finding new backable candidates. + let Some(base_node) = self.find_ancestor_path(ancestors) else { return vec![] }; + + self.find_backable_chain_inner( + base_node, + count, + count, + &pred, + &mut Vec::with_capacity(count as usize), + ) + } - node - }; + // Try finding a candidate chain starting from `base_node` of length `expected_count`. + // If not possible, return the longest one we could find. + // Does a depth-first search, since we're optimistic that there won't be more than one such + // chains (parachains shouldn't usually have forks). So in the usual case, this will conclude + // in `O(expected_count)`. + // Cycles are accepted, but this doesn't allow for infinite execution time, because the maximum + // depth we'll reach is `expected_count`. + // + // Worst case performance is `O(num_forks ^ expected_count)`, the same as populating the tree. + // Although an exponential function, this is actually a constant that can only be altered via + // sudo/governance, because: + // 1. `num_forks` at a given level is at most `max_candidate_depth * max_validators_per_core` + // (because each validator in the assigned group can second `max_candidate_depth` + // candidates). The prospective-parachains subsystem assumes that the number of para forks is + // limited by collator-protocol and backing subsystems. In practice, this is a constant which + // can only be altered by sudo or governance. + // 2. `expected_count` is equal to the number of cores a para is scheduled on (in an elastic + // scaling scenario). For non-elastic-scaling, this is just 1. In practice, this should be a + // small number (1-3), capped by the total number of available cores (a constant alterable + // only via governance/sudo). + fn find_backable_chain_inner( + &self, + base_node: NodePointer, + expected_count: u32, + remaining_count: u32, + pred: &dyn Fn(&CandidateHash) -> bool, + accumulator: &mut Vec, + ) -> Vec { + if remaining_count == 0 { + // The best option is the chain we've accumulated so far. + return accumulator.to_vec(); + } - // TODO [now]: taking the first selection might introduce bias - // or become gameable. - // - // For plausibly unique parachains, this shouldn't matter much. - // figure out alternative selection criteria? - match base_node { + let children: Vec<_> = match base_node { NodePointer::Root => self .nodes .iter() - .take_while(|n| n.parent == NodePointer::Root) - .filter(|n| self.scope.get_pending_availability(&n.candidate_hash).is_none()) - .filter(|n| pred(&n.candidate_hash)) - .map(|n| n.candidate_hash) - .next(), - NodePointer::Storage(ptr) => self.nodes[ptr] - .children - .iter() - .filter(|n| self.scope.get_pending_availability(&n.1).is_none()) - .filter(|n| pred(&n.1)) - .map(|n| n.1) - .next(), + .enumerate() + .take_while(|(_, n)| n.parent == NodePointer::Root) + .filter(|(_, n)| self.scope.get_pending_availability(&n.candidate_hash).is_none()) + .filter(|(_, n)| pred(&n.candidate_hash)) + .map(|(ptr, n)| (NodePointer::Storage(ptr), n.candidate_hash)) + .collect(), + NodePointer::Storage(base_node_ptr) => { + let base_node = &self.nodes[base_node_ptr]; + + base_node + .children + .iter() + .filter(|(_, hash)| self.scope.get_pending_availability(&hash).is_none()) + .filter(|(_, hash)| pred(&hash)) + .map(|(ptr, hash)| (*ptr, *hash)) + .collect() + }, + }; + + let mut best_result = accumulator.clone(); + for (child_ptr, child_hash) in children { + accumulator.push(child_hash); + + let result = self.find_backable_chain_inner( + child_ptr, + expected_count, + remaining_count - 1, + &pred, + accumulator, + ); + + accumulator.pop(); + + // Short-circuit the search if we've found the right length. Otherwise, we'll + // search for a max. + // Taking the first best selection doesn't introduce bias or become gameable, + // because `find_ancestor_path` uses a `HashSet` to track the ancestors, which + // makes the order in which ancestors are visited non-deterministic. + if result.len() == expected_count as usize { + return result + } else if best_result.len() < result.len() { + best_result = result; + } + } + + best_result + } + + // Orders the ancestors into a viable path from root to the last one. + // Returns a pointer to the last node in the path. + // We assume that the ancestors form a chain (that the + // av-cores do not back parachain forks), None is returned otherwise. + // If we cannot use all ancestors, stop at the first found hole in the chain. This usually + // translates to a timed out candidate. + fn find_ancestor_path(&self, mut ancestors: Ancestors) -> Option { + // The number of elements in the path we've processed so far. + let mut depth = 0; + let mut last_node = NodePointer::Root; + let mut next_node: Option = Some(NodePointer::Root); + + while let Some(node) = next_node { + if depth > self.scope.max_depth { + return None; + } + + last_node = node; + + next_node = match node { + NodePointer::Root => { + let children = self + .nodes + .iter() + .enumerate() + .take_while(|n| n.1.parent == NodePointer::Root) + .map(|(index, node)| (NodePointer::Storage(index), node.candidate_hash)) + .collect::>(); + + self.find_valid_child(&mut ancestors, children.iter()).ok()? + }, + NodePointer::Storage(ptr) => { + let children = self.nodes.get(ptr).and_then(|n| Some(n.children.iter())); + if let Some(children) = children { + self.find_valid_child(&mut ancestors, children).ok()? + } else { + None + } + }, + }; + + depth += 1; + } + + Some(last_node) + } + + // Find a node from the given iterator which is present in the ancestors + // collection. If there are multiple such nodes, return an error and log a warning. We don't + // accept forks in a parachain to be backed. The supplied ancestors should all form a chain. + // If there is no such node, return None. + fn find_valid_child<'a>( + &self, + ancestors: &'a mut Ancestors, + nodes: impl Iterator + 'a, + ) -> Result, ()> { + let mut possible_children = + nodes.filter_map(|(node_ptr, hash)| match ancestors.remove(&hash) { + true => Some(node_ptr), + false => None, + }); + + // We don't accept forks in a parachain to be backed. The supplied ancestors + // should all form a chain. + let next = possible_children.next(); + if let Some(second_child) = possible_children.next() { + if let (Some(NodePointer::Storage(first_child)), NodePointer::Storage(second_child)) = + (next, second_child) + { + gum::error!( + target: LOG_TARGET, + para_id = ?self.scope.para, + relay_parent = ?self.scope.relay_parent, + "Trying to find new backable candidates for a parachain for which we've backed a fork.\ + This is a bug and the runtime should not have allowed it.\n\ + Backed candidates with the same parent: {}, {}", + self.nodes[*first_child].candidate_hash, + self.nodes[*second_child].candidate_hash, + ); + } + + Err(()) + } else { + Ok(next.copied()) } } @@ -987,6 +1153,17 @@ mod tests { use polkadot_node_subsystem_util::inclusion_emulator::InboundHrmpLimitations; use polkadot_primitives::{BlockNumber, CandidateCommitments, CandidateDescriptor, HeadData}; use polkadot_primitives_test_helpers as test_helpers; + use rstest::rstest; + use std::iter; + + impl NodePointer { + fn unwrap_idx(self) -> usize { + match self { + NodePointer::Root => panic!("Unexpected root"), + NodePointer::Storage(index) => index, + } + } + } fn make_constraints( min_relay_parent_number: BlockNumber, @@ -1471,6 +1648,373 @@ mod tests { assert_eq!(tree.nodes[1].parent, NodePointer::Storage(0)); } + #[test] + fn test_find_ancestor_path_and_find_backable_chain_empty_tree() { + let para_id = ParaId::from(5u32); + let relay_parent = Hash::repeat_byte(1); + let required_parent: HeadData = vec![0xff].into(); + let max_depth = 10; + + // Empty tree + let storage = CandidateStorage::new(); + let base_constraints = make_constraints(0, vec![0], required_parent.clone()); + + let relay_parent_info = + RelayChainBlockInfo { number: 0, hash: relay_parent, storage_root: Hash::zero() }; + + let scope = Scope::with_ancestors( + para_id, + relay_parent_info, + base_constraints, + vec![], + max_depth, + vec![], + ) + .unwrap(); + let tree = FragmentTree::populate(scope, &storage); + assert_eq!(tree.candidates().collect::>().len(), 0); + assert_eq!(tree.nodes.len(), 0); + + assert_eq!(tree.find_ancestor_path(Ancestors::new()).unwrap(), NodePointer::Root); + assert_eq!(tree.find_backable_chain(Ancestors::new(), 2, |_| true), vec![]); + // Invalid candidate. + let ancestors: Ancestors = [CandidateHash::default()].into_iter().collect(); + assert_eq!(tree.find_ancestor_path(ancestors.clone()), Some(NodePointer::Root)); + assert_eq!(tree.find_backable_chain(ancestors, 2, |_| true), vec![]); + } + + #[rstest] + #[case(true, 13)] + #[case(false, 8)] + // The tree with no cycles looks like: + // Make a tree that looks like this (note that there's no cycle): + // +-(root)-+ + // | | + // +----0---+ 7 + // | | + // 1----+ 5 + // | | + // | | + // 2 6 + // | + // 3 + // | + // 4 + // + // The tree with cycles is the same as the first but has a cycle from 4 back to the state + // produced by 0 (It's bounded by the max_depth + 1). + // +-(root)-+ + // | | + // +----0---+ 7 + // | | + // 1----+ 5 + // | | + // | | + // 2 6 + // | + // 3 + // | + // 4---+ + // | | + // 1 5 + // | + // 2 + // | + // 3 + fn test_find_ancestor_path_and_find_backable_chain( + #[case] has_cycle: bool, + #[case] expected_node_count: usize, + ) { + let para_id = ParaId::from(5u32); + let relay_parent = Hash::repeat_byte(1); + let required_parent: HeadData = vec![0xff].into(); + let max_depth = 7; + let relay_parent_number = 0; + let relay_parent_storage_root = Hash::repeat_byte(69); + + let mut candidates = vec![]; + + // Candidate 0 + candidates.push(make_committed_candidate( + para_id, + relay_parent, + 0, + required_parent.clone(), + vec![0].into(), + 0, + )); + // Candidate 1 + candidates.push(make_committed_candidate( + para_id, + relay_parent, + 0, + vec![0].into(), + vec![1].into(), + 0, + )); + // Candidate 2 + candidates.push(make_committed_candidate( + para_id, + relay_parent, + 0, + vec![1].into(), + vec![2].into(), + 0, + )); + // Candidate 3 + candidates.push(make_committed_candidate( + para_id, + relay_parent, + 0, + vec![2].into(), + vec![3].into(), + 0, + )); + // Candidate 4 + candidates.push(make_committed_candidate( + para_id, + relay_parent, + 0, + vec![3].into(), + vec![4].into(), + 0, + )); + // Candidate 5 + candidates.push(make_committed_candidate( + para_id, + relay_parent, + 0, + vec![0].into(), + vec![5].into(), + 0, + )); + // Candidate 6 + candidates.push(make_committed_candidate( + para_id, + relay_parent, + 0, + vec![1].into(), + vec![6].into(), + 0, + )); + // Candidate 7 + candidates.push(make_committed_candidate( + para_id, + relay_parent, + 0, + required_parent.clone(), + vec![7].into(), + 0, + )); + + if has_cycle { + candidates[4] = make_committed_candidate( + para_id, + relay_parent, + 0, + vec![3].into(), + vec![0].into(), // put the cycle here back to the output state of 0. + 0, + ); + } + + let base_constraints = make_constraints(0, vec![0], required_parent.clone()); + let mut storage = CandidateStorage::new(); + + let relay_parent_info = RelayChainBlockInfo { + number: relay_parent_number, + hash: relay_parent, + storage_root: relay_parent_storage_root, + }; + + for (pvd, candidate) in candidates.iter() { + storage.add_candidate(candidate.clone(), pvd.clone()).unwrap(); + } + let candidates = + candidates.into_iter().map(|(_pvd, candidate)| candidate).collect::>(); + let scope = Scope::with_ancestors( + para_id, + relay_parent_info, + base_constraints, + vec![], + max_depth, + vec![], + ) + .unwrap(); + let tree = FragmentTree::populate(scope, &storage); + + assert_eq!(tree.candidates().collect::>().len(), candidates.len()); + assert_eq!(tree.nodes.len(), expected_node_count); + + // Do some common tests on both trees. + { + // No ancestors supplied. + assert_eq!(tree.find_ancestor_path(Ancestors::new()).unwrap(), NodePointer::Root); + assert_eq!( + tree.find_backable_chain(Ancestors::new(), 4, |_| true), + [0, 1, 2, 3].into_iter().map(|i| candidates[i].hash()).collect::>() + ); + // Ancestor which is not part of the tree. Will be ignored. + let ancestors: Ancestors = [CandidateHash::default()].into_iter().collect(); + assert_eq!(tree.find_ancestor_path(ancestors.clone()).unwrap(), NodePointer::Root); + assert_eq!( + tree.find_backable_chain(ancestors, 4, |_| true), + [0, 1, 2, 3].into_iter().map(|i| candidates[i].hash()).collect::>() + ); + // A chain fork. + let ancestors: Ancestors = + [(candidates[0].hash()), (candidates[7].hash())].into_iter().collect(); + assert_eq!(tree.find_ancestor_path(ancestors.clone()), None); + assert_eq!(tree.find_backable_chain(ancestors, 1, |_| true), vec![]); + + // Ancestors which are part of the tree but don't form a path. Will be ignored. + let ancestors: Ancestors = + [candidates[1].hash(), candidates[2].hash()].into_iter().collect(); + assert_eq!(tree.find_ancestor_path(ancestors.clone()).unwrap(), NodePointer::Root); + assert_eq!( + tree.find_backable_chain(ancestors, 4, |_| true), + [0, 1, 2, 3].into_iter().map(|i| candidates[i].hash()).collect::>() + ); + + // Valid ancestors. + let ancestors: Ancestors = [candidates[7].hash()].into_iter().collect(); + let res = tree.find_ancestor_path(ancestors.clone()).unwrap(); + let candidate = &tree.nodes[res.unwrap_idx()]; + assert_eq!(candidate.candidate_hash, candidates[7].hash()); + assert_eq!(tree.find_backable_chain(ancestors, 1, |_| true), vec![]); + + let ancestors: Ancestors = + [candidates[2].hash(), candidates[0].hash(), candidates[1].hash()] + .into_iter() + .collect(); + let res = tree.find_ancestor_path(ancestors.clone()).unwrap(); + let candidate = &tree.nodes[res.unwrap_idx()]; + assert_eq!(candidate.candidate_hash, candidates[2].hash()); + assert_eq!( + tree.find_backable_chain(ancestors.clone(), 2, |_| true), + [3, 4].into_iter().map(|i| candidates[i].hash()).collect::>() + ); + + // Valid ancestors with candidates which have been omitted due to timeouts + let ancestors: Ancestors = + [candidates[0].hash(), candidates[2].hash()].into_iter().collect(); + let res = tree.find_ancestor_path(ancestors.clone()).unwrap(); + let candidate = &tree.nodes[res.unwrap_idx()]; + assert_eq!(candidate.candidate_hash, candidates[0].hash()); + assert_eq!( + tree.find_backable_chain(ancestors, 3, |_| true), + [1, 2, 3].into_iter().map(|i| candidates[i].hash()).collect::>() + ); + + let ancestors: Ancestors = + [candidates[0].hash(), candidates[1].hash(), candidates[3].hash()] + .into_iter() + .collect(); + let res = tree.find_ancestor_path(ancestors.clone()).unwrap(); + let candidate = &tree.nodes[res.unwrap_idx()]; + assert_eq!(candidate.candidate_hash, candidates[1].hash()); + if has_cycle { + assert_eq!( + tree.find_backable_chain(ancestors, 2, |_| true), + [2, 3].into_iter().map(|i| candidates[i].hash()).collect::>() + ); + } else { + assert_eq!( + tree.find_backable_chain(ancestors, 4, |_| true), + [2, 3, 4].into_iter().map(|i| candidates[i].hash()).collect::>() + ); + } + + let ancestors: Ancestors = + [candidates[1].hash(), candidates[2].hash()].into_iter().collect(); + let res = tree.find_ancestor_path(ancestors.clone()).unwrap(); + assert_eq!(res, NodePointer::Root); + assert_eq!( + tree.find_backable_chain(ancestors, 4, |_| true), + [0, 1, 2, 3].into_iter().map(|i| candidates[i].hash()).collect::>() + ); + + // Requested count is 0. + assert_eq!(tree.find_backable_chain(Ancestors::new(), 0, |_| true), vec![]); + + let ancestors: Ancestors = + [candidates[2].hash(), candidates[0].hash(), candidates[1].hash()] + .into_iter() + .collect(); + assert_eq!(tree.find_backable_chain(ancestors, 0, |_| true), vec![]); + + let ancestors: Ancestors = + [candidates[2].hash(), candidates[0].hash()].into_iter().collect(); + assert_eq!(tree.find_backable_chain(ancestors, 0, |_| true), vec![]); + } + + // Now do some tests only on the tree with cycles + if has_cycle { + // Exceeds the maximum tree depth. 0-1-2-3-4-1-2-3-4, when the tree stops at + // 0-1-2-3-4-1-2-3. + let ancestors: Ancestors = [ + candidates[0].hash(), + candidates[1].hash(), + candidates[2].hash(), + candidates[3].hash(), + candidates[4].hash(), + ] + .into_iter() + .collect(); + let res = tree.find_ancestor_path(ancestors.clone()).unwrap(); + let candidate = &tree.nodes[res.unwrap_idx()]; + assert_eq!(candidate.candidate_hash, candidates[4].hash()); + assert_eq!( + tree.find_backable_chain(ancestors, 4, |_| true), + [1, 2, 3].into_iter().map(|i| candidates[i].hash()).collect::>() + ); + + // 0-1-2. + let ancestors: Ancestors = + [candidates[0].hash(), candidates[1].hash(), candidates[2].hash()] + .into_iter() + .collect(); + let res = tree.find_ancestor_path(ancestors.clone()).unwrap(); + let candidate = &tree.nodes[res.unwrap_idx()]; + assert_eq!(candidate.candidate_hash, candidates[2].hash()); + assert_eq!( + tree.find_backable_chain(ancestors.clone(), 1, |_| true), + [3].into_iter().map(|i| candidates[i].hash()).collect::>() + ); + assert_eq!( + tree.find_backable_chain(ancestors, 5, |_| true), + [3, 4, 1, 2, 3].into_iter().map(|i| candidates[i].hash()).collect::>() + ); + + // 0-1 + let ancestors: Ancestors = + [candidates[0].hash(), candidates[1].hash()].into_iter().collect(); + let res = tree.find_ancestor_path(ancestors.clone()).unwrap(); + let candidate = &tree.nodes[res.unwrap_idx()]; + assert_eq!(candidate.candidate_hash, candidates[1].hash()); + assert_eq!( + tree.find_backable_chain(ancestors, 6, |_| true), + [2, 3, 4, 1, 2, 3].into_iter().map(|i| candidates[i].hash()).collect::>(), + ); + + // For 0-1-2-3-4-5, there's more than 1 way of finding this path in + // the tree. `None` should be returned. The runtime should not have accepted this. + let ancestors: Ancestors = [ + candidates[0].hash(), + candidates[1].hash(), + candidates[2].hash(), + candidates[3].hash(), + candidates[4].hash(), + candidates[5].hash(), + ] + .into_iter() + .collect(); + let res = tree.find_ancestor_path(ancestors.clone()); + assert_eq!(res, None); + assert_eq!(tree.find_backable_chain(ancestors, 1, |_| true), vec![]); + } + } + #[test] fn graceful_cycle_of_0() { let mut storage = CandidateStorage::new(); @@ -1524,6 +2068,25 @@ mod tests { assert_eq!(tree.nodes[2].candidate_hash, candidate_a_hash); assert_eq!(tree.nodes[3].candidate_hash, candidate_a_hash); assert_eq!(tree.nodes[4].candidate_hash, candidate_a_hash); + + for count in 1..10 { + assert_eq!( + tree.find_backable_chain(Ancestors::new(), count, |_| true), + iter::repeat(candidate_a_hash) + .take(std::cmp::min(count as usize, max_depth + 1)) + .collect::>() + ); + assert_eq!( + tree.find_backable_chain( + [candidate_a_hash].into_iter().collect(), + count - 1, + |_| true + ), + iter::repeat(candidate_a_hash) + .take(std::cmp::min(count as usize - 1, max_depth)) + .collect::>() + ); + } } #[test] @@ -1591,6 +2154,42 @@ mod tests { assert_eq!(tree.nodes[2].candidate_hash, candidate_a_hash); assert_eq!(tree.nodes[3].candidate_hash, candidate_b_hash); assert_eq!(tree.nodes[4].candidate_hash, candidate_a_hash); + + assert_eq!(tree.find_backable_chain(Ancestors::new(), 1, |_| true), vec![candidate_a_hash],); + assert_eq!( + tree.find_backable_chain(Ancestors::new(), 2, |_| true), + vec![candidate_a_hash, candidate_b_hash], + ); + assert_eq!( + tree.find_backable_chain(Ancestors::new(), 3, |_| true), + vec![candidate_a_hash, candidate_b_hash, candidate_a_hash], + ); + assert_eq!( + tree.find_backable_chain([candidate_a_hash].into_iter().collect(), 2, |_| true), + vec![candidate_b_hash, candidate_a_hash], + ); + + assert_eq!( + tree.find_backable_chain(Ancestors::new(), 6, |_| true), + vec![ + candidate_a_hash, + candidate_b_hash, + candidate_a_hash, + candidate_b_hash, + candidate_a_hash + ], + ); + + for count in 3..7 { + assert_eq!( + tree.find_backable_chain( + [candidate_a_hash, candidate_b_hash].into_iter().collect(), + count, + |_| true + ), + vec![candidate_a_hash, candidate_b_hash, candidate_a_hash], + ); + } } #[test] diff --git a/polkadot/node/core/prospective-parachains/src/lib.rs b/polkadot/node/core/prospective-parachains/src/lib.rs index aba3d092a4182c55ba32a1df5650277b5adbbec2..f5d50fb74faca5fec78c47aa6a653a1a9fe48699 100644 --- a/polkadot/node/core/prospective-parachains/src/lib.rs +++ b/polkadot/node/core/prospective-parachains/src/lib.rs @@ -35,9 +35,10 @@ use futures::{channel::oneshot, prelude::*}; use polkadot_node_subsystem::{ messages::{ - ChainApiMessage, FragmentTreeMembership, HypotheticalCandidate, - HypotheticalFrontierRequest, IntroduceCandidateRequest, ProspectiveParachainsMessage, - ProspectiveValidationDataRequest, RuntimeApiMessage, RuntimeApiRequest, + Ancestors, ChainApiMessage, FragmentTreeMembership, HypotheticalCandidate, + HypotheticalFrontierRequest, IntroduceCandidateRequest, ParentHeadData, + ProspectiveParachainsMessage, ProspectiveValidationDataRequest, RuntimeApiMessage, + RuntimeApiRequest, }, overseer, ActiveLeavesUpdate, FromOrchestra, OverseerSignal, SpawnedSubsystem, SubsystemError, }; @@ -146,12 +147,13 @@ async fn run_iteration( handle_candidate_seconded(view, para, candidate_hash), ProspectiveParachainsMessage::CandidateBacked(para, candidate_hash) => handle_candidate_backed(&mut *ctx, view, para, candidate_hash).await?, - ProspectiveParachainsMessage::GetBackableCandidate( + ProspectiveParachainsMessage::GetBackableCandidates( relay_parent, para, - required_path, + count, + ancestors, tx, - ) => answer_get_backable_candidate(&view, relay_parent, para, required_path, tx), + ) => answer_get_backable_candidates(&view, relay_parent, para, count, ancestors, tx), ProspectiveParachainsMessage::GetHypotheticalFrontier(request, tx) => answer_hypothetical_frontier_request(&view, request, tx), ProspectiveParachainsMessage::GetTreeMembership(para, candidate, tx) => @@ -290,7 +292,7 @@ async fn handle_active_leaves_update( ) .expect("ancestors are provided in reverse order and correctly; qed"); - gum::debug!( + gum::trace!( target: LOG_TARGET, relay_parent = ?hash, min_relay_parent = scope.earliest_relay_parent().number, @@ -552,12 +554,13 @@ async fn handle_candidate_backed( Ok(()) } -fn answer_get_backable_candidate( +fn answer_get_backable_candidates( view: &View, relay_parent: Hash, para: ParaId, - required_path: Vec, - tx: oneshot::Sender>, + count: u32, + ancestors: Ancestors, + tx: oneshot::Sender>, ) { let data = match view.active_leaves.get(&relay_parent) { None => { @@ -568,7 +571,7 @@ fn answer_get_backable_candidate( "Requested backable candidate for inactive relay-parent." ); - let _ = tx.send(None); + let _ = tx.send(vec![]); return }, Some(d) => d, @@ -583,7 +586,7 @@ fn answer_get_backable_candidate( "Requested backable candidate for inactive para." ); - let _ = tx.send(None); + let _ = tx.send(vec![]); return }, Some(tree) => tree, @@ -598,46 +601,49 @@ fn answer_get_backable_candidate( "No candidate storage for active para", ); - let _ = tx.send(None); + let _ = tx.send(vec![]); return }, Some(s) => s, }; - let Some(child_hash) = - tree.select_child(&required_path, |candidate| storage.is_backed(candidate)) - else { + let backable_candidates: Vec<_> = tree + .find_backable_chain(ancestors.clone(), count, |candidate| storage.is_backed(candidate)) + .into_iter() + .filter_map(|child_hash| { + storage.relay_parent_by_candidate_hash(&child_hash).map_or_else( + || { + gum::error!( + target: LOG_TARGET, + ?child_hash, + para_id = ?para, + "Candidate is present in fragment tree but not in candidate's storage!", + ); + None + }, + |parent_hash| Some((child_hash, parent_hash)), + ) + }) + .collect(); + + if backable_candidates.is_empty() { gum::trace!( target: LOG_TARGET, - ?required_path, + ?ancestors, para_id = ?para, %relay_parent, "Could not find any backable candidate", ); - - let _ = tx.send(None); - return - }; - let Some(candidate_relay_parent) = storage.relay_parent_by_candidate_hash(&child_hash) else { - gum::error!( + } else { + gum::trace!( target: LOG_TARGET, - ?child_hash, - para_id = ?para, - "Candidate is present in fragment tree but not in candidate's storage!", + ?relay_parent, + ?backable_candidates, + "Found backable candidates", ); - let _ = tx.send(None); - return - }; - - gum::trace!( - target: LOG_TARGET, - ?relay_parent, - candidate_hash = ?child_hash, - ?candidate_relay_parent, - "Found backable candidate", - ); + } - let _ = tx.send(Some((child_hash, candidate_relay_parent))); + let _ = tx.send(backable_candidates); } fn answer_hypothetical_frontier_request( @@ -759,8 +765,14 @@ fn answer_prospective_validation_data_request( Some(s) => s, }; - let mut head_data = - storage.head_data_by_hash(&request.parent_head_data_hash).map(|x| x.clone()); + let (mut head_data, parent_head_data_hash) = match request.parent_head_data { + ParentHeadData::OnlyHash(parent_head_data_hash) => ( + storage.head_data_by_hash(&parent_head_data_hash).map(|x| x.clone()), + parent_head_data_hash, + ), + ParentHeadData::WithData { head_data, hash } => (Some(head_data), hash), + }; + let mut relay_parent_info = None; let mut max_pov_size = None; @@ -778,7 +790,7 @@ fn answer_prospective_validation_data_request( } if head_data.is_none() { let required_parent = &fragment_tree.scope().base_constraints().required_parent; - if required_parent.hash() == request.parent_head_data_hash { + if required_parent.hash() == parent_head_data_hash { head_data = Some(required_parent.clone()); } } diff --git a/polkadot/node/core/prospective-parachains/src/tests.rs b/polkadot/node/core/prospective-parachains/src/tests.rs index 7e369245c0e1587b405eb4516343610aa8c9a320..8989911a33239d3b6f775bcf6271c6f40d9a0bac 100644 --- a/polkadot/node/core/prospective-parachains/src/tests.rs +++ b/polkadot/node/core/prospective-parachains/src/tests.rs @@ -19,7 +19,7 @@ use assert_matches::assert_matches; use polkadot_node_subsystem::{ errors::RuntimeApiError, messages::{ - AllMessages, HypotheticalFrontierRequest, ProspectiveParachainsMessage, + AllMessages, HypotheticalFrontierRequest, ParentHeadData, ProspectiveParachainsMessage, ProspectiveValidationDataRequest, }, }; @@ -403,25 +403,24 @@ async fn get_membership( assert_eq!(resp, expected_membership_response); } -async fn get_backable_candidate( +async fn get_backable_candidates( virtual_overseer: &mut VirtualOverseer, leaf: &TestLeaf, para_id: ParaId, - required_path: Vec, - expected_result: Option<(CandidateHash, Hash)>, + ancestors: Ancestors, + count: u32, + expected_result: Vec<(CandidateHash, Hash)>, ) { let (tx, rx) = oneshot::channel(); virtual_overseer .send(overseer::FromOrchestra::Communication { - msg: ProspectiveParachainsMessage::GetBackableCandidate( - leaf.hash, - para_id, - required_path, - tx, + msg: ProspectiveParachainsMessage::GetBackableCandidates( + leaf.hash, para_id, count, ancestors, tx, ), }) .await; let resp = rx.await.unwrap(); + assert_eq!(resp.len(), expected_result.len()); assert_eq!(resp, expected_result); } @@ -469,7 +468,7 @@ async fn get_pvd( let request = ProspectiveValidationDataRequest { para_id, candidate_relay_parent, - parent_head_data_hash: parent_head_data.hash(), + parent_head_data: ParentHeadData::OnlyHash(parent_head_data.hash()), }; let (tx, rx) = oneshot::channel(); virtual_overseer @@ -849,9 +848,9 @@ fn check_candidate_on_multiple_forks() { assert_eq!(view.candidate_storage.get(&2.into()).unwrap().len(), (0, 0)); } -// Backs some candidates and tests `GetBackableCandidate`. +// Backs some candidates and tests `GetBackableCandidates` when requesting a single candidate. #[test] -fn check_backable_query() { +fn check_backable_query_single_candidate() { let test_state = TestState::default(); let view = test_harness(|mut virtual_overseer| async move { // Leaf A @@ -896,12 +895,31 @@ fn check_backable_query() { introduce_candidate(&mut virtual_overseer, candidate_b.clone(), pvd_b).await; // Should not get any backable candidates. - get_backable_candidate( + get_backable_candidates( + &mut virtual_overseer, + &leaf_a, + 1.into(), + vec![candidate_hash_a].into_iter().collect(), + 1, + vec![], + ) + .await; + get_backable_candidates( &mut virtual_overseer, &leaf_a, 1.into(), - vec![candidate_hash_a], - None, + vec![candidate_hash_a].into_iter().collect(), + 0, + vec![], + ) + .await; + get_backable_candidates( + &mut virtual_overseer, + &leaf_a, + 1.into(), + Ancestors::new(), + 0, + vec![], ) .await; @@ -910,12 +928,13 @@ fn check_backable_query() { second_candidate(&mut virtual_overseer, candidate_b.clone()).await; // Should not get any backable candidates. - get_backable_candidate( + get_backable_candidates( &mut virtual_overseer, &leaf_a, 1.into(), - vec![candidate_hash_a], - None, + vec![candidate_hash_a].into_iter().collect(), + 1, + vec![], ) .await; @@ -923,31 +942,54 @@ fn check_backable_query() { back_candidate(&mut virtual_overseer, &candidate_a, candidate_hash_a).await; back_candidate(&mut virtual_overseer, &candidate_b, candidate_hash_b).await; + // Should not get any backable candidates for the other para. + get_backable_candidates( + &mut virtual_overseer, + &leaf_a, + 2.into(), + Ancestors::new(), + 1, + vec![], + ) + .await; + get_backable_candidates( + &mut virtual_overseer, + &leaf_a, + 2.into(), + vec![candidate_hash_a].into_iter().collect(), + 1, + vec![], + ) + .await; + // Get backable candidate. - get_backable_candidate( + get_backable_candidates( &mut virtual_overseer, &leaf_a, 1.into(), - vec![], - Some((candidate_hash_a, leaf_a.hash)), + Ancestors::new(), + 1, + vec![(candidate_hash_a, leaf_a.hash)], ) .await; - get_backable_candidate( + get_backable_candidates( &mut virtual_overseer, &leaf_a, 1.into(), - vec![candidate_hash_a], - Some((candidate_hash_b, leaf_a.hash)), + vec![candidate_hash_a].into_iter().collect(), + 1, + vec![(candidate_hash_b, leaf_a.hash)], ) .await; - // Should not get anything at the wrong path. - get_backable_candidate( + // Wrong path + get_backable_candidates( &mut virtual_overseer, &leaf_a, 1.into(), - vec![candidate_hash_b], - None, + vec![candidate_hash_b].into_iter().collect(), + 1, + vec![(candidate_hash_a, leaf_a.hash)], ) .await; @@ -961,6 +1003,391 @@ fn check_backable_query() { assert_eq!(view.candidate_storage.get(&2.into()).unwrap().len(), (0, 0)); } +// Backs some candidates and tests `GetBackableCandidates` when requesting a multiple candidates. +#[test] +fn check_backable_query_multiple_candidates() { + macro_rules! make_and_back_candidate { + ($test_state:ident, $virtual_overseer:ident, $leaf:ident, $parent:expr, $index:expr) => {{ + let (mut candidate, pvd) = make_candidate( + $leaf.hash, + $leaf.number, + 1.into(), + $parent.commitments.head_data.clone(), + HeadData(vec![$index]), + $test_state.validation_code_hash, + ); + // Set a field to make this candidate unique. + candidate.descriptor.para_head = Hash::from_low_u64_le($index); + let candidate_hash = candidate.hash(); + introduce_candidate(&mut $virtual_overseer, candidate.clone(), pvd).await; + second_candidate(&mut $virtual_overseer, candidate.clone()).await; + back_candidate(&mut $virtual_overseer, &candidate, candidate_hash).await; + + (candidate, candidate_hash) + }}; + } + + // Parachain 1 looks like this: + // +---A----+ + // | | + // +----B---+ C + // | | | | + // D E F H + // | | + // G I + // | + // J + { + let test_state = TestState::default(); + let view = test_harness(|mut virtual_overseer| async move { + // Leaf A + let leaf_a = TestLeaf { + number: 100, + hash: Hash::from_low_u64_be(130), + para_data: vec![ + (1.into(), PerParaData::new(97, HeadData(vec![1, 2, 3]))), + (2.into(), PerParaData::new(100, HeadData(vec![2, 3, 4]))), + ], + }; + + // Activate leaves. + activate_leaf(&mut virtual_overseer, &leaf_a, &test_state).await; + + // Candidate A + let (candidate_a, pvd_a) = make_candidate( + leaf_a.hash, + leaf_a.number, + 1.into(), + HeadData(vec![1, 2, 3]), + HeadData(vec![1]), + test_state.validation_code_hash, + ); + let candidate_hash_a = candidate_a.hash(); + introduce_candidate(&mut virtual_overseer, candidate_a.clone(), pvd_a).await; + second_candidate(&mut virtual_overseer, candidate_a.clone()).await; + back_candidate(&mut virtual_overseer, &candidate_a, candidate_hash_a).await; + + let (candidate_b, candidate_hash_b) = + make_and_back_candidate!(test_state, virtual_overseer, leaf_a, &candidate_a, 2); + let (candidate_c, candidate_hash_c) = + make_and_back_candidate!(test_state, virtual_overseer, leaf_a, &candidate_a, 3); + let (_candidate_d, candidate_hash_d) = + make_and_back_candidate!(test_state, virtual_overseer, leaf_a, &candidate_b, 4); + let (_candidate_e, candidate_hash_e) = + make_and_back_candidate!(test_state, virtual_overseer, leaf_a, &candidate_b, 5); + let (candidate_f, candidate_hash_f) = + make_and_back_candidate!(test_state, virtual_overseer, leaf_a, &candidate_b, 6); + let (_candidate_g, candidate_hash_g) = + make_and_back_candidate!(test_state, virtual_overseer, leaf_a, &candidate_f, 7); + let (candidate_h, candidate_hash_h) = + make_and_back_candidate!(test_state, virtual_overseer, leaf_a, &candidate_c, 8); + let (candidate_i, candidate_hash_i) = + make_and_back_candidate!(test_state, virtual_overseer, leaf_a, &candidate_h, 9); + let (_candidate_j, candidate_hash_j) = + make_and_back_candidate!(test_state, virtual_overseer, leaf_a, &candidate_i, 10); + + // Should not get any backable candidates for the other para. + get_backable_candidates( + &mut virtual_overseer, + &leaf_a, + 2.into(), + Ancestors::new(), + 1, + vec![], + ) + .await; + get_backable_candidates( + &mut virtual_overseer, + &leaf_a, + 2.into(), + Ancestors::new(), + 5, + vec![], + ) + .await; + get_backable_candidates( + &mut virtual_overseer, + &leaf_a, + 2.into(), + vec![candidate_hash_a].into_iter().collect(), + 1, + vec![], + ) + .await; + + // Test various scenarios with various counts. + + // empty required_path + { + get_backable_candidates( + &mut virtual_overseer, + &leaf_a, + 1.into(), + Ancestors::new(), + 1, + vec![(candidate_hash_a, leaf_a.hash)], + ) + .await; + get_backable_candidates( + &mut virtual_overseer, + &leaf_a, + 1.into(), + Ancestors::new(), + 4, + vec![ + (candidate_hash_a, leaf_a.hash), + (candidate_hash_b, leaf_a.hash), + (candidate_hash_f, leaf_a.hash), + (candidate_hash_g, leaf_a.hash), + ], + ) + .await; + } + + // required path of 1 + { + get_backable_candidates( + &mut virtual_overseer, + &leaf_a, + 1.into(), + vec![candidate_hash_a].into_iter().collect(), + 1, + vec![(candidate_hash_b, leaf_a.hash)], + ) + .await; + get_backable_candidates( + &mut virtual_overseer, + &leaf_a, + 1.into(), + vec![candidate_hash_a].into_iter().collect(), + 3, + vec![ + (candidate_hash_b, leaf_a.hash), + (candidate_hash_f, leaf_a.hash), + (candidate_hash_g, leaf_a.hash), + ], + ) + .await; + + // If the requested count exceeds the largest chain, return the longest + // chain we can get. + for count in 5..10 { + get_backable_candidates( + &mut virtual_overseer, + &leaf_a, + 1.into(), + vec![candidate_hash_a].into_iter().collect(), + count, + vec![ + (candidate_hash_c, leaf_a.hash), + (candidate_hash_h, leaf_a.hash), + (candidate_hash_i, leaf_a.hash), + (candidate_hash_j, leaf_a.hash), + ], + ) + .await; + } + } + + // required path of 2 and higher + { + get_backable_candidates( + &mut virtual_overseer, + &leaf_a, + 1.into(), + vec![candidate_hash_a, candidate_hash_i, candidate_hash_h, candidate_hash_c] + .into_iter() + .collect(), + 1, + vec![(candidate_hash_j, leaf_a.hash)], + ) + .await; + + get_backable_candidates( + &mut virtual_overseer, + &leaf_a, + 1.into(), + vec![candidate_hash_a, candidate_hash_b].into_iter().collect(), + 1, + vec![(candidate_hash_d, leaf_a.hash)], + ) + .await; + + // If the requested count exceeds the largest chain, return the longest + // chain we can get. + for count in 4..10 { + get_backable_candidates( + &mut virtual_overseer, + &leaf_a, + 1.into(), + vec![candidate_hash_a, candidate_hash_c].into_iter().collect(), + count, + vec![ + (candidate_hash_h, leaf_a.hash), + (candidate_hash_i, leaf_a.hash), + (candidate_hash_j, leaf_a.hash), + ], + ) + .await; + } + } + + // No more candidates in any chain. + { + for count in 1..4 { + get_backable_candidates( + &mut virtual_overseer, + &leaf_a, + 1.into(), + vec![candidate_hash_a, candidate_hash_b, candidate_hash_e] + .into_iter() + .collect(), + count, + vec![], + ) + .await; + + get_backable_candidates( + &mut virtual_overseer, + &leaf_a, + 1.into(), + vec![ + candidate_hash_a, + candidate_hash_c, + candidate_hash_h, + candidate_hash_i, + candidate_hash_j, + ] + .into_iter() + .collect(), + count, + vec![], + ) + .await; + } + } + + // Wrong paths. + get_backable_candidates( + &mut virtual_overseer, + &leaf_a, + 1.into(), + vec![candidate_hash_b].into_iter().collect(), + 1, + vec![(candidate_hash_a, leaf_a.hash)], + ) + .await; + get_backable_candidates( + &mut virtual_overseer, + &leaf_a, + 1.into(), + vec![candidate_hash_b, candidate_hash_f].into_iter().collect(), + 3, + vec![ + (candidate_hash_a, leaf_a.hash), + (candidate_hash_b, leaf_a.hash), + (candidate_hash_d, leaf_a.hash), + ], + ) + .await; + get_backable_candidates( + &mut virtual_overseer, + &leaf_a, + 1.into(), + vec![candidate_hash_a, candidate_hash_h].into_iter().collect(), + 4, + vec![ + (candidate_hash_c, leaf_a.hash), + (candidate_hash_h, leaf_a.hash), + (candidate_hash_i, leaf_a.hash), + (candidate_hash_j, leaf_a.hash), + ], + ) + .await; + get_backable_candidates( + &mut virtual_overseer, + &leaf_a, + 1.into(), + vec![candidate_hash_e, candidate_hash_h].into_iter().collect(), + 2, + vec![(candidate_hash_a, leaf_a.hash), (candidate_hash_b, leaf_a.hash)], + ) + .await; + + get_backable_candidates( + &mut virtual_overseer, + &leaf_a, + 1.into(), + vec![candidate_hash_a, candidate_hash_c, candidate_hash_d].into_iter().collect(), + 2, + vec![(candidate_hash_h, leaf_a.hash), (candidate_hash_i, leaf_a.hash)], + ) + .await; + + // Parachain fork. + get_backable_candidates( + &mut virtual_overseer, + &leaf_a, + 1.into(), + vec![candidate_hash_a, candidate_hash_b, candidate_hash_c].into_iter().collect(), + 1, + vec![], + ) + .await; + + // Non-existent candidate. + get_backable_candidates( + &mut virtual_overseer, + &leaf_a, + 1.into(), + vec![candidate_hash_a, CandidateHash(Hash::from_low_u64_be(100))] + .into_iter() + .collect(), + 2, + vec![(candidate_hash_b, leaf_a.hash), (candidate_hash_d, leaf_a.hash)], + ) + .await; + + // Requested count is zero. + get_backable_candidates( + &mut virtual_overseer, + &leaf_a, + 1.into(), + Ancestors::new(), + 0, + vec![], + ) + .await; + get_backable_candidates( + &mut virtual_overseer, + &leaf_a, + 1.into(), + vec![candidate_hash_a].into_iter().collect(), + 0, + vec![], + ) + .await; + get_backable_candidates( + &mut virtual_overseer, + &leaf_a, + 1.into(), + vec![candidate_hash_a, candidate_hash_b].into_iter().collect(), + 0, + vec![], + ) + .await; + + virtual_overseer + }); + + assert_eq!(view.active_leaves.len(), 1); + assert_eq!(view.candidate_storage.len(), 2); + // 10 candidates and 7 parents on para 1. + assert_eq!(view.candidate_storage.get(&1.into()).unwrap().len(), (7, 10)); + assert_eq!(view.candidate_storage.get(&2.into()).unwrap().len(), (0, 0)); + } +} + // Test depth query. #[test] fn check_hypothetical_frontier_query() { @@ -1257,8 +1684,8 @@ fn check_pvd_query() { assert_eq!(view.candidate_storage.len(), 2); } -// Test simultaneously activating and deactivating leaves, and simultaneously deactivating multiple -// leaves. +// Test simultaneously activating and deactivating leaves, and simultaneously deactivating +// multiple leaves. #[test] fn correctly_updates_leaves() { let test_state = TestState::default(); @@ -1370,7 +1797,10 @@ fn persists_pending_availability_candidate() { test_state.availability_cores = test_state .availability_cores .into_iter() - .filter(|core| core.para_id().map_or(false, |id| id == para_id)) + .filter(|core| match core { + CoreState::Scheduled(scheduled_core) => scheduled_core.para_id == para_id, + _ => false, + }) .collect(); assert_eq!(test_state.availability_cores.len(), 1); @@ -1448,12 +1878,13 @@ fn persists_pending_availability_candidate() { second_candidate(&mut virtual_overseer, candidate_b.clone()).await; back_candidate(&mut virtual_overseer, &candidate_b, candidate_hash_b).await; - get_backable_candidate( + get_backable_candidates( &mut virtual_overseer, &leaf_b, para_id, - vec![candidate_hash_a], - Some((candidate_hash_b, leaf_b_hash)), + vec![candidate_hash_a].into_iter().collect(), + 1, + vec![(candidate_hash_b, leaf_b_hash)], ) .await; @@ -1468,7 +1899,10 @@ fn backwards_compatible() { test_state.availability_cores = test_state .availability_cores .into_iter() - .filter(|core| core.para_id().map_or(false, |id| id == para_id)) + .filter(|core| match core { + CoreState::Scheduled(scheduled_core) => scheduled_core.para_id == para_id, + _ => false, + }) .collect(); assert_eq!(test_state.availability_cores.len(), 1); @@ -1512,12 +1946,13 @@ fn backwards_compatible() { second_candidate(&mut virtual_overseer, candidate_a.clone()).await; back_candidate(&mut virtual_overseer, &candidate_a, candidate_hash_a).await; - get_backable_candidate( + get_backable_candidates( &mut virtual_overseer, &leaf_a, para_id, - vec![], - Some((candidate_hash_a, candidate_relay_parent)), + Ancestors::new(), + 1, + vec![(candidate_hash_a, candidate_relay_parent)], ) .await; @@ -1537,7 +1972,15 @@ fn backwards_compatible() { ) .await; - get_backable_candidate(&mut virtual_overseer, &leaf_b, para_id, vec![], None).await; + get_backable_candidates( + &mut virtual_overseer, + &leaf_b, + para_id, + Ancestors::new(), + 1, + vec![], + ) + .await; virtual_overseer }); @@ -1564,13 +2007,13 @@ fn uses_ancestry_only_within_session() { .await; assert_matches!( - virtual_overseer.recv().await, - AllMessages::RuntimeApi( - RuntimeApiMessage::Request(parent, RuntimeApiRequest::AsyncBackingParams(tx)) - ) if parent == hash => { - tx.send(Ok(AsyncBackingParams { max_candidate_depth: 0, allowed_ancestry_len: ancestry_len })).unwrap(); - } - ); + virtual_overseer.recv().await, + AllMessages::RuntimeApi( + RuntimeApiMessage::Request(parent, RuntimeApiRequest::AsyncBackingParams(tx)) + ) if parent == hash => { + tx.send(Ok(AsyncBackingParams { max_candidate_depth: 0, allowed_ancestry_len: ancestry_len + })).unwrap(); } + ); assert_matches!( virtual_overseer.recv().await, diff --git a/polkadot/node/core/provisioner/Cargo.toml b/polkadot/node/core/provisioner/Cargo.toml index 175980e90a057f136de25ad7091bcaef497f0a5f..ec1a4abb3ece0a3dc8a01e090f9bf3302dde3294 100644 --- a/polkadot/node/core/provisioner/Cargo.toml +++ b/polkadot/node/core/provisioner/Cargo.toml @@ -11,18 +11,20 @@ workspace = true [dependencies] bitvec = { version = "1.0.0", default-features = false, features = ["alloc"] } -futures = "0.3.21" +futures = "0.3.30" gum = { package = "tracing-gum", path = "../../gum" } -thiserror = "1.0.48" +thiserror = { workspace = true } polkadot-primitives = { path = "../../../primitives" } polkadot-node-primitives = { path = "../../primitives" } polkadot-node-subsystem = { path = "../../subsystem" } polkadot-node-subsystem-util = { path = "../../subsystem-util" } futures-timer = "3.0.2" fatality = "0.0.6" +schnellru = "0.2.1" [dev-dependencies] sp-application-crypto = { path = "../../../../substrate/primitives/application-crypto" } sp-keystore = { path = "../../../../substrate/primitives/keystore" } polkadot-node-subsystem-test-helpers = { path = "../../subsystem-test-helpers" } test-helpers = { package = "polkadot-primitives-test-helpers", path = "../../../primitives/test-helpers" } +rstest = "0.18.2" diff --git a/polkadot/node/core/provisioner/src/disputes/prioritized_selection/mod.rs b/polkadot/node/core/provisioner/src/disputes/prioritized_selection/mod.rs index cb55ce39bc89f3eeee3d1cb319351f659eace478..d7a5a8113369fbafb693098003a3f7d43413634d 100644 --- a/polkadot/node/core/provisioner/src/disputes/prioritized_selection/mod.rs +++ b/polkadot/node/core/provisioner/src/disputes/prioritized_selection/mod.rs @@ -52,7 +52,7 @@ pub const MAX_DISPUTE_VOTES_FORWARDED_TO_RUNTIME: usize = 200; /// `dispute-coordinator`. /// /// This value should be less than `MAX_DISPUTE_VOTES_FORWARDED_TO_RUNTIME`. Increase it in case -/// `provisioner` sends too many `QueryCandidateVotes` messages to `dispite-coordinator`. +/// `provisioner` sends too many `QueryCandidateVotes` messages to `dispute-coordinator`. #[cfg(not(test))] const VOTES_SELECTION_BATCH_SIZE: usize = 1_100; #[cfg(test)] diff --git a/polkadot/node/core/provisioner/src/error.rs b/polkadot/node/core/provisioner/src/error.rs index 376d69f276fc892e92828bf994b29f847fae31d0..aae3234c3cc49d19bdaf20b87fa71cf3f3276bfe 100644 --- a/polkadot/node/core/provisioner/src/error.rs +++ b/polkadot/node/core/provisioner/src/error.rs @@ -44,14 +44,17 @@ pub enum Error { #[error("failed to get block number")] CanceledBlockNumber(#[source] oneshot::Canceled), + #[error("failed to get session index")] + CanceledSessionIndex(#[source] oneshot::Canceled), + #[error("failed to get backed candidates")] CanceledBackedCandidates(#[source] oneshot::Canceled), #[error("failed to get votes on dispute")] CanceledCandidateVotes(#[source] oneshot::Canceled), - #[error("failed to get backable candidate from prospective parachains")] - CanceledBackableCandidate(#[source] oneshot::Canceled), + #[error("failed to get backable candidates from prospective parachains")] + CanceledBackableCandidates(#[source] oneshot::Canceled), #[error(transparent)] ChainApi(#[from] ChainApiError), @@ -71,11 +74,6 @@ pub enum Error { #[error("failed to send return message with Inherents")] InherentDataReturnChannel, - #[error( - "backed candidate does not correspond to selected candidate; check logic in provisioner" - )] - BackedCandidateOrderingProblem, - #[fatal] #[error("Failed to spawn background task")] FailedToSpawnBackgroundTask, diff --git a/polkadot/node/core/provisioner/src/lib.rs b/polkadot/node/core/provisioner/src/lib.rs index 3970b8572612da827e7ddda18f46eadcf12f6906..5cfcb96dc2bc710c42400fa49fa888195c79aa48 100644 --- a/polkadot/node/core/provisioner/src/lib.rs +++ b/polkadot/node/core/provisioner/src/lib.rs @@ -24,24 +24,27 @@ use futures::{ channel::oneshot, future::BoxFuture, prelude::*, stream::FuturesUnordered, FutureExt, }; use futures_timer::Delay; +use schnellru::{ByLength, LruMap}; use polkadot_node_subsystem::{ jaeger, messages::{ - CandidateBackingMessage, ChainApiMessage, ProspectiveParachainsMessage, ProvisionableData, - ProvisionerInherentData, ProvisionerMessage, RuntimeApiRequest, + Ancestors, CandidateBackingMessage, ChainApiMessage, ProspectiveParachainsMessage, + ProvisionableData, ProvisionerInherentData, ProvisionerMessage, RuntimeApiRequest, }, overseer, ActivatedLeaf, ActiveLeavesUpdate, FromOrchestra, OverseerSignal, PerLeafSpan, SpawnedSubsystem, SubsystemError, }; use polkadot_node_subsystem_util::{ has_required_runtime, request_availability_cores, request_persisted_validation_data, - runtime::{prospective_parachains_mode, ProspectiveParachainsMode}, + request_session_index_for_child, + runtime::{prospective_parachains_mode, request_node_features, ProspectiveParachainsMode}, TimeoutExt, }; use polkadot_primitives::{ - BackedCandidate, BlockNumber, CandidateHash, CandidateReceipt, CoreState, Hash, Id as ParaId, - OccupiedCoreAssumption, SignedAvailabilityBitfield, ValidatorIndex, + node_features::FeatureIndex, BackedCandidate, BlockNumber, CandidateHash, CandidateReceipt, + CoreIndex, CoreState, Hash, Id as ParaId, NodeFeatures, OccupiedCoreAssumption, SessionIndex, + SignedAvailabilityBitfield, ValidatorIndex, }; use std::collections::{BTreeMap, HashMap}; @@ -77,11 +80,18 @@ impl ProvisionerSubsystem { } } +/// Per-session info we need for the provisioner subsystem. +pub struct PerSession { + prospective_parachains_mode: ProspectiveParachainsMode, + elastic_scaling_mvp: bool, +} + /// A per-relay-parent state for the provisioning subsystem. pub struct PerRelayParent { leaf: ActivatedLeaf, backed_candidates: Vec, prospective_parachains_mode: ProspectiveParachainsMode, + elastic_scaling_mvp: bool, signed_bitfields: Vec, is_inherent_ready: bool, awaiting_inherent: Vec>, @@ -89,13 +99,14 @@ pub struct PerRelayParent { } impl PerRelayParent { - fn new(leaf: ActivatedLeaf, prospective_parachains_mode: ProspectiveParachainsMode) -> Self { + fn new(leaf: ActivatedLeaf, per_session: &PerSession) -> Self { let span = PerLeafSpan::new(leaf.span.clone(), "provisioner"); Self { leaf, backed_candidates: Vec::new(), - prospective_parachains_mode, + prospective_parachains_mode: per_session.prospective_parachains_mode, + elastic_scaling_mvp: per_session.elastic_scaling_mvp, signed_bitfields: Vec::new(), is_inherent_ready: false, awaiting_inherent: Vec::new(), @@ -124,10 +135,17 @@ impl ProvisionerSubsystem { async fn run(mut ctx: Context, metrics: Metrics) -> FatalResult<()> { let mut inherent_delays = InherentDelays::new(); let mut per_relay_parent = HashMap::new(); + let mut per_session = LruMap::new(ByLength::new(2)); loop { - let result = - run_iteration(&mut ctx, &mut per_relay_parent, &mut inherent_delays, &metrics).await; + let result = run_iteration( + &mut ctx, + &mut per_relay_parent, + &mut per_session, + &mut inherent_delays, + &metrics, + ) + .await; match result { Ok(()) => break, @@ -142,6 +160,7 @@ async fn run(mut ctx: Context, metrics: Metrics) -> FatalResult<()> { async fn run_iteration( ctx: &mut Context, per_relay_parent: &mut HashMap, + per_session: &mut LruMap, inherent_delays: &mut InherentDelays, metrics: &Metrics, ) -> Result<(), Error> { @@ -151,7 +170,7 @@ async fn run_iteration( // Map the error to ensure that the subsystem exits when the overseer is gone. match from_overseer.map_err(Error::OverseerExited)? { FromOrchestra::Signal(OverseerSignal::ActiveLeaves(update)) => - handle_active_leaves_update(ctx.sender(), update, per_relay_parent, inherent_delays).await?, + handle_active_leaves_update(ctx.sender(), update, per_relay_parent, per_session, inherent_delays).await?, FromOrchestra::Signal(OverseerSignal::BlockFinalized(..)) => {}, FromOrchestra::Signal(OverseerSignal::Conclude) => return Ok(()), FromOrchestra::Communication { msg } => { @@ -183,6 +202,7 @@ async fn handle_active_leaves_update( sender: &mut impl overseer::ProvisionerSenderTrait, update: ActiveLeavesUpdate, per_relay_parent: &mut HashMap, + per_session: &mut LruMap, inherent_delays: &mut InherentDelays, ) -> Result<(), Error> { gum::trace!(target: LOG_TARGET, "Handle ActiveLeavesUpdate"); @@ -191,10 +211,31 @@ async fn handle_active_leaves_update( } if let Some(leaf) = update.activated { + let session_index = request_session_index_for_child(leaf.hash, sender) + .await + .await + .map_err(Error::CanceledSessionIndex)??; + if per_session.get(&session_index).is_none() { + let prospective_parachains_mode = + prospective_parachains_mode(sender, leaf.hash).await?; + let elastic_scaling_mvp = request_node_features(leaf.hash, session_index, sender) + .await? + .unwrap_or(NodeFeatures::EMPTY) + .get(FeatureIndex::ElasticScalingMVP as usize) + .map(|b| *b) + .unwrap_or(false); + + per_session.insert( + session_index, + PerSession { prospective_parachains_mode, elastic_scaling_mvp }, + ); + } + + let session_info = per_session.get(&session_index).expect("Just inserted"); + gum::trace!(target: LOG_TARGET, leaf_hash=?leaf.hash, "Adding delay"); - let prospective_parachains_mode = prospective_parachains_mode(sender, leaf.hash).await?; let delay_fut = Delay::new(PRE_PROPOSE_TIMEOUT).map(move |_| leaf.hash).boxed(); - per_relay_parent.insert(leaf.hash, PerRelayParent::new(leaf, prospective_parachains_mode)); + per_relay_parent.insert(leaf.hash, PerRelayParent::new(leaf, session_info)); inherent_delays.push(delay_fut); } @@ -253,6 +294,7 @@ async fn send_inherent_data_bg( let signed_bitfields = per_relay_parent.signed_bitfields.clone(); let backed_candidates = per_relay_parent.backed_candidates.clone(); let mode = per_relay_parent.prospective_parachains_mode; + let elastic_scaling_mvp = per_relay_parent.elastic_scaling_mvp; let span = per_relay_parent.span.child("req-inherent-data"); let mut sender = ctx.sender().clone(); @@ -272,6 +314,7 @@ async fn send_inherent_data_bg( &signed_bitfields, &backed_candidates, mode, + elastic_scaling_mvp, return_senders, &mut sender, &metrics, @@ -383,6 +426,7 @@ async fn send_inherent_data( bitfields: &[SignedAvailabilityBitfield], candidates: &[CandidateReceipt], prospective_parachains_mode: ProspectiveParachainsMode, + elastic_scaling_mvp: bool, return_senders: Vec>, from_job: &mut impl overseer::ProvisionerSenderTrait, metrics: &Metrics, @@ -434,6 +478,7 @@ async fn send_inherent_data( &bitfields, candidates, prospective_parachains_mode, + elastic_scaling_mvp, leaf.hash, from_job, ) @@ -553,11 +598,11 @@ async fn select_candidate_hashes_from_tracked( candidates: &[CandidateReceipt], relay_parent: Hash, sender: &mut impl overseer::ProvisionerSenderTrait, -) -> Result, Error> { +) -> Result>, Error> { let block_number = get_block_number_under_construction(relay_parent, sender).await?; let mut selected_candidates = - Vec::with_capacity(candidates.len().min(availability_cores.len())); + HashMap::with_capacity(candidates.len().min(availability_cores.len())); gum::debug!( target: LOG_TARGET, @@ -591,6 +636,12 @@ async fn select_candidate_hashes_from_tracked( CoreState::Free => continue, }; + if selected_candidates.contains_key(&scheduled_core.para_id) { + // We already picked a candidate for this parachain. Elastic scaling only works with + // prospective parachains mode. + continue + } + let validation_data = match request_persisted_validation_data( relay_parent, scheduled_core.para_id, @@ -624,7 +675,10 @@ async fn select_candidate_hashes_from_tracked( "Selected candidate receipt", ); - selected_candidates.push((candidate_hash, candidate.descriptor.relay_parent)); + selected_candidates.insert( + candidate.descriptor.para_id, + vec![(candidate_hash, candidate.descriptor.relay_parent)], + ); } } @@ -637,63 +691,93 @@ async fn select_candidate_hashes_from_tracked( /// Should be called when prospective parachains are enabled. async fn request_backable_candidates( availability_cores: &[CoreState], + elastic_scaling_mvp: bool, bitfields: &[SignedAvailabilityBitfield], relay_parent: Hash, sender: &mut impl overseer::ProvisionerSenderTrait, -) -> Result, Error> { +) -> Result>, Error> { let block_number = get_block_number_under_construction(relay_parent, sender).await?; - let mut selected_candidates = Vec::with_capacity(availability_cores.len()); + // Record how many cores are scheduled for each paraid. Use a BTreeMap because + // we'll need to iterate through them. + let mut scheduled_cores_per_para: BTreeMap = BTreeMap::new(); + // The on-chain ancestors of a para present in availability-cores. + let mut ancestors: HashMap = + HashMap::with_capacity(availability_cores.len()); for (core_idx, core) in availability_cores.iter().enumerate() { - let (para_id, required_path) = match core { + let core_idx = CoreIndex(core_idx as u32); + match core { CoreState::Scheduled(scheduled_core) => { - // The core is free, pick the first eligible candidate from - // the fragment tree. - (scheduled_core.para_id, Vec::new()) + *scheduled_cores_per_para.entry(scheduled_core.para_id).or_insert(0) += 1; }, CoreState::Occupied(occupied_core) => { - if bitfields_indicate_availability(core_idx, bitfields, &occupied_core.availability) - { + let is_available = bitfields_indicate_availability( + core_idx.0 as usize, + bitfields, + &occupied_core.availability, + ); + + if is_available { + ancestors + .entry(occupied_core.para_id()) + .or_default() + .insert(occupied_core.candidate_hash); + if let Some(ref scheduled_core) = occupied_core.next_up_on_available { - // The candidate occupying the core is available, choose its - // child in the fragment tree. - // - // TODO: doesn't work for on-demand parachains. We lean hard on the - // assumption that cores are fixed to specific parachains within a session. - // https://github.com/paritytech/polkadot/issues/5492 - (scheduled_core.para_id, vec![occupied_core.candidate_hash]) - } else { - continue - } - } else { - if occupied_core.time_out_at != block_number { - continue + // Request a new backable candidate for the newly scheduled para id. + *scheduled_cores_per_para.entry(scheduled_core.para_id).or_insert(0) += 1; } + } else if occupied_core.time_out_at <= block_number { + // Timed out before being available. + if let Some(ref scheduled_core) = occupied_core.next_up_on_time_out { // Candidate's availability timed out, practically same as scheduled. - (scheduled_core.para_id, Vec::new()) - } else { - continue + *scheduled_cores_per_para.entry(scheduled_core.para_id).or_insert(0) += 1; } + } else { + // Not timed out and not available. + ancestors + .entry(occupied_core.para_id()) + .or_default() + .insert(occupied_core.candidate_hash); } }, CoreState::Free => continue, }; + } - let response = get_backable_candidate(relay_parent, para_id, required_path, sender).await?; + let mut selected_candidates: HashMap> = + HashMap::with_capacity(scheduled_cores_per_para.len()); - match response { - Some((hash, relay_parent)) => selected_candidates.push((hash, relay_parent)), - None => { - gum::debug!( - target: LOG_TARGET, - leaf_hash = ?relay_parent, - core = core_idx, - "No backable candidate returned by prospective parachains", - ); - }, + for (para_id, core_count) in scheduled_cores_per_para { + let para_ancestors = ancestors.remove(¶_id).unwrap_or_default(); + + // If elastic scaling MVP is disabled, only allow one candidate per parachain. + if !elastic_scaling_mvp && core_count > 1 { + continue } + + let response = get_backable_candidates( + relay_parent, + para_id, + para_ancestors, + core_count as u32, + sender, + ) + .await?; + + if response.is_empty() { + gum::debug!( + target: LOG_TARGET, + leaf_hash = ?relay_parent, + ?para_id, + "No backable candidate returned by prospective parachains", + ); + continue + } + + selected_candidates.insert(para_id, response); } Ok(selected_candidates) @@ -706,6 +790,7 @@ async fn select_candidates( bitfields: &[SignedAvailabilityBitfield], candidates: &[CandidateReceipt], prospective_parachains_mode: ProspectiveParachainsMode, + elastic_scaling_mvp: bool, relay_parent: Hash, sender: &mut impl overseer::ProvisionerSenderTrait, ) -> Result, Error> { @@ -715,7 +800,14 @@ async fn select_candidates( let selected_candidates = match prospective_parachains_mode { ProspectiveParachainsMode::Enabled { .. } => - request_backable_candidates(availability_cores, bitfields, relay_parent, sender).await?, + request_backable_candidates( + availability_cores, + elastic_scaling_mvp, + bitfields, + relay_parent, + sender, + ) + .await?, ProspectiveParachainsMode::Disabled => select_candidate_hashes_from_tracked( availability_cores, @@ -726,6 +818,7 @@ async fn select_candidates( ) .await?, }; + gum::debug!(target: LOG_TARGET, ?selected_candidates, "Got backable candidates"); // now get the backed candidates corresponding to these candidate receipts let (tx, rx) = oneshot::channel(); @@ -733,51 +826,38 @@ async fn select_candidates( selected_candidates.clone(), tx, )); - let mut candidates = rx.await.map_err(|err| Error::CanceledBackedCandidates(err))?; + let candidates = rx.await.map_err(|err| Error::CanceledBackedCandidates(err))?; gum::trace!(target: LOG_TARGET, leaf_hash=?relay_parent, "Got {} backed candidates", candidates.len()); - // `selected_candidates` is generated in ascending order by core index, and - // `GetBackedCandidates` _should_ preserve that property, but let's just make sure. - // - // We can't easily map from `BackedCandidate` to `core_idx`, but we know that every selected - // candidate maps to either 0 or 1 backed candidate, and the hashes correspond. Therefore, by - // checking them in order, we can ensure that the backed candidates are also in order. - let mut backed_idx = 0; - for selected in selected_candidates { - if selected.0 == - candidates.get(backed_idx).ok_or(Error::BackedCandidateOrderingProblem)?.hash() - { - backed_idx += 1; - } - } - if candidates.len() != backed_idx { - Err(Error::BackedCandidateOrderingProblem)?; - } - // keep only one candidate with validation code. let mut with_validation_code = false; - candidates.retain(|c| { - if c.candidate.commitments.new_validation_code.is_some() { - if with_validation_code { - return false + // merge the candidates into a common collection, preserving the order + let mut merged_candidates = Vec::with_capacity(availability_cores.len()); + + for para_candidates in candidates.into_values() { + for candidate in para_candidates { + if candidate.candidate().commitments.new_validation_code.is_some() { + if with_validation_code { + break + } else { + with_validation_code = true; + } } - with_validation_code = true; + merged_candidates.push(candidate); } - - true - }); + } gum::debug!( target: LOG_TARGET, - n_candidates = candidates.len(), + n_candidates = merged_candidates.len(), n_cores = availability_cores.len(), ?relay_parent, "Selected backed candidates", ); - Ok(candidates) + Ok(merged_candidates) } /// Produces a block number 1 higher than that of the relay parent @@ -796,25 +876,27 @@ async fn get_block_number_under_construction( } } -/// Requests backable candidate from Prospective Parachains based on -/// the given path in the fragment tree. -async fn get_backable_candidate( +/// Requests backable candidates from Prospective Parachains based on +/// the given ancestors in the fragment tree. The ancestors may not be ordered. +async fn get_backable_candidates( relay_parent: Hash, para_id: ParaId, - required_path: Vec, + ancestors: Ancestors, + count: u32, sender: &mut impl overseer::ProvisionerSenderTrait, -) -> Result, Error> { +) -> Result, Error> { let (tx, rx) = oneshot::channel(); sender - .send_message(ProspectiveParachainsMessage::GetBackableCandidate( + .send_message(ProspectiveParachainsMessage::GetBackableCandidates( relay_parent, para_id, - required_path, + count, + ancestors, tx, )) .await; - rx.await.map_err(Error::CanceledBackableCandidate) + rx.await.map_err(Error::CanceledBackableCandidates) } /// The availability bitfield for a given core is the transpose diff --git a/polkadot/node/core/provisioner/src/tests.rs b/polkadot/node/core/provisioner/src/tests.rs index 1d7bdfcfcb89c251cfdeb9c6669a5b07e8b05985..d463b7f1663374618621d5ffb3a491feeab69ddc 100644 --- a/polkadot/node/core/provisioner/src/tests.rs +++ b/polkadot/node/core/provisioner/src/tests.rs @@ -22,6 +22,9 @@ use polkadot_primitives::{OccupiedCore, ScheduledCore}; const MOCK_GROUP_SIZE: usize = 5; pub fn occupied_core(para_id: u32) -> CoreState { + let mut candidate_descriptor = dummy_candidate_descriptor(dummy_hash()); + candidate_descriptor.para_id = para_id.into(); + CoreState::Occupied(OccupiedCore { group_responsible: para_id.into(), next_up_on_available: None, @@ -29,7 +32,7 @@ pub fn occupied_core(para_id: u32) -> CoreState { time_out_at: 200_u32, next_up_on_time_out: None, availability: bitvec![u8, bitvec::order::Lsb0; 0; 32], - candidate_descriptor: dummy_candidate_descriptor(dummy_hash()), + candidate_descriptor, candidate_hash: Default::default(), }) } @@ -254,10 +257,58 @@ mod select_candidates { use polkadot_primitives::{ BlockNumber, CandidateCommitments, CommittedCandidateReceipt, PersistedValidationData, }; + use rstest::rstest; + use std::ops::Not; + use CoreState::{Free, Scheduled}; const BLOCK_UNDER_PRODUCTION: BlockNumber = 128; - // For test purposes, we always return this set of availability cores: + fn dummy_candidate_template() -> CandidateReceipt { + let empty_hash = PersistedValidationData::::default().hash(); + + let mut descriptor_template = dummy_candidate_descriptor(dummy_hash()); + descriptor_template.persisted_validation_data_hash = empty_hash; + CandidateReceipt { + descriptor: descriptor_template, + commitments_hash: CandidateCommitments::default().hash(), + } + } + + fn make_candidates( + core_count: usize, + expected_backed_indices: Vec, + ) -> (Vec, Vec) { + let candidate_template = dummy_candidate_template(); + let candidates: Vec<_> = std::iter::repeat(candidate_template) + .take(core_count) + .enumerate() + .map(|(idx, mut candidate)| { + candidate.descriptor.para_id = idx.into(); + candidate + }) + .collect(); + + let expected_backed = expected_backed_indices + .iter() + .map(|&idx| candidates[idx].clone()) + .map(|c| { + BackedCandidate::new( + CommittedCandidateReceipt { + descriptor: c.descriptor.clone(), + commitments: Default::default(), + }, + Vec::new(), + default_bitvec(MOCK_GROUP_SIZE), + None, + ) + }) + .collect(); + let candidate_hashes = candidates.into_iter().map(|c| c.hash()).collect(); + + (candidate_hashes, expected_backed) + } + + // For testing only one core assigned to a parachain, we return this set of availability cores: // // [ // 0: Free, @@ -273,10 +324,70 @@ mod select_candidates { // 10: Occupied(both next_up set, not available, timeout), // 11: Occupied(next_up_on_available and available, but different successor para_id) // ] - fn mock_availability_cores() -> Vec { - use std::ops::Not; - use CoreState::{Free, Scheduled}; + fn mock_availability_cores_one_per_para() -> Vec { + vec![ + // 0: Free, + Free, + // 1: Scheduled(default), + Scheduled(scheduled_core(1)), + // 2: Occupied(no next_up set), + occupied_core(2), + // 3: Occupied(next_up_on_available set but not available), + build_occupied_core(3, |core| { + core.next_up_on_available = Some(scheduled_core(3)); + }), + // 4: Occupied(next_up_on_available set and available), + build_occupied_core(4, |core| { + core.next_up_on_available = Some(scheduled_core(4)); + core.availability = core.availability.clone().not(); + core.candidate_hash = CandidateHash(Hash::from_low_u64_be(41)); + }), + // 5: Occupied(next_up_on_time_out set but not timeout), + build_occupied_core(5, |core| { + core.next_up_on_time_out = Some(scheduled_core(5)); + }), + // 6: Occupied(next_up_on_time_out set and timeout but available), + build_occupied_core(6, |core| { + core.next_up_on_time_out = Some(scheduled_core(6)); + core.time_out_at = BLOCK_UNDER_PRODUCTION; + core.availability = core.availability.clone().not(); + }), + // 7: Occupied(next_up_on_time_out set and timeout and not available), + build_occupied_core(7, |core| { + core.next_up_on_time_out = Some(scheduled_core(7)); + core.time_out_at = BLOCK_UNDER_PRODUCTION; + core.candidate_hash = CandidateHash(Hash::from_low_u64_be(71)); + }), + // 8: Occupied(both next_up set, available), + build_occupied_core(8, |core| { + core.next_up_on_available = Some(scheduled_core(8)); + core.next_up_on_time_out = Some(scheduled_core(8)); + core.availability = core.availability.clone().not(); + core.candidate_hash = CandidateHash(Hash::from_low_u64_be(81)); + }), + // 9: Occupied(both next_up set, not available, no timeout), + build_occupied_core(9, |core| { + core.next_up_on_available = Some(scheduled_core(9)); + core.next_up_on_time_out = Some(scheduled_core(9)); + }), + // 10: Occupied(both next_up set, not available, timeout), + build_occupied_core(10, |core| { + core.next_up_on_available = Some(scheduled_core(10)); + core.next_up_on_time_out = Some(scheduled_core(10)); + core.time_out_at = BLOCK_UNDER_PRODUCTION; + core.candidate_hash = CandidateHash(Hash::from_low_u64_be(101)); + }), + // 11: Occupied(next_up_on_available and available, but different successor para_id) + build_occupied_core(11, |core| { + core.next_up_on_available = Some(scheduled_core(12)); + core.availability = core.availability.clone().not(); + }), + ] + } + // For test purposes with multiple possible cores assigned to a para, we always return this set + // of availability cores: + fn mock_availability_cores_multiple_per_para() -> Vec { vec![ // 0: Free, Free, @@ -292,6 +403,7 @@ mod select_candidates { build_occupied_core(4, |core| { core.next_up_on_available = Some(scheduled_core(4)); core.availability = core.availability.clone().not(); + core.candidate_hash = CandidateHash(Hash::from_low_u64_be(41)); }), // 5: Occupied(next_up_on_time_out set but not timeout), build_occupied_core(5, |core| { @@ -307,12 +419,14 @@ mod select_candidates { build_occupied_core(7, |core| { core.next_up_on_time_out = Some(scheduled_core(7)); core.time_out_at = BLOCK_UNDER_PRODUCTION; + core.candidate_hash = CandidateHash(Hash::from_low_u64_be(71)); }), // 8: Occupied(both next_up set, available), build_occupied_core(8, |core| { core.next_up_on_available = Some(scheduled_core(8)); core.next_up_on_time_out = Some(scheduled_core(8)); core.availability = core.availability.clone().not(); + core.candidate_hash = CandidateHash(Hash::from_low_u64_be(81)); }), // 9: Occupied(both next_up set, not available, no timeout), build_occupied_core(9, |core| { @@ -324,29 +438,136 @@ mod select_candidates { core.next_up_on_available = Some(scheduled_core(10)); core.next_up_on_time_out = Some(scheduled_core(10)); core.time_out_at = BLOCK_UNDER_PRODUCTION; + core.candidate_hash = CandidateHash(Hash::from_low_u64_be(101)); }), // 11: Occupied(next_up_on_available and available, but different successor para_id) build_occupied_core(11, |core| { core.next_up_on_available = Some(scheduled_core(12)); core.availability = core.availability.clone().not(); }), + // 12-14: Occupied(next_up_on_available and available, same para_id). + build_occupied_core(12, |core| { + core.next_up_on_available = Some(scheduled_core(12)); + core.availability = core.availability.clone().not(); + core.candidate_hash = CandidateHash(Hash::from_low_u64_be(121)); + }), + build_occupied_core(12, |core| { + core.next_up_on_available = Some(scheduled_core(12)); + core.availability = core.availability.clone().not(); + core.candidate_hash = CandidateHash(Hash::from_low_u64_be(122)); + }), + build_occupied_core(12, |core| { + core.next_up_on_available = Some(scheduled_core(12)); + core.availability = core.availability.clone().not(); + core.candidate_hash = CandidateHash(Hash::from_low_u64_be(123)); + }), + // 15: Scheduled on same para_id as 12-14. + Scheduled(scheduled_core(12)), + // 16: Occupied(13, no next_up set, not available) + build_occupied_core(13, |core| { + core.candidate_hash = CandidateHash(Hash::from_low_u64_be(131)); + }), + // 17: Occupied(13, no next_up set, available) + build_occupied_core(13, |core| { + core.availability = core.availability.clone().not(); + core.candidate_hash = CandidateHash(Hash::from_low_u64_be(132)); + }), + // 18: Occupied(13, next_up_on_available set to 13 but not available) + build_occupied_core(13, |core| { + core.next_up_on_available = Some(scheduled_core(13)); + core.candidate_hash = CandidateHash(Hash::from_low_u64_be(133)); + }), + // 19: Occupied(13, next_up_on_available set to 13 and available) + build_occupied_core(13, |core| { + core.next_up_on_available = Some(scheduled_core(13)); + core.availability = core.availability.clone().not(); + core.candidate_hash = CandidateHash(Hash::from_low_u64_be(134)); + }), + // 20: Occupied(13, next_up_on_time_out set to 13 but not timeout) + build_occupied_core(13, |core| { + core.next_up_on_time_out = Some(scheduled_core(13)); + core.candidate_hash = CandidateHash(Hash::from_low_u64_be(135)); + }), + // 21: Occupied(13, next_up_on_available set to 14 and available) + build_occupied_core(13, |core| { + core.next_up_on_available = Some(scheduled_core(14)); + core.availability = core.availability.clone().not(); + core.candidate_hash = CandidateHash(Hash::from_low_u64_be(136)); + }), + // 22: Occupied(13, next_up_on_available set to 14 but not available) + build_occupied_core(13, |core| { + core.next_up_on_available = Some(scheduled_core(14)); + core.candidate_hash = CandidateHash(Hash::from_low_u64_be(137)); + }), + // 23: Occupied(13, both next_up set to 14, available) + build_occupied_core(13, |core| { + core.next_up_on_available = Some(scheduled_core(14)); + core.next_up_on_time_out = Some(scheduled_core(14)); + core.availability = core.availability.clone().not(); + core.candidate_hash = CandidateHash(Hash::from_low_u64_be(138)); + }), + // 24: Occupied(13, both next_up set to 14, not available, timeout) + build_occupied_core(13, |core| { + core.next_up_on_available = Some(scheduled_core(14)); + core.next_up_on_time_out = Some(scheduled_core(14)); + core.time_out_at = BLOCK_UNDER_PRODUCTION; + core.candidate_hash = CandidateHash(Hash::from_low_u64_be(1399)); + }), + // 25: Occupied(13, next_up_on_available and available, but successor para_id 15) + build_occupied_core(13, |core| { + core.next_up_on_available = Some(scheduled_core(15)); + core.availability = core.availability.clone().not(); + core.candidate_hash = CandidateHash(Hash::from_low_u64_be(139)); + }), + // 26: Occupied(15, next_up_on_available and available, but successor para_id 13) + build_occupied_core(15, |core| { + core.next_up_on_available = Some(scheduled_core(13)); + core.availability = core.availability.clone().not(); + core.candidate_hash = CandidateHash(Hash::from_low_u64_be(151)); + }), + // 27: Occupied(15, both next_up, both available and timed out) + build_occupied_core(15, |core| { + core.next_up_on_available = Some(scheduled_core(15)); + core.availability = core.availability.clone().not(); + core.candidate_hash = CandidateHash(Hash::from_low_u64_be(152)); + core.time_out_at = BLOCK_UNDER_PRODUCTION; + }), + // 28: Occupied(13, both next_up set to 13, not available) + build_occupied_core(13, |core| { + core.next_up_on_available = Some(scheduled_core(13)); + core.next_up_on_time_out = Some(scheduled_core(13)); + core.candidate_hash = CandidateHash(Hash::from_low_u64_be(1398)); + }), + // 29: Occupied(13, both next_up set to 13, not available, timeout) + build_occupied_core(13, |core| { + core.next_up_on_available = Some(scheduled_core(13)); + core.next_up_on_time_out = Some(scheduled_core(13)); + core.time_out_at = BLOCK_UNDER_PRODUCTION; + core.candidate_hash = CandidateHash(Hash::from_low_u64_be(1397)); + }), ] } async fn mock_overseer( mut receiver: mpsc::UnboundedReceiver, - expected: Vec, + mock_availability_cores: Vec, + mut expected: Vec, + mut expected_ancestors: HashMap, Ancestors>, prospective_parachains_mode: ProspectiveParachainsMode, ) { use ChainApiMessage::BlockNumber; use RuntimeApiMessage::Request; + let mut backed = expected.clone().into_iter().fold(HashMap::new(), |mut acc, candidate| { + acc.entry(candidate.descriptor().para_id).or_insert(vec![]).push(candidate); + acc + }); + + expected.sort_by_key(|c| c.candidate().descriptor.para_id); let mut candidates_iter = expected .iter() .map(|candidate| (candidate.hash(), candidate.descriptor().relay_parent)); - let mut backed_iter = expected.clone().into_iter(); - while let Some(from_job) = receiver.next().await { match from_job { AllMessages::ChainApi(BlockNumber(_relay_parent, tx)) => @@ -356,16 +577,35 @@ mod select_candidates { PersistedValidationDataReq(_para_id, _assumption, tx), )) => tx.send(Ok(Some(Default::default()))).unwrap(), AllMessages::RuntimeApi(Request(_parent_hash, AvailabilityCores(tx))) => - tx.send(Ok(mock_availability_cores())).unwrap(), + tx.send(Ok(mock_availability_cores.clone())).unwrap(), AllMessages::CandidateBacking(CandidateBackingMessage::GetBackedCandidates( hashes, sender, )) => { - let response: Vec = - backed_iter.by_ref().take(hashes.len()).collect(); - let expected_hashes: Vec<(CandidateHash, Hash)> = response + let mut response: HashMap> = HashMap::new(); + for (para_id, requested_candidates) in hashes.clone() { + response.insert( + para_id, + backed + .get_mut(¶_id) + .unwrap() + .drain(0..requested_candidates.len()) + .collect(), + ); + } + let expected_hashes: HashMap> = response .iter() - .map(|candidate| (candidate.hash(), candidate.descriptor().relay_parent)) + .map(|(para_id, candidates)| { + ( + *para_id, + candidates + .iter() + .map(|candidate| { + (candidate.hash(), candidate.descriptor().relay_parent) + }) + .collect(), + ) + }) .collect(); assert_eq!(expected_hashes, hashes); @@ -373,10 +613,36 @@ mod select_candidates { let _ = sender.send(response); }, AllMessages::ProspectiveParachains( - ProspectiveParachainsMessage::GetBackableCandidate(.., tx), + ProspectiveParachainsMessage::GetBackableCandidates( + _, + _para_id, + count, + actual_ancestors, + tx, + ), ) => match prospective_parachains_mode { ProspectiveParachainsMode::Enabled { .. } => { - let _ = tx.send(candidates_iter.next()); + assert!(count > 0); + let candidates = + (&mut candidates_iter).take(count as usize).collect::>(); + assert_eq!(candidates.len(), count as usize); + + if !expected_ancestors.is_empty() { + if let Some(expected_required_ancestors) = expected_ancestors.remove( + &(candidates + .clone() + .into_iter() + .take(actual_ancestors.len()) + .map(|(c_hash, _)| c_hash) + .collect::>()), + ) { + assert_eq!(expected_required_ancestors, actual_ancestors); + } else { + assert_eq!(actual_ancestors.len(), 0); + } + } + + let _ = tx.send(candidates); }, ProspectiveParachainsMode::Disabled => panic!("unexpected prospective parachains request"), @@ -384,19 +650,34 @@ mod select_candidates { _ => panic!("Unexpected message: {:?}", from_job), } } + + if let ProspectiveParachainsMode::Enabled { .. } = prospective_parachains_mode { + assert_eq!(candidates_iter.next(), None); + } + assert_eq!(expected_ancestors.len(), 0); } - #[test] - fn can_succeed() { + #[rstest] + #[case(ProspectiveParachainsMode::Disabled)] + #[case(ProspectiveParachainsMode::Enabled {max_candidate_depth: 0, allowed_ancestry_len: 0})] + fn can_succeed(#[case] prospective_parachains_mode: ProspectiveParachainsMode) { test_harness( - |r| mock_overseer(r, Vec::new(), ProspectiveParachainsMode::Disabled), + |r| { + mock_overseer( + r, + Vec::new(), + Vec::new(), + HashMap::new(), + prospective_parachains_mode, + ) + }, |mut tx: TestSubsystemSender| async move { - let prospective_parachains_mode = ProspectiveParachainsMode::Disabled; select_candidates( &[], &[], &[], prospective_parachains_mode, + false, Default::default(), &mut tx, ) @@ -406,22 +687,22 @@ mod select_candidates { ) } - // this tests that only the appropriate candidates get selected. - // To accomplish this, we supply a candidate list containing one candidate per possible core; - // the candidate selection algorithm must filter them to the appropriate set - #[test] - fn selects_correct_candidates() { - let mock_cores = mock_availability_cores(); - - let empty_hash = PersistedValidationData::::default().hash(); - - let mut descriptor_template = dummy_candidate_descriptor(dummy_hash()); - descriptor_template.persisted_validation_data_hash = empty_hash; - let candidate_template = CandidateReceipt { - descriptor: descriptor_template, - commitments_hash: CandidateCommitments::default().hash(), - }; - + // Test candidate selection when prospective parachains mode is disabled. + // This tests that only the appropriate candidates get selected when prospective parachains mode + // is disabled. To accomplish this, we supply a candidate list containing one candidate per + // possible core; the candidate selection algorithm must filter them to the appropriate set + #[rstest] + // why those particular indices? see the comments on mock_availability_cores_*() functions. + #[case(mock_availability_cores_one_per_para(), vec![1, 4, 7, 8, 10], true)] + #[case(mock_availability_cores_one_per_para(), vec![1, 4, 7, 8, 10], false)] + #[case(mock_availability_cores_multiple_per_para(), vec![1, 4, 7, 8, 10, 12, 13, 14, 15], true)] + #[case(mock_availability_cores_multiple_per_para(), vec![1, 4, 7, 8, 10, 12, 13, 14, 15], false)] + fn test_in_subsystem_selection( + #[case] mock_cores: Vec, + #[case] expected_candidates: Vec, + #[case] elastic_scaling_mvp: bool, + ) { + let candidate_template = dummy_candidate_template(); let candidates: Vec<_> = std::iter::repeat(candidate_template) .take(mock_cores.len()) .enumerate() @@ -448,31 +729,43 @@ mod select_candidates { }) .collect(); - // why those particular indices? see the comments on mock_availability_cores() let expected_candidates: Vec<_> = - [1, 4, 7, 8, 10].iter().map(|&idx| candidates[idx].clone()).collect(); + expected_candidates.into_iter().map(|idx| candidates[idx].clone()).collect(); let prospective_parachains_mode = ProspectiveParachainsMode::Disabled; let expected_backed = expected_candidates .iter() - .map(|c| BackedCandidate { - candidate: CommittedCandidateReceipt { - descriptor: c.descriptor.clone(), - commitments: Default::default(), - }, - validity_votes: Vec::new(), - validator_indices: default_bitvec(MOCK_GROUP_SIZE), + .map(|c| { + BackedCandidate::new( + CommittedCandidateReceipt { + descriptor: c.descriptor().clone(), + commitments: Default::default(), + }, + Vec::new(), + default_bitvec(MOCK_GROUP_SIZE), + None, + ) }) .collect(); + let mock_cores_clone = mock_cores.clone(); test_harness( - |r| mock_overseer(r, expected_backed, prospective_parachains_mode), + |r| { + mock_overseer( + r, + mock_cores_clone, + expected_backed, + HashMap::new(), + prospective_parachains_mode, + ) + }, |mut tx: TestSubsystemSender| async move { - let result = select_candidates( + let result: Vec = select_candidates( &mock_cores, &[], &candidates, prospective_parachains_mode, + elastic_scaling_mvp, Default::default(), &mut tx, ) @@ -481,7 +774,7 @@ mod select_candidates { result.into_iter().for_each(|c| { assert!( - expected_candidates.iter().any(|c2| c.candidate.corresponds_to(c2)), + expected_candidates.iter().any(|c2| c.candidate().corresponds_to(c2)), "Failed to find candidate: {:?}", c, ) @@ -490,20 +783,29 @@ mod select_candidates { ) } - #[test] - fn selects_max_one_code_upgrade() { - let mock_cores = mock_availability_cores(); + #[rstest] + #[case(ProspectiveParachainsMode::Disabled)] + #[case(ProspectiveParachainsMode::Enabled {max_candidate_depth: 0, allowed_ancestry_len: 0})] + fn selects_max_one_code_upgrade_one_core_per_para( + #[case] prospective_parachains_mode: ProspectiveParachainsMode, + ) { + let mock_cores = mock_availability_cores_one_per_para(); let empty_hash = PersistedValidationData::::default().hash(); // why those particular indices? see the comments on mock_availability_cores() - // the first candidate with code is included out of [1, 4, 7, 8, 10]. - let cores = [1, 4, 7, 8, 10]; + // the first candidate with code is included out of [1, 4, 7, 8, 10, 12]. + let cores = [1, 4, 7, 8, 10, 12]; let cores_with_code = [1, 4, 8]; - let expected_cores = [1, 7, 10]; + // We can't be sure which one code upgrade the provisioner will pick. We can only assert + // that it only picks one. These are the possible cores for which the provisioner will + // supply candidates. + // There are multiple possibilities depending on which code upgrade it + // chooses. + let possible_expected_cores = [[1, 7, 10, 12], [4, 7, 10, 12], [7, 8, 10, 12]]; - let committed_receipts: Vec<_> = (0..mock_cores.len()) + let committed_receipts: Vec<_> = (0..=mock_cores.len()) .map(|i| { let mut descriptor = dummy_candidate_descriptor(dummy_hash()); descriptor.para_id = i.into(); @@ -527,10 +829,13 @@ mod select_candidates { // Build possible outputs from select_candidates let backed_candidates: Vec<_> = committed_receipts .iter() - .map(|committed_receipt| BackedCandidate { - candidate: committed_receipt.clone(), - validity_votes: Vec::new(), - validator_indices: default_bitvec(MOCK_GROUP_SIZE), + .map(|committed_receipt| { + BackedCandidate::new( + committed_receipt.clone(), + Vec::new(), + default_bitvec(MOCK_GROUP_SIZE), + None, + ) }) .collect(); @@ -538,30 +843,216 @@ mod select_candidates { // Then, some of them get filtered due to new validation code rule. let expected_backed: Vec<_> = cores.iter().map(|&idx| backed_candidates[idx].clone()).collect(); - let expected_backed_filtered: Vec<_> = - expected_cores.iter().map(|&idx| candidates[idx].clone()).collect(); + let expected_backed_filtered: Vec> = possible_expected_cores + .iter() + .map(|indices| indices.iter().map(|&idx| candidates[idx].clone()).collect()) + .collect(); - let prospective_parachains_mode = ProspectiveParachainsMode::Disabled; + let mock_cores_clone = mock_cores.clone(); + + test_harness( + |r| { + mock_overseer( + r, + mock_cores_clone, + expected_backed, + HashMap::new(), + prospective_parachains_mode, + ) + }, + |mut tx: TestSubsystemSender| async move { + let result = select_candidates( + &mock_cores, + &[], + &candidates, + prospective_parachains_mode, + false, + Default::default(), + &mut tx, + ) + .await + .unwrap(); + + assert_eq!(result.len(), 4); + + assert!(expected_backed_filtered.iter().any(|expected_backed_filtered| { + result.clone().into_iter().all(|c| { + expected_backed_filtered.iter().any(|c2| c.candidate().corresponds_to(c2)) + }) + })); + }, + ) + } + + #[test] + fn selects_max_one_code_upgrade_multiple_cores_per_para() { + let prospective_parachains_mode = + ProspectiveParachainsMode::Enabled { max_candidate_depth: 0, allowed_ancestry_len: 0 }; + let mock_cores = vec![ + // 0: Scheduled(default), + Scheduled(scheduled_core(1)), + // 1: Scheduled(default), + Scheduled(scheduled_core(2)), + // 2: Scheduled(default), + Scheduled(scheduled_core(2)), + // 3: Scheduled(default), + Scheduled(scheduled_core(2)), + // 4: Scheduled(default), + Scheduled(scheduled_core(3)), + // 5: Scheduled(default), + Scheduled(scheduled_core(3)), + // 6: Scheduled(default), + Scheduled(scheduled_core(3)), + ]; + + let empty_hash = PersistedValidationData::::default().hash(); + let cores_with_code = [0, 2, 4, 5]; + + // We can't be sure which one code upgrade the provisioner will pick. We can only assert + // that it only picks one. + // These are the possible cores for which the provisioner will + // supply candidates. There are multiple possibilities depending on which code upgrade it + // chooses. + let possible_expected_cores = [vec![0, 1], vec![1, 2, 3], vec![4, 1]]; + + let committed_receipts: Vec<_> = (0..mock_cores.len()) + .map(|i| { + let mut descriptor = dummy_candidate_descriptor(dummy_hash()); + descriptor.para_id = if let Scheduled(scheduled_core) = &mock_cores[i] { + scheduled_core.para_id + } else { + panic!("`mock_cores` is not initialized with `Scheduled`?") + }; + descriptor.persisted_validation_data_hash = empty_hash; + descriptor.pov_hash = Hash::from_low_u64_be(i as u64); + CommittedCandidateReceipt { + descriptor, + commitments: CandidateCommitments { + new_validation_code: if cores_with_code.contains(&i) { + Some(vec![].into()) + } else { + None + }, + ..Default::default() + }, + } + }) + .collect(); + + // Input to select_candidates + let candidates: Vec<_> = committed_receipts.iter().map(|r| r.to_plain()).collect(); + // Build possible outputs from select_candidates + let backed_candidates: Vec<_> = committed_receipts + .iter() + .map(|committed_receipt| { + BackedCandidate::new( + committed_receipt.clone(), + Vec::new(), + default_bitvec(MOCK_GROUP_SIZE), + None, + ) + }) + .collect(); + + // First, provisioner will request backable candidates for each scheduled core. + // Then, some of them get filtered due to new validation code rule. + let expected_backed: Vec<_> = + (0..mock_cores.len()).map(|idx| backed_candidates[idx].clone()).collect(); + let expected_backed_filtered: Vec> = possible_expected_cores + .iter() + .map(|indices| indices.iter().map(|&idx| candidates[idx].clone()).collect()) + .collect(); + + let mock_cores_clone = mock_cores.clone(); test_harness( - |r| mock_overseer(r, expected_backed, prospective_parachains_mode), + |r| { + mock_overseer( + r, + mock_cores_clone, + expected_backed, + HashMap::new(), + prospective_parachains_mode, + ) + }, |mut tx: TestSubsystemSender| async move { let result = select_candidates( &mock_cores, &[], &candidates, prospective_parachains_mode, + true, Default::default(), &mut tx, ) .await .unwrap(); - assert_eq!(result.len(), 3); + assert!(expected_backed_filtered.iter().any(|expected_backed_filtered| { + result.clone().into_iter().all(|c| { + expected_backed_filtered.iter().any(|c2| c.candidate().corresponds_to(c2)) + }) && (expected_backed_filtered.len() == result.len()) + })); + }, + ) + } + + #[rstest] + #[case(true)] + #[case(false)] + fn request_from_prospective_parachains_one_core_per_para(#[case] elastic_scaling_mvp: bool) { + let mock_cores = mock_availability_cores_one_per_para(); + + // why those particular indices? see the comments on mock_availability_cores() + let expected_candidates: Vec<_> = vec![1, 4, 7, 8, 10, 12]; + let (candidates, expected_candidates) = + make_candidates(mock_cores.len() + 1, expected_candidates); + // Expect prospective parachains subsystem requests. + let prospective_parachains_mode = + ProspectiveParachainsMode::Enabled { max_candidate_depth: 0, allowed_ancestry_len: 0 }; + + let mut required_ancestors: HashMap, Ancestors> = HashMap::new(); + required_ancestors.insert( + vec![candidates[4]], + vec![CandidateHash(Hash::from_low_u64_be(41))].into_iter().collect(), + ); + required_ancestors.insert( + vec![candidates[8]], + vec![CandidateHash(Hash::from_low_u64_be(81))].into_iter().collect(), + ); + + let mock_cores_clone = mock_cores.clone(); + let expected_candidates_clone = expected_candidates.clone(); + test_harness( + |r| { + mock_overseer( + r, + mock_cores_clone, + expected_candidates_clone, + required_ancestors, + prospective_parachains_mode, + ) + }, + |mut tx: TestSubsystemSender| async move { + let result = select_candidates( + &mock_cores, + &[], + &[], + prospective_parachains_mode, + elastic_scaling_mvp, + Default::default(), + &mut tx, + ) + .await + .unwrap(); + + assert_eq!(result.len(), expected_candidates.len()); result.into_iter().for_each(|c| { assert!( - expected_backed_filtered.iter().any(|c2| c.candidate.corresponds_to(c2)), + expected_candidates + .iter() + .any(|c2| c.candidate().corresponds_to(&c2.receipt())), "Failed to find candidate: {:?}", c, ) @@ -571,62 +1062,149 @@ mod select_candidates { } #[test] - fn request_from_prospective_parachains() { - let mock_cores = mock_availability_cores(); - let empty_hash = PersistedValidationData::::default().hash(); - - let mut descriptor_template = dummy_candidate_descriptor(dummy_hash()); - descriptor_template.persisted_validation_data_hash = empty_hash; - let candidate_template = CandidateReceipt { - descriptor: descriptor_template, - commitments_hash: CandidateCommitments::default().hash(), - }; - - let candidates: Vec<_> = std::iter::repeat(candidate_template) - .take(mock_cores.len()) - .enumerate() - .map(|(idx, mut candidate)| { - candidate.descriptor.para_id = idx.into(); - candidate - }) - .collect(); + fn request_from_prospective_parachains_multiple_cores_per_para_elastic_scaling_mvp() { + let mock_cores = mock_availability_cores_multiple_per_para(); // why those particular indices? see the comments on mock_availability_cores() let expected_candidates: Vec<_> = - [1, 4, 7, 8, 10].iter().map(|&idx| candidates[idx].clone()).collect(); + vec![1, 4, 7, 8, 10, 12, 12, 12, 12, 12, 13, 13, 13, 14, 14, 14, 15, 15]; // Expect prospective parachains subsystem requests. let prospective_parachains_mode = ProspectiveParachainsMode::Enabled { max_candidate_depth: 0, allowed_ancestry_len: 0 }; - let expected_backed = expected_candidates - .iter() - .map(|c| BackedCandidate { - candidate: CommittedCandidateReceipt { - descriptor: c.descriptor.clone(), - commitments: Default::default(), - }, - validity_votes: Vec::new(), - validator_indices: default_bitvec(MOCK_GROUP_SIZE), - }) - .collect(); + let (candidates, expected_candidates) = + make_candidates(mock_cores.len(), expected_candidates); + + let mut required_ancestors: HashMap, Ancestors> = HashMap::new(); + required_ancestors.insert( + vec![candidates[4]], + vec![CandidateHash(Hash::from_low_u64_be(41))].into_iter().collect(), + ); + required_ancestors.insert( + vec![candidates[8]], + vec![CandidateHash(Hash::from_low_u64_be(81))].into_iter().collect(), + ); + required_ancestors.insert( + [12, 12, 12].iter().map(|&idx| candidates[idx]).collect::>(), + vec![ + CandidateHash(Hash::from_low_u64_be(121)), + CandidateHash(Hash::from_low_u64_be(122)), + CandidateHash(Hash::from_low_u64_be(123)), + ] + .into_iter() + .collect(), + ); + required_ancestors.insert( + [13, 13, 13].iter().map(|&idx| candidates[idx]).collect::>(), + (131..=139) + .map(|num| CandidateHash(Hash::from_low_u64_be(num))) + .chain(std::iter::once(CandidateHash(Hash::from_low_u64_be(1398)))) + .collect(), + ); + + required_ancestors.insert( + [15, 15].iter().map(|&idx| candidates[idx]).collect::>(), + vec![ + CandidateHash(Hash::from_low_u64_be(151)), + CandidateHash(Hash::from_low_u64_be(152)), + ] + .into_iter() + .collect(), + ); + + let mock_cores_clone = mock_cores.clone(); + let expected_candidates_clone = expected_candidates.clone(); + test_harness( + |r| { + mock_overseer( + r, + mock_cores_clone, + expected_candidates, + required_ancestors, + prospective_parachains_mode, + ) + }, + |mut tx: TestSubsystemSender| async move { + let result = select_candidates( + &mock_cores, + &[], + &[], + prospective_parachains_mode, + true, + Default::default(), + &mut tx, + ) + .await + .unwrap(); + + assert_eq!(result.len(), expected_candidates_clone.len()); + result.into_iter().for_each(|c| { + assert!( + expected_candidates_clone + .iter() + .any(|c2| c.candidate().corresponds_to(&c2.receipt())), + "Failed to find candidate: {:?}", + c, + ) + }); + }, + ) + } + + #[test] + fn request_from_prospective_parachains_multiple_cores_per_para_elastic_scaling_mvp_disabled() { + let mock_cores = mock_availability_cores_multiple_per_para(); + + // why those particular indices? see the comments on mock_availability_cores() + let expected_candidates: Vec<_> = vec![1, 4, 7, 8, 10]; + // Expect prospective parachains subsystem requests. + let prospective_parachains_mode = + ProspectiveParachainsMode::Enabled { max_candidate_depth: 0, allowed_ancestry_len: 0 }; + let (candidates, expected_candidates) = + make_candidates(mock_cores.len(), expected_candidates); + + let mut required_ancestors: HashMap, Ancestors> = HashMap::new(); + required_ancestors.insert( + vec![candidates[4]], + vec![CandidateHash(Hash::from_low_u64_be(41))].into_iter().collect(), + ); + required_ancestors.insert( + vec![candidates[8]], + vec![CandidateHash(Hash::from_low_u64_be(81))].into_iter().collect(), + ); + + let mock_cores_clone = mock_cores.clone(); + let expected_candidates_clone = expected_candidates.clone(); test_harness( - |r| mock_overseer(r, expected_backed, prospective_parachains_mode), + |r| { + mock_overseer( + r, + mock_cores_clone, + expected_candidates, + required_ancestors, + prospective_parachains_mode, + ) + }, |mut tx: TestSubsystemSender| async move { let result = select_candidates( &mock_cores, &[], &[], prospective_parachains_mode, + false, Default::default(), &mut tx, ) .await .unwrap(); + assert_eq!(result.len(), expected_candidates_clone.len()); result.into_iter().for_each(|c| { assert!( - expected_candidates.iter().any(|c2| c.candidate.corresponds_to(c2)), + expected_candidates_clone + .iter() + .any(|c2| c.candidate().corresponds_to(&c2.receipt())), "Failed to find candidate: {:?}", c, ) @@ -637,18 +1215,11 @@ mod select_candidates { #[test] fn request_receipts_based_on_relay_parent() { - let mock_cores = mock_availability_cores(); - let empty_hash = PersistedValidationData::::default().hash(); - - let mut descriptor_template = dummy_candidate_descriptor(dummy_hash()); - descriptor_template.persisted_validation_data_hash = empty_hash; - let candidate_template = CandidateReceipt { - descriptor: descriptor_template, - commitments_hash: CandidateCommitments::default().hash(), - }; + let mock_cores = mock_availability_cores_one_per_para(); + let candidate_template = dummy_candidate_template(); let candidates: Vec<_> = std::iter::repeat(candidate_template) - .take(mock_cores.len()) + .take(mock_cores.len() + 1) .enumerate() .map(|(idx, mut candidate)| { candidate.descriptor.para_id = idx.into(); @@ -659,31 +1230,44 @@ mod select_candidates { // why those particular indices? see the comments on mock_availability_cores() let expected_candidates: Vec<_> = - [1, 4, 7, 8, 10].iter().map(|&idx| candidates[idx].clone()).collect(); + [1, 4, 7, 8, 10, 12].iter().map(|&idx| candidates[idx].clone()).collect(); // Expect prospective parachains subsystem requests. let prospective_parachains_mode = ProspectiveParachainsMode::Enabled { max_candidate_depth: 0, allowed_ancestry_len: 0 }; let expected_backed = expected_candidates .iter() - .map(|c| BackedCandidate { - candidate: CommittedCandidateReceipt { - descriptor: c.descriptor.clone(), - commitments: Default::default(), - }, - validity_votes: Vec::new(), - validator_indices: default_bitvec(MOCK_GROUP_SIZE), + .map(|c| { + BackedCandidate::new( + CommittedCandidateReceipt { + descriptor: c.descriptor().clone(), + commitments: Default::default(), + }, + Vec::new(), + default_bitvec(MOCK_GROUP_SIZE), + None, + ) }) .collect(); + let mock_cores_clone = mock_cores.clone(); test_harness( - |r| mock_overseer(r, expected_backed, prospective_parachains_mode), + |r| { + mock_overseer( + r, + mock_cores_clone, + expected_backed, + HashMap::new(), + prospective_parachains_mode, + ) + }, |mut tx: TestSubsystemSender| async move { let result = select_candidates( &mock_cores, &[], &[], prospective_parachains_mode, + false, Default::default(), &mut tx, ) @@ -692,7 +1276,7 @@ mod select_candidates { result.into_iter().for_each(|c| { assert!( - expected_candidates.iter().any(|c2| c.candidate.corresponds_to(c2)), + expected_candidates.iter().any(|c2| c.candidate().corresponds_to(c2)), "Failed to find candidate: {:?}", c, ) diff --git a/polkadot/node/core/pvf-checker/Cargo.toml b/polkadot/node/core/pvf-checker/Cargo.toml index 3f02c2fa74a8e09248a586187f342ff5db2e6146..91b12b8680977fba345e0ccfa9b06f1bcb24ef79 100644 --- a/polkadot/node/core/pvf-checker/Cargo.toml +++ b/polkadot/node/core/pvf-checker/Cargo.toml @@ -10,8 +10,8 @@ license.workspace = true workspace = true [dependencies] -futures = "0.3.21" -thiserror = "1.0.48" +futures = "0.3.30" +thiserror = { workspace = true } gum = { package = "tracing-gum", path = "../../gum" } polkadot-node-primitives = { path = "../../primitives" } diff --git a/polkadot/node/core/pvf-checker/src/lib.rs b/polkadot/node/core/pvf-checker/src/lib.rs index ae0fae6b4f9f7e2a4924effd4c3395d60b456f2f..c00ec0d952f158f8df21de87ee9d7460d68218bc 100644 --- a/polkadot/node/core/pvf-checker/src/lib.rs +++ b/polkadot/node/core/pvf-checker/src/lib.rs @@ -415,7 +415,7 @@ async fn check_signing_credentials( gum::warn!( target: LOG_TARGET, relay_parent = ?leaf, - "error occured during requesting validators: {:?}", + "error occurred during requesting validators: {:?}", e ); return None @@ -508,7 +508,7 @@ async fn sign_and_submit_pvf_check_statement( target: LOG_TARGET, ?relay_parent, ?validation_code_hash, - "error occured during submitting a vote: {:?}", + "error occurred during submitting a vote: {:?}", e, ); }, diff --git a/polkadot/node/core/pvf-checker/src/tests.rs b/polkadot/node/core/pvf-checker/src/tests.rs index b0401ecdc3bd2368e34a263842ea566b712884a0..b2365fe53e52c0f2e1c7cb18768c33cdd6801ca9 100644 --- a/polkadot/node/core/pvf-checker/src/tests.rs +++ b/polkadot/node/core/pvf-checker/src/tests.rs @@ -39,8 +39,8 @@ use std::{collections::HashMap, sync::Arc, time::Duration}; type VirtualOverseer = TestSubsystemContextHandle; -fn dummy_validation_code_hash(descriminator: u8) -> ValidationCodeHash { - ValidationCode(vec![descriminator]).hash() +fn dummy_validation_code_hash(discriminator: u8) -> ValidationCodeHash { + ValidationCode(vec![discriminator]).hash() } struct StartsNewSession { @@ -511,7 +511,7 @@ fn reactivating_pvf_leads_to_second_check() { .reply(PreCheckOutcome::Valid); test_state.expect_submit_vote(&mut handle).await.reply_ok(); - // Now activate a descdedant leaf, where the PVF is not present. + // Now activate a descendant leaf, where the PVF is not present. test_state .active_leaves_update( &mut handle, diff --git a/polkadot/node/core/pvf/Cargo.toml b/polkadot/node/core/pvf/Cargo.toml index d7ea573cfd2f3e772a3af04c0b840ce94ecdf93a..a0233d6b751769a4f51f3eda0f7ca0ec75fa1cb7 100644 --- a/polkadot/node/core/pvf/Cargo.toml +++ b/polkadot/node/core/pvf/Cargo.toml @@ -14,7 +14,7 @@ always-assert = "0.1" array-bytes = "6.1" blake3 = "1.5" cfg-if = "1.0" -futures = "0.3.21" +futures = "0.3.30" futures-timer = "3.0.2" gum = { package = "tracing-gum", path = "../../gum" } is_executable = "1.0.1" @@ -23,7 +23,7 @@ pin-project = "1.0.9" rand = "0.8.5" slotmap = "1.0" tempfile = "3.3.0" -thiserror = "1.0.31" +thiserror = { workspace = true } tokio = { version = "1.24.2", features = ["fs", "process"] } parity-scale-codec = { version = "3.6.1", default-features = false, features = ["derive"] } @@ -50,7 +50,7 @@ hex-literal = "0.4.1" polkadot-node-core-pvf-common = { path = "common", features = ["test-utils"] } # For benches and integration tests, depend on ourselves with the test-utils # feature. -polkadot-node-core-pvf = { path = ".", features = ["test-utils"] } +polkadot-node-core-pvf = { path = "", features = ["test-utils"] } rococo-runtime = { path = "../../../runtime/rococo" } adder = { package = "test-parachain-adder", path = "../../../parachain/test-parachains/adder" } diff --git a/polkadot/node/core/pvf/README.md b/polkadot/node/core/pvf/README.md index 796e17c05faa47ceec455125ae29f7943ffa5740..5304b0720b2df614c005ff54eabb4d2c74b0bb4b 100644 --- a/polkadot/node/core/pvf/README.md +++ b/polkadot/node/core/pvf/README.md @@ -13,7 +13,7 @@ See also: Running `cargo test` in the `pvf/` directory will run unit and integration tests. -**Note:** some tests run only under Linux, amd64, and/or with the +**Note:** some tests run only under Linux, x86-64, and/or with the `ci-only-tests` feature enabled. See the general [Testing][testing] instructions for more information on @@ -34,8 +34,8 @@ RUST_LOG=parachain::pvf=trace zombienet --provider=native spawn zombienet_tests/ ## Testing on Linux Some of the PVF functionality, especially related to security, is Linux-only, -and some is amd64-only. If you touch anything security-related, make sure to -test on Linux amd64! If you're on a Mac, you can either run a VM or you can hire +and some is x86-64-only. If you touch anything security-related, make sure to +test on Linux x86-64! If you're on a Mac, you can either run a VM or you can hire a VPS and use the open-source tool [EternalTerminal][et] to connect to it.[^et] [^et]: Unlike ssh, ET preserves your session across disconnects, and unlike diff --git a/polkadot/node/core/pvf/common/Cargo.toml b/polkadot/node/core/pvf/common/Cargo.toml index 583db0b29f45aeb1c04f1d393b856b96bb41b92e..f3eb9d919aae6ea6ded7df58a088d22ebbe66325 100644 --- a/polkadot/node/core/pvf/common/Cargo.toml +++ b/polkadot/node/core/pvf/common/Cargo.toml @@ -12,10 +12,10 @@ workspace = true [dependencies] cfg-if = "1.0" cpu-time = "1.0.0" -futures = "0.3.21" +futures = "0.3.30" gum = { package = "tracing-gum", path = "../../../gum" } libc = "0.2.152" -thiserror = "1.0.31" +thiserror = { workspace = true } parity-scale-codec = { version = "3.6.1", default-features = false, features = ["derive"] } @@ -35,6 +35,8 @@ sp-tracing = { path = "../../../../../substrate/primitives/tracing" } [target.'cfg(target_os = "linux")'.dependencies] landlock = "0.3.0" nix = { version = "0.27.1", features = ["sched"] } + +[target.'cfg(all(target_os = "linux", target_arch = "x86_64"))'.dependencies] seccompiler = "0.4.0" [dev-dependencies] diff --git a/polkadot/node/core/pvf/common/src/error.rs b/polkadot/node/core/pvf/common/src/error.rs index f8faefc24e65aadb2c50d2375e30fc7d579d6d37..cf274044456f3ea2db6770fbd61b3319f6420996 100644 --- a/polkadot/node/core/pvf/common/src/error.rs +++ b/polkadot/node/core/pvf/common/src/error.rs @@ -16,6 +16,7 @@ use crate::prepare::{PrepareSuccess, PrepareWorkerSuccess}; use parity_scale_codec::{Decode, Encode}; +pub use sc_executor_common::error::Error as ExecuteError; /// Result of PVF preparation from a worker, with checksum of the compiled PVF and stats of the /// preparation if successful. diff --git a/polkadot/node/core/pvf/common/src/execute.rs b/polkadot/node/core/pvf/common/src/execute.rs index 6b3becf524d71fa2d4f4bf574e0a86d09a7a60d9..18c97b03cbcd6fccc03cb27cb9f9e3aba9c7cf2a 100644 --- a/polkadot/node/core/pvf/common/src/execute.rs +++ b/polkadot/node/core/pvf/common/src/execute.rs @@ -40,6 +40,9 @@ pub enum WorkerResponse { }, /// The candidate is invalid. InvalidCandidate(String), + /// Instantiation of the WASM module instance failed during an execution. + /// Possibly related to local issues or dirty node update. May be retried with re-preparation. + RuntimeConstruction(String), /// The job timed out. JobTimedOut, /// The job process has died. We must kill the worker just in case. @@ -68,6 +71,9 @@ pub enum JobResponse { /// The result of parachain validation. result_descriptor: ValidationResult, }, + /// A possibly transient runtime instantiation error happened during the execution; may be + /// retried with re-preparation + RuntimeConstruction(String), /// The candidate is invalid. InvalidCandidate(String), } @@ -81,6 +87,15 @@ impl JobResponse { Self::InvalidCandidate(format!("{}: {}", ctx, msg)) } } + + /// Creates a may retry response from a context `ctx` and a message `msg` (which can be empty). + pub fn runtime_construction(ctx: &'static str, msg: &str) -> Self { + if msg.is_empty() { + Self::RuntimeConstruction(ctx.to_string()) + } else { + Self::RuntimeConstruction(format!("{}: {}", ctx, msg)) + } + } } /// An unexpected error occurred in the execution job process. Because this comes from the job, diff --git a/polkadot/node/core/pvf/common/src/executor_interface.rs b/polkadot/node/core/pvf/common/src/executor_interface.rs index 4cd2f5c85eec53661fde7625bb50a1d195381beb..252e611db8a488cff776b5d7863c987318e7e013 100644 --- a/polkadot/node/core/pvf/common/src/executor_interface.rs +++ b/polkadot/node/core/pvf/common/src/executor_interface.rs @@ -16,6 +16,7 @@ //! Interface to the Substrate Executor +use crate::error::ExecuteError; use polkadot_primitives::{ executor_params::{DEFAULT_LOGICAL_STACK_MAX, DEFAULT_NATIVE_STACK_MAX}, ExecutorParam, ExecutorParams, @@ -23,7 +24,7 @@ use polkadot_primitives::{ use sc_executor_common::{ error::WasmError, runtime_blob::RuntimeBlob, - wasm_runtime::{HeapAllocStrategy, InvokeMethod, WasmModule as _}, + wasm_runtime::{HeapAllocStrategy, WasmModule as _}, }; use sc_executor_wasmtime::{Config, DeterministicStackLimit, Semantics, WasmtimeRuntime}; use sp_core::storage::{ChildInfo, TrackedStorageKey}; @@ -109,7 +110,7 @@ pub unsafe fn execute_artifact( compiled_artifact_blob: &[u8], executor_params: &ExecutorParams, params: &[u8], -) -> Result, String> { +) -> Result, ExecuteError> { let mut extensions = sp_externalities::Extensions::new(); extensions.register(sp_core::traits::ReadRuntimeVersionExt::new(ReadRuntimeVersion)); @@ -118,12 +119,11 @@ pub unsafe fn execute_artifact( match sc_executor::with_externalities_safe(&mut ext, || { let runtime = create_runtime_from_artifact_bytes(compiled_artifact_blob, executor_params)?; - runtime.new_instance()?.call(InvokeMethod::Export("validate_block"), params) + runtime.new_instance()?.call("validate_block", params) }) { Ok(Ok(ok)) => Ok(ok), Ok(Err(err)) | Err(err) => Err(err), } - .map_err(|err| format!("execute error: {:?}", err)) } /// Constructs the runtime for the given PVF, given the artifact bytes. diff --git a/polkadot/node/core/pvf/common/src/lib.rs b/polkadot/node/core/pvf/common/src/lib.rs index d891c06bf2ada3efedbdd9420119c61fb96f5791..15097dbd3af5c29d1fceabc8d04f6ee9a395ef30 100644 --- a/polkadot/node/core/pvf/common/src/lib.rs +++ b/polkadot/node/core/pvf/common/src/lib.rs @@ -86,3 +86,33 @@ pub fn framed_recv_blocking(r: &mut (impl Read + Unpin)) -> io::Result> r.read_exact(&mut buf)?; Ok(buf) } + +#[cfg(all(test, not(feature = "test-utils")))] +mod tests { + use super::*; + + #[test] + fn default_secure_status() { + let status = SecurityStatus::default(); + assert!( + !status.secure_validator_mode, + "secure_validator_mode is false for default security status" + ); + assert!( + !status.can_enable_landlock, + "can_enable_landlock is false for default security status" + ); + assert!( + !status.can_enable_seccomp, + "can_enable_seccomp is false for default security status" + ); + assert!( + !status.can_unshare_user_namespace_and_change_root, + "can_unshare_user_namespace_and_change_root is false for default security status" + ); + assert!( + !status.can_do_secure_clone, + "can_do_secure_clone is false for default security status" + ); + } +} diff --git a/polkadot/node/core/pvf/common/src/pvf.rs b/polkadot/node/core/pvf/common/src/pvf.rs index 3f5b4d7ca70c14d53770af2dc470e4a2e5e572a4..340dffe07c3fd3e8b049f1a126a348a7ff4e326f 100644 --- a/polkadot/node/core/pvf/common/src/pvf.rs +++ b/polkadot/node/core/pvf/common/src/pvf.rs @@ -85,9 +85,9 @@ impl PvfPrepData { /// Creates a structure for tests. #[cfg(feature = "test-utils")] pub fn from_discriminator_and_timeout(num: u32, timeout: Duration) -> Self { - let descriminator_buf = num.to_le_bytes().to_vec(); + let discriminator_buf = num.to_le_bytes().to_vec(); Self::from_code( - descriminator_buf, + discriminator_buf, ExecutorParams::default(), timeout, PrepareJobKind::Compilation, diff --git a/polkadot/node/core/pvf/execute-worker/src/lib.rs b/polkadot/node/core/pvf/execute-worker/src/lib.rs index 0cfa5a786946c7428ea8954515fe03807a90da32..bd7e76010a6dfedb339fd2fc1c17aa7f4007babe 100644 --- a/polkadot/node/core/pvf/execute-worker/src/lib.rs +++ b/polkadot/node/core/pvf/execute-worker/src/lib.rs @@ -16,7 +16,9 @@ //! Contains the logic for executing PVFs. Used by the polkadot-execute-worker binary. -pub use polkadot_node_core_pvf_common::executor_interface::execute_artifact; +pub use polkadot_node_core_pvf_common::{ + error::ExecuteError, executor_interface::execute_artifact, +}; // NOTE: Initializing logging in e.g. tests will not have an effect in the workers, as they are // separate spawned processes. Run with e.g. `RUST_LOG=parachain::pvf-execute-worker=trace`. @@ -237,7 +239,9 @@ fn validate_using_artifact( // [`executor_interface::prepare`]. execute_artifact(compiled_artifact_blob, executor_params, params) } { - Err(err) => return JobResponse::format_invalid("execute", &err), + Err(ExecuteError::RuntimeConstruction(wasmerr)) => + return JobResponse::runtime_construction("execute", &wasmerr.to_string()), + Err(err) => return JobResponse::format_invalid("execute", &err.to_string()), Ok(d) => d, }; @@ -550,6 +554,8 @@ fn handle_parent_process( Ok(WorkerResponse::Ok { result_descriptor, duration: cpu_tv }) }, Ok(JobResponse::InvalidCandidate(err)) => Ok(WorkerResponse::InvalidCandidate(err)), + Ok(JobResponse::RuntimeConstruction(err)) => + Ok(WorkerResponse::RuntimeConstruction(err)), Err(job_error) => { gum::warn!( target: LOG_TARGET, diff --git a/polkadot/node/core/pvf/src/artifacts.rs b/polkadot/node/core/pvf/src/artifacts.rs index 78dfe71adaddcd8d917a639591c102e08ebb7e4b..6288755526d497812027f7bf04e11e5a67ab799e 100644 --- a/polkadot/node/core/pvf/src/artifacts.rs +++ b/polkadot/node/core/pvf/src/artifacts.rs @@ -238,6 +238,14 @@ impl Artifacts { .is_none()); } + /// Remove artifact by its id. + pub fn remove(&mut self, artifact_id: ArtifactId) -> Option<(ArtifactId, PathBuf)> { + self.inner.remove(&artifact_id).and_then(|state| match state { + ArtifactState::Prepared { path, .. } => Some((artifact_id, path)), + _ => None, + }) + } + /// Remove artifacts older than the given TTL and return id and path of the removed ones. pub fn prune(&mut self, artifact_ttl: Duration) -> Vec<(ArtifactId, PathBuf)> { let now = SystemTime::now(); diff --git a/polkadot/node/core/pvf/src/error.rs b/polkadot/node/core/pvf/src/error.rs index 80d41d5c64be1a5cec31aee084a0f536ad0380bf..8dc96305eadb8f3ced1231889f5fa6c5ffaeac57 100644 --- a/polkadot/node/core/pvf/src/error.rs +++ b/polkadot/node/core/pvf/src/error.rs @@ -86,6 +86,10 @@ pub enum PossiblyInvalidError { /// vote invalid. #[error("possibly invalid: job error: {0}")] JobError(String), + /// Instantiation of the WASM module instance failed during an execution. + /// Possibly related to local issues or dirty node update. May be retried with re-preparation. + #[error("possibly invalid: runtime construction: {0}")] + RuntimeConstruction(String), } impl From for ValidationError { diff --git a/polkadot/node/core/pvf/src/execute/mod.rs b/polkadot/node/core/pvf/src/execute/mod.rs index c6d9cf90fa289601f89b0aad307483a002f89427..365e98196cae29dcb9c5085708cfaf7ee8b26238 100644 --- a/polkadot/node/core/pvf/src/execute/mod.rs +++ b/polkadot/node/core/pvf/src/execute/mod.rs @@ -23,4 +23,4 @@ mod queue; mod worker_interface; -pub use queue::{start, PendingExecutionRequest, ToQueue}; +pub use queue::{start, FromQueue, PendingExecutionRequest, ToQueue}; diff --git a/polkadot/node/core/pvf/src/execute/queue.rs b/polkadot/node/core/pvf/src/execute/queue.rs index aa91d11781fc625993484fa64ff8ebca4d65aeb2..bdc3c7327b06079eaaeebf737ffa7ca2c8c8270c 100644 --- a/polkadot/node/core/pvf/src/execute/queue.rs +++ b/polkadot/node/core/pvf/src/execute/queue.rs @@ -25,7 +25,7 @@ use crate::{ InvalidCandidate, PossiblyInvalidError, ValidationError, LOG_TARGET, }; use futures::{ - channel::mpsc, + channel::{mpsc, oneshot}, future::BoxFuture, stream::{FuturesUnordered, StreamExt as _}, Future, FutureExt, @@ -54,6 +54,12 @@ pub enum ToQueue { Enqueue { artifact: ArtifactPathId, pending_execution_request: PendingExecutionRequest }, } +/// A response from queue. +#[derive(Debug)] +pub enum FromQueue { + RemoveArtifact { artifact: ArtifactId, reply_to: oneshot::Sender<()> }, +} + /// An execution request that should execute the PVF (known in the context) and send the results /// to the given result sender. #[derive(Debug)] @@ -137,6 +143,8 @@ struct Queue { /// The receiver that receives messages to the pool. to_queue_rx: mpsc::Receiver, + /// The sender to send messages back to validation host. + from_queue_tx: mpsc::UnboundedSender, // Some variables related to the current session. program_path: PathBuf, @@ -161,6 +169,7 @@ impl Queue { node_version: Option, security_status: SecurityStatus, to_queue_rx: mpsc::Receiver, + from_queue_tx: mpsc::UnboundedSender, ) -> Self { Self { metrics, @@ -170,6 +179,7 @@ impl Queue { node_version, security_status, to_queue_rx, + from_queue_tx, queue: VecDeque::new(), mux: Mux::new(), workers: Workers { @@ -301,7 +311,7 @@ async fn handle_mux(queue: &mut Queue, event: QueueEvent) { handle_worker_spawned(queue, idle, handle, job); }, QueueEvent::StartWork(worker, outcome, artifact_id, result_tx) => { - handle_job_finish(queue, worker, outcome, artifact_id, result_tx); + handle_job_finish(queue, worker, outcome, artifact_id, result_tx).await; }, } } @@ -327,42 +337,69 @@ fn handle_worker_spawned( /// If there are pending jobs in the queue, schedules the next of them onto the just freed up /// worker. Otherwise, puts back into the available workers list. -fn handle_job_finish( +async fn handle_job_finish( queue: &mut Queue, worker: Worker, outcome: Outcome, artifact_id: ArtifactId, result_tx: ResultSender, ) { - let (idle_worker, result, duration) = match outcome { + let (idle_worker, result, duration, sync_channel) = match outcome { Outcome::Ok { result_descriptor, duration, idle_worker } => { // TODO: propagate the soft timeout - (Some(idle_worker), Ok(result_descriptor), Some(duration)) + (Some(idle_worker), Ok(result_descriptor), Some(duration), None) }, Outcome::InvalidCandidate { err, idle_worker } => ( Some(idle_worker), Err(ValidationError::Invalid(InvalidCandidate::WorkerReportedInvalid(err))), None, + None, ), - Outcome::InternalError { err } => (None, Err(ValidationError::Internal(err)), None), + Outcome::RuntimeConstruction { err, idle_worker } => { + // The task for artifact removal is executed concurrently with + // the message to the host on the execution result. + let (result_tx, result_rx) = oneshot::channel(); + queue + .from_queue_tx + .unbounded_send(FromQueue::RemoveArtifact { + artifact: artifact_id.clone(), + reply_to: result_tx, + }) + .expect("from execute queue receiver is listened by the host; qed"); + ( + Some(idle_worker), + Err(ValidationError::PossiblyInvalid(PossiblyInvalidError::RuntimeConstruction( + err, + ))), + None, + Some(result_rx), + ) + }, + Outcome::InternalError { err } => (None, Err(ValidationError::Internal(err)), None, None), // Either the worker or the job timed out. Kill the worker in either case. Treated as // definitely-invalid, because if we timed out, there's no time left for a retry. Outcome::HardTimeout => - (None, Err(ValidationError::Invalid(InvalidCandidate::HardTimeout)), None), + (None, Err(ValidationError::Invalid(InvalidCandidate::HardTimeout)), None, None), // "Maybe invalid" errors (will retry). Outcome::WorkerIntfErr => ( None, Err(ValidationError::PossiblyInvalid(PossiblyInvalidError::AmbiguousWorkerDeath)), None, + None, ), Outcome::JobDied { err } => ( None, Err(ValidationError::PossiblyInvalid(PossiblyInvalidError::AmbiguousJobDeath(err))), None, + None, + ), + Outcome::JobError { err } => ( + None, + Err(ValidationError::PossiblyInvalid(PossiblyInvalidError::JobError(err))), + None, + None, ), - Outcome::JobError { err } => - (None, Err(ValidationError::PossiblyInvalid(PossiblyInvalidError::JobError(err))), None), }; queue.metrics.execute_finished(); @@ -386,6 +423,12 @@ fn handle_job_finish( ); } + if let Some(sync_channel) = sync_channel { + // err means the sender is dropped (the artifact is already removed from the cache) + // so that's legitimate to ignore the result + let _ = sync_channel.await; + } + // First we send the result. It may fail due to the other end of the channel being dropped, // that's legitimate and we don't treat that as an error. let _ = result_tx.send(result); @@ -521,8 +564,10 @@ pub fn start( spawn_timeout: Duration, node_version: Option, security_status: SecurityStatus, -) -> (mpsc::Sender, impl Future) { +) -> (mpsc::Sender, mpsc::UnboundedReceiver, impl Future) { let (to_queue_tx, to_queue_rx) = mpsc::channel(20); + let (from_queue_tx, from_queue_rx) = mpsc::unbounded(); + let run = Queue::new( metrics, program_path, @@ -532,7 +577,8 @@ pub fn start( node_version, security_status, to_queue_rx, + from_queue_tx, ) .run(); - (to_queue_tx, run) + (to_queue_tx, from_queue_rx, run) } diff --git a/polkadot/node/core/pvf/src/execute/worker_interface.rs b/polkadot/node/core/pvf/src/execute/worker_interface.rs index 9f7738f00e699ab981d7fa4396fcd09d5e1a4abe..db81da118d7b5563ea7b4bec1b6c76bd3bf842e2 100644 --- a/polkadot/node/core/pvf/src/execute/worker_interface.rs +++ b/polkadot/node/core/pvf/src/execute/worker_interface.rs @@ -87,6 +87,10 @@ pub enum Outcome { /// a trap. Errors related to the preparation process are not expected to be encountered by the /// execution workers. InvalidCandidate { err: String, idle_worker: IdleWorker }, + /// The error is probably transient. It may be for example + /// because the artifact was prepared with a Wasmtime version different from the version + /// in the current execution environment. + RuntimeConstruction { err: String, idle_worker: IdleWorker }, /// The execution time exceeded the hard limit. The worker is terminated. HardTimeout, /// An I/O error happened during communication with the worker. This may mean that the worker @@ -193,6 +197,10 @@ pub async fn start_work( err, idle_worker: IdleWorker { stream, pid, worker_dir }, }, + WorkerResponse::RuntimeConstruction(err) => Outcome::RuntimeConstruction { + err, + idle_worker: IdleWorker { stream, pid, worker_dir }, + }, WorkerResponse::JobTimedOut => Outcome::HardTimeout, WorkerResponse::JobDied { err, job_pid: _ } => Outcome::JobDied { err }, WorkerResponse::JobError(err) => Outcome::JobError { err }, diff --git a/polkadot/node/core/pvf/src/host.rs b/polkadot/node/core/pvf/src/host.rs index e215f11b91d396a1b9e5fa5710d34acf28ca9cff..59d5a7e20a887ef35282f0a8ae8c0998625d825a 100644 --- a/polkadot/node/core/pvf/src/host.rs +++ b/polkadot/node/core/pvf/src/host.rs @@ -24,7 +24,7 @@ use crate::{ artifacts::{ArtifactId, ArtifactPathId, ArtifactState, Artifacts}, execute::{self, PendingExecutionRequest}, metrics::Metrics, - prepare, security, Priority, SecurityStatus, ValidationError, LOG_TARGET, + prepare, Priority, SecurityStatus, ValidationError, LOG_TARGET, }; use always_assert::never; use futures::{ @@ -225,10 +225,32 @@ pub async fn start( // Run checks for supported security features once per host startup. If some checks fail, warn // if Secure Validator Mode is disabled and return an error otherwise. - let security_status = match security::check_security_status(&config).await { + #[cfg(target_os = "linux")] + let security_status = match crate::security::check_security_status(&config).await { Ok(ok) => ok, Err(err) => return Err(SubsystemError::Context(err)), }; + #[cfg(not(target_os = "linux"))] + let security_status = if config.secure_validator_mode { + gum::error!( + target: LOG_TARGET, + "{}{}{}", + crate::SECURE_MODE_ERROR, + crate::SECURE_LINUX_NOTE, + crate::IGNORE_SECURE_MODE_TIP + ); + return Err(SubsystemError::Context( + "could not enable Secure Validator Mode for non-Linux; check logs".into(), + )); + } else { + gum::warn!( + target: LOG_TARGET, + "{}{}", + crate::SECURE_MODE_WARNING, + crate::SECURE_LINUX_NOTE, + ); + SecurityStatus::default() + }; let (to_host_tx, to_host_rx) = mpsc::channel(HOST_MESSAGE_QUEUE_SIZE); @@ -252,7 +274,7 @@ pub async fn start( from_prepare_pool, ); - let (to_execute_queue_tx, run_execute_queue) = execute::start( + let (to_execute_queue_tx, from_execute_queue_rx, run_execute_queue) = execute::start( metrics, config.execute_worker_program_path.to_owned(), config.cache_path.clone(), @@ -274,6 +296,7 @@ pub async fn start( to_prepare_queue_tx, from_prepare_queue_rx, to_execute_queue_tx, + from_execute_queue_rx, to_sweeper_tx, awaiting_prepare: AwaitingPrepare::default(), }) @@ -320,6 +343,8 @@ struct Inner { from_prepare_queue_rx: mpsc::UnboundedReceiver, to_execute_queue_tx: mpsc::Sender, + from_execute_queue_rx: mpsc::UnboundedReceiver, + to_sweeper_tx: mpsc::Sender, awaiting_prepare: AwaitingPrepare, @@ -336,6 +361,7 @@ async fn run( to_host_rx, from_prepare_queue_rx, mut to_prepare_queue_tx, + from_execute_queue_rx, mut to_execute_queue_tx, mut to_sweeper_tx, mut awaiting_prepare, @@ -362,10 +388,21 @@ async fn run( let mut to_host_rx = to_host_rx.fuse(); let mut from_prepare_queue_rx = from_prepare_queue_rx.fuse(); + let mut from_execute_queue_rx = from_execute_queue_rx.fuse(); loop { // biased to make it behave deterministically for tests. futures::select_biased! { + from_execute_queue_rx = from_execute_queue_rx.next() => { + let from_queue = break_if_fatal!(from_execute_queue_rx.ok_or(Fatal)); + let execute::FromQueue::RemoveArtifact { artifact, reply_to } = from_queue; + break_if_fatal!(handle_artifact_removal( + &mut to_sweeper_tx, + &mut artifacts, + artifact, + reply_to, + ).await); + }, () = cleanup_pulse.select_next_some() => { // `select_next_some` because we don't expect this to fail, but if it does, we // still don't fail. The trade-off is that the compiled cache will start growing @@ -839,6 +876,37 @@ async fn handle_cleanup_pulse( Ok(()) } +async fn handle_artifact_removal( + sweeper_tx: &mut mpsc::Sender, + artifacts: &mut Artifacts, + artifact_id: ArtifactId, + reply_to: oneshot::Sender<()>, +) -> Result<(), Fatal> { + let (artifact_id, path) = if let Some(artifact) = artifacts.remove(artifact_id) { + artifact + } else { + // if we haven't found the artifact by its id, + // it has been probably removed + // anyway with the randomness of the artifact name + // it is safe to ignore + return Ok(()); + }; + reply_to + .send(()) + .expect("the execute queue waits for the artifact remove confirmation; qed"); + // Thanks to the randomness of the artifact name (see + // `artifacts::generate_artifact_path`) there is no issue with any name conflict on + // future repreparation. + // So we can confirm the artifact removal already + gum::debug!( + target: LOG_TARGET, + validation_code_hash = ?artifact_id.code_hash, + "PVF pruning: pruning artifact by request from the execute queue", + ); + sweeper_tx.send(path).await.map_err(|_| Fatal)?; + Ok(()) +} + /// A simple task which sole purpose is to delete files thrown at it. async fn sweeper_task(mut sweeper_rx: mpsc::Receiver) { loop { @@ -849,7 +917,7 @@ async fn sweeper_task(mut sweeper_rx: mpsc::Receiver) { gum::trace!( target: LOG_TARGET, ?result, - "Sweeped the artifact file {}", + "Swept the artifact file {}", condemned.display(), ); }, @@ -946,6 +1014,8 @@ pub(crate) mod tests { to_prepare_queue_rx: mpsc::Receiver, from_prepare_queue_tx: mpsc::UnboundedSender, to_execute_queue_rx: mpsc::Receiver, + #[allow(unused)] + from_execute_queue_tx: mpsc::UnboundedSender, to_sweeper_rx: mpsc::Receiver, run: BoxFuture<'static, ()>, @@ -957,6 +1027,7 @@ pub(crate) mod tests { let (to_prepare_queue_tx, to_prepare_queue_rx) = mpsc::channel(10); let (from_prepare_queue_tx, from_prepare_queue_rx) = mpsc::unbounded(); let (to_execute_queue_tx, to_execute_queue_rx) = mpsc::channel(10); + let (from_execute_queue_tx, from_execute_queue_rx) = mpsc::unbounded(); let (to_sweeper_tx, to_sweeper_rx) = mpsc::channel(10); let run = run(Inner { @@ -967,6 +1038,7 @@ pub(crate) mod tests { to_prepare_queue_tx, from_prepare_queue_rx, to_execute_queue_tx, + from_execute_queue_rx, to_sweeper_tx, awaiting_prepare: AwaitingPrepare::default(), }) @@ -977,6 +1049,7 @@ pub(crate) mod tests { to_prepare_queue_rx, from_prepare_queue_tx, to_execute_queue_rx, + from_execute_queue_tx, to_sweeper_rx, run, } diff --git a/polkadot/node/core/pvf/src/lib.rs b/polkadot/node/core/pvf/src/lib.rs index 92263281eeab1c5f0cf96dad249db4c110c43114..462498fa8f6b108c6057b378d2a0b07face31ec9 100644 --- a/polkadot/node/core/pvf/src/lib.rs +++ b/polkadot/node/core/pvf/src/lib.rs @@ -97,6 +97,7 @@ mod host; mod metrics; mod prepare; mod priority; +#[cfg(target_os = "linux")] mod security; mod worker_interface; @@ -135,3 +136,22 @@ pub fn get_worker_version(worker_path: &Path) -> std::io::Result { .trim() .to_string()) } + +// Trying to run securely and some mandatory errors occurred. +pub(crate) const SECURE_MODE_ERROR: &'static str = + "🚨 Your system cannot securely run a validator. \ +\nRunning validation of malicious PVF code has a higher risk of compromising this machine."; +// Some errors occurred when running insecurely, or some optional errors occurred when running +// securely. +pub(crate) const SECURE_MODE_WARNING: &'static str = "🚨 Some security issues have been detected. \ +\nRunning validation of malicious PVF code has a higher risk of compromising this machine."; +// Message to be printed only when running securely and mandatory errors occurred. +pub(crate) const IGNORE_SECURE_MODE_TIP: &'static str = +"\nYou can ignore this error with the `--insecure-validator-i-know-what-i-do` \ +command line argument if you understand and accept the risks of running insecurely. \ +With this flag, security features are enabled on a best-effort basis, but not mandatory. \ +\nMore information: https://wiki.polkadot.network/docs/maintain-guides-secure-validator#secure-validator-mode"; +// Only Linux supports security features +#[cfg(not(target_os = "linux"))] +pub(crate) const SECURE_LINUX_NOTE: &'static str = "\nSecure mode is enabled only for Linux \ +\nand a full secure mode is enabled only for Linux x86-64."; diff --git a/polkadot/node/core/pvf/src/priority.rs b/polkadot/node/core/pvf/src/priority.rs index d4bd49eaee84037043a46f6645612627b081c0f4..d1ef9c604b117d10aca5b99cc8ccd1953fa522f5 100644 --- a/polkadot/node/core/pvf/src/priority.rs +++ b/polkadot/node/core/pvf/src/priority.rs @@ -29,7 +29,7 @@ pub enum Priority { } impl Priority { - /// Returns `true` if `self` is `Crticial` + /// Returns `true` if `self` is `Critical` pub fn is_critical(self) -> bool { self == Priority::Critical } diff --git a/polkadot/node/core/pvf/src/security.rs b/polkadot/node/core/pvf/src/security.rs index f62a232abf27a3745e0622094686d56b07e16cc1..733ef18bcadb497020db70f54db72d507a750c58 100644 --- a/polkadot/node/core/pvf/src/security.rs +++ b/polkadot/node/core/pvf/src/security.rs @@ -169,20 +169,6 @@ impl fmt::Display for SecureModeError { /// Print an error if Secure Validator Mode and some mandatory errors occurred, warn otherwise. fn print_secure_mode_error_or_warning(security_status: &FullSecurityStatus) { - // Trying to run securely and some mandatory errors occurred. - const SECURE_MODE_ERROR: &'static str = "🚨 Your system cannot securely run a validator. \ - \nRunning validation of malicious PVF code has a higher risk of compromising this machine."; - // Some errors occurred when running insecurely, or some optional errors occurred when running - // securely. - const SECURE_MODE_WARNING: &'static str = "🚨 Some security issues have been detected. \ - \nRunning validation of malicious PVF code has a higher risk of compromising this machine."; - // Message to be printed only when running securely and mandatory errors occurred. - const IGNORE_SECURE_MODE_TIP: &'static str = - "\nYou can ignore this error with the `--insecure-validator-i-know-what-i-do` \ - command line argument if you understand and accept the risks of running insecurely. \ - With this flag, security features are enabled on a best-effort basis, but not mandatory. \ - \nMore information: https://wiki.polkadot.network/docs/maintain-guides-secure-validator#secure-validator-mode"; - let all_errs_allowed = security_status.all_errs_allowed(); let errs_string = security_status.errs_string(); @@ -190,16 +176,16 @@ fn print_secure_mode_error_or_warning(security_status: &FullSecurityStatus) { gum::warn!( target: LOG_TARGET, "{}{}", - SECURE_MODE_WARNING, + crate::SECURE_MODE_WARNING, errs_string, ); } else { gum::error!( target: LOG_TARGET, "{}{}{}", - SECURE_MODE_ERROR, + crate::SECURE_MODE_ERROR, errs_string, - IGNORE_SECURE_MODE_TIP + crate::IGNORE_SECURE_MODE_TIP ); } } @@ -210,29 +196,25 @@ fn print_secure_mode_error_or_warning(security_status: &FullSecurityStatus) { /// to running the check in a worker, we try it... in a worker. The expected return status is 0 on /// success and -1 on failure. async fn check_can_unshare_user_namespace_and_change_root( - #[cfg_attr(not(target_os = "linux"), allow(unused_variables))] prepare_worker_program_path: &Path, - #[cfg_attr(not(target_os = "linux"), allow(unused_variables))] cache_path: &Path, + cache_path: &Path, ) -> SecureModeResult { - cfg_if::cfg_if! { - if #[cfg(target_os = "linux")] { - let cache_dir_tempdir = tempfile::Builder::new() - .prefix("check-can-unshare-") - .tempdir_in(cache_path) - .map_err(|err| SecureModeError::CannotUnshareUserNamespaceAndChangeRoot( - format!("could not create a temporary directory in {:?}: {}", cache_path, err) - ))?; - spawn_process_for_security_check( - prepare_worker_program_path, - "--check-can-unshare-user-namespace-and-change-root", - &[cache_dir_tempdir.path()], - ).await.map_err(|err| SecureModeError::CannotUnshareUserNamespaceAndChangeRoot(err)) - } else { - Err(SecureModeError::CannotUnshareUserNamespaceAndChangeRoot( - "only available on Linux".into() + let cache_dir_tempdir = tempfile::Builder::new() + .prefix("check-can-unshare-") + .tempdir_in(cache_path) + .map_err(|err| { + SecureModeError::CannotUnshareUserNamespaceAndChangeRoot(format!( + "could not create a temporary directory in {:?}: {}", + cache_path, err )) - } - } + })?; + spawn_process_for_security_check( + prepare_worker_program_path, + "--check-can-unshare-user-namespace-and-change-root", + &[cache_dir_tempdir.path()], + ) + .await + .map_err(|err| SecureModeError::CannotUnshareUserNamespaceAndChangeRoot(err)) } /// Check if landlock is supported and return an error if not. @@ -240,25 +222,15 @@ async fn check_can_unshare_user_namespace_and_change_root( /// We do this check by spawning a new process and trying to sandbox it. To get as close as possible /// to running the check in a worker, we try it... in a worker. The expected return status is 0 on /// success and -1 on failure. -async fn check_landlock( - #[cfg_attr(not(target_os = "linux"), allow(unused_variables))] - prepare_worker_program_path: &Path, -) -> SecureModeResult { - cfg_if::cfg_if! { - if #[cfg(target_os = "linux")] { - let abi = polkadot_node_core_pvf_common::worker::security::landlock::LANDLOCK_ABI as u8; - spawn_process_for_security_check( - prepare_worker_program_path, - "--check-can-enable-landlock", - std::iter::empty::<&str>(), - ).await.map_err(|err| SecureModeError::CannotEnableLandlock { err, abi }) - } else { - Err(SecureModeError::CannotEnableLandlock { - err: "only available on Linux".into(), - abi: 0, - }) - } - } +async fn check_landlock(prepare_worker_program_path: &Path) -> SecureModeResult { + let abi = polkadot_node_core_pvf_common::worker::security::landlock::LANDLOCK_ABI as u8; + spawn_process_for_security_check( + prepare_worker_program_path, + "--check-can-enable-landlock", + std::iter::empty::<&str>(), + ) + .await + .map_err(|err| SecureModeError::CannotEnableLandlock { err, abi }) } /// Check if seccomp is supported and return an error if not. @@ -266,39 +238,23 @@ async fn check_landlock( /// We do this check by spawning a new process and trying to sandbox it. To get as close as possible /// to running the check in a worker, we try it... in a worker. The expected return status is 0 on /// success and -1 on failure. -async fn check_seccomp( - #[cfg_attr(not(all(target_os = "linux", target_arch = "x86_64")), allow(unused_variables))] - prepare_worker_program_path: &Path, -) -> SecureModeResult { - cfg_if::cfg_if! { - if #[cfg(target_os = "linux")] { - cfg_if::cfg_if! { - if #[cfg(target_arch = "x86_64")] { - spawn_process_for_security_check( - prepare_worker_program_path, - "--check-can-enable-seccomp", - std::iter::empty::<&str>(), - ).await.map_err(|err| SecureModeError::CannotEnableSeccomp(err)) - } else { - Err(SecureModeError::CannotEnableSeccomp( - "only supported on CPUs from the x86_64 family (usually Intel or AMD)".into() - )) - } - } - } else { - cfg_if::cfg_if! { - if #[cfg(target_arch = "x86_64")] { - Err(SecureModeError::CannotEnableSeccomp( - "only supported on Linux".into() - )) - } else { - Err(SecureModeError::CannotEnableSeccomp( - "only supported on Linux and on CPUs from the x86_64 family (usually Intel or AMD).".into() - )) - } - } - } - } + +#[cfg(target_arch = "x86_64")] +async fn check_seccomp(prepare_worker_program_path: &Path) -> SecureModeResult { + spawn_process_for_security_check( + prepare_worker_program_path, + "--check-can-enable-seccomp", + std::iter::empty::<&str>(), + ) + .await + .map_err(|err| SecureModeError::CannotEnableSeccomp(err)) +} + +#[cfg(not(target_arch = "x86_64"))] +async fn check_seccomp(_: &Path) -> SecureModeResult { + Err(SecureModeError::CannotEnableSeccomp( + "only supported on CPUs from the x86_64 family (usually Intel or AMD)".into(), + )) } /// Check if we can call `clone` with all sandboxing flags, and return an error if not. @@ -306,26 +262,16 @@ async fn check_seccomp( /// We do this check by spawning a new process and trying to sandbox it. To get as close as possible /// to running the check in a worker, we try it... in a worker. The expected return status is 0 on /// success and -1 on failure. -async fn check_can_do_secure_clone( - #[cfg_attr(not(target_os = "linux"), allow(unused_variables))] - prepare_worker_program_path: &Path, -) -> SecureModeResult { - cfg_if::cfg_if! { - if #[cfg(target_os = "linux")] { - spawn_process_for_security_check( - prepare_worker_program_path, - "--check-can-do-secure-clone", - std::iter::empty::<&str>(), - ).await.map_err(|err| SecureModeError::CannotDoSecureClone(err)) - } else { - Err(SecureModeError::CannotDoSecureClone( - "only available on Linux".into() - )) - } - } +async fn check_can_do_secure_clone(prepare_worker_program_path: &Path) -> SecureModeResult { + spawn_process_for_security_check( + prepare_worker_program_path, + "--check-can-do-secure-clone", + std::iter::empty::<&str>(), + ) + .await + .map_err(|err| SecureModeError::CannotDoSecureClone(err)) } -#[cfg(target_os = "linux")] async fn spawn_process_for_security_check( prepare_worker_program_path: &Path, check_arg: &'static str, diff --git a/polkadot/node/core/pvf/src/worker_interface.rs b/polkadot/node/core/pvf/src/worker_interface.rs index ad9f0294c09400a47f249bdf16855b3c110f155a..93fffc80662266a6a1112f6d5120cb454bca6276 100644 --- a/polkadot/node/core/pvf/src/worker_interface.rs +++ b/polkadot/node/core/pvf/src/worker_interface.rs @@ -130,11 +130,11 @@ where fn make_tmppath(prefix: &str, dir: &Path) -> PathBuf { use rand::distributions::Alphanumeric; - const DESCRIMINATOR_LEN: usize = 10; + const DISCRIMINATOR_LEN: usize = 10; - let mut buf = Vec::with_capacity(prefix.len() + DESCRIMINATOR_LEN); + let mut buf = Vec::with_capacity(prefix.len() + DISCRIMINATOR_LEN); buf.extend(prefix.as_bytes()); - buf.extend(rand::thread_rng().sample_iter(&Alphanumeric).take(DESCRIMINATOR_LEN)); + buf.extend(rand::thread_rng().sample_iter(&Alphanumeric).take(DISCRIMINATOR_LEN)); let s = std::str::from_utf8(&buf) .expect("the string is collected from a valid utf-8 sequence; qed"); diff --git a/polkadot/node/core/pvf/tests/it/main.rs b/polkadot/node/core/pvf/tests/it/main.rs index bcc10749e746d05479997e161329bbc6b4c468ff..16ef23c69cad9d40d6cd79d2a754d8a347bfac3c 100644 --- a/polkadot/node/core/pvf/tests/it/main.rs +++ b/polkadot/node/core/pvf/tests/it/main.rs @@ -21,13 +21,14 @@ use parity_scale_codec::Encode as _; #[cfg(all(feature = "ci-only-tests", target_os = "linux"))] use polkadot_node_core_pvf::SecurityStatus; use polkadot_node_core_pvf::{ - start, testing::build_workers_and_get_paths, Config, InvalidCandidate, Metrics, PrepareError, - PrepareJobKind, PvfPrepData, ValidationError, ValidationHost, JOB_TIMEOUT_WALL_CLOCK_FACTOR, + start, testing::build_workers_and_get_paths, Config, InvalidCandidate, Metrics, + PossiblyInvalidError, PrepareError, PrepareJobKind, PvfPrepData, ValidationError, + ValidationHost, JOB_TIMEOUT_WALL_CLOCK_FACTOR, }; use polkadot_parachain_primitives::primitives::{BlockData, ValidationParams, ValidationResult}; use polkadot_primitives::{ExecutorParam, ExecutorParams}; -use std::time::Duration; +use std::{io::Write, time::Duration}; use tokio::sync::Mutex; mod adder; @@ -352,10 +353,80 @@ async fn deleting_prepared_artifact_does_not_dispute() { ) .await; - match result { - Err(ValidationError::Invalid(InvalidCandidate::HardTimeout)) => {}, - r => panic!("{:?}", r), + assert_matches!(result, Err(ValidationError::Invalid(InvalidCandidate::HardTimeout))); +} + +// Test that corruption of a prepared artifact does not lead to a dispute when we try to execute it. +#[tokio::test] +async fn corrupted_prepared_artifact_does_not_dispute() { + let host = TestHost::new().await; + let cache_dir = host.cache_dir.path(); + + let _stats = host.precheck_pvf(halt::wasm_binary_unwrap(), Default::default()).await.unwrap(); + + // Manually corrupting the prepared artifact from disk. The in-memory artifacts table won't + // change. + let artifact_path = { + // Get the artifact path (asserting it exists). + let mut cache_dir: Vec<_> = std::fs::read_dir(cache_dir).unwrap().collect(); + // Should contain the artifact and the worker dir. + assert_eq!(cache_dir.len(), 2); + let mut artifact_path = cache_dir.pop().unwrap().unwrap(); + if artifact_path.path().is_dir() { + artifact_path = cache_dir.pop().unwrap().unwrap(); + } + + // Corrupt the artifact. + let mut f = std::fs::OpenOptions::new() + .write(true) + .truncate(true) + .open(artifact_path.path()) + .unwrap(); + f.write_all(b"corrupted wasm").unwrap(); + f.flush().unwrap(); + artifact_path + }; + + assert!(artifact_path.path().exists()); + + // Try to validate, artifact should get removed because of the corruption. + let result = host + .validate_candidate( + halt::wasm_binary_unwrap(), + ValidationParams { + block_data: BlockData(Vec::new()), + parent_head: Default::default(), + relay_parent_number: 1, + relay_parent_storage_root: Default::default(), + }, + Default::default(), + ) + .await; + + assert_matches!( + result, + Err(ValidationError::PossiblyInvalid(PossiblyInvalidError::RuntimeConstruction(_))) + ); + + // because of RuntimeConstruction we may retry + host.precheck_pvf(halt::wasm_binary_unwrap(), Default::default()).await.unwrap(); + + // The actual artifact removal is done concurrently + // with sending of the result of the execution + // it is not a problem for further re-preparation as + // artifact filenames are random + for _ in 1..5 { + if !artifact_path.path().exists() { + break; + } + tokio::time::sleep(Duration::from_secs(1)).await; } + + assert!( + !artifact_path.path().exists(), + "the corrupted artifact ({}) should be deleted by the host", + artifact_path.path().display() + ); } #[tokio::test] @@ -472,9 +543,9 @@ async fn all_security_features_work() { // artifacts cache existing. #[cfg(all(feature = "ci-only-tests", target_os = "linux"))] #[tokio::test] -async fn nonexistant_cache_dir() { +async fn nonexistent_cache_dir() { let host = TestHost::new_with_config(|cfg| { - cfg.cache_path = cfg.cache_path.join("nonexistant_cache_dir"); + cfg.cache_path = cfg.cache_path.join("nonexistent_cache_dir"); }) .await; diff --git a/polkadot/node/core/runtime-api/Cargo.toml b/polkadot/node/core/runtime-api/Cargo.toml index 2de3a6ee325ad6d08ea3377e8fccee56b7e505fa..91f5c35b27949f9e0918eaad7adbe5f2557576e8 100644 --- a/polkadot/node/core/runtime-api/Cargo.toml +++ b/polkadot/node/core/runtime-api/Cargo.toml @@ -10,7 +10,7 @@ license.workspace = true workspace = true [dependencies] -futures = "0.3.21" +futures = "0.3.30" gum = { package = "tracing-gum", path = "../../gum" } schnellru = "0.2.1" @@ -25,8 +25,8 @@ polkadot-node-subsystem-types = { path = "../../subsystem-types" } sp-api = { path = "../../../../substrate/primitives/api" } sp-core = { path = "../../../../substrate/primitives/core" } sp-keyring = { path = "../../../../substrate/primitives/keyring" } -async-trait = "0.1.74" -futures = { version = "0.3.21", features = ["thread-pool"] } +async-trait = "0.1.79" +futures = { version = "0.3.30", features = ["thread-pool"] } polkadot-node-subsystem-test-helpers = { path = "../../subsystem-test-helpers" } polkadot-node-primitives = { path = "../../primitives" } test-helpers = { package = "polkadot-primitives-test-helpers", path = "../../../primitives/test-helpers" } diff --git a/polkadot/node/core/runtime-api/src/cache.rs b/polkadot/node/core/runtime-api/src/cache.rs index 5eca551db0a69f0edcab3cbba87c2029274b50ef..acdb256ab36ca7392c0947237df6d7feb449247d 100644 --- a/polkadot/node/core/runtime-api/src/cache.rs +++ b/polkadot/node/core/runtime-api/src/cache.rs @@ -14,17 +14,16 @@ // You should have received a copy of the GNU General Public License // along with Polkadot. If not, see . -use std::collections::btree_map::BTreeMap; +use std::collections::{btree_map::BTreeMap, VecDeque}; use schnellru::{ByLength, LruMap}; use sp_consensus_babe::Epoch; use polkadot_primitives::{ - async_backing, slashing, - vstaging::{self, ApprovalVotingParams}, - AuthorityDiscoveryId, BlockNumber, CandidateCommitments, CandidateEvent, CandidateHash, - CommittedCandidateReceipt, CoreState, DisputeState, ExecutorParams, GroupRotationInfo, Hash, - Id as ParaId, InboundDownwardMessage, InboundHrmpMessage, OccupiedCoreAssumption, + async_backing, slashing, ApprovalVotingParams, AuthorityDiscoveryId, BlockNumber, + CandidateCommitments, CandidateEvent, CandidateHash, CommittedCandidateReceipt, CoreIndex, + CoreState, DisputeState, ExecutorParams, GroupRotationInfo, Hash, Id as ParaId, + InboundDownwardMessage, InboundHrmpMessage, NodeFeatures, OccupiedCoreAssumption, PersistedValidationData, PvfCheckStatement, ScrapedOnChainVotes, SessionIndex, SessionInfo, ValidationCode, ValidationCodeHash, ValidatorId, ValidatorIndex, ValidatorSignature, }; @@ -68,8 +67,9 @@ pub(crate) struct RequestResultCache { disabled_validators: LruMap>, para_backing_state: LruMap<(Hash, ParaId), Option>, async_backing_params: LruMap, - node_features: LruMap, + node_features: LruMap, approval_voting_params: LruMap, + claim_queue: LruMap>>, } impl Default for RequestResultCache { @@ -105,6 +105,7 @@ impl Default for RequestResultCache { para_backing_state: LruMap::new(ByLength::new(DEFAULT_CACHE_CAP)), async_backing_params: LruMap::new(ByLength::new(DEFAULT_CACHE_CAP)), node_features: LruMap::new(ByLength::new(DEFAULT_CACHE_CAP)), + claim_queue: LruMap::new(ByLength::new(DEFAULT_CACHE_CAP)), } } } @@ -451,17 +452,14 @@ impl RequestResultCache { self.minimum_backing_votes.insert(session_index, minimum_backing_votes); } - pub(crate) fn node_features( - &mut self, - session_index: SessionIndex, - ) -> Option<&vstaging::NodeFeatures> { + pub(crate) fn node_features(&mut self, session_index: SessionIndex) -> Option<&NodeFeatures> { self.node_features.get(&session_index).map(|f| &*f) } pub(crate) fn cache_node_features( &mut self, session_index: SessionIndex, - features: vstaging::NodeFeatures, + features: NodeFeatures, ) { self.node_features.insert(session_index, features); } @@ -525,6 +523,21 @@ impl RequestResultCache { ) { self.approval_voting_params.insert(session_index, value); } + + pub(crate) fn claim_queue( + &mut self, + relay_parent: &Hash, + ) -> Option<&BTreeMap>> { + self.claim_queue.get(relay_parent).map(|v| &*v) + } + + pub(crate) fn cache_claim_queue( + &mut self, + relay_parent: Hash, + value: BTreeMap>, + ) { + self.claim_queue.insert(relay_parent, value); + } } pub(crate) enum RequestResult { @@ -576,5 +589,6 @@ pub(crate) enum RequestResult { DisabledValidators(Hash, Vec), ParaBackingState(Hash, ParaId, Option), AsyncBackingParams(Hash, async_backing::AsyncBackingParams), - NodeFeatures(SessionIndex, vstaging::NodeFeatures), + NodeFeatures(SessionIndex, NodeFeatures), + ClaimQueue(Hash, BTreeMap>), } diff --git a/polkadot/node/core/runtime-api/src/lib.rs b/polkadot/node/core/runtime-api/src/lib.rs index 4bedfd827340bc60b0101f1c854f207705bc0b31..2b7f6fc2d609f4dfcdf4e94fb63bf499376f6d07 100644 --- a/polkadot/node/core/runtime-api/src/lib.rs +++ b/polkadot/node/core/runtime-api/src/lib.rs @@ -177,6 +177,9 @@ where self.requests_cache.cache_async_backing_params(relay_parent, params), NodeFeatures(session_index, params) => self.requests_cache.cache_node_features(session_index, params), + ClaimQueue(relay_parent, sender) => { + self.requests_cache.cache_claim_queue(relay_parent, sender); + }, } } @@ -329,6 +332,8 @@ where Some(Request::NodeFeatures(index, sender)) } }, + Request::ClaimQueue(sender) => + query!(claim_queue(), sender).map(|sender| Request::ClaimQueue(sender)), } } @@ -433,6 +438,7 @@ where .unwrap_or_else(|e| { gum::warn!( target: LOG_TARGET, + api = ?stringify!($api_name), "cannot query the runtime API version: {}", e, ); @@ -625,5 +631,11 @@ where sender, result = (index) ), + Request::ClaimQueue(sender) => query!( + ClaimQueue, + claim_queue(), + ver = Request::CLAIM_QUEUE_RUNTIME_REQUIREMENT, + sender + ), } } diff --git a/polkadot/node/core/runtime-api/src/tests.rs b/polkadot/node/core/runtime-api/src/tests.rs index f91723b3d39e9a6548d94ffde1da534d2e7592ab..73c661c40762effc2efbbfa66f7f46a47bbe2d16 100644 --- a/polkadot/node/core/runtime-api/src/tests.rs +++ b/polkadot/node/core/runtime-api/src/tests.rs @@ -20,18 +20,17 @@ use polkadot_node_primitives::{BabeAllowedSlots, BabeEpoch, BabeEpochConfigurati use polkadot_node_subsystem::SpawnGlue; use polkadot_node_subsystem_test_helpers::make_subsystem_context; use polkadot_primitives::{ - async_backing, slashing, - vstaging::{ApprovalVotingParams, NodeFeatures}, - AuthorityDiscoveryId, BlockNumber, CandidateCommitments, CandidateEvent, CandidateHash, - CommittedCandidateReceipt, CoreState, DisputeState, ExecutorParams, GroupRotationInfo, - Id as ParaId, InboundDownwardMessage, InboundHrmpMessage, OccupiedCoreAssumption, + async_backing, slashing, ApprovalVotingParams, AuthorityDiscoveryId, BlockNumber, + CandidateCommitments, CandidateEvent, CandidateHash, CommittedCandidateReceipt, CoreIndex, + CoreState, DisputeState, ExecutorParams, GroupRotationInfo, Id as ParaId, + InboundDownwardMessage, InboundHrmpMessage, NodeFeatures, OccupiedCoreAssumption, PersistedValidationData, PvfCheckStatement, ScrapedOnChainVotes, SessionIndex, SessionInfo, Slot, ValidationCode, ValidationCodeHash, ValidatorId, ValidatorIndex, ValidatorSignature, }; use sp_api::ApiError; use sp_core::testing::TaskExecutor; use std::{ - collections::{BTreeMap, HashMap}, + collections::{BTreeMap, HashMap, VecDeque}, sync::{Arc, Mutex}, }; use test_helpers::{dummy_committed_candidate_receipt, dummy_validation_code}; @@ -286,17 +285,24 @@ impl RuntimeApiSubsystemClient for MockSubsystemClient { async fn disabled_validators(&self, _: Hash) -> Result, ApiError> { todo!("Not required for tests") } + + async fn claim_queue( + &self, + _: Hash, + ) -> Result>, ApiError> { + todo!("Not required for tests") + } } #[test] fn requests_authorities() { let (ctx, mut ctx_handle) = make_subsystem_context(TaskExecutor::new()); - let substem_client = Arc::new(MockSubsystemClient::default()); + let subsystem_client = Arc::new(MockSubsystemClient::default()); let relay_parent = [1; 32].into(); let spawner = sp_core::testing::TaskExecutor::new(); let subsystem = - RuntimeApiSubsystem::new(substem_client.clone(), Metrics(None), SpawnGlue(spawner)); + RuntimeApiSubsystem::new(subsystem_client.clone(), Metrics(None), SpawnGlue(spawner)); let subsystem_task = run(ctx, subsystem).map(|x| x.unwrap()); let test_task = async move { let (tx, rx) = oneshot::channel(); @@ -307,7 +313,7 @@ fn requests_authorities() { }) .await; - assert_eq!(rx.await.unwrap().unwrap(), substem_client.authorities); + assert_eq!(rx.await.unwrap().unwrap(), subsystem_client.authorities); ctx_handle.send(FromOrchestra::Signal(OverseerSignal::Conclude)).await; }; @@ -1034,7 +1040,7 @@ fn requests_submit_pvf_check_statement() { let _ = rx.await.unwrap().unwrap(); assert_eq!( - &*subsystem_client.submitted_pvf_check_statement.lock().expect("poisened mutex"), + &*subsystem_client.submitted_pvf_check_statement.lock().expect("poisoned mutex"), &[(stmt.clone(), sig.clone()), (stmt.clone(), sig.clone())] ); diff --git a/polkadot/node/gum/proc-macro/Cargo.toml b/polkadot/node/gum/proc-macro/Cargo.toml index 6fb38653e735428bad1f1da53c39fdc0863cbc6b..70126b4f43367ce11a1a23d462392b513ca1c028 100644 --- a/polkadot/node/gum/proc-macro/Cargo.toml +++ b/polkadot/node/gum/proc-macro/Cargo.toml @@ -16,8 +16,8 @@ targets = ["x86_64-unknown-linux-gnu"] proc-macro = true [dependencies] -syn = { version = "2.0.48", features = ["extra-traits", "full"] } -quote = "1.0.28" +syn = { features = ["extra-traits", "full"], workspace = true } +quote = { workspace = true } proc-macro2 = "1.0.56" proc-macro-crate = "3.0.0" expander = "2.0.0" diff --git a/polkadot/node/jaeger/Cargo.toml b/polkadot/node/jaeger/Cargo.toml index 892292c714b11bba1114f7016706299065378de6..bee725c0876f0cd57692d754738219dd731f8d62 100644 --- a/polkadot/node/jaeger/Cargo.toml +++ b/polkadot/node/jaeger/Cargo.toml @@ -16,8 +16,9 @@ parking_lot = "0.12.1" polkadot-primitives = { path = "../../primitives" } polkadot-node-primitives = { path = "../primitives" } sc-network = { path = "../../../substrate/client/network" } +sc-network-types = { path = "../../../substrate/client/network/types" } sp-core = { path = "../../../substrate/primitives/core" } -thiserror = "1.0.48" -tokio = "1.24.2" -log = "0.4.17" +thiserror = { workspace = true } +tokio = "1.37" +log = { workspace = true, default-features = true } parity-scale-codec = { version = "3.6.1", default-features = false } diff --git a/polkadot/node/jaeger/src/spans.rs b/polkadot/node/jaeger/src/spans.rs index 4038d41344f2db09908fc50c82ddd787d374f505..68fa57e2ca14f859b7bcfcf02884deaa34d7d156 100644 --- a/polkadot/node/jaeger/src/spans.rs +++ b/polkadot/node/jaeger/src/spans.rs @@ -70,7 +70,7 @@ //! let root_span = //! jaeger::Span::new(relay_parent, "root_of_aaall_spans"); //! -//! // the prefered way of adding additional delayed information: +//! // the preferred way of adding additional delayed information: //! let span = root_span.child("inner"); //! //! // ... more operations ... @@ -86,7 +86,7 @@ use parity_scale_codec::Encode; use polkadot_node_primitives::PoV; use polkadot_primitives::{BlakeTwo256, CandidateHash, Hash, HashT, Id as ParaId, ValidatorIndex}; -use sc_network::PeerId; +use sc_network_types::PeerId; use std::{fmt, sync::Arc}; diff --git a/polkadot/node/malus/Cargo.toml b/polkadot/node/malus/Cargo.toml index 6a3dff726ed328aecf37e4985ed0d7ec3eb07674..2f63c2f0938d72bea717ac5aff0b2faace47808b 100644 --- a/polkadot/node/malus/Cargo.toml +++ b/polkadot/node/malus/Cargo.toml @@ -40,11 +40,11 @@ polkadot-node-primitives = { path = "../primitives" } polkadot-primitives = { path = "../../primitives" } color-eyre = { version = "0.6.1", default-features = false } assert_matches = "1.5" -async-trait = "0.1.74" +async-trait = "0.1.79" sp-keystore = { path = "../../../substrate/primitives/keystore" } sp-core = { path = "../../../substrate/primitives/core" } -clap = { version = "4.4.18", features = ["derive"] } -futures = "0.3.21" +clap = { version = "4.5.3", features = ["derive"] } +futures = "0.3.30" futures-timer = "3.0.2" gum = { package = "tracing-gum", path = "../gum" } erasure = { package = "polkadot-erasure-coding", path = "../../erasure-coding" } @@ -58,7 +58,7 @@ polkadot-node-core-pvf-prepare-worker = { path = "../core/pvf/prepare-worker" } [dev-dependencies] polkadot-node-subsystem-test-helpers = { path = "../subsystem-test-helpers" } sp-core = { path = "../../../substrate/primitives/core" } -futures = { version = "0.3.21", features = ["thread-pool"] } +futures = { version = "0.3.30", features = ["thread-pool"] } [build-dependencies] substrate-build-script-utils = { path = "../../../substrate/utils/build-script-utils" } diff --git a/polkadot/node/malus/README.md b/polkadot/node/malus/README.md index e0c7893a75319ed40b6bde633309f209dac91225..25453a1980e4b8f66ac50d3be89eb798f4b2b0e6 100644 --- a/polkadot/node/malus/README.md +++ b/polkadot/node/malus/README.md @@ -18,7 +18,7 @@ defined in the [(DSL[(**D**omain **S**pecific **L**anguage)]) doc](https://parit ## Usage -> Assumes you already gained permissiones, ping in element `@javier:matrix.parity.io` to get access. +> Assumes you already gained permissions, ping in element `@javier:matrix.parity.io` to get access. > and you have cloned the [zombienet][zombienet] repo. To launch a test case in the development cluster use (e.g. for the ./node/malus/integrationtests/0001-dispute-valid-block.toml): diff --git a/polkadot/node/malus/src/variants/back_garbage_candidate.rs b/polkadot/node/malus/src/variants/back_garbage_candidate.rs index 82475d291422582f5197613d4f347baaf203b929..b939a2151e2359828da74d317c9e2bc0af2c6e0c 100644 --- a/polkadot/node/malus/src/variants/back_garbage_candidate.rs +++ b/polkadot/node/malus/src/variants/back_garbage_candidate.rs @@ -20,14 +20,13 @@ use polkadot_cli::{ service::{ - AuthorityDiscoveryApi, AuxStore, BabeApi, Block, Error, ExtendedOverseerGenArgs, - HeaderBackend, Overseer, OverseerConnector, OverseerGen, OverseerGenArgs, OverseerHandle, - ParachainHost, ProvideRuntimeApi, + AuxStore, Error, ExtendedOverseerGenArgs, Overseer, OverseerConnector, OverseerGen, + OverseerGenArgs, OverseerHandle, }, validator_overseer_builder, Cli, }; use polkadot_node_subsystem::SpawnGlue; -use polkadot_node_subsystem_types::DefaultSubsystemClient; +use polkadot_node_subsystem_types::{ChainApiBackend, RuntimeApiSubsystemClient}; use sp_core::traits::SpawnNamed; use crate::{ @@ -63,13 +62,9 @@ impl OverseerGen for BackGarbageCandidates { connector: OverseerConnector, args: OverseerGenArgs<'_, Spawner, RuntimeClient>, ext_args: Option, - ) -> Result< - (Overseer, Arc>>, OverseerHandle), - Error, - > + ) -> Result<(Overseer, Arc>, OverseerHandle), Error> where - RuntimeClient: 'static + ProvideRuntimeApi + HeaderBackend + AuxStore, - RuntimeClient::Api: ParachainHost + BabeApi + AuthorityDiscoveryApi, + RuntimeClient: RuntimeApiSubsystemClient + ChainApiBackend + AuxStore + 'static, Spawner: 'static + SpawnNamed + Clone + Unpin, { let spawner = args.spawner.clone(); diff --git a/polkadot/node/malus/src/variants/common.rs b/polkadot/node/malus/src/variants/common.rs index 011fcc80e37331909434ccd2fa1bfa1e96f48f35..eb6988f81811687442a36ae3f8ec225de48dd9df 100644 --- a/polkadot/node/malus/src/variants/common.rs +++ b/polkadot/node/malus/src/variants/common.rs @@ -23,10 +23,6 @@ use crate::{ use polkadot_node_core_candidate_validation::find_validation_data; use polkadot_node_primitives::{InvalidCandidate, ValidationResult}; -use polkadot_node_subsystem::{ - messages::{CandidateValidationMessage, ValidationFailed}, - overseer, -}; use polkadot_primitives::{ CandidateCommitments, CandidateDescriptor, CandidateReceipt, PersistedValidationData, diff --git a/polkadot/node/malus/src/variants/dispute_finalized_candidates.rs b/polkadot/node/malus/src/variants/dispute_finalized_candidates.rs index b3555ba2f5beb3e45285bc443dee9a4d029b070b..7a95bdaead26e204bd4cd8b386ae02b5e12297f9 100644 --- a/polkadot/node/malus/src/variants/dispute_finalized_candidates.rs +++ b/polkadot/node/malus/src/variants/dispute_finalized_candidates.rs @@ -34,14 +34,13 @@ use futures::channel::oneshot; use polkadot_cli::{ service::{ - AuthorityDiscoveryApi, AuxStore, BabeApi, Block, Error, ExtendedOverseerGenArgs, - HeaderBackend, Overseer, OverseerConnector, OverseerGen, OverseerGenArgs, OverseerHandle, - ParachainHost, ProvideRuntimeApi, + AuxStore, Error, ExtendedOverseerGenArgs, Overseer, OverseerConnector, OverseerGen, + OverseerGenArgs, OverseerHandle, }, validator_overseer_builder, Cli, }; -use polkadot_node_subsystem::{messages::ApprovalVotingMessage, SpawnGlue}; -use polkadot_node_subsystem_types::{DefaultSubsystemClient, OverseerSignal}; +use polkadot_node_subsystem::SpawnGlue; +use polkadot_node_subsystem_types::{ChainApiBackend, OverseerSignal, RuntimeApiSubsystemClient}; use polkadot_node_subsystem_util::request_candidate_events; use polkadot_primitives::CandidateEvent; use sp_core::traits::SpawnNamed; @@ -237,13 +236,9 @@ impl OverseerGen for DisputeFinalizedCandidates { connector: OverseerConnector, args: OverseerGenArgs<'_, Spawner, RuntimeClient>, ext_args: Option, - ) -> Result< - (Overseer, Arc>>, OverseerHandle), - Error, - > + ) -> Result<(Overseer, Arc>, OverseerHandle), Error> where - RuntimeClient: 'static + ProvideRuntimeApi + HeaderBackend + AuxStore, - RuntimeClient::Api: ParachainHost + BabeApi + AuthorityDiscoveryApi, + RuntimeClient: RuntimeApiSubsystemClient + ChainApiBackend + AuxStore + 'static, Spawner: 'static + SpawnNamed + Clone + Unpin, { gum::info!( diff --git a/polkadot/node/malus/src/variants/dispute_valid_candidates.rs b/polkadot/node/malus/src/variants/dispute_valid_candidates.rs index b9812cbb5012a4ff97e3f1ed146538147efda03b..a50fdce16e4ec41d6b9bea4f0190616f756d9193 100644 --- a/polkadot/node/malus/src/variants/dispute_valid_candidates.rs +++ b/polkadot/node/malus/src/variants/dispute_valid_candidates.rs @@ -24,14 +24,13 @@ use polkadot_cli::{ service::{ - AuthorityDiscoveryApi, AuxStore, BabeApi, Block, Error, ExtendedOverseerGenArgs, - HeaderBackend, Overseer, OverseerConnector, OverseerGen, OverseerGenArgs, OverseerHandle, - ParachainHost, ProvideRuntimeApi, + AuxStore, Error, ExtendedOverseerGenArgs, Overseer, OverseerConnector, OverseerGen, + OverseerGenArgs, OverseerHandle, }, validator_overseer_builder, Cli, }; use polkadot_node_subsystem::SpawnGlue; -use polkadot_node_subsystem_types::DefaultSubsystemClient; +use polkadot_node_subsystem_types::{ChainApiBackend, RuntimeApiSubsystemClient}; use sp_core::traits::SpawnNamed; // Filter wrapping related types. @@ -80,13 +79,9 @@ impl OverseerGen for DisputeValidCandidates { connector: OverseerConnector, args: OverseerGenArgs<'_, Spawner, RuntimeClient>, ext_args: Option, - ) -> Result< - (Overseer, Arc>>, OverseerHandle), - Error, - > + ) -> Result<(Overseer, Arc>, OverseerHandle), Error> where - RuntimeClient: 'static + ProvideRuntimeApi + HeaderBackend + AuxStore, - RuntimeClient::Api: ParachainHost + BabeApi + AuthorityDiscoveryApi, + RuntimeClient: RuntimeApiSubsystemClient + ChainApiBackend + AuxStore + 'static, Spawner: 'static + SpawnNamed + Clone + Unpin, { let spawner = args.spawner.clone(); diff --git a/polkadot/node/malus/src/variants/suggest_garbage_candidate.rs b/polkadot/node/malus/src/variants/suggest_garbage_candidate.rs index 22b44ddd1dc359620b199118bebf0bb83b69dada..739ed40db362a2ae330f14b7a24cc77c1ab76159 100644 --- a/polkadot/node/malus/src/variants/suggest_garbage_candidate.rs +++ b/polkadot/node/malus/src/variants/suggest_garbage_candidate.rs @@ -25,14 +25,13 @@ use futures::channel::oneshot; use polkadot_cli::{ service::{ - AuthorityDiscoveryApi, AuxStore, BabeApi, Block, Error, ExtendedOverseerGenArgs, - HeaderBackend, Overseer, OverseerConnector, OverseerGen, OverseerGenArgs, OverseerHandle, - ParachainHost, ProvideRuntimeApi, + AuxStore, Error, ExtendedOverseerGenArgs, Overseer, OverseerConnector, OverseerGen, + OverseerGenArgs, OverseerHandle, }, validator_overseer_builder, Cli, }; use polkadot_node_primitives::{AvailableData, BlockData, PoV}; -use polkadot_node_subsystem_types::DefaultSubsystemClient; +use polkadot_node_subsystem_types::{ChainApiBackend, RuntimeApiSubsystemClient}; use polkadot_primitives::{CandidateDescriptor, CandidateReceipt}; use polkadot_node_subsystem_util::request_validators; @@ -52,7 +51,7 @@ use crate::{ // Import extra types relevant to the particular // subsystem. -use polkadot_node_subsystem::{messages::CandidateBackingMessage, SpawnGlue}; +use polkadot_node_subsystem::SpawnGlue; use std::sync::Arc; @@ -296,13 +295,9 @@ impl OverseerGen for SuggestGarbageCandidates { connector: OverseerConnector, args: OverseerGenArgs<'_, Spawner, RuntimeClient>, ext_args: Option, - ) -> Result< - (Overseer, Arc>>, OverseerHandle), - Error, - > + ) -> Result<(Overseer, Arc>, OverseerHandle), Error> where - RuntimeClient: 'static + ProvideRuntimeApi + HeaderBackend + AuxStore, - RuntimeClient::Api: ParachainHost + BabeApi + AuthorityDiscoveryApi, + RuntimeClient: RuntimeApiSubsystemClient + ChainApiBackend + AuxStore + 'static, Spawner: 'static + SpawnNamed + Clone + Unpin, { gum::info!( diff --git a/polkadot/node/malus/src/variants/support_disabled.rs b/polkadot/node/malus/src/variants/support_disabled.rs index e25df56fd643cdde44b861973751b1cd23e25480..169c442db25b7426f44cdfbe2c4181233802a914 100644 --- a/polkadot/node/malus/src/variants/support_disabled.rs +++ b/polkadot/node/malus/src/variants/support_disabled.rs @@ -19,14 +19,13 @@ use polkadot_cli::{ service::{ - AuthorityDiscoveryApi, AuxStore, BabeApi, Block, Error, ExtendedOverseerGenArgs, - HeaderBackend, Overseer, OverseerConnector, OverseerGen, OverseerGenArgs, OverseerHandle, - ParachainHost, ProvideRuntimeApi, + AuxStore, Error, ExtendedOverseerGenArgs, Overseer, OverseerConnector, OverseerGen, + OverseerGenArgs, OverseerHandle, }, validator_overseer_builder, Cli, }; use polkadot_node_subsystem::SpawnGlue; -use polkadot_node_subsystem_types::DefaultSubsystemClient; +use polkadot_node_subsystem_types::{ChainApiBackend, RuntimeApiSubsystemClient}; use sp_core::traits::SpawnNamed; use crate::interceptor::*; @@ -50,13 +49,9 @@ impl OverseerGen for SupportDisabled { connector: OverseerConnector, args: OverseerGenArgs<'_, Spawner, RuntimeClient>, ext_args: Option, - ) -> Result< - (Overseer, Arc>>, OverseerHandle), - Error, - > + ) -> Result<(Overseer, Arc>, OverseerHandle), Error> where - RuntimeClient: 'static + ProvideRuntimeApi + HeaderBackend + AuxStore, - RuntimeClient::Api: ParachainHost + BabeApi + AuthorityDiscoveryApi, + RuntimeClient: RuntimeApiSubsystemClient + ChainApiBackend + AuxStore + 'static, Spawner: 'static + SpawnNamed + Clone + Unpin, { validator_overseer_builder( diff --git a/polkadot/node/metrics/Cargo.toml b/polkadot/node/metrics/Cargo.toml index 7d67c0a58d3b0a58904e8e1b00e0e13a1f48e710..fbf0abf829e136a139f3de0db3aef216b2e49679 100644 --- a/polkadot/node/metrics/Cargo.toml +++ b/polkadot/node/metrics/Cargo.toml @@ -10,7 +10,7 @@ license.workspace = true workspace = true [dependencies] -futures = "0.3.21" +futures = "0.3.30" futures-timer = "3.0.2" gum = { package = "tracing-gum", path = "../gum" } @@ -24,13 +24,13 @@ sc-tracing = { path = "../../../substrate/client/tracing" } codec = { package = "parity-scale-codec", version = "3.6.1" } primitives = { package = "polkadot-primitives", path = "../../primitives" } bs58 = { version = "0.5.0", features = ["alloc"] } -log = "0.4.17" +log = { workspace = true, default-features = true } [dev-dependencies] assert_cmd = "2.0.4" tempfile = "3.2.0" hyper = { version = "0.14.20", default-features = false, features = ["http1", "tcp"] } -tokio = "1.24.2" +tokio = "1.37" polkadot-test-service = { path = "../test/service", features = ["runtime-metrics"] } substrate-test-utils = { path = "../../../substrate/test-utils" } sc-service = { path = "../../../substrate/client/service" } diff --git a/polkadot/node/network/approval-distribution/Cargo.toml b/polkadot/node/network/approval-distribution/Cargo.toml index a1fa803abc25fcbe587c4c574902ca8dbf63ad4b..4c04ad83f84f3c75e69ac8771670816b7ea7b4fa 100644 --- a/polkadot/node/network/approval-distribution/Cargo.toml +++ b/polkadot/node/network/approval-distribution/Cargo.toml @@ -20,7 +20,7 @@ polkadot-node-jaeger = { path = "../../jaeger" } rand = "0.8" itertools = "0.10.5" -futures = "0.3.21" +futures = "0.3.30" futures-timer = "3.0.2" gum = { package = "tracing-gum", path = "../../gum" } bitvec = { version = "1.0.0", default-features = false, features = ["alloc"] } @@ -37,5 +37,5 @@ schnorrkel = { version = "0.11.4", default-features = false } # rand_core should match schnorrkel rand_core = "0.6.2" rand_chacha = "0.3.1" -env_logger = "0.9.0" -log = "0.4.17" +env_logger = "0.11" +log = { workspace = true, default-features = true } diff --git a/polkadot/node/network/approval-distribution/src/lib.rs b/polkadot/node/network/approval-distribution/src/lib.rs index f4e40270160cbf54cfeb516c5d7deeed59e7373a..d360a18423e6bdea62ee0609cf5ea67f16e2e68e 100644 --- a/polkadot/node/network/approval-distribution/src/lib.rs +++ b/polkadot/node/network/approval-distribution/src/lib.rs @@ -230,7 +230,7 @@ impl ApprovalEntry { Ok(()) } - // Get the assignment certiticate and claimed candidates. + // Get the assignment certificate and claimed candidates. pub fn assignment(&self) -> (IndirectAssignmentCertV2, CandidateBitfield) { (self.assignment.clone(), self.assignment_claimed_candidates.clone()) } @@ -404,7 +404,7 @@ impl Knowledge { }, }; - // In case of succesful insertion of multiple candidate assignments create additional + // In case of successful insertion of multiple candidate assignments create additional // entries for each assigned candidate. This fakes knowledge of individual assignments, but // we need to share the same `MessageSubject` with the followup approval candidate index. if kind == MessageKind::Assignment && success && message.1.count_ones() > 1 { @@ -1897,10 +1897,10 @@ impl State { _ => break, }; - // Any peer which is in the `known_by` see and we know its peer_id authorithy id + // Any peer which is in the `known_by` see and we know its peer_id authority id // mapping has already been sent all messages it's meant to get for that block and // all in-scope prior blocks. In case, we just learnt about its peer_id - // authorithy-id mapping we have to retry sending the messages that should be sent + // authority-id mapping we have to retry sending the messages that should be sent // to it for all un-finalized blocks. if entry.known_by.contains_key(&peer_id) && !retry_known_blocks { break @@ -2199,7 +2199,7 @@ impl State { sanitized_assignments } - // Filter out obviously invalid candidate indicies. + // Filter out obviously invalid candidate indices. async fn sanitize_v1_approvals( &mut self, peer_id: PeerId, @@ -2226,7 +2226,7 @@ impl State { sanitized_approvals } - // Filter out obviously invalid candidate indicies. + // Filter out obviously invalid candidate indices. async fn sanitize_v2_approvals( &mut self, peer_id: PeerId, @@ -2260,7 +2260,7 @@ impl State { // The modifier accepts as inputs the current required-routing state, whether // the message is locally originating, and the validator index of the message issuer. // -// Then, if the topology is known, this progates messages to all peers in the required +// Then, if the topology is known, this propagates messages to all peers in the required // routing set which are aware of the block. Peers which are unaware of the block // will have the message sent when it enters their view in `unify_with_peer`. // @@ -2440,7 +2440,7 @@ impl ApprovalDistribution { gum::trace!(target: LOG_TARGET, "active leaves signal (ignored)"); // the relay chain blocks relevant to the approval subsystems // are those that are available, but not finalized yet - // actived and deactivated heads hence are irrelevant to this subsystem, other than + // activated and deactivated heads hence are irrelevant to this subsystem, other than // for tracing purposes. if let Some(activated) = update.activated { let head = activated.hash; diff --git a/polkadot/node/network/approval-distribution/src/metrics.rs b/polkadot/node/network/approval-distribution/src/metrics.rs index 0642b1b2e0cdcea51d4a34263bad87ad6612f035..60c7f2f6d3b895c1f406ed8f3dfbbbe5c499eab1 100644 --- a/polkadot/node/network/approval-distribution/src/metrics.rs +++ b/polkadot/node/network/approval-distribution/src/metrics.rs @@ -299,7 +299,7 @@ impl MetricsTrait for Metrics { prometheus::CounterVec::new( prometheus::Opts::new( "polkadot_parachain_assignments_received_result", - "Result of a processed assignement", + "Result of a processed assignment", ), &["status"] )?, diff --git a/polkadot/node/network/approval-distribution/src/tests.rs b/polkadot/node/network/approval-distribution/src/tests.rs index 6c88dd53ad364ab0eabed065c9098c1dfcdd81d9..3159fe2ae5e8d4e4df0ba7bf2f4c42b44d658686 100644 --- a/polkadot/node/network/approval-distribution/src/tests.rs +++ b/polkadot/node/network/approval-distribution/src/tests.rs @@ -394,7 +394,7 @@ fn try_import_the_same_assignment() { setup_peer_with_view(overseer, &peer_b, view![hash], ValidationVersion::V1).await; setup_peer_with_view(overseer, &peer_c, view![hash], ValidationVersion::V1).await; - // Set up a gossip topology, where a, b, c and d are topology neighboors to the node under + // Set up a gossip topology, where a, b, c and d are topology neighbors to the node under // testing. let peers_with_optional_peer_id = peers .iter() @@ -491,7 +491,7 @@ fn try_import_the_same_assignment_v2() { setup_peer_with_view(overseer, &peer_b, view![hash], ValidationVersion::V3).await; setup_peer_with_view(overseer, &peer_c, view![hash], ValidationVersion::V3).await; - // Set up a gossip topology, where a, b, c and d are topology neighboors to the node under + // Set up a gossip topology, where a, b, c and d are topology neighbors to the node under // testing. let peers_with_optional_peer_id = peers .iter() @@ -744,7 +744,7 @@ fn peer_sending_us_the_same_we_just_sent_them_is_ok() { .iter() .map(|(peer_id, authority)| (Some(*peer_id), authority.clone())) .collect_vec(); - // Setup a topology where peer_a is neigboor to current node. + // Setup a topology where peer_a is neighbor to current node. setup_gossip_topology( overseer, make_gossip_topology(1, &peers_with_optional_peer_id, &[0], &[2], 1), @@ -850,7 +850,7 @@ fn import_approval_happy_path_v1_v2_peers() { .iter() .map(|(peer_id, authority)| (Some(*peer_id), authority.clone())) .collect_vec(); - // Set up a gossip topology, where a, b, and c are topology neighboors to the node. + // Set up a gossip topology, where a, b, and c are topology neighbors to the node. setup_gossip_topology( overseer, make_gossip_topology(1, &peers_with_optional_peer_id, &[0, 1], &[2, 4], 3), @@ -972,7 +972,7 @@ fn import_approval_happy_path_v2() { .iter() .map(|(peer_id, authority)| (Some(*peer_id), authority.clone())) .collect_vec(); - // Set up a gossip topology, where a, b, and c are topology neighboors to the node. + // Set up a gossip topology, where a, b, and c are topology neighbors to the node. setup_gossip_topology( overseer, make_gossip_topology(1, &peers_with_optional_peer_id, &[0, 1], &[2, 4], 3), @@ -1083,7 +1083,7 @@ fn multiple_assignments_covered_with_one_approval_vote() { .iter() .map(|(peer_id, authority)| (Some(*peer_id), authority.clone())) .collect_vec(); - // Set up a gossip topology, where a, b, and c, d are topology neighboors to the node. + // Set up a gossip topology, where a, b, and c, d are topology neighbors to the node. setup_gossip_topology( overseer, make_gossip_topology(1, &peers_with_optional_peer_id, &[0, 1], &[2, 4], 3), @@ -1273,7 +1273,7 @@ fn unify_with_peer_multiple_assignments_covered_with_one_approval_vote() { .iter() .map(|(peer_id, authority)| (Some(*peer_id), authority.clone())) .collect_vec(); - // Set up a gossip topology, where a, b, and c, d are topology neighboors to the node. + // Set up a gossip topology, where a, b, and c, d are topology neighbors to the node. setup_gossip_topology( overseer, make_gossip_topology(1, &peers_with_optional_peer_id, &[0, 1], &[2, 4], 3), @@ -1631,7 +1631,7 @@ fn update_peer_view() { .iter() .map(|(peer_id, authority)| (Some(*peer_id), authority.clone())) .collect_vec(); - // Setup a topology where peer_a is neigboor to current node. + // Setup a topology where peer_a is neighbor to current node. setup_gossip_topology( overseer, make_gossip_topology(1, &peers_with_optional_peer_id, &[0], &[2], 1), @@ -1758,7 +1758,7 @@ fn update_peer_view() { assert!(state.blocks.get(&hash_c).unwrap().known_by.get(peer).is_none()); } -// Tests that updating the known peer_id for a given authorithy updates the topology +// Tests that updating the known peer_id for a given authority updates the topology // and sends the required messages #[test] fn update_peer_authority_id() { @@ -1770,9 +1770,9 @@ fn update_peer_authority_id() { let neighbour_x_index = 0; let neighbour_y_index = 2; let local_index = 1; - // X neighbour, we simulate that PeerId is not known in the beginining. + // X neighbour, we simulate that PeerId is not known in the beginning. let neighbour_x = peers.get(neighbour_x_index).unwrap().0; - // Y neighbour, we simulate that PeerId is not known in the beginining. + // Y neighbour, we simulate that PeerId is not known in the beginning. let neighbour_y = peers.get(neighbour_y_index).unwrap().0; let _state = test_harness(State::default(), |mut virtual_overseer| async move { @@ -1814,7 +1814,7 @@ fn update_peer_authority_id() { }) .collect_vec(); - // Setup a topology where peer_a is neigboor to current node. + // Setup a topology where peer_a is neighbor to current node. setup_gossip_topology( overseer, make_gossip_topology( @@ -2053,7 +2053,7 @@ fn sends_assignments_even_when_state_is_approved() { .iter() .map(|(peer_id, authority)| (Some(*peer_id), authority.clone())) .collect_vec(); - // Setup a topology where peer_a is neigboor to current node. + // Setup a topology where peer_a is neighbor to current node. setup_gossip_topology( overseer, make_gossip_topology(1, &peers_with_optional_peer_id, &[0], &[2], 1), @@ -2125,7 +2125,7 @@ fn sends_assignments_even_when_state_is_approved() { } /// Same as `sends_assignments_even_when_state_is_approved_v2` but with `VRFModuloCompact` -/// assignemnts. +/// assignments. #[test] fn sends_assignments_even_when_state_is_approved_v2() { let peers = make_peers_and_authority_ids(8); @@ -2153,7 +2153,7 @@ fn sends_assignments_even_when_state_is_approved_v2() { .iter() .map(|(peer_id, authority)| (Some(*peer_id), authority.clone())) .collect_vec(); - // Setup a topology where peer_a is neigboor to current node. + // Setup a topology where peer_a is neighbor to current node. setup_gossip_topology( overseer, make_gossip_topology(1, &peers_with_optional_peer_id, &[0], &[2], 1), @@ -3509,7 +3509,7 @@ fn import_versioned_approval() { setup_peer_with_view(overseer, &peer_b, view![hash], ValidationVersion::V1).await; setup_peer_with_view(overseer, &peer_c, view![hash], ValidationVersion::V2).await; - // Set up a gossip topology, where a, b, c and d are topology neighboors to the node under + // Set up a gossip topology, where a, b, c and d are topology neighbors to the node under // testing. let peers_with_optional_peer_id = peers .iter() diff --git a/polkadot/node/network/availability-distribution/Cargo.toml b/polkadot/node/network/availability-distribution/Cargo.toml index a1484429ed633a09974e230bcf5be118f7280e15..b5636203f166efdbc2d871df778d148c0f9ce3e4 100644 --- a/polkadot/node/network/availability-distribution/Cargo.toml +++ b/polkadot/node/network/availability-distribution/Cargo.toml @@ -10,7 +10,7 @@ license.workspace = true workspace = true [dependencies] -futures = "0.3.21" +futures = "0.3.30" gum = { package = "tracing-gum", path = "../../gum" } parity-scale-codec = { version = "3.6.1", features = ["std"] } polkadot-primitives = { path = "../../../primitives" } @@ -21,7 +21,7 @@ polkadot-node-subsystem-util = { path = "../../subsystem-util" } polkadot-node-primitives = { path = "../../primitives" } sp-core = { path = "../../../../substrate/primitives/core", features = ["std"] } sp-keystore = { path = "../../../../substrate/primitives/keystore" } -thiserror = "1.0.48" +thiserror = { workspace = true } rand = "0.8.5" derive_more = "0.99.17" schnellru = "0.2.1" @@ -36,3 +36,14 @@ sc-network = { path = "../../../../substrate/client/network" } futures-timer = "3.0.2" assert_matches = "1.4.0" polkadot-primitives-test-helpers = { path = "../../../primitives/test-helpers" } +polkadot-subsystem-bench = { path = "../../subsystem-bench" } + + +[[bench]] +name = "availability-distribution-regression-bench" +path = "benches/availability-distribution-regression-bench.rs" +harness = false +required-features = ["subsystem-benchmarks"] + +[features] +subsystem-benchmarks = [] diff --git a/polkadot/node/network/availability-distribution/benches/availability-distribution-regression-bench.rs b/polkadot/node/network/availability-distribution/benches/availability-distribution-regression-bench.rs new file mode 100644 index 0000000000000000000000000000000000000000..0d4f4f49e31f4d77342a3c084431e75f3c9e0725 --- /dev/null +++ b/polkadot/node/network/availability-distribution/benches/availability-distribution-regression-bench.rs @@ -0,0 +1,93 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +//! availability-read regression tests +//! +//! Availability read benchmark based on Kusama parameters and scale. +//! +//! Subsystems involved: +//! - availability-distribution +//! - bitfield-distribution +//! - availability-store + +use polkadot_subsystem_bench::{ + availability::{benchmark_availability_write, prepare_test, TestState}, + configuration::TestConfiguration, + usage::BenchmarkUsage, + utils::save_to_file, +}; +use std::io::Write; + +const BENCH_COUNT: usize = 5; + +fn main() -> Result<(), String> { + let mut messages = vec![]; + let mut config = TestConfiguration::default(); + // A single node effort roughly + config.n_cores = 10; + config.n_validators = 500; + config.num_blocks = 3; + config.connectivity = 100; + config.latency = None; + config.generate_pov_sizes(); + let state = TestState::new(&config); + + println!("Benchmarking..."); + let usages: Vec = (0..BENCH_COUNT) + .map(|n| { + print!("\r[{}{}]", "#".repeat(n), "_".repeat(BENCH_COUNT - n)); + std::io::stdout().flush().unwrap(); + let (mut env, _cfgs) = prepare_test( + &state, + polkadot_subsystem_bench::availability::TestDataAvailability::Write, + false, + ); + env.runtime().block_on(benchmark_availability_write( + "data_availability_write", + &mut env, + &state, + )) + }) + .collect(); + println!("\rDone!{}", " ".repeat(BENCH_COUNT)); + + let average_usage = BenchmarkUsage::average(&usages); + save_to_file( + "charts/availability-distribution-regression-bench.json", + average_usage.to_chart_json().map_err(|e| e.to_string())?, + ) + .map_err(|e| e.to_string())?; + println!("{}", average_usage); + + // We expect no variance for received and sent + // but use 0.001 because we operate with floats + messages.extend(average_usage.check_network_usage(&[ + ("Received from peers", 433.3, 0.001), + ("Sent to peers", 18480.0, 0.001), + ])); + messages.extend(average_usage.check_cpu_usage(&[ + ("availability-distribution", 0.012, 0.05), + ("availability-store", 0.153, 0.05), + ("bitfield-distribution", 0.026, 0.05), + ])); + + if messages.is_empty() { + Ok(()) + } else { + eprintln!("{}", messages.join("\n")); + Err("Regressions found".to_string()) + } +} diff --git a/polkadot/node/network/availability-distribution/src/pov_requester/mod.rs b/polkadot/node/network/availability-distribution/src/pov_requester/mod.rs index 4e23030aa499003a92b0e7c3eab858bfa5a55f2d..f99002d4188bf584b927510d86ec0ef3eb272baa 100644 --- a/polkadot/node/network/availability-distribution/src/pov_requester/mod.rs +++ b/polkadot/node/network/availability-distribution/src/pov_requester/mod.rs @@ -147,9 +147,7 @@ mod tests { AllMessages, AvailabilityDistributionMessage, RuntimeApiMessage, RuntimeApiRequest, }; use polkadot_node_subsystem_test_helpers as test_helpers; - use polkadot_primitives::{ - vstaging::NodeFeatures, CandidateHash, ExecutorParams, Hash, ValidatorIndex, - }; + use polkadot_primitives::{CandidateHash, ExecutorParams, Hash, NodeFeatures, ValidatorIndex}; use test_helpers::mock::make_ferdie_keystore; use super::*; diff --git a/polkadot/node/network/availability-distribution/src/requester/fetch_task/mod.rs b/polkadot/node/network/availability-distribution/src/requester/fetch_task/mod.rs index 191ee2acd973b2391773a8ca8e5fdcf7032009e5..f478defcaa96530d695eace0acad11057609d8e9 100644 --- a/polkadot/node/network/availability-distribution/src/requester/fetch_task/mod.rs +++ b/polkadot/node/network/availability-distribution/src/requester/fetch_task/mod.rs @@ -348,7 +348,7 @@ impl RunningTask { async fn do_request( &mut self, validator: &AuthorityDiscoveryId, - nerwork_error_freq: &mut gum::Freq, + network_error_freq: &mut gum::Freq, canceled_freq: &mut gum::Freq, ) -> std::result::Result { gum::trace!( @@ -395,7 +395,7 @@ impl RunningTask { }, Err(RequestError::NetworkError(err)) => { gum::warn_if_frequent!( - freq: nerwork_error_freq, + freq: network_error_freq, max_rate: gum::Times::PerHour(100), target: LOG_TARGET, origin = ?validator, diff --git a/polkadot/node/network/availability-distribution/src/requester/tests.rs b/polkadot/node/network/availability-distribution/src/requester/tests.rs index 2f5d900b037e322e92f0e203fbb8f2a1fcf43492..0dedd4f091acd692c5b319f5669c1356bf335e2b 100644 --- a/polkadot/node/network/availability-distribution/src/requester/tests.rs +++ b/polkadot/node/network/availability-distribution/src/requester/tests.rs @@ -25,7 +25,7 @@ use polkadot_node_primitives::{BlockData, ErasureChunk, PoV}; use polkadot_node_subsystem_test_helpers::mock::new_leaf; use polkadot_node_subsystem_util::runtime::RuntimeInfo; use polkadot_primitives::{ - vstaging::NodeFeatures, BlockNumber, CoreState, ExecutorParams, GroupIndex, Hash, Id as ParaId, + BlockNumber, CoreState, ExecutorParams, GroupIndex, Hash, Id as ParaId, NodeFeatures, ScheduledCore, SessionIndex, SessionInfo, }; use sp_core::traits::SpawnNamed; diff --git a/polkadot/node/network/availability-distribution/src/tests/mod.rs b/polkadot/node/network/availability-distribution/src/tests/mod.rs index d0aee7e5e010499db55ed78b7b9627cd7cab6e9b..214498979fb68307ce45705e396a7e306d53da87 100644 --- a/polkadot/node/network/availability-distribution/src/tests/mod.rs +++ b/polkadot/node/network/availability-distribution/src/tests/mod.rs @@ -19,7 +19,7 @@ use std::collections::HashSet; use futures::{executor, future, Future}; use polkadot_node_network_protocol::request_response::{IncomingRequest, ReqProtocolNames}; -use polkadot_primitives::{CoreState, Hash}; +use polkadot_primitives::{Block, CoreState, Hash}; use sp_keystore::KeystorePtr; use polkadot_node_subsystem_test_helpers as test_helpers; @@ -44,9 +44,14 @@ fn test_harness>( let genesis_hash = Hash::repeat_byte(0xff); let req_protocol_names = ReqProtocolNames::new(&genesis_hash, None); - let (pov_req_receiver, pov_req_cfg) = IncomingRequest::get_config_receiver(&req_protocol_names); - let (chunk_req_receiver, chunk_req_cfg) = - IncomingRequest::get_config_receiver(&req_protocol_names); + let (pov_req_receiver, pov_req_cfg) = IncomingRequest::get_config_receiver::< + Block, + sc_network::NetworkWorker, + >(&req_protocol_names); + let (chunk_req_receiver, chunk_req_cfg) = IncomingRequest::get_config_receiver::< + Block, + sc_network::NetworkWorker, + >(&req_protocol_names); let subsystem = AvailabilityDistributionSubsystem::new( keystore, IncomingRequestReceivers { pov_req_receiver, chunk_req_receiver }, diff --git a/polkadot/node/network/availability-distribution/src/tests/state.rs b/polkadot/node/network/availability-distribution/src/tests/state.rs index 66a8d8fcdcf9ac4db556d872c121e25832bf21cb..93411511e763af437d7813c9e5d83bac4609959e 100644 --- a/polkadot/node/network/availability-distribution/src/tests/state.rs +++ b/polkadot/node/network/availability-distribution/src/tests/state.rs @@ -47,8 +47,8 @@ use polkadot_node_subsystem::{ }; use polkadot_node_subsystem_test_helpers as test_helpers; use polkadot_primitives::{ - vstaging::NodeFeatures, CandidateHash, CoreState, ExecutorParams, GroupIndex, Hash, - Id as ParaId, ScheduledCore, SessionInfo, ValidatorIndex, + CandidateHash, CoreState, ExecutorParams, GroupIndex, Hash, Id as ParaId, NodeFeatures, + ScheduledCore, SessionInfo, ValidatorIndex, }; use test_helpers::mock::{make_ferdie_keystore, new_leaf}; @@ -337,7 +337,7 @@ fn to_incoming_req( IncomingRequest::new( // We don't really care: - network::PeerId::random(), + network::PeerId::random().into(), payload, tx, ) diff --git a/polkadot/node/network/availability-recovery/Cargo.toml b/polkadot/node/network/availability-recovery/Cargo.toml index 9f1d9052312f2cbbff8f32ffc22b7e1c234cfc3f..dd0e0c432345ed7006fa4a18fbb05bc9efca8538 100644 --- a/polkadot/node/network/availability-recovery/Cargo.toml +++ b/polkadot/node/network/availability-recovery/Cargo.toml @@ -10,13 +10,13 @@ license.workspace = true workspace = true [dependencies] -futures = "0.3.21" -tokio = "1.24.2" +futures = "0.3.30" +tokio = "1.37" schnellru = "0.2.1" rand = "0.8.5" fatality = "0.0.6" -thiserror = "1.0.48" -async-trait = "0.1.74" +thiserror = { workspace = true } +async-trait = "0.1.79" gum = { package = "tracing-gum", path = "../../gum" } polkadot-erasure-coding = { path = "../../../erasure-coding" } @@ -30,9 +30,9 @@ sc-network = { path = "../../../../substrate/client/network" } [dev-dependencies] assert_matches = "1.4.0" -env_logger = "0.9.0" +env_logger = "0.11" futures-timer = "3.0.2" -log = "0.4.17" +log = { workspace = true, default-features = true } sp-core = { path = "../../../../substrate/primitives/core" } sp-keyring = { path = "../../../../substrate/primitives/keyring" } @@ -41,6 +41,13 @@ sc-network = { path = "../../../../substrate/client/network" } polkadot-node-subsystem-test-helpers = { path = "../../subsystem-test-helpers" } polkadot-primitives-test-helpers = { path = "../../../primitives/test-helpers" } +polkadot-subsystem-bench = { path = "../../subsystem-bench" } + +[[bench]] +name = "availability-recovery-regression-bench" +path = "benches/availability-recovery-regression-bench.rs" +harness = false +required-features = ["subsystem-benchmarks"] [features] subsystem-benchmarks = [] diff --git a/polkadot/node/network/availability-recovery/benches/availability-recovery-regression-bench.rs b/polkadot/node/network/availability-recovery/benches/availability-recovery-regression-bench.rs new file mode 100644 index 0000000000000000000000000000000000000000..9be147bda93a8bdd3efac4e4ccce61d79d6501b8 --- /dev/null +++ b/polkadot/node/network/availability-recovery/benches/availability-recovery-regression-bench.rs @@ -0,0 +1,87 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +//! availability-read regression tests +//! +//! Availability read benchmark based on Kusama parameters and scale. +//! +//! Subsystems involved: +//! - availability-recovery + +use polkadot_subsystem_bench::{ + availability::{ + benchmark_availability_read, prepare_test, DataAvailabilityReadOptions, + TestDataAvailability, TestState, + }, + configuration::TestConfiguration, + usage::BenchmarkUsage, + utils::save_to_file, +}; +use std::io::Write; + +const BENCH_COUNT: usize = 5; + +fn main() -> Result<(), String> { + let mut messages = vec![]; + + let options = DataAvailabilityReadOptions { fetch_from_backers: true }; + let mut config = TestConfiguration::default(); + config.num_blocks = 3; + config.connectivity = 100; + config.latency = None; + config.generate_pov_sizes(); + + let state = TestState::new(&config); + + println!("Benchmarking..."); + let usages: Vec = (0..BENCH_COUNT) + .map(|n| { + print!("\r[{}{}]", "#".repeat(n), "_".repeat(BENCH_COUNT - n)); + std::io::stdout().flush().unwrap(); + let (mut env, _cfgs) = + prepare_test(&state, TestDataAvailability::Read(options.clone()), false); + env.runtime().block_on(benchmark_availability_read( + "data_availability_read", + &mut env, + &state, + )) + }) + .collect(); + println!("\rDone!{}", " ".repeat(BENCH_COUNT)); + + let average_usage = BenchmarkUsage::average(&usages); + save_to_file( + "charts/availability-recovery-regression-bench.json", + average_usage.to_chart_json().map_err(|e| e.to_string())?, + ) + .map_err(|e| e.to_string())?; + println!("{}", average_usage); + + // We expect no variance for received and sent + // but use 0.001 because we operate with floats + messages.extend(average_usage.check_network_usage(&[ + ("Received from peers", 307200.000, 0.001), + ("Sent to peers", 1.667, 0.001), + ])); + messages.extend(average_usage.check_cpu_usage(&[("availability-recovery", 11.500, 0.05)])); + + if messages.is_empty() { + Ok(()) + } else { + eprintln!("{}", messages.join("\n")); + Err("Regressions found".to_string()) + } +} diff --git a/polkadot/node/network/availability-recovery/src/lib.rs b/polkadot/node/network/availability-recovery/src/lib.rs index fb8064878f4f6c02236afbede9f8e91b8f2dd594..94b9d9546cdecd4a244bc3de9e10c1db4c3c066d 100644 --- a/polkadot/node/network/availability-recovery/src/lib.rs +++ b/polkadot/node/network/availability-recovery/src/lib.rs @@ -408,7 +408,7 @@ async fn handle_recover( ) -> error::Result<()> { let candidate_hash = receipt.hash(); - let span = jaeger::Span::new(candidate_hash, "availbility-recovery") + let span = jaeger::Span::new(candidate_hash, "availability-recovery") .with_stage(jaeger::Stage::AvailabilityRecovery); if let Some(result) = diff --git a/polkadot/node/network/availability-recovery/src/metrics.rs b/polkadot/node/network/availability-recovery/src/metrics.rs index d82a8f9ae5faf662e05c7a8dcaf731e17756a636..9f4cddc57e43a93089fbb08ec4a18dfd77ffea8d 100644 --- a/polkadot/node/network/availability-recovery/src/metrics.rs +++ b/polkadot/node/network/availability-recovery/src/metrics.rs @@ -31,7 +31,7 @@ struct MetricsInner { chunk_requests_issued: Counter, /// Total number of bytes recovered /// - /// Gets incremented on each succesful recovery + /// Gets incremented on each successful recovery recovered_bytes_total: Counter, /// A counter for finished chunk requests. /// @@ -232,7 +232,7 @@ impl metrics::Metrics for Metrics { )?, full_recoveries_started: prometheus::register( Counter::new( - "polkadot_parachain_availability_recovery_recovieries_started", + "polkadot_parachain_availability_recovery_recoveries_started", "Total number of started recoveries.", )?, registry, diff --git a/polkadot/node/network/availability-recovery/src/tests.rs b/polkadot/node/network/availability-recovery/src/tests.rs index f1dc5b98c09b895f987c070fee0cf3cca37e036e..909f6a25f46b1eca3074095b6f54f0415d62c562 100644 --- a/polkadot/node/network/availability-recovery/src/tests.rs +++ b/polkadot/node/network/availability-recovery/src/tests.rs @@ -40,7 +40,7 @@ use polkadot_node_subsystem_test_helpers::{ }; use polkadot_node_subsystem_util::TimeoutExt; use polkadot_primitives::{ - AuthorityDiscoveryId, Hash, HeadData, IndexedVec, PersistedValidationData, ValidatorId, + AuthorityDiscoveryId, Block, Hash, HeadData, IndexedVec, PersistedValidationData, ValidatorId, }; use polkadot_primitives_test_helpers::{dummy_candidate_receipt, dummy_hash}; @@ -52,7 +52,10 @@ const GENESIS_HASH: Hash = Hash::repeat_byte(0xff); fn request_receiver( req_protocol_names: &ReqProtocolNames, ) -> IncomingRequestReceiver { - let receiver = IncomingRequest::get_config_receiver(req_protocol_names); + let receiver = IncomingRequest::get_config_receiver::< + Block, + sc_network::NetworkWorker, + >(req_protocol_names); // Don't close the sending end of the request protocol. Otherwise, the subsystem will terminate. std::mem::forget(receiver.1.inbound_queue); receiver.0 diff --git a/polkadot/node/network/bitfield-distribution/Cargo.toml b/polkadot/node/network/bitfield-distribution/Cargo.toml index 8a05bcbd493fd21c5c55bd1603319465f6003ae8..6b5b784b7fd899713c4ccbce2f9dec649a50f933 100644 --- a/polkadot/node/network/bitfield-distribution/Cargo.toml +++ b/polkadot/node/network/bitfield-distribution/Cargo.toml @@ -11,7 +11,7 @@ workspace = true [dependencies] always-assert = "0.1" -futures = "0.3.21" +futures = "0.3.30" futures-timer = "3.0.2" gum = { package = "tracing-gum", path = "../../gum" } polkadot-primitives = { path = "../../../primitives" } @@ -29,7 +29,7 @@ sp-authority-discovery = { path = "../../../../substrate/primitives/authority-di sp-keystore = { path = "../../../../substrate/primitives/keystore" } sp-keyring = { path = "../../../../substrate/primitives/keyring" } maplit = "1.0.2" -log = "0.4.17" -env_logger = "0.9.0" +log = { workspace = true, default-features = true } +env_logger = "0.11" assert_matches = "1.4.0" rand_chacha = "0.3.1" diff --git a/polkadot/node/network/bitfield-distribution/src/metrics.rs b/polkadot/node/network/bitfield-distribution/src/metrics.rs index 71d8a01300f25aea09099b882a00ff5df9cba491..bd956bcbe4a3ebf9038073d8bed78ac50da756d4 100644 --- a/polkadot/node/network/bitfield-distribution/src/metrics.rs +++ b/polkadot/node/network/bitfield-distribution/src/metrics.rs @@ -69,14 +69,14 @@ impl MetricsTrait for Metrics { let metrics = MetricsInner { sent_own_availability_bitfields: prometheus::register( prometheus::Counter::new( - "polkadot_parachain_sent_own_availabilty_bitfields_total", + "polkadot_parachain_sent_own_availability_bitfields_total", "Number of own availability bitfields sent to other peers.", )?, registry, )?, received_availability_bitfields: prometheus::register( prometheus::Counter::new( - "polkadot_parachain_received_availabilty_bitfields_total", + "polkadot_parachain_received_availability_bitfields_total", "Number of valid availability bitfields received from other peers.", )?, registry, diff --git a/polkadot/node/network/bitfield-distribution/src/tests.rs b/polkadot/node/network/bitfield-distribution/src/tests.rs index ba2434ea47d69469e812d6274b17b43c3b6b5ee3..188b51ebcccae89fd6f69410fd054d25eeabbb01 100644 --- a/polkadot/node/network/bitfield-distribution/src/tests.rs +++ b/polkadot/node/network/bitfield-distribution/src/tests.rs @@ -150,7 +150,7 @@ fn receive_invalid_signature() { let signing_context = SigningContext { session_index: 1, parent_hash: hash_a }; - // another validator not part of the validatorset + // another validator not part of the validator set let keystore: KeystorePtr = Arc::new(MemoryKeystore::new()); let malicious = Keystore::sr25519_generate_new(&*keystore, ValidatorId::ID, None) .expect("Malicious key created"); diff --git a/polkadot/node/network/bridge/Cargo.toml b/polkadot/node/network/bridge/Cargo.toml index 0cdd7bfbcb136bef97f856dc5fd3cb0a3cdf507e..9c2423e7e5810c3406ab4f40c219dbd8001245bb 100644 --- a/polkadot/node/network/bridge/Cargo.toml +++ b/polkadot/node/network/bridge/Cargo.toml @@ -11,8 +11,8 @@ workspace = true [dependencies] always-assert = "0.1" -async-trait = "0.1.74" -futures = "0.3.21" +async-trait = "0.1.79" +futures = "0.3.30" gum = { package = "tracing-gum", path = "../../gum" } polkadot-primitives = { path = "../../../primitives" } parity-scale-codec = { version = "3.6.1", default-features = false, features = ["derive"] } @@ -25,7 +25,7 @@ polkadot-overseer = { path = "../../overseer" } parking_lot = "0.12.1" bytes = "1" fatality = "0.0.6" -thiserror = "1" +thiserror = { workspace = true } [dev-dependencies] assert_matches = "1.4.0" diff --git a/polkadot/node/network/bridge/src/lib.rs b/polkadot/node/network/bridge/src/lib.rs index ddce99d5c2a8a721164e73ea61ed989b78cdfbdc..0305aaa067ccd5dbeb571ee3c9531417ac32818b 100644 --- a/polkadot/node/network/bridge/src/lib.rs +++ b/polkadot/node/network/bridge/src/lib.rs @@ -102,6 +102,30 @@ struct SharedInner { collation_peers: HashMap, } +// Counts the number of peers that are connectioned using `version` +fn count_peers_by_version(peers: &HashMap) -> HashMap { + let mut by_version_count = HashMap::new(); + for peer in peers.values() { + *(by_version_count.entry(peer.version).or_default()) += 1; + } + by_version_count +} + +// Notes the peer count +fn note_peers_count(metrics: &Metrics, shared: &Shared) { + let guard = shared.0.lock(); + let validation_stats = count_peers_by_version(&guard.validation_peers); + let collation_stats = count_peers_by_version(&guard.collation_peers); + + for (version, count) in validation_stats { + metrics.note_peer_count(PeerSet::Validation, version, count) + } + + for (version, count) in collation_stats { + metrics.note_peer_count(PeerSet::Collation, version, count) + } +} + pub(crate) enum Mode { Syncing(Box), Active, diff --git a/polkadot/node/network/bridge/src/network.rs b/polkadot/node/network/bridge/src/network.rs index 21bed019256ac7a0e747ac041f8db32609f0d065..5691c8413ad997daf80fcd551b4265031d563d88 100644 --- a/polkadot/node/network/bridge/src/network.rs +++ b/polkadot/node/network/bridge/src/network.rs @@ -25,9 +25,8 @@ use parking_lot::Mutex; use parity_scale_codec::Encode; use sc_network::{ - config::parse_addr, multiaddr::Multiaddr, types::ProtocolName, IfDisconnected, MessageSink, - NetworkPeers, NetworkRequest, NetworkService, OutboundFailure, ReputationChange, - RequestFailure, + config::parse_addr, multiaddr::Multiaddr, service::traits::NetworkService, types::ProtocolName, + IfDisconnected, MessageSink, OutboundFailure, ReputationChange, RequestFailure, }; use polkadot_node_network_protocol::{ @@ -35,7 +34,7 @@ use polkadot_node_network_protocol::{ request_response::{OutgoingRequest, Recipient, ReqProtocolNames, Requests}, v1 as protocol_v1, v2 as protocol_v2, v3 as protocol_v3, PeerId, }; -use polkadot_primitives::{AuthorityDiscoveryId, Block, Hash}; +use polkadot_primitives::AuthorityDiscoveryId; use crate::{metrics::Metrics, validator_discovery::AuthorityDiscovery, WireMessage}; @@ -232,13 +231,13 @@ pub trait Network: Clone + Send + 'static { } #[async_trait] -impl Network for Arc> { +impl Network for Arc { async fn set_reserved_peers( &mut self, protocol: ProtocolName, multiaddresses: HashSet, ) -> Result<(), String> { - NetworkService::set_reserved_peers(&**self, protocol, multiaddresses) + ::set_reserved_peers(&**self, protocol, multiaddresses) } async fn remove_from_peers_set( @@ -246,15 +245,15 @@ impl Network for Arc> { protocol: ProtocolName, peers: Vec, ) -> Result<(), String> { - NetworkService::remove_peers_from_reserved_set(&**self, protocol, peers) + ::remove_peers_from_reserved_set(&**self, protocol, peers) } fn report_peer(&self, who: PeerId, rep: ReputationChange) { - NetworkService::report_peer(&**self, who, rep); + ::report_peer(&**self, who, rep); } fn disconnect_peer(&self, who: PeerId, protocol: ProtocolName) { - NetworkService::disconnect_peer(&**self, who, protocol); + ::disconnect_peer(&**self, who, protocol); } async fn start_request( @@ -289,7 +288,7 @@ impl Network for Arc> { Ok(v) => v, Err(_) => continue, }; - NetworkService::add_known_address(self, peer_id, addr); + ::add_known_address(&**self, peer_id, addr); found_peer_id = Some(peer_id); } found_peer_id @@ -321,8 +320,8 @@ impl Network for Arc> { "Starting request", ); - NetworkService::start_request( - self, + ::start_request( + &**self, peer_id, req_protocol_names.get_name(protocol), payload, @@ -333,7 +332,7 @@ impl Network for Arc> { } fn peer_role(&self, who: PeerId, handshake: Vec) -> Option { - NetworkService::peer_role(self, who, handshake) + ::peer_role(&**self, who, handshake) } } diff --git a/polkadot/node/network/bridge/src/rx/mod.rs b/polkadot/node/network/bridge/src/rx/mod.rs index 11ac73259e3a178f418f4a6aa316e337acb31322..0a4497fc4b5a22639e516598a15557f08227c969 100644 --- a/polkadot/node/network/bridge/src/rx/mod.rs +++ b/polkadot/node/network/bridge/src/rx/mod.rs @@ -262,7 +262,6 @@ async fn handle_validation_message( } metrics.on_peer_connected(peer_set, version); - metrics.note_peer_count(peer_set, version, peer_map.len()); shared.local_view.clone().unwrap_or(View::default()) }; @@ -320,8 +319,6 @@ async fn handle_validation_message( let w = peer_map.remove(&peer).is_some(); metrics.on_peer_disconnected(peer_set, version); - metrics.note_peer_count(peer_set, version, peer_map.len()); - w }; @@ -524,7 +521,6 @@ async fn handle_collation_message( } metrics.on_peer_connected(peer_set, version); - metrics.note_peer_count(peer_set, version, peer_map.len()); shared.local_view.clone().unwrap_or(View::default()) }; @@ -575,7 +571,6 @@ async fn handle_collation_message( let w = peer_map.remove(&peer).is_some(); metrics.on_peer_disconnected(peer_set, version); - metrics.note_peer_count(peer_set, version, peer_map.len()); w }; @@ -832,6 +827,7 @@ where &metrics, ¬ification_sinks, ); + note_peers_count(&metrics, &shared); } } }, diff --git a/polkadot/node/network/bridge/src/rx/tests.rs b/polkadot/node/network/bridge/src/rx/tests.rs index 6847b8a7e24db5b13df2873d1b54f37506e76831..6182bf3d883b5be19231d534babf1c70973da00d 100644 --- a/polkadot/node/network/bridge/src/rx/tests.rs +++ b/polkadot/node/network/bridge/src/rx/tests.rs @@ -366,13 +366,13 @@ impl NotificationService for TestNotificationService { } /// Send synchronous `notification` to `peer`. - fn send_sync_notification(&self, _peer: &PeerId, _notification: Vec) { + fn send_sync_notification(&mut self, _peer: &PeerId, _notification: Vec) { unimplemented!(); } /// Send asynchronous `notification` to `peer`, allowing sender to exercise backpressure. async fn send_async_notification( - &self, + &mut self, _peer: &PeerId, _notification: Vec, ) -> Result<(), sc_network::error::Error> { diff --git a/polkadot/node/network/collator-protocol/Cargo.toml b/polkadot/node/network/collator-protocol/Cargo.toml index 9a9ce6fce6359a9e44e7820839952c5f9a8c11ba..2c7135742f56890a7ad147e95c545cbebde04c9b 100644 --- a/polkadot/node/network/collator-protocol/Cargo.toml +++ b/polkadot/node/network/collator-protocol/Cargo.toml @@ -11,7 +11,7 @@ workspace = true [dependencies] bitvec = { version = "1.0.1", default-features = false, features = ["alloc"] } -futures = "0.3.21" +futures = "0.3.30" futures-timer = "3" gum = { package = "tracing-gum", path = "../../gum" } @@ -25,12 +25,12 @@ polkadot-node-primitives = { path = "../../primitives" } polkadot-node-subsystem-util = { path = "../../subsystem-util" } polkadot-node-subsystem = { path = "../../subsystem" } fatality = "0.0.6" -thiserror = "1.0.48" +thiserror = { workspace = true } tokio-util = "0.7.1" [dev-dependencies] -log = "0.4.17" -env_logger = "0.9.0" +log = { workspace = true, default-features = true } +env_logger = "0.11" assert_matches = "1.4.0" sp-core = { path = "../../../../substrate/primitives/core", features = ["std"] } @@ -41,3 +41,7 @@ parity-scale-codec = { version = "3.6.1", features = ["std"] } polkadot-node-subsystem-test-helpers = { path = "../../subsystem-test-helpers" } polkadot-primitives-test-helpers = { path = "../../../primitives/test-helpers" } + +[features] +default = [] +elastic-scaling-experimental = [] diff --git a/polkadot/node/network/collator-protocol/src/collator_side/collation.rs b/polkadot/node/network/collator-protocol/src/collator_side/collation.rs index 53f947142d10d615496b184b22ce7d69d815c977..57e1479a449b75e29a11292d720543b71c382f9c 100644 --- a/polkadot/node/network/collator-protocol/src/collator_side/collation.rs +++ b/polkadot/node/network/collator-protocol/src/collator_side/collation.rs @@ -27,6 +27,7 @@ use polkadot_node_network_protocol::{ PeerId, }; use polkadot_node_primitives::PoV; +use polkadot_node_subsystem::messages::ParentHeadData; use polkadot_primitives::{CandidateHash, CandidateReceipt, Hash, Id as ParaId}; /// The status of a collation as seen from the collator. @@ -59,10 +60,10 @@ impl CollationStatus { pub struct Collation { /// Candidate receipt. pub receipt: CandidateReceipt, - /// Parent head-data hash. - pub parent_head_data_hash: Hash, /// Proof to verify the state transition of the parachain. pub pov: PoV, + /// Parent head-data (or just hash). + pub parent_head_data: ParentHeadData, /// Collation status. pub status: CollationStatus, } diff --git a/polkadot/node/network/collator-protocol/src/collator_side/mod.rs b/polkadot/node/network/collator-protocol/src/collator_side/mod.rs index 8fb0bb2154445f99000f329ff9aeb30e29c02092..e6aa55235b7a8094d54fff1c6b5d15a9d0c198ab 100644 --- a/polkadot/node/network/collator-protocol/src/collator_side/mod.rs +++ b/polkadot/node/network/collator-protocol/src/collator_side/mod.rs @@ -40,7 +40,8 @@ use polkadot_node_primitives::{CollationSecondedSignal, PoV, Statement}; use polkadot_node_subsystem::{ jaeger, messages::{ - CollatorProtocolMessage, NetworkBridgeEvent, NetworkBridgeTxMessage, RuntimeApiMessage, + CollatorProtocolMessage, NetworkBridgeEvent, NetworkBridgeTxMessage, ParentHeadData, + RuntimeApiMessage, }, overseer, CollatorProtocolSenderTrait, FromOrchestra, OverseerSignal, PerLeafSpan, }; @@ -55,7 +56,7 @@ use polkadot_node_subsystem_util::{ }; use polkadot_primitives::{ AuthorityDiscoveryId, CandidateHash, CandidateReceipt, CollatorPair, CoreIndex, CoreState, - GroupIndex, Hash, Id as ParaId, SessionIndex, + GroupIndex, Hash, HeadData, Id as ParaId, SessionIndex, }; use super::LOG_TARGET; @@ -202,20 +203,40 @@ struct PeerData { version: CollationVersion, } +/// A type wrapping a collation and it's designated core index. +struct CollationWithCoreIndex(Collation, CoreIndex); + +impl CollationWithCoreIndex { + /// Returns inner collation ref. + pub fn collation(&self) -> &Collation { + &self.0 + } + + /// Returns inner collation mut ref. + pub fn collation_mut(&mut self) -> &mut Collation { + &mut self.0 + } + + /// Returns inner core index. + pub fn core_index(&self) -> &CoreIndex { + &self.1 + } +} + struct PerRelayParent { prospective_parachains_mode: ProspectiveParachainsMode, - /// Validators group responsible for backing candidates built + /// Per core index validators group responsible for backing candidates built /// on top of this relay parent. - validator_group: ValidatorGroup, + validator_group: HashMap, /// Distributed collations. - collations: HashMap, + collations: HashMap, } impl PerRelayParent { fn new(mode: ProspectiveParachainsMode) -> Self { Self { prospective_parachains_mode: mode, - validator_group: ValidatorGroup::default(), + validator_group: HashMap::default(), collations: HashMap::new(), } } @@ -347,7 +368,9 @@ async fn distribute_collation( receipt: CandidateReceipt, parent_head_data_hash: Hash, pov: PoV, + parent_head_data: HeadData, result_sender: Option>, + core_index: CoreIndex, ) -> Result<()> { let candidate_relay_parent = receipt.descriptor.relay_parent; let candidate_hash = receipt.hash(); @@ -394,12 +417,11 @@ async fn distribute_collation( return Ok(()) } - // Determine which core the para collated-on is assigned to. + // Determine which core(s) the para collated-on is assigned to. // If it is not scheduled then ignore the message. - let (our_core, num_cores) = - match determine_core(ctx.sender(), id, candidate_relay_parent, relay_parent_mode).await? { - Some(core) => core, - None => { + let (our_cores, num_cores) = + match determine_cores(ctx.sender(), id, candidate_relay_parent, relay_parent_mode).await? { + (cores, _num_cores) if cores.is_empty() => { gum::warn!( target: LOG_TARGET, para_id = %id, @@ -408,8 +430,35 @@ async fn distribute_collation( return Ok(()) }, + (cores, num_cores) => (cores, num_cores), }; + let elastic_scaling = our_cores.len() > 1; + if elastic_scaling { + gum::debug!( + target: LOG_TARGET, + para_id = %id, + cores = ?our_cores, + "{} is assigned to {} cores at {}", id, our_cores.len(), candidate_relay_parent, + ); + } + + // Double check that the specified `core_index` is among the ones our para has assignments for. + if !our_cores.iter().any(|assigned_core| assigned_core == &core_index) { + gum::warn!( + target: LOG_TARGET, + para_id = %id, + relay_parent = ?candidate_relay_parent, + cores = ?our_cores, + ?core_index, + "Attempting to distribute collation for a core we are not assigned to ", + ); + + return Ok(()) + } + + let our_core = core_index; + // Determine the group on that core. // // When prospective parachains are disabled, candidate relay parent here is @@ -451,10 +500,12 @@ async fn distribute_collation( "Accepted collation, connecting to validators." ); - let validators_at_relay_parent = &mut per_relay_parent.validator_group.validators; - if validators_at_relay_parent.is_empty() { - *validators_at_relay_parent = validators; - } + // Insert validator group for the `core_index` at relay parent. + per_relay_parent.validator_group.entry(core_index).or_insert_with(|| { + let mut group = ValidatorGroup::default(); + group.validators = validators; + group + }); // Update a set of connected validators if necessary. connect_to_validators(ctx, &state.validator_groups_buf).await; @@ -463,9 +514,18 @@ async fn distribute_collation( state.collation_result_senders.insert(candidate_hash, result_sender); } + let parent_head_data = if elastic_scaling { + ParentHeadData::WithData { hash: parent_head_data_hash, head_data: parent_head_data } + } else { + ParentHeadData::OnlyHash(parent_head_data_hash) + }; + per_relay_parent.collations.insert( candidate_hash, - Collation { receipt, parent_head_data_hash, pov, status: CollationStatus::Created }, + CollationWithCoreIndex( + Collation { receipt, pov, parent_head_data, status: CollationStatus::Created }, + core_index, + ), ); // If prospective parachains are disabled, a leaf should be known to peer. @@ -506,15 +566,17 @@ async fn distribute_collation( Ok(()) } -/// Get the Id of the Core that is assigned to the para being collated on if any +/// Get the core indices that are assigned to the para being collated on if any /// and the total number of cores. -async fn determine_core( +async fn determine_cores( sender: &mut impl overseer::SubsystemSender, para_id: ParaId, relay_parent: Hash, relay_parent_mode: ProspectiveParachainsMode, -) -> Result> { +) -> Result<(Vec, usize)> { let cores = get_availability_cores(sender, relay_parent).await?; + let n_cores = cores.len(); + let mut assigned_cores = Vec::new(); for (idx, core) in cores.iter().enumerate() { let core_para_id = match core { @@ -531,11 +593,11 @@ async fn determine_core( }; if core_para_id == Some(para_id) { - return Ok(Some(((idx as u32).into(), cores.len()))) + assigned_cores.push(CoreIndex::from(idx as u32)); } } - Ok(None) + Ok((assigned_cores, n_cores)) } /// Validators of a particular group index. @@ -669,7 +731,10 @@ async fn advertise_collation( advertisement_timeouts: &mut FuturesUnordered, metrics: &Metrics, ) { - for (candidate_hash, collation) in per_relay_parent.collations.iter_mut() { + for (candidate_hash, collation_and_core) in per_relay_parent.collations.iter_mut() { + let core_index = *collation_and_core.core_index(); + let collation = collation_and_core.collation_mut(); + // Check that peer will be able to request the collation. if let CollationVersion::V1 = protocol_version { if per_relay_parent.prospective_parachains_mode.is_enabled() { @@ -683,11 +748,17 @@ async fn advertise_collation( } } - let should_advertise = - per_relay_parent - .validator_group - .should_advertise_to(candidate_hash, peer_ids, &peer); + let Some(validator_group) = per_relay_parent.validator_group.get_mut(&core_index) else { + gum::debug!( + target: LOG_TARGET, + ?relay_parent, + ?core_index, + "Skipping advertising to validator, validator group for core not found", + ); + return + }; + let should_advertise = validator_group.should_advertise_to(candidate_hash, peer_ids, &peer); match should_advertise { ShouldAdvertiseTo::Yes => {}, ShouldAdvertiseTo::NotAuthority | ShouldAdvertiseTo::AlreadyAdvertised => { @@ -718,7 +789,7 @@ async fn advertise_collation( let wire_message = protocol_v2::CollatorProtocolMessage::AdvertiseCollation { relay_parent, candidate_hash: *candidate_hash, - parent_head_data_hash: collation.parent_head_data_hash, + parent_head_data_hash: collation.parent_head_data.hash(), }; Versioned::V2(protocol_v2::CollationProtocol::CollatorProtocol(wire_message)) }, @@ -735,9 +806,7 @@ async fn advertise_collation( )) .await; - per_relay_parent - .validator_group - .advertised_to_peer(candidate_hash, &peer_ids, peer); + validator_group.advertised_to_peer(candidate_hash, &peer_ids, peer); advertisement_timeouts.push(ResetInterestTimeout::new( *candidate_hash, @@ -763,20 +832,27 @@ async fn process_msg( CollateOn(id) => { state.collating_on = Some(id); }, - DistributeCollation(receipt, parent_head_data_hash, pov, result_sender) => { + DistributeCollation { + candidate_receipt, + parent_head_data_hash, + pov, + parent_head_data, + result_sender, + core_index, + } => { let _span1 = state .span_per_relay_parent - .get(&receipt.descriptor.relay_parent) + .get(&candidate_receipt.descriptor.relay_parent) .map(|s| s.child("distributing-collation")); let _span2 = jaeger::Span::new(&pov, "distributing-collation"); match state.collating_on { - Some(id) if receipt.descriptor.para_id != id => { + Some(id) if candidate_receipt.descriptor.para_id != id => { // If the ParaId of a collation requested to be distributed does not match // the one we expect, we ignore the message. gum::warn!( target: LOG_TARGET, - para_id = %receipt.descriptor.para_id, + para_id = %candidate_receipt.descriptor.para_id, collating_on = %id, "DistributeCollation for unexpected para_id", ); @@ -788,17 +864,19 @@ async fn process_msg( runtime, state, id, - receipt, + candidate_receipt, parent_head_data_hash, pov, + parent_head_data, result_sender, + core_index, ) .await?; }, None => { gum::warn!( target: LOG_TARGET, - para_id = %receipt.descriptor.para_id, + para_id = %candidate_receipt.descriptor.para_id, "DistributeCollation message while not collating on any", ); }, @@ -835,6 +913,7 @@ async fn send_collation( request: VersionedCollationRequest, receipt: CandidateReceipt, pov: PoV, + parent_head_data: ParentHeadData, ) { let (tx, rx) = oneshot::channel(); @@ -842,13 +921,27 @@ async fn send_collation( let peer_id = request.peer_id(); let candidate_hash = receipt.hash(); - // The response payload is the same for both versions of protocol - // and doesn't have v2 alias for simplicity. - let response = OutgoingResponse { - result: Ok(request_v1::CollationFetchingResponse::Collation(receipt, pov)), - reputation_changes: Vec::new(), - sent_feedback: Some(tx), + #[cfg(feature = "elastic-scaling-experimental")] + let result = match parent_head_data { + ParentHeadData::WithData { head_data, .. } => + Ok(request_v2::CollationFetchingResponse::CollationWithParentHeadData { + receipt, + pov, + parent_head_data: head_data, + }), + ParentHeadData::OnlyHash(_) => + Ok(request_v1::CollationFetchingResponse::Collation(receipt, pov)), }; + #[cfg(not(feature = "elastic-scaling-experimental"))] + let result = { + // suppress unused warning + let _parent_head_data = parent_head_data; + + Ok(request_v1::CollationFetchingResponse::Collation(receipt, pov)) + }; + + let response = + OutgoingResponse { result, reputation_changes: Vec::new(), sent_feedback: Some(tx) }; if let Err(_) = request.send_outgoing_response(response) { gum::warn!(target: LOG_TARGET, "Sending collation response failed"); @@ -1010,7 +1103,7 @@ async fn handle_incoming_request( }; let mode = per_relay_parent.prospective_parachains_mode; - let collation = match &req { + let collation_with_core = match &req { VersionedCollationRequest::V1(_) if !mode.is_enabled() => per_relay_parent.collations.values_mut().next(), VersionedCollationRequest::V2(req) => @@ -1027,18 +1120,24 @@ async fn handle_incoming_request( return Ok(()) }, }; - let (receipt, pov) = if let Some(collation) = collation { - collation.status.advance_to_requested(); - (collation.receipt.clone(), collation.pov.clone()) - } else { - gum::warn!( - target: LOG_TARGET, - relay_parent = %relay_parent, - "received a `RequestCollation` for a relay parent we don't have collation stored.", - ); + let (receipt, pov, parent_head_data) = + if let Some(collation_with_core) = collation_with_core { + let collation = collation_with_core.collation_mut(); + collation.status.advance_to_requested(); + ( + collation.receipt.clone(), + collation.pov.clone(), + collation.parent_head_data.clone(), + ) + } else { + gum::warn!( + target: LOG_TARGET, + relay_parent = %relay_parent, + "received a `RequestCollation` for a relay parent we don't have collation stored.", + ); - return Ok(()) - }; + return Ok(()) + }; state.metrics.on_collation_sent_requested(); @@ -1068,7 +1167,7 @@ async fn handle_incoming_request( waiting.collation_fetch_active = true; // Obtain a timer for sending collation let _ = state.metrics.time_collation_distribution("send"); - send_collation(state, req, receipt, pov).await; + send_collation(state, req, receipt, pov, parent_head_data).await; } }, Some(our_para_id) => { @@ -1293,7 +1392,9 @@ where .remove(removed) .map(|per_relay_parent| per_relay_parent.collations) .unwrap_or_default(); - for collation in collations.into_values() { + for collation_with_core in collations.into_values() { + let collation = collation_with_core.collation(); + let candidate_hash = collation.receipt.hash(); state.collation_result_senders.remove(&candidate_hash); state.validator_groups_buf.remove_candidate(&candidate_hash); @@ -1430,7 +1531,7 @@ async fn run_inner( continue }; - let next_collation = { + let next_collation_with_core = { let per_relay_parent = match state.per_relay_parent.get(&relay_parent) { Some(per_relay_parent) => per_relay_parent, None => continue, @@ -1450,11 +1551,13 @@ async fn run_inner( } }; - if let Some(collation) = next_collation { + if let Some(collation_with_core) = next_collation_with_core { + let collation = collation_with_core.collation(); let receipt = collation.receipt.clone(); let pov = collation.pov.clone(); + let parent_head_data = collation.parent_head_data.clone(); - send_collation(&mut state, next, receipt, pov).await; + send_collation(&mut state, next, receipt, pov, parent_head_data).await; } }, (candidate_hash, peer_id) = state.advertisement_timeouts.select_next_some() => { diff --git a/polkadot/node/network/collator-protocol/src/collator_side/tests/mod.rs b/polkadot/node/network/collator-protocol/src/collator_side/tests/mod.rs index 1b1194c72706703283d0002a149a59d950d33975..689e03ce4737bcdd39d0651009f212e3cb364eea 100644 --- a/polkadot/node/network/collator-protocol/src/collator_side/tests/mod.rs +++ b/polkadot/node/network/collator-protocol/src/collator_side/tests/mod.rs @@ -45,8 +45,8 @@ use polkadot_node_subsystem::{ use polkadot_node_subsystem_test_helpers as test_helpers; use polkadot_node_subsystem_util::{reputation::add_reputation, TimeoutExt}; use polkadot_primitives::{ - vstaging::NodeFeatures, AuthorityDiscoveryId, CollatorPair, ExecutorParams, GroupIndex, - GroupRotationInfo, IndexedVec, ScheduledCore, SessionIndex, SessionInfo, ValidatorId, + AuthorityDiscoveryId, Block, CollatorPair, ExecutorParams, GroupIndex, GroupRotationInfo, + IndexedVec, NodeFeatures, ScheduledCore, SessionIndex, SessionInfo, ValidatorId, ValidatorIndex, }; use polkadot_primitives_test_helpers::TestCandidateBuilder; @@ -142,6 +142,21 @@ impl Default for TestState { } impl TestState { + /// Adds a few more scheduled cores to the state for the same para id + /// compared to the default. + #[cfg(feature = "elastic-scaling-experimental")] + pub fn with_elastic_scaling() -> Self { + let mut state = Self::default(); + let para_id = state.para_id; + state + .availability_cores + .push(CoreState::Scheduled(ScheduledCore { para_id, collator: None })); + state + .availability_cores + .push(CoreState::Scheduled(ScheduledCore { para_id, collator: None })); + state + } + fn current_group_validator_indices(&self) -> &[ValidatorIndex] { let core_num = self.availability_cores.len(); let GroupIndex(group_idx) = self.group_rotation_info.group_for_core(CoreIndex(0), core_num); @@ -235,10 +250,14 @@ fn test_harness>( let genesis_hash = Hash::repeat_byte(0xff); let req_protocol_names = ReqProtocolNames::new(&genesis_hash, None); - let (collation_req_receiver, req_v1_cfg) = - IncomingRequest::get_config_receiver(&req_protocol_names); - let (collation_req_v2_receiver, req_v2_cfg) = - IncomingRequest::get_config_receiver(&req_protocol_names); + let (collation_req_receiver, req_v1_cfg) = IncomingRequest::get_config_receiver::< + Block, + sc_network::NetworkWorker, + >(&req_protocol_names); + let (collation_req_v2_receiver, req_v2_cfg) = IncomingRequest::get_config_receiver::< + Block, + sc_network::NetworkWorker, + >(&req_protocol_names); let subsystem = async { run_inner( context, @@ -356,12 +375,14 @@ async fn distribute_collation_with_receipt( ) -> DistributeCollation { overseer_send( virtual_overseer, - CollatorProtocolMessage::DistributeCollation( - candidate.clone(), + CollatorProtocolMessage::DistributeCollation { + candidate_receipt: candidate.clone(), parent_head_data_hash, - pov.clone(), - None, - ), + pov: pov.clone(), + parent_head_data: HeadData(vec![1, 2, 3]), + result_sender: None, + core_index: CoreIndex(0), + }, ) .await; @@ -627,6 +648,18 @@ async fn send_peer_view_change( .await; } +fn decode_collation_response(bytes: &[u8]) -> (CandidateReceipt, PoV) { + let response: request_v1::CollationFetchingResponse = + request_v1::CollationFetchingResponse::decode(&mut &bytes[..]) + .expect("Decoding should work"); + match response { + request_v1::CollationFetchingResponse::Collation(receipt, pov) => (receipt, pov), + request_v1::CollationFetchingResponse::CollationWithParentHeadData { + receipt, pov, .. + } => (receipt, pov), + } +} + #[test] fn advertise_and_send_collation() { let mut test_state = TestState::default(); @@ -736,12 +769,10 @@ fn advertise_and_send_collation() { assert_matches!( rx.await, Ok(full_response) => { - let request_v1::CollationFetchingResponse::Collation(receipt, pov): request_v1::CollationFetchingResponse - = request_v1::CollationFetchingResponse::decode( - &mut full_response.result - .expect("We should have a proper answer").as_ref() - ) - .expect("Decoding should work"); + let (receipt, pov) = decode_collation_response( + full_response.result + .expect("We should have a proper answer").as_ref() + ); assert_eq!(receipt, candidate); assert_eq!(pov, pov_block); } @@ -1338,12 +1369,10 @@ where let feedback_tx = assert_matches!( rx.await, Ok(full_response) => { - let request_v1::CollationFetchingResponse::Collation(receipt, pov): request_v1::CollationFetchingResponse - = request_v1::CollationFetchingResponse::decode( - &mut full_response.result - .expect("We should have a proper answer").as_ref() - ) - .expect("Decoding should work"); + let (receipt, pov) = decode_collation_response( + full_response.result + .expect("We should have a proper answer").as_ref() + ); assert_eq!(receipt, candidate); assert_eq!(pov, pov_block); @@ -1375,12 +1404,10 @@ where assert_matches!( rx.await, Ok(full_response) => { - let request_v1::CollationFetchingResponse::Collation(receipt, pov): request_v1::CollationFetchingResponse - = request_v1::CollationFetchingResponse::decode( - &mut full_response.result - .expect("We should have a proper answer").as_ref() - ) - .expect("Decoding should work"); + let (receipt, pov) = decode_collation_response( + full_response.result + .expect("We should have a proper answer").as_ref() + ); assert_eq!(receipt, candidate); assert_eq!(pov, pov_block); @@ -1469,11 +1496,10 @@ fn connect_to_buffered_groups() { assert_matches!( rx.await, Ok(full_response) => { - let request_v1::CollationFetchingResponse::Collation(..) = - request_v1::CollationFetchingResponse::decode( - &mut full_response.result.expect("We should have a proper answer").as_ref(), - ) - .expect("Decoding should work"); + let _ = decode_collation_response( + full_response.result + .expect("We should have a proper answer").as_ref() + ); } ); diff --git a/polkadot/node/network/collator-protocol/src/collator_side/tests/prospective_parachains.rs b/polkadot/node/network/collator-protocol/src/collator_side/tests/prospective_parachains.rs index fd9d7a746ebe49623ff0feebd48793e8e603807b..707053545630a0a11603ccda030200eed7b5cfe2 100644 --- a/polkadot/node/network/collator-protocol/src/collator_side/tests/prospective_parachains.rs +++ b/polkadot/node/network/collator-protocol/src/collator_side/tests/prospective_parachains.rs @@ -271,12 +271,14 @@ fn distribute_collation_from_implicit_view() { .build(); overseer_send( virtual_overseer, - CollatorProtocolMessage::DistributeCollation( - candidate.clone(), + CollatorProtocolMessage::DistributeCollation { + candidate_receipt: candidate.clone(), parent_head_data_hash, - pov.clone(), - None, - ), + pov: pov.clone(), + parent_head_data: HeadData(vec![1, 2, 3]), + result_sender: None, + core_index: CoreIndex(0), + }, ) .await; @@ -351,12 +353,14 @@ fn distribute_collation_up_to_limit() { .build(); overseer_send( virtual_overseer, - CollatorProtocolMessage::DistributeCollation( - candidate.clone(), + CollatorProtocolMessage::DistributeCollation { + candidate_receipt: candidate.clone(), parent_head_data_hash, - pov.clone(), - None, - ), + pov: pov.clone(), + parent_head_data: HeadData(vec![1, 2, 3]), + result_sender: None, + core_index: CoreIndex(0), + }, ) .await; @@ -370,6 +374,119 @@ fn distribute_collation_up_to_limit() { ) } +/// Tests that collator send the parent head data in +/// case the para is assigned to multiple cores (elastic scaling). +#[test] +#[cfg(feature = "elastic-scaling-experimental")] +fn send_parent_head_data_for_elastic_scaling() { + let test_state = TestState::with_elastic_scaling(); + + let local_peer_id = test_state.local_peer_id; + let collator_pair = test_state.collator_pair.clone(); + + test_harness( + local_peer_id, + collator_pair, + ReputationAggregator::new(|_| true), + |test_harness| async move { + let mut virtual_overseer = test_harness.virtual_overseer; + let req_v1_cfg = test_harness.req_v1_cfg; + let mut req_v2_cfg = test_harness.req_v2_cfg; + + let head_b = Hash::from_low_u64_be(129); + let head_b_num: u32 = 63; + + // Set collating para id. + overseer_send( + &mut virtual_overseer, + CollatorProtocolMessage::CollateOn(test_state.para_id), + ) + .await; + update_view(&mut virtual_overseer, &test_state, vec![(head_b, head_b_num)], 1).await; + + let pov_data = PoV { block_data: BlockData(vec![1 as u8]) }; + let candidate = TestCandidateBuilder { + para_id: test_state.para_id, + relay_parent: head_b, + pov_hash: pov_data.hash(), + ..Default::default() + } + .build(); + + let phd = HeadData(vec![1, 2, 3]); + let phdh = phd.hash(); + + distribute_collation_with_receipt( + &mut virtual_overseer, + &test_state, + head_b, + true, + candidate.clone(), + pov_data.clone(), + phdh, + ) + .await; + + let peer = test_state.validator_peer_id[0]; + let validator_id = test_state.current_group_validator_authority_ids()[0].clone(); + connect_peer( + &mut virtual_overseer, + peer, + CollationVersion::V2, + Some(validator_id.clone()), + ) + .await; + expect_declare_msg_v2(&mut virtual_overseer, &test_state, &peer).await; + + send_peer_view_change(&mut virtual_overseer, &peer, vec![head_b]).await; + let hashes: Vec<_> = vec![candidate.hash()]; + expect_advertise_collation_msg(&mut virtual_overseer, &peer, head_b, Some(hashes)) + .await; + + let (pending_response, rx) = oneshot::channel(); + req_v2_cfg + .inbound_queue + .as_mut() + .unwrap() + .send(RawIncomingRequest { + peer, + payload: request_v2::CollationFetchingRequest { + relay_parent: head_b, + para_id: test_state.para_id, + candidate_hash: candidate.hash(), + } + .encode(), + pending_response, + }) + .await + .unwrap(); + + assert_matches!( + rx.await, + Ok(full_response) => { + let response: request_v2::CollationFetchingResponse = + request_v2::CollationFetchingResponse::decode(&mut + full_response.result + .expect("We should have a proper answer").as_ref() + ).expect("Decoding should work"); + assert_matches!( + response, + request_v1::CollationFetchingResponse::CollationWithParentHeadData { + receipt, pov, parent_head_data + } => { + assert_eq!(receipt, candidate); + assert_eq!(pov, pov_data); + assert_eq!(parent_head_data, phd); + } + ); + } + ); + + TestHarness { virtual_overseer, req_v1_cfg, req_v2_cfg } + }, + ) +} + /// Tests that collator correctly handles peer V2 requests. #[test] fn advertise_and_send_collation_by_hash() { @@ -469,12 +586,10 @@ fn advertise_and_send_collation_by_hash() { rx.await, Ok(full_response) => { // Response is the same for v2. - let request_v1::CollationFetchingResponse::Collation(receipt, pov): request_v1::CollationFetchingResponse - = request_v1::CollationFetchingResponse::decode( - &mut full_response.result - .expect("We should have a proper answer").as_ref() - ) - .expect("Decoding should work"); + let (receipt, pov) = decode_collation_response( + full_response.result + .expect("We should have a proper answer").as_ref() + ); assert_eq!(receipt, candidate); assert_eq!(pov, pov_block); } diff --git a/polkadot/node/network/collator-protocol/src/collator_side/validators_buffer.rs b/polkadot/node/network/collator-protocol/src/collator_side/validators_buffer.rs index 5b88efc99d8307594c5ac726d1af5ab141e4718d..fbb3ff4328a51a7e0b726d03750e814840fe1751 100644 --- a/polkadot/node/network/collator-protocol/src/collator_side/validators_buffer.rs +++ b/polkadot/node/network/collator-protocol/src/collator_side/validators_buffer.rs @@ -45,14 +45,22 @@ use futures::FutureExt; use polkadot_node_network_protocol::PeerId; use polkadot_primitives::{AuthorityDiscoveryId, CandidateHash, GroupIndex, SessionIndex}; +/// Elastic scaling: how many candidates per relay chain block the collator supports building. +pub const MAX_CHAINED_CANDIDATES_PER_RCB: NonZeroUsize = match NonZeroUsize::new(3) { + Some(cap) => cap, + None => panic!("max candidates per rcb cannot be zero"), +}; + /// The ring buffer stores at most this many unique validator groups. /// /// This value should be chosen in way that all groups assigned to our para -/// in the view can fit into the buffer. -pub const VALIDATORS_BUFFER_CAPACITY: NonZeroUsize = match NonZeroUsize::new(3) { - Some(cap) => cap, - None => panic!("buffer capacity must be non-zero"), -}; +/// in the view can fit into the buffer multiplied by amount of candidates we support per relay +/// chain block in the case of elastic scaling. +pub const VALIDATORS_BUFFER_CAPACITY: NonZeroUsize = + match NonZeroUsize::new(3 * MAX_CHAINED_CANDIDATES_PER_RCB.get()) { + Some(cap) => cap, + None => panic!("buffer capacity must be non-zero"), + }; /// Unique identifier of a validators group. #[derive(Debug)] @@ -90,8 +98,7 @@ impl ValidatorGroupsBuffer { } } - /// Returns discovery ids of validators we have at least one advertised-but-not-fetched - /// collation for. + /// Returns discovery ids of validators we are assigned to in this backing group window. pub fn validators_to_connect(&self) -> Vec { let validators_num = self.validators.len(); let bits = self @@ -99,11 +106,22 @@ impl ValidatorGroupsBuffer { .values() .fold(bitvec![0; validators_num], |acc, next| acc | next); - self.validators + let mut should_be_connected: Vec = self + .validators .iter() .enumerate() .filter_map(|(idx, authority_id)| bits[idx].then_some(authority_id.clone())) - .collect() + .collect(); + + if let Some(last_group) = self.group_infos.iter().last() { + for validator in self.validators.iter().rev().take(last_group.len) { + if !should_be_connected.contains(validator) { + should_be_connected.push(validator.clone()); + } + } + } + + should_be_connected } /// Note a new advertisement, marking that we want to be connected to validators @@ -279,7 +297,7 @@ mod tests { assert_eq!(buf.validators_to_connect(), validators[..2].to_vec()); buf.reset_validator_interest(hash_a, &validators[1]); - assert_eq!(buf.validators_to_connect(), vec![validators[0].clone()]); + assert_eq!(buf.validators_to_connect(), validators[0..2].to_vec()); buf.note_collation_advertised(hash_b, 0, GroupIndex(1), &validators[2..]); assert_eq!(buf.validators_to_connect(), validators[2..].to_vec()); @@ -287,7 +305,11 @@ mod tests { for validator in &validators[2..] { buf.reset_validator_interest(hash_b, validator); } - assert!(buf.validators_to_connect().is_empty()); + let mut expected = validators[2..].to_vec(); + expected.sort(); + let mut result = buf.validators_to_connect(); + result.sort(); + assert_eq!(result, expected); } #[test] @@ -320,10 +342,18 @@ mod tests { } buf.reset_validator_interest(hashes[1], &validators[0]); - assert_eq!(buf.validators_to_connect(), validators[..2].to_vec()); + let mut expected: Vec<_> = validators[..4].iter().cloned().collect(); + let mut result = buf.validators_to_connect(); + expected.sort(); + result.sort(); + assert_eq!(result, expected); buf.reset_validator_interest(hashes[0], &validators[0]); - assert_eq!(buf.validators_to_connect(), vec![validators[1].clone()]); + let mut expected: Vec<_> = validators[1..4].iter().cloned().collect(); + expected.sort(); + let mut result = buf.validators_to_connect(); + result.sort(); + assert_eq!(result, expected); buf.note_collation_advertised(hashes[3], 0, GroupIndex(1), &validators[2..4]); buf.note_collation_advertised( diff --git a/polkadot/node/network/collator-protocol/src/error.rs b/polkadot/node/network/collator-protocol/src/error.rs index 9348198e70853de3ab954dd51d9c17836f8d8dd6..0f5e0699d85c026cb3ad489de919cbb9c82ed50c 100644 --- a/polkadot/node/network/collator-protocol/src/error.rs +++ b/polkadot/node/network/collator-protocol/src/error.rs @@ -89,13 +89,21 @@ pub enum SecondingError { #[error("Received duplicate collation from the peer")] Duplicate, + + #[error("The provided parent head data does not match the hash")] + ParentHeadDataMismatch, } impl SecondingError { /// Returns true if an error indicates that a peer is malicious. pub fn is_malicious(&self) -> bool { use SecondingError::*; - matches!(self, PersistedValidationDataMismatch | CandidateHashMismatch | Duplicate) + matches!( + self, + PersistedValidationDataMismatch | + CandidateHashMismatch | + Duplicate | ParentHeadDataMismatch + ) } } diff --git a/polkadot/node/network/collator-protocol/src/validator_side/collation.rs b/polkadot/node/network/collator-protocol/src/validator_side/collation.rs index d6f34fc81b82568f77835a31706abeab5ac51d13..8c3889a3554865c919f2eb33a8f86cce15317ff3 100644 --- a/polkadot/node/network/collator-protocol/src/validator_side/collation.rs +++ b/polkadot/node/network/collator-protocol/src/validator_side/collation.rs @@ -41,7 +41,8 @@ use polkadot_node_subsystem_util::{ metrics::prometheus::prometheus::HistogramTimer, runtime::ProspectiveParachainsMode, }; use polkadot_primitives::{ - CandidateHash, CandidateReceipt, CollatorId, Hash, Id as ParaId, PersistedValidationData, + CandidateHash, CandidateReceipt, CollatorId, Hash, HeadData, Id as ParaId, + PersistedValidationData, }; use tokio_util::sync::CancellationToken; @@ -120,7 +121,7 @@ impl PendingCollation { } } -/// v2 advertisement that was rejected by the backing +/// v2 or v3 advertisement that was rejected by the backing /// subsystem. Validator may fetch it later if its fragment /// membership gets recognized before relay parent goes out of view. #[derive(Debug, Clone)] @@ -143,6 +144,7 @@ pub fn fetched_collation_sanity_check( advertised: &PendingCollation, fetched: &CandidateReceipt, persisted_validation_data: &PersistedValidationData, + maybe_parent_head_and_hash: Option<(HeadData, Hash)>, ) -> Result<(), SecondingError> { if persisted_validation_data.hash() != fetched.descriptor().persisted_validation_data_hash { Err(SecondingError::PersistedValidationDataMismatch) @@ -151,6 +153,8 @@ pub fn fetched_collation_sanity_check( .map_or(false, |pc| pc.candidate_hash() != fetched.hash()) { Err(SecondingError::CandidateHashMismatch) + } else if maybe_parent_head_and_hash.map_or(false, |(head, hash)| head.hash() != hash) { + Err(SecondingError::ParentHeadDataMismatch) } else { Ok(()) } @@ -176,6 +180,9 @@ pub struct PendingCollationFetch { pub candidate_receipt: CandidateReceipt, /// Proof of validity. pub pov: PoV, + /// Optional parachain parent head data. + /// Only needed for elastic scaling. + pub maybe_parent_head_data: Option, } /// The status of the collations in [`CollationsPerRelayParent`]. @@ -359,7 +366,7 @@ impl Future for CollationFetchRequest { }); match &res { - Poll::Ready((_, Ok(request_v1::CollationFetchingResponse::Collation(..)))) => { + Poll::Ready((_, Ok(_))) => { self.span.as_mut().map(|s| s.add_string_tag("success", "true")); }, Poll::Ready((_, Err(_))) => { diff --git a/polkadot/node/network/collator-protocol/src/validator_side/mod.rs b/polkadot/node/network/collator-protocol/src/validator_side/mod.rs index 48ad3c711a6db9c5e9e09c26d1a6290ffbed60f4..d23279e875419b19052380d8d25a1cda6f5d4dfa 100644 --- a/polkadot/node/network/collator-protocol/src/validator_side/mod.rs +++ b/polkadot/node/network/collator-protocol/src/validator_side/mod.rs @@ -44,7 +44,7 @@ use polkadot_node_subsystem::{ jaeger, messages::{ CanSecondRequest, CandidateBackingMessage, CollatorProtocolMessage, IfDisconnected, - NetworkBridgeEvent, NetworkBridgeTxMessage, ProspectiveParachainsMessage, + NetworkBridgeEvent, NetworkBridgeTxMessage, ParentHeadData, ProspectiveParachainsMessage, ProspectiveValidationDataRequest, }, overseer, CollatorProtocolSenderTrait, FromOrchestra, OverseerSignal, PerLeafSpan, @@ -55,7 +55,7 @@ use polkadot_node_subsystem_util::{ runtime::{prospective_parachains_mode, ProspectiveParachainsMode}, }; use polkadot_primitives::{ - CandidateHash, CollatorId, CoreState, Hash, Id as ParaId, OccupiedCoreAssumption, + CandidateHash, CollatorId, CoreState, Hash, HeadData, Id as ParaId, OccupiedCoreAssumption, PersistedValidationData, }; @@ -723,7 +723,7 @@ async fn request_collation( pending_collation, collator_id: collator_id.clone(), collator_protocol_version: peer_protocol_version, - from_collator: response_recv.boxed(), + from_collator: response_recv, cancellation_token: cancellation_token.clone(), span: state .span_per_relay_parent @@ -889,16 +889,16 @@ async fn process_incoming_peer_message( modify_reputation(&mut state.reputation, ctx.sender(), origin, rep).await; } }, - Versioned::V2(V2::AdvertiseCollation { + Versioned::V3(V2::AdvertiseCollation { relay_parent, candidate_hash, parent_head_data_hash, }) | - Versioned::V3(V2::AdvertiseCollation { + Versioned::V2(V2::AdvertiseCollation { relay_parent, candidate_hash, parent_head_data_hash, - }) => + }) => { if let Err(err) = handle_advertisement( ctx.sender(), state, @@ -920,7 +920,8 @@ async fn process_incoming_peer_message( if let Some(rep) = err.reputation_changes() { modify_reputation(&mut state.reputation, ctx.sender(), origin, rep).await; } - }, + } + }, Versioned::V1(V1::CollationSeconded(..)) | Versioned::V2(V2::CollationSeconded(..)) | Versioned::V3(V2::CollationSeconded(..)) => { @@ -1477,7 +1478,7 @@ async fn process_msg( "CollateOn message is not expected on the validator side of the protocol", ); }, - DistributeCollation(..) => { + DistributeCollation { .. } => { gum::warn!( target: LOG_TARGET, "DistributeCollation message is not expected on the validator side of the protocol", @@ -1776,14 +1777,21 @@ async fn request_prospective_validation_data( candidate_relay_parent: Hash, parent_head_data_hash: Hash, para_id: ParaId, + maybe_parent_head_data: Option, ) -> std::result::Result, SecondingError> where Sender: CollatorProtocolSenderTrait, { let (tx, rx) = oneshot::channel(); + let parent_head_data = if let Some(head_data) = maybe_parent_head_data { + ParentHeadData::WithData { head_data, hash: parent_head_data_hash } + } else { + ParentHeadData::OnlyHash(parent_head_data_hash) + }; + let request = - ProspectiveValidationDataRequest { para_id, candidate_relay_parent, parent_head_data_hash }; + ProspectiveValidationDataRequest { para_id, candidate_relay_parent, parent_head_data }; sender .send_message(ProspectiveParachainsMessage::GetProspectiveValidationData(request, tx)) @@ -1797,7 +1805,7 @@ where async fn kick_off_seconding( ctx: &mut Context, state: &mut State, - PendingCollationFetch { mut collation_event, candidate_receipt, pov }: PendingCollationFetch, + PendingCollationFetch { mut collation_event, candidate_receipt, pov, maybe_parent_head_data }: PendingCollationFetch, ) -> std::result::Result<(), SecondingError> { let pending_collation = collation_event.pending_collation; let relay_parent = pending_collation.relay_parent; @@ -1821,38 +1829,46 @@ async fn kick_off_seconding( collation_event.pending_collation.commitments_hash = Some(candidate_receipt.commitments_hash); - let pvd = match ( + let (maybe_pvd, maybe_parent_head_and_hash) = match ( collation_event.collator_protocol_version, collation_event.pending_collation.prospective_candidate, ) { (CollationVersion::V2, Some(ProspectiveCandidate { parent_head_data_hash, .. })) if per_relay_parent.prospective_parachains_mode.is_enabled() => - request_prospective_validation_data( + { + let pvd = request_prospective_validation_data( ctx.sender(), relay_parent, parent_head_data_hash, pending_collation.para_id, + maybe_parent_head_data.clone(), ) - .await?, + .await?; + + (pvd, maybe_parent_head_data.map(|head_data| (head_data, parent_head_data_hash))) + }, // Support V2 collators without async backing enabled. - (CollationVersion::V2, Some(_)) | (CollationVersion::V1, _) => - request_persisted_validation_data( + (CollationVersion::V2, Some(_)) | (CollationVersion::V1, _) => { + let pvd = request_persisted_validation_data( ctx.sender(), candidate_receipt.descriptor().relay_parent, candidate_receipt.descriptor().para_id, ) - .await?, + .await?; + (pvd, None) + }, _ => { // `handle_advertisement` checks for protocol mismatch. return Ok(()) }, - } - .ok_or(SecondingError::PersistedValidationDataNotFound)?; + }; + let pvd = maybe_pvd.ok_or(SecondingError::PersistedValidationDataNotFound)?; fetched_collation_sanity_check( &collation_event.pending_collation, &candidate_receipt, &pvd, + maybe_parent_head_and_hash, )?; ctx.send_message(CandidateBackingMessage::Second( @@ -1883,7 +1899,7 @@ async fn disconnect_inactive_peers( ) { for (peer, peer_data) in peers { if peer_data.is_inactive(&eviction_policy) { - gum::trace!(target: LOG_TARGET, "Disconnecting inactive peer"); + gum::trace!(target: LOG_TARGET, ?peer, "Disconnecting inactive peer"); disconnect_peer(sender, *peer).await; } } @@ -1978,9 +1994,10 @@ async fn handle_collation_fetch_response( ); Err(None) }, - Ok(request_v1::CollationFetchingResponse::Collation(receipt, _)) - if receipt.descriptor().para_id != pending_collation.para_id => - { + Ok( + request_v1::CollationFetchingResponse::Collation(receipt, _) | + request_v1::CollationFetchingResponse::CollationWithParentHeadData { receipt, .. }, + ) if receipt.descriptor().para_id != pending_collation.para_id => { gum::debug!( target: LOG_TARGET, expected_para_id = ?pending_collation.para_id, @@ -2010,6 +2027,33 @@ async fn handle_collation_fetch_response( }, candidate_receipt, pov, + maybe_parent_head_data: None, + }) + }, + Ok(request_v2::CollationFetchingResponse::CollationWithParentHeadData { + receipt, + pov, + parent_head_data, + }) => { + gum::debug!( + target: LOG_TARGET, + para_id = %pending_collation.para_id, + hash = ?pending_collation.relay_parent, + candidate_hash = ?receipt.hash(), + "Received collation (v3)", + ); + let _span = jaeger::Span::new(&pov, "received-collation"); + + metrics_result = Ok(()); + Ok(PendingCollationFetch { + collation_event: CollationEvent { + collator_id, + pending_collation, + collator_protocol_version, + }, + candidate_receipt: receipt, + pov, + maybe_parent_head_data: Some(parent_head_data), }) }, }; diff --git a/polkadot/node/network/collator-protocol/src/validator_side/tests/prospective_parachains.rs b/polkadot/node/network/collator-protocol/src/validator_side/tests/prospective_parachains.rs index 23963e65554eb379693f4dc25e6ef2a4b9ebea89..eaa725f2642ed38e3a6f222f9624dd6e2bc4fcce 100644 --- a/polkadot/node/network/collator-protocol/src/validator_side/tests/prospective_parachains.rs +++ b/polkadot/node/network/collator-protocol/src/validator_side/tests/prospective_parachains.rs @@ -754,6 +754,126 @@ fn fetched_collation_sanity_check() { }); } +#[test] +fn sanity_check_invalid_parent_head_data() { + let test_state = TestState::default(); + + test_harness(ReputationAggregator::new(|_| true), |test_harness| async move { + let TestHarness { mut virtual_overseer, .. } = test_harness; + + let pair = CollatorPair::generate().0; + + let head_c = Hash::from_low_u64_be(130); + let head_c_num = 3; + + update_view(&mut virtual_overseer, &test_state, vec![(head_c, head_c_num)], 1).await; + + let peer_a = PeerId::random(); + + connect_and_declare_collator( + &mut virtual_overseer, + peer_a, + pair.clone(), + test_state.chain_ids[0], + CollationVersion::V2, + ) + .await; + + let mut candidate = dummy_candidate_receipt_bad_sig(head_c, Some(Default::default())); + candidate.descriptor.para_id = test_state.chain_ids[0]; + + let commitments = CandidateCommitments { + head_data: HeadData(vec![1, 2, 3]), + horizontal_messages: Default::default(), + upward_messages: Default::default(), + new_validation_code: None, + processed_downward_messages: 0, + hrmp_watermark: 0, + }; + candidate.commitments_hash = commitments.hash(); + + let parent_head_data = HeadData(vec![4, 2, 0]); + let parent_head_data_hash = parent_head_data.hash(); + let wrong_parent_head_data = HeadData(vec![4, 2]); + + let mut pvd = dummy_pvd(); + pvd.parent_head = parent_head_data; + + candidate.descriptor.persisted_validation_data_hash = pvd.hash(); + + let candidate_hash = candidate.hash(); + + advertise_collation( + &mut virtual_overseer, + peer_a, + head_c, + Some((candidate_hash, parent_head_data_hash)), + ) + .await; + assert_matches!( + overseer_recv(&mut virtual_overseer).await, + AllMessages::CandidateBacking( + CandidateBackingMessage::CanSecond(request, tx), + ) => { + assert_eq!(request.candidate_hash, candidate_hash); + assert_eq!(request.candidate_para_id, test_state.chain_ids[0]); + assert_eq!(request.parent_head_data_hash, parent_head_data_hash); + tx.send(true).expect("receiving side should be alive"); + } + ); + + let response_channel = assert_fetch_collation_request( + &mut virtual_overseer, + head_c, + test_state.chain_ids[0], + Some(candidate_hash), + ) + .await; + + let pov = PoV { block_data: BlockData(vec![1]) }; + + response_channel + .send(Ok(( + request_v2::CollationFetchingResponse::CollationWithParentHeadData { + receipt: candidate.clone(), + pov: pov.clone(), + parent_head_data: wrong_parent_head_data, + } + .encode(), + ProtocolName::from(""), + ))) + .expect("Sending response should succeed"); + + // PVD request. + assert_matches!( + overseer_recv(&mut virtual_overseer).await, + AllMessages::ProspectiveParachains( + ProspectiveParachainsMessage::GetProspectiveValidationData(request, tx), + ) => { + assert_eq!(head_c, request.candidate_relay_parent); + assert_eq!(test_state.chain_ids[0], request.para_id); + tx.send(Some(pvd)).unwrap(); + } + ); + + // Reported malicious. + assert_matches!( + overseer_recv(&mut virtual_overseer).await, + AllMessages::NetworkBridgeTx( + NetworkBridgeTxMessage::ReportPeer(ReportPeerMessage::Single(peer_id, rep)), + ) => { + assert_eq!(peer_a, peer_id); + assert_eq!(rep.value, COST_REPORT_BAD.cost_or_benefit()); + } + ); + + test_helpers::Yield::new().await; + assert_matches!(virtual_overseer.recv().now_or_never(), None); + + virtual_overseer + }); +} + #[test] fn advertisement_spam_protection() { let test_state = TestState::default(); diff --git a/polkadot/node/network/dispute-distribution/Cargo.toml b/polkadot/node/network/dispute-distribution/Cargo.toml index 319b743aa586dfb5104eb2b1fe9f3aa042c2c13f..ff9c302c73146d501114728c4a483e4465d199a9 100644 --- a/polkadot/node/network/dispute-distribution/Cargo.toml +++ b/polkadot/node/network/dispute-distribution/Cargo.toml @@ -10,7 +10,7 @@ license.workspace = true workspace = true [dependencies] -futures = "0.3.21" +futures = "0.3.30" futures-timer = "3.0.2" gum = { package = "tracing-gum", path = "../../gum" } derive_more = "0.99.17" @@ -24,14 +24,14 @@ polkadot-node-primitives = { path = "../../primitives" } sc-network = { path = "../../../../substrate/client/network" } sp-application-crypto = { path = "../../../../substrate/primitives/application-crypto" } sp-keystore = { path = "../../../../substrate/primitives/keystore" } -thiserror = "1.0.48" +thiserror = { workspace = true } fatality = "0.0.6" schnellru = "0.2.1" indexmap = "2.0.0" [dev-dependencies] async-channel = "1.8.0" -async-trait = "0.1.74" +async-trait = "0.1.79" polkadot-node-subsystem-test-helpers = { path = "../../subsystem-test-helpers" } sp-keyring = { path = "../../../../substrate/primitives/keyring" } sp-tracing = { path = "../../../../substrate/primitives/tracing" } diff --git a/polkadot/node/network/dispute-distribution/src/sender/mod.rs b/polkadot/node/network/dispute-distribution/src/sender/mod.rs index f4acc72318ad448b99a106b460b84eefabd5c96d..8187f20146c7ae43fe36601c180ebe9af2c2faeb 100644 --- a/polkadot/node/network/dispute-distribution/src/sender/mod.rs +++ b/polkadot/node/network/dispute-distribution/src/sender/mod.rs @@ -76,7 +76,7 @@ pub struct DisputeSender { /// Value is the hash that was used for the query. active_sessions: HashMap, - /// All ongoing dispute sendings this subsystem is aware of. + /// All ongoing dispute sending this subsystem is aware of. /// /// Using an `IndexMap` so items can be iterated in the order of insertion. disputes: IndexMap>, @@ -105,7 +105,7 @@ struct WaitForActiveDisputesState { #[overseer::contextbounds(DisputeDistribution, prefix = self::overseer)] impl DisputeSender { - /// Create a new `DisputeSender` which can be used to start dispute sendings. + /// Create a new `DisputeSender` which can be used to start dispute sending. pub fn new(tx: NestingSender, metrics: Metrics) -> Self { Self { active_heads: Vec::new(), @@ -362,7 +362,7 @@ async fn get_active_session_indices( runtime: &mut RuntimeInfo, active_heads: &Vec, ) -> Result> { - let mut indeces = HashMap::new(); + let mut indices = HashMap::new(); // Iterate all heads we track as active and fetch the child' session indices. for head in active_heads { let session_index = runtime.get_session_index_for_child(ctx.sender(), *head).await?; @@ -372,9 +372,9 @@ async fn get_active_session_indices( { gum::debug!(target: LOG_TARGET, ?err, ?session_index, "Can't cache SessionInfo"); } - indeces.insert(session_index, *head); + indices.insert(session_index, *head); } - Ok(indeces) + Ok(indices) } /// Retrieve Set of active disputes from the dispute coordinator. diff --git a/polkadot/node/network/dispute-distribution/src/tests/mock.rs b/polkadot/node/network/dispute-distribution/src/tests/mock.rs index e6a49f14c094c9ce98030dda76f1ea2baf88ec87..ccc050233e8408d09e8cbe6261a44e682939d4b9 100644 --- a/polkadot/node/network/dispute-distribution/src/tests/mock.rs +++ b/polkadot/node/network/dispute-distribution/src/tests/mock.rs @@ -163,7 +163,7 @@ pub fn make_dispute_message( let invalid_vote = make_explicit_signed(MOCK_VALIDATORS[invalid_validator.0 as usize], candidate_hash, false); gum::trace!( - "Passed time for invald vote: {:#?}", + "Passed time for invalid vote: {:#?}", Instant::now().saturating_duration_since(before_request) ); DisputeMessage::from_signed_statements( diff --git a/polkadot/node/network/dispute-distribution/src/tests/mod.rs b/polkadot/node/network/dispute-distribution/src/tests/mod.rs index 880d1b18032cc67c546d77a4b68ad59af61ee832..1d0d667f5ccf4a156316110f1493ac180615b877 100644 --- a/polkadot/node/network/dispute-distribution/src/tests/mod.rs +++ b/polkadot/node/network/dispute-distribution/src/tests/mod.rs @@ -57,8 +57,8 @@ use polkadot_node_subsystem_test_helpers::{ subsystem_test_harness, TestSubsystemContextHandle, }; use polkadot_primitives::{ - vstaging::NodeFeatures, AuthorityDiscoveryId, CandidateHash, CandidateReceipt, ExecutorParams, - Hash, SessionIndex, SessionInfo, + AuthorityDiscoveryId, Block, CandidateHash, CandidateReceipt, ExecutorParams, Hash, + NodeFeatures, SessionIndex, SessionInfo, }; use self::mock::{ @@ -879,7 +879,10 @@ where let genesis_hash = Hash::repeat_byte(0xff); let req_protocol_names = ReqProtocolNames::new(&genesis_hash, None); - let (req_receiver, req_cfg) = IncomingRequest::get_config_receiver(&req_protocol_names); + let (req_receiver, req_cfg) = IncomingRequest::get_config_receiver::< + Block, + sc_network::NetworkWorker, + >(&req_protocol_names); let subsystem = DisputeDistributionSubsystem::new( keystore, req_receiver, diff --git a/polkadot/node/network/gossip-support/Cargo.toml b/polkadot/node/network/gossip-support/Cargo.toml index c17f39b019de1f6f248236c387742a9033e60df8..2d6f2f954c667a8a97aff093f1fa734f6afce9aa 100644 --- a/polkadot/node/network/gossip-support/Cargo.toml +++ b/polkadot/node/network/gossip-support/Cargo.toml @@ -22,7 +22,7 @@ polkadot-node-subsystem = { path = "../../subsystem" } polkadot-node-subsystem-util = { path = "../../subsystem-util" } polkadot-primitives = { path = "../../../primitives" } -futures = "0.3.21" +futures = "0.3.30" futures-timer = "3.0.2" rand = { version = "0.8.5", default-features = false } rand_chacha = { version = "0.3.1", default-features = false } @@ -37,6 +37,7 @@ sp-authority-discovery = { path = "../../../../substrate/primitives/authority-di polkadot-node-subsystem-test-helpers = { path = "../../subsystem-test-helpers" } assert_matches = "1.4.0" -async-trait = "0.1.74" +async-trait = "0.1.79" +parking_lot = "0.12.1" lazy_static = "1.4.0" quickcheck = "1.0.3" diff --git a/polkadot/node/network/gossip-support/src/lib.rs b/polkadot/node/network/gossip-support/src/lib.rs index e9cb8a4de1c47b5e3f6e285f86ad38b3cf5ac342..4dfdd1f7208f66ec4a787ffe8bc7f72c41575c9d 100644 --- a/polkadot/node/network/gossip-support/src/lib.rs +++ b/polkadot/node/network/gossip-support/src/lib.rs @@ -63,8 +63,12 @@ use metrics::Metrics; const LOG_TARGET: &str = "parachain::gossip-support"; // How much time should we wait to reissue a connection request // since the last authority discovery resolution failure. +#[cfg(not(test))] const BACKOFF_DURATION: Duration = Duration::from_secs(5); +#[cfg(test)] +const BACKOFF_DURATION: Duration = Duration::from_millis(500); + /// Duration after which we consider low connectivity a problem. /// /// Especially at startup low connectivity is expected (authority discovery cache needs to be @@ -271,8 +275,8 @@ where ) .await?; } - // authority_discovery is just a cache so let's try every leaf to detect if there - // are new authorities there. + // authority_discovery is just a cache so let's try every time we try to re-connect + // if new authorities are present. self.update_authority_ids(sender, session_info.discovery_keys).await; } } diff --git a/polkadot/node/network/gossip-support/src/tests.rs b/polkadot/node/network/gossip-support/src/tests.rs index e5ee101c31d857b2dbd540596649ddaf9b826bd5..cce78df38f308e34e1c663ab2c27850c818e26f8 100644 --- a/polkadot/node/network/gossip-support/src/tests.rs +++ b/polkadot/node/network/gossip-support/src/tests.rs @@ -25,13 +25,19 @@ use lazy_static::lazy_static; use quickcheck::quickcheck; use rand::seq::SliceRandom as _; +use parking_lot::Mutex; use sc_network::multiaddr::Protocol; use sp_authority_discovery::AuthorityPair as AuthorityDiscoveryPair; use sp_consensus_babe::{AllowedSlots, BabeEpochConfiguration, Epoch as BabeEpoch}; use sp_core::crypto::Pair as PairT; use sp_keyring::Sr25519Keyring; +use std::sync::Arc; -use polkadot_node_network_protocol::grid_topology::{SessionGridTopology, TopologyPeerInfo}; +use polkadot_node_network_protocol::{ + grid_topology::{SessionGridTopology, TopologyPeerInfo}, + peer_set::ValidationVersion, + ObservedRole, +}; use polkadot_node_subsystem::messages::{AllMessages, RuntimeApiMessage, RuntimeApiRequest}; use polkadot_node_subsystem_test_helpers as test_helpers; use polkadot_node_subsystem_util::TimeoutExt as _; @@ -51,7 +57,6 @@ const AUTHORITY_KEYRINGS: &[Sr25519Keyring] = &[ ]; lazy_static! { - static ref MOCK_AUTHORITY_DISCOVERY: MockAuthorityDiscovery = MockAuthorityDiscovery::new(); static ref AUTHORITIES: Vec = AUTHORITY_KEYRINGS.iter().map(|k| k.public().into()).collect(); @@ -89,17 +94,14 @@ type VirtualOverseer = test_helpers::TestSubsystemContextHandle>, - authorities: HashMap>, + addrs: Arc>>>, + authorities: Arc>>>, } impl MockAuthorityDiscovery { - fn new() -> Self { - let authorities: HashMap<_, _> = PAST_PRESENT_FUTURE_AUTHORITIES - .clone() - .into_iter() - .map(|a| (PeerId::random(), a)) - .collect(); + fn new(authorities: Vec) -> Self { + let authorities: HashMap<_, _> = + authorities.clone().into_iter().map(|a| (PeerId::random(), a)).collect(); let addrs = authorities .clone() .into_iter() @@ -109,10 +111,37 @@ impl MockAuthorityDiscovery { }) .collect(); Self { - addrs, - authorities: authorities.into_iter().map(|(p, a)| (p, HashSet::from([a]))).collect(), + addrs: Arc::new(Mutex::new(addrs)), + authorities: Arc::new(Mutex::new( + authorities.into_iter().map(|(p, a)| (p, HashSet::from([a]))).collect(), + )), } } + + fn authorities(&self) -> HashMap> { + self.authorities.lock().clone() + } + + fn add_more_authorities( + &self, + new_known: Vec, + ) -> HashMap> { + let authorities: HashMap<_, _> = + new_known.clone().into_iter().map(|a| (PeerId::random(), a)).collect(); + let addrs: HashMap> = authorities + .clone() + .into_iter() + .map(|(p, a)| { + let multiaddr = Multiaddr::empty().with(Protocol::P2p(p.into())); + (a, HashSet::from([multiaddr])) + }) + .collect(); + let authorities: HashMap> = + authorities.into_iter().map(|(p, a)| (p, HashSet::from([a]))).collect(); + self.addrs.as_ref().lock().extend(addrs); + self.authorities.as_ref().lock().extend(authorities.clone()); + authorities + } } #[async_trait] @@ -121,19 +150,23 @@ impl AuthorityDiscovery for MockAuthorityDiscovery { &mut self, authority: polkadot_primitives::AuthorityDiscoveryId, ) -> Option> { - self.addrs.get(&authority).cloned() + self.addrs.lock().get(&authority).cloned() } + async fn get_authority_ids_by_peer_id( &mut self, peer_id: polkadot_node_network_protocol::PeerId, ) -> Option> { - self.authorities.get(&peer_id).cloned() + self.authorities.as_ref().lock().get(&peer_id).cloned() } } -async fn get_multiaddrs(authorities: Vec) -> Vec> { +async fn get_multiaddrs( + authorities: Vec, + mock_authority_discovery: MockAuthorityDiscovery, +) -> Vec> { let mut addrs = Vec::with_capacity(authorities.len()); - let mut discovery = MOCK_AUTHORITY_DISCOVERY.clone(); + let mut discovery = mock_authority_discovery.clone(); for authority in authorities.into_iter() { if let Some(addr) = discovery.get_addresses_by_authority_id(authority).await { addrs.push(addr); @@ -144,9 +177,10 @@ async fn get_multiaddrs(authorities: Vec) -> Vec, + mock_authority_discovery: MockAuthorityDiscovery, ) -> HashMap> { let mut addrs = HashMap::with_capacity(authorities.len()); - let mut discovery = MOCK_AUTHORITY_DISCOVERY.clone(); + let mut discovery = mock_authority_discovery.clone(); for authority in authorities.into_iter() { if let Some(addr) = discovery.get_addresses_by_authority_id(authority.clone()).await { addrs.insert(authority, addr); @@ -155,12 +189,10 @@ async fn get_address_map( addrs } -fn make_subsystem() -> GossipSupport { - GossipSupport::new( - make_ferdie_keystore(), - MOCK_AUTHORITY_DISCOVERY.clone(), - Metrics::new_dummy(), - ) +fn make_subsystem_with_authority_discovery( + mock: MockAuthorityDiscovery, +) -> GossipSupport { + GossipSupport::new(make_ferdie_keystore(), mock, Metrics::new_dummy()) } fn test_harness, AD: AuthorityDiscovery>( @@ -291,59 +323,65 @@ async fn test_neighbors(overseer: &mut VirtualOverseer, expected_session: Sessio #[test] fn issues_a_connection_request_on_new_session() { + let mock_authority_discovery = + MockAuthorityDiscovery::new(PAST_PRESENT_FUTURE_AUTHORITIES.clone()); + let mock_authority_discovery_clone = mock_authority_discovery.clone(); let hash = Hash::repeat_byte(0xAA); - let state = test_harness(make_subsystem(), |mut virtual_overseer| async move { - let overseer = &mut virtual_overseer; - overseer_signal_active_leaves(overseer, hash).await; - assert_matches!( - overseer_recv(overseer).await, - AllMessages::RuntimeApi(RuntimeApiMessage::Request( - relay_parent, - RuntimeApiRequest::SessionIndexForChild(tx), - )) => { - assert_eq!(relay_parent, hash); - tx.send(Ok(1)).unwrap(); - } - ); + let state = test_harness( + make_subsystem_with_authority_discovery(mock_authority_discovery.clone()), + |mut virtual_overseer| async move { + let overseer = &mut virtual_overseer; + overseer_signal_active_leaves(overseer, hash).await; + assert_matches!( + overseer_recv(overseer).await, + AllMessages::RuntimeApi(RuntimeApiMessage::Request( + relay_parent, + RuntimeApiRequest::SessionIndexForChild(tx), + )) => { + assert_eq!(relay_parent, hash); + tx.send(Ok(1)).unwrap(); + } + ); - assert_matches!( - overseer_recv(overseer).await, - AllMessages::RuntimeApi(RuntimeApiMessage::Request( - relay_parent, - RuntimeApiRequest::SessionInfo(s, tx), - )) => { - assert_eq!(relay_parent, hash); - assert_eq!(s, 1); - tx.send(Ok(Some(make_session_info()))).unwrap(); - } - ); + assert_matches!( + overseer_recv(overseer).await, + AllMessages::RuntimeApi(RuntimeApiMessage::Request( + relay_parent, + RuntimeApiRequest::SessionInfo(s, tx), + )) => { + assert_eq!(relay_parent, hash); + assert_eq!(s, 1); + tx.send(Ok(Some(make_session_info()))).unwrap(); + } + ); - assert_matches!( - overseer_recv(overseer).await, - AllMessages::RuntimeApi(RuntimeApiMessage::Request( - relay_parent, - RuntimeApiRequest::Authorities(tx), - )) => { - assert_eq!(relay_parent, hash); - tx.send(Ok(AUTHORITIES.clone())).unwrap(); - } - ); + assert_matches!( + overseer_recv(overseer).await, + AllMessages::RuntimeApi(RuntimeApiMessage::Request( + relay_parent, + RuntimeApiRequest::Authorities(tx), + )) => { + assert_eq!(relay_parent, hash); + tx.send(Ok(AUTHORITIES.clone())).unwrap(); + } + ); - assert_matches!( - overseer_recv(overseer).await, - AllMessages::NetworkBridgeTx(NetworkBridgeTxMessage::ConnectToResolvedValidators { - validator_addrs, - peer_set, - }) => { - assert_eq!(validator_addrs, get_multiaddrs(AUTHORITIES_WITHOUT_US.clone()).await); - assert_eq!(peer_set, PeerSet::Validation); - } - ); + assert_matches!( + overseer_recv(overseer).await, + AllMessages::NetworkBridgeTx(NetworkBridgeTxMessage::ConnectToResolvedValidators { + validator_addrs, + peer_set, + }) => { + assert_eq!(validator_addrs, get_multiaddrs(AUTHORITIES_WITHOUT_US.clone(), mock_authority_discovery_clone).await); + assert_eq!(peer_set, PeerSet::Validation); + } + ); - test_neighbors(overseer, 1).await; + test_neighbors(overseer, 1).await; - virtual_overseer - }); + virtual_overseer + }, + ); assert_eq!(state.last_session_index, Some(1)); assert!(state.last_failure.is_none()); @@ -363,6 +401,7 @@ fn issues_a_connection_request_on_new_session() { tx.send(Ok(1)).unwrap(); } ); + virtual_overseer }); @@ -414,7 +453,7 @@ fn issues_a_connection_request_on_new_session() { validator_addrs, peer_set, }) => { - assert_eq!(validator_addrs, get_multiaddrs(AUTHORITIES_WITHOUT_US.clone()).await); + assert_eq!(validator_addrs, get_multiaddrs(AUTHORITIES_WITHOUT_US.clone(), mock_authority_discovery.clone()).await); assert_eq!(peer_set, PeerSet::Validation); } ); @@ -430,125 +469,405 @@ fn issues_a_connection_request_on_new_session() { #[test] fn issues_connection_request_to_past_present_future() { let hash = Hash::repeat_byte(0xAA); - test_harness(make_subsystem(), |mut virtual_overseer| async move { - let overseer = &mut virtual_overseer; - overseer_signal_active_leaves(overseer, hash).await; - assert_matches!( - overseer_recv(overseer).await, - AllMessages::RuntimeApi(RuntimeApiMessage::Request( - relay_parent, - RuntimeApiRequest::SessionIndexForChild(tx), - )) => { - assert_eq!(relay_parent, hash); - tx.send(Ok(1)).unwrap(); + let mock_authority_discovery = + MockAuthorityDiscovery::new(PAST_PRESENT_FUTURE_AUTHORITIES.clone()); + test_harness( + make_subsystem_with_authority_discovery(mock_authority_discovery.clone()), + |mut virtual_overseer| async move { + let overseer = &mut virtual_overseer; + overseer_signal_active_leaves(overseer, hash).await; + assert_matches!( + overseer_recv(overseer).await, + AllMessages::RuntimeApi(RuntimeApiMessage::Request( + relay_parent, + RuntimeApiRequest::SessionIndexForChild(tx), + )) => { + assert_eq!(relay_parent, hash); + tx.send(Ok(1)).unwrap(); + } + ); + + assert_matches!( + overseer_recv(overseer).await, + AllMessages::RuntimeApi(RuntimeApiMessage::Request( + relay_parent, + RuntimeApiRequest::SessionInfo(s, tx), + )) => { + assert_eq!(relay_parent, hash); + assert_eq!(s, 1); + tx.send(Ok(Some(make_session_info()))).unwrap(); + } + ); + + assert_matches!( + overseer_recv(overseer).await, + AllMessages::RuntimeApi(RuntimeApiMessage::Request( + relay_parent, + RuntimeApiRequest::Authorities(tx), + )) => { + assert_eq!(relay_parent, hash); + tx.send(Ok(PAST_PRESENT_FUTURE_AUTHORITIES.clone())).unwrap(); + } + ); + + assert_matches!( + overseer_recv(overseer).await, + AllMessages::NetworkBridgeTx(NetworkBridgeTxMessage::ConnectToResolvedValidators { + validator_addrs, + peer_set, + }) => { + let all_without_ferdie: Vec<_> = PAST_PRESENT_FUTURE_AUTHORITIES + .iter() + .cloned() + .filter(|p| p != &Sr25519Keyring::Ferdie.public().into()) + .collect(); + + let addrs = get_multiaddrs(all_without_ferdie, mock_authority_discovery.clone()).await; + + assert_eq!(validator_addrs, addrs); + assert_eq!(peer_set, PeerSet::Validation); + } + ); + + // Ensure neighbors are unaffected + test_neighbors(overseer, 1).await; + + virtual_overseer + }, + ); +} + +// Test we notify peer about learning of the authority ID after session boundary, when we couldn't +// connect to more than 1/3 of the authorities. +#[test] +fn issues_update_authorities_after_session() { + let hash = Hash::repeat_byte(0xAA); + + let mut authorities = PAST_PRESENT_FUTURE_AUTHORITIES.clone(); + let unknown_at_session = authorities.split_off(authorities.len() / 3 - 1); + let mut authority_discovery_mock = MockAuthorityDiscovery::new(authorities); + + test_harness( + make_subsystem_with_authority_discovery(authority_discovery_mock.clone()), + |mut virtual_overseer| async move { + let overseer = &mut virtual_overseer; + // 1. Initialize with the first leaf in the session. + overseer_signal_active_leaves(overseer, hash).await; + assert_matches!( + overseer_recv(overseer).await, + AllMessages::RuntimeApi(RuntimeApiMessage::Request( + relay_parent, + RuntimeApiRequest::SessionIndexForChild(tx), + )) => { + assert_eq!(relay_parent, hash); + tx.send(Ok(1)).unwrap(); + } + ); + + assert_matches!( + overseer_recv(overseer).await, + AllMessages::RuntimeApi(RuntimeApiMessage::Request( + relay_parent, + RuntimeApiRequest::SessionInfo(s, tx), + )) => { + assert_eq!(relay_parent, hash); + assert_eq!(s, 1); + let mut session_info = make_session_info(); + session_info.discovery_keys = PAST_PRESENT_FUTURE_AUTHORITIES.clone(); + tx.send(Ok(Some(session_info))).unwrap(); + } + ); + + assert_matches!( + overseer_recv(overseer).await, + AllMessages::RuntimeApi(RuntimeApiMessage::Request( + relay_parent, + RuntimeApiRequest::Authorities(tx), + )) => { + assert_eq!(relay_parent, hash); + tx.send(Ok(PAST_PRESENT_FUTURE_AUTHORITIES.clone())).unwrap(); + } + ); + + assert_matches!( + overseer_recv(overseer).await, + AllMessages::NetworkBridgeTx(NetworkBridgeTxMessage::ConnectToResolvedValidators { + validator_addrs, + peer_set, + }) => { + let all_without_ferdie: Vec<_> = PAST_PRESENT_FUTURE_AUTHORITIES + .iter() + .cloned() + .filter(|p| p != &Sr25519Keyring::Ferdie.public().into()) + .collect(); + + let addrs = get_multiaddrs(all_without_ferdie, authority_discovery_mock.clone()).await; + + assert_eq!(validator_addrs, addrs); + assert_eq!(peer_set, PeerSet::Validation); + } + ); + + // Ensure neighbors are unaffected + assert_matches!( + overseer_recv(overseer).await, + AllMessages::RuntimeApi(RuntimeApiMessage::Request( + _, + RuntimeApiRequest::CurrentBabeEpoch(tx), + )) => { + let _ = tx.send(Ok(BabeEpoch { + epoch_index: 2 as _, + start_slot: 0.into(), + duration: 200, + authorities: vec![(Sr25519Keyring::Alice.public().into(), 1)], + randomness: [0u8; 32], + config: BabeEpochConfiguration { + c: (1, 4), + allowed_slots: AllowedSlots::PrimarySlots, + }, + })).unwrap(); + } + ); + + assert_matches!( + overseer_recv(overseer).await, + AllMessages::NetworkBridgeRx(NetworkBridgeRxMessage::NewGossipTopology { + session: _, + local_index: _, + canonical_shuffling: _, + shuffled_indices: _, + }) => { + + } + ); + + // 2. Connect all authorities that are known so far. + let known_authorities = authority_discovery_mock.authorities(); + for (peer_id, _id) in known_authorities.iter() { + let msg = + GossipSupportMessage::NetworkBridgeUpdate(NetworkBridgeEvent::PeerConnected( + *peer_id, + ObservedRole::Authority, + ValidationVersion::V3.into(), + None, + )); + overseer.send(FromOrchestra::Communication { msg }).await } - ); - assert_matches!( - overseer_recv(overseer).await, - AllMessages::RuntimeApi(RuntimeApiMessage::Request( - relay_parent, - RuntimeApiRequest::SessionInfo(s, tx), - )) => { - assert_eq!(relay_parent, hash); - assert_eq!(s, 1); - tx.send(Ok(Some(make_session_info()))).unwrap(); + Delay::new(BACKOFF_DURATION).await; + // 3. Send a new leaf after BACKOFF_DURATION and check UpdateAuthority is emitted for + // all known connected peers. + let hash = Hash::repeat_byte(0xBB); + overseer_signal_active_leaves(overseer, hash).await; + + assert_matches!( + overseer_recv(overseer).await, + AllMessages::RuntimeApi(RuntimeApiMessage::Request( + relay_parent, + RuntimeApiRequest::SessionIndexForChild(tx), + )) => { + assert_eq!(relay_parent, hash); + tx.send(Ok(1)).unwrap(); + } + ); + + assert_matches!( + overseer_recv(overseer).await, + AllMessages::RuntimeApi(RuntimeApiMessage::Request( + relay_parent, + RuntimeApiRequest::SessionInfo(s, tx), + )) => { + assert_eq!(relay_parent, hash); + assert_eq!(s, 1); + let mut session_info = make_session_info(); + session_info.discovery_keys = PAST_PRESENT_FUTURE_AUTHORITIES.clone(); + tx.send(Ok(Some(session_info))).unwrap(); + + } + ); + + assert_matches!( + overseer_recv(overseer).await, + AllMessages::RuntimeApi(RuntimeApiMessage::Request( + relay_parent, + RuntimeApiRequest::Authorities(tx), + )) => { + assert_eq!(relay_parent, hash); + tx.send(Ok(PAST_PRESENT_FUTURE_AUTHORITIES.clone())).unwrap(); + } + ); + + assert_matches!( + overseer_recv(overseer).await, + AllMessages::NetworkBridgeTx(NetworkBridgeTxMessage::ConnectToResolvedValidators { + validator_addrs: _, + peer_set: _, + }) => { + } + ); + + for _ in 0..known_authorities.len() { + assert_matches!( + overseer_recv(overseer).await, + AllMessages::NetworkBridgeRx(NetworkBridgeRxMessage::UpdatedAuthorityIds { + peer_id, + authority_ids, + }) => { + assert_eq!(authority_discovery_mock.get_authority_ids_by_peer_id(peer_id).await.unwrap_or_default(), authority_ids); + } + ); } - ); - assert_matches!( - overseer_recv(overseer).await, - AllMessages::RuntimeApi(RuntimeApiMessage::Request( - relay_parent, - RuntimeApiRequest::Authorities(tx), - )) => { - assert_eq!(relay_parent, hash); - tx.send(Ok(PAST_PRESENT_FUTURE_AUTHORITIES.clone())).unwrap(); + assert!(overseer.recv().timeout(TIMEOUT).await.is_none()); + // 4. Connect more authorities except one + let newly_added = authority_discovery_mock.add_more_authorities(unknown_at_session); + let mut newly_added_iter = newly_added.iter(); + let unconnected_at_last_retry = newly_added_iter + .next() + .map(|(peer_id, authority_id)| (*peer_id, authority_id.clone())) + .unwrap(); + for (peer_id, _) in newly_added_iter { + let msg = + GossipSupportMessage::NetworkBridgeUpdate(NetworkBridgeEvent::PeerConnected( + *peer_id, + ObservedRole::Authority, + ValidationVersion::V3.into(), + None, + )); + overseer.send(FromOrchestra::Communication { msg }).await } - ); - assert_matches!( - overseer_recv(overseer).await, - AllMessages::NetworkBridgeTx(NetworkBridgeTxMessage::ConnectToResolvedValidators { - validator_addrs, - peer_set, - }) => { - let all_without_ferdie: Vec<_> = PAST_PRESENT_FUTURE_AUTHORITIES - .iter() - .cloned() - .filter(|p| p != &Sr25519Keyring::Ferdie.public().into()) - .collect(); + // 5. Send a new leaf and check UpdateAuthority is emitted only for the newly connected + // peers. + let hash = Hash::repeat_byte(0xCC); + Delay::new(BACKOFF_DURATION).await; + overseer_signal_active_leaves(overseer, hash).await; - let addrs = get_multiaddrs(all_without_ferdie).await; + assert_matches!( + overseer_recv(overseer).await, + AllMessages::RuntimeApi(RuntimeApiMessage::Request( + relay_parent, + RuntimeApiRequest::SessionIndexForChild(tx), + )) => { + assert_eq!(relay_parent, hash); + tx.send(Ok(1)).unwrap(); + } + ); - assert_eq!(validator_addrs, addrs); - assert_eq!(peer_set, PeerSet::Validation); - } - ); + assert_matches!( + overseer_recv(overseer).await, + AllMessages::RuntimeApi(RuntimeApiMessage::Request( + relay_parent, + RuntimeApiRequest::SessionInfo(s, tx), + )) => { + assert_eq!(relay_parent, hash); + assert_eq!(s, 1); + let mut session_info = make_session_info(); + session_info.discovery_keys = PAST_PRESENT_FUTURE_AUTHORITIES.clone(); + tx.send(Ok(Some(session_info))).unwrap(); + } + ); - // Ensure neighbors are unaffected - test_neighbors(overseer, 1).await; + assert_matches!( + overseer_recv(overseer).await, + AllMessages::RuntimeApi(RuntimeApiMessage::Request( + relay_parent, + RuntimeApiRequest::Authorities(tx), + )) => { + assert_eq!(relay_parent, hash); + tx.send(Ok(PAST_PRESENT_FUTURE_AUTHORITIES.clone())).unwrap(); + } + ); - virtual_overseer - }); + assert_matches!( + overseer_recv(overseer).await, + AllMessages::NetworkBridgeTx(NetworkBridgeTxMessage::ConnectToResolvedValidators { + validator_addrs: _, + peer_set: _, + }) => { + } + ); + + for _ in 1..newly_added.len() { + assert_matches!( + overseer_recv(overseer).await, + AllMessages::NetworkBridgeRx(NetworkBridgeRxMessage::UpdatedAuthorityIds { + peer_id, + authority_ids, + }) => { + assert_ne!(peer_id, unconnected_at_last_retry.0); + assert_eq!(newly_added.get(&peer_id).cloned().unwrap_or_default(), authority_ids); + } + ); + } + + assert!(overseer.recv().timeout(TIMEOUT).await.is_none()); + virtual_overseer + }, + ); } #[test] fn disconnect_when_not_in_past_present_future() { sp_tracing::try_init_simple(); + let mock_authority_discovery = + MockAuthorityDiscovery::new(PAST_PRESENT_FUTURE_AUTHORITIES.clone()); let hash = Hash::repeat_byte(0xAA); - test_harness(make_subsystem(), |mut virtual_overseer| async move { - let overseer = &mut virtual_overseer; - overseer_signal_active_leaves(overseer, hash).await; - assert_matches!( - overseer_recv(overseer).await, - AllMessages::RuntimeApi(RuntimeApiMessage::Request( - relay_parent, - RuntimeApiRequest::SessionIndexForChild(tx), - )) => { - assert_eq!(relay_parent, hash); - tx.send(Ok(1)).unwrap(); - } - ); + test_harness( + make_subsystem_with_authority_discovery(mock_authority_discovery.clone()), + |mut virtual_overseer| async move { + let overseer = &mut virtual_overseer; + overseer_signal_active_leaves(overseer, hash).await; + assert_matches!( + overseer_recv(overseer).await, + AllMessages::RuntimeApi(RuntimeApiMessage::Request( + relay_parent, + RuntimeApiRequest::SessionIndexForChild(tx), + )) => { + assert_eq!(relay_parent, hash); + tx.send(Ok(1)).unwrap(); + } + ); - assert_matches!( - overseer_recv(overseer).await, - AllMessages::RuntimeApi(RuntimeApiMessage::Request( - relay_parent, - RuntimeApiRequest::SessionInfo(s, tx), - )) => { - assert_eq!(relay_parent, hash); - assert_eq!(s, 1); - let mut heute_leider_nicht = make_session_info(); - heute_leider_nicht.discovery_keys = AUTHORITIES_WITHOUT_US.clone(); - tx.send(Ok(Some(heute_leider_nicht))).unwrap(); - } - ); + assert_matches!( + overseer_recv(overseer).await, + AllMessages::RuntimeApi(RuntimeApiMessage::Request( + relay_parent, + RuntimeApiRequest::SessionInfo(s, tx), + )) => { + assert_eq!(relay_parent, hash); + assert_eq!(s, 1); + let mut heute_leider_nicht = make_session_info(); + heute_leider_nicht.discovery_keys = AUTHORITIES_WITHOUT_US.clone(); + tx.send(Ok(Some(heute_leider_nicht))).unwrap(); + } + ); - assert_matches!( - overseer_recv(overseer).await, - AllMessages::RuntimeApi(RuntimeApiMessage::Request( - relay_parent, - RuntimeApiRequest::Authorities(tx), - )) => { - assert_eq!(relay_parent, hash); - tx.send(Ok(AUTHORITIES_WITHOUT_US.clone())).unwrap(); - } - ); + assert_matches!( + overseer_recv(overseer).await, + AllMessages::RuntimeApi(RuntimeApiMessage::Request( + relay_parent, + RuntimeApiRequest::Authorities(tx), + )) => { + assert_eq!(relay_parent, hash); + tx.send(Ok(AUTHORITIES_WITHOUT_US.clone())).unwrap(); + } + ); - assert_matches!( - overseer_recv(overseer).await, - AllMessages::NetworkBridgeTx(NetworkBridgeTxMessage::ConnectToResolvedValidators { - validator_addrs, - peer_set, - }) => { - assert!(validator_addrs.is_empty()); - assert_eq!(peer_set, PeerSet::Validation); - } - ); + assert_matches!( + overseer_recv(overseer).await, + AllMessages::NetworkBridgeTx(NetworkBridgeTxMessage::ConnectToResolvedValidators { + validator_addrs, + peer_set, + }) => { + assert!(validator_addrs.is_empty()); + assert_eq!(peer_set, PeerSet::Validation); + } + ); - virtual_overseer - }); + virtual_overseer + }, + ); } #[test] @@ -579,13 +898,15 @@ fn test_log_output() { #[test] fn issues_a_connection_request_when_last_request_was_mostly_unresolved() { let hash = Hash::repeat_byte(0xAA); - let mut state = make_subsystem(); + let mock_authority_discovery = + MockAuthorityDiscovery::new(PAST_PRESENT_FUTURE_AUTHORITIES.clone()); + let state = make_subsystem_with_authority_discovery(mock_authority_discovery.clone()); // There will be two lookup failures: let alice = Sr25519Keyring::Alice.public().into(); let bob = Sr25519Keyring::Bob.public().into(); - let alice_addr = state.authority_discovery.addrs.remove(&alice); - state.authority_discovery.addrs.remove(&bob); - + let alice_addr = state.authority_discovery.addrs.lock().remove(&alice); + state.authority_discovery.addrs.lock().remove(&bob); + let mock_authority_discovery_clone = mock_authority_discovery.clone(); let mut state = { let alice = alice.clone(); let bob = bob.clone(); @@ -633,7 +954,7 @@ fn issues_a_connection_request_when_last_request_was_mostly_unresolved() { validator_addrs, peer_set, }) => { - let mut expected = get_address_map(AUTHORITIES_WITHOUT_US.clone()).await; + let mut expected = get_address_map(AUTHORITIES_WITHOUT_US.clone(), mock_authority_discovery_clone.clone()).await; expected.remove(&alice); expected.remove(&bob); let expected: HashSet = expected.into_values().flat_map(|v| v.into_iter()).collect(); @@ -652,7 +973,7 @@ fn issues_a_connection_request_when_last_request_was_mostly_unresolved() { assert!(state.last_failure.is_some()); state.last_failure = state.last_failure.and_then(|i| i.checked_sub(BACKOFF_DURATION)); // One error less: - state.authority_discovery.addrs.insert(alice, alice_addr.unwrap()); + state.authority_discovery.addrs.lock().insert(alice, alice_addr.unwrap()); let hash = Hash::repeat_byte(0xBB); let state = test_harness(state, |mut virtual_overseer| async move { @@ -698,7 +1019,7 @@ fn issues_a_connection_request_when_last_request_was_mostly_unresolved() { validator_addrs, peer_set, }) => { - let mut expected = get_address_map(AUTHORITIES_WITHOUT_US.clone()).await; + let mut expected = get_address_map(AUTHORITIES_WITHOUT_US.clone(), mock_authority_discovery.clone()).await; expected.remove(&bob); let expected: HashSet = expected.into_values().flat_map(|v| v.into_iter()).collect(); assert_eq!(validator_addrs.into_iter().flat_map(|v| v.into_iter()).collect::>(), expected); diff --git a/polkadot/node/network/protocol/Cargo.toml b/polkadot/node/network/protocol/Cargo.toml index a8b0cf2737eaa12ed3633aac8588ed6f19407ebf..0408e673791114793da1b231baa7448f185b0db6 100644 --- a/polkadot/node/network/protocol/Cargo.toml +++ b/polkadot/node/network/protocol/Cargo.toml @@ -11,17 +11,19 @@ workspace = true [dependencies] async-channel = "1.8.0" -async-trait = "0.1.74" +async-trait = "0.1.79" hex = "0.4.3" polkadot-primitives = { path = "../../../primitives" } polkadot-node-primitives = { path = "../../primitives" } polkadot-node-jaeger = { path = "../../jaeger" } parity-scale-codec = { version = "3.6.1", default-features = false, features = ["derive"] } sc-network = { path = "../../../../substrate/client/network" } +sc-network-types = { path = "../../../../substrate/client/network/types" } sc-authority-discovery = { path = "../../../../substrate/client/authority-discovery" } -strum = { version = "0.24", features = ["derive"] } -futures = "0.3.21" -thiserror = "1.0.48" +sp-runtime = { path = "../../../../substrate/primitives/runtime" } +strum = { version = "0.26.2", features = ["derive"] } +futures = "0.3.30" +thiserror = { workspace = true } fatality = "0.0.6" rand = "0.8" derive_more = "0.99" diff --git a/polkadot/node/network/protocol/src/authority_discovery.rs b/polkadot/node/network/protocol/src/authority_discovery.rs index beb5409d4ac04a58b1ba276fdfd8f7c6cae030f7..fe01f3ccd336d8d1cfaf474a3bae705a69c4f89c 100644 --- a/polkadot/node/network/protocol/src/authority_discovery.rs +++ b/polkadot/node/network/protocol/src/authority_discovery.rs @@ -23,7 +23,8 @@ use async_trait::async_trait; use sc_authority_discovery::Service as AuthorityDiscoveryService; use polkadot_primitives::AuthorityDiscoveryId; -use sc_network::{Multiaddr, PeerId}; +use sc_network::Multiaddr; +use sc_network_types::PeerId; /// An abstraction over the authority discovery service. /// diff --git a/polkadot/node/network/protocol/src/grid_topology.rs b/polkadot/node/network/protocol/src/grid_topology.rs index 3c4372a27a2c42e20227adbe15d2cc7fcade3d12..a14d24610722bfad2d26df9526d8e6d7411e6f68 100644 --- a/polkadot/node/network/protocol/src/grid_topology.rs +++ b/polkadot/node/network/protocol/src/grid_topology.rs @@ -89,7 +89,7 @@ impl SessionGridTopology { SessionGridTopology { shuffled_indices, canonical_shuffling, peer_ids } } - /// Updates the known peer ids for the passed authorithies ids. + /// Updates the known peer ids for the passed authorities ids. pub fn update_authority_ids( &mut self, peer_id: PeerId, @@ -313,7 +313,7 @@ impl SessionGridTopologyEntry { self.topology.is_validator(peer) } - /// Updates the known peer ids for the passed authorithies ids. + /// Updates the known peer ids for the passed authorities ids. pub fn update_authority_ids( &mut self, peer_id: PeerId, @@ -345,7 +345,7 @@ impl SessionGridTopologies { self.inner.get(&session).and_then(|val| val.0.as_ref()) } - /// Updates the known peer ids for the passed authorithies ids. + /// Updates the known peer ids for the passed authorities ids. pub fn update_authority_ids( &mut self, peer_id: PeerId, diff --git a/polkadot/node/network/protocol/src/lib.rs b/polkadot/node/network/protocol/src/lib.rs index 7a0ff9f4fa9a26c2ec1f7d97b03d61424e83b98b..c38838b1ef9845eb85c929066eb7de108374fa0d 100644 --- a/polkadot/node/network/protocol/src/lib.rs +++ b/polkadot/node/network/protocol/src/lib.rs @@ -25,7 +25,8 @@ use std::{collections::HashMap, fmt}; #[doc(hidden)] pub use polkadot_node_jaeger as jaeger; -pub use sc_network::{IfDisconnected, PeerId}; +pub use sc_network::IfDisconnected; +pub use sc_network_types::PeerId; #[doc(hidden)] pub use std::sync::Arc; @@ -610,7 +611,7 @@ pub mod v1 { /// /// The payload is the local peer id of the node, which serves to prove that it /// controls the collator key it is declaring an intention to collate under. - pub fn declare_signature_payload(peer_id: &sc_network::PeerId) -> Vec { + pub fn declare_signature_payload(peer_id: &sc_network_types::PeerId) -> Vec { let mut payload = peer_id.to_bytes(); payload.extend_from_slice(b"COLL"); payload @@ -863,7 +864,7 @@ pub mod v2 { /// /// The payload is the local peer id of the node, which serves to prove that it /// controls the collator key it is declaring an intention to collate under. - pub fn declare_signature_payload(peer_id: &sc_network::PeerId) -> Vec { + pub fn declare_signature_payload(peer_id: &sc_network_types::PeerId) -> Vec { let mut payload = peer_id.to_bytes(); payload.extend_from_slice(b"COLL"); payload @@ -871,7 +872,7 @@ pub mod v2 { } /// v3 network protocol types. -/// Purpose is for chaning ApprovalDistributionMessage to +/// Purpose is for changing ApprovalDistributionMessage to /// include more than one assignment and approval in a message. pub mod v3 { use parity_scale_codec::{Decode, Encode}; diff --git a/polkadot/node/network/protocol/src/peer_set.rs b/polkadot/node/network/protocol/src/peer_set.rs index cb329607ad6127024af9e6d6bc3c75c7e813c0e3..f80cbf227945d6f508e53d62fc3ebc0bf512261d 100644 --- a/polkadot/node/network/protocol/src/peer_set.rs +++ b/polkadot/node/network/protocol/src/peer_set.rs @@ -19,13 +19,14 @@ use derive_more::Display; use polkadot_primitives::Hash; use sc_network::{ - config::{NonDefaultSetConfig, SetConfig}, - types::ProtocolName, - NotificationService, + config::SetConfig, peer_store::PeerStoreProvider, service::NotificationMetrics, + types::ProtocolName, NetworkBackend, NotificationService, }; +use sp_runtime::traits::Block; use std::{ collections::{hash_map::Entry, HashMap}, ops::{Index, IndexMut}, + sync::Arc, }; use strum::{EnumIter, IntoEnumIterator}; @@ -65,11 +66,13 @@ impl PeerSet { /// /// Those should be used in the network configuration to register the protocols with the /// network service. - pub fn get_info( + pub fn get_info::Hash>>( self, is_authority: IsAuthority, peerset_protocol_names: &PeerSetProtocolNames, - ) -> (NonDefaultSetConfig, (PeerSet, Box)) { + metrics: NotificationMetrics, + peer_store_handle: Arc, + ) -> (N::NotificationProtocolConfig, (PeerSet, Box)) { // Networking layer relies on `get_main_name()` being the main name of the protocol // for peersets and connection management. let protocol = peerset_protocol_names.get_main_name(self); @@ -82,7 +85,7 @@ impl PeerSet { match self { PeerSet::Validation => { - let (config, notification_service) = NonDefaultSetConfig::new( + let (config, notification_service) = N::notification_config( protocol, fallback_names, max_notification_size, @@ -97,12 +100,14 @@ impl PeerSet { reserved_nodes: Vec::new(), non_reserved_mode: sc_network::config::NonReservedPeerMode::Accept, }, + metrics, + peer_store_handle, ); (config, (PeerSet::Validation, notification_service)) }, PeerSet::Collation => { - let (config, notification_service) = NonDefaultSetConfig::new( + let (config, notification_service) = N::notification_config( protocol, fallback_names, max_notification_size, @@ -119,6 +124,8 @@ impl PeerSet { sc_network::config::NonReservedPeerMode::Deny }, }, + metrics, + peer_store_handle, ); (config, (PeerSet::Collation, notification_service)) @@ -207,12 +214,21 @@ impl IndexMut for PerPeerSet { /// /// Should be used during network configuration (added to `NetworkConfiguration::extra_sets`) /// or shortly after startup to register the protocols with the network service. -pub fn peer_sets_info( +pub fn peer_sets_info::Hash>>( is_authority: IsAuthority, peerset_protocol_names: &PeerSetProtocolNames, -) -> Vec<(NonDefaultSetConfig, (PeerSet, Box))> { + metrics: NotificationMetrics, + peer_store_handle: Arc, +) -> Vec<(N::NotificationProtocolConfig, (PeerSet, Box))> { PeerSet::iter() - .map(|s| s.get_info(is_authority, &peerset_protocol_names)) + .map(|s| { + s.get_info::( + is_authority, + &peerset_protocol_names, + metrics.clone(), + Arc::clone(&peer_store_handle), + ) + }) .collect() } @@ -234,7 +250,7 @@ pub enum ValidationVersion { /// The second version. V2 = 2, /// The third version where changes to ApprovalDistributionMessage had been made. - /// The changes are translatable to V2 format untill assignments v2 and approvals + /// The changes are translatable to V2 format until assignments v2 and approvals /// coalescing is enabled through a runtime upgrade. V3 = 3, } diff --git a/polkadot/node/network/protocol/src/request_response/incoming/error.rs b/polkadot/node/network/protocol/src/request_response/incoming/error.rs index efc3d8ecfcd4f6ab341a28dbfdf660f53190f7ff..7de9d919058ab05d3c91832c7d9829173d948e43 100644 --- a/polkadot/node/network/protocol/src/request_response/incoming/error.rs +++ b/polkadot/node/network/protocol/src/request_response/incoming/error.rs @@ -16,7 +16,7 @@ //! Error handling related code and Error/Result definitions. -use sc_network::PeerId; +use sc_network_types::PeerId; use parity_scale_codec::Error as DecodingError; diff --git a/polkadot/node/network/protocol/src/request_response/incoming/mod.rs b/polkadot/node/network/protocol/src/request_response/incoming/mod.rs index 4455448386728e2fdc7188f35841947ca8ddd985..e85390729ee3f99f4a74b4cf2b90ac225c819fc6 100644 --- a/polkadot/node/network/protocol/src/request_response/incoming/mod.rs +++ b/polkadot/node/network/protocol/src/request_response/incoming/mod.rs @@ -20,7 +20,9 @@ use futures::{channel::oneshot, StreamExt}; use parity_scale_codec::{Decode, Encode}; -use sc_network::{config as netconfig, config::RequestResponseConfig, PeerId}; +use sc_network::{config as netconfig, NetworkBackend}; +use sc_network_types::PeerId; +use sp_runtime::traits::Block; use super::{IsRequest, ReqProtocolNames}; use crate::UnifiedReputationChange; @@ -47,15 +49,15 @@ where Req: IsRequest + Decode + Encode, Req::Response: Encode, { - /// Create configuration for `NetworkConfiguration::request_response_porotocols` and a + /// Create configuration for `NetworkConfiguration::request_response_protocols` and a /// corresponding typed receiver. /// /// This Register that config with substrate networking and receive incoming requests via the /// returned `IncomingRequestReceiver`. - pub fn get_config_receiver( + pub fn get_config_receiver::Hash>>( req_protocol_names: &ReqProtocolNames, - ) -> (IncomingRequestReceiver, RequestResponseConfig) { - let (raw, cfg) = Req::PROTOCOL.get_config(req_protocol_names); + ) -> (IncomingRequestReceiver, N::RequestResponseProtocolConfig) { + let (raw, cfg) = Req::PROTOCOL.get_config::(req_protocol_names); (IncomingRequestReceiver { raw, phantom: PhantomData {} }, cfg) } diff --git a/polkadot/node/network/protocol/src/request_response/mod.rs b/polkadot/node/network/protocol/src/request_response/mod.rs index a67d83aff0c9210e9a1233640540635514e4cf71..cab02bb88a00b429a80ce25e342fd38e25b3f3d5 100644 --- a/polkadot/node/network/protocol/src/request_response/mod.rs +++ b/polkadot/node/network/protocol/src/request_response/mod.rs @@ -31,7 +31,7 @@ //! data, like what is the corresponding response type. //! //! ## Versioning -//! +//! //! Versioning for request-response protocols can be done in multiple ways. //! //! If you're just changing the protocol name but the binary payloads are the same, just add a new @@ -52,6 +52,8 @@ use std::{collections::HashMap, time::Duration, u64}; use polkadot_primitives::{MAX_CODE_SIZE, MAX_POV_SIZE}; +use sc_network::NetworkBackend; +use sp_runtime::traits::Block; use strum::{EnumIter, IntoEnumIterator}; pub use sc_network::{config as network, config::RequestResponseConfig, ProtocolName}; @@ -179,76 +181,76 @@ impl Protocol { /// /// Returns a `ProtocolConfig` for this protocol. /// Use this if you plan only to send requests for this protocol. - pub fn get_outbound_only_config( + pub fn get_outbound_only_config::Hash>>( self, req_protocol_names: &ReqProtocolNames, - ) -> RequestResponseConfig { - self.create_config(req_protocol_names, None) + ) -> N::RequestResponseProtocolConfig { + self.create_config::(req_protocol_names, None) } /// Get a configuration for a given Request response protocol. /// /// Returns a receiver for messages received on this protocol and the requested /// `ProtocolConfig`. - pub fn get_config( + pub fn get_config::Hash>>( self, req_protocol_names: &ReqProtocolNames, - ) -> (async_channel::Receiver, RequestResponseConfig) { + ) -> (async_channel::Receiver, N::RequestResponseProtocolConfig) { let (tx, rx) = async_channel::bounded(self.get_channel_size()); - let cfg = self.create_config(req_protocol_names, Some(tx)); + let cfg = self.create_config::(req_protocol_names, Some(tx)); (rx, cfg) } - fn create_config( + fn create_config::Hash>>( self, req_protocol_names: &ReqProtocolNames, tx: Option>, - ) -> RequestResponseConfig { + ) -> N::RequestResponseProtocolConfig { let name = req_protocol_names.get_name(self); let legacy_names = self.get_legacy_name().into_iter().map(Into::into).collect(); match self { - Protocol::ChunkFetchingV1 => RequestResponseConfig { + Protocol::ChunkFetchingV1 => N::request_response_config( name, - fallback_names: legacy_names, - max_request_size: 1_000, - max_response_size: POV_RESPONSE_SIZE as u64 * 3, + legacy_names, + 1_000, + POV_RESPONSE_SIZE as u64 * 3, // We are connected to all validators: - request_timeout: CHUNK_REQUEST_TIMEOUT, - inbound_queue: tx, - }, + CHUNK_REQUEST_TIMEOUT, + tx, + ), Protocol::CollationFetchingV1 | Protocol::CollationFetchingV2 => - RequestResponseConfig { + N::request_response_config( name, - fallback_names: legacy_names, - max_request_size: 1_000, - max_response_size: POV_RESPONSE_SIZE, + legacy_names, + 1_000, + POV_RESPONSE_SIZE, // Taken from initial implementation in collator protocol: - request_timeout: POV_REQUEST_TIMEOUT_CONNECTED, - inbound_queue: tx, - }, - Protocol::PoVFetchingV1 => RequestResponseConfig { + POV_REQUEST_TIMEOUT_CONNECTED, + tx, + ), + Protocol::PoVFetchingV1 => N::request_response_config( name, - fallback_names: legacy_names, - max_request_size: 1_000, - max_response_size: POV_RESPONSE_SIZE, - request_timeout: POV_REQUEST_TIMEOUT_CONNECTED, - inbound_queue: tx, - }, - Protocol::AvailableDataFetchingV1 => RequestResponseConfig { + legacy_names, + 1_000, + POV_RESPONSE_SIZE, + POV_REQUEST_TIMEOUT_CONNECTED, + tx, + ), + Protocol::AvailableDataFetchingV1 => N::request_response_config( name, - fallback_names: legacy_names, - max_request_size: 1_000, + legacy_names, + 1_000, // Available data size is dominated by the PoV size. - max_response_size: POV_RESPONSE_SIZE, - request_timeout: POV_REQUEST_TIMEOUT_CONNECTED, - inbound_queue: tx, - }, - Protocol::StatementFetchingV1 => RequestResponseConfig { + POV_RESPONSE_SIZE, + POV_REQUEST_TIMEOUT_CONNECTED, + tx, + ), + Protocol::StatementFetchingV1 => N::request_response_config( name, - fallback_names: legacy_names, - max_request_size: 1_000, + legacy_names, + 1_000, // Available data size is dominated code size. - max_response_size: STATEMENT_RESPONSE_SIZE, + STATEMENT_RESPONSE_SIZE, // We need statement fetching to be fast and will try our best at the responding // side to answer requests within that timeout, assuming a bandwidth of 500Mbit/s // - which is the recommended minimum bandwidth for nodes on Kusama as of April @@ -258,27 +260,27 @@ impl Protocol { // waiting for timeout on an overloaded node. Fetches from slow nodes will likely // fail, but this is desired, so we can quickly move on to a faster one - we should // also decrease its reputation. - request_timeout: Duration::from_secs(1), - inbound_queue: tx, - }, - Protocol::DisputeSendingV1 => RequestResponseConfig { + Duration::from_secs(1), + tx, + ), + Protocol::DisputeSendingV1 => N::request_response_config( name, - fallback_names: legacy_names, - max_request_size: 1_000, + legacy_names, + 1_000, // Responses are just confirmation, in essence not even a bit. So 100 seems // plenty. - max_response_size: 100, - request_timeout: DISPUTE_REQUEST_TIMEOUT, - inbound_queue: tx, - }, - Protocol::AttestedCandidateV2 => RequestResponseConfig { + 100, + DISPUTE_REQUEST_TIMEOUT, + tx, + ), + Protocol::AttestedCandidateV2 => N::request_response_config( name, - fallback_names: legacy_names, - max_request_size: 1_000, - max_response_size: ATTESTED_CANDIDATE_RESPONSE_SIZE, - request_timeout: ATTESTED_CANDIDATE_TIMEOUT, - inbound_queue: tx, - }, + legacy_names, + 1_000, + ATTESTED_CANDIDATE_RESPONSE_SIZE, + ATTESTED_CANDIDATE_TIMEOUT, + tx, + ), } } @@ -287,7 +289,7 @@ impl Protocol { match self { // Hundreds of validators will start requesting their chunks once they see a candidate // awaiting availability on chain. Given that they will see that block at different - // times (due to network delays), 100 seems big enough to accomodate for "bursts", + // times (due to network delays), 100 seems big enough to accommodate for "bursts", // assuming we can service requests relatively quickly, which would need to be measured // as well. Protocol::ChunkFetchingV1 => 100, diff --git a/polkadot/node/network/protocol/src/request_response/outgoing.rs b/polkadot/node/network/protocol/src/request_response/outgoing.rs index 88439ad40367d7303b63a7fa97ebfb6fd9bb89e4..96ef4a6ab25dcc13949e6b3dfbc0e8c6856393f5 100644 --- a/polkadot/node/network/protocol/src/request_response/outgoing.rs +++ b/polkadot/node/network/protocol/src/request_response/outgoing.rs @@ -20,7 +20,7 @@ use network::ProtocolName; use parity_scale_codec::{Decode, Encode, Error as DecodingError}; use sc_network as network; -use sc_network::PeerId; +use sc_network_types::PeerId; use polkadot_primitives::AuthorityDiscoveryId; diff --git a/polkadot/node/network/protocol/src/request_response/v1.rs b/polkadot/node/network/protocol/src/request_response/v1.rs index 0832593a6a3d938cc4349c57972b850023ae02f6..60eecb69f738912ddb0240c890e2283db7f91a72 100644 --- a/polkadot/node/network/protocol/src/request_response/v1.rs +++ b/polkadot/node/network/protocol/src/request_response/v1.rs @@ -22,7 +22,8 @@ use polkadot_node_primitives::{ AvailableData, DisputeMessage, ErasureChunk, PoV, Proof, UncheckedDisputeMessage, }; use polkadot_primitives::{ - CandidateHash, CandidateReceipt, CommittedCandidateReceipt, Hash, Id as ParaId, ValidatorIndex, + CandidateHash, CandidateReceipt, CommittedCandidateReceipt, Hash, HeadData, Id as ParaId, + ValidatorIndex, }; use super::{IsRequest, Protocol}; @@ -103,6 +104,18 @@ pub enum CollationFetchingResponse { /// Deliver requested collation. #[codec(index = 0)] Collation(CandidateReceipt, PoV), + + /// Deliver requested collation along with parent head data. + #[codec(index = 1)] + CollationWithParentHeadData { + /// The receipt of the candidate. + receipt: CandidateReceipt, + /// Candidate's proof of validity. + pov: PoV, + /// The head data of the candidate's parent. + /// This is needed for elastic scaling to work. + parent_head_data: HeadData, + }, } impl IsRequest for CollationFetchingRequest { @@ -170,7 +183,7 @@ impl IsRequest for AvailableDataFetchingRequest { pub struct StatementFetchingRequest { /// Data needed to locate and identify the needed statement. pub relay_parent: Hash, - /// Hash of candidate that was used create the `CommitedCandidateRecept`. + /// Hash of candidate that was used create the `CommittedCandidateReceipt`. pub candidate_hash: CandidateHash, } diff --git a/polkadot/node/network/statement-distribution/Cargo.toml b/polkadot/node/network/statement-distribution/Cargo.toml index b07d84390dcdd1e5413889c4749f187ce1ddf1ea..d8ae031cbf36dabf2899e61574958ffdbde62921 100644 --- a/polkadot/node/network/statement-distribution/Cargo.toml +++ b/polkadot/node/network/statement-distribution/Cargo.toml @@ -10,7 +10,7 @@ license.workspace = true workspace = true [dependencies] -futures = "0.3.21" +futures = "0.3.30" futures-timer = "3.0.2" gum = { package = "tracing-gum", path = "../../gum" } polkadot-primitives = { path = "../../../primitives" } @@ -23,7 +23,7 @@ polkadot-node-network-protocol = { path = "../protocol" } arrayvec = "0.7.4" indexmap = "2.0.0" parity-scale-codec = { version = "3.6.1", default-features = false, features = ["derive"] } -thiserror = "1.0.48" +thiserror = { workspace = true } fatality = "0.0.6" bitvec = "1" diff --git a/polkadot/node/network/statement-distribution/src/error.rs b/polkadot/node/network/statement-distribution/src/error.rs index a712ab6da436f813d956df38c1cd0da9f02de3be..d7f52162fe2370481d7dd76717ea0f977be98a24 100644 --- a/polkadot/node/network/statement-distribution/src/error.rs +++ b/polkadot/node/network/statement-distribution/src/error.rs @@ -81,6 +81,9 @@ pub enum Error { #[error("Fetching validator groups failed {0:?}")] FetchValidatorGroups(RuntimeApiError), + #[error("Fetching claim queue failed {0:?}")] + FetchClaimQueue(runtime::Error), + #[error("Attempted to share statement when not a validator or not assigned")] InvalidShare, diff --git a/polkadot/node/network/statement-distribution/src/legacy_v1/responder.rs b/polkadot/node/network/statement-distribution/src/legacy_v1/responder.rs index 81e226c4ff8950d8edc9b18d8a3ddef0e0b76d93..8d1683759a0360871b149926b73b8a77ad5bec6a 100644 --- a/polkadot/node/network/statement-distribution/src/legacy_v1/responder.rs +++ b/polkadot/node/network/statement-distribution/src/legacy_v1/responder.rs @@ -64,7 +64,7 @@ pub async fn respond( // late, as each requester having the data will help distributing it. // 2. If we take too long, the requests timing out will not yet have had any data sent, thus // we wasted no bandwidth. - // 3. If the queue is full, requestes will get an immediate error instead of running in a + // 3. If the queue is full, requests will get an immediate error instead of running in a // timeout, thus requesters can immediately try another peer and be faster. // // From this perspective we would not want parallel response sending at all, but we don't diff --git a/polkadot/node/network/statement-distribution/src/legacy_v1/tests.rs b/polkadot/node/network/statement-distribution/src/legacy_v1/tests.rs index 2766ec9815af1e87051603c1b45304c4758cf9f9..0dea5ad0996e787553bfb597d455460208cc5e21 100644 --- a/polkadot/node/network/statement-distribution/src/legacy_v1/tests.rs +++ b/polkadot/node/network/statement-distribution/src/legacy_v1/tests.rs @@ -43,7 +43,7 @@ use polkadot_node_subsystem::{ }; use polkadot_node_subsystem_test_helpers::mock::{make_ferdie_keystore, new_leaf}; use polkadot_primitives::{ - vstaging::NodeFeatures, ExecutorParams, GroupIndex, Hash, HeadData, Id as ParaId, IndexedVec, + Block, ExecutorParams, GroupIndex, Hash, HeadData, Id as ParaId, IndexedVec, NodeFeatures, SessionInfo, ValidationCode, }; use polkadot_primitives_test_helpers::{ @@ -768,8 +768,14 @@ fn receiving_from_one_sends_to_another_and_to_candidate_backing() { let (ctx, mut handle) = polkadot_node_subsystem_test_helpers::make_subsystem_context(pool); let req_protocol_names = ReqProtocolNames::new(&GENESIS_HASH, None); - let (statement_req_receiver, _) = IncomingRequest::get_config_receiver(&req_protocol_names); - let (candidate_req_receiver, _) = IncomingRequest::get_config_receiver(&req_protocol_names); + let (statement_req_receiver, _) = IncomingRequest::get_config_receiver::< + Block, + sc_network::NetworkWorker, + >(&req_protocol_names); + let (candidate_req_receiver, _) = IncomingRequest::get_config_receiver::< + Block, + sc_network::NetworkWorker, + >(&req_protocol_names); let bg = async move { let s = StatementDistributionSubsystem { @@ -1016,9 +1022,14 @@ fn receiving_large_statement_from_one_sends_to_another_and_to_candidate_backing( let (ctx, mut handle) = polkadot_node_subsystem_test_helpers::make_subsystem_context(pool); let req_protocol_names = ReqProtocolNames::new(&GENESIS_HASH, None); - let (statement_req_receiver, mut req_cfg) = - IncomingRequest::get_config_receiver(&req_protocol_names); - let (candidate_req_receiver, _) = IncomingRequest::get_config_receiver(&req_protocol_names); + let (statement_req_receiver, mut req_cfg) = IncomingRequest::get_config_receiver::< + Block, + sc_network::NetworkWorker, + >(&req_protocol_names); + let (candidate_req_receiver, _) = IncomingRequest::get_config_receiver::< + Block, + sc_network::NetworkWorker, + >(&req_protocol_names); let bg = async move { let s = StatementDistributionSubsystem { @@ -1494,7 +1505,7 @@ fn receiving_large_statement_from_one_sends_to_another_and_to_candidate_backing( Err(()) => {} ); - // And now the succeding request from peer_b: + // And now the succeeding request from peer_b: let (pending_response, response_rx) = oneshot::channel(); let inner_req = StatementFetchingRequest { relay_parent: metadata.relay_parent, @@ -1554,8 +1565,14 @@ fn delay_reputation_changes() { let (ctx, mut handle) = polkadot_node_subsystem_test_helpers::make_subsystem_context(pool); let req_protocol_names = ReqProtocolNames::new(&GENESIS_HASH, None); - let (statement_req_receiver, _) = IncomingRequest::get_config_receiver(&req_protocol_names); - let (candidate_req_receiver, _) = IncomingRequest::get_config_receiver(&req_protocol_names); + let (statement_req_receiver, _) = IncomingRequest::get_config_receiver::< + Block, + sc_network::NetworkWorker, + >(&req_protocol_names); + let (candidate_req_receiver, _) = IncomingRequest::get_config_receiver::< + Block, + sc_network::NetworkWorker, + >(&req_protocol_names); let reputation_interval = Duration::from_millis(100); @@ -2044,9 +2061,14 @@ fn share_prioritizes_backing_group() { let (ctx, mut handle) = polkadot_node_subsystem_test_helpers::make_subsystem_context(pool); let req_protocol_names = ReqProtocolNames::new(&GENESIS_HASH, None); - let (statement_req_receiver, mut req_cfg) = - IncomingRequest::get_config_receiver(&req_protocol_names); - let (candidate_req_receiver, _) = IncomingRequest::get_config_receiver(&req_protocol_names); + let (statement_req_receiver, mut req_cfg) = IncomingRequest::get_config_receiver::< + Block, + sc_network::NetworkWorker, + >(&req_protocol_names); + let (candidate_req_receiver, _) = IncomingRequest::get_config_receiver::< + Block, + sc_network::NetworkWorker, + >(&req_protocol_names); let bg = async move { let s = StatementDistributionSubsystem { @@ -2377,8 +2399,14 @@ fn peer_cant_flood_with_large_statements() { let (ctx, mut handle) = polkadot_node_subsystem_test_helpers::make_subsystem_context(pool); let req_protocol_names = ReqProtocolNames::new(&GENESIS_HASH, None); - let (statement_req_receiver, _) = IncomingRequest::get_config_receiver(&req_protocol_names); - let (candidate_req_receiver, _) = IncomingRequest::get_config_receiver(&req_protocol_names); + let (statement_req_receiver, _) = IncomingRequest::get_config_receiver::< + Block, + sc_network::NetworkWorker, + >(&req_protocol_names); + let (candidate_req_receiver, _) = IncomingRequest::get_config_receiver::< + Block, + sc_network::NetworkWorker, + >(&req_protocol_names); let bg = async move { let s = StatementDistributionSubsystem { keystore: make_ferdie_keystore(), @@ -2610,8 +2638,14 @@ fn handle_multiple_seconded_statements() { let (ctx, mut handle) = polkadot_node_subsystem_test_helpers::make_subsystem_context(pool); let req_protocol_names = ReqProtocolNames::new(&GENESIS_HASH, None); - let (statement_req_receiver, _) = IncomingRequest::get_config_receiver(&req_protocol_names); - let (candidate_req_receiver, _) = IncomingRequest::get_config_receiver(&req_protocol_names); + let (statement_req_receiver, _) = IncomingRequest::get_config_receiver::< + Block, + sc_network::NetworkWorker, + >(&req_protocol_names); + let (candidate_req_receiver, _) = IncomingRequest::get_config_receiver::< + Block, + sc_network::NetworkWorker, + >(&req_protocol_names); let virtual_overseer_fut = async move { let s = StatementDistributionSubsystem { diff --git a/polkadot/node/network/statement-distribution/src/v2/cluster.rs b/polkadot/node/network/statement-distribution/src/v2/cluster.rs index 619114de9670c8aef50ce129b6c26bf6ff206f70..c3f45314b2464e1125a797686c51827e022b0403 100644 --- a/polkadot/node/network/statement-distribution/src/v2/cluster.rs +++ b/polkadot/node/network/statement-distribution/src/v2/cluster.rs @@ -55,8 +55,9 @@ //! and to keep track of what we have sent to other validators in the group and what we may //! continue to send them. -use polkadot_primitives::{CandidateHash, CompactStatement, ValidatorIndex}; +use polkadot_primitives::{CandidateHash, CompactStatement, Hash, ValidatorIndex}; +use crate::LOG_TARGET; use std::collections::{HashMap, HashSet}; #[derive(Hash, PartialEq, Eq)] @@ -424,6 +425,28 @@ impl ClusterTracker { fn is_in_group(&self, validator: ValidatorIndex) -> bool { self.validators.contains(&validator) } + + /// Dumps pending statement for this cluster. + /// + /// Normally we should not have pending statements to validators in our cluster, + /// but if we do for all validators in our cluster, then we don't participate + /// in backing. Occasional pending statements are expected if two authorities + /// can't detect each other or after restart, where it takes a while to discover + /// the whole network. + + pub fn warn_if_too_many_pending_statements(&self, parent_hash: Hash) { + if self.pending.iter().filter(|pending| !pending.1.is_empty()).count() >= + self.validators.len() + { + gum::warn!( + target: LOG_TARGET, + pending_statements = ?self.pending, + ?parent_hash, + "Cluster has too many pending statements, something wrong with our connection to our group peers + Restart might be needed if validator gets 0 backing rewards for more than 3-4 consecutive sessions" + ); + } + } } /// Incoming statement was accepted. diff --git a/polkadot/node/network/statement-distribution/src/v2/grid.rs b/polkadot/node/network/statement-distribution/src/v2/grid.rs index 19f23053192c12a7e3bcb3ae73dbbd972e1c619d..24d846c840e00c49446a0525b3768353f56ae524 100644 --- a/polkadot/node/network/statement-distribution/src/v2/grid.rs +++ b/polkadot/node/network/statement-distribution/src/v2/grid.rs @@ -527,12 +527,16 @@ impl GridTracker { } /// Determine the validators which can send a statement to us by direct broadcast. + /// + /// Returns a list of tuples representing each potential sender(ValidatorIndex) + /// and if the sender should already know about the statement, because we just + /// sent it to it. pub fn direct_statement_providers( &self, groups: &Groups, originator: ValidatorIndex, statement: &CompactStatement, - ) -> Vec { + ) -> Vec<(ValidatorIndex, bool)> { let (g, c_h, kind, in_group) = match extract_statement_and_group_info(groups, originator, statement) { None => return Vec::new(), @@ -616,12 +620,13 @@ impl GridTracker { originator: ValidatorIndex, counterparty: ValidatorIndex, statement: &CompactStatement, + received: bool, ) { if let Some((_, c_h, kind, in_group)) = extract_statement_and_group_info(groups, originator, statement) { if let Some(known) = self.confirmed_backed.get_mut(&c_h) { - known.sent_or_received_direct_statement(counterparty, in_group, kind); + known.sent_or_received_direct_statement(counterparty, in_group, kind, received); if let Some(pending) = self.pending_statements.get_mut(&counterparty) { pending.remove(&(originator, statement.clone())); @@ -908,6 +913,12 @@ struct MutualKnowledge { /// `Some` only if we have advertised, acknowledged, or requested the candidate /// from them. local_knowledge: Option, + /// Knowledge peer circulated to us, this is different from `local_knowledge` and + /// `remote_knowledge`, through the fact that includes only statements that we received from + /// peer while the other two, after manifest exchange part will include both what we sent to + /// the peer and what we received from peer, see `sent_or_received_direct_statement` for more + /// details. + received_knowledge: Option, } // A utility struct for keeping track of metadata about candidates @@ -933,10 +944,13 @@ impl KnownBackedCandidate { } fn manifest_sent_to(&mut self, validator: ValidatorIndex, local_knowledge: StatementFilter) { - let k = self - .mutual_knowledge - .entry(validator) - .or_insert_with(|| MutualKnowledge { remote_knowledge: None, local_knowledge: None }); + let k = self.mutual_knowledge.entry(validator).or_insert_with(|| MutualKnowledge { + remote_knowledge: None, + local_knowledge: None, + received_knowledge: None, + }); + k.received_knowledge = + Some(StatementFilter::blank(local_knowledge.seconded_in_group.len())); k.local_knowledge = Some(local_knowledge); } @@ -946,20 +960,24 @@ impl KnownBackedCandidate { validator: ValidatorIndex, remote_knowledge: StatementFilter, ) { - let k = self - .mutual_knowledge - .entry(validator) - .or_insert_with(|| MutualKnowledge { remote_knowledge: None, local_knowledge: None }); + let k = self.mutual_knowledge.entry(validator).or_insert_with(|| MutualKnowledge { + remote_knowledge: None, + local_knowledge: None, + received_knowledge: None, + }); k.remote_knowledge = Some(remote_knowledge); } + /// Returns a list of tuples representing each potential sender(ValidatorIndex) + /// and if the sender should already know about the statement, because we just + /// sent it to it. fn direct_statement_senders( &self, group_index: GroupIndex, originator_index_in_group: usize, statement_kind: StatementKind, - ) -> Vec { + ) -> Vec<(ValidatorIndex, bool)> { if group_index != self.group_index { return Vec::new() } @@ -968,11 +986,18 @@ impl KnownBackedCandidate { .iter() .filter(|(_, k)| k.remote_knowledge.is_some()) .filter(|(_, k)| { - k.local_knowledge + k.received_knowledge .as_ref() .map_or(false, |r| !r.contains(originator_index_in_group, statement_kind)) }) - .map(|(v, _)| *v) + .map(|(v, k)| { + ( + *v, + k.local_knowledge + .as_ref() + .map_or(false, |r| r.contains(originator_index_in_group, statement_kind)), + ) + }) .collect() } @@ -1014,12 +1039,19 @@ impl KnownBackedCandidate { validator: ValidatorIndex, statement_index_in_group: usize, statement_kind: StatementKind, + received: bool, ) { if let Some(k) = self.mutual_knowledge.get_mut(&validator) { if let (Some(r), Some(l)) = (k.remote_knowledge.as_mut(), k.local_knowledge.as_mut()) { r.set(statement_index_in_group, statement_kind); l.set(statement_index_in_group, statement_kind); } + + if received { + k.received_knowledge + .as_mut() + .map(|knowledge| knowledge.set(statement_index_in_group, statement_kind)); + } } } @@ -2238,6 +2270,7 @@ mod tests { validator_index, counterparty, &statement, + false, ); // There should be no pending statements now (for the counterparty). diff --git a/polkadot/node/network/statement-distribution/src/v2/mod.rs b/polkadot/node/network/statement-distribution/src/v2/mod.rs index 52852657870db30c6851c563e1c9516b156c192e..68caa5f0e70099d1cdb192cde4307edaa56660f0 100644 --- a/polkadot/node/network/statement-distribution/src/v2/mod.rs +++ b/polkadot/node/network/statement-distribution/src/v2/mod.rs @@ -46,6 +46,7 @@ use polkadot_node_subsystem_util::{ backing_implicit_view::View as ImplicitView, reputation::ReputationAggregator, runtime::{request_min_backing_votes, ProspectiveParachainsMode}, + vstaging::{fetch_claim_queue, ClaimQueueSnapshot}, }; use polkadot_primitives::{ AuthorityDiscoveryId, CandidateHash, CompactStatement, CoreIndex, CoreState, GroupIndex, @@ -93,14 +94,26 @@ mod statement_store; #[cfg(test)] mod tests; -const COST_UNEXPECTED_STATEMENT: Rep = Rep::CostMinor("Unexpected Statement"); +const COST_UNEXPECTED_STATEMENT_NOT_VALIDATOR: Rep = + Rep::CostMinor("Unexpected Statement, not a validator"); +const COST_UNEXPECTED_STATEMENT_VALIDATOR_NOT_FOUND: Rep = + Rep::CostMinor("Unexpected Statement, validator not found"); +const COST_UNEXPECTED_STATEMENT_INVALID_SENDER: Rep = + Rep::CostMinor("Unexpected Statement, invalid sender"); +const COST_UNEXPECTED_STATEMENT_BAD_ADVERTISE: Rep = + Rep::CostMinor("Unexpected Statement, bad advertise"); +const COST_UNEXPECTED_STATEMENT_CLUSTER_REJECTED: Rep = + Rep::CostMinor("Unexpected Statement, cluster rejected"); +const COST_UNEXPECTED_STATEMENT_NOT_IN_GROUP: Rep = + Rep::CostMinor("Unexpected Statement, not in group"); + const COST_UNEXPECTED_STATEMENT_MISSING_KNOWLEDGE: Rep = Rep::CostMinor("Unexpected Statement, missing knowledge for relay parent"); const COST_EXCESSIVE_SECONDED: Rep = Rep::CostMinor("Sent Excessive `Seconded` Statements"); const COST_DISABLED_VALIDATOR: Rep = Rep::CostMinor("Sent a statement from a disabled validator"); const COST_UNEXPECTED_MANIFEST_MISSING_KNOWLEDGE: Rep = - Rep::CostMinor("Unexpected Manifest, missing knowlege for relay parent"); + Rep::CostMinor("Unexpected Manifest, missing knowledge for relay parent"); const COST_UNEXPECTED_MANIFEST_DISALLOWED: Rep = Rep::CostMinor("Unexpected Manifest, Peer Disallowed"); const COST_UNEXPECTED_MANIFEST_PEER_UNKNOWN: Rep = @@ -137,10 +150,9 @@ pub(crate) const REQUEST_RETRY_DELAY: Duration = Duration::from_secs(1); struct PerRelayParentState { local_validator: Option, statement_store: StatementStore, - availability_cores: Vec, - group_rotation_info: GroupRotationInfo, seconding_limit: usize, session: SessionIndex, + groups_per_para: HashMap>, } impl PerRelayParentState { @@ -239,6 +251,13 @@ impl PerSessionState { if local_index.is_some() { self.local_validator.get_or_insert(LocalValidatorIndex::Inactive); } + + gum::info!( + target: LOG_TARGET, + index_in_gossip_topology = ?local_index, + index_in_parachain_authorities = ?self.local_validator, + "Node uses the following topology indices" + ); } /// Returns `true` if local is neither active or inactive validator node. @@ -544,11 +563,13 @@ pub(crate) async fn handle_active_leaves_update( activated: &ActivatedLeaf, leaf_mode: ProspectiveParachainsMode, ) -> JfyiErrorResult<()> { - let seconding_limit = match leaf_mode { + let max_candidate_depth = match leaf_mode { ProspectiveParachainsMode::Disabled => return Ok(()), - ProspectiveParachainsMode::Enabled { max_candidate_depth, .. } => max_candidate_depth + 1, + ProspectiveParachainsMode::Enabled { max_candidate_depth, .. } => max_candidate_depth, }; + let seconding_limit = max_candidate_depth + 1; + state .implicit_view .activate_leaf(ctx.sender(), activated.hash) @@ -609,8 +630,8 @@ pub(crate) async fn handle_active_leaves_update( request_min_backing_votes(new_relay_parent, session_index, ctx.sender()).await?; let mut per_session_state = PerSessionState::new(session_info, &state.keystore, minimum_backing_votes); - if let Some(toplogy) = state.unused_topologies.remove(&session_index) { - per_session_state.supply_topology(&toplogy.topology, toplogy.local_index); + if let Some(topology) = state.unused_topologies.remove(&session_index) { + per_session_state.supply_topology(&topology.topology, topology.local_index); } state.per_session.insert(session_index, per_session_state); } @@ -660,6 +681,13 @@ pub(crate) async fn handle_active_leaves_update( .map_err(JfyiError::FetchValidatorGroups)? .1; + let maybe_claim_queue = fetch_claim_queue(ctx.sender(), new_relay_parent) + .await + .unwrap_or_else(|err| { + gum::debug!(target: LOG_TARGET, ?new_relay_parent, ?err, "handle_active_leaves_update: `claim_queue` API not available"); + None + }); + let local_validator = per_session.local_validator.and_then(|v| { if let LocalValidatorIndex::Active(idx) = v { find_active_validator_state( @@ -667,22 +695,31 @@ pub(crate) async fn handle_active_leaves_update( &per_session.groups, &availability_cores, &group_rotation_info, + &maybe_claim_queue, seconding_limit, + max_candidate_depth, ) } else { Some(LocalValidatorState { grid_tracker: GridTracker::default(), active: None }) } }); + let groups_per_para = determine_groups_per_para( + availability_cores, + group_rotation_info, + &maybe_claim_queue, + max_candidate_depth, + ) + .await; + state.per_relay_parent.insert( new_relay_parent, PerRelayParentState { local_validator, statement_store: StatementStore::new(&per_session.groups), - availability_cores, - group_rotation_info, seconding_limit, session: session_index, + groups_per_para, }, ); } @@ -723,7 +760,9 @@ fn find_active_validator_state( groups: &Groups, availability_cores: &[CoreState], group_rotation_info: &GroupRotationInfo, + maybe_claim_queue: &Option, seconding_limit: usize, + max_candidate_depth: usize, ) -> Option { if groups.all().is_empty() { return None @@ -731,18 +770,28 @@ fn find_active_validator_state( let our_group = groups.by_validator_index(validator_index)?; - // note: this won't work well for on-demand parachains because it only works - // when core assignments to paras are static throughout the session. - - let core = group_rotation_info.core_for_group(our_group, availability_cores.len()); - let para = availability_cores.get(core.0 as usize).and_then(|c| c.para_id()); + let core_index = group_rotation_info.core_for_group(our_group, availability_cores.len()); + let para_assigned_to_core = if let Some(claim_queue) = maybe_claim_queue { + claim_queue.get_claim_for(core_index, 0) + } else { + availability_cores + .get(core_index.0 as usize) + .and_then(|core_state| match core_state { + CoreState::Scheduled(scheduled_core) => Some(scheduled_core.para_id), + CoreState::Occupied(occupied_core) if max_candidate_depth >= 1 => occupied_core + .next_up_on_available + .as_ref() + .map(|scheduled_core| scheduled_core.para_id), + CoreState::Free | CoreState::Occupied(_) => None, + }) + }; let group_validators = groups.get(our_group)?.to_owned(); Some(LocalValidatorState { active: Some(ActiveValidatorState { index: validator_index, group: our_group, - assignment: para, + assignment: para_assigned_to_core, cluster_tracker: ClusterTracker::new(group_validators, seconding_limit) .expect("group is non-empty because we are in it; qed"), }), @@ -756,7 +805,15 @@ pub(crate) fn handle_deactivate_leaves(state: &mut State, leaves: &[Hash]) { let pruned = state.implicit_view.deactivate_leaf(*leaf); for pruned_rp in pruned { // clean up per-relay-parent data based on everything removed. - state.per_relay_parent.remove(&pruned_rp); + state + .per_relay_parent + .remove(&pruned_rp) + .as_ref() + .and_then(|pruned| pruned.active_validator_state()) + .map(|active_state| { + active_state.cluster_tracker.warn_if_too_many_pending_statements(pruned_rp) + }); + // clean up requests related to this relay parent. state.request_manager.remove_by_relay_parent(*leaf); } @@ -1086,6 +1143,7 @@ async fn send_pending_grid_messages( originator, peer_validator_id, &compact, + false, ); } @@ -1378,6 +1436,7 @@ async fn circulate_statement( originator, target, &compact_statement, + false, ); }, } @@ -1515,7 +1574,13 @@ async fn handle_incoming_statement( // we shouldn't be receiving statements unless we're a validator // this session. if per_session.is_not_validator() { - modify_reputation(reputation, ctx.sender(), peer, COST_UNEXPECTED_STATEMENT).await; + modify_reputation( + reputation, + ctx.sender(), + peer, + COST_UNEXPECTED_STATEMENT_NOT_VALIDATOR, + ) + .await; } return }, @@ -1526,7 +1591,13 @@ async fn handle_incoming_statement( match per_session.groups.by_validator_index(statement.unchecked_validator_index()) { Some(g) => g, None => { - modify_reputation(reputation, ctx.sender(), peer, COST_UNEXPECTED_STATEMENT).await; + modify_reputation( + reputation, + ctx.sender(), + peer, + COST_UNEXPECTED_STATEMENT_VALIDATOR_NOT_FOUND, + ) + .await; return }, }; @@ -1565,38 +1636,45 @@ async fn handle_incoming_statement( (active, idx) }; - let checked_statement = - if let Some((active, cluster_sender_index)) = active.zip(cluster_sender_index) { - match handle_cluster_statement( - relay_parent, - &mut active.cluster_tracker, - per_relay_parent.session, - &per_session.session_info, - statement, - cluster_sender_index, - ) { - Ok(Some(s)) => s, - Ok(None) => return, - Err(rep) => { - modify_reputation(reputation, ctx.sender(), peer, rep).await; - return - }, - } - } else { - let grid_sender_index = local_validator - .grid_tracker - .direct_statement_providers( - &per_session.groups, - statement.unchecked_validator_index(), - statement.unchecked_payload(), - ) - .into_iter() - .filter_map(|i| session_info.discovery_keys.get(i.0 as usize).map(|ad| (i, ad))) - .filter(|(_, ad)| peer_state.is_authority(ad)) - .map(|(i, _)| i) - .next(); + let checked_statement = if let Some((active, cluster_sender_index)) = + active.zip(cluster_sender_index) + { + match handle_cluster_statement( + relay_parent, + &mut active.cluster_tracker, + per_relay_parent.session, + &per_session.session_info, + statement, + cluster_sender_index, + ) { + Ok(Some(s)) => s, + Ok(None) => return, + Err(rep) => { + modify_reputation(reputation, ctx.sender(), peer, rep).await; + return + }, + } + } else { + let grid_sender_index = local_validator + .grid_tracker + .direct_statement_providers( + &per_session.groups, + statement.unchecked_validator_index(), + statement.unchecked_payload(), + ) + .into_iter() + .filter_map(|(i, validator_knows_statement)| { + session_info + .discovery_keys + .get(i.0 as usize) + .map(|ad| (i, ad, validator_knows_statement)) + }) + .filter(|(_, ad, _)| peer_state.is_authority(ad)) + .map(|(i, _, validator_knows_statement)| (i, validator_knows_statement)) + .next(); - if let Some(grid_sender_index) = grid_sender_index { + if let Some((grid_sender_index, validator_knows_statement)) = grid_sender_index { + if !validator_knows_statement { match handle_grid_statement( relay_parent, &mut local_validator.grid_tracker, @@ -1612,11 +1690,22 @@ async fn handle_incoming_statement( }, } } else { - // Not a cluster or grid peer. - modify_reputation(reputation, ctx.sender(), peer, COST_UNEXPECTED_STATEMENT).await; - return + // Reward the peer for sending us the statement + modify_reputation(reputation, ctx.sender(), peer, BENEFIT_VALID_STATEMENT).await; + return; } - }; + } else { + // Not a cluster or grid peer. + modify_reputation( + reputation, + ctx.sender(), + peer, + COST_UNEXPECTED_STATEMENT_INVALID_SENDER, + ) + .await; + return + } + }; let statement = checked_statement.payload().clone(); let originator_index = checked_statement.validator_index(); @@ -1635,7 +1724,13 @@ async fn handle_incoming_statement( ); if let Err(BadAdvertisement) = res { - modify_reputation(reputation, ctx.sender(), peer, COST_UNEXPECTED_STATEMENT).await; + modify_reputation( + reputation, + ctx.sender(), + peer, + COST_UNEXPECTED_STATEMENT_BAD_ADVERTISE, + ) + .await; return } } @@ -1743,11 +1838,11 @@ fn handle_cluster_statement( Ok(ClusterAccept::WithPrejudice) => false, Err(ClusterRejectIncoming::ExcessiveSeconded) => return Err(COST_EXCESSIVE_SECONDED), Err(ClusterRejectIncoming::CandidateUnknown | ClusterRejectIncoming::Duplicate) => - return Err(COST_UNEXPECTED_STATEMENT), + return Err(COST_UNEXPECTED_STATEMENT_CLUSTER_REJECTED), Err(ClusterRejectIncoming::NotInGroup) => { // sanity: shouldn't be possible; we already filtered this // out above. - return Err(COST_UNEXPECTED_STATEMENT) + return Err(COST_UNEXPECTED_STATEMENT_NOT_IN_GROUP) }, } }; @@ -1798,6 +1893,7 @@ fn handle_grid_statement( checked_statement.validator_index(), grid_sender_index, &checked_statement.payload(), + true, ); Ok(checked_statement) @@ -2060,17 +2156,51 @@ async fn provide_candidate_to_grid( } } -fn group_for_para( - availability_cores: &[CoreState], - group_rotation_info: &GroupRotationInfo, - para_id: ParaId, -) -> Option { - // Note: this won't work well for on-demand parachains as it assumes that core assignments are - // fixed across blocks. - let core_index = availability_cores.iter().position(|c| c.para_id() == Some(para_id)); +// Utility function to populate per relay parent `ParaId` to `GroupIndex` mappings. +async fn determine_groups_per_para( + availability_cores: Vec, + group_rotation_info: GroupRotationInfo, + maybe_claim_queue: &Option, + max_candidate_depth: usize, +) -> HashMap> { + let n_cores = availability_cores.len(); + + // Determine the core indices occupied by each para at the current relay parent. To support + // on-demand parachains we also consider the core indices at next block if core has a candidate + // pending availability. + let para_core_indices: Vec<_> = if let Some(claim_queue) = maybe_claim_queue { + claim_queue + .iter_claims_at_depth(0) + .map(|(core_index, para)| (para, core_index)) + .collect() + } else { + availability_cores + .into_iter() + .enumerate() + .filter_map(|(index, core)| match core { + CoreState::Scheduled(scheduled_core) => + Some((scheduled_core.para_id, CoreIndex(index as u32))), + CoreState::Occupied(occupied_core) => + if max_candidate_depth >= 1 { + occupied_core + .next_up_on_available + .map(|scheduled_core| (scheduled_core.para_id, CoreIndex(index as u32))) + } else { + None + }, + CoreState::Free => None, + }) + .collect() + }; + + let mut groups_per_para = HashMap::new(); + // Map from `CoreIndex` to `GroupIndex` and collect as `HashMap`. + for (para, core_index) in para_core_indices { + let group_index = group_rotation_info.group_for_core(core_index, n_cores); + groups_per_para.entry(para).or_insert_with(Vec::new).push(group_index) + } - core_index - .map(|c| group_rotation_info.group_for_core(CoreIndex(c as _), availability_cores.len())) + groups_per_para } #[overseer::contextbounds(StatementDistribution, prefix=self::overseer)] @@ -2126,18 +2256,23 @@ async fn fragment_tree_update_inner( let confirmed_candidate = state.candidates.get_confirmed(&candidate_hash); let prs = state.per_relay_parent.get_mut(&receipt.descriptor().relay_parent); if let (Some(confirmed), Some(prs)) = (confirmed_candidate, prs) { - let group_index = group_for_para( - &prs.availability_cores, - &prs.group_rotation_info, - receipt.descriptor().para_id, - ); - let per_session = state.per_session.get(&prs.session); - if let (Some(per_session), Some(group_index)) = (per_session, group_index) { + let group_index = confirmed.group_index(); + + // Sanity check if group_index is valid for this para at relay parent. + let Some(expected_groups) = prs.groups_per_para.get(&receipt.descriptor().para_id) + else { + continue + }; + if !expected_groups.iter().any(|g| *g == group_index) { + continue + } + + if let Some(per_session) = per_session { send_backing_fresh_statements( ctx, candidate_hash, - group_index, + confirmed.group_index(), &receipt.descriptor().relay_parent, prs, confirmed, @@ -2245,13 +2380,12 @@ async fn handle_incoming_manifest_common<'a, Context>( Some(x) => x, }; - let expected_group = group_for_para( - &relay_parent_state.availability_cores, - &relay_parent_state.group_rotation_info, - para_id, - ); + let Some(expected_groups) = relay_parent_state.groups_per_para.get(¶_id) else { + modify_reputation(reputation, ctx.sender(), peer, COST_MALFORMED_MANIFEST).await; + return None + }; - if expected_group != Some(manifest_summary.claimed_group_index) { + if !expected_groups.iter().any(|g| g == &manifest_summary.claimed_group_index) { modify_reputation(reputation, ctx.sender(), peer, COST_MALFORMED_MANIFEST).await; return None } @@ -2376,6 +2510,7 @@ fn post_acknowledgement_statement_messages( statement.validator_index(), recipient, statement.payload(), + false, ); match peer.1.into() { ValidationVersion::V2 => messages.push(Versioned::V2( @@ -2970,13 +3105,11 @@ pub(crate) async fn handle_response( relay_parent_state.session, |v| per_session.session_info.validators.get(v).map(|x| x.clone()), |para, g_index| { - let expected_group = group_for_para( - &relay_parent_state.availability_cores, - &relay_parent_state.group_rotation_info, - para, - ); + let Some(expected_groups) = relay_parent_state.groups_per_para.get(¶) else { + return false + }; - Some(g_index) == expected_group + expected_groups.iter().any(|g| g == &g_index) }, disabled_mask, ); @@ -3255,6 +3388,7 @@ pub(crate) fn answer_request(state: &mut State, message: ResponderMessage) { statement.unchecked_validator_index(), validator_id, statement.unchecked_payload(), + false, ); } } diff --git a/polkadot/node/network/statement-distribution/src/v2/requests.rs b/polkadot/node/network/statement-distribution/src/v2/requests.rs index bed3d5c18ae2b1007a3ee585f00a54d1b98f7c27..fe270c8a58e81fc5ebee9a42c38a1cedd1a0b516 100644 --- a/polkadot/node/network/statement-distribution/src/v2/requests.rs +++ b/polkadot/node/network/statement-distribution/src/v2/requests.rs @@ -315,7 +315,16 @@ impl RequestManager { request_props: impl Fn(&CandidateIdentifier) -> Option, peer_advertised: impl Fn(&CandidateIdentifier, &PeerId) -> Option, ) -> Option> { - if response_manager.len() >= MAX_PARALLEL_ATTESTED_CANDIDATE_REQUESTS as usize { + // The number of parallel requests a node can answer is limited by + // `MAX_PARALLEL_ATTESTED_CANDIDATE_REQUESTS`, however there is no + // need for the current node to limit itself to the same amount the + // requests, because the requests are going to different nodes anyways. + // While looking at https://github.com/paritytech/polkadot-sdk/issues/3314, + // found out that this requests take around 100ms to fulfill, so it + // would make sense to try to request things as early as we can, given + // we would need to request it for each candidate, around 25 right now + // on kusama. + if response_manager.len() >= 2 * MAX_PARALLEL_ATTESTED_CANDIDATE_REQUESTS as usize { return None } @@ -1027,6 +1036,7 @@ mod tests { let peer_advertised = |_identifier: &CandidateIdentifier, _peer: &_| { Some(StatementFilter::full(group_size)) }; + let outgoing = request_manager .next_request(&mut response_manager, request_props, peer_advertised) .unwrap(); @@ -1148,6 +1158,7 @@ mod tests { { let request_props = |_identifier: &CandidateIdentifier| Some((&request_properties).clone()); + let outgoing = request_manager .next_request(&mut response_manager, request_props, peer_advertised) .unwrap(); @@ -1230,6 +1241,7 @@ mod tests { { let request_props = |_identifier: &CandidateIdentifier| Some((&request_properties).clone()); + let outgoing = request_manager .next_request(&mut response_manager, request_props, peer_advertised) .unwrap(); diff --git a/polkadot/node/network/statement-distribution/src/v2/statement_store.rs b/polkadot/node/network/statement-distribution/src/v2/statement_store.rs index 022461e55511cbaba8040064408cd5b47a276cfb..a3b2636d2ffcb6c761a3f9c2da89f88fecd9d981 100644 --- a/polkadot/node/network/statement-distribution/src/v2/statement_store.rs +++ b/polkadot/node/network/statement-distribution/src/v2/statement_store.rs @@ -292,7 +292,7 @@ impl GroupStatements { mod tests { use super::*; - use polkadot_primitives::v6::{Hash, SigningContext, ValidatorPair}; + use polkadot_primitives::v7::{Hash, SigningContext, ValidatorPair}; use sp_application_crypto::Pair as PairT; #[test] diff --git a/polkadot/node/network/statement-distribution/src/v2/tests/cluster.rs b/polkadot/node/network/statement-distribution/src/v2/tests/cluster.rs index 7ffed9d47d4bdeca1800f7d665970cd1882ea7b2..4fb033e08ce3af0724d5a8770bdb0abf942e38a5 100644 --- a/polkadot/node/network/statement-distribution/src/v2/tests/cluster.rs +++ b/polkadot/node/network/statement-distribution/src/v2/tests/cluster.rs @@ -170,7 +170,7 @@ fn cluster_valid_statement_before_seconded_ignored() { overseer.recv().await, AllMessages::NetworkBridgeTx(NetworkBridgeTxMessage::ReportPeer(ReportPeerMessage::Single(p, r))) => { assert_eq!(p, peer_a); - assert_eq!(r, COST_UNEXPECTED_STATEMENT.into()); + assert_eq!(r, COST_UNEXPECTED_STATEMENT_CLUSTER_REJECTED.into()); } ); @@ -305,7 +305,67 @@ fn useful_cluster_statement_from_non_cluster_peer_rejected() { assert_matches!( overseer.recv().await, AllMessages::NetworkBridgeTx(NetworkBridgeTxMessage::ReportPeer(ReportPeerMessage::Single(p, r))) - if p == peer_a && r == COST_UNEXPECTED_STATEMENT.into() => { } + if p == peer_a && r == COST_UNEXPECTED_STATEMENT_INVALID_SENDER.into() => { } + ); + + overseer + }); +} + +// Both validators in the test are part of backing groups assigned to same parachain +#[test] +fn elastic_scaling_useful_cluster_statement_from_non_cluster_peer_rejected() { + let config = TestConfig { + validator_count: 20, + group_size: 3, + local_validator: LocalRole::Validator, + async_backing_params: None, + }; + + let relay_parent = Hash::repeat_byte(1); + let peer_a = PeerId::random(); + + test_harness(config, |state, mut overseer| async move { + let candidate_hash = CandidateHash(Hash::repeat_byte(42)); + + let test_leaf = state.make_dummy_leaf_with_multiple_cores_per_para(relay_parent, 3); + + // Peer A is not in our group, but its group is assigned to same para as we are. + let not_our_group = GroupIndex(1); + + let that_group_validators = state.group_validators(not_our_group, false); + let v_non = that_group_validators[0]; + + connect_peer( + &mut overseer, + peer_a.clone(), + Some(vec![state.discovery_id(v_non)].into_iter().collect()), + ) + .await; + + send_peer_view_change(&mut overseer, peer_a.clone(), view![relay_parent]).await; + activate_leaf(&mut overseer, &test_leaf, &state, true, vec![]).await; + + let statement = state + .sign_statement( + v_non, + CompactStatement::Seconded(candidate_hash), + &SigningContext { parent_hash: relay_parent, session_index: 1 }, + ) + .as_unchecked() + .clone(); + + send_peer_message( + &mut overseer, + peer_a.clone(), + protocol_v2::StatementDistributionMessage::Statement(relay_parent, statement), + ) + .await; + + assert_matches!( + overseer.recv().await, + AllMessages::NetworkBridgeTx(NetworkBridgeTxMessage::ReportPeer(ReportPeerMessage::Single(p, r))) + if p == peer_a && r == COST_UNEXPECTED_STATEMENT_INVALID_SENDER.into() => { } ); overseer @@ -359,7 +419,7 @@ fn statement_from_non_cluster_originator_unexpected() { assert_matches!( overseer.recv().await, AllMessages::NetworkBridgeTx(NetworkBridgeTxMessage::ReportPeer(ReportPeerMessage::Single(p, r))) - if p == peer_a && r == COST_UNEXPECTED_STATEMENT.into() => { } + if p == peer_a && r == COST_UNEXPECTED_STATEMENT_INVALID_SENDER.into() => { } ); overseer diff --git a/polkadot/node/network/statement-distribution/src/v2/tests/grid.rs b/polkadot/node/network/statement-distribution/src/v2/tests/grid.rs index 38a12cf32e3b37cd111b4404b53015376e749192..9d00a92e742bb6a304004ed74eb59ea8b6c5440c 100644 --- a/polkadot/node/network/statement-distribution/src/v2/tests/grid.rs +++ b/polkadot/node/network/statement-distribution/src/v2/tests/grid.rs @@ -1829,9 +1829,7 @@ fn advertisement_not_re_sent_when_peer_re_enters_view() { }); } -// Grid statements imported to backing once candidate enters hypothetical frontier. -#[test] -fn grid_statements_imported_to_backing() { +fn inner_grid_statements_imported_to_backing(groups_for_first_para: usize) { let validator_count = 6; let group_size = 3; let config = TestConfig { @@ -1851,9 +1849,12 @@ fn grid_statements_imported_to_backing() { let local_group_index = local_validator.group_index.unwrap(); let other_group = next_group_index(local_group_index, validator_count, group_size); - let other_para = ParaId::from(other_group.0); - let test_leaf = state.make_dummy_leaf(relay_parent); + // Other para is same para for elastic scaling test (groups_for_first_para > 1) + let other_para = ParaId::from((groups_for_first_para == 1) as u32); + + let test_leaf = + state.make_dummy_leaf_with_multiple_cores_per_para(relay_parent, groups_for_first_para); let (candidate, pvd) = make_candidate( relay_parent, @@ -2018,6 +2019,18 @@ fn grid_statements_imported_to_backing() { overseer }); } +// Grid statements imported to backing once candidate enters hypothetical frontier. +#[test] +fn grid_statements_imported_to_backing() { + inner_grid_statements_imported_to_backing(1); +} + +// Grid statements imported to backing once candidate enters hypothetical frontier. +// All statements are for candidates of the same parachain but from different backing groups. +#[test] +fn elastic_scaling_grid_statements_imported_to_backing() { + inner_grid_statements_imported_to_backing(2); +} #[test] fn advertisements_rejected_from_incorrect_peers() { diff --git a/polkadot/node/network/statement-distribution/src/v2/tests/mod.rs b/polkadot/node/network/statement-distribution/src/v2/tests/mod.rs index 82986a0330ec25d35f3b75a94be67157283bbd9a..8dda7219cd1251ccd7869408c51e80ca01513c2b 100644 --- a/polkadot/node/network/statement-distribution/src/v2/tests/mod.rs +++ b/polkadot/node/network/statement-distribution/src/v2/tests/mod.rs @@ -33,7 +33,7 @@ use polkadot_node_subsystem::messages::{ use polkadot_node_subsystem_test_helpers as test_helpers; use polkadot_node_subsystem_util::TimeoutExt; use polkadot_primitives::{ - AssignmentPair, AsyncBackingParams, BlockNumber, CommittedCandidateReceipt, CoreState, + AssignmentPair, AsyncBackingParams, Block, BlockNumber, CommittedCandidateReceipt, CoreState, GroupRotationInfo, HeadData, Header, IndexedVec, PersistedValidationData, ScheduledCore, SessionIndex, SessionInfo, ValidatorPair, }; @@ -177,20 +177,39 @@ impl TestState { } fn make_dummy_leaf(&self, relay_parent: Hash) -> TestLeaf { + self.make_dummy_leaf_with_multiple_cores_per_para(relay_parent, 1) + } + + fn make_dummy_leaf_with_multiple_cores_per_para( + &self, + relay_parent: Hash, + groups_for_first_para: usize, + ) -> TestLeaf { TestLeaf { number: 1, hash: relay_parent, parent_hash: Hash::repeat_byte(0), session: 1, availability_cores: self.make_availability_cores(|i| { - CoreState::Scheduled(ScheduledCore { - para_id: ParaId::from(i as u32), - collator: None, - }) + let para_id = if i < groups_for_first_para { + ParaId::from(0u32) + } else { + ParaId::from(i as u32) + }; + + CoreState::Scheduled(ScheduledCore { para_id, collator: None }) }), disabled_validators: Default::default(), para_data: (0..self.session_info.validator_groups.len()) - .map(|i| (ParaId::from(i as u32), PerParaData::new(1, vec![1, 2, 3].into()))) + .map(|i| { + let para_id = if i < groups_for_first_para { + ParaId::from(0u32) + } else { + ParaId::from(i as u32) + }; + + (para_id, PerParaData::new(1, vec![1, 2, 3].into())) + }) .collect(), minimum_backing_votes: 2, } @@ -340,9 +359,14 @@ fn test_harness>( Arc::new(LocalKeystore::in_memory()) as KeystorePtr }; let req_protocol_names = ReqProtocolNames::new(&GENESIS_HASH, None); - let (statement_req_receiver, _) = IncomingRequest::get_config_receiver(&req_protocol_names); - let (candidate_req_receiver, req_cfg) = - IncomingRequest::get_config_receiver(&req_protocol_names); + let (statement_req_receiver, _) = IncomingRequest::get_config_receiver::< + Block, + sc_network::NetworkWorker, + >(&req_protocol_names); + let (candidate_req_receiver, req_cfg) = IncomingRequest::get_config_receiver::< + Block, + sc_network::NetworkWorker, + >(&req_protocol_names); let mut rng = rand_chacha::ChaCha8Rng::seed_from_u64(0); let test_state = TestState::from_config(config, req_cfg.inbound_queue.unwrap(), &mut rng); diff --git a/polkadot/node/overseer/Cargo.toml b/polkadot/node/overseer/Cargo.toml index f91ec80d944064f5cba28275766c0fbcc9231133..ef79cfe2f702bb2b32c7901448da5e1b073c0b72 100644 --- a/polkadot/node/overseer/Cargo.toml +++ b/polkadot/node/overseer/Cargo.toml @@ -12,7 +12,7 @@ workspace = true [dependencies] client = { package = "sc-client-api", path = "../../../substrate/client/api" } sp-api = { path = "../../../substrate/primitives/api" } -futures = "0.3.21" +futures = "0.3.30" futures-timer = "3.0.2" parking_lot = "0.12.1" polkadot-node-network-protocol = { path = "../network/protocol" } @@ -23,13 +23,13 @@ polkadot-primitives = { path = "../../primitives" } orchestra = { version = "0.3.5", default-features = false, features = ["futures_channel"] } gum = { package = "tracing-gum", path = "../gum" } sp-core = { path = "../../../substrate/primitives/core" } -async-trait = "0.1.74" +async-trait = "0.1.79" tikv-jemalloc-ctl = { version = "0.5.0", optional = true } [dev-dependencies] metered = { package = "prioritized-metered-channel", version = "0.6.1", default-features = false, features = ["futures_channel"] } sp-core = { path = "../../../substrate/primitives/core" } -futures = { version = "0.3.21", features = ["thread-pool"] } +futures = { version = "0.3.30", features = ["thread-pool"] } femme = "2.2.1" assert_matches = "1.4.0" test-helpers = { package = "polkadot-primitives-test-helpers", path = "../../primitives/test-helpers" } diff --git a/polkadot/node/overseer/src/lib.rs b/polkadot/node/overseer/src/lib.rs index e16a3fd27ab3d920da5c83b3c4ee02ab4ccba2cb..167b32a15bc4d1e6cdb150a3e1d0133e035fb617 100644 --- a/polkadot/node/overseer/src/lib.rs +++ b/polkadot/node/overseer/src/lib.rs @@ -871,7 +871,7 @@ where gum::trace!( target: LOG_TARGET, relay_parent = ?hash, - "Leaf got activated, notifying exterinal listeners" + "Leaf got activated, notifying external listeners" ); for listener in listeners { // it's fine if the listener is no longer interested diff --git a/polkadot/node/overseer/src/tests.rs b/polkadot/node/overseer/src/tests.rs index 0494274367d953146ad06e93c3ee00cfc9c3b983..55a6bdb74ba73c04bc66847a1b04ff6175608fa7 100644 --- a/polkadot/node/overseer/src/tests.rs +++ b/polkadot/node/overseer/src/tests.rs @@ -811,7 +811,7 @@ fn test_candidate_validation_msg() -> CandidateValidationMessage { fn test_candidate_backing_msg() -> CandidateBackingMessage { let (sender, _) = oneshot::channel(); - CandidateBackingMessage::GetBackedCandidates(Vec::new(), sender) + CandidateBackingMessage::GetBackedCandidates(Default::default(), sender) } fn test_chain_api_msg() -> ChainApiMessage { diff --git a/polkadot/node/primitives/Cargo.toml b/polkadot/node/primitives/Cargo.toml index 157594a5099261ca3ced1dedba965c7885b3b348..a4bbd824e6712e001f1df1cd9d66f835d02822fb 100644 --- a/polkadot/node/primitives/Cargo.toml +++ b/polkadot/node/primitives/Cargo.toml @@ -11,7 +11,7 @@ workspace = true [dependencies] bounded-vec = "0.7" -futures = "0.3.21" +futures = "0.3.30" polkadot-primitives = { path = "../../primitives" } parity-scale-codec = { version = "3.6.1", default-features = false, features = ["derive"] } sp-core = { path = "../../../substrate/primitives/core" } @@ -22,9 +22,9 @@ sp-maybe-compressed-blob = { path = "../../../substrate/primitives/maybe-compres sp-runtime = { path = "../../../substrate/primitives/runtime" } polkadot-parachain-primitives = { path = "../../parachain", default-features = false } schnorrkel = "0.11.4" -thiserror = "1.0.48" +thiserror = { workspace = true } bitvec = { version = "1.0.0", default-features = false, features = ["alloc"] } -serde = { version = "1.0.195", features = ["derive"] } +serde = { features = ["derive"], workspace = true, default-features = true } [target.'cfg(not(target_os = "unknown"))'.dependencies] zstd = { version = "0.12.4", default-features = false } diff --git a/polkadot/node/primitives/src/approval.rs b/polkadot/node/primitives/src/approval.rs index f2a79e025affe3de108f0ce8abd985e53c862a5c..b73cb4c717db7ff856669b528d5e065e413d6101 100644 --- a/polkadot/node/primitives/src/approval.rs +++ b/polkadot/node/primitives/src/approval.rs @@ -382,7 +382,7 @@ pub mod v2 { /// The core index chosen in this cert. core_index: CoreIndex, }, - /// Deprectated assignment. Soon to be removed. + /// Deprecated assignment. Soon to be removed. /// An assignment story based on the VRF that authorized the relay-chain block where the /// candidate was included combined with a sample number. /// diff --git a/polkadot/node/primitives/src/disputes/mod.rs b/polkadot/node/primitives/src/disputes/mod.rs index 768b95f65537b7ebfe5e4a8baadfd9eec685af4f..5814ecee44f4e9ee333f1898c92341799978d646 100644 --- a/polkadot/node/primitives/src/disputes/mod.rs +++ b/polkadot/node/primitives/src/disputes/mod.rs @@ -84,7 +84,7 @@ impl CandidateVotes { #[derive(Debug, Clone)] /// Valid candidate votes. /// -/// Prefere backing votes over other votes. +/// Prefer backing votes over other votes. pub struct ValidCandidateVotes { votes: BTreeMap, } @@ -133,7 +133,7 @@ impl ValidCandidateVotes { self.votes.retain(f) } - /// Get all the validator indeces we have votes for. + /// Get all the validator indices we have votes for. pub fn keys( &self, ) -> Bkeys<'_, ValidatorIndex, (ValidDisputeStatementKind, ValidatorSignature)> { diff --git a/polkadot/node/primitives/src/lib.rs b/polkadot/node/primitives/src/lib.rs index e7fd2c46381499f221913a01e7a9c3bc1dacc2d3..375aacd583267ef7e86f7888a9e3e17599e7414d 100644 --- a/polkadot/node/primitives/src/lib.rs +++ b/polkadot/node/primitives/src/lib.rs @@ -31,8 +31,8 @@ use serde::{de, Deserialize, Deserializer, Serialize, Serializer}; use polkadot_primitives::{ BlakeTwo256, BlockNumber, CandidateCommitments, CandidateHash, CollatorPair, - CommittedCandidateReceipt, CompactStatement, EncodeAs, Hash, HashT, HeadData, Id as ParaId, - PersistedValidationData, SessionIndex, Signed, UncheckedSigned, ValidationCode, + CommittedCandidateReceipt, CompactStatement, CoreIndex, EncodeAs, Hash, HashT, HeadData, + Id as ParaId, PersistedValidationData, SessionIndex, Signed, UncheckedSigned, ValidationCode, ValidationCodeHash, ValidatorIndex, MAX_CODE_SIZE, MAX_POV_SIZE, }; pub use sp_consensus_babe::{ @@ -58,7 +58,7 @@ pub use disputes::{ /// relatively rare. /// /// The associated worker binaries should use the same version as the node that spawns them. -pub const NODE_VERSION: &'static str = "1.6.0"; +pub const NODE_VERSION: &'static str = "1.10.0"; // For a 16-ary Merkle Prefix Trie, we can expect at most 16 32-byte hashes per node // plus some overhead: @@ -74,7 +74,7 @@ pub const VALIDATION_CODE_BOMB_LIMIT: usize = (MAX_CODE_SIZE * 4u32) as usize; pub const POV_BOMB_LIMIT: usize = (MAX_POV_SIZE * 4u32) as usize; /// How many blocks after finalization an information about backed/included candidate should be -/// pre-loaded (when scraoing onchain votes) and kept locally (when pruning). +/// pre-loaded (when scraping onchain votes) and kept locally (when pruning). /// /// We don't want to remove scraped candidates on finalization because we want to /// be sure that disputes will conclude on abandoned forks. @@ -524,6 +524,8 @@ pub struct SubmitCollationParams { /// okay to just drop it. However, if it is called, it should be called with the signed /// statement of a parachain validator seconding the collation. pub result_sender: Option>, + /// The core index on which the resulting candidate should be backed + pub core_index: CoreIndex, } /// This is the data we keep available for each candidate included in the relay chain. diff --git a/polkadot/node/service/Cargo.toml b/polkadot/node/service/Cargo.toml index 007e3dc595e9d49610e9d302fd28af712b27e300..9688ab556473131d6e90075de9b6f69ba4f244e5 100644 --- a/polkadot/node/service/Cargo.toml +++ b/polkadot/node/service/Cargo.toml @@ -65,7 +65,6 @@ sp-version = { path = "../../../substrate/primitives/version" } # Substrate Pallets pallet-babe = { path = "../../../substrate/frame/babe" } -pallet-im-online = { path = "../../../substrate/frame/im-online" } pallet-staking = { path = "../../../substrate/frame/staking" } pallet-transaction-payment-rpc-runtime-api = { path = "../../../substrate/frame/transaction-payment/rpc/runtime-api" } frame-system = { path = "../../../substrate/frame/system" } @@ -78,21 +77,22 @@ frame-benchmarking-cli = { path = "../../../substrate/utils/frame/benchmarking-c frame-benchmarking = { path = "../../../substrate/frame/benchmarking" } # External Crates -async-trait = "0.1.74" -futures = "0.3.21" +async-trait = "0.1.79" +futures = "0.3.30" hex-literal = "0.4.1" is_executable = "1.0.1" gum = { package = "tracing-gum", path = "../gum" } -log = "0.4.17" +log = { workspace = true, default-features = true } schnellru = "0.2.1" -serde = { version = "1.0.195", features = ["derive"] } -serde_json = "1.0.111" -thiserror = "1.0.48" +serde = { features = ["derive"], workspace = true, default-features = true } +serde_json = { workspace = true, default-features = true } +thiserror = { workspace = true } kvdb = "0.13.0" kvdb-rocksdb = { version = "0.19.0", optional = true } parity-db = { version = "0.4.12", optional = true } codec = { package = "parity-scale-codec", version = "3.6.1" } parking_lot = "0.12.1" +bitvec = { version = "1.0.1", optional = true } # Polkadot polkadot-core-primitives = { path = "../../core-primitives" } @@ -141,11 +141,14 @@ polkadot-node-core-pvf-checker = { path = "../core/pvf-checker", optional = true polkadot-node-core-runtime-api = { path = "../core/runtime-api", optional = true } polkadot-statement-distribution = { path = "../network/statement-distribution", optional = true } +xcm = { package = "staging-xcm", path = "../../xcm" } +xcm-fee-payment-runtime-api = { path = "../../xcm/xcm-fee-payment-runtime-api" } + [dev-dependencies] polkadot-test-client = { path = "../test/client" } polkadot-node-subsystem-test-helpers = { path = "../subsystem-test-helpers" } test-helpers = { package = "polkadot-primitives-test-helpers", path = "../../primitives/test-helpers" } -env_logger = "0.9.0" +env_logger = "0.11" assert_matches = "1.5.0" serial_test = "2.0.0" tempfile = "3.2" @@ -184,8 +187,8 @@ full-node = [ ] # Configure the native runtimes to use. -westend-native = ["westend-runtime", "westend-runtime-constants"] -rococo-native = ["rococo-runtime", "rococo-runtime-constants"] +westend-native = ["bitvec", "westend-runtime", "westend-runtime-constants"] +rococo-native = ["bitvec", "rococo-runtime", "rococo-runtime-constants"] runtime-benchmarks = [ "frame-benchmarking-cli/runtime-benchmarks", @@ -193,7 +196,6 @@ runtime-benchmarks = [ "frame-support/runtime-benchmarks", "frame-system/runtime-benchmarks", "pallet-babe/runtime-benchmarks", - "pallet-im-online/runtime-benchmarks", "pallet-staking/runtime-benchmarks", "polkadot-parachain-primitives/runtime-benchmarks", "polkadot-primitives/runtime-benchmarks", @@ -209,7 +211,6 @@ try-runtime = [ "frame-support/try-runtime", "frame-system/try-runtime", "pallet-babe/try-runtime", - "pallet-im-online/try-runtime", "pallet-staking/try-runtime", "pallet-transaction-payment/try-runtime", "polkadot-runtime-parachains/try-runtime", @@ -217,10 +218,7 @@ try-runtime = [ "sp-runtime/try-runtime", "westend-runtime?/try-runtime", ] -fast-runtime = [ - "rococo-runtime?/fast-runtime", - "westend-runtime?/fast-runtime", -] +fast-runtime = ["rococo-runtime?/fast-runtime", "westend-runtime?/fast-runtime"] malus = ["full-node"] runtime-metrics = [ @@ -228,3 +226,7 @@ runtime-metrics = [ "rococo-runtime?/runtime-metrics", "westend-runtime?/runtime-metrics", ] + +elastic-scaling-experimental = [ + "polkadot-collator-protocol?/elastic-scaling-experimental", +] diff --git a/polkadot/node/service/chain-specs/kusama.json b/polkadot/node/service/chain-specs/kusama.json index 979550c7570643380c5a2e0f0f5de7c049c01f85..490b39ee696930bafc9af4c139339a9974dffff9 100644 --- a/polkadot/node/service/chain-specs/kusama.json +++ b/polkadot/node/service/chain-specs/kusama.json @@ -16,8 +16,8 @@ "/dns/boot-node.helikon.io/tcp/7062/wss/p2p/12D3KooWL4KPqfAsPE2aY1g5Zo1CxsDwcdJ7mmAghK7cg6M2fdbD", "/dns/kusama.bootnode.amforc.com/tcp/30333/p2p/12D3KooWLx6nsj6Fpd8biP1VDyuCUjazvRiGWyBam8PsqRJkbUb9", "/dns/kusama.bootnode.amforc.com/tcp/30334/wss/p2p/12D3KooWLx6nsj6Fpd8biP1VDyuCUjazvRiGWyBam8PsqRJkbUb9", - "/dns/kusama-bootnode.polkadotters.com/tcp/30333/p2p/12D3KooWHB5rTeNkQdXNJ9ynvGz8Lpnmsctt7Tvp7mrYv6bcwbPG", - "/dns/kusama-bootnode.polkadotters.com/tcp/30334/wss/p2p/12D3KooWHB5rTeNkQdXNJ9ynvGz8Lpnmsctt7Tvp7mrYv6bcwbPG", + "/dns/kusama.bootnodes.polkadotters.com/tcp/30311/p2p/12D3KooWHB5rTeNkQdXNJ9ynvGz8Lpnmsctt7Tvp7mrYv6bcwbPG", + "/dns/kusama.bootnodes.polkadotters.com/tcp/30313/wss/p2p/12D3KooWHB5rTeNkQdXNJ9ynvGz8Lpnmsctt7Tvp7mrYv6bcwbPG", "/dns/boot-cr.gatotech.network/tcp/33200/p2p/12D3KooWRNZXf99BfzQDE1C8YhuBbuy7Sj18UEf7FNpD8egbURYD", "/dns/boot-cr.gatotech.network/tcp/35200/wss/p2p/12D3KooWRNZXf99BfzQDE1C8YhuBbuy7Sj18UEf7FNpD8egbURYD", "/dns/boot-kusama.metaspan.io/tcp/23012/p2p/12D3KooWE1tq9ZL9AAxMiUBBqy1ENmh5pwfWabnoBPMo8gFPXhn6", @@ -35,6 +35,7 @@ "/dns/ksm14.rotko.net/tcp/35224/wss/p2p/12D3KooWAa5THTw8HPfnhEei23HdL8P9McBXdozG2oTtMMksjZkK", "/dns/ksm14.rotko.net/tcp/33224/p2p/12D3KooWAa5THTw8HPfnhEei23HdL8P9McBXdozG2oTtMMksjZkK", "/dns/ibp-boot-kusama.luckyfriday.io/tcp/30333/p2p/12D3KooW9vu1GWHBuxyhm7rZgD3fhGZpNajPXFexadvhujWMgwfT", + "/dns/boot-kusama.luckyfriday.io/tcp/443/wss/p2p/12D3KooWS1Lu6DmK8YHSvkErpxpcXmk14vG6y4KVEFEkd9g62PP8", "/dns/ibp-boot-kusama.luckyfriday.io/tcp/30334/wss/p2p/12D3KooW9vu1GWHBuxyhm7rZgD3fhGZpNajPXFexadvhujWMgwfT" ], "telemetryEndpoints": [ diff --git a/polkadot/node/service/chain-specs/paseo.json b/polkadot/node/service/chain-specs/paseo.json index c8f2b58533c62af5ee3b71ffa5d782c852edd162..2e659716766ede8cf4ec2b183013b5e925dff998 100644 --- a/polkadot/node/service/chain-specs/paseo.json +++ b/polkadot/node/service/chain-specs/paseo.json @@ -5,21 +5,20 @@ "bootNodes": [ "/dns/paseo.bootnode.amforc.com/tcp/30333/wss/p2p/12D3KooWFD81HC9memUwuGMLvhDDEfmXjn6jC4n7zyNs3vToXapS", "/dns/paseo.bootnode.amforc.com/tcp/30344/p2p/12D3KooWFD81HC9memUwuGMLvhDDEfmXjn6jC4n7zyNs3vToXapS", - "/dns/paseo-bootnode.radiumblock.com/tcp/30333/p2p/12D3KooWADeayZC8zag4Qrb4GosSn65MmfVZztRPMaBdgZnQqXRo", - "/dns/paseo-bootnode.radiumblock.com/tcp/30335/wss/p2p/12D3KooWADeayZC8zag4Qrb4GosSn65MmfVZztRPMaBdgZnQqXRo", - "/dns/boot.gatotech.network/tcp/33400/p2p/12D3KooWEvz5Ygv3MhCUNTVQbUTVhzhvf4KKcNoe5M5YbVLPBeeW", - "/dns/boot.gatotech.network/tcp/35400/wss/p2p/12D3KooWEvz5Ygv3MhCUNTVQbUTVhzhvf4KKcNoe5M5YbVLPBeeW", + "/dns/boot.stake.plus/tcp/43334/wss/p2p/12D3KooWNhgAC3hjZHxaT52EpPFZohkCL1AHFAijqcN8xB9Rwud2", + "/dns/boot.stake.plus/tcp/43333/p2p/12D3KooWNhgAC3hjZHxaT52EpPFZohkCL1AHFAijqcN8xB9Rwud2", + "/dns/boot.metaspan.io/tcp/36017/wss/p2p/12D3KooWSW6nDfM3SS8rUtjMyjdszivK31bu4a1sRngGa2hFETz7", + "/dns/boot.metaspan.io/tcp/36018/p2p/12D3KooWSW6nDfM3SS8rUtjMyjdszivK31bu4a1sRngGa2hFETz7", + "/dns/paseo.bootnodes.polkadotters.com/tcp/30538/p2p/12D3KooWPbbFy4TefEGTRF5eTYhq8LEzc4VAHdNUVCbY4nAnhqPP", + "/dns/paseo.bootnodes.polkadotters.com/tcp/30540/wss/p2p/12D3KooWPbbFy4TefEGTRF5eTYhq8LEzc4VAHdNUVCbY4nAnhqPP", "/dns/boot-node.helikon.io/tcp/10020/p2p/12D3KooWBetfzZpf6tGihKrqCo5z854Ub4ZNAUUTRT6eYHNh7FYi", "/dns/boot-node.helikon.io/tcp/10022/wss/p2p/12D3KooWBetfzZpf6tGihKrqCo5z854Ub4ZNAUUTRT6eYHNh7FYi", - "/dns/pso16.rotko.net/tcp/33246/p2p/12D3KooWRH8eBMhw8c7bucy6pJfy94q4dKpLkF3pmeGohHmemdRu", - "/dns/pso16.rotko.net/tcp/35246/wss/p2p/12D3KooWRH8eBMhw8c7bucy6pJfy94q4dKpLkF3pmeGohHmemdRu" - ], - "telemetryEndpoints": [ - [ - "wss://telemetry.polkadot.io/submit/", - 0 - ] + "/dns/boot.gatotech.network/tcp/33400/p2p/12D3KooWEvz5Ygv3MhCUNTVQbUTVhzhvf4KKcNoe5M5YbVLPBeeW", + "/dns/boot.gatotech.network/tcp/35400/wss/p2p/12D3KooWEvz5Ygv3MhCUNTVQbUTVhzhvf4KKcNoe5M5YbVLPBeeW", + "/dns/paseo-bootnode.turboflakes.io/tcp/30630/p2p/12D3KooWMjCN2CrnN71hAdehn6M2iYKeGdGbZ1A3SKhf4hxrgG9e", + "/dns/paseo-bootnode.turboflakes.io/tcp/30730/wss/p2p/12D3KooWMjCN2CrnN71hAdehn6M2iYKeGdGbZ1A3SKhf4hxrgG9e" ], + "telemetryEndpoints": null, "protocolId": "pas", "properties": { "ss58Format": 42, @@ -34,6 +33,12 @@ "0x06de3d8a54d27e44a9d5ce189618f22d4e7b9012096b41c4eb3aaf947f6ea429": "0x0900", "0x06de3d8a54d27e44a9d5ce189618f22db4b49d95320d9021994c850f25b8e385": "0x0000300000800000080000000000100000c8000005000000050000000200000002000000000000000000000000005000000010000400000000000000000000000000000000000000000000000000000000000000000000000800000000200000040000000000100000b004000000000000000000001027000080b2e60e80c3c9018096980000000000000000000000000005000000140000000400000001000000000006000000640000000200000019000000000000000200000002000000020000000500000002000000", "0x074b65e262fcd5bd9c785caf7f42e00a4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x08c41974a97dbf15cfbec28365bea2da4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x08c41974a97dbf15cfbec28365bea2da5e0621c4869aa60c02be9adcc98a0d1d": "0x380325fc2095902f5fe394f244bce38b0dc3d631cbc05f0b64d5620a71bbf2514f0f03f045328f504c13dac9ddd9b1186098aee7c46cb8d55289dbbf2433bab7a2623903a0af06322d100056125fac1df39d161089b07ae279505aae8731c4d110a54ad703aec8e80ea0375f8669d6e55d7abb6a3117678d7bb851a1bd100a01e52a4fed9003d46c454f9b620603feef8c3a2a5d7098205b8566500fda0fa0b456d6ded54538030e901c390fa37d101ff25d70594acd2df67b4493ee77a73684f25d39313536d702f4f4d0eccb899bf2d611b56e0afec7c740efba404f8d0e82a545f988c45316c402182879ec92e811e2a8cc117f3cde1f61d3cba0093134cfb1ed17a4ef74915d4a03e843f200e30bc5b951c73a96d968db1c0cd05e357d910fce159fc59c40e9d6e20203d51bba2124f480e3507eb1764fc3019ac7abae8ee215683a285078bda7f51d029338ece1c6bc6439dc4d16bfe33f28c9f0af31626bb8142849742b7a624f68070333022898140662dfea847e3cbfe5e989845ac6766e83472f8b0c650d85e77bae03586dafcdab3d4647d4dc68732a9cab8aa34c00c5edd04e65d9dd44c2a1fd21e2029a1eb2e31dcaf468dbb516f9b620fdd7c3f090d58a88e02b51b25255b2182dd1", + "0x08c41974a97dbf15cfbec28365bea2da8f05bccc2f70ec66a32999c5761156be": "0x0000000000000000", + "0x08c41974a97dbf15cfbec28365bea2daaacf00b9b41fda7a9268821c2a2b3e4c": "0x380325fc2095902f5fe394f244bce38b0dc3d631cbc05f0b64d5620a71bbf2514f0f03f045328f504c13dac9ddd9b1186098aee7c46cb8d55289dbbf2433bab7a2623903a0af06322d100056125fac1df39d161089b07ae279505aae8731c4d110a54ad703aec8e80ea0375f8669d6e55d7abb6a3117678d7bb851a1bd100a01e52a4fed9003d46c454f9b620603feef8c3a2a5d7098205b8566500fda0fa0b456d6ded54538030e901c390fa37d101ff25d70594acd2df67b4493ee77a73684f25d39313536d702f4f4d0eccb899bf2d611b56e0afec7c740efba404f8d0e82a545f988c45316c402182879ec92e811e2a8cc117f3cde1f61d3cba0093134cfb1ed17a4ef74915d4a03e843f200e30bc5b951c73a96d968db1c0cd05e357d910fce159fc59c40e9d6e20203d51bba2124f480e3507eb1764fc3019ac7abae8ee215683a285078bda7f51d029338ece1c6bc6439dc4d16bfe33f28c9f0af31626bb8142849742b7a624f68070333022898140662dfea847e3cbfe5e989845ac6766e83472f8b0c650d85e77bae03586dafcdab3d4647d4dc68732a9cab8aa34c00c5edd04e65d9dd44c2a1fd21e2029a1eb2e31dcaf468dbb516f9b620fdd7c3f090d58a88e02b51b25255b2182dd1", + "0x08c41974a97dbf15cfbec28365bea2dac713b7f8b14e2815d297585d3581e774": "0x0101000000", + "0x08c41974a97dbf15cfbec28365bea2dad47cb8f5328af743ddfb361e7180e7fcbb1bdbcacd6ac9340000000000000000": "0x00000000", "0x0f6738a0ee80c8e74cd2c7417c1e25564e7b9012096b41c4eb3aaf947f6ea429": "0x0100", "0x1405f2411d0af5a7ff397e7c9dc68d194e7b9012096b41c4eb3aaf947f6ea429": "0x0100", "0x1405f2411d0af5a7ff397e7c9dc68d196323ae84c43568be0d1394d5d0d522c4": "0x03000000", @@ -41,45 +46,59 @@ "0x196e027349017067f9eb56e2c4d9ded54e7b9012096b41c4eb3aaf947f6ea429": "0x0000", "0x1a736d37504c2e3fb73dad160c55b2914e7b9012096b41c4eb3aaf947f6ea429": "0x0000", "0x1cb6f36e027abb2091cfb5110ab5087f4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x1cb6f36e027abb2091cfb5110ab5087f5e0621c4869aa60c02be9adcc98a0d1d": "0x10b07d600e3487e2712dcc3879c7b17c9b29cd2243b45f0d9343c591b89cf82a65010000000000000058108e1651614afc6a535c426fc013945e93533faa33819fe4e69423fe3233020100000000000000facb2f987caac6c1290a9784b1efdba78343d39aed805addb12945efbe4440000100000000000000ae240842b74e5dd778972e451558134f434c7a1d8a52bc70519f38054e2455330100000000000000", + "0x1cb6f36e027abb2091cfb5110ab5087f5e0621c4869aa60c02be9adcc98a0d1d": "0x38b07d600e3487e2712dcc3879c7b17c9b29cd2243b45f0d9343c591b89cf82a6501000000000000005440add43e5388a81aef665c9086d386c0be0ce75e4f8a4a3d8168e976ea821f010000000000000074dacbca0cdb5099afef67e622c147614198e669931cebc605629da332632473010000000000000058108e1651614afc6a535c426fc013945e93533faa33819fe4e69423fe323302010000000000000050412bd7d3f1075e8f8e3b682d05ea20b391c287d8c849a0e49a78f568553e690100000000000000c44b3e8efe854419ccd5801a82ada22d39cfccdbcece382304cdfeac81ebe4020100000000000000b2efe7e70daf44b3466c63ccbf4487f42c6a9f6fbb7050b849691e36ce92e3470100000000000000facb2f987caac6c1290a9784b1efdba78343d39aed805addb12945efbe444000010000000000000068a9ec74fa35b3425eaf503dd36294ba8e758e7b8084c4d6bfd547f8c6b5827401000000000000007c8348ec95a0faad6a638ef74864761028c53221bde07e9ff7c81a3f427abf3f0100000000000000ae240842b74e5dd778972e451558134f434c7a1d8a52bc70519f38054e245533010000000000000018bd0f67d77f04f1a92400421813d8927fad109b40a8689254a5f0c8b346857c01000000000000006248d87bd2a640ffe26d6b831735887c24e2076a3a0f3a74f7ae7568c276040801000000000000001ab03b1b3277edfedd24ef3d3359b449b64bd95ed82a04e7f9fbaab7b71dc0150100000000000000", "0x1cb6f36e027abb2091cfb5110ab5087f66e8f035c8adbe7f1547b43c51e6f8a4": "0x00000000", - "0x1cb6f36e027abb2091cfb5110ab5087faacf00b9b41fda7a9268821c2a2b3e4c": "0x10b07d600e3487e2712dcc3879c7b17c9b29cd2243b45f0d9343c591b89cf82a65010000000000000058108e1651614afc6a535c426fc013945e93533faa33819fe4e69423fe3233020100000000000000facb2f987caac6c1290a9784b1efdba78343d39aed805addb12945efbe4440000100000000000000ae240842b74e5dd778972e451558134f434c7a1d8a52bc70519f38054e2455330100000000000000", + "0x1cb6f36e027abb2091cfb5110ab5087faacf00b9b41fda7a9268821c2a2b3e4c": "0x38b07d600e3487e2712dcc3879c7b17c9b29cd2243b45f0d9343c591b89cf82a6501000000000000005440add43e5388a81aef665c9086d386c0be0ce75e4f8a4a3d8168e976ea821f010000000000000074dacbca0cdb5099afef67e622c147614198e669931cebc605629da332632473010000000000000058108e1651614afc6a535c426fc013945e93533faa33819fe4e69423fe323302010000000000000050412bd7d3f1075e8f8e3b682d05ea20b391c287d8c849a0e49a78f568553e690100000000000000c44b3e8efe854419ccd5801a82ada22d39cfccdbcece382304cdfeac81ebe4020100000000000000b2efe7e70daf44b3466c63ccbf4487f42c6a9f6fbb7050b849691e36ce92e3470100000000000000facb2f987caac6c1290a9784b1efdba78343d39aed805addb12945efbe444000010000000000000068a9ec74fa35b3425eaf503dd36294ba8e758e7b8084c4d6bfd547f8c6b5827401000000000000007c8348ec95a0faad6a638ef74864761028c53221bde07e9ff7c81a3f427abf3f0100000000000000ae240842b74e5dd778972e451558134f434c7a1d8a52bc70519f38054e245533010000000000000018bd0f67d77f04f1a92400421813d8927fad109b40a8689254a5f0c8b346857c01000000000000006248d87bd2a640ffe26d6b831735887c24e2076a3a0f3a74f7ae7568c276040801000000000000001ab03b1b3277edfedd24ef3d3359b449b64bd95ed82a04e7f9fbaab7b71dc0150100000000000000", "0x1cb6f36e027abb2091cfb5110ab5087fdc6b171b77304263c292cc3ea5ed31ef": "0x0100000000000000040000000000000002", - "0x2099d7f109d6e535fb000bba623fd4404c014e6bf8b8c2c011e7290b85696bb3": "0x10f89c97bf5b2c07c05c84eebce4ffc7b28766946c03741fd1a71fdae0942e876892cb05c48fc643f057626c669604675c5ad5a836266f260ae7030c6fdc17a54326e2fc857945d01520797a75388c58e710c9fefedd28387af70880f1682be41e763d070989ead31f265b40cc7a0cd29d47799b766d6a7f084e44c82baedfc01e", + "0x2099d7f109d6e535fb000bba623fd4404c014e6bf8b8c2c011e7290b85696bb3": "0x38f89c97bf5b2c07c05c84eebce4ffc7b28766946c03741fd1a71fdae0942e8768cce3ec06252cf7cdad47fe1265047a9bbddb9059ee4bdc6dec83b67249b4a9342ada042fb4bbfd9b6d8c48293ffc4a7722632c843a67e608554c41d06aabc41392cb05c48fc643f057626c669604675c5ad5a836266f260ae7030c6fdc17a5438c15606f4c121376097ff0e96c2a33ea7b024d812b42fe2c741c8b8cee17e63d729053f28155071474b4686323db5f7a318cb3f088b76660cc8ff5e3e11ec32eaa3955187f755708cd6a8104314b962ff5043e36efa3ec5d84df40c58b44222126e2fc857945d01520797a75388c58e710c9fefedd28387af70880f1682be41e64ffc83f4f86cc595e607a00b977eeb6641e02a4e6e556c24ab163aecd7d146c7aeb767131602e6612e607a9eb8e26b4ce4fa4765593d032bc923ce8acadda42763d070989ead31f265b40cc7a0cd29d47799b766d6a7f084e44c82baedfc01e629f9fd0dd7279c7af7470472d1208a13e33239b484974d47cffce4ad4785644047277f22b9ef92a8b99618f4c86c2412f0e3b08a4f965f842775672043d1e259a86227e204a2d003399c2a3b50c2c869c4380c195a014a02f6d2e7048941237", "0x2099d7f109d6e535fb000bba623fd4404e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x2099d7f109d6e535fb000bba623fd4409f99a2ce711f3a31b2fc05604c93f179": "0x10f89c97bf5b2c07c05c84eebce4ffc7b28766946c03741fd1a71fdae0942e876892cb05c48fc643f057626c669604675c5ad5a836266f260ae7030c6fdc17a54326e2fc857945d01520797a75388c58e710c9fefedd28387af70880f1682be41e763d070989ead31f265b40cc7a0cd29d47799b766d6a7f084e44c82baedfc01e", - "0x26aa394eea5630e07c48ae0c9558cef734abf5cb34d6244378cddbf18e849d96": "0x00000000070d8aa99f1452f92000", + "0x2099d7f109d6e535fb000bba623fd4409f99a2ce711f3a31b2fc05604c93f179": "0x38f89c97bf5b2c07c05c84eebce4ffc7b28766946c03741fd1a71fdae0942e8768cce3ec06252cf7cdad47fe1265047a9bbddb9059ee4bdc6dec83b67249b4a9342ada042fb4bbfd9b6d8c48293ffc4a7722632c843a67e608554c41d06aabc41392cb05c48fc643f057626c669604675c5ad5a836266f260ae7030c6fdc17a5438c15606f4c121376097ff0e96c2a33ea7b024d812b42fe2c741c8b8cee17e63d729053f28155071474b4686323db5f7a318cb3f088b76660cc8ff5e3e11ec32eaa3955187f755708cd6a8104314b962ff5043e36efa3ec5d84df40c58b44222126e2fc857945d01520797a75388c58e710c9fefedd28387af70880f1682be41e64ffc83f4f86cc595e607a00b977eeb6641e02a4e6e556c24ab163aecd7d146c7aeb767131602e6612e607a9eb8e26b4ce4fa4765593d032bc923ce8acadda42763d070989ead31f265b40cc7a0cd29d47799b766d6a7f084e44c82baedfc01e629f9fd0dd7279c7af7470472d1208a13e33239b484974d47cffce4ad4785644047277f22b9ef92a8b99618f4c86c2412f0e3b08a4f965f842775672043d1e259a86227e204a2d003399c2a3b50c2c869c4380c195a014a02f6d2e7048941237", + "0x26aa394eea5630e07c48ae0c9558cef734abf5cb34d6244378cddbf18e849d96": "0x0000000007def964eb114a412100", "0x26aa394eea5630e07c48ae0c9558cef74e7b9012096b41c4eb3aaf947f6ea429": "0x0000", "0x26aa394eea5630e07c48ae0c9558cef75684a022a34dd8bfa2baaf44f172b710": "0x01", "0x26aa394eea5630e07c48ae0c9558cef78a42f33323cb5ced3b44dd825fda9fcc": "0x4545454545454545454545454545454545454545454545454545454545454545", "0x26aa394eea5630e07c48ae0c9558cef7a44704b568d21667356a5a050c118746b4def25cfda6ef3a00000000": "0x4545454545454545454545454545454545454545454545454545454545454545", "0x26aa394eea5630e07c48ae0c9558cef7a7fd6c28836b9a28522dc924110cf439": "0x01", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da902d496d20c019d22397accfc42b7635d94c4156ed6a101ae478a3de3ba70a05fce8a3d67be6fb85f33bfcf2777ab6b10": "0x000000000400000001000000000000000000c16ff28623000000000000000000000000000000000000000000000000000080c6a47e8d0300000000000000000000000000000000000000000000000080", "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da90ffdb9747f7a8bfa200ea2291eea6bdf9492b8c38442c79061bdbb8d38dcd28138938a7fd476edf89ecdec06a5a9d20f": "0x000000000400000001000000000000000000c16ff28623000000000000000000000000000000000000000000000000000080c6a47e8d0300000000000000000000000000000000000000000000000080", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da911fcf3e922de10898cb04273301735e65270ec35ba01254d8bff046a1a58f16d3ae615c235efd6e99a35f233b2d9df2c": "0x000000000400000001000000000000000000c16ff28623000000000000000000000000000000000000000000000000000080c6a47e8d0300000000000000000000000000000000000000000000000080", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da915fbc5d9b44885a2dce0fbaa3834ba211e30aa51ad68b8918d2c46e914986818c111bee03582610cbc9fb73fe0e4c413": "0x000000000400000001000000000000000000c16ff28623000000000000000000000000000000000000000000000000000080c6a47e8d0300000000000000000000000000000000000000000000000080", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9279effc2672354478fb5e3f7e65726b668728d12a90fb1a9f5b0f0b2814d730401d314964113554e66ff19e7067d7c69": "0x000000000400000001000000000000000000c16ff28623000000000000000000000000000000000000000000000000000080c6a47e8d0300000000000000000000000000000000000000000000000080", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da92ffe7c0dd7d3d8d8485c403a33fb7adb6ed774481ff68097867271bc8ecaeee3500817ccefdfda74ceeafd32a2259627": "0x000000000400000001000000000000000000c16ff28623000000000000000000000000000000000000000000000000000080c6a47e8d0300000000000000000000000000000000000000000000000080", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9350ea875b4c0459b3527d475e9825c99d41a8a9678862ebe9d1a1d59cac1c8430ef31e282f9cb391cf6f2b4d9ce2fd3d": "0x000000000400000001000000000000000000c16ff28623000000000000000000000000000000000000000000000000000080c6a47e8d0300000000000000000000000000000000000000000000000080", "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da94d176c4abc6d2410c43423c2714b909c32eebacd223f4aef33d98a667a68f9e371f40384257c6d31030952b9d94e1152": "0x000000000400000001000000000000000000c16ff28623000000000000000000000000000000000000000000000000000080c6a47e8d0300000000000000000000000000000000000000000000000080", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9585bd5ccc1af6cf60c19d791bb091b750efe248e3ddcfcb4f29675b70fc0a8e2db66b65381c45d299427b60d05f76108": "0x000000000400000001000000000000000000c16ff28623000000000000000000000000000000000000000000000000000080c6a47e8d0300000000000000000000000000000000000000000000000080", "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da95ecffd7b6c0f78751baa9d281e0bfa3a6d6f646c70792f74727372790000000000000000000000000000000000000000": "0x0000000000000000010000000000000000e40b54020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080", "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da965bb58c29c9825c1f6727fe8c41650ac82c3105dbd4bb206428d8a8b7ea1f19965a0668dd583b06c3b75daa181fe654c": "0x000000000400000001000000000000000000c16ff28623000000000000000000000000000000000000000000000000000080c6a47e8d0300000000000000000000000000000000000000000000000080", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da96deaa967a94fa09152be01a253511479d0b4896a63b672a7a74f5234bf9ec8567ff3c5bb8f93795e15e2c498b48d327c": "0x000000000400000001000000000000000000c16ff28623000000000000000000000000000000000000000000000000000080c6a47e8d0300000000000000000000000000000000000000000000000080", "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9829f3f4d6d7c991993e0c044ae97410b043393e76c137dfdc403a6fd9a2d6129d470d51c5a67bd40517378030c87170d": "0x000000000400000001000000000000000000c16ff28623000000000000000000000000000000000000000000000000000080c6a47e8d0300000000000000000000000000000000000000000000000080", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9a00c6f5358fa04d76ce7cf995bce2eabe21bb02f2a82cb1113ff10693093377672925b23f047624c0cfa7a24a8609841": "0x000000000000000001000000000000000000c16ff28623000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9ba2db252d1b8c64ec51b04d0f50d7d2b9037d1020ed699c2f538d3ffcf0eb98087ee11ca4bd07bfddb0d68633806af74": "0x000000000400000001000000000000000000c16ff28623000000000000000000000000000000000000000000000000000080c6a47e8d0300000000000000000000000000000000000000000000000080", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9dfc40f350cc4563ad9ddff5ad92944278eef6710734f5d1e7d2eb303fa8f04e9bef65fb680647b24624723f95b868964": "0x000000000400000001000000000000000000c16ff28623000000000000000000000000000000000000000000000000000080c6a47e8d0300000000000000000000000000000000000000000000000080", "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9e6fb488a1496189393ed0a95dcf5577e7e939ef17e229e9a29210d95cb0b607e0030d54899c05f791a62d5c6f4557659": "0x00000000000000000100000000000000000064a7b3b6e00d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080", - "0x26aa394eea5630e07c48ae0c9558cef7f9cce9c888469bb1a0dceaa129672ef8": "0x02093d0014706173656f", + "0x26aa394eea5630e07c48ae0c9558cef7f9cce9c888469bb1a0dceaa129672ef8": "0xaa183d0014706173656f", "0x2762c81376aaa894b6f64c67e58cc6504e7b9012096b41c4eb3aaf947f6ea429": "0x0000", "0x2aeddc77fe58c98d50bd37f1b90840f94e7b9012096b41c4eb3aaf947f6ea429": "0x0000", "0x2b06af9719ac64d755623cda8ddd9b944e7b9012096b41c4eb3aaf947f6ea429": "0x0100", - "0x2b06af9719ac64d755623cda8ddd9b949f99a2ce711f3a31b2fc05604c93f179": "0x100edf2a41cb81178704560b02c35f5e01a5a97a568ebc10c025ade18b6ab2fa1d74bd654c470ed9b94972c1f997593fab7bdd4d6b85e3cf49401265668142584eca3c2703db1633a27eff681d979967988c3a6752c669fd41f1abde10f3b0544606bd8fd81e50cda2bd67bf6893d921d1aae5cb08409ae43e0bff4d54e1830e58", + "0x2b06af9719ac64d755623cda8ddd9b949f99a2ce711f3a31b2fc05604c93f179": "0x380edf2a41cb81178704560b02c35f5e01a5a97a568ebc10c025ade18b6ab2fa1d98aab6f52520022d011a6eba2dca1c6327edbbcd753c170dcf0e9118b5f0f25bb414aa148096a92a1831309f758f944725653363ccbaeb21817b7df5784b8d4674bd654c470ed9b94972c1f997593fab7bdd4d6b85e3cf49401265668142584e94848b8cf2cbc9e6fd72db8d80676591b5be4d1ec68972ada48cf6fd01228712a8a03d86e6c0dbe180cadfc7994121f462b28f7a8cb1be7e0e354147624be734bef47a9e4b47ed57461e1d28cac7da327a52ebcd64d74080d31deb3ac7a7645eca3c2703db1633a27eff681d979967988c3a6752c669fd41f1abde10f3b0544660fcc9d094d21fe17cfb7426501f50cb3d75c4c9395a3140e0f255443f660d3b30c40adee5476157ef3c2a26e10cab95ec7d54b62dd220738f5a474d5f86874e06bd8fd81e50cda2bd67bf6893d921d1aae5cb08409ae43e0bff4d54e1830e58d28145a7cde195a4c834276730d30f074b212a150e770931ee9470e853e7d2247c03ca47a3201455f8f89defda4aa909cb1d25dd9ddb7fd62a940606f79b56632cd12c731d91441f0114b08d314cd3f9a9f7fd0240d467fe54adefbee4d90762", + "0x2ecf93be7260df120a495bd3855c0e600c98535b82c72faf3c64974094af4643": "0x01000000000000000e00000063e7f4c4028d97f9e69689cea528e2d0155ea2b202be0a42381c642ace2e4cf4", + "0x2ecf93be7260df120a495bd3855c0e604e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x2ecf93be7260df120a495bd3855c0e60c52aa943bf0908860a3eea0fad707cdc": "0x00000000000000000e00000063e7f4c4028d97f9e69689cea528e2d0155ea2b202be0a42381c642ace2e4cf4", "0x2f85f1e1378cb2d7b83adbaf0b5869c24e7b9012096b41c4eb3aaf947f6ea429": "0x0100", - "0x2f85f1e1378cb2d7b83adbaf0b5869c298ef7dc060436e4ed803af07632b89b65153cb1f00942ff401000000": "0xcee7559d1a7431ad9a589c49d42b6e5da57d8208d290516347b21415449fbf4c04000000", - "0x2f85f1e1378cb2d7b83adbaf0b5869c298ef7dc060436e4ed803af07632b89b6b4def25cfda6ef3a00000000": "0xcee7559d1a7431ad9a589c49d42b6e5da57d8208d290516347b21415449fbf4c04000000", + "0x2f85f1e1378cb2d7b83adbaf0b5869c298ef7dc060436e4ed803af07632b89b65153cb1f00942ff401000000": "0xe68919a7ceff5bcca24e5051b9ab34b9c9f9e74a925cde4c49570cfed7bf14180e000000", + "0x2f85f1e1378cb2d7b83adbaf0b5869c298ef7dc060436e4ed803af07632b89b6b4def25cfda6ef3a00000000": "0xe68919a7ceff5bcca24e5051b9ab34b9c9f9e74a925cde4c49570cfed7bf14180e000000", "0x2f85f1e1378cb2d7b83adbaf0b5869c2ff3ae12770bea2e48d9bde7385e7a25f": "0x0000000002000000", "0x31a3a2ce3603138b8b352e8f192ca55a4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x3a636f6465": "0x52bc537646db8e0528b52ffd00580c6105dee2866016521030cf2a1d73eebb153057df9bb472cc0a860361c473d10e8f9f75d9071693fda90415453adee41bf641bf24fc4306beefa61e5e18c0cbb36d9bec46d011d098dc9c6d2bd360511bf97b6f42f6de5ba6245368194d145f153c9d801bc50970a58c7bc312c497e3b3cbd8a80c636c54ca9e9d7d081bcd672c609e1dc646fceccb479356fa3cfb8a0bd032c606ed2b7128347d00b7c8b83ea38c7bb361fdf8e5d73f36da9badccaf876c348f9656c27e07006ed2387d7d5be0b2d1dcf9ebe06bd968d9cbefd7291b4d5f0727cf02b488b141fbe05c911de470f76601596460d97e536f9fdea2925977de2c200b1896edb337097638c9f92cb2af48ab12afa8844ef100b567259e7380fb1f1b95ecedeb3c497618d9277355e2da9c4bc0e9fb53fab34ff201e3cd66fb923e3b65a375f66ffaf7f5d1f2ac1c7f7a397ef93dbbff0aa9cd3942b7cf3979b62bf1ec7676eaddddd37b32fbf75c7b98b053e7599765e292e95c4bf6e94aacc4fbd395c97f85d478ce2ec0fd29fdd9c1cd600417695c9695dfb3b7afa8a47d8a1a9860b3d9b07c3bc8e1b2d1f492fefab251fbfa8acb3276256e92b28cfd682cc7679f4e9d1d84b1d13e3b38c3918d9665ebec30369acf1e63a376f61595b42bb11253f24a9087aafdac3d4cbe9ffefdac3d4ca6539f4e6bd4fcaecbb292fefa8a4a662de74f576225de1fae4cfe2ba4d6736e01eeef4f393e3bf8b15139bd7d9d27c90ee3f4327cf6b27d59b60e36f9b16c9d689cdebebe6207d399ba7e2c5ba72c5b57627092fce1263dcddb5fe97e3abbb8494fd3f64e03f8e9ec2087bb49d3cbf665d9fac746e5fcf675b0c98f65eb4363fbfa8a1b5096ad77fd58b6aec4208793a41f6ed2d3cc7a27efafe0fc747671939ea6ed9d06f057c29fce6eb3494fd3f64e03f82bdd4f677f6dd2d3b4bdd3007e3a3bd8e124fbc54d7a9ab6771ac05fe97e3a7bb8494f13cd5f097f3abbcd263d4ddb3b0de0a7b3afd801b5d97eba124f71c968fbe9211bedb3afb864da7eba122bb1122bf192cbb2f5fde1ca34fe0aa9f1e435c06570195c24e3f4f56d21a9833fd0c20aae2431246101490a90e881040f2470202101923790c481e40e2423409207123248be404205121790d480e405243224dd92c4400203921890cc80848624169074414285644b520b48b824a5901443920992ea484241d214198c49a222e904495924e1911446d218495e248191b405922c495720d182448524aca42e92ca40b242920792be482a419215495524199184449298a41990b0904443929924aa0cd264c044064a64f04506502449914112495d3258228330327022898e0c8e48d222894c1216495c2495c9e089242d196065104712144944240991810892de487223294b0623c8c08da4393200230331322823292be90348c020b1010996a42592a2487222498e0cbc4842930482a438924490f444120990a48074061218485f20758184855406e90a242a9064404a026909241a9036808404120f483d206900290c120e483e20fd8054051219242b907440ba42ca01e906242590c0208d412a02e909a40e20058104051211483320d940d4a5888ea23a8a4a506482a2111499513444911045411475a00888220e148529faa1c887a20d14f550c44351154556149129a2a2c889a2268aa62852a3288da2334568149d51d4451117455b1469519445111645658aae28f240511145628a88a041143151b444d19822258a922842a2e88822238acc1495514446d118453814dd50344351068a5e28a2a1a8aaa84b119722ab22188a64209283680ea23a884c400407d11b4423208a830804446a88ec204201d10988c220fa82080ca232888e2082820809a214105d41f4049114445310dd88b420c261480d1116a21486483024c7501b43730c610d5d31c4c51013434a0c093164c5d00d43381c61e3481e432c0cb97024cd912b8eec71248b23681c01c191368e9c397282232138f2c611111c71636885237a1cd1e24899211586aa86b80c6519a21ad232b4e5481947d63862e6089a2363fc8b913b8ce0c16e7811302af80c2328e037a606aa1e312b8c9461640c223378822022c3c80e4379f8e0e1a30696858d169b148aa4a0481945ee2862a6089a221ff02b86ae8672e830806cd0690156850c861f2e300b48e420d246921a4e44d211b132404b00c901c80d449c00028648134498008283634164892176780d18b041240c110e10010288ed87123213f8d8414409227a08b11141027606d01940b4ec906007053c48ecdcc1c3028f179e1676460084ca070f46acd81141bfc10326280515580d3511c487236414c962e78c991b3c43f86061288a9c2c76e2086a8327892010f06c095a63c7044167621ce0e11234c69013b33678c6047921a3baa08bec043e2008a2da39418e16413610a4875816205d7cd6e460c9628871d9b12308882258fca8198262f6c60f167cf6f08165678d217a046de191418786217bc4b0c0000418a0c1400d0cceec7c609666e7cc4c04332966b71919b3286669ccceccd698a9319b022803332b6664664c245161162676c5ec87990fb30de874a958b013c84a20cb92c531244bf682cc4aa605680fa03c80f00052038402a03a804a0094054402a03880e0004a032402a03580d820aa01080d901a41ee08a207ac07d80678b400c221e601201d6262807278cde12900ed102b02e80bd00d312378b6e0e102e80a0808202284c4003484101980c408a101a80821330009212403401e000a42480d42be008501a2828f1bf58c111788b04044059e1c76e0a868f01441c4cb8f16580344b220a245055a783ac033034f161e2d414a50dd702d5504158e223b764240c4852174d430aa173b20e0a1e25921c81e3a566e457d23c8098a80112405414c00c44310140451e359bc0aa88620790081098287db7ccb8b04be826c0659065c059812b024dc05242db80c0e83bf50a4825bf938011ba248999d3d865ad89183c8871f2ffc8041e78b4e0c415408d2a582121cf1020916500f3fac2af85241063823d80b5808182b698f24362ac0c2360021118b0289890c52907303c2e293029f3b6cb010e1425b00d20050123c63141183a70b1e2f7474a8800b101a3f9a187a02e88d1c2980eef8a103e80c902c312d4026c899c28605a035b0334072bc6e365b7eec006407902d406efc946036021b1580da8099817551d7f8e4f183099819156c81810113434808848000e804b00f00d15141085e3bc0d0009aa302157456001ac18e183b5fc0d6f8b104d00772b6105205a407500a8042b003c68b8a236600e1a25326b66516c76b0a205874b0289a63c78c970f455b606e106591404c892261d4361c4b4d03a4444f0e31276250c49e804d019322c604511eb1266249502086dc51cd50332ea60787980fb10d101902c9cc10131c7161878cd80b31ab1d343c61743cc0a343ab21f24264851f46042902c606cc0e58160f0f3f74f82103112b2330f8e861c46a670e2010f0882172044f0a15500d29814e0674b87029c0c8806d3184044350e06476bcd84183c8061d1ca89620297484f0598347033fae606d0cbdf092029606ac8c5e0366056c0c2234302e605a201d11ebc1081a447e9825012443912e5e560461e20799fa058c0ae6015811303130236044c090801d01fb813f000b0303a247075810b00e04b10396c34b8e23627894b0e9b21306ec0a1d1988ec9113460e183d6062591879814815912d33387862e0d940cfd52b8ea23b869c00830c14b9721bd8082433780c03c11dd019036803f388514d9035ce05690c6f82a80c4c8e1e0d38d578c4ab8e318908bc4af0caeab9e145c75016af375e6986d431448df3e04038073c8cffe03ef80686ccb183c74e0a8e8041e405225d76d8e0b94107cc113c8edc6124061e23a612445a401222481d3c553c30341c1d87cd15938b5a066b51e48b222d3644f834e1c3c410962367bc7ae079c1cbd850f1a86093e5081642b4bc7878fda053354405c3a14386102ebc42067a50178e8c11a44383f10389203c10ed4124890a7ca86420f9c253032c052dc705b62369c04af02309202b34968f1d8e8461b3820f1d6061e86800481e485208f940520e5c065115dd848f1e92e0481a41066fbca2c8a0043c030c0d9b119265a70c215886c8bcc8c0b082b0c0d498d1f0da001d434817d81c47d604d921880e41ae74b6e8500d65402705242d8450250d61e4899d12e86881e9b193467f61e345074b911a581a1e2ba22f3a2c2435e155ecd0314443901b908080e161840c9baa991c49587e4620c44b521a19c8c15b6460068897231e602f3f70c0f2c879024855066b9a8b1c366cb6b0e9c2860b1b2f86be04a9222243640d521442561092c2d014478480ad11a202ec8e0bb2f01c21048d8e0b3c38086101884c8fa0282b033a3280e38214605ed0333a579c86c7079d1d605f004981870347be388265c3250332807020a98d234820c1218331846c81c501a48566020647121a1760493a936446100f00d162a80e98088e14c12a00a53154050c043013d02cca048d82de681afa049582be419da070d026e81440476010020cdaa078d03ba81a226390380044066ac7eccb6c06581d3b583a30f06021b282280b1d1b88b020520791087868d0f142f401d90880c000c40a880b4062a8573b667466808d0046079119a2338c98b1b366678c1d35746ed05141e7859d36783c60a4059d1a602480a9e1c9804e0e3b593a5976f480bd0143818e6dc83604c390d5900c47d43862c42bcc11318e1c01e485a12d906e455440588061c1d3a5c84bd10a394d10e901db83a707242f606580ec8081160cb660409583821c353976f8bce133021f38646a6478c8eef8f1c30f0efc0853ada865ea1545c61461a2c812332266625e59bcb6786911c48b205f04c19add007361680898158c0bacea05c64b8c571841e0f871c58f323f6ef891c30f1c8a1051a488226288a041240d22678cc061240e2323a8515429ea4d670f1f369d354134047d09cac08d0c3734dccc60b3e685e565cb39d37be4a4a12387ce1c3a24c8d123674dce1e152451c1980a94a82c54176a0bb3aa990ab32e168cc002392c88a382ab0a76a840070bd4e01258b00699d52120e968326ccab031c3c6cc0f296ceab039818d0980d001c404404a504110231863183e6af0a1011f365430f586aa811baa1b2e375b76f2e0b1edd4c1e302cfd58e1b3b6a786ce0f9c243c44e9a9d37787ee0118267071e20883a7024054331f416445bd01b280e3487a435b48a72e93c908618ba63a8049da6dd681310ad4004a6c7683188f020baa39de824faaa8968311da677e80eb412cd43ebd041b407fa4b83691c7a8846a26fe81fda87d64017d1363410cd81eea18fe81a7a4ce7d01b68235a88211410adc174701ccc06b7c122603518048c86d7e010b01943763019ae6286e129580abe71147c048be130ec0373006907fe8193183a016f807be01a9806fe326402de81abb80bf3403b8054c6cc626a31b7984ccc25a6969965a630b14c9b950640e083f9030833070750214184a50a78b00005342140070940c0010cc0c1061a28a14d27e6182345478c844600d500e7effca1438b7b090a4a059c5881b224c5891370760854969c38710505ed7421b4c345531394284d4d5008b08594a811a82c3569b14b4b2238a912e5244aca0853962c30dbc962a19aa640895a0ac1c9d2920817ec60b15544a032c5c9094f4b2538399962e5a3a82c9170029426be536697a250a942c509942854aa2420ca03d9b922842a51964208b263c5429db0c40475c2121306903b55404d29c0094fee9029daa1e267678a3561890ace8e147b5b2951aa5859ead989629f4a18618a0854aa447132c5ca2f55000a4d67078a0b769e40da71624398e2246a09eaa984283b3b4d2cd4d294a8294f55a4449500c5c9084ea65879285642a002e569830a76985828a8a526203b4be4ec8c5162a3a89450258a1311a02c35e9ec24b14f24904002025e3b4858b073c486b04465842950544a7012a5ca952925382d19ed18b1514b504e3cb05053a04e106169a9024ea658f91344585aa2f9d82962a3a0aa343979aa6265e949cc8a50a5ca93152756a648817a5aa262812a4e4e586222778858a8252950509aa09c84b034a5c98a1528544a08b233c4422d459560056a4a083e768458295050a4d49d2076e9c98a93a5a72925382d3d398112e18a15213b1dd8282a4b242c4541898212e18a15d90e100bb51455e58a132754aaf8ec70604fa8809330504d4b54a8409112c58915129ea43809814a09552a4065ca0f5154aa4471e24442083e2c1409509ea05871f25465035b45049e9d1e162a8acad295251e76290a4a085342a00225ca909d1d7629842a5180ece8b04f5544805a82ba5aa8a812ac44955005682707124a80828262c10e0e0b250a4a084ea8549912c25214d414a8a7252b17ecdcb0504b4f55a23839216a4ad3940a40699a02e50a14df01b350564aa8f23482930a7634b0504f55a2a0aa7000e5094a93d88e0d6b812956fe6989e9a98a033a20776ad8a5a512964a508007212c8d3002140f00b0f365a1445529c1c90914152753acfc0854a63041896280cf4e06b64a94131a76290a15284d502ae0a44a9413a8282a53aafcecccb050213c41b1c0d2939311a84c0981ca92152753ac3c5453952a4da85499120585ca1412aa24a0eec8b0504c5196a4448961a1a2a82c3d2d49a132c57760a03245849e9d1736ca14282a539ea24c5872724293152b509c3c2d85d034a5041a53942a4d349f1dab85e2d97161a138f1d96961497002250a4a0850a2961070b3c3c205a6344199123585ca149d1d2fcb14a54a53059c2c45951065c984259c9d15f6a90a01c29d4b4d15801245a504119c4445597a9a120295294e9cec2c81c9e081a105cd6f0ddc9bcdf6b3d63b1db806b8c6b4323dfaf578cfe75f4fcff77ddfd7bbcc54ecee6e6ef7833bca4cc7edb6b9ebe6eeecdeaeebe672efecbaddae97776eb7bbdd757f1dedba6e7767d7f4ebbaedeeba053d8f76f7d72d7acdcc226fd7f2e8f2ccf5a80f6e71e734479b03993bce6bdeed3aee9a365dba1d04887437a9ef8f8e865e2fb38db74bbb026f9b7638bc61d7d1deae9b9b2eb7d7f570d731d38e763f28bda0a3dd32dd6daec3deee7e703fa0bbfb477773cefd3ceffbe852dae0521b1bda607b1ef53aca0c720882d7dc0ec0a09b3fe80e3b6e224cbd6ec0fa6ec774b9bbee6370bfa58d036eb75e8c7a33c85c0f3aee2006f402767977bbf0dbddde95b1b79333bbeeb8fbb883bac9dbcddd75d3dd21ddfd7a756f0f69cabdb3e3791d8436a5ed75b7473dcff33c4a3da6de647675dd1ed80a601d1d9dd993276dd2ed76c8b3bbfb075b30f67a1e0540f7a4cd1dcc2e01ddbb949bbfba4166d760d39b9b1b6646c0d7cd9383508f7976b72165a6947aaffd983deea9d3cb71dddcea5e6e77b6ba5bdbda566bb7d56a6df74d77377bbbbddddcd2b6e9eeedb6bbebf0e38e59c0b46da82732337f7c00cacc5dd73177dc0c8add819dc71de8713779765de7791ef5769b72bd74297b9477bd8fbb9be93237ef2ea5bdbb5e874cbaebe69cbbe16800ee70c9641a7608807e31dd6eca1caba0b7db6e829cd7bddb2d07dd9eb7dd8b7bceee39a74777b71bc4d9607976cf9d5f476d6c30605148a7016d9edd3173b7bdaed9ec66dd4a9a520ff428a5cccddc71b7bbdd36dd5eda5d1736c7ade59876d3d975ddecb83b2cc0d72debbd809b3673d3a64d9979f2f6f77dccccfb639b0094f9a7797bb7bbebfd68f7c7d4a31defecc066baa1b7bcdccdbccdfdb3db4dd7029ad7b4bbb7db66973d5e5e66ba5cd7cb2d33c37876bb777a3c419edbdb8cd371b7ccb3bdee9a32e5ee3aef6bf6b6692fb8ddafed9e61d38f6977b737bb67f786e118766c0cc39f7d333b3a2773f7722c0c976d7ab9576776d7e20de9584105aff0d51c762f2b51a69e3752cf1b80e779d4f37e3c01785e00c6eeee26a594b97bf2ecbaaeebddee769777777227e99682fbf5ecd9755df7c74cb9bb9b524abb6753eee56e4ab79b6ed751daccb4b997f2d2edb6dbaeeb3adad16ebadb743bcfe3a6db81dbddf6ce9ddd766f37a5db75dfb7dd323377d36ebba674b767ef5266ee8984c7eee6e6eeddedee66cadd761d737777ddcdccdd2575403c8f99bbeef3beae1b27032024203814c81110103ae7ecbe0fa7ebbaafeb7c187545f3fb70e6c7f39b389fd77536ccdc5dd775dd31cfc95dd75fd7ed761c534a41ca94f276dccddddd5cd3afe3ee761b491d4850d03acb273c55216189848ec8088809552c1055011394285196988c8a8e38ec889111a84c910205458a1385b0f4b414c25315274645479c1c596282d25401274b539ea23018ba801c425e701342d31429519c443595004584a51066478e8c30058ad4396189c94994294d1528c18aecc90228a8a5272b24548972e4da234b57aa44597a7202052a84284b4e8c3019151db11265096a881011a63c2d5d1152a3a03c2d51591ac14906468a8a8e84b0e4a44a9495139ea258d06a5abab2d4e4c404282404798d50a5c9c90854a68c304295a69d1b139642a032c52709bb46969e448852a5a9098a0f8f1512a044412d913025ca7d2a5002d4acb5b404e584842a215081f2545f50322332a110a84071b2f404c50a095588769aa044a9d28441ab4a149410a63441b9e2046a8a132a53a0488922820855842c9130258a4a094f35074984a81280905002159f1c1396a43889a232e5c98a93285053487882120575c10dd48ece1ea952e58987290a940a34355579c2a00894a5279e1396989c4499b044a5029fa8a5117660505150534c58f2e1d608952a53a2a24081a202e529ca49d4141248a82223f788095344587ab252739ea02c3545e9b94265a96fd688132a55a6403d2d5d71120295252b56a038591a01ca539528282751262cf95ca1b2d4422f23786b53535fd8a235afc64d4d4df554ed7b529bae27b5393535353555eb5a2d3ea9cd5aeb496dd65e5353cdfd646a4ecda9a9a9599b9aea273b35e5d5a6f8c94e4d6d6d6a0aac7d53535353357e32356bb57eb2b5ee496d4e4d4d4dd5b82753739fec546d3ea9cda9f964a7e693dadca9297eb2b5a9a95aadd675cd7b529b5353dd93a959abf193dadc27b559abd5bac63da9cdadd1275babf193add56afda4366bf3c9d6e69308742cccdd9d244041d9ffb573f77b03c2853a8462335675e6d97d7ef888612c833d692465dd9f6b902fc31840104690fbbdf110c434c2889ead06a8fd3a0a41ac2f4d88ad1b049c43eb6bb34628bde0cbdf5b5598dda452a8c695b496534fbd6c216043e04b7ece9194e4ba882cda576ddb8515f5b2f57d81af08810b5e68827174e4853aa5e4c4f2eb3d9daf96aa8ff679cb3db2eaa379be6439e501db689fb7c82d4834ef0a7dce7b96ccabe7b8aee5544f579b78beefc148fbbaae3abd9eab3f7cb56f57ea69fbcf23bbc631b77004c60c25ab288d7a931e8c34eabbddd5e9f53f504a6ecf9679de50830d1a9845c01cd96066a4db1ad83da37b3be02bf369fb92eb34bf7d7783d6a715b8208cd3cb9065000041a8f9dcaa4cd35b3498f9929fe606711ef5bdd3ae79d057d4207497cb57e4601fac25c43e2af6b3ba949a5be4ea403df4341f7acbc10e995c97b79804b99039f4292e6979286ee039e89304bd45864e45269f4f9f753768965c5b0e9225fff4d695ef9d7a0f5b19359f7d7aad9b3c02ead3a903e069b8facebb090833c4d1b1eee9dc7f644fa4c89086ab00481c1c37e79c9d37072108b12d7300369acfb9101bed6d86239e3eb765ce3ce7cb46b12f978de7ba0eac3cfb4e8fea989cffc3464e73cdd370924feb511d1327cfdeb1ef74aebb43a612a6962b9ca206dd9e831e5962e03b974281bf29d680bd5bb56467fa6ad9be5e765d272ee9dac3a444e1d9f7d9d99d8d986c07273b93d95526d339c6469e73eee3917bab0a33c26e32f4f01dc975cee9b1c71ebfe29a1db2de9173cdaf68db21cbb65f710963e1662b09b04cf2fb72d1d7616ce4f2f5181b81beeee33f6cf4f9ba8c8d3aafbd8b14fd236b20e8025d8943b2e7f3968b6c3c755086a7ee9241cb536f8901eedc61dc5b0c62fc4e1dc6bdc540e6a98b0eb6c28ea40e82b5d99125e761ab4572e00c39703f045fe4d256049da98789e79c7b9ec8843ae89e8dc7e4f33c1b0ff4cfc196cbf75baeaac1e72d6f3171deaaa17fe4fcd614357079cb257640dd5599382fa943d5be734eec00aaf6a133751d50f76ad979585bdc82ae70c5b096521f7a4796f43b7f91cd5b768d4c9a96976fd935d2f9a4297548baa87764fb8b5c1ae80a5fe4d25cfd658d746a26adca243a75d1575492a48651f476256691095d027a574bd1c1da03bae79cafc884ba587bc0cae4f3ae235dcef4799fc7e4f3be562d3b071d6472959d8731d4f1d441073904c932f49e96ef83de913dadaa01e7a083b59cdff93ed8a18b0cbd9c1f82de72b0ee0695a0b7b7ea06952d77b0962eef48d0959a23e777f35de47e6b7e5712fd9649be7022612cbf6e238434356b2e0e7788c14b3bf10443d59cd3bbae73cfeb3acfeb9cdd878d9ee8773ee795cd66c3429bbe22f58e7cfa9ea3cfb9127724577dba39e3b8e029ef06754e7d929e7764399dbd450da67bb59c5f0f93e99e4ff7ea74d74f70c10e39707b929465dcb1776207ae5f776d123b153b00ab6b83d8f3c869fb8e2cbf67c6f2ec5c1d2f18590a707219a783e0ce0dc8f0d329599f9be064f100a133393d24997803f6c9f386716f2ff4f02ecfe35d1f3a087638c50d3e6fb98b2c5bce04bacbe5ec20933d4ba8cdf6a2d3ef5fd199e417bd90ee06bd9c73266dfc45964c450dd86d6a3959d4807d74a51ec91e26ec36ce6e53c91e26ae67773d579e0d6a6feca3a5b533f9721b4fecc0f5a1f36c523b2776d0b341ed61e5b1711b72da7ec50da6ed871b57e2b18f6eeaf6acfdd53913bbcb4b57e203d4a270b99418a422074a3e450da6b333bb12b7b884ddc5e4daa0767083daf6bb413d8191dab0bce8ed600b14ebcb77835a2fb76991653fe836a04d0b74917cb27985aec4afd06d4031f41618d6dd21606db9cb79fa32d9dd7875645957eb731566c3de0ce0e432d2dfdb0b2c4c2e23f77b7ba16a37c80246b2bf5e6c48c24c7691a2bb77d6dd5a9af0cb24543bc72b88a228860eba288aa2e8fb23e60182e0b72414088220e8fb03a2a0d56ab53ef7bcd56ab55abe3fad2ccff3be25a13ccff3e000976476708acc5196713ebf0de27c4928ce3976cee9b7496c80dbda2425ed4b042ed3483d075fedddddddbddd9d83b30357a4b5ac951fe934eecd2acd73ae84761db941e73977e0f57ad9b8e8a183fe7abd5e2f108020e8390882206806dcdd395fdc202fdc20cf27e93476ce95df7bee79b849ec9e8b9bb4ef39935e17e0f6b20b8157b87772fa4ee3157e27fa3e0b0b01dc1d7089e71e75ef5b9d7faec4b4e59f77947e5d0bf4c82bf3297965fef7b9c7be41fb55a6cf3ba708f8bc6bd5b2f62da7dfe74a4dc992fa6c39f8cd39a97f73cee91f65ffe69cff718b3ffed827fb6b9deca14cf650a724074abf3b8486d3f3dc69ae798a0aad2c7962801db2817b64f9391375cf41ea5d9f9c36cb66fb289cffbc3b2afcaf032bdf722576914f4e0378de20ea51ddbbf8a9b7c827974775fff98a4c9c7ccb837ccb5da4d3007e6e10a5adba3b848a1a704e7d8a4aba5ad6be734a7e1f39bd9cbfce91253b7da2f5abb56f7e599a739023f7a7d80e4e7172e4244303fbab65edbf59b2b7e779ee797375925a6f72bfa7934e3d3d77f2f11cfcb8f428cb3cd2f3eab2ecab5ed764d97e65fc266ac3f2e5e74e5e1e58d6fc95ef3f9f64d962a2ce0eba573f32f4bcfc3ecfcbcf9d3e2d2960f9a72bdd4fbfe23d54ed3d9fa212cf95da233bffca287e9777aeea34f378da22a3f8a9d79e25f3f6ec2c2a61efc8597ade399357f8f38ecbce9dbca747bab73e4926f69dd5239bcbf99f7fb59cbeeef992fe12aaf61a2c7d5a99984cefcab4cedb9a1ed5087a80564616adb0bea44f9f8c564626e98759efe4fd151cf135c34d9acefde2952e44f357429be9ec2c76406db69f3ec525a3eda7ed270ac0d792ce3befa6ebf3f5cf57d4a0e5dfe822a7831d79657e39bfe593bc32bfd50279e732b599d537a8235b95e9737064a3ce435f9fa26b3eb8a292ed6e4696b95c48c9ac65ed27d3e7a0cb376986a46fd0fac8464223cbf6fb8ec9e760a52c7b39e7d45b3ec5b9656cafadea13fcc8f2f39683e08aae5ad6dee5932ce7f4962bf524cbe9721074b5beefa7b748afdb21ec1cdd21ec2d5f5103fab34536ef10f6d200b5287eee107603d4a2f8dd21ec2da7fef66d91936a6c1fbff73d32e8d7bf197e64c9f9748fec99d5697e577dc8d86c0f80f76687066caba7de646d64e2fc822fb93abdb06cbf1d9c5ed8689ffad2263d09fd0febb515814fdfad5dd5b22588d679550e6d3af5e9858d604f9d270998b16cfae98565d485be847db96d2860695a3a9faec4526339bd3cf572db78ea52eb63cf4e0046891c941083c666a3754e6993b4d10eb4c0430a3b3c41d3b2258836bd2a87b6ae650bd33caf12006d7a4756098026258407d3a59af48cfac47aea9d4b09e181e75d9552ea1975af4a09e141e7b34a79cfa87755687b567e5feeed36bd5cac4501172c7e90e30c203e00863ff524398c4babcdb0c51338e02085190f9880b6b4f552c803b7d968d30b1b5df0d4f78756a669f52b648a6bccf40a9cea59cfd6570714aabdd6459dd2a96f9f21785ab9b2a3ee552a5d2d3b6fea22b29eab9d97d4a777de24f515996c172e7c577ff840cecba92f39b2e4bca906e63d2adb85d5735e5ee03baf5259369eeba80440cbedb98a15068a22654c514b13ac6eeff37bb3eae1410e39f207a9f5a9d79a356bc0d05a4ebd66cdff6003c2c20664b87ab2e08a8832b6282bcbc6ff602b52c614b62b01d07233c1b65d58d1d6cb0b3c97c2b2416b55dbb2415b2fa59eabe5f4de22e5de5a38f351f37fb0f950a3882c6fd86cb4ad52eb535470d0c10c2c79d86cb4afdab4d86cb4f5921ad15a5a59a7643b8b1f1429438a351fdc7c400d1ff6c8b2660d0df63cc5358e3b215a00f3e36c41869f9361d8da519e544d37697f9d525189182c6cd1751cc7712255d2cc5280ebdf6dd29c62c7227b3e2cf37ebd4d9abf2dce1a58f0f21ef3c2c6b7fbfc7c835d4829d7715d8b012f70c208ae061e569bb3085c2f61640fc1a694e47c4e8fe33a6ff7388e033bd287659cb3386be09057e09c2a719a6b9e7a577d58c6d5a5949c4f99c300a77f9b346bd5190f6359fbb749ed4abe4c926ed0725d967d3de711ebdf2671be0e723dfbf3eebc3b6f27fabaf6eebcbb9df36159e7208794dce794300dd49598a7d8790ff5f9fc3d7486ce39affab0ace3c8f91fc701b2d34d6272c2403769d618de7d36c869aee10df69de61a6e83b6c6737601d739a79bd4f93ab74993146219e7c5ea87b08cf3157b452b43627de4da24dfa0cf3997b1d1c8b2afe59cbbc8e5d9e7de47df8faf8f603cfb9cf38de37f6cd27cce3b1f967dde2c74a47fdebe82998fb1ec9be2e73d9ef7f3f778d569ae79cff7e6a5eaf7e6658587b1ecf3ce897eabfab0ecf3486e83d657a41bb4aec41d397f6ad6386e21c0f9203845252e0f9dba478abe9b043ae720486a50fb1535f0983c5f0fc9d2f3e9e06ca7bf372f5a9e6e90a801c92e929eb7c8f9ecdfe722f9798b9ceb4afc91e5fcade5e7eb20871fc9a0cfcf9518ecf02339ace5fcd0c1d057dc20741748c38f645f7183d04104881ed6f2fbb0e5537432414b0a586cef545a20057aac79a8c50a23830abf0e55fbad1b8221b92f92a5090f2240aca5090f7ab8b59cbf1e3a276ae07a77b952af92b032b93470f95627a92ffb5d0f56a6cfd94596df8a4cd83fa7b9e65baed44adcda27c91a382915e04619a997b1e7bed1d9887322ce63679e731f36e2e7849e8b3de7231bb1730e63a3768ee37c7fb8cab4372de003c61c70bb9b906514d6848d4a1fe3f3e58a419d73efe3fcbdce91d8a88c29b151f971c046e5f8848d3c4fc246b1f71c84156478cf25c046f4bd5e33eff520bde7cb463d5fee16ef71aec43e20939e18138cf79c3f86f59e83cb73dbc669aef91dd9a8dd73181b51f7fc63a3e99e7bbe3f5e65daac0e036ed3b8372b355f7e7be301ccb7efb33777393e7526191ba9702b63319f76dae106bb36e0e432d27dc0e8036cdf9f72b1c874d338f62cc444cfced3440b150a6a506159515da1061bb4ed19d57fe18118b64873871d52d0bebee16af94da4679f4e5d09a94b1ccf9ea4007c3469a5cfceb3fbb011e75cc315670d7f6f5dce3cad3096cdc5ea17c02dd2612cbf9fce1edba4308f67874d2e2365d9baefcd17fbf671ccb77f1178210d4f1f4626e2f7964315cf39fcde6ef0e165bf373064bc83935c129525ebcb9a13dd9725bc60c5afbfa60f634ff17bab41869f647e6f19c0fa21bf371ad44c7103171768dee9c9af6fe0cac2e19da66cbe8c02811ab11cbe8c0a930308822fa3560001f725941948008009ac2fa1c660fd2ef96c367109b5ed9a5f27e7832fffe5198278ae8c9f0ebe9ce6530729c939b8e206b496738a4cdab9963d8c79eaec2c6a407dba5233b9cf9193ec61c295f1d4b932be84aa3d75ce9974da356bd670edd9b931e5b8b71dc03cf9e4831c3219e439922be3a7b8813f3b25afe8cc1ac54cfcd9959809c9c44e1d64b29ccf398b1bcc35ef34d7705d7b964c6fdf607ad728706f3c1cf151fc5c2dd9afcc6faf7d2bb1125392fc26c9494681bf5ee326ab017748f3ae9f0eb26b93925c48761629bf3deae66c939476c06383f6cb45a2b4839a2db2cfb59c3ec50ec09fb59cfa2bfc233ccd9fde82b946300c3ff10ab5d9db0e4ebcd3ebb549abc7b77713c9ee97fc65f7ed200d7793a6cdc9381d9c220546066717cc64a6a8c489da6c8b868ee1ce746cec4432d39cf9759eae8984da7e1df4c21635d833def77d5fc7dfd7f3fb3e4e6633bd5b63f303f87beb02e6613ee0f6d19679a18938de00428a321aa0ad7f7d54ab41032eac81822c2cde9081b6be5528a4dc01dda0aba57fe7df76379465b58cea9feef2918d40f740afd5aa65cb5ddef23c6f0fd9a8e5eda047ce075b64e853dce0c7539685b50cdde51eb91f9251fd2d0727ef6c1b8fdc07c97d578bfc61a3dda0d2e7a7b7c7c69fb5ec9cf376b0e7ecc8fd014cffc828ee61cf5d2d4df8ce972cbf16b7bb01a9b8df4dc8326759bbe73e2c6b5f5189a7c44acd4ec972bed35cb366cd9a2f6bbfde9151fdeb93fc58c63e45255bb93ab28c7df4f961a3fd181bf9b7cb36a9bfdddf35391ec0f5fd29a7edd941b23632b5ef97d3c6bfb716ccfc7c32eead85323f6d4b2696df5a4edb1f2dc8e18a4aa82f7985fe3a25978cbfde6459fbf6dda4927acf12d7d3eaf4faf52de385bedc355fb6f3fe92cbb225a711e3f4f9cb45eb537472a7f1bbfa4c9b1760834d82308a0f18a9735d64789e5f15e66869ec1c0963d92c633f7d45109ece2870195c06c10d6bcdb322b853c6bd557d79eef7c665ccef0d98495d8969fdaa05402663cb5ee064c0b8a2016a4f69adcd59802540260470d25e96979dc375160f507ba6ad4e53bf5eb24f28b880f9bd6dc9836ec17a0a82533c40ed976525fdda77156c5109c7aec4e00c3bce49bac1fcce7b3498df7957bf9fce91f3f787f6e41e4026d399a697ed3cc92438ccb91a2cd2183e7df0c5f563597b3be5ba0dd8d9a84703f6f6ee7c72ced44ebdebfc6323eec2576225aecd39cb80cb80117c7109821ea0f6b151397fd68f65d4a983af25633bbbd3d453a7aec4693ead150097fbd54c26d961a4dd0ece90f612f88524b83fe5debe1dac73faf2fa96302dc4466592246c44bd5bdf5bbe7cf7f8dd927d3bc821a51f1b31b17f2c9b3e7df968ec593bade5f74b6f9665d429cba697e166fd3aa592e16869eb2bb22bf1143560a7f50bd988f7c66480cbe014620e31be4618a79771ce15c621e04619bbbddbbb5b4b1edfdddd4e7ffac98c969b162def6cc44e47362afd270b563f7b197ee94c2bc32f218bd5ef2d05361e00bfb714c63cf8da1fca46b52fd9a733619ab58709fde9f4a79b60b3d96c4ba8732dd9a9afb8a434e1a9d3eac4347dbff4f6a72bd3f82ba4c6736a01f7a714fa6559f9f58c7d1d5ca4b1f3f955c6bda510e6f79682ed877e6f58b67816953c602cc7710cd9889d7dd9e8f3ced93f16957c5de7e00ce78353ec1cecc8a8e9a484b28cfa92f13b9f2207fb9dafa8645956863fb95ad69efb3e57ea8f2ce997d4a3fa3d5f5109e74a0c822b762da5befd234bffcf3bb25c9699f09f97cbb2d2ca7f5e76be2c2ba5fce74adda4579da4bebd23f73fb2f479eae00c3d72bf23f757ec807e73a4537f3b259765d35754d295b2cc9b5d062cbf76e69aec9ec9f9932c4ff8e9e04e669b1203dfe4f41597703f5d899ba4cfe47e2d2d17ea231dd1d9657de4c375433ed920cf4752022cf3fc4582c032cf6d480f58e6b948c658e679482ab1cc73902c00cb3cf7417e3cf35c875c9e6d1f71c0334f037e9747f46513d2770e736b3cfca53613e603ce902c630fd627da14ba389906907ab5449ae3e8257579eb861cca1a416ff9487edef4a6e736def45cf43cf47c2ab50d2992e1fcbed2cb28faed2d7264d9573dee364e9e83e3386e0d8ee3d26db9bbdb1dc7110d390012d2779502317eb1989ff808a2382496ed929111fd8ac182038b2601f62c89a25f7e5e56ee419fd5e7f459cb9e2551f45d3e6bc979c95efb56ed096b493ff4567da2df84f42daf3df8899f8845bac8254312ecc2d0bb708b5f17d922cbaf847d9f7b5fe5603e48690158c6759d73ddce675eee2953ee9e7b5bff8a4bf6f65c27c95f13278705e4e077a6314ea74d48bfbbe34e2ca50d5a18c771dc2881e79c92538d713a6dfa798e0b3f3add18a7734362dd1b43ba18a77f4dbba98c6b4e2c19112c1958932107d304e3f46e427afaa1e17c143bc026496dd02c89f636848f24c0b389a4268eac3aa43c01ee0f8c8f864ca3a1acb1fcbe29c7580ab9f65b3ece461cc7fe79bbaacbe9afd872d5a6f0bf4fe6f39bfc03b848e38dd36f957be6d73de016076cd4f9ee1637056023aed5721bbee5e51192f9658bb4bc2cfafdf952f6365e0e11226ab5bc56abe543672cf31890c9f9ae16bb7ea0ad56cb6bb9b0f4b839e17279cbe718d0f5b1ec6b81b99a414c31df8d57c686b246cf27186314f7d3f90b18ae2dbf2129cbbaceb956eb76d36ab56ebcd56ab55aa3b75a2d9f64d888bde5f3c646d35b37b575f38465ec23fbab8c8d9018fb10249b4ed06ab55a2da46fb9abd59aadd98a6133185d5eca5e6993ac6cd074d8bfbc0c7fdbe785fec6d79d8f62a2dbf8aec7868037e47cfe905c3536c77843ee831dba9a90cc3421c5f8f99279cf4472be8decdbe538de2ed48e437e3d9bfbf591d22441b77b0082ccf3febc91d888bdbd006ce4f27625d0bb09e95dde22932939d05042896fda34ef727086a06b7e6cfc742f8d045886c603e3f46fdff990127664c2cf6f8c8f947ad6f90ea519436fc2320f58d6b9120fbd31967be63b1f3a632ce7972f6ce4cd316ce4657de7b38723d8288eeff68398627ea0aec44cee37e9a358cf3affbeb11c6becbb490e658d9df7d1acea59d7f98ca3ebbc091b85deb90720b05198ee0b18367279e7f38a8d7ae0e9858daad8687a58abbe9b358ad25f91ebcf06b173648c652c6b91435923cf3ac6e965ecbb8ed6b9f7103e5a5ae7714dbdf3fde92ad3bc71536c77bb7b669cbe7c46b7ceadb7971cb7cead3371dbddee2e377b085acbe6dcf3b29bf376ce999a8ceae79c7275418e2c857eddf30de27ac8afefa4be2ce3b8eaf36912e7259d4f7d7224d1066d4929a54d765cc2dfa6900b703f96351e61a5edd44bce979bed9ccf76266ecef2eb4a9dd63dc0fde948ea5afe82df1b11677e8b97fdde88e8e1c588f99ddf9b18191eec90eb815e3518fef29ef75d95e12b5bb1cce3aea41fc525d7287ef6ce7b17ccbb5adae078f9b9d875be7c94e39dc36a1945bf3ecaf15e1f3d875c9ebd1c875c9e8d65543fe8ddabe59c4726d961b4a951f4bd502493ec307e35aadf0b7d39177d8a1b304da7ef55a6b07ab48ca23c497018a3faa78b5e46f514c37dab32b17bee7160e59c2bd374ee5bec80fb59f93de76ac956db2ceb1f96b52c8cbde779e794df7329dff4748fd23ff6a5142ab1a795693aadedb4321132bcffde86a0e1b99bde4d51ece066f5f4c1451af9f6f4411a2e1f75b58ca2ef390dbd9c47fcac252de77be0865c477a5e3ccfd98a8a4abc9b525351c9ecbaceea978daad8cb44b2556cd4c244b24f9dadd8c873ea2c2aa1b7f7c825e96f0720c755e07b955b984592b0acbd89cb5dde5517d9482cdb632cbf6f9f73fa574bd94bbde794ac4bd8eacb287e6e6116a14edd23cbda7b9c533f272ae196d66c7844022c6372534e5492c29844c90da41ca55de7799c472793f1f9e93032c639c718b796b4e368f3f46c4a137e4dad9b9c14e066307e0ebef607e42c63393ec79efac7465de5402f3fa432eab9b2e9b9d20ad628c42c63a4767e1711cbd84de803b06c3e2587fc24cbaf1cc72ef6732c7de9b75afef1d1d872ca46adeef315bb8f73ae4d3126188c01c418cf714e9fab3d9cd7de59367deca3a1acb15c35b2e9268cdf9629b7ab65ecb9557300967196716e570e58c6338f2d33afba3792100d21834548897f7e77a362ef2ca3b2a7ce710e8235a4df2813362c61bf2ce3caeced9158466bd9b458de6c1e401094b18c0e795ace6fd0e59e1253d146b411c96559b8ddf75d2d9b7ede73d095da25d2ddcf3b07c15d727f3eeffc739afafd9ce6af8cab2147cee56c7683a8fbb0cc4796d15a36217df357b3995c1968ee98b669c3c26203cd933cd0604989c0881ad65cf1d090012e1a57cbd73fa794524a5d89859e52417ad02959223552f9f313fcbe394330865eca64e1071b7d623f4fbdf4e7ca214fddc697e8a98b3ca3cebd26e9721bb2943de722590a3d579fe88364c9c173dea212171882b5e9e73b679189d4183a42b0c6739dbb48fa2d729ff448ca322434bf426a36937a015ee19ea973cfbb978b0e7b97afa8242692e57cd1c6575462e34a1c9225d287bea2122506c3a80f43b214fa8f65ae6a4396dfbb6a19c5bd285ee19e8973ea477bb3d96c5a68dff40fbdf4cf731f36b2f97ac622e7375ec6de73d70cc3e532366abd9c5d888d5ace4ec4466513d28fde029d7d24479685de223f9685fe224396857e43c678163a475296856e43c294887559e6a08b2c3f6f7d3fbbca91b4be983ac1399d58ef7d53cdc80e96abe6db29e5c872c97c921dc625f3e5f81f183f07818d5cce75bcab2ecba82bb5e72df289bec77de4c8b2c9d5a62533e502172ae6788efe24f7b78f40a7ce1eb693cb5456cd7395a96bc8b239b15acc654c2fa8734db19fdedfce9151fc4b30180308329a6273fa1910f47670722d2ae9269b9cce93b7805bcbf137ece95c476e609cde39535729cbf018d9c3dace9551f4a7efb402dc2567d568f37b1ba24acd97e1b31071fcf4908d989c318c7b13e28cf87b13a28b9ffef52ce12f4ff80b7c8fcce0ac1a5fbf587a94f909669cceb21d13fa88ae2f159d96cb715db7be9e67e9267d2445eb9649a31ce7619d61cc749d83758a41b365d23c77d53926cd96499b69e62d6b92d30c39b1c85986e346d05d31aee51fe7794739a7be2e6b6242cfa6cd5541109a555f7d82f4eb3bada4f4ac777eb1d2b332b34bd9aa91f5919410a5ce21852e2ab91ce4a08f3e6f75eeb918d66fec2329d025d58a791f49795cbb6a933f26c0fd29f9f6ddec94d6726b29fbe6762cc6725ebd10b62f578d1a3366d0a04993a69c655acac65fde52a18bde522e07bda53e97e2bcf3f61d5f75653db3f152c846acdff6ac440ac13a6ecfcabdb56a8c3d4b77d5cb79c5618d992a018e5aaa64342d5b9084689e6f91d13adf12a36979b9962d1f8dba962da3962cdecde634976bd922a3b55c4b15114dcb16245ae860dd2244036d7ccb109aa8a5ca87a6658bd36efc55b7c468a36ff9a1bdb46c91d182ac91e95a78b668fa16a755b07e43c2b668fa48e6ac91e92f32b643d36dc86f8ba68b64b846a687a4b746a68364b746a6bb48ba46a6b7486e8d4cffc8dda2e91e69b346a677a4b846a673e46b8d4ca7e4cd1a99de24ce1a99cee4b846a64f8d937b003bea5b288d139adc94f3be968bab1ad2dd2dfbd9e11aeb990f900a82d0a693d180fb5372568c2517e6cb485511d1a84bb567a15539b4be55118da1a267d9309eb8434c15118d73a92c5e16eaec5c983ecae265a195cb00685da5a4a4b80cc0e332009a58a56a414cc1a555a54ea062a2aa882c8e584393e232001a57a5a6dc0073c697306662a065f13c8b97c5d3b225a47540fcab82d15a1dd755e02e7a8586fbe11406e35c072b88e360512b5abd459712c203d22b933d0e52bfc59cc73d766b5188fff8f0711f395c05a35131cf9db5e336ecfc53a5441752bd56a991ac524a20e83d558ade78aa148d55a9f6dab71f556a6130d7a95214abb182546a7513735795a215544a81d42d43689fb77c6c7d3e554a080f78bcc7a5c41fce2ebfb972b9d4a7e3ad9e2a253a4f7dd233761f552aa74a0955a92d43689e87558a8ae92c313b95b31c4ba88b893f6a9733ba14bf5c8adda6ad9eadb06c3faa54e73e2a4e95b2d233f69b2a35afaad455cff88ad12c9aac2b0ed6e55429213cb8711c976ab9541511cdc5dd70aa54cb6fea1cabd47c55a96955a5daaa671c56c6b24d311bc613775851b055a5b46c0969ae4aab8868b44ab5ea44d355a98955a5d856f9363b3caab0a30b24b4c032b1e697106cc08d327ec8e24df115471401c31779688046ebcccabab2c2a2376abbf51515d35962b25a4c57b92f68fa0acd155739abb6a25e3296b766cd1e6694918506ac68e5aaf8364940c61921c8a1cc19b4a53518192063092e5cc8415b5a57ce36b39e7d5e314e2f391b87f52b64aad626fb8061a279f6d9be6a16eb77d69274da39e74fd9ede795d3a5b594752d658fc68b9896abf1cfcbc5fabce5a5ecd755f22d0d2c0b87d5e4947d330656f9cbcdc19838bed0f055cf98394ccf580cd6f3989eb1992f67d6623dadb2b2f9125eb9aeb26e46353726a0b9b9b1a5b9a9baa9cabab1bab152337ee9190751f525ad2aa38717349d1bac9b9b1c3339398ee33e7c549d2a631d9dba1cc0603855090727a722e5789671e6dc54a1e9f36a5e95e199e69b685c4e7533cd78be34aa9b89e59148f61867f57c9619613858b38c192caa2ca3df54cff11caa1bcf32c22a0a39f5e6a6ce3450b5e75b99e9e5bc2af3fcaae528d6323682b574572d63ad5acafeaba5b37b24df560d1a35612ca1830d6dd0c183d4c24195c5cc18693c4193e23beaf0c1c6c5c6019a547731460437d8ee688226c565b6c461870a72aca1717093a64a0f27b2acbe501bbda261a89883260322cd97b40acdb3f34d56a68f84b0fa08c94c1f29319a3ee2a067ecb76797ddc4f46cc774b5fc6e5c2dc7323ddba7b58c290581d5b37d31368c03c5edd7a77268377e33060736460cccc5f48c711c965351b8a9f40b0ebd9a586a5e63d5100e9a1dff9126c76f6e2a0a3caee3b057a5caf272aa988fdff88df3d8e3e3f1f0f47cbe7d9453739ca7e5db473b75fad26215859b9c8ac2e82e9f5633745a158a4e6da28db79a9ea9613559dc37eff31ef3b5bcc5b45cde615c2e24d433f6efe334dd68a873dedce8595ea02f8daaeb1c24e99789f5c5cb8935e64bb6650975c0eacbefead9594d1f71989eb17f36b5fc46b196632cac658cab1a066bb96a7e7ac961a62dccaf99b73d87995833ccc49a61a69a325f26d697ab2f5fb2ca3c673d632d561f8d2f33398e134383e33f7ea4b9711f3e1c85d17574bca2f072589582393bfdd24752b1daa467d373aefa48ea87999f8ee3523ed0fcf41b97d249f3d347978265fdf497b30bf5514e95f56c3a8ed04f77d5f2bb41fae9ad5a8ee3eda77f42afba3d2bb7cc4ff784ba5a7e5c2d475acbd897df772dfdcbef6d6a22dfb401ee4f49b39e1ddc3e5293f5eb6926ad5c33bffe9193b6687e17ebcb3643c3f4ccf6558d56b12fbfebd4d6472da667ec7e15fb325a557ddfd8666849b19edb8c18ac3e5a9a193434cd330d2386d16c5657f5115516cea93cf7c2b4c0305760ebea8b5349550dd15a0e7eb1ea23aaceb3705eedaa8a42e75d6dabaee2315ff5ec6d66d17c69c6ac58abe9a32d93e63d636f33568c26cd17ab31cfce567dd4cc5f9ec73613a3b667b682622c5bcc5c9ac7be1cbfa46196366f334d9a8ecb4261dec44c3565c6d8b06e3d63aeea2333657ac652284c343d636fac9e7149c33c7bd9629e69983ee220ac50a30d1b5ac882c64ec5f451cf80471e3f00b1c31434763aa68fe69615cc58a3660d1934767aeb232357d40082355bc8d0d869993e9a4adc1143d50960b0d1f8cbb3975ffa486a5ef551cb993d67ced9adf491d4540e8ddd843e72550ef4f8c2d647addaa467cc3eabfaa882e0ecd3aa8fa4aa86685f45c1ab4f50e0aa949e316f9967256d6683d8dbccb377f76c2f65cfcdfe35ad1b3b5a189bb41caf0a69b19dcdddd9a45ead79a4a3ada446eaa2deb6ef1bdb38dbba530f590c78f3af4ab5edc6b65795fadc43f3cd7997f5edd4a5c22ac5592cc68ad0d8b2b9fafe1c1c5d58df225b7d87236349b195d4c492da69d5448aafc01b46d371556a66f914f3da5bd8b6d68d6db65b28d4ca129325a6e51ea301475f1ae8255f89ae79c57939da78b9e3abba4dfdb0c4b0c6c03ab255ab8e5f8d614de5d0bc4aebaaf76cd6a5d1ba3deb576db28b0b707fca99f5b9e7eb631f75be1eeb23ced7bd8fa8c8b5ac71a45392ba474ae9f8474afdf0a91c9a962d228dba94101e84eeb954077ae75256943a67e3f4f689feb9d4f6ec8a6bb9cba584f060f4d6a2e17ccb7c3987f5edca711d9712c2031ccf41e3ba71974b6d964e95d2b245f4e13fb4540d80a6e35b264d4a080f60aee3523faa948fba65d274da6175da7ad69e53a5269a9eb5e3d42d93e6aa524237d54acfda5b55ea49cfdac7ba65d2b82a35b17ad6feaa2e6553b74cda57a5c43aafa4c2ba65d2ba2ad5a467ed609d563de3b0a8d5772377d5f272de2856e78b46c8db2c9797138d8bf3a5755eeead55a77268d497e6f9e74bfbbc9c62be3db223c79e4de7c858cfa653d27b3627ac36d9c302f7a7f4b2befdeba372a45ec64a2f6548f6189f38ef7cdd65e3dd6ab92a0a22e8ec7281158556e8d4b78fc28a82ebe5d3b78fa842247b8c4ef3bd321bd4be34aad0a5aa8668af8a0268535108bd4e4da7a68fc44a258ab553d3b3f6b05285a1e7b38c574b072b1508cedbac65cc55a95c9ee5732a57dd313d6ba7b51cbfecd4b42a55cbb37c15852c730d4d08ea4ba36ad529a6679e0dc91ee353e7ecf336729832ddde80b8bdb7771dd60c13a68fbe2af589e92371f5c01ad347e177eb23706c79fb2cd347ae564521f655140690456be748247b8cd4c1ade574a28e648f5183dda032a8642fbd32f389713e3196de55a766cdcc30fca557c62bd347334ccfdabf6f1c63b12fbd32df3d2bfdfd6dde9557c6bb5a36beecb03a351dd6912f3b5b17a6b3716238339c18d897140d5745d1b8bea456744c49adb82ffbd669fa4bdf38abbf94c9e22b5b99307ca5264c39d5084d5bf9956b46a8fcbee76d8c629ccf5ece305ed6af90a9afc6b18d1770a7082d4ba3a1413649d5105a96ce83679354511a27a90a7d3649150cc826a9f2a9609354fd7839476859d8c6be65c2364995a7b349aa5e3e3649d58f1f9ba42a486c93545d40eb2ad579d5106d9368a90aa2656935365afb964edc24556cb349aa5caf4d5285336e922a9e9b4d5255713649150634ae529c570d759b444b168f56254463dfd2de26a9e2689da44a6c6d922a1dd726a90242eb245516d0ba4ab5570dcd4d52f5f126a91a7b9354c5689ca4ca6949aa64344ec2558afa540ecdf3b8ebbc1ae3b8ae8e5da5aa8668ed5cfd7a36bd6a88269543a3552a4bafa175dd9e4d9fcaa1550dd1b87a4f7593de8010337b4e71c97083d81b882b206a78a7716f3c78f992fe0231435878b1e546939a9a50a85165a309c13ee52ae30b4d881e266cfc3c5233020d31676c208f2b20e8e05f324e58638f2d779c200d37dea0adef08e0228ddfd3efcaf03bdf8eb2118c8d5adeb96fd27ed775738c5da78406ab67fbadd6f74afc9194655446fba87b638c1ba8c8b0210533df3945d3c6775d11697ce1820d304570f101da18df755fd6b84fddeb588c57009a460d6994f9e2bbbb9ef93c9ac585716f698c4943ccef2d8dabdf346a48230b02a8fc7cf9f3dbcda67ce60b1a3b9ca9a2cb4f1a4fb41207b5fcce205195c61922b6a471260c9734ba336bfcebf77606ab1b438d3cd6b01a1ad56043e7f7a68617b0df9b1a4d10c143f87b53230321f87b53c38b97461e6990e0671a68a4a185cbc64ff8652a903f80244488c60f1a488ef37b43c36ac67e6f67a8217f6f6794d1678cf1f9bd9d01e6a783dc195ec63c3a33e2f8f17b33430ccf0c32427e6f66e4007efe7b33b3e6a783ad30c8efcd0c9a9f0ebac225a346a8716f66b06018777e6f668ef8b9aed607f62c01bfbf6bf9f4dc3380cb9d379be33252e8bac658e6830757020a47930182aaaef3ae23e38c2aa5f91c4706558c655ce531bc9fdf1b1949901104d65704b83fb309d712f6d399722411cba6195b192afc8ab43aa545b422552132c615429ad387e0182bf8bd91c102195d3e5e420c31be40fa82fba8d79b821460f130061466b8bc415b32b07cd769f15de7423e2cc300982e6000a20b174400025ac7550fe373fddec6b0e3c65978cc678c9b185b8c51471630c6c8d202c618726401638c32defbbd8d8145b1e0829b948302848105061a6bfaa70b1378f9e9e20d15681794d230d03ca53f5d503166f8d6ef4d0c2f5f80b36a0ce2d7c570e2b746f1ef0659d060a6f76e50194f8eace7ba9bf26f6cbcf23d5d30c87cf93de7eb312124a53e721ae71c1c6093fa396f02c611cf79f89c6f5fd12817c7739e67f1eb5c992df3e590e9b376bd01cecf2c709e73b0ebbadda0d9d5ae6ed697a6afbe9d070beff7068618df35c90ee3c47a21224650e02478238e12cc0dda00a91d6cc706b52741750d1bd4ce28d8a0e6b84abf6c12fdb25cfc6e906fed2f1b74c588f3fd6522d96f6f1b3669bf198a3176a484856667d348092bcdcaf64b9bef99c4ef9738af8475c6ca2612252c35b6c8fe55d8461e5871fc2cf3ede0ab7dfe404edb7f8b1dcc322f32995774759a6b9c7e7e6af9e9c3cf2fbcfc2cf3e0b215e3debea8e3cbef8b20bef49ebf88c38b3cca4c28c61f36096a6af9f9c306ad2741f9407d785a6693ba96f3a1a8f715df3eb1d8a4727ed7596683d6b1d8a0f599c5264ddfa4ae4edf4fa75dc06d1adbcb6f6f5ec4f194522a055cfe61ea3d5c35e0ffdc73a2f5cec3ce471f19cfd6cb2423cfb6837de7a59743be731739f28cbd457e1ef5e2ccef18bfa2929fae798a005cfea5e0321771fc4af17be3a2030fbec0ed231e20bece81953ea2be3ebe0c1eb97c5d4a1f5de01bc4b7a791fae8e5eb4ffaa8fa8abea4afaf0bf511ccd741e8a31c5f20df1dfff17513fae887af10af31f2a702c089f810f7410aa9543f42dc02c721812ad50cc8656e43d64a4524c87d78489295ca82eaa4b7c80b2a55900f1fe21f19a452c92e700cdc237b2a5525fdc73b1248a5eae9bc499f4a758167a1aaf1905440bcf320d37582b88f77b5cb105a053e9254416a1700d0a86c3c888ff7384852f9d42e3a34aacf7d6a171b9a3b904ac5e3a3ef9054608feb388ca4ead17120fe22a9746a97a651c57c04e22f77bd1c7420b54b108d0ac781384752bd6a9700d0a8420f02d62e3e342ad07dbca77681d1a838eff11c920a00446a971d1a55cb7d3ca876f96854ed3d4e492a1fb50b0e8dca878f436a9749a3d271200e80daa5a351bd3c88ff20a930a85d7a68549df7cc6a971f1ad58e8f0ee4a2ac7679d1a8440fe217d42e48342acf7d1ca87671d1a8721c88df9054423c0b558d6641ed72018d8a7a8fd7da6546a3fae163a5aade65d25cce245516aa1aeda77611008d6af42041dc55a9749c0ae654394e75e3382ea47639a251b9dca756aacea938a7a24ec5deeee364edc234aa1b07e24e52b1f754aa20950a742a9753b59ccaf3cfbb4c5a8f574052c11c48a5ea32693e956a74aa9753d93855e8a2f7542a1ea7da71aa9853f9f01faed43ce40e29ebd97a8c6cd2b3f51fa4093d5bf7b1ae437e3d5b87913924083d5bc759bf591fc9b167eb2f12a967eb36e4939ead8be4acead97ab80e92b19eadbb48a59eadb748293d5bffc869b5de91deb3758ea4a4959ead3739bff46c9df7b605d6977bd3c2eaa3fa99a6c73ef641f35363892596405ae2c727e66b460b4378c1021b19f0e10320647121051fce88414b0e5984414a6185142d2b9470856a7041f42c99627a96302331726524c6f5dad77ed6da83dd7d4529fd32e7729c3357b90a8bae0ba0c401cb26119f0f2d4a29a59436a556acf0945af1e529e5aab0c3c60aaaae4837f175e745470658ae972573de39d8b56847b28b6b247e7086aba48990ccc535d91deb19e720d7a21cc91c757194ecafc9f79cdb33a62bfd3f9ce079eb57f480da6c1e4c9b8de6397bb0379a5739e8d9ba12f37c8a85c55548635d4322072dc69ce9020572fca08019a608e209335cd0a8a38a35ba0a10e80ce0f37a84fddeb068e2c1df1b16626e9c06b83f5cc458ae99ac3e12e23f5eb2159005cece6358d633eef101227376fed24717383b5ff511e9ec1ca68faab3b3983e729f693a2fa715e7e5fc323adf38e338e738c39c7f784c07843e7a39fb933eb27176297d24eef0f870dedb22811790415c4656e0e00c81909326238138908a0250ad1790163800dc410e8190aec4401cbc8084c11c5651f0d1d1c9e989c570c8495b51c90f3f1c875c5a0e2973187981afa8c4e005a4587b3eb8c045172b0a377e41edf9c00700dc878cb4a93d1fc8fc02bfa0a230baacf67cc0e33297551466cee34b5bda8b9c3470863fec7893972bf14c880b71009052427c3049804416361a063e73a929995fe018ccea94ac2e17951cc44f4761ea826aeb332390c146fbf19f3040e4546301c93f644fe83d1fb8fb4fed01bde703d7f19fdae3f29e0fdc87ff5421644f589b90def3815717527bc0dae487f77ce03117527b5cb5c98ef77ce03c2ea456557262f56c3a49ce323d9beee434d3b3e941c879ebd9f40ac839a667d38190534ccfa6fb90334ccfa6f790f3aa67134dcfe6cc1a3bd9f3903b648c34a167d37f90567a36dd07a9434e5bcfa6c34829e4131c128491e4c04654ea23a146ea2035905d5080df3af80af313674510a43c1fbb1b11051c177d695de879e84bbbc1f1a6989b39e6a777f3a6f3c395fce0e3a6c371d1f350f4500c6d26d6741cb6fd74b135cbfcf4cf4c169a344fed62e8398e7bbe34d141e8f900c7733ca7a2d0398e2f2df40df629cc736e1cd6790e082c9b0e237ba8c39ed8a1e63b3d3981f0f2cf4170b98d2bf9a1e54e1f48850efacb3f90127d74106edcf32982d0398e37d1e2390ee89ee3d41ece7fd4eeeaa7df8479ae36f1a1536d30f2cb4fcf217b686d52f5d3ad9abf907cd5b3e920934f4e50f39d9c16b034cf17b0341c7702a1e70397bffc5551a0790e42cf072fefbcab2888fef2a5e1f8067be39d8337be2208a2773c1f87fc6ec81e76cf6b34b017b0342d2e7f798753fc207497b30882e82f6f10407755aeead9f457ed69b77191e4a067d343727bc6563d5d9bb4be2af3c81eae4d847a36bd469bc2a951fe8800979f7082892698b0a28ef79034516669535a953868b2007b850f46b881841c586031070da38c1968e680420d140441a357d0f0945e91c3d39da702784a29a594d2fe01230524a0018b14742083b6a18716476859638d0f1fa0512bec781a3ebd22cbd39ca701784a6937b13e7e6f64c27c1ae0646e8ba38fc644d09f1f4afab0cc8616f88789afc9b4f0ed85d60ee31f262a074190b17d197bca3115753cf77ba3628e2f85e80d091224489ee8f0984b3dea3c4473dd1c19ad987364401907dd751558df557891e4bb5da8964d485c131fe7d15993f840470b7150c1250d99309ea842081f4c2046961c768ca1c20c15653af65200a7cd89214270c3aad2920609a509008d0c7821850b5a6051066d7d97aa38820c1444083105144c3ca1c4ec4010484c0e007104910546e6b922c3ac61ac80fff7e00b4d9329e4c7023461c7a29456252a2a8cf872b19a78158b524a05114f29a53e692d325231c4b3bf122bf10f0fc53176bf372ac2a0a150b4a670828a2f2cc5996729c47866de329642426ce4394f073972fcc8ef85d1e5fbe5f72e6f39272ee1dc554ba666a23e99da3b063951c9d7a2e2016a2bb6bcc5259fb76af931b5833cc5f68f64a23edf2349da91e1c87db7313f3f3250fa4305a90909062a48cb463d419e24388c5d7b187afe393b0ff596835f0ca3e7fbcc7dbf7df4d1be0eaecc9f955ee1beab4cd4b93a99579042ccbfbe8fdc77cfeb9cd6929c7fcbfa0e3f92c178e47eccd56950526f39e730cf5db56749e72defbeae3279cee212cfbf24388c5e65f2c2259e77de2202baea7dd5ab4fac7d003b8fadbb14574f9d93c22a0a331eec18e7b0986b50561f96852cebff58d60bde2c204b1c3556993a67ff1c966487b1f392738e097b5799b8eab5bd2f63dc71de4dbbfbbe6d030a2c3280c5195daea0c20122f8d2431a458461871734ef04de910bad8ea3cd350a32fffddea2f8825e457144143dfcf490c18dd19b0568d1f2dfcd02b238c1b27d9043cade43e9b76ca30f51d64fd84f2c286ef8d29f50f3e590b76022fd34f36592a7cd60f3b36fc0cf20cf651baecc65ccf9bd39b1e69578f21a45fffd7a13a43ea2b45d2e86c0e18529c678a10c3468ab85102f6c91020b72888086c3b81f0b4d605535b185964fc8efad090e340186a338b7d96c511c12b7e0c58fcf183ad8f8e1eedd169899f97beefe25383d6011c34f9f67dc96c06a42062aeae32cd332ba7e6f4da8f06b56f8b162420d971f2b26e6e8f2634583fcde98c0fa9c273c0f7c4a1c14a08b8f0c3a84e44290102748a14c16aa1768d82e7088018b3437ace1001267886ed81021b9f0c5c6df1b13429cb1392021d5a000d342078c480209aa10d48270238b092ca2c0a14c07baf8c8a043482e2c194d9031441d6770d8c20a09b8e1461d37b8616606369ce0a4108f20b920e63d2417bef0f7c6840e2768c5dc87892f5d38e6319f581f2931c1c20a5f6582cb969688c7c75d0c47bbb332c8dca3d81e292de75e261142e697c6d888dba18c7b53e2ea6f7e6f4904f12b72aec47c35c67c3c9f3f5f7a5589838e2c00cbe69a14684a1c14e028363da79c85e6fdc436d65b8978369d2385dc878cf5d10fcfa6330ea312077d346d369bad8a36e76dfad008c6fdbd2991c7fff8bd2d1182a7bfb725d6f8c965801d5cd9bcf958e65e0ee91b18cb7aaabebd87ab1af073beb72e7a78ea4a7dd437760e3c78d2f4e559a88ed7426f5f866f23c4dec6a0f9db1831ffe5a679665ab96a16a0c50cb9002c60c80560b962d9bed0ac7a3622f46558fbae3d4ce6b72f404bed7feb0f9d2bf1f43e1abbba3d1b59c6370bc87266d90a0d08524a414a3b57e7ea5c9dcb455d61975476eeb95273d9de39d8ea662ee753572d6bd92ed579b743d59e3f26d6805d9376994f50cfabe557fabc0763dfa47ecf975a8d9ecfb167d43fa3aec6820b2770a30b1075c861076deca32d811966505185135c8c6983e6f92a91c47befb9b35191f75cd64794e6b950574796516717c6fdb18f3e1aad7e05d8dddd5eb7d7852c5b4e9c5cb75fed76ef5b5d73f2fe9b7acf5954f2d5b03d9023dbc1f6ce39b2ddeb38e7ce3b36a26cc4b909df1cc7b183dd91ec9ea884b24fb1ebcfd988c9ee06b06a4edf65dff649eecfc94d7189f7de926cd5753ef5fbebd35774ce27c95e7e3acfe91c37274f8e9d921f5d4e0360b94e29a594b26c7da71d60397fd38c25fdf9d41e459ff3ad3d4b76d99b96cc539f3b97235ddff2ca30c64db92ee426cff1c6ab8dd18664b1430a72aeaee585637bd731f4f93236e9f7e5c8327efa21cb98d2df350a611ea0d64e9dd6927e57b68dd36bffc3ae36c06523fec2918f465f5a8b64f748eaee52c2ded280f965d37e43fec494fa45da902d4eac2e722437490d63e7ad0d3a675149abcef6bacf458e20255dceadf0878d5cb58ccdb01c9b9ce29a0dd33d7ee81963f9f3ecb202707080a618fb4fcc872343148ca5ec59c646cc5d47969919658c07b87dd47235bbb1dfaf964db2a74e2ecfb8e99ef7757b5e4f35d32f9d73ce7907668b1697501a66118ef326679192caf0ec5354c255a6611661a7fb733a8b4a3866925a99f09c33d9f40bcb6acf75fb8afd5196cde9ceb2e971f78122ce88b93df86a34a698ff3e67f7deb53ef594fb3e6f55ef2339075b9845d6bdbab388e71cc95e9e732a2ad9ca55eef93e25f74df8de632b96714aede43de9d124bc2061fb2972aec474837dea1cc96138521dc05d234a9b91b097cbbfcbbf3e9de9697e127bb9938ce235622fd77777d769dde5b9deb3b9706ab2a444794faf78cfc41a9801822092d037611967869b73ce39e79c6b66d99000cbb8aa013713d759f3662f91f5447e6f47dc1e7ccdce39b28cb1f8b96ca4bcf7b53c977fde22cb980d39bf8f5e0ebec8e59957cbef3db1e55e4f1882ee72d025e53dffb8c997eb4db1b23682dc3e88f19a768c1301f327190e29d8aae35b6e041b0f80df9b115f9ec99cffc36ddca6f4e13b1ee361c271188843e6f80dc9d3718ca87a1c17d578204d7ba0eadb03b6ef06bb70c52539ce5782fc0be638a1e3dcdcbc70701cc773c872f47503f8f02ec421717cc504ccf7e14a8ce3379d88801c87390e594a791cef4404dc387fdfe8e5f838be7cd4133a9710e4c7b227ac06a8fd587b5ece14fae8afd0470feb38fab22caca5941feb4b7998e394a37738ce891cccf7e130b284794e4db2c308ab1df8709ccae4c3c3ca243a8e2bf1483259c26a53ec7dd41bd1d779c8927ecc5b64222e112b65994d75ce716ab953976531a72c8b3102b896f37f20e0c70fb29c1297b0df3878432ee977894c4a1cbf79f2b07621a064c7f19bdaffa396287ca18b649c0aab25e751fd2e2f29cb6e5ca7ea38c7e2127e1d77913ab59cefba71ca46a1dfd4f2c66fc8243b8c51fd2ee7fcc641326abecba7a8e4c665c7f8790f93f9383e1fc7b9daf8ac3dae0ffd08314768610ac525aec7d9d05baec42d12c4215fd35b1e30f32d0f1d5c900b577cd5b2f62f1fc932f6a3c3c852cac360ffc3633737ceb1ea43e6a396e3df78ce8d2f1ff5b80f1fb5fcfea6963a0ef31cef21976739b5fc9e6b29aec3c8ce75c8b229f6382efa8bbc321fc7a9b8841fc7a7c864e278ab96a1e3380ef99aa2016aabc438243f8b1ae0d4723e8ebf7c24739c4998df9065ec6fbc47676287f9c80e7376581d3da7deb852e390fc376429baf72fc721f97b709ce9c6d9716a921ac69e2537ce7e53b9daf8586d96f0bf2a53e8626d8a7d585bbeaed420397a6449544af9f5169570d3f64a6853ecaf4c9d18bf861023ca9300b83f5f944dabc63f72493a0121d09bdddc208e8652f4bb290d3fa3fe7ea66e2ea4fc257d4f023f2568fa79eadd04bf900e4f544243dabd9f8d95318b3efde1dcebbcf43ccfa35dd90ca2f10d7ae27444715774775dd72d772fef8705c65866d69225dd92d2f0e316b0908490907ea472c6b19652c61b980fb2003cd3a95c9765383e2c1be76b7c91b158cc7fb07298de3c2f2a0831efd5c2bc4765d33c93e79f979b66d3203d09e1a5e078d9644500554ef3e16514cc4b1372bc94fa1b5f1d076be9c101402f9bfcbaac8f746a2d3f91fcc187e7c0c8a1acb1e58afdd0113dc79d659eb3e3903487f47191483152f6430867286b0ca4f8a8442a144ba4899e04a153088dd0cc06010dc31460404028168d07240251d5d40714800e9cb64e54a14ae424c8711032c818630c310600008008c0c088b4011baf7c02a02fa1fbe1b4d32f99d7b62afa7fc898fe216df96c1755fda153a462695579f9549042bf752c4cdf1a464bcf8197f6a81e2f02f64c79f312f8f6b33778daf93e9f1525e570f7b648736655a8c5500a32b7c94479e040faf4b24159a64483487f20872d03693850197c8bd432289043476c5404ef57d1af89a2615e4b70bd7ab5a20f3341842816368b8b1adba3fe817f8e13f592d5b9e0c1fb251eadaa7cf96ead5a1ed3fe2061230dba61a80703c0513be8426d6778c535a744b8e2dae994a3195a018ee2da7edc753a170744dd57c4487d7378aec6701581d14c6f1b4af5481745494383a65bb700b770b8de3008c1fe13f3bd73b40a4228de0ac1fb0b029ec83a31b1a022562a5af60580c774a0ba5e183d165e8c8b6eeebf47b58352a943542e8f4ce7567aa111e6a56a5fa17313ab8184f43bd68ecb2e2a2b3851eb84a3084cffe90c135656238de56f5b4da7e5dde85ceffd2357ed623497f49f634218c25bce0ddc478a3f32c5992c25d8ef90350f10757008ba510da1bc3656d52d9cdc20708a953a006810f8a2084f8674832cd98b1aa35d87a3a8c15e4b4c6170b062d3e7425f3263eef65e9a0dbdbc6e61b71e2d87ad16019d1d1db6edcc590bc39eccdceca528aa2a69a8b6d0deaad868162b44c7432db57a93ed6bf94d3c628d032f9d5723c56fbec400a8cadf00dd6b12457c8a6c5fba3195026be1c57c76282c03e0986a83473d40c827baeb3422619c14b5009fd7ef3c2d02443b5cb97e12ff8fd7706ef009b8994fc01bd4c7bffb7322d19f3f3fa8e19d71b09be2770a68e1c10ea417b05f3f8aefb701440aac78792752d7e46f4e72f7db68f6f4040e8065681c6d2c16adf482ac4254a78c59759f2c6ca89de73a5a991252d5e87f86e3448c60aa80b39934c04a24f5debebbc791d45ba714e9233573b9d69749417c471996c178a9ddf1b74ab541d4bf5547d832c24a5d9458d26dfbea58886bd8e0a2a40c1bd4f016577e7fe1dd5645e87e801edc50cec969d834ebc5d1c513ce2db67b15396c7b59dca586d80fc4de8f94b2a13fd22fb17fde9cf5ab55a63c1583fefacca68abf01389f6a236a6aa385fa5f9adc4c3ae28b4eaaab6295d66bd4d71833a564dfd76fff1f9cd46951654d3be5ff9fcca22bc384d8d30858775c75b1accc89d9a9402279dcd0a6ea12ae4c3744eafaf6cb3f4aeeee2f03440eb30217919845b215177db5e8c30f642f484ed0090688382a27e7f7c48a85478904644f79a06833465c8f10baa982f8a4068bfab79a5fe28c38f18de4b041dd5d1d5ae934abef2fe697b54fa2512c874c30e494f9eb3550f64880d9acbff4eb88b4ae27c1064c5cb90dafbe6f9660b2863e8f0463393cabe89d4cc59395a89dbae72c9f7b854b039d0013b5b0c2e643047e26968c3f4ee89803293e6b5f4a24f2b30fbe708bbc2678d55a642c2a5d47a50a1f76fe9e4385a403550622038524edeee8cecf77b1e3bbe80f9541f95b2ec95138819f61a77394a3a727417e468261ba66e6e887b76a9b4343ab9117b9d8a21bf01c898441234329d92eb68eeecdf7fa955e342051e9f72bfe5508fe19f4be0e6eb0196494f65077fc3997232a80f429f2c3f2145fe8a780fddf20dcccb5b4648f4676917ceb2afb60e7947d0d2b0c5792c484a2e8144452259d46753fdcf00d7cc3d56863e399adfa866f04dc0ba07700bd01a2f781c98379d376a2c89b212f1f4bf9e19e84f00c143b2775095549d5599a986eb080a62f7c16b772006fd63d18e2d8a26957648530f3ceb30b785eec719d854b868bb803757a8286d8ef1ed0ffb66b24b7ba60767141007c3788b0504b16c9a28dd9f7adbea23ee54fe8bd15c9fc899681b6ba72d34b9e84012e20e30e32183df021da4fb48e714b6b8d0a9546d226fb2c5878b9fc22cd77e97be8a5d60e5750d72f07262f3e831d8bf19d8594367203c5144f3d07015cd1aa15abafdfc1e694ecaf5516108f59f23f8069cbf5d64b206ddce2322622894838454f8511c4460dd919a62b877987766a50a8cdfa7e976d932de014665d46c53796e6652d1aea77a325473b20ff1c80836a13d56fa16bb47fd7ea0cebf8119207ac18d5500f2f7b01f080f5cb76a79a1f36b0992fabe957f1f500ee113939e61d06c501a8fcf371adef04422891b6f9c7a80bc0f30af3638af7302217e1ee585dc6f352b0c81c449bc49df60a8ac754c1202fb6c1701b21173e9ae400473fd8980a2d3c6b23b1c4d203bd2b3502a2eb9923ac97d346364844dac3c8fd78720d13f70eebb4993d266f99c002c9b0584c960f518e4c18071b67d2bd0eb12af8e0c78736def06c39e71b0adf80da0b68d1ebddd0a706e07f207ad183e167e734b64706c752b9eea98a012732bd87507a414864a71f7e0fcbc3e329e08da9f5c263424b6d06012b46646fa1787413370ef74e7a1f7a7f09835e241858b26ee1914cc4d08b34285aaceeb75737a1a2e2cf7e9960998fe03f9fa2875ce96b2f85e7a6840d2d53ef4760e3e680be703145b0db25bbd8bd3934de5cfbb328e3ae04d5c6e0653b061ff4f7580107c1b5f98289c3d7af68f822aa201f61c03b99aebbc55b730553a5f63d92443b6a41ebf1b935f6c08f23bf3bb0680f711e29f306444ffca262fb740a5059a784426b92f2599f2ed2548204ede3ededdd980f62405f01f4ec935fdcd644c56cfda65d02bf9e87000d4c28138e4ac4540e181b4c19c0b6e5dce1eb9a26731f47b49f957fc3ff79ae72c8be7b66e9c396f8eaa4f49d344afaa00e90a242d730c734649cabb26ab2159580f3728a20c45343361ed152f6892a372771d12c40b6022809a50b032c2447b51ea89cf2094be1b8a4845aea263e9732c8add004aa09113d26a6755c161371cbff143bae25a63af1ef331a0423ac5e17c180d431e457c6dde6f5eb202ead50c4b6a914005f22ddb099e4c23270f2a9a6219453430c2ad048b16d4d87f388e2fec1391351709b62c2c34e0fd2eeb064a6cc37b7829705ab313da5fe80037595e77caf14f6f9d5de8d84b67270634b91528552b4f740331b194a8cbce623fb50394f232cb5ec456dcbfeeb0965fac77d3d823dd7827de0067b6b69202c0695e4db2d6b8d1d100198ca08b073668b98aeb65902b759c66eb30cdf668de06671ee092e6bb67b87a0fda076cf4515663715766714bb5f27d9dd824440acf1c3d37f24d611e1812eda5c2fe77114e149dad5b6a8a19280e4375d7ad4e7a89ac2ea45703150483a85ca69381a511a61330c1bcf1893d55c33ec222e81f0c30ef962d715c746e86eebbcb42473c8e1426381a6d1a6e4582a0de68a49a76a91c39e187ac08bfaf2acea53df28c67ae5b43f61cb05c97f0fde26e6fe19a7c3ed2738b91a542a6eb5185bb35a0deb915f9727a7d81cf9d6593dc2c3f92b72d540588d7691df35895fec4007a3c4d7e37f9a3c955d4eb149adee33d865671a6e3a373a132095d1b79dc04617e88f2330b5b3200c949aa80a7857edaf5678cc5269a2857755159a2ec8bbe02c1d897957a5eed5745669500173de88e7620a20668d5bae6295e763e1d53d62b23112c85dfb116e4386d9b52c203a018e4c6c9dc99c43bb2bd82bf65c4926e0442626e8a0fd60cad45fc94d57cc4a67fdfdb773dfd6cf1928d2e6e5f3b14d2fd795db2c50a35d3192b8b79212454eaa472a6982a88b76b53cd9671bdfe5f3102a31af56c96a292c078ca0c0e42ea7ab32f8d5081e9e8c030ecf3edd201977885ea48ea3ab135a62458b5df9a1a660f49a80f63b1a949edf0d467a7dd7fc63c42c6e532464332f5a45ebe3f7919a17f98cd1e1c4e8afe682250248a81f8dbbcce37b971874807b834f483d4cc5c2ab3b0bfcd627acd5a4d0323268600bd28bd34fa50649ab71904e71a68252cb800795384628c5e11ba9f690a8c042e6588aa0319c6dedd1ee8b9828892ab5d6c8dca33825caec0cea2dd5db37b7a9364da678a704cb7ccfad9cf1cd596a64d44dfb5d9e2dda4836ed27051b2c16814fc7c7f90c6d4bc465c2d52bed066068c6064eb5907380938e0543c781e86c16e9bf55af1dfaaff97c6072d3e9fe57fe73b0c40fc913ae712af8a8f9486154064679f00f46801e259a4a00a0d0873956fb26f4b5164bae6cceede07bd895fb666bbce376e387b3d36e9dc50c7ea4a36268c3e5d087d39e3644310575b0a727042574a57c62ac7cc65b874810f8577b63a513fc4da0a9258881c114fe2842db24749256910d4c99610558a48188f271e1866f700cc6ca0cceff3666dea683b21c6090c29db9203299381956bc68b5198414dbff80985903c3bc0b2838076d8a93bdfe9adaa0d2e9f0da6133cfc62404a9560c75b2c736be45c206bd56a98beb06564f6f77af14e2bae6f009c7371eca13a5bf4114d5450fce119ab3572d6040dc28761a9ab8ca399f67a380a0cc4f78862fd6f81efd5689732a49ce54df24731c462ed9a1855966220d380b32bebb2d53f55d85c98e4b6d46261820f6a4ddf634e9f46e02d66d01a145b6b918746324175159f3eebe5e128c8699ff96c92205cfea63b74476705c13d934aba3bc7cc6bc1cc6262d6ff17f94718c08e2b2767ec6e962450833d4c882d3cd8b8f286c7b1c45bdc74d92a3ce9303a47c4679ec1c8530079eaa354db0909015ada4229ba8a98866da128e95e490d9ff97fcc0c4bca26fda53e5c5d109a6a1103b4640b04f5c7526c98bbb15339de2092f4c6c3db0f29338c562764100491993ea7c6b1f1fd4dbfa304cd1af1be83de83a684e714290f5ca2f7787b003933e8b0e922284e34eee299c651f1d451a359369a7c85578123c198d22e35070abddd6c1156081fd6159519adc90c45f2cbaaae89b56a1188750c9b766a1fdeaf8f1619b53e0af943e93bb8f87ce8892805fd203ffbc2a93aaaef12818436bd5cace61eb43da626fece284452e059dab60ba9c10099d3d324a144c41f5a74e0cad520acb355f7551ee6171276e1ba76ae882f8ca50c23caaf4c2eb312da84c367b0540f4322ebc1f93e8d455dbfaa17e9829346e051066e135cb7d4bf14e697707dd18881a12b370975be93be3142da9219906bbed24a6f18a860560260abf0b22a6ceb71b50239196921643bdee33a3f308c55d282557dcc2983aa44882d1da6597e22aa6e4e865954459dd8873020c6dbc4a65d5da57251bb177f340796bd8da63947c6ee219b58daff93bd53103c57144ecba24fa10d72c7f8df442a84d97fbf44043319f091581e010529b2178920148ddf522c90c99a48aa1625544068c9134bfed707d9152538568a5b2ac296d8a2fd3c90f6e876a02585a2a9d265258cd83c631db8638981ffe150fbaf5b1aeeeb346877d925179dacfea07e7cd3a05cccb311465b66f131fe2ad251f0b4dbed1b87105b0fb46aa16f90a53c294b06acc2cf6d4a34dfc928665261ab77c00be0222362d8baac6dc6a40d7bca78e697390844f779d2c7c81e995ae7eaed4e7bc8cf365458d2a6d60f01c9563e9d48822952ef92223c1b7959e204e95b93e85699aba5083cb8cbf287549c65573280a1abedd45df52f9ac45862b8e1775645d4ab1795f51f7562dac283b58b140743b63783d19a629db97708e889d6f4dd0ffefe56baf939860ff9ed02f33fc2c317da209c0ac21b9ca57c4b7ef67269747dc46a5d9bdf49a291f61f59e02655bd61d2d758277ae74890b4f71e899e450b8a17eca5d642d48496981b5661f94379aac5f51e7420b7a0b621ea4c6687e63cdb8fb89d8002f352125851717137eb5d31e994d3fe3e8d044feefc96787e7d2155548532f92269afcf27efda70545134c0c4529646d45762c697c05a1b06250b68bc8d8ddd5caa031fd4d1fdb1aca5b6043b3d65aa835a3a82cc40d1031c08007c189d837ce74e4c711b0d100049f7ea907c35a396e93d8891a5b18f15ba30ea1ce1336898bc12248ca454d645e3193f1f17080c71782405215ac04ba485daa0ae3a284af7525835e32914aaf22b3673f60629409f1e891032e88c33aa31f4cba1a2d0e8ec67f0a5d3d97ffe6b060e807cf6cb5e516a7b1616431515657b4124fbdf9308b3da1766324fc63c9b62c86d1e80dda3206e78fc8df2431f8ef49f4ae0c3f4aac455ac22527f87ffcf6bd6b7e55a5b53f206c4120f808b37c23470e8299c571bbdb95cb96864bdabebea2930e42120bd8c64b927192b226748e408c181f308bb7667f9384c95ce6e0f0457ff3e1503b05ba4c6653619c012f2419791c0eb5534cd87f7d417fb32fd87703d70bdccff054db10c3df2d5f307f2a11bd5e0ad20e408144b60ed1aee124984c525f40bcb8016430faf36ef2c1fe9dd2392f3d06e9d8cde7dd0bb739a4ad44153e52c9c7033853fdceb77d106151175e2268b26a7b3dc86025c9722cb877538e2a104d54ac215bb1b9f823aeca42a796d1ab9739d09ad0cc1591cf0aed54a5e848e0ffeb6e654b3e08a18b81ee621f28cc05ebf700f525d53beb2bfed0aff83c3cc2de08dc58198cb3c2bf58ce6db1ee5d5ef010a806390455afaad3c9e144eadfcdf7073c04333f147a19a1e90aa913fce2be349183b242ee523cf19713a43f961a7f28bd58b1ad1e688db48c1c16856e3e6377b8a727f71f0c038ad05c201284b19fd012b54274e2c91141a0922154dcc4cc76406b2cb40580600905032db142d7bef036970a3de9ef3c43b2af511b2a69362a15cb4cbe6850d8a7a82c02b8e1b6c4a9d19a6bf22c907fc3e65be6f384ee9cc3cc8d12b338d0522c91de558ae2869d04995846dc69d68beda0b179be7f7b0efa887740c307ce38c2d5beb9990849af8529f2cb99a05c441f322b43f495682372cfee9ff25706e292e4b666e2c0313585d7cfb2c97019cea0949a1355c484ec5708b27539f0d2870be4edfcfd76149ff8bda09b6d555458cce62b7089d48b9fac02384f909658c9937f6694a6b637bf7fd8b66cc1b46d04eb1f610c5069cf747cd04c76139584adfe83a688aa8bc1eee59184b274002ac16c88a31dfd5059827516e1d446107001c5a4efd043565aeba5ecec433ecf7517c63ac965e94d2c684ba45185722f838cbbe7ac9b45491c900ebb3e41097467d1aa3e6388e324ca98b41a61747775c18c6ef35d36a44fa823f25bde957387213d0192a2da7c2c4987a36210baa224d423117432037e6ec3ebdf6427d05f1c1dc8390d40987b2dd60f6fca02544d2ef847d2ec17a1c8ba2fe91f1dacc4411300746ef95f720fe730e26dd37b851a8bc1a6f26bb9e121ca4f980d28922323f5ae7926e6a9b7d2285d43307e843b6d28bda5a1717f663dc9da4a8c675bae683ef53d5b205c17f2267def5f7c53143f9ca230dbc63b07a107fa59a635c2961364486352041e09536b418eb89653e513d0940952c1f508e8a940849d767dfe1d7366b176737977267285bb00e67c519f127eb19a67239dc64d481cf7988f681c43ea2493b27fc412f2037327c30f119cf6119842fb28a3ba6d95415ac83074d41aeadb419a33d945fefd902f6bda3734d1ad524fe3e24513891d2202641ea4f6ca62d2f51ae349597907f44ee910218f0349cea14bc7ef424d73c0dcd77a1dab61e426404bdc28703071c68512b4753c32573c593ee3bc0a0b1af338de17d9a11eefee8a511a4a4c4c47040a44b3743b1ec3b9dac711943b8c272791089566bea429f56322e8604227d66e10fdd96d7f643053c68512b3d00f26a4d95382bf2e919623dcf9cfb6bad386036fd3a5d9c3953e1d03a0d0667447631eeb6e3e6eda4dcb8deec671afddbcdc75bbe961c8d71e4e7957c1f34dc0bea877b7370fef9761d9809d32cdd620abede66e456f32b8f75c15ee88f45472119d1bf7404468d1d920894640d6cdae5217e746d0b67f02b89e76480df1e22e6ab7f0f989e75b3f311c6405a42d0ba45a68d4083f144cec124fa26b22d3152fcd152d3b108a72faea2375748973e21c445edaf9c1fea33e5105ea9a488e353cfdeafe7ff2c0884983858c0af31c34848a6b013ca901fb186903ff36008f90de91c6456f0685022c39ec1400f35904808e934498a6b9eb8898c2a834cc0031332752102a2da97c3779f2eb6453a48008cbccce73b396c941cccaea538df7448cb1125a51fa343156972674d863d182b2fcd24932f26641cd8fac7be568b7967b72b4e8e09b60912ad23a77e30f86fe8c3ddc446f8ea34fa5fc8f3de4f935533f522b694a262368087efb3ead00b41bbc31707738b0a9ffacbd048af586d8360abe11d33df5ad8c767663364a0d6f19eb5144b525d532da304539d7d08f5485ed17cdd0524657addf6f4a89c90d2a8fa24ca7c33ec03f993710f4cb8f4cab643da394a26e966bafea06497c3630c7359aa323b1ab7e359dc74c51494a021cb73433f6f7cf20a35cacdb549a8f9d9a2b92425bc83cf952c6f39c54fee6e133441bec06ab36c161fdb49c0d873c11610c95cd8895761f3ba8e02a7c23ff59888d0050754252421cb43be5641d742477ef4db2e8193dfa1e6c370df547747ee4d718be5a5cd189ce747bb8ad1ade8fab820c46002940e94168b6b986718e2e358da9330f86db5327aaed9803424f6b887f415451f45b7b7101c7c29d3bb4e3e4e5013a1fbc8349bc86cbba571c2dffb583ad39cd469187bfb73dba622612700ef5db9247c02eae2fb0c2bc9b5b9e86a876bcea9e4418a55a3f23b6147aa1bbd06a9b7e71eda11f0c3df93254c6490b5b757d0e58b1518b1ac6e7b6375cc1fbe0cb1b6efe94a087e0acf1d344b3102f06291ba12e072a12275de15adc6b91c101ff71f2903356e87f14113f6a84db524aad5eb6a5dbd1e837f024c3c62ec701b6333ae17e57620f6852bde9d9a94570273254350229afeccd8f5fa13c7cace8665423e825e9b64c6b72201e03e26d631291838bda51bcd58441f79142116b536bc58a046275df4cd03952e6f301e163c03510acb7ac3c41d4a613841b7b5237924bee5d72383bc8b766dfe847dc83cc702013c36552d0913b766f98ef168a37d08f08c56edcd9005f6dfd07c920c4c63be3dd8d764fc1646f0c38c8352dc64dafd77894dd711b836d94bcc6af9aa30111a22e48b210a0ea7db0597ae49ef70d37f90dc76034170686c994c383c3d122e612d6b0c94d97a7e7c8c84df06519c081d89ab3f13e52c81d47e13d9e62c6889a597fba2792e6614851b06d500bb09bf87d24c9c6fb0602b1d074886357a5bd390409878b93169a1a909fe76e96fc2c27bad6395b647d26a0d2f458dda041a1df9d3d35ed519f12c1a421e9483b1a5dffd98a0057cab66c7e4bd8ef53df5aceaca96022d7a29ff31abdbb9945516bf228e21ca59ac18ce8a55ebe6fe722313b1d1465f542f8465f07210518c48190837e4b07ecdace3cf3b58531b2d9ca8bc0face6180cb762a56a1141e5198e264ab4815f1f51ebf66c59199869d2a85f7ee14bef8569145936259e77f47b3df611691d39a2ae844af00ea91bd1c5c3fd8f7147c3e46f6148fb0d7951410030560baafb1d5404ab219e8ec0c44f2815a3ca0cf2862b05918d2b777fa517b07e0e1548dc3b5d7f082321ce9fe86eb199496efa0a5dc3c9553bac8d9937975466862290e7f044856993ae88596df22d1caf2cdd98724e0fe637dd57d43433bd6b010a4cc599930d40e53b0feb6793a28b0ea33bf06809f292f10808f4866b58da8b455865b63edb06ff45f32838a9428a4ae6a79dce62acd946d49f43a52dc583fdf389c5958addacecc847cb13a608678439a85d97c39a6a87a07207ea13b50d128a7629d8b69866e2c9521130194ce6f5c84fa5f60b9441f15cbd4e22029394510f78d842a75010bd87faf40609f16a5f07142272f5c0e197a4a5e9729f93b184b31f12687c2c403143c1aae6daadbca1a202ba251de382a4e02d7d90f2154f40d1692dbdd9a012c9044a67cf1cce746500b98cd2b42b61bea8a40049958aaf58e5d0ab3ae17db0d725677f9283d1c8a2cab632edf3a5deb14ae78b86edf0108a2b7f64dc00faecd93367301957597ba94a24ca0bedcf5d6c36e5af656e078fbc9302d830b764720db1abfb76606710afd2875be909148801ce08dfc7f643799b3aca5b81692168338815d8f6125253f2981f8b9dd693a3e1577060e52c6408b531198835a000bc70b2b502b81b5d274828b23c66eaad03e161679ac5c83cdb77b36b17bbcef540d0a0d851a4e244a05bf8c45de0ad7d9f7afeb9556645d4374efae9f913a839d0f5b1dc8a0e1a0b65a3d8831354be6e336e9ecbd6989644b763ac632d84e739f9682dbde4c6458fc9b430156624e6bf838f2326fa15cc5160b75203d77168461d33dbb20ca0577c1bbd17ea447f9d7e12e2f3645311ca0b70b2a7744394af663df86293463144dca158de1a996f33c018e105b945ac325479e8608ba91b301105204ac08235ed0b1aa7598b69d5edee918791e8ea7d77537a356e4083acaf9dc7aa4128ec8072cdf72a33b0210bfc514f0549f22d335cbe8d0cfd07c06253738bb74c60835c58f8294fe22caae51bec904a7a744b2ae1c50823ee776b918e7294c351ccf110cb47eb765f4f4e0b6f0bd3714bb270f8176bcd88c3b3559b79113c10e36e24e39882081860b5556bccffea4468ad586ad43e32138962ed520393973118011ea72da5cdc10ee56701aacf59b95db19a84b7e24f20094371abbda7acffb6a9cbfbdd8fef07fedc5d7c34892ac2b475ec39053a5df21c8a59007695b25a9f741ea59085c16fb5fee68dde659ee4118df4913a9a47120c581387ac5502661d2a9d5ce8343bb825a7fecd96411da2f63c9765e740f33505f44eb435c984e61b242ac62b822e017e65808cb2828ba65baadce5a2d966fd4b84f212ebaa12267bbb95d197fde2ca7f36d39a1c8eab896e32c2fe381db3b39e9d73fdf85927344a7ff0dc0b9687f2fddf34516cbf4fb2c1bd07f3a300beff2f297652089bf83f232de3d256fa9951a5954d7ea2f653a2fc6e87762d3ea8578f1df64d5866d08d527916c821aa3397e6ee10bf9a5c09ea923c8b2e06dabf1a5ff0f37f80b6a558130d9af1af5c5d259df1b6a13f6d19a17a4fae6c4b79484c26e2e0e8fd6b9353ea84917e060c62b5827c556948d2d9d0bf5b38e10a5b8ff94a63b37ee7c0c3f5900867059ff83c993011164020ae9d40d1080a199fae10275c8860bd8a18a60a29aadcb0576c792cf9d3b42adb02d1702f1e806cda89b77a1a45c6c478812475a3750d84e14f26c4a109ad61ae0ea1dd4eebced3bfa2e54d998cac44eb87e56f8426582aafa8535fcc3415419ff4db51cd4d9019bd92030d49def76e801473763f33b23899d7885a1f0d0d15b0d8ce8d004bb4b5b8a1a5b76bbeadf6b66f01c4623b3e8d20a89b1f13036db2d5c414ff3ab66290511990c1b59e9b8fe4da158bf0eea57098322c0ad0c08cd0991d84c38b1e249257b23c54a2e5ca25876602977b9eb21a5a443403c59c49102cb7492272c6fb678dbc285130d6d9322c6bf57ee5b39899570c1124f5d034705d78046f116944f6d955221792cc43867778022675e92ae111871f503cc6c598c0ba3714a61ae8e046c2a64212addc1f971f308ae2e91f12fb70f8cc14846c19f1d28268ddd324094819620af220875d53b89421fd2025761d7655285a596f32b856031b839a76e3a491f5f2281c3fbaec1b351114e056c50dd0566ed6ba9988061930fe3ec222fc6a8bf4d5c63aec87c959f472e38276c6a54ebc94a60899507951181da3f49d4ad688b6aa1ec2b42bc398664cdfbcb7a44b83e726a3b4e3d4ca1c5fa46cf40ea3b8556561e563a16c2450fd6068a34f712f8943ed60d9666c25e4d296093cfec2922e21228d936a0d1760adf16163bef1f3318906d00147c33cbdb525a274d7883d3394308916445eca5a141cad84cf9d5ef6e6a01fe0b9649e00f517fe94b250e3273b8f7766c2c7f8eeca1c687647d816d9efc640dcf2ed240b6228330e080c1dc28bf85f3399a410efe99c8d1c36ae2f37ca335d3cce4f8b66542971f82bc327e7d3183f38596adef1c6058160073f4ad071034c3dce1bda361608751b76dcb9d5c06816225a7eaf941dd8b9e1de35da3afbe604e13a56a162f6e9fe0afcd6a2adb6121230b4f805abe394d8c122ab03ac24121b1071d33e5bde4e00d14d2d5f133bfbfb5dd2f16bd6ada7821af6948d55206f242bf6b2c0b29832f7965162e537e6e90393785c2232accfae34cc72223ccaca13e8f03b3bed01bdc01a24cddd19220557ca2f35f5bb9fe3faa387450cbd768919bb700d6355613fd0849c7350a02e25bf6821b02a08a0abd53a5f0f55e5c62716e6d0272b63679e334939a2a996d3a8f9f0e5a7efe7401eb40029926d510c66f8ea9214dfa93d9b94532b827fe722f8a242c7ca00d396bfb698a19209ddf157c09a058f11267ff3b63679ec77ff33272612b85f3a22c4891080bd5acaea6612da89eed4961d3d729263f2b1c2a223ca36f2a2abaa25b1b2554f29eba5232617ebb5b667535ec41d6c2ac566417ed9eacc5021126a2ab68e4b42f0e3e03732f3309aa426ee3b735a51c1044f6abd0ea578846a4008acb51f0c9740acb36f193dae9203dccec3845835f3a23f83ff13995b2a1d8b5288642d86c438f7b55290448e027155da101eac9cb3930c921722f757257ac98423a2e416f0f6188fa7cf60de063374a230186ebdf14c8d9748ed0844953d617a51d18afa89f145a5cbee8bf1c3d3971967cdbf1c8fed9565b27c13ef16965f308102f3bd17d6c22dc17e0042523aa25d4156c129a5c08ef8c2e1d7ac3b9f7180ebd1ab507ea46b779a1444067b5366ab8049465866588aa51e86e9509f875e52b0bc14caa2fddf014da58b812621e824664aa22453e71cafd1f8300a51129ab5477c2335c5371c9c0d512bb675ffdf53941b0ea691976dc0655c0f6f22dae7c99459e5b8b4fc2c477a508b942df87e2525f18b0a0bedb1d99192ae452164666f1a6f32e5a1ac5c06db2feaf87b6911da179dbd6a7f1ad28425eb668933c7cc4d8a4581fa5647e3e59fc4e9e3e4ee3374183ed760f24155fd1eadfe4a6333e77338ffdada383a01ef30dd33b9c2eb05b0780732f51c518c652528874b11101ab8055a4d09ce65d951b28f0a4f008aae09998f2cfdc52ec15ca9e53cf745b4a7ae0d43c43e7f5520600addcdfe7359f5ba2e87606c2a5165ac07124b8c1338edc6828c9243acbab14344e46ae8f6c14aa573cfcb76ed122de1023ff1b47b68c5fb1e76bd0d35193342953f22b2f263fab63f185cb32ae9d6501c5b019d03682ecc4ec6408a7ae7eff0064ed68c7241fe8cce7ca2a7f62ec84e8a0683a70f4623682b1cde07c0884a67871981de5c4d1c2d04275eb2154b8113e2bae438bf80aaab5078cae4fc4a883e5c59274c153923b2612b00a4b98fbf91370deee72a8f5cfcca4e2908e56cb2a22f3343cabf28a96aac9d66e783654861fd885ca4504eaea752b8999d40cb7718fb8248abe00300f7064f8c99c316ce225c1835030dbc04cc84e14b51d465e2530241ed554f3d1e7d2c4a6cd26afedc0183ed2ae9a6897063d16b84acd0660604567e9422ae446b72fb5a1a36c3faaca089a1835fa46a9ef8afc79e7be3952a6ca85af2480db54de196ec2d298d0e3c9327ef8413e1fbcb61119b08560f9abb76d2991a5e9f67b65ae674c3d6c7b018620910f2378f44a0ac124f501fcac6e2ebd05ce848ff4c859f6304987669a457c49bc33fd832a7d9e051edcefaddcb69fe6626792a080f4cf48887dcea4920571a5c20d5dd4bb0b8730b29a3e863128e8c1c2c9285af15086b136b7fcf1ae3e92b81a383eaa790482ed94b9a4b206bb6e144fefa62532e613261c4b0b4b90bf963f1931e61fd51e2b160e914a3577c817e8d3b8d43b9d12395b37841d0b0c1abba432917fe56f28cebc2e1cec800e84c30b55a2cbeac96e82e62a9ff5ed034ff3e6d9f24f9accf0c33193c1960d8a3b3c091b73f22cded9b25a0cb6fe2c0c74e8a534b2c1c1ab2f8ebb59600bbf20c6a6a1998ef111ef1e54c3c0c057af7693632ec85e84fc57dc0a6da7510836a032d8329eea382bdfec8aba8e860a8299b91f77cdd9634a3f6ba4e4f2e0d02ee2e9771487a46bc774e004b9bfa5a8f395633d8e0225ac295bebf62da1ff6d1985df0371b7c92c9b2b6d9262ba60c1c6cf442f16777e262a598dfa9936021a21bbc0c00790be5c0106d237bbb9b018786745d498a1826114b0575d75e54a2b0754afd83282f53a3ac8a369e0ccb9486a74c21494c40696e08d2af555409de89d4b8ea5e0ca95fe0428e79e3906f9d61e7443c48e6bcc73c93945df5c161062c2ac426a7e816c333393850d5a6a4a5907cbbbb01f6ac86f1e37ac3175f0f41fbabfae80cad8c05a415ffc48dcc79e64ba5edb3e388261c4ce1bd9337e498769576057da935aa59d180b529882711a4d406d990875023650d1a50ad95ac42b184ac0ce3c641e29ae4d807f07b090d4a6cbee5d6261e922a92c395483f0b5a02c853f1e961e3f4be44fd6289193ab506332c51d69e117eb2ec4519634585bc4d1b8fd79118440a7efae3debfec402eb06e1f45089d03b1c1c339e1f47569b7b494027e96b3e5cd17ada2471c8d59442b213c613ab0dd7a78fdb9f9171d50cac28957d7e0e033477182b0cafde449f6a848a9c9cc0a654211f7a854f5dbde31e18feeb23a3a7c99d89e1a57185875a93ca7783917719dbea5ffc7a910bfe4b795980a54dd4880040278105a54d0ec2e681a5a0a2cea7d536f5c2e3969344c4e8483072809fabfed7b10b7ca023e6c4276aba07f52efdd7f5b6f2d158004922269903b7f761159f42fe8ff0840b66361b1a587ddabb5521123a4866025f02efb1fddf630eb3c20b2cc09c790cc8d2616cfb7329ce27f5272bd24c4c0bcb5e5d1183848bb9b5f116870f818ff4ef63052a8aa17366bb4bcc86ccae389caf37a0a3e351fae2c4e5d87a9641ef791f226692f1b2ae618e57f8f1a7c5105bd173400da6819338fb21c5ed49678c68bfa54a5ffbf90acf970834aaeb34b4fd70be5ce21671f1db6d8b3b232916e44c8efe69290c118729946aa3ad45a076e1e2139c97e4c4b101ae1a40a91cd2062fa323d9eac3468f07589bb5d35eb349b261abbfa0d4dfd3ad2f8b2150f1ce85bb916e05e1ef7970041c6656e730ee282cffb0cc2290361324deb631e8b09986842e28ea120c6e22be2fa9a00c5959a9e43d198f1666d40f26c867c2b9833d3ee8262533571590f8b65c3e1abe20ac665d3de079aa2858088d8adebeef9fd67e7e70474267dbcbb392985d54723562a5d7ae14bbffe730c642a96d752f71e39913ca24e015bf902c0caea90bd16e96ba3a5dcce41c1ac48dfbceb36bbf51b66da90ea66b85e35c4e7694864e8925ce3cabaa580c8f1f0135b50a8b7d50b10e55302c53fb4bfdab70f004d435b4652bac91fb6eb4745fad2b28b458824dd6ab834535acc72f0f0682b5b8e3f1120a1656cdb7f8839e595b620b9aff99704888f746288414abdc93ad24034c4eca3e354cb129713321dc360d1cef032bbf5f5342edc2fbaca6555327c8652123ae728481c08a3d08b4564211a1fcbbab90aa027b88d698ba426ec31bd38d471b41e4414e12708d353f3c216014f991d44288d642adda9ffb7dfbe23810b92c7333c8c3b9536c9dc15fc7599843b3a95bf40242b303234b4bcf5a262a989c719b56aec27ac26f781634796d037a4fcb2695794171b5866cc95820e6433119a5d6d80d1dd9831e6c84936a6491ddd59cc8b5b5ac5be6f3322292754fe8a3184c4e5d9c1d06afbbeae2186e5c2bba68d85d3777a9fb21858d4ba6e3d3d38ce2f8f6286be45b86ac6482606e9aa1ea11e281bf211721f5ee520853aad06ba75105e58cbc87ebc83869a98b53df83cf5efb1c2506d38081ed5f58585b0542587808e57d960f88b00868ef52582c8d0c3ddc9bb00460b808bf0ea502a200d43951875e4f5e30cd374c1e9583275a4246ef945ecc80251407c6db439ead0b4ab15ccca6855a52c95f1956c633a0b4e3d81867363df81c9da8124d84f6605cafae7cc882e5a82316559d7e7eb30aa424a8f2d9d2ace04924cc904b91f09ac7130e4c35593ee207b03274777f0874959977c48be8693dda01a23243d8ecb218500399c2273284e48b8fa48c0da67748d1418d35b92ae87abd8ba873a589b3a3cf4bfcf8a1e2b595b01cef5a87517938950851f7883dc4bfa5459e3be73d4cbcd54bb271103161d2198649922923927c7743928129493ebc139b7948195b9081b95767030e71ce5decb93dd8f374e08bc54db8682a7e05b54bdce51a3130f9d3f3fa2d64d510aa083584d7f689b1ca48d62bf220796d287d0895ec9010f3c435aafc7f08fdae7589e55b2e5fd1bcc0b172263efba217923525856525d7d70acb422192daccbba6628b6966f947f86c9022d7f55e506c67b25f200be291a0b769df303edd8eb26362057a70b20ae76874a513dd9a40b32490b6dd74621b80948c847423fd061cff206746bcf3954415af77b9061c5d8abe6452179e098d24231e9e25067997a5d4ff5705942282f91232b93f19fa27c6ad0370a2cd07d2e5159eaa9bdecfe2067d66675f90d2267efab7e9f9363cacd2d248db60559224025096bbd435de84a48c139e2349af0cea30283608d458a2a385dc43e74fb03c3040fe687a5fd573e9d0192f309a233b0054283e959c41e0c60f538dd0589cc15e5afbd4da26bb88388b9b2a954ff008905871943b115a28a8871478e616125c38e46afc5b8654dab5b5fdcfedd7f0b753b0d5b67b0b940b81edda0867efc61bd15b8c0f929b8a17bcfba94c087302247ad6c617917f26ceff6a74e6ffda3e113ae60e97cc0bc49d9b8ac8503c57985da5cdb5b917acaea8250ec7f3f900f97b7fca882da48c713306c1c4512532fccf326b593a46a05aa9e01b9d30c9c245d71ac4201a064a1e4e7575cf9c900b296389e6698178c4c6a678f4394e50a000ff4f0165b54c21875383cde7435334e0b88d3b763381a213ae2101d04c53ff62f828f91d7337902c52511e0ac0ed1c83694f6330014cfc8d95184c294aba1345806c3667b41ac47ef2b29fdf8d5bce78fa84af518ea7e2cf329dba195f51a89a3612a75930806807bbe0cb80ba6897728ac94eda834124b9720e3443e1d37c991be621c3afffcbd4a9b58688a75f6067be93f0af0d9152c90fe2753da8b8b43d5767ac75da282d6c3fd1b71a1a9489c1bd71711cab4f090e459ecbdcc45cf8007e174ba4c5453fad1a12bc8b58a724c9eecb4e9098691e49c274df2d4b92474bdcafe447728d397aafeb627eba455ec080bf830f95279fc38cd9431755f7050d4cf23491a8122929e31b7bc228d2a2ca273598c48dc13cd941985e1231e2f0ef927e8200934d83fd0ff316409bf94d6c60943ce244d2ce9b8fe652737fd67c53b0099dd10ddb46e0cf2b6c756a75d3baafadbe4a8155fac1ff97c8dd2a312563d25095f254693ce182fadbf93bdbc1d5b54399b0d43b4bce59199683770e5ace855b39a517c35115d6f10863777aa30032b5929ed50955a75cabdcdb081fba7942e929a3af10ae5afbf77c7eb4233c0e08a7369fd2a42023748801dd99d6d9b84414894c8dd42cc2ecd225ec8fe52b13fc092170c3c39be1774137cf614e7d3e117e05e95d648765763b604c143b572c560a741aa96c93cfce9549c875d05e999c34658d54a130cdf863126f24639e08e8d96ba0822b364401fdbac559ee330d81b14a427f3820baa50c145f2efd091cb560d626632730380a63ccf70ef9437092458508394712885d61421d2214da206f9d5f672d206d6d6e3413056d34412eb5a52b0b7c37ffdcd75f3e22fd36825d7897b0b93eb3b554924ac42970eb684e8c1347e98f442a5d044dbb3f56e31e4b1bde268e28f2414882c46c1a0b65a2adea8a5f21d27aa07823bc1aa8c7026b03d56dbb0be649bf2320efcfa21d88d112021f9e262e52c811b1cc61b2d78ffd89382adc9a668cc2510ee53267c95b210a2b6610c6759b9d3c40e90900a4e04987233baf39eb18fbc1513b84d54df85fe28bbda20ae555058f7a6e13ce1519a91f78d24d49f67663e01be2f6b6eba86f93cb2c9f8142fcc1e2aaaad677636af5190574ae9ae7cf4817afe9f2f0b75139b035c70780fa4aa015ce21623559395ab7388e8ecc1763018dc783ce308d1eda0ad44437b4e58fef345608784117675615b8a2db95fb8fcea4ab979d4fbe08a621118af024a1a915246da6c0529c06f92028c553f001c2a03a9f5d0f0bc6eb5cbf712404763a02d5c894742b3601c0c1e93d08adb178de32df03cd95be63343881703955fe50f398c7a72c5548d23a7261927562ad0c212619ea106e8c9613fba38ffebf2684ae42a6d040851b31473bc48efc335cd000a6a15c62f6cdc667b755d0430f768e8b0247f36b2df8610ff969156057b43dc4f6c0bdc910121b659c79265a883b55663155aff06c7a7e5b33e81c157210222a23bae30dd157ae530bd74cc3523b38a582039fe058b53277814cc7ad9bc76e1c65c1932ea76c8d34dcc7584a5cf2ba9e576c22c4e9245a44ba71df510c503ff1005fc9a02d5b4490a5ff94d78226f03ad545a68767cfd4f191e7b1e1a33be873f5a206415200c761da02c066b99298e1714c5178282888bf2d8098fd27ca4bda6a5d3f221e547b75e2bd96652207e9f0740e327e847419a1b241afb3764d6da8b870dd292c4f30d3d454ac0c84e1689941a78c39252cee78cf574a5318eb8706f7cafa373ec469a998b366bfafc91d4174ecb63320689b7f932db380492525070e62612712658908b5c508b9b763a6e61127c8df619e3817eb1073c67da233cd4e870ad97ff2ad43ec007b53f90a0e20d5651e6bd5781169eeb0f6b24263ec4261cdde0c6b6408b458d6139cfd1dd85d4e861844e9dd36f4339bcbb08ccf931abaa74291c715278a53169248d914d6108b91fc8e6196e6ec7f5c2496df3d6955110e420a2a60dd042b80355da97d27978e5902bb5c52e82a049c8f691644b5b78c3d74a85c10a21afcddfd31af244e6d30e14e0cc41f734fcacaf9a091188184693294928adde3b2817c2796db1e05248b1e2ba858eec795817368db7a7c01e18d8208e6197fabbb1443dd6804256dd3ce000fb413aedae5cdcd7c857c78fde2adf47f361bb8bed915aa2d75dfe039ce71c75b559c35c413495c834509930c3a7d1c4567fabee8700de6b9e037c331dd331db5ed94a8b849d0aa7cdea4a167257647ddfee53b1e3e799b164df6b6cf8940e8535f7915fc4941ed328a15049a6bf3b20c6921a6d758ad8a9ab246a184bc9b6b458336656d87739e16b3f7c4395abd36da726028b1800067cc6803e516b8ee0118a4a094b70a9c67ff7178db297af12a60a3cb45c1ca3fe722562b0be942803cc68be0569e4e6690c45f112db041913dd012a50accab971475591b328705e21398d98447eaa288f05c8014128ff10d0cc94252e31a5c0652012457d288220eff51c4b4f37e6cfe624d37c7ef6e9e54c1c21a79c4fe41f4aa1b6b21cbd738e8d29502abb89e5e8f6017b27579a9bf12466c22c41440f700a54dae58d963439f7578ccc4bb2d252ddf22aef1ea7597fb7304eccd43fa02aa91e2bce67b06e7225866fc31cc0dbf6ce18d5ac49eedf32372efd350b368bed7c00668e9102eefdc77efa353ca6c2346931f360315145c5a1814a953dde44b836876d0e115b028f598d0ca5db361615be32ddd2b435d4c7966018872b4b59ce655b07f4b724c7b7e9efc1c36c4c7ce347ce05f22152079ef7800584b9888fe76ca6059aaae34da70216053e2c4e05c31ec1394fc0a5639544bc985f60ef25968136f70035c1060df929fc396bf17a01c36f976c538f5206fbc6e8a4150fc6df0f0bcf3605c7965a96d5478c749f4d0ef8184a429fb6e7e7eda0b2fa7b5b4a610ae09193ad14b7eafd355612116a1a860af494e57f95d4adba5daea4b8600d9955ce2932eab751d155f547f43688d047cb2f52297085c427f63b89a385a61a12442c2acb3c2cf39d39dd5db7492af67ac467c54d945c4b5ede0ed64f6b8bf60769c2210bc2de89f071c4c92584b8dc87229ebd2525c55aecddfea46d4149297410e962527593b096df6539b5022f66fa0dea1d06a2b328efb54f5b77afa866b8a3a08eca964739cbb1993d883b511353cf4c4082484efc2af4473eb49371d4d3e62e4df5440a20104891ec1bf2d59d5d4ef7a28306fa3de97156da72c9560487b3390b2bcb9b0bccbc48059c5fb6606b8e8936fd28c731b2cf4f793b85e44b0035749fc56230db45bf41b1611b891ddb8e74117ca60d078b449b3ecd88e613d8856c6954cf462de8fd809154d0e0e3b58d634a818e91731a6f75749846465110d8ab63ad4b258096a9c9d25a75f42d61a0fef31730fa3001a2c431396413e6c84e94a0af485fb896216e968172c73525fe3effafe00632c6388b94afce032f35813e5790450833d03423f758828bd8ec496c8c4d06c51cec1de474504498927454b3584f02522a8a087a371a8a9167341a849e392febde547ae8f15a186207ba137d7992753789e47960fbd1c644aa5fc1343967830646f4c043faedf2662c0f257198907cee40336ffbe10befec215f367528f082e4f92b9e9435d7313e922a18d581afe5168ceac051a7bf54f0819e5fb3d9ab99103c9c35f4f27f9c08f1b333febe71050d0622340c5e7cdb992b332274245f107267594cbf29c62cc5a51bba591cd1e462d0ce13b51861e710cc9b3d46c3755176f752096852ab8c5da6a4928250f2f0e58a39e31dd0f5ad7a2c15970fa1672f7431c89e6162f81d969d463ed655ed2c91375fc166c1f9560f35485b7972ff2be4855e57dae89a4b5c0f83aa139a6fd2bc4fb41dae61d8b512ed6f84ad6f553836f710a4bd7072fa76de3499ebd8158d559880602ea2959ce154109c60450c861158635a9b713c40ffc259350593ea4d0690c540d37db29bb166b96099104f8b42625f732fe64b4875fe559d2a97cb112aee966edb3c17db99cc8ed3d1cd62b0db7b857fdbc185c9510b7c6e74689abc599d84b7ec3dd3d4543b9288d1a1c92721be961f0355648272c40f04ff2152131a0ca11485933239d5d61d94159c5f8c3426ca579f48e1d7b001c8827fdad92243567900de6c44b9ecb299f3c6d90a8a1468859dca673ae3d4e622df8bdb1a98115e4136ee241ecc9fe5ffa1eb04e13703648d626e6984232be47084d8b8129774aef4be852c475df158b366808a2fe0d809f0a7670bbb2430db6a1333ec375d842c3d04e7a1e9f1fb828fea0edb58e14394eb3735b0ee096b3801371072638558d5e97ea2998720dd3813f1aa2c0cf4fe6267e67405277579c507b6c3d0be72ed44c95a1e0322a7c8e70f97d97e2648cbddb0c11f12edb97c37a52fc7d54a71457b49ebde0cad0e375826ea5e0d563c9b521bf7f1a63e75197724cd5bfc4654983a0aa1b602b3242e6f4887a338896130431a28cbff1a1d6524b5d66dfa219ae426209fa2f2eb24ac563494f148d1c3ee6a5c888543226b399b4f04592222717dcc66083709cf74810b1f75d2acaad3b2ed2f39c2e6a271eff473bb28c710ad80a0c3feec8dcfbc18d5e062a2d89162d15d342aae24ba42e412b1ca5c1e7201a7bb6c9c28c7f4e662f6a3e506e60735732b8ef27def67dbc095336402b7437d97fabbd2aea13907ad5e440340870d272bf00ffa550e65720391695f18048c1ca078765c756b297db6aa02891ec54f923460306639f34464a49cd852669d3934c2e58893972a2714dd96b6ed9cb4ab280c3ed09733ae2f1d10550940577341909caea9fd1017f43953e6af3ba1731822657b9b7e61f7b9cdd6a26e3804e630e68896484a5e63714009cdbdb5201846093048ca86e3aa8c26d0c2fc9c51ec467cc7503508f1f33d1779af8f745bb9d6b21c4825ad7e7c6651587867ac990c2f1d18bacb48d8e971d96c784eeb4e2068d33031e93b40dc5c10e419a2341b988582aad415527199105107436f4e7c36ae33d29cb312cbc2cde6309c0055353d183395898085f6a53756a6d69e012f933df3aebadfff73dfd20c4134ea60cffb8a75dbb3e4f626007020296f63cc545ffbc6b192ef244b38264a0ce542f66f0f923e093843db689ea8819bec1bd0047587f75971b887ac6bf1d72234d7477017b82800a14cb42e599b7c8c00d9179e003b296ab1c42caf089faaa7023a037b0435d3e981e39399a01348b29450f128dc4bf738e01f2fe315d20e9f4f059595f1dccd47e4907093cb017408eeb0dc58e8c880dd0edb56a87c4dc6c2a401041b1920cedcd7046b3470da422c9a0ce7c8e4031255365eb7d4c216c5af1f27414149b64f46e90c1c34de39fcff676dab104356b0245e809ef0991e326e37ce47124141870968c90c9f2c20eb01d313059c927e81f22f0f1e2efde2831944a02136f230424426ae4b89cdddbc3b161f09234fe0b8beb075564a32267cde42d061bcde8a97102a4b4aaca41ad7d56bbe26ca501081577d792dd5b0e73e620cbae45df56d41bd3617ca38a3c4037523e920a2cd434b1f104881fc8cadbb89cf9b7a73f9fc072de521d925df5d352a8e4554c5818d314a9d5dd88893c2a01b7c24fac6760dc9ee024c6eb592c0961611857689184c10c85034c56e82565ec06c84a99d0696fe5156b30b4138aeee8d79163ebd3c569cd3a846fcece037da1a61922347d7d0a96d6e61dfa6c9640142ab6d7cda2a1841af9a2b87eb41187c7d032fe0f0d9aa998d094835063308838fbc5cfd98fa1454695bdd2e7348bb3e789b15f78d9de9c384608a6f2c275d9c2628ea1d973e020bdce13782cfd506197674345a0a820990a6061cd98447580997a1c86aefc511bd34d9369f5a8e1a5d62afaa008ec7a832bb1b416820f11bb16a598bcb44a682696837832159ac0a7b887b56eb2e7d1e4950475e1b9613380509a99a650f80cffd21e6eddd84750288521f8e79dacf4ed14b8e364fec7b9ada27689cb28e9c730d020b1b37c0e4647383cd4e136c202b3c966142606c4903d5d384fba4c4e29951be84a501bea4d941cb1713152b00adf6d216654a2d7cadf3501d631f9aa73c5744eab1b6f9ae6064c9b387c9ce8a90341f5c424a129d6a7515e76eda5a08b71ba25f2ac25e4969be471f8844df1ac48eb29f8390332661357bcd4408063a08ef3544187ba03cfd85d8a13692aa50da61924721f9336a2c2d015ae940e85fed8f4174ac8eda8ac08434bca2881fa47118ddd67930fb014de2894f60f643d30aaef5f0e0087aa44e50113e5af7263e17183193c644a72ba147847cca26f4b944288bcb52c5c0b66cc95f0ac96b768193902108131e838f457fce6d430e3b4bbf3beca269eb0fac9b52719b2f29ea3a2394ea4ce892f937194c1dc846651cecd4acbc3cd5f3604065490896f6142c05e1abbcece1344b5d18b317d996ad4e6e38594db2153b85b28327f5ccf33995dc7808e530dfd9b1e33c68c556bf8f80315e0a102494341c807e67fd8414d335ee2625d82e9dac5a69a22ee289b1479ce74160de59ba31357ab564c270e05753b9394c8958133c7f56de960d64175bacd6bb9928d4c9ebce9db44b51ee4d4613964686eed7ce23c39e351b5d2fd43bfa9c27af7f7ce699859e8819b4c6a847ac791b57cae334efaa152bb62fd67743f57a2bc5b65b0c68358827b206aa5f80aae7176fa170a357afc9ea445cc1b5ff700ec8d7f73eefc97557c54775a518925eea0fb5417c458bc7add07e518dab7bb1660c592eb52461ef555e7de6e5badf06f761433bdb3431f546866cf950e4842944bfb0dfb2b403cf92e282c8d084cae5b3abbaff972fd7f1f3988e6ae66c05daf59d482a3cb776fedac534afe3f5c2cc9eec4792346e69f1ea56fff1de92bddfd481977719619db26ecaaedcec95d58ddd609ddb58865a44b4e687736a1520d2d5337513747b67b7f6ff1cb922d48e77479e536e1b6dd10dac40f62366ca2125be581166205d63aa9dd463f59cef1742e56d58221dfc6ea59d29ce54170d9b3086e40f70fd4836063ea081356a38868694c103031d928449c5f41eca47804534e0fe1dd5b36a5f33ecaff65ffdaa03e6bb4feb5ab77a04d0edae1602e69a3aea3e88039c04aceaad82bff4f79c2782c8bd7917d50eb8d268a7f2069a64552bf2d3c71402081941d12e195ff3ec4b488f34ce1956c0bd4f9b9638ca16bdf10c8f10c6e0a1e96556573b863d4347c798e0617f737bf6db1b1f0552bef43602a81b56511eaf5beb8efff647222f916a74602e6812c2ef4cad15305dd21b0503c4aa3678c5e4232c37a13963ac3a0167942d102e754c6897d97fe910628478f958812f58ada66f147a216f08cb3d4d9d605a0b2d5f0aafa0b5bc9e2c79584d229576994fc4b8cb98ca3cf233b8083ffcef2ec16382c93c5419f8a10f9ca67a15fa517de8a1a87af420aa0d99f3c3851788e9bd76bda0a40429b740b360cc419831c33589b99932a39dacfcee9c1316f6ce4ba7163ca986111efddd2d05c345709b58cadddb963196f5e347cd52c44d00f0a5adeae0504549d543b4c17d4802b1d6155b302a7bd0868da1d7ab8907ed08cef127e991d9205aeeb2f5fad1f13946efd9c0cc2d716da49bb4064f902b7fd25be6d5b5b6b44bc7f7b49b6245ff5101a6ac80f45aed038d2e40ca71783d5e15b7fdc7895122458505f39707a4b48116080202c4ffa659df1d2639a0611d01421462b8d41427d918d39048600a0ea0ca69fd8fc3994316ddb44da49870e5f7ae7b7a674f9615ae2291ba70d05bb59ab01683fab97d5514057acbf8cc2c4d95c7781ace5d7d701f1913f7d13b894055b525ba43e967b74634c302273000fffe80d986ca5758e59e07fba5c5ab6e9e0597b6158eaf059f099f5dac64d2ca2dc6eca1da5056a8f8d7cf1026f1521ce65ade53fed44fdf234880d7364ca0f77aa8426f9334733eb7287d4bbc4c648595946dbbebac8f63be8e928e7a022a346b7fa1cbe472b61a598ca8866f9f9eab70a03f65dd73db75aa4ec3ea5f9dc598b8f28a5e161d94513886722f5a358dd65d20f091d3d84c41cb48dcacdd239802e48453da052154535138f9f63ea8b212c13d5c21e4dcdfb87062162e6665fcdec9ca5c5ccca8a90f57aa03aa32e547570a2ac08f850ba0d48d19eb8129eb9f0c303f60a0f074015890be1fff7ef2e31963a6ca97b75c67a061d22fdf0af0a96af4d9813d1788c9002474ad24cf62c2defbeb305279d632ec9b645e643b20ff3f18617c2e481eac308372de9461c559447bad51babe3206f4831b863b68ccffa767663075236985dfcc74b7c2578891614890caac95d96ea8cec97511a8b422c5da9aaef3a04f2082773f9d312b856e035982e96fe4fd86fe217eb825b13dde4863cebe08505eaa3bc86f84c92702b8ce58308e54ecbdb817fc0561ae6094a50e698da0769f657f68fafaeebe65d3238934d98cd9e3097597a3e8a5295b3a2c39cc92ad5c4b25ad4331f254a7b8f376171cbf4592ba3f6740947284201a11d403fa42ff0fa16377c1059386fb548640c48428cc13591e5f3bc9b3836505ec3eeb09372b227a339c98ae9e3da10d87f0454fc6e0d84386a4648f41dd6f6bb61776376933f40b32568252a870d236d36fd7beb7aa09689317dbf945f6aaaaad5d0965259dc8b3ae16e7011d957d1a09e4c9744b6a49088637c848d4904ff820e6655dbfdca5675e444101d1d84d5b62ae60aae5de4e59853564caf9c5cc5102927bd68f02f86e86036952754b557094881aed786013fd8949e0f533c4221aaeef790b89c06b9856047d287de2f7edfe35fb821003c0941a0b0805f7d7e76eb437ec8b9b5c429815bb7e043b94716b73632ec93c9939986b35aeceef1e8844f27e9bd874dd5ef30a520a4ad32c47d50da8e12217d7cfac93388fff4d8d6e810935ee82c723b258fa32839b5dca28a0916222471285a75a55d23327c58ad2e812918b5828dbea38cb9e437d346f3685e322ec9915011aad59ec14a7d8052e9a8b328faccf983e533b46b40fe37907f2790fce50d27b83bbc0475899f967b07c98145821e714c7c14750c071b3b84299bb66a1127643ae30b8cd096b3b2ff78cb43a951b370b49b39d83a4c94b3157349af264b313090bb0cea754737f1c02f3b6ca0b94581c60805cc21a727f79431d5edca3e0930cd2c293cd2957c38925e11927f0510223dd9f68d1af45c1160f3c964c762408d92436ef4b0ad54a8238165afb1bc55f955c97558d39ba4b1ff78e3f33b436be0bbffbd87359dd1954f65b2ce1091ca2092312f6923fcac1cbcdfacb3f194dabb95f0ee102c1789a58bc0959e9c480aafb76331525b7643e821ff84a8088e610f66c7c3da318b7f79eb70dfd59b18275b42d9de230ff9cd7c2b5db2340e6c97b8c95c7629d943f01d6b6db3a30d575ed40de52139ab1746dfb016fe338ad6be7c3bf9662c276c818a804e65ca4262a2c7dcf20f845c07e5a5e041c1abad7a5d89a1f02ac1b522f88fcb42fc394f3fe799e92a3c90de2a3c9483e23a1d28f48f435df1c0a06141ffe7d1ef8d811226e18816c6e1dc171475f4cea1ac240309ecee067de71f09cc1c4fe8aafe20eb8b38b97fb73af8d54856a052548dc2b3f441b01e9a491474c334440aed0336e33e551a8cddc041cde8fc177b21bbb1eeb998c30fb5bc788103201f2be3ed5b1c5946cfbea1034a925d7918d08b940886a76298a43fe71ac0dad45bd1863160bb3623e31750b14e27a1175cb1241d3eaf2854c353a9394ad861990a8c2484ce3fb3bbd0991d847a615d8de180d0d61122dc1442200796f4035be26547f74f2793b4d139e2162f417dfba9c5acc4fecd4c8a29276784a08abb1c934bebcedf60b1d9bd956232f3f43ffb1e7c92c46fc0e3e2faf928c862dc5e3e9e85a29ca44cf8e1c90b465826245988671f1fa5c1152031632098c3b9fb5276378ab349760fbd1c94684b9bb776bccf5464d380ce0615dfcb6bb7866eeece129168a28ff2a6f42fc617fd3c4d959d2b6d6a5a8c269560a0b26a1c860a17e2493d27e7a955baf48bcabda85474864aa417dbe7878be236f31604a138e0bae5005714e9550810cc00ae8bf2c1e42132d2606ced79b220be67abc2b2ab651d62e0659583d3257a7109f54f2107f72724739182c7a25e2b4e793098f3a8ecd79019a9a4b25827854bd869a1a9d4921edfe85326fa6d21bd120b884ae0547420031ab50679c8fe0d204e36c24328db1c93cb23d4a90a00eeac121cf49ee2d3c72bd6170917b5580cf80030142ac3d208c298d7bd96b9b686a7406d29e74060f5e9cde94ae35f071017665abfde276af7d849148caf77bad0f02e8b0af2914cc2c20c07c6dfa608cc28b7e5e14719f6aebb649a8b8a67c2448f73cd6592ab038970ff7e95d1f0ad52d4244507dfa9afc580e3bd5240ce6f0007b742614824c631b6ab27f16b2774d65dd94cd586729d15b8d3d23d137dcd10f7dc58b0cb26c0c177e5f6f46bff4e041e4830d0b61ccb991094a3c37830e77b0ec9ffc1ba45938f010367a164697b133ddf6b11f0035598760e31d807f2cf257915e3ed334a56ec837c75ee26c3a27876b41ac39f6471d0d38f3ae5de1c5aee64411a62413102d080f267d0a1f48891b89c0dbf15438248dd01f3f20c4b2d071c0cbcbc530562488017c68c587e41354b717828c36fe748611fff3a609333d9034af05706481f8674baf95606cf7cdcf2543f599622df73e85a3e6cedcbce10798e082833b10cbcd26d5ce459b4ecd1abc68744cdfbbc0c0f27b0c307d5b0f132c91f75f08b1eb3d44c256f2563d74f086d4120d189e9a24f4f8d9a94f689f53819e319e987e72ea56f040b23a6cac63ce0ac8f86e6031ccde6b9a8208835812daa944425b58cea11e759172398a153c321d6db503c362d3947032804f9dd44aec42d7f059e190aa922e6520b158d47ed134cdc491fff2482518d688c51c28af6b184b4c2c2ebb456841d02c13a4a2e86d693fd0775c7d5890ab6def00830951908c5a2d84829c5c55f5d5c418a3050ac9ff02551057a38e87a8034068796f76a1cf7a1aded96761b8ee0a81f61df8074a47a1b98587cf9cbe2792be5d903f2fbf94378a20ef84226b146f61d27e9f2476d7971e9ca40e4243871bab6cc465e702b83728c43b0695db5260ebd0e7881ee1064694d3fdbea1ff546c947a100d351abf0a6bbb75131fdd80a1db10d1289665a90375a824e6606d0d3b3822f76be196d087eee472042e46cd323f354d0819cc5a86e0d6002e64bee03c60f8860420466e566b804dabf9a4fe9b14c6b2ed50640abeedb64797c7114a7f4cd3b536539617cf32afa52e3f1a66cd6895fa38226db6abf3f320f089d4941a82003e78f703aadd8a9dabc320fedb729cf5e67e870704b6249a3156863e6b663c7b8567703beb900d81e40d18dd88d0dd7e8dff3d15d28c2912c3a222b6544f1c8218d8a123dd997a0b9785440ae8c2d78653d5513f10dba02d4f8b7c428fc16a196a846003e44c18883b9b3dd03a4426cc4c5062bc6929971146aa1fd27a0292e45085588c7e240d64e51c854a082c9bbcd1e42f701c2a3ac23b309c8700c74b13ac39000077d86b4b1499d09f4c80c7aedc3d29cc140801f4479524955347a24e441897df77cb2d1d7366c07791dc24f78aed86a0c8df944217af9f23aa4fc2c7fea3650794515bf3d1833101e67a30b27de32a451b04f5e4d5f554465a16f6cec0486eadba05c58629af47fdf5c7f3b057bd624dda6cc2a4bd251adecaffe21af3fb5c71703462f10bda32d39c4d9b39788b7be8a16f913d87390a1cc5fc741c17ea0e87f1be1191db8c3e573703b73606c7d1209b5c34773e12c4c397822c1b332805271084d2c0ffe2538a2bfff08ff0284dedd1cd00d11bbdc914ab3210ce003f57204b820e1cf29da35a110a41f4dfb6e161034b53f15b5016ce078cfd74a9242fc71356177c3c73f6a790ff1cfc28a46d113783f39f1a6197b095bb2ba83c35d429cb7155df07665ea65e39c1fc3c39ce3e9f9772354f2f93df8b25a27025abb10f6ab16d9a98da67a44d689e2732cdc2b153c8305124bce193775da12e57f69810fb58acc97f4258adbf7372a37d1e2890a762d0fb9c2a399329d040dc9195a72eb9ae3769f8203f2ff1f445ef84916e460f108cb11e8b4b4fad48a3ea172704225f85b7795f02641168ff9e8c8ae47a2a5486e4195cdc17b0566636ed9dec297c6a2ce9d6c76f55e49151bbfb73cf642ddc5ba81c799e391c2b6c53920aeb1dea6801f206da5eb0e6c5486c4696ca544b006ccb2e5c1b9942c7ed958a0d9f634c58567f219ee4ea7676e57aa9f2dcd187d2e333f2ef2c188190cd2d4e8249667b3e7bc02d7f7d657d965d641f0a07814adf21af807991254f2cf5aa6e5de9ab0cb04b7486474c8e4c537bbb34b96f1f510f8c1ab2392dc69d1f272c0e20aa959d3f321791f6d586fd9f604545a2ad7e5e7a1559104b460beebe964e08fd34cc2c1f0562812234a8156cc7171d929767e96910e555392b02d276321e454d4220b0b29f4536c1a76c54dbd024c1003eac5769459204cd29a0e893213309d6a0407e4ef54cc887b90edfc5ddcb544b64ea506f04f8dd72c20cd06fbfb85d54fcf1a183028f03b83e0f78d15f3dd442157c5b63e1c3b8770897bfc7eaf9734273034d442dade6d4dee2d65923205430ae408c9081946b364fcf58da070cf53a559937bde7eace69ac1ff3a103b9292cf8330330ccb28e9f34655aa4ce67d7d1b2ed5ff6a6765df6ac9fef3405cdfa80aa68e846906b1eff9af431cb11e2bf688a5fd9f8f89a5fdceb1ffb1fff3f767a8e38e1ddc977d6cecc07ecfdb5087fd9e9f2150eceb38abe8fd950105fdf723dfaf6153b2fe7ce720eff91ea09e71f623e2d0839941b80ffbaf962fd0157a3033ac2bbbd107cdb2f7c62bb3d1d6f3623f25896c8ee4d3331a51c17e077b0bf87e69cb4d231670f999da8c92ec178bb96627d6fc3d11a531b113932849fff5f46533aa825bafe4727d1fdaef5dae9af12bb912c5e2ccb00f6a0e45d77fa20f9a5d8f6533dbbdf79f272e75ff75b6b3d7f34173ad5d494481e88b0a4ac7dddd07cdf3dd27c5e170381f340d9d243a44f3ea4c1d3b6b8e0ba8a0a284e88a8a2748aea820e1c815154e49ee60e1a38a12a925aa94e014a5c906ac2b701021ea0b09b2c043c5c3f34275b2738838fd40278c151c1a8e1049d4809b020725a6f090e08ae20d79d121a182a8393be820468e172c7cd20c0922cf111870b0c3039e219f1029ebc37d3d5146c9054a3966a4b9c3252b4a0a239a10010c72a6b400b5244b0bb75a459d5cebdf2aa8c8f5411192ea38d1935407091f6e529db1561184ab8a1b5ad946529d7b072acf72e7eed070270c115d561554c420c6eb3c712634a3b8332577278a5f9db903e50e132abfb366cd144ea4a08273f5da7aaded29acb2b5d6da3676ac68aded5c5d9c3d11bc94b476f0647b870898ed636bad65833b97f74e5135050c5358b9b91caaaa92baaa54077795243b13529c905b02c772e7a470ca65e7d0d4b153bd3a69ea9cc9a58dca85cfbba7e91883446da0dfa3aa8dd6dfd9bd4eb05202f477ddf8236a83be0109e2fdfdeeef88f3c6a8f9dde8efb383faf6dd5fc77c2b7e14f4aebbd2752310d23b03995daf75d35969e704d51262728bdc544be0f2079b2fd236e81b8db6c3fe067db32307b02b164b5b0e2c04fa66c71f33aff595178d92e0997fd07638796d477badb3b2683c3a2babb3b2948cb0d4a8ed5b140d83f18e738e340cbc03da95237fb34fd331c72b760c12b581faf3ed13a031255b6c4a5ec105e9de12a0f441330674eca0df2f25bf19f2c076c445d50f1245d351ff6b5587eb58a82ad827bba4a343c83a30778a28b288c8b9592344ca03f058c1258815b260e5b8743cdc89b34826763535747deb0c15cf64d891dacae0b563ea5e79823852a74c104bb2883a220acf0b35e48172449d17b257e749963fd1b960c6cd24cd392367cd8ceab66cbd6212258d2839bd8a64c3e170436a145172adf53b8992f36d4ae02e436b8d86d62e9d35b4d6b9c4f9fe0c97ee2c7be2054a949c1620224e5494253830e1722b67998e9d4b078bc89439533081927273cb22e98ca523a7d2b9caf5412c72adf59ec1b7da92a268cd9933c7eada3a04700c6038b9385fa6d4385b9ee2b0d024ce932570b0527803274d7ee5cec121e206383824a170683002470627382c50e960bdd9c92913a7eacd1b26eea31225e79b239eb498375e9e38116fb42c7122bc377094bcc1b2370c4124be19014a0f3ac44922829b1e2c0ba8c218918b838788245ab9736fb07816df745dd064acc4b829e341782deffefc9696232d48a902cf9123f75a9dc917966f9e7cefdbd6a011410a0957a8c8dd70bbef605c0ec404b9736f84e42e77ce0aabe25c8c8ff1301e86c8739eebda5811b9f9d2e6481b9c9d65ebed8f2e774acb99bb3a766339ffba3a3be783d094dd03cf1d0efba57defbf9e3dfd552f761f70abd59aad2bb6bac8ebbcaef33afbdd5876e06fbf03ef446b45a6ce55ec3c43cf75bc5d64b3392425f9977b938888fc875a89664744c4c68d111c1b35443a5786842782080ec2e9b21133a44eb1f1810865d3c5c8ac6343432e6d2e183ae7c1bfa1e092ddffdddd7bb8dd151240c38412244da47470c2668606d44055420f6cd4ac3086cd0b2f54b5991d0c682425af5f35ca935228b0a8b12177e8a38d925e308f0748801e953d8832be94880650ee1c9b273638362290805b78dc097752b809f87343b1d4e4b27344d2b89033221c41f10ce148c640f942a728819f40022537d02aa49c890cbee4853b55ae9842ad8042b368d264047f5a73c4c89a2176b23882ad15940a6ced3cb91a22a704ab11d678912a4f8286669dc1a28c3ba1ca6553d13cb8e6ce414126ef707728c46477dfd17947cb879967fe60369b51d2b4d140cc7f2272da683122645a025ce28c65b369a3c18890690930fdf9a598e7d3bfd3467f1121d33fb23fb31d6f4cc1fefef6bb70c9cecffe9ffdc1f9fd5db834f3d7dd2b0f90e7622806563c67b645d0eb1b06e3854f4ff7236bb9c2fb3915a2650dd09a8c0841a20e940d73aeb0304a5125e74411615a786385cbce0b45a4d182854a490a405b6840a10bee0a0d60f0786941b740b9e224a584942c12c80186276d6418038554155d28087ec0e1c81635509e7e682aa1aa08122728389899438597518d179cd58212639c46103215150128a2a8304215284f577780605b4a68d3830d7060582197470d156c84786ae2881d1898e6082d4370c161c509d96091d2040b3a6b9a98a2cbed291daa729042c91238364eb480040c4e767ac06223050f446abc2229264cccc0e608291886c889e2a44505304da2a8e3e5c7822758c860c3130c56cc6460250a33499a844921cf55979997ac1e6e7841891fccf00081293cb91fa8701802083a968514980823b5c3973959a820c40a3924c166072756a2e0410804236200e382972b989062a38a13524c218182133ecce902f699302ea051e34688245a34887a21053934cc412245ce0b099420a284c821024c1a02e04820030a4d9c50e285385d94551b2d261c59f226eb872c459e903283912e60e0f0f01218a2c4942b3dac61738491932655d8a0a509161edec450e3a565353473010b56191c114be0b020c490275688b83387891b183cdc50c31029ea3c5161a504ae0c1b304ad2a8d0c68b8c6ac49815f294b162ca98322db4907067843448b090b0893571830b6a88a062450a1e5a40cd906b824e0f3a5059e3c55d3881fad2831d2d72a40690c4142a52a428c2ce1c28ba886cb2a24832449e144a3083810d3db46113c52a8a1435d3cc972c69aa18d26488150d0891a33a722797e7c9133e63c26831620a8e0857301871c495094caa5068e3a68a871e9f1db494b0029ca9115c683a4ab08c8952020a4820e1c48b11082104578218e0ac51a2853064ae2011a7081fa69af012d46b6498010e9c30504478b2c08c096bdac81993c298345ebe2052d01182053449c440a6863a4c4439e3c50a2c54a0f1227b40922167a0a060bdc9228323ee9c806b0288222630114e12881099c2a9cb1d2b0ab040220a1636dc90c4cb125d5cf814054cc4f044d41b16b2e234a550248d192b155c70424a09efa12a8a1356a6572657bb831ef95f9092348b117af105b1187a1dc976ad55f342b6f62d119964bfb465233b263d11c56b348e9a28f94e25354f7e9f88d6e600e2e07e028927a872f9b91ac5995c9279ae20070c16484a5872c4845bf9486f660053345144144640d981865b9313192482b0e1aaea09226e34d0a4d0640519a078e3c26ddaf2cd1d4e5b0e1345521444335099e6f63ee89f778eb3c96a731d41eeb75d54eb52fbcdc305bc728fddf4e6e207ddffe4f22797f7031f37cfae61dfc72cdbb74f8e54bb665bb8505a28305bfb4e815c7588b3a7dbea41105c76eb944b3bc546a1247d1b6a406fde689fbc465f480eeeb7fe34c42180ce765d37835e3e42f9f03551e9c265fadf3c3275c8fd954b53cd792322972d2d994abdc8736c497511fd1714da45d681e4aede2e3da24ddaef4e04d9bff3c076244ff4db6d0be687798eb38b6edf8d223eb5681b43b238afd18aeb7e362b2daeb3b84c7f9c40f61fc7e948f6d6ff79b6d2d70d991a8adcbd87380490bbffda5bae56ab45835edda8445d383c356891a26186a82c35ccf108775fc1842473ca30a7a31003123060b9f2421417acb4c04215225054545862ce0a2ac471f718a6387122a5c69ca4302d0a78da28787e43c1f3ed133cdf9e80e75b27b715a3a6a5e51abbc8beeb039b1e893630493664c4f7b9d223224a3e256b54f0fcf2c321395f9e4f5de4247c814d8f604c3c4ef2c493a90cc90bd6f66790ec8f416b029e60d32317b9df45a19ea02878be6de2239b89c90a004019cbe407b44f40a02d2108b424cc5a804d8f7cc81c83d202b423b800ed121a6895088136c90bd022813114e270e5b1c810688f3c688d8823d8f4c80563ca18a325cb09515206133188c02693494a8a511081b6880cd0129980022b2486888ac60b39145c47c257aed7666418325c12b44eb50aa8182220132a9801363d9a3630499613124344831c4fc0f3678076080db0e9d10c1a332aa8cd20299840c60ca21833c61933c49f3104e385d00c9a8ba016b319403366ccf891f9cce88961d88c5708cef85cde9a7167789dad7452dcabbbc8fe8cb0738fed4fd8aa7a59ff521253d2bf7680050bb9add4ca3085c452b0ebbe297f16b42289e991f5b7ef210623c836d7b7a18e9a3be8fef3402b8e2025afe00ad2236fbe176630b3f21cc1b05ec1344f1b6ddb82fb34d451f3fd5aa0fdc074daf5e5811775dfbdcfec5155eafb94925cf6b75fb5981eb9fd4ac91083aac3be7d1aeaa0df811df1ad6d41570ae52bdd854f80950a9504454483540e5a6a00d2725d5b57cda7dc1585a29a9d7bb7e5b5aee7148a76eeddee56cda7dc95bb67bdaaf994abb5b475d57cb2ddbb2d775567bf224182e9d34b8fecdf6ca928399f524a2b755c17cd597fd62498beb5df75e37811e27891bdfbceb59c9956bf29d7b1142d580117e00acff7b14a75d17cd71ca7eeeed589d4e94fd467ed6e8b9b977ade556b6b77e7dd5ea557b4a0bb3b2840cc23938e950b3fec30459612663c284fc8a0f0830d4ec0981026a10390ba43022c39986087cd12515646e0ac1015e6e67953489cb2e721a92c18c9d9b16344ca46f53321222733a127a2edb8df9907c5ddbec78ed47a574b3c726ff75da25391a4dbfd23f7f67da3ebafd87a2577892db10303c81d62d06e728f57681bf4adf53f3a770bc1fd10b42a0ec763d27adcd11a6d1db555a68a90c9e59d3ab2e6dea7bc81cf06a5731ef9d70f68f641f395fb5346a6e4f24e197192296d82cf4c11a9aa210f8abbb5be1da9c36e2ce7917b6b795f7fade295d678cb10721dbbebba0e7cd05cc70f78eef7c91d624041eef14a08ee2bd13b7e47eb109dcf84be3ec137f7149123350af6dc53448854afcb3de59465029b14bcd613b02cf79453114a4e248052c5a90528b527f7941393fc937b6a08969af9d342654a5b98239d0925c1d6ce39d2e6cf6cc10ab88e235367fa72aee4d8b9928385a74baecb975c173262b84c4add6bb55eabb55de7dd7aafd3792b68bbcef3ee6d75a0776fabe5727d600541a7136cb95cdf0782a1d5abbe5e4ee7eb8c0bfc40300c5f2f580ef0d5e5f525d387e5605d327d8cc964fa31313db5a7c7e9ece14249faf4892ea14ee8135d42a7d02368aad0aca94223c7eacc949a59e6962935b374c9f42d973cb1604d1cd6749a38acb9641e09810c2d43a6d1f4372975afd576b5eb9cce6e52f75aadedbcea794ea7576dd779debd2d5775b99c4e97775b2d97ebfbc030743a43d7078261f87ac170c5d8e9c4e10b06c33816ebf1a93e3e4ea74f8f8f4cf6f303041434abb399d3398b7d3da08b3e423ea08bb297812e7e507fbe1fd045a0906966b2836a5090d31974ebf8735f341032b5a2247da617b98ae9a229b89c55316dc14fa66fa3b4050d15803b5feb56265eb777d5dada79b747bbaf23d52ffd7ab9037777f7cc2c6955ea4f4ff4c9da576b5eea7957adadd9337da2b9be806b2e632db0be80672e41b02de84cf1adb5bbd65afdc55a6badb5da5a6badb3d65a6bed64329f24afb556af4cbc9d26d57abbbbdddd7d09936b5adbaad5e5f2008d55f9aaedbcdbba2da82b9af3a7aa2a653bef7a17ea8ae6fcc9abaaedbcaea926d415cdf953671bea8ae6aaad16eaaa7aa56239a168d95455497790ab94c5dd79bd7c4d944245e1e2ea757be9eefed4b573af26d8fba5bbbbd72eaadd47ddddee2ecbee933bf0ea4caa143cbf96dddd2d96b319beff43b98396826bbd607deaeef6d68ba6a395fd7fe45b67ea489929235515cad4903b756a9579e46a6a089c4a84686a486e4a0819aba9216d84d422afdc5343ce4c0da1c26fadbd9d6d75df7ab3ceb4b2aab0b5d65a6badbdc22a5b9b35275b6bbfaa509fb2ae6cd69d22726c1622852405892b5430792187874beeba29213ce4ae6301082b4fa0aa48299946f2cc2257d83c93c815b90b82987e150183b9735837e4d2568560c980b5c2082e42ce6d8e742f5691285779f090e079328e8bd786e4b1ca53e5e571210f542e3f27c537ff9b6288e3957dac5d94a9d8392cb6e46f8258d9c58fce7ed174d85c73fd20fbd839ac2fb9ce10645185859cced95a71d873e7f248c9c234772e0f0a958828d322b94cca14872b686083e526874310b71a56704a204788196060e156925d9ae49ea8b02297e5875b69cb4324d3ff280008c2ca095094206705a71bed5c1e26b9b40d61059115495758d1449e1284105591a748152e72e7ae9073c51a21a8f0dad5a805dc8d0095bfd9814dc199905f232a240d2316704966276978192256e070d78892ee3468cd494afa1b59c1ed33b7a0510b787e4fd22d150e8713e16fe4e04195dd7146d9c32a3c57f98cf7193c59dcd639eb788da8e02bcf8a4a243beafb15ac141b51c1017992a23879ea11fb656485cbf9f414658a13da93361a0db269182d994e3d3637b89cb8899b4e343c7b1a24259de62e1ce3d9ec1f8f0d2b048fc61a5cf6550742f8e163367bb2ebf842331978897239a95ef489869dab1efd44c9ea8492f5bfc9d4bd8f2599fdab184aa5057ff25afdbed7777fa1eb63ff8a7d8719b83e0ca64d4ce8236f124a23795d0ba9d4b4014253c6b81b09d6b59e077b7ac29e3a4326cfcaca78549a35ea0efcde482becf158e30d2ebb2ad7af40067a5c801eb5bebe928b6ff1e59d11cd1afe2ef129e92ec6a635ffdab416e42db19c571f542ab97e4c7c89259d92eb7f624965c8f56fd983b45a5381eb6118866118866118866118866118866118866118866118866118866118e6300b9a85e2cf1afe9f0bcddc95dc7e499f7a10a139c3837e55555555559590115cd2aaab923e59c959d3e283bebc42334a862d8228161f968a4c0e1fb15b4828063ceb3a865f625096cb49d542376462f713cd5ca00376cc60c0b2d9e748ef0249d2057ab1d68e279f886cc544109a726cc710e88120181b61cc1af5df9176f4db946af5a79c3fd1b0da9f2655d0d797cd1ae17f22a664183476f87752359a599291ed476c990c06140c1878d608df916663a5b5f06b796b0f190d92e8476c3cc305cb3bd1f8a82f34039a21d054a264adf4ebc01932f97cf8b3d98c18d34cd7ea975ef6a7c1daa79166eeee5e33fe1ef6f89b1ef57c874bb0ef30832f470eb00c6a794f9fbc5663b3f7ef696352cd1af57d2c7b8cd95fc9c51c3160af638ed8cfea4faa690374ffd8b7c692e6725281d0f4b1110c71785656768d3f6b54aa9ef135cebe67e30efffa938a92b5cc0e47a25595560945c1148a1e95b628f4a8fc29f4a83e7542abde468f2a25c3afffb978678dd03e28d6bff561625312ec7cc4b207e840a24dc263a6b9fb1f71669938b38f38735f71e69638b337f36be66fe60fe971dc07c7d98c92b59c9143fc658c1c36e9a2fae52b874f6b245ae5b5fae1c3fae8f5e1fb3452d0870f4e1bfe346bd40f3f0cc3d006030ec371466995234d2aafd5c7e3f7305a95eb7b93d8d7f7a76963c7ffb4e15959d9cb21a4d9c31aa9c5fb7b1ff5bcbfd7482ec2f777217a5d0bbf47f426c36f21c2ba16fe4c0c1f870f0b614fc325d8d894843d0d33081f368294f431ef9836605ff1c7c6927eae8f0d657f4cb3ff4c8475cd1f2676d7f00f12bdaef9bf446fd2fb50ccc041d1fe2796d82596b77e4b2ced52a524ced5a17ce844e28546b6fd143d08423f537a01253ba4ee59d3adc4ef483d2399bbd9f3dd235e406bdd7f0edaba5cbfc564dfd2ac94ed05d94ed18320d975955bdf1ecc2517f8250e5f5f92f84b5beebe9f1228d2e6831ffb50a4f94ba4f948d3e0f53dcfe3f53defdf33fe88f29147f83ee38f9e0fff47ec5fdf74fb449a06e0c79e36471ee0c7683cbeeff9ef7b1e26d2e6fb7cd30d8bb439d234c00f7b1ef8613f1f36fe889a230fd8fb8c3f68f3b1d7ba6fbac1fe076d8e1ff0f079d96fd037a7ebb5ee632f1b7ffc90bdcca7e986bfe9f67debe919fb161bed773798d8b797d8b750ec1b2836dd3eb1e966c5f27d74d9f5345c728d3928d97d4b949105b67fc70b28093403f6a76f73a40b28a844c9ee75c0ae264bef16afb47e49df3bcf9fd51cf0fc9b7fbad075df445ffba4be740305fc4fa27f061c2977cd7fcc5511ad8498adb2ff0c95ba28b68190ff289a30b681902c94eca77f2fc61497ed988392ae245e4049ffb14a3f00dadc80eb2b5d906396dd77aed687c0f5b1fa9d5bdfd1eeb8c3d5b95b6b9c91750bae6369cb2dd592a1022533cb478a3542575090588c09ca22660c224c0d1e3098ee9a0d78be23e01e2097dddd43656ef45157bbd6afb6001f287b92544150a6e428e8880104a54056185803060a300880246404808aa8071c7798e0e78ab1a8098c580a2f5e79847c9470f1f3a6854cc80c8696a0f1c84f6d04990c373e49493904f840d1151c0265a4f9443aadd711de2b0afb624e9da088f6ea2e03c44950a027ae3a3ec1f39d046349ba678d1c452132df9129d907ad60498b8af567b97d72c772cff097bf3a9b0a49416605cd80cb3babe04cea88bcce56ef1200f760042bfba0b95232df1e5373bde077bdeeea68e5f93748cbc9fdf37bc8b20eef61cbf47dfca0e61e3da89decd6da310809cf95923564c0e505c0194cb3f9839a7d7499b6c3fb00e459523a2b404e3a2240feda2b9d4de3616fddd35cce7ca51b7f04b979a3511ebbfce4c1e52d3221260597f585e5c3042eef0f1c5a77511980dc5fcb3d2697b5d9e42ec76419998683e67e9a67ee27f267eb160c8e4949e012d3fa2a9bf2880497b556029661d545e429fb21f7d8d44ec9f925771e0a97eacc6570795f747079bf69e94f16ed4ccc5f753a6bdb57763a6953fb2a9b7277efca316c8e11f298a2e718dd78bd86cfe0f2d270cc9c4b9bc728b8ac65597594b5c7a6fc51b00738c50f6aee31934dd9944d59df57d994f3d7dfa46002194431c851acfd108c17dd4234172d6641403f329f9e1886bd42f073b566bc82d0264b7dc2047533578b0c42530ebf7aef41cd1f7091abb7ee675f301cebf191fd0005cd5ab8a009bd8031f4e277b834be1205bb7c0902ec40286046b6f4972e792a65574e08b11b4535af89a593bae0466ee8c60fad096d9872c34a8ea42f2f9260bc7002bcf29434a328c0080ccd488896e693329d8ce6921d361f5ad85cb460e32a21045bf6461e34c204d198053dd132a1070d3b0f207bf821817ed05c2a1520ad244024c68748e6f3c62b8107119a0afc98d8bb441fb627e6a67bd7bb40b00b97c00ef461a92e2004044c28899230d1d606bb1e7c30e9821c36a370a9f3946457e77d0fa1ec656046e635235fe2d3f2e0b2c72cc946c91eb2ec3d3985e9bbc41eb2ec799ed009b8ec21cbde7b6307f010dfbb441f3587e105c12ffc1a2e7d3e6a0e67e128d6ec03fca1f52eb10798ef75fd9d36eeace175df0a3db19c654f262bc1ec2a6f768163e9fdf72d7bc3fb1e2eb5400c42c0e17043b2174276bd27922abc4bf4e1d927a0c2470fbef7d503bbb73477dff26e06b3eb4b3083ff892ef07bdac8ae2f6b06c7722cbdb79e67f76066f7461f9ebdebbc35895374fafae7b501f71fc015f3cb5995e74faa2bafcd9f3fb1484d2e197024e792e7977d75638427626ef31f5001cac591fae64f7dbbcd4f72a4796b2e74e472a7185b55d550d13cfaf339a8ef23901148140ffffa405e4fc75a7f83bed507d24e6d38dabc762b67afb1c71f3fa2683bfc37e89bc7c2e7a0c3f3248e0a2a88c1e16e4062a392d7bad7d881fe1b54e6886f48a1631d1fd78f7df923ce757bbd8dca8edc5801afd51148140ffbfe403e3602b1e3c479d9f4e748c7f9e4b5aebe77ff1961c1f4e7849a50330735a5625fce1c7dfb11a06f47da2d02f36323cd1b691ad4b7cf417d3b0289e231df1f08fdfa1c38909b12a5ea7e5651bdbe6f55341e218d2d323cb14392a65be8c3330748e138af1c8b23e1e6d524a2c2102b5a5618d201f7192b333d50e10487bb856fbfa438970a979c4beebedb1dca6bdd1b61893d7e3bfe88a269603ff63cecc7c61f515ef7d61b79d8c7e30ffae4b5eeed48a5bcd63d6cecbe74a827fa25859a5f52299a06f5e973e03b9c421108cd79ad7bd71616a0e2c8c982c3dd68963354391a8f1bb7f06fdcc2eebf9748abbcd6fd0d29b86f7872f7f4ca6bdd97b4aaa4571cf49d30718ae06ef695e84b0cafa29220c10e4f38dc2d14a35cf57389e02d318011e18197959585955df75dde57ceec8d9e373a9696e85628d9dd3abca34351b2fb27fc8e732487ea5af7f77a5f629c2bb710608e646f2cb1cd3d75472a970ee5b6c9a330aa8fb6a33ecdb4db45fdcdb0976a1078fe91dc4fdffe15fa1fbd5dd41574ef3b266fbcdd5fe9c62b75a4f1f09bbfdf7cfc11e446c72095522a05c0d55297e7f25caeb1a44fbffb699f7a74f461f350565656b69d1d49224acef9949c2f32c1dfb5f9ddfd2dc4172f998e138b929d7b724f556195cb774d27c174ea94c9abd790a9da5a6d67aded42a6aeebbaceab40e0b24ae5f96595cafdb72acff6277fa2b9abab0935a180c061065e6ef57cd5b1ec20fbd811f9e87fd51632b932657265ef0dbc9bd3dd5f83a4a4eab6b35e95e55a432657c7e4651ae62edc8086b5d65a67df57c8649fd2f176d1eda2d945f3e70e272244a6d845f3c52eba2d4a521c60d954c77a4326b28cb542a6f91fed495f6553f642268c611a78b9fe06ae90a96ce5f965abfe075210044170f67d55a6db45f3eb785d3d5dd4abedbceb7ad9ef463b36d9d90aa2fb59bfacee5f7d94596fe6796fbdd1d301e6fa5fd97dd6ba7f6f00cc752c7d646fec61cb2e22dbaf20c904464c60c4cc6753a13ad703c92cee0c8a6ad5f0725de1523f95eb886cfffbc04e2cbb4ceb5e8cc3257f110469080e21315f200c949d503108d31254a6072c7dc01a31c8400098c173fe80011002081c497083c01f2bee0c2c62d2028ca1505d80af2b2e0df4594208fcb1ba2f2ac8a508c3cabea17693bb4daf81227f3f412e65e4995d8422bb8501c2a8e10e81a391076b2488a08c36776c23628032d0d0c0e4f9830f0df690ab28037c193101f89a7329005f4441821318416b2036732b00814e98018e502a0d30a604631a68c0f0e4bbf7624c3ff744ea599ba32d064cbf8e7716f9be3e53064deef733b4cc1a5af5d42994bbbbbbbbdbaaedbccebbaddb727dedfac0b0c1b06160f7bfacbcb2e47e18166a25f763ba25b7546e0a45c97e3b78ec60e1b1439d705762be9011f3a50c556e467132a744994ea615a8f944d7b8d51a3b571530ba91dbc8f64d4add6bb593bad76a6d576dd779debd2defb65a2ed7f78114a4217dc1422a9697698214d3580ca43db77f808226157d2849451915cbcaf403524cc99e998ee58fec2508798e948a922dd545fd00b0f37ddd1d02568feeced1362322722604b6abf97cf860b229a35e6de7c16ec8d4e59a296d81d8152e4d593b0c0683c1e8173279f97611a51804837b34c24511b8e704bfba440302d39e4d57ce09da49e57e1755b84330988e3fd7ebeccf87e5a573767dcdafffb6aeb219513b4b4ceb76141d5c7a854c14e4db4530188ef524dd303ab3e4534626fbf901ea8080802c50753a811a7c953f2e16632113edb960a593d24cdf710f9df3026bedacfe807b94d129ebdad3a28f2cfca13f3fb3ad0f7ec95a2c7150900705d1a0290b976e5072565f341d359741327dcf6553fe01a2b114349be1162d5cb8304ab2bd78e174b68080828292966636ea6ed1e2024af6bb70d1399a50184cc712a3a93ac3a5cb968e329faeecf4a0ca418388521c2d084cc77262e51e61844b43d7eb6c1df2a1a1a1213afb05bb75ef0a6a410b975c98c1d4826d678d7e1fb0c599acc58f0b1a9d97923f608b25d8e2479b4d5f25907c5d7451b824639ab41083996b0ba1165fb408030fd1a139645f80b410078ca13934d415068611e2f0a17069285c7a1c430ca6a31311115122a249d4b1572902511c63c42022922163820928a080246bb5bee0186312b5bfca20b97e31c018b2d91c693f603ac6087178be4b4421130dafd1da9c205c825130963dc03cdfc57296299d94fadb4ad2c0603a9660ad8219e1128d7009174d0f8697280899687ef00b2e697830b3b27b394790e748d28448f2050c9224875c90640b926c5dafb364753a2b7819c007da44e97f301cad0f70b4f2157f0e5e371f7f84e076610bf07c29d945546c20b20d17e0e51e938e0cc1e52e5c00cd83993fd0ef48ae70d90b1710947b842d7900825c7220e320ca1edcc8edba1e7d951cc8f6bbf77ed7bb5f77ef772ff9ea2fac0ed2eeec0c5baf20b36952aa837badee62e501cf07a9530a7a584326b1b38738ec8fb38bfa3d5c0a32d270f8e4fece3eb9c5ce176c0bea58bb68c8074c9eefac319f29969b92583efa1d1bbf0478be8c92734ef966eefad59f3506da42c9c7920536050a3f5152893abd42c0eae971e555604d8bc7999ba36d463e44a46cf643c90e3f99edc207dfdd43fb60e8c1c42eefe74b47bf7b51592c168bbde2e09252512a7a064d197ae4f3f5956eec4b5cce7a9294daff8e65526b2c6dde58923de36b8c8d78f411cb1bb493592e5bb0d8b0ceb1c1e5cce5c490f9f242887623e985d0c57836fb27499b2d2997f4c9472795054be31b6d7039a5a4b874d9429f485b92918d469faae854ddb00235a563495574a6a8aaaa5203859b2ac755c1a93fa1b064b1224473f1a4914d88e6a2c5a4222715cd55d191139c0aa8642b594b8a9a444aa21100000000c316003028180e8ac4a22489e24cf50314000d7090425e5030164963811c48311407310cc43080106008300818659ca22439f006d235f4e42018eb63110d50aee9340d7f8161cfa29a8831cf1f0fd1bcaba05e1849d4a0a3861c6cdfcb708a891e6d65a05aec2e84ca34c93d9dde9c42ea39d237cb018b75a14debed289c44b19780e090b50e7ca46164d5fe29642fc302c8d86498673fa13c08761fc57d40548f93de19828a3617b2477a7349a10242798c5e20a795394aeb85eea2eb1e074e0b012b8eeb7387bee2dd8eca378670ff03b3817c7008854871f932ec3f11492d0dbe12988f5d782fbb644239cfebeb9bf9d2fc85f3a83ab306f5d31e2f7c9d8818ee152dadbd87e476600397cf40aa5a6be7903c946cceb5a71e3a457833d06909fd0025cab195e8e48f7c1376d82a8f54f010787c73c53abb434984780d3c901b819a9db633229bb178e52b05dafbe815c4ee8a350d6517e9189a6de57768b396f5ffcf09b07d667005a213b986cae91341f3342748272f90237fcf9950cbafd67bc0f3e63224bea686a78051b28f0316675bc16c4c66d864314a809d9f53604fa81befa79a189c6c4be07e78b8cf5969fcfc0ca37550743d5a1bdd4494da23214f9f82d0aba024bce2afa37223fbf16cb6e90c6607e78f4d604eb6f6f55cd7f06e9a615420dd9cf3517afd7a9b90e564427174e4b84b122d140bb1f8628d2a9ba0a6d354ca2e7ef3cd95894938623cb081255be68b4b93dc9511a940e4eac17dc92087d8fc9b75f31dc05bb87b7702f6e74c505dd8d2b58a186f662a90f34f54081cc82a643425059d567ee09c35dc3cc8d712c2cb0bcd12323cdeb48f68e3c576242a0df9bf1721fc29da2ff46c1f362af06a4371e7bc116606fb72e640f63d4d5038bd722e58faa11d95e4607e614c26ab90e0f0a90bf362d6100f1258bcfb041f45653a28f6b8e7cb5ff71c211f90208b22ffcf5853e7ea945ecfca1778c29f0e702d58f0735a1f885d21097d0327da6ccde95548d51a557b8a1cbfba81f6397b4a34b4ae8b71a01c0cfec48f8c10116b24eea14751334fc3e26761e0d900cc817888205a689b65be607a5cbed142dddfae21a39aee34288f82f534887b8a046d55f8bd44dac5620d72ffe76719f468385d8bc69e51077f1e1a6db09036fe1883a483c6f1413db043a9907e1f76bc8f45d171a28dc8d8a5a7261c3cecb707f753495719ed5dd5a714847f71e5deef91012b12adf214fdeba8cbf09a4cccbaf47a918247cb47b3aee35ad5ede689294c582b8e7c9f57bc496fc8d0c277e87bb512c1727771785f73d5e7e25419656641ea970500c7e3e1566485892f86f3ba7b039231c98324676891eec97b4d6f45b416ef8fdf3581b5a47d91951a027e8ea0db6e8df091c242d1eacb0c49e9e4865c9bcc10b3a44196f0bee22f7b9df62245190af2d1c6bdb02690f849622d69407bbf51ca95160d03d6e91660bcc2a9a95693decf7de15d4c3e70d9b8facd39f49a5636f9f5d3e6a2a5383c403412b1548c5b476151bd2221a77670d48aa1c52b42ce2bf0f744b0df0bfafbc24a46d4ac6bc48583d46f3715facb207a1e41c829e9b7a29bffcd1f6eb32b8a4a594fe08dde2779282662df42e8e42424d1dad670803b9f73286b8a2b7edfe20188763f8f0e63d74ee8e8e3d585d5201c4d1abe6cca52de773fcba76413f8b6f07af4aa42f42fb450ea6b3105988b1ec23376b2f52b8780ffb74384b20a0493bfb81edde2040f35e5feab3c648f30a1f3122d62dfd7a425a5924c83f89c40be1c4c8166ba486979809153f11a662d4498821f82b9682fa9d5c285ba4f1013bf81a4d7d0e00f9a60e457af2ca44f9909cd28e7eb8900d84c10777ba55702605bff7cd60234675ff846fdcfabeebf6370788209cc7a581a1b17659857f482cf2665645f4273244ebe81be38209e86fc05e3ff9d831235e0810e7a0319acef41f71f12a0432147e00eaf04ef3799aef4d6ee3387a2b6713067b15a914070f425b3df5c54b0b7c2c4a8e47d84adfaca66f60c89def8c0df2b87d7337ccf5648e87084cdd955edb1b4a5b8e2a302c6ccbd5206872af1affc491aae85f5906ff6f0a5845cb1998f4a9a2283b05dfa7ce2ec5dc6a29f672a58e4e6c2ae4aa2c0d41fc6d1c9f3a5ec5c3a0ec991d82e37ba3dfd12f312534e2039c527f5b082ab52c3f7f8ca8c9fdef8080bbfcdcd1cdf9bd377c8b91284ee3364142bed14a0b4e0cc23d5b75dd268665d74b51f8a74e034bce827f3794342b89370e56ce1127bf3b99822d76e31904f764bdc4dbf0c3bc81be669f6115a6406b74ca88f8ad4d748bc777de62f9fa5fa82cc309914da11537e374087be55cc35ea3ac7148ffda82de4b2e6bc200a322d0d6be9315b424e52126737f22c58a6df52efdb25a4933e9fbf46a57b718e3a97cc2b2a211b41aa20601eaa47eb943e77bb9c0d89db8ee47cd2027e8304454a2d7fd90670cf338dd93836d2d035099956e07a5bd985e3f1ff08b6b0d6026cc5901977c5348e06d9310ebc47f6018e4be32e4c425a1b545b657dd6827353fa39db29c1aa7eeda3ab2d789a5d5aa17be8082990b32435185ca3e0fc9a7aaaa112833ef9607c97e7326ec83c42b3efafbc58e25d56fee2dd98cf884364b473bd956baae15eaf55a4f7e3dbae18ba0719a3c1245eae0943f1351d604b63b612dc36ec436671eba8782af3868e71debb98f6a7fd3d3b51a130a0b0208c643fde81a54f7ebfe9a4505ec4a2a8a68b59558127bc550668ef30ef02041be9b5b6ecf665226e460b48a8df7e135232e237b91243f4f3eeaf8ab6c3468646d54c28f13fc769bf9da78d32e7465b88b4fa8f3f700fbf8003274674cbde63d5ff3fcfc069365adeda0a208a69a4e6c1adbd801163d46b067f41d897d5978ab7107b16a9ae9a049a20ddbf2cf829f211bdd876a07ea2893b6450aa18b75d801d4e6a2100a171706ca6e660c51ccad8a438e366148cedb06f8fb89cd66940153d0e6df161605c280d5ba55aae1e567498b0775a8b5185d1a9474b4cd0feefda6bcfc3a076098a31d2f825a16b635663795a01a6498bcd1d752026fb38fa8b454ba57995cd8f30f736ba1495030c56fc129863727d0c3713521c1501222687c47e6342cee7e8c26b227e7593e6130ef39eeaf5b5743563e7c19d959daab8c28c76365f10015f547974012de4de32909b4777c39353a0d6ce3b7aa41571b2616009090ccfa9588a0ecc4c6330259fc05c33c8cb230cfa1e729447a79c2c8ca5e528cc76aee11c29a74a8c4a96a898488fb3b0ed36b37ea431b04a057e82361e5b0558768d716c8da76cc580c1f5d4e01c4f0f21a78895182d58ad270144d1c824335993fcaae33bbda38e07d1da15484a8cafaa779abd94bde040824afb141338882a28e51c190eabd36c7988d9f72efcaa77b82ed368bc499dedbac06902d3af1d365859724bd9ff6660e54adcbfa8db7148c498697e6c62581cf830cf1a6326c5bd3ce32b73759321f3113b3933ae796cfb3b3da644bbe64871f16e68438ba7e635ce8c65c381705be7760a16da6ddb85d34d6e529632bc6a0aed9cfce162fb77afb18fd5271f061199858ca10336eea4ef52a108ac84863b497564040be246b304958a4cb5e68a54cf3a7cb7942a824d0d571e610d7b8562774c1bb90f0ac5cff493077a6242a498ccdf2182ae9dd64746076a07364806b4c3c6650b6294e4563e0d7541f5708d6416af21319d920aa8906a96ea895a8f4e1368123331037e71eca2e94ba8158d32de5c6d3fa3f6b52f390e04429094182047986c1977fb55b45435894c0e6156c13d94ce3cee803ca838b71fcd71a83e93093c3ac0f207440977b62ab62179041b470f91b4108431f1116bd403f8d967e363874438d9a219e96d84a139d146344855cbf1032153c29caf8ecb994ff4e53a347d16dba473e88d59936a69d69dd13eaf3067c4ec0c0eaceb3ff9908e7baa2794522921ee06280034cb5ccbe34d249c7c3612a5beb1df8a8624b89dcc6b07f394cf9097fe32bc7df3607abdd8c9c3c4bf80b7881bf430bc3b561cf07fe26014ee96d98053bcddb1df79c4d75c7a353f1c94c5c5537906cfaec1bfc2efb147ac407747813873f8e1382e9acf3587f1411a4ba00f02f466cbdf9d6e4d53c2cadabadfc5cd19e7f7540ebf4b3c36488b4ba07624ca774ed7edc3b7d186efc7063a44dcaf5ef846c30c87e9cfd49be0a38f10c6e9cb59f8401b5d132bad5f61978e65a55fece5c8346318c67dd364132e4966fccc9bdf5456ccf5b4f5e3b91e0161e0f282634660ee293c76e8c1a561cb4905a52c4e314531fc772eb056eacf3fd064315ef4d73e1581e0b78b7c2e518003b05de86af9587b746c614e2b836acbd4c17b52f00d7faf55a428a299f937007e4f50dd15de571cc601f842eb9e5b0a9908111314183d8b5ad069ac2f9d28465620d1e098361360f0ff282adb886c4a003fb110edbab70ae0c517687381aa1606d5acbfc88b1fa6c709ae7b740f33c0873bc7b7f962cd6979075286f2e4dd023c92886b4a0456c461ddaadbe545dc2707dfec37f965ae8c396ade30ebbf227e6f87b58bbf5c59ba9e2375552a5a58fbb480a927cf532f04d44e63d273afcc1b3f5adc65d5316bb3dfbeaaa57b8e60dadc23239549c8f25b0fc191cdad6141e72cbb9eada00a91349d7f9932b78e34db3da00f8593fb2e0c7626ba71a80b2497ae139028ab0e2fb97c0a0216e5f6c6c9a2d4bc36392cbb5389d7c6fa37cf66710524f0946d71cfe03ca328632ea35f47a6ff9914959d1b2d0d99d2f0b55cd7e6f4c82ee7b87f14c0bea9388726af93ad52bfabcd13a5b117dfa8011c5062f41ddb3b28c57263b4588b8d1e10ad7ecc98ea25e62aecbd4732952f8e7cb668fdea9fc50251fa5b6793e8cde9d9b84ecf523944493e068b09498e2cc86ff73307df9d5a16dd88db88ffed21d071d9cd7af0d6198ed4ce320bc0582d1e452682405e6368a6429af5064827dac63f649d221b88e2d3e8aba867cd5c4dc6cc1a221251cea2ff846f3601538bd4bd24dff3f3e9b6434e93459bdf4e2e3a516066f221cb6c12998f911c7cb79b4fbfcb45f04990aa545b22a1b40517735d023c20bb0f3a745dbfb2905332ed12e38fe10fed68aa83beffa98343378028c9324c90f4977c10342c23f46759b8996cfe9441aa7741236972951c1a90cf7cbab1fcbf56f02195d0de4f1b451e36de5031f1dc665db007bed532fff4bca1ed199a56d174d67e07824200f42f1c9a96225cee0fe4dd2786d64fb70407ca82bc49fa0c5cd3530ab0705f0ea18972681ebc8998984b900c272647fce1ab2f043e159aaf47b0e9bdbe0d0f246f5ee0e104032af451faae3879dc572346d54ea053a808a919518279aae0f873ccd4231128cba21be6449165bc6e355d310944b3e763a3e2740e7c467d10a60c4a5f86351274171aaee934efec61b6d1f4d39bc97a363b230df64c031fe357eb7e7aa1d4455912945fca038de943f8ce29775b8b48adb30bb60ab5830d770d08d9e375260513f63fb5b7a7626d87afe9be2496e939954e32ecb098d10c926bb02fdb3c8098af60bc883b8ffcb751783a557b7763b4b4b2694e5dd67072fef52102c50724de77991f6c92c87e90ceba5c30bb38ba652c24f3eb7a8debd193b10f4960bc0c3503d8414ff77bc2b518c3224a55b03698da260710e8f9a84fcadfd681bb6019d7ff02097fd23e3b7842ba0334f0e045c8b62d6900088392632267336bd203a2253f4e16b8b1e7ff79f775982c910da9eb0a272eb34149e8a89ba9177328ec6a3656834746222e4b2e668348a8dea5c0daf96e9499217a469a422e90ab1d37caa2975a1b04a11df5c8fb801368fada3b70d2a768d31914a1489be799ba3b11243d06eea310fc43354fb37540f9dbbabacdf2fbe78fdcba568486f9130b3cd8fd5eb6eb59ddca3d49cfce3ed38c13e2f5eb1a91812d40015967c2d7ade9edde1a00f1f40e7e07000a827d860b38e211fe735be6bf018c37c027c00702ea0217e8f7eba78f87222640d0f90a30a14fd7d546b0e6c6c781f08cafb6b85defb75fac0f77cadd5c6e6e008820e1f7c2d6f9e86f1d0b5408cd31d477f77ec936a1fd809950d9eff28361531d6756f2a7844e4c208078fe90204037c1b747182d7699a5afe879e0aea255255d76519d0ad0a70782c802614cbe66e978696bb7bbf7eeefc379a8ba51eef7a1b2f4aedbf074956eef11cab7fc610c11a1eeeb4edff13b443d988e64a041e8a14bc3d9ecad9ec6205074520678417e8581501efb0cb73a8a2ceb1c33e137c4b1027caae9d8ca1f93a381a0e3fefee9b25b51150446dda7db771cbeb514efb8c516583f231cd75b0ff3a6a7e51c2fa53125b0b15a3bc268de007c761855cfb70a92c084557d3fed60c3b43bdf861998bf6d56012b46b7d69e7da8e083e0995ae99f5efc49a08628cceece5bd0be064ca667ef9fbc910993fc76b68335a7695881b1db41b65e765914144869aed2870a874591745cd8497248abfe4c575f18e5a3d0a3a67bc105d316e3b65a06f6bb311544803e5d3e98093e022dc30206364af4cd16b005b99fc89679dcac5bcc8b9bb0b900118b87ffc7620319653b8658960ef38c64bcc5b6d20cbe27a138349435cb2cc5eb40dfb53ad1d0dbe56ac0d0b81f1f6b542a784305731760864ddca1afaad34344d2c4286ad5c4365f869a72ba0351b81035d4bb17738654241a9f6d664d08f2db7d33da1ba2ac9b1a2eb6474bddf62755bbc8b3bd76e28120512ec1c67c26d6b057591382ceace1eaac1393e07c0f9235940935c953110ba1829a88831bbf573e427eedc209d1517a36000004003b87914a12954c47e93cf415ea8ad135eb738ae8069565832e3a7332eec5c41989e26c56e6fc999338c23cd49266a4496cb2721d470232610571806253d8e89c5123014932e3d8c40d49b9f48523834493506634f3c80d5f660ac60fb938c702c8d9ec39b133928a3fb65abdb4595d948e8efed35c4524e3e10a72455e4481704854d1e071c648551392525620c67ddb0bf587fc7d4195021aee2196dc77f4618b96368814653e0e9aeb9c5633ea0722c9814a36dacb854b38c1b871b17ea6b9f780b4e172afd257a4f85e534656a6b64d5a0770d25aa0f4fd180163bb34f0c63528651b0b62e4e603b5c45b4a3f4e8b552a6ceb1b6ba58f24e9634afa2687ef64fa48ad47f0678e1acfd33c1d61de8a89ee3ad2981826a9395149f56f67d20a465a70d5994aa5ae7f4f8a27a5a2bd7f6b0f23a714aff649fe993710a0fb999bd10fb75b3caf368ad6dc7dc186be5c148aeb2248d9b1a7b8f23928f0a2e763e456b3f80936eca387fb646fe0729ceab8901b00628d8569b05339484dd2ab287959a3c95b59448f57341292fac3342e02bca444f72b99d5a6a03fd58958d647d4ee9f2c77a8e70b85fc5182b4d6fcf1d037b1da81e2326315ea3a25c0872e5b490d81422d03f849aa29686f4218afcd1f5cbb5920bb645f60d34e9df122708602e530a8da428ca00f9b535d8a89026359c7a38304fc2570c0e7b121423974553e02391c8b54241505155802bd326f939acf821faa1ca8e98929909c704d715aad6d97f0f1800b9936a51413ff1fecc50864a58f5ecc0c2c22f8c372f42707c3bd3c22e476f7affac852b8398cdb38104da26caa18137ab47389925931a04b353822862f595172ad2d6e3dc3a3f03364140a506d9bb4ab9aeb21f734e1e6cf87442b770ec1d6613894892fc07421409e8e012e3ee23bccfc83d94c5fc0bb5f4ca12af5bf5a7518a23a2ede4041abaf1cc0da1c5a98b3db68ee368a86a96cd45d1181c3fb0dc833f127cc91fe3402f60ac02a16828d0faa937cc9ef1d758088cb16e99eb3932346d53d230c92889fb4b8810862717ff7169ebaf08d46c4dd6943ce5571a866f1f3e61c6e7f21a61a3e170acf439c992ade2db92ed7e6620c5fbd11064551e13a855771f4f98494d8f9e880a02fbdc0a8ff51447b32d454c42ccb26ca90ba7f557a02b8609cf00f673572bde1e7912333835f33544597e89b159c9cab85f0bc022a10c97d30edfae61bcdbb3855e374f786532e4803d5b2e64c2b521f3240cf9a20778d3265efd7f9ec6726cea3170b78c53602ccad0c08a55f77f15111bc625ea2c221f447c7bdbfd303721fc5865d5958026b20cba392d3aebfbb3a0ab416bb579c85c064b624a049a889842f8081b9ebef572751d0a9b2286bdc84c42dc3a48d2d1a32de7d7007f8e953ab534d97028c0aa5780d98449109209409520d0f1bddf860727532dc22d1d5193cb5cc4b28b84804c62588350a9315737adb855c09e7b8938f962cf6764be0ca36a64e8a2a03a0522003d550a8c7d6579fbdce58d90e2a702f47eed847a4e051a9ce5f152536906006a13ac5b692a7b0ee260456a79446f80748874feba1900fed3f4ea2d1cf1a1ea074466a0dc8533c90bdbf2af482b73a840a726cca7437f10a10fcc1bb29f2f7b88a4fa047f739dce1e1064a8f9a1a14c52c62bf5502897986ccf2b7916519c0b45bc27a315ff9e6ed040d33502109d65104b491ca0e397447ab3091ebf684507000ba2f5a00077d5461c7b00e9a21b6a8420099fda630afb240d34079f2f6ae7d0854c36e2d00b6b6aa84bf381dc31d3ff230a8e6a20061b11cd8e9dd757d21560ba5f4ac56d095b132589b83ba19c200d36f7480dc4ca1f68a4249302c06bda4dc68502552038e9e0461fd86aa8a24de716363e1961e8aeddbd8e62d3ce14df49128485e1d493255821681011837dc762a44d2e47f55ee19f22f569a7525d102f19ec3dee9f15e328e7c2ced0f6c753162227e0034933a7fa5051c8362ca196b1fb9c0a16ca2f2be5d17114174cfde8d97065c86478883db8c803d44190b8a11b505f432071a60b4d35403ec245f255a0201c74165fa077bcd535b14a45a9cddd4b610e12801698a611e29d92c921c979520d9fa26d352a24a0d4c2f319f390b5336a2f234cc570e2475c4fdc570566613ab9297c848573fbaa9012148c2c5583aeab27204de3967365a103580b546d8d4c86a5421cfb180bed898da6321741712b0e5ff4c4d82bb68bf95339ab6230a78780f6b50c8508be9a4b69fd09d1c8469bb569d1c71f19a5d54fe9649f585e3b4d492ec3533a58ac7e2ff46155aedfcebb002a310775322ffd5a2a0202a9300f55c243f17ac25d814ff251d6359c5de31d82a0ddfdf0ae6f0a3d3154bc11d7f1351470a81905ff477a084f9780e6d8e9360bbbd89c26182c0ed0973d14698d4b381188312fa005327b1933fbfc2b943af0a058bda70065452b67ed56cb819046114988758dbc437a6c77c4386fef6e5f016760ce1bf7cf97f066edf444d8620e0feb056222130eedc381d0543639cb01054da438790f41684aa14eff21816ded6be5edc6f3b8e3b162fd1949f90d3edc357333f48baf7923418df83f78b0d8398da28f1352ce10f7ef2c1602080c2e7248aa293bcb87d679917e72ee0957e2e09feb786f6aadd6c043451ea5c0d0bce3becbf569c5714e89e8f1e6b841da7454e71af3dbf6088b43cdc765015b6ac5372391b0e0538e4aabcb054cc2510a98eddb9d840f57aca960470198fe31cdcf7d2a39647b58820f3e06ac526a1e2aae91933f79b4f7df9a0731ba71bc9d09aaca51070bc644e77cd97fdc5bad04d4d87a4d482064bde52ca4b3edc60f9dfd53cb6517a975b69da868bac43e46f8c8682da70be1e43bb1d160e52f97c279dc2cbfb430dcc6dd73585b74f692148e3c95da483271db92998bdc01a9cf0cea6531b3de089ff729adcd268030d22bfd9a697cc6338853ad3ae442a2b4ecacc6333f05dcc50ba521962d87069f7628a04fd8d90f3bf618d47d4079d410f60dbbab1f51784c58906d635090805b30ac1b491430ac91c7815c649d51f0bf840d34a4910cef10168732d644f8c8825fc9809cae1cdc4c61ece428424bfbd2ddb36a108ce5bde10cdaea9b495bf3a0f70d54497c96cab80234920287fc822acb426a917237451dd6d74794f00698393b0f82132bd3e7a46d25065c27f56caeef2eed667a51b83c1f1b33f5072067c25bd75abc274eb60e7665f21184d91ee076c6ed067fc020c09e08b79d6f3da97ef13441004508d431a0c246c414419030aa2fc780cacc9f687cc48cca51d86b6eaa02077763ef286c5f9dd036f5096f50c28b5f4b560e5469d9fcb13c20f0e113048dbb727b4968316f62de1159b87eee7fb580e29771891872f7cffc30277ac266463c5b215ace0c5925887782b7b6bbe03c212e10a0cde9ee1d420f1c9559cfda6489cb66d9e9a482dc5b68216a945a145d0566821b515b1b63915e4cd8dd5e8b54d1a732b25137e9d127e50c989d5f9deaa539272608a0359fa5f5afb82a1bdf4de1532c749d23012cc3336df63f63baa579fba82f852a3e5092cae94752a8892620fe8f91a06c394c6fa28f0a6a47622a2d59609c9782e5d216356fc5ec410c041038cc0c2415903b78a99b06c848b4db32ea64318a8501681ab2282a860783b1623d2d65becf7db56f77d3a09a011581020abc05531139d4145cb6f437608801b171ee7b159f338dcda7d796481c505a78a88130768cf76f7f1951d9f8a2a619c9d715d7a953ddad9927c933f0b855a3bbf6096072f24cd643e4d6c9e84ea38880ea513b8705cd0423008e9c831aa4dea9bff9d1b0ce4fba863a147bd32ba48c975916fc31f75219f0a78c9822d8f72c52f44838b10c74cb276ce16ee365bacbfc9e3d84c26d99f312c445ddc2ff6ae51d044e6ddc69580ac247f550bde4172cbc0b0addc2910360c832475b8179b8aafda44e99fef22a47050c36e7566f0fb91c7532e7372a628802eb3b52d3a0f8445dfc48062c2bedee05825fed81e61c9227c648b00461a3705cf833510af2a8be1064465d6c4b91db9d66dde4988acc53cf5144e14afd5193bf1fcba6ce7a298480773967b6fb78157a1c64600fef08524698162e3ee7bd472631c71f08a36ac04ae8a3cc1737443b35637f7850a5a63dc42754834a1612b42a00fa5436b159268452d09e17ecf50364d6c3f2c0aacf5bafc02d5a71b44fe822e9abc0f41a40e7268a05d215ae31fac9e6788c4a12513de736272d3c97c296a883749c6ecdde3664fa0ab722024e1a61eab9dbbb09f6d1311a10ac64ff446c5c7b9aaaafdd6b885ca5b5279b6cf3597fbe09856582368a96d0894a185745522d2c5c172e583c0a3eecb4bab49c5542a940783eefd51e89d6a15950644bd23a0c9aa18b438650e582bda18eb3dfb9173dd13f34206ba59b0fb55905152815f94cab5b7cd9834667883ad4922bcc091f5c09b87f7a565f9f2ab7840504a3886de817e9d38ea9bd67f7681cf1db429e6e094d80056f2fb39200e3bf1638ef29a54ca672ed73f2af5356df709d8e914b5c7c7300743cf76e4b47330279dbb4fcaf11ca1fa89769347814e51555a48950b215bbe86f046a18bd6b1c93a41840199b01b3484ec882f5fab54ea0b370527922f56c0d879b71145e5d7f138ff434512be1e4f3c7d3b5713430ab186d432157378b7d63ae48e513497331efb10e9fa1a75901a3ce08777d631d8239278b27bd215108c225ac80aaddcb75f46cd48f43e606f1a4089c06d69a050d4cf13d97d3edd0b38a85fc002dc045c6a1b4738f1d1a037f5db1acbc410f5a6c2c0650510507f560c9174ce0b72848d22408dadbdd68731bf4ed7bb916e0c88e1e0364cb65b41b5400a606cec5d617dd664631f41ebb152da2fe3323d6e9ee3e42f4cab6bb342e21223856d38a41370f76d20564335544b4bda21a2204ea40d52b1145959311302eccfa4b576eabb4e98690a48a8ce1bf38586e6d431dd2a6994a05e2c8c7dbbe3b4104ce0fd92f916265d3dc733fe85e0f0230bb85fb3252eec7e9f13b622fad64638856dd9e733384ed1297a44d91a355230ece99ef70befc208e43a091d37752d65e16578b61117f5d622b8cef2ea12707a828026078bcac7e4e230223839a3dba09a198711bc98569c4b869f5e736692fcc6f2eb77decb892542816ebc37a5b368ec0af38a7186053266a7075033e4942d95960d50926361149cee5ea33e341ec37d763bc075930d64664fa13602ad289da1697453d278a43b788c61b1a9da66437724486ccc1b4dfe3471cd4e6524a4044e57bce486ed46feeb86cb54bdcc91beb12c214f93924659f81bece4de2e77b1d245deecdbb8f7a88caf01284919866794e05fea807fcbd82303c3836906dd81c09eeda26c7f4dc685b637f3d4c38d35cd32f623080c13172e690bcac49094ae457a51c4df7fb3f3cf07a202868c79f2b01cce4f378c692d25a97eeef7b1ae1bb9df9ad01a7dc76431ed1fc69301e2ca2de0435ab9027553c351f2593768c88ee9998e1752e0f2bb97720a3a711523469bb43d6cf41ec9c4c4e0baf20900f1251c27bfb1f90b565ccf0029497d0796727eb81c25c971b840f6a703d2688ab3854d11ace3f075c510092e7bdb1433b5226725636bdc04cc710a220babacbc1aafba6d03728f078a373487987642d7483719f1809a71bb5a1bba42ef6d5a068e03bcc9c4ca002c02e0206c346ae0e6c384d175cec94c39142c5cbacba931c34fdb90d420e8695d48409701b28b69e1257a023d3c89804272aae3e09d439d908dd1f0f4cf5e8fb439212e6f2d3ece071a445b2218449fb310b752dfb227f2615ecb7446abf0fffb6e7a795bfa032a602da0cf6ec45891ec149346d0c01aaded28d9c087a15cea77a0d9294ab5e48c3f534540ce6714837be81c39701f583f1df2fa369f7111fb67d8f4c5c8d54dd94cfcad498f8e83e2fe2ab1ec857c4f5de33ae4da91a78aa24f305aea033b983b60723ae9bf7b55b0cdd7bd4fe6dd53525a3e353442648c580ba0ba6d46cd20138d0235b2732c0ea59bafafcd4cb28d822b3fadc96b6660c4f5c608608be89d7a5635e13ca3c1c6d91ebb7c2a1f0167a6da16397ec0cebffa0390bf70e48bad90b3fff6f2b42f713ad0bc4591134749986721ce686c8d5fb9e71318b5967e5dd4bce83b94d15ea048dd244cd3e0827be122b09692c0d8072a94f007b933b3c1265a7e61a039ba9fab3ef6481415b57640f76894078cdbeef21a8c068c28705554ea05eda9a0f8be71bacda64ec61c9c2c810f41a7a9696dd65f7accb0e22125cc6e6f168831731ae2110c2d4c5a823ae41e7e518cc84e4802ac93f149490c69f41545fe86afde41b6760450060d80d429a06c812b8285f02011f8378cd4a94d8e02479748e0718d2430182cce2aa7add2456594833453022df6f2736049e4a3cd8100e51a0707588f69da2fe0b109603b0b5b6e6dffe8949564ad1daefc6db6ee5c2978b6e4fd97bdd6868c8cc3d871b922036d478959e58289a11d7be2e0fd4e30fbe030302bc1f0791623a6c82c77ff0f4d16a91f61ff6068632bbbaf5520f0d5f533504cabf152bb9c222e19d5a72b62a688cfaa6e2d54057c2a00a5fe737960dc33726e5494c0cfb1f6553dfe59f29bb33a26aa5b7166701f2ccd0f15cff910fae4b1c755624f887213a2057bdb4ff8c0d6939865a4b7fbabaae3152ee58ede9cf6657dacc74bfc7e690fb5c26e912e5826d53011b3f1a35e7de8e8823c3f1a7546e6048ba49e20fe66e1cc5fc9f30a724841e491e7ebb45250b0529e11010ccbbe2b1537ae289f7555d911b09d23a34577c8fd12dfbce2be68c68a9b750d3d1571bc880907f5ca24602c655c746bc2a5d25bf733e63d47981bc9f5c438ad1e58af68239c67cd79bfb7a72d7cc64c9976146a780581130805aaf099b1d7b0f2e8e45ad58b5a835947e6dbc6c0f46cb3c30f6f3e954fa837ddd0d42a90e09893aa435d40e6c3c4701234f5f6c1436becb6826f2c0d760431744f49357a9091ec68649668fdf4c1b4556894e1f8a97981033a15c84cc5234c810eb0a5efe6f7253cab66dbd24849111069b2d88d5ebb906ae12dcb939a2457f2b2f3aaccfa2a0edd55366887cea29fc58e8c5fb34a5c9ff8f82e6b1ad079f30323e12ac30fdc4992add79c2566a250dc032ec3236427fb90d81b4365403b39e4a71ba26bb9c77aca7546e88199bf07ff0e24cb10efff8a286122b2bdae84016da93a0cf988105e3f57c13d9f90c0684984d58b16df506fb4ddffe1c5921056fe76cee46ba12962652f660504b6940422e578c3d389700c44e90020e1c9a990d90883ad7338023eddb53220fb8cb6fe1784cf3988e439897e1f065bad668f2f33a2cdeb1a3d54455e6d35ce2fe56338f1f01210cb06b41e5c9e3806237d30d2201c19b04d801ab291431a4cf51d6914fa77f8b2712da68ee6f0bb7bb898b720c6786b1fa6dfd9106d8834bf67c6a70d28132a7d707faf862905c79800a27d66793559efb612a6a4a13678d5667a9dfa0cd06ae213e3228037dbec4d9b1a2daeb7aca71478c07efb19fe0607588188f8c4db6688294c5184a96106a8ffca6f944e029b28219aad65b2b431245623baa2c1f83e9cf55cdd3d01eb483f1c16e4c21ad68a9b76f12ae904bfb23d14691a9457e9a6459b25a3e8cd5a12676b5619b7e8b6ab24d59805963a0328387d653765239b861115225fb21d12d156c70285fddb53916eb64912b8e80c6039f195dd348b6c1a0d54887ca96d4844371d0b2c0cf451d0fbc89893f80f0dd7b9eac1a8443818bd72ad9d6fec40644c0733d41791177dea2c1a15dff0e67159c8f3870304191b3a5b90ecff9fa071222b7121d29cf9c853fc0dd01fe14e4a89005d945d3dfb81a3dad0980addb0cb18a49ed538da782457c7fb7f52b03963a1cf6ed3a596041b449acd84107dde660a56c014b738fc54456a7e6487e2d5f955605bbbbb259f13d5a14d4fdc61c04276b714710ca8ddb0644de72f71dfc4c3f8f5413826f5a860cb7bde0b73f866bae86c39d35870ec67c51c43b7fddb165cda23cb93bcf182800a067463cb6cc6406bda7877eb5604ab0656aad275f3906c83fdfa4303b817a02f06506aa9df72a49a3dfca13ba3ac8a0a779bf95b8d0268f21ac262f88f93c8501d5b4b7348aa30e41d9c169b370ec1929117ca3044af96d1ca2a2ee3c8f9810143bf7eb8a2540b44811ef3027d72e263546e2ee2180a5d88b021258b31acf86af95101ed60dff1b0941dd1a991c855a11d6d7a77489831217ae4cade2bac440e4d2fdfec0c5f9634f99d86f684fdb276b2d9bc8a0f55ab7ae8fbb91d63db9fe2782ff669a1a28ac5a18c60c875e3ddcfb46bde2c31aa7f46f264e151270766000f2d0710d6e2203c5a69b624557d6797300f7da3f0d372667e201206f2627c96e99cbd55db0fcaa3f89a2d30d375a70fa00822674351a6b34574038e10f956c5c2c8d2ac6cfff6a459a5f08867a2d0a20bd9efbb042a77e9d0ba248cc21ef690a4a0601325c9f00c1d89ca52c9d95c0c3c057d35992c91d69ad0d66addf42a60a5a8d44be719e3db5e4b7f22ef72154262687dc7fd1bc28bb9111329a396a7227320e7a50af6169416f059dc2608dd2a19d34e17ff0b55a821069b6856392a4529aa4a91fbf1aa60e8f62e4ed6883a254a0e1907004fbff2d3cdf61c14ba666ae3d3fc0458d9d0bd06d1953ccc799dbce98b3095f74ce320e66eb5e8a789296a57af7d458193b1ff821849bb7c0f4135ff4c4e111853211de68285dbc29c881d846bd9bfa182ef19658fccd30107da42b2ac0e82fe0895e976e04089eadbc86e7f7ecda79684f9c5ca51d1e4ab08ef9fe8091ec9eebf9b9f6b45f75f2304ecd595d4ecb636d9fdfad62197b189135e4370ffec550a3db1923f5aaf081c4bc89293ba6ade67ef59c713e0b667c6949dedc0076e8860f5af92e822ce974bf0a5269b9ed8022aa996c5aa0b846901d26a7c7246bed4da1b456759d9d384a96c5c457e8a0ff4970adea44cf2675740dec1d138166b36d7790f6b123c8865d199a6231d8cb7e8fe785a0ec340ea06ca873662863d1d8827e3d04c3f086931c15be6747c89c26664faa7018e7ee9694e40570c85661742b19d2e3c6827b4c827dfa518e80854cca6bc4e31e0b23d12694548ac71d6ee81ec6039b438e57fb3faad22ae4c38dbb58b872a35c0aec4255636f3a96c975f4bc18b07b83edda5dbaeb71d1be6e7c85f50e130b29c474367e0fb95ccf01e45cc9f4c81ffc5cd939a9f6befff658ecc8bb8c45988f935ed5b8bbb60567de857d9419f622c9a3eea06a028b19f75c6d7e367c6e36d448949f9f35eb619b30a015670e5927bf99303a6057c3de22cec8dabb52184c49c3f6159a3f6a067f4e0203aab2f6633b4494390cd8076695986398479cd0cc172a6d3f8ec3a97f8be2d01e940c47d238e21af5da53a752e448f994515a03996798d7a77f8e39c2ed1ffe9c12414fb88438a797dd6bc8df8b6e112ec792f0a3b2fceb2fdc59ac42db9588d10f51b2f0f510a65fe8c1c198593c86947393c7ce68340ef8120e2fe696b5f871a844af54004737fc420f84f5f6041f248cc8000f36ed1afb811e9a75ea823d84712d13e40a0abda53cec532ed77699d660ad90309e41e326cac44814e89accb88e7332552b2bed322dbadf7b651163ade2431d0f07ebf750c62551c60a2aca4ac94897326c30fd42fa3c9a362a46cfabf06237398fb14b9f7af9cd0037bfe8c1f51c818feec37dd3c0f5c1353d1891580a362dbd9bb489833329b68047ba0a6d8c0b6cb7cceeb7b494ce20992329f9272b3e5f665702e74b306592198282cff24d8a8e6aa8cf57c507484f9bb1d390c1dca12d2855c071272309288ad138c8f3c82e618a1b32e6565db5528c5e1ca594695dc596cf0397badde8684ed988de094880ff53931cfba8309d8292cdb5be841f3de82e9eff737c14c2cf3ac5f1fec80fdf9bd231586d99d755aee2c6292b865c6e27f9b648c4136f2e673061720db82dcccb1cb2451d2817ce7395b677ccc5632fd183b433f880cab5ca5a49edf0e0881c58132a1d1ae4232d23386ca5c3830c5da01a3c2609ea41f19e9933cc95becd56b7cecc4308608c4e2989d6b1a52cf9248962be64c6ed8b7e7ffe982fc733b54f92416b81a1ffb5020d01b085a391ed61ca36583fa85cd546dc8d1fc4b1ab3e107583a854dac281b990b046df140b35b23263cb1a6271232f84ed6c16cf5e1cc7d58d978eeb0c2a2fc8a6e0cb1c01f9e447eb5cca109830542ca53fff10c32e8c24d10c7af28830bbd4fecd9e04fb5a5279b3169445e2c7ce095780cae16257171215fa64fb153e9fe24e8efd95050247cfc265a705bf337fb152a50d1ce7ac4c988ac36393b89298cd59aa703c936a881a29862c2e1bddc251b9bb02a3a2744ac1b9e2532cd596856dc8f6a45521f50047e3cabbda5bcc8ef304a82c7c78742e56a218c7a85c0a310ad0e56164a0c91790058cd53c33551614164e7f09e6083242801943b28d271dd7e6b96b08631f553b6e3858c31380d5d9ebc32bb4a0f3e66de48fd861d65284083d5213219a0a47b8203ab2881f2f508293e18da4589e1d2763ef1701f831198ce99761233bcf5b498f22fdbe4d2e4632fb2885c42bc06116b98b64084b42e5543a40f4ac7c88047bac01094201b7ca003d4005ae9d4f44730750269bd7ed36210268bb5b7d958e56a1fa057b9304a2ea6c531485929d6e0561b8d20bc5d08f096429bd6febaf525ab467e964539e8e30083baa8725fd631a13546e333709545739e09ccb845ac3917ab2e5015626d13712a6134c45a9978e369e960252026d4b9a784d40fb09d691fd8e5eb267592054fffacd957e61644fb2ee78beb36362c408dd1298636546d39760dc1b07b48b048b5f6bf0fecd0a5cb12b43fc31ca48bf5cddee43ab8cf845181db0a5cf64f62900239a64ef09137dfb6d69c3c26164ce67b5da10b78744fc684836e491851881014a02c67dcdc9686fe3cd50f8097080897ac274b4c1d0470991f44d19790edf3c33709216ff5dc041e06552b6104719a8f13154068fda512a86a53ae1ffe99eae19190c41468ad3a40d053fcddf96b05efc4cbd01c58e31e0f2a9173c4be95f3427e370f8c1684845147b643687a70d3434acf7fb0b6d32ebb1fb3c3a8941180b090508d677f7b8d642a9b852415f3ec8d0eedde27ff6dc192c961a3d52b1fcb98bf4b937ce41acde6e0b3abc1ae39caec8272f3098af83a77e7d27ad37edc0fd951d52c630181f188e3fc0764990168d181cce8684380dd0492b4bcb1e806a23b9c9eebbc00af3cd89d5f2f00c3981a00eed45a1715da5b506a885da4e047eb0a076ad72c935c6e858dbe9723c35126555a73c5574e0caf19f007177cdf244cc18e8a6a29ed7186cd93568fe1e5950e1e5bacbce62895d3ee762a74a7129a474312062d8a1a1174f7c8cf0a0b4fdddfaef4c1a1cb6cd0349306206cd834b4dde162b54fe552813cc6ec104b68a451b878300221d4741575f216bcb3f1fd2aa0746355dc59a66635c4a5b0a804100c21dc2c34294660f0517c66e21f1e32b64ebccb7ca2b3eb807608ed75ace8ad0be196d6eaaad759b968b431be73afd5e2ef698144c40d894d00944f4558ac62e64a422957d77a40a4b0161b3ad71761028573c7cdc84e1fc6913c5354079d36b06deb03733437d7991c078972e001abb735d3852ef6af57e52c35ca74b0d05a85e6d2ed96d38c511b85a5d9c55b5e7e1f4ffc131520c60fbb4238958001508c59cbf038d34c399e806dbf5a27a244ae5c45b245f1531486f9325bf9142170d79c580c9cd005fb25947dce12a1f92ab8d66e80230a54c773afd1ff22116113950bcf0a884c952282d70a7abb59e5870546acc0256e2229c9fe3da6753f19ab8448de781293b8353c4548c78431858ddd7797be16ce0c3ff0bb6b67b61740032fdcd3e52699b47d663aa46594bf99edd0bfe8a86c8ff12ec4e9aa12fd7efab5db754ca76547548a92af8583f694156182fa06333b3fe34226e100146c4724ed6737723abe574c5367c85cf224b838979b78c0ffd78b058e7fa50e96853f30e4233602902d0a04af42ae5fbef101426af41260b09a244018f2e95d753e392252143c574b9b51227603f5684791ab2b85d932879a050a68e99a05061a162a471a2b477330048363060a5e06c2300294fa23fa9d566a1cc41f8108a7c3a7528c632498746c4a096c2d70528df611fcd02aef9a32ff350b35665329dfc2320533d551057019f3791e6e42b571f04b1211e18f095f0d05514371cc03b71c752e0fa892ec08a11002b76c7280ebc26953e5b01e5fb30b9299f1425c5b72b40acf5c07f2424232d4e4e4663c3b39dc03e32e73a920076aa3c328db0ed1311a71f0326614d0d1c1fedb8365f315e04b3c316c31f7a74517a6849345e7dde0bf0ee4df1b85f33085a6748d1c51fd4dcd7a2ae6a173ec5a3dc69bd9346bb399c19878af728e9891c19786093e86cf3ec4167527aa4345f675ff16ed23da3c648463fe015741c699ecee8fba85902c365580886cd3375800ec80cc04dd6b2c1dacbacde69d5a9cadaa28ab1108150089d7d3c209dbc2201eae15f68ed483bb9b9506ddde585948ad864377acabc830c82ad14296dbef58efb9520c265328d1c3470cf8f0b56b4a88dd2b1340e57942d7b4269388794afb3a452db1ef25b71eb5f643dd05f4288b5dc262d474a67a2e78726e8d0933c99bc8e797d73c1896613e14cef89ab36c771379275e7a00d775a4a7aa085a2a73c4643020273e55d61400adb0a113476537fd8805e4ee2ee46bfee6d7f87434b668904081fa5e0f18701834fa3cb099e5d1f0c90ce5077cb097e9415bdc132f281711a9ed188da63ef84431735a5a7e74750ce9b146dd05e318bd0a3b602c81918892c02856ce6e6a01906a07f4e7b7396aafe005ff9fbdd0b9e2477065820617617abe2c607d75a1a44ab4b4e3b0444dabaee7b583b3695bde2599402533a3b20ef5d5d89264e799be7a89e65eb57dc2214b47036bd99c6c204771a1b453e49333a13de3c5cd21789fd94a0ceac3adac0e8f37e3aaa0d1b81b0b408ba25fc0a21e976f024d6bade56226125831a11ee174653fb68f8eaabfbf02f17a37235329dd73b972b493789197c8ff9a3172e40948c9e057d3ef35f0bec051c269eec734ad0353d532bb81fa0e0710fa54ad85ab317326e86a5543c7cf183587f48fed52ff3f394036d8413bd110b2891e45f681b1b4aa75cec9db3c64ba37259501a31b99efe8192435402a91ef44b0867ee30919fa6dbc4c21b84589d8dc781fa95134fa8eb333e1861cd9e50178d8dbf1d1df7c2688f21530c0d328730130bac02b2a8771b6c0f85e6764595f14407e5b5bf73e9822a0fc71ebdba3e3dbef7c6959ca01ccdb76516c9ecc4462a93c2d01f31f065f7a302ab783cf1c4ae16b35f79a4a98e5195b1d5457521ee49a533f6e93400f772565a59dfda43dcdb09adf099bd207c2cf37148cf1a8e8b1aca1f56745a9882493915cbca373875ef6335b18d271535e3ffb4a0d45818679a5e215b939b243812e8019d32e555c6746c6c5696bac350051d7ec33b3b02c62ac93f3735bc4537c42a262a29c6c876dbd5caa0a28db465575a4b0c1f2cbb0cc65b3b55437983b95ba8383b8caef0fbdad1e9790f644aa5e598d6b17bf55037d641adeada684f36a483821826cb707bb3fbeaf8c72c116fadbd694e6711205b3422abd30dad5bb061bb3e9b6dd2fe1b255395a22b423ea7b4f6783424eab7377ad5e67ebd021797ecf2ec031e91580837c94624c43e404f82b38504625748209c914f41b87b056be5e5fd9dbe4ec29231c923053eb5645b36ce3d5d13194a654a50e0be21a113b2bcb8679f6177b5f15af16c6fccc9d4e0b94d74cf7458e0cc66684aacea0abdf7bb75672825f59b4d4aaab0657f3ec6c96399846b4bfa1b2706a25971aa711b62755d57f0747159037ec30d392a058fbc7f85c193f48980a216a1337928e4988f7f4e31f00c09660dda47f92b5ab673907aa11fb6d762e809c6ce7d3bf837e7217cb9f678ceb6155ca558eb256c415e8ea577553cb4a8eb2a2881574e5a7e256ca0aa772a58815f4ca57e9564a15aeb2528a2a68ca97e25296142ea556883d27b0962b02884a8e95a0c28c1091f70e4af6b7d268d1d4eaf4cc5893fc714b1c6a8378a29428085a74522bc4bb52a240a3950eda82fc5192e0e35bfde6fb87cae9f7f917643c5acfa24f24249718e86f5d4f8ded08b897e2a52de85768a8a058678ab8d6c9ffc6043c8eb1ce63690b0985f501ffa75ffc9fa12b0af24f7c7a857eca9ae257575a0fd267fae72e513ffcd66fff19b446805e14177a439f5287a0ab0e1a0f1a486c51211cddf5f46d261fafaf3580faf4867ea547e34a775a4fa327e867cc57fbfc81487d505b987bd7f34d22e25c1eaba111fe723f09d45c9ce6ccb08a5cfdad5fbc0fcd4efd4cf1a30bade7e933f9f38a38dd17f1af55a3204b545bbffc175a2717c545eb91de13de5208d75d9e71872938ffaa476fe8afaca8e147884eb43c6911b16505faabdb9ee7d032faedf4b8a81bfa951535c4f95ee0ba4c7fb322cc2919d783630d0aa25bbbf8b84523a1f9e1fe004f57195319685d055506d994097cc07b137651605cd8814acab51176a7c68aabb90a91ef5b24fbd5782d0e79e940820f3e26f43906f00a907cc1e9c0d7414c6d28607c7c21352ae5b5c2dd8e6cc8ef7bfd3c4c49ec516c702adb205d1b5a0ccce18c8fda56e418b66972ec0f560f0725f960f70628ea69ef092dff873b66f6579df76d0b119a71f05b6f4dd9f2e1150c372edb745734d6f9f2ee7a973c71b35b5a4dfb4e48d1bd0a6eda3f49ee3444acf1c1261b558713d2526f2b37884f4567ad6caf9b7db7de803c7eb7413154b2a135635b850c4fb2585145cbd935647ad8092f5b7a178436047ece441f11501040c2923a468ffb199af514a9cbf5e765d571a71abd21bc9316e70b0ef541cbd584a547aa549fc7421583fe249432dde7304cf7391898b7dc4043fdf31f3aa14e4ac0dcfeadb5ba8dca6df7de52ee1df510c211aa105dafd9677f91af92df6f92dfafd7eff7f92de87a44c9b225c32adeef159690345eb0c4b0a6e2fd9228c3c46a4957588c78bfcb0c5862a4b13ad3020e47bc5f2c35665c41986a5b56f17e9b52561c61209912622adeaf46912e691475df9bfbece9eeb97deee9644feeb3f7e492bdaedf3d24bf7b477ef77abd1e5990b31460da1881d215ef5ed5979345142346b61c89772ff9d9ca45db0f156f60bec4bbb79481102d36d1aaa91e21e2dd635a3181d166e564c75bbc7bcdcf4de70e28560d1b56e2dd736636bccc8627fccd9b9bcb47aa6fdedbcff1e23e3bef052f4ac9e3f178519e5b9674294bdde74473a239d19c1c1a39515cbf7372727272a25ae6426885f151a726de39cb33272bdeb8b99938c63b8749245d2252f7384d9c264e13070707a7acccecb3e31c71a29abf7194467ee314f98df3fce20345520773ccd59678e3fce4c8a164e1e6e6c957bc71dacef8206bcbf1e20b8d78e32c4b9c388bebd292252cde3841d0844c8d607194638b370e8b2e56584a444c9d88378e33cb4897b28cba77f3d275f352eeb3bb3a3efb76a3945a9f5d379a664797a6eefdf76e4e6e27b79393dba9b57df65d597eca53f948f5bd337bd23e69e9a02db485ca7df6b6ad355b91c695b5250d9a0a34f1de318d634ebe52849541a123debb2591df3badddeff76e37e4dbb956cdabce8ba57b166eb3723e65545e5260deb45011ef367d7344a9c6a2468c2942e2dd7ad98811f684c71ba928f16e971f80d9ba32958666cb8d78b74c0c9c41316122c79b1bcf78b7cd058c3031e3ecf9542325dead73eb77fb1cf2bb15f2bb55b6519fbd3d3e9f9dfbecec312ac86f56a9f59b05f29b7d7e7616ca9ab16a6c9b1cf437ebb6fbcdbe6d386ec900532404da9278b348b3105c6e6c41ba3189379b7c4184068c1b2198c859c59b5d7e964135e479a64cdc5cbcd9b21923c44c88f1a0938a37dbac00444b103837636f5de2cd3a3f57a54b6a55ddcf295755b9aaca755dd71e3dd635bafef8bd2ab5d6a72a624594352da4e06011ef15c9620b9b35415484897989f79a3c41ba34a6ee35081a4ec3c969b5b2fca446e523d5d5286df6d9f5dbfa5b47f9f8ad959f758fdffab9b31cb2e304720e4d8c786ba4037cd09032f38508902ef1d6491488a9522356c28bdc8e78eba605945021c360a12166156fed9440ba44979ed57dce739fddd2729a26f7497549e992ea5ba52bbac115d32f39b8df398ac7efacdcf13bebf89d9f6e9c3da7e5a804a2a6d8980873c2868978676408596a598e5934acb8c43b675131e25942078b3430e29d975bb9a349c694a224de99a9041343c5aacbca5c9378e7265286133146b8acb525e39d9dafce7d8eb76af624807cb4d957b3d720edc0a64baae7a595335ae2c4ccccc450309080a003a3a4cc491c77846a4d9b1c3d8e6cf156995f82275c3fd284d01931136f75c9c30a0b6d69b60549166fd5f931b08478b91961a2b68cb7da64fe569f59bf55ad1cd9d5e3f1b3d3c07513909f829e81fcb4c6d941909dd22f36c916c78d576d7cb6a2b2046d0b6d8c9129713e62e5cacc57979b3566e20dff09ba963ae2aa760c898214238c9b17346b405489a1f453015a34b9546809f3c42dce52ea5e8095613ae98a2f888079c8bc51af3acf1838c806ef5edaab4e5cd30b7bd5896ae0ddd37ad58172f4ae5e75201cf0ee21c57861f0e6455ff52523bcb2577da908bc79cd57fde807bc79c8577d870cde3970af3a052f78e7a4bdea14a0c03bc7f9aa536802ef1ce6ab7e7405ef9ce4ab64448a3cec449975a4fcb4c6ac37b9ecd308f1ce735ee3cec5798d2c54cf14bc71e45e75a012de38d157bd8704bc719eaffa8e1478e368bdea14c0c01b47f9aa038dc11be7f86aef77f0db263bb6be5dfbd65d16df928d697ddb84c78c6fdd7d8dad03b9487bd581aae0ed3a5ff5a51c3d5ef5251cf07695afba121537ea55579a02ef1ddcabcef445ed5567f202efddf3551f1ad97ad5874554f751b39b7ad57de2544f4ad1f6aa27a180770b7dd57dc9b6eb55f7a98077cb7cd575d6b454afba8e1af5a9c6c5af4e1d7e75275a572faeeeaecf346f179ef59d537ab6e35b6fff35ae503e5dd25e751f2ef0669daf3a8f1bb6c7abced306deacf2556791faa9c722c1de650f6e1815f7aa0f45c07b8dbeea4725ca5ef52312f05e9bafba052eeb8d57ddc21678afc9577d2886dbab3e64056f0d7dd52d58d15dafba8534786be6ab2e7c837f4ca8aee3a4ec55d76902efdc7cd5878ec0404e78af0fa404d6716b7bd575bea84efe29196b472aea2758bbab1d7e9d64c4b3189ef5f535b2e9538e5b82057a8c5777d3a7345e5dbfc615ce504efdd483ebc17d521078f75ee5abfe2adf2bd58917971fbed63db89edc908e1eaffa101386a5c051af3a0c857f580c5bc07bfd210bd87784f7faf01b78bbbfe1f8afd6a71546e040cd603fb41ed64004bd86589d063e50c07ed63a5c5d84540b90a863cce6cc8a519510114555c44423a894d83da55a23bf231aa1f53ba211cbdf118da8fa1dd188af332c8846ac389f7e9d31c1cbe2a50e2622ccfd3cdc4991544f85388ff3e96bcc3260f5f7ceab9eeea41c5209f052a2ad56186e10be82abc20dbfca0b40fc193e3001a0d8c112074a1e923a2071c0b0c105a8a327a293d106cfce41ed50d4e4d93bf8a076d090866d759980b3f79a5d01885fb8ba3db8071874222252b109ca4306269ddf4fd0d0b0e8825206270eeb7f60ea80030f1d386c00f5e4b4a1c909ca83da218333b586c0d9df1e5aff0100c2d5edc13dc0a01311918a4d504c459ddf4fd0d0b0e8825206271d0074c041d1c35207250e491b20416178bae074b481d864a4c1b367503b1465f0ec4e6a070b4c1eae6e0081b3ef2c6f00a0030e84abdb837b8041272222159b8a4b3abf9fa0a161d105a50c2c071e96386c00f5e4b4a1494306a56293daa1089554aa80b3c3544a0e3c7410ae6e0fee01069d8888545c52d2f9fd040d0d8b2e28f93a70d840092ae909c909c3860b4d471a88198c983cfb05b54351d1b32b15d50e4b4d9f5d8d9ab282b3ff90531d386c205cdd1edc030c3a1111492949e7f71334342cbad06e0095e4b4a1494306a66211116908834cd4c71470761e1aa8c70da09e84abdb837b804127222621e9fc7e8286864559d8f3e4b401a90983860b198e988845a325cf3e543b142979f622b58385a40f42d00167f701218427a70dc2d5edc13dc0a0132161d0f9fd040d0db370b7a1094306a6e292d2901365f780044c38fb0f0848b0a1498370757b700f30e8182ee8fc7e828684401a32305d281e2d11958c923c7b90daa108c9b30fb9da01c307449f3d0219180167075620031a32300957b707f70083178e747e3f4159e832158f9492907e80c1ec0568c012ce2e21010d602a2e0957b707f7008f883abf9fa025a52422921106cffe533b1479f69e1fb58385a3e067f72000197076a10f0258524a12ae6e0fee211ae9fc7092908c2e1cf514a1a8e0ecc126a824240cc2d5edc146453a3f01c305cfeee6a81d8a889e5dc761b583d1073d9f9d080909671f222261b870245cdd5e514e8ea76a8723cf9ed50e440b4445403f0167a710f423a2917075db7723cfdeaa1d8a2cf454c1d985708f91305597b21709b3ba94dd82705597f270e8697622f2ecabdac182e7e10e210b8b25e09c87ae0561aa2ea5c2550cd6c79f4f27cdc40ac2a1d02908878413841be9b5078542c220e19620dce9f3b503b50369ff11fa68efd1ce23fc09b71ab5d5a91de156afd41baffd15f6b4f3845bed4a9dc062013c80415265eaa735867370861bca99b61bc26df588dcaa721d6e554b6daace57919e4126cccb6bfac35e266acda64e0f50455515aa5bbacb43318496a9e5e1576fa19a3cbcd6379a8030949a54b645a4a6d77a0a89c88b30508f48bf7a4b2472a40f741c11f003a2076e1e248a809abf0ec221b0056833fc41f035f0758fbbaeae57a80f7a5ed300061f0251cf6bf8754f5d3d84dea6c1f732b1f7ba675d8398dec0a9baa47dbb21e887250c61f2210d40fa54d4c3942d3af9500056983a3f08a00009284235115913a2450c163088704df5d002a3498e36b8b9b45d0d109cdd80a291e27a7205490ea499184a3265a4d020d6800162ca5c8b12333a10240cd616313b489435d92d556431733e4db8f0e1230d43420e8e39468683cd12ac74c90c37665654903abca08abc6963458559d447d70c0e9078a21c2283ce0c8c14501271635a48aa2d44763246a06acb02724339630a97a11c1cd8b22e8999f3c7ee4a4ad898b132ab31e6981172a4c92a71d5050c1d0b668c1ad09d0d6162f522461a138cd87ae226e608983735acb28499bd3519a22441868993a926ea15c743c4158c76075ab30c0815254f00c831cbb26ac0a07bba508e10a4ca0a855b11164bc856266457369634718e255fc02348c88511c10389a388973354dc9a785102559e703164a256230574c8893637d2254bd6943bd89c8d5929a3aa8a3b2367a0209330b1e165ea39972684d4982457de50bd2e662254b1a9b80ed32c57565c60390b83c21801479b3151da8030a912126b4f5fc8bdf6353fb5b16ee1ba30b04bd2ed11731645b37265ed4b89279a67cfedf9e2c973f3ecb579f6ac9ebcb9679667ef6d400440082149a5b5958939e7b575737a3af0afe707089789d9dfd7a8c665629a526562f6a19e76d34f39a9d5f2930aa78fb2ab6dffa442c3f293aad5d44f6ab2477e02019aa655a6269d705b50e667cfce1c969dd65c969dd8ecb4c3f1ec192ecf69a4a6ca4e3ecf501fdfd9ccf59dd57234c7777603f29ddf3ee738a0ef2c27c1771af67a2a286b6516d26321dffaeab30b55c13b6bc57df6dc15a67af6bc953b086a6527353ba9aa191dbcf3f27b64a71d427b83474d6303ef7cfc3ce52147e50e8219b9834508096f350a7d836a8bbae954099a83b7ead42a6b0a733edf2d2ae0ad2e7b146f2c993d362978ab47750a292a77103c66271e9e901458a8050cdd1f103f0be971d0793c3b08720741cfee0109b2138f670fe6bc461e21702fe7fd09b384bc884c08e735fa7a54e01e1816660505b9af718757060e027584591224ec5ee3cb0513ed5e176601bd880cd8be465e2f0c466a5f621690179101b1af11470ddc54ccfaf9e1bd813d4065f9f8e8d7c89a81059089d93f64f5788f3087e5a39c9d6f7002de026462f622b2e71167845ff645013bd2038cab1994e443010490828d9896e4338a8cb712e04832828514a713292f72f0bce002000b0d35b27a4891b8d1f5266563828b962b38aab495b9c0b2e3228c87155e43cacbc59a2c176046d8d2f1e6268a6c88153017553a2e6c402553316c44d0805b21638d8811ba4094a09b92c56c0d4b159ce8061531985b43e40a4d6acc589a2125e452a448b37cabaab156e560525340b9c39da75f7e374645a6e97755a08a395c9c20afafa9b77f3ffddad2e2799f7ea5380384e688e1a544e951bb480f5ccffe21bb03e55cd777ea064c83a1e99308c5b2694e814da6d399b314217a74d911963bf68307fe7ab8aa6378699abade39859c739b87bbddb16debecbaaebb765dd9b555d7acb566873e74476855d6cb8eaaaaaaaaaa4cade69245aa495855aac7d50d4ece03fd74d33ee4752516a15cd54feb71754fc0e9675555b55eb3389f073c1e8f209c71da5499acab48f5e881a76e70c39d46d7357d02a1d24d74fd43ea749ce1eafca37ecacef428e7657a941da884934e15e9bac1cb0ffa291fd3a3ec6a34559de95176605a4e9f4028b8b889407837dc70f6d6c98a306ccb686ecb4e6e6e148d0c2f6cbfb37327450606f73b2f5b345e57c0fcce47368c8709b02dbfd5e87aa34533a2edcbaf2b4fe79ce1de1d29abb56b6f9d751aacdeb24311325d57f218afabaf43364d1fb1507da4e6ccb2e1a5449b8dbeea5b3b59f2532793e6a7d14f9d4f1faf932907ed4c93d407e458377316e244fd8481ca9a35ad63ac7a513f8da044751870b06ac2741e637584587535a92af593ced89426c963acbaba54d3321cd0bcd44fb9998f480d4672b8d18a55cfca0c85cab9a5e9a71c0dfa99730d76c79fe9f1a683eec943457c348b8195654bcc1b3171aa9fe02f307e9860e162f926de2954c7b3ee489ef50f4cbc9e8d2165cd1c8e64122c2562960991675de935b2d1a4d708e4fb9f1fed3f3f3f5efcf911f33f6759cf863deb48af913d5bbe760caf51fb85d7f8d3c1fb58997a1f3f7a8d3e55c8bea7c7813d3d4e84949d7adee3c51e874aabf13d1e7a7a3c03704f4f9a9befe9e9e97195aaa7a7a7a7a7a7c7d3ae07c0fb9cf81a7d382ccbb22ccba60d799665dde835b21c3cec699787bde835c2ed267eb143152dafaba4bd760b4fbe8736f73d277a8dbd295832a0359a4a52b869a690239a5b58149692241a9b6fbdc2f035f630795a80781e17be469e249aacdfb913edbcb85b71f53b9d5dceb1f30ae82737deb907f06ec702c4ef787619c7aee7bb9d6fb77395c9e2ccef76377eab4e57cb76bbb4df95e50893453906bd428b772bd2c69c55dc8480897735b68e2ab69c993961b32b71c5668adc0c2127e2ad1e1b00460acd985609a913f156b57e374304da1b2cacb934f1569b2c64fccfd79ffb6bfca51beab5a7458741e135ea28ef13f23e1f7a8d3e2a5c646c754b46f47a36be97467f5c9161e6c708b9b0b8b762c7f77cc26bec053dece98a100f7bf035c26e0a8587157a964db27836197d56c59a675de835b2331041664819189116ceb6c6b7289ec059b9b9aa2a638b5b1564bef5a0d7d8ba84d7b88beeb039f91d07bec69db5bad7d1a1f13aee441d9d2894d7e1d1c94b9dd67574b48e0edb91d7f1e9642c1d5793fac98d755c5566a7f475581d1d77f5130755564bc450a188b2893f9c914aceb59965d1999be286450b246d55749aa8a1359f69b07ce978aae33ace46d99e6559b6132cb0f75a1fbd7658ebb503cdbc9612affda76ddbd65bf7798d6d85dfada9fdce7b5ee38ee735eabc9e26fff5df6b7c753c8f37e379eefac98d794e44ca4eadf3bc089585ec791e783ccf40dac67310b253fab5767c5edcf346fc5691cf7335999d58e7b94ac5bb7a1ecf5dfdc400e6162b492026c68cc43c4ff55304583411336506848813f1869d3c4f772af73cf5f83cb4eff5dcf71a7b566bd844682193e258176ff8595606084c7489ca5813e24ccca6a07bd6e1d7c84af89dd6ef7ce735eec6ac7dbd09f14241e2eab572ee4c0b122e2f5448c49a05d56bd7798ddab38cf8d6dfd7d8be46de6b5c9739c2f70a47b87a015e7fd0384277f8c1bbc411bac3579989aa2bb981f7abecf056a54b6f55dde7a657d9f42a9b5e6553139ab9a618bf9bac7e376518bf9b9a9a9ac6a4d0f0a2448b8d2b2bde4dc81038bc8089127b0316efa6e4afc61ba60e31687472f16e5aee3871d616458e9588771313c5dc0e1d5d6a101111ef261b5658615248668978378dd1304643db6f0d701ae034f4e03468d0a0a12c3fbd516f9406b3cfae21eea841f95bc38bdf1a5cfcd6e05c6362466c2b0795ab786b40028049862bcb91182068c45b43520ab94679a6c6dc58bc352c73e45052e5a51c5226de1a985b9a88c0b116840734de1a2e34a966648995b129e3ade12cc359062ebf33a46548cb909641eeb3674866a8fa9d81ea778616bf3364c890211ae6055b8c2c232b56c43b03528673478e1b544892c43b03b4860c23716c72dc2811ef0c2ad20a44101441a6dec43bc308512db2ce5a18c172a42cde193e60264a9c16882033b4e29dc147bae4a3ee33534f8ba9a7c5d4d3626262622acb4fbdb05e1813d39289c56fa615bf9992bf999e474ed4889c51d13d298b371392a9dc0143a943ae2cde4c492a2b9e6042e8904122de4ccb1a43c8c67278599b8b37530aedf1c479054b0d1434f1664a40f48845049116489ec49ba937a2d81b517cfe2ef690c51eb2d843168bc562597eea5df5ae8ac538ada28adfc514bf8b287e179f3bd06c31c3a54bed4b19efe2545b883219459a5125f12efa940c1b4c80b8a04222dec5dd91a89c192eac2b63f12efebc69a3824794333514f12e761933d6e50ada5bd44bbc8b59d2a52c759f97a24bd1a5e8d2d2d2525cdc92d9675f8a6b2e4dfd5e92fabd74e2f7d2335d2325e42b8a8e124810f15e4a2205240c182a2268e2bd94b43056a48eca11ba286bf15e5a0241d9a4c9128488f249bc97986c8e2b6b64d4e0d060c47ba9698204151738ce9031e2bd44245d2252f75989d754e23595784d252525a5b2fcc42be3952929c53995b289df4a19f95b2997f8adb41c51e3870d363e7254c55b093982b6a418161d0d3722e2ad942cbab1b6848eecc9d58cb7d2726a19834c4d19922ade4a4c658a195c6054b9e226de4a3f5371584c9c69dae6e2adc4a391c4a391b493783792de9e772329eeb32791fdfc4e8a526a2525254593dc7823d225de88bacf483c24120f89c4432221459148fc46527e1ef11b09090929cab5e244931b724faf782321bfea4d324c0a3134af7823253f5f95498226ab8891b3782335bf0ca932a34637264bbc91c6a44b63ea3e63c881c390038721070e038638380c51bf3188f88d412bc46f0c183060887e2983a5cb8b36b078634022717103cb12af3264bc31c420c814158da6d80e2ef1c6e044e5c9c5e549143174f1c6b0e6a3c8549a2a6ff1c640a3485d082155985b6ce28dc17976e1ec0207bf2fa45d48bb907641eeb35f88a3bb70e1c2850b172e44bd8ebc8e3cfc3e721e398f9c47729ffd28cdd45106f1fb281f7f1fd5fd3e3a3a3a7a81922f7225ce9a707589f7919a193e7e640119239622de47c9216b6ef8101345c62dde474b1bd1252e740441ab118df711b34c8db5b0a91d5f67e27dd42c03e39a1195e34a955abc8f9c3938883938881c7e137398c41c2631874924268951442291488ce6a048977250d47d36ca491ae5248d729246464ba337bf8d8c8c8c8c8ca21e9c6e65a6d0b0a26449bc8d9022bc7a64e9814cb122de46c934e9529abacf45724572457245729fbd288d5611ddefa2b9df456e7e173d3f7b11b4a848ada82d65d3723b729961317fc4bb0839033568acbac8526049c6bb2839648b0d29244c191cf12e5a7a9935bb7c509d1d81c4bb8839024c13ad263f966f92f12e62f65881c6ca9a921a51f12eca62218b85a7df16a216a216a2162c10b11065c182050b16a262e99258dd67a227d193e8494404fd4cd4e63711119bdf444444445ec68e3458901d4b9489375154c9151b7260d48644c59b28c9854b8c166acc66803de34dd4a480c646268697b62868bc899c383e2ae0f8a8b0e17705ad0a5a15b42a544813ad20f7bbc29adf15d4fcae50a14285b02029e2d0c4a80a8115ef0ac8205abc346173a5e54a34de159235d80a8bf206e5869a57bc2b2cc73899f1c556b58249bc2b30cb30a7509cb1ea32c54dbc2b342740a7c6c59912501a68f1aee0c4a91ae2540d9b7e0f9543e5503994fbecc33470c334bf874aade170388ca24922069d2a63a2ad19ef211209879613356132c0c2c47b9874e9842e9d50c36f21ce51887314e21c85729f5d7814c6fd162a85687e0b85426154889aaa1a7358626c52c45b88dc9202c609178bb8b5780b9327cc74b1952953232ddec2a609c2d40561f2189366196fa1138c83f10cbf7deef35b7e7bf7cde33ebbab41e1514a2df7b4ec94beab7df674bbbb79a54b5e759f29b84e0aae9382eba440810285b2fce4a6b96914282c79bf299cf94dc1cc6f0a70bf29c46004734df387da1793785318001a29ada794999832de145228556eb6d07dd568e2883705635cdcf32b4a881e63f1a67081341f5f6b5b275a7cc59bc29b12335f669e45c268c49b825b952eb955759f875ce590ab1c72954343434365f9c9edb187cc3efbd071e7f75099df43647e0f8df93df414246e850832cb296ae23dd486eb468e206a90439cc47b28a900265ecb3231559a0489f79007e5982d3367991997780fa9799932e2c344d40733de43cdcf46a2a460296205778cf7d09874694cdde7097013e026c04d98306142597e72a3dca80913b426bcfd9e20e6f78430bf273c776c54ca34bd80e19115ef094804b8e83a61428c8b122be23d21996a512eb18859ab2a0322de13963c14695748d8a0d2844dbc2730b9dc504c1529836623de13a8509993922379046312ef0962e99258dde7e0ee19dc3d83bb6730180c96e5a79dda4e2d18747ef61d04f33be8f63bf8e577f059811a6639c4b06895618b77106900325d6044ab68a90b8b773029c6e6e5edad8a7923dec12509ba9a566d55d01366f10e2ec0ad0b8a1864cd3828f10eae8d01f1d17cc3a2e319efe04e86d04e8650d16fa1dd5268b714da2d85848484caf2d36e6bb72524147d7f0b79f92dd4e5b750db6fa123ca1c595e26927161e22d8464b2044995922c2b76c45b2884922e45ba9c804b33126f21362147404c793177166f21260f279922614f960889b750b3056a39acce54e1911c126fa13441698286bf83e482e482e482828282caf2d36e6a3715140417c4e577d096df416cbf839e1c588226244814971428f10e421ec0cc102e5d6fc4c0a0f10e4a8e00240ecd5493c68eaf13f10e5a4ea152c26a8c978cb7780731353ca7b860d0d8aa3b13efa01b6662c8c94033f18615efa0f68984f68984a1df12a012a012a012244890d0d62641821a3909d1df12b4fc96b0f65bc27304233a78b0117931e58b32de1290259c54a9e0f2450b48bc2524ab9a106163c1e64c46bc252c7f581179ae5d45a9c55b0202e8967ca112236dcd4abc2584797116c6865bb3c996784b70a61d5a1ce9528ba3ee33b065025b26b06502814060597e6abbda2e20f0f8d93730cb6fa0da6f2096dfc0332236dc285d24d15126dec0392597e657162533bce20dfc99a3d14288538b5558bc812100190364aec9991861f106b2a12215034c8fe40e30f10636a17429d2e42b4b49166f204b07c4d201057f03b547a0f608d41e81808080caf2534bd55201012181aefc06b2f21b28ed37d0b3032b3a1a3bb4e4c49c88379013145b536440c8c15d8937d00bbc58980852a7638923de402048aee9e1a5c30dc65bbc81cc90995a9679b1226c45bc819a64c68e37beb8b0498b37100be68705f313f4fb877dfb79fbb79fb8cffe93fca9f2fb07edf7cfd9ef9fe767ff81fefca8fdb4810089d2470b1f43a698c4fb0709050bf40817163a5ac4fb07090b29145ad6403953c6fb676974a644cdc79536376ef1fe612660ee8b9bba1f55d81089f74f33ad42457786d603c7159378ff38592f1fd6cb47c26f1fd6e9c33a7d58a78f8f8f4f597e62d3d8341f9f354a1fb3df3e547efb4cf9edf3a4fa2197a4cad8941f26e2ed83f460cb152f6c516aa492c4db27b905ec899aa4162755bc7daeb6c4b8116469022bde3e5e6bde906186884a1b126f9f17f878cb2a0356e6a64dbc7daad2a5aabacf3dacb28755f6b0ca9e9e9e9eb2fcc4f6607bf4f42cdbdf3d527ef7407ff744f9dd6336a5c89b1c4faeb667bc7b90616d8cb49569f18811ef1e1b6588b0593d81b2d012ef9e0f5ecc48c32204859733f1eeb9e2834d92a935439af1ee693a712cadd848b13113ef1e273b8287ee47d47de69963913c3c729f9d478b07ca6f9e27bf79ca7ef3f0f0f044d768fde671e379938391bc4262854d4c57bc79909fc5cc705ea16b033326de3c3f545964715f6c8841c69b8758a516c7a50d9932ae78f3f4a08bf332048baac99878f33437c0345247e388122360f1e6c9922e65a9fbfc5ba3bfdf1afdfd7ebfb2fcb4c6ad71bfdf1ae7cfc9ef5f93df3fb2dfbf2758d48c1a38a874c4fb87bc3211c7e522c7d59278ff929fa7d2c6d48d7842c42ddebf011cc76449128408579a78ff9e6296cc7066a5507ec5fb976e41f3e58994284a2fc878ff88a44b44ea3efb9abea6afe9f3f97c65653e1fd4f7fced63f2db37f6dbf75443e143080db2113ce2ed438aaded784b9323cc33debee4e7126b492320a6582889b7ef499a176b5cd8ac09b3116f1fd3054d9a44a4acb5e1d2156f1f0a1e4e92b4c09292ac126fdf8a225d5a51d47d86d7240caf491886e1b2fcb4de586fc0f09a282cf61b0efb0d2ff90dd79968e1a6840c1d5d6df1863340f6c3069a32143bc8c41bee809227559c9a123ba0c41b9ea12c31428690326546e20d33e33222736d659623b0e20d373f7b9888a65b911c6586c41b66932eb1a9fb1dbdf3f6733b719f7d678ddbcececececece4e74c7ed49baf4a4eeb30e5407aa03d5d1d1d17173d331fbec3a471db0df3a5fbf759cbf759e1ddcd4b4a93bb1068d9178eb2057d0e5c559a7038c8b10f1d6497ab8422b42e6c856978e78eb2cc7ac884bf214732123de3a4c9c202f629c8d798e51126f9de6e71756702071e3854a2ade3a38d2251c759f5fcd7c35f3d5ccf7557bdb3efb5b969f74573e525d07ce645b52a5b6e62a4a1c8606092b502e6e537171ea6a140aa0de04aee378ea34800108d929bb7dea15c84ef9cba7fe21f5f2a9c3690b3d1e8f445257ddb2535c72ab729f7eada5f17cf5deea3dd9e9f5d581be45ea57a25f8948be9b3e64f9b5b73ed3b25f53330fac34f9b5edd7f56d953b9b53a37e7cab48aa5faf9cacfd7a03c8b7caecf12bd0b7baf5ebeaaa5345965fd53009bed567d9af41ebea6a9409f357b5edd775b9d5b75fd5b895079a5f57e4d4af994ac9acfa35dff895f96b1efaceab672715e5af39ecd7672efb75f574f51c5da6f935b7fdba7aba5a58e57e3d93fad567d5c8a95f3595f257d7cbecb4ea1bbfae3d8c7cebad152dccaf3bab7e96fdbaeab45f5d47af00f955b7fdaadd7e7dfb356ef5f5a8f6f6eb1af5ebba4efd4af5ebd5af9e5afdcf7fbf9f1321652724ff79110bdaff7e7e5c7e3fcfc04fc3eff7fbfd94a89c7ebfdfefb7e4bf5f87dfeff7fbfd7ebfdf4fadc777f00eaece788d1d96969696965c95f11a979cdedec9d5abd7e8e42a292929c5487a0d5874bc0657ad5ea3866030180c0683c160d05518af3138e591ae3c1fc955e56b44d21dd22652d680592be3c5e2cadae504244a10394237824d542cbc12f642575fbc46a18bd7f8b3b2e57dbeb6f7b9cf897cefb3f2f63e9f8f8b4fe8beb4ed7d3e0741842f487575e37d57aedec7e373e273f5999d94dce76a99cf4c557b9f98162259633c94308e3473742989b0f18a7d209aa82092850a13343eb83066c6803979689df97c3e9fa73e57bae2e2959494945cad7a8d4aedd207dd0d5aa1fba0ab54af3128140a8542a1502814badae2350a7507fd3f2b5afef7b3a2f63f5759bcc6df8ad7e83b6af247ae265fe391ebeeee44ee4577d7ddeb1d0d45f17faeaa788d3f9f8f440a47f11add2845da1bb93af51a8d50943d94cf4341b96727a14339119417a152883d140fd41628af40760a3a946700ea070505e5500d10432307168b1949a4a0dc266bc860a559395902953ea170fbdfcf5d38c5ff5c957a8d3f6030c8f641778328d83ee8ea89d71804db414a9b569fbb30dee73096f739d0893e14caf799bdcf5513afd107258cbed05da114f485ae225fa3d04bbc462838b3e0844f4a324b7e92591b15349fe42a89d798e4bc1fd2f24343438e949d7c3ee4c5a1322aa2b4c80203cd8c190f399db860127921862cdeb0db0ff917951aeff3d5e7ea88d7e873a35ee390054f99bc055745bc460b5453cfb26bcfb2ec90b32c559367594f2be0010b42558a67d338645299c4b255679ecd6173169675151a645957a36c905563a1a27c6c4e3eeb59c926b1acd059f6c7b223c454ede87aa202c8593ca58d96175b2aa046d2672ad74c8185220c8796367116185bc8889182438b95a302a30c0f2e6610160b1417744a1a6a2b5896f5dfeff7fbfd7ebfdfeff7fbfd7e3f5743bcc69f10cb6fa8176a35194266449525c878c32f8ca2824d0a33625b421667706c4ae8d4a8110aafbc5068a479c3c48e66142c2ab150e82a88d728ec2d09035be203f335f97c3e1750dee7f3f99456dee7f3592ddf67a5f63e6fc08cf7b97a7c8dbe9e9a820466669c50d68101c266cd5682644aa8a13942c7e62686aa9a7b281fe13542f59c55583e5815e3832ec26b0cc249593ec96bf01a9398dea960bc3b0d5ea30f81f9219fc16b1c92418616c596a41be98bbf9bbe580440b1e82ef4ea8b0e03a1655f7497b2e28b4e9462f6452f2ebfe8501fa658f9a2a751d4bee831788d4528680fc3690fc330ecc5fc94468fc7238918762838092e027b05b253d161cf800f861d0438085781a11c8661380a948775e0340d7663d85568764a1f16c2b0bbb0c3f0541234d132618aa088772a3734c60799256a567e48c19ec26a330af385be66a7a2173a0c5ea3100a9817a455a0a0a0a0a0a0dc05af11cae7f3f97c3e9fcfe7f3f97c3e9fcf5bf01a7d3b6858709cc0214702ca5a0ab320576158c87529b2a94127a58d14311065c5e2d9178b3b44d028b3be82881913178b1ec26b2c32f9ddfbdfff3cddc12848fff35fd992fffd1c78e27f4faafcef0b4a0e2771ff73161457f01a61e10fb3e27ee82a788d431a58dfb666dfb6add0db96c6d9b73a2d95b66d836d6b43c8b73aed94d64705d5b63996dff65a29edcfdbb6d8ae7dfbd34af9ad1e73540bb7703b2777683142a64ec81a15713b25c4878e37487a7445d5681bd2648bcb494c47228d972d3366c0c53b7d6e90e34b045b1b243eb8e29dca8d8023cc0b3a316f8654a1c55b3d6ab5cd2894e41965d3479be24a16091a4eea66c45b85fb168683480f373deca9d6c3309c03eee12c200fbbc34e84bd083b08af116ea3b0d075478e1ecf7a0a8a9eee9e2f7aba836cc5a2c3c82f3af046db17dd7128f9a20d275f7414bcc62291851ea0c798b412636c881511c12a0a139a850b048a0c67baa4a0492365c49adf2f47f99f8db1ff71c045d693311d3bae90887f369cfff313bcc65fefa1a06ab03d548d120fe51fbc462820286fc6a201f73e777d34b8bccf4df01a7d411a591ff4fd1a83ae7039f7422fc16b1492e035b659b9010f2abf818fe0356ec054fb5e0fcaf77abd9ff77a3a5e7cefed3de9f5dc8362afb7b4fa5e52af0753b53d4f7b31a67c2fd82bebf9bcd7637baad6f17894eac17121e391852e7adc8a7b49cac47c5c997863126ff87b2a5c40b37a24e9e1a517c5aa8b738853889c8d5eafb7e6e60bd5962764607a1dc49082d222851b332c7a6c70233ddbe4416ca765a9990bd65d1d3b9e7578c5b30e7c31e5597765d5b34ed401e6592fc678d6a1606479d63ff848bf769c79d61bc083c8b32e82d7c8a6f59cc09041620518166b255ab850aae94a53f339d0e7e2f83e9f8e1beff310bc465f0700f8dd13dc4460bf919abef5f06d7b45e55b192bbe9501fd76c68a6f67a07d8ba5fc16cbcab7572abe7510bcc676a7c96fa814a85d499150c1a2465b08a858585561751d298226434cca8bdb94b61430d9c357c787ddd54f1ba8c275c4871b191a91188e41e661ffc06b848b4c305f740fbcc6a2fb63c6f89f77e035fe3c788dbd28d3989967720ebc46a61e2f5ebb906b2ffe20f11ad64cb40efa4edb400022e4753af65b55d509bed52b550da226e1b72af65b7dea56438fc7e308ed6a744b861af6ba1735e43b4f65e5315fbd8ed2b06bcf5d147ce7b00c2d82cc66d9edb567b82c979dd277df794e238bc4bdd6539a999d7cae5df7106a4fb56b67d3860e5bf25ba7bd761dcd4e43d7aedb2af8d66f1aeeb56b39aea9d71a4cfbaa5c977bbda1c515b76e7d695fa1d9c9826b5fcd8a7caf6a6bf4b5af6e74af7daf6fcedfec11999d8ca688be592a56f9dad9259231f68692df6cf3b5b3ceec74e4dad9b00bbed93216fadad9b42e1daf59b524bf59b8d7cecab5470cbedba816f9dadba417d7eb96caeb5badec84e4dadbad24df6d97f6f69984455bf6ba8dbef6d62db76f4abedbb8dd5189885d54d7ef9df2b5ef963b66764a7fc9f7ae87d66bdf3595b0e9f9bdeb42f27b077dedbbb4ec5474ed3b3526dfbbb69ddb6bdfc13979bcdec51df9ed225fbb9b7495d929fd0cbeddab25d34906e8b7db834bbbfbcc4e1a5cbb5bd6e4db3573d35ebb1b05a3f1da6d6bfe76e55e3bce1107999dd2dfe01b672af9da7194da71ae8c68c769662727d78ed3f5e41b270ce7f9da71a04bdae09815f98de3f6da71e0b213946bc789dbc037cedceb9c2392cae777ce5487df39cbd79ec3ccd1ca4ee973f09db3d57ced394e312eaf73c28868cf8966a70eae3da72dfbce797bede9ce817bed3972d929fd1a3b0bfece997bbdf59b977ced3ca57e7263edbc2507be79375ef398afd78e30b97a16119324d6587e3c71f1c4c613c50835484e6c51231317efd4998a318165c64710ace556bcd3a7049c309e9465c1eaaa11ef542e4b09dd191869d694d4c55b3d86e03924440d2051392bb19499724e45522b196f754d172a296098751d118bb7ea86810857dd0e125959667166e6b41cd549ad7c7d029af5850b982773f1d6cf1e713e44b8c10246ea2cde1a6a850556d890126ea09c88f77a8c3241fce8d21126cb4bbc57a40b204848346db0e1a122de6b338cd408233f54b06589f7ead614f1d6e6879a1821f15ee186b05822055d96692315ef55ee751af2e99c61f675424dbc59e6eb305ba4f8c86ac1c22bdeacd6eb1140c02812044513cb8c59bcd9e86baab52c3ed89a4c25f166dd5e60c6ca121a68d6643c8977ab7c9d62a173322584181a3121ba85be6ed35e47795302a66685ee48bc77c8b43164b6906f66bee2bd4bbef6401632ae8ec4173211f1de395f1f95c815311263c559bc774fa38d19586459456c8488f74e4e0139e0dcd810d1e68954bcdd23d00c4b6bc6992e5da0c4dbd5cac0d75b5813372ed88cc4db6d0a5db46d6933a7264b8a78bb6e43196e4e4ce9a145ea4abc5db8d746545421d364449b2cba4413354da28c399222de38ccd7eea52b2d880da6179278e3a4bdaea18c2239ee28a323de38d1d79eee9ce46bcf51befeb22c52c406599127f1ce79bed6f2724be243069c8a78e74055f022c4da1521483729f1e61d5f57f991b64cb3e2622ede3ca418dd73e02b07be81d7c881ebc1d7ecb4c17bf020b6e33db8065ea3870e1d3a7410d3f11d3c03afb18373f0bbf71c963c0777ab3c8730aae7e018788d1c600a1b6ce0eb06ee62f90d1cde60c98adfc02ff01a3700123d541ef21beaa1945e3190544dbd60c61b7e2819236a44db447cf9ea8a37f1a1be485c9d8181842bc59778171f0a4ac843b99b79a83740ea72405f64d9d126865a12f5506e81d708f5e46b76d2f04f4f49fec92bf01a9f602727073ab9eb0426e49d9c02afd1c97bbfc1d70dee62f90d5f237e834fe0356e8095bec9e9fc2697c06b6c723568d0a0c139e43578045ea386a1cfe044f1191c02af31031393af4c4c4c4a94cfe40f788d4cc062b1582c168bc562d11df01a8b4b4b4b4b4b497afc9237e0352e2929b9929292d794577206bc46259c5f90df50ff9312c5f1a20c9d9325f186ff17570309056ec696977813ff97f565849c15315b28e25dfcdf4feb7f5e64ff7b912cadbcb698412b13ffbcc4fee70b788dbfb1a4a74f4a72b80bcd2775757d922be035260191909090ba8c3c9227e03522953d0624591e8323e03562708dfe0212acbfe007788d175460c5ea4d08972336d8e20dffd111903f72573f3d8099462dcc2bec8d89f808498c3f7203bcc6232722ba569e78e4f8442fc06b24c246464646464e80d76854c485e38b7c00afb1c8b560c18205aeabb7e0c6d768c1899a5f4fe402788d4464bf7b5fc1d70a46ae7c052322be8207e03556180e87c3a1c7af71e8c29e17065f287457e8b0d081c222582ff47f8d42f7f97c3e9fcfe7f3f9fcc36bf4b97b787787cdde8928df1d00afd181624f610bc953f00e5e23057707ff80611172b0b9c84ad2a66d071c00234e1e62a8ae64f101c3f0d6d6c330ec1cbc46b8d7e477cf0f0db92b44cd0f393c84ca0f09b9fa21f7f01a878046bd1d3de2f77abd5e9034dfebf5bcc36bec394929fa4df4ed152d20df3adc3a50abcbb7ee418a7c0be4ec5be7f01a5b628e0f11486efca012c7867601e517a913cb325422a6b0b479a1e4058e303d9e7507e2e40260c49a64c160922644cc02097bd637788d6cba7b3fc127b8cbe527fc70f1131cea354e8077ef834dbf7b3ee86bd0dd361f74d8c7940f7ada83c607fde93506832fc4c3cd0bb9d36b14daf01af5502b4845d80779d36b0c722538508204091224b82b81c84b5021e2d90ccfba86d7c86aadb5f60caf513bd36b9400057422f5402fbe46a0dbf3403c1e08c889801c293b6907f2627e5293c7e3d1440ce4ae7eba3016a38d0dcad88a223190d85514555bda3144bce107f274cd03b995df3d5428fc467a9d6e0f7ff43b0d63c2248809db6b073e8fbc7627937aedc4b5d75e24a37bed1f9a4079ed4baf31732e89a8dd6e37429226488e146903b6034b541b1d65e2c2ea6890858de8d21983414fed4ab8b15560849588eeb400af72fca8d035c85b90940cdab64c388f1972c9edb49412358608312bb9dfed58966505e09616f644eac86979d67b30cbb2ac12e64e0990145d526f5582c0c2ccf0b44b637ace36112dc0e8e2b404b1f294b21e01b26ea802d5e2c3098d2e6efa44fa1c5bb201e6147ab792d9ea12c7e5a50412006ba245dc4819031df134b15bfa68134315617262291b5b56247182c3acac6a4bd79b2899b30672cde59a723552a88d1810146d685d44a07989f2454a0c8dd4d2081117cc88972e718382114c4b8385f1b1abb0eb00892252278c94110135031345c78c317328c6c4f83489319e226ac6a8626e34028999630e2c30423459630548143659dc803d9b3a7ac4ce09521fa52e92ac5d5999b5c7048bfa9daf3d1e753cea847e07e379c25dd500bc51ae3c56603deba0d11a6dacc072dcf8e203069c93301151376ac452bb3db8b0e182ae69f258c058f349133323744e44b869a0f088e80146b965583fa546122ca4a4c19955e530737c963043d7836b8919154bd494d021527775d354188c498cdf2d49a364076908ccc4550021e45816e8e2e00d61ea30ac0cb8134b37faacf7d82f375a0212ac3733b54316138bea4dc1bbdd6eecc8b62ccbb22ccbb26c0082a4a5edb06c58f30bef4d06126277a40b670a4fd8138c85d6eb9127bfd320c652a30ea8988e341649250cdcb66dcbb66ddbb66ddbb66dab7506c70d6fdd8dd560330484492f0028906b7ceca86159966559966559f5637675367d966559d6d825b9ae60da8825e9a2adc51a104ad694e18a37f0c53ccb86d5907b76832b6ebcb2bc89ee90d347b0b0b7ae67bde72cbb26e1dd6eb73b21978fd200481df351fadb857be0155ae076b7e2062cc6cd0a341c315c3ab045b44b0509ebee3c5d3bfb9daf606b56bfeb00a60d401b52cc8c6fdb2542d2be6d1d4e9da86c3cc5c9a54d163336c68e3441116fe03fcf9e6553341c4c2c38a6e0a2b66236d73dcbb253d8748eacd830f6e477675439b2b66ddb3626d3c4c17177ad83c979f9b60dfbb6cd6f5896655996655996650380958683e3ee96609d6159966559984db1e6ebcdb3decb4e3dcfbab32cbbaa10c0d613f8c91d988920f02e8cc80b1e988ab876a9bd1292b5e2c953471b1e4b5e90f520b214e2430b18b2471be683c78feeaa2e1f1173e796ec86383b27d6d5d4dd05204dc9b23842570846c5449a15778ead9df0c655656d859316565232373457d07858cd7d4561b1244a8ce0efb29bdfed763b4f83fe6e073645cdef76eebbddae98a30de3a51d805330115bdfc1a76021d2bcd004863448c0d34a1434d69ec6faa99daf03d258eb217ba52a597d6d5125cc9499e3d1040994ac315c722ad8a47d01a135d5458a18339f890bc534e98209b3231e380d63d9ebf57abd1e0c82eead3db6d7f676bd1d5c0bc7c2ad701a8ef8e96bfc1024e35cb223a859afc849a3544d6da6d1a6074437d1a47a2caa4091e8f7faebcaaeeddaa6b1696b9af6b422d00e58f55d3cae23a8394fb1404694894b5dd1630c84d224203209ea5456aac9649ab4c44cea25900376f1077dc454e6c9cfb0e9f399e8b3a64b8f7a958949491afc7e6210f491dc0c7cea124f950c07bfdc2a2797893e5ee0a23b7170eab1e7084765a093260d0181863de906a4cfd40955243a4eef53fd849374a16a720755932d544db249a89a4ca15b4d36e0480a565dcdd94de5bd87b569af7b5dd7757561f0a1e9f78af47b250aee5cd7757730dc0281acfb4a24fe4ee5762af7c1421bacf5690511da11d4ac9d1c7766aa561ad5f2001a3db61fe4a1462f5d838c20a449d975de60d5770a976300a791887abd5e0f6e4031f8bbf76b8fed655d8416e1b3229c9a330c1e86356bd743f7ddf37bddebeabaa93e721f12567dbb9ad5b50a3975f0fa2958883367d2a5538302c61a2e1e12b0105196fc2e46b178c1315a6bad596f59b66559b76533a4493f5a5fc9128a808eb3eb380f6920422c829ab59bd667e7a956f40514704ed35a6badb576801bc3fa88078d5e77964daf93962605d1ac2cdad1916dcf764040da9dd9c39f87653b97cabaa4c4c599a2779ee0e448c970ce440a68393c68ce3967f7e14cec59c1eb45790f35e0acf61bfe9db3de0b85058af1ea3c71fb0dffce520f9d9d32d7856120d09d482c16617da464650776d232c1c1be26ba58d450503a13875ebe1fd9eee14cf499fbf13ce77892a8787a98b4b13e163d3e63393a743e3f62d975330c671e9eb51fa0301f3140c025c0ef110194009606eba3a1211282be1e7ef8617569782248c8f9958f92424100b830d089458df370265a00139cd0010c0381ee7a68c684210e5cd742748882ce33e5e0a1e766a2f08c4bc13b6437c34038137f4eb890c3007c0fa7493a67c2e106dad5b0066ad7445dd440581f01810d2b403dfc3e0fa7493a7015889e72ce3913279421b2e094a6a9a7fae78585a20dae0bc340a03b71c3c50d7f1ec2286afaf6e110b0514fe7997248af181559202aaa30147a1185a2a1a2a2a2094545c1a2a29fa2b6c8a787a7e8e783778a74de5e91bb2b62d7a222384dca5ef4a69fbe70ca6147ab4213de8514753c6dc1382e4720c880b49ec3274c9cf0d80e940e2854f1d0c3026a076d03d01571c98791d2150b4c668886498a7ce886495543be161374de0479b404f9bc49e889020e6d010da57c8e56f45808c33384d5b3c0c67362736673f63565f33afc917275d076404b5cc70c3b016efd51e60cad549f889c73ce41a12009abeac346228e44da88e8f143508b82b66b9a24a4fed0c5c92a4f9a601a3875e2a743b644b2e7b61be09cd5f4c9b785ad8ff366a60e5df643c8cf4462ea47241c3e8f675dfad180a367fa9da6ece77cce0b21407f76a10164111e6ebffd229350fe0a7955d35667ee43c80f6604f343c89fdde71d804e1a060cdbf3803aabe9ba7efe74b8553096863d3f84fca903539e04ade998c47e88c8700a4ebf56c0fe072974481d4ab5d00ad8ff80f83d6ff4453f24fa2151050b4226f688c9c2f330e4e0e0b8bb1603bbae2b069d5535f5e9a45f7f064e5d8d527e0859e7d321529a24a4a649a9e3fcd1bb69ab93665f149c3a2f1d9a1014220a92506108ef08dddd51b0a0a645455fe1f37027e0759e6952ea597dd5784744e02f78af4c34e024f07627d0b08006ef151e83b7fb2931e590eed8345d739aa669aa0a75760d542dde0a42703f6bbdeabca32d78af9fae60f721b82f3400fda9a7df4b935402e87c3a4c9996f0fb803416b1c3e60aac319b612f78bb7ac212deabc780b3eba7ac44de488576c0bbf7e99a8faf87454d78bb6beee95ddd9be3e7212c066f976d75dbb66d4e853abb069f3f6b8df152a29d86b8525515849bbad3b29c6655d5a990d6d981fa49fd01773c1e4120bdea02c84e29d831ee5555856ea25777703ed2af2dcb0711f5dbc3abcf9cc2d969bb3dd9299379d5d3347502ac9fbaa9abcecb6a4eb54ed69fbfd828ad17342f2b69dc4e30e7e0750a07c58e6d06fc2ecdc4a1d1f1244b1bb12f234d286225945a7859b07bdcb941e6688177492c3c20b0fb64bfe01d9427840796239713ed1909c153924273aec0bd23cf2dd95ac1384b160d76b55a1a30dbdc4181719cbc143970f03ac56bc2ac560e91b629a45d71a35dc2f3e1727173b45fad989d1a1b6dd1ecbe7867ed16db65f782cc140d26bc35f837640bec3edb27bc83ee7c20e179e9f1c049837e487db7fb142cc40d5d22aab638bf817ad5adbb735d015ca199c3d98a3bb6492697ee9538ad1c2f714d1cb438674e142c0366cbc0eb148e17cc5bb66330abe506f7a02c579aa8581a381c37f07b746bc0bce56e06bcf3e9d799e82e0ae3686d81833efd52e3a402bf4ce070e4d4c8f1cc60f698e306bb48d60abc4bb24de09d928705b7cb9c30308e561b8ce3c45902c39f7ead814e59137502bb47164e0e996305ef92386c67b4784560f7c96a8177d09c1e304e340abbc9c1b94a609cdf2914678d4d12bae2401b5001b010567e17a3cef78be96caa51964daddc45eb496c169dda99c6c2a565b8828dd0deb4379aba30d0592dd03689bb03536a31ddb634b7349c2a3d3964d2dad2da7857de7a62afb2d55adf324c1d32de0e9717b95491f098271b5d7d67cfdf1b94478a330dda33e63365fd410304556a318169e49272bf5da58433702d12eeb7ab0cda426c169d504f212c4d285113c9d9f40cc639d3a09ebc096a9a5062f139c4844299968779dbbd0aa3503757395412958bfe769515c4683d7944bd0c57b076a3357dec21b56b7fd37816d8964dad22334c2751d3684913bae623d57bcb1e66508ba889e47cfd7ced3c622fc3156c1406a753401c3ff59e323bedb7ed552db757fd6dcb4efb4d7bd5557fd3de68764a5f1d2a59a57e72d9e50b5774c14b89760bf7da79eb1258f5755d57e0042eb8fded9faa81b79af6ac328d4dba6992500474ccba8ed9210d4488537d945bb89cf395871a309b7c557d13a5b5d63ae79c8112de5d35cbb22dcbb62cbbaeebaaaaaaaa9fd4f448e3689f561d8ba77eba02dd6502144af8547dadb5ce39e7246ecedecb5955553547f152a2bdb3fc9ca6411e6ac0adab9e1dc0c6ad1a076521d6d9380e5ad787d324364de2e006de39ca67cae1e7b3e728530ebccf9e73959d76603efb8e32e590a671eb1f726e27a0aa3b4bab9dacd39c8729f0d377554f63367bd9efde6b1556d1b4fdee3d3cc2aaea1dbcccc4cb2907bc3509bc9375d669d2ab5f02a80318aa6992f6d55756b35aab2f0178decd443dd4aaeae6ea35abebaaa67aeb359c72507d5d5d4de28ab7c326b556573d421af5f09a874336b9aa6a9d1210552802acb76fbcc690310b5c85421158d71848e215adcada325e856b0c2471fa0e20bb97ee192d7d827813a5afdd1aa573d3168b005437953e63c422a85c47626b98f1841c4643e0bdf27af0921eebac1078d403867dc6a22ff7ea3004fd3b3da5216022a01f827e2103e4573dbf6ae54ccce3d7f3253d614a5a3d48602ea05e4f1209236067502fc8e560462c267060851baca070d32a8b3a20ca7815ea6889532649b8b08857a1509a98a77bac306d23030a8d5761d044cc6359372c5a6ef12ae449897943bd543fd14025c1a54c9b5804b58e8e274a945884972d5e8769dee0fa2a74c7c0ebf15921538a28ce7825807e9ef752fd24a47a06cb4236634dc24cce4d48bd50225651ac1ddfba0a3d4f42d4e30ac23bcb9feaa715563bac421ab42082b800738c87594db5ba5405ec18f38a7a124818f5dc09f71c8173dcf0544f895a1076cfab5a6badaa7a755615b2ac5015b240fd23329889fcd4b7e7ad9d7b7c76f513513eca9eb31b9180fdf3d0cd4435af3a7280ae0417af6971eab07eea39b5cee46ef0aa6ff8f3d7ab47e991dacbc42c44d1130a65efb91aeb0885b2bfbec65a28948703d0ef389edfd54f44e2d71322f157adf55047e87a00abef729c15babe7e407cd7b31686a0df0012cabc6cbdebea074409655e86bceb2265628ed07d9efb2e71cb77eefac89acf45a23e521d47089526a9ee5c60ffed12d323d55de2b3c37548e47dfa648c057113797967e4c818f8532855a04483b8e0edafbebdea4ee421ebac737677c3da37d06587eb30859245c56fd720786a9a6637b3cf699f55a803729cea231032514de5d4344d7df50f5aa83269c1d933f42873815070ee4c83be5b848a12b332ed5737eac2b00b7461778144d8d57a46a15c66ea7c37faaebbabcc7797eebaaa50efbefb1b8eefbe5aafba3a22edf02ad325d5d3d7ea55df6a894f533458217260c9525596234e63b810e164c5159522b1baec81b65655e6c493144554340bc60d272fd21f41cc34b172e343199bc18212b704e3034abcd53431690e93e62e29984f3d4da3508015318324da166fff1e1d998be7110dd588382d3ec0459421534a365130e202e8a7a2d75a17241b0cbaa9380da19ea874275b6ca379986256290867040008000318003028180c85591625415072fc1480165aae5a5e589749e47918c330630c00061803000000001802223445350177dcf17c5bd743951ad4b1bdff03051a70ccb0a6308c2d9027f822fb8f7cba32d409d5e4767d4a7dcfe0593c62fd4e903f5514c334ca63a67095d62333a5b1dece423db8274569142c81be022c432ad914ab934fb8264c4481e0c357530bd5f7ea03e64bcdfb97f1339089ff5b4cca43d622985e288dd1d2baeec65b03bc4ccd336f488123d7c1f3245f2ac4e01856003580fa16f27f0309ba1bfa127f73f8bf3503f8b81877069a0b2a1607d93f9731eeff24fba0a8e077a69a92cf54f4ca7cec117839b525330b457909973625d21b145585994c51bbaf496e4948a4527ecb52286ff6c50d172735c4890e32dacd468bc91bc6f53b86708120c963efc48fa0d72ececd0392376e9bfa9f1fceb3fc4aea3f53711671caa89d6ef86bca12776ed48cb43f6539e62e8fbe6f8c4ae19ecc408ec50a5217a35ad941c58f4d8c3e34378f5843e51789b414da345e67619526ab3f1a35577232d37e31f9019739aed261ca68e22ae72c079f556e3d8844e90b715d99b825914de5a4012d774d7e85f05efe16d7a5a09528b047a4c12d5b4c2b0d0265687a9029ebbe2b748415f60c2ec09a07eb341dee168175fd14d715a8c5d6263e7772aaad39875a4d58de7f20bb8cff99adfa939885f5c83ea23ef372dc639dd2b6e46f3428cfb2fef79134adab3d6d2c198fd32cbc54bd3870170f85eb5b252dceecd09819f42c159c6d58669db1d15925ee20622f04b204e5939dfe832455ea8c820dfff4a8c4259bd59a239ed8b49dd7dc84acd4a98b12b635342d71e445b7f4d7c19664ce63eb4c25712feace4d8eb5be0c147229badb11a12a7151f0318978607db308d70adc409e8f2adbdb2c6e2f48689fc77b1dee80a58f1be997ad30969161fa588a9890ee84e46ae1b8928ed67da8ad55ca356b2df35671e6581069f2107aa7aa9a49ecf233b1e1291bd1d0a52b91a38bdd3c08aee2ed6ce3dcaa45fc9385b877497e689ac95b4d145217f4888d41a9c617995b1a3ace0952ea9702c6160d25be345742bf48c422e7622e2fc09db595ba88b900979db93666b6f57f98a9c73a36d459ee15409431540630c8c6f908639ac7ac872667918b09aa3fb7c58c8f0ca429c64250a516a93e05dc62101a930d477d9d725a18f03e23390fc61a8c04f78d92ff3952ff9dbea9771d0e89644edb582195a11d397e132a44103556d0b33065edcbe121733994cfc9b18a02b6429d0ac409a167d9c283bd5669ac0f2d051d7c3dfe2c31ebd3d7d616380834bdb95c0266a8ae9fe6946cd7d34f09d2a122ca594402674d3f7522705a4657747dfb8f611bd4ad48397056165ca80337aee88c6f339172c71ebc6ca575e02df707dd8d4f1c4c035a8029a69aee16b1c7ed9351c622ccea69de4c104f8f635fffb6d6dd08111b4340d846ac6a844faaf1d6e48720098079718863752afa9cde96b90e0b2bf122e5b1724b95c1fca32e665339858522bcbc51e0564441412444447b9e29b972c7f7617952188a5e61d519d3aee6d0fc37dc2ccfd063071353faa85b613890a5db57018ecdc47463ab7fff6de20436911d85f8f8f18e1c290d9857bf890193219980c653a23188851e74e516a0a652a2496b256e2a9cb6bc0b32924c6ad18c78a0a1b91993584ca07d2b7a63ec5725e3a52a7c6f48ed3a4ec3d527e8df30811b583efbae85c4e116cff51d36f8c8126407613a06bffb4ab271236ce0ad3440c93c7afba8a65834704bf2c33a9c407d5e624739332e3ead2c1890312f691805a748febd9edcb39e88eced610202484f4e6c2b80f4ff77649f7d0526a5fbc65d8dc4ccdad7c708d9f5d6094b290f97d6451c4ceabe1fa6e8945baab22ea6383fcdd88e9b81c5a40a59da89d2b5ddd3a0e48668a77be93bff31a2c6912b82c5fd24aead749d183ca348bc4bf7b833edc8f9372881eacaadcda5b56b3ebbf199ecb04185b605462f092bb065b5f42c0a7b3f80dfdafec377d66f6d720cc0224c01f4f7873403b408401b41028d749b61fd7d60f06124329f77d521d8046cc6acaa698289386699298afb82547417d6a0aa2f0cbd28900dd73da97438136078c8fa65df8515ec1ca5ef06108eaab8a92c8857f80395ffdd71a1f34db6b163dfbfcfa21d7e9f7ae8618aeefae6d5833f728a6a63a1fe381dfadaf9902f819d8d6a1fbf49e11c9faea8a6597242bf7a920997ecd97470cd19e12d3a11aca7179056e2d1b5005b339653e13774cad65a083548f2da36c02e352c53a9ecb77917946d1ce8a0278596fd576079510de65efc9f37d2e7c2375a9e42527a45d5bf49d3eb79b9b34373e9f693c5aac7f2e72cc2de4e5f4d7bc123f29634d3b505c5594407481c880acfee7cfcd4e5926ada233da797030873f18d6bb02516a34b96a73be8e9267045084a096121b4d6e67e4ab0d1ff0138c92ec33851e36e3a4baee473bfb98ed3c5c34ad474b0dad543546a7fd119a921054fd0818425dd62e216c478479949aabf09d0229f00ced55bfa4fddda5b6cf1943f33010c30cc658a726e1eb15ad1fcdaec59fb932c5b3b2d1c5c350d03e09d7442e36fc88f1a59faceba0fcc0a916f48ca4cff97a317177a71d493d3e3a4d7627a327a5ab7999b90f53aa6d731bd1c5d8c9ed66de676b9c1582f667a4dd693d15bf4a840bd54e1d0ce423ffcfef3bd0e81cc92f10fadff3f98c86af1ba7f9438dc596d9d881f853988963847539011502b4c7298ba2286913e8e40682bda2ab4cf4252f5ed8931843dd71bcfae3c260e934692f343520251d94eb7bca0ddc7133cd72f6e6417209f45d7787e030c98bc5f2852af834a634b43e02e83a21d69e2ce467f8f0becd5a1ac302b87e4dbfb8a3cdefba1629980b5f6e744aab68ae6a6b751ea2bdb91a06584528ff2a4172ec2aa4b34d5d226d8f67ebd6f4bf5aa86c0c016ef435d431130df076622dc3c267482fbb1f76cbdbd8c15ef0bffcd7b327d7e41fee7ba62f4fff1ee4ff9589a1ddb7cf56138fbf422654fc09b7aab7e95f6fad34099f3014c73c1ceef5090e78f990d1cc7e5cde4e652b36105c60356b3b8ff09e804e6599bc1855bced6839b830653448c39d4a88e36defde487a837833f973e6133e9d3f8c709b72050a4e32c91bcff7ed4fbbfbc5dd8e91502d55186a6ef6d04619160e9b2092ed81bdccf91cbe376c030284ad22cf2adbfa671c88a4eb1bcac379edf4b0cf93b6a824268b94f21e82cfe768bae2a629ab00d7fe7ebd13382be0a1908f6148cacf6a0eb85f42a0574769b91308fbd084e15ed33106ed59eaf875d4fb0633ef3f046c09e88b3c2f58479d7d6662e29a64096f92d0d49dc4770b0be83ab0f4781c78d3391fa54a5149fd6639836f302b433117158e0076ef8b3e1246051db7bdb0238d39b29032b62dbd2e45885bc389a11e151f1b4b18d13d8cebbe061e610176b20b6f91051b7bec15072991db9801f2dfb9699b2b0c608f0f7ae8bc7891d5ccc88d7e85688edc9a6b348042054e9b6f6a45ea51ef772ab071f8e420438fdca9afbf16811ac6fc4be1f3216ddd79078fbc52a362808630ab1515c1bf6b3c3f6e69b8d04a88f30981e43613bf0e7062079eef9a17ac9ff2eccc41080a20c448ff15e055127cb47c6e34e6192acdec2221aa04f930142cdbafc91bd7fe2266ad8b005cd92b9fed089de0d44df92fd9f349affccd1f2f3d3b6315c6910928451a3fd45eef68ace41044e4d5b2e58ee144511a2653eb3094acfdad2a4a63692661e918f5e770d0bddb47003c2db445e4574b12ed763164061b75592ff9dc3a4a71eaef149eb7cc81f56823bd5a18c0c207571f0875478b5fa8810a4238ea2958880b40192f4dfdcff7b5458bfcc620c79ab823dd2bcce6e027d6b67f357ef1ed9892aa5591002939696d595c891b2f01dab3115b92ec63d9c3100057c2a497557a29e2971890283406ccb41e52f71e375d53840e5d2904798bfe69a6043be473c94cbfc4021acdcbc49bf652f60c8e53893ddeca9da77082485f7387ffa464373d3682b56451697b1c1f0f6d9152d5973b834a27673ac4599254ed1b67685347e90bff1a1db1bddee69406eaa021306ae8388fc8c6fc5c0d444564ca0b45566c4b961dc690aa23a47403dd4c8e43f5241a624560d87406b27deb44d3697da14d33ba4b46d066ccf1cb53640488d238623c081b481c8ec246ab57d4c580ca17871501d82402890c3c113d885e188b3a87a500d34364fa4635b8a0ec900999e0e844c97a57bf86fad132b55b71082451366fc20711132ac24cbd7465cbbbb4727213a520fdaa75b2adf0258242e2cab1414992892d8ea8251195542ebb1d4fb038c44f9068f6512eddc1df88b6572e86d61c400a0ecabfe65f624127bb8b0b210006373d6b3225a5c80871ebfa4bc93481b04dc42c627cd724ad69a48fd6f744d494a53a9fc8dbe294849e304bf1dce212b9aa5f657f4a62145f3d4fe88ceb4a44d034ffc629c53ac3543c5dfe94d899466a9fd011d9ab68e1e1e57c21ac79cf476b5b802ab2a9410e46645158bfb1d2c75f5100d101e33475e78c7d3cd118eb1da24f77fe63f2dd69be1f2effcf73416c4253e46e299547c60a6c2e4ed579899ca8a7fbeb4836deb4c533c2675db96effb035bb01f7403c2486ae8dabe3d29d8e3f7794c62146434df6b7437ee77380197d2bd80dae3c192b5f39ff2ca6ddd9836ed03dfd20357384012dc9df5f74df9f6305ed7bad6038023210b5b9f6e712b12402596e30ded09fb872321df858e85f5fbd3f64531c1bac018a302cde70dc5a2034677b024e951e8f673215f705b672a2146f8dba0e490657f72617356389ec33a04eb22b3224b2208dab3bef06ea0ac025f15ecc6fde943a59d8ade6eae3d48a5109720abb9558f0b5b7c6400901e5459e0f41c30d996e05dbf7588b5eda277732d2e365cc18b833c866192da5e73eb0bc193548ff3b87dc4ee0f4f0b14f4010dbdbd1ad8a2fb1c4ae27aa70d2fc8868802b42bbe508dd800a5f90428188dc215d93b704f0302761328207900be35d47f4f194a0d0c42c236585d290636f922e002bd74278660ebe34f2d88a2ef836c7232981d839280033ff0ca6101269e29a0823c0a88ae2a41d9a12b9b0b092cd5f7831afb61eeecf83dc2a2c698400f7f8311a6361d64051155fc014e3dfa6606c2a3882a79c9901b77570a88545c0aa31bc9fa72ee3aff963ba8d4c505d077bd7e67e9b2830ed2fa3b45b706a678192d7e1811c4e923b4ef6992f48b2d33936c081cd3fb5a11543681dd22d45e92fa88f187b61653328ff938f3104e6f999709d9979cc2061aded002086ec38776aabab7df09022864222f09e734da21d387893d6e3c5960edc4405007a22a8e03634584d06cf8d66d219b91a595d40557f26fad2aa6ab6a2653d3c535acc3d86921481316025713b9d793602b0437ba0fd1fad7b9631a46535c182afb7f6932b2850385ee17210bf545d55bba7f0b1d0b4ed75a30f47e28efd29d428d8894eb5f3b499db20f2afe8a2a2259599dc4a79d721ac2891ba68cb4b78477e3970fcfcbe7e072c04b55c18e811162a0cbc10b94824e68b81c3c74afb99d194f559890a5273230cc54a1d86d2693951fe741f6376b7e72a1dd4ccb7055701f072ca1749a2d4474bfd316c2be8ee5c9de48d3a9f2e4b7c9d366f0c0a92b297860cc2179015a1a029946032f2a588d12236079248972106b953d9a556e7aee9d2711b445fecf26e41c225b4e0e936b890facc9666170d04d7666f3214c0b8b32280d6599539251e7dff2546126774d12623795411d820265b407c095a5e7670238aec60e2615b1117635655d8532288d32501ee5a20c4aa30c9447b92883d22803655d0ef49b275ae55c83ff495111a930115917a024f38e249c852635eb6594003e485c6bee8a9b482f71ad791e234d66289f3314c3fe20c3c66ca14049912ccb9602c0936b0d41d9b41634381aa78fa94ddc844676139bc4a33f0be0180e52df5d4ad62e345ce2a90a99c68e5823114d0b50fb19686b2bad9966ea247c03059abe176dd56c9e4280c6eea38ea0f5eda92bd50ecc5c285cff723e3376b66d6dd83468dd9055d0dc80a5323c88bbdd4f6cdf03246d140fcaba2e449b7dd4c55eacab7b8048bb38e009bb3800509b3416d1497b91782245764f94444d0926418dce0d01aad036e855cc6efbc928f12a7edd6b728f7411428d9a7de7d3a1434964005a4f7653f0c00d32704b4a109c7c44b8134e55732741970dbcf6b316ab54b209f7590d1304f6db34f7a102095135af174a2f9c2210cb41576748b881d2f41249820149cd2525f21fe99b0149e20449147bc2f83f1a6351789d4d4cf275e838ce353efa9c680922044a617420702ba443b48ae5189b78696d1e0f3edf86a851e81959a7891f63d2b2778c68cde55632b66ff8c6792e6ba96c0c01dd827ae56c40d32ecee6362aceb8226d03352a73d086c11840237b54b0a05ca88d34a32a7b091e19c7f4b6f46204cb1ccca803fb9b8bab26a9bd0b0193a8000c9215c3279204948abd832105810e65d820e3886c4a28c94610bff0a6c27dce41fcf1a7941454a19d545c42e4a8ede1049f5da1bc4f60d0e08af13bb9ca55c1ceaf10981d6195631809450c2ca322b9d1649431dde5c51f50b7113e2a1ac26009f1034ff086b0f0fcf9e3b50767578023381c70ba861fc7262f53c45f301bef2436060969cc8ff577348079cb3896501595cb19f1473eae97f0f67e8f0876640ef7a24944bc37f1b21537f3ef86964ab51ac2bc56aa30540670ca97bc7b13850e95ee431485d04c568ed3687ad938b5cbf74bf0d1361c51fab353d5e006632e94186ee1238a0f2a58f27c6563c0e276029551fee13e7e61d75a42f61dae5ed52474275940d9078049ee634e45333cb0fd9f1f3ba04ef54906f377acbf80f530b92e97804483de6f37da13a881b67440c3118235c0a478bacc1d9a476e063e43073511af04cf1101dd7fd37fd4e55045e2e828bee4a8c99674c90948c611eec87543d70548e8908468b9f2064e7ce8f01109b9b191c10ad365710fca43ede1f4faa5a22e1f55ec219bb81e8b7cfa8a234f8da3f5358debd7bcf77c3cc7c920c47ed6656f47e3a8bf1a27436e00294169fc6ed427c58bd69ca7dc7bf3a781418ca075cd7db33ad51c135f45a9106bf5b2f62e88947c410aaf9a028d49bb8c9b7415342c1799c57f788c3a463e97df0d89f29abd0918b4a092b73c3f5d88372bcf126068c0092144951b9b86469e38c79429b42501ec29b52b9f5ac55c730405ea972e14b25afd0cd6d1035795c426b5f83bed80f6db52fc11b1aa049ba3613991f9a7fa6cef227759c52cda5a38c95a0cb20cee766c3d6287d4f4fecbc5f92c89b625957a45d686cc42d2833694935cfc0b782b913cbed174f9ed9be4d9e532fc0531581fbe74e23db11aedf77642abaec68530192a0033f2b154b647d0786164ddcca4a77dd4c47c005e3613ccb0a398ba725e37f035e889d249e2e8f1f6a0f15d3af66e6a52530c7340210d7e0ecbd0e88742b47464e038c15d1e1c57ca5752afed88d3c218cd85875d5e58821c455071284eb472f801385a489edc2fa811a1844b500204f6f04a519cb6e507e4631a9cee7ad4ec56884bc42798b98a11e52c74ec3bb8b6a3348ebb6143f49613133cdfb6213bdd96102c25e8352c4eb6e06149a99c5df11d52509decbf6e05944ec5cbea5819d97b75dd462167057c3e900b376c347dee637ecc6a003e9c059b727006f8e61ae62083d48ed3adb154c170817e8dbc52ed1e66ad109b95c1cb5d3b653445191ce20b330d44ca05d259a5a79626db6720f1d40d5a71520f274095381819441c59fd359bd9949b90cf60cd7364a77d58dbb0120fd08c86788174e0702b1d6a9737d343a1ec8ffa4380051bc0c55abe90e48564f32e31f09a4d83f8b622b75b8f48b10c7c710aa023a4d5b87583b186c571c26e7abfdb1030a973d0e285e23e656bd3cbfdc08a627bce527940db9e70c7c08c58431c1b91e008bff1a451c974aec77fa2a19c29ddcf7530e8dbc121755eee11079e9b56c54281bec884ebeab6d651431d37056f9c44248626c07b26bb4b910431f3201374a9a03ca33167fbc1c0282b87b1b96954d408437daf18eab9ddd9d294801dfb815b92381d9aaf765fb998cf75447cf858efe7eaee4375a2b321bda91854e2bc35992573b186c0156f6c375787786c20f346c8cbf8998d2f57e810cd15b492ee6f2fc3f04a8e055eeea40287dbb43c220543253b95199b6b3cf061f94d24e8cfc21244a1605e0857d109efe9bd610dcd499c49200c7fbac96915ed9f5c8155dfc51e64d8f9c23e11ff16ee963f7f530ab309b7d4f6a5b9a825d86a3528ccafd21fdc72ff8aa2a90e402cddd41602505b60bdee89d7e4eaf52174c8ac0227ae8e16caca5d0b4818bc48c1e41fdedb7ca539c483d507cea0e5618bf2bd0d88211227cbe5f269c82575d9ab8b5c807c14811bbd3f7f252d1103e95583c2876271adf0735ca8c031edad056056d2e13635d9ff85a5ccdedcff8f67a00448ea95371cdd9702296431d8f0c660c1088e96a09e6e15767730ff184c1505ac6e391754792af0c10818c8a73cd419b66da285bbd265f8f55d945056ce2b32e2dfe726c9ba471a62637e12ce55317c183390c74d57deea7f94c9d14162c5d9ee6357750de9cd2864a8c3180eba461babd3751e9a7e6fec4226bd6197522a25bf4b6b9e45f8c9853abd8dd4d56e449f38ee12a45b48e15fc17da9bf77b832d8f30d8468c249f6e95984a99988c92de139271a202c3c53a2cc38a45bced1e7377489ff0844f647e096b2eaeec41c336b7ab4b50f9601fe11a43f4f6b4e7d7549c7886ab269b3493cd0fc44e1adc458117e02d7896157f69f23bda7442511a204790eb23b0a37cf06871f04f8891aacf0a3327239655a20950458d541ace8f1015ba15efa9d95172eddf3d576417d10b7de75889402193b311d720436b30bf73a243d824b5b0c2fac95d1048eb833b77f97dfca3ad4286a5a9a10bd0f6b867dccb87d2d0172da6aaf4fb8b7b4db97c5889d3fda8bdabefaba1ff765588def33a07952e89969bf8e4744c5c090feaa167be86c3f0528cc6d643d80cd4831ad0d1515e3d72bb8c42ffd05910788f32ebb206aca16c47ec73c27a6683bf65910427c20cca211975f2d9d0f6e45dbda9c74654b4cbc54d37693d44b6ef3f4b4c7a161a17ac0ba8bd33d136b483cc1a17169d337772ac41d9a435bc0bc02fa0544b4e3c1232a7fe7c7f21e56065592820aebb6b6461ec50856346533e3a0328a0721933ec52447ccf9ef85d4fc6ed719d058d9612fe87c67330fec30aac5a37d1dbb0bde4df5d44121db69030ac3ec9c89520964eaf4a746d69b225cbd6a719ca20c8aa84b905949b26a25f521e23b6f0f84aaecfe2a783971b4f858613c458629933a5fe66a2274ee742d4e715123533cadb83881cdc8ad6bc40ca72ac9e52787ebc9bc7909746001f80ad085e0c65e4daf2b76f207fea6a32c88b7d53ec8e0a99e42d1e84a630fbf5d7de5d9db198b4147bb569eef363872d0bb10aa6e82334293d83b6bde51f1c8e5d91382f28623ac5d7eb91dc484b4e9fd4956324f7f3d6bffe166188126b20b43d4f9806b312ef7f6a96555be4d8ff4495033306e3ce9082b9262acc4c131eb505ce6819704f564633a21a4d7d42a3569b6f0aa7ca0aced32e9d02e97630d987f47314611e3be2260749c8a9f8d8fb1b8155ac2993e928bf72b68cd18fac157cc4b31a2ef25b8b1afb2ba9daaa3f8a6b8b01112e2cd822827fde0ea27611b39ae7d9ddd2983a955bca7e88ebbf049bb8296c3188d9474eec33c9b1505265994e0e5bce6af02474f4cb8d2383b23d39fc87c74ea70ceabdb6d4c3d89c089856e093bf7706fc5fa5a1ce049409d1179866c155acfc12b12a1f41c6e99565a0ef8e709c664acceede5b06b214641103cc0044272620e6c5123f67fdf9e5608c26dafed1267a0a9d55023ea2f6d1c2fc35db80e4b1c8275949a2ac9226ef3c6d99bcfe9ae4df0d2cdb3c663e28a2e58fea753e1b4164556ea6f599a5e08b90b000b7f64a96defa1d78cefe28a18d6f23462d99bc413f5a4914c2bcad00329a3308d84b1c281220b608e57ea8e098d775feb60a3e221b15cf2866f40424b914715d9ddba87e205b0061411fcec3cf92d4dab2311b7638d0af2c49840c64a1da0bc332e7368f6cb0fcdec225cf7c7cf9b6c9c84580ac0a37eafd90c7163859eb6432102c527149799ac441681d27053f4c3a6a37bb16376720a5bdf862a91a79db2160d24c089aa751a76d30870a086a22c44a3a0c639184250aac11d0ef1c9bf6d34fc340419f7521f2a00a0416d88166ce1a86d40ac08d0b117e17b037e8f7de39bb47f6d0a527be6c67a4ec55ac7218725b0a3e874fc29d3c9fec0405ba2284469ab325da9cb1c9d8325e9399c0fcd2affd336638e081b580f7f8aba94e5a038391199d9ec9380df3c73b7f85f3e87a270ac5b39b60bd77c8597f5bd4c393e4826c9e0f5fe2fc07bb0c340147729e16ce4b9862de4454d1f6e811ae3010c41f97b866e4f5eb5f56af9e831802da89ecfb14d7e7437e1305ebfa9095f18a593fd9dc0c246b4a176cdfe452b9000734d7766f10ae766c41c3350a260248e8137a42bd85604c18f86c155fbfc0b5e1340b659663e30c040e978ba7c0101174449610f7cf527078005d0d5831ac22df4cc0ebc65357f15d132701476fb8771145d303fed3acc1a9e1f5f69c4add531fc37d5eea9aa7bc1730bb42b3570942abee35e995f603a81f80d3b92d541fca58d81d1d705b9022b2d0b16ce3f9b70f813a9724ce163ce6b2ae3cf217a2bfa78e755ab66feaa90bb0f2da802acf5d97ab78f3bb0d4ef5e2b72328cb4e948c82b483049a501edff4580ae5ec3a620b7c2a1b4ae8ec7086284928397bbd10c506d8535063fd619b0ec3407bd8b97c9ae0e7d41121457ba8bdfe240d050d687182b3d909c59264df630aa6a53d277c2087935cb97db49d23753c3807ae277f75be59d8f743a7f53a7ce56b0886ac656b082747ff038060411cc6cb57922124fde4e348b692db5ec136346b720c048bb309e4694e886336575382f3a02aaa2cfc3ba889f7e61920f98c0a205882a5659a081a1f743ca7a52a72e1a54b951b0e0f585190912506661f7850c7d60a317be921978e2465f63b8ab06d768ad0aa641960639aa873b112b7d439543b97b41acfb7d13f59f6f90d1645f0b3a1a68b2cce23e374403bfe1f33d1db705561d9a478c1800a41f9aa8ba3386670c3c01aa05560573a6d0c81d1c666a88c0f265c6830daacc930685548c48012db7b92816cfc7439a6a9822280998465778195738c29ad55b6c4fe05a8c9870e206d1739790dbc06b1dd4f1032a9224e295ced223710638a72572f78fa4f7e80a2f436a11b5b7d3b54fd0784fd77098e418e217f244a247634e0c1dda61df72be28c607c2a82b2f0fd2d4c414562f1d3475f089f993aefb0accc919bc6426a77b0ed7c3a01da5aafdb8bc3b0489848eef561572af6cddb232204ceae747c8a7853af688f1b8d0f6fef12623cd82697b442e242982e10cc22add3e55963677dd602589849203b817b9ccffe5440aef1b270552c7cfd2722a7896687cf21325dcd5f43b0e54f1f801d3ae24830224227ae94e2fe1885fa79781bf5799cdeecaf05a53db5022fbb5a6649f24049b0f6fe868bd3a75e7aef1bc721b76e8d5e39dc376481574e2e858b901c729269f829ad16834e02dd084eeee493490216b079373d3d426814a84d57382633231b51e29c7100faca480585ff329b7462a2eb96fce3212e19a478edd276094dac166cfc3ef98cf43dc753234e351b1ee243cae74163085c1271c88f3767d192c6e76604b3578541fd13331aed8c838cc51556df3e61e657754f37f508f1ee95b3d9bdbe205032d82a2bd075278f97ec53cbacdf4abab8049ed3c127324144cc2b1c1eb3cbea1513d7094bcfa4f9ece013d1bc4d4146c326d345c42818f5591fc328e8ded33b88be68f5f225165617f454f91ec0a492bba4610f61cbbd3748a21463484e75a352d9270daf706b43ad225ed68b4d4f7aa5cdad083490e095451a224985cd5b9c063350ef89c3ee0d45ef7301e091033e65452842c101b9cfa8c29d9bb33d63b58f6c408d46cc9ee62bbf635bba2c2caa27be976b38ce9afa1e4d8a627db7cfb3847c16d786f212a8420a2144745eeac357d244abb65d32169da1c78205cd24be470f768f84d1b3a73349ccb5352b903757eadd6784a3a2d2513274882fd744a258d24213040aeb280b63bf13f0c07febba78423e3bfc805d70d6b583a9b23a64670422becbf9d3530ad0501e65d06e94ccac80394e64d9cf8ae88fb06fd236a93d7dfe868f20238b8b1cd89ad62240bf8cd69c322b8777414eeb1bd78406c3b8680933ab19dc1f89d23b376e39f85a92d3880b07457b14e595ec02ce7d909e6565b44bca67b1e925c618347402227ddf76812db54fcacc8a22996d44d92eeae9c61bf8a2593e59eaf21d7ac1c00ee10a290d7cf1648ccff59a51c58c9bde5456ddfb40a9f60342006e3905ec833160fc6ecdf89a83e3a7231ee7c1acba0d2d12e97ecaf437f31786431698d54325cf8b2372f81a362e1dc2c2c9a84168104ceb3db07159e893283e5ebb9a9069b6538a1504d935406d7e2479d7be764943fa2409ec205de93e95057704b4372cdb9c2d6ca0dbe64156a7931990b8c6ef30ef55b44d0c3f3ed9efa4ed91ce3b4ba6756a9790908e35f6edd1de4e63adbc717f8bc4ded451dbb979983f80a4e59a2ff1498efcf1fc17d78d481f1b334816cc5ab521fa86d3a06241c6758f9d13f9a2f34c00bba8a399a60bca38f04ebb762e4c61398bf68c38a63e804690c9fa99e29de1a3c9745b1bccdf4b2e0e783c5ccd7f890905ebc639fedc119a13e2afc3d3d51aefd0d0aab93ad2397f7d442172be0306c90e2e313298abf9f9b1a4fa6aa748bd2f9e3c95c2446f3a6ab32b9f593b0d19e7b8b743aecd1b8caa6c5f971ebccdd18832f4d0f81ec6e3b694cc7afe4267c3d6af2d0fbbecabb8f3503cb04b1359eb74792d8d2569cfca63d471d65806e32297fd27e31a63c02ade72b9dbc6388a0ca7625048168398b186e4fb1c779da27d8c1973a531284572df56b9f8c2ece8f9f4e23a6401d5b664a4c61fdc64cdca96e2815dc87ec5a8808005a7560c6560477d6aa61391707da8aa6c6781b3e9afe8ccb9dfc18090eb7a8c41cadbbc4ff7117e8b6e2a7174f0fcf486c223d32c2361181fe1b642b0b2b7a10cad1233ae1019b0375f49677689125a5735c574446e75bfae7047e56b275ed15db9be11a4f8f2952d4f514d12fdd918b719a697f6156496340d7c97078e8f388f9cfd17c36954f2ca529eff5ffbb4d90ee0d9b794f54702c9fad097c9a6bd6f0dba435a4181c177f733ff3debb7614a81ae1c8279daa58c1e3b1d42eed4b2705fa9858e30253bcab0b8d84242ca22e67ae51e445260aacf5738f89a5a35da961d16d7f652961465a793097234531fabbac357485bfb1037fc61fa5ec78209012096eff061b4880223def9b896d160af185f891b683184b78ce77432c84fd778cb711091ef81528f1495a30815e969f07b78c50892afdf2de5321a388ccb9d9f21b271b3c57e64e746be5695fdf41c8a6631732d4096324a120dc87951f430ffe5eda6ce48a151e2b93d0f83bb5d447294ce12439d191413b7d93434a90a102ff070e01119f41664bd6ad748f3d6736c7ea05b9100d5e4babfac36d1b4f847c62f3da47fa9a71581a890233924bc7432862e7e67265be6c18ae3589fe406756702159319f05c30f85e8f3b8ee75761f96c440142bda0c4a2938aab294469fb9ad8e4cef76bccf02fdea3c51f22faf128caf300290e504754445733be80aec875f5d5cc4bfc2043fa2964400cf294c1b148320dfc1e8f7a741274feaaca78ccd481c6a00022ef4430a11a42cf97af62ea05171ff8adffba679a91c7565ef01e92542a0db0d9d496a61743718e33c8d65345ca0d371c4b70bc302945a78805a08fd75e93f59bede1c95f5be0b1b1349ecbe23b14d3f6288d140b16418e71bd39729ebc82fb9ebdb83b494b5c8bfbfb7088a9425c5a070a3378a67865f7a2ef2eb07eebd257c234cb9ec2c5ece3b970f0cf4c806bb0b7da27dd4b9f9e686a86ab5572446f9fd69047657840bfc5eec0af03c58927df568f863fbef7a6eeee3cb788bf3906cfe4486c4d038c6c1e15747a3c0bcbbab7c2a292bdbfbc4b950db8fb867d71fd611763741586beb7b3c1968d20d5b68eab919bdb73ea5cfcc80e03942033ac093179e370c6d58810a4d92d2b9b0afef0e3650814e4dd093dbcc9e0f01d08fa4aaf65ba0791bfc63614bc6a0e2a60c43c84aae1453e30e7873db027404248a3da76b967cc27c4e9416a1b9f31395006a4e41bfd747f0d8eab36538383daa2125e3fdf33cc3bed766e7c67bdfea30e18fa44d8167c7ce395bc964d1bfd3aa114b0780d83a918c4d3ea2ef33abe4bae88be492c92994cce77c98963d4a9cfe7c9848bd62d88d48f5c59ecfb87886c9bbf114d849b316da6bff12d95ab872a76ef4a4fd2049663ec073fc95b09f71efa2d2cad5121edd631add3779813ab72978b14add0f80de03735beed8c50b05778d203319dd1fe730612f553d57290984a16ac1db12cc82e5c90d10bf00dad3f6013b66afa1c5078106bf4bd6430638542f30cb62199493368804e671d3ec95adc9d80aca10424933171c3054565b61e1674455ed1bfcf35ec1422e430502333a75cec4b73c662fb55d01da2e52e0d88600951cd310bc420a4fd844982a040c344b55b656ec7a8c5025928c7f4ddee5f0504f1af3457f4b833af8f22ae93e79af513e0421f1ba467feeeebed82d76ff3f9ba600ba7bf9d86078f6dc11690846f8ae840e7f03b369600ccc6a7f1430e70c6d7007b0d0796c802718f1556a2d605c71b89e2569207d8573a54b0cbfaaec60ef4cb721e0236422e1bbb6497d5dac28eba29acc9f07fa9969b9484316bc027a0136660cd6960a42ea49a533482ca7daa0e7fcb4a8b4cae21c169a33c7787482c4f24c343041e840dd63df9af1019de8233c1d2806a6e8a4198b42d26073e3b95cf8e66031784ab93e8168c24f4acd0be2adb37b152af9744ac9bc8bf32072ddf1ab63a08fad82e6e414901b6527048070ec7dcb80a83d0f230144ccce32a24233a9dad9068394c99f74f1b5896c32808898f3f57b25042c86ecdd214347bd808a2bf9dfc6ff11ff53f13b43a08ff1afa781f1c2f62dc6a0efd9bd01ebe92e910c6dcb6865e6871ef8bf23e34c0c0c8f39667dc54e0b4cac3c82311dd2cf7227c18e9f9bff5998599351dffde9d9188b83fd1a25fc32dba7658465a1532ad40551fc843c7085f08595844c6e0512107ff2cd702c29c7954097b45b7b327151460670a0fe1a838541f716ef762cb27f38156995bb030d6d97676312f1992a69e01c6785d268a2062f8c424013177d494c5ab8ee1c8679a1ce31e519b27b7d1f6956543f9d6abb66497193abb989b56aa775e53466daa1f71835e524aa3183e67599a26b18cf6fbf21a34f0a3c7087e787454d9f2ae3e3a2b29b4521dbc43a3c4982f74fb36d8bdb104e5189de740048f893451365e3d68f8958523e17b4ca105e568a017fa9389aa2bd915882b2ba8094082613c4a7df77108cc0864c74f0d141fdd24d2fafaac6247077ffda4b14c66bb31e0f146f7ba4ca7725f3403db7b5bed88e3bc02140bae5391b4cad8eac5bd2088a938b498eaa98aebac09cc8d722cc6b83015d57511b83ea0609da006ac86e7f10a51960172a4bd9413726c48063fa93ac9969b48430c313308e4454c3d8930dfe320617f44ad6a6ed62f1054d12953410a50c832e0fff3739b5bddcc4a4c366a52decd84b9e84495277a85e86fd71bd1d62d2c7b262f3f0ef031cbc853a2e4711d7ed0691f0cae477f8681b5ad04b739453cb2f8422a3b8b289d0118a91ea1e859368c3e9f0e42c8bc3bcdee2719eeaf29675d10ef5b083d052d7315052cf7415f8e0a0c1a25f25ae02aeaa801ba102785262190c79e3588e4126ee5024ce82d0f71212a653ee64371d5085490cf810e98595c984ccafef465b90bda1e263e201acb1372c9748e941cd5367aaac1c85246a4280f9897892529d82c48b695a9da753137d703033505132239a7da43bc5c80c99fbb1bbe61424f18040224386304a0fa1f9bff1ef3476abc9f7bb52e67301080ad1f7864ae58969aa0c61f5f83265c0fb77f53777c76fc54956d7b78c8838dcb12e1808438448b3c1dea9e5f3246c13fbc5d56efc612c1435c447db7cbac0b4aa63cd488a355db0d421970b79392472972df2ec0a654c7cb60cc499dd926ac701f5096eda78a4b6bb2a33a19a0b81ea7859a79ca71b390e2f72bd68e824470145a2440d180c9c6250f79125ddacc79b9c18ad199449c9bae23baf0938f69528d54a9764c54db6ae31b8c15f4596a6771c876191e47af9b3e99909a5d2370a53da280ac4a3e29014fed6f1aa4c3a384aef995fba773d517dfab329f4ea8e8a211cae2486ef430de79f33281b855083a014dbce81caa49e7fe6b133f90273b653ec59596dbb0184f2798287ef67b3ae4a7c93c0d49071df0e9ab9a6e53958414a4a7492cb294d53834e40d4088e9f64dd77da05fe93a68538270d5fbf4e852e402f69d261d82cce21604e14a03790044b3d1365637ce6164d8fc9959291434da0be8269bd718363ed6d9b6731760888aec9a055dda0323898765f26e58722945c34907f285777808032e2f25274b9c66f927afe9e86ce310b98f2ce2b6731cbda3938c815d38c72929939425950ced27f16e58a496922d78b128220415402eb30d33f764490df3d086cc04c2e357387062bca6b4945471ab0718d69ad76645abb3f0926105e7b26b601389ecd2b6a7550318dccf6b981aece8feabb165c86db1861331ef118c31821c3b5ba6d570aa8f8166f6e6d3b2415967c2d8bf310ece56c422843300a8a40d4f09612ba63d41a133951f3b9fc7bd72aacb3055bc374e2245959a57fedad0f0a19b487cae13974464f354a824922e51bb2619ac71ae55e009ff4ec739d173f4d8c1bea35a43c03f5f4cbd2bbbbd6be658e9d7f967d83f32c4729524f38d69e06524a4a7fa16f62dba99c5795f172b86e44af762920f5a129b79b279f71ae8b025f6a6258d774c0e7f0b2b72205f55dc7503d96559fbb1c122344a00e1e18fc7c2709854d064347c2d2cd543666ed378de78b0be89fce9b585ead6cb5ca1039504ee88d8a2fa510790b6b65b6d2d31cac0307f918cf9b7351390674004a0968ca9d507574ac02094a31b377a64b3411b0cc188e1f59a420639a8d88fc01342a81239d748851eebc3b10b1a2f9ce7aaacbe2c99df2919696b90bf8879a277180143c9d5ef58d2256d6f67c323d9cd4d512c43b5ca0052e7d1e9b681b85f87c143849ac1a2c4654b4788412c1639c0ed287a1ef3057c7b35845a606926e6412cdec5038d4de2a2147a9da2e91f045a0ee482e518b1a4625d28437ad84f8d14aeeed1eb51d6ff086a1efab35843f4843ce8e6cdcb9e5de33ec1648e7d29bc4687ead6a2a820cbdd6322dac17eebdae4f93828179676e8ea466594e1eca689fbaad4d756690b2446afee138f7f7d29f83c5053aebcaf12f95e57264c1c1e2a8ed32090d99a5c63293725fbe9a3f2d059b7f0ca9a625ea22768ee051397c68def06110cc014c4fd64e2bdd52a108fdfffb138150bf7f554bcea616fab79fb01df2714f5ac076139d9a0ff080b000149bb058f6b5c02b214ad380989ec1fc6d2d7b1c01cdd0efc65a24a2255a445113d4bc1387cb578d355b0c6650bb60ed84c3b49debf91380f4a92dd63fd99a000d300248953a355d2892cb497668220bede1affe787b8d3d4ecf9e9b09e421d7d0e5740119ad50f8750680cb85b4ad67dc82116ac5f7a9ed3d1a6e8e9795394bac582bca50939eaff43fb1e4352081b327984157712be71dd4ee51a5a6ed443471ec058ee94236606b6ff28e83f172d1cc29ed74eac52fd8deec7a7ea5cde9a2a84c380240508995c8ccaf95ae142d753d2848b8886da3bf18fbd7da7fc935b8d087b4c9edafd3de4bf48096c4e02863a50615a5db2525fdba1258d97aa43ca26a2cae12a14c1a69451e57867b4d2d47c3bca4c51973958e887ef19a3772c7ea735064d4aa0cf9346da21f1247bb0895c0115de0b911b5f80f553d75057a4cd25bda9424c2b7c71dfdb103d9c6b9e7cca33dd31a6266f008037a6c418517d22e88f48f6fd1c674205f79eeab54737cdcc32f9221e3244aa29fbf50c250de81e668ca4228e09a2f38ff959f143c69197f852ea7ee8f0ce6ba08d79475e4564ee3dcb77226b1777d0aae77d2ac6208baba59ff05a3333e49d95ff54c26ed6d9a96aca0445a1656a7f2c6c03a9bab65df0b97f1d28d26f1559d1847ce4e672c580271da4d695b7bb7771f4fc7140590fd9feeafc6e13485bc64521d76bcb9247af28da6688742161b71bc0373ecb5092959cab8f743e01216f3605b1378f180cb0dc2f6515b310064734382f2141aa24124cdeee28c5ae0c6fc98713a5ba194da466a326a375886dc06c785972cd7c15fb06d4f72a66d258a37e27bde5e2436905ef5ea5e848b83c05ebb4d107c8c4a3bd70b5e2fa21e9c2d83db1708340e6497e819a1bbb7e241170e08483cb8225064e33816f0302e9f728009b0ccbdf26bb741e741809872234bf82913d6c9b09e6220f88dd9d93eee82e6f5f7bd1736a17ec33784f4e2e08daabe56e4ec0c7dd277088f3d56abf4aefeec04526629b47bd5e6481b63fd46438deb01933ca0e62fc2f651254b62c0c9a4ad91d30500c84c4afd630ae47ce46c604e1f6b5294194d1ff7b96d0307e636d64577c80169868459ecf816099f26953d5d804235ae3c9f43e8bf066525a8d812632fc4c0f10e1b70f2cd63b542dd0e597a9056621f6c20b1c0d49fdd2d58957f427a8044c0c2f5397c1dfd5e60f5a8ed6453755a9397cc5d5fafbe4345309e76c7a1cca63b5b410904b0ff1bae83796367232e45bbe343b5e0c39675c62ddbcc4314a6401c23dd7eaa812ab37c28530cb54161ac35d961a5c0079f848ecebd977cafe7377f8e9f087f772260da84aed11f5f0a3bcfcfda243f11fe3a38023e81e34deb5eab53c64fb9f945fbe0ac3749083a0439c2ee24e24c6572651c8340af25060e20f0c6734f7e326c79ce8d474d7cd1529a561e60e39366854d06404facf1f6b775ca648fd622d88e11cefcbf6f08de744765a3cb7c15ef55f81021eca46175c18201c38dbb961011627051e2bb862cc7625b03b227e33e414889dcc1787c1259ed1918e3e6c12b256b21a362e6da1cc03ac3918296205dafdb1ff2d4849902e6d4b42309d0a3c0fffdedaeda3d6262621798b704a9e56f6b87371e3b7cdfb5fffb1a4fb64154ae76ae77bf665a975117f3160328564959b61e2da34968661d5bc146310e6659dceca2dd0334822dbcf3ec67b7cdefcb3692518683051b6dbb0ab0e7578b98677110ef114730cc1ceb8584adb2a0571d614a019863676eed845e498ca63b489458c0727459b2979824b440bfe8e07101e4ba51d1450a50405268dafb785b4b25728670126a61d550b5ce5279bde96d3cbe1e4fa0e8945f7da6e2abc22f7f9e8ec719f7b628121b60c0248516e0bde1498138b8c429f0110df643838d2c70afc375f21c8d9b845c037623a45562029197f4959d7be1c7bbe18ce814be36aa9fb9dc73db9a3b7e22ba4801ea5881c5380fd81eec921b650cc82cb8e44e5b8fc502f7ee52190267c680f00bd3939566d1a8f5d00e4bb5c1dc197e04ac719820ebd9c3ed92d0432a47c3721c8297a032dbac0a4754c673ff5b01851c99bf2c9c109f02da05be9c3713bba005f0f3351d4ef39cbc7657957990dc8b65832754a2ee0e180b86587edec39de02bbe1a4e54742191c2e097aff9b3694a42a7095af6b7210e36a00d1510f9525e94fdd2020a04fd5c8d07e7d98865f6e99524a395ae872145ade10f30903dae140d0840b6c761dd378ed3b5ddaa47429e8b6a602716e8189060246667c992dd04571b90e17cfdbb7bce9420d1ebb67129f91cf0bd7c23520a4e2987dad66185ee2f9eec6e36d0c9387c5fd312e1aa255eebe27aebb13715a58d75c5b3a0514619000dc4a84a08e6d5a6a80c2606bf2cee6fec5bd3762e38bf1275747d002d83a2dd09a1758d4363ce9f077d450a2040f504066e9ec47f40395c2ae6cfa1f42ec70cd5339b40e28241d9bf9668263b7bdcf795237a30199def28180c952a0247e6c33df6d84c7042cc3af33cb95845d6a48d761e92cefaaa14ddf70f0450da535943b54c9ba5e149ca8f4aab6a9933056afed8356a6c0057d21f258ec1f774c015746e6611e5715b676610e731e3d7e353d386e9edbd5cd76e014bd23528c0dbef0247e751d2f2d8c64e254fa0026f6b4b25030279bb67d19888e5a058855d50d1c93ad67eb08d62abfb1b7179fff214453a9d6425b4da704c4dd08ed428d85ce553615586e81599ba2073bdb02d00e958e55b066a785f1215f2326d84f739eb834bbebce831f69487772b749b500ca4f4b1ef955e58ccad4a084cc9234211811a1045f0b732cc8820238079f1c263e1b475466bc4c383c76bdc6dae3ab111e492a11ed24577382a712c67c3bef4ef99f765382b84da8bbb797ba4a506540e4f2a98e9e74a48a07bb89835a8fa5b9b2e93202d6509a96ed650533d57cb5daa8547385dde388659d3514db4af330ac9b2d88c24d69519e2e13397332ae4262fe2e83dd4dd6e4d3d0b178f0a19533a8012887d011239eba1b35db66424138cc7d120924f9a09e1cfa1886c9555dd0917be4ab892e13b474f3c759eb4b73543885466934591718597800b6b4a61d4cbe8a1b24558f135c18e32c2748f80968b3d4a64c36dcd35dff6dac4e7f4c5aaeaa8308043602c49e925091b0e6561618bb4209e5a049b939ce6acb2d0d1dff767f25e18ec6aca11cea37431e24459a3dbb1c85af414ee5998d77f57468025f45e66c11d4c6bee192c8a8b4955142b56740a084a271a22de41ac424084b159ddb50827d0107bce0736521153d818ace2e7c622c22718049fc0271cd8ccf0c080490b96aa855782ecc0ac07bb33960efcf6677c1dcfefaa3cde667a158145cec7d9464a494808062aa4dcb1bb59de23ad72a4f9c664e53291e9c2aa2516952734c39062d38ecd9783b4d26b3eb3846f2ab3ae29c02e953b52e94d3f5382be3ab232f675bc3be532a1bba5c6303af356d4b1d0c95015d04076738d55c231824643dd2e164ef0488c7b88d68ae8baeb558c1a95d9cb0d6126393f6a0f8730c05278d7f8f2a9d83452cbdd68acd6d20d00fc6e9952573e3ee9da0c2c07a4e8a87dbe460c30c9bb89d22f97d2b9cbd9b38861923861b9fe661825cbf14b5c8d8277ee98602e64191dca3b4a27ba593ad19ba513fd672ed3fccaa48c32cbbfccca5c066594f132cab4cc32b9f72df3d4a0751934601168dbc13c5fd1a14f4265c99f88f2311144c2fd7b3e169a886c620f47169063a103f24f23b31d4d86b3280ecc0df9401d8fd687425980b9862718c1dded008c9930d44c35e4ab4cc818e8bbfde839a6aade99d5702ecad589b5fa922d98c4b177db92aafab6af7f0589f2061fab751a9124da83d5ba11fdaea73bfdec9a878cc85920b67eb2a07c4c4be5bc57b87020d10d17e7df5c1add28301059c96039cddc8ac4a71e5bf286625b3cbcaaa44986912dccc27bcbce313202b307a8fb593d69fb75b1ec1922601599dacc83c0f5f82343fb6b732508d80fff819cb69e656bc565226dff164d7cbf156c7bf06404674dd20884133f21bc46be205c0eab98140daf835a184bc8a828ad794653fd46eaf52a4c1ce7d11fb26af4e71f8ebbfffebd3e4334529174ffc79e702874b3da41f2485adcec2f3f1d896722352a8bc037af540b73c4c82a11fb8a6df69ae2d8ae8cfdb607e4622257814203594267a2e4c9d92cab8c929c110aa8cef720fc752c32fff3c55258677959091c8c7d4c87298d423916ae1b5f97be0e786fb539e6a5e8645d39cec28bbf2ef8d9f813bdb95f578a2e11ef39dc9be87f57b5e8e850945f18e7d71d60d68d877837675e6891bcf4351aa79cb08b748eeadf73a31b8a246ee89e54254a90d6049f7ccca4c8c91a9df5d94944966efb9a5277abfb1567e28109ad5325d1836b6211c9bcd3ec1b8514ed1be34557730a12237bdb7b400e0069f47cccc6f15b1ad6342a7add388cc62cde53e11a39e9a7b25b54ae1b2896305370430328d4f8bf8017df13162065d507862a573f0dae063321c663ea7d54cf3b046fe2f08a0a41333f76e61d8d813e6dbf3101de91aa6cbf118253e7cb7ec515256c6a28a5f2e866af5a18d4c2144b6d851504e2b2d9f4d400f322c528799d8b4767bd0e3504107b892b608e458a477d6f738dfa5eb9893e2d3042738c6a73f284e3cfe4f8d4bd5f62f6b4fb5db66953d9148f857ddbb43ba6f403051e0d00d4a1ea140ce67b2eb4b330dcaad8c11a99fe4876d223b6c82139f0e2a29eee2c3a09ed3a17a5bfe9af52eef3ad617ddbd2d7e73ce0e013d74de47d1e42faf5ef23f221f4eb31f68cd0d848b59d47ca9f638fd6eff2fa12aa8fe2a2090c86f782dd0e7270281472db569d54138f00e24f091673e27d4b8957559c92eb11ab873a0766f5c9f323386de3334d954cc9089f685aa1afaf28fc3b6167917068d2d6928d4eae34285ed0b9474cd7b00124e77df1a14c403fc7ccb21b9a112084c0db73d41c9b018679d6968477a7af3a73ba1ddb51a87cc0a30f52fc152a9a08564c61d463e034847f0a0a0c51d3ea20185f28d0eeda6638d71d936dabdd20a42cfb88034cab0b2c146639ab9cfcc47c019904cf19fd120e9da2e941632922b046768a613abbb1e023974d48b27d17db8c58f0bdc40bbea13dcd017a6141c767e08b7a1a8ab045403d10c94167a96edca6892a9cf4b806e95b2a41af42d28fb2675da7b47f57b20829699f2168bea93172f63944659fb3373c74c091c7d1902409f835ccebbf4e320d3059bd5cb351d9dad000b3ac6258259fdc8ab7665d5dc4fe83d398dcf5cf938106871efb5368b7cca143ddd18d88be5d4cfca439ee7f0f9ecdc185e6a381f95fc7baa5d1464d99b3ca90f455049a8f201119f54df879806c1e43855d22275b6e54f448d485dc9414586c184f7124e3553cfcc1c29df1c51cd461676d98670ef7c79a0292aefe0467d4e20ac2a8b23bc5c27c4da0bef846338f6cde58828cbeb9de547bfb12fda37d29d7b9ed32f09f30d79d70c08b289f189e2ec9a5652098ec95c114822e281b0624f39e6989504c4d22bf885c8a311ba4a271f78b23e41e7430983e03026dddb8450d4295fe6ee74a19e2e69f0938ed6502d7c94e2678bf0c7856c1ca1912d229eb432459dac8edcf0ae23e619cc36e9819cee18aee33a56e0b2070009ecb6968367a7722e55ba87e67852db36fbf3c7f05962a2ea29cce2847a5a41b434b060825a28141c9072eadd5d7ff8c03c5b234cc14192169d24aca042e9481d290103a9cd08617b9f2ae0efa9f974f5c19a36898b6328d70630d62f4eb382e6e384bb98da60a2ad23a9aa33e07543b4856d2d745d2696de951c714517e15569d48d14bbec673d579fe8b3f8bcef923982c3842a2298214044c016af3dc374f50d030d301d4ebbfa2188286a5daa6d0bcac3b085bfc4376adba2cebf55a8164dd35394ca100a2bbdbf407a7a0fa9754c54cb58a0198e77d71350344f476035a08ba547b365412290ed952a6a9880470036003680333c6ff1ed243bd97f23fd36ce3dc964cf2213c73fd9ca8451dcfae5915c67ca049931d9fa351b873d676c094633a21b9169ff1490a5b99b6cad853448a1dc78d733e021ad9991495893b2b0a81974f2a585e6d152acb1f0337511bfcd89effffffffffffc7ccf6ffff4d6a1c94e273219f710c8e73ce4de68f9223d1ae8aab34569573f6629e40ded855ca4c8952d77e8afc3c6ab643f1d3ab70ce79b7b9397c74d75ae41b330759a0261140e5009d06b1477aef233eee980c34ed7b8624a39ab99b870ac0a16e137b41e47a8eb6f3587c670946ef506ba2dc5d7c5f2cae5d2b12be8e17adc6ff3f9216c8e1db068d485c8dff8dffffe74c2544401ba993e6b1ce27d258269d7d18e47acd06cbb28c82616c6c86b59203d3d405ad0803baa9a5cabe41299ff16b452b5fbc47385a819115038320fddd370672f856f0e824f144a365a3c681122c3b408ede31c8f80488d5214dd3341df4a16ea1a24f5ee40721475e18202cd8562ec386e7a49b661266864de6549f61325c9f1ca1e4b46793d71a9ee49cf30e96e3ce9eb2c4896c79e7d472bcb6288b1c019836b1d399a7c444033c29375dc74cf8d25a1ef2081a76a291c209f9c516fe928147e2cc08db9648eae3f20d9b90224b455a2a53596136992d076c19e88f85aed6d69e1865a449c4890a160cba04038ee9a866a041c725ce2e28a9ab75ef1a1552e41c256dad591d3f4de918398c780804fedfbf197a4c6cc598e4f1f5e975c2b9557ac6d54eb98a17102d7f072cc10e4b6747a4e964268b7c22313a31b36553f3ec6d17de7bef0e28c764587492405c449494c8ccd4ac8c45ea9e25889639fcffdf9102faff7fc582626ccc27064030222766d171625e45c8c2595a7dcdac5a6db16f96b498253167d768a5248e68e75b53979f8c33f66c80bd826d02a0ee225be5da6a134768472198a9a5d8de79e1dd1809b3d38aad02f4b0894ae7da66ea6463c0676c83f077afdf1de27e72bd75a1920d945683aa92352088004b50b1a8d20c1923967635aa067918329595da3191a4af2617da7809d053e362c7129b2d7f7bbff7906e890cc0a07c9e9543787498642b255557d979429daad23ba5f7deadac9bc3471f69ecd589dd7befbdf7de9f8773be5d86337b1b5121a45cb79f15075d42c33457ecc8a8181fb637a4b4308b146253a826ac95a6a997c71655a0d0d1ee95937f756ff03d44ba19c428ee1c458640b16f10993c23169b69fe8e26e1f3fffffffffff7a89b6f2f632b2c69482d59c617348a2ad997004ad0297d6d8174dd2c15ffbfceaaf18cefc571ae40080c241a765565167427d63b6115576f945cb6fc831ab37f58b13d1240b6de7b27d7400edfd57b90bd34665fceb02e2f877cec56cf950cc77624ea3198f71e74f975d034b7475d4c5da70d66147befbd43df08256610d32adc3a67aa67218b142964ea4b301f3e5fa6ecbf7ae15735db8b72430c1df4284d223bd1706d878aa4a82749345cc796948bbdf7de7befbdf73e84023dd0686505e6b38cd301d1cd135303365760a08d867f7901f0c06c5c5518a3709c771fb781ac0d98819f1a906af97d58c01b023fb1dfffff1f41ffbf41a1de4f43cf2a96c2ca49a1c23b866db5ecccd0483752df4cd21d067e453388c39b27ddd37bef4666cc7f905eea5d488ac8dac376e58aea4893cc1e132e21fc641fdd09add2bc5cc8a51454d704dad8a24dcb2daeeb8c6225601bcd3260079c3c22e27c1f62b80ec47033e59f276b0db64d090048518acc5c9de3347eb4f8ff288084cd9a3a55291f1fa326341e1460644cc6772e7928da77ffff462fee07c1b84f2ba9344e047e75d008069d7dbdab6973bee2e4eaacc6041461f3f654bc5f5e606a44b039a297b9f7def5e4d69f76cf4e7a42868a84f7f644aee128f2222c13c8c99bcf1e0a4685c4071c497f25941638b54f138f4a8fd294981db90ae14194556b48076ac6c4167afeffffffffff57e9e6f0d1dca75557ddd1cb8ac26c7d59cbb82fb014d5a6d5b883527c1e28d1609d7c0e2b3aa0ca534dceb90457ae8591eec896adc1526922c35a95e13c94f33006c01129e31edf489480689fee069a6981fa47ccb10bbd45d4900998e93af38d426d45a13f71656c7337ddfcf027cf429cdf0772c9f930bc9fcf9f870bd4e741231d42a79e6921802653bb438cdb949cbb901d0844cb6d579876fd2c9d8195d1bd54d03dcb40d5aa6aadc4d9d0ffffff9f996f4cb1ac09c933f1babca824d974ba92c858500c19abe8b87d2c3a50a02acff9ff7ffbffffffff466466c89d14aba0ea3fd196b222395d242d3bc196a110bbe7a970540400aa0000d3d525efdc5de590983863b6ece5d5083119b0798c71d61f336acc247bd251a2a37b29ba3b8b1d4c44b4ecccb2a6dba6bdf35b9166859eaad07a6caf2cee84738e0d66eb5493e28fe498180629fe46541534c5fe03ca029943152c0711e59b25280c42fb34085dc0c7821f8aa97d26bd687ae83515bd9f404d22a139b12e6d01dcd445604ebca89516e811f5cae89e5290a857aee043ec48cd87d08d6e66d5adbd73ceedbd7795a48c6f3d859b7befbc0c88f401c78aa31532f93ac0702500a138cb727457cc2bb81c6c414968e8cd076915b5a78840ef0e83ae558cb88e8c7f6f334b10db13e45896a0cf46fb4119df1fb14b61eb3a319bb1a3e540563813ae6635e0c0179c736ebc6aaf6bbcf7dea59bc39741e4d8655db17fccbda8c8937a20214b3c9737d67b3beb692a59f17a6aeb4878ed25664764f1e82faa4051714222e16a8971a07735c9eb572eba5283f520c4a5c547b6e3cc85883448cccf47cff436fa01ab1e6a1bd5158cc25a5839e7fc275a21fe2003d73b4820b85312d5eafc9a7a598b8188eaf22405f1ee88b3b438ab9e7bdf789f9f1c34ecf3402a671049828e544b3865f589f1058da27428292f0c64888bb594c46b325e69bc2d8302e6b3ad86d0bd100d739b9a6c1da528195b0ac3430afc91e51367f415ef91eb29128b9acab6c4ab8e690db1b4ed28ae40cf925d6c3dae6d6e3d21577e8ffa9539bff8ff2f230b96a505cbc41a9c6fcc4316c70f4bdc3d6b39bf08fb985ae696d955e47ca4bf716d483a02ca3b4a59ddc2e4b7286a5756af6569cc0a14e9fcfb07b9e3e6f0d1526dca4d5fa470ce3955f90a8773cea552a18613dc5e0af59a01886c60ed40e46285449113bf15b900c5f25a33d2995ad950c4ffffffffffff2490c3073da189cb230076d5b9b1fcab9b9577efffff072583c6a013620a8f50058a94feffef086f8341bab7c0933443b9d37bc9097383616ff12528be5ccd9ed0f208c6cbf8d4e2ff7b20da116311493b3a022d9da86d7366e411b6269b4c01d31413217e60b3712bda47a6b2c011ed0f494d0b1a5b00f8f22b81e46643b602b4f098de7bef64d1cde1ebbd77efcf109439e73eb32750efbdcf3dff83b40a5c98744eae9ce534bea0512ca358946b1ec0865c456f9a2d63e3d38c9ed78a8374927cd141465c67435ebe422ee86030b6537968256e2e46399df29c40e1ad250cdeb1190223578120973591693ee0bc6758de6c567869c474359df2c478e9b23ed0750190da018d6747a9332702301ec44e14816b46d5ba835b209d4cc6f83490406b3087bd269559954a565bd776c64e480cac075737f7c12e20df5165fdb718427b1f7a6d70ce39cd916649d38cd9983771c7fc70c84c2f9254f30eac8531135c4d7b0b412aa30ad79ad4b42ed4494145db96b8015d2a8c26d0143bdf18ef8374ef3c7b6a8b38fcffaf667c35b222fc4783322b8d73aa85ad5e4e29593a58d837a14d461d1133e2d7668c8a3237040e40a144c0f93c9ea4f5535928fc172ef03105efff7ff0e6f0d1c227613113b33eaae652006c88de7bef3c61c78fb025f1bfc9854c7e1f3e4b28daff7fc748f3ffff7f9811fdb0ffffff4ba4449bdaa99c28b5b33c37e30b1ac52b8a970fc1fb3161e9322133b219da63ff5fb312f440c11d5aa1fc529e4331563afba6dee35ad0d71ab74e8cf65230ad73b9cb79a9d1336e1375901a065f9a087b1f0f89dbcd9fdb88b67d9a964a1be19b26e9769080897cf8bc20fb4354ec750c48c988a7760994eef79806a09da4f9c28e26f8a707fcba5e00e3184edbd400327f820fa828e79c73ce8d555da71ff2940e9218d26aa5375f216910b4cd961331cac856ccd7240cdf8db3a462aa4bf48e68666b19d5f942697f9bebe3ced097edbec2c8ec8db6b272f1ffff243c4abaf3c9afe36d28304b6ce449c296a08c9ed1126557f9c7e6d9f32265ecfd2a765240d813bbd472abf255d762d76bdedee37c1f65daffdad8534e208947896ba7e295958a49bb385a6ecd96a5b3c262e46062ac13c6484d678c6e85e7a88ccae59be7a5fca23fb87db55add693e85f2da3a56ec7dd8794febd00b35e59588f24bd62d9ae99a20f91c81c4c16d2f19ba6d383b4c21aa34b3b3eb4d98cd943aeef2519b5fb65f4f61eb4a2983f5f596e5827350602121b96d6dae1034df8daa0e92ac9c25bb212c17778b215b4101052edb9ace1c846a1ed78b15b9096c84b2a6c68806acfa757d2b12b1b7245044e0a16403d8b177dc17215ce01e864035c40a385a5ee4d0a1a81e71799335e8d4155d81d790c45b6b8a2135677f1840c977e1232ebd280d40944e44da232c79674de78e29d85aeec3ffffb7d01b8087ed80af6007b53bfb7acf08fa3e73529cc0724dc0a34cc3eb82c9c691a9153b56ef1642a373c9a53257bcf7b969f91362881ca42513e20dab51e8b0ac19cd80e92c6969b6d586d3a286707f9c50af5a72d884c0c357f78c49826424b5ab46dce88d70a320a9b939e7bc5cbf1ce98eb425a0a7b84305925c504a90f5562b03328f89b2a4221324cd90a1543345b8038db8a8446eb8358d01307b040319040001005114c8c24c925c3d14000417ba9ca47c34483038281207426120181006838380000000000381807030180612c3a2d6c03d4c6d7dd0c9832619b11eb0ac4cce745e11bd9739ba2086e0a3e154a9915f26b861dd54573a9e70debe2d88342357061b1b7c670363f9a11b6e0885cb4eb763888f96fd2d9790e77a92094f6d8ded5c52891777879af879094377864c0ca958ab1597730867879c4285593be7831501874836c79f537a00c6a9f7297cc7140c8c5a16499d789bdae48023b1c10246b7bd47de2274afd17abdbd1e1cd8c806fb4af009e14d46f69aa1a76ef1702879c7539c1c83a02c8a83a68b2b0f15ffea10db60183ba696cf8a8c6671275248799099eea6f001636d68078ab302a85a4c456ae28f1f7a66b634ce5232df592e497aac3d13f44e9241496ce8c031f6723a18fc68a6f9174fe69ee029deb47cf5932bd4600b61e85792a5386c2635a9c56b417ca4e0c4559d59a05a3d38508f2320e9917afb08cc594008d3aff5221153a2d39d151da7b8eb36abc3640a1326c35dcbc79add52fd70ddf60ffb74539d43c40c02e57b85803391bf4d777c9699b4ff4bec8479b34f8d5b27e8da782ad465e9cc76c26a30cca5e7962fa97d186c8a82570ea20fb78df4d23195e00ce0396036d64e8e2a12da8b804584a73488d01f1e5df04e32371d8092c9dfbee61c6cc8afe37f773f2b33beff6571d7a618207d0ded80b8ef1ebafa9ffe366dc29bc1ebaba635ee3e121a6ae289943b0292c3d9b536606f680881eaf927ba4ed468d2671dfa692572d2f543d318b4b92794b1e6079dd8dd1be8423d79e2b4a7425fd8c48605e5c66469697d0a1209dc114ca9f721e39c8b5ea1c42566725c2611ec90b6419145e8a4baac6eb62cab81744cb44dd3ec38bfdb0e019570e53aaab3d05d50f953ba02d19c73bb00a242f4cd99f7de9ac084c7226844a6a0d5b71f62a515d02476816bacd56711624bbd92d44a2b8424fe67ca3776bc413f7a28ed21c910a77374018b5b4aa27ccf0ad338da94bfb451b09a2b55ab653b4bd1bbfa45977d00296afc8d224f21e691b1f89de51ce589237b93c5c33a5c02fa75cac43e88b32b660717dd7261f5cb413a251205393be5c25c530a150a42f6375704e673f4a553e603167f23b11c480989eb7a6491375df1265feca7689ba91523aaa5f1851ce5f8523802e6255c8c03813d7458665003abfc64697541851ae05afe5fb474e3471f54c4a39530654d2096b1486c13d460f9b062bb1305696db0343393ff7a088f1da64f66e91e758025f3ddab26e4326c45cda5151ea7759da05f8eaab8ccbd8957cbe8b00460b810007481659eb274ea4f9b6bc6d6a0abd7cae9e316803f526b2f4cb9093140f3736dee1b256933d4a8c729818e9bce7d3c9618284ba6dfb4bc6bd14a783472467d804b422e963c4751aba88922b9835156b90e83a03ee25ba3d1b968d1efb4a0187d0f0cddab30ef45b70aa670b48ffd26df16845d6a896d8aa7026d8c6cb8eae9f9cf2d7dfab847e484562245661d269c3b3c4d26b1085df783e0540997e4634906f92fd4735738438452568023da1e63415ba9f22c49a46aac095bcd2f915e2ee893e20921a4138b4e581485c4bdb456a56c203d7e0eb4045df60b53846477461e3814b938936936ccc06e79b32eb68e0d248be3e2a8bdcdebbd2fc39915530bee6b5d6a9889aa03c18caa7b5fcd270d3ffdfdb7d4da1cee9f1e32a7e0d45ce7ede3e951a6e3a3bde2cf32dde0da38a6854158e99b0804cbac5298880ffce8b50acebb1df4062b1c3a7d053259a00489ef1d337993a3bc95244618ac00419cabdcf265b7ea9aa9a4ef596e71d112a56e150d3cbeb05cb93b39ddd0c6492b6cce805edd24598ef6572edafeea87a6182260c12ac13ed5fbb54e75628fe5feb111d7d1455a9a6277eedae36345e5eb46122428667bbcd06c292f838579d63521ae5ca9bbfd4aa8045d61cc8c3579a5f402cb47094ecb8817ad1f94e0207f58267f648135b11f66b9f4c0223b48633a4d224eeb7ea7f16b1e4d678862cf730b4edf1ab328c282f3d3499556f246dcd3d9f3f245613b30faa91ee1f486b71e608f8169278ade0c3b00ae6b81f5f10a57b7a8f9f69f7bd7c13e01905f5dfdeab382d9c3189473ae77ea94052b1d7d5c7261fe396e02e4b5ee73e13147aaba2ac214a7f9365107808726badb0ed1f514b19cc061ee12ce25dd3c77953f82ffa489902df79d910e0e457915b4b0cb17ce6c8886ef8857e3bb7c234b2c8bb42ee018f998e06fb1a03f6a820a75d0fcd0ccd2cdb87f247e820799c944bbbbacf42bc2964201c9085c33abc18cb1a375abe723e8363a95a132fc02359908e3532ec7aed2cc1a49d5501cb5159ba7e25acb14f05b4f746b89d7f2cd77fcb853b7bc2e3fce3b1f7ae2012899d42660c119557355a88a1a115f85dd078e620bb83e94978f90a2b675afaac669adf6d35d2806db7aabbf534faa981849c18e6bd893682bfb258e10232d171379883c1efbbded23c6f7b808883cfec543bff72adbb4a34e622e0f2aace4fbf0459a36be5555687187bef98305e0b6ef81ae10ae1c65c2a22ca6c9264db164b9d5c2023580cbc0fbbbe10ac6d915707e82553b3a7c02939ba5c0ba3ea0f001b447c0498eca6917bf60a2dc2c3405792eec52f9a79c0f63f9fe026beaf14217db6559389362691eb363f5e00579807fcc0b02eea07934db9b725fc5a6b7c23d2dfe48680455caa5af203178126bee22681afd01c5a8dffed5b493a0fe28541ef10543f876c3e238f7f6a693d93849913564e6fb6a50cb1cdb8693fbbd7d772075d86fc5b846e42f4192c7dcf0f42fe87b20f7b6f5e0249ed00b92b270ebe76e24d4aaa66084249680e1238082aa532eda9efa01517185af981a5c69f2ebe8f8af08d6ba44ecf7dccd58bf20378feed8465448f7abd923c0430b6c95406e1da3f429367beb3f010b4e2f10c80b1104dc343d7de2e3c8006c21ffde51158dea7ec92abd64687c1b56f3f31c5a79bd2889cf8f28a8755c31873dfcc3c094b299f138b8b3cd1d2e3f7504f75ee577adcc4a748f752d32a813c52b5d48a738909afbbc01c9f071a4af8e2eb0f3e178590856a83bc17dc1034a593af0f1b4e8798bfe2488ad83d764baf9e70e0f065731aea5316803ff5012396ebdf0153c9b0fe4c921350bc9d822e6f6184d85d72882a2d740a3ca40ea433dc687bdcfd133328b6500ca833e1ddec88a4434bbea14388c16bbe1763ec95e86b4ace27f6fb333234a7683536d3cb106885c07f0c91ac142cd68ae8f248289734017de9361285392fd6ebadab15ffc1f5b5ee5eb66af05472d4894372a09419986183ae29af9c4c46c89ae4cbb37db360c69f53afa13a0a258fc7df008bb115ca4ca682615b76838c642281440affca1218c068be1a67a8080fa0f2f6fab4ba20c5eae3e5cefd831599eab2b0fe9d52c3ffc52387e6b66651d8b47735b0dbc5b557aca4b4d6163f422d8df39a42d39bf162d98c5bca3e7fd4e6abe1e99821c88b0a5dd90897685654bc2c0a95beba5e9036064f95e5a37d75924c9375a61a147b9a061d4c02deb96adbb9f14a5256e805f6a52d1cacb5256ddfc1a7610f72bee27e63cfbb38c30d9caa1c1aeaa7432b5170cf0aa36e2a406ff8624b778e14c2c4addb2552a31abaa5a1bf4f32b3d9ec51ae32a8099d10d56bd536650394acfeb57a9c02ae08d2b8a7d23aba0f9f35c15510a722a15f046e58b604d96b0f81902eb4b6bb4d58a0aabc77ebb74c13acbca308f9c4b36e71ede7e9e920cd92b1524a24f2e85a9a4c74d6e3566fc9bd7ed8a1f5fa60ebacf0341c556ea4f3aa612365c31ce408f191f03b5e9b203cba76b8287c73412bc120441e6c04a28663e5f61b6a8996a69e6699673fa35ae2d1a4f88e1274a583cea1dd34fff360a34106bca0888b20289d21a512320b24d903c44a00cce4cdd40fe2aafefb1e299257ecba8439a967888b9ee4c81058121fc8d186813947568124c62bb198192e4560e39b22bea132108745416713d10f5890ab7a6844138f5085f39ac98621cf973c8b661ac0bbb69742a25562ec2ba7f15e51ad1f51ef944729ec9f545c310d5dcd642391cb4c57a20c8777917b8fb9e4d432158f222ce86df8973934af3cb3a5a408e87954d771686804b6ef47c3737816403a27155ec9b7a55a8ceacfc338fa25fd5a73a1313c1bd577a217c69cb2af0f1a5ac6b780237d57ac20df625c74f90d4c914aa8bdeaa99998447fb46e4fdcab279ff331a56cc8c6accf81031c810364d6eda58e3a75a7b51d443304fcad926646d447a4d92ef94a8d06945f772e8ebd69c362ddf5886586355ac2bc041260ef41eca233815e50a66a54cce9d4720d9e30134945346926d4f174da076349421bd9e96a05845978c0b8a8d00786230faedbce169a58fb089f1d4d9839b26bd852f945b02858e59fe947216ac00332a44d1643bec6fce9bf6ba63f9e73a89a67141f9d6256f43734c59c0786f59bb321d2ef448e3477617cab081f13dc0eb93b7c96777c854ae5da0dea0a38eab91971e2d84db8d385e57b9af1688b3e5cee60d923b74a5a82dd18765d1e07d1ea5f80a82861a1c60b08c2818ea28898485833306213ee3cb4442c15cb4bbe209a8f165a424577b040c41e9c3f362b52eb3b532051038f98a602e41887dfa902afd43d1563450b1e74dbb3b8c7c8a097d5de2f5946cdc1d17bfe0d5c8feef9c308284cf80be37a4af2e27b714741d6fe1d39fdebd24ceb7d1567976f89788cacccfe48b203fc48ea0cc241902b753fd35eb4354b65e8ba12b495f4d0cd3e2bcad2ad6e91a9a99cb965511fd3f3ac3b95a69fdc57fbd97a84be1ac3bc2693737e01eb2c8c4c2f91681b9b98528b0d376737d356851ef864b8a82b9932adcb3e8e2ab6700fa8b1ed7235b422466b727d2a314175a3224d4fb65e8a0ab937e55685816ca40e067e4bea8288afd77123fe1ae6642f566f70f8b1285979989f8599b7fbc886184a8544901e051dce6b87f8f97cf36e791c5a4c35dde05d20b4b19dd988b024e30f2710e77b3543dd9dc3da34b8b6d2d0746009904b627419f9dae8c9ea0d4cc08f3249b4dae222f94b120e0eff159da29d6fe355a5a2ff4559b7c3834ec2078308d7146ace6988ca0fff6b9936c521956dca6ea4d4ff67dca59e137cf711f33fbbe9aae8d81359416d4a1b978b5e341e85dce83090573107a0b41dc42f6d54358ff1e7b9452141786b5f4a0318f7c4e65b301383999125430065a0d0e6f14245264d51c5798d1ad95234ed01d96cca8e862ed8890413b260468e552e5c79f3a4b336bd18381b55c6a4c1240d460c76c66343082550324f429942a766c7e3648d206ee334cac41afaa3e65c1813c857a7184dbf08b0fdcc015e7aa488d4170c63ec025004e74fb08009c58f0697c377002b9fe96561bc68609d763b541c9f9ced82364b7fab611aa7859aa9752a00a3507bd1c0c1a0d1fbd8d2ebe7acddd03036dcda1500a013b5be6138f15691b96ecdf2968fcc3c9fef6a22fe8448faf1aadf15cc489b091e22400b769647980a29a48822b4deffb2d952f6b5eea062534d7309863340500c312ad505815317bb976b465174bd9c0bfd092e48205816ab8aafe34ae192ac6c8b7104009db05ff50f56f11c159721df017c20a86ffc266ab8605b32c6b3a8a494a5906cb47d66ab856c29c3a257b0d2a7f2fb6eb789f00188b8cede55fb44ad189b402a3759415931084eb34b0dcbf6503d0026083b4b28c1af4ab1823799acb1eadc5a04599784d685797d570a7be4d3037dfed542674b07825caa104a994c03003d826387205e616dd6a2f6bb5f89e9cf31c4205d2010d5e4ed56232880c13ffb31e8689d6cc5558d294eb5980ad3655117a95eddc7fbec7c4049f36895faa0be4c43833c76ce852ca387b9a0eb6dbace9c1393f47c680b9a8ba14c5645b471bb70e3c9b6e33f9845acab7f16279e6edecd9e68f072eb1a0370d46956da19761983f72c8481d62e32775fb1e5dadcb5c423893648838176d048cf6ff5ce3a5df113a10ca7ecbdf600516a3acd66969ff160e42faa192f641c3ec29d0950691d77c98ab92a5ca1403bbedf50fd23c78125c413be12ec5f09613e6bc71e6fd1aef2fa48ba750942ef603a85535c32a59373fa93c8e32d0c5acfcfd1490ae647b546bd8ec96bc03664c68a8659b74b43374d046bb19bdd4b0f2dc4e22fa6338b2a94a53158bca91719936ca3290f3f06033ec3b240cab1d3c27263c0127e98fc35ffd7ec0a0284cb2fd5746604b749c5765dafa607b0f9254fc57706513af645778d2c38b69e6c1cd06f521d1d5df8a1994592b56eb298cb3ae4017e14c19ec873aefb46117024038b81e7b7bc6d3887f134d9c7988fc20c803e2cd8770d5a11c93c17d04a70f1eda600b073e52df54b1af48e6bf7942202257b8e8161d203cf97f42f7cb78297b8ce4c58024fe8edf3f2ebeaf51fee529489079efc5866ef8ccae6b727a3e386c5c07e31544753bf35bbecffcb822da72fd9c0ae72d371aeb487260c1a79a702ad07c184fb12f8c1d2b824bf5be0f9b7fa7b503246d317e767ac91b3dc4fce102ccef703401a29f9a8ba287cb0b05a7874cbd4c54ed41ea786ebe9297c2b5c1d18eca23551f25da20030681222e96b2a93a552cee7fe972d2105d97758d0d2bb0e58e0f29516ed97cb4a5c4b75e06c7775ada7d6061223ee134b014653f76408e07f5b69e0458928e56f58f7200c6ef5da25554911740bacc75ed5b8064bfb4c899e29a7a6af4583a4783d04919f314d9891fba406a43dc60989c48ed82bf0998c8e366ef2a5797003435209fa64fb0ea31ce1a3e6501d3570d7e73087441b9655cd915cf7d391fae9ef7f80d2bcb6382be28bb5afd42258a3db9f9992b9540b7e64f820162b3956d7ed0f9744c2b3a3931723decd0c776f6e46ca4b7389fc64d39fc060caf5d4ae5795a6506140c2844e53985151cab439da4d9c90eb586230b147c3b7a031c3ae0c459441f7ba7fb5860a856f90187ab2b9bfcaafcd697870e03c08d23ed92f84d338c77fabc35885365eba1872a707256945f80143c8d476ff24174830d958331fcea75c990917bad425952772b45e546a01f9ecff29ba76478bb74d896892e9041e4c0fb1d44064a4edda296d5c952328a44c8d4d68e7e55632d4c431e8ca6f4e25b0de82dfa5758850036589b6f94c17dcf3f2e1e33c60e3793d43c46a989718227e2b85a9df20fbd06f2a91531930bdea59f8869cc12260a7af99f03cebadac3562900108920838964e201e702e120a27c84b40dadad6dd396a6e288d8ba626a3309e9bdf13d35940e0fd882a077200adb1902299c83c354e47f7f7f942eb46f286333b9b7e35d6522662f0394e7372503481c71fecc71c07e20fc2c8e59d4fd75e68c322297c9cf7f5c1a2d236fb2ed2098f8ea2477141fa0d9dc46b37f59b0ee1a2860afb44d0d410bee6fec2ad62a5365da0439ee1e5306aaed35aa7af006b103e8ba37ca9d31ab92fbfa63ff918c307caefe405cf847823dbbd10a4577ae11ba1426729751e62cf58260df5ab6b866d8145fd721255351307fd7422f4285d04e3a870728f2803a5b924d7c2a11276685563828fa8a0ddc943bf8b951220480964958049d89f04aaf38726e4a0fd2f9a87aacc47a06111179a7420233153bc96ad7256b165c226a6b576094d8f25e49cc0c4c5e9850b83598c9ecaece40d2fd7ee63042e92c9ec99d7daf4b4ad29480ec3c99795d1b4b00fdb9cf05a7e1f313c50eaf066ccbeaeab4fe642c7b14acad53d3f55e713c6d951d5169eda1325357ae5eb03dbccc56bdfe5221651cdc9e91bcb6d4ec5935add36dba4f7b82f885d6a380ca3467fc96bbf22a7639523c42643cdff1e6e4d0d34ae477f2cfbd7cd8159b3c125ed6d7476e8ccb2132c7f8faa1306464d52f84ef9522e8047158d97f74e67ed8b1745c76dce26c2eec8e7184425ee476bc6452d8cf9b12e3d925e25ab2a14f29348b2942763c54d8dfa02ee06a9a898e32557cd4c2eefd2d960d9928ddae6b1bf94dce39cd8aefaf3952be837d0bab80292177dd34e61867a5e85974b98ccf62eeaeda11aa2399e78bebf1338573170300e87f7a09ca1220228bf7cbcfec8c9c44d77f6b0bea5ba1bfd9ada29131562ec4b23ac038550cde17f3d3977efbf3e973d89b2ad944737c52cbc2c68d30fe806a13c26b76103e182b00b3227956e70f46057623883f90bb20df7e6430afd09e8cbeafa05974a24318c5f68e8e2242d914b2d6ee8e6a24fa079e70e9741199839fbaa2f2921c9d06c548773e6bca2cc9538f0168b2dbc24d96886f807a978c30d4984964a99b51e0a5ec2d12d0113010492e71740c8ddc04df194827236273572872efcbf7851c4a5730b33c2667afe1f8f31a1ea43370438bb76e96c5c6fcafa71468ee3479fab21d24dc2cceb1fdf9ea38da014a5815bf5e837f3c60b53e51470e797f8e8fca1a27e5d082780e290ddbb07f195c4f20e47ffd00cb4be4d0cae9b3d891b8708a9131652a5aa5adf6931c2912978af5c605c2683568fd15d9e64e3379f295ad91929d2ff8b0008b088b5b285f38e8ee6102a54c24961c30f21196f729039d29df4ddadb9975c83c132c7e72a20aa3131e4ad84a2ed88621eda3fcb0cf560ac05228224d39cc6ce0d0c5190d2830e0d39d23bb3138b8b33685e840944c4764e9da232bc54cd8ebf3fab7fd89216565c06d428d15dc001419df1f26cb74e98cf8bdc88ad68d9d01e6e12d56f3c48796073dacff78b7b7c346e35afb731fd18194772989590714e110b80fe45e0cced015f9301c4323c89470418c7ba36ef6d13a809ca495d44518c5ff5e58321b7acbc3d9250a4d0786f4a817c047bbf2c3a155dd79efa7c8b734721234d44971b4483b06975ce2c5f5390b2614848ed57b45e50c5947ffbb400700eede7a54dbfa65091eedeb6dd39bc967147b1254718fd2df7453e88060acbe82cddff371a57df99d7a60b76208d922b755561cf23b99048b5ed4392228917747ceca7e20ecade451ecdda85b27c075bb03e4459e13618e68099ea66969d8616145fc5a056f9813172f8fa43e59b12664a2bab2554ea9f5c19696b4a76981257a92c9507df17f8efad2bab5e9e11d77a354e1566695c256d1b25e05566b643f878123621237f859e9efac70790dc56086c288852d030d2b4de97b74f2711369fcf371d98de184a011b879ec9bd1617548df0cd3eab2f15b348a120715e02344274b9167fa43ed914422432b051f12abe0d628013d514d813e31aed71e998c887a04ccdfe41de2a09f937941a102b1735cb7c23bc4d5fafdb447d77edd1cfd349891ab66f35fddf6bbdd56d20b459107644a2b257a6a7aec6cf814ed6b06c314ea8f84ae95ba14d4d36a5288658c2569d2c02b0bb3589efff41471a5885693a00d57db65f3d45cc0fc7efa7902aaacab591e98b228127a84b29ebe85d773d8d9810d5866d23e13896b54675321a1e1b15742f7580addb55db02d1cb48f919a1d69458c907a24d80269562cd8a5db6c935f72f08e4f44d42d94027a63f0507463e27a92bd31d1c511d4b7a1f6726a44d35f2acd94ab8195faf979d38d785768609ad22f6bd6f5dab81dbb3a60db12008222a60042a0243825aca5ebfc372627bdb065e154098075ed352195248bad0f55c29435a58d84b294dbbf46036127cb76d2bd61d292c7651e8a8cfe917587b3cacd04e8652cf0ca25db392b60f261b1a4a9bbc782cbff92a677a5e907da54317a987ee10b73f78876302eb9e1517163d493f60e96681f6d8ad7ea96f3700d5438a3d7be151741374aa700c0873b711d30e6cb893396f9195c5cfbd8a00b2c20010aad942751600eb1ea545b1497655c847ac9d390f4cc649973f38056c549d550ab64697146a22eeb19d7157ff1c63b28e18d17487e92732ce0d35f800f2c2e8b9909136a49a142fa43a4a7d0b1342dd949a6bdf7de016102610261023278454ae35ad48a660c2f88a6ca48c8857bf245176d76b5d819b66856a0c2ff4b98cba2997b6ad3a2c9b009654596525de3cf755ae1bcfdff0f21b574efd5c3ffddfbdf4d3199b24d96e2103336c64847d0d5f6cd74cd956300d0bcdb594a425bf144e19962d75627c3066374b7aab9bb6fbdd0a0b7cadd6b8fe8da7603939c174ee50c8c3db25c1a4ea1c2ba37f6d385373632715b982e383a5a4f27aee752f8441a1e0045332d714271e16a9f5119644810735a3d63654c9570879977efa01c02c9f519b80c2a5dda3454f4a8b2a2bb77992e0aa05121400c8662ecbd37ca95cc0177a05ceb215c90e50b1cca757befcd9d39e07a6fe1da0276dc9845d4de7b8f1d9788265264c8426fb6f5fd10b5c168765b4dd063e2812ebefeff0d51bb83a542462a061bfaf98f86640ed8e9c6232887149f12f0a5f83ffdff27e2ba91c83b74ba31c2abfb111341e644517c2ccd176a1a2dab9b33a26d67ed49700b435ac81a9b235458727833c176c4a8f905c5313bfbffb932e11c974e22e174859921b59244a6da7c0a8e83564b4de268d1b118b7591b102f1bbddafb4423dbebd5efe2494a77f71967af63063aacd69f62a6e54bb04678884066aa80f0b230cc568ac248a62c732547c092a7e15cb68346322e65745a542a642832e54416ba5387ec6a3099b3c5ff7f64754393cede7befa59b9903aee7f9f3bcb2d285a590293249326542a5a68e0c6d7880a56be2c244337a9bc9841d7755da2704cac141f6de7bb9f7de7b0b37b5fa21c5d2432af2b9f7de59ad9170f6605b564fb8bb7bd27f2348bea9079505e166aa5b673d9aaa620a72a6a29e0235725c2a792b4e248d6d04d3e58723cf568ac5f992a5a7d3210f332ce9a888adc475516ce7ee4cb5145eb803578475d7b01a435d144bf6e173fd12013a9282fac462f99ce998e8115e05e8bac467a76112972c7b1b9adcddc3aa3c3a45df000e89c6a0d33129863c140c5e813e301e578ae71d029733d2518ef595062efd4ac0561c93eead4bc7f4020b56d6cb88a888c9dcbcf7de7b5310e504d7c29a418937af252a09b51a2b570aedebe8482937f7feff89dc7bf5fffffc55f8fffffbf694df0e3e06c464d598fbb4b1ce3d952865b87e51cc80e0cc9ae24cd062537ada9069312975ed583849c0359574b2c59f59c843246226f03548b566922efdffff1b8686e4de89d37b2d6f25e4b6b2f7de1d6e50b73520941bddd6104dce1e274e77f70e30f1b20a835495f04f162a880ee8838ddbe456e96b2a6b5a228494567626d04665bd5a60a5c68c4e6f691e0eeeb0e25a798bbe4163f8246714a85349c0908489fc887005b9b4b1d4dc889d29857d32e6c3cc757747bafb8c5474777777d8badd65f1f1d7f3f77abbbb1f650e185927650eb8b877af06feffbfbbbb6fd04ebd272fc60cb75ce5b985368004abeed17b252245fb8a98788640516d19bf9a33af40c069c9edeceeadd9643d9167ddc1abea2e8b52dcde249862b9f1dc1e122a02ba5f7c67a5ecefe7eebfdf36252e470a33d635e265d2b08bb2f25916c559b94db9c4a8975fb0cd6a6524020f4a2c09d885b2639b92b93962f6826d514c211b05652358dcdc8eb06031981c154e8d66454890adae8bb12ed89921b68ae8d5ac99a1b4d6ec2c0b52dad9eebd9adef252061a2a63a51dcfffbf87f7cabd579f056531b1284db91e56c853935330453b5c33c7b09f6888d512d1d405abf2a345cc90c422c98e60242d7223bce48d6082c6e4189fa63feaa187b9c01a137fab2f1bd5a04b77e14a72fb68d8430e090402b74e5587acdac48bc2eed7a5c77e68ef9f8b7fafbcb2d2aa01e846761f5d826c13b5cbd89984f7c294924a61e1ec5bde08154a9731249c207dfc690022230287a86ba9ec6045d75a0787fcbaa3cee4fd989c73034a4e0c776e8ca65cf30e29848651884eb9e126938943e113b5bddfd76b98640e58eac61a2a0e4eaa86249de07e20c587076f1187c420daad55b07afeff7f669b7730e5862d8e543827492eba2ae30a1c8a631941dcad7d82d9c4fcd8cd458ddfedbbca60f4560831cd97a710e40a170cdd33ae3c9c32ad14cf0874fcff8ffefeff933307dc26f62f1d82ebbde59fdfec43affebdf72693ca1c30d596189a0759db7fa0e1edeeeeffffff1b9f526fdf7befcd362373c0394021d88c363086b34afc51ad85b6425c212f07ade2976ceaffbfd7bd57bff09f05b8e45d7605dbd44e0a2a696e2e53d96cd6956f2a0376177495ffffa1b2c797bb81545c48cd0d717807f4d9acfdff13b50b74b8d128f1f12469aeaf4e4a65cc762a748f4bcfcc70caa336f7e4f8feffff1fb8516ef6de71d211a3b7bc32604262fb5476c71c52485fdbae7209302de706a2428016f4786dd8556ba72420c6c8f7ccf8e661f5441c338f1c8aff0f38b304062dd21f310c983417dba96754d91728ec7e031075e931dfd93ee07321895a0dd59903ae7f183dc36a70bbf7a6d990340428dca4ae20936b9b4e1dcd4e165457b70534e3f9e561ae4bca7155106c2750a49833a677e663e6982545f2b11580170e1131d0cf0ed7e8a4e849c513f5fa34f68343c322482763ee8f0eeb453f70e2b2eabaa9c114fdd0a8aa63cd2cac11bd72edc92a47fac2eed7a5e797c66537d0855223a76bdd5c772fdb40c96f9e504f95894f33048e73b6345561619973d2a68c15adc2c1549a3c52b59d39e09a867bf5ddfffb94f466247083902a41a4ed2dbcc84299587c19f474f3aa1148d9e4ac1da83bd2e28fc904b821d91c7d814076226853fba0c95ab7372a7c291d9aace26cb536a99e804279b5d5245d63ea99dc6df820240b67e2ac6e7d689421d5dd1d2eebeeee3e1fab7244d0e0beb4416975093707dc68bcaa943e7c7a48e893bde5abf94975178235f2ba46b1a25926792d576a923679d2783bce6eb25c16081ea2e114fab3748cc1920447dcd9dd3d28d90b520edddddddddddd6d68b2ec2fa8a18293a508cd9b56a305439897cb8f0817526d9a624897f88496f1cff3c643dd9f6c61e74ff8031fbd258a7b0f3d3e444c4ab840a2bc9c78583ce958a47a3468e45cb3dceeeeee5e348d9db551152356e36e97c5bdb554660ab65887eaa3e413cde686aa8cf4d944c8ff19509ebc723c509bb4320f5aa0b0ca29f960e98c4fc7e4d13409974ae5f556426778dd7deeee0e5cb2d04ee13f93532ea46a0515534c6eeb89b79b40886d2c3925825ea6a886e891019e90f33cb3107a7d557e8d1561cfd4ae8c46ec2598356d94841d13ef8e16f18baf195266461933b39cc126fac5b63001e6d695754687502920228118cd8d5a59af644f2b06e3eb5e25ffffffd92d1b2d69d8881b44faeabb8f9ddea6f0634c2039d276f609c006cdb3ab7e90884a8bdbd22e25618d7c6b1a048023e74c443a9babc6312d759d35d470578c5da8f40ff8443310d08e00a318080400c4401c09e34813cc071400040eb2909c8040302c442c281286c20020180c080ac000000010068341e140280c220745ee615d070d0ca45aeed304d6a2ca8b6926b4d36ee5721865d94b577cba5ada1efe02c85ce3288a7b59c7dec983e6d8038458efbd2a81d9bbc70d717d3ee2d17dd7d19a0a3d2a56dcedf4bef690fb77ecff7b944122dc3d3e2fdab19244208ba2f87369da6f50a230a607fd1f44dde52cf0ccdbbf6f3070f6204b189387cbf681b38bcdf629ea80f8c31aeb38e40bb95c2e3ac4600d00811f0e35762e05816673adb44e0a0cdb4591313b9610e22336d0db4f341a9c8f6c374e0d8b3f39193a068b292f115aa3b9054a51905b96981f2e4365c950e04fae7866db6869aede51568ac2322d54a74f25c7cc1ad94aa70ee18dec76dbcf3cfbf450ff8e32b13530fdba6454a1da5deaaa6fbbde72a9874caa80cb13cf45975d2db86c65a36604ff2795e7b558ba18c3a610d02b48c4170968a89baae10a9b063c583e5543eb4e26e5a8a0c04409a1e1184d2a4b65a895f54a8345d8112e1b3761daaf06f8ab44045fa147d6376c84576da35327abcffa2ea9ad9cb916bc4011a3c9cd17f051ebbf0089d207fcadc924f6ea510efb376d7040ebd5955ca63f118fbfc1191ec4f21169531aa0cec08930420350c4497dc933d7f0de254e04946a942049824699b32b36b3d96d9ec30813d9913d45b349b0e1f3d43db3c77e61b5d58176a6f2f831d1461f3fe6b35d42443d1189712153f40fefd37d3175c19cf01a0b2b699e075c0944690db7860ee59f94c69244989da3857ea3568a48c5537c36478ae6ac14e9f038b4a5aa94a0cd060ab97950b50996b5ab613b57217ba48863fca4e32b39318601e98b29ecb4d34cdfdf24cecb0945ec25c2372043627b53bfd0db58f56d5339126b9858d8c08abda9a77722d78b1c10d50d21d849bb20e05ccece3d28129632e8471c0675975f2ef4dfb810fde6152eaae16ea4c8ebfa42a9fb7ef87e58a268dce9e3dd91c180a3763ceed2def19354ba37c42f9e4a681dd132049390846fb3c50b0235ef219e882b39941e78ed16c5aaea5262bb8f091b865963b75ef6967c3990c1a7c58a665790e132ad267e6b24d56eafaa5e9433ed1ee2cd3efb266a2f61630c94561e5c1bd6231acf0d93ce85c44242a00b41181afe48871d265d79e190f2f4619eecfe76d1a2ad5c6c6f134ac271ef45a26d7783c2f5db4085cb7c1ec0b1e9ac9f0883b45deaf0b711e2452ea5368ba911b25a580976071fe4ff72a6f991e5c11c7df7b9b5f9a31ede42d62aaf6c3f3b51bce751c7542b93d8441c38edd89abd370fbb61eb72321c17b60cb9b92c59eba65e5a1871027db0aebad830b5a498de1775138e0b563860812601e36e4a90b82a9c5a35616710755f28e6cfbf15dd6cda87039cf6095fc070a85390e2243894bba147fd6cfb9c6287952ad7c37d8291b782f24201344c52e0ec0c9c682edf2e8af99ba2252b63f2031f3bc56a8256ce7ccc5f482fe00c9ad987c33ac3eadd9c04218dc7377d4272f7fa1e2270de0e75c3e2ef8991e1ec9e649f6513e9cfebb680e99ec7f447b7ad47242d4819e9bde405922d90ad788e66b7b1f2a51cb4c991a4ec8c3483a9121d104cddb5b84d28263e5ce1bbb3b4f3c2efa879a33e1b8c8370d4e2bd381bae7b7028341fb7d2824360e2dfebf1eb9831a5630d7cab4b09be7d0b531d33907ab625dfcb8aa2f0d5f109ce3631b26e8e0d434c3aa3f0cf6868727f70e7d53fcc21383462cc6d2aef2037c6274d20fdb6ed1c5a48f67f5e445d5273f99475ef12afa4fdfde3a10f7a54b39eb63fe77a4e3dced42c979c744f703f7dfd3be7a01aba782623925cf0601e9d7fd0fb9aed9d0abb02cc5ad0073f2f00acb46298306e89dad930ab3ac59be8c67cf7bd0d1a677eaeddbfd2e8e4c806638407bf094d111016dd5ab1cf86a23a755eba03b1b6569893c308bb65081994c2341db9e61bcaaa5715ce14af4f57650f3b8ae8008098cf48185ebbc8aa89861a05ea8932109feed278e3c896e3ad8aa052f03004b52fe38a71ad66286de852acb2d014aad50a4b73bbc2a780bb455bb415f410d2a5297dcc654855b2db42ba1d3af9a0b8ef4c0b27289a118087cb12d1554edcc9003026d124485f1d24e4951b26a22d6b9c0fb3e778ae03c97075c543c9b5b156b68ce45e5ade585e72c7060ee3dbd640b70e676414e9cd07baf1614665895bbbad08828c563e6f68ecf6a0eb214d687a9a608f0327656971ea64c057edabaeff02aa25ed35e99ea0e8ed029cd6c54fe588576d7400975170499bb848c0a5e4053acdebdfe843023f94d8d133ee34cbf34760b5f9b385f47c005a28cab61d56f1c69e1ee84eb7839b7efd0186e5ffb3adb95d60b44a0b1f19997b97f196932ee0e8422569a740ffd98f249195d7d6fb9039b4b05062f7295dfe3b0705c962947f62d0c60aac5e3dcc7f3cdace496da115287014865c810c28e503ae98594f00ae28788211cde50813b834ec7bb12aca5585e6bec2f264c3087effcf0d1b8e6fb8db8c39b5a2abdfc67934fa39133a16ff3b1bdafe5810999b4d68b45ade46b72d905644ee61171aaf7df4fe6909d5e37e0db9944ecdd496afda1bb7cb26bd88a26043c509598064a422dc151f644583c291fa048641c75065b11139747dda2473c3a378de3d85eb28552861195c3daa1d08b763b762d447e12452d119bf532038079df1fb87594a018c57695215a4e2dcb519e7f989d3ba2c6a33c737f5d7276d41d9ac588523995fcf7beaafb4b51cc623e41988319defff66bd5a4a675f24eaf2602e8deabfed541379ca56ee3e6665866d13f8947755c23b935e52e9c6171c25926a453cd0162d87b66c99a5f1f9263c97a94ddc98783172afa933859264a925b593dbee32062491982416e5caec1c7eae1b6f8c0523e3ec433ca901abff2f4802e1a194f4f02007529a671cf2c9a07523e984e09ecad0078eb5d28dc5da378582242cd59bd2477fc1d1c6e2d5405320f7e668f59635c8a29e717eacd591f8d776bd46c36f36993f253d4bf4a1f5d0a921da07e0504e0c10209be1b596dcbc6401c0615cc18a596558d70e9c03d5b3bb76cbdf72960cb807761771eb8e69916b4c34bec8ac2c013240d517d413184282cf48753ca833d18fd8bbd15a11c7b256e8dbe8f06e9e3984e023228d2337ac19cf6557ddaf4fc72ef50dfd59fa544334b030c2479bad5de6ddf36a8d480c5742c5b2b1bc33d7aa2e80adf978041489aec2eb821ab9ebec98343cb254d6c08a256886a2d5073efe9d6939ae2584dae4c08b2980f5be102c2b2c1e4e834b2a103f8041da1073ffe5ea21341b82503bbc9da30d72ca3cbbf7bb7309c9ae3bc685b3ce9b5dadb372c119caf0918f6047bc190996da57b0e6f2bb92121663b994598790eb5572cae3329251f11a8e372c2947623db33fdd238803853e14c1c8bf9bf7ad3f3e852138b03fd43b0836e59ed68f0b76c37bc5726bd8462f20605681ebf260c501447d89aba12e0728631d5492c2c0a57c564ca626c9776208ab0b5a87d54ee2603ff0199092e1c3be0e05aac5bf457c3d710f612667aa4706bbcac54e12b0adf41bf2c17e8425c0cc3f9337e25c772f957fd5a0889ec20e628812d932b47bc20a756ce96d7f5c1a532a6f45d2146d88b9ccacd64c0d741c2b4444290d12e164e1acfea9fd3b4b6317924f705637034e117df47f5d058cceb8671bd88d29154b4edc1a380ad56abacaea33b1d3f493bedafe67a3305c96fa699fda68435c286585ddb1c8a0581362a32a27f397d9f86c92824ba2fdbbff67ef9ae85009ae55f8a6249541828d4d45da32037f2c7281c001e80b935404781e70bd76f5414397374399174194a82fc9c6562564b5934742ea707671dd39c49080d8c1ba82727c5fc8f240340211034f16d14bca7f45138a15caa7735d6889586d3146890c2b0592480ef2dfd49eace22b9520cd942f6a816ea57cf6eab6290ce6ac91d4f90334c7dd08195081520ea77fc39cb7976d3814e6f8e2ad2a2fa8ef2c54a06a3f891e196c810b0ed6f11d9719eb1072d7abc30698a1d11c0ebc22d6d11d6741e2644ad05c224296ae5899c3e07be59780f4ce68c13a50e240b212a17b0f7a5baa48fc44e936f112295a36bd265968f7b64f48e008cb17b12ec7a7a6ef762be0ceb349f620cb8d79e632c14774e4f636a56d87e9d8ca084e87fbcb68807d1864e35c1eb00745291654eb0e214d1d1727d73bf7ca9c0f90826720824e76f0e6a597771d75b0bc8824bf51e49f639fd10155b26a18daf298666c169e29fb4cafa11631d3cd41d1145ef9723ffee0338b4f47cf0f44f716d375200b67e1f567d222e2709c7f3de272178ee22b60ae7fb711a663a40109960dfa47faa50a59b4903b9c19581a9f2141190d8f40495da44394147e5029a937617dadea3dc03d4662115f393e38173d2e8a0dd151842cb098939f1ab9647c54dfb007477c5f56b5d5e0ed616e6773d5b26bba1ff0fd6c1f1df0974939f13c509980355925580cc7609f98f3232b51b3d19c9685c5ab2ab26015673b3e76aacba37c86c98bdc9e1408d82ca1741ffb92747c27b356c46194c63f4a919a322b52422891f094221d7a9b8a72cfe7b3f4558162233133bee7274e34aac4c8faa867cbe30c9204437731ba53679acac02d8441de30e296994cd2ea0b5f1b476527e3bad1377c103ae6d323bde535ad53aff6649634ba5eb43c044ee914a801c28561730af15c3e991e0a3ad1abfcd108e02e46fb08ce4a118ed5ac9e1520d6747cf8fb6429033a166596f77278137cb66a5b3d4062ee9fc206dd5c5686e928475333356ea6aa86a9c4edf987c78282031943db8b997d7b518a98b0ed56e7e058d1eb846d1987f56d703f3ce4ace613b68dc0145724c011006df741018eb26d3a90e4256be98f876ced0235a25600fd8b4aa3c9fa19b483eb83662651adee001d345e69c6199874979ba9b8e3c12a200b355e0d8825fd6502ebf4c29f0ccaa6a9c5f6a27ac8bfb56436e13f14d9e8801ff3b751c19994eb0753499fa12490d27a3dc8b33b0fb8cb6e1905bf0a140b1b0fd4d62cd58ca2cb7b706eec4ad2bee14454502f46db72d403bc7d9012483f40d78eb3f6364686deef3faef8b8502deda960dce505f87fc8576fab64965c6b41a18622a2f4d0a14d85e221fc1c3c50c0fe334406e56545cc3341756a7be4c1e4ae326cccaf0ddccd599893591b88f841ee2bf5daab39a2412b1ea1a97dad2cc38611531063ae78dfc0b2f823a3f185f1e2a3c0f5e6e2c1155090d73b1105873d803badfb59677b554996c2f0bc1f443fc266a200715184fdb375313f077c5ab4c3b6ba4aab038c2691a3069b2eedaca20ff3d23e286d81b0f134a35d79f5c8c48348a3a57719366a0b237ed724842cc393f674f41a7add14d075951c1d17fabd91cb19c6b2e38d278af2f89f6b63d9ca4d23e15a8dec637e57f5347ee12c1512e0f1557e9ddc3d5a8876ee18120d76f1e8e3c7f1ef8d9a605ed24d02a272de2ae89988b8bb55a12b0a860614b2c1dbcc10b052c0f89d638c88e2278c517db0b05e7c4e8cff1ba0c226882f18598bba1dda5656e286f9d4e152deea4030a7ba3df174f20079493cdc636c458aa84f0cb34640aa41cd1cf39f9aa1a1f06356ed6077a009286102b8b48f46a32cf6ac68864c24aba18b2cba7e61aab172d81fe4c8ca5ee8ce26d2fbbc406e8034482a6b7cb1c4911e45cb5e8113d1728cb38c84fa2c5113244b090f7d56e245e2e4cc216b6c59dd1fc2c0ed89b82ca88ed8d14438c60445c003e238b47cd90ea0c1586498cdb787d1d0fab298b2beed5469cdca5198b93bddd36e479e7966a25c03f065387884e7fb699d3f64b167c2413f5f2730f595ae70f5ea33cb3e83ac97efe5c79e3229e29eb3ad9c111f91de4f4619ccb19213dd4fce36efd4f6c66a3c2616cbb90094cfa705fc96c4b458990ed1aba8af4578368386235899a98dc4d8c2954ea2d497c03f0e1b714c6d842c5643a49e39b1cae22133f6c4e89a38f679b313cef8627fb3c2999b3239ba07c7c3611d9c532f63271cd876c48cf0df6685480d570a5f978f5297d3485dbe2cecd3bab699e6d5db777e46a16cb612eac8fcc1046c422caca3a28553e26ca349cb52ba23b89527cc288f4e06e0231657887a1734a8f430ff9a126d4bc670fc6a1d4325d3222bff9cf029ba18a82db76b42e7b558e8460f5c1c437d2a1a9d287831901a3657e372ed681df847ad4840b47e2f98b23b6ca1a08f48cc0cd2634dd6caf5200c7b4bdf67de499289a96f0108b3293a5f97c394a597a1d59c793a5641f6929fd633b42b201cc1f29a877bb2479c483bb642a55d4a7ca6471338e976b32f1e8bf01001e85835146792c97349c93342c23e0d20aad0a038ded2015b1c2e264dbfd3b5300c9ef2915d87e1caa91b44150e3050439c3d2a19d4242f3db722f7af3a246945c93b4250a5c1d2aaf7a7d5805cd43e873e2a7371735c81fdbf481291e92b3e05d0aa7cbfca57690b35322fd17eb54c58afcab81b411c08d5ad057cd8350d3fe5ee1665f50df4e94073d273e369784d1734359f65be9829bf48d8f9dd9ffcaeb93f8e0833966922158ad741e52c13bf6b202e8db773f13511565fdffcbd9d97f016f87d8b623d0b47a1577f7f16291cf5993b20063d9957277411361a8bcd1d86e20930b1069bfe21016be478f0033e8e04a60ee4cb22e800f049ed078b0406d9d2aa1bbb1d075a556275d61f29c18b93cd98da9e6bf74276c96f8249072c55fbfb6e3af297493a8e36d0226a456e40b6acee6761c0d1eda24c73857dcb5d6dd09b39abf76e12c9414cb5f9bbcd9db12bce75128fd04411c462c801349075c5647339eb1ab30b5bfc3ae3595b3a3af97565d3c717cd7134550ac043016eeafdbc38885f7e2456b7df942bfe65c5d1b7aaecfd8ed19a1046c9e9ecf5cbe50fa74543b3508707b8a55f727f0847e6be9e27823f9b7103767e8e0720ebf67840fce2560008b80c6cd696962994ac076330de23052a75511efe1bf339b33474b93d492f3c94b59de27d438617653fc6d41829e70808aad7a32439019febe8f077191e38b31785f6fabc3e999e97028e0105a6b6f91337034c1df47f14f9c932ef0178d72c3e009556cf7c3d901c0a6ff67023972373718418e07330bcb7870fcc3c96d355795f8ee799a7607ce96ea7aaa3bce9321fccd1d0231ab259a8a9fdcb9072e86e29d6fe0c24d09f7b43d6543f87e4b2d9389d60075b0575ec30d9b5a13a3c78ed0666928439669b01f75a4a1bf7c116a75f8a266ba63139cd72e8d03bffb09ba44129f02ffdb38bb3e9a65d446b0ee6acf3e90d1d613f91d8fde09a7137eef7ead14a6c5887327c603f45c6b47d5dc50966efd7cb1825d8b3c96f46bc9bb8d907aaf9078798b44f5bc35c785da84e389c2afa262429e9b142582ec97038964ccf0268472e526e168179971479c110bd975bc64ccf126ad0c801ba9d6c1f79fb42693ae8103900bb048d188d53cb020037b813e4f13002355a98ff3e7b10b38496dd6268ed6121ab138d62e03e7a1707d5f9643b0fdb6066b4e090b01a95cd9365dfe55c9f77a55983be74a42fec61b7d21aced0e13f31cfa60244015ef5a4d371564056965843b0ef721cc06b0937269bfa5dddfd7738cdc7c7ca422716bdc12b08775668d13c52d1e4c193991e5f7b923fdd0f8ae8e04fe0a7a0ab5de7a0a2e5043148c6451c75c045b2bb5d88a628c42b6f2b8397eb81c8e486af0119d36eee1cc836466741b04de22e42e91c1c79b144f540c3aae95614751c99ac89cd66fb8dd224341af4a237eb34733ea8a087898069f832950d14817ce2019b1381dcf23c0cad45844b4f7be3438796deb015c5878eed36536f69542705263bef8dd9e02559b6ad65db1a1cffe154fc62b22792698aa39b7d4f62abe14d220fc19b7fc4cee3699aa1e101d93a49d3b4d8e7e4dc56cc91fab8e032dca73a09a616613b56215edb1b1a909f4f490c6a60467754366f97bd3722f3caa85d8349f2c8fc71730a3e6682a8ea46e3c33bc32532801f2cc9d18eb0ac41192eb22e47178e33ff75d7db3377f4adbc0cdd82f0100470f5daff73b04786e28b813328d5ab132344b4d003ee5df49828c7f6b88fd2f867851e4a3d4689690393a4882e785e6e562c8f5df0a3ccf52dd76c4d4f6257fb60092a4afad1231cc292e8f084abc90f725eb168e5019fa2a3f0fa20ef383a2d8b9741f081493792529fb6c38d63e4224ed4a3ca65e320bc5c18c44d14c1c404db275fbc55d95084bd8b67808c9901702cd2d3bc23540a2b311b0353d97716a10d9d085879270ca8fc359bb043a2c7831160c35dc09f56a656c8a2525f001b4ca9c759bc02d7f2b39956b2bef296cbfdd9ecc5bd94f47785725cfef1dfdb1c29b41a55d931c21f75997d35c297900dbcbe70fd2cd6f0f62f86cb666d76c4b55c4a418b9b6476a8e134841ee171179a9a19e59ab78b6eaae0ae89a9fa7c8c9dd5e87147f0cfbc51e88af4af929983b3c75f09ae282538f2f211b36eb571c98bd1345c7c28cd602bc2636d54226199ad599509bbba6a572c4bf2f57224a858f55a9215d3ef1bcb5fe25eed5d60d3cefd9153cdf7bde0e82e4cb01568bd9e0c00505c3161f9353aba75d97c3b7b2fc0ec251cbae66867664dc830fac61dc0e0734235e51783443842bb825fe1d61a795af92cc96b13dd2e2e9e9c20c7203b3ab3d4b8899b2290c5c561e017054dd88d5bf0157cce862f98bd4643783854d51be06c4cd4347c5da2c45f6d16f347bcfbff4a4fd674ccd5626c0c0b04d0ead4cabb43507077d7192207e7844758eca5f3ceb8b82d4ec07d30fa66ebe47c0d56ec1d1717b2fe6a7e7b95dd7ac36eb9097c0cd8631116da273b688b21f41fefd29f613953b453311ea97fced2c915f68ef182f4868cb16d2b8b0d566e49d41f941db6c5176a752a5635f70b8a608d2399d393954f93df632f4f9f03b68bed75cf972b3721686d04651f3f0116053fe08b880516fb129e9f79c209833251a401c7faab62758809564c0401027839add4f4447c31a934459904db885bec3c2c76d11ebd43a7245f7d979cde08b69577048bb5ca005184f14c1020a2804e2881015a30b08a9f5dd9572789abc9474545cdee87ba7951725bfa957c31f758a62769b7691ba9936020b7892fb112f453f0e4f50bf7f9180d24c317c726f5c32932176a499752fb5771774cd383849f8262c049e551d4324847eb68878be0accd87edd2afaff8743e4389c89db83f6320ca5b21155ed13c4e6d25828a20553199040e75b874de287414ece8c02ee7cbc7c5e54c3b46d66ee501a4b401ca0905395d408c519b0e8a205e38af5c17d68a17f6bb355aaad015f04ccdc19ce03bc4e11e7015705d4a37404795b8826461d300f8678233c84fed5b9a0e70c0588114fbbb4c623b2a31af02c8dd87e26a1b1902df0b14a18e64b73529654a524a19eb039d0328033c600da1a0a307ab8d53d49420ac1b8268d951a9c192a34241acc834c384648dcc18f960adb539f05e1fe4d0cb12d011e5c4eaa90a8f1254979d08542b84d9aa91c5a8698525b2058403135f950d4c587ea040162e476cc00295b59503017c8874c2097f2ea58880bd176234a71e3634b47489d206033acad4e881ca19a62c5158388acb859c9ce7b33bb7d6dadccea241626709b6a89cb1633123c9069c0e94d020eb2011910a56497a54f899c009905ca192eaa282561b210e82cf8e0b07873012cb07452d92d185b2ab376cac97df18decb8509b4ab327c6ace30e94961fd6068f570e64a8b8fcf2e864944c86e16257956e087f7d21a3fff327578f2f58632c1bcf0dc9a426806e511a164eba525c4745273347237ae5e61700ea7cb231401cb01801aa2260e3d0c96789ad24c2e61915251531154a6b904b21d8054374c21436fac7123bb1c22dec78f0670068959e4952500b3c9bdf776fdf3b8f7aa2952c5a2302526186bad4db2f6286beaec1028da63b646490f26c861c90a2b03266bcc70656101071e416e93cc0caffebcb7cb13c9a6f7e3ffbfcd111c367257b5dd2200deae8c18cbf55736fe47a5f48429d325c5c98a09571215ad204e5b9c87e640604bf06462e1377780cab38b002a04b2b0d2fc08e9116255250743d6128f141ecef070a5b05efe23bc4b6c684591aa31f81ee60670a2390f332505390c095ad343ef5e19916543072818a640f9a2e4304819a9408494102c87d7782f24c0a163071532415236f03285ca490f3c62bcb88f0138a9aaf227854b95b560e8eeffffdf92b05162fe3e60b275effdc9eebdf782f44ae85e25b938eebd37cb2cffc5c94ca25597a629a92524a8a1ca951380bc9063d32385cbc783b03460920ba706504d35784d807c59238124453f45607e80f2d1c4cbbede23440f0d275662b0e2ebf1e3c2e40a0e68aeca6479f282ff6437e14ec4eb7d3f52383f101c08e999485381cbdeee6564f260f7de7b350f5c4567800cf14133c34e8c160f21565a4c6451269c07d5d51c69010bf7de9bab3912efa07e9cd47b435a43a946d38dbd9103e84ad4161a32e820b343325a12c60894a22940840ee03baacc5b93d820c93fadae6691ae2808d680a317688fd4ff3f14100e18880a722f460407890756c10f7884e80945a68a7e7234d07019a3e45463cb162740565ca81cbe0b1ca85efdffffff236007dbe4baf75e211dcd91424138530f9a088153e8def0056373af8309b5aa6653ae2c9997d20cb3890a0910887651a60be50bd0ab53904cd9f9a48bc2c3feeb3093161c973d2589f9c1c29a3339a0352b44598145e920db75ed6ea8b2a4644483ebd8e0e8694696225351b0542c3d8039c150960e304b557c9e43e827fbff7f90cd64baf7de7b3ff3b93e4bff7fedb66b2fae4969b3bead0828bdb6eec8366ddaccf05a71440bfd220a753bf50174daf6706729f59882adba766cfb0ba4e47982b3903109606a9bd55fd034d072a4c5041a6f09a4a9a831de96ff5dbf30bd228ddaaab619e57982efb7628cdf2981c26f975555c93728ab39535b9550a01e53847a4cc078623b09991e67db6b8eab085f7a7405603de21b3dd6eddaf5941d90300df042f6f60d487e4028666aab9a84ab6b2e4b9eac5e7d238e748fd20b8e8923ce395767aeda4e8c26a44b8902535bcd0fb07be6248aaa5fb50c6c80daaa154b38e1439e5a45bdb513e61e6595f842f6b66b1fd102b7a9c6ed9b696fa04155306c45c34ae9dedfbdd7ef5da2d65ac942aba7e58b6951e178121959be78f945916187930bdc30e3888da62527132019724477f49aae4ce065079a22412d4c09f3442a089519178e3c09fa32e4d55a6b6d0fa61ebcbc46aee05599786a33a60368764678d63851218a48d5db19698a72438d23fdff67650de5185680c8f4c02a23464d56578c042e63ae5c18e25b410537c2429d3c3d2a73fc9b52bf8f4ea3c15c929249d92591bd2530314e15e4f7de9bab39f2de7b63cfa493533a6bdb1879ba8002f5663f9e484961e0c4c3a49a4d14ca15ce6ba88b88872847a4230a221222da610140a705a635c7308de9faffffa71131117165fecb6a425522f960373fbe93611374b500ca784025be7f3032e9c198ad1f75ab1f38dc1d61b02331bb485e0f1629179058e9f1b510e573830811b8b4acf87e4192fc1cfdbfce7d9a58f840597baf452202a5c4347a187233e96a0485a12775d7c8ce02aaab415f85d8fc50fdf4183965d9a1378306d696aede0e183030a25d3f6c1753acbe0e97e5c3edd9ac57f253d273a2b404232652140d7269c17b9f5a7d911e2594442a25e60e3fd5f57f6d95ba7fcbf5faf11bbfff7f5ecd9118dc41873435e87260ac2e8e1d429c40c1150f128cc112e5e3bbff7048a727afe6acb5266270e10a0be1c17526c606dd0d8faeb5d65aa42aa42ba4ad2e9edcaf38a2fbc7f7de7b1d8bd644694ea1e0bd5ef8d629494c2094b02c6024840b11263d348ce9f2abb26404c74f942f2ec3ccc807abf7dedb7b0f7ad9efbd61133a15c25318326c928e0cb1e9e04a19ae2d696ee07066c5c53931385e4466fa5485e12ec7f3586badb559319e50b53af86662b207435bb0295914fd7fb863337739803b9d05a08e74e1d2b5e48a56d32f8635638238a541d202e144bd3aeb3520033a43831f5050a6c9488fa5200dfc7035b504074f39e7b1eaa8199f30d3ad6df558654a68341c666aa60a6905a766787cb227791477b36dd70f7b491d59268eb8db2d268e36d7a1dbb74d30e9d85f94f5c260f1d220cc7d3548633b0ed83017c17e3d5ff40a8c406dd5c50658f2d4321443830f97bed8b434e09a74c1964cab1e7dfbf42df14080fda223b1d3e768807ed3b76b920ee3d80defb5ed7b6fb494316c8f99b6d96e371c0e880a60e2a85d549d9928d270448ca58e02ee4b8f1a5b99d5ddd02bf10d2b0f90868f5ef19283d7af0f6cafb1166e5bfc764b634a0e5ecff0c08760fb4f496fa44431dffeb5f7be9e6fdf84706bea7f599d5fb3a2045f7bad9602489e5aee4aa7ef6caae719a15b439c82936d7596b247da7e2d5d3200ebbff7e268981e31a8c74c8be951db6eb812aa0e8e987138d9ed7663b3c5b40e693450ac9252c5b63b0ed856632951e0e9af9a9436d71e0321856ddda902c6e9ef6308b6e3305fd9bb01c2940297bded224ee1d227c3b3f7c6c2cd8a4afe74cc8ff7b79215eb9a53350fabf32e67e998cee9d3b530c4385f8cb338871987c3d196d0709869be3a65e2a7e5bff746be57aba0ffaff7fbbdf36b13ae49dbfdb6b09b76c99456a4ed75687b0542eb0e5a6f50ea03d5a9bc4abbc4dab5ab1e5fd4a4a4ca0bc51183e29869af6ab3edb1f26eb7dab5c7dc25625bb1e63288a1ded855bfd7249a444907ae49b069895c8deb8b55579d98be3ad764b59b9aac39af1b886bb8268332c6612d5f5d41517cfdf2c0be795fed25bcb635b9edbde28b5b88232d47b686b78c9970db2ede5ed47f788e6d2f66b9ec943f4bc72f6608f06145cc6c7bb5f1afff7d66f5ab8635c63a2fed235ebb7ed546bc7e692cd26a4ed5339ebffb8e03dcb76f019dea504debdc533bd52ea60092a996bbeaa947ec7060c48e8f1c90d4a6695524a182ce1e98433abd66f5acc190316d2d8bb4fbd22e8e99da68aec7bc67b4574dc6111f5d63cd01bf1f8ae0daba96bbbaeb162e5ad1a9ed451913402fc682ea1adbc13acf689386db358ded482d475a8e9e4a152841290210d0fd1a1c61bb96246cd7b202fb61c8184f6c0b636eaa2d95188fda828db3fda58373c7559cbf44893de240f86dc52c51548d018f698204530ac298c0012108d33731f15e18f529fc8281e108b89f308f10fec01fecf7fae1dffdd19668341c66772ca06bed557bd5b48a31e8f6aa46ce39e7e7fc185f7bedd33ca385be85c2070a1fded37249a1a8efe90bb98f2069cf1128ede9e3ef780a457b54076b1769d4e783563d12fd5d9b2ca9e40935deaddfd5f177bffbddd474e86ec1826041b0a05dc7dff9aacf8d20df769eb5c183439ce9e3170c74710bb38d768446c361f61b8f9aecb65b02a84e2c86058ac168f896801876f2a8f8600b4c93436aab2158bbb9c85666f796ad826dfb61f665b1b5369dccb1b097c5186f6bdfb65df47a02b73effff61e8e897f8fd02a0493a762a50e27e563df55bd1eaaaa96bea5574a901c89caa471cc3870c405e7d03f0e5fd1da3e04478ffb8090e330ee1ae2ff8929d8eb029186f061814d8d4cd440b13c69360a4f8c07821741377b37d187391625b6db56317315fe8037d36dbed769fa4c0c9411149b1c1e94df08bc4b63ac8eba6c44998a0a26388840f0c48679452ea4e5f5f7d4559f32c2793edd136ab61524a84c32de936a94ae2d13eedaa6dd2119b645b3dda2712fb33189a36690af976d826855b56a86c8966eb9c502fa9f69a446b23dd54c64e06d29e14860c1aa482ca1a8c1a065dccdae76f28cc745b7156058097a71e6795e4c0dddf7f25b822faadc1f98a34d75507d4ae6d27a84e882bd2af6c7506684ecd738ae30b1c7d3da7760f61cf08ece9b24a05bdb7468bbd5802b5551de6c8aea71e65d54ede4e25d7b4cc71db08785bad42c232b63fdf5ac7985a5e5dc006dbe66c5bdbd6826d71b67d6dab2d9108ed8b893a1435288e1a268eb65908eda228e2a4cdb42c3eedab1fcaf6508416f269bb7ed1ab9f5eecf4695b4d633bb22a282a98209fb62ea47649951ce50f5632e0af8a64d78e65981f767d712651542dc391e709bfc77cf5ca926186ab595577415e5b6ddf7738066548f1756b4111f6d25fc2b6faf5bedaedc57eafb59a6a2ba2f07b67f9a463fd35ab69f55fe35a047bdd44d7606dae88d56a39fb75ae1b889037ae61a0e6728235b94262f1e2400c51d18171db454c7fc796d5f48543b01adb5ab63604cf3d5a4ff79c380eb3dbb6dc0550e2aaa6fa45a9dd7dce266e797048cd70c1019182a8048f37d596191904800023170000180804038241d190222749e93e1400093daa90b87c5038228f86e280300c0603c280601884410080410008831880a438c693ad01328aaf397620091664207f82c8ffb94c94ca28f2a22186b8faccc921abb45221e07f36c2b4ae35d6075e817f7cd1d7d5ed3462c30e02f432630371434ed80f71e138ad96722dc99a042cde33cfb032b8df92f685ea1dd8e62dc586836f38f0019b9bcd32db88e44f0e274d264f0d21baa0465e136f67efcb5b2a3a585f3c936e80d5fce88afb44f630c9e488b16f56ac8d6a7037952b640bbea520cb2d677917217ab1f4466f6fc1afbb66719be1519965bbf7aa6fdc1ee0660d8c2c632f97ebcd738946b4fc2bdacd00af9d069c1b36467cb8cc7b563768065360989ce863c19b78899c4cce121cbdf9c4c2f201ed318f087f59d4a61b795d1d1d98a5bccfd4f5d45d04d27dc75a8eb9f7e7ac433184f1a9405d29e22671a93d954c47ee3d7487c12561fa74c0c3b183b408f8db10cd64c56ad8d12ac0ffa52a30064f2bee7185992c4d6645f1f96b048d49f25bd79f47093bbc8932f0bd4ff42955c78e25d5e8ecec10187c5fe22f9f93810eb97201aa55732db3595ecfc6f5c530a0707c1a3fdf7c029c7509fabc611e09f721eb827ecf13102b362fd64985c89ffe03253bd4a8c3064d8c68c81748cf6bcbf3de041d29f779c7f39d35caf1fddd0bdcf625d77f1346f3541a4801d6cb098d212fc7af044b0cd7dfe6bf29f14226299654e33380e9da40743f09aeee05a31f884fb260e0c1703a4cb95db670a050997290410927a38b372aac51b29d2df8ea94daaf3429e68c5b99f496ca53baa8760dce0fb643abf0e80855765b850f43ba013fecc220939941594c7221cd500066b7f5811153f634c79e89a4a73d158da084072923c93eaf0dfe1b0508f90a6d65f10d7232dae76b90f6d3dd288c148863470f32a4810c255908d57669b4014efe425e08b03995304449fcacaacd1ebf3ce9f1635d4dd9035841a5450718d61dc0dee679baf7b18eec316b0944aee2c40c72a59b1e276098225f5fd13bfa26676bfd6df65536e7ddfe83f212a8c8e1b3fc1ea2afe5f4f79daa680e6b30a4401d1ce92300f12e2789e0e7869069633beb3aa9381300ad6f5df8faae2eed5e0256f53d138d67f156a4aa29d1d201fac7db55e5c61e8aae11048034e184f8bf174d3f4c72978969b47175bb9a32484a6a68f6f386041636ac748094e56be01077ff23008e62cf1095e22f52c5cf23f5c63811fc2460863128ce05a1bf80a11d9991fd0428b96d878f1cfbcae64e2eeb770b38033b7c5a57c3e61fb8024798589afb5342f8e1fc235e2b7f9608aef26e53eefc49823ef02690348ca1086f9e2fd48a34f2cce1d866d919b698d801c7fc180915d6eba48d1c623b8251c4951de9c198d4a4fe56dbe0526205427f384fdf44e430f6aa09afa84210a75771a59b7fbf398248240ca5af1c22f6f82fe391f1373dcf50d07fb84540480ea8b8dbf0508814fce04244a9726e6f5664d1132edd91c6272c22e5fe06249ac4746a7c1759a0b7afbadcd1fdd7fb2edb439e30ba1f3dfa80e38f6302e0f3fc4a284e37d9e663d1b28725cad04f9130b144f1563c9498a89b9c2ea81c088295d87199954a988b1dc718228b1cf5044c08428e09abe2d9a5fa9d48be79fa871c430052b268b41383f6c4a31edf76ce800aebb03635ab1c553ad6e35e05cba81a783ad25785a194a733182cd70b76aea02349e3a44e6d9a8ca03da5c80ee8b93bfabf45945d8bbf178461f5ed29644cbe16e1fbbd1da45a509e43992cb14c3cb6208db1059f657bc92c64b0762cc081b5912136885d1f7cf0eca27fb19498f6c7cb9eeab7f0a2f0f99c3c9b96afa3875202f7b7186e443592104dc565c52cba5a0a46f5678ade27f7df7e3608a2051b11f84db4fc74ea16d5228860fe7e63e0f78a06722b004e396441957ce8c41d71479347a710715018002e6c3e52cb15851666b40ec8d663e96ebd02995d54160aea95b415c9751c5e9a381ad742f5014e0037702404fc936a723aa8afe2f8901eaa085c147c8604ad090a228ee88f8ca5ba584ee9418766218dc0dc08e1ca08c285810074e0b528a3eda68820b94e4c3fdfae325973ba9d35890e39a734784399e2acf562822a37918cdd15bbbccccd229d53c22df6cb89597901e7ad88f9d89014dc12cddd35c2364675cf36a0376cba1a19f7f3d451a5a7cc1d9b19d059117f930ae6bed8168ac35d4dcc82c990d882a13ecec1ea30813310fda9f896d00c796827c8f6a8abbce87ad27abbef8415b035cd2d4dafdb47fa28661237ea13133512ab5528158143f2c98d192221fa797a1057c56ae27630585cebb9879c45efd051dc2226798619c0fb5183865ea14ab6b14493ae99c047be64380d4aa93b8d937edd347b49f35a52b29d792bd03aba71acde3f72d8aae259e6ad6802b9c652d488470afe027349fba9c8501b7d145ae0c8060c49a27f6f1e8e469813c9114a05dd5ef2b0f5e819a13bdf7b55cbd09df6de38d44d6b0e65deb1a4a0e4896370c3984bb294948e4c759343cd6721b059239ea8db752511495f6afef090cc6808b968af86e52f32592764e1ece95bef78a2901c2f8087f602a935e51deff865400af364b63ddb96c413cea3a1b0aed04199fe019b95770c407d546a19b37a77f9f892990abb6305a248631dc2aca362f2c1ab7da6090d4ad92eeaedc4fa2efdfa78f1d6f0714c3d7c6a3093758ab9eb66ec764f325993e0f9ac1272935f17fb0596f077b8495a9b69ef61ff877c9218321caae66e370ba96ea88c5bb1d37f41adae41172d190c8d43d743d0a06bac476aa64e89181ab9273d8bdcd7a29b963634e92ddfac13d2f53760f3939b8b70508dadd85b91c2fec4649e471afb7cd8b3231c98794985d6c0c56549b05d31be1111757d4fa778c7e65111720a3ef8f8fa1f6b94c0a62881977f86468a170233d7ed64229276ac57943301c9a89400a791b6a7b1a47e62339f52fc5ef4e7392c50e96af9f2ce54e2e08c7f73386b79cdbcdd41580a797a7221ea46bc3dc6f4c88ab94201d5e363141db5c57882ba095abdf86cfced2218300ad66af020034859221532c665c96a3a1e318e1b491af6a6d15ab43ea92311d3df857b614537553f9c38cbc517122f5945cca1b09816b72012e84489c8267f5347f5c9d25f9e93efbc0e1287f41be474497fac89341c26037655dec10bfd020e7b3d992c91c83a9828ab9c4139f8d4d23db3d44a4b669e3cc1e4c2347ed9c9834aca89f30f07dee019e5049a3bb80fb89746475f10076810ab7c914222a1fa1fc7ecd2c51fa224d8a7e922c4e0857f1f75dc553851ea8fd52912df3b5f853646320ec46907143d320f19b0693f0a24878f515c4f6db0064a5307d908154a97165af06dbb33739f060084f8070611628aaefacc11326cd62040c0311e2132c3cfc43f9888ea5321e01f62f36153afa6424558b831f824aef414b2338baca78c25ba12775ca0258092f7d4ac5e8d7046f98c7fcf8ca6e9dd6339ca97329ce13b8f0c57c54f913149392c07a6fca8a68dedf3275c601ff373f58ef970894cd718731b15cf7695380e2dcc6601d53b8d00fc166620e344efa1aee634efb72b85be6577a2d02745f58170ceeb96bc849647fae47f1bc71bbddc9c6e7432c0c40e24515d943d5a49519d13c879db8a9aa03b2760555830dffdefc5c09e859d9f77fb9a94003ab16fe52b10eb0b68b794279fe6178578489445d71b45fbc4143cc0466e9ba64e906d51cb0534a460f599a043b20986e5d6013355c6f96803510a41b7b23909befc076b68f9717a0e62d1fba28fae413fb963ebc7acf0bb208476d5b2a20ab671e7d14055f73b92da8bc0ff8c1dd2403a7bc17eae46381116b91aacdda11b7b457d4a5d5478337d4c42292642b0f3b60e7fff3c63375784b1b01102876831d9ef60e790baa1ed0428f35983aa4013507302d9918cbed8eec48c6de212e0ea621190385e0616529639548508b4d557753f8b8360f84e46b887f3e9cf9dc79126a4da56db92b521647ce8a5ef2ad93c2c56bd850a18bb1a4bed1e37c2ce4a7350facec3fb3f42dfbd9bcba98a3016de14fe91f8adae815d20b2d3335527e33ccb461d2f5fd269ed883a07760e0c55a97737aaecbf9a80ad7011768fc2bf9a94b9f5fe1eff408e0288463c22a71f5ebf7486b927d392fb14ef2b6d5cb3c48e78070199e4b5eb79bab1791090d7139884155624a5a1f51314b38e3813eb4a230c0382f0aa583dc720705b7b670b4f0038241c509cf94e46254041deb893f890947414600209902fa500b02c1fa82f4a37e471f17cc1def5d60897f4ae7f7b72c4a5de99ba90f6febab6bdeabf1389586144a85a515fcc1e8d4994d59457c6fba34beb541515b1f30f129fcab0ba482b2942a864c5fb101432851099b6072bb88370bd1bda82007214b4c04da8a2408ff33bfa49ae8ffeaadffb6261ddde4303ca44015745a819e2abefac1670e771d607bc0443449ba0603846df818e6e8e4e2621139344ae6950f78f674a0dc51e51ce70ebef4511045ebe0e08818b1cf0f2ed0f4af8c4bc468046ccc440e12843f2cce110ac9f39d6210dbe4367f91217a3f5ab4b29af76bdd114c558dc1cf807ddf70552f17b1458ea929f30aa187c21a6c7991bd0f01e316b03841f800980393197e090b6b966ca3bba3d06d6d6a8164f7a0fb739db04ddbaf3aae9060b445b9f1c108da25448872a6d5d31ea5bb424b0ae9f1a4247d5b93892b1d48740e55d87499c52092a5a13bc3ceb0697b319524a371b795763744be76b6694e075c96120a11b6028d0a068b41d2ac5429da64e47df90f5decac5e0c2d73ceb0986d5a30639e7e8fecc50acbaec856bbdf78156c1c728a82eb89a02b59e8617d1d3ddad0aa91e2fd0a2bdf0f69c6e8b66231a0a7e94174d17c90fe586a1b83b09cbb4fc7410a1c4a559dfede27279f37c8cf9b62182997069b3a030b2c6751e28bfa11d205866ccf9431bd3e893f5d13568f8f91d7447e94032e545db9a8df5f8b6c5bac85948eb4e84acd148f59c58b706fc6d9ea0b25368853eefdb242a81456e813ef93cf6ac76aed1a1193aeefb22823f4f67e82a14c7ceee637152cb30614bb9a36f52226f9033ce608b8d21a800c55926a29d8559ce59d3868f53f9827a01160a30a12fb7947ad05900741251366d18dd31bdd7e0370eca3f65e7c281292701a9ea1cbfa2aa593c6ca9c2795e0eb1146e7fed9535c52545280d2f349700efcf9f9480626ff9df067eef44ca44e28a9bb4435255fbb0678fe9fc1e80edd8ce83fd16446139469f60eb30c4966414cd1c954fddb228f724c1ab993ebccf00422f51f3cf383bd35fe5f3c0324d46b3766a94bde369c0c27c6227662fba5a84511528ff210e0886211dfe777f13a572c24414296978f893144e99c709425dbde890023865f78c02d9683e31526b6efb8b6268a0bd5d3ff042fba895cccf2b4297c32fe725dde910dd9ce4c40e8c78d47b957cb01f2097bc8e3432cf77e62c5f90864c1cb20ba7462d71392f751a9b651c21b3a38d33952236baf851ba88f16707d01a65eb50c6331e6f725194f3170b849eb67c70ae0246be27898362f9bd75bb7aa836fe2d2207a811e83d525be6bb04297644e18b383988e57bd06671d4c887a4a417e611a07204f67be7d7e221408001e2fdbbd802481b3509672c8e1735627694257f342424f833f822cab30d5d0ed2d600812921ab460ad107c57c1d5170053d27121f62423e5451171fb06bb14028e939f5cb8238b2fb03fb5a90f33c7dd406c309c95a450f3a8886df73ed49d2c8e4bc9598a2390054a2830fd4fbede8b9c6493b2ea082a81d41d2b41c96b25504d4a381813ebb623ccebd1041fb34b3799a34348f9696e65e26fc7265f0020ff15990c1f4936b5df656b4d1eb8c82dd111f9347c734c284c68a5f1816e1281ae6142ab2a0433cdd477bdff121181c11d4a902aad3624ed435ba805c98b8ce62f244a5f18f4cd8e39302759aae7f5084621f998a4f3b0323203d01b8b83811341b659e7046f40b496d077b61403a639ae8345f5c2b563d691a150fa3b8372a7afe658cc9ef8fe76a1ee1faaa65b350324606fb939e83be898cd22c2dd9f182d5c83a5023f763f94aa429b0185c535af19b06be46dc8ba93a7a0ffbac931768ce7273ca014b95266c643b42fa81ef81936990549d0b1280d243f95b570570e5105067f18f7c5761351b05f1b45288e7c807e10436a680fe665da6cc9d7c9255a327f0ca2fad39b36fbe7843d1f2d80f3a71543ddfe27dfa1291f6edd60746e18112df0e1ac1260c5da93b9ed2cfc67a47b5f17fe18e0adc8a62880906165d082e0639fec5ff69cf6b8a89eb11371852ff3cde3984acc9f0ff0ded7a281df6dc5dc73f0075c24cad4852ce8b7c44b99e4cc537a2f23589bd2b3653d105214ec010903d60e1f5df8e488e150f036157c58dc7510d6c5ddbafcd65a4741db1283e5c718e3144ff44789c8ec06a6ee293d2c88bfd6cff393cd1a105e40e8e495a0d7d6a8e561b3cd99173958833acc1b626797f81bbd83aa02e3aa19fe313e9bdf534d8c256feb02a3c80c3ce7477bcab7d5059d0cf283c703efb50f171d6a2c0f73b2e1ab0e18dcf694bffa52689e1706e8973852a165ed73cb4427f43cd76c5145287be94df3a2c08fdab864889064f42d6aea1f09d44adff70aab232418839415dca01d18eabfd7a3f108877b9e7bb02973b5991ef3a77410fa86a395289afeedc82ea779453747b5316f2d484f1a4e0200b03e2aa925b5fbf36fafb8db8b9375e1a5b863c3fe7f1109aea1022806d55e5455b041c69b1e5004940fdbbd57f6440ddebe8ecc3060a67f07e8e0f1da83979abe9810e6db6c980785e2a2b480abee610eb3a6610577dde4c5aff87f99953a99a6099fe584c2eb05cca058d42734eb4a0ef4f9e47a5c58179f1c3ce1342550f381941ad50ac12b8dd57ed4d3301c94f2fe085cf9ca03c903fe6515142134dea6740a74d788ee0e0322c86ae99780f55c3e430ad637210f0ec3c045dc5f5121b758cc8344620eb70c7e14d718c1c9032b9ab0a746b424ab814422a64b21c3556b5b8f5e98eae6a482b100d9e9b15b00e22c084a1a07bebb71ec2e3aa80ed8827b54f9d84d1fff19d0a38fb7cb8e892db4f78ff7344074755dd282b0c3433fa93014265f6c86c87215e6e574f717f92eaf513de41a1cf34991defa724c813df3c37a92235872cef766d7d19f30ef901d580b04e63175102ccc105d33fe434345436879eb2a67098cca443209875294482444062672d78ba5c8dbc515f400648ddcc7174eb36115b5fac25d91c1d1c530b163deafc5e8e80b6ef5d4bdb9f2f5132897b3a7f3829d339dd8dd7765d3a61a762486840648e530d893117e3e5afb721220b3007d6966b7c8d5966072bd2a2715e00f39052f41c9d48eb176766ea7fa52883b7d25507a65ab652d763624857916afdc6980acfedbe6ea8bb8c3537b8b87bd966f454659bb33ee31c221742e1eea303d281127693380c08ea0cd422e0613d634f881c83fdf025def8b6bc7d584305d0771c81d919ac971518aa59fec9799966f56a0832161988c67094f481f9f954b5f5e345f29c967520bdaeac58c9530280415c7ead61f2546d696d0af67a7e20c4e3371ad15de84743d7749e65010861ec3155b45bb770df901591c56bed4862dbe5d76ff4a08efabd4e1069b63ccf4f54f549586d86313cbbe1baf95bb2f35dec7dac356d5246fe4261e49f48291195b13d124c751b0c637d8a4923d5c9c0aa231c186e8a8c39a66881059a439dc1978698e53495dcf923f7b7b75ffd0efcb32dfa4780bc3e7720fb4cd0a3beedb1a3f120f5c5f8bdd7ca5377b7dc44db7dc3dd9a411917dccb976aa3b92f6dcc288f38a0fb02a20dd9eeef3b483b97ef0bc8d25597fbafc64d744a569a634db9b81dc081bb535862e80201cc4c1e5cb7555e91f71843fb83428311140cb87461531dc6bfeb3609a34a1236a9620c5414c398caf28475aa1d57c78d3684dd8105ebd9ac96f805ee403b3f26c4ba94a6f01f67a275ccd8ae4898ea2cccabe69a0ae5e495a10804dde43d8630e1342f5c38dd54b8d61059f9a7b6eefc77224e050db996eb53dfda6505fa383b09c9e7493861801aac120cabfe91042b053bf149ceaf37d853b6e58f5b38531aef3e7fc045cf78bc8d5d4f14d1243d37d78738bce0db85618b6c8a6a96dd4800752dc8abb6231202307821af9260036071c764e46d05faf59049224ccef2e20d4250a8b48f347bd2067298f8b8202075d80b37c6fb061fd1bf95caa60d7a53ccc4f9cdb445996cecb01f6e871a1bb138a3a2c386dce9e093adcada350562ccde0f31d5ac40fb541eda1f605e63efa97683650cb65a86ec6f32cb347ba5bf957605dedf0adc6882dc8ecbd158ba4e5541f39e9a49e1ca3c445f08ad9d9e35b9039f7c0714786f3fd0df24c8c221b470cb1d08a395aebc45c1de45e5b293fa7404eccc40ea11b193d692e5bb20ecbd6635d37a461056eaf71bc4c1f4c643d4ad5622509d5b39bf389d8d083d868ecfaa70f26c507a4fae027ebc48432fb0550f0b92a1d189bc6ada460033c66b07caa80d54e34cdd5d34d93a7e7e59c81088beb22378deeed8bb3299b3ff6a1dbb4ce8d3b6799e404f1abb791c0075da5c109a306edbe6c712b48c18a95db7fca39404e38ee4b2d7bcae4d400f88c4ac1eba96aa8796fd6cf22df08491d042711a032b65790298050a42881067d453407bcdff4810edcffef83c83268bdc9a72cda4f46f0b110e20d71f07f06ef64f1168ac700c278f9310b405054f7689e58d74a9dd32d274b4cb0565f2bd6bb27164d11fd9a451003865705ed2273034eaf8d85850728275ff92de70654baa0f30a4945180d26442aca004527b2ff7d86feb0c604ac816996364c454da6467debffe2cf417bdc68b8f8372972df4882e131a5a3b3fd115321af3e28e906053a655f8728f3d49d86c43d0fd1ad74e576dddecaa11d214881f5763a1e66a4e390006606b1bf7f983ec529d67e96356ac56a52cd57794638c711b1cbce65d2e9a151a1599a67e6e03ab0400fd2ff24021ae5a015fb89e70bf92229ddba87043784b53e229cf88b897e8c8cf01c5c56f6d71ccc9135f074dd035349a1ccc51b87d4eaa6cdc6a302336b0b7556bd44df6fbac509b371495f4fb671fdfe29925aacb62243619b45e4c58535949642592261dd8c3552f44d6c5f39f4b8ce03c83b72e90614cced29b0a9811dd6a62468c17eb3951d7ef2609f6b7ea590fbb55d553adc6009d2b905a5923fd192990df7afc4d4c2e3f6924fdf2a414e8bb4c54e76cd1cad86b0dfc3d515e38064fe67f132d40c0b6c51df2df819f8471b592412c0fc16a83012c037bb4229143177258528a297ff35bd72f0ed93910d0f92793a5796f25c9a9440b844dc17a1c2e9795868bf36760b6569ffdbfb86424f86e666b26918df0df129bf1573277a9041fd288106f5ceca00f90f414305dfb2bbff484bf788a2f1511e13cd05cbb8e530b093f7b56c581660fd8e8636b61b37ac97952e9ea318fd7712c76bdaf5b9d02dc75c0b690bac70791587d82aade91de5782ea8d03ca6a01b1a495ff62b3ede97becc5e80916bd9c37bd527743bac64ac2e2b5bacccfc8e1086807722efbbbf1e152cc7e0db00348557c1cce740f3bee8e072f3c6b86e69853c38bd008cf7bb4c7f9b2f75ed1bff79779094484a87c5c279062723334312d8a5940879cbe5a90803bc0ba5cd9349e6351f257268d77d0c541fd446583be874c162e7959a657b05ed630f0869c2acda7d0429e7a795c65b0f70492a9d563c7e38181fce6f33a7f811d5355a8e9605e9e9cbd0530c36dfdf90abdf8da5dcdf86d8ba52582d0d84eaabbf5768d7b16669eadab31a7d13ab1279580cf564b32804ab6d3b61c770510693360f3d6329ed282df407b076856dbe7086dd48bfb4f8728e47fcf21b219a0d06b32048df2f97d7ad8df7da0b969962eff51cb578c115e18a69fa4ef186b6c7a36d1f6b33568f5efe59dff06230dc582113f17deba752f2f398ea453026ec8a454a087126dc72bae4bfede56c940f66c8d83e1e030f069c494af47efb6e5e1ffd7503179cc9655707d100ada4c21fa3182f4bf57584ff02862d350a54a593870627924433eaa1b4e78372a454853bddc14863537d8d5b145ecfb4949fc7b944a163197393a963533bd6d510f6962e7e53481fb18b8979ba0fe1ddced0ca05ab2f05acdab0a3d76c53932505144b0d6034612d1c4c0a4642289f6f325f9c84647bbcbbca6aac76eadc28dcb9ba6cd8dab0d680abae56d5fd9761e4c6e546fe2357f9fda784c1fa513ff007319afc0bea97ef447e0e57b2ea2970f51d26015af89d7a1ebc3e6840aff92b54906de85f83f48435b23da256be2e804170d422de0a2d67850b7eed39096891621c667d05a270cff897452b970aee4e9acebd23eed85d32619338b2062664265bfc5320f116b14f68ccda4f2f4cd0bbfc1e2547d878ba741ec83016a5251b2159215e6491ac41beb36c2889aa52bdc57fde109df7e5840d2841a936ee9b3afa861edc9aff6c87e5295ce1cf062031bfa622a9fcc267e327bc88598b5e6a3d4e262a4c964eeb0b4c085b20fd8c89f0f92e4ce64aaeed3693ba11dc84192433ecf3547cc7f34bed5d2f2133cf5a710f9cee67f50ee4fff45af9c6e824b6a0983d9778d9a9878739a8cfff3e70f8b2105c14209c3f2be88548f55c6c9dbeb2697805378130efa511096b552b37470d1ef41fcdf56042529b721c2653f74b1462849769c14eb20fe400c8e39cddc79383ac8960c5302e0817a90248af05ad1bdec443f604725f0610b401dc316dd3a3aa39e8591d609dc25b39d25addbe3831f5b00297dd7d1664558020adb0b456fc1d6ac833956554305a5abf49e346af2185009587cf47dc41dba855194b96ee005c446a09432548252a29b1fab685cc4a0db2f5818f02f5696db3f68ae3d74a747e17790a7cbc97d32e89700079f488edd6e06e8a19997c80793cc7ff05b51f5907b3045fa1767c7df6f4a9dc3b23ee3b73854474c9b16b2965f42ea24b06ed9eb5d9de3efbfdcb6a44105e26bc5e7da9133e20d710940ad363658138c12ca8c5528e994ed2a4caa3cc156e544848aab42ea5681138266fde494ffdf166286541081f8672c32efafa144051127d71ad6261ba7e4234170c718ef42423585b1603eb046fc5b905c0e899eb0a3537542e50f429f6460324743fcad51eb1fa469bb8c160d3642c8324a393a15321e8ca767a12376c2109736d9e4e35ae5201d8b47a729495c0a52fdc4023e6e1d45390c1a6773ad726f7194e91ef18e03634c1af7d6e6c66425e3a32da2bf847060a4574deb30dcc0037eba8a7ac21cbdb2ff83e56810ea5522de44ea0e7f9f247fe424976643119f0c235a1998880d2f146dbdb8ab6ba3ceb8dbbedf12ec093a22ad98cfac21ae2b530d079db60799b2392169b6a0ad2214f1b0797803363f172a1e53209165163ac5efebc95be47009268d7e2074ef2dcdb9148a7d9f0a0623babe77c8cf940315efa7b7b8b6585d62b1b8d9ca26547b263347ad980d6e3172de7b82fbadf471eda74c347991cd7c16262522d2499d29ff9a60cdc7cfa8f8fd3abe6c2aeb9edfad46c245fc7c527b1fc51da4ac219674c61ef1d95b21ecca8e483cb59f7f066629bdedf2b4c2e6802338872b896dc25438281435bb54800b8a9a46512699b59cc1bcf52f25992fea43c387a47f8e7e862d1895bd0c55d8f213ed5ce9a0607df7f5d2fb4b94122b0263a4ac6a763a84568ce550c9c6adb2aae8bc56ec9bf12a30f0dd9c4b386e150463c7011a183a1e8d3cf528484d5218b89ac08641af049e723651330a46ea6f6b923eacba3d4b4d6f25c6eb32a0ca45eb49ecf318e3657fb8ea65336af723c9bb7b107598c10de2de30a6af0a069710a20e96bc7daf45f2c857ff02784ce6fe249c76998e31269cf748c09b57e87346ce96427c0a82c53004368fa61a84352bfe59a5a77aed67f8de841177b533090be0752fc6b7419a86d1216a22b4b882881677549794bb562de056c3d7bea3589f8462421e15fae46c2da7e8dccb19199f8802a7004a161d1e715f94b8d5ef023009c5928ccf9f82b9a3830dd8929eb85126de4d6d0dcb5594ab1f329eb674ac7d5e2af4e6f3ba179fc4d3080644f9461ac2e48b4eaec28ea752c348bbcc704a54bae61f175ab56452bd78d166ded98b506352e71da23dbc15a5ca4a71b6e0c7c691c28e5434be6c77157ace465b403dc019fb628e33fc3c36a45a0f03b640222b34bca82654890cd6a54028b8b0aa8f1abd612a4afaa5d25a40b4beb86422186df25826c5bf0bb10add2982a45caebc886bd3e4fb3679e2436cf20475d60f14c2dc410e8c0d66b9c0f4c5de74d5c376f8e4fbcf50a57c4ea47f95f4ea0825f8ae8d3770d223f89e1c645d3bad92c3cbaa312ac295d87e54dd0192e55bffd417bca0c3161af5d14418970bae597097a7a6ddcf8ec482c2b67cd25c35ed7e2b1cbd8bd5965367c154b74ee3222f77b7d60d04948acf772f1c37e6df968a67edc617067a2ccb2d7d4069a586e1119b78ac7388acf088bd25788748d199963e704dc8f14e179446be97f7b959721981d93c86f663acf9c5301b16ad54a13b8fb548ec39308020ab1171e421094cd6c54378472b16b0c0b007b0d6f5d346d8fbaa3a931231c6ae07e6e810e595425d232420aad3184c3523fa2365d91968104350d823a4e4a2d855fc204f7cd8a9ac5283be583815588e4e2f55484f6b6bf1f4578f5721b64bb572cebeb04fcdf2e2c4872cb535e2bd55c7d1f97aff3e7652d0803b99449371aff5abf55ad75ee6d2be9dbb062c926c148b168befa8d8ad195157e8b54a6082a3800346eac612e7e49b204b45fa45715f5aafd8f2a34f596398185bce5f998ddb74d1889e351e66de7b52d7d65620d8081c727bda68a0014c34880776ebe917fb7e4fb83d0f44fb3ec0a5910ff352df034ace49dccb53e83ce3e13e636b81e07c41adc5b633f4f64a14680804fc996c0248077b2cd0d05719c9758999aaecfbd95e8b095c239ac0b92e9a4c193bc386840d2b9f626c9a53999a802cc47bfca004867b6dcbfec9b599e26d3e99494551caf9c9d75f46c98d7024b7954eba28bdb9850bca53533dc42741c09f20cc1e2156884f72798e2a72d8ca65ffbfeccf909ae45dd42a74ca7709c0cad3752d8c9caf8c535241984db1e2063d92f9cdbfb681d6830051dd48a7344a57efa028823a98183abd846fb77398cda67900e01b944f05cd511fbc4a015abe8038b62f00e3ec057bb24499d5c7af69f845cb0ac997f4e259fdba66981c3d07df33ae9fad4a2099aaa7dc98193a962388ceb925d62247ef7a954fbd26ce5391b1a80f3d0416d76c5023336ab47479f6a1d117104f0de5f073c116c26102eb895b94448048fd625c516e0be75934924be1b04b3f56122ba47cd518840dc20095b55b623f22114dafebe2ceb523e023b638af0ea6789957f0e7d6ab3574eba68cdecf0bcca22060c20a6851c6fe86dfdf782377755f6ef285bba84e517d7fae02fc7189aa1cca4c6626280351e13a4cf49b75ac9f6ca9a38640a8d8706e6b016c9e9cf571ba54908e4bb52bc459caa9b408df125d2b14ae176584f80c08c7e805cdceebaa55cb265894b9a7d8c0d818d44ecc37191e0ea2e658ecf20310b58c659c72e4b09c26cd8726f4da983ffc913360b9417bb387e928f3c3a0c21572bcfcdd11f05e6bdd81753c38b672c93de6788e0cd9eead776730d09ba4c234db2c3ca0997b973b53d8c97baaa06279b611397b6274e2023426cca5fbb513918992543903e570ce2722e15946ee5f424470b3841b7bcde0767736f6e44337523960dc4c5d9fe4e4c01f8a1dbc5603c30156fb7e0ca1be04cbe183030dcf158da9b668ebc1a6157ff17e380e27d8b370d1279a58043dc9da1c20be56add5e4294f399179f98485e76cf3da29c1074a4361eabcbf732deea27d93a229825c8bafd183cde12fe055f5de88a869f2679c4ad4d1fc3d8c4cb6c88852e9d53bc8ff19393585826fb6c399bb99121cca9abffeea7fd54084351c0a301fa1471c16fc6beb3104a3ee61e11d345aeb42822f004a97412b9db0581e57abe5a7fc33ab469448b6b5670e4389cd4010349555659d41ba9044382f8930e390619af26b42c3d3b5b09bd384186ae104802c3f1220529e79d2009a0de158349bd589dfa5ce390fc59d3b338a52778991b6b7ab6eb38e1867ca6d8ee75b55bf7c36067e5478bc0406ddd1eec63f6ad18e2017c1473a414833dd8292ef8d0361555ffc02902c64f12e4c5bc1fab3d60921a2bdc1328ad279e9161e29b28e61850192ae1328d077c28fbcba10ead32f298ecc373d72b01d58dd2e311d199da0deb58a13a4ba030adeea8556505ad5a4399e04e87e448152e7aa7a3848b0089182a854558b806ce508a24e94086935f219ffa6c1808d32e6158aa3a8a6075d40fa6f17086fdc31678cb07f60d6e177433236f4f6ffbfb5b675a326d444444812d902dd0804081308fd9c7bae3131b88831d61e62ede9ee561b0b8ddd880cc4da64b9d618638c09811d7c7313011020213a1fd6dbbe555b3010e37b188831d7b71880651f00c8b28ff99e880a51597e0b7683ff1c00c439b62836aa3296b0a26807ad1d16ec2d6aadb5f6f0931731bbf7de9bacd6b268ac06bf2258c239e75a6bd79a6bac190fde7b7bce3dc7746837d6302b7c546fe41f1a47b546d7b84e11a69d0f33d68db6b56037f893d59e8369cb0c8b18364ad1dfa5477fd1bb2b82156b33f319df45553cd18c198b6028623baa97551bbdb5d680d8e87df5886a2c5bc177ce3dc4982d3ec33bd71b29b134a6582e3c3d7c06c800961160b95e77f9e818fc952ed9a774c528f2901e2d47d10df728c2b3107cac0cc46cc646f761860a57f4ea04167bf41e8c0cb359364638e25fbdd7b52ccb67218e57c4f5bef3e5c3caeffc57431c11c1ea37b643a47e2dfafbea4a0be163f4433cbc14fd20155962da7cbaebddba522a17d63deae102d4e5a87529a1374f5d8f52d65dba3a00adac57c5ba6bdb8380f61d066159e98d0af1ecab49445958595d3443daf1626d06703e9a732e1273504008217c84706a8173ce39e75c6b1d079a163c1c61b25e6bece958c0632dc289525484127415092cd0294e29b9e7a085e29118fc4163075d6cb4d6dc83aefd4d51609632924c9481772d0a71235363d911b1cc4e88e5a865b0d52aac99010d049c02609d2f7060f1ef5c1201714b6c3fd75e6bb587abb18e91381102eb9e73351b191d4497822524f539e7f51430799a97534053c0ec695ead80d9a6793105cc37c17721aaf8f616feb5808881f511a20ab95b36b291bdae7e2c1b2f218c2c47219a757f56f443c40cd0217eb391bddc42af1f4fd462e42096dd0989f049f2c128a52ac0993733d38810430d7308834b8c202821c66b4e5284a33d463f3c164c56644556448386bd56db571b10cde8ab08c1e2d3169f648d0b907ef3ebb931dd55510222e6c6aa15956322a22357a5176314e188f1acbd17df73f041e86aabf8edc0491a6498d88163cc4be0194f4481cbb4a425592e2e2e2e2e518b3c6307e792830514e02c1440550244320e601d8f68238ccc29a10149b2b5d69a73ceb9186bb09c15b5a8041529962089b1d5a03d25e27b7788221cb426821bb4268376c4452d72149b23293d2865da9df41e7cad4a0d3e2b5cd4e20c1c01cbc4295ac21c40448d9c444b7090819641057b3d18e8285932b1600417c425b6c95801fbb53717dbd9bdcff75a9c1828628ed68ef72267a45f9c2c251089d5feae38fd4eef26603b5d5204a2f671c03a1781debb49f6398e40afbde65c14cd78dc5e4b40d7c4f678506bf155217a1e03143dccc973ceb9f7defb419cac080dcde21623c6dc2cf7ea6b38a0f33050ab2f83354566973108a1b5385944cccccccccc7890e0f1c4c96a48580b9418d681d80072e0e242448c920f11c89d88f60480023e58a03d7a1e78526566dd8f1d8f5957df0e5af341b35105b6b750981d33f33b636667799ce4dce3d91dc6d69a73cdb93a45e139e72c140f335603e6ca0e858af62063118db539b4ee3eeb7e9d9deebafa81ba3b8b7ea077f7b814300be1836d7359577b33dea98ba319eff462d18cf7e96ad18cf779cd909e7d8fd08a4ac4e7286b4798569bac16f9c5c134095a10db6a129d45167603f030d1723483fdd8217df206a010338b2cecf51124886db5f9e80e300b3f5d126d210389d704d359b49e81294370d2c87b41e35cc3223a995273d34544cbe8e96424c2b9cc1031333313b5d84065f0487fd139e7a28f69c2f8a0041f84f039e8dc7bf0819a0a11bfc7de73ef39e7dc7b41f48e44f4e4518b4288a1c28d6009518b4ed8c9d030cd144c632f3fe1278da397b48cbe15fb891516bf9748fdba9774ec27fc84260a43a0601a27d39e88628ef7de638d3596238710ba0a34716aadb5e65a634a641a4707a1a271c8b7da51d404c16abfd14e5690c611754b413a066918a45f102aecf54401815680ac6ca665f43b341eb6e4c11a86c50990c41adb18c83923cc442db6ec789722075927617b6f2e2e916b305689b5260f0482226a3ae0c20fda4ccd4c9118507145cd0eae705295c089931a29ea30859a99d783f75af09084379d210b3c348989375a12555102f71b2d79a2553193823640c85c3841c5d482058b5f0fde6bc143118a48244e886d9f2d5fb05c3424d7d50008b6bd21897e706ff5057142a488c25003dbd60beb6a9301c1e0362038210c053388c0099155cc808ae0f1c4c95201bfd0603f18a88509cd4387289d5cc704876405ee078e0930458aa845878495c004254487443a614d7e90c76a8ffaa0228f019aeaac2e56cb681cc496d1f7c10a331e26034b031d3b5e8f018a92b910c46883385971c8021866e2d422470b197864bcc0e33c71b26682709fbb16a199b1c2098d1022324d9cd0a0c91395203c79e2e4891530e184c6bdf79e73cef1600731718a9624e7449180799385040d0d0d0d0d0d8d47071e4f9cac181978fb2aeb81ec1b807d2ef6cd4f368c104155f55a567deec9f31911d1a2a89d2e1911c8ddc5c5c56586046c3b4b191598354633dc658b40ee8cee884abc47cfd9b0ad3a214a72ea786f51878c8c8c8c0c1106b0f2c41b7c3000dbdee0fe18d3b8d870ce31b35aa00c60f67069624e27608f40ce08fbeee07548194986b585e2796788929c53036cbcb7d8002516102c2b6ad14667891598d8704143d25c40d2608c6d4d0adb185c00c38144cbe8b739510dcc3c8184069a26fe205074d24e8878c184c80ad790401144d0b91358ce3dc61d6058b0509a732e3ae3c8591774ce39f7698f87350612ab991b6b33683d5807273861f483048ae2bdf7de3bbf7a9901cd4a67548868a51ab51d84c12546175c844d02b6b046d10c06b2230b7800eb08609d0ceb2eeb58acdb582759f7e81c454cb8c1caab7a2355af35d5fb592f48aa5c5a51711ce36b6ef1396602654f053172f4ee6f1cd5dd5d6ce4381263f35151ed39f79c7ccdbdd6de7339206b46885e8baaf0c14a447487fc016c23806d326cb3ae0887f51c511525c8d1388a8094f52e2d2b5525a219462c7e11510423072318b5584545022788a10adb188863267e7488ae870706f292aea701683d08a173efc1e7891b4e27077578f8cec5b93657d42cb82a0f8e96bd894c7407a326dd21f95a7994d2d94879dd8e8111734151c958644b0ff4d4cb6c13b1ec2eea65d235738fb177f916c262ec7d67576b26bb08d5bfd329aade2662dfe9a9aed49d2a55a95fcf9b6aaa298ab1686dea87ea68f9bc45108cba948cb1fbe28ffaca75d9aebca23ce41925290e8aca8bea82922ea8a43ec9bbf71076aa45bd9e4f6da95d05a3d702ae06c843ca83bff277b1cbeb9de59aeeb9aac8ae5c73855546f3d8a91eeb2c18290b56ab87507f944d4d2216b188518797d34459a72cfabbf710482b104f5877824f5277511451f542a6b587309a1ed244742c80811cac3dc4b5b0470e50ba27d56794c3724a6cb4ee3392262a9e20b14e1ce39896e1b8f6a66594b01b74474fba832b07e9955f50ca3bbf3926bb36ee458b96535f79ca3b9f134a2965c83a63ccaad750055d9277d5f50d6bbd7d5da7c47277bfebaf3c0fbff03cd4aed5adf72f3bb704e2839d15f63e66ff619bf9ba8e0af6bedf29b1ef308c6aaaa9a62eeb9d2edbb56b67551867690df559c594a42425dfae9d9467d38bdfd8e2d76a79bb247d5dc9f573fd5df670182e3e2c208f4a0e94cfd9f506c1de43b0cbf35d15fcd267d8576461df27bfd9c0770df52d76287f3d96fe5a969ec6380ff57a7878adefa1d97b9094f29093bc0e66b20f5df400e351c7a83c54566b9d4faebe38c875f112d5c54cf42f0761edaae0c1bef9bbfa7cbdff9aaea3d93c0db271320cf4aea365b8c3a837bea837baa8d76a51aff5a9d7d352af87a5de7bea05add40b52a929f5ba5894daa9370787fa85158799998a97e7df8ae392dc984e136bd813cbdee76f75f64b9d85a64b5518672996524aea5615c6b1ac2e09d3e0bc8ae7544172b8801ccbb40c77b7a93787cb3d1e190e52e51f3ca3b15505e209ab72d31fe5513dc495aace3249f8a592a7aa4be2f1384663df6ff4782296a917d6f71b9d8c4be294709025820471499826059463103863e79c57a9cef53e4a85909627ca43bee87086dda03b5ecfe9f29cabffaea9ad252d1dc207a52b44230e45bd4bd2a3389d771905a55ec6d78533f69d992bbdef4dff6a4fef90a77708afb0773a0c0bf17fd877dd0ea2add4fdaedbec740a422bec9d7a88cb38d00afc427dba30ac5e3863a71fbef31b5ec9463f74ded13b4f2b67289daa1f944fef20f86f08fe3b547248057e7987efbd0bc32e9cb1280ffa5743efd42b7a5deef7e93d410a560ae1557a4c6f7aef69a23b660cf2502ebe828681dc81b01e4f0f528107bcfc74b10af5952b052a89a460dddb9cab1548c1ba5b9beb235d3eb2d49a6e31ad216a057e69e9b7473473dfa51a8a87a7987a441f00cf57abb171589fae68d58ff4778a97acc03af877ea02e209ab478ff7f996becf899d8f100af64a967a75c5680645a53c27f61d5a017efa3c5402adc02f919d7f74c78433bc8481dca58baf6020078405adc0349eab211663b1142ab4d0c4de4649ac58b20528ac8b8d9268e10dd60a255600364a92852c2c61c24e963d7ec98c35808d922c2962b9065694840b4fecb4fc1a1b1fe7d1e6739a54561eebe5cb282a84b49136798ecce79a89eee04677b03a67bc66acd4d975ad78192fd959c64b761dcd42d67fd818d11839e54c87a09809bfc8f38c9d21a8daa997591a63656b7d32475943f4d6e36fbcae652304e2e30764f13a3a5ef82b14ff83bd4d529e31768ab1b01746363ac465361e0552879fbfd6a5ac976b3e5d56669d397df224a57cbc2ed33a751e60f1e9e345b97eacc3cbcf19443c0f11cf6724ec863c3bd3f00b9f558a6fcae12fd758f9f9aa86241f5e467653aa4c49a9174652ca233ec4aafc14235f4eba63a22eb6e81519e81d08eb4ce3328d65879447fc3cbcf8ec8247b9a677aeea7da9bc5d2b918d180903c16f38d7477e3eb29bdf0dd3c92666c22f90cf750694747819921e2f27cb4b9cab510fd89ce24bdad48f3c7c3c3c37cbbf30cd52879f4ea7af5857b9a296615d96c2c23fca831fa2e81d1d62b2ccf1f4d3190933e197c84e538d9d57935763a007841519888398365666c234e0b318070b5e20c2dc6198658c7d4188ad61a3245eb88251ec8f2df5e059126ddf7b14f528ea51d4a3a8771dfdfa4d14f5f7fabda99a445ba61e3da2a87b810a5e8082a29cbbd4297a77569d7aa1572f4fefbdce9bb1dec889b15ecf931eab5355be7371aea837977545edec542f102ba58832512cc2e00a273600364a72451512638c85ee7bff477b9fb3b5d93ebb26d1f6b27d0fe8c3db2ce5580fb9f4e9d5752d0bc4c78f6a7ec0f267adaea3abeb3614d5a72b241f59be6edbea110da22dfd9cafaa334b9faa4f7c3b06f64a8761b326d176feb0a1e9b2ba0ec6a7bfd619c659c6ccf5b2595d3a3fe58a9adfe17a615ccb65984d856176ca5fabc2305bd5cb76faa41586d9a946e9ecf2ea214c43aab05e3bfd68402c0669d0052696d0d859b5db45ec65e78b0b351664a3245c90b15e58c216c04649ba30632f576627b6911fb1bb0bc4b28ee650123eac7b649b06d1b69d93681bdd76b9c2b0db4576c027e9828c05808d9274a1889d707a74073c53081f1b07e710d63b7d3ec21aa15c51cbe80a9f72592d0352a730ac3a0ae7da5c51c3bbaa5ed684a23562a0a9c238db32ca3ff7f8a63c2e9090ac17c65d1867790696546198edc75f18c69ad821fc026b88dfb4b587300d56511c908abd19cc7e631b44368231b0eef409ebba58466b6085da590f611ad0620c043b56c723b22dc916ec9083ddb85694640b6fb00c440f611aee4c6f0bb111331a068a8468b6d51ed26d09f313fdc38fec87016cb932cb96d92a9ac18f685427c0d10f5534839d1b30a3e8067b6b1d31f3985184a3d9b9c628623f185bc039e75c51cbe044eb9babc1f4734d34c144134d48134c23c20deb54a199a970d940c66a73c4534cd6cd7dd1477346c618838957a8eaeed88f2a2ca2f014fcc23e53ba5a3947a6c24ece3c63b127b31a8a7d5d0b888ff92657d1714a81048693a9e02968c5efc34358d536dfb37e544e75f7a5988c5dcf1f3ca5b3739e62a5b27e68f67ccf7a57289ee231405d790a96c2ce3e9d5047f7f488536fdc30d74d259deb75b19b6a0ace61d964e9d9abb3384f63db3c4a164f71a9eab7aab7457af76af214b4f2144c039ea78090a9788cf3142e288c7205e69eb18d768c6d312e9c4e8baa6059f404cb1060d90db0f9b551a3067479afc150caa75cf3efeaa87180207bcd0141103390e70f442174e101bd42d27fd89772c6284b0aca1994ae32044a5579cdb2d40bc3208535442ffdb1c309c447e4f29a07f6f67c8c397269287a52c63aa686f4f97a3b66bec2fc4aef0c65ce39278317cbc6460f906a8d77c1fa59797f5613e5a917c6abf7bd472efcf2deeb183bd9f36a5e8996ca52a5fa16582516764ba244d460a7d827f6ce52ab9ef15c352e2518c87de5f2c141a227359846bb5cec3a5ae5daa45cf3289775eaba9ee97a44dc68f52f8c0e6773221a87129c0bc3c3cc752aca6166e6aac735d954e3b6475f8f6bf29c73ce4e8f8bd66b83996b300dce698fcbc657f5dab09cfa9194681ca096e1eef15816fc6d76f6b82cfded71591b767e7345d10cbe754df4a18a1ed43858ba688d8e51c2c713079f0ab790e2454d6cb3113da224632eee4d16d9a393f36d6098bb944e69bd36acfb14e22b3de03197766db0f76a8dc66e3c56a377493d81f8f8a144bc4b8c64e6159afec38af1ef452efcf23e3b67717eb26af04b3c7b9c21ac7a999dcea997d969c376e6a7f926f63759fd4c7797efbdf323171623e7eed7869597e8245fe32d9c0ac32ce7ccbd8738ec4974876c12afab5d4058ec91f27897eedc3797bc75d1ebe8e71eac9a75520d7ea13ef1d2232b04f5592f5baa7ee2dde56bf0cbbba371aa312f2f5fe3d11dd2c6d55eadc1349cc5550ba0fcccd8f889b111cab4d4dc162c20c3969a8f914f0cbb015b42d982c86bf3ee969afea7484794559a621f23fcd212e512e51363b9b96b889eba6c081ffcf0c0de27ffc3729b5a6a3e453e50bc9ee0fdc47c8c4cea13d39fde156efa97829d37ec162c241fcaebaad4e6fa51f97bb7d47c8a40c6eeca27c6363bd51cb95225734fd367e66384690461207795cb2de198e07f8cf0a78885920fa7a3c8ce759be55c2d350c848446e3ad78493f461e37a3c252a7933cfc44272a79921f2390b560c148b0d705b1eecc2d61dd3f46f885f560544cecb6606127d8835161e59f7bd582857dff18f91869a9f918f9c438e7dcc70894e970070e4d896dad888d6942a4642e4877b7a4583721cd895684dd68d9074dea2c299d0d7d3373cb3722dca0b0f40a55510bc65a50d6a2e1ab7e41abbf80ad08d70b53310dcb4a4ad5b2fb75834236ec6e42e81b117ee9d3160309bb39c12f14762b629f7c475e763a524a2969b3aca45495d58f8b3f2460fc9eeb2a1c76834853dae4298a56a7e491681c2eecf388e1f85cf51546bd91c190dd957e72692a2b8c1755e5517bba3981848b0b03f0ca004d73a2a9bede5bcc7fae7baa0971a9375a967aa3653d7701b546439b13b4be8a369aaa8628a5cd09ead238ea5dede1f7f5d7c3c3af15e337da1e2a0b798c1a1d0f35ea5a9b13147c9fa890a6776f4e342720753dd7a24d4873a2154102033434cd891817ac051b8aa44845580d8c1d7971a839e78c87612169d239e37cc52225558f1b5663e36118a5a7f5d2a7fc5a4f992a4cb39b1ae26b511425bdbae635d1b326bc2279585a2ed5cbb35eaea810d24a7c8af2982496580dbb31cf45e80ee99a3ea72451674da4cbde505da18d842249f3d559137e915e312cec9d144a7589fa64ae6aeca45252a6f54985d8ccfad93c9e9224e93ccf9accaaa23ea5549f52aecb143f4abf2a4fa12a104f58d255a930cdcec753164ae52b179532290fe9a1592f4b496289eea045208407c262e726763e521ed23faf78948b9e5d2cefabc55d9eeb6829c6f9aa8ad48cf15ce3355d91e57856067ee13866ddb93ef353f54bddfae55b35242f352bcff91582533ff3f1d6b9ea60ac0cfc223d56a77e1989b52a4cb3cd568fa76f61b11eefb9365fb9a296b1a9d7aa30ed32121b1f2bea9095413ac5caf058cd753508a5cacac034628516e390614696fcf4c852fadb445c57b31bc2d9ddf3dd703633cf331a38afa327bb425414fbba78bfad0e36af83f58ca726a362bfce966e46cdd99f6f76eb8bd1ccb38673b2955fea10c676b01d6c07e74a85bf14fde42946082133c74a3d54ed212e2aecfaa1fe0eb9e164ac5dc0f99eb0ff0ea78b0a279c74ced99452d6d4b58006cc49a7b62c2b247d9e5facf33e3a0f4f299c91ce0963fdccbff345e32f6bf2484108e13c4529a5d3945264e19532c856d245e2511e459fd2d5f9e41697979f7a9923257df5c66e48965da49273ca8bca3a01f151f1ab2ab4f90f2b234b4a5e395bd35975b6be4999ea6576f3141d4cf2a594b2569bca85ac6f2eab8a31c64292624caae4552e4d9736af2aab629537555555959caecb5c532e37b587c8ebaed4cda557524a21d374792e55a7743a555d7a7501f184a4aea7ae30c618af54f57260d21d94928b371610963cbd245de5a29e7271de57cbdbd5e2ee62f9bb3ed7d192b2f40ecaf5994e1f59abf3dbb16a684aee5caf74a99a6a685ebe9a2a799e28d5d47955f99ab73af5335d3a5fd6a553d6376f7155ff5cd55b2e96cb6a195595ced948567557558aa2dee80eaa089d6294356e58470c92bb0adbb889d816598c999395a294c7caa93776434656329a28922425c94592a46b439224e9d22459ac5103657a43608e39e69863ef46c816a5344246584429e37b9452d24829e5e3a3ac714af4559846af8881a6178f380265a20c9ba00d196390b1eeee8e24c6de20846f6287bf304ca2d6a4935167b4a2d75425595126e886eed7dd9c3e84902d07368cad01f1c1e1bc8570ba5d21f78853216cf0ad1ba7dd71381c8e2772cee9ce3912a6a034aab2e00a54b1604a05a94aa17438d651ae8d55517492f50291ea8d96a14c1c26a1204618637c6c8af151b37d1147f1374651616077cb7052e6a5202d83fd469577bdd3217b4ca9ec28f546957aad4ebd9e4dbdafea05512fd84aa742a2bba6d41b3d7133b1dea8c6b25fef3c8a70d4a73c8a70f0f09547118e18677914e1e8e19f47110e1fee221ec67db8e27bb8e2635cf13c5cf58abfae5f512423d60bf30ea3bea837878bdaa25e974f6da917c4523df57ea55e8ff5a454947aad4ebdd15ab59b4ace4e09dfeb90744ea69de3917884695eb05983c4c2bf17fbb5185b6a3e453e3132c658b52716be25562663e1a38ac16bf6d48245f73f463e463e463e46a08b436b365e6bed2eedbd67a36dbcc7f95a8d1a356a3807b9c641c82074b0a6b9a69aa873ae8d35bde71ebb4a919d99301366c24c1a48c5dc179c834c888390098602081d6442a46610fe4e8ff0b15e79ea10d6479b77ab9a32e663779417a6b166674db026d8c4dc15efc5dbafc5185b742f3a2231c6afa8a49cbea74b0d6e22199b7aa34abd91f3cd19eb3c05e5624d389b7a3d96b146d5eea986261bd243e073ada10a9c7bccb1293e235e7beebdf7de83147e9ea2ea6d96d2f775a7d3daaf4eb3de2649523ae288238e30f25eecc7a618e3598ad8a23bb78d4f768c31461bebbdf4d2e3a71c9d4f47b9222663aad7c546ebd41431d0a6de66519d2b6237a27401f184456b9342adfef69055fa75eff860eb8ac240d1df124b52e292180593a9624c84a2c812c684302682b40caeec07815c5c72e4f0782c0be6c52394d678c46234261e8951b01b54d2b6dec2b4bb296b1aa5b02c8576288d31900754875e078b473a3485aac094abc4282cebee9af2dbcdbabbbbbb43d453defcd8e963a7518a2bd4945d312642c12ff432f280693cc25c6f8cc2bec8cdb25936cb66d92c9b65b3ec4bea5962cd70584a29a5e486b45da21cb6536a3c02f3505a183b638f31ec863c7d8482b118058b515879cb4a39ad217a9822adcda30807dbe4b82ea07b66fae742bea9694ccc8b5ae95db4a8d7834437bdfcd49ba3a55e17967a419eda2bacc2302fa5725c128f5c2cc3407c948bab60250cc4f1088b50586afdbd777a9e73dd48e646326cc518067a5505a3ac1e9ffe553cc29c12b6c432eaecd989524ca19495524a73d007708d4798467579dd0a32245a867b11c698c891c3c50504fa3d1ecb8a479c7332efb9189d8c7d47221ee1178e4772e47071a1a77f31261e8951c8542123138fc87c38461384a04016d2d9ccee0e41a9bbcfde94e095fee4d96bf5aaca576ffa957de71f83d26cd6086e08eb11121ad1f00824d88d86f09246445858e90a4d1165cc081436d123268b5a2e16a55e94374bf945b9ca2fbb4aa7d4e917456270ea43a9eb67fafb84d0889e94f2409950aecb965360ad2a7d955a53268a94e88e29e488e96a91c5bede39d7bc7551a7f0f11fcfcb976f9a13c6c647f0cb46fae64a952f3de7773ae74eb01ec134369fe2e608fae92d16756b3a825ff8882368a27684c5e18d0ea28b189f44ab17307e59cdebd97356553567c593635535218d481562893c9e599db14c1791e52e28ae582a6abe94ce863acbace69cf0734e22158b87157c55bdea55afa2aa0abeea55afaaae381fcba43e2c87afaea3fa9c31565f5971115d54cc45355f5c305c4c7488f957bdd752190b753580811e9cf0629f17bce7a2efebc5db0503bef7de93a25455b09a73ceeaf1f38754352b58d58f7ce3f0789c885405e3c515b58caafaab5ef5aae6043c7d13d29c58407ccd8988c6c358c83013672e19632dc6df64b3c2f08b05c3b1f10b85e1f7dafb4c6bad0da0c5b08f5fac5f1866e617398dc57879498a133ff6c82cbef7a299c779ed3133c7c72fcccc2f3ee608c3f1bdf7c7349c551d914d2c245276cbee0e12293b8f36acbb19494bfa1fb623aa9ba1a44ebb512836b9a9d3b784407c48c948a494524a5933c9269d5f4ac1ce34498aa56859fbba2b95aa40c9d85de97424934c386726d34a85819225335161248c29253bb2e786b95e9846498a99c05841499d35f9a6a9c99452844c508a40841911d8646516c1348dd2295dbdd96dcee6d6bb32d652042b82dd88b8096cd691e77346203eba089a6627b1a34f3753f8a1223c7fdef1c39eaeb7c7046f3777777777c366c61e73c21a6545b01b3435947113462183104247298410a6e3c57ef8fc42dbe2f7d9fe752f609c453ffc7d8e7eb8de6f66d217d74f0c96f75004c3b7b430c5efe12ced03eca91bfad0431144580cfa5afede79b8a6d78bf3ebdafc97751897ca5f5cd55d5c296f71a1fc73755aae59044b8dd6adf04ae495c85698b018eb9b7e7b4c374e3544993200b09515865c8178c2524941e177f89ccdc52c9ac1afae16cde07a43d141ee3145c84c8a98a626933101c015c570957958b02231192604461999a0d62636697a7b6317b936e90ec784546f73d7b52c101f3fac7426d80d14486fb51d0c0b51ff61a58823494ca4559335c12fed4c49d2e4489724d5b7f62bb124b51aaa4e5dfa6dce4517037be3d955ce31f1c988c45649d2dd5b8b6fedad35d738b1b50bc39254a5ebc2348a09860237e734adcc532b2cb9af34c9b556ad4d5da1ae7daa9703ac09aa822a9ef7c5f294cb3ae7da5c474b5307853baf21793b4df04b735dc9cfcff93a793e6a1c9244614d7438674d702acbc5b9e70aa7cca8f4ac59e88290211a010000000023160000300c0c854363c140523619a80f14001479a0505e549909c42849619842c618630c000020002202323335090218511a9a6190c0d005f976d64fa643f46448c78dc09721cb735bd15d70ba493802e9209f08266185c54fc783ad271caf1decc996d98606681472b73f4268293f5c25f0c944c8676bea75f29e6cc752db63cfad94a423e4b91180c354eb085efe322e0b165b5e55c42782529ad2b9c68146e711d4c046862517bf8f5967c6cf0a2b4c14bc33439079781fc143ab9d730c35bb555b82cd01befa111e7badede713724706f7cc468d2fd548179b3530c2b40ea815ca7b0b40427de0393feab8d5acb434b6062414b58e19fd1ba789f6e8066808649167af774ec710405407790db4fa615ef49a0219e89b9d95be4bf337af03210b1d4f4e65ff57fe748dc27948fc9a715b9860016739570f69f51d270e7c4b68c36ce3fbcfd7598f2a94e2d7c49c91a80ade82cfa5ea3d3ae72b45559dda173fbe9f46c9277bda2cf2ea3d1483118edf35f8ca9fea998f4ef6027e1aa2b01c9f9e31001a0221c99cf683ca8ae5fb7b16208253ae6785be94e092ac7e042e6ad55a0518a06e5b18fc755ccddf058ba393d128418a2ba55019d722e495a09cab94b94982a82334334592d906c0a6889e3d3fd41e79c3acb8594bc4e72ae212277ab28092f18804f8182a1314e70a437a1baa502820b0a4ba53c0a598f3073e6791cd9bdc983d78ec74a18c7bee5ee00ae01bb313ad51524e588e70fbe0c376d95f3dbeeefd979b33a711ac212c8a48793161a85f1667abb2f929594aa01a103260b361bbbcb0ff30e21bf35c018fff11bcda673c26518d2757403a04643c8d94ea83a11f7db1799ec1a2a3c4296c5f908fa83f695eb09083425d5f1c9f2cb92cf394220b914542420a27243d9687ed96a7d8cb131e8f67af26663b05eb890e4c71a2b36ac868bc7a74a9f214e018114455c042d14fe640cd1a48c43382f6d22a47815d83b54718122183ba2f3d11a423811c3abcaef442655117e748cd8f62d3a814dd103bacdf8e7c18f51976ba1fff99c07495a4c7a35fa2e7cc6772b110b7b82d7da964c219d68fa7d0280a72b5f9892602a6f19d1ae35cbc199ec79bc384ba9a1ae5ae48960367b84ddc9ee3fff7d1396d950f89c2855d1220b942f500ad83fdba281e64e2d2410a0f0f93b416a1710b94ac52be64c360f99a050ef1baf31840222853330d88a3ccd7fbc0728bc072375a0061398daf2dbc1704119530cee8eba4340649363ab660ecf279bc9230421f681cd0be7305789de474d40e9ec7585659b51aef947f57b3112297affaf94fd09b426da3827970d55c1e1bae7d32092ad9bd27d9aa7ee154ee4ad2375cf1f9fab378ecf686762b3a6039727a70dd00e1d630e55842b4633d9d3649fba21dfbe2b373786e35e747fe8c2bbb031581adc6a9a5c32dfde58cae84d218b2e5d3d5cc0043c97cf594935af2342f10df3a13f3bb9aef44e4c1373571b82c7ef92d4d9cd9d166793943430f009e918cf9a1e4e99a39f34b714418cb8810b8a26b268728a9622560a13bc4cc3221f4ca875cfbd10f25766cafdcbeb212b883d3433e12ccdab6852756964844caa229af9eb8b5b1d9e2a8001321142a91780372ae3d5802dae14b7573237715190ce3c4be26ec9d1ca25477dee384451d6ec00b56735105690f15f5c014e6378bc5fbcd349e374f403610b95e6689e574e590198ac6060502493421c78655759b9988a92b92ed3364d6db84212b28398ef817615f4d50c4945d3544ca25bdc80c305bde1f0d48451548a56d0a623a8b451e3aaecae5054d7b8c9842b0faee6f094d72d7cb5962f057ea42a451e7c14cf354333ba09262c03b638bcfe6b5b57745d6573e7b3b5315f6923849b4c390778bca71a57ac5a2de07f6866fc80fcee4f77eb8645871ede33087fd635b7eddeba982bcf1cb8f92178ffa894eee88623116cc967661d116a4100b2ebb01c59a21f50f5ed6891636af5fcc228047c01f77e9ac941cbfe8d744dcc74f41cd711440b58f0f97f55ccadee1d87d8472bb7259665873c053421b7203695f469ba9781104de570348bbabddf78667a862afd612731080bccea59807174f940b6d53b55ffdf640603821db1f18e967ab6a1682786201ac3b718513f50aab6bfb75b61d00004fd6c400a5578718e4d954cdb19e173ddb92928fa42c5afba2a1067d382825d0e825683bf4b1405c4ab51071497720f809f9aa2c569fafd61812a57111cf58e4a46e532c7d283be72018c3fbeab9be2f756fb8a138b58152b2403706d16cc99e52ebb2f114b28aabb7602f93dea23a1fc4334b61469cdcd6e8954e309a8fabf4bb3e95cc22439f592af2402f4a5f377666d1b35a6af9785257fc9e6308b6f97b9cd8652cc73d867fc99323ce6c597e7b6bd1178c879c44a5afa1d01fce4eb28ad03c172c0f5b6d309b23fc939bd3e5f628156a1dde8d2ca71e190d26ceef34bbeaae48cc3297cf0636f37839cf3d7b929b5423287c35f9d15e1d22531f154a28b8d4aa12be688e5127b0782cf9774603edb4af575b102a65da07cc26eac3d27cffd4bdb176ca79fc84fc1fc0d4381e1084445e52a4d9a7140dcac7b9a94c6b4db10255ba1226f01cc9a7a7ea15b8674d841e3b4ba242049212635284550356a40cc11302e669709d7a0417ef0e2c499ae4af6b1cbfbbd445b0f8c91668e02ff0f1f89cc0b031321f146ee6f74648b05607802fb83ee10b40c1f2ed997559503821567c7a8e267bba0242e15684281c3d0a37c081fe03c7a99a856de4310d2c62fefdda7c32110ccb30436beabf36f0a0e905115c66da477e3306d94af57a76166c470702958507dbfa971697572c72a3d3dada52c69b1b052a28b1d820a9c0cb9c1eee836d935a672a09cf5b7da367b6a708c5d0c8a38527b573c37940dc6cd05db9548c0b986c5898129e39a64b3e137a66a2b8b0c987145691c4c0e1c0161d3c7cbe290fd1531794fd3fea1c5b8d59db6ae9b4459f4af1ba97cd9c3dbe90d1201b3c0b17a0a778681e208769f3c383a729e280da5ea983e5436d23fba8b54e24bff617dfb93069e8f365a2756e445612a592b3045f6b6e816fc781449a5401440c7ca4ab2d29949952caf684b4c70721de7bd940d68697a79b1da5d7cc2ce8c5fc889ecda4663e17f3d4b62cd73fe39cb14c497a15e6eda303346a18d23f71a46278b843a8b66f842f4b9509c0e311f12553b8400ff26c234a97caacdd2d7781adb7045d98e9bc3616f1cf4545da9ffb8590c2ac9a892004aae73e7906a2fec470be6258c0b8998e37adaeeb4f993902d06f0621f09dcaecd0c4c8a18e4c9a2c701b27426cb779ccaee851547c74bcbf0941c2c0e9b7802771f26905c4073a13857e745e515565958a552ba6f223e062c4d7c21a05abe3394b08cf95e386c535ce86f37de079ee98132976bcddb50364b48618c20c3309f25570372e8f6c57e188af7640ff760c4c614d208ca7506cfcd38290eb9e630da5d5845b2ce471b57be424e42c36e733c56fedb6a2ab4e946bcc1e7dd0e334694f1ce693f8ba353e74bee3396e64ac2cf0f614483c7c5c76b9483e618c0b8a0d6dd8beb55d6e46e68c755ec0a944c8f7d91b4a311c8e0d6a29ec86a5017b887631a9d47bb04c9a3a41fba032782401575355429464affa480c17ca678d596d5666c4f3de1570acbcb7e0e0faa29b4e28ac616c8c564ac0df5e9dd098ae9ad42610980479d6bd82cc81c643020faddddece8a2886893d79997e23f6eac82f6ed8f33b91e5ba6d521ee276eb395da9371b0fe44857ba887103b22dd5a77cc904c2a94b5e0c0b9b7e17ab6a75cb15ae963aa2364d3d158c21f401b3ec4dd30a9dfe80d896590e13462bbee9c8ed947ca215482613129ae3c1749b0858bee3093c81d2172e4b1c2b01e9097a9b51024393a0676e30eed2b0670b735666ae656dfacbfc8b314dd9cf49c232c9b2b69515877ab4a6bf0338143b450d42eea0c3f334d99d72b926517fe45d3b0a9783b6b5187bbe7ef6c08c22cb906ec86acdb69205ff6a61788c0a7bc8cbbdd5f962ff32fa8b2d5dfff85449d4a88c7ddbc901b611127d13092aa0e6e9324bdb5673219883d69d866ec8c3a6f03453559f5e255cfc173a83dfc9296e3c33aa3243592d1ea4940e54237aa30bbc849aacb07d3c09cbc32b84aa8b4155ff4ab5aa96ea2e28a8564c50a2fe842d68306cfd7dfe1b1c64989807ae60377d6301574ab10211e85c8a2854002f27fba9103efe646db73cc8f86ffc6e2b607368c09c0acb2d64e102c0b5b6c3035665447962a4b8503ffa304ac10907e80521604da9611cea38d5b8a779ee0f3a44f42b81ef0fba45fc0d0b012480e95a7d00886dd291d401a80ae7f35b94896d02c7eb9e3d2239fa60a3e1845a518e022a495c0f1b81959b7a10c6360ca47dda742c1931c11dfe1e5d34588b1578a583db506cfdcb4c507a8af40f7ad1259a16a9ce145af9700d536c7cb99ef94507c3010180be540f6ec562b61cb16453fd6a4c6c610e7de3668e448f3839439f48bb565075c428943313de3a08b04797ac6882ceb3b61f72b7882c1f7416a7cd4baa29cfeac2d0382b2cb47c878acb2a374f3e578e7ec67ca828e436d2936a9cb4fdabae07c042c40813bc4ce99d06d3fe496c7f60a24b5281e0c196188a9bfc228e7682661a9239ec5cfccf6366c94c92f994598f49ba9b99ba46da2b8b95f5a1019a385c98e7a89d4957e56ec1e7b6945acab25a33972872409c816dbd7ff1b0764b0ef8f926c07bc03fab1c1756d36e466bba5229c9753b6e90fd8e546895b43dc942200c662788e168114aef7ba8ee9a48426bb82e874c0f862a3496e4040d8079ae7c25e4d24188a921e2d4b447071d8c4a3fd5ace6cde1885b61cc9290d0ab31ab33cb570e858a0e456b8760540692ebd09087af9618e4dbe06c1219418f40dc7727ec602fbae61eca793a119178a8e657ac73b7a4054559683abaf51c2370a3882435557ac54ea5016bf5081b509f9e8d4acd97f08a0cde7d988cfcc13ec4719984a79adbf1ab2c99902439abf5ac601ab85a6506961c2bff0109321da6bb550152614036403f36b4b201ef3a89ccf7e74fb9c8bdb85dc69c718ffd3819f595f47fb8e52a026643be284bec9f7b094f5500bcb44554235ea8a8660f189200bd26aa8dec22f54c140f185daa8bd4fcb746a75485be4538c789a42235472dcb44f27f90a38803b75ea6d2e823c3e1fc6ac12e502c12490d8a3e81178baca1af6a074618f211f9f666e7d3547e4a1f4ef28592f1a3e0438fc8010c0094dc262707702bd32b0850a09ede8c62fb12f3ef3f54a63bdd3ac71032907d8f0bfbac57a671b0ffc1449b28f79adfa2a4ca14f2831c84cb9c431d9e435872b87971300bdbcf3a766225ffc9281e937f236e3740c39ee985a933c572cf9a9db538c0ba187c34cf74b8ee40ad2252cf34f1e0d354254e286606885105d6d06f77ba52a446c5f6cff014cf14b18ab7e1cb2017d52023e87b011149674c51e7802ff2c353d57481ea848d249ee4783bf0bca1dc87442851697a23430e2d31f6c7f60f2dc3f184df8a9e05fedd344a48574cc16630632ec644831e09c03f76a3d2896004877080244dcd3905cf00aede1110f5817bb2879e660b990b4181c561afeb4cc873164300c89c8874967c947b6d4fa3d6c2d13b193704bc0deb52551d0b82f36049419fa2da62aa63cf6fe23fb00fc8324fd83e350aa867110cb6548455fba19a5353a0c7000b0234dd36c1a8682735b33600329e62e121fd8251a139a7ddc2f0a1ab017f5fb57de9155b76cbee405c96b8303672b8e52aeee5590fe6b2aca66b595ff829e7e909cdd19df4b70d47dedfca51519379a317fb5c13c69ee6b3198536d5c1d2b53f50224d38c9c50efef5d9c8c0e85d09e2507caecbd5865fc7bac70d2611a4355586213079cfe38dbcdfe59898db25f5154a4bd5fd42ff2bdaa896c794928e09501636638aadeb46ac7ceae64668e54aa5dc20aa68202e30520a5c58d382ff82aa4b1160370416537c483ae8a30a3c56d03fc34396d25dee22f1c5443515eeaa15f6a55089239d9d68402a0b264852d1525479484a2a2acca4310a83c622f037122b4dc52c10dcc14d5231cdec4905e394c0bee429340f045271938063703c41f70f9333bc920aed919fbfc521283f307f447ba38a6dc5ba32fc29216c48907cfe8fde0ef38b3b99221b2165c0e9b75a204b5d1d52de90db7cfab3ba2deffd10cc35de271aba1fed4b0a153f99bcf132654d5823153c27eb21abe7f52e2f316c4709891bf948a3c5cd29498a4f1d54e458eda18c1e0dc86163c8147628f154b50ed145f4499934d5bac1510f3f09810b8c42f7f433b7a4d453a7988167f554e8180ccaeb94545fa6b4611673d1669e0d7389bfb55436150c3b31d9fa1175aa757038dbf71c100c7ac97239a7fe36ac45e28b23646b16502c15864b56f54f3c8d784a7725058f6795944df2e9d37cb61627aefbe02d81fdd0302a52dc2563595bde74cc123d27483dbdf39920ebd5f6d7c3e7a766e315314071ea9e0d2103882e666feac3a080ba04c603c61d41b0607f539c9042363745bdfbb7b73d894b746a7310ab5446e51a6e4f29e391957f2dcfdea91d83e194fdbbe01293143f04e2a37d98db9adad7a18bb635b9e9897e091075f5740c39a33f74e38ec7f604e4449785a2532754c6419f4cbade9ecbdb29dd514417da6d75aacc8d6df0c9397505bda70f50035a8d9299e9d759efc1c89990b5ae230a7e29aa37111dd39394022fc55e22e4837c953c569902f8861650ae988d4d453ca4088ec35216f72694f2a85706d81e52be692876acdea7ff72966abeb7dcd6a803862cbd3845da2c2957403c1fc6b37ef828619c754ecf14a55477dd534aca89d4940bfca9895abb8870a18a085c34c240226c4891ffc068d6f5f84985a6a87e4c54986952ae5c18b411ada49542285b411c0780e4110b1871262cfe0324647ca51dc52c1c52c7b863aa72df21fab9f42a3089dfa5b0a4a79d35ca689ff93c03607d36226124882a8fd099f691a991fedf4c4dc3c759b7468669f84df734eb1b0384bdb71d485cb0d8928f8e3b96f55c6aca6755e6fd9dd4583f9aee55b8af8c05c6bc5e52686417383fc6cfe1144b08a9dc0a89ac0f9fd9f3e3684200e5328507314df32622568d94abfc3cebde601df82fc1771f802af3a496c9f2a5b7510df4eaf8b41ccb3f7eda2d0871e4f8c80d4dc137f7fc682e7197de0bb77f96a4ff29090bcd2b278b28f4c44a8dbc6adcfe466528a392f3ae6c07e1b51d1f3df6ed10bdb02e29c545def5577ccb221e89610a29d5575e41e53465f1e527b9377a2aeeef4c31a534b31490d347af3ddaf4230599b461d47c7b82959f6a8a6768fb2a76e2ccd75a3ecb4f38d8bfabb4736ffa52824f8bde209abf35a984555982b5ce7ebcc19bc7e34c04388b905a39becd499dc738aff4522b7e075e0e6d531aea9756b4c6d6f2b3d58f332686cdda9da3eea72e1615f35c6757bb7f034146ccdcae644a0937c64ae6bed9eff678cc9de948dfe75b26771cadd9410775ae0168ac7b603c4f5e12c55708e5cb6ceb4e563f1505ca8851007e16332c49a8570715943b4305e7b5b5a895f3983d1de1eaceefdab7facd635544bdac55131f1a62949ece54d59c8b6c4f6d945d80bd3cd9bf9c29c167abbe84754a65030f8b3c02115a70b70ee2c3ae2763c19751eb2b544ec7aa8263e56932c6dd5c502e815c173f26662c5af4a24b36dd04c9b8965dc0581909851e8d3fa0db16f6fc654bc49386565ee7a343af62fbc823b8c73f0ce838fb204928d2267dbe56dc83244385649cc26ffaa84c4d87f19933dfcc23f47f43fdaa7e38d307219c0d59b8daf7c3d79770584a4eb522c483cfd1e11c52e6b5e78dd6fcc3f3af630774083a91cf91ecd3731d696b57042342d759a6890fb95bf91c1c4c6fd7cf770e3a3e60c7596be0fb83199e469ae3f08802c3aa45c360f4bd4cf1ce5cdb28a0161d85b6162f73f669e67db9216f28b112cb2ad2f53584b5a2e0407db92abe8669b736724571a02f3f64e51ed5ba08ec041cf84bb4843cb1e368dfb729ac6fe8275e9b3a304da1444e26845bfa84411584ce2c97ba7328f32da048d451baec0f6066cd022176312751caee95044625c871524027e57c12c226818ad632560f727e93b4119e1c20210f6ac4a7202f477e6f41873e868409f0a70733ac35d92db66226663fb142972d522222b18e21375add85fa044d3f065eb900fa2f86003a8b70a23a2b8f0ebacbc88493351e3a0b755d706982fe98c0fc5b48766f283d44d62990eea8d0528e3d4311e63a2443c6858c079582accdb071269553a8842ef831085fbf3cf5d640e58f4129c335b36ac650e9ae944bf85021af5159d1c921ff184fd7d46547bf66a268e569454f00ce63c6848338d541554e09bf4d068a0f820f09eed024f81533466297a4560b850528b9f59b4ce9e269332011e2567937a500d7246525539819d0177fc1529620549c2f81e0befe095463dc16119be0095f7847f4ab19d199542538e062851054d956e4c938b65f4875cda6fea1bdaa26291912b561aa3f4cdaf21b1693c3bc574c36d3c394c131ce28d75034f69d4d533e5c9d0b2f171bbe94a4857f181f244c2393d8b093a8b4bedfb1f8543e38b370b63f245c354fa55849cc07a83eb406daa00c5b287adeac9feb24f509df5054bb0dec52032ed198a7dfbabe99b3d1dd10c4154aa18a5f89842297162d0b6204bc6ac6312e4083ad65e91d0aa121c64ecc2a84d04e834f7c2a94dd9cf196c9b869bb637bfce0df787f1bf63582002e3be917fc1ba13f4be59d3c0416ce22a553a44b5c89059c2ec272b35245b163278a48dc1fd8d4ac82b1668a449a493a70e85c05041c559295bb3700f4c7a193f4440848a8961c59a924d6d95d3b5825d3b91f98d48d36d712d698543d910008808a4880e5b6ae91622e2b81402759bf4ce28e13ddcdd255b408a9d04c5ec434dba54820d278c21d603d60f7d1f1e252d23346da826dff78ddc528ae093aa8c06b3f741814b1af9cee7ab8d542c4cc5c93cc1902cfe47d3212bfb61ebea639ae5b94496826753c7c63d3feef80bafc1ca606281efaff42f2f9ce2eabff74aba76aa5c82e6e47bf44fce96c564ec2e5b65babd17181aa0421507e01f5828f31e63874c275c5f99ad1dd284c9cff9af27f28289d056e18b7c06f3f5ea6645ebcc0d717d511ddcd23fa842b009082e6a8ee33419e6894717b2ac3e4a5c9b683d603bb02c51fc4029bbff7f37fa3056731466633ffcc5274518f51fda98e0ef72995b1dde6000054e144cdde2a85d4b456bf29e4a25f4e0257e2b084c262cbc45932bf7bd348c98c41fecf05b6bfdda7d8cb66067004a07486c46293a9ffe4d4a0cc4c7e3a7ee164f6892216567f7b10ae89387c8f9f70714394e796d9df7386c6d36cbb4ea7e2cb0cf447f03ad607bab5cb4445e7257f18b3a90c628333abf48dc789960d49f42461765102d9bcf1b90878b60c1bea8a0dd9cee97ebd39d5f53daf3929eb93c90697bdd038f6c2213b09c80f3fe24a911788868301312b928d5324409e8ddce1188893140f9b999ae83a1e78d903976796ff9a43056da72e4824c7bb256ab8e442ad341a89344731e3d6ddd386d55c62462fb439dd78fa27d50f4a25c9ba22fb69114c2dbbd0b24ef5d9108809d2794040a50654ca48123043d3c207dcaa991365ae1f176b3ff8faecd6f8c66be3227f23c7795c5b2faba518b1c915c9b950d7a678f15559c071f09936be71da62c4199677622b45cad87ca2df5a90e2eb4aa7748a15067432ea56182ca5152d6c6c4732c244d1724fdc33610f7e96161e059399a88732dc3f6766a7c3ee4e54abde105d0ce8c489ea31cefcd0e8494321098496a5a6abac5d743b57748fc71d393bc5db063ac79e9b63c5cae3e7059a25ebe487451a463b45c2859686a9857fdc189e224d32460f359e726fd4f178badc45030737632e359a630a61125b4d78b2ee671c78c2c0980e46499b7d6fdd1df2aa8c975f02c91eaf61d582921e441594fcf1a4c4b26f4876a10517202b332d7afcc1305d39af1af50a134e48a8ec05c80a89a19c5c2280c4c6595c088bec0f6b6d8a2b7773ffff5fa140fb12e9b6ba8c2ba3580528d86da0643d43082a58a379cfcae660ad4f485448290d6b2b8437bc51f824fc24ca064ad78db503d467faaf32ea35662f4aec10a0296bc344c9d59236e2e9330e9ee1c0b9d74709cedd0cbf5a743fd1c766fc9acb19cbec868f72aae868752e4b6c1eb0d8fc874b6fffe0e0426ad3c8858ce845395360ea98b4d0b0367afa289d1f55068037520015c59d90eb4763f766eb21fea8f61ffdbd8c31c69ef023c8ed11c33a715682f2edc551645d4ff44299e44cc2c0d90683c945affb330ef0f0e3996f847fe8b76814f41994b010fd028d1bae8175865e595fc9ae5f2654604e8dec12fa0345a566136c1566b331d942ad8ee005efd59317f3429ab5401d7267a042a82cdf6f47b72db8d2e21e0f9a094ab5a187f688771a6193208c0f254996466277669ee917713af2bc17b88475b73c16c5ab12009c2dd45f459436c3d3c924f63d607ec13310c0d02bf5a740ad2107f3c051585ffe231c4c628d79778137a7d43b98e863d9a39583521924f337b1fdad5d15246cfd1f39129070eb5c4a8e8f4be2e133d9d39dce2d898ee05c8a90c0e0cd6829c592dd3c06639e37813f05807bc82e984a8885706e9b2709af0b3512a031bcf1c360c2875f01be69465ad58e1b542aaae848dbf4c115ae910f805405ad90471ba1b1f0d7f51980af7d1a2333ba0b531226a2e746ab1789c7894f7246fcff9bdd10e0e9cc18cf600810cb91e90f7749a8c806d378f619f6419b5e656a51449821262ab75c7118d8a9e819ea9a78e17dd0e8c8a3e4c321da000448155b2637a04d36848af447508404b44af95069c586081d19ee10edd31e0ee4c4e37108e0b75ef34a503061d95f68f569d06d61596c0af833bd130f9c1b9c9640226e17a8c5966645b694b14ba0415c275448bcfd782ea5b6655ce2402564c6a760226e73e358a5d708c5a209dfa13015662890d3f8d4d0e238c395c97881ab813973f711883fa5ac33b81f968c855e90ba56dbb24655f86f0d6ca644d39e58f1897f7b0a7c529dccc056ec3f7a0e34a9d4b329eed791de6772506b77aeb8f86b16a15d6b60512bb285cf9c2d458e407b7251498b2ab89bc2125002c4a293ce810e6553ac697aae362a25a468d18d43338b63f070b174612c7a59c8876aa9f5f70a4cbb1235abdb33591a120aa31559fe83bdb9cebb2106a135c4d097aa4e356ea82d8ed56977c3c770b7388dd192d3f34fdcda673e710affb86309e29f1e47ced76c0dff9cef1d7af47ed07d6d25e81da59d64fc746e40a3930ed5486af262590e895a353f0c667be24d7b6c58832c7cde9aaf2fac2c90cf4b52841dc240873cd523dff8fa7c627c24bbdcaa8440c3235ccf52acca8966e383e2e12e372f740abc53dddd473fe4962e3169517090ca64fc65723f267cee197cfea497793990bf3d6dcf62a778b3e3b40164a7de8c8e8dabae04e2ea55c36f9e5d77da708d0e69ee7c4c64efd47c1a170e341a574d39211d9bd21188dae24b7d2524aac6df7932a0852766e187ca4c0401281316acedb230c87393b1d62d151783f0107af211f1713aeb145f7243b92d55849ea6a0c2d43c4d6b33ab68a8078a38c3d713b949116fe536c89a384095a5c717ed065265b1854aa17f8fa1b49db1e94f3c65b99be4329df60f783e5c9677bd64a2e1c2ef5600900b2b7faa02fac8cb3ee509c56c8f1d2d1d0ca6f6141781690ec1dcc63cf4a8de6655091d142a9b71aeb18426048535f68a1dfc1b4aadcfb19b5a069fabdded364f387eabad2eff0490e582c0e786496fbdd3ae9820eea2f799b05071d9f8b9dfd817d86e905bd6ca9187e081618c07dabe3122f73bdeebad1983c78aee5010bf4dd2214ea86c59e592874bac96c73a1ad3f61b2ff61be0df5b08c3021a1d46e729106cb6f3be8dac5a828a9c9bd20c597dbd6a5e376de33fa8c6aaff8250a297d91f9355519acdb024f0c06130449c8f3de38aaa0e235995968c282c588dce337c064e1cd0bd10747fb28270d2f736c899393962882e2f0e4709a9cca2d007039537f19c3c7518e6f65f798055821269d8fcb385b93f406dcd91a539c05e43514efb80d3bbbb4e3bb23370ea0ddb746c616f209b4f64e5d13dfa1d519806418bb13d39ade152900d0f9e724cac8253797dbb56655a69ce167239904fde385dcf12b9ddc20da969aef627a6299175a29223de4f8f63ab94eb209c3b1a87d0650a87a838c849a40ce71c904577a5ed97535cce8670cc28149656e7fe0d7ada0ae70d2994685d739747c9ae252eca9ca3747e6623317514f0c766176b15142d32689e18534719ea1550ac0315e9d12db3e2f2e1107224b86b83a5c1c66b9fbcb112ea7e21dbee403a421b0ff5020e25989dff4f89036d85568691ce16ccf7d81fea35e62419929427e01e61704dc2567198151aaceba97ffe523d5953322a281c16c422a6a8ae4aa113b19e0640919a4e5c8f840d750be11abcc73b75cde857e9d7b6429f49f06b11ec94152648ed7cba66dc91326bff046b3f717ac2cb3236d293b21d91e95537f3324f6c22c7c41fe19ae0b90c97aee4a224101a3b8fa85b5c4a2f4f857227fcd59484629625d3246bdbaa1724f6844c9d5f8b61d44a7cf7e9b826931938242b5c42669315512c3252459ba0d6331488fa9debe44c413fe6dc339db773e43002dc066c0281d321e16321fc903955b6857c8b2880deb7b008c8825905a28422f8c8a6f1dc8e848351a2dbf53c38e8fdee63f40ef1d6ffcc2c2956c56624c5e681f955fbc7f95b25da9b3e9e87517c274b88114f96a5f43661f598d62c732e8a8a8515912e45b9e672268ce4c84668ba6fea7a2c91a1639bc6a8dc32fa09daabde84671b2e62cd995022e4c9360194fc027f539b1f4f43133d90d95b343937bca095d0a1d8425c73f187575892bfbdaff52f4818ba6c55c875a758fa987fb2e0e2fce594e4311a02334f6ee3f132dff4d4878a8fcf3a153c71736db6e471a2d7b3eb8a8da0c26495ec92c12e3b031a7ff899d67cddd01856d4d294b0831a2155d4f894086b2c2452ce0172b56272b2be74ae8768448c36b75bea90f76388bc88bd8c7b49c889eba3b3647f53f8a7cdb285ae23a7c62c9b521b0a993a23aac58dd512dc8763805ae49af4b788a62ed96fdb7bc3245ef94f05b66afc5220d5007325f26f31bcd954b9d5727fc4b31d0326af32575e904d715843a550c8928af9b5d3fab8167191150abbc1b9946d46e149f76d5ce5504671601012769f851dd2cd0595d2a420bd3561a3234205bbbb29486f6330de5e1a3db3adfdc4e468d3da807e37de912cb4f22f02eb66fed67e4ab38a14318273539c4e2d0aa6915cdd6e0f4e3b04c760b817bd398ca66bb910f2624ad244fe0bf10dd368708f9f4e4ee4a08fcae279c93ba944b4910002ca472c2c13dda77ed6dbe3583c348f4dc192f919e7ff864e3087b0ac1bae6fe603247f1944153bccfb1fe052250017566a732bd5213531182f94b855e5cfd229480de1ee7373ac14fa6869589e604fd66b0895549fdc508a20c5906b188f6661605f205503e2fea483838b28844f778b226ab931f78c03c4e25e41bc06ba582c535fdf01fd6ef65dfc3064281b90706652000311994fe879d8ed6987e80504f2ff3f557ad521ba37f984b7ddcbeeabbcb12bb6cd80fc4df200aac85c41af952e5690af10b55f64befb343e9509e64410e5a6295d23c4cd4472a407381d1e96bbb9cee5d2cdf391003ab1c3ab7f959b2e13041dab2a1c846d7ebe405fafad0394bc459410379ee2076625bcb68b7c4a32facee6ebb5919820b41365944c6eea9be55c71db9ed74fe988141cfedb96095e7e94943e232d72c76f835cd0ad21a03862f9f8a5d5b9d467f5bcd93d39ebc3528a6272aee74d247acbedc52ed72aff1d4ef7ae4042a7753673d5d609f75c24cbf20e6b2a0a4edad9fa7658cc428705066b02c19a119dfce4e226595df7c546edac7161956110d515e157a556bb4d704709be5d0f20ab00409d57f2497fd6e85b5e12f90e0e287b54d78a5ce68af2ab4bcf23bfa1226856bc66755a38f1ef8bbf9e5c39afa9b26535de6ab412d6a4d88f7586931715d7201e8599afe49203d1aa9904926f1ddf068493b00748db58f19f5aa462b3f0da6534bfc06410e2bc45c9d5fcc2ddc018f1b08290ddc035eefc429f8517a8c2985fc2aa32e49d4bbad6b0d9addbd8aafb1241a6200ef21819896d7f3cb99cb247008ff37db1e353cca148f44cd524f700a3cff3be3820345631c6197808522a91455cc0297d092292fc7d510d16d10f9022ade1d77f29f6941a1e0e49275121212da94731cbfaa6ca657c53cb355ae3440cce71d7cade0e1e8e8e06313fe8afc567660ddc19a94b605bc969d2c1204222cceeb333a7b51eb32d49c05a501a81e7ec5ff684ad5fc6deed8c9ac5e0e5d42890653313eae6a16a6fcf635c318194e7cbdcd00fc657cd938f960735feb27994e7adc419103536d39f53734cc0d4b36c075712cd6e8dc52a52c3c66a1e10807da89e343865c115f313347b6497d17fcba2970b292e6375ee7951ea4a073aaf4fd76a7d1911e6b9cc2f09dbb49950229daa30e082c71e31d152fe953ecf03902f502f7fdec6e4e53f3e212ee31a5e2f5678541eefa7087b22086eb11fad9d805f178b2b98f828ca3856741c03289a01212ba0c741df7c8efa9d57bee12a738eff85f148bbebf47acc32a1f8e7dc9e841b4690b213c438374e76047776b1e03c977a711e98ce737f1913757bc3280798bc4d9f9fe7fc2357f3e44d5822fdac3069d04462f7d0b9aed0a19890e6653e44a4f2b8f999d36ed334a7c44621b04389a0fd82df9b51f140c3fb058f8cce355da744a38c4c04226eb02cb228d41e22f403afec12e958596134c35f231aded03b847a30fba96b310d59dc1adceab44256c8852c5a5533d3b9aa18b774443a9345df18352accdd27808fbcfb1ad1fd8c790a17c9bc32e9b59a59ce541916ceb0973e928da2526524bd7d027a8d1ad4cc643664f27927886a99f62126589219d88227b3573eaad358cc1ab1a622aaa528889b7eac81c1cce785a687a7fbecf163c23103ae76489fb4d75b25c9779b6d2e335243b102b6477494e95bcd87d460bb4db967a66b1697e15b379a694a1c1ae28f88af645a3bb53298ee3d39ebf303cd1a769e1088a33871a6d457e0e55c1b327844ac292240d5e4523db147775c665fb1ccaae3e42caceb9db3394740249787efa7ea80e08a47e9aacaf3e1a663f9f6313a8f398a9cb0d198f37c53b90a13d8dafeb0ccd6c414f4c0c6de4c90f2d1a3bcd9ea45a056d268f1807d97a8ec5313269c03284cda28475838e1cac2e44c0744ee46b7f6ce8b4649f53a27d9c32671393a4d695e438608622b3fecea6e31c22d578e4739e564f2755e8a988ad37412a9897cf14fc00c70b960847b4df075706b82f4f8d01f0ea8969a1948cfd8afd3b74318206de42ca1b228642558fbec668d22b68861dc48938efc39a954741feb783fefb48e0e2d14a66fbb2e6d9253179235da1c17b30f7c09bc6d8a4367c84b7d2c15e2daa9bd18151edd9db4b0fcdbb168cd9b1d7a7625bb20cc550bf2dd65b6800670705846d2f470d1b528371ca8a253d7486538277035b7b1668b9e93244e42316e1e4a35c0ed1c6e918a4c4d9236c95e5c647e46b9db47de5f6775d08c79b5f509e093fad57208ab71a18f5176ebf1d06aedd7acc0b746920adc04c9aaf7e8399e03ebe018c65a2a3ce6815986fc764169139e1944ea727bd000be3b5409ef9155aa6ca95878b4a505013192326367a81560d253f1b1847e5d96ff24eb5690ed9459d23b54e9a0f71e454f270b3a3fc7f82b8a4d1632260b85e2dc388d094606a80864df2dc5e331c0161f7c2a2da08765118c8a94562d6b3e519182cfaa5d04277185794059c3efe6eded4f03995c62b416832dbd3a547fd5eca31aa07e7b2e61630bcbd727393efa90d1bab6cbbbdc475fadfe9a44e7d7425ac1bf5893e781b2966b91fa6b5fda224cdc2020eac23455c354613dea54ea9317d7d129fbf3c9ea28cc93a01fdccd500e0363c3d7be7e1de7188e5ce1fe947e369ae05c9af08dce9e897c38412b306db97f9e9a4d06eddaa0eab77d743fed64f7ae8512489f3886d5470ce8ebd12577b1cb08be33740e599f765d3ab0a0dfa2f05a3f7ca69db9f5af3fc6aa288591d5554d5243b377c2277283d349820eb2bea7a5635e03b2ab86a1f0eb7eadc23b0276369eb092409eb9f63609e66992fc462d2e8d2e4e5e969260e672b70d10dcc83e864f666e6b7932ad3b1856b1f71f475a16b5cede7a24740d1fff06552bdc6518a6b44f1c9a0fea4865913250041e0a598b2ef80f39477fc27ec7494305ce0d0ee8cfcbd86b76ddee0cb76fb6cd40b3204e0fa7ae8222aa102448ce00153da7b2a60566dfb1ea930b661e89c0b0ba22de33e7ff30312960ede84fb1157afd55c87a43026b126f73f94ce991678c2f5c2d0e54e810c01ca41c2a72991003fe76b909a7bb85914d83ed7e07ca1f27bc9b5bf38570e02224fdb93f1efb1c11dda1195e0a18badffd7a40abf83ecd573067e4caa492c5afd0d932d1790d91cc70aa52b221726433c386ab67affb2bce09082e825643c1f9e904228318c1d9330bff6420b86630ed85d695758f9c5d4f1c08be8ee362fcd263e80341e67eb297c1496e34a0f4c2106adf0dcdacbd409032dedc0bbdec19fcc86f9f9b04270a280253a288be38382803ca21bcccc6b99bd0577045e2d4939ba9c9ab7c4f2b9c37d1195a2c82224e13f23f8e020951c80d5a751964b12ee4d66d0017b4700176f03f5e31f3857064f4ac51877354efd462d0eb0350615f9d326337a4f0a00f993e0392426a23f92f466d4f07b30531bfe883d5cc8f91fbc16a74427a22270b24ff8830698a02f22c6a2fc825ed720869bec328599f33f93eeee70c00be57e605d6eff003a31e0d6135b58d61c40534c4587e3b9165262e9fb706e196683b2c3cd1f00e53ce7f880eaa8255798e3ba719ca490bf124a009bf3134aedf6c383cc0cda3edc50eba91d649c603b729a9398fcb12fae2f9c938f9961714dd9943df520caaaf8c28b922075467dcdce22804fd587c1197232299b56be175ad9931297e8007a0c458aff5a7ceaa310b0f87ffa12e487985951c4870504464b3c4c1c2c4027de126d7e48d6d3720d46adc03b4aa40e7f8c6a0930b8b0855e70cd96ea56c115290f68bcd62d86f639aed98f0316426d47aee53710a050aa5ed04d2de5e52c7842013d321282e15cf421d4897bccc64283f7d008bf1a8e6365b039ccf301950d812b618eccf145649a68968e842005b5497efb504a969ebfcc428e6a534bc4aea38d9dc0e0917398384b55f31ec255f8b1a720f8728136d20a213c1bac934fd2c7e1f55456005ca370066aaa62aecde72fa843810f64b475b3d8d4340d7d00cec1cb211c53a82e5194ffe7c9884d09e79bcaf2406e821443d24eb3ed2c4994537e5c0ebf00fdd1dd582d00b1d6089995ddfcfc39bed692b21421a2d4398d6fede843baf9541f0e3e9a0cda0f7af98efd4c85b17b72ab56b5700b3694798c2317c30f38bcb63d52b8d9b41a4108290e52580524a242dd6a9588294ca0f02e1e952b3f3b6da8a136182ea294780a52c288ca74da9c7ea6b6bc19906b0efa74ce8be12d1b45dfec5900e4da2f07392ec26177c22ce4a14f17bb66757dc2130b052c03e9c86e442cb1fd8100fcafb1b09c177cae896b5981a552186c508345200cecb0b4a763a1eccfb6b47aaf3663cbff1fbdf7f396f2e9e962789ed2a516701b516c6c782b97ab42611b035dfd56fa664a5c654739e80351714e766296c51ebbb7ac4a3b449c6f51a5c0a559de16f16885ee81bde4f26f43b89841b2b72ae3b30ecc028395c7f3a9d893303ef854a4782241a55b8d16bce5d85cddd002a0485c85eaacb9c728100d001e30f7fac23757420ccac4e4969650ec32780f9bdbf5be43dec11399cbec60895889b2dd68df548dbdc30fa36f14a2d9c04ea1a3680235a3ed1cf0e9437acf941530b59d5e8483b0192876d598cec48e197e86048f23a3be2a36c08ce90aa30d7abeafb9347a49ee26261372457f4ebb999851a00e2e9ee833fdf97b0b52759a8f7b904c5f0f67ac54a85534f03741c8bceb272c941d39af1d95dab0406a406b771f0346fa7ab9dcc4b99262dea5a9981b669915aa140393da78c4b6cc20ca6f7e8f0b1acb55c3a8b3f814ee7853321a2fc2e112d2b30a878e16d741eda66c7344339ff9e04c6e5c023a0a1350f4a538fc27b3fe2308d72dacf59cdeeadb7fab63d38c12fdd11c6e8f0743759d5cc1452ca3f87f69bcf057f10a3cbdc5cdbf924446bdbd4cb7cbf548e4f52ba40bbb515333d74b8dd649a80209d4f618c03eb615101a5e48be1b40941859646dbc984b720026fa6e5b94303a0052f9c25c9c97ae9fae7f1f631b14710a73013bb73541675921b2875b002e5d498d08163e82a8978f6421f2193042179059a6f8cf9f3dc0a6c94ae674950b75fd733b8de98defb32dd307f9dd595bbe53f347c3df9ee350eb49f5676d1ee28fa17bcd73a543729331d6b9b2ca1128a324d2b257b33a0c44d183e00bd4df37883658395c1907a5a80542fdad5ea9f93bd1dc00ad0f38415054a18ee88a98f2b5256103d8af4c899cbc115289fe9bb4f05868896de610ad166828714ed12f0edce8ae84bb71b32df732b2917137936e6eb5c7b40ed0bbdb68400a4193bb5e0741661b429e63a228366070787fbd0c33cdac548a9c335e31c47cadc5a83c867d25ace75ffce4975ff9fa324bd9c7908405a0067eacd11a4e5acb9ecca70fbb544a24a9f368075e984737f6bb896c1c8969751815b254e23897536a8af2f890e156e914ea713a0b42b0f6ca40b82f2dc83461242700a44f6aac6a8701aa1ec783325d728cc062ab5f9d9e2394adae03759cfb6df5e01fdf32ad9ba3c1ba29694d6b1d8cc5f715922a0f4c5eb9b003f40b419293450b7e92eb064f51ee529f88f0ef22166d8afc76c62285d316979048cbdf68a881e8e57e87c7832ea0b0004ff8f1e1f9a568facc64af15ec08084a425695936d98b6edc8fd7f4c99cce997bc46ca5f59aa1f4a1162fee93838010bdd0bfdcc6ab2e25708cea2f0bc2e6d051f12063cd59474ace729c649112c8e626828185e2d8ae43b824935bc04d74f6f629b25ec667392bec135199e21a2183160ccef3d5545ca90fcc417442f8861d73e5cd2ec51ea8bd42b4addf8db68ea433385ee9f7a8255d2436f38501c30b838e42baa5c4bd892ead63ea69f453e17f1da5e3fdb1b4bc9779558773f6e9cc94caa8acc9ebef189227d48df91b2db96ef07b4070ebdfe76bdde7cbfbd8a2ae2808654c0c2f2c160ba6974f0693f6e7e4daf17cfabd8f2640740a4ca760064f28906b67074e7b07bfec361e3af49bb53ed9d15f40f27704bc5fc3805351e848522ec2fa942507ff92261f751318dc481c86b3db2b562b036ac8030990a9ebab2c7990a36ce435afc5d2c3b40506acac62647726d5293a07dbf4eb1d44dfdc6c8286cd333427806095398c1687d416eccfa2c7f9b04c33ff738205e55dd2aa5363e357075851bc158cda6f1cf2ccccea458e021b70c2ae5c2e0a04815e2130f32fb99e05b666e7ab53d2e6dfaaf36c3771ef4cacf3a135347f99fdfdbd555ab509e8f1b53c6cc24e19f00fdbdd8fcf8bdf537b3a940972a00db31ededad5f8082462ebeb02089c79e5b8dfdaa1b50c3f673fbb44ec12033357e6643fb24506402d29005057f3747fd64dee16c9c8dde565a5ccd310ad9a7efadbf86a8e4accd2139d94af6edb03c1081ee43d47a12ca3d3681e3b447c0ad3391ae947232e8c03ba2e4673c5a4b775adf247f03dbd7471d9041ef25dba3fb5987a29aa1dc75af71f4240a4590c69047d9fcbe7652754b92807f2f9f11dd6920170294d5d972aa31fa57659c621e4d1cde53bd8843e1b8d7b2217807c2eadcad9c504cf785247ede4df6720c487d6cb05599499fd154de7da7ef7cea4a956004f021d22723fa638cca959ca8b21ae02912982c8e8563112c8ab0ce25dccb95b4273568389373be0362ae1e00fd307dc3badfde659af377c5a70ae1f4837798ab369aad198af7a1e6a2312e8328ee21e61b8e2c2ecdfc47839fd91e6b71c9a9dd53de3e3d622a9748fc06cfc26ff671600ebbc79e81ffdb244a2e139d8dc26cbb1d59ca0bfcdb73c48717bb43386c3462dadce036646a870bd95a7e3a2759e6e2dbd0ddfa592f01d1fd5284495f3d4bb1c7c646e6ee590a22c5ad62212e9cba0311fd1fb150d4b13ed272fbd6e21e33165604c5a35c781609342fd2f336941e121dde1c0b925e3934de9d1601b8c23a2c728c557c47171e682f9794aa5d399d38ab5ad73b6ce8b5513658ff126040aa68ae8a37e2740a08fbedffc262378b63d246ef5d904c6d6c784c556cb80f6982001550fc7001cfb2d8991b49003ad37384bde7ba1aa1c281fdc5ab99b9c3a7f9649c3354df226f3e65f6c0c8fa167378b45489865fd703f8768ceee20930f98c4fe5a04c0de50c7fa5492d5545e913a5128c35ddaf037406f7888da3c41a4e2790f6704f3d6fb2392365e5936f98294e134fd434074d925c7a39837df65804c11ba437aeade4c9af1c3a24bc1e59f393d50e5f8481da17c38b5c033f63ac2128640323a3b68c49b1ed2b25a14cbf786e85317d4d7368693ce11361e0b69a150d500d125398b7a623c88fa946422cf092c887c9be2a65b398dd1b400672439d600e9b56d10e32073270257b8f63da75e34d9122902819a3d58bba886529acc8825b166158043b69be595baf2afa33adb4c555e5b06a544a9ba8e06e57d5283fb9ad84534374907cbaa8bfba8daa34f1046a7708cbeb120a132dd12a0670e915fcd4f7e8c71573b27f1d0bd8e4b164ceaeb5c0b1654e909d584e30f6112e8b391f710a0e9fc0da4231096d633338f2885312915db0a3bc47898e950431e921b4d248738dbca4291a3c0225155d84c45103d2c45a1435afae134808799c73354eca043524c77120898b73ec8cd9384f2ea61835c716e63e6d7d885062671fa4d28cd405105797a28c2706c09510122ccc149a6fdcf54aa54de92e509c834fd01a7f82f96eb251f3d3b30d6f6c337f7aef2b012471a0a1d38aee51fd9a96ce8bdf389053d1b8d1e929fd9529983c2d7ac86cbef6d2a832eaeb12a0541bb4c12a547657030b51f0ce4b56da06ebf0fe08d96d27fefe85a4a432d242d71c6779ed54fd3cf31047de2c66088820bd66549c634c7236f908f245dc42a066e360cff7b29af45eab3a947093c839c7ca3b64656beb10f879283de0924e826ded008a914e9422a087ef6216a22313d31c7d2d9f0e48d02e64127adafa843f01c07259541d31b755399eacff38912cf71de7c1e9582f0ca8d9cab14ff09b68fe00c970077dbcc318c87ebb2b1563607d19568eb7e2018cdb233f49c776d3da04d92324811818c933444a8195dfeadd75ac2c2026b9cb561527006cc959f8ac83b114fd52db2b8d34400b4b10bb67b7c13fde387aee6e2f90f0ccca20d9504535b0213daa49b4e11403b168c087ec4597ba8a491183b883f153a4d6de9714cdcb85e8c1dcc13c98362ec8d0549ca2efb4c94224163ce0405195db450c5ee088ca08ddde616fc9c0f63ad7742bc7afe9158be135e043b0217199ed72c913cb823884af44de3208377a8713ba1d9f6f44e93d30930d4c84eb4b45405693268cfd35539a3d541a7ac0adf72037c1a8b450e6bcd1ee330f082c8f9770e392ead87d31e493c53c6e4a1bd51a40e7b0b67ed7b045ba63eb2123c976d9c9386a8ef4872d8c84dec18abab58ca5c565d8ffd3f05f5a1efdc6d5c3491b1e72df4d4eca0482f42c331923371f95d7952e34ec13b99b0aef2340f6e0068e56362700a55469bf293678f16d39dda65c2ba8ab1becbeeb362a5fd222d5aa227f964901d17ac68683d295dc86ab2d0298d71529e6b241916d880567491d82467a7e5e9c0b2856b2b3a4468ddb9bff3f2bb69c614cc6cf3936f9c332c63b63222a70cc90c2babb45d4ace8c661fe1d4e6e4bf6d68d45998ef42cd0abeb4bcc02e8e86319008c7df10df8447a319467c6023e17ecedaff420523089b7d8d1553ba2731cc3a51a2391482f4bc3f85873279fe215c58ead04fbc9c35aa44810c9ef7ee246f70c68d4147a171be602a7365f3920215a3a09048c7fb8d5ee98ac635ddc3bc7847ea776df0353dc50d87fc6912b671ca5aae28a58bd719baf636bbe046f2f188387605556aaeae323ce17f300e56682e1941f3e305d7fb4aa670ef7c33d08cadb5c93d1164801f09d468e44ea6eb41883374c7d18bc6854ab9aee8b9df4836c6c42adb7587b0303e72587691eb9ef0f1a52c002845291070a21cbbdcfa1aeb32376c740efca2614ac9ce8c6220551a66b93932f0f50fa420320846338f479575244a0b07cd1e4ecdc3c0a379aa2db5741a9fb97edc6495e9f2fafa492c94d7af00188c8a09015d8912226b9517870892eb7d29c2495724b28991192b8d507222ada5547dbf42527fd5ae7428311f8124b66b04cfc5bae06707b48a560a9ccb7ea257a2d967d791f35f1a4a2057a35084e5eeb47ea4b77542884fd9e1661da11df80e1fac2aa9c833b1f280add502c2413bdf0289c4dd4fe7784286467aa49e8346f98b4bbff63b5793422eb538cf915dc40e04825c773fff66f296d6a31106076099a414f20e7afd81b14ba6eaf20cc6e4ad4dfbff048cffc219200da9873fa24830934ba8bbfbf83b7186fb13808d800089262457055c6985c7ba9fbde55fd3884453995fe0b2e6b82d9bd60a79d0cd64edebdcdbc6fd929921643cee2664e292cae1211124bc4a84a5e0f64a310f26566a2f52043225bd982562d3911fdda5d6d611032667ba02c5634d206a775a255a53a430a67b792ebf45d26703221275f9123af20abd4fc336996ed3480faf880245f8af185da71550249388d25567ca26bcd50137db2d4b30af51a06dd5c660d4e9fb6d9b492825b1460ddef4e8cf9bc017bb697c8cca2a2460ced55192a78e4bc1dc5da88633ba7f27d6d7b05e4f4aca0880ab27c19d6aee5870eaa5199d31254207892f1e7539b2c519f29503f50c4ece48a2b3a52852686dba76d4f7f1f02a3eeaffae62252aa584284efd5852698f195d5716fbcd20b19584ddfbdf6b61493602c36fa9a87c4ba388b692dea00a06279e01c5865d5075e0cbceffdccd0b1d62fc9c5602b32fec1205c27761c89453ad36321413d523c1ed9fd4425b5103e9c99613148b24643b33ca61cc830c454b874e8905c39c0b46edfbe47c62dd53452f36f0f565a8b66ddb5415d0ea06b37f8483c3a0ffcc1a70966a15f3c34bd5ddaf57242ec70b2c768987449c991f063f1292a16043f63e3dbcc4aa01e4bf4b857f9160243327e10ffc44e10e33ed3123a8cc1c334f409c8acbcda8490d83711619164a4d7219aad006aad41351642c325b0e52d5ef9bf9d202b1e4565ac33cf8a1bb351d7c486af8894b2c849f713d4581db3fd5c1186ffdbfc4532e168ae9cd4854fb53803a278e2efae9e2a4e5dbcafc8b73bb52e515bbf0aef4ae7de8365543137ed9cd508722f8834e59cd8ab5acf40dc7a83fad6b115997bfbbd152c64a7601db022eb3ccf179e7c88ae8033ce53ea12856ce255b871a836c73cd7d288e5d5c39108081aebb0092639c8557ae36845d53c2e96cc792b4c0106b94b9f8f8cbd915eb6fb3dbf82228f4a69d0b0880a5df4248077f0b425afe2de40ee8e997306e0a7041d659ad3b814b2fc3635230c93e221215cd711791e9241b5b544ed9fdd9f9f0fa28b61d84829662c310c1256c150ed652166416f12354652128bafbc8d8ff0c64d5d84154ce31f8d11c5ae5ae921ad6e57441a2e44b595c8d4162a6ffd515e2a7961258537a1be938287e5e6a1169d8e042b8ac02921953d1bc4c7368aef1293699295fddbcfb6771b568e574074ccdf5c6096e758d98e4eee175e1e15dd9135e5452e62e648090fdd498cdf342525719b07ee8d6dc6888cdd7c5053c05c79e9d40456b0bd1b7e9d45d8263d2e73cb11c79356522adfb62ce1d3d10aedcdf36cb17316bcf6ee29d4209b7a24ebb534b775edfc4585d37150cf03606b4211334e74413d01028ac5a214d5aa10b5a0ed7f5baa6bc270402848f930d10d004449f0242fae9734054ca14c22d40d57ed7e92a126050bac5f6bbc4a6d776e662af1e8856ce2760ae9e359da6534fd5132dd45d16c133a746d7569269db3162d37511e889d1497f1af7fca4218ebd173f1aea4ba3b7342ae3c95774c8154c03222250c5838c7651c18e27eb4520bad88139bc4051b0056f388ee66d5c206ffb53f86851eeae417754ce9b57b3cc74c18076632b1985b1b11368e0549dfb221a4ebd131d60bc82245cbcb75731b1c1592a46bce7f328d4de71abed21bd9115c11d633e3080296ad1c5a67308b173d89f9505511202eaa8a2147b742cadf1982824f98823800004aa36b6988b4628c667390f07b8fae18608d8c7dbda44b6969bf0a9aee90e809f1dd4c784ac16d5fd29ddb675bd850a82b6ae96933faaa3a8803bdac984bba1c1d140501757b8c12606b809b0ad45e0bfb6838954486a29e553b816a2c6a9136b7a7578dda8b6172961d348791eac5f8f376c63c155cb13e309f35cf281431507239f30d3cde665938ac48f5a1b4e18a35c88874a823a13c61d1c44024a4b60c04c3ff408d67a602f08df38412d7df634334c3fb42104be47e75a1bb941400c72bc2d8ac728c583c4915235a6d9fc9c574d91ac22585b942cf69bd83fee6c5476bac187b94fdf3fad472f23066356190c7b2e68143c6dcd2132c0851d9752efab0828b9081c8e2e173adf66ee96445b068a30e211e9cd01f104471b6a1751125ac4178cb614487d7a43604e2cd5ceb29fc824cec5251f568de8d17302cabc5cf47a5d0d0cab6bacdcf9d14887a9c9f922c3de357373e83c2178fe976a1a365b594c20ab1ab18f5f0c13b07d2c8be69945291f9220bef3754b55d340649959c3d911d4ef49f5c6f2f85a406aebe6565886c0b6b25e51b4745638553dc00d56b37803ee4113da61857ebd1ad1fc012f3f9fb0e1c676c49f7096dfabb8b1f53d03eae90a0592d881c8d3f8f058661fbb80d10d8669e9a10b30e86c9ae9949bb6aaad71e1fec235b810fe469b65a024e0d6b0b1ac84d11301d3026973e1c7bd173a9cbe7a73d8d669434df02d97894415b4302a323bbe7367d4825c1af1028487004de45b5b75ec77af3f5cfd5fb702a547d53814fabb8e57039c807f2d484bd2022edcb85e374d9eef2736f97e0343960b9f7da0a8de9f6db65d646f2143ec71f042905c702591899c8023c0543dc74164732c549ebab0d25b8da99d26a7bbebe146f2b7ec58df5ab0b4230b5383e4c412d802f37b0fd221dcd491ab8e9ff4a5a153be8c7b3d871c9585b6bb44ab2c3768d207b8886f36636afac441ea46a85715cb573f874e5d4fb47a90ec551323ae07b5265c9748d4e4e95f62bdfe34939d71f8d7597cca5752c7ebbca0ca85e5ff8caf0957db188795e56acb23b566c8fe8aad0bc60250cff5d675b1adb4d6b44332755d010a0bb21594b2fc51d497bd33e4539f859b8b60d1782e457b41270b31e78ce6f13e67e559a3952c93566a90493aacec5b12487c7586cdd0d159ee0ea3776ad50fa5f8cd27e59808872c5161b60487b32cf8bd251c0a0364db211b8ca76b8d8558e102eaaacb8a98d6bb4885f34636ef29ea2416920d969699a02aaed2699e3c3465f18ac2cc151d0ecf405189b6d781e87451bb76aff4102a9332ec022314968b0163e2b08a39a967743dd34579de202cc8b4ddeb442a73afa3935a2d20984c8077f3184f27768cd8cf6da2d67ce1ba91b10a6f14c4acfd8a0183e1ab06175bba9dc70a5d5b4942e6b4510f5107a4d7414e1a4a3b4214c2ba888615b30616d0310c10762b08690d588f3ad0ae92d9ba3a67464a6d8711c4698118514e9f41bb01b4cf94d430d3ff66e6956745e40aca11b4fdfb5474bb4ad2b087549b0ae54ae7f426b5a331f18ef00af89dcd6f5b0cc952c0c8d4b3afb60e2422a1593769220eb36549cec7e43367b51d3f7b36f8af1143253dee3695c69a52402df8bfa2e7f062a3c3871c15ae34edc92ca6cd4996e0a93533730232a953cbbf76a49a111af463425b87d9a057c89042d2a12e796e861bce2a3a64d44f8051484b17a1f84773b72124e368b3442f4bf3f83a5d5bc02ed574e3701a2673cb77d0d96c3de9b6c0106c5e26d7bfaa87c3761f59d7f318ab69110fc933b6104fa2cf127b22f0455622b30462a1a4d6137c347efde6e2a90f94481c275d23544745a75dd46ea84ac8a1460f055ab6dae395379ceb97791cdd09057ed676a07e11bb43f14748669c9a9e9df10b299a68c11286c552f9a9e230a19b5a82b4bf577e6df054f42ad9b52e34e64961efc94491e823bc35ab7c5011a3daa8daa9105554d11b396cffabdb0a64fb6c512481c51a03112dc5c262bb64dfdb9fab188ccfffebf7632f07dec99a15e69a679bc34f8b0ad4b43e46007854c9841df5c3777416583f002fd2138aede64484195195f2d87565ce933483df3ad94f5bfa8033da4f3041a591a09cd91bca84623f38a95b47e3d469bfd98ec70bd72169e65c9621c8db39db3e0c80af6a1de7b45c4c7e5f9501873f831998e2c89264b379ba9e1ae045a6282909d2757e5b75c7f087740db7188dce1ed8f6035372ff8067300692a3febcf001b24be9cf09ca4e70b3df0890deed4ee3ee34e9aa495d7f17812d5d12850764a2df6421f9ce741e968c909b417e05f074b07c16ff86a1a8e7993fecbeba9acf5b506e08089a14fa81144d0c8707a97fa310eeef266d112818820c011b9ea5367fb81bfe4acc5f028e211005895e44773399e0318116a66c2bfba9cdc341ac1b44cba5a44c315bf78b34bec292004e375bccbafa1b4d7d80ef78a3f0041070a6a2c5d7d3f9c3240ca3cd22d6a0f6216309f9a5e580d7333f83f3f3a37c825d6fb977b369e712c3e5a0e3986a92cf0f4f0aba7ce9043f641b042c828446c213e7574b618e3a24c0ad73cc751017264c036c1f2de71e8405bfe50283e9821476457584ef78028106f6cc953598f87090f19411f1bda68f373e373878f4edd96b6987101cc815fdfac6c1a5efce6c398fd853fb25d8ca1f8ac20367ab0c77b2452be15621ffe4ecf74e7953f4fc54ff2e6ef2b866a6d1fecfaf2ed69b6811addb8d5dfda298d64dd005da3bbab197951903c8b5500edea2110aa29b2bc5723f9259a9a98a6ba90f469769e4b8318bf50fa22a59ee107c0052115042cd68761336a96ae7202c046f99cb00f0c4ed8eb686a3a3672bc8deedae60d17462b69a4df2a14be64bc5824c2eaba082eff20eaacb818d826189a5f34b306be4cdb6fa6bd5866b846d6fa326a095e2d9b046f139168a5dab6ee017b8da051f8cc6883f79a1a1472eac7d778f8defaf5f53ca29b17275d7a45b7161f58a3542c96b75707333bac8f50699cc390f56d50dfa9d257e44037d3af148606ee20918860d485eb4220d7d331e235080a646e502f1115c99157c47cdd12ebf1403af57c3c27d4f29d2aac533f291cd1b9738de47005b132fbc343c053d1697ff5b225a4cfed01167e863ca834b1ddc9c8a168b089083edcf66c3ee3545fe0ed23f09f035fc8ac6240ac8eaa3c0465259f8ee8dbcadacfecd009af24f60234492615940e5ff5b2cdb576dc34f5c939e76e373977145bccc809a157eb7ff4f5a9cba62499111b8a759a91b86990a480476f6984ee95db5b0d429c1714f5d9111d1dc8bb54524e3c4f8e60be623065867b9b2d929504b91f8dbc889a887dd3d2bf3789ba524612f7ccbb33036cd5e01defd0a802d82d8348319db2292979ae30043f5e8463303a7566f425b120b160a78fe5e77c19aeeebaf2ad1bf1a7e19a9be460fbeaa2f6525a85e3f75e30eaf62c4dea73e96f268e9770c64db7fd17208c9d83e870f6285969a47e14fc5b53a30570793bb964cf10f3d3275a1206018f266e48e6567ec8d2862e538af0d7587b20c78075d78a17027fb6c12d3b4578ebc63f2bce684c5d88d024d6b4bf44841f4cf41fe0d90638139c3a8c61ffc9bd31cb891a37462381692ad665c012d93b733d6ca3544aa2cfd17d6f74a3679f5fb598732904f7657c313ace9f23dba5cfc0c06112b6b1c9d720c81403fccbb16902e8952c3fda93230428cb8cd4b5a60def33d02c34fa1f01420b58a12a58ed0f2c9f32fd719eaee7df5b395182c558c5dac152a9ed0d0554f19d88b2dbb5e2eea8d9e8af2d221305f105442e1ee4b34152d2345734ee8e700fb30f3cdbab2ada6400f907b428a09b7b86418d2d3cb31171fb395f5b848130cca798e8c46acab4848595ddbff2a0c54667be6c49cd8634b7881034d26e3e7995575033f6785dfb44c9f4e9c2898939800b716001a964aa956560a955148e4173def113bb25c04e4009c1f07b49c9b434b10a7b242c6a52245cc2033226bd911da2ae440236ddeed77cb188657e8cb464f66b5fe76eafe37ae894da4498f034d6dbd749056453a450faaccb80064704d7b1c389320a5ba584a6f24ab3e86716969dfd6707b67b6eabfe2a2ca77616e11e2fe05e35ef925c71f3d349d5dcd7aeee5cac0f1d45b77f72a4246c32884f6432d010d9b3d52333629ff49bc8e55f96a631e10e84815ea31a77b0442c5dcdd4ca47844099631735e757f5fb4991e680239217d732886357bc63d0480816d26989d6eb264c3d016c0714abf5160517448795fd56c1a4789f5e699360abe27d37174882faab4a62cce4fca2872d7fdbbcd7a7a29bf4c9ed5532f024bf1c0636e37517b715bc631f784d283c650c778801ba8b9d34a1b3ed89aed517a56b45166926e1412ea2b38d7861465f28a6e4fc32c402069dfc750c30de29b392c2fdf043e649c2b428bc162537d58aec9a4c0f3921890c01edeacf4f1e65b9f54d148bafc7cdd8338042daed3acd387701a9c824fb04a6ac587e30f846f0de1ba1c59aa2233acc7164536ee79913c2925af85b3a730d407214d81581545aba1025f73418b6492a5c2aea0c07755695e776efe1f46f6c6d0dcdbd0e4fc6cecade3395917b5b280551e39e62f6a8058f39aca927e347d7f9af7dd344d0f77e01118e43583dda1efc749c405ac0b4e4016df13f62883f8387962fd720f3afad76e6d43593d2c2bb1f547d2c98d4eba9e76933c9b90de774c5508de9389940a5dcb79a1b3890b39214087ee77ca3a9af2762c2f1de440ae057b4c036f967e6ea562c8cb9294f8dc9c8b1fa549c8fcca5714d2f46cbce23d012a235597d1055befb6528d8d096369611c11c39a16e698ad5c81b0264698bd838ddd299402370c9954b90a2c15c9cb4076a9a1715bbb9078199b9d2272398c8090cbcd9c6f0d574185670ed99402bcba31574b646bdb495c60a071f3497e5e7c98c013a6e371c5697663852c5caad40638679cb24dcd54e923169b5cb4e2b13b66b72b2baf0991b0fda97bacbce3010ca68e27b169933d46f8d9e10201d4b500c93e946c5671efe9699b2af929f85acde488f1e49dc575f4487d45cc2581c1b4a683b8f9d3a544eaefb73318175db0828ae8bdbcfc78fb8defa48533ecab681ad8a768769f43045ff83b942be006d8bbe95199d1d1b9d7ee14e2623a1e50b60960e94712c164e0a9bc85a3af430633a6722819720913ba6627f5a3fa3dbcea2f2bc0e7ffc9ac44561cf5a24acd7673295ee542ecd9f4c7b9fe5c65ae0d6bb5a8dff9f85d73c197597d7a80c94606c2af76ac991ae9d7c7ed363b80569d378d30b082ba881f18ac081a13743a02283b86eea640e3a03a14bc066dfccbf681d1f3b9cbeb16556c6717a08f892fbf1034db622ae1908cf4dec8574f88135fd9db6c971a6da8d256dacea7b0b6bb4568dbad839ac20ef3f7c463ed786eb54efcbde2fabaf8ca33b1594e474efaf0ffc55d3a79132430aa0edfdf8115a321389ee95a042a1d7c6ae9fe1cb36dd6e8a91ee243c0eedb3d03ea9af87164d77ecd450ef15a92478f76dae2bcb63f98848cd6c2c396df273b0c4431c3fc2d18cd3ce1a420d7417ea3ec13a7a017b87b89c8d310cde0682146271e55b402d7a31832d0cc22fb0f4c9fb0ddd7875734a40769d7ac128f1524021249040f890e35b11e71c0701f88cd818717482c1f4817f32169723376b17977f3be58188121939150421e06ec9a7062e0866be5a5d43e1e2c29bcf585941b5c729ab935a11f4d15e645aee9e13857e2241c9f11c067e7cf7cd2703a9de6ca884d3993bd4886249fcf94a1b03abc9a0113053bcc50e91d290dbf67b9462299f190bdf1c6ccf17b4ca0f7e9afbba143ac3e18ef44d5f1df68d9e2828c73b45554b837ff563364f8ac072e603a19f261fc8e6c08e40800d0a01b6ffa947673f7cf0936cb48692f429c9a241d322bcf94a1cd58af54d607a18e9a3547ac0d451d09d1415bdd5e92d63765a0196e7f2beec9883e9e2603cb83edad73a43cc283742e66bc0798d47c04fe9412d25c2a8c5b9b26f19e08a76bd3edf1264966b74dad7010818eec13919406c76d4ec09a625f516c8882cc81b63128b97e772e343d0b247a041aac8bb85c40981935076dfd727ab99e48c6251f1b4d46f92208e168c94019ca28ab84102988d4f1434ab3151c313221bb1c21055492e60a5adb3b0f28a3c7a7c580551202bfb2596bacb8c4302895d58ec5b6df5a6b2db4b4b449681329539201080b070c460b3b4332a53aa71fa9ce09b01554277b17bedb40d10b3f413c5a18b0d3ff953375c22376fa7b6b3e818fafcd27f061b852fee931f817fc07c1ef7fe14a993ab9705ddc13f8a4ef4e4f6fbdb4a7a7157faa2b40ac63c5d3ef5e81755c57a53a4464b3bb290ea57f5dd7a5514a5da8a30bd115e0498612715d1487e6501c4a04a5171e6b28114d290e2582ead02794886e8ae3c27571e54c6d2e1e5c71f2a9e1ab51356d16d6c8c015a7beae5e51776cdd476a310cff512896be764c97de210d613984556c67eecc9db94343c6c5f7ceacd55a14ea3fdbc92e709da91a0af0b0ea50227c5838cb0fb6896118864d6c661ff7181eadf7acef5efe1d6f77c7ef251e559ef5610d7b96eca6f5de8f19f6e6ac5847f7dff7d7de611d9695618d6157be2c1f64d0c4e6e7fd8d292f0cbb1ec3acebba2886cd39b19f13bbe89cd8959db735f7ddebbddbbf75f6d773b7ffcaee85bf8ff1c6baf72ef7dfedbeebcdee86fa598c639746cd2a9e7876dd45c9366cc5f46df494a66283dab0714bef7957e6cd5eec8e256a5da156e69057b181d5a652b7ef473f4a4dfbd2c546587bebc312a8621e337ff4c33a1c67de67f52fdc536a747457dc53b6ae72f537ac560c6b91b75ab2be6b84442ae5faa24b7aec7a8f893ec6ad8e87d1977e76343c5c3dacb57eccdc2ece5eecb7abfd8671dec57e87d1974497b46db77e7718feae91ad6a2f3b1cb418dfb63b96f2f625ef560fb7275dce535b090892ef33f02292ec651744e7fadf3522fa7a6948ef72a816ff4284ada7fa454d78ac2394c8dcf12199523c733aeefbb1b19b39a7d7ea87614f573cf6a251f4980b17c0cfbe4596b578d3bb30652edef42e9832d367efc2f42d4c0f5e29f1c8c362b162c56ba7d38a9187459fe613d691e193d38e4e21a6d3094f21a29a0ceba0d434854c0cebee98fe9ae434c162b09c2639394dda66c57727d3f652575c99473f56fb232a679fb31b4fcdcf7e7bc94ea6ab2fd3a97ef631b33e8eff5e4ed17bf62b6ee752f638441885da5e5e64ec1f857aad6f66add67adf643ffecbb5c1c35aabb528d4ff587372727272784e6ea282dd6a5141af4c2b3ed419bb9087d485b01609919ea5cb9e85e5b33f5d29531966b9a58bb1a7da578a756c9695ab0e91773a508dd35ea46118765117a25cddeacb4c4dcba5702a2e850be9b8144ec5a570211d97c2a578992e3d666afee4f05837d18642d9d93a33355ffbcd4a989e376caf89aeefbc6f51adaf75376c5fbfc773dfbd9cefbdd4be6217fe34ed658f2bdd44e56da250d662376c8f7dcdb2ac62ee5651045cc8a5b03e1af23ccff35efa10446f481f6ee0f06e78f2060eef7a466e5eb4bf5d377beecadc5d23f6ab65850ecd2a2ed4d9078cc343cf0bbaa1735bdc6f2f5f1b69ae78945fadcfae8547955f0debb0f07f864755d3bf71a36be0b08eecbbefaeb126bbd132e88d96512ba67d8cdf50ffbadccc62a611fbd873b773955cbd01bbd757eeaf3c25674ba81b9d77377472d6156a650e79952c947153f1f0fbbef0d857f6d848fee57d7dd215d5bfaa763faf71d0813dcd1bd6918d54870de3b126c31d03accb92a816b496422076a04a7904a2d434c69be79b0118dd7a4af3f494a692d35368f3f494a692d3539a27c6e987d96bf87a22d8f9b57e53e929419f7f425b73d26933a0d6afd8e94f21b5562153a7a351311ad8d4916f55aae3abfad49a42ae2be8aa780ad97eeb526075606fe5f9500cc92bb27402858d95395f552c6dfdca91ae14b59b65d53b1cbaeaa9faa28bf254fdeadb6bfad12dfd774f2fba2ca1e9256bcfd2239f64edab76577ce9827fbaa867b92c368bd36e7d7b57fce882ff5dd48b2e8b97dd0d1de9b608b25881aaae5def966ef594f62c17e529ed4da7bf217b6d7a46481fe3dd9feef72c5754b2e122e9495756d58c171b3cb4fe9eea0d5f42eabd5e76d785bb1ace3b12588ee3aa58cad1e76edcb01ce70367378eb3df5b6edb3c0f8f32e847d593464f227d292ce1917b121e559d8747f8c68d1b374a7d3931e79ca3e95d231642a0cea8b3a08e86fd65fdf439fa917b165cf55854e15a7bb008b008b008b008ac033fe79c9d3549575743a3759eb5df755e37124d37953ecebee6262ff9e724ecb23e3ae2bafecfd37e0a9942a69029040a77f78d5e94d2efb8cbeaeee6baf720dcfbd5a1711ec771bf65ed35f7319e8ddb97f230cfb6d92f7b1fc287f0217c88ce3121e69cb3b330cb12592f2a6157e98e36d7d0884a2251e9636649fbeeead84a2391e84ba5d2775a271a75255357d2b0cb7ace492311374da5e79c34d25e84fd65fdec91e8f338131e4b4ef2918bdcfae71dae1ee2f1a516a9456a11d993d180ce39a78e117bfa3f2cccdab72cce7aced6d235b3d7ec1d6daea1e12cc7d98f99561b5d1d9bed38eead1dd91f69cd8d18b03da7711f3747ff7dd8393c02c182e68b9ba4d1f6a3c8729df6f3b7db4a5a8696553c5a43dcdd45de595554431324e2beec45df8bb8d12644bdf43ce846ba3c926c9d64947d4fe9293d450beeeed4fb5a43b34995ecf9542dea9a2dede826eaeebd6e6969c9b62f20b2743a5522a79aa4d4273cd6e4d3772552aa479cea915ae4542a9dbe964aa78f99a7d3c9542afde9747a5b427d8c9b4e2816564ffe2e0b75faef2b5d174b372a145d6fa14e2ca6121e512429c2a3cae2fa1fae456a915aa416a945648f06e46b68268e3575587e9c3933c7d6d0605644b2a4b756644da21f4bdfd8ea478d488fc9a6d853162daba3cbf4d991c8623f854c2153c814328598ba1ed1416d857695166aa19e52ba4adfe8fad2e84bdef7fd4812623995462716db493c534fe9293da5a7f4949163506c0d4d27e926562b71fab197f492565243233b09a993643f7e23d18f358faeff4c3fda90bf1f8df0a8cadfd34f74c2168ba9446a25ada495b4128b39c1e27edb30ac86067b12e9411dec4947e8f891b12691bedbc2ea63d645d2eaf55b66758f996a6848df833aa48f99248cf4a6abc3235912097b13e94d98e963dc923ec6dffe58fa0f7b169975bd65fafefb302db3584c2512b6bdf51ed6711b1eb5ac5e1858c485c1225a86e53d9811be1a9a91f4a14a5fa3d175f9f0492aa3b63fcaa0a01b3726e94777b435349ff4e1935548a31169f4a4cbf33e19f4a3ea59de449ff42c7f7ad4951e9ef0f83d8b156193e595da7e1ebe71a3655c376edc3035a633bfaeebba2feb3a55d7d05de38c5c7f9cd1d2d232baefa6fdbeafb3578727fa3e6bbbafe4fdf58944789c913beaf42361d18f44dfb778b7a565742d2d2d35a2be80e08d4674348978a311f5e69091a88e467f8d3e668eee38bfaba31bd9d1e81bfd777df61b95ec8f246a62f97e8b3ab1f4554b789440cd48c2de1432854c2153c814426b448e3d21496e1064e9e4083b793ee82f33f6f27fdbfabaaeef3dc847ffea18b3b764f67df4c2fea2d8cb6e01d66b347363cdf59767ad7d0f627d888e4e64edf5def7ded5d67e8c8bfabbcec3238f697fe4314522ec51cfc3230fdb9146dad3efae0fc1591db6ace111977c889651f2b02d0ef3a159ed24590d4dd649ba0986619da4f6926adf62ef89de72189e5d873117618b8d80e05a4989c3b2506f3c48adf5c683d4ac560f526badb53e8f4ef4e366472edf5fa96bbb5ee451cb4d1fc287a0f4473b3fabf3b3ffec2b910c9359764939e59435c926e56759dd21528f90f231ec7fac47268661daff7569ffc25fd9cf6ceb798c914c231bca0e8fa2d247328d6c97b18c300c63c1be34c25e6431d1db7f6c546241b168f1efc207e01f00ff31fcbfb8ff30dc7f7cffef9532f5787cc105ec028f2f2d308847150bbc028f210a9ff0f82cd8844ba41126b29fd7593db9c4bde01d15dad50eeababb83bab6b275dd5f5750d7752dd4759d8575d68fee7d57b78ab579bdcd26a7dd4e522fdc534a5ce7d80fcd542a952aa333cbb22c0b3858cf9096613dd9bf621850fdb8772a0e0c2f4eb906e58c2728fb63dd0da69cf14061fbc78c87c542616330511e09e342cbbc39b169032f3295410816acd7882ae5133718419676d63a5a1845b0a3f49199991788fdceb27c22073ac8b3b12c9990024fbbbbbf9043d40877e13c2561789022100c60c0ce94fccb27d3dfa89458b0ee65f9ddede0e2cf14456dced103a0668a7e8c8f94602f1c5fd197b1315da06065244c67fa3bf0d02e15e8147d4d6b17d9a9713492725c71292063f490315a78489fa22e9f09834dbed8e4e4662a0456ce54aa7a20b0de3e01ecadeb670264aeabbaee2eb060bdb1023cf48721841dbb0132e59f841b26648f828e0d19c3815c0fd8bec16de3a10c55b48d6be1099b7c214a2412684b69f0811de5131759c35a14eac3f089dcc1c3b1eef8aaee9e3936144437d5344cf343d46cc878488390751e3051c335666a3e0d50b0955a52d8e48be5726fd657d7a9fc6abd4e978e45549fcbfdd8f3204414e9e25cee16509ff3d043fad708fb32459f4a2a25fd279428226754f6d8d05eb210f12004151eca5438d2e45a31ca432ac4ccc29271881f2764200a233af0849a22aeaca0063727200213461045d684ec5cf61953c39dc80f56e0408a2a8d7a77ccdd9faba18938d95470a54e9bccdd515f03298664428022fb4bff4a85d64025022a3b70420a2e20048abff4af338630b142124d90b284921a1c0635647fe95ffd5153babe63ee4db23bf516c47858c31f0797010544488282215670425480952024410a251cc10344447f1925bb37398194ec2cd9a992ecee58f5c73d3109a8a1005f8d9ffdbd053a88a20877275480f2294b1d4471816cb3d4411425c8232a8f28ccaf2768b063258a0e3690852a60c0bf5a2218c10a38508acc400949a612ae60831a08e1491349f84bff4a831386f4c002527652d033033984234ea640450533c0c204a87cc008422cb0842d7cc0ab0c3204aa00240a124c5901139888e3fb57d761842296a0b3030b746003a27b538941cd06a01841859f2638018324a2a4c1146ca258810a186840c8cde6990725650648b84205144b041125144f34d0840c8e38e1048b2532909a029020d1af9438b0b24448f40b2a11e709a2b0c00e15a0b0a181018a2b5441fcb17ac1169e80018af8e3540471628b4a01c5055c20fe08a30871c245040543b002c6cd7b3911a209544420fa955718810ac4ad727ee90a6a20ce4b7319e181186441fc31a3080115a274028c765e1936441c11ddfa40901516883f4225a0608214e7a54909c9a006e28fbe4142e49a9872a5e3e615c0d0077c3c6ede141443e011fd4a71fbb8797b054010018fe8170148889be5e685e161018e28094d8e0c897e5542e2369a4264904304f1c796030b20f183f4e35132c0c447f40b0314712b71f3d2502be0407102f14748832b3e2a2131032e4e4c9d003dda4116763084e8575a4104e2c6c2cd3b8b48c1c647f42b738044dc6ac52eebc4a29fb0840d8444bf310c117f7853276c72ba4c67a20851e088349a124cb0117fc020710429349814f147c905e2c4d209c0440c7e8e88dbe4e6955150208423ca1e08d98290d81dd8800a7a44bfaa24e27659179dded2bab27e230cc1e446f4db6203e20fef6ec17c7007d461210416d1236588af4620ac972d7377ad41c743ea3f68645a838e653d66fdc4b2655c4f6f0d39997e0d381e52ab06225a06c513d760ed4adcabc8bf550cd690b93e0e32575c93b15993698dd50d85943f2dfcc5ccc9c971e99edb327f0e8fa81e2dfba14a8c50023c351f0815e59f207b7272727272729e60fd25add712361cd429ae47ea114a2f6a51eb713ca93ed6932718fd51fa5c14ff703f5f2e1516d6cf365aeb86476b51ff148f2fb5482592e97707cd26b44d2d528b34c1fa4b5abb460982a1b261fdac56948b9d296feb9aa1eac6cccfead090452714a4e3608e83391edb7fab8e471e37e14ccda7d7093e84132c3a31b77cb0c917dbf4562de92599f519a697124a954cd50c4fcd2e0ad64b4a5a4914acbfa4d5e7084116b7753675a60e67c96d7bcba94c211e3485c8fc70db8da1af5df9a4ca145225c852b9bc333cc466507a518b5a957acbf0b7ee85c75665da564bcba0f8059ea516dbd2d232030ad65fd2aa6ac2265f58d943e8f2cbddb25eb3f07861cde31ee3217dfada55cd147dbf33d509d94a694fe90174b73be6986342567ae8d86551cb2d1a6cd9330c078eacde50cdf0c2b8dd14e18d296415cb7b7cd5dec302773c6c4b761e5f8c12b35808616bc7c3f916913c2340b3a3b20b4d065e048be801f44f1a2cc1225a46c7cc20e68f7c8d351613ac7fae168f5503ae6435aa83ceb0205895ca47e5a3f259a2ca2a5f6136c424a086d74afe45b8ea42a9031f6a2951e2097bfdf8e112db3233367ce868d74a7ac9a892990152924476ad6402c1f99086826dd32c0d7034fb010eac8eac25c37eb084d591b5645ccfe832dca2699a1318d5341c50ebc5894dd396d834aab5ccd85a549ad6d22233261b17bad86a61497bac4dc7ea21d85106e1080ab29058659afdaddb66566659aaefce7851f98a7e2fb2c7ca4c2dcb07f6fa51f58284c5f1430e2076f8eafbf93c7af8ead3722ccdca81e3872adaf74d2196e5759a14b28e5a3f4d3467fdd880fb8a6dda73cd5dae6f781e0f3caf096a492a3ca89ed7d9c056cffb1b2da3caa01b5502498fc3be8e16beb1550cd30c0aaa0fbba9d3edd8de2a6725c55640b11da06c0a6cafb4c7368b6edbfb6a7c41cdd62c0fc22ccbba964359995f5436f9a2c5f859725bbd84e0a435ec1242125647c5324fbb2e0f7bec6a1fe2eaacce92f472725d9e733db156bdb2aec392a857d6753e44cbc81ce7ca2e09c587a89ddf7417d6b096e1b14aa086fe6771ae99603e0eecc2f0ac340732639a85e1da978b6283b02b737703aba3be1544c557425da587acf8ea8a76ad979d86555c8bccdeeace8eedf2e8b183470f1f8ae58062583d02f3699b1ebeba81ed7eebb120becab69cad166919593d82655807e5d9403a482dd232dadaea0e8bb6d97afa499eeda3d10bfbb699b55a8b42fd872136315c8bb40cb7e17436f962c482f27cef6922bfc5a655ae32d119664b44b0a30b4d17ebc84ccdafd5855c8889d5a1bd9547eb48b68ef80a3bc2571b8fafba24beca96584af8aabb975db6b110d2305804f61f07f230c87f1cc8575c90a4161332530b2402c5857e3c88896d21afe2436ec5af3815d3062c02dcf1d5681dc9425ec5ad8045b010722117da7eb42cb0081655b0a0ed023cf966e984084182f0c3c9efe5b790878d1b53acbbc6927a93deb2df26e75de3da01c1d68a9a5da7c4e7ed5f84beea7e3e0cd58c173cd6642fbbad352bebc770ccb430774b1785f2954b6a754da865f5773db0d7771e650fca57d9cfef94b0edab7e4b7bcafdc4161e6b6ac4cc4f80af3acfee5e761aa60cb07210b38a2ab2b55d3953978f3cdcc29b6b50f8beeffb3ceffbbeeff36c70e3924118a5524a2a3fcb42f308d14ed242ae536bf59aa7795aa856a1eb9a3f956821da533e4f443b1cbaf7be5e0d97aee9b6e8966226aa74555923bde88ede74495fbaa316ebad73d6176b45d5ef9b1f33bf7f11c26821212121ceb72b6c488c6dd341b0bee91c5f555c7fd69f3a351948a5ddc7784e4e4ece2867341a8d724c2552d7c77a241a8d46a3910b0b0bc631c2230a8ff631131eeb09b360d2736fafcc9e9a3f33edb71719c3e17bd1dbdb5966da276d1a07d5f145bebe6dae9fd7f59788fbcbbee87e72acf34318d755cdf0b07aaadf92fcebc12567b49c41a545d532e352b5cca0542a66c9255a66b478dfcfaf7e9deb36392f7bed3fcdfb6e46cb6731e0b1a2509f09c59fcc1ed38fb3a74da7d9235d33610f7e8e35ec82c964d23493f62e5c543699344d33cd2cfad14da22ac2a6d39baa757afad764729a4c66cf6492d16ed2ef8ec9ec99432b98cc254acc254c7a86e612263d7389127309939e212673099315b76d662a14ab45fdcd0b8eadfb444197e984639b530ce7cdcdcdcd8aef9b1558ce94ec39e79cb387490f931e263d4c7a98b0b8a9083d2d3d2d3d2d3d2d5f774fcbf7bdecfafb66f7d6f774b2470ec1783fce68b12ea6b25a627c65759ff52d96d5f359aa9618abe5fb64c682e8dcdd50bfdfaa1f6645a13e138a3fe92c5538c6bef573fee83fb1aeff75af8d33f2e8fd7cfadbb8fdfcefcec896c558ab5887c48f692ddf626d2db3add73c778743f6d877f7fa0d933130e9ee8d3faeb7707dec6a35ab32464f4b4f4b4f4b4f4b4f8bd71c934dbea8d611f4c824e2012577b1039f3c493776b48e583abeca466b489ed6916c84843922613697ef5fe4fa998647ef31000162c4905f842a1765cfb27b77b99bfdd6d55fbb41746e1c0402be5f76de2d964401fb8ae17ab5a05dbc53f3356d34addb32c63cc2c36935b68ec85085d57c5eb039143b86399430ed2243a7fc3dcc3ecafe52862919c369f5d0c7b087073d02999a2f1b0579764aa6e68beacfd946f2943012e8dc3e2f110f1788e2a1cc3300b1f3df4553d84bc757a3fcb1217f6c4898cef31b206b36ca9f2c444b97b640a7e64f1407f2942d24cf1f4579ce4085bd76b2d0351460c3431f5764e92da5bb548bea3cd33fc8c0e69801886d39e424102dc18ed582e2ab118674e9b2e64afdc543577938ef106bf10c1bb07cc0e63c942f654abe548dd666d9c494dc58aaa44f0c28bd3488b5e88b0aca08d0dc4432c53c684dae992d059f2ce3a5fccd5fa66b50dd1f34ec80093ea20c969d2122322e126f9f7f613e3a432c5f62611d430a6c120be365474386971d8d193ec6fd67dbdee774ff20be2aaad842a6ef39f44f1e7f1cc90fd0617d8c18bf5977ec9fbcc3579e9b65080a421bed82e82a4477d5cd9490b344c421c64f6cad5faf925d5ac92ea9001f48f60e72cac95e7222eedfa49f6428d9a3646fa01f8bcb5ecadea24545c38faa2ce3c7972948dcbd5a1758ef96992e319e9a4f5f0057a6c21b800b801bc36d71150003bed7c6f5c1c3f92f5c1c2e5a5c203c9c0fde1d978787f3575cd46d9bdb40e69b6ee37838bf349f347f747b8887f345b7ed6d227d44f374925ee2a1121ece6ed24f1acafc96fb9e9a4fc355796abe4ac60d9e613cbd303ec6c5e00c303038c3d73cc30c327c15a897e5134a64215b3a1e0ef18ad8cfa3f338cf74a93cb9fa95b23efcfe1f7c15806f007c7f0f7197017cc7f0fd7dc4572fbebf8ff0150cdff8fb3b89afeefff7b712be7ae1fbbbc7572e7c7f37f1958befef27be6af1fd0dc557e0378befef28be5af1fdfd03e4abd3f7b37c9bbe4b557c459a2ede148ef0b1b1b1e9018ed8d26708231ab011fbddc657a3ef7720be127ddbeff720befadefb7ecff155f7fdaee32beefb7d88eff88a88af8e60dff2fd3da60b0ddf740a121bb15fc6cffe2dbc3207e0caacba526cb9529471a548c395620c57e617576618aeccf8ca7cafcc7f657ee1caecc295b9c595199479c595192573eacaece27a1e75b69e4f57e64ce64d66128be7ee76f6aea492bf7b6500dc9a07900a2f0e0ffb03707ff0b01f00b707703b88a7fa63b89dd330dc1ee261ef7848c4c3231e1ee161bf0bd7c56d711fbcad048bdb3d2b50b7a178d87fbaede3613fcbed1f0f8148b7a9886e57b96de5bb7d850ab77120d76f3c0ce2389e735de7e698a97e1a6e8f99ea575d1957ce94cff8e0e1e7b6c9b4b6080a9de04093dc6ec35c523b1e279e04218faf052b798491dbf3f8e2e2287b7c89af787c259de80094dcef497c4591c836c823975b763878762ca3832538c9dd7f7926124bb2636f04fb5d4d59f2c00643d9414a4d41367ed8e1ab99fb697e7263385354218f12c80ed9d8d8d88848a49327c0208f52688aa06e275480ba7198d963dc47007ea39006b87971da70a312e78fa46bb40e307fecb29430467cd370f072105d45b7838bfe21a59a91fad7cd716f2e900cbc8813cb99baa962c5363a1e6e762ce94129f52cc3b586d56c142c0f5f8d75071d424d17f0022f0cee30a7bbbf8fece74b118cc015011ad6cb540cc68e9e4c1f83e121787d0f715ef0c2323b664aac57150e553b5da6c5a18ef16cf2c5fc0b9c18dc617bec7bd0fec23eaed71ec33e90cc5cafbd0f5162d87505a143e77e1ea458bf7db6772753bf6b7b2703645e5fb10bcec73efb1eaeafd847fdeb33ecc34726c51f3ca4f643395398a85d2966578af54a11bb52bcea4cd11c188787ee34c9265f8cd60673174a7ff0f07a7ab759757048982312e6657ef3f4917cb90d7d8f881dfde9fd471974c200f7352206467fc220865958300d120c9b316e61a2e539a6cb88fb1196339563a6ae211c1e11eb0389f53e46cfbd0fd19fbe7f87d1733f33c220f62c169e1161700796a70f627886058f7e3e3853e7c95b81ada70b625895305d034b1ebd2c5fb68baa53971c9d5e8a1b9ee19e8645f452cc6e6d4ebb9eb38b65d9d10065462ff30ccbc7b8ecb6a7a1cffd866746cf8269e68fb2263a81f57388dc052b9691e22d81b521e3ef2baca3b139d71d76ad067277e00e9e37d33d58473fc3fd08d320a94f635930cdf7a3af094287cef5799022cb63d735903b19968f718d05ab1a28c33d0f52e4b00f24f57dd0e7be8711f6315ff4313efa19fa230c6a3f7a29cecc3ffde87b38fd08fb4032337a96f741fad3f7c0f2a637611fa36779296257d340de46178c40103a74c69e07299a3e0234b497313d28437a900729921eec21861d183cb111473ffacc949d9e05c4bef452245d10c3e00ea4377d0fa32f611fa51fbd09fb403253fad1fb303de9a5c8722a99462491e54ad174a558ba52245d298ebee299f9a2c72e9667886e8ea12b36f992a2e84a11c72d817dc12a0faf97a109db3faab89fa1cf61b0be1467e683d74bf17f0afbaaeb477bd52b03a13fdfda6409c30faee67211148b93af03cc972d3c757de807f0bffe5152891eb293710ccad46d7be9bf43c2f4d63aa3ed7690a28de2e6fa1ddf1209f392afefb143390eab66eaaa3153d7cffb326566ea7aede2b015b352d8510ea956d75fbfe37a967c3da5225fd7f5270963fdf52c12c6e2581ad8aeef6bbc9fe1de7beb3d4c83c4c233dd7f9886a6e6c3ff1dd305b4de7b295edf63ba80160677e0fefb1ebaf7b00fefbbffb00f2433de7718a41d95a2d8f4e3ae4b5ea8be2c3cdacbea9fe13e7b17b4dec7f60e36de613ef733f3b9b7de07120bcfcce7de07128a67367f1fdc4bbe5e3cbc2d7a29b0d64bc6c144f0f2ed74e1bcef0beee0ef3d48f18cbf076e7f41fafd18a811ed7717a4ef8f811a91a32ffa1a8ac11db8ef7e86fbeee977980609c533f62d06351a7f8efb1aee7e1e55a036dfc67401350ceee03df73d7cdf611fd807920dcff47fdffbf0f730a8bd14bda7dae7f9a87ca80f7765d39001e2df7f9d6028d377a18414e97727836150c67a7026861d18e8a00af13282bd8dc28ed2e79257b0df6c1436c7749199fea723615e727d4a5133458dd4975d0f2e566c672a9c29fad7b4aeb5556ccff8aa9f850764e7fb3734aba0bdf4dfbe877e0dfbe07c2099f121516f41f9dbd788f3734c1750627087c63448249ee9df300df7bd3d4dbf6390be14fd6bc46a5d39533f857d999adf63e1277420852c31289f4767d0fa99edfdafef0ccaf78184be0fffed7d20b9f08cf6fd3e365062d0c23bf86f3fe3bf61395314cff46bef43c3aae99dc08eaa7c0175eebc49f963b6422553fd624b17eba53866594ad94fe5ca9bcecebcf1478743eb90653a813cbfbb1bb69c43a6fd968d8cd14b4c9c9f4112c6f4ed99b29430fefd321286f4fdbd236146dfdf431246f4fdde2361ecb7258990e75f45f27caca990e7d7f95908f27c8dc680744b3fbaa4df4477f49bbda2dfbe6b7f33ddef37cb6fe94dd7b32eac66dac6d1375def3bcbebc7da8208de058b789705152ae7dd15da8fdec4bba810701ce9c4fd38a7789725773fd21898be66d3972ee9cac818fda3db3b433d1347c6e8f7ee0c92313a05b9a3909d89dc20c89d84dc6ff5531e19c326cbc146ad0bab59a53cd685556ce2045dd885ed0c79cfc4a1d665518b0ed1b913e4eeeed306b57b8cd7ae46368b042b5fbe7c8b04dbffc97eea02202020202020202020202020202020202020202020202020202020202020202020202020d9b9096c97a620458a142952a4489122458a142952a4489122458a142952a4489122458a142952a4489122458a1429f3e5a42620ed935a1756336de33aefb3a211a9646239a156b0005bb0b04105d6b209dab1a13c208b15a8138bbfc9850b2fb498383b964f108ba9441a895e78d07b76268ec87ede4ef6effeb2689c6ba8e3b66b28fb6b17af08d345ce94f5ae694ae625030d64a881ed97b9c60557a41072078388fdc633544e63e500be645087cedc77e6b00d2f1acef00ea8c88efb8adb503184ed91c7e5d7fb3fbda78c5de9031f6c21ffc8964d026816834c3fc6fba78fd498a918f1a7e8b1ee0e1e3d96b0a33ff1950e194f9efe3070ff3c7123309ec2781eee02e3e7ef8011c4396ea09e1d2a8e1c39c27363c387237a8efcdc4c97069a1d8dfef170feff98a8e8f11f1985f5271246cbf34538120626cfdfdcdd9f4c17c94490fb0059c982509e3754e4e94fdc7dc8af4c9bf625798ebdc457208e1f3c9c9fc40df2c84d7f32fd499edd8f83e7ae3f47b20bb97f648cf9344401846828e5e2678be4edc0eab8de3ee9fb4716f5c8197e72abd55a8a75481e5c7475c8b7b445a24fc7f5f2492fbb1d7858593ee94d4174d621df4adb9d65c626d2531a161c7dcd234a2f38925752d3ddbab4034b3dfb11d3bc973fb3dcb897ef12a6c31bbda3abf28025fd68f34b94af748c5efe88f4d6f7148f9fa9bce3936468fdd8224b961572655fa2e4cf2c3b1c4acf72e79faebfbdd3deeb49960c2d1e579c6e6529bd09df30b308a3640c3a7a7a47ffddd1972e900cbca865f5bd47128108f0b0b97b1ea88c3d8f9ab9df40f9328bfebae0f5f6651e5d507ecdf2b7efa505ca97a2ebded060109de94dc2a23cb4fec35606296cbf279fbbdbd5e467320626ff73cd09a5f4433f00b52aa5f4ca324a29cd9e524a2f3a31aa6958e52f32f4b1ab09aa1d43b6d2299b7c31ce9e4cb7967dd33a1749ff901d0f298deb1b8804d488f97e91139b638787de12f685bc7d75f9191ce109228e8001a12988f4af1b433f1be2ab1d2434f3b3b77eda4c970e4f9b99cd9b4c318d7f867d68a6e8d35857beafd0aff54a9527339563a6e8a3504256a8626fe2a10ce8cf00c43ea594d26fd13b819d5f2b751f297ad737f522a1e13efe33531e94e97b4acc2e46c6a0bf45f11ff7e9711f4c8a413ca4ef3f9029fa45089390e98faa4c9d0914c3ee236350995f0adb387de3219dc10576f650d7acd093fbca7e4fa85105c84d43ca45145676f35b60e5469fd20f67c428a09bc827d287fafc727fbfed2ff59c737e12667e4ff931ee220956ce107f8f953ffed743832c8f2f5901646a3e0c27b6a36881ed0db4f04e8c026cf0c0024b60c003219cc8a3f43932b139277595afc600e4f9930742ec6424f264d21e0009e33f3d0c62fb5d24c1f6dbe0b4c705b66d8879f1b2e31719e389f56f984ecdff014a3a219b7881a10a3d0c33251bf71587d3d3df5a5c9a7e8207b2f023b6a06927468af488342ebec5c31882cda145ae5f93fd89af5840f1d5e6e3517ce57ddf60a0e549b09287f5dd66ba740c7ab020d87b8e0ef6bee344b0f723d2c914a864ec9dc712b1b7b2eae3abb1a9c83fd8631886bd6827ec2874092a55ac60df54f80aac9c686747b423dac998a8d65a5ddc1f9d03851243a28b073fc65d5c242c3e5b9655bffbeddbb33a1adb6f1bb771d5fbeeca78a8fdf43c0dbccde2f6f0105b81693c8cc28e6e03c3434cc2dcd827120626d3d084752036bed21e7bbff11516622f5cc7874898eb31ebb36b5ded7198be8e40c82018beda30fdf9d8e8417858192ca12ef8bdcc1e98c3bbe982a5ef5cc26e3303893b2264d1d6e2ca1e4ca1c81531f455fd16d785114b1c11351adbb7b8f2670849f08861a783f5d2c33bf6c87566b03ecdf5b70b56991dc88fdb60492cd91ed4a1fe90ebcb2cbb0c886718f6d708eb37d86d3cc4665881adffc25715b78e8718d7a26f660aeb1bae7e17d5c243ec5f0bf64794dbc814f61d1e2b9661cc895cf168b1972f30ac43d4637291132cb2d024e0f999560c2db0a3fc59400c16b08d258f89c3c3f6c186874046301ed2ef03e44fd6217fe2f1080d3d7674409e78c69c2e158acc4c4905f8b5feba406c735e540e6188523134e7bc68f3d4f05563394a28756234a49449b0eb58b5714f601df712896730c28e337860c4c0c4dae87e95af5ae47e18be8a0107b63fb4622577c700f9d2075bc261c3eee0a28dce393c943f40e4cf0bf9d345e000a20710292891bbdba9c83d65949806512d6c681b3c3edf930d85f298d88b3e786135a60b0c1f191f72f0f0957462e5883ce7bcaaf8c42c8a9a6095996b31bf624ae9e34033bd8195d93b1c3a77d34031b1fef3caa00e7d7dbfcc9bb7377d3a453c586095a513290ce58bfebd4658195c638615d89287610d999a5feb689f50dc38d5071cb0e34b0d5f8dff07c8de3f2601be1a7958d9c8cd8bd9f7a7fc1bbfd0c0cadcff82ad97f9325fa64bebaca4cc961329bc4c218baec619fe335ef8cb4bf616beeabf80b0c917a34832b141962fb66035507ea65d0cd488db775fe3fdccf6decbf7b8ef304de634da6f18f41a914e51fb4c5a2bdc6f76c8c32b26b0f47d7c244c14dbdf3fd385fbcebe5f6a28eea266ea09ed81cd5eb4071d1be146d4142f5eb9ede6b8413eb20765b4d7308d8f1f9890b8fd14b57f861b4b1f1312a5b8611b4c48d430d8436c9b99fa296de139b37c22892764d93edd3353bd64a6c6f6ef287dd341faa77d3c1c3b1bc9be77322c67cace9d8ef10b64c7bdbd7da64b17d163636323c490afacdcdf5400e55e0224b75bc97dc56dfc26f7d32997f86aec21b9bfc1c6e91c0fbbedd074699f2a87f088b243b925ce3c00017a114e754b820d94995f23d2972fda861258d05f8af441ff1641194ab19ca916e7fc162796339ca99e4fff0556fe18c6cc97ee219ff66e1c1c6c600e123472f3e2f7463efc83fe8848fc6b72635087fed958e69a9a0ce670e5f932eb98d87b99bbcf56dea4b74bea8137d03c7f5e0cc8fc04132a88498013567e026ecd66588105b551f6d892edf944124de4896ae16163f8afc73dbbc7734a45fdecbdb33c22673a58cfd55ab96d7beeb31b5e18b57e9914dcdd9fc6ca0b10e953af7cd98baf460925fbfbf70df94a6583027c05da92953edddd313421613cfbcb4c171a39842124b040fcc1f9c00234b0315d684025258c047bcfa17bfbdfcdbe554efa445f3886303cf46f68a6fc459684a78dc2ca48982ffbcfc07c3ff3d9c032df500ed94f3087ecb1cfb20be630aba8a28a2a72cb2aaac8fd19023298c3f7d97f5f93bf21111eadc52a1919c345de73ff711e6e5fa50f8fce1a7751b745103ba2328caeb2ab99f655d3c01cea675f3fab18fc1743d34546a6fc6bf56f287b29cb277a88c8ed3823efa870a568595735535ee3ee2018cafe32a0b0926b0edfe0d9b3aaf04c2b1ce12f478e7b397694fe6971f4ac6e1c1fe5508ecee9e12b50e210c97ec47bdd737e1ead8f145152cc2ac679a32c9f48220a396268c28ed647c2d0f4111088600a3a22cd8fd44f91274496ff3143084f7a209edebf974c179a17569001f107f80491e684817002f8b3e01d4e00ffbe522b104094462418997c32c2242cad94f6b18e86e51961516fbf71dce8b98e86a879248c97fd3bc97745c2c0d4bb7de8d6a7093b2d040513ca3ea70df2d5d838d6c757d2895093ec6fa3f8db1f5f492755a092fd2d90bfa5e22b3a6974cfce8aac68869eafa361593707edb9ff3a06789f434e91f560561dccf00d9e33cf2e9530d44b9470172073a84af6ef26403a9f286c203bcd2e9d340189ecdf3fd209157eb27f0b4d9716fdb36af5f0d528adf0f01558391a5fd124b2ff35a262cd635918c481660b75c119d4b33cea597e87af7678e8288be5add15bf6ad4ff6383c5415b1997f86737848bb1cead7b7be266fd6f7bd6581396c39585fdfc2a07d1e56b65f936bf2f6351967a6fcdd5422d18e861ddd1e1efa8b2ecd0dee36090b6c2fc1cd235b60312853235a1b4a60591e946161017b68f1f42d9ede7b811d1be7bd4694338523ad8569b4006260af8f993113756b44eecafcf58d405f1e9dbddf2a87ba35a2ec7a20c450bebe0112e6075798880213511cc93b7c25819022cb778f8da05e8aa7efde3b1a1dea9e6e8d99f267b9fe53f4bc86350e5f71efff83afbcf7cfc1fdc675d6cbaef3bef33c3087eeadefdec2e0f51d066d641fbee66b847deb335d9aa75acce3939d94e51338f0406e3c5a26aac093c7e6c994b34301a996a8f4cc968541eb14a21901000000003315000038140c078482d17840921435f914800e88aa486a4c96c70325c8410a2983080106184280080014ccd0264101466764bb46cd93d687284a2ef37e74a1bc1a8186a50e8474f974d1092432de9a4f38ea8fc8b22972cd1f109d04601e2b4f4543c2aed26856696e9228eecbf618d0a8caede336ca6bdb2a8a5c4ddd449163593a110e2125f8e778973242add9ea6e207ba386da2bf8dbef8b0784bfec462df371ef1a9f3d85a555a91b9b938aae01c06cbf104aafad4065785fe17e5ae3c08ddde4d43a88b83bac528bcfc67787865186d3bc69e7976439881245cbde72115edb32422b359c06d8beefa6338ee61b17d89b83bc9e20d3dc4cf7a2e1c6183c023a16238eefb858ef1d2c22191664d5c4810cfcca8dc99d932e0280d7a883dae6e817fdf7b09fa6b5a4937988ecc2946c4da956a2a19cad076dd8a0e0233d7068d770eb55353ceb6cd518b10879c09b0fd3376c21a6430db62b4d6ab47340ea47e12a6787554189f7241080a4bd8961e6833d427742a33e23d38b9a76783a8ef34cfde2aa902da4d517e131b9f790580d294ebcf75173ca27c305f0883814d1af6ea0370668f108d62f8017be91f1818ddff5c62557147299fbe60b3c5b4bc9dfdf1862c1d920c812350383c202991b05cc2baf119a9da86cab7ee0e1d2c785e85c7232f66b97880752d9a728aa106ae3549bc791b6e54d0d708e6b5167e8d6e28b6057a377f32a9cb545ab91c8ec704a953118d70404506d172d088c325e5b4eacd090cf988e6fe1c91ad2b0e8c6289a1dc9b84a2b5bcee2b4fb6e92f205fcfddc5bb697c8e6ea490fdcb69f929e76d37965b17d41e3568c9fdd1823831a30c0d1b559dee25b5a33b898f20c7ce724ae4c9e20b8aa2ff93044b2e03898a7dfdff9dc30e943542b1636daa68f04e3476e4bc690d7375f756293eb364ff1a1fb783d89ccd5672e188ecec787ea7fe859896e76cb226e79296e1b6a4590b255b663c5fa17c047ad14279dacd52c9589649003fa0e89257a3c39b0d4a01435149f26d2469ae0a56398205a314011247b05c5d1be76ae42bc582e5ba6cc20e5655edc9030e98347bcbfe08ecab323aa19214475c6431855ca887dc8f0e3fb0670b51077770981044cc9ab67bfb205ff5964c9ce43427c9f6498ad9aaa1401a3251b2519202daa6bacd3b05e6ec21f2a5e575c5babedf2138ba6e03e518c5266bc52818d0f55d9324017ebc1f63e7f74a9223a55304d369546c527cc662310a136cc746b539c44cec78425e8c2cff9fcb8a66a01957636bf60f02853af911435d18823bd3edccb108b8f9c905bef76592b75b10b59f753e7dbf1fee26565d1ce9491a537fb3032d1d24e11ee30a512422e605e268dab88d3c891d192d0d99a29cc0e9d41577e330af7a79cf242d78e081ceb395f2027c02c41b7cdb07f18a1228c196074bc84bf856e928bc0130af2ab345d7f7dfa2836c92a070868cd4d836068e84cab7a6a3784555a7234051c6fe9f7320de149381df0f328557fbe2f075846b5c15dd76e3c1072dfda4675c11e1917b605b25fddda2b04a9457385e6d610574b15044b65888466e5a508e53c4ecf1a5622366cdb91a86a4655d25435624ad5ae8f31fd0cf23d306e78f47e3bd708a8b8899a4bcadb2ce41321101c0c3b4fca486d77327cbba0a913ac893f72b06fc2b86ed3c9c6bbe14b9ea4f92d61a69c782c8797da56fdffb9fa01deb513bbc5023b2016463f0d3f43d93c63af601bb7c93ca6dfa059bc7e5a92ad0d2e56105f8c13f18233afe3f1cfe74b1489fb21c10e9f00ba8a89b07625dfc292eae5a704c4948a315456f9c8145e933692d1624e458f6880d60f18762ac0a127aa9e812d9d4b7c4551c19185e451b9b9712254d3313afb21cfbe5662cd908fdaf9fab6f8ad4bf73a867c57d934ac955f22b1888c325f956c7dc9053431f6e56f2e93f294fa5c28c13b9101c74a47533c47660e2876c8c8e88fee0541482f93646ff2a5227ed53d554a1d2ae117f3481cb343a98683c86ba650c06cb926c55633c2fd8d7ebf38428084e4824b6cd5add16ea73dd35db66524a5c7f0876cd895ae999dd1f04e977b7e745b3abba3f142210df8e7f3b370041e2f074b99ddc870ac24e3e7538c9b1fce2e1f34974d14c190635842cc4ba966355f0178626adf6de43601c7b517e69f983aded515786edaaabd7b65fb38597ce569807b2ca8c3bfe2a3dc4d11dc746758441744d548937d0a22c4cd175efd23ead706d3d4d7a06709be658602d305a0a02e5e454d661aa30162edad7ad23075c4f3ef0e0e5f530eb68ba3ad705bcf925cd8668a1d7deefdf8615579c1f09e6af8bdebadd3ad7d5363f2456ffecd0053aa3237e814b704729edb63c49cced932ab07dd53996a0e0bf6bc44ea089593291b95c924c3dfe2172812ff096c61d971cc2f2a747cea1a318830170703de5442494edd1d87bbd3db809840442fd8c695d12eb008144ac71c840ca6090775a400a498b90e4a6343236c5b79397102293f2325b747a2aac7c1e823d994a81742c2e94128039d816880a344d0e09de4765e2ad430ff0cc2f7414ef688c0a86fc466e4622b0365d00251d666e221601ca19319b065d2c4dfe9c8c360986d956f18c0e7fcbac576db690a45730934cb961635053450578b84cc4b09e0dd669b7234ec5da1bc3db6fbf68231502d5cc2cc6d8fa34f67cb1d6e04f9b0a4458a21fd9c328f8d7c39bc4f2dde2ec10c8f57d253aa746a0de1be137981a181d18066f78ef3a882061067d8cc9968d746cf9f5c85e3a0a66972890f1f4de01cc40c3693dfbd2b583eb5f44458707a02818a100a4addc7a4ae10eada19f5203f891421bc70e746950b572ba1c8fd70ff21d2de941b96c792ea40b884a24359ee3d6bd3a85020a3fd44cb21f66d790499e9d32e6323410ddcfc9898b55ab0655e06e3042981ddab814ce3741b2cfae20f6c8d4f53d0dd8ef8d3bef73d8ad0c91c20ce75c9a429a286b04901d48fe77629311032aef3b5216f60275773ed0a76dfeb2ccca3a58c4faa2463d1518f9d444477504d6b5c93af832fa9532ec6060c7b5747b315331bfe6adb2e54ed0706c9911515937b524df66d01f6bd92d412fd6ff3b888c21efd3ad196acc3732a21b1dc24aef702460b9cd25f1d450e8a5d256b9fcee90d84d07f9b222f10f9bc32430144f0f97d826a5ada873cefa8a67b20b31b4236b915c17cf41336e4ecbcd6c8b94f70598e3076f7d7d30410b7def047e332bec210c32561ecc2d17fca6d0c09e02813379823f7eed085669154a5ee3dc7c4490a2570c5ee3304f1fa30e1146177797ff86ef605dd0366181911c09010e38ccc49a9e98a20936900cdc4045d241833581b7201acd6975a4c6565e14d5646cb037cf8e2934fb987d255b17a286f42f78ac7399d15b25ab85519feea823ffe98d36b43ee7c0550fd0db9fbb1cfd09849d349489bcb11acfe89c3880f5a25b7ca681fba6e1003286591b2fa2be9290df0d2989b5a730d85f44cbc3d1afdd5fd40bf4695d6a06fdca727026932986bbb6c19bfb6e97e8ff86eee1434cf4bd4bf711bc1ce532bd5c00c16bad40ea19d000d73524411f2d8e98a0a626ccdba7caa4973e3ce1e4998abe5a5fbe4cd650f13be17bae456c5f395dd28e82656a130b71cf5572e18685201958de21fabd3072f01dcd9c261cc774c09dcc2697e8c1a4dcb9fe46d6ce1585e726043c35d5de701dea48fbf2832ab6314656b16f3f2c4476eea5e606612c271f80fcb1b124b38e8a608a295b96e0f695a39152c98a0826d1b78779f5abb5bd41662a15dbd08b64ab55bdb9966a6db18b607b69d37b7e73951b22ad299986e2749b43ffc8d1ed7954147f7da1adf4af50f533e5fa9721ad92bb3329a7d5e519d7dc1e65db43cb95e80db3feeada3093bec6debfa88c50dffdd48ca8513fc97bd79391107698c2647837dfd8d0f78f19df4fed5f744bfc7aba6a1b31e19ee5b87ad33e70b9f1b1cc09a0e6e06d4815b6550f8d8577b5efa282ce12d7c5aebd7c468ea723bda1036eac8cb71e62284a3aaad93d45d8ca0313ed512bc734d264391047b6f2372eabc397f575594e4ff32efae17984af237eacdf1ea542f96d752ca2d696b34c82ff24b16c855243e7a0c707e4bec4f699b029f52e6433a4fa83d36f5ade7f323d24fa7d65792316f981f7141180f21d99888d15a016b3c56005c07e8a934b2117a22852fab15a30f9a89a4680b768b93d3c446c742ee477b9f11ff09f0b7c94874e3d7efacfd2c8d8fbdecc3413813a3ae1283548d31e88961aa819ef76f37bc08a82f19491288bf8af4dda12fd3720bcc1a46e92a36efa4e28c0dfc29ac56d0f2290b2bf0af1d80a2e6414df6e6cee8ca5572b18739e6764c869f4beabcd4169d6e5fdda8eca109472928959c133dac274924e5444f21f6f211a5fabae93851ebba1015b737e8d412a8aad23a6ea7a1c662cee6ed665e5722f715192bd1b64aa48a8e55911a52950c16e9619f694fab9a0460bdaf607b1c8f2971fbfec7aea97c1a778845c0e1d42b85a876955044a12834b830bfa806648a9ddcf152b9f871c662aba87f786a41eeb35db92ff6c480e904c536a6719f9d8af510f35dff6d690b5cca05edd30bd46fa775818f7e591065605f8343aade11b37845e81d974357ce3655b5e7d1bc99b3029603de393bb08c419a8ef508520166ef87e3961e385be6a0580d61def567aebc3b6c2e16a4278f5b2732e6d9e13ce4e3926046ca98cbf318d08b8d60ca09e17c0449a236b3774bd75d35c4b64ea7d39dd58da8898d51e61e3fbc55d2eaf1e4cc326f0ceffb603147fcfcf343a5fc92baad91bf5166625907af66012e394e8a4b44e5dcbee8b4ece1b1b5b97dab914fce2800345f0d28669651b34b4e7a4222b76e12a5401a407370459831799abbb0d0137ea975f2d32684ccb098cc113df655c2b2246a4e505a0abe8b92f0fcfbc77b55514323478497ae5fabf1ecc1b558efb28ed39056e10c1cc10dcd861792405c4523ec17f5de3951c09c8fe532bc9521ff179ea81ff0db94281188a3f355f4399a78a5beda7933253a580f735e5f756bd28e8a8b2bc79a0a8ad5d13b78943473d5813332a7914038f15edd1c156133e0c50d632cd57274c00dbfec804587f2f942ec69608840aee96582e1bd38eb14fec7a17cdd23201b177c11b2e05ebcaf51b1e553e6319b3602a4e1fa2a6fbf88ae6ba7ba0f696f1f9c843afa8042eff8ee41ae8e7a210d615c8de1146a1b0feab759ee1ff70f3738cca4ed69f86a4f1b9b1c1cae99f2c1f2d6ef4f0ee79be36fd6fa582af6ec6d98c68b6eafcfb0c5d87b8f600ed4d2dbd7f9835387f1f374361212616e0b18b5d2c8c5a5765095d65e7b3820e803bfbda9cb18923fa569ab127f921f74366b18dc4a486fdcde6e997d70e92b7143c8ca52bf4264d5d7582cf76f3981d2d9cb2b30800786235e68f15812c8a04b5c5e88950362160b613036a4fb1f9d559374ee113c9a405a3bb3fb862f4610cc1657d7603f7a626a777b0d3e083de29311ec164eb114bce1609d0298f66cef86127622fa095a2f3edefb2a6de4ae63ada8642cd1ff1c0428f53120af06c4078858bcbb257f78b006f117de364f3d9ecf591ee37bcbcc8e76471a683957e335e32f73c23fc4d7c9dc03c56450e987abc24447273e088aa7827ab02fab551987109045f16257796c01f0ec2ed087c911718bf17b1ec6c9f35b7b1ef68bb77835e5629fa580183c4c3cdbc4ca5875b50bc34664d97550ca5dfe8a61ed1993f54d2a801e8e1bfce78b34907c8cfbd00389999909584a701dd3e35012537a3eff6cb30e323a338159fa2501d0ba4ba7efafb937f50e7245f7235c99501b3d3320863b0e439df79826822c2168e21c84600950462f70f3e8ac25d8f10f2d1cf669529164dd5977dd65291fbbf3913271d485f529c8dc762babf33a476930f0c8e99634f5b6952b9ba74b1c284b6b27d720336e303dcbc94ae65e6b5700b63539b4b67ff74ac4853836ec5ab59c6ce0db0f2cc8d997600b6b7ce9705f00f3e39d95e449612391071fa0180e7fe082c66bde61c8531a7484a25b90c129fefc9bce817d7afaa6c3623877d78798aff8f718670057b5ba0af8e0829e803bd2a763d71260c3f626d0aed0045027e9e74a23d2adf8614865fe3a163b42274ce48d14361df75167db0d25a9946eef40521760a5ca468f26eb20d2cd132b4ab90328f29e6ca8d03d92aea5ace32329daf7bfba0a8e0f1afa61cfa389b47b279c117c86e256356d3d7781ea3fa504973a0630e9cbf76466934477b69e9ebb475e97dda90a8ef5c104f517b5720d10ce459e760026a4c54fd0529b84840c6baad742e51d3b2f50922595b0ab8fe7ace2798a878a8b03708bc18cf0f8e915793c6d0534f572a87b691d037db79aebb634da695166c4c612654dd7c7c2eb563d459700ba542e688387ef0941e1c18085347d0cabcf44856bf8338207f26441176da54363f163bf2c8865a8f2be95cee5132ba1762bd1715df06959014b72124ffcbfba8093302411795b0c19ece0118835908d934188baf9ece3d8f95d17c09d6cdf98b9e060b570282c8713bf22061491d2060a7599ac7948321f22be1a8bd04694d2becb590536f59ab52ed08b05842754ac3ae5991f60141997a2ab0674343e6860a3ca6dff401e5a4a705665004353f5e9e26ce9117458f6716a4196f2e0c09e64ab3bca824423c3fa6641d60ddd65abcf0678d66ca2eb4625336860cb0dd7dc1b3adcdf79e51018f20b2da0f9c8819f492441633646903a04b9a1dbc07e4591912ebe0aeeaddceb580ac78e95cf1d480edc85b3498f7a362e1e29057f7833703fefdd27af6c340e7c357f3a3010abc06652b15fc7a6ea70e12b2afc3a8af9327d863c363156c8dc7f0c90f419c0157d3057b7a14e874e0f4d1a1cc1a0ae639e43182d613ee64695ed6e2558990f579ad4af02b2145ead04595c8b453b9f25aaa314081cec5ff5dbf0dd1b5a232aceacef17374bd874bf3a275590bca4d5abfd22d89327af0ee16c5ea5a5c1aca7ba420328ec9d02a1096168367386c537f695ebf0917740672763a30c1ffe8f6d888e64bf2b6e4236a196c69d6eaef712e14c753d59ee214e9d7a575c9fecb4f7bc551900110c9e9d305241bf16592e0a0cf12a08b73e7311f72430b931cc0648674d4bc3fe714ca7ebbad81a30e53dcce271cec4a05da78666f271baeb7fbaf1449e8e334f12bc55a7040c573538b6cffbbf206e48425141bff8c05538c4e6bc6fb9c42d9189d530fd0ed612123a86738fe2a19c9c38daf00dd2298c164da64728b9924f9ae175c1ea2a507742b1995f8f8c9c743db20f3fc14a70216220442058f7e9acebdb845536f9ef0ac350b13b397b212461366c89f248b9a52ed105cc9c842b51d11d11fb9d92484fac27e026388e3bbf60d8bfc0c8c774b999813d760a652fbb294341820669a1e5cd16966bd47e290297279c57b5432d1637eb4df7dc6bd85c345800673562a6547c00985274d0e35a58cf5714bac07d3c45d7889dc814e0e4e2309c1a5c896f8b94a73c279dd17eabeb92ccae1517b0e4e6a4519242f06772ced47b6f77e49387a75588bb9084757a21f0c60aab872135903987e48cced77cbd5ae9128ff7a24fa55b7b70cf12186c0e5981b25350fd15f55982c79a4c32906e955a11bb19697080618d1cd7d73407b3738bfca5a88ac84fa28adf2ba635e63d81a5c3df46d6347362f603feaa6889e63330a2800fa12d9fde98377a3dde65d311c5a9e0c771a3b010d475871eff91155fe279f18b7cd0efd78e13efbe8abc79bed67a515ea194d799afb68ae425f57944f30c27833ce3d33c03bbfcc9036022e333ee4e88e208c993615fd5d51d5af5c9826be914debb340466cb63fa07b2abde5425e18708f5b9233f1da16b16d439c44c7128c26d38385bd9aa9d3e7da0a17a3d6f1c2d55024a11fa7e7a602717a06f6a334d4dc50d065aae319ebc50d6eb3ced57aafb59d69456ae6aa085436fe72acc1345e04c35b10911c2ea4fd8da7421709278d59e731958b1db003a08744ab8ce3cbddad3213793d095f09cc4ce2175520b422e3fa7c6094ac816ca540d3f2987ab03021bf7bd02595631245208310348ed2287c47479057d4c2812ca385c62450f21860e9b82842408e7c7e259cb6d9e2a3354312aff42852794f8f16011aca4e823c731ea18a28557e10928622eada728a042e70cd994d4288ff67645f297693152a4c4c57c47ad37b74a2e9c9333ec840d44d1cae978f817d04ee3c481efdc61335fde2b2f4ec1ecb21ffc68e50809c37820407268ae5c2562e5eeb0e12f7d51c29463f8778077863a412026c9b7c2c3c74d70444a2c8c14958295ab18db94e5e1517e40fbb39c29b96c204e1d1cf140fe4fd46144ba279150d54a7a4cb3f8a8e91301f367123faf58f0ef9b5a4feedf30c59187fc021dc60001a015695e0374491f2ed2fa76db7a80956a820a522260eda8d6ea889de5bab74fd56f55a6a17b4ce6aa4bc4867f7090741207d217347570cbd6c98e38ffd0d5f2ce5adc7ab403e7bf60312502a3d29c079fd0b9928ac4032c76785bf85b0293823edb200728940218d11fe9811b10176a6cde956525b9dd188304d2dba36a98a2d4d3e66efc561da5efd3ae8f81cceb9be4f60205ce0c6cad2eff745f732a16015aed1b41415d61edd6a176aab91efaea39a0c116b4c1cb4bf3754ebf3d37e32fe7db2ebc6d012487ce619a388d3bf184278ec31f0d9e16d2e7d850b56e6b9d9e52beaa64fb1ca6a0ae2d5e24e98973eae48b7b4c3c0ad97ed19e7f5ba971651c9edfee51604d77eb313a54d975faa7c519ec1835a28b50bb489f5896f53f3cc667ee456b7f8672b373016caf0575058b9205d368334578ed2b737fd29a118affbc89bc43211a1222ec44465704ff1ed1e9833f2c8ebfe2fb1bd0e40c6f620f77283d330c69fc6f77a2a56343090c25aa6a213852049042adcfac8221d98597cadc495f025a9328c453f53cd007d70265964cdea924f31357e9c48875584c659e01df606d6b2e9ea9be0cbea7a7935aaa08ce0bcb70892c81f6698ac61e2c932fd2b4a4909b9f5f480d66a998cac658589b53d9deae72d9cd80955a38a62f95ee6737973e59a88a49551809df7f96b2581b2061991629f4cfc9ae3fbafa11dac1a9eddda390c419ee7ca6a4db2048fc268a456ac6c1d952d697b048abd8c202ddb3c40216a29388bab851699615982964504917daa1cd586187aca3850faf9109a56ba42da499ab5c1274a62aad6145de2a9d2197a9a1bdb0dc6b555c32a6726e7123e43b345b974d18a161f503d4eb9145d0b01662f1490efd8ca9623519253b51be3168edbd085ee780c3da964719d8903ccb7f9a94d17b4242b5df9026b6aebf338b8122f7d61a3a060856f48ea2a9500e1a05c8a831013d20e3b488cc1debd7976c1802fc4f49edcadaedf3e66d71388a453a990bb5f87553d3fe113f4953ea3f09f10e8a46fbdfc58fd35446b72b44d04fd014788d18dd1ce05bd99c1423bafb56617f77074a28e93587e0aca63180e96426a74b054ae2e1fda44ba37b43718b39ae01f1fb3f25bd077f48d4b6321f602128e1dabe03c1a7fb107e9b8dc43558834974bb14856c7bc3f128630404a7d486ae010ba14edbe6143d6a0c8eb5fcd14bd8ba1b01e45ced6f4609636f2602561f77556dffd6956b0e3b3443618ad4bb311f7992f84fdacbe17b623be32fcf9195284741fb985e6e807173ca97db9ce54ee3b21880988830f2a1d9a385653f00dd51c21ce2fecb1c4ec79ac77e14591643edf49a83d20141a405633a3f480930b9105acee064cbb9dbf087699dc38cf6a366e5aa32edb0c794ca2ed9fbbdc82acc672a0f006c4c0f4f9dfb4aed66d7fead2fc1240712510cc441032172d1a90a42f1e8bb6e3b9ae41165128c07473fc4b34094a42dc549233320c9986ea8bef5e13dc98209bcd504502e47a0b1ecf4d710666fbedfb1ca1940a33c500682fe5598958c2f7ba9e2b67a2898a3ff902c995fe1a47e304800f50719ba5b4876421e6d4740f094e7fa19c4c7ef6456f51bfdbcc770521588edcf6378887e36897f5a92088495b6e2ecb77f878c9efb9383fa738b47fb2945031917576192276d9423b553523a238e413e025f6090bd6988d48787acf1c39680c4026a3207015295f9f025a8042c585eb9edb66786edd15d2e8f12d985bfdd6f2b395b619c6a0bb2806016cec909bd6543c58ea830ce057ebd1ed0a5233d7cd6713cc5b5d1a833dad7b97a395e3a93f812cacb28a57544c3d2ef9df0576d32624457aa70e4ffb951f6b3c9aa5ccb00f9f227c2b5467751d625cc189c49a92aabd31c5cfae567ee3ade5358de40a05e4783865b6d53652beb1f045196b2d63d771a9a2777a039fcc86ef54eb9e1367aa32fbc1f87897aeffee71a941b8e2359d52b2aa5ab39fd370be8f771f6ffe65d40a83e74385db1dafacd6671dfbdd9fe8a30fb02a1f995768f9b02ccccce00dae7c868d381888d5adc7ce7e1cab4ecf0497d73d77f024a3d46a40e66d28b7e3e2daa1cf5ec4ae66e3ee57c197c0b58ea40daa1364666b58c86005ed432f4b697b8cc906662217e274290b57bb66d8131e256e259781a25ae3194ca9655148f24e693531851b323c64af209a0fdb14e5315e5249a5684a913acb44b5d428bf5f4ee61dcb1b2a363bff284fc2d4591d97ddd68d5c48cdb4d5eec61f1515fda6b4023767cb724ac7986e19269b91e6580593db51f30f422d6925548ed0c1f5f9944e031ad63e132e0a7b733952e110e2dd2ae6672971e3520d9bb3bdacb74001fb44f2bb8be75bf2db80045df1e0300ef03c4930bccc66f00de73bb09d4663342eaeb9aefeaa2dd4f5ba1e2d0f64b58bccac8343bcb7ed36009a3ebc972cc390d8a63a141b41d0bd750dec51c64771274f965a1728fea1987c83c8535071132ddff52f0c68c41d9b623397e3b1349818809cff0513a3bcbf57e25979b85ff6e1ec62396de4a0114006b301c33be69d8cb91485a17a514911285fb527860df0b95d3c5c9d60615f131466cf30a00789a09c19b74de3c675294680afb18b543c3d1429dabd7324646c8bc4bc3cd29b6ee8090704a8cdc5a1d6da36605b3fb8143caf554747ea4c9d0bcdab91f9707048f795c700bc152731e1cbe91a9b2677839b089c23a1294ed761358616e3fb8be88fd8d50d0d7e05ae3c732e8c3a57e92a0337717292acb758127409e322998b59b61e07204e9191308d20147895a13f66a2bd0805a586d65e25bdd6a9478aab15712aa8f4ec0978fa52e038aed1d88ddde4bed8b53e2a619817f5230cc9cfaff7c0e9a6b92d903c028de80ec29529f88ec6bbf41944572d302bb0c5ab759c1bf70e16920f227552bbe041f975b6f3f70718be77744b2517f5c48f66b3bf439709396aba5c926c6b814457574aa69e6ba3d213ab3c5f3f26f300a33dac395de19dc3a503e7e13dfff66b99f8f392f2108578f066a724826872ab1016ae8c4dfdd6f90637770bad62ad5f2c813e526aed48f3934b92dcabbe929eefb2a64d9c5577dfcfbfebf596e2949abe6c0d89818af23e65dd8691818090545df910b351065708c2b0abdcd10c662f10b3e13da435fdd35e87accbfffcb678e1a2bde7b4cc569a67158280706d17e12d73c6c9c1e6ea085a3d5b883b759d52c9583c4a992634e9e2c4a1cbe1fa69bb1bff9c853bab0df4d00712aa10c3201d12788568e5d79d807bdd6f2238593b85a7bba88079682372a5045ea5771d4a7af0c6b8871511f02864c9788f925e4fae4a008c610ace3199d2b3a87df1930e2f584fc36771e3291783e63b00ae1706f8f5b02941a66c851c3ad627c4a7ff093b99b963732d003c10b90f61d616212cbf76d307d4b7680edb5770f46ef40cc4efc045759d3404158f1d3b8865b646950916d3cf30e583eb30c0bec8cbc85a6cf5b7ad068cccaee6883cf6b50d4ff6296ea1891f00603e8f5d5ee7509dff530dca53e1ba8f84a37c9cd980fbf899f7f887a37f53d496d40447a472f1f3b3ac29ec7c03c72ea068116a3e5cc12f3233f316eab3bd745d0853ca57d5572fe4369706f0917f476ab161c9bfbd0066927a2ff3833aca1a912185c7edc9856203db0c46e8d5db4290097e858f862bd6168e9e6befc3ce809b10002f053296a9932228719da0fdb7ae6bccdc47c7e1f4899b9358da9316c51b0eea76199ac73a3cc9fc28a35c9b277eb973e87c40226f4928ea52f15a8e708e567a492ab56acfcdb211e2f2894b10766a08e965b15cb51fc81cff37097f5b64e1edd463714cba6ba3fc461e4aa0f019ecdfe0d47888003f26afa671ad8f35e32213bb003b497a98d7ed64fdd1d88507ab2a006c99bac0833c3bdcfd74934bef86f45e8372c99c987eec995f25bcb5cb276326962672e5f2da63128aff497685e8224e8d6fe9bcc9a810377ead40314ee5461bc55fd7160c34904debd186e9da87fd36a7e0db55fa43d9a4309e685f89555bdb8ec25b64a8e23308e127c46dfd27c10b44e07cf27b1fddd97e83d8ab336620413fa77dcd35b066cc4df4e75520ce26ac1dfbe3ef90240b8b783b91477d82f9f6145d1252695260414460883c58f56612d8512b5e980994824f5981b34d3cc10a17fdb0b3d20987cb27f8f6790ff6ad6bec3579bab83877c6de83416b22972e7f0ef7c0fa4df9c36d28ccce516b30d347f59f30c733f15de89ae895064232324bfce797fb80ae84ca20888081312d7bd4d3ed8b2bd35bb5f6c19689b3c0033f5e48ec19b3d91de93bc1dbd9a15feb112ca7fc45b1b1916bdeb521eeed810d81d85d77a196df14bf42b034abe2b251a0efdb6a0a8c08d0a4d36b7f3f22b305c069400af9fbe8ec1989a721c9c4976b522efa6f4364b84e22a2c160f21ff0c2375ba276673adde031e083802b2b0947319023c6f0b629aff4f4a853fa30a1191a30f4cd0d1d958673c0f26b0d03ba2d37b2f232059b4b7e40892a3156463a52b494bd3a14c518b1b549de9af4a61085e54d483ba733d05dbd1191808ef6028fa48e570dbe52fa2d1b0736817be2b980a70b8735f37378b37fdc633a2333e0842c4867f92689847a2e31822d171e4c848a52439b66a55f8f11679f25f7fec595d11816effb64c3bfc25b5362039902a4518967dd140afc013a4e8f59d83aa0eeec8664fc92cb34c5a19012c6edabcaa83550fe2465826d7506a32c8b0065cd458b4aa43841d8630be8035ec5ec6863a32bbca24f46f8ef454f62c3af0e64a99a4321978dfb104d817c89dd394c9637ca6f2a906d4a4c74d99bc5cebf7d11193f42165f2fd6e260339e21518293d14ad4f813eac780065305ac2d08eb60dfa2e6eada4dae64e3ca41f6967b05a0a20496f0276ed4b55aec9739005021fe6936f13df8a6ab3f6358b352cb7864a3f4045c425e368786ce37aef3944bd4d84bcbb833af4a0072da8423d743d78061db4421d7ad083fe035fa10e2de8410f3a86f80f15f44105dd6ccf1bd4b8461b3d6df84683be4d8c94ec4f1ad04c296e2fbbc43d3776957902d1350d015e1a0279f7831ea8a0147a68833af47bf0071db4421d5ad083fe075ea11f2ae8830aba0cf10e25e8410fba6ccf37d6688d1a3ddbf04604fd4d14294512f53c141dfe1314ed9fb924e37672111d15a2578ce39583e9191759ff5c1b6af374500d18781eaa028c9e0eaa01038f437524683f73908700dd898a8e135af1b51f65349e7aa03cf3a82633a8853ab406ea38c224ec9cdfabd2a3952ca4749420da3feafeca7bad38416bb1eb72bb718d8f869c357ab4485e00b49687e81f2d77eed161b94199c9a89729a816f460a187ed9f5deee11b62d6523d9ada286bb28d9f92f33f57d09044a3b6f663e8fef07d0c2759434912aa06f38c68a11fdd9fa1d6fffb4a70d986e90c2ae78b620a94220ecae6ab4ceea7a23aaa010ed8a551b04df8b1e914a9331804cb210c2989add54838ecbf735d7ac39bcebd5ee7e28fb48476394734ad1b36b43c3ff1b0915a02cfb2ff16c0cef27a39b4b00695f683e0256f3d8e2b493771fe9bd6df97ca59c1957481a324d072d8dbd61c6e1f4e4248bd67811fbafc3ad98d6394044eec0ca1e8c3a93f30a1ab25227bace7b7e48cdf8e077e4ba9c2593fe3f544873654064b803b0f79a8d97a038334e714508ec99f760f43dff0d36a531ae5a1982c3bdab360c4713df5ef08b36a258e9ec51da1c0a57fec5109f00257700d4a30df0e19afe570a5a0dd41b1cede76b5c07515bd7888aa06181e41bb101bb7df2b5c8f976eac260183f8a1a1e35d70bafd3c2932d8fc524db2ac502407cdf1511dce2672df32ec0594ecbeb97eda70cd55235e5268a487a85e30a563ccb1c18ccdae759ea41410776d1c4e4f21f5e2363e4da2cbf6ceb4ae8f5d4c3439fe8f8a3f2125fafbadb261b85b2cdc192e1b18a21b0fb6de5872cb3d2efe3399df7d1f62a40abba159b9fafdbcc64e359f72f9da67084c1c42b53b43c51fa063d72a97499d3f9c1e0272e0471de2be375dc8c0d91c1013e99b9e05ca5d28f24d25107426b904cfa86343b46003c5281948ec4f26340a431cb44c65bcb6d532ed45870d29e728a06eb62a08327c914b332cd42e534650512969f4e59002b46bd4644149cacafc3d2ae2c10e0e6db7af6a52d754fb772fc01dd4d99d747f1308c2ab917328ae1fee5332a381ba73fdcd5be3e8490d497136f326f415c8b6bf27d8c62f7fd9711011fdc18c57152b8022be869c1a3d3b245a46c340db7bef7d756fd136e5245443f9d79e8025626920591aa6619de30f02271a2218908345864bb64a15b9935e2f423c3c7976920a8530a4c1a97c6c0359f2f19766cecea9db5cb4520aeff9a853184ee4a158a62b99ec12e3244d30160779662c2a2862666868c362b472996115b281e07d8603f390b78619b80d044d1a693aad5ceadb903f6e8c078ffdc473b4474a06a09b41f8f552c194f7f5cb802f06971eddc3520abe9d2f75e3988e3d03a6afcdfcfceea18c51664b37661603d1f615b2ecdafba0f987246158b694b024ff54a8258ce2136499606cbc06dc478fdf8bf6d1096c0aa56e3fe5b906d19a6335c769e9a047d968788e1973bb1185db4d235d581527918eab13ec3bdd530ca43ce6d7434daf9b36d34ef7f6397ae4c39374d63248e64f8b963037ec7f6d341361ab46bc861ac08dad45bc2cc6c38241573a47f745e039947153746f40fae46c0cb7fc2a83464548cf0675d899d7d284d296830046d1e2fa765d45e7409ec3a6ebcf471152198df6a7ddd7015be6e8aae27f0f532b3975cf27d44a8bff68ff710331ed480675d0abd1868dbfa3d3cb7294e63ddbb9f547dcf45f4ecb5ac608a542ab721acc6d87944421da0d57fcfab45293d23a0f63904a79e976602b5f00119204daf2286ff9cba161c6b12beb8bc0b8d18839b909eddb9cd1d29280f270e8cb21b1cbd04e061b573a432c1f89260aa0b1817fbb82e67c7eee8d2834dfaecf150297bef25c7ca3382028b2bf05367755e2882068d5cc98e9ce92be2cef2ac7f0cc5b7ae8cc3b1d8b74fb81a33e0aa01909525975ea76119f1f02e8b1b2b1515de81188cc6f175cf26d62a34afda8b5616f20df52ca1bf6730b6c91e7477b0f377cab4ddf40e20579ad37ebb024a0af17878c89d9f483dd3002977f45f2c4bb2dccc382c9641791e826c5d6b0ebcb5aa33aaa4437bd7fd7b329c9f3a42c5b97b7c1850d5196d289a096a4324862a05fec814324daa89453b984ae5adac3cbf432b0b812a5669fc48580be63edbcea83160b8058545efc959156f463da638daefb653d1a47a2216b4d326cac2f38de4c345ea76346f41c02662787f8713190f27694b66e00493c07a3ce508f8ca1283807c334f31b22bdbf3977097a30be947c98367270f19016881555b780d02fd6abb2e779e8c8bfdf06efc700bffdb0b9daea44319e5e6cb2ab1c882382033fe654bb90b3c5d38f739f4417e2942a6a2759e104de472b3dd9bd1ff0476d6dd2f0299eff6fd96702df7768d1702fbf254791be5d082d2b14d1c5901f927a6cbc3eb07efb68a82de1de7e09807cad3ee39fe9a89f36ccea290ab67dd1c568c35e2ed8a019de8723b8abac12a918781334eba5abe05536e4dfc1f9176b93d109a941c24c1fc6681482b1f7286e7258cfd139c9764e779f9cdfdaeb3daa45364bb4f7a4b6a90f5ee950b31141e01a47f9e0f8ed82144bbdd6de8edb83b41b2b2342baff7cf452c988d607c449a3d7d8ea3c7470d1a743f7f3617c3dfecf36dc82065652811e6b670de006c6a3d901fd73f00069509e4f468335faca9c98193f7108fb979c8dce97541400e8e723e4c4c34330ec6cc9f3f6dde371336eb598292c0deccf8331e25581d5b553e8c08116feba82a7a89206af918f624645da3a9bd07d122bb1f15f6f0a7e3a5e0488d45fee67eb6fa3c96a88a83a6d7e9f200f7b7c1d83a7f86bc126497598d076eddcded51a5b29cecff4571d24f99fb5515e14c68c78e18e14b00e28a4f1c903e1e19e89e454b19337e1dfdc1fa3b150fb240d4634437a7fa4cbe9ec87b60f3d258014ba4182b2a8f1dca351a5d0661fcb9fa31b208bc060816e4cf4f18d7854ad0ad4cddcb5bf404d2e36b1cd50ec3fd48b8f35fa29d6d7b34bd27f8d076195ca069505d16b7eada2cc36d25ed4f33ece9fa2e4f482ce2631e55d85495cb8744c41632efd9463a687f942138dd577683165e2a0c51dbfa3008951ecb127bdb138aa31cb17d7ed816ba0b8afe6e391b29355e5efd632c9ca4ad760b0b3181f3ec95d4dca46a00aac6c44fdfea341cbd120de2c96652310511a82601f771761489092e248511b33295a5beb41e8ee68a7cbf4a7a9d7fb5635a334e716ea1eb128720c4f512dfc7e4e3eac6202bcc675791b9387b229e36fd96ead5ae9d408f9b85e3e1e619265e8221b2f9952a51310994c92ce278057696dc36071e064856f62d2b15b381e97d26215293f0979ccbf4d55cd262d4fae12e5a32ff98be96b9261e66c9dd8e78f1b6eb1ddb2c32edf6c224e2c2c77f50f135cca7f7c750374d187151fce02abbac8544c467b3b4114bf7dd2934dbce70081263005161fe8f53a28db9d8e6e14eda7e5b41e76f984ad38d2803becf56e7451218a9ff5074566b31faabe2893f4b2b2e299ffd2d617b9c1a0efffaef828840e8728b52f0ab4fd33f4aee92d4e0a5ee426a836c8759fe123c918a5eff3ae217b60ec162cfd2ffe55af2d4614c7248a3f4e7e83519a9ba66b910d08ecf9082e0a4f7ddc30db133339887f2044d648d58e99ae53c36fa4ddb36203636f574162a2f78616edc10cf7bb32d4d3d71a8a9dacac4d01b278afa8ead2df387b6b5936d85781dbd73f9f32197c351ae7b6ec61c35aa53392de31c42c155b0e139184a99c42564c00b796c9dd70ae8eb79e376d08e5f67739e6adf3d5c0af3e0fb777d6c9a1b337096ad0b52190897f1ee10be252120edf1d821bcb13282d46473b81f9ec509be82ff243987fd17c93d038b5a17608fcd875eda8fb0fd471896b918fb1a6b8beeaade32d6dfc1cc5e08f95453746e05dc93238b51e73a785d0393ff2e8c78925016db2425424d8c1122755464b90baf976ab6459e0022747d5d134b29915a485786c9d5b929d61ab0cf283027c042f0057d8b75c97c81607e1d24e5212ecc451e62bbf556a2b3a540842a4b87b8011d5d57a7b2e97c8e0680200588bbd8faaf348d0e33dc71698ac463b7f0150c2048b3d28d8f5825fca182989336b78d0c9d89569d307e0a1fe080d0c4e65318563acf5991c665927f9662b75f4df453d8248da84c79f1dc3784862638cafb14dd282750ae23089974d30534f1a8677274648f37346e1d0c27687da331dcdb703f8ceb9c96687fb1b7a4003e54093f5281e560e26c43a6de9b2a62b89ae0a6b5266e04b187e57ada100515822c6729075d3010a9b52052835b964b0ae44c9d21d6c64abe51a52041c8d4487686a4303b317ecf7adb22543c3a3623912ec21455632701009c0fe618c19a917d37d197f31fb93f227aaa2f3e4aee978ba645e297c30b77a0c00c6f4735d2937c83caebc0df23f98251cb120b07d6544d2b477fe061d54dbc5e70bc0746ed900f383e1d5403c84bd712e1bed50d8a7b88f553d2843121598dcbf105f217e23925a6fd62a9f7e195303754812383294834efef7b7b76b8e7e0eb33d8041d73da6672dc163c420a15a11404020dfe0088075dfe3b838dab84d45c414c441bc7ee092d2c37dd265aaf4750512e3150fefa5e8ca4cbcc76f620ae462a199000aabcdf2c53956c34444ab9accb167d3b47e78173a2be9c15cf247c47b3fe843e176ca73be165166d192ffbdb9229ca43dbcb38b82ca987cbc255f746a517c165aa1199e996118a11ef059247000170cdd3d21d79a075b0dcead8f6b95559765ad05eeaef7d92bcb21bfd5a92e02f1ea3b1409728528e325cc9b7e11d2c00983b41a248af4f621c6f8cb866d7c5c68fdff9dca497be26f9d43a0187cf1962d3b7535b0201ac36a5450b6c4444c884db645066320a8712407660e0169df622056fc242b99816b66214214014fcb38535d76269c2e13d9a71d922ca2ecacf7ab1df6c08db5135f3cd5547b4235d43c92c3ac93b4296e9d22589d54006b416095d6f81273e2bb81a7b760b7bacb2111384ab5ad3eba044a87e1e53f6d4623e926f3f12de2702d113677f49fa9434f00c87017844a99758bcde74de899f25209499da903318f0d060a8a040a1f871b142d6a3de6a0d25f225e9cbc2c9ab9226af32ad4761fca23c76bb5304ffb740b21a1e4e5174eb3080f21a598909e4bf25a8cde03865e1afd258151cb61496e91d5ec4818e1107775cf804868c10c6d2a0f264d0636cc49b007c2dcad491caf4e268fabc2df0a87527cd412157e904a3f168887aba8a31cdfa0d40c8056a1cc5a5e8440891e12a7876c42bb6d89d2d62f43f6992dda3789f217f6c012b5ee95932a88d9610f195f5eb594443868cc696a00a768ee801f10ac419e203015600a5d9f9475097724649e2e3904e845a04708f31cb06a8c00d92625966c8f87282b4af788537312f20a13ba4d5c7294c23742bf87c9acce78f17e18f259a1b07779249f8f7c9b5080199771078a9f7c6656ce1d146234a5658c30d5e140e22f40adaf7f4590a20443b6dfdf516d9570df0ae39c903f6883a0b65bdc07c4102ea90fe218d98981861b0b1eaf9c2ef35b2693b0020b130ca9de08ab2498571010e93d992856fde107689aca698cbe3cbd616a7e5194aa73aa055d58e2a4e3b3cdb63341b567818b08cf4886cafdd0f5f8c8f68059ec3d32b7cb03c96b8b87c362af3cda0ba785701eec71ce8fe0752e33eaeb778f49e27e74febf2ef62cb18edd5a0e6c7cdd9ed15868906b4a026450c4c443327c6380fc7add56c083701ca80ed5214a1104a85903cd77c5f2967d89936d93b420de513297504410258629130d05387d7235aee7a38f9fe92a7fa656f2f4c5eb1fd3e9e599b84eff03e55a2f0026f02d64b72769d116912002768b79f87e78c9676730a5fd93426de7357ba8089d50c9741b2a59fb31f2ba8ad35fcfb920e0623c434ccc17212a65978c1ff6afd41f164e8891dda39f09aa03102c66f86bfbbc1cd6ce1fdd6acf20216ff459c04443ead3ecd31070f83c9b9f8294d62d10d5d340a0537c7367b03d0c53ccee9f4e38bace629354abd6b04e45208cd252f72d5cdcd8b0d97894ec3cf80dca7f0c1302b3b8463d4d79813f36cd5e5f2c1f9209b74b309b2a8bf326c76c33223cb98eb2319d6f309142f9ce757fc332ef8d0c616a2dba00839aa32ffa8192f4039335765d3f8a7cf7bf3f2d79265237060ae7ccc4a4fc13f7eb6558101a35985557cbacd2071a987c42ff286accc24c8ce39513da111361fb9c0e02a59ca73b2c489e62ede6a02ab14cb705099d133ee5b1c21827517adcb3a76724c238d66a9588f9c4e4956c517b194075411c76e5d396b1595a137b04695022303a213d5240d2ed8fc80e9d8306bea3f521344be5b71229d794349f0c7711cf8d5e0a53c3e88bfe15f30b71c8ab7d6bebba05a51dae9780ad7fb018b26aeb58939dd08e692d6bc2c818c2949c729f913803dee9697fa897dc71ce008f768efb87b1d98cde60fb03a75845d0d5dc614eb427f26c11b91558694d7c7199608e27dc2c824f3c9428f11e4d02172c22a82de07ef6925e09076a338111e195a6b40d5180db9ca760ef99f62da2c8eb8fdbc1987ff914bf4540dc66a70cb3d3c23b8696a8b0f7c44e19484c2c13e8bbbd8c88c5919404b5626ab288ec84d74c8e5d7f5377dba80a5eafe078d620097243f740f38a4df43a0e0d9ed3106acd4cb3c737af9775ac9daa50ae75b0e20814573e85926b9e250da7259e7aa10cb4430e62d14f442a057ca53c92d4f3011368ea5df078aa834bc414138b044c1acdd37445361b392e633f04ee69663b1bf1c935a6f0b2b8f8c4cb3f3b4e9e9fa802a9c72c2ebae54b60b8591cbf2072161e5a935fe44177e8c1bedb69c12de7ab258830d84e712988bb5f091b53ffa04eb32171d84e289bd007d197a089c5603c936311224d7c98ac21cacc57fc6638b319130cf9d2329f9917a360a46b872a7211ecc4d3cac77d95311ef3a653c8fbdf8ef187878c93684640e285aefabcf74cd61ed9893ec50215d8373fc7f311c3231fe2d78f4e11155e3382035205c1a50d5010d1881d38fd872f2c74cb30459c783fb439e3e56b99e3547ec60286829e4d7e8d5f86f8124d9182975aaa9bdacfb0a691ead298ac71b7958856386d080885aab164726643be69a759f8d496d60d4bfe9c0d40f5975066c9e3b682f241d717e48ad1379b0887f25de68ff310cc6f9ebe7badd92c3d5c6e4e49833be88186f5be8f214e410d661f66107b29f1dfea1d0e2d1a05c9465f1db5ebc996de9bb391558e165b3ab78c1a4008c5c63dee7bda2ef7c1ad3d4f39edcfe016b66a935c57f91aa05ab9920086ebab1c8e4548780dcef78ef797acab33d1603751394117e86fd8a2cdd369d193dea88152680cdef42fb5a2483714e4a112f47a1b8c4cab9e7c08c870527f0d402c7241d2c0d3ed9602350834f1e151d16d402b863e8bc60643e6aae001727610c22c1a6aee0110851ff4cc9875939c01a27be9d6dd95610c29607ce901918b52863c48bbc54cb74bd05da661babab4000fd0dce768ea7c062eb20624206508960620c1b3ecb035e87669a2a8b15cf06ece5d49bf88197ffecc1dadb129c823aca5d3aa92ee2d3857c5ad80ac568e38e0528d0ad361bea100b7d30113e115254b6d34ec1d74f09aba6146f7aeb7ae5cad210604e4eef493af4ca5bc1dd8cd422ecc9436212a61d19a687f912b6a700e2d78fbc0d58b30b78b5e21fb6a7382bf5165089f8dec33354e36db56c9c629439ff95c6db8e8e0fc48832ee6986fdf18305636202bbe4e0b645174020a72699895a15797b2c9b04f68198b0ec67755ce077107ccfa8537d1e132d9e863ab71fd75e7a7a38ed0db49f0284ba0548d535359d8976d166e55420f45c1e4ada586f4120dc1bf19c0aeeee526f4207e9137ffcdcd7763ccf5859da30150da2616f2c524c5b8b5d4b41d6857a504a5ee1b8a695cf302ccfd3ae8ebc0d2388546f1b404c5098f4b5c05383ecd5560d7bc7d428f4da2e8c1ef0882f8c6dc38d43da0fa5c78420fa55616a9ff9934e0f1a84a4a9689224363e1613a7f73acfea53c41cd025c537b50ef77a29f11f63d25c48c91c6ef1ecee571acef1de45e05e9991cbd5ebdc52d639b617c4640a990ebff0d4af225c902c690ac015bc0296800daa25323d2e5f851ba9f8500b7e82d5a195cac6f11ec746e38a04934bd745c76232e71abf37d04f77dc52164702e029fcf07b00c0823d156ed9284af6d9f00475af39901a14fbb823e5b407fa5c5df8fccda18dcce74f8f9e38ed31d9128f765aee0a0359b54cfbfb8e7684c47049b099369aec9b978bee0086a60f1d2a55a7a4a8b44c44c8b431387579b16692e925417a5aeb91d3d364c36caba1a40acd300a88afd4114da38044b9aa75a7e1b5505c2ea7d23ebdcbbbb6c42d25b9d582619637ddb4c4aba0c365dd62b7e5939a1278f9e350d8a2b4409e0a7fd506600e0e53f76bc7dabb9b416cd57b3290afa9cdde37baf4c5699847105085a17de9035216a6d0f5b4db7f9dc9785ad137379390cac6f508b885425b5297523d56bb78e8a79c1a2b7952dc56fc12ff019b42b88140e33c95cce44a1a9da13b8cb51e0a69e8a266502b35331f27a062281ba7c4a618386e14cdc91e3047885bb070463eb1b46e24a6705ce5d45f4a3dbfa2f013a7efafdd7eb1d948c6cbcdf8fe4fe368377e1a14fc35e586387824533ea453435febc5fcfdc4f6a21864e28e674a5f128f809d95efc4176c730105e04cdddb49da1844cbbad31d0a3183fc8ce79c0c8d036efda089411a5a5602076f5ec8018d9b2764e4df4c4bd04bba52adc743827eb40f1f7a840d447a1bff8a4c615b881a88c93b2f97ec6d79d446212dfea468b0b577c645135d9103660723bafc7001b7ab7977d3340adb4a638ab2731452205471f81b57812fed1ec4dd9f7d84af7a2a8073bc28176470e28a3e43dcae49dd758b7805848d618d01fd509ea28332f0d4a37d8bc5c18f5ed801248e994ea9d2950cdba75960a267f6229a41ca0d614fd881faa80b1348b58b465d3d15810b970682c43fbc37f4561c11cf5e8f761b66b463d23823be6daccada57cf62696ea2e2be6f20250c51fb075cea142150256e8c433144a2f72cd8ac9e4c628bffa7c91824260d12fbc91da1d138d961d729af31973e37297ea147803674c0eb90e87ecd231a3d31003004bffaea8a4ea88de418aadab1168c42b0f25b9357fe320a30736e138593fe629bc29ddeb985ff93a124b5fe7bb7e0fecc7afeb278aa685f12682c901267650790c88cc0ef6c677f278cf2c8881c2e4a93394ce38ffce146afa9d8e7f944476a9328a0b8bd780823080d4a421804dc06c19804c808c4b393388b0ca2fce96f9e9fc8206577ae6cd82e5ad64e0d195371d351617416a2aad6e4a49d3c2cb21d5d01718e3bb25072e485dab0cc20bc7aa554f3a30d1556bb5a05ebdf168ac1f705a605c9513a85a7dae028ee4900ac235c746af527222aaee381a90f024bd5a0d6d3e06a257ad6db6827432ba74c0b5cca1a66119e365befad94a6df23aaff5695ad54a53ef4bac55227f2f9a4a4bed9350da751e39895540e7ed16aca2bd452ae4b920948f36786f62f5f89529c1aa2b56e40b12af1971c3162f667380ff5f36591a13c08403d18bb56393c8d97e910ebf82110bd6b59fcae92c2a9256ed8769808f75cf792a75dc1f8b425dd950266ba06a9aeeda8f589edd84f88a2cd6a01c197b62ba5f9c6075093f2e175a51edf56dc3bc96ec23e501bb03a9f0db7d842a75b2a1a607ebd7cc9328ac1e1e1b71c735733388b12b27d277401689c4d641adbf1787428e60158b5ab71698e3cb386a61edf25d6c60af2fec3acaf004b06d2a00565943aa9fe256bb2047406760ab14632aace205c212c2292172f32b76bfd481be1c6cae84187f8b62d576a871fdab0859941b70d07cea4f9ec0331f4240ad91d7f6979c395b387ce8ebd948ca2ccd876d57a12d1976a68a8274749a9d0d6e8c44a0466b51f2c9dc8720fef7ca2dc9a3740ad013ad0fb1fb6bfad7b8caa0c973ebab88683436a70fad7357c9c7405e4532d3ba6805329f529f4cad5ea7c34cd4167168002121ea8afdebd7344817cd66106cc896ffc50de4d7ca125cff8c79adfd51660b14e996902587b31bd9beb90d898498ad7c7bcaa3eeb2d78240c1629d964f8ac2a8376e763964f39ee0baa4af460f52abc57854479329f65696663a49c25f63d49f4928258d042981e262a4f3a586d0e46bc899ca37d771732de2597f8e27b68af492ae5ed284d04acabf572732d08efaae154c03fbfa097a3e076ed865ec7021225968430e626464af86905680f9cd8de335ad24a66d10089c969213e0eccd56c64e3d620f7628fa6e3b066b6f7fc6550c3d25c038059f208a5bd5814699c09a6c3ace24035016d1e427b3fb5b0d09244ea30c4779a948c4ea47c1d988b66ae21f37ed6f37905706d871ee5ef46c14ae6774e15c6fd198bc4a1929866bbc15276a987fe4169cace3406d609be3655acd13ffe95bf256f7ee6b4516e9eb9ea914e7143941e9ef569f704441e4830a3e4154fcdba4c2c10e15a78028d310909f456a6e6492f91f2fd28549115c06843771a7dc9aaa4f1e416536f6e50c084fcdb51bf73eeda6f5107c8fcba3eac0c7416333ef04bc4966541a8c5cad61469e3a38e5938d15bce683b2ed594689b14c2d3e4d3249d79b6f7f6fc41628404b5918491e29ffab657d1ff80100b14997a56f1f24d3842e2c3c2c06e54700c86679682000f2c0ba15ac79be3d645084caae7408953e297793187989bcee6afa764daca3872e820e10bc78751addf376a54853d55236068ba77a4fcb6926dad08645ed3dd6413af1c2c96f4eb1ad5a7176733301bfebb1369be249c02721bd9247d0b2b1105fb1f9e4b966ef34a016a57a179dcc9c74b6ac32163fbd9bac0ea09f4ee03e711efdeb53232076b3496fbc400db90cf26a04c29017fd5c854dea7872a9ce3047722535c7d652892e375e512e25821988fa45222a5f140943d1c3216a44f6fcb9c445d29ec263b7ff37c44b3454756188cc1335e92c82c63835b837d4d6244c22408c30da5f2858af9886c20817daa100f15cbaa98370a1880acc29d9a57b9a1841eb97c0a5473ea9d31dd8dfa2a8d163749fa226db2085d7bd0ee35e366e01254724d51077225c642b48ede1f839b89919c3653da4b2711ba633a407815a451c2ddad8249f41a78755635403a3af4c48237a730f79ed007084f875a16b36e480c22d7594ad94b110c860ed236114915f0a71f5ab52eec78f53886d6954964229aeb93db8bbdb8d77cd6872e7d21890183a48db4b8313d25e1458e354ba8469cf2579357b5e6ed0a82eb0921bcc8425747b3fd89090eee22023b20086ede1ad0e07e665c1645593ff285b3eb70659db448d793fd56cd52cc8a19c90862d94d7b7c21432d74674c5a7c356c4d54b03e2e211be07a26de4cf0773c052d3b02f97a6fb6da4e002b6091204b8636afd7be726ff342c1a4c126ae6be54904e4332f7a3e34a80dfbebf6665701cab558f93067b1dd653a7a11f2935ca6eaca8e4ac0990c98a60c2c8270cde35cf54797a9983f94f830964d0addadda386be03577d9948bd6d95a7d63a0d16c161aee70b74fc0dd6b21ae7d6578b300b6ce7a97f6c17068db0dda88eb92dea01d5bd8ad7314d774f561ac9abc628d40d31b70fcc38c4da756217389035527fafa3e99600ee7c99481adaab28f1e2987815d08646315851625707f9250d8145435031a486694c85abb009cf863cff97e881c7f628b02f051e49b4ea89e5280c2fd87304515e5495e89633590318043664bd412babdb4ec5486eff84ae3971115f20f2b8de6763a85c873ddf3d38c405467722c341fa3a9fa9edd8d06304ce0ea245f318bfd2d4215f3ce18e350ce28cc3db7b70921c4e33ec12a311cae3f8c8baf360edb9d47242b688b66ec667ebba6a750e495ef04e677f5d8c5bc55acbf1ec47f48e0e9dbbf9eb35ff8e4e6397e19a2a1dc57a68c24fdc6a4a40fec5195ecd431f6a31591e82cb8b268b4234798e055b8361639eef1cc766415d6486f5a9213dd42d68092eebeaced0bc0b82154ce78cbf7626b3027c9bb233473e8769ce269e697b7ce85de93434ab0e00309dd835409554b8a2a5a8145b74e0513b01f7d19ec7573ba0fea14858b84387258ca72d4819bc9b57f8302aa7ac1712b9d0cb7918f3c0ecd4dd752e7dffaa20a990f00807a32e3a3a1c09cb5bd17101f753b0026657b9f05ec879c519b766aecdda8bde285770f5d285f4e8ad82cb932361fbcd3937eb862038796e1c4aa9d243070caacd110beb759a83bc6b7b8b0f639713c2132daf18471638a662f94a3e93aac0a4a71ba9c744d750d7be4eb663650c56e80a1a6080271cae81e46927af419e340a088c2820503592397302e80dd61c1fce888c886880c6d28bdadadfe86d228946dd78338d66f48f3f3b9f7fc991b6ac0089d89b30f5ad9517ece26a4f3d8e8385879d41211bd62394035dcb7336bb96ada44bca76176c52b485a17399a1a69dae17366158c5b81d46cc6deac01437b7497b8b2b18a057ea67743e53e2a4fd55974660507ca6f0a1905ad011bf715d0b1e3561b0a7eca41e5710814732f71b48e18c400d21fa93b0ff69963158068619b2edd3a4f67637b885d9d140249441659f0c308a7f150a6720a0f3abc85f6f62751d87603a3e13d5708689ad584fb080299da7da6cd1177eb024d15b92bf2a80851d6fa6faf334c298dee84e927fbb816f33b5ec2cb93753f793a4ac63cd2a4e58d5c276960add7e3a59ec85911c2757f40e642904a192e2ba9fca8581c4daa2e2df8ef5bcc307438fd6484a3c0823f6630c9ab0f609a36f3de8c13908d00695f113c12d9612fd8edd4c26ded72511d60d9958a19b863461264afcab594a54b24eb6de59ae64ad5ebcfc6e0d5531174beabfa292f98d001b4aefe7664c9e03f9f0ab270d888436558592d1d73cda4ea4d47e4cf485619d377bd458f464f405a8e416287534c868b046f64ba831e5d92eba6502a194145ddaa2d051ef3538c9243a05d585a187033c9d94f3fa2d2da1fdb67e99b2cf56e425ebec831dcd49abf7036258c88fda1ebbd432580771e69fe64470c2f0864776128a1e63c9be1ac2490fb2e37b3919284a2fce388c0d6a9b884c7338d036d08fdf8c7cd44689c38a67e664d2631dec3496e792137edd76b8038d173d5b2e91c9faae2719197d60d4f5bafec375fa7fb969a2ebb4e3165313c2cd3f40c1cddecabf44f0178244baa2657c3942fac38a0fa90eb35fbaad755c91e21765b3d02729b8ab4b58f619220b7466311b69602508ea6aa53a2e3f4ae5dcc7a76ccccbac514af40c3d8952665907e61b51c0a9c6acbf76d2b37e7c7c05c4bce2b70f460b317cffbfbe15e3328dc53013a3fe2707fe39636cf9f75daaf0a987cccc0d247c8ee1e870081a6deafb2d2bffb8f2480845672e05dc923d2c780232d8cdd6e2a95c0450a7286c73247a0cfb7fe4c2dee3da32b940f63c99a371f51337a216ce63e0a6a7dfc7f37a15ac608146749e3999640aab0e81e150fabccd14b26a1266cbeea0b7c01bd0e706b6981bc32ca6ae54023c158c5fa51b115a95958d9d643d88b0388f39af1df55e2dad0edaed1b33db24e60364650594b3f3abb249308ab3a6414b25f336d012ed8fe15af8819adc5063b3eac79e63f7aa508b53837fd2664837a4d31e3b746ad9c86e6fbeda1fa3a82ce0e453b91cec06f8eadacabeb9f1e7fffc68911881dbbf7e2996720f6d17eb8437a7e8201a64ffc9f2b150ba310aede19e206a3e4d958bb3d6c09fdfbbd3abab21262d761a6c95d5086f2f8d8c4d51135d28d96df6573ce887f171ffabf4a72b9eadef3ff15af839b60d51d067ba76464816edcbecacf2f136c9d1b3136574756071771355c530ad139d3857830c131329efb151513d8433c32f9ae3698e65d5d897532fa9ab25297169dd54fbcc2534cda7ccdd135433216ce1453607b361fa26aa21b489a0349feaeabef31e08d38afb4a52850a413d5bf0cd3c2ff1399cec28c537fb565bd6b812f35545039b66070cd7e28f36fa7d5a8439bfb403210258de6c8b07045c1b66b95ed7f503a598191108d9dcdba3089bf6b54fc3396a603c2a8494809da46d558cada91876f846c9e61c7df2288acdc6a4d25279ca84a4b3f7f9f8d867942d87fd8f10815114c12c2382389ed507cd87edf04cb9a0faae56e57b42d6d27f55fc1d271bc3357296d900e5a600949f348abd7bed28b886b933a637d5841aa9d8e7c8508432c8c80ee739c14538c011a487b4935c863c89a18b431b4fa2bfd727a6e8d4307e50d888f3b6d5e6d5920431f215e4279bd123210a2c8a445c1f0912428c18a2dd4430ca78413fa425d34e2ec26d353f8e526edb692e8730f380eb1ce74c2c0f3a429228e7ebcbf48df355efcd37e9458cc1657bdd30735db19044676b7f30fea6158fa11c68945275c2b964592668655f6bf0992e25c7ac55d83c1aff6dccc07ff78ee1fdb8dd6b02f318cad96eb2a0dd9a77f5c08bf24be06ed05b57c51f96855ed8f9a1b32937a0dd23fa9cd23f6e0035398414bef5c0c4282ddbd5fcb7aec0d956f2c4205de5afd9e8c1efbae50c72d542a6ed79c493604eeaef667c301d2e76ad514a65684a4d99c43c9c0711d95744a8f5d11a0f11f4cd675551cdca55fbb4a9b68a904c62bb5c66729390306a3243089a097f8ebfd29f2b7c6dcdff3252a5f540c4faa0fba7bccc56121b502506eb3d621224249dbc2642a88bf836c715bf9f601413c95f2e30cbc18415049f7848fde1ca557719f46cc596495f91f71a4483c76c470729ede72f524f70fdc4a7828feb9a572c77d9e02bebf1ddeab16a183c74faf3688734ff05cb6d3753028de2878c728fca642d84e1dd04192a570d6df6c5ae0718cf77ad82f0d071f49eb4fe7206909e5320d8ca0b6c0ec83bd0d473bc5cb555a3f6200db54a5cc280202a5972552e255678b31d3eeb9e13895b06726c10f36b217677015bd2b05333c5f2dbfd5a60677329ea92ae7aeaae2ae307cee3b377247c6722b1dd692b12dcf32dea678ed9cd14a03e90890cbd255db5900f023cccb23096852f97fcac8a089438cfd14bddc95f965e30d5e84da47ee77d8266d633d72e76e21a5a5592a767daf321b720f7e49b26b3205a958ee49900a1ef148cda890c8730353db45d75ba03f647ae183fe1d13934354bb28175c440a247ba6f9c35e526f3b6995b8164db3351da63bcee9c02c08e22066f4af43b62fe6533b400c96c4a3b62dfe901fca624f65479be2be809289c4624a6eabe524c0c820bf9711012fb2f99afe1bda30f7a888758484c750369ddf24754095101091f221d24f0e6429bf7d2332fa3f2fc992b6b901617b1927304a15871e84856122af7f52f4c3e1bdb1541a72351569719511753bd10d9a2942d071833fbee5f50d926752dec7a2dc424ac6fc402460d0df10283bc057bb7faf85713ef3deb45cc2ad31f4e8b333e0aa02ec1cff6d2baf2f1212d41c29f3c05d79d0159005f29913b5d4c89508088e20239a8e9b5413b7f5ba86af98507235c409086dcaa5bc247c9ca201f62d5df640d6641caa4fab06f11fb9b652105209fed575cf6451f16ad4911c582ff390609137af9ee74e87b056ba173c9103ba8700201ce7d993a2249d08df4b3007819144334e52efa398c5b20ec2ae599a1d024f81c429d6b4859c87d82ead095f193aea7eedf476993e1c1638465c9ef97212f2dda4dadb56c95058ea466670c174a69a1d6113d202fff8d31cc3b0226e081c8b8c1653a9dc96d15394bb9b727ddf0f530144c63e94f16e9bfcd82135244ba8836fa4d46426f1ee6a09852bd9013d969d9ab5d802c523e46b46a5198739ecccbb921be9962c0503970ac939d7bd0edef5f9088e2a835d4a6da5a090058a8db3d161fae3590ee57d6b566a349e5013a6b90733e15ba69adabe1336777ca2b3bb3ba321f09dcb5b83bdc60086e40419a6849b500d129e32d5a655ca195893244ccd664a32bb2e97734bc3846f1f8ca82b4c38cf29e37964a827d5c09774a726f5c49d1ab0e6e332e24b1ab593aae331eecb27e70e2fddfbf9451a59332597705e399cb0985aea0906759d93bce6c7c1080ebe11a708311a68661d05dc049145e4238650bd7a380ff02576dbb96b80b06f95cb905a15f1bee624ac1a96fffe8786af33d1613746d2dd366e36ddbaadf184ce75a24e8188b712a33da9635b98bd8dd46ff2fd7a358975372fb32b50768588481cd85202fdb4ddb76de8871e75eb21fa5cdb615e3300c6068226f8e921a276ccfcd3a63ed69cc0fdc1cc87571e1b8cd88b258b1cae322ca92e4b2c73208ab0b23b9b5b6d7c4480d873746daa462190e997e987ed3192d04d644bc376f483597cf5d6d4d547f2418d8546de3c752ce0357008e46f85df7ff16e16d31f25e159b9e29a35e3915cbfeb0132dd5232e129d2e9a5da1f8719575d07af584eb2eaa872618d4759d6694f291f5c5ac1c10d3b7d57389020b921879f7648bdcd424da99a7e8fc15b8f15bf462484cb846325dcf8686eef4ea13e2e6c2be02770ddc016e338254b510602232b0580e966d819e30c3ce2f2df09858713c0b9e16cb0c95e27c2fa21d0bf5b5e3fce0c4156d36f55d0bce5532dbdea37a4013b4d95938a79bb69fed82c7d8d9f17fd76725744779bb5484d8cea9e9e2761a0f57a5cb1c78079311d6f8bb1abdc54bacbffc4eb8471b96d0b8a6e042d0815dff1cf77cdae33ceb8f10512f70c51390a1e04f1362f6d9bea9705972d1a4f414273b2bc20d912f5aa28a1d7139a8acb859c997f6f70009b6e131bcdd5b54feb3ff5bd9026b9928eaab567063dcdb2b4ca603c091e37a59ba83a3ed758d56a08eab023a583118800e03cd579016423847079d6618d82dcb27f40544140ad77d185828b2c93cfdd5d3a10edba6325f07458e1b40ce1aa2fbb5d1655f916f3961be6b4035ae066bdeff8e85e41c30726c39e6d20e3988aa629913eaf62f68e940a89b2a22cc050175ecd4c71e2030d43fcfb4833f28eac6c9d92ccbcbaf4a04b485b1d293899b9c217ef3fc5a847d49fb877c50faaf378aca8fbe692606ea56db9d53eb2f679600d78e9be10663d80da06622a71269bc1cb525407c178f9c5d75b561c87f6d09734576a21b9772ef6ebc1cb5cd60c7648bf1b5d7b1c6faadb508b1eec8c9efdac68c0ada8f044f3135531cd94a6b480c765e324adefacb991ec818a2514457f4a9efbd7f1a48ad0d6bfc05174cdb25d0a4112750fc3fe469207e81f455e0b06d40c38f63982b8301fd85727a6254a02a49e6ef1538326b9921b59f5d4970e0817c857e2509cac3b5044b8a5ca209463461b1a48e6ecb2d159125a9be0739f52d0ac73d33db97174d6b49b12cac644b320b8004a97d0c286e49275b6e58d1f1c05bd22908f932874e66b0b4db79d2cde84987ba08d73307cc737cb8e94930ece33d10db3c0da72739f53e73d793ac29f6242bed49a6bd42b906c8a0a824d13f2468b1ff1240d35f26ef35e421538fc3947707ff65340989a9f2f0fe61740db8f24cba855982930613730edeb2833c6840f8f479fee185121959413f2722fa77808fdd08380bfd4a3bde3f7e90fda45f27a05ebb0d6c01aa67f6f62b397ff97241f4227da7eb9648e3a037e71d822002578523f1192e788225c804c4b8b340859e44fcfee741909fa89c0cce922615a202498743f7c3ea7360104b42875b10220f661c95258aa361e5061c795341c750a3abcc43dccd099a4f8e14279cc8432e04242265ca587fc10f3c9843d10e72608f34d2cd89f2194f3014ec48b4e3907160a73488bc05681f65311885a9dfff77d18c85ff70b9e9ea6ff8bf1ac9a61cf40186f0fe3b7924187669cb146698572b159afe453e63923f682bc5f94fee3f662d028f25ecde62c9fe4bb3d59cfeb99577fb84dfa641bfa5f619624a8da03929bda4670889e7337bc6806cf0182be1d6c3f0d9ae7c5b102842106d79e1a2a2c00dcf628b66d96f11607b19d5da1f6b95fb972983c45022612e0232d108d6697ee0f17f169ec7c17f07e5d1521f4413f967b42b96fe8ca83a45a94b54c8ccfdab77fec0825f348ccf579377c7d50352b5fb052be38ec8328178bf903b272080e4e00ac55349902443fb0c9e38c7be6378a034af6b22a23cabb4370cb20887f675c21dea3c123fdbb4d141426b5b7cb566b8e6b8bdeb9320a62a2e03dc1874db8388d71bdc85277e9dd220f20ac067d6afe137fd8effc7a31bf2ad3d5ad5c2d2b74df84ebfd9585c1fea13e4857671ca1466d0db62220aed73fe1857daa29980ec522b7fa860ae8c61fde742fa66e989adecd89f7a7e819180c55b260089cbac9eb072605ecb77e556e0c850c88b78c21f4284d0cd47d2a774d863888efe19fe1575d3cfbd6774fbf735b96d2d57654af2022925226e81f78fd2a13eca5efb673c5ab658455c6bed3f6d11796263ca19da1b6d01c57f6cb03f6af99b9be83fd0cfd5f3f347204dbbee04580f1d776421e8d04b8705138c6152101a9156de3631f3e05fd4d3e262f5d460b387a5a9e31a8d3ed9f1b8b4fd805a9efe6413a56664c9d3ac82d94bd3e2b996d3e3ce0173f112d22c7b38753155551773c5546030572f6f6cb6026bf0e662338289ddd6bc50e5b43a98e3999fcba522d6eb09b97f9d12ce40242b5d068fcefa792d8a83c2505c081aeaf122390c0306d1d640e28b53a98c88fbe577df43bb66fc6a7fd1ae3ff61c7a6cedfa808e69b5dc37608afec43102788be13289ff6bc35b745e8b06a6b99aeeb9bc6f35365fea6ed4e2a6aace7e6696a96b0d040d3acfd5be7525fd625e80f344db3957cd5c849e7ed770057de4df5b4ff36761ff78c0f7c0da5d774f6a8447058f8e093a2d198aabfd63ba10cc4476076f96723fb3e202d452dc3efd015d702010d21402c54970b5d55a2058b97af2d655bc57867bf8b9431b98652fbb67aeb639a35c133b2e118bb813ef2a24c1a3d90ddba16dd2f08a4fb519cd91d3013b53e8aabdc2ace5e900da2b604d50986de56e88c64eb6824ecd14cb3662b1193f27ef93860790151565e5425bda90089402d6aaac70692966aae80f77e71ba22395c70ce2ab5783eb87ec5b320834d57c71adaa2079176ade8bc27567e6447c3ba558d72b14f806dfc88981aac1c81b41aad9eba71c1e27106038fe4e13041e1133f82586cfe589af2358ad13421008af3e6f856e84d84d6d912059ae3c3c707114b1262ccc9d7afe6b3e088bca4d65647f5d566e62f0a7a08c38a357c2fe4eecd4822226f8daf157e97c9c223dde3e7850b37bf25497791213986669226df6ddb599bba9381645f8cc49ba2f8599de79e112b709829355e680572a7f4ae4e580eacecdc4a1b5eda6523247fb764a65eed1d2c976bdf79ad63953ef5c4cfc8960c18b74fd485f6a166a4d58362feaeabf753e83d33e4d9374cfac54967a15f3a98dacd2481c747500d6c6cb7b9b9a1090589a10aca54bf6376455d3c15cb933c28b0f12f78ee4814620689f80e078f369e444a9a662bc18d41069de2a1687caf133860a47aec10585af4179e7229287d044d4219236e4c2089a2a483f13022bc3c7230c700526f97859dcd60df1c786a8708a18686df824abcef17a827de670a459d4a964a9a5cdf3b09cad0b9072aa42af77fc7685e03edb9e89ff33bbf06d94b0c2336822a38bd910998844102c11cae683f832b48f0cfcd30f55e07095f140251904eb7ca0fc18d0e60771c1ef94f375003109f373a2eee6da84a736e7e01f38bd26d2a3a18c6a355dc2a8b2ec556643753587bf6345ab1c4d0f222161f3b5bc4fe890bf69ffb52ae17a92620ba9ce9e427b6f139717da5f7f1e4b28b114d9c197b6368fc11485d57efddc76a364b54106dd388f6b40d62c5cee289355a1e4d7c4d5427cbfd4ae8fa8ee06c357db5916cab962a3600dd77789c2839358154acb20d219d6dfca3d1428116044cdc29a8d570192472e948db87fe424da1e0631dda758b3339732fdfb335fcb0c613f3c436726ccf99bce9d2bc8bc6f9987411beebe4cc58d29c37ed2e5b18f638d9666fe5a63ff2c6556e11bbffcb322ee4f2152d24eef8f97a3cbf3824011d6f6f70bac718f9bff6e1bf16ae0d4fbf555517dec383beda7f8718b22867a17390e8ea02d8f9e56411d615557c33d1a52b8a4f14c933eb025112608803270921e56bdf5d5f15591113814daf10d65f9e61e739d338009042b6ebd517ce7a0529ed5260deb8db39618d796776eb186e703ac98c1d02258f985c107b1469b53b5b7931b70c361a3783ad5e9aca8f2a050be6c4d12196d7ea94c42038173ef4ad3ca61992f72830aaf18a1e1566910d3224a37340dda944331cab6fd0d529d184d66ebae41ffd8e8adf9cacbde1cdf4252a49e9ba3fed54ea70ec6214de06ef6c29ae51a6272f3057c78889a05c15631c6f547dedeb75785cd97aa011a385f3214177170ff57428702219d399223bb616ae86f21e196b8ce5aef0a153ec06c554eb82e9fac7e14ed5882bcca36c6fa315c63a40eafb44d8ed214a9e98706ba72650f24df8cc5f664cf0ef70c2b657d91fd46357e3c0f501aeba3f9bf18c016ef60b46c6d7e2ebfb13cdacc2db3d730dbc50eea2cd0ceb0a9daf8862f36d764293da5704057dc888bb9ce102a7ba85e7a827ad762f6a627c8153595e2c1472d46936454d87d4d33cd15f37e4268fc855a940da8dea9e2e060546b5cae25646de0952aea67479da85f77aba1c06b1d5aa79846d4dce3a80b9de95c170e309a7f69040bcf8a2590e383610acbd132459779862d0873a9087a327cd847daa60f27c82ed3b03a3c225760badfa630dcf4ece43cb5242ec3aabb8c9ff7a5bf2fe359bdb58b5317272f6c6121a52e4bb7f90b7c00e270a2de9c8c4338833bd58eb62b5a6e8c724385a18cfcd1dbc28a4f86cdba18798fd708f36b79a9e3766b35b030fcde4b84fa0f0b83e4d2a28460289fa2115c2547db3652ae0dfde90822d202112c6c00218959916e60e5bec90508aef11fb8edbf6712ca1f56996bb9ef533b1341ccf399d2e8ed669a10703d1082a9cfd22311a2080754cd4fee44fdf5bb86dba37a3980ce5b0ab75db2876f5eb060cb6d262d33998190d7dd494d38d5457299606d65231bec064c9303cad752925b30903a4e072dba2dd1c8143fdfb2cda47885c2ef475ff23e0bf105bc262687d568365ec12fe42f59be751dc2524fcd0feee3fb73cb5d9f85013bf37c03c5093883cb17afc39ac5ffd9078f81e5ccba0909697befbde5de32a52465e9081e09e4083f374dd3b45a674f05f00af329fdaeb79f41381f761326b86d13e468ab7ebdf55d4aab86b36852911754c2ce241c5dd8241a285d993483305dae4c9a81923b8ba4f00ef73f5d0522328c9c507cd309e9eae7cf04d39da12909cb3f4a32291004283015183497ec702507980b5b9826b02a2ce56826195161b159d3a87f822b165b40a6d3cbaf63358fd6f3a3794ebfa4b258d61a2de12f01d90b12605d0f57d03e133b7ffa2a1ab682a03ef543ecab4224aab79f52bd7d24a947d1501a615dcabad9775ead055bfef6250c05b63c6c05f11ef543beb72112fbdfa3c2ef91a0de7b09939f01b6f7d06a9a36414d02ac9b85a30ad708ab881672cdaaa136eb6fde09fcd1aefe5a348d8aa651510f0bcdc362dd6e5e120196ece1d3886524753847063baeeeca2e6dacf2420ca43347ffea6f14efb6d50a74b58d13a76a037d5a9bd7bb6a92cd639d755dfbd5ea554f64158a777b554844b68b0bc7bf5b38025ded53a16cd72b49d1cb4dec44b4c0a89fc5fa9c9e122a17960fad7a554a2935d943ca9b672db50f2ac9ed88d9cf85a99405078480a53ea881880273a10613b0545825fb9175030756f52b209eaea941d97c10ea6bc2564d02fbae55315338d6f0146ea1d64b35dfcdac55df7e12980a543dea85a81ef5b5864256ab0f42bdea93c0aab366bf26142df812278d47bd0d59ed12516195ca02a7a05e5e21a830f5346fdfe6ab08a979d4a3506f5f08eaad10d4db84413e614d68847a9b7ad40f493d8ae6edd364a0bc13041d34f2ba5df73456ec582fea0b8b492c369779cbacde876e8fbee4f644bd2ad63ca89063ed1a6a9e55c8432625aceaed07d97ccdab542ad5ab4217544f2344b27a1a6fc320fba8b75c5814c842bbfa576252547aa85dad85b17bc4a22aaca2030a9b7ad6cff8519261cd08e792763d4182c4260caa2264c6dba71122b1d686311bba80645a61fd8c70092b64220640ff8c22206684765a79827a541854659c827ad4a3421790cca59ff1369c38b8d8f94433c22afc354a40d484d3c7934906bc352fbf06d89a3056c5f4554cffe3fd8e98fd46d69513d6d5ef67a394fe09f2d24f721d1cbfc8e5a7a08f1e4e9de432a8813e6d0279cc171f58811c213bf2518fe925ee215015530db1e8812ee4bdd4ae7e15d864dad59f1a733d5857af8a0b3df662f4d0518771feedfd47f7b19b09fcdb6ffe2a819d5f6e370f8f611a7ac8e1c8646e8bcde3432cee25298ef54a197228e7c63bab2ee3314f7fc13da6bfc9f0e0919373e58d77c7bf632f792d1406982630094494d31d9fc6ed68f3e0f418de11c363bc6303efc82d2ec0725b15f31daae8a52d636470c72e33ba900ff9122762d51855ac5f25c43b6e823959fb4c68302ccecf00b28abbf109dacbb06580faf44fa817d8be821b1f85e19d2decef32b0bfacd002dfca2b84145c817f05ede5a5e0c89f85d93bbf668124976ba83d83a31bc0339e32f4b01498e649856ea57ba8bff04e26c5adc0bc1598776cb097a44e7b112c36ab84586cd5902ac6620e2155ec76ea53616b40bafa8358eaa19928fdf490d4691c67a6a45a0c8b8d02d95ab93da697f8073bf2d19201f83d4c52c4f597973f20fc1e3216167ba8879aa7977ac97ba98f545d928f6fc850c30a9a79777777777777e6b4bb9b524ae937edeefa2d5aeb8469da4f9816da76bdf6b57bc0577777d3eea6ddddfd51a712a79b7412a7061576be9c430dc69650e19dc9d30a75167867944997df08bbbbff903dfcd971b02d20d9ae24302993b46ff94f58386159f6139685b65d9fbdd6f3e2312a34cf1c922efe5af947f3d4da1ecea14c876e8afca82d1694cf969f82dfaef90ece2ad3def9414e44fcfcf7fab0123843eacc9752aec04a983be79c72ced93c23e7666661d557c833640ff964280aca2c5db9a58cd2d1955bcad8703532b75f7e95a2c7b0a19bfa2c937a277e76abbab038a6d899d43281af943d2890499d7e3006cb4a9cc30895f2e1a9f3ad639601393664c729d469b3c6b9e8aa542a950f53c0833367cc5caa74c72456420948a5cbe10a357f7af99950c35fe99c737a8e143bca2d63207165a625960322ea19a572af1881996078a725bd0825a860b97d74a7d74985775a7665b98d7952b96206c94c120c94dc4e4ec0ca2d6348b972cb0dbeb0e0ca2d65c8a0eca7bacdabf909d6bc4af53a606bfe8e4f02d301b6e6e77c125847c46233941617c1620bd1f139ef60101d9ff394b118f1152fc357988a9520ec388784a8dcbef96e7dd7f8b6c90183aa702844e7778441afd7f9a0105ec77735c016108fdd1a1d74f20352e33ff8aecbf11d38af8d0f0ed816fa8e1648726fe0781c8ff3e24bde713d082bd0cf9e82dccf1aef6688aebfcbcc10521965ee38633058bafd930c21ef997bfeec4b40f6b4b5519fdee2c2d696130e19211421f4f7c071fb9b2f808d0c01f3da781ff6707e071cd0f5cfbe03cc674aa9b7b6cfc2b1d5a24f64c7e73c91115e84ec391c5bdb8ecff9213bc29c70c808210b975f8490859bbdbc4097dfc7edffc7bc369e0b7d44b1344c808df770051bcf852bb8de8dbc2e0d8dbcae8d50b288e367381a795dd7df3c08e0e857fcfe0c5003882b74167184efc17b38e2849245f19d45f100376e7cf737c0d185db31380f30ba3816b9b49befcf37c21149e67520770798ef210d470fbe85aef1a3b3c839c21cefc1f3cd91231ce7edc2b1f300e4e7ee3d78feb07bfafd707742f8a62d76448db9fd2d03f8cf1084cfc216901a3fbfc6cf70e42ece239d917273ae443253e6ae80f31f7cc71f10eed6f80fde8725ce7ff001d839c835fe03a432c6dc0f1e07688a36decb91f38de386cbbb3173841b0e5728de0847d68b0cc24f7034f2ba1ffc3f7503d4f80ffe8370c47977902711227c7340117e0738c24fb0bf56909c17e187e4bc08e1901d3f4228db41be205ff9b58288f0393f44841084cf0941f82120fc8e100420385fe37d181c6768e47571c20ffee67dbab317bcf90747a07bf3f4fbf120fb7e3a78dd0bcc5b0388bf706b8453e9069c4993cbfcc2624f2a34425638c390110b6719950bec38a9cc89e3073bcea157d83f572f5734341c59a16c97874343d5b25834cd49cd49493f1cfae800254c67fcbbea57552b37d5281bce32edeabf39b2232719a95f4df2cee953e89b734e21b8b093b9b0122781c0e62cd9f9322895dcfe2bf86a57bbdcbe9a271c7b5e2cba0a9542995e5287fff56229f15f8d5e055a26ccebe3b7824c584fbb50b76ba794d24cf32618b6c0b5dbbc0956c06f0bf4765de7d1ebd7e3eb7dde044d9e111c6f9efa9eacb516e5a1be96b429af6542df2975bae9fd1870e6c92190bf3a14dbd5a9522815b7a95455cb5454e59dcacc4c77f7e9ee2ea59452b2bc7bce39a594337420b168a62389adf783f7b028df260acb1f143bdf260a3baf4d1456def95d5397d29daeba339596ea764f800c57b0a1d4a8cdba7394521a9ebcdbf3e4475dfe013a93f77dde35cdce9db3a1b439aaa6a43655a3bbbbd378f293b2060f763e6804e747be0d254ae3bd0d2577772977e48feeee3fbb199ebbbb1cdddd5daa9eb0518583a37825d778a2f3b1a97ba06471669a6f3c659b562cca2ff3c56d81afb32897ae77d8d37db92df0adb582b0712074dcddb4cc9b9ff77d3ff21d1c3fcfc1913a3866d73d29fd64bdc92995277967e5752c2f051c9a2b47b0a3d9cdda636a04e7f677acefa7bfbb47fff636a2e1519b7ac383d16d81af8d2ff2b9868d694c72d9132346a3bfcea3d120eb7a6057e4bf53dd9c661ad7993ccb49392ff73ecc6dbf6df57db8f6a66559c66559d69e83f3527713c83070c2eca94d1dc8b009f33ee93dbbaebb8b8da3e9eebaf6e2a95a5edc393f599b49d1838e707fd7759fc0bddbbb3ba9bb938ebaaebb8bee39fb04ddb26777775d7be9eebaf6e275475ee7e566872959b6cdf529454aa5531af2043ac8badfa9f3be6e54fefb344f8a6f7f403a8c173bbc302f95b3a5b78976f34b80e4e27a61f71b37a5e84f33907dc771a1dcbe1fbef36af4d2acbb8633495b9061dd099cb01438a5cb1f05faa3267033d4cdbe73d6a1defd810ceba6f78113660299bbf45312b86da7e4364998e4bad56c1c0db752a148d7792acf93b2478fd4ed3f7284c5569706a71429f701a1b7bffb50a69327650f7be53bebca23ed02412952101c708437b6371b410880b7ed49c94ad9e3f3ee9462545d0a44a4ecc1090162110a3b693c297b6cb54c37c393b28726cf5c3e22332079bee77016b58b77e68f3386cb2f8b5a6368d05b650f0accdbffa34314a48eaa4b9227aff3ce94227d39bb6b75cfeb75e3f195cdf3fd3785d52e1b5da6e915db865073125dfe113c7244a5c57e536c74b11d7852f6b069d160d9988c3aa67185e6831454b42f0de6035b16123c309b608d593bbacccc9799f9c60bdb572229e1c46519312f71997164f0917559092c1d5cb9e505646ebd12490924a8bc7ff559c44a120677cef98f93f3621e368ac5623bc0e6f7e470279114e89ccfc21577be146368eea0bd9c544660651651b73997a2dc39c5cc32770a752f9928cabd2343b993af60995f036ce43adf4826c932312b57e6985974e733953bbfeffb8cbecfc7f77d25c872bff7ef6b0cf7bbf2c4fdbeff2b55dcef4526f7fb571253dcef7b72b89f09bedc4f8926f77beffbf9fe4bd7751d0962b723c197db8d20cbed9efb7ebaf7d8b6badbcddddeb70d092a7743c28bbb8db9dbd7ef67fbd6adaf7d3f551341d1d53efb7eb49b9b397d69834bdfbf1f9a5dcfe2440ef0fab82d8f067047c965c71de5973e6a125a92314ea19d3b4e1b9ee809e5361129b8dd5fc7b85d0412b78bb0c1ed17ab94e0f6bfaa6871fb7b7c62b8fd3f8cc072fb818c18e3f613010111b74100c6ed67e1c810312b600c89e02285e005b7918e30e2f673d197eb4af79ba718b06c7da2ebd5b2a676e5338f6c30464398e4082860fe72196988125c26e286cb2f3fb0c5e517e1fb61560d1ec042cc1435a8220218bae0418c90098c30223a02c62ca408fb139793b8fc253033f38eef877dbca18205a63bcaa30e585181076af0c00e1e90c19428a840a18203a40f5871fd5fdf8f2b91852684550f295fa4f870f9757c3fcc8ae910e2072f427c71fd75ac4e19637c70fd73be1faf3a7a88122547d5e1c34d1023a85166b8fe38ac545222c1087e90d20412103b3884a0870e5441c31208607e7485737d3fee2284c05cf4e57210335c7e59b481cb2f7e3ffc310042053baeff8defc7ab95609094a86c7c3f6d4978e2f2572080e0800a2e3f08566a89423577703c00775c0d800341fcb0c5e5ff8045e444943ac3efa727bf3cc1e507bf1fae642041e172fdbdfe40c3f57fab63c4fc2760aefb5728315c7f0fbe1fb757eeb8f2e104599e2cb9fe1d7c3fee04c7871aae7f0d110a0a78ee782380d1c791e422bf3821e33a0f517828430402221b5cff574f0f22b8fe3e3f806ebe1fd7f164cc696243074d86b8feac7702c3f5179d1471fd5bdf8fbf7492b8d1a188ebee3a94b9feac1d94aebfcdf7e3af449214600cd1a0c5031dd0220a143cb1c20a182c60d2b5784d193b61f3c7d50d931aece440c4e567e9f0c2e5a791450b4ef660cdd5cd8c25645c7e16132bb8f8612d45354b7af8e10ebc602bb1584c871af79beb38d771ee98739dc7751f2f47c94586f94292a1e38e53689c36cc1d86b25c7ff7af1a00e2fa5b96064670fd3f86eb2f9ee07a0d33b8fe3d1b90e2fafbd830e5faffb80186eb0f44e4862cd7bf880fd79194d4e0fab3706409120e5ecc25abefc7894868020429d9433579482e434a68c872f953ac0e5e304318a8efc75960cc70e5bafd7e9cd5c494c105a7efc7e519289e7c7fc7558fcbfc1649861b2effc752228c947704c5e5ef9ae8c209bd70f937678289adb2daa41892b8fc9a0e0b78dc276ef51864b8fe19cbfb47f30ca1440a3eb1796cdb50b2a3f5c13b634f0f8fc3a6cb1c775c857199915e40bafc16061f2ebfb3a02083a6959062415c7eaed3d62e5140b9fe25f08ee9faff10e2465877b9236fdfb87c668ccbd3e74a4ba749a55e1522099120517d8aa268683e152241927ad54bd8fc7e5af487a45ef543562d1a06517dea87a8c2d4109af0434b432c8b1035c1748b489dfe1c494ed89e2d567e045428c2a2fc4903a43ad245ba53a954f86a57d38040768ced5f1af3f25fb4ac1c6258f9fdf3053248466430992d2fb8c2db92c5109213423bc8ec7994b5d62c913128ca10737bfa0cd704451939e8a1b9a466f45b223571e6d2dc3601a5f44fe04bfb0332c2e5f17bc81ea7cf9e650ffb59f62e7ba0defb917eafddec339405f964fabc0e943d585287fe58df5f05d61468427d8d82b366405ed61b43a5408e567e67b9b048507648f6e8715958923d2a922a4250ff3d12fbde8fd628887def8758d61054d8d3ae7e95fd940dabf073924d50d8153ecb0292e7dbc5924533d955f5deb466c69c41c392ffdfe363998d7c686a56aa148ac6e4237b48ca3a37e8a4949de4b6c249333040cc3c58eb69177777e59fd41f03544aa72f0f7dd832386f7367833a35d93567edee927e0d1e9c7653a636aaa093f6d8a8424a71c3a2856ecf2538d26efa9995524a5aa93b0f072f15e55833c7fe91bebb3b0547a6e018d2e6dadd7fccdcddbda98d2f35936d7778dbddfbc86855ab5acda877a95a46dd8956b59a51ef52b58cba9339994061fa7eea9b4e9956bf6a1975275acfd6967e82611d7179de194aa9e3aeb513ad6a35a3dea56a197527d433ad52cfba38a59e39a91a75275ad56a972e5573a255ad66d4bb542da3eee407e776aa711cd76d454444d5f3beaa64650ec5666c93728e9963a41792877be6c2698506973d0dd8a0232c265993c974ca64b76d9bd2e9fba97ffa4ea03deaf4e64efda5c9036636d8baf366b352ceadb52857b2a2c252112b6dbf1ffa564b35100fae3eeee492c38a959c974b9230b9cc10587b2b49403f68a6c445e939cd4a120b5d1a8e938ca4542aa5e29ee6f95e1a3dd8f3527d3ffeaaef04bebdf22a77ea8e7ff72fa95df956f24ca5764912a695190227bdd839c9b0c85fc1f9058b2c06bb7892305f2043e067a1cbaf4d32bc903afc745a3181de0ee718a9c35fa3899ddfaddc7d49651a5f9ceb408f5dfe2c1e40d775610b28ebdc97644bddfb30e7daf7f80065148ce77723b6eab1ab9fc503e0be37e9dacb7e159ad6dadddd739bb32d775dd823823e20485f3063937d49ad561a59a2269adc79a79726d5cb52a714823a05136e2a2571bb77de9160b678f1a24ad7e2e507119cc7794700977ec5e2044188701d0c0a3e903ea46082cb0e5cbeb8fd6296dbffeac2451432b86cbbb9e5c01ae97ce1125effda82105cbffe5afd401443d7fdb31a050a263aa068e2bad529ea582c1623824deecb9933b4cb2738f9d5f03ba54c2426162d5fb21c5d71fd7b7c7e3cd1c5f52327d75f05168aae1f55b9be8588eb4f6471fd092daeff242ada924405ca7589847483eb48494e5c7f5f028cb559b4e470f979069fb571f9e5175e0d3c42333c2cfba187d5973f250917a877fe055877be277970d8e5edf2f7704af65dabc09439b6b4245beaee1ea08ccae045a19048f8b96f900b91f4532295d36255897b1fce946259c6695cdb7a21543f7ba1edb5e74020229a935162a662143173ff3c00db75f63770fb8e3d065bfc9b3ff743fab7900b915411b27d3f12eefdc5281386397fbe207bd0dfde04470c51430e377b397db899d8aeec297843ea64bf655bd8023a795e0d2c7628e3c21650c771df620e6c71d80ac271db7b5bb83d12d9262e2cf7db7ff4bb49279ba6989ebf2113660a8392c0503fbd5ab4bd0f7733164bb2b548cc4ca6b0670381daa5820f917665cf812cb42bfb0f3c755b5816ca5eb4e166bc85ad20dbfbb7ea77ddf777614b7b5316b66a28647bff2df47efb21dd9b4224dc77bf71614bfb8f7bd30fd9fe0b917cbfbd29445245c8f7db233179d96bd99bb2f7b64cc26033e6d3c3222d6ae6b89881f59f53548dba70a5d1735cd7be827fd6ce711ce75f5fca706c8176fe59f69d7716a47b9f962dfaf5d2e6160de5ada0b4ef58486bfddd699ce5dfa1502105fb6660cb04d467cf2dfbfd345f03b682f4d37ccb8643fa695a43bee6190552609e51c0ea6784b25d353493257564eaa53da1b2a22ef31fbd28b6459fafbcf597740f4a58c7203b6cbbeef5b910097ffd8dbf3e927ead6a1ab76ddacf2f08c3b4df381f967569c992f802e2ba06c9d8512e1589802fcd0f4848687bed85b8afdf01759f8112463950857695019f5856689760fd3503e3651115b4fa30eee64f07aa7f648b2d2df976b1dae5ffea1f600f10cbc6c08e722902459662931d07ed3baf830d58be41b2ef1f42bf3258dba5699aa64932b34ac78024307f322e51f630ddf92632b2474fdd6103107a4edcf9d60576e37e7e4fff7822cdd3fd64895d583497c2881a8f593a89413a2d49296552f3582b75e6fb708e242b5b40dcb7866c6f93e38495608bdd62f34831645e3e7e0839c93077ced92c4f49bc337a272ebce35bee7c66e6ef7db8c57675f6f4e50724545f134a12f397df0224ccdf874f5c64d3e912e6609298d8ae79523a25b188238b953f9e926ef3264627715a40f4bb36083eb19379bed0491cfe1fdccb17c2bdfc7e19065569b971616b4b02ab1c3333739725c0dc0e8d96b88c76c7eaa36acfb8328f259848c1cdc0d8d695484c60f9818928da0b2cea4a242698183121745950c61dd384abb67a7603643a8ccdb4d0c26e57645ea6a85d6c2645455a620925d4e707332192626d84e062603f275a1138743dd87a25d21234d025ac7625d212b1323e25fc4041496933aab6b28c5e5ac6a9eaaa7ab655edaa7a2c82b10116189b33592c99418017a8d03841cd1117963db304139a1c2ce560cc0c7ba6ca92d50c546ace48d180ca4c12cd192729180eaeacce281942c55466ca38b1305c4999d9a2c909658512d3186b464b0e9f9593990ff8e01140a88cc90c0f39743080f9aa990dd8c0c5883c33376c630c7533a83158e1b458a2955161656cac29986449558b127a26a695c0063f53940dd1b031c0d0fafae1866a1966664c6d32345f3d4c0019886add5ecc5bca18baccfcbf85b512208658bbe4ad72a2f83d49d3b88c7abf5e3c7a7cd02b91b01455237106a7da017db92c76f5aeb8d9a609fbdad7d108ceed095f3c546053543427d6e6ca2d2e50d229d9eeca2d2e88216b815591d9c2b0fe8536c6725a6844d82c4c56c69a4e5045606992a858ecaa035c0aba201aa20b1a6a18f61b838362bf187431581a30f48a651955315655656bc29a8018c36e4e382a2c65c2010d6444b65eb9858b17b2261645a69ab1d9955bc4c0e08eb54eb1dc955bc42cd5c0bad1095888da256fb68138ecf22a8bfd4a2425a2a8f588eeeeb6ddf3c4d2344a29a56cb1db3f1c7777af9b764f2fdc66adac4de332f76e94524ae9757777378bed99f8d4deddedee3edddd7ab359af7df61e7606fa777b4b546b06ddb4777a384114ea4eee93bb89d24cdc50345ce5c54e9a699ecc64cdc2b187ba56bd4df670dc44b9ee8e005cf9a0e479fdcbe6bada799ad376dade97d1d7c96fbce912063b9f693b6db72846491edb2efe2ab2ad5fc354d2354a32659af9c77e0fbb93d47982f2b365263529dd59d75d3eab524a69d5a4952ef9eebe4329a5549b9488c9ed34d3eac675de673a59544ae5ad56df0f952fe5cbb72bad48045430c2420b4782666cf592e665cdcb192f5b2f7fca1a2f3b78e9c1cb7f09be94345efebce27af9d3887770bcfc79c43b395ee6bcfcc98577745eea7819c2cb1b2f5f2fff070a40bcc37a2982f022bcfcf12f8f117600f0025f8ae2df006fbe480820eb26023ac0154b051dd01ac9013d167280b5051ce20df1884bbc21de00e1e7db001d049c507e007a2cb24d589fe021451b9b1fe04b8a3c5008c19c1710088a394276409674d93c00409188fd7025451b1b15aed3f020b452b431d201e8b15003ac346c5ab8b17949c3e6480b9452b4a1e1d786463806b154df4f871d68612320453ae652a21ab0484a0c141a300529d2477d407c09242245fa368c141ee00fe9a23f02a804c4c1501101ec912efa3b40295da60fc81515c8e3fb80d89e97c703051498d3bd802c287239426ee36c221113f8db07de48917eedd76e22d081ab8ca5c2eda72b231be879d7f65ab8f548364360540d3a89c352ae2c9a4bccb55acb62fd8be2f8eab9de4fa32ea9fb71163517a954ac95715eb9754ce5984b67e92c9d594a98db3f4d2f640a4724647ce138c540b9ed85e39412660ab940861403451e5d8a85a670fba74869775814e55457ab9bc93c5ebb34a09b855c476bed6ac655b0ebe96171fadce64f12b2f0d27f51b067084b7f7c9dc0a3e7fb09a79c5e2a40c24c216b489f39033b852cf0a062bff7fef4f6ab0841bde94d6150955610d39f5e88897e902914627a1b0699425468fad1c224ecf4bd698857fbcc99ebd33c1e8eacad9f33bd7da1d3a366e5efa77e57ebbc403ac08186a3eb1f7680030d5aae7fd76559969d42efebf749603e5d5f1e9804f681a6ff5e88e9bfe7fe3bbd1706a1b8201bca369daa17b6b820d9402d2e6c05f9de7b21df7b4155b85088f7a630c8fba0fadf2781f9b4b3c830fe1e58069b5f029ce34e4bd5dceb806e7d0e1cedf47e03dfc8eb6a5e28790c694fdf5f5cf6465e7433fab81f7b7e645da0cbfdfceafdf438fa9502413ebc69f75ec10fb82eccf00bdb67ce7018cea11adef963367ff407dc2d09163193df7f76ccb3636fa670b3a0065be05bc1cc636099e538dbcf378233bdbbd514ee96e4ca9dbf65147097610a09b295862d054858125812d88d2eac2082491885d1506cd774ef691e6a3467232d95b9537e716766c5873bcaa322a416b460e82e8d6928ba73c6b0a378272cd64f3a493f4884620323180d5bf3fb0b1332b02009c60e3a2c81b9e03581d1974137586034acc22fdf853907f064cb174b482859db65c9498d2155710377c5aeae445a82618c2cc86459ace94aa42cb488624f572265510516b6bb12298b249f127ea0a0a4c5ea062759c690f9410b983143445accb0c50a25455330d942e5e868a904373c61f4aa82081b8eae54f164c9134b55dca0e4a80c156670d052860a316a4032a202063520c5a858aa618b11156086908aa8501aca52440513391c11bd78f4f8e820879a99d1a2868e072d62340596b3c10602ab819115613f2d341258d4149b17cb21716424518fac76845683942b2dd041062d9081e660cb5219472c85a165494c16463e25fc40414c9628ba6e73ffc9ddcdccccccddddccccccccedee1a8b99997a6566e6aedcddcccccc939999697898dcbeb1d3ac669ca639ed6ed6d3eefecc471aedc8bad18d73ae6bcb7a1f16bde33ceea6ded43dee9bddd49bfac799a4b78f121813d771261fa93367f040439d27cd28cf4ccb786a4126cc65d89342960199338745f97ebb93d3c780d39f6e659f4623f2a8c5435247febc347726b1d095610557f6c4d39a4c3ca589d2300803300f2bd2c924650d1e3e666f25a5ec971d2661bbbba39452ca9ae3b4f28c56932ea5a4610e09ec7c6943897677f728c3f4f0d497527677b79653b38d76dba842c9f6b7c44e1b4a9ec7392598ddf2546b18840198890658a4bf117974250db3eed6b8865b53ca227712dd5833bb698fe1a555865addb8ce0b47161198dbe194ec7d9866ba3f75cfc111bcfe5dd6e32948db5d7bedeedf3481a77ea734a7736ae38beda72c164fdf8f6ceb757f2c4a9d18ecfc946ab5a2a9a95247fec93426b92d212798f6dc1de79da28541188065a16da2890f4d7c68d24427d624a9939a2479497a2f491f48aab09a2727e79d6e725a1d31b96b9c8baedf2ea3f1eab6a2dbb671aaac79523079d35df95bf3f0c15772329d1eb249a43da99d8722f2bcef277bef4b8177bc04e6a95cbe68efe4f28f245cf93ed827009284b9438fa615d1b69048ce998cf98f34cf94b2c32461f62043e047a24c114fa40eff0ef563818c85c921f30c6c0be591db4280d4dba6e631c1240a2cf26fdf0f1639c97e2f51144b60d1c78355def11a588782c9e736c661f19b8783c9ef541bacc81281b1343a506cfff7d3451d4d11d15f71124d22a953c349f3d4c04e262975a66a0b5b9d65afb8e2a900071f617c10238c0c4c58dca0ca42878f938c3cb8a38745d1fd2a1662ac7aeee8ddae638115b723c38621428c7b575b5ded8aab7d15e36a2be8a282272c2f8474082306cbac14571c9960053e58005c11039d8115568c613b1f5eb437189af209199c7851831b50312207499a1c49a1c2490e464aacc0d899c59c74d9893397e5182358cd233a4b7418e3e8beb9fdde5fc1e070fb2d0b4c1229c072fb8558bd508074190535b8fcac67518b67c5133056d0e028e775c7d5172192be78516d66830ae5ca268223b62f4370526c26a56b42c5136d888a26433728a142063a86ddc8e898d8cc063dd88c8c0ed9076c1d534760b5166c536ccacb46c3139c98253224cb5d893485084c4004f7812984a85fa68092651bf5669f127ea030e38adfc27bf584a1641bd37161432db2c2a10007ed4abba4141b285a42820702087165ca0d0490429443ac091874086228064da2944162220b25415c79f1e8f131e38a4f755175426c9183a22d68c085b1f6ca2d5b6c41a5b0a72bb76cf1a504d6bb72cb1649516c3182ed882da66c506ccd955bb660a23db1ab2bb7685146ed99e2c9e519573c15d32511094955d7ad54cc9c4231db6e53777f5ec731f3c662e6aa3187dd3fda25954277cf989929337b873deececccccccc5c2b8bc5ccccccbc52a56870e0a09bdcab76aaa2592ad3509aadb47d361a9bb4d17026a73e4a5782e1baaff33ceaed7ddd67e2a8b7e9b49d6cb5280d95ca7e7c8f51843be2b89ccd951ff20e2c76569b5251d5caa9f78aa669a4924cea09a1bca8344c19ca8a54324422000000001316002020100e8844429128c9635dcdde1400116c94386c56301b4ab328495114838c31c60002002106100380310c1551078a10948e0f99444829cd742afad15fe80b2aa10f01ce4454299dbbdbe806469d6f0b0a81752d89c8dfde2dec4c564189e3c72a048dc0a5a89e4982b0608677d9a18178cd136965fafd769a82efbc0f6077e7a5d1420b656b596d5c84a7e490da23569e0a44e87ef47bce6fe1ebe3e8f44399a4cc9c165ef184acafeeeb1593af250d6a9191f580f4b2fd4ff72d8777b091e0cd1bc4f8656884512c3e2e587419b1e6fc2ed81b2a4feec1d83b490f7aa19bacd9d92c871b7727f53c1e9da3a300f7247574b4c5e21ee2bc6c4d13dd64bd914dac7b890e8c1e990a06b72ee42809780b820296f81c4d41b24a1767b58512c11fb1414322829a3c7caecd1ba07fda2acf6ad964c081ee7449b1f6797cdf9dc62adc73c3a17648ce2d47f238c28964ca0c0dca484999a911bab8135ed93de83d640edd51ec21f2fd81eab0116d5e7394500323daa4fabfefd11bf521a50c87ea3ef28343c12e58e026e7b1c9b5d314203aeb30ab47fd238c5f9efdd73e124f2db56a6bc11a96aa755b2a47245daa9828a19f59d3d6b1a18aa9dbb56608fdce5d4fdaea8eb71b0085f43c5f6931473f8d4b16498a43158be508cbb38161cbe7ad58f0f2403f9dd32c100e9e554d4f55da2ae052785e1b940d95f4b8a8db75e7c3721ad39fbffc6a986c07ac8790f726e817535221e7a19c6722b047fc91ea7328b11e32b936234e0f728e4be1634edc4aff75bb93df6ca4801a7e59db88624ff0053460e7ac53eeb7a239e04946d92f17f02787fee04d596ec642bff49193d8b3ecca8e2b586d3f61fef712db3cd5bc6fbc521f7c9d15843fe5a585faee97ac9e5c02d6a55317e2954706e1c7b5b6413de499cc8ca665786e5e48212f315fc824e5e0bd1ca9e7f1cc6caf84473873c7610b4b8d9cec45198ed011e05f5a13392ef3615b699de33ba7dffdbf8e236705b67022ad77be12ac27c608d21e80d09e41bba957d4bb39965038c202495a7124d42ce8bac451a74258a0327b13c9462470bd0bf75f7863260f396350a03d3e800993cc33f8952803df9660d87aabce274a6ac3034da1e05ddd366ab0fdb7111aee013df75ca43777f764678653ea342934f979339615d7bb5b3c4946627aaffbb5e64ea75abbf6f47460474d52fbe3f45af3cda78f4d9e8be85e3a0b299057c6334bd3d83b9cf1b4e09cedaf92feb60db795292cebe293850ad2e3a39328ca1ce1105905c6ddbd7815b3e27a08404befa98f95175499fbdefcaff7a70b26dce835fe55d6bb2352b3f55ff77e2d609462708b56451953afad8e60cbe205368acce28ad13153f2a6a05fff21b969433cfcc3e6202f4625ccdf9b57f275bf38d1ca425eabfb92ce228a87e709197d259d73fe80c4c0f7ca78c486e50c14f9fc1bd8a1ae2e6afbfd8009f2f6e16611f5d8a1998d4de4c7b9933d780575a64e36b51c712896e3da5793038cb96a82c43fef70a1e6d60363d282881bc157f789fbe76903b987dec8773dfcf2f7dfae12f0b6998f1688e20d786f34540d203c9e5e707d05a1f6bd5c40943970e6b10c75ac0476ed23a219a2dbcfa876f1411e505f706571a83751cd5bf2f9d9de4534fdda40cd30533aab1466034073fabe645c296d07c28bffcb10fff1acac391ec0f01e92ebd2f4e350f0d3ff88e504186ae00e19d66a0ae70772cb05cd543e01813a48262a2c10e8d577e718934e25c520b99237c2569d38d626e75e183e57bf0b0e102ae25b8430b6ba0ea7a43fbae827c37257fb5199644b3dcce83b4bd8102ea3b51282ff23152fdd53606a19d1e946ecafca4f608d0fda44d09828b9914badf764ba6786056201c52f2f2ca30317dd0262e09c646d934120e9418b51d07fc0182bb0949c55f40f45b46e2cfe0e5ab7fa355335ad340291d8dd5e35ea4324e421639e1ccc8d808a1c7fe78a77ed954e09b00df0d544bd6fad9171f08b2690ccf482e667e043ea87e97605b41d4246ae987960881bbc9ec38d4ba23d91241b0e1f24c2250fbca0096db6f5455b9161e0e9182dfc9609fb22f10758ea832761054d3174481087e94308d93397798a870c4cbbce58af2d75329398ae2e5968d4c46c1e9288800846ace2f1db199857803730a92b07b607996c4f7300e518b5ea70c3e4f9584af549ba431050fdf1365510814695d2e011748d28e8d785c4393b5c1424568c8200e474202963f395fb2c97d0b425079ad8ea5260e8ff515a468e1630242dd272fdc8f33ea0db2e2ece0632c063e1d16d46b86028d95f0895573483a81a5dd245294049d61d160952e7f120cbdea7d2ef32023b47a15b5297d5ed22eab258379e23748720ab1f4925d7ba7f3bba4b0ba8a535bcbf7b4e45701656491edf92af0df23216bb7b11ba27ca792d7467d8a48545b997677c017076a899a72fe32846a4c57fe463bc34da69423c8734bc9709d21cd6752d61306185ba24ad625a64f91edeae2605b4d31ffdab7dfbb7578c0d2028ee8f4ac3acf7e69d2e4427b612287bda1d25724b5c7d7b6f31573d17500ec3cbc89b3ca0732752bb1b50c96386a1c1b5c92a72e90a802733d19cb700b0ce9c55157adb29d0614eebfd9d100eb048a506553a05823a24c996d5e26f920431f49f4ecc4623f933d673d63b06ca7fd7f2f40bde05e0a13d13261fa0a5cef00b30281f37c6ffde2b7423b71f8e0a35fa6b7d191f7da2a1eb10b7d5949b6d8cd575e08890759cd7d3fd921ae5ee618373078f521e13ef9b3a4e18a4ebd04d0baf3bd25463227969476fcd3b1f569ebb9d6ef28b67721406eea3b9ead0083f7413ce3aac2abb5e1c4307ac7037aeddb1169c90f9406dc79acb17e9ad26da99f7009ec8bf0e39bb0ccf36d9ce7c0e0126d2037a7301d0d01fac6db10a3ab5e41bd89b4c282a199bc69dbb8c777707c85d7c152a68358ea103c83ce639189c10f63f103431fe3a1c9a68fe3b189c78f63b349c10ee3f109818f73e1c9a68fb1d4ccdf7f575384558b2e7cb72f2f57536e996b7dcd0f8701cc753290bf3c568e1d7d55a1505093f96423fbb2adbf7b784ab8227b1fbd5bb43794e894065bf48cf5568ad7e6d68ef7891e370412bb652deee5ab5b8fe082c3b8a5ca11576ddcce4a76cdca75896702ac5399a28ff760fa3bad7d4ef82bf40b943e042885d20d4dbd19e1d759c9c4ea42ba059756b9e2b23889e822b1d28d957d294fd5737ee6a93c149d90465de92c951ae8b214d12b8718b4caaf886b5aec2cf468f93becda1c32bbd10f25df36f2f96eaf68fd95c8185060df0061979d95be170f71e68ae5bc50b036d1455087ec2817c1d8a856e788ce06ce07d034ed2343185c7074265aac0b48212dbfa067b71f3892ce6c21230b734786a64dac93f4e6cf382078dc5efce7ca59eb12346b502b0b5b20334991b6f7a4def7ec1ec4e29a027e50dda8a99c70217d16d6442f1d7486fa003e9c48331a962c76bb8f50f5210a5907ecbfe72d6e8d9a0e1a80f0e30ea3590a23f8197197a3a60142cb88e3cec3c4bb60966f4e7ca5ef75d8f820e7c9b663cc3f35780e790ce50af06a16d210b2beded0c4a042b226488cc1410268ea804d0196282e3464beda208a42d3036630b5f960a952989c360ee8b76cb82b48af1507822873f50738e28ec301e6cca3f0b43606ff7b621ba4debef83158354b77bd767c99848cf079f835f9faa12409f56c0e7f8c1d29feb0de0cfaeb90a8c6b42814fa21b1536833d2e3f1484d4af80af703c09922e427dcf10c6472ef74e7aef7c17a349539b91bf86163fc5104a6f684d5038ff880a6ac3dacd398a8080dbc4d3191a31e5df57252bd4c69581a11e6a72dde3fd9557995be88f9c996801d6dd2a6d068eeb23757c46cf91f42dc62203bf8bd782a30bdad5e7f93a50b7d7b8b7df66887dcd02f81e8f3debffba76ab67f5e78f181bdf24e7c41df662a48c839e7be7c348754806ba4db59e0b122be1a8a5f74d0e4263c1f765d6af84f96d0df4002ba43a84210b973c612c2846460702f895d091b314e35de0240ebec12ca2ab2a8d212112c755e48ab1812af50ff9c9ca6649d229b30cf68249b694bea19483d048b82bb7ac310206c826aaeb09fac194801690b33a10bac8e56c298aa9a36c67f4bc022c2caac4e88f818ac663585bbe46dbd120b7c01f57241bd946aaa53298600fba73264c3682ebab9985fcfb566d3a6bdb260e230ccf7f656b770bc07cfb7f742abf8a86cd768b6c95f4618474f923524038fc7d6890b2f43dfba0a656cdcbfca0f9f05e5d711d8158423f118084e4a56ff47c19f10438e2972aa2b70dd479f336b33d6c8525da9ff283a8481f40020116647d1908bb4d067a0c5f404f9034e73c4dcc54bbaaba4020b4c147752ba45b4bcf206dabb5fa450aa0efd30fc359c0e1640d8de18d22b5e1d2c9d147b09a212e21ba40b5055a495725619b77bce0e6b434ea9c6406c19eb868c1cec9ca318ebd5167bdc174d7c304751a40dac30bd960890e88022b021d9d2b06c92b1005adf00f6b3b2f226e8478afc23780dc58e754c62b5c613ff6311f30cda76a7a90dece5b0ee25e5195b6fed37e3154fbe48efc228dd23a0003ceb542f6f904c782b0a0bc0882138733207af1da8313ba6ea84c95ddb555afd55b05fd5f9aa3cd50df4eff586f8b3bff3acad164c119280bcd5545aa43c4cf7ed2b3e586f14a6647c07d4357a5b3c278ef53782359e3864ec7a344b022930a6c9ed9b64e11ab33d53e02b18af8cd5c4740a27c52e0cd5bdd0eaa28e8f1bf1fc251afaa289f5ec9755b8469201ec9be6104e656f15910e241501e26fc3b2256ba046bc758b518111f0430bd785054104cdc042ade4d4be2e9ae5548846f2f8108075c720cf655d2bb9ac39122f6fb154295ccd71c134d2c400cda5880b1001bfbe3462ab79a45b915f41559e06454926d86379e00da4e58b66e322a69a000c5cf21bd8bbe5578d916e97dfb95576100bf05fa4cdb842326e84ef6d06c56918973e8e677ce56f642406350db6d8ec23170004aad47c9b851af59b13d6d814f0685a957404f210e052cd0d47d1df90a8806bc7a513de0cd773244b767e0887022ed970250dd39dd9dc999db24f790c356771f693a25d0dfac859ed5f3f3760bf3b6d8fad470fa00589b3df48dd151596c33dd85d69c8e97327805612885234da228cd261fc5b1c24597c23db23bc22c70932b52290da20240777d99db7a6cee49791c8434e0e8001d6b30afa191a889982e7a4822ae33ecabbbb7200625cbb95076cd8334bf68417a06a22fb4a58d89da8a7d5c3315ba1e522ff3da3282bb9e3759e8c8ed3191574950d2bf07db12d270783671ed7456bc0f1c06ff6fafb612e191140d7082a8f9089762f682bf450844522f86bad2fdd51b0c17a8a4211554a5e43ac5b3132678ea11c146cf367265e8beb3e2d083a3b1a48b4e04189839ce5b64f1bd9c88ee443a8b3589731396595095f2c452e997462d0b9a466d37c691ad10d76a670108b7d1c07327bef5c622823bbc1d1b73c1ba1bad6b572ec17c855344d22ad3a85a460e22b2b6deb21575f78104cca8803e56c902e5ebdd468ac78d98bc9a9ce81afec0fdd29cea0602ba929b51a71ab0eea0c64b581598a79869b71fe68ec52d755648abb41150429555e1d629a721956b92dc039babe5adbf4a017790187c33866c23993697206a0fa379dc74aec75527c064df90a1a47538edb7b7b30cd71a0f4d56a70031c3c4b18960c437caf37bc215eb4e29d50cc25f94cea819ece3029455e976b025e3a2a232bc0b1992cfa55da0c199bc0158244812f0a056ece5c68897e9d3f8c4ba9bb189d8b75253c391ad743394bd7b72cfbb192a7425e55084e8f1548b423763790320b2d5d97c9e6c49fb9ad6cc08838218e92f212a3551a6c6f82bce6e06c85c9f67419bceb4c9fb0a7d45c9a844d214dd0ced6aa46d79e666ec3e59fa9e101a76b130e6b7601a9012ff328569b4eb507257778afb8be71e047fe84e5b7b30f8d0ed339136721559e3d39e9fc3eea13b5d3885b1b32fdac5c34a4ef82e85dd781567ebe1d4881c42f0bdba0f689edae266a27ed4502ab45052d66228e949a88dd9a7be4f1a8fd37e214069fc3ee9cdcdec3270b09950b83b6322ca902fee9026adbbb438b06231b18706f15fdf381d62fa99adb7d343fc5d05d1e54e8f72dce4dd69dac34bbbba08357973cf8f7174f6ae115cc0f19aa71980f3f37f7a853710b734a604a5b95c46b5b566e23715e8cee4fa2a79aa885fe37cc49e10be1377b11ff14b262caa3f0cd4a00158e8f8dcc4075aa938b504adec8b1edd40c83dd235b3e25dbec0719b1e43de99cde45070f25df227b884c9556516229879b3186716825774f9aba286e512d85c9d71f436fa34c5613c1e234af4dd8981d2946fadb9691ac8d0f7230f84053f6f5c01ab428e53b0c4609ea5cae1f4db9d7f7bf8f2084de31cf0cfcb816c0c88c2a4a4dd7dfee110c6f0f2e9878ede6a72c026f59ea33ab3e097eebede272d12b7e0cdd0ee6e0e406ff75322a66ac028846b0442f4839ba0da68e8dc52d2057d38f254f5d6ff607645db5a2cdd8e65cb886c406ceb5b1b9074d08ab9516d8b355f69ba03b56d2b7e2516df626c6b9cf29dc5cdf800d728434ddb0a160898367e69ac004c9cfa3bb0e80b4e3226d149a94485c7e024217c29c7f1fd66342055388959721286adf5a5eabaf8a9a10d2dc938e9f6d929d54acd491d9b4b7f44a2fba04593ea07bc4dd073177601dac8da4b3a123a3f099c2ab150f8984c7fd3e14def293ec9f745079900cf201943515248612fad0f4e5d17e0c554ba23630ae261220eba6999fe8fdda4e1bfbfcceb86bfa4f700328a009ba51a0156663865627ca887490839fe833c0ecc2b6b2443100cd17efb7ffbefe6ef6e4a0db8af96a3e1988abff5fde69febbfe9a5e7f0194e2631ec8fbbcca5cac85b89ca974c0400c549f8649ce4ee1e18bf41421227f93058aa140ddcefe69d1aa58125877762a0ffbe3df8b10d63906d57312c9bc5049954007e056256769e8cd1df27a50ce44669d007a0fb3adb9ec7d24aace0ae73cd09af13076f8eb10206e79b4d5e8adc01d02019152151a8e775871992b5937175a6b3597a9e9ec38d8aa943f36fdc16149489bcfa8fc1695ad19b7430a0d91b36d0640f0081026f3cfeccd7c7be2858391c1b1aecccff80aedf080aa891c55dae8c409a37dc6ee84031d8b7b83e5eab37fa91b090566cdcf64dc9a637a99404ff2fddd260ad45c3ce1abb654dd872220f83aa2e0d9d5ae796d96ccba53c0dd237860dea9b001864a0944928260b2868703ecd7c3a19fe31bdaf32b2f979b4610a27c220b071c2b1a4a294b3315b851834e1b026e33a49d08bc06fd3a40175135687b08ff5315d7aa573283147f5d306b5c602a81db46fe4b13a8cdb1c8038b740b5554b0c6900bba9e0b73c0e794372e2399e244f7a939685310294f657a2e0bfdec032c13256ec147d644bc1d6d54da178955a5fd13eb3a1db179882765a5ccaa2bed860cc48e69c58e430fb1c38f7f1a56124be60f403c26d64d7b6c60ddf76b65cdf2c58021c1a9727f0243eeb2a5b3788c9bb4c1929214a6bc7055d087577602aa8d4ce05ddc78a0a64cfb372516a1f73dbefaa0889387b02320149729ee3936e13de4e5c54c76d3c571f61a402085537774213450796e4f5335dead38038cfe4227b2ba14b674444077a4027cc7b397d684c0843dff20c96aa268ba34a30749c8ea0c6326cdab3ef5f4ff5a2ef5be4124467ed7fe27dc9d6813ea0637f1f2ab81558554b70aa0fc974a7a60d7656e673894b551bf6964f1ff14beeb87f6a631af9cc84b90c59be1030b4d0fd7a859056ca2bfd818a24b773ed728a36245e997abd42dc0067440680b38e7d88376fbec5b389803f0e85f8ffadc7d19e51604ccac90a3046f4fb36e97ca61a27071d3c2a11591f1a1d20c7ae4f766f8b4f09827adfafdaee869291ddf769db1cc67e518c0f72fab3f0c6822d4436720a10cddb93299fe7948e905216aa08925f31f882ab759c3a9f84b64f07e5fd721d139f86bdf442e02f504e9bc5e2fec1a2aeae14931f1bcf5ccc86db4aff9057c7ebc990310fbcb45b51a94fbc3a6451471f405c214f1316b03d4ee372115704e473ac3a7b74b95e909388ccc2e0938bd32dd1be506e1c9e9fae391755a1632dd8d6ec31827ed10a8379b1257b4600d2d28602bfab3a66d0220ddbd60ff953f1d562641ae5146110b8d8722e442967513bca4ef8f7217910cbc333408f8769a8b79caa87111fd62ce34d2cec9842f4ca6a1eb41c80347344237d555aca73d6775d3dd7fb1b508c404d528f8e335ea6675580c4062451a6435eaab6ab66829e5e9882f76d2e503d02c0745a6dca87bfe203bf291b2efb93ba5eaca7054b56e2196ed91b5985e6b4a19a26d3393338e13915ee6b3b5b2df21d58291fa504aa1554b370dec6d9d2d2de931539852890f4764bc3264569afa9d8676a9c94d7b370e537a3e699807868c50f52c87245e5e4621125714989de6d97f702b342bfbb0c9eb2559d45f5fff04470a81780bd93cb6e5b609c1de50cbd04c3b51eadf8094d357b8b3ee16d4cbe53e19eb6b354a3df8395f251246023627a0e28f36467ec4b3d28cca2b90a1ba064d29c25b32d39edc28cdc7093831ad1654c8e55a1bee6b3725b07f4ae1dd74d484d4311d3f048dc6caa36df9c10a3c6344c9bac7f0e761b2fce90e18a2c04543810fc964936cb96384201dd82688e137a519df9fdaaa413cda4af51ec3f0c182df3881f424e20b2f6906f2e17e549290d464841e0097244e9ec3518b61504f96516c006b31ba3a79ee10aed9a4c18a940863ca3edc3843f778855077daa7dfab9b8d33b81eec41857265f996c07b43b5fc8357e660c55a04083a7aab9f94b98c674918a8ad4b41592f51ccbf0740add052e8ea66ed2b426c230b16c0365c8010bb1ade97edeb6bdcbfb6a58232d69865ee021db1d51804849606fbc58309e7c5aa6d04e19f3cb50085e92f954000623a5227a84bc2d9631fb2c44eefcdc4ea189b92b75350b3544f3c65be691a0738443b81ed17fe40af5ef69609731a4f3f3ed2627e9c10a4eb908b31973dcd5fc01615d37d7a9f610939c32b02ae044e9dc53404db23cbd13371fca616ef9d9f49bb3027cf4427626ad6ca6de586b69902361fc62a2c54727031e5be76b82d9ae86f905c7498a7b8eadd9ad30fbc2413c4c10cc62f79e967d2d246ca9e8cb6b1e1d9c596594e169abe884d1139d5f833c291e23252a804e59268cda3aa4dd998d1e57f1e031080d2473cc8c2cf50ccc917e574396c7f402849043d0dc1a9d4c3ca4d3209d1f33e2254408164c91f189516b71be5edc3cc64d39e39d35c5d989e9c17d8af7c7f9b406a9446cf4c349294e251a4ce55b166b283fa8784a91109dd24ad88beb40ff21312c653d8e2b114ca2d3f58e7b1e056c7fed90f64b5c35d5b935bbf37b4e9dfcc5f00c316631b36d93262a2342783007ebe6063e7d4e0c4c59782b5c1457266d04c35bf695ea675b32431e01343267a4d28002cc82755b9a19b2b0cd7461843c23e968ca0d70b6f18b35e217f1366e7e9991dcf03603f4c87f4199943f3711f5edf3e8e6850bad2825d6c9cd6e84c24432a08dfc0109bfa62c062b1c983c036d60bfe548c79df0227c982c158ced7562532dca672c859c417f2769543bdbac8fb06e8f891217d14424e24d4660c044e932a0268ed8f01e357038445af89e0c073cd48861f756ace4983653a5f48b1a2074572d298ed6e86f2b04a3181c9bf856c5c94fba9fce17cf1050b6b14577f75b400973622a150208a602c0254f052a5ee036ae0d0a07717450beab0f45c3d9715f6f4879beda465ddfdee5866f92f43ef51ad4638e1758dfe22149f99ab8ec3f9924ed4fa75f325d0b49925e2706b32ae224c908a1a55092e2a1b80e6c98529821272597624fa093492b469e4c8cc68e256731a38d269d12e929e423b8329a5279155716563b20eaae460af04ca89da0ffd2a40a8d3ee1952615287f838b5a26df996cb28da38c36ff104e06940b5b9b3811cb7a9f7b5362a7fce6a0f4a1326059778b24759de1c4c09de8751114caa174a7e5cb80297cbcd70985fec6c0a427a13b1953e49e482eea00d91c5e88a3a4649d56a5c8a83ba36fdec8b24d5cd07f5dba71a3f361169c76d16812fdbdc8ca66590da513115699671830f3ddc5618ea6eb7dc14d45e6a69ad24ddddc4dc9c43b5b1d8cecbd33088cb97df27863eeb3b484831c731099a3cd659e0a32586374704144bb84bee6e3643f2e5863dc69da54668b616698e3b11e181d2d4e702d91123bc5ba5aa98bf79f360a8ea95cc70d216719a37cd35741da68320ad40e03a5aa8d61647d4589062666c683d27d62988c6f77049f4e05d1a89b5356da22846b9be0042452052d25b301e48faee46794576faed8acba8a95c11b4873a451d4adba7526e8cdd5a4a5609deaacf83c6f379d53eaaeb8145f203458ff50a4404692ca85cb85eac49b028fa83a568014d15905fc1980f014f9e242d98449974fcf8e02b8572df55903af94fe9c0def31e1924b858ebb49292ced2a2c73f576c8e9a0f1481a3eaab4185e0251dd2254879a30a52bb373dc743ad0852ae93e573c3a264c4f794f073dadb13ed9d31175040e10bfd26997ddeaaf4411647bb49d2527050ddea00a4c1d4244fe36274e1972e289f10ba7c4aed8d7534d30cc2fce7c3532224894d4e3be91add9b89c5fa1b546bd41e066370fede5bf3737172f1e57ed059eea51d2d14d133637e3e9331510c8676d7ae66609c34121c8084ce820ca462032ce8680979bab5c35263c5ed1d9ee59039dd08d7b3c92f3341ac23006399f277ac65947abe6911b0009034742e2246613254cd14d1459f31f57ae80183c963e6ec2e6f522687f28146a0048fe383b52bdc40ff73011c7c8b6e3fc79b30b27a13396681d02bb813568f4362e26c3fe3ab5ae47c0a5f49d404be790f254bc67530ac2b01095f2d100f80ccf86b4b0739131e3c98a1d8c505272469ddd5abf0b85673bb6723dd255b4119e1f74dc5a18eb07cba9205ccee00a2c03d9845fbc081175166f140de594686cad2ab3755d386073f23ab6240db12801c0b22524eec7ba3a53780cdec306a775964377de465b025bc2a696a7ece334ca51d580aee78af9126a2424319330e4a7001e7b738d901725fd05852eb968e2dd34419cb2c762b02849f2a300791eac804544ae2776216ec1ca9466542147f2ce44bc210f0a937e6291968c0dc932b7f141113ae48b5b69c57fdb42ade8e47d8daa10943d21199ed7b272c9ed247a9234000e2a168047c2140b91c6ac6fa0bd7a5ec42b91481e0817e4f54c9a438c4f52a93a34b5491472acbe1ee056b91b940ad2ecbe7707aae3d33c31ebd749507132e47b0d19600b4407365be9a501fbb40989b3d1487407e92c5fd651cbcc8505277afba17d0911c3ad30e10037bbd1630761763245f55ea9f941f638f58be807bcbe075c2cbac2a56023a2beb680ef03306076e66b63539015a687df70b66d4325aa8a3accf944b39cf4508a61b14c715e4c915d4c34296742548449d87c039640ab5e7a6f2faedfe87bb5aa56b6da15f1df02eb76217ef27e88607aacaf5e52bf4b344ca15ff17d5f87d44117afbecf4510eee9938efd5246792ebb9c9d905aeef03006882342b3253b0665b47848b406d68e81be36dc7e84029e78402544a90424e6bc72c24f0f38d52f5f0a8a9762764e58e3fde0801bc5ded1c915b421c6798fd74fd07a83d6340b58fe1f6c82675890cf5fe30971ef98c070b7abfc7e9acef646d26c798b38cd222064a3725b134466f68f033a992640a7de9a4065d83aaf09b1f7b3a15381ebc010bf284919e08ea7c5a4106860815d87c793bbe0f341f8f03f8147f472bd3b60873209d810b7cf3ed816bc4c02d72881a7aede12a39b4b188a94bb3305a1d574ad693bb8d75be0c99cc10bd21d8b0724b6e49135a7c001bffa6eb60827ee885e99c496dcebed00f5e2b73d2ba8c6b643138d4cdf64531d6fba1fa18b58cdc4f3c99b5a461ae3e5aad88799b80a79747650043ceafdde16cfeec7c4797cf7bdd01126bec8915babddad27c2cda7687e1876e3269acd73090848aade257587574ed8e3e922cf598e7dbf84986032fe17759e4b698258636a0f6ce1333b7eb23e6851d88e9dce44347501bd4ce955dc1b7aa62242506eb6e39527f94b808beecab96fe8dc871730b0e029e24518d65b30deef313dfb4e727589aa207eaf2fea1407bcd223d7a5b4c65d2fdfd6c2757574b75985a05feaa9b2e1a678dbc07c535d98c538f71ccfa45b9f3f5b9281f8969d5b0b5c98d997875cddb321d7356bc38cdc39c6cb1d5067c3ade992c3ad362c510ddf62bb148e5bf36c8106141625fa2cfd7a58d46a9d710190f0da3531bbce6224f0ae81048afc660703d00db4d20eda79946014f7ad5d606d146b41b24dba8b82b5e6238158419f5a086249d1c0a54f41b070e4f6fd3e6f6e893c8521beaa350607eab0caabfdf63c0ae9833336a08d273f443e0c98435a88ff50eab51f89352165ef1ba5fd82e2bc31b3e1bc0075036ebbeb6816e9ae7783013b069a1efde5b72315239bc150ef22032db8c976f3fd4724efb88b7dafb2849f334e27fc3d606d96e76c9b507ccce63a0b0206a681b29ad484466433fe29bb066080cc146e4533528ec0ddcfb47121f22f4531b0abd437cc32642ab47c89fcfe4d5a5de5ef1899326f0fa88c550537f68285adcebf8494144153be88eed54b1adbc77bbf7fb5b8d23d5187cf2c8fc541ee3a8b9af539908396b013ba10565077679f1e290ede354005e7bbb53ef7ea581c1dd21ef2d02196af907069f66e9971e1c0b1a3abff73510bd516d4221fc48fdc795ac99f36aa60aa7a162d296c8597035ee52ed4c8d62ffffba89996855fdf5b7bac6957d7d4bd63e5054f1ab7050b22c1dde53e6454d92c5bf12af95dbb1e622598d345e98c5154a682d9470b4022d89f0c32b57ae16f24828f6eb02cfb8be0f24bd6780a6eca0ee3972c053a3e58de4895796a9d6e49db7b502b52bca8a3470b83d6ae33604742f3e5514852359a183a96a360d6c5a3765a0c03636cbdec769ed81728c5c4011f036fa55e3bb24d254112abb3d19cb0cd155e791983496a0980af5b30bd0e6ccf5ffc79eb8441a35c3c0598101c3e06f3bfa84ba408e31f3d8dc07c35dab31ea34b0070c1a68e8a4305c3dc111cc55f88b78d61c4b6b670fe40b69cdb5fce0b6c897b6c5cbcc3aeca41b0e9ce7080df0c5b7aa5fb8d705f558adf339eff21cdd067e90a7680420ca236535e89a2f086e5d383b6a124625f4c1312de1d0dbdb439519c1c7e406e0737bf492f2346f83a3fc0426d38cab7a8b19b78a7d21ff11867fb5bd62e50bc25df87dcc89552c14a296ca70f67e43581a85f799fcc209196c20590372f57f1389a7068c498ec74610780147278aadaabf3ced9f6bb918f0297983a17dfa1b9926db7e2e632c2535ffd3a9bc53e6ac2a0720d38e8e5246f4fc5d38daeb0a6c5a7dbd196915468791fcd0edbe6caa21f416415587f8766cab28a37d7ccc0e12f22547bc3d11853f28ae65b9c34a85044282ee3c86f8b6fa3ae74eca4c93e35d30839e9e31243ef1ecb1275ced33726d470e98c944045f33d35a372adc60d90f73253e48a9da5b0383058081cd5d3da01ff6627563e8faf92b40d8a16ee0cabd182a093203db9d74695925b7beb8f1735a79a4ec48734f6de27a057672287f8805965aea9d210e25bd1875218cef97ac1aa4fde28b6daa3e81fda4e4b8abc0c05605e23359b6ac768dce9850e53d3e03e1d8a6da4fb75dfb049aace427a33000d96516d94fcb1de021d18d6bc5ad2abf88edb7cdbb674ebf0b168e2dae314a60cb7f5cd24767057386ede3cf2338b15fa2041188f1cbecd2c2d87491918a2774b852b95f924669bef604793e036825ef36f025d06a269c038cf6b412a6e18ee395dd07e5bb549ed753de5817c5e0861d77811cf536328378c2a1ea986b9a4d0b7ac4837f67faaab4547a56a61eeb8a06d69db6e37dab9d2720fb37488b5e3873f46ae2a947b007a55b3bae5f4418d173f7134d7ebb77b9f219d5551739fdefd5354df8dd28a682e6dde5a0da4e21f76ea3125859c469da9c4c047b7d196df5685594d414ef1475b867c34f4edc495ace52a5774770d85da7c6bfa33a4750f232fd9e1a8ed880a48ec32c8adda2179835acc093f57fa2035d1f3e8b0742578d5bc39e8e9daf96fff8480835f94cb8e614a7e68b49cce628e0bc66a5be6fa92bf4ef1dbeae19e7091eb107491c9c0181d9cdf8389032e09b7424264b2f963c52d819d09d37b0c60da58fa3c85497707cd4d5daae8b1b9aceccd79081b5ceca401e61eea2d4da9a1dbc94478aee8d8eafaca5008c59d06ff20bab33a15ad8faac1950bb909d31d626007ff5ab59867a457960001cc5cb94ac40b9c338629c6d3530dfdef8a6aa44a6a1f70d5b398d000c4f4f8412b3ee536319d8d9bd82e16ada13e13d80ec5487e6388fc7105607f22f3eb654520dcb5d5200882138dc170cd0de1aaa4883f82bf230adb66f1409f8119b4fae128901ea315a788d0ab9ea876a6c98d230572903b1fba7be16bd5f12ce50cc0e26566885b5a745fedee0c4cda638ac20432a346ef76e410dc2794ba328f0f862e45c2f61e7cd215d0f5c15f1f1649746a64f770993bfbc50515a1ad063d2a142d83f08b5a1864c3308d21c17c121f98508705537ceef84460425c3a2b13a2304dda5518b959ebeaed924c3d9abe9cd8a7d52020f9bccbbd4f51576e2aff2637e94e50e256fb1a1bf2098b9023fbed6b35f624a3acfbb2b55436bc5da6cd3e7c4826c8e26d142a45dc59f19435c212d5d2cb139a96b55327e00995b55068b8ff0610e05bc907cbd354495254eef76db000758d059887ecf5ad854c389a915a295d7473843fcc73676c612f25f65b5f355339532375e2798ac41069dc847785f5041c71ebd2ee80ddc8d0d926959e1b8db9a0a45a7ad76a6bcf28c33c208b7cb4db20802f374894cfd8f217a62a44574e8bb45bf01f137fba5a7564b2363406ec88ae24191ca81df5b7798af14d50bc216a28902f98d37895026758db8a9e748cc99a154a1b980cb912fb45f3bd506cc0919be9c0aa72acf872b910eba82b457443d4d925abd1fcbed8a651123e0fc6a292e385e01bd93145cf2dc15eb2c5733072a3793b9daf99bc5b8bd91a29abdce2e87e3aaeedf18c760221b631746b1746a7be507376ff262e77b673b2f9932fa14d39deda0a112d8cc4f560d41b50024b0f778cfd234cc78110ee03506efb146698ba56881c20574cd05c2deca1f46b9415860115e012209badf183de2833f7b06a528366e0886d8a310876c56cfbcc53d088ec53cf24e89b5ecb7de3923c055fd3897189bfab354d8e16da4d0013288a6ef577f5d03f57f28d9eb0d969f722dc2ddc719569e9b1a61056629eb57163f2600c38b44ab1f5d89a6bdc4b895cae33cddedf1a1ff6d8bd44a6ec9e49b0fd9cf77c09ba509af6b69cfa955978aa91efeffc95e61cba3b1f36ca9edde872f85b22da1c1267a7183cb873ced78f1dccacab5ec6b087fa37c59138825364dc1edd804fc143ff4ffeef8f334c5839c73fff9a08f5f287fe5e02934a43f30ad99e593e4887781754894a757753378845221950702cbacf010f66fb291c1e7d39a9d1e3e9f6c976c4e3dcc473358f2f070ab9e48eb4eed98f70adf2820db9e456c3ca91ad9875f38c59cb9a1ef365a53ed02c35cd64f8da071e5214a193473ad578368710e1456fd3a4d7f82825672ca2d1d5e83779c4140d8c79e86767776de34d93b551f0932cb515fa8c399e522366e6426934c935a9613f6c99a1662cd5efb0c2174b433115258a1e387fdcdd9e60aa87d375b3346f1ec3c12b597efbe0e04b08975c45e06bd47a290c43dd789d9c40a6542d9e8fece63ad2c0fc9b4973e4c69acd2f1028cd9cf660bf44ed54e67d6fdead6b5390f47104e2d2f6b563ff2055722507574c70f34b1c8a460b1e9d116d2d7b300abb163ff8a2231327c8558affbcfa78a913c3cba6a1ba05dec251543ac86521d346d64b97da7cee1227239255eb83763ecdbad52dcdbda2f60f55fdb8573023765a22817b55a145a8a0aa9a1e5c17fd7dff6a5c961b70b3b97320ff363340d59cb317364da09d009c6f5ae74fb50cf787642d9cfd6b2fe08b09b776c73e184d976edcf00a400a0a3aa118db39010ceb9caf636977212ccb9f520a334c509248e9e5cb055ee08cbc6dd985ec949edfdd72892856921d77a288bce75b3a60daba062177794525ae315b193804c41e9f4880816caae4c07eca2d7cf552df4a906b18cd63243b2cd3a62c71540fecf229c285ddaa8074ba11e667241d4ddc3e6e21e93e148ac46a9cba06601a15c0d41a5ccc70bc0c64d3b4257285b6b29fe479bb7fe85a6a7473d08a7d1db8ffc22cdf58daf242d499677e2038d35d94432c5b7284c4acd0f140d972df1c0ea4ecbf1f27b1bb45520704749c9fb09e76d29d44dcc8bd3a2ef14e19ab46c634c764f7754fecc8d1b11e5e4a0629c715d2ab748f8c078056222736918e25809b2a1e573d0dd4069ec6b1c5195404283e42e3444bfded6a890e40ae55f8095bb6d43a24bdf41bebbb9bdac494f2f796ae17471d9904a6b63d522d6784ffe0711fc4a78e6a8620582879c20194d940bdd0b9e0ed33e5ca7a26d7df0425af50ded27409634be43ab80dcb70b392130423474841473de2286b05fbaaecf008dd8f1671f79b75a1a79067617aecae28b0dceb52a513fa21e0225405c660e91ac37c94f1da8b68b682bd76c603b0d99228796d66dd859e490ddafce681bce62a68c6ec7e8873a7e0f4c0ea28fd399122d17294b9bf39dcb9a9d39b2788f9f3d968b735d350848ca0ca7a528f2179874e09ebd4dc0d6933c78ab5dc79ff89739fc0c6c08854dc0db4b99b6be2d286b123d34555cf8bf5a96e3a46963fbd43f92440bb10e7e95aa64b89535a97f38d734210f88353026f8684b3ac2b57838a6bcd09a0198d24bb267f90a89c236d469d1587894a19bde81b87c13a9328f99f57c8933129e26139202aae7961a47ee80e585e44693f532bc9335362801e1015d698d1baed9f28e707ea8c452135ef7f286b59af3343439323ec5bfc1bfd4554549107b7c995a89eac42e318dae81c31946a866d1f0998e19c39394ce84efd0841f86770db4f08530414bc5753a95acb2004623064088ea106df117fbe3f6600635647662b49a7203d71a4fa45103fe3a8a5e21a0653dd09d1c924dd61fdf0421ee2ac6b7114f186a472d59414eb6eae29ed986baabf692a2b9ddf547c0b31b929563d8ede8485c187d8a879a48e8ea9768ef36cc554f174046de215e12b4e3e41b9ee0654e4129749b1d2e5c8d08b9d7b11499d873d813479727acf863fc7d7cf2ccec54a705fc507942d1a851c202fe4d86f1f2939ba70032a6359bd7ae37f2957df4ec8a5d889d2655df1d60cf17a756a5dc28c515cd7d5c0c44e2279b0b0134f9c6cc61d7ba13db98b8c096b9ab6f1ba0111f5f1d2cd35d0a28fcadcaa0a74c28c67521b90f355dd8bb05258876245a9ab24b7595885bcbdabbb60c862a9241ea2c1adf403ba59da6922ec77e133707ca749ecaaf6ff9a48b00b2dd8e6bd3f0094841d07fa7186b6b2dcefea73ca0a18c0a781370978e8d2d8664659a11cdd2cbc7507bd78a14d92694831eb0c62683e75981d34f73ef6c7ec43f226c346c2e9adc81f81246ca24fa91a046df40a0f25c1fa6020d542a7a8b250299d9d8c261d37bafcc214772c4bd55780cdda0f6ab453e3d43a2d98d1653d4b22d8922be02b5b980a271efb4e4c566c3089a04113c4f63a8cdc1327f7ed891c8ded9bc96d9f6d46db5767a8fcee972827ec1ab44305610d155bf6a7f1dc14c86c05dc776f62f1415638cf3392b54df32fb2ec922a646e4845d9259d526ab03d24b13d50853ddebc6c552c74d96a3ceeedf96b2852ee960d3cb52fc6e0aec9cbacb475075885098dbff45c25c1c86aa44dd1be2e9095528230f9e5c9ca1805e6d9260ec9579f1e4ebccb386b2b55fac6cabc78612f580f27245cab793c1952b77f22d2d06a511712ff2e3d6fb98d9752cea444c0f30b16f60e12eb2aad98441471ffa8a6aaeeed36736e334d2e20b292198bc3f89ea9f4e57c92f2915d28ed6b9658789cd53af1af7b90b429ea89d39655a306231afa13c4c4d0c0f479e746623513905c2315b3b38e0ec47c02156d77070f985219b7f99974673fde193d95c9bd9df3784b1d3e59423654968bfe175cbe5051b2aacb2ffdfd9d4aab133479376aa3170460743620b4e4a465b789d8225af452bb7a7a700954cb4b07c37a8125b0c342fc16faaa51bd0f2be941fd1a52637973f6c985d6f2ca044b570e8a48b83ec74e1eed33ad5779862b0fdca4fddd9cf9e7aadb8a4b83a87f2bf80f17e9de8270aebd09c14b2c35bd5549fa6341ee28f8988cb7457562b3aabc269d2654f112f0e3be84b28686116b34b0122f34e9103fcb5afec3b23cdbbb3984b4498911b0d16d896d72cefea232974208b008293341dd55cf24e0d5e1bee1de8e02a32a8645712149351d3209113fa8ee10c23fe50397835e08bbb1350446d82e12451700a26f1440c42ae91937c3b40b9de510015f9faa4912fd1a0778cf214198d3c24b3053645dc104192d3341c98085094bf2b81d20a7b94e7291f4768785723fb890ccd254d281d2d6fa47a6e39e555f08be0e19a404ed49c8953ccb1798ac125312af23760115fea118a77844a0884e0a83769054d248df1b24fe0ec5c5a1fba2cec68e3817d8cda44b04be83472e90e3844daaea9d2b5e2851f6f12cca67ab24070fd964003175a57ff80ea3e7183cef50d0ba338f206437ac828bccce32e26b1873e21fbcc93cc14ea7a1f32f8d74df66e415387ac58c0ce1b02ef389bbf242978e6ebb5e62362e980934fd9825eca7462232365bf292562e62a6ede277dfe5c0c6a911bc4074190aeac40b3122dd2770dd7a0fee30f5ddc8146431b54b24e770f003db4c1e9f5fe5b821d132902f09151d715f710e4fe8026cdfbdffbf3cfa0b31a3f6ea94a6dc9b6c2317e32278a3908ed7b5978c42d1f3606b9cba01b3eb8c99261fdc4aefbbcf380d082feb3411e942870a1316225b3faf3e52bbabc18047ecd4aeda6cf4a6ed684c44c6f58826d46512d89a6559cfc512314ab6a4f99a3335ae0cd103d566773e8d1a466aa363879e276967332e4138a5d8d9643486726fb2a90454794fc76b27ebf3d9e6b33aaef8a90db9af3cf059784e5e821a5604a669ac7756113efaa2f8759109b265277fc56aee2fe4f8e37fa3f6ab6ffbdd426970afe075adea516a288de9f0b954b0f61ed1263231525cb8c51ad492d6e2daa261b83bb1ecdba97996eec55f8a223f16fdce025f660261b300c54c95025e5762e9b7fefa04227fbeb20543b0e873b933d6a41eaa8a2c90086885866671105cb6a270c24ce2c294bf0870e0ad9f90d42b154039512809d1bc7c369a84df8c63d42798fd6218db5a5795ef79392419a209e9791269b1211f9e36b51a0ee7267dbe95d09b3d12b069abb71ff66cc6076cd4ec0fdd512309ab24e78ae50bc7c36583f89ac67990396056d351b11f3f288c81843308d2217e99c7468df3204e6ac7bfc51cbf5edf28d3815b82d7eaa7c7531a35a76865b63568da58571df210f392c7aad8ce073242c210dc61b19c892d1ca039755607526dd4bd217692119722507cd4d1cc06c9dc6c42e0daf3ceb2c1533f9ae15668273b19dfdad8d8ff9c7cc3d10558de76dbc3202ba216f53ced4e4ce77cb68012dd3dd3ce5d6d7f23e1514e141c1cfed18c9942fe80b5c3f89685b88e413e0550e6ee82d9720766dd8dcefb24ca34d836d0bbd83312059ade8de1b2dad440f4d92fa3348da2830eed3de7a0881ede975b3779eadde393e99b9df869eb7b50722db24032e7e5590c026fc67822d8807ecaad2d0c3e9d93c385adf938c7e4c226a40704f07b9f7270eb7aa856e20dde85b659a0de9392e4b0c10d3f05d0ccb81b6c4f0b5508b140a3511bbec32ff77397e560ad841c4b637e7c3e511e2fe0383fc81bc7c420bf8858ec016c15466a3eae32c56d17ff4a11f4be71e721e14523ec70f9ca173c4e15522ae0c6414885365d15c89cbd5396eaa6dc98b54323f5b164c58f2502604430cd51ec4aedea99bc5bd690bcea12c907c027e92838b35d2c158e9f6616751a164642d3098e2ee0e9f18131305351d75b748eafcee645cd16542c09115dec3f7fb34cf9aa95209a387f262257242a0e31ed46f322ba2814687eff9c2a0f5f5d239bbbdf32b5622636a723f01b434aea6ce1d6818634a68c8de5b415001014ae00a55766b8c84c832b6862319c1dacd160c8e41a8f7434a2db5617492e00552eb2bdb07c607fd82c3e05bf22d888a7358184fe26f4292e74938b24928c7e23d16b5dc99fdea5f01c32adf01ee78c077a70f3c1f8717143760367781037c8a8a8248c825434997af03a81291eb37778c93e32b57616d27d9421a1142b6aa60fd6bd15aed2bad3ded4ed5bbdf5aba25d09d5f93bb255a5e5a3423ba76f059c83f75dca12e3e534c182ec2d75cf5974423397a7d937b5ad0ef4f3c5a17a641f2a762a87fa384e70864e1e6cdc571bb038ad62ac31c1720f32766e25367a1aa64d9c080752e4e41936541d09e83dd9df6d3a860607f7d2294d4654a0250731d228ae7df6d84e93a987a40a4357cc351a65430c9478725c019217f53039489d8c1793312a6681486684975f8e717637e9a566c5cfcc6b787cfae0e5c7d10466589bb74d744ac11c19e9f6d0ea423ed68be3c68ea6c825428c9311bac9fe721a2af4224a7a5b12fcbf02d1fb8cf306b20927a576b49e522b675e5232090422d77cc93cbcc3b97f2a86976436ba85c80f2257f50ea8a3f1a6d4dfb8b46423925a36d493f676655192c20237fa686a82a1cadf2f7ed6177a8637c6055f6e5a26e7bd643593295a491b48e49fabce69ef46ed6b4d6ddad64028ab874fc0bf3bd4b4d54a3552d4e1699e03f45c51a5a1cffeb3f273970e34b6ba5d90d7632491fd7ff86ff11b6c04855f8301cc4b0d532c7e1df4ff06d2a3f564dad47e0b54411953e87e1dd1f08cfffa4a9b5dde7eab0cbcd31522650909a6d415d675adbcc0eb2253fb182ca261177220c34c02552cdc025d4884f1aba848ab03f1a9d994c1b1d0c64aef6ff6616e6398700c557b191772a736a45f1251913ab3ce5608035fb0473694e477193553d8e801e854084a4c6a2342ba882a4d0166096e92d3869b8588132d3b73e4749f5954044cfa188c3d3a7537403e597d8d5a8a4c9b1e36b2953641ab6205b206c8b3150da0045f2f1bb8b030ecd510248df0583922625c891ede367646583288ee0d202ceb35091ef31f8d8fa779c17eac0fc68f3f47402c212cac9cff64d241c9724f5704f28c44fb632cf23a446f7a93110645402f79a3d808000679f4b605b0b4ba518dc73234b0fdc7149b80dea91aa7a0fcfe9edc8c749a4c7a68dfdd6f884f2a327a2d8ca24b16613303ccc8e81fc4b6ed0f31cf92b252c8ff5de749d9ce66941a30487d1995b2ac044935e8df915cbff38995f4dfb45b015ed8decd9e854bdd76d54de12f21c1f95e5795c2b6cb69f0da4d32badd5ad4769305d86ec57ac97a6af585dc2f7bf569b39b78e7accd7657c020d83ecdcd91ea0a379493733eb4f635285e4b36694fe3c6bf589b5db4604f0b6bf41211ca49385929d8ed6edb864f1f69269f6422906ed9c1af51d791ae5a5b2bb8ec5b1775074a24d6948f4b9eaa9efe4fe33e2e513dae4e7d6c8b516a5382a27f72167568e4b54485398b331e2b011916ab56e2399376e92022e58927c9466705703cfe6679f567ff02da3a6219f393c7bc065b2d33f90b71318717ccec1aef7ae0d81c7f42604ccd3be9248a2d7f63d611c69cc37363bb79f65ddb60ed5b0ad824595b04957b97a9deefc7d5c9e06a91a2e4b7d7406054118f481b9ce83da1642a42c1a67d97799681ad30c700be84ae3f0bd7aeebc0072e7d918a7b969eee0ee18100bb16b8d628f460a92692b2c784a9315fbc685719476c43e4fa3556f8db74f866a92169101263d516a107cdfa3ea9194d0261d4c9b711765aeab849d2d00766db8b3eea23f737fa8b17c57ba10768d78ac8866c61369fe980fd3f5520b218975cfc4c967b11c2630d876b473b7a38d4aa75b633b592832d5accad046954c877dedb9ba51e561e41b3e46a75018e3184fd514de7a65549c2888831ac0c59e05262fada64185a7d154de3043354c034a3a35c534a9398bcec1d132d569191c6591de21bc43433e4331215439ba95e242433646a8d37c906d0eff35d43aea7462c8f1df622f69b57e0e6a7aab4d87e587825881618dc083c97c76e32f8231cc8e49c138c5fd31973de56067fb6402c5a7491a66fdff03ce02d4c00994a60e364faebd00a96ddf085b9228c38ee07d0fee8661ffa3bb4c00d75580bdbb4e7eea8786573291f3f616aadca3127792244e0f7422b77eb6d072877d4934eefd2eecc4948c814072d2ea05ddd2ef8d859fa04e4317bf1e23850d6999cc9cc77db7a6287f71c60258884620fb8f64e03d007068418566a453405161d372d81f405b9bc58af62793dceb08e02c8f4b34c8634e19db493cb89b6a4db239032cf517d1e9f83815691d70f778b370bd0260f37cfccf6d72fafa6f3239873e63ef9abb8648eb6199bc8fbe59f15fe214a6224b8627993ff8712e8fd21b2b5b2875e1fccd46daf33961a4458cc22a7a6662473c24258193189771d70916553ea343049eab617729bd569d525188b2e593d16a7426b7f97cc34eaeec2a486aa939b4f0b076f67a618e54ef7372603e8f32d5a7520951769b39147445391776f232253b0cec67b248139eb57c1b21902e0e57c2a97143ed8525854d02ddfb505cef905cd2eb3278b56d2d494df489127cbbb560e5415c5d3fd65213cdd99420eec0635a8ac568cf43cfaf8e7a7595fba1a768f1fa7c9d9ad9760c540cfe4048b6d09a745e346b73f997d2e051d92d950a0b7891cfd3545ca3159d7ea11be4df3988461f7f433d16631a4804a8a111eea96a5b2a64219d01bf239040ed4f0074d33bd4d7be7654caee31944d8ba93e9b88a85abf703589f6bcc8eaf4374f4a889e3c3e080f2e5383ac85a084c184fa2294368a0394a4699a3b5e5567c353ffd921a23370c97d8c2b0d3f26e54d6cf2c28b8527987731494061a4d600a714159e7010af3d88035bcf6898f8a9bcc1a0a20d20e29860c7fabe97a4837b59981610ef4001acd6fb30fa3d4550d590989a85efa05f9466b4b50aaab68227d1586420e1a2c1e03e4c90a2f97a25cea4dbaa5aa19cb34ab2fb1c305ae67521bda4fe7dbc07ac30a7e521bced1d0a0aa19bab03f0ac85a4c3a5fc230ae9bac2f5cb0cb50e8ab4f09da3203e5cb25db72945c241bdb843879019cbd402b0d7b376cfdb62633311df70fb676a3dc4db153ec5a0f8b2553cfae9758ea5865f91c0440f42c105f12b8966a993a89bf1904f7f862b3890b14d5c33b78d8805f20fb0216ebfafb301065d79cf7208ec1d0dccbce2df9470d7f889647aa36bb6340db4536e9f7f231a6cbaee1e35bad223dea274525e81fc799a1baf477250406d51651b7e4e738b74e7e71b5716a20a7fbab9f7272fc510eb140d8dab48ce9c38144536c66228231e885d19809b40937bcdc73f5b8ec02fcfbe55a48ee8843a64f18d41f77031189fb92f390156df1f77364a0d31e80d3196c7e8b059d95dc2b20f245892ae8bb5534286cec741f2227b9739846e122429096b8f2b8eeac4693d50d1f4f5ab2e50442d1ddd4d85d58b053ecc6708f7ea0877a346eb28b13c9b856fb50eb1871b793c0d0e937ccb496dccf3e2157a6a7bf092ed8160179e4d562ad20ff595728d400d088c14d3d67c256d6791d0eee16a88b5a53309eec8393f443d735bc5b5417b0482319a1ed1b45f7648473b150aced4a83e51ec6094fcbb8a800ec5789051418cf731243d8f4388f2a7205ed86008e257fd93fc6132fcc3c8b2e75b8a4d9fea74b19b05148ad7b3b44d6dffb5d34ed9bf62ad77db67063b5e066ba3f43e36d38b35c36d0503ec16a53840a5b4c92f9faafb7a36969a75146b0e72109db0ac39bc6d43eacfdcc603c28c16bd3a26b31d237e31a0088a439b7ba45aa1a3698753d10f0899b065f7dadbe9b663baf7ae1d410f3571f0084030ece21dbe951dd9ece2ef88254a431359cb8c46ed977bdeb6beede03e2c6bf998e1bce35fa77ac05caf784887deb518719c982447e7be3067334c449580d128d5239693ef7f0a499bbe194582168ca950b77e4d2cdcd2e88baaf1993a190443a5d2822f7f6927b0e85e03c755531ef881217d09ce575a1dcd6ffc18b67eee13b891b0738eadfb5404a1808f5d253a663f705e811e1cb6ac85bb3568128d86bddb21a857efe57b3485ac3ad37bca29a055605c862b81cdecd08dd3c7f689744c1ff26974d3602c714bdb2a02f2cbc141c511da248101031c8f44eea64e987164ebfddb31043a4eb8cdd8400ee478cf9d2f2ed80ffa9ab48bc5ed52fbcb0967fcdd1fb0db8c2ade05f65b2f72122852cfa07683b581dc715221ffeda77ba86c59b045b3f2f74010d065cefb149abc65bbf8420035892b6f451e3a3dd93a195913251d04d7cbc82080b80094d5c9a4c9234875c306b4f470c46776c1c094a2991af1b3f13ea09fb2f5d81b51be372240953e0c956e48eee7390aa4ef10c2c2dfdf946d0a7a98c6191009df2c1f024d0636caded4e0b72a6669194695759849afe9db4fe609106fe0b61ab39929f052af5ba8667939c33e53c58fcaef16ee4e520cb116ca711db6b76c753d302b62c282e73eb1d73f1260070f5d38e660698d70638eddbb09641b5a719035a69de266e3c79b73914ed06219a87053b185e61f4f4d2e393def0081331a9f9ecd07b3c360b58d7eb65fc52c3a0d7a67665db20c10ba283cf9782fb3498a0f05619f654c2a32fe81a94b538c5cb64aa5dc3111f6bd2fe776bd0b51df859c9b99e004eb4bbf6997fa525fe662579136df8ed437b8f38ab908242c7322df280be7997cd6b2d42af382ba241d21df5c4a7fdea4a49cf8f43a53746cfc0d0883c79f4cbd418813b9793cf07eac2058caf13c6ae002b286d3ea11e1c787b36a2f851fa751cbdeab6792331d73f1952ab3057f90f9a53ac072375100eb1d678ef8a590357d05e31a69dcb053b195923537ed5c29315558e423e42e93635682a4800d03619debe7d14f98719d02bbeab9c36abc08868f8a7304ceead0a8ad309505c00a522fafa54481d63a6e21b5633a76bbcb7e90c0a77d8e371f78aededc7e5ecd3751b2cc35d7321a848e998564db4c3e088bf53545c65c00247c16975c7dfee483b18a08214a7b7e718c643d0c7a544b4a9a4574246cdc690cf18e38252f002dc40cae4df8d143e846889f4d4436aa9734ebfe0f289ac9c3c2f2366ceb8a5e4fd0349acce7cc8495093d26158c1446518630a3817520cf9b967f581809b16471907fa0879532eb7483280a901564f1c300d79bcb7695c7cad0922593269016021b4787b5fe4ffd591ad025101ea3f1ed44c5168464ee48836a3f68cfb0e79c9ed8aa36748a82aba4c59c558b1889562bd2c710cb4adb284e274212076b27459b14a85c8c58266ad5fb104d5447364e9d1a982afa925dec463268261450e036e185526270f0ac11a9f903d8c0133e94f107cd29d9f426aa13ccde7e3f6321587227b9fc0868b245369c781068281e849aca88134602be08ea4fe1ce27f43f398570994ac88c067cf2dec4744aacd17097e909d54d570737d838308941ebb891f28159cbd4c0c82dfd4e1d07e672658c5e851c3c3afb6ad2079b81629fb8cec94385742b6316c2cd72cec9b2f27c067d63a1ad994b116cddf74e33036bf7da44ae3a68a4a0e508447955ef06de3bfb8c12376f35db2290a638422358a78eb796bc072708bbd54bcdf96b27492f1989720201c2f651421f1013e5b8096a498047762db89380c6e753bc7b5c002e957d245103f8617283340d3c881cc4a074a082517e73f45882c7b89a1f61b1f5f8f85af90b13050afedf89297831e4afc3216fcd6ca61c5d2cf7867d186e2291acf4de9cb788767d4d7ae3d62106b747175322cd6e48a5972427a58fa7e7fb8e9c37e268dcb4f2d50a6e94595154a14a4ecff3b65bec137f663b9329ae24b3c9aa6b3b288fe974bda7ceef38b0d228862ec59981c3c2bfdac0fd62ecf43937038d4b4aba51247068fa5dc8f41e80e799d06a3e33bcc11d111e6d329ed7e1c42804534d309f97408aeb0b1c49b41b518b4eb4f8043a02c79e44b6bae287693e982150a214003591d62dd6df5fc00182c0f73adc88c23b2de3bb1b855e349db1736aa1b5618c988bc940f14f96244d463af73fda80fa108d0e4e104524bf6d2f24364ba431666a4d712b63cce4d0e2a40e939dfa3968d5f3b08400bdbe627a3e374a92e6e0bf5af5c03e3d5797f3b62803a34ec8bcd8749862f6e62be2589ca43424f40c0b7b4c4f466f796768fd7bb0d094c1877f2e8efabc84cb45db7b710d8f400e3840d70147ee5e96896245c80e407c39b2e38bdce29ead73e6280e3d14566f4caef6ce25f0490f9303410937b94d6fd74337d4dff898d6eb2c17aff24c32519733e20a5afa1559064a530b498b843634414d256b51d8f56a99fbd9ea442454daf20be8fe7f78c230974011e0527528cd3a8b32c0b2d389d604c28be9b5e884c69a6e9aa121c7def48e9c388f6b905ccd7de84ea543f41f1b69d856593c7f534bf1a806bcd0ee2d276171c04c3838af43f4c45dbaeebeb0bc48df8c88ea407f7a427949bcba1460cf33d0f6f143ee0454dd95207913d83eee76a086fd5d3df345e8865a55e4e2aebe6e6fc5af04ce150b1cc3b0758d9e46814f11f7a001d930f792c20d6aa8a32902bbd5844658da2f39984f1759ed6c7943f90075aa4fb0fd4cd6f12edaf44030ef2f933a15fb89d12c782ec9f64a88851d0b27910e12d46069fac2693e088ef4e175fd32a6341dec3d9480fb0d559e52b58d0fd6f6b612f80f3f6bcd8f55fd11d02273e06827a3e4c06baf314bb18864c387ab42c403228d3c323483326144ebb5546d59a15d64a6c406e99bee6c7da6117d2f72df00e2741c04b0a43f26fcf7a788856f34a38bacd9bc1ee4ae080aa4e920110da9c6ff0b3a754e8eba07924eab280d2bc02bad23318c83264ad061543e81d03c0a667afcb2d420b39a6184e0bfecd0b8e092b6ad23f2e201aba1d9853a8e4d40c8fe8f9b9d48befe2636bad21c3c20c11f2db695aad06bec4f7cbd5be26eb5a95c728d21b0bac218c40136556dc392af6e60dc6bbbc689ff94aee350134d03ad3e161be99cdc466ded12c08223fbd236ca5210cf8e22cb4aaf9943dcb60a3f57b39923bec1d15b8608d8559ad65f81a0d7a49b5f6401aeaad8685f805595e1806f0bd9216aa3330d1ea7c0c5869fc3643271039f9cee5744e2a085b92df2656fc51e91f2a763bf2d335e860289f879852d2b801a01f572d38bea8eac6d8d9c89d39129cf627119527557f49305ea3830d64325c36e12332b9ac08c1f8dd1809d0b2628e211f1f34c24a676cc3e423244f8dadb212c02d30dc2e73397c651347ba0b993fbddb871526f9e031da6a2e72106a0608f10473b6929144a83ecc4dc219986598d8d1bc880994eefb8e68b1edbbc147cff50227b73d984710f6c8adfff16052113c4ef6d23820c9c4fd1b08d06d15bb5e0f37264de68c80cbf3dd89aafae57799361bfa830bf437048a8f7fb45a30d815271d7ee7a45f5a478caa3b769a5db755f94f13d918d9f5cdee5d442354dfb6a7f6ff9f833ffcfdbff3599b02787c280440f128ce52fd5ba999180c2ad90131175d72689e2ca2be21d0b7d5be5d6209914608217b6fb977ad0b520bee0a78040679c107638733eed178bfc6cd14a33e3b1fe6edbbf34103a41dce00cf02c60e51a71da2c02c244bbcf2c3cab515cd5ef44d7435efa29166ef5db4a25d9ca6d97b232d53918a06aabcaaa8884ec12cd25e2f7a48a485eef558940fd8bb05816c1344f998b79fb71b90ed99b73dfbddbc2b9acfb26f286026925f70e9a39b81c0a3166c6a09c354ea58746c59b065c1a294c75e7d58143bb4262bb207ad358940d247371dbcb15526907b7f74af93bc7347f13cef1998b77b9b7745df62c783ec78f03c50747b479fd65e667ab7b1bd993b26ba771bc74f09dbf9981c18e4056f60f6beccb458bb98e9f6f7c416ed049bd5a1086c6e56af96344c6cc243a6274e0d59b0264c6c1d232d73b3586da4717e3a07a8758262fa26080868dafccc9a5610eb4776fbf48d4fdbb0baa6a795f3a303b4233f593b3a466e58467a6e78a48d4e500e10cecf8d8f4d6e566e16c690d08cd0f9cc286270c4073e34c081028b0c1990200738603981851ffc200a168ca298620903f022053b602c410a2e48c07282203088f18530e8200a5140418ba2496a490c1645866957a5339351582b0cc10a3b50816475770d8a02e7cf0b7684e3155638410eac70044b6b1610412c4008118e577411d4a25e140995c06e610a5d58e19986e3155d4401e7971a18d4200a4a70b71630c0a26a8102032a44358c1083459161da55e9e49121400f06488266a405c4c462f852bdfa3bebce341bd88ae3155d64f16920ab0b2c5299076816c2ae4a594004b10021ba0b1fe0fce19a0328c4985e304d2ca610410d80bea0054f1758b0021d1c49228c9b2337302041080646424a08e178451738f88991ce24ece870ce177a3a315ae2b82c0837bfd880f064f082638c5c08be2db4186bd6355a3426e6e5250cffefeb1d7a583e3c5115df3551159f65af117b583e3273364e879d14158bf1a2d735bf5cca4e33f0f4ba61ca892c9bf3650b8d67461eda6adaa22ddae2993059abd5d362b5aed684c932fb87216dd116ce84c96a6a726a747670ffaa993058ab75d9b4ae9bd665a43561301e9e1f1ea07ee59930180e4e0f0ece84c1aed6b76375b09a93fd58a0ef0aca5a592b6b65ad2ccb329ce3e064389147037398693cb49aac26abc96a5aad568b8787870727b3381d2b563361b41aac06abc16ab41aad46abd16ab41aada65751e3f17cb063be6434eb46603f6996659719a533dbe1e9a93835bb8c89797909c3ef9065df97655996cdcca7f503d4945299655946474984b490a531143d8a8ab021cd1375a20eb4541cf17e030b2f440516da25483d2fc8fbbc37b0f038288ab0c554d658b84f43dc6d2974aeebe6e4e6398ee338d9cd5819eddcb890d6a5c266d2ad6ed22b4fa705b3642fb9edd361374b0acb653a5d6b986055603ad81418126ca7438c074bd2610fa604637588618de5e8000a4c04c519cbc9c172705f63f56c31656f4b72d2eebef2b5e56cb25df3e32cfdbc341ac0b68b460317d6625f74e688b783bbac58b6c1785ae8f12fdd23273bae3bd771de46e311d14537a51d61b90e3ba485407a81a956f55b602fb0648f883e45bfd1936a5518765efa00b274c83536852da6b20808898db98160b266d2a457f512fc7007559fa9ea571f1a96f85426b5d561571f2558f90eead57c2f2182e2dc4199ce8eea3361424b5ad567d26af2e304e8c9436384215688d561dfc38195e774268c88dbc1cd855813469465d67edf1f862f2f5974833bc4c27dee66c27440409c11201ca01ca009d3b158412cae86c5d9b0264ca7a3e3a3d3d2d19930ddcd54f5b31d9e1edce758dbcd84e1b81faec5f97c391607e7cd082b13b130114bc412ddcc9898979730fcbf2f8b6e44749e5220202020168bc5d2d1d1d1e96eba9beea6bbc1fd21ce01cdefe3808eab08c83ec124458784bd4e2f5538bc816d60ecd2124baace39a97763e5bbd460920e12593876286764d329b30e2f5995a001851a042d1b5995efe2a9c293061a00ed59e489943e3ba6d10c9c32f3ca4126931d58f9234c291c81f06460e5299d194062ded3e92737587f811362d015c1c2045814c162c698c9af3cc17221ee5afccb0e8ee3b46da39178e366a557866911e8a61c2b8d84ae5c42cb81e5b21b3d4b48231eb025d9538dc89b2d58969b8f93558b493353dfe3ea8e6626fb6be963f9d65d8945b7c670bb6601ac5d5ed48134ba6c9bf670db429a065e7ab3d99d6c30b6382f5a6bac97b44a0905235e09ac8c316659966559966595eb32e69c73a6269def10c4ae2a6f08a3cb8cc19fc082e8092fa09cd882f6440de909139c1a085b2ce1c2085d388207070b430461a8c20a181c41054fc480f444153409321c78820c8690042e244187081240f891c107b2600227b678420bef892d4448286d618302911d64e1440b142811069b1314410bac248e2843075d24f901fa585ee8428c2b64210a3308810ebea8e9809223c22003082870c2e64ee4e0bee2084d4c011b421264702426d81713e7051fce0e48da0e46385ec1c58e86238252e774bf800aa3304213052f608273c113d210b617844114bb60c2929a31961cd1f345fcc217a8700310e0400ca02cbc408b5292177cc044b5888922d33829444ea2f68398182a4a4740a941131ed066f4b800085f9842167aac2032832ad840490f7a10460d6e78b486f36444b32802d74413d9771c26d0a004f8a8108424216041ab0c1e0514e1044d6a82f063b3842662903561839092264ec0c96eac0525c07d8e84e3155c60e1154126663c502cb12581e205251a2c0945e1a4834c05c72bbae8c011a2f6839818222920c2132536458270051222d012b670e4270a4048e2880b96182571010c6a5023acca48c20c98c08229e458e1c38e912435c042055bf0000b5113be22b4600b5a0b825868a079385ed1e40976322704a49396d42706e66318569a188661d8b10de3b01f260642434ed88e9c62c71969e442df36d141d1153fce6659267a3c62731e29a1905e9562387afc3204e8e9f11fcb23277aca032010640239d86b4b41b0c74da034b22321a4911dc570641f47d6f352a20894d9820077435dc112a0876e061382e5b2d32540abea086ce90616599661599665590f9d8f53191dfb955a73a263fcc0e0b26e2cd258639c36731ac1f11447eb9f06eaa05993c99898979730fcbfcf5a6c076a43690fcba785e5e8ecf05cdd4c635de50fa531a358c52e0c03bb060251159b06142c10ddddfd45ecce00be24290535f6c4b26b5ef3026d8753ebacb1ee9e57adb4e71259af62f7638992963e68bcada47b3a9c734eda2c11e08b07f4999c73621798392c3beb26aa0c54e1c6ae6a23ae3e035313a61da6af1146bb9447c5e822a93c06e64feb1ef0000542c02a9cc29a4e51658cf790b039c33493b2524a834c91e433d24d329973ce39237d965936e5af0ccfe59153cbe608e67a66c134ee88305fce01d3a7a2966197d22458a6675f5a682ac15a5f679db5e79cd4524aa9e4f024829b7ab1cd6b5e5536146aacb17a29b097974caa8c466059af959992524a9b06947e578c1d1ec340db210d494d66f232763392528c088a2b48e714d78eb8c2d705e6ebbaaefb7518ff0169ef466073769d070e5f59965d57100e7fd7955d1a88f2713d0bc2e19a51f044f016349858f9f8fee930e63e9009c420e04c0408787ece6f7db386fb1de670087737c1b14f2ba6fd9bfbb94edc59a63a8c1aceaeef1aceae8ae9ad14b3988633ec5eb4629a584637336995b45fafebbafa327d492c33e9bc9e2b9765199df3d7cd1d05ee67ddcc3c0cb29c18e0c6bae6e99e66d52e426593a0298bf8b47e805af2f4b0a4ed82e002001c3f223c8b7009d806a52d6983b3bb1bcc73ce0cbb404a678d8d498d04496c34de50639c51a38de80280d0b30e3812216681e31270dc02c7cf99045f555479bafd071b80e7ec64f7e3b5f3f128291561a08c2ef594f6051279aeae486c9189cf920e594a7a92f05441c5890a2bbf834487ca981c2870983042e7121dc66f5bec26bd349060e5a9108a670f374814e950937382d6fba62aca1a238ac02e0cbc2ebd402b64024120f08021a6100b984174186fe262b646b3d9dd9d4d3a35307f174e8ece4ead5ad7b40d8ebfe26b1ba1b1e79c738259d3a4a669daa9a6b57e8082a6c6d3c3f2e9ef03bb1b476a9aacc1f1f75e9ab570fc4f3237023431bad81fb1398f011c190018624dd58dd8bb3c6ec867aae823401362459790121518ea89d828bcf77a7b5578519409a650c0b1bb115ed40d903e015327e04d763d324c23cba03e387635bcb40938765675fbc7bbaa4b84772113cf00f17ee3b1fbc10381d467f8c6653aacb737f310310d86551f32b10acc15a4c170f81be0908943b09d7498fad67136bceb668800c0856478c7575f5d1296dd0f948fd0611e3acc63bec98e8798ef808233f5ee8d1d6e967887e370730c02c62154a416e9904da8a6431c2ed39b6481cda11e27bda20ff5c41b62ce739e3355f47fec6274c141b2260c8fd3bb3c4e1802bce571e6380106c003149d763fbad7ee0798cfae470ec7e15b1c2273fc7a55f7ee0d9006c3378e6fbc3418f6c25037a3ba016689bb1e3a9c4696c183005ec39b6fb8ccdce14601dc3c04ec9f0e53d7e1d260d88219e61e4883e1fa1c628e03d84c3a4cdd23824d3d877230fd0d371b816df876f3f6f0366e96d8c60370733ff101e631a9cf8e0718303464e29afaea963000ee8e7b84e8421fca22ce6003f8a9c0d60072335f0b6c967886c70e6978ce360f8954c2e6c864f3381a6f503d84044c9f3b1c433e98621155f4b97a5bd81ceaa13e9149ec50f51baf9706d5cda5f06689c36f2fd7fec615e2c5ce8440bc976efdcbb5d93be9374021c28e07115681a19ee8426fefcb6b68c17244f8b0db4960fc8dcbf4d6f9d88edd63623b7a217ad53e1da664b7281399e1a27a342622a424bad0d368a006cff01994d8d46df4a06c2966aae8a947a9bdcb73f8400a3c4375fa0b49afc21fda8375802e60ce66bc05cc56063007384375bff0b284c186dfd12b1ba70f538fc1917aea16cc5fea1e98fabc71251e7dcb31e0cd2ff7e6f0970859e3661a37779219375b969b230feae6d85ab959d6a8dc2c71be9b254fcacdb275bab94d2a4098966e9e00d64837e620fd243ee9d5751ac4631bd5d0820de14cb1778abbab20d852bdead97904122a300011ec8141ec2551f5118758a80a461c52d221fda5c21641e00210a6cd049e3a1dd2504f87f452847a423da9774861280f9e78db1de60306663d51459f65a11e5ac16c433d2b3502e804e86c3195893cfbaa6d1dd6dd963a9acd796d9bfc9c735e122588db83018018dd0584ae100f80c0bca612f292b39b48b84b80db83012e104174d8548273878253a743198ebc45b7d7eb9697243c55ec20d149c253c5ce44024e9d8d76f737fb450476931cf783b76d9352ca21f0bcbac76e9e7bbd44f0bc422aee38ee66dfaee64447666a9776a8043711b48f63fa4f753f87965ecd3975a6aa3fa7ced48913bc46d2b3628ba99c0284e54f97e9eff528a1995047ba2d91acb5329d897a8b7134baa854839edc969834f1ec9cde679f46565687b2fa70613356af8ca4ccb84aceb0caca6bc8c2e6caaa711a19a9d5abae49afec8f13a05eddcbd72741bdda5e44df64e755d6b42140d6c46709a9f563ba99930ce849104b7a60c6eaa9846459e2c3a4c35693ec2763f520c36a69a9a7d7b8f9346cb0fc8c9b3f969b332758febab90575730b5eb94450ac72f3c60496ff4e5f89498bb524746ddc7bc82d0ce9c3a742fb89c096be1fa54f13ca870904fb0429a6271d05354f51f311934229e5930ee5b4893652dcbe36e94e24a6cdbc0181bdcc84993651253fb2de08c72c9294813b07192bf3c998b43a6cf2e364dbe9db4bc0607f7a4599b0a43aa94cb295b3a7cd54c9db4c988c5565a6854f077083ac9cb1b0fc290f9902a44203acd4216d9a1e3b1e38ecdc56fa388b61114b1a0de05229e2524d8757119425d8f8ee229919e91513bdaabfbc2ca7575892cacac1098bbdbb77efb846eb9b3953759de56349efcac2137b28bf5e32729de4c47a67d2ab2c6462945b5b915850a7c30b090a5877588ed81c84c3a573e7aec4a28c9660afeb7afb7478fdc6c0fe7ad5c9aa8e5775aa0ebe3c9c5e79bf5ea1e895fdf59a6302c33a21aef29079bd6e116fa0c17006e621f37af5893764200d8643e0925e5d95d5e13577264c6545d5f51d7c6961871d76d8e13b649939f3aa210b2bb178c55859132606bb8957bce215afc8c232def8d8b06a7a5a39d815af5f31c6eb25a0d17683e54844422171b72592c974996e1a894d328dc51863bc1c8dc473939ce763433f37ef9f76d22ba0eca6574b6446321e2c5f9974d5a948ea0ee912a557a6cbd79eaaa4b2ea92ead3abeeb936c1f2c7b2a399b9de43622cc699f84d765c8624cbc9a0c8a6c874b29dac8a8c274bd2614f873253d22a79b904736f2991da6a7ab3e950665564507498d3e1141dea20c9763aec0cc70a3bc1306738585e86233673db8d56b3c52da3742e51d24d29a594625d54d993d65ecd896599d64a58180bd67ddfa569217995acada16ee648ddba4749b3ea63ee9f7b4ae7f6a45a91e43fdfb192d6d9928a7492a8c29e70bc428c26e01c794236c82e2e963085cf6699b5359e7081052c99cd380b464eaba2ce0c183b34be275cdca0c250240c48ccb04f94a860050c3e2c4f7860029520d493263e3178569e20718294201d95309ce09cc2e0f9c248c20a4c4140296104a124c6290c1c908074630a03c7042863d894c2284112232052f602061949d8cc669cad99a2470d1214fb92797102ef25e665474c194ccc9401455b309e50021d2b96d80143073740603c6102303a8033e3859e2fb6b0c40c188c7cd104234f6e5430d3859b2fa86062860b3b5f48713343c6cd172b4862260c3f5f78e0043d36c002a2c213335f68015511c54c1835402a7862e6898f8e2fae8a4d23d785553afb65474c0e3a70b4c24908a2c08556d7d362a00077bfbff0c205672e39cd851bdccdd38225ce26108ef12d2b940f357b7dc4281fe8b1d3c730aee25951157db296fd89aa88817802e8f86ac1f406a977023fd644046b73a5b0b789aaf92cbbc06c373a42409122178dab0c3c820a628581475041c85fd7ad210b365b3c6d70ee1afbd5643986cd8401e2099da88a3b31b70d8f91277aa22a62201d54cf060c6cb6980a3ec0d900962fc51b68c0f23528b1f96535e30d8de5770449dcff2abebbbef40ff13419d081bdb40de617ccfac12a769d4d6577d3a96937bac4635a379dddf39a42944d7bf5bf5771d22aab3652c1573ebaf4ffffb4e514fd95059a13f6c2f10a2013b4803a70edc05a1cafd8421846c8b62b50a1c48c173757c831c115545082192bfc5ce1034af878c1052578bce0e2a60b2f94a860860b1f2f729082991f235e1869c14c17412f3b6272681c1e2b4605c216b8c03973c1d18a2bfc64ac2624cd2c7e02d4b516427072c9ab9b99320b210880b6168ce0d60217b8ff6de1481696e0be0e234e664086d5f1440c58a8020e2721c0f4d336810527303da5385811348a269c391e2c8ce00a59e02260afb7bb496096989481c05d9659fb7df9392482d35d0188b4e781281fde4fe7c103e989e06dce8e07efa5cbce87377a8740e04d869a1e47db06e6eef129f794c308b6444da37975b7be7473e8909ef49d6e9df7d82370045a30db2f7f1db78121f08b1d0f419aa5d49714763c1e469fcfec6337e3658947398be1d9a69ebf1b22119883bcdcb8366eeac670c19b87c09e2813c1a3d0bb4ce720b0779939ba127b1b58badbe8cecf1c327a28573b1f8d475ba6726de5333ee32c47d5b0df6eef7d13894a17bd4bf9057b236fe48dbc91e779df4657f4d23d7d93a713e863f4ef2390e5327dbab28788b9933e8ab847d75e9eeee85a992ea5fccb5ce6b0fd4ea5d14db7a543fb94fb5454894e25d1472d1d8a2e33edb5ef6e2ebd5f80db5fa62de89dfedebba3796b4f830c9b68c5155a58eec0d2873b7ae9662070e9b5fbc1fb28cbacfdbe7c5cb2cf212e956427026924a600101a892de8c39ef48845df9a1b5dd1b76b2de9ddcd9c6644b77703334a04168008b68f18881ce40557a006b660ca3bd3513e3b1fa6a35c76a79ca58cbed153463fdd340233105874eeda92112cca43fb2f4c99f6a7d0821908bc957ed95f5d0f12ffdbcda35ff0c76f41203f0a0884c6ed4b37c84ba492a844427d9fc874292c9d02a62d7cbacaaf9bce72db860a2b31e5a191e870d2b43c64e9d564a14975586f2c4290125c6f7d49c483f4be2cf7d1653e76a48b6ece300924827ec5d43728138a8585c5f4aa72539b2e8a544dd474691392746822a2d67a520581d06798f4a62450d6d38c53e9d4046622d81401fa4d745a6b251981ebe91e99f1add4348ed028b1743867e4bbb0d4d37f473de5f943f5f77a514deb5751278252fa150a02f99ee195eb3b6ac807ae804326be4014d8fce127b89bd26ff13b81cdb3064f1b8260b30d4c8ffa7514e9116721159b6eff953e4b4f297da5f4195f0a2caa07c5df7d6800e70ce00f8cd105854ddf48d76636dcc09248263023813e443705893ff19b3535a7cfcf22bd221df5c19876e0958f25a58f859e812d9df4ef32c1f9baa39949790f893f94caca7b488cba4cb70df77d9f299f97467a75fabcc49139281f289036dd74599e0a5b4e7707aa91b81fb07d03b64d0e19d8124802730b102ca9f076f7a5c31c42b36dbe960ed80bacf4fbe8f7e195b6f1b38465003973045b4d60730cb673d2d6c2662e268b3de3b444708c0c0c2637a5a0020b98f9c9811364d7ae85b2a99ac084c91ed240d4f753c17e888ead982e88e66104111ee1c523a7123506d798a9aa8ff4461471123281d3097c406631f5130c84de747a4fa79b4e7fbaf4d7a5f4b18b725641228117ebd775786173ec993ba73b7984e8b02e2008206a0f24148974fa05d4abc656dc5c3e4ceaaf26d7cf845179fdf5a4fe0abac6e855bce20b49703d56d32b89ebb122f5980de9745dd7751e1a5f32321d56167c95388c0273b1a6aafe0aab4c8735c7e42083728760cd672430dbd33d1f3b87b8a6aa9ec014d2af3b733aacdfe52750afaee797acded3a6e870a7661605cce14bfd4622819a4e87f52750cbe9b05e0625b41c5c7f2db97c2ed6119b2f16f72b9f7e7d3bcd9553de7e5df77433e9282512e9a35fa7d3e92730cbccd1a531029f4ec717cdc4a7232bdf36120a3c82022f9fa95ab9576baa6a04682e9fe8722de9b05eac0eebe9a5938ef2eb843222fd7451a352e927d209a57447449c4ea76f271008e919de4ea4a38c3e64e2119849200d864fdfc021139f4e0003f4eaf4fa1e80e855e9f541f40a65f47a217ab5bd76df2877baa66f9be4aeae479fc0dc4f4ca7dd95812930fd9683e94750607a141c4c5f6202d39f326024034b607ad2bdc1b4ebd1f802e315bacafd6a0eae4fe96e8eadd88408ea4d2020a49f6ee8a71bbae89a28681fb3ba4e8fdd7592ef4bbe49570213478c6dd7b65ddbe995406461205bb6f18a2f28c1dd49f4f202f390791a0c979ef2d8fdf0813d74583f64e212573abdb3fbd19df4ede226bddb5b96b039c4f5a257efdce8a6d3af6b3abda7974a27ddeba64b8361d36937733281595e6696480f8d4e2f3a290f99985ef4d1a5c13005b37d0fbde22cbd5dc4d84337bb6a965d2c5caf8a02b2f963e955c459dbc1f555e35931b2f5e0b07c4c79486cd7cea9391326620147a75755f42a2ee955bcc20b504cdaea02193837125cc4c371b283733bc1b995e0c96a9f6ee1f94aa3cd44a25792c312ec9c19b2b0b1c31d1df6ed1838a7733a9c6d63a7b5b15c186c7ccee80d09b698ca590b4e61165cea1eb19f09d3813d46abfa1c07b495b0a0104b0d6e1bdc6007c5cc88043ba8c33e473b88be87945792a01e9c6f4b1f4b87158a9a5371329caba9cfff1b7c051b3b94427af6181dd44f72d4d8f929053ccf52a9162c200a86af2429189830670d5087f3c93b6c2909a1b725db21865d1ff64cc5059b1b68d228e0f98944bc41e29965df57636c4a81260d1cb5587204a6375e6b8ba92c9373c2cca067803d3e0ac15c4604d3ce87794c3e60889c1dd12e4487127b83a80b3c127a4d69d74e55fd3d818de9b0d6cba0034b8f8110e85036ce18c0580f0c63af65e007597b81324461f34bbf3ea62a0824f2006d368241faa1c41e4002e72c9ce245c8c47285525a4121934ef92113cb970d6c3195576a30fd579e602b89447b72342c8574905c97e7813dea3d09b0602015943ba004c1607b8e60e11cca31d2abac02847182a88c3d459898c248cf116360161c7b8e68610fb470ecf1000bdb80638f0798c0a1291aa6c80c3c1d39146f59d6cd7014f41e3e76332a1c5c3dafd6476c6ba80a5f809e74483d3013c92cb85a0bc6baf180f2d1611ebb202c8f19de436298cb34e5a155d01d3a05d56175489768ad0e29939edb9292241dd26b55744871a8d78687c3a5911a8f8dabed8494784ad8102bd4a3eda838c12d2a4e30d580a66a49c867c214e9008f1f711e33f04edfe5f4ca86d37753f46ac7e93b9d5ee170da0280875abd92e1f4fbaca43d51d5f9b0f17a95a05e5510e5838e7a1da0901fad0274753eaee778ed6672809946eaf8f5aba391ad9a9a1aac03bcbccb52031bb1918e5faff70ef31caad1e1e5d0715139aeeb3a74783a88b8aeeb362e1b33d47b3a3e64621d609ee136c02113cf001ee1716d27cbacfdbe873b98da67ec06d37b44b05cd8eea657322cd12b1c8cf4ea62a2c351b9a1f4975743d5aba004ea90ca1f9b1b5e431656000f05f09ce15000cf16870278fe70f8d82a55ab540ff5cc9898979730fcbf6fb6e8f0fce1940ecf16a77478ceb00e4fd1f01b376878b6f8060dcf1fbef17abfcf5a19198cb7e3efb3f6e5e51e13209ad3218b4ed1ab9f9eeaf44ae5f41449af767a95e3f4b48a5e7da7a73cbd429dd24839bdf469399de194e5f4d249af5c4e2fe9e5935ee9385d393d8f2bc3c5e1963abc6ec3fd3abcbe6d5c8e6fdd0cea5b4733f3bd87c4392ed31bcb655ac76337b3a2a3e5d4725b6a9961866e6686cbb48d6ac37badb536be5ee765e39e776db2830163871798596e37e9b03e763d76f8f57a95dbad0eeb73dcfee9b0febbeda4c37ad46da00eeb0cb79475589fd272b90e6b3dcb75b92c1dd6c7e8b8a90eeb576ed83336c0dc4f700547a7bf2e0e56f7e4fea1e1ea70f3ec993f985e0037539b1e1600dcbc1569c12f376f36981edfbce5607a999bb71e4c7fe3e6ed07d3a76ee66c329783e9c39bb91e4c1f804bc48eab5dc3814252141d2455f46a87d0719c5ef2c89e2d0761c1f6389e4ba9c6f6a1cd99570a5b308ed4a5913804865417c7d5803aa413c061b69e05bd0960204228cea457d0bb2f2f540c208c711d62a2c3909111ce1407a1837eba6d0f9407e0a91b80dfb8116f371dd2ba4494692d480b32e2bdbed4ab1a3ec3ab91a9a2f51a50d680307da20575484f030d7fa90f5f5460eb4b88060d254858a19c5e6515273abdca2a41a11c95315482a650828356378fcc6d11ca71808d57744107d7c0f18a2edce087efe9c00f9601c72c923082b738848d5774a166db86c0048e57044181e90ed692504fafe2155d6882e9434a7a2531e591434b30e5b8193a1e6e0891d803730570bc1e87639c753fd40be02a4f7a2580d3ab00a93809d9846c629e7570790640cbb34b8e671b3a9e67c8f06caa11a6deb0c32b986d98b0b588cd0d377698fa0e17eb7ec05cf521f0f163c01c83ef02e617fc163087f839c07c7c1d60fef065a0b8eba1c3f1b76de364c783cc431e6edcbedef0deb54fdd4c71eaaa9b25560d91e9f0d26038cc5962ef3233a5ba0d979938dc900a4788890ee975088f7fc3fba6753d645eb10d6f37b932de3dfa1ab2b0a967c94a9da7e7f4d8a7a79e82939293927aa867c2c44455ea34a61e434c1d7c9ca9df54ea32a43e23751d37dff7a5fe3d7595d48f0a90caeb4d7d25f59ce195d45774be1c9b4a1d85e3f9c32c389e2d66c1f19c6196c77896876a7ae59d3eb48a9e0d1f3b1b8a98d80103d77fb6feab146ff5660ff3c032af219889e0f09ef76aaf3a9829b6b373046274f1c06cafba71698cc0de65dae2f0d24cec1de1f12da6d2660313994c4741b18172329d4c26d34d39ca1d813652c098ba9187ccc43a03cc380bd6f5d0279d7ed3387b4fc7ba03483ce3decda89fc01c9cb028b07b8340669c050412834a4681415af00c9004e6202d3886c78e01acf1fa06f3fd6b7cfbf61aa86fa81a2c47adb01c5583650585a24183c6b74b03d51d8542a1cea1380e6052f7d0bdaeeb48dd26b9d9f5a05d105374922a2a2995d148741a753328301781519799a84b53840f0c03e98e65df6487d28181c90766222d3908cc1262d4fba530856a168cfa52be920aeaad02a6dc54baa89414149851cef2d25325d1572e33576e3ccbbd8e7245ffee904a3b1fdd49df48b26340ea36bed9b86cccb8f72d555554522aa3914a0b26ddfb8c9b8934b68db78dc38248dd46dbe0b0f72d753f55b2fbf1a5ac3ce5a49b2797225da6595858584e04a350df572ecb45bdb4725552bea2024e25e40c29ff6eee164e79ca09a41d8e4a37c760cf070d04d25d661118a4057760e8d1620d6400cb205af010791b1c83623fe23c42d78b9099d9a5d7ae872e6d005c8f19988ba8745e2d99606becb6d96fde5db9bddd754fc9b8528bba7b9ef7bee5be72f38813711d67bb7b1e4af40ecca81fa373dddb07d73de222708fb8eee6ae039b0381a85c040249792764aa74ddb66dfdee5bb76dddb675dbb6795b77db45e9baaeeb8e6dddb6d91aab8542a15028140a85ba51a2f7752f141a755dd6dd9ce16ed475592664666bf1e48860532f3067d9f523d79bd04a45a2c3cb06773f32305f00085fc7ae0ab4ea4dbba0de9081423afd94556e7a49b47251ca7c1629379f45caaddc823948bde12ee23e02ed45a3afdcbc8d54462a236ee5de396efb681b157101a06da4f29591ca4720109577209094df20564504a63cfe2ba59c48a652c95a12e9a193481c47e2442828280f5d144bc6766ddb36cde3bc1c9cb0ddbd9b83d41b118db2fb516f303712e56a83bb7ba011596fbc9c0b00d59b7ac32d81de2c84c54d03f3755dd7754ddb408baf2b0aa95546489d528c61b37fd7b42ee52ae748de479b774d17914eb760a6391eb2824d28f9582412894cdeed2f33bd5c7a7cca51bceb3d7607f0461799aeee07d16d96590ba2502aae400d5cba45010b400497c03c04b68f78083cba57f2523eba7974d328e51e0824e5282010d23d21157bb715a780229023759b0ac769dab72ddb344df3469a48f469e0f75dbb9f1cc34a7b29a5fc107854038b6ad0a03163060b0b0ab5b2a2a2f27d2929a793c9542a91482828a391b59e2712751dc76d5b28a469598661d7552ba573769f9e920266195dac28ba4429bb0210f92bdec0ec43b4b010fa49138fa457a6121b5104cef142fa9212095fb0a150e99be9dbf70ff5949f54bec2dd3bf7d137ee923eba568574dbdd721cbde828a291e824d4c5715784e22e0247a7a41b81b95fdd0fa35b548772d1233622a33ad0078ac80823b03d7799c98950248bba0804827a070251b927a4310a8c1d7e1fa93c7ee5a4f299524e2793e9db4d9b356ddbe81eb78dee99b68cdbb611b759afb481a5d2b75b02b3c49be56e377b6dbbec66eca6795fb05dc8bbbce78542a15048147ae8dc48488b4e22bd7b776a45606e2c7a5604663908ce23b6cafba843b9646012091c224537e2504824a25e26a21d769769eef2a1687186dd5c8411387e52215d13f1c26e0ce52270c51a9c00ce7e15813330d72af10f1eb25f3fea2f4ac19ecd822dc8e6ecccad67233d94b2f2d34ddf5546f7b6d145b9bd5c773fbc8f28606fceb0dd4497fbe6237628baa3d17d742250f4f802acbcbb4c6f2ba36f20f5bc7f28f73ebab9083cfad5fd60ff6dbbdc37793d108890892920b1e8deb90b44c8c42290c6478feedbb98b1ebb1fdd36ba59b4ad1c05e47eac7c0381acbc03817cf72eba42e60a68bfc7ab98bc2fa5f47a0fcc279389e34aa51277ef9b57d2bc90570a7123ef9c4722bd921ebaa17ba79e97853ebb192f943d14643910c876eddd69e763e336ee02d936efe62c178151e75037b6aa3b77f3f551ecdcdd0faef326127117e5dbec7c8cbaf3e1719cb49d8fd0bbf5c0acc3eef21ba8598cddcc1581630d96691aac8c32ca08c242faeb2e8c4dd368671d98a57631cdfe10026bcf3afaefd3b04d7469ff10222504cef141520ff5ccc21323a739eddab99e6d72a10e8572ef28ef6f28f7f496259bcd52ca47a78f7e753fbca3fc30757783a813e8c30492da3ee56694a37c275d1cca7799b6defbf49485c0f657f7437f64519e8f2d0a8832dd0333ea07e928de47604699401fa41116028f6e517ebdd6ae0789bf7bf7bb05817c2781404ab7416ef6c02029fc81a5c7a33a5be256ba8ee338ce7a96b39e4ae8aa7862d84b6ced66af97c228f76e16027b23b06feaeed1a84d2c2c2696d2bd9bce628af7eef5d2cd4152d8be3bc9da4b7b0dccdcadbd9eec7ed8be281fddd9f9e8a380b1436b3b14bdc1548729ad67a6a4fc5469af045bec8de523628bbdd5d8626f372cc182261e53f954c05d022470730cf07064956009892915763ececf8328fa8a354cc138bb035b4ce5520dee77a4af998d8d9dde1cf50d9883a4c2b6f1802dd236a9173c44939e37a41e5b0705e7d6e91bc84eddb641c459a2c336d2e1e49955cc1d1d47a233854d919a31829e502374097a230f45877d90e248ca449316139f25f3b14340e4e9c00ead9a1a40da9aaafebc39fe103182a56ab272880b7533df552e2955ae7bef45cda8918244678a28db06f186d4fbad136f101dc15e6f726320abc8f04c323d2cd82983dc4035beb099b278f03525cfcc94a74fa15fa04c539f18ae182e902ee9b06300290be7b813bcd3f4c5696bc2cc29faa2926219314de30b9c49a24bb390508265c0f1084440c245bc6103f1060a48524edfa4953414ad67d28bfed0160c6c151389ad9b9936b3484d8fd141734e39e56396faec89e11dc34d31bc14c3514eab00dfafc10436d3560ba8d6b024a64d7e9cf4ea49d018bda2e0eca14d6828c1d21f90b63aac21092b3fc1c933773aaca2c39ed771354c5be8676c5ca6657879195d5c543870e4c09103878b4a9583ba7c86db387dcb9d4a5ea8c8b38787a9a4c327a7404059d22634d44987f4e79257e60cd7da84b6723c9c3d53c9646d2a49030d2f34bcbcfcfa0cf4c2412f0a87a43e98366116e9904e2c4462da8a2efde622baf4af0ba4970829e5710099cf300e97cb3b7f4d9006c32ec7010e99d8059c361df675dc0beba8a1d3719976f9a43402f3d771dcf8bcb37304e2751cd70d298f27963aee911abeb95c361cb101a43f53d5b8864b81a6aa2340437fa20b6d82437e3ec7556f79a62dd595e3f2a2ae392f7348d5ef9cf3870902c9f10c8732803e326c23c75517cc39401a0cdb78080e99d806d863a0c0023d91df1276be67f6f40a451f9bd09f5ea128485b11ff4839031bc3c1e7f9c3e2805853d57d290bf73d26f66a1c366ebc87c438be852a99ae94d52b1cefd325bdbaf13ef5e9958d778ef7fb49af540fdff8ba725cfaa3ba34bc14c7a54f2e0dba748c147851a9a9a4c39e2970f67498430636061004730bc67e6ffda54da8934b81e8930efb332e65b9748c5b576eb5a9371df6bf5b97e8b08613db38b74e0a485bd7963a9c3d26b004664b0251c0106d499f0e1be35a85bd31ec4604de74dd934b38774f7ec1b9812a6d112183bcac66afae8b5eb4ce473a1f6b7a55a469abc39e3d1386b6a2aa9f65b307f704b3a5ad52cd4baf763622b08d086cb381c7e6effbbeaf3f6e53d283babc99cf957bed66b26ba6e6acf6be341a305d1a895150b650c759e9a4d5e1920ea74f0d26b0f9c3614ccd0e39067e94411d4e15252795cb744aca6d66f6433dcb6347b382571e314551d447228902a56da8e4ab576b93982a5524020000004315002028140e874362b170340ff45cf60e14000e829e466e4e188ae324c76118669031c61802080000406040866ab801c0f5ca7f2e122ca5ad7fdfd32c7c813cd155c205f4177424226a9f2df5c4c303deaea5b21d67f4ab0614f86ac59d4b8f602307e455c59e16fc7a9f7a3a1e3ec1f19ce62dfbd434c900a800e21db66ba1c1869a2e655fc0001a0b4cff8a32c1ea02e562db2baa4d10fc5818e04f007fe75b62250b23a5757a733a119ca405c28b5ee7cb4b4539b771cb2f478343c55bda17ba29e320e8dacbfb1604d05b94cbb2b3237ab26cbed908b2d33922f3a74413144705750ef692a5536b06dc80a3f27159753bbd41751979ccadf7250fe12191914fde4b5195037248124afde92e654392d41f97e577c3f826646e24d216cad09b16175d9d61fe6d970574623fe28a06cac79db2c249696ad12e65d2c083e569fc16a38eb2004f7781bfdfa44236310678f400614a0b9c5e28ab5f0ed976f94edef951a222e07aa13999c1695fd191796204e6d7cddc057e71adf07caab029f10d59ee8f6715f4a67bb811af7d17cdef6cd6a12d3293ae43a3f1ff33962f4f6bbb6a7275bfcbf0349e3d42061a985f34b9264b90e96907ec20513091061618c89b334d2e829669278fb2175657ddaf8f9418201421104fefe25b55b1ea083fa899a7203528a2396c02e53851d8cad390375bda1b190c312a305e2e0d4c209531d6c3e0ba9c5def659ae755561c277a22a6ce711f369bbd50c03d677f5e4a681764146ed6e885ed922fe86512165b3766b548f1d65db01441ecae1d00094ef2702df2c11da873d8d45f45ef5d3d6ab6cb6997e71a1e57e367231cae28424f1dc02e28f29b9a4f46266657021c3fd64da34a98e2998e88974ccde34e5b83e62b4ffb2e3a79691769ab604c0cdb68526b4893adfb82e4eefbadac55c6569ffc5abdbbba5db475183abcdd685f3dfd4ee03706eacb52c170a943e3c1753373d620f7b28ec5707581edeb2e878205d6254e108d4dee2d3540b94bb73bb38a2bc5c6f7b5798447b20006647a7382b61006d0a59983ea17d8e2fe01e76f7be761945b8ea02871f8887467f179e27e18fac718d4bee627c4a2f2548e920c8421d63276ba4e0056175033daffb5d0df65ac3fd75e1797b79b1b643d6e20787a231ed99579e37dad4ef19ff157f5f1ac44918cb2666f0be911adbaeac7fb2ae82eda0e2e68bc133c19901a37f73851edf419f044f81af353f0cab54d4296c6d9f4a042c020103278c7cfd6d2b223aa4742339c2342f2f95f6bffe1cd91d52fd66e4371c897c520940f8c9bd37b9010c48a001d9f1045c0228c990143029dc05902a2532bd59241c28c598d3346c07085a6cc6471f0ecca01ee20d0407a395867c024731a969ca9c5e1c8c9e6d599912c942c09398f967881648a0fc70d91ac0b78a115f569b8ebcad3e021e336ddc7ca639b07403a07a0f4ba4e8d67e32d5ad818d543f878498b403d0d642ae3d8d30c7e04f54a7051418226aebc5ace063a52efae3e90f49e5fe6728c3368c6cf930046618e923a8b6e6b11f1367563e6a764f3bb748b7acf1b1620c229f442a01a65942eb783cde74a85c868980df634d087a2006aa3e7f31962f8d8f6d5aeec2a4184ea89f16327251042f80b63f7dbc690cff61c0bcfe528ab94a51d39420b3ce531a07e1034858e8126bc2563aa76f42b9a7577c26b454efcac195ce260d2013fd089ba349a83d64bcd2abaf398de7c57e5929ecdc9b868a66062e365e8183744de2394dbb9f4174f350f041535fb4b391386d5f382082257694a6025d01fd897a677c25ddbc0d0d2064e59ed8188a71ec34d32c68eb8a58c2c5b4fc5c17df13087382d846d2672c11dfbb1102e267313f2784b94ae00ccb14a859768fb3918e6f02bb775b1bdab47936d7aef604e2d001fcf4ca0b752bd98584374464ab6d74e221cd74e30930dcf9834d9426de174e88161be3b6c9cda57b077aa71a494aa7189986b44d35efb3f5a1e26b2ef1ba3a77db58f196b96ffc5caaaf6c62eb90638c446c898e48c9a15b74f70486035c1b4129407062092ce0f8328251280f38e801d0f5258fc7f87b366679db9a548d8db35a3b727756fceab3f2a46c2db78e4639f95a4487037be87905a48fb20ec8f6417c13de47720df8b603f92fd487720df07712fa2fdc8ec23b9877817c41d917646b213e91ef27b10ee45b61bc96ea4fb90ef81bc13d16e04f6113c61d1059dc20510945adf9d477ab8460a561824ce9e00bd6c24e217ec6a1ad130e0e7f585945bd061e099bb4c3b10037b05fbd39412ea8f1830afefa993891fc783a99c18c0e4e4eeae8bf8bb782cfc6a0436251934efa093d671157740625cca49fa165f126acc3d76300260f1a6037b87ecd0b4775d3f6e0d51ec6966f6aa9b9c91e2f9bb3d51712f6cf4189e8ad53631294985cfe0f0fb86278f3ad97bb75f15ca0843da4200d78b028cf35e7c020a834b8c1148b03c32824ac6769019989200506d307b1ecba1589b56caa3c1fe31831a31a2ccd5d19ecb0037f086b12185f6ca1d4dc46ce1ffcba7188634b36113bc3824a5c6444c7fd5b84230ff2e756a89389ec3d5e5360919528970f7f99433d2a6ad5c965061f4e08e27e2532ba25ec0b8d11f80f743f87a5a42e38d14aab48990980f0225ea9a256c1247ca192af38ccb201838546c096a9ca5c64b4530283fb35659782dfe05f9b8c513540479943c63689dbab4e8dbecf7b99eb74586d7ab79052b95d6f13a34259b110170714505e049beb37934a8d9a30af31c3166818c58a766a8555dbb384f8303b999f4fada60ffdb7e3ebf6bf862a2804cd070b15e64cef282b912020f5bb9fc8711ec627600012ee8006c34b04b0c96d730f0a2d4092d1aff07153004f9f8fbfe6e5fcabedf3c75117838ef51d0bdc70726760306b45c543e5ba909f04608915af24e16ad04a96d32b8894becb28ae4d93c3c36d22b470352a6587aee717409d6b7ad81a9a8f165541c043cc5f9bd0a7d7edc8aa6171964de998189253fed1cbcf358dada9dc77287a3d911f32d9b212657898df775c310882984cda136c391cd8865aeb59a9e0aaeab512811caf5699a7b4464ed569258d40131aa5f27a1dc29a7036848e27806b25e144b5b32acfe3a37e45e7a408e6d6ab9524610d226573543798b8aa0178913a054f1e00247f1d612b062f53c95ea9ff2dd09e44c6f700d75f3795f339f778a30e4028c34d36b852d991bde826c58de5c1e06955082841eaf02f74b58618da7e555ab6f67339681a5066c7b6db22917ffd934aa1d98c368eb8d9229ac52b85771314dccc04cbb4c8f1362336ae7e85eb1b09ceb656cc6acef46c02150ce25f7ac1c6096969168633f1a7865f7d46ca4d71e1752c75604878b82722b309dcf88f1ae59ef68c4cb4ee5ac47609ff34ccb3aef19bb28da30e38bb73d7f94b90ff3fc5d278d806ec8a2e8e947d9726a667ba52e611dd957aef47eb606d643f612778057c7ab5f82b29199ae0add0f301d32244c63128bdf39db7572aaf47cfa5ec1b963c028abd9a0f4d6282cc176cc21bf5adc243de7234ae2c27cc26add9e41b8e4872b6d2b80547bfea4af3bed414acf3bb079092d1dcb3c9cc540eb59d1ce649b3a2b0b8f0f0b76d65826ddbbc78e8ad88036b72910da362b1fa10b4588bcb0c01009270f8ae89c7f8789cebcc9a6d70d3dd90dc8fa5c416afcd469346f38e7f22f9e88bf92dac787b74347b6d16bfa1f4decca869f94cdcb1ee8646e414ec1768eb25ac69881e564b7c35dd8048cc711ecfa887d432a0c561f0bec9acd93aa2d32d48f45a05bb44b08c34507a7469ecd93d5dc1100c27dda389e768d4535ed904ec6349ad669478cddbcb3629bfe2f55735e7c8e7755de67c56aeb74ac76aa38b0971f6d903b76870c29d1aeb0ae4176979c5ccb1b1543bac86e5508f91df47c3ed8d8481d6ed473b32f0db2fed71cdfe2995c534925191676e2c9bd7ca242efd44bc75dbb557f09e69140d7eed60e7573d95de11131367c6a998ff163b2633eb4c2a47f12bf9b830a2833ea15f89a6296335b0a491afe9a508a45e9b12668ef69771ed24ed2e2d54f97ae473a213fc7ccec257bfb690c4c996c0d1f1040ed42bf323e0380666bb9e3fc27705fcddd313f6f87f344e30f5a2a4580e8552ecbb8a0d99c6e384f2e52977ddd1d34d27446906631d6967f85195a9635a54ddbd4e17514b5a77cdad350579eb44a14a72c11239b76beb06478728b627de0be93a35f5e5c99bfdee672dafcce3732a13e83eea043a779d2ae47a08dd269f01092df749ea8eecfa0dd64929c0ec7987a17b21f8d8015de90f6b40f82f43a05f8f752a36387cf92216070721494ee4894151aae2ed009a420793b88a25fc712e13cbbc9e1a7b26e87c09a31d7a5670bbda4b66def5fbc4075feace7c0968837d0ceaf37a522e9ee5b7c52008a1d49722b54d06faad06d630985f20f713816fee03f98662d3c10473419cc94ade3df299757448cc1d59a623bb08436edffe53cfab331d5c366efbcd081bcb05e0ea3d38c06917f497ab26e6a78b422a49afe68f947188b6404b3929223102cc976618a6a299925194155af0f5d19b9b066e3ebaa3d55b9e48cb85c38210f56c5c363f3a4a47b98bdb4203c3e9c30bd79c4cf8048ff67ee2eca53142c5f391e4c8244af47eb1984c856b9c58be34ba2229a8461a469f377d0a44dcd6dbc56afa6a98989ee66a34040dd73bc857871ec82f34f57266c3a23524b7781fe9f245afe4ddcba4ecd5dd9d4fb7aee84e08f12035868d6af743267f2a5f948599dd0e52c604a53cbc59d109789fcc369f35c8b22b53b3beab3a9c31bbbee082183434120f9d8ad44b1e440ba5597a5a8e73400e6e0e238ffe7bb1407aa08cfa4d8492ab4d76ba91c8967b6f73abb91b3fc7dcc0ef354eda792e5893ded667f8b6411ba8ef968757ba215ff01aa2a1e78e7b123a9753b631ed1fc135425ee4ffffc4992a17385f2023b167e8146910c8b6c7ffdc46e99e99316691bc40e041627f87e05a491c1b629a273bad5fe75a4c7a91415735a3035ab2c316eae2e2f03fe4c496936ed25d3aa188511b9e23a41c8c1ac81a3dc8c001e6aae57cbfcb36375f152e5df74e933f31a8ff86194e8d0649e78acc210c5962c6fa3c379f717ec4550901763a19322e6dbc6d58d8b37d8b7cf7a5d13f7fe16672041e8afaa72f376e9ccdce277f11551b9dfaabfb1b8381f36768e6eb2eb7c20dac143edbee44869c7488f1daab0fea9839a5ee5c265190a9c46f24139f7c246864633cafefc963d98873df41326febdc1037756ad83c5c56f57f494d0990c4db2ec535d401dc78106c468ad4232377138296359b7d5490b7a79049c0468acec984aa6c3d440422cc32e79a8068c631cb462d57901c6495e8e5923790541afc225b1774ec230b5dc533ae7667a9fd5eb02916f0ec978af4f9e861c01b4a8e2a147ceeb04f01ff638f9adcd8db789911afa08e0045081e9e15be708f90548c4a992d8ada3489db3c72ba51435ee2059faaa17f56e360451d499a0bd8ea448e90827b097813cd25f511f78936307cd46e85d44dbacb531e9302e6e12eb7b39428c394435501a37821e506a3e6ec3254a2414c8634a6a2df646238df0bd1ef4b2d2fbdc0e0c1dbb99a0294c2648971db68bbff1d0c63a7a3c2a13421cb1a910fd94cac37a0de4c1751678343f0368c026308c70fc953001ce1e39fcc95ddc34b2dba12d41713ace144289d3c73d821b86670766b93d71346ccfa49f1b35b9bb5a11adadac7413a693b69814c38c12b0948ade791056fabe7e3ab92e68ff4762bdffee4def4bde5ca3c7362b5958c18809eac2d90330ac27e02b5d19b62f2e551cae8d1fa06848d22dcead61773ed3b1eaac22c1baad088938dc12f83bb5390f2a88eddcecb63369e71f86a2a76846ab0ee328a6301db96d2bd716070c20fff56ded9f33911fd66c62ab07dbcd9a0654e6152fe621d97069dd05220320488871cff804ba8fc967f3f9d6608f4ffffdc17a7832b7563618206e11391972afadfad35b7d078461ddd454acd3e9f0b1e2b24b4ab53d98894fdb0911619140f5dc5d7f6a2b68b2d03a6e19dbf843e7d1eccacece6273008c3b00a32a3ef4308a1019a3965e6495ffa5622105e27ce519b8bb8c1d8ae244b5de23dd614ab00972e97416124342e8953ca447d0056844f87b36718265c93ecf85382cd835a67a5c876b2a1435b243e02bbe00e56c03cf065df8b7c08cdd518383125da3c1f78a978c55530e03636c6db4cf79cc067d8f5b21727afc2c14049fbedfbe4242ef64e282495377b874201f057ab0f46c96077c13e0c3b0e9b28943d8daa7fa37bb8fdae924edc5d3b30e12ba6ee970ad417a3a42280095fc865f4ae1f320f39e2050205b2a2c3e03fc50992557ebac488ef62912fe0925e2c86c6a6c3be7c189d2965d4d214069714942560e0df376f2b13b843f4a2fc61ca60802b0fe2cd2044a7ed05672d693a7141c1b38e74f5f33be0fc817760023ce2d0bc0dfff4fe8b729cf8688f2804a6c35e2aa89191b6e01151f031141f8e2364ef515b06d5699ad93ba5f288907c10b33fee0594b1e4d4684692d1b267260eeddd2e3dec7270540a3c459f2179368d2966d8a7426bea6bf5110d97b688ad4034ce99c982bd48eec33ddced5a8a1a3d14ba0316e272d60ef324f5c180aab0aef40c0ece295d6eed4e5f7db0843faaba6eabdbe0e2a5335374cc6391faf86ff86ba52194d3d63021f44fa88283492216b54ca8a6741d2cf24e17e1988b3220d13a2364af08d329b79071e50c178255e1b3241d8427956842e098ae47155a44765438ce653d35c3bb5dfa4978245554c2ebba913d6342038807757cceabf437970662bfd8a440ff7c52e4f4dc795014d30ff8e808a6f2bdbe6846b3b8ed6fcadeb8dc3cdf17092866de1a7686bc254a8f20b0f2bea877382dbeffb3ad895cdc3876bd85839f2dc3a4d629d8c6cce0fa3b153417167a9a1061272d6d3dd9e41be90bf05f9602ee89ac1f5c9d9021ce990431e38d0961673d9afa45dbcd2e189026ed3a82494e76ad6e2c6de1a6624b07bfb20138a4e5501e72ef8c501f819709d193250edd13b8bc2b0277b04c037e8d9bfefe8f24e549f6d194131d8931decb1123d9df2885b768fe041148b3ab640da86d855784c091b97eb09b098c36e08481f10b131ffb877bbd9d311dd3324352b47b24142e7d89863e5f2af87ee24e9f0fed019cb295ebed8c5f6abe437c675b22261a7b661131e1ed51d9b46f80ce6cfb42263bff4c3359c56842bc4b6d1806ccf744c0df6e2c56e93642f76841e4d473f8be23381a60a0942077d8b8d69723ce2307c54d170a7f853a60b9ff49d48c52491083cf65c5a8acd3820281bdda73ab895381bb347b0299eab7936b4217e272f059c0b6e67ee0e1d537ebe5057436a40298599f8f1ebd4113b9a44532c3d9c6de6a4bacdeb67cf0ddc825299f5da0ec73e560b401a8e6cc68aa85bfa067ea5978884495f72af03fe5c2d11347361e0bfb67ff3ca455f0de8fee99fa8ec664363b7f09ec17c237e5dcaa736a6fadfee8a5f18bb95cb00e5bfb6849fddbc324427bd5826c34c7aeef3ce6f00789ca123f87904abdbd456ef7e3731e1df7a59eb43be5af621ec25ae21a98414149e7cb2377e3d345965d59ebe9c34f80caa5d0aa8c64c274b51954ae11b3424623cc7e9e280493866bf5cf2aa6680f77b0e474b82b0e862062098335f0fe9dba13a938e909536c0e27c3d2d82cf7b560d6ea51e84fccc2b105906170a1799280ca198d146c480a5f2925c14943217846a520026128037920004b87154e2c9a9360188c1da478c4f68c7e9400a3b7f5892110b80800a22eba8cf5cc99b13f9516a5613004a9d00e07e02a0c869fc022431a995479676cc2e4bba01953e3a704c48b9f23cf92115a1c4239c920e451478de01719373bc30f5f196ca0007daeed3abb989274e16af293c6e5853cc753d44e3d61a001f8962e931a2b5d7c524ca743c5a38a8de622c73205babd838320205363d5f2b374cbd7a9a55899f45d52ff2264f385b45af2d8edbfef79e78b1b4c94aaa5126298118c600093af69c5b7eaff678ce1b8a7bc94a0c7be2073246e5693bfe9c404891114f6eda4ca8216c291a8c150b7de2e212beb9923c3962cf2c27d9513aeb7065934a88e45a4beb94baac1da449eabd11c6a13229c1a9f52f7b077e4a88fd627e0d9301fffdb087afc9346a19d5bc2419f0fc33fefeaf0ef072906c714d18bcbc81eef184227a8be9858b2f81d1f4f27dadf2f722017d08c0154f577312f129600eb9383027962d3e991088b996f92884e6fd2ffa9c058192ef244e7c7da34f42eb23cc769a87ae9e4e6275e5bdc4b259fef3d6c456e79b0faa26a54e4e8dca1c5e794932bf61aa408b1e08e81ed77310eb9a1f5144a4d62a588ce35506d034ea591b99b651cfa59ad34b52950c8f81bbd02e8c34258787f2d19662e2744d1cc38f50c4aca72deeb75f4dce28c2d94aac551a1333e637ac1773cb02cad20ba2202e5c1610874bc0850f5d79e0544c00440be5786b8473ebfa88ffbfb9a8ff4cbdef76989f509069131725649582e31bda0970cf962f4c956cf42b6c8ffbb2b4831e1040a3555ce15dc7cb648dc9d67c63085b50c3f59e9f978b5be0caaab0dd9663d10d5e157aa76a64ef2a2f6a3c7b5f0dccfa260fd9325bd10644c46e2bcc1c401b2cd3f7597ea0ca22f3d7e097de9fa282912e45891e57e946fe53176dbb0a9841eb5805a9a7c018970997bbdd93312b5314a32b1e7a4d459196ca2a98b3ccd88768e6ca92ea000b8c68d2b84761aaa57c0dbf24beed3a5451622849486520487438caa2db9c1cbf8a93487a7926ff9dc6899b993c935392716e6859ae41e98bf82703fde80fb14c9c8c2ddcbc637b88a19dce185b4bf09e3fa0a01139dcc4a88a0b2f9144d245627445a99492317bf05390e3a7cbf69663dec151b224a44fd5d9395ed114b9ef0697d07a31e17c1cd3777f49b5102bc1b2c5a8b7b57174c51dfc7749a4c2ab945e424bd257f5e094920cf8a72ee86497678db2c3bca32b23e1ab46e19848bff8455ff422cbceb03b7ebc8844d816415dd6655adc71aaefa1c2dd3b0ecb9f411e33936cced3c3f3a7fad0df6fa2f1340f882f029d668231a47154fcf5bc70b31385170c46a7e51720fff3909fb25a754a24e59d10e91804d33070b1daa33bdff39516ea6470acc07ceb7f9ea543b4fd33cd6652eb9ad67349a6e826d0c022de12122b926a3a64b61866b21bd2a04187b3a4a990b3bf9e624005ccb9d1872f614d608b8f0608782ff3bbeb82f1c1be5e28d432a5f38a437edeaf00e5eede4a6a967c22e2e6055d28ce8ac364b45000fe8e34a691777346b51d2b9e42b14c4be9e993a9e414b6681c28291d8be17ab110adf73c94310b67d2672ac02a252ed7540efaa470ec3935da539aabf2d8ada35083aa4932fa1a09174ad2363c3ca405acfc0991f9eac616e3bce00a3efb080ae5be0aba6191ccd7a432730f866fa4a6835cdb4527df4d20b58f149a1c58c814b0093d06104c730ee40b5cd73e404ff1e0156e6f6d76c67bea60dd3416686de30ae5424cfccd5648fc32f567030d4678489786f29a9c3d0b893a96459eca386db3a98898662aad51b07fc215ee0a4d775aca5d0304eb54afaf35235b0d2d67619e620abfff0951337c6daaa07abae0fc6248096441a41f03499426993901592e23b77c25d9dc53d6c329dc20c9f16e5ad07998f994145f41d0581d8044040a6d8cecd85b5799e47a81329dc424633f8bb822ee7e4d8d8885ef35d924e04b8dcfe2e6248717fbf15141cae6fffaa8438cf809bf1d7c15780407ea5339ccdcaa403999ff24fdff6fb01a90f194eeb0fc579ff99315be34d22c05aa09a087ea6763faa391821861558d5066eb597f09e4aacc7e50f0c869441c70d657ff5f5c8abb64d6f64303ea03f0366136243e490dff65dba954deb4dda4f08a015e340ce19839f654d8131db635204994bf698b80f122255a9872da2bf42ffc97e5f7c73d4315c8258db1d11913230135071470abc5daf574af83108f9319abbec6e23e9571d95895e3ab9effc694ef93c735d36d2ef265dede958bf9fefa079e7022d451f3635a6b1bab3c64d11c64d13d6f5cdb963187092f1694c785638540afe51f35b35e27246bedd008f838c0013c865ec548e5bdccc3dedf1a7c8945105d727349ee01cbb5accfc3a018047823a0d316705a29e07909785932133b0cf18c55ac9077bc6b0d6938f6bbd88b0e83aba3794b88fab30f529e5c32c619e62487985a34c81a061179bfe46e79794c5bb2ad882b2582ad55ff8cf71a2e9da75263dcc9ec38c7fd2564754101836ab17af96863dbfd355b7222648e393cb4cc321b6c67ceeb601f53b3ae332bd4fa693a8655e5147e0c1bdaded47b42e02de0514231e909769811b1dcc16bf6a421a2bd4b96ca09aa69b69aec69e83505ef2b26067badef57fd0c96998a4fb8dedefedabbc5b5e6ae7ad58247c381e215a576ddbe15f57f942142093da6a45fcd4d2dbca7848d87e23514ff631f4607d1071adda19b7a078b518508e477558b1a41d8d2288257989b45bdff86f20aff9dcf60f4389ee7c50717015237bd5cfa53fb20db4c7e6dc7c15550a6bdb0f375ac5d12fa37c200a6dc5acd8308a362f8ee90d3f49b39032fa565c07866920eeb37a2e305810d4f8ecb8eb5d9f88a79e7c6bbe04eba3ed526e6fad91aad062e5f98c20eaede60b148cc4eb8319cb1d743ec98f1f142eec9d878c21436b71cad05c65a0ea8b0af47a4109af7e37846ae6cfbb8ee1854279f5de3c9a64e7982995c4b2d524cf98cd367c9feca71d7f164778f20849daa1a263c1317e2a40ab9b9f233eeb68ef7624fb275e127454b19fde6d9236842cf1248b7a7df26c21145a05e9a8554f2099510c18f028d29dc3f72d71a6f94b741085fbc2662cad3a8278c179c050d70c7a3ba8b02884e4c8c0a7cdf43be2d62df57aff75bee538a1669bc31fc8fbbdde691e973ffbe0f1c10e53ac77842bc50021678b1b5f6ad8839ef2cfecb16a475388283c30e5accd3634bf4b6be5e4dd42f46ba9b4b20372a810dd193f0e23953a4f988341b74193fd1996d20583bfdfd024f89dca7d83264518437bfc063dafd9eb73b052f9bd7d0de65b82c9eed302be5698bd4137eabe6c425d961364d8195446d09f2093139c0c73cce8bb77639142de05ca66eb8344fca84e3580c4318988312433de913e5c90866d16fade4106b294c51a83210223ad112382f0bc4b6086b94d5df8f91184a74cd374fe2ba7340d46aa2a03de55d8402ba515a8ffaf9a71e04fa27ae5b7c81eb0c9c7d57fcbc6776b599d1d5777e1623774cee2cf5e7c492653396cce178809decbc3f5e65a0ddd295d700ba2ced0e3b31dcde6e9d49b680b1e9b4dc08d6ade8e4b682437527b7323b1e41a74c761cfe735a61ffba5f0df2b96e54fffb72cb37555153eed474bc2a80b351193051206d8d7fe489978b41f26e7478c6af8b72cce64eefdbbb10b68c1c9669d4ba475d65bda332ea04ffcd3b177ad38c5f5f9d14ad920957d977323587aabdc3aaec13391113e5c9068bfda7c44c450e8bc5edf765b1dccedac352fed1eef7864036bdfea94562cc7a4b48e83350989e0b3f152f033cacf3a5c1d6809c32cc252502b71bd980eb22d9e9f0d5c473d8e9fce10548191e007d54b0b3897a8cc806f51cb59c0d753df3d5ca7def704ad1104ec317e28c55a9ad80055ddd85e59ebe483e06e46e81b3ab2ed68ca1793140e8e9124d79d312b5d890d1df777d8e6b1b91899238a36fc964e3b501ce83b92ac4074d46d957f5d03ad24efb1022815078796d1199f10d5f866431fcd5e58de04632e9223ab54b9b4ce74d7f500d3fabe1660d8abb2b15bfb2bb52df5456941b2762f00b92a9ef8b72e4f83ac78d08c23da01f0111102fa050a743305999dbc76cd0f6b6c3c23cafa735139d6010f3616907920c13961eb038eb673e9284ca4a2bdb8b321b2967caaaafe9b06a1e68a2712298f2dfad3485b62ba5ca69ca792deba5e5aafc0344885586def460d9cc37a101af17fd9a7d0f1f70564a6c367bcfbd147217bf07ff4ade2c77c86c20c38a0ac17a5316669e85821eeaf9971355ed9d587ba7744d2edc8a72f46e4db2de00f2c81570c18640fdc55ae781fc2a7cd9322a795bb0cf51a5f0a7ac4e32f8d3983bb999ba1aa2ad851bc479aafea1b1930c61aab91065400e764be10af6e1a319cd389546ebe246afc03223bbfcc801acc0d3ca77eb1bc00ed74c4fd4a26d2f318cf6c312812bea6067b03200266d9e7fce29c1eb18c5f2bc64fb88de1bdee5a80d1d9e60e34bf0631dceb2ee651c55ee76057ab84715c2e780253d92186584d5190208c8a5003e3a07d749823c1a146561d57f27a1abfe2fb856d9be4efcc8b381d71e93220da9bcfce4edd8e4cd4655528e23987aa292070f65d241d8e80515ef582278df5c9c1a8580eb16330a22fac05bef41932172eafa627d8e8274fecad84b8560bf1939c87cd0bf3fd4fab817ca4bfa6e665d2ffab22d7147d826fb4927a492659f99a34e27cd8113c043d6d7719c34031b23ca43cb7681b2a26a8495289a59dd0d3e5063aad840e696ce42cafacd2810f50127f0f6de701bf265c50ae6601e436719e692ea102824c1c08fcb32731b88abce96d91c337bc0950075c7012050edf529e66cbb0d1c3a88eaaecf1b4cdddfd8667086f60041217465959b4a4598992d270755c83064ca40032ed73b52f0661a6d6f4b24affbbc16e08166f6e86e955d0190ee74daff8239785e33daa1d32bafdeaeb039f1a64ed4aa82c9debea0118ee9045b38599f69ac185e684fa97deea143f968d83dd5fd36bd153df507cfbe3b0b58739ff8f5b89bcf381ca18cd0aa86f2818ca3643ccf06dc15d0a84ffc41844b628e661258190a350046eb3ed79d4536c091946a8d87593a41a208a4a1bc9cab35156a2e5ff745960291b831847b005450d1dfe67dea4f3e92a748946f747a2d30270a01224b6a28c42d7afa4d84421092b2e99060077313615fd99f4b50953c07d81ce36af5a91320959c48407477834739fe44ef9d46ecc0b94cca53ef7a7ef9c532b9cf3f79ebd2d2f388bd85a1dc1d18848e91fd20ae443ef546f3666d4c8f5c63d64013e738fa8f44031f83ee11201b02cd27c69431a4b237061a1f69ea454a636810d4f668101deea7ba499623ff4a6fdd820757ff625c5a228eb432f234bda5d3a069171b0cff0774418edcd5eae4771fc7fb0003fe88e239cad8d67bb6e4f4097d2348a0519bd1ca39eaf5ef10e0a6fa98034ef1b5defc8260e3b1d4286f7572ff5464a90759aff408aac47ecee8437168b62ab4d6c17ebdfb534b373196209467f237348fe4075e73c52484372a7bb16f7ac83d9c535f196c5a01c1dc0f74d564e0f28cfcc0c12a665ccd13c4f0af2e1f40ce56d4c921c87f9041a6a0ddf12486fbdeec3f21e280bab3b9f8ae1e1920e7896485194954606456767d9d008a0db0931546b4bb54b9ff4854bebc91b860111eb029e9c93cde37036d359624a07ffd08133f0d4eabf9c6ccf31d04f9e833f945e90d1d198dd94000629af42deaf0117fa9e5efc85f423b3417ed6f30a5934f6ecf6070d35738378fa9d37d69596557f50709c48ab4ef3d4a9436160935ed1aab49fe27a941df138475f647385a1e76461e2c6a3cd40cbd40d7872c0a186c6a68d53b3da6f5cb1d66537f42e3a4a8701e8b10328b5fb1ed790115268778b7d1be1bb29628f8df22215b89ffbdcb5c1da913ea32279ba172c0dad8092a2147da9ab94d8c51036c5c89cc377c77c5da8f5d0a663504ce5327aa667b4b6ede5d997665ce8f203628b88dcd7ce54a3c6b5ad2771db818feff948044bd9d4166ec446b6d3ace318c13bdb4296eb1ee78a120b56f3412237b987dd3c37b8b906079c7088f2f8421808987c8e425a0c40096f1269724c7ad911b75a2b6f21f7e8192ec76764e975b9a90798f8efb7aa24a2d2cf6e8b389161609866c159d0cbf7769ec6e95570bf493522d2146e4f21b158ba70131a00dd2b64c54ba71f1dc939f00ea1ac28bf3bcba9f0617eea732fc1d4e5d7b2e1f18735270d2730a7bbaa4679ab82afb737e02853ff3a1e07315d088b2da40fb10bffde9d175ff39e429ac33811c702f86a2b17369a0e0646e6d027ca6b10b15dd3a38a0529e17c5f7aa503d342bc39ae860963cc53381c9df1b1b5d4245c1c3b2175141259e4c26c9713745c5ddb7e0adfadc197e1560acb848d60ffd1ea693aa1719a7d53ccf31ae811592777fe48e2fa0581d2cab480cc9015d56b7dd6d7202827558c00a3e472b5f25b75f7b9f473a8b3a549a75cbecbaa6a38cc8a10dbbdb841877de78c898fcbaa3b4dbb959e947184c9d4078bada53aa6e7ad283bf584d276c3bf5866c9e16375d0965035e5deb833208f98a086e0f6e57e2ae300eefb12b1c8aba1aa62271eab3b758e1f1e0fb61f8f354da8be277493cccd0e400acc68dbe2e59f09f308bcbf42dc5d1a9f381e96fa5ae67618c2111a0141f3224b25b33d93ee7f6d03abeef9582f70c274742e8870e6b3230a754356965facebb2716f4438096246bf100246e125ea950b823286bd76a5109ad6e70fbf774e7666f2e570318b3bc3ce662baa2dff33eefa833bff4f267e334a794b0ce7e8b032d9945dca8f822105c6cffeabfe472e3a94b44f8569af925bf9ec202b043e9d0a1cae6103d4a364524bcf38d167133abfbf5205514fb79c63efa1a87f36bbf8f51f94fad2d9f53a92c578d02fc9ffbdcf628df0d0361766886b042f5d92e63dc50c697b394bc2e269499ee64e540e2cccf059a2996d8509c73b3f072429eb1292e41320422db6e06e72b780e0dd7953bf5f4bbc3e9e18ca9e17e14fae000dd3fe1cacf030c2465e8101af4418be70daf26ea224f36bdf5a5251774445f1d25a32fd29f3b8caebeda8a50a2e1fad91ba6e908b777acf45a222b27165875753447485f2636c7129ae5090ee6547fbe362ec2f044e6ff2d93e5e92669dd46ba2b3c81cab9e696f4fd4e934b75707cac5d899a69e615c6c4c3485862ab9e1288950fb172513e34a3cb9e8428b0d985ec4b58a5be6e18a6c41d660ffa4385e2a0fccf8a2752fec5addca34e0374fb951c7d2380926b48535888ad21640ac8a33ac3d972a615c80c0f98f82244baf8f93d09ae0289302d5fb0a54c1ba60838083745250bc3efb98b5e4254b0fc417892a56d6b4fb2e99a2ce03d321edd59238cd2fb806bd84f6ad32de9a69925cfa01f483d4bdeb071134c236b8cd58c2bbf3e33653ac1ac78645de9ea29d6757063b578dd65d56cc191d20a82af95465fc100600a7ed3ef02008196d04f2e73abf9f4a0f2abf83cf6b14a3ae100feb683cbbd81e4f803eb3f5e5709a22002f1322cfc786c2e97a97d1b2be82fdf584e9bb2ca4a3c4d30c6dfbf2fbdaf1a06573b44aaf5961068fd22e556bbd933818cc6f7a478da9774450858923d6393bf250f06fa3745de5a8c2700b2b522acf97b8a4af734fe903de9d4032ae25e55a4082b7801506d1b9ba4e73cbaa91ad7b862587e61bc52afbda8e4d91795094fdf1541e45522e7fd2c4d6ff5884f75fbe31c60240a7c7f1aad09bcb32790f0441d266d4c58d8506bfd82b70460d3b4280b787fc6f9d9b5c3f12abfe358aa780d53c61a458a161863a2a9368144b70ba4f638d22729e8e71033e9ef9c10a195b0a0dcb2a5167fbccc1a53806c2bcd5f9965d02db164b51a7b1364c06508ecb3f4762d53505313bef74b506ed7233f97e3ddd70710e035f32a176c99f1312fbdc92d38eb59fa0e203aae94c55ab81ad94efcae87fc658e92b8d4c8a99fc72c30e1f66c0f78be5621285d85aa3ad8d282b2082c6057b334a799c92db44214cd03074c2943c3f0d59adc462c1b35ea34ff19e9840b8fd36ea47cc21da8ce3da075c802fe9aafb1273ca3f87aeebd4d411973584e26b177ff4aab46e7302629cfc60853a98c98e7cdcbfc15e68f481b0da2a4af40ccd81ec782906c5921929d8d1e2946d3da9205bc6be13786ed729d99c21e002b44b1b766fbc11ea92e9a2970a6754d01a1e392c7e899f6aab2d87c869161f29795bd175ef40e33cc838697bf94bf38aeb7f8c479ff5fd9662602d57820801427986e85ce886cea126d039a8102f40ef692842e51ceee04ff9278d3b027791358000391ef27dc92c87c5aab98febfd52a46895ac525065471947cd80306d29a8ea9687ffdcf6ddc6747376fc04f9fdc5562af83ba28c5e37e76d316b940e7dc6f68c0b61eac852f05fbae74b3c4885fb613aa01bf17ebac5d0c3ed832d322fc9cd0643cfc1ae1fbabd73b57180804c18b1d0078ac4eb3af47b88ebb7735b480d3732c03ed25194b8b56f8d60647628a975e2ebbcbea26105ae82b9f619230b9c31574a22b197fb42900112b6763f5c7df0e3e48c13638ba6e8cc209c8431c0b18863ffb0d05020680539780cfc8583f439474cfb0358fbec74403e73a7311139a62d1932eb46c388de46e5347c9db32bdde6a612b630942695b5434847a977e6ced2adffdd63815baa94862417c50998f6f4699f069088dfa8ea9b656352860c5bbc1517e5f2f0cc0759fdd2e65150a0baca73637863884903ad646a3186f28e14603c9d995e310a903ad6df7336cbb24f80d749ce52a310a732e0167d6640a4ca8b887db74510b4ebf5c8d236453985bc2c10dc84fcd87b6179a6381e2d24ee6e5d8d4f9e26e38297572bd210c8e76d0eb898043319f138b5a23076e50ecfa3f4925bef065e14164b68938be41b1b5cc124aae2bac9f3e9b24672ec25d2e24a7a1bb8ec0ea3bd2a0aba3a8c0ae24b364630ed3996dc9283766b49ca3853d811a5a4f682c11d1b02b8c468c1f4dd0268df91d3eab6027582570072473edbf08440784cca91f9c4c2cdab0a613bd41ddbeecc9a89d695f2f72864a7bcf6de7bd4c6d703864e74f228f90fb4da1a64f99026c4319887d9d8637217442c4346c80c01180044afd149ddaa1bbf2d5e8df08c1beb65386d0f6a4edcc095813c3e9eb2e1f00a731facf779290e44422e6d914a7b9cfb25683ee4dda9667f439cb3045c6a4918917f10986dab227c88647f9a7ec43453903fcac66255f77d6dfcd9a6731278a1c0b63181ea4ab42f0407843740820c9d543738b05e716b0c1843262a8b882df7fef750c6740f05ea6eea0222cda8317af14fef6400851d33d8ddc9c65f251745493d1367c84955c365f220ffd9f6420b9aa231a83e0ccf3f8e084fc55cde59e674a90e9a27362553842574660faf88ec8fe2e14b1ee314a6c280612c63030ef2d98017aec587c0e97ff5777bf3f28c476a33078e47565461b979b6c8c41512ae105480551f6759afade88a5d0f5b40d70aac06d1cb73bb0b1c305938f17664026c1c8ef0ab5d89c4715fbed9a067511cc22bd9f06df429be98e1afb3816bdc8f7eed540ad55987933164e3ec32bc088488d1df785217d1fe9bacbc50511103a1a2b6a78539f0e93050b03e2ae965b9a4fd6293f45ec34789cf826a90576e154ce288cf53c389729f190b3e4b94809c22baffe9e1a9f9745923fb72afaaa14e9769239cba587c4547152875d6f8f60e5cc80c9ceaf6cd28357b588209be16248240b83bab2f823cf882e264063e8632ba739d889f6bdfac1825a4283b5725e8a17d44e0e91ac6035ab411e09ca48897ca70b9f803d33bf160de668dc848c92944c4de6e0d85f45d1933b2bf24e8db821d2efc2556330b9675775f64c86afc9fea81366a74eb387245d96ee6b17ed210dd4b98bd9c17261fe4c3c1ea0920828a3bd12607024543ddf36289946d88b904396f9b49800f8d3f04dc7e7aa8a47873057c3df0561121dd954345089d433130226f6d629f1d7198e81f909adb944325f415fb403ed45812bab9760ddc4c157fe507bd1fdbcafc40813b41a6ebd08b1ba8ff2db9ddfbe055148aa7b0ba67cb6b8ae7af70a3da712a545a28aec420efd19a7cd83722e25dfad82c4038c72b411d5102633290f9cb82bdcf526f20ac28815a832deaf76d029b2da982236efd3c672abcb85c234c0e1d571a1200d7048755d525c033854dd9055a03d5bb8af2a021cf3ab33428df0abb5d497515cac46e1820685a3ad1bff2109eb1e2be81b37cbd47c5d4925c7228a376ea186c2aba4451990dc53264cddd6c447d8a1306e3da3d5c12a08baf5ddfb444ab16aed55a82f76c61a7e0dae44f782d0cd5d972ee7963d31cd69e1f771761d768f4b26cea35db3da2504b10979ddea1e3160ee8b391fe7abb07b5cf2713cf762621d16f93fc82c617eb9cee23df788d1ba5d5c6002d030afe447210fbdcb404c0de3845b8b23f5a94183cfedce3b3467284df4b580c597f4838ee6450fffe804407aa7a0f066dd9fb85c39704bf24c058ec445a97a340d88c4b077b5fa9eaa3c3c297b0b5989a4842e1640282aca569c3abc77ee92af3e2ee84ff1ba59cb31fbbd7727df83786dbb9095dda16d2ff18716d65aa352d709571ce2cdec12008488ba658bce60772fd926615c91ef9b86a1e18372a544ee540e3a308a0ad00c8fa89d9b75bde5b528a3e824cce996cb8bb9945fee6008a37db25726401f75360baf10f2fcc1c6eccdd8e571202ba9049790b6d5b216e868db192c5385fd7e3faf92dbdbb90ed390d1084660d1cbb6a4c957a5507219a59a9790d8387ef07330c5a21ddf8f2824320f72c8a8ea2ffb9b5f86aa38121a57cfa7dafc0eabcb27981f31416131dae218fb70382d7c5fbf2c6631abdf11ad0cca4f6bf64269c1b172a4240de389636c4d1f47e7c34b04ac445b174a485c38d9476ea1fbcc835676198a8ee11b0438e3f7731d42e13782a02e2214d061911f48178ac53cbfec55b86c6bc78ed170a2664037b109523f25812fdb0df09bccb8ea4631a77b2fdc37817da0242804fa8725758eafff248e9139b86026e1ba6dd37e9335139bce7c9c2c7daa35f15d6bc7b7844fa84436c3d6c1cd0b6960ab2898350f74924d63bc842e040f9589251b4ea0057419198e44c5428556029294e5f2ce468dedbb0724815cd4525f4baa4b6650e9bf06f3fb6168ad1411575f1d40d0218caee8a52e11794c58f75dc7f55a72193b7981baf5eed56f3120aaecc5dbf1a0d6c408a186b61d7769c0d269d2225d6d9d18a4a0d21566a4180c66d798acaeee93e7ac937cac3cc876e7325ccdfa7119c2c8e93317734992d7f2bf70ac4d4994f3c601572e61e5c6b49fa17c0c08b646d887daf83d19b485eee50a757baa338aedb805f1c0cebbc1e87ae9c1a86cbdc4a693ce36349933923436f556ac32fc03e03c7d6c10689d3e15a7fe2c7fe82556d963e295daf2f95f1f6ab43dab1b15a945c4d01a21fea7a67f22ccd39edab73d3406c1797ac12301e86f5ff59e5871d78586532d0cb7080f7b62e56e179063cb4e08efb4c865aa897916ed91a1a955b2cd61c1eff37c1576c72d3bc643a5acd2f9068d70f285250de8ddc031404599439607d89dcdfda88ef66760620e0a68825305fc180107570927bae9beb11ba2e605f25362103b2f3016ab168c874dd0126408b3bd7eab77ee106cf5afa08a2a8fcbfaadff685996fad2637f33981eb4500697e286926d2ed06b1b4c357ea0e3afc6e9303495848696de2ef67f9d200724498b9485b4609acf2db8e042990f92d4ce13bc988123cabbbe8a07b9a6eff665107bc6c5e586865d7b501feac95f9f53273fcba6e5c4d6c3c2668f2c9da55d38b7a15106374166b5b1e009995943d4242ce618cc40bafb2486fbc812ea4300452586cb8683f7a315b1c6e20afd263c7d0489ce331a15aa0326af6793ce8a1f1c9834a0d3c0a46ea4cf6998efc5e3167b88e97588ae84aac59690556c488406aac1e1560f45f83ea7511107fa483eea01750425fa94d50a6a61dad2aa3f75fc47e14004cda15a81ba82b13da4354a1f400f94f5b890ece720c14bcfb21c8106bcc0d00f7315fbe2b6b12dc54341ac52644d11144b64e0d4163094e5e6c0ab4901688bfadf5e700faecda2eb0dfe7236ab09625ee89b53bc824b71a84a33a59547b84bd4f21cfaa6ba56236f83dc562e54b8104e6f342aa92bbf5ce28a558530c8096ba058799aff7d7d1eff4b2a291224d39f077f1ed7065c9de85b9803a6db04be0896e6848b531c9bba904dd48fedc9a3f39c638be8f9b39053b117242c737f655b522215674bc60ffc9858957e0d3ff1d8e1605ad8cea2a8399e918e68cd1050bea665b403c9b061cf4350dc34ca0c143021ce32743e0688f97fb1ee3ade0f5121e9ad289da307b68459624d60b07a1bec329a7cc1604d263c0dbee0c4c5b9532b12bc82661a3cd0cbf76306329fe9b116b2f676b767ebbdd065dfa959140d30e1cfdafd596f6c31987c2d8a46b743877f1b4039797b28fe4e247b2b5a81522f8493e52b11d6c1849f0121aa779d625be005a00c758a4d43d282b372bad97c9bd9a026a88080443a9ba1af1db80ce60fbd2fc2fb37dac3f320c26c327a55f48e363ae9a9a297ca4d4d01acbfecfcc0a17f885cfa19fb944ac32986d0128d0a4406eb16dd1396cae2690ecc41b453f87685d861f0546846621bda513299f09a6267b3e1197defcd2d708967b9a37326f4144b42b9bf6801c6efcb275ac33d452916a465d63b5a843b0e301828b6e30eaf36a90eba8851086adc0f09c90c7ff85d040590a23f997255503df4f251e667f3f05e44ae1549511fd7d032c152795f7f8aeec95f5e6b45dced4bed22f92dbaedd09ffa06aba7db67ba928ef4a607480dc872291306ee684541db1c1092660f98e5d9f6c5e25c4fe14c05c710c7a9295dfe238a4523091712528a5110e29fc1ec3bc055bf455bcd7f86b5da1fb6d5fb728334e598c74fdc89036af07141829199ecac213c0e4131939d4dd714cb8f75d64e57e9b4b2678c73c4af838f7f0cad030e86273b23ee5afed676302781e84f5ccae40ddcbc4de25443885347fa874710fe96ecac6fc07dcbb548c3b079d9744c295a16c061aace2bb194ec0ca06e5e959ce01ff1c1d52513b2bb2093be3ad999ce6722957a9fa626f91d5b92d3f24315b115645790a58adf2a18a0188678506b1669419f28f64653844e22fcaa30c63da0b915ba982a4d413acea68bdb9b0a63343a7aecd33ebc3b1598f0916ff9da4767a0dea127971b2afae3231b1cca16512b145db4dfa8338909397fbb7119d70794a9ffd6190dee32fa2b4299fd2c3baf054d21ebfbec24e4417f5e6dfc596d406d28dce86420736032c677d2ce7e0c3302423b9b7fa14f17d90297eb4f1ea7bd1ae7c87369b441e83436a797411a8abe51953d599007c5febfbece57f5c865ddf9a551f8e7284f46421b56d3d0d206154da37d168ec4f0545d274de364f1b1e83a385c28e9710fb3221f33d80417f06528d318ac3474a750740c69696d6a8416e37deb2d42b7d8702ce2c41c1f8aa2bb281ab5f87e62cb77da5ee095a195bbe01b555566803b75c494cb0ab31964dfe934ed4085b308d0db9bd01f2ad81acd26e54c160ee9a45655cbb54af0ff2d9fd62266d4249d6611393f3a44e7926b1128192b945e4c9433da235dd50889c6443abd00d669ed55d21df7b8ef1dc308c73590a5af58ed3383d06daa7aaa74225eede32a6c8b55c6e124411077772bfc28b98235b0e170367641ab6e3d1058d69c29844260ca055ae183789709af52ce04a6b52ec81822a3aea2ac8a1d79afbfe1525eb03330f06ce20dff34194bbea70a0add65ef9f7e03dd40dd78fe1cb1de96578787126a29744edb496cc1bb6847f9de5bdc26cb63a9497610ca290da80d1394a70ada2d79ad0f4e405d0050b7f35f2564f1276d5eee94776ff908786d86d058e334b56018a742cb2e1694b9ac032b4448d27b8bb5becc05f6dd2208dc1ebd6dd13f55fb93fe761b31be5c8a1cd7939bb01931dbd36d65ebc851f58d077187aaf7909b07c556dc5e293db7fd6e32bcc4c73239a80517b878cbe9e78ae28a2e7a2bede1159f54893a5f437df560706549aae3697d6dd2b32724573f638dd9594146c422d71d12c80795d30a06d9a4711342bcd62359c94e6fd6e850430d889aa78b84d11f1e00441f286570688f1aad6eba33a6884a3fd15e8d2caf944a5ca8e36c4fa2511cab2f6c01fd867b94f776dc5c8a739ff1263f7991c8ba12ae7003fc20d3338472afe3537ac061965fc7cc19ff5b0bff4b6b138ec62676dc5fc1d9c27202a48addd2fde03f481628ce7d870648c716a821fbb0591fa930186e0caf56e98733190a12022462ffe84468134c6e5220c61b257e7faf78bb90f0a502908ee1595b6021961b2801576676d1215ba3e8cba39913ee531849fde9f7ab4db3883fa8aa5a4a34e863c717e8b7850c4f72025f6d7c8de826f5f0116ee1a89349002e2c3fdd3aa3dd8472415fecfb8999a75135a5a3cbd6973eab6e4559e8c00c09620284c26c765927da24a201089895c0d2b12c6d3396f2db2e4e756403c08855716296411c265c2fc6c65bb3799803c6c1849f0dc6d4e6d07a75ff3c3268c1c4994755919cbf30c14c597998c71abbf84ba1cf59ada58bffb55d22faacff7fdf9753dd3d8d9278ddaef803d5cbdae4e7a58380a3d8831c697a879de9e165a8a365854ad4861f9d75d516aeb865678db45e24045493c756d57254aef1d8f12048f123c6fe9ae0ba7ffe8e2fedd8d11dd738cd5da24d0340db7f84636d82637723cfb80770d840489e397e45d532ae9c7c1a852529bbdacc6d58f645f7a5655cbff5695eefb4829768ae53c1572163d2b9631e33f672785162193b6771ee46e2616380d690c1a59918176c9be9083e1c507aa163cb2ef2cba004d5cf18089ec9e5d449d2c0925b27ac542f9e5c54f1d09274370146ee9d9f5a7c59239246df7c03ad3ef1f866d051dacc5af20b512ac5f2d1ea310b0af8dcad988a16264c598a4bad474b1a0601300bc708ee9cdbda3cfa3d810dec63bda76d3aa8edddc50ef989e9b5c1eab58a69bf8fa897e19e71344e212701b9f996cf85534fc63a19e5fadaecc853ed19380e4f2f73024f73ba6aedf41bfca9aa96b71c2d413107addd7db19483a8f0d761fb3bcf9c21800c4e709009d84791787ae865ed045e414a4cf3d0a49b1b05bff2e60d552457d7c6959990e8bb9b6480193a05d9708119f80a588881b7d95669f49d1139cb33fa54bfc03c46b7f8c137dfab0447b286c751c69a8a0eddba11f8fdde77517a02a53f67c5b6f9d9d91381646a224b94636afc61fbbfaa579f172b7175e504e144356240ac1cc2dbd31993b92dc396def6adf726795e299bed822de95729672cb1849f56244bb84cfbb11dc394f030859c47d2e74c45e9abdd760f85cccb418a139a6452ff2f462ecd3a38756208d053afe6192e356a4be55df756a838293561fa27e4f44c07ddca8621395840f6583d3765ea755b434d40900df1b9f84a64f42f5bf4941ca013a9be6b994be32f989cad62266dd28efb8465709480829e455054f906779095751d1733354df7e1ac4640ec1324f3f69ece62da99bbd0f471d87167e43c832850cab7e54b182ef02663e55a3d24d2491fbfac944a01ea13bf0d7be025618d4102810dc95e7f0e2c112f58fd554f4aef40120facb8d821489bc951bf408e52868e8907137bae067ac81ddad7341c9e27d55a7691026bd4b80082422a42c15c48023b53c42df4b09d081ebdf02d0ccc663c74e8b565429f8d66b70387dad93145292c04e5628eb42271c377ebe9e87f03b9dcea458776e63f468b4ea491ff568f4c2e708c270f03079ad1d4487f2edfb406110222213f213a4bf815dde300f2fe32f504aae6c6b9b92695200cb68ed91664c36d07e12a16662a21213d0ac4ff3119471399719a2f48a278210737a0bf6154360c94de10d25b06d5486e27c732265a86a1f7a96e7201bd7b7faf9428b528a25042d8d090e1021a4c98874b0ab1f0df8a545264dd53616becdebb9ef5e9eedc8bb6de8720e388cac26f7e4cb09f0e5ef74e5bb00bd7fda283a3bd489c5729458086fe952c05065cc53778d3ebc96f25bda4acbd8e3398ff6ca919f8a91ff185d0e4368f7c57a8ee6267387f1eff887488bca8755a5261955325d2bf1c64b9dd8e272ccb2d1c9a23931c3baaacd4f14f530d8beba24ae2e5e47f645049c703bc2e4f735dae349c62fa526b1dbcf4fa7a646c770085527698d0a747cffe8dd6b2d00abcf63a69f4b4c2486cf4076a9c2e07885f0857b50f0515085af29c8035ea69063c6739dd2924b392ddb4b049e30e0a2516ee2e1a066bd5531f3e376b51531bbcc3887acefb331d3452aba6706f774ef1e486580667cddbbb98c702ae2d2c025449e66e1bc3267b0ddc8b49f9dba2384414d2a6bbcad9bbf6ad6238c5169ec6ef9a87048122d04ade13090bbc206d8d2cdb9d57d37a1a720ed0adde1a50fabc842a71e833c6edb6fa00688d9278c9297b9364ba9b6dae180e5104e0d300002345b90d5610a3701a277a30f9fb4fe76c9966ad32834fb16d2416b83efbf1b039e46cd26fe2642831869fe8188e13d4f36b69069ba2fc1bbf58c3c705f58ba60681900e7ad39d1a8a194589d4c47fa890ad39e4dfad9cfa4c97fe3f8d31131f53674a09eb8e81cee429eee002875a2ec7b0e6fcfff78df1c2b14b2e049b448574f90ec0c031a5822dd7e98f873488bfd1b155a8c1067dc27be19b0ee8d33e21fffd0d300319824d9e61ee702d847738349f980c9b51450d2d153e2116b0f9ca0e68b846e313e20cc1cf103c745ff98d3a48bb387282823c1d51ab155cdca83b022a9a90153d2424f625962893c4a1177f26bff46688aa1b7034cbe1680d6926aa126bc0d90455e82b3e388edfab5a6d74a2e0ad3edc41317fd4c3169dae32737eb3e70423180d101cd1a5fb30b4be4d12cf18a60ac82a07f1522919ad02b13d3d1673e88921851d63faf07e9ea60b4dd6b4398e47fdb2c13da24ee314e6ac9cc11c3607eb3d298f178370a3f3787e26ddd13aa01054814b66aca7a5318d3cb454685bf71bd4a19dfca6268a45a3bb8430c8ed0313a2509b26c3c67b376c76e0b540c761850206b7b2f509a4a1e00d998550f292c0a876c0c03d7b6beefe124843aadd26c9884eb6ee8e7fdefff722c7ad9982b23a86c252f1dfcfc1ac2cfaed0f846581bfaf03df0cc831da735d39514ad96a18d2699ae3c782efe484b72c5ceee2ce6d3331d095ff320a579df15390c1e6b707da8d3c3a46ac7870c48b4734ced92c7b070b911c25f3991ddebe32611b8545ec4b06128e6d067dad56c4a57826e2c2c9e0020c1965372efcf1a30e0b53c263288afc9b49470276ef6dd516cd5d790324a2e890a372736da2e94c8c5d58e4e5fdf56a6c76306cfa239fad43910e75811d9892900eeb8520d2c4b7d7013a2c3c3a249aa04d84eed6c2f6c6e4d7367dd060427d7970323bbabac88c846d9674006fd959cabf90b3ca974f4950e8052766240490304db471993a496f50865c1ae15eeb4a5bb1e8334650f6c70eaf391f85d56645710a7ea478035d809c9f190f386c4cc58a07d857deb704c5fd82208550179c3f63a99a879cf9ef3d7c3d564d7a1a548ff11ef1cec8c0b627744ba837b4e367e0dea567c83f87da8bb74219fb8feffcd8d35a1d0d781008af5163d768c82a5afb484f34fcac31571331f30b82dab193dc71560dfe2e35af54d99ddb078b4f15b9a2356a27da6fea4457694d183a1b4eff3eeed375e6235de683f37fda8cb3002d3bdb310ac4640790f08e2f4bb9677520d44a53cf8e2ce903c384d0d6a3bb435d026304b5b1898cfe612138364ebae973d32037f1832388e785798aac5bbfea5c6d2465ef73400a3e39dbc57230e0e029dca06e466018644c74cee198d63189763f6a024ba3031ef08ac2926274d6bb986077d44b1ed1c98f91a76b19792e2501b4aa6cf6d65b392d1f43cd4fc3647acd7381259688b0c8d7f433f038e6a54a1770ca15c6a633060f65eda07482ec1e6a16aa5fe362d7fc27bd25480397cd43280c5bb6a2467c58e83ea7e2683f03424b44f003dfdd08752ea9f57abf7e4ad693490e0fedbb01411d5d2e884f29bfc5fdd872291412180e09817cda3fe7986d6801defa176b871c6e62f5c5f23f34e09b9b2cd787c98099d46a3282769ad44cf2ae81587bd565dbb57e97f6745595de76bf4e6cd58bc01202e595f6e1bd73be494ace8c49d7faca99ece5126932ec5d52cec87a014551843abd9325d1e92363d27f44460a53647107288f7e7103b7cc297c2058402c87405c340557a65c5e3fb7b37d3070162e4e76518d83c7d67068c79a9ae8a2759b6e14ecda5af980bb1a6fa1b488f17593b70b6338ade329f95ec7cea1ceeee07ac833021a60a4d934d463db4e12a9e486d9c936f0f1f54179f9ba56c6d5689829d99cddb77df2ca2857cc304d2d0b6cb94c565973aeac0b468a4806fb71e89665edbd1e0e47466c4c78b7aef002de4c13c5e42fa5121c09313a2cb3e25498e3a8a7a9f6f85443aadd0c5db94b07c7c7b70e4aa2fe87304acdd636e52be44df0c27d346acc7bc54f531efbb97bd46bff22f33b1363c2c0d2dd05096fa08d83380299ff648ed7a2c43b5323240fa22ee12fd5eee41620ed8e80c9fb9c982f566f1e8ca9dec53a144d5b006bdfefe891afc52ccb51b92b4259c7aeffb2bb060dea31257ff2ded01396a1ee19cbf97dbfcb722cc567cafaf0cde34db1b50015a0ebcfd13f298e88bfb2daa10235aa9d31bdbc42b5a61737137348ecd6d6ebdf43135ecef16d9169bb7b916f0f57842c3981c0d31b7dd41d3921bf2f023b937397019cee808f77c1d8e83d97233a9adcfadf045353d352d92ea645b4723ef058f8983f228083d89d8ccfba79540bef3a714b62a9091d964e3a2eeccd3f5f7b96e7994cb8076b4a896c6fa2d0234cd2ecae4f9726bc5b1e3effb7c2f7dde6cd5fb2b41293e5235c20258a28e279568ca6b475939b9c76b4cd119f9c8bb4febf8be1ea9775ae1b59d3aaae69d7ada4a5bf7d24011850d8ebacf68fbc22fca58f4c2bb8f45d0196cee6a07da2953a544e21cb85ec88a6588fa107d5e70d7c73ac2df3f7caae8158d961d4be16eb847b121ad34a0f73e253b828d1cbe17580da765fb74294092e6ae6f610e57d5bbd5907a50196c66eb61ffcd1800f832a0fd35f1a11cb07b465c8acf4f1d7e35d12cd528b1ee77ad274873fe1e45fd259043b805b20fee025a30058899dda75382a4fc077c9f4056884378ba26a477c28a676550237128296d3d5b7cf1cc4a41b9e863bdb8598b4ce5b1807b34f05c478f5978c68fcd8c66c7e69508e7c6ed5ba41548bf65405e08bf154d28981fd0f8060a8f80ceed2b5b56859c2abcbec437b337189a87730882540a921ae6527e1bbe7d6d7e9b1da252951e248049cf41725a3c7af8e41c09c4c4a26d70f40272f665743fd56a4ed3ab2db507f785c441b38ec1db7d14f6664a715cfdb070bec4cd273a100a19bd71c04775291b0cb3d989e1b07a7f1f064e57769f4c1875d5f867b75928dbe425ef641cc5099246958ff155b9489e16e92cbf3bb2090309546fdaa3e8a6b599261235f04e0c712041ad01c0f9bbffa8854b5b86ae1d3b6610cec81c5cb904bf89eb1713c7ed1e2992da31cf32438ecf424625cd9d40945f26e832e58abd8d8e41e8c0b2392ee1d9302de22cd36bbf79a9c9cdac250d8e59b3d8da62088679b646168c7eb2d9a77300765ee173a89279d6719b2f90c605dc6f5d8c8749de043e5102a74120d9d9f87ce19a253c8e19004d7e319447019f096c2c6708a530eac7b7f3c0291567331af67df9f70b33845fdf09e17d09a73ddeed4317b6bae0b596b2c7a5bc852b966c1815971065053d0088b23eca25e95e2d92c28b4d284733f20222bbe8154a4ce288abad2d0dc151cbc53f75fe41342131afb8f34552c6849672232fa5c8b824d40f0a1a21c78b807f594802805dbe34dc40d2dc1f6363569eb4bbb3c7ce1be08100716571614567d8208a5fb2b718b2309e348aac9ff0158657398f2dad56e88ee00c28f339232f73df08365e00e8041fde1d1af8b397f3b51f03a1bc3a6178c7d090225c197ca961f32c4379309e6cba63259ea29523ee5192284d43b45d9d4dd29782f491f1b2ccf53a328661dfd9288f54e5acbd1b61b920abd7f8519a3f6d54273f158019500dba50b8e345857a22620f13b16b4c9e4a7d23544bf25ef4f6512a93ea9706294d1e87586a771774212c347bbc9a0f5c8278c7e29eb489b2db5f9d13b967c52c0ef36e1c8c364b7a85ba2bacbec593e79b8f4662e2929fdd8a6aa94c467c35f482e21bca9449c6682acb77f0d8a1a484a6b984b9c89d7853b36c2395698f831b30ca0b83569266c0e8fca8752c701cfe7eb10ee6c076ad5d82fcaabc7cf0a377b4c4df4681a9906cecb848f13bf7f94ca67b514655a1a0758e90cf254da72117960fc268e5a541069f5233a7da299acefa2b1702855b499d15a47315e6115d3060e4929ff4aa8e8de7df4e8965a84d5dc3ff5917b9a766a882961defc383e16aa092e1e16566ca2a2189e3ec04ee85c2a373905561d6a887e2aa1f077b116bb4d0ebac643f361accbcabc299a75deff2fba837cfbbad323edcacaea48f6aa84d58583be8a0794229ca0ac1c412662a04fb8bb7ed9813241cc9efb366386c337d068a8b8922cf50211f2e03c5e20e6a8b809858c6edd048b5e8591a7344d9490171d668f0cf6cc9517e2248296ee393348fb88ab8e44d6f872dcc7c7396365acf7fe3cf995d8d340441391e37242f06d92bae11f7bfa352d55202813ec399f5261e65bfa4b65b9669858ec8d4986c59f276540b615ba2a19b92c240b3ed212a7da962da85d6c3455509e08bb8b71d0af42a65b9959b90c1e4bf90368aa0fd97e995e329fc4a860ade464248fa7b61e64e59643ae59a8b7f0199961c82b51d890834084b2ae9608da45824076c8a678de19af6c42602fbbd98ff4905f17f62a38e2e3946cd589077739968c92b504b3561b2fdd98c414c13caf65fcc660ec83423e06079054214b6ad181407d669d4317feb703fa7b6e8bcff29c8d4e80ab5d61d8fbc878c650460788215ac86524e5182755c110c5fbd4af89aec013f2fcb86012571a9206a2cc067ed51a1b711ff1cf34b195ea85e045ee557e92c9802ef264c48376db9bb020b68730bf8911ab54b5884e1e413d9fcb3ab5167853eb92626ea0215888ed878e4662bec0d6e7119bbe3702b15d6a94295c731135d4b86a7a3edc04797484210aeefc85b3f8b4ad4dffbf1a087d760372e75afee45a870f9f33d6fc352a14b48be5970540eee5d9b0bcda085435607a470ed5b52c6f86fd7a8cc2596191644cd2b0e32e042969edf901bdadc68f540cf4700b7534e7344d66b25f922db8ee6c07f3f76bbab3fec710106ecc750969c4c03ffc47afa56f82692d7cfa15cbd98d27fb19a77564d897ba42538f6218b2c49426fbc95704940a0a0bd81d010266feda2d34704e2bf226038544804a6ff6139a4ea76c85c75f44cde949599ae924547ee31869ab0d99e162f6f4f4b6b17851268e2644cc330dbfec988a8ccee1352c95154ca852329e5a8eac03b3b943817d6231419fe40a91a5f3e8515466aae56903f440a9d4cb3c1b64c6f41ba026011eaaa267586e1812fdc18152e3a867502aae77a6246793676bff5ab4a0a688e5a651c7d758dbd88f071c488c2856e8918751c4169741fa21c5692f14ccc5706c931c2601fce671cfb899b2ce82d410fecd97394524fb9fc3fa1d7a7b3192bb297c242108294ed544786dc8aa80c193a47fa1b80cb46292ccecd05c0e0f67c22d62c5b5c24af3569a6acb01e39bb89f52c0fc0d95cbb9557dc2793fd5ae2e57b35f6d5060fac69f3ab340493e9f09082651d6d3c3c9556f87c2a1770b301ecba08a3456828aa1900af812c85c5fbf1a530b9df0a02dcbcf652a38ea57137ba052ec8a641e1044064e9b85c6cc798940abfa7f5449af5f009b96a9445a1895f552ca3cb94a54c14f9166ef8702f912fbe7cdb9aacea30a0c14db8a73fe5aca73d9d6cc4d1400b251c66bd1dd8a072097eae583387e1c63b1dff922cbf09c143e29647c86f51a705f9281832dc92f79f6b4590472e4dea193f6a0ae72e87ffaf3f1a28d5afc441cf5366642c85ce2a643d34b43c6f1391f950577c4548aa1f5d08c3391938de844601cd418cc90d6c7e98a9ad4744579776a540ee80096b8deaad5dd0c2b538dc443f4571ca23a6617553344f907472d83d401ee8398bf5e8b7811789d85d585b2a44835e02f2fca1d39265831f65af37068ca67deba448ce78fc03e64271422e25507fa8d280bb27040307d1703bfd91bd51bfbbffe7ece18b35d5eb68f62e9d799703e225a428370487478ee56f1e4b3feac41f6c067e9065b20ec572d490ee58b596e3c1cd23fb03802497bb9a8dd5984f377c2d5dc5bef7f537ce4f06f176933e760b4100f0550f00fe1bf73f1d03a0bb45f6df71327d60c3714daada11a861002ea4f8095bf39a00165369bfe79f22e7b50ba52194be158348ae7551475af0e2a85961250d65a68ce78d1070ec48f4b526306cd193b71e587e66ac17f1c9bc4bf5e6eb0184486193751817c6dfb131e32b992c99a5c35dbe9939a3346521c42d8ffc2f3792935c738cb1a2ca9b3d8c5df1196914c890dbdaf3c0f0464c53e7daba20cd36af94df9ff7dec457618bcf3a14b80ff95a609098d6717e115d4117e5f36f3df2a1dad58311e4b2aea2eaca251241fb01fcc43e2d0a6c1cca5ae7025e2a06935aa9141a290684086caa9d8e1ecadedcb78616f4a1463cb99433de91b3c6eafbea3e44b340b60e8d6de0af7238beb6a2184d90a33c980ff09a868bb14dcb1fe745ee7c077227883bf1df5d426ab086047fa689a0e06b46c4e0bde395c223b9565024da79176c31bc51b72cca9e9db49b0ca4743326f87990437ab3202a997a106a73c02d58249b7534c75a5a95e4b436b480a04e0c3b37af097d3d7beb02c31a74b45f381815e27b616902695a12acaadc6264fb5530299f3272bbd39ee0b3309f5de4bcd506f07c6760a6f084c3eb3045406d925ba5baadaa1b3436c2789594eab38388a82aaa374252500ee00d5d0094277f6cfd6d4b47da876f392b2d2e8fd48e285a85163ea15fb3d300d1a85ca8d13a22a35f88b41533174eb6b46c79259a65bf5ea91f87285b48fe5b3bd1ee1f7bbb977a8ee38a6a7d120799a08b5debd31ecc8dd9d870ebc4a0d8046293986a4fb168fc5d9e2094da6610032cf06ff9124ab21534c73d2da7cabeb785e1a056ddf282bd8d1e1a24e4098bd6f068da1a48419ca2a29378c9e6dd3752657fe120f0d7cc1eebbea8037c8560f3f7f05c78162b178afeac8a457c79662f56712994f7736488295d8d6aa04dd2b6484418a2b21d0985178254050698d8e447f3f28ee01d81e84480f87ae7f05763f4690ccfcdaefff156d6396e1fd9e124af9c6531cc0049c8ca7344aef8b59678db01310ca1e557da614fa0f18de42ca9802b6894b3a2c481cb71d315dacc474f102b1aff72d8b6d5b562e049eaa38667044e60b59c44132674e5ecda8c93c4e0ab5a0ec98c5f00f01bbf89a4eb27a07f0c4f7707abc115bc54a6c5d31c4d1641d7b91f25f121d5785e17c981154dd91eec55b8cc345f0e02545c49a8f53684021c0e7156a0d5649fe515a331677213943f7c9300205fd633b76ea942956898b49f91b73f1d4c5b61dc68bdc709a634ab3ff051d3511d535a2d1bda6c195b9c948826597ed196bfc89574404225b5596709ef05b44c43a27d870a75776d0efe27bd4ebac5d25f1ae85bce947fee41fe4337fd03983fe05aa0dc16e9bfcb998502ef7f50f37605f575569a18b04f7d4f139a7e51e904a0defc3680376e50df5622bde1f502be042edde97bded22d97ff4199d58634aa651938e189f72208d889f97ae8982a1503ec871936c81f89265ce31ba8ac32d14264a593863162dcea41a91966c438f4f175b337668a07c1d8a761e54efb58d499f68f63428f80b45ed128796271dd7bf24c3c607ea7edc2bcc73d0b49f0d8e262f00f5df12d7c2301dc8db4c972c1d1a5f6aa9f30af0285d5ab3d254f0d42ae5a9f9da2d967bf46e4b20a89ee98ca70689ca3ce5bddc0eb0b66c8dd465166dbc9477fdc09ff01a88810ee94514853b24b8deb3552e8708e1161ca77df1f81161c357eb91ed422fe63af988701159245d8c32498eb608ad692315f4ed03fa49d7a65920161e35633d413fa8453dd6a1d7f588bf21086c2ae5eab775f5f61e5b398a84c51eeb67e9f9e2ac5bd91be6a580090001816010286632f558404b3d993c70a1cf7498b76c1c52adc3fe6fa81b3521a1a5a54d429b4829a50ce609460a8c0aa6cbdc88e9c337f27dcbfc74112aca2230142482760c336d8f11c9c898443132a6d21613532a954a254dd38e650d5fbbbb09bf64d2a3b5bbc75c264b3913a3476be3934a9a74986c77377a27c6cc300638dcd5b54cd374b4ed6ed9d2d3a5b3afdf5027a438780226e45e7a2773d347fa27432232bae8def781a20ffc964711380231f8619d0f04313ea50775744420470a37c88d3412199d30dc5cb8653a9998b0d475611886210c0cccb30c839f0875b6371a7d6118ee0ffcbece0b75c2ad240b1ddad825a55ebed0426bb65f9a5ecba3cbcc2c1b759da4dab32fe8c9f2b2332ddb8258d475da6483f7ee42bc777a6783e0910d5ea39b288f76f635023dcdeb3ad135930ddb4517b25db4b3af0ce671ee231bd3fd6904cc17745cdfb26b99c6aa65e9d0e5007642cb321aa3dda6d2b156caf4612e65ad6e251bb687c7a132c754ee2192d8e1393d0e91c4e6c252095fdc90a9cd084744f04b9a88e874fb41024cc3d8baf4f0dbbbae2bc1c0c068da7798dc85971c908bbb81c6472f65fa8a1b42b56b2b65ed156780b9691ce75124d2210d1a1f692433b84c2fd23a348c4d63d33328a559761c2a2333ba687491cc48241269178944a25fd175025f37d9b0c3d38d865a9839987f1a044f22d130a88de8cf929e3c7ad245f7323d789c0ae6ed9f7598300c436e72446ac83dac303030a5124ce9fb604030775e498f3adba6dc431c9a841e6d6e9ff71d0a82da6403e9e085900eea9d3d1a1dd9a3c378301a01f385efa33cead81f3e69ebf26593b6e402094400e596d1c149ba46d2261b4ea2796cb2e9479994c7235b748d6ea31c7e67871a01f305f060f72f636db1ecedda86488286b195cc16a84909edfe561bebfe806f3dfda053faa1444f20028c61592683b7ee74c3a5cd719bce1181dcf72e8fe027fa4cdff6c3f6303efd7ef861d3cf74bc95f677fa6924a652699b4a22f86153510bdf657094d329954a9bfb38ae44459a18ca5dd16eb5198134b486fb7d0f5ad3fdde7fdb876cec625c2afda248b3b75f4d4b9c2cbb9619f97e1d06a604f327e1f552f624d472c7675f170dd9971eb14b7b2fcf3deedc1e54a4e26665b88461320e3454bca7d9b66b1b78d29f7c0fc1932eeb09bb91ef6178d28d940e136a927e52ba87b136d24737125e44bafb66fa49688de2be7a1cb2ad83facbd7b9a1f9e63a42c321c0db6692b98c8c16b86b5e0ecf65fabb855474ea0999636cf01cc7711c168114d3d050916a586b2334f45f4fde719e63944a18d713c55a3fa1a167604fe47ddc908d8f31c69886666321df699039c6f67410738c219b9a72c07b370901bf2db9eb3fa1f1199f1c688406e8e539c6c81be9f1c878647f1e8dcf00ff848696f524d2e3904d3f430fd9df17924831f446e6a60519195896994cd6f42c9b6a08eccd90b7f05b6df4ab8cd2c516f44823c32413532afda24843a3b3ac3a3794c3210867e34f68fcc62767ca61c66ddc088ddfc8356a68fd27cffadf9941e346a6711b79863723db388d7ce33ad7f8733ecde3cd38840a996370363ee34f6e9c868dcfb8911ba7f15fdf0800eec2b5068096f5f4d1bbe0c3a69c369972d0af71237fbe7e0dfde4cfbac8a636f28d2ceb89d323109e0d3454ecde5deee419aff127349e67bcc68dcc780d2debc9088d67fd7aea9e5fe3466edc46ae217443631b7a88e4a8369972a8717d23f97f0dadb5acdd9f647d7d534fdd77360ea59165ed3ea3bb7733e42628db31d1182ab4ba6557ad74937dd9ca11b9ba09a54660026b9acc683709639c791947046ff7cab20c671eeef4055a1d86614f46067b32187bdec8c3dfb187ef61cc84d77151042e5b72014697d2965c808183ad6599c9945dd665655c10cd035fdd665c4ec5c7638c31c618fb52d1d3df1262adb51ed997f85a6b3d224e113fb07132f8df77b750fceec5b854fabfeffb3ef0c3f89ed7799ef789dfbbe3efc8ee3e1ed9187f5804c51247f270d76ddbf62c6f5dd7755df7017ccf75a6aeeb3a93288aa2281e11693080591610bbfa65f120ebe966da075a4407b80e7c97b74d6fb73a501b3169197d0d831803b1f1863fd365bc6f7a347dda886963b2bd4db3fbfb066a24a524767b5cb76d1bde36bc6d1dc0db86819039f85d26771b0f32d9848dc8dca4653d6d9b8c163923f0ad36400061ed1438702f8661adcbdcb792c9e277dda6c1cda4e16fe30ec4ee6e71386cf73eed186b3a0704e2c35c122b533ab61b5b3b2ac184a4d1280cc330dc44222c8b3870efbdf7de7bc17b2fc69c05626827a99b15b01b71d4c56e06b2e40c1d5222cb382d461381ffbe6b79043feea28ffb34d13739037e9ce671ff3412eea28dcbb22c874a801789f437f369afdbfee54ece8c56ce8c9bc42193ad0b767d5656fdc52a0d744c985c97062e151bd4a31cd57ad8d7b561b34b7a6d7a2c651aa33dd8a86263a3b50ac740e999e822ee32e1bf87611e9d668f1bdd0bc187dec3531c668c690f5e88f1781bded8c3fe30e68e3d1b1b46536ee344a5986d2b954a25eff34a9fe7799ee7791ec640f8eff33ccff3e84d9e67f24ce0f5e9d1c6a6b4fb6863dbb0e125716ff579511fd5a5ae80a8e8f4728c449675dfde75deb61dc6bbc511d9de753aa7bba6bd63ed32591bbb6bddf6aef3b86fda76efd39af7eed33619ed69dcd66d9be76dd7b66df38eb77bdbb66ddbb661243c6fbb2949bd760ba2d16c6cecdac6ddae3bd2594e8f776f37f38e8847449a2f34b8e787761be9322f99b42f87a7998bb95b383a179ebb4544944771d350e77ce7be8c3fcae3f7910e7ea4f008f77ddfa74d22f08848e780dcbf234736f761528849c71a09e9a0461273ac236e7c4edca44ddc31a5980da6548281818181e9baee59ee7af0c5300cc3300cc38edc985f52292485208c1e2ff791e8d33a2286899778893aa2143a22fad0dc7bb3ecdefb99dddf7b2feeeb575ea7a1f9a1c146c83c233d8b19dd7498edd3ba92b45bf84e098d2d7a87c1e37b3dcfa35aa47f3081df1d9f7a0ff308e2d1457884f1a9a8c8f63a4f9b40fc0e8f458a80a37f79c417e9d13d8d647411cdc65a87668ff406538a219960602825919e9d4449daf5de913cdcc9c85099675946eb346c04be9cd76158d79dd212290465bc440a41ad61f488495aa43f3d8abb769791653d75dc69deeedd3ac6369af12ba679a41dd53a343445686852d80976629920a19fa2493fe71fb0b3e9b516f3f196b46f4dd3eca6c95ccb5da795c68fe2d6b40ac3306cfc2e6d96ddf3bc0acbb0ec38cbf2bd97391d5be632b7da2fed22ed21882f6b8c2e6991268d30ec15c783e932aec9a0329ee5d124d217f676ea66ca320cc30b913bfcce16e52b8f3eeceb3883e043d133f0f20ee69d7d61efbecb9cb64636f62c8fdbc6f4b8370e07fa7918ba29a151e0a74ae5665ca3714d5fb7f0fcdb7dee5c16e14c22ddbb566dd806514c4c4c4c0ce5c1a3721bd9dc63f46864c75cb381b98abb0efbb0bd219344e96bdc8dcba26bdae47262ce99ce1df370e3363eeab857541289b4c9a48ddcb88de3dbe8be4c3920df47380135d0d33c0efd2a8d73651376b9efff04198465cba693e2d860049bfede9636c022c6a632689b02059e800008a89a7bcc006501296150407661451528a89bcdd3082f88802557c1842f94506d364f1e31788ab0369b6b9690822e50dab5d95c638526a680d2ee66734d952c154069d8128640851e649bcd72c8053a7882b6d97c2f565cc102db6673938791c5044ca08888210b282c01655f739339c5145044842240592da98f116f9ba5129ca8a20baa66c9832ba0b6d89265d321f06c4a25ee6440228b0b50358759a0aa13a52d8f51f256d6487bedad4db49a85c0626c192f7bc45d94d45db5ec510665d9f33855db1c0496290a68b1ed96290a5cb1876000cb2db7e0f2c53c028f785735cf2d56a30c128748b145bbba8eeab86757353245819f5dbd065a43c517a0c66dd32368338abdb7aee350bbeca6b592527b59e520a6a59976e3b4acabc12ebdac2154a422fda1a3c70d4e0d54bcc1083d55cf0a3c96ea272dd11a5a2d1e4dbedad0dc20659845842165aa083164c04c206dd436957a9ed219e489aad261adb87333c5564b6e54ac97d993425a5b53baac10768f96d6a1d99516e26e1d2ab425152b0e344945ca733fca302e4b1e085a3356977388d68caf97f3a38e22bf818a219f5078a121868f618f8f251f1f651ce03c3edac8e13b3e8a928ad8c71ea48f37301f7fbcf05166a1f928b5c0f0517e4144722922bb841fe51729c64f1fe712cff17142f9ccc7d9840de7f1714271c3777c9c3fff3ece2a177d9c56708c33cb9638a48e8ff38b9ea3849cc738b96c2943be031ffc38c5d8f2f487d2004437b1a81ab413fa437dc813e0f298c7e57f001a2abec88ecbfb40c447bc9462c34b97325284bca429944b192e6f67b8fcfd71011c8786017c945ae07c94a9fd5162e1a9b1f9389ddc7c9c3d0190ddb98f538bede34c6d8965cbf3c84bae1e79475e72d164312fb972e499975c38f2922b061c7200801e331c5cd0230c0e3b78c880030d0e3b76f0d0e30c38c4e043071e3f80bea147925e72b303d9d023a6830f01fcd0e3d481c7817a647a24dd870e07f2711f7ac42eea90f1c881870ccff4928be9313b4c0ed80c7a24c5a0471fe791430c07e221831e6f1c268703657ab4712c07ec4019498f317c8603f9d0238fcb40f31d7ac91577f8e8e1e3403d00f01d2ee0007320928f0ba0c77ffc859c22ba861e2b9abfb083063de2c81169f4a89fe32fe454071aedd0e300725e80c1003b4e44671a0e743d5e03881b678701f413274034341c06031c0886c3a0c77bd100e10543a8975c1a0e74f558e92577007a0c0f835eb2bda04718be432fd95e38d08ed3a0c7fc8bc381ee2b1cee81aa173e8003c1a0c71da741eb71141e28871ec51c071261a081e14034a11e73d438508ee7d0a398333a5008c337cd71ae7f0272836e418f227baad1238e4f2093c6ad5e8245cf01c41ea885931e6b2e0239100e3d9e66f2926b4b2980781bb4c9e640317abcf492bba5146026007ac471a3c75900f140396c5e8003cd14e03bd0cd3573a3975c9b03dd9acfe8251bd0498f3317f592ed7420d1468f57ce4d07cab90e646bf478bacd8166f428bee63134f4d8825e726f0e74717c663ec7cc8172dce85144e340a28bf4f8890ef45d8f330fc081a61e73fce62d9ce621baa25e0338e3542fd93a3dd21a70a0f428e3e06b0df54028ee386aa03af2920bc781e685681cc40a32e33882e808320f8443e6414ac741f4137c20eb7ad43ef5926b4b0162e925578f1548e94095d3e30644f538e3532fd9e881a68c1e4b7a09de32072abda4c70a443f710254bfe9919e3bd00c3dce772fe9380ebde49a81d24bae8c035ded33f4920d48871eb7e3d04b361d07c271197a04f512bc671c083ca847ac97e02da506fd043c10be13238e02d2f4a8e3da81363de2f87619c7a91b67003408e0c70c3204e0c6a6c647d6f11e19c763c8f43cf23c0c59c769328ebf90e977e4f999ac63892d9f23e338659ac49617f39407409e7117b28cdfc832b7914baf91675c6719cf59e6cfa5d3c833b4a4620b598696543465192d1f934b50b6041f8254b69c92ed2e5b4860316484cde5ca4411a926ec2d5f35e8f9810ab6962d2f8ae8228c9d6559c3af20b780bcca526ad04d26aa86db2c25886e425135bc66294074938aaa413b91d407d523fdd9f204d0461c25a98fa9474ac59653531e22be1d14ad11042a9e165b8e5476f50ac59eafaacad249a6452fabba7de58854af96cdb3aa722e89544d244752d13ed3cbaa93cc4d77ac59895091a074d235399fc032c5c3656f2f85a169f657c681f4d2ad4c64e6eb356bc755600c3bae02db6ba7bf9eb7fc6553cef5f94b2399bfbf4eba12ba91c41cbbe6494e765b77b9a796a5f7ce93f734c96d44e47c9fdb7779db5d12b1bb6b79641204c976b93fdc6473dd0376f69c720b8374f72e3712d1e51eb9a9cd3c6aa3768f8252ce8cda25adf9f4a809c1846727a19be384d0adc9e420e60376f6a7b9e3c3607953ce77ed9f46d2a4c9f72e574bbb4e8f399de85f1e81d89ce838d413bdd3e3e4d9a24eb3da96b77ae9363791eb5b0586a1aeaed51d6ebabae44221db2792502b995bbb964df8a26b0fb3095f7b28448eced93eaf7ddce1d99a5642b7a673ae93ad6924f25cccc33c79f6e4d95c26bdf418fdee93b3617be994cb21bd44e4faa769dc4bf95e4b42b96ccad94efa76529614cf127bfebaa65ddbe4888cf6d4482e69370776bf32a7376f9bd7b58343af65efbafc523c4ef67cb79da4c7b949154744eb3429cb7d8d3b9ac68efdca92c87d77ede6792c4bdd9dc354e0793d9bdabf0f09f7ebdaf55d5ece4f8f54cbd77569da3f269e5632bf2c3797c78f7373a6ebe035d3452f9df3dde3ae819ef72e5f077377ec7dd7b2e9d3393037e17f076fc23ae73be85dbe74cfd41d1ffc954de14b99c4715a26c190465a1e3b9d43baa91bbb73978739be289bb88bde5d03f376980c9e9447a3c3e4eda41d29c40c750e7813774ee77c97f7c0cc71bf32be285fcff9cec9716e5dde2e391b60d8f349e6beae659dba2fad84ee790d4f81e7a5855110c4c543a22529685a45245b4de5a47a1352d16b0c2a7b7e57757a735e39671e4810fa7b9c7a8d7667572d2906c2f4f29e15b03da5af6e55746e8d3e678708ada817647ede7acd959573ea2b223c30266c16b4ecf9ead24e3b85989bd67aeb49b86d559984561a892967beaa74109756a2807167cfef6c4b3fa07a926a57fa01d5957cbbd20f984fc2ed4964de6aaa95cc3de9127e31d5d9d7bd18df707b76b17be453b81430dcf6d245dde85ea6dd078674f49d7ae14905d83e3a0e0d71e8611def340c290468e051676330dc4661a8916c1f69245db8f169b8bd4ed4712211c7711c2745f8ef1b799e17def08ee1a6f4babbfb18ee500759965997138c9f2e88bb95c8d8dff6751e77cfa3df2904687005d8d99be6ba1f19992ce3b8cb5d18ba8161024debb6980ffcba8bbeeedbb8afdb38dafdd348ba8bb8ce04941ae172e1c225cbaabb55acc9be19c603a7aff3905dd3b29e66a68b5011bb972e7269950205c7850b972cdb2e4edd72976d9b28dbb60c7260967526f03cb470192650cb8037d282960116a1a255848addad631887451de779187b5070e1c2850b172e20088220f84e4606ecc0c9030f9725bae67ddeab2222530e0116ef0a822b578866b805a532aa28b1e9317da98a0f5a8005087d1646f04ce182225c9003a19d9ed40a94b052821308696182951f68600b9eb0800640e80c10522ce0b1c73358b962a39452ea71406a7843ce90851634acf082ca07a8f8a0091f2a62aca0052ba882152fd8f6dd13ac20c1b6f61c07c45e6bc508aa426f6fc45a6bedc5af5620b1eb350e48c5d6082c2e50ca5460c5a6c730ada162d8e0a2342c68a0010df6f8635b394a2c5530018760db97ec6f826d2fa20009db9e268a6d7f334509db1e0705dba652302404832434ab0a2db3877a61e58a663920f5d2500595296c8a6f0c0161f6482d415f6417688b1b51b4eb1a155f6875abd95a29b56907d96408497da02847640749cd961179ec3ac8635ad6931eeb9554b77225da0802fe9e7fbedb06562ab0ebe50ed2b04b1b9f1c0ff79894179ea7919776ea110b0d31418b2c951a227fa85dea90d41099aa94ea64b2f4129769449c7a9abfd9969882ca96a92d535278d9527cb1a513b64c9d800953ee944159b6f4a19136dbe5af05257daa4d917a9a17aa157341ea662267e6bbdcfa20675e0421cdd6abd268aacd02aab0e776b91fe40c06ba74e1385b2b103a549cd80f3e77c3e00446b877dcf679cce5207f307c7ef0e932bbcc295c13b50156cbd6118093a02d65bbe476b05a50db0edb10dc37add52c002741db395cdab4bc388bf5a4d92a545eabd9b3cfef68134a9b8c64d7aee926560b0eb5d588f64c3731499128ad845da25e696eea8952bb65f2d8303c28d48792708077a5d7a61c2a4a7bb7e750b5a13ef2343f87e65077ee4ce86bdd2ca5c1b4831ec2847da29a4c14be77890ada62d37a6ac2c3240a3c87e66718537eb15e8a528a40117b9e1eb1e7ad127b9efa4cca31913318a016e3fb2a6318add829c54eb16f0cd393e76e2bdf9d652a2fa0c265526dbc4f265791523d99729828eddd37ea537db9526d995dea69f654b9a2aa6659966559b5560fb5cae950519a264d81855c1856ab4eb8edbcb909156765f20226571cf145078b62e2c417265fbe58f9c197100b4249e0d9d20a5b0a7579b283f501cab44376ec981e427b86c22e519333925dd34d4c52242ad392d341a26e3d4dab052551a68badb45ec47aba953437f5347f3068acca5689af60ab81ef96cc540acd947724a458553d54ac5ecd2b2584c4fca287d64c2fa458bd9a7a6aa182b4011617a0f458ca206dba7f9f5b6c60cf9e3c7deaa96eab279417a1e7c6000a58a8580951918a51e091fad01abb81274e8ad8d5e912520649835d9da4045c8f3f873e7feaa9bab8add777f9f5641dcb6e55d32a426fd8d953eb883bbbe56c88c172042b76f62354aceed6e6cfcf4fb591a8db55b9c105bee1013c4a214aefada7eaf4876ab49f0e4e9ccc7be78f3c5540e68e2b7092bb4df33b7ba6b4e9badcf313557d66a9466c5959aded8a3bf3562d6659b962f6549b79459eaae7c0c78b5d5544d8d57da0cc282939531d0333556750954d535460d9f2ca96292a2ab02507a448a79b4c940f374080c7999a58a6d0f7487dbadf6aa7d6e51b58e0cab45dd2ad3a955834d9058f4c4d3134a7a4a6f8b2f9a49ce8c0a49452aa43775311ef9e6e3251264cc57aaabe83c2415ff8506d3acd63b5a04c3b74f7eee9214c4789f554bdd326ee12d55da26ee50a4d3e1834160649ccd4901bb68c936ba062e5536d664a9eaa5713d3239e152d526da84f3d55afacb5160b43f6f566ea43c5ea57a64bd0ea266b7ea6bacc30aacbaa9a59765579d955555993ce1e5a53a57e96d8954cc2ae3e93c8b130f0c4b6348522c309a69fd5a760f4860ab4fa49a3501a14a5dac84cf9c162c527077ba45470291328618fb48a09b44851a19166d9f523b573ce392d078250f2e265eb895e622cb6a25ad8283445b1e460dbef8002b6af7c68cd482b28d546f254552e2ed5b9e5f6b40a0daaf63425246598a928b4eca02cdef692ea1317d81e8756f6d65aeb96da9ba4c0348aad5eaf57b6d6caca7c35eb7c9d75d659679d75d659679df5168bc90478be9ab3ce3aebacb3ce3aebacb3fe9ab3ce3aebdc8440e94f5cd028517ca82841b95b863f4880ab57fd830498f2d4caca2887367db5252868be6a828ab1a716a1ca67a62a9fca27a8fedc380993a87ce612160bad3101a61f6d141d93465a2aa8cd264ff45dba6cd942471ba5dedc84e168a3d8d8a38d6279aacdecd2656888f6c85b965a49b897431beff156d4d5a42970bd16c44a710405b2b0334b290aa1e10dac10bad1022c3af00545f31c7ae2e3044a4041d16c8a02752a44e019811628223c2d76a359c606503537994d0c31310414119814d546b30c420f503537a915684207544011314a01ea5a3a9490440a45c41dc2b5d12c81900554cd4de8145350d00545445804d4959755d96bed0f72669e0b1864d10545f38f24a076261194522542bc517156405a21ce02e35f71f67c230dbed7c3b82b95b85f8f347b14051ee797fa2ff532054514bb82bbeea02aa502553fb5c8a02e73280b4c0f4488209264d97550b13e882473bc1ec4b5b59f8a9992ba35fd5a8370a954c719347e72330a98e6b002631f67dde49cc1f2583cf2f2d4123d0f2a602db858106061440f76fdec526bc7b3e74c5131dfab671018f83be85e1bac1c4bf7f4d4fa2b2b21970d775756ff2067e86994cd094dfaec7929af6451654f9de49ffcd1634445014d7da50c4234798365f6b43eb7fcf86df9571b4fd7d0692cdb92521c65168b89714249c1900b3616dbcac1b6b80945ce58542e1646f54bc67e36515dc774fdf5faebd7b3bcaf5b435fa0c0234f72cbb0a1d02367e41ebf9fd0459ee4c6b42ccf26608033141bbe915ccff46c828ad68c426bae5b986db2b1213646c4c62e774c8f577659bfd6b1d3c0007397d93e50d1ca3d589f4d584b3431430e1250c817e4ce41220979ba321b875e5946935c96651bb07def8375fdc8957da0a2751a2af0d50315ad2c0b41b391e8641bd30dc8f6fdbd7acc7bac8e549b89b2eec35d82943228c19b9e5ede7241496a83456d05a6a9124cb176fd0da6dbb6dc0f2630762924458c2d854e30836d3921d84df6938b3db5d856abb699b70cf06cf91be01c4fe09166571a9a4d93019e1e3739a2e0b164bd3e4666567d3fe2d841cc8e67cb6a53aaa79ae18d692f576e233472a6deca30c899fa2af3903331c8174639835d67c032c072cb54133efb888ea103f8dbd62eae0e36b5f2079ba2e489ca3d5239eeec3b862684fcbdb431d264ba6f4e72f7942fcccb5bcb1edb16a556756f61d7fac4e16d887266c6e04bd733877878783480ead9538ff24bf7118bc071fb4efa5802411d1b041a5de6e3cd06411004c14b2118f072ce901dbcb665519662ea22c574195ff6bc8c6934b4a744855cf6bca8cb9edfbc685bf694f385ed5866e5cae66abd2c252505e6a52ceb6994a923b4ec7952ae0010f313226589c25aec792f8545723a7544d03ea2ca9ed778f67ce664cf6350f6fc6d62cf5f51f6bcf5b3e76dcf9ea90bf8ecd9f55c3b236a7dd1e49c61ce908212c64e3237044a3b49695bcf616a73b372cd1465e55ba9edec514264555f5155ab4c45e8775044a0344a5196be79a2345babad9da5af9c9928ab692582521ac59c17b0c24f151411b2081cd84114d4774aa7e7015a437a9ad72687432dc06577afae5d3d1ad9575bbce13cead8f4029fbbb3b0dba81bd3dc2b4b478749bbdc580df464d26eb796577087e0649f5b4d9102f6d8f4376c80471954f31a865ce2b7d4e9b1e9ab4ff71c05ea92d341a29c64c766b67559d6539528c9012952c2415bd620e2dba9a8b784266d8c98cfaed656d5cd0d438a683d5c9ac4a1a148d68a614ee6b6244d0f6badf54ae620a6767d8161d65655d67aa85893b0f6f6f8c88bd4e6bb04b3eca9555b50b5858a35e3f1040f0fcc9ffb9c536e2f54841285dafc509b4fcae0d30029b4915ca79fb7ae9980ad064821213b537655c9797deaebd29796eb8b06d06c24f6d52dbd655996752599bb01724b8f4db3c79d28bb01349b6a24f3486c906b9c1ac8bce6edd563f5c57339a15202185e3069104da1321f5e2cf414ea9b85de940704fc65de54058fb787c7123d780478bc7cacdf1f2a4201c3c0023c26b1fb3251c03fd74fdd92af2f54ac5ff6909aba7cae2f3050f1a93ebd5fa77abc5fecfb73a998e2051eefcf2e45c1b6bbd78377849bbaf355eebcab8b8e8d3df53504061e6fb6023c5e5a3696af2d25c0539b66769b0415ede57369d9f5f76ab9a57da5523762a5a2f404b63ede54690498c706f065e574023cded4beb474d1aecce92b888afb62d15e7d0badd1b858b982f45505062baaecfa4bf79d72a9a06215ba3fde0f700b5370123a34fbeaa9f4c543c51a64ee9b92a7fa54a9d2b78a2ca62bf078f16834448142059439a134416b2c17945e3e97cfcf12502e1f4f09d81e94610bfdc01713a5533e90d2e3504ae935e50351e81592c0aaaa2ad355c910c54b25ba526d46d5e6fba9aaaa32555736423a78ed5ef7d2004cb11e08325d7add1e5a73f55011caeda1353873ceebd2261becbe2ec4eeab497892bed9c8e89f6e22fa486312e0d18aa09876f80e1ed44384ffb4f5418d37a46c7d28a5d70c42b303424a582047adf49a426bc6faa50a187b68bc56e6d4287764b403495b1f6d79eaa97e942d947ac2a161be5a44f75e3cbbfe2405b6507c9eda33554f75fed42aa6f9b9a7e6634a077cae181288c7051e672a456ba490b5a5da885e6f0d551b89b2b4585dac2fbb529e2df76853f6a79eea45d94ea9a77a30db28a727f06853a97b31d6925559767b042d91258badb26b7db040a936403ed5e6fed45305858af543542e1f28d712b4c63ee1de7ba1d01a918787a788211e1e54bdfda13534888706f1f0ec2ccb6e0c4b2c71b7ec9a55168afbf3d1da02658ac9f2d9b5fede2de371efbd433ff766b9d7cb1dba5fb02dab7e68cd686da182d6d8a1aaaa2a8b038ca5c0b0178b15a2624de5236c4ad3a6928c940dd242f4d14ce1808f97cb47288a969f6a33aab751aa8d4fb5099fbab2c7fbc5976ad3e4d34dbe13815d0182115a5040d745afa16e02ea26e0c38fb4984f53e071a63250f5a953528b6d5333be90d2daaaaaaaaab2f60815ab0f582a9a1ed65af94a9626141a4198eef1619ea8c95db7a914adb9ae8b86613202da14f5510f7e07e5f9e0d1a6be6c32f25d74916e22faf71d944d8972930d0a201bf00045c46f30861628497d8c94cb09aad081104041e154304bd437848a15949cd545ea966a6353b56ea95ca88d44d5ea25dfc0565a0861cf1b2ac0e3c592ba42370bad1969123b55ef531f657e4951d17a9ee2a66eeaa66e6aa6687a703f98c09f5ee6480ad6526dec1579aacfc1f562572d9608bb5e4bb591a88bab4dc9999ab2360b1b5436555536556d7258a12f688db4616cc0caaea31563d7cd6ed935b5abb5959d5f684dbd37b553b4661689426b70e697700ab17bce54b529cd21f506f3e9680f5d68d2670b61e9142ad22954884ea936378268152de81525a8159aa226da45a3f6a7dad0b4000449b000892b590ca1e8b58ad91f1d846e9ba2353fd5c6852d768a159b85cba68fb2e947fbc5a6d514252cb0474b653bf186b070608f251f2f7bb458361547fbb32976a78d426bc6da6543416bac13e69cb376a936f45e8c4ba55f14bbe8405135554ff4180c2cf738a14c11481b8b0239a1541b2bc5b452cc9a2aa64d76fad1b260d35b608f1cb7c7096553a127fa9badd0295e1578ac5d36bd17ad1ec3b00b911bfb0e933d2b2cff60025ff1a9b235ba5db5feca3b7be624755bf555b5549498a5b56e57a8c2f6ec02df6bcb7481ad2dd305aeb64c17d86e992e70dd532894e902d33d3580e7ed1e3fcc851db890030c040c84aa7241484a8f09d6da49abaabaf6558ed5da55cdd56eb757da6b5b36d7add129691d87d02e64995688eba54dbae16a2babe6d8f53576fdac2a7de5cc744107dbdacaca63dd36c7b679acb16d3dddf512bb975571544c114bd286b392f2f0509e4979ee0ea4483f6e3593092705887aa277a1063c3876d8f5cf9464d5e70eac4f9e2a5a4329d5b5529975d6aa95bd9775a5ba52b7bd525da1db5ea9aeecea4ad572f228a980aca95ae70a9562654960d7cfaba9b5d65a9753cee85d358695a60d4ab3d6a9ad754d0d843ae1bd2c5bdd541bec3c343c725a40da501e146c3aa56c8ad5e0b26c55653ea7501e5a6b152a7da43c41b43d854a4410ba32e5a2a324d45a6b96556de3ba8edbb4cc8bcad67b59d5e5be5b747e487511eae1480d3835f5e3267553a5ecaeb4e472ecae2ef08eb098cfca999a89f5150797b3a6684e39060b7542ec5e569565b984b1dccbaa2c2762db4eec5e56e50556eb7647db85d4e852181e9fd168544776146ef1f45c8af982ed489bed9b9e4ecc0f6860d38fd3029b5e2cce29f807787e34dab2e66eb2e67a359233d4db7de51e8e24c087baaf7cc3909411ca1511ba99ee2bffb8e94163abeeea20e6187b017286fe071d0566a2e4eefa09c89aaa93509102b1c5d22969d6557a6e9133740b38faeaadeab367fa60787fdf00339132486dbb092fa647bc7d31f974237fb12d6317bab83159d4985cd3e3cde6bdb854e92d5300b0c7b9654ab58900a594522636a5f741b6ab66f2033c69c704d33a3bda2e6c81474ce40cfdc224a324272ee4a0d65a2bb6d55a6badb5d65a25a6f4f201cd9cb30bebf5f89862eb6a59a6498c450dcb19fa9eecbab29ea80b58f0bcacae8dcacb395f5fcdcbe46e69b3ad69b609706bb3d26d6653ce68a5d6d9764ea523bd4eb8251577c4705b8d56db52aa838a53dbba534d8bc4c74a2ba516b52c8bd62b8fd6a9fd45afeba2746b368f56b5276bc4e4e5680a3c4f4f3b8fa22d3349a7c545d3484078524a01d083e7ad911478debe3a0ebda4945655eb2b6df5b8e3c4a4955ad6754111033279021bb02b95a76c574ab2aaaa9f5665ad652b6b6d554929a5652b6b596e0712b0fd3c0ecda6d0269dd5d67da9cdb5c12e5fa27bea0fdc57033009e473c0ce539eeeaeae25bb1edb555ed36e550504152b8b43e794524a39a7ac5765a5cdbd00b080e5640b617755f58e2e3d96da597db41e582a5842063e4d780015832d4ea0a0828252547881829241179b2157b65c576655b6d2f4b8f94153575c10d4850e30b865ea8a943b0696b165ea0a121812b068cb54eacb90d4502a0ad196292728b0ed96a9d413f7da3bb74822705a66cf083e2d39e852a925b83b841a1f96c7ea141728c04014bbed2adc950c71db8a0628d8150da2b0ab2da8ec6a8b293441dc3184b2b7ce6007bb6ac1c40ca0ec5ab25a5073079bd797a089ed15a74d6dfb792f74e7172ff60614b0d8e8f1430659b6bdb54123d836e805581881c50eb278228b256cfb163820360650f064c8407f65008218e060d39b3011412842ca115e88604415720859460004822e8ef0831fd8266cb1014dca4cecc6608b4daf68c2a68fe180501cb4c52d8d326cd4587181952c5c91c5b6562ab0ed613820569c3d9409185020a394524aba5568e3be8067dbe3173cd9f6a517f860db1f06402e38c1b61f714002a3b3a8744cb7a4514e3245230000000000a315002030140c888462b14816e789a4cb0314800e819848764a188a93240862140421648c32881842089019919119022700b1e93befdce7735ac0c7858f9980a7ec852f010b693b71b19c7c8eb5bcdff64b59fc5a65d9850c0fac9c1dbcd142f73eac89db6747b11f920f66f35b0f22820bb40569b86f23a108f1a3b539885a9d90692c3448e70effbfced2695bf80127bd9c2a2cf50df5428977703634668d2635c33cec33a3a394b6cabdf30b8d4234614d1652e297550e85763a52d2726cb929b9b4531db8c729c67c52cd819c6377df6502140463e15a44974d289ee51d1aae6e79b6479baa79d5afcec7e6ebefe7dbb5fa144cb520d2360e2328fdd40fecf112baf7804ba25fca5e65f611ed3fbbf12745c129074a6b4b536d02e5b6e914be41f9f23656455d39c5830d7df1c550b29c6546b32128f255b1f9ca10bb4a7a9ad94f804b3df4428f06ec246bc57af48aed4e7fa3ff74647ab9188d589ddb52c600c715ec7aeb8677dfa8bd181a30ebab7895f4605ce87378a10659446aa0252bb5c6ae008e8b5fd4b1a53a8e28085dde3027da3ae70f76e1004bd40e66c1f9202f7d6a3e6882b79b87cec0325d2d032e36e587d3e953dea1ab54aaf7e9b92aa3d8d9546c949f1a8e427c3d2b0d5c6664ef578880bdab1386613d350202f07065d6f3824cb0b2d2f62d4c3d93838beba01efbfd8b8767f1f63c6f547c5833a04717e4bb5467ea05842d4d4657fa03164c223517e06858cad5da97bf7787ec8a26a8dfe401af9ed5ba28ae517f759c9313b09b7d22b844e4d2ee521c543cfb8c4188eb1289dba9458a63b3f2329f73266545cb6015bf34d7e95f0a4d900e2d4959c22312c1dfd89349fd3c52662d123ea4ec064cb40f129398bf207c252106ac9cfef2ce200dc92655d57da4be2a943c16159eaa803e322188c60a4bf4a4b4617249e22cfaba51f3a243e5996a3e568e77edf41c2111d0f965a1510052b569f2181804b2b9a12871f40aeacfcc0f0bc3be5b4cee1673c7081dd08f791f7f83a290948b27fe63593c716938ab3b972f7ee3b1f562a3d741e50387cfa4ed57f4fd71f3ef8f4266caddaec3e75f56d346dc61a7377bc0ed6cb550e3fcf77e3c319144b165c114d424e5ffa8ac153e4b98da865b45c4dd58f418a27408423108285f2708b1bb4cf9be5a47bec9ccaab25ba8e0f6f16b55099e6d04ec7bce249038606e514f50213abe16c5407625cf72713fb09812773df9aa98cb8d9f84603f734a877ac2b4ce4048ebd27f767fbb8f5ea6a0074c9dc9c65a89cb276b678cae6e1450c789312330dd94c9ddec4fc90f09ca0400d056f7c20f73573500e730f2b215d1e823361095c337a77a60476a310ff0cd2d10fce12d7f48b3e3ed614649bca0f45da765730958969227eb6663449e889b8f385a3ce2104205a8e038df43f9fb4ab8fbf32552e1f3f4881e23f28665e8208a03354f33571d2ec679cad4baa7f40e42dc59fb8c3bc1202043eee9441d303ef75148921776b90a52dab6d0084cc14875062968af24bc7e9c3c7bb3dce6ec327a7a33a81e85b0f3b7f53f8bef7df42bbd04556293f66ee71e30d1c29b1ee5ede96c765e51695531959e034a431b3b7686c9235330232d450f94b24d3789f3965626af1a14a2134a43087d1f4037181515a6ca40e71a5b87a7329c6fe7afec3b9d5eedd10455de12201c54fd2c8f3b3cc9f7edba38076748f2113938d31020d39d90636def74fc650f9e7c509b21710cd25978e7eae09a87967856cd06ba744080dc68ef37dd274b76a17ec216f8da35f1658c1c238ee0afcb06cca337b18f1e3a16a701b6194fc21cac87c72501b7682acb9c1e464b39369ff050e31df60ccee2b9746149dd7c75825fc97c8d1194bff2b69113e57b59d85cfe5500ef398622416f82421f70283098fd0af3d4d7efc032be96dd41d1135f6e88769284e8e5ca1135a03ab74f649286e564c7cfdf0ec3038c391ebb001234647d4a6ded3b3552b11933bee18ac695568d5c0007deaf31e8f221e2f54082b0f1195453b808515ae8065b705c5b91693a7c0b4b3cc94e381a3381ac88ad2aab0f87124a70de576d1addc97e607d24ab3337fc606a0d57de90fb4ec71d4250fb733bf1cd37e3dd041b55adbc59bc939956e6fe03dfc60c4afb4a27b215aacaf6b0c590c69520dc0614125c8cfa3a4d93836eab6d096727c3e01228fe82da65213c8182b78340b4bd88d3614e00b19a3a3d85e21da9a6774fafe308fe9a958a896b9535b2a308fde57b641b2968593c3894b20c4a4444a88253f4aae32f600d4f0e1387666e1056f9ee136d67496a2b609ac79a53c15c3aa4849d8d4746247090240c0b9b90534d819eef4dd1ef071ec2c1d533b52fb9f0db9df80d1f66e6b199125f9b7ac54152b8a7a4a75ce72bc45c91e1af1ac4ac6d52717895846636b6f2e96c3c47914a840d78af2fb0d4feb2f0f9354a72ccaca58da32400a0f34ee8714543a1351524337f6008834f8cf6cc5ba586f9245e4ddf3a505f2bf86d82683325d52ab09ab7fd878ecea98582c9caa5075d582488bb492e8cea5c1ea00d463e18c738aff79a1029f1e77e4b54962b10febe5fba360c16f83afde3c488977d9ff316bd389b199ab5574a8deefb192cbdd4ba80fc08aa30ec856bdb055d4e8f772d24a9bd2ba577128d5024d8a053a642a33f86b124355396e0bf9ded09ae1ab39b0f198fde0a87442af46f0c8045d2ca4cb2b23b033dc468ff5a7597170c48aa9e867bba8edf99995c3848a6ebec8d1c5afe9a3fb55dca4dec49becfbf531ed4cdce5646ffa04c45b434721d1c85eaad273effba7c9e98abb7aa613fc723904f5adb1a0fe51fbb508e13de8338d499bf56a244276b157dc9e20562621245b81b01089cc757bb934f1d0c94aa60148950c3b3db035d3c656ad0d2a5ae2e63b83fe421eb0fe5c39ed70ef34a2c688cf202befbd13353eca9aacb96f1fe1197f94ad16b8734c3a1a09e44a37164df4b1d4112b38728b71c041ef46afe63bfd297b8fe8d120770fa24bb0e2ca90538aefb6b8b744407f959b06cccf98946d04f4b78153a4eadbd7d41081287d9f5d5f6ff8cca14d2feb19f3c5558409a974654f9b195e2d24287ef3118947d3138edd55cc84caec0e15cc9937a49aa385b4b46568cc918f73cca55f1f71e651d370fe1d4e7360bbd9e85b6f8109a38ce18b36c3a6843d92c3f8835549ee61f081ee2e087a1fb568586c5d0773473e074b3d93d2a45bcf6f8116a4017240617ae4c4f3872a56b1ed41d85a3f80d68161b36500c6e5541965e15d3b0d13e44a347c5d6baeb282baf74a5ad144140b393b4209cbdd157c2a9ac30d83af581e842a54a06113cc689fa5a5d5e3d2161c4a055dbd12b37af967055df4d46025b455ea97988ebe524f6a18aa86b8dd6612aeb45fd2c190eb2eced57710c0ba22191de54d9f13127d46566678b60ee7d05f01df2e544e720a51cc0d312c545d8cd09355894feac135a307e16cd9cda754370f702405772eb22644a088461a7ceb0c6fc51597c52e476c8595223fa2cdc4407354aa599f2243fa4da42b506f74e94b401459b74dae8b72979f8a502a12d40b010ba85574ae57afa47b091ce0ad73ca14b854ba0cc087520d34aece2980494ee8e89b2dbc6c4c2361922c44cf244595b6bd0a2004dcac7245390fa470cfe6f825c646622bd66c68f984c1ebb18465471d3de939123109361a19518464f56149868f311f60cf51034130b0653ec15896200f403d929b764211f798b7ae48f2824ca0439ed01c472bff8e00ae0d71280327a8cc20045093d750802aa69f851ee194fe80ddfda6e99a13d13ab7fd3a4e5fb654d1981c49d9281789b4fe4f9c38b8b0db712d1ad191e682bb7e59ac6e304fb34e51bef5273dc8c37cb9209a960396f1f39cd0807f877fd7dbae5c738ad07adcda930eca9df58ef0b654045b08572a9901537e0001a5512280c195900a8f24aba845bba481ab1a71c59b9b7dc86348eb845b306a83fc7d114138dc0bfe3e9f9098cfa6e304fc663a88e8db8646f43ec1a15e38df68282fa4748b5d0bbac71a1bd7766365fded16fa576fd8d1d9c6c950849eeeb64a771010143c9a9b1ce8ae65041198ea6dbecb9ae37bfe380cfee1611c6fb0d38eb44b756809a3bd083a3506da2e449c5e99fff5b872e04fbba22ea20972d73d086f981e23023952405d8f224d5f19dba5ae13955f336286714790c007c8189c29f7496ccd49f0d16cb372c277dc4c7f948173555c89ba000f94d79d7191c1117dce9ebc5085e7ed8d61eea3beea46e81d10bbce7294c8254b8dfa905536ae3e2e33032cbba79a2cdb3fedcd2cd7d48b8cef5e6eb7bfdf81a0ab014e587b832520aa31f5502fd2008b323a0e89a132903323e9f054df7d833f8cc0e1b645af2025048325087a8762aa86603e68fec1027ba8457a07803c3968a7548c107082aeaa3c1c9eab255e404a54bf12423b4e8a38c5502111292bd7f53b2883448cfe8ac80cff9a9fbdda93d60c0877703e9905e7706fff5a353b24f745c243d1a517d6aed78c3197f758aac094a1db3cf63332d9cb477829e7b5f9cf28f9335f02326f212c645a7ab2e84f22c21c566afda5d63bc9d9940a12bb76b72f1bff0a83fdcf102c3d474e7afd79aa6b8ed7d99c26d16c8090a00e541488ca97c166bd31e3c5611447510e5754cfb70548cf0f85e302717e0092d789592b231d4a3a3158fd54100f55a46903dbf198bc204c4649ea195a42c29795f1e9224f5d01828b2e3404b7e2f0738a0e8a51048956aee5206d530c37c143f781ded15ab1c47fd57aa9a5e3e82025e46a889ae7629c217ada4838219d1fcd0999cbf2027253e97d3c0d1214842b32dafb4bc6d85a49f081ce698268036d546f752d6e7ea2fa10523d61429f03f4e22b9444fe465e6a3846d15f796728feafbc4a35dbecb07289077f5db9d57124b9d7145f606c833a55c8504b7b7a3bbf83a8bc21b6067573c1c874f53db1e2bf82689b23e8b2e6cdcecda6b7fdb5676af5a23065c987d0cda95d75ca56b54e15bed17fac93f2884fda25f3a3cea5df5ef1990174ade03f9d0e706ebc89e689eeb008edb9225177014b511635c4f494962afd6ddab2a8220f790154eb4b7cf9ec0e2985db334b543873a7c8789902dc258b23a4df0b8f275c2b8cce9e6157a59d42f14ef2a22dda1b5ea5c367d7799739e0a251f09aa983309dffab04e52a905ebaebd8a5647013957be1d0baa091d08a627632b54c053125267fba92b60cfd4543036767252f895a63707aea83e948b2528cdb83951734a45e5a8c84112461b35a2699c36f2b5d2455fb466e22d7f3a6a1ee4f8a60c96870b6376c461471cfc408e373ca8bf2d9ccf29fec13c17ce099792be28dc0400f6d973c031387ce1bcc6077e3ae0614ba09cc521c1c9a4c2cf028abb99cde300af93cfbb491d08c723ba28c713a132863d3b9b80da929c3756b3ea16d4c63b5adb9a924a7bea649f3cc812306a626c53d74583e048486a89887a19f8f7257d6b914b7bf23497310126621ab2d09ce43cd856838324c8487e758d4b0b670ea7f59afba5b9fde4a5352290b765b89171caac959f307676e6abfb052266614c4c1fbe24100cb4dbff2d1e5c9d4aa7824a8ce0fbda740e1de3981cf8a4dd7c56beacfe97459a730ca62639e2804370088cd04f10c71d383bef060ac56f5667b8253667dcdcb8ec81d2324742fa36264d55726a4124107bcc82146b0a547cf14a21ede0c0f51917658a50a6d4c4dd1119bc1c66519c288ee9359f3de69a0af283abc32340e70cc04d0ccf07fdb257389cb028f9609c9e601d80007f74e5c652ca60da29a4f8ec5a10e82c518a1372fa77994625f8490b650f14993724432231650f5ee52168e065784382843d2cf01d140a6488ef02ab8411f5154c8493da7d0072e0a63ea001040fc841487c700410a2831cac5efac1d51c42f4e1c04df5e2a0f9869654cf13061a579e32004c780c570bbc1b2a996b255a88151d4454f882ac721834ca734c0f12a49bdf2cc715c8a5832ae09ec305ac64ac963d36b4ab6787de1b8a27586a6e313ad84e8ccb8488f3227263cdbeddbe75cc4d229943b5112dc420a2ddcf18e7fdbfda15198567447ef8bbe53a16b3c5ab35a204753e83cb4e0ffe9819a6c9ac9599f35938c2cff76033d8ec230d39042992418327fca6f3dd383ebf0a1b0b399a1c3b4ffa80ea47e93dfd1535fb619c1d7d5f1d034c89f8a96ebd00a73d4bd0e1442d51907af368631a12c627e61b0b186c3f6ef38f8af1e22b96039eb983970c8c30e60f2424210672194ede810c7246fb7d84ef2152e06e1cd1dd1f15246110fabb1bcc3dbe26cd37e7b96efee321d2e14162bf574a4f51f8d389235c27ee7de7390e061ab4b8b580e2afe09cad1809ebc13f22428e7835e670f246eb429f448f053516e0a7c384754ed011f6ccbbe582d7093db88bd89309d98802c4d70fd6c9010e13bd6a8473007f2289d68d816eb8033c1124280903c8462b23c042c5f53d8525b049d89ec205f5d109593b950504dea5ef57314f519097a4f902336bf82431d358f1de5428bac44e9285d4032c2799c97332ba5c0039846466e4e6511dd6ea3ef768bcd3a5103f072e9ba2c974e72ada1a94b13a14e8fe76115ff822a7cac026a184bdb7700027802f099f79e0a879ef49c1f6fd8aaf767bb153c786df33196cf73eb62c2c8ac5eee13f98cf9cfb3c82a2ad28bbca754232204d10a185f5fbd8c0bc75f42ccf48ac69381a5014473a0b74b9fabf2e9f770461defb2c2392f50d89ec3db1665a0336d6fe2a27c8101c58604a61c3b758c00b6d26c992ad299928afc74b5476ed3edfc374d8d2a42a87e9ee14975494df27ff6f0ce853dcc7408b820986f63e0dd431332994c9c446a7afe563c104b142bf778dee89de7cd68dbc514b6ecee274570dfed845203474bede63c7ede08904b9ae37ad655eddf092d4075cd47172ddf654bc6f5dab0545ac07c28e7ddbef50c19f9f7aa2d0b4ad11b6ce75fe59c17867c35312aa1d1bc34ffd52ea4542ad61ec014732de7fa3ffca212dabd14312004f6c899d114aec3eedff640cddb934813597e71ffcbaa3505e3ad2dcb6de37a05e77421d06dcadfae5cd63c8e0974ff23a31acbe4fd25755c83470c8290d3dd0648962d8f47bcd28e6e16cf442f7cfd793b3366dadc93f1fb53378261a5d1bb4902caec9c5dd391904cd57b4030d1c53600d288a22b8461d4448c09395fd3294e1c470ace2a2581e8bb307d8cb9432a601e1db6e51256c75db8938e5e8eaff2f6a33d0240d150dc40541973fee91f8fe5cca444cf05e8f6173bea857c814e0d87306a943981db0ac77640cf2cb49f414e47c04787784fb2902d587fc415a88844ffab87e6d1875d6ae6a0c2cc0abd5af09f67a03d35cc444c59d10fd2e0061d1a8491035dc1c060f2f003f944958660c02fa3b4be3646be4894228cfe88a7811373a6b344ab8e98532ef8e66cd201c11de1b2b49b138fa4a48e12cdc01f3a1beaad1c408f2372a60670166298e1ee5a9029bf1a832cb8fb5344099b5246142bf2997c9e3ab5d024c549a29d8b8c3fe34ed31f098e5a6c3caceebe564d6ad6b9ced3a5b86381dabc06ae6a8086cbe389e43d2746cea956ebe374bf1e1087e2151137be3b6b42c1312e5addfc2563d33d3ec7335ce7c02133c299d7ba03aa7433b061e9c612a3170a5fcbd07cf75839352fbdceb77dce4d04f2faac3c4b58638d24f97ce8bee207dd2db5fabe81b54bf2ff8c0cf96ea867607e0515c193d4372374ea595dca723bd2bacc7ac642d54dd046dbd60cb44c54089a4fb9300b80f9f93ede815922f3dd3f21852db89ff4647c93e4ef8da44e122d346580e4788ac9c9bdd92c31639d7cc7e790b6886f81cdc1f898200bcdf2938f8831ef6bb3505bbba1f682afd60dd078c841ff9c3cb96d16d7d32e74611fcd35a75ba27e36d0f8f31fd7981882820129c7c540709be084406cc81a2aa279458521e68e409b520eeda833c236d4000ef5b32f5042805385b99dc1694cd973d0d40b461e6fe36db81e59c99b92e1303ee303faff15794803b0bafc0f5afa5ad89d6a01aa337f57b14450fa643ae51805e6fef452387a6dc8421d16be51a5c1e4cf3d60062ff60ed4f957f6253725d49bc019d5854fbab2e9ae9f400c5fe26e25e32725dc7dd70820477c3e0cf717cc466ea739e1cf642c2820de11ec469b182a6c118507efaf8dc8c928eec02f7d2141bb2639d2f40881f559e8dacf2f0f44b44b13839de83e59c40436b9969dfa29810091a3c74671ef76a59d12063b6ff14c6904c44e37cc2f5d3a5ca5124ac60a4cdf6f6791363d709ae05ab60bcb006deef336d47714912edf0ac49d8676ae750e46f1764a2aaec77263143d798f635be1d2dc1595cedbf2a3f08f1aa8571d34cfbe92a7284f8eeb76fc1aeb71f5ccd703d223de5da71b11ac0e5f57950580a122fd2fef8445805a49d4027ef790216a972220b6abc7af8ea8bc72248570e83033ce082a680c4906f01ca205c3f4071a117b0d5e84806c81e4f644aebfdd765b70d37ab4c768a78e1029f63780cbe47571d8dfa2d2562872c2162887c4202b3437594843473a76712493de5712349d28d8a3dda8befb00a22a8f0a1508bd80c0ee298b31575b10cdd19bbca815796b7820320ec578d1ddeed24f3d5443110fe1520a06e614e52faa645d2069a6970e65a38e68dacdaa85e1a3e52bfd4736ec085bae2007996e4195f430a6b827c2e6116ef2af7e9d4565da8ab407558bdc2b7524a5b95c5526fcd38c72850a117e80f1c47b5be8cba9aa46a3e19d07d4a8ab196fe1f917ee798fcb70c65247bf9eeac6070e9208c536463102ae64ec8a4adf9f7f63fa2ba0317091e86264cfed88f74a54216a4458d7e08edc1b65f5caccfe78bc23b51d42436daaf7cbe87e798a6bacbdceec827069cc7e15a509d530b2dfcb10667d11b255aa1122166985d179d60a02c43d615072e52590a8c4d60f080c91159d1c854a02709e36a499199b46f086ae194a3c62e516636ba5ab293a0b3342bd0d03fe4c5183fc5af52d94d6962d8a1ea307a5451d45971520dc01d13355281c42a0bba012f984a1616ee98a232022fb0bce98269d1dcf720061ac9005bc6ecd611b05e395c4d0c7a330a2eb9e3420a20c8de31bf0ad9b31652391a686e70b07f457856a1e416d82e9233aa7be8e31481ef07fec9ea219d367b7d222534eab995c450b49249eefa2ea39e8b2b5e5c6b124659cf1012774756bc7b2cd1b3e2272ba451b9adc2a31116e149b8000d2ebf1eaaab756f76256da48196d09c3796c01374db6e69ea8fb007da9f1255e2b1cb55a6a95e057e770ed5faa6408bc7ab45dde79cdab98f6b83a80a11cc7a92ec100f9b0a7ba0756a9eefcd1d9c9b079591a4e29447e943ef719274816ebec26ad05da374115a01792ca79f524273acde09e5c89e01443352f43a59e18300ba81a8311a465d99125fa99101a1d0c532e25f11cccf8a93151c1048b073a21868a53c25f74ba1d58fe9a324e5e415ea65b076398080be06d4ada2c873b5a92dbd33c0fff3ae0556a962e3ce5458152a3abb107c93352a0ccce9bd4038fa50096ebacc903af7136949814a1de449256cc9acea86ae5005fe93acc2a5d18022fcee71f4be00216f79477590451dfb0a224998825dc6294eb066f54e1272bbdcc358597a084fbb8facaf9f28e85ce09afcf624fbc154d6f9d81e61200c266b351e64048d17b3a57b966506abad6ae5b7c26c7699681332a798e68d390bb7b243346ba1422de20491e16950c3b5ea66f632df32c5dce272b28bab9802c4c94ec85a9640a62e0bf7b34165d725c5e7747950e22449aee0b716614046f633aeff930dbb1454d6a584547e5c7dab821e4d5233022ecdb8702d87fe810a68fb0b96a96e8610a737c725e0766b7182ea961e9457ed8c1a61a589039afa37ce4ac539beb34286f85271eb3f6501c0a7e2749f7cf1b6d27292d0b48280f5604edc4cd7ddd5669ab31ca2e1e4650353046491369545f4b5de64164120369db736ea0dd79616682572a2fcb4b3c74660c5888322a1578a777ad838b1c1fbaa4ae20201a0529e88370e5c6bf97d1a117426e7d383fa48024a720c3040563b0516d772942b6e32ded0fe3d6c107a6e929ff377e665c5413c8f004a27999a7fa50fe8342ab300f0f8838efe441b67e4b96ef0fdbc1fd9b4caed2ca6c930ca796460421d0f1321b8482fec8b60a27cd1549fdf0063f887da879da28416d5963ae92485ff25015d2c752fb9005b47a25daae8069a2837da92cd7578598dd5d491778ef0b6d2d269f082bf28252333022190f01cc482b8a2b8102f15268f109057377fbbb8c57257eb841da8ac5e24856da0c5acea340e517e4aca636e32b6b0daa5021f4a665e3f7b7c78cb78709a09271222f0a1f78ca32c7d48c89844ac6e842fee80baf1b1c341c0c45d00c6989ca5023508b7fb402c996bc36ff7d4981ffb335b79342b17ecb990df542f56f67ee6b8f0901317d9108c84cbb53451b29b2b33120a546f2a17ff5a12068e8fe21e9c1028c0a6b35c29317560b04ff97b3e4973d9540923dc41cbe89f81ef77e7ec73d83c0d87818bd2cd30617223e70f62b313b2323174532a4cd2ae2426d480cde46a89230b7e7121302d19082151ff07c64ac622c0a17a0c2a84128050d220776263d7a097c051a7f9780fa6cf3d2e4ae8427f0c92ca483974150df73b2d1af7620e2dd809340da2d221b18fe3b95cfff54dcc911e2e8b31e1ff5ffd5df8f5e771b5da12e1ccf8f466b7184f4f4b3ceeca4c07b4a644bb442de1089395097b5195affd74bf26e66470c74cf418144186fdf7c5a8c5683889f264a018e58c94941138f00dbc0d783011fc65d3e14ead1e6adf5338971167bf316d849773891fe4f7b76baa9212f44cdf3d4adeb31cd021460aa47b6391c232aec6467d03a1881a07226311d21f38a4a5fa98ba32f397c20e721f460721565864b0285d5979f860e7913a9eb3f8ee4757c6cd67af552a4f1540d9e382a0426b9dfffecb9ed4696ea8a30735775b0cfa2c34c94527dd7069e8a31c1dfc96b325b879b6908191740cea711376edd552ad4ca91cb857700def9e7997122180cd1b5bb1dc6be990182bfb9ae22a7a1ff595826059510ba3b01103faaa5c868ab5eef41deac81b9c6072fa6e8f5d1d8bb5a0e666b07960330594a7a50552dc35abf4b8f4ccef841c48721281098df1b9403266b77dafdab679b32fce61b7777149655592edaf34351fb43d8cf6e9d06faf4ccb745a48a982b9ea08c4af3a9fab2e0730331664a8caa170e53a47371b200048ee3db360cda551744ab7d3b89716534c9e6245a6e39ac6d392a99a370f0b874e46a928c1539e2bbf38ce2a44b27632413336f098f57a694526a304083efcbee8e4afd9d2e4af5737ebf368fa8f18029286e81a94407a3492825ca3ec0b6bfdd5b5ff03dd02b1a680ec269e29e35ceea4ac018bf26def385e2376447eeff477ee9021f48db8315892545a4d203ad6086551eeaaf0e01c2a8fb5cfb9e53259bb13250c5bc0f62c0cce58e37307ad581abeadc0a31dd70c106f0e58c2bd53d3cd29ab7e308c5886bc1a4e5a10afeec2de0204aa7dab9fa960e09b9da507436fff121de78622d267b43874be7b8541f79066e1ebd6cde6c223617d7fc03398b891cf80f46f700902ff0f6400b96fe2dd0cceaaed6bf2c95f3bb66010352b3d3e3c6b99fc97631aae9f11d671b2fed069e1a55f5c58117ab926238bccdc54d6cfe2597301c428ca67c4d07ffde35923ffb44a36c8d607a3cb2db3bf582a9b7dc8fd0bd899a6768b28ad801d3fac38d928e7fc604595a9c89afd43652d81b7a8ee23368a9d88dbb375db83f73bd675a220f96c64a980120aacbd23c81e78402c950b3cd5f379b38c5bd9aaf9e1fd43b4fd63788f438605b7af472774fe9d7f349bf9d7be6d363b718f8628f3aa2c78b6ef25b5536e0993243de5f0ceb62dc1ee60c257e3c40cff3a33005a51dc16c79213242248ce8c7e3565838e38f1183fe8ba47fbb8c61f1486ed6678d74f1a7846d2fa6308d8371fb209622e3a291af983f24b2b183e199872fb863e0c0e2686d4566d0620888a5c194f32b59d59b2b0f0ec795020d7ae4e4400f399e8a49f81959681ba44d99cadb6cb6087c1f6f2680ba5a5bd29e8aa867ee73017996dcc6a93b2c4b2a7e10b468232a20d79ef6728d3c76a0850f799f6baba86b2651e6d75e8febdad71f46f9bf6638fd7d9638617aeeb92dc7866bbb587636f8626f198d5d60c0fa1f88abb0e5ac186cd4c51354c980f1e8ac2c90730d30e585a4252d46f87da5be7bc74501f821144de6700c43e52201027993620f9b04f82bdec153ac1dd4ce126d2cf083415af33403025f6ec391a48c96c2e9251246622c88c80ddda6230ffdd4198d130b8fe4568858824a174571262880e6ce1ff2270bf82f443b1950b7f75d73bde42c10e2dd29889b5e2359250640be1285a041ded2f5ea092850c5988caf4d03bf6be85a7818831df5f18b88f5d088db3cc6d8f8ca48d36de28b960f64261d5e9d7e931f657ef88f29d3285ad63dc789a9dd3a387abc8a0045a38c1aede2f94c1b20c270892d33554ea4cf71ab8ed30096583c9985957042c75161b58f158daaa0b3e135d2f0f3e41c335246418508562509ac6f75ed30e9ccfccfcaa541d6a73308442ec4aac45ae38a89538a81f405be040e5218c683c2f2c72583cebabbc675a0fc37cfd921b5d885361e5f4d29c6b791b234e4007f367e4791d4518bd10e4dce1d2ec8589c78d2319a2c84f3a325ee95a18fbd3ccaf71652e83d2133f940da21addef78c1d6919b0d932c7eae20908fc89262bd48df34e685b3ce73bd71c146af6dd416dfabed0caa170a9ea6c6ce49d0846136f64dc4e5d8f71b4e4f6c42a0c2c75a8c586dd8eec1770189b8d16c1f4abd3c30218ffd66c317f4838ebd1d9112aa367722ba69f79ca1f9b644f1ea5e62984fd44ba8beaa84039f8996bfceb84f21aa8f7585209163002822005131e59c9e3b9e3779c8e2a842a294b20a74330b222ef27e853c1f5982f9ba9c97f653833e55371725875699f882b3fa233d062aa0a100907e1f8890e635e626fc384e63dfb2fdb477fad8dd7fc85fa5078723e899e51944ae0a37533c86e8712877f4185e675428b3d926d5afc78638c9224e0e7efea31fc58353a780d48ee0925f73c6b8e0b46e3d7295dcd4a90d81f480cd922ebc2aaa551ae9367504200dbcf540cea9e603464dad240eda57c823c519b9c04aea8a0ecc62699316ac0ebefe60a6615d9688c34b89e12bd073299030dc37bf99829623a90570f4744adeaf026e523f4b448b85b11f37f185c5aaecb643a5156990f90640249423a1e6818b173bcace20a4713c2da217f3ead1e1fbc834d929bd814b5c6031216d97235372e332c4204f4ff855743880c0f195247692daced14b4ecf2d08fb0d399e74843518e24d1daebd8e89c8d20234f3eb1c74bdf94dafd3d1452072425310ba7c705b6cccfb5643eeb816a401f4da310a1e5d3f95abe3280384fc6ec431a4b5087bb2d3275c9ae770ff83a489675ec672495399ea2899772bba29b48d7e3d5e59989087bbd7a4625d6079e36b5e237bc037b81cf64cd00d44dd07cd8b3103f160dd75ac3ce6a08dc8f9104851d3beee2f02fb012dac64ceab245ed88828b532ee558d2a40074b235534af4b01142a884f8bf376320ad21f31b8b4071e26dc5d9f278d612e3c2d74197be443c1191acaebe6a94dc5a0302c4d001fbe079c548337ca3cf85596f43d5543ab3332324e23aa9a1ac8afb5203d37ef1461a4f3e72df909d073cc8da23df3233fd8decf9867079838b53febf683f7935bddc75b90728361fce4e598348f53e073eb0f60df712637008a104ec368695236e9b0a60c5fd3f877381b8337df30ac046c81de265a04456e1f531376245959c74c8903c64dffb25debb407a5d11438c1042ccd0280c80140acbebb22398f5837962e0c52913ea14b2bc20f7f72c6b03ae82fe3e7e1b21310c0902e7eb6aa50478c99264c9144f8c1e62cadba04fb244f44e6014434aa8ca7a525fc9505d0680451a33b7e0cb556481b3f62f74ec06228dbc48b51381affa25b45582d284c0abf5a5795b9e35e701b5ae622c9daa3263751f29623178048f601f4312d399a9d2391100ad40e4a223c23cd8c48f7965950a8c07eab7534f394ee1131f7720f368c42ed9490a1b75fe22742039d7212fafa1a1f9470f92b0d58d1eeca07a8a3889ac798aa02564f901d6ec48b44cd85a241b9c6bf740261bd8e863fe9bb6d65a0dff1eb678f1ea75620942b3981071348c6347b5568765b410d591dd91f66c0b4fe99140f8134ad9c12e4200bf761b408a7edd5ea3e9647f163aa1e0d441709df5cc80c711244464a094c36da9613a59f011171ff7ca45106dbb73a1f5969aea4045e31b3b117874e28b480c9504bba622fc627fa3ee33438b029527636cd0d585f038533893421457110a32754054f2323ad548bbf092a7b5041771d83b11d765822cb0351aed0e4a171d00b5db14449c89b35596b7806038aa6db001e7910516bd3a0f1468de3c60e56bba6026a25de32fbbc4516da67eaa23fbbe4eddb9f6d94eb9fedc5ed9e2a58a7abbb752055129214bc34d842b725b31a10ff80253df240944dc2fe4a733e727991c589a2ef76c23f22dc9f072ea27b8d6ff4966a08345100b8967ca331a5e963ba194399226b548aecc9a471b8a9cd80069b2e1affb1df323db692953ee1b46822f2c152f359085916783800aa85cc7d09767055eb97106870f50c480c8b9816c5568da5bba37d1d3d6378c944262209c35ff965142b6a9bfae7ef22f680b02b94012528112ab2dbe44126cabf80d8098b111ee38f61d83eee1776524b11483a3a904a87daff01e4f74beb073ec5b9d9838dddf1cce8c23fb634300846fa678af7fa467ce11fd69d3d2d312ace3becbdeeed1a60bb3b25b20273e35bd0471720c36747ea96d18e0769de2b190cde1cf9afa49fb09323ea079ab8422ccdd5f48f510fc1553ec97ac42270afc9f94608e517907ff80910e981b2d5a546364b55bb653246e4caf220984bb9e871aac4485bc6896ff08ad76e6a319665882a8f5886f38d529bc42e67af430f039857fc6c146e66b336e31455d33a0742da43732d82689da4f1b7d66fee033b5966d389b2c1e30877fbc0b3d1c62343cfeede4bf31366ec09e39d484742cd8b0c34e64473384a129cadf9e24148514249333b445c080e1972308571250cb4bebe5a8dadabcd2c038de7d61feda0980e7a5b2d66683324a6d1f93a458c2322a0c2518adfa94e1769b2927abc7b2ba9307891aa8e5257b941d6942765403ca8f101212d0b650db3624a4c285ab4f0c81508143cda1ab87f37240204948425811513d707742781dfd07f8c83f272e3b3141055cff5b0bc2b9af419ee15a4d1c3aa506458aa3eb6d6cc355e33b1d93d34a0f72e81575268ef911dc4bd2be2c8298844d25f1ad7b357782d5429a42f2fa44cca4cd7f4f119a50dcfe361e006276f551cff6a2b10293242011cff32e92e9c344533c2994208f4c869549c96d8ca321cc25efdf00f39ed53eb8612c9768fb6b2f19baa148a5b3d0de40847b742ebf9971266dc64d1cf68fb4eb88a082f7998a48c32baf62a22ab2bdf89a185f5a57660e4c44d7906f75ccc8d21806fd271c8a787ef836ff3c47db033d30fcf46cb97ccd7a53b14e7774c13019d73aba6c2dae52d205f55ad19701112356d1971fb51ffd5da4ab7a53e0db279be7d8548a418b4fde69db21c4c8720a4c4405dc5427eae072110c2e4fe061c5c238ad7ed508006e75f3984b16b03d73c7826aa63d23db5df6635aa556d11217c83bdb22fddcc56f4239a9b77d8f62f51638e05ff0fc6be6e75d28a570aecdde77fd44ca22d22315af2df8281fa533e9fb2a142fa9c5cfc8389a772287af8462368904046ed1e2d0b0dea346a7ffd6bc6f56d09ca5f5b35bb8d7c48ecfe8164dc8b4683a30741ca57bc16586e810033d849a51cf6827396c5190b101351326d6e1a8ba546f17a9cd86c823224e56157fdcc075202c90b6d26e62be12b7318ba828052abf770c5355bbe542783cc39a45039c82179eecf5b0e5373415e9f5f6802c6968d632c2827af3caa110e8981bf8841ff2404ee601bcbfb1319596cd3cb28ce668b7e0be5c1d6225110377604f9efce338bd41398fd0d2e04997e2282dd3778122586b3ceac13ab58bd80ecbc9c6d52d0752233830664018f6220afb2b9a48ccffbaa783e41903d991f1619f43fec4a0f08df0ebd503aee696e60e075c0076e219b6f1f2c299931ec7f41803205bacd81ab6a395e3890ce5abc6feac6e7f2eeb4f2bb55de3478f970e902591b9f87a9d9511ec594ca3959131c1d45ffaa07c8cebc71903d5910c6008267f5bba491e18c9dcdcdd3c13923f7769494d445889cc7b0d6a4c48ff7606e7411bf618444c2f82ffc1ceff38b4d6543615787b0c8e53c6a57a6599ae1dd57aadaca5290e4893d5b87bb7614788497b09887c35e4b14a6ec84099d96b6f5e5793f3380dfe7bdba579b297d5c45e5eb5dc5e2712ec28bcad65c1fa941236ece4babbccd706e7765ef1622f8b5dfb938d9646ae3d949a09f46794634fac2d7d2b0c725801228241db2ef8f73e278af27706cad70640a3ad3d43defb9b0f189a323aa3de5a3b51cd4e63995c9a0cefe8216d6e81bc27f5f96dad6b63d0e25501527eab3c4614e6aee3619cf23c77ec62ffe749f36fe3d7dfa17f5d99c941c521f311f89e8e320aa04cd8d1cd0d76308a5d9a536bceef8343f34645abde4aa7097a4256dcfb0d45b1891f25f35fe592d8b6403926ca5fc72ca4da0d37df004260dc2b2c67aae102cbf61f1cb79d4b507c45f0303f5f84cbb449d1272a36ac36fa48d2526a6201df6be8f736ffdc1aa2a8992a1e5b1508cc337550508db4dc9c06d120731fcaed45d44df3d3c230e06a396d1ab492b3ff3ed012e74ab2df4f71199657b998628a484a2fefbabfd31ad4b7f440a258dbc232dea76568233d63fba01ffd7d130efe6a1b3232aa99b6ed27307eb438525faa8cb84c54644dcff6767e0d0f66e65d9b6a579a905e761e682e9510257b9c265670e54b9805ba3e60dd1453a977c83ef926db342f2b5ecc7de4fd399b8d92065991959b0c0d4a18d6405e180003d38a34595f75ebf18ffcd8c58b87b295797aa96462a14c0187ba326f6c96eee8b8688b54aeebe940622d639c127bc41b8cd70ac9e38da232840f34132d9794604ad852688c2036507260262a56646748226b2737eed5b1c17e7d7fc984ea019a0d889fdd0e84f9e384f233aa342632738724c88e0d7b214b43b1e43be38270b3ae19264d8c2dae4c796ae10ec1a71198afb6b2975fd4d1e4bd42a86c486353ece288bb252451ff4f455162c97f8be79c055116fdd816a65acb922f1a03f1507715d4488768fb2da9c580c10e34bb1fa77291d143433575f3487689c5f3c79bcf4601b2aa84397736341c2617a1cae9df3b8e6fa6f1427bbc7e5ad1e184e02a55fdf14239c77c1287bb331307facd5abccb2c0436654985e8cf98d6083de7643f617ad093241480b6595214766bc04a90aba3902b223477f738c7c3627a6ffcf71621635722cbd8bfc1c89ec45bfc8f66a71d8e031f24b2e8c948e0ad780e040290e99e70aab08dc3fd88745c7510fab53f80678db0889b2dcb4b3604b8b59e8251b328ee077017c1adfd610e27b96ef34deb20a5ed65752ad013986fcd0ce2287312b2003be2a014efbdfb637a85603d2dca46d2cf480e0370e5c8f805c6de6592e2e8cfbf986360e93235632dc1d03e8633c87ec1edb1e06249ad98cc016a7be5080cec72ff002ee0b9ef1981cc9c81d5e414761b218567df65ebe6374dff8c441d142ce4da60db2fda48e4178a3e64e808d194bebb30d16bb75600298e5640f062bd8508ed75eb0bf4601d0d99e08592bd0fe36c1e39f1114e5be04725d0dc9b3052aea8fb144863512b608295dc55a9e9e986bb1606c398c6b8ab129c6383e19d3659cc2848ffba90ea540882badb9641a42ae607f20fa81fe50d928f303854f4e5908b666f9d94579000a6e94d5d199ad28825f4760ecd44c5125ade787454b1bf900ee5403a5e70429a4dfdc4832d63b1058f4793a6fd908b275989806d6b3ecb7370600623ac94019dbea72e493fab941a84a354a75c985aa3fd65f7335e04c6b34d9968e5a2828328c30718705da3a671e89e27afc8a5dd6107c3c1c44e041bf8e223a1391431bbb4354cd3a4029b4362a7c9f6798dc8285ade3480875e6f9eea557bf4be954deebca3b5d81b8f4a25a2bd838c61a6c63ce6cd4b8ad204779e268a065eb6dc25d1075f8752301d3c194d9162d8d90c9e7c483efd974e6283250ce97c02ce22a959d8b092175f81a66cc591a4a2a112c8cd533185f4d54a4e2d0ff12d823906155f832a0cc89b2dce65af25530f6496c5a8bba36c0f69a323179a46dd6c1a5cf73414f1acfae0951512e5bed02148257a18f30e188ad45b68b3cc6115bc26b6326b18126a2e5b113b0514aaaf071b682a94af1fc63cf7605fc9993264a6099adb79e88470444ab2a659d0b635013a0e577326d7e55336cece5d8380437071a36a7bdd33c7469888cd3eee5d308084aee362f5d4f9f7f7571d06c8478d9a2297dd5391f04a969abd778187acbe466daba1a7d96614008420c67794ed6502a3a4aa016032dcc99e2270e0957e90d61f7f3d916e6a441bfe6120f405dfe859f0c0de66dac3a72b71487a482040f8552052a0e44403594b8be1b7460d25cba4727fa8055fc58f179c1193a1130c8a5df010ca201a80f756aefc1b46e6260ec64b178aa39f859408455e18796ba7ef187285df86959813c72c6a71cdbc4e64d7b2ae7b371daf156d9a36c4d26710f9ae0b3b1015c0c8bc870c3b800d9c01f204dcd5389256bb46ae71693a3ea53a91515bc5438a9602d0256170b95f102e9aac8b7f3f442457ada4938c50e7a9a88539ddd12d651a440b4839584d480bd63b7316e68e08f159fd7c38da6ac63b4f2e75ffbed674c3c105d8c770f503964ebc7881b478079a55e2027f41bab89923307a8c12cdd065f9027a952243ca66f1418922e214fc42b496e77d041d84e9696769aee8a6c445913f0a7bdc1146f13b566533ea6bc1894a8b3a78cf35042413b82447b263fe58005dc7cae6b8508276135c8baa7017ed24c3e4762f6cd5fd8f4d303d2d58a5f911b3dd63729dc757dea36d7c2454ee0ff8581aaefc8e39129ca79fdef00a9ac1a731a82dd3e09ee983b7bbfe6353c2951b1c84d546e91d6540eeb818824aa20a4e241969a1a0347e3d917fa1eec699080ad0782ea47acb3a6c23b7a932d086675795a0b78f77c82d72f5487f1669918f254ec49b98128c31b05fc1b974e6bae762298983dfef7ad1ee719ae301749b9bb1903bd1c23ce6ddd077a1728c15028c36bcd2e07ac39159f0053af811eeb81aa41ab89838e59f71bc14c099f60fc4e8823d1c13240816377a0ee988db1ed23c400e6b264ba4d57f3d090d2f6c27a25e261049633ace8a82d0bb53a3c00080547eb29746647e68f6fb6a9aa6d556bc6e6b34610204ca0bbd9d1f29a43f6c089a1a5c595361831c35bd2949d54c1ab1b9ee3f2833519244c0489bae24dbb293be62422d2bc6b4e62eed5c8f93b73397a49e631edbc525aad80f62cb9df656ead23394b3307909ccf71786595207f02405b740f9b55484a5f0ca522aa492c4c2b63909943347ff01c61786361388ee00932e30f3b461d915dceefc01db671e22665bbf423e4d7435b7fe17b2bbe59b05fbe7507bdf4457bfe6ac66d42f5485531b0b88a66d790f80454d1649bab70722ec0b1c6b520bef1ff757e52656f6620c01798335f4210981352a1073ad189035565937a2f3c169f26f00bf694d0ca1c93ecbd771b4714e4640f5f20353ee54dc4096526f057f6de1a1186afdbb85fc55837a8fb3cba6370d1a4d78dafc128c0b2600d3b831cc2fa6ab557ce903c8f22fca76ea26cddc850e05c5c7c3954a0cd0ce0c9c92c277b3c7ec0b4e6411c5e0e14e5588bc75360a9c10cb2a7a29937fddee89f086ed003c5b98c48f9e7b71dbe4f9ffeb8a1f05e7a14b1faf6f36897865ec81d6ae2f9f23cc0bd7be72d0a39e3acc1164028856df7540f9ad90d0df8a90e8ae40f715cc38886239ef994488633423e1a806be7e524cc5670872b5f1a51f9e8a35f71f00f967cf6b2404d01d28414b321418282754330988413cc352f4b7f746351137b88be237d6b69f2c12bd53fa794bbcccfd92b2817207fd300614e95e28c5dd71c8dbf98877abe5d202551a6fc4552a6f797361dadc46bac5f9fe4d7f883167f1e10e5f8852fe05eeddc2e864ce3adf2d434eddcf0b0248d1c205c4e0456573830f12b8b8fa764e88748a0a6481001517ab54c7c6306bbbb0e2e100f924abf219a85ceecffb00c441187935cffbec7ab6a1324f72d206578c691b43b60a552db408a4d8059cc48e81c591a438be7d1c1077d27e356b5a4ede95cf9200a8f56860cb279230c6aaa738992e4dc7f464057e62251ce1a6b09e6db8d8a77646e8b044aff828a765b7f7aba8d33ca61b6c4964901a98b179ede97524b9b2356db59dec6e32a5bdc7fd0d48631150c38699a75190515eb0b68434159d50552c2b8240e6b1b40e1f5e4eb74a279f8035f2ec2ad6417fe2973f1bf7675baee96e652c026e8ecf0fc6e533ac90446461343488e6e733a25786fa60efbef330103b6e5446011ea94134c4fc30b93594c37526df30923e68f071db6b85545b3120669dea1f0eee1f8ae8b54b1a526630b4ff962426628a2b76332ce46c715b4d7dd0a58a482012bff978791849d0a8ebd187ee648e6a72538d658db25c3c20b124f852126844070c38798416971ac3c82324881683dd00614fb268b8d6de1e68d8e7c36ac974ba9391c59c7ed87296b5737aabaaae1faa4aa462f9553b511280e1ef277228cf702831e87f83bfaafba647dedb9b8e9f986f6da25942b108fa82c3b72e0ac09c88c7a838ea4e927a37c5f54c2cc89a6a80c30c1e2abd06b2d87691926415975786d25b1466478d97773b4e9a057a529bb7b756eb9c05e7572cca1b18b5655a2dc55ebf840991a3c1a7cb109e03d084bf3bcd4806fc5e2249ace3d87dfb89b9dcc8f8486a1998ec6852a6ba9c0adf2dc707f0fb7922fd31beb57669e49ccb2600d6193d5883e18ee91681901cfa5329bae859a89f8a5cef03ad434c2cff2dd17afd07dea9751290cdda97301d9e08fa5bec4105b8747b97fe87792958117cf849901578441d3a6f2d02d007983a2855b20cf2c5425a5c79f146474b287c044928f02f97b3d715534dfdf04cf4c861542141ab75f006db962f717f8ec97552c7a99260214356458f74b00a5153b3b261f94e02feaeaa160ade1919dac03e000da5dbcd8bf7232beac63ff651f30da2be8cdfa8c1f2cba58c50ffec48f671f5e486811e4ce9c2e5b1c9a7ef47d20e4a9371e2e8a6d39f4171bdecb58f67fd3acbbfed7188ee1900321bde9661a149d7e5c9d0bdee79150c7e05ff405223469de1911585a7fac2f4a7a48d30fe7fd72febfee60177763b62062ae2a71c30941f82866d66a13240bb34055984fe8ea323f66ffeadc2cb38a980834647eb3575efb531820650f85ff6651dcd5970ddcac1c034ee44661e19263b3173a0e396558abfdc7a3e00db359c4b546f60e5cb0599c66b317f5611721ee163b250f45236339d72c38fc72cb5472ba970c972af30deccf020167ba311721355be605a8e3b05eb4ef72bf9a058fcddfa8563a8ec40fc948562470bc4abc5ea61b7506441b9d435a2c3bc188976f9ceae19078611ce1708ee8596138bc65d25d167127a304f834a172e757b256e76e583bc663f24efaebbe83ce63ff273138950d4aa09adc6ee74b782a92ac64e58097a72fa78b72278d95698967a959ffc13be92b4cc603950cdf5ff43d373d4af9ef7ff8d6c61735bdab3ba9dbdf0a5662426571fb5a7295d4f5c4b63b5dc31e767092b05fe2fc8decf3d1348aa623b11ece9536e86a952e9f3e6609b49f9a40073e22595de5d8369a63c5ded29044f703b2bf7fd1a4e90d0ee59f4941827d89a38ebeab8ca4e1a05a1099818d6fb8fbc2a108909563d11145708eef584f14b2802a92bddc213f590cdcaa3170545d461fbd4073a3de186e1cc33686f9b36c36471b3a1655301b9210fd78920fe303d96c37304711404bf2aa3d9371ff7a3fe880d80416842e66f8411d2d9a6a511ab66d08435489ac87232ffcdd3408cf16bafc8308ec34442eda12c53e681174883cb0259cc98e8abdc02f44eebf220027c98542dacaa867267d518e1ac5a851eb89822df7fc7cce8e2d5ccb11c71ae12939eda1dd3f9f95aa42667751d1b88d2ceb9b3f8d6213fddfe52317c8b4818f66789dea06d69eb76c65ccc0af5e2ca040cd054b39e352264ee8f271e04bb7b6baa8618cb003e163f86d04b6a28768180b75dea0dc12c662de833b30b5f206bd9ab932322bb5f788c9d2a8137ff1779530ff06edbb200a4b05504b51da1ddea099e98aa2658bee0fe8b075fb98bec18dc35d08eea7760784906a469e274989cea2b477404da46d2f16adb563bd5749c127cbe2a1f6cade697f439600b1115ccf825775121c7de1595f618b13ef61dbaaed08c8a7c1225423730ff64b1a8e10ee01f39ff2e18cd5a653efbf112840663eba7fa523108d8846080eb0e6cb0b89077916419910b3e06413b999350b15588a460a0f5f8d95d94578013cd98b35e31f509058d31d2bc55775df4518a98345d59cd4c2bdb46f59b35d9d7ea4c34d9876b1e78345c883e235d6ac39f7d89c99a47ec09a22c979ff4e7b34196677633bd489e6da4b4174b205562b75a467faed264cb023f8747e3669d5df308d620c6b00a98c813ee0578a63c3b47adc87a119576857acce77b0d3771ed63531573564e240d0d578e4b430a6a8612d05747d532ff4abe2e69c9304fc8e30137b16da4d6873fac10157584f6c91707832fd433036afd5ffe34e6beea8fae4dcfa2c372c37ceaf9c66505ce4050039dd1d32beb71df01a37761497d7a58f30884e4cea24e0e528245225e7b36dfe938603a89bceea80d4e26cebaba9e5f170b4a0c7b278b8b4d5dc22026c7b0293245a07229166c5249cecaf4df379e056c0845a90a3a9d3d29a4bae835b760323307bced0ea3a67181846806545a0988f255d9664c18cbd573d0d2200ef4acb352db665829176746a06012a528e41ace6f2fea02070e3b01a5e4b31587b5c70c190ef5fd8d58da6c7ad95fd9dbf4b18ff59a44db63ec458396522afb15fd5d362404072291575a6b8bb86ec6b3a723a95f848d05e95c0adc77510712e550783cc32195787b0edfa5fb04eaeebe838845debf1e1015826beb05388c99bea4d78c46f0add1a297a4b660bd07d221401986345d2b209d01a5aee0184327045c1f8460a5d1c1107003087e551c30c594783175b4733f4e74e6451177b3be047a9228366783b04299ec007fc40e5a4b3219d61f9ec06edac692f70ecb4235f313565aacb72b6bcde4869c9f7a9e29a2695ae85704f333590c5eb93e276020c6f518f9b7857d9181d4487cac1f42c2c4b0ea78c2aa27200d90cf1c76383e11c28dc637bb4088e4412413eb5d89af75f994eedf27b8c80bead0ec3d73ad0d6ad769174596cfce2eaac2fbbf111b8a30d4bf45b393e0ed942d81cf21aa88c3c924b03a115a9dae3dfccdec07fdd05f6de5d24c029e06b256ab1a15192bb7681b0a0d25a1ecedd95c87ccb5feb58f9a400edf05ac7fc1e6911d41f1d57c3f91604a809fca04542527db0a805d08a64cc4bc439824494df694e214e3f6081b4a1d20acaa7adfdeb163f106e5871a844303c6e54778ddcf202d019410b013d1369f211e8174b20e17d5c5849dcfc2a372123e2bd1d83bf628ddf5dde622149991785d031599027ff885b4f0878f600e1e072c7d5e0801d1c949a144f6c04fb23afdf6542618203dc2cb8a412bb3d231fcdd74ff31b8eaacc7603c640c361690e659c69ebe7618bf3104c7eaf2b4c79f38932721db2446ce9214a986ee8e28912f3c2989ad72db6cdf4145121a34e6da2a8aa4e7d31e427883f6391c623593d14edb968d48dd0a0367cd44d66f674caceea3106d3dcb4da63c4770b2201672d9370abcefc85f4ce98fc0ebacffabd30ed67d30fd2b219ceb389ca73ef10bdcbce2cc2a6c09bab486c1e2d1094dc88584bbf3ee655c8ade975a91b97457d9e33eb14c66533a9e2401a00a9d30218434fbbf1abbbd3028d127b0d1038e91e2cb4b985b94a7d0289c9911f3a1e3491db68f37796d60985ea390f3deabc4617f616b70029ef269949f725571b794fb5147a29b4649a8101aca74da9da279e5757b16c4dcf9c7308e05f8d3a798e72b08f94039b0bd803678a68cdaa4842f976e457d5d7f669c2d189e51d7804ad2162c908dc50add289b254924aa562dabaf5c725ed5d9eba736b3a7937d1ac2ec63580156bb17af81b18da30d97d960b141322e47799a767383fc0b23823a9b263187c1fb2ca9cdf4bceff64bf527261e37d60d94e0299e4604bb035a409099dead983d800305dc232b04284efef5f12e4b8625785e23d6304ab6c3d343813dc574b72c01010223e723fe7579501dbebd32324ceee7b451e98304fd46850e13685710046323be119fef7b03821af87fb39a423fb57dfbbd0d2097aa9a9af29b3c21714c8623ea0432352f883180d4b6e893818fc3f4ebcd3dceacde0a39c38eaca919d5aec1aa872cfd6fc0ef5d5c2b9cf84d69359a3918ba38ca914b9bb8076ec2959485c8efad0010e5e4a5a050e32b067aed4d592b051e55c43bbb198b17f476c61d41d8bd032244a457db651f731a1abf3ecaa19df554e2f4a744c835c3c29fc5ce93d20ea3e6e1ffd65c293a307f22159ed9333320884371d0001d90490c99dd625cfe500fb65d5aed53cd63d3f20110b7518362110e1138e2d8492abc9db033823b3db4ce142629838824733ee53f5d0214599facc8c738dab83784197a95ccd40e117c8f8a7118de1d95809113e3fb0c65eb606bec5c6f0f2e6c0355f47c86cf3965dd60e2d5acd1287cfc648b0ba879aaffa2718fc113f7ac4c734a97ab4c66c79af0fcf83f7433e2a263ba802b88daf0c863980ca3f57fe31e61d792c4d857fee4515c74ab21df4f7b0fd06482efafcaeca7d1c8c1a016f8d88d119e1c36ee003271b0da304b0382170e05fa7e2194e73ebd484f1afad100a75435bb50055f32c85e41c39911516d55aaf7018462f75b05e9aeb89427c968ae2ec0621a7ba83fa7ebe63d5edcf1d30437d0583bc730a571ac8e61841cfab5c3d86d566213195fafe288b3af51005b592888ee0ffa0a4c600c4fe446298548b4c1e2d837c5cacc1cd537f348ebd972a0909f4d3e771c5e4c86cbd65d1fcdfc9a17fed57beb38c531967942b79d4fa7d90705408b51422dc07507fde1cc529ebadb97544b86151eb1c6d428758974f06b069c0c6bfe674941a888d7b9100a6bb06a5064fe41b690fd97931d874797b4957eb683cb713a3f9691e679a17a617c8921abba63f151bd00d4ac90696865d048aa010020b2e0fdc77b74357aa81b6d040628374c1ccea44df11194a86e2ec50761762cd6bef8815158899a19fcc2ca53ce043e5b5f58d0a94863b9fc768e1ca2c1b62ccc9251fb4d321678839296d947bdaa482c18ebcaab293d7011d62b3611bfdfc27b699ca0ea8865e117a383bf9d7ef53dda861e75221ffa7ac41391cf9c027e1b6a07a527606fcda2b534fc17fef3bfcda25d8ac5c330601b1d9383e66e10b9f73ec0b70e4f939e2c2b2cc926bcf24896ed827f635721eea82aa7e4d9f8d649b1fe3bc5002ee235c3e7e609bccbcf3347298041b28d0340def87ebfac1251b476c9cd22696ffce80910d546c6fa6f73aee1e6411e4625400b89042d4dace2f18de7434839dde79fcbc38c778a4f3c1e100683b95613b73b4372b6962492f3d16a62ce0046b5816864401894903708275177024e24d18b80670af900227e47a6ac4600da54bb5ce180ea10549b06106118513b185d7c7e5cf8913a421460c570597e5f6c67e4a28f4642040c1d3099dc48d1837ca9f5ed0dbbf60c438d8c8d79b3aa5df6f717646379cf7a8ec0d944bab3a8b5673704ac741a788f4e35a895f3988d009f7a5897bd171b13a25678cf7d235f48967a9379b3214c7373c57a2951ade1639940fbe385ee5641f7b549c4b697878a67d045e12190effed225d3978f73083c93f7e17c87d8323cf4a1fb44cb8ee0d70c10483bb832f4f7bc7643ce373a869ece25dbf8f8d013f4120dd6f7afbd96a809940a02db4b63110c0ae2ca67bd470c33a83b86f13f5d9f6fa1e722b6a9233b934ec8211f8275c88be67afd2b59413b3b00b0af525ae77fe7af1dce9d5241fddec343f78e3c356b210b23f748d5828fae2256f8e9b21a335c0cc8d58ee9bcff0e947cdf9e411dd4dab9a34e13c2cb4bed1fb66d908a22abb990019e2173eea563c50abea0e436487fce137b711ab1fa44d00f57d2ec0fb27c6a29b78c50e775bbe8a2453bb897fe2daec2666102826cf9bad2be062270d8fa642e6f3eef4785dbb2076840f5c9e69d3a12b45a606a93691c3ce3a9509489d238d1f8c04d8e2af97b06c02bc4b780a2c9a35329bc45ec6d05274fd729111ecbf561b21769b6ede33a534c0de0948c00d33ff42a32d5529c817a71a84ba61d117597ef42c962c3b939e457727aaf7aeaf6899f7207831d5a0f7a41f96d44dcd34811bad040b4147b1099bec7fed9b3a18d9bd8801b59243136b81bd68dc31f534f44fe06f7b51b960f9f352cadcb4101bd4855b984f0886022fdc3b0b4f04a1974fb9c568fd3e8e7d90d3945bb12c1ec39501bf8e8fe203bbe8544031428fc416cd390ba2d33c25dde0716c0fd859c4203a53bba999da60e76dc1c0fe6209f28451322c7aa7bff167be868e0f582160e8267ba0b0bf2748d0adf2927b7f8e599bd66750089286d7d45ee1bb94c74e7c2a1eb33e4b49d82fee4cc9c48861db09f180f15a91bfb5b9bbf5a0f2e76b6e69865debf72afbda0119f9731b8256a5ccac66943ff4f6527b117ec9c98c721cbb93e0cba5a4909816f17fa1e4c6257f1fdd9f877a1b96649631107fb47405be1d51e814833b092fc76fc744f96fc81132d1815a7fa367c7490588c7bcd56a0c00b5d38ed994df109fa0282878bc244c07938aff822b93407133a3a0c46a02cb30c81398d11847a260963d85d58f36b13da9d5540457e0b2f22ccfb9cebc91edf97b06ad5262c2295888fd3f54d2f08458274095e25dbde888660b6cc1f5143085ae8c21c9a50319a4318c50933904ba5a0d817d2213b84383367d5ee01f33ab926b85c851178647a10cf9950b4a5e142cd5c1148dacd5d17e511e9d02b7e8c23f1e46bc480acbf276ed952ce7da774e008e2f77727e900f3964eea34abea8c2de9279cacf7c0b4c783f3ffec900fec8e013b8252b7f5bdae59bd1b7db006470f3a40275d431ca29bb39aa2f8c8de39666f916d068c80840dffaf81614d6386188f54c6142c52fe4af5e95c684278543f41740242332a482598f0957bcfa2dc1a07e1016e77ec0aa75dd1563c5554563500e3501ac5a28084342c2d0fa2063bdd7c0adffd4fb8078a70b092d8a7a6962cc2453176a17bac5296f1d764275c49be8f53fc52ac308f5494615c407ca317073534d4ad8559e7b1f14bcc1a8b59291ee886d01eb2143351e4ea76d39a78794a5da0cc6ff91476ce7b19e69f0af2b4fb980c0995fad24d476adae40493ad68381aeb66fa5d24e9d36c0ddba15eb27b73db328ad474a59f615d6be1285d71ce93c8eaf34b0c72276ac3732877eac80b5e16e0225ffabc5e42a4485c18bc10c233d24f84ae8bf31d42c33dc63e8d2b1882711af64492335adc7cc60d0944b72f03ac58ec960c35d8929fff13ee14d06763383d160b8ad18878e8b18da98654b546aacdbb7c60700fc92ce4dd32ba93262026468e2200b3613696b4f22afe282d90d9321374024e8262f6b543d2e512621f34a5c6d3cb28be23f60c4d28711bc12196e1854a84c1ff8ab16038f2ba05c9491676050336492cdea0e8225749e64404249e7c14be3e01a7240810d11dcc5337136b41fad0de1b90db92fa68e18d26c90db0d7932db44e49325c17f68204a9e7f2ae53fff31034284b5ab804b4e0bf3e11745da9954a7518603468dc34066200ded8048acae195818f56336239b232b5a8f5eb401b17e004489824ad81fca0c2d4778c711c05e0564869a5b4d75b33cfcd28c5a3bb85fe5b6d07d98558c4f36621cc1bb576c6481cc73e5b6dcd988ae06b9a22d371996da2fe2c305bea95982304bc5058208b9818de2518bed0cd41a4a22644068ffc8f66079287d1fa5c31ece2ee4cc41dcdd88343adc958738a196937388174d81289487f30b70d837eaa92dbc600bef3946531e92475947f64db586dc5a1fa62f0ec0315e20b13d67cac39eb5801fc2f37ac08700e91c1c31b30902cf2f2be41528873db322b5b83a4905f21c6f4a37e4ae1371c576571383e63179755c052afec5bdef64c87c9b1bfb2bc561bac93a9a4ea8aa86b123be1992f7fce6f953cbbfe8246d5a7a8b19fc3c1177f071a719fb546821ae3bf241d71dacabe6f444b5f7881fbb46d609dd2768cfa69f817f9ec750b819cdacc4f37787f4b0e6f7de671b1ffff1fbf942015a7223d7e9295ea01bb60de6b45dc3bf8c53ee1c2db30d6ce2fff9729de2b356e3a30ab2082121878c82803b0a7cc4f2cffb2fd380e39a84404cd543870af4e4afbc1cefba834d23e18fc79adbe6fbbb4696d83f3f05d714ecccd38cbc8452f9410ac6dfb6e916b8e1b0b60dbef7408e522724a231af251c0894106859d6acb7ad32c350f123f870d7d888319d6b48466b1cfa25d26602f10ba6d2975c8ae02599d3698e51e5a30049ee16a784a3ebb48b02678fdf7d201824dd5a4ca7b2fee7aa6c2874d0d27ade3e3749fc94c511319a95bce8ada2d98d08c1384ee0dba5672a2630d8dfc5ec774243436a415bd2a3fa4f1e5c0d78c6886ef4a6c4ce5a75fecfe87dd2a0b43609cf05667bd1f97e811562d6619c5f20183698e1d2633326b0e12c766463c8c58926d85aa7de649a9c080e092b7313d8946d85e6588505a6abaa39ff443e47438bf2b79ade8077fa0da4c72a03b9ca31d1ac0466c6883dbb5870fb11c1598b20f4c84a2c605ec6d214281756858d18beb86c22c6c041dbca5f4dd96a801734effb389da387ab0245eb5e991f7a8e9dcf292b89a77e9e0d3cc6c7502e594d746c0786f803d22ac529aa0d9f822892d27452247f7b93b021811db34e578e69f8c9887ba62d45d450df93cefcf1fba5d7d013d70e7f694ac47aad1293bf55664a064ba78bdfc1c8a3285d8c816022c0f11db33021465241a9fb7ed46dcc57beff82bed924739832245c62e8ce1435982317808c0c9e2118d73366fa01559b20806bed5a843268f72ad4cccbc9e224d1267358388b1de7c34412c86bb183e9a0af30665df3cb81d3847c7888e7a8871555fc817315510369582420643fe7263e3f0a3344e96a8fa6cb8044772e87c4027c2181e06f0a6500e70b4eb431f91a39a6563b02f6cb1feffe5d434c99a6fea1dbbfbec194e1933f9aa4bac648720afb061211428bfcbccd4b1a4de7e1acd03e1bddb8a23834b4f25a821859be4534508c88873e3b5df2012fd15b98e10023842791573e360ea3717c626eb58f7b503171d1560474dfaaf64fa8503d3b41b9ad6b11237ea36e81329f2f36d717a6c5fb3e94917cc6510b6bd2587f153f796c6e68cec27404794316cd2400db36231bb7151d55136653d4d130664ca495aa25277653d18dd0de94e59e387abb9ea864499d33f312d2257aec96fc0ad7f7a5400537bcc36f9fb2398b14aae52dbeef9322c3e577264607817ce1da5339cd862d9109409bd3ab4b7079234644c060c6560c6da9b22fb53ce330512568527579b3042c74eb726756594dc91b46cb7de1ddc520128e66bbfce6a155539bfcc1a64485ab06706348b52963cce047a83a072b9278f10d1c0104ea14f79d5920da554d0739bce3333337440f35e531849d712302340117173d6e413e8ee3e8956344653f9920159ced9aeb0148583f00da018a8adcf2c1014771999729ec8623e5dfb255cb5e3e6db25c6c1228a4b5bdf7de524a29659232b609df09b4093d72c83b07bded03f97ff1845a6d1994ef7bb9e2a58c4eeebd979bdd68fb15508aa8f7c0afebba4775dfafa03ed7b5b3f7de6bf15fb7a005668d1328fd00a314a2b5863518f58592b2eeae20de32052938fd09a87d0aa81fdfaba343d219bd4e7702e6b8ae7b4ca0d5396e9b7a95c282da4ea5134ec5843267ed705771ed7057b183280ea5629993db30c678e2896b2afbe4b68a718f540e6d543aa53f4d90a6001bcc0ca702a6fe04aeb80af5d3b3393d45a9fc277d85faef59409cefb757813845f2e3a0bee5074de75651c1ff03f52a8fc39bd3af843fbe3fa19efb1b5418de7c386f4e05f4fe04766f1a3d0aa85d9b827252c375d2ecc4652a99429b5228c3954aa6d49b7064d639ffe4882593e94da6ffc1f2a5b0f43962fef955e9673acf667546475f4ab570a7a095ef54c639234202e847e8c77586663fb31158a4fe15fab925d58fb2a8f4dcec546091d2b7944ca56f31994a2a9b1c3a666bf2305d5226cbf6c7da1f2023b22532a19f9892a0990d9ac994c866b43579663c7a3679f0cd215bf3073f52367f7e342dacc14fe3a9faaa6f791630553ff52cafbd66e3315ae86686016f116dfab3ce3dfb837a956f01714acfbd0ac4e1bef42c20f738269c2237dc971ea77bd3573095c3f4ddef283df733468b4ab2a010059ce2c97453c0ed57c0136c4ad9741d972204048bc9826643443f43b39fd989eb04c60703f339cc0763f91c7796f0c7ca4ccdeba0a4b08c6116762b2c2653a5709cb0ac9436930aaae707364e19103c3bbeea8c743118ac33d2b17cca8f32e8034929aa67f992ea378ee35ec5954e6f52d5990dc817dae2c00c6606b3c31e9904a574ba06f29851c3f48f46c2dd5dc37211cc877cb9b686198c9cc94f9f0030399c3b3b398735f6693c7f86f1186dc457b435ded81516daa8eaf7a7d75179d3732ad0e559c0964f8129bf02967e07efd2df0994837b97bfe1eeff4879ee6f78b37d4bf8a3f41bf72ce0f65c05e59ea2296553b22850ff07924a29d5573aa458c1148a6884270683cdaea758a16ab3eb5cdcc54575626149ad702a28dd6742a1508f7279965f71790e64e93a96efdea563f915708a8e53e426f5a8c751fdca7b204eea5134deb9587b59be73d1ec6b61cdfdd0c6c585e54790b3698f1ca6f0ef48f995dfc102a6ecb37c8ee802a66cf8d63ef72d9f23729ad5b4fc113d71042685769d5ab6f565983395a37b97bfe9de25fc51247f4bf84315a6eca7fc0af72ce18f5498c2618e945ff9940d6f527e2575537ad4971ef5dc8f1e057aff81fa554e53a4a0dc26f194735d2ba14b2922cac96fdf8df4d3095362fae992f9f4b87aa468fa51ce4a8ff2270e2cfd06a27c8ec8bd8e1c91e3bec4a1fca95442316ddcdcb8e91acd572a07f7dbdf6cdb8fc21f27bf6dff2365fac669ed72b9be194e97ee714d772f55b7e7e6ddc175c3e9922fd365fffe0d8bb8e12dee29e7b3f58fee29bddc37d44bd5d0867b1d52e47e878bc72567f0a64f8ac91999939e949a6d4ca18ecee8bb22a60d7f715ffa1bee4b29dcdbf0667b94f0c789f69af423efbb227c45b9ce1b9174e7f2e971f55c271d51b5898292e252a77075fb5a4f5feb49ad2ab55467ad951249c1144d6f6b7dee04ec7e03b912caa77c0ffc2412e95148298f02a77802a2fc06a6bcf7c02fc55a6ba6294a67adb5d65a6bad74d65a6badf5fb6a8ffb2398f5bdd64fa995877ca9d3b3fe2e450ccaed8152fc407902a5697a36199cbb447a1338450cce6de9055336282829cf4daf04a6d85a6badb5d65a6bd539d7bd196cafa33d102da2502ba4af8e5a462913894545d334d5a6d2364db5a9b4edf42dd3d39123aa5e478ea80a7fe488aa27fd8d05b09001ed20aac21f16c04206e412472d2c9f7ae9a5340db5c27195e3344eabb5d6ca6ddc73da08b5b26ddbf69b16d2785d7996d7417d8ad36460b495f6daa7696d0373a773c6816efc38c81c66e7b62ddcd19235178802898664b19530c57d0b2a4ce568f9954f71e18e9670e5558ffad40ed5a35e857a1aba8138484e0274e340f716e2b0002d7416f0e453a0fe1530e55120caab9474505e9348a3ffc4142845150fe5e4f529d421fdc83422e9139494d20e4f45c9d93c45094a63323034ef2edb99cdd60394525a85f650e606d0a61a0998914f79ca3d4ff5dc7b214e911bd57361aae2b878e6404df58ffea1adb92359f4b3a63b2c32db26a5faa79c8a09e53ba508e92934775a28c7cdae458aeee9e84096e7c0d4cf14ac7cf729403df70f4e919b5e0e29ea7caff252e4e6cc0766666b449143323befe89f6c830c02646bbe40d3f628b3b393bfe6af61cd7d1ab73d5238f5f655a00ba8b5d0a7ff5ec7f42a3f7d9e1424676436cd3b72266fdaf283a6fa675324e48cf6f4b51064eb03595062535964440b6d902fbe47399483e555cf2365e3e202b6a84022f47cb976f28fd365c351af867bc9f23aa4c812e214c18fb3f25d2ac4413d97cab1f2dddfd4cf43014f34123d3e3f40b0986cee68a09f9d1f994a0e761417fd85963ad024a03d7e1029c863f2c77c4542f285963fb7cb8ecb0e76d971d9d9d3e5886c7b6a06baef7c19a4399264376ea0493d18bc20a844874a5812440a725250386a5290cb8f7d42a63a40b488f240b2d8c31c432ce2aff38211511e8816bb979b7692b64c2699bf0611a09efedc19a218a82188884de641593473b373d3a3bcaaeb506cba0ee5bb3775e18f1c11e555e0143de5cfbd87a91c2a2aa7e7421c963fddb0fce97152d34b69cf23f52acf83253b38b56f3ba7720e6bb8c1c7d4a13ea050ece043738d1961704080ca987f5ffee4cb5725b59fca2815902ff42b688305268b7e27a701c6d11ee53cc028a7b071c84306d5c7ff38acb9f8f108e6b69fcaa18dc984d243871475561ef5292dcc917a95df910a557e074b78caa91caa4ffd8dea53e18f22daff60795578a3fa96f047ea55a1a4ac5c7de52c18cc7b05d48f02499f026efffd09f4de04768f0272fa47af437aef2dc87d498a28508a1f28c5295a50ee94ed4fb41465006ba02cfa9d2c0279c8c0f8ca94839d44034eca18356cd31e3d72d0db3f07d9953ad992a12d1a47983db4f5bdf6a7a7de93266ce4d3e3abd9d364d3b7e97ef6802adffda9880e29eaa4fcc97fa014635c28da320a5bc6be10c24e790d3cf90f9ca20a28450f2481349425b3bd0ef9a3c8cdc96f9ff20571a3711b1dd39f5e7a299b94d721c59450d2935053d609fc1c3a6e30e02cfa1c0d2734cb12dada10697f0fa5f46e689ca3e18496beb2817cb9c1ac51844f22ce1aed1ace1ef9423f06245afaca71b8dfe3be7d1a4ce8fab504b9047a1b91f2dbc9bf5e4c59d24a514089a66c524e9e7a291cda6cbfe304d43aa4a8a3a3f336291365c64a3a3aa3ef5ec77bee39ad859e40b347ce0cc9199914193699c2f9f241593b1ad4427a9cf4abcda31e2dd135ac1b0df59efe28b36f2465b5fca0f1ce4f1abdf7dd731f2e97b8a557e9e6a8bbd399e4fb72961fb8e5bb7f5fce4e29adeeeeeeeeaa21a49452924c4a241ee2a48c39b3a64f5cae775b03b5b4d67aadad54bec8d98b3b17e81ee44767644c0ce60fdb698843c670c0ac563432ee2e04df0f35f7dc35c40178e2ee003c912fbea3e972b9e48cdc3397d37dda1d298a3f6d6863ec4add08df53777bca647bce30bcf5396bfae83d9e84fbe6ef403c6c1ecbc2b5dd611c0bd876ceab17dc612e972b88e822e8d9de64be26103e87f8106df72eecd844e24a669090ed4e83cde2adecacf958aca00363bb11866c610925409cc0828f384a2700418c2e1021c80b3f4944395dab9810465880831514ed20322164051178828a7c208e1348023e5378c28e0f7c7082083e8916b00420f05c81052f82f083e8527081053128ea096276856ddb64eced65cfde7edb5e4be189bdfdc7b3b7ff2908eded37af665bd9806177af79359db31481351cec86afe6b6adb6d8423067c998b3e496ad8260663243ce925b88c859728f3236ebc1d65e7becd568ad9c05104062feebd5648d0514d8b56f85010b216aac8c7198949db71c760515326cfa33aba4a0267199d7c35129e39133326c9ab39cb19b3e6b6b529e48941cc17b2fbe175f29b3b99744d4843c6576bd4688a0041d2e84c098428e114590c113848a74823c21162961c9685e81c4a6bf9291f04d945de915378802149bfea7a74e8c09a6a9d284a24dffa4e3892ba0d8c1074ff0200a1e3e54c081155238c1051e44e7c2126c8022674cd3094b70b0e997b2a6bfa294de504a7d079bbe0ca594524a698a5743eba378357586922910209d0a6f8257818520226c7f1db464fb137ea0b0c3f6879131281861fbd358b1b3fd715891c511d9366374ad02b6e993667041064963017b9461bb1362b0dafed90947d8fe1f153c6cffa76208dbabd8c1656678a1a48a1bdb677ca1e4082cdbbf4b62885b6b13c0d02b29cb2fe3312e0529aaf8c2c3415bdff7ed29abe8b57ef66aeadcc1a6f43115b126e86c5fa248cb9880c4a65f7386fc20041766510ce102081d4174a1029d2540611603d1298e2fb69faea03f18993d614c80c10e377d3afd1b80c363eacba11ecc014c2144b30ef4143b98792e6ab5b5d65aedcf5a6bb53464dc6ed70a5e1ce8b637c4815a9bb3753c055aa70cb43d91beaaff4d6aad7532a10724e108b36b1d6ff8f6dc1687694389c39c16d75a6fc5f8a98871a5a0ddd1459ccb4073bee59472ca9f36b42ddf9ee8e80189afe4963ffffef56aae07819c2df3bc3f9fa31ef52c9ed3ba17a66ea8989f8a39fca18398ed890e9d20be92bbe4315fd853beccb7a0dd79bb846cc8963159903d723c7b3e8d2d6349665ccf9ed927d7ede5cbbafd3f199a652ce5203d934fa3932d0fb2912d0ba344b2cf0ca7cf8faf263dd1d1431833ffd0300615e8510363ecfa63f689c0efb0ab0e8b103a653f7747d01f22d9c7085ac6d75230a57d106de523246bfe0f721134137bbe077990077950f671ad37d9ec41cf16e4317223f298bae76f61788c8c4951b4e7cb711bda53c61e37d956b427e7dab31347eeb527f509f2b30304044c486c081911414346af6248c72e8199ecf9d3886d849c2132a711194a64d8e3f41162329b6c618f338c3d9becd175f6f77d2b8d482bca3eb23d9f89c760224c8489301126c2449828f34c9fe9337da68f8f5d4206874cccfb4efa6abc3ffb0259988fd5f118fb9af6655f2f9bf5675ff6a70a39e32f85b611291bb96fdc258e421e4468cab281b2a4d08ed17761caa67bef4761ca897c353f47f4a0fd23c31edaca3f9435df674ffd659f0ff21eda92a2cf0f506ccfec4359f3c1c83eee44c8194ab5948f1f423be36beb1072267f081ce61ea6a64bc72544ce6860086e90427b2372b9f616a6e62b8814da199442fb05c40e103b4b146ddfe119e2417a8ac83e16967d2c6c3a0d753bd713002470944a3a539eb1ad31239b72630e625ddba78cb13f5fda4de3ab496bf0180b1ea1fdb5165a86ed9a6e40b65692e55426f9b90318db7516b657610131c8d64b967c9964bb5cc276036cb741674fd890c374798c5d3261517841ceba9e9e1544c1648f53c7561984012fb66b41af562bf9a39ef1f018f935726bfb02b6fffd13394383dc3d4ee4cbfcf9f406ffc811e74dc6f139e2f41d2d5fe627d11994a91bed734edde4c738cc81d23087d79ceadb8be348d2e98b06a9d6c757d212394942e467cbd7485ecd11ed2149d774d23d6f7a769472c0ddfebe3d1c29b07fbc1a24b6dc60db7f050bbdfdf84a8e1b10d7755ded3aeaddece46934e6a41ca072b23d1c3bb0e7d3f88a060d794bf9e248642ec3d6de90912f32cf9cb3b423396b482c6560cecff61c2470d061e20052ecd1e0cf91bc9aec495f691bbe9bad1bdd369f9b548d4613ec198e62f245be2645ce5a4b4d59f275f460c4575224f182caa9aba44900c29e3032ea85adb3deb0e70fe91b4a7bde50da59d04b44c136e06d750bd2c4a0025db3beb536d1be85ffb44593e9a76c198b62073bf4811e651430d8f41b20b78ce1a067d3eced5fce131d3d0c994f5b34305ac31a546a5d6aaddfab7e07ea55429c9647bd0a857a9cff2f4cbd14f17c14f8d55abfd65b6b5551f98f964a2da80a7efde9daa9b5ea5a6bad456e1d89ad36e58f7a297e60cafffbabaa6febdf5aabcb7fbfc3e53fd5e3fcbbfc0ed5a3429c96573d0575941e54790f2cfdf46a46af320a7fe488a507c129d2946bd48f7ec7f75e88d3f2df8f5afe7b9c7f947d1e2e8f7a1eaaff5450b5525a6badb5d65a2badb5d64a714ab3f569adb5d2cff47358831f4ce547bdcbb780297b431b95979bc629d82365c31ca877f91d2e8ffa1daafffec1540e6f50ef127eaffa163075f3bdea3f8a2fbeb6d65a6badb5faa85596fd6409f3fb3c65653b954e5466909df97a2d99bd2eea378ee3384c009a02700aa85eeb0c7b8aea74d7ccc78fa21a680bc70c47ecc2e0ea03cf0ab8f982c1eb851a41cefe686bbe5e2890fb4fce8c367db92315ae84a9fb2b2fc51d92b270eaaefc0eee57429c2237df6f8fb3637bd4a3429c2b451aa7715bedce0f102cf69ab3949ceba4d8cca55b7a205afcf7e1f2d2a5f2aadfd1f22e218ecbb7bcaaa5e571c2570953538a5b0b98294bd3968f700bb10cfa0f7f94d93276aa20f82e2d1559e483b600e0a57ee55f3cd307e8870f5f15f9bd362d9ff21298f216d00765e1548e962ffd8e962f85384570c26ff91daa5709715c5ef51c373b00a47284aff23b5cbef43523f0df03c19fe1ab3c0f972f3d00c0294a2f75ff51ab95006c1a6e8a6b51ad3e5c4510299a3b73488fcf848181c1dfb72ff8f58226902faf1278822f9a3cf828c2618da76e68f361ea8261eabecb971e270c53f7ff5bc007431c973095e3bfe55337bcf930753fa5a97ccbbbbcea53372eaf7a973075c3dba326bf8dcba7b430b543e53fc429f22abfa3f4ffaf1a41ceae2c8f7a9dd47f8fabaf5a5e85f229f0e44d291ecaebd73979d268e4fdc956506e53277a23923e4149f901f2f1e5688e52d4a37eda5f6ed7c196311a20b1e71ef1cb673064bb3f7e01b1fd7110c7af30f6d8cd399f86b9e7a7fffbf15462a0a578958cf9458030f47895dca2eddfd244cf1f3150d0f6e77628cb1f465740b425c520590cc35e94e5318ca12790af469b861828069afbaec60d34f5f15507ea1631625789c7b0ec198e8cd039b9c6107aa43f9327bf64ece992029d72007efa384cbdaf64e0898130106de51706c240db9d98c1b6e1a899d0c22c08a43e33965f5dd094556397fe28d9637559253e63f4976421cde46b62c3c82fd7f69f47642bfb20b1679e5c43881ee509660f3e509053347f982b1a3933579bc278504dcb396f396fdab6e5bc79997b2a72d957f9955f2a3f5a8ee62c51e0601cd018b6c8123591a34d2d116d4912c9313065986cd26e09a2dd66018ceb721894a0e9cf97c7d0d7ac16e44c09b4259a366658022f64eb7bdd1eac17b6dfe02d3bab806cc948296c7f1ef246f7fe769601c9f22ee45eb3ad858c02baa7e10c2513dbc40b3d778ffaa22d5b4459fe6f89424bc41109a2b91fcec71ed1d257daf7c9dccbc35926d511cdb93c46c763b6f727a22deffd72210e33744fc5ee390e3fe7eea225a22d8ec81259a2971cb9d768da23f7e2421ce618291bef73441dc4951b37d05687a8035de47c4aeb75648417deefec8e058267080e3ab8f60db3afa625da0eca6d8938d8e6a331fcb57dc290482959a0af4d42bed89e3d79a4ac2d2cd07a3b0d21f4386113467518ee315938ec9b4cb60fd99061d690c2d09cc9144d50093d6313a6841e659091198be1087a94b14007240f2b64cff7bf80d4808cb1efb6883d7f9457d87e2d9671e7b66debb6addb9ed26ddbbca7a217fed041949435376bc4c27c351f839647beccbfa01de2ab1e5f25215f668cb2a65542d6981f646563cc76584705e740db278f2679bebf266740f9e2efbfcd56f899076d650ff26818ed2c5ffc5bbed013639ce5cc8886d19ee1ef407f40b6a41824b378c1155cb4a4174318c2822fb2a0841688c4f99d2763eccf7932bd19487b7a33b8dd377ce51e04f9e20f0a691a195f790c35d03694a161ca49e99c944e7aed90201e9e85382963dac9512929f5a474160f44291ada6cff4d6cfa367ee32bd7401f9488070c4de81166cf70d4ec903df1bdf8badfebdecd37b43b3cbe9a22702abb8e9390b3654a793aadd669b597fabc2670b47b82e0e630f589ab7fcea6937e9de52eb67b7eae48e81ace394b336b74e21d5c6dcc34acb4d9b1ad175b6cafb5d65e190190e539736d67ed5bebb386b5d65a6badb5d64ae9d65a6badb52f7d65adb556087afe57a4e7d357c9c05a6badbe8269ca501ab5d64aa9bbbb530ae32e43bec877ea3be78d6bddb5d6fa75594a29a59492548fe8f9f45333687bca1777afbe916c70ab6671d62cbe95894c05ab69160751af6683e83a4ff33c6f942fce9a0d025f7cb3662fce9a0dc256cdc6b41a55ab18638cb10d42be0ef4521494147a7110f7534a5e59f027e5aada505e1c84bd75b3b732b1514ac3295fb4d7a86bfbda1a84942c39e0aa755aedc5596a5e4d7eed729bc3d47891366e660d9fb9ff5519b44f4863991b1919a964fbe75b3f1972f861aeeb3a4ff33c6f94f368e4d5d41fe14d43c6d4d764e82880eeb70ee4365b6572984924afe63e495fbb7ad296ff656f86968ec81a1587d67ab3f669e3ca1ad656972bebfb56eea4932914971c7fb94eb9ba7fedcf19eac6f7afb53597bc1afb25d39cd15ec2e48a8c8d6fd6f00f80127a3ea791e0db39d4a75dece94940db359cf22567cfaf6d59830c6d79c0595e0159c3bfc9963317f878086192292336167491843de61eba288250173f4c7491031774c1d3c5cebd9aadd48b609b177ec05020d2887eb84f906521a127ec0859e103146242b21fa0d023147b554124047b59c12354041504c1484adc2010d1c4107c00848821421001848684881f362410e1c24886d0c21186a0429e81d6b68c0d1105ed086db78c0d1164032aa690f3f785d5636aa50df055cedf175297564a974cd0efcb19acb5ba0df9a3e740fbf69f207071d690ff5fa77c91eed65a1bd65aa753aa1a42cf7749c3484a2761319d565ba9bd9836c063ec9592b5e583531e99423e61cbdfefe197b5294e1bf3670d9f36acd033674d535fdb648dd2734f5bdb6b6cff4903739ad1b6b7529f764433e50ce3d943594da4fce48c6f3c7bf063cc7d7266b4f18fb4d0a41fe12931fe11387f280b3f09bfef1128c51ed006da43fc143f0c5ce81166c77a34f8d67c4e9f73dad03c1af0ab8ca0ef1ebf1b424e58a0c7d933aa6cfc786efcb3081df82f206de60464ccf6f8292063b8c71eee6cf7c999b9f1733054cb5de7759dd755eade8d9e8aa3f0870ee2e83b3c7b3c067760063590827627abc819faf8a50c1c8260c2b06b57bcce75f54332d050f88e158050a0f09d2b00d9ae20856dce5eb0e714a262cf3dfa102d614073487a00e0c2677b9ec74514b68785207cf7b97bceabe9b4e4328764731c13226c8e0b1f3677854d4f11bbc24e7e5c6f58e1898dffd62882125063db212aaa80832a7861c888d59c41912834ec08a55bb460d32da4a0c2135f85224fbc3a2cb4c5829eaf4b312ad460bbffcc2f4cf04e0b2053685185498b2672663efd12107dbb05d9b232488cbd85cea630f942df06d19665c2cab6d8d41ed9d406b9687b288b8e76dd82a696675ba24dbf6ea165ed428f96c866415a220bc6a677874daf0fa69d22707e32dfc6aea00e1e98c82349e0d9f26bd51246c6dc18fc474896c421f403c99236aa8d4de3155f30755fee6aff56fb16c6da2a6545382983932167e8cb9751005bfea35027da0ca9e597a13282e6eca496c7b8da737b5b05b0e773396b6d6386ac311f6f1bcaa013d49ebbe00dab7db7707cd9f5d63d3f77606a86a00d60e042c27ac071d2868d9f8ef7e5bd97864a4ceb534a6db5f6daf77d9fa360ad21e8f60dc71cb60d6fe8f6dc9cd76e941adb7bbb3cdadc5170bc95664ddbd257141ce58ff45de61f7cf3b54fc35ba55b198e36ac28e1ab912f69add47a0be34e4a4925b7034a299058b5f369b5b60289715ec438a21890189018e83bd3ec230389612038d8be2123f3b4d3b6ca00e32b7f986a6f119ac66a65af6542cbf8bfb8b27c38d3929e95d33a19434393b386737dbf5e20518e88900dac101302c266416f5bc6845690c5183fc88ca0495bc6b220e2aad07acb5816b32c8230deaead94a601382050fa228b1fd9edc1a7750622881591ccf01429704115a300ba322dc44036b34e9881679d3b9d048924492431a2bf2c3bc210538a22a420a26332222ec8b21d198fb3e41eb3cec2a7f445f705198d923dad9689a04fb68c09d1e24a01054c85eeb68c0991220ba1b92d63429200d32a5bc68410d9a384dd233a6f191352c41ef396448fb68c09112227d177cb98909dd21716e8e753f0737094479a98b97ff50982a004741b6182fadc96de04ef96decd0cdf1e7ffb3ba5d45271da39bd4e84a0ef73de49195a9e3b246750b6ff652267e8fb9b7efc2f17f26e61fb0d6317c997098664f9fb6b87f9851eef50133dcea09da0ebb8d6fab566f97287eed069e71aa10b337e66f84839fe4aa8292a3ce9f0f482998ea40a483669cfe7eca9d24b5f940b710d6dc895c02972267056a10b5604899309168488899c8b410517ed4ce054c2164d008927d0a14842e42c756ba7acd6ea919d41d8e20b44e209b42e1842d45a6819a79e138cb64c31ca7a4d1b73fb9f829c766e38fe787afdec0bd2b2eda6536cfbfc3a448f58e5837cf107c7d0299f4279b94fded4c48cc1e126d8b4d13d044c4e6c294362fb978e9036e692592252fa29f9c8993cafe001c9b5fd4732dac253f41f11d156e97df4f408440173378a9d5ea3980e47b1d3e9fd4750c8d629c43e94e5ef6902c856e9fd614631da2a85a62c4896bf45c0f670cc76143381b1dd74321199c21b64d19e8f7d3c73dc0340104cfc38e580fbf669b86f431f80f60db268e3709c5f82b9ede790f60571a0638cb1bbd00423eda99520607262fb9b9a982bff207b2c2151fa291129f92c99364a251ecc253e7b24d5aa5732caf2d12868fbeb70b1148e62a7516c8e64b3f4b3542a85a797a989a9c844743211956e89e7749af183e2a61f70b7d1156d75a1cbe639afbdd32567dcdd082e062be871ba968cfec3397b0ce6603735e2f522174e216739bd94524c2995d44a8c25c6aa2ee81cbc1a1fbef229a482140f7a9c2e57c1f6af31e30d32fc5d057246faa0ad295be5b09a487c253487e6cc5763ce13e3c933c4e51abd600c599a25a7d5deac6d1ba7b5d6baeb4e929c24399d462492d627282929a592c9743aa95c151515aba2728292b279d5badc75a85c773286a6a19c25596f97e29546273f9d462592499f7c1ffd3eff4c1fea745251f93e146a6525956a695151f93e146a652595626151a1b840bbb8fcffb7c2524299564e2996930a4be988140b0bcb8a2ad5c2e2f22d1d8baa737917176f06fa5ecd7b351e565f81326233e88c19337cc68c39230c012043c68c190108800004b05ab15830c010760000402763c69c2143860c6f06ba3329d7cc902f3460701804b062c110038d9701ac565f3a6286ac140b8ba56a61b1582e2b2c168ac56255ea1386d10c141c4a6d8df4ac31da483a3d6d74b386bfed3adb754ac0d9b64b6cd09e33b44e98d3f78910b445c2ed8faf7cdab047c81afe9607ddbdd7fac81731f468617bb43e3688b266942586b461dfdf8e21673a3b4459d3860dad13640d30648c9d42aefcddca8abad05661ad4cbef89ba6d0e3edb132d9ce7f85b0fd47026c1adbafcfed61e95e763fa66e4f079620effbdcec346db9c7dc17fdebc87b1ad7dec2e8f62a981ef5eeb93d3dea8fdebb1321e819da227c75ef0874f1f6e8db737bacd6dd8854bdd088d40d15f5535187d7f20ce929828afaa7f351179a74f7151a56e8e9d1909dd0ef56b876d6b9aaf15de528a5b55a2954613b11c9ce62181aed0c02ef0dc92cb63321ff289bb09db44719b3827a35f869ad565aa723aabdbfcc97554ee851c66812b0188e0acead85d6b19cb5febeffd54afa4c9f9cb5febfef2b1fda7271f3597df76738fefe9498fa74b432c63ea535d0d6f4e1344a22f21af2c5321cff7b4c1f9f3b7d2ea59752958f1e57abe7a69c958eee113fd8fed99ffa631ff9e2ffaac13d86032fc2d8343058d6b44c29f6f1919176b83fd7a7c94ad5053de58bffa8adb53130d1a3157ad19685c5b67f157a31ec901da2adfbba2f3b6487ae1dda7e84883b6dadb3d65aeb7d2aded5fdc14dc486866c68a26d18723dafd0748f7ae60328b335a2b45ca1ed1e75cb15daf7a85baed0738fbae50a7df7a83dcffbc0d090a6c286a1d8880a5a8a190698077a94b10f00a1b56c397ac3197a80f015cc0689a07fefd0268e6c4abd18b0d038e4cc071c205be3dc21d685edae85294647e871e503c46ab5e2baaedb9e8adbb60dd930e28293d265a0c73cdaa325b46fe9e55a71adf8de6a6b55811448454d78482be86aadc5b8e6f70a6818f018f93c483d72a6b5fd6ba02d191919f288218996330c90b1b1001928a64b9f7484ffa3f4a31fa5b5d6dc93840b09e7da8a64646464680b86981eedcc579a909cd9420b29862da2ee2e2343c346b43561329bcd68cbc26033d86c666116369bcd5c9a132929b5d65a6badf5556ba5aa257aacafd9d65ae8fa923377fb571f6a1094fb33dc10cb975a5f5bd0566c7f0985ed53c80e9d08d3a69133f7fd6d3ca6c763e8f64712f07a51fb51ca1b2f185123a2041bc1bd06beb2a8fd06ea009111b57f65911bb2a5b8559eea0a69517d515ab4fd9d525a5faf949f0d082793737e152ee8fae367e9517a29c5b022b4fcb4f8905e4d9cf4ca1c09e322122ea22d920f92e5ff029710920d482ff9e2610f1a7352cea7d7c8f61bdbfe14467a4d1ba3ed4f0ae231323943dab194e443a3057a24bd48af70d43a7c799b9b1e09e62bdf314978099d710c43f428613953da8203bded3133d95e222a0d9976ee2bc76f7be5c60df415da238b9c655c44598e5d7b2415e55a6f80033ddddb5149a3306ea049ae5111e9b5fd61b0821e15ed69ffefc518678c339e734e0fbff46c34d28bf46af9d147acccc6b44c83e48b16d21cd20fa29452db8d78f0a2adfc5e05d992a2644d4aef1c624bf9324e212ec3f6247c85648f94c9f6a74342dac22c10bda1754aa995b914283b28afedcf35795b6df8b48679e85f60adf52167e2313f726601dbabfdd18b647c4167a16b385f322b43cec31ee7101b1fa22c7f1a2f3d830fb90ff910ca8e0dc29454aa70b59b437c95556648d3c4d08fc6b7e10611b802bcf7e781811ac09ff3e7cfe71952840f11fb4359f3f10e3839d242e3cf2f836710070d207a9441068fd17a5a7badbdd6da2a23638970d72c4acd30daf4a5b74c5ffa31eb2c5fdc1466afdb9cc6b94ce90c66c45bbed0a31a4568ee4bbfc45ba526dc9842dab8e1757206096fd19478308f20f2337d82d01de4d479bdd3e97295c01a6633ee5146dcf49149967fd6e1283482914dc339e2384e739ce6ae0ec771a5a762c903ad901df29565e2ac69a5206bcc9f9fc59e3ffa06da997ca1c1c01299cc85e22321589805fa9fa6247a4e3a27f5e6d3199731861effdfc2681338528c6b72225b2c2d6746db577be2bf23223923a7d8beba02ffb8d272c66b758942a7ec514740faaa879c75b8f654d4c21f3a881a4f5dad48442a3f2a3eabd58a46ce38921ce87116a047d36ff942632c601e33e2d70e104e22e72cc606c21863fc4232aa4184a63f33b6696bf2bc785e2ffce25129b94194e59fb3fef00dca413ce62567e8f6abe4249333328aed9f81fc738615e558916c3b0e6938aef6dc415f25bef2f77098caa17ff437fa478f7f14fe2882c31bd27be10f9427fd8f93d79f23e6d7b495b29f62df4b097f70f851c013b0c60c3469148e9fa62c8a8b80811ab09383f0d06cd9ca3ec0605d87f1cc3c3a5ccc3b94e54908a550a814ed17453d0c15918c000000017315002020100c074442c1705050532dcc0314800d6e8c487854409687a324476214a59031c6204208310046446668481b00c44d6a21faa695bdd88540057e08bf563a00b69fe8a20c14bdbddc9ceeb3589dd79dfafba5c41e973c51df2dc4d53fc224df1bf07d7926923e54285d6c0547c6dbfd9a4542903c06f5f05d5047e13115a92a6c8455210014e30e80a09afbf7782daf200069ee9cec4fcb5d0181476a8e3ebf461da85e2033609708a2002c1b829bed5a5ba9c9d423f05891d6aa3c98c6f5a7e0eb2d9013c42ac890c5c10845cfc763ad9e817a5a446996faeb74ea1a18ed05072f92d369a43ef9dec73a3c06140b81a766b3758ea96722ecad727cea15fcb3a5c1b5ec7d88dc1f3dd10b4fc2da917cea29438527ebdaf9e451335fb5d5d80c3d79709459a4504c5eb8b03d27db6f3d40224122f435a248477324ef8f6b78da38f24a805529a87b5288ebd4bbef21c319b85349bf2602149bf0e3ae9d604341daf6e7f595c0ba2fe7763a6f4868109c4e1dc0d9de0b4eb814a73ebf89744117778e04d69bfd4d2d43819649c9aa9a3ecc9af748688642f6af1f5ed98d494210fefcf4ec07401c964d8c3970c830ff68af33625089a6d96825f084a32e0c0e0d41a4a3ae4c00b045b6bbdaf8f623f62d2c3c1a588545778d44b8058130064bdb28ec1e005220a2909b247ae8f0f838a6938e9178ff39925c75d231a78c2d4f65a7930619b24e007e5e629ab1e081fef1710ee230d9e7e0d3a171ae5a0b1f169785661454d536076dea39344e25ba51dace31c85116751b4a661d0e530743054858080825b9980494704eb9524ea7006c3ce1fc33741793202bb912b1055a6308ca5c0d67c0f942bd320b29f6b9b92bdbc2cbfc9d7d6219094e8e3ea5fc05aedf9eccc55808c35431710f1a93662803741e63a3ef343160a478dfc8f5a2c0af735868d4027b2cf1386dc56b890dade39c703dddd947d599262afe5e690cf82cf062e6a6ab9315c373011ca5d674194764a38e5759a7e1c7102471b02400440396c2a744fe608cf0a247766392b5a65a42326b6a7083d038e755b98433bd2bb7bf861dcbb0ea3afa0eb0e59f0824b2addb0b69b0c2dcb817478358d5817bd4bdb8483a40bf81233dcce288baaf4d15cd22959daec350055a47d6ecd5b8ef00ce2ddfac779e52af08a2d92e38c3793e7a9536068e956eccbc458e15a78719bb61d7f46215d508ea9e68953b46a8f158c21e660535ce0521151a74ab37f484184f29ca52c649aa3ee963bbebd14dc50b77a4c53a616dd029565090292d7afa6966cd41527ec8d8d3ddf37c7a7b777a83234095da3f2527f5b2258051c8af149a20fa69ef461ece0290440e6f761d517c0dad75e7af894483ba9df88e79b3d02e6e64930a3f3cdcd2a43a60fd4310bd786e08440c33cc732a880c5279f2a3d871b5e95007d4654b9c8ee43ecbe5327417bd727b168aa245e726761cac32a54ac13b17a126c8025edc7cd12a16d7e42851fc88633355052b64c44ee2a679aeffa9fef71d003217d74e29e556b1e848a12fd19dbce972158bb4a940f7cc7761a3bf8462736e66d0c83b55c1e890531c490a199c88837908b5a4f3e8cdd5da35e79b4b8aab57e40bba326dd606b5f36c2019a2e94315917b3fed8c577ac756ca1524460b73cf35e4da328b9edfdda202ab865f7e2f34f23d0845023df374a176fdc70c2b78415f80e4645861bc246764c627620a62608e11fbf281bcf6613dfe8a37c177a8c2ef0fae3549e74df93c19123e400905045a42bf484f7307407d98fee984dc3a27018d9456a0bf007ae765a705722ca879097784c655fea33418d6bb832380f217e0a773190ca56f7175d266f21baf965549d72a74cdb839c567293d7c6f816e3c8debf8d131c16f73478a898649be81f2647fde29bcce20eff1c7c4cadd59bc8bafcfc735397ceef392e389a4e415a0ef01d8974caeb6c9d192c4df38da6dfa344ff139b94766bed4a0e7cf31e729ebab41f43c427e2c551d2fc9d8bea8bb732a554d4d8ab89212316604f9245c7b63417383f51507c064160ce9e2eda7c6902f49bac72472f1c050820c5f1ed0b72961d05d6d6a4332c4cd194addd3777d437ec549dcddac1a8056264e595165a0d4e406a5c5773540e1d1cdb73bb66e98f8de843d51bf19a47c29fcdd650deaa2040d6190edb7f407746c3ead87a0bcaf3a49bd912ef72d332b87b190c9ee681cd24ce4e31da8428e790970c96430a682408f5716addea498045335b7ac26f7bea71f1c74297e007aafa4c8567012bcfdc99d430bc6ebfebfb11993facdc71757345296ced0f844f07d482f81a70c5e99386554ff4db606e39435fa25de2fae3370303e3848d73173da2b129119ae8e2ddd580911051a515409d1360057253e102569bd74c0652293e4127438a57ab9aa45c4fc83833ad5895926495bb92feae35bcd325600a9ca3a4cdf9f263f4e59cafe1a7c1db0f19526c48c4edbfb3e308d3f8557c1456c51aa1b892bd7a124f82548b0ceac39575eacb2fbb1a36579f524e6c8518c8e0b8ab79536e955d9bfcd401cf72968668bb6f793b0c09d062f8aebee44a7f85959ecb4caa78153898cea4ef7f9d6b22e567f49f2986892549322e108233c09c50fa881eee00a415a2cb6e5216f3e514cce8e9d1aea9c9b9d46bd1070ddb2507b6bed66dd67a5871a89afea3846a6ba13cee60f71a3e224b4ee480adcc456a4602d65632be926b8d9348100b7a1cd980116bbfd63878e52d0aa0428fbd38c5e6665e2a8678e11092c05c519f32765f5873cab7c9fcbd6637f64407b2d8675e8b9e8bb66ae2fb1eacc95bbe44da28a5f9d42b398a6624693a7a8bcf361901a66480379493b80da7d510d05950a0c6a3ce3bbe309eacccb77016480e9a16169e0fbd48194931e0c0f51a9d16531983e1e1e94c04dc813e2a80bd991b981117197f80b51c60b4e0910f16fe4bd563796408fd030b1f428f3effd26f44861bdcad33d2be9c8c8592c1a351500f018f46cd58a49292957714ccacc7a9f0bb951cb960ff95c1712da13a54ca7c438c05f62add5cfba78190b5b923a5ff645cad5826165b9ef1151e1187a2c2be1832a99955fcc4fcef179adbd729c288fdba40035d08e53644e017b3badb4691591b22b79ce87c9bfa609eade0c68cfd7ed7cc8a16ff48ea0a694d38a963e604a1f9df54f9ac4710573bc4131a56c72cd0a3e0057deb03731e6968478fd76bbeaf9c0b177d2901a45406e651c4251c4a964d3bf6e4506db3aeb0c581b103209c079bee08b352e800c247701db0708714b13e4d7269a67c94ba82001e3aa2ab3c39f529a69276d6d0c37edaf8841487246a23f875e4e74123d804fb6a37a9804a626abe693168b6bf6c247f0ad1ea614754695fb6ef1de240db16b61da29d5db4e82c76e6f5f88f07aa1d2d6bd4c0f1d2df31696f5b8be35526c58608c442c6b08cf12fcfdfc304a8fb665ac049b07da4ea8e3b231dfb6c0be719acf0539bfd3032f5b45d866a8f978fa356262aa9efa10517b3ad26f1e86d4287fbd14193038a2330f141326d412315520aa9f3bc229f088eb990c22d09d6762c56fd13ee8e033e4e1db7c3b3845ab7c64456dbe04bad27a520da5400124ae04fb99009edf79fe8f236c4f8f64ffa0c67c3fc562276c5e24d4fc8cebc5e4b11292ab8facb50dafc0f9a3dfdde6447c14b8775b1f63ed46836f769a172ef6b6eee066d328f68ffa78d802662c4870928e1d87643c721d29a4fcc9d27e76ea5bf930482c09d577b8caa485b83252f7e22efea150af8a1986849b6f406d2611e092e11663a03bf1502772457b39607865d3c8414b3614e82d4a03184d83051a4db4f6f0b977c5e7343ba79c08da83a86c259b549e2205a67c059dca4d738bc82766ab9c8d04a659c8b2fed25333ee0e3d61d2382379df7536c2e72ee9a79803f86dc559469259cb8833790efae2515ba3cae401f2da91e4e9911ef51929dc80b15d4e3c703b3e9ffb0b50934404bdb31fad37f87f1d0bb2dc7f7946c214b0c499c3fc4773a1f9174a5632e5fc4734ce83a809735f044732e22bfca99123fcc2a8dfbcfd6d6f5f32103ce930a50c100de58e937d217503e81f6b5972702d53861d1ec1416f9fd83abd11a228e461025615e1da622eb2c198065b6ce5688f28c48acc25b65d1999fda983a860b308c00cc42893fa8d3ae9adbbd132d5efbe74c52ea6caedf45a061422900cca04fca24919368469c537839008ba95375f3e2de2cb4617cb6728f9611cd6e13a65dcc4484972ba07642b271dfb047f296c983cccb22a3006a23c0f130461e3974071c60ddbbb75a8db078e10f282b406fd5a629a1fb423a5eb80b65a513ac6cbb60ba59dde161c3e12acf455955a29638ea7435806bf9dcdcb9073014c5ce425065882796d8fea7058cc70b1afd029cec0def041935d6eefa60df08897a16b297f18fc7324894f923b93fafe5a7019aed62d483823311230ecda0aef5ab46a2139fc138449644e788dfc0253b7d1ff313f2df92dc4b82ff4c08ff36d47379fd86044ddc05a82a0e6f11566bed764ac356252d15a5aff943e52fec0b8a98891f2b81a18195d109bd3664196e740497a0a508d9d9c59955eeb879bee712a4954d25c00bd04f98a25cfe8a0aee8bb4e1e849fa84d8d0361d644679c73945258f96cff91e4c44dca82deb1bf45a1d7eae7ca05b7ec1322263d36478a6b411d795fe0bafcd52b4fccdd137cd5809c71514d2bfea641244ab539f9773883a1cb10505bcf4371fb0089fc81f909f8f98f16007ccb17d419d4c26cbb44854b80932d0bdf1fecc25e5460906fe0372f8e2b66ab5e98d55b07ae183ec2d803425b7d8c62f11fd04e586937b1628ad25713d9b6b0cfee4f7eef155a48f7fde6ba8b906a4ef5e53c1c6a5aeb385700bc45a536fc5f8ae5d5eed6bd653e81f56161adffe442d779fc4b16d039d2880a01693afdcd161e6f06f7b2ce9f3e070b1a0bfd0a28f9e56d01a2f309811968c08dd19e609f9c139e10a306b677e85a55f952cb9bdf5031d12f64682887a83ac67585168c41960e506311e214868e7d3e2f198f7740e026a50a55cfb71b54e2904002684c2afeece5ff79f0b03a6fcc759773af082f33252dc7363aaf54bfd34d5a34c911e41c1c8f594f02fbee561f96f67aa23562fb8d1c99890712aa1a033c2b187c51f9342126b75ba0765793a0f07944f031240bfeef0e1e209f46ffbd9d70f70c33bcd70c2d106d57c0f4d2c097b460287bc37e4d27424052d477c4ff93bd06de3c9c36fe75aec3a88441c9f75741de6fc88a6af0a47a7f17a50521924ad9d2a93be853330a55770e53526b0432269607c1fad82af1d2c8468a7a3f231cf745129ccb269611296261b1f123a15296445733c3ca43a20601aa17a42a7fe4ec329e8dcdbdfbc03bb95ae092dd3493e651bd505f56721e90bfdbb96c9b14ebb248283dfd2a14e3b1db8596696134867e4661ac920c608e6ee6c0b8216c322bf00a1097e0a4eed035199804ec130c262e0d3d8853f5e851663856b9f9062eabcfb4f1db55af481a58dee90630aade4cf836e9e4d6a2b4f1b36de494e04688aab4ce079cdbcbe315c74546ce0163dcfe94cef1a655e86f0bcb6ab7c99bd412f42a60ba2975b5faa1094cbcea2badfd0978fcdc61b38e8439ed7a32f4f8e47d554231a2cd3fdea54d0a6cf1f2c1b00a0c03a53aa7117b6626f115def912eefd7ebe8fc91a0936e6f930c460aa403744f3ee6a1796ffc72484518da7943663853f43616721a22b77113a48f3862cd692bdb214ea5e9eb3eb49f99008f59db3ea705dadcc1c1f9113f1878fd9f46f6bd01cebd23b83972ffa43bdb285fa5ee75315d401f6eca1343d023f0fc888d745fc8258be1e7cf7bf053694ba7b6d5e23b5d182ea920c813a9d0a05c2407e545cde1014ac14509c88717af79f6b6ce3275b3a644b5031d721a2a6562f067bf11deaaf35c90330187ed48dc2d8de80833e1638ec706307d9975a9348e857247c1f8151eb36f1f8d65dc46d381619e80f3ff6ad253badccbb0bd335a60a499580b23d3634c1478a21015801cf1f0423a44523da2111ca6ce25d94bc08c1f3a8a829fb5212d54ad9412fac7083a9fe86049fd794bbf2a7ec57f968807a2188d9cdd3b23a003909dceed0c69dc741a8dccbfc246d9378593c82f7afe610a7a87218f5892db1d3ca1f3b459156731c3ea7cac2cf7158cffe378e3b47d1c595bffab89a2730df357049d290a714bd1cbf9c830735152c521c6fdee2ccfa5e80e896c81e235426e41e9ae527113f549e508d32b8efda4dd00b326e278c428ad0d9f2375d3d7700b3334ddd046ea196e6e881267cce702d2a94eb6a7f915328bce2adc81a2fa9085a3e98f06b09df7ae6f8d7495f4854d983740c6168f88978323aef124b4b91383ce7351037a3361b5f5438bd59e13022f3229a76a193f78efb3fe73e63895116df44153802fe186a261f05322e4ad3e9c741addd8f1973cc2304cb147229b41e25a39c438c790230280ce4351fdddde13415368681911afc3323bd75487b47f8b0e576237f5e3f42629d5c896663d402a5ccba8bc848f886b8b6eab58528992aa50ba8dc198c2ac502fcb4cd79590f931932e5dcd3be810ea01057d2212d6b77f2337790837827a450e3737e12c26783e87707414598acfd4a45b02e424c81f8c282082a7536976574664ebca556a1dff0bcc4226624a225fdbe018f49aec36265dd933bcea917f785d38176671ae844fa218a4d12edc158bf0a558c7e11002cbf19814c82786c2dde069ed52649adba15c2efa32d84a69ebb51f672d15c0fe2cb78f90c5e2efe7cf8f3472fbf629def3cda2f81d4fe1ce4c813f67818c028c2d7708d3bced0b04f311bb8ecf419d1b1cb8a611e4af172428358c22e79190c0b7db305c594cb94d8e2b5d731a6a42dfbddc764275641bb91a8cf5719987a0d0aa1ad86868a96b92c2f231bf1c17f2a379664fa43f6218e7ca4096ba74559fecc0f0ab721b728455ec2bc976e751a527f091004f9528769d449248e6e310504917d1e1c991685a4abc0cffc9f91aa53ef5e64f435cebe1194a730f5a0792012fece49225c2c897da9824e18f526a0d34e53c402714e49808bb0ab0febe0d4d665f44527a84f7d5c0c5972b488102a02080a7ed4735cc50d8edd1156320ba2163b8841df0ba79c33c0ad0aae5a3f0921fd136544eda24823e2f6d4f0edc0013f65c6e93234cc6408ddb91942e0cf332cb79bb3a024f1591a302865b82de7d96c070ab1189c5876138991b2595c706217b3ef495c7d5625b4dc88813d5d6d9b97dcdc4d61567299fb0bf5f5acefb8d4c095e5134368b7b32e7d966144d0a8e9ef133bae11f50c3f59fa936a90e4aa788b6944f74f9527f673c08815c586d7eb08424ea3a95ec1e4ab5cc1caf12c54df2856565420568009d3e36b2ea3d38374b6f22cc2fa859a20f1b08aaaf729008412b195d558f08fa6b3ac5e92f115fdac746e7365d08b3da9f9e6abce1f02b5fa10fe70a8243b33cd6653d96586d430e7a171ce1c8a2e6e080ffc1c09c4e4baf5405889ca78e125364ca968154f29228bd162b2ad2b701cd22ca987d362ee142900ff6c06cc53077f1a20ad4b7471cabf37a4fb9e8fbb726fc91a37c2cd063d7213f812d12b817d6055504f5c230127862c5951e91cb303192501c33fc973dc056dbee1581e107c8cee477cae73baf6b3a5ead10b7a6056b81e34580593c8fa6aca611f685942c433781e837210caed7a39eaf58c7984488ae146b163ab45c93531bb3bab3528aad3522b7d909b381c22c2dbd98a0f0e329791b38f0c532dd837829e88b232e825b7778e83702b4a3317f850568ac19ff2ac6e18e644e4b904836675a3054dfcc27f2ad56904832eccedc2288de8af10d8d111d6ff401b99016a34bd2b7c498c45e3777e0c1372c13772921134784899288a52d38b5a14dd89bffc346c5636bc21da37797e63a701cd5858439c4b6f2eba1722ac8becdc609da866494b5003a12527994ccd30526373eed42908dca2f27091ce50d71e57b15da1ce7f7c52784d292487ecc452d04d50ebf071c6f27cf458fb4f00888371be3e09d07361725d9a345ed02c5e62031dd0695b08e11e442882218a83e1e5c09ab13e6fd7750f312264a2c001ccf9f40991bb4c27399a182e0601fe15b6f39f01e8b050661703336bb9199e2288b0551f95009764d3f5481a634cf69200a0a0abf80699b567b98181b1af93927ce9de7729f5c9cc02ca60bec3cfef563985b7b150e07d611a20af24459b00acad5a7f8fecd0da01a0083c9eea06d2322d0fe350238856d1e711bf517f98c90f6f561faea8f155bc7881c7b9aab6ba96e2bac8157ac35135c634cb2ad4b7a4049c90e796a65f15dc2091a46d2d1f404e8a622d6fb92542ca48abc670c840a0584d2aa1ff0e7151f002539755c2c42c531b09b2eac82d1604764c682b5bfa7184a2b02ddec954580c8ff326264bf53cb7293187dabdc545fc4f0683500988d825a212b4a202d8435c2974fcaa47b28d2c4208a5e094e18722e961647d1725dd25b91cb83ea2fe823a2bc042e2b345d9b171e24f6a08cc5bac2674c04a54284c37063a782db543fbae3d8025400672cbd352f75b8df4e38b3ad38b2a7a24196e1699dcf896fd8519daf5abeffd2657808e34f577149891d3008ea8986abbaa6803b04efba7c391912cafd65b3366603c5e1308164784c0f2adc5898eb88cb1c90b04a07d755362101a90724082912212f645514ae574938bbdcc896d78fe829c8293d14fac4d3bca7632b626375842b431b14d7009f176ed4c0ddd305b0d62d6607cf39562db10ea3d4536cc276eb6dd18fb3eb0024a1bc36f619a84b3b18c26d0a0d8ca310196ab2d7369b297923ecad96e65cbb4cfce2d904386343138e959f95e634e8c566ed8d6d9d747bdfc707a2e009d3bb8df0a83e332ae1819fd8db20d9b41ef0ce00c0c4dd201e7d7a553d1ee73fae2841aaa59dc96d8a89772c06459415f4292efc7075fda0b2fff28803d43f40610997412ea2b1171b436cc9abea33c903a57ffc052074064ea6a74aca5399f64a88eb31144be2089ef1a294e978d4986e874929cda0f8006697acc83034e19cb7136d8432a34f19ab64534d3990f183f764d6f9c0aca3f121cde876a6b196e4584f143e7cacd14fddadbd173125a6f39013ad9daa5dbcb205a10371738e4a29099efb30fb514bf39ad3f89eb6d580929419e5f194c9c6839db30da9f1fb5b249b807b75bb5acaf03660cd71e1916158452dad6a0754ed57cd326b061f16179fb5076574ade8b3b470f752e3f06618170b363f3e5a13cf74378a70779a83b066a0f16c59a2e29fc218b88133ec69c2d949c5fc6ee1c5fbc4d6d29fbe8caf755f0a77f3e1e78e1be4990ec0efa3bc7dc71517b37021fa6ac86809dd1ba05e79fcdd1bccb1bd965c7d08a1be948b94e17f305db20bf2fbfe7101592a9652fd928f9a01e0d8c7c32befc2323757d1fa42ee320c1183880461561c55096f69e90b7c03439db621d8aef530193ea7e756c80feceaa7c1ba989097f021ed1e72a062e981f2d4c19e376b0bf9c5bed5b3c7a0be6f4ecb18390f9db0cf02cd1471e1c32d37e56d4554356d6400f33df18e5891f7f743977de3299f8c58473f822df026648146270ab7bd92fe5023e0851b5a32c12f7b68ea76a7876d68dac8ff33239c21b38ab4f1621b2f51ec19c9f38385617655a4ea9bf2bb1f1bb5b2c821f2a5e946715c0752faea09bda0b77c38d040bb16b0586a6851eefac5c5518cb9d2688d21a343cd0f5e557ba5b3ad8d27e68eef7b31d9c75647c53619391a93e2c595b9651d9bd2e5ed4c09afcffdf1086aca4c63c73142ab08c921d650379e479338d93632dba6d9d464a103a20ef8d023e26196ff0644b02b0dd3ea03aa505f87af1a0accf33a9b0cfd4db4814000ac38c971122a016ef5666b373ee75919d48fe5dc2415ea42fceab2b695f1651da0847b40baa0037c4cf715c336123022402ea28db064b0d6e165182de343035df7c844f62ca3a64fe9e5181160937329b0a3bfefc58511ecf70541f2d78053d13c77c8f9b06a9d1ce9dda69204414bf42a504e2d343028a14f3b03f7148c076109b55f78f0b2b811fbf13b8bca02388822b0c2303a73d1434eb8f26905e8da38f0a5922fde395f1506563b2c2d02e4fb3bbad76113a46bdd0d164dbc06a096b6c035026db4702327ba47de9104d6c18706216e6ce898abf75f42c32bddbd12271f091f17c377793cfa89a9056cf61374233e72913a67c2ac4e8e373e01c299ca450f8b4eebc871eb6962428e58280d7339348d4c9e1f6fd09b6cb6a0217f7bb3274a20bb855cc4cd874de91541b72d8828acb6460b9fd6c0c0c975756e88d47ae1bf3d82df99989c011c2a432a2d7cec01f9e248e620f98d2b28b895914d4f23de5da09a035e26209811677e1081f43865085a1e14e429569d83409745085925bee0808c032dc79da7a5b0d95560eae8745d1e9dd0fae732fdb1132cd004af2968154ec7841ce98b5be88cfbd0e3cd700ceb40795b9d0c19baf77cd7a331c9326ed77ada491aa57e8a63069c039603b7c0498aaa2b38e3758fdf6247e551e744903c97d095d4fa3d9545d467326861b63fb0a0729dca9fd6f88fc35f617919657cc12125920812a8a23707a8716613e60fdf59c46768e99afa9a6da58067f8469a3f8a1a6dfcaee2b14d0916bc219712903c75f4c6b965ba519d7168886582ccbf58835f75b1455f301aadcceff582e77ce8a2b82e90b38e4eab4e3d21691c5e032c59b3af0401627f5788b50e654959548109d48643de4f514b7c1e93ab44d1746fa4b5afb3e9c2ee41636f894aca81c94991b6f27445b41643ee6bb4ab9825f76783f21d45aa7314922126967f12ce2c9a829024b3a2c91aa3372e4fe0d8738cdc441ea77c1425fb0af658c0b8648388df481922fbd18df8308f0f2d89d2c1150e012926da783e5f37256e9090da64b71e909b395859f706d6b4a23ea97e28e3a8fb4d847823412c734391a1aaa217b3148226798ef1708f6ec9ca5f96431798f5db1c38cc0be4fe8add17f231fb37ca188bb62627285c8871bf199121a0374a6bbea912b0c3525a38ae72d1452e3bb3fd45efc13442cf220e43406f6e984a97636f567960137d288c1ee56476579842d6df4d00a02360a874bac5501cbb69d1e31cbc8d518c35c0eff8de2005d26afe64a81860d0812795a02a77504c04a2acbb34b65bc913746c8c75806bfc7339c893a3a1a5363bfa567e1ef621469ec044c2bcfd0137e49660c663263d2862cdc6f281dc3419d06c905c5b52dc130d6dcbc95f57029e5266f6dbcdf30db08fca995c504d4853ae43987d68571971841fe389c1fec94906420708d84449fb045f9a8e3d5a58fbf242395b2a319b2c928bacd990780a66f91060ada6e678fad2099dd65cb0a4e11f3bad420ee753ca0de6fc7556ec6acba30d40cc2ffa7c23d0b41d401fdde0515b8a1d1ae01d9bcc3544ae32785800df5f706bccb63a9040640d19660a70e4a3f27f41eebc727fddf1c2fcd5a3b5b957932c7f12f2d635d52b2f5d3f464067072edf6506807d580e42ebe23c276d00fd99147037282a5b4a064e1fa225b790cf5dd5e651a5b9f1a1ca66ebebff8f502da4f4883da1d6b004edfb0d04fc700a16678dec53b0751025280b77264de60f8404a4003c5a6c46abd5e7fdc992ec70014596769bbcc3f0e2017151d169951d506691472e9a00617940a9bfffd255a06f36401b54477cce40429d0cd75b0b2ea9429b4415e6aa6d89ef56626af902da3e9ebbbc9963d1f348543907df82ac307a698aeedab746cc292216a5741df8e283dade90b443a4371978105cbdf9d2292f6ad695083f9de6472bca4b07c300359579bc3adeb80370db3ba63060665258036aeab1996c2f9d1d43a56fd35bed1b97cb26cca48f150c69c9f26109de8654eeb84d7e91dfd58f983fa13a998135e150b19847b35545171a7f68db1351597868ecf4025a7a0aa5280b907e3cf07f07d01bc48123877e50c0fc4cfe847dce0735f0182e60ada9be06f46e9c6add7328734a5c51258914f2960a3c06a211815fed62e757389e76090cabc41fd17fd11709b05a9cc82ed53191bf21e428e02eb97b42ce2f1eee17e34ccc19a3d0175744ea41f6246b6d53bdec4aba52c8776c787b19a97e2304e8d939829c4ccb2b86fa8c9b30b9ca4517ddcfacfa11422adc975657764d1eae9f67c848b312a7da86242583fd1441fc8a48e7a95495a72e3de8f60b2c0108c1cfb40c6636328d21fa372ccdb53c730b93da1c6c56ea0fa586c77c07a5af50d03e192b6c9eb7b56dfad42e66065642a76e56eddfc2b4beecf964a1fc20897bd7d2815b7af682fcad08e5eaad68267d84b2b6efd9cc87c095a54220cb1acee42a920360a7a913ac5a59e8871699ee61cb1d1c815f1f312ac9840ffba2c3756c2b06150e54421c008ca5445fff8378495160644d82c85e00b704bde8f0b6aa11cfbc0ded259f2289684cb8a930818b2bc37ab0878f0574188c6526577161412705b6621dca599bebdf40cad6e3bc4956f3cde1f935ee5acdb5f80ff78666032e5846046200e7b66848617b9fe94c9c3bb7cb99b13d9df3a6dd33a1fc3f18b060f3964e4f64dab5e5b979810d851b15eb448e46c5b6088360316d3415bdc9d9a80687c8c53e0864c5e44c725d1162c52e2187cd0554d3b820b918c3642a548ccd22f1460f55afe791b1c4b2bd0615e56ed7d1eed834a36e1de8dadbd63e7d62110fd4f15d8f454ebc31b2bc1703e3f90bfda3af7f93f93ed71e9906a386838493669fa19271f665ea89883dc96835b9d4af59e67db7631c41b5ab55f55accedad0c97e1be92f2b3119e469d039dc98aa2b077ac1c3b910868c2448d48928b66e3a73078d9bf7cd407c4203627ac599c294eb2cdcdba6f29faa11e4406dde5932e69e323ba1fec3667fca7601336c41669be42ef1d04b32073c17ce4e379feb635d5e416a4f0f01cc934dc26f199506bdf5507d5f919eb6e6c9f1c4f679c9aeae7aff8c44862bdf9eab73637a54d8b474aa3db84692d29b3c596e73746e19752d53f4f90cfbc1458b5edbf0f1f398c22016692bf1263ea9f79f0e15ce7734d03468559ba798c391822a0cb0a77d09f440fa5056a7d0508fa170f4015afe32226cee9105c68e0f925bd27a444069118ce947b5a07aeb577f7ce3f0193fdb4a4390b9fdd098f285406018d9e011e60e065e460a37ed460e408ae8573847d8dce9e97d11c0a9375d1482cc1529fabb003bceb063697c07256c9432df4f638644e3136e80abbfdf42d8c6c96ed33f640a79438c18f17454f3f51fe908830287e9b90dec8137ed25d0b7ec098d4f6b33229455707a30a1191401ceed7d44edf7264f820b7c91e67adf6478c1b5ddba1cd27d88c17de1fd67ddf3ad086e60392927f6b9499413a59a6a4a95d0071e0beb6294fe7e7f7b3faf797e5961e2adc6aac24fa42855cdb4fb6cb6383469a1d9b5b0fb95fe1caf09dd6a3dbdede4c0143337bf5ec2c60ad8958dcf82544eeb5932ec238a01604047dbe649021e6dc7b34ced91e04300299a6ada995ec654cb3a933549eafd0f09cbf28f40db7118928c03e806845f32dcffcfd094032d44cd4e6b810dac905258594399c115d10ba401e8c179366b35e7db316f6625fbe7faec0fb15e7c653291e7c1a0afdb2fd62e6f1b70a35cece9307ab268cf00f46c473ea1cc94fb95f771a3fa75cf03ce2d56a90e1298feaea25bd7f41509887ebb449e6def95327d6db66beb3b74bc3e8606dfefcf6dd34f09dff7d8f3e72e52ee791bdf5e7cdff7cd804d5a70bd5f8b04f048067a9f05ac5688afb47f8890a3a16e3d79dffea05e6b0bb0c0cff1ae1fbffbb9906b839f77c1372848809d0d60ff0eb109cb04031b867ed81344399d72d071f47a585ce6752cf52400403af8713d2e8461029da043abf0779490eb545595c11008d25505e6a22140b31a3628deabd8c78f39fd0297152aa7e0a1609e28ba20f659c73b71e99d15a4a503be3f4e97e7e1681483861d811ce29158d67665299a2544e8b9e96191789afde0e38f6431c7c3f46d0487366cd24a7843c7f2a0a090412e4abe391e3b36a4770b66568a12624f0565adf24f085f26fb9f994822878a388c2cc5490f9d52aaaefd675bf314ff93b7e51fea85e2cdaccf0c531029d036722adb03d798aaf737615b75e1a9be9ca2c6327ffa403ff2992420d979ba79306a91a923dfd52a8c145da12c35204104c6e556451146fb93cd32ee9482b57b8d08b08dda237dfc064052a1844faf375890b60c09cfbb2e508c479c5c5cbede9519aa21156b167301d6836df56c4f8806ee80289b3daf6d8acf7d200bdde239a58b8cf256e9149783b7b8612db6b8b39d32234c2fd7d1fa84418627b6ae4cec8cfa70e183afb55b0f2be06543e3b7b1c5a41b0a560c11980e3ddb7acb7299e164c0b72b6f74a43ecdf7696c1bf816e6c1e1f545c4a1b11c6aa67ec6a0557fafd0e43ee150bffcab0aeb2df17e380735c25c344bff74c8806eb556c75282da7fae0c30b62babddcc51684352b1136ec8ef5ecd69e21260d159186b83da81dccccf42d96bf0f1a42dfe48c6632319449217a832fec973b4b368c42f5e4b6a7bc703203b0372df104f6fba38769ac0d736535f89765affbd3c5a3e6a5eec30f99bd89dbf10a305985e58f59725c00b88f8af108548fe7411eb58339fa2365ffaef703b5f47e8bd2c4b336c4c0601b8e790d4218b1079dcace49a395efd4c557704176a3f86b2cb8ff4029787a8f61c641d35b9d9e42073f3a24362969458f481f69f9fa22b9c884017850d6d49a5cc5cd817df18a2ca7aaf38e7e793901c9e265c4b5813fdfff973ecd3049b89c37535ad1848e74a2368934e7206b778c5688acfb73c35a9f3942044b4e3211eb2bcf2b376b719f69de60ca7868b478b7c56d3daaaa1b24294db5917be0413f6ef07609e2127d780cc095b90bb34bdc7eef6009405d41889f179454554836455a112b0e739fd660c79a9751feb57479f8323405485e6bc8ba34ad147d26cc44baa501af848ccba3ad6dc56ee2ab02aaa93df6a1588e61db6d5c2b628835deba255c1a9842af465f0863f7469cb3138caad750918a4ce96d5b68a9659540dcfc573e02500e8382bd444d09a292eb4754d8debc7912c348b66d652a268b313842e7b1049ea658143f003f08d4ae5ed0335c1afa1a13fae8f583914fcaebb2b97a431022967720c2e740bf003194ada123638c80883f4d7f4394d07e3367ad1b8add6b115351cdb44639c706dfa54d097c96e6200bde14cba3c15ae5c8207b65cf28d096c379f841762275808a8f5c2d42ac6e12e13dce197811d5dc208e34a6fc42cb80ed6f818e315a3caff03eff94dba9cc7b5721d968452df743355790ea95df3c4749c071ec3f1dd39cb0c72e7c29f2e9b7f7714fd605a024c57363796c83f36cd40bf392b4e64b4a084e6023a9b62de160fe9e21a779167762d6d4acd84e095684974a8e23eee655604bd1b8e36b73a304ec36feca210f233710c84e7950c0c97924b6623391e4825a7c786c0d0000fbece2f11e3ad05378b551e172b9771899096a8686fe0e28a423c3870612fd4feecb5e35e1e84faa9d6765c78a219c4ce3264dfb1c486856e627c544957e3a7b76adb8a2650e70ab10e631e102258a92d5b3b0149c3b34d0353b99df2b783f156cc9bfe62b5026c28255ca3a2e4504ea0d5afcbb62d6e6846247b51c61343a9996386df28a149867a2f67078c9c12312485f71e8f73d33ad81128193b41bb7568c045c713d2da3264ba43a436a29e27f359df1baa4cb327b3cdec952ebd97a3448ff482e63c738e9488551336e70300f7b4af198cfb78a20e03a8cff7ca79d0b6bb0f942edd76a63d33ccd9b0c9c99669c76e837073bc34289a45fd2da77d35fcf642630d61e51d4eb7d996f15aa95809108ce22c2da5e2733e45cfb48e1a6f340d6cbcacafcece001c29dad36f546e6deb99994870ba4c33331262a6aff1e53cbf6af263a6ea363edddf140cacdc0a4fb48ed16a8c0a189e51576e9dbf7c1ba39f9c0c2f95f5074ac27f3527439de162dfb7cc476cd78cd1fcca2a3fb86c047c4c1760e927a36a36964f7c495244b175f24c687589438b456a221e1a44d17b82691b640c4897010e8ad17af9499533a4b5027f0d4493a849d78a2c2a23a6498b6e32070313a74128dd7866080d42181edcfdfb2357a508c430e0ff4e8406c0b40db15cb1e9163e02a01597a1385dc157de44a2d0bea3e87e1248233b10320c5c9e50985bc95a9064a171fa526beb84700bf636586028de38bfdc6e7253e216250d12a3f29dc4b1ae9961bb5224597a5d83660ec997fdff5e696f8c954e0c55c430339d092ebd59b00a73eab89813ad12dba834d526069644a4fa9d1dc61bd160a9d23d884b37e702eda2ba5c916ce614d6a3dc5b88fb08cb6cb9dc4979e62e571ab84361376290d8a29cc41c558b294a152344948579e7b71685e35cb72f8d0797329414061fffc04c1f00b0d0d469a593da077107ff175b477ca5fa164d74b935f72aab2082616a1353a961055c7a68acfe3b117fd5c97dd397a1cef31b7c3a293a29939b0ed74eecefa16c59664f2c6b1ca14687161a1ac6b53fd020bad86016c499f391dfc40ffc4475d63be7013f196509ba3b8757f9fd844a3eba245e8de51c77a4b3c04ce4d241d771661b9155fb3882ab135901a712909b22161358c532ed14eef9e411907cced8e099f44e333d053d72323aecec0db39822b1e173ae9f940932dc2131a4092db728d6e1b8cb3b3a25aa3a8299e0e06a6a5d4716277ccf58df23d98d85e9a1baaf4d20a45355a9bfd7d8408127b75130fb096bd8ffe19d58a6a8cb83e5cd411ebec32dbdcd990c6ec53e8c3fbe10e41ce1a6671ec23a1fed705506a33c7f10ee40a43868ae1d20c0f2dc09de2371dc6368afeb05fa2b894e4dfc23b38bffbc7aefb3a34e9d99ff39f7612dd93e80b4da01c8f2e3cd5cb52018ee3b0621f3c319ec37738f4890a95e20fc755e4dd50e8beb60d2f9f86f034d9f5982c4a01587aad68cfaab1128581e2a761ad422ca082540fc27681bd7292ab01cee7da1e8f7053c9fcf039595f4258513522d7642593d90a38ed8bcc7464f0d4a7e16f01322e881c6590d5ad8b76fdda82e64ec283770f0707a75032d7a14c74dacb0dabbdde355c8213fbdce4007966277ec7bbf38c431219c1dcfffc92f09cdd486c0d8125ae4842f77a972287f3bbe4585819f097f8bc92700fc64c23ca615bcffce620ced129c223eb4510d5e43cf5d8f3d09fe968da43403b319b883c2ec8fe71810e47b4122a35353cad42c3c107f972491806c50dc3b405b949622af078dc7e598891764e07f6631e020577c41375c5c23fd01eb67ae7f83487692d0e31a9d411714ef99b839fe078f33e8c5659434c7a1f8d8b59132d63ec93d8a935edac8fc9088f957fdd901ca5ac30e1fc46484563c12f98ad6ea85ba2ce9e242ef4fdebe535e698f9fc3309f23701edb7e2df8868a324484dd9efeb42a27a118c41f79a745884199ff432b0f62f0b4d0eb1920066d663ca6e238c100e6953f3857b90a55acd02b0956de3162e649b240d01bee2280464cf8b7c5dcf4e356f7320e8786628cd73d863a23162dab36131c2c8c6419883d1f04a1a445d3026a183762423a6057459484168c113bbd27bb92814e050ffc55f2fbac00916da6474c647d8d075a02a679eb5a99c3d9e1b4b493bb363fae6183d016107565d6e7135e191b582894ef2f70e19df444d6bc4343c389da27ac72c80ec66f8cef0931b5c81e7119b03fa6ec692d126fc24c97a6ca97e0b95dabd42d41cc3922bc3dd7437fd55a2d6501034a65181319b78af61192c1611704ec1018915a23027bc018bf4b20bbd4c8f445c40aadd926fb5e85f46beb003bd51e9649623b3d54776ff5215a2ae974b66e6f1ab2af3068480bc075d6d0683742e1cc3aa0f5c4df5dd0adc9be78232f25bf5d56574145adb0d942e1c6ae52776f270797c33f65dbb5b7044e1b86585e5361991fbb27a409c5502be941f2d1306de3ea69cead92d6c026fc6cf9c9b194098db4a273c6e4f8973a7065e137e38244ea348da3f67195eb86b570541add84510259dd8fccb4635ff5b450ee64739bbcd057cb1a23c3619086477c38d5ab178c20004acd416a7d93b0f449619a96a3896e79f586716c37221c5012826dc6ce821a26aa096b45bc95aa5ad17942304ed323cef6ea71d254e9bbb378966eef23e1f9403ac99b835fea3e15b23be21c8c19b5cafc0a557db9b2c1efa9974120f34a995e7d0d62e41122b68521868d912dc8186849ae6a0a8173bf716f6fea4e22b567a501328442e078fcc64e99d21d56a6133898e9dc1e28534318c8046b7c6147f31aee2d4da7d45607a705240d4674052e54a4e0c610f2786ab86070605c7004ce4374a57904e3d31c115c165820947eeaacfc735b6dc4040e1a6e6de66311091683ab09078b50a96b0c290f1214cac1ff6d3aff0a4db233032e759b7857b7d99b04298291ee0499b47a4463740ee5767e7090935830d3b9702f1b710090bc0b6b7b017838c74a6aa2582c8aeae6808cbaf041c4e613592f938f1d34df5e212f1031171f1f6793993da248deac0f6f7b7841d01c44d9e2dfab611f78248af6e2872967772b56c7a7cdf1b247f26c9dc998e8d40bfce8f6aace2d45c14ebd8a0ecc887cb433764bea80c73722f45ad3089d688884e6a0f990e2d12149b79bf5c25c2483155a166d7becd884c39b0d3d7ba1dc40305e50d45e913a00153992e5d2c727c6ca95afa884178f732485694582ae3842c253784c102cdadf0d3cd258d80aa4d6bd653be10fac7223df09ed0282d440ff808f9fa4c32464bb610fe887a8d1e4fe662e3a277e1e61a0ad3417b5ac6f4e8d9333152801a06b46d0391ae072baefd8a0ed33f4e5ee4a8ca41426a61ebfaf26072d08c2c60dd8fe83a4725e996519014b8266ee1059383876c4a7ffd3468f509f3e82b1672cb392617f0be3fcd0b158fd443d9e3322b4737c8e48811b6fc37bce299b2154c0f0f0258efa89fbe79b1cbc0465bd5cd4d20baaa07307cae3234d281ac9b09d8c105a8465963861818d280b6a9d1e502e31eca8ae30c427627eb99bf7bde688dadb5e284552c6c96241406161b406022956887b4f6015a60333716fcb4a77d1685c7d32c08cb9b221f5a147a462d096eeaaddbbd08a2f083c357a112d93886e81b38966e769216200ae07add5661edc9ad29e709e1d6fbdd08f5b5d68d2f6e64a5a6f59121b5237c63284792114eeee781356f6d04736be565a8534bc5942dcc8d6a8515883944a950fb18953c74ee4dd0f31cfcf16845ab49ffa715d6960601779c689d2ee24f80060b8b4301eeb766fdba0d5ca22ca6afc811ce2f70fa6e0b337008ad13a1400f47d4aa1698bc0de4a99580dae2098441ac60082940c33a205ec94b6b80390162618aff5b7d553a7ec60b9437c092ba57852a18e45defd962f016726b1226ebca09a3c622f368707eac820438a73981a745f2049ce4c332edce2a44860235016477893def48defc56fa6f245417cc55b168b41d6d1eba62f9a79e889de4a9420c1aa8bbfb628c238bd3749bf26fa52348d70d7daa9f56a9a1bf21af9da5625693ae1e4554e8d72314de0c381b742d750ed03411d81382ea0bb02c073e1b0a4c130838b30e5b3d58efd12e318bccb8df8237c6401f3073b0967c790e9982bfea422966b03e09fe9fb22ec238e947fa8c2c4c5e065e51bf09107f9eaf53034faccae4681df94c5ff00249f40b63ee18fe1fd1d1420d82a2943853a2a6f79df284b49f1381ec534248885ce8b15f8e5e30393aba82f584d9f9250ec36a28b1792fe276c0d0ae483d7dbbcb99e01185d48963c02081a59547caa3c6cdb5d4f40e56288ca46435ece23f37ab9b46193c8d2db37b0276ddc68a0c9b8d2d4d7912f2453c7de775322a4f6a50388c3c650749a4c775b489612d00677261afad697dd1a809ec6f58df1610f1e654d90c99480896a014b720e1b9454da8a5ebf0ccb3c699902aef67094c3f598516cb4a6749969bc857ee6b2890a1a98faafcaa3d6fa5ce3b36fc3450f8b4c6dfe05e0857c34ed043fac807b42cd86ca2622fa44b665245da40350040ce721db6c9832de2d3767a290571a2b5d9138853d1d75056755cf8b35c33e4b91b9f19009d8715e78a183906141c07ea26f9e3aaa0153dbfa5a394d693cf5ccbef4761c6ee12b1c06352fdabc4253c34a2d5ecb2cb9c2182567945f791114af992e4f88ef4f3def31b4736b42e423dc9f99126cb391a00c9a033df3847f87f5d36680afe00aa7dc8ee9bad28987b02b07e89186346b9077b70c3d43d30a0382dd3e13e0df963a75b5dd291175b01dd25f374f5b51c83a071649d2b97485a81aa4bfea678801f2ea5afbd5a551b4f0f6a2e96f826581c85f3e9f418aa2670717b15617247caca81bf4f218488873d62d8188a5791b2485a2dad26902ebebd46e8d76ddb46f40ab5dbb39ba0b42ed116866f9729360a847730e8de31056ff3efaad458619088648dc2d23007b0bf80ec00495f214f1dd6291e1f00124b40ac71f8a42b6a4087ad9b734e0dd53202454b3fc242049e9ec17e162b7290e9cd668d6a0df6799600a15fb0da6367400bf2ddc9b7854246b4bbb11d85fdcfff118bf8021fdb090ad73c3bf4b17e5d3404e209ef4c8de68b22d3eab71ed59826e17ed9c6e080d4ffe9af05ed814ead42055e2835b11b9d2604fd9b5e22d9e9776595e58c2bc8929061c93ac89f25198503822438ba64e1bd676f5412d7e9042d152aa91ba1b16cd26232090234cdfc87f75903af8fe5785297048a0afe1d176c84f8d5a9fafe9f219c5446ceedea90411bf7c67b90508bf0ecc63b635e3ac8bce80463a30aaa9055bcc49149b59be574c385214be44a133924c6467a7b50011270af5e59a68548408e830bb22522c1ffc244e90a9942ea1132baf1dc2f81d69723d7bdcb0ae030d45a1ffae2e49b44523ed1366bc1adf2bfe8c1681e4177f990a4dcb6c1216e420dc6ae98b65f9cd9251f665658e38d732d0ddc6d66e4f79e5c8b0cfe6177805b9893f7d3956c6f736f24bcce66cdb1093bdb81bd059dd5a619a07dd0b1a6f0ee2c4d000b7610991887dc563f1a0c3e6a48936c461db5764c1fe15b5760459ff4bb97b40ec14a12c7f73a51a5643ead55ea80ed594bb420a98c2b3469c8b3b18e6f0e502bd30c819c5e9abfde7856bc549019022b008cee08e8fbbc30b56a08a6379a9c057a3fa39472b5ce793e28eaf0545d0184c0486ea2b9ff7cfb08e54ef7cb35a0dc24165579f8daf71058d867623b6e301e7cfae7792db952029e67749a4e57c570adf7993ef0430b92afa9f607fbedbe491d21378578d3a82c14a5aebc883bbdac0872395234a0c40d0b3017790adfca886180e24b3d8eeef64da18cc75ed4bff81193a51688e1db0040238141eb5425aa3a77e9b26a9b984dd7b4f59ca701843264a01fbd08a7197797c15572418574d7d956d6f27f0f5d4a55bcd8391088fbd888b5423b4cba81515684d00ec98e041f68028df9d8b5e24560f720211dba38c70624808ba8b4155d0d07836962ccb410ac5c36664f542a6409bd0220f681e72aba68fb4228a3ae8656c9b8276dc86040e00b3201d96b89741a6c424e18f919f408a66dc0230cbfcabbbb6da59c7fdb95cfad999413174e112e98d432a7fe8355df0e62c1be6f81c48e49b751c80a820245155073e540905c2eec03b887e8a1462cc33f5e242120ddd1368ef8d2640cfa186f3f4e8deaadac608c274a586088bc2931f681ada8b94772e08e00971858e72d86feb1218c6bb2c72979d0eefb13625b6922cb7dc3f35f227f361ea281fea09cb9a7fdfe160092858058c93defa94c95d8ce79c76a2c2286bdb7a56707c582ce40fb274e4485bc84a8088c091f0143f542e1c900f21edca4977e2bd5b4878d47ccee9cd5533427fd454d60a16877dc962f6281894455db796b2d89a8e9d0dd01021805ce05a16abd27a9ece9f7aa69d69980a8cbc1f95d628b36beb2d6cce5c6dc9cd320dd4e3ae5062c43b0e680e9b748e0067f4b2776173e829ef2e25f76a447e7c4dbd40e78f9b24d4f6d73d2e12cdb966cf94f42be2f15d9fdb23ae8324aa618891d26f0cb84545e7bb7209696f4d6d85a9d5d07b4b75d79b32d9e46f62cc711966ca935207ca1c4d17141faf3791811c2d1e6976656b94ec57e243693f7518cb94da552fd56436562a59457fad35c630541720482728e6bc804723b1fa2fe1222589ea16d3b459694010177fb58c89877f5308b5302f92218d3a1e6d3f1cbb91d8e74cc53360ad6320d2079ad499ee358da566e03c229ed95b8fd03b4ebe45d7938fe91d57da522c991668c6d9573a251524ae163f0eb7efba06ce39f17ea0747e39d164c1ea422a2c299ed145ec5bc3b4d3373df4059315ae9252348285eefaa0e9256f31d0fd2ccba7c5593604f6a1e54a1dbaa427d5b2888254c78de53205b305facf8134c9129dd8b731c7ceb1799d417c7ac2e54c77b2e557e50a1a5fa9ca53bc70c5cf915c9fb232ba6de51f6242ea9163687358dc9450dd1d232b121f4456d09d0044dc830a6d06592ad9985195f02fa6a3b627322647610732f51bade881f9e7bf08ffe7365384df76d7af0db836873d0bf1722e96ff958a5d0672b77991fac685092f33402424d253efc0432bb24db7f2905defeb7f50535d163a5167e2c44bdec69d89f0759d69410b4b4d34ddff78b2fd578fec2ebffbffdd2574737b17ba8a28517f700742a6bc7f29a98b436d315479111edad1ce27a8a6f3f7ab7f4191386af2abd1f0fb9b1a3b174e07657512782875d66f2e74f9702f615123dc2a2ab240ae824f73b1776d0bfa81e7761252a8309f303e8ddf70b3cb0fbf92b9a5998ae1877d4ccf8cf2323fc894479efe4cdcb57706ea57d8529143758685ea05e4f3ee80d81ac60f716f4f05039591aa3d5534cbc9b596095d2500f146586edf4dd8c46325e3ce9c6379caf15780359264e44ff1892a6cd94d1431fc38f3ac5d4d8d2892b8e34affa182620494e39d324ebccf04ca94977c8d1989570c58a1e90d16f287bb0755da980413f328a60092265ce8f703357862813355efae8225311e1e597321f9cb4c05aee6d33c2c1cbba70c1680459910b7f7a26a319da2b1270d87ac1b81061d50ac6ae45b8209b015372946af64e1c35afee469c523d261679e06d15a1b19541a69b9b11b848abac044a8ea3439e939370c525a2b425df1a80ce7e6cb6ea0bf3ee41b97225bea891f220ac4860b96da108a4649bae339b66b064b3cbf0292ee18ed2dde95c12889f2d8625bd6ec45966bd64e20bc5159634ec936d3cc1278841c22cde3c12c81411236e4a0478a61407ec4ca128410b0a4fa46ab90d7222e9c5ae991b625405fc6326e5b6d6bd8118bbe9c203eaa046c33c61220c2da434202f723b5d03422165b08533319b21727f60e80fe8aca322d38280477371e968bcea88983cbb38848968c2fd81a44774043bd852c84b34db90908975e0882a5c2521094e9179aa6e266fca01b7c90a99bc358dcf443744a6d5c54557a8b12545d70e485336cfd885251b5ada773bc3d0abc98397a25c72feb27f5c3b4eafaca7c10862b9c32085685003c6b5486e4cf95df7aa86d5f1343c2c1d4d54dd6b3ebb4e6a444804119278eb1520d093ae5c5515134b5df36ec392ded59db0c0d44547f748278d9160d521f9e3f0896426b1c7efb2920a0a60e23dcd83e84fb6e9efcb18450fd6f1eb4d63943a5e280a6aea954d1fc28fa4357b1ee8b18116867aa7347bbe0036fcd3f20ab78785fbe8052742253f4a7aa73ef1c10af1f6a1ba64fb612f068b244e1ce1bbc12cf0d868a10493aad47c20d3982eaa3c682d1031f29c2cfe2b4675e6efceab113c9fbfa016730585406dce641570a1ee511d04941fc98c833ca303d5eb93ed2b4c0b445125b459638cbb9fa2cf38273e3e24329ceb0767cc133ff22504890e00204bc8ff489096b4e783702f161a30595669b436b660f2c049f28b662189cfc57253f703e06d3901f7b3a4225a221cfca65ef09acc67744b0914025110d6b8a4644cf7a91c1e375927678be3b349df58c5bf8587062849cae471f0dfc5d247d7d58239ee2d17a3967321eaedc0e6d928733384c10f4e2b573d2443a0c2e24ac23f5de96908691efd77a92397fa0e4aca95f96e9f87d408b87c2ceb4262a281b9a430cd06c309c2ba5feb9b2151594498b0de5b28d8b091a58b0336b107c63e7cee058ecddedbde3a6a0bf99751004ef4364428a1f895b97b8fb40a47d23b3f8da6eb7f04093a0067756ae3c74056fc2714e6d2d0413c72dece251a64bf4b3ef103b67bc09c4ea564260f683f468954e41cbf95531cc4e46e5193c0818b821af77eca5b0a9b7c7c1d25b41a07fb8ee76811e3dd80212cebd8ab0a0059e31502108da5f55e2ed049cdc49d74b0dc1219fa85a269a9671750833441b35201203a06f2829e4771dc279b6859947e1298059188ef4057b061f6e2f7cc8fff29812f0f5ec49833286ddc44a9d9c48e86c1c53a0c3538db8d4c16689071d41aaebf2bfd23fb905c61cbbdba25d8377cdb58308d67ec48082be9ca30d47895f20bfb415891b52be294351199a365716323d5ca95000873f2b36fce18dc120d840799d1f4ea71ae20e35841a6d4923ffa305a14f1cacb4889036b7e706478334629cdf0d4eb31fbbf42521c822b9c85fc5201d5196bf8d9c5b06893c948f0f2a38479baf71fd41b928d6a3231928e89d448e5411b1a371b4cc872a90eb8074934253e7247843ad3681d0e91b8dc8d3ea8169c0b25b9575e5aceaf6f80f0a067f3b573aab9d9b696d5bfcdbb2013ec084b9a1c16b98224b5b887be9dd4525c802458a377810ff213df2116f84a51745b97061b8ba741262c45766645f453ae2ea62c323ced9704c65d14a6668468ddd2123737fede108000414cb193442d4285aad5366a46f5735cf14630b25a0d85699747c94f1f5bd8cde5512d6ec410bff5c49c40a8ff541d146d420742ebde8c2368f51b864b40791d3698014431aca6f8eefa59f2b869354ade572bfa3290ec6d2f6624fd27e89be1e57292f647de17f6c636e25bc38bbde23fb4eb183985be1102358fdd5a7303c4f7182b8a60c8883290af8273ef2c84c18339dafb2e3b455e422d70bf824b11f3538a4e929e85e347dd98aaf1741cc98d3a7493cdc8a05666085732c8a58ac84864606d92257ac962a384becc55fdb98792d2c6788b37d99c9abe574806089301f5a25fda8e60471afe61b50be757f532f858c53822da6b14f9ebd5640273bb3b0a541213c16c6c525f0c1cbd8c994fc14e5af2785b2831016f960c89f2f535bad650a5aaa0df7cc5b35380ac07242b003feb85a0b149eb7e1cc616071fde0e948259edc77c26e0afb30e129a52280a4260c3df5d806a03a28686d2ff843044cbd14003d512e53277f75ef29de7569548b37f425143f75d74546aac90080548f101fd7e5416d0a787d0c04dc441f0184485e48a65075f5071b74eb5fb9b0400991c0dd7d7c12f7a305ae54af83550919881211413303e3a84036e2cbaa7c979ed7c5116dc4897c9a090f2cab16afd11cd47ebda21e0f1cac3e7f50ccf5020eef302c96fb7ea4d42e0676838b03bb2bb87090e08393eeaf089dd952237cddabb898fdf2546c3fb5172244c55605ce92615905ceb7bc0c9c4468e6500bdbbf0366d581507096be15e7b72c5ef6b5fcd78b8f7f59fcf9ae7809f2c96e55e2ed4a5b2bd5869c19cabe2d2dad942621dd56707501739471fe86271c62e428ca79e0c98c8563c83e580f5b157d30a1571eeda7cadba089c80bfcb95ce2856d4813f848baec1941dd20290fbc8803936c290aaa2f56438462cff30d0d917dfa25e8a73c1d685f857ed3240b4aa29a975a55c4238b86ce0460c87f98cc88028c024c4626fb01c507f4440603d2e1b8385ad312c7b8fda3b2977e4d79e60fe8158104853737603f5400b8bb0e64fde59bf9a858a01328203f7971645f40358ddcc0152ee1ccd8fb2a7ddb8be5eb59c143dac089522e2a93974c9f0c69a35a1052b943a93cc0d336c2e2a1e86724f91835039c57696f9b4b58f3c88383cad8e9caf349bcd548a2cc574f3b48c787a0bea22547d9ecf5b8f83ce25ffaca94e57877dad729e01b6ded97d635a421f001c7ca7f0f72eb4bcb2b30f778c2bdd9b13203d4943909b0c18c6f0abcc6a1cd986e766d9ea4c8e57c3c7acdec90494ab79e662fa1ac15a73419ac57b3ae48daf8a04649f315db3b200f535d009ff1ad709e2932bcdf04ab925fbb514917e7d93c4d7fde22c62280ce0f21e10d9136087ea49c31877e169eb43c9eba8ce9a5176d2d528eb726fda602c4c30e07b0bb3e54e00f2f7e00fe7eea43042627b85c5a352d520acf3c320fef29159f7facdca47ea75bc82c1263fcde08553e3aeaa00aeb98fe4e81dedf80600ef0a23ef3eda924828f19c4c0c5877d58b4320b541a0b32c5b7cecc6138160c705b061e8d6af8f481aeac518eafc00091900310405f8b8a18fb46034c784b0ccf71dfe9292153336958556890f287d59cc22cacd71073147776815f8de615ea4b07126a47f94ba0399f7900fbc799ec7e709c5f355034861cb29dd29cfd36a6fa03039acb064e23c8445c64eb8070fcb0c5631658b685ded44605e80fadc594a4eadc15b198479733af5b9ff3b896f7fe4a731d9a090630df8f6940889e29f3534680d0ad9c101b90b2ecb6a7038c84c8ed8e26035f82c61aefa51d6b407229ef3b017dd1a72031cb176554f5100cd89e6cb69dec68fae5d651cea4de44ba2c3df673c22a6a4baa3861cbc9e2acee22c31f789a4a1c2492e5f3af498714016f9e6a946060aa02762619725cffeadd1f84cf0ea52be70c09315782df9d30065744cac6294d4e18c5cc7cdb09cac949d4637dba8f51aa90bba9a8a12c7f64a6b4f44a82d0ed60a2446135ba44030b7397e061d8588b6d45cce1be33730e3aa87918b55171c2609c22372868a2c05e460143bc00e45d58233de5aabd554a300577e7aff90b94b919c07fc91a2d937e7ffc539e168926a2fead1c693e34f6cc18d1d4df693f3e2eb2af7362b5c4f2da61c8a4238cd14e9be09da8b6c9b5a726e687017f3c96584abb79dd97fb1e7d3fcd1c32fe6418e4f211ec432608d2e38b3b8ec3f192ad02ec99995f81afc8c5f818730fb2e4c783b9109649de3e9f79bed41bec50895d4e56e1e2fbe717555b668a827c8637113c353bfe1c62ef791904f78dc710be83fd068774c4d5d5bf617c861d2a8759ca443f09820351eb7304598d1321ab3f18327cba7de5d9519dae4ce814a23d91d5b5a856ae70614ecc8d2fd73de127976be8f92be8fdf45acf1719402f5c4eb7811094ae196a5d786de09f00b23c6a72b5dd6c4027b866b246893bb208f6cc26d7be1928c36a199a4cfd3b157ddef32b4ad5bc2f9e26f44ae43f73edb79f556706e51016645b68eab7c800972e3394ce7377db9633258b82fdf336c8bd3a88d22044d8ad623e2ca6891e1a156fe8dfbaebe7158690f7a046411e8cda03cef95c4fed5e08ab5c2b74d9e4161343a8a2d8ebc26f184b70e5b68d532fbdef8cb83cbfd1f1e5d5cbace98c801323e4cd40e7e63c3de1d600ff02a1bc50cb9560e6d79669f1a8a58f6dd61498681ffed2f9bd9d87573a8d3397dc68df5296973674f5715cf7657e0c9bf5fe9b3e9843406d2d01d5d45afb7a9b2e779c862ae929444b4d35331089b608c17d3acf02b3bcecd81e1a3acc43b3f75b27115bbb2b1f4c6ee84c23e72f05870d7bb74bbfa53cf338c2699292bb33d574e3225489852e235489c52ed1d99ebbf8fb0b59c7645629e74f7a942b19b6ecf40ea20b2bd3303fe48a78ace9683a68d54d4807f6c59a2ae64b11a18ce6d7e9d54b5b01044fd2e32bdfd7e292d75ed8c3e70b97927d03ceb0aafe531f2c2b35655be2508ea60976fe9f137cf4592d3faae62f9a7c94257b7a3e786fb8b5704ca96ea34205f664db4cdab859f14647ce14219422a26ed3a287879234492b275fe629b72c895e38b081cad431a06105226b06e36b17e42d485baed431d2412c3616114c0e7d2a71515f6fb0f49b44ed89358557fd16f974cff249510476744bac49014b579eb57451a8aa181b7c25d597612629be1320879756139ef98ecc17ef896060a46f7ce19d322bcfceb78de3666615ed7c9d123c6ed47f188b4402c256f7c311a40417bf665bfc5fe82df2070678b2ac008c970dd2b112c10413d3a67456c76c24d6e18c5c390a53fea5872f137deb12c2eb303f93f0c3fe3de46c4228aa119ec9b82e498c5b2d6f30c3112dab301e2b8157c4f84712406f5eb5d14624ed006f3a9e940899930b7de24a0e9e419b7dadcd79fa677d3f64a0feb7e058521fe36d86164551307c045162727a5f6923df40246e70437a611aea7db6ad67024e3bea4583febb2dd0aac181ce845169144bbc0a775f72530fe5f34db86908acdd3fbd3b297c2fd79df7694e81164c432e3a8e953a80a423814aaf8925d25b6e106c21762c500afadadcf654d157c9c76c229859b6155e7e5892f16e51ee093b6f447515bc62d7f5bdfeb594113905d2fea6583ac361dd8528141e4d00f6dfa85ca9d35feac4baeabbae6b06a677e83f8f631b7426556f386ebd18328b6c3c14b1f903912cd41c16a966cfb30793ddb509e1c989156247814ed0d30095010e36129be243059cb2a7d82a0d2236f05a7fbd70ce15398e1b06a716cb31f1835480ed463fb1e422ba05329c73d7f01e532438776ee4af2b8396b214735a20bd380ade09c3febb515cfbe9565749e00ab66651edaeaa1ef3439ec7768289d0410c587a482b513fb073c60de1fc4a3716951a3d62f14f7b6506eb82d0d9d4e2ab9abfaa90091b77e03a3183d5cae89062ba57dd2d162bbf67908d267718240b87951d582a269e991b595ede9acd9e58b7bcfd2c5c36fb1b51eb1e5bd4824bac297bd794d23ba81bd9ab070c38554963e4aa185c80c762763d340c674be8999421d731a6eeb69d8b9e64eddd6abc1d2856e5f7f4946f9b70df49c1ec5add59ee0c9f115d9061b83a1117975e071f5f3f1e5a37be34ea6eedc434ee6e4572feb6cb2db4cda0fd45e355c81755383aa0c257403f53c1508c1938949989a6605e6293f840049f5c8f2106c57238801117960cf12af04e4c42ee7093b7a538d3d15705748f03ee7aef82f6165fdf414a2d9885c785e3736898165e150cc1ab60fdcec56a19667be2da60cb86a53b1561a5ef3087e6235524ee3863d0a252cf39c1ab1d1cd7d2a352d1bcd723c7211205dcedf228bd65e4c4bcb4537bc8d43827ba96eefeb0d273bd208f10d7883927c283b554a53770702e776f85ad812aadb0d6d40758e02a456cc4bb7fec9f640a39c8360117d6754a3333e01aea28cb8c135d85848310cb523e0c185354f974cc11cee73e614462267f92a33101cee19f5b558152c0a63d2735a7c024485a7af7ab556a34e3043736b45509a662d5a02e8ff9912b20826d299205e41db0541d3c74d1541f8464093bce9b0e7d44840724d44878b1841795835b6c50a865468d622db3140cd392be96656a887676854e94538f9695db79498fc36f9df4fc15a9333277dfee43e84a7e690b3b90639d6dc282464f9d1896a49819b5d30527d075489674dc7e1f64a7145caa6222a45d37eddaf94a7a4c3cee28d85f674e189468b2ab88a8ce33c96c46c9c7c14a562836260bbb8cb1ce8c8f931eea4c408a4add3a6b244c81be0f920d07edb53fd32feca32efbd55fab0d8e69f41b8204d0d09090746d126ab6e3ccc159ff0ac101d9eec3da912f893a89a71a2cf194da4851466fff016c956a72a9609c4d7bd0eb67078c0910d5913fe27001b315abe160d2942fda4cebbbf94929b8b7b033f71f7abdc9286013ae1b9f66a226d48b35c13b6550af609708285fbb45768b8c4dba2528e0e735133b502f59486980182750887229e935bbb49c58422512cc397efb59a747bc3288fe40d4b9436d8735fb3d72eb19af81b1dd908b132eb2ea0329a97b0294ca4a5e361342d6a45b44d41c7ee4d2e3f08bf477eac87a8173de91a4acc17693cc61b94ac5d5c0c1ce1395e4af8ea4677d4ef8b6228a9712c8e4d241c1cd21cfa3c77ad4b3ff4611b06633897d701c6d4010e7a2a3b7cb2ce45256f23ae21c53916c866aa3ebd49a563e684c65640a5abf3ef2e540c46032e2098cd8050dcaaf08a38846df8404ea617ada62b85f5c3bc46a30cf0f9c4aeb680399a9d71f3d764ede53a4565d4cf2ede1a96e4badc4dc71437a5114b272ac73ee17c90e3b8bf6a6b6d407d05dea355ac6db51483b1b8eaeaa84adf2bc0e77a49e2ef462248a04cd0f72e605ee2b54a21ebd8ca0fc5567f241db30def821fd8831f789fa636685fed87a9fa00833e8e60aa29281473348401edb61e92a11fabb25c7310f94a1f519e73cad636b7911324592db4b2967538595f6468943ae2d941278e8f91f00d705258b7d0ff7ef6fcea3860cd032fc842771d653a6e5f8e8150f8644ab36227fe27c3728868acd5f38f7ae2ed3239143313ad338c623402b5d7a9414a5bc9dc4742b0657af50107aa451b3eae9e194628448ced0a0c8d470950f4e1b4bcf73d3422ef90b313596405efda8bba54e43969877387f74f994345746199e4894594a3161e9095ff192c3769a4176cb880b89b677315691223f369171527e7bab444d39ef5b5d164648ccbaa2007cabdb991d98b7c93b350b0fdda6b31c211dfa0533300b80a32fd43e2d8c9b1af0d73d3fa516ab8bdd32ba4dc1edff8a6fc4bdaa9536302a53c3ffe18cf5a2ed0e029e0ed7e8de59899eb6c9b748e27dbbf3d455f59784d9892493b89b3f0aac5ca75f193eac6c2e2f8b3cfb29324b48abade8b3c8efd255aa344b6d2063c69ca29917829d7182ac061bd888c002ef7fe9e0ba9e99ca29584c1c874eb72480f2e33c8b12a12cd2c2c2dc07cd95e2a1289633a5a5262c87a783c4d984b6d2058e87a8355a9ae8ccfc47675466b41d75d037680413650633a1690a57c54c96169788b19a09b18805b2e1085dd74622ad4f7ea8ce38a50ac554bc89a229c2b23b609a53b9f692c33ed5837b6711deb3e89ba8464e1126d7fc1188b0dc9b197ddaa6e946db9a8fdccf4d9ba0343b93e5bf6f14a31783bc543c0efbe4200f4f50c0ba16542ae51c445222891dfe946a172c451af241829748b0fe3c5f9bd7514c45679188ed51b29564b66a5b1abbd657423e4cac52ed9854b896cbb4cbde1848951599bb1cc353f557c5bf0cf79cf54884c77d32165d4000766f5386891cd35135b6950ff0b9632e91152effed03d89a2750f76f04b750dd914a605a7fbcaf5699c8ee21c2abadbe9512b130857ff1918c0331642979bafc87cb6445c49ce509d9e58867f84466bf7337db673cd270807c916e798ad021d7e95352303b842c62dfdbab6f7177724b9ca3e1caee058457de9f25025bc959f52f2b63d9322467b8b623836c8c73cdf7d8c43d8ee8f371bd5539ea74e950e2c860a9c7e184604a8092c0274de42842d63317039d1db06ce082c216a7e0d0f8010e95e49871d052017568a6873137d127968cb13a640417b88baa0d8396d70f91b1687db88870cb451ec26b0475e7cbb25bf27b7e0a39d85669929c71e7511112beda1836eaccb91206cdc79a3a28d73cd251e593d50a3a8304a4e42805c458034a2a726f582018daa8036ecf0bd9fb8cf980f861287d841c329a31e87ede6dc58969a5aec522fecd75babc72382b3f473c084e7dc53cc67d1302721debdbaf0d4879d158f7202632d6e9c07bc9bcd19803df24d9cdddb69452ee94a40cd806de06e806a220f0b471d10aa60cf42d035d71c20827535822537fd66fdad06f09fcdef216ca5b1890257f41e68166d179a059946ee34a3ad5286f6ddb067a378140206f79ab25f66900ac5e5e774f57bc9aa6793c8c80c57962a28205e4de80d0be883c8bc54e41a04e1c0841910f48192a466e599a4f434cb880dc379c0f6aaaa2c230c438c421c63dc09d83683ca860310c5b46a43426d229b95fa4f40ab5923b040e8a4052a1c2298b4162a7ec379054a7ece0b74418ca4207c33ca5655ef4865a699939ef8d28f0ac3e8661aa7601b3f0caab780e97030788a4b2d62aabb5d5da9f58969abadba7b34e0a16e9b00761d561feb8a7d20b3e2c59da501404a5142103f2470eb2a4e5fe9048cbd09b0fe130771472e060ce3f8dab9eda01d1de3f2f27c9f6945d73af965e0963040aa37ca48314f5df8b51a8dc52b28329c822a590e1ca3a7859a47c1cfcc90cae38a389b5e0e989fffc5e3c2b2ff57fc895e659ab1029331f3598442232611356c39c1346a44a315313e59a76ef06a4a81fa7c815b0286731130e33415c954ef7ecdf7bafbbbbca66a6aa90d2cbfd6200b2fce40fcff421270d02c6b8c110a624fe032d4cdb1b21cb07801c754cf2b7ef008d8003cc600009d32f7a31325c1123628a71bb7b0dc65a50d3fc82d552f99c737e9c7beee722c50ac7c4b9d69982314f4a281527ae64aaa984a0847ab117132768132b4ae96465faaecdedc34e338bd8c206c7745d449fc612acfd8c8f2e12bf77a683919689e1880c545cc9f4736819d17ffa1ceb7bd70fc90b7898998749674e2047ef22fa21103142644a9a271049873bc8a034134987f479bc004f9777a70b2015689cb33d4ea4b30b840516f1b59dee39ebb07bce663d671c07d2b146c5643603a92c11f45da81891b0accd28505a45662c5f6354c9f427cde2a5b403b26db2d49ad601e1ec7334473a7bfe7e21b8df71d01270f8ef11fd3b5adebef3cf8884653104dedfa72fce34e001428c789e761098a0e8816fdfbff3337e65de3e9945fb1dd8437bb8ab03a4ad0e485d39c0218f25b0f637ca90dd0df7e7b78162df2802936d265fff39b73d470ff0acb57e4f5f06418874d17c1d3334909ae0f0ada051772ac4de44e1020172b8a9392b4f87994fc09e6779bea4ad0e29abc3a9b96beeabcc8dd77e0c5b60913bf9531977f29174e74ece9daa286f282b4f169416a7aa4a5c2d1d2de37f63b2bbe7fd48ed5e0d009f8772382174ef58a3ca62d66ab572c256d80a5b3e0ac3960c674b96ba4cff244ba5dc3fa3c8a450c93dbb22f77b46c041e4c3e04dc1a184e999c5d0498793a56292cbc0dedd305f0621b07f367267b944cb0f6c5c2d170e65d901b95db8b6f3db5760abc00cb9a81bc330cc47b325450dbb19c36c15b3d5289fadd992308dade0d86c49172cf7cfd45a25cc6ccd16e8e40131d2b44b29ed6ad03cb9678a866d061e5fb0eed6354d13028ba5d4aea61cd9b760a7c44e39a809eca184699114f51f9167e8542a4bef344a29a5945acd5329cb2ae28b916105d8ffff71f0897d603994d21c3ec0fe1b69cbfd347c4e2a80d2a194daf4af46fefadbfb276a354c506ad9be589034939232246dbcc813cc516550962e22cdafca94615aab3bf5ce27d649d1f7fa800ea7006e5c3412f27e012ce1b363ecd6dab746425903390d4435aa7d4d49312e9a3f83a623cbee65fa0766d9bd68a0900d942ed305df45f3cb14088dd3b29cee3e79b5562a733a94cd49517d8275acc350cecc47f657563aec3e79150a76ac614da2fef569c7195ac883a8a009a88009a14c92a506220172d429587223032aed0229f95464c719580c85344ae9e9d438dc195f60fc7abdbccabfbafbe52f4b5e1836cb5829c82f244ec912037ce4fd8c07f7e2ec22f77d6f09eef1048bf235513efaf0c8920b1ed0013acc1fddf75340da307f74200e119032da4b09c381541043555e21b70c430036d882af571465e4db5a886571be88c0f665693a0e22b0f5ec0064b8bb0a78ffa9c0e7416fce4a6d5e2f8cd379e2f399dd01a9d50b2f264bf226c7d0cd007fe8ebf31802f74b0f855c37a882165266b18e739a442aab63ad691955cbd496e1bebf2a6999cee77d54d61f3b55e9d0d5a1a6695acbc635e555e5a6432674181353064ecec499b2d05c328e38c4c09dc590124c433e12037b16434a70cd6268dc3659dabe1f007234a54c5728bbbc0c42c1e2fceea7f5af93a108fcb2fd0f79eb0105bc81d315c3328fae2a5d7062ca0b26030ad72ec8b805f6e1c97c1f3cdfbd0fde7fbeb3e7bd1fc1211ef8019f80458923b2028b73a4428526e4fe59d332aa2d44a9b1421324a0c8028ea97f7e319fefdb1df1d1079c352deaf798e038c1994d5cc93e6ba60adc1105961d526ef3e05082e7eceefc1c885c67cf9e9d6ddbb86de3b66ddbc61a1593d51ce738713afd49824fc7366e18587cedff031a48b58005c785e3c2c2f572699acbe57269d8f3c4621e4fbbba4fb7fab85c2e57f7c1ae8f0736c1dd58a362b2fa70375d7fa648d9b2524a8b80b5278580d03067484a60926b9a46b234a03854e69ac9b933774e1c64dc7bef0b3cbec00d6899dacdb7a22971a2d11885f90c56b5cf4696dd0d0d44a66fada53846e0edf33a4e55cb3411fb5b05ea872eba3fbdbff7493ef26e4c58c1f7dccb5d29a9d7c4f35ac65ee0397ab85b81fa9def803e74be1ef11135dd9f2bfaf73f2d5992b07c1fc9c5f73efd420973bf7e979a3ca110f83ebdafbdbff8f9fefd23b2c4c9eba2d771c110e014163747863e54e40b7c9fd36e4c8ca7c3b3bbf95df7f27c2f43bcf7bc07a4f1bc07ce1f4c9f1b4c33048e421651cce6d8322f38b8833b60d80c28a440993c9f8683274c3baec0abd56a357d7832df034e5407d2fc60f2803e5880e98b7305e47e36b7e6bddce0d9dfb36ba02be01f4c3f98c4f9ca343b4ded62375aaef77ba9200f1198ae0f8203f7179c29294129b95aebf50ec8f77203fdfb97fe0fa094220a709859eb6ad06ef03ce3fe6daf7d9d8d4e5687bdc99247c23c91a34e8afa63c8e2bde2ed4025ec3802737f3a9deea975d000cf1b1e42c0a2ccd2a9d745f46e9bc7ba66402a98a36d74b7fbf75e3074918e7fe17be50a5e3547e92edda711b2c8f35e207246b2a096042bb0e80843310011e279817570517f9652ce48a232b0180ac5d03a423f23f71f4096e6bda110d590688f84ce9270c5142492a6a938276013f613e6a37fd8c3fe4619f86a9e1b6560cfe2df7b9b4987edb9461f5d537f33e925a4cc344286fd7253d548984ea76e76d292c5bf510606c00e26abe72bcf2a138a16258b9e39573e9ae0c4b105fe1f9ce409bed0cf482ca8811e302681cf77ff525ff07b58254ba5dc2407812ff54f8dbadd4792c105b847132c4e18ecf630028b24188f2a5824b906abb109eb904404467292add5d65a6bed6030ae3f4ea47c79796a7ed3630aa63fc117a97d569f958fee67353fab7b35ed5a6b6f624e40a1503299cc7dce59a9e802f7fc285876f8dbb5f65a6bc79a7f89040c2e185adc9883471f61c741067e01071998722ae74659e2723f570380982cc92aeee8cfb9a8cc4ad83575efd59c5bc28ddc78069ee08d27e01baefacf77f0e57a5efefe36db5edbcb47dc78b9717b71636552532eeafba5723f0c0e6eaffb22633b62db8ed8562d236edbb6a936269b6a6be5de8e90252042b88d0913785b6d2a287853e57eaf6054594a96e8ac44c8d1765fac4b8cb82fd623726f2f26553aec6fd2f9fb6df751d7d4e19c6c2f6ebcdcb871ab7b735fdca88154d621c5a1f4bbd6da57ff0883ebf3046b3535adeff672db48a6ad73b4ca45fd2d4b4ad02c5f49e0204bd9fd61c5a0e5049a7999eba654025ac4de47099012be7c4c905473c8b0278ba4069d64090bfc72c3045fecff0fae96d17e8a9d20988fba413010ac41b0ee6edd74ab5bad9b966d9b3703b7057b1c028281602de3a0906eb55a2da70d085cb4600aa624750c25a4c09179e75ace08d814489892482b987004234c1e0d3f6416732c00754d9d0250a1a90369e810373025816109260f3c4023a05fbc91e57394d24ea7e322196017c9970daf9617dc719136a48cc501c8fd55d620fecddc714d993e6c9038b70a372f774dab8f830afc4deedbbf2ec39ee0dcdc37d056173181fb78e8e1e6e91f0f5eeee1d65aad6d071bd0e10cc8e30330803740d634eddf1ee1c60dcff372a687f25128e4853cbb43901ff2f63892c0a190a704357fa862f0523ec2dfa8989cdcef0143fe9853a60f2c1e1c8f6c8a270ccd5e214795e5a2c6f111b6b2dc968bdc568bdcf6656f8890fd9d2c6967b8665172571c91ac37166591f8a417d8a22c4a96e8f75b21e4c8e5454b44b64bde43428e5cc0daf279a0288b1e0a04d6295af75eef24304ddd73d58323894abdfa7392f32ba5945ebdcecff4106a02bdcc4d403fd3fe71b9882cbae47c2e382e585c6453e60f17305cc2904293bdbccf37f36ebc97979230fd95e523ef0a8f0829ead782c5054b3685749d1165c604ce1248e4f696dc74a06795d894457916b5052c7a1e2ab787f25037585c7b70a8d0126b81b5bce52d6f79cbefc5f87fc65b3e6a534c4c1886422ebdd3e974b3721d4f27cb1f25f806f408f451e4fe2a2a17853478d98ca624320b12ae1003534b37c19464da985a5e2479cb6d5aa26051c2544c8a68f968a6a9c5b1749802491a2097afe102fae0f2344059b71a2098b8cac70e3dcfcdd92d1779be69e3a38f5ee6db70958f5ee60b2fd8007d007d8d7f01e4f2794f7f8d8fc6f75598f5cc473e4a517ba08873c83373afd10196d9e541efdd9ae96ef9c85b2eeabf2d6fb9cb37e32de21c458f5959f66f7c924791a27e97d2f249d3ec2ce8b22cb49396d1ccc8fd5d44cbd0f9a34f63d7e4f9de01a1739b74823e4d2df30c61ad57244c955dc127db6a1928f6d532623d4d81d2320358417fbd224bf3bd903fec16d287cc4717b4add000b2585d9d5b65ad095a2b12a61fa404d32c12a6255558e8208b249a5441a6aa4c98f505d2e64499484110b20a646d819499a716892e59ac279f9425611a4a4b96e796f25c36523650322bb332992c870f30e83f39b260d897e5f001dee4277f94e0662f95a0f376d6f99395c912abf3b21e517065c9caf2817b0f585bb95db3582c0e68651dcaec8bffe7713c1fd087ce77ef75beebde078e6a9d07b4b2e9a0c5d261cb8404c17dc7ce6c96ce67652eea57872d05feecf7de64d7ba209e680558a4b38e45595467d2af5ad1eccbcaacccbeeccbcaeccbcab258199d592c6d65b68abdb12f2ba3381d6e93d2d9e974acccca6ca4ea0fb75b72a660066b752fc6a150ff3b1192bbb59f49422c2047930b12c957b955f89226eadacf44715246c1f3a3609f9a67e33c05042125777ed2b004d32ca5741185fca2bd1784e66e2ae9b0bb59c4ec342b4f28a801284121f1af07f048cd7d51e27c3e9f77d367ac51a15098d5b5c708572be7fa8b975201d8cc0e88a6edc8e2da132a4db3d5d62cb048dbc4a4439f242a450a3573a494dcfc9a78feb68c19da735f398e93538e40b0611e3adf03279b40bcd705962599a71cf154cd9eeffe83f0842a6c9044155490610ac2f35d8d1846e2a2938b46465ad40fd68802ee96b13f67e5a107cc699ac6cd776dbecf9b65870109d3bf7d19903efaefa70109d346be23e0233a74b8a306580c591094a1d066adf58c35321d521ed8fcc2c0e2cf39a7bbc7a8c86b6f9e37d74e0f06efdfe7310416b58e36a7a6cda975c02a48b218c129726508cc860e3b943107d0118662f060efc206274b2a3631141528c6dc03ac652415284e262a4fbc322747802515285659527101962c4e30b2a412e5ca111cfc39039f21ab9455fe4cd7d0e1045992f38776c22a94923ca76b73ce39a97dca1db1385a0c2c061613d3b90eda176bc7704d2c2d330b62b65a0975d900210fa10a9b31cbc090c5308b130623e5092577dbd0538331a1ff308c8989994e260c6706935d106965c254f8336cc2260c0786f3fa224f50c447244cff0c2a4c25ca153072ff9c7eafdfeb5d8d0a06a39102f7649a69334506285387c70becb5d7e6a0f3d1cc2b3cf84265eaf0d80119d726041f0b1663c8fd349de76cbeb25a2b37623941d9a17f87ce7fea82db43ee7ccb47e3f22def9fcbd734c8b9c131c9a004163fadfb1f1b599a21df2f4015fc345ae6c3caf7432f869c40c9f763f3b132ff63e5d3fab83abcbfe30b2c7e58f9fe074acb58f00587f9f73fac96b17395841731538f2958fc58c9f7c5edeffdb47c843b11873c1f2b2d6325ce37dfa7e1c1eefd78cbedbe56beeff9c4f9f63b9f11cf0b0eb97367993fb14ed322b8a752a9d44ce5d8215b5fb7358bef21ddd40d854231969b2db0020a382611e7309e6012433348c5621c77e7dc5e24e54ee6348fcc72c4880eb34dd204ea0245e2a7090365c1dd4120910106b85f861496e1094cbf471898bec300cfbfa04802cf1a28dedfc1e6acfdfb0097c0f3066e2fdb77401eb4970d34d2617b423132cc794ff7769867e4500cf0fd9b8bb4cc2cc2037234692045fd3a74dcb851a34637db4f1df2080226222475475df7c916d19013cca426943014d4d121b5af75375cf005d3f86f09ec9ed4378be8027f4ea5b69bf28e5a4badedc09a54ca6b249142c95ad6b29c7bc3f086375658d3646128c7e82c4d54b2ce3a7dce39a7bb7ba2d80002961dbadf98f252985f44a39ca669367860a0c8f6b0ab69b7d3d93e6ae3d889ab358e231ef188471f613ce2711c65a9ab51f9688b89aaa624359b896635cb5aab75357819636f168e2c362b8f2df3d24629ead6c67e5950c4230efe33d5e1fca904f56921122a1b64c9fe0d576091c5cb8a3714ebe4358eab6eb1c6daac19d63a8e2eee0aef3e464c29b5d62bb5efee374a4ecc4cdb74a8697d330ebd2706045e0c4abfb296853126596a59ea2ac8d11cbb26b95b368198a9266311173519b10ee4d032f55229c2026a026bae06030bb97fdb42ee770722f75f998469d9189ba377f7d61e1664afd7ebbeeeebbe7c74efebbe64a9e6d27ded7616ef84210622cc579e04b8027b40c0409a6c7776f3abf88e2c60f1abdcbcbed93d37d3dc378df71214e7d80169ee7b689e0cb9cf8134dcdfcebfd4f7fcfd97219ebfef012fcd7d0f7ca9e090ee3b3e3ca9efc3fdcefbd3ee4502f73b3fe4821355c1211c384f2f0e0a31f96bc28c8037b0c7d74bc21461335db3f5a222617a52c1056c3a41092f09d39fc3ffffbdaf576d0f0b37afb03ff47062be4714b8badcc949192973ffbe74773a9d9fdbedbc87d334ae394de33ca04dfdd42bdcbc3c9f4ed33a4dcbf9d4936786650c2d60f9784020b0584791c65c55555746c87a842c8d158565fee8403a465d2265281670ea1850dc64b7764a957b6f28bfe7b340ba2edadef36d1c27615cb898b3a5bb5b1baac105ee1c2e60018981224464c9e6cc201320a51419ea9e73d6a826eb8acfa74a8e9c9a26352d14037d4d8b6aadfbed30141243e67581adf5a0c02fa1cc71628b2aa6c005186401c7d41eb00711b0286faa844288ecc8026f2f860fd86180d08794a1aea9695a8873031aa3301e60e0f9378874cdd4d4dc3629dbc10416a51644d21113d0b0c4565befb66d5bbbbb6bfab052985978282fa7bbd33e9e4eb5540abb448eaa8cfb1e65a98544c7f31f0dbf25c22eb12a0c56d965a23b83525a2dbd9d2773dd93f6c7650a06819f05dd0e08c83dbc0ca1a6ee656ec2fdccde1744102c7893f72c8831750f7a5ba96abe3c2224025272867eedf346afe5226900d1a3419633889e0d72bfc7e52d619d31e3400fe59d2e66b4d24a2466c3c6bd37e7ded147f7de7be7cf3bde71ac94def185982c5d23a4bc4ae43b84139984b1600c912d16eccb451d6b96f6059ef78eb234f312399a41e2e62ec144ebda68ef1aa5f48ea30d1767869f5e965c4a5196b2bbc3755c4a29a594528274a454b31d6a9f7e3b24d961e6ed1e91b37b7fa6ddddb99f718d036fe815d3df5872d7e93059c188f8e90303d578efd5e1c610300f2ab028655794578cc8d22b071a44ca54d7126cbdeffefe3ebbb76ddb6c362bb5ce395bd3c21b29ea2863fc5e8c43a1ff30f45cd7755d9717c56c16bb321cde9ff373cd54d58bb3ad5057a194d629f5d5eab0ab4d6eafded016cc959bdebc7c64552eea3aa5ded059bdb135d689b5ab0e9bc25630180ce6b2570957cca462c8b0a91825098825092bdd1e5960fa443050ebdf3a89146182e98b1256ab65825d479e79d674785975d5e1dbafce808495931ee930d93a565587b49f888fe8bd188742d5094e689ebeaba010222e3a610b56565d3dc1fe625d7d41448afac590a13852d29c0ebb7abe713a9c75485fa43f4d1d50ba88aba00a3ba775b7d65b6bad9d2a2b22619a888f3ab665ee7f9145519e12468b20e2a2a6589014a7e5a55bc8fdd424bb5a6b056b544848d1fc284c2c916775816490e326c70b3b815978b59233dda3068bdbb8a9b6d147d5d4ff2dd1a7d5c94f787572fcd19e85c2a12d88938ff01252d4cf042a8a94950537d476d2401a2f7c93471d66604c0377032147b36bb490fbbde567dab3cb47fdc27bafc30c1c53e35ff809a5452dce295556f38727f7632738706409b37ca48307863a507c0b8a2198024c9fc3c1046f7d3aadfa94056f2bbcf21135f56cfae89fb2dbfa4c57ee17fe806208f6b1dc2f7cb7c667b1b4a83fe7da2c388890922f22f7d730b9c9b22b9f8d49182b16666f687cbd3a754d8b4e3e6a21a4d827500c654a9f7e4dfff3325ef948487f8408916f9a881eb793d602f60937aaa505a449626a6901f10ad760151ef10a8f37a8c0225ee155eed52ac70d6e17273829659d970fe8b0a5f63620f1d66a60e7f3728f2598fbcda7160a99e91e3bc0d2451774197640117f9e06bff71f90469a40ff79ae83bf970dfdafedf5554cd1224f500baa2cfedd3a1cd7e974544cfea5a7b72f306cce29a66bb6723ead8fa6693978c0a7108e9ae3744945ab63681d13b5c385c5d9d2642c8b21eeb51e7a44da801c695f8414f39107a4a847a0ac426e0d74504716650c0b0d1bcdf5a8c99aab160ca1a9e59032348607c7d9b86a5438d65121679248a49983079872d2b525cccfc7118e50b56ddb444fe882b497b9fbb2ab61e6fb127ca9f7e9cfccd91aeca5b756ed45d24c87f44592f350824552056bb059e3b419d2e7961af8354cdc54a1e1d202c21f0f898f68802ef7b660dc3351ce6084c0af43bd9d2791484d38a114d404a6ede93a0fc7719c13d60c49df78bae3440af7de23482477f72a046725066bd9409163cac88d0d3d7448ae4f5cd8c33f8b4fcfa2468d7b319628890a2b6ace9c7b31fea73315070cb06751bab48a8a8909c3af2d436025d9082e10c10c134d12508c1d986423802689dc626585e949e793844e98b9c0f4e4fe4b2cb8f05f51346e64494a41c445dd8282b97c4b915c95d454457538eb5f9a27433cef695c9ee6c910d07b208df7a0a7f19726bfdbcb0e0828ba7c342d204dcbbbd0b8fc4b4704148b48609aa48b4cd245be4392dcd95a66ee74c00fc944790d125932428ebce54af8eb895b0145742c664eb374d8f78914f537e1ca50e42956e44ea2a2b0404998eb44c260c11a584f331e34b5e6abaa8a9af933bd0ad6110ad8c1ded18519d570669e74430a166b45d5a82aaaa26ab03c0d72b1582c96dbc962dd1d536071b2b656e7bb3e127247d19943984fcc22e4fe6ddb1e7f7e83d2a18fb268d9678be5e06459111b66dddd59ace6dae3c4ebdedb3dbb59c51461cc50590c6b77ad6d9ab6f5bd634d1886d11b2a140a5509c95987302b4c68491fd956cbc63ad4b421600b8a01166d8bce3a9f82a894eeb50545c968060000800083140000200c0a8683e1906048301e47f7061480096a7e46785a389707644194e5380a628c31461a020800801802a6466c8840001ad35242247515dd25aea9bd1a815eb13b684f591a12e5e2936f07005b91e1280395374a407da2a5fa2210d60d5434e3000446e8254883c0e8082f937664ab41307f8e43c53b3df9214aed61572b1ce2ad97a1cc323d1aa8c59eeff5747a3451153be82b1c293b3ebd73aa827cc48be50b89aabc9622163eee20ef807562c16c2a6b314a8d6a60791b1cb3d50c5595fd6248ee8f2f4c5e7c4b6228d43f319abeed966c94ddf12a233bcfa2a6700f5a1246bce30668549ba375d34189d49b3f5623f8448a707c222d683e61e4096b3b9a3e81cdfecfec11b16b0a315b34081a101288b026c199e6756e1658c5c6585db0aa20ca9d206e649b236e3867254e42966fb596c4572163a29603a08a05622c1a8164bf70c57e235f4988c2c5ef111a1ba5ca98f2fb8dae5c2e2c21a904cd86b58d80d468474dd21d0a97dc76e5ed7ab4f29c8a51e17124bc73ed4189df74bc81424c1321c1f65c2e7dc5dd8610ffab3780f4c95e8602c2f9b550b0cea4380b464ce46cea4746dbab8c8a32c7121946c0512c6f945668868d821e52c31efd58e2b80e46eea42ead5a2a6fd3b02f505bc2e9c793b166242b2c2c2e5f3e8c46b642e630e67b7116ec0953b2577cf6080e775ebedb294a2e77a36220fb4c5af98c39c9b80435034a053300aa68666986d2f655117f68e687e033db859379ca671893624670f2d762e9ae0fd4c2f1dfd186fe3d35519fff39fe9bb4563e1cb4fad2d400d550c487eb1cd85a1f2d9d10f503a1a82bf522d75aceb7d711fd2cf3cca0527dee80786ca9ed53d1a0cef6faa349616d70a28525f2b8ec8bd0626316e61f358935b0e7ba97be1833d150a38d050f13fc02b189a98d7d995942aa17eb56b7ef4ce2f80b3c45455998a70b38a1d5ddc1186a73104db8f226875f21b415e98ee9097225b982cdd68e3586e00fee1b0ad841c54f92c9ee9ce8ace47de7d72c2784dceaf1c4d7c58d114319c7e6ceef8342546d0b4a291368f8c9a23258079f081bbc9b023e2891deab175090f42be2f395a13c7523581df68b39ed85855944c6f99c3602e0a83a59e9737b5455154280c1d7c9bbeb0eb9af43da1dee264bfff8e5749c6ae7d60e9fc6921a8dac6d892e3eb026998dab0511ac24bb1dfe4aebec3f1c68867366fe6cf3077758b7b933f57318f22a1a06d621eebcb29bf1a5b44d04f6a629177780b0b54dd21d95fe77dc91dbf37c8d7bed54d0a9ae744d930fd4a1acd2f370026b2bfbd28596dae134a79d8913896baa4bedb089ce1bae748c638aeeb49322bd1bf1b273adf9110235da41b4a47808cc2608dc583528901d7065d4eaca3d90cceb38d21d93ba6f486a6d020db715c1dd91abb4aad177271d976a75d24b2f0892bc943b46285f893fe5f07e6e41a017ef0b39b7543f17babb1f6567d95a93a5b4905b3c5f667376dc5880e2f2b34ea7a59f683f6021d88fe8ebe319828f28b89d74e3623d51e3d702636ef4df3e75eac947a6f796fcb29c16a111c9404a7f2954b9ba689c2247bd99208978cdbe6a7badbdcdf8d31912522e3dccf570ebcbb51ba0c2dd951a71a9d3cef7a34a664be2252f2e12f1f931798f96bbb90f4c6eb4e4c779e88f9c914a19a9e00d5da8aadf2ca002b29f80e4508163a704b12042f4149f0a34cc85691cf5b9fb16cd377472118fed2c882b486a29309d3bd6d51d468d8f5247624536875856f0f09aef960224e1e8ed563fad2a8b925f6e81a77767016f8a8e626fc30ad4de082f33b7e30d041bf9d83c0eec99436f1cefbc4b2a75f222172853d70de7611aa236e2af1d9c43dce85e7ab6481b7ac00a1cc1ce2522143bbe8db98909817722b5e381a4765353a229156077f6a738f398be0095b551b1fba45e3e80d4814f34e13fee56435bce74a1ab63e7d7f1d00621708d81b94890d20ef8ed27c1f899e31a0404828ef6887d8e5b605d8db427d65ade2f9ae584151ef682c401e708816962161a8470f1dbadc2085e92b591fcca6c66e4fb5cb4db43aaec92e9a3196d464d5e93c81834447948a26534fd87cfcef9d527cfa0c22f3f2ae7d1f4ef22e028ab4c4e7f7dc11bd83f50413b39b344e2f945b6f61c819bc5a983ba97b9e8c678d22ffadaad715ee6a160a9b3f8cee850103694aff8eda216e8ed416ca4b602589029255f97d7214d323a943681463e563d075fb0ea4816b696f10c66753c2abbe1266646e74943699faddcfe58501e7cae44cbeaae05853b2bc484ad84e28b471f261d6ca41a090c415fad0920b123ca408b6b0befb34f64d0fb121b77b25ee94f1f61282b2d2dc7ab4e73fac76a0291bcbf1bb212004d431014b13f26c6cdbbf91ab8528838dad23e9235dcdd369ab5c3bfd9c493747dd7eafe0a2e8ea05bee2679a502f96feee3b2930d56690b77f4ad965913ec1fc193163cc1ce896ba0c792ef35dc4307c4227d0a681bd7d8c03fb1317e128c645720b720187401873c6ca93782c65691b5143d90b0c0a22e788cd2a890026e9567ba97ee10a58e8f4be51f3f9f2f82383d2e87c7c331e719bb2d4cd201adb4538ff2719d0ebe9215e01a232c2108044fe00681f0289a15365b39cac829cb297e0037cc15406ab2863c7371e73fd7d20459379fe60d64bd92f3f5260cc6c0b690aa08f46ba1885084a0688832b09265489ccd9d457f98dea5931e462ea40698808c432a3c9d2863f0a09bbda496da4403326e91e5725ca2eb66d1b4e9b8a2cc250ef85c397335d127a85ac5da441cff651fa4ad5981b833c242c783a180512b063cdccf8d2314431606b7144e21f8e4730ed8ed1bb883b6382df6ef74dc7f06f27f08bcb1db10b369561bc884ea1894d4469054720f6c4a2a185444820873cf73a11bde7a776e6d0217920c057ee2bd4b3958991fcb2f50f400b3387e1f84c55198a8e87a4f460d539f28d260d943ddd5ae07a9eca4bf8eefa5145a8c0e3a78336a688f492e996ab8a56283122b68c858cbc5400f7301f785bee22d0dc53fb134ec25cba8187c5730da9a378549c328d5774995bcc165f9c04304afa308ed2e8901740314631ac3b13cac3f85ec79d267cc9442d775cc0d52bb97199192d4497b4b3cdebb927db7bd410d1cee745d3a7cdbd022b887d12b4faaf0690b9cad772a1871d83f2d0396564a5b380f86919887dbe5190baebdc0333f355bf7f494aa9fa10e4cdcd4cfbd2f6c973d61b5b854c0e700fa147846c517c56a37bbc6e4eda39b526d14fe64494ad792e95b6875718ee0d92cc816a5094d8434a58397ed4cbb5862a1574e06ad975f12db225beb7b58fa7d2f4bbbec8207996d74fb13fb2fa291cde27d131af34ad5506dc2ed56d9edca3514da72170971b34f7fae2fc02493e25672539c3e4d25208a7a57a0afa5e299c440ddd3898a787c922ab0fe5ec5ead20e97d02da5aea9c348148e98ab9ea6fc1e318051ec5818857129e3fe52b346fa3ee6346b45775082b7352135fb2892c7cb1731089d0387b19dd4691331333f2dbbe935642d9b53db333d8c5f8640c04d1ddadc5ad4b92b568ce5db9633a3387bfe14b3181576c57c98c0d68f2b45261b7b614748d092430890e1a509dc61f40686b5689eea15fd9e5d704d0607781105a440aa4561986745d9f8d392e6a4ef31e44ffd2ffe6c907e4d3774079029d31eadc2fcf4a64d65a917945e792d5640b4fbbb97bea9db8786ab457e5adb3a1723767df504cc413641f444001f718f6fff11e9f0ad28b1e8fc2db0dc53b6f9c7646ff3e24cf51ea2ec7896ea8fd8b633062068b8e72950eff65fa1a3518b43dba683174ee80ee8869195af357003ec3a23dda5407b5321814c049f600b73eed059fa8ab028b95f03e71581974b8f1f0e8f0ef83bb60cf33a695036740901601792ee57190abd932d05d7243250cac7fe450d03a1739a8c21689851202f1994b8bdf73e2e76cb09106c431f3aa0afafe1fa83691190dd18a7cc9d7cc3822f9cb434c7699c6aad130f78e5ad6c76e657396794a2da5151d74e12e1ee8f1a74f25e60298a9126456ac2e553db5fba0aef2755814cfa94e1f6c0ba8c3c77f4a3a95509e6e794dc8f7ee6fd78abdd2b045bc0a26ef6560410c63bed05a43d9858d79dedb47f9288cdc04843476102c82c6604147dde05de7c8b8c9f45731112eed495ccdb31db83bbb968ac61900946c6f154ae3163575a29f82e8b94566656ea014d72876c34c5da7a23015a85df05178a947b448ea59edae8c111922d1a220e9878b086de5419810cc52ad341d8e781f9bf849f72b1ca734177852e232e35e6f2c5881f2d84954676b4682445a15395a3d0f915d29803fde0c1d7955add5333aa09d3cccbbaf9f21c32135389ea4acd483bc7e7d5bb61e3d9b7ba8308615fcb5fefbab56cde38a817b9d9329b3aade619998470a15bbc4a88b71b2e1613a1df3c5ee0be45428a5034673a2cc740c237a1dcfdd07b56e03e6ff3aca19a4c665afbbc644185201f77e61226d193e394429897df1c1ce11932aa23cbd6a8c4d6200479465c5183d84f412db145aacc1996e3e8555ee3a302d26cbd2947807b14051e8925393c4a1d29a30c89f246cff02da9493f7a06fd998dd5c34e543a7d804eaa99f7bf3a25c664ec01615463d18705aaffd203035520caca3049c05fd2eb7aa33b488c94651523f1046324a8616124a14f1ff259ea200e42b422c5871a8d0e01eb8316c2671f9244285b30d02f3c242fc0188de2470a76eea3414303093f3ff1d1309a7ef508fc32207c17eb5654658fcb667e6aeb34b52b1a696ae500dd6e1b19d50229555f1546dc4ebda087dda36b0e53ab2ac61ef38ffa244f39a78ff6f933f7783184b1ce1269309531b4546f69b514a026377b1ff3c0d4c50b0d53c672045dc67900ad99322939796e6e226182663889720d49553ba44fc1665596e006d8348adc96371c2ec5d60a1ede52d6a8b3b3146e72d06af5ed31ee591e071b3fcd1be3f990c012ace2b3ef3cc694c19e25f7886311999bee4712a57d042d8f5c410bfa2767c5cee7058c5d742349a03ccdc4550f87b33007fbee823637b1c6cc47ce13e62da9ae463388ee6e62e4209f5a9f07de7af81c2a48f72cf418f397c14f0467bf0e47d8d54f364e47450827a8d83ec05e5c80df651c44a8800dd4a66bf0820753eaad2ef8b5d5667dac02a4a9101503541db6e89afd8c4a53626c39cbef710ff57df37040e18008bbd2d8163eb2bc2096308f0ebd3d2b8c59e7473ded2159e1ff7946211001b236dfb3330db0ab56e8ae5a20d9c2fe69f97fc8b6f3a7eeb19d74f987f86ce6beb81a7e8f78beba3028ee1b9784d949544c64ad4c88c687edeb4118a37c277084986ecd1f7006d2544eca2e301a11121208481165b039077c1a2115249bef9c99a790a42bbfde4d649b5d4ec77a690b00cd0737c26436a3d40e93361d7b34683833424c2b386ec486adb99c30c76a5fde823791a3832cce0bb883373343730694f11f98068dd35ec68afc1f8041637ca965ba98512402bee0f049689063c12110632a47ec1ae294430fd497f31017c15df28fc0cde13f192708d57aa2944786ee7b2d30ef3c3a06615903de899e8b9b6de8ea9cc6392f078eb071c02faba22b04b97df8f40216f808d9d6d3a0c90e9a793545df12e77493ac2fda696f315c5fa26d723a4a8bdac2718ce973647e19127642f2dea87b84642ce065c4bfaecf886c29cedbdf2974f7a4f2ac33a407ca21160af3f111c0d1b7e23d9cd2ab5ed8b288663b84de659137e4e6f3c74ab2af4320d25fd3de3a8c6777bdcb29dc4761dd6f7d8b54c83023111cc0e143b68c01abb4fd221d1c0ec2187a29593ccbc99dea46c7b3c84baa814e49e7a2e6a1214ee5624b52143cc0eecb2d676385fceab7946a52a91701afce00ddca67e2a651c26ef9b222c0dbd7a959b97a0da44765c68b2c32a91825c4ac130ae684167e418f6558556140f50a3e7f876b99e4928981b297fa7b140d9355c4cbe4078884e16df95c9cceedc1d67669da8d873cfed61fba9194e4e59e0d0f2ac17f117f70b16be7d294b743f17301230545af7f886f700fc58fefba5e769897897bf141e2266a418ae5fcafef04b5cbe128c563848113a67ae190e094ff2d7bf4adf58bd83bc0315af29bc4e42b6789e9f447e3b090c3b617191410feeac5258fe55e4cfba3db1f027527f5b0a0f545a238578df60b7d7160c7719415d53502822917951c3bc6e309c69be1a067b5b87e200fdfb161193f736826957c480b14205bb019e304d1c08e621a20d77a0133e010e5c1280d5f178217e4a0c4ba11120a80dd081f53099b32d8f8d186d7d20383aaf732bdb8e245012357c07efbba849ad02210debee21bd2995a90b87e120abede046b0f16dfcf5eee4cb9422c64551558089c34c6455fd927435e3b7046a1ec2fe75d161cbc9bd683f49d5a40bacb94c2f40e02c559930a66f84593184ede64c997d63f45c3aa7c917b8d30c76d02a03d27fc67e7891c593b018f54f68a51b1df174d5a966acb929b35a7d4770f1effd3fc36ff55fa2dde207600a7eca42c08c6d78decbf02e713c79df46baba7dcb673136dba46f2871d3f1bc76fff4faab721a390a93dee33583eceae2809b71c97b1f7b417a97b34e0cc89e53f77df8a8d355d63712d3ddbc2b5a48afee9b5a399a1b1a42f7f54042726d9b4c4389e101396c96267fcb253829c42b49a0f0e29df189ec643912a9edf47999177c71547c199a3a063ade3de8264e07b40beee1eacc23187588c4181112c176693e6a5dba1baafd1ece46af8a055cc4d315de8c64262ca93f8ea0bf2e3cfeace9545810328f729de075297880ba8426ffc2f62c3aaa59362fd1aa8c1b75e52a7232ac2c8736a8f301dcb5b9297ad4e62f96ff97a93e419fc0039a4b0e50407bc022a5e076ae8f56c7249b6aaa017ea2e883218faa9720f46b559c29b4566a570bc6d96ebd9d858b7b297a623f331dadaf75e2246d4955d3483105f7f569f2a3fcac29b149994d12df555b986051ea205dfc3b3df8a34f874f0b54b3b7a7304a39d479441705146215fec87802da013d594c1ad9d87ec7fa2326154261f62ba632ad0c84804a0f6dfcdae9a153e155f15933ae606a171b85c4aec5b4abdb19ccbdfc54cb14943be06c5dcde8542266b71b3c2f0d889671dc32a4c3bd9046eb370fb0eae014e9e227fba17c1fb8ec0ba0b0f114cb43c67751efce48d11e73fd1d202089de111638ceb719a48a78105cdd70d7f17a17b76eab72e1a1adcd71458dde8a3df1b0dfc96649647feb8e63f48a2839a51bed4547e4a9f95a826664e522b2018c59f07c4d45a2a8321fbba03b7fb514f4ea4c6c93bb21df88b60ebd75258b94c93b01749e9afd4340482fe2e1a6f04c817feb935aa96911225799e903f768884baf8b9fc1ef96015be73f9a8df535d5774eeb438301abd695b6f048a1b5ca2023886de887e4c97480e272859f0b9b38f0c8a7a0e3495aeb31b1d44e1e099b2532c3ceba74984e18b6e92bcf8d5159eb16ea7d85cea366a522818a077cb9f718228e5b7307069c85554b545ec4d59aeb587390ab86d8e1488532806b07f7cdef024f1e5fd28eac181cfb8a2dd250eb67127a762e112d7ff9cf3c769bcedfb5221d1cd63403b39568cefee9180a9021f0f8bf8606e8a1604e13a49608d635463ea0bcc3ba3fdfe880a5c7defcea98d852176cc3b3373e715ce30aa0ce0a0987df9dbddf022381bf9e7cfbaa159aaba58b07c7a34752eafe5e549a351850b0664801a0fc32d6647b38a0b49f88f80a402f2910baf0df0ccdfd8876b697ec5e9d54630bf04b8638c95339590eeeb01fd4d7de6c13a3fcb0aa2d5f81bba4a561cf997f144a1213870798cce37cca85a6721d84190d9f2610801536b2ed213f7b72c23cc05c62f3ced50149aceeb5a21b5b36703354a42ff4a157ce2006e7bfb9e50e40658c97ab0adbc4304e444117bf15fe3a2ca2a78de18d915dc87cdc3f474f07dc2dfdbdb7da584c32ce01460a1773e3744918e2308b8753b31e4edb1b136a4fd0966b7c842e9641d6b3afef2c182061be14279e196845c715029dc21252a181a5c1883252023e447c88fe1ad94b18b31ef2ccb07010178b61b7611e69250d0614880cff227710d150757c4837ee649e18dbd3843a923a2df34b0dbf82559acabf4590a04bf6812af248e5689e612e11a88fe5c24d3ce4a1754ec1f61674ef6a98468694347c9df6069fd2ee2eddeb2913980c4c62c2f1b97342603c3183b1364cb7dd756eb2ef8a464481a9da05d2b206c9eed196036fc478b58fc035999259c92965ccc26ca694d194661cd0234a2c4db85da661751618a7415c0fe64f14559713cb84853de1db24398ba8caeab81958c2658d1ba78ac23cfcbec96b2c0a24230236760d3da3926a900461a8a1a62d5b1341b08eacf71ab1d08dbfe50143bcfdb069d5c75bf495ff6f98f63c4a84844d7a65409efe07cc9c3f2c67c232556e7005143e5353b53d7a26abdefb0d325621a1dd0c587323349bd57fb1e082340a788073a3bb67c2d0763b50080887e786624022eb8b3c8be4495d20595378c971c079d704b28121332784f6766ea7bcd3f23f3e5286aab3ee94174131287962195cf5bd2138a567d9d47ce4c95168488ac9382cad4a25d1716a0056d43acc83d7b7dba4c5d42487f168a9c34d866209871cbfc3f5af3df77ba506e6dd582e21e867f74a26a31a263a1a126bd161d81570895ae3e48e7a6b210811331aca6b3b1f675681305f656aca37bd6af4dc32d51c2a158cd595d1e0a9dc771a50cc39db78c836ab5e6841ff4200bf5b061219ef4ffdf6d31f9a5bc1159d4407a9f607b31cb1f06f1cac9f9c5056b5055add2fd5999820819365b0b6481c2d944ba9bdc2eb1ddb6fcb2902e87fb5b2c848c3ae2714f1d77348001f5e6e0ebfc18dfc0413e68103275b2b1dd301f900788534b00f5b301906eb38981b338fcb368f1d04b7ba73f56a1c006591080ed1f87b7c0317c1cc6132452ffb1a933c740b0544df8bf45a0deda8b1656f8493970c416c2e50fb7130591168c2fe9ee176df6490555421497d7d1c944bf5e079fe890a89615f2b574b9263d2b8a59974612c5076bb9ae5fa953ad5909c0a73f708332671d94906c5181f04921dff2452f47a12602d5d3a25018771f4621b37ba35bc9e6aa93561f53ea001d670863b4a7556f6fce9834a6063e1e0bcb022904e8e2249c360d911f8e19fd7c7773cf0c70c3848b27c2933b75895c41db11a4ed509b70d90669416c05d1facb869b7406a11239b7cb78f1f6321b70a026748d0b6bf0a17f956afb50f20fd52628242cd4cf4910df09516801e232d35e5a09d60c9c84e96b52167753f6d001b06a6a91cab7437448d854a2bc488b48c1b510ed721e42af74594d81e06ce5f831a8fe17b6fae02a6a3a25b45bb78d042c3c4a72c7b56be30852490ee91d9d72fb509f4770b25fbcecba1eebba786c6cc3edf65289a3a7d521a80707c00f2252f3cb20d570184d163ae7be0f517e90cd2787186b4645eed11c721c4badc09a1f7992ecca001feda1d21f221c296cfd21d244b07db898f67f6396a27c9156d45bc221e26c3a45a1ee78e9db8e0c194343001f898ec3e39453a67fee72804bf9d853939c46092af30107ab074f1d3c0145fc4a67ced4314185a0e28a165c5d226b01baa30aeb2d839e7354f15024b9da181c1d7f7610a0840b99a5e1302ee4ff16dfd53a81185a9d7a508ff0bd3e2071b5dd28ce329d06e4b90d483ec0cb0c9d6dca1a95615a46eab3059ba8653d2accbc04170a2de77b35e7217ad9eedfa1d2dd3f5e37c06a95ed33c80f5d0b155c9d2a4e34e01f94346e37c7b0d06bceeb34fd501be60430a9f2548832740715f2f25ffb2a7387476dc51894fb89b1d9b19d0020c853af062c5d5ec0f08a6394c5fa1652bf45e452602570b90b411741a59041bcc8d120fc965b7ea663f636c06c0a4c6a2b99208db60f3cc22f3906e24d172507f823311675b0dbe39fce4d234de175d7b2734d4723d287673f1f36ba732e7508eedceed03ef889ea5f2d1f84e6e842c825682a987a6b4df7486e7d6e7fa1583bedd291eee7276789af29cc3ed61005c040c72c0285e8fcfc34813658b07a6084612e15ce429ab6851285284fcf101599573a2cf33c939599da526772ca7f1ba167f88b868eccbc15e65eb5cca9e18b855521bb0228156651247eee9b28b2b03c0641d137bfbd33585152680ba7a8a414562a0401704e8594f0306020e9f0685e3d7529901241ec5c0ab85978c7a83ef088ffdf341bca436910f1a0fce055b7cde39b8f6c2ca2091055707f606505fe0536bf79a0c628090a78533febacdaab21760297e567c1faf220000e10e2e99f30079c864dddc11aa7df2258ede8a7c4a6787e79799436f77fbdcfd69629294d574f3cff9034fa9edf3bda38615f570a5840f3598732c584d88e2bb2a465a412803edc11d29cea511fb217f0fb154a8e08dd6996a0c083dd0442550348b869206809fe5df92508a7474851ca81a92a46d559d040dd8680c008ac08aaf8dec735110b05264928c52c24fbfc91b2c665316f7e55fd0bc55053aee5dceda0f0e2b120aa0c8058e3ce02454d917063de20573cf9ba48884cd02e6f1794fd090eeaafec974c7a15e1fe9f412b78333acff701f8ec7c277cd8e244b6d4f100750f53608517fc92174e1a2f25e3a3b46c94643d90e8a687ac919a4fd293dfbcd558452fe720c82856627d187f87a2c5dedf56cc1510cdda7939060fe2c66155b63957fb510aa4f681b626c392441d5d4a1b482fcf4021c7dc68d800c4e1c24e9ad1b3b4de3d11390b54d2d5a187b233d9969ef323b3712e48387890033ace1acd43d72ece6212bc3fcad79a5f76d771b218124a65e863a238b385b3f4b5f925dadfc1b9c1867a31f623eb73c282b38c599af4fc9fb2d06cf4be8a27101b62cb24a46fdf6d7b9828890eda25228c1e6b5e01427655176c03e4bea1605bd05c351d79f270a50b794c6779ac7968f4a253656d08ac8d21d5ca401b336ddc6c5fbbcf1456d279ba069a2775293832cc455018a380f9057c12a93514d533fd23061067feb47d571b6eef982a20723c4fd626337cf4ced5fcbc620725085aa8965fb81bfe7a0589ccf93e31233bf39afa83f099fb4c1e79219d3219e2c696b5df3530924dae7f3068fc2a6b539b449ecfceae04c03d014eca253180e2f7f91dfe6f2c8144427955944d9c3fe94828917372d00dedfbf6173298e29632f2c3d6c6faff40cc81bb1f50c069fc77c91cb585cf59885719c290bf7cb2b75be049eb3efd396a95059ca5686eecbaa0064a7165f3c9f45401d32def76106f86085980fe11572d8dccd7473ba49f034347e6ab34d22f02ba4014382c54a145477b9cc1a9ea54d30a004289ad6665bc7e391659fcdf297b167718cc3a5af31928b0bfef88128362cf28edbb13a67913b5029b82ad349eeaefb176301e765bbd46475231c8b921a1aaa072068396da180b8caabfa9f947d6350fb8d3488c99f61030b8a0881d96fde491bf09a0c9737e7a31b2e20625da2166ff045a61b42cb39687fd2877d316b505df7f0807f11dc8118aacb56d6a1af6c90f44228c19c5e761d527aefad365ce8d50d8fa13c9f40457e6718086d3fa4cae121ceb4ac270214463558bcefbc7808d71056309be84e2659cede327d07aa7b59cfac95c438a801f0c921093011a0b4175812bc8d4d5874c8d3e5296de8f9c4deb4c79665d3ab1c952443af6b451950afa9293ed22b89edff93884bc938e72574f66337624b8c27cb46fc00c4f84202b526135c15169c4962dccddb6bbda55bb0b18a079e0c4bb381682c42ba27ab6f11cd999b62b5060db8b3354e5cf84521f2af8c05614fcc0cf91515e91537e587ebef3bb3a0c976b3436ed385a4026de29a16593744503b0a30fbb5add02d851594e6b3e5fc914983eca6a572f51c025361d3e3c20c4ffa26355af4326be333ffbdb0a5322af292887b90ed060e8b052ee70b60f6d826b4c75c89a94a3093fa46f91637dfa81fd7e07822c77f7e88c6885463bd01528a420857e0071e89b2ec1003e21fa931c9ee3f80367faef174c9d9887e1062c5ddd5c6497e2686b258480dbf1f4deb1acdcc02487a340843889111f82e1fa5a58b3ee47aa202f3a614c0771e88e5b503e6b40b913b6d3174b47932b737b349303ce07b62e7b3577386c99c4d2c4076edbe4c459728bd9fe57c21c6eff2aa4e3f76a0ebebe434e89a9e79ed98a6de80236e8134243f1b6e828b0d7a910c20fd50be70b98bffd94278c59fc6d3c5f40b61f2eb7e41c64bb03bd87f520633204d60346338cb11566b98431898ee08155d205ca1550f140e07492ccc8e6813ed10de83730d6891f2374e48227cae408b9db53c4aafed1fd77a54cef20c2777ad39c6c30e4cedafc49088a4a43ef267f8f30afaaae01386c4b7d754f0ad31dd909d34c3da32ce6c6bdfc2522bd72d43cc7f8606c29dbc161d0d0aa025be078585826009b284ff089c73533d9d9f5bc953664a5fcf9568aac7c3e54aa94addbe1e54ead5b6925956be0a77795afe6a7cda311c80569afe424c24b86f456cd29cdb08347551beacec138f824976537908197a959234cfbc09ce1841258d8324fa48c416f26fba42653e2cebf0f6e854721dcdca8b482a18542eb1fca0170cab1257f982702f79cf8ad849238baf659eedc36bb753560a07d11dd5609f0bf98706b7f0e3b13bdb63f0c59406e6dca73ab201a3c7c799790bac98f3dcef77bd53bebb0f2e715cef82988a2834ca1f75b87a10a902cb89d42a6b255943ab542b5c7b37dbb5b2a8795dd0ed662eed0fe0d2b5c09748ff378a9b7a95d5ec538778831ac416fca3c42641e381cc21a6056acd516c86afcbd332b7cdb0d7d22a4cb73ffc2a86df00c38c3be0c641f66f490e93cedc5a3f648e59fec32cfe2abee6cf12de5f9da13912667dd9e323d1c32f1c935d6f856444551fc621acc75eb70ede3bb38ef740e6f228fbdc01c7147966cc379ec436f59f38734a6bc38d316d0cc232aba8be940ebd0af2062ad5f13365ecf2d9ace2c485d9d550085603ee7a802fcb4227aef875b6931a78616210ed38b1ac60387bf7a62a793656302fe86012703e3b0104e91028dc443d144a8cfa4b3ea55bda0a102ac10dbb51395d5748a0c768280684763d0455fc3a8ad81ab3821aaadd4b0b51e75696b0185a7990d780b0a3952429040442e76bf74b583d733a0462b6e2f2302e9cc0f7f782291136147c5de04ae63d346c5d47c900bb97c4e7326d019ad298eff44d7f4d351e875c33889e4885cafaced34ff562787c3004a79a568825ece55113c8d2e742716ea2406167e0e1690a480dc16830a0bc80335b5a1d28cea029a96b253da941787987895a41d88edbaf4e71bf53b52492a52c9df1482b7715b793d5b54ee9752010f4abd71722aa57cbc793113b5e4b1ea4492e47336a18501385c386d70b2e46b425e7b71870f6f4435dca86ecc81e7283faf857b5fadee2a512717fc031d803f65b6dd7a6d9924fe6e3afde8957b156b6e712ebdfb1f9e505a0deffb832394f9580994142fea3e5716a1afb387dcbc802cb9028a2a5063c148374538082c6c92859e15b6ed846cb4dc8206835b0ed5b1c39fa91c2b8814128868452f20e17b4ad8635f796fe1d56efb27c223617838529ac4b3b153998c40b1a083b440dee87812e76eecaa031f40840a33bec2110413be7620882b16607c64cae0d78b8d10f32a18e62750b744152a5ebc768b0f83a2ac85af02e07456240f836a086b9e341f4b3346164f01f1be4858fb37d1463ee1063e9b02768570f0dca05696f839384f4fcb053300822af0795a71dc0912605b00824183b3be9d9e709e53851d8fcbcbbe541cad3d2f915a0fc62a185af17ae84cf9a80e3f36a6cea459cd45264232372bab7e03e5069d024b353a03b3897b483696a4f9ee52336632bd9cc3aa36ade094ba51767aeeab6ec70d5221f82d1a44d453d147d219e30a018a78cb6d569f6b6499b21401385711736adcfb01c6870587b2beae740f0e5f84dd1b986ab6543b073f5b8c338ec3f86a42f5e2ac17fe4c8ea6d1f6efce635dd24ab6e6778b00c08c21b2d6b792a9fabd979448fc8845a97e1cbcaeec40ed5e381aa5cb0706b4df8d1b930b6865e6160361378737cf94122d34212716211228832972a1372e88ad007bcb78f68cb14fc0eae8b3e8315fc32191037e43a45ea3d861f6d930e2ce2e22c6c4547081db0d86885beeed3d2dfca16af4f0efc75818a673af204bc024607c6f701ea2ac5c8b372a3da66c9153925914dfef8b3574f67bc250ab1d0a378d77ff5d36ee2248ac73c8f8260fd0c860ca48301300866ee73211bc65b97bd9e1252090cb6d82c74a318c7ada7d20993a151a0668f5ad3aad626c6db88c0b89a3355e0cf48dacd17402ce55d5e8e5c7e968b0464366e239a8413d33c632279b75df5b1e67e5460f2d313fec646fdb9f70edc056e7739e081fc30efcee0bf15e7e9731db9d6a01e1061e4c7b523eb2a7f3b2ccf662e83b837c45a4119c78feeaa47f4990def4cf5e329f60615be6df4fb4513b234174b0909688d3803003b5ccb7dc6448ce601631e0d01e171eed832f76b61e53826d61f6b4f62b940b8835aa423f3a077b5bee6a20a809291859d5880bc2b80c16917793720eb694d6696e713d5cc1212ed547ca8f361cb08bed9689533f2ec3c8896b4f354e94fb8220e9e837abbe7ca68b8835793b4c069704b222f95f6563fa9e6cce67b79f8c340bc3f7f008a1d359073c2b4123dc4819522b34d6935d1e1cf0959fd2f3799dd899b7a32eae6667fb3a4ce58538c1ad9b2356db6b9f0c862effa84772a9071055984b865c34e1ca7e83f92c0c0740dae0ac5ca47b1aeefb40e0f0abde6011a61739c71bac32f80c62feffdca9c9445ac0d770a7391ce1650562113dcaf71b2a6a232dc0e6f79be84c34ca2b7ffff7f2f9fc86dc51e60aa15a399a21a726db5189d7264cce2ace2839a9330368f4bd82ff22028fa66b4ca286db01f5c6aa9dac79c7ccbb329a4da304e244161bd3b3325c5be82fc41ccbe042c351cd03bcdc8a0a10e1143fa8cc038dc61975266480403ec905b6c0075518585d71e7aa4bf1df2c02d5a10b5dc2211c1ab10119ba1e7f61f0f0535d9ea7130cd2abf40504078d9a3825a42daca66853b08807fa4e41118195d4d7221c5e221618fd392301ee403a6cad55f9201b49c1a3bb2df64314986e0051ed50109af4f4f3e8b5624f0f0d672d0e8ab320cba18588e75286b7762e779c460c69f880ceb395de5d721a6bff4eb42a8eebc7616baa751164b1a54ccca8604cd0294cf1035250f96f44533e6393cc039afb57c2042515dbb85fe655feb0b3fce2b61b755e9e36d5deff76b93d04567f5e6b422887a09bbeaa72fe9ab96002bc7f6ebd00d552028ea772a3b720f6b1e5363d4d56a314cc29c2eca0ea7069367a5c02d15d0b4d46758c3c0b06cf9c297dbb69dbea6cc2e6c0a92af6ff96fbb64de32a0ee67b54dcf464b1bd56ef00f71d384d38c9d329fe128c9d64262eb73170725ca0effa96418e9ba4d157c7b1400212a415b5394a3e2efee419103f5d86bedf4cfb9f578a6ba712a16022a8c0bfd24ec15b9f77230f707a8f0f0c91f14fb7fc0b57dfad59970984de7a7ca629825a1c84981ef3b9d0d66496fff4e83d18772ededabaeb347802fc745ffc2c43ec1945f5d6b756c26db2c7ea1665560a588029581c094ed2daffdee302b2a01d6b255c3c2673d7fd54ac6dbad93263791cc4ddba43b485b358178877ba805f2b6025006b3539498825a34c57312b9861e573a7ce89ca073fd19e8f09f1a2e6ed6f27d5d86cd92cc7b253cebe2932960e8caaa686ce9cc42740257a247852b62f98075d10a08a4a4b58e47888d9690c043de3f6bde383ab07f7bd11006d3286a36c226acd11e1b1906c5f83efd4de1a28823e2b743eb8ab684d6f00449bfc0832efd217c9130fe8429b7a7f44818c43c050e948e575103d1b9f06026c6f0e2df9a8756606490856c8bde69cf726b7370a3378563175ac84a8c382f859f51ce670e3e1b759bc24795e49261e16212b869d733d98285f5bce2bfb89fe2c3a9e0269cb2b67da9d384b68a03628dd7fb27681fc51895d1799919a5cf8b05a6ec53a0bb510df5244ee8851bb6c57be96a600e9c03f5932dd9545ceae12746f2c2be5e70fe99a6537707e12643e889d0309e5a1fa019a79234c23f0d8158e30ca241b86bc37e074554ae880a328ffa8ac9772cd93ea2056effa72fcb8e6f803e858ac394cc1ac57f800169ae9a7d8ebd80f5a904049ec5bfe531fbfe3f90280f603838b05daec2eaae6af01873a4f7bb89a15a5f99e2f1c3e4a9bd826dc24bfd64aa511a95e230d8d543b7da799de659c4a06ac616461664e4e85af6144a9fdfdf822779030de49ed4a7e464916386827e73283ad77fe8d148a47b9dd8f24978c2d05bb7d560319d8b6e137273842500035e18e58f45500efa1f3a7abe8ad29180e08ea76369d53b3e10128f363146c18891fbec5c1ab30fd3d6a29145446c913c9891dbf8f7f0e635761eb9d7471a89c4e6c484ffe6e2764601c24bd9c15f73d70afa20c70cf28a8ecab03c4f052318176eba996180126770d0152485278a1def8a9ad62c7e4f5fcab62269359fc99c0622bf3161ed794efc92e1cf4022a7ea311f3aeff9b675507139e94c1e35d44f4e3da7754f8c4c4fb7a4d3ac3a875e47ea8d21557a7165c637f2b319b33751e97e16a70add02a300ee345a0b5ec4640d17e9a3c2489e599338170e746a3805053082e81d4398501ce5423b10b6ff885126feadbe44d81aafea4447a5fa774a202c150da3586d2bc10399aa1941ab1f17e8e33296433a1fc1b002eb98e659e2971dfd5ff4edbf9d9e879118a960e9d68aaa6ed65a0220f9d53bc855dc50d1bbef9daa4d1bbb09e81b15c5cedb6749fb396db6d5529f935f883c67fa0f4a1e0dca1dd21689ef8649c7d34bfba48816c719b00ce34788aec6583cca60d6f6ee7d562a38f773f5062f89985ba0b92279b248b1d36a94466d37f1b3d77e466e8bab9c0b62a84819ecfa5529c0f4c5dd3823cbfce02651990ec43b930c779d7b4c36e6786429f8c372533d12e5605ba077c95a47c0d56905344a8162899de18f30196434be8b1068f5f90afffff1d4b4eb31333aff4474b586b80c802acd15a43fbe0f9cac95568eac44dba55279aaee1c5a3a483b58f8dcd9372e3bb7915ae75bfbf92acf7f8aa92baff97e74795148d99dcbfa8e180b8aa2919694ec63e39c3b07ff98a45c5ce696a387a8b4e2284172f3f0a96a5ddb1572bf1406248716df27edc4068f3e6b468f7c7f11c2b63a693a7ed6f28436975a07b485634042f8db50c3d0a0f46a3f719ad7462260c9bf42ff182c38bb06962c4cf7cfe9f697919238d9977d8e01549865627e9ba600c3aff16161390de872e94d02d5ad5e92ad76be30ee9029d7ff177bedf855c959f7b3f51dbc568173b93e461fbb0cefe409c6a9a1a545262c462abc8add129cb92152b7d434064506438d42beb790b7bddd829db28d385853abcce1dde8eb3cb2279fdc910f019b65117735a878e8bd412ddeaa82cf9d42dec20242dc3cbaa64e6e812c6278d540f2b9d16b3b81e7f0277e3cc7a0cf95931821089518f56f4723e8ae8d29eb79855e0eeb484522f41e23efaab13cbe09621011062a7c7d5154b5ff03131a8c91621f478d3265a9082e0d07014267a0f02d9f9fc80555a1abb6752c0ec96865a40e05c0b489ef07697ac0dd9604c05c30e151b05d12bd2a0c1e1ac36aced0b286da1bcf4fbf5e5abc867619ba5c2d7a4293a529670802dff444f6822d6ff3de81dc576530a69354ef58510813e308ee02604ca470c228282ff2b2554af1b5da533c642f2ef76403488089c539602b07726bd45a6166b2a8500c0fd74ee26c1083723eb8bf4df4d5ab483e8f3435e75721b163c8146faf88afad07f2b348e334898fdea807a0919c1a4bd21d8583aa7e48be0e0c5523e931eb8c1d3e5842714c963181fa5658a2de73d7f0710240d031e07975ae4ea1165193cbaffb6210144fde14488f32c7e559412e2969e99651e29c7bbfcf262fc3997c4f479081c3730a0d135401e78c222b3f8bee160a0a0d0a011c2f0164b224ba43ab1908462745d39edfac97d2ec4036f6c0a0d2a8e952019f9d0ac7e9c9be695b2ea2df6bb7b36419afb1de8e5cceb2c98dbe27b85915b2cc5b40ec3d03c181832467a103cf32ad5a4a1db4ef0eaa584153fc276a6a992d1765e011aea880f700fc3948f10a20f320181cb6c103d79c34e93e65fa4920bc9be7032f99344b13a02aa8c1976377ee1b847bcf3a9524e137697dc78793b0aeed6410087b1f24d5e10572ccff7aedd0adb60e9b042baaab1ef8657865962f28958691a8ff422b6ba9a03791e1db10e4cda3d17eec4d62b56e02f56e1411a4614860c9c937e8d5555ac10698408041be2803a8592a7d38c56a1f7643f34e75d899d2a0a9817ccd81dd813a77e31b58e5755fc4332a201b0aa5ff2ef9289476018c331f165f2d4c0a9347e238048bc1e9ad37f21fb42c3eb351f3ab6d8392750b5237c7c0fbe218671d045acc6f23ab4a35e25f0f8bf8da5d0bd22855513a155ac29a8a0302d22e35ae2d64918ed878862c294109d1abf2638e255a1ed3b3deb10464a4eaedad250d3d130a9adde6f83bda0dc2a23b2a9c007ab7aa03f75983c7f6eb9c4d6ecc4162ebd058d442452ad8bc49016991ad4338056623a7ee5198d0e54bc5adc04557eaf5d5c730e162e37722fd385a7f4793bf159600ccdff9a29837b0356c5a542ca5560e37eb6fb4ece57d1b64729b3dc95088ee3068315bde7eb4724c7bca0c0f11c5bb74870ae635185045141728bf708a0b75ed7d33dfd46c1893fd68b613891f687388bdd544516c91f7c1a445664687b6bb3c8a44bccc7f8c33a1b87e4a26299bf3dd17bb5377d8ab27fad394b7d46c5e50050ab25d363a08ac0225bfb017c45cb1a0011c6bd55e43f7ae25dc9b6864cb9514e15d274ee5b592cfa0f890c772a3702ae09221513423cdcfdf1b9de8d1a44d3e87c8440674f8a61b41a6b308e89211a3424c406fa557c2a494874032c17cd88e4db74f6e28cecd722e498446474bbad9d27b7f54776e3761ab10dbc327bde78366baa0d1db5d39e872190f627d65ffb632dc9fad0e50adb99ac7f9998da0aecb59a7b046aff7a38bdd72fbb4bc7bced8666d4e86d4b6b8dbc40c0a8b2cce98b97a5ae9f41f4b3b6c3308674f890ff0ba8a7c99619b1af214ecb373bab204f551807b9c3c5fc3a528a6e3a77add5e5b3bea0611bab37f96a778bc5b24e848a6f367db1ffeb7fdcc36ea23ae000f86928788cccf82706c6dd920b129182562c8dbd46313d255c266bb537af4b1b768e0662cb93f483516a8429843767f73748873bbb86bc144ad30a81edb91eeb9b86beacfa1008cc25c0e1b13b0464164c2ea368561489c2421e51a80feb2506ef2f36fc390bd034c06d57c167ff421dc18d338de898ede2a7ea87590f755ffc5d93665f69d4579152f0c23f82539aec82501bed1e49871daf8f11d99eb22b73497f2633b78d3155e5bc151330520f15bdcea1e7f0944e77cf4281ac8d110cca29273b3dd0b436194e179eac5c60016008ffde897f1f27d91f08187ea6259ec160f0865d306b3e4b0617a35f4f5c787ecf3b9f50d47b2898d270579c99174442800630839503b87cc487ad5368d0642a1242eaedeea504bda4a45b35208174d3185f8d8dae1c2ebce4f8135c73fb37123a30bf9aaecca1b7e86747c1739b7d5ba28b37bb1907f7eb803b24e43fae983647be677ce18cbd5b693a4cd85217695f47f0fa70d0c27dcff03e4d681a250825c71aab1d88ee7e9b1205488d563406bd7c0c172397135cb5627176c0a26f78d091da779f90c88e782845b6526615ad3fbec982e5f18baa2d835a48984c22e3af8730afec8f461f57217c9e3518a21e038508f068e48b4cb7a5df5568fff052e4770e139e9eb60a19b62f5009e1f0c18a54f3b2fe3aaa274e767b0cbaee6e9800767d82de563d1a135649bd0a1fcbdc5ac89a4f72f44951a9bedca38ada187118b31957188948b32d8e0237d8a1a4a656bdb7fcebfb927d75b7bd68dd2bf371e4fa3147a381f2854138e8e4867080b542fb3d3dace18efb929a32c1d0bff1d5269363ba695a8345062bad65114359e45fc49ce5fa67fa2dc4903af573e076d8046dbf004704203cfc434ec99e434203daab8a49af1ce43f19adec01425c741913f5aeba5cc7d369a27b168cbecc329b38dc48b2de5bf8f6140fc1582efd0e19b0f3538dfad580156d458c175f31201380c55288b301dc313023baa585f8ca149e9537fd5b599ea9985807d291802f4eb48f6df92142cb8ed81df9849465fc65ea30a6b3d7593a537320a4152425ae80bafae36811bd793df55ced6ad58a8c43440058920fbd9bfc7297872637a0bf5de31a213d91cc68e41eecc5ffcb95d3a89012546c8f01880d4906d56310ad2b4720980735c2f1bc85d320cf0939177cb60d539f23517669c378a6280cf5dd9c25e983736d0fdc9482f68b9eb72e9c4cba3f5aa36000c7436a2a04bfe882c4a4c836c0223c384fe678c429875022cc05756b9de9e882ed255006ef1d4d24012bc716951fdafa3147cd31d9e9ca72949420e675da20a7da2ae0108e8ef21229b0371a1a4cfb2c4965f0ef574382eeb0c40536696a960a1588daa65daa9c034ad8eed7e1ebb37dec045c744c70549cbf95cb722968f9d164afc140573840f02435b35ed82e62d45ee7e9fec567ad7ad368f3d204ca1d60d8121622b8a35bc7fb5f619a0adda306b5d91e47a91be2957b194ed9fc99c23e3812d30ba99995f53d2044670fcfdd2cc31e614cee1e6ecb10ca59fd7f30489d37a5da80b42b39a4ee2dde91f428091d660d0bd7cf01a0dddb2ddaebb9bca842659c706bd3c9c9b012dc36e270e9f6eedb38402b9149ea129619c8e23343a0f28c814d880013d5396d87a242beacac0d1b6efde9973f431ccf52cd0b2ed3ad6eaceb2146bfcea1e2e601bb3e1aa29cac84660325193df0b0f27861d9d5f545fa899239d0b0f757297adee7b9d8f4e8d98377746481006421ccbbde87b46dd049024107ad613774097c9f6643e90c69b3fb942d24f214ed258a2a1702fda37cb9418b49918b58d80a9cdd18615625d1b5156bc4210da53e0aa511ea9130a0f4b881061c12ce61eb17b38361f82ee1641c58bf3d59b2710fddffc21026611b32528b196c686e4f6db72ef4f80e4306b4c7758246e878fa8aff39bf7f61013a680690e85e997f4eaee12240f48826b39e431933342b900a74d46390ffadc4782718d2ce519b20c817cd56c450e2391bdd2dc02ce972da75d67f79b0d7a318f8479c7175386f041ad5d724ff641fc7867f20bd2be993905074861fd3a98b4b7c2ad4b648cd9eba8aa4d3e853b6830ff5cf8cbd593905771e35adb63f5ab46816f633afdb0ad99e7913b4af4eee974e140c8e819de74ed7752687876680a37455e36ef74065328741a27383c82192cb36a0b657fc01a0bf6104bd737020ac8662edb42b6dc223faa50bfa5a2108f86b063e331ed91cb05ded6ea3805a945e59cdd103749dbe1a161ee0a55168cb631340722957d5b8bf30165a51fb5346ed3770efe354b73a61ef25b4fb7b93dae2c8dfb4b5cd34250f733a746e6bc5b6a70ca04097fa39d5fa02a37a6d6cf5345228ce5aa1b9fe794db1c93837df81b0700e8c235a9820bb1e6c870409cf54e4168ed70faf7f5c113374cffaccc1d645bb2db84726298942439d271fb6febae20db1d2d1828e038a5137b61463ed64468ab433c4cda10d544ed9c399b7c37aac2adad3c07d9004cf986a3842b7d430d3d2f4e3fb3d25b5212a946c96eeaa35780376bd3cf6c589eaf2d59fb65cbfd32f17a9652ca42162e337448ee51b5d6ca7b1929b4fb8df40835bdc5c9c1ab5a0be2b2e5f64a6154cc9d762c49140be2269d544c41427c252b9edf5f716f7dfeb9b484fb1ecd518d0223f0022745269cda60900e4beaed49990dd0e9ce195fa973891e221a0f52c27fa9c91a47766934bc68b8b2a10120c71650bb64d8c00bdc78fed143ccad3ad9457779fc5e102d3548fea9ceb990f520c45398ec3ee5ccd6193719b31a7e163cf5460d37c1826b042b48c80dafb80996bbf44ffeb21e23710a2daeb631cdfcd6a026d8b66bc8358b855c16b02daae2d8dac14ad448dc277a3ae25b5625785b5e6b23f10466f18a35e9bd610b76b1a0bc3db4d3f21d7d2bc18233cbf8a1158a68edeb9f764a85b736c45b491272a20b8353398a2299356f9b656b2cf0832c9f52a22e4f5938fea061e4122d07616031cf1708390685660fba08e718cfa7d53aa13a939108b320b83bea111df0a1b91d8f2682ad8c74bd464438cf781f89a0b9d677811d2edf9664039e3de59b7143a05e250485b6e27314bdeccb0b05f42b4ff87c6c6c5101cadf43c8c6e09d8dd8255e31c9173646a66684da1cc9b0a000400c0da6f6281b9886f9eb4a10cd4aedfece252aafe4e609d5eb16bd8caa102f46378a1655236658e9a20e8e11af8e3549d16ba9f06ac841752cc9524cf822ec316957c670e2afb7e37a23ed2a1baa7372780282be06c5d6aa3e101e46329bdbbe648df822f8564998173e0cd5e02bb8624a4ec340e539e052694928e84473bfa3d336a1f3fd1cfc21b38eecf7574c4f043e0d1f14ba5a6605e3f65d0fb84814d7f249fbf91ec0abbe643b96abb307df4b56774ab8d846fb2e31aa50be1e8d916bc099fa289bbb0d9132df9ffc1da2a98b1e61a2ad2d4fd458f6342661fad75901be21b073c48500a99f6a25662c267e4cf8916bcfd03622be6602a82f5043d8a7c857fe67a28c0d1884d65354307df2907b064c5073c377bb808cc4c3e2e2e615c2c18ec5ec330069c58adb2d56f0704dbbfd2c8ee30aa1f0c61db69589f7f1e3929baf5baea3d775f600ae84e2e07c70dfab87bb20f4bca9364e6bdd3ea3d363a8c15582207c8591c2c9424f1fa07c910030e5b4bf826b1d4027a4156b0245e413376c1c5083cb05384ccfe7d91cca8414fa651cded3aa4bc0dab07e7a6ffa944e1a0b25840679e4f6f85857b9cb1c9844427113d62b7a8a59c9f2cd8601612d6f11eb24af306749ad5394428930044c64e4e817eb7dd48d218532365e707e70af84f99681c00ddc043adea8c0d90193e0d0c921ec5608515e0eaa8d7426fcb53332c4401bfa6ba17d0a47eee3b8f0db9b7630786ac90a444d3b71fa6dbf451888d5503d7571cd1f0b937383b80128d724850b60ee46af4002f72aeddace5850859b20a79394ccb388ef06cbd7746c6edaccd5215743979b5888f2ff97cca11ad7048db5d949e826d8a02728e3c51ef6837c491cb0c8dc6d43006e0d1a6a5c38bceb7a69d60cb741d73f55d5b2ddd5339983575f51092b0d59653111ad48a603b885f6f2c0735ec2a4664bf4786c55617659d8a78059ce600f3d7e3d36e7791e667910ccdee62992fa8ab2d497aa259ab3bc9745da61266c7e82f1d9b24ff0cd172d5b811422eab668f23871f24073ac9a5e73802c39d293b13557c341066a0338d8ce4ccd57c4979b9a39cd12c6e57a2b1c551f30233eb407e8df9255c7d612854a8076d334d84434e2bf255902094999f64539ab8ad0a32eb35172d92c708a8f90b12d61b3a0aab9faaa267d09d9e2e15ed253060d7631050f3e1932ed83fc2b3c0c436ab7e3f6ea6984159d3d4f2017d6163e82a2108eae8870cbf208bb710737bab0097c4c817a33749d87abd758fa2a175ac724d816d68f5df2dd8e8187044e93ae16f36f1a5502aae9450263e01c648ce26b9840184dcaa569107abb4a665d50ffa3cea042ab365134750c04d42a0657f0f9c7e8ab8bb32bd21b6049f849e54f1e0145d02e999c893db3e5572f8acb46daef587422b87763bee2a5b25131b106fc68fb313b76107da86b0d767b9303d293c6de682afc7c3abc2d8838d33ca9254763dc7ead576134c194455db5f3295b716f580b7ff22e2185b24d3f7779c537f996f24b0011db8d8aedf334f19b25280e9fa71197288764777b98c613ed1add4423da43f344f3aa52e71a1545751677186ce3d0434c66d7deea5d668fc34053139f2e6f89a13eaad9c6b3fd0cda650cabea25f20d5a0f26ea6905ae30fd65f1e4a69755a500cca2d80f324cd441011e5a5351d82e057dcf4095dd21c6eb4c279950c6391b35f08fcbdc17ec4554a741460cf3ff932c443b09fbb270fe90c8e558c7ee72ac6fdd06fcea8495fddf78af9a3398618cea73fb9d2a0e4900e9d23d30ae3bb409949cefb25ccddc8416e29e597ed90fba85b45e1ed17d00fb01e188b543b071a08b1eaf232aef8f4f635e21e8a22921773256270bcf8de2d37df4e364ddf09349caeb7b69a41d02485478f45abe8952e463db17dd20721564e6b117bf0a5ba8f91787db1d4bbd499c7a987e243933488ea8116dd57162336511f5b56864fc1a6f82c705147533de16fabed8d8814eea4343b57225c51ce39934e260496428b09e60b0d6f7cf5516650178cfad05b24e811df095ca664711a57044acc38cdac2cd6cc26118c26006cd12e3a4eaf934c2677b18c9f94e72df34faf4990f4ce5c265cee6ed2b5e8056dcbdbd35016fc1484388ee95267d762430f762ce5c82f9ef9e09856f03c8f72a4138fd4616bbffe6ea733536882171ef7f85806c219e35aa14a40b7707c8fa2488b16470a4a07ae99d2b4a3d199e9c8673993e03553dac294759c6b8d6f42dc51e387450ef7ea9c83e0e46a9a000410dfd9e7464fb6236edf1d48c7997d16beb1bc3585aeb59a275b6e5ce51e1e974ffb4bbe241ffbceaf66e18763941c673cc1f42c41557d1ed2232b900af3175dccfbed3675fc51a0459d7703f64a6be74b3c56d092125fc2facf47992ea89fa0976aaf8ee359af3a6ea2b08403aed869b19bd7a053b2180b5ee0a9e8d0940a5601d453e7636a97a6e920d95b8996b69573a583ebe42110a8e0892871313d841faf6ccfc6bf2814c571fc8a57983870699d5b4124e759bec98ea775ae78e2ee856819c6f8b225648886c84903fd1875d8568579548cd064554041bb8345b02b90bab6357cefac92dc1cb9a2bd7a4ccc3e7cb062080247463cbd1a10d8e218cebcea6251fd4760805cbcf87d1aeb507b2d7e8174a55e07dc8fd669406935ba1443a4b55594363e9edad32a5102a5bf7d4b845d42b871d512f1fe051da009447488b31a06438c64538ba1c3aaccf843fd8d3b7921f23736a2a3285d4606da884c9413720fff7e8770eb2bde0e4d8d44095fa003a42242061ff897f0893692b51a26127945429b6f4bbb5688b82218ac48768055fb6059224baf7764fd4ab42926bd00e10fa1a9ae07e30533e0c106ef1cea046bb430c9910f0659ecc65379757bbf6d5fddd40d6bdc3965c450958d33fea3771712aaf9c8b81f8698e349d32b022116b8db661b151c4aa4641f5927cfae5b985d4c34c5b9345534eeeaccac8533edd82ebfb1c7923141507f8333ab8f69221bc0037899ecfe53419c5403f5b323ed9d6d83608b9f8f4ff45bd49133547509bade3a0e7816a32f95d0f243726fc8ad66f7295bad638355a28f64451281e8fe71d7165c5621685fc60998509bca9e53bbd6ea062facb9576374c9ab246b10dc599fc5836190236d649e7aecc23887d450c64fe23deb2181ca88fc7e08ff5b3f2f100d517c801c32b44382d393c03895a4001e9d44e72a1f089656a8f345619d74acf6805843c34222a215060fa12b8ac609493724ead35b01068d3e33d0acb8c69e2d956845960bc1480177d72300d4ea44130ee064594d6f4a9da8eee9cfbc9d73e724c60bba726b76612b80c579918437b56821ad8389d90e5136e4af71d7c413ceb15d8eebb768632a4e1a62e016a205c391aa2250df0c0ae2db96b223839f62c020d99b5f6fbf452f096b11e7dd3a1cb50c8e4b9521a1fb6224350a755ef71e8f1e625affbb52d86091d5af9a09432547b1090e8012d6f258ee222fb60a625c57b7853a4a5427e00fc3fb545e2a5d8ea8e77b171cdd83b0e9ebe1baf89bb06169dee8f683b6e49e3dfaaa3f34188617d987b39bfe57d826a2d06e31c9560811eb03a5fed353fb94198d2680221bf91ffbb9d659ba8fe57d65d37a0ab1face49eaddc8a605ba649d3d0fa784f3953c44f0cdd88d588caee355f29d3ca63d0532ca85d21229d22c3951c72835dac61c752a4bf9738b4de9b965d8a72f964dbd9af8b3ae15e702a7011e98f29c1ef2e30cc294f1866583265d6055e177ffbda00c05106d3c65862a0b8d5a06d242c9c9131df17301ef8a0c5ec52a6cb2c02aa34d530d86cca2c8191932e15093b0df9574ce59cdc63f8d02aa2630f17092cf16d7b675e52c23dc6efe873ea083bf84ac59b58fa0773b1a4dee684928d1309a510f9140975c6045f5b5ddcfc0d1de96d9e9fc391cecba9ebb55467a2128fe390475cb5f0abadf4660404f5d0a2252d7d82499511b3291e7a7836f6411dc894aa98d5836af994bd734cbfc7492e24b02f98ad29177347a3bc8ba7e9e37bc7f974af514193df45b0a8ff2e71c62a039b8798885efd2e3cbd5b065b3bb6465783c849e05ab8377f902a78c52f2fc855171462c4146b0bfe09d4e46f816511e0160f3883ff371c65ffc9648933774919a74beb7b16c107a3b44d24dc6206b16c539a37c269ae95f3c8726aa19d899e40eb6f6c180252786f8f2311cac8efb275405b3de4094d1e6dcaa4a649f08e0bbbe59ef0f6a15096284ba7d3d1b318dd0fd7674c09838ac68e230d0c47c7509a869148612a79f40063631b250a5130a19be762559cdeafd94a9f40a2484793347b6721f240f9db1e4c3a6c0da408f06f67d1e5bf301ac91d6aa16471c4967c86c0b44594a1bd52788a09197e6ebf729fcd37668cdfe60550c371cb59f0da53911cb05ae18cf6385a17e58c78e1bf3f6376072fb7f4ebe61bc65f798e61c40b6de5297fad0a5c3c84524021ce14030340308c1c049c8c39d125ae16ddaa55947370d7e9913c262664fe39d1fd99b2a37066128100c529dcfb7e1edaaad4b09f1b18c2448425209e596b25f72cf3db230ce9a77071c469ab476aa2af6b097ee00d6a2d7809e62376a7e5e229cbb286144595fcf832f6ca92cb2e00b45a00a6bffdf799f2cc65e3ab93472c63817bf9a0368fc2b0d42ba2e0e007f19ab0da2cd083eadc62e51b915699e4deba81c2e89fb52c94ec40ee50adeec7cd000b761cc935b2996b280e0c7a444b2128fa4cf868289263fcb8adb26daea5867c9b93ebfc8194fe2a59afcd06e69ae7c93e29231efd39f7a62b820e6eb8583aff3c7981b39e8fafcc0e74710860f2d28d47dc1327e81a2a71f939edd809a7e7f61e16a420a9c7f5602771d45af3027011f6a0e36501fbe9f5800c78539879e73930dcf391bb81c993f6f5ea31733fbc7a3f2fb8ffeedca7ddf3608fe117dc5037999154482c0e0857ff84e2ba86f89c4f2900e0a7dcadae595c5652a292cf85d4839eb720d65fd7f3433f9c6ccf5f08da8a380d40fb143234cb4ae8df9a47b9481ceb1422d62ac518f34385a2ba6ce9bc7e90cf082b13df6ce73d56833f20fe0a49ceed8b237b71b307861da1b39f8221f46dcc041146477c9dec57609da7592cbb9a8ef3405a35d5cff42eea30bb16bc0d28d79dbbd2f622e49eb54dc53bdb8e6f0777daf41f9b67bd7d7ce45794f98fe31c76983561594a58b5e3cc9681f523d3e4dcaf256eb89da8f27a425af420f3361a5a12cff422374385069e2f1ea3d61145c3446aa6203c248d1b975753ce8c94a950567de9389724730c3ddcb28dde2264afa166c8d05ba2f5414eb57e241045835b8ef1043c2582d6aef970d99037250c858aeb3df2a1cbb2b3293ebd970147e9cba6c10dfe6d6680a03285a35ad0ec2ae6c9e2d2a22293b821c5ae6780c898c9bf3e21b6d263f03b2044ad1411baed524ae539c2ffa46e179816baa912a4e2180398c1752002afe923341e2e5ed807db5f6279ccb7a15fae30441e670bd3f5e6977c2f63204881468fed91ecce2218ba08dac89e2205de38b5e76c4c502f8154e52c30966712a644ebe8a7db81f2aef9de84290576ad18042f48e728b13b3b71060813435746c16446cbd904f9347426902485fc21e93a1e1cb9dd79047ace9dd7904faf1fa1722da16b3c6305c0d6cf14ae7e2d36e102c6d86529fed6307e304b8136e3e926dfe7aba148882c2d3b93681b6f143b8eec6b9512ea674d6f30ac1bd3853ea1459a337fe7571bf1ee51b04427f12480b22b0af86a5151f1cc1695a9fe03362f0d8372770082b38380dd68afc0b8322ac4d3d00028c3303da0106695e4050b2710e2543b2d0bda5696e1c7b7fcdefde39187aafb4acc8dc3877039e51a3f78574bfd23ce76ac561da0e7804d88349ffe781da1b361fd0798146d8ede60a48702be40634e381333c776de2cb72173181f6d24d44844829a59452ca6e0677066006b29c735655b29220185725f6ae6f7d20d5f79a31f5459825500d73dfcdcd40271508a40282ef6fca54fad912b743a457ceca075a8154948708280fd04d0d27201008e402a9fe3bd51d45be14e591bffed7c30bcc96a6a81393cd7ad9ebbfb86ce9e5d5ebbfac6c89db2467f597964bec05654ba09385a932797cd4c5cacbc9a59c32fbb9aaa77a75090304ebf5c31317ad703b24a77e7f888bacd7f7ecd451ed1804a9402217f011478902a5d79781523110aa898a5ff835e212cae45e5326664b9dfe19059df64fdbb5909b3dc16d69c6fe82405c28eab6aeab236e06524d983a8254fbdbdcacd79711305c7d04911c1066c90bb997b51c47721274e25e2fee15f238d5519fbb808fb844d912c755d935740ed5ddc0a1b8d9898fb804a9b899aa571be21909a402a9dec532444b0bc678a792b6b4372637b984e34eb2cc2a7e71fabbcf25a080626b4a526bdf0b3e6292dc9b2469f40b43828f9824c91658be626f1c3be0e363d89783ebb88dd3388dd3b88edb42249da6e2ba11b47c3ee0355beebbbd3b0eb76c690b5b16635675824c825f5c2f1573ee6cce298f8aeaf6a58f3ce75c472c68ac15e86b346370e361acb50962ac62a870894b5ce272c75acd47245c9248a3d1c779a937c7bf09041cac9440b411e222b30265038a0fa212ee858c68708506a2128d734e5d29ebc125cb0b9f7089cb19f0e7f3362cff096d3e1f7a1bfea0e7b6cec3f9e68b3d1eb779b88ef37061088401e7304b96243fd0f2e1081c2564980a694bdb8709535f496b333942895ee21b1ce2992c17c125c7a536759851b4d6eaf1e012972b1c586d4fede7d6e6dc94eeff1b3ece98e92b9553dff45e4aefa564ec85d86ab55aad56ab952d9148a3d1f7516e4610ee8a445a913967fa03856191e88aae44347b73b129745647f5456535650a30636a49863e316340799848d01b4c56f838632f0c11f76b5fb35f0b6d94d8b711d1d79edab086b311d1df4f439a6e883853abe65a65ad77cdb59381172994fe705cc11f50f342a9031ef4bd3f9df79348a46aadd5f9b19db0fc655b6b298e2ef8fd4a6dced4d2640decfd7abd5eafd7ebf57abd4044706a711f473813631a3af0dbc7518912a930259b0a337960200333a6fe88a3477e98edfdfe12ba46a9a8a67baefbadc119b8972d6dfd7abdeaeb6eee4d908a1c17da681e9052035108be222ab13f0409f733d513ce5898eac3c2d0fcf082bbb48ebdeaa846a93022f8585ff555a3c02cbd4c38fe994a030a1feb4bc7ea8ee9c4ab895e2fe56143c38c41f1b1beeacb86d56bc09c7257f75e9cd76ba7b4fab1e223f3c1d138c2ab0ffee2af39f241f3e37cadf0494d99033c41453f827bd89005fb34e10c7d80393ea87df2824e4f9d5b00a6e1421f2b3e435088ede3351a519bb3cdd9c767b6dd5481693db22e7dcae0881abadd5b6bad1a8d70928eeb4018e7ce93c331c6dce6f6deba4efaafad200b92247768687ae094356330c61e4a5a1811cd1091dc5e449f8a229aed450e1039eea9c8fdb430a33d4ed96761663e1389a22892891f5800861826200b8346d3eebd2b6d07e317c0d7a13c4c003de0f7eb9390cc5882cfc4ac1353ecb71104af3fb73e5f4facfa9c75d799f5a5f4aae6f3f022fb4e95de9cf357a38a9cb3567d7ed87baa3ed50e89341afdbf2ab403bf3376ab5eb5555b657380140c72441b2100e0a289c8bd901282b881d87d0eed2ff143a70b9183083e6ed52cbf8e050fa2a4860bc2bdd702f7de911fc8cd7d90cf7b3e88f7dcdf9b03ef442d7c3edccf4f588e38b403a7e1b899c420a46f17b621b6368649e79c938e8fb3dd7beba76f29a5337bc6219b669252aaf5cc1e3bee9a59ddd547dbfad013f71e17dae01f482145104ea2e7eb166b8a1a913263eabea9230f7c2a7caf5475b4a7d8854ae80f4eab2c20d8629b8ed57666cedb96701113a63a7945d9ad1963855340c8a9d3cc654aafc8bd159f8561a3dfe6ac2286d9d23fec31ec31ecff7feb3c0cebb81089b7a96ebaff2dc655c139a5744785984ae5517d6253060177d2cc92e7ad09ddbe66799026fefc09b33477e0a7aa9f25fe36d62f48c3e98615befd38cb0f4855fa555bef9efbd951d516965aa5ca39e319da77c0e78b6a9ef280441158ac4ea2e7f3221b25359ff7bcc8859f914310465627d113da28195da081c44ad4800188b84421d60698e87909b474249e30c8ff27e416c6da0013f97f7ee425e021c9c2d437001197189266a60cb517637cb36ac25d3a96bb16abba7592a4df54b7d74ebb029d163cefacd67a98b882f16b49ced7d6244c19fd14a56b933a7abdb2a516cb32895df8256bbd5e2f9c33c618df9a730c2a2f6e9361c6542e9461b665a855065b5a408de2c6111ca7b417ca607338ed146ae4a5fa66216de26aa55a796bbdb5d65ad75d77ccc7ded6dabd6bb438c7c48f3fd2930f2070eaa9306526a594ea6d6f2aaa430454c70d183a5b8c1298533a10fc3100995380604b9330a153ccdab61f6b689b8744fb0d446d517b90887b41708a2022b8a5b403bde7b6d99c278c5b0f7a7d1b48e29c258c1b17bdfe96c544a1be9ddb4eafa5adb45b17dc89032b01a0d082e438706b6d2e0bc381a22edc5a22aa81222fdc5ca1887e17c67add64221ab650c5edb77083859bcef5826f30d4146e7fdcb6e02387faa8d0af00a500e854d4e98778e0a7cf324b1bccc24c1ef9a91752a8175326ccec2674aa03ff5661eab326877a129c2287b2a50db6c150a80accc001a063047bfd0d56b120c006cba193c10b6c118d4602ea02bbdf7003a9c8e16bb1f520d142d587e2507cd5e5e05331bef77a3e39bf60eba78fefe5b6eef5add74e3d776c1f0bb761cff3eef5ba26ae27b1ff4dc59a4c9b56ca7dcd87e3be0b6d8278de7b2e14599b204a8274cffde7f343c4ad2f95711864af1828e0e394793e08f79e17d9af11d9b085eeb977a10b5df0845e68c218df2b2b81d4110c5998baa7e1be0bb911bead77d5b6d6b66ddb9a705728a551f6de39e79c338d1cb8ae828ff4f4b53e87168ff3c294b154d340b1eff4027c7532bedaea93b5d66a71a7a8a6fb2122b72dccd54104af4f02d7755fc555529a730e830593226301ec46d1efacac14a7ee18294ec7357814a05726a51d6863057ca4373836072b4c4b041f29496feae8e6e488828f14a7dfa73722fb99843abad7c78cb97fefbdd746109cbeeed32853a6847edf842897041a6c69f4d7da6df58d2f46f7f7e6d7de4b737cdcbf7f9fbe66cca52cb28e48e8f7060fa860c1408683042540c90226720cb09fe92743087d83073eea0efaba31a397c2ee8773074e420ab413d3b134240517fdf8edb720a7dfd76a7dad4fbffd3e272b950d20b8fd69ad9d71c46a872a7c00a230d594994974eb5514acc409e2fde78328c11fa47bcfdbe7333e9bdd3e7370b052ea130a0e4c3a85d9129fcdba83cf668cfd1856f0d793cf711c473291485be74de3a00d3dff9a10e72c0f7a9b5028e27e8aa1bb59401eda7cc661efa93f7e8d1c9efb8c5105af3894d474ef11dd50061a2c8cb50f835deb791a85474575280cc78a5350ca734586e5d70e577338ee399c76bcf79e55262e351c052e43b09cea99cc24669138164bd56e73328bc4e1e494c942cc981ccc524e4261ea17915580c923f8ec5807c34ef8007f0c736196b5b85547ad2f6f3dc05e37472d696fea810e3d1085e82f6a40976841e1de7b6fad57036554983a02b1cc98fa9513e13cf0e813c6acbceed414c698086a1ac14793b534654a51157cdff77da9944ee2743aed4f1f778e274ea5df45f8874b607c02284971680d138c180e7dccd4d1bd57ebd3495b792eaff57ddfcf19709ab37d195470910274b7af754f06159ceb758eba0db7d60df8f8b5fa6bca1c993b30933aaaaa16cc9b8e5d0025e37064cadc1f751118d730472d20d2e9d714745a030eba087c9a31144371010afa688fe0605533e6ca27b3e2e3d6bad2efd6eaf5b7d694b13fa3e7f0b2ec69a4245ce1e3f7792eed82af06f78123307b0d1d4eb8168a36ac8b58f8c03afd0facd3701b475df6bad8d345b7ae8ab7ed0bd80eed426ead76813e6ce7f9f9ddcfaef3849c63249eafc13f3d8bc4f31d88daa2e7b90f38bfd0000f34a6830d5aa287ab5cd0a0a436283103d5dd49cd6086bb0f38bd88e2042b93290db874f701a910ad28b0ed44075e30d3a2a48a406d43c8410717d77dc07985092350a207bc8185c875575c29affb8073c6450a60a2c7e3f13a0ff7d097a9c19397e801c314885c8e1b6ee4bd1f268f11f570c8eaad7e1b3d2fedb225ef31a69e0d3d2e8f931953733cd2c3f1569487f78307c40d9dbeb54bbb2c8c28ff74b5a89e98258d3daf551f712cd672534bd948c552fae87931e9a30ccfcbc70a13a6fe579aae510b55ecc219ed02a2ebba2ed4ae281ed8ab8e3c76ceedd1ae7b3d074cb1cb3a679d73ce9d7669570c180fc1e7b33fb3ced84f67ce0238317d4c4ff887c3cf5aab62b23f860e38beb02672be59c5b40c40a05a6b256de9bf7e7d52866631636a896a419fe69c6d8d25dfc929836753664e51492a9bf1b1929ddc17a6020da0a24f461dd5ef614330d4a9ac92a48cca2a496595ac64256bceac24a5426754564701d65eead97d83a3f0973d5f5e70f8aca34de9d3a7af71dcd6b90796158b6ac6c5bd30f3c36ecfd92eb403e77e84b83eced8de5bd3ca59d7a68b6f9b89c4144290816823643231022044ef85dc88411044cf9756cad03d6d5e96b46575e86fda80fcdb7319a4303b85cfbeb7cf332d689197f77451dba6b79f9e8805fddaaba0c3b96d4336303fa5af3afa3cf00a8008e7c2914661a54c992a6629fb50d256495b256d95b6cc3761f091aa349a1932b7bb991f5a1f676c857bb2a5115b4e98aad9b2a5952505a7082805828e609660eed09b0ee1a95e9832b44f716eadd150964d5c4f6c694b96169c92531dce39ced1d081ef3e723d434be51181c9326562d08163be370d1d68e8c0372aa6f774065f1759d49beaa332a935a7e26c22b54835d2eb7b2b989327f1ddb0c1cb5301481dc150479cd5993138b5548d5498fa948a09539fcc2724120c0c08529d2903d5d4fbe00609f848592c160d287ca43aaf2994c7b6b3811a04a263507ca43a3a9c3369e5af2bd43ea90eed676ad65ae390391f1cd458d5b1b5d65a6bada9bd39ffcfb7a66aaaa66a6a87786833a18ca0074c442123184b0b5149f743c491d42be73f441c4d394ac0c79a0a8136a1e7a0cd94228c50a8c47e55d9127f96285004210491e790711bd293f59ef42aae3e5f55585d479faf2aa74e6ece7b1b56cdf57d1aea889e8af03bafe837a4a78fb6c34d43063b954a8113c63ef5a0c24ff83386a2beb146a7e15853d06b7e1ae8e9a9de9e8233e0ded137d53e4e578f27d4ce3be7fde9fa5e7998ab8e6b0af42c1f24f4fc83809ee53d58f00f7d1096077d76817f887fe86bf8879e86354dfa7ca29f094b83f389ccc8cb3e0559f69da2920b569c4ad610b881b473e0eca02dac2b9d7a6935625535a5537f58ab632fc638e6a9220c2135a79dd3ce49a54fe1235e6dbcc2ab5ef16a8557788557339ce89415169973cef9055b6b53a7e584594b985c4722599bf357b7e6b6ef746275554b62f30e67d2feab51bc8edbb4adbd309b4c1a879f0dc707a9b8412e583dc0441b1d0af13821ea1f226aa0688ab8c3198797f02b56af070d0d251965aa28d4bf504c7b5f93e6f5b8de02865c269cce60828f269329e3bac576acad3fbf8bfbf8d876734331029d2c441b210058ed207a2f0454821d44cf77e1c877387e4d6c2b74b2ae6b5b3a325414ea7b60a9433bf071eef40c7e07615e24db1a71cf711fa75fcb5e1f5f8b03f000b7adbac3654b54f43c977f8331d8cfdff7952d62a1fbfb2a747bfff6776f200c7534b230da7be00f2b534608b384ab9830f595282182883e4e9d26b5491fa70e9d3137756457d614d668efd14c0ba3e9b75e03acab8e2ab86d0b34c2ff878e932bdd8660a0fa685b2693c9e4dd848e4c0ff071c248dfbdf72b89d27ba986d1e82252f66ccbf491944e65c1474dce46cccab33ccbb34c2fa537eb7c7b36bbc117d46e2e2938d064491229c4ad69daa6ddd5f984329f48218599029878dc5801dfb183f2e09c6b245c52dce21f71cc85877ff9b8af3977a8ad1409bfa139656ace99fe83a6cc7dfada2c69ead1680f7b3434fb3d2d678bf1cac2cc186a32c5f4113060d6f26b7b6fadb5d65a6b7dafa6cda9699aa6cd39a7c6699aa669dad4eed5eefd32de9acea96d5b0762eddebdfa40d149c9138a0ef8f88da64f6532c5c0d8300a8542a150282479a6da3e62b23ef5ee9d76842738c5240aaf6450c137eb6570cba93075cba9a33a02149cfec6aaa3ba91755491887ae023466daaba63dc90742375c70824b33a12d48bf98bd403a0521b926905bf5f67f4cbd2e115a3306a736d14804094524a29dd296d89441a8dfebf8f732b2566b2a52a8af33561a21a4dfb21e20645357b2aa144dc3f44b44ae4d460266e702aa1449c9e02be2ca78cee32bda652b494524751d04c198ddab29e520380f191a6521c2d3fc0e97b5f6ef937d0041db8f7dc03f9781d8d40be0ea33a22de4719bd858ba8078a2847bd9acfd30ff8d9e8001fbfad7b403d75130df5783caa755a1f81366ce0e308878e9771aeb44cc2479aead4f5991e2e4827a2ef7df75bf7221ad67861b7bd880be9f75896525a2a331911593d951e2ba73aa2e5cd0ddfedcf54da6ae2a2f58da852e5accbd0799eb7736d49e2f5a4dc4fa3078cb1d6a30ee0fbf89a4c26d38f30beba81a0bb7de21887183172ce39e76abb194670dcc79d73ce4264d2434e1921b4a03c5a6636063427a125fce980dbe005c5560137a2d79f548644af9f434573cb963289b5880118529cc411d70f3ee04e94767397dd4275581ecce00b51884eb212390e4ca1a2509fc318a7d042791460ea78f116138c8fdf8fd91636b841bfe2fbbe6fd50446b38d58ad563ba64a4ddb13b5d0fdf65ccd6fa2a5e9f3f9cc08028fd147d3ecb60d1e5abc1efcebfeb371031f81e467c1841bdebf21901880cc29dd8612985372d4d148073e8e7ad8a7e5bd1914d99002b4937a0933a63e88846aa55aa956ab1e291ca9f666a5ca38965c9555668903252dcb159d5514a6c07eb0a7bea2426f56aad5a5a114e6793c1e4d53b9404570e0e29273ce39e79dbd39ffbeffd188442a6524d94826fb3813569cab22cbdbb811477a6201a9482b91f1aaee15e2a6e0b6e8ed55cbdc2e70a0a5fb030a53b106447083d0c3cd55a6ae0195478af2783c5a6b16da7584808fb9a47bd753ce34c098c9bace279bc17ada01cfa1033e525708b4b15c20b1da4214e2f12207715614eecfb0011f7349631b8d693436230a3e665b6e6e3f5ad21021127a22f3676a8d0d803456662b75473de9952db5c470719675d99086a5e7083ede9927c6690f85a16f09452db87cc8e543a29a976ff9976f79172b7cac293baba32efc1f2286c09ad0b73cfd969677096d5ebee56d46f8d00f11638022fedf0f1163fc1091b3a5cb49f42cef828c770983b8bc8c67098328a97179191f4484175d548d16586a84415e7ec6d3088328a979f9191f648467f9297e9e7b0147a397613ae1875c82b4c386d8a2571bfd644b592766616a9ec94e80c2c95cea932d89e07933befe65d9128bc7237a192c3fe367ea74f92b03b42f22136ee0dd734446006b70808bf02e8f5fb3aa0dac54e7d7af427efd43ba05c76bd32968480785b607aa439bf242d7ee4d776b583e860821cbdbb026c67fa18d4b18e367ec071c6f8a2c1f504731baf04709280e8eaf4f7587d6b3eb1d3bbc536e4c7b291c69a28b197367b9d46182f2caea880817e55cce1810055598dd0e6193acb2e8d56e3163ea97f7e472975cf2922ebf448c0f06970595e624788ee9f0909a32fbeb0e1e66892534c3a1b9cca52de198e95311add23875c77cdd18b9339d6387e863e7b17c58a28f3ae5034e1ff58d5e69525b5aceea8e6bc49d79d65a5285aa91b47c08446d31f42c20111b4c62e8515b6cd1457afd1630971c65d128d625b386c09dcd6c29e7f2ce72f9f22e3a1c3f5441404b2fa10efd3800969a720997c4084fd05249c01206a08f77160af500fa7867b9b43037470b7ea9eb22d1c474253177e41d98061405035dad3acff3426fc55059baac3c4378c5d144399371b4a3f6298c863534fb4926f0201da9a424ea0e67a09d737befd5b3fd99292cc14aa176601c0d2b78d65a3ff812025ea3cf9795221d2311810827cd7882a3501fc5b8d3c734b4526251e8c06c0f1c38e0143565a810f48659a2499c18a1021e3c42f005d4918f3aaa2f93c96430c86437639c71ce18670f6fa94e89280ab02d3ae7fa9cb6b93a4ff1ed2c48de4be3d9fd4cedc2146cb5b6a73063927dc718e3cd0724128944229148a424f8ac53e324520e311daf23cd182f2485241269ca54da2273ac9d110426ad3aaa648eeaa68e484ef8485d1e2566d73670e0f5a9124c4c990b7cdd3e055dfaf45600751a56581d21e9de76617dd18e34656cf727e88a4375d4af391586491db570288f2a441d62c6d413f44a8a8cf091bac64a7698caf5e41585e45caeaab2252a4e58102cbd93f29cdcbbf46d915075cb3969b5d59c0b2ebc85a9d4e572912eeaaa29cd84ba8ae458223e5eaf17a65a53ad55372e578d81849698f8020bbe350e4ddb5abbdbb66d4d3e170782e0235ed5c7387593b5da71efbd65a50d0e22b3c8478d984c37abbd81d02ccdd22c9a44b362668c661d8102cdd2ac24569aa5599aa55930e041b37696f04b6bb57b6b11c03ad758c2bb1a4b38ef359670dad558c2731f778d25fc6509c71ffa53d80801dfa68cbee8135694bac3be58698ba43019e84c4663df94699e0ae38f90c3091fa70c6603dcbe6c7b3d361b3b70edf5d0c1049f3115701c34e0b38e56d0defeac1e0bf6453100d99e7b110bb36f5cb86de116b2a0fdf6d55b41b3b08573be5e5626b3d6daec7d36c04dee53d2cee6c084af9852abd46fa76e2ab5d6aa75db6fdc26a2e962b5e38ca862b12d04ce77e6d43026a7cc2747123e5292921b11542d32a3a4ce988335f57dc4392a9a199bf1234952461dd930ca4749ec71dbc66ddcb6711b6cabda14d68a998cbf6cadba3739c70002d75b75b3c2c9ae2aa8adb1033ee99cd43ae134ac473e9f8fa562084d4891045d04718a531c6bf479ed7da2db3d4d26fa32eaa8fe0f12a6a0388ee0e3f7c9c8de0c273cefc0648a59d9379c70fcf7b3d6379df3a864ceb6f5b474664600002000a3140000200c088583c180503c289aaf733e14800b687240805c3a9687439124c9a1140531c810480c008000000c31ca501195019cabc1bb09c79cd789056f9203ad59a3ac8b70c46a30a447ce99d9dbb71d269c6835b89406e65005a0623fc0c2e1e4f4f60c5e14afe651c890900f851013c17077cea3f18700407172c28c512623ec379e550b45757435117cd6f87f85e95ea391047972fa52af434cbdfa663984ea82ac01292e8f8a3147c4cacd2187b539fe2e828c9b0ac697fa952d8153d626909f3c41b424084349813d64a6c13a1ee05cf719e5c0e2418c35c79a4855cf61d76b598191e68c2629e743a4b471a478670d44a3316d382e526ed1df7b1deedaf1520a04b98491c7e09cc33b6de7ae11f8a6e7ff12da86300cd53cdef308413483735b133227f3d478c7df22b1dc0aa6401221f35f5a3c5d3239e0e5f8e402a04c5c2e8acde18357858a737d576b314cf4dba599e86406da5119d61d4b42df78d6e00bfe0d246202e4a93e2f1db2a41a77691ed3605b64f3bad2ae7c405c141c5d2738e3efcc7d873a525daf90152be2205251af73d8d09ad8705d2d921ca8937290ab24716fe036e13c8db3114172adeef976bd0305f873a24eb526a3cc80459900f78abe8d480bbecd1628fc1f02134ebf1172155671d87d032fb6015a4d845cb160f59d995f8f1a33044f9e12a50e000012283bbcbd146d9f7862a0e1137c48a692a9ac3d445ccd45be773b49f766c70ea4f1c0f888d195c443094c2defb387c5487d1c670a64152935c9e75c03d7d11829416e675b13469631cd6feb19cc30096ef52d961940dffc39a1119ca53d9a48e5ab6b52dc6427830999d4aa43404e3585dd88f30b7dfc58248b31050a307893c322de1162e629b04963d6379a1d5cd90ff0c721e869a0b2f271628d8de514960783e68583308a858aeb718e767cd5c142a65be21687818e1f2e848895f870e4869cda7c209861b0361533c4003630a080942d7b6bc60f4a22780971d00c2e117e1400d15d82aa446136a1182a44a1b7ec8930e2807c8ff2d07ba864e553f945c32cd40e87a9260f32b0e3ce4c6b390534d0688669f9ea734bb6d813a04a6dbdfdad2cacdfcfaf01986585c01dc0c5a50c801cc221cb19023c003a8a04e6d1f12cf3655b6330dced1a83eacea00351da705d7f616c441e8554c1056b84ad16dede116cc87d3d20c3a83a869ea705f9471886f1d1fcbf407786ddc50d2f2d47c24c079b21d76c4b54cdbeeeb537bb0684d90736c5f8ce26b10c292b1e6c9f87f7e4844ff7094beeb675f35f75bb87f3ab92aa0e515e19531769b74152e811ef527d29f0411ddda10d427d5f15a16539569674f22312dedb42d5db87ea950144163f9e39a743cb3854fb4402901cc0ead83a42d01e52af228a2e4a8af08c11dd84f1b4fe08ade3052427a15c85cdad7430b6a6a98aef8faf594b76b2b5791eb2d0a1f5316e4b380b552f5d1b3e27e75726774f076052d7a280cba39d06652b43876674d3e9419036741b4eeafd6803108cf0a102951617dcaad6ba6642e75809eb03f9b5b112c93447f5e4d7ebdf2c137b9470978c1f3bb3eca32c4f645634d4381d5fc26f7539cbe60dcbbd4ba85056929b5c57b29ae8854010de77062cf61d984124a77e10bbc3b93f8364fee6e949c22740457d116d5bd9067568b328265c81b6ef01f3b613abd597ede790cdaac896e979d8872da0e662230cb415b917c2b5d64af5e1bc7b1ea450b8f726e2d24fdfbf0f9f5081c013ea43ba569c8da274d33d07461811bd0a0c3271bdb2c61743a765c97e9e2d76815973463683fa8bf7fc29e895ffaba13d7367a67a9977451fae6dc9974b4216a8cbce8c1adb2c248049f7471b9e9691053586aeb3f08babbb96b25a5ccead731c70245104b21aab62942ab445b9ba8d6b5ab050f33bcee9d9189c3ba7cdacb93e89f101713ddb1ac8a319d9954e245b946079fa6471c141d57cd2e3bdbb409b4fe2819ed3dddfc45308480a5733ee128eca0729262cab89bfb540d8e3df0338cecb9a049512d96fbcff258e2c40faa400337da9d95d12959f250df27d019113f3d232e41496372aa008b60385fce178c9d0d3f159a20c5dfaf21b09cd01002def8dd0c3d63d14e7191bd5a219223a0dfe299b2c0d442c4718718d27f18a1fbe8ff346809737d923669f081ad513fbf5e732ed6a9078a57c52921c9d501c8168e00d80ece63f4a428a27b0dc18a18f2ef14d84e6aa754c6b36db5c66680a3318190ea6550fed154f89b0855f246a41ca749aa85cca838fa81d8c051d7c847b2f0fac118a787969c8da08197ca13f60c416db386faa5a40919d0c5f9f5d4ca24d0464452c9a2ef2c6a604da7e6e57e09839831ae3287730cc4355c19b6dc449a26c873d83fa446defcc9c844919adab189598fe376bc49b31175c8a06d5000663c5f9bf903febbdfd56bda4054b388713c5bf2b7127a3c4ed9711c9182e892108857be8a2f0c68daba38976b807828240213fa197b783b366540df1dcff02129ec995eca16e85175144dd18c787c75577222793f0793de92a861d2203158a33bda1352df299533f8b7d6beeb7f1db1c789557c1e28008bad5f12a6a504dda7b63d58b5810bcb75c2546f2de9f370b055f3def3594b5d548a42fa13a9af06253255707001f1b556cf3fc69871d1edeeec342f5b85edd627268a8a8f0a6ac4afbfc1bb18751ec015432adf733df7f8506416191f5fc435f92c30a3e053062bf12f840353e767dfd925aeee1a8fd68223adba0286015d3f190d5965145bd6e746ba2c6b5a6f34648bf1d9f9dc3f63b63074c2ffbfc6e5554b566d247a4b01a3b279fed4ac00e3bfa7706ab4b2804b3581c5217e4e008939c943f9feff68faf1fae33ee5eb49b6598efde63f3dd12baac697115d3269ff6f926cc3cc8c993a9278e42c700a57866272f19a9478d016479af3cb8bd38523e93cea4a64ef0746330267b8e505103925cd0bbf7e8e0a5c5ecd8906061d4edf29932bb71cc38cb82eada8cdb6daca01b10f39e5e3a6fe52b59ceee150e78c6c75880e2b70713ce1b3bc58a2cfb26a7b1c2f34612c35abc87435a6e749bde532ace4f3b11d3f5bf0509aa12aa6e362f9faa49a9e7354e5cbcc3a804dd7487f66369b03526e20da141c9e1dbc11cbe0baa74d924464fc3c55a17dfd44e535695db25f0dbd6091c0a718211b11cdcebf6c8d68d989c834d36707a5188f636cc29b86cce7d55cb2fff1e7c6535dca80fbe1e4a2096c7d1f4925a2281a16eb26c033ea0ecb44d1c472765ef051f1062fc38092f031fe869d01b1e29b610f8a0d188a43b70901e6b40b59b9f67da257efb08457b619e9aeea84200c8d05b534c5b1e91b766f662163130f30ad13c4e2f15b60381338b25fed84f362cc7373e73f4e33d2062da0e14bc43bb48ebdb36bbe1808a53df952b513c41a891ada49faf3b5d6138d3ed3ebd00117e994e732e036a4540120acaf4ed1d81d3e67ed24aa7f7f167ae812354b995de540c5a901632a3b00c268d664b0684be3760c460928f96e1b063920362b4bdf6d71d250f7a1719a9c2988a66949e42a1a59c0ab988fb0d94297435990696f1b4ff0b6be0a079f42531c1dd099c5ed5109a9f9c5b6b5ba86b5c8f94a9d49c38d980735724714055a6a3b188828a8575406c17d51336393425d00926743e36523f7a05c384b406d8a950048aa5a7a121b5c0db35b484d47bbd21603ed392245f45c667fe3a1f464daeae03906547442a78043a8be15c55c681201c58aa7de99fcdb416aa2acdc40beed01f06bdb47b89fe1b23cc0369e4d1f81b66cbfb3b997fda77dda3737dc4ca90116dc4f575bd7725608a1e0b53dadd815b19db8e0ea7370b5ee583245496fd366bd6f30f25799fb8e187c53e3326ca45e2c5025679f4cedd1ec83f29712a320cb0d4b0a0e4adc281b4e7d13d5ed6bff39554656c829d22ede5f4ed4648276409cf49ef2b344a8c41616c379dce419f920522131e55acd0df1f674f00d64ae82410312648406d44666288a0208fd89bac499835416a791ea1d0dbd8f9d56dfafba09503e84143d677173ebea61eb01a974dacbee61d782c9a0b32ee93c036490b45968e7db4eef66acadcbbe452cee90bbe58d5263a046fa6a88a5f0180abcbc7498b14bcd50e22574489fc373aedd7a4d2e5c6f4d0abcbae25589a22f62115dfc51fc1fec654a281ff043f0d09b5d3c238eefa959edaecb168a0a24f257ea0da85f1cd2245ef3e27c670d075fc5138815c0ce0746ddc22c27fc149e204df29494df0c03551eab765cd65afb7a063e52eb83888814fa05f9a560d34af290dc72bb688835f0363b702c7d6924753315cdfca3c8605d00d6dba944fb32e146fa8c7d82fcb81a8614cc4bf108a56a7d0d76c8a5a8f5d7bdb4ee7a9382f1f8c836d2ba8864a43e31d565f119db7a8904963ea6847b5ca62d93791bda15946b0c011bf5eb704803c656d6f4648e1689e191783f246be8e88919759b4b6cce95b0c592ea6c3fe23920309287057635dff34e13f2d354f25119908aab2a29734c0334d724643efc2183b772101112b04e00607018a768fad5e361d68be1ad551280005beb36d6768be410b5f76da03bd55c317e60397819cbb4c03b8fa9cded6cd45f8ada7792695aea7f8ffc0a0436c3e8bee8460472a60cd379dfc34fbd96499246e54b22910d1fae19a7e3a6f6d41cc277d7b0a7e6ecfb78efb1d117095700341353b8f3c7c0d88b942cbb2d4d38dcf630d896e40691c7f4069c04df83f9c2d3f7588a085720e552f20b066530b57afcca8fb50074a488a9490f25af3446af06c665067ff4a0c16f2f0976f527a3ab7b058407ee53c0d7f9ee392400973f295f230677d0f15e32e1256542e21308a78f832d171eaa57a0b9e8a12c857f1b16980ab0f9baddd33679b7a27ac2b349c70ea6bcb9c5a2ca8db597c3c997ccb9ac532e49ca5583880a32f7b21d6a1c712ef78d9d42a0ea73d863e21ac4b2b16c830cef97d6b3477439ede5616638f37ec89752235421c9cb3b7abdecd8400ae33578d46996f8f8e003c306d4ac60fd399d11a2cd2093dc9d9485d64f710139f3846b5d6821159126cfd896b35f853eaadbc8151cce6ca78fc47c96c9a117824766cf56d5bee6e48d1a30aa26451150dfa03ad1130c3fe50d545892cc3628258b3d7c0e51852bf3c82eb0e005e61c823b93f01271993395e3f3a247e262e4b2a3973d16d1dc7f1deab17cfd70513c9e38156653d26835b61d0c8d11b03912de92fad584ea8c3322624a5c203a682b6c9da1c6e2ba095e1cd974c9df1d29eede112891f12221a8f3b413cec060404e8a0c8d444679f4b0110435b42133e42103235965b59e97dd1d3c051dfacc0eb5a9198f23d36bc2c3c5fbe9f0536d538e7ebda66b784a16b3a99a016a4e286a3441b6227e61ebe31c3f2e5243f22b121f4b061c5c486550b10f6cbba637aed3167dc4f3f97330690b7bdedebb4204e168c9631683f17ba6d30e74a01918a8052eeb3584dd5b488d45a424729a7850765f012a49c2d265d9110c0fb95da5f81e74c3242e32d021e401dfbd243c32f1398ef0954d417833bdb68ce33a6a9c006aab4039bcede821eb7649b0abac969dd07f5816e13ce86e55d5cc79ee147b0e00a58516b31855f93650fbf679d3943e27bc386e7c42d59fc3026bf919e7362be2bfe7124eda77d178603d56508c0ebe6b31201368a0ce29e71c5cf2dffc322267896c2631f2c826d586482185484b6d170088a07d7f8c0e150467ed35d5afc97dd8a2818d75f56b0a29c2c040299c1e22101f46ceca62b140e86932a791a9b09c09b85a94f0ce1e6ec4208483b3b8ae70ec6f91c482742a6800184e7624af489219558bb9233440dd35f06fb7c92b47d5895df75d47ef7df5c55f4894f62ad123bd6eb467c76a9bcdf9218942c49f5fedf127cd327ff92fe24d99889b2661ef1a9c2b7d34314c5d9d1fb47264a479fb7ba638a13007d284627d8ed5537a54ff3696aef45a01f81605202144af65f545229aa6acad51027077ee923ce68b1d10ab3c9842a51c050f4f7d6eeb27ce0ecf5c3da9604ea28721af69ec6ca705152b068e952ae6c082f9c2cad2ce5f06b60aa5ab807c343c55e2e1b0e7a62ca60b004fdadb28693e8a65711e9f9188fcde1bc51f28414113f1a206cc0151fd74fdf4824105ce48905204c54c5b9642ba3169c02c84c6ec3986f0a9dc6561d36b0b638e21412814c2627a2a68b2a550c28da1018f3844c0fbe0be0c0e2b0e3d6515b1fa447d4b9e23402dd9900047cc45f569df9614cf1ad5f583f4b15bc9036c531988039b9e52c87d35130a7a79313315dcab3400f6b67e7d2b64e12fdb19281fe763af3e7fe25a552837c30d4ae9bf6f008ad3b2bfab26285d22c666f090b1c4512ef9946db317080242b6a32dbd9c5a7586c1690a175f31bc048e2a785fd61ee3e7aa14f674bdb26b3f583115b46f103aec26d7e308929ad963f3f3676f7a29d99a202ff1b0f0302dadb400eb2bda468e5f153634003e27e04f7f75bd627b44c637558d6d94370f59c670f1b068afa4b76ba28755214d4e74f39e1c39616d4ccf0e792bc00542b5c7bdfc60c605b68f56f9d17ec37811acb953994eb4fd597aa100cb57d7d81884a2e800d9696d302400c0b02e5663bcab806257e873e47477ef5c750c787eeaced4e6fc5897389d0e3d85eefd33403e05a05cd0f1ac75ff98e5bf6ae1bc87c524256d8b95ae430ab90433a7c301a14381d3bf8b0c62ccfe1b7af6b8466d9ae4ea74bdab52d9399c74ced51a17fc72f9760dde54f954761af6ed818eabf025b08d2e632fbe5b6e8e51c03a1012e76434015969a3aab33d7e5514a4a40748965ee78dad9ba168f8fb8442e14968deffb345a4d1c20d523615d2c20d5b9580c3c6b340369fd7c6e46d7bf8edb11fc5a50056018f50539f44a4a9152e78859d45c5516905607bbe8a80f857d8794ca0deceaf6ce1d7ec4072fc3d2093375d2fbfda23a915dc81f51fa93b4dd6bf7a055cd4cf593b4c8370fd5979a3585e9e1cb18d2ce4acc7ea1bbea4cff87399e84f3c44c49a7646f102723663ec9f94cb1c13e240e20b83dcd22d0da7b2f7822da2396adadb180ec4351916f57f905e6f83d49a044a4ce3d1511c8248ab141db53f00f0be0284d84034ab1cdc38a0603e35735becd2f59566f62be5bd5a318899fa38e93022e78e15a030eab8b42bab46c245a883977004cfc55f81431d514248aba5ad10d4d86a1cc2422ec9a64e59976a341d1556145781f68bf8916a0abb7db1269751911e0748a9215ee37af5b9530588a6b53534f3604cbb2d97f250b25821de35fbd118e7d49198d2536dd292d7e4e58b032e3b332bb7524720e668e222df87c49c69da891ddbeba746daf55850b2cefdf9f790a03e1014caa6190c6cf33873bb50f251f31b4960e9ca449b85339130e540a029d58c173b52af15d9f39d92b0b47cb85f3d707cb7bc030ac1ad4375fe7226701e3a99079acc0c3d66adc4aaa2b5e46d5bfcc6cd0321c8e435a7ac2000f1514a657414ff50a07db0a299d8b33a9ed8df27df341c8bff26f163134f874d579f63f053c92c12d3db2ef8ee728004e504cca5bc7c9909fe4376f6a5750ca57291039026e527b365748ed5968f707c1a9565effe0e0d5641cbb50eb0c6c808f5f56d2488b5e9f107a9edfa088092ddd445ba7816d8453392842c893cf9e459f45f22fe17c92130f30fa5f0f28deb44c01896f623e800f4c339a2424caa6af7f03644db8053ee4e056d7a78819a93bbd808a2e602e8584ab363a5c31813706079cd128bae2da7c0841b0048f56142348df9068c41f458d6bd30e4a81eaf1e3669b888dca48442c9998db5f7a1a8a18492ca21b330fc8cf2ebcd40b272c596f62f8dcc3f667e4a954b3f803f931bbea96f3deb015db8b44c2ba3fc5aec780903fb245a4e53b0f6d5f10f6ce11f87ba852f17e24ac8dd94c949010dd83481d4d825ad3ca81c7800fd898a198749221fa1d92a692bbc88f57df2c685dc3941da53cb836e3925f9b1331863f1c31e88f4f6022c92c4df7080a85a01eccdc42b7260b42b86a474ac57aa01df20e4172fa66aa8f00c2cc5d81dded9b5a6100d94db19866ea16d94e846d5081d2e7085374c6808609f83900398738ca8b5cfdc8be7f85640c8caa9479f5eb420920095c3e456c573612d30c7982c285aaea99efcc92dff9a02a55e5de286aae3bb10458af58ac07faaea8571ca3228a48c43e1ed435708931d690185d39306492cf5a92f831024d8b98b95ed6778ad87d1a339d342e4dbf2b453fb68f394f612d365714459996faa1c8501b434bb4c05eba7f219ce3ee5476eca2fafd1f125b0133800d306fa0a5b321685d90aeb65eea0d43e6b578ea6cb6b089856cf9a40e0c140e934c7c16a17a72442a7ade5a26bf24eb575fe7f0b494f13343204dc3231e2636f3f32cf3f3ec016c5e8e67d0370cc90a508c1a12b04b84ef29df7341f2789915f80b14f482070ef32d186e79176690c55d22ebd6b1f38d618018039f0143904d00e58b6194914addaa591834585fad4f415b57c2522c906165ae4d130af07148123d1a2a66cf992de6a8139965f74338cc0717c68a6f95c7d64a39de1bb3ba6fa4459b55de5e681da223ec9bfa001e731c239680e72aaec60f59b23ea2de9a62008748bd691ef71f6b8b0f7dba190d7e4a0754a2db24cb5c44aa899c306bc7cf84abc06d9c8e3a27d636362e0f765077b87d43adc7d8c8f0cd867b6ee33146922f84db8ed187a858bcc7b8d33b87db2a8d7a5917ced41d7a1cdf45523b768b70ad2d65a3d4026ce00d8d0425ab3c45b5e520f20745b8919ae11613b43ed26b42c1d913c26db05291608f8720478414852b0bdbff9519b930d45c8ffeb0fb2aebb7b63ef5ad105618c28b81646bf9f79582a2e90a63142f3bdc90a1d1c4b50424a51d99881aad394a21e7512bb3fdcbcdbd68bc8b3220145e0dd5e6295dbe0c732b91a5280c025c07083eb3da768636f141404b6f7cf5425318c87fbac182809845931949b7bee05425fdd7af4fb99d27ed2b43b1dc4eb8122c19f76a828f1985cb9bd1f0cb025f9030065ac799d062293e8164ec4e621afa53129a0d58369a45a05c1e15a07d8f9cb334d700afbd242a622f903049d410a71a4d09161bdc7b9f778d466668bcdbee39e76263a9f1281023d7530ae726b0fc6b60db524459a62f7577599000bd7a19eee8ffa3516281f0e6ecae2f78475621c31593a3987641bb908ce29279ba63a0bbf48c37abaab2992cf9e75faf6e1d31b1b6a2145efadbe5b2afeddbd0b642136261724a66ec0737fb30002df8d62196344ac1bc47aa191e8f67be6c3aac322abced6c04b40b20a7e664f2eca39a312f40c8a98f57bb989b4addd4cc4d4f9668964e73d3bd3f64544f31a9a2414b03bb73d3027745a3c1aacc2eee0196982ffe91384f12cd3d20934311741a3bd8cbcd3236ee22866f4d1a0feba788410be4a604daa932be5e4de1db09907fb00ba658fd62c6543864477b19109f34b3636d337bcf866de0f558a4645b40e39e03ca0e546466821de711b848b05ef4188fa7a1718937ff8f7e1c66b2baebd59fed23f8f2a8f4ac91d8dd4ffe2472c8eef9cbbadad6239ba3a90f41c9947410d88ccc02ddfd78dba3e2ffd2c4d3261bcc40f219526b94abc75a7d03f03974f03a296b25abf56d7df5583afa4c375b7a7bc817c7e736f997a7d54c7283456291b6dd84ae1dcd129a34a5fab2962aab008ce02dd3441381f59dce84abd357b99b7ac81d5cfb1d7ac640d87ec553cc2f70562868c8c0ea68ab8ecfc6e839e8d5f27c6a4dc869ce08e500d2189e5ec11ab94f34a658449ee7aac3c518e246058235e31ed404aafbf2ec388b0c9692a155f7371f4e9e1f04b105c17a53980110de11f520b840a0ac8e1bb7abca6a09ab71483c00df58943dd8a8d19388aa07af10a89ac8b4194c62b8685174a6e75c7aa1015658437faf040530a7b01a372f84131250ec5d8cc025ebd341d1bb99fbe012e4a112646e5c2c9914093cc0e26aa3c4b834060146bae96887052d1e346fd2b582ad578f326f8fc0a46d5f12c964f3ad11b8229fea1dc50e6c27dd54c8fff4c71827b119c481e92c0ff4010dbeda115695dc12b0ba8f3ac4387e3bf93717b738761ba407f13f2f6faa8b9fed956f575051850935a2b43569ddd2ce56c89cf6d5e6f73b1019202415c87274a887b3f72c8bc0fba3364d5f2517627bc9d1bbbd8b5513033d331ef62510678137d1741ae742ae0ecb0f4d3f9a32fbc553c88bb24c06a94b1d65c1819177f36da497235c3519f78548c8017650c53bbb8c1cb69cd553ada0b130c065e0d4289fd8cb4bcf155a95ef04debbfa54f5b9ecd657722d821274ae3a9abf45854a5a67315eb37429e1463ec5a983bb690c0666a57c61bc3053001ceb48643f758c8272e7b647d7377b9a76881f07b47047a2bafce09f25865a4a953aa797d4eca2d3a485819759c59866c39a3fddbc60e45b936f7562fee6266852b8446e407b6fc13e4fc60bd94fad290bacab790884ffbae472c8443b08aff302d19ef11be196ed740e2bd9a4fcf2cbf9c0191464c2671b2b7cf943de2d07d6c2b2d1aef897e6e4d6ee1dfeef5a0397b7ec779bbf021ca32abc3bef9f09e14212b18abfa32282b167e47d9d0f9b34393d698fc3379435a0ccdd04ea3bc483074fbe754a16e1eb051992efc744ead7c51600cee60c85e3739d995bb5aab4f38b68052ed7de91ca2d8821451df98097330e6a357aaff8dd640646f08de61cb2b0d7eab089b2cb035b91ec7fdc2012b27958d1f281d3e4ede26cef5b03942937792a5f671778673f9c582c7dc6697554e203f181d0aa22896e488b5595623784a65755f13d05571fef35db71f4100b4bc95fd15a30e8a8f82d343d197a02738e0a6ba36d2c5437a112c3f21aadad6811d08641fe6d2609051290fabc58472bbca253ae651a4ccfed673308a8d5343798941e07d8b4985dbbd484fa47cb72ca4d7f938faa12b0a5b025eeccf27632fea2a2864a9c58969069a31247a23a6e7b64d10b3a75dd798e75eb4b2c597117d04b54a9be554614a662a2adea9d988bcd770a684fb8ac9072caa94e99c7e779fb26108bb36bb46c18833e075ff760c80d87e5bffe3fb302164f2cbfca2be87d9a90eec4acaa4441fb36a4819fdd0933ebfc06be6c3e95341b9af549f4ecc2d5e186bd9abeec36fc3ebc3bd49b189da0ba6f3d725cc57f559a4f78ae629abe4099d87195e502247df521f079cfd69305106092f45a4ee8e205257f5b58a3cc8d76c9a6e43a7a510a0b007c857652a2bd545064d41b9857e5e7d59920da89c03e6c8e53c90d23a02ee29a4d84e20f03ea94c275ad16c4bad85fd02e8cfd2bf3aeac466ea80a18975463a79b728ebc87ba0b4690cefb5acc8c5c58f0bd044f7f35eae1503662fe24e0c5644484604e893fc87f0ea2a046a5ded233698a6f5cbb5433558355a4cb4c0599b4461f7a8223d886eee66d65c8fc2be5aeea14c6153d921084f5d4d0b5cc93797266451f19545f0448b4d062d81fba286b1daef345dd079b5833506166c86edcc21804192555947322f1b436b6fce06d7e1036ee3fa72f1318f2636428b4516e3b274e7dbba6eb0c279113f86caca6568b45b71a16ef97ac789edbc7822646b6264b21a37a067608e7f1073af9303dd4a23080c90dd8b70d785618ed5a9dac5504ce23e900f355a6e08a00ef1a1d3df5dbc91e6f9fb8c7ef847cb41bccca50eabf973f69180c636f1a9408ab12baba7c8116d6632314fe33e59e36c5338b7f7633ce8971530c6f7d68a82d925c24c5cf8222a163d70842f1399ef431041fd9ebc8df7328a17574eaab139f3f9856422c8c7403bc736d8ea5c5b6b4ee12905bd15664a99e2d925fa1bf009d4fcfa3f20b1517ee1eaf429fd4c2f100995f37cc324acc89d71756a802a023a06592c98dafef2def1801033f24aeaa78353abe4ec30da0c368791e80359088c0e0e60e126f01513d4666c8fe4b5d17aa3eeeb5d857b7507cf24e16badc92a64d789fa26ca70b51a3408912ba687d396525f78e38b159de81df7b11d9de73698ea95db309355c26a779a29be4c8711cc78344741fb23b4cdd1917911c043560493a59326652106f401166ebdb9c39d7e384887b8bd76d0c3938f082f98e3450d04a4b6197ab351f3bca83f49545962d9215cfcdb2d390875f7253f5ede667fe10f8ae85f30fa185220e05c9d807496c4b1da39197268b537a3a4ab43a8503fd28c04e185587fd9548c98e5018e1aa589ed9e1399a9e0798304edde338318b299f18389ede6ad25952de4d6f404ede41df1d597b8b9ee947c558ed698bbeb424bb76ae715f4959e09d33acb11e9014380f8859b894b682299df6d9f2877cf93518dc7921ea150d2788ad26f640cb46aee51a911b6246905aa3a81dcd23ec01be54a0a036bd019118a24f76b6ce63f5c5c2104ee00cd40ea76855a7e980ba3007f78049e3a458d07b737691b9988ac6403fd2adca49a1a1c8457d14285f011cc6bf3e957aa77faa1c8e6826f9246805238b78d8f732a822c0a746190de1cc83beff9e34f01b20d8c840d944914709189981d07a9ff41d4b66d3f15754b3b7fc6cf3869f513bec81d1b67b254548bb0b2d3e4112544500c251828c6799da2c340771e02576af8b35c12daf72a828d4a94fd8823997453457efe048295bd616239eb285c258917e3d068f3a2a2755c621f7087f25b37954f075bd04df240e07c827569bea50debbc0b80279178d68de753668de547d20e950fb0e5f191e0728e7d748f4e9aadfc4ca32b1d873f98073c858d20492986e6bf83f9c8300f3868c4befd01e9efb7becfdfa09d7d3f768f83095d5d0386173f8e5b6868899d49b9f15668a3607c5464962a10fdedb6672e6af9573afd079fce05745a0302b3ea076356f84aa51314eb051bd8b780d0f895fad54183fd6e5e824e241848c5bc73e325212e8d8e80274919935d8bd97ff11089489f35bb20340083bab3e461c184f7c9ebe88dc92674240422ea85ece51c0030dbf78af41320a7a50f2cfc6c327caf68f75995eacf7a495be225fb7dd6acc6a3275d5ad385247703df595c1cd015e311fc1a9ebef6fb211a55ece646fc5fa8448d1ad7aaaadddfad2ce37bd13c6357c47dfc7a5c3357f74921ecb671ed5af3d6a86efe10f3ae44f07509c41a67c85d0a750941fd0abe1e7de49f4c42ae21e625f980290823f3a8912a3c4b1176a79ee2cdc41316908da32871cb3450667a8fcd99b2e7855d3bb7d1c9645dc68421760f71e9f74997c52530ca7ae3d5187b673b0ab725447837acd0a3195b51de626a27296b606ae8cafcfe0a57ab8a75d8fa96d4f2bf8fba074971e63d96dd359da2ed439dedf960ac02d1ee2a4a5088a73fb502d3617556a1a7ad11a85131480f4ca76cd3ea480225d1ef97625e370ae4df9d00956ea4bf1d5b32cb37a241d53949e22cfd9d1981e5799204f9c104614b561c9faa24cee688365b60b662df7821acc80e4824067f34129560c690e85e4b51a0ef2c4b30bcc8f949ee326ae84c38a2fc13184840317a8a5bd144db2d701b4c85dcd01e4b010b0e0e707bce76b2fbaaad1df162e870ee0bf5bd8ae55d316c996246aa8888462f1d335639210622e00ee163b2f85230409517006f17c71d577a91ade85f3e999ba48783a3fd329bd31d8f79cd572eab63f717ca97ae0d140228a3e732301d44e0f39f20b90cec76c378785d7682a1646f33959306d05e5ef42200d94750dd1d41e80ef1569c95352dd00a12b919bbafd43333d9a9f296a384f43675ad617eaeccdda12c3027e52138402a27dad9e6cf6e277d30de4723e951275f5219d2fde3ad67ff33fb5c0bae49a15c1e04599afa4b819c5d715731e7a2c7bc6f60e3d800f19dcf2e0b428350a0f6126dcbd874b328e58974489f22b8db688c32a334ba785841fbb01ca762120b8b03bc8418c7ed2a1d433a920a2a98b68fd991d72f01b6a4d7b4b2fa234ce798cdc1a1784db392529a01726d37e5c844337571ec09557d704a0aa3bda02a76bec69491056f0b915ace57d9d8959523b9606c3f1e0f3ed7c16e3cfe92e29c450dc528c41cc76fd6264c1743e825a2309c7e2616e8b8cc218cbeef538f7f774afcab01d61a61807a34cf600698737cb85299a8bb59230b221fd45dc3be6058d81252aac3b12a7905aa70ea439e84779cc8b2413746b2718aa4b0a65051bade844bb70b1d041eee6bd46ed7ccc4c528a808444a11884ae6242748585ad5c94a37fb640670cbf6a1419cbf2740f46cd6094cfe8bc3e47a1d86be1def0b70287796f494d6775be2a768711d31f60d75f6d9a5a060d2671c3c1d7bd31e486c3e25a2f12e254a01aa1f9a186379bb95db562f27d5a78e01b0ac8cfb137d8d559733c93276cafb93bd18a44670bf4026bdbdcc29c3951b2b4cea3b7202fd974214b6baa8a47b50fb2b8a1044e8b64fdb72e4a7d287eed020a503f424b5072d709bd8900bb14c5df53e5fff2f09fb6d191465a0f0159e8cf6c2de04a7bb4f91e22f39dfe78569160da1d08a8ee0a91e5a9bac312729e14e6abd410f9161f513020ff45b8062974000d86d5ebe49d9caa04902ef8059f6b7ae509ccd0cd14727a266f52a6b4dc207f40b25d06b561c4e6cddfdd9803ef170ab62685617ef968d4261eb95c760547d4dd08ac88a63d189c3306334ba9a0e052becb1d17c4f86a69035ee67ed8e788caa0696effeed7423ac3f11f51cf28ca4c3afd36ef84bced048df7452e96dc952d25655fbc4ba895d4531434647ab108f94e59d5a242cb81cd96ef84279803a431c10241897e70231a219b8a6cd4731bf72d50523e94d0a92403bba3d7e1917739b01d05aff550b6b089b8b849955c93cceb29b31f2983351f84653fe1b84d795732a08dc8f882250643379785b3c54f732452bd356cfabdc51d7de6f71b9b2ab3bc9e6846413cc48e347bc573025e8814638fad7ba6c76e9d7feb325b4f6adb47d84f3dedc539bfda7e96e822a1ebcac3294a5f29992949ea7f80e389dde233ee6eddb8e0f800594ede7f156ee3ef855bb27b5fd4fd9af05cb24b06e0f8d4cf468c33fa8bc64d46a829dcb195dac426ef3c76f41b4ded3203726587acd0e57e9f54fd2ac383cad20aa20ac3f39cbd21429f7adcc613031e7c843ef68e38f312f3c119919a53f298ce0774c7a8fb29f58a4f0139f310b2fe3c1db53560953a8c49ded0a702eae16eec3ad8806a440fa1a80a5e8a633c144e8c9c3367687f3a19c8088cff8b8bf64c60f41cc47810f1b3c800230219d3eff359b1af5cd67511d1da08949e9a8cd29c3776c9631e417b7e88ca0c01af10bed1e617b274416291d5d2f4fc24d8d0a177c988c5890adb1122b73301475001a74312a30d5e0ccf88da90d4b69f8be88728d0023adeca9065960946b2fe65ec6d911cac16c14434b47c63896d95b0fc78790688c6ff258bfc27786fac0d8b6ba2086bb674fe833ba196e74cac25060bfd8db4c4104ef2193de2a2248ab07f91bf69315c660bfed13e182d113b2a80fc5e487639ee5a19be9036d30b467b43ddeb388852f45893c768788a31f923bce036a7eda08293e054a14b8680575f181712a36123dff54c604c9c5a0ad7e4407358f7678f2d8fbfba0710c0ea45f83f69004caf3d386c28c2a0e39bc05452041f5ef4d698a5ab076ca8121bed01b943c7af1c844e8ed2448d5ed96f650dfdb1c70b1eb38527f0c41ac3e20caea0b97073a03d5b8e28537618d2bc69145c7a941a2b9f787222744f856439c3750f168f77790401dfb3701c7558da523af1bdaa13289075016be3bd8c12e1c3eca5068a3ca6feb7007a0060f8b83b750df32ac6891b05ab89163ea4dd8b0a3c4d5974fe791dbf6a4495808ce28c322ad0e9afdc4d44813c6ad48f18b50cc36363086aad6110d203581520b08bca7435b6e454c5db160760e260640f371af78acbf2ba3a95be60025a92f94dca9b86881b2452ae3777191c33b9c489905d029eb5e613fcdcc71fe1e651c45b5cb83cfb69f767a3f7b629646ebfde5dd46915f303b284dd70503a69bbb00b2eab9ffaa719b1ee30db2bedcc884e775c4b90e8c58f7ef8e3c0b492665d6bd191a95d54c7878e92de721e82bec3de5903d513ad51bea54e6457afad97c2ca829c281c97d37fe60739401b432cd97d285a0245c245c4743ca17b676575d955d61dd729ee3401c512bc4b686de02cd55facb38abcb4f317fe50dfb0705da71755cbdc3ba7c989dee24e1e44a9406322acc5aa97564e5652335f08270c17f68caaf01c0324ac892d224e3cdfba8301e49017e38249bb26cfcf5428b579d33653ab50a44cc5537f9495ca99dda75ac8ca5974dab538e92247b64e2d192957c211fda88bd871b95964b9d282d7d7727fd785bf5cdac6c4473732f3510fc33ac516615c6e1b0f328386f714aee5e5e539e4bd5df05a775260152ef6c595708f2442c6b72c9c6f1647bc60e51b906c17fb8849fb29bbf7878a2aa00a0d23256f03e532933a5e8e8304694f8ff4405b286694f3f835debe5d2fe3b2819d0a52fa924ce3f369181793aca51d15cc2d932c2c2adeb4c416dfb3089b8d244ab9740d4a8d2a5c5bc50a4bf71c1e14e120c5b30ad5d0fb341181b52953b67d9fc50ad7b2f1f199510d88e8a7517a41b6080b360840131d6bc9fffd4739090507cd4edead665ff275eb8ad11f2278c4dcfe4ef1fbe491074b146b681533717458a108058c15dbdcd413684c52bbb3138c7caad85d928965162f428eb59537d9954ecebe1e24611628305af907eba2a29f895138f64253c550aa2fcf41b88dbf556e0a54595f425feb597f31cb870ca46aa4c0b82d7c9cf4d33948b1b292875734e5469f4d4bb4a7d1744010e438ed57f5abc250711b945cc850bb591b63e1a8f1598ab832ca63fcf00acffa3020fc43ab785137feff22d98f31c0aaee495fa28de5d4876ef4d98970fb1870cba132b81753b74054bdb08c9fb85325efd7ff751d61d9b0e2536f01701e1322a4aa9e01c00821517e3e3ad0262c2d90f6bcddd7b9c23110ff93f5fed2ce345faf9b093c36b1e7419c9e241f4a6dd53066df76923326ca5f2a963cb91d885aa8030da7bc8497bfc1c2a0728608417aaceaf8410b5916aede8f6e16179af4729bf2c6a747d1f54ce04d3fb7f6a538acddd73478501a4b371c81b6d1a5f55f6dc477ca9dab56eee308ba9712d74839395761563fea2aeff298f1b34a57a1b0d32e065d7eca75631587a805b0df275b8b263e39a63c5f9a24cac358f813a81ba077b763beb4c577bb137c54b52c5042e26152427dd934389ba92657db6fff2fdf86533ccbc56a0d2ac712b034acf5b62b17043a787fbfe79fa5eadee7c5d23980411914326335aa615b84dbd41442093e104367305ce358d1801f9b8bc72e4eedfbf4693079ce6d99e52004cf00d25e79006a5bb61f0b0a2e0fbf038a134c4c26fe655dd4991da345c6a17f7532305665c11bd685716fa1f2640d607d801a258e7f59d13457617f80fa3e7f44b230b9491295786dc29dee4c4db00606f5585f2b960887408acdff2cb691a34878f4426144629518cc179ea35173405161f9bd556904870d6ca4a1e2a6450f654304b1f0f3239c52379b14af3c91743e0f3d0583513b9175a7d90545115a6f377a3b149fb7d31f4f8f380ee048a4148ad64981cb7e28dffe7cd5ad37e1f3ad69ccc27ef16baf1b5be48a39ad4892b7ae4747d63309bdc0937b591f0b1c95860f8b6e693afc4655bc57966e11888e5f6b3415b8571bdd0fff799ca1aecab9382abee907847a4d2f23951e8add10e5a25f526b959832520d66158cd41cf3dbb1fd8de2108c1a7a6e8b759236b9647beb240e39a803f267cd92ba0487e11ee9b5e94daa6002ce3ecccb8be6e3ecec6b1f96213d4b4e2e849add7fe0337e846ad8e2ce3515039dfe56a4abe6e45b1cda8c49d2f3fde0d1b22e80f934c5d3184baaf040760bb539320cf697b2b875a1e22cec4f14c3b4b367fb7cbe160d0f829dbd898eef4bc825f38c06c347411d03354aefe7d8b22e8c87eb0e5181542d04db09f7db538030839481a26ca10866654fa04a09706e580a24678132cba2172739fa8d4d2b089324b99ac282f786fa660aaa1346fe0972ebd510de75854ff6c446e6c42ba56d4fe3e059cbb0e33dc34a44c11b9d582b9fa7ebed792c035e5f68f88e9fe7af6db4db332555abaafe4453cd568d648f7dba508af82ae8b26c92552f80a07b0be8905a8a400d989e9861a0afab3932ead7997c5aa8e351adca49fb28f14d6f97b55e0bbe943716913dc250342c65f78818934ebf8b54cd60a7f499b2039f90a2b65060e2f1962636d86bca2bc63d8bc2218da40073e3db9e629ab6dd6cde2b93e27c2812a2a91e3c21c34d39987cc28fcc3b614612dbaa962a58664c3fbd156e44b5c8285f736c508e1b3e551e9827afa0d90d1a9b6a396336894be25a17d8df907809c662c75f23db7179b91e930d4f2830bb030842c9074d88bf8e1a5c724f2f732a187c151935040c852e1136958b52277766c20f61d3dd11734a936b0d56c445f315f8b764e2c1d4f9eedfa4005033ada7c7f84d1e7f22d66cb20f66bec89ddde30e34aa0048092e893fe072768b6aec9c3290e9af31e2a9890d4db6f5a680f8ffa35eb1b95058caefbefc3064399daedb6b391a858eeaca10a74f491817fe0a45489a9d96616bd1841eeae2b76020a3f120dec08e7db4a39127f314778804606d6890313f341d1a8c19323b1b40e32cd3d14a22ca229ca1004081737a5e08fa5fd2a3c5142e77dce13399e796b6836998e4ad6af82a86f2405e3c8b81afff9970b6638026f74af89799fcadf06175e398c57d91d6365464cdaaf9ecde8fa3ce4f2feaab3f2b31b1df1860c5a560f21d4df8ddf46d42ba573ce50542ad11eccdb5c280e888777f00e81c9a91f75ccc1fa75aee7badf8d29be00d36b467815222914a4e0d9924c34da880001184fa2b2fde4cc638ea62e81ad96de11942c9ca02adaf35be6aebdd16d8ab386d13a8e7b5cac25abe9407f451f9a0aca8c7c45b7dba74a6bb49dbe831d7c0174599c621c7aa15c68d4aca456baf33df589fd407cc8fca1c655a089dcd5ec0e94b6b3f1942ae2491b68272262eb02bdb6af120e0b1545284e06975fe49dc1c986490bc052e3043cb6dfdfd1daa5bdb1c6e375073e107838aa8b53c79ca75125c3b94ca35de68fb9e075c3243885d708a156fd96f434f952618aad78cbc7f8333f8737b51686987204cb03c1bc7cda3494669f3e50c8a210251d71dd7f8cc4c32b45b8a327173615e6575b13ad4db2e42e6ff42d46e0dff550eadaf9a86a02244e64b47a7471e5d3e672dba24662bdf5c56cd9b7bb0ed8bd04bd80be7c5878e2f48a35641c35658a5205f9a53f543b9748fcdb55d313a2429e6c29bbee2c942ea144985f60b595688a164dd80ffbb46e42928c10b9b42ee27bccc863a9428fd5a554594e69df39a9b18a1dcf8338afef91a1b10eeb3229bb0c6efce1787c76f712891fb2dc05619828b0705bcd8eb2ee2a60ad91bb980da500e4185dc7d241a6750856dc0be4cabf360a7edaa2add54b45b9c538273ba6a72aea7ea2283a968c20b8e0846260c8fb09ed81e76b494264b4f79a40aa1b6adf4f5aebfb5d4ceefa42c82cf7708f53c0a82442c2d1c739de6d258a2aab6b72fb21d5b3399c782b4432b5843c29df2162bd5855461eb679def39718a575cf8da672405216dcf9372d6b0cbf2d879951ac8206d20c7aa60f2e04b093b706ce346ce1ccafa3c2cb8ba01d7c04978bd955589ea0697d9f9c1864ab15eea0f5aea3ca59f1979568e01021fc5b06fc1bcfe260b7ebba5a343cef7976422d00b2b6d658f133fb687fef38e4e477f76dc2f850f921ef443f1a1b2598e3f7741deead531fb9618a45d59018c76a1a0d5d81275543b0b3d2f7e72761246104312be4f1176b4c173c064bac8afb9d2e97d1e72dcad36b61bedc9e356d890a23c5207216632b9c99860eb817e8e5a15b446e8c5ff62549b6126460086590f2ecf826e9de37f8c08d8e2d7a45ccd24f26956af44d3c7cb7f4b196b84aed952b905b25145dd0a65587056b1691e9065dc4cc70609db79f917e3573db2b0e203a0862acb69a6a4f429d2856a3b00f4ebe624d1378f8f031b5138a9fdc4993a273e4c3f0c68fcb52dc90d4869469ec9a028c7e007f146842155608497994d9eb2362813add94ec625015490539c259275a4389d71483ee688160682f14616ce17e51ad67cdfcda8dc2d09a551ff5a2eb8b0b2764689c9c817b0019209ab8b7c074f1f9de15da1b52d3ae441492e763a2eefa6e40da5f54bbe76843c20ed692cf6fcb6832e52547067d187409fbc058e540503b139f8c1ba1f0fbc8905d6ccbc0bfe08b5d71137211755f4b0868c8cd9e96ec777cd5555c5a994b89a4a92d5eb66e4053cd4c34a7b6ecb1f54daeb780f68ce0623e6381352837ef340c6c90204b77ab5ea3403ff6fa4c72eefb8359aa115010f4faefd6fc8207cb459f02d48cf21ead338d8d0e253597abc2650650b633b14d2895fc46ab4461919a4eee67b48bcae074ea10b3ff4eb8748473e5927df6700bdfdedd417df0cfb71aa5ecdc3825060fab3a2f940ed1918bcab7189849080870a33aa010d9d5d88b64700da39c61756abf43f440aee45e1b12d883336a59048c55d102a9d4897ff974f2d5c41ef3f7aaa24fffd872564c96d1e39ec279fa183c1c1fe6a4c29821b2c4debdf01b20c137f152f96c57012101ec5d6ca4980b59e626ff23b703e3e61291dae24befaccd92ba78725c4b6bb959fbaadffb51af5267e47748f502f9addf2896a752a56fa026d6041ebf8ee04c665be1269ad9085dfaa4f3c0a6573a20234f3024ff07e216cef358d86a4e7281863f0f7205e6c50a3efac602bca0ded81b7fdf2ec5f83c8b08236760ee993a29d61d0025bcd0b13f551e853ab651f6039b83e3b5873111f7fc58d773b46952ba011bc0ea08de2a76b8df8afeb7925371f32ad08b28bfd635c84034cb120e2339034c36278d4256c8b9a770be440919af0bbd3fb976a37d66474b75fb7826ff34d88030311aa88ed27bc996aa3d9fb4877f8884468cf58f0765a4f69ccf148ed6d0f0c6749a77c2814773d8460d48122c922a5815453a371d51b13aabab13c10326b8f00d0200aa70ab92f6e9992d6dfa80287fb07989b3550446caf5af40dfa2012c9bf3e6021811aea1dd308049da641472d750b17a0574039b9974cb5712b442530d0614339f22bca784c99bdcb81c822d71a86fc2729a50923a385459c58b8248238969c399ad595eabfe0a9d81919729493f453b57bfee056813cd6f472283a37fb3ea332129170ff86634d9d6d1283bf49ef410664d5b74ee3f90515b053ee095670be9a7977533d921a49635284414c8f54f813acd9f787eb888fc67bef318979ecb0da6173aae06c89663b87d7e1ee0e5658db21a73428b34867b6c32e99f1c8073679dcabd4f0b01fb26a15eba572a3e0cb1bd9f052fb0925822c47ee1f142b33669bbf71946165df504c0023cab0cba3b0179c216f10a32495fb6d47ed2515caf779ee5f368fca1766648f21439ae37e1897beb862fe5d7b396921ea7006d995cca3b3f4e32b3f9e72063afb74ceaf09c10d431a1710b8a457c9c4672a1deac86076dee177d6dfefbc50de6a39cbe63c01bdd4ad160e596c443a046d85875d20889cefbbf22e93693f77c1939af4c3145ad6413f759dbd0e12851d3c243be8cd06fdc531a178f5e7c49f81216a72cb8141457c02438f05cab66e9aaf602039c5d35d598214be544ed1a6b0f9e4409717a018ca89a0db262cca67b7edeb78fe3f61fa8ccd1e4fcbe8b06f60cbf6d24825802f5578299b1c59b7f85c6fc74b7b3285705aca33540d31be0b49a6be336d9a0bea357498afe630d9eed768524507ae8ef8e7f13a8c4e76e9f0322f58bd5bec62e42228166396ef2abb718bcf14ab510451c38dce7010694b6600c01ff3b8297c62c943fe599936dbf8b3dad21b38f5d23d5c32deefeaa4beeabdd96c25d3a0975782b10842708abc704a2e70cbdeabed664f60272e622e750411e405f2e9d9d536374111d6365e42e8c6e14e06260b9658dbfc4aa13f90a8e01d1a2491a2963fc9a57e1adf9baeadc9a7ada8fc87ef8486d6433c51d2dc756d8be1e81c7768d80504cdaa705f523d6b5b57e83a003c5f7ca27fa980d75c566e66286e1c875226556544a7de44e75a4604fe55662c6b52deedccfb95ad6d0393cf047b1b22055e32a817712b2d64176348b55af0ebc6cb57ec003a93822c35b935d8b26d6f9739559ac1c4e8828999fb65c328b8827e50b667ed1d91695ecbcb189d99ab750d597f4b3d130fd9b6a5aa31c1cbf0fd3d139de71b35a660671375f605878a9e1fcb1f67a792a56c5b3a107ce145edd0806d770ccdb60dea7a108c3c95b66d655d0e1dd8efd58d940cb1096bd627b94455cd0b45a4643026a392f0ed9dcf65b853ce11673ebc36ee3357940735c90f239711e6a008d26f5c511e1491afa68df6186ce53045c3a5d0c19287f14822461b897bda7175c72ac639cb7407afd76c9cb80e8c70ee960cca5117d152721495191e466076068bf2479be07c3bf464a3bd3bdf849807c13c5209e7d0aa600374810ea5bc5988d8377abdf72eb2748165aebbede94b49ecd0c1950ded6a6459d19968db5e21571a355935e864233456a785c6b7827f066cc2b87519efa4bc3bcc12f2e9ed4e51fbfb60d1f6b78f8761e0b23f0e2448c370043299f6ea840b2fd5793777a7193947b2d16ab19be4d168daf98227b67ea4a31e9059fe1ca70eb0480e23f9f01dc468522d0ef37109e73f0ae4ba2e2ac747af6cd5c07d76e3c7f3cb8e0b5eb688964ec66d661bff4ab3e90a98a458e6998fc171cf87a6bd0a1172ca0a6b0ae8d77ba9327d7a57021c5cf8c5d4b55d362f6f8d59804cdd88be79525eb9e0318e3e6e4880471025d71d706f2f9c42ee9fa6321479ca5f7fa5db945949c44425a10b6d1d7d095f04d1baa00bcc0573ff1125e625e04d654126561ce5711f70bd48a68b0631a875e201835294a4500a3de0ee79579849e9b2b0b079e631aab380b31b23a3063ebae07a6d4751d7817c972e85337c410df313417df67d95de425b9bd9c702e03a8325682726d1e3006975f5ec46e8d2ae2d1a2c0f973bde4e42974d9249d283d538c9cb0ecceb911177ae3ee92fadb0451754e6fde6f47c0a84e0f3bd0906a4021777b8ea40d38034a754399752790ca0d61d2dc4a1ca967db990c1083df1f230f7c70121b1c3cb826ab5cc728aff81a56a027aa7b6a8c2fbf9aa9629a44a295a3ddd208de0a14e7661de8ad3589e0ced207c04877e9fbe92f8b3a6b7a1422c68e7538fca57ba7d35144d97225ce0d7cd1a0be055e002c7a5e99cf796e468b16de8cd84e36967142071615e8d4f792b39f9bea0c88990235d177322f7661597512b86949a1eb940c3fc0003646546cde88185c9035cbd328c8d3e2a90d18f9f15a9fe1381788592d631cc8a2cbfb0ad26f41b988e0f8a3b88bc9cbd1179d0781eb46e57ad4b1301efe66d3c797ea0eee2ecab5b5728e1081aa3fc06db8e2fe0f22ff24bcd0cbbba872c38f445d8910b634d4856a6ed95f9e36442706fb07e137ada1ac11528ca0d7244cba017e88f82e51a22f86a702a2802ecf5143bd9ff2a2ffc66ed80bfbef47b532ce7592c169ea0d49e55fafd6bd7a53fa2e25dfb0481f38d5014d035cfc0da872707ef3cf1bf991c9f2e8be4851d769d0ff7118c146e2847a508d09ed9fa41ef73c4adb0b6dc44237d7aad5b6e2a8a2aa7e8accdb6e448044dd0b06baea1eab5a78c03bcca522f24ae0f1c4ad2203ce8fb475bfe40bf6cb4415f92b6b6a21b4a62fafdad28618757747950e12c42c76017010c74e5dca3c21dde1a8694942e60ff85a259dcca7fb7ce2cd4540f5537b3002b9ec21952247c804984ea99a00ddf544b835e5f039997e7bff9795b5f9a4aa437321c6a4aefa0b9d061a0274955ba19221dde23c3387304d82dbd407df41d13fcc8353fb410fa156b2e58c3b259b151460a3e24f4a52fcb566c4a3c678704b05d2e2f1b57d05a327b1990ef00f2de65c59ae8ea5ebc1ae5df6e2a3a4d6ea8b90a31e439952cdd0d2f7ad1ed5d292ec56016af588e2426b3109876ef6e4de4b6ade01652856591107df824a5b68828bf39e2ef9ad544910b1ddcc8f33e502a991eb988e4517f21774b7816a763beb52f344be13f0dfe042cf148ead3683e96c476850f6cd4c5fc896a6f17d313e427167038949c968b279141cbb738d4bfce09e506a0a34423dd172bd649fc8552cc8281c915de1152ebd6695f2349384fa6ac94467c8deb96ed96bc3454c1c2871dc236728e90811f5d74b1f552c516c6dcd0e143b486cb6910360ecf99b391c66c62379929c215c4e34818e74a26764526ae3123505ffc86b4aba945dacde021cb41499c9e8a944af71a432f0eaa7086942e3e20486ee940575840ede582e8adaf6d8a26be5a152327922a95476b15ee95d3117721b684dfddabfb8d48e4fd259020e1156737d279bebe303ea0b120c7b15e91deae47c8a433a55e8975368dbe4eca06e4412de107c8ae91ceabf5158262c864b301b5b7ad3a4c7e8d38ad088e64db8c0ef4ee3c43547f3aae4bdd6cc68a43881033dc70208cf41e3c07f514e0d3613620a5b63450d868b92e896bea811d52f5401950fefe6f5a059c1a64e047cc2cf00939684e71de72db555b1944d4118cef35e8e308e945cd3306a63f6f240aaedfab1e45e2ee220ad7aab1ad6b337638d9f7105a6e89ce1e69e43c28b4842747df4c68c644ac42a05e6a0d2935a0ed65141f48a193497714ca7656b4a1df89b0a0a2ba4a27bc22e7e1842640c9b32e00b5c2cbf7f1afd4340e613ba4ac59548319c8a1bfba0beb546d9097d93b885434d8dc492c1d6ac0e6d7be8edfc2e4dc576628bd74db10f35056d5ee4ef62c1d7d9793d1e4bce966fb6fbf4d501ede69281fd0e892388b1fcefb935875e815c0830e1614f7888f95cc3abe3e8fd563720b69953a9e32ee113efd72bfa61155bee210cd4dddecb998eb2687a86c15ec47b6fda154ea88c7e2d5340c9776af147595f77d94a20fed7c9c0101d434c2b9a178bb7f1b2858d874823a15ff3809e32c3a52ec7944fd6a2e276286f4a1bf29e172dbea12c84e82193b264072dba696804dadada59d1e4986b22f05c95bd88110990dc6ec5ea09b1c7cd5db0bdc725869a4efa42d020553683a2bbc415c57669057fd391c74b9f0a92513c01bd4b40ddab8b9564139bb348db3afa59adc89f90c35a960706bfa0b75b407363993de2df042545c42221c2f0683178416ad4f86ed22316cb2c00b835468c0e36329770839ba100bf05f323d631cabbcfb65250e6af067f538960e9f114b0f5b5db41adc1c4ee7a665699f6d7aab5f207a0f840160ad4713dbfc90bada129a8d31985ebba6d6d222d946f34a6de02a8f1a4032106bf1e06142d458efbcb52842b6ad622e230ad1799763e2b9bb2586f00244e8dbb0cc17201430955b482f3f47489917f2389e711d8459befc52bdaf5db4e74014e60a3d89906dfa30e8c153d4ffb145c5f7d4e3c60603839a08e3d303355f0e2f24b032f41ca99c3debafe805271808bdd512a078e4060d3f681641ef04a61bbe92d723ee098292d9be479ade0957a10430087d056276826ba2eaaff6e7695488cbabd07d1108159d05a531523144139c71ba159ab7b0965e2e80efdd83dc6e6a6700ea83526c8e64986baa44f6d16b056e598d0351fd53e584e9a47553f5eb0857612b4c043eaa35774cae5740eedaf338ee688fd0717610b7ed8757c3c351dea861e313c400ba5a589a4378f58b25f01b34b1f140d86a03d1fb2f501ed6d9ab4eead03aba71fcb1f5d0f913bba776edf8e29511a5f1285227786802de4005b29aed83d671f5d786f3690906f03efd283b6544830c703b0fa79427289f8d46a117c14a0885c02cbf5442637d09ccdab447ad07107a0b00b11a1be30f7ba15a43b9d6f5db88611dd71de6f79cf95dd17c13e36ca0e790cebdcaf5b44bf5369a2b04e63cad4d2c5526027aa8c24ecf8629ec616bcd56befde8b31095de91a05b7798f8c2651690697c23e2c9b3733f06d702d5505ddfb1af5f859a208c22e926e6b30ba69dc4dd9831fabdfca1ff37e1ab6ccee6c06ac1f7c1f463c0d22fff9c86ee9a4030210e825c4b829a1bfcc60e8fb43b58ec10fd9158d7546c5e62b19dfc798d2cc54f089cb94f6db80d1ac360a53b41046b0c93cc635068db6fc1b7236e952fd638df64d008c9f7745afb2ee7634e4d614e4d2f494c89726a410a0793fb42fbe3e4b5b694d5720a271859753300aebc17488875ac11e18301777e758b89915043dde24ce2e5682f68731dbdb49db0b90fb49a5972fd75c726a23c8932a47da0f518faa88327e8cd9f602c4967ff4e24a4b3826b82702113d730048c112eb87e4e69bf04402eba68d5d67929aba2ea9788246883ad32df2015b7d351a9ed6be3007ab2fc7e89f58a9088ded987191c6f0de2e81537afe1fc9f415e08d1dfdf065a6083bf44906922e8daf360ed8ea72edcbf55d4e66fcbd9e69774d600946ae7717f8a8a1e22317ea5ef04ce094050a188318056045ca1d655c27a9a782e094f317fc655edf87a6e8ac0261ad194d7a56573b5b4a4ffc513df64ac6243e2ddbe699fd5568d87d6761919f66f02f1f809942e706aa6d27e1d83f791e2ab4401979d6810bcbfd297f635d042375ff1c4fc0cc39bfbce12ca8c5599c3710e9803ca1d0731a4b41c31e3d150323ba023872a2e13d9e0efc7a3cce501291686de39f138cf7be2ed71790d6b2a7db9b0603069f9efed5d815241b2c065b94ea720083424593b3bae9d06fb5b91e9adff23b59700be4cdbffdc2ce6b76455e892943fa7f69a3f0d9069c84c66e6a4a21aa04e7941a754cf6339fffbe4f2d4626d7e09e05c4046f32ff05ec8d963cbe2efde1a0bb740650b3b6d4362533dd22c92d5a7c1eac1127f2805ee9d574bd277e022e1a6708ac64a67cb028ac1d0e2f45bb2d18793e77612eeb07c1f07cf50fc66735ccfc1f31b6e5fc3bfcdd437e416fea917b2990b6edfb5e291b38d14bb58060a7dc4ab3088bd48b688f548e4e049b41f2be10f7fc40449689c5592b1c38cb33ed0f01b60b66a94af276010c48c5634201fe3d5f44f02871de745a07baa320031f869fc7c97cbc62399d446d537094e198efb05e2724281d4229df5d595e1b03f80fb13c478ca3ef4d6175286f3be3d59d17dd370c49d9ab87fc68a0cf503ead086935b20503ae21c0a33bb97958e0ff2a4b27582ae57fcac616b7a60469b78dff062ada3db28aab6a8dae204222cb12015a000044b81004aabdc959bb2d99ce70ae7cbd287f4756335ae8bbd7c5f7e6d408df675e57bb97665f7962949192c096e09be085f6454aa4442b164940c52789151a8b23e41ad0000f53852a80f9e8aa80fb08f8f4f9e419549ba3c632a53a64c9e9929ab2c45da4c9236e3206b2cc7cc939f7a102506493d989ac1f1549cc171fac142443ebd6ae6f4aad3a9ac516826c90aa53ccd9cc8a7e2899c8952a443c6a752250e9989529443c66e738ab4194556a01f4360fca89f79f02406997970269542d5ae904136bd4a846c7a95380455bbe28b6c2a31cd28b22ef1c084512815152d8cc8a557b572e955e21015152da8e492cd33a4cd27928536fd3b207f0c814ba0490c821fc4255c9aa919424c12592c952a7148cd106290c862129a4d486e882551fc241dbe4a1c6293058c12e4b03cd2a6db8c499b4da49136fd6d90a218a4f460292c85187c5508be0a9c00cde2ce0a0c415392ce2a5055c46691143f0c1f0c49a4528ea21ca4e4ef55a4ef55df5702a122f9c3e6237de253f113756841658b7cbf12c998efabc4213ab4a0a245be3687a4cd20d9fa41bae153f18603e8214b18d9bb259254f606d0431630b2e7953c68fe72d478d7f34022954a1c82803265cad84c226dfec8b14d7f1af2c710d8fe77edb524aa05152d8cc8ddabc2dc6941450b2ab94b8560f725e95c42f5f1f1f121d293bb328967ee55e2105aa64c993299bba4cd9507f964006ce011c0715647a0f53acd59c12c520729840aee4af0defbfe031f0c3f145f2c7dc9f426fcf8f4a7b396a84795503ff5a9f24c7dfd9e8cfa9e3cf33df87bb2e97b72e97bb2f83d39fc9e0c7e4f267dcff764ef7bf2775c5229f73fe1e4364d64490cc126d983fcbd27ba2362d56f7ef35717a3ac7e77bfd5b253e176a3e1bcaee3dee36ac29aae86f50e63b158b1988a0642b784689a78f005ae5ffdab14325e5c506532994c269389a132158a1c2972c449534a458edcdcc9fcd56a99e62d82824709620b336027859dd488964255bc30d4bda56b6deb4eb5769d27334eb4d3967659276c0a4eb4931934a77eb74c147f5561a7d357d8a9d64ee2e944f357cb6427da8976a29db6b495969d68a75a9b2528b00727b21e59598bdf61b3ab09bf4e7360949639abc35a79fe196398b2bdfb07047766fef43ba8175f25561a9ae7317dcdcf98489e2a3ba2f83ca63ffda57925a7524915252a2562a924f5a8a7f95a9a30f3a747616687e6c5e7517d0d0aa8174b9ed4d3a8fc3c924fee918c33640d4fb2fb20c8e84ddbdaa88ffa46ba8fb394e81a085abe28f795dcdff509bcb2c9b4d9d5566bb3fefcfcfcfc7441dd600fd863193988720ca9a6a884544194d5d7fb4a3f252ffdaa519ad52520934fbb56dc0523260aeacf926de6cf1297b344e4a4d5c42cfd90f1122dab8228abdfaa825441d50798fb555070d85442fe32bd0ccb737c55d0ab825cec6eaaa0eea60a520585a251ed218a316735aaabb92833c52191c814696117a2d947863432dcd266adcda39bbfba925305f90bab825447dd195eba20dec45b77530575b7ee28954aa54a5590aa890a48f5a30a52fddc58013e5541aaa0dcaa2055500ea2992ed93003da4c2693c964b256cb3431a6d5ece188872a2786d4ba8b6458aae1d7528b0bc5b75f1d67226c8e81bbbb049f55169379f5d2ae15cdb15f87a5cc1bc16e0a4e2b0026ebc9d126bb8ef7f54abd4407153fbde4087b2f26eb51155365f446899bcb82b4f4955b0859f0d9b17685df32d27f5d0d4551dce896f662c2a55a4ba552ada552496f4a9c10e93bc2ca904c8612e30b5c7393d09b0e50567f5d8206c705f11582f857279f032a608157dcd3f70374dcab04fa74f65c2984ded0e0804f7af39b0a1c12e3388ee3381b67e3074f70f5d1514173684e052201e6a139de01235b4d006670dc78c3f6c5ec596b3da802753319102d163b629665c6bd10e3a1b503f5d1e2688e2de15322d76f551f3caab77e88d026bd397de43e798419a441a842d185ccccc1d4c867bdd523ce4601bab7bb76adb58ad0ad560d9f75564ba84978c9b6d6c546da366d4fe6c89e8c2d0966f287eefeb67d25d7d90d15e0b3ce663353173114c3dfc161f862c9139ec2c7f8bba413fe2e297cb1f426d39742532914c5c0a24e2896a1f7ddef923c04ad05ad0581c219c4605c8467a7b7d6e258acd2a016b50bb9eb19b96b98d10b5ab96811ffac4a9cf504f50a9e5981f1ec887e1d59cd9c158c95fa04969a654b77a9a4596c964f259ee1af3cab90a9ec2c9058964660e971a177c309ec660ed2237c39722d4f7724a6f590d4236aacca84c02a1c6993ce14e00021432803a8bb3bea1d86ba9d1acbc2d0f8a88e4a267b54f357a9b447b5aed6ce1ed19c52ae5d1da8f8fd9e8ce6749f43fa7ecf0634c7a85df50911a31199c90da88745f594a0af5b03d08561cc2806fea2cab8b827c057a8572406ccab64fab3f36206a63fbb306a34e772a13939f09ed01c2b04a55f1eebc6d0973deab8a8a3958e32ea806ba0d683e17e81c5a836c8fdf6c85f15e8e8681c6bf698bfaa2c16eb237f551aedc86947652c08e4af7b812ed005fa482499bf4c992933651ecdd5be3da2d41d0798e3ba3fed51d791351fa94caa8c44aaa417f3a307253c194d0649da714d3c668f4adc4fd78eb81cd431943a0cd46ba8e5e99db55d67f1117f79cc63376e74ad878086866ab29aece8e8c81e5531a167037ad32f9253f09b4c5f32fdcf85e1d7c1bb81afc0889108fc24766b18ba300c8d19ca5a484f466f3c2c2acb5382b2fac518bfc8ed71512b1aafe0131c75603a23172a3da8f3a0720512e8fd065098a95da47710247d2417037ad33d682a35ec9220ed6aa92d4dc165a97b13e9b0eb2fae0bcaaa6fc64846185098fee2525059fee27ea0acfa5b8c5738c70226c62ab94ac9f56b351a9f37c1ccda1a34bcef0e70ffbf6a6bb5ffb4d9bd248ee370a0a0356bbf8b73e27c97f460188258daaca140fa815e771b7a9ea5d6526bfdab8305e8af3f12c791ace538ceafd7713623a4d875f9c537dc51da0dc58bb517d35910ee9de4826d693e8786cb3ce6b7dbed76bbddb2dc6eb7dbadde6e5f687a9df68008d7dc61b94fd4eeb6440041b044f31dcab5964a2408964a6009044b206845131aa6ba0f964aa552a9e4485219fcfbb795c127816f6b8900826089e4400bf974aac105f6c7a0bb1884045cc224ce0f20428814d9998091365168d3853e68041aca270eade278c1dfa612486a271dd42eef1f556f94d59f2acf8b2a716e38b3276e57caa0e5b3de54333333332ad53b4cc50d6153490c8f905969f309222cb79bcb505d438a98f66eeaa3973855748ef36c1d17db2e0f7fff0c7317be78ff4924cddf7be73ef3978579ef3412a9ef733da4de3f9249df91e798eb02baffbad346eede59f54f645b6957f7deb7f79e0522f5dcfe11dc10a2c0c11039b8f0420d5a10848b0d9a98d5b47831668c1fd21839fc0f37c612a029d35998322b5bc16bcbfea12fcdf1ca025c6b12d5396ef6841da10eb141a88cc1e4761a9c77475c0428a6a37d373790a921288cad0a0e14b0e9f002181e8480ca8091c10466041fc8c00315361f6663b6b8d560a6050b846e18411a6088c014fde062f85246f7654c080605a118060f5f6c75810f9c227c491826a0210756b49800003784e912c41819a858e20b111e951b8e89031142c404bb7858388ee3b896b3a8b5d6ba7b128ef31a61e0fad75ef29d45df23a95b6b6d795a2644448810f1ae73794f7fa75d1f480a2f0ea59c0e1021edfa4468d9161501a7cd9619387ccae29e4452ca3acdcc3de58ae06c7f1c899c3e45d2a2e6f998f6ffdd39bee842c755ebb5062048698ea5f45e7b693efdb992d66cbbdaea2b6802e47cb439d9da2497c1ca95baa4f4c63a977b6cad4adc2f407057c6f89d41c108680a70708cba285090c617194a548cbc3cf922831518b0dce04f680813c40f656420324157031b6e094e1156bc8a47abc029228a2f3b7c1dfb4a557c28d1fdc10a14a441060e88e04107d839669c2b26e0220a2f8ab818324107c50e0e069c22c6fad58ae314d1312e0a31aa78465c0fa735f67f1137d3591820ae0aecfbdb3249674a9b3a75eaee3bdc881021d22e2241ec1321d2aefaf48bf40bf4befb1e87ea0011428282b9df3285442233d0ac364203ec5f3f7be945e3c5788aa9338e18bf91b76da77c3e5830b097e92c8c0ee338030d9d83898d304b98e460528e69e4ae3efda976d91c4cec770c97510a239fb6a802d21c16d31b0fdba45d378ed45a6e013709c7d9f6527d683ad4ab91829ba3cbfab7bd681581693ec7eb759c1d6d3e73e4c6a158c2c827a54699de6e57728391fb7f2644eed799e59eddb4e4fedb3ee35733d3d9ad873c93e9ec26c3c885add5b9222e32575ab2946da53acdd91950968f048662199ae6ff385631de0d3f929172045b2d92697eff771c89c0def48acf1442301d33809d2d9c1218a3e64a2f4bb792d18e11e05f552b67a42183d52572704557f1440c9f2523237f1521cbc0253063705519a98cfc555219a98c4a462a236d1e71561ad88bf8ab64e4acfe92110a25a336bb488a283949e70ee09c04e7faef053e62c428f7ef8801d72f024385fd54a94fc9b820c5110cb016198023d792d61ef64b3810a586ba4942281bcdd1919b83e2a43ee7a45df6392123703eb9a01a943b2888c88bc8b0d56280bbffe7869e1ba239ca3cf7231444e977b64e4e8846fadcdd3defa315e9ac80d44a0eb0c4964c21e34662037c42b8c13e18fe02054d2c985a8594e20e4fcd108cf45f493180e96c0c992250c688c9fd44fa8bb1f3aa69050b6433cf1342cac10dbe4f4c0748606b726210cfa779b3741c59612472b5f3f15429594c1982f17ca5d742280290bc4102180f49469b00fe9f27eba00a969d5c6d363b41c8093acef2824faee6d19c5b8537cb523b9fa614b87abf8237cb3bb257eab4494ef9de268165edf2f181f57bb1761dd107f879d8577a593ab20b2c44a7cd1d3b64f168de8c12e91011dd98c2753ea1f00a15e0f36b6c80ed90ebe3936b75f788aa16d40c6a0624f379adb5d6e20097f9bc3da2a0401439431ab12d00bfa5b431de52a3b529fe5969268cf1e313c6278c319ec133a66e899197d213f14d2273e8844d367ad36f13e4af5369ba265b68830b5e8dd0652f4f4ef24c3e4db6b6d904511780e045ee07c146733ac0b125f7e3b8623374c388e60c7540441295371c44386638b2b46b8524378bdf8f83d62e0f0796324cbe92cf0eaee4be41039b13e47e9b1ee8eb944365f5fb20c4690812904076c2c1460cf069b2e50e7aa0ae9493ee2088e6809fe2819afd67075072eac96933a339dfdb08a239a4b70922d190fbad8ce670dfd9da55f2622492537e2eec248a24a2d203c0097cfa876ff2de392fb9e712a81752c8903d2f91908886502fa488217b7f4f5db8ad76d1c96ca716602f2d68b2996ce1835e78226db3daf348445dd013900f36b1769d27209b281f42e9039c826c844e40e129e5a45da69f3679a02e530dd4ec6f130ea927a69418f904d443f6def463aa810bfef269b281a477a3c884838d1e6c41f4a68c4d904d50f79537da7f859afb46fe4a2bf39c6b42a2e1e45ec025370cb50c0c979c8fb3b82649e415ea0b32bde14a2bbb31c3a74d50b509ca6d1364136412957a060d1410ea87d29617198ff8e8236da48d3c03c0a14b1a309e1606908213c0c26f811a91710556a58ea3d38cc058239a6365f5e7c7e8c7e8c7c8e8279c895fe2380e3c724da8b0f02f797325e2bc2781e0832f921d9619c27df72470df77a4e748523794c50afaea6c308a19c58c624631a3119ad09b36726b6d1806b9911ba180442c543e47b55aade6af71ac8db5b156ab8d5f3e47319f23b5d15c973673705cb8dae85dd09bfe2edcd6aed3bbc8fdeec56d160d3f7277f72e6e38d29cd2d94337bad4bad4aa8f9450abfbf1ef460d9f5cad5d14e48cba25adf287b3d58e70cd6778e083593d647f8aecc0c168338ef466269ff6a7b333d017c7a5f6c3d56a6d04bde9aa09f40592280c72d32e7ebc546f123e8904492118ae06724041f84fabb632017cd29f0096a4f2841f0373b55a773def7a9ee77924aec6d5543ea81c665dd7654121f6240af4c61f4441003ad4cabd83a9b51a75ee2507a08ca159bbba775b9bb9b3d22e8e2bbbe43e42d63dd12eeab536bbfd766b9343a1fa681f2a5554714b8051d04991fb4724eec5789c9dcae0b38b5d2221bfed781eefb776519b6bfc18029f7e4bc27d4bbb66ef59da455a55afb9cdc1b48b8e1d676d32b5628a1264ae93b5d91d5145f779b626532b562094391edf3a7ec79f2e63fde94440a3100eba9efa0f1ef51f3c8e273f657a54e967c43f858fc13791bef4bd783f7c90f45f3dca3783aaaf06c7d5d431f4e0863d1a914ceeb71dc7d5ca55ebd584a732d8967e6443abcdcd4dc9d302cc6f9ded7b60a00e9245ea2857f56f5825eb75fc0eeb757c7d1d3afea6e4d151763256d90363911446c52045ba580d14d8b9c028cc69331d248505c0087cfa2d6685dfa81f75e69f75f6c19f9586e3cf5a236badb73663fe627dfddad5d8af6ff2b0f9faa35d35beafabaf4fa4daf80a7ebdf1f533700449bb3af8fa2a2461a15d1e7c7d9ed29276fd4f937699be964e309476e5108a02802366acb40b84a1ca72b33c3bd907258e922ccf6e660442ea713cf9208d18847c904c91a90f4c3248112cd267547bf8fb93d020c1307e63302adbb2ff05999080b4b83fd5070907da83069a43d281def83b500866e0f303cafe9fcd5ff7623c8ef5b3657ffffea26691bfd057ed4259b6eaa36af9964187415ddcd360f4d2b67c62027fc7d1ea96366b8d6c9828f4c9a08d46fffa27ce9e422d5338cca920f645223dd96b7daf61bb2c13600860e07efb379ee0ae7f8307dc7fd625670f19c1da28ebb44eb773a9b7131fb4272670a5d19c2dedbab524a29452fa558b4802f7ab213605abd34db3421ee4418f717243a94ec8d20d6a1a51f5d1596a8f7eefa1d4ae4b534ca692fb69217f71b28f09651c24d4259ff688dc312b94a5fab0425822f2d959727f075870fdd30ac1a848a447241b4645126ce6002dd37164d8e60c0d905aa7b43bd5ddddab12b8dc4f57c85d6d0d50792613d129703ecaeaa753dc7b517ea2207dd92fdff5272a5b9cff1c6c2aa5ee8d1e70bdfd4345ddfab7db82f1f90c072468822447c66d26c089ed6b8980f383c8095883f20297c61333a06030d3d91330a0134f649083275b5c2a3097e9ec8996d9adeb3ece7aeb001142a42fa6c974268418d9661180673dfd3fb0de367380c0e7e546a8b4ab535baae514fb0eb3e5aa04faf56b7976a6a5b582ed0a3623a9b4ec3c6081c5ed2e024b3de0fab67a7d166191d11b6b33ed8a28a5f62bf704005ab470eed5ba5b263817707db75e2d13b87ebbdb2ab34c709472d6bbd28e0a4873544b3baff3bc2c5d9656b5defdbaee8ad9c72531c42a81c1aebb62067249743decb78762d75d3113bb9691b806cab7be675abe19f44226b0ff0dafbfb8ae23cd27715ade8923ecc8f67e24cec60886b4fab0365bad091c8c2b8dc882385006438721246147aea511247010afb4ec5e33a560747d19a917a82faed471d53fa918210cd587d7fded2b010d94d9988dfddb180d4dc9534e212383b5e04c24d1c40ed9988dd99825b23299ec88d43d087a1e27725fbff63e7ceb854a6a3ccf6a8766fcd5fb9b346f435f76867bc32a92e09567a5c97878a8a08981d578507634aea8d880a621573b347fe36f943c379ee606e906b9eae046b922916abe060744a7078740d96763fe02819ce57f2f908d81402010080402d918492c039fa0ec03037f436f65a9f79a57a964fefa88401928eb14ea23fa883ea2f323ca5e43da7c8a44aa212d2c45aa211d4622f5cf083b32a9f4686a901118620b169847d23c7392c56c50f6b719a77ce418924868480a1b493a92ab223523d923596160a57987d1943c2dc068ded2d4d0d08cefb0b1864626a37d3da856c588848484848484849c95e5b7c0f6753c7c9d6efbe1cf586997f7357fefc5781cb9b26c599e994f796984fef053686f40c3505fc3a3aa51d5d4d46a7e7c95ea6d54634d1916a437b4b6dbd27d4f484848484848280c49081fcf000bd11c6ca44a91ab9d544a8552a9bea6f4da0a7cd5d73c8a5ced8c8ffa1155aec0af01518f5209c94c0fc6dab542929b4fef0f0af90bf57d27527c14e8e303920dfab8d392d35209f44191347f024ba0859d4014e930106cb0e344d5e333a4499d600f2f4c752792da2a154aa5fa19d4cc0c6a464888c8d4a30d409ae3ac21642db516f471965b1f7f35cc6dbee66b4a9e9ab729794a40348102d682cfd0c40eb02af67b60270894fd5b2d1baf5ee2dee75e8cc7f11ff4b1b6497fb00b4db44cfa12e883f10cb0cd8ce6d015647fd087e69cb2631ca32c7ffc949e9ed2d338fe679a3b35abaff91e980db9dab1f9f1c792677c9bef81812bd26ba4dbc01aaec8d58e8d5fbd8dd26b2bef576fe34772b573e3c7bf51bacd59fe63b9f2de46697d9ce56f7f9ce55e6942c3c61fcb55e947a02dc32fe88381dad52b24b9197c7fd0c75fe3c3b8237ff9bd7eba2aa7fea33deafbcd552a8c6bbc69242d0c243d70b3473acc23c5b7b1fea965ffd13f376c910335ab7e0bdcafe31eb9814acb670bb29c02e94bdfe4596919fcb305592eedc8de9f3fb20d49612a92e6147982b9a2c8156c3ec37c82a41bb142ad61425269d9be484e193f24572081da3ce8e18f7f630cf6421b92c2ba1aab05956c411bb2611fe981249eef129f6cd3a10d69611f796bde6135254f0bb09ad7691bd261d4f3c6afac212dec2b6bc8865d9b77984dc9d3026c2c1d06faf8b4cbbb8650aa69a600ab124b28b1020b408ae9749a799f29ff95f4180116bfe52cf1c517d2ae8b31922319fc9344a6d0fdf7dd831d0982a4f2d371f169eec4b2a1b4496ad3fb9f80bf4b25fdf8bd545245094d0090c0dffbe77f82f73bd8e4eafbfa77fcfbbfef92a7cad77e3b772f4ddd5393e969cad5f718f7b7dae9a7214ddf247e2751ddafe4bb08a505d17a9d56bfbf922e8da8406d5e5267894fbf076d78abc77c4bf61c8c57eb25751ef323b8aeeb3ab11cf2955d596489e971f820899fc24cfea63fa11f974af0f79bca7e2534ef3f6bd3fb12d9596e7dd4ad3ad39f80fa4795279894e037950fab1d0db9eabaaedc493daae4c19f7a1e1a0aabdc9b3e02f653afd34e2a5bfe4a954adc9fa65c75dffd7845b3dac16f22fd31d96f225124751efc4a6a5e49aaac3ecef21efff834e5a73e88b1ac403e4f6a4a5c7aaab29554d9c16f7a254a705989fcac4241d0781ecae4910da54def4d640f39cbfbee2b895ae1e3e3e3e38215cade5332d9b39d6148640330f98aa1e53387e7c14eeb93bdafa4eef4287d24e463e5070ad02c68c8a3b46b556d6d7a69311ed7a46fa72fa9219fde8486be656f867c3a94ec793ea32cefef387a5dd73d0936773df3973784df7bd0c611de770d7cefdbd65eda4456186d17e83d8849b08a45681eace22a02a6c7a8efca1dd3e392a7c24ca8c7a4e96fcef2bc46dab2e73367792f420c9b1e3fcdab1e857a9adf413d8df75d598d9ce53daaec1f67799f2a4f9f19b907f3fc4dbfe36f2a573bfdb85c75a6dfc16f323d2e77508f5165eb6272f53dea7b602672f5e1df313dfeef71c953e52b77f0a3bac7cf63fa1ed8e9f37e158aef64da75f6ed23536d86df6a8bf7dea55d367f2d11b3c81e18effde662bcf723ebe3af0af33e14bfa6a2862cd9fbfebeefbb25f82692c270bbc22c4efb9ed4d33de94cd21d79f6e42e05f069eec852fc8e3c710b99f4a7a5a4f20403fe320095288208220ca3255e78132b248081133508511b0373772e87a226d9dddddd2d17b4052f7801d5229f3c8470011745432841440d447051148509292d2b95473e534232e4c6a248888b104604e951871660ba30a9f2023266e86162cb1442d8ae3831e30b8703172cc27a2a402d081c647f3c060144f6372bc5e92472d384c8a6dcdddd3469609a436df5bf188819003194fdaf18c4c7336ae035c18296f2030fb9ff1679b9c5a00c229c4842043698f1c30db2386a414c09583fe5807e48422ccdb10e258bec5060f0e48cbf6d858ccd8230729f727777e3581c3a13f2c4bf1ad1200cf269c3071e6e7cc0e2430bcc34405312b4562055680d2474b8d806294420b30108292c30b2a1490e7ee39adca0870e3285906d62d3a1d682cc6cb8c9143d0461c10f6d0c192d1840a63332b60851062dfc604cdf10c6bd95c9ec894bafbd5cf4e0e1a3499108c0b861071bb4742bdb1c6a7db3f3148a52da6754dae2a83b7e1d8b4d2233652f11111125f230345de0fa1d2e5328ea56c5cad47ab5d6ed69adb596e338ae6ba71cd7d1b28201a8a26556f7724c65fb1cb6d65a6b2dad443905fab4e46814998a2f689142924a2149dd1bc36c069862fb463ab184ff2e1718604ab10ad6da54b648b2fd94739dbd626de765c98bf3834c5f455f98fb4e94e202506aa3cfa22f1d1d7a9305c65dc782402a7b1e47a7d0a109a02ff0c1b2c6681528a8319a8344ee0bd4578d552af55583685de20aa554508a05ad415f707daf134b20b3579a43a23a35e6e30b7075afe4b06842c3462e5437b27d09948073f735c6597f557618a5020b2eae7c912d103a4d710548fab5288676c9c05ea6453454c9e78d626f160e8d99775b4f00d98b6f88c70475ad2b6be26486c89c170b01011943930108080819a3188e8280a001a425065768c1ddaceb82c34c67529eb84e48598226a50a0899ceaa88a20cef76ebeed6dddd6d8e3581663d380277efd9adab70a44da33a037de17cf988bfc6ebfed4b648c25dd98ee4ec77b633d2007dddf7770fa3017ae38fe3af5b9e95e5fe9d9f71d2298ebc15d8fa9f3b96f8b9d75a6b74a4ab4246968a5044c394dc37e4fe2b3ec164a657c218e5d3e68a83e3c457a10e055db2bff5287586235ad96da9faa9ecb48bdc41f62219d0c8fe4394fde78cbfd7fde949b3d0d10a2c5cb8ec2f64a75f16e6eeee14763305bd360c67b98e8507c5841d0b98e3bae7bed29705288b7bcec671dc8337bcdd57accffd68937b8efb191a3ee951500f412e080a1a476ed5559104ef57ddd72972c5923b285d15e2e8d107e8eb7bee59a039fddd9f98ba90b96ff203f4867b21fefa4a10d4fa42e6decbae3ca90b58a037dc631560afbcd4e4b8f7efba7b31eeba7751acf7d61fefe5388eab32db601324213029d3a2186af0518167322d8aa10bd704fe322d8a210b8f09c69916c5208517e3e3323ed4e02101060931488cf7e92df342bef753edeabfff34a7cbb73c91e430f1fdf386b7c44a7869160573c5348b2a41a659b4ff96039012048911039024645c00015962a6650619ad8a188054b1b5d220aae13a012283d22c9acf8b4938688621c668513184171b99ce8628734d400aa165b676b0ccec62031ce65f4910b2b5254f08605e3617d75adbb296479b66ff0f7a43bfd5f686b0025c9fdaca711ced4afbdcbd18734ebf922704303105b5dd729d77ef77edad1f09ec606ddafbdd7beff540230e46dff416ce8f4b5f46c42070f570dc70bb7bafcdc6dd7bef6d97ff2dbbd288b3b0e0fa46dab446aa8edb8cd86cb60bb30dd2607477e79c72eeeeee9d53af2b4b5aea68e0bc7b45606dc7536d57bb1304d9be735de7e58fa16fe97bcec201045293337120bb474dee1bec40f6daedf2a80976c0a9c93df53ed0aec46b575b826c8bb8186c8bf80b5bdb4118b86953dad4bd833070cd20c725b9997bfb780630fb289868b8e52cfbb50ceb2df2f543f8824d37d3519bab13c0d26cf9ab05abd682ab2129ac86dc5c6ee064218b257cf99629ac86a450ff2b7fdc52a74dfb344f6087ded80749234d00fb1c04e88dfd07d01eb6489bf6bb750481fd17e05f4b1c93e9af222d8ba44d6b3a32dd7634814fd32d5bda7577dd5c37d7d692213866b4668c7e6dd22fb359d5745285bca7c1cdf1a2349c175c1f1c5dd235218a209ff5a64a192fcc606082c30860fd1a6b781e9541be25c89ec7c48aecc5d0c4a341039fe6add86180cf9b6b98bb54ee9e86c9dddbae088659ee9640c9dd783367b770418ea36c8b5cb822dba217a4644b026bda8e656fe85e9a189f308420308f221f191a8d22236badad3dcad4b20f2bf869819414d8400614d8d9cad6bee9af1a60c698228b1dd5600798add91762ad0dd95e914512d986d95a6b6d8943f8824fd3acb332520690bb2f5e01115ed555a594e2115fcae351224584507a34c3639b674fbe658f25d423b5a8e7512f883c126d89803394fb7f504ae90a63dc5406b625b53f0a163f21d6893496e4137cdff77161aa4dea79a510b2452271c2558d26e19b4aef11f9783e8431f089851469f37b30c1dedf9ff1f8b0d0a6589e3d99fe19e610482934e1b459fab075a44d138bd1482344ec3ed448d620213327fca017e630fca73ea82bfc4e0c120ae9193c73c2b585858a4144a8a909e1cbac45e2b4a9fa7e16bcc334249076d17cea5134aa31639a2aab1314256a53062c1c75b3b21b427afaab9d1a5fc5fb1adf035b91ab22366f53f25498cdf7c0c4b72159a83eceea2791f5a736a941154a9b9dc5b23a216926913be02225f511b832a444355d4304d21c5d582bede23336d18c4c1730d4df86cfd0e892bdbb9bbae877a6648a94c1e85d6494bb3cb1181f1e44b89f0714f8c42bd84c7d6aed6e5e3d842ff8c446c823a82ff8cdcaa35d94479b3928ae7f6fa53b6dd623a591366bef68029f61bdf90bb8a06cbf921df7fddd9fcd9529f45bec858e777b18527b91b451ee9e025a8a23c3a976d970ac9d6ad76d93fe6943897bb971bcb7b4e5890400b4f1b3a8adeca5bbfb58dfebfe035ed779b7abf92d0c30674b7707000dbb3b67b91c9e839adfbdb3ebbcf2b4d97bb7ded18ec4d65a29ee7d106bddfdcbdc7f524a3ec4b0c12406940f8730a21438a4e1c3859f2c409c22ae8f3c3b830638d3d9195cf297e9ec0c1a1018f61391dab2964c604a733fa263a5bd1ff9ab6dceaa7f2faea4579abfbc095c7d7033f7f1d77da782deb8fb64e7aaa821fb73b3eae3fed41e1c1534e7d2406f1a8a7c92b82a3e9bcd5fdf171aa435a874edb645350bd5d0000000000003150020200c0c07042291502c1e69a2327e14800d7288487862369508a324c7611c858c2186204200010022023443b4158000ff69ec42ea38e690d2e044c09771405c4011f467ed583ea67afc5fa7aa6a316d5e9a1dd56cd1aaf1b3b609c825222205545447574be311a73f31bf4e05ee1657d85b386e41d3b00a23636a44e6fa2fa039e24c2673125ed7ad7d328de929c17bf295c09db757a2c79890e41428a6cd0e52ad43fa216b9a7394e7fbc2141f24640485ae806dcfb7fce7dcbe09a6e9aa59dbae52cc931de88dccb269f13d01ef387ca403d31fb643977960438bb517b61feb53340b00f295eb3270fa18d33f8f11c64bc4116767d750087301e98db1ac6d4633382414a2e84a7ee348e089908e6df2383bcbb9c33a6bc4070fefaf2948a7a1672139446e54003ddc2a5340b367ea09c2438a2ca20864c9209b7dbc8bb85e27cfa99e25c8d0abc6fab5b55a0743941122444c6a1bdf349a0e938a5765af780914ce2c5db8025232b71ffd1dd0ac775632fade2dd55129549b129d026ab5c6041005acfd090d752c24c4d56da5cadc13810436fd834c8ab93b6f2e8fb14283b98b729023410deeb901c023b03e3cf9a4d846dbf9c55a4af984d842893a492bada78daa4c294c9b67788d3f9dce807d24c5c6fedcdc8bd1e21e39ee404dff10742c2ff1d630ed625d27da535565cc0001a4b0245f44677d574163e562e150e7be59943cb302e07fa2a4efc54b8db53cf6986a850df30e37335b3b657c2835b3967f2060ce1e25106aa521541cc3814b188050b986806363df1fc5ea20c51005a52a31596b730f98c0cc1e4aed5bf2e5b19bdd87016826f32e56186320193535609acce401d97f64ad000b3d25ddb2c82d22d70d43be22e183e2069e2011ffb7b220b94ecffddffd19bfa5f8a595cf2b128dffd313b9ff8f9fda799f172012ce14c7ba6d8a33a9a53dc88c8cd69631ebe23c0e289667bb6070e32307e2a9f6165a6751101d7de9676ad68bfcc572445e5cab4bb37dadd63dec892e3f114406ca6b2a9f4b423fbdd351a0ce42edbfbc3ce3a9adf66800270fed0445f8babe092448b4f7a46b00ceffed2de727ddaf9732bed5c63783366e6a6a5494c8519ffffdc87f4a8449193576bafc52a71d86d5abe30bf100c92117248556d63145b8d5606f17164d1b51f00073c414f4ea151d206cf3deb5fc57af2febb8d4a6caf2a2d224b3413b3bdcb27fc7eb62c8eb14fb547925a9a305b0a70ca1a4c004949a5fb2b93e9114b0f5fe9230420d0da71822cddb48a10c7bd5490fdcf66197f1e71a92d95ca267b8d7cf209351a1bb251b13ef1772192e602e8859f2d594776d2ada51aa784aa86454f6d688c2cdf80858cb1429d03f947dee07d4b5f59c59fe29e56f1467dbee3ab96c25e23ced021b0de1fda24ee8ef1b2de94bfc0fbbd6461903d36538236cdc14000c2f26a98ba5c5af2859717a020ef114d0d276f682053e452d11e68f8890db8ee607b28e8f94c1acab0f75f60373db21c1f36e191403025709c3106d4895a84cad8104af3a155f9d706d422c4ae91ff3fe2c37826878154d8b4fd5d9302f2668b5567bfac5ca3d5c88e0e4109622df3e4d3c9a0a527e995df45fe1725ce2776c77061b08ed11865d1c0680ba9fe36aabbed77db764b8e5fa8d7315e309d8fb99ad48a646cf68f7822087d8bb2919f1f2c707c983fd950a3db7575083fe0485b6ecd21dd4187a2ae394495c4119eb16264c4d86c1b4dfecbfe986b90b895666ff65538547438c6717f49f2a4c0a4c2ac2dec675edd4e592905a79177534d32d35b72dd221944152a7f80558b11c81ea1cdac0a7ae513d3f74d684a1ce39dd8cb698f31e100944dd5064a6eba3a0073bef4c5bd733b535d0728b0767516119182573500615c1a1edb611f9fe0b9f77b7d1b058cd86065adc7d904e2306cd7f29e69298d9c17fb0919cd3ddee4c10d8cc452f35a3c2fdcc93b02806f1fb0e5702b1448d5357b7f18d661be55ec4d9e098d10f10c5abfa02558e33f1dbdd0b8b4243bb285b1b8cd0da321b830056c96d86acda626f4b1b5e6cf417d834ddf84eeb07a7ce8f3bc7d4ca8a521174b7f469853886bc0269ad1e9e6b7a9205501e2a970299570d37c8c19f382dd533e0893315a9bc122b577af75c500518a95cc0e10611ee09ba2ee657e62b91fbcc5bdffea348643f56e2e00585416c3fc14b24e2ec4056e16d594b64fd36477a739570b9af84188cdad176cf5954d99df8ce22655517811f19870af839cac8680086e78e14b42b4d3c0d1347882a8f1fd3cb1dda5638a0c6b7c10a2b7b1db9af30954bb1e703ae0393c866819f6ed5d1f073013e24cd6ef68cea42235bba7cb4d2869d143495deeffda556f56e58a2d8a9f96d377ea575e90d9e582b3ac035e900d63c0e6c5aa538923641f330e476e26eda339b25b7861d3fe9e15d5d550cadc8625c7d60f60fdad6f962a5a1bb139777fe9e17ad9f64a11d9a1295f10f96474363a6b417633594346085b1e56fc4e8c50f84af55cd9b7d78d5848381f8c1861d31c22558d34434c666a505bdf6eba7ba1daaa781b138de498846def6954ed57575da3594d2131bff6ff25407d2f2c75d02467646ba67d0f622bf9d8c13ede1d387aadcc225b8200a7c8b80c77ae784a030721c232a56cab4f3796dfb5e7be40b344cfcf77ff735a493bf9610a4f02b2e72b882a3bccf3cb8fd1deea961fa2783ad4c4033647447136359ab8506b76c31b86b41de7def0ca5bc15a40750a646af86bf82425c51b8de8614bec8d28f4bee9a9b9ed306449808080a3d22209054ab0123a4a344a9da581045c4c84b6130f87d8dba953dc3c7ba09697fb57d1ee37d9072b317be1ef93e7c085363c9f90dad90eed6ad46a7177a90d98d7b83ff02cb90ca00120bb51add79068df553e1f0315a4562ea346ca6b5532f14363d973e0a67819cd0076c825c6b38766a22f300f1245bb937c8fcc3debf446a8e02483b65238f46b081db06d6840dd2e282a1c16d64b83f9840e76a46889c3611b1c02c8548da19626004028ac71bcb6e43e12fc7ef9906eccd893db8e1b8b9d12fc436ecfc510ae210197c999aa0af378fa1108e19c00d6c8fe75110266df619eb5644ac6526a1b82a65d3348108814c2d6c1392779910bd893d9ec69e4d5a5a2ecb782f03f5ce61e26c3304577712087c04c55dc96274f559ae44225a8c29b883cba51ad89d772f1b4112d3cbe9e105b631091bc348b8e8ebb73af926d0ec9594742ddca5ff880c99a233363787fc47edc6a2166c8b2e42cd8794937587b244835ce74f1e0a0be443a993ef5e141162bc940a9df9f26e0d464f06bf7dac2ed6e0dc05867808851a76ef34156e6698b57f7b2fadfc530e3656edbeea5dcb23a6508b22b2c1f2b080462266d97d34b8db4c4888b4685f53349a61ef52a6532dcdaeff5a11fc9f944dd0c9cf6a7d32765268f5db28ec8260c50c83e22aa99a166c1c3a1b7bc328aa743292514b6e59764ad34059ce1ede5e48b96f7c4d5d1923508adf26b0cc644a8f65be79b19fe066eb3c885f0c096aa701045f0ebd61df89f6821f2fb702843a050ca340270559fd68f36eb43fc44baa710e50418138a54d425668d920bccfe21e39536b3714a91c4ef305c4ee4c7926549bd1f428fd0a81617a86b732108b5734f9cc28fa7c9e2032ef9df117440d0974f851d041e6e9a22a16488abbf539f35bbcd8dbfbcfb20da08a1929938aaf7621addbb4a96ea0c538db69f87d0ccf4e12cf82f70666bb0566ed5c07726881ad405526622300131f35844e3e0d71cac580fac08779f7918cbdd6da2a1bca94c9220850b664e0e5f4bb48a124c073e2e91e00a6a3f8e100713950068741aa19651729943cf6adc62880303175a34a913738902f9557370695395294b2b90f628ecfc0002015a58caacf15b9b2ce6f50ede942a31e851d134026e5a883c4aff869d348520345a8904a5b22aea98153bba8a0a2f2c964f38c534d784d17620467fde8e362913104424eb3cc5bc7db85639470812af75edf2201f6290370860a2a80699606147c3baa4842a21e39f9417bc4445836037bffc586f5153f252e677a57843a2004effff05083ee0dfb49550d225d8f029899408ae646760386a603ca19cbbc99872337d001b9c58f4f5708badd91531e90c84506eccf1ee110b8b4642e91d1e9707cc8793c6e310195c02905350827527a785f36bc06c55a9f3e8f6334302b5275aad8825f4499ae0537ab0a8934eea96d4cf8fdd7ea79d0fb4186dbb55d1ef97d9272a346a747b94f8edcacedf3e866a25659b48b9716403b65c2b93659bff9d83677dd02d0ac0615ad994d37b0f42dc752c7b0e20be92e6db1e047f9e10f56537421c10b1e3e98b809b47e440656fc24d18aa6a40d17738521c87fb02a960c6bc0acf591797177d5104e84efb772b8cc5cda0f356ef36d4a02fbe9ebbba7239fbb0916a2f9a783c672f4aacd1fa0058b55d470d5e040d48487f4ec1a156ded5005aaab19b052bd9a46c89a8ddfce283c35ac420339e55befa94eaba9676f1d897f590f0e5fbb67e1cdb602845576591caed6a0147a0aee9c77c199414e73e12b79abd43d568aefbd604d163285a1b41988ba5dc7d36e1e2346c053498df515bc4e425a3a0ffb776c42ca917f7565c44ba1aed8440eeae84bab8a68285144f809572bf58aac2484c141c5484221b32581dad414dac0a9d371f6cb4dc61df8a0400497c1f35e48ad725b8c69a9859834e7866140b93d9c84cdf5c4aca2a2d2d831919947f3ec53dca6380da4857e290eb8b6dcd1c53fdba060995507fd92aaa8a8452a1effcdfc31e0e62ca562de7036882c8c24af3692360a0dee869be8a2f8389cda3db718491b8bc31e94a25f56db738cd0be367dde84a0c6c54fb8e6fb2f9ed81f270855d468660fa97a2990d780f568a3acb3fb1b91338e6db515e082892414c818e9a089cd5efb84c94b837ea78174d23fe59a1b749182a2f4ff2753db2a1a56bb25815b3534918ffb9a0c272db77f7db8e94bca4f4105f55952257daa90414d3fc7547cc35aef2fc9e0f42215e539049627f1a32cb3aa073ccc8638c47617c76123b5d18aabf010bc03081bf546d83b429fe0c9f2abf09e6725d90c02d0706c7842e74900b100bc6b09b7944f64e7160aa01ddbf2b505853c292f7d3ca5a739a6582a68faa69e04726cca9a4a46bf4dccc04036b9415177aa10cb67df8a08da8e083a933bfafeb240bccf61083b0da8c640f78be3dd44beb15d0538d2be6377f633fcf94d255c512324b4cae838c11a033b707fd200ce0e6c8eeef0bcdf115bac30ff4eb8e0b3fa17742eb7ac9f655bef69bb0eb446e5447a522ec4cbd818e2dfefc1e46208e4e9dc41cc0acea27f0a9fe474cd6d86cff5b788b9b77cc58e9c8797567354ddcdbbb3a521d09f82df8c00912ef5209c0cea89a6624dd408aa8bb6b3325c53d4dc61d09d295273ada84382544c4ba26ff95059de70a57083b775b32c7e276b29678b892965c980922b35dcc4551c424e6ccc62e0ff8f4564b86d2600062236125e4dc307db8e846ccccde4a9e01dc8e37385c98004b8807def412949f46cad51b981550234b122b248a144f1a4c541314adcfddd66bdbcd8c6e4855785b7881ea56152c9e235b575e98445a95140780bda19d718b8af9eba8747963520bf645f616033d639ccc851c25360214181670e9779a08c1b98bb7755f855cba63a837aa71714752f57ea6167a02e3e058ce3ef01346ecc331f8b89d8180e14c3e00814198f16ae547e80b18e91cbe33e3aefd929522a32084de036359c22bfd14a05078e353d3dce53eae69dd5ee5e67c12b6d910b6be651ee39680b5bb1705b9ab061e46adf20e7189484804a3fe56021f5edb856e07b7d87233d8d68fbc8123c55072caeca12e92b31b1361381048275c5c425eeda0817271e01fba5a2e4b2756c34b148f211b3040dc73dff14b45c4818315edd23dc4251dba8da7e3ce05a99216f0682675182f808a1b0c244ca01b2c1185189868c2ad22d6d1eae74212bbbd01d95362c5a52b7bb65bd981e553f640eaf54ad114d35be7803bf0c42b7492f3f751356f668a23b2d48bd88edf76273aff7aa0c8490097f3d3be4be9a4dc574c06e3b79d251db544211931aba328910e1328c1a836b357c55407e836543f324d7d9fea249da4b699a48c488a48c2bc5f2e141224b9e56eee64e49a43d1f4e54492c5f02be85ac00a988a23db4a3da7bbace5ac72961ccef75a235be42f62227097663c8b8f72b9eb987801db80ba6be4131429d79fcc2046510e818ed7baa8e8b8df28ee687e5aa258d6ae79f8f1fd2836ebaf26b340a62649b7eaf30ab49166825650402026631916d042cdcf2f39233fb4e66626fc20209d55db13661127eaf4edb9ec7419721db35d764bf02cc86621627de70da998f91ac05f6935ba49e9442858102470c866e62988c1a95e0db30ef687e1faf559a80a5d8303e08c622c4f339638901c102ab5b5ae3b0471c905e4c9665ee9d3de3cfff7a3333e77aa52d7cc91b62270eae2fba513235f74a13a7ce642abab46166713cb84dd6e1bc31a0220766cb542fb795f8596c6d4fad77d0c0213a3ad40bb5a3855dfee4dc27670c6c87346380678905e8314dba51f512887221973f9f50cd08e9f3b5617926fb4dab023c50d669c4ccd94ad5a409a2fa269e9f5cac00b498c5f1eb038d16a447bb547007388f1361d9d6aaf0800d9ef7c09e3758127fd4f0580f40ea6afb532fdd11c6e4fd689985c41b33950d291f8c0c7095d88ce2f6d296309b15608670dd5b950e40331f92775123506da2ffebfab2f5dec45fc6da9cfb87ab3cb02587dd1accf8a95db6683750457e6fa82a0cfe6de59e0aa8f3ef231ab1c1952158d1738e81d6ea96ca04a3c52522b50201de1f1628d7ad79ebf0b316d6b6d0ec7f3a69356ffd03775654069c14b6388a16f10b6a293b95563f871b87424be1bfb88ea564af503762aaf3511fd22ab78f4dc2f56db9aaa646f497b81fc111740c5d3c1c1963a06c48a21fb995df6372b1eff394655f96ac89a58c067f7d93b9c4413ce698fa0ef0d7b240f5c19e925e874c9b88d428f2240291fb088822c3fc479fffaab5732e880905e1d92e509d642f28d370fd34b9b1a9552c8aeb2d2b41363056c0a8bf298502e381960a53a2e99f71b12fb49b5361e9da7c633e6315daa984cab75bdf00e24c32a1fcfa7cb5fa0d4c0ec611bc537e25cb3135f43031e74c35a2909168e09ab88d5453273a5f9f920ae8ce20b38d5c72c19dec16e6733d4077ab4bf52805f3a71aaa69d1141a02eccae1e0241f3c39a93ffac3aa9d44f2a858147c6a478842b13a9ae0f581f3b9678361013449ffb5660ebb10489d8a4ec22516c1972e7497ee300d3716d1d7bb6f6a0425ee4d69c7df94a8de004bdb5cc7b2cd09684ebcb9a7b90b052cd09c24a264b9783821bf91b68490f9dcea914790e8246959e3aec5bc63ee80c09a70bb89c875a8e5d5bcecfb47605bff94af76a33b9cc33d90fa53f9ecd8a0f617263e93597861ce61710dcc1538284a79e2e65705f6872023f4cbf3c605bba166ca28cd4578d20d080c733dc0425e2243052b505eed8c1f084e3b8563e293cfcf30c4e59474290ae3895039a68641968cd346683360c1c3ba646af62eacd5f186174811e547f153845997bb980542bf000b2defad9c2fc56077cf19742deff1128cb95c41f38e091b038087b1ff9583e14f19b7d8a079f7c784a03f592bc56a69c65a06da2df5fcefd540a04d7302c5787bfab7c35401a5d7f2cee1d0a7566ada64372994f2b56ccef4c828a7487c970bf4319d4fa243f0d535ec06359f2a3ec1e07bcc4f04915d4296bf0d34cb663ff16e76ef4148be3be5ebdec95d90e28728b325e937b53f569a09ebeb66be79b48360da7bc72755dae75613d8f550b8a18fcb08bc8d25537482d35cbfacc13a104db5c181229dced1b8ee0d7a2a3fe789484a3b89aca7fe828ac87edce007d466d17ad8b14fa33ee7808a9d15a8fe0dccf75b9fed46e120d3be129d19c073c75f3c259de4002e93b22374663b103052aca21178b8097dfad11015dc1e59e2322e449facf09cd98c6b6663bbe59fbf686f03c90ec88a97945de579a7bd6c2e70a747d1e1b5b307c8bbbc6fe6b093c3d5d4dccda8dedf4ba2eed64f0ba702083957f2c7105719d41d2e96bca2a60e11485441ae72847dccf6de4f3a4acb766c50dd0b61dfc943d5c46730d8f17500451d5649ee33d8245e7552e44793c94d95e6c8e27248c78fb21cc49a9bf589b1adadbac1839077b466756d6eced7805818b8af23890f96719efc7a3d0016720c79ece8a2db3310cbf0945c2ca37aab613a48ffd68c4a894af14c112272f8f13ced2969a68bd5e4fca2d3419a123aa511c384adf1a574f4bab147937500e8f8d48fd27dc7ae850677bb649b0d1abb961b1a45261cdc883b6408ed5b3cca2440733beda0ca7f20f622e8d8fcf4522592e2c705c9d2de47e5cfcacfaed53c1c44fea6bc2f5f0686cbc2eaccef864ef663e35e56225342c854979ba2f86e5e3148a8ce26dfb4636ddd4a4d68a21a01cc47795a72ae45e3b8a6274e6e1932066105bab4f57ae19f2d2ac33c03b024e833666b4a4be24318443863c5183597946d2ac119cc819fa8c457e9c187396785d7f30e49077d50493cd94aaa66d06e80896a680dfcb9fdc190731bcda6ea354ed012fe1780947ceb223de3dbfc684652b2a92605d3a08a6e5e4a52c584f87f64c5733900111389844bb39fb94a81b7c276a7e36f48d6d1d10d45360f313f8f6a622f4bf905876effadeb985297700ca452a791a84087c9d1d6418feb20c93e4b4d35d1facf9efe8a5aea8f1f28435d51e6fc57bdf86e8012b994574ad9af5a8a1da2f1482df6843e2373c9a9379d360730ea31073e405d445cd48ac3f2d17fe4767ab9f940a00a4262ac0b8be536fa54cdea0940dea45e1cf00c0920813382d3d152b2cb3ec9a786eebf891a054b970b5cec86eb216b6e8d68bb0b1a047c8028ea34a40eb77221e057008bd6b26c832e69d3b3e6994ccdf8a1e045c46d58df461518a4de30931d30dd359b5b4043090d9293b611df01e587c1199f3c75f889743f359932152eec416b54fd29af905a08cfd1b80c8e2b4194b9baa435859a9ec167be3bc7c277a78ccc1599f6de7bbe23cd4513aeff5628fb2fb7a053103d9cb8b1836c3a46f578ebddca2509f5ac1a0d0f55f96d364fcaf18964d08f65546f47d93993cf7cae52ec54aa9b0e31e7ee14c1bd3a4af72889753f6cbbe7c2b2570fd09603e440a378ad13582bcad526f6b684a18104570674a3f043553cd7d38602d0d39f5dc59685761bc5ae8d146549276947677b5a3322e1af9ce4e923d8d72c3672685a69a6ed218c713898860290ffb19ba1a6fe04829c64976b1a27148f2473b6152f232683b6c5fae593a9cc091344e05d2dc701601d9e943db93e1118f7dd0cbb5ce31e56e545b58687b0c0b4467f33b85031b86d52250d8018160e10f778350d0cd39e379597fdddbcef7efad49a0a524e8c3248c70b6a8a97e32bc6724f6906c0479fb26abd8d947afc379ca412d4d2f89ec1bc2082a4f0b628137b10143d0a7200bdd58d6259d9412243efef0b5cfe6daf26515f6985c0499db9d5a8d10e8bec2ed6d331f4694a77d39aa51797d84363bbd7967c25b415202e209338ef122354fbceaa3af9039339db194f8502c0729b4dddc4aea9764658b0b3d60cf97e5fb2544ad507fb93f217a5ef4de34e2abf5340c29e4050e0912e57d3401e65b714adc347df949aa9e5db130484d89e569ea644d1387743dec88d72dcf200cd8e089379e9b841d15ee0d9fc0ff208d4b39894a7f144fb2f99c31039a6fc52233cbd7f00bbc8424c97fa4a3ed2bc864e566860bc58d4fa62a7277c539f733d59736e223a9cfa1d29b0c868abc9a647efb473504ee9510936e6446f9311f5c609cfae7bad89480524534bb8e8ba169fddd769fb2132fdbee1332f283938f5fce6f12df8d1367d8601f5ab93713b2dcd77afd5e8d67033d1c3d4af07525c7f894c21abc1ec9f7663c4c290a2b1f38fdff21013f19bda29f07197f2462869f0718c197694e434f938f6aac53baada38bf404b013e1d31ea8449748e923a0558ee9a8c39c67557f4228b876488340f88752f39ac0cb8395b296b1e35c62375f69126be03fb011413e90403deafd71adc691c17402573a2009377f594a6ab976c65f7f3a6d45c53b68603dacf539bccc433c6e6511e5a78823d718466034125ebd1894b8c29f94886c38c930f81588cc9e39c31058088611baa736625407a4ada6e0bef66221b3ddfd429f135000a2f5287970d7da86a7c5eb91f5a8a38bcf20a460f98645985cd85832342f7551ce6487a9b80b558a489f08874b608f95a9c26afbbf8228b45417f7ae962c6234fe9f290a473d58c67cccd1fc23a617a842aa853a1be670d29f4707fb55a9514276f073587e0a880ee6296a53137aeb157a03ba2c6954809a9c5c2a9a4a34f2899131f53190cc951da588db1e117f5156369feb543363e1fcb3dbf2d53f00a6f726489243d878436c575b150051b4c60c9eebde8b4384c4fa92bcb858b6206a862a28e725523984cb424cb450f46eaeee2c4b27205b67f0c060d4d37ef56d5dd7f639a43b5b21649bee95ecc3235403665ae3ff1a3a25bd002eddac98b0b17eb9e0799c227c5632043ecce47b84b4dfa9713f894643f59fb2301ed5a39ad5ead16ee72e8dc70973dc0e6f40c90ece6573de920d7ad36e6420662b017519104d6055708bb5bf2bf301531a14021b690e328e9c03dd754d4e24b6745cb5584ac769ccd35c40b312a3767c03d0fbbca7ffd7bbd72672dd49c71913f63379067dfb90e0f8763c39ddefb83ab2cf63a578ab88e4bfe51f588b7428f4b44101ea183749de8151d5bf45041a44b953f78a4843c51c9ba6546d1a55856b91fdab53f74b19289e14f66280b514c42251120f21892b51a0c873cea82bb00de9dcbf14891a3a13a0f796c44ca133fee5a162c411629d5274f07c9220b79d0d725fe9dedce15913ab243a98b2eade234121833e798d1fad2ecefab5c96fa82de940a8a609c1cfad6d47a5829145cfbd403a76bd5caa1034e0d3f9ef118abdf6d4668bf52a8f665d0ad98a840348377bfb1ad305d906a63df6f8c840f43ee9970f0a254f433d2c860b7995bc2427fe34c649916ed580f2ccc2f64b4ed0a2930ef5288a6552937c0c781dafa4b95f96779dedb904940cdc94309fb08149cd46b5c64c9e80877cb068972ce84600b6294afa88c2b71d045e8a96d9636354b200c7e3b972c69219679346f97e4fab8269aa3de27d319a6f60fb367e64101d21ecfaaf398707efde4e1232d937fd0641f2607bf9f67d9c387c1629eedfbb9363566be39955a2b84f8b3acc2da600c30d06cab5150df0a19e127ba351dde879a8d7d4b0a71aff695d206ad92130fe9fcc0e93e326e52b96e0990e49de25a135d449c81e240712a443af544edc43583147d20774cc784be2859868022ffdae3e4dee15f4f9a2985b292a6f2a4394fb6e151ba995dcd2365f12b2342b4ba09675bc4dbe6baf7b27a22095ad20924fd6d479b26d7579865ac8ab5b6256e4b8bda8f15bf361ced4064035a96915a1f10ff653a7d2545ef36a10a8dedcb6351f2d32c28897bc04fab6a990f31e0436be04b917d949695a322a33671adb3113ee0872fa15cf9584a6293f622ed413c71652738e5a8af0d49747600c81ad61f4ea93c88c704d1269609e5b4d2f61b8d938513e74bb8df4c3e9a3ee3b7e7008054fb374b08542d8ee194a3174b23c4ec4d28d68a77da7621bafaec875b4ab52716d3d885d8f1a3a5aab6e00728aa23a046cc6d22e8015f85c1f7f0bb490cc214c170800d45b0748c62347691b7b3c56c1dae377ff6931668f3a432c62b43db2234556c721a658b41049abcb3b50f324f766b1905f8ea5e1c90c945ca71514ef3caa7f4929e4ba5d93ed9dcf0f29b3d2a9f5354fa953b4eacc05940353bc88a837b06a9fb5c055848ec86f1d4a5992bf93564e85ec568c8d06d9db3670709a5bace3bf3972a5c026e265e559a8b79858b26c3fb5ab85ff73d87bad6915e12471cd65e9ccfd311f7f731decd5a80732cd48fbd358f5ebceb79f042978ea54c94ab755fa94c89ef902974adb95155b11718527cf82d301fc7a8e267bbfe21504385ab1f5d452d39454d7e75761a17898c67020cc0fc46343d9c36daaae61b110aa081450150b407a66fda274c5c14ae0baa2ebb10e959d97ea2424bc4a49dba5f0385f65c34bc0b81d77dcbf877c0b585867d1758f674ce4ec6608c28ba904e9c2f717aedef3849115d9c3ae206760ca5315af688fffc6c6ab112131c6acf04a6a383bc3d9bc17dee50a6c781167e07393424e832b40203c54950cac608eed24f365e10855e36084f62e6bdbca032b6be67e00a017296eb360ea363eedcc6cd4e27986c29836e719c31bbb43dd91890e5f796a599bab6cd4633952168e7ab1d682e36f50256696e5c83817b76ddab433ab1aa597fe7a7f06180d3cdcea85e76b303b179b7b5f03fe5df611438096d2025ecc324b8cdd824166bcfabdab685b837aa3f01c4eb4a39ca87ab43f4fced39e658b9b9f453bc7fd4aa2f0d0f9b6fce634cb82592da2311ef11d54bcd44e563cb3a836e53e941f977d9ec9c655cfbeb637651671bb99914196e11502ac6d3f5defe914d522fae4fbbf9468ba2e99e1219d632c2ee4db8bf20ec4fae2b07a4a214214a174894ea24c6c5c8f80675367770e6d1b16437328b5b5b030674403ec3d0bedb02886e7ce084732cf34f14be91c7ea6d329cf7e4b02efb3ead68aaffda4659444581a00e7be1dd4aa5dd98e78e0e1b4bdc680049e90d48e7cfe66bd03db09f097d724de936364086614d77ae580a5c86725bdeef4ee0b0639d1056ad7a01e0a1198868edbf61b55483aa7dda2b2f77ef4f2ec43590db0f09f63631e0eee509cb8176516f90819b276a44dd54c3bb28f1871d85c2a2709379d4a8748fba4e0ecdf0d3f91f607ad166221420e25cbc8023bcf6c2bcfb54fc40859c5315205a0bd3ba15bb30d8dfcc8c03828296f5521ec55978ce17a3b4db8fe94d808c34a743205c70356d35b391c23b008e037826b569bdff08bb5f4dbc32ec4eaafb59c9237b3fb5fe67ed30882f6980fe158566d665dc4e33e06933757301b5566d9ae0dd025981a283191fed6a2ff0157f8b44d2f6f4af4a1b268ad388ee327bd7270b60a3e73cb54a2bc4d652f271c2f8d8facc3aee4096f0662ca01346fd14d9ef137220690501763ee5fd40fda7254f1cce0ff7297329c5115b46fc68e434fdfbf0d8d4a250000698f85b9cd9485ab9506767448a2d9252dab27a6bde51d986141eb2400610295124e5ca59559757e908e711f14ec5ab806198123944b8445b30e7150b7b0085d6ab6eb88e6888165db7c54b57cfd75e42a26b99387ce61da530303e7b1678b422692c656dc3f5e2f0858ccf7aa981f9c08442556a97939a1fafd6684be578c86bb1da014e377b80e873c4d6439cb7d5cf5be0d84cd46b976ffb21631ab9c73a44c89bb9499d9d1b3465e5129a8e3ed680bfc33e0ac6ce348fea495277e425271f9b92221e875e219b7ec246015de64c04a65150e1ef01df49512dc70c4326a0a43c468b2d397ddcc29440752f5f9f8949db513bdbbc5a11cfa36af383876ef3a16ea16412fa14d0265c33738b3b30540c203667e6818893ef373b058cd8a5aeccf5b48f5cd6b581da9e32228fe6083913e90f39a3fd2a8b9030d75d0ea1121b5f332cb21c196b759a13fbfb83bf95d406e89b7a4050eda8a6200edc365ffb84d423e416b4541517a144074b9391c068ac8acdb41a7a0840e6e967858010985d5991ee89c29a8912b2ad5e3427fcfe08e27cee41fe52d88f625f178ae84b91fa3c875436527e007b6634fd50603992b37a0a53b58dbbc2c17457c38f30c642046804e8a20d013845944fd4e6d2d14efd0f844bc83fbfc4fea2de3ebdaebd719e3870908a1e4dc11f41d37337c4d936b73582f5ac8e620bc4012801a34884cc8980e264201339c3466c6d769d90f1abdc38298e810ead5269411a42467a15cee81ff90858f638c6a6c681fe95a0dbd000a5de2508c322fb9a7aaebf5a6826d031c67f6944bd2382acd17aaa7b72cb18a1d2eaccd88e79609298895c4b91ac1522fe8e7f0cc86e4619c9efc0e046dd758f0a82a4acc3ae11fdb8a70b24347bc0268b556281476c84575d8f141678f4b4df2318d0acc0a53f8f98ad60527bdeecd097ce8df8677e61c584414e287d925804130b0d5a81b285d1421eb4784bc00257634d6db545e72f12d78c8d01544a5c399b003b2c0dc7037247a53d03f7fd6587d650233b6e74df9d1be68fce431659d914711e419e82b1fed9c86fd3973878d54ed5312dd4405c385efad0146585aa89bfff611f597580383af4f521a9e268fa99a49cdaa18985fbdfd2e38eaa812f8f45828d340094e518cc210d44a7b5b5904286c5ad9a5087db41b84cec37936040f35ba893e9183043fc284cc3a6bdb26f5629c887cad708c994b5c13affa02451d75c9b5c21beeab3b058b257651c05d9716face1283320712fb055c6f8f4dd64fc560e9c5259d82210f904e3324f9fb44f6a5238cccc9d08e01a0fd88bdb498e0933fb02e47ec119017901b9d91b9fd097637ff3a4f1ca2c02d36accd72534b32308f4009039b79ff592629347ca4188179b148ec704bc4ac140ad5170c108547ff861bc0a0640990c91620440832b81ca189648ae8880db02c43caf0c1fde9fee80c5c002a8d2a6d54f646ff63278caea3a66a35358009b3bf8e905a9630c661d6570c47806c4bc347178e8b2d000da8cd372f0dfbf25898e7e8d2bd033a407592779649707f82d61cd269c5b42107e30c58982603b10e3464b3e23087031408119693fbce9118eaa0657609718a8cf8a052203f59ea3c3c10c8a0c5ac87faac6bab9bd8d52ec0d36ce6a2a0c85185343e8220e3cf166ca89e2be79d967b46deb21bee8bf21e4c31f662ee480767d0687d267cb7d99d246438641218028ea9a010d312712aecf571603a231c53a71082d5abfc3e10c56cc175fed776cce8dfdef4d3bf0d9d59c48039e4fe7dcdf78a1bbc3dcc5e789c4f4902196323437084d93c4970fc598040ba251a447216ed3e81fac1cbcd9ee0efa147f762bb6f436af8335bae1267bb12aa1d20c2e84ea701f9b671851b98d6b55012b8361719c3f1c32c42e0a5ef486baf50d4ff788256009768b4f70a5cc18a5162568c575ced919ce71285ff99b3102c38855063c4c1dafc70be8888c2952a5e658aebb2608c7c232da4e876fb07f3a1d467687457a89ad845a54c5165f2ca2b12c27ff47280e4edc4c4843df368249840e4145ae6ea88467dd0dbd909b3c0293397138865376bebec4b48a0471a1cfb18e1310195c4d659f8f249c05063fbb08108e4ea157bffd7251763cf3fd597ee19b28a00ae8a7626a673a8d83b519366f05d32d1afa0de0b5c222cb5633c35943219aa55ec21593f29548cd4c41cabdf33fe42b6f758a22c43f7364bc1d01a531d91aafa65ed26021d47ceb47ab4fc5f32aef5aee00b9d12522af3696042d9692cbceb5c7fbb623fc075abf4132185534b482ac5d2020741f86b3ac3b1bbaaaceb887a0a67e06d65d6517afa3ac9c4fb9a0c81e01624b5d7cd559474d41e137fd66c28c9feb893c59297421723052e1c9b74c220a5ba95fb4a2f493851caf35e057cfc3bf5e71e7548f84cc143caa52c1e99596baabd0ff518d2c9f3778373761b8c07e0da23b48418795dbf5bab05c40599dad48e663cff009a3e5e259e17bbad6bc05b94311893f794b9acc1e89dc99638479db97a3afe3c108de8ad75018062bd58fa432a8e4be998256e8406097962a49d977cd03760fe57e34cf7aa0ea4da8a54f5f87205f6bdf9cce259f305544c15b5ec6dbca079e7d32c3458e275c62030959680c26524548801fee18cca43090dfb212cc08c95752807b37874134ad8a6cf17ba865f5d7cc25ef3308c2b6410eb76c3d54cdfc2090218742aba2ba19347b340cfa6b114efda5aa5801ba8e69ee074ee93a1cb3fa79a3640d81091814fa8611a523b7a054ca68ca39acb28732ec20d3095d7ae22e14202661bc969cd86cacdf550481b07103c6e7461840fa11a9dc2c6ddc06c3d0c4930cba4f24b0494a6f5bd9e47abe09e24acce59c23d717d19aa51517bc40619433bee82e8d362ea50b4289067a3bab37f272e1fbbdc7c062a46c11b26b0257b14d9801ed560413d38683cfb0bbf3a7813e6b1ed8dd7796db16ec77eb457f8324a41cace7f84a5f00e07612990dfe698c809cee2bdccc685e3182937ac020ce8230897459da0520dd2e167a0fd31de55f3f69f95ad22d5691f211ccd061bae4370d51845591d4357482cef2d30f1872996beb80c984f48b8b61872828827255efe0762d9da931d700ceee38cc090144ff4b93fbe42e8542ef28ea9ccd7ecfa28f5656223dd843c8d5fb7c5fdff386e81bff51822b812bd1a5ac2e3d5b07b7e676bea6bbdd705967773862b71a7b5e1704d2b4d1ee967d6c07f5b69501409400016f98909666bcac8df7d5d9d199c651d2411a681f3d94d2ad94f316d5c1c00bcecf3a4bac3d938d15e7d33d3536cafef595e1b2868e14fd4372f41752551b7a24b319a912f41b693ae692fdfc98ea5d12ef3d679bdde5f6fd9e846c720014e9d5d3285f11f440eee6a418f123f4e269c945fa3eca6d8ea1105fd2747d8c0d01f34f74d06f9bae7f3bd0eebe3746d928faa70865e0c68b23ae830b4838280a3940c20bbf0efb1391a4ba2cc53426d04a0f3502349a2e1fcc899d2cbc0ba707375449f4e824c2cb1954d843e1bd1969ba23e410777d2775a3a9d8ac951632ed6f1b531a56a0510fb9e243ffbc3d2f625880e8d51c84eef167c054feb2a31253b00473ec3d1afb32c3cbdd8d8e69267c84c6643040413e35ecfe9eaa97f0c1297f5ce91592aeb242f78e93717bcc0c0ce83f3bf4df822a79b69976b8c7f65728d8a41b51a2acd79b02508185f577842c42d24aafb994cd1ece8bd0130bd6cbe03d55b4ada3b89ebcae9ca4012e705a0466d1f392b87b9b9f51aa502c7ec411a6cba71d5b0df24438117cb6c0dc22a2e28670787a0d099e6a3b5917edc2f34227482693791e22f549f7128ed22e10285f1be46703e92877abd0c846abe95617b0165340321c046307592f6fa9907a9ac280dfd05dc232f6dd0e59ffebd7d22f1b959e0652116644cb11ceb258e0e962a2cbd16f551a9926adae5fea650176126292c8c3e1a28b3c032d2d629f84f0e9cc9b7174216dbd3dd6525fe510fcee8b3c12dc463d716db9572285f6b5d0244bc1c08aad5a18167c881068dfadd495f3bdb04d58d6084df2bcf7409eff573adf4bf07bd74182e2d36b4cad69a4f769a5a9da231ac4778a7c6b1b0bc401d34ff165b641e07ab33f3b9f54e27061dbd9101ccba8df5870360863430553c4fba7e897460958c6ec936de50c5b5faad1520a02c7cb48b32ac16e06edb0fb584611985db2f820b039e5167706198ae835192a8d7104a81f6ce9b504b7b8d907ad33029bb5f144614aa98db14b73b7dda41ffc82650ae797962ee8b7d460ba3194aa76c2192be8297314f713b72277c1d8bdb1fda159f409bdab8ad59212415c39bd9fbc0fcff9079fb357dbb03cc97b97498daf45b7176a8da5365f2dee14a749dc1647fc818f9a7022e257610ca17e02c477977b85e41f53ad1fc10fb6a9e9bdf4d302254aa2831d9b47481be54cd83340365b795ce482de59fe818fa2606c4edf8a0aa0b0886a284f615f341b7b4bba4d55936beccccad9b7c6941686f6c5e7662aa8e9c75b436ef9ce3d4d10cf96af03290015583f7bd67c36ff5c4bd92d38dfc9ca2fc79b1b5c75660841f562032b14f6a0263467118f5a03406d674ee4181b67e560835fb43ee8845f34a0852bc32fb1a38d19ad1db71bf6024e35d32a714b59f00bfc731d6f7b06204d8ae0f226986d4f57f3b773cf4c4591ecb97beb09a0349a509f53ee2945108401b5048d310ae64c903627cc18822ee414f7dd7f166110b5b39e0a2fbc89b1728e26593db47231f8a79bbc95eb3c59f6e60c8b2093d14925a38612d7dc3851070525c315a89bf84b347781ba154cc2d522420c9d5727498df0fcf81bbfaa3ed38f254e45ed3aca631b0e88acaf2b287c56db43fdb0f51e926204caa772c9983f770dd620f6415aaa37b3d1ce5d1d313115bc875c5edecd63391b9ac98ade7ae16479e7ae117a387897411be5a119efc50a19f0d94d50bb09e29d3d0ac7433cfbb7c060a92f440f777203586a2162c0f70eb3a59634173dc1d81a9c102f4b1beda21e543977df7384cd4296d6f47e419f2615712f34e9fbeb943f61171401368c71b7293afd5aa80523e8a387652086e3f1b5cc4c02fa08e67ed8701423ebc4dbd370cd1a4bcfbcdd56b98c63bca39e1525039c318f79a4844d73edb1f75f5193690f26a9836a9446a9074652f56043d93ad6b58eb3e30488eb645c68e145059f5e506e4ba91652c8efe310beaddf905def263aebaff73cace39058c5801bad598b58478ecfabd8884d8128115ca2d3408787cf4f450596029940e4b380f6f926e10ad61045fbaf648c4e62a1165653c50e28a2dfd62cfe37f6226cdc088140eec5a1006b31e29e10be9d5093b116fa92e6ef0b16b49a7e2e6b98632a16126e7adcbdf9ac92023b6e226cea45a5e30a3f5dcc92072fd43a1c63976632c321e710dbbcc4a05cef15e40f34e353d7f21ac9ecddd65b0c32da25dfb83c5a573c157e7788a065bf5df82949319b2ba7f07beb5f801c74c8ca0f5aaf7a58dbda5b09b4e24ec2bab8b5ab2acb3256e055f5e688e07e3c926bb0fabe586c9de51a64e5ea1cbd046bedf95e331a8c81a6a937732c6d370642c00e409db0b6b4f490e9538b86b544d545c163489ce527b3e46cd5d3e9d97f922f59846a7b347a4d9ec2f84989cbb48e574d17bb6a6d3f6a5aa6ff715c1ba770e45e86ed38f8db7248e39334c08ef04db67edae9106a38a08287296842141b786a6d45a9afeaf54d46e5bc072af7c22857976675abe292041e54463c038b0d688dc0d6942cb3120db6f0c43eb47847231a6a38c96e07710475341b24a66a3283797c7a572d56b05174e23ee19ead53d68ead2357cd4604e27cf9a56d917a6e881ec7555b533bd3c16cb761c2e3f13c13235609149f6cc23543dbb8dd297ecce481f5e47afd23d2e469c82b57f5f47be913c2c75b487831243c1df6652e062bf5dd1383ac4906cf9a5c8e20d229b9da750a10c87972fa0e2e58cbbdfa4af1fa075b80e9b73581b446dd71d16c6813343e6b8c1af79012b755334083d7a3710c682ec4503f346da158d301cee757d96aa6251c0435a97defef7cf39028390314fc0a3867375853f57cca7d5d105332911d28d0e835b34d167362c8c61e8cec6adda3eee89570670259cf7cfcc3668590c4cf1b2d9efd3b643e97e00aa0ed24303d0624e43b189e88802f1e25fc74cdf327e7101ea365cca17c8f2eb63475bada05686e0728f2905ebad04da11d04ca0ea3ab9e09846b8e5d764a73bf0c950aced89b3a4b75f7170582d6ea4ca8dfe1e3f81d19536fe0a0dff2927558572e61478c40b018b5d2b4732eb99ad484a530ab92ca0bca03dd2abae1c36c8a65023e64a0e0cb1897d19513b09e2ae95872cc8c864550c848c3dab5df8686c0e7026be4b481571f402d569bdc4cbba21208a0d8897552f9e67e0062964560e5f58c71244e75dad07dd14d2db7cc1837317af745908a1e22a551c0b3e07150a491f1ce157dcc205c24d8b1ec88cf1596ec233c8089324e5798d8230019e85fecd9653bbe4832dfcc5b475e0a1d319b23416901ec77c519b9d47cb30efc75800604814e778843c75ec8ca2a87e5c27f57c3499cbbe5c69723ba5938b0a7c099e5a0b419a4d9fdd82f3c060eb30e153ccd945003c77679345d718ed30b6bb90a9a1786090948047fe5a80e5a186a24328c4b034cc8d31c60483a16daeb3ad0dc7f5f651be9c41543e4de9c5dff28fa01714156101fb5a830e41e676e15c5222d90f41c34c3528ce9b04d22250e8ca3d028d4c2a5a2e6c442ef9dcb68a0a214a3d815036d56c8425d7d0bca6f9fa2c4861ebcbbe672ab4d6e0f9f9579adfbe4040b5337728050caf810c9a0d5c7ee7de56471af3a8f465bb2c5985fff6e9750b393c4153fba1768776b04ebc5ea356645723798ade5428d483ac6125e3abf0b13a58337379f6fa4b08287e4539b5ecaef12900294fce193c02d0471ed247c4abf390987fd1aaf27c273880d8de43e90fc8a85606e84b5e72f84205d546f1aae6d372f494d9940d8cf23fbf06e5f4941b0c4470d62bfd448d918530e53aae7b390a9a920fb894b0317fa74c83ed6307f682e52673875b1840c0982318cbd1da2135008593aca61ceb068cac339eb54225299e05a48487bf32be7d051483b82a4c3ef2e419ec123a92906c878eaecb73712ba45a85c4904478171ef790f3de2412a39df6797b1e51ad4865acc8530613bc654f361d24c20e5d1a262778c66b965a40eb60747c2bbea246a220accd8f88404d7474a5695d25313c92c5a1ca0b01d92e49a4086221383a53ef2a0436bf338ac959fd3dde95f3f503eda305d86452945596c256e09306c33133baad4efa9cf23e9e59ec2512c2a11c594fc54260a313cd2d51a5329baea2dbea5626371ad475009469ab64b6965566a603da696e259a033b858f93ee34fc8edb416da1d1b83d996b29db623c43fb3c1c50aa50adab1ded8cb0ccdfe44cc12006604da8328bac2c5761a75f6c8f6c20321110fd5c11d16eabbf1d9f6b64ab9281889f8647ba70a76e8ee49ef56c048645f3c403c9c7b08201996efc4f8ac9527f99f359bbf48765e0befa668b8a101a149f8a1df0d5e9a2215226c8cca44c6ce4f4acdd27aa545f1a0a5804bacc483faca833c5f94c9e4edf4dda44410d88e3b5dbd54906cd104422aa9be870a02613e09b97a052cbb3e2f8496982adccdd7c349eba366fb0d7202f5ae1346e5681860fabdc5b5acf5513a4d35b22c7e1ee217f0900b56093b1a93288ab083067f9553bf2abd0e06653546dfddb6297fbaef1ae81769bd485d3b17fe0348a4afa5f4efbb32ae031cc0fbc38fc52dab288b604e08a7254df2e9650b95c9e76a32eade377d254eb034f1ce6be147d4fe07807dbe42fe8dcf2c4a8df1b665ede89f88f1158d2ff5a0cf69f11f8c0f1ef4ab4eff30b39fc064dfaafab8d54f065dcd561dd6dc0d48950c171b52c318c422854c43327058bac23369a6f382bdb1fda2509f34812cf32b9eaa7b60a7db50341edc699f67bdb226f5504ea4951dba4a23f128a7b642c901b56cb61e067f529458f33c9bbaf692358087243f98e9ec37e4281f651ca5d5188eecf877bb99e4a30413cfb149a5a9bbe92380ffe1036346a5ec22b7401c7e11cdc8d06500588aa06fe423428449d6021032b969a640f236b20768ce5c36a8e5a99dc7ae121fb702112f93054269786be7a24cc3a4c83b1fad40119313e3569c1e128ffc5a6b9dccbf8a818849d2caa8ebea233175f5b22ddebe0d09226454c1cc15e153716ffee221016c2b94ddce91e24502e47f48c0b00da8f8258641283dd742e06b79e27e4d19c4b0ca2850ab6088e1531d7b9bff086c7baf0a120462a794ed88f280694d6644d74524b841059ce667922672602aef63c41e735c7ec0b4030a0160089ccee93cd59d8a8a6c505fded193b9971e0836318da6e4e99da1ee3d56689601d4ac10c32470e803105cd5b0ab150537d16c3adabc4f0641b70b9e3451f02a3584b2304f6ea4d4659bd100f8b26e17606530516d576aeba9a8e0a2a24d6f8a4cdf80e4fb2df58a688b8934a6a25f01363d4f35ba4e758f36a9a81d33aaca48207eea106668dfd960fb8023685795a37c2d42005800a4eda599db79737f0a4ecdb8da8150a7c74e83fda25c1a56bad4aee515900b8fc1a058bf60faa38460148d1c46ae6f513b56933820c1381b0cf1f4a632315aa5eff8786b34a9f6eb237ad162e76379f1a9476c925edbf0c7e264c1ab5909c8d2e8f9c7222f3263bd2af19e244dfa80f7bfba275e8977dc782af638a7047195189e6d335498d28d7ceaed84924b40a1787954ec90afa97819355ccdcbd01363a716a0a3e547a760da63f1e446a6f09993311188a29024f5e740941a6c5175dddc6422f13c3901d60a3d250b16461925e822be80e93a765bb711d33c774fdf1367cb3af6cc1a2d32d3212910c634aa8d640213e0b64114fd8c56d07f97985834e3312fe50d6b134348c8124fcdc712ae8c5694a58d3fc542e43d2cd2ba7da3f8ef19c59b5e7cae2ab274f178a861c2a68117fbde1ca71b3e28301e54995a7761b935b3d3afd56eb35e5902bea62e68bba11accc13e43b3b25eda5d700650648326618c4faa089334d7f9002a873cff85114c6c3b9a9950b1ccf49daa5b9617c177545c18e2c8b8941952c566611d1b02b4c54805393c1e10c6b10104b62a4255433dfab8f06ba5ae0a6515baa2cac466743026178a2a8ccb3cc8208ec9a896eff4d2aa1560d9203a9cbc82a6bd60322ddfb72699f5b0263519945f8ac8e36ae4b3f5dfc81697c8a0bece7ba975012e188daa371312af32e6b3f700d44ad5436abfa601463b548c764c876a1c9887e920e1a89bede3026e8b2d9f002dae5f54db419c083e7aa5b3efe5a80562fca0e27fd0e15a9139f986ab2e9b61ed36e82a6e791ed3ef440b64d71273ec7acf2dcf1bd6d6e3570a1a27e49b5520033536b0e723546eb503ef2f1c682834f5af9150c121f5db72a1321990b9426695f93bacae993b0713c2717e17860c7515085cbafba1d6ccf9b3e1aa6de8518a1f94e637727dd48b6e17f409a543d29dbfeb74c161cd5d26138ffb71cc163ff59da3bd6eaa80ca062d7a95428fb3cbd1c3425824ae4de219738f48613835018bd5d24f9fe41db9a40535c819b0870bc63bf0fe7f80d96f8527192e59e3e42389f03e97db639458ee882382361a414e1267e3889ba99126ef49aed496a3a3ce60a64aa10a60c179c9f7e4a3f121105a12b4ef2123d9fb77c758da1018da9ffa06b37f54394020f4234945cad3beb3a664c0f3c966385e8b7614a65a760d065e93cec692a81e262c8d23f8e544541ede09ad438d5211d396b116d876cc4ac2ce9029a516441744fdf7dcdedb6dc52fedf6520a2661b4a8662b4ce6ab4056e578445fa713ad0db80e66f222584a02d27e0389a3211034b4b52ae0b4d2f91a9dcd7b5817b45d99e2fe3807ee3119aae896dd02c9e4489d81957fcab3f6e2d02ed903102cf64e3645541c90eaa871bb3abbb2068769aa95c7f95cccfa1905094940ead729c9bf9582a20330030d9029cf0bf523cd71daa2050f616cab4d590ecc48f10b745cc0322dacaa6970bea78306a7a12aa1ba7647a661ead8a30dc2bf5182b3336858738934497a78083541dafc67d1cee72ca24eddec4888aeab7cd7231d6f73de9b993cf9757d15496dcc156f78c6fd21903071712de61f63a5ec981e2c1951711222eb7f8bf2ad080794eb311b96f1d3e98c1335c80ca176d2941fb93c18a829ff0678c339d571af874b33f03520c534fffd46a94fbb5bddb12654f9b64c7621eab3224d39986a42d5b33da1d05491c6126a510303243b78a237952ed8cb45943069d26afcd032be856ab46f320294e45a7a2cc5ef9cc0f0b245e54c862311b65175ef96f151a39f8570b792ba13e92c941a7ef2d7d8f4d07d6265be0dccdb3bee7c245b9d962793b23999f6056fbb985a72a99ceee78ca2d6488b5eb7ca061261e814ca253c10690a6bf3f8f5ef34548ee38de748f8fda9e124bf2ce760e24c6a5d2bbf411a1bda3a67c5b45b573741cfe6b417b72fdc55ea2795dac4403fd6bc1408cabf0df9d4083125330c0916fdaf95d5d5bed9370f13dc9a9073f9aa9716aceeb40a5ae64c7db032b4cc92438bf911d5bcb81e97c03a2a16829802de9975cfcf3255a8ab138a0fa513f6bfbb263fcf32a29b111b179e0d3776d04331aaf925608cde44bee2b41880d544fe1c84d769e1e94427f298b50d52516e549ebab5ccbe2aff6097ea2e18681f625f57364bae5446289952dc964e76d173987a83b8846d4f718cea386215b615144cea451d03ada622bdcf5d70cef89db4020044dd6ede6363731557b3bd3ae4b329e545545a9adedc34dda42c38973f4b9b9e3bcf3125589345e469b97cb981144a6c2abf0306917d6a537e22df410de49e6837f996f1cbb122f172114b39ead3779bb1e2d2ae97ae806f5392e01872e5829602038ef53e27ba1e38a097e148871a78568f6d3bc813e4bb32fa7f1dc5d1f53de0d94d3c66c290c314449fb9e185aee324dcf8031d9470798c4bf7b1fe1f8ff785adeb3644cdd0ff5a67445c481b2f31e17609f696d6a2cdd64c0df182792817a2a42d5cb080a28452419b4084a3496c79b7540dc208c082c50bac70c7bd38ebf4a2aca2341e682f17fe3f65b3ef12f7fc23195a8cfa546fee77b7c634c1cc5ae525980950a39d564959e79874a5bc5d675459fe2de8cb92506605726cb49eaf809dd149a6da46160dfedfab83f328a6ce878ebaab980c4f7a69c6563045b61c8ad4d6c001e10c1945e912cf26861708b51d902d7026e0f543317a5ff9def006b272a32820ce0ba4849d280a21f76ff67103a02a45aab4fb82909c0789d459e41ea4245163ab5d9646c1c033c29a3442d85aa5cb6e7f4baaec8a0b09eba7e2686e535e060ce76336e43ccfc38e8e572b4ab4106c14eeae7d089d4691e5c76ffc3b0d406a6fb175c0d12c5ef9ff4ae677bcffc6fe1d3114a9ad523760db203158d5d0f96d94478c6282117035f3307a75e680b434478631d5a16c7ffa94d7d4e691b3d536c51d114413d691c506eb24f5adecf79d31e85451115f598c3eca8e4982a2a4cb99381499a4575872eb8f7a3955ffa0bca07e69849fe78f1bc4703997cc77b1fb185fc55b3f34490bf0e7bd8946861d6525cb3e60ee285f6c31c8b901d78f9af3adf256396234ec3fa0ca9b0a61d2fdcc90da7de72fd18ec7897557cbe97b4b4e8584b9bf81f3ed12958ce26aacca62121a4f4bd3512d52cb3bd6ea0fe44a23802af18c4ae87f69277d7cf5cc94a8b3b7bfb979f501d72d8913caea7787b9975b227f1c7cc98f71377020b2cf3b78fb21c5d9962aed360f040da1cb5781cfa8af6e44597cb0b1e8eac429808def6113829a823d7cacba16d1f5985ffc03b7b490e7e8c69a30b9d0ea0045f1160713f38a28c6a8b926378c17ed654c7539f488d1cfdaf9ffe9ef6ba4b5721a7ed5cd888271c28e03f3235e67deca9023f6e5b7ecaab8d29dcefab20e637bc21f304411b769950ff4a7f5c4c0f060f3f1c08e8183a5d5c9729949509f503d73a18ba012194da4799ea3a0aa88026ece0334215a26792da859de2ff695206daa449317810828fb9a6253dbda08d9f5791b1f1474239fac0387f7cdbe85e28c95b8fe4655f4e35d1960f09f8536549855d10f33a7c79b4e3ee7372073393cf5cee4d1148a7ecbe448538fb494586ba5c7f94fc23903d8b5b2aa60dcac5647f4669be5252bb33115b9fac5377fdeac8ddc9c298b38cfa0b55f5f6a3cdd5d606446bde4272e5e5bf184e851eb9b52346ef678f8d761597245615a96f5fc7478f82e96a144e0ebf1c2ac10e2e6994f07b14c259a234b634555a8bd514de26db8c8e14a35865a89c830518e3cf76700f9752037758402bba5a83552fe368fef0afcb148c45ac4beabb60c40d50e6730daabb6e8702c27c8c0be7124e325174086ae73fc16b20d38dee419c6dcf5395c771733bee79bef093748a2613998ffbf05162ba739f4dc76149ee9c959d839214d48dffe5d76627c982d42c87caf0aac2305f36278f6f0e11614585446b5ecef24c300bf0dfce4ca244e3875b9b0bbd6a8f9338da6d644951fa9639a1145201e78ef7c47ef342ad49962e3c0b04a1ad408b26109f6465bd54556a23b60a340d66ecb04aa517fb2045a3a4bae231bbb9033eab9421548fb98663c39eb776128c441a33995d815d886342bbf2cb96db5f86f5bbd9bdf7591f7664bb884ed46da350aa5a62b40bc607f156f27fdc2af15ffd33b296f9308e708a69e381ee7aca5ec823886762f2838218205e3e3d405c60ebe8a200aae9c3a596698be213827a5136996b2147a4d2ec2578267cda20527f384b6e3982a09854a361e4dc206cd57ea97e07384954476b2f427e03fab78a9cfd3f720d27c9c9f80c8d6ab6a6c9d362a1b3a264bbcfd5d3bd0ce94ab5c4335c50317d0e5050b743bf3c5e005b9443bce0c7f11640e6824f355a6b2b1333401d73875e077432d5a188474222d5a27e98aa1089a407fe753f53fb9a11c2fb5bd68e910d8a1d0eb95ee20566241055dbeb0c1664bbd688d19a96d2f55a458f1a2556f919842b423e65e00386c203315e7a557b8ad979c55d60ec3f15ab41a775bb420451670145cb40eac69f4dedf84e3f416bc689ddc7b53ecea7b58fef6f1fe61d9f87bbe1e8809baaa823bb528c379a8a31cdb664cdfc19029125440d568cd736ccc0ce650e1f9c1290b7d4a8187d0d8206fb19348ad70763cb75aec03c8dcd0c74e33f6ef817b20f667356d0145898607983070c84182bb3f90aff033c18ff1b509f88da496dfffa06bb9999d3c00a2aad25b6ea8ec9d89b08151bd725065a99ab4647d14e16ca19a3d4d61cbd476ab895d485bd01025046a3cca72861d39f3db1bf26c4b691425b07dc0f48403cdaf39dd906421859ee03da27da2978ceb1251fbbb9698ff158d4920cc38bd553d8be8ea058681da60a14690ab5f7490df1c579e07c9e9b025ed9e57e20fce7d1bcea97e30fd9ad8d349f7bf918f3060110cff2aa8421637f8f898f35b9246bdbe2e5845635d669fdd142ec9ad1b78e2b432c07b6e99c510ffdf004f71c66750dc1949fa99a2f6ce0cfae3b61b7b95ea1ced46a92c9b4f226759f46a2c4c5a9ea96f4051e077fc422ef18fb45a115117588a15390376f6307e8799aa152c23a02f08b76363a804fdc7a5da83ca0692be3d1993e5039e33c7901551d112df5afea1cf748bbbae9069bf79ef5c21b0d0e186442cf76aebb52a59d5cfa3d677a1416b0026cd8095063425b156ec4d564bda151aca9626b393db11570b3a4dd9966d7189f0c767b09895e6a33ce49340c4ed8a43f2d077495360adad8b735908f463e0b3c8c82376411bf53f63f31ccd52be2c070d6b0ede24c11bb3456fe6a00b25385a5763ae21ecacd306b285229b1aa324b45279208d6c32b9c5216e842af3de3b75338f141162678e9ea4ecfc876b675080b37a3b094a2f39520a3406c558ecfcd59e996af0b35253cc6370e6589ecd4771278f236cde9c662271cb28c2a10e38c1560ee73cdc11f5afd0d9b85289b0420755746afb1c7e422a2dc1186a63e91b034c5f1886c1f88d18cf7cc389f709fa8d4c2b7c02711c63ae9391a52112baa21d653cc7406b65e7132009479ff1f20c0394733ad5eb33be3e5fa7817f60e68d1c129779842233e8cca7621a5419859b96a544010944984feb8382bcce3caeec60b3df6be811d328bcfe1fe816abff3075f05697611f655394dcfdc6bc58dfe724e9cec805e2dfe513be5ba11663a4427b523d80c1efcae28ae60748576a622c252eef19219a647b91d3855c05a60a1dcc9909c40ef2418178e10b2a3d5ecf98e4478eb6215db237e79f1c8808ce9a38d53cdc0321bae5d089521432306363556e274156da805114c16aac1eebc0509d5773384f804848c38099e32ca9d50ff528b49a21442e1b7c8f5badeb9d75b1dc8c12180c5452ce740d717423babd7f45680bf4fe0f7819f06280f7e74cd3deb0a2f3b33ba9d09001ab93b1866042a2fdc938c9e9508369f8a4113454807250a9e4401030b1122b4c6bc2ae6cae48c5e806c965c251cc13755c13a0546a76767580055432e6823f2178c64b3c01408d4f2ada312344f3913e87d95f37c376dc324de56122774297161c2da2ebee42bbfceba8c92aa1637bfa4e9b0edc1809b0eae9aa37c9376ed9754337001df7d0b27858f21782b9dc81846972665f44f7bb0c26262cb8772e50bc9bc193eec40ab788d4258ee3fb0491b074cb52ea5f89e9a3730a8ff5ba7f064f6337f3cf0103c54d1ab7cb6a6e8c3dba046354225ac63cd2a26d681a7c8c06ddbdc5c5aa8be2eb440cddb940644ad8eac219ce40f40ce6731984044c87c75454d478a518753b4a9a72514903c02b1bc6ed2eea6f9e40a003ca54730ea2ea9c9750bdc72d11894ef20698054539ca2400f9d67d7cb9648a1cf3c7a09ae8cb65089b6973a0f90de3300ee9ad2bbe74569c2b826bab3c664b6b5e698c1c50e768740a95c107bdcd528ea28c91856ff297695dd8f77299021adb8a269791a83777a699d2c2e5183100a6b2eb0fd5e4325a44650faab201aea4d68dbe834443f481bf37a27d97c5d0e2c609794558255f488ce8d973f5a0ea91c3b311cfc1c4baa902c30017b377ff6d325d66cd6252c0236925377f7ac5c10b97c49b76e0927863cfaa58ccec3661c28c9a96a5b5c09b402d4245fb8c873a82311983812af0f07c80a01953570fe8db2fd57ac086500aa2b7f13a8a21d7dc3ea72814471c1472743e61e7d7c7d9418e67301baf221af265051caea32db56eb8abd1bb66c68c3e087e037d3cec1d07b09d9fee66fa8c443c731adf86963048abd2d8f920ca17ac3802f4c2ad0507f0b00fa298cf7262ce4b68c9efa5562888a86c4b72079d7adbd82ad942f8278ce8079999772b12b79820c02dc6a665025d223a05e689c9fb287e5be78ec6c22847da2cc3af1274d9c07cfc2d3ca52c960a0af635bfe738db05989a2eaa13e508fc7e317f086bbb82e5a621b701d113ab26f1f1860e24c1d778ed32284b0391ff2afd9f36aeaa8eceade8b20aa58f1eb8aa4c8bc4d45c2bb576b209f420b16d54affe788f675281366cfb04ae1bd936cffcf2c5545cc77a481fa44a385610fa7ee931c1c9a2e53326ab68ae935ebc43c61de0babdbc1c211a1da1d3f608b9841adf41426e5c129b67f7a007ebcb9f86bf95f70712037c11fe99d2cacbd2a719b6dd096c9a14716118b78b013e37d0620f7c2f8695b7ed0c60ab33ccf4ca011831c32749ad5921361c34479d925e454c91d08e9494d0fa4d100d58efaddf3674f7a81bf74081eeda5d4bc3dc9742d7453e77729acc2b3a5f5b12670b54acd7cd78bf1023d8ebf7251404874a465eb8b0c600b174865052ceb6e715473e36c13c85c29678de0681d596085835403dff2fbc5a2b215f4e105ab289fbb5fa794bb1bed93718b01a746a668809e7577d596d5c5b2e887308c83bd60db01cb9679f8d3abea9ff04e4c15b19469c7f7bb38a48ee8c612ab7daf82b892d33438ba3fa9c41ea876563343b7da15e342987e344add2d07a20125d0c54cae96179262036c37762b4c22f7a48544c7020323c85950a9210a3f9d586031ae0375f39aafec6ef13d44c3ea67b1a42751f8a631359b64215544eddf722d34f43e81844921a59b924069f39b5b3826e97bc1aad33142ef63b4306b2f7b150306b16f103c55bce35aab662c1c18b6f66f344cead86644706deed609acd6f6c700a0099e646b73f4436df108ffa004dfb0cdd8a7431e385d4d01b71a4c5f8deaacaab11ae13f3fb1aed5d89cd47b12ad9cf2cfb6589ce13b73d90e449c4e9b5c1ed757244557ee4e752e9cf9b2b172093358259c38052246825a8a45ac076aa516f59c3fa7a6ba59f01d734b2a27c03edc3717068471994f1ba41cdc3f29761dbe4bdcbf6f16445d91dc7e06e2a1a40457b6cd38a6f366c95c2568f06bd56b1f0bc96f63c5672b97bd1bc9483b30ff2adb2c9e28d8ad258ce55743526cd9148abceacc863eac4bf5fa7754d084570f47c8e7c05c667b83afb0d3f11a577daf1bfd1da2aa1a080b71718f3e89f6a03128bffe84315b3ced16b63c597c70cb2fb1b978bfce5d58ee351100018f68d0d445aca040ec85c10daa4e5aac5ca8cc8028047f5b3339a78f9ff51eb6e61348216b334fa526f25c392c6a6dc566c73342a0187d69d4b17108b85537980aa9c85610875bc2767d6241a183b1ce3e0835c737fab001f18658b4649061f1aac7ebb2e6ee24124e5642a94430f1b30cc1afe3acbe949a93b0e5cf28c8123bf8bd5d839c0829d756079680464c00d3685627f30e7bc114017e06027b10b4900873690c2b5d315ac55307bd7a043d3feda9a358e7c925f9b424b4e65f310dcdfd27c5b71ef3c8558a2ce5e2f9365ceb8a1578d5018e83843494a0a2e7386e1f273a630caba8f319b9be9c8a99258d5ea87bc7e16dbdaf505526138bbdfd4534ecebef9a76782bebbacff88107060560fabff97c77b797c941880764393c29684259bd0b604a15a02801cfbece9378404ece1c4347d63447853bc62b30c364167c1876ddc7f5f9d067ca7930aa13bbe9d2bcf99646e46838e28e5a980cf19a41dfe6a4d51d369b335062a8e82fe0856b931c167d5ef876c3ee321c0fcd07c72e361aa67cbb25bac9318d491eabee4fd0590c6593a6892708bc6e4fc1314a4202820bc381f1802529f70df65805dd23a0ea8115986429127e94c02a367fbecb631d3191392e5177492a020c6eed33419dca7253cb789612e9564c42d6fded62021b9f0625e5240443118779c0be7438645633164a4c2b3467aa9402e5c8aa1317c83068b45134765255d8504b2c7c9e7940c2e9747d0d89ed835ee857bc9a6ab9a10788cc13a22625e94fe6778f9163da8ff85f5bb5462ac96854d57fd5d3847e8f197d2df15e9efe24ecfe11584d4d44c5d8a3b778dcbf425768fd1cb386a769fe88e2a63cc4ba5e7b003fd4a8a769f817dc8d3947a79654ea06578f4ebaa86b552e9783d99937b0b7a5dc5cd80c69d2e3941348736d562cdeb4a30403447dc01059f1a2e7b7c039c06944dfb36f5270ba73e93a550961e8df08572c4bd336f4b0007261273a384c98b3093f09eebd285b0520d0849e23c1896f4c5f2d5b2ceb7447eac36eecad28328d3e8014886954f9e50a60a95df72e29c490296829f6794b9d95949711a08f9395b275025e2bb3d603e9143644e61bf0a2911a930f29e15c9d7be9c071580a9575c4ebeaf9a2ed89f1a4dfd5cf0db56a57d92dfe735f164b08738223acd1f1d465aa46bb64cc3afcf74531d8552ddd15fd0a1286c06aa0026b8500c1dd6701b7090983a3cea995b4fc74489c7b46ec645c483d3658bca7d9b9cd4f2e1791777ef84f8999cf28269b5e940645529b0bb0897b89eb8735c5eca33e4480623e44896f56d6c219656cba0905e2efe8658b4a015e586f361f29b87b4a738b63340dfeb44d67e0015919b4a7c4fce9590cfaa50497eb18716ea31c329d558a37d61d0a32045c0214349d8701b3f6cf4ba639be60e6a85bbda4f5b65dbd8a010fe8ad7ac029a4db5f0413e3139e252f1524090d1325c187a205ccaa42ffea6585c7e0e594985f4652d4569242addd42830ff288c5fa750d48ec981bed3b08a691c4fb517bee4985b8de12638ed7df237b327ad9d497dd11759eb4b2546bcf11810c9a8b4c8b674694b5a69760227d03c727e2fa95bedf7873d9a88772b76974981e647709afec10cef7252bf543feb8d339b3d6aa9c76be997a3e438ed23534e9160441a064cad0df3b8d0d24939f5a864f3bb20f902c41d40f0b3d8d6803b3afd15fa1d3cbc0ea707c33096d208e0723b195637d6fc6364996d85b4c6eb7e702e9df7c7bcaf1250e060fd4d6802a0cedd077f58452530a4abab5264f4b580281fd1246ecd7117ae052495b1931dd700219b901e84db6f6088e542caa18f72d37901fefc79689b2807b401201af26c8313c317cc9e5d23dfe7c4b3843be76c312d2bb93ac17296b967bf319fe0d547a2b83af666b42a3e0d6244936596003c047c1455243cb61a7d172b955a41028b8ecd2deeb7b32870f091c90105d79960923cc0e6c5e9e858351e7cca7ad8a1200038f0c967be4fd4c067ddd0c69cbea00bdb01d25d308154c31a2f3945cbd1035176a72d93bb531baa20133e396df6cbf088c04dd9e07dfa8804ccd235d47cdda2dae4e2f5d974a3fd4f5c5e45bc983d9b10c9d99b8dd17e743dbd481403846d023abda15f5a404a69351d003f8272edab34503972a60a616d76ad5e233dbbc40715295556ebf686b941d6c1fd61466051148d974f7840cb3e02c53b50e97a4ff363d4a53077fa707ea968f90461df3e97fa18651645ecde6d6defbda54c52069205a005d6053154840ba434826ff34f94c8d3d764bfe4335da6b0f4859b6c2d0cd30bb4e99c02b77f08393a3ff9accb899c822fba8dffddf427a6a11cda77f80cff6d92139d2439ec964832fd4b92d8efc88187e559d889ac680e7c86436c39cff516af7845d4798e33878df173c83ab285d21aa9d96ee57993556b5231157e930a106ec4dc6a53f9cb47c94fb15f07b85f81173a02dea4ebfc48e839f4f7ffbf45859d510f57fac2505b84df7ca71a69cbb46801b62623e1d6caf7a65b2b530f565a75cf39124e6f930c5b7218675bd807d701a831f620058a13433ed3a2d5a18dafd346a5f49fc04929bab26e565796bd8f3b0035f67b319a02559d46dc74ef9a62288b1d801a6ffbf745fc77e30fd111c25d84df6e1445383db13dd8e9df5996cb9b2c194eca803df25fd195c283215c9798787eeced93fa2dd6e2c7c41781c6c4094712457fb1569ee89dc3a40b57f36044fb9f2871bb411c2927de1de69641e9f0c731ddeb6b345159897290c1c8513cd1cb630726572badf8e297b60df574ef1a84e84aeb5caa713e13c957679902e60ec167e2d36ce8bc81f8392572fe9297109f84bdc49f893eb3e9c2c009596b7cf45af4fa51141f952a21be288aa3489221ee683fdf67e22ff9288a3f8a4f0113edafdbe8fb248e2f6251fc514c41d0bad18170a2782f056b963985b25086933c86ad002ae0b61bd19ce480accf8cc222fa5a13455503ca69518839843703934a640bcc5947084d512dd627508e517878c2bdf73ed0694a7e490a84c8a3afae46b6e4bd17c7a4f4fd8cb3b539678b2db6388b18638c7328ea10873e628c49ac628cb13531c67875a4383cd2b7e42eee10fbc6e8ab0edbaf718b1bbbdb0fafd8c24bfebde35f58698aa2288aa228c6d9e18d10d2100d48ed2cfce00031dd210436bea98ba228a2f73caf949e19c270b617e71c9e4038dcf80c01279dc136e1065ea2c9c2759c61fb8e8e347e7e9c66f043dbdf062a29d168b399c5d8ea25233bcb6f9391f9c40edfceb2f5608736994c1473cea2b596dcff82c1de6efb3074c88f48d0bc0fcad20c61f9038b41799a5afc601cca69780261a098697e6031f00d4bd9e09c73ccfcc062505e5d8c74247b1e008fa25b0f73ce9e439c91b299b168862e5e10fc339add5dbc6593eb388f9e43511465f6b31d493293f8f57218ec9626f976c425e390e48e365e11566e9504d2418209e58f77066fc0d4f8cc166abcd43c955c6ee4ef099643888f91cdee9563060e318d8dbc75dd6062f3748343030d8f466ac9c034259a054a697cf8c8debecc586f576430adf1dd9ac86042f304a359a09441083819a6a27404dbf2ac846c95a4ddb18241faa873c332538525ac5295647ca18bb6e55545953b3f559a685b5e0f18625b9e151c5fafc4eeee6163111b47608fb089ad3d4fd0f789029ba6d19ce6b4ad60883b5aa53191610598609f4b1cc447bb96cff05fae223de4cb3e990c3bd01ee127497c7a90729e264e788042021f8cd9b73ce8409f51c0448be2bdf802e56059a7b446aadeedec38dcf35ba375b788f172760f8bc2508eed290a77c4094ee39a843c2b385bbd50b720395de8b7c991548d0befbdd70313cdc7dde6239bef7a9fee3a82cfee0839ebd9aa71fb3af97eef8a8ff25f47354ee7709b54492d028d56354ee31c49bd6b902e9d7324d5e6bf4f299a5a3cdd75e6eeeeee79f597de9d7ffe922fcb2f233fe3d18579ae84b6ca81c99aed46dbbdc98bed2f6bc2c2f68fe064f237c324078793c981669692dd4c0970c9952749251b6608c1c9e4e1dd43d6b002d41a3098608cee4a922472367ea29309bfbbbbfb1615b6ebedeeee9ee164f23c81c54ac243c2b5f10f75757023a5ad8ab020032d476a1cd1b2a918dbffa7d26cff199229db9fa6b4848167e7e2d67585515a23e7e07e4504cff6cf9e0bb33de701a9284568ec5e91ad1d4f3d2369b6bfd0c9e466a280824010f9b2f1eb9309cbaaca7011d2a66a4812224fdb3f16bb950cde7e5e703cd97989e2e30507ee691ce113f3c22ecc13db385e6939bfc871f305888543c455b9a8dae1831c75f8175453c38e6ecc3edbd39c60092448c140645c1821406b982e5d4c847c41ae8c686c8ef0c850e73fa99d150b9e6f8cddac5e90a9fa33c4ca05aeeb77fe742c6c3d6c38ba05f379b067b5c2d7eb62a3c7cbea0a92b2550baf576466fcaec0f8aec4b059f7dd70efbd5f001e6cf6558d783cb68832f62837032f4a6b14667ca3d0d8324604963c60b240c196ab066f46be2fee48ada8655404965a19ee96e4f8d44a310b1733346ae5c8c40b9f5a499a71643ca9d92d5954606a6193919a5a98eacc46679885dddfb9d1f1a2965123353577af533a06b6c9eebaac6d6a2a622cdc89d4afa642003dc0bca8e5c76893f5d554582eb59c4ee5bb4bfc4308554dc5cc049d8ea69b829dae9a8a198e5707c53d3d6e74dc6a4d269c1a5c3515b8aa76ff92963cb3e505aa1a464b2f3547ef56e14ed77d85e52093893ea4f588c37bc72c8e1f3e467398ef95d27b53de30b41c6432d187b41ecdbcad4d82fdab6ee4476e36a1d68eb023ec88fc229a4332c9c88f4e266c6d6833766bed0bdbdb3d6d0394315445b1ad7e6b5d2ba3f86e7b5e3218638c02e312f885f10bbffe7c200b74a2260cffebf57a2d71809342c0e6638c4dfc7a8c456c6ccbf2bebc2ccbdfc0ee322d61a8fa1bf6248aaab07fa1e28f4e9b445d6b8fe2120e330ebbdc762eb5119d73892ca6aa053b7f92ea40517c8dc68e7e9eb464efbe8d22e4bd9493803eff9073f024d21eddcfda02a50cb423bd2a62677bc5170e0d607798aae64892e779fe06769f290782ec3344d517d11355c387954edb2cc7878dff4255f7edd1f4990d730ac21d73646b2d699568d5eeee2f1580038c4fa6579af7936418865f5e993dba3f7e0639f406f9d10c7ee4dff8bca718aac1779f06b0afd7eb64826518f9426ffb332e6169110776c37e03bb61efb45fe8455514fbeafb7a1f455475ad9dafe9b38b9f94f6add1ef4e712b3b2e974cd537786eb4bd0a140d93be8defcdf2d9fd25a7c2494092c7f3f9b27e5b4d6f90938ce5339cb37c86b3cf8ea0ba6702f2cea903b78a575c0b5312878ff04fab1edcd891ba489f15eba5f5520036b405515aa3250e50e024f3b1b55663251aae2467304dc34a8e8a90376e21a2f709ca6718e38b23772d440afac48e037c847928fc08bf4972b024897da28b6d4a123348401991a4d632d9ff6c66adfd3f51f8cc43a4a09f445bec7638c541c2ec17a8efdb8c4568c11f861de0cf8fd322ecb4fd64baa1187e51986a30eefbf7efb6e02ad186b8d3687857da2f2d6a81bbadf97eb4a6e0a6d5bcb7bd4a349fe57dfffa28ef0beddbf6a86cf9ea4b616d513b089fa71b756f17676f968d315a78beb323700e1fd91bb480155c18d27887ad256bd5d9c598e4599fc5abdbd809e6e3a0a0192de84b5b5a339f1a04a5eaefa0c7f0504f6b538aa03e43437f8131df5176412e7f8702dab647c5665fc78db19c73ce262d168b415d6006a1954f1757d0674c772be7abcbe5ec6b4cbb66bb8ca1c927fa9cf3cbccb76ebe7533278bbd058ee9fda537cb66157d86542855b5ec8b5208487243aa14f41adeee215495a1f80245201291df0c7a7b76f0eb6a81eeb6a786f402774092c45d386623455717e6b044ab178871b9e548d6c476a74b39030f3aedc1895667b25ff2526ddaa6cd419f3fc5f5fddfcb548a1798b384b25294a208345abd595bbd58dbddff062fd66de233718a0dcabfac953fef9cdeac2c5ad0e7183ad35023aca07fd92c2c0f4460c92e96eccc291ef6af1f316048519cc873d3b95224732ef644a94a664887d25495edd8634873507a814279c88d021e6f4204330d18ec96a08d7c5696d9080201b8d0f981be8c4089fecb551424f4425f14f4426951d0e71d94de1c6c8b4a46e656ce3608bd4021f406af0f07a5463ed3c0770876446ea36ff002b7b0dff3b423507e0dc6ad1c4c2fd0681b85af51f536d9fe01b510e9dd619889d983489b2e20c2d5559ba5970a1f95e975275df4acdffd91e35b2e9ff9d5f2ddb30177f64bf865e2e843a44db64a4ded28bd3b7c04e26769d3f55571215803915e2a2d470a53cfddfb6f4958a4fcf78a20d04b7577f8c8b99c8fe7ec1afdaabeb7e83451b4ab7d787b9a20c01daa5fcd8387f7bf541f3ea01e509907b4113a4369525254095d5241df473ba025644424404fa028c4e8acacfbf31f9f8d530e68111a020afa6e08809696a1f7e9daf091ff871bf79601bdb8304036b47a7f9e66fb772db90450fc754ffb0fa118d0144bcb9c82fc65f4a06041b9b2da73b3562b94d51edbb5e8be1beac99154bf637b31ba1cc9b7b6d11195b6e1c98496c11f6c68fbb135da62c1a4f467204e32ff94c08d2e128bc4748e0c0b951093ed691b9d437294a53b2ef6eeacdb90dbd71fdd1945b73d9946df69f159fe3952bef2d97d114db49a7d57192bbb5f89f8a1d53c4526cb37ffbccb3c28ed5a7c76dffffed99ee6cc6687935cdd659ef3b4e80ca4e08856f3943cc5918a6816d0d2055832bcbc9d5335dc39e3edf955e7ddfd4eb4ea360cdbf6a06e3b7ffebd9e71ffdcd6f766454f935bcddbfadce4e1e9bcadcf8d9dec3395965c1c510e4af8bde1a49cc61edd8743bab0efe70fdc7092ad91fafe2880ca38139081e1483671f7287a4605dcdae59dfe230a827ffed2f198c70df08fa9ea8f81bbc70f476066e3b31bda0cc3ddb35f1c3b3b8a84535b3aea54fb1231d57bcd7b2a20d7cc34dffbe98f67332ffff24fd47578bd7d1d845e120dd1342d2859bbe470dca123c7312453d28e184754d5fb83f0bef03bd54a12cda9ea3b7cb1c804f9452648f2853ad596f02bbf48a2b6166e704f99c597cc6c7498929bc4e9fdd38afd0ec1755d6368c837b6ff05bb755da320584d1fdbdf0253b7ae2b0c9b93ed3f00dccbcaf617c04b47f2b67f0082ebbabaa00a7ddb9ff65bd795c6ee2566fb5740aeebbaf2e8117d20f863b1fd47fcd6753d2178dad8fe227cebbae288e5b63f05bb755d6940652bdb3f046e5dd71936fc65fb1fd9d675bd812bb5b6ff6cd4852fd8d9fe2082ebba463939596cff0fbf755d73f8cc1bdbdf836f5dd7a8df9964fb1b89bb755d4df02cdb7f0251b7aeebcdd7730fd6f64f45dcbaae26b80cbd676bfba321aedcd367fb3f8ea15fccb6fd3be85e44b6bf04bb755d83ec205061fb47f03bcf6c7f0e19471424f904b77f11fe69e0f367fb43807debba42ad619f19db7f03de6978d2b1fd65389bd4f6d7a0e1361261c7895bb67f86e0baae3622ddcb6afb0ffdd675b571a18c67b63f06dfbaaeb6ddab4f70fb0bdd34f8f4bafd836810fdc8dbf6d7d7b7aeab0ea01091ed1fb3ad57f7e407ccf63f67d8463f68b6bf695bd7b5060e989f39dbbf5c897c907efe6c7f58705dd719e38cedff32410ab663fb93795dd7550713a1a9ed3fd2e0915db6bf3843836f1cb3fd431bd1efc566fbe7185b996bfb631a1aba82e4953f7fb6bfdb64eb6bc6f6bfeeb24d9b627a92a961bbb8f2d8b98495d54589628be2e50e1f24bcfbf1673585708e73f1a40cbae0d95e4436dcd619a0383c2edcebd563a1ccd51c2e1d49e27e5a3c80706758705185c13a6362bb2d315cbb17de8dab1a2abdaa0972f5882a08d6e9f29be3e23722e88b0304f2c9b1113cc5a048c52546a587ab4f0436db5410db94173c50a76f3582643532068f0d8b2b9d0ec4e830c1832bb9e08c7421b9fe7eb9df6f0c1e2727d04ed4d5c10a5e9de0333be87e30b6a8f0fc62ba2b2b9d1e3cc192c44ec4f5d25c61b158cf10178ab901e9c46491a1857c3a38a7edaa05aebc527441382c4e1f1b16ecfc6243c12fc0386be6e4d1bd6c9775851e9f15bab410c3adc083b142558b1d04b1a0af0d96569edfa90117b40ae3e3a2cb132475941d5fa420f94285f5254a903c5de66e0c2e471e3d6b68ead86099f344be569e8f383f563db65128d8e3d1d13245cf6dc410cc412c41204f70e268abf3428feee5bed176c685d7ef0c103d50827666bcfc5838b27bc17eab1c3de7afcd961e9f0e5a833728df0d14f4fcb20eceed891738595ee0e0f400853ae0d617567e557e02b21ccc8b9f912a9d602d4e519a50d9f510d3e5061c0a20a162430ad58a3441462c615080b97291c38b983a5ca4baf22c6047c20a5caed8c951c9912cf08ad71c0f2e1158af023b65ca64d932c50b551ba9b185fd43c7d3947032921c4c485eed8fce9f13e0dca25a50a148e9c38b885e9a381141218c6f2a09162a5052211f7c8bc06f05307fb666bc8002e31af3811f7dc0bc0066cb8aab22641c8c070645835483ef6405a9f4e8e1b952c2ad058cce0c0c3e42a06d7b7ba0acca34f9486ed4c282d46b489fdc1b2e920b1df10d0ba90e537aa854056bf0dee499a560664a1f1f58807ce131b4040415a9292c2b27b4d8d1e7015645aa604921cad7a64899524b1136e1141cc1b6555051b6b96d151499a8110fd612c105172a177ab489b3239f308f9205f7b16427868d0f1b2c0f007325125c059d234707e5094c982c52b00f641e3e2c3070e2953df8e5b92fe49edd6d4bce61b5cacca811d58b73cb2235069fb1f1bafcb8d2064d1f3ab07ca3c808057fc9894eae0bd80a99d4b805639158baa010626141875892656cdb1e9e2b3c74c41eac8def1963785529230709d1a78e9d29467038b9e5461e1653bec953454432d8c9ab8a4c6a94825788fdc8f3a6ca9230695ae4c22f17461da0902d52eefc294346ea87332932eec0e4b48c21d18ecedbf6ac80f418c5307b60c58ac79d40ce0b161c2540bad418c096be4985528c9c94c8c1f3c54b8cad1645388891658c1321515990cc2031d2bbcb881280282fe0ac7af4acd8725242c5ca4c941c983025d89d25fd657e0294adda9d06aa29283c3551be4ca9a94a349c84819b1c55baa2e61c6951f327b73dbdc605177841c2c3042c624c207306098b0c78ce97ba2c53ea8f4c48923d1024e1e9a9abf38896a3728b921840a6ae0aa8489eed9ffd0b98218c6643292b757eceb28d10940d4570a45d68feb89119d905e96cc49074652891608921010384e91801124192ac096c45478c6c302283c80906194646f46c0812c7c415c0c1a205334b9e80607441b6e8a8b637492243562a292aa53c9016096334554603121c19f016244788b64c0585b016293de74b36864c1962db2a1f4b76d0b6553e7c604027a4ca00853d2e5401a9b3b5a20697609a24ab9b35566bfc497f194eb2e6b620b1c6fdc936af3b2a7475e123248b19193b7c590e94a75e0b0fbc30c5cd6b4f09c465e785e094d612274e270cb1b1a70e579e3b4fb89861b63fa14366a84e8d3ab8d812a01d093a72741d124cf79c85ce10d30996f935521aadd51e0ddbf6f6e8d8af6d7b7b9468184d88fc54e1e974bce989f9f59122c60b90296b6cd8352cda904893e3277e409bdb56ddec6c55764687db56dde66cd5fa5e6434b96dd5ad8d7bd0c373c64ab06dd5adcb2eb7adba4d91fdeae01e58a70e126ed26471b375c9175cf022a4deb6f7429a3d6edb7bc10c0d8b4326585034b6588152e6e92a5c72813f575a5c5b4c52a053d300151a5175b0c4c8d3c462d991c2102a7fb6fc9c99d1686b42254e40a87a5aaea480230c919ad51ac265851b50c008c920059b9733b916e60041009d1e2538b953029029293d51ca0aa20e4d4c0c4cca1051ca1151ca92520a95224a563c12565f643d2eba5db46dcf6a6a8bdbf6ac888829877adabe1d2fc0f892e06200581028615fc9da1724d61ebbdaf5034461ad394a6b52733977a4046b8e5a2d68baf4c801c4c3c29fac5a199a18bd2fde20c9d54ad1c468d21230bc5a399a186dba59b0fc3152535176b12fa0386278b89aa31ca2d454f8bd554afba8081ab7edbfb6ed7189da15d0b6c7a5c5deb6b7058f0c3db46d6f4b9acd80d2faabb4462a6d83083b621ff519a1b4462ac66d1046e9bf041c209079207a0f69918921b3451c5e6de83dbc87b4c9c3046887088a3668780c6991090cffe13fa44d191ec33bd5ec976288e2bff835c02ff42ff4ee3234ef99ff85da1df3e90bc447472e84867fcfd797e3c994ff9ef788d62febfe3ca7f31906391abfaf5a3e33cb9c69da3d41b3cc1dd1f5d9d1c42f1f0794651a84a11c4975fce4487e579fff9c8d07bdcbf9e015b7c0b68c2f2f8ae5f1c1dafe8ee54819cabdf7965cced495d3dbe5bf2c7c1f861675007b0c7ba77d659a0098c343dde733f7278ff2a80a14e577da3955efc51803e59c56d081bb2f900353fa41a41758d400103ffb59dae4540391de5feda278976e3ace918a3ad03a2dea403bedfc4e4e3b6887fb938310941675901d87af5bbc73d087f7f0eaa5327db6e36315b0d0aa3f81787fdf89cb73805290282053ce7b09fbd3532e776f2e0bc46c06e2ef6922c4cfd2a68c82949651a894edf546b175686c00004000131600002810080884429120092345d27307140009599840745a30164804712486510c04311c840000c22008024000220e31a318d50ed7e74b2d240f98433a9bae8e5b869ce533a1cb90629b003021a9620d97d049c5f27ec0a26f469174ad554442bd56dc7fe55ea1bddde60a581dcbdec3d7503759d108bee1e274c9be15f71f235d4614ab132a9c5bc6be099c5bcbc0559185be9f8078ff524537e67d56630c77a95f6afab4a22880a996dded1620ad3fdf301d5a14cc044306ca4ed531c4c3d283629d2450139172be36139cb8ea06c56c32d133bafaafeaf524d9329f017a7428ac5f4584b61b6d98aaf71e56fa8c2872120f358c0cdfb5e9fc55f7152265b025d9f59fb872f767a6cb9ca2fdff49d6bb9ab10052f4085d716eb48f0710a45ca15c4dbecefca9e858a1c8d36476e2c6254174e2280a5ac58f5ea382e4c943ed0aa83f3bedba0e508a3ee927a3a02702546053bf97296b5c6783520c1161123fb6a3a6159c9a4403ab1664f5f64539e845be9604dfc42b7f2087827a0c1d7428d826a55ed131b6a237e61591fd8cd0a3a9c8999cb241cde80a58846cf0a1d7906e6245233835a2e992ad00368c68595f665d66454ec82f8293b12f4e04e7c157f52bdc61c148a59a7f226b0e5cc1877ea382fa3d44e01789e4d2283e063e4adb1daccbd2ec126c3c5cae2b0e258d7638f98aa3392be35813f34b15efcdb6ec95c6eeab2555e688eaffd71b702228f6c04f78cb604022da6ef2601c1dba299889acc6ffabc5ed6e3e9d8301809bbe0945d9260aee9227cbe8ed126baeb84771ba1e793b7f4f55519977341d9a14d1ae50427448ba308b56dcf9cc7433a2689b50cd4e19ea45cc4e570e94dc32b99b0f80e9e6b18945b24bb99149751534bf0b1238be72c549b77c83232ca7407b1d81b41a44218a941c6cfdb623c2f62e75cd28a8dc26ba023e2fa1eae835d54d4ed1ad36393c02f5cd5cedbb82c92b37891555ddc395e61d455599978e9ee51444adbae4e403c559b1c507423ca9e82da348d4146c7d1c31e256c15046b070a56e0fa858b5f606e71c2021cedc1f3b5d06146b27a81940431d251940cd01a6e09ecc3a805fcca530e9ec9d090c273282b180c2225c1191618ed2ba1cef22660453bd4e4e8932664235872bc9317b2e6490207d06141821aa7c67867a59b0a7c7afea8d821f78c8324c5a2f7f655886abae281881b7eaddae2e01939422bfe9e92c51c42495d5fdc4f66fd3fddcebeaed14b8afa2fcd804ba902b1a054d20dc1f26facc2992bb0a266e6cb133bcd28b892dc623e06a5f7a9978b8f317e04fc7bf28c78e7c9e01bd8929e68dadc2805caafe65fd0c743245d1b924ed0a60c17332ebcbaecb9822fa154a702fab17e28a46806595727fab8ce96554b897d32481f4c3c8ae78f4a3b29ef9f1ee12d6795df8d3b86cbe22e8948b5263e529d8b2dc48315bc189ec69b23883e2c190d7dfff63221d56cd34456ed90caf9de818e260da0b40275deaf0b8e4b254f188f03fa3353dabb28f5352c2f3d98e218d0a9d1f641360b0fd5e392af677609b00bcf78018fad3af858b068cc9a215e43263e0b55520b736ba6f1f42cb62f99296d26dc271c5a855bcec010bf33cfa8bfece32345a6777966d02fd1df6f948253829f3f15f8ce0b2578449db122da9b118454332d9f47c978412651121944debddf272979752cb05eafcba66be6316fbeacda4a6c9c1ee81bcb5c85e7cef37fe4efafa10aaa432ac544e8a78ed25ebc46fc155157b3e8c6bf6ef2d8d498c09334fc0568fbd379a14b72daae7a3e27f298dc243e4bce9a3700fa323a698571c935a9f3d8a4027422abb2f13ccb42d49b0de1c0be9178b267afde156aa3d455d1da018c3226da687649b1179b6bd5ee33ebb9422efaa9877cd7a98f5d4a5adf613122ea397b66199c32e4be593722022da1dea26e511d5a15dbf9be7cedce665a78ac0cd85dfee54d171c4ccb43dd4131a0444a063759c9c347056e97782c82fa5900c256161728376b8faa25e9f10ffd8530ad29ed383159fd4c4b5a7a35811e468d7252d6598e1086b1d62da46914e7a4f292fabe2b068b42871482c9b00d73db9756e4d628fa2e9f562adb87297c6871a87a3820464a9456341c5717a925348bfdc9b90991a0489f2d705afaf1887b9df1d7031225cba5e9b441a2be0a370b805e4487630c721b03aa9073fcf0f71817e7f3ff74404881e08eb06d761f94d73fba73c122ddf1aedffee5cbd50d81678aee7e164d7ac2dbcd843b8a80d8726ed3139e36e7e6350f5e025d9c94f0b3a8320ee8d9f271bda8e6bf08c8770b31c5248169529f6ba804e7a05ea911c5d45a6bca6eeb3dfadfd56e36491dd8c0ffd8a13b008a1c31ce0376d066dee3ae166637fbc2f19af7eb85413c72d924dde4a4871d3312683a2f91172091df9bb4919f996bbe05852e7703ccda08e4b644355192a0c81125f8499527aa1cd081ee29d4a1a90641b5b2630fe6d068af09024f0ecb910674eabf8a4961d4db21424fc55c95c93ec1da34a8c7179b7d134a0c7b2c73cafe4122d861cd2738cadc9a2e2050013b8d92041b6eeffe6c7590f681bde85cabb229167a46c24e8d03f7465538cd473e1d442fc656e54373cc793b9a1049ae73be630a03ce2f3000487bf0e54eaec3aa8a29f9a7fc01fe6f0b320306fdc85e3b2dd65341b2978a07a1c86c9ce7a9cb60459b734ac82bb250644f6249eb57150a77b63d3feb93a9a7e48560fe7420f4e0bb8e40935ad9abdb18d67602794ac8d132b9170d215631ab47a4299ab6e661e23ff0c2f92bb46639e36773c5c4dd4dcf16401ac2a30bd9fdd6c27d082cdd525c5a0a6b9e95716f8468867524c0e88e08ee9bd1d499f7c5915df0b3fe01ed28b67543e0729b50022277644739909a270b74783fd49bfc79acfc4558dafaf461e3d14ad7d3b404432f27bd3716c2eef6e1abd3568195ac573d402888fd4d1b1e7ee4d6e181cebffe7041cbf01b2fae29480798b3b80239294087d0d0ce046cabdde7bc9a17a197f4b975db2b49333e6866993dfdbaec826394669d824be03758235cad558bb623609c6ce9b564546fb11bd763f36efb2433fe85b3cf48247ef5e225a9d46eab213239fd409e41e999bc41287e10715364b066798249840afc49e4668656bacb0ef9ce6a8a8f9d1c1b42fb163db8da573aadf24b15ca8bdd8866f213c5b278a03e8043bae436d4661d8abff4a8abdb98036790be0d57d819b2968507f90faa5635c991331cad7f0b9ee6bac2ae29bb307a0a9037fe1fe3fe4fdfec0cb9251007df6ab14a05f4ac767d605c404b2b82812878d57debea002ab49e5c541a1b79f1a644481aab6300035a83ac5d72bffe2b7beffc6fe883645224b27dac1a9adbc663b01d99225a49253ae7a7fc5c420e6d2be2e8ad5d764476ece5624d89b6bb29f77679150c1c20530fffae3e4ad7fbbd0c354b692d0c35959f9b93433086699debf3e84d5967f81c57897d6c05be7e3171df02b3ac54f37eb7ac593e16b1e3a4502421d278ee242dc2665f2f3a796f16e416287f4ce2380abc7720fa3b460fa1a8ed91cc0735ea80ae095ab05b2b6047e657e3209521b505aa6a388208730a2ca140a251896b5b86a55799e5c875e62de81d677ff459f82b58328140dc19e2c0d65eef53d2b8bb86fe8025301811f1fdb2c86b660a4db4486802263c9ab974e57adc92964eb54bce039efb2c2fb5f4ee1714b5301d6cd6080532328ee499b08c1f4af902238b64be1b37d4a9aebfa18fd143429fd0818a06e2a85df841c1042756a2ed9684daec8a0b1d83892c069a7dbc659e7f271135ee73ffa1ae289107764a20538c60febedb3c33b1b34589dd95bf273d92ab99e584cd3aa124df80c3a90489b3ee6e3a8f51e83c19cc88ae3d6ed2e366f488461ef6e2e8b4d2af02c0fd24af17191f732bc141558c1b0692b926c1298dca271d1601a83e5628a36c59fe4f7f4ed26647b7f7171550465a4269fb0e739d26e3cd0c18d8a5adb3a31ccc7913a9d3525409f9c842a569570d7f9b49ddb958cbdcfb6ef50b45199b6eb33df7d5bfc8f64e0e0e1dabfc809423e94a54f7e2185c8c999d401183f2e6984f236cfc25214ddc7ff2ca690ce6d46b11e84a6e30948f5cc7f20cd6275ba4ea6487fb803a4e227461c784fbaf92a146748653af06eadc67a4131d0c67a137394d55c2e3cb3e6cb4c95093da6bc2d83f85cacb2d1d86b9b17c46896819aa8cae0237b21ad1223be80f6528cd6c83ec80b325667934b35bec094bd92d4a33397c693602091d03cee8e8e357ec2d67f3e949509f4501c7ce1815e60a5127556e9f06500b53c8dfaf13892e7856248ccbd0f891e066cd41448d7792d2e3da3ff7644876f4fc85ee4a642868c425a3c7622ff4b7eefcecc0a3c2028a88ee6ba7e0cf3fd0852de44e82a52846998446e2d67e4038371f6627e3982434730293a85322d1b5f9f16511658da0ce6f6a806979a274d0e6032ce0ae63ad2da943c0d466650a6c8fab5a134180ff77e9daa552ec3d599119797b19936844bef032edf871ce45111dd145116931cd7b09bdc2e5a5b4eb54dddcf9937b0eeb8b8cc411980c316624282807e3bc09990687570320a38c6e793bef633fa8c2c2de63120fd079405af234341e1bea0940e1ed2d31e8eb57a35b1828f2b9792d9d51a1d9394917fb3eccec4e3ecec2ef4c56ca7793804f6080f612eebe2ee39370aea60e9c1b80dcd61684e8600a8ce1d1ab819468558fdd9198aeb1a26b000f9a290baa29c894e43f17713146278b5e6e597f63d4f06a2f54732bdf4bc67b854633fc0a48310036b1ea709fa6f9f04099220f6825fc1f69581ab3bb1513137fb7903b60e4b37bc859fd6e36b42c63b1db93caa796716f33a209a96e65b38f69a3bc300aa87952e8a1fd6499c24dde75ba565d53f1c60be1edb5b9ffea45d2e0619aa1c47436ab9b9022543fd0ac93108d2897da0d34094c71b53b038409855bf36393001e29e0d7534177c729e74620f22c686ddc394ab45fa51c31cce2172b10d07a9e45ea28f284dac38e809f0ffead1ffda2a748485d38c9229a636cbedfa0fbfef08d3924ee8580969b12d994e322403e9c813e6f4586d67e4a3a5e578d76aa451086182299e1a29f0d8f422ebff9cf4b2dd62107fc3ed0a9b0b5768901d92aae91eb03ff53089c29684391751bdf68fc4058ae2ce110a8963769e795ceaff82ec9ca6eac5eed0f0861c9380a0f1f474f05ed500a25c23aaad2baa93e87a297fd2c5a1d30ad01b810539c67fe800a2e85f614f21ff76034e6655eb23be4249fc277a510afbf8781e984e22f5986035e690e6744529c8f6e0bd825713ac660c09451e2c1e294289aaaf2d1c7d355f2d06f52fb2bb74842b82e4ac8458f24c256d7ce4650e233632e06af4f5024333969ae3a49e8cffab1e8f42b9a1d8de784b538044df1d90dbdc5709bf37a2c2843d5b99bf81994bad0f85dbff61b55fe5ef3a466a36d1c8a3ad8ea36eb897efb0b8aff9e63417593c598af1adff2fd3bdc6c3708335a1c0fe6bdfb53c76209d9ee94c7c838e4099af7fdbf89b29cf8cdd4c23a5154f28dfe18c26977f7306ee8acb9db3fac924f11f69fb7035d605c0534e97365733207382e493414b8b59e241bd860841fe3e4329351d3fd44dd4b0698463418464911a83cd6aa298abbdd00860456443cc892d0d30952f90b605bfa607c4932e8885832be2402e84c00d484d922615dd6da84e4cf6337dff208e9f7b1930c417b1c6dde4bd2b213f3bf2252f1b468f415c37c599cec961232584b1126b446d5881bffbacb3bda4f244f73bd51f6d5759251262363952275a124cdd92210b74f072f8b08006622098582cf653f3717fdd18a9c1f0528cd4b76c1d4a0e211882f9082983bfc8b6662b67cb17924886c9d6b84f18f59cf03c23f8787b8fa61a8c4c9e946f9a3a8388677dd6a4b2c8ab3aed1ee18228f239994e90d37a3a8e26f1005757babc26798924848be3c25aebd503f4d2198e74d282ab06620cdb234977852de0c4dcaa071879b1832e5155493a3dcb7e8108c7fd1fabc173e4c3b6dc360b8c1bf0cef1d3600ee279e73d009dfa1211e1382866053c5e3ee643f1ec4b8a66dd797ca82859cd0e21ca1012b6e006597c5d9edaf377f9330dde3e8e5b7f46d7d9fe1ee23d440a5ebe408211f8d50d21723b1f3d11253ef99cc558760cb026820b30400f896d0c11a77f9f1eb4151208063a0f4171211b2e5cb14469f3b19dbf778b13203b3c441b743faa5aa69ab729dfe636ee4759081534a17cad1cb75b89b1fc8e7e45ec0560cceaa4384a7c9c289b7e81e07cd2d949862d9c46aac447d9030de21c10f4be854aa090dd29eba0c48f8aa8a14af04de0e095f405d339e7fb5d76a5f9188e6e55527c00b94f20c32240288878468a5cb31c8dc7be384cd40b5c321a09986d60c540f64e2789eb378bcf200d86544ac2702f10c028174dbd19ee8599b8e27b90d651e2d4a2417390851d1ff7b886b3bdc737c62a382774bb792ee7636650fd93e1b21cafd3a79628a9c4ac6702f6c4a8029049e704ca19d84bf506abfe0b21f50bd6fb478421b1ecde21f062c70a37a2c3f297f6f65c64435cc041e26360d95a7cb285a0b21537dfefb334c4502c7ed3210c590a4bcdd7104e0569d56b14aba1ef57f644361067365839869cb0c72756b89d6f962ce7d40e530c3fbebc126f48aceba1b21b0ee716fc347e1732ac134f874f085a174eb7d7d8c0663385dd1d3468c0850ffedc7eb11cf6a1056210a6dddefb3430a221e31c1c067e1857036b86759321c32b1f872ec65fd848e506a1876ce1dce3404b42af626c0acbccc6a65ba8b636daf822f88662f7674e43f4c29a42c54ea4c36549e106808606547f2d75d570d7bec0a2d570d73ac062d55039b71deca03de86f868173eda0419b3f8a06a5bb511cb103853d7ade62da5d1d3d882dd9033038d26ae4a84aa132ed072f997c404a2bf7aaa116c220c334df5f6639864b0943a3b2056486592cb22ce787341824404eb29753222b146577a01c345765d21efc3cc706b730f3bbf14f1ac83e60b1e47af75391030d6ca7e60c71239aa76670a345699defc2887d8c81ed60bea6d04ba92251d61a89c5e7a599d9ea64ea71affbc089c694f1b40ae11609de81aa1b32ebb7206cffd23b88de016660e3d06e8a211eedd36586d1320b76b3d1653619bab202f0d537141ba810eaac028971a48ee7d883149b8036866c5e0675c908ff7455468f7cdfb46cab82696232701e0d3f870bd5c4475bdf2815d943666f7bc433924f1adca0faff60577eed0267d8c76a9c498630c28e19590f40d5aeaf5592f6fa49a3fd83528f0079f6442655afe6e8eeb6c7f25e824bf5b78d8b4e62b3e2ff6122ce5831d42451f940ff0f03a15663b427ed322400fe39b90204b5a68018c9e4488e3d74ae93829601a891e7dd75ef3ebd1c97a17aab034954cbfd0ac017f564348364d0c34a69e6c8a66dc80c2ba0365c08baff90fc334ce69f736a9b9cc5d417f2213cb50b5c1582233daa072c7bdb7a947e08923b4f4d62b81f0b1127838e1649f83069e1c8bd78524623b3fd91b7eaed9d4fbcea22cffa78c40cc20b18055174aa6595eed61912ed9f33201cad52ea43d9c6d9d92cfd3f90210009ce1762b99c18224afec8012d91e63c8699230b7daa1bafc117c136cf6ac9f0b1fda5b0b44dc6da3a3f64c61daa3bb79735b4a72c847b1943f831406a77306ac23e99eddbcf38f8ea540cf547c086df4f1e6ec7bbdf0e903a81f7cb452d79c756fd20003ff13cc822ad7c1cf281821f5cfbab4b9cf5639440844c39570c0cf61281415aec1d092014591164f6e849c1de05f8c9f3980c74115635700b0e2f26d31f6372ef2dfae039b215f6186cf0fef8d677bf7e8a64ee718cd69df36f640678b78ff567ae2b9f7f1f5639ff03268094c99ec7643133cce771875a6b4022e6e8d63a7f843d8a0e64a67554cf1130d9c8dafed5cf129994567d5983478e9ef8ee779e483672071eb507636636ea2c317eb50780d379540f16398c356254abf5c8860fd2f3b7855c72b684a5aedf5c417fa3ab66f821afda56e4133e5b8df9c1e266d1f19f9cb630d5818b5c694d943034b6ad2fd278e8bfb844b37483e4e41c21defcf60cc8787b343a811f0ebc79b83f8f7def41a96cbfd2b992c8b1861e444c1a405d4aa3706851fc68f4d288596e75fbbd2b07b530d3513d1317b16dfd6c871f52fede032f1480f63c4d5803a42038acc482ba822c604fa3b837cc938f28c0f760d397f0f5322a0004546c2308d09bd27cb07f05fd1843320cdfee822a1be0ea0a12cc0bc76360ebaff92027f06372b5da09a967b80eac2da55e7c43d2a47f9417e0add5fd4651eb48ea9de85f9f595c494ee4cb3f7b4479b4afa5cbd2f08e4cc46112b9e5c1865c2260f21c3a12c1de4ae21c03726e44bfbd483431698d010cda5463a3f0ec1e7af14629a4cfd5670436a8cf75931fbc38b53cdf1b2a9f241f8c0e0fe1ffd2cdd57b71239b45bbf1a519b253c5d58184ed9654c496c40cb6fcf90c7e626d40393b7eaccef77a65a0f2db2e3d192e626fe4fc9772090f8d39cbb8ed41b2ba9249765bdd04d259d60ebab1887e7ca45827a04f34b8965d249c142b2a38889cecf2bb31ec14ff19524ec2782fa050f85ef59beb499837e3c79a53648a663394069c8364b87dab4e755f0b6ee981da91ec1b10f42ded265ad5cd9a1246462a04890a1e213752ec0ad122c29ded61cbbd9797da69651cea9a3f9ce1d2662d31f88c16f7116e81b3df9bd6d73802a2a89ac7036c89d66e9905e8e270585772741698abc592967bf8deff9073774c6a0969e5e5c46a0906df3823e6a8caf643ffa5d1a6bd4062310ca4d55c85914f014f81e9334aaea0b0546158de22d7ccc12a8ca3893910ab30ace5999323d84ca15fe75195d223be901890fc1d8ae69fbaa2c80c1c40e034eafb815b51bf076bc0174cde9e3bdb71fe796b57be1adcb0fc21423cccf09a4223071d73b110990bc78eac132ec6a3050af7ad2ac09499f9b7555461d66bb2c882d879ae98188a5c717018c2f80cf8a011c30ee2d2c563fc1622899a89928bc377fca40e12970f408ec77eb76a86e45f2e329ad9410a915e4ec2054c8fa3d15daf6330d5f319bba6e3be6356ed8ca5aa0a8e8ce3d909e83e1befb826cba82fb06609eb4ca0b95277cc864abe15f5bc4a87217797002e7883ff280c945e17aa9bc7cc3b4fba9cd10186ebdc7c2e5f95cf9da15e26b30348be9a099b91c7f44b498117bef803f51ea01164b233758c0624c6c4ed913b9bfa362f6d2f828bbb950cbc7002168b21af8f4432d681fbf4367bbf982a99459c3e56b45f0dced78ccb2e5bc385060ac8dc28b0ee2f83a73d830184256af963d4a63f79fadc0ea45c02f5deb60f2cf3feb0f0b0d10f832ec6bdf29bcb8b26eeb7e2695793a172d21e3cf8fd1a35ecdff78516a5ed0d24fa4e5792c15df7758495310d132c25d95c0e0b005a97280b6d51013ea004469ddefdc80f55a41fe05d0217ea1404b8a8b206cb1efb049430a6cba0445a246bb857219bb56058146a7ad4e67141b9f861126a6363bdbcbca08e2c024490aa2966daf00208d50faaf07e5888f3bdcabe7cdb1bcf38bd172ba0abb76dcd3acf6301f22e1de960667ec082001a3522b5e187a8eaffb0569a3d0a57b4bbb45358a1f2dbc560ae0d1ee11ca3429d97a0db71be29c079126d1bc6fc259a3c7b183b1adba9bce5b498810f449baefc2a1dd828428af0747e44849b51dec214e95e702fcad4e347bed2f66cf05a66d0432fd74e478bdfe8071f635b3cce5ed3e9610eab301de821ae8227142bb5a00917e80494cb0c07e79829cc372c12afb5de71bcc30219d1fc0e7cf37158df2b413c830ef03d663cf26ec86184d89224d73ccc8259adaa4b7e8d7786fb6f4f5ea02b8071157bffedb16a20c9dfa6582486ed1ecd15909470b7343d655359b8734f114f74d7b3d12b2e4214d8b8f606a84dced369f96cd44988f375b6f88f77d9284a3a37a12fce92bf75416597f5a5e4f97d1d408cea3e7608261bcf06b88d4ae200d65a7f089cd2b98f16f7b3929bcbe0202592629970e51bc9c025431732ab9f83e1689e2134854fe5e394f4016a442696e2f588dc790680f23418f162fd38b118675beb5f833ac822ff4cbe65497e4afa9313ff3c0c4a82847d4e2a9e11096b2389f583a2e24a3ff3eaf294ebfc2ef0c344e3404c60c813ae6ba0d8f6d34948f0a016523dc66f933541a43429c42eaf2564a6f2953f085bcec8334114ae15a3cce7ce3f13d8e69fe43722758023a853c817b147ef60a670d7e3ab88217de7ba61ec8d0221d97e4e19382676b8ddc8a280c95e4ced38e08a05caf048c0524dbac39c86ad7ee3673afd57b15a1e4358f2d03913093878ab2d5b227115899cc2d5d77f4bb6625e5219c4a314c49a7a5d5ee557cb87ca84137412068e8d40cef97e7a004640adb58e5d50a609020163e43499a225bfbff6dda7a5dac7bd6ba6495afa0a588e23056127dbd3695b6ae608972b8c996a7eac641c331eaaefe8bb75d741d0913b87a89b074e3c0ed333dc97fa1b43eb56238e7dbf6e838bd645b51365c2520417636670204861e2bc4740a5ca9d86e9e33911dffc5607ea806a08cbb80c58f6fdec0bff48066adcd9ff0d50294b9241e877df5fa11110d0d7b2ef3df32faff17c080097959e7be401ac7a52929ce260b26c5d900463594200c2329a640da9c86f703fbc3d21797878a8c1b38c0ab4c1cec38633ddc01eed92972d904397afca582a0f6a37f80b2420c3eba91fedea1b4a320c6fe28e144049ef62d5cbbb36a624c5e1cb999fb184277fe2992de5ccc3687e1414aa98eaf49eefa15b3590efbe68da3bd0a16e1e8b3427cf5469c553e80148d02358788979508a08a327f89f5ca0dd84708f5426bcfb5b6f5f6c770356ed745242010f1ec11b2b114e86e8953db7b737b68ee54376c31c510866d83ef62af1a21e76c2cc301e01fc16741dcea9ad5bbb589e1073d1c7f2a53c2f1344f84a9babfce840bdd752f08f60421d558a947c88b3616e5bdd16178e7e376f2a3b034ffda56e7df8061aff107bf90d9773dc2d36c79a641e58cba4a027e892eab5b9c106262b9fe47ee1f651953ad5ffccdb395a89df92fca9aa719e3481f4c3c2ae683843a831330f182fde56a60a111e5b355e0285dd6505ec85db7f77189e098507572fbdd98d8b94b927767c7ba886cdadb63bb7bf4602d4d05f8122a8b116f605d2acbf8f62ceac374db5b59e3c12aa8a3ce6837a7aa871950ce4a7fa48d41a2550061a552f7b1d4558e24456dcc5c784c29af1875b98d45ba81a0613ae3e7aacb541f9d482e29b58507e5adb013ff9c26e8188803f88c5c63d719e4459cb1f449a08d3dc8304b9d33f0ec62a898cda29d301c54aced91839cbd238b36ab99055a86f22ffc766e69ca601939a8e019b7a42f7b2237aa4f90b09b61cdb31c938183af0a1f50521246da779640975584bcc3f2ee3009a920e08315e1f6222314dd42160a3011d40e02aff95e6b7e62e7706b89932ef9a0d2888adb612ea6ff343edf2acac3d9fc0147bf42722bb26eb753f0bc39f7d123052731b52f3fa1fc27f7faf317b581a2c97693a850033dc5c08b084897bbc4d5a09e62af2518a7ce8f978203516812940e0cccb886d9462cf8af132706224636f9bc4bd683cf70c10bf0fb2a58ceba04c178a6853ed6246ba47de0298616346f0d9dc3fdc9fb1eaf5f2881e55940d0d0acc3cd657da01cae79377c87a692011ee365243c40d6eb93af6ac3b7dd4743b0208cde29f5c22368e5f03a8b2f3524b1c597aca583d430edd81d9c60d99344a5f3e9ca2aa2133d63d65da562a155fccb7126106aa06c625d016327bf3111d3a76daae2fcd4e9d22e67429e44afbb9bf1dc537848e79dfcee41f6a339468b31bba049c4c2168d60ff25f4676f4b885b006275d3e22ac8e88639a13590b8c7c4271448a35e06f3bd9a342d9957ae85f3b5120f59ee03b0bc18d69182ac3b0a8097cc3f333816a6f2544a2f842c2c77b4f442615e1e901977f989581998dab39c42239a223e72665e3df3701b83c7daa2282faa6c3623777d075d69805f00819a542940304c8634c45ae1d41e925d105db5376d86110111e6b0af1c2816204c00a8e644b1935cbc4f4dc866b0007e03193e588ec5d2befa63564369b36b92a65a15a60fb03ef5b0dfef4081a4fc2398d206957e698a64a4d86b2ec18da7e6d9b86e214278a85636605348eb16022b2acc3536b49af63dd91c0b7d708ab886cb81ea76f9371bb178d7074704835be5c87feda7d90421b81abcdbbeae0903b832ee056207cea68c808d5a4e457386b8ae90d2e8a6f935bdeee875cd25ebd36154298e66c07ab7fdc46f91fc153f787db75fd0387ece79b534ccc18345eada8aa4db87ba80b355dac32bd90c0dd00aa7732fab03392af8ac8187e050da43baa6095fa013aa4fa6649bc6e7b9efa0ed4136bfbd8a6de97e0c3adf5045b15dd401c796e339a4ed406131b5d5055ec832cb28355e34528387d6336cfe0e9c25072a4146698d7cef9d2fad445f6b0da06bfa045bae870da69ac17b3462727e047ffb428e2b0b4b234ed2d89962ed1032abc4e5309960112366cfffa6cee9461fb5c99361677b886b6ab0a17622cda853a4bffb441211d02b78cfc01b428566d4325e32467978a1006d76179dbdc115295f12b78f6a7d774c9f167ac956487c333537246008374056ac80d5f4fc93cf6d57a2b3b786cd6744c6a7a20d5b1c6604ff667d74b1c75b308af25d69f576c6c91ff0fad881b7437502f1b7df9a12ce529a7ccadba9cbf0ada8de5c501d961c90e4e505d6189725bbafe8425e45bd102a1921b5dd990129c994edda09c73b632cccf6bf3f7b5f4e7632acc615fc943670bcc1bea2bf8c4928518a89864127ddb10458f76d5e64a8ad45923b6c478ff7d83bd59fec00c0493e5e868bbb112fce8832071efa4e446b3f9283ddaf15e65292348f664dc123c965336e02b54dd8a9413a6d21830db502dcdd35021e0d63986fb6cb551b50a9cd7545f29310cac705e546e3537c2f1bec306256a15f683211a0e1c4be52611dcf98955e9e83a1d0418b30b4d678bdbf74520d96cb430e6dcfabcbcd97ce7edfe591b6c176f90d0a642f3f285f983778cbc3a1786242d339414d553da4a62e7e8e403d99d76152c97d4f536a882c237f1eaa474d9b7c236250436bdb191a5d5fb9108b4d208da05fc91f455fb91d49abbc595419ea41e943ab20127d2eb164d810577d825af6b180e7a71b59121aa8ad90575c77048505fb8e9f29266f96863b0d868d666c7cf51110415e45410f894a103bfb6d158c2a02e3afc6d8ffb73723f51eff0d6cda5edc6b7cc1aa5ac40ac99631e732052f44cd0db45cbe41089a00248a69f87441cc9cc0f83877a5ed2f17b80bdda935bccad3b898c2d5f4a11102ec69d19d6693f4c36bca031f93468d4444caae08b21ef26aefa7e197cae4cace00c8ceb5dcbfc374451a661d0de39c18b4f35511c570b6cdcf306345d87a1974137430bb74589ae9cc781a81b5939a73dfb29adc427454b08cea15a2f85b4c493b800acc80a18427de4de42932fef99334e367bb58f3545c7b392cdf4ffe0c342742e68d9ca8dba81955c01fd92b5ca21c0aa4e1bf311791f61bea7ebac2c03642ab48689e9d19218fe779280b7102d41e7f1e287b6cfb8faf88e8e15dbe7d8a4c26ca42e4e59d5130dd512a90e8dbc72a909a8edfe54cae073a12029ffa3e1377ba59cac67a30071b51e9cf1e92948ec8c2a66e69e9c0676ca14240e8be7c577357d135f50d851cd7d0f5c9b7416a9813cba66dd03ca250d97a2288f6516f8068e519f1095aeaa59c5f2aa26041ba21458fd9dadfaa11003575418e09728c585d5eea7061ec8b8bd5be9482ed7ba37f3c5047bd8f15efe32b01664e404d27ab7741861e8b23a5ae48530369a91a8b79bb42c390218dd34d9d7cc43f267fad1f714f8e385f0f042a1c87930d00b803eec341b09cbcf0ff58343f3cc02df7300709b96050621dbc422d5b72511f3517f1518e51f530f5c55ec6a057fcac224bd5a5e88f99c40fe9b0c45e88497402fa173454d878b377421b9bc3ea23aad74c7c07d80dedff8d45b80e151f6b4f4e261af367696c34d2e613c76e9287361a54ed541bec37b457c09e0475e6feaf9fbd3e21101c833bd6bf7a90747db099cb9d12302afca3c7ffe76b90502cc2751b5a3e7c819a91c26e5cbc4812cdde45345fd8c633417a25cea1700a619ca452f2ffa0f047e106a2c9239a3088ada15e220e9bdf2f03e4fa40f3d516abadcc6a67f5e75ee85ffa332c3d55290de64f77ef3a7f4862278be0d0efde7b640ae96bd1a9e1a0d52693bf450f75465a1ab249c53cc6800bce6b01875c285357b67f36dd457c3cc99d797bd1a17126105da419c63d89d52d9a436ba0a70acf068eaf7bc56eef84b57f877963bb19db88ac3a33e097160fae1b59e532d40a555f928ccd7b349c9e1ea7316dcf52d9751c5f6b916d8f6ebef106f7e19ce5798aab13574fa17e23dfdbeb732fe47ebe672c65dd01acbf15fec8b36887242ae2f041a99ead05795b1a34c8a37718473e1352a152052ecb70be1ceade2b24189f69f7c595ac06b445e275ed35d346d89eb0ab120efee9689253c9ed6395c801b391d357441978d21494fc2d7c88efa50fb3ef18a34c77fb142e8e9b7ab2351a2032299cf1bf339fe070625bf3b0a5145b78b40915a4d565d4f198ead9f911e6024fa17290d19ca0d37ccebf363588874d03f962090e5687d111a7d989cfb994d0cd867c2d32d31284cf06383d3d3c45d38f0da5972d0a8564d753350123a571931b3403d40ade54dc39800e9cd868384b5f6c22c9eb4a95ab227c0854b8f5a57a212190c8fa6e48e8ed070c83999ec2574c7b50bb7c80b3a3ae750f5671213354706953b0b36abeb96b60320181b3384e252dbf296b912f3c93b4265d07561497153b67101105cbb1719c9ea1d0981f663e7882b9aa9e5699b274a321ee7d786897c5853528fa6702a2386a36f88fde0174819142ed60bf85df3ef8f04831fe9a8ec88c3512dd765c889541dee62829e99055db3ddb966b69c8cd4dd80e794b0d7a63feecfeebb0bef3c7c1dd47fdb5edd9897fdb8d6c30f242722e1be9f2637b99101589eb5fa86434825888eb277d3b8881ca4dfc710f06b465b443cb1d1c21b15ba2bdd8c46ad9afedc06f837cb07413ca99a05a3ec3849d5a47ea8bd8f0119ef252364ac50f326df040b31570d004be1b70650aaab981244487b44fdfb2c99d638e5ba750a8bfd35d62aca728f59717188e45ab8a7b6da8a5981e573bc10487836b20bdf32ea565ddaea0f4c0d40db941ce97174b9b8f52b46491f45613d4c9f90697465443b29b2843153c241cb6a0d302b84cbda7e02728bfb09641edb71e1627c2cfffa2dbf08e3369a9758acd4f3ab7f5eb0aa37f74d00aa5b2dd27d8338b9a7764cf789dc35ff941197c8cbb13f7d19fd6785ba639c6cc00ee58dbb138b28aac859c79aaf288d7e586c911d802745101550064d29f0352fd6a434f28ae7f5826d3a6057dfef131042292904f41bfbbe43adb59697907b70f7a924b39b92405fc2590d50df217c85cb76df8077b66bc470ef948d5a0d6d9f8aa209e5b1dc3ebe179ecd282294d3f95edb69faafdeac682caade12e546f9c7fd112f0721060c03f07a4334c2226b54846fd71ed42174f168d34fea114c4934d1cf2ab244434e1c72c6c8494b3956b1161c30cf5d3ddf97dc51748c7fc8d73a7bd3377c6f025cf6d27a64bdb23a40f103cf841dfe57204d495eebcc573e006b2dcc546603b0f93d4b48f74182b91cf859d72cdfbd369ca95d40c48d8aa1bbf122a37924261ba14a01b9887ce9dbedbd77191ff381546776d5a63e69243cd74c93a00178ab22e40f2fcc8fe6595d2e034d82b2b72a063f904cd2de1434e41a8720350646df47553520cd64fa49718e6a75e34ce696d2d825473bbbf6a4ca1af38f42c1a17689a5a5687da69e8f34a2ff59a9e7f02c1a6ac2dd44cda08cca362f9d99350e4a0d1521f2be154fbde064cd10d5c074199953c3615fd59e009654704b9987bf4f77785c345f97ccf8ba8a85d751520b1b1f6f3dbe1e8dd25a303602060ef8e93833538d6676329dafdb77a2ff2ae8907be05896cc7cc3b6b4315f7eb5f01537920f817621a56e6f2e160e87100d5a19f798f419a7a21215e811c52d7dc1c70448288e77a941cba19528ab324040b903c135596fb66cfe23f67282dfeef970941838d57ecf241b08ed239e5bea715d2ddbba4c1318471ecd80d8f298f8ad9c01095b736ccf63c736db62cd03d0f3a4228cace74a579e0bac42b3874d33b9b7d7f629527ccf35366c86337eed9261b1ebeb71bcd2609b6ca7dfc8fa289a50beacb8378d059de2e8d5d83dd5fa58600a015fd3a368e373c83f0157f9e5dc15a7367295a1f54960a15aff1c6dbe6f33b82a374c365f66dc5e80a1be42eeb0fe3609bc3e5a435d3f1db9373364581cf79ea3cb75a237551de8f9140617458ddd4ce629aec49fa2fccc1c5fbef0da1d21c1c7529838738ed3df0ac9e5fa1473e6d8b57064c5cf2eb46e4e9f797b87d26113b2eeab2a10f12e3e09ad9c65ab19a6359ed0f9d461ef03c05e92a643eeeec1a765d5ea492a1af780b46f58a72a1673ae25393695962f95b77b8b0356fc911c3a5017e89f6d0f48e565c5e4927bcc395c5ca7920667390362bd0ef9951bdc92bc174c2e06dfdd57630dec7c4e71424df0104845e554144a1b6f94c8d8ed5b0b7c2a0f7710c277829b218bcea729ba916366d7549236dcb354a2f4d142708d6b8d56a9900718eead5d8f2e415b9b0b867181b23871ff3998e4875fed9b9c1b8cb26be4b390da72b67cc1ba6c1a827f6a41339e2ebb9a2ef98258979d4e050c2de2a5b0bb1acda1a833ec50dfd847a392cd5600b1f966105c26a186e62ac01fe232bdb5b8a6b151310b4f4adc6d5976b77111f6201e51e625ce9001fe4a24dfd22ac97be93734a131b7d8c401c3ef7a616b68bed3b65f6ee887a54e71273e1306a224a19d487be910cc44f8eda12d897e76ee168ae72f205b0df20c91d8a19b85bc246ff7e7499b3bc7219165a3e02d0f5baaa118d8d779b50f726f7e7000a4ec58e4f676c2aef4280791678595269e5844428f5e204e952ad00f45c6fec6ee7d7a0fe3fe5505b70a33b6a68cfebf1e003485d16c5e9f5461b3a3c1ab924e48823ea317ca8e1f7c4fcef3e52e132be355ffee330a358900c97812e699bfbc1e1d489f4010ac39a0c9f41b84e0f95159809cf790f436534d38d809d37046a9e3332360149395da11c67fd4334353189888891926d9b0da98e4d715018bd023d416661c5c24ede02dab4098d4e7c01124e9e0b1088559187d2e159599abb4b53dcceded091c55ec0a3c68cccb46326b7a529f6f9f3e230a51595c71c19681a78ad230a87247826c33fe1b4b51042c039d048508583634e98a1281cf5e6646abee92947d1df51d47b011345a7b599ad6a377c25299f8146b674610d10a5b40e61330560e345d9e6b7092e4cbb6344c84b5d718f86ef939f68f282c6425c01118c54e78feb734001e847a2d5c18e58868d32009d09fb93bb9d2585b6022da0dee4194a6bced0bc74295b9415214b0ea9a6b42389cc5f35f687834bd772e7cd809063f64f5be16b487ff7d6cfb8a0614250d7dc9c64c1fbb23923a5d882af013024a580bfcfb2f307ea3aa3dc763ea5bc1e86382dd6ef2393f6347fd3500f458130bf1c627ec875ea1ba1cf3a065bd2b778c3b1e5968087dd021b56d6842ed3743325a662f620b69ef35e3ba4d62cbea685078e8998298e82a878865ecd472b1171d0eac192a83c579edd7df7781f6a9150f3be060ae5ddc78ce47a8f4e1f925eba57103701320491f429d43ffff50fde0d701ea73d302835fb73e103a95e3a0f005bfe4c95d9299f42dc1ee47943d4160ec924842e49316e43888dba506661c27a23b7d532bf34ef00f49fb18042fece45f0b84bcd0d48116627f3bb10d08d6833a8f01b2bcc3803a388a3b3037cdf9d585e1da581518bbabae5cce6319ff38263f736424bd2f31226ed2236b28b477ebdd434c92ad79de6c16abe9fab0d296baf358f8b6f3e5afd2e2ad1e8dcf600ba6588746331369f6693f68c9d6eda034f2f5bd54e340f25a367a565db349d57a549cebac48d2bde268520448fa19774d3378cbc82ba8206ebfc34837c7c234ef5176995ddbece9b7c533aab3da80d63585323ef0bf8701bcc25a4e7a3816d0d03f4f85840a27686fac92a2384e048f169eb8aa9453c9c91ca32740eacb7be2430d4f62190381f01d337a22be2f6e89592a20746fe68ffc80c083837ad82ea331cac5a234753883b1d1841b5b0aa4239f223ff7f9d2f3d4d1a9cfd6fe0da627b4fd42d32589f93933c9ffb809e152f2f5c46ab68dce011b81cfe6f48c3d13d973163ceabe2aa7e784a2a113dd53ef94fb177eca41f49cf0a64bb9da8b10f6c2f0ad757d535518e043127c558932774a3e94dceedc490de5ae64c3265d26b9a764870a89d558436d0578b546ee399b00c9ad4704613cef102b6ea2261a598790756b0a222c6a509c02145d2c9cc98d9bfb7727f7afa822a9b0103db4f333bf53429644da627de08e687f7a6fd7c497bc3f9c7e3fcf75a1e3b23839467f9ed63344948263460cd4bc61810938dc34423ffa0bc4ecf2876015d51dc9cc667b0df3bad497cf82a5d4738cfc90322581154bdde09b44e636d1c6c78b359f3338f7cb5d2edbd32b95d8f26bedb899d20be6bcdf4836bea19a305ef174e77cdb69cb3a447fe6bc5a21784b2e4127401283e871387d0dc4a5fe457937b662b512314898d785e6698313eea588d9c10fc66b36bec5ac4481bd340216aca5859585cfd09127ca8fbe82356ef09510dec4887699c587633bc1620c4a3d1fda69fc65db7286dc8ae492d017e31f6111f62bdec6745ee6ffadabdcd531fd0f4c60dfac0761e3afd40819a11404f0afe6ce7e9ec2e68c7528e8402d914b0dee8eba0729cc25a8a8ed9606970ccd0ec4831fb5a6a00434d2c00d79d8fe343e415cf87290b8c2259efb9a313356375dd1a0cae09c3d47ce0eeef683ee5c0fbef746f3c95ab241ed3fb21b7eb22edc295876ad7608cfe045a39ae2abd72e22577b5f26a23aecfa138be4ac1136f557215cd8d588e5e72cd26f7b7fe3225c832cb79d543055abe410fca33807b4b3030a9f1a885b308e424e073e567aed2248d05d56237a8d08903b1823e00d2581f168f4017791a7d59e3cf01ecd05986bbc643580468efc10a0a30e83989ae8790c34c12bbf061578de17a4bbd7b4511eb93a7e814fb424d484c8bde5de52ca24532108500880083a38d0bd93fbd4972f5518958ed4fa14fb25238c936fed0d27d73f7ef7c5fc9252caedbb872ce58734f7d34da5c545a53e859358304a2bc46230159e62aa6c2abfe1e4468fb22f2e092979debd1bde6484128d74b847e44fadf7ca9410c7aef9147729dc487163f7d4709bce69d78d3ff63ba7fbf026f76d7d503fe4b2cdfdd30950e4c1500fc60f3a0c147778c5b847f7801d0c85d33deaa37ec41d8ec2b54727278ebd022d0698291094748ffd8a3c987dd457f430fb403fe20747e20e7fdc75966cb91408b6934ebbaeebae9b9dca0235d34fd23dfeb5492c2212c61832c5491c8c4eba8a78c3c98d798b3164776185ec39348f4b19b2bf63a0239882ac7b6ea2b8f6a353ec774a488c65691f89e469343e72ca2cb3d8d3c6181bc8142dce50b97d4a4f1940832c719cfd70a9bf94b9cf94529cc7c1c4f8b2a8c8c176d5146d48846938c912589c49914712875116694b55774facc2864c906c1f8293abe990dd20dd63d2a7828b003c5d3237f7aaa87bf8783715cd2425fd1824288a86632c89834142780a00179f82bbe120c923bf242ed0ab95e2af7ab03d01a48680d2aa3bfab70b01b3bfdb006ed1d224f79626d2640d726f49224c7eca9f7b8b9659b612a5bd0f1dee4b2b5134eabb42f0dfde7ffbfaf37b43d12fe6989a4fb7ed2745406707e1eb54083cd9ff73d107f37c0dbb2816028230d8ded9a205494b946c236ad33eeee3f7dd78b9fdaef820b8e283797b2d622160debebea5dff69bf6d1a5fdf6d4a53d9867eec7e1fc5c202089c56229e49b272efdfeb0ba42f04cdf021208b5a738ac5f71091a76694f7fc32e0d0b01337d30530c3ad85776b1736aefa04ba9e1de72e64bdee99ef6bc5ab1c3d03e71ca2007fbfd29585f3fa77b9ebf3b8d120448d0a34e084e864056b9103481182b314e969b52d020db2904ea2ceeafa59e05392d9151b9994c50447d8112507777bfc0f7a69452768e2f130a3b1b63031b9b642f452cfe8352ca12a9f8cfed8f56805a098a51ee8ee506ff8b3161727794491fd5941662b91fc9452188fb20c1c2d20b3858335a5e682f1cb01282262ea5944b34f990b012e7873b0bfe82329ce90566dc9d4ee93e521891fd5b289752ca0ef294a28769b8867b28b829f982b552caf872cbda74ff3e706f8cb8f1dda59c92ca8c7ee1cc7236e79c73ce39e7b49e573f534a298d4579d2a4dc4fe7944f9f52cfc08c22e5f93745dcf8d30845cafd71ce396717c3acdc36e7e49834cf1cd3ac584ef9d346d6e6d4a636351c0ed87e90996a13c758a454c45423f78211e5baafd1d0b7b28617e74b26d373f7b5eed2a54170b869cc3d744168b67e36b2a669da951e8a6215af92aa14b95442b12689b498166be23fb6892d0a53b4a4bd46b929d669ec41bf935a892b9da58e14a8256e6042ccafd70080b46fe7adfc62eebe40c1acdb3d7807cad47dd164f64893c91f7ba4c98e8e8e8e8e5654303551b926c433b24ef6f00ed463cfa99278464d8af3f8009cb8a13da2e23f968a3d428db147ad2c31ca412d57daa3eef13f3aea1e9d2f1287c3fc4e6a60e407790ed97e53b0524a29a594dddd2de5f4da3c758b0db687554a29e9e790e2c6eeeea6b81f8339a7ca861be9519e734e106ccca6dc9c10546a9cb5cfc9b79de53a1b9dd8d88c71c63aa7ad486ab4d65a28248e55cbb6e3bc561b39c662b19846439745db3a14eabbed5116d55914d79f6b91ec6a28702d5073f50ca05028d4131b8e5a46d976ea9fc43568ce311d750fd954e9152aba24c9e33e5dc7a541ff2e49fe74b3cec9412eedd365d1a0bf276dd2ca14102122ce001a910af10c587d162a8cebca38b94f87268bf6e9ca882d348f93dec0bf43e33e31e66019ed135568b0e36207617c1269f0c03f16bdada19d5827d9df2d0ed9df35230b45fed822798be44fc3668db98f8d3938dda733179df44f0bfdf353bc4d5351fc69b9e6f072e3bfaed8c854c6dec66c2c081aa18dc5f00ac9c6dcc662bbcac66cccc66e8c2381edcfc9cd14850c3772337d79f22f39be955f8a9832ac72337d999231c8cdf4a568d29b9b698626d7c8cd340ba379b9996659663c6c4e747233cd62c80f46f61144ad50ec9075723341d184ab7141be11e68b32dc66f2d225a7723379c19269e466f2a2438e1f93170fa05cb9999e4093e3178b2e8ddc4c4fa020c729b3b77b58c084ed8c33d0e410498e2fdbf2d40ec6fec1a4fe50f7f5fb2b4e52a531f749ea3371c1f64ed8fd5c90aeabcf6125dc57eeabc5dd374cdb628c542976ec962f785c3c2e1e178f8bc7058790bd5f5b213ab9fde54a979cfbcb95a5dc5fae2465cffde50a11b9cbfde58a0f393eaa1760e5f74ed8c96e7eb8ddcd45cf9e33ced83975f3c39d3ff1043200262ed8dd23a1740f9bb9f841ec1e37d99f1a758f76027950c91efac8ce546318a3b7c480e505d44a321f99fb84338afbd024b2978042915f27d3b4d85696de5f8184b8f2dd486b3e4d01a159f2ec2672a6f3fd152900f20efe7278e5cc32e7d7ba6dbdd536d2ca8d42d5cfa98c90d756924baf18431db95bfba2561a98b62d284fed5faf577cc1f64e18631a7daf4cff08491ebfb7fdf260715b68f67abd5e454250ab91dccab3465cdbfb7985b8d3482bd39e4d6ff3b943c5d541774e6e5293af1cb3ebdbbb77fd3afbcc55a2720c75e4d8b4ca769c2a48e67a3e7864d7b1d33c8ebd9d1c7adc87ad3c67ff6cbf933bdccd61afd8375cc37d76b2cf3bb8d34ed3670a64833a74b8efe898e18231ca95dff21abee33c6e75af39bcd3676df92d9f726e613d46ef183be764f5fe393f774da3dbac92f32eceeeb8b6aa99aa3980dd53e7ecffba5d2e5a15697ae8a89820c061441966c600f38297192ad10823b06180c8968711b6175c210133319429c11815a830c410d3c8227dad514f3a758c53e761e02bbbf7f65effbceebbfc7f7fa53075273776e7e1e04e8e31de98c325b91d0b6bbb7d7aba4bb0672fa8c1411b355c3aa358dbee137239de441e5f7670ce39512d259538937a761cad46895aca19669832be9c728b2fe39c6106319a9db3c1f9ad4d8d6edb91d47711ff597d7719f7c1d16fd07e770f0d762c4f7ff0a36a7367f5dde6b1b6b35db5b6b3f52307fe0085748fffdca65677c6545c7768d85240b4df5206e8eebec15ae7bf6eada9ef07ea5a8ba4ea565b13c1c121e7f10fa177f88fc92e2448e51ae5ad9d1c24489c9d5b236a3f8d61c54886cd08fd458e5f638c4b35f29cb347991164597ffcc6270982486b5b197148c4c60beefcabd113688ed808e88ec32a6eb7e39203182a4e61c820c64691134838c91205164b5409252faa382b065ba0608b24bc5a95c400c5191e5062054ce860797861cb152284b0228bdbf74809893cc7dcf0f3162ef864ffae148bcedd7e3cbee87283e6712d05e484ede531b51203f05754a1e91e404dd23eeaf5f28f413c9cc7dff10b8bebf3ebd3ef0414aea51cd7494e4a89c19deef1d73e00f40ee701f4fad54c13c1b797fd43f9839abd146f5070ffb9b72688e0e07c950eb773fded6790ee996fc38c5b234f073b83196e5833e8a07f5060fcf91af48ef6f108824d7d760f9bfe41f58e5eb50f7d9d1963d4689b71698e292042441d6e79532ea12a73ef4ce9348dd591c50d513a9adcf0beb461c69531041bd9714561596d5e6ece5b6ef4e40b63764a29ddde45377cc290f73997629702703cce0ff95e072bd1f9ef71b0922a433ad853928393d486e1541ceffbedb7bff2e7bfb3f90d874640eb9f43f19791d17f2e211c44f2788f5ddb7bdf30ecdab0ab013a9ff34370dec34aaae060d73624e7693c0dac440757e9b04b48e71252f3f46b9e7e0e762900e7bd776d7808ce7bae213a9ff33a3898c03e4c83c6fd242ed4bbecbb6860d7ea5ddbd3b878083f8ec78193b850f884a1ff1b4116bb1480e35d3f04c7bbb0922a43aeff5ec90d9c0448f2c87fdc34e4fbffc74a5c98c887b16b854f18723d7ef9183c8d1f82c1d3a0819380436cbceb5d58090d4c021358d84bf84320d7378c46d7f4dfb01b1f82dfb0c7555c42e86fbfe1126a9e7ee7b0cb6416fe6efc7f351ec787c17f9f8d8f299710ce0fd9799d0d0b794f640757a19ff33a007826301c1c9c9d07004e82f33bb84af73a5f922a433a8f833f1caf040723f95ee777de070e3b5807bf2b8c45381e7f03be77619710c61f61ff1f61bff34c60dee7dab04bc8f35cbf839378efc2556ae8e7a29ff325a93294f31ef6de0606afc4c3118a8dcf79d7fbc02107fbb8e1de781a8fc1dbc0e06f7c036c3c0dec12ba71e323ac468d8f3911a6b37d110bfd625212a58e2900e61252bf4abd7c7f825aadeebdf7de55e8e5d56ab55acd94664b1e0ececc4efcde4dbd7f2954eaed27e5af56dc0a07ee6cbedfbebec5e0c6ef34fd8a579202602ea17b0b3209997cadcfb5baf96e1ee7876e7070922a2b3cd45abdf70d6b7d12d70abb1490f3383f44e73d8c83697c0e1358953f396fdf7d566f7fc77d5457fe786f697cce1371e188e63b75c290eb69e024b1cc021a163def23ccfb86d1f830a2a181abb884a04a583d0ae7c35886fe7c07fbbb38dd7b6804447d2eefec4d1c949acbe457e952ca8da374d39e52eda946a30d33eecce14c85a0fd86ab839a4fec4e354c58ae83b4bd95288fdb5b9adb8619d73555e572f36cbf7deea06ddb5e25e692b94482ba47e7ed5745db07913ffed569dba47c0fda2a0eea9eede6ed3f21c9b3bdfc88b4fce787f36cbfbdf2066a1f4735cd4e6d7635e6fa7282b97efd5e46b7fe9612e2ca2fdc0e6e5feb6b0be2e0f65b06340811d19f2ba7ed8b4b7eea55bffa5c0a48bdea5d12bb24eaed6321d5db6f980f22b2c8f7dd709790ab1fb2bffaee57ab4f927afb4c607665edab7e88bd778595dcb7b8e50943aabf38494b1eee1be612b2ef5a40afde3524c2561f612bdc30d5875785abb884d47630fcce0db358d24d87831694238034345115e02419292971d0c1d6010737543850cad2847444054a08b2f468a0430002f01b2d621c70d081009a30003eec2e59caa62ca594f2c9f5619ba1f161a3d1f9b0d364f0618c791f46229e8f4db27c19a1d87c18a364c97a29ffc36805f5614cb21f462cddc72e597e7dfd8e0f2ff801f8d0cb353cf8f03bf810e4f1e12b73f01bbcc4a191d894a59472a50c721effb8c1eb43edf8c0af1580cffb6a7c227c38bea18fc8f75f91efc647428defc8870292245f8c795f248a4546506214998352e291ca4ad217b138a8f4c52c0efa77d13e0fbe771e7f1edfcb79fc3bf8da7938f8da794220da237b5e003a7ab04bc7d7ac4387069f0d544e3985830ff29b30321995c926079f81c753e43e32070070e0ef31c8b9612366711fd7471a1f3f7689b30826da382696895fb4cc4434ee93c67da813ad3ebe3771a39adf3e3e09f2c7838f8f44fe74f03e3ce2db0cbe21222338181f0cc0179f832f36719ef839a044914939a28294f3452b495894b22cc52e71d614c338e814c794f9a2f5c5279b4935d5eab26a3cf848903cf13bf890489ef83e5f4b1e1e31d6d9e76b98075fc3787c0debe06b588eafb30dcf385fcc3731dbf855755fc74cbf1e93e7a765f9d5ccc1d7302b3b924989eeee425ba69449e1ba4cd6aacdb09db3158123ee238974601a6305d3982653ba1265b2817f5978943b927e6defbe5e418288c8294292c7232c07971b3526d1231aaf7be69c73ca22e9ede81eff1d1146e34b1e6fcb8e86edd8d13dfa153d2a51bd6bba5a6e263142283189f961678529022766871eae38838b3b9cd8b803052e68453b343aa552d08f2022b818195260c60606ab7be6ac45dc2b17653dd59e77e57a57aee78397a4e3bd2410f4d1835d80c354df6e69f864f93187feb93d049165bc92e5531d1db8f1b58f1f38ac99d5b2c1a19759ac8f29202c292e731fd607b1bc224feec37a7924070907e906a985648354837491a454bd4c01a961fdfd6ddbb6d0336bdb3ec8afcdfd5c6373258bc5fa22ac977f84c57acf2907e33cdd3cb1bef5c47a9b27d6d73cb1b0eaef53cd62a6b70a16ddf05bd7f379f9739dc75fbe6b888be33a67e6d7d47cb7be2deb6b7d4a6b5d92595f5bb45573536badb5d61b14abcecea8473deb67b579940d6e7dfdc23f8202922433d71a246d4c4092595f83dc842db35ed69aef54ad6155160bc59a125bf22121118355fa141b9139647d0598d44f000b537c1df49a9b9b9b9b5a93ead7bb699b36578ffaeabc2c6a436b28adb53e576d6a58b5dae0e0d4e0fe61b1587f63f3310542fd16ced7af6ddedab46c5a15e76f5a3838363895561a83162d20a20a2e6a1856ac68a2c51058cc9081a9eac449a56a77d3b2a961d1ba62a1501595690d65d5505cc2eaedcf1408abb741ab5a6b7d9ceea66553539f55f1eae9f6aa2f82b15f6864a35de538ae260dc9ba7d5e8d470de1a5309f8594e5f7e7b9d54e79dbb62379db5a6f6f53f7f820872e254ba94aba31cfb735d8e6b72ffc2328204932eb56f375b6f94c40926fcdf783bcc6842ddf9f9f6b88f75374feb3db7ddfeefbbd1f5be2bdf7d6fb6c4c0d793856659b3fb11199ef08f76bd9d6d79243ce23bff509391825c871158fe2a01bb991ac3572b8210a34fb7050f2e895eaedb77d9cf9701ff9ab2ab7e7e1c341f9af26777b201f46f2a75e961bc93133300eca8d08b4e27a918cd5bc7c1fe33e377ff3f2adedd4d6dbb77ee270fb9ab7f920c9fa6ea44d8dcd76f32d9b9bb73735377896dab6165c07258da51bba9153711f494612155378f0c18525c4c0361558b9a2090d3790e00b2e60a90df571168dea0dbd97af6c34371c1ae9d94c01b9f3adb5d6dac9da5898023dcb1397a0faee670a04d577dfa9ad673f5c48deb4b0b4c13ddb9e85c397eae74cfbd417ba94308201e58f1096281efe1361f2cbb892ca7dc28ca51cba51962f3484f3dbe6d5f8b672fd430f29378e2593898de328711bc852450e58be94c9e20b9315c0c052855316573851a14b1a6e051c2b30d1650c8e0924a66c3f1c3f71349978820a8e9701c443e58e5039ec31ee454ccdcd444696dc31b1a0082bc83892e286306e2a3713193284c04c1a6e298c29cc381d516fca8b2e62e88890a1bc30c113ce8a91f5e2896ae5a9f3422986cd082a4658e16e112f684328552f46408790499eea4514198a58f2a289111168bc883529e2a88b26f105f4e20144c44cf274eda2298a114e669a5e3c807c7c0b4a55a2626e2b37139318459069ba282ab4242eea892992c8615d820908ce072699970e38c1445481dacc10994b14b6b5a6eeee7ea5c45eeef92ddde9a4de6d37957bd7011b5d6a4026a5da46615b95dac3bcaece711daa6b77d776b35bdd54fd46d8d0dd638cee2ee79c94d2f8797b7b03bd248fbbcb962db7f879dea2478f9eafe4e997ae9131e79c336eae7577cf996396438a1c33a7af38e7cc21c59c735e22daa7cb9f94d2eea6ddada1b6ca7576ebee4aa5942d4b29a572dacad52dc82c492997a4944b332c492997a4944b50ccb024a55c220305d78292c6551466ea4835424299ba45a088536fa9a68e0e09cdec741f118238c83d2abf6a6424958b4f3aae52e122941f3515e43ebef3aa952c3b1428dff5a6d43aab731bf0e6bd95c5fa59a75c19f5835145184a78666a9e80f07218a930f1813886284d8e4bb8512c16e3c06c053d38187f32b38a32e601d9244b598e2f8f2415568c4c666439dac8a61c5f3ac931f28b1ce553a3f1d1c40bce787186480c0ba207883e8082a62d4e1cb10516c6a45806a80320404a42aa41082b786608c2093324b862690c2cf4236f92465942914b72966d6cbe77c83636367fc77022db7c4d0a888d1763b15cf3ac14909ac94222b3fea680b0769c608918ecde5fa580dc5b23af5610435ebd2a056455555f3b9502a2ba29314690538f4a0149a13ea258513851b9dc7dec9f1e366c39528ac13a96971cd6c89c96cc717fbb64eec9062615b0f0379690e5ba854145de5e4b01d91a8a186259a3df60789129ad1b510c0c199a6c13afd38c31fefcf833fe8d7902d1f24c89c024a4399e51ebec6003428cb1458c1061a43982e6072bba48628b0e4f2d3cb1840bab1e1cee84c54c26fb4f5a99ac004412134f889278c2836bb1610c1345b327623e9822683aa3868cfb4513def3c41753f2cca2847d7971a656e9265ae7faf46f51f768a64c5f470db752ede9d3d701c3ad5f44d2f7ba875144924f299aa34c29a5342ab956df59f5a8a8d43df4555adc8b591f956ecb41bae3044bf8534ffe44a5e6a14fb19745895cb1bcd1e46e4ddcaf133d23c61cae0e2c1715a3c7182b875df563ae381645295d52d618638c31c618638c2fabc718a3bb7b8d317efd2e9aebe27e622dd238a3b7525432010739dcf0d5c4158afffd4528b148f2107d6d1b22b88c3ee84713077d621cfdbf21eee730ca5c69c3b2279018935b49a9956690fca9d1b9b7bc900595cb7451f48f1e65deeed35b8e54c8ce23fb77d1dcb0d656c6c29ee0b1dcdfbd6502ab3fc4d5fa1b4e22bf26a9cf71cf64eb9eebafb3679e2b377c6525dccbeffe1544fe44d8b7f6f55ded1aa2b2c3aec643dad7af0db312f5aa40f2677bf94338ee25275f09ea6129cfc1eee5f792a77b30ee17913fafe6e99e85c37a7158ad4c75d2d58f42ccaed40f6dcfbdea63ae9fab5f491594922a2a3c34bfbe92edb9979fabb12b8587b8dfb0abff66180a0fd59faf646257f74092a7fb86d55761b92efbdb37cc65b71fc2fd565fc97cee875425f26bf8ca5d874b88b1285a145d68a91cb8aadc4c5d247581d44551b76961668609c549d3220c1459801a9ca81652b8e04ef3554b30437c01bd7800d950648391f3740eebd5e2850240310aa18bd88b07900f67e2a2c9ce300bd222b589220aceccbd2141b744133f98e076b9999a90c24213b210b898e1e4665a0a83898b224a2995ef78767b9d53a33495dbb420242f1272fe56efbe07d6d96d924124eb8bb09aef6b9ef939738304648d4a8baa936ada5bb7399a877e4b00f4fa1c60a3328baa391a602bed1e4a27b5aab717d5748976a133ad8cf685ffe47cbf664643133f7041f750fdcdb7d6a18694fbb532dac736e8bf6a9be4f44ddeec2ee57e2dc9bfabd793b54674d32099c9fdf40bffe9b2c8dd75a163ca50a7ebb69f82f11fab2479505fcc5649fe5029ce43c5a6a88c0985a3ed54b8bbc766d4c7e9203d92b2a7d668018d81159bf311b1f0309ccfc9399fd61ea0beb340ee3edab712d3ee417dc35019c8ddc7c7f9627b807a5487fadca8aefbee49fe58db3dd9eec976360c681efbadef8a6cdf1a59236be4df646e885330f121d7e7d13db661ed41b6426abe9de6b1cffa2c9585ddac9be5b622e4fa91ca507fb16c85c3abc261cd3b2380b6fb9ed926e1be59f1dc706f50821bdf1d49fe502aced3257e4073e81d5996b0286511745db25399171995514a3d4f3bd36183ab8a1eac78200726ba50c14b0725b6b0e20b134d4e8841868ad1c5479f98620917829891c8e9d38c1245e0061bbe20a2881f7430ba00194178e940161e7c80f274457d22738376712fae0a80903331926ac4d8e2cafeb404a7a4ddc04969c92cc450a18a01c3942a2c5144457b222245b988e1843221c613b901ae8a90c6071c227712e270682a48b3430e7b960408aa0d977b52af6892ed935b7333a521f252c60baac752948bd62ae4b0d144a208a5c39814635344c34404b22c8ad0c2820e52b840258b165c999d49f20116c6a3ec1129c63096894f536c7203618ee02226538a4e61c49cc8e1cb89c3610b039aa082055ca6884208a3d88216379841c511175b8ce8448046bbe169082964451c2105091e6ea002083090b8dc40061874054c4c2891a632010227de27d0c20c5416296437452ac40d7ba9676514f909ca78a10c18b27f7542e56672419a23a4dc9f54c3ef3238a44fe96b956a5a8d54a47c52a3c42671de9e4040794e1c6a9a9cb9b539254827add5f3a4e3ea4cb425d1390ed8963f6ee54914295424981ae68ef1be783361a7e1b85706aa1ba594524aa9369f0a0a0985c325b32560ac46a7c66974528dce8f60d688e449378dce89238c09b7c45db3217647799227aa67404d5e91084cf366bc2fee983060bc25a50a74a3ece608f4f42a139572777c5a6214a944a42533af23952560b2b41b10d0eb0582ff4a4d2c0e9798e9be20de9575974cad282929292d255122597e8c4e9da39cde5b52c5df99b88652af7a550abb866c15ee6de8e5d85cc07aa31ae540872be35eaac45cff20f2a7b3400ad3a5883288d83206163f486e00c30da35134721fe772ecde360ad40146a389644346b4752077266229b5c08b15309900b999d074c9f1a312535c9a92cc557deaa510910afbf7c3052228fb1d914136118486462812012982d00649378c46d4e80995f056aff588ed8b455f247230d614cb42fd94a3947224a913397eb4d23d3a17b9cbef8e1f8d96bc5801a68b113258c39c5458d8de09a92ccb9f645c32d7a9cc03ed080d0e39ac76039a984b7333a1b1c14b0d6dea992ec2c4ce1ce14298d9193145561c9d9922862bd09c61ba22e90c132c5c114b01b5846c89871cb612154b34dcb0d402134eb8208514b895b56f7bdd318c7e828eee1248d720a3774b29bd728063c519664a29a594b24894944ac9c21299195d4a94e7fe58ddea9f6d7b11119fda7a21020fcc004408b040220cc194278638aaa1052c3868e1090ace00a20b3136d0c4951d9ce4a0458b0b460073bf7ea596ecb315b2ff0f77f7e8c50ed31916bc3a59378acb534a2aa594b27bff20a746504e700d532387d52add3fbcc9347e3735a4e41e3561f4b340cd73e2896bf7c40ec3343051768bc4289efdfb696b27575208fceaa8886c41966264c9c50cb7be9350c441a92273519ffa224e4e4072ffbc0cea1ef34749e986933ba34ba99a62df53431c66bffba28c84ee2932ca1388fd64d982170bb4b8c88f2041db0fd68783fddb536ddb288e76a3db06e460fbd02007a5b669da576d52ba6d35d28ab5df34cd37ac69af69400ef68fbf7657feb5a6d1ed67d74d73dc92a797b85717ec266595a0a50d6a5aa5786a409b5993f1b92fc2ec8733c8f43940c00366ec1eca692bcdbb1b3448db0321597e7c7dcd43bf9ffbe8dc2001593a963f12164b68250dc9c91567de8e7b8ddf0912f4038acbe5663a7304d3b5b999ce0031353a7d263444648433b29ccacd74c603397c398160039f1c63c78e03c85187ecfe1112dc473efd58eff5bc078db8fc99648f0f829e279fc62ca38c3246ea30b90009a3f8e55f12b73aa84194bb9a7de9ee6e29a594ddaedc34bc9c8c93db06f5614dea43964dcdb33e4cdd0f55ab0f5759f5e1b5c18f627d1fee1effd587a37b00d03dfea82f47f7711fcf9741f7f86f9f06ddd33d9f00768040fee517d59d496c290a12d460c54bec03b01838808505506c61461064d823a6f8c18a253198a88075961aaa90a14b129414b4a0d16b227b162f6160c0a1a18f3c6171762be4e92c60ca527eac5cce64ffe95f4c0da5a1e8779cc532566f7e90e49195a41817749f9b6f3b0f2b20febd83b443237e293febf81ded63fc904796467a96a3747f726760bc6ddbb66d6bd9bbdd223a3f85060d1dbc44e775deeae844c0f39aeebd37f7400ad344cb182b8cd902968220ac08430b2e538821034bdd269f7b737efb7a732a12368e83c59db50d8bb5dddf6cbe5320449b8bab8335373aadd68daaf5418e48f79b75713eac99157144aadf5db36d3f5340b66865db3614620602d43dfeaf577deb6fbea686a5aab997c562b1582c16ebb654ad0ff2db7ab96d97f5f170d0b7564b67de0cdddc74531011743e148e605142b2622509294b061da94c10a411869e3820dcb6dd3c4b4a330e8ec0aab9deb5b94897f543ac6f049601888c10ab9e0d520d928c49a227332c2947eed322ca79c9fac2cfac9a5b736b588ff31787ac6f7d4c81c0fa9b9c677d9de70deb3b75c3ca799c9b9c9c560e1212eb5a61255dec481e4342b282d405098bfff418425c21c3095478228a3130af4286226008428b23601e46caf271be865583657d13a200a874ad3765b174886a060000001315002020100c07040261402c188d144afc14800d759c3c745e341709a320c6619441c6204308008010200044666868c6012a9973402ef8003624399e6e793a3a96eb8f018f6db63e43ba85ad79abb41aee0d27a280265c31b8695aa0ff4ef4572ec0b07f6c2698a16d812663327f6ff805202b0425804d189912f08b2759cc9c17b19b1ff19c96e413b94d8961bddadf550c0bc50099d4120859454964c3296f470f43733b372f69a11d1b4729f3189c925ba87a88e50e0793d9afa07a5943c89622b309ed2f6fcaa26bd8bbb5972b9661e49f07b6a1143422c1a65ab6dbf5c3800b3636512e67bbfa6f3775ad8f313765e442abbdb61837f024f27759c4af6ce318e63be0ee7342e2420fa06649e332246ec4ad961bdb953353d2c067341d7ba9972af0bae62c0b5a3a7b0588c42c0c8acfd2a3249c3a1dfbe09b40ea6703bc75c8b6fe0182a32fc62c7bffbcc721e43f2a00d985ae804befafacd6d3e0ecc33cae3999f0d36cd757636cb43ada3d392bf1dac50f4a61999802e13a78e08b858911719c809edfcc4b12eddc08c3252e9f24c707397c2f048861ca6a13e5e498658d5bf2172482c45c308da16b103dcaaa4631ed95a2c5eb3cb68bdeb4b7abf7e0b1c8c0ae95d216560afd9926dbeab2eabcee22ad27faf54e25d692cc6bfb252df44ba171d5abb9207b01269ab72a045d26339a8275a8722a7ef346fcc72d408341c0d60864acf886007ec0472add5c98f0df8737328cb6ea42051867d69651339b6c3a54cd02402a6ce31af55c108cc339bc2c9ffe7d1740749467d4912839a8ac3b3089828a9b8e627fc91538e92c8ede801cb8f472c75a7f93f7d3a88160c31f7e015c567b44615e37b29b01a966aa4363d7abd8e4bb52f46c0b9975070f98e75d80f67542e59723d5db3083748ae01b4974d2d9dd36204dae6bb861b6562a3c4d72f90ae2d20be459fe81e605c01f10a5c5f2f63e2a2fd0189a5ac59e54e3c87965e609a8d25693523a8274e6c749c02513de88ace66d6db6712ae4dc8ceaaa5d6e4022dd0f19bb005616db2f235f378f5c564e7b5eed114025f501b9a8edb37a6fd67b9dd539652a68ff8f775dffe9db4d4f3e3e90abe247ca56128b02424333105d797a9625c1312ae943d1563326a566b6a9809d6435258115ed7afd7e0560e178266c94edcb9eb250e8c580bff8fb133e2573e0b41452896aa016d67cdb989908578f18415f14eca787ae2e19070db89a415cbc87b16c98f48aad38cd743890889f8f8f819bf4a05fbaf850c9cdf736602a312e72bffc935c7e339e6b01beabe13d08b85f5cf0a45bfa1f27ed5110e4c4a6ea608e8fbe44f647a88b1efafc5f7f34c879ea8804a0feecbf05578c612ea7ae612ebfb97f21586b482d304a2045abf65d6260b03cd0e6abe810107232db811b1b9dbf218d57be48724af21746074881365efee65d972ad6e0fd1e11e21fb2151b3e5d8de87da899b2962a3021fd52e10d52b11c0aafba7d299c867262da47132b07ef611c7bdd056492e3b68c9c71181a215496fbaa38520a7aa80ca244084d490c26f4f20fcbed0348c6b474d7d88f511b2de24c28e3294223802342ecafff7673957a60f2dd552054fa80097cbb3c9b137411d6cb71d4d46a1b0111edbaab9760c1b5ab3704ee6995109878dd5abf188a0e04d977cc3c120466ac1347d4a9a11c685e584c9f3a5c17b493d3967415869d6f79d02267075194dc9b5cc582a4823bd06128f1d451032859bd5a9119e063082b09c7b2c4d8f82840e6a34b0c08de7446efbba9e4e3b504dd072aa4195120aa5f03854ad68530dc03492aef0293344b016b4c3cc4403cc1cfb034e2b87382d4beaa9c0fac21e9f151ff036573a7d93d050293277436e795a925cacb76a90998cb852451f40e9397904620ff43c5032db1b5cccb86e9ac09342df68397631368b9aa09e07bb464fb9cc4ecaaa4077018d35591b6142061232d21a899aaaacc915c2244538152a0078cf539d5f345c6962aac5205066d900b81403b113dffbc08860f529841ddd779fde756002cac5853c22799c66f6a221efc61bb7351f4a2939320a8932c1de87b24f470681231613bc656526685ffe9c065be26db5193181deeb3944d77321d5efe17a5a3a6cb902eb79c044fcba0255e1de14bb3004e440975902353d66ee96923390785e75b05c80d4d7960dbc96012aa3005f048b0431d8b856610b9e044c089a485345a66372a4391e050aa5cb12eb8631618cdcd66a1c69d0d4a9ba1b1ed47868a102e81ba6790056ad8edb9aab5d4629de44f4e60b3d94d203577982dc18fa311d9c914d6b6fd5ae69e7d1e14ab7ef4d1e4dd9eb4f5b67a4c5c61771d77002f32e3ac450da2cd6f6eb428bbf84b668d99bdcce4183843b8e611bae67c15ffc32ab25016a03eadcbf4385b1ad071a55f17678528ca64aa9a2aa4422d9be672e7e5b0151b648dfa74a0f83f07fb69fe63d31c8e77d3f8736735858949f3fd34ce36817b476ccc7cf57456ec8735975a78413d489414a6464ddaffb2dbbb0c1133621de936fad22637c42e1f64e381a2e9c1c8443c29f1c2b213b95a722b72b38cf46c087d59701fdad23c3e6b2087c625f62cffe62f3f7354a50d347d919cf506c5329e2e19559840baacb654d8fa831765dae33879819f6cb4aaa8df5742e3c6925034d2fdb5047282a9676accde57146fe4d0c4ca6e780129e05577638ff32934a35237b2f75e1081c1d6e10af63ae31fb3d63841b7c632002337e282bf9d73e62aca7d253692447eca13b8a0c0c634475ce6fa0be150fe5e414113bb6fd9d930f99241db724dae9380bc14535af67b250a003058c507b9ae6548691e98d79cb86a3014e1ad9069b335739458511e6337a7e671c514754ef5ece8bbc22d2b82047aa1578ec08657a0ad1ecfd64870e2cb77d09deaaa45e729a91497b9b71f41c834315c9e88acd6123f3447331825c2c3929d0d497caa74f72605be6d68f933ac6037e520591bc945cd1733bc23cb229be0ab997156c32c4d165b1b72513207d9bb1969050d5050291b52ee83a54bacb32595746dec0c389ba14f32ff2531f8a93bb892a1e9f9837c689b753040212420d1bd379969a0d9a2b2d0efc84d1ae80d9648d88b726014ebff35eb8cf6c4636ac13f39cb1dc0c5619fb3441da032a00d969939005d00f0fa0fca779999f4c32ea5a612dcc40586b0ffd383e7a685becad59198ab60f6817e0c9fb5f7d08265cd2071bac7bba70ec3cf13c1b0c47e7a72514f017154835824aaaec0c21ba19ca1f215f4083624835af7ea0e1266bbadfbd807d9a307f1d288a3566c3370db0144e2aaefec090c81ebbe0ee973f29134db58f18846e5b8da919ea629e9fb1ad8a417cec460c28321bbee00b08120a8f4b67de7f5ee4f0b482e06ed45727a3342330351f9fd58758d2a47ff8f323f2f1e68c1a218768e109d15dc9ac354735a4cb73b205453c097059d945c00742ad1e4fa556614bb852a486c5919b404137302033af8a593bace23aecb8d71531583cd8b06aefa0270b441d32506de30b587bf0ce1ba315bed903941fe0b13fa36d7a24d07022f902e3122eb25f2d82a667989d495133bc546997b983c27bc2ae51334b1eeb53e86b3ff974ff2c7c1cde502066a1acf39792084e3eb0fd73a9b6b8e17a3b0833331fb5a17255cd435a1dde6abcb8a40207c2e72134b27b38c660a58d565573a4fc46d30defd3cb3d5a6262d0311f672c266403487f867d116db863ed72c24ec2308d19e5c02abd7468a599611c240c4a68ca5e5baedf2da3e4c047ffe323afcf472519a886cf453f1ef83e873c89ba3dbb1547b98e43fbc3a33d6bcfa811c06f22c29d75020bdaa53f05d9ec2baaae97795cfdda6d9f88b6a9da0d6cff2e360251cd943a60309c18ab57e0a34c71e705005621f69c91169df5fe4ab79f3644fff85720e9f086c9df9b06490fd50bedc5ef8834c69dbd087b1c26d831fce4ac28bcd463e57035a8ac0dca0c8a6c558f940d1384982f51aaf206a2358c1e1c6bab3620b0ae5b8310f118fd58d60b83561be7d858fd784e7b070b4106e543a7885d75da4871466f84bdfcdeaace0c939fc2ee45a8a903bc3b04892293b61fba6f3ad2960b16c8e819c5aab957903046cf335da09d5c998e79b4a9967fe0e00940452f587fd127041afa38eb92e86cecc1127e1bd9d81c8075a5c1edc349b7d1e7d0d0abefc6876ec93902ee822cae30e85998404d1d4e1c53d5f47f7ea08055be279d1e2d02275597b97a96cf8440d243ae8fd6028533b18ec70b9be2d5cd631e266d0824982b900b26e2a62ed8f8583033dd1ad2b35fe86730fd33c1c05acc3299d401b13c01be7ef042608ddca4fdd8828777488af673e21262cdbb12a7d2a0d14de108ca1fa738919bbec42622cb7033e73cb95bfbaf5dec2abd35088761675f04b7844d50aad7339bb1dd8de126b3123ab7365dc4467d80563a1c3092452091da5ee55a45338d5e095198b01b8b7ace6f9857fe9f3d2a437d680497b15e2c31af087f061b4a5d08846c452ed6f5cefb1d31ecb9f3e74b81f6a701c37e1245074ec6108009bdab63417ad1e857d979a6bd164b52d9942d16b104eb6d34566380bc34245b661742f22a07a09de6373b2a19988b1e870f57f37e15750c0bc34ec14114782236e4c5eeb4fac0f4a0553af72e00a839bd14e2d0b7f294071ef5f493261014484791571a443ce14a815e91f006e0cacee1b6e1968b03510479baf120b73c5a75312023d672628af14cb09bcf1bc70d04ea09e3b7ab22482c7f479915c434d616898ca04e62fdefa3051bee426155d4626ae680aed24c401f0930c88028075239aa2e9b058b9955a2ed6f8cfcb0dbeaeeb01ffb164db3dc4532887e6a74d2984535718594f305c916c65d9acc33b95953d1ded52c4fc485b96711e575559ef43d124de4b03b7ce9ffb637ebb5fbcfbeee715a2f14e8e887728ec4db95225b0d29dc59881eccb78b8eb82861114eedd478d8d9d5f2a989420aa48ea2ca46f73b6476928fdcec2a63c350dfd3e31750754f0ddaae5b164b1ff29b5e1d15f09cd58197959724d85c176967d98fa8a14ba37de052f7f095b8342c7eef18cc85bd5c42a6258f226811ce6177b5a7d6705a8f2fe18088e441f4cae4f810b8960d1abd0dacc9e36d75e2e2c3c26564f79137f38911cd388c9e4010e5064c683fa374bbc79d2b24b213155a32b33ba047fb4f395d89c5d79073db28cb9b5a424c15552facc98d493cc070093a3993e784db5633e19354deeac3ed5f68e3eca23caa221915cddceb0880e12f4a08521e95422e9f3e2fd760e4868618bedfcd94e6853c595ed0d8875299282a7427c714f1c6668654b16548380fa6aa7c52335dd7cf3b9ab58d70afddf1ad0f48ea8c801bfe268e6b2c4131704b90543f283adb59134f40ee3e07d87929045473422b51389b8c63a81e2a074d967ce4315b35bd8c495c85180837e9c6ad0148cc51c95683b1f44af1912998dfb4f7fde5c7e2cda9c86e2462bc029933404ca83fb885be5e3b1c37ed46197d945120835b2e78b6ac3256e4a43fd67d901c3e6173e1f142479c0cca74ace2abdff4ca791b96e73c14fd25c63b3bcad7672b43405fc308d1e94caacd3712d9272015c478f5fa576043131ee9a6f9c5b0a65e7c8e1cf625ee32da2ab623a5d49591900958e952762beab54dd0c19464b48b4a90581c8a158c7dd65460389fac268a47617ee6a1f974daab7d73ff51d5aee8ac8767206923bed934f410724d643dc80e3635cf7aaa3832c4be66b9f3c5a5d77411d0b98466e2dd71ec099552a0e7ddb85dfbd99e40273e272fac63d793803439d0284067cecfaa324c991a45063a1c96521abced68934ac360155a7b8740848a6ec2b7158d3d7fc031e133d226c38844dfff42f615718ddf329d38e51b23659ec5a97d19177cbcafd1a681a96633064aa5c350a581c41ecbf55317e4c825552c6142157b2e2c2912569cf5735975d656b4c149ab39d1e580e2b8a3eb478d46fc6be527084726fba2c5edf2575b57ad00aba7eeacde5fda77a81184e907c6796755b6c9243efe90cf9e5db71c7505d97aec829840867d6625db1b314c260e7a19da807c81efc640c3b417512935c47a962915aebfa31342331b064eb706c5d58c3a1a1a98e2bdaea456d19c869e013fc68a209572bac42465c138b327a94cd221baa886a0455d90df121875ddb444b4caffc5e651bca6be2f983d7beda53fc46d719bf4883393b73751150174782e9d4cbaf00eacfe61052e5b38c7426ca4c5c513b59e5e2a6d0e66d1e9bebef42df92696b3ef8fc79e8771987a2c1d496708b3c5bdd01bd83d9886f274e10e8434d0ee796868d676d5cdea715c64594043fcd4b50a49a1c8c3e860bcb887d325857200b53ffc2d5a80bbe9205a6b83890e62a0ac540e4a5a8b35f7c74b8cdbaec851407861d3711cad4427f5328ac356aa5f8b806ffad440b92df5e3c505985c256dc2034039bc840cba83b78f5076afc7478593195a471920c0d238e6d5c3d3412ba1846e7cea1b0eb3506ceba468944ca866966550691e2fb4869bda3d7df7ea4546a6a0f028da13ebddd1615392c685d21088d6a752dab31f2b99e63d8123dfa01bd57978246d229a971f703289543bd4551a8cc326a6fd9d46f409641e76e658c1b063aeb0522038d9a3fb64ce89cc9cef1dfc3a81fd8b04e200ebf4924dc0357a6fa6cf66ff0d1860a7bd7987c1edc775d8aba9c9af02830a7a03f3908d7faa85c4eca3ec434f4dc661b02f04941b1133885aea2d70828fc64e7069a96cc4ba5d85ade11aa5aab94044171c9ad06904cc5f0a5ca1fb7347164d6e93cda91c0bfd0216b5627bc4a6854ce402476e59d25a64062e17f296dc7bf6833a0572d2c10b77adaf54d467f56c943f9f3b8b7b59d5aa6f4aecaffd1d005e2401b66d34fa6127b5d99dd9510cb08fdb9287db0cdfd460736f884276030a20028961168319cd2073bf89216409981ec38f205050b0e9d03414bb801e5d9b927f95d8f9628b7696410a731742d49f65b762e650b103fb279e298631e80b2dce1d6ce1240915104e6932f9ea5f3224ae503807984b8e87ae05ef90062227a83a687b69b14bacc9a9445d7744c2c41b803e0b9d259f78eba1017b217bdf422810b949a0b977988893445d6039a5b3d7a2f38cf5fbdc792f10db545356d54c84a6d4db816a2c8fee631e1769745e385202c25230285227ed69dcdedf0ad8e12a59880cf933d80c0c5f710bf8297424fe582198b946145dcabc81daab943de811103e168309cd1d1dd459e910b74d1530623f5e5fb441e34ea21ac519b5c97353f93ebe6ce685983bc7a0bc345b5d02e7d84ec72e82d883e1f75086928f8b54a521b502288fd7e8ddb3fc4969a5c6a8f300524a52d34973ac06668e08f7ad1c4f1d196f63d3a24e4b83b1cd8c4d01783fe7b3022b43c9a68a5e4c850868511437e2823c7f78642a991b70b8abd97d709547a63efef8d153538c4dc24d0318c9dde9f332d42698df8540bfbd12e151b2f4424df74723dd62ce2e04590e72842d264517a03645efae523114f294e05b81a50fac76ba093e8e8b961db7bec03ded2937d3a4747ee36e4bb8e50efc6b4d7794c33503a969e05eb0845aa17f541f747cf3a9887fc5cb43f38213ba85bfbd2b189bc45736de0ec9fef66fc3b0bd8b21da02f919807c223c8955ea80e90796d2515020789661cc3f760e46da50b014fb6ef1532939c85d1de75e722587ffebb6d869ce57b52dffd16ce338677179f41ec80053744dcc91872bf39481b0d7b7ad9d9f61c61ac645423a51b9106ec2b48a7edf1cda8c5b81df8d4e5ff16914a3f8c45f2b0bab9960469a8b3bb5e0f566adf7e6c14c629d03c12540abdee7a9a2d1fe4dae95af84e34ae56ed57d7e08dc1cc1713e677a5b5ff38d6d3c9e49908768b85169ed72e9911447bfd7691e3fac129337c067dced96aba03660dba16a35caaee87958d41599052d6031520746bbb7022491465037282ac51d361ddeed55f6450e49af19e557bfaaecede3ded1505a68564e365c5279ee705eac930a6ceb275d9bb99f416b052bc809733913b6ba6e750cbbd4d71715f7e910d78e2ac7a3d0bfe78d0b7e184a0ec3a9dd43adc77fb6546cc6a4f7bc958c298add5de1c374253023ec5387cacc60a2ab2316d0e12e305d1f68710662d59ca03ec82a5df08308b1e73f49795b60ea433da425749218a55ad8a5e8836000dfb533e5e4bdad5cc86d5f01687fcc656a8ade3cd2e92e2f3112877716479a2d8bde22e5e2dd9676ddd8039f850958072147a3787272ca405d052bf7b8943fded7f6b2309dcc36f0e2494184384e49103e536c8e76c9b96c7cedf6f81d08eb589f6a71d2ca14823f9bb51044aebe507019932037cde204f63df5c50229b0dcef72b36e3f54d279e0c5044b7b830ba275d246fb788f51e321ac2f6910f7f9c2486482b2ee1d009ade9b78b7ef7057d991b7baca47c423d6c0bca70ddc8a26cd18e25d961c6def51a073d11c060c0989321136bffe9ae1b5b1bebf09b9c771d1f6145f872d088287cf47ee78b77c86b59a69ca1984dd7ccc7df855a1fff33d4660525419929d3a59fef52bfc9c173f574e07219afd4603cbc29d7958658dbb4d282823b2aa76e960053da1a8eb2d678c3883e8b60ec18ef7c51b9f630c6b8d3795a98b0d623a1d0acaa4803b3d80cd2c586741c6dfb035b10381aec17bb79597d5fa3895d542c2e5a47099a944e5535d8305a317e8fceb0b8b32df8326d2d9495c365ae480e54388ff5bd5af52a6531b8b52d71062f081afafcf3b2c7d5e40bd497d4a4f05634df232beba30616e8deb843054f88676afb7c62b71e8c27b7c71ef649bb34eaa3cb5a21ffa96811146f25e1ea5b0a3107457ba883aaf6eea07e65dd09bd8cb81d5fb2c743dc01c066c6af22921dcddce93bd4e51045c382e961044b2efbaaf6b4680e3efd758d41740c874520a998199ba0744cfcdda2651eb8315f672ce092437bc2767e2f1596ffb12c9a4788865f14c6290ea068db9195da8ebc8b16ab3ad4dcbc0d9a38b31b1fa268b1cd622302c9ef35ac62e703197efee49f4836ce12664e80bea28517a654d2310c4aed59a44a3fb13989cb834448fcaf6400f04dc367455b76b82e7d1734896e57ff5668e2afb0affdd633443457c24f171fe1b37d9768c52bda8e17919f25180206b159f5bfedd0f7b026bdd15e86a880d3328d3fe0b53c29ee1aee38bf2f4292a180267cef8fb26ffebe2b378423d216e659af003c150d2646f352f3bfa40880aa4f912d4d7774349d4b34a1c4f6b9ff4879c2b77ffe8ea814b045d71ad78392bb22921dec14a20a2445e2db0097e0c31284ca8ad9a4a53296ba0a175c96f86118f6ea2b75efcb1021324422990d6f60d13324be97c5226ba61ff839c2a14f1180107d54afdc0534394c79f9298c012e140840dccf87d5a09b9c58fcab8eebb1c8812338333878c3cbe4cb3c7fe324d67309c8fde32c6d4dec33e1a1a7e90da24e131bf1383d05a5ac2d4c5cf8551a039e487180efbfe55cc2439f703863da81f5f6d172b4631dc4c568ae1f4d542a2f6cf5cfd305764d64d03918c488e31c3c4499d695be73541369138d5a7f8b1740a47a8a38b9f7bc3d43e01013db043524223b0deb75174d92d41e506944e0b4cd5d079383d9542c0cdf865fec0b37efa75bb30acf8186316e4beeef78adada2dc5c984f226f21f3efb7a5e4fecbde44be6793ffb9ffd85d6fef142cf4ddef4d1229ae4b22107ddbe52167bb06b1cff4076e3fb8b34180c74fda4f08f428c430a57c8522d3eb99e2ef8d20f1e30d05bc23cee31645e5c12a38ad5fa65f80dd2420003b68d97195cdb8761678716499213ddc73cdecf66e7ff48cf492c4f6c622a4ce16c31e2cef827acf8342b0732cecf55855fccb448661984e82f2a46ef5b8f0c3a9ece98ddfe87f32f788651c20ba3c7ebbdaa5d0d3af278ff9b6fda789e0f5bce721abcfa04a9c98c20ec30d4d1f690d4dfda99724ea3ee2a5d17e1a757b02fbc4e597fa509ef6dede3bfe6120a72b608f91d37a40b46733605d907e16fc2b8b918012c5a98cd68cab8fb25121f016caaae69544dfcbc0aecf175d9b6e5dc85d9302d5d67e4e513608c3606c0abf481daea76a80156060f84354d56da00b1a0430199f25b9bbb1c8090aaf00e5ba0441503c0a772b735cf4d83b5b06c7df38dc3b835b85b8f44fc2e386191bfe9cd71e52790af90c50048b9dba9ce9986a1de110a6540d8215abc0c1c3b9e152d43b8b6ae6216ef66090da7d21fecee386ff728bec2828cb26ad6cac053403f53a218fa3c057c5162416458484062f27ab1814d753d377c3ab39018957fc5768c6cb160145186f696dc1d94eb5637be75d860820ac6da40d2b3073ffb800489bf4dd009f13e04e47b2f9bb618e6ea5b351efc4cc3ea0dc58624a4444c5caa5d33f79cb4c88a83a0836a8e8a17bef1698af49f39b88f324ecc8405160df729738964c708f055a8342cd7bab8365e281db18f9668c16c10f9d0c5e8eba22bddc537246a9384d297753aa60edb58488240497faa23295957cbd210212f710ef159ec819c1394c0b325fcebca13b01252bb52c803db7d670426c2197c5498ec377ccd732c95b6363788b25ac93ec7a3e47d09ac893f95cec1e5d949dd57190680f52b0f5eb0c2fb678e5cc848fdbd2e87187d81aa90d74394ebae76f24a9fe446d437f96ba6cba187a6ce3f3f0e28849ac872ba34832b8038d341d7a573e4989075f73d04171ea7e8add0fed1cc1644594b2d83c188d8e448d8eb4954a834b75cb6005fa4773c4a8d9b700702deaae3175296462b5cc0f58ede96cd670c687930c2bc43d56ba5df0c359f576e03fb84a78a489f0894afe62397f39dfd995825ccd0688055ca14bbe817409dabb83aff1ffb63925332e4847f248e2a67851c565fdbe6aad82fa3421bb6b92386a8cb018a06fd1043542d50105376e715f32fb2196c221180366ca1073e8313cacf243b46ed8e5e74527a1e50f332463ba1d82dc67c223a684e1033b218d790082dfd97e24252b8b106dcc3cfdb3bbdf3271e50eaf7f2bc5bd3bd40831607f729eafd37cace9e70deeebc2e4d812f42403f3084ad874619de09c814fffaff6e5047d2c15432252b8acdfc6d1c5236839c864d0643230d3085d23821d069096ba22ca82ee5dac05bb7065b2049a0f8f05075669f3d50877b0450f56506836874e9f7703ba889a1071706307288ad923f2c7130b0c57b53270447ef98517d8062fac89f2629651b21ebbb4f087f04c76e8aa59cb1610e94984e96b2766af1b4b4eee94239ada163dbcd146b550cc57907900967150b86da9ea8b7d04808a49e70a788c3ab94c5c60ad8883ac2e5607d40f28a4470da07b63951440b0625ee3a9ce156001855670bcbc5caccdbc70dc53df1ac10c629de708a61705b0505a41381a80dac458ac6166ab35fec612ca4ed5a90c024058fe0f9b76f9849ff1b6a6d1de21dde03900f6a196d9771b9ffe11a1f49370576d60863ab97b1bdd8e3cc9771fd0f550726ddfc5704df19d503b616710b72e2c8b8be68f5302e563a506b6543c1b27043be44f196557feb6be5e40553052399b45ff17b54d5bf80c30e4b5378af700538300a4f471f8a1ff1a61a4e3341fc848bb4f7e35ff835a30643ec10e8a10f9608563a07f054a4c7d0a0b00bf69e18d6f8bf55619449747fe71934ee834f33cf86467ba6ec8f1fa114325f358077185809e959d13334981cf61e64fa70225ebe6f8fc0c6e4b9530be2ac388abccda910db5fcef959399f17b4d14dc6f98fa36567b9024be4f5c002c7784102d1abd50d43e38a6f415497a4cefc63502ecbc2158c11298b39b1caf7caa98cbc100ac691a44810289da75e65a477879dbb4e3cb7f172ddbe808cb5aea8df91d7deb8b68f6adf345808a2ee6f5c62f8a043344ced800de4d4c9dbfd70f303fa181494c356a1b60a8665abee4ec6696fd31c3ff41fe76f0fa30c028cb0d10d5ebbcbbfdbf9ca67b8347e6a050dcf1790f65a5ce05f060fc7ece38adcbd1ebe05bd8cf91875ae49b1cfe20ff809afbf1b5b8321effa1c20dbbabba1a5b7b7b262215da735c733a801f9720d3c79405c584049ace2dd77d4d8939228c1e5fe54b42cc4bb6a428f29100077b3168be083fbe31de23548152920b738a5de776d40d00eaf63fd8bfb8694bf6a3c9ba226deeeef88c9ea590bf8e31398903378d03012091cc3546932475dfc871371e08008924047afc3d4666421f1f9d3df4752d7dee90f7dec604c82686fafa8b532df9175f1ee96c95362121eb99691bb804ef498311ec70e7ab7de2a6b62139412ef8877cb110e6f1b1212e4f382f8ab7c896a9c38b51e5370d9bcd9e57f2a7367cc3d40012827cc237cdf62402060489d39ce7cd210c8d76b7f5b4b077bace44c332b481ffa35ec6675f98961fb82abfc34fedf614ec35f202cc635e30e54181a6bf1cb40924f6cd042e038accfb738867b365fc3498af489a85be7e452a678c18b54e92b9c17c83af72fd87b5c2835dccef3769d84c4b40cd2f62584fce49bb60de389e823f6174eba65fdf1579e2d9b81aee9606d5d65e2e16e4397448a2f4315534a1d51fc3ad003841b5525c6e92bf541152949ac41a2e532f170f5f9e1baa361eefe93c129a55106c504c40e184c38336c8c3851add3c316bdd1ba52c4ddcb8e35de75bb05bf796c54d4acb5400974f28d4da425f4d8cc70462ee8b5d1d81f8c362442fcc53cfda82c205a8321f339578694e2c4621217c6bf44639fe4cc5942862becff9449b630e92e7f223b52111bbc2d04a3e53e11a04c8ddef947d3c80d5c09b00be685bec0629f14969bf588e4648e4ccf3e483e110f5ed7d32cf494656b9de2af6a9d3ff4d494b2acbe17a536ba2e2872e089dc50c29e44e5e63130ef92007a3a20a0299e286b712b893e2302079b8311861bd41e41661020ea3f0180c3d971d79be98cb33d2f39de89fb7fdb277d0820c94178232bb57caebbe828653166e920c9689a14ab519f81344a4730182992e128778d15a86edd4d4bf506a7a911057c366839eddede9f02fb6a84a9f16aecb7ccb632b6a5b3eb95e389f2ea05a7b64f022bc5eb81e740566c583f01649b58508378a1185869a6f3aa1fc5ba7c7ec3d0edb6c9e65e03eddc3b89ae29e32e02f773f9c2c044d859c30559ff78670dc180ab3da10d8404f9295087c08ffb506b5646b50292e508f03cc9df06a31d8593eb283879d9307306c4be0ba216b0f56b686374aa8ee534fd693fb147a0d41adce51240f7322341ce019e4f2ed791aa7779fbed640f8d01da7b59f36364e5980d41eb8333e76dc6c0f81281554bc6d388562da116524ad5c6d9d6dd8e48b9845472da76ad5ba799716086fa054d5a3883c91a1bfc2cf8c88cd4d1de121cd625bc83dce1439e512339b33bc9c06464e37fb705c268796538a5e2e4ca0cce95ef8c32cbd647b58b9f7c5c85c2283d1e8962d21e9db37a92d9c3a8503f91c89f2d183d8c085af3926863b46d6608a8e1ca181a3c60c42ef5eb726a6ef89e4e3b5c8b57c6d3237753e9f794f16c2e0234a943be85c3a57509ac83202ea4d21ac82d2f4c95a4fc83f86564809d4dbdc45471dc199c7e5bfe286830c966cb7a700c5e08bfaf4fe9ad391b08633e8e1082eda31c89f54d09b3c207c2445eb12699ce97f58c65a6d9e8ecdbbfccdfd3758992eb51514f575e39043d652d61eeca8080e762b13290d42fa285339b9212715ebdd2ced70e0801ea0433aee66cbde2f405b1f0ddb7148118f84be453b165b7446029a1364796c7b868389afa7a6f1efa6c42a878d6bbe39559c73ef0508ff27662d3f42a5afd05a0f09303d206808a404b71a18767452f0265cf6501e27d467cb3736651d9a9c76d4f65ea62503c55b8c501528500ce145389de09865ec5c0e437cb164339ec31e5e89c275076c4f483a254275c15568784ab981ef066fa9225832c760119a62239f709c74d349456abb0f869b9814ca3b13f332654c5be8d5918497efebfef656e1401969d8705a5e382f86e0921190ff4d6fba4e84fa81c0b7ec570602f0635237012bd901c4de7b0de4655a2c58929fecd17c284d89700ad43685264d5107f36dc96d7cf1596321018325a1d6d79f6de0baaee48a0c1bb5462d4e2499834ca5984400f2399c7e999ab792276298a46391dbb26063ef069c2da021f024bdcf12051e1c6bfd02104293da79f2b212c6e0759ec8df330bd7ce08245ce3bb7e557e3a6526c894c994d9da903ece76e433685bcf89758f35af860f14e0b4592185b73e98026240677c49d7767924fd745fd7d1cfa416eda5b9b81a309ada71df18da18023fa676fc36fcd96d4838e61039e9d62faa85028b207c781872705c73e505cdf3494f9f2cecf7898d809683c3ded66b8ef8987ad533829a66105ab49603505f144a6a05e168049fd2fba2baa93c672c69cfda4ef3d84c9309b78630cb71cc2bce636a34f012844336eb2e96759fe1f60d81d57c035c09bab77d8c86835efeb2ac3379d3e5a4c65f22bae4549dfe4b05e9268788ebeda9a6536d4f9d8d29c88d64c874534125780ee12f29b891bf39e62cb3cccfcb901f465726c11c02d9cb2ddb285efd3ecf1e84eae0cc4461e542ec297b14f1bae4c8582bf1bc6fe78c4f47ce36b6515507372bb5ac91a558d140cc42f94fb0da52a72780df9ed7b3a2d40017ab62498a3618478a2454d5639cbd0b3dc7ac490c70df4e1bc3085c901c56a0b31f59d7c738e9a084f52663e8fa0ea35ea114fb7cff55ef7bb7e490f9a58d84212a605f46d54b06752d3323e3647b2b6c6582f4ffb187f8c84c8552ad295de7c938dd3b333d3a359f3acfd901c8bd64a745722c2b2c4f4345c7188fc7ef79df7a635cf09bd5d7f5fc9f176f17b054ec4b3bf88d05b86a4443b4bb0a3f2f331002f7b02dc031b84df8b24a29114801d32fde5a3d38d54a0f03bcfbf5085c59796f355b66ebc1ee2ccd142f08c6752cdcaddc80171bb14d32b41f4ef05a9c2a35d26942c431626bf596e011642d7d2d6debfc654da62fbed2db53f8ed3f130d08b694406e69811c529aa143de40c2ec0ac702a386107904acb7bb2342815f62404f93a82a343b40a64923d4d5048a4b623c421de2fee0070df46b117663bf0f343b826ab2bd9b676e3ab5538b02dbf67cc080b257b0ff490b6a85015d8b79fc8cb6870edef3d76fb8b8161b31f5451c6581f290b2b4e992f740ff3495eccb222032195ec8a4d7c60c747c5a302638494774d15222c93eea0089d470c81f1ad0a6e300a18870c817d211bd1a444511d23e97d7d4f4413e4836d73d72bf1c802a7f4ddb42d540e6d134a6bff6110f67cb80bb13b6793e1a4f1a864a1157ac7d73c0f437b5292220c55368ac5cddcd781fc307b0078e5c8efa4cdea8a71c22f08aae5264ebd76354805bb1f273f3e2d8e57dd0084606ff0ba168a24c8d84afd0d138c2a66266258199aabc03b07d010c48007567493e29c0f2c042f63329ccb197b690dec1c6361ecc2779b0b96e166ac1dadbccbe51ea4aad298df093aaea3df2ef84756368bd179873db908fbc56e4efff1ab47564e0ca6b5b2d91542f97547f57e2e3c169232f091926bdcedacc011ac3a941479bb73289e40749c5eb17e8098df2c73e4bfd8074166eead3dc7ec011aebf2845224b7232d534681f20c2411a32c36d722edc463a6385791d880d056d176ad470338270b7e9235d7414d22e9d36062403a467e08c0274f44bcfc120820f7b48ddcd44e1f27dc29bd9300f48c3c40d0c5481520bd52b7ad4d848736111f8f7b97fde6bc03df283606deae1bc9d39de4c5402c7ef939c3abc52538c7ed32a686c156117a27512335f9252641a1c9b33932f71ce6cf40c0f5e66709eb332109e318585408fce1bd66560e2e6b11aa4699969c0dabefe1d1749a1e47917ab06595c7cf1e0922962a8fc92ba30661e7845c172d1b3d5c37d58115909dc2172ca04ab9c7ee56159f7c6bd100b0b1f17836dc572942e58d759fd4a82cbc056c3e2fef1b6a8d97bd957a868c36f5faec7d2568550540b5c7a0b5933fe270e40039744f62d835406ca8cd8256b31922e48748011b36e280332706e3be3e78d195d74a346f2ed127e1e3e59662d4bd0e8574917ce846d51cb1d22765553327b52362bd75e46a2329b40e779f973dc43e5e73e717101cfe1d16136fa2a84ab145509060ff54d0f6834e209048c54493381dbd4575f33ab2a8925bda59d953ca3ba6115f8f9c90de1c12fc58f702a4b88bcd936980a8bc9a003ea2cddc9f25bd1ac1f7ebdc71b9752f996d5f2989fcfc5b13523419447d1ca0412f80246df048cf112dd5b56dbff13efae8e62209e8fe2934cdb93d3457cf395fc56380ff0dfc99241cd917db6de2b9d63289679912d330185582e1203b31c1c73d8e5eed909c207d0a74c914805fab0d2d41ac39fd00b6f2323ab026322cfa8441956d9644723a7425f00864a3062ea74aa6e39e48240b046a7a38c8eb546188b00ff8a1e32ac154f07185aed167c6054d0a4553eac5febc33aae5a3890dc64d4efbcec31ec68e8bace0401cf5f3d58fd0ce244ba99991cc999d5652390c1034c41cd02bb3ecc631fd8aa7f5923deaf884a8e695982963d58636b2dc198032e937fc99bf53da8f103b9e8df0c46d2f3d7a2e6362fdbed64a2f3a83b5a9612de91f41b658d6d8b7d3ccd23dd098cb3a4c8d84bc4e03a5461e9d79633fc5b2d3548f3be8d5d7ca04cfc5e386e6c11dbd067292f23b4210647104a866fa53ef328f9efb1f8ea302c75130019595b9879f6cb51c34095ada5328b8183d41c8bad20cbabf107f3f6e1783a8269f519606c695d2b46dbf2fcf3227ce13a09b7dd97d281ec831e33e631660c1550ef62caa8f9eec64a758d311c942746df061520a3cd395d6b2b83c32252013e6314a5600b8a3f7642c4d54767630ae69d4db61b90beec2505d8a64fd821930facdbf16fa877bc73ffa38ad284db075647d8fcb88182fecd32df66febdabe28116f43e72464d3ec5e1247d80ac601fa4f9dd47d8df4aa86894af8a3ed18884200b14db22bce8e1da00718c75f1dd23fa730701e285bcda46a972960600a68ed16621d5016703f32a71f65939ae1b08aa5f527d4397a8db7e97e91c6b7a250e8016ef45a08e3eda048480bac1933be1f85ddb7566d9e0cae478ed5d07f1da20ffda65f8f4198ebf4ee39662b150bc03fdd0817411762e802faf8f46e2c8995e142acf93abd2ca067e0d7b4d41bf65c2c1b99a2df4e420ecef4983e021e2e304aa4fca0b4bd04ccee587ecf1a1a2278ccfaee6f6f0e6a418a64905d4927506df3c5719d6d1f498a612a70cf89bc73d19fddbf072b65a69ce78c6ead7a93997436e7768dc204948b3469840bc20e24e72d08e647e1ab9af92522a6e417e15f16ee2a5e9138a7a5ae2064b0b64329cda446414d2d731363b0e840a1df0a39553d19df8e0358b7530851add4c447bf01026b9c603973e8d1e0eae594a69cb090b3146e0ad436b104d55aae3ba9a2dfb389f2d2349e640d296effbc6199100fdee2fd2405ae0f78f28aacf772570de600f7e4d473a604f24dd4e4cab5bf7b54b76904c8bde70130a578b479801fab7d80fdf14d6e24e99cf07fd7da4a23ba869f6d80d3c14cac92c2b602c753da87abe9d4bf3f121161fdeaa87b6cdc747e6c826861c14076a5fd159dfffb5b36e45d9c11dcc39a27a24317d0b64e9c342b956a2cb5753cc3d18d9cecefd8d19b5a73c96c3c37656dcf5c85cad59bb3076226fe1f01c6d45e205d4c415a637f94f22f3aaadf4eccbc14427ade84da446781b66fc8b4c48755cd0e565b502f2e6233daf541580fe46d8135ed540e3dbc4f26d9effb4e03e4dfc3d08abc1de42c1cafb0c68880b94b51614426a04131d671300170fa04e905b60befbd66dfce0a8611b697f665b80ac204a20c29c01d6cfacd3f11ac73c7104eddc2a03d2ab0d5959b7b54d91999b01f1f0187dd56901d95b65b1090050e32d00a328dd889f50d8afda0ad2ea05f952e73a3b14ede232ff35a1c7fe9c1ec57d6135ae9888b713428452fb44a32ce931b95268388a753654860d54e75fb3158d6499a0175da09be6e549018ff92019c7c4d5a7bfa30271148c0544a218f396f27b4fb652b92b4eeac07cdce1ee43d771f1accae37ccecb4ce094e7ae1b8ddc146f88f7ef06f6607638705c1fbd9877e48ec04eb1615dcc0f54e7c2b201daf9fe1d69c79d004698a2526d03e0cff03a01de8f7f4573b428735a4ab9f43e97b6c222beadad9ab56fb1b03766fe6a5e0872f223c4cbbdc9978e4d5dcfd3b82c508104fccccf9b137053c7c424524da279e80a460c0d3d262da458d2bbd443cdaff8d9b43d15f157de6c212200427e09daf0da00fa6b84d05babb9c5b361c894321f25aa5ff9bb6c7001849be6857460f36bd05ff1a543255585ed69d41287dd90d0cc72f0eacd702d2a1f239f09e184135ccb2fc1c1e53acff2b5150e441abca48f8f9c8fce2ecfe9933ca7a2436228a25dd85ac6c4492fa81b52c9328a76cffae907234639b948e812a0e6199cd83559ecbc5420e73ee5f72cbde6fd2a016a6c78266b2be62063d21a13be99d8fad7cdf501a0d2a752a8e6532a99d807ccc1ce3209a964d3fa1a5c556d7aaba806e4269b50e1e5af97a0d46d9934e83e64a59958136d9dc7ef84cc8dad8a21a8fb178b18b4dc786d540c27bde468ad646790658b922b08854ea2c0b793c180a2e4212af68b44e0fba1bf3de6ce06f1b8a30f2d75f2e8ae124bee9f6c984a61cfe176a3b419adf89d39e338831faef5bf31e14e89041295a5a61b4ac98880ab0dd21ae0da42ccedb891fbdce9f1beea2d1c7c5d68e43f03a581276155f298eba893c6e076882aa597b8acb8a02c555c76c9b3befda966620d1a2a99cc7caaf0b62b4a9a77cddebc17f70e1732ab947b7478548f12cb94bbf7e0dfa761e6c0a010f1bf092eb08ee9dbbd12adf7318ef5f3c37822152f7083bcd3bc5ade28d45e32245fe395886544bee46e57f380d1630766aca58c737484d5b25750ef77cb4e574a5726a97d9af14853aaaac596de58a52964f4c9bf0d084979b3f36430b560148d2458a3e8f74e80a307e02b704e32fe1d3dbba71528218033744f0f48b92fcbdf19a05bd112c0d3a25f576b91031859191f261710a859debb5d916ba70e2936815b57425b8f3135cacadb7a145044751f535a3609a6e12c44b292416a2a392d6759889982ca1624ee7c699e24cb37b6d0efb3428fbeac018b218db6fcea0b201b5c197077c3c655c8a540331c5640a7fc4bbb97524edb23dc504640b61f36bd1ce51b912991c2fb93593921e106c4a96bc30becf2298b2eef1f119b17043c3184810aec263fea7de7fb340f1b02fb22772a8a7844a60e287ad837f1a6c6be658a1ef2908f0ff1dbcba018a2474aeb40dab9b89faf2ae3be474f38f43774f5ffd05660f9817a9a257b1d606e7f28dff979f49aa65d4ebf15aaa9f67d2e3824c61f8bd8a5551cb130b2327a4af0a7c971971ff08cfb81846eac3dd6c52f7340a8e49faaf4acf9d59551827bce014ce3ff8540883d29e5c564eddd363b95989c9852df111470e90ebd24a20a643758253a89f180f2f1774ffe5bc7add46c4070f4912db64a3f3da2e14858dc8fafdc9486d67bd72adf31533108acbe3d3d94af29fa9ef288b1598541d415e2baf87bb60d0fba0fe29e2bd94547402f1a84835fe73e2f4445ccbcbb5fa79ffc0c26369c422ea70ba3a72eed23ea116dc24927c5aa25200ff03e6502c0e9564d309924ce31ca8d13ce61330e3bd2344767becc18d182d06453e9b389e8ab9675eb5323ea531d11649517e38b35b7a08de9f09915fb3e729aaef4768ab93384f07c9987822c75af1170e2ebf362d9d6b48b8a763b9725f70979c08c119459efd8f49133330fd5997480730e25f9e3bc63d60159c09b84d6af45c6ee880717c5e3e337b2e054d33fc99d3f4dcf99f0ebd8e9a8fb2f1d8467cee5af5aa21dc42ccc662baa65979df8dc421a6ccf22dde2710e8c9954e27ac5809704f974c19e750ff5b9e998346da8f9483bd2cf52892c6fcd5cc9438171e89121185cfc2bc82165fd4334e5aec0bce590d2660e697b4a3106ab351ca4521aa31cd9119b132cedb7513fe7345f58a96a8c5a021f17b35116a0cfeff9470fa97bed9484f57b9cd91b0055899e24e5ece9201d071424693d567dce4e737433be979ed74f89646444c0a22325519d960fcac6c295e76306cfce8ace62b489de22a5dfb7d860c5a6dd8e5fdb203f69133463e507af339d72e392834ae897662c9977d1a24d4071a2354dfdb5cf321311d0e090bf5411e36876c39cb1db43d20f37c8843c14d8b84112f211710f552480d00de17fba214a4c1be27b3684ce88e2ad23f10d74a43f1fefb239243704f42437e8f30b4a4a896e9871dda007154a4811b1e5b41fb3c38225010738379b86e2eef09c9739046dbea40b4cd2ed0cf4d678923bc64b0bf9f818bde626622a7802de9da6e5263c00f5aca4e327bb9c518985abf75cdc66906db003f8560747dbf6600d37915f420fd1779fcd2014e929b98996ef7a420cc58f8661c540e697aeac5f3535116d29a6266edd969af0689848d58d76f0449bf05c05077a1d72a00e9f03478786ae1c732fd2098dd780027adef62b4e9ba00afda42e117df7d2d0048939034589902d6e074d7f4f9dd326daa95c44aee4fe8132580350e15ab628334ea2537c8bcc36dfb9f82d92fadd19fc003c8373a119da84f7b140b45c095dd44e42bb4e7f00ba6122e22f723ac76c4495d949806f26ba30cba9d2813abebd14168c1dc61b1fb46b8fe7cdbfa75e7c0a59b56e142b5e45ba54c2551f3665e2f85a53103bc4f49efc7f5a2d2b819458df1adee453b8efe747ba4c60b60f0d9ca827a19d5b6cc9c633549ba3f1a71c5e63c15444ab87542a23f74ecf69c7e9c04329c583c4da11ec4f7e7292b94f90a51bd9fa8bc9cc0f03b8cda126b6fd5bffb1d4721d6951efc85af4d140dd2c13a26891d8ec024bccab8e3d32da6b428926c9f0509d2f75fd21fc77ef481722647dad24ba85c043f22bd9a304c4992955c9f683d2527ddae3d1f341492c98fdc83442e1999e9f4f4d93472899a6eb9f67382a116ef3d9e9a6b744852f9aa85c339307943ec78fc4fd33aa6d84aca6999cd272fab382298156172151a7cf905f1d89351ae4efbe3f9ccfdaa6bbfa94857a07f04f1180eb7e468136daf2834628819312d59356b1bfd437ed989c6e4a4bd0073280e357ca3ea80834255dcd811f21cfccb594458caf0084232848719030d80c011b8818f980d42c387665a23cdf0f50ea2b985f578462088c3136c954be243e1632b80e4c7e705d797a9304c50f127b731c1dad22b8b9e222385a712924c933ffa9a11403d00ecc99a01850f70f6feba747f39a113a6bf29d43b1624921170bb2b4cb501243139d57a67afa35a4154864db2778b8aa2cc1360075689339648e4c3f4f546adeae5129d413b02ec32eb849a3b38bee894a6922f8f32534fe26fe22a1ad22dcd562d0586b4174aff8262fb0d77cf2f601664f3ac5f4f10e5f07cac64e4170743e18c97be025650c1b20a35fc188ca98cd69e0e8ac5bbb47cc0c5069326686d4ce2f4de07ee38ff9a34b046f4e5fef42269a6baab657d0c03367509304dccf6c992accbb916a3710559a8ac4e3b25e4eaa5888116a654fe7e4a547593658536a1e153e6546cc431e690f73338a972d114845bf7ac264465976d37a0f08e78e388ac4d2b97448fb63eb7872d975876e613bc74bec42c055143dcb6480accf982650c5e729073034418ee91aaa1a7f68741bc68777d718708bf0489362733f4da8b8d6893f3cf7a949f37b419621fe13587c74ebd9b9ca3c5dc3a8186658ddc2a0a2d2bf442aaa0e108bea52a3921ebdd80244eba3cab89ef5c70b55aa158b271a4b5322e8af3c25ee3113ccaa0c62d381289a5a656fddf2abb6463162e2ce21952dd9d88ff327f8439bebbef16de26567efef12c0351b126590b7d2038440c9cfb7a9a9a0671cdace3597a8ceccb0ec70a7521d04d02e6204ab5525f56a59aaddf603157bda1661b0d40751c800c9568c81992310e00c465151889b4e80008c14255dd6ecc4927858444e73dc4aa7773c8e9808f5109f92dcd95fa7a10af18e2239fe81ba3fc4365d9be2d647d55053494d9b12491c4a24481b7dac617c4ad2e762798429133bf66ce1b460a6111bb447221ceb7ca7e6cf9123919a6b1e426672e65a07bc26488fd55497701c4c4effe41bf67927ae8c882aa51eab0cf5ef5b8d59949c149110ddb5cccfbe0cb27ffa09f6e1f95a39868c0a65516ca16a1d0229c9487216fb7548c0043e4936f4fb7f4692295c9e5a16ceba9dc092a6aa2b1abbc0c0a10cfacf0f19f494cfc721e35e2270205ad65f806387a5569d42b23424e2283a67c85d7ec08fb3d1a49d4bc5dc0e5839d6216d50554c7d44b3da5122787a033253b32b1c829e56d245646fc1631dbeffbe99a26d83e15cf9570f4f3a1f25ec8ecde29921bf254af06792a7238cd18e076f2bb26a750e7e725dd6fb161e3d88e5462e69fd6453a22ebb020dbaabe5401ae087cac66ca529ed03446dcb0be2a9e1520106920900a515642efd4db643b7f8a445ed0643d0b8fb1f86a42de7ba47207b11a87e56e86ea6e5ccb42749c38559120265532bd80d17f9b2207b1c13c9ed2dda1fdad5d28f6fe738c48b3ce407ee53a0ae3dc3c73d6f58520254975c4381b600016b44f727e07bab87ed93d0ebd312e650a590c01de22ed38cdb4e5c46bf471153fd6ea6452869251ae7c2049c5674c7f57d1a46f6cca4944c7a62d8488d5d1809a91ed4639e755c4d68879ac36fef29862c1cfbbfc370177ce3c49518ad23413d5992ba907d8e62b089c959cd79ff48371142f117f091d41ab4596686d05914c4f556885de716e3f240834e0003f0847af41be9cfe568df455d04c775cf3a13e39848915e515b8d81348b6ff2b6ea3262d3c7b3873f167cde0665ed6cd5b7a0b6ab2fbe048004b387ca5d8b1b74644a40d0c73705127dc4d846d5ad813c71e55bba9ed0f144c501f2b6fd307102e84d212a1068fc1e36e3574fc2174f4119c6368fa7d9e79589a35da1360b49876ecef094bf49a4e5152830c9e55fc1d614b9f9491ad2b52d56d2560d965904b03276af9547bf3097fcbb99f0018248a814ae7864dbb2b3fd715fe06477e49130165e8277493b7257d92bc3560b3ff2b0b8b4b08bbca3968c51f6ac464bc63f70f82cc57d96413583b749d361a87e0d57dde09ad7990324866c64fc614c08b6a47695576a996b37e493673994f8bd5b395557b5cf379149b0cc905f0a423259c4d9baa9c75cbf6be1565f2006c63dc72892b865b4a52a0c39330ec202723698357cbd5d09c8d9e429df63b5e7cd4012dd43923858c71856529a8b9d203f56b6faf7992e569bcf22a5eca3f874ada4860ca7596919ec32ef76c2b1a1e08c66941844f29478fde5c6d60ea702e83bd1f8db54b40bc4521cbf573d917596ee8533384a189f7cc75fd6393f6a1755d2bdeeda7dfc155543d3a2e49901d3a7e4564c4b83466b71b1b6742b0cd29d2be69277996564014780a96a1aeaf8e566d8500c8ce893497aa379f16904525a74916b1c7c88a9f56cc57fbb17726822b0c6af902313fc9e149f9bfcf2598ebe1816e230d74704c15d3a71c3bec10b183aa2a874452f770ad5069f8df22067245c9c3e11ef900603124234bd1b4fba3a34b01edd691c2d39f4e3dff13f25690134e3f1ac1a131672185f918981da4ac25fa180a1516626a7788ff9161e68a719f00a2bc49528e956c8b296a2fe3271b20d4bfa7f6ad852f4c0bebdcea87d486735b476739ab5317719575633b46913081dc6007b7e02c8faaf9f73bd8c002d5a1db1a44623485a7dc2b3fe600b050b0dc4d002a57cb2763ec8d3d63342d9763eb863f3590d8fc0aef9069f833ea0958b29fe1b69cfe0fc45e2c8ecb34d51b2b1c5e3175790e8918e4a41979c2803bac587ff513c902a9772717238a4dfc0c3f99d9fbe23f7ec1968722933882787bcf352316f8e20c28dff2c22c38be9d95ed4f2661ff84539df351fe3129020f634c7e85403c613ea7c48f9df0e416679c478930656ae330ebf1297e443ed33de93a51c640e6999e4171bae597d44141496a235a2d0299a6782c7e1e4466a9803db320e89219c37f9196e41b81d778542f596fce605eaaece8a7ea3781be64e6b9282af6ae688e514bf3b68c914581c8dd114374d8060ad313552a039ca493867c7404c78e08b79fe4a2350e076edfb0c95cf0e531ae4fb7d35d3d627e9d789a9a97c49a62963dca03c5324454633564ff651e4c1d12d97594ab3e04fc79361161e3cdc4866ed9392c5a4b06b166b233bfa98f2405252d9c8e0b6998201b9333ec832b6e64e041ba146a4121395b4aab2778e965f01f6480e30e4be370c85dce2951d22afd1f8d69ca3fda1dfae26b833b5fef488c096766de23685c81b4efbe29c68e5b74c1619617b9dd485eca7633d49435a1c6af1de6f39de7b404d3307e0636f6f222e52ef98641f74e8589f72f6abaaa3cd50a7893ce0736fc8648f669b8ea692f0fdff2b7e0674c9cf009c56ba68ca34db85c1ef4a8bec49ce23d97398f71c4bcac23b309146fb02c60f9fe7c47c92ae533bf63aed317c46b56a4c1d4dca53d30c89a1c4155a11b6a25beeb9699cea90cfd5b8101a347c070089ee208b0096125757c19ebb9f9081c08f80664bb878a8a8715e62c1e4b06fac48be327f202a412a318b5abbc82755c0ad3757cc1a5accb7e6f8285fa8388891e13e9e382fc21e9356898ea19c57527b68bed66b24047135d0c4265bf01c899867b3cf33ec603b254ee8826830c1ba24fdc4dc214256feac5e15f8ef17149728d756eccf67989de43087e80d537caa99aedc2cfe7b0b5cce309bc2f769b46870de19bc4f2001a92da4fbdf31ee6b1812d435f854564422f6f972c260104c0f63366b654cf46a2c756236ec0d03966fba1af4896a0c1cd6fea753a1fa8a38c9acb07375281d8b64c7fbec0858db3fa79a43ea4e9345143df9b8c7e1c771ff01a7203de9f50a363d992cea950472444efe94c538bc0bcd9ed847f260f8404c51551d42a84d59905f2092eea93951a99bafba989bfc5c2ba2531448c063dd236913f8b7527e19a247a6628fcc3580ad87da2e4fe1b03e214d699aad02451650c46be6bce3c23e3197c2758a00b6085e1c6c546fbeb8e703068bb63efdec9473ecd644dd44ad4c6587d06d871867719887b7e172648b23e5b4ac40d6811869b964e76d5ac959027550f18943d5e6dbbfa52b9fcaeab49cc348c634c1d43533b26130bce84c36ac788e547ef8852c17e7e9b2b3c09a0fbf629ac7c8ff3071b65d54f515dd85edc9bf6e387dc4627829f8938037403eedef619f1cd0185f081d8dab065227ba1823d3eb3a1fe115704be610c9692ebb0c5ebb51b3d147f9ea65bb151fbd0ca7d252e4668bd1ae6be59b470f98ba916d3f1212576ab60563c67b21d9f13997430364825181cb1fca2600184a21fa0425572b0f1615b4102ed2c6fa387a1bc97ec40317d4f1ec9f1fac1a408face3aff2a0cd60f2c48fbf4b71ddb1e2d294a770e28268feb18822b5152386062f450b10d556c18cfe859cac572ede82629710a20815e3800e30fe29b1a04ace1d9471f8df994b400fe97f86e033b76683d920b4ebaf5ddb4e21a03a02a5d06742c31c97b2d2541b889384368ca5826b450d26abb983495acad2fe07ab9bb1d813071801ae0007bbd3397ab560ea7904e049464292a24abdae552fa3c68c882e4e4a0366b7cda73cc2922798834e1683c0e6d9074deae807044f31eb2be018d65624bac4836f4b9e0ad4d0e823526c5845d73218c83829aca70c383fc2349e92b697d41b250084d712c88f598b2adce4a784407a0f9d16ab8affdf71d886b1f1286ac0eb46bdd2b3de52c788973f26717dd8d6dc1d403b501b58606e9b628b96382e47d92e6033ed199c92bb9b9e0443fe0b18d2490fcfcdf93f3de15b24a73dfd1152e79d19272220a4581c35770aec84394db06bf0fd3a91e6bfbd79850c2618840aac0a374c01a788c8e407323635404def5d02751fac01807af36aeeeaa3e181eb4023d01a5c2213b6aedc414374aa295e57f6903d3c4f11269f93650e8b756785c85aa23491a0a10e33a76d32875a6fc7f7e0d1e891b5ba32d4002443abac6471cf0c212f8e9742b6096227ce9d5d22da97c0bdd1e88da09d14c8ebaee574a41649882b72ebbca693b465f45dcd7c52620f1d1508cdc24873cbe0c2c9e200d224089e828eb65cc14aa27a3f21d15c6124ca28cc6e5222a58b987f0d9ba4a3bc2e3c710717d1e9caa49469b4900944ec43c8879a73143dc812fd6ffd247b6f27fb1e0b3626d6ef6365540c081c3d0f133bda9f04254b6d8f3a02fe2282675416c37d0bb923b6edc842694d35711e4c41032981c44381f51f216048466e1d08ca30d35533b061b109f88945001ff468f499fb5b77f261960a688d97c8a0caf054b0af3ce90dfb477c06ba96ba901223db0fe8001ef316134fb21499e6db92e45863d0f3f4fd64ee4c966c2058ce531fd4228c3242766574cbd78130d8dd66a010ef7bfca02c3b5ca3296f2883e30b833e71515be97e82c74021e3a78bd7ed330f80726a284fd737fbc0161ca11b82aeb8027a0b016bad637eed8164a5155578978140554d4ccc650d6c632522b6258683b304a607c13b4bfc8094dc2c12f84a9418ba48ca37016c7eb17da6ba88bf69fd892bab99c223810954970de12261f616f1cd085598e5d9a65ea0dfb2da3064fd13585c233288bacdeb23f507645860360700a4b1d86a12089006fc7a51817f260cd1e4f6a502c3f0692e1941ed8cfb4004f879dd2ed54d2c68ff706da4fc91b6c6f3a906b657f55639902cf1027eeeebf046e2a735978a235084382a1482544b184c3b216f3aa326ea82f94f5a0373c07ee3933b122f735abb5a5d6103f91f95e5ce4ae43e5e1a316dd1fe6a9f6b3305b52a081abb97a37566de8856c9f1828bd7460e4e609f5051d221abc33a320332d75ee821d0b4b2899314aab4e8dbb8c6d3b6d439d0e47ee92423b9f72011f065c026bf47a90ffd9368182ae1f778bfa3ee26975c4f457256f19f4bc69b3b68f6d12d268ed9e6f12f94762d5e0668117851b922fc55ee8641ccec424fe360d59fb84ff1e191e2c2575d1045ac24641a5e5bd6746b5829c814a3c36d6bd33bab42b894a3e7690943368154da716d372c46afe72affd3edae35eb6595545a444cf309b383806900a49236011410c14ae259f2ce7f3a89b97c4f629c83236b3d6ecdd7bd7d70089580209949d24f313dc91978b438d8a89d1370b711d9270d331fa3f34d8e50f1d8d99bc6c429b2b48ae5f688be0e61345b643259cc413cca12e74771c6efb1bc8858efd46e1d560942691e47d1d5334882a3311da409d666db4c422c3582c131b17d2e0f853cf33e516a3c14bd6f2d14ddb52fdbea60c12db23cd021f741bdcc6f4d2a7886eddc0d1a1a6d6b4500f5a78ac256a32b689844c39eea588dba1bdb81bbcf3eb5f8008e0880c103b0f24526bb59e4117bdf22271e511684075656ebad45bd4208eb16c6c9e0e2031286b91086d5c257bf1fd2e81341637d02552b2353fdb7ccd61af16948ba32b1489fed94557bea9bc0031329d844f1ee5b337f80c1da5357df1ad13b496e73cda09fe3a4cfb90afa39de2aaa7dcee5831242f5895400ce39a4efa6395bb9d1f1f582f216833caa426f0bdb8c145eab46b78097a9fd7acc7ec004066307be7ca31ccb0eccc4b1dfdb5c71bf7ddf103e58035f9962dffac9fcc4a53869acd44814e7bb7006f123b810be32492a884f70620f3da0f360c98a078736e3db32eca37994b3edf8b594ce546c3228c52d7de85a9f2ef4a595b896bd8a687bda944f1a4b93f469e305046059d99454d3e8bc9ad51c01c85a71c34c82835e87fa3db3e8a4897ecab39a0d4c84f618ba0aca5b8894073a30cdcf49bc6e427233ac324b5bac4758addce6a08540a6413c6ad9b3668839122407a75b8f12715b07303ab22833bea1abb10dee94682c2173c5cfaf41129ea2008d9977f7868470e0e54c94368b19c5caa08b26c55f6952dc264172ae3e07a294a620021bf44e7f51cb6667b130f53a0d1b877c3946bd6a3d6d6b2789937973364536491275dc530573d6af0606088b1e998a20cd595a9b4c558b2ab1d82ec94f32ab0667070ae803f128899c6cb835584dcef17bd65414a5a7fd1c83bb0abfbf3ca0894571ec8a806d5a612a14b1503576e362a70ae02400c7ebdc3ca900530622bf4242dcbeee49eec01d6c72c1df9076b84e9c8b67e5f8465ad3792b0be4d025e6f8314054595b4201f9b59c01bc0b6972821fda612133f2571547c6da56a2c854406e0bef9c7418be83eb7bc697ab56600c63adb1f27618056876b4da9a950693c76a0cd6b131a361f138bd35bbde6d3826b9a43d8760ec2add22cc7666d20cfbccf43e857291be0a4345fce193a63fd0b8e9c7cd12e323a6adea734e21d310f08618286d30d6925322dba370f0e3706544973a310ced7076d60fdb8d4d1106b53c32568ba0bd55759ec86d369860ca67aa54a86bb7fb3a399c3cbdbd6bb14f5e728ec5ae4a9e29f88b672c181d0e499eb4f806686dbca10b0814ef8f72a25dd1114868e4385b6a8e3e50f3a307650181d355c090839a7cffafbf899b7c28e3f7e777263db68633f620029016cf863dfa7fe87c00f6b04ec4057517324f5e1604fd4ad8c927311c64529459c72692cae0f3ff1144fe8ea5cdcce0157a1a89f53c064b42708ff8753b04f511a15f9fb50b5adf339b51eb1215b4ab23ba8985e75e20218646809522c4fa5c88b9927d8fd8caa94a1c7f7d249068008688ea874583094f495270b5b18aeda2c662c56d9fe1afc612f6f39a44f04574a3073c28f5807bedad0ff73aed6c281aa1ac4e9566bc4d91d85a5e4fb0dff3506689d140197624544af9a840125df3f2306b5e7f5677dd02a200547f9be70833c186f1310cad2480acb21ab7104b5682bbf521abe7da4543294cf50070927370ebb63a2f94a9cc12b0c6b24ded69cbb5b6e75bf517119f879868e801068ebf7beb21db0f59e84219aa7fc68eca6f55f63bec86251ada339f74071bd9f65d6839057bb506e691b05a3d5efac7a2919ec3b8a404d800688eba66de6865a3aab61d4d702f5ea11405206e549d9fe574b102d5fea4a0acfd926966d7fac903869f34c6b641aa2a36c35c7beb91d1103bac45574f424b33c63a5ef0f4817887fca0b010d145508fbde5f6d4221a3a7ac76d494c09b06a8b0f516fdbb219dc3ba1d0c7722232cabd0747922b2b288055f5b8b3806331b0415579122a53792ac827f8f4308969e950c902faa4d689e4e7c48f9b908f84f247fd272e034200d3f4fd65af374cc98fd7b4fad4332036767a501eae3e322a05f967e18f75ac81e4409278e0685a67e03fe29b9681de0d32291459f7ac4184c30509875c58817ee6328d26f776e0cf69543be5c69a3e0e279a5ba2cca7e19bcb2055cf15d823c54ac976554f73ebb321fdf6bae8663ea934fc477c92c0506eda12fd22aefe6a0c6aeec8a8c4c0f8fe966f28e5448d941aa7caf2c50a3e5a2cac91d48e4c73199e5194c909ac6b835ebf50fecbbe1eb58432b870d85d0c55478e5eccd66f66736385140f80527213a0a31775b0c76b20581ef92c9174ab328525f7ac8457c8fe0c4f6c152cce82b0258707c656c401db8f4305dd47964f4df762996bd3c8ff16a954e336c2be388e44dd9b51ec3f362e3a304f08625341ee2da051e748da8a616182bc35076164826c9dca4e522e45724d2c031f4f724b33e0d5988559f7f54cad5184edcbb73a99497b532172104638886452cfad9f0dfc3d794c87a066baf3c7723a9f32eb3c06290fa76ab41a1afce34247e2845bb1fc332b65ac800308034bc44bb62e43769bfbcaba2cffe473266f8cbfb7b1eef1d56eb83d7321467394deec257c752e08ca7e14656caa0613b0154bc966184f51a4aca7c19f247c5e5afa1b159481d553b58f62f511e4532dd72b8d7eec5120313d432cc174b3e255ed159095adc0a82acfbf74047e5df5756c941fbfe84d276fb402abeb65398025fd98416d73d5f4040ce0ba9ed87eef0dac29616ee81ada76a55e1558bbca71b9da101536b5c20a56bd465145506ac0dc8eab330a1ab09175a557835ee94d02040303ea08c66a59304ada4a07ca94563ba85f41b4d278c99dc0f1d9ac5767b6ed689d69f5af0b387a812ae2dd18684005c6748bfc1880eb014401812000e24c29a6b439d2dabb08523cfdde2d3889fbd08110479a89652d219b10b9a59429251930067106e906734e2927571fc6e3e8d6d7a8e4fad6174eceb9cfe5f90d725f977af2eb6bb6810f79a70593ca7c61c486f53a6b807bcea317fe8d4e698dd297a051be1a74999cf4c339279d4fa953a79f7d71d639ea74e9e71ea07352ca5646a5e4e8d00ed672df1cc77134d2196f73b6a6a8945c12a5d4b68db67fc7794feeeb567deeab747eaf06e3acaf0de873cf7da1d0a59ffc7a4424fe68e6faa0dd1ff4fa171b74ba2e18bab864634ff5e9caef0511dcb1bb4ff7f9385a29f6c4e432f674bdaf44a41a43babb3bd26ee4b89d1833d483e5176c2c7f3cf2a63edda37bbf74269dff94d66bfdb3fbe527bb186d92d660774f76f7492b95eeadca7dd2fdf3ae67a8c04c7df1d2650b162b531a948212a504eac80f79bda9871521041078ecd0d141831a3428fd820689a00c5919b262d9b362bcdd79c3bf99694c225de45b1b2c345762a8a6a494524a29a594524a294379a5f49f1ce52847ed0f48932447df3fca4f4180d81f2434f51021041078ec685076a7b331725e07baf7f46e7ba5fc29b33fd1c70fee6610ef8d530bbf5c4ecad596ab7bc17c7e2c502c4868c5d01051d117c3e882b6d1e76acbf5f179801082083dda06f4f19bda16fb1f6d135af1f183b46de8e3f353db883e3e0f699bec238b8f2e3ebef8f8303efe47efe3b354db661f9fa78058b674f1f245828f323e3e53b58d468b9f41abf14934bc8fe08c97e1157d081278b22211903c21598f23cf0a3545e0bd66907069f5f5a3e6c91940c0191f65cc90417b7e235a8c2f7e455f0d238b6051d12d1261e609c97a789e2d9a7dd1ac6806a36856347b51342b9ab9289a15cd5aac508285d714c12c2899d743c88e12224f84a09b540713a0b9353c0b626d7e9207e6cefff1962238df07b681bd165c2025682017ba7e6e01b558c49aec67997ce940573ea05d561001eed28fb2ca9f6dc05d7fae84b8e7d28f2392bcfd3fecd4ee345b56496a5303e401800928b0a164abe1d19e06c2357afe24251b0536003041b30c22933a26a5abeff55bb556ffd6ac25f09d5fe5fcc2a3cbf5ab2ad890dfb9e9e8ce11fcf9a8f561d3d19def5cc4baf5bba35929d6a55f9dacdcfa0e38baf41ba1d5fa70c7a57f745b4ad66bdc44ecacf56b55fa351d4d49d90405590b0404148bf9f8c82f080ffd40e7734a8eb6f4d8c3de61dfb57cdc7aa1530edbddb2a0c90fe701f93c07f4f90f4cc307ebfa3c0eb7301b83c9a72fb9fedadddcd7da957bfe9ee68465a1b6855688363ff96d935ffc69aaa68b34fa7a3aebecbce38664f15fe199b2f0147b2ff93f2bd8c824f43f1fd62321fe0843807525f5edc762b1eefe0c621842f5dab3a0099017f411c6412d2fecdbb5b2419f9fd8a0cfe368210c5efff3f1e3f0f7f164450d361dddee73c0d1757d23cce77eb27f6d7552fdf64a20c09e3d7aeed10d7778097cfb73c0d1e56f848a41fd92923c60f9e7d3da16d26c341ddddae0837dd436fac9a49715d1a46d2e858e56ce6b4ab572dc50d5026b8414dab8f106e84110e32635d8822dcdfb4144d2c134fa250fafc5cf8a6a50decac90f7ee01bfc8569801078b5fe0d648a6888886463361164305de32f7c83a718ce19d6224444ea0ff987db1f6fe8b1fc1dff0d3d16838814ce0f798a2f87b1214f319c5801d30f89601ac4cb405c090755c734777e48e411201ecd776f01f168f270992c623d2dd171cf588341c0ce1e3e7808cb8c350983c0f58fa09c9dcca2d3d17766667667eea77b910a96a347082baad8f8b1bbdb6f04db63b3f491dcee7102d1c58f3420310f908e317afeb53774c5c60f1baa6df1a31fcc3c60a6ee3f687d330f98a9c10e8815af6df1225e836ab02914bad199ead7525ee3b73184cde2d82454954441b5947fe467fe15556c7fd874428fba9c85c782196ccc6a97aa4374312a712ff35a9d958bb5725eebe9dd1fe5299dc6e792c870a683823bef4c478d90efbcbab01ab703c0fccd6f7e373dd7ed6247761f7aa537d341bfc6e5cb5ec8f3761ce78d9738ee0b2284897eb14e37a5b33f7bfca4586bad1f950e846b5859fe38e79c13cdbca22222c587b183e50fa9971b7fda6970c6396beb43fa533acdba91f29cb37e94ce47298d0dcef9352acdb7d16bb54e4ae9332d72a97429669d62289d540dc67751c6f20d4af1308d39db3199dcbf2042bc8d52e076392957bb208f32d519e4714c5dcbd54d97ab6bd5ee255b2d57e55e30af1dd6e7fb94404b2c22925154aad512b9128e9f5cac2072609a5b49926e46d9b3dd65db9805793b92b9fd49f1935c8982ac0b7480d0af48c54296f3d82aa6b8a41bbe8c5ce0aab9fe15ca2e3939779494eac288054649d0181aedfad1751b4237b420061114aebfacccf5ff6845248aeb5645c4442b2334ac00e74513474ec6558873dd7d8517ae3fcbac8dd93044132c35486498e34dce4c5dcdb0850a23c430b9cbdcd55cafba2eafbbbb0fb5111a9281242b159854cb19a97298b861cd13366160d842811eb89871220a3b58a8a250a11189648c3c81228825392c01b5a409244a4045d14413719454714aae6c58744abf40830ec0163756ede9b2a7861b2638214e7f3107fdb0cfa01ff64e37e4d860ebd5bd3ca7db7173aa271be4d8e01e1d2c206181273c54b920c5898897354b70d0b2660930696612467420061d862c11e58a0c0a187385062c70947499ba891045ca9233718218a24224b304c914726c28e365081825503e4860eda172e326e3c62a3d7bf46475004e126cc87cc1f3821411091782d0f3860916ab21261a4e72fb7f072e6ea2c6cc81c2654c9cc6d281cd963554f2485de1c01909c0d1b38207a67093813a39a48042981330d0c3130f767298624d1a20a29a70e3e508be9244892b55ec61c2c40c0d189e9871c24b9d1cd4e88083935372b516800a2368f0418c932b380065090155878815ec541d995795a353ca9c6cc0c1863d5e907ca0ea095368799669a1061922375ce9d2e58601a3eb8367e6d0c5a5cfd3e6c67632d7bf285610a59452c6b6648e3073fb9dca500d43553ce098a2d79e4c800e2865465df9cd5044c765e5860c74fd9bf93b5df719752b8862e50720cbcaa917d7bf16554402e2733397aa0f35b09a3c5bb9f0961545d87e968a32d3452e7f7b5fc0f2739e0b443b5fc407bee13c924dafebf444487861e687fc3afdbbf76ebf0c03367c294cfdeeeceedde979f723127f122ad8fe10ec7efbc3b46b5d0393997f0c8d61eeeeee39274d6e99547a4ddf75230ce637c2e40c61fbfdfee80be78bedf7f1c3a474ce3929e539bb7e8d4aadafd3c53d694be7a5a6633a29f9081ff2c0bc6db3ad63becfa51fab69777f2170e64faf2beac0535cbe5d99bfda56be35b6df5d7eff7494cb649243a72998faa53785f5281c4654935017596388ed9f534e496f13edd6065f4b5e1cd1aae14cbe776310379c71f4f9b66e389bcf97e8deb82dcfc9e5afd10397e9128fe641ca6849afe70f01cd77ef67ea20a24138b6dfea8e95fbe343e22fb333f7d5dbcfec1c3b4f8d22ac8d51ba0c14ac946ddbfd41afb4a00a8d2759ad2f18121bd63be7ec1fb257e85ccc59331116d69fb2d60ade56abf55e63be754e4a69e7deb1ecba97dd179b8dbbbb2c224977ebeeee37acaf6be7d706ed0d9deeab41779fb35629b95d7a741ff938babedc0b629801da69d7bf26f0d545f9cd5b91cc68c19ddc9740d62143d112454cd81891fa89a4b4838844e97394520e4783944e999c9fad310c950f6e63ed67e9609d4d1fdf0fc96a6477db8854bf93927b2993d51a265139679d2d59e78bfba8bf9c3a1aac9c94f5d65b0290fb6ab0e5bdd7eaed39651c83950789c80673fa10ba3fe695f5948884252333b3bcaf677e82abbbcff75783b4db05cacc9619f64d6eca555aeb944524fe99848529e5942848191b8eed0f6b977f080eb7fbe01bce7c269faf578b481af862fb59ba0fd7fd31ed9bc9fcccb345062ce52a37e9945f8e22393ca77713d681d39df90db9cb52c8ddf283c4c1877a68d1849535c89f909cd7c7ebcaaf09b418b49d974f60be1dbf243fbf6063fb65ec6f06923fef87c5f6f30c03bff2671ba47019851be3f4a5b747448a4f0401f1a32fa51ca594a3b6894bb1fd73fa74293bf2972ff9fd47dfa6d7651bb876b7773bbf7f330f9a897eec84cbb78d981f02777757db1d043fc728fbe5927e6d0447b918634cba3ffad2f05397afd7ca752d6504c1a4a4a5258e23c0d4e3f088632a5c7af9492b9353b6eae75d2725add231101293612dd8b0caac943f64105d47fb29ed29e5b4c558677e1c1af3021b9cf3b32f1ad86028e7d7f472d7d2c5251ba5b87ced94dfd57facc4ffd658ffa4db515e8b8c274ad13b586696ccfcf99857367777b770c2caea3daffc7cc82bdfe946588e1f7edbb76459202bcb79cee7c4f6cfef6adb22fb38b12c9d5bb2d71cfe91df935f41143b65d490172c2c30a92347e6a884d4608888362f6317ab757f19665c1f86b3d56a81d7e57245be94528ee3a4ac5e8bafd7cf1d718ae935e59d2925c7399d2f67b73ed3b95596b130cfa9a8a76348f45aad46a62c6c5f03afd5ff205976f4ff7c902cafaf0fdbf1f3b02f08e8b5da5f90d71744e6b5fa3e5f0ddd8b2c045fe1d2addfacf5f568b03e095eabb5ba97da6228eaaad54b83554635589fbc56ffe5d59fe1829ded787dffeba9da36fb20320d6128afd59fcd74c0fe83c804fb1200fb2ab08fa5bc56bfbe8be11b7cebcba8b679f1291b566c64926a528873c51499988b192d2ad8b1f2f4c41499e695d7aa7ba150d589396b121137380e3f437684e25499c2c56eb46ab2a652999161aa4009c5095343ab1b4be50e1a8b6dd98d564d84b841375a35d152c6460795166bb495b88ff12348bfe3105cada8e30d5602624d82cec4954ee2f43e88e0017e92b87299a2953c028709624d7eab822bad1057fe70fd19887e3522929cc05a2be74f777709e3e0e74e1a6bf45ddea493ced70738904f3d6205554a6e8aa5ba22365ee160274b75ad1b358a4e569414bdd1aa890d564e2ab4f9a1092758c26c00050c6e77a65c5551530394397594669cee464d1365d5440a77a35593175a4a645f545b707201393a4c3dedf0860c07dad0f1a2840a940b13865b0c20da54015506cd1ea80a9464d141cb9e2e4f545cbe4c384fae5c619eac71791e283ac5a6e54ceb2c98c4cd75a35513224160e12a9dd27b8aeb5a375a45e9a9024616ebfaf83a76f000e127ca5fda5cdf6c03d7cf777d4e57d6d74bb69eafcb13b2b67274ba38e897eff2fa4acf0619ecbd31f6ff26c978f5e362ce4c17ef4f6c70466ff4dac4407efe31a0eba253dbdd3ddf5dcaee6ee6cf76d3f9d99fe9b97b83eeb1bbbbbbbbbb6bb77bffecc05436c74de90c26fdcb38a54fe9dc735e392ec92ec95cde7bf6abf7df73fc956b45ffffffd6ec97194ae7337dd9b77db9bb33cb33b65f1ecaf739677b0f1d63a41c7333466f15ca505151515151f9f7cb6436262cc982255905936de3aa1e9630e181a362c544cb103676a3159318506042019716262d5059a2a73bc1fadc68b524abce195cad22a0e8095735a9f610c58505a90bf664254972d3f3428ea7292b244ebc90e30428174c0fcf28678c70c560fdc6aa33542e246c7763d5191f6a37569d512393b748c410af3297a9122853dc3016e667314c217395b42974a70577ce2548eeacc011535684923dd7bde63075a513c7f40699e51a93ba7c4218218c507367ea46c4e98518a42c0165a4033edc6192f34d193bdc101a0acbe1fc2ae286421440c28412d99697150c5dac28f074e54b580e69afd2c8ee6e67336868570ee04af916cacb952f3372a3d50b6eaea4e2caa9223e324692343726a57475eb774ff3d6a7cda1d1699bb4d3b6f959ae448b402d1d55c086f1d6f5c7162d4eac5518592c77238c2c56c2c862dd95ac78ad7eeceb932d121a417d32aff1ad62bd56ffc8880d7a8add62b7d88d888b0d95c4dcfa61a4cd695b5512d3b69fafaf64c595948ad450c98a95d62b1571a5d8d78ff1e5b6caac52915bc1d852922bd925ac51115a7d0058891544246e7d1a1d1a1e5712fa0a6514652475eb7f68f474eb1fe160632ff4a12d039fdb7db45b44aaefc3840dfa4cc8f2f326047dec577c26ac78a1e70ffad8ef08fa66afd847a69f6fc78a6ff6fa40a624afd517fa66dd9700ee639f095976c49ebe0941cf7d02e80bbdd06742ece947261c1d811e6bbb293db5adbf566b43dbedd68f7938bc563f21661e701ffb1ddcc7bee83be8fb0d8a8d3ddd786337afd5d853f78291c5521859ecbc31ca86b19b7d877dd04cb49b074194b51fd26efe2d6fe61f6d4e44aa2f83023f1fd26edf1076bef51c20848096ebdba0e5df0ce8e3f5f9101aac1fdd813c1d3ede8e2bd8ab73b568731aacb706ebd36eae5606fe331e0dd68f1784d8cd9568b758abef43bb85d5765f28737db1dbad456eeb0b2ded76691461fb95ae8072e87884a68f9f0384ae8f9992394c5df738c63d08299a1b6aea05668a0e4151d0b8a2bc199216f8acf88091c102302d45375a1df1001457a0b043375a1d9123bb82d29a49b47005c78932354819c207248cec8025cf1c36420c61c17043411b304d58add04399233c3552b2a0dcba0c21654305826cb0d262b609c09a2a7c70a3e776054f950bfccc80a7fad390162ca431020d0b56724ec09345050b49707083849b27920049214d36b41ca0a0323587035d88683263860631575d6480a24a13af2a7758cc3511b899c2cb9e2c501cf1668c153932e46101c64a9d203730d80b4c152288980a288e6891adb8d3f26a5f5647667041565b5f16ca93d72aa7c7c26eb43a52811b264971c4c8912328dc3089ce602b155b5ab33a53f38eccea8905244cb0f6b4c0a4c81d234da6e8206952848d0b4bbcb48c8c0b51535154515636ab73e3b658b51005a5c1ba6eb46aa10e77c6aeb8d1aa0534b33a31c618a574eff923449fed5ead5799bb7062f9a5f46777311d8e399b3efd6aa562659c93f22fe1086cf936870edb612c12bcd62ec6a7f80b7be9b2054b18d1c436f116e7443b312b4a11f1c43cfcc443b8081fe9d006ed7a91bfac92d18771aaf6fe85313c9995c1c69035e824780824fc0012c49dac80c063878e0e34b8e0e270fae2e445881d2159333e142285903c4e4f4e439c8a381d71825af1a19392a10f9da294647ce804c569ca75f09f59c8ed7a4f11024588d475a3af3d7fa1902b9085dc84cc111275fdeb226c83cfb34d9c75637c322a5955a0223bbbbb7bdfee7d84e5f8beeb22b33b4fc9ffbc12f84ae955011f47c300c2c6efaa3c51e5613ccdb69e4b48a6623a6debdb56a6ac6a18327443ce0a394f3fb177fe3ed7997d8b77691bb76d263dd87598cfbf880e80a3815e7aaecbecc55e7aadcbb4678ff6d2ab97d973f1d2e32eb32763f6845e7af3327b967f5eca59118cb7f816f62d5bf83bc9c199cfc3ae0fd1bbf7ba43ef5ee79eeb461807eeb5ae74f17e80d9cbde3d7a859c039e7a7aba3f0fe3a2c7d1ef4181ade4d242a69a9a63a724689bcff7fb94b6c99ec5f7fb111ff2424cdb6048d136d717fdec5b7c1b3d8df7be90afbcf72fb6986e346d23fafebebfdbc478ce4e56dbb05c49c6f7f754db84bebfc1b46dc5f7d08f559a2181babfbfb4cdc52d826fda1772d411d58749525c8c9ae7d19815b9bad4175e6c908a85ccc7a373fd259851b1a190dbf53e8c5448de9117810781e7c28b79b141a0195eec9afd191292e17d5e6c90c88b0d829e7fa110a8eb7da1fc26cebaeecfc273299fe2e3b915cfb1349db6d3592d4591d778665ee769e1f953e7f99097e745fc48830ee5b5ee4e6a342da66b4dd560bc9eea2feda5bb0061e9295d93f21a8ad74aba06c5623cbeea270f4d1e29de8e6ccee536d48bf7456472e1f52df2f8ce3cbe2d3cbe2cbcbe32af2fd18a182f50649ae145a6be308fefcb8b736ee7d1ebf2e66d79d58b1d70b2c4d3e5bc4806ea1a799f7441b78c0cfad2cfbb417e558c3ec272187d4c15d6cad42fe32cf6a9988aa9fc2a462361d9cb5ebd9d7c51d960ec2ad7cd71e498f90ab7cb595fc4b1fc5d5fceb56ab7a6ab7bc17c7e2c10500c284868c510918c458b59918b1730def3fabbef15fbfb62d08c64cc006b1044f08a5e38efd12b7a9d04485c0c3618003d81d790499306f78ab018257077772477773f6a45e082a09bf13282d17cbe1fcf3ed0a413468c4ef717412e848a56cc865810c964442c865aac98091505b988bd80f11ecc7bc162a8dfab85958d97e3ebeb62b468d5889341674c50d61c828e808f5eeeee1e913eef7f90908a7842e5dd4260ce8e741401b743c041647fdc0e4612ec1166ba9bbb23337fb4189ff7305eb8e020b228926067b746126c0b1632a2a11542413120fbe37355a673b52a47a7f4ee6fe796cf42cf8ccbc636a0ab6d9315880c97de4db0178e76a70ee92802086e4d823e468cd165498bf1790fe3850b59646757da162c6444432b84826240f6c787c808a2ced5ba95a3f34aef29e50f9204471140500367c830a2c54042fa90bc4782f1c245d1ac050b1912d1d00aa1a0189045424272b52878210d5851b921499822766e4f70f43cc1c1e202e70b97068e0cf40638465c4bdedc89f2e68d9c3742b470b0b41babde44717d7973048c957163951b265a49dcfcc03d61bd1babdcc430ddd8193756b5b963449b3434ab0d0f68da486d6963c455874d16f7c5823756b1a16a99619365036ca0e8149645075a606c0b37ae276c511015c99a2c6fd6249961acd08d556aaaf8809a263a3716e9c62a353e6cb9a1caa0a609173bbbb10a4b8f182bbbb10a8b0931d6c58d555855f78695e586550b561445c206dd5885a5428b083bf4840a69e0d02f16e8c6aa3464ba232c8b1babd2eca0c416dd5895a64947c4c2b8b12a092a26b8b12a8e98ea03dba5fa04ab4380386108879765a41bbeb0a6e8995283b5d6c907275e80210a17272a1011a9eedc70268a17a69ea881c93f3acff95285bbbbf44ea25f4d0018b77b862cb76948e176d390e4360d19980189d113475652da4cf08274973c018e26bd7b06a6a65adecf7f5f2225c97763d51154a4c8bbd481cbdc57cc9d0be08c8dfbe3514c44736bb8f3119ee20485249c60399173fdff8905ae3ff8248aeb9f048588ebbf8463c9f5d780caf5d7b1c3f5e71102d6f5ef118313d79f042ed71f8812d79f9f8a4461024a061ea25eb8fe2c255587270db10bb0bc30d1e6c8153b57325870c2849b254eccd061f229678a8c4fac32e6e838c51e21ba2461a108180d3085f6c69b0e4dacd1f2440b95104c530921bc00c56bad9c2ed2569cf9a099da4bf57478cdbf7e90d9df9a7590597f330fe6d7df313fc87bcd3f881393135374f9014524973151ea1ff0df3c4c65aaaed42f0babfd75de80fe83c804f4e101fa2a40dfcc9ab75bbf35f078b413d3eb3bf6c29e0a9c32a814eeb724ad84684c101008200073150020180c0a0604029148301e07ab2a1f14800d637c42766234134b23418ea3208882188661180631c418628c210c292891556adb5debc62be24c8b22c941c640f71d4f5ff11289222290843657cbdbb4db4273aa100b5eedf0b70ba4f582f4990b1ccf90b1360a48ac37cd72a036030d738a0530abcad1a5be8e8a8dba8797d3ed12a17062ffd99496f3981cde2a8f782107a7e52217d76fe16432743eaf44ae77749a1bf135225b6d8e9c7defad6aff08ae3a52df0d9f7a806c93f062014a369c7d16d00d1f9ac195f2cba09c0fab9abac3459b635cae705443937e446a5fb862d8343da7cf2f1dd1444a580599fff029a29f69178066f2379a038933ad67bd4868e3d5af00f8dc7942104d5c219a6187688af9cdb49f36330bd5cc854c689a9bae5202c22834bf2c9e29f3d799d213f327a732973238d37fda664a77355351c832cd6f3333c5bac30e51d26536f3bc7cc37e7b45c11d4fa7f5dbfccbe4956b0a3015fab738ec8be84e9353f01a226e858f490e12ef57e6a3d94c381805b6a3f97b6b1aab52e7f36ebbcd9947749516157222684bab84a151364d587d8d98de0ad21a7166f29bbbbb8ac45a79c8d1a4e45eb3c6e9c034627d74c0c64d3c571693e9ceba98c6da01fbd4f2ddf0ab02bd71c856c3641760eea08702bb3508a0da6c6faa3a2cb005cb5988b86aeacd7b8da7989a99af484cb17ec96c6114b10641ccf1e9982776e6e0aa7a478a5efedd35833c48201565fa80fac66635595b8de80596fd0de48a536e27dec880ada6fdfce344df6e682055ee9b467e820eb038c99194b19eee6dac131d39ae5dd1c25e984ab03563c3e5541321905c28853392d9639de21f6ec9e7c3214a925543c1b8d10acd93c43ddeb71a511ece8cd8cb2244f44867a1acc52c0c26229b4204e4ec097b425cad3795262199b5ef2ccccff89ad3c44614dd0809fdfb80a53a4ee1a823f29e0d552a232795e0cd05f1806370a6bb8a41a40cdac02c15895d1c560d12474f35bc66cfc4a10119995517ce103e47826c7f0828006d8f728b2b7eb9a99026e24a909c0b9d5b6e6e3c46d3edb388583aca4a2080164f9faadd5ed4222b4c5509f6ddb75101a6cf33b88b441cc6b03e378935503db6a50f92bfbc6865d09f0bbd4d8a69733a088e0bad8cb47005a00c095410e799a5eaceb97c71075bb5f64f5ed0571652c55a84fe0470f808b3651845b7cdb61d133c606450d37101548e6b05cf353754715c12a6d193358d7a29e0122f339a55b3a4829288b041b2cbad5684f103ad1429290c136d824897d9f859ae3e29c489475e93231c2acb508bb877ce67e2cc433045432311f0e5ed45d2420924fd41862d2c49da2635555aad4130af413d5ad17c3b54ced0703f1a9a93887dc9fc20f117254c670898ee38f6d7421e4f7df026b686fa41417d5729925e7a23ab1f6d8ca2a72cfab97d3ab4832e6f23173b9843f86dd2bcd41c7cbfb1e53c4e76698cc51a858577092aa9783fe140fdc45385dbc30c3348bd5d9eb99d2ac9d0f65c3a5ee1ed309b41658ef1306f084bd253ee35110adb764bcba5ed919f3fb4a3ab467995849f2950b9e1768281455c37a32b2b621085cd6e207be0bd40ed00153616b2a84831610aada568e7986dd632591c7651d063743e66bfd66d7be8be392ccdfaa7847aa486b00fc92060b6fd0b224418f44dc8cca9f78a707e7cba29c9db5038777674f8ac339acd1cd8dbd054966de7f1acd01f684314a16a23001412e2247eab7ee19f27817fc9b628ebfb54a4c951f4e13ecf995c74b2af2f7031fa5d053f4ffee3f514f5731fee30a915e126bf58c5da76292fc3d149502225a03e0f4d4a00f8809362e073a30ff844eb324e4c526eb06304a1324a4f677a02c7a4c573c1033b7fc536aa3eebc5cb440cc9e498c99ffd3a9894985a0d65006e2cc8c9464107b8ab3a30315a23ce44ff0519bf08d77a0ccb87dfbf41e8947f738104c4161404fd1205a37f6a8dd1055a994c72f75ab21024f40e4c69b4ecb7bdd7a2626f9649ac3f0716600ef870774883cd1decb81e5fd3a6b5d798686fbaf9b34a46b065c1f50cc12fb0521e802f05789c2356b688d97e4e4d4a39c64d800fac5acea72acf441e287a64b64ec7ad4955940c797bb50d8a5a3d097cea6bd8c9dd0933c4ef4132cdeae6748f65725a84a22b37e1c9bb770129e926c8b9d2c5ae9ce409dd7bbb7d094eb5beaa995e64f0282fd5c551598efa7be3adea2891185ba1a06cf96ba635d5ca1b2c5d2dafe01d3d1f69687de9e5bc8af8ca0a3e8b6ce1f314c2d8e2969c34afb6132733bc179d748f817686b1b782b5cd122bf9eecf810f3a1966dfa81c266a01cfaf250b1155b336cd12fc1c2e54d004347d912a25027d23d97cae3cd1aae8d463ffa58e997c18d31193858407266e849bbd07f2daca711a05b551fab0798fbd1a08c7cf5d28451128d196445a01bd58c4cab18efa11ddc8fb7205641b3b50e47cc1494330d4be17134e5ac181291ad7202d8e73fd392bbe34a3726a3f8423f928e7550bce91b52fa0c589a1607ccf9562cb3928eda83c5cddc09024288ad38d319dde1736b9f78c0f50129c0c3c26ffa4da0de5bc1e1b599484ba378c633b4874572ec5d69077aace6bbf3651c20a28e847cae7c94987f11db164f983ce86d3140c0de027b547fe6615c41ea0cb8d289df731a2977253aec672acc38e6e6545591bd7b11cc3d17af89bb220c6eb8a7943181fc53fc48c638cf1939d7027e3593999f3496aefe0e94709642cb5c95b2643bd37d6b91d64642b0fea6adc8e75a8c8a5dc54bba11cd663238b2bbf1fb22a670e371827c52e53a7ffdba92c4445b3f570b64aced6929d45ac6e6a0e599aee13a3d1ae5e04c235364e0c9af822db2935e6708f08d4d080d5d8602240b24cbafca46254e9525d0e2360fa8ddda071318ad685b6852a8aef5470199cee0cddeec59e32cc5730ecde88bc713040b6348d18a5026d4872c753eb2d7aed6f8081944dab5782042c01eab807e2963d0282cd7fa49277b4640c25bb3bddfab9cf4e5dceb5b5907942d365606e7e6225f2c57ae023e5f556fc14161f4467c902930dd2443749836a260dfacdc2f1e68440b1905b3df3d3092d57a2ab0efd4123074a1b91f044f43cdf61d484fc14d3c6b7504442441309114520c43491122823d27216ee7eebc93e99a227e41499509364424fc82495935d74546e9dd566cbe74e0f8b8b1fcffcf889b46be343fc86c911350a72fc1c907a72403ba564c172f46dd3890e81b0db4f10d5039f950f48cc1c361cb33bbfef6f8b2f596516f0489695696334b967c2949127007aa4d48aa237904d458f3342663f310475a33fad51c7281b0e4609cedfa02dfcaaf60d0c0c7255cc81d991672ba352dc624d5b4b623fc18926a4cf3731a6dc5c50252d693eb68f17f4699dbb08fccf3ba1a2fe7a99bb1ae221decc37e45c6a7248597e8e0ae443816b2cbae2c468d84a245deef4b2a4b4f1bb1376c01e0d048216493f6a5ec169e945b4b3db581d5f31febf4b1eccd70cf4f3a076feef09446426d07c7ec47b716c95e294f2fede3fbd33a29e02e9a01ab41663b549b12929a23353c66a5cd3b18d48c15384e6946b695b7aba5ca519e3803335d67fac67f06e38643dc00fe48a111e719955c77a1c23f77361412cab58622d3f3170f6d774437b8c80851141266dfb6756f8ae338ba7e76679cf37d844cfaf7e6299ee0c85fc1fa7130214441f8f900f84c37353afea3eb10cc60984d355a42ce1a4d4f849d200ac4053584d56366360ffb537cc66ed18376aac082d0bbc8eb9b4321e1a51270eb0a3b1230f32fdaa8f93777ae74332294d3d00fa3f3264b498ae53160ee822075457f02d1c21ff8919e82b058cf290cad19ec248e5e1e64e29e56dcd25d773cdfd6f68fc6972585a5f34c194478dc1a6660860279ca207e59950c7685e0b16836fc5895f9c7265e5b53a869aa102798aeedfaaaf1c5601d1f4749b047a46ede23f20803c6b2cb7a8d26ca74de60c616b733e341c579772c3ba9317a8b7bb806f3f2a242873a24f355dbb10fca2f2436f205b06df865aa0837f7fbe8c86038e1273ab14de9778a1649e8411e558dbd60bac50a6f744ad8c3937b1627a3cba9a3c34d546058bb743f1fab4dd90169a4d527d860c1e9f240e8322055ad8627a16506d541ce33081f0e4aeca87592aedf46f717a5f6a914ed1212672a56501a98080ed19077fdc96335c3f197860045a7ec429b1fe34e8ca3794ba2cd322c827f8fe83551213a2c346bd81cd53e58c21d5a5f1507df49a9235064144476a6ca92919c832f5eb70549485271c64962166359117eb4f71db54acde7a07cd9adf612e0e4643829dd7bb267ed5d8992c50a77e03012a4b8aeaea6b948eeba400134089f93f97836ea5242e97e89356c303c15995416913db2e7ee07138b6172d9de4565ba656c926bbfa89998364be49fefbc44f127a507dbbb99b08feef92cc9d952704678975e020cc70294cf747deec21436629532c7ff21891f12b9ec90525fcb448a4724a2045d965219101701c472421ea4ff8cd222923de06229ff9fc9abd8df232fe9a031c64da654268d6a8d463f1cf51d761249d100926d8b2d2ad390cb68874b9fcfbc35fea689d180268082184b51be58441cb297b54f3ab83135a3864604c4785f959263ab9e7ee584ae8356aa351564fb2289b904caa2a54e81bd51af6c6afcaa69f34838effc6686d61acf8ea304b483814e30a76b3ffc05d7f4f7b94e3b718c00b175d7098d91540c65fa56b45160d9bc95df16acae02476c65983d2d477c48f503c803f5ccc9f0d7d573867ff45bd6a38c93a4b8da4ee03897f750c3fbe7d6cdec6f0f6c90eae915fb21b85dfadd1d0e74fc2ff09034b6fd2e39b91928ec51407cd1bff318a86988d01caca55d7c2a3b07c837f934ec22fdb1e7da5fe435a654956d928a47089bc59f610b5d254fcd645689c11e9b5f62c7e6a48b8d4447ec9b2ce016c2eeba572fb770e9f904330fd2e2f0211fb826ecc4a4be3493f4cc6740e653a2753fdb3370d63b1eaea8e81d6217799ac4e2362674a7c2cb4534eeec01af6f955ebf736acdd7b92395a7bd475137490fd21d110350e7858afab4de5b0bcc3684e09e7b6c1571890f842020955b3307086b0c82a55af8dd4a168a6e8655c70ab89898d0b9c04dbf7b4839f5070f6104fb9bfeeee2ea86fc1d22164b9b8c18bc2bb04dab64628e2d96fd7de26dde08aaddf80ce61213256275e3549a046f31062fb42a6149d09bddf77a7ccaecd89b84c21d55c32990a421d58fb8d53ac2432220af11543afac65e970a6bb8116288fe262ea514165366c73d72d6b44934e903133a20b5044052a2392d7d32c597aae5061a8bd3553ef38aef39107e104ed8bc23e1a2964c5ae0a78b92f04d4762714355a393535dc24be13e313dcf4fa2cdd85c2cae754b55a62b76b089bbb80c21e6988b627690db76cd6d2911d118701e9ec9121c2e46b32e84328d6e496a02793a0986f5469a584d954af851765924c66ac4bb6009b46239aeb415cbdec0ec0e991b085d0a31804a48403d09592e50f6160e494c37ade417da4aaf9102fa75371ed6f050beac56ac466d7c92454ff415f4e75885511f7c450d85ffa1f8183d8f1502cceb6d3e8087ea75566e79382a07e6f60d0f38b8cf03bf164a00cf8a842398fabb183588ec42299d10f4d4c2014f7959157643708cb6e0ac95f91314b9d97290a3e132bae06a434177996080a02be18e0ee9cb176ba317452463edaa40642c534d312ae77b7810aacfe427364fc7148d2085f5bbbda20bd56de65efb60d8219ac24298df7bcc8703a66dd7c54f40efa425b93d07df9b68e2979ba908a9676517f690b802ff2586d33d1b2d9b149a284953da8ca3f486375abe99ffaaa85998efa3603b2d7d325a5f5328536626d09051b2ee1e0100b213bbf20a6ac7638d3f8c597cf8e3eaebc7d650b540e8d2a9ccbcdbe03dced458294ef35a84982ae15cd9b5b83ce80ece0afe0d5aec3b9b7dbe9ad271a820fbafac43405a8d755e3573b9492042d35a247525d80fea5c54618293789f110dee15faee79834191584df5695e27a2548bc44ce998e214496296ca0b66f203a6a1b5189f38ae9f3242157ab616376dd67b7fb510115e8669fc20049f1b09cca53056fbfb61fa8b101ace99442fc4063ed7fa0593a1902604af9192120eaa62e0e45000b257d289cb3043882a11a9b725ce7f5096be25cbd1f9e685a2634d43449fd784bd281d550e9aa0d4e8a964414c0c7508b980a45146cf016512821542d505424dc0d858997705e584277cf6095c68c2810588b11c5cfd01997cc643f16dd7559e7ac433f3afef2ce9df7f41a7f89bf2f1f26a8599d821572016b0b91443c23f970a722a5c5d2b357aa97880541aa67d2c13cf970a017adea5b80b81f4206237c1071c0da2b9080093ec458d4097c48ff2a107d9ffc3e6221dd62a793c8d30b19cb0222c195755eb6d4e0f29655cc5bda192b9af8c37d50d6c1ffca742a9958cd68aebdcf7e8d6e9075ba9815e8ce2b3e9217ff4280ede3057f8b6996ed77afb52756de080c820b68cac103febb93a01b2875bfb80c04a023d39ca930b473c7ae5a1e19a35b32204679906442c60c3ccde9fbcacbf87c96a9d0616fd11adf7f453618956b52ed3d387fc040505d6255a6c7794cf8042ed77140a2741e97202e5774a84463b69f71d45ef3d9766c719d7f1f8bec4b40174623ecea164d9cabbc6a24a7807ff37086a9640ccd590a72516fa7db04faadda72b755f26ae8d34f8b1afbccfb4f074899d86b4945b257cdd36faf11d1f0a07d348c2105274d45a907ea3334fbf827a831f0af71d51efa4aed1a0789b9eb49dc8529bf99da5c4843640f0ae3ca16e716fc567dde93b8671e4197bb1a99dd3f01629ed8da81010ec21d018a8e97699b20a249d7fce70c24875a965ef2c6453953422d74e948f0b7616e2d33ba24c8eb374bdf4c67e7f16923baa276ce19bbaa9f640bab42e1ee20fb75ce897b944800b3db14bc232f628289a97bdb2799cbb484f7496b87503e70610b56870fdf4cdd65bdbf83bb358cd5139c9f4a71b89a6e022a23a8b8c29ccfd07ac9515a22f244b11b114a5aa24915ce57904d25950dee3d0d5e9425ab9242b9a2534a02646376dd11e6635d5efa1608b00df4b2885b5bd46004797527e151c128399e93b0886f0d5a6725f1ebca0fbc6b15e5264f6b77cd9dde4157be80dabc67636c9250f091a9da67d687bb9f89d2e97a6558f6aa25f25a2452ef26fde69839853f0aa42c281cfd4b48cb962a871ca50bf307b911322097ed1c721d79af1dde4be8b90c46805c467e776c63390cad732fb78a3c054704ba71e82d3a29b66ff04d21cd09c960f29c74d5f8ad0eea129708332548b2be3f41b8e106b47085cc383068fa5002d20814d706f6880f78810e7ae4243023830249303bceb18f4cf31ac2182b45d2ec6a592a982dd32f70b8723c23953589db1b97a08d0159e96d576722c118e517830ff91bbd311e7a747e828942116abd33a6668139700a639064ff06d16d97527217fabccbf0997a205bfcb22550f02162068bf8c5d6d057f642bd83a2898d5089fe89a288495dfe8423c2dc4b449fe4931f01691f340a69e30b5ce67e3be422be959db137f6dc09140f7dd92425274f8ce02dcd57027f7f8d1c11414842dc16bb8f25db12fa57aa2e78cdb14ce3c87ec2badeb084670dfa0b76de64833892973e5949de787a74acc1fa17b75da3c5483422a1f21e455fa460b4ae18a89a16f1d428700e4b0c09076b6968eeedad5d4ba26511e029314ca8c510878f76d3dfd62003d652a128e99196534dc80f6c176d1134e1e5e5b34cdb0111823b15dfff1729659513d650f9b4b4ed9937f23b9039f98451a8a7252a360d4ac9c9a6bc0a8d1530c0ca664f51448e6ed85b274122d50fb1a05792109e226120340cfe82b05b5696d63156010134981d21115f00378522a4c14817628608d6bf6d6e993ad24fd334a589ce1b1f0f2ebeae8d5c9922813100eb2d66715899caa2e6599e4122333c5256aaa0c519e9c227bb62d915fa04873afce45b8799e7791ed93a682ef132782c9c5dbc2d4c32ec7cfc2dab044a4ca0a1bcb69238a1dee661afb64e7e5d5aa5017d6d217176f2e3f6fd0ac50d0947b2091732dc1cb9762d7ab28f189bc37ae49ad6bc778cb0a9ccc16b174d5c18eaed6e16f1e8917d38070ccfc0af711a8a55852cdbdd4a6379912ca0df795009d81decacb4d01e9358b5dd412d57c329df0bc77418f89f7b257d52ad247099c89fd09d64bd2eb76802750b1ad710059cf19dfbde54db30131543a3a25ab57062863e85b33339dfbca1d47cd6eff1e3321f945c310ed412917ff7aa72a4dfff3a831552e9a4a99c56dd0d1054ed74c214759043be8192f3b7cac0cab410017264020db2b468e08092a99fa87cb1f843b1bc5bd736a1cf0bee8e55d8f92a68cb93b947f02dc62523d63a28a116476de9c22703dac51dccfe79258dc8c983ee112af373a9b5c83c1ead6f1aa727fd0c0005fa79f606a71bc9a1bd2ba15f35a33496471dbb2b31c5f8d9edab9288a5e61aa4c94c048b1cd6b217d1e44466ba58753b1e6279cfa2006c0467229b2d8a755bd4c55603c9afa208460e0f381637dbc0dad188f36b0f4e08fa82a3ffd36dbf014cf89dfe1964319660fd96e4e277b0ae3174694ee4b983350c992eb47aee363fcf1d80797e6e6f8a025795a2228d19fd2b7b56fc3e878cd888de5f9c2a834297f0459e1545e8601ae5be4a2cd942bb97fa41d8553eaac3e21e4b5903bc162123567c38ba0405d1b5631cfbb30b9d829f923c2c4bb1681eb25a3caeca1664ede3149256007a73f14352b8d20863b25b8b45bbc9777200095a533ef2ace720922e056a6f2204bbddba45162c4f3a2fc7e54283aeb43f7781d9ea93cb6b8e27dd9ca3865428c2fff1b02950665bdb78c85b0065322cbf4c5f9ad1326c0acaf6f842e48891cb29f1c86aba54db9fc8e56cccecc819d74fbddf428d0614dd02612aacc2c631c880efcced88040f857ef515e0150da0f6d86113f4c67965477b0ef8aa3d7451a41c931cba40a737e2ef2cd82d407ced10fe82ee3c8494da0af352b9e63432195294f0240bec14b90a754c4504345ed34ed50942e6fb0d8a8b8401956a5f72910ca223384ad87ba011f485c7ca7d6d92e43f1c5eba3e196a692a3b5ca0796ae4f2f2a16dd94a5049008b75e7e22d2424d9d937de22b285dfeabd4da8f13741331e2c0b763e5926ac480888756bb3e0170e24fc3a56bd7ae933d2fddb0353897d17574c47113ccb036cb39d7f9e022aaeb383f27e2e39a346e07b246ee20c69abfcefe9c4d79e1132c7331e0a5fca2e29dacc898436588ef684e3af6259cc7082940c5f3cb999a7d19ac92b44db7f68a8ff394bc4f1d1f0f58890ce6f0c1032da8f915b570d3e61e9264ae57a4a26f517b15206940d8a8f69ce832d3c7078590de8e2bd00a0482b1fa6bf317985f4d31cd1ead4ed74c19c93db21ae36ffa6b3b44b14b02ff1da582472f5b508ca2c7c6f584e117aad2bb4ede136842a48a5e8bb7873d0b7db413ec43a9b5b5545c6e7fe987bf2c4d438d3aa02d5bb8ebad141f34e6e6f33bff7c307088c9de4ca2431d70efe3635b3f51d32018c9cb0c1b32daf8ab465a3e3a225d1acd5989836d5a8feb75c7efbc157ab44d5c38a75e1e10cf4a40b12af1a07830d4438a593aca557013c0edb07cce8978b09cadd0aaa70490d59db3475f558e7c42a2e496d6c2ad0f109fdd4d27c30dc56153965fac17414ca7d41961acc2b09dde8aca95e9b682bf87783ad36cda2353729692364a2f7db996e908a1baecbb1025c96b37182ab14d4d2f7ca61eaa39611b82fc57c60bfc55b7d97d413257a4767c77119e93c8636c578558b177cb9eb0d49bdfc7e675f4475fa593ca0f7cab334870a5b89c0ee87c088dff1b8b9e271d0d6ef5dd74af3381c8af635fc4fa550dbbebb45d9e5a7216a86f3a33652c3ae295129acfd691a3492e7df8cf3051baa1639ee8448b52d14dee56209a0d6a4be9e9d673def76702b27f06486a7c4efabdd77007d876d94f91a21a9f4893c9c835c9f22b65356191e5dd461853f52383c1608e56f490af2677a0d339f06dd88227199e80ac84fdf51e82b1aa09d483c134a3316bc7b9b4d10e64b473679a6344e41acec55a4e94e1baffea5663de9f1d0bf8031735294d6d1f72b517720da7248ad11f0d8cfc1ae4cd2043953efec2768bebc60f129c83a73c5f6af60302b97f47e413f8e9ed0eb950f087a72077cc6cf27a7d6b0682f99a9ba8f51bf68f3353e849b74f922428520770140f58d9879b0fdecc5aacc36f0a140f223807e5f323f1f91b75a913cf2c23258fca230af1bcbeface82c88fc29d3629504c5e639dbde4ac3883d9cd52a847ffdb5f59e15806825872f2a998c51367f8033af2733b6f53e022ad37f57a3781468f2dfbfa6a90480e6ef734d5741002dfef752d04f5003b0e5ea31a15ba19a358f52f715d38b2d57dd379f2bdcd68d4b31f651ed571f0cd764925982bd7417435c7aec98f6834c9d2cd486b8baebcf90ad0a6a96a253ee76eb8442cf0c4d02f834576d177f2dfa1c962fb26be29ae5e0f4878b4db490182a50d6e00aed8b2589634ff4a832040d439a0874cab47c8e078fa4781033f565c7513024c6485c98843378ff194fb1d4d07f47525887479a234241ef2975f20bd1b6007d720b3b9aa858d620a642046035800cf7461faae720e1904526e9c9e8a20bb54ed0d66a53f2859e3d2797fdc7fc2e672fb75358e54a5819b3315681d98c9c93a0de7a7821846dde0df524cd088b3714e6e5f9182573601df9ce79c2fd5cd0549df8478e4f58819636fbba03d98264f2425faeb78ec4fcee8d17d4af8ad5b08bf818d1e2818b01f911798f1a5cfe7d486c4b5cd3bd8758ef3bb46e4e30fd275ef093c289ce7d044b49bf154fe0a015d43447a75c9844777dcbc7a33233da6093ebc2ac2d06ad5573b5d904a29a1912c2b2526e5f0cb0cfd81a70d4383f63e278b0a0de78c79958f082ec58ea41a3e1782cd90683bbb960c2b067bf70e879dc760bf904188a206b1aeb1b885e4aed0aac3b8f4d51f0e3d2163bbed2fa285d546c2a2afc1ac1c7988ed81eb20c25cc6be5ac1a4f4bba10d4bbe86fbca268de52cf968dfba9b6aa5dace23ed3eed60cade533251de12fb33348e8c82b50697b4540baf6b6521d9f3c4f7e1bd68b3e9700e2be49589f597a2486800c8ba86d51fc72429f652f221fb68fbcd49975e85172b1d4558014b60fe32e32247c9f5a1da5824aa2bc7b00a54270dbff28b6925ca497e5aae4aef173d4585eeee7ba8c9204ef4394e9c3fda724eebfbff02df1bb5f090fb98246f8191659732ea9e00c103152b8ed7d568937e2e80489481e7884b6efbc085a80620b4d0e5d47a8e50730c2fd9ab6a30eba4b5fa54b9828e1c82c2d7b947b022c79f87706fea9f351af58a19ccfcb51318723cf5fa0c4a209e25e8ba81c26365dab0e5e2c31002d2566007ed18f5f43b5232f23a7cf28345843defee56509ac4348e92aee8040d9d5160bf3b5d84ce6884147cb25b86c6b3f9643cb3d986a7f6872edf912258f1f72535f90cb5e876cbfe963f095424fde4622515b3a1b4bda62d0ade043ee76a97edb44c802f284ad86b98f286010d030cdd6c2cf37024e7a1821dec037e2cf33a9b423f8ae1e73700fe9f024e267a25d468600e5159b90a08c4df9847899ba208d9347ee29f4f5869733c24acdc0da25155df253a86cd39e8781e4e914f0cebb4d71a72b768a84f23870df3595a3a24bb650d1bdf0fb2e0e502ec9b1e80645886f3e8e3d16478bca866fcf1d2ed25a472f3a3f351e211014042450adb6f70269762b3f8812c5d5bd88180cd1a7d2c0584afaa0e666ee17ba1120aa4876262b78bda2d9c7c473f1809129506f406da1b3d1fbffddb1df9353844a4f67f35be96d74899d0f130dbb74cae761f9f794efa388b31afab185d12343c5b3a8b2c298700af25aa449aae5bc0cecdd0a5b889072e81fd59bbd4de37569b43dc62573ece4d97d756fc8b155fe5b477bf6f0e8975c9682798141b68af5412cc509b73dae4ee3d07541dfb8864e5b50eac3f437505e51547a58eb0beec11029ee565cf0000a624ada5f6122d3c3347c07da9ca1e708e881aa2b1f7a9be77a45181d6d5141f03e6e780ac3ea8b0bf1fc32bc5f5d7b3be6c1a66c402bc690082168067b422bdaf9b8040ca205dd65a5a387d351aa88675a05912245cb51a0e204ab280b853bbace330d2fc967099be0fce8e15162feb3cb61057c0703244431f9e4ffbce0ab63cb4919fcf614b227f81017999cf90ee660b2b85ca6c05099c2d35ceac26a3067e0e2d7fa601c801fde6653979902a53b01f7618206f9b72d035176755d575b811ae6f461af08a2cc13bed3aa1ae280a253b707da9decbac24041c95503f3681fd1bcb8a808053a0ad483b6f9ecf50a39e59ecf6120afdee58cdb880aa3468acac968227051a8ae6a867b0a3f05b41f1f343d57d01dd00f17b973cab4104e1257b3dce857a7a61352558b1d723554904607f6f111fc84b7c1215a1d59f42c56914d3576443908d7db98f4fac25ae3c32160f4de4dcd87c17908fe1b22c692b3bab8128d4f6f32b63ff630646151f402f4f5e837a77de939bae6f55b511e1e2e919cd308eb96c0bae738ea9ff9dec5f3cf759367287ea2e03f79befe62a9c8fde9c8a8ae0c81176a35f5ff036a46beff6201deabe345d5031b162af52efc4f0ff91c309a336e0b3c302a9808233e68212f9acb140a48b2c2f73a7571788595f32a94f3fb570c6f7eddf9381647fdbb79da362c831e55dbaac3b1b1fb111847067a2686a282ac66dad1ee5159ca2697b01df76618b8f25fccf758e0e3aa03503dac3ceafaa20451942b3b81b86e72bc1092ab856628ba6aa85e8cb453329a4eea2360c4bdfcd4f9f4c72ecfaefabfe3f6b598f8694f876316fa5da704c604566f80d8f9d89997c65c4319df205a9ac5567f1f4e92a6b8c44c7d4f41c53f4bfb7214148b0a2ae449f630b9872da677880e8bbde9591f67c2b1cec404f2c4a7926e90bcad181409fd16d539da1e5fa4c2d94299f5aae18c559cc5872c557a5470d54f56f556e397a4570c9f6af2edad9563eab27cf19583b6fd1333f3e76b011514bfa87c456b52dadda28e185fe0d792a4c7ee871bafd23f9d24db3c998b27f6e10b83aa8dbb8a3bf945edfbf49f9d0f49d6f75a131f7ef891194c3abb56d9bb0c6c3d8ce72340b341a69a0f76cb111453f7b0115aece97073a785aee3f93127b4e8a404ba6c8dc4e393c72ec908556e046e2c8629a9cb3a0f95cf23abebdd1cc37043c5b873b7b7703ba22164a1641a94ce75d754f5a0f16f6191a85397244468f795674f8b152dbed2b5ebe857de571e2969d194b527f9208c545319025ae348c0096e4fa92e3679dbd2f98dc3c288c4fbbff49cc9aa5c9d5647c49b245ef3158784341c0c479425128ca359684d64d10b86c01c8cc10d1b852271f5dd190996f9d1215c437aad1f28b1b65f244b969a50b8f1e23c088d64eac2bf0b05db80e7cd2d442a560fdd1d0297a267d0e5e6bd71f4b5470f41abfc3716fbaa5a7adb410efdee85d01f3c4e673bd40b8930f0f3032cf40d32e07613e9114c669bbe5b6d726a92c9b219e4d68f65cd727ce8966f2bcb486dd0eef43e4e6ba617ddfcad1c4d759858c97005733fb9a087392ef557fbe07e6e210000402c24a3fd933f26db61d6ce54b7491c848dc0988c98839607b60326e6fc6a4ced0502224aeffe478c1f58ebd4c08b4b731c8b7eeab1011bdaf5004f893d715bfc008c9bac029eb2831f2f73a4f85cdacf32286d552331a07990444b6424819a017a9de6b50fc10841289fd935020d621781da124a45649256d48a3655e26d4af2c9192b638320e1453a8480d176902897318947483eb539d236a07e14fe3c567068c03071c0cc341ffbc718f40a760625ff5a1df628aec7f87694a0cb679e5def3e6d28869cb7e1eec9c32f60e3f3809ce02e74d3c838085b961aaceca8606ee556ea5a84e999fe29db213dbf4db4d6f91b94dfd155ea15400d7954b5ffe402bfbc997428c0f4c31231b55ff2adeab30060a99ea87bcfac4fbc9cdc3b0c96d2f0376606eb4baebde5bd35e49d64aecfd990a78646546f4e19d72a87b2c2187a4ccfd76526cd55a1a354bc2d4a3cc5ba8598078ff2e0354efbce1d2085c135df55b054f57ed067171bad0adfe166bced2de9e08b87c79e027c612063a4a781cf1cd7d7925c4fdc6f77ef71fadf110389078466e9ddeec9022044cfc84eb54647a2f0295ae3e5707136177d01a8177e6d22629cf59e23ad67155347c4ee6aecdbd8fb3dbb2e5b5e0ada986b4e4fc490263d42c43f219200c5900555c90525d7f21a401d9aff366c47fb2a55d51d3307f218506b00a3eb7db46e92396132be948498b4e09fea66fc129bd92433ee099666c04140eb3d3a40db0b9752da62f357cc12be51b93cb1bb4c093fa2337dea1f08908d8592c13459c35cee005e0115ee369505ab5cf15b5327b73a0aabe275e798fdef7f106be94e9178c317c1837470668e364f4cb1f860b88c9e6405b122b6d1363da6c2010fbf2ff4b0245729d1691e8b87e1b2a6150017b99c837fceebbd4f861faf9c537629232da5e354ec0a35cd975ee35f198d3b164c9b2de83a3d881665b90348a81bde33cdcdd26d911abde330822ac53e368a11c3773dfcb94c207b592b9f7c4e3d586b1373f62736c694d3fd2099910e3b8a940890600c1a48733dd9d4ed80cc1c1d9426e8eb91cf0cf20807cc3adc4dd8df264b544afeb1c6553858042659d405401a556b6738c34e5b79b01706d01f1be98c660370dbfeed5cd0fb5cfcd8666c74a9b60f40cbdf98d2de98b0d6de9b80966e45042b7e42a4de250ffb0d1800585a4cbbff76aec782779569977863ddc3f49e2627255ab20484f239b6df61f1db472a63bec75dd1c900c48950106c2d0bac55476e924a09125af4f6c7d90b67dbcd973c2400e0d457b337296e187d07befc3bbe9a29a1c92612a9365e3a47ad14966920615cdded8b9ad903fd74c0c763a58170ac0ce003287c70ddb6e7d28a819c29ed8d1e13ec45821a4d66e1d4fac2829bc3d7459f2979c2562736f32e17c8370554b172f44e3c42f1814d34443b47febcd8140e4f637c3c9fd504f899009732f8c60603122ae2116061ea1a55418c0414bfb4f0cd5f0207d1ba509136faec3985eb442235221984c46f97f2326a762ac78710701112555c8473d56a5992f4ccd36c5605f6f12ebcc72d9957acf14b4ce726e1c13382d5e9f44b6d49f6f43c5113697d2c2b867aee311bae67e6878fdca2c9f0da3a6af54fd81b570e2c3574ff17f3a48fae26831cff9570f00db95563ef3a9300d702dc651f94b2a5911f52335ca44d3e1ba5752865be2411c961b12791419c2709e7c1abf87f6a2bc70ec1836aebc8f8900584e8ac4746db68eafe5726a2c5775edadeb6ec3c7898866d2612720f45e03114183c253391d9781ed5b86dee41dbdadbf227229f1a5928b37ab9eacda66a8a0046a42238e158edd614ef00687b586eec44b87deecd0eb67d96bed51688668b88ad2bfe4bd7f44a939b2a004d79c1abc6c9609bcf20cbf740979d1fe179bdf0e791eb5ce40aff1f711832c9b4ebc55da4f4446d1e12d20eb1ab555952106c80714ff97973919128778c5e23452b1155ec34f76c1d23567ff5062e4f43eb9eb8f92076ca0e48d46885f82ab04cc385f3fd1e8034359a2f452117b011217bc3f5358b1d9afd60d70cc5bbd5e92d7b8282a1067e433c8d34d6a36664c9c4cfa199a5c9b07c2157323ea09e44b88b8231b9d7167dd0e9109f3b4b6e96a3070f0807c25e455e3c6fb89fad64cbf05267e2bb05fa67492a3a2bb811eeb18373bfcf663c8d26239458a0c438a4733facdf9fbb950440338797471dff353dcc6a1fbc4a01e8cf23f08e79c948f3562551f8d01e595a26c369b7d0c8837100eb0177ffe36b1c250e4934774d8d9d05d6210b0421c2df8619e7b6dd03b516aa43d0f0f2be0af3f54fc95a5792065778e5b3060b975150c4644d181d44640efa9d80cfbd106629f1b65a2322623084c60955691a2901ad531f9f3e221401569b518763841f0c2548cd2e225a5b00222da9611d8d2d88b7314a172b07a02d95ac0d8a4e14a35524a8ab79578a6f03d19c86e13cdba7be2ae2000f212dd0ef10f19898d124363fad30fccc5fedc03b16a17f8f9946b513ee30a1707e9abceca8bbcad511819829e79a30e7a30c4264d93aa0de914fdd2e5a0f337d7b44b238aae01d20cd8369774972b9f2d6c13ce266c93a9ba91f2e519c025f18bc47fde670e5a86936ad90d79a5d416568c093a8b89b9db1d8e15df185b46edac6c4430efe9ccf2a499bcd6ddac1c3b3475710a501795534aea9fbf81db8c81a6cbfb990f1d6492e9b9aa8415b47a3cb9693281a38acbbb65f0e3162f5e3a0687512d433bc4cbdb5c90068df7215c1cba215c84d01230669b85716d08e9444328175659512406b25d2084998f322e5f7ea02576ec90381fb74064c9a8a7d1286fc31376596d90fa46c4cc89dab555a69380b06f8168c46d923bf95f7d220fc093d683fa2688b151013aaf187a4eba4f3d4604b9b6febc7e593071a7924a721ad181caabc4e97429069a942e54809aa69b47e028828281b4f897b7992890e2955c2133a8cb4e4d2482c5d8cb58bdd058133924061716374713bdab3ad663ff3e0ef2628452fae5b0b426c4e807a019ad121e94a3e7b1d6b819a9a4326175bc0d35700d1b4fe3aca6ccdf2d509d5a69b08f1d5c8d40cdfbf5067b7b3d886e67b5bc9de6813b560a4a163b35af5257a5c1f9141378f4d64238adc1b3c7fe02df50aae9abc604aa561128096b011f7774bb231674662b6ccf04617027f2f6f75446e09095853f97260ce07665846200093f5cc6dea1b36bfd04525391e25a96308637ba28c8c4f29ecc44d8306a80dea2f3350ca85cd852b2d75149841b7ac491426c79d211791d86142e74e093f37958705db04fa2e1f47add0b1813805b2a215c4919eada6f2e828b3d9f03a88c3e0703a98de5f1dc69ac6094ef4af9f1ba67cda71922e8a8e583535acc3221a66cb1b418d36ad8764066af244f9a9a8b0add4c05ffeaa2cb884f241c9ffdedb278ed09c23eb93d629a16cdfdf83459480ac9203839ce9583361e028b0b40f78a7cb98cf1e8056af46fc3c68163ef8a77dda07905b298abe793100d0587ba02812db83c7019d1eb2460e4f7e532f7a260e923c8e5325046972229e3f291058ee965264e4ad2021c1b8bbf4596509f5c5b73bce23b58b5284be77b23735095031b4955c7f6720967ce885b857fbefdb1c1bca5b9088340bb663f9c4406ffbe3c0c34d0c406789d85a5e5c9bdc375fbc7c02cd1075b4a4c17b0b4ec85a3e737b2483b7e25dbfce8b15053928a14e9447fda796cd42ca4c2a1a38d5b99c3281a1900de02dc1d0b42c01b974f101d8fd7283f6e1338e4a0b04a3083c67278089528fa6bec91d2141f1ba5e000c40a9f1e97defaaa10091c0b998ba01ef8294243631d064d00e24b5fa921997414679ae1f87bfcbc6536275bf4995992fa4de542dbd459f2aa946d9f28c34ab6491de03388989caeac6ad0aa19453e72dfbd2caec5dcd90d77d19809684cba2038ae29cc236afd97596d79b13c8eec5477b71f922486c9b9911936abb9b2d6a831c4ca2eec168865fa1b37780054458d70c74a6dc008dfacbc013a677388204a7a1456c0e6d233cd6459a927def86db6ee24b1b3add78903a82a68d0695bb713c81a81faa34de2e462e23be3650076d990553b987cc7d99887a8e00a5d0db7dfeb397342dc5cbf56d105c6b84290efc6334dce00a1e5400dd236e40c9ae488d3a0865c0962e55931a54abf6759cbb436748e2b5c766137d0dac43b6e69144e236f001f47f1731e581b34ce9f849eefdfb79b0d0e9850673eb3bf4fd0eb080333d8559128798484e03b4df55d666c51da65b21161003c90a2ad52102c93b8efba14966a9a43a74f51787bd9f43bb16aa1396637584db90392a946ae42c2fe866ec5a0a918f09bd4122e36c0e3ac4d2af866ba9c022bd7b9d0292d92d459c53e9ad0b191a6cc8b0ea5d40238c0a2a6b1ff6ea067052e3011c1f3f2be098ae43d141248a209aa168b366ce5a58f41af04c86c45007ae4d0ba732c6b45ddd02d0896f276d72fb171e58393382b292af86585ab1f1155c32c32d74e7f1cfad631d8e8ec82553a5d615334ab97b64f35e2f9b5deab3b6cb1554571339adc8ad110059b43911247fc1023e6449620cff73d3a5c0c8c0bcac2616f872c54d981db99d70a25c66e0763cb9dd264d7da70897675d1b56c8948ce8ed420ef9a223371c01758d6ad2a74ce035d8a5e2bac3254973bf5ef12c5cdd5b0f30b39183eaf56b45fdea02a50ccffff585464b43083dde855473eb17bfc5380261ff4dd126d6618f132c4326a3a72353246c7ba89145bb2f2c8088031c32440df1136873eda8a5f563356573399d2a463042da4f48145e3b79c60dc8e09d1119dcc66dc6a361f602d61d61eeadc5aa3d9f4748610c5801f12c2c3924532efaa1de4f9043ccb89ef2003dddb062d14710fb89cf8f85062752b995feecb8f4fa55848d5b58bb7b96f28c0ff63927bfde78c7b6f7a19701fca479572fb3a81e63b2ced063f63ecb2dcfe013cbed45a09201d3a39dc1adb4f4597a169a2b251600a78fddf28c894b52517c09beb3a09231ce2b2b17630a829b36f5d2bda8e34f5bea21a23b4896a1a1b1235efd3be7f648a51b574b7e268d6cd3aee10d559688f6f6cb61d579597ba57f23816cf2aa52abc64c1dc425a8315e452c70438bc7a4534d98b5fa41a050231b5d87f549c543c8df28b00ff47bc3587c173044c41f5a010f3c43677919d72988f9745814ee5343177050c3f7a55f159f2000c41a7e26c9604f895fcd84643342255eee71855766c2a46317614c94c25a42dfa8051515b35a4cfd37010d5aa168ef02b5a3ac8c6cf8c4e5b5743e8bb9951243c100e74aa819c213acf9eeeebc3317408bf1cecdd5ff12af4bd2bcc51efe149fb531671f4cc3f415ca15f591554703cb5797ff0140424fc2b7b318192122966f2c606aba06f88f050c4a87af0d49e2d55e97206b89aa0dcbbd610971316b9979b35dcde14a0d73d0904eb02707f654804cf9e9d689709d40046b7795e8e90fac78c1757165749706a94c36088901173ed7f5adc8570d8edd89135f8d19229e7b281961ea61538e41fc981f3843b4f27ecb04a1fa1cb0408001c6605a5809974e913da1573900421b90505375de709d0c943a2e37cf7b7638a0b7f3d6de602e8e405bed211f9947a4dbad6d22ca5053e27a1e91931aabc8f84809a80b15408a5fe1515806fcc403334535869d97f37b9739deed4c399464dfb3151162bb1de8e15ce2098d1f348240361c031cfc46564606358eea5fcba21c5887eb22cfc422930b875f86b7433c4b125ceed79cf476d9cdbb16b2c362f595573bde2e70bc9b05ec447dc536fb1dc8e9e9d5b28122efd12c72c1bd397020f155dae9570cc92fa01d3ea0c6b9843740c4fee2ab4cafbbf18fd5df0636fac1944d48d75a03bd400841ec82b990512d1a636895b01a02665710aa16bfdb8fd4f5891c8806491894fda286d9c3c7a5d7956cb1d37761650fdb9762079a54f69d03497f5a76f4b57d374cc5b068f89f56b387880428cca3039998867342df589d50957c7bf0498a168ab06cd8d407b8fea5001fb648dc72da9c19117bbd37f54df0036e6e473ff262aac2ddc687fe309f1ae1f3d0b83314440f491f47fc40db7339db31b2b14e3509a5a00753866813118d05210dc14d7c19f65b1711621e83ab1f447525f686f37a15db77d9c2e93eb55eecb653b24edca375cdf7edbec90a67f7779d6456ccbbc0bdaa099c080fe538694a99dbd4a3ce5658d63b7e6f08c094f254c1d09586dee9f721e8c62ca6bd101c622563dcdc4775ce4e7b96b2e1a0e1b2ecc6870f030591a2a332fa34e324b5532b78ff3e3684c533bec8e22dc23015c0e7dc9eb1092f3c4da403925536acd08a8124dfc44cce70cf8517a3cadd4e43cdd5aa5237b361fe9ea9d796ac9264926f6b2d93fb41ac52582849ba009b7006e2baf8e08b55edee3178c44ab01a64c62f99ce07b237f6de75b98a5bfecd6b851449b22f2b130a8ddaec456df12f3ce21ce42770a3dd2218d81455dad7175c31529d8408e09290483800edd80ba99fd10485b232ab25b8abd3b82f56e5db5b6faa15e4d3e8fb665259d0b90b3e02eb08a566b2c541f4839957974e359239045a4922983fbbe5674e70795b5505002c55aefacc09ba5564307744ac3b4dbbd643089ebc0eee208d60a2c8eab6a98408674bd21279a622eea31a539632a4e6a204790860e2476bccce6cdf00269da13d97a5c03d5d003dce7672b287a5a190198ce3b197d40d5ac940c4d486aac9176ba8634e6658450b7b67eb43d27541cf94d8fd009c05d8be528e3dc4d20a23ae573255b196c30374ccac8ec096f7a0cc671daf11284b76afe148f0561656c7ac5fde4f699bd4d34059b064ea560f0987a1d575ea9cba7e95ead1a2ecb04adf137d81ef7b8225c1c303b53818a638606b25d5102f2c48988312361a6c97a74f466f1d22bc12b51070f5ce5a8c58f2838bcaf26ecc32527d1c3178b317605d289ef3aba08b5667112df9eb945f47041f6fa6e2d385abfcbe0a906355dcd59745416caa7e1c0625a72366fd2d52cbcc38b2146769196e401f98be439cb2fde793adbf0afcb5a7a999dbd72b3e54945e801d84b9fe73577e526f0a50557a036c4410ed84d935ed4290ffbb72cd069ee5da5347a2f4cd8e15f0dbbd81f18e9b4b937c83f9223baefd81836bfcc80cc0baea80e25d3399e9e403be01a354ae1fae41d0948c56068cf683b49bc77008f04ad56107bc6b0fcba0ab857317bc808fdfb8f53f6c05ea40c303cfdfa733f63b7cfa3688fb24c433f687017f30f147bcba766705a5d738431d50d3a16e5e6ab4e86e057648ebe4f083e5a01821874604dd452e669fdab6dfcde74338267b5a3f83fe4c33552d70f985c87d6d6e172aad01d8f61328a1456f3844b4623883fd5dfb7289173ecc3b7db2caff0dad5521092785e560080e005f6fd06e06bec103bda095508db417ac6ddb02b6d5d861a12a1129cda50feef7c62ccd2c68f817d5207daa9e1ee7ae33a0baccbe36aacd19902f454aaf3230691639e23b94aa430f047b14aa1796a1a0905d4fdc285107fef97eac5455dd700ef86a345361a30a8dd37ea8a9ff07e8371f542dc1ff613625cd1e66036f977d5dd74ba4d577de4d362d41ddae2fb611addf16557e999db2045bc99e45be1dab745796524ac9d58c0280e961014ca1b61af51ca97e7a5fa23774a4b5542e1b378be4389995e0640a5bae5e0c98bb4be0ea0421e34f486e7d335150e9c88d69fb65333b10c88d30f357cf66ec577077bed9731627df0e16e18731d70cdf28cf048a188ceac964ac21d101086ed720e6c770d73134a45bb56aa136e42d9e33a228f63837031f8b415431753c25c31353380e6212b04d285ffe72d3d9857794c8282bd90ffb448eac55be1f2934d0df015631890a8d80d6472f4e8ed78bd2fbdad09fd7c36f038be115b94298ed1128f9d8a005caf20e8dfca36ab62a4ca09ff178d3415a003cd753abf8a3f553894dae2cc4f418c520f33f4992c836170022b04fe21d12f9df02db8ab81dc1184411068dc6210d99311c1ba9fd75c9878b8cb4a653cb81f1f987806d6b57b423cbed19fa8c015e898571c5e12e78f1fb1a4b3e817f02b92240f8c4487247aacd3efb4a24de6014fa13f264bf461475ac3e47d2fdb5f9891dafd532803f350db67c395dabba2af1e8f36789b1ee1ecc315ff06c9e1b7f624b079715e96961b48d1d57f85fa9c6b17ee6b5dc5cbd245f14d72383ec7b5a03cc8a980243871599dcb8213802ef2a8d1be5a95a2d06586bedc3000eb59cc7d853d3b7d4304691903b520251b65a6101ad83ce51deec4e000c85277ffb4a5cb02de2a2179c3f0d061c24919f9e0964f946cdb7cb73281feeaf80e5617835491dccd24d1c51b40406c6e6ec14681f09b87853675d2c5aa9222da3b54d6ffac1317a84d9b8a0e89bb667ac77bb3cd1fde0e3826aff3a7599e63914d3623ecd044d87435a0a4ddf77be06a51a369bdd06766da9418060a8d44c0e5fd8e5a25ef1cbeddf19b79656e87151fd8f234af3b027c4e3145394b01c92bd0fa20cd2218ba0733a431119dd99d7bd3b70286eb6bc8735c8e1d371cae62a711f1e20e6c1501a2e25aeb2bbb258df5514e0e297ef4acffa5e1ff727d344448360c4440947b5196d9da9edb05490d848937aa98d8e37509be9b005727c29a55e3ebd992c32427da50808a3494268629c8e72097c065274ffadfd08b5f76e9123b7839b8e70b17d6f98f6e1771e112a552345147555435628fe7a16718015bc11cc7dd4ac8afe2c1d37f622d9ace927157ab781203559db4b7ce3cf89c94a9d11da74ae235592462a010459a17ec4c49f8aa84dffcd83517768849e133589f7d753a4d945124d3566321b856848bab3d566c5cc4ecc1d5728d8d8480da0510bf61a617c465d541f4624d1659ea44006e3da9c5e4c0d0abca140db44037e4df4ca0588c0712536376be23eacb6494dfa8b1e6ef1446290d964fa6464fc0c7636cf406145aefd18c9cff5e56839c88752bf34f92e8f26a78ae37d0e8e8e5e7aa3d5295a22e2d18b02e03226cb8fbc6f841f32becd80a2515e00202c5ddae57a215abdee549f269f186900c71382972a22d67d773f6b0af91b2e0ee098ce7dc4e07fe5311e60d8e57c28cdf50b79f2d51463a9548272bf8958bb03ad94820f8915eba02b5a49f731c3c328cfa3a0a29e29b1e75c9300cf11c4354a40d87572c3940c6c4fd1fedc47a1bd5850f10f0820e01a53035a12dc3c0cdb7e82edca8cf9f525fb87f4b3271a0c7d244ad2efbf375ae175a91401eb0b8f0d5e9125dd14d41fb4a99f4bfefee397c634fd2e664c92e9404be41a2d953c8c1520b651242579ce5703480d282831a64c03ac8a108e0f117761abb5957fb9f0d453d510924a2fc898acefa1065c74d62dd220acc4da693e81590b03f84f53d87483da5c95a28d335700358af3d1b4b2d2bbe670c6f36a3fdb03b530a3ab4124dc62705e5822bfbac53d0ff512623327193f1d584aff5625fc1293a27a3c2f7c9661aee55681ef62af0b8f1e115073d610d4cefddb9b412e631b12c6c51638238782a4aa6b415bf230b6fabe84472eadefa4ad3e5f5f37dfbdb5360357c3031d359a3d17a614cc292bba7339c1c2333622b42a2ac2eb0434233fa97ff58e434051c54eeb599c94c2ca933846e0a883e78f11e00aa52e8dc72b317f698c6efc8303c32a7230dcf6eda8cdf46a0bf82e7757bf0b9980d20796ea593e9252defef2f3ee8bb1196a67b87de9b04b3fc0ff114e699b78af64e644a169187694a476914b970a5be49bf01764962df8ede7ab60f5ae390140d157c9a844c13f170e841f362995cf8e35afe5595f9d890561d99266bffcd3c29e1656834b1675ad45a3703621fd24e5d4ab0c167df577ea98128d1d66b36bdb742918218fa93cb855ef7e8ef5e244e0cb9c6d8f7da37e44dcaf1d37def80fa5576eab971633782e42f364bbb9f9c0cc5f6c3710ab37763eeae98a78107a2df1505ae6f16cea294c508502304cb54dfddab2c94c22d251351f9915eee4af9e24f712fbf45010a59dc2c69154ad0fcf962f48f17a01971f81221b832d12fb61a3fd72435c3bdeac5a64694dccc7906be85058d6d9e6a0ed746aced691325c8c4bfa1b5dd4b757dc04613dd38121538ada05c4b4a064d0b06e3c67f00e14adefb556256a926e21c2f0de4b99670101ef226b25540c9d3cc41f17b8c435ff63e821c11e533a372375ec3e53f9a3898802f2ebde11449c568d16a5cadfb00951359bc711f37343374fdb6ae89abcb6f6f11a2ca1cf8dcb3f090c88b5813d63af18feddada2b27b7c9ec8fa5fa25e3488c5b6b148e39cbb576eecf4913bdc562892af487f42fe2c4df9a875b3e251007d29d8f41ee57be5117a0d3a2f1da1c1413b013cd6ea1eed81b3a960ef886b64be8f190663e77d0c32e7c6844f63a0dac750f76bde94d050b0f963940afaa915b173687035a32d3761e18acd31401ad39403ff7f20fe1f3c857f5f74b74928534ec00f70447d9f393f2811dd89e9d2d2838739146849289592f5a0259add664b0e8d23aee7c53ca8b202fcb2fe29d90da28812c44cccb73ff16af6599267079bd604a169facf3338c768508323fa68a11e6ceffdd843ec90afc6462ce8dcb86d8d18c8141a24964a4cf8b33a695d68dbfce1855de3385ff3b4c6376c58b692f65b7e038904d684bd44eba10e429f02aa24c5c50e5ed34a374dc20ba984dbc23307059a15f8da91c6d7016df9ea803527e9dc832116968e746ff5e0dad14b88c1f4748bb86213703f46da44bbd160b216550ed64527767da4e290513dd30aadacac36404de88f6313fcd228911fdddd04ace86937535708606be26ff7015b63a5ad77ddfd76b7a261ca5b353f0a19ed5b6934ff95a24dd15e51d493ff72346808c2d24eebf62449629e13182c148344482684764ed0256223ffaec2f3f79d6f0e06779f122a711bc5fc3aa59f11ac9f98d499f180b23e4ce2c076a0125f91e029d15329969e94f8fd8f7d83ca1715497a62c25cced053d07348edceb2fb5cdc21cd4e80a1c7423ba9ec08fd2f57ad39638a823c1e2145ed2ee3845f8836abb1b34f3a58ad720347382758918a7d1ef4b20aca11ab7b97b600ba853ea4e699012a78906870ad2042fe9af796aa8bf9c2776642ff1b6b2dd3d569e7f10c42ff8f0f784602ac8a00ea701016402051aa033013208e1899529d5051e9e044a4842352ca0982d21879a7685f809456a694371caa965584d0fffff6fe965246cdb26ddbb66d5bcbb6b5ffcb68f2074c015d0130019ad47a8b611e2f994a62c8c8b48d2b3bef43c1c7a7659ba66956317c50c10182040a2cd8b07023d336aeecbc0f051f9f96746b6d6eadb7de3abd53fdb27e78c90af8695b565e1c7697cc9e668f50c44fdef1fcc0ee9614d426da79dfc658a66d5c79c1e44c8769f18f73bce46331f4f08e0ce652729b9661e8e775a8065317c34cded16921e238284c38244688080162e3a0e9e3d3825fa2b1bcc440f98e86fcaab95f1d4df84e7aa2e72981984e0687d59575edbdb7d595756d5bbfd2da5e56e5d6f357d695ddfa6555efd62fab924834f61d8deffd799986811c063d7fcf751e96691bce0efaa66598d771fff9e775dca6655815b93704c5f16299b66daef3be1014c78b65dab6b9cefbc602ce545fab0fd6e7c6fb799986f988416ebc607847f1e33a0fcbb4cdc5f186a06f5a86791df785e01dc5cfeb38dfb40c7334f7ab23710a38e3f8126a97e2311aff4c285065e3baca3a2f2cd3aee582c94094c9f31f234478481365fdb22aecb69c50a0489aa8cbaaa8af9a49fa8926fa470351265489acf3cd37671d82d677f850594a1cef2445d0a46aa81b2a070a2e2b7aefbd43d0fa1120240a1c409040c102060d1c100f09d2e183891f806c26b8ac58528ace79eb9c75d679925af5c9a7322d927baaf13e7642ce6d816165a91253a63b8a15b7a4df8b09144927d7790f8a65da465e301d321d52044d74451cef44c165055ae4e375dc993f003804ad872269baa348d9ca89f19d29f9e0b25292ef54077534d5578d7d490c0df568a408aa9c9449a5b29d4c0d490cc90cc988c48624c7050c19aa861a62c186851c17306400d110b281034807100f5ea661dc874f83db4cb9ce43b14cdbca0b26673a4c8b7f9ce3251f8ba1877764309772d3320cf53a2edda00e11e9b84dcb30546b8deb6bffecff9edf7d739df76daef3becf73cf9fdddfddf7767777bd35196eadbb751759e79cb37e93c4658aeabdf77e32454d73bce9a35f59f6392b26a6b2d4349132d8ddc3fcb27eb8ceb32e2cd336124db7e5f2680fefc888e3c5256543b0c25c2c294a6e5a865d96d771f93343b07a0a1449771427ca7e5ec7919b96619765e2d2919827a00d6d0d417a24038a3d49d19ea4e87d923e3f3a8af493a5c931a8d8fb72bf2ebfdc5d8c63add5abbed3ae7b57777dddddddddab57afeeb56e77afb57a75afeeb57aadb556afee5e6bf5eaeeee5ebdd6ea9fe1eaafe1ea8fe1ea7f71f50771f5e770bd70f5b770adb56a7777ed9e5f3f8fceeeefee7b53f6b22acab1a5262972fffce8cabab0ce1e491365fdb2aa8edb2aefa1913451b6424bd24c53e0c718e32fa9498a20ca64ebcf39e7929aa408a24cf47e8cf363fcf831652faba24ad44587fd40ca236ae1e10ebefcc7e6c4f5518596c2d879ec4c24f28ef80c807de31b890902974fc00928c25ce759f822906a08d9b09519dcb1f988208ac60438c74b4a93c71365c5b0faf0e8c858cad442c18b1856d91999e1a0329c18305eb868b14204850900e908071501e283870e1c36846870305cb87cb5e1a42315440d516100c0bc88172d340e09cce525062c2f31909e034e88a09bcd66b389303232b2d984301d0c8bbd29eb7558767d9b5551f603a9c9436fe3bacabab04c0b7da2c0cf6a19765955c76d9ec8de94f53a2cbbbecdaa28fb81d42479e86d5c5759179669a14b13057e56cbb0cbaa3a6ef3a489023feb75dca665d865551f26e9836299b6915ce79d1f0597158bde7b6f110f4a9e30b2ce37df9c358010b4beb29438de498aa049faa058a66d24d779e747c165c5a2f7dedb01840813285400ad872269baa348d92a822a34f6b69e53f41f7d2d178cc9e827cd1ea68b634976643017cb7d14ac9c6db5d67a5bbded761b8810a864877c3b1082a201931c042000c010c00ce5d0681400061530bc448c5431180a46a330200c060b828140200c0a0280814000445110c5a12009f24c510db312aa6e3f8902d5808b9f95de29f4901079301cf2b1bb9057b766b866edd9dd5c2867a0f8c70074d3dadfa04cd38915d3a0ccd3a78c43d495bb3438cce59a76dbb3fac782dbe066bc46b7ab1a94c9eaf20a33d85f7b71a9d0d50d16b89601a7fc13b228a0aa012a6ef739d1a3c52ad7d6e3ca690c647f40388d86e46fdad6bb1aa09bfc1d6e67d60c7ee3ba01ad5222f6d3ac01c37f0f280c723428d7e67c186f2278de811f458f9862c9589d1a28936d9d9c0e518a7ae4cf3fb3a7b8013a5c56b7c35d72aec73ed944071691d1a98eafd99035e05ebe4119064a40d480034d8302240d8a503428fb8c6495c56c6421ea236bed28dbd700d02ebbc93e3a820d565c6419dc54fdb1e08042139d628382b9d3d6b553654b3b8c65d1ad9c6948b3c038de22d56079f8a7f29972a4458c4c0d7a3d908eb30236402126bf05f2f78b9ae1f777b4c370e6e0e628a407d1827f238957bb21479d716b50ae3962239ad628b2e6efd2888cb1f67c0d24aff9f9733edf5fbc5ece35381b2cbe7c98982320b241515ee494406df309246a711577bb67230b5759906c806e5708e282dbe134a206b22e4c345717a63b9f8abb1cff2eea607e01f057310301c32866084ae6c0b4b0d98effb48e365daf545de351ae6862130f06408790684f1ce7e8566c970927ca911f1fecb82dc36960bf0d0939db1eea29d9609860b44d8b9c8fd05170e5f0f3b1df42ecfa73a04e23bf74a50c0511af1df865afce80c53c3059a172f294ca2f249b5d55259a8ff623fb68a901d172f80f68f2bbae65ba15a024f78588ba640f681160090431386fefbe0544e52864f02e8195f9dba813fada4514cf7e092bae72acb085681ebaca543eff6461422592a9a7793982657fbf8d6df76f351e1e31b5f4a48f7c136e0961a6fc47cb956a143fb5f6d6e493fd4cdda3c2409253047b4f6f91b5b02705f745d271b13a203304386a3949d621a88a74d98f9660cba4646e753eba45645bc44676081e623c88bf9e5943964f5ac63a43a8547b861f031d181d1068130c570dc9c84b50647079c8f52864a514648002906bd8c7eab1c7403c3caecbd6b18e192d645d0447b83f0a52a04015180ac88e0c3c85a7c0e92b21724ee71a429e17601cf2aec9f6230bb6b120851728c4903dc73e1c72270d8789227215e1906d0e8d436eba6dc8149bd2416a508998d33f255c30dd77387e9b374ef4bb5f5a05ea04da6ae390601c770909d927478f5383022a58f91ab3135bb6b309b4d05b438a3e057dbb0a56365f3040c8e16ed6de2f89bdd5363b5cafcd937ab34d48e0a6bc9f11adb268b16ceb3a6ba96b3149399a442d2ff80ce760ace267057aa0119e182b5f1c24c752f79fcd08f78841d16c8282b67e38f2898eb5576ccdf6cce0cb6b8d5ec157ae8cf3c69af740ceb6fd00405eab73d2d456f08110ce2cdb5a9bb3b1f9a1ec3c45371ef646bb1a0e582d78372177a591cb62e98d6dc154df36eb27d0e6ad25fb353acc1b46f1ba592f8df68a296c5e415c496233fb6d317537f672166b9cb48472b9afbff9c06b29c77d60332a68951163483a4d4a68947eb6e518dc983823d9aa897445470a30488db6e1f9dd11159304b9a5d61cb5fdfc06eab41163e8359b6a3d0ab22aa02c4033388aa1fac94784d39ba13d9c47d3bd276af1614d091825d394ca0408bead4748886302da86185cfffc46cc0e917faf9a98d66fc9599d19b48dafaf7ba1c0e16250a626f7bf352705829637b133dca16a669d1cc8865f0408995a6f71c62cc08bbf4a998c29a0244867f41a478e8e3a20fc47b1b837a46f006ae557ddaa0c2742deab4d5e4d37203fa4c811b0b3077b9b3683f4f19403586c704ff3c1e6e682947a427fc835eea2c9e4734b7472edf8f07a85fbe3eacfae1daaf725617ac76d6d145803bdb88b004ec62874080632efad5f10fdf111a4106e9e48daa3d3d41af79fc94f18f2cb85c9c97cd32f89bcb27f06aa8ddc95bd6fd984a86e453097c94494e0f5e8733677aa0c1842900f0c91b8c794550cdb8d5cd2015a1e655f4bfb08370b61435f12671c14eea9d8ed858e19524095ac746f57755f6bddfbc7bf671fa631cb760bb245e98f01c99bf06ba34ea04b2ebd920bcd062c68b5071e46c65254711b952383bcdb399f5494c54e8b7a57078b2cec7d271d1982ef47813e1c50592f6a5d7221564cd6f5513218685d729548ab80ceef5478954dbc4ed6152c9962dae4c4826bcab16e8d93b3857f12b5b99712faf30d5003db14d1f6790e668420828edca1d73b88aef228ca02e39094c9f381c889430eb10bc2b63b42263f95c9063befe769f22e597cbb65f5dcbf5bdc8e2b591f7a49cbcda60ac8fa8b62c94abb5db288c421d39f999cea0747255d32e621fc0a4e9a9dff845f15ce1e9662324520cde48ca8e209d4b8e1a8a960345916120022c3c4885e580820f8db85a2fc26681b068a890844551a2fd189315df306ed13dd674f1e4b014f43eed9261601cb447c3276ccf924da2f19c197ab0e9c407260b448e0e85e1ab677cb8a5dadbc5a07708b3a11799b32cd6ade0606365c0edd46f2392136c3bf2c0d16b1b8fb4e74b008de2ffed53cc4c86a1c1f2f786118b73f8db7d3541503b4362509372d4e971b66318f3701ec9456f13e13eb2add627204257869268a10a4758ab97ce48cb3c5e9934d2713cced831876434178bda9d1e0adfef6addf02b5ed4fff6b9107e7433cde54b86d2285d81e84264447edf5fece9e45306f1044eb78f778289f609d5c8ebe1ff8befee402b28abe7200121f9f9b24e5faf44ae26f703887fd06a6008984a82eb943f96ef4c9a24ca54e567a91d897d0413affc7d4282238dc9c6da59d37190265e22694349a03e09b65ee8e18b760c26fd6d66ecfef747fa1f109af1437c38f9b6c993b4ffc019a718b86b8667f449070a3296e89dea56c96093726c56dfbdbe5ca75a4b1071df63c4464ff0b3704dc513478848c243e8c9b1036b9705ede3019cd563df38559f5654cc40d3e0aedd11012424dc2e48787674c7e7d8e356f0388116b4b37e572a3dcc645a07db596c8e80b0f88552a825f9c4c7188430711cae6f08b903a373c9f20a5c2091647e61290a46875bbd96227ebee79713b89c20a67dc22c6de0ed07afd20ea3e5b4baf501fcdb2db66344d42fb7db748053abfcb044de269b2095c340c347d97280f07f9b13fe192cc4789ed89115ac634893fee455752bd1e129a977ecaab475962649057910be11afb475a20de5c0382891719b2301de98ab996fc93117d460294bf48c0f8f1023cb4607624e086c0f789677173e1b3c97f467fcce2f267d613eb36062a1ec24d644cb02dd1b451acd1cfeab74bffde1054dea2d96e42856a2b8161793d098b986dc4525bf13edb85ee6143b0eab678adeec7658f96d01567dce8fea1f3f61d41a054537d8f800062c621091873054802314bb700d377fe23a81f4a546863752303a71bc162b6ea037ce0731db89716f01099d928e1f6770cb4bb0753b814463e80d5b6f2721d8102dbc9a37b72d3cf82d8216521c3f03a72db8a4100e41d2d4cffd0b854e66fd9e29f0277748488a0a660f8c3c533506d2b2f1de45de26f14e061d06b7c46967a48a5d47d6d4893affb90f3bb7d81f8c3e55f99be629eda0669feb4ddabaf1b498eb6893e6d6517c4dfc12a83561becffb57df5afb6984c69b800af36ac26f455c1255e4d9d6cc600b4190439c69a90bb4ffc3840e80be7c606ef98b858962f89120c202ec05131b385707cd8016248305c1958a2a2737535cd0d4cebeef99692c2de74f21612925df8ada72ea856056c379df33526394b069edb332b657286cbc65dfbbdd181d424d10651db20f2b2839f251a5e33ad2a3312ddcfbc8e0f21e6e6337f8ec7d6358e64586d458413800b8710d2d9d681b2ac8e4ecf27bb40dfca89a497631a645fd7f745d9eabfc9a45fdcabdb54d135a19785d99429772b19a9c5c8bfe2bb06da45ce067d39ae03bff0dc069ad67d9831e56ae86aa1e4b2efd33063681959a6735b54dbdf4b88573419abb401dbc96f514ace83ce7066b7a9a3387ca0f353fc6c6b4a73741b1c1fcd9e963ae806c8bd3f45452634f4b3a84f0eecfcd26c16bfde4850cbc8e13174bde15999fe88f71bdc3d016ad3302c55801655e722f3139c5f5f03860cee15f4aada13acd33a67c5f180a0efc470ea57c3fb835e5532ea8abf658236e8c6adf586cc498b43f3eb0b0c5cf7dfe1bfe33a068b4d885442d71c06aef5a85b5c5a5ab2a5945206c902b402b502674834fabd47a2d0d9497cdfe09c5342624acf9068442a8da0aaaaaa2524a6f40c8946a4d208aaa6699aa22321d1b99f84b4494ab6a9a33cf548a59133241a796937ed12923d1285ce911289a3bb84649bd0911269240a9d3b5fb59dcdda59dba66a4de747ee8432395153a954aa8569a0c6096572a2a6545555914c911265b249d4b4c54be57aca53572794097f1254eea4a893cf8f66e56f5b5b6b0a55557748749248a57d8644a3912874ee126997482351e8dca7ea549daa7acea8aabaf7de1b8742d56eb5daad76bbf1fe3b980a7e58ebca255b652f43cd910aa5a7699afe0ea6821f994c265b57b216476d4685c2ea9ca7bd76abd56eb5dbeda673c3e5f0d8e47674bb1e1fce3bef9c75d3b9e172786c3d36b91dddcec756abb9e9dc70393c36b91dddaec7a736d39e50b59a76c1b75bad5683a9408693c9522ac914294fa8d8b374b05ac7b40b8b2b84c72cb7949420fc8da89349f59fea1b0bed6028ae48a511f3d733246a4d5237b57fbfa537afdffa6ea1329d50a0121296159556cabae2ac190f9a8cce8e8e67d7937d7290fc93af88ddc872363e6e35369a76e69cedd011f3817d507e6e763a9589feead66fb7dbed26bb61d9ed865373eb8a533dd57d9e7b9ffb3c55144ad5f1e468359c8f9b09ea5affe327bfb6d4542a95d2d52841644cc74c6c38646a386670b434ab9a5255f584fa586ca53aa152f88bcad582a4e4047532e95465a198a8a8fa0bd37a4ff5d7eaf556dd0fc0dac2e54261a529243a3bba1f9c89b6d5ac2f3af9dbaf85f3faa24356dbb65ab7ba6dd7b5e3b66d5bad5bddb636556ed952b376366b676d9ba6743c3a2f05d3b00caee11b0a471b601680ac65aaa78fffaa9552a9542a5d0d096e88a09cb072b43968d8f55f396c3e3e3ead94942a356b67b376d6b6a9544a7bd3da7cfca8edd4e072723a58579bcdb437adcdc78f1a5c4e4e6707eb663c68b905853299b5333d9bb95697cb444742a2938432e901a6898e797c85585e735ef3bf744cc7308d46d3311d9b9d728907aadabb0a55a1298aa6b91269240a9d2b2bfba82854aa76dc8b8c1c1fa12dd6eac2f2af5ff9d7ea72a152c12fb90491a3188222acd58565052545a5a5a6694abdbb345553356df194b0ceb906ee8ec70d12db31a3c9d4722eb76c7c42e1dc8b0c96157e42ad7805dad6efae15d2a269676e3c0033d264720dd75e77a772773dd965c53fbb4595e5163014599867c4b4c92e2b6768f426cf82e2dd9debee52ee4edd2abf52994e287ed22a21d9292e14961556ba665cbec939b21d331e3499da4c4b63c33fb7d80d092ad0b616c73599e50367935939b91f3a3acc93d71deec141f04cb36aba5551fd0ae6ee6060724ebbc0e45ccee51ccb8972acb1d1e0f6eadc9dabbb3ce61912a146a4d2887762d2552a95aabc91e306be1430830603bb101196b9aa2b144fa5eebdf1c65aefbdf1c65af37fc95a6b6d2a474a67c8d4e863feb178f4987b576f16873cc620acb56d879c73ce39e79cf3cd5ece419c6fd6ea2a41e4e889ab16eb08efe90786ac11a9142292629e2111aaa5b2c212825fda5725a693e8b95856545a292cbebfc727c8cae2b142f150ae06bfd5eaedd56ae5839df501181f924de2a35957e4b5a71dd551bda72524227ce7472e3750c35b4d56225ec8b7ae5834edc2f22ef546e566e56614c32f45d9aa138a04ff0454869088e8f0c8323b5005d51404d31e9c9ef6de7bcad795aaa59e4620f3e5729162a5aaaaaa3ce7952acf7c0a2ec55ad3ded5b4f7b4a77d3da15c3eb1580a0a0f112957aa353457484a4e1e7532a558366beda9a75a99a4a8ad97b25852bfa2d24a59a9faca1feb5e726c7c9cfc68db56eb56b76ddbb6add6ad6e5b5b0b0512b4c4a48a46a4d2489aa629095a62524523526924358d94f6de7be768b519b5b5d5a8aaaaa66e5bf548486aa9cd4db372dbda52b9c5a3aa21d149dabf3727f5af412f8459c0620fe31ea027c7f07bc89e80b247d9cd11e400cc04e5356bf03f1b22b84dbb87e16b6f1741c68461f83bec36bc0fd9adbd1739049ae5dfbfbc0e0327d0630e6972b8c13904c9410707071df68586f8861f36dfb063f39f74a9575804fa94d7d6e9bd0b9ef7bdff177a3137795b87bde5eebb08f6963ce6be049a35e07618c8dad80a741bfa43f6776e899140b3f7f5fdfd3bc6b6a17fff3de5b564001913fcafbf8dfda7bc6634afff3df8fd6decbf617e71732c46c2400540d78773f109e6c5c14207bb5f7c09342b9a30c4dfafc7382accb0fbc30fc3ef4311fc8e59f17119e3b5bb092500ec305f201695808b0074efa6696213e37421b86006847f00d677abb96514df05f4a07dc1be2bf921fe519730b628767555d777691faa6e86227eec00040f3650e1c30a51d832a021c109201c7c40664c0019826c421f81fa40c4133d7648d800420f202c8074004203ba7d708142282630c25e9c144688e1fb91c2ecf321050df6e7ed9c933183060364c95e9cd60a5467c40b6f8ba0ef511899c5fd86e8d7cd9bd7ec85f90529403b1237d1c3cb0d71479039628e16860e7cb4a0c40f1b00a941091d3246f048220b118cb8953a18a183b74488715a1e5893bd38ad0c419462587515e4555fde8ccd4fde3b3ef997d47fef385e0dfe2541321cc71e8ee3a8c7518fe1f609510c760fa68ddb87e633d27a720ba6691ef60562c78fe596b183fd958345a150202e2177354d0f9ddea1697a46b7daa66b50a006c7b1ef38c5f2daa130f18f34195c1aa045a1bf4f4367a6cc06e3eee31bae29e10b1247fe517316c02e9b248000e8fe3df96b1a3f64c7dfdc349222be75f6ced6e5b64d5e376eefdbaed9b64db3db3db36b3a485e35ed67a88cddb19bbc661d327dd32c8dd33959efc8acfc3fc21d1e5c4fcd8ce66750999de6f18519b36608f7d812249e84e803397c146533d67145182bc6786756c332bb3f30311e8710c17135fe7d2fc6de55c1007460e2cfa9c96d17afb595f3828ecd3f3a62c5c17a9fe77dfc0a00a30007fbe98781cfaf0a7ecf0591c6f642441a5b7cf01bc82e2fba6c01037085d4b8710520ffcec82e1701004030f723f0a3089ea0f22c1f5496e55972d35996270882231979dde58b1979dd2ffeba3defb7b7bded79def63c10b8c12f79cc66c7f1bd171f2496e5389631e3383e3882decbc82d21bf7f068d1d228688e54fa0d9b2bfbc0e962d3c305f34ca458ed9918779cd62df79755d748709f60934fb791cfdc0dc21181404b9800d08346b8aa141501c4131bcf741703f49bef6e63a6798052cb8410ed32cd8637c322447bc31f8fbbfbf9f07de7d4720f73e0604c1d7a0cefb3fbe3b2cff3681bc7fbb09c67df05fdcbe6f89efddb87c21befe0b43c459b0b8c47fc30c6231fe6fbfc85b201fcc97c95ed63dbdde25040886666e11bbf8e493222618e28f1fb359fc3121fb75130cb17b1f9359f1c51e03f7fd217f4b9801a34814128542239833984110148542a2d09fa407821ee8795efe46a4d17df145fe7240bcaf2d7edff7f5d7f8a0171f6601fbb1e2c7619afd46bc07e9c93b967a944e7965490ec04e25a8a3e1cbfb4d1e8059f27f05d36b82f576acf924794bd0e52528f4a217118542a233f4217b9a2152448a4851c8fcd34445423848fcf285f8e4c761ad757d6176fc8f9f4e79c530f5aa7c7f717e72d88fc3ee5519fffb1274125f66c8923d66b32347c1f37bf13df21b3f6e1a45f1bfeffb185114c50fc910ecd9b501999fccfcc56563eeddf96120bb3f87c631a4f731c4f73eb39825bdbdefbed7031feb7f85e10772d387c15dc493f8c31ff8a1d61368165c60bf47621284c7f740d0f3c28d6ba8b4eab7a7920d0100026318000083300c436110888124ccd3b90714000b4d746c5c50521e8cc522712814478118c4300c043108c44008c34088c290630a526703c3054de9bab1597530f89fefd3a2ac14867a370f3e88b3ca825664022450a2fc2f279a5b6a461ca33ca9243bc088e29492a50265356ed550052e71425ac23cff828777eeef7ee8a55a4dd9cedeb5c96a26cd01d34393dc78a5b8732f7553b257713fe1884f8ec5ca862b0b71eb16acc1847c1789e696fcabeed5b5f7496c5bc9a6cdb5b4f994abe4c99930db9accab106a8fac4d7af1ffd72cf09d30f155fe2568544c68a3dd1e15935fba29edc4c26edb46c999b07d601e0560d3debc713089521f485673aa27958f1568c2420bad1e314025e93638db19992e9f00a56d1285a39c9046825c18c68a8b42a56256c93eba0a5a300595c98b4260bc0a1694edd466f67b7f43c69f89698000a93bf5eb60b3716228935401f24bb0a5b9dec89b70cce29dfa1d56dd3c13b89c77b256cda4f0055b70d84dbff1a0f78cb81d84e07e8bfe6fd19ee64d4d3a1d4e57fa5fbf9860029a01350ef5223ae5270d8ca71d3862af1f37bf61d6961f83d81d7a79371fccdd3901cf6431c5a50035007f0158130237d4c88117809b8558d4eb828f1202c64224b2971868c0ce1dbd885e9b39587b82db93e8217560603493d9cc008298805d8fc37e6e09a6001f2e0765c59eb7d82967119fc32dceec982e4e13d4418715932be67471bc6a71117871c59d320644513ddd8fa618dd18b0a09ea295b40c0808f48cb75dcb517626266a94dc0055ceb7e83716e93c85d5abc426a7c5b165d532ee76ad4c501a3cab3bbf9d2b79bbc5697d28ce770b702ceeb2e11428a3de4e25d842a57b70cfe5b1fe25b67fe99c0b6b47f75622bff92ad486aa3b7d93d0e3c83ffc321a9088a5f96fd238d22f5a38b7852a5d26826cb9d55b80f514033fceb9989afa05fea68e49a6d471e1f4162b877a73097257dd28b19675d44b72670c6ae0b540ef833151698a9512b011d69127552fd973202c8cfd20ca38879eaca4e5be22976f9f4b2e277eae6146734c8bd4b5ca167ee8940584a2855f9768fac676d1c2f5bf603bc8d62746f3589d463a57b2ad5bae880f69c3f3514e6f5a98b634c982eb5bd0fc699cbfefba4728626f8eaf169290ce75a43f1a77a916128be555223fb5ed9a2a95126dafa63112c375d8a8d24bc25bbba4e5391c59d989278be30f908651a3c1ad6359a2705ac30d6bbc4167360d331e20b185b186568c2750a5f6b823bc1818585091667294947893c42880a1485da16392cec3d40c382abe4151d4fb60fae597ba4a2d39d2b0accfed2bfe0f8938e2e928447b745f3a8c87b6abdb699d82bf14f5d9ad3377fd72f87a5ff9385e32db442a38a9941cecc4c7af02defff8a45d780cf33755e03f6c80438a7f858f35ec48beea7a775a060b51a5574e7aef4bae059549f57b4164e6b158355f855f9bf5c2c25ca19809836d2ffd7c723823333e8952b147221f872c8c5e8d9340a64bf5706fba674b33ffd51b65ab5e42d2ad596c151301621846c1c49791b3546a5c25ec149e754a490501b33299ab634cbe29cf8daa23ad9c14b4e5547f2fed8f029a8709408fe8b3e7e8e44a0d63c94e4c42342df42161a5a44cec190273c35951c2674e4a74847a0f7b73a21ebf37459ae10b54960d081d6d8d77b10743089b60bd7fb0efd6b4f04aeb6d107327922fde8f45f74462ff4e621c5ab496a8fcc970b8fc2181bdd3057d7f1476023ed503baf08fb6a85e977623fc65f9bd91036061d98dfd0a482a2da641253dd1e8f4c8116c440db7217f2536e2a912ed45710e0bf18728d4fb126306d6a0a3004ab61d1f1139c837eed0a276b74744a18fa69876a8c327fe23d13e4531f6a21cfe5478977ab13893f7b9521f484002d5dd3755b38b1f688530ab5edd4ffa2c2d11045880119b8a1c2a35877f0709a0f64e02e4861190db1b9a8eca377ac7f2112899ed8259246ad8fabc8175c789d1a6f09d0e25945485604991cd6e46c361c1bfc6464403f2deff2eca606e297d7412ca083a97b4b776eb3f8501bc952606db46f9ec29b5e91041485a77103c99d1b669ea34ac75656d22e275402da1e9d0dd7721c0f15dd235f41ef1cb2c84cd8a0deb01ca034fe99e32c6ba5a0e76d6b0587a260910d1e5118b2d39a5f78b75a3acd60b009343f2a6d6487e33717ee8bc73b9dfc38cc24a7889b815b11c1cf35f95f798945da20ba5af58d1dd49d9414e6763797cc78e36d1ade6a484521aaef9ad680d9f5f25e2e77d58464a315161ed3ad19c12bf31e31c75ad999c5004c759e182d55d145333cf264e8c5c8c24d9c2cb69d887bae45ad81e54a2e3f0ca80c99dbd1a4472652da3ddd71f58c2ca14fa4149df079f751a78cdd141bc4ecd0a6dd14615d8f8188a66d5c1f33e691dac2aae0beaf513179606d43db0377cbaac182b681fca1e344ee10a5d87665ba1b8b15161cc7ac2fe05b4c547fb69438b40efa404a9461f08a3a1c8286e29aad96ffd26e43c904aa16c036a347784a255838add233e0d9b267c31f3c0ba24db8333ca524b463f93efac48038fc3a2bc3678bc6f805a7bd042b8e0518dba7fe9e3b358532402e3cfce231c9454d834c53a8b12e28934268f8859d78d040a9c81471279819f308a65f0243a37784d4b5223f33e0ac324d44786c5a9fe55ca4e19aa3c17978c2af140d78fd13347591c3e5563a72e25b0be7a855d224744b2390ebd2a466b87e9515441e4784ec4f2de4698019e01cb580db4ed78c21ca25ac1940523d0c22ebfdf9c1088554756a0e7f3e481b4f457eb31829253afabb8402cf2ac0fb69cfc59782a61d81ac52e5deb9b83a6206ce3601dd3ac26e0447c40b80be9ee153c69372210b4c76476fe656b59caf2ccf9ec9d746eccee84e720aa5018a50e323417a8f695541b6324b64883485a00f1195b10093ae2163f024fbb1eb6c5580ec6b12be957dae11c4359aa50dc2d8ae92800a9a36a14e4d092f24e3a09401f58d1582ca1858232edf0f9df4c86e587d246669083e647765d4925598a2c23816a20223eeb5522c22143f44d9a2d3636710ede447e0809d3a8915a9a06afe1b1fea57a0dc9d3e31e23b88a489ef1db18f0de264c9d3a47c0aa28c1a57e9d0509c15e34ea84c88af4ab76a2ba6002b68aa641246327d700f9f6ef3e92604c84052767c28996df3949f81513391e0bd42960acd0831553a85d4a35a2d888a0b8e568e2fed1a418d57b25554828260927e00b6645d93ef581151d893a29543e9093428ac732ba9e4904d85eb57c77fce5cb8e787c9d00f12225639c80fe9345f9aa2c012a6c5947a025ec3835f9cbe3420447ae214c22d39a72a2a754cae7edcec0050d3f2d6d3dfcaa335f58674e15cbbaa86a31d62b01a892d80536af7386120125427c80cacdf9d107d0e41c707d9072da660f562c698b4b31cc8d0815a09177ba15d61102d8b017837604b6dacf58c7980c2ad5d696b4449056882834dc4f57d34cd131b7d35f3c1d81e3bde8210671babc1ea7027a082051eaeab51c9ceab2dd768546297dd552761f110851940c4b8bf318453423a6c76a31f2d9e901d473d1585229c5586acd7f6cfcc5153211c11916a707adcb3e0da2401962051767ce1eff374aeca03fcc2f139f9e43c5c03c8ceb4f706a39b2fc493f935b8dc35370c9c2f8840a9bd3c3203907e0e81d89c14b8b66c5a0a14556c8705d8c9f530d1a1eebe4de620b7495c6aab737f3a51393da28986b34dacf0a00df30a6c5f9ddb39d159a216f1ad0f7f3cf0a02e344a7ac49594c945a88203f49c759e827ab8ef34ebbb30577b801583366b28c9d5c61701b949ab731ea68fa488600d8c45106d8a422980e73b4103cc83be385d675628fd14a9f785dbc2641613faef44d0f6032681f0d056556eb0bc7579d03d91c267a5f8b0a2594a5ab8bb7957c5aaa43a48d9861657a3481264363bdce925b9242a02be2eff2287818ecae9c6e4249803addfd07050ad82bc50e9659108a230af8d6d7191cef575e585d8ea56873aae324dd7fcd575f20f39878a54530948c8eaf5009840f928db1111660f33ebd1bf22e74d2c758eb0a88114374e1d55cc33e4bfbfd093580e779168305852a1fd1722f482adeb07107522203a9438bfe6e44ff08851a4fc5962441e86940be76f906905434daa22f2d27ca533a7f9ed4d1380473a3c8861ad07181ecd358287213ae54135cb6b21b016f9870a92fe1d2170aeb70874b46069786cf6b8661dfc717ae9984c1258c461292ff1e8ba5da18fbcc3470802bb4ede77be371663df02cbb88fa6c83ab5727b33a8018b72717991d84c25d35a165b8f41a7c28351bdff5ad3a1a1112b76291dfc2234dbd23e5d9e72441cdb7308c50ba09cb075982ef263b46b827e87be210eec108faf120172fcf270e22afff66a9d044d40055882816296a8ef591722f2ee406d61d2032090d842333844d8cb0100967796dd75963fc03b765208ff7303f916c7dbe509a925484ec1dba4592fbefa6ca2fac50acdc0753bf77f22ef26019d06bb7ea03b9da7bb9a0f6c2022e3cec41f8ecf7bc0114011b14ca08a881f6aefca450a6b96f26f970b5cfaf03c428197c3b3cbc7674ffd4ea5b0bb11bba85db5fcb22c6fccc5ff350e658c03a84b844fec308467b96a3ecc6f300d7dce204ac327f0e094e10e272bfebd1852afa086037382016fa7af4c0bd98101943616363f359d0912844bd9335079945141624987f002b901a4c538758ce3b24aa5a95adad8863327226e36d9c93da991fa61d915775ebbe68a54dc2825e92f52d75c9d6ecb16d5909b997d0be4933cfbddb4260a5807dfbd4827f1995ba77c51f3934ba6ed000ea57d8fdde85d0c3857c51bf59d5f8432b45bbbdba8bf496a29f938c67998a256fb752647b62a7cf2a111680a8c87bad6d8414b33f7c22e989294f4f9943c3739c80768a3abec0ea9cd146ecff2026eda608b3aaeb4fd0fef73aedae8705e349041bc59f557a5ab3d62a88a32a2ae5cce84b550af0a6107b39954151644d1b772e6942fb5b78cbac5710336490da4aed00c3c5b5b141ecd394451307d7c1b050d164cd797f0d9ab05f1ef4c94643dd8c62f747c76d1d608459b40314aa423c51beacee04e24564d1a8f0576c5cf2138b8dc9210f669ec6c6880071b0fad0b159676656a257ef04e5318fa6f0648f8d6f04c0e2bc883983908d4395ac93a8c2291e2d9c496260e3659e5c0b46720def3e18cb4ca03dd36f98251b63c8b27f4349c395b6a6e36c72af85ce743e448a8b40400df5fcb86d1864cfc92de4d613180d1716407f5cf4a6c7b830643d3f0c6d5fd8d95c04958f3459c1f404e417b6c5e53b7a40c8fd0d73ab80e8af7b10c560af052f3796394010b589cfa981cfd96dc748ae018754f5957a04333ace81efa16ce8786f403fa2c0ae670a40f834cb5576ec5f261b2ca9a212d7c0e77d06d5f939111b536f1c85142894c36bb5d0c573e4a85b7b163df5a72117908c261def8bf90f5d2b62730579107e3d6437315d23e16ae3b4cdc6786b0a80c69cc02c8a3989e622622385c5ac1b1663c37522f62801b10e03f42cfd525279d1312956c75369023a9ec1df02bfb473d1b1622dec89646782d883dab127b0f088b526c8c87718d595d50ec96a77a181cf7bc6a1bc9783185c9f8eb5de6a2aadd5b2b2d64edf54abeaab35bcad564357adfc4db52a3e17be60e69a072c83a0956e39555506062b9d9509cd8101c586adc7d15c5990151ab9317777c5c2396868a0e292bf6a5ae60a74f1da73eec08b76ecc436dcb304d1ea0d594cb82c0e73152b269ac8fec1f764b2311a00e70bd2e47b62246771858c2f50df65c6895b2d0bf3b342f8d1e5c087c235d972d92432c3e30dd2689cd0f39bf1108c433aa11dc0bb87aa930c5e563feac19b7a2ca79c8617639ed31824f309529e1ca601bb5d0a6b04122612946d93b3a45a8e5c4b9c0d5e2e4161aaf252a59d62f3df186ca5c2a5c21b3b105e3316bcec0e4a1d6e92d20b47ca65a8a47d7a43c9a50aaed1cedeb797d2d95481a0c0b78f38f0a66b1c921513e0c8da001c25a0d555516b742900387420155b21aba135995ea609985e6ed774f017fae0322f03955ebf7a28bd67c7cbd3654878250775a9a640a437c22546815b8db85495cf972d9332d526c97351953581d75213fb6ccb465a7ccfde46dd939aa39814182915334495033fe45023bf991a574f061e4cca3104beb26c52fd4ab8fdbb0047b011c5ec5d828e15cea3f09c9e0c11ef549def2a9e4a2bb266b1d572249c4993ccfecbbd587c93aacb4cb21c29d1331d9480359b9857330bb83b38675258809e6afd72fb469150e2f8f8033841471f96f2b2f7be7ecd9bb9ffc41935a58a162c33093148834214b40842554e4d30e66100b44fedf1011a79caf41dfab7a71fa0da0996dacd98f39f1d68d2a02af5403556404f8e79403104244a0fea021b0de901aa59e1c4e2cdc1a9f13eba816adce431a8f0106480838048e47087e6eb5a98b65a405595a671b479c2576e40cce05645cc1e12f25c300c03a5e785cd25c3bcd0d0351c2ac32ddc6da8000db3a8e533bbed952a5e56b32f8019cce3c24b86911b64a38d32914a9391ba543e82b3b40c3c4913e8f255ea08ba246cf3c8f319134eb08fc9ea87d91ccc418fd255296d90d27c84bde9424c2b52da2f24e8327ee699765e30757c36cf5de005157af00bea3bc1de97e990ec4a636552b06e1fd96a91f94aab725dad00f6a6634997feb08b652b5f9a320f291e8deed1e5348972b698d8ec12a12235b1678b292307aaf7bcf0fea017bca03df389db32a6225d9ed0f79ac43751d2dc172d2a38c29ea1eab50be3da51cc7bce5d6a9c018468477048c859e6353752f287089f6b773a8a3764dbd788bf874869675186af27384d247f2696250affb450622cb2381259f30355ffe9b865f907c5771611737bf739ffafa2beebe8aafc7a093a1b8b69e4d6cdd5abd028922be1e4e489c3e7623eefbd98e02457936e5382a5a8429d1e99d6fe43d4e29bd045b6bda53e06c49e84f2a2d33cd791ef10c67ef68708ebfef48508770041f0af97b7213b46836d53516e78865bfc98621336e00d93a8703cc37307f164144d19508a43f2aec08416c65e6432d4169511b315ac9b366ea3ad2c58165588d2d5ec8de8c920fa31838219e14d41f14bae90362aa322a5d22468f6dc331b6431de62d9651a4ca20822f41081125eb30d84eb9a20b30db21aea674c173793128494605812d8fec519609b383d2dce9222b6337a99779d40f6eec0dfa78b21f0c69403850e44993178dd960ce1e2667941c8146466edfa9ee08d85c4523ca0ce50acc570881eaa1631ed57c3b45ac27427eef4611fe61421c6aa78bf3873027dab01e9543261a191a45f640022a24da85ddc8906807c27dab7a60ce1d030850b05413c4edd10f38de4fb4cb542b3a190315b7af0773ee13ff92a1ed317c5ed10d314fc40f509e4491ce54ecbecc9180d9251abaa05091ddb12f49721f8b11a5f617b36b4dbfafb98f8a46a4898df272ec90bb25d8d9603b6f9293ca2e0d6503b7ae0c90ec53379f489755edf0992f37188a7150888c702353f35418b4c8d9c1692665975f5155695b7db87e0a9770422dcc07ac66d0f65b59801aa43619ba5a79bcf570722a9781c83c1026a7a6edb7382e5e7c87f3dfd134429d22bb73c0b0c22083fab503d040ddef640101a85eb56db73f8ef733aee4ab1ea635193fb53603624bfd72046e0b11d88ace9952e998108fdeef61cc5760eb34cbfdaf18fa2d83ad843e4fdcec8bcdd93f75344de1a330302c325f37ceff61cb2d7c8b96ca1af357b869f5a32e3766f8f2a914f0bd1aea14dae5c885c74aa1d7543acd6e27f3abcaabfb0e6729b8d29428f313f84a27d9ce85b8f16a226a3d821a21dbea78541f7b435af3c8d460cd17681ca8f0879ebe134c203f7b62bb6404cb40ec4315f80753890b1481f9070ecc6048e1bc07ae5a085ef771e440919f1ed9147a01e0648be086e5fbd6eab643aad9228df6c6a3dee8478ed67621376809c81a6c508f432de18204ee95f34fc9959f8dc51bf1fbd8fafc84484ebf5a152b00334e49118a128f009e65ed25a677bdaa54023103f639e61c912c3da1907745f28d2c9f61b9e9d1a1036a1e5eeb3025abe97406371af6bc1c8564b4ab38b8a15577c25f1ca50303d32cd6849dfd6bf2703fa36f8543f9237dc6a0677c6d3c42148bf6e9b4fe7d3eea346725c0d253cd239f6a29f6431d7c1881e7fd279fde43506d1ccd48068060e810569016ab6d1c60dc280a3b41b222f8dcfd4a6c0200118133970e3c618d49bd6087c22785cb109962a1855a95fc87b77579be6f4686804cb4a6491879eb8008d25b8836cf23d74bf637788a559462d432121a3b03401ded62abea381bd94c780e0c79f0d8a5a7698e0284ff2b1b021a0245b56f37727991c341636bd671b95cf44c69db66b937b8602424830118285095bc79807a0ce3d5194c17c51121ee79436f90675a5da748579f25e7281374a5949a4ecd23b63e1a970f54ffd142b553c3ef969071429c38844ba0efec0d05c5a9ad445ac078007a665ec1496cc8cd9d15a0af74851d2b11e887c87906195556ff948505827d66ffd91a1d0c1bfe98b28b551523ae6d67da2595de36c0e5198add3d89246eb21964d60d03c7462239305e6facb35e078209c450755d9b7804ca746d3ce64ff1857d02a0c515ba90ca2805e09c7a414d8b12c32f0e5bcbe71bb53143be4ff1b247d0c3864ebfdf70e7105ca238a5d681065bf8fc1dd20ca2b98da7f1da1a8055797aa8d5cc184d8e94f33cc02a5e771932d4050b26e9f2ec1507ba82a1a7c6dadf6517bb4904ccf89c9b8ed4a6f4e3399cebbd0a674788d439851f6dffca5c5c56d06c536197b209dc1f91d9b9bf659449cea0a2517261a5148168ce91f27dcc1bc4f7a058bbf2b0ece9f126519c3810c0ded1601fec02cf8f4ecd08d6035af5b56b2c6839f7cf6443af27e201db829c1ab8f1bf7513da54893d065c0e98f486974145067faf465e05e3166448235027c6a4618c4d88153d339c19bebe060545a9ca6000756dfe6ecc9d68b59a3f34e2368405dcc45d4068462c272fd985d99aab20b42a81ceb3f55b55f01d54656ff9c5bd1c0e49649b1046917e342672e01cc1a2f19fe5aecab3af4fc58470f3d0665c716a08a896a7b8c2d7a4c211a8f1fb93b5e7ec80adb4d2024ca6f2b62ab7c6307ff57555978681c2298881c212536d4c770c4db51a16caaade245dfd8cc83e3e8367df17d9765d177776d9aa386c88497394aab6245ec0e792e9addfdc8bc84cc6725f66acc92f3028e94866349dd271b30b9ad0a2245e4efb2f87f3cbbad84443ac286ad4523d454b7c26419c6b6f0d9a7ff601a9f36c4e0d60aaafcbc5681e6838baf57284ce03e738ac70de6a578507da6619daa3cb9e4ae81d8d21a75eacf9a23ce7f0dd9233cf7a80feccc2596ce7a3d1296758c5f59120dc3b6b8d1c0d905ebe4ca3c69cb9a0c54016fb660218f8dbae929bb13adb94e6a3d511aa584a681cd7009bd23e427b2eed3189524a6ef8081595ee55d355d72ba17140dc56af2eaad1f7aab4234ea63947a470466808dc505909dbb0a42f41298faaf1e2ef78ec29cb1db9bc6f5f5825902acbe81302399ad088efe2f7c4433cac503120ee4d163f9367c12734d596e7a865bfd98a20906d2a34988f98831f49d52ee4f81246022155c5a80b6b2790d1c8bc7d802d406389a9d9810cdc002eee5072b109c06174894c013092b81c6586fe819e05d670da02cd933a62e035d488e34eacfdd1af0c8540f406cd1cc607c6e19a415ca000b8b0cce140071caec8b8140330ca2d1c1c0f80e1830d0039ec0229cc2fe0c9a69a94e56b705879f02bc251e160f86f904d56e2c80907c6becf3ccd8c5461633e298f8427d6778e14b6237035f6130b942669f452a39863bac7a35529224e804734071e6adb6389f378fd7acd421c9140dc8f848f0287b14f37936bc24fa350661766a406c024d023727f11214309e607ae306ab4d81010ac880e4c00c36e766dbae358117891e5334c12a2a5691793b41f396265d62454168c748c4d58432d4232a285c0dafa0996245034fa4a328f1953873085c68e0f1d1132e0909642b7063bdcaa41538ec3027585efccf85eda61200f637dac53499beb8163360aef4ad8cd33c009b2fad63b3d791d9733d0dde5adc5d8305e78be2f640dcdbc69617c9720d93820403a476049a5047b258200c5a351da6ed41f13dcd273a8d38287c409df3182f9b932859ae0aff740623d58ac17b1339f0b0f0b501810bec32af41e89965307cbe2e2a690d83b46f4a8dfe0bf4be5d075bf66a27959d8b976e64efbde5de52ca2465a50a780a5e0a634a701ac7284933a4c782f9887dd25d1396202f4001b2ebda4aa224883d4b9cb0e9c28585038b4db1bae8e9c265e5fe3892424ebb426e5e7aa4459fbf4fd9be67fe1ce5761956123efeeffb445114cf10c2d0e20fc9a66d41fc19df6c8188b4e834f2dafe340f91b436447e62e69c50f32162310384105c4de86b90b9d25a9e4bbb6e590837f126dec4dbd708a2868e02574654a7116efb1b4d191985d98ee3fedb37caf2a45bea9cb50e2995279d46b7299c91955118a3ab206b020808e8456fb4a4d679b4a406474b6a99385a52368e9694c1464bca62a325652fca464bc6f468c918d068c99889d192b158ecc5a1bcc513228ad968492ca6182d894515a3dd22d188bf6ffcec16f1f891be456ffcbc12937f2ba06002bb8248450a9fa1383124542900bea2d8f74637ab54d46574cbe60645fb2b5dd0a3fa455df573515751d7f821796a328834410291e7ddf63cc7a2ada238453b24fa34d2156d79d269e28de258ddce93ec5b75f9aa7d6a1c777fb1d6d2adbe324a46a66e60ffab1bea69532c28db3637c55aa1cd36d219adf1a4074110042dcd0bc51fc7703cf1435fe3443954c1abbb2f1ae9ac92d1cdd2dc2beb0e8d6e54daa8142d4c03f1611d34ed9c29510350fc89af81a2bc209cf8a1f751c3c7897266694efd45f64aa31bbd5eeb536ade8701450ffd893fcd5badf60e1f228d8ed0a35a1add92e8efe9a6fb34baed1a21f480b2dad52fab9a2d2a57b76c519e9bed7653b8aedbd314ee4a0994d1cd4d3f12a3a3ebcdd2cefa54c3e8e649f6882b3182b2fe46519e74ff6c7f232a94a96e6a6daeb5eaac528d6b9586deffd69c8d74f63930d219e9ac92895d35d255a0af7d9ad802fa1a2ae7d09d899d89389e4474fd4d6c9170b190519489b2d920d09d9b26be5aa0313ae2a63f96dcbe6d37baddc80ca8fcdc6a466b4ee0a08d76463afb2676bb9da5f9cf1940137d36ed8c6e16bcd1a7d1cde8e64958728019e9dc74333bddf6af61954cec4cecac899d899d919709a7a1a95531d8a006d0426e499b6201d96d27a74db1827c51b0299610ae5daf3c09167b20af7d22c3b00959e371bcd23b54c77a82f431fb1f2e6afe432411082786fe84974ee52feea720e9762daa54afd094a14af576df48057dbaae87a5dd17ffe6e742b1822e37c50ab2668b36e3ff1e6e9e58c5d7638bc60ffe49bfc0f7e1e61d7f04fa60342600cb6a6b1abfc2bcf1c77a8bc168d4fa0496c105c9722f78bb22fa222fcf7a8c31fef2a4ec01d0cea5ef42154ae8b34e59c9a62a551d227d0cbdff09d2cb2ad9bb1563b83c91e86820a82b93eda0204abb1f94c771bcb2b4fba3d6f729bd2ff422b540a018be75ba7fc1315e71baf4dc2127dcbefbdada7d31049f3ce9742aa8b32ae9b22f3622834040210dbbc39761778862055dc1a6584e579bc23e70a2a3fd4ffc59af6253fa745dfdaaf7c4df5c7ee5d583e503bda5e17792da3a75a7ae77610f440a91a7dda7e33a507710797a11670ea42d7b18154f12130524e738d763ed871d77d65b7d72338bc9c27145ecd3c36cd3f33c0f973c7ce300faf0efd7db114fd27f5f0443f2cc1fe6f7c88fa4a78fdd8382d5e6e6051a817c4702953bdcbc40a56ba23cfaac502265a21b477ef0ef8ffdd108df0b3175f32371e0ef14eb88698ce17bf8c11ede7bf8bb347ad01033b0c5a7d5461221b940bab29e47e47d3487b3d96c406a97ebeefbdee78e75da17e6b43d204af659e45ffbdada696ffb7efef0d5bd544fdd3ae996e33c49f617e7215a8281bdea559e7dd63844ecb372ed8b679f458ebb5e0f1fd586ef1e2265b416bb71dcbcef91bee5e67df15e9806b10f46436f59597530b25ec5c89a95459faef335dac377f6e9776c76ae7d2fc6186795ead595be67b49e6c0c8395ae735357f9ec18f4e8fe102980235a5be4931c2c02fe44205822fc43441140f1f651943ea812272471a4f6c3a99e7829a136f4b6f4f10326c5842d25d8345d4ad850fc0f9a07cf0a5b6a28bea9466111b04f1401159fe255943e846ca8fd98c04b6de853943e66a58fa236b51ff50a1035146595f73f5cd486caaaef63f80992d6b25b91dec573441c10e9fd951db8791d77a5831b728be3f0a8c3ae1b224f90b4b6c393c492a8c6a6006945bfeb28edfe0571198255f2bf20048d99f2aaf9c7f013405e405e80301828d1d55aa9fc3226f9edbd3e66231bf4394bf21767f6ce3e84d9159a95e5cc5e8045e7fbeed696d7912ab029608dd716d60d25c0ba210e0537a9623bdbadb52fe36e3bcbb3590d9d445a84e4479f79bb7093bef54a928063c7dd4433ec9ff5f1d7a51d779ffed44b186e962e9ae8336f5a472d54ea47a29452aa1369d1e9390cec8b4bdbea518f6fffaeb8e9736989831abe6d079e44310c34f78aa29fd14bf5dfc670d3c2b83ffb21132aec8f44afe21da601113db21a7684f6a4ef7ef79bb637ed4afe258554bc9344e528a4a2cc6e529807353f8eb13d5c24c5ac44519e28874a132079366d50035c12d1c88f5f46bef7f3ae50d3ae42fed7650f92e36752e8ea3fbabe90930913330c4cd0e62ce8f4afb1a75bf615df1a2397dcb4249aa8a55a63b869ebd2166da10daf2c6dafd67b2fbe24dd600c186eda7269c9bba6559ae066a5094ad3d2acd28a726669f6ad910cdabedbd9f55c0a479125ce089f04221a557c221a1407913f25029feea2d3a3b69395b492ab88c910dc0ce98fa406197093ceeabe329b69b7615d3dea0ac1b57e30d1298cb4226a9946d2b18f524af397ebedc0f7f40c3f87f7b0bf1f6c86dd59c42199e3fb3c7a5e2c869f88c6f612477efca218c6c25818cb0fa357bb7b393beb86c9cab369cbae6ffab1f39d3c75bd9e3b6037fdd8d31996e6f81ef6570c39a01bfcfe7e2f52d1c719a5ff2dd194e2c881dffbca11f0dfd733a3288d64978caa88688c40ffd63b9b76d17f42cab522c99e88b4c8e8c96cc53b898368067ef7f2471cd89d1472535fa044eba4254ffa4ae215305caeb0f429cd947a492b2d71d02d2b84488b2e51ec619f3709f9b1e7d51f013f0e98f8a07f1883ff790e593bc5a658374411c57efc321b919544f412c54af1a9c539931f8070a5e60c5a6cedd3955a6fc55ccc2bb0fa16c94d67e1a65326278b5c2b8aa2add59a06fa2421fc1d378495d44d12872d77dc1dfe8e13f6e1e3c80f0b4b1c4433ecefb07c5b8e487ef4696edf1ebd63082b73ae3524ad0dc5a7306bc91dbec5b2fe505be40ff383e449c2ceff915e499d051a339b21033a097f4708ba99b37b99639a4f60f5adfaa0fd5b497bdfeab09f57c1a7b00a56fb38db33c7b8eb5faf346ff9469e52fa97ca5c42aa01d687cd8aed455b7ab0a281cb095c80b02187eda6b51978999364af8cb2d9b57191c588ed3500c1aaa18d9618b6386581dafefe05469722c90030706d66a09a210f961cb0ec683861fb2fd140e6c8141be878d9b16343131724a090b982c40d2784d14388d963adb56556c10587baa84ab33d062dc36dfbcf5e0626dbdf94a16bfb23e1be6c7f0acac194293fbdf7efbdf7de5b81caf303b1ba732e79d81d7b209283d8c7801ea8bc6ec64aa2ef71ae14039bf617b11d49180c060404f432fc81be6967f2f4b1f3d60f445237635963505b8c1f232d8c04c14d0d983a207ef8621986e5e9afe3dbf9c1ef8576e66189be72460e63619044df70b1eeb7d10cc0587251c6e1c09540705ae5c069f5a90e842e164845316e9000449409faa4216416db29578d1b24dcbbef8b2b92e87336fbf0f77954ce53a5c2513d58543decb3dab0a8acf6598f18edb33e41797805112de4344f0ac10394624189942a553c46f424efeba54be8df7befbd67a5d44b806d940947cb5ade0928a000dbea98211c434f4c2822de17efd5a64fcb4a5958ebe1166905ad877788488beee761ab6125ad4254eb751731cdcca40c34559a252dcdac776133c2edf108f70529cdfb0cf6f7eea4772ffe42fb47cc9e44e451337276dfd3147ba3c027f6d0fe488fd26cac03221e2f29b483b6892de6f192405b04c74bea2d86e325655b1c631bb64598181365e325c32d028d1fb845a0d1c428340a8d43e389f192768b28c6d948a44245ec96981ed9b722f0c84a5fa820ba7e978894821428c5699200a800006a595aa074f29ef01857fc3482b6576138d1443482f67da14d4ba21942db7ba12d3a11f5241cf8712983ee5b5e9aff8f784a80d4bcb07d3d803308822ff7c0a4a5e6fd42e09604dbbfba162722b54a35d393486a7a1efefad7535cf2021b539af796f480b6c7818d4519c6b526fbc37a354224dae0ed1629a5b452bb455abd92be4b6aa3d4fbf5b18d32795fdfb757aa0564d7a93e517aa0ee3c71c5d9f57d8d2bb9cddaf0d7129c2103b17d5377a06ea047823bc15ee334ff3837aeeddf9dedfff5d1ed13db3618dab8fc74556cdb92c0521b3b9b76bd14388e325560dd6d5e09d893e278180b7901b2a9ea0383c3be332898ead92e2de1f7bcec4bbf78a5d6ab77df2d29c80b90946988e2f2d60a25524f329ac0b65f7159a9892bbdb8d63953a2b5fe157bac5689b43e912d6998268bfc6295027b91cc8b77848182f62f3259209d303628257b9094b2ba9dcb8bdfcaf84b83087c5c8e0f2bed1558662adbf9635617a7cbeab11d81a282eb72b566eb8e9327914e55b027f2b5aa7b6134bcbfe5597e63853140e88369dd011974832fa3eebb2f6d718a0ea341822dbebd7a5879fa16775eb5edefc50f46e38a3052fc91ac301a368c9b2bca0c9b89d1f8af3c497cfb1e8cc62d6d98f2e451f749e68b01b2efab8e1a963aaabdb25af4c8be782badf4e2d8bd6fd7b849827dad8e1ed178d0a7cd85a1f829c320d2a273b46dfbd1f68f21d00a65018ba7faabeaf1a4154fbd3b2a4ec4090a450d64421683f9e8b1c393720a4a7fd30fe80756a9866095ea96599e59000130b25e92ffb399a6c04ef916533c6e67ea3a17c05b9b9d02c09f3fd36fabe0cf7cea09fe9c9d3e05c60177301ae924e4e80990779666ad5216802e67a372ab686b5bf06669535609c401a03c7f5696e74cebb7e50aca336b0aca534f50da29b03cdf823b300e8c0144ef119123a0786db3d936dd0348a2cf106a43d140f12b4a702bccc959e1bd8a2dedad20a5686f06a14ff06bb7ed57da835f7d3c89a80c9d8436ab442bc3284bb31bf8f6ca102a097d82ba2ef08e2b0de0ede7a61ad2dfa71f38b5f80bbea946bb7f77946968dfc7539409b763780cbf800ca1c229925a1a6edb7731a5690de9ab40a07d8b6f5122953e5a94b412ea690da9c5d3a430f80bfe9c6d1b3a21972ccdfe0524928f2a105a3cadf451512032c6566b513e1e1d4685507ab4fffdd3fc40aea84b9fe1257388219427d50d556b2da56e5f1b8014edc58fac2f448a5ea21ef1cb4dfb2a489100a410128e3eefac92b86569f6bb76621c7127ae1175a498255eb9695f468a61c49cd845b4128f884fa2123745284bb38f9b4d6dfb5d51dbfe111946855ce156e8c44dfb2cc8d00272b7c32e4bb31f4e89b7176db3af6ddfeb76f5334d6b4724add17d82f43d44fa16227d0755bc63b091a4679e28d766b1cb5d387037d35d3fd3b86d2da0e06ddb07c1328472d39257f4835f562984dae0d7b62154084523073000f23acdab22d10c1c59478fd6b812edad8d32ddb777865dffbc3350d9bf69e4755afd8ba34775b405c027486183eb664582c908b78c705b184db403ac57abb52fc3df3660c9d2ea2f59ece1ef0a6d980c9711caf8b6c33c98031ce62f5ebff7de5b698e394c067ec7e57651b641a547f5eb074e4386644ba395a447f5497a94c10d46eb95de0b93619e409b82301967d3fe6032b49635e0dbf71da06928ca3400ef8ba3d31ccb3019a518d21ababdd8fb7218c32fc32b896684e5f9816d7713ae60995dae6155a11c00811b04f2c5ded75babe7c5f02b3aec8a47e85be434fb44f4a84fbd85ec958881ccec58ed274c871ed19f0d1166d3ea4ef18836c6ae4f8f9cb43fae7eeff6ebee0540a79d4bd456a9a4e07bf9f37befbdf75eb02c49f8fcde7befbdd75a6badb5f6964328a59d3db2a5d52134d456a9088ada901fd65aeb79de1359aa793fc407fe99a5d5214d35af1ce2bd2def7b49adf8e2c5e98316805e7036ed937e1896945e50db219188c91f7437b5c490355c6cfc54d57cd81ff2e328073a56bee4d192b2abdd77f727b254f3f24793949b2025b8d2020c40d2d49c9c9c6e4b35ff9b59f377bacd6afeb75cf3777222926b42645f36dbac26e4eb63b3d5ee3b11316b42ac1f5bed3e91a5da2d87d8b22a2c89c49286b9c30f4bb3d4fe23fb0806e3cb87524a29a54540859b6a157164532daf3e9b3e6c532d2f22bcb876fdd1adb5d4ab7d1bc36dad41acb42534ad481ac058b35b1367b7866bcbabba5b7b2fb6f762ec795fbe395baff962cffbbe9c416ffc7206c13014c73b8ed6eb0886a1288e232c766331eb358654c57184c16231d918a342b5e9cba6367dadb36cfa403813d78409ebd5047d3d5f7afa7ce97127b77985b90a937515668d2ea7a4425525d54985aa4a2a95fae45cb68b72e9f10a6169d30dc3055275b7f65eec5dcfb35ebdead6de8bb1f7ddef62cffbbe9cc1f086a1f51a7e1904c3501447d885c1ac5758288e230c168bc9f4d5da7ad5b0984ca635109089a01b1464bd06990812121a1a3a7102c5ecce66d6eb0ca892413768aca490908ca1b192276032ead6282e0a14d62b8a1c239a01d6a11c239a91777d0fec164e436aa88bb448f40abc9040f0248ad525cebeef62df9ddbfa457776ff7689bae5b9e35e4c8dc2e8d3ace5f541c42fe2ba45b1d64a3defabfe32ee3b254f1f9be6a730dab429b9c3772e31a82dbeafa4a5b53cafdb292d2e5de2a65a5ce2ecba3465eeeca604b07257536e5076bdb80988f4bf36d5b241cfae4934d5b2816b532d1be06c2ae36e4a8f683982488bce0fb7ed8b32d26b32b2d6282c8fb99b66e17e79d2e9b94d52e9f37e6ddb8de1298cc359b6bda21d16009ba6fbbc5f39cfd9fce13ffd0be6c14a5a9e6699b3d6b3d9f9fb34372c7c180c0683c160397bbfae2d4f7dbfbe0f8a488b2e4022460bfad42ca6e8136534b6b2ef565f4b315a58b2d6ada5960ab96b0c9258a044639c38bba2cfa5bde466f5c7b818f68215f4a9ffab9027d17d93bcae5802df823837b31c3d39316e2f7db72ed18d7116e370cefbb2a23d623dc952ea2f5e6a0bcb53e72bdba37d850afa9cbd5ba73a24f6497718972098adcd76860dd5b6a5587313911685f9a3fdca736e8112fddd57814109fafb73c5f67267532c1ce2b8d8140b87a99dad12b54b396b3d9bfd67f0bfc72fe37b7cfad86ec3a7300f4b0c6a8bfcf65e37ef8a7c811e7d5ed1432acf1c4b2fe88ddf929e277d35c7923ffe73e9235db8e9f9eb86c8b32b1afc2a86b58421453bd49775284bf3c741ddb6dbba4c79d26795c4f7bfb70b659564d7769fb6dfa8ede7cd62b5fddd8a76d91db837cbf6bfa675d1818c7c4ab31f234b297d622f1a16e90318a929cdde4a31fe70b78dae7f7e19caa1b29797c2964e0956468383909d15285373e8c0d86cc94152848619be04555ef5aa9c3b18b4a035d9c1892e2e4c2d34b3ee62e33b07c9f220c7e6a3c70e4b4ba3fdef96b6ee5fa6bf403ae1c7fca24fd35c3259f8e0244b0f5b3217721827e482b64369be445bb0f81ae522d3f63f2dd86706d37563b0f2d4db0626ca936a54571caf3b7ab6d32e30fbac5d76a8924991ea1174a9f2d97e855c9d6e64bb05db5bd83e857c6adeb346d1a6ff9b963a7cd4dab44bdf3b8cc1591217240edd427261adb545d6d6c75fb53fb0928dcda7998f3e9f7c610c1caf888b30f6d66a2d78d25aeb5c5582010bda5f5c90868ea614ceadf65941df84d9fe77fcc0ebe5fa5aa8d6ea3d486623de0740a729ad3beeb6f885d0d94d25fa2ef1e6a9de8b228854a96dce9b6a16363a3d7c501ed66cff3bce468db454e4a69b5bdb1e36369a85105dff498de854953f0fc6170f511ee7de3f5d777a56ad1ea36e9e393c0e09a8ecfad6beec89f6b727fdea416fbed6e36c5cae98812a2db1f025a1e7419fb4eb460ebb6497966e5d0283655befcbbfb6efb2dccf5a21379dbe16a2945e2f7fe18fc2499f59b6a52935f11ef36a375edb5f68859e55a0439abb84e4a6cbf67701a35e77473241cf70126d5668d91ccd01a5f91507f5919066e55507ba067a7583a8b1a3409b1bad11c296ae608c3ee9a534fbe39697698bb6578641d9646dff3b5ed15ff89f78a3fd2bb8d2bbbcf4a896958ce854f5bd38d36c8e6c7fa1151b8fb6c7b6de44a57dacd9956adb9741b101d06916db9f45add6e6b054bb82304ef21a27db7f14728b6badf8bf9a55eca02b00a3cf8ca4450d0bef3dd2ecd244f6e9c6e50f607af8dc1113489a2b67e1a6b3702faad58e9a526a7568000546edf4a9cd20faf4703a0fe7e13c9cefd9fee74cdcb9b8b5c5aeeda2d7f653fcda0e4279d2e9e140a8ed44a751b2fd85560ca9c95f94c9fe1eaa64a32ccd6dcea6b0fd6d91ed57aeb339db95b34af9f47e37d3690f97dbeee1b68da2548d7672d36f6e7aeedaeec16f0f84c289ba2d7d7a51509ec7ea457954c6112b6f737b51d6da6dff5188e692f4be32b43bbd0bada89cbd2da2684a692735b350184f3aadee9d8aead6f6fbb552c047dfc75f591bcbb06b58cc28ccdc591d2d29352ba5d152689f3e76dd72bf4e625c9938091d6efb17b1f02a7b896a29e53dade1c7a4b62d5cd0e7e76ccbb7494427fc356aca5fe0fc85ff055afacad154fab6cf1a35353585a60f9567899232e2ac11d1a9ea3e2d0241851b5d75bbd217fe41757489d3185cd1e76cf601d5e124d054f1029cfe00e7013d92419f338ac6031a1cb8a900a7b9180ad0425b2aa079aaba4fe46bf96951addff77ddf57dff34a9a49e8e12fdcb4699b2d223a11f99af7df7ff90b9bbff0a7608d3eb500fc68abf274ed5fa716f23ed6a906dfa2477e6595bc77ec5757b73c5da7a3e5e9bb9d7ff997f64a8c0bdac25bd8ab887fa65edbff12f91afefbfec25ff8c358d0beeddbed49569871aad5d62124f499bbf6399bbd1042db2f212b6b5b5bbdf90b7f1744f0f0a2ebfaa0cf6a73779bd74a29a5b4565ad625846c5d4e47b65722319ab4d5a6ab6d684a9fd5ebcc550f95586bb448007df459fbecfae4496c2f83ab1f459f799f7aff589fee3006b7e97bf5282c2c3d585854b2fb2caac770f385bf2984beda5c5e4ea3713c4947fdb32908e4002154620c2bd6d19d7812d5127264d3ed0020519e44b582786dea00a79d27d14d8398df73999fee6badb5d6deb47d1a6475b456b4d88a32196592c96231ca148bc1609409061b47ca348ef4c87b91323189621852a6300441ca0482f4c863caf9fb28d3f7791e65f23c8c2913c6f4c8fb7be991f79632c1debe53a6d85b6bdf52264b8f484b8f9c1e59af94a98664a547941e79efb00dea9fd88de55c9ef73d80237cfc3842f0fe99c15ceab89f1fccf673f8e183a11d2d7e99589eb8b40f92b0c1177dccd75efca078411104022a6979dad023294c830b66d16e40470fe4d701dad89f36db5207f8a707f4197cefb3b5405ea923564a1501fa213f8634d5f4032dd580fe0750a9b5d63fcb1fc34d26babe7ea7a69b0d080808085b0161279bad06f44c6c35a00c66ca0f959ad6fa892cd57439a408ca1bad5bd59114d4d4aabc12072ce8c80f62b65ad0218830b54ac5e98c9394ac3e40e86a2b785173c20f5c782852ab1ffe08b3b00d4412878319ccefe519f9cc3bae573fd7a7b53a8c01d4969ee7bdf54a221adedbf7caafccf16dafe46137bed6bacc510c118b7048790fc3118bfdbdde057ab18e4123f859f77d1f56864761f9812fa3f4e8962778e6181f249b701b0cc7d781c392478a1dde1979ebc0ef011ce07b8f03fc3be27104ff47b0d4119af8fa3888f4bca75bdb36a54740e5e995f7c73bbe26cf26dc98c7dcb4f1ab80e182f67e3cbd1f5f1c7f6cf0fa70a27f72909347093e4bf8f953137a21b576fb6a439a6a4225b5b4aba39e32e81ebf31c334c0777c7ac90df08b2f8a0f7b0f34edfbe007be8ef0cf1ebbe49162cbfebce02d7584420f0a85ff3df8f7de2b242ba56873f49983ea760ce4806e4a599ce2c3fe6cc26dd04471d8279a9177f839becdc3ee26184e74f8f5cf3ec117450fbe3f7ffeecd9df3b6c06f85f7986e599a584de6152b7af09953fa8ae564594f7ddb93236ed647b0e4bc9761fe1dbdf8cd8fecaeffec723c7b73f18959849d8b9c471ffd381ffecb1bd92470a100441102c75782a5214d13aeace650794c5994b1d3cec961241fd0ff0e79d3fef5a0a69b2e5a29e6e4e4180d86a94d2ceafd4e19552f5716971102957adce0a45ac6a5fbac65cd57cd0218ecc70abfd18626393b83272abfda855045189dd978dd2227f9aad12d196e9e2c2d8f75ea4a5cfa336d49a2bd5853100197dea22572afacfb98a0c636c1f5becd75a6bdf3aaed6af93e8f571c5f8def1fb30c6f8defa38ae2daf275dede685c9b818635c31feeefd3e6cf50ca68187312dba9e9b364ef211698d92df4af13c5b9ea258bfa803f5f1fbffceb03f2bd818c5c6b27dd2a45806306a0beff17f54696673cebfbd8731963172b65433987d65ced2e2b5556c9aa585cd3ef1e7937ae59c3dcf933cef49b04a263e3f8c9ac1126de1bdb7b43d18db032a67b099acf44698379621b8e93d2e6f9090bf88f67049ad9873ce38b29b8eb1873d7f1cd8f33cafe2ecde67f7444f2cb59bdee71894c96e8a1d48ced92a91404484ae4f7ba3bd8ff1de93e049e07ba107e6fc951ee8311cd415d4ae1f5e4deddf418f31ae5f2953f899c647821d7ead3cf2d661fdd876fe5ada07c91d55d49e7406bd3f0e7af7a0770f821e87c7e8e3c3837940eea0ffc0e6ac35ae603b4d0a7a8ffd19a3d45a5c9d5ce126fe72468ff0b760a3bff17778d2073d424099bec7430ffba0c743250d730ffd50c9c2cdfb428f85c820597d1340babecc2d1079ceb6ec357956b0656507ea8ecd368691592cabd59ee4b5e2a8d7dfb197da4d7ce68df1cfeea5b6521bab552351e9f0cf3cc6f04a860e8236e7ec353e7013bf887403c5ef650d37b1073757ea31179dac15b463d621dbeeb05dbfd0db190429386207028275a447f5696ff4ac66503d7f8fbf86279d77f3a8d4bd129738aa0de8ced5ed7ebe97ccd56c6391b10f43a434e95efbd6ffca00b7ef4029a598564a29a546889466e05e6b0bbfd7dddddd7d8e789d1ed1f25e7ae46177f7aaaf303302bfe7b987e9a547b4faf05ababe7d7777a7348d48692ae6e89cf3a8a7c051051cad628e3e73385301478fa30a379afe08dbc0827bb58609a9d8d27af62ae06831cb8a64e695b1626b2020139452ea79d4a31e3d4d8a834c0401e9a0a0a0a0a01431fafe358787dbd60412b11e11eb0c584850c5f5815c988b814a8e1d20d0a40a1e9a665565d94db20dda54eb01645cc6cf2b4f1fdbfb3b8efbfbbef3fef7b9b6ef746910195ded57e0d673d738d37d661ab27db3fe5cec9368c67dfc18e9c4f6ef5dc221f821081fe8bb1ff898e82b3f084b0f2cdfd2ec506aadb5d4d24befcc5a6badd6e9159e64690e7397604a28350dce5eeb88d8febd94eef09a44f530ce997edf77bf4b1d630f7b9ef51ec334f0ae77b505e7cfc33b7cbbf1c7f0db87318d4fdf2f192b69f600ffbd185f8c6d4d3ac23f92951ee11749bff4083f487a1bbb946bf15f6db37defc31f6c862daf676148d1f7bd92be78f1bdb71cef119556a51fbaaa3efdfadfdb8a4bea41c518cfa8e508cbf85b6037a78a8ac0dc5b34c2528e251b4658aaf6491e78e3b03fba993dc9ef83611cf48047ddb5fc4a1e787b258efbb82ca911b1967934dd39c2dc463aa3bdf7a72384b98d4b1cb71c77368166e5acf56cf63fa30aa8549c6aebb790b696be510ced17da184794c9c77126ce66e6399be1f48863aeba250d2c0176fda45ddf1bcb1301bb3ea66376fdf0e8881ed5a8319ac6b19432f9aed56b8afec619ce7339c1ae46bb8e96029e54df26eed179d1f684e4e96287afc55a6bad59ba6e51145decb13997a7d633af3cdf34cb1369c9d26ed0a33d9805d96cc592ae2a90bee8baab577ab5296c8373369b8d4ee7521236375a9ec8cce9baf2860f102f8d0744ea4489e109932668700a1e08b244955315952f249e161c2553b2a27cc5a0848da6275c514bf441b3441165745bf6381db9e108ae4fd58da91b77cb900d4890c059d961b3c4438382094c4cf82a4111556cc084147186cb1d1c0b5dce20004814377a9cb890a5444b04ae254aaac8c025858c15335c5b4a30258c540f706e4481c189902f4bc80044d6047d94c4a962f594a5c5860b3c4dbc9c315244d6ae0c0f3246f6408d6972831811c6682561029544975d1c2f13a7c9132229d451c187126ecc000398342a7cf1eac1082c165de2ec00449e1dbca246d84325ca1e3e759ee4d9814b0a3e683d11e20a1c11727c210933b582116d7cf0aee024e9f34687216ba69c70032b77cb010b0523e49071c14f9624a07499418a08b12a2a505852e6ece9618cd11b2770a2d8a0d15382084e271bf1c3551f3332fc39418c102549b6ac94d17d65a0013c4e6faaa0f0406113066b882f6286f05206852186a8d3470aca11728c8069c282e785305a7d9ef6f490fbb243e4cd0e5fd674795f540862491f34527e9410b9f126cbcd095f72e0fcb9e9f0250fd51f1d96bce9b2e606510c2854b59003922266f07220d052c70bc80b5d43d019c109c9172d45dcb0c515040c373a31bc41028e9d1c3810b505d742102b46ac11a1cb098d10373d7039c20bd533e5c60b1254bab4ecec20a60b9e2d23b6ece0e15001334254e173c32e8b9c2a51585e90520218ba94d0e50f1421654cf012f364ca0dea67c7c3942c5d92c0e3e486bdc3116eda74519287ca86cba006cfee8b9d2525d87936fcd0e4aa4892322db480e4c6053b3545bc41c2e40b09973b60b29adc4a504217121b502234b1d1946407ab2ba9ab23528a58992dacc992c3126682dcf13978e44479b9c1891156b64c115265080e2b30f1937503881b1cac3036c03922464bd82608175ae8a2a6cc141b097061cb1139ae2542b05003794547eb872d50a68c10a187953f75aaa6b850889245889a394be8d49142831036f62881c706222c7c716282474313273a3369b6f8c0a97203cb9c125ab8124545c3110fcb1129455030a14a9a9dd48d1108218286ac2f3524c9b994262466bc58e0e36449d61c1b61961f2580d0e3278d91193060458bc89e365660a6444883a58b9ba923de9cd006b71444949d1f3b76704dc00ce1821e343cec50e48a0c43cce047862837396c70b871439939428849828c17295e0ce1540c526ffa08c1474b0a6ca0ca9480c6852d395439e5dcb84085490a67be6e6c202565a4c9982a4e463c2a0f7819f146cd183048ae8880d19cb0478c9ca72b344fee54153650c5cb1015b47265b44210e50299345cf8c040e40a0d49a488c0f2c2458d9597620407264a4831a9539facdce1e3b4030d3c7c19e24310281eb8c0cce0c53e8d5bbe865cc12192850d0d3044e9c3431ba81deac0001565092959659ca8497263823a3ed04152a4842272569ab22c6122e44894962f4f6c386027678f911f946cad99ea2145ca9623391031048808396278ca0151420b982552b48e0c3924b68ae8e08216154e8b8c1715d450f179618225e8d8c963240529146c046581f3a50d152b564554311264899e228a68012286a62150c8584569b3644f0f1e952f16a418d12609115bde0440cb142264f862e58725bc29499400f142c24a171b66a80ce12a82872062d05d2314cf1337666c00028395126e5420cc1162bcb0389da99292fb92f3414b0c941239ef43a48f121f6e5a40b4c0270a015288a3e5e6eae94e1d1b50d2440159a1862248d04405c9b1e112c542104fe6dc30cfe4a278c86201c90b1e1473ce9594921bbcd68c1101851b286e80f205852a3925599e0b4d39e860b36d61d9b1334401a44851192142a58b9f9ac29e2240c87953c50d57960d10ea4c4509d245880d7c9e88208d4e8f17a7257ffa8890270533564cae5290ba726201266cdeb411828812c408e087af3d3258993343550b5240bcc001d2268a0e58e8d51e27384b6e678ef08105334870f8631b82851e76371ed0650e1239405902c39e264260a452c839c1210635224c5581a20414a7218c580285a3ebcf9cad2b41d6dc5e5862c8161fbecc294187156a12344f526fa68cd0298990c1891049f070e181c99f9b1a3657308cd929a92ac2c709ae0a1f1f9618652139828f0b4ae6fc60c3c80b393471e34394355b4aa88e883f2b68e113e44917dd25797183831c3a5a5f639274708301891256a204313253e26ac81e169e54d1a9a0a30e9a266beed8e6d8e9006a4f1519323cd4a14ae104dc8e889a2a66ac68b0d1028b86155428733353e689027ae69cc94a7226cd9908b0394188177448a1cd170a1848c1814d90175ae092478415f854e132a30392ac2cde094d44984c59a2464e122a4c81a1a9881b2d39cc10853361887523849a2f2b4fa25e60f2a5469fdeb8381340acd0c64a1d343e7c21a193f373858b4bd7d5121baec3c0882e5a4720a13544093417602265668c1518de105900159e5d0978a688d1f283053453ba1eb8004122a6032c44edd19db0020b54bc232144e979c29a41a7e7c93342819b204cb09c9123074b7d5a3f57375a52777e40d3854a18a7b2819f32d8f569ae3f1be399b05f106208354ab8e401539fe60a0061a7ab873a3bc0f095ad08e29c7d9afb03bb64956ecd2b92222a869c0f79be708152a33ed450e5073450a818e1a5567f56eb53769b03a9b95cce79e95c98ece564fb8f42f9e65d2e7bd5ad9c57cee6b63fdd9bf8d52ea2fab976dd2893e5c0fad035d54eb77d64fd4c54f183f03dfefa187fc63e3e6d696e4b0cd5e47bafc4f8894b9fd6eab62d7d6bd565ad6c973c5b178cb556947e0543cb7b3bad952dadd595419ff8b66f47a23c26482ef2142959ed563a67a1388841849eedaf80ac6aa3aa764cf481f70ea0b508782fe5950f0207ee5d3b341a869b01c8d227cdc550c0120c1b75e37c11d1e5be963eddebcc71b6769ec341632f5cc47dbc6569eee55eb466715c24deb9d980eb91112f4d8d46e145e35d762fdc85b78870c2534255b7866be6d1c4b366fbb37041de4042e79c5f0be9fc9db893469fd52be7bcee1a7dd6ae3bdffb9b7af044d50ad360c5e7f55e9bfeac68b60297c564a1ef746d7fa115970592e9a696d225a90652a3d0696ea7d56491ab726677a8b6ff8aa2a7c04d0562f499895caba79bbb56378ca7d30088ece5bcabdb3e3deaf428ab1dd5028fbe9ece4ea1b89db952e4cb0f76c2646d0d11c7eb833521dca0a3b519af3ca375f46cff3b2ae933ba1e51c789d61042df1f8098d1470ce11262bf8b992e32a3a2a83895b7f54ff479af6e97ed7f7a5917e74fb8edf74e3dedf35edd2b4ba399b9a3b775cb5d4eaa14c6e4ff30e5cb84599e0981dbfe2b8aaaf983e8828e7d385a68531d8cc8b3cfd9ce39095f2178eda8c1658ba1800e3e284b60c3528ca5209cb63f0c1aa6fabd9605d29889a6e8cb6597e9e8ea67adb5d4d68c9762f0a02f65fa144024459f481bc9050f4ec7c9671003e2779096d8e81890ed8fc485ab0344164d0f16104e9c4aae560f7b377b37536bed753f52a19e94680c90e8ece7872c56a8da8b8288becdc9a2faebdbb91a735b5c61b2bcc22c59b78cd8beb1833e1daa2ae5709a43dd3087d027ddf911a75d3587a365e9eb44ee16157f98bd78d4f729bee4cc9ca3cfd9cc2901d0e873e619d9e18b9712a5b42267e12ef00ba253a612a8b4ed94453d4c2a45910000800010005314000020100a878442c158301e104390f90114800c81904878561a89c324c69118c5943106104000000000068866a07100c0293ed899b5fa46d87b8be6087853ce6a1f438fc03712828be9653b91dd2df5507a819561d2a7b5c9fe79f09d55c2cc6199e6ab98401ba5ebb91b10689dfc7270701ced8452f556c5a98fa2cfbaea1ede5b1c2ce7c1336044916e47a798fa65b2296f08f496eda95803ee0c7f926fc5b017c3933a6946616042644f60c1d08db8faf29912bfe2cec4677299470af4a8887247b3d13b29cea80f13b0f7de16e4c64699a48d5fa2b76e3e886c2a20194e78d0c33b8e7c9ef561bdcf4bb2b7c482819059f2cc507d12d51a22263c0815792920761d0e36c90c306170ce6430a3a5a34bd1e88e1fd61dae52edd8d5c0552b50abd6f55aa1bd5c83031a9d15bcdae09a4901caea5482977b39692ad5dd4cc41a282f80922c5e8074587ae25483e8b20b1f89ea6ed9c1d0598134b7bfbe4c821296be75a063cee7d2d4fae83a3bfeb619c09a96d5154aab50e281d25a73e5ba5f60182fac47419c8f1238b412c43d9842b8eb91e780b1bc3b7523f2a9b5e2159cc3397a2c1972cebee567e8ad70a6688228dcd48e65d3430944ac733b68831008aac203710d0b11a26de4c8a5242049403e080029d7db09517ade40c8570d35739e9728afa891cf0e2fbb09e4c81aa1d49c6afdd91678be009cff51cbbac391279a2ccf3b70b3a5bc541e8b0e8f041d9199310cdbcec88936c7647a1675bebcd75a5cc378b03049543a3acac87c4b7759d78a4562c5dab86a04fdb5002935726cefcddfd8fe2cd979b797e80f97c1ed6bf9a7b49d3943e97cfe14d3a4e3d3c3f4ae5f3053ce11262ad6662f0cc4def792faa4f2496b2fab289d7d5342c1c3775439d049b847b3ddd66deba3e551a400b9acedf9a4b1872a80dbf8f16a9b1e6b1e33dcdbe1ae46712428337801a6fdb7ad2423663ffcea4fd71f9c5c4e1a668b73060c33b76e90620be048d285490e69b02583c6bcb52e355a5b868b122504e1e1e448a819b729c215220481e7a39e58cce30ee476bce450855e93fbb838755bed47ed982dd1df0b8dd40e6367fad067297e45fc51941564d862cbbd1e53086e397284a5f277599d9ecb098dec668b8662de6337c957377611c01d480f877dd7a17cf460773aac5db006c2251353e843d7a0a5defc08ca014ec139b73e01f41449d072ace8c505fd918f22761cd9b2f2b825a82603472e1eed9bf4739e1f5d122d303e471d1a5e73bef5b8ee72a15edbf3fbefc8fabb257e2c22e0b041c651d46240617190005c1ec685abad281986dfed7f18adbc9b6de153055d34095ebd17fb81a372ec34c5c5e0de0f9415c8c1d5997315e8f328e144c5ce29e85be535cc61446ae308ce942de1837c1a8b764e2f948d7f9b15ccd2f521b999154e498d166c86251b9b7f5861bb5eea0f1ab28b00dff4a8ec18cbfe8fc5b7b3488b8f4e3f79a91b0bb144691f34805d9aa0caf3b7f3748541f433fcf64f1a3194b5fe93ff16080ad44d65d708c1662ca27a02e9dd3062e3692710fc912f89c60747550521dfd1f2358c5790e39bc15c5fe37bb29e5bbc92371b8fa121f790f928f71fe6069c1e71b8ff4999423935abe9571a9f3592cba2d2bd587fe5129311fcd16ae4aed361be5e708e81312011410cbf4c5c35b87a81ce37eae262cf39a23edb1ee5e34371d26b2d05fe46a56a4dee1cc2309e7134920809b8349944c74bbc80c77f62ab7b5d0471f4317fa0b6899f4b8e304e0786526e7d497b7890519efe597b0e485040ec58b4be76eb8729f721b1cc3a74fca2e6704b7669aa2bd69d8a916f7d2cf0f169361923c50c356fd7238eb63ed42a2bc1983c4bb5a30b6a4100ce5f8c1b53e807ad9298434c32078e902702b211b6ac14fb27e1aef83cdf37effda3d08153fc11b4ff2ab50ce627a83298e930a2e503bf0e91ae24a29a00ca772474dc88d0877babb3ad3dc0bb6688615c927cc8d402fbb24da0e44e9d652feed80b31fc44175054631398b87093c6dd6fc9ebeabe8c99f5fc2ac0d6e78506412c2dad1987009f9c7900eb5a05107d9123504374fbf084ec9514cdcfd2bf6d3bb88a0b7fca5e6c8129683af19d6d0c6ae5d8fa44646d03b5ee0e510ce91790386d2f3937c28febedfe4e6a280a186b291142fc921ab2cd633e42c8200cf0a8fd517fac789e733c3b11ebe9b91be3308976aa577c3c11c0b372a37c27de04a2aeeeffedb7f3f98a50bde27ae5f72189ef4422c9b68bad814705f27816f132dca9d0be24bee68da7278b8a7623e249c6a75a59e00afda335a266fcb061a5369fc1a726ae343a4d52741463126d3fe5e235e6f65a857a4684beb6c800d2cc69bed3a7aa96337d74e4d1fb7a06a1ac98d9c92eedfe1d564a159223b47c2661227c6129514d89b4a459b9fd2fb24be9cab02cd7219856c212893b24322a7b75be9f20af560e2a961b5666a8a6ff83fa01207c8b5fb6850220f868dc7f0ef7185ba946ca45617bf8149c72137499431c9dd710448d8285178ca56c9787be4cd94c950cd66800a2611ba57d74cd112160a7912b74583c60e7e44869a0eacba32b70ba8f511a6c57c15e880fc3feb328a65dd7e8d2347efa488be18edd84ede7a7f99ea923f899a052af0d1cd7748803a69f72d46ccbc1a6f80123ded0b564b4e8018b1bac10040061541083088e08e57fda6dd6d90d51190e68ae99d9da7feb17a50af13a95c85c908be0ad9c4aeb4c33a2e44ca320ca47f2e7cd2a7da78cb83eee634b111cf41e8f2c01e66ec52d6c08922aa9a739b7ee21542d0981d589fc6e63580f571950a4907c30576beff09ecd1f4a12c2b6885dda9562d64c797e4f7355e60340bb204c1ccd40b180096197afb9854dc45934f7afdd976b1026c8236cecf1887c8a00c087f5937ee0410f53817a1eeaa64781312596e3390f00842f96703564b8b714c1a7c502c606fea0100718ef6dee5e14a64dbcc2054c71f1a42124cce7d2fff40330189eb48a1515671d6fef23ab5acebbbdd969e0ae8f172df39dc11b88ea4d6e1feccc1c9d6f19f4a0ba152aa4c1db8c8733893aae2af1a45a6ec8559d1048cedf47fab28cf2ce796bbaf14d1710608a9fad7246aab5beb1847fb6123d1464e4690d043ed7004944c8e8e4a22301ac8a12824fd4a8b7185961138138a72292e1f3d41a9aa25196f4c9966d6334aaba813626ab49869fdfca98619657c53a43e515d209a08f7df49c3ea4cdedd0732103bf460be340238b4c610e2d0ea76aa8d6a1521de3a9f21c72d1594ee201cd58011cabddd2a5c7fa6f914ecc927db430e49a004315189467f82732fa1bb6b12156693cb7a92e05c3d34e0a41906d656201a8ee4bc37e4a62ee8d3fb52917ac04657472330dbde4cc0d0f016afc46e71af5b4e08964461aea26d1a9c320882c840331257f5610ce0a3c53cbec712f8138d939bbcb6c3c2a754a710dab3811492ed2ae00c50bcf683b8991acfeb483cf595a65fd430d3eab0c2da24cf91153024b5d6afe9dfc4405b536bc49ee464f5e72ee89140ff260e9f0bddeb0ef2d9175ab023a667162e86ac0545569c0190f6add9a526b8a378c3da9e409d2ac4a09965a2a2205e89cf40abb3556852bd0c2b073e73f7887f2f0773a6ef9ac5820b292ba6bb476e15ab5308e93c90cac281154cab29d3ea8650fc524d5ac0ea857c69a76edef1cf9938d1e523f0594ad8a79a37fdb482795747da6f08b35ad495792aa6453c1e191d5aaef99f45a4f17d7a8af5b6c6bac4e57a0f032d02420b940e5703fc2adda063700afeb36f5a369019508b01a85e080342e73da4369405da872d78f3d5819fc35cd87c750a0651296d3b705e6b6796d5e3e18a73272abd1f51996345bcdc0e1b5fab565c7126c6202a708b15323a7282b2a76476cc1c8148f24ba7eb4535b92a8e85a245c6ed3b0ec0de565e543a420534e664735ad9b69ad23191853ad3472525f64e90d6353f5701c1dbea705cec126d5b774a8edf557350350d931b1860069945c7dd5321115339dd3aa67a890b529023eb536d160194e0cd93e4ab095ddd53e977bc6b57e9edadb0623176a56578ccfdb2c45b9e4cc6d6a5f8781e4fa863700163577aaf287bf3aa36cf96cf1090e06754e7e8c1f183f81193252ff9371cfac1df7792d8046095691f4b45802d2a41a170f02549854b1cca9dcad41866fea480f25c3dc1d83d8487f1090cdb9fbb2fe4dc03295c4c52639fb39e07c80fdeffa4ac8bd02d362dfffc549a8bc56fce91d3f9fce66b60a882cc6948265179d5c9ba5ffab9a8691bde607d5236229cf7e64eac7df383b11423056ebce828fd3d1afd77272c3f264e39366715d71d3293b30add29cf954bec84cfc41c5b0cc2fbba74314070cc3dbeae2893a8328a94e645f90fea3c5e8970bae2f009ab85c1f9963184e735454e80460283f4b2999cee601aae8953fc5c3389286171b18787a27a35dac2fee11d0f1c06ec66ad8f9cf4cbd1a240005bc3e35d35ed4aa5dc23b44904333865bc550a01e64de01c7d95c678b9177227e2927b1a14e59de167011e68cd89017bbd2353c7f134624dc8f68c94610dcbd1869b0075155f0e115e5d653756023629474a5da783e48151ce18ce3468a9c74df0f2e75c5bd42490222ad0acc64fdba82c1d889045494045fcbcb5fd931045f59e3ca77383081556c63df68507387a79223256796b4e5463932772d9f5dba372f4dc6ca3d1b5532a799cd8d064328a471534fc9cd216e39be9920a737abad397fa4855750ac33ae7b3cb3424cc2f3824913f5b8c55d4a2845a9c31dca6dda3105e2eed63e553302e279e4f6876b4efab6bc2c2c3003e82dab162121f6cac5a1515ea7c92fed38f70759f9d41de5176605734195f7711cc73dc307b608d2375dbd594fbd190f7fe41e728e53f131b2a3b9e70c36493444b03c3df3880c0ed2c93182b7cb1cd3af0e337e18a821bfc03684735e8011994f2263ba46921c6586385a1512b30d15d3eae3e1594a463c68a82898c0989dd643fb97967dbe15058f10f741bdf258ed802c145e845c51f968bb7e67f3f615d60171972ecbce54f2350a54a3cab7db3056cc16fa34085d602ec20e677032791e01b8bfc87e4d0c31ccddd2d8485a316e10d1adfe27de7b3cb561fec6b7034fc6feae1028086b53efad1b2e0fd72c78e94645e658209b4192957f1064d4a96a5c15ed1504f4e8661fd8794dbefcd7da1189f1a5530224acb6ef322ac62b0f10bd82258fdbaba321a4e8788b92d18a1b9517fef67b36dab4cb1842eab177034944bf909cbf398a8ab54197a9690d41a092a58edc5e2008f9b185f57873d40217caf86f022238517fc370e8f531726cf77fedb8e8c56ce37d791be061bc6d70d431895687f869a8cdf5571a556ac6cf7b3f3e7a901014ae8891b352d75bf88e6f3217552d045524790458bf034b86278016bc2f9b6d214e776d9b9d054ee93bcb7c0729f0c055f4917feb3fa71ad7ba52dbccf89bb4122218b8843c1e1d2adc2ae0e14c91e2b119c93acc19c1f2758b36aab1e35a9ee584cca7468b466fc14eddae336c4387adf6d0feec1a93c7083843fe8ddbc107c177a3d8786bcf2627ef96247aad11608d2a3ebca874fbc0a4da1e6f027e227a6147594e2d5766cb6ccd344eb950edd955863364653ea8fb740c5c813b23cd043e1c1da62753a302334a58ea7342aeef36bf715d3fddab0c52be8c820a6508d4f7075f39edb987c3b3f96199ef5e909adff3f5e6a46cd6bfe94c3a28cc663d636433134f7fbe29b0948625c59abb58ec2e638f95e7efcdb4b35e73804fcdf55f256dabc5e65563ca449056830eea09c77e89b593f326d62a53a39fc64f2e3be334064036a50270ead0a328fdbcef80a9a657f7cf7ec5c040fd55762bb797539a8af7cb3c736e8909b16f583f7fb20507ce89b04a1d26b8a1b75e02e9f21173414ed90ceac077af06d547cadfa2a2ef8dd82a3366505a2e46b2a465f3dc4afbccecaaa9505e8a51080637f927c1a532810317c4b5c41cc125be50e0d7dd5dcac002b0bdd5d7abffeb8f60a7c3672863cea9374ae840a817cbbbf1cf4cd34ec879e5dc10bcf2adfafd2610bc8b5772ae8bd4292b231243f7663126f7f36a373142dd6c828ab222a220515e44df020b13dbf1946fcc54468f66e1991df09c9b26a4cd7dd3f536e7f3118400d3c68d4a9e577559936942c6f8df8d1770ccef18d3cfbfb10a8dd4e192d2778716894e7ab900da978596dc9ab8756387a280ba2496d9e0958dd49f79736949cc00de151cf5062cf0a96d37a851471e0d6b87e315921961baf0d71fb19e21f1d798acbc8cf0cb69dc68d8ead7a8ccaa4b6126a340cdb72d696ccfa76cb36d2fe90f016c30de5bec85b416be3a8c6438d3bfdc6e045024f0d1e7ce5ff2af7df634f367b0cc005220c1c7c80164f03db5ed11d956b4d03d6f57a642fec75248398995d6a6b704300a12346dfbf2b497e867480b304777da8bf908b848279fdf22df967c2e5224f0329b58c91132fa91f1875ae973906221a14221cc9fe32316620c4ef13d3ac78487296f33d47ad2a95e17360eed38b632f5c1bb5931021bedc4b9f53f7682ab690ba487f6fce72811080ca5d3fa7f96914ea14ec2638dc00cc90a7ca0bc15a95f6e8940161a9d1ed36a097cd876eb01378cf4223462cce1d37982294602996cb60c4bcdb56fa228cce7823782308e1a733d1a9b3b5db85332cd9f29c9d8cdf1de1ab8e8ba06defd1c4d3b4c34dbfce45a94e1630186e3467a2bf0eee477acd33d04b9e7b85f4560d9a2dde124475bc3da5831b81c44009cf8b266572d85d1447262b289e08b555e1a30e66e4a63bbcafa224f9ffa39d47d2eb87b38e64cc7d24019f622a46ae4dfcb5692ebf43c332cf2d13a0189bae1ac5ea0e8c51e8466d57d36448600d1212125798c7ab76cb7ee5281315109ce8ec5f781acd5f389570417467d87ab5e9d7a194e234fa69588259a07a2a57b72d1969ba3df5ab6a5cd7ba871088bbed5cf8a1b113f2f1ff0450adca4c32d49d937e43c43c219c460e4c138ac302fbb38fd15000fb257185f06c6052a1d847210978602b07dc9aaeba57e49a9cf8812bdd960693ab923d9a466a66af1a01e5730915eb2240dd46e78cee481ce7d4991e3f2e82ca47b30e76f167e6f28c2e3439f6b04c0abef516dc39aee1d156385353995b08b584fab4b09e9426127231d07c7ebab9e38244c7ff579c02ab9964a769b49417f95a9395b3326f29a3ace2dae2a7436cb68eb3c1af14a51714aba71b1cf32f8f86d83874143c29d03ee93fc06c17133f8e5c865a7384712517c0e68003b379ba349953f2b9ef38f2ff5e6f84e5b50be7867326a9bef68b504c7a18101972939b4427e6012d7a21a79e2b6f8559ee3410dba5001174ab18e05af7b992175131a92d768631dfdb477ea8abbd0854fe26e5078f5a943bee104f87f99da0a53adfb98f1cb698e0ab7fe4f1f8c129d5cd87afbabeb2fefdef7a1b1c4b28a8d81c0309aa1c5b27601912501e6f99ccf0cda59b51b325e178afc802c29c7b2a2331af7a2e66617c43e91bdd7a12b022679f966fd71cfdc6f2e0d50600affbeb9d9b57186feb1694ff16b4c8602221fbdc9472de885986074907e813060cf1a7a86646eafdc9ecfa1295f99d374689d2376f81a2389da2fc28f660a74e96830e8b85ea2b97d3d748f1e1d455cc27a683a81ef492e49fb468b5647e7ab8caaa5d884825ed8c97e018617036318ab49e7fdcb611937e1bd2bfc9167c6b250126987bec8c01eb19ed2bc9137f9bd7bfbcb78e72eb7687cab48f72df5748885124d1a231ad281be19167d1c6798849e32ff58fbd1daab050915fc2da7e80b0b74b4dd71c0ecc604fe4e092d673624649239b31d97304f29c5f1608520f09b8a27add56e1a4cdb825d053c0d85ca6b9f6f63b476af061ed22e29496bbab605486acf102522090d2b7fb7990cd2e23f40163bff5f9cb040bc779b85acfab09399fc8aaff494ae1dfa57a7356f98e7f929f17a7b0cba37c83d4f6d8c9f6cbc4a688d7fc5c98912c8ceb16d20ff0562e5fc6db66c7c4266db30c7dab25ed3c36a62427d6dc80b35e88ef2c44ef32664c5c8319432d7f90c8eaa6ed7ddb3e5a6eefeb60558bb0e2f3c23c4b2bcbb1099d12bb421d76d6d9299cd63210834632e8bebcab210b2523091b56b68e673510a86518e87555e953e273c1fba0da6d09248d61dd6ee6277cf181d2a44c82702215bc215c4b12a6e498936421d5c0a94c28fe9a43829bc2632c91571f00dd1198726c272a0b2578c2d922a1d65f3f01805c113447d81152ec3015ba9e1d0fbed6a9e0769536f81f9ff940d2a3eaf80158b23e87dba34a1c96617015bee56cdd86ffe042c3441e49740e9ff704efcd9e07ef1c882cb4f510cd20720b6da1bcea32c2bb1660e49137d62eaa1e82ed4cc68866de405c12f6326b15bf058a97176665d6904684c149e024842d08838795b1f2c2b9ed0c870d84b23daa7d107220f8b2baf98a3cf7e5a4bf05c9c375dae76cb86e689a760585ee17982f72294d45e8b910524c82b5ac1870868159e58b468576135eaef9112aaba7bdd138c4a282c24c4d6461aab9aadbe2af7be416cbb1604c3ebaebdf9e9561981a31082907be7927007e56f4ea0c1ed0b48ec2537abb90291056f2219e9d482da35527d69e4bdfebab8a695b292f0e0b74bed81764dbdaa097491d9e0a789e9b9d098b77b2ca684b095a4884d0e640bfa9b85a93262736917045753305384cbd7c2dc96ed39603f4a8019d9894856e28d46156390f3976d1f8850d4b58159be2712bf8dd77415ddd61df4ffc3d21f478e790812b02b4e7dda43c0e60e8433f5c89e6c48600f64fcde808cc17f3eb97edf1d53f633ff5e260122f7b146727ec4730459908d84a5e69144a7657055f4c09f8b3673b5422173689e6e1747f72683250c4478074a6585272e59e5f8e3d06528e4f1b742bbf8e64edb68d33964442a92f63d4adb6004a68a711f9d6a16496aa04d08c5c911285b785ee371dce0825f4152f9c6c4c515608093ff5490b5fd5b128438ae5d4d09c39e4f025ae9c69433b8cc292ef831e122e4b7d48389fee4caf5b31fff04d18241479a9aec54dfa28b3d81efb960ffa2718dbcf42ed696faa08513ac1d8261b51331a0be62109f81f4bf6ead296aafdd24bf0ee9ad7ba21f52a9b18bd5974669684ceb7a2b8f6bbf58b9c1af0062febae782284d7963f8a509a854b520b931f8505f7ccefab7c83281e84239b6d0052e78ab2a92c171e7754f9f5a4c88b69e89a24a77abe9242831d94b5fc90a49ac0d4dee2106398a6782a38734f828b32188c03db7c4ec14a65b3ad8f9eac97623a2aa8bcdcafa82edc32aca002835fa2d377185093a6976ac7026fc5ce7899358594afe1ed5cd281afa534f72c46940314632916908d12588f5fe46ad917da775e32f1c862c8ad45463600a464c257c20ffb3326665093f3add3d018210344ce57c1764dc3490ed4eac6924d6521fcfbe09abde9cebe58a3bd133c1dc1b787363f5927b39f93ad9fdebea52524c7df95ce93cec5d1cbe5df269af779b18838474efc3d7dd86f73300833232912ded525acf39839e6d15f64f06a0b2ee196fef7c3e8e56ab899944f50b40841db255b76c418f758fbb036d8ecb1faa5874f4936a3a76f21579681c29be718238934ef0a3e019814a174c42e899c7c34fae5c5b681713e8ec24313724f880c0c65fa3584668f6ce3e8480d8fa02adc449f31762cc1c43506c5cab71e5fb0280f48629d35093b480ea2961030a76163e00c264053098628be9f86ab32fcfc6d87245d1c641abb18d9a3f2c8b239caa013aa07ac244134eba0347262d307a0022bc8d6652411699c1a00690e08a7498e3eb5f77b6f52b8ed0b6649b49e71abb5dafb5c7e7dc2d403fc5cb8d7feaf5e5f2fe564f832a3e04175e41df9b9bbdca8d4696e5287e6de33b86ee92d5938c6e160eb56f684cad57a2e7860cc1d33b554cb5df92197f45ba240896de3e53362acc0bb9deb662a1cf73b8653a4d4a73b8b9823d5c6ac2acc275d6d0fc5c56228719fbf1b972f2f040fa793a78d532cc73e9889bd97014fd488a801483da7fa081a691dda23892e787cc5ea7077d933f5d120acefd10e97405c3777ab30f62f5b5aba3afd1f91444e3b0f6ee2040e5761ac2f6f8693700a16f589c75fcb02db6b787ee3a9d96cd4c2732d6987d9a3913f712dd185095f20436d49291474a22187b1669830d1c61c2c1d15f538f2fee4fa0fafde6d07740e150e795ec55819f7adacec7995742fe397e3b7f5f506059a00722c86db5a9147a3d79d6cf421802cc3f475c7cc33f977d6856b70acbcd9f6dd44dc09ccb807115f44b5386cba9fddb81b3184e644e2f98db0c7a3234f80efee3502c3427be286134f1e168ac8908e9480a98613ca6177896d5becefe406da87dd7ceee004bfdbcb3b31f22b1f08d954f517b14d40f16e847ca2404d83b58ef708514d83377414006c3b31ed2c4863540661eb61e9fbd17fd44f887d918068ef24f282e4f00860b69f27f94bc086718c74af26e29474e145bb1bfd34062edac4a6f98cb6d14809141b4caa842e55a96e3d3cf531ee382dc0fc248f92ac7add55c558cd0454358ae2b8b14c7fa288a73b604149f07da660cbfcffd374aae9887fa45eb24ffe13a8555aa427bc6c9ce24074c9ebabf640b780a4ed4a41dd524ec96d7b9ae7d594dee788744c58b9c38186a402c1edf7eb31177f46c1bc72b3314a8382172fc70f71ba9241b73203b3843e96e6d1cc56af5dd0f9d0e67ed50566b43a44d1a83452d805fba5c712d104ed10c64cdfcc0342ae9c2a68f49402aa3ef89b00b17f026fc45f784edcdc104a52e8b90943a2840eb067d96471b4d9c49da532c6171a9706a9ef2f94441b6debb794ad98d415788c093ec658c5570640324d361403103b1ee9868da36fb575ef26cba00316b058c0b806854484a2a89fc89bb3407d434001fa169b3baef861867287a44333d30008dbee85ae4283fb975e03ca4e0d0096187e68522d23041255aeae14d9bf577901d28dfc95cc78c91bf8861e2e2630d545ec598bbadc88ed5424c28a3571e5faaac383ee736ccc2cf301b115317181655804ecd730e4374797abe8dbf1fdd5aa4b9fcefb2936f86eee65d12ccb7a99facbfdb6370b9007cbd9f21be60ee367d33950719e6ca321f9682a0b934e85d0af489f0981837ca4274990bf142b1f6415e1a8c2e573c0513cdf5918ab1247e56c1325e670b85613781dc446028d0a541ffea9efad700268e88b309baea1fe60ed018288fb9a46e9740c9fc6113de585b19b575cb98f6e1f256fe18818d4b3f2e26e84dc7b5f8a8f271c54a460f4937a9fe04136a70cd2e21db5edb88ccdd7b91f88a6d213aa360490d333f79755948b6b4cbad40c19f502c2dc851157cbc33e6d8c0108a4702d60f3fcae3cf8108340dbe0770fc09f10b022ded9a0c646cea8427903ec38540fa5160ac99a4052124b0d0adc090f61e4e1a42dfd850f8914d926d3f3462e854820b2e7fdea9d30325a4dbe80578176f946880c65abe118b3447c1c9a580c8533d2af7ddb3d091c582ba86452d887c25d8cc10a6ff15ca7a9b2aee1df554ba657e81b53ccc07f404f396178eac18da74e3474f95141a1b1da5ec812f34548682b239dbe085f98b725444c65826c86bcf522301dfac9596293648a97d3f4e97321d162b14d01f97aac08859ce4d6c5cdef09fa4f35dad7a45a49e16d270e1aed18fe4711680d6ba7d1622b4d4adbc3323a68416c6ff6a000cf9d0d350378f6ab37017a0fc3139fd4709a39431348ef454fe579791161990bc55bf260866acd3e76069f6dc2f4a4dad70b1577799f294ebd12f4340012e1bdd61f46ccfab4a0006c11789747cc56ded7afce0f1f84a9c1cf0545d5cad8a5ba209749f22562c8b9f38c9f7f61c8fc2ff46c8bfd9d9ea9ea3b2dfd0a0b833f4c6396f950daf85407014c63656448089dedcf0864da99071ab681ea6ec5299b6f451b35a3356c8a0375e28bb58bd15f60f5d37568afbba048811f2ad52d2eb362386c535ca510c20a1f81373b744b29f80864be2ff16ad4205b60f0134f79343659fda65fd95a2d68560e0bd2dd4af9679eb2da8cd724cb6c456c332be37f2e8dfd0125f4ba2ca669891bca848227255df1cc2c04e6b89ad707c5e1b2ee62aef5d35e09933561d087273d8f2d68d96ee3159d3573938a38ee3ad42895b77c140e387de559aaf4181eb26c67dfa1cabaffe2a4c922d4814c0729e83ebecd7e37c3e0c32dda1d4c6d4dac510c5a3cb94a65b4d5eaf3ab48298e443e34511767783456d6bebc32c0b397b38a600b07c4a8f578d4983fd7d3533c569e2e0c85b11cc08b98eacc0a0c89af423173a5ee44407fc5bb68ef30e9084b361f6a8553e505bdd0c8cb079936b3945e48f686f2428101142be63548b9c3729543485c7a10098efbc059cdda9052609b07c513cc93ddabf8782465734685a6d319092f4fe80b107336bd3ac521cb5731b3708ced5ded4272822663e7d28a520c7a417869e3fcb9ffd9f763fae715e6118f999bc8c650d5e42f85c2b92748828481b809442f741aca1334293f29308a15cdb0a1d089c3c457677a1c15f9082519fce785898efcb14ea85b0b483c8a315404cc8631e3d5a26cc8319b7385bda59b9258abbd25bc621f66d06c357191d6afa87ae22fe2d938b5442ae72f40d4d501dc989a97eb8057be41d5b0c794aadec173078fe48461c1ed08f46796267e551484df366497316864db6405320286de1d25e678e5aca70efc198a07ec0bfa5fe8529f36a44489dbca491db919626f32e8197d03499bf41ede1571d032239e020dd15de620e36697543158863a3e5ccc57331473de64278d852dbf0bbbfe6a4e9f03ea3658d6625552edac869b80c5f47fe136969d2a99c890904b8c441fd889c6e405e44b99882d58b4675fdf1371efd3dbcb445cfb6b1b7c1519f4d462e92c1289437282c262999f22c562376310c473ac76beb94be7de467f0a088c003aacbca25e314421e50714dc8a13d5ffe55ef300252ef14de2c337cc3b19b650a4e87dbb4d2b28d5776754308aeed5a0174913b3500e98785025aa8b38860318b0f0e522f7d6efe54e33314b63db66f631eecef47d8cf9944f3a14d988793a0c764cfd3a920441e37d2523df11bd48b5ad9ca9e6a75c059875821a6586d797096aa1e8b51005236a3d8a92a6402a8cefcfa5515989b6c9aaa37c1e1457bff963407ddaa3fe0e93a466956e7aae3f4e1abc0b62560ff1fab4773388523e57d4bc54ac86bd8a6aad0c3e730b1ba140f34b1eaa1d5200b76522724b50120f30840ed346aac4147f52748f287e4f361d0a6cd651f43be418f6d09c8931fb97b4a3c268d668c13db1cd37866ce4f63026254be4c972b8d545d66e9b165979f901d9c800c995facc899b1e0a8ffa7eb119af58b0d9f0291a5dfd9797c4a0e855285e8fd1f3362d1e2a59a6b55d35007be1b9d19c585f4fbc0e3126e4ffb5faee8a955c38bb1fb1e0f5eff0f2868ad95ac40758310abe054be014e6ff95451e0b1a5282b3c244447e911e91b017b6b3e63a274d41a3797024b03aee6f6d1552626ed6178bf7539ff9ee6b6d16cca12283ff9268c93a269cfe6dfe0fe42b0f13c55b8e65004a3091c13c8a997ea47c5b28a2e591ab484770dd25dd7daf7f10dfdc5e1b94047ba097e8830aec009a467d07d45fc7e9bae25224994b502e50a2942d8ea26c2e23b3d77823b58788750eace71e8623f202c3bca507b922626767e0ed54735e13a5a9d06636bfdc544e41baea23f78a836ac38d8fc68c2e68df951a8e6b220f740c502206f15239ef07e8e2a334988148f5fca2e31bcae505d4ef968d3ff32230d9e460236c006283581a254bdab603ffeef5b604f0de8802551b857e7dd4f7cbeaf4625bf8160f8293a4afad2c7fde4b2bfdf9805e9afb7e74192c4ac9c62dbb5c41c0c42a7733b0789f1f295d5e51e4bf72e3f0a16b4b468fc5499d1405c4324d83c8767466bdc426a0bfa2c3f04d5f1a165124d957e6a4a957f3fceedd46b06d17aa2ee9dcf21c3c570da5eb06bd1dfb818a8824f547c3aa07a7370be44d960c78b027295e4faa86467474c6ad3d3da1968b3bb386c3d940c51890869f827f22bc494732a3c9ac28a0aa4b4a1059923f58d7d652ca69854465442058c8d6d313adab4f8012b5886d362f4b20af051fc4f148408168817e5fc652a59cf06e305503f69275ec4514e63b67581b62738c4e7210be9599ce10517396453ce9c9c645edc4a7b7671464f0f445db667340642ed152649035398165986b06bb0e0de92fa4980511891a88cce8ba3023206b520637c0220a28aec10603ca49f44229108cc310281f4c794d8c230f67a8a26af4a97c48eaeae2bbccd208aaad47d17ee3fc3fc6820f930b2d08b24ff8f85313261b9387febec8df40e8581bfaa1a4b37ba011a6ff5c7dad37356ba7d54e30e6a12d05c8748c30911cf181d466e68d08eb6552cdc3cbea3d41da6207111553b552836ed0895244f7a8e59873c51c94fd64ec05dbb2d832b36cea55218bbfbd6e9d6c5cb60b1bb53ee7b31da9399bb726a7a4539022aec7e6ef702161aa1a8d353272b6e5e2c53e7b5848fc10c0332e0998748b8f96de056e0a8343455ae08495445a9ea3497a6947c1c44b8b55c59f181ca32bbf5ac977a4e3f8859bba9e8ee848f98b429f1e87f9bf5d4c633d13b5d66805264983806d198bad46408499d6039e32890a03d1525dae4d2b41005a9478d652f8887c8c8876c28f5430527747c9b60e367a67ef173321035e5fb5ac0fd7f3f1fe550a12db7cc11586895dfea22addc09eac023948733a18daea1b12210260d82a5e050b8adf19e1952b035a726255660cf1c2e537f10f31947c5c3b8ca425135d8c9a7d069d5e6113b95bb0e4b8696d189725cd37ad1a7fefe0453fc961c43c4c3152c3bf121e93aaa27368af0c9e0f6626ee522fe29c9c31be7b24e055efb904c06de4d902788d22fd597ec1c6f0f799ed3d3c306dc851cf6a820eae3cf9cdaf7a340a5b829a073b9e667961917a274ccc64c29814eb2fb797a4a78cdca731968e8bb74d737b1a0ae757585113f401cf481d14327c9a47bbd009514a1f54e489fc1c06832c95274986ce4318a85727bd2d2c801cef0e3d9821d9692c9571c7c93ed8bd5b25b66f37e5676207d2ec25beddee3e00ca03186a2329b0b36a2a1822cc4aa2cbc20dd6dd02beccd88c64964d7c087b9755b8ef7b46d143401fa452b2e48c93a4b3024ba23c547f83e9760ecc9b32fc9dce84c0749aae7e311f8439899b66689adfdfe6b90916035beada0719357a783083b594ef2f106742a4c9b7066630293ef3ee429fac61fa1e56b80f5de1b8d87c608f73e39956d33746f635f0b06fae20779982c22cfbc658792e6218632a86b88d742bcdd943283db872de510b2524d41d41eddb30e8c554af26fc325fc328d7eaf3582fddfd8699afdc492d67eb5388cde028af3f11b266bc2f16b376b825dea1b12504df79f355d73ddf95b2b6faa791daeaeea72e96741d9545ad722cfc7735f3ff43bfb00981b85d95fe422314fc4ee9c0d1436c638c7092759c7414ff3f621278d761fd26900db0b0c1c81c31f825b30c05717a00e453b90f46d27ad9611b425804e35b8cc6a5aa945e523097cedde937014d0639e067ca39b49fa6db5405b0114e19b57eb41f00fa530a576a27646f14956e131930b0746d3eb30d7991e6c00d4eea35721f9d487156dd72b46ef938efcf671f23af525064d7db14f0c7b0eb55d6291c8a7af25f048b28b280ec182d3306beda17e27140f3d97990306247fd9708e2c784af4d23ab07ae50e3f6171ce89f9c112a707c18f0d0031f2bd183190f8ad15d5b8aff87397b458230f7716ba765cd59355fd48ed9a83e4223cdf5593536f36a22801e5ac66976e0bc2201b4307c283eda31de2a4e766ea41a0ec24182b65b00d85bb70fb6fde2fe18b66c0a6107c584e069a5d2299bd4762f26c69bd46eb508e7e048a314089dff082ef12c5b665c9320a4f646bea134b40bd62de82ee7b7c6cb6f0a3105f805c406dc4ee6dc1d69a574ea079d58044f7317d68eb596e791f88d21e4be647334d95f2e3f6f0782d3402f0dd28b066e35d5eb796a064eef403253534930bd081669651f336d02317fcae3b9274899d810eea0fa10827b6ee49f30b5dca556c30de0d86980d1578d1d7bdd3583d5ec69a115913f904a925598df195add396d62381fc222198d7d1b25af5fdb6ae1641285129de9549c5850083304b91d4d83ace21c07e25db7455d4e5ef650c212ce6f3e27bcbbbad0d08eae288ed29c1b176d76b340712a825f0d0bb012e1861468d4ecece9114209cdb28ac4f21ec2ef09fca3e64ea060fa3043e764611e7fdbf6f40984485ef10c2e05257e7c33f624c310bd77ba058f108878e1c7638d1e2ff1deb6ce50d5c771f3168729fa3bb2a90cc33c7a1560340cd0a5bdc69cf6723aa5726fc7727386748f94c71f21764eadce8449524ed849975c27db335c8f412f6039bd74b2d5ac33cd2b91ade5182c1e66b84cac155113ea784dc54a48d1d9c77a4d5f3eac5eccab494cd6a5986c67775764e563d8723fc1d8c6a030161b4e410827337ae47bfc448e33ffc35a8c578351bd027cbc7f172c4a91d79db4ee63335a0123fd4348140459a8df6ac1ee728aa7af9cf33b1deb9204a5726e07bc4dc6761f4a3a62b7a4403f2c918e70383a10b1fe2c6b0f95a817f5c7c6029736c3ef35ab2aaa70adbd5ffd2884e7702fc1382a4fb1bad5973b3a33db5f8a8848f8b3b8e8370e6dee0f3e36b476be9a366293bcb1f38e5752831fb5b35b0dd70c9a67a8e55c6b31bc80abba06a2b52cd27ba8841e239ab665161624b8f2ad613e6160acddcbfea09057023fc87125efede61d3f17ff55fd4f20e86b80ab0abe9549ffe8850fa97eb56066a5d0c87ce55db4e97624d04c80ef0007d7127c66a4199b0f0c9d502e2a1e02664f82fcbe5d7ed4f1b61428b2fc943bdb838d5681779ec318a41f90427ca2535534e40c913e5f88dc801777cf49d8a6cff4a7ad7d64bc0108d20949e0e8b38fa1a9e8f525f54a25e8cf7144b7fe1e9373dc7833c3fa36d75ba6bf9f98faeccb47a6f898137563b70be390084139a88647faddd3b1ae983f450f69963a09b11a9ab24ebee9ea7626fe9a1403378cbe66e8ed8fd89a8973942fa3facccf640ba707c62a74547b2fa3219d1d719c35c447735c1b17ee32af54f84ada0f43b1fc75db790bd376208167e7c6b4fae36f7d35c0e8ef1bc865feef9f1c6c5c0845ac25604523e6120c0a0a0ace96a37e16182767b2de7731398ce8b9ea3e71d0d6ef448fb76dd033d57c32438e968159f6c7a4ae1bcf391f0905618c2dc0ca616f29f27bf12ecc9b9c34db97905d2300cb1f41c797095cc04ea876213914edc1c181b495263bd79111f88a692af0be3cbbdc27d87fd13d50a8aa10096d018c730d2792bcb4950d83065d4e8ac71416e0bedca6df1619fe92fa6703b54fcea409e13190eeb8793f6b7e51d18364ee65a3f1abc2ac200988fbcac149368d9cada14021d9323b5b4146d4d2911ff541a214d3a9ec8a47f9318289e62c4f50dd03909d630a83f5c972615de01796da0c6e891748e46fb1ba7b21aaab99762131d35be9ecc6cfe4ea2567de01b5059ebef108980afcfa6b9886a9c0cd5f58c35c76aa15a84d2d1ee7e3cb89640784e221c718e7727a8ddfd7634495705eb2163483866c835f1da7dbb26be43c78dac81b522a33dae274182363beb1ddf8f34254723e38d5c2714dc03baf7dc39ea6d5e712d72b2ccd688f0c17340a2d884acd0eec85995074923a94269424c21ac960de7209ba92e66d22e7a1903906753fcc72a5651b7f305e8251ff1cc5d26cf28c7904600e19db9a0770fa1847bc8b46c284778f92876572414e3bf4b8238f26d4a3989613a37324746eaef9490ac5a79acd3b07bfe1b54e595905e8e8d6210794301fd1029c1a2117521cf24960d06004033123f8340e379f1efd1a6128ca7490718794c8b843bd0ad2493769d61eaf500b4e4595f3399f175bfcd4074370ba1b66aa7ae06a01f5a93929024e5013b13c51be99bc0dfcae6905ce5d26e4693182bb919913c708db2b50c78922b357e79d17e8f511995661d3944f860040e839d79947b01cfb02fb61685c96bfc98e1c1179155a460279963bd80797c0b3020fc2c8949218a9f84cc5b6745e177efaa3b0dd7373d81d6e86c93501a24a9381b7a7af122303a633284635f9004fb6966857d197473561541d52df0e11440b1b2c98d36fb3ea57cbb60223c5ec994e96fc1e1f62bdab25ab18506e8051494e8690cc55212b453869806eb49fdbd3c10f53676bf19789a7d16176dad5064be4998ace2bcf4086beea38e37acc4103eeb5dfdc977d93020c8635f8b2ecc2f5331e328d925b424e3aa7c421263ebda75ee65d68133c8ecad4b4ca7c8bd679404e676b43054020bbe98c897d040816d8640c235e1bd0a850615318a01ec1010f60e7a5f4916c0c68aed2eb622b1d3e80e97599e334cac4fb4c60f68fb30e7e8234e33cf9bdc3e3d8a0adef30821eacbe9b6585bb8e6da085aa2439a3ce9c23a048d9d2040bf0d56c7ac01461fd7decd5d122b9ffdc247d8c895c1dd3aee9b1d7f9dc2457688e816806a732a9a89835027fb85c2a439888d357f500fc900ae4b025636fccdb164b775ad9df4634b1d80ccc98e8467334c7b6437c8031ccc81afefb5e4c72acd4970b72a7493e65cc482fb10cb646ec33fcfbeb3c3154a4dff79b8ee65163f10a0a49cbf963389986cf2a20e9c88ac35bd1c561dc606b60941560045b9b636075622e3e62d716ad39249c46bba14553ba2cd3636668fd7ff6023dbcf92555b90c35dac7eea35b798513aab8a545cdd11211d0c963e724c9a215108504d95d74a5da1ece3201250b67c97d8451cb6c16856fe33cd7e169635dab03c8aaa4c38cd25d4a32efdd480ce27a3c23e3d301f848735f802ae1d1bcb961ba29cf318853e9bd988f85ddeadddb8404a8b4eb62c22cb0cafd38a394abef4e935098acd1f7d7ad5ab60c3ae3c334346bf4b1f42e4b2c5e6d7dab0f04640f988411f22e40815f6d9c779f0a6fee2fb20f4ddf5fd04bbfb104ca249c2c0da58f8f72aaff7c10ffcf0ec567e8a183db584c15599ee02d520b38a91faa48378f78ff94752b9da107b2036b9455416a21420ad2dc79fb86a1d8af8aa4580d05954f28782c1244fbae0eca6f51fcab4bd3a4737e00492fbc7a97548372bb4ceca2d973419dda5b19456dd2ee0e43d58e464f7cf4f07aafdc752fc63d434bb3f84d6821d73b2328c3864e9a709445698d6adb7afe4b5f9de1ebc8cbe39ae1090488ee1c1ff49de8587f495fbe8af114e8288aece73c691f730846a3beb68b8c120113e741bb09f3f01f29e9cf43b11cf43592e8d250075eb65bce3b3d8ea7b0f259deb52a352bef86a6bc2cc842ec58b5b6a24c7247d868e1de48d3270054f7b219537f901ba354f63f99d7fe0a8f0a7e004233f56369b253744db0e7f578e1469f01ffbc06789e987c20a9fd27f2d162e007d8b75debe8a462248e454f4e30d2bf01ee1d45cd02975a278d283aa64c3a22024ca63493f9925105aafcaf58a024dac84d2ddc8d03635a81f9e408ea3c44a1a07645a5f4d434e3714aec05395aec3504b8a6ba9a700ce749b11034058cf6105348605906c64c05b92d5244447616f8f92e634699954b5ff89a7f3db25f8748bfc0080581302a5bfedff3cf94bd3f8fedfa9c0693606e7b3cf054057059292fccd343c6a1e1fd3dbfd44976700249408f77486d53408a3d94400815ece9dd28da9f5761b90365a885f23425111688a34e86694c5450e85cf164f873a0cc8f0e6a477a1fd4f1c3a6c163e894aa33666aab85e4ae228b38a6bcd8d246e3b5373b21f49a0785d988e4f88f19a57b03b6ba491aaf0c2a9a82ba2dd781187ae2a5423443387c74afdf8430b993216b350f2daf9fbc02b75b0f4abc5b75f20a4e1c70b9218be10795ca591ab6c555c48e4db23fd72d042de8b8d7391a1dbd799dbffde01ee482db89f3b21104a181224a2183fe6bba824d19e5e56d71ed4146994123056522ba43fa06603053130d54c510f693dfc9df3bde8582eb624becefa9f90671d734193841195fc6763ba4531541ba670b2d7fb8b377049dd63b8a2f4da6a4df825c4ee395f567b305289e766e061e1592254f5b8e64a32e5fa74d1e587494735ea38e4b50d3ead22fb9141b6de6278e7edbd2c983d394954a15b7e7513b96ae4d8c654803c9ec509f21948a2699726366fb38ccfd5aec05c8908079800cfeddacd2f16a21d4debda295e9e7310c53e85463fa21f947612e2973de14301dda8a156611fe45a45bdea8146771dc81268104476e4e26386b02bdbcb5cbffe94a198780e342c9adec3a888de0c2d95e68864b270f60347113b45a08e5bd64869cd7fce95206b6c24d20517543805364a1b3ace9ccf0e134605b784e567320831266c2b154983954dfff7c5aed42a2da1e440619fd043ccbef5078e56e2560e0b08bbf0618f455d72a3661738f09cdba8968b7254ef9825749b54cbc6c577e951f651ea00867fd5b51f0b1b7c2c5c1298497b5cfe1bece5a25e061eafc3c21fb44ac486e51f2a07c28c86cb19310d69fb203beba7b5d67369281745a0ce63d3a1e69aa0e19aae30c3431e52753980f932585670eb196a1dd32a2ec1357cda02d15e0bc4ee9046b8ef64f8e4fa9ae933e99a504d62f87cb1f064869f8454d409908910be18c92467b0b85bc4cb88ce171b648b60e920265ea0d9503cf28a21643fe7f01b466607200c41b20b78208fd872725b2f290a4394365201ffce04ce51457d8f597fc65b32afa0f863cdcfcc44bab796a2f8a50cd99c78d0bd6e56685179aef2d08adaf9a0f14f37bc4978e5d5eae0c716429878998d1a0f4d05eb77365756362062e1c3b399e2c8f70a1fc15b7149684be39a7f91ac25e10d02cdc7d9ca62f4dfd27bd1a4a08d1c7140d14501e48bce06573186008a73549b70d6d76a4b97845c322065c4471cd397ca8599665824c1aee1fa4c6a991a0ea8bf10927e87b06c58488df63b5c908fcfb548c9fab41cbe2ca8d8dff7dd774f701e43ea235ccee5c3b46594dcbfab627c1d1a4f3794e5dc0fea3fa015e56828d4620c55eb7008e441318aaa7b08369f38a729627caa3b29e127c3fe60ff42b25a255236ada0ee793da3f85b373deed7a40849294991383a71d6ea7ad4bbc60dd4b3a2550a076b6574ed5c92463cde6603a24fa0ef801b96de591d67f17c64810bdde867d568624cc8996cfb0f789d9cfa00e36361782fb03f41f8655c52f27c250371c6296cf253fc38aa6482a5421302e1a61d33c274e75fa3465b3d2c82fc73d5e13a29d0bf41e81113307f0805a2114500cd3a1322cbabdf926ff782f3c1f3fdc8776e554a67688ea266f875ca5cd67117a6925b87a42ca268820f17b723806e39d84a7d3bee1039fc7411a4d68fa12c28504627bcbd972face4321a0d0a16a10c8f106611b0bcabc8b827f87d4cdb1c5186cdcca5eaa9e4d88992806d183c83a609ca0cb808dc97c045b9e3650eb3f97db11d765870f2f7aafd8965120be1a527c412759873cbcc18e422832dcd251df298aeb532cdd6937b9df7015f59ede79b4c6be721014bce3907cb8a213ed6c11f5a20d6d1c9c01e70c1250b637a43e316861e89e784519816bbb591409604b4f2a6c05c41b8c7d00ba9e7498aa2e81a97e1a3e61fd0e664a8a9882b1393d52f2d5cd74c6ebc536f3cc88ff6c9c26ca1cdf373b26e1ba808d55fb9032d9bcfc3265590b76450975a7545a4f6a9910880f489f19c5e22d514c6309daf4fd5bb99fc1ee435e6d4825227938d0d44c8ed84181cdcd64fc619b8078e7efa1b41f867565243e7a4df6b848c45c7463bc9005a555e36b6758b989b0de2215ddd522711feff2ecd1b9d1976b1136beff1acc972832bb32fd3a251a7c664c53bea97977c603702f52a97e76e709ef7a907cb6c3df473871c5f2198816b8c49113d8625dd2b29d2aeddd3098feae5e123b6b0427d5182061f20a419408c5a270d9c20f348fcbfe757fd7e1cd649f00b952ddb1b689b02ca0529d9201b45595bd5bc74096642b98511887dbdea458fbcb4f17a0331d05210fb0db8fda2665cf8fe9d3b025c9ef5cba92c1ee1c2f1bbf658466ff92fb94a10e573606dca60fb9a9d48e19079bc4973af61bcefad26e1f0af450b5a20f1bbef02dcc2243a384f9c2b9a0b8a16d8eee11d16a75d90b071a1ef36e87b24ce2b176f039f141fd5fc6ec3bd8c5d5fc58080b7ce5f4abeff2e64302f533589998b70318d1a1757c81a96cc4f15001a9db05c7969847173e41528652ec5bdb8aa53f846c1eb1a12620b7919f531dec9d6ade6827cb385ed50dd0f4b86b5441a835d1baed5c427991a17e4d55c74b35a8e1a33e804ef1c244f9d3cf3f7bf8800d792c7a01c53c0717ab76fac58de4d88ae027d222e6ed9896c36b3813dc52f78f011ece44f2eda347cfe021d5f81da141073e21910383f1dda86ef1f670a6d6fb9ba22ac7cc2c3c574356e28ca030e3b47771f8278cf6839420bbe1b36563313d400a68ee2b1977ad9ff6a3c462a53bc5c23372b9faa7fa51778dc557b6fd3b5f7a9f3fbefe91bdd8142edbbbda36c3904a44a71ffb9c85e06f99fd5847411e02a0875b4ca20cc73b0c402b7466e99aa05cb36f42102753802ed41fee5d20850bcbcdd2a1e38b1b179c06ff560bf6a04286c1cb1fb9e659abe27de4d7b2d77df57f6941601647e61a9cb45623dc81ae6d8acf1b32c331074acf43d4f00f8d557c32348e5af99d12aaf931411fc674dfceeb72e9ef41bfa14f0986b436a3ae3c9b7a76988f8106e19d545e1c14c9f3e210b8c2a6609f4fb1edc7dedd0884e39d6f7c695cc1a1b297c5525243515ef9827503a7a964f859561613d85d1d671598aa8ec0d0b52bc2619cba984cb29b04a6769e9384d6544f6c0e2344e9394e95640727ac12634bb397b5b0be4d7984d44adcad1930ec2376718a47f4aaa3e50c2e80a17eefe557a9a488ffbfae4a5db4c0e20b3f95744f306e27c030bf1937eeb88e31e4005100a672e98e10be4ec695b8922f6a1b9ca45fe265e7481694a0473bedec1446d227f12e45a2c1c6202113c0c2d6d020d55b0b00bfd042c30d085acf9d97a72211fa086896c4749c628658f6227e77ee2883af0d9998b7f74b8d28afb20f40ff81ec88cc0a836086301aa723fed2b6b12191e234002953e1f29077c7d5c4133a1a714408fe0b3208b9b4acb131c23e169eae43e26c4abf84b6bb5ec2697728ff7342df37d16b7db7f71254855da5cece9b7ee7e664580289d114bdf51dcb35a4f2321bd6096c4b6ead2e8489022cdebf1569caa87ccfb678f2e51e6f361896527aa72c7aad9725f0186e27bc6698de3a10c2bd2794cdd799395aeffb155e7ee1e24af8959f49f0998d19ccfa929036273a9b99567b60b74f63159a531b180818461d12d83749e4bab2bc2ccd70892885700c96561897aa157c6e3a8cb287cfe3185c8ca58c7b26b56f65fc649c46577d0ec613c1536504a2c8ee98d96ce1d14a2f74040faa88f4d927b9290ecbe5fa3865f07a516c60d1adccc83ea904f84436950a62252ffaf025eab46defeeab7e1c69dff6829226e19ba21f2c22abd6a1e4990767a3141a09c457bca2f01adbea4d369a69a90e14731a5eec4c0c8c202b115ea2d42a18284805971bcbd0d68ed64a677d1755f57219e8e05237416655304278c8bb62e355bd786185320e810eb1c9da9d77ce0e6a0c0c346201fdb0b4cec9755c30889ea586f9bd2955d12bb6947936711f0359820338e159de5a5b456c07f9760ce551cb69dee023b203360ba4ba046fe533552d751aff4262dcd52dbc1144596339b0084ac985e9ac74ee13711cd442a5288665a0336fe00779b5f672b0363625d03457639ddd1d5f99c008e97549d534a00b062c967bc903a2afdb693eac0971aa2b9d4c6b137122bc1bd204cb94f2eb8c83241cbc9b01cb2c11ad90a859a2501e7109fe3898f25e1dc8785b568aa6b52530b60fb65fa5e2bf26288bf04226407784c3e423a2829a8dd42753592092a412274e55ea3fc61aae98280711a98c5b44630f9904430cdfba850710825fe633d976c52ed68e30c4cad09ce9c6f86609dcc42a0600d1ed32e1019f4968f0c9e9037d4cb14a026c43ebdcc01418955244a3acfc884bf57f9bc9775efd042d2fb2a9f2140e04dfd6f49aaf8fe12a66617cb83b5ecd5ad43975fed3ebb98c05213e38814ae175af441348a6a5d2fa1c2d267ae585a5cbe405c1fca11ba836d2c7b859607628d4bb36bd35f9d099d42bf1d7a0576d4ce5249bb3307f6e02fb083cafc45f2948ead1f3ba62c855599e67cad77b2003952f3c4faf664230f3035ec4e17de64486ecf538f07f874bc5e4c8e6ef750c9da8825a72aad5576dd696b18ea3043bdabdf3f075165e47c74966756958002c9da691d4c8ce7a4e0031ae9409203fec682910ba309ff3454c8ee516de77c402364e825a0866d698f86f3f997d1256e6ec315282209448f03faadfa6259a5dda06e51fa5d2edb752aa5c15d279262737a855a4125752557be32ea86598f57d30227f9e03f0e088fb3be07aac2e631b6c7b0eea3102601120cafd58a4e7c6c35c955e3dc84e0dc802e0a14fc9158c2e302446251b0f565db17508935ae8c99dd6e9176f28e67fb2e70b992b6cddd6472e93a36ac61a1c8f836ae78ac52344c9a1402cfd5e75077dcafd9432c5a45706ef69dbfa6a1805c5c93dbb205f20741ed11ce9f9598eb5fdaa627c55f6a71b54ba6acd65b7efc2b195b4639e757cf718b2c56a47469dcc2c316f5efbca744f3fb6318213eeb04dec87927a4e478923c8bf8edec87ccab90b8ec0af9f4d8c9db6bd7b48f09892a4d93538b3e6fc24e69e1baa3564848536f7bfebf6a5e6f02b481c77421a39ba0df2bab9c236aaf792455d93c8da050459e5cdc826cf50429267905579a3e54da2404c1f3564f3357c6772e89c22cd3ef6eb3b58b00fef7f644102e41afabff41a4f6cec36945dab512cbb8867c1e4f8bb4f65bb91ddc04e68432dff344d15a05596271a8c8a7893db67cf62fc31f69b27bf7b5fa7ee7261f6a2fcaf8d4c254b20171244aca7129f4b1cc25586454e3dfa250ec58c5e24b0e96eb730864533884b9f22704cba2d35634e5477c28567ae4544ed797756557f6909eef10eeeffd3c2c01fd860142d20b0944565b9e5281cad5e461adad9db7569b10cbe56ffbcb39081132caba43b6202a856373e15660240aad20ae16477561cb074e2ccf2840e643c20efeb64df6a48be26d331a64aa93af117746d96a6c204a9803bb1308e49a6a71e8feead80263fb92a51796c4bf1c95db0db79c0e31d31a03ee4e3f7b7c23f7902d1a7b2c5910b0f790ae23a0b6e64544bcbd5dacc89d8def95b63437651fed0e53e34b8f724be8ec92f8873273eaaa41c15a8c7129bbf800ab16934bd164febf2274d1216e23e9ee58ff1872e72b702a0cd50ee76cc7ff583d2f762c6643cf6c4a6d1f256952c403da0f31df38dc699ff1a7a538425b6f55b1a5b565fdecad9fc7f9f0acc4ee989cfe3a03ff71e72e9850453f462aba8abf7e042139792674d8f2d8fd1c7f49dabae1e0240c3b8ec4c8cab9961b00f96f1ec0de1413db21fcebb4834d8fae40943115c03126b55cea2d4831b5055aef2461f4f1450e211c7e6578861eedcd61b7bc14002663f4ee31d00460fd25d0df1dcd1ca15e2c817b87ec610326014aff7c176b54e7f9e2796281c3b6a97bdbde420e370a89e6c67cb406d6b93fa3213d5b6a2d66847fee34f78557d255265de528bfa143a543cee7fb541121a9733d8ee455b60e8598a84524d4cebdf44528c1fa37515ff6eac32649abe3f814b350f33aab19686647545bb5bc8056e2994a5537511e64c04c506b68d53fabdc46df0cfd2ce039ca4f1b5fad658f0c831df79cdf4d62b4dbddb4ee24b716de65d881d9a71cd4b2e0c19ee5edfeb1ec85c9dafd338de32a0a9d069c36479902494fbca4ec551eb2a1b172ac3c061eda39c1d0d81956b6c5c2baeae7acc63597114fa88c2d1f71f0cf9a2d9ef8f231298854520eb69e3276045965086a78b6e2e78826b1bbded04704710bf3e812ba0a383885e2d52bd078d40b7946d06d4feee5e61074f42fe800ff6441d7455b8c5224430a3246a941b0125537c667bf952e2a7ba975036f5e37f24397255320fb5200286f5c5751393d3129d55163a721d0a2ff9c2583614f122bd79308355b2fedd7994ff376a1e35a4b6196fea86435c0e808e0878373ffa16d62f5c3304403a14ff1f5c7c953f32ab8f9360c92d7feda643309aac9a9d3a0fb3878c52de13181e5be039f243293311c2011abd18214b420df4d02d921ad153280df2e2923d1ce51895d175aeb3bea47d5f4733c73c1577fc83b8eeea9513ae1b7384537cd83dc65345799b5b0f81bef4fc8a55b5a7774d7e8201c6f9614082305fb21af58f61f303d784e76f2f985d6e145de576d3bf1366f41bc25b3c57a8fe1a9345bcbae979d8057ad0bf2344fc91df2aeebd21b9ccfb3c7ba0e54a7c24162e1667b6f16d9343a288708c14462609569902bc68a1a8114b1d423b549f2e90a191f5cfd0de749d0f4788a33201a10c8ed47d4960f09febd2e2eca5697ab4a87f156787d8147d73a43a22360b63b257aaef351a95af635fdb33a56ec1c50878174336d0e2c22d8f5989b7cc100fd23a33e65dccc79070cdf3d37a77ed028dfc55e2f2835668ea5a3fc647b4d981d887ae1d47c94ef48c7afd21eacfb403ce1270dedccb4c899052a571d97d8753e4bcc9622b191303da79c19d5cc3b40ff1189718460d9f45f31d8087c08eb7918c1ea9c1d0ae799af4c833c3dc8d8c95318d59644d63b6cc2c00729969a4b3a447cb0e67d94f2570f98df8e2f74f80ba070766b94dec5613ecde1d8a2d085119c24e4cb23be948add915613f86266710186e93c6977f35662628dc7537a327f0a780b48fc830940bef44c1fafe8988e24724880cc393128d59f8940d716390fd5e1f162db2fac22941b0b4e686e85071dc7af9b991df95a237f3bd4d7eaa0cd01f82214e92d8c60d4f6895e733f709a16e2a535498bf2ca495ddf5aabf9be8824be4c34a2a20e5e4068374c5b8ee27106758d171729ae8aecca105de4601c5a00450d9b37f0041f38c15d5de20a41f31d1843a744455c57e58b4f0da1244cea84853e2e99e89e1a3bfb6290844925c2e485dbde80f6f5566bddaeaf5d39f5c52ee19dae828e58296703981648d13659b06d359fc254ac3d8d8387f036155f3104bdbac55625f3bd84edae025f2b30979388694881c91b335f182eafd16c2f5b506ba111d36f90c918bd674e13680d957ae235d2ed5819655c2339e6c81a729515022f187841baadd1d46164e9770787bce33ac60f62cafb0a5a39760bb0ac527408fb48fb9be63bd357223afea70e6ae343f5afccd9198282e2785df59534443d7ec147fa8c375b02488fb8216d40c48000a10d018114a160820e53db3cdb2c11cc052746bae89167eb5c333ad8f53edde1d7330cd4e445c93b5ad1396c2e494666642bd0d7921f3187d96551609dcac4aa44a7d54de1b21b324e3505fa46f681b37b30de4ac066972854380ecc7dc8e4da539a0844e8d91c5a46a51fe597888c2a5a980a790bd1845fa25df22e9df003dd6eaa7fb2669ebeec0b78ac79bb92b0e31eb8b93a72267a0dc4c68d58447d89459dcee2f5c044ea15a7d91a66a4fd10b034f61992704f53a89479e8def3a7e44058e45ce5c96be1d0ee90bb2bd12b86ef8201e25b986d4264ebe463879d44268dece70b1eb08ab96fdcfb85ceeda653495c06ab1eabe220309cebd167196b8578ac95861803fc3be626b5356e54810ba0469e8616bcd6e696e806d03ef4ecb003fb567f38ad7e4cef29b22654699a6105befd79c5e9c0bb9b7b8f1e1b206a150b54b73684b5298e6da8fdde8c787d2bae4a2cf4b0dabd33f376d12a94d965674d938bc470915f2848d36eb7d4f48ff6dff225ede0d5ca970bed7a600f98d3fc71f18638f0e21f6043e4ff06c991a1c1ee08908998ec237e5c8b5edecbdeb186530ef9d0c20e89cbc0b75dcbce02f085d042b4f536b74ee6c9e55a769ff588f7f2b354df17bfaae565648243a51809cd6c141cabc5f201fa805ff28d1be413505eaef82060b026db8344713a18f3ba26fb226d76d97a09e222aff7bdeeab49e2a429272ed9816bdea1f715fe2113a089b5776e808d2eeefd3027c494e2fe4baf528e3294d750f6ef8cf121970c788e6738d6504bc377e96f7f3b654947962bd2947ff15d576a7b945a4f00c7ca277c65bbf8ecb74cca9f9e3c1e42bda94e935c36eda84f478be212a8444d47ee2c6d700267e0991e103b6735cb8d93236631977b3b77dcfc74aed31cd949f775287e7a0027cf56994662dd2674229d8a302013b500a9359b6264047e1108503298d2ce38c2c37fdd0644c00750705998d416ee389179666ddfca1048cac544fcf93d205ac48e0812855344cbbf0d375633b1885b308493de10b8b6018e0ced0c03d9f668ec7f77748619bd959cf5ad73a97e7c3e332ecd73569d8cb5d1c7955c586c4e7256edd418c9697947e3f0b6dcba23fa5fee5076271d8b73e2812bb0574ee998060a5c44e46779058208084618a8e094d077ee6fff5109fe85857c01273499a356b27653a15cc7c275da85bd62238c680a76c373b1573be54ba2d8af93583658c7219fce13967a5171748d2626de39ad0e8f38873028403a3c4798985c8d865f39a588ca070a1da26ebf6044af350203c2d87866f16defad122f99e76dcef049ea28079c5c121957985db521036c94deec026cfa8bf857f32074ef03f51bd47127504f607d09747aaca14d81ebee868ab0a658ae961d8d581157f7051f4ef321c0beb0d01ea5f940f0b3326effe9adf62ea0bb08135c0224c55ab32963203d0998f3c22e92d087c257ae303a59aab2f5f9c1317446d5b9f9a26597eb11790579ddffe2ce8d7a7f8facc1ac25195ffda0237e1e908c281ffe03452e87f91cd5b53abf052d8437a2f0e17815daf6480dfc857024ed6c392554b4358b9481486a7a1c4e4517a3a38473af8a9b3ce52ecf7b6e286931b3e00b8c352ebde538fec08e5319d0b9318cdaab837901ad46d777ad0ab926e7cbd383b03a6813c67c0fdc29cea41a7dac2b972f84a84411ac01f9abcee2a518d4c0425d93bbf6000c1849343863921e1828dc7f7ebd69922e31b972eced19926d620292d08402fc82b540c82ebaf3287978a3077b982502abd65bfa88933565f02d93fa7eaa03707d04948a692dd794f9d2c8503a1f28b113e1568572706b0ea3a2eb40697ad1a8d3fd82ffa03307a4185cdad85b4bf3a496e59ff81894613c79d171ef918e30c440513f334ced64592621994071a71c06b0672d665cba03458aed4b4156631702898c56be328177c24d25f689cc3d450f0d56ad43a31aa276e1bab529bba0738622e0c493d5259909af05d289f2053b59a3d21ae15436a4e972ce88e2cf2997f0fe1531cfb68672ca6cd2c3e5b7b2568d59326fcdf7aa7f54a76b125a02295262cf3ae153d2758b834d6b3999ed1909a684b7134971034365b2e3ab6e2b9d72061d75bcb5b1af78dc6ce30a7ef8da53c24a0d3626f90c62712b3fb44c9d19562a8fed0cd2708d68433740fb26ad2418b9a18cec35b76e459ee3fed30799121a1bbd4d4e9802e6508c6efd4ec43cf874c3757acc7859ab1f38ec79f3eeba20f738c76230ebf7812916e5edc7befdb282323c6066232c79959bc0cdd7174e0aee21b7e034e722665e05843924b856a53daf7019a1a2aafa318637d08a97f1eb26a4cc80ea1aacb29f31138e5be01ce76cb01a5460daea212dfa217c2f2730806843667629142f7f66ba626ea270ff4a5209210ca8f27736567986f4d1e82d5e8420ecfa8441f3d23ab6c3973f842093dabbb8a2c9ac0c3b52f2ef88123d6f4f587cae92c4d66526bc10e92cc7e452adb5e784b058ed1ec501a27ef60cc31fe671d3516ddef7bcd7fe476e4a7670f6004b56b2cbb21240ea4fbbc4caddf3428aadbb7b44bea7ecf733ec10ea04a099f302e91909962bbb6c13dfb3811eebaf675c8caffd7175144d68ad3465d0fabc3ddefd431e019bd333fc3732caf28cc3faae51101165d2acb12017237db95610cb06ea2d5d06219f776d19282bd8b26e31c1b942d8a322bbb59e7d42c01e15ebaa5e30e5950066fa692783ece7a5c68ab0ab31f3d024d2f1e0bfc37aa18dbaa3632da5e6314ebfac376b0e4bb5930b3dc9695a128b38af303e230cdafc7ecbedfc86d64be0426feb74e143b8de0a2e84d0bb7e4db6af63b31c6395cbc7e5273c0936e349b8e0f55465b42b93c3da41f4dd7003c2394d1008fd8f1c0d8ed8efe8165099baa46214b314ac4b9421fc517045ac4f1a057fa64f89931c38887974c80c9cc4c67548a081712bb628c130fc1a1533517b757deb5c1b6e014bdf14f52f1cdc2625c2569ce6c4b2d8d6464d87c836f28effa16a744620eba48accf06c13e8cca16560a0896293be99db391d694a45ccc61596b4a546a9b80905d9f576f904488bfb55fdcc1d798421b5588b13ca566b380bf08d69505f0d9e10873d61abe16d035ce85c16c632422e1b820e7ba4b735507238158cea84535d020806c85e3b523c7744dac9eaf818d25eaf8154df08cb9c47e5c98f65edd51cec9c1339b8224925b45a43bd14e49b2c400f00b0d855a2edbe758eaeca385ea7cc30269f49668907338056babdacca8fd6cd7d7b292d62c2a626c5cf72dd11c521fdfa06961dbffca2c460be040cf343e8a1804750c5fe884a09a86c32548e2a0473b5b66ef03e85aacd27e153e845a5554d5d00dddbeef24e1b0060069946321ccecb0f53e9fc5af69283ee4661e8034653118c321694aec67e9b083d1eaabae22c610417e8eb8a1b683cf593e20da3d47bbb18c787c0ce11b63861ee7ee7bc2621f2f48016c09f23e82dee32baf53ea2c7ac4b534a0874fb51233abb3199095e6224c9d9d17c1354c11b55486834a9db4ccc62b81dc8a2ce3a1ca7c6aa0936c0a8a52569ab3a51710d0eb5fa7b8a2a5c91b8dee255f049369e38b2689b24e015f9d5fe88a646341651de3964040f430fe4a1c684d6787cb7256521a225f10fed61680b34f668e1e01e32cb06d5c982893c74ceb7448200157bdb826d1ea4233230b9ed330d4ea8e9787d079e41394e945a29383a0e731c1f2b99cb8ac6ef24113583105e0daf0866c7322e79932803968757dcbe0498ea986ae83591e554b4e66cb7ef98256f379077df0eaed91b17b80fad47629f916fee40c769190396f93822a7c422820255eb0bb71bbfcc0a4ccb03db10e858c5486e85719a713987d35e646415248b3b246ca984b387fc6237fc6dc79d8f90356fc435bf4ba1644b4b2f5ab370c1971b496927d10b9fefd89f6858675c20b9670e918ed64a3612ee914e9a072a6b00f2be0f8b69937d80549710c72921068b8f33ce620d46bdc3edf28978fed4b4099a2d26178cb83ad4c6db955a419f610835b0388c87d9c30823d6b8dc61d0b32fc679d1aba0d9512f351e556d55c6f8185079728d5fbeea1eada78aec31873562c99ecf9354f1b072f6ea6855e91b2c501bbfaae52f2d36ce61b5c82e1ee1591ea83b497995e6b42a04f3f648a1f3ed19d1c9e51c1d63ac1b74990891c83eb3410c69a99c2c9fb136004d54c435ae879ed2f515762cc255dfe3d3a84eca9f47bd412fb13e053e3b9a1f3eae7a3ad7896565f54d1fa3e82d42fe092824668eed594a8b880094c4ffcb0553b0f865149cc9fdc8e85bf532756b76131a302986c666d0699974c7182ee7d3910533df6f73bf861c4b501317eb0a3dfbc38d51486962962d4a343b444b0b232c3c7df60e3427c5766de53f0aab2116e301ca09e7ace0236132a5332bd4ea140082ed8df515a98d14f454eb74d12826525ddacc2537f24d065261aa850fc3690f090a5fef620485d3ce5061a321d6999fd5b1330ff306cc680b816565baaf97c3e4cc0f526d1beeac7bca1c8fec2881aa5b6f95f9443411d38aa8c4ccc20b8e1cdebe9948b6b84093de0c575e66aef08ae7f9cbade94446df7420e7056d7aa74096590d305250a39d778bbc3f067034021a0927fd1d6bc793c63c75e03c34e3db359a698702505bba4ea7c61b073b0375a45c53a7a159ffc0ce859a7b8b3e4bd35caba645847495b9d6aabad1031e014b0b3932f90bf347893697687eef526a5feab7359ac53d886bc924625efeaff82dc19cebc6888f50799606328a241a952ec5dc7e7373e43004fad8a7d200a652348d9c71a820538cafb2c05c9cbcc73612946c6743f6a58ee154a3d59d63a863b4820ff12f6cb5cb26a36c5bea453272ac46ad15c83d256b5c88eb8e285c123ed2d5ef39c551b378e2ae53bea59aa51469129589067629afa8b005fa28bfc7abe831572804d158ec5094d081c37c8e3e918447986d649d3a0ed3c42ba996abd80fe3d0353dbd26f1ddc47e8a28ead2be17c3cafe04f274209aa6c4926f6c8535002c55f017c1c4d35fc1dc5431b50801e4e5a377de84829a97dd0e36fd23dbcc8f8e88de1aea9b6b2e9c319408e332922a2a0114ded2d6218e2a0390f9603d1e93a26ed98061a2c84095b381759e4a2dcba26ea05f62f12a52586610837ec29b8d3af9ce3eeebae6608fe7c7392d7d9a94126bafb3a07d1daa2250f26bff8a2ed203d9216a9c1ce1580f431644ac429c7f6d7c93664b8283c222be6fd1dc58ff9ecff431d0b3fac4a0d109856636635b19e5149474efb7f8f8d6693752c8ec11955f8ea5d45b548e33ef767ca573dce91c1082630089feb35dbc9108ebc288492fbbe4668fc31d83e63845ce7dd50724c97de13887b57c8a56b1d5621a064c7713f9374fbca9d66c97b3e81a3758a7164e6025df2a560c2e341631a0a99bb3e9d83bae2e401ba0d0537cea699629c8791ceaa532dc93c726587c4edc3db1e083b9e67716d6a5322120632952a9b4201e4fdf174f97d69acce4c553a1172b178b86d274c412035999ca6c252725ca0bd3dfbc9eae0b831de808bff70c40975b9e9c32967236f371512e4079747cc161a44a150297d8e46be23e19d8f937f6608bced0e5ebe6a8205e808a501051eb348abf6946fefb62ab64946a16f22856b1fcbe2b6231407057c485bb89f3d065084ea92a8f1cd1a690699270664bcd1622b42341875feec4ae7d9d917b8f5eaf5e12d4803eca3d1dce85e371081039021d0c3fd6fbc0102215964c52f316af1ed6fef709c6ad665dd5c906a9da19a4d3a53157885066f7dfc3e9b46137ab65244ad8d3e2a4ab17038197fe5d3db4fa3fc75422351ea9c5cac1a954708a8924a6c239bfb75f7e7d05956a7efe26643793a917cd907c6fc835e2427223f41a3011be31a22eda1c890649e6308c3016c26505eaf966ce548027d996adc5be228d66d38d64d759f49f585b36b8737581f494b35ba20fb1b6631d7900bff4777ad3f17eea805cf7c4d349647eff60487f8851aaf6fa809051339f68a01ee6fcd600e465e2ab9725eb3b9668ae2338d686c7e9e3c05c62fd183fe75c9410ec4afb7c2913adc108b75bd25008a55c83b2a66fde79ff53681be41a94854af253b906950783188012e22eb2068d7d2bd83068d5a06170bf869de97d8841ec6518890974a5c8611b0442a71494f1c3919d72e90e631664c486d1a155c6c5f50f63c313a2c26c14aed24825ec841295c912b7f2b14a77aabda00a40df57f2a120d5986056b3786c08235193b9ebbf062871796652c7284c95146726fcf5e7d04c618ca4b45732c828524aabae9432c15f12a1b4cc85c00fc17a1f03a6a78a98e87d70571e4bf328e6e20be393e8cd14ee656378a414a16c05080624868706cb61f68811b29a7d1505f15c1f745abf114037fc7b41254697f524259b2616209a1da24290b21393b2f28eb44c7517718baeb633c3c32f7055d484b36534756c3d795b18126d4d1e335b817ecc850a35cf182d349b596006f2ccaa11a4d07356f6cfffc83854d4c7106b41380aa26e86744b6425dc3ffd9f92294f5e24338046f51bfc884a237730d64f5aa6fa840524d1542540b4f929807e8591ddb3785617c38ff21abd62fac2136b3146b2bac4c81cadbf1d1f5f6f2bc4c4bfb3dbb050181bab86a14b9a0d0c10181955094370b28248f7fc75080cf1fca46c3b9144d904d0e7fbcc816aad27d37858ec77039fb0679b61ecdec13b6abb204220526a1cd3feb2071023b21afd561b0cca3f30f434b8ec4ef7fa7378324f805def5562470c86b68ff299d90ecc846698141a3a61822fa23e938623e8e786785d365109ba0da30db7c5e3aaac20816e4a543f7d116f45810dea0bda822f349a68ae4b50a41bfb0bf23dafa8e697be1c400937276ce5fe794ba27ff10d70fa62d2da03666ebf0df815d3992e1c8ae75190ee1e24e37a542ef970ce8d229d81803a985e59e234ea1404fa4a9df4d1c1f998c5d46861487a53ed7d0b978f232e3b1491d851831f719368781099b2534f2c6d02761c127ae2d71f09b625fb6a073e3d4f0ebb6694502042636f82b56b45b5eba0d74449febe80b57b70176816e9232b331cb47f783f86fad13ea9af4f7fda6f94e632d8d32ed06f85b7a55bc8f222cfc053a54f95ec500c32501553c5604702e79eea31d96ab44a72e04815dba9b8a8c2163332f73a02e11ffbcd9b9a3ec0497d905c333bd52b48dcae68e52bb2c900aa2d7dd9161fbb63f46d80d9d807abf6f7372a2e071c2712ddc20f8cb3af6cf5e6cb84b17b6e006fb4ed663d88f3050b9a1ce756e0481b3a85174b0495835da89075e912f0488dbc9dc62cef24399227549402fda27c44e1284d0f93ce3b82e60eece08caa6da0b90d2fde829a2777e6a630a20a713e4bbf4a1264967cfba90dfeb55098fae5842fda2f540754208c543f7258f7be54ff435da1bd851f8afb2e8602d176e36116488fc4607beaf3d16011c21f13d3d1bf1c37a8f5d972437791bd463b2ad71b7310ac20bf906fd3741b0d191fb4bddd82bb79f32b634028b79b7b57a6948ab2a30e0a6c7fd32db279749b605b1790a21cee93cd6589526af0705f6caeacb352d35b092695623084d48e75bda2904cb4fd037a904a7d57409a55a5034d78dc1830bae02df36e6a4b6ddc09616e769cb45a286c02a99899b46615f8eedd4c9016b03d2eb003f4bbc1a1054c78921800b44c7ae7d670ff553357112d95d0966d042a1b229290bdf7de524a29534a32b107e307ea07cfb2cee39d1b07543242c9a15b5642a7c6caf3cedbd181ce09baf5111fb18ff41176255889f6d131d29b5f8896d11c1584cdb934adc1fed1fe6e5c3ec0e51867ee76e3f2cf5cb63635def3c59e45db469ca01bf33037ca6a9d05668358473aa69d70b9e803cfbad1b833fbed857ec32e46a2bfad8c7e3b95fcd67231988bcd60769b2fffaa8d1a55ba32ffd57034aecdb348449cab1b073d77de4be44e40397e888ec16cc6cf3faa354712285fec6d4ce0691ad6acd2cad2b15ef4d9b77d1ae26f8da79a4ce3580d9ace310128de6542b607145b90d03380c5a00324e4f88001246c4ee8431609fa18a0f9cca62e1a2f107df69beba1160a7e910dc251fd3456409d0f3e641ffa9e5a8b7019d78da467c3ef8cedbb8ccc3fd3033db753d7e6dd4b5db8526facd4779995879b7661efd023ae07a7047a27cb57ef7cfeb55299a502195d6f3a49319dd81a7d4faef7e1f1e13c30b8fd2dc590354c71fd3a24ac2104270e096a48d2464e52ae27dc1120b79ba7e826dcfea9aeeb7a1b7e2fd3f5a5773ef4b710176f7a06a87cc962a0f42aa557313d0654de8575f1ce0794eaa2feeca0d86d9ed814bb95aa52d54259a02cbff29b3b724dd12345759794f257dd52f7fa94ba5d7ff29dd5b81ee569fcba495d77a436507feba0d04037e69961055af21bf3d430f992a7f1edfa12eb5abb56ae95ef91dd26b51b5561b12bf51d75fd0d9731857cfc2a59cca6ee65a35569e95accce67473d289dd1e082fd94e4df55071235fa421b76fc8439891099c27a7eb62a49644edbef8ec304844dcf95bffd757fb2e2cec2b5dde04c71e1bf261289401a4bd07fcfb7f0749e05ff7d94527e89acaa29124d2c8a4aecd5d0faebfad931956d215550eb2badb3ec43a1d068347a1bee8e1ee76275fb9be35ed8953dad38f7aa3ce015d9e602bf644fe399880a6afdd6424aa516f243fef8212b6d8d0dd4b2ef67159f8e958259cdbf1cc2abbed6e4b4d5bc1c167aecaf7a41ec3d6797c886f5a2c7b959dddecd36bea11755d75ae63837ba8d4086556fd56767b42ec4cf09f753032ff7734527b9f1b37f2a52a0f15dce9831fcd7315efbb1ff843610b3301bd55b76836f045febe5d7f8f04168317e1bb8663b23db0d8e90cbafba8d7fbfc3d69ec4f1e19d85ab6d1ef6734e4aafd6a968557d0f6a278e0fd9875c4045a5aa9a9565b1f59515aaaa29aa3efce35ac3fa3e9bf7fe9c6f3735e27a308086649a3ce985307992ed0105fc1e26760a61d243c3f1e17dc80594b5b81dda026d1e2580fcd63a188002be7ce7321828f9d1cbe7cca400d29bbc1015b442945846e2a8fed1fc1b100ab481b44e6b57eb581b6bf19ea8ad11ccc9cf61f533c4c8dfe63b08655f081db3a1b51ed09efefd37cee73efb9ed3e66ff2a38cf259be7c185acb20e63d2f590380d63d3fe73ef28b7fa93f109d9bce49e9fe61bc0f19e23a67b7f8b2fa4de9ba960eba977656ce39ca6860e7ef3233334366e68706f79c73e7cee173f0c57f2e9dbbc1ae9300aa1091f15d97c8dddff3e7cfdf797b68b3b9fdd31a3bd7eddab56be7a063e7de3976ceb1732557a2a48c445b7be7d8d1119774b77b7b7bbb63373ac3d5a4ea5c6bde7b10c628e713359610ebe29a65d399abe85d9dd235c268e6ce5ea2aea4a4bbbb9949272728288cd2dfb7492829272929292493929494114d494911a584b2949414cb0ad72572fcda55a640b7f9446b8ee709d4bd9506ee6ef7f6f64dbb63b8d8eab1c25401a2ac83cbb977238d851680be9b9082a77758a7bb7374b7b7773be79ce36ee79c73dcddcdddce39e7b8bb9bbb9d73ce717737773be79ce3eee6ee6eee76ce39c7487a58a7bb73743737777737777777777777777777777777b773ceb1e3ee6e6fdf2a7059072f5c1792eb3a0c7d248bd61c10fbc3e87b8fdf0505ea3f5d0254a0e048fe589266655d5816ca6cc4db261c4884618ab0e76fd29393939393d1a8bba973aff243a9406916b4bf4d534668c261eeb6da4badbc03a5609e8e953e515227b9fd2a52a0cd14873b4f4e506a806668c038233559382c48254ab211575656e0caf3e6158785b61e13a56ed36aa99a73715fca6a68a90954a559a5a7a3ae92ab2e4899a94d2676d045087355057375a32c2ccec2d22c3c554ed7b995172f64c2f1ee868469a5a5868554f382c280f13f9322c9085f8c18de5c85369c95151616be308ec280f1436bee3faba9955a52776fda65d13333333390cb3a4892dcfcdc6839f116ade1682ddbc9f116ad89dc9f64c870193264c86876a1e9a82860513079418271f2f504a5aa18f95aab0bab12c37492d13258063465355664b83761c078f1a41b64dc4051ddddddddef2070fb9d10b0e53a843e63c68c9e318367b85168bb000e386828d48c1939e40053d392d948b9b8e8a0c3cb8bd36460a86b06cf782a46280a95d5d0e28caca65fc582b6b0eb59e35c5a3cd529862e598d0efebabdfbbd5f2aa776e021ab0100856119da70ae0e3abc8a11f9b2c2f2f2f202c6cbcbcb9b5e5e545e5cbcbcd028e1226194f41ebfd9da162ed7974b02bbd9ddb9f7daf61597c85961e522b53f182513b0372713de13359510e7e2deba30fab2e976ae734a5cf72120ef421d111f29b99149a6d1745712d6b5a6eb9029fae4844f60c884235efebe6cb7065cd133219d6435282728282824931214941145414111a184321414141c42ce981397ff45999fd790d7bd6738e275763a97f74e6e4e0ac2f8e27cd8ce7d2f31e9022ffa0a9b1866b92babeacbf5605da18c5a34945d96e8cabebf723d5cdfaf32b31a4c947175cec5aa9739ab015f3a3ff8203bf487570b7af9f5006b8555e7a89e952fe75c2abbf1c3fbeac6efb19f79bce7cff5308f29824ad4fd73be957bbaaf545d0fe16ff2ebca75555895d53cf84aadc57e79f3fcc1d7ed8db563713dab4b2b0768ada624ac9cab68fc70a3350f62450b5a1750eb75c1fd4071b999aa63faba8751cf20fcf83e5af15fc7c468a99bff62155f86233e7c181f6607c0112d8fbe2f28089bfe3344098a266e4a34ae070b1e710b220505919b548fe7a373bc0d9480148022c95340026238031bc470063660745412123d5734b3b4a4a3f354c46c71c5d38a6c8f0d7850900f506cfc407050d0b5b9b1443cdb1bfe2034147a9128c4cc6cf9056b99862492783d3795d2518244ca588848a5baa82ea5a2d493d010528af45beac23c4d33901f8e729906d2991532e44d0ba47fb8ccdcf9f1e3c78fcb6236645b8b9292d6c2c47ddcc77ddc6762d37dda8811233ba4ca7787145af016cc82d646dfa314ccf3eac262884614844c1b69203d3333f107c88f05f2e3a595f91df39ee8db88d69acfcca4529ab601f17154bb0f76b9ff70ffe148ece371826efec3914cccabcf665841fd43224fe2e268011bc0c23a921d3a3f64fd87cb381247e23f5270a3ce2c3dcac907c15a6b5220d9f1ae0d72f28f75fc9568400486c6c51ae5885cdd45b82505f3ecd3691cf5be049db3801c90fbcb7507d7a021447319a74927654e0e20dbe3ee103e6889384d8c3f872701d4ce0509dd38a72bb67ab43f9d34abf90c2d3c96d5a3040b092522f28c816ed68ff5e37a58893c3b5842883ca9cbd6d4e35c4e6aa0db0da69e7b43cecab57e228ff563ea69e1e9ee8ee95311a6ebee8e699df744414133e0b98f7f32dbcc24c776c36c8420110ea808e59b3df6332e63a1a465219735c256c8133c3c847d86740f11f9d6b788f925ff11a16a5a1acfb0d3c524d632a5d732a2c7301e07386a4ecbb516446b6c27110ee8013da08cad035ce6089fa2b59e12d06de6468c75c3dfa2fad50147544e8be9b4c83490d25a5a525677126c492449361ef166ff5ccf1585b22c140a5923e215d98de6da5c99ff765dffbeaaa1d414e8e67282a091f98ffff88f8bacddae7fd65f30777317f3f08b2346b1841539173e76c52896a822e8c2f9a24e0c26ed18cb2a312131b3cce50f801b0001dc4b3fb34563524bea95d5c9d7b25c66baa8c7da0cc01373cc2fb79c67d9c3b81ee667ef3214a8e428ada61cc559c52346165c1f5f0e4db93f918a02dd1c360a7e3cb261a79621358affda5a5c468f37c4800c40373edff81340dc10033258e1c61af0dfbb77a3b579395b6839695acb4be2c76da054aafa99399a0f9f545d8ed06736d7db54cf422e4c59b1a56cc0543587057401952e88f1757df5a23a31cca298257a6b4e3729666dd7a4f1506537672405c39cfdf300aecfdeb10c4d96fdb8343d443823d7665699868fd5eb5f5633ab8a71725c8677723c6756be2ed3e14141f7b24146ef320f0af26164df51a51950be253f7ad29bbcf3c1838248cee13360f42696c651f05d16848f123bbaaa07055dded981bcc33bbc0383680d028582cca4606066acee16a8e1e73a24a4018bbb4d24a4618a6b44c768445f9bea6555d569659126b9d557564e8b452a83cb9d36cdb9e8b9f37e0f3791a7a282f2b5ac66e9f856958b9ebb8d3260c74089b07a2e9ca924748b3db7ad9e1ed743eaf65b3d36582efffc6d9401583777d9a6f0c86002dd588058805237f63817abe7c2df62cf0ebe5b8ab6b306d6b92f9bd7b4666aceeab1bf30be552a4b5d29cbf23f0cc3300cd3b9ec56b26c65dfbb50da0c480705feb9f2a4744ea081139eb8f0f926e59c400327d46056d7a84e7d2014c2aa29afd0d3bf68285465979ca2ca12655996615675c9c937ab1b27a1d4a2938a68886614a392524ae9b46829f4598aca129d724eabb2aa29fbc1c0a9d3dda4dd4e1de332ea5ccce8b7232c60f950bef3fb5b08703984c3e5afe2b6cf7673baf1e1cf1867f68ca344668938dd0d67c89dd646be0dfcf8ae46a3d5396d6bb92c5f51ddb2bb519a439699dcac6ff69773275d0c7ff6ce0da0855f1a6b71c17259d8776b6166f89299194266d872e5e96e10384959bdc56e4e2bab0dca151bbae7ceee71763b4149d15cfc96e21f5a2687e9b799a95417b554532a4a3da9ce5124d13381f215fd131541b21b3529c9e99cd44c0ecaf4e7facc3292d2cf97d696ac436176e3241fca421ed26e28347343ff43cb509a8ee10f857aaecb64f6e96b77fbf9a2cfa1180be8cc9536e759a7736ece8f496351c889a556e21fe88681aefca71304ca5776abc4df7aa775d805a1ef0744225b89e7a327ec2773f8fde899bd1b82d0ad777ac7d57088646ac0f5b07bbeb5dc6ddaad4534b749a9e8b3bfb2ea86e0220ca3486c71b1a769a9832fb54460d666be6735a291cb6ff42596867e9b7714fa913551fab2742293f2925d8ff3f999a42beb8e1defbd96c99eca878eef840fa56c54b74ca051fdd39ad8e6d85a6e978450ebaf9749f9f926bf9d563612ca6fd8dd1c9214fb50acf5818da2a4526b13ee8cfa12c2ce7d0fc3405262a03fa4ec6ff37b40f9be3fb5d6377c640df6ee2dd7eb0fadf5cf79c22e842bdbe9b6cc8d2268e9b1a035ee61202931d0159fe666c906d72383fdf557ea5e33f7a241e35ed64c4afb129dae514644896375e700a6259582e916c0874fa0f0ab9793875f1cbe44155ce8b9f06fdccff525aae082102eacf3f2cb4a8d80b35d705d3977ca941cd5dd01137308693be7029ff51450eb652d15c1e3881e6e3749afa024ac06c9feaaf6d4287ed1ddddbed3b5aa8dffa3d957d5bfd905c8beaaa94e8dea974dfb851b8a4829a5c45a4bc0eb819c2111654e79125297b552a21aaaf2bdb44eb2bb67ef9e61b4e44e530ed25882421cf4dc763110c94681d03fbb15717988cbd62d819af871ae0907bf105c53261e96a0d6bb9731100740241dd35803a1d66f970e0ced8d52f67bd98d2e017dae552b28a5897431f2a7cb885eca189df3c7b9ce9de2855a50203b3f7858823adda954c8ed7780cb50ba843361c1edef1f72fb2f1d77e4590a0408f59f27e6a109ca365e5c51cf0b28ff76e9d09e2a0d5356816eff0e5dca1939be03e27dfc686da0bd6d82cb9dfcaad2f0c416fd252d88dcfe95130eb92171e386811b7fc36086c36f15eb8673e36f3afccef82f4380fce8291e507e77e1cdb8ea8636f22d0efbde752e59e4dcf757fcaef1bd7e9344403b1ca62bf503ca73dff7ce7d0fdba0731fe6598d1d3c74c83b9d8b113ae4c59c0b23a01100ed86639246bceb9c8ba9dfdbf673024ccec5aee1c186b2995f669609c75736884908515090b4f8b3aa83b9a594ddb7bbfb0885a21ffe7b4dff95f837dae306603be2c109e1738c2e282828685e77f2ab6391cb0980f2f37bf7e6353feb88c5f9361e8009c77b50d0b5ac8b35fba9430605056d71e3c7c7ac0e8f7c713cc957f69dd579ed02d5e14141f07de3d1b77a1e7c2beb1bdb261237f24b845ff5b8cf4d18617cfd821e8d5d78efdd83ef1551821a8a28e1e3f37395c1bdc8f021c1a670a1210a181409824f1545b2e073832247f00152e40a4ef80c2943912740c1070945b011f85c498cb0831214c9715812ce8786591ec0a33f67c3c5eddedfcf5844416dd4d0ee732e1e057d990debf604b943fe351c07eabe1ed73997b6a61af33ae7f29ecec5cc1b70ce75bb76bd02cdf57673baefdb39e79e73ae85812ee79cdbb4fb80cb0d71b9ead773efb5753eea0b981c4826cfcfffc38d03740ccb8a49c5452905e5a4644445a10cbbde6a71d1e125b5030f0098f1ac5d6de61ae16187d48b0e2e2d3918b941460e311efe15a3c2538cfaee0da7cfe114a3facde114a3f695718a51f9ca38c5a8eeca389d6c8caf30feaf7f87f1f6fd83f12f03c200301ec60a162e4a29282724939211dd62064ac3c148158e3861a40a476410c291d1d513203f330d64c0a7222690c1caa988099a7044441e28c21578c4529c584bc7d02ffd7672f1db8aca6f2419d3978c7ef46cb7f7a68a354af42a2e445faaa28f750b9d3cd758b7bfd9f66e9651e1f25f6cc5e5b7a8b85c05e0f24f97cb32321c8a1ffef529299ff229768b4f42b1cfb9c42ff993bae1dc1393a7f1933afab8c1cb25262526551882e4e08e9edf8d3b7247ff3220aa3004c1c12d19d9dad29a4864238d67fe57b5eaa6dda4a07fc71590da9b75b4a43091c40634463f883011031695fafcacf2fc33e7e41fca4a87a1635ebce7cc8e29fdbb48f9ffefff93d6728af1f1fbc873dd3ac9090cbbe15c18cfd5543737846b92f19b0070f86d07ed3714eab73ae3371739fc366af9ad9271f98df957dea5b243f1b7d41cea8c8aaa1a3f0e955f466596a77118f5c5b5c2b2c282430424040ddc17cf59dcf816cb8bb75ebccb6a5ed89d534db5163fc6db4a8309aaf2f0996d5ca97c612ddd507dc8f80ebc0f322c14b53273cbc954377a4df3c56f98cac3b0b06ef442154c056b0d3e347dfd37d5a4fc9552532affc36ad57febedcaca43080306cbbf781876835f7a93e92f99d5bcc05e9858aa6bcdf42a4fe32bd5c56735a5bf4a2a2515176faa4ec5c55b2ede65352eec2cd57753eabbf1679c71c619bf8a55ac228c6e26be49c93b8f3ffa29452b5af1adf85744893f3762f1319e92109ae9947ed0f821cb7f42aafe2675833fd0676b24333d9b03e29c1da0ceb9dc404f7460664034d0131c9839317a44050f789a2d656b3ea5ff649e743a79ab5775e8e077ce25fe73acaa1b3b974ac7e9692d25f6f7dadd3b0cf1b93b9f19a8c10d83d0d23aaad4a138757bd3be5459d30e68ecc8cc4fd4cf053031150047600050ab6bedc81129d650c51129d69004ca176b343fdc207dc98f8b139494928b520aca09a97e6ac6fd605c884205ee07e342144b881afa607eb9a5b5744c28543d3384909f7e267a1a1fd550f65726ca441c8aff44a17f21be26f51d85d99b999b7f57a4ac1b7c401bfa730f7f01fae52019841e3ea76066628522518a090945f4186ba42afaec45d55d18c242d9bf50f62fa3e9923aaad7aa2af497342727a73b0342141414046130735a1942862c7013ef5abf6135d5abe07bd86d8e02869bf44b2b1d337ac1c2625271514a7994e7e77144c7909ebf470efb60ce742c9919cf393c3f3fd1322dcf2e53b48c0e445ae6a58a9649c9ecf0fc9c056ba16500f038682fe36f78a67199eafd0350a7a3dec30080871db078ff52dfeb50dfbbbc27eefb1caa6bd48cea1a857af3f41b5fb8bd8bfa6dd6877fd50a6dadef9eeca36cad7e51b6d6be316cad7c63d85add8d61edd71a2f7cf173c26079ae79f1d70b182f60b0fcc360f9c7f217632feabc2e63b1aeb595eaaa6bcdc5fbd2fb94f72827ef496f8bfbbea43e2a621ff77d287b8f3dade250dfdf509dcba8f19f855f55f8fc3d264a90c46d4602c463a2043fe6082746576de898d7901fe69a185102162ee33ce618c01ef7afaa87f03d0670c77aa8e332220b8540a873e19018b818f803a7f543211de39c067f70af1752ed063f5ab6aaf1fd9b83300421409e200c2108f3a90063913b3d7728dade6566bb892af655f57bb9181a4c502cd45d5fd59961ef3ec4cfbf80f0dcdd397a7c1e3dbed773af8985e64f97c97eceb9e350d5876af51caa7aac4ed19defaa9b2b2bb88118a50cc95065853ec650cce60c7d66448b4259c55a2bb5f6a7955f798c4481fc9c551155258de04558d7439aa779e43f87f285f0971f44c7bc9736e674135940f7b6cd3eeacf8c3450fe9e2b3e56ff5c0f3c1c0e890f1fff16ae84471e3c72db676baec4ceb4a673f15dca23e6a4b4a4c55f5877bcbae3bdb703e5647a346ac50dc169d1984bb252c29a8348ad81f2f337e6aa4a14a2212c14aa7e34f2a1147bce6f55f91ebf1ad111360a8d46231a9aef755e22cf6a2cfad49a80804fdf067cfa38170bd5adc70d5d91866538375479f4cd2c0ffc723d26dfaad5d3385683b2dc395dcb2bbb5997c708e35695d4b04ace895552ab60dcf97a3cc8838a6e3c7adcf7cf6e8ea91081cabf95f5733ed632d7cf79596c9f0854ce761d87c431416b664cdd8d524a697c1e3dba477ffe1e1394671c8502ca90611234870aaa4120f8a64c30ad9de0967a7465850acabf95da08bf3dbb71d70dbb3dfb954cd05277495ca0d3cd5001dddeb34d3fbf08639b80681bfef621bd8761948280542ac157afaa9678e03e7dce3953ce65fa7476af0f0ab7aa22cce60e7f1d47dcccda58c0afdb0dda678e5f41e7c1100b5dcf14e0f7ae7b43bb41861f24f4d75529a02388c8a61cd532936a69ad35eb37edf98bfc9535c2777005a355c548dd75c53533d331559532d5e81cb74a550fd35abfcbbeffa239c00fad758e6973b4d617fb703db89b894d0e01f3044240a23e1ce6feb07a31bf0bad093ecee5521be8f6eeb4b05ab09a765a8397053983fff1871f9c0b3f4d7f6b5aa0fe57a01102f1fe7a1befafc7b9b36eafc78517c4b9b0f2c02ff167ddde8d8fa6a5352d50b71914918713d04d7bf5a580be9be4e3ac60ad69adb5d657be179f9fe0d114381864b8c7dd7adcf9534a8961d8cbcb8208781f5fd669b7e72ea6e9371fbcf32902a6fcd9f3f5a07a8b67564ea01beffc38808cbc95726e1025202023467e7e7c7c36e7a5d7b43999079b70cc873fad8db4a9d783c4dd47957d26616258a9e41806198887cca082809effd3681cf54cfea3a72faa26b70c18d9ec4d0c087df621cb468ecca44c525a06641f323180fe45ab49fe287bfa42644f5f3ea53fb23de8f7c0f16188eb4fd319fd0b7db4c6c3438264ef32e7209aeda024e946fda3575c41c81eebb7167f0784105a1b7eef6c75c8536b2418798a2fedf6acd65ab33dc1748cf55bcbedffcae5ab60e50e1fef70f7afbc92b22a49c13b2af97e9316e3ef1869846bae14a1cdb305abb47a77ab8f75a3d566c221dfddaa7af995f52c18ab0ba78bdb94261cf1e7c79fefa309877c7f1d740c7d66ca7fe3522cd506ba51fad70dfefe1cce301d2347fec3352d93aa8d185a5262d62cadfc24a105235421043707293bc321af05218edc90b8f07902180bfcf21e63815ff823641a7faff4e0e38e799eeb622d54ac85d65e7c8e2f538d0ba663fa8a3e9335b54267aaa802b318e67fe2efcf31d31a9f3ae6cdebadea996f55696bd2c6bfd2ae7ca935d212ae639add79e854c2990c3469ddeb4f5daff1a0c22aacba647d58f5f362d57b23fc62d608bf568bb49325cbb7a3b23ae4ad5ec711d7b2363cbc5692a9d6f21e4dcbd17bf93c635d7c49c9cf8f7fde07ad8a5d7f71cff84d50f86e7d8680ea8df06bd9e01b77605687bcf2751c712f6bc3c39fb49bc5f3e49aa0d0bebbbd4be2b0f75a544399dda42bc2bbdcade815478f55e5885c4cce39e99cefb4eaabaa92f2b99a391e6b48449b53f4257584e5b82220389f6d563cdf65d887ca6f34f724535a311dfc7873bafcae8729ab4d65537df61cc3f379b80d0fbe44389f8bab27534328bfe3775cf9bb6b445f9bf856e439df65d9ce4d5889385d9bf7300b973bf93f1ff99b7adc7019184108d13fc4cd8bdbcfa3ff088ed9669e0f4eeffd458fc15307a0df743e37dc5aef9ce580f031f66e252002fcc26f59c72ff0bdf27b0de38800bff85b7fb12f754cc7641fb29bd71c7e55586a0835d5e88b3d5f7e5229c8e8b3d15fa32a7aacca873daa34622f4bc0bc96ffc7acc67aafefafcaf70a23f4dc1caebb820a29ee7476ec3c041ffb93d60233d328fe5849ee2faa3030ad71df1b251d50cc03f459538dbe4e545b1ac5836fcd7bbe4840e77396314ee9b4f9b460ccf5b03b8f77042baae8b9ce8a2a78aca8624ac7f021acce7d6ab43721e73ed2a42d7be65f97d56cb429ed08f9cdb46686d48f139079d0492ecc5c6bf2993dbe25bc0bff9d74656ffd1088237272724870fd9b88d2751cc83c85cb27f3e05dcf3aab817df557dddeed31dfaaaccb1a4d40f83b15704e1e8450668e3f74a6b5c6dc7baecb6ab652e9ba8dd1c61853a999c831c2c78310ca5f446bbd430b28c422f505aa95a8bbbb1513b32aa9c31dc06f19fbcb46ece5baa3efc639fe1b0bc999cc33daed53733ae0fdf6ae0146f57fe0b6095470fb213371f9e50b94b6c639110bd331e1fd5c97d56cf4b9abfc0088c70540dd879ae6e3dc19658cf48f54ae2a7155e1f896f1fbdd6887f011b4f4c84da3fcfd8770191a1fd77fdbc17f43ddad5eff52e908a56ee47cf4ac235fe07ee3152308c3755774a0e796aebba203402ef6ae88b17b7c9f0da69da8c4ce3654b9644502000004a3140020180c08864422c1703ca289aa8c7d14000f7e924a7c5a1b0ba42087514a21830c22861010010000919999a601a1d84f23123ae064ae4213926fc04df9ca1a7d842d32fedfbc34464351b9d2a4bf571c3ea4db504781b7b6d1e66b194a14dec4f50ab308a4508a51afe7c564fe2793d46f349001dfcfb7df93806185219d9e5b52f1c5d248003ff86f878d4cc315ea4b2e23e741195f96afa6a249d2d1679180a1c55ed04cc998f87f56e86a38590487854d84d08a9ecb574dd4afaf266712f2f457a6ace1f4b60496946f400bf55da77f8467a50167b56ca1939a10dbc804f1c295bc41b0f08ba725410994b77062b1e05b0494cdcc5491dc65f3c7b7c0e22e3f7133bcc59b10102c6131ef22079104eec18da499a1f9368f060aa6fb584ed6b9e60d52aaeb87f7f478e074fde22dc1b5c60488dcc73df2875be2d859c63e932d676aa0759c8d13088ae5e9c3211712ddc770b234e16d51b259c156ad00d6788fd59396be6b9717fce3eb8b287b84f205a1bfc4764342d0b6e58806a5d5f86275fcade366ead82f10c6af0c235b545427406386b515808a13e253d4d81c72570355ea8988c6236ab47e88a0895dc2250e20e8f418053610b06545c4fe1424103cb17435cf5c22642f6987334c05c815b0440dbd5cf0d091431ffa9625910707318024b4a794169d9db055f536724b591fdd8dfd36c61ee7990a505bbb8d3a06f0f3fbd1293b618442144ced6348f06e8f1dbc98ecd6d8c30a35b6e4588e8d94ddffcb0a75c62665c6f1e906e378e4192b31c64e3ac30db9a58e1477128069c6051d1defd11876c437277bc18238ba1218339b2b0e9cb05c01a4438558d9d3470e4cfaf610e8bf06c17dab914e5598da32ba95826e0dbdf591b560cae7b0ea71981cd010548b7798ea12b0bc788c11e331d6db81a4f0aff5b8c762c3c800363ddc44c294a78a9b56bca67730e3371af65584b3ecb92a766b1625004e5a6d6caa90303b8f3dd59420dedb334c4929d250d202d0e880f10796871a458bde1f967110d5e90971154b9a6c5c1d8d3dad384d54aef3c42b1bb115076f37b37ce20915c68e5dfa8f6626464aaefb524b2aeccf88b6a911850bb0fa52150560a34182be4b665f6af43038dd861b00ce1cfcb6f6c90180e35489772f0bfc7a99252075df86edc4175345bb6aa18fed3e2ede3e175dba48e476cbc49b7243a9022e06074085d6ea333502b9614a310b9589256fc7e534e580d8a5497b781354912af1d92868b2a7d04115b61867663298090d4e5c2088c0f1d01c4cc72136c5f90db8b242f62abaf5ef64e1aeabca144cb98407f031e7ebaf83e159cf7c3729fdc171ba307d583a2a3b0eeb9d04052f12b0cb63fcd77ec2fb17dbff9ef691cde2d901bc0e1fcbbfc7359a737d62be268ee2c99b5ff4b9b22c2f3b7e970f8ab0935dc0354d9b94e48885262057c41e89ffb8494804a9f2c4119273c1579587a57bc903009960b67a53587305743aee3a4898158639ab7b3918441d13669bed41171d11c25cf536a0e5744561e8aa184c2422093efd2210c28cb7e57476d485485f1b921e35b60f35f0e10cc2a4e19815683eb7292f78278c456a45039e2f30f59f0dc013ffaaade8e7abaaa432bd2ac7c162318631b6837129608c82381006a87e16fd72060f2662657250c59fc1068ea74a2b495f51dc58f2209c97ea6ec8ec6ff59c5407e771a33d7afcccbe66aa5e297a7c187ad5ffc949e1171fd3c26a6b0f31a3936b0c035d9d9c0a032647482daa4043d44d55f0529e0f62e668bf5698bcd5e241ca3d4d005e13738764d912309d69e32e1b15c0c72cf3fc8e2ce61c8a4f99f0d63eee14cfa18e99b1f085226d95392f3a53a6ae9916b168721a43575b44b48cd43547150cbe35daaf32bb9fdf66f741395faa2652054c733101b16ad718a1ce2b230117e43a022f5bda1c9e0086d5b4e34987c4c7dde42c4a4ac5738bf14879b9acadcc630132fc9b8658577eecaf804cf028589c65c21615bf951fc9d0003b5acaa4a30d4f88abcbef5513d25c03d59495d8e0ea1611c8345195c54da13c44bfffe7bc57a859632b4480b14e4edd6b9549b7e3b68476d8f26528cbf1489b6fb50e7614c2eec54b5769b8324263ccbaa5c5a63e35f305fa8f4201e7bdf381467adcd46188be6bd8b197a8b6a1c61477bf0064ca20b2eb898e44e805188dd4254958e6de652235577d510acb8f0007a5af69171ad8237d55bbe3d78af815e0aebecdd632687b65e40deeca8485d857633dde5282fae62ed3f79042871b45b3a8dd956b2d278d56b8e0eb3d5ef8b5738d7d0027773397566afa93557c8018df0a18e624b672f80131fd1ac7dc11068c57b49b181832df201816f3ef4c1a225f110b2c46d92c9e9739fff385c847ef7a54463cbdd9a46ed87765a043ce77e1fb2cfef5bf033fe5966106e756ff2e4f68fc348c05fd0caf7a2609bb9681de4c1e8b91fd578eefe77f59bc91ef8d2468412cb3b8399ec5d703dbcf674ac48d95292465ab7a99677b8afea3677581f5fc539fe80cc85e94b828c2af4d274e583955492e645c80c4dd192efd004af710d17d472028b5762eb20c94ab02458d138c0563cdb5ad561a4a154ae78ecd8cb92225d4c0d593de0ad5d7d6a45a37db003f27cc2bc788980532f58e4aa44fdcdf2b308169c9a44cccd791458f6d864855152178295f92e2b6c4bedd2e25e0336a078c84d2149e02e4905f83bcd29f68ed81a731c1d809bfee8855983f985ba5bbc995865398ae9b1b847b178b924501f0079eccbec4e0080531362c3a0f88007bc1110a7f7bdea100ad3374c2f19d0c42b1eda68c84c34ccbfc7794ddcdfd7e5480e3d585dd637e48757fa527abd269c9c27eabb2e67eec3686948731124c69899be399a8d82565a278ba1185650a97a87e277a63dd10874d6b1d8fc967e93c6b36cb7bcd280a963a63228ae5e2230b8fdc3e88ece8fe603b50edb30636331e4b3b8fa20d09d761115400189fc8703ed2c7f38d6b4a16bce9c7b5cc4c2b2f5d39c1fcb16e62ea648f31ea533580bf7be30d4fcfc271096e676e96c5dba75301c1fceab2a8f6417c1b6782f5a021f85bbf5d9d38f40f9b8f0188614af35b057efd6bf9b8cc3ee39d637a7bdba388692da33b3c4da15f36d07a593a86040dc7fe134251c54c9f1d3fe4d721c8f39663d41e8aadc20add2abd7f56fc17270a11ffff034b903aaa183e862f4e101414f8a0b8fa6e7b04c3bbeca1eb18115716c8760a0eb834ba9ae6db0747f8830867606aae5f986ab0a8c64d1cf7cedd162dc6e50d271ed3679f59b5f76dea5b7ac09c593a5b6e9d4b20db1f7ae725fc1f7c2e9cd1d2f2700e667fb951e3efd4364182eb0d697f7d662a1cbfa4516a6695b2f2afee411e9e6e4d70f5b3ab80e63c67304e20e9a2a22710a74bcc5f50c5567f61b9701ba3e84e4e2fa269d86f27774c799f969f28a835eca76169c9e22808f1fe332f7a54bc53501054b07da755a55d2c20e6e50c6cb66546bf206e29cdd7172b50d010b38c755a7c9985241163f4a04a48302ca967dfa705bbc7517aa3811ad429235996078edd7e9cae031ccdf96bbaf16931657430be37a656e41332d7e453f8e8334aa8e4998106b501d9fc6034681d4422c8f2bd1518d72cb62b2e76ec15d7d8502cab0f61592f42a5bc5941e84c11a1f9c813d080b866a1e924d5cc93f4276925b16bd8e579c41000e53267679d53afbd09122b1a3e79deb485fd4632cd2084e50bbe114bc0a45a2087656f82b25d43358688f6ad36c45d0cd14674b8b15155f42ac41c5517aa088a39cfaf8c71e29eac65bb3cd7b19770a8432e4b0bbe4025eb66d8009dda5073204d3bf18c67518810b242fc4c35d53a051ad767182a237c234c476e4015a14877058e3e64d45c228e272dbf6f7e7d984fa3e2daba683bfa802491d79daa7c26333e1284921e02c5ccc577362d46bce8e98f98ac9ffb5422eeeb14be38ef4148ad959161e863ff54a6e730fd901d3529c4af25da7725b065068b090584e22604987ff41577679d61fd463bc0bbaa9e96f986c629970a0b9f7b11aca083fb53f9251762f29804d6da2f4fb66dc814a5b46bcb5b6a785243b38db267946491014b96d23fcd76b9c628e1bbf5f49b896a5a156cffd82281719974d451a1e06e68d300c0198bec5ad8f60a303ee34324c2edd8f0be56fecd5d2b2e7fc62e1a4517b8881d3b1aa01b8da207bcf44df051d9613ca6820f353972680945cd9dfc89a016e30642d25dbcd0a160f8031f9f168a2c3b9d5192731f2657b63243b210b0c5cbf79354ebf3ca9cfccbf52425d3181d77885d6525ff93854833e495d3c8c3e2f525b8100de30dde68b32ecb51af4fc7a02c04144a7c5e6fb7e7140391e9d1c2d9cb01c3d881a4ca586c6a28f734bcbc730bf47804d721295d3d2783dba2c420272a663529324a188f5378f849caff9f3896ac5a810a5ccab951cd9073837f9e9c13ee67aaaaacb26ded3e67e5cc9c190138c97807fd16d1d397991adeed5bb9fd6eea3e96eeb6bf6585ba8696aaf793160d3b924e51c54a9d4f064862471582dcff6bb3b0400fa3004a362926ace06fba176a2e3c0b2cd5519c4ec7adcdddfbe1f8963555f8e897e11c43fd731b33a1ccf7a5b22568e810adcc82334947afa989e596b2fcd3590f63e61b7afa804fba257033851be1119262a06bc183fed6e39e30ebea7ad2e5240493c3eed4038858ee073512614341586933877502d91b147971562be582b59259d8ac2626dbbc3cc1c2170e5eafd851dd61d6cfb02f9c2d69f3c20e46f2ac7016807c742d1a0829ac88386c09b09aa61cb316e3b2a0d3368de9fbc7e729c3627ec769e3cfe020c1827e27c6337cc3f75f8ef8d44be7f341afa47d234a1fba05944660e89634de735603b625404a3331033bb6c57b4975de0ba0812a6d0812bfa69126c96288d7ef39ff8dfbf83b20c13403b8a819bc4c33681c467b115df101dc2f4c60901ccd20dd2989c7ee18dac4184080d93cf778a36d075c626919dc5aac8d57a85cdfcc402ebd648e7a964215c893fbbbc31db832fec8621f38c2c1023f16adcb92cbb2e591eeddca717863abf06f212833def8f4e7ac24252206621fd3fea32b2ce370e43f657e0e76725e9e32a23b379d32f09a966e37e4e426f3451d5af41513934bed5c884bc48d32cdd3f1e7878bea866bdc0d4e4a1f5932da1dd49246e12d435fa80b855ed3c8d2051708c9f7ab5c3bc4df2d7a0335324f98ca22e787ea4e88cda49a449cc2c0d7d01fb50485fdc3d86681f977560d515622dde6f7c376dcc11b47febfc5df1ef29cae1d8cc13528c5f085aeb020dfc85ae013156c9817e650d2a999cfa4dcc6464e55bc513efcadf01aa93e4a5a4aeea9197014c27c873a5c9861e5a15f6d6125f160a87719ac0b1b3f226a51cab66e1744806092532d747990717056999da9f2f03005ad691aaff129e6c308c60d6838fa6854383a6e2e698a0ca81dd1d87549a3396228ab30873883daa2f415ce9cf5afe6ed926044ff3a4f99d9b8cf6aa2071c30276cc59dbbc09c925f48fa1d92e3ad34badd113031685d498dacf23db23ef380ad9a15e1ea6f863310b796ccab09bd36fb322f74010b199911cf1e5364cf7ba077eb3baa33d56b1c994940261b3a1cd9a495fa38231c246e18761a590ccdcdee81a6ae21751e59494662bfee39b3d7d188a78eb3568da15dd37c9815fa57cf41e485938f7a8bbc41b73928036cff66805daa998b730da2014f332592b749e9efeda51c2f8bd1fd8f0beb910ed9e92723f04910cd69d75d119c482200f5e4ea5cae9137de023e7f658fb1134eb42ab74be8b4d35ae2c779e90327bcf5be7536582a65be5d27815d0d3e668b34b4db10d4151a57ebed9924f020eb43cedf761c9f7f6148f315f6970dbfd4f35f5c68e208d3b4572d238d04554e1118a272ccb7d19229838f1de234c0a3a82a99eb7d7053cd802bf73df2213075dd3a193289801d4ca1b57f2e593916677c878ab106f400aae134c349016b9e1e24254c9694f103a76e93561109606c0ba74092cfd5396cd136022dcc38afa11584101a907a884ff8c9beb1b2ae667cb664f3bcda6a83f365892b482901ccec7bf659b8130c153b0d1413d71a90283e31ee105a18780c3eb242e02309242283f16f3d62f23019121e9cdec8be7b3ac20a87e2f5a6498d965a45fb21837edb7bb5dd4ba4f8b3de83097e70da346745a493e64fed831a1967524046e9f2dcb319693526f3f22b58e0f23e9b4aff3dd251aff6dc726525432d2a39ada450566799c6a3209549451abf15037c881e5e551ebc3f01d168b795e73745e0db68bccadf9da57667ea6262136cf48ba81ffe59094dd443e70ba28665440948f0b0e3954ad691102c90c72095df6fc35ac1f510401d4f6e20e3f77e5c77cd2e53980d1edc25cb9e0acd69327b6974bbe2b53653078f1982b8acba6263873d092c897f4e411ef1c79a808b96e6b0872809ffff6d4ded46ef172fe5e840126520e4f5493cf1d9c70bff49313ee5adfc2581415ad3ea1bab66f988949efaa62568e2b3f0ec4074d152b32f10459b2eb3ba75190daefe5f1b1c78bb115ade0c06071e31db1b54ca43a1d17df0dc502499437a474f09f8b23e586e0865ad05c8751c7abb7466db4024972ae3037ba0e303560c05b13b270be48baab0ff79d327398e585b527c6425253090de9042295915fb16b8d29c71fd18b9e0efacb4898b34c4d413c46f81df939ec403751a4e35f7836440f902915986104b22277ade8ec4d5eecc66535d96bb7d5d616c14d94d2e8d3b6fa48370a71b85591b8ec8a980c646d0980f8a6c076ae993ef2cdcf14bda9941e5d9e9c7bbc5d15da1d806ee7e4c6173b3539b69b7e7c60eb3cd74a1ea4a95dab67e8299007aee3a2a671eb43b0fffbeeecf041b606a8814edf57453071a5bce9efe960ec13e21024f6da7e6b61489ca864d77baf04f953612ff4e2eeed55286201c5fedb2bf24a9b3d7ef9e7f7fd5156135be31f8aaa404b6427f1feef41c4c729a03155a14fda6332baf53b4c2664d85887580a1741ff9facceef74650aa3747f5f6cda97b4abc4335c9a11ff36d5f02fb7d4cf0064bc5b0b06013defab01942df33de9e37b5eb35456532e0060855bbce9a4d009200e676d568482a00ae4a8cf70fd3baa31e3fd5616c618e141d100bbb8b2d86d2e34df08ac941becae190a5a472c32a19f70f53eb92e856d3adaa55e12dc309d2a4749bfef06b758548cf9dd57b25b289ccc9e6c01c4a959ebb7ad673f64f388990b53cef297a4cb244d961a1f6ac1d6f28dc091c58bfdbf9523960d8aa3fdb109bc38c18276e36d8c10aac6d38d4c0ed2947e93d90c8f7b35070c9fcb225be59f03b0b21aa5b17ef5b8ba20e5d3a882b845c340b5c3e0f18f35bb7b05b573c2d1417067eabfcb0328854cc4f62ba7ed19e85eae9efe12f6dfebccd5a0cebe799102ca8d142381c5415d1fbb281afcc80e2dff3a3806b1d463c69e1ed4ff5c82e1df859ededfc42649e8e01cf96ea776a3c90c75ce9193a17cf53e400e1471d476756dc5a920ae4bb2944ae16aae34d0d6109ee48ffde18351ee9c0bb438637fdee7a4e4e62f4e059810d31a04596645f2c4e032d0e17fec5c083205578818dedb074114c3dfc69374a5d3281448b9870a33f23e9a78db498423438a96aecf57808b76217d3b59af21e087c7e3f86ac2b9db57e3a285ec62a63774a81a56576f6a1b5f7b2ad85faf5049411977f0e012093cafdcf881013bcb8eb53ecceeb3c05eede49a73fa3f7f7f82e254f92ca3c4187f3da0bba5680e33656d0c1982088dc937f4ba2e9564403383997796779cab2ae66b1d484b3cee61a947be4e25579ca3dd6c0857a8b07871281f120a49a9942f0e45dfd4f2299c9657d06e0d8e0e6e943d5f847468f2411d64221d529e4a5f2a4304c8644f0035146920910e291dbb085fa05f43718ade45809d9af56b2e1a850dc2801461e568c7cd821c0b19574020eebe96fb370a742800bbf364300a0e1a8036d169ce7adf00315eb9112094822b3c6023c8cd3bdb2c783194fde9776828ab227642553e9d2a3ade1593987c6e7d80ad0a2b2a89b754fe97b6e339a1ed5136c805145f25ed79c745a0713162d84ef78f28e29e5dd458992c520721cf0527fe6908cfe1d70376f1e6c41471debd0b6036b0ed89fc2003d7660d67b74ac30e6fa04950b9a76c357692a798192043e4b7d35553f5029cbf239afa8370ebd068a286e613bf46edca57af628756403de15dbee8d5d6d37372aea6b79cb3c2039e0d4f14b813a44530accaaea9dfc6ac82c3b7523c6cf2c0fd347ba97411e15dff2a5cfe33bce8654d0a3db123d89eb97edd46b882444e5671fa4ae7d4d2da27bf167b07286472d80cb63c4c659ca3e6d8772e9e165c5da83b6d324502b6b58e94de6135aa8d4702872d57fa41d2febead44963810760914d0d80138b930b088996001dff0277f4823368d37427e28a737162176e1fb24917854b76fe2033362d185452a3abfeb4cf7849a218b895e41e3e982de36e12992ca1b0e100581c25ceb3aee64c01be8fcdbc435406f082422540e1f5dd0eb0fae31ffb3b0a8911b84ddc8a68926aaed4b990e08aa9c835452961ca9cec4102ada9fb24fc2fd924f17daceeec75901ca18e7bfebf0acc7566d2629fd1a1a25aa93879c4025a47465ea8d2f0741b29243d0ff7456bc1d92a26ea9ae80675e924f71e803d8d06a6891a9c70c8c4c6f0abc1c2957e844a06fb0ca7c28366bcfbd0c1f7dae623b10940a2da82539452a51dc9c5d4e2204539dbe914b300c66757d97909fbe5c632d906df200c0a9004189f2e23e7cc1024439f777cbbbf2342690a9d0cf8bc83dae8fb1fb0dea7e14e60d233ca41616c7105fb6cb794096245b5542560e3c5f9e3995bffdeb490c1be5222360e5ac4c515c54bfd736249aee91d59af0651c04e1c81b2b72276ffe3e26047230db751e6d030205504076156dc4d16caa415f6d881cfc7e53203726e4d03e1e55998ef01e0ec2304f1196ba31365214558ce1db7f5f7f44c376ab8308fa74ee23e0d1a2f3571c773d7524b1f7d2ef01cfe2b8a45e8f2015de0675e83c6bc33ecd9c726637f2f2c05b0bb988397976da7a82a85d0ade16695d410be572e538279e9151f84250172353d2c8ad23f4a63fde5203f7a5c34395c1ea24160680c10710d26b75990656ec70a655eddd377aa667a27fd1313774a66e3bc4f0b42a688ec174b911bcbcc959a01bac57815c5c6a2bb35146f39ccfcf7541cf64bc6fdae21d80e6651666c4676a618a8f007a5981e73490760e8a488fde5a239b3c193c56edc809ce024a9955dab67a6abe2d28ef8c0f468b85bc16565ba3636b82ffc24e3cc6431ca7b4dddd82dcf70d80af4e24757d6ada7eef5321fa08160c3661a0b4a0ddc829d7c386180c134a1a7e0e3ba0df138658291b8792eaaa27b3f33556471aa34ef5baa312e05052e42b3041fda6c2ac5187905d8b8a4c99d98f61a9731cc42c765a6ffe0117505079e7020c2ca125a8c5eea328196f4adda5bbc3a685efad5a6e572303883b3c71177aa512ff1d268db295f4815b9a8ca28d09f5bfde563ccca517d117bb397b7e93d7cf517a6cae43a349917c3fe2c0b56f91d152c0bb650ef57bcd83634a5a570c737d61040e57655de7d7f7830ec032a5171d2856d044226d836ce241999b4c3912025a37aea34fd10d08bf5ee8e23cbca1d95d7f9a1cc79a2bd515210de54e01e0b9e172a22dcf146108e7c1cf9e747e1e98c8052dd0779b7145dedd59036f0f7c80994030ec2170de743826158e0bd53fce29bc0114093ff2105f394d030b44b65d804bdeb332a845b9cba8ba486702b58f1c3f086970847e038351974c194a1da84cf42a9875b2b752001849ca1cbc19d92e0247bb00f9e7f8c7d2b172c70c2cf9dd1350fec7db2c14b6ad057fab93093ddfba1af80c5661c0c5e30bbc6b30ba54d781d5b88720e46c1f068a29508d819d5f7d6c8d419d5de2b4256a99aa0f849ecd9e3263edef36bcfdfd2ba69dc5f33cef9b5728c15c3e2d68b83e9568118e90fb39b78c90d9d8a29235fe7d891af2c5f927d9f5c8ebabbce27e201e001b0624318fb38bbfca87a64512bfedd0d62b17e0fab742cad56416625220b833b9007776f773903a63e8be18c7b1ca4dd5cb30ec664e507e69ddee648c7ae9729341ad30a9d414cc480bc168ee69c3c06ca8831ad83340f966beed55f58cabb79cf26e11b1426def051ceec9e5ff4520816aee40b8a3f39f678435a37ab45db1bb60bd8e6f6cd14c5b0ed17e47d98e879175d3e99d53ab8ccfa2458dccc7833753ee5fd001f1c69145e77f55956325bad01e11abe03502cc00c0edb0effdfe6dcf8e9f9c77988ee8eb94842211ff2382cdf43f1615e7f1e932fea8498dc6f3579f69823f51da2eb320fe5698d0ba5dfb762cd45278577cc926113c404aedb660d2508d4f4cb45cf648c63d7761c7a548c1c6e09ca2a6543dadc4c0315cd5ec8af2be4385219fc8130ad9e29d85cc703624b7edcbaa5c7f8e50ddb9ea567c47167710e2ccf30f2dc0e44738ef7456b1de91bd1337dd4f3c0f47bb99a9232de7406d050055ba0bda93c6db48fa778d7ba20ca0524926fd5bac86ac07118801a15dfd2780703ca043fcbf53f475ddc10f94aa1820a0219746307e894245d3e99339dc1385378f9fdc428e8278e850f09cacd52e3624e5c1d11db5bd0ef0d97dafe851435d47a1d161a06a223f796ee5662c77e2aa3a22a873231b0963655214fbe35415b76094a516e1081961465509e50c775ad634cc747b5931eb191f52abc91a18d6d400dd4bf48280e4bbdd9021d7720f42e63128bbc181a0d6a54b39368399cc0540a8996ddd1a9a4e55f5afac2f13fb3349562c303113c61d67b05aaf30ba67874875be8e08ebecd15aeb471a332d7942abbdb1c8e791c4804cbb858b184e893a24e9bd8e1cb04f656347c1cd05c9452cbc73f29a393644263ff990d6e1d97dddab07267ad3db098dd5a37ed1fe39bc2152fa130d33206388cb5b265b1ea74d8e6f8410639efb02065a8dbc8ac58c60d0e7cdf5e15ff56b1295277fe811b30683d50f962085471a452397826e13b76d8cf60973ceb147df1a09f2099e4a429c606ca063b1fd064cb61a2378bba66c76be306f2c45ad08d1261e0b14621feb5c75102ac9a711311ea63a99502d51a66c3a293dbf6d8a149c913d8502658eedd64f34db8502496a9ffc50003543414088ee85ddd528b201d1f11f52788cb7544e3b0cb8edc83c2dfbc1f442de1ca4da036adb8d494136786eea602771b378b5ae01137fef28d04098aefccb7ee7bd12fdf96d33624ec268d5343ab90e92de29591d88ca98174fb0d04476b4eb0b4a9e65ee2372365f2ae3d4b416efad29517a78d562e142f0bc7ff6d61fe1ce9d392dc8782186a38a03632d0593782345c6e279341067640b63f01460607e6f45deedc8c96d9ca0c94ee8387d77c390e01f3e4be7aa4eaca766a2b279ee3ac62a7bb1c0ac394c122533bfdb9413aa4d595e0cfccec94884b7ee61df60e0c5376ffe45b30b73f403bc2b1ec5775fe00335f7bc877cc1bc3be8a53f9cb2e80292d945a86edf36fac00a9e7e386c58f78b642e52324ee0c88a0ccf8eec24f5928ec437dc684be5745487e3ebbd320bb23058ee499595da0513de4a1c82dffe09811d41409cfa6181b4502846f82525c767d89d40ede04aeb90fd8e5ef5e4410074062b6a9888201d5a31debb518f719e73ee6521393d00005b43f943f85c7b2d29e426c437b2e12becf8bc33ed151f17d4b842c623f833fb2bff51d874c2d4673db42f15a869cde7eb592fadc82b53d8aa683181d6396a787b17b96bd9d665e7db2b86f0541439cc0913fb196adcd063c727255b5c6c1f4be7be0fc21ceb6b63e03854890a4a12d423a31f1585087630e1bdf0a1c5b43bd073bad71352d69ae9875f90bac503078dcc1ac01506b260e21b6e689443ec6ec6b3fa8d536d36b6116731c389c8e7fad79a391c308491164512d05739ca091c413c52c92c2dde48823bce04815787be8c1bef84fa8cadb872a2da41d83192603a4d060d5bd07c5511231ad8c955c736efe4b24f9142deec74fb8dfa8624b540680cb8eabf3e0211b496bd6056940d5b9b4ae69025c5a1fb8d435bfb0c53cc98a8147b853d79640d4c7cf7bb6ebd7f2795e8f58214762ee1056f804c6e4e5ee2a0919822d8dc566698571ea6511afa1cba44a837b363017575a4e8c714a67ea481d117246ea91054c810b7a0e5c4fd006115653feb007bf3d3297c16d1e9e0313556288f03a4008781674cf45e150921e1fb06435a283b732917b984519459f64024081e11559abe3e4edb2c12ce4fc1427248f97075ae11e4c6ba9bcc87c95a2feac5c3a8efa748798317b0b0e599a312ceb732384c48490bc64a1ceda6c0e3d989b74fd0b3cfb6bbe6a75a30556a3fd4a2881809a0dbf09db880838a678d49a2498d0b1bb1a3111276222275474a5e8bae4a0f7c86c51523369cd4b236385f78f065b212847abe10e8d3df1c2b83e762f5cd0c834575313cb1a4b19444380569c8eb2077619c9ca1d5d472f139d501338f12638b12672a24dd0444de0c49ae8891bbd26e2c48e6e263a4145a7893db1892c749a9843cfc44eace8688263a204092f9ac2dc98e64aedc1ec9d0bb287463fe9f7541efec1a2f26da3e4953166a3c50e119301b046edaef3bce20d5d6130e34e9826ec33719425f9e80fc7b745f413aa03194739f022b4f9090b674e4a4ce61f400ebf5cd5d3bb7b0d978ceb316f9a56546c0e51efdfc6466403e7629d18a8e13f25a542824fdc7023d8bb17305d7dc6a65777d40c39755e828c66d022a44a80f379600a377198cd34d2f2aed2dd4cb70ab7970521beba399550970af70c782518c3a320007256268abdebcc8e93cb7f0a4a651ffd73a6bf2b1ac1898055a810a0cb20b8c4c3c4f908315d31d5583e134a8e224d2c11ed484789747e2f40c906d7d73e2b200c86b0111861d7f5d75be5e1eace18bc7a758a4da79d29764245464a08bfeb6261bc0951a389ff71abad9c4e63f7310e031d156b1f793436e545edc3fc5bca60c6726e3d6a14a8671a69c8abe6f2a1990603b7722ab3563af66ff3761654c4c5dc4dc0a9f229d9cd4c15376ee37ba2e6756996314470c0020aa466fe8fdb3a1ff24447e69e40c77ffccef3b5fcc79179f8505e7b17e30c1463579ee4a8274c103ab8c84f4e261540285abb7c9deb94b38d63767443a8d5cef34a09671c0450dbfb3f09cbc75a3fd78ecb7027f0864aaf7f12ac64c7f91144314184ec6773152fa6b3ce20436d5edb3914c78d0ec67b1e0421151ea8dd92e7eaa2ab52bff20a195c39268d6e0b09125a2c3b1fa9ff61c81b1a6651cfdb18c54fa83741dc20d873629dc4f6fd935e09851c0f7ae7125939cfbf75fbc4616e57a1d1dd2e3e9a9c9de21933246f0aaf731c0d7c18e6d4b8508aa9efa89841062079e752a9200c6b944de084d948933ee31a9a18e09664bb51c570c6f65c1e82cea3dfc4fc99b12213adbb9d21fb8637b35accbc1c0dc34204038a41828112ec3f86c075efa03d597a1858e95b730a10b3d9b501abea2009bd922835f38077f510829a2d76a2763571f44561c9fcf54fd4a43570ceb0bf9546e7d819871a9d7cf13430ea3e87a4e25c6caabd7ca2edf086b028de62772e05a0192942f33b2457c3d09511611bfa40bee02502a49d123cb353363e76c61efc939cbee8cf1ba48159431af323a14dca9f3a17d47c56c838c6ff5f84b93b0da6d947adc0b7da5330c2e0328ced3da66487f869c3c8dd483032e1f4412d237bcfd707a745e75887efa9ae98b42382f249fcc42d5c60f5b2715196b6555f6ff318cfadf9c7be1b998032d86e61b779592c52a009f7b3096d8f40e3e6f437f9509b85f722de6b2aa630a02cfb0d1c1a0f520c0e3e10d41dd6020d47f6a0b28a42dc5c3df01ebd65761a1881d2f0fbb08d63974e3d530e3e2143677caa749859a55299bd6d2cdb75f2649386eedbeaad075c55a3b50628ffad84d1bd2bd62374f12f20b28b07c8c50b8092d0810a1b07586f53c373e8b540717b19a59e4e384007a2c7e911e29fc43c00b1da7edcd739337e462ad79befccbeeecbdd8701a7cf28eb221303d02b306054fc416ead9172ace594a3db5139a2de3aa68c3170626bb393aa603b29fd64bf06c2da9a43db5362405f5cffc852eec412b6e52306e9098a67e9728e78334b733bbddbc1625c83753b94d2ae9f2fa3300783f20b81a387d2abe8eb6410c25e0d044120cbb0e198b9b5b9d8071931a07cac4029cfa37190ca3e10935f828a5686d6ff1757de7528a5e977d84d07e38db6a33d4a2bed5f787316ef18379c212fb6b50ba92d0d8ba9fc46cd50a35f9e930315da091fb4ffdae99893d5d917096bc6cafabc31485cc12ffd86b295d25d81f4a2155844866500b82f495d2dd47bed95c7c51ed6ac882c4e7d5bf0f3fca7f7513a95b639252cfd042c70f934559a6c63996096408ffbaac5c71135f1381480e8aed2b6b035d96ed8432efd5cd184333061aece1314adc2eb04638e3aa0f3005b4858e174092b1ed102f712564228b0e1d67e6f8d578203a054956e46a7606873f1265fa5216baefee955f44caa1f155e25768bb13239857dc939ad0829aa4c85a5f11a997a24c7e49b5fd0c51ae9800562a6a07e459a485a5e6ab5aef00129f181df64ad1f2587d49f9baf81851a03c87f9434ce1b2bf84aea84857d80474987af5ca70e4f32b1268b8b5867e14b06a8d5930809ab9b8fdd11cb9e8f250a6759dfdb789bae008d3d17e7b411c53574a7cd51c4681a6944c27fce79a41405c25387b8ae8840d0cf77f83424162babf08dbd662ef7b663b49288e7e35c4969643b0c09107f6c1f3393edd458736e209d222e61150ebf1056b12cc788f25444727de4f7281755746a16f5b8d9d97309187c16885216e9030743acfb180aad849387ca6668d1cae0731d36a114db0f42bde7ac06ba7983ccc984b7375eea518bae2f90a554e9830c97d688893462c59ce3d470a0258297021162986c232caf0cf8e5d635f7516609964a06394d7dfb45dd2b50b48cd29b086e7881ae792c2a5799b1ef41327ccd43fbafffcfa430b40055f4865aa90fc7c4eedae43537034c6bea405a9d24c83eba6a22b65fa435e07940faa5173cccbdf44b747811c46c2de96525f60e86026bf293666f275c98687e210432ad3a420f990f8baf283ad2f1172399870aecd00f0d39b13167a1592bc156ef857ed6f3f196d41bf08c8f58dc400274ec21cf6bac26d4a8b5270b2efbcb11099bb15eb8db54d7cd663adedcde33b29c66d3ce5fada331f6cb682f41b47382253a87aea0dbf402b301d2c941c855036dd11fc1f31bf3e91759111d98145b15e2ee545474e80dbd3962a47f2c23cb6a7d46cc13f810a0503ce3e52c288710d73a923816c525a478aa339de49949326f4dae8b6d7ff0a515a79158f4b2ebbc7b22f245d102da061cfba6e911ef6f1698ddc7bee1dd9fc384aa4aa107c109000637f26ecd00e4953294b1d0e70df2148f6761929dcbd8ad32cffb608caa7102dedb645c9a9102e8065ad59ca4e88299884119aa578e0bc413ed29b3583451a8e1a71958d871867f869c651363fa2a6c0939ef63a5eff070b239a30fe714b981433c347d547ccaac3e35f76809c6c5cb9d70349016f9730b43d50e8f8665403a7192e97996309c26d2bb706e3ab8fffa74ba6552cdd9ae50ba5f40f672991cc86c85e42058483e453a2d002cbd8a2fafc55c8413de380a37c2c31c4c99a81a608e9450f221498907d61e5ca4b2e9accd81a74cb09900fc5045413fe44913b5bbaf13a74080d7bfefa4ad9a200492b6e0b73253021253e4759e04b446f7e009ff84a86ce2831ab3a9aa5e95ac4ae6983cd6e1cdbdc1e4b1fc84b82588600030fce5e2eb72f620aeae2c33211c5f3210c39378060fdab7012ad21c38a066c20ef992b6fd426f62f09069bdc5110b9f450bfe1decd6c732d6d209e778a68c7ff91c444677090f7cb815b5756e856b91e65c3bb7452544fbe8188c38ec8584863e334adf99290975213881a620cbd1db4224b5017d08ef41a2ac279d759f4eee8c30ead128ecf619a0cc664a9ba1f902dbd5a01241994a6693cd316c25bf070eb7beb21e6a9e5ab4426065897480a0528304959266f11ee16302771446fad85f8a0ce129091e54096bf22fe536c1fb7a954d9dd33c3c5dc6c7d29a92748529a52eb1a8d41a2d508fb85faf6610b1c5ad58e0a5a5f16bb7ce263ec703385cf713f7170c94935141f7dececabd027909474348890386792a0c0c8bae3cd630aedce8038a60a54011741e9523b5b46a1e26ca9aab8a1f9e926474d1fc827b4cd3b63b24ec2d14046aff51b73f8f84c551a42693f58c9045c5673ce557ff6a279e83686dd6026b152533e594de03ca3d471da918490b63f3a78346689a4ab62198d0d37dd6512382c662c451b168bc05c446cde246595baee46173953c441255f2680ff1c7ec9014e6e5a148c1456e4f2a2d23864617491343e210f9044737612167b51c70923eaf592b957223f0594a7f315116912363dd9f4731ec83ba02316a170de86333d2801746e5034929e23c83ab70878633d768200cff94a39e2569263ae15e9d44aa237a0cceec1e3fd2d5164db4801442392d7298b03a1ffaf9c7dbe11b18afbe244c8ec490c48850dcf0d178d0037325683bb9beaa40d6a5a0d91fea23355187ff3563a3861f2b23c98f11b53c04791420959250da6a82db31c0fb4ba046f9c7bcfe2d2eb8716c6a65bdf731f5a42745d50e26d275dc41744142f44042ec0db4ce54d9c8c9c942d4e43bd0c1a0a5efd427d28c09f144ec20a80e4829b5b01116df245447e24bd06701bffdf5da60cc553846e86651f879013a94244fafcd966156f01aba33db28630f261261e80c704b1a5b549b86aac4a14944e27102494a3d81dfd6ebdc7bd465df8e59823558d28da55629321a081c0df095ad7d0a24622ad0101e037665ec5b02e4eb49855aa46b8691f9343e98a13f86642334929aa383dc4249fff7fccfa3f3f9785aea2b50926b6c2732f1e127b2a90acce3ab71988d72f0d7b6679430ab0b98c2a8be1a95133abb9531ce3f26bcb5d57a51b1a22751142bfffd1c5da3845f070d203c7f5949e5510ad82148fa9d3f2694e6b2dcd5b47340c0953833857602dc37f1a12594e181cdf665efa1451f9bcec6a2766eecf19ebbd56db992d21488f82f812e4a399661864622b944bbdeb331511c19847dd3486f0f0644cc776e0fe623e2bd547f4522c76c8b0d1df99bda2d0728d7676562986bcd2628317d609ebae444ba4bd934920ed5760272121db4590ace02e51e62d6b7beb9a5211b56905a67915a3f29b6939ee797895a0e4eb33abeb5c2add2d0a327ab2f178772854cff583d8a52d5fa47524e571ab3480b91ddc117b6cc81acf7296a5703994ebdbf7ffd1d8e227773d883df3dbb093f87c9107285a0e0e1ebc72e2e81382008473026661e2996ff221834a2220bb75a4ba9a2336ed4e9a9804c509de574053be22ced90dc1f0131501414a342620eff949c1f5690cb759aa1cc07901b8fb4b6d54470419c5b2d7857980b8216798bcbd4943a30d2157ac15f4603cc2af3891ed24cdefb96d75597bec1d1f531a56d0d81a44a430594aab61cefda852bd6747612a5b7285bff0866cc62efd1c82e6d67e2cfa5630a8bb3d2d0796ffc354a715eade37b5c6a6e9b1381f7fe490395512bcf7660b8cf37ce9aa1631e5d3db7f67da0f35717842320a06e045421de4cece0841ec316f17e627b366814b2fead0eaf0a7156d0b8e3812ece9404d5e02d182b68b9ef0149484587fab80a3bd35424769396659f7d4c81b9cb7df441781510bc0eada802ae0386341d3425e1ec90159a98269542d4231a349df263148f9c30aa0e1105265980e34f8b91fe09658477ac7ebfe8693e4e8e9b4cd6c10226b59b834d988b85820e7dea5da523c98b464fe5d00ca9e6539a9768d5f67f49aa323759d06f48332eae322f3b1003d6f27e329452a82898d95fe225441cec8514a5046827f2526bdc46b416f50a127f9eb421c34e39dd2b887a0c3ca3198ea9f3000be2ee54e87427ca386e3d48f5e681e36ecc3b22cef6982626e428930f82e6a390feabc7a951168079f67b39256bd05cbd6c22a537368721205fb90bcd4beeca12aae60574d779fc7fa74bd075c99355dbead6bba6826eaa3246f3344738435bc45921ea07d8c1cde984dbdc650aae6e7dd8f59166f0517b79b053b90ca0b44a99a4b9cfce15faa3a28247e78e79d28bdca6b9b69ef239aa0cc6fe5957bbc8ad4a3d7c9a452f4bf86ba9f8e65f44d464a18207846a1caa0b2d91b1bba8e0fc3d2c10af62b1a1d7a190499d3039b0e4d09b8851b5c022e712f65e5772b351577c14f08f9dacaa954711b216bab8f05b28220e5a6fbaefefaf7485c188d5cb14547596b82819a4abdb7f6ff49981ca4f6ae06d548f03b14ff88945611951e127fc83e5018205ea3e2c0965342cdc927f51f4fd0c785252a791f80590812c209245d989a983fcdef12f68a8a20b59b6111c4b814035d15749252e607bcf597636b8cbb5e0b35976e7ea567a6b3a4bd80d8a610e78b087064f40cd433d6f0ff4b401c15f54a8c5ba8a859dec5a8cde69e38fd168d14d36907b13f35afca4d1014524318a10bb4b74facbc35fbf0585024599bf47a2f2866740596f5cf5ad7d36ab28dc5599306f0bf2376faf2025783703594d696048775592896c8b87654cf2b17ff6e42023b53cae5b8f540eee857d7ce676b572accaa1ee41207ffd70558baba50e08ca140cc99f686475c472749218bca7df0ac7d2778a5fcf887c13f4f89c16b130e4764b21edd5b3dfbbe6769e6d0dc1dead10387b2d4b4f43c7b9546e29fc0aedcacf6ee6cd5e31a9feb2a336fc717dd02160b65a1343eb39b313ae406e7be3e152fab97a4fa2c660967940be10c2c7c48c349ba0b40f8d9fa0d426f50a03c304061a9009e547580ebe2822e000d8f9f5d7806b48eaaf410da06a40768ff0202d6b4031e1079567c14ee0e5b301b4c09b74a1dd6e588b05ca0102c9e4d6615e3983ca7d938160ac6143b944c532580785b7db12396bf22ec651fd7b30151cf6c2282de14a82d718c81a53becbefc44fa243aebcbb6e8e45e6d98cca3d9b187eeb8c57367dd9d04608e1b7b9541ce762b6c4df7429a317feeb8359aad60ac80d89e3e107b9a09d1536dadc9fb5423c3377e1ade04397aba0d8018ecd2371ae4b06b99245e040fe188a4eaf8f76e89c5b3fd44acf72aa7ab3f0160802602d93c6631b30f30cf05c84ae9a22737fcb583cc6c65af5d2f73315d70cc94a11b1cd1c7d6223589bd90fd2f6ca9cf4d3561b72e7c9bc7befa15ac7b4e10d40408a58fc4d47c9458128ae9924b031543b0306ca5b0af54b091fd0d15c410607da60d85c62ac31c6e31de3b6c95a8fa6aa4bff00e800c8689537c742a53a6ef225005eb08e5cd6e5a2b2d581641524c10b40b73929f758651a54de80db3ae756ce26dd6687c4bb6197a1ec3ff1e29c36edf7033487daf96a8fe97eb39dec1fc674f57d82d96b5d5805e854603eaff8cb94b51a9858e57533a1c36f803e9b8db733d4f76e36460e04c7fbaa786a4f1b6660472130dfd2070c3081cb27629e641165cab5b4cdb2e627ee779200123e4fc39e761d2c556be65514dd447c628ffc357152f6a2b75ce92d92f091cf005883d4b18e5664580274f77637bb78afdb484c1c2b0a365d3082a742c4dc05dc28a64c8d24c50d2e1d0fc280a025f28f2ef5ee5fc1c81fc9206ff76be1b745e495a69162695c5677a917c0c67ea56e088dca3cdf54ca05fee43b5287b9e21e421686b40d798096effc4a0862147089932bfab9438dc3236f617a6aabdc5341e6d2215a38dfaff8d5670312b249c3fe417b2d05f5431699044ff435a7a92b9a04e157da3b3fba5bc78e997edc0a5f4aadfa94fa955a0044905e1c74df96c85e2f243166da577089770b50862dc8fc24262ce9c064bb7971c94158876cafccfe54246eafb7443d2025022a690596c45b55a338d390882e4b1d41df48e829961dab7f9236496fa6b939baefdb652f63b823b07eeaff4cce445a74239fbe53645e2abbeb62ce54cf2eea174f27b914cd4830f88488a64af46879886e68528875086cea00e486cb7268928dc4a883bc6423447b8a4d442857518cd457249e203550c9e6ebd46d270b2b37a6fe27aecd34ddd4059a40e4639b7677ce5d467684b66b7088c5a19642d43a7241ea4ad35b8398cb88a9c844b1d506c307528611270805382b1f0581cd4b22d406ff65a0c0b71cab73a38ce2572a93b41cbd44db6a434998980f5016cb44be8c1659d17bdcded9ecb34b0c6cc2918115df7837d924a262d86f5507001c844b0fc9b95439e00493f8f3e4221e3f513434248f5840e278768a9df7f20af6015236ee093cdc8ca69e2c601965217b59a1caffb15abb76d1d2c2c6bf84cf5b5a9cb1831e939b609d609ea62750ad51f7e7e985a851f6fc7ed1096700ca1bbe385578513e057f87d22dd4e5f0286893553f341176d95995f11a08aff0e97d739d04e99bbee06d634360039b3546a7405dae8c9351c9dfc84a0592eca7f588a375bc9ea197602ee83e19c488453de741c16eb710476310f99169c58bd98d8c0b3ccab42571b1f065d57e34961ea06f03bea2b23298112176ee68c11e461fb9b4a9746e8c90e74d9b2623eab7832ef8c92219f77255e8635df59afbc3cdba83583d62f84c20593bb12eb1ff58e6e7d69a4ae41ae762d3de708cd418714a4949a84d33fe75ffb383d7cfe7fd5730c1fa321f53848f56858a88b69476d0eb64199428e0097148fe1d0913ae1c3e462e2c83583b618c462e7f4ae5baf797e1323aa0c86ccea5284a0efc6db277180242e54a7d1c5fab663c6b597edf1809eef906897a9679f2b73e70233690b9e5162802b90e712320df24f12a57c27f94965058dd7cb2f065bf8e18d1b69a2e67a59a4fe0cac0c8b0887d634704e220cba54ffbf18987ed384b4b290f6f8e4e26bc069bdb45a6c0abbaa934b5d9aafb34eeb63b94d084d3e679080fa80c782fb05f6c255c73130c8d8d42690c72aa91f97d22e8fe389587bf50b64bd059ebb86ee904686bd26829b2f65902ae254b9786a26f9727d8845bcd475a84db20edc9004eb3735eb0c844e4b8580bd37f0e83ea0acb33a833105e70ed72cb019f642dde84a36dc19bdc0468114a52e5749a7d6878ac80c444d949fd506c62d7634068029301ca621b15406332365b045d1b439296d522beb16faf03289aec4f47899650be2419da7820d91fd9db8075ce722f3e40d494df3828202c811ec5727a22a98b35b1e3cebe27a18b8def35c92e7ab6ce0e01922ba9ed8540fd00936b0c20afb371aeb3f676c56bf0a1145175640b61789caa5fe42fe31ff8d3cc6d5260ccd2f869cecd45827252d72a76ace3b9834f169f9607c30cbf70b0b607e7f5d2bd45ddb84e8da57f1338a2aec63691b1b537733432b3022cbfd55888551ee5531f1e3f566096c67ffd5865bf455a87b084eaa305acf291ea2bd008466aae41a6f1654c3ca64a58f6b016d27aa006543eb869985f82d652bf074dfdf2991086e7aad0f65a57f88792b58995db74f7cadd50e632b1266e97a72baa7ddab453f8599504798279025b5c5797d639049ecf5b174a526b91c28d17ff08ae4a5b426e2176027581b3098e8938d911e69f22adfd1a47bc515633232f4c5f8ea8b4c995133d500029a8bafdda62d03ff75937cf856bd60f3bcc35ceba38f34a934d41f28db30b185049a2b8754958d9b360cb8c303c3f461141cc6d27aac58b8f62a42666d071b2acce0024484f21014ebf4ed2f13ed12db5da4f11080fdb217318bd425db4b5baeff8b48a409849e0fa92364e716b706a2a5fd86fcf605602f3808e8eeaa2dd437be3631c2cbc822a4578e8664ff7d74269d14ec682c3bc31ad761aa3483b3a9f1b6b880e8f52cd3835fa6db463925442d46c347c4d94e82b9e620e4f41dfbbea8be19b2570e3a40f66966e42927544f033a51d7ea82845735d3f4b33f5c7954ce6d1272a4d0070117e164119a39feaaf6b4b0563b5101b098298139f5c6f7fd03f9547e320dbf9930d8f3bef469cdf68ff303560a3a8d7beefdbee87ff2152e62807cac116bf22a944b6e05f815c53ad9e43fe695e37a38e1cc83771e53c00b484dc668fb80390f1fa2a30030d521bd8e0850ecfbefeea3baf459bf0d2426ba2e1d1c3ded8a8815346526cb9962b646792a6a629ccf4647e52926d1241184cada5af79bea864068ae5e482719fe6452ea6361385cc926d941e547324731cf27cd605aa7e94cfe6c1a9504a6ca0e7f320bec8d39adb6dbcd294872957840d793f611170e36e095307b51396e514593fb51f54224fafb2d6e0328b271113dddbd01f6d7869edbbbcdd72185fb49d5d65247c9788ea1d474a3a58f8904ee0ab428f9fa07f9d5b9f6d5e989fa6e48b725f3ccc06694e44655b1a8903d1e31ddf25cdab6226d6ef061058180ef3dc8d38e059802170a7c85b813bd646b230e3ef46d725938c11e48d76d33813ce89460414794f7cf7eb991bed7db9decaa87ef370dc6d070fa62a5e82e061719a7d194d8139729ef1a3d661517d8b168fabf9a1d46e57bcf178f6ecf6c01837e9f0d2cf3ec4380cfd756edc480e6e16f71f790211741eae5175afc033718bc8daf01804a1c148f5f893c4f170e715e088bf4050fb91ed6157de90ba720f7b7a3da386eb388b2994117ca4d70e2a7d2154e9ea43abbc9154903d31193f843a98f7f5666df28364540061600fd184a0e5bb74f02febb225c77a9fc2deefb98b64b4fe12e37d737b9bf275ec91217a7ab26cc8210b2cb9c6012425468d286111acd726594a5634bd4d333acd1549b3f0de2bf485923c4db4376ccdda8bae535c32707885f9e0f9b6f25701cfe9e9b0b148b7e34e95a4f845cc7c9b50911db6448347c86aad61aac8d57a776a79eb2a444cd2b42b741677cb14c24cb32da218e6af3979c050ba3d34ac5a72c7e6e4d4ade17751fe089baee70670343e5a3446f5c3ca7419dc3ecc069581208c8bd42bbac6111e173364343c510f42164647b3e300a9c69727388c2adac7339d1308a66df31b233e567c4aea25c308e82fe69b145d6f8015182358fb7b0cdbcf09910ddfc42b273e649f3723a1105fb8e481c2388a400e041e83485bbefdf109c48135e3b84a31c24ebd090ba89a2790d2b9f12870dfac0f59e4e45b95a44d38b5239f8d8185955290d21dfe96d5df36db6179664f87815aac3d668005adb957e7fb66e3aba10552d106f820bd83ce34ac19b34ffda0b19bea54711c0b5f578968f512c317628a10359c3b3fda9616b5421debf951be9c9ff3e28d1a451a21aae1f7c68494df7b4f04fcac9845d6c4b957794cb9b415d076d682ae448511e24827dcd18a9c7a2f48a5494491bb684972dd5d5ec02c2eac11a85e93b9df36f9c5e6c16a66a5625bc937465c8ae93c732c0a5170802377f983c0bdf7beeba636147f1a805467c1f92d7d14eb0cfc4a2b4d2cf893ca6803a6ffbb76dabb82b3b7f646a88cc984393e560afbe6bd65f59bd25ca332268c0022428d3bdb7065c19c149c05294d2e239bd45bba1246e3aec4144d995896c74b43fd4eacec29007d5547427274ecb56b1f186cf9871c8ceac3023036d4d72842fbee243d382b40743ea2cff57832af7ee730b5f63e35cf3cf537e781366e11e0a3baacf3d8b06762b918d5cdb1a48efa5271ebbec8825a39afc7f4a034c1da2208f38fc62696599a9f7bdab06dc531182394e7051ea04d8f77b3c753e3a0fc6165ddc6be685b9264e8e02a1132ce3d976466ca6980074e8cc3c814b9cf1fac00c80e7f71abf06ea7d63dd318d28089112393dbd10a1d7ea64e40050782575fac85a7333549c43a2db9c29c71393ecd662eafa2e47f71c8d7ceb89e7c18714eb816be45935280ae301e543895e19e62fc03994647720e35fa9ecebaeece016642b72b43fbeb38f0a8b2628b71533f5dbc7c70bcb6d8a1c1d806f2dca42a85652c175ff568246fcfaf99dd04ced17ece2158094f055a773e1033a899069c8616fa72fbb8acc9214e97c0cde0b06467f693570c47f84274f0d0be92864ab5d30630be7c43987c62e1a17cbf0f6cec766c25d430e3e016f9c7ec492742c7be79a8ac99ac6eaf189e6e2f9a39b9f62984f5b0a67d104de2dadb643cf4942af37dd2e6f629a5ea09b47f02f8601db9c87b97ed9659bfafa3087f0725ca25decaa94640dbd4c5085741a74508f7f84c6d15e5845724c28541034a4c5f657be16ed87515b132ebe281d9225850e6af947e870dc5e8d4c5e567a4fc9f0d4c4a3ca6f2c96f94d88512bc1628e170df2d19a07c3e30445dc1d284e34e6b53ba5bcf38232d7210270cc8f21aed202ef5d68cfd41806ff1f9b41a131da4ca3570247ae073aef6836e47a00f7ef0c50389a9a9b7042d9397973a739db2fa5359128c7ad24eef1d3fd1fec3dbd9c34ccff287fcc5bae13142c3d0f58372a01a356611480381a11b2710075ad193d20c96edbb17041cb3c196b6efa10565a81bf64a120e3443071c6e6334ec6bc1c84ba6f5c6baa9fe9f4665aa6312d04c4aa6371a90cef87c3561383f87bf434505256ead36d6f972121d97b8c2b27b1d25e457a0bfed709b13d58123944b2db22636d6c8718d1a1bc24be3b5f2eae7797cb11cb1cf2ae591dac1f21f38c3ce0d418dafafb471bc71a15dac231fe782ebc1c09a7efb4032f87066a8810fe619d1756a8c1e97a319db1f6c83353930fcb018c70598d4848d3d427f23927395db000a7c1f3364bf29379939e261b2d414df4b060378bc4a4a34521352b6af6170dd1b2d6dec74015d8e58454ec35f8e915566ed256436fc6c7e9d90479b80498d21e8153b946da59f7bba6061bc9306206690c59ec39460645aa30964eb8aa951910b13d3d892de0063d5d6fb5ce09d9fe5c03df68937983fa79cc631441ffcfb62204c3282eaa1b034bdc56ec06352d073ef984bc2bb5d17e8cd4356a3271b637f3647e5bdcdde0a674e9d15f10c87282ae8148da6206f462a56f6ef27e6dd7051f6240f3c794f63b5408a63559e72f23a4594e917fff3280d419284002da9f9354be3f35dfb16e3b2f9afc5174e415b0ef479ee1dd264d394b88ed9f983c20e72ae94e3ac3bca7c2384e2eb503b66cb0710f58eca44d6d86c1d1505c9a4f3deb94cb1ade582f062ba79708fadef8911ccaabedb8738d51d6cc08f5aff227c58775b498f80f50dbc635e25800245b0c4ca0be47a31cd93e910595a6e5bf46222ad2aa41ff549b3c45b3d3ae9e713c68398505c331aa4ce6fda3f88be4151671b3ebd5937dcf2afa253a24e3840c65f89ab315b4ac66943ac17b86858f2501b649724afd902e68bc5f6395e6ca61d98b303f20bf61995ed61ae339eb3ad8a6dc9f8feddd10a04b7ded1306a7d4152addedf8c561be94203d1e985d908e4331eb6ce94754a25cdc3a9cd606fa82a44e38aa591e7303dbeea20560af051ae222d4318697e31697d56577a680849dcbc16d9948a85359b7c949bb9f6cd9f3045547f0b5651b9a2c79822d131bc99454058da8ed5d1d34c49a88159f273a28529ecc351ca19a82a8ffa3a023426f3b60520db70340191d4261c7af26bbbeea62c29443ac0784749a282eb776a349153c24079326d2dd3aafbeb46c21c35b39a6ae6abe6d7c029f75b4ba641634a02518433747c46a89db4abf46391481769118d9ef50e51a8602b7d17da2b2396cdd6ccd2ece4ebfbc7bd50cd20e6079b9b5749d91d25145aa7f7cf3a456785eecf608b09bf4990355115fe020cd5245934bf2dbeb90a0ff32154c9e0548a4d206097ddbb6137700c15496c23b896c6e0ecde9392e2f4d5bd10ab857a7b98fd15e17d6039c62a160691d3ceb84fdc71f88382502f025cd69dd5ee2b23676af6c86d3691f597bd40f56562502b2477c4d2e07ea332d1a23be58f543a0192f529fb8a1112efc20378023be904aea2447f2c351b14c334a2c8c5601ff392bb0fcfe220412793c3e9cd66a5f714ac32dac4f24a7edfb9100424eda96a9840959baeac8615fded3b92d66d75115b713df83847d4f3c1ec87cd400e3ec6800d62855a5c2e1e630e782ec825b8309168baeae3a6ff1c99e002414c49b2ebde44b0f3c08409636f620736586a59cce22406031f906599d83743a2ac6e16e59ea5ff69d666b93df4be8cc068b7d7456aa6d43c8723a0a6b2180035392cc9b54c3988f060ffd00c2239ee33e84f6d1eb416b14c71600432610928653db01477c04bdee575cc23296aa465ee34bf1d10a300a74b93dbdc18631161e0260746cde0c336a2be4d38426fb9b1e06ac2cb1053bb15f8f3e2b16bc16fc55de0d5afeb8d52bcfbdd96c4ca4908b4bb03054ea4cd032e56be865a07f3e9dbd5caffe44b9d05cebd354bfaa1b3c26d5e8506be10a703d733bc27e0e08f2c1dea97dfda0d52f116757ee255fb51f7dcd3b0e65cf034b809ab4b938716d4db7feba561852bd98504f64e3b4464605e8a2079052692b585db917fc89c16eedc418b5b7897c78aebd0c2b44aed9a339d77697bebae574fa1398a9b94315e844a1d2ea8dc8027a9bd5860386959bb29564472fffa9def661c190c128d08c6fe475d2f4b4eb8a8dfe0cb8146c727a186a21225069d972666363368c5efda675d780fee39dbaddc9a029b0581fd5e7623bef23b8a27a4870f8cc1836819c3091a8f4635bea9c1571bd58b2883a9014785bb24142459a6e1d5b55741d5b57e3d2f361a1ca4a91679081ef797bfe0be769bd07f887c23a42603fda01a3784676f89f31b425c9958203539ea07ffd161b71192bc2f09557ee10f2c2f722c8ba7577bf21998e91e3bd17a440805dfa0a8f2de2a16c2ad875af2953de1700ce4e16d58b0e5cf5553ed1011a6f578d9c6366d2c7805bb0d61d26ff196cf4a44e400439c21a8bf8adda4c7b3d18f6773baca23d1d97e04449f58daddbbc79b569383b4eec175fd87ad2b438ad4930f687c4394c218f92011aeb590e9c8912904b764674b75471bfcacb974672aa0ad11cd75860b8f6ed010b03f992d593a87100640a2c6b5fa172a033008e54c0a012d1b3aa0bf9c855e9134b74cc546f11de413c0cc8e6d8d9b13ece8a71acab9a11d8dbd100e01fdf2e39a7dd4048884f8921be88a92a314d8778289ce9b6c46ddc226138084f5c21a20c48ebad3c31e1379b3462d6c8230f03e9aee17029c63fea17e1e509a1c606ddb0b843b183d7e9604b796f748d0171071d616fb20badf059fb903f594fed7307778ec63a4b5c601d19b115c30252e16b1c08e3b8fa605a12f3108de9a26c85260e5b0144bef642a3431105ea5d18dd20d3a3be08b21e4bca5eeb4e2f908249e4d24e9309c220a9244da728ab081ff68e44d44863cce4226cadff159c9e54d6b338a4bd0d1831d66ec292314bb96e233d7834fa3efcf1f4cbd0c8a0a43405e9c0cae27f57f210692f0f3e87e0bb1bd3996808cc931031a5be6633b96ebb51b8102df0b2da28e1c0baa6828222f4c484c0219783f0c6922a126c5cc455321737b42b67eb5eaaa733036d31efb2d1931285bc0adafa7edd0e06052424f33052a1a812a4d5206c648b0e58fdfa6c31f9cdac4306d80bd9a7f4a9b8aa73f14850479d2c2e52c9f43840491956211a56866013c1961fa5898713ed76abc767a2715fc5ec5ba4f6a2f395afd0cf5f4b04ccc7eed332043210cf58e23eee73b981fe72b35d6f97f99e7c9001b59c28140164365d5718e685d23e83970d10741ad9d0e11e056545e896155f5c4bf7f7a7d0b68dea2bddc86afe3504f9965f816b0029806abb02070e69877b2b2cbf4353cf79a52e2f7c89af6861badb940aea8ac5f926ad8b574f84b6289cc353655b94f31970fd886ab333f7505053293f2dce8be25e86e31013bd8fca40486db42a2ea28d49a963f44faf7e3f5d042789709d00048dfb300a02bcd109d782df369e5c23def633c8f32af03d21e39dd40bfa0f8a7bec52d1ff7346f0c3f0a8ac60100e49978c362db52e2017a05feac0dcb169e1565582f106394e321effd87ad7956803b4dc3e09348b099dfa4b3e7f7ac0bc5a4650b764bcc5e9bb0cd57eaa1fa632846365d50e2bb6c7a7a4d95653b3d09549479c12ee3a75abd4bcabab74ee83b87641b747087c18d25276e08fc4deee9069d916431f39e661374e66064ee0beaafcefab35db6c38082421e3aa781f6639b6ee823e77a983006212b47f8dbfc66b8d83686a3372bb73dcc3fc1f34b66520a397ac97d5c13e0fb756b1fd8771484a62958e119a66fb471fd7dde2514353065a2826bcbf33a93193db1230cd860a1cb47f80d110c7438afe25c563865e9bfadb9f7f3d5ff2c1b128f4fe8e86056dba2302a4c7856f651a1cc79fc65f8604b69f4f12331c78f310748daa520804a711995d3faeb0606c6c1e12e3b9de424e095b18829359cc5215c57af356ffc888649926a6bb66d51c03a9c85a1883bb6a85e35338d4149476051d912309a4bb172fc06bc2e5d21e2113d7a65add1fa54e02d9a7186686ef956df917190585cdc81af11170558483c1a17c62f7995cc149e1a9abde09276119d2902fceff2ba9db11e024d3e04a306835fbcd9cdb35f40cbc79602668f1c51086bfd7f76cd3c0890a027081fc7f4f625d55abf8dd56652d628f15dbebb3c0637823117996896db7d51cdb252d547522f6d3dc9cfa2063a318593dcaacbee3a640487f2b5bd74d1cd7ea822b444f41357d997d6ea5c49a4433b4b6f5ba3e01fa4f79a94d5d5871dc922daf65003d3706b2ac2661d18058a2734029bf1db5d8384415be439f7d4f81089a36c65b2102893eeb3047aa5c4459b363a6720bbafc68204a0557c1928c67462ef5c093e32a8731bed3fa007b8f9a45608d2c01ccc383f229f49992c4121f8ac30a5816770636f3c9f31c4d882657cea21b35b749219635c9708a075cb4e42909116e1722c15dec7e83608e1437cc41928e98bc9ee8540a3f3a1e07e500ac680d38983a898ac0e86ecd109302a10d998707263252572f5ff2280be10604e6eccd363ab0d3e2b941a1d6fd0ee2c0c34cb272780308c9194d950502f6cb2aae7fe8f770f61413c20eadf86f11d22c7aa66d18d50b82810e33f050f41c1aecdf5e45d4d17f50628af36a687a21ea86fdd168089596d1f4d5ca0b3fee3117c120b231071317c32b49a0b287bc88f60607d28c8363255cef64feb1738ee7967296150d574009406f6ac79743bab4387dc3a8054bcc0635cfc30ed486282563ce68389b32ebc36940f4ee68bde3c77e1e4abc2e5b928aa0535d17a78c57483ed6d6d7a9887306074aceb0348ef8fda39b3500aa1726fd78462c7797aac8912ea14c017d68391b58f4491ca0c6a5c99d268f9ecf2960042af4a32ad76b3d372188fb57f9708744600f799efceab5cb0fd17ba93c20042489c33c8365f543789523baf1343e2c21ee870099da0701a221eb245a40f9020e4fcec5a89c1cb108a80f9a78b0d4964fd65c96bf1dbb10a92c70cf08b300df19ef969a9c74116bfb65218504d35c649daae28e3b4c1bbfda0b00202c87d789cabd9aa5493ce54a25e60e9c5443d09223a82e355f722137a84970efb6011b69b90d8cbc01c28ec42244bcf8d3d453b98ec102d82217faea1c86d32cfe72fdc5fc4c232445f443f3ba79b6dac3af8c304bab5d63de46c34c114cec0df7d77304a9aecf9637e0993448cf5efa93f6ff008304407b38498cf81cee6a5a37e061f7fc0b1a5fbc10a207aef8b98d60c757dd75e0b3b3f93f3786c2a4d6099459d096e7122d1c5da7f1875c455d54de103611c738d6c82cd572ae62d8aa673d32f017969ff401b91b00b6b9f1be25ed18a61cd00624a656096874328189ca3c62d9c5a8212032fd6898d1555a8e7c33b25acbad3e368c8cf674a25fe48b9a2b50a4d45488fb50a4bf3a76c02b94399fd043936aacef95573896d36cc8595d0a3fb8174de87a4b299014c683d20eeedf3991b6386ea15f27cead6d4453d801e8e1407cbafee0ca560303cc2fc0ef41e3a5c8cd585fb8b7b8487c3a89c476ffeff9b3f7dbd15d7990780b7d6867df9be91ac25149ebec9d911ef0a8086faabab8391705bf2953939e81a04e895d37d945721ecd29b7b11363f4ea7aac9f36ca8af2b5f1051739c35d5ccfa5efac6c615b54bbe937b53d879b4551ddaf312e40c909ac0aa9d9c968cf88f392be34cdefc320bab3afe060560d5cf3f3378171cd909bda105e52be127ecdcea5b5ae0230cbba97704467890503b703fffe3eff356456c2738aeac5b753d7e63a4e001ad9779b81c313fe234dba68f94134beccd0a9b78c8bd5600e0e7626dcf371e77c77c93a5514004bf4c08b1c762f5e5866705e18e9ce108558b84cd96e0da85f9481f0ccb279f13f8e0b02de4c600fb8f99b66892566f21c682905a42c9d130486362687a9179be05a8343c37eef84044db1107eeb5aaf62a3f2c58df1f0421b57af5426711169863ca77e05e9582fa7c202a5177c177d4f409fec316946b7ef106ca255ff3342dac740741383edb7eaf75a59b6f9318d4e22e020ad0f7f4b94161651e5d7102511412b4f647fd60c4c8e97958c55664b9df7cf86cfd59a3002a79ec9e6fa97e27f048714fdc3e658688201848b328b4ac2b10bde733b48b7f7a395259cf6aa1cfc408dad0268ca7fa0c5023443f83dcd305b50e551d6a737ae458821b53f173999b238eee54baa2cc6b9cb91f1a2c0a35ea2268870c8d62f721051cb2a837924b97a29e0ee6abcfd140ba0d95cf8f7deeb8085014234b75328763944343fe989b02405670d560846cc85fc852086df7106eb2f43f9cd279212a66fa6cc805890bc412c0e573445fd7c75034de9cae828b2e1a94682b7ae8022732bdf6f73a69366d3d007a41a0e2e60602fb4f649c1fcadf6f11a471daa1baf6799cf7fd78c5b51397d9d64bd74c904bbf47c1516c0fb3a3e05a9039aeea810da03156fcf32ecc43f572b5d9406458efae44501b64847e40a025b50dcc3314ba234d0564cab01cf30c751babaa3b438f33112f6be240ae631e231c4b5bc799ee8b09af91ae8e9b08d3b4d7f892bddc7f3ab4db10e9e963c97a18dcb9a6b18125123b48457a13b77d1e80e6f16c5f6d5e32a7c78e4b69c75926eed7ad314d5643ef7ec385d0604adeaab007c438d7dff1d0e1bd660c6debad995e6d630c0c890055cdd5c0d847fe33cecbb0dae3b14838bcf20fccfd431db33929e80fe0217ed066780dc9d2e48974c1fc0dfbd0f74a4a52346e38a3ecfc6c9113e2800bc03c310cdba61c908690a22fd0b251933e413f8e1982dd014312780f62b37859e440eff65924f0eb5e3c1db078a96f9ebf51937cd29c34621957f165f17bfb1f3e59fadeffc1af58e2187d1fb3af04d99c74a9533ad7e8df67a5b06622667cc264b547efca84e1b9b1be2c9a3a76ca6acd0e93818155c5f167e2b6dfd06afc8692897f7609002c32ed26b58f30f6b418312c07f65a82f5cbcaa9fae8583182d16b9aabd61ee326de906abdd132c270fea86349eba9375335d3238031fc4605bd53fd7df2a14b4e84e34c6e3bd56aa7c18041dcb8f712abab866cd5727b9021f88d6a7aabcaa0ca8f4c16ddeb2a9f37567fb12871ba245aa04548a3831623d01b2d3b0ce68fba97b49e7233556b1a5a18d1de85cd96fe7a2a8db6072e101be11fc7b8cac8320b77503edd987e2c8365c64526dc0c7ea3263e3acb94228341a7fa85b38df7fb500a6b5644c64ecdad3e9685b2aa399b82f9604073d8b5d000b2d3b055759ed658beb4d9b6fb0d31d83b875d091b609f21067be7a869e103ec37c460af1c352d6c80fd861aef9d83ae8506a0cf50a3bd73d8794be50808416dde07caa1ef95eaab030fc2fbf31bd5ce67f68760214919122c35f9e63d9bf107b2d427557e5d60a451e63d6ced70329a5e6e3404179c7799b7e8a0df952170bcdc45c85ac037e587e64bcca2b6546957cc63fb308dd26b81dae1d2fc72b1fd955828adc059b927b35e9da67b423f065f55b3e477f70430372189752cb28759814ce71588d397202d4e8e9b13c18ea5e5988cf36099e62ca60f3d78ddc44a0c8919931eaebd66bc616fae4f032a882319be496a7481c869b3e13bac5a63c390da373154a5d758734d88a41604d0d9f6dfb01b77649eeae55971a4a84368bf3e1ee393e4c25d44df71fbbc296320f42668326cd385d683510df477eaee9ae82ebe0f909cdcd660188ce0aa9f2c12c8138e3f0132f0bc8b4b38b02354aa48138cc1e380c49ec8ed834394d239d506a748821f36df6fbfbc312e9df25ce45c99bd02a9e358d8a306c2150cd11bb53136f24f92ce07a4694816c812c0dd09d41b3af2c226f0f129ed9646cc8f080b45a322d824a3892e9498d19049b80910ce96780fd4b068d15c08aa14aa9cfd9c117599836adf6c61fb4fcec0e6df3a912d513547941e2dd85508c21b2d250e0f922586f78649804fd84c2ebbb96d217378d751aee156132be01616341828e4389998261050fb83dc6ce5690acafd72922ead594d87001828694da02c8ce0f96c6a048197896e5bcdcbca536324a412c3ed609d46d5e60d1825d123b7bd3487a95f33e50b8592d42bf8f2c77a9896486e445c9a842ac5f708204a88e485526fac1c1552ccc96c397170fb3afb2f2546fd5d380d6fbc6f6483c92ac7014c02c5eae4aedfe71cc76bc8f93da25bcfe7c6e6f3209873bd8a008021908d2d7b58e143907164c85d89eadc80db7eb68778c32ef195ead796575976aa829ff818f3c581d1bbeca8a5c8df41a46ccbf09480bdf3cbea84e0bdfdf71e81b16072a38fb09ecaa8902937d65cda81bfdee8846e587cff9d8d35359ad3401852c105b18344b9936e0c870517fec632a03ebe28c39c7d9f36349b0ac21d9ec48f7bc8a593f86a08abf30f94a486fe54dfffafc25415233d5a23acc7b5568a3a6614d8bf3e002072c9120acb7707203aff80b6252872daaa2f828b327c81149d494c4a03fe8e6e26364c81e47fe766a654088353fa5d45bef63cb45b5d4fa487fcd9f4021fc5a35faff92254ceed26f546da1f1928548110c8185d78f4519e07506fd48c3277111e7809c50de28ba0740ac6078919fd17e8353dd2ebd55f5d1276466df0a9eed075c0ddbb2a4522975a3e095468c0aa4fa12a5f2dbeade073595a957137cb7dc1df68562aba2fbdbbc7a6909184f2772e646e36e41cc2fe2393c08d1d7b175ddf487502f127dda3306725df791ed36f30a3fcfcee4a39f7280e38c666864766be8349d65e3cec1041655987df1fd105873664621e62619c95a14454f52af04bd0c67b1ec475cebbaf748aa0df8e32ddea0af7ca42c6664861276b5248a1604fa7ea8004f75b2729ba63c8b285ec9f9b6fcb91a34b115297e9dc48e7305b010cc4e9497f8d7ae8900da6a65e963876eb25dde6c139077e6a5670819bab61e21b20af02b83c19863349c1579c7a7ea7e296904afff57b04dd6e0209c5b7cc478bece93372df1920093d107b463fd9050deb6fd426f977ad3bb05e4afedf9a4f64f0f48e98abdc84e27bb4026dea06bd4b0792147dfd25013f6f7412ad26d94f48d9be966dd6a0c6f3a7eaec751296b509f48aefbea1f6c14e8e609948f58972a7a12835eb40288047a486e1889350273ecb3c49598ff4b79707b3cda42404ef5d93ad5e16974684dadae5bcd62227162e2503a55b5cc90c8b105c18ce92698dd0118a4da3dfb456e484a8af376b91fbfe2ed49c4befbdc75d8c8412780b48f01f9d04bd18092ad81ec1f696172e70d5cf6a4e8c1f2bd0c23905d3a9248e2b98c27f71f1150242f9e5420fac2cacf627b424f47435faf4008843731446fede05af5f802f9e0b6413c2670cfe74e122cdc62211f89cdfb65473b36546ac07405aac3a2b4e0519ead5676decc2be7a773397af192e9ecc79daa8c41b9079db9bee25d35ae40f62837298bcab4ab3f59378535c01c66828a732dc27c10c7a0416a1b54d1989e006ca14135e90238823100fdf7ca3867356af0ce0e9331e2b4ccc546bfbb26797f4ba47962af288747ecb61c30ade3b19aef3c6aadf0f846fb41619f7279e15c5e2acdf953d3e789f455b3e553c2b80d48b35cbce6295e2a8b76f97f8c1254b70600c323a5ab58b65e1d526470034f58b3dde198cfe02e38e37f9e60b1499bd516af857492a6eada92062aee55fd506f4dde4c660b9ccef4571cd03432e0151abf115bf3123c8ea4e5ed53ffb1ec9696fa309d08bff2ca1423334af5ed1f76a2442cddb2b4af277a1776569ef45f020c1bdf46ffca6882b07176d2a5d2b15d1157e4383279f8372ef3da4a4bfc3127cd176a0d54149e17672789fe5153a0530ce837b642dea1b6ea49a54794c630ecc6c4395e68b2386924907ac5bc2cc3c9db16bead0e931be03d7bd610e4c0e78c250f4e82a7aa8c1a695d3a3a6cd03261342ad9d69d74f1b060590f22b9cae6dec4a4e6c5496017475039a9716895d308e3a5207a5f1ab841e416006137f03789f611899ab8804af4174e7e6bdc0ab755f6ac44f83bc747138744065ff1f94735707875005d077f4b59175a70093ba25ac848651b12b5c47716ff8023f5c04199b2c217b37917b4b29a54c0132083308ac08269c08de74c925fe0007e8fb656ffc86de3bef45b542f84a960ba8ae7313e4a686e949abbd9d874da6707e7355ab288aa2484f4128cd375d72937386cd9a1fee8a496993375d322567b0d7dd195be9ecef54eba4b3adf5ca635fd5f2f4a03af356144a14734a4646a55aad6666683a1a1a9a4b43935332a511ea55e6ba924c53006542d56986cecc9c54a8959869d0a83468501a2b1aac99191a1a1a3458ac9a1a1b9b1a35686868d060b16a6a6c6c5aad9b5651a66439c77c9338382e5775b95caeae238b688046a3a635e79dac1a9b56cb63b069b55a3735705cd4355d35705cd3e5c2c171b97c247374aa8e8e0ed5d1993ae348e6e4e8e8d8b071e3060e1caf170c16926498a3337572723ea8afa3a3c33d06005461dd841eeb83d7db30af623b1e04efeca9e4dda1a2e3db412f0ca92cc7b7b7aae432c43406b395ded9dd9018bfe257fc8a5ff12b425d67517b0cde74c9e515fad7cd976c72b06b4f6a4130c463d357ad18f40524d1182ac7915d25d118cab1db718e393c007e600784123df68fcb63ffb6d01776cf9b9e75fa962c17f01f8ebeb0dbb169746c1a1dc285cea437bc306b31b6a6a79c7a1e5b93ac723d7be7d3e428a29e7da3cecfa80354613d6e39dfe3d62308348514bcf192addfe4721ea25465d7b10f59aab2ceb12300010838d23393938f757ee806366ae377408f9dead81ebb8d9a8d1f7a1a426997d4b163e45592985cae92562b2505740ab89ec92140686a1c925461583cd2b145a66e4374c1db10d117be8124973ab95c9519f50c74ec3a53f4cce4d8758e7472594967f68c3ef621484392aa6cd2f0506695fe4ffc3c763bda7821672d1a09dc909f9ef9631fc08d13b9fc8690c03deeb9692297384b9f4346ce18d1c5b18a53f44bac423c729a4234ea1decd52929fef40ef69351efdc74c9a05d2a6d886ea8e30af52147f30755012fc0d6b31a577cd952d4305384dda95e4b1b22f1a6897c6b2b2c3aa693a32fecd857473deb98ce13fdc25eae90be5c2d79ec2ba09e59b72192c1e2b1cb1cf54cf411e5e2f8b94e8eeef0d8b1eb3cd1b16e3c05ced292da6328b078eca50dd16317c7041cf50e15c5ef86e46337e53cc65e7e468ffd1bc238677c128f401b5228dd349167ad77a6e72c81533cf6326787c79e13d433d1b1fbf065dde1b19723198f7d0ccac125ced263af0b00ea1decb35b2e57495fe3451263478d41d8c12fcc5ae40804f5ccf5b8bf243df6214755461d93270499ff91de3bd883e87890ac925d862d1e82344ec94392c821471768c9d4cbfe72f4d85b0793247416b51618d4e7e3cc39292533a082fbadf8049396beaed31a463d7ba1881e48485fd7c8de246b93501793d88e0401885fb0429539c6999c749222908b4d9838c13eca865c8a40a20d9ca368138172982fda2819d217c674d2f27e594267a1bf42b132f480c64420d1f6d629c94112f9c716b91481deba084463b489edc98dc62819a49f8a184463d8ad8b5668cc73fb038d753ea405f736483ff552dcf22291c845ccbda564d8792982c95ecf091d9e3842a625c0cfc190be3c0f9cb576ad90540026bbb1049e49bda6708d98a8dd026c50a46397458a3c0928500bd4b64ff137187a94cb2602e1a6eacc1ed5074c4bce4095f9b0326c6bd9470f1ae3b95122fbf0014295d9ca833ba02dc0d6c198867e2df53bc286c89d972ec42f760c7499ba754b5f578ad9b7bba6dd42eaad8d5fd9f3d2877b40ebc9764e080e43074f24261bf6d58e5e92ac1eb56480fdfd8d9e7f26b22502759307a1b5f6097ba391c72199c1e4f179fd2c58670826c71ec444620c5ec8932c5f3fbb8ec4e0857cc912ffa4a74a62f042a66469c159659894360a17a4a338558ef2d5d8afd498e9493c799f4e33f47a0abd86b5d2ae14e8dc93d03ebdebf144ed0aed4d5f18bcf0222d7dd9fe1bb9ac4307cf0a7abc7d7ae327a44cf32a83f9a3ffdedbc3c7932ae4d2a914f07390f423256cc2f809b0a58022b30b21dae72647617e035ad3690cd18ad018a2816ef2f94d5fb7c847e85fdf453e2e7c914feebbc807f73bdf452c4cf13c3d9b3c43b60f28e144045fc488e03deec6452c78e95cae4a913379b34a501e40ea5eef4caf5d2b256f13fb705281890e7e56da797a3891400bc403132699b1b575ac514a635db44253da5c72755a21e69c135799a579f644e2d2436d42994f3a05b68e4d01d58576dd08ad56af649116126d898c9427d922626d0aa1129a7523b43ab688d4225d8bd4d88166494b37986e04052248628906563abbda2fbc286144ab630b89e6935216da34621313b576bf3ccfb2fec3a09739042d8db540bdc3dffc51c17c2306f29f801d85fc13dfd057e7df67e70f0ce43f613a0af94dd9278f4a7f923c2f7a1a93abdb49e226b3a01ec69e908ee7bb5cc56422ade5b17905438206251a424dab0042714989b81835f98401682e97a3399acb5122ca85e6a80c749353231aebdc64327d4a97cbb34007eb29841a445f56b4f2d6dfc68a9c7beb1e98b7eedd68cbcbe583b4134f63d43b54bc7d89819e3a14b9923456c0739c596cb5a79ece04cfbb77b0d7530f366271d3ae5be56cbb77f0cf39bdf6a9da1c94a8a2a767ab98a71084f800a9304b3616609360fd9abcb49eed48ebe0bd9dc98ea5053cefef96b40cadc5268ca5058cfcf4ef739c41d03b9084b02582e7a083240926f7becf1d1cc3d1e4e0e87d267c2ff6ae081dd912e15eb203efeaa705af870513b97cbd3068b29febe49e5f999f862c1c66ec5def5e5180e749a8ab1554993ce8e4411d8327b4886ff2983c9ec84c1eb356a193c7931a758b7986f29c643e7d40fdce39e79c737618daebb66bea7625742d100282045f9d005e7d84071c7df56f27b06cf9fad52b50659556bdb33d7a74c9c2c8092192582c5fa1f8eaa710ea1963defa88b7a12b3fa37443394b72290e894355d6d4de59444d45a402a33a5285417a9bb2bdf55225c667de908ce0cb10546a81e84b95110c62be54215995d25bd5d2db6ba3b132e76e34568a43e250ced158797f524f68ec12f1b633b28135bc753abdfc92de3abe1cb0de2574c9f3af4a899b26721721c97d89bfc6ffd4728052465e92af8acfbbfc8ca05f8e7e60fef3bef366ccbdf7563b1d08bd1789bee84dba475a72e7e53d3a9a493456fd7a4e7d15d4330c9e7a37de2d370c955d2bb77b74bbb87bbb546e50eee62e98d64f20348713b96461d64ccdba80703e7cb086753c3d68a99d6dabf550d68150f1c11aeab892cbebd7281b3d75fb894ae292a8446362686c89c66c334fa80c74ca0374b58ca1b24b65555e5b292adda127f4122911d198b56fad678b45a52a6b09011d248b4c9ae7b56d55262a358c92a2d21156de924a6280bc2a5ab19262502eb3a8f434bb803c2b60eb983aec1d59e4851b60728f2c6262d548ca657e3c36ad8e257c385a6ea4a7b7008df475529352bf0f0f9e3cad3e7ca99385892f79b250f9b203a23aa5082bad6000f97c17011d7dd177115093a74133d3b3ce59ab9e794e8308f3d57b48cb571205fa17607d99815aadf628b0c4ef6f133c78c209d6bf9dea78acf631599216a83fbf45a0762c3188e97c4ac27cfb24ccb7f4656fe7f5ce5720d4be6013fb62f0e9d80774c59c5ba1efc8896f0fd2b2ef480399005a966b6c40b5e687d532b156539e7fd828993c66dece69e79c330cad652db54ae969f74ec9527a1a7a9f867495ec55500ece3b7ea00ae3a9d77a0aa29aa409f38ce95532a94aaa3014e452758f74ecda809c864e9ddc246f0dd03253ee83b44cc6a9c3dac4c19bc294d31f9f0fe8d431693a5aa2b19a1aca8c8ed5b0d09127b2e6a7a64aaa31c255594d925195d9d42a0c69feb041327950ff54388c036b6a34f6fdd4b0d0b1af03353fdf518d5195a170a8dc67f4262f7347f31f108d5ddb1743c7ae932b45cc5da5a7b99a9f2a331d5518ad32d39292f9e3f3993ca89b7e6a7ec4dab5d1186a89beae938ea1cca849793167ca55994ae8a8ca54b80a5baa32955185f9cc1f2aa41ce8655619999654489fcf53f7bace73154e25549354652269a3a46159257455b8a76da3e486b689f294d26c6a3648e60f9498c9833acaa6f636485a442a4df4b1ca8a642d8dacaf03cd12f3df0f8db1c26049b9d5a32f57b8a75e7e473fa557551a465d665cf9d030ea285c95ad826818f52250b8554db5a41293abb2d5924eaab2d58f98f9431546f35849795ac353c7b915904a8ca7dea1c43c755095a452ea99854195847b6762da54bd4aa977a88b639114682814a94a4a419e5eaa924c9867d86bed9c21ad0180d27b3e718fbff6f873d46ea6c85e77a32f1715faf2dc757305e1d025b4b3b4a3889c72194fb98c9736401ad47a86ddcbb82a73dd6efce4a6af797bc9a45c37cf5d543c1bdb7f364ffefb5c41bce7b3652ea18679fef9879b3fa807fe4bfd37e3f39f77cffcfcf7fdb842d032972bcbe7c289a2288a28d4e9f42df1d3ef5095a97055f67d443fbd447d8d7b26cef2a967ced47e66c415d6f96acc3874e1538fabbb6fa6c856354e1af835b9f7b3cd8c3b8c563b8ede03426f4890cb0fe803fa9a785b34970f4967899f60bed421fa99434699b3f4b32497f84912fd0cbb58e2a7bb703d3b952e22229b211bdc4f9fa9bde7e58cd0cf992097d0ccede7e471bd9c51f2d3bb9c41f2d33f5ccfbe9f3e53eb99eae7cccf2c7b3973e4e70e29def396edc835ccf32933a7ef78a2f10e2ade7301d953cfcc51730955d98e5c85dd68cc0688bebcd2757bcfc11db92a5b2955984763363ff4e5b987ed97363fa28aec0aeb384802e86328d03d17910b04bde3b9cce8faa131d795d9f3870b88c9c3f3d226c907de8ba44ba8773ce7e0886c03d4b3d57b6e63eb197dcf71703da379cf772455990d508581e9d817437be9d807445f5ecf7295c9d8d8def37287d27ba2973b96f017830dd075cf3f20afdad852e367b27be7fa25cb12ae832e72f19e11ee4f30619ef155528e02fe2a327e3345c605a00f923f9896ea92a983f5a64bb6a720351e7bf7f77ddf77dbdaef76b03b4d07bd3035ba7ea0300fa42e21fa72fd405f9ed22c49de7144639eefa882c6ca12aad04f303400a9dc0e231a9beef94ac99b1f12dde2030a0366f92ede73301cc15a2b10e8a1354d13597be7a767433d03ddf3ef48c75cb7efa767d33def8eb9a6f4cbf3f2fadc9fb2aa807f7a66726fa5f4defd99eebab9a650f754000a3550e13d2f3fa0f730f0f29e973640efb969c420d73b27cc95d28e5cef784ec1d92d9bfc84f9a54be83d770981a415ea5a9bef95ad41ad773ca33cbddc917bcf01a05403864fc4094fa86f1a036db574dab61eea5f37389031cf57ef3aefbebb555019e89da3967ac6e3bbce793af7d101958514d6f9aaf3f2c6e9cb3a985cf274ced383ca72f79ee7b9b2aaccbae736d7b31aeff90da231211ad3f19ef779df75622e06f0f53d718e1df2f47a001007f7d627ad2bfab23776fe2da9671ab40bb94955c68395accff9e4ad3fa1b1d2081d858c405fb352d4245bd4fb2f1d41087d619cb39539e7bdf3ce2b0a79a318445f748e2084be7004e5b27b8e23081941088d5d9f75ce52147aebed54fa4e18aad04fd96c49beeea4102b6456cb58146f199f82e4efde116f62d0db55ab4ac69dca00adb74ee9b8af5e6bf5aadf076fbae45e32e3b3a582288d9037764e47cfc5a57bc40c2c47ba3bbbe5ea25f65beb1d4a236473d43bf5472dcf18f5acbd7e365a83f850cf3cafee583a268a535acbbb927a661d67a867264f0581a611bb78a34bc4294dbe7a35198197a4825c5cecf01507cb572fc5259ca1dea9ada1a0afaea4dea93ebb65939734425fb1f7cda6a8fbb6a585be6a0bd71aba404b9e5eb6867001b6967df8a604fe087d8338fac251a5e60035427099e5b6823c78c2c6c183c18d9a1a0c3230e13e201b46884aaca49a0c34d0792063082068d02307031e1e0e7cf8e8b141d8ed2f58cf2af9eda911241a1b069008cc3d759b538f101007c358e30e63bd5e34368885263c7efb1c539d9b8563b2d0abece418e7cc62f1789088be4cc0c2a0cc0e616f5726c282415c85e15b31cb47e8e3d463c2d8e320b4b95bcf8c7ad6f9f42fa86717e767cebff6ef876fc834c5375173e1c56f120dc9128320ed23c12d234874eaf148106794cbd5982f3e4f566368ac5c996146cffa53ca444f9d46673a99304f509a8b39f481120d073530ce19c481381c88fb320b51443debc1a2810271b89ef5065b6a596b7d7db73a15c2aa305b2b586b7737699b9c41c946fe84fbd34b68d94c5fed9472a084cbf9ada6af26b1d07fb89fe4246d0ad348a5a16dd21b5f5e5f2ecb5e215ca446a918637babbda545d540bf7cc16e4ff0e1a667adb5160a6b1dec3c6b2d1e3b8c6782b8429316a9512acde1c460d8a76e9da40f0736596a20f7ed752c3ba1af9ef3443ef5b47bdb91ac3a545265c5374db5569d31300e1ebc5a3b9a2c79961dca866c496c6f78c9934e1c546aad1447509e9e438c634aee5a41d003d65a6bedbdf7de6bedbdf7deeb996468dc8460cf6a9d06f9d1ccd8d09033ad1c7bc5e8543238aa1c991c6cc38ededfa85e6dd4da75b3e70d1c7676213d05a9f1dd0cb5aa4e3dd65a5babadd65afbb25cb87c51e9c06aea860c2c85e3de7befcd616fcf256fe0f284d9538fcd21e6783991adbde00545bde0468c4b6d48edc97452d9b06c705c39372e0ccc31eaf8dc857353a36523dc099374e45654268412a132ec94f4463291ee1526264f2fbdeb5a3635a7572edf7b7ae576f08e9907f238f5541e9d47fb7543e8be5e1e0ceebd56e87aad648ec6ad9d7aacd39c7abab1765720d4c64bad198455663215d19c5e4fcc9c7aea0e0deacc4a4695c2c0b698c83d424b633775eab1e48d23f2f47c7ae550a79e2b9e7a841b84f5f40293af9f7aeee995cbd5e7fdd9e03381a86b732c1c40940d7336834c4adb31fe39e71873d2a1fb33439e3532acc001e84b1c030e3f5d2eb3944c2d641a127852a42461b29251df455286c09b94295d185290605b5ea9a043c1155be499efa21b139e086e436cb909815e6e35dc6e47700d5966052092ac42e2210a982f4ac6df4551b878914fdf45518ae85ac832df45517a288ab283b744367d1745b98910c506c4031008a0843d3070c6f9a3e1f1415fb3077d21b5a0aae136639444c686551724a9186caa2c31e418946498f89044b421857998e4800485330ef312a1cca4862427274022939f25a1932354194ac0a413e65902c687330eb30c47322485590b24a62638d008cf40f4f1e0a2173c1e1f3c3d7cd02064c2986708251dce38cc361ce6e1c1432d28dd6cb41a94d066b8152d71e187d644c98c0e30d1c2640b85f5973817012911d19ee4448092c4d3c3470745508a1883f0c8c8f9bb088a0fa61f28b620b28b0cd309b27f17dd308549868cf35d7443960f885cf35d74030e265b4e7d17ddb0c4cb0d4890641adf454fc4f81277423c410aca47223c317a0264bf8b9e2451015881f7ba2c3e095d51b0df9fd71b0e1ef2acb53604c2e021092753c45062861058e0a28915a32c80183a62643a82458f8e0432744548587c590188142c818493fb7385a61281e4d61d814407dbe1174f6a366072260ec6e4123ffdee10daa74fb235bf82752ce9cfa064ca8152a60eceda14554a60fe38839227074a799a70df7552234010d4d1a2e648419bd6ea224b8c8c83871c0407070f793a9db55ea07a04b64eb9ba3d757b7add27dd8dca538c276e7add5fd7de9f53082c1effddb0c8d3cbcff6a4c5442e6f909b9fa405aab2cf566134e8e9edc7f5df4d4b9e5e0a3f7be73aed92957c797f5ac9d3ebf78a36d4124f1d4544c3a8e1a98761a82c753bd942a226b82443271fa1314f834231a91c28de9ed63a52a2304341d79256e8a66e5546c1d02a52142945c3a4a898141d93ea2a49739d37bd9b2ef9fabd15fff07c7627a0809ff68e75af5a4bbb77aced3edb07ae370df5ce7596d1f55b13c3f87b3bbfa9dcdfeb140c9589b75aeb59f5eb3427128dc189190a73af37bd97fc6c2096309e1ec9e11f223143411d691aa2c1abf1e2adcabc2a288c3a525018213143d44724faf92ce919d51e5b2d9dd557b7151691c5059d4d5f744957e6d890ef779113277062b2f85de4040743f6be8b9c602972f20199efa2168078f0bbc8c9942e30c662804cb8edf431828719d4dcb141054ffdb4836403113ede7a78c3c7861540115c9041280a1866280289991b922f5f449005122aa03908d3bb2958f0d969a8a00207b65146152b1b0b6fa7786babe2ade71a86debae9d463593ba0cc2f431a56785bc55b1aac78eb38d360c45b23deba87775099a185b7d8fe588204a8eea9d3892fc32219806862450fcd574a7013c3edad756c3d0bf1b6090d6f7d0445317420364363d6bb8d8eb012d230c9848ba754ac02b6f7833a94c8d48dd03eaf2d4a0af181c17a049d3cf41e88803db40ef0f9c98bf440bd0825897c1e92453e906cdae71f394de043173ad8c042056a351a4f85d50ea260e07beb258f08d731305f47973c21e03ab8e430102881c684e0a38740bd22787e29d03dc203664d84268b08592980fedb8b143fdf5ea258faf2d6beddfbf61245187ffaf61205d24f9d3207e8ad9d21534f684826cd538fccca7b093063bec4375f862f9a5e0c126d1566ebe9e6289739b5b79e3da796e393f31346f4923c7a7108e8adaf7e56495236158ec66a8a0a95e55c85d9aa2cf55361d65335304b5c94b62469797bf43665cb292b9fb5c84674ec63d234947a46dd3a0b47fef42c83b79f0c5bde9634c2789bc422aab2942d65cbbdc5a9b6b4aae432654bd9682c25a3725be3a7cac8a355ea473534aa7e185542b62a53015598751bbebd75d1a60ab2a96ae2a8f251fd8caa24f4656d5fa692de7a290ea58e5248b92a4b05559875967fb9dcdb9451eead934755967a4261d66d8aca5b9fe4d1db948dbeec9016fab2738a38fab262fd94ec00877c6b4f2fe933b78abbe0e711c8e5e882b7731e5df0d6875c5621a1fa03a5175cf0d48523b6704008283c8a05f6ba6b75e6775190cfb7be8b82a4fce9bb28a8c9982a4693a667d7a7cf641aa33e2bc6f38ccf542589cedea15f6def4cefc6db4d6bc9b292735a3a59d001e9769ec55882b00c59dae1eb9e7dafbb39e43a450bb404d1eaa801141a38835ac0828596023e1a1a75a0a520520ec8f0820a2d85e9c5184b569cb2a0a5b00a2ab2c110421cd152a04534a1020da8326829e0b0c20439a4538b20c638a2d511070c1ad885769c2750d2248956c71a2da0811e46d11e9c2831a2d511e787464311194865d41e14bb9690941ba16523b4f69bcf2c6a1d954aa1c8222debaf0aeb8aa05ca6088b742334f75161afefdc9227109171d187342d9345647c942c1a2f7d5c5ad364bcc4f6fa0815d65df284214d13d2798a3442eb200aad755b44509e1d45b684acbc45e4e4aa49cb640f14a8127a95ec4d6b00ca534e44f419bf3e83a2a15c7423347a1212de749d4f2bddfce1bb69fb6e52f92ee83b3aaf108d9595a806755ead74f7debb227d569e7220b468e9cb775eb9d098ab75c1d3584b9d4623299f9e7dc641d5585b79e82d22a1af3c24ab2df4490b89642e58801e85fad667c81eaea7c6169193a7fc44d69602e6c9ad1319f4d9659f7105ac3c456e20e52b9f2137d0039194af667c032bcf64cb9b366b13a0afce67c60a5458e728c83e6b0debbcfbc8129b3a96d7cd54376bf4d5898e92711a17e2e393f295fb649f711a19199f2e4343169921e7d08aecaa1a8dd0c03cb6a6cbb8115a6acc329da77c7ace2e4316e99ac92229b26baab32e925d9bbc5ece5a474f4480ed28e01771d4e78801fc267867b4a0f61495d4330efe02a9b2cfaf0ba93293df19a51cfac93dc76e225b950441b2480ff5f3ea28b2c8083ed207c1b1d58e6ab5a3dc082d47c441d051e4abc2ae1701bdc2ee748addab9fc2b1c14904371e3d52c4517a71005b87a7867177639f4ef35052727f2bf5f35b37f4cf2f89c922a09bdc08ad9e7a84f8f87c1efa981c24817c234febfa685d92c8e726bf6e32394816f15c619e17f9c8ae4d6b1a8d2172ee9deba9deb94e61d73b1d6fd2da05ee80034fc8f8b204e50a122338fc5083210b28c014919145c997c586a239645921cb4f4775a838201e80400013c5c1880d2bc082852bbe50523b2387173a1d7288c1468cbf5f784bc0d6e9bada8cce1fa8da47add0da5fe1982bacdeebcdead183be74d0570f19b2ed415fb5e4e0abef00230301bd7a75c7d5787c700902e82badd2ca4cc79bbf71c7ace32eb4fdd9eb706825bb0c6f19e26fed4f4140b2d5972c33ce0cd9b6d294bcf257efd49092db7996ba6ba90720104087109fada022ac1ec05e77edd210952472560c201ea5d4abd75d4b737c17fd003464848123b61811c18128c210238127bcfc90822286c2004323eaf25860afbb16f65d14822d1ef55d448587dc176037a57dad1540adb5d68aaf002e14b07b760abbc1afdb8429a59452ea75b73ba42fcf4f299ddddd6dc2a1c3ef8aa2382b89423de8f5a0501e36fd244fa7a7deb3bedd330b8661c7c23ea11a25a250e0ac2d0c60f70eae75fcea4f42b5d55a6b67dbb646605d75b7b5b3d25abb6d77405d3743c2cca5d5f3e6ccb244db2bab1256f3d25aafa5b5c785dbfeb76671b794f125ab289bc2309520d72fbe2c53b818b305cd447342888cf0001fe58b67ca172a58df455384f8f0bb68ca079e0a53ed8829054686e032c6a7043f4861748445e2e5882f48ce606294041066d2d16052610a064994b044f101244661a838a304616411650c2f68e824980c2561250b11415b6a1960e440c60d3a7c41228a151c79c13b325df8e988b8558440e6048a2a2a58a2036e694c4d0a2f4da8d8e06488d5025c98239ac00186256a07188003135466b84911ea00077246b430c101a9800c9c9511f048eaa288304d7c60071c8e18eae10a31c669ba204492498830acad52b2a8e8f094ca93aff92ea2c2c28421d7efa2294ac01b32fd2e9a92e401b85947f0a58f05ec1085043804b14208b868339ef82071023184983c112204478c9c0823258856f25499d281a7464522f08012188eb8a2684a0b5ff21c1de98ebe6cdc29070e30c9c2248b920cb4d2079525619c584116221052d2a488a771ee638616fca90f2ac315344ea680d1c3952c5e4431c2c2d26d05267ebe3431c309b0e8a863ea2c2daed4a248dae213a50820a48a048985188e6081982b4030c50652e4aee8a1488a1649f3d559610514368ca0084b142f901cf03386172fece0840b2d75052b740c8e0a6f8b96202fcc0871f8258bc67751182eff7d178101c5871ac697afef4249174face0831030e8b0c109943892a28c123061c509a2781394c0c80519bae0828b5a15508ce0c41061ae9871e40a92d3a0a7de18a9ab620563b878822b020a1217a81d9164c88bed0920704705c61507c403100820c4027b0658ef16423818e1705423c372b91542fdebf56fa95359ac9b8d202a1347ae83c6fa7e750f6c15c9addaa8f5dedba542639788af2b1a9b5e6fba9bc303f946a9d66fe7cd710682dc3e495338c7ef0afd24c1708e393ca1c239ce276750727981c4708ea5756b29bd264b5533041fcce11c4d3ffbf5f6c13a0341fee055c215fa3b49930cf993ec991077b5b2abef5bc01104569a1a02d17e8166eacaaaee4dc63b7bbb45db7fb66fb7b5a6bc8c6badd536c6debdd9507d7fdad64e201056ea0da2af767b4393edae77f1bdb5d6ea16fcfe50a690f505ceb8bd140b870fbb2fbf2a1f4dbd83ad8e16b5d65abdc2aaecc3d8b3f767f6f49ac3c4daa1ce7e417f6f3f9d46e84fe4e9dd3442a0513df5952c25f03bbe98b4dadb79d8f481e10925e6948c6a354343835563d3baa981e3f291ccd1608cc0088123cfd1b1918110d1fda13d208ebe6a5818471b366e6030badfb88183c75d2e1cf7c52367bbcfe47d26ef762e1c9c174cb4f5ccb6db7c4a389701382318d580e5d8b9c911de74c917e8b8c1b1c30596c8d6337cabb2d305444bbc9cb8c13a422b54fbc9f1930471f465415cabb513ee9c7a3adf51b14fd8b5426356e8071af3c0cf047e26700b48445f9604712c80384b63bd23b4b89e01f50cbf7073c81a91039e59a814aed455410a95b21901000000c314002028100e09c5429138301e69a2d67d14800b73983c744e409787a320876114034188186388210411408c21c614d1504500c9816fe54a02a389bac8457452bc6ee419a7d1204e2e2766a9221c9314b6e8d1208020ed8c088dd4e22536ddb352d0ba562d2ee5fc6c3f4ce9889c1d9f6891f9c18c7570640548eb320182007393e344ae008dc6b8a7156ec5a248485b752d54198c1eed500f03f9e6b94f9db47417fb340d3e155a0cdf212314f2160ea848572c28374963698101009297e5a51177cf6888efcb9ded4262374bef59e2f000e8e5687932774d5a3a4bc10e2923ecb45af16bdaa405ebb41bfa2d8c56cb0f2416988171a896d3b65a99491b74a92606b8a3510b6f62654c8548ba01fd9f10928f003ae56ddb0eceb2009514a0570f3da5c856bdea54be2ca13a4e53fdc4deb39d0323a887a9675146b5ad762cdb41221b0b15be6479e88ad208f7337a18d195a76f7404964d4aa17bd8bfc6d0953bf1a5262a4f27944cb96ad3b909426a8357d2dd93f9681258361a90d296919cbca1d2c5c0e05fff755f2b338efcc8ad0404311a5456f4795f17800786219dfc5b631e2f791e8637f39cc3a7a4b6a6aa6a8e751d36624b8af6916a12a29c83804bf3ebab86f9645f9310a240fbe081e13633ab1074f4664683f266551e57385ae7369ed6431f8c5cca063ea6458943686d9a3317d7c3241bfa5c147937c44a40b70435d055078a5be91e953c9f4f8654c6d16fe5e8a41c34880f2def9f56782a0ac4a0d2bcae721afe88f039b3cf05573860221d076931b76de6775d97114af0b02db6552515e63f864fec5f72820c314584eea8c761589cb322e78b013e260cc6967803285eb985f264afd45c0b0a472a66d0e68a2a84b33323c6d3aefc1a50941764a382cf81fca60ec97489f84bc9afc3c68bc1a5fc1a2e1c7e474d3f95569a56ce7b8a2f8e3072ae869987c2e8993181ca377a7ecec84c5fdf74fd20cf13a08e74fe3cd50ce5dea0693e01b4402c0a62133e54127c8d258ceeac355f08226ec9ebd0a105e27d47c30f2d30c29c04283c41b0f907b3cf4a440b410500ad1468a19b13e2351ac76133061a7c03fb6a1eb50a913ec2c96b55edca4f84e32c79e2b784b169777f0a8f894d433384a0074f406293611c24eeb6a4abc1e703f4eea45821f99d470c89d4b1150b2aa591d2b796ecef853788c44ecca70737d42737f80881b1e4f101a929a31bdd03163ae4cea4f3c934ff0782fb58d61ee171c680a18c3c5f228bb7730b15b0554899503b8ae295f8f010532914d29f76da4cf81caeb112d7a699a6961c8cbaafa0b498d651dbe48b907f1a5446661219cd31b58b63c2c7042928a71cf7d77e7da41de7c65b220b493bf925a6489936c394c8f4143f0d860a265615f50deba550758e470bb841963cb857fe790ee863900ac21f38e6038bd0eb6adf957a29fef4991421d71ce793a68dbbc76ddd66137d9fedb6139532eae47307509a127080f33f6322e024ba1a31c0cf97c6631ad04e47bbca458cf8901faa582cad4cf0d6360dbeb581222d1815cea4830ad1fb5b33415bc1961ad9168fb0f3077fcd459317eda5aacea3a29de17e37e5149af178a2ece33d44d91ab3f5e83702fa18b491e96278d3a83558cd92cf91e64fdf9eb1ffdd5fe4d6717c66a8920aebeadd626d7c52e87b7e9f55063f1b3cb7f681b03fefb3b9b4a4f7484b6d7cd30dcf96514e981e3a15c2e88bcb86e2bc6de28fb1ae484da8806e72ee6a7e8eaeb236d02d8505bc0e0eb5f9a5e902d35a565af25686ffacbf78897acc03341348270b6e4f718570e298796680d95aaba5a8d0365bad0eb260ea41c7822e708518823643c1bb922d157c0518eb437013537f3928be5f6d11d7080ae9321fed8b3c7455b8a1147999bcbcd6f6a033294b24516b46b5b6d392c7c0dd6cb3ca304cac118b5f071ceb94aa52889f4a8efc46c008498827a9bf2208581ae3568e64ded763173b3a021b217cf0ede4c76c0d0664083f78f3f201cde1280fea2ffc2dfacd0baa19ab1eb0ab13ae6abd00741509738fcd89ab706af6569734e7a9b971f49947434cd3c5431ac463f7ead2cd2dec4e0aa58272aaa8ecad9fa6335f0d9ef4f787f058b98c795124f6849f4c1ef2383d7e7e42326845d55c1d407f19ba8e8fca3c1083645cd074561b28996790c7b327a85abd8618634c8e03fdc500a55b284ca442929e743b0d63b861da6e2682898481401360704c4b6fc8aaf71de39a148e757b166c001002150036247cd4e3598c2262603825af0272257a82348e50f860c55b7edca77e5b69f6b117fd0d6c27e1685d1cdc49adea3828408dcd88a3402ff71d7365464d718418bb22d5b0c4e3069bc4100dd3296886a16e626a276419520ca580814cbd39fabdb29d355ab366f20b03bea34d243f4655b9559627b4ecbe7951783e82e9ccfa806a5d34de3a409409b68b788b29105ba888f7c24ddfe6be0013b954a2e45dde2a12390524d88bfdff834af15259bb6a5349c2a1e36d7ca606cc58865b0e5f0aa4f72c3df01b651d0cb4c1311484d963596a7866e806a974275ba2e61d9f4a0faad179f6be897dbd62216a0edf22d51fddbeff79b8d78bb875b80720bff0182fbdb94abdf6df8430c33fe7a00b2eecd9989f522ac71ed13b966de526528467d13e98f1237e78986137cf09f30212c1f44790ece2368ccf303b3cc43a607f6338a03430461a43f2842469f28f09f26c6fdd89f89702faa5b754516ede657661529c8ff6bf928103c9faac64a938245f297264c91238a73e63da82f448a495874439de9e79c61f9486bf4f69b246ecd8b9ba63bcb3c6a4b8ea265fd718cdb398caf1c6f7e9d0da01c9b9309e11699c4998df2c0a2e7d1b4e351fc964e8247911ec713870d91ca33879bee81ce99f1d99d4ff73b8bf83c8ebf1d2bcb7dcc6be656506d51453436a5605216885fd1d96f6badc78be8302292ecb7fce9c129c19f632aa50e5d5198952fd543adba1c7098912e8c3f729872eb41b4ee0485370942db997729f0a6202cc6a170c2d7f6faa021e7cf903d1ecd493e73bc4a38b0c38638d25f97c32034414f08354991f3a73e025eaa878aeb43ac8fb1c58d91d959a7f288dc78c3f27e052a1f814d9d6e4571466beb777c2b25da3ff76add53f16b05455050eb47286314227370f6e1731b0cb95502adafa31cf6483992fab82166ecad2f7d992f3df4cb7591e073f558928eccaa401ba451d9d2448d98d43941eaffc0ffc2a2278259063587b741066fe3653b931b1108b8d826af9281e2c1f83ba46945b3439ea175fd8ab1f34ab189e13fdd08c68f0678b5e09018bc982060b540821bbc33d1b4549aedecfdb4ead6bb18e50f92882cb10cecf9067c37aa6c5f85594f29a70e68e824577a1e0c822f58ad24e70edb82b9fa4f257dd6f43752c36e8686fd4a43292c6fd30924e8c99621ac12543f1a96a95639f5da5420c9a38075b92a1bd386a0ef56a05587170c503543a2ccd0b6b36989141a35a3b63b0def12bc7de77d6bc215c9729014a13a1d781d6fe5506d5c7962e477fdbd9d945c05a20d396efbd6ffc8a9a6717a900db258f7c3819dc54e933f21106c996d3cfef258af07fccc0280ecbfd3bdcc5a7bf0da4f8a2a3319829e75ffea245525f505da8aa42116cc65c2f8fc2be84b2f7b05ce8ce8f2eaf15968edb0c1543847c22358e23df3d9ac5603df774fad84d56158b9ee55269a241e736f5cc5a4c490c54ad5cd806cc8e3b8feebd0a47e9172b2fae53ec7211ee09fde8412e4a37babc4c928e5895cb1af11cec396534eaacd215c0944b1d4d1a1a49687a0177ee4a5142f58a5ca4b409c138846951562dc13fa3d6782ef7961c053a0379e53622ad7230f2a1d0b9ea7dc8dbee48097ce9ed8ad03f8615519a0ef91f272ff1f6a5fbd3732a076a34372f5591bfb052b7703fc385db40ead4851739d556b41955123f7d5511ea6db04a51ea2e1de75fdbbb285a7f274ac264273455272fba9e2e70d7dc4e99bc9d4c3c1d8da68a505bfb19447366514a4836dca580c62c515433a6fc75116066ce526ee1167ac47a4a0e43b41da048f235d944c4bfe13f45e58d5b5e0e8701ea412b46ae382e826d960982e9bc1b98ac50d755f4359ce3c93544d18b6a48c6b55d53425c32e598ccde471b44524901c8635f54174e721be5bd58b298c114473c4f6aa7fee05524fc3b6c6c3a8988b02f15e634f3b86c3e3ac65dd1c20cf556965d5a36c3b4d1c1ce02b67fe7438c0ce256c0e450beaff653d4211aea5015dadbd8e86f33f46c60458f0dbed9c70bb02d8b799b020a769f4ccfd036cfee535368c6fd77ccd2002741044fbe876bc10c2f7cb9a86310045f5fa2ee6a91d67dae311984c8a9b21a7f655086ffc0afeeb439070ed1d2fcebb4f0ee78020196c96596f3793e0fd63f4bc91980f5293d163af79e5c08e2cb0594fcf5285930813981ed828810457bc897efc52e89190b39a9150125d5fb6c115f03a75fbb030e76f8d2b513f36514621ebf1744302fa1fd196b1b1ad12670f1b28707d5e2d70738d8c67cb9f7603125bb58c4e78c1d0af67052be3791ccddd9a7cd8822912775426b4c268868a0484eef0049a915ad446ac8e34b37f8d858fb0218efd7aebc727c1add3e919427d34afaa4bc163bcaef2f27479c33e47352c13a1f98c0b4923f5a4e7c09a893e50561bfd01079204c5d41de0580be017b893da8877c52efffbb7c6e1887e7f7341e5873049ae179737349c30143a63b9aa742b3d061d53cd6461507c785e80d14ae189a38752da53650d83c2c7c3a38d710e48f5f0c8208e120bf912b9af88df36bb21246da146a224408bd3caebc291a86e0d31e69f169259f5573e69f3c05e177c61a5fa63116485358c1eaf9f34cbcc2d413e745db718d46881d85196c4df6d7d0097451131399965d5d311eb3cf3a9963dfe4895bad52a335e546490834493524716cc2857051ffd6b30d09b78558377ff2019019d6fac8c67c328915e6699c9f0dd143acc58d763cbea170db51c3bb104a1c0264ec12f2f4bc90d7d22b9db50c958362dc5a8b4b873c9e3bb48d125b88be19d66307571c846eaf0df1851239a4f3084f66c7cd82236bfee9a1b0d2f79261d7650d534711875832727330da2f598f8f40587585551032042c3c82c27bd711df9cd153b260fedaca8d3231ee95a9f49d76d4a7a27259b55179210dd3809ddaf00aebcde6f66228ddadcd3a26337f123959fad0b4ce866bac015e61363c9780621e8524d81ecc4ebd362442cde4c0709966ca5fcdf9aa839dc673133acda5d5612462136c7ae174ab09896ec6284cb3438c092d3ea50d0e169a2a24949b819059e0d7d2a28d23a85b93cd0933eb7f92cc4fa1a37c322a1dd3fbe2a1ec2d5f2cf94a41d81f2d61099326ef9aed5d151d0495dad226c7cd546cae5d357777f5877245e3b97645877dd79f3a4d7944d3d4ff30145914c320649b98df6c10032336fb6e1f730e01aa0288ec7f5d8609d76285ab4a32c2127a456abbe4eda3f2942098cf3a814367fd23f0595acf663beb06f97607916a29ff748703fb285758f099bfcaef144ffdd8278fe137dbb0d18e095e9bd04a423583e1b3ba571919cf63d52f0047fb3d31e12812bb7a969f5c96f060270e19aeb0f8a44a21843f10c3be09722fef6b05123a286aee51d9bb4f556924b705b793d161975c69119cef9b98432f6c3447eb5f19cccf84a6d70e5667432099a462ee863c28c30c303d92e2cd67702d941ad067db167ca257b52d7800739681eeba4ed90270a82616bb5b93293e13d10f1c3942f2ec9b9e517040446e0b6d2900914575bd2429cc23261a8ef73e8795ee6f093a837fcdf9c4d7cccd2ced972600c8ec6c5fa9eb64ad0d476e5d28799e4edc1ef9c1c1b426cf4a7c0f7ddc639a9abff8dd98cc4a83d438a1c5adb15e71698bd0adac5511f17030aa524a55d7dc38e299561e2861eae95dba3760d95011c14ca1d721a5d916363e0df39abfde32e30baac8d87b6f0cde75ecda14f57610dcc742d6414eda98d926b3ae2c18b082b1dde1954958382c32464b2490386ccd9151c02e2c3c6bbef83ea4b39a6aa5e4288d6a8f9f89dacc0373bc0ce8c41aa6a57d1a10e9f230e6a161d652273fe280bd2b7634d1025867b01ad0335f83118fac7cf1eec97100db70b2a5684cac2953e5efa3eda19215c62e100020c029750bc4788b8a3be531f1388ddbb8410b077490f83fda99fe3e587b6a67caff6882a0b1ae29cecee439b2c13e57d36a3bc19e2898e10a5d08527dc0702d5972dbf51856eacca4bfe648ef8561a5f631e51e42a8db508b178667ce2d4105d88d20a27e9e3bffdad5a1da53920cdc5964336f62089aef20f0516bb5b9f11450380c781c78969df02daccc44c42366d87784e5dc3dcf42600a7c81c9cdca02cb85748473f0eb57c8d358a88f0cd949904265b0c45906c5dfa7540e2a9d2d52e4f2a19c3a38be1f2f57a7d3ede9757a76ba1d8f8eaed3bbdbedf674745c5e9da4dbe17ae67a88b770b1ccf98d45fb3651f6025c11d014ddd0e0051cacbfbcccdfaaff8cc9f47f5b9fe9a277d3adf9beb1870a132eba8cd158c92de61ba77d5d2d91fff3762e3658c9eb6a8af9d7fbb9c50a4aadfc3a0dd1a3428b6c849a39eb3b5eb8a1f257cdf831bbc0bfd7adb5f86b1c27e7c056ac896a39296c9ecf875d471778b0b09b44e6889ce43224f41bc46914001ee3ba515c3fb9d5842493eb93180c3fde8b3eb0f32b610ee2a4f96f833f9a5b1176ba3b1412c074c31569b99def6a194dee98d7d3adccac9988f1fb9ce728829829d6b19c5e792a10e69b13b3b33467ff45dfeb7c0662db9a07f9aebf8013a154370210d8bd21e909b471525f5e1ae22cfc7c24436bbc33e2d331b2ac800a6ef0694f9e542651c621f5a055541495d0da8ae04f55d2d76983b02da64210647b91585af6bbe6ae696dca8aae1bf930c9da9b679fb1c7d83f68b86d2eebc82a2e242959267ae51da4b6363a059c933c50581a9ed78beb4ea32b12e2400b3ac2f6f12673d063aa8d320f6973c12f5ce43a5ee7e4c430e017ed5e2410ab1060fe3c2eb897ec89e624de4c8a76da432aec705c7b1aa21180f4329fbbd51cd1577eff9ff2447aff6e50691f07cb7e0726934dd892e4d714db6b4ca3b615cf2ca632020a08f24274f23956aaa80d07acb7e94ee852f3190a46ba498302d8fc580db55b7bae44cbdae6cbecfed7716bafe5db4535792cb6802104503157084c463a0bc6d178a6dbb23bb7370ca424e1f214afd4211ea400574e9a7ac420cdd03d2abb92c6d4995668e5b93ae7998bb534fa1ae7221eef377493ec238e39f2589cb3b591317f6071aa8486e55072e08607536c3b506fb1a2c83aab4a91ca3d6d49725815799aa5171118415fd51f8866d202b873fd70468db388e71b9cd846442839ef168a522768590606c97ac4120ba0d435ed1ee0b87e747fdb2f91ddf23d03eabf82d2653de9c740e9a63d928e4ad3d9264daa0eb1d495e0f827e855898497ace9633a85d69079e42a44b23933b072b7f812014ca933d7d85a8d98386c43563f0c9632c590de13fd5524aa706f20d23d95ef83c7a34b13b164f59e9cdc8f20022e2078e5dc5f696c75023ebf3068168551fa94a3e28ffb1c60653d9a6839cd919ebaf8933c4c451e371c2868dba6d57c386c3299fb10a762716006a0531918cdc26bc9d4d6c26cf9b141927ebeedd5f791d89fcc24ed5a1a8bf3d74651d969c6896a00a602a33c3a3843088544857a5d179f5e359092532eb0e6c631fe3572eea0be8282f0c00d3d413b1a3b31d60bec166d293c9d0fc13c248ed7c6c56a6904b6922f16ecf48f8653a3005a168ae0937c4461761807446229e334a30e31778c7dbf7a20dd0246fbd7d1a32f0e355e9c41151f55ad8e20a49eff4215eb3584e876ed44d8d49c63b17f6aeafc5da22074c416664b7b5d83c9b10aac8301155c46742bc44c4747c952227516fb3a6b1566d399ad1894f11dea45fe14a205af81dc8ec522359ab82bbce85fbb351653d982f30fbab79151d60220e655d691dad884f2640110d08d3103bfe08ad3bce7747d275c62246b6dbb031ee8a560542cbc9c7c55ef88192f62d80bd6190ef1bcb8c4a91490f46ba1e45298e2bcb3729f05f12c65ab15e83d6cf72650b54c804bf5ecff1f43e1d293a5faa3d33bc6536f1bd5a828f0782e050b9e9774605b71ed2190fe0da6f4396b415183351d77e881049d2bc95d856200fc52faac2623913f1b32463aaa23d1493463413f121d094843e1e4bb4cc89ec6ff75ce7d7941787b4de8b5ada2efcbcb98d833474957303c09ac9e6669f4cacca400881e392cc9475a0c7a583f989c1bb6c5e17fa8403f878ecfd4ac3b876a08319a2ed56a4b5f427c102f8f4c0fc9537a637807a68e7f3b15f93287fc74ddbc67eaf7dfd39b650c4f80c1b3974fc92afa91b2ccb83725f80aa6555d9d94fd260fab237dde1bd271a2743c6b7eb4c06048dbf43e16c5441436786066e8a66e650fda9d16948742c40e965fea3746cda4f218796e4622f59b4238e21182ae1d0e2979617aacfc97e55d441b0434c237df2b37d58c8906e2537dbd7fc3e701a3bb4047ea620b2669fdeb79d40ffd39669044081bdaac9777c5cb525d7afa3d9316bef810f34bbdc84da75d5c52b4524cc6d3c784da427381aa5a965a7faabc1b979d4f682d4477ea5d4830cebf8e1bfc30eb6411fc4a7c1f81dd4f16dfb6f216ebd900c0410c95e1629bdf67be21473e452d4ed7193b71cf4c9b90e0bc4b97c1815be27ed1b8800658fc212c71aae323df3c7f3e0c294d67e0c9330a679e4f3cc87502b4176f7e294bef5560e870eea87d9d004d04fa3c286ccfa9f261cf7e88ca63f6aae0599710d05e7ac162461b05b453e02ba140bdd80762c950281ec3111edd56b5edb6ab111363675fb2df39c10449c88ee2d95883fec214ec65af90817335a2b85de55da48d696a9dab1683956c7beb440b1ef652ccb64b0fd5da737c5644c52549321825bf448a00c3814e03f04c585abb95e73a751f5f13874c948d51d51e47f6c0ed33c9cd2cc1bd6bc0adbd2e9abd7b82600c3c5aedef34d416429651e32c9eed01aba84bf9fbe168c2c32ec38c3d0bbb8eb3c00d5ecbf06f8a8b3bc92f705c7ce71ccf5c74cb967e4abdd7850ce50052a374ac984823f135be3db53364a5dc727dde92485837e2cb2c17f6bfbd98c10bcb115b52367a306f7946d63152c9d4fd886850e73c54d53246ab818e41fb9d046a2ad9e94228b8c5169add6052f32c552cd5a19b5332300afd0d26951423085f99da262b78235c4a46ae09a44a639a8ea77f2e0a41c99c88c93bc2ad16f935e0c41db9b6088833152673cacb423aa65835beb2648405c725fbcaf3e01e6cedf4a09cd541079803c6f84ddf4ed43ac1156b5a8910958c357bada287c96d7f8caae629becb80712a9d1595a775cc22951d71ebd705c64c81ac6168f0a7c9948ad4040b5eb2af1bec614e08d2da6f89ba6c9a268d2896a6075a0164253802d08abf80849bbd7a98463ccc27f61738a0a1de2b8efdccc939b65552ef343798c1496d19711d80ef5dc33485a898e854c9db82d05e2621f7332d81198c15964d31b82b4b2be7e010231308efc9606fe128c3156ac85d6cd31bf2ebb0ad71ccb27d2675eb1123aa10863d793f9fd1addbf72862ac1adf6ea4c187c4e50c66ea8a960e78130759b449baae3064c98a80b7e8d5d72520dcc6f85cb27af4108b243d21eb2ccf308d745d971615ab510e6db90b7f3e1d3c3a246da7c8534ca979582ff3c1732226d2913b2078f3d7d17a298027121583140d08c722f132451d8f8f103810dab7c4cb6b0abf534f062b24756eb5c8feb14ffde0d571c430ca6bc89d7ccb2ec9d4a035c36400448592d3a170bda0f008ee6d62b129d798964c846666444501419db18179d6f36d46f207f001f19fc6e006215e64270e0992b42cc94578cd05e70d874b36fb7f062a4476ffd15d1e4989b1d120232c2b919e1f9eb4b3e84be7393eb06f8e3b1d753f6f900f8af5218ca8437463d9c8b12fcb88abd5d6d65fd0c183591d23159bef4aa4822aa12700ffe4167142148ebcd8f7338462d8d6ea4ee19efa3232330583402b324897837baa2a1abfad2fc4dc98822b8fc7c7724715d6234a0c905881410d8e9d7d21e6b1a26c6e4e04929f4acc06e997d08749cd05be190fbe629b5b777b2c9fea051a64241242266ce83faf40a0a1ef7ec7dfc51b139529001a56d139d9f64dde6a745f0e400f304f65e4487343d9a437dd89c2ec65c03b38072d08a2e309d0567809aa85dd2ad30398b9b5518f1ec5c455484344567c808517585a8608353746c45fc448cda07e8604af121dc2bd73ce7fc660e8a8e61981af72a084ab96430c74a3c7257c6af078f8e1725ba905ed3a84f1706c56e93e683a58e0248f3935a99fc62f29649b1d2ed09bf3d6e53fd191c1a2d0849a868f39c260f2d8d45ae36b4a4a1b92096affddfccb2d077e3f27ab2b596e5ae0eab43374e4b9103d1fe14b0a125736338d80d38776682b5226ab3683d51631427a9b3bcafa703eaf9c2eda2f4ad80dcd0b43519234ebed7b08684e7c5426c658805d0577c30de9342c3fbc85f10519405dbb5c885fac3a5142f24a26ab105348b5c9650401fdaf9a97286b6209c9696558f6f2050ea08f6e17bb0dd4ee4a1f8a99b9fefd21c5175565e284979f5c4b0cecff2ae9456d962a77c0bbe6b0d2a868dc0514543214be23f3eb3f597dad0339d6daa2f256ae33962838bcc18cc2ad1aa778a4c833642f55d5eca21fcf10de53501d2382644334586de28bae1999c99a3b53299f956b0f32fb263458b1d698b64cb74401f4414f6f85cf5033e953f2e67d20c0fcbf43d73a8df351a3d17c65a7b2273e0fed4928f97b0b9b95b7fcb1dd947a3c7e099ca9ff48a58d8e665527a45d982aac9fd14074b58c75d8f54938ec11118a9cf3641af41a9027a86fc4826bcb59427a00b8caa58faba199e5fc813f7cf30d62f99493d84358db63d901c0bd8d3a53aff0bde3012d4a1f92ed116e96e22632afd90373452623102c580d280e6d2157063122fa5f6d471414e220f24ce87dcec6992c11f12d22a3f58b9aa58469d4438a56ae104872a835b4aad2e1e8f30b2d5a70abd35625ed4563724d03851de2a94461bf6d7ca2258494be090239b4c94f8f44619939e9e518da215c236c39da7e596dda52aa240f1fc7f783a02040ed56deab7d9ccf53779b2bb0dd65d06a4e9ab2c552e02d2f3da1811014d32d3936d9f6409b5a6d21c02254e762b83e9cfa9034ba31daf8e35edcd909d0cdc295cb693a783c1fc986b2a7593ce4f893c770bea4a92adf201ad764f09384206e7bbd600afbf024f64bbb8eb1543de951de764210e962570ee9e34f22cd25957c56c11f36610c9f4b464c67a6fbd93a1a6097838ba637934159d6251f26eb739d2aad1985d3e65103325d321bf82385c4b0694616304009794f07b764c6b593fbc02eb272a711ca79bbfb7be2679a12d8ff48b7d468899ee32c21c88b56850b2b2b62f4ba7426b6881c932f86fe0658c4f8ed31f342896d0663e30870f2c719221734b42aa2361ec13892b360dfb451fa02b5941ca95090e46230506333c182db8a0396e1b43684b8053ea9c429233449d086379aef2d840dbcdb65d6a3201bdef6893ce965a720746c2692aad28b3fd409c183d784747f024b2bec7c239c839c64620f836e19310b0154a0f332e5db8b0050aca494846e3dd472b5091f6eac65512b27648e3a836165c4db4de7297845b4c406181ac8543c127b5ffd69c9c8c5089bc3e6c06df0624b85c4d925f4714903dbdc811f78d7380bc1abbd61151c6b016d8652954758b3894f68751964ee9fce20c102baf08dccd0d584e66bebad4a8d452ce7f95e7987827698303192aab29e7f7f6ebaa2f51275a141d0ae3529bb048517ff64e56481fb982ac8d0f63006d9550b3d14cc9e24aafc8813b1e9e7530b838fbf1f5b6cf4faace9d08545dd92ed812890c57a6ce6001c76eb862a2be2f3d0fdb4d8ce9492d5a2204536ada10c552bce33ca9f3479248a747908d36c46466792951dd4d1d9e2d00b31be2f15e2ba2853cd634d56d9e9b34d0e46f726941b4b2fe0e2a2350bdd8d59d5569780cc776b02515253e1ed000b2919b757c6e1f326b07180895570583467f0077e52def6c844d18ed3688f3a8bee705e13e9ecc5d55796c31ef424a5b153e7fc16c4250b340aaef1d207e27b2b0c7e29a1dba9ba5ae960db93e0b7659279b93ef09549bd84a6f06481de1e5abc009659cff32a0a140cc1751713f7420126ba9cbaba84be9850372d2233a64aeb5600c35ef658b7429f9c0d817b432266836e6189987907896cc13512254e1f84e3eee281d13fbebf8437b800368355f8ee469193554a97bc15cb1d0886ebeaf574a97609ce966d79a91281d3e830a8b8e72ea30c84ad028c66935aa832e40aba3ba6afb262ab0011cf00e3d4daaa7621572049009dfdfa4d35a2cbd4a82b68db0d0291e55e70ceea87c800ddb33744d71a40297e80b12506cc43f72f6cf6cac3e36fa3af16f43ce1e54dbae371c4870028ea17c295d2d85c8bd9f78a8d7bb721b9f70392d89f64cf5353779c67fdf6a382a566c8254c31995bad2426f557c6c270f98abc786f93526a4f9aca9abf6ad6c00d8831a93451b3a64b5b321be5e88f140c3f515b6a80f15b8cb3cc1592c699a2d6ff7a6e91eed843cf7f4422c12ebaa7c0e55876b0237c9db22531159feaecc3e7f4ecf8523e568a0cc4494c33cac812a5137dc98d5e1d3f1c042e22806f4e6bfb1a2eb0f72ab8556c95049a638b152603a2dd87d62399773d756e384ea9b685bb29ce04338b5dea4d445d780dc74f85bda220ea8ad63df1f9f45eaec921811dd8447240397790fca4b4ec5979b73a76ecff485b09edbce769b280223cb1540963af4e9fa0af46c00245e15eb4642de63f602fb75e131f086bdd55d691b21a88f9d165442b9ed0bc26355c708c8d0415f6944111f491dd48f4dab2f3b3db79725123029b78f94fc1d98a44dd6513c3314eed42c855c7391b082c6af88b5d60e3a71a16ee00ed8df8201db0053294c3f5a8762220545354c7edd46bb486577b0d08047a8db15da2475941c8c2da03aa2bb83da8060b8208062528a9f823fa157e87e9c0ccd0fc7118a2be30a96150b9fe5aac3c87f170a1451677bf01a2ff86aac804d776db5ec6b8d296833ef4edbd56507fe05c97455c710266c527df93d147e0a99c3861f5692fd36ccf904786654edc5271f1e552bc9f7971495859afbfa7b67135300419f51eaa266e0e464b44036f04bb1edf07606c329f7680440491c5db000c73ba3641f3e3e52f0e593b50a7905f84f995909301b8222eebc8a8e90b2adf994e71c2b9064004e4a2af4371f2adf81a6d700a3521af7e4c7a84fac3dc96036350fd67edbaa0f4e0ad4f287ec1bd13c101c228bf0ede0cb2484f15891a635d32e8cd6194aa74bebf2243b477c930b03e133a10a73c04beca29e25860ca02071c7a0335ee43d1d56f42f10ebda2714479c7b0702de6d13bee0567090cac8a2bbd69b94ff9ef36b9bd545097f4da771902b0411dba852efb15ed8fd4ae4db14355a00ef61c3739d991091e401f8b3d54248db45c20863a60d4022aab6d3b825f61a39105a26f2f30cb11fbf42bb238e57036b544881df3dae11adfd564a256cbb8e3448ee02f7e0c462df72514df0e6324b7bb8e71e057034d295a14524c460b791ed2f9e572a34bf9cf1059d466526f9fe48cab4f8c040345d2120c9e14169884216337e577c91bcb2d885a871428368a72b034a55a9b81874457d951b588bd9b7a2d98e18af17df9dd60da01187e52e0274576ac8ed790cb7e169852cd5dd18150ea08e10a15159da31ebfbdfa39ed7dd4efcd226b6b6891763858e320f4ed6aa56b96ce6e4db87c0b74110d0739a59edb5f43a60015ba63d9b85dcdc9c227dd9e830567b80de0ef042480e9ba615a988a6ebfa05b06a63648c5a88be3bc79218fddbd0466faff8d903bdd4e083b9c6c2800b43db7f6dd26ef5d54904c20214984d2670e06a76d5c7f2f7e8ce90e6522e3f4ebd273a6c07433f9117fae0355b3c85fa5fc300cb1a7f00622c3a522f356e11db2d9b06c5b019553e51b9d5964a20128aa2a87cb0ac733cb1faeec8012983f623426b75b94e29ccde30585fe193f98436a2512bd0be3ce79f8d78d1cc06abb233e7de1ea8ae1c059d9013ddc80f9a9c01b9b7de222a1f84c901d74ef1d60901362f5c52906ea94982d8691a29efbc4b167e6dbceba5d7f399c6cb65ad675fe2396ae78b808af3d09af840d374ba2bb5733e0191365143d5b9b11e47b1f1f73e98937be641dc43d88d844fb72bfab55e26195a04c4668c1606225c166a87ff2d7e4b435cc585a13adae99fced7192339790f3107c6813b699e9c6649c7fe951e73509af3284ef21ecb835fcf318a849ebcc6be0eab179f4e324cbfe6277c6efb2d73db7f35852bb260e13cb9603bc07d8575dc067148238fa79495de698c1817fda33a993c7fcecca4a8d517ff1d12e2921418c386f5510c49f70881f43bf02b3e248eb012d1ee27f2e759f43262ac8acd19d6871264481d01fa55056a42d3e95251491a9a573b3766f7d234664c9f2173c6cbe0ac7ee8cdedba40ead1b29bde4cadd809a3a1b83207e8e7b20fe0568c834a18363cd3738ba94b48f9cb53eadc62e111eb476843ed83dbfb68e37f6227306c750031f15b6481fe0c09a17754c0bd5d9669c6c7d3729f7e68559148a88ddc5054e9afcad4565d1e02a3fb259a644c1933d8ddb2509c59c4aa2c1979fda70edcadbff79f1f666ef310c760bcaf7447bc3b13c982176c1c15552439d01f0f3688495a7b87482c4c57224a54f2d2cf55f28e682265b678057943d5d2d9f2361508079977c1d2ff34aef44a4041737dcf0c7314779ed3bc086036c3c21613f718782fbe7fc40c36b17bf93f90686dd08f930c5ae5309f24a19f1955550d48e2496db80af7f414a0f1d013d08f802c82430a6126523b2cf437238609b4762782ea1153cc37b7022680fd18f96dfc1645f8c7b1c22b8ddd769ce7b56111bda24be2902b264c9da1fbe04a30beb8db4cb65691c1fe6c514838f01fcdc3e31a0f1ffe6e1acf045b9e97363f55b8eb1906b9ce8d065443ad83eea908303ae980bc7af2157430874994cffa18f4d8e8263bf18d07326948a3cff250f37c2f6e49dee9171f2a045019438b38c2446895696ac404f34a909fdc4b3682ba32c04a7528072f896c1836320b0b1b487a7a94eda430edadad3a015d31549f7037dcf816ad42be4b2d35dc1ffbb529d9bc03f0bb8679c8630c4ed78f32097c7857d9e3cf7d03d8309a18e3d24f7ffd0fb10d4ba3a569f938723d49bbe373f25ea8ce22edbd9aec5bdc737d2af6dca96a03d048f54000ac930ff09907f70e8a80253fadb6c1098ba2c95ed479409d015e3b7fd2d0a42789f78659d8cf27c8f3f9cf1e7f223132d7c3c2437bf5cd62504fb00ca8467271667b64273ab3ad1319ea948089b7b5ead9ec11cef63e1d690a0740b16ef7302aaffc8116b106d5ee46a5e59b7acc0dd5cefeecf3fbf018cb7f19c819e98713bf400d356e92f697a404d2331d74ac20ce8583acb813da9f480ae9a83bef2d6632d24d98bfdb1907d4334640b0c019fef216b2f2cc1437d01320f38e89a44b995a50d77a0936f340cec80490392ef3a9ae353a940f0d5853b1538bc1b8a0576abc1c50d607c0aad7b22697700dd88aabfde5a1f8877cef45fa00f8ece16fa084a750f1e240ff17045ce8a87d91d50ef328c413fad3300dced91db778a0cdd8a6fdab9fcc45c19be21bd70fdb9b7c3b3290789da3fe08a6b88afac6c0d06628f0e374f71da53e74a6e6895a1d085685b5f896c3f1a75c49605b270f9d5114e399491eb09bd415280f71dfe23aa91b3c09ddf1b6f7542149625de22e68ef8c2bd0c5ea7df1348131bb9f06f39a64313be3ac6b132bcc588771b92484838a7e79c277a37f1349ed9165ccf0f4908656710df7261f932b45ae1ab033e10a0c7d0f931f57876475f2bbb06b57d9f538e57ba75831d1fa2efe45bcc84d09fb0302ea45760da2afb9869c24065f0205dfea9095e5d64658d9fd1c347ce123067ea1a444901ebf52c2f90e9218ded968884b48a423b753fadc1ef70aba937820ed2f5aac1020fef4cfbfa6fce70c7a5dc42c4e5924cbbf1f880d71440708a6e7cd8840c0d6e2ff8eaa5266ef83acac024f73e946df49a6dd289561213e77bd470e08b9e1e6477e57bf2c5a65805702889e8924c0357f25bf79b8ae310be629d4b9a81c083a3fd2740aa7a4277423f80c3733456d1133c92f2d35d11274cea5bda7fb5a95990cc45db2d83d67f1025bef4ddde8e2b0124ccb1967036ac89e9d7fc85131af2a748c4aef62b6859afe10429c3b74857f36af746476b3540748b2ff76bf9ea330e85fbbf1d606086a1bc7e188595b0e704dfcef8a2a49ce1981410dea718d06c74c214074283bcfd21c1f5c2276c552bf1d0acba2efd51103cb82ce19462d50fed6d5021bb811a3ad87dd956919552869c3e1bd55f20e814c801970b4f569ca91d41b4b23c1118c4ceb1801021b6bb7317fd4633d279a6f4dbef98c52cfb1ba259c32ceff5afa6c74b01690207550f0057e544dadff05eebdce89853e0fc01f633ca02071913741cc8623bdec59d37db0ee4fe46ba84be18d500f2cf623aecd57a4a64c2a1f943d0713832f7c307308b0c12648f15b35c5260fbc81b60b86342e377318f97b1436c344a816599e34d05f214fd9842e1a4033e46f182d42c0e68503e3cd5c2b5230046f0ce1a7d8a0f2f21609c3a5552c056420b0d809fb850d7108466b7685ef6e27a0e59ca79701c3bf0691c8565ece5e1d0718bee6a612201206c70718f65760c3130ff676200457d3ee9bbc47432c22da5a02fa24713857a63260d0a3c3a5c02de08a48f269dcc917e888698f2db1d9c3645b795199069296064e8e76122032fcad193abfb9f49f833d277746889911d15b7b6a25838dcc524b716b9bca17d79428fe4b2b40a1efbf5f9944d5fd161e2df0107bc75aa75ac2c935152b963fd2f0eb520bd0bfdc62641d066053d7dd63a7a465e92c5e7decb50c4b1dafd775497c8908e5532469c712da82f962a6a5793e473602b4950065b32564e7220e8ea8ec4d13f4e17041a787feafd2d364d27596b364e2c3926c914eabcc1315ca10e17c65231aad71201d1aa20ba2bb3476fc4b21fc5adcd566fcf7d66171627752ef3f2b5488933276a775b448faf4c6b13037c7c47030197da231177d0e785f8381f06df824a89d53a74cdd86c315f71b4b6726ba43b53840f7806d572960ed0eac17358f32daf574a838fdb77a8972206d56917226e2ce1e2d95f76783d160b0c7513e528fc00334c2483f23a070dbcb2cf47a1e2fec9542fbfd3d6f2b4701a19ae421ceb606fc77004f610105f074d2d9acea1c296a20381d626fc1e087223a0de5ecc57c56002faf3422d01b340263880e65f88526676385b3e42119da4e6c8717707ae7eb6764b05d15c429d24a07a02d8f3870b0fbce71a69488fecbdf468d95adc00436d0f9e08584aa66b2fc8a0f52343063dc57ed4f00274ecb2f1ae2bc651b3572e62330ebb1758801569c6d65b0b56107a74393a8c7f09a2e4561dc21781ea220eeca049e57c18e7bb1a803437960570605c066fb38c2b111881fb84e9865c7f8fddd54ff5c9fc72cc10737202b23f912c81e43f31526171a550d6cd1fbea3685256f92a5365fa71788e2d25e5d40f15df147b79fccf047cbeaa5ae4bb9a23f9b0ccbe2552ebd51520439f09807638fac5ba4c2ca3e2a2399b07442a21f64a9bf3387c9b7cecfd3472b302d0242e4164c6bfc68025bd0cd689fb7c0608c25c853966b8b8bd275f65037a11805e44b2c8d19e5e37fef84d6f55430cb6a63a56847019031665a98e0e95209e65a3b740e871f1f1ff83ab6aaa3d52fade934d4a8a0f348f50a90af3b6824ba8068fba4d38fe0637f69c63b1b0b5233826dadb23e419128a97900027cf044395b5ca1162da9b5b2a520188183f886aecaf70266c296283a9912776bcf3dbac2c53baa7f5f1300247d7fdebaaf78aa70aa7dddb443ae3558db1939d4431703d6279b485d718b598193cfd1e44f4e1d78eac3abd28c12f246632e7f58645fb7c81fbde98c5a65c43088a0680607e01dba485200d197b1c28b369d4b9af3948721d69cccf6cf9cdf5abf2e4374791eb4ef6352804c4b2b70c68c41d1a36fe8125675c11351995c2b39a462e0987eade52aa150653b208bbeda6c16a5d3ba87a88d45589c452598b80cd54816f3644a9afb5dd3621ea7b52b619427d8613beaaf2ed45c30965d5a70ad9b5782965550cc3de25b484058b3d0693f6e40f8dab0a7b650a59001acc03bd7d77cf0551cadcb4cd397b87656ee3812c62d8d615ba60bcf65071ec6933fab42ae012d1d9d0dcd35a65bfc04ebb3105c82ec75bbd1d58d5a3fcd1651a57702705d4b9f11dbe1d9fa50da3e5c460450a1306ba1a4e7c049687941fe9682bf5d1244df28119d02259341d82efd406d843e3b3c05039d8cc95f5ee54b43cd0200baab138b2c391695da1a27023258a089d83a9809e59cc2483d56b234bf8ec2a0af3118ccf32ed1853cc29234943fa45821e3b0269f88a8f9bba5de11e2e43af4e4aa85865bb57b7333e6562254a92b3108fa30192c78b83eb9c56f2bf8d794001a678a835d74f8f2960b79be7da4eeb162819a4773572efe2a3fc72f2a89b8aacec2f783568706ca71541294e0bb27ab18448d48fa9902757b5fc3078b65fe7d940e1392388520325baeb8c870dfcba36d3b38c4625553b859f54a4b231c55295ba603a96c1ad68805a252e3999c1e43dd5618a8719f8c1c270038d11c8834c09c8a7bfc262218125e40122caecea42f1f20d95e7218f28a7ebf2814b193903e4e5054c8758b49d0c603aa69b4b79533444901b841b4784b60b79e8a73b520aa4b91c842484f39e9558aef12888f1d52d58413b84046a86593ec73ca4ed71f887c7d4a738840d39535da02a68f6259b7fb17ef154e250505fe2f5980468482c27e6489d98cb26fa19b3763f1a69c4949ebc20e077e4b2b9f8956e1bf478f091ecaa51200c8b07e87e0e8451f7ec033960072bbc9c625db2d495334b4a2fed68e8489bffa73852887c517603cd9005f9a79236ae1622672eab6deec489ed88dd317cced4fd16778cbe0dedff2cc1bb94c6b33e7819dd20c16e0c0c4c74358877cda1906104e93164ec52ddb23b14e42a23d073d949120410badf6b9c1651254a5ae121df17af12ea1af662d91881232508b3d309c0da7e448b8e49eb815a3a98f953a3e53788c8c2b4ea4e1fadc425907f7e714f0e586f7d9c9621fd5265f29a2a74a74194ff15ca3e0ad4695a4f7816788a172f8d6487089359b89edb164059d90d6556021abea0a5aa609d0888b882562ea163ff8935110365d389146be2032c5ef07a5c3512a229c35282bed36939b13755d4a22b52518ab0687572a58a8e0a8a56dfb287b7474f63b274109c11c3988d83972aa214038693f5ca2df5daef8648ca6d6a848d6b1428b080cc81339f2a08283a718e8b7d166c860d96eda39ff78532c1fa0002038e437a3bd35e647b6cc28fe70013c7ecd617a8eefb8a359cde80634a2efa9ce391d17d14b6972a0c8783a7fcb1c5c65eaecb4ff8b959398fa7bb297518dbb61a494039e08e9276f2107c78843560ca99021723c2e882b6d8d264302dbd58ca7b8543c0b1fa49f43df35096d5cf0a95e4f256c98387508e5f6daf864e985c717e5f25aeba1d4f8e722764a8463b3c489160f0c09f27a7a3fafaa841a233db445478ee23bb5aac87cb27c7746ce9030a8a7a49ecc911434022d02082c738b1cbacb50ef5b9568c40847b50c62018ab2ea3b46bcf59945631c48069d1825e43c854cc60eee4940cfdb8a9a660e65bcb3aed65c0e67986b087c5a235933fb10eef8fd1b5de8e1dad96ce2f132827f5cefe49fcce0e79aa85526e2145c5af9297d8b9d11cf9f64f06a0eb83cb7b5ad88631c17aa00a5549325ceb970fa6d02b847414daba9686825d57a9a86d20399dc2be25fdc1addfe30b968b7c021531ddebe64e14c7acc3242f855230c8b77590eb2fdbe7c8c00be043f96f1ca608f929a2adbfd044faf3ea3bae707085694ed975fb67eacb327366f979f300de01b1ec8a894584695d997a1d076a99dcf744d3d60c0891f5ae76b23c222a044e0e6bc5f7c14c24028775e4d12472ec2825d569c9aadd44d19363e5c1dfd1f49b33be2970ef43992d223fbb141d72dd7e0840a3281d09e46ed7751a8ad417a8348a6dbb72aaefb8c11240ac2021be18e367976effd85b3abfd9240065eed22927b4890d375c83be5db2b7106a0dfcdc47b4441d958cd9f32c8e495440815dec6934f4cc84b20dbe29d8be624acfb8039edac12619fe33a25d7d9f9819d69c9244377869fea116294bf042f7d4ab41d948b5d7d040c5e5f2a4db4252126b960ac82899a3469e6543b7ac5c101835dea5d9f6d8c98312da3d018e8b1657f1f8dcce85085b1d31de92ade7bff9bb236c4c2d13328a3ccaa386aa84888dc89bf065439d348f61e21f3a151ceeb4984b933b4faa3f2dbff398634944ba702d8a751c16a9efed01150ff25b426fce10472d3ffb575adfd21e8eb3c72fc90d56fd26c2db7bc5a32501b9e235c9f7350b1ad4993d6f7ee9078747cc5499fd5a7245627f5c999ed27279fa59f1c5040c0c6c2a560d303a10f19ddc7c2a939f71646b5a15a2bdd9b232479497ff32ac4884cdc444b8150b46f802dbd50ae00479acb0998f0bb85b5c849bce75adf608bf5b8fb9487ed10923a002e83c868cd05c61a8e3b6305bba9e5518e2e65e58e0ef3c81b726586f28e4fc3a41145a2b94892125c0b26a82cca409d208497264ee1be3b5c76567d84910369879ef9c440d0b0f6ac581a341bfa5814fd229d6c4cdfae933b85b8d2b9d9b6dd92d37890c80f303073e29d2fe31681a85e30aa0193895c299f9c00e87245720c8a94cd2105c4ffd8f3ae22e49fb45fd7f5177a3ed203fca1e8c5bbc7c51ac5123a72432acfc28a30cc50fe92b6f4d28186f6e731e2e9e5f347b1d39eb00006032949d51d642c0b4bd5139a59c49c7a000b98a5f37018c5ad74fc4444592b07040390dd78c9d1894117e614850778b6a86c32d4305010e6bca6f9a31dd36af830cc258bd20cb169ee06a2a78f23e124544e8807d96f02bca1fd26e0bfb518f547e9ea5b4358ab594568b1fe7f7eaa25fc5e372793cd07b61d3858cb443f3f6f9406721610804c7428fc699ac9918d9b73e1f7e3160ea75404d5b069f4a8a3788e54264e7a497071c05c5c473b40e7925ac888e933df961b12a370cbc7606d3410d7bc5539e4e577c5bf0b878d545e82a743efdbe283e2e4d799af3e9779f2716580540551ae08222278e6f43467ecdf74ddc892d6e32efc5a6fc349cbb4282744fc724548c5c8624cbe3ffd555a4a3084fea3f72e7fb8e5942f65084e0a0aa93b1f2b2430ca1cd5d6ef1e1cf869fe0310bb6b32809f21c3f482c22909ce23e51542e755ca789bcba2c7a5a50e41c6cfe5ad42c9347cfc4ad4fe2e0c2b17629325d9e3a994096d751f9978df0bcf397630f4c57547935d88d4613a07896e9091d3582d0dc50db5166e72f111110d0c973122b827059ffd7559e4314be226a212f1dc60085ca0e010bfe75a27a2673be913be3ea78e83db81a6f338d86f57f1feb70af7e4dbeafc081590a0329d52343fadf740dfacb2648af2ff2dea08e2a44a4466dadf524b651835848ead35c65220e9eea7a09fa8ac148bade6f785bb862b7cc8b04d0a3d8605531d186889ce4dc15fd68e3dc6cd72a06402b3c663821349c3d1b3e415e326774572a27452f890a0aa4e373fbd86eab20ba87a3bf1739f693de235c2ad189d185df4f2a0c1c31f9187f9fbd224f87a69451a1ea87d31e596bf02ea4bff672a4711e41965b33745d4ae16d93346cc83831d39391f146d3e4f9c93686fa828232d0105a14ab1bcea1811309cbdaa2b9ac75a92ffab73d3ed8db91827b9d093a472b1afa6229c0fc18e154347103678ed10b786cf430d98b06e9facf8b6157c63e2327913ec4842f7e899b2d59ee75371151697fc357a74fb2249298d1fa38bbf45d2b336c4a606896e54d854c074282471c042484148386ecdb801fef9da4cdb138a00729991a6c874139383cb1113201b84b0a65d2baa6d13d5cb743f48b873f61d0d2e526b778891b92d957db4303bf49bb649d88ee1b2ccc99dbcc9fec3fa00240b12b66124d2c1ff5dab205f49cd4db3c2d471be1e02163436fea193d18a58117f7e447847e848b6ffa34b791b770094a9c1ab4178aabcc6b5b34b96d7a19b9977e44ab8648150ff818404bafaa7e85f4df903df3f050e069e9e863d49427d67291c855821d4b6d8cce8de411d4d3caf3fc51e901f706d04ab045bcb92ce20737efa6dcf16803ea77898633b5f812292208d0a16964db6fc8ac903240c0a3ded660e7e3651e2f5b33b14af9e351b8e1d2032e25cb6d7cdb41bfe1f0c6bfc31a3b14de2b3f335f789855439cff453f24934c1173d3b9f67809f4d3406ed4ce9415828eb3a7338d9193eaa87557298c688deb132e0c10abbc19f29ff9448ea8b9a9d3f1b96d1c0df50861a4259c267e1f3852a2b4f30305d52f7fe4f0f4ee9e85e2133d5a1025f16ac6937712b3c89af4ebec37b7d43105431b503ebd4b1c6929fbc060ac4aa24b98d713abdf27b2bacb518d1af966b2dbb30295aa9dd9e72055429f8c83c4434ce71bb4be62266db8625cc7e834a77ebc22155a7cd94cd464cdbfe833c3e19439cff289cef74f3c2c07025760cbe6718bab1b13fe5b301c184261ef4648bd83298a07553e58691d0527921b534f31b8313178066a252f104b3e190530c9d3c2eb599ad769d536f86370e222e7f2875986640a87ac93e96988ec23834c3578db33af3ae5002edc5ef2dae2c2cee062a4aec1c6b2e69ba68925161dd094a0432252889c8edb2178ca9b6f31112ea41c0aaa91b4a6fd20d8a72303c3bac4cb609f858b71e067f01a6d030207a892aa09860d1ad0b594131ae4489ccd1ce0837460efb9ece020af26b05f1ed772912e0086b1d2c85bcf3a7e0b928bf451519880267f0fd58c482089af741f0629612139696d36da67e3065916eee476411f132dbc5140a2b56c814618fbed8071707ebf19de39701dc09b4103bc4bf6ed966f7988bf04e08ca5f70798f1638e47d4c49c2a6031d495059455af63052da0f8fb33dc4848c5f86e973911074e9ac2ecc9acaece3819abfbe7747fe376d968a6b93b48e121c41efa232788bc5a78d1751fa600ac8fbd49caf0d11c4ecf399c335a307a05eb42ea8925b34895d95eae0942d80008af1d4c2ab280860c376ae3889bd5f06e1d1c989e8bc20369c9f005254eabe8d883b23329947475b796406a6c92e4f2a7d35e365c8fd70b0a3262bc0a17c6754fa2e36f3566cb987f411b0ef68e49510a51bb59259df69cf524ef5f815541c4aae99399b0b7f8adaece0ab8234bd5dce5dc552fec7ef850d3ba1c7607b6cf0262f1cf5b0afd3dee0304aae4f14fb16b614d5fd34b732894c5068ca22c1d63ba6d47c13b0fbf0b9aae6b690d1f6a37b753b17839af4eaedae885cfc5a8e0ca7dcf475431070c51fe1a515382fa31bf928b8d1f6e479e2c7a78c608f1c467c1fb203a14a89ec464c803d129a845371a02e5b66e47979af6f04c69f37e59638c9d8e5595c74e37eff86bc43fea19082e3649ee692e2f66e48e111b47b03d8f97aa3b1be2bef4c0abf268ae90cdd224f2202e77e14f4f74fdd8b27c2a29fa00816d7c6c94f67e6498adcd7d306dc8cd1d534cfd5c57c5203ec323dbdaa1d005eb33738c583184ebe0a5e17ff800ddec491e071c0d6995866b329d1247d4d3fca5a901ec606991949f70bb63daf0ba4e2c6fa227f4cd8d0f1c42b7cc3983327fd184c4547f995018e30e78330ff6cfcb89183cde28c07d0f58e5992ca7b1f47caf44056ab7af0055e2c33d8187be96cb36431cc7fc858efcc5ea40ec586ce420c87ed1022c1347e7d9194c985225422572e5d241c13515566269a342de394ed6cd669a6e9ab859766251194bdb60b2019f68b6c0c5124975513083c6193434382e73eabb23ed72a48e2ba77fd30f7cf6ecaf013d69f101bc1a6c05cafbbc2a1fa17d5555bd0f8b5b2f70e8320e4b66420fb9916d11f00d42f9228c38426ca24ad6685fafac8b28cda21d676053835512c32bb66acb706ce77b4be01b01c9c5e4ca284cdc69b721e1c111a76f9d2558d9b750662d0801a35d1564a31b274ae6698087313361fc08b858cb56fb413dc07567e20cdea4f6b809ab5670c0c4d8139c2f85872d009ebc38f69c564b53eea1d562bfb982986b4996593183f7022f0b5f928ce8786fdcaae49f5f593ac9d3313855f3c01c462f483d55f42d2541d17bb36ab5f8831a6d186813f003a50303e5620365ad82c2268eb3e717029f714202865d889ccb5039b3959048827c44fdbda923cfcf91124a927531572f573e57cf2bd8a87776101d92b26385a784c650590349d93c17260431fd5670e61c6fcb32d3ffa8298b6f1818cef6d6a326e009b3b612dfbe6d570407e455c6e082a1c3877683591d2df5d2381d16d23f268a64abd21191457e245d33cb0f21372dbad324ae328c85dd3a3543c880f57cc46d13baaafe9fa8038cc6cc8783c5dacb846ca1ae11c65082632aac1f7dc7e31c2f3c87b592d4d8e6ce631092ed8248758c546c2d0808a1eea6c09a1216a332d75f1185efb26d5c2613e31b06fb3a4de56871ba7cb2ae9f48439dc1b6b772b4ba3b8f7c5d21cd92942d1c8e0d07e5142880883d237b4281dfa90e41f8a50bcf7922acfd02ef059513859621e2e7f0ac2ca5da1936264340413897c8d48043e821d613d1d9ad9e61e04a2a5f710ec56ae17d4f3db17a17f026ca70ee59e6d58fbc39ff9835eaf01c56401290715263599f686c71140c8e0da536d038e047421eed75dc7c67bf7f8955be4d582d97f7d7a717939001ab097b79c39ce975675d71c47bd67a76fc4ea907f96ef6ceac33c45da5b19c53dc102cf0ae2d7e9e42cbd3c8d9d51ebbb36bc30a3d710ccaee4a7443201cd348c2c6cfd29000f2350e9da5433b6cee557466fb44f7e9a2a363bb1c5f3dc0ee5e535a01a06ea2a6c3b3d3c480a3a1c6c1a5d9c505a23f7856f26a1959b849e9be7c3fad11a30fb0c9212c3f759ddf30c954529d78d9626c195017834e2ca2573b2d0a718a644ecb00cf36f2210699aac08d112ccbf81a6ce407e33dd8a92953a06d0e08eab328fbd28b823b045b2f4bc0499b024a753573815a3b28b487b61d86fc2e3e8b23d204b75e1f3535d1900490365e13767cc43baa87b89be045f08aa382c4e89c08d3d9a67ba3c36e84dd6203c09de9d174ddfee067794bdbe0731894f554bba42353933e08cec6f74ab8972fc6ef530d59ef317172f4787abab5056b3daf23bfa4f875989a6fdf4e6196bd5fafbf1f3722695e7d8189fad26da6fd4f1c47df206944598e48c05ebbcd6ddaee098d978f78a42b70e063f235fc655e5d153c1da6c7f66df961b49ce59ad3dd2a0e0f40355298c4790947614cff8eb1c5bad64fad2b9e454b30ada5b060cb95141950a525b0faab5346173bdeafd5a3530b86756a6cab547af1daad39ee634afe7faeb6fcd7a9c42b3cd26533d615982e7510431ac4147c67641995ae639a0be2e8b8549589d03d1f6e11d0d0c0e6f01d2b2a59474d170c2ce9064f740c32e14a4f6ad463568b746469cf5d59810cd8c3d246b8742b0147def463da94272ea2be0cf489ef447a095ab91f90937b67ca9b266f68a246ac2c7dde591d6c1991416a5169318a22fe0f193f1ad27e3f7a4d478a7cdf13b3401c7371c769983d49730b3a55889f752096da8dc330ca7135f1bf76a48b91f198fb90ff686d9b18d2e76ecbaf1e46c392dcf5edcf1e07c0f84e2ad24b89a5f686736fc4d39026de90960ca30999b5576805f31694db77e7551bac5d081e93091955f9ed18fc7a8bb21ca4febd58dc9718191e219d963304a41329540779550c0601523ea6c659c744ff1fc6a3ed1588e4e7038681a4c6fa8202e2021e5e58a678c23922d1930e8a4e31cd12d963c7ee73e3118cea8bbc7594a09ba1372bc2812207d789161becb08cdc328842ba3370b636b073918d16c8251db7edab60e9ef80ebd5c511561399ca991e5af27b94be20ce33f4408e90580ef440920c53657f1e614d360e1f02ac54f59e211ed2670d88975365af607eed40e781ada3a35ebc8fbb4f2aa8969c2cdf505509c98225eb3ae4743b245399c0dadfbf4c9dc6e89e31a129be3e10f27341d7fa9ff1a6850f9db0d0dafd5f7540d1548a413abe85c07a8b992eeff3eea733f4b6ba5e21a46951fa6bceb51936a36b1e89a36d4f040b407c4d8355f9cd0379dbb58b5cb8e424d730be62051d973a4914e71a178fd9a42488507788930f3a3e74f1e43f7bbca8d3077cea81a974658baf61e532cc03bd62b7a32d415b81fe4c0c610566cb08e55cadf0cefb14a2b07b9e3e7ba9f31712e9d5e16f6a7f7c2a86a3c0962905c78fbe1ce25f873ee39eb7d87bddccb0376ac9b79362378f61d2ba0cc53f10238a659a545aea55f5912ed196d8280c268d01c673dc9a675551048a8dc25f946987fbca24b7fecefe50e065c03428768a23340c918cbb72fe2c7663c57eb106dd12c4a07d4f6d7067a9e1c16a28525e270d57d00a1d96f4513afd078824aa4a5c811eb9469d06df8c3b5b8899d4b8f27d4312338c3826af09b3eb544ba32cd40f757c951e354cddba468e11df892fd9f8848b623e158be8292f11c8c1176e12fa27ad3267db02785c205c1e021da9e3d2cc1ffd6687b289ddfa39289fc26765939aeb0680b135e858ef23e553ca30e381e55702a4223a40d17dbd6289c42d4071b3a802a4fedb1ce745698884cd62feb58c7ffd88df84d713aca2280b85dadc590043671814f405b1d684794bbbe9e16b4a4c5122aed0cafc9ef3d8b36095cafab9335f2afeb7a890bcc881f5208d1fc47027241eac377433d02db7cf4f63ebe028d12d3fc4afd065d3606b95695b132d44181f56f14a8c976a325b9918fb0cd2d582bbbd90ebbb2ea68e46f8b603766086146759a01fd1b52acf4239a6773e69e0facca6f9beddfb45366d94e7c940aae37d9faf3ce6031df64a4407b09ba0f05d31ef36d37aaee063c226d05533eeac03059c6fc86dca3e05e820d1f823af2e3f743a42e74d0242784db49b9eef105a686a45ca48ad548e032e25ba628118f68ff3ff492ff6020104a1036a93d6855b3050ba9a0e6512d7f34fbee968193b47a7de584f25272fcab5a0d6d5bd1d8db5b5bb9dbf007312adcdc55594f1f52baa57c2b0820b08e4124c3bd13b33a91ae21f0df24fc13fc3463fc8b5eabdb022f9571be94df6de52ca94640a2308440886089e2765b77be3b0a176afbabb9bbbe7243323c781649d6dfbc89b4f9fdc46e7e4365ac3dc72e0e9520564be9c12874ee736b9c949afcb20495541fafae3cc0f3def3e7232a7dbe901c28b3de8ffc123c72d4803b8b90c921c732228628a9c94db867022c20927e593227018e2288ce75dc76d40a8e76c10f7285bb74759ce5f6e6f50e353fadec7c92f44210179cfd920f05b0584facd06a1be9b6abffcb0e57d1c431991f4b9142cd7a08c7992fb3c195bca6ea52bc51b7281aa8d44feea088251f59ee6538f7a2a40aaefbeeb3ef540dda76c1015fe200bd43dca0671e77df7443cebe22742635d9c7a22dea7ec122a40aa4ffd129af79e48ea57bf7a8ea168defb1368622eee04558fdd2962e9f227e41b92c44cddd653053c88e1a1828db6d1c01cb144115960d0c10d564c2ba629aad478203921c3131d78c151c41849e0ef6febe2fe46965346203c98a2931c60aa3fa33a6eab717dae8b7e24c1e5ef3e312e3fc7f49b5f3d8175f839c75dc041c50994e8c22486c73d2edf39ec619e9f1de6d979e6797f318f2a4961d424161e564c1b95de2ba616d34c06d0a4fa5377f759bb96739c0de5e7491e3c0cbab3bbccb0778d10ca3bc6073c54168e286aab0a51c31d2e465414f183e3b8bc04965918965e1b1ca3868cf4e342577acf17f51fb7f974e92a1e5554fe2ac8d41eb63b3c902a7f65b14fbfbb33eaeb3ee99b5be94835f8467327dc4340ab2ba623c8ac989e682f3d7ae038efb8ee4b711b9d72092462b80e061495ffa71d041e0834b0a83d7687870a2a57ae3b75092d4597777880a961aa0694f7ec91d0493aa394d4ff7408a98ff39715d260076378961db5f55c74e7ee6a624321a594746e939b93eb8e93296fcceeee5488fa312827f711c1458c189d9de3267fbab36a4d92e2756d713bb5ee80d03b67aaf4cb4112ee92bfe73227edececc814705c8e6ed87a024467c31053646d08d00910f8cb4a433cb9db65a5215c602ab3d1daa8487e7777b7d7498e67d1bc61fe307b983aa4e086497a417834a3a41ac74920d7f33b9cc4cdf37f3657ba4bf7f849b9f1e93edd6f966c4856eda666e37f3abe94d67b7148832d02abe692f5e58b64d5fcc67bec86cbb29270fea725eb0b0b994bce73f3fd735ef1440a315100937a9292ee09456ebe06f090c9147a376425cd324947a830b59d245451c84a421da1689b0d5146f78955adc1c6b16a82099b6ac4da52e37ab4864da6068360d8bca20c3dba5d840a133de8dfd901c1ff224771616ef396af7a8ef3451c1b3f2938eccd52ad8955149735c4dac21a620db18c583356118b8895c41786a196fa66e9464c1f60e86338df7f53631f1ba8296ad8fc8d8c7de6b35644ac304bce73e3fb594ccef3857dacbad0a8596d9b8defc63f6425452938f666c95ffda8296ad8f026cc452d35ece68b8d0d6f98587123631d960d6d3cdaed777d2c26d692bfc234d8aca65597e883f5c5ce5811d5d8d086a86d6863235b195d56d26ac64a5a15dd6635b1f272fb3d5692f3b4be9d95c4c558b59b56cbb2925849374c378a50c51837ccbd585526cc1887440d5147b3a31e6646b3d96c368dbe19ea08858a1d3bc6168a6d1fc7389781c6a3c9aac518232ba9417f0f8a785748717564a686a8d9d19dc910b76fffefbbb9a9891fbe2e8eebb5ca84199b43fe5a1dcd9510bc3a629ff9ad2fb7b9dcee8eb8fdfcd371b37387207e8f9850b42a412277379c330e55a5c1c8527a514d88b1e70f45ebc17928fbf47fdfcdcd6c168db69ec5f828215047a82f282ea8236efca616c5b48181a2ddf893a801d18bdadfccce1165a403f374fce2afa9b9b9e10fbfcbc50d5f973f7cdde63b6794da59c4458d1ff9a6c686dd8dded3dd368a66c5e31c4fca54cadd3d544bd4f7b33d123d983fff06fb449b8475e6f760a91f6f60d81f711e0ef5f3a3933894faf991a861aa9ffef363110aec13697e7e0598c6d6596b5db55a51dac0bf0845f545a2f8243a8932e739d2d9b0c7bc81c18d13a148004f553a5d019051e5fbcfb88e76658ccf31472666b20200a3865d547400a20a7611c7d5a62e621f9a58b9568d4cfe92b28b2abf8b542fbf08e83c7d027e31cf11254023fe4acb87d64dad71c2a9554ff5758c9364d4e94305ee72ecc359018c51fdbbc6451ffe9129fa70eb4dd103f9f2630cd887b3ae05eb789f807968bc6c2957b60f57f695d5876dc495adc495527a93f3d07899f250369f9cf94b3eeb9334ac37f94bbeb45c8dadb5b5b252aaac2c12000daa7f7f18694d57f2472210fc6fb538293b8f0c8f7386702770df7593b9d6fade5f5106ad21fc8a1fad6c59550338e6a4b3ec4e5d78dc53a7016ad71fefbbdbb61934ab5a43b7774a39c97deed3e746e3f48fbbaa8fddfb501f0b9d10d71e460bb03c0d5184c39b072b49494c8c85c4424a2c66ddaceb665aaa965ab580a10186060d303d6c3d6c5b0f33fadb6f1cd356a51f7bfc155fb6941e00a755414add9097bca5f78f90da10202e37524ba53fbae6e4a056c4c80ad1c9931bb9169f5099f96025fa8043bc8931c69fd2e387d0b019373e90bb3b90aff7bb5ca1dd108c334ae58b08be88808692dd6b80db2f7e355763f15905c62f865a39afc70ee8812aad1417d0fc10bc41f497b4309f5a17916d09fdcd52e1a81a322df7e0de520710c6e470b585f3299662d410ecbe72abf3c8761e98625073c01ebe835359f50335e4a51c9852d074e5f5569c4a4c65b542255392893e6a931a725294dc375598acede9c7ca3d5f5a5b9d0af36e3605fadc141b5c48e684a6a85a6076fdbd9734cb386e0f4e97958c9cee002e2b1961b9376c6e2d410d513526a81afbc4f7483f443159d558c73f9c4c5632d641f9d8505935f691cffd385767d77fb821aab6fa72fdb72f497426d7c3590b5fc63e01de23631b352c5ccd29d3c884158d468b6d3d1c6eb8e9883a421d39cf84825ffe55f8cce2fae42272e48e2664e1ce0cd8247145bb9161f1d49a375c67fd8083cba4701631617469ae24f1a6e317959671936c96b5a2dfaa4a83fe92a6a9d2b21043d344d3b4a215c919d47045e4b3e5444473a815dd0a2e386846349858c78d9c87a60cbffcbba0d18871747dc5e4fa37d1e050c3154dd375d415d6f19fae399d674e9a8769182b9561f21c6e98721a26325b9cccd00d67971a3e65441d352c5cd1901a16a2ae606918cde23a991ba63c7efd57d8a79b35a38ca4241acdca1337e430a89a9716b47094a38aa51b3219ec5d8750d1c08a0ae583175730a5aea2151d8f7378005ccad462f4856242a28f78e937bf5593ba626aea5162e8c72749141ad6354320a0a461ac9444d18d4c46129319e91d73dcf8f1c6efb18384c50d53636ef8e373441f6e5f8afa3704c1f85c0423926c8eb631dd2dc64823b673185e6226769a52a5631ead056626d29513ac685794ae3ca111c588866482133150d49036591aa6c16d8931626e2c525969ccd1ed17410479b732573648e30e611dffa90ae25da663725c301b536b4a1a530bd3e494e444a5490d6e3c31d6c573dfd2c36908a606ccd85634631c3c51435a6b42399d798f55415097552238eabd38825fd4bb6a84ee46b94698d77fd22e1f4ddab622e7e198b66ddba06cdbb66ddb469fb6c89286881a16d23177a34f4fa0dcedfb511ff7744b7f263811b33dedd2305a5b1ad3b0eeb7a751a851c3386a53f0a71d398ff7db53a486753642f1b6975f94d1595083dbfff456c4c1520de92c16cdeef6217dbadbd3a78635190df3cd492c52b24283dbfb17d460f418db4636a628b6f3197e8a5094ac1014657128426115109c26aaabc631eb70dd37bd685ca0f4779fcf18e73c4bbc4f3d8ddd64fedab8671590f729cbb4d6e0f6de479ffc85e250a86ece80a0a13a8ed268137da235eea3ef7df329ad614dd40c7dda64b4067402041ae6bf7d11148e348c6edbcfafe5afedb79beb35d7bfb24fbc6e7b785f4d0f6a9bd5e0f6db47578cb2ede38cef36efa6b425cc46c50d535b0d883136206a378c58eea6da6e1893ee168bed5b51c3c29451c3b61edb155bd1ddb629778bc10db72a77ebd130face337ffb6d7b56c33626d9392a40424c114345e070b3492e6ede73cac9429285ee6ed235d190d12101050caa05952ee6f4ec68e1a2f51cce65252d4d6849e2685aa6b0162c1d5b38e208094b940d090b1145444ce93c7669d0dffe50632da995a4a4e393eb50a8d73526b4c07359c908a7db7d38471a9cc14542d83aa2a441ff0f68a8f18cfda2c6a7e8d4a07750821a3f8c66bca96193d672c271a6a63e2754e6a77e8523a9ef6fd7759d9279b7d088dc6c28eff628a4db7d7f6194353d313935755f5bfaf03dcf8642b4db7dd8d3366481e976dfffe3fdd1df6677aa80d0b64ae69d5b6adacad15ca9f169aad4d842d4505e97754c62fce9d10dc51365dba4d69b5dee7caeeecc990da167444aa2863db29e1f53c6d8deb7ea2784a8fad9668c14656634338a520b7b7a8c8c66b32833a3591423b061b5d503758337df6379c32337857fe6121ab4407c6e4cb7a7fcdbf723a4c12ebeb794524a2408f0cf023deef6fef5b8326e51fec7cffbed0b81ae911e17f55205c443bd8732d2e3364c0a69b0fb7ebe101af46efcc0a186dd951fcbb8250c497d4d52affa23370524d1e92a89570a0752a9dfb6944dbdfca4ecc6121a9cf684e82a20f1b7a8da6c2462525371369fabe012332c72e9ab18f037ca38c555f1bd148312889152534a29a5941d55f259e5c10c363be917fd8c4550e26cfe94a1a45f2c226a7012c56dfbdb91a86133ce8fb2228f426c8ab99c74c3e8e4cad87c21254c1a0b0ccffb240e1a54666729a3bbd330eb44291ee7782ba9221d715cadadd6a3dc3d46971f51326ea84f7d38be305e1cdbf6010dd50be3d5f139787c4d787c8f1f725f37aae0570a07783cf7f88284623c78581b72377640769d478ee7f1b99023478e2f569956878d474f1aec48e4ea52bbdf9155ead9d0482a954a4d4f01f59bc731c618a35fb761d051838da5c1a69163c61c83c43e5b1ae6763e81ffe2e003f0fd8e1cffd2e6594e1ea9119ddd904eb9ed44a3d0a7469cf5277fe978cf3f6af4d15991dbc1eb78a902a2c3292c766091846e8c3d46feea1e3c7e033d74e8e0f1aec30ee9619f1829c6c3ca223ae5b211542ee3a041f5f762ece82ee78dd67558af0651e37b1d7cfc6c74605dc852280d4627f6893e931a7c59d086ad00580e6c5877d8cf86dcdbb02feb73d8b0af8dfcc97a9b682712eb748e1d2635c744caf14da779e6ff43ffe9d4a0530a0ef674a2b3868574ca94863de5f8e934cf34ecfb1cd626e16efcffd5ff47e3a9ff549e4cfd17f6d16da90a42bf70614c165f9880cc17454851e6fe57f3f1fb3b5541a8920c5a5871fda34a04111440bf70610c99ebf6082c88ae8e8f8f7862e6c69fd6f1a170e591c482e43c3c3a6cddd68dd68d0fb9dbbaf1ad1c1b7200b0d6de7cd84739fc699ef97ca8f3c94e270fa3865d54e4fa76fddb90d3615d1fad3f85b98df3dc3838ef5f089f907ee5b03f38c250def8c29c7be32d7faaf125894e49e28c2fccb9e144f2253feaa37ebafdaa3e8a4429d4179fdc7e2e34c2351a8b71c84b1df65cf6624576fbb68c75b3185ddc0e239490976e942c64dc304e5132624a4f4f4f4f9be124246cb8618bd25efd31754454efb252162f9baca22e2b65d9d242962bd2cb5684141f90639268114cc0e05834cd312ef4182759841243110b237f315704163245fe620e849e1fde0b71d2e0b6c0b8bf614485854672388f4b13a5ed8a2645a0a0891037e49668f2c30d9a4ca97159c9033d70351a781ec74d4abbbbdd36e5660a2eb7fc07a78c1d3d32f3ff7fc3fe5f9220ce6ee7c278db3233cf1b043f43b6108494d0b0f92740603e5d4ac63c132b75e292ef2f147349eb6a40bf3f50bfdb202af2831c08f5fd285bb932ca0ac5e2cbe69967fa459fc59a4e3ebc54d039ae7fd8875efa4268d3a5ef3cfe94babf021043adfea2743af98bbad3a14bfda5b8a5327f514a29a59c8be3706442808a187172a9d3a594525aa9ac6161ce3c43dfe9727143eae4d29c86f5d36f390fe5ba3003ca09c47dbac748632839ceb9568373cecf81a5522faa82208965a05e7e42dd573dd4577323e7bf759603f2a968b906a795f6bff52d9c6f7f0e866a6b83bdd35df1bccf8165c852971f9a56f3e58704c87c8e93614d5b56ba0287cb4a3188a2140318d86e6558aeb3d4a71e506d84250ce578638517fd6563eeee66ee19bb9bebdfedb465ee39ee74b39219b63a9b6401fd409c0bc29beb966a5df4a38bbedcbe21ea90f8d325b5614d71c8f11703578b1d15d40e5644e1640512655851a5c585921539d440b3020450889698bc289a315d218210644862aa8d200422598b8b32350097953cd0c20d1909457ba1cc86c50b60a8bcb0850b24665749dfafddc9f6e8ef5177204338a791e2401d0b5ad2dd60449ba51a7fce3967ff4f6f94a31da55b4f4739e9c6c939e7e4e426a99453ba803ae6df31b7414b626dd95f2c746f61f4b0276d5648c76ca0e0b8e9c80d916888da2350d428847584b89cd2850811f2ecc39b1231723b1edc69b57429a50f492b1edbb98d76bb945c0eecee83dce84643e0524af9453a36119d98fdc6cb1b84c795f65950e33333b781fe5ce9d71be5a2d334c384a405494b181bb5ebee34d6727d29d2884e701ed47b34baeeb5b65aff2078435efa711eeb6a40c736c9453dc186890d020d7a91136850c348a33917ddaea006d58f8042ce299554315693500912631a600242c5508030f8c0f5266020a68a20984060e34888fac49404adf3a823e6764b2266e05c0e15475752115541644f22f681d230ae614713cb449a5bd867fbf8138b2a754a941b7fe2d03c7f8011dcf85306f6f1237ae082b9c474e2c649c58d9686fae24d75dd1719ecbe5523c8ebd9b003f33def3a5942bffa8e090326e0003f5eea0fd2ff50ffee94949ee10e005c086579011143b4600c2d2a98c2c9183d7071664b193a70c142f3821d4f8e58925dc020bd890b64702f382980d00e2d28638316803082e249cb8b215a70620b2dc884e18211b7c5055aca4940a7f4d6944d943a70876bec344424e607f9382889b1c289d1e1769795c414a59ea0c2488b96f829e61f37547fd9aa20dd755705e1542274acb35de70655416a10bffe1ef58e9452a654a268fc7f3a480e1e6adf29628668636c368a6aae9b43254d4183779cd21421f0008cfb108424c00c8d8b420a1b6c1b4afe8420a48496115e709c0403c6086a60cc8020015b38ed80d0f3a365040593aaac9e1d10a899178e6ec8b58cd0c163256a6cb538ee5fc74b29a58c524a295b4a29999999dda50d3b04a83e523fd454833b3b3b671ad630ca71ade7c70e08608fcf69e1842cfe72a50fb7550c4aaee9ecd7a9bed3009d7272d167cfc1a02ec5218f915da073439ceb51d0aebb4761e6ba143f5c1ea118d72da892979e649c0076e80f6e985a1262e906d504666ebf6ca11eaa209a2951650a92140d012f9298fd70e603664410eb967406fd2174778d2622144720449a4c268361082f5d77d8e3767bb9216f690ed3c4076e7f3fd744edf6d7561351dcfe0fb3c3ed07c37071fb77acdcfe1e27aab8fd42a8dcfe210d63a5279e2e2fdd2660c4b01218302e2b813173f959041a17755341e24512cb78210e4931837ecee960891a2a99b3bf78bdfe695ddcd703d74d027f0f08413c11e356630293317c638c9cebc64baf54dd7fa23a9606a9233548fd8875a89cf98bd2b0a2ca99f3748ca22e4d22efc64c38358c8c1e6a2845b565605e7067a4c01c5dd5a579eed952474894ca2025831bb2ccdc1027c6185b382740a008051a368f18699036f54b0bf6012336451f4ae2059887f5343604771efc1ad69bb7f9307e51031b1f76934bc386e1d2ef115c1adf36dc59c1796e6ca4b56cf8362cfb2b456d6a6c08d2b0a1ce657dd14cbfe8479a6d32127dc43216609fb805ebd0a7ad43a8536dd8385cfa2b1b825465c37ed26a6a43ce9bb18975b61a135a082399db50380dd2ff69b97df2721fd7a8e16293f3b49cfb4c60128661f237f9a15fce4a06b767700bba1c67bf41da6a9089181b4afad14c83d446a7cec626795df4364533cde334994c56821855825fcc04bff892f0050a26e10b0c18e41bdab8dbe6ba396aa8b12fa5b2b62a81c7396145bafc2eefe3f57e341869d498d0c29306f9368965c4a8f4cfcb5f564082eb75eacb0a60b8ac4212bfa8a08cdb359ad4300e19f5300fad9ad8e700973fcef8397e1157103589ec6088164e6d757054f9f9bac0dba341fe7a005d355420d5f30b29816f8c32a4612aeb4a7dbc291b67277c414422c6dc38336a90bffb6294297116639c31cff8c5cf1d6d5839876d0a95267260789c53c33fb7d43fe2aff933e54aa56aecfc10321f684e10ee9c4bb154ecb0d631773eab617cc59d9f33bbbb57c07952fbe3bf2bf53de5863de5aa9e0ee1e552d5e4407ecd9fa86e6e934e228a82aed5baa3dc5163eab818c6be7dfb3fb24fdb8089a523868ec08146e7430ba49610d4c09331239f029c96f3fc6c91c344c2871570ddeab29297315ec45ce1a50bd292136a8930463421e5e82266c988198ed2982cb22c53ec0bccd096a60c355cbea8a165bc26f933f2d7629dd8de2cb490ec58c663e671fa7147ca2f43b798628a2b59c088114317ba050352a065042d20b1021c6a90818aa0a30b3d28c8a2b9cb4a5c9846d07a9c249c54a1a149110f35a8c2636860058b32b21966a075b13d512d281659b8d8c0458a0f28818403c81445a1e28726c260a28c46c2044c686819275a5d74cc840b588481c34c89329c5ec8b285062292a2d8528218cc2c50b4a946a5e0707842d229bd84d6c6c5082e555a5dd18cf1a79c5a393b3f682e6ba23a2951831b824a20dd10841b332c61e6054eb8400397253ac8820b148cf1928451162cf3081b67b03411c1161f12c892e50b185441a6c6041216e400035217677ce0018b0c282c2550d12f6670a5858a214a29a59452f24b29a594b239166129a59c62c5491047390011821810bf1757b297a51aaee42f9878310a41142c00810762524a296b7c01e60832375892c238c3c5c8260b96198e3245649951d352c4cae208285653906a600db162e6170254849999617c250f2dccdc6e8e4aedd836682166d24d725b86b618491e93028f2750b9f6c419a78671cd092cd7b9f644d2f5a766e899ebbfcd244b4b44f5fdaaef8ff1696c5090d09121457e9898b86683a84869816c6abccd0bc54276fad573acbf7e9a27127f6597ac3eae6cfc252e196e328ed5fc8ebffc3f88cad350a936b6ae6c10cdd3588e85dfcfb1d54b9a27529fc6dafc929aaf4fc466498db7798e853b0f583dcdcb9acf25adcdc7fafad19811692dd98d0d8a3322da4c66e3a34dfe7a9245a2d6ece65d2f14bbf11ca3f161a4798dcdd7bccd07b90d1b1499bec6065101aaf91a3628d6fce53636282822d56a906a6a3562fd303addfe5cf355df1ffb5dd312517d7c1791ee7fdac534c5943360cc683c15a0199ffa54ea550f947a55aa67a9a761833a657b46d4b2d4ccc6bb6cc60c16130d1b36c8c6ab7e860da20234e35536c8866d272b63b22fc4188d7672dda035cf4c35d635c376aaf11cab3183c6872eabf14154805a9f1a4240ccc68d0dba7995ca06ddd8ae510bea967d21c66c58da64f361d36cac6bbe500ca95ad7b4439c08c5e81315209b57bdca065121bafe2a1a90ea6bd82027f297cd8cf5d126ff195fcdf7e30455f5a113a9ec122a40f555b325d5ba805634afb22e22aba7f9950da28274fd89d0a71ab63081099264b29823f9cb3f68a863f559984ff32bff1f3a548ed56a488e05062b5ebc8c91c996b0606529eb9a76042993327ff9bb5c43ea4ba9d699520f82918c552dac08330343a34d4452b6b22ea0d4af3ef52bebda9e63a124baeeaa776d76086df2973f7572a7ebff62d4a749ce439b6813a549d78da0e2aa3ea447d725ad3ca248d7e527679fa449544cce3696d0ec56141ee7c4bcf861bdf3bb6f0b6a750532848bf3338242e2d8c6316e58ac490c78cf492d33a06df817f5294ccb75a36ccb561e7a768bd5f2eb9cf58324aaf431dca5d30d0a2959b8f014c5165562e030ceec30e4c529872a64b458ea7898d13f48199262036d8627b62d335041bb087b42b0a6050f44435900b14319156cb48b323ff01622326a52443943c6918ecb4a65606822a3ca1435a6aba46f0e313cfeb9e29cb915aef3c7ee6ee79c27f2abd340d791e7f5561be7f6064d66905842c20994362e6761e6329dde61b707f90dfb312074e3cbf9575ef95288c62682f666af7357ba46e064b72fcb6e7c067037f67c6eef8bdf7cf948b64b73285193448b64e3b7dc955605effa7ba194510a6612a3649d792309e9c909c4e79c4aa612ef3e236d5030a7eceb72aa80c8a92a41a8bbd3ba4610baad1aa15dfefcfcb24efc27db6a4daebbbb6503e13dc3a4bbe49c1b2fab3ce7fe747422b9f873ba9c72cad864b8f66ca254124466ce83d0acae9c739b91759a3e4c72a5656732b7cab5b6eda75b33de1c101ac656e27c0ff71f3faacb193c66668e53b04e24418d2a6a7cc9decd44c4f96da73b50832d19d4f82d316a7c3335fa0e1ef5c83ad2a5949267e3a4f3746ff79eb39d9321c71725b252da2a53d929e539ffa7552508dd905ee61c9f71e3f5d8443633b38f0737ac53ea8c1b7297797a2693c96688b90ffc621f24205d610ff8928024855f7c79c6fda2c7968612ee2e5dbafb94d291f8299f3aff5f67f7e7568be3a6fcfede305da8fee1fff5778e79a494538251762af497dfc489ec6e29653fa5d2298d1c0cf1caf76f5939fe66638cf1abf2a59472d2ef183d88fc3a6ac32ad31a575a25f3a9305d7ed944953f656824b6e2cb6b2432b5149e73df6da10afe9c12b74fa5fe949ac49debfe6f6755f0245189ffb42a70977d92748f440afdf9ace3bdea1bfa5893d5d37ca4a15f381fe5de1dc6f93e91045dea1a81feca8a990b76b132e64a8944cad0c7906040a87b1b2a77b142c6e52e41205df939200fc72467a5a8de55403a2b85e6575fcb5f72a6ba0f090684ae149a577d4d68b66715cdb77d9f03fa4bceb9cdcfb5cd39a7cfeea9b771db46376e9bcfaa05743605fadc9d2320d9a60ac9763110df7fc68fc2e37cfb64abc571ef3978de0e78a5949272b5e5eeee5050882af9ae0ad2b7633f735038b282f378511687765c8e6ec31e71fbd5c7314e54b53848523d40f59e65c10ea562aa1f9231279107d07dea8bb15601c998cabed06415f3be631dfd38669907c0d9d8bd962c5a620bf19e9e9d1d10f4d675ce88bb8dc047a06c27c4fd3868e80d061ed730e6daed1bb5d24a18bc1b59ec4c39a5bb0dbbc3c87e7e7e42681e14ffa03e0a1431a226d1fa38f0b2512fccc4e4b15d4eba711dca4ba96856b566060d968d1402dcf80f0071283e6998eb1907478e671dcf37cf1c4c019f5fcf1d3cf378ee9193d4857d7408b0c37edcf1e08367017c1f833b3ee7c3f145e0da1c1d8bc33a3b704ca0c7d76270c7b30a080e0578ecc8d981c2b59565e4f5a5ea11f0e3524a02f0490677e47077c70a1cecc8d991633f3e00ecf737e68d1b371feb060a77d639e7bcb9716327013e56bf5c635af28301ec781082d4e91a1f90ee7c7ae5d2e604f54dbf7b8e49da3d11ffaefb25a877cb4ea45bd2dfd9ca44b8253e871a9ca82f003154cfba80baefefbe3f045daff92ed710d49bc03122525036cefc35e7ff883e86c09dc99cbffc35dfbf4d6e1bc5419b0fb485a8372a23d19c33752792f7a4c2e39c90ce2efde2e51ac6bafc1fdc20a5949cfc204aa08da8842df645412b15d140000000f314002028100a0744e270382c18d38555ee0114800b7aa43e7c521a8a83519002290c32c6184300210000008821646686a86aea94d47dd2fae5a8e099cf943e81ad240ecc4163d2344f0f046306fef3d1608dd823cb868a8290fc286eaa502260f09406f3ab1abd058440d9a7069da3a0584dbc7e686abea4f113a496410fddb61fa3782a58b03e2f7da43fdf3b57dca6068a9707d6837c1f6cdce8155a94643c0ca7cd03290436c7979301e5ce36afa5f52c6419e3d3c46268aa4ef76458b3543eb6b228929aee9ae0b74203bb249bbe34b6ed8f97375899121340e7ccd22bd19f7aa8cb1ebbb2601fedf8edd77862518004f0e2c7f445c610300a4d048ed39f57a688995aa95ab8fc4497bab8f8e41ef54dffb48a5a72fd443775bbf4c91df59bfa943587c4839c08f48f7888fdcd2547259ab61e647c10f07551423eccf206c8dd08ff7bd6970829baa670eb69193bb1e8034d1f5a388e5930691096880448c84a3b3e621ca4dc59d91b638a648bfee6d10e0223afabf301c81153740a65acc6008ecf8f1af1437ad66c85998448146ae69c82401467e8159ab7806c3d245643d14ace1910f55fd59e5e04aae920531b18bb1fb3ecce3476af67d89c0f8696223e544c72f6c8517caa669942e72dc46433821e6109050c00c21188f7ac128868d4237fc777dd8a1305a8ac64d8b0507a86ac03a0744e5a369445090ea0c5ebc14da40459733dec8330ddc17a534d8be74eff814c1d1caaa01ae565f4f0a7f5b1fad680edcbcff7e94d543e5d7c4a86b8ddf9868a813ff4d1722f944dfb3cf93d2369ac96936bc970121bb39f75a30e7f7f7c7496d550b10987c360ddd3561815cef0d6aa077947a0bb885d630d2e8a540c584ed79093d7a49ecf30b79cdc99a4bc09b2717e12caf9197796e6fd1bb2972724203d21a3810ad397ab9fa5a852f366ef0c751697022050a1a86af4a7c5f1769679089ee9b9e52bb4ad0814c798108af197116ccb9cc31b116b02828a49ce4a8fcd5badc5c5778b85c8f5a766d12901b7dd870fc4e5b2d5a97c943ee1f7848ea24b51d9a5cd54eb60419805162fc7efcb699708e4702ecafcdc37d801561028fb2e4d150f12f912a176edf853670a8a9d3ae46066ea493a8e97495af4680dd6cc15b0d50fe005bc691b6ce8797dbc493674b6ace87cb2609d0377656207d09e8af431b39d3f6522cfe241bc4a1494ded3a6bfcdd7f9e96fb221173b12e89d24397547b31c8a354fbf82eb657b4679ba9f5be9151928f5b9f6cc54a1d223f42c8dc968a8ece06fcd6222cf65ccaee3c50c79e427d642d4aa8b27ceac544d692020dbadcea71750ba5f2a1c56e131cf65d3483d15621346c04cdcf842526315c16c97e234a626c20ee58bae1444678d9eef05823b7ede794ff2b881c40c405e0335fb2644ea75e1e05558971d292addd997238fff2c7d93e8c3c3499ef09cbe97e81b85f199779a9ecd84ef48471019747420dfc33fba2a7a7a156eb7551f21645779d5b43b7760c2b0b0a7b69f57f478c020dd20d676fdd587acb8eb042554e75f7a2a301ed15e5037c71242f5d8a751bceabb809671905c096c01bdf4d414ddd46bce4bf7c1b31308c483b027d0bd14a1e0e7aa114ea44248564064e7c13443fe8919bd784934f2f46bb65024bd9731e390468d6c3e15c7b63212db9b77a9a682122ad297abb7f627613a0cd8952aa4edb0c3fe63e5298895502d33a1c2c9d927b66dfa0302640773d9129087938140351b01149f96346b16b8a6be26ab2d04c925512e60a14af220759505fde31cb602de28bb89113a3c305e19b2ebf9389cf678951a168072db716dc9e7e123d5d00cb96e36e92a1d5c4de61fa785dde20879eb4dec50f077edae3a549e1d18807a0ac1a918b4cf4e6fa463002f5dbee7bcd54e5361c5953c3861026d2651c8bf930619a91e75a2e27ae8be85f0309952632684ffed1b9433b3910e44b100d7539ac1c9fbe62cd0e3feef363ea94a856b31b37928de39f82aa73cae8a4e64e0c001e4ee13003bb8714e8ec63ae3ccb50ba2d1b0dbc0c9750a2a1e7d038a3c1be1ed2515ef923afd64c41e38b58491adf14bb011c2c902ce70ed4811b84fd0ccf1d4f59f910ef4dae2e905861026be460722160c069c57df130af97142738d5ac2e4eede3b27076227e075cd9c61011de89acf46bb35f175b7d0a1a1d388abf1f6e9e23d83baf8d9f93b88281213b74878651c261323e94ba04092a43cda5a69228d9ecc15245614b4a1f0bb0520b1fe291a56602e9dc105f9012ca3330607375fc4b87e389de43e82aaff2204b414781e3b18f9f37839afc6be38a9b40bdce9ddbce5c744bfa8f58e436ffc79c5d44eedfc4c4eb3e1794f43b498feef1978f05f641b3c55ef23b027708f44e16805dbe91421b678560d6af7e8105d94b473366ca88438d88308014691fcc0640eb5e2b535201b8002a874a5f35dc19fd8533449248381daaafb79768c3887277cdd5b48b80c815bd99390628a7a32e8fddd757013e20b41f90955a202ceb4377ff0a4ebad4b944ffef54bc9463981164387abec2eaecf13d2600d42a94d7ab996aae6beb320535115524f79cca6e67f15f4a31d9f58ad6b19db02bef1cef22d1dca3f8ed344eb5fcb0e5d116f5bde1efd71f2be2eb0260f2aabd3d336ff6a71f463db8674d66db9166dbed38593064516917ffa88f08aa92b13c57c7dd26326930fdce46ad88de073d16ed0c892e1ee3559c56a7ac857118fcbac0f732be80d6e83e8ae58dd9ed805b6791b5350cb16da2208e81cde836057988979013f05dfd5722ce9864255dd2a5a39dca8699cfd53c78a7f7a5845657b056aa758cba007856e4c10773fc87826b69aca46517c445e73bb29dd990ac280242552da38838564465899516142ddc2fe75ab4e1528222cdc26c89803c993ec47355ccaf549cc5e8194a1f34f47f5b5fb31fa7a1780d393e0eb60b0caed8209583a36bbd16303f00866838fa293706ce0bee804d8668a048f522190a656e875687b54846fd7a9018412dedb4263c4a744bbccc82d76fe64f0d5ddc3faf1c1fc64fd7010e0fc824afbd9f2cc12e1acd21d9a57ea6d213c4437fd1df94459192474d1c838402f7961590ea4e4522a17ddee2e32d4e57f1c3c3bf091dfd2137fcda3045d184513318242df6b86fa15fec3a7178d40affa0df67172aebe6f212745f80392dc2dd561f42463720bc41e762ad4356397fd325e28697ccde7be8c3f3b7bdba4cd1161edea1e54a007ed4803f1a529cc68c5e15bde83af5a0cb937381a80899d258d57d10b0765c51a8d2883b34bdb4b46791fe156eae50d4ec91a35eb288961a97d403174099b540631084301d985fed8272d78b1e62cb15591deafb421a04a79613754fcfc2ad891c04053222ba0a2a7b37bfe43612de9661ecc4146a6cdc8b1ffe3d5f7c74f15662a84ab199171b3394db1cbe43fe50e041576762f7374d4e7d32b517c5fdec3660956dbc02858303e46e93993ea643d640976f233ca883a28ecd693853c8399833b29beac8b0a8dbb941941e160fb965dba9abe889367a89a8db2a737fddcd4f27d7f29fb61c3ca65e2b112d9706129bb6e955cfeae1e09691585b5bb806ffc49541fe68c551c3f7075eed9d9769a1cf55ed1026e3e7366513eb4af38a52699b308063c6b12a625f39bb19fb54abfcb978a35b18341bb03de6e3e5cb2dbdca964e30def322204e93150c56d12c8589c80cce3dee1897305625f6804e1d08a09e2d59ab2870acd30aadc347b6dbd528b1a3ba5aaa7bb10cd6c9b577d8d51bade6e4d6f965b936fe2650a3e936ad46b5da377f39f1fe51e2b5cc467e2bb0b38fab15125611c100e27cb243c85cfc11186b99843fa0e348d6837360eaa1b50501f3f8986559f0b93e1fdbcb3a86fb6a5db4890a3bc012641d40ee6b5f35486583286ac5e935d009923d72fe8172d926c93588bc52c464befbb692864567b8e2f2257aa4424c438366170d8f97ad31be0eeb22f70e744b69e092bf895b1605db392cd467cbcc1726f9be57a84f41adc924a6881d678338da92c2234814799de58a6ac5dfb9d565a46f7b12d502538ef1d3f0a429214f2cb54b1afa7caa2c8fec7b528689d05a5337ca3260b4796082361f9718cf84ff08f39fc707a2ae0611b1ebbf4f95353f33c83318533178997cb13993d847e0ad03d2923b0a3c50cecd675d670f3d48524a5afa283bed121fd7e4215c224223923a57db48ca24f71331f4207301460ec8f6ded41648995c963f0777e4f3f8885a8e3c879cc2425c4f9b39608e690689c9e49b73d138fa3cc94a3f39f0f87d804b3559f54bb7538548f7793b7914bb71f1515f3aaf226ef1389abae77c51c8b5039d08034476b1d81eca3dbc4dbd428eec89526cf5c7c807618f0434b4ef33b6d61e71b5a50be58bbcd5a4290ab7482e853f71f46bb88cfa2aa8537e7ac573b1198b414f3fa5b6cc06386aaaf33f1759e441138bb751f2d449e66039fa20ee413dd88311917edd8f1881b9f81135494013fa1809626f4839ac4dd139ad1aef2be6b58c6e99dada7f28806880363f07126c69f806226fcc46e2d1e1c28afab304b238c7ae91264baabec92f1349da7628f7971de73f42403a24558744f24928a13887b434181f61132a108bae013eb94ec0293bca7e51740f3c74708d06daa8253b6de9dba1a73680a37800c1ac216ffc7a7658c4a51477940df17afdc02d44e9bdb7f0eab722c52e399955ad437a55cabcdb9c23379031ca5d7d76099c235d0f8904ba33ed833263861bd156c006614351f4b7efd23780ed91c6bfc2350d3b3ac712cb96867088dd4873ca14f94bcc258477f4bf91438e9c5dfcf50fe9d682471193fcf5375653b103864bc66a9d63d4ae32b1a9a2973e0b2821bcd90f1949e1c6c8c9aea734d5fe97e8ff3edafaf079d1308d4315e726c4f180093fb52d03c77dbaf29456e4e88efe601b03f9784dd8fdebf61fb03e2fa22843f3afbb89c534f01118286b8d0dfaf1406bfdc799a80151fce7c2f326c8b992555e0bb1e3acf73334e4f3cc979b92c3c5ba4b320ccb7830120dce811de956df279d96742781e1914ee7834a679eae77fa8760b96032907fd0df52f58aa9ca60bf21f35032c7282c84fadedc5cee3c60eb2146adf115f83fc5311360d43909ea39805c2faa1be68f7968b0149e194ff85930e61770a836686520bd74490e0a188b94801c395852a9a2059864e83b8fe7c24efaa9d89c16b01eb561cc9172347d20eebe5196ee208af783fd562801190e2088b680124e301ff0f044a847c5363957e2cc3225e90a1fe60edd9ff64411cffca52777fa241f5881d66101014d7fec3c962e032b7b51392624f8519785c2ea05259525c82867b997eb79735f7d81591b2666f81d057cee468b917ad18a6211f2f95b8a83546d4f2ff6428eb00f55988cf38d5156eb17c262f41f251cffec49497f5c0cd5e00e761d4af0b0fa210ad45019aabdddd6f7a705690ac473ee3983808c25d8a04f06d201b1727f7df89d9e19e1bf8d5793ac1f4876dddcc9d7c1f24d8d0d7f31aaad98dc375cf92ceec1b0f068d67f0f7f4bd98cd869fa1e0462bfaf63d95e87ee8d8e4c4e457e14407ff2855bcfec525a0d471fc8a1ed70a7ea08b31495dabf639ce301ce00317d4d90b28de7a11d29b26cdf344a7f168587c26645adc87d880a744db7e6a607cc1113911ed3e149364537c8207cd7730a1e16f609376d351e22527d725d5d0dd3c0996d7ad3ca6e65e2cca56aa6303d5ad6a80ba2a87c09d90f59e2230e16a6a5824f3f6f6c667728141004408c1696a6151f281cd57fe0de23d3edefb8abc0a5a3db4ef063afaafb2e8c8d79237713aad7a384779df890744ba74a31d6ee29dc16f7d1a5009eaa26ce472f1d9b61e5a28543dea3b8b6559570175cea124750b2c4db8a58810c904f5694ced386672e7fbe6b88e3bbf9119626f23a4374d855549e3e2ffab2034b7c3c7aa99ecb4a0714441d344533427ba2257a147d58f4ba52f6e18173d0eaf747975b00efeac29201dc2294b1b3a6fdd89f6e1f0a6021b2908f952dfd9f1268a404c6a3b868653e513aaa2398a0742691a6de68baafd1e4020f21da61fe1c517c5007d122af5a4caa4f080bf757a043874cad96f265a868147f09ea99aa154cefa0570aa44f58f5049d026aeeed2f1c8965d8be8546b2a60f94f0e384a7499cfb3264207a280c00b7685a73cc2fa27318217b556c873562754ee373157358f58706d2efd5b4d559eb0fd9a9e51f7cf334832c5297a2f8720f14f5c049f9d2fb839bc201678a4238e1ab89bafbf3316a12439d1a53ace70d108cfbe58aa375f75934bef183520c20ba41962647c029d84038de992a456534081aa0aff3f4b1b3aee59ae2c66c8344d35d3f0515239828b375444b9913630c87b958134bb01d9ec46691413876458daba8f2a9d16374583f4a7aa35dd175c3819d0b6ee80081244a0e1bbbe4ff59f8e044490511e6788740b34266fa644bbe13cc88a2d3ee906af4785aa408f2cac2d3a53d3a82e3d8888704187b0a02cc8e4a65be66e870c77aa1c2f3e558a417c78bbd72692d757a12a444eb4de02996813212baada11f70f23d9249893146b92b551079a529a1d6441b4f4a9da036006b9cacef9aaddfc835c4b976130c831f4d077e540b0799b56fe9784d89ecc458a3fad1070d5e14d68ba68bc2a3f806ff97ef8955d3f8e62cce36cec9bd9279755aa4fd0c8e322cb0e0d1ddb3a27180f6109ca4388ae93e8ad0f80f8ba48b5ed3e2cd4220bc15289b7d99bd709d3a56d1080ca87518001a0bb2160e90f97d528989462251fb3b1aef4cc5470258b3154256054d8265f540f20dcd7e73248eed4d7499b19357c1e1c42c86170488cdc0e3c185e0b235d489e0ade7ed1317c75f084d75a2906a77eab811851d7db4231603a0f1e5e772a03c81b3ccb8e164d63061034ef7d180b4f3f3509c61c17f54a4b264d8e57fd247922c9c36ce467d857636d31636552497eec03cdc5475ae726fa7f50de060452f78056e7143442027e7fc8d16cf90a6b07779ba69b09dd37c5378b232d64ebe5aeb3592b4a7734b1b5c8b8b96f55d1d1bb98337ed3283a45dc4c5a42607ab3597282cc6d592ed8a4910577451d5d735bf1050d050f01391c561de96f0649af623e7ad7422ec35a66d86fbff8d93100446db440511a67d2d2ac83a77625f9389619a5b5fd58972f026596f8e361f12ed6aac713ef03a25ea9cafbf884831b1bcc05ece55bd119474a447dcdf49d4439acd4de383713d19f97027b2037bc525cf57a01009a19f124737e4c40f608bf88bf05c8ae3aa16f02641e803df6f3ddf42b91327f5d1608248a71ac68a845efe44146cb8103954f56afa1233b532c91cf4fa6393080cc48a927a6991296b254f4e0c72386a6216edb70fe0d685cb2b1df0e59301231724a957e04423e902c604994c76f8ea9bf67a1b45088d08c41d2e5b061ef96a186c73b2509c139ae65ae42352b460b7682e22575d61c1abe2b47192c3922822ac61e5190137c72634f5202b0798c46e8a7e2388149896d8bd0d6e5bc92af0fd431118659e764d01f7b2d9caa56f3409163c8c638db03baaabccf916f8e64fb51ec68f3b33121e92f2eb92125ef602589906d4a6d7aa6d983842b150aa628c56ab31de0e45f07291215f529f93656d931dac0b264f4e176eba6cec7a9de7c62cdc5f607f699b08b5318ea97511e6ab08f3d186bbff7c93f49ea8702bef8d5c70bb4514700929eb0a2fd04af851ec253943a7148d70b7a95f3af845c9cb9b47f66edfe5d8c3fb11078c990e5f6da020d06e6368871b967614a65f17ffc9ecd539530be73190493f7855e1e4c5237b06ef7f864e5a11e9ec17c466365f55e2f90181b7f8f90f4fcede66d92a7777ed2881220e7b18e4f7c90c0380936e75a639e8b4148738178d2ab03c9dc45cd0a7cb0a0f00def92c0747bba81dd8eaef40f99c368aed49388e6b0de2eddb32b0d719902c2858c9a4d495799faa21cf6a98fd206826e5529dc20bf2735175ba76ca2872f3862eb4076d461fa75b35da3db82c119eed9c22225b1e708fea5015514b42fdc33394ff7323fabc11a0610669391a6e551a06cbba3b630d5009115ccf11555c34a243dca918095c31a2a1d7604a0828ac4625c401f0a9257eb1b9c182887929b55101d410e713578e5f04360bc94f2d74a9cc9b006881b8aaf27f32af9f37b6994381b8dcc65022e704ea32ddc3b5e935bb89c71759bda014c4fe18d83455ae24f2652ea4369db98fa04eeba90a977014c378743fc841388d9363e3e939adb5da8bd5acceea7dfceee511ebd99d83370f2112fa62195210fe6db117a7dc74b0251fde37d076dc9065847c14f750f17802e09e01d56ae3d0d25295526ed2fd635a57b9acf796b87c7ec381ac80382e48ecb83be2945393159410d25715c1194fd261672a472de8ec42321051dfbd0b1e6a8a351b973deef6e657f161a3d65abd4934cc712d21936e6f9ce4c15519377c1458e54cacc0e8aec57a45ead51971ddce39f4c02114d04dafcca41fe564007a94bfb50389185a44312a311d3c1597b2a86e1ffd1075e0e02350dc2cde6ebeb3a33b0b9695e8fa09681f3f6fcbd4a32adf33e066af02c9ecbbadfaf2690a4c55eb26e69632d5031feb26508bd2a8c3add6220e98c42d7d0ef65dcfe53949ad2f4df0f6d02afeda89b4609f5601091b034bbfe2c4ee8ce91ef1b1c791a1da62cdcf37ddfc59c136a052410f8a7fce1893edc13906e5552e997b8676e7ab8dc892700a524d4bebc02a567df803a4a649d425fc3d4fbcdfe078844a40799e14b003d898c3007acc12b50eaf077afe849ba4a56cd63d52e6903c0c39f253ee3bdf9be50426d86e29f7102d7d19a16ac8dab417bc38638b33665a13e9228aac333a456b04a5cfdd6cd7be5c55976b998bc5e428d545eb8ed6fb1844032673b14fc8f73cee5663c4ea1179c6d4803c71ea4536536c9f6ff6e5391022cee2a7a8a26e5f387fa3fe827d1d3746d7780983b45261e892544eca3375e74d21de1c97bde9516bc8fe469aff653ed71ececdc592a8e93d99b72489cc4c70c377d1b48ae8a17547497750a2664e8e557e18036e044640c981a5db251f08c8f5466a6bb5da0784f25a038e3bff2c709fc5e8558f5e390a0b21317762294f1be92ebadc641835121cec3270627dc093823ba4bff7093f6c80fd2d6e9158af6ae431293c7263dff462ae912eb96b1e8357946e3d61e2d9e6c1754b1a668e1bdbcb0a6543bfe0ff96a1e83b31b364b060007b5761cb94d1edbec1f640529e477564203f04829c10f10e3c011222dc36a71438567c2a80db08689c8352ad3352676438106d98799c8a731285c3cc4d93ffe963691b047aa692cad3fd3e15065f712f6527440939f42865cb71c2e23b46e7ff40b87e94c6a470326cb9723e62b78ec0d70cb67113bd2bddf80649378e005075a6ea3f95b578b08f6ae082d83672ecedd08ea848502ab31ae062e9b838ced42b3ec1e6111d964919dbe421b88586bcbe7e81885d8e9bab67d905b043f3ec6fa3fd762370a19df7a719aa72b444d31762931820a41df4b7d9f13c8ab8f30d1dd143b7737184a38f963a8b8caa2857756501a3a754944d76014e552a7e81dae2d6e0da48cbe28d8dff782bd35f7d128d2b88d412a4616273cdb487d778cc2af0c4cf1f042621a3ee96dce25a6574392b3205eedb79f3ed67c383d04d4aea079a9c1cbbd8e5133617279a909b327b84cd35785ac014c4e7ec09c3f6192387516828cc641f6a9090b9299335350241553b69e048b903af4e237c54ccccb17cb5234146462910047d48115e9d09cb480fb4088198a5b09aff4c83491fef6f4b19146590f2c2e7c46dee44ac269eda1cf67698dde7d87a240326dc173cccac1fcd14ecd1d20ec261100746e5431016fedc295b01170332f33ff75bf6b2f8bfc97339b39c6a7905de393f68aed4163927e1335ce3704639cf28162c29c03f923e3e76e8f059e2b1360e694be7c8a42178f7a9728f8ea345b1010f60d23b3805200678041660a6167aaba9980b37f811bd9e557293072d52a05eac5cddeeb33a73e556573c13d0aa1141855e3c0dcc3323c58ed3a297b5e825be0c7bd7960302313bb49a77a343b5c7a9b8ef006cf6e970c7f9e2d6f018f341df2df5f83ca7bb675e29fb5408964de566aba67884a80036f3c5849cfb66b82b3ae4cf6caba3ab80d530d4658badfc321061a550800fe46614a52b624c391466387274fdf2b93606575ec274092830a05a2c7670d4274b4a2666629a1fc7d7214dd2d4656250ce51201777f74a79571aaf0766bd98b29e1431f89429c0aaaa6194a78fd7812a4b3a4a12efc5a881d9f8284693636098cfcfee3213fec48332e03e6268c3737557a1c88ac1a921db06751b4bc13cc8d66ce16d164a4fbddf999b9676dcc6cfdabb513a5a1c91845af90436684e145f42fa66a557a01accae11b51abedb6554fe8c42601010de0aac36e1eff757fe3c982186fc6681abaf1a9e4bbe9a1a2b71bf98d6e4338a08280cd1914bfa65bb834c9c727dcd89f1d94800296766c4b22d2f9ab2a92759a4e76ab21ef895039aa29634cf70719f6db2e299684dad46b474b251773e0f2166d8902af7814582dcca9b396b6cee825e826c852c9051a2171727af956e55fad047707f262c2247967b33fe580d5b3a83fa376c56158c33a09382b7d7c5cb226b5b25a61b6c9989313094bb35956809afde13e4bc3d1cbf70eab1ed241b6199db50e3317708b912e32a6ed0c12509eb5d144f7fbb8cbdb5f74e13ebb94c49f971083cbb86c3013fd7c5e3d2cd33eb854cd1d9d5b10a7b764205f6f23b918ae24a6994efba53745b0e98bb2ed0067f260da39986b5bc2bc258a857b1c8b08e0e3c7805ab3bbad90c6e66c3ab4ae73707dbdb169434d8c977c2a7db55fabfa9b3c9f52df6a24cd907d63475bb5d5b68c1e90dee67ee22b40ef31262448cc3cd86d44f9b9107aa23de84ed8b44a641721f4c02338b557c98e382c162ff496b0da5381aedbdae30b7eed73f37f8148f6101dd0db1c2ec94b655eaf32938494b8c20795b87605b40f77771062faa07e27e1aacab378ea484c2bf7724625ae1417c6a1cd9f58059f019f544de79fa7fb34b14e56164522cbb8d6914b12c150eb3b56b2e3e878ba531bd43bcd4c712def31500cc4baaba323b42a25407b516279049c4206521d6973643aaa2bea9c1b42c26aa53d04a95ea5ddd46419da1ea9ce145800b4e34435c538b325f38e1373cf74d55f62ebcafce950db8cc77b4d7c2557e5e1ecc75c100813133dca67859c9aa3baf147dbe6e3473e02ffeaf5762f07ff009158f8ff39ed930faa48d5ef02d15f32291716ec0b7ebc55913a7648411a8cebfe32f33944306558a75284d72c5e2e91b089f6cc6f06d17c07696a3c058b666bf82cc8ad4718895021af5ad0400b7e04503f23556d6ad01768462796a743b246992bc82ee1cbaa0213610c95f1717d176547fa1e9917dce15385138f5ed50c1cd2aeac699e6503015eea3e43dd102e4ab9f825061ad8863024e81b352fcd59b2bba345fce50eda201a48936c245ec7d4b8b7e3b9508a33747146ecb780a9b777205830d48c4de859240f869e427d1613c23b5d08b7d0a5f26f61707c25f91d2537d247de848933b5fdba4a1b15561ef9fdca43aea7aa1190324c42462c4a4e40186c753db74b3e77d9a333cab29760102d9cfda420167eb8d8ee31baa23d607fb9f63cc018199a3332bedeafb5e9101ae75cc3a3c51bf53ef44ab83e050141c2e34ed72ebbf8d945aacea7e35372297b0b27a736ee2d6b7c5aff2e0f7cca34597d6ab5adf21d973bdabee624bc6d6b8c491dc1afddda9e04efa87e670dc27f946e15394100d4b3da557a0771c985e18e95d87c88bb5707e79adad539a46857e3f315850269e1c04787f2abe7fa4f2d3b6e06d3d242154181717c370c73e1c691722735d87cf39059ab33e54d601d95bcf09090fbee7b82c34dc3208a0fc90b3df0af9f83334e6802023fe47c4e102bb526ec74b5390f158e47e8ac34928998e84be853177ba4a2d981e54a6c89546fa9dc219d953ebbcf44a4f3c11278e83bf8a6a14c712a29e433de4ce0895aab8a18d3c9b269b3378379f8df6fe156cad15c92b490dd28d72623a88ce69a1a321847df4c9b41f86650a9ad241654cdf367336f198b1a13782e3add4d25ef13ae9c40c8cdd20815483367815aabfdc2953177f66ba5929c9923e95d98845736459afe9927d18fe1c09474a67e18e19c06ffdd299c44672d497855d42c649cc46f1b18bcae75116cc19be0dcb93515d7b1351a341fa862938e571eb34fe2d487a9fb38a8bd8d76095427624f9db1411e68d8044dc2b062072d44c903336fb608abe2e2f5a09a4b46f10d28815c7a85fcebde45a338f56993ee29289b2e7de1603c2877bf5c4c18fd37c64856f2a96c85053c68170f8c1dc9acfdaf89bc03c6531e5a42111a34999b2cf37ba9337596f17f0d809da36c6c4a8b76636966b19b855d5bba5d2404879a12c60b8eb79c65cdd530f29593d281288b1c5f7240f6b6635079ce662b62ce78d2379160574ea8e0a1c97bb4634bc4d0f207702777f5be6a7e0d065444e017422b08377f9a9f2cc5b1f5afc558b8cc5cf8c3b6f8b6d9fcc7babbb30f1b14072f2673d4a03334863ce61fb0415cfc0ecef85a6c4471d50946e8feacd4f7b4fc183182f9550f6c2db2b7228ee58658bb75de9ff9e8683a216639787b3d0837c6b2009e2ecd979037786b4534a13158f703df37dae8c55548813aedc793fbc6697d5650715ab995ce4072f1d232a4cb666d31936040f8c75ea43c432fd6584172ab8d18bcf65ebd544d555a2d43293b4a51490a5bd1a864dc984c352d1ed1535af31531a17b32c5150f1fef2a39140200e3accf74494762cb7554f2db117cf01b3af0b447c272718d9e250a831363e047be1b0e40093a047e19c1b4b19ff578d18bd2b7220ba80015b611f374dd878fe9e9782108f9308307b6120cdd5d32844ac9e9745335d521ab810308f3d0a724fdac104e82eee0b95a26ce14da64e105060a0eb9a2e3aaf94017e5c654783d932d67dc4920b41e046344077b60ea37822c524297fded04ed38e55477d3ce142e0e5a354f66fad9decd6b2051ae862d79671bf0c6012028cb53360b7fa9c8d0436667c077cb36ffa2113ada8657c7ada76cb93fa5a4e43c1108e622243c982ef80bb2d01c129318f639ddd95f6a172de4854bee38bb960379436d4bc2d8cd19f71d5c0afd6a2e32ebe5a4a7abf540b9d9841de064e233535314c52334d878e6b62d671cbd203e76c4de154b04f07746b9401a873434cafe8783afe036aea253e2b2566c2ba42ac4c192ec7e4c7b0ce3d42add17f6d4ec3688f5c8d4034054d4ab65bf23ee806c2fa5c3fcf3572409a54eac8d3e402c0f9c8c701257733c784142e4f0b4a8cca80a0656f813cd7bb839d6c2de483829140cb82cbd564f2e37448a00d5212a62b66b07ede928982f1c8979c8419ebafeb675e2f578289f2c6d37bf105336a66302a90f4777ecfa6b202d7b14129f7205216c7e42509eda5a87f3d4add07a259f9b35b85f88d5adb9f0d3dc8be4c586a6daf1026a327bdcea07430a495d7e743557f98fd686e47dcd6d63e32c94ca738db704f0116fdfebe4fc521ffa28589815c769766ea01a40f8c31fcba380b20a2a99b0647ec874f40fb5102225707cb44831ac97527ea29a67d76c9fe690c2b5b0d5fbb56918d8b7a271b3dceb78808906997a91f8b8744248bb743b6dcd8af150fede201cd9378b685f75679c9adc1afa96729dc80e61ce197bb3a1e172f17cf526da73c65edaef6c2f6cbc0e7914a1dd1acbf0772de8f286e0551bd23054ee1a288413042348ea378d055007d886e40798914704b29ddf5a61f29882c41436b20ce3527c1bef98c2f5296d83e8c4cd93ab2f42f10af66f27cfec2f0c11ab75146e5cc524487f2dfd0cf0ea04a9b570d34e4ade2608c142b73a1bd2e81e584003173ff0895f6aa99443e5fd1bb2570a3fb5b34162bd752dd3214263c99aeb5ad02bb94ac6cbf3f5dd1346cbc3b75af8ffd7e223ade405c0ca962b2d6d09fe7535a0b64e07b59e669143fbab9a7d01c22dbda90620ea51a346d0d83035e84ddf2ad3d3a258db952a56e59204e21005272e3d58ae9414695804a885e1c87018b72aef5cb0db4da19d1c8c8ee262879008a87b4b43080f46bbd5b554c92b6696583140ad2268812e07147630ab0003cc5badb2c4434b537c85a8473cd457b62fc47ab4a64dd1be42e81107e5af22fb02aa740542d3207ecc470091d31b143da7cabeeddd214a7bca8a0861682cd52f56f54c198c81f15f9b4dcfaadbcc115024ccd6dfe2b6b95f7982ed4cc2550337a2bef741b20ef8ab0669ae2e488b1a0fb15a184c16a182cf510f869e9c238f6e76e4224fa5cfdc32831ff698159c0afb22c761315fd8015f05b4adec2fc643df7f79e0ade06f287ab71baae5d09598294b0be9a46f8697a9aa5653922f29691388c34cc43ed044040c83dfecdadb16bb3724808858e9dd0b26543bde0249cea128ce399c9488a00419c2843e1aa028a2c6af65d8cbbc070d8a403b9292753ee71824a6d4ce485db7b2214ee2119a87985eb938987f68a53ea00be0af0cb1bd8b3e4a1616e8eae63f9d3457668fe7a9a595bff4ad2011db8df45bed866bdeb972566f0b8a8a7afc2ccdf3325645266b55117fd0f837422511a56a945b417f55c059f55a1aa28c62211721a87a40e30c7ad953e348a136685930f4c503039b6419445656c5917a96f24e71ecb80f96304ee1601627b9892ce9bd647bfe7cc1132eb7cb28b800d6fefa8e95d5062d0c45c3379025bb715a5674563e345fe71de98822e326a013d5d41050709c00c1e8cbe2386401d878dd30513e1fbb414fd27a529779331a63c0aaa4cb80ddd8584132143c081b57d670c53366aa6ef368ffbb8174372d85c661b09ed613819922d87f7758ea9ea5dc41a6fc9f94415a29a0b4da1d4cae611cc0b7b87a5e8506cf9aa533d221f08010bb9555e85ac52878879ddc1204d9fe4d40e19bc0e2d0bad67b5c20b2001bfe7173e99950ee447ac7bffb89580fba506d8863b0a25e293aa522494bb6bf81cbf419c19625a3cf3c85a3c32ae42086a10f915c01d27d19da532bdb53d52f8406fdefcee89a630fb64b2a415526401ecda590e33c4a82304cfa976958d6a2c93f26e067dbe025bffaecde441dae429a6d3e1da1a94686aa5e35c1ea060b37857e9c2a87369671f66d8d31606000571d57538da62812a3f8cfe6b2cb68369739ddce703a9540ed79bd982b9b604670ca92fafc7e0a8df5ad51ce4d38266c22b2a14fe3cc9b6f654313f6265698e350e6d6a4769e099d7b3e0e7e54d66bbe2f7907cb9e5e14ac6421e12404c1bac0a4b8712dfc9497059dd674e039a23bed1a8502665feb37270bb44a408ae87525bab4a96c9709a5efa1d97815e087d5b42ba080eac6e82b28ecbe2cfdcb361497caeba242cfab40507c46bf445c13061a16fc74753f332e216c235ea7ac4ca014ebf830d524a53f5ce0e69e18e3396f60b2742e9b83514b249c8d7e624168c70b8d9f3bce9e8a72ad032f6876461e3db05cd3b74689a418b49889acb536cb68159e1ea77f3eb334c886f27803a13d5bae3bc024e0c942dce2b5de5ab0e4e58367fd12d8f508c66805528fb44aee6e6fa16ef2a2cd291eecb8ef4f629431f5f02c64ce3ae191cb2b84e7f8098265d55d237b5bbb0aaa0794681ee5cd98e40ad7dd4eab02a51d64a55a1e5355a8a40841cf16674fdf54bf06d42e9744e5744d50842735f53883a7b4ed8b3303d16587e413ee721a3c92e46c223dff1ea64d107ca45cd574c32b773b9ca3619e4a76faf64c6f1a30bb74effff693c453df991be7c2c56975c6a4c8d5a1cad54aec24b2bc1949b3292c2d42ec738c3860854caf306b1e5dc36566836a1bef87d0e58e274e0386b008469dc5e9093ac6d5152c2af5f756e36bd990a083f395adf13737fd00b8107c6cf1ad6f06a9bbd029cdca351770b4db51d30119c56809f4cca6326587107d365e064e7331eff77d9adde1fb6a76ac3c7c68395179e47ae53b7e65f93cb7096b5ff22eb8f32a60000ce7d8f48ef81004ba97380f219c73d9ab22ba6aacfa81aae6bb0f79742d45209bd6e42971e0384471f97408eb2159dbe8c6acd695a404e64175f815fc2cc2890c878266f1e954138318bd86858552625eed8d24c4484552c97501d6ba431dad8e9124498d126fb3a81190b4d839eb82bb3761658f0a3dc00f7f0457ddc069432e8b53d9c2ee86380697c698cbb4a0c916d1812913abada106bd74090bdce99f13b7b89114fd84e0a66c8d92d55684e1b97be40ce1345363281404e921e6796b56358caddb4e0d209de24bc627f5a11e3589c75f9c2f4d06619975c8cacdf2308353959920ef056e8102a36ddbba8779e711582b80ce306e7bf233d4da16cee5fe03651d9da519c2cb47c03e9c9fb30138e7c4d123d40529f4e834995f1bde21bdb68edf99039ba8eaa52618b054d678a6a75356964d7b9f82cc56463d4b80a97868a782fb33acafbe0823ca17f5456ca3f064005ad582d655eb97515c65c19ec5276557fa191eec20ec4d838b2e2487688167f9ae6ccd08e5827e4235f500d6212caa2ff4652d1a2bd2febd63c751b2a324a5206e96b86c7a20eca9a6595fa8ff9a9a114fd6b72b2e8c2e9ec6e51c6e397d5a4e201b64393771b30210b30ffca4c73b2ead1d1b8abb6d4351838ac3409909ad2b9a78c80e821e84429fe9b46c8cdbc8674a461957960f8a48dfe484495f783834ec951abc297fe1f50c13ae5ac53719a7c20e50d0073400747ff431a945909973aa6d974306aceca894b1e61c901ed5dae1c5081b49069d4a437e4d76ed334bc3a2ad1e90919d6e5e80f57e80d5edae85ba40fb81d758d47d4e5dcb9b17c3610083cecfcaa968bcd2fb8de2d802cf7432ed7d4949b970c22fe272a044841297422a8abfd13e3741e962dd773a044a32840a86a40788c9059feea250f6292eec0ce6b8988206a87f8d35c8d41cdf81326c2ddfe91a00ac400ff74a73b9614d2cce586a8384bd65bb797c937beca9b83a4ee50f44131fbfb8d30d6aff047fc3677a86979fe136cc52e214a450468835dc4e5b04a39cff84620951cfca1787ad8b7d12eadf0808e2cf0de82344bf478bd8695b6c44f98d402f4429d510e5cc6725dd6692b87ba1885e56abbf21aaeb2d823dcae71d9448375f9f51aec05c2929a2e6681e972d21758b4dc8b194eed9f026b5f7acf678424e69a7f7231697b149d22d1f46e1516fd32d6a3fad6a5b23ff268b13812ebcd36f6b5b174fa514ef97b651a7547d0aa8dee314b9896713f9081412d139dc115c8237bec79e9b9f622b31691e50534a7b062d6cff7d824300b5b1a07b7133ca77fab5f22b9bed4fb2f22edcc6984e283bfd03fe448566158649dcaba7372902d4b53bcbcb01435b646fa1a638825edbc0f1c978900f9ddfdb66b1e840b5e6bb6b6731ec798682ec1ce6895a6244c2eaa67da5fed23bae20762d961d3a88e42683a80b0461d9fbb2ac82c8388e7690b304503110e44e60b7cea02e1430e16ec574ad4e3d3be2f3e00ec840ca1ceb9a5bc08875dc91bf9d2b75c7fde9fbf58bbf2afe949f340d85b64b69dbfee362f8a76c4e5ce8da70215f7d4ef13f12fa6bf13826e228d5484f581414804711d64542810e159961e4f8fd0972d467cb031098b5f71e7ba1cf16068db1c0ccd51aa83872a89f4f9b40f8f86ff22cc14d5fc43022cc27c4747431c400fc57fa0bcbc2587774c9bc24805a5199a7040cc3a8654ce1c78258d0067bf76ea5810a37a9295156c623a945f338ef4ebdf750f746aae4bb10e5e643c1c62960fad960a121765cc2d01512ce4e84020cd09acd47f408b6ee2397d1f8e0694423f409959577fe267633b1f096a586848fffc0ca243f14560a0891912fe037f4af1a3c4d2750575beeac819e2942870579ec1965e239204d8310a1ec27c5a3ca125b3e92710d5360d91e5ca54e88bc65423961b82b01f9d86cb5aab765f3b7d76f2811c52338bfc21156a3b3b8bdcaa067f451c235a86cf511afa1e615740e1e717e0d20f95db3fa03fa86aa68ac4236d465590c1508969b4f775308239a5cccbcf978ebd1305c5ce5f86086f90cbc730645c2d8dabb056c7af0b4b4418a22e82f9f68ef359aeec8525105b1b8e51e53c6867e2595f82bdaa88b0dc2653400b46730a66656f6127d3a99904993f4c39eea5a043c266df81d594007650d745c8d43a18d5decdb7be312432b47c72c878d5275df5cd9942802c5ca045bc061183eb18b68418ee047633fbc7313d2dd52c40ca47b959090b337270dd24bf8a41cf3b49d666d1ea45cb5ba58ad2accbe165e455b533b7cfc87675c12c7cd1abfb753aa4c5790c5e9580ad912c122de74b34705cbd8c0d075e4d382c904b8ce912ef3760be6b84d4573a726b3f1e75c543de16b2bcee524807ec53750775fb4434d719cba7f297874781ed56bb8c4d163ae60b4fa837585c33a56938cfaa3db93f8eca055de4a595e1c5a18b0682c3ac615c0097196e40fbbbd31fa09cb0d31214565e305caeb5da74c685ba8891d7b5a84e4f0fc0fe61223c829b1520492ed2db4d2fda4639e780d743076660e7382879f238b289fdc89e46fc2f88517d2823d311358513ee0d33d9b5a36719b558d17680f214563f48b66b674b5f1e64d33eefb66aa96463c5f05c57a39902433d01017993f9bac37545ebda87b82d641f4948b7b3763db0908f93627ee5598e79d4ad3c8d88742e92266e35e031f0fb6a9e3065b9a9b81b62fbdef0440b76c846d012f836bdfa1d347c7f8145872c64a8bc3ef1474d2102f2d96523241a5a2080a59dee1380fbe81e6a856de326c4dd75720a816469c28f2e168a54b86b3d0485895ea10af0506b4e24868a406d62874d059300ea69baccf056170836088d62491078f95da4dc0fc26c14e8f0b8200720ae6721d66c7b21f3f33a42753d4e26311a31496da152bfb1372b504a82c9e3352b1e4f73d863acda4c5704e542675e98c6851349bfd8dc2650869c22595563e0cac07f142d0b2eed4129ebd8b9df0e84dd6498c59f48cba170747e0900095db18373539225b1576c10fa099ec639c61545d2398ac37ad641f2b4d856b8b76492c3141fb6cb5851dabf13f90580c79af3af21da19f238c38523a9fb232e6dcb03e5978e7041528542a1e7c4008d45f69df3605e273f1a1de74e3a906e6ad9916a95e388641fbac8206d4a892acced5aa62501c604853414f809ca1ec0b2cdd251c0c042d632460f539dad1e716986562e5bbfe3b02ab38ce2cd40abd52e8f84b1a0de4dbba28dd771263358a996450ad26e5f1b2da33acda258947046c9102a4036b59161e043eaf6ec14648a109fbc82100cc184ce8727d6efc13a7a26a8451f0972a1e7fb08cf083f14247ebe7ec2cd620a55ce7e4aca5d02da8972afbdbea270032c58a85b9541ea35ecd96920b4de547c85b79954872421b50659ef4827a9b8894ac8dd647aa485f2869f9ca1d8b5ce71f4888a360ce62833533c17e5bce9b2ba65afa092484f37b17c1f9733b9b280b8c806e7befdd56f8a0fa324f2320dec8f1fd80ee70e4a98ae126eacefed4a6692f47785ab143e9c191bd964bbf95cac6b791507b5a92e9a8609e8c39c3b0a76038e1be0f3776106ad527545e2e69cca0053ea5e4383f9220d02a4d9a19deafd8196b95506324027b6bca48c07930a09115b89ea1736b814018752fc11a34e7b29ca78b86e96f42fd258f1c6309fd9baadaba9fe82c0589b3eba957f42ddf89218cbcf5f046460aa5f4ca6fd28505e066fb0bf2ddd360459455ce10c824ee2104e02670e19912b0eea9959463c04db2855c606fb3c72f7539e4437ae870e0d4b49dc81b078efe34470e7f6f5f01509980ec309ff2208638e77235635248884b6136069ecfe221df77752aa94803d24ca2ec30c12537c5134267bbedf4461053322a27df149eff71fca96fbe140460f14fa73931995d8e37bf46c64e9b6e3a4c9858e3ea145f877a9619fb4c9ba344da54489b02ae89c3bdc468d5b5ec2d1454b5d03a45ffa2fc5f5f5b5bb432d1f3d86ca137c73e964bf6bee316d3e81a939b76c4ee1bdc72593daa9a69f7dccac7a5fe4677b03a1399747b5f2ecd4b278909046107691b95040fc6aca15335a011b2743a3b74cac73acd2de163c47f30389b174eb19127d002f289b5c25043e628e5b5f503c23d89ecdbb009c8db82ef0983ce0e7cff96234bb78e2d1a9a95452dc19328ae3268e9dda6ba2a48587a8a1e397d955d94b786d100e98784e44411590389688ffb26b6c13de7a69615387b19471cc66da60dc181b88ff614a34a82f8dab34a6cf45672d5c33de3618d08b5151eaba1685f382a9f033a5374b4bebc465ab529f68ca35162df4f2249ec591d1a7f724b589f56279916b6decffb3915747ce1f0efe9e3b7c5ee2217d2230a752e25cc778ec428cd079e83ad953b2fdbfafef8952ee4b7f69d06900a3ad79b107ec3af029a491f22df8c1e80a45bf63f4d19f4690c49d2457dfad0ade56486cbb2665fd4db7534ba4c078ce841917269bc5270f17984194a81f792c0b78de9dd05797970db57fe154dce080facda9daa77d0cf3c2f3071641a1935826891d31865546ddc0c21b0dc607b1e893653e85285ecd11617c2f6a53e4b2462a2524cf761b94bb4e4982cb4576e73f306e45d23406ab855e97703032fa1fb24214eb8887e2cd601a20fcc105ad5718732a939d17456285765be587206fabdcc46cc4cc33b94d4572ad7d0fd2c49290ed87b70e1baf6f23c6fb2c82bcf45aedcbd484b378d09351719c984379379585fff5e94f6424fa9c848758fa37cf3d44a6cf03a527766a6445d5f4d23e5e6d08a8632541f19f693c8b7272a8fbd4b06965cd19dd7999b7bcdede8b31a8ba0e580f440932ce67143c01465e4cf4edfde96f519ccce0f8b0d44df5e3e6c29231712ee2e1adbf41292348a007c90b462f3e4144222f446c6e14839feed21b0c986b85989f49547151e90675dd9a50b1a9a0792e9357daba48fa819a088510a76f50c2cc04585c24ba4b8fc02a8d6960a3c7c5824e96c26369fc488645b7bf68f55360d96d75a70c314972a25ec02edf244672d150bd6683e854026fcc193723e99382788ba4936900698b9313838ee8b32eddab43061b5f34270458fdabc7bd5735199d81459cad5a6b81ff8a61c342711351e7af5e417f936bbaae0b7a0b90b4739d8351b7660f182a88703cc27cc03f70b17273a7e306b36f54bf7bf993a80459b3010bb88f43f03591671f09711216a703fa7b3dc0da47d08230024830d073f332b21a41460cacc0989c092bad4878025844ca7c98756ffd195e44f983cdae0ace1030fc641a22549754c943b434b56e298bba45bdf242aa39dd50cd62d3c182d3603a944e3753749546855d276be35821dcde468458dc7531134f6cd32758e358b40443056f72aa4b486ab40733b522f3a69887e19c41389b624572b4b54305626d461c7ad3944f60b034cea38796b837bea76a164d5b31448f986634492986a881027119704991b1fa38f541e609691c5ea4436f4caf5b2f8da5481b078b54cfbc876b3b6a4e32e6f23ea64ceaf755f616b81387a063a2302836c951de8c71915a95567fb31bcec6f56582e9100a4e1172e6da6a19dd8cdcf4129c63593f77a063c305b988da4ccbf94e6caeae0cec8dfe2215dc9da1cd539e727fc6afe973c5514acd9350b839a9dc9834a5afba5842765bc643d42c78eaa561f0cb3d0eae0ce3a19ab22f05d39bc8d28c271dadb74d4fb75ca09e37192788147dea18346e627072aa98c1ee12653ad01171970f49b0c8c4b9e830037c629df6081165e6b954949e5a345c817d1c472561f82acbbb02e598e5c171a6d064d4b7896b5ac611170a8907e5fad243172aca22a6fb2ac995396d56848daed0365c27fc0754351d0113ad046a135a590567851dc1b22997d26d8f2fd831f5d57e294e11689067a01d0b2783ba96848a14df71d5ca2e5d0e075ee8279f2ee3651c9057aa561ed2862d6fd4c0ab11f276a2d470e36d6fe4222b06c2c08d4a56a24efc253cf40d5664f9f4f752db72f30f792ae577e03d0bdd155d9926c8764d3712e22e97c1be4ea6945f84a0c59d06efc1d957c3b9bc4e7a5f35390ce65919de8795b9b8fdab1baa97715199dc017978f535d87720d1e6aa2ae50a09e6e0c9282a1fca2509d5c23d697db13b105f070add2fcc6a71b8f3702393ae57be8c0074e13610d589e7a8164af6e7eeec85e586dda784873742cac4692b34645b1b3e08131db004dd3f3330cc156ffef26322192a478cae6741d35fe108decb0c78f61dd98075cc2a63ba6e2458dd4b5250cbda703fcc76edaee4bb85709e1b5c76b97b616ddce6f629c2c4eb78ec6f2bdf62e77138280fc6df33cacbed716bcc0e31ab9ec8025bb8b188314f41dc424b8826816b71870eb1c89419547f931ab94d00636f952acfc37e4506a4da92294bf012228db848fc5a2050710c163b527769e03c5ffd3cd0c1b05883ec73b48faa4351cb7666f8d2ba4eba250b093718d100d5db694f8a318796ccc691bad06f9b1646dfac7eab742cf6451880f397310744b157a7cc87a7f70b010338e00dd621513065b1f10896945103e62e651d12c54fcf349924c92a5986180be4d9a6fdcb08e187492895c63942d25fa518424d7f8877e02126c2625463db1e5fd16bd76022ab90648e8375aed018b1dd12ac9d0a826418093250e5501dc284a2eb64fafa96000ae8b426f99f30b31e5115ab6960d401ce6ffd4fd0784a03593a5c31177a05d627ea165f018912ced5e6f487f791638b396ab5b4bb29f10479c008a6c24bb97fe0ddaa72457da42fd761482aa394c1e9c8e9c16fe4cdfd956f2989ba0c37d7865701a886619ffee989a181a1210ae57ccb12c29e3ae24c62c8103a0827852916b01db3f225c2dcf6d423115833ec8b102ac02173fb4dde82e642e502fad549f575086dc2ea5011f332bf85ed860dd5558b7974e89a7b5ee525425e4c40ce86a814368fe874a12eb5361879957150b7fb0deb67a347302bd27ce094d32a67655168b52bf94392fded104396cd015c60267df80c30c0bb5b181a157e2cf97ae4ec382d98d2155055908295e38fed7967b4a5dddc11bd0b7c02af738670d3afd011637a9e799734a367ed730ba1c8476fa0469b5f201f35188e44b0d1d1c87dfbc1b2616320eab8460f1845da9ef5ed0d25e4e7649cc65cb5f659e3a6b2f02a1cb11e63840bfb0176b323636a486564d33d3b95e14dfa5b8ea98eb23a097848195f28b05334914366b9c43b1ca3c0e31324e1d12eb659171d9a87200e225f1c57d070f0d8012372db73dce99781e32b1ea4219f7410464436934725ac2b2e2c586fd44347676129b06a91692092eff51cae383eba9c19728116c36c663023021cbeec88be4f176705570f73be9cfe485a804b319c60c3a2633227f4a10db17e1207a8346ade2c4aa9283dbcb8cdd345257c0b4b4a72344bc0e74a8bff264482856e1841459dd9d0a6136fb2d50681d29365aa3723cb86cdd6124514dd8d0866912ca251bd4eb57b7b7db6d8f864b61cff08d5aa82bc8c09a3b0b4b0ce71e3f8e220ad9b20e26be7b6e3488cec1fbf9d3dc2d3fe9a9cbbfaae65d608cdae3edeeb0c277288792388bcce210ea6bca3e4d31c2b19dd1f55b2d2526b6b15ae697768cb740d48927f580561a001f87550fb6a51a4e04dcaccd8cd69115a98ce82f5886507bdcbb5d35764a567c45caff7bc34f46530fd907484f7853be03872f55b278ed7019126ed457cfc86b8213f54c6ed6c84141cf573c73457b2ea1ccc6c19ca98a2845e4458b2532129ed68c962c94f6f555931507907e5759f3b207735b71976700c942b57a6e0eda6f66f10f8b73abcfef2cbe1a6e1cc8a6a55503761996ef39d0e962d58b4fa55352b10a60dcfdb0312fa28ae9c2b298580501c9b4787f8d1d2f37af36886b7117af4664606d582105fbadb8c5c5d500a4e822325019ed349127c17e88182444fa38018b6baa71dcbed7c76e570340b76e9d0f37fab2bce95b60606ed8a66df3701e2d7edc6c170e3e1529a4dc8290f712f71d9201f4906cf58e4f6fadd7a533c4356c8c9c4c8546da7f8b69185216a92c45cc01c3d4123c5bf626ee96b95827504e19f55a8ee327dcb1341835ce068b37ddb3fbe5524b796bbe881b3140a27e135d77bcc03c28d10c746fc7289fb9020d266afac9ae98a4e12b1d7a588220cbadc525adbeb2df625a1666ab71e05bbec3675a389e521795f3a1a32d804c1e63d0a3099d5d7a30093bde1221c349f356fa470d5811a81b117823cb17c72cc971ceb6be84626972f199d32b9aadbd9cc8f31528dc46114b451469390dc621ff978b02cbcf39ac7de0bee2d3e0cefa95080bedcd6c211810e64d395f32ec79e70724f37edd5555864b37a0016c8a51385199f8157108d3505c02efb2c452dc8cdea5e37df38eaf820022b645b403b92d66b21dd2e4aa0086f5d0f5961398ae78df05a96c7e877e0765210f0130309a54c9c3c5359a13052084d71bc39900c760775f0744034e2e91e7deaaf17e9cdce92e5dd338a270fb034273bc4903e9f6d20c44f0681ca0317b69813359786c6ae8a1bbafbd2431e266b05cffc1e210120d8d04d7cb31638861a55524047221eadebfd2333f119a64939904bdd00f484bfb8a2860e4863c8d060eb3bc82ce87340727d214be64d59e614fa34d5ec7c8667bc3cc2b1cebe07637288946406cb243a294fd6dd6155037f5e8da1e25ad7908110401ef011ae1c51098ca73887ce3cd7316ca023b06bd7cc9fd87af5e41bc390bb20cedc06eb554382487528f5c68f2d369e8553b2afbb9b9b2e284a271c7d6b3517d73f9ecaaf35bd1ae9ef486f168729551c54047124fbe08a51daace0e9161c2807a1244e41d8bc82724040d2c025ed6e69dd811db0ee6e7ad523e2c5e2cfd901a3c14ca44d3f9b1cbcf54625097f734e3213153b0b3962f788dc4491876dcc79b9810b9224058ea3d1e2ad948fdea5e0e24a9c251c0bf899c4d22269061ad4b506f60a363128c880d44da81f1df08fd2ac19a7dfd9f70230e60560f62caf7442c21bc5bbafd91cdbe95e5dd48f6f3e646ec1db82b128a36b83af958e1d3e5f91b745dcce5d48010e125c48d7820c6c5809b29c462f40949f9c59de2f67a28d48ed7bf6c0ed4d598fc286be09dc94319648c83bc5802e1c618fa0820be5cc94b78f771e01e4f88ed48f65fd7dc3cf7ee225aa6564986cbb4d901357a099101b1be5552728cfccbad4809b1c11522f442288e53ad36067ab337bfa8d08db6b018880020b87337a55c8bc19e30e32b444d22ee5718256beb143d962ca92f16a37438c64c74fc7de0ae6c0298bed8f36680f760a7b805396f71ce55b8bfc06439ed0eaf79a22b65b7d45c0f56aa87506b4a5b53d6b6352bb5c949e03ef4cdb7b1588f4606c494fd596acd373ac24095bbc99c648b7433776f2782a0a4df3e221543638112b4dc51f802a8506d0c8a3a2609e60e8ef5e508dbbf69b83e8ea1a534aea99da5d89bd065e7df0ca1163fed6a54e662b17b2de40cb85c292878e620601cc80eeae4a6202220bff842685e90708913fa8f6d364a4c1aa4fb6d8961fc444a3ed35b0d1ae54ba29e597d44130d881806d8a03eeb56de1c7eb00a5ba14a5cf1b9a9f5cfa94fb4c1016e5c084480526a726ccbd1a7f8dbe11e1a7668212cb9853cb9bcaad2d96b2ff25fcb6c3ff892032d47f8a17aa970a9f354213c1d9c5fbbe2da0cc20ec70280735fbf35fbcb935fddcbd4e5f74824e610f9e3a3741d2e7800863ac7d7971640af76eb9be9e567bbf7c1371dc513dc78afe717425c4f9a2d403b1e06bc16a7813ef74cb48432431cf40bd797c2113a42d58e1fd948358ca443a52048e124d615e207883fa0afd0854b300869479468021d03b9a29536f81360ace7848d2bca47aade0cfde053c987349cd13ce1433c749c2dfc5a474267e4e921d3132a2d6600bef8b0d45a22bb3d723132002b941c06369a743e04ac0aa5b612b31d9ac2e74abda39472bc9f046f951010c7dfe12ff77fb99a248a7e7e13b1dc18a791e2f010569293043a8b85d4c8ed38c23b9e9e0b5059a04de2a2ebe07cfd4e05e5b7e3b9a59537c714b49964621f5f71a133683538789af51cd8e1a960303f16d49cb50a96478564bae0746acb8e5e6e94f83dcde962fa9882820146f8d68642b7ccf46f9d148257137516197a04a822db6867fa55a225f5f7f932fd3e433a65650bbdaa7c4db337308880bc05ca9e5101b053dc68212cf3ae7aa64a58703a1c0f60736a2c79b86ee7a1a3779676ec83a0bff706ccce9e3103373c66f2db12923681f506cf23d8ec0fce3047cdea31e826ce21edf41a9eef8b6e26bc4cd4a7a6b07e69a2a9f413b1b308288f62a0951e5afe80efe428ef76df9664e83aadd4d1d50b0c2ee62bbad3746a0a194d5be1f830898d81401ee37c8405312a4fcb1992ff8149cb351075d69cad2f4ddd6c6dcde124123aff15a7566b650ab296052bc3fdba49355af98767a07fcf0b29c24a60c52c0e2bbb934bc46565d169d19b43934a8f19d0f3f6cebc08d5be987b9505bcc9758b1ccc441e231c000802e180c870d6ba968ffbef50538e4d3bc2f0d79d11f2051aa9268dd6e1f07c518ba52de606ae9273277c9bf0d92d4d37519b306a8e1b3b20d9e9641a01314c0026b61f1946c811464441306280114b2d8c7ccda160c3c0c25a9b9d4ed4c764a9d3cfaffbf9407ece240eb0e8ecc418c54a1317c4cf06694a7b64ebefcb140556c4376a6c302ba73c4fa977a02396b10ebe44ff411c80f558ba59fa410131c704d842e80c7bae8754002daa243c6977d668274fdaead1ebbfa86525ddb845ca90b3bfb4337f0e5792d8b0f140c7cad252030e3e4b4a25a0d9ea573e89d7e81c202c9eab9dee5594913c9ff5c2cf5e2d619657e35150c9c5ea0b0a2910bf4250f9b91767671344f8d9e2fb60b2f909d7b8789a46336f441d0e2577ab209ed3848dcdc540311becfbfbf8ca1f354c17505d5673f7183490f0b6385292acf3facd446782b3de9d452342bc8855f9e94b5e21fba4207490d0f4ebe0fa8a4fa4bc256f4feee6f13c4a9766300f5546987bac3093aaf64d0b8d649439e04f6729e82c15e43ff867fccbc62b65f6626508ffbbfe0b031c541ba2c22603a159e6012ca75a30f506a863c8a1a57ffa390e68ae1236d0039ce7c12c97865dc75592d03e6d784a042e937438a2f1c2c1376e93d1391d97a38055bb13c147cb9ab5568b91959f7be54c061f8c87e7f47f59f7317a4754786f5510488e36c6eaa3b647b3dd9ee8f5873df2803a3398657559570da6ef0f926b995ae72961b8266ad97f39b8fa45f908b86987eca02d28acadf776fad336a5b1d660323943e29af0d98f7e4ecbe6b499776a143eae671925ca11d371ff13c8bfb2e86d365c85d39d3befdb4efff76f903f591285b8896a09b3e9c9bb225091331ce5191ed519badd9ecaabedda411c48c6f0ebc2853f7b9cfa996574529dffa1a5189baa0472718d2da754405ff591db49198f5ff021649fcb782cab8ec368be19c156d77870e5628d5e94352fa6fe63124994c55e93be06919881bb036473cafe12be099fcfd84f737d1fbe69fe1ad54d2e69fad83241d6f7314dafd508cdc2acee182ff6f6fe266f59d32a884d767eef3baedd5c53c2ffd81ec2376d613202e27e475f71ff79313f4e8c3fb402ef505c191364675c1bacf2f6aadf9415fc0a23eab3088c54388e09843c4825cbda9b429795e204ccbe5954475812ad8faaecc11bf1dd2919b65fd6cd8ceb55d518ff817a57f5f63726ff4367de434c4a88eb9a033c2529caf079eb7e72f768457ad1f5ad361e5fe56f29bd883feac832afad0a6a1fc4ced01a5a8fa6f30ab772f735617d9131e13e0cc7025a4e97da15932c6d914cb89476f3847432bbbcdce330d86e4573c2468f96d4c804b11b8d0caae0271974995aa2b3b80b386aaf12e1e10acdafc1bfe145632cd34d7f6851e47743e3e2e1546d26ba14a89f3be2059867daad0682ec76369c7332a2aef204fcd776b51e4ea0ff22ec6f8f0372ac5301fe63ea107be7fce0d48bfce3466abeba2d22afa6ca09bbcaabd60b671eec6b0a7ad43b7081b0680569557e4cc6482a3ba1bcd0cc3f85199e5699d79c79546f34f6fbc0dfca596111fd5511e6a391eed12665fe48b9383493a90c22e89c7074ba92e3de935ff90edd10b41a9191b95f194e5866dd2c9f5460a1d88f81ab7163b99c3714056c8b309821fd77135df8a4557ce97fc42e044ad7ad36f57021a2fbfc17b4da59fb33f58e81e8ea88a064ce00c98c43179307d60a4fc04e8101ce115fda669e12f9ee499777033bca7f756b45f2b56b387ee4536085dc3ba6fa3383fe67a84aaef7c833d39d3788fbaf774139538d62f831a4f7e535d3ce3f08fdd3bba198a94635fc81a14c0e8cb8bbc4bc03432ea5708d659f7d18b6c39f1bab977e5c2bf7c4a07e7725ed4effedf0c29694340c053e52411e7d32541224453a3d4f6010b2409d7986925c9beaee28d373c2903039619e8e0278ca172810008c7e4171d5a41c53417a984e2f528409591db7026af62dd3c10c62a3f20afa56ff7149739f688b875b86869f9edcd731d38e026cc9aa67a953a7099e6701b675d2c6a6022db4d30d610708ae674b7044f7eed55ff9954cab2ad55cc297e6c1939744f363f729ebf4e5b63799d45eabc892baf376e32f359d31fd1f4909b4e3de8bdc9afd507480ee93495bb14656d5408102017aab8c88c34c346b390d57ace73ffc7919a6619a4a895167fe1d642d38f4229a2e33cb5315816df226d83196bdc3a98c06b114ac9894a0bb2ab571bd263d7b0915d5287eccd1f710b4392cf0f4f3c98c6ab0ee923c2a142883075e7b30165f5323f88fce3afe0a8538c56c7062fb4d035d06767fb13d6361cb33a252f34185ed2f3d4eed5aa95f7718875d027b99aba3fe6efcf28c6537472879ab89c3dd159b1d2ce7e6898338cc64155ba15594a9ab9b058059b1ce6d892f035ab168913de158386873e340a2b473dc2858e055ab229961f37d76b19509d31e0314a871b9958f7aca994353a8d70937a28d1d55e8b1ee3105e1204e11e342db3b874ad2b44875be264d0633ed15ca283206f9f38bfa0e98db59aec0d744d04a2c34c4eef7ab803c8800741be902c62e6b2e02a38d36644f712260ce2f097f6f0542282e85ea0eab1320e65f5ea3437e79f0379812f4c2d935b3ed7ab0c92b68ddcb518c71351128eacde0642f039b471c7ce68858d44f7411adaae0db0911a82b3afacad28a01565caa4753305023d7f04e8f10d038dcf571b463c2d5a07953669c2143a172c4e1f12e649f8cd29586022f789a239e61bafef015ae5931d9df14cd8a94450fcbd7beeda5b2cd26d70e6b415f09a3bb60fb421cdacccf94869884a00be10a890db10a9bf015e4addd19e34260765dc00e2c1ae76366f59ce7ed6889fbc59de93b8b7a743b1d34ba4296b97a94e275dd4ff3e6c529a1978106f489045aaa3bbe551048cb6a3a84a3f14889ab8ba2ed22a4dfacb67845d981c730dcf277c44ee8a9311762280ca5d42cab117c17af9809cc849c9897acd00d6a5a1b229a1bf8ccac9d37b2ad7081c23ade0ecbdabddbdade7bcb94920cdd0b110ca50b2e2e3d0a7141f55bba681f8f2284d0b774d16c6c643d8e2284f0293b8a1082e53bd4a3f8d4a36a8e1e9b013b1fe451210380fc8baca057430becdf0a2c8865050579fb56149a65605084040b92829afa72bb38453e987ceaa87ecb5711925a8ffd7a3b614150f0717f945a64aaeac9c910be3dab7a523dddfe959321882e9a0711a7b7ac38bdf5e2f496eb8b9035eabca58bc63d7d26f541766c2c057b19c552b0a3db2edaaddea23765ed84fd84bd53fd5be2141539e9a2cd563fca45f3aee314b9708a6e7f41878b36c33882c28a4e330007feb9e3323805795ea754149b1bfd5076c2921cf1e50aecba8e6b4e82b32f7288611a7bcccb752639e6b8e5aa0c39c6f8ca37d6d22eae07d7ff4b514aa99db02ff50798b029b6c0e296ba7141791e95d22970993253c8c8e0539838c932323217cbc934e7d3e7a6701cb57cf91f610249ec4f3dfd2cd7d8e80b18b0000b2e3b88830cd8a4230b2e708cd142c9eba76007a09fbe337126a2778f2851b934398fbc26ad6ca922168bbd71030eac8005d5b0f10227ea188ac5829c6896e42022a3e90444aa0fc5dca79e76cf7dea83b84f75ff812108865fcfb951493deae77fa1078ade6f62504a1ca974415ce73175eabb4fa5beefc4dabd88127bbcd5f4a9704fc57bee4b759ee81d51e9c24fc57b8e0a8aa2bea3ddc5f179e7714f592c741df79d38a6fefb4e7dcda19ebd399df45e7092a262108a592c74cf7d50f75cf7540cea1e250a75e2b7e731b5e77def81ec79a2508fb73ef51ef75d4ae4a818c43d4a14f244f15b0ea29efb20d473a250170ee2be1385503fffeb4ec19ec52cd210e43dea0f30612ba1ea0deb3cb10b73937627c7e7b56bce21bee9246c7adcb36ffde366bb3275ee59a4302b5e8536afc1bdd7a1a8cf0d56bd6e9663a2ba78bd80e88636247ca048c82e6a8b43892d0e2ddb9d65c46184f7831746163aba2e8c23c66c5e47e607649c3a5693eeceef3a324c1bd7510fa9888c2b6494569cd8c1d2184f4858907490c6186330ade030dab88e7a70b0e0ce32e0404add9a3b06cdc98b184b63ccc460a748bef9ac267ee7fb9d22cdfc99b749144760acbcf881cdd18c556380c22204109313ca3881115c6ce8811348f8d0c653930e9a7a5005921757cc7801c68b7bea628e1ca2bac5c08b5a07c68b29381ee0a8f283d110618451c50eb44401061c6ebc6185185fece001718f381ea0805b41b8a9c06b7e82c253c1135b1b47402730516196a9a1be7062f5393ad0a157cf9d113978a38d9d1c287b32a851b0c7a67c3daf4a379d738e1bdbe09141a181840ef009065d19153ed59d65e4e00c3378ce31ceddaebe737e12159c043d993f6bcc1ffe1e373f7bd5d3ff3db852f9366fb825d754252f316d4a4a3c30d9456c83b962a21a71cb1e01c331bfe41edcb6e1cbdec1c949b7114bafded29d56976b27d149c9492f62b6fa97f09ea84ec56d2742a3f297eee4aad6551f51a1c70dc7d5167a9fe139723fc3966f68b7396ea80e802208b66f8594c873bc1b4a9c9387e33cefb9d6755c0bc29ec81b08360fc364e1e6253e1270d8d9e8ca37bad1eec177645cbdd87f7f6c51cb1fede21ff367de6ed56ccdcde96c6de055c9503d4646a579e2eb39b16811850fbc21f1cdf9434363bba7bb7bf16db08fc18db33c5b54039556712bdeecc4c66d1bab898b69038b0d977bbf7c3f8e5266e2a3eded77b3f36513d5c5ebb5d401e105b5850b252f8ab660e3861570a8820d22a00843054a5f9ce81718d43812a855150355040f211120b419be0516629a0083871d5ae09283ccd21a51b0e04a0a8abe2d46e0e418001a3784692329054c70f15f8c41c70ae0706248065ddcc0c17481031a2e0e25666c81830a1ab85186072cc8e6e8628d33ba0481032ec6745cb4f1c304dc463d9603f6bcd8d9c9c9411149615ce48004471e2a0bef7833d579df02ea53a8f7505d9d99de87df42ea67442adfa7a8809b45fd0b30cc26284efee8f4ea994c2f409901888913da3dea41d0033beb59f17617d470dd6a06454521263a52ab34fc2e41601784fa5014f2c4d15b1ccb4a0ff51c0a35f3bdbeefc10fc597b7e87bac4af854988462972f5f4a809f98e488540ba9ef514f25d5028aca27d6d45b014a7d10aafffb096b9185fa94c8ea3e8512591dca0acc0a6cc2780ccaf2ac9b98a947ee857c51a13889fae6b888aec5b2765dd7df75ece4ed61c13d6777ee7472b23ca722cbf37c04f2f7d664ff163a086d0a2491c52df8f7b77f9fe2ec0cc7e25c7c716210088a3dde9af341db635b9367fba1439d1bf7d9717b94b76d9bc7bc11b9872474a9e578c77695df43a45d25919e232f6ee2a69d0677da757be92341c6e2e7de0a6cb32ca61fc462107d4e149a40ce56d5637d5db7fe44da3569dfbc1e125f66f2fd0b097509f2ef17ea12847a7fcffb8fbef72951a84b4a6c178550e2745ad694e889d35baccdb23691c582bff72df4a7442a292a5f87e4e4c405285228a59476dc06442995d4f7bba5f23deabdf767c067bb04a5c4ea284bc5137d3bc1d7fdcef59e4a3f8f9ffc4fdf0a6ca6a31fe44f45a12edd0bd119b1f46ef89d18a4f2578d35353348451cc771dc4f8e732389537243061cc7715f33d3719f93032c97ebbaae73428214355ce1bb28d4c7819dfdee0c531e8628d403f9ecb124c24df5dbb6ce865dc731e011402f77869428eeb058e8e7f1411dc4bf23bcd38943e36335994f9fefd3e1f5b0b7a53bec438eca79943ef9fc9ee7edd19b73e92fe144d6d35139aec9f6ac14bc18baf7ae7da23ef9c26cf93bd3912732d106a3facfbb8d7167193850ba7ccbc9e47f823f9376cd32dc0073fd5ff087c143664e92c2ec919f49e7c2d02ebfce9af4f6cc980cbeb9f32599f3c8eb0ceafbcf77e9ab6696e6cf0c73e9f6ba34e7cef7ff6f6c175f1f72549c15fc89f4c8db2ff1df4496950bd4344534454ed6d9a25f698a2ea5515aa351a854ea3df5549c3fd4a73e10f529f0fb362e352cfeed276cbec7bdf72d74bf8954b6efdeeb44168c0aea3991c5a213efb9667b446599c8b1d273bab18f746466e62d3ccf5b347c70d5a2e325427b2eed717242f116fd17bc45cb39f6f82bf5943ec728c33ea09e308a7aea33c909a3286ec5711cc7596662bae4333720dcf0cedfc2034cd812be41f573a8f9e9ad0df42147adb9f3bfee88cb46842c783279d89b3d535a5182fa68c86261fb1d1f74f33cfebbb12c27dbb30e30611bab850f429b022906bbf18ebeea5d9c9ec86241f53d9e45c51654aaefd1e36f7e7b560b37bffd8dc8a2f909bbf94d64d1d8d58d7dd56af560786718304997f6f4d8fd665fdeeabe87ed01c5af13b968c29cb0ba9fb0ee3daffb42079772620edcd7cf61fb9a1248504bd672bbff78d817bcd52539a2de7c8f6f755f1a59623a754a51b4713b23277d46e4adaef39ab7ba779ab7ba4ef59dcd77cfabefde8d9c04e1bbf7a39538614e866ebec703358b05eeeb3fd978ece0a219208a9cdcf11d9b609213d6cd1da98e879db01a30c5460c8695584c118fe12f8cc469f01233dd2ee5b47bf7d2fdd7e10e18a57449fb518fddf7b037764c75232feab11ba244f5ce4664a57ec74f58a712592991c542addbd73c15eeebb7504365ebba671a8fefd8e87625cceaec31d5893b3dd2221eb6bae52d2e2729a243f58e1e54aa5fc1df9b4d8190a4b81eae90c34fbfcc7591294b7fdbf5beeceef4b62694099989e4a16a1697fb3890861c09b3c5fd16a230733db167f2705fd346e56a5c9193394c9289b78638242ec7097139ce87cb3d7d83ab714f4cd243959c092ef74c9ce49843e23a663a9d64791f7a419e18047e280ad1884233e20848d407b9ff423bb9873203442db99a9333cfd52ef733a80eed844dff3c5c3223438f5c8fdccf3051fbd2f7a6ef396ee501cefb3cef53224a2c579ee775ef794a5b7f6c7ccc71dcb672eaeeeeeeee796dd46ac197fe12beb4b472ddbbc3bc5113218420f367fb9df9c3f530dd30c45c16a374735c297d594d7eb05882e0d24c9ea699118129e7bf79b6b9134b1763f0f7b27b16bbca620cfef4c6e0af52d9dcd81e93a757459c6a4943337ff87dc8516deef414cc4b7244cbc950277262872f206ab9fa6e32c9096b6d93d207c3e9f2a740cd4cbc06930f3e2eb55cadbe9c76b5ab1cbfdcb9e3f5294ee49f13f5d8dbb6b1faf97b64eef77e37c28d21304860d208c109ad0c1ef4808c2bca0813421264d4f8a1cc1b4d6421c5f6c50a94bfa00c3030146ff1bb605fa5fa6ae79da93333343334b5d6fa4bfa561474dec51998a86533b5ca3e7f073269d7bc51e8ad81753760e5ea7c2013279be94938a69673e98949e7e7d0941ec3ceaff333b41e861f8a52faced0cc88392058bfa4379c0fe43336c74611ba3a3a51fceacc199df75089ce5b5b3d12d4f275f9a3099f454353fbf2d19524dad3e5207866b684979bb444ec969c85696a18fe0d7f49dff05fc8f9a12e5d7eb1d41159363fafeac1e76fa6768122cbe6e9b579fe21b258cf97f5fced46bb582c714a8f311f5688f52cf03363e98a14ea67be9ad1822dfc7fbe7b34b599bc152af11d17f893ea8439d50c356cb821f82ccb4a017c7ff05d64a5c07a7f1763e09ef5f37e340cce50c94c5d81350c439aaf6114bece45979f9999a7f4c821f8844d13e94ab3359f5fd52e9648653dce6f5ad5a53b5fc8ee00c2aa470f4f42532cc7befc4c0866cb751e9663b6c60a753123d28865f550a4495ec31ad62a965e3a0afebd7bf8a175a71ea77f9fc8fda58f1a4c8f483d26f5c87fafc8dd29d74651bf999c9c325bfc1e9377b5309a4fb689c4b1a2e1d941193148b8fe5c111ceab8c1758f070544c2b8c0e920e2bad37174bd0e1faefbaa5677e7a2e9ba3f93207707ebd11c2bf0c850828e2b3f48020932ce8095f5c270822c9e00e24a0cac0003f39f9c0fb8a04355aa7e506b95f10314ccc1c51bea66118afadc377341c746868e5bf6d06e6db1dabfb371771ddfdc29671847b783fccf573df528dac47892e8bcd4cfeb6db39bfa0f678d9a527533b8a92fc894411068d07688a595bb0385f1e214ad514b170d096d0773eca771aaaa6fc97c68f387e63d4663793c8d53db40b383d4f7a7bedc89a5be6cc9544f5beca69e47a55fb6787e94522a1e1e43c1c7558973f294b4e8a6fc6e62b9d9e0b5fc80d32dbb97619bdd1d3f43253bb6fcf820249061031a3aea8e1fdfbd8bd6aed4ffb02e2dddea77d160e08921c6759b584a543d9d515573d8c46c86be1d768bf829f13f959d41f8dac83670a6ea73a0cafa75a3c77662fe1c33ead73ba020054f75c03e9c09c2e38bcc8acc402c341f5a1fffd1cd7b07cde561875cd6eff820b688ac757172bec8ece6fb554f37aaa79a1d3e688ccc8ccc8c6009224208eefe851620331842c9c9204fe4aafe6b30a6c3123335a6b089a99e7a14f2442d5b32d5930821b88c5ce112bf3bbe886cfef0f846635e107e4e1710108acc788ce64fea8b307d3c2c12dae4e90782468f1edfaf8353f4aa2714746e4afca1d5d2088d074f4a4cfd4e4c84d8687f18fd08627f20f90f25fb0308131026275d34af56204c2ea875de1b9d1e3620d872b3e1962d59697305c40155b66f9122b322587aecd4abfe13e7509d375544cbb545b2cc11b400759d412d5d344e9a020b9a8bd6ae949676ad6aed02e1038cc463b0181c06836130f80b36011fb117dc0573c15f780bd682b360232e0163c157b017b6e2fb492727990a9e82bb7014fc046f61127013bc042bc148f0115c0413c14270100c048b807de01e78070e01e7c038b00d56a880606c0955e118dfc043ac03cb9807bec23f7cff0f8f80b1f0104cc44670164e8269cc046b6127b8c6503097ef47527392a5f87e24454e72d1f723317292abf87e244748904e689a3f3dbe771e2709131535bb3334473f9b04a2e4ad2f954acddc6ff3ad799b5b37a37a46b253fe03d603cf63d80e3c8b616b780ec372e0198c95f20c86ddc0f31796866713d828cf477686672fac069ebbb01978e6c262e0f98b95e1790b1bc3b316b67ccec25ee0d9c842792e81b5c03316b602cf57580a3c7bb1303c5b6127f05c8515e1990a2b81e7223be4790a1b8167292c91e72ef685672e96e7390a0b8167286c91e727ec039e6b7684e72dd601cf4ed89e671258179eb558129e9bb00d7866c296f0bc8465c033cd1a7956c22ee039091be41909fbe4398b3df27c8455c0b311d684e7226c0bcf44d6f54c844dc0f310967c16c2063d63b1afe7202c029e47607d9e81b007789ed99f671158169e7fb0489e7db04e9eafd824cf3dd8159e79b00078dec11ae0596603f01c025b80671dac009e73b02a3c0f59a0671c6c0acf37d8fb6c8325c073ccc2de8a6df255ec009e8a65f242f68407815df22dabe4478bc2a72ccded618718d1d2631ba919a1f56884c648d603cf63d829cf62d80e3c87616b78066339f00c8695f2fc85ddc0b3092c0dcf4736cab3177686e72eac069eb9b01978fe6231f0bc8595e1590b1bc37316b67c36b217782e8185f28c85b5c0f315b602cf5e2c053e042bc2b3151686e72aec90672aec049e8b2c91e729ac049ea5b03ccf5d6c049eb9d822cf51d8179ea1b0233c3f6121f05cb33dcf5bec039e9db0243c93c03ae0598b2de1b909ebc23313d6c8f312b601cf341be45909cb80e724ec916724ec029eb358139e8fb04f9e8db0aee722ac029e892cf94c846de17908fb7a16c226e0198bf5790ec2063d8fc0fe3c036111f03cb3489e45600ff0fc834df2ec8365e1f98a05c0730fd6c9330f3600cf3bd8159e655600cf21b00678d6c1023de7600bf03c64ef330e5685e71b2cecd9069bc273cc0ee0ad58027c157bc253b14d5ec82a79105826dfb228fc68973c08d6e657f6e65356f53d6ceb0219d363036912813019a1dd7e214cd4d2452b8130dd7e2334275bdf6fa4e6e4f8fd468a8c18b5641fb045801c7d3f10a59a078f6ed70051ba1d53d9224c37b6c8181b5ba40987561661bafd2e9a931ef87e57cdc929dfef2a72b203dfef3272b286ef771d39c981ef77213929e5fb5d4a4e6ee0fb5d4b4ed2f0fd2e2627a37cbfabc9c919bedfe5e4a406bedff5e46406be9f8c398981ef27654ecaf0fde4ccc918be9f2472b2fc7e92e6e405be9fac3909e5fbc922272df0fda4919315f87ef2c8490a7c3f89e4240cdf4f2a393981ef27979c94c0f7934c4e46e0fbc926275ff87ed2c949087c3ff9e4e403beff1573d201dfff9239e9c2f7bf664e36e0fb5f444e32e0fb5f342717f0fdaf9a934fbeff55e4a402beff65e4640bdfff3a723201dfff427232e8fb5f4a4e22e0fb5f4b4e1ee0fb5f4c4eb2f0fdaf26279d7cffcbc9c915befff5e4a401bedf27e66401bedf47e6a40adfef33733285eff721729200dfef4373b2c9f7fbd49c64f2fd3e454e2ef97e1f232751f87e9f2327957cbf0f9293277cbf8f929303f87e9f252761dfefc3e4e4fd7e9f262781bedfc7c949017cbfcf939301f8fe9f989300f8fe1f999349beff67e62492efff2172f2e7fb7f684efa7cff4fcdc9d7f7ff1439497eff8f9193aeefff3972d284efff4172f2889341c421d5ebe0c1847cffcf929346beff87c9c912beffa7c94912beffc7c9c99eefff79727284ef471243227392e7fb91cc901021a1e1f4e368f19b7aaff5a9f153a954eaa78d299460f6adc0de36b940f5290f5817cd557315b98c5c472e2497926bc9c5e46a7239b99ec818292367241149236b641169441e9148a412b94432914da413f9f48abd64afd98be8457bd55e452fa3d7d10be9a5f45a7a31bd9a5e4eaf279f988fcc67e643e443f3a9f914f918f91cf920f928f92cf930f934f938f93cfdc47e643fb31fa21fda4feda7e8c7e8e7e807e967e987e9a7e9c7e9e709490c890cc90c09111295dd12e4855899070b22fe28794b057ac0e2144db138461db0384735581c240e581c252916676903168789068bd314c5e238cd60719e346059b10c58960c03963593c1b28862b02c5a6959b50b58561114cb32b280651d55c0b2902860594a3058d6d2042c8b490296d51401cb727ac1b29e206073620fb0393207d89c990b3687a8013687c6009b535b80cd297a62738c1460738e5ab0394809b0394a41366709013687e90036a789059be3e4c4e63cad60756206b03ab202589d990a56872805ab432380d5a935b13a454cac8ed112ab738482d541526275944eb03a4b03b03a4c30ab73ad0e90d51180f51100eb0300d64712eb0389f5f1637df8581f2feb83b43e5cd60792b7fa4db03e94ac8f256ff51bb13e4ab03e9cac8f276ff5f7d81f23d81f45ec0f1efb838888fdf143043b14e471a8128389f04276bc0e3db03949e0f13ed89826b44af4c134797a27e6439b2474ebf8d0e68feafb7ffa7d7850cb96cc12914d1e9e96c589591c99c599e110f5a87a6ac9809a872d7dd4c0c70c6e7f4d11170d491292253036182176fb41a84d1e1b6a9119679f0bf241ac6505d90ff2416c9020d606f9256cb0b16db533a85852aaf64b1aa75493b5486ade4a358d228460534829a4105248292436ea2c3273d245f356ff6ae5e2d2aeefc522b3db1ff425a5bbb7b3bad111788bdb85cceaacd579c4f6c43777aed3b94ddefcb7ffdc3b54f7ddc7c04bb8cce5b66ddbba7b9465f55356b3bd018e6f67d2f1c114fa9d7ba26721a4e6cccf1daa6fe66dc41ae8dd21c630f3e003f587c2cc83ffcdafc1192e017fe6a9092184f03737aceeaf6d6c942ad7e6c6e62fcb46e16bc33831e8587dfbb35ddf7f9f28fb7ec8e6678f37ffd9d839c325b3471b71f6f83d50dfcc1ebf8eb52c663fd632d90d958b84c05155fe3732a825d73e226c6e3e2fadf34364d9f7eb581e5d504b96e9bc3f5f69d204988e0917a83bc6b24382882151f108fe35407e27c8bbf8fe2c66fef0ff9c3e7ece1cee717afceac5a25a72ade634ef2b1e6f45ea43d4ef6da038c9f27205c5c909f36a932df9da176df9bdf8aa9aef5bf340c4b2af6879a9477f6b398d17cbd5ddf13f441f6259ef8ed7f1ee8e67891d0ed7566239f610cbf196af6bf31c2ab91159cce4f12b3c63598fe08dfdac6723ce99077295a5815e1e76872d4db825974cc7f5af76c6a63e0429f47ea2375ffc7ad566407a4713dfdcd928a5be811f9de1a29eb394bd3d90c3251cd74fad5c2e67b852e8a5288c7c8ff4b8a5e089447adc7adc52f0c49e1eb7ef442fc9e4d936282f0c09a26e5f4ea69ea20cd349063feb0e14f73af4c0baf7de5f070f86faf1696ad5fd4e52e0bb89aa1e2965b1871c51cb99a442bb5641a8a8e5ea5294b52674235cfa1ccfed77cb6a1168f2d0afb9fdc409bfe7b4cb27134dc137773e28eedcb7813fc2d4548ae60ee6bafb7f28cfdddddb38f5fe8c42f13649ef75f0607548f682d5d7c1830d0de9f0b0f075e829c3cbaf336d2608d3b54d57f76c2fca76cd72e19299cb62cb68505b355fc3cc25ea5362eae342ed13b58bba56aba5ca0345504b15971efd6bffd4b1263163c64f4ae38913d31112510f1628d3dd7f0e326eb8bba3dc1de55d9b3cfe9d6da32f3d1e35987ea2a9b8fe335d826ba40c6fd935b17dfc1edd7f8817b55ce5ccc21a0d112dea2472469d3fff031a42449d5fbe6650b7ef3ce7e80c2af7de972fa09793a81791e86c7e31e161177b860451e7cf60d0ed3d71986ad3f9fd0853bd3b516ddc999444d1e5db453349891897f672b7ffa8ff58a3d6b86caa1eb7ef5aed21223ed4fed2aea306d32ea6b551bb90bad6454e64564bbea81f616af7234ce57e84a93fc2548a227b87d9dabe6528b1c75bd5a8aa56602271880e6aa9badbb3e61502442d552e66f26c3fa4071c5fb12aa83d137b8817db77ac879e6b3d6e9cc5c16ddbb66ddbb66ddbb66ddbb66ddbb66ddbb66ddbb66ddb7edbb6dfb66ddb3ab1ac3fc254fe11a676932ab7f48037d371e9baa86b3d6e3fc4895aae6a77db9eceee04f2a1d160cf6f9993dc85a96759bad62e2fed9a49483cd159123edcb2b15c6f5a1231efa236ea2fd77b72874a72982a0b0706955bf6e4fcd49335792f71927375265ce4cf46fe2cfbbede7577777777975514e3e0a5afd0e9ea96b59773d9cb965db634f78a6541ed59cbdea8a577bf4c1e672b455dd50ea296de0cef0c5198cfedf45d697fa15d76f54fb5acaa206ab542cc830f6a46b09aff6638abadf9cfa3b931a3df7312d4a313af9b6ce7edba8988a9e54c427ae2531b4c7d4ffc69c2a7791a27b68787dae192a027b6e41b3eea6798824a042dedb169a8244abd21588566993265ea106ba0371463e83e752993767d28b0acb7c5eea66cd93da7badc3b993c8f9a0ac00967fd5f4c85f2428f4388a8e53c5201e884243d7aed3a436f555f164a8fde2cc220be40048d5aaaee64720a3bdca12983d4bbdbbbdddbdddd79a6d8e076ba719d87a294db50a9cfb90f7430e46ef34ab70e04393092aedcda71bb37d8dedded35d7de9b534a5dddcd6d1cfd4da4de5c37d8dd2111125f6d5758a301ef6ebecd917eb7510fe4388e7a4db6db8feac0d65bbb5073a4a16fa8b0098de711cdeacd9d494870b9a5b7e1a086772621a1840e90b8d2b55179dc9994a5074f557567529619009dc04485383c9b1ec05cd9a14693aa07122851a354e3d1430f4654339e76f0708325685020abe1a10c25665240ab3c141d11aa6144c3031610054d333bc891c49782a77007359648a92103b340a1f1f4793d3b2091c5f3aa0756a7541d4a744ac2d05031c8c22951c1ccfbe2c4a6e40ca52e499644124b3f68a2c674841233944ca08492349242c04508256818f51c7925f9614616511091455d9541d56a60022894b61ad47a6719501cf1000a29d6a8ab3bcb80620837a088795e5d75d172af783ddc74e9eab5eab942bd5ac647c8cf1a448aa8a30549462c1d01c4115bdcfe3f228edb3f6651bafd333d2c00897c5004096e7f182ae9daddb4bbbb6f70bbc7edee6eda60a8a4d97ff49f3eb8bfbb192af0e1faeababbfbe6a95089f38634c604d3f081c62d67d24c430cce2de7182c26100209219810e206b77feca1e2f6bf86e0e2f6030171fb991031c5ed7772c3ed7f424b226252d24d687c2e08a2045e0d62ccedef56757c392378a2c8edf7ea085670fb574170b9fddc7321829ca65b8820a97276881c0122073140b071fbebeac71efae2495a438d1f7a2046046acc5645725041a96241920f31f8c1e8f6f7aad65893164a28a9e00a1d341cda1060bcf18317517801ebeeee396e6b21e636eb7677b777d33874e8b9a58a480f4a23f450e6ca1457b4e8b95eede1435208b29ce0a90c30497abec79551f9fdbbfb1a8bc52e7b89f1508f6d57afd78b480b6aa9badeb4295ceceefd9d5755dd7b364a95eb7905e8ef58fcf37694d2efacea6b50475108965a8260bb362b24884ac57871cc7c7a34d0e106b7fbdbe3623af14ece0f92094335af0ec171fb5742dcfeb76226e58083db493a5cf15aaaaa241cc8dceee979164997de8f59a0c451a4415994f6524f1226415eae8b7182028e5b82344c5b5a9004451ab79c493a97f2eadbc5e00f5e05758e183f35538f4c3d0ee4fa136917cf234a93e60f93c9c3bfd3dc3dd123267931aab7da146ff678cd693d5bf851bfbd777da2dcb538adc79fec28f445fd37d5976741d99e2935a1287a509ec537d1b5f4a05028d1695ea339cdc91ea739ed3a753f0a99beb953766deaa0f4d8cc3444b59c4d53bcef97418a48c51545892a346b7beee765b23d7def7696b57df7f3a2d077fb6f9a602e142f5cc414c5094a57e030e6ce3274a8dd227726e1e0a5c9b83e3d8957e7cf51fc2393642ab868f238e5d8941e85c8514bef841e81dcf39e8e8e9ea228d99ea328e19e6605d54b8f46fca5c7a30681b8a84777263dfa33cd42b3b48b4ef931462d7bae5756cfab15e4228ec5297f71985e37c5dfb9e889d2ea605eb1571e3cec7ce1ba58722f65bbf4fbfbfa0335cd0f6ac9462b9adf3ab0fbbe147d71d58354fdb92f2b7f0cdcab762c919e5792139838097a420487ba024dc8fa68be55832b9aef075b5cd174e066691a04699e9be699e63d5442238e9d05e28998284c12991b76cf653fd83fc37db773dc7b98c20f4e1cc3ea24c318882effd2ee277a22222ea2f8da335f9270d072e9a39e2a5d7eee598bf3c72feabde9f247a150ff31ea67e8a447d4033595c1b95cd4731fae40df7b6a9bc8f64c0a2dea91b9f45893555a3b6a174aa9c1b40ba95d9ec6929876d9a4cb607a3c83b2ae54fef6d257da5576acb9b4ab94c2485f2e7fd3daa5a56bac999f377cfe2e62d4b327c9aeb8531fa1680de5a150aa1e696da3355abbdc472cd4d39465a17ede9493f3d38491e0115f06d364e5e724274ed2187489c19a8cf8f9a85d335b4210e3f68a6a3426422273d98dcb7c144583393aeaa315b758d63ea24a33637c2b232a0bf5b3ebe9e9a1a7bba7e336eadd0266fe1af4a17a3db61039aa3ffd7e838a20654ac68a51fbc9694b2ddb8d4bbfdd20a2fa0aaac79807493760390112932b294686c648920d433b35df8f076afe980b088245cc44b8a828c9432de7d3e3886957c7d42e5437b931f350388d7671ab29423ae41332a982597db9acc5a6dad8e4d8e4d45a6bc5b24433e95dfd4c8f0f2d6bf5f382f06e6f66a038396586ef2f65bbe1cf7cced358d68ee7bbe3ab65ed709b63a720d5f0fded16203fc326e1c7e04038d62efe1282a8e57caa329ae79fb1cd647b0c8d7562f90ab56bde5a451598f4c8217fe81531b1148661183e50e72051cbb9145f40e0f259ca68e2072cae5cfe0a6cdbb66ddbb6bd6a73c1c6b19a88ac14e883d103e4eeeedc3747e74f0dde9d3f35d43b7f6a586d4f275bdac4bb3578b7b78ed5e4ef168377fb995f4a94ee4eb106efb2d8af234051a41ce9d19d29333333534a5de9fa768233be64b93d5dcea4fb7f5b8bdb67e4f0d350037d29ac267fbb9fb71363106bf0ae471fc86990e27d0cfae5b8ef5e3d4601737b02f5584394cee7f6bf8ef4d8650fe76c59deb1a54b97aee03233b37f69e5fabb5883df242c926ed33792aa9883864bf9530b7edb281d0dfd33ca06acdcfe707235db87bf644669514a14be35cc28dd0541b1640ff54d5949147eba9f38bf0647d928dd75b1a4dd7397592c6bf0285d99261da36595d8f5ff2e757235f49f4be552b99fcfd1d0b11ba56bd2b1db82cf6b7288723fc270e032566ec9df94eaf05c334ff1a1ee4cddc9bd953bb9e6067cb5c9a1a12e653fbf0e3d30fadb4fd1eaf0b02ed4bb9bfde1548519023fc17066fe78574a94eefa6fc0ca9512a5bb566e99ebf9f86893133697b8e07c7367b32594edbd67de6cc95068e818cff6de770c51b8cc854243c76e2746f144ef3db1f608ae3c863979ca9aeb0f65fbdec4283c608feef57bbf7df7cdb565716de9125dc19d61d7dddd9d75255945dd995405d1e5ff38a98ad9e5073ba98a5812154f97df9b8c0325a1a8f67b2a954aa5288792958ce5963928cff352a9542a954a656957698584a25a36adcce4f127610a2f73fdddaff8cccbcc9f9902df89b27ec5673db2cb98c8b15cbfe23367227e35be19a44ca95caabbbb9bca50dcb6799ee7791e0d3b919d52507d0c99a71e6d6ab59c4f4e93098cc9bf755eadabd5e4be39d113a914aea158a2c43d9367d9cd4f59dc78ebd19632c0e09bb3a57c3376b9634c5c34477984dbc5956166513a9ddc31fdf213f192744b50698aa65baea6f872cb9dcb47a8f77ca0ee36f2160f362a7fd94660b3eae674cc639b0dfc3f1d1b788f9a1eea3dcff3746c505fc70695d3b141dd363a79fc6f72a8a53f4d11e2d87be46c910616a793c9f344634e7eef4f97da2546367f369fe2a896058d0aa227664bc88ab8ee3120aed3a4922a3ded10a500a8e79e85aa2a55c1a7ab1cba2ae793ff0ec7a6f4e83f84873a613c65f2f8f793931e9845533c515b825604d1757f771bae3b939133f918effddd0d77f22fed469fc62a09cc75386a399fae3b214df93e1626c9d30908a08f2c6ac7f8e9b3637b5eadab15b8838f86f9fdb13bedbcb13b2d6b7edf79f92604958f18c90c4e761c7be9d64cfa82491ab8c59f4aedd88183238a42849470cbe954c22d995ff768061e81b9a848522d7b9054e07690c3981aa4c173cc7db2a3b73ad6adf93ceb995e8be5f7ac0664bc210a66c8a340173269c850e9975e49eff633490a30777328dfec4fa9ae92906a5a86624c62be18116121e3a494c4a5261b1ac374f4250bd1139934947a88b8c14a495c6a544687c6301d7df12c4ef444260da5222e7da5654d63c01cddf934ce32c7d39dbf74a467f24c9e71562b6a79e4cef726ad4befe4adca9d3dd218f1cd496934cb1c4f4b697829f2995f71a309098c96a6756c0e314b465e78e624039371e77da82cf264dfbaf8667f1f3f6771e0beebe65ec80a8c7bb6a515eedbd2e72cc8a0d84d9fbdbbbbb9bb4a5bd9dac17cab1fd472e5d4ab32b5b9bf1d338b2ca79b2d895cfe1d8e6845ddb8fc1db8caf9bbd14ba9c8854aa84841e65fcd51cb9516b5a497d30041b8a1f6fb5f6a8f8cf3270aaf723e907da3cd93ab32032c783e0b7c1f3f018597c9d5803d529578f331155550b180d8821460680856547e700a2ccf4554cb4a3dcea53b65f8788aa2ca5c8223463e3ee2d5e54eca572a7f0f754ed737df4aa943b7ccc1d9409d49528cb9e52a87476065a0f4bd3dc739b73d2211a424212a90795ead93cebc9565fecc190957d4243e03bfd9711cd7bd731dfd2f4797522f9756ce7233549dc8b118b5eb4bbbfc68fec89ca4316fd1f756b298ecc67aa48d458e5aba2c76a55d8e65fe5c317f7ad61ecbf3708ebe2c3598ced2b5f6d2467dd4ded62d89e9baae9b39a533293dc407757ecf668bbee7cde813f5bbac47fa4dc91c264aa48516d12f3446c1cc688d7aa146f488225dfa9d3795b5aba44b344687280df48a2ea34bed9a495bc4b44bc8a55fba0c2887885a4e24262a38097ae2c2d387a15d32b42bf5f4679032a55d1fc33e10653b8fefe720f89b05bfb3dfcac71ef1c3a70995709c8802f733df4d4291a65f4aa750723fe3851fc79a5704727ebfe01772dc94eb1cf840ed16c8fd8bd25df013c71e69093c427ff7f37220673d2c3de72d21885abaaceb3aaed3323f0e14125925f008dd538e1ce9b1bb28ddddc49c1ebb6fec69179389d4b38ec90c0be538a21ea6e5cc6aedbb42739172de9dc8443d524ee42c62cfc231b5ec19d1a5b276cd1c8b13f5ac5db369d35937650279e7082e4e673829d576b60fc34fd9796b580bd34c5012eaf15876a471f9b9ec71a15d5c1d47ba079c79b003c399f203a09d37ec2e87e10cf8813db2fb10a2eef8f9359ffa1eaf87417feedbc640c52445d4a756eab7adef333889f3362ad1094704c1f356a2d2f72831654bbea9fadfa3c0ed7bd8efb3dc7796e53f6b2a13b564239aa41ee79d4e527a9cc285f3da63101b6a5957392bb19b850598bfd3e3f7c84a33cc16bf938b9dfd3617d3dcb2f8000c6b9973d471c42563d9714b26a271fc41fcdb47410f53e07e86208e7b4e2cc31b2e7d2b33f4c836d4c0b7859bbf11abdcfccd0360e8e87ed4f64d0100434717004347d7c52d31000c1dc1aadc885dfabbd0e71bdba529f58196428f0dcadc168ff4d853469d3f513507b061fe914d57a727c6982133630e136a4b4b4e02d8420b330be32500368c29ba5b0a1c5780eaee3ae698638e53cfa13cefe6ba9b4688fa48b3b5bde771dbc68965eded4114f72c14ea3b6a25314d66eb34eeb6b51b77dbfae96e3dc7dd3c76b747751cd775bfa46fc7897dd4637f8e15b5f4d9ddb6772ced1259dd73cf6ad2cffd6f449ea55d76360b598185dffd2ca6fe9b61932d3362952eb5a86e1f5ab9522cd0dfe296d0fbd076e15256a8942d5299a18a9472cae54aa1cbfd6cce2fcac610650af75f839cf5aef79d8dd25dafb9eeee58bba6ccc999dfbe89266cdbc424596ac7eebcdb57ebcd56f7f68fe4e4f446ba5bb70541aa5ee4753886e3ba8d7af71c79251972671945495cfb0bbceac5f11161e3066d0cf970061764cc7cb1c6510e64a4e00b0e383ac0bc804711386af9979c302297939cf08113b38614618608d304920faa1768314616242cdae8a291c070018f0d0e3592482046a53ff90a982d37f7eb53500b0e5f6809e3f6371751f06035d1e44d2fb5d4c4525251d28bf273ef5d6f35a29a678bbec71efda6da338aa09674ec51ca0c4c8b82d29ef908beb9b345fc21a6cea7f30b15f2469db3dff99b3771a7e79cf367e9cdf9f3a8afd8e87b8fea0ff50c54c20db5f4bcef9d1c7b5ecc1022dce3d84f38c2a262cf7dcd2a132021b35a528a060d96fae1122b97134b2b979362e5d239a43667f86644b047e619f1871cb19a11a833896674670bee4c5242cc5522e96e4fe48bea3d1135aac72068a58c2e90f24dcb3326ea9183a83cbb350ffeb7e36b97eadec315aa30955b7ae04eeacdcc07ea999c5f39512d11d0f61c59854ae6b3f89a3ccc53c4197ae41fe245e52d65cb9e5a69ca29b7f4a76e65f5999b997b35d3df122c9f1eb4a14525a4fa9ab712c60026c4439cf1014c88c75711e105b09ab752b3c566137f88a92ebc203e79a36e4f435b4a711bd1856ed1076abafd185399b282543388c7dbbc8d28e4bd15584b06157cfa4280a8fd655de588a0f6ff8841dd848cc880073360558c84b1c40c6035cfc30a8545c0aaf0b801ac46ece25f1fa83f17c0df9e636128ee3c28bef064a67183549841adf91d230f1e2af44879bcea9fa05036dbd3e9e27ee31eb421d8bfd9ef39cba4470ad41b0fbb8122cb28134af3334b29f0431a2c331f6ea185c1be40639f883aa8fefd43347ceaf70591053ebda0f8a447ea82acfe139447279d61b41073b71db6a68716f6e0f329fe10534767299ea4472eb925535e8adf397950cb890424be9aa82aef039073996ee1befff302a647a8e4acb486552d99a2110000100041017314002028100c888422b1502820935551f614000b8aac4c70541909a32447619842861063003000040440006666b64d948d99c2ee6b9058bfb721277fdb76a8aa23ca06bd1ca28ae4383c658aa2c382f9d5731134e16eb9b2a16be881c8851291f32ae795747ea773889f33628c4124a05ce9f913a620634d3fb9d8efa89bc55ed8a79d7d49ae9ac05373a588585057542d58fe080c59502b2263c382d3e11956190cbe7af3993f57186786a623872ee3eae928703edb0705da3821166d318771e07fd0381a4133a3cfa14a876c1c364de0bb1c6b5258a7528ff74e1eaf16443ad87d7b3e7ab0169352f892a546e4d1dba496948705811da32c83459927e600a4316836e56e858055070854a457a7e68b4898769ecdcd757421395f2ceb52d9c7ce715a68454a02987d37cee16a835666cae6c731a3bbb4fa4ac7a58f34d2e3ca650fe57d990e32602ab8b0ac0a6154f92c45749ca9df1039f3f7a6b3f68c0407a79742f4e286401ea8318aaed356bb2b8d702956c7e71c6da77a50f3a33ca9270e9e9c9ee718eca48b3cf7485cff54791fef1e0017a677d59e2324901b84a9c2dad0fa2e2c70bc0ab3eef6698d37fedfaf54493e3e10545e6008faa5c9af2bf944d9ca6471361d7b18c9b02bf39d08affe88f258f50a29903c3b2dbda4322e594493ace5780f6f8c232c3a033031a0fb32c063ac04e309e630eb6cf24c070574c78b597fca948d33a219c3c132e65a3cb190dcca8318803717f0d9b81a40f0f5ba509983bffc00a4d2e215fcc8d5345f774764866f3ce0ddd280f1e20d06cf49a59cae5923fd3c43d585711e6c07cb22a50eaa76c6683bf27e40e17fa08b06851640930f894dcd4a52d2e4aee3a491825fb0d36bb0bfc8c247687523843004f7f7eead97d41c6a2183380b62bf464a6735bb0ec460e799a5bbddfe8dc563886b1b0531abfcd01e7e946ecc5d3b34a69ed0eed4d3524733d1483cdf6a9e20ef60c0ab89e53df5b0765dc462edade1e78c66e4635bc28a3d27d5ddcddb9558e8f93fe3ccd390821fbcd4950cbc30db4b80f3a02d7b0462e6c28b2dc1e0800f13a9b5939981936872c00b8b0d23f4be4d674500038990a1e9424984a4c59b68cf6c6ed75d2b4a2e3aab610000a710b5b72140ae4b716e2c543e16bd2ebaf067c665121e5665c9791af2154e886b68b21bfb3a3096e42b75dd53b5f84c476a8836bda30364e2388181918e907073e9ee6fa70b41664030bc26e269ff303f356ae37e70b3925cf3b965fd789c2de95ac118d2b356abaa965fe3e8a2371c6d038738a7aae3c1991f668db81739de981cab52c2e16aaae7eac0d4ca056f0a1be5a8a338aed4c6b7c04752d5e9502f783e9b75d24578ece435f71bd2f862e183b633c8617b7c7826b8c4315077c3fdd652a66710192e2b6c1bc38135ff493c8040395bac1151ef0d0131c33ad09bd314cd1642b3ad8d96d74ee7baa8aa9779bdc4bf8d1f996f9b3f602158398d999d8c194d51bbee7e09cc7f86c22f52ef835f8ab6c0fdf9765e6e8162438aff9b5ddd7a9f6fdb07c3b3713c4e328cc17795b8309f52ca7da0ab9b8f9e5dc7d6af66720e10dcbf8b86983cecf215708f7962d60da6bddf98e64ed4943a08c9667fb5d2e285c7a1e05a84cd70f419fca9b635e9a5acec7892f324c9cf78dca223e8081c400b8c7a3c47f0212c644c1ef18ce9083157b0e519241997712b1dd0ce016f06942fa2ecc976c66c1b5bf3916d35051251402c204c641f629a569421ea276dd79fa51181b063c2eef8937851be4475dfcf5c711034f58fd8fc8f0cf7c7cb82e0d7079209175a9a98b975138b701a953feec8e235cac54e7958010d8a7be3af757d68533d3a6f6ac56221951bdde9cb3c54d9b98a36bd8c36ddfa5adac2996adf829ba6fa4322bd90fc764ea72a455a49c71cd53b5fa70f4855eff6d3dd22731f3037f030859030c7bd12e4199579aa23bcd3063489f83f80fc254593ac73f44c9f43e3f874d290373c4dc3bcf9d2ba47708a7974404d6efa54d97850cb7e691d27561b6e0f4539978c86df43f1f0a8f162278ce4cecaf8a28156dacaf168ea8c9bafe1a52494422491c04cacc616931f4f383d5b1b6580b4662f933d59591005e7b84e789baebd67b7740eb983f1f9fd45d0733a040d067000349d7fbaeb0df024045a3d6fcaf4a1522b292a007798f871a44d4f4807066c6939b0da54b53488af0a8230762f204306b901a63624760e587c66e18a1350a1605a0f3b4f0217faafdddc1d89c3b1c72f17e54e5084fad7c76505e79df0eec1172a44da9b059765148ec80503156fe494ce78a414ce2df401611e042a3e201688559219ad924133e827d3fffb0e91e26f8e4f4117c9dd23156501152900f73c385ba700c7ce7f1eb4d51da9ab441e22ed618ed8dc141ef757ac147fc28fa65cc67cb89d86b9ecd2c0e534ab1f4708f111e795efd0902af1b2d1668f3f02a29a5c86a491ce8000124e92f51dbe6c0f6025db21cdd7ac950cba77a85249dfe2a6c077d559aa5bb044aaab2d9c6eb733a6ea16691851e3890d2bbf9f9c0f0d710c406b88a5375822dadec50b43aedd5d70468584e651b79a3d5b0894fb1ad9f4cac050f4d7cef22935bf4611780e251565be1e2e48bc879126a6c5b25abadf2893fec42c7021d2b6d1a61f95015f987954f55251a3d2d5546c9f638d94573d6880a91e65e3e2c20f73f6094ca74cb0b423aff59481c3c9559a3e33cb9e0c1eee42591ddf9a1a7d56cf233ee7ee3923420d1f2ab64554dd26a425a32e0ef52a42caf8ad5fdc88b065cb3edd34b8ccd78789dea6d05d880720dfa9114d382f6aeb7e09ce49ff140c40708cfe66ec74addab0b6193ada306bcc170e460dd022474d9e854d9fb52ab893dea9168e94f366dd76356e8b769b4747d5dd33bb3778a9b508305f378c1e700e2170eecb04de735db76f6a5ca05663fbf206d9b3b6087492b7e16e7e0a5bc1a46b94c9e292a6509ecc140b63a710efac14844d5cc3820ba9f9eaf2996d05582b669a35a390dcd2ead4928f035cde7722cd1388aa40cc329825fdaf122883bf1ef8ea630112045fd72ac455e4a65382c2f5f5eed77b4dda3d6b8921f0315710d6f8e9e225421153dc546f650f5d690acda7f1e9aa7683625b2e9bb70875626f09a402e924fa337879c33c960660e9549e429346ea142a068ac9fc104b187fa17fffe3705a61843bee01cd7942e031198cb9cfc15170d3bcb01fd8fb5b6af68d361484679ec4c0d86661510720f539297f2de2207cc38c8605f230a5e62cded7b7d2911ca355671e4feb6412de2d62bc2536ddf0e819bd423265b13639e18d570b36b27d81257d45e807ae1f286bd4625ac5b1fd2fcc409f80461aee224cfcbdbc7a5e4a7f2b9b95832821071f86d1e1d3fa4b0431009b07ed03570cfcdc7b5caf7886174cea044771ba87304ae9ef1896becdd14229d44fa11cd7d128f18f6ea928347d9d4d358ffb0e844b090f3cf51e38e4cc2ab03bdae0fffeab3e562f394f64b1104006fcac6af72b9ef63451ee0e5b283722752d7ccdb51e9895406a07b327b264dc1af7e6cc62566b2aa7b4b3294d2bde26363f74a9e6d0bb532b7f880fde66696068ec36d7cf6c7bbf9a3d6de38faef131eebe1a8fcfc7cdf738fb343ebe1f97cfe3ecdb38f83c6ebe8fdb77e3e1fbb8f93c7e1f8d83dff5b9981b7cc6f75d1dcb8393eac7c031403063d0ce0892b13241a73ccf14d0cfd2efec9a0fc711ff7dadc077dd67e38a9fbe5ee0bbeeabf1f17d9ce6cf6b0e5c97b88fd4302e717bae011d5069757649b51935d9537251a9b3fa76aebfc524854d57336c68b86a32676545e1192b3743ea17b9157afa40641a514d5bea8852a48a72b8ff3cc32ff6abdffebaad95d004ca0f76cdc7bdc9824b9d44f93ada15798f45e9b2d48832817a34f6ff4704529d50aa92a7729cc17472a94c9eea08f0f6fc6a9738d525e23ba9687ae3f3d14c10cee7d216efd83c0f64f3fc38be113ae21307c121726a679538640f58969e238b2022b099e35dfde7520b8a2435bc12bae29375eb38d80415537f55d0978c31b5e0bb369e2899ae8c6d0d5b5ac10ada047cf93d689d7eb24759f92ff075baa469c475034dae04748f360a2b826ccbb26e23e49a7453ef155fe0bc2aab7e6c94e27d26475dc53f6d579b543ba6cc1316a714b46bb3e6e8959f381969ea0dc46fe9a53a7412cd70edf80525c512eb2449d6d22feb98b1e3a1f9ceebf6aab876019a8602617449fa4bac05a53b945f3c9f1c0b99436050825ba9fda93b196e0139b5501f674e1928ec62d1bd5bf10c19278bc0fdfeb067c3ece8ea9bbeddf172cb7ab77fe30413a5dd156eaee89672e322bd361b8cd4d97987f43744072a545d06e5b324f303a4ad6b23ad9bed323088a63caf637140d5cb094b6c35ba2753fa93c9a4c3b21ccc32b818b2c3493d80fe16e48913af070e69def1a3c54ab1a5df643f8e105a5007795d582105205625264c9aa53deb6ac46c65462b8ec2d445ac2bb880df6a9fa83cf49b677b90ccc721a0565ce08c5c698973d31abf76ad4a01d89ddf7d5137d3173bfd386744e27adf78a9e8660b68c0638f89864ea9c6538fb70d1b7b840cd991523807754146dd09101dd21fad2bfffa100d5305ae676279a36c0538849c3d81d3e467c02ea2f803052634b06bdf60c247a0fc696decfb373805095a5bb4dd8098d654ca5a7bdd2b191a5764a72d0267cb91083a960a87afb8d06f8b4b089480b21a15d4441dcdcd90f3951a7ad2c0b8b3b26d60a41270bba4164d26287438cda0ba1bd83d1deda30ee3e474c70813ef4b8944db7b53f88410674e41aec8fd7a06c3b9fb8eb4c5fe970c73ad694a837ff7173a3a8a7ecec1662e614b0653cc97efafa486f25ade2aced3c2ab1e2fbf04e69bdc2229f03af60208ad80c8a136ae5578f082beeee21cd6a0e82d7f87b790e206d94784f74a7072f421b5c43a880f0727ef13a580c04c72702f3ba26ccc1150d15b891ecc10a92c409c5453d236a7a2978e9780f894d0cedb528ed58e6f4193c1112f7d012798c205bbfbb065cde929b367324dc491009cb3b2edb9dea31f6ebd9f7099bf8fc9a780eea243943e3ed47e2562ea355801222d297a9897ea8b74913ba009052b120c09581243bceb6e15783527669cef9b308a09a3d32e2f4c944de92f01a175641d3e355ab09d76054ebbe7fd0cee79be2949c40602ccd08318bbacedb81ba6b33d65c9a22df735f2dec86c4cf96b808615288a62fc130796beb7a84e6272c3816fe7fc632d8aa29e051337332400c5cf453a206734151f83f9ff2c09c6d3b908f74205d4928a35b777b4960993f4688d2567678c6b4d5860d3cbbde6d01a8c749a2a2351fca5559cc250165cc29fcdbc65779583cb9557fe560a4e044127b5906345f34dedd865a6a89f6360f4fe364c5e2135c5e2315a374ea55863fd21a82e0a2363fd990a2f3d9aaa44ab6f325d25e96700ae41f0ffcacd382ad1c6043fa19153a286647c02d4c892fa8c5636b2acdc9f94ca7d86ff160b28b112248bc95292861679348c4392f5ba76afa2bdcb25506d705ae1eb94b6585aca22fc75488233fc06f525cf0306dd201593da93ec42d416ca7762d5a23c1a6b55f83a2a8e369124e3bf491a80ba4c2f4e09a68f6c9d691f1f6ea8a9cad3aa118dbbea5ebbdaa77d0429314c60bf3d2cc766f9b6db3ea2579c2ff5dc1d4ff96b73a6dbdaad7b9f43dd3319dad855dde51f8585822696afcdc1022b821d584aff527ded7f878e6efa5c58f08d02a811b8e4ed964263ab5a8c73cb85b4fdb006546bfd2a7bfac87c3761ad52679935fef6313f61223fccfa8d21f27aa575a6a9062f51aef575753bcca8277a920d0abd3a8cf895bcea0279e083352dea5be116dccabd29e9f9dd47dff6b43050c0858e6f198358ebfe7b6f738a9edec4edefc4636fdaa6b68d35c1dc2a06b5b2234bde35eba58186c7748df5b8d3534112dee157dc9063d0d0902317139285c9027edb4d9e45912a3dc9be6ea6843914849c49c37c85219e1a61c39de05bf8b0b530bd6fe888b45fa4bda7010eeceb8597688c22ca4f9e7b6c5c3396b83c386368a9423a14acc604dd1c425df08f63e840c2f3401cb9a0f10b4560621cc58455d85a3eb21b0a6e6054ce9e15f8847a762447465c2e8dcdd0430d0e8b291a4938bfb60090646ae71fd67c8dcffccea40f49d236331616194990d32d22a96f422922543f1f90edad5f7fabaedd5f4382ffc59061304281e0f5441462fc5ea0b75951f35ef99440cbbb09a4a00d3b9833c441a1bd9f53f8b15c3fd8bf9bac179eea1243cc5d02d97618a46739c8c14390bae5b492751605af761dc3a0968eb1d15cda83899926a09fc771fa7541712304c8c61c82b68a59758855a9ca3eeecdba167f67ba3f07bfdfdf667f5103b8d33307cf955457d34a02c3c306f872e235702ca1f04bf093134861289f28217c013a656a13f8755024f262b5b707eb24be39d870a277c71b271b9475d6c9398c74085f96ec160c173c5533cedf27465e59f9fad8a16efaf3209feb32eb822f6e3eb012813f076a1d0f59b2b6f9feb995b039c856d824f3b1e90ed5cb71143493722b02b60e69aaa8e73d618dc3f6708ce70dfa4e658be1ed8370c13743262f7abf68096e681a083eebf9430eeff5a7ec0f24fdc39866c2302350158340da4e5e16e3a65a9bbeb04cd2f77273b0caae511cfac8af52d9bd818d70e17acc82dae204b44a78a523ac5bbe34cd6675fc67e111fc23b44bcc320c19f05ecfa0c18995c42d1e895a38da644bbb7e0e4a96fde84b57f84e4637ffc006afcf55ef45dde6cdafce1af866a8bdd668b782e2704051129045c22c7019b0fa4030847dc7f56583f294e141c0c16f12d69e538e0e4660618fccef68f2729e5876e2d02790c6c0e0b801e0a181583b4c2e7736d6d74b872ad80a426bd839475b1b049cfdbfe13a8655192494f2c5bd1c025bd5da89902d49f000374cca5501982165432526ae8ce4792ae5dabf65b02ddb2d6506543b9ce2fb0c108c1008951b43c9ebde834067d093543c4aec981f3e88e53134288824786dbfcbe0444560714a4a877a74604311be8fb9afc3a2e6dbd153d3e94b774974e9d59313ce3c16d9971b6d097d3b062476f70f8b9ad1940879c97323a1933828650de83b06d75ce57fd7c5784ccc7328aee744731d7bc380dd8bd2ac20234f71c70ca2c8dccd74fa9a875e42befab1ce132dedb4386489cbec315a551ff211da9eb356be94349baa72c038371bf50ff7b264c0971e44a83ff5485c096245a8417fa5959a9b141b454a334b787d8229e6905788a37d26ac0e862f4b97b422087b6bcac65a9fa8802abde88229af2e612b04942fdaa802eebf472757ec86bc8acab76974dcc3ca1f6553d49af81367653eba28298763250ffa0b586a44387c3ec10ad48da3634b8ef29472b20a5ffeaeefd2895e41ed97cbf0704506da4c7739240f6d87512d6611779980dd07e74374b46e4993d4f33abad0bcbef36feecb804fbe20ba32c0020c2188c25d939a8ee4232bd13a3e3719b82d72a56a5bec35aebbab88676320501a399f4409ada8c8ce4ec37967c2f5bdab49b0e57b4e3a2887b74045ec73f72144a1ce3125bb570ab8cfd71a605dbf77240d08705677c4940820502751f752fa5aaf0b2241b0f0fbb0b8acae5bf4320fde3a93457fc5217aca0db90f5139e547d3d610712cbd6ce47eb207bdeba614fe8a9c1f212c8a1c2bdbd8d4b835fb12a80b41753ad724461aaabc0790896397e56ff36cc94a3e607abb695e516aae75604b34ac498774da1dbd559f9a1bd91054238e64c729c409f5fdd49c029bb9c01fb76dfc1d8b6307d2a277390e493fdd90211bc141897d534b6122a4efe3fc243361269a4090f98ba74832665832c0941560bf904e3aaac6dfd2acb6935e07cd42ac55e3e9923c30680bf42d15c2b15fb161a7a5301ec3b0bc1fa6141c392a6da260496d0e8ad8de6d5c8211c6e0bdfe6b85622e03602c26228be45bdaddd23995a4df361e8170ff33cf749d884e38866947c076ee7498a86bc4a55fad1fc339a11725788e3823c0ef524cfdf12502fa501c851ec8fd97a8e768134ee30886cec1d14aa3aff70da50edcd4b32893a994990b1d449e15b6bb8c8f9dca8657a624c30d678f946799e4bb3983200cea73dc5cf19d11a969103b0b24cae67aac398e40cca5acabed5853162726c3aa7e34986a4486df3d5a67d85fbf3849bc7750ffaab625ca22f27b73960a329534cd60dd3a0cba2620c2fa3f09967af8075ef5e4c0f257978f0a2f5963dc185a5ea91d4b31addc99baca637b41ae864edb6377295f3aa0d07b46722d38e8db3beec33507542c2ae3ccc4024626d55cded18e0a96733c903a2c084876309e3f00fc307723f4731d187c4569dfee2c5a0f0fdbb871690758443f5ebc363203f5427c45e5448f779321888ad8687a907df97082551aef75bc436d6e9bfc53293219c025f5671fd1af0455f004e68d7701ac7873de392a9c1aa8ad089533d831ad66312e1259bae1e368d3d1703c764d285b9310c40c88f1274456bf641fb3d996ad65919d77c1b90be006e6e18bee4dcb1ae2ef31c39980ec9e25c6b3bec4460be86b9bcc1bc0a476f67ead41deac318515c561c3b1b7f812fa5548a3fbbe8878625a21df4f26a759a2dbf5f2962adc7b9074c28e796fef72f5e069886d9bfdeab2da21a7e084fb043a77d526e6485c6e2f56c75d2fefbd925803b8b37dfbb08a3088800b5b245b9ecb320f775df47356c466f9ef2989c7ed03b626e3f35b1f2c01117892aced75e87e8e965527cd0a9507e33a2f388060f78fa47a929e7441b8eb1fa4fecb63bcadb881d08019ea9f69ccb5073d93976f1f2fb39c1f3e64ef5bc2e5235657f9ad6714b99ee19afd4ede4dbbae769ea84b4da014e78c677d8d6fd98d45250aad594564a6bd83173318d81a8c82374deb7b86d87e05f638d2c3b18f574f4f9093fdabe5d3042f7e439055f7441a6a8096f2ba6cd8279d8960eb7c3461f7e190a4e6adb3392c5a438f565ece17a78e71d247bf17bb5e46e64db1044b24f70d89cbb4b2a4104f1689d957b7379df4d3252a94363418712e7593a1b604ccbc1b9b4f9475a56402b92df41652c6280d3714f63fe6c84a63e13e859447cf1f7a83efc16e20438f19ae14ff580ec736aed6c9f9b784ef3d9c79e2c9ec501f91e70f87f262158f7b703594b3b1a4df0539c0bebeecd0caa13b3a1ca791eeca163a45327579c1ee534cd06869bdd10442d11c82d6c311af7968e1dbbdc2926840bad24e9362c5c74755eb74c1efaa6d84bb1a90805d0c5aa6b63c6ffbeca8e17757a075d9725e36976756a60931f852f8b2328909dd9c740a0cd3c1305a0c42627319610ac1535a4685ee0c7825e9087218dde845b10016fa5b025bbb0217a68bb5e10342bc246e988bafb872b144d962c91ced19e7672b1ec424813e8b09c85025f0ad5115519607530ed757dfc5089f33f419d8f5d63514df6cfc51335bdabb604ed1eb29ebbf5d5de54f3975984efd820b1a1b818a4e5385c7bceafc4ab0fd1ab703cbe71d85a577c7fcf711310bfe4bfa997ceb5d20080ffb3ef312d71620c4b3a274b23a22c0f105db0a32fa0070fee82826f731505d8ef7d39434130fb961d12dac19f5fd340833e6fec8963b051da5e77ca6b128e4e905443f34547d1a407bea6997e253ab33fda64a263e23b23f01e6a9904eedc0eedfcdeff73cfd8b64ec21b72f69e31c9ec6e0549cfdaa0e99b6644c51d45954a9666ffea4cd3ec67b3baffb9198c6676592691408bf311a9072ebc4b05e5ff0e3c7aae3489b036e9ab25bee8842f16273342d04a3b4858605d637de58573caf981dbf5dde16cb767018ee493a12359a367f0fa5bb15bb556621492aeb5fe1c0ccd5fe4d30ff2f9e3350f82d93d454197a6c01735bb8b0ce83a73628a521a1588bfcc3cf495ec610858ebb9cb54f9f0b6a067a079859b506da6402d30e9689346a2890fcf8913f4acee76ff7ea862950f9a031583870b435030657e2bc0ef13292ef27b86c8a98418feb1451b7ba35ac788f6d1298789b6881a5b175541d1598833dfa98b41345759993978d478e9f9c3fe39aa84e3386877f79b5006e5eb8e9a2407fc45ddddc8e261508066c4b1fdaa44820f1f9540fcc4a66c1ec328a252863b039350465684680d0055493a3fcd104e1404558dcc944003bb1130d79e1bfb0a8f65e1308339b0f539520e9a05dd86b8525c0afb586709589ae10caf6a68a73de07ad284358b2022510c1b6cddd14980d53d7eb71b4593d2d09201c92bf56e15f9bceb9cbb847891c2f4d9945a5e7483eb583b70047cea2933db3beb2365149e1fe14acb61b43f3510b14c012c2630d18823bfe9345a45290dcb901cf9c0ba2143d3beb7c929710a3a02202f304d40c26cd4bb619c519e43534f2032e6d16bd9d821c5e0a275b1c4315b93faeb80ef5bf08499fdc0dc4a41fdbe704357f2c371f7fdc05928c8de11e31c50c6af2859f488b88d5f9286839224e7e930ac439a40afb21e323df0c07a003fdfd4d74963149a19cdf92d31561d1c46482c0cbfc8588a886119c60bfb1cc94862f70166a03d3ad3288e9fd04cb1b22ecb065e6fa8c1303834272334985076e2dc1af3d1a31b25f330f3c6838a11920113f3ec20cf5af0aa63ebc63c9a6d21259d333b3a150fa0a6ee39fc5181895612388d0bfb7a01bf0e24da0b0393b08c61a13911db27c2fe4d17c78ee26f4bc007a86e94a1886edc902ee07f4cbf017e3bc5927cff4e4316673a46794e992adfe00fa1743cb90f38a409d82c7c062e25249c26c8c5ab32670c5b79e89666ccaa123346cf62f208687686566434d7779a28674039560ef5ae79b09aadc4250bcea899adc1af1846c7088a4dc94ca3a3e0490c0d8275971cb64710c72eebe266a7b779069fcd078708e6ffd1a12ce691fb981d2e75129027da921ce92ea0bbe5b146ebf1f3f11312e54c2df1de625a2b1bdddb1f0b6729956a185b3ed72287bafa9b96e6e5cd3dcb1bfebbe9a321bf8006d3a86d1daa4514756d6626afb0b3df9a5bd85225bba8b0579f53c5d73367deff12238ab4e445164e37891d0af83690c67f78d90d44ca7ce1ccde0cad0d08fcfefb7b013df089ce43c006451b955c2259ddaedf6809492b5c99cd5893e6b220428cbecd74e89b6273ee74eadf682fd546992f97f49a0f031196890b5513c72521850277e7c091d708423ed18c528b0aa1c6941d151160516e7a69fcafff5ee58059cf668749891804388114751afd95d61423f62e19045c78d6467ac036babc9aed214d9be9ed565475d0562a581db0f6d9d18cebf9cd0d845f598023280cd96a81545df7852f85c24a8354d2b90ba707e2c524030ba8d0ffdc370eece9caf793a20689a1e77adf7b81a6ca66c902a18f1e9577df1e28a588ace6ba46738ad97f83d0da1b11c190a53414dfc3403b9fd2b37c12337fc11fbd35d729a959eb65bfaf1009f3d4191eef08a65c440a1d990bc8aeacbdaac7a2b409fb572da886a22176f125a8fdf010ee59732c6f74734fa6c11563c7deb1b72aff3903c5f8db613de4705990478a5c70881c5b91e030f30abede23e70fcb0eef078ad3b8d91786a826afccc04c4056ffaa81c5bef0d165722b1e73852306681953ec568c82d395f6c56486d244cb38c758cd92a9a9125153eb8859fcf2672db1122b900cb81b13235e59e48e7f9d4c54bb648ad54256504bcb3571379b024332dcc85a9a336aea106ef67ad5e83970f0c94024d49d47256e17c59df2bba9bc9207d54999cf467fac67e8baea6855fedd933b8a45c8ce6580ead5c0d15f305c591286f4f8bb0ce6d6dac0b3d1f1042ffe2b76ef8deb491e9e975b604175a3f408025bc3c1377689fc1ebbf2f1a84547cb551b522c068f16d8f58246d15cd28bac7e7f0ab6d81f8c9ac0af2937027a3bd591a0145acca04eb799cb50c9037935a43b535f94c4568d1990d8f553bccb80c25f75a3ddd7e05dee4af0c53c412d8e4d5a6f559d2fd45264a6222fb6fa117311bcd468e3d0fe8e061b10b81301487f3ba9efe5f02125d1f06d2aa478b090752d38a29c7126388fcf82ac3d3fc2cca85014e371d7995d700ca650f5560ed7b500ef38d714691d5055dcb71665e8c9583a28d11b97c8ca4c3e88d9237cfa9e10c9b693a8f32c66d107cd4315809ab3d783c9f1b369bd2dcd10e70534f58aeb28deb85d4eb6b5f23d3a09b3e262e445235a1406df4ac09aeedade28856ea6ebfd110aebb3de325bce59b90de3517cb62a216ac1359485d9af6a09523bc4c2353a0f053f091cf75d240f3f43ab17600828e1f1234c82964168b33387d93a237cafa1d5c200fc4d3c8067df1e0f67eec208a0a7708e3edb37a48dc7b3424d084d58805659313944d920f26087eddcd95f2e93e072fbe82dcea4117d2bb6f49f0a0d8bf641113011c08f590c2c8ad079c603050f54f73d906531b2875a2164fb1df039a5400f8f5e2d9320dbc39e1e10d9386ca487a2e1f106c17112cbb2c1aceaa707e3f026c872fd84bf1c55d4a817754fb0c0ca357a2d42eb7447f8ccf783f447d8104469541b76557087e84e99dfeff4f22d279cac23139d8618422a60a1b12118b19dc6cfe65e0b47379ddde2fa88a6d0a66e2b2ec26eb26e162df66c0670073f4262b95fafe612c01fd974abdc5848722539e79dd1cd8c7e354f2bac64a4182b926efd6b094bb3bcd08612ec6d3f79429b69b65cf04aa5c53e75c086b1e56a16c104fc1d15cc0291b92a158269019e8b92ffe2ae35cc590022fd5d3107d427c2ff341d653e7371c0453faad52d2a35b88838695aac1243cf2e01daeedc3e321c850fa3ab9b5f18440fae7cbbb2c63864dd2138673c25fb6c7c3218662a16c932245104e76a589fc9024d4ce40199bf53284b5c3ce1b9a2d21f5ae1a265ba772f4e3094b200497b42a2c2709c19074741638a11580e156f2e7a12ef9e12479d6c1317bf5728589be7f7374360620d534fbb0bb34620abe60752acb6cc0a03554a5c702b1959dd2fb19194213ff80f2bb3cd89189afb8d53bc7ea4533d1558ab62d0c5ce070ab72429d19f8890ae6bcc5c58a5b6eb519aef08f107c14bfd05d2221cb1bf3b4008fe661dc95e9c5c831b6497d76860d4b67fc789da11e6e6f46f5fa593c04d445475b3e7e397c4c06150133f139a6e4d6dd95ed164bd6aec5da31ffe8756856714a3b200215bc7c21b2343dc7ba5357fdb508afca45c79e47b37f07c3ffd478ce4c73b217f8de49c67f9ce97ac97f2c86b12df00c41f258640fcea69d4135406c02c4c3de8b05e91d079c73357111c20f72b60c908b384dab724a611ae3d9935304f66c1bd00a59e83a682c741d24cbb993681c9cbd2c9e1c2e31096428befbb7a0dcbf913dddac027637ae2da81e4fd394fd6abc5ecb5dbeb832bdaff5b52dc4c0814782515c5680f60c410581cc0869b5b45b8bac4a4fdf8827143daf777d6a4ea6530c9a699bce3dcac5d24c19e405556e04100d28247a1a15640ebe0b8cc7585da89c666406a9ffbe3ed340e630eeb52980d7810758041117ae137095bd0d1906f45a00c05c2ad7b24cdc767b625349217333fd53cfef851808ed3c5b9e4187370ce8657201750634f5240421f9022531a072d819721414ab625e430ce814005dd15e31f9babbcb6a7b5302a66c06b461241d7176b89885ecb4248d65b6d981c82b16cd01c50bb4abad4907abc9333700524a9db219d0b2ac02bd86d15a592aa06bb41cc48348fd4ba8e588b64019d3db01c0d6269dbe43844a651f933d21da9980761dee901118ac23f797727f6d5dc2bee0bfa8306295c1991e97cf42266883060aee706fbbede3e75c8b8161ae6e251ce146501e8aedd7dcdcc4ab5a7bf6f9ad178ea9526c2fa3b755332155abe523fa6f445f6b79d4b74a2dd9ecb68a3ee0b1198127262bbf889a71f98e630e33f970512486f31d9f4815957c2855b6be09db6fc11cd74a320f37494c081dd601b67b4a4a2b876da0af150a3e473194f5f5ae63a0a06d41bc2b7cf3c601b83fc97d2494c8a08f7df56f0512f7f649c1a6e6773e7a49aa000ff2b8a0aa937233593bfe0054894dd34fa3000c3bf3ac97fce66054e4ab4b7cd5048fc38f9e769cf68a87e7ba1f285e7573232f765942831c34f1b84003f2943e8487b66f11d6795cbf0c6ed307233bef4708087438eb6143ae4acc5c698d2fb96dc08dda7737ae7208aa699795368a7d50eaf4b63710b5dab95719d2940c3a3e4e3b43cf1690c0946ce196907f637ad6c42804086b0b1aa946f23e79a66b434495741c26b1a1dae85020bae8b6eed9098ce31fd6be90ce5b2f3b98724c23fcb867ffec83d7bdfce2439a2cf85849f4d92330f038867d8b78bc1363e45603eb0be23afc3a97404e76d67744b89aa00a1bdb03f9dd9a7f6bc49366c1fbcb29e993f9d6db0cad1475d6d35d206f9df4b7ce71587ea996e9fbb883c0f063861dba6e7274c9dcc16d706459b180c17eb88c89208321c0e56b50885baec68cdc8304b9d847c4404cddd202b35420cfb358f211050ccf4fdb2600df0c5f2117f1c2707eef55731b1ad1421bb5cd20541b0ed16a68daa615c013e5fa7dad91060f8eb688622ccdb7906b7b11d191d4aaedab082803043d3135ca1a7a35b49498ed9d527ce1a05a75661e4c7bee9d24fab255fa71cb9fd2528084311232b61bffadd5b04f5a4c0b025b437da6ef1f7407ba3790b986d991b31f3e1a1db9959479d6a8d700cb9257e62b5b8e98dbf989219e421f9a40798ed88e67585a0127eb72280df844aa9607ff44991d3649fa731704de8dd05f6a4e060e1d321c82e20e88904b63424729a66b1a54df98c10514ef3b5036af547beab3e372268890d01555f385879bef1c58f00b5cf8f9865062cf0ae2fd5ca10df992fa4a98e704ac4e5776ed4203658d89aca2f446594b52bdbf923e88e6c9017d7e83ec7fb757c58e4fe9512b5017c075fae4a30d95ef1f336e13f1b961b9213bc92b20f04a91178db6b6a8d558e4f55b3aa7aac671e9cd46b947e4a4c63f20027e89b6a4a3e2d028c6af5ddbba823af35a180a05e291f7703734947f824730ceb53c288a540fda1c16349747e64786bec371106b2d6ccc5b0dbc8245f6e8dd4b75d42be8631ed1b75670ba532d39ff3be09e3f43e96d70c197d947e1b26a25e691e1c2b3086853c574113aacd096d66e11c6c446f9f833a66f7fc59952d5c119f4500a42d366f6527c5cbeb04fe7d4b0cc7374d10179cfd708a9176d31e1335f1e5bc8f5a2d72b3fb7173159650cb005642a5fc756d2a8e37c5937b383957fdc4efe7827157f9c1f238504e9a5c2f61d9b558840eaaaa7618798ed73be174776200f4b5210f1a48fc60b325944f2656b1d8c6f81eef4d63070a425fe6a4721f8d775674fb14d0f0a117e0a9006c2bddb25b63e44dbf9cf045b582dc5a9f67250820d2b32442c6c0c71c25f7d68ae25774aa11909f582d4e2448b5e0eedb89c1f9013f6d1a1b84123fe0378df2b0a889a1344d667faadd623ee98be2fcfc7d61987bdfcdfcc46377ca761d255bc092b892aa51252a4a1e4a0a076a7cdf19a4389c25d3b8e291fa5951bed1ca838cad64eda7044d3505c5d6be27841a3bc72fb3e340b6585734d1ca034ca552e9a734cd1283ab73ac87ecd8a048a65fb9ec243deab8d7f62c02347f82d69e1fb6adf51fc4529acdd89db35772abf20a46bb773b3f695f2574d89b5743d303e21e82ac3b0be578dc47380835b6dbf4c069dd088adc6853abfac96133462d738a1e62f268bd8afcfd4fc62c65ac1a759eeb73fc29a2c729ffd01d62c994da5a9133f16b827eed58bffa1eb0f383104e24399204c597e2d250b5395d720cefe60e70ef5bdb0e238b40084fe1293ce10d44d3673b8f8fe9f472402de0729f6c5324321484d5a98fe364d5b8b7a64f270b471545602c172d952206634c09060fe1dcf8cc80e6e70961e210598fd80bcccd0049c305dc37c30550eccd5b2193a02f5839df62400ce364bae899662fa4655deaaf1e5548da00ec7f1df68dba8430afbe1cd5b91960812d07a167560ad7ed969e2637925f21c607642866b6fe9485b4b0129b38aaa3ee2e618e8185ddfff2e0898fda04292e58cf978897c16442630ba13b168faf2c6dbaf315e410044ba0101acb7ab00de91bba4a7a6aa1076513252a2a90740144e720694252699c36befe376a23516f31ab2780469a806653fbfa831acd224c5427fc8907004ffd9525afe90649ad1a7654c6c9513cb17df93d1776f28da19a98e0016b09306c4dc0368bbd3b72153a9c4668bbf6c5f403d91d0843cbae696e130c52265875bbf5698060097a613c97440197c68ff60855ff0d0d723de086fdcbac4c673635343ef05ef28d77fdc29c0de59c1509f92edf2457b22269e3ce2bd3c584ef0da176fd006500bbbed11d7cea45d5a884072ab310af211361ad7c6756d049155aac8a54ceec573c3858d0401cf9dae33062d4891689b8dd72cdd00210468dd0f3dd1e3f7772e8032f5c7339c9926bcd577397255366391315bf087ebd47f1bc14cea91fb004572d11f7f1fc96d44ba5b1d76ad2b0ad7dd43c2d3807e1943a331d9c46db5aba8f8920c77a52a487ba15cff5b19db71a8173c0dc56e99f22224d0a57e4333a187684e61ac177ff4c9f3d3ad97eb7c20ce328835a420cf6e3f824a3b55b73066848b696c535f4be21844237d39de43c6c5dc02369506cad7da6a78e68f6c8a351115e20a2c5e26158d684c3380671d092ee7a5fc47591a59e5059f28c4d0793661f92d513b167fb88e70e3800466bfa12fe88a91ea93cc5f1fafe0680348643eaec33e25d236e92b13e157b8ad7f1c56f471cedd6dc626e46abae15207db43bde42a4807dd0899dd38ce772c4e1629538202b5f38ffe8b4e9cd8afe42898eb15aedfec9bdac65d40928cd00f7b37fc184bf5b857218807ad5434dc21b48c980490df7c056257004dc18221891b03604080f96561b2df0078e382edd7c2c8d647eb4d33e496ba6f5b8b7456c786e4ca959266b69d3eee3c6090966ee5f9150b5cf56c221705bf57f90e3482c6ccc93c21076cb123f46c7c7765285b072787b32fdaf354520e90d136a66bb41f89c60d91eb111ff9ca39e4a48bbdb6f17935c7cb506be31b5628f6a044953c4527b41f44df453d6d1a18a450d0b4321ef3d627f9c983755741fba1aacb7a7e40d308d3ab7b605d5de2d3f6ce8e66d1445e2500da549ea4743a2682a3a5fde56c1485e19c1cbcec3c7fb5d95936dc2805cb3d6c38570827b3889e7ef62e322f8a622234c2b083fa264b680f6a488a5e1e7c483db12cbb6736e65046b7c93fa94c3f2b88ee909497a51999d43e54732e7fe9359e0b41f1cf1200b9ce0e2913e9c63d6a6d78103954c23b8400310980dbf6c9272a87304799a0129a8da23622f170271bdc832f210ce4f289b905c6fa8bd26eeaa3c5e202185d78fd9da6debc5ce45bd3c7c3683b70f3682a82a909b2eb279209667cffdca4b1d4dbc41312b93031db52b9e352d9444a43205c9e1704344a031eeb4113790466d522a3d6c8283d7fc25ecb7887aed4df6c7e9c1a56225c134db2d04655195f65629a169a0d00f637ecf9d834e6f47af2d51b0fa0f46a1e2622e6f4f08a9cc47fd44dad10003d267370a64ba47cf186577b43c908aac18e3d11d2ba931b4f68aab77d8d2925640bb034a0d915acc87fec9d8d1bced73129eb6a91514a75e10334cca42b23f54e5d9a7f3118de94710caf5dd1c335226ab2b45bef6dd88b7555841bbe902f259814fb7d798c08e6e38fb14a76eb44881c9c03a1003e8f3d8f48af3620e8f0faa73885fbdf02ba76f28390869d9dca13ff9e2c9f6ff0b52b6523381a43c1129348757fedd3b197ade5910e5cc956c8acd75891fdc4b2c59deef4999cf8138974fe88a0ada849923a53fd89c114aabf50c64fc38a9d205083a0b117bf176608e59837b7acee57a9edd0c0c816119959354b26fff0adf7207c781414cd6a75b372b3141ec75c7c7b1fef0f12bac7c0a75482b66adc9af8cabc880ff3724c91f8f48e912e05bd7d1743271398005d739e3378e8c13f22e2da4715ffb1059926c7cc454623092821892be6b31a75bbd5ff5d84e353b02506440675a8eb22ffd2d2bc70f1b8ca0bb8e2623e1560365eb46d9ce19ba4076819424af6fae303e49eeb65440eb6a81cb6319626703ff119f368b703e34ea6a1a49baabdc7dccea78bb66e2df7e28c06413954f4a0d7a54fe7b8f92dcc6c963e2bdb7bcb079e6c3f4af38397320d94fbe4152ca835ea3c97bce2cc6ae494651ac1a9d6708f21a7b827770d1671f1e90cd9c128cec297f93923139f3918adaa4e84b901e7b419f8a62a47da46122996180a8ecff9524f0bb375402169ca7e56d6c37c692e55d07270a56fd8bf785489b940e0712a0d0c142dfb48e926a4b36d813e654101443ac8d895831bbca3f86732e066edce750cc0b70ff25b69b307339acd9227ef3de9185b184b25708f4653d334513f0b773677521db9845f05d76be48be4f3476f6a64c1e67f6633e47ae7d85966512fa25c43a6ea7a22b3484db6badbcba4c725804e962a2cabe8e392e4ef8b4f021d8395cd2f036e0a96721885dd7982d995666a89c411d837b35568a1c465a84d47cd8189a67dcc49c8685c8294001939160b33f021e4cc6a13d104bca760f9eafaaa4f8e5bf52fcf85a605832c0fa7d73e46bb2c659ef48762757f466216ebc2665cb8a55f27edd36a162748dc9904269564e11067f25dbb059eeb229e678d6b559aa3fdfa5517d187e32a5cae219826e3a0defb67c92f5de2ad04f5bb64c0faca1bc17dd23a1a6de8c0fb77822f1ee643adf0f5b99c7ba4c88d83af672f4700e9d4c3cfc697c9064e41f9afe8e045c189138f11a78681abb2b23b43f7d30065a13c2d8ccb02b9c60d32a6bfdc6835409a7ac2197006accc45ce8bae7b574d0fce7e6bb9c94f26fea09b4023e5cb3611607ef35d38ef1a9e161aa4848541b434d64730cd704699771b934b3062b482c1fe2ec705ef58ab8c8918469fe43752562a8ff8033a8d369eee925ca62c25428ad92ee59058c2951651ef615676a741a1059d1027001b2f928344048232c2217bead31b0fa3ee282a0bb16e94d0016c59533ccb3639156dc023cec9ff5da16081276093fb504436342b0f82e1202688f0de74f38314abd14db9b297258b55a2901e31d5ae174c9fd712f86d76482858db61ae81ea9328ab5885e793f338c8f49f0fc35d3388be548583c71c14d2f15ef781266404866bdeb082d1e534c95cbd2cbaace1152e137146d015e2169d3d372f73c657c5149fd3b445df5d9007e2bfd0b362f8823875a78ce9498d3c656710184edb6cc1ef6699951f905667ebac61f52e77c79b508237254c9de5c395ef7e0653b401dbb07720629ddefccd13034bb87772d58416d82d0fa14c3a6fab4968a077a034577d22c63169c71072c1c51eb4eb6d2d6dc1a6339ee50faa97ea7690126f1d976474008a68e3202bd20940989e2b12abcbb905e8c7d053960eb9f58e3ebb5cdfa2b1d8b9adb8c419b5c9f215f24722593c692c5934758586456283e030a1bc97829f9e20abefca06a95c8e6c00ed01c30e16599f61e344b01736d489a394a5f1894c4e5f67b679e474271c0474ad8e234e364e18ed11a4ffe855494791e4d6572e6d52a2ecf39a99642060a34caec85102a3dfba16db7a322b3f9be051e97b4c6f1022afefba7fe6eb673d480e1f7792ac5500ff16c9e0b165700773c2d785c61f392bf7efe30649d1e0f445e9f6e960c24cf2f038f99359f04f2ac9fe5cd86467a4d4d597045ff243194438fd2883a139164aca677e2204367d82dc7e780722c2a78c17b47b8d77d4076513861af0883f1a6c0921197a47602f9847db8872885d9273fd4177bf1626094053e76da531a893535a32ab99f62c556c129dbc66e0da34edb3a46c6368ef726a780538c9bd8ea555a581aa698c3ad695a30efa4d63709e27c4ce5a9ef00ec734954e21d4ba95696689de3e854c5fe509a47c2d75e8d89183a090ee62031c6b2edeb36f98cd4384c3ca1921842dc4a15b33e122be86072ef8c080153b03cb8cae51dec2db229db6b7244d3792688a78925fe8fbf78ab8db1a381e62ffc9c4ac183924e6e030e56b263da4e07c94a183070862f344ba01965cebd1ffa392a1419567625c628852241d3d013ae8638daec50f9f46d216d7381990ea04a18a25a41fa42d8ce0941155ec00e267e404baa41860c38d6ea7448a2023d11131f148b8c0b3baeb73aa58e0ac0929879064b4b05b55035830520bfffa8f9b7452507d4ce70ff77398b2205432e8f42a60f363dcc0ce85a2e2ad583ba108d1a38bd4705d189bee39c49786359a98c006753fd0a05cd9832939968990fae4fb73b2effaba867dd675e492fa5342f1cf12730cb116d50e2d166746fe68c96d42fe2d2138de69cdc5d70f3c76ebeee2c3f39f776111c1aaa8d57bc6a51fc68d24109edee97f6ae2c4b422b8b10581ab416180dafba0a62673a39e9677f322c7e933f2b5e644fb2cffe49f601ade1a4b8dcc0fb0513844e91b8eb57467211f0536737c007911e0fb6b36d1079fbdfc8ffeaff0de2c0d440dc44fa0717e284ae09daa87a879b871b52f175b1eb7827a2679eea030a7fa679662f84bbcf64ac680452f9409300efc666198b88615255a6cc4b0ac52e2a30da7250828b8d60f377c590ba6f443dec4596e877cffda0bf2adfdf14ed2e5af064d5e4f6fc6810918c536e9694490a947434c57d1aae4b4b25b5d0f0ae811fe665700ce248f6cdc0551ee59d03c07756b0956c0316ebfcf1fa2c1461515f281d47f27968763c57b521ae840cdf9e73b9ad9039273c0ac55f0244cb5c8d09de8508659ef979eca2b5b6f3bee8487f6a07dbd10e0f66c6d40df60f1069c6d0e6f4f0feffa810920debc589838f18ac87e87c25180d58212c0db16b22d6d641417abee3222d952b47d831f19623b23a5012b5502e5c8f7b4c60de4801446352043343b5a433d239ce456b8e7d6e81b939226902d726d1279bd5ef4cfef0335080dc8c83b8996eaa29392680751cdbb9dc3324296e9bd122bc88aade2c2261c272a448637aa0a59584bb0adbbe49c4f6fb1571a5e6519852ee0d35ae49f12c1bc436a42fde4b893c3676168f43f8f64057021e74b40ebee1b70e3650825f8ce97c59bdace6c0fffe80c34dc4ab59b532816292685c421a25b1ced998150da9e63c510cc9a0f44cee6af24a3df406f688c8dd816e7582e728b2e9caa3f6e0d246151ddb38f92ca0a7c349eeda9061efca96a4e0786347bcc85a0cc9dec291a0bdc0b9ea031193acf5a12a9016793ce5e28b237c325c118785b7a26eb2c0da7ed6d88e34e4bb75112407a46bcefe32ec8244f0f4a0ce3e51ee810861e94ba5e817838f8ae4e10a7cef480453c839be9648b7add61315824a64471d594ccca6a90b2baacc0c05a935ed9506c86e6f7fd5e2b9785740f41b325212e70d59b51bf44a1af78fb7be9a715a53c46c502306a0390aa18eb698fa03e1e15752c0c792c4df5b7eb8d843ac227ebda1b08ae141505be3a5c92ba9c72c96b1abeab90a4f327b7ef2065bae77e99c67a04642d50f4b8c7a9187a800585a8be22233ec86974eb1dc5396dc283e4e7b265442b5354d7b73a153471daf67cef98e6791acfb2026ea1ed9dd3509aa45b7a95d911f270d5dc047c72f6b11c857d73fd1c0334acd4f63ebec6f490740ce9a9cff76deddbf5e08029076926d0308da47ef51e981a86c8c9bbec87fa1d993efc842be6ddedfa2ef1dd12bf63be8a5368f173a6682c9cdabbc862a19c73617beb8fb52cd8b8e82c024a84313d9d02a046e88b667b5dde0d9835b94025955d4021d060c68e70ec7092d18df5925cd144e103dc3107b62b166a480025a7a085058e7da2fe49e88dd366a8cc515514c9061111093d64b7aade403f253f19e6e72d29d02b53af5bf923c1fc3e1ca12250dc3bdbf705c30e5ab726002035978b4e891db09688c962dff7da7874f8ec6c4e57477432a48c92c10eb611583a557f694ad009dc62308977f78cb1d04a236a0dd2bbd50968493bda533ce2391f1be53331060dd05060ecbfbcae31897eb49ffcad3dbf10f76df5bd9372528259ebc71bda0970e0987cf3a6b5c56bd227c121a470ea30263ebe82619dfbd4c36e4e0dd1eb2f35fb8ed27917201d34bde723550d2cfd8991d361a83179a52bd26d26891575189b28d8c642a403faefce1acc9ed0e1df259a9d84238b1de755c10fef1fa9e94673035df28b6089410d9c33f164946e8a1b6a4e32008b4b56a33e2e201234b10cd4f7df74c7181da60d256aac659175d0b03b0980ce4b0325056f6b26d6197f78a2d0e67fbf39f49f0f412f43708b548dab4f7d4bf80b6e6723f413790f0eb1aec688f4626aa9ca7852572432e34dae209601cb312b923db6532f4fa56228b1d95b2a9062597a1e06ec789cf4f66c5fbe873aab463f11664dba50568e7c56e3f87afd94f09a6632451780daf0b42ea68db3ef794577017c631c8b273b0ae8dc6a57e0da3e6ac92a40536db3b8e0d89f74f0aa92a6e982c91bcb9974f9eb4c1b75158ae8ac5b17bfc571aed361ac612755cffd9912eb3451a0246ba6b6c6dfbbb903783cda2c99366627778a77860d17979e1fa5dd1f6e033f251df15f2b2303ade8b124b679fc35cc229313c6be8dd99de025fcf0a023f5d397c22359a298b222950aae470884c04deb8f0224ac2aae08b78faaec8cfad1ec42016c9a053402af9594ccc313e744accad40f39a4dadbaee3d3db87dcc17edf79cd34506b313ae9595ec5117c75102dd40f888adc214ead654cd869466618a18e1a39dc25d45152e190ec6bba892e5ca272c009891026b3369162e6c3487c93ed20ee386656eddc09d704835ea3c6a08004aac389a59912f5b5ec04c20afeb76cc8530c18a6c19712d29c1ca377051bf917cb242b481440d7f3bccf20503c555301237180bb32357bea4d18b21bc2d941a25b1af46a4d0237361cb40cf7d99093cdacef0a152e1cd3232bcece930dc5220a6ec304040140ab6f9b3f4df1464c146aa5b24439fac1300966bf651e229a0a39d8749e1f782d4d011f927360637fd0e178e09629bdb9e2f86d9e0b9c03eebdaf4a3b97a03761767edd0df55e9403d542127b891e74cc9b4b049d2c3e813fa330f71ce1d1f5b89a24d82327329f0a4ad3a853c7aab0435658ff68cb802dd98578e17e0021828731ec97d7c200f6c965a2cca2c6d262d4581ff697addcde505f41a50298f104e5c4039119209cb0dcc8231d9c99f4093c54b60d81279b4bf55d70234efe58082d5cc5e8ca297666ecc03baea4fcc30312f93fc64ccb303f3aed6de0b81883d43d71e4ca6f8f42d667907b5e4cca36cf0b267fa04fd58f5223ca7e484ffa975808fe075a4751c3e4994866391b409977eddc558c9e894cbc82e966fd64f71ba7c02441feec9e2b942966c4a06942d5994b246f44c8f0093a1863b42b0a5f7c9a067f5f15691ed323a7da81651d04c6ab100dc330703f6762f03cb21ff44eaa20bbb376009037a66a0a34d1beca9e7325f5f4e3347928e58b66016587f3b27dd4594f9a94ce3314807c0734449999665077e4a0915dabb9186a5a5ace9f4d8ea67c8b066542230bd0f0dd6750d33302e90c9773066d6f461acd704766101e66447919ce5806d92b23d094e192c9a08564a41719ee840cc23c46f49f6338cb1864be18012a864b1283f68891f661b8c730085118d1230c2707832c82117860b83460d0e62f52f885fbf50521f9229abd705e2fc83a2f02c10b17dc05edd945cabae04153a7ace0a22cd2259673598f5c1c3e2e511b2ecbbcc519dc12e168cbd20f51bde95a0aa116544e8b20a185e7e882f673919e5cb8332e080317d1bf85b3dd822c6d11005bb81cd55ad8cee40b01a2f0856490820fe71cbd577f62a876c5e80c787e228123c1c4b2e02a6783fe83684530c5e40b06531a80d1df67f7fc29934c55a2ef0d93f149a7c3c79cf691618171ed9d838b2c8d1a6ac83100e970e26d1aa479522fce2709934857eb2279c1d365ed67db4566acf90d5734f430aedb288d6a926b1a1d756529da4ab1358cdc2cf8df9733ec919f97cdac261370a1dee097254dfaa0de7c80794467427c81c99f370f8435e9192c68a7a3a21601806e3d238cdd2efe631cfb882a37630da659f30115740c398bca95a729c1338fff825a5799167f56a2bd17dd988736262efd728ae6abac716e847bcf77cec4594f12fe9635f0db21c1bc20cb3cf567510f78139e9e09b01ba6fcb76b00f70293f9689641bae7a61efa26203719619f4e79ec5542ee1b7d929879c45ca017f5d289da8fa9bdf520c3e8efedfce9cab319a033eff34d7f4f652c1d3c963f7d7b9f5174eb41cee8efedccd3956773a033ef339bfe9eca2d1d3c9679faf63e5774eb4186d1dfdbf9d39567334067deb2724d47b337266882f621594c518e63944d44e8fe9b7b30b515fa6f767019bca40a6e23f102d44bcac67f168dff01c1d5fc094611402f9d0e341ba05ff45e5002c5764434a0ac6718e6ea73916a45c7d2cf73bdd4bb55aa4191a0a02f68b6887e8d71795a6006819040e1b38ed6cf5dec8b83856cf3ecd3ae6896629fcb18fb27c9ca6b1c8d7dd6d30e3a909df5d451a88d7c7ee8f08586f45bf9f468a910e66df5c06d2cb8a01cecba0e7216691a16c054e6a593b850942f7520b114dc945ee163619d1602053e3f3850cb6d7d71e98dfbec82e188685db6dd438126fc79d39d30920bbdfe10f1202e05b38c96455ed108cb81fd6b8dda957bfdf3a29cf5286fa40cb6aaa8ce72953e2ee0e419e2fad3d4fa17e95c9d52e1d2b9aae66f4e7702eae9ad31bb7ea5f5937d97d02745836b96e8f879754e8f47032c5e619123da3c322c99b475e6b39ef77e3c497a0f596c74f2ad551238fe785b4f632db4ebd9daeee583e8cebd20ffac8afb4690c7f6e37937253eed350b8c185b74478bf2672184674c866790e631c980704d851de7ab457093f4858573118b4754dc724c19328de522cf8724af4143c451b08fc819af97279776638eb1030da4bdfeaa4a70078416f65733299334cc9ec3e819865da9c8734b1f91dc09875180e401644d089f32aa5634e88916fc807ad880cdf164152f7581a5eae11fedd399ff7935a95e09161cb4c01357d0ca4ec47c13e9e8310848a484bbcb1d72a46d2544dbc3c739e47248c389a3b20072449f0d98431c4050958ed628e601b7aa7cdb69ab4925be1f17fb343c205cdc23bd8fde9c72d8d3acfd8474cc0aef94f7a7bd45a87631c18b932ac2444ae079b57b1757cfb1e45bf0c2e9883be1ee35b3703b65fc07eb34f66b1a48c883d282bd722ea1e7927b99c8b12a589f089d5979991fa3e3c3880c349dc5f1249ac40317832c3f17adabb505276bc43f1d441210230315add864ebe0becb685207fe9e8f219155a2a3a548831c547a948ff939eccf06601be9b054bb03f4d14e3de084f5a574dea656bd31a5b9603e1d86e748338ed598ef4ed7ec0c9cd4b2de797e25a38fa9da1bb4d1ae08e3169a2a320000a815b58ed2a1cfa4d4fe3e98dd4ef29181c3704babe38833b572585f72d492aea0cfa3fae4ba5a920f4332e7830b805ed69e13b7c015ea3a339adba44838e5dcde10d420f34d079c0dbf92edaba5697a00f3372b84455cff7d20093aaff501c551dcced18415302713451c81475af5d25de84d895a50f71ff94ab0c7f953950fc360acbeec5bba8c97b86a03d549c0b8b14d6758dbec6e2fe33a9015bb839c5f56e2cd50228463fb563c09ae8538fb0b1fc93595f0dacd36534330f29e15d336711bf9f135495201cb8b6f1d89b202c473ba43419f076569ad4b763d7e71e635be1b44498d891db3b1097c5e840e510520574fa7730259f041f746e5e224de6d9b758b2d97aec20a02b4677af5473ad2a65c99da5e47c00b8d37f14a86f49f89fa63830045022f81cbe399ccd166b4a40f20428338df5a91d00bd25f9dd9a1f8beac9591f8df9623d02395eefcea66e908d54c5c749dd1ce0f805038fb1563578cdacd4a5aabce1cfed14baa8a4ffaa8bda445e64eafb4e0ef620ebea8ab567ed3e937ea12290cea8f8e8b9aa6fcfed1e4fea7144749d851130dee51cf18e2bc6f2cd38fa5bd3de260cacabe94eab99fd566619839d2b2092df01f3e5824ba7267770d537b90c021398f011ea7b25f4dc6132fd5bff91e23600726ae41eeadfd9fae6b59959438d63cbaf2408cbcfa68a1f2e099786d3a24a0ab40a5e283d50972ba85abd84e68811d94aff7c4510cf0fba2b5fc47aea815dcc6cdca7da3cc5582c86cacb4c377f2759f6becf0ef2529265e3d6e8f08f42c120f8fb528d20b1302eae490222a0d5ef8b9077d36cc3a6d2b060fd35723fd7495fcd53d1798bc6a1dba8bf6a90de08a82ce2ed1fb7e02e7342bd0300f1383164dadb5972c1c332071e705cca87a3f469f5705561f54143386f66a2bdc57d875743d5889b814c373bd21bc1d6759aa6915adf73bebff0ea062245f10e0859f6c0972ea69a4233fa5b0b4365b32e9d76cedd379987db25b8c0bb1a369ff011dc4077dc3e03d6c108a73034fc037bc992c5f088f9e26abf43158e3ce07bd8f46bd01d183d653e337b67c157933c1c7ce3c0054652a3628407ba903fa7041f972fe39528b08b1e21e9ad828b4a9da7861ef73412ec3c0d387c191e61daf9b2d46205a7bd59806f5eb7aeeffcf1d2f54cca983129f8974db845f4493652d2604e8e2842d8916c2b91e6ea5564a0f5be0506298c8ea66d6ca82bfa64ad6da8375e87fd73bf4404121c689c3ffcf5e11fbff52a1f7a982d35805d74cab09555ef8302c7aaaa02febefcbf868e994bbc4f7ae17bb4e32df1bb88b2bc7b33aff558d54a40a8016a38a589559aed80cf858af0ea9075a7590bdfb75b7490a9ffa959360bf3465960b8f417694c2865714804eeeb66ceb3ebe34f8ff9a04e617022967995f214ad55d1204225f5da58577d565d7e5eeb7078ff4ca55549a0a59e3706835ee9c48801e7a4a375b2e58c3890904eef5ad0b5887b8a6de4df709408cb86746f7eb3d7291de6f40ec9fcb0ca1665c2caa8c3313098c2c945e228644e75a0e2531b300524c9c5f2560be700173cfe134b7437726819ae919cc4d2e34a035990ff62d3aa0280f03cb42ddb9dc1b7813a007e0ee7a31eeff79ff47dfa3d22f96fbe6db7d0d1d4f73d0ebf7691f57c673f0a1fb4695f46e236771e46c6231b574c5ac3656976713c18774abfba3dd629f4bd5fdc43572b8cdbb37cfa4b2b9f14d7959df2d38232a979a66436f449c6e9a768ee288f4f7bafef6b297765ab29746eea61b07d5f437ed9a6e92817ab59361ff5a5213edc8af6710eeb83b88a8159dc0e0558705aec434264cc925dd898ea6e20cf02259d6cdaaa7d2ab1fdf9c8931cddcc1280543eb8e6ffda31bebeef904db411356d9e34884e6cb3f1cea8ff77ddfd442af79c078030d14e4f5706a2bb6d4546fd796dc15748a91b0d282ba93a1293458d61a32f9d98a3d35e88dba72dff00e4ecb6f1dae41b9b880afb54c9ffbaba74673ba34976c9d89208c28e06b3a65cdedefeb2581d4f7119558a81442cc47bdbcaabfbfe02b14fda48a4a47c8015428ddef2d37f30a194015773e878fbbbff0efcffafacfa5a10578468dba62c7deaace027b99fa38477e4d4754870db8a8fc4c41d323e6dd253d1b42e7284bc6e781b9e23339af52dc0c9949df5f671d4daefaa3e3e1b3a1a1fb50f48de9e60c8cd3d23b34139773204155d1933eb8f2df3b197a667fb84ce515742d3990f63e37b88667135f8afde2d580fb9524d67e818aa7f3540410fc40385ec0575b8141c02ef311df8021d4ac09da51303a2c82d93964247df195704bd42fb81d72a1f7399b4d6a3c3ad4534a98507d04132d5060428a9958f0b6825885e6070250fc28e5e0a3cfe2663fd4b4f0d537150d62457f1b58f1a7dcb038fb904ab9581d8e707c6cef380bea221881a2df03cec63c3bc662facd5ca80db0cda16536744ee63cfb120f5a663152180252af4825641c1722ef98103728b6bad2e3a107ce52e9317d4f70aaac0181178de6c731f3977102f708c0ddcf5d57cdfd8b80c1077eae2b3b5ea6dc6db099db2fbfd15d3828360ef74be1a0f111928ee1acd41d05df7ca440b555d23a2051e7926c9a81298248d27b19b824844242ce1916253fce3e3cec555599b5e19a3d0ffd149f2348dab8c35e549852721c16d89af19a1a93568ce2811206db5cf8f22f950e552eb5de8b562940484e362d44f543eaee6c9dd00478952776f2fef1bd4529c66eb8ca9a5f6d878f0d0466dc71c6e6cced9d93980d82eea3d9c5016894c4e2e23d65c11b2d25d69bf8dbfc9d999c042b70512494491669e2d76245c1e5355601b8ddb4e267fabcc4394aabd69087d96d00ef5acfc10e4c48b36abb97971c67116029d25bae248c96f2b34538b4289e3f5901fcb4e2cb08cefbc6f9a9d53d284bab6d9f3bd698b9af26caf6707c054f5bbc6abe4b57e863f752716442a61d733f7b6c105b095d095178922cdb327fb8f5448b189a16518e18c6a624f434925db05fdad0ef82ba17a8664cc4b070b9af45fd2b161d6cce6c0a7206e807dda14641d374208801044c65876601022f3f159269485961cb3a0fc8850ebcd1c5a0ace7f4ddd2c6c51257f08f65ae1111989f89539bcbf45c3c21e7d5f98ac94d96101fb43b6e6d025885ce9b08d5837fbc1fbe6d6d9e14e8178031c23c0bf0dbb670a36ad93efadff7a3a0e3340dc410ad83d816c6de2da1447c41698d9cc0c2136d5db0aa9131771319fcb8f8e06c37cfdd6878905e5ad3b81344762fb828eb75ee70d2a20238fa43436092301b24886423ea034cc9330cd73318f4394d7c3de8003b018475705110066a8338c076d37033278f90ebf1826b4274a03fef5b1c330702f26899043ec987975b05ca3b344926e9938d96c194e1791ba1e426fe5530cf9c1e025cf0d31458c99576284c6ae040085934cd78aedab345e0c44560e87958d36c84c377048aeb8eb89586e0ca23d474ee6311c7268e2d832930192387907dec785a83bb9623f42f8545ffc2cade194b1ba681dae5dd98e07b821e32a7dfb894e68ac68ecfdc9c2561b1b9774a28ced37149194b0a7ec7e8b589494a55458e1a0a4328655ad11a73f41c13cd1dbfe01cd35aa673640562e5c155f8d8b837b0e44910ee6c2b6514345916b224d6616ac2c893baf14abf554c22b78e7992b4831fcbac458fd7964aca102cc40de2d108fbb1c4fec509b121a799c15cc23dec0f0e762f2cf946ead518ea25b55c711a7fe6ae7dd98d4770b1607b580fac04b77bd6e571f90c901d2bbb36f6988cc8dc94ea9a634c568c72a267499e439f118075fe8f4c66ccbc4fc48d8480009f707005236e85349da75f405ccc50c7ccb12bd6f9e96e8b1639ceed47e3c676378fab6360ce6e79a170ba2c0f0ce4fb03d17e423d7dc3857b6e4b1a8f16690891e2f5a5924ae13d0b791c4274d17dbccd3139aebbb67953b35eb17647e6f49bf35de287d66d04a40d370c31a6bb54a1362ced6026b3a47e2363c460029aa391c74e4e44e997ebf0cc384b1e8741e75c64b001720fa16e5fa712692a94837307df9f2111d8b27dbdd3c509c30f483c037a0c7cd5eeafd152f0bca8ccef6cde6071696ce6ee6c76a83ccc9269e5ee6c94bef1ae8a3dfe765ea08ba5cb9ddf50348ac88803ee9856ea83c5f7db60323acc11a4014a267f73b0a3072c2d7cdc34ef458402004cc0253b2a53bdc5655a929d931f6625368e98737fc3435b6c230ae6283a692f23183678c46be1b2531777c2613edebc720dd2563acf80f05805addbfeae117de6b98ee906e44ed731e3ef3e3bb72f84044ebfeb5411d98b5508b82065afdd896c44c71dc48489a75f999e2243ca8e26c81127394ee0bf35183d664af68710d187838d960947acac11ea4a1e77f0791dac53c4e2ff801aff0827d3b3254f9ae1c2c55d977791ccd12161be394556beb7ac7172c9641f0e7c4b168e32c337b29249d8e48991c0e2b65a8b4c382b0bca91cf0373d7532d82b9540e0b2a04d56fdda081af8c54d284c01e120287e328643eb66927ef3940c13b584c007eb6f8808132249f801493c12d634c4b624435144c2e29e0620773bb859fda98468cb5d7cc06dfc1c2a4d1a707ee020178e84ebfbbba0b3014601d15b60e5e9c4aa99a8eca9cdd7777e233ca90901bab011c92d331fc9225b14e2e23edd42a051a161cccc50c1163afd0d9a5d295ce09682689b83050a153af8e0465c664b4018b003128f25e4cccba06396645b9bb44c2780724cd217bcc25824a6abb3eab4bf7cb04a1b9273045e1cd74970567cdae59426ac2e929753ca9c267bd7ea05411f3eea960f34108f4dc24e067d012038df991e8cff107d494d6a99845267a83b3026f30a863d605e36d14066115a82fdb3fd81109f4d59b01c3bb58b9947104e0c79a158962b6a939b01beadcdfb1ae105594d44b9c8360fa69f57d1f92ffada161b59344a62655cd981ace47011a0c59833839b37153759844533e3a2512bf6432eb886d124af5d6ce729788960944cb4b12f2531cd0d2bc63f2e0b1da5da281f1fda951f9fcb35d23a53a11ca127553cc6d328157d52c065069fccf1bdd3a9d25e0c094b39753ae2b1749eccd739b03e974bacfb96802e092f1884dc2459f3278f35b199d157791f510881e2e0ebd29402cb62aa71baa1046986b65dff0a29f22484f6a2f5fbcd21232397a2cd3a747c5bab6cc00ea71d684a5212359e90e0d16e0d75169d1c21b210a0fc718f170630f5e9528edb1e48b338f1771b66e651a08e5f4572258300929b9288928d9c8baa2f701a9c3906c74250b8dc8ca4f4e391e5ddefe4edcba626a200be076b0b387a1f14d2dd6103cdfe0c1a88d226f683461e68f1946c57aaf6eb06526d3f2d790d837ca6f64272a1e46e6b36368439e367574e2047a3a5a765e9e8d9eea2644fc8029312c7ff9f86f6c6f1d2fd53cf442e0d2dbca4442392cff538eafdfe71738c89bc4dc12b7706e6aa4d1f92872277554c4b9eb7f459dc74fbaaed78fa0dc6ce3a2f1c9ec3bc4e7f12345b0cc32e29ab9f55833babe7789f1f111df6b0c8200abe1e30ca4de3d7db1ae8e8a1037d8fd626f261da9f2ce3f47e9bbc4a3b6ae3a1b3fcf4137bdbe20ac7ba835ddbf0b5f9f42fc1065c6defbeccf28acead8166c4c201ef8cca8ed08fc82cae1e205764bd638af235060523697e72b1b6948d93020fd01077e81360cc77d545484b3344d60abff7099e72688ecf644d8fa88a31f0194823e8848e72c14b7180f98a53cd7ff1570661b19f81c25e2dabc42698e7775d565a7c098c3c99d85c6722cd2bf74d0b07b2ce184a22a50fac55da482a8573bf9d49846e0e179c68e776f2aacf343f593207f3da89333f35eb13a1489783683e6b9727092c9f49bc8cc062a1123de210e7d9d6f964a713c0c0b8ee4b33b43006c397c6d80bf493c3675e62bd792717c16c98806ea7051095c406240a2b2bca49889bc61a74b852a86e62a42a3f8280d2567ff82861a47034cc909bd124320d66409ca8bad2b2a6a01605ed813f631d9542d7f49deeb0f0519a0599904ce803b6473fbc1a6ef2c707621d66d12afc58059e2f34e3534c9d66452a27d1464667a1407d2c8f0e3e88dd2179b60eafd65abbee086e6671ed5fc008009a70bb0027c88eebc1b6210e956a315d323a5bb0841aa0ac337a085a597136620304e098292c1cbc2c14f286152a988d806dff4b301e624037ea91bc4fa44e512d6f6fbab9ad5ee19cef40da12bc5a0d80cc3f0c777f40c9fbb555a69092fef46783489062fc15894b0410a285ce60178be49e6e838d7aa40abce9ae69c7cac117ad0657c8bfe562f4f159acbafb6ddd8ad7ba367ea82fd0cb13ad1124d39651e97658c0e11f01e9f87fbeb0e7f2b15b1f8944b3d81dc020eece15934b2a0da1c80c701b0cbb901d40201c41fc070abcd3d504d10aa080099021c6ef2b22e6cd641f8d6bfd0ae427355b516b4e872e2d6496abb1834927b047022b9e903a1041d5570e3c03acec8dea6d806c1a80381af836ac900c67dc106f7cf005fe7f3f65af7d4a09a1228d546d1ac92fa6820458b87731c1c067905ccdd0e44297848821c2f6162f3725a83a9ecbe7f8a3d892349bb2aac68aa42c21490e1f48bba6cd5726ac6790f1e8f2bce8ecb580d413352951fdfd8548644317a186db54e623e1fa8b0e6d4727dc7cdb8e314ecb0fb6e4729786cbef4aee853fcf1ca5e84b99be389069cfc80ef41cfc058c0ab18f96a410d1893fc86fca58938a5a649445db571e6075afbfe4892f2a6027db6c1d821c329a2344f2f2dc21924cd5bdd04e3b676b6fb7060bc262c3cdb89cd1ec3967d9c194c0f32113ef5456982b1e272c3838faa3d6eff04ab8ed8a0c4c7837dac12ce137f743dc8c7cdc9120ccb6e8e2b3ef928eb6d2b0a11d82e1755f0d2d270c38e7b7128de95ad156d4e560f8e9e73fc1c652b05b16459cefccb18e51d1fa04a57d861713298ce6f9d1f72b7fe04e23cc8cf7c1795f327474b2ee00b0a717ae03ac832081c994e228a77cd8fb235fcce599271f16009e2e51b208a5456f98ca40589a13082454e0c11ba78f76191a921435bb21db067747b7388cf4bd1667e0ec944fcecdc7576472506096f4a275e9b90c7f5e0397792083507a2e6043b29c4636cd6e71b59664eab523d615302866733849d095f0f09fb074225f53f095d68390377b2b9e024f27da2e1f933ebe2abc493ab2bfcecc037309fcff3910d980a809582cf28679269199fa5a9a719380d0eb12be0623b0395286c15a1bc5c72b22122c10f6e9545596ae8e5d2b625c0b3d5f78b2e64f797e81f2912d6afd05fe8569bf749a3863469d33e22580b0b2ab0bc5731b558e3bb8c1d2693b10b5b0424b343eb7d0deb4c720a7dfdaa610d3d4fd7a8dea5cc5f8022ca6f30e4da1c6e6e4618094b14279a6213324a3867d8b8c60349db48861bc7366682e0d152cbf1799a134fdf3a033fcf26e08150f03688dae3b32f0ed2e879673c86afa81f2943f4a901aa5936506171972f2746a2c4896045e79e68d1c4f441bf29135dc83994319f61c390d687d5bc76e808c686b416082cb900d31db1ac6174e97157c0400892141cc9564271a3a882d1f3ebbe12dbb6bbfc7dafa117ff046b42e8194d851aecf92be798924814864d10ccc3e8bad39b63d4c6874f7275be6a1458d21fe0991846833a2e82bd9c94aa585f7e69e3384d3c8421a8dad7a99c975ec44918aa93b4c1f04470d08359c2571eef7435390bc5977a4e0b43caaabe1553e2143f6e728692b8dd7e3920933fa07c66b1488fd3b9e7614ad6e7a929dd4bb091e2d3ad69f989b1465f099be0ceb003ac09cb8022ba2d04daa5b5acd56e2c31c9f816acbcf484f9badb466ca31bcae4fba8673a2179cfab68d87dc66bb8e1df6fdd33ab7837c1bb1acaff34adcb2389a96945b8aaddaabd3a9043ba74501a757efcb74b98a07ecf01718031e8bb3c572eab67257c38a8b09538fca85b888564cec98bfc4285c27ca9a134532020bdee0deb55c6ab58e34cbe9797c38d1ef8242d79330b9e1b8a6a8e4520a715ae0c763ff383156fb2a6e38307eec316c42aa43fe44627497dc5cd9c91b42b556a4d3c8bbf51b15f3ed85f322fb357e81a99d7aa6cf847955fb899e72d5c009a046eef06ff2a1a72d4cfff0019cab3ff76c45311d5a9fdea734dbe4f9cbdc47314f8e4eb45eeded2dc4a4701a13cbb9ba509328bb92b7df2dcc8dc8cd32dea0f061a81da28bd4cba0ae9070ff222deff24f584d61c854572f52d51c99950288d0d18c65e374de92385fbeb886bab36af92f0b1a1efccc3a5f15fb685ab57b18415225895780d4d788e1e02e4ad75ea494c0dc62c8ce3809bc8ae80c546dff17deb1bd28f1afc8645810963cfaf3ff974367ee2e2290d51a9c25c8c2956ff70c48b795132b91a80b85dca90bbfbb3d26b29ae8bc72ebea091b9ce7ccd0a13a2067a5cb29318c561b89c2d8f4c3b0c033f31f39d2d06235654f7c46d9dbb713c9123af36ce4106147c7933d490abe28eebdbd477c2bb21735377eca9fcd0be49d9d8f8b2f5379270e21e71e88a600f799dceaf141ae5d0ab1f4b668041a6152c51c23345dde65934b9a67340c11f79e6dd1706fd83ef906eb166cc28b1054f1e02c0a6b5f0ccb0fc533fdd121331911853cb3e085bedbdb82bdb581274cb766a14388416c8dfb699bf9226c9b3ce026f34c8b04d653f15dc0665a0325e4b039c808628d5d6d5dd2b3b77eb9a71e5e4d3445fd57feed5b684135e8d8c777374dfd2c5245fdeae0c575d903e575b9e9772ba028015d76c60c87b418b8cdd0403966167a3db28286aa2ffb77dba5af27f47d4971af0c62a6a557e9f658370e64d1661658ddd1904b379e56d88cbc4d879abb0f0479f4ceeb19c7a30692567368002cbfb46edb29253fe128191742b39d3b72c766dd10f2a3889a7ca28140c341b0d12b85301dc6cc2221aec5240e8ce9c593f055478bc5fd4e09afed9606016d8220092447668e56a88436272bba4b9e8de2c2205eecbc89a1c19260fdc67d9bfbfa1eea6e7ade90164bb7bc2a36c081509b4b608da0843f41c8a60bae84d5099c06e4ef4a3ac96e5118cb4cb489e1a0326cb9a4b18ecccceb740d0b0e6491e5ee7957c4901b559d4b09c13557eacea7bdf360e82acef55080fc65b5b6ce31236f58a77263bf7e9f5247c4fc41704a2411d5585a336f92893c316f249ca282d3c21838a28f8029303ddf4a1707825fba1449edc034b360726a9a0de5216fb3d08b6fbf768af802f2f52abbfa8c4fd3f33d2d0b884a866bcc5765e0788c9ec22f49e0635f0c672d851e48ffbbde80c108879cd2e9fddfe6ddf6ab29220a621198824ba05bac7f6bb4f8b2b3780d325ae5cdd9b56084c36ec5d936f13dc3825cfe0d08143273ac02288e7fe52809c2e02ca7af94b5a3098594d077295699f6fdf369bd2167b1095e58a68c10b5394f74fb22269b114efa7cd663bfd9dc07a16754054a5bffbe031dbe3f801749773a2e2c6ac743adf7b9503329e61d9a26ce2150e76031621d1daeeb6b79432c99452c504ba047804954f37b0ecc32b54a87dba81d6edbab3bab1fce05a817d184fb87245f5d30d3175bb6c6db43a4f37c4fa65a066ede5d06a5643d78c676cdd383fe590f51b6263871aba6e7642a1240a3551dc9c33a2e6e6d3047bce39599b734e146a57a81c34892d3591e2b5362698966db73b57450824908d18d45ebb03c5577bdbe925859fd6f63db4366629b78d526edbd60ca7b580818179818972bac4e0b498979717162f2d1f83050b162e2c605c466091c212a5328b11969f5394135291cafc9998485313688a998e2a7bfdfa879e6c70b7751c779f0956797b975334bdcb0907edb74e4824822ea7036c0b4612557d1230c1f664c323e0ef72d2b152aa77a624ed3594815053ea8e4f88708044fd6292da1156bbb7e686496a7f03a1ca80555351df6c145392bef922506db8ed911823959fdb1b7fe6acf5c114a9303e95f9f9bf989f9bf8ecc2447d01ab1cc5484dfd546639d9601a4e53ad76e001a416b48cb2b8c069593659502f709a8a9900050f5ead4c050388d6e6719aaa4fb0e407a0d6b6e2345583a0ca1100384d1500256450d48281cb543238643c00b5b22edb6ab893dc6454c99f72b270b1e132550fad6d3bc51e5a9b492893aa4864f93b06518e448d0a1744c986d6a68fd4d68eb88b43dad110bb9c6c784f659567bde210f44f1fe955ffd6dd001d1ffa6d94da434610c524f275e2105cf5eb18a1f2bf3854a3aa856a01d8b8034b2801d4ca543253b4603494b4e52e43b1d40d36372a5b9bee14d017774b39f540d04652c50a45365826826e931ab8361883ab8e71b197d84c8ca626a342dd4aaa48f4a9db33a56310475b8ac56231cd8ae988c9c75444b332934a498eb5c73580a05ffc893f0e2115684c5b82ab7e93ab5bf360da12c47124b8eae7ff25d7965c5b6a97d2ed569c8a4fb9f1157652fa463a52ade143dd6538c6877e5f915850a09f6b4b3108a9763cc2a43212cfeaf8103de1a520584be9312206a900b992d5e91a7f72ac6a2c6aaf3fa3591df632564e0a16a369ef532f2cac4d73716950ed8cfefdb5a1017dd2e4ff6351cdd3a466e8cbcffec055d374aa068deea5e6c6d3c097c24a92ba52584102435d29aeb0c42f09f06515c756486b00419fd9612f47d48b6b5b9aefa454fb83aa57871254a1402691212cf55e8530b8ea8f41587f7b0f6bc8a4bdac7a076135a01f23c1a038a1de4c65bc0b087705e17a904fcc62ffeaec7b521aa2055295bc38a724b892d1b9a1a07f4a9227a5d312cac54642f5732359370a228678a28d804e49308655edb5cc849a9082e81ad5958f2a42fd9c92be53d2d00b0554654ccb906908e2b4f4cc96216f19e2962198a2971f97a496a1961ee9dd1a5577589977e012ca46f4e35e43482f3f2f402d207879b51c79196a41c1cbcf0b514b0fc43975dcd253e57313f47349aaf25d94608b56c12e4bb245a9f44abab845afb02e49a797cfa207e268005eb972a5876b712f9f26419c5307534493b80e0abab059370a228c54982249534555c2205509d37d304a55ce585295df4fd0afdb240645aa06c434f0cbd74eb03af3e55431146be3cf2a36e219fe31df8cb9d129898daa9c3188a36531355640f9e35e2d4355fe07e58c712f66827edaeb25a9f69adaabca6f81848ab2c100e880feaf8a50c8ccce47f0db901103c68c4ccc8b948b16302f2c5c5a280beac46d262d9b323a6c86bfd3dd1101060f6ff09ec10f2455776dbcfe01af58a9fef007bc72e5f9a1ac4057ff1fb07ac73d247a355edf70d79dd0fccca5930dfe0c082184703b21f93bcd515c95ebc6d234954ac576401c971f1e0ef0d184084bede21d1c3ccdccea9bf8fda91cd455e35357ec64e2eac42ebab6960368604a7b5bfd83287555577dc5206410827ef45301e96c37cb3e1cdae3caaec9ae1d9e29a50c4250b94735acecd7f49f07690f48fb68afbf852ba87ff64258082a2091c2526b88132182052dd3f7c907124d0028341c0024faad124fe3143922fe0fdf327547c8ef67f5c76003fa4920a7caf7778da8c2ae17764b68f707c129325b3f7ceb88ece7e3b043ea2249c99d0f151014118ff6fabb1f7504f501fb7fa2d83adb36166f4df5add24ef3e7ff4b9d27a86d7dbac1bdfc3ed9d07c7be50fa76a33bd54edc7556aeabe97ea35c477f91c3bcbc90677ba316b37a59bd209c1a45eb468e1c2452af5e2454c8c8c4c8c182e5ca4522f5ec4c4c8c8ccccc0e89ab03635df3561b522800db6fea5711173b95c4468ecd8e053799f28a91f47348422d42fa7b2f3cb4daa532a64668e31461796a0def90d2b37a20a7fa6ee3f334bd741dd325cac0d7cb837daefcfbd31dddca07e9f25c533206f3ded419faa9a41a2dff6fa1cb621d98622901487f58dd7d05d3db821690f76f736b4bdbe1fa5f2224fe244eda160bd207604eb2e2fe23deed31e54c1ae624450e1c31f9e011f3a1215ba101f55a30abf83ba7ad740db6b7b41876d445c4b2aecee427e0821ec95c9016bf7f1a84f361860a800a847b05ed84eafdabdcb217eb770e5ddc2550e70b38cd29d57e59c84581e0c30ec2ccc53f002bbd02dec42082184ce42eca46a7e26438b6182b1cd7032a718d40b961475d1d262f783ac03532164f1f2c202c6a5458b0b9a6279818a39c970331b0c530c4d46f65325bbc882d3c016da057e81dbf550b05f8ef0349542e15e75018a06d0173c175af818e567a153bd8c18306664625ea45cb4a8fb1b0b6efb06e625cb5e58b47071d192a22f58625032dcf6cd69fb0606b77db36ddf98f6fd33d5ec240b34de42bfb0e2b66fbc95879a33be36feeeafa676e4e8ddddddddddddd1b9bf59cccca71c4292a63dda708a96acbd9a0a7f933b1007c260dd2645f0a9900a12887235290213d8640846400aa18c3e5f2c7777ca9dd07c9a87c279bb0f5faaeec6ccd57d94ab5f66fec684acd48db9a089ea376466f7ccda93df300c41534cc37cf9318c0397b72affebaa6451e57f00d8199f6a4fbe7c1892a012763235b0d4f97b83a5ce8ef5816d7f55bc33e4d7a96df3b718b518b56cd37e99becc48d5d378df84f23fbfffd238956d5f4e8e147593a42432ea3a0102c99109a60aa07c40892a9288708419ec122bac30831fc09c00842853082246a8984294281051c4496b8b48f0041127f041131330697db4a78b80527a58e295c48a2abc008a0f45d821a4e08a269c5812a50a53a0a18ba8fd9bf5a78892b6a892c99c4802b6d45a1d587125a9b5310d807a36c8794768ffe64898c21043b188253f10492eaab6090e0015b55cd5c5a0b54d2eaa784a1525306ab92a86e004ad2dd372647588254b2cb55cd55128e12bb494bfbb0b218c1a34c10d42f7cda4755f2a53c157651f5537e4672a183f7ba9fa0cbe77705d88712fd89c8cc055a350d2f236790537e18a2fa0b0c5400c14e4de0327c4ad5552b6942cb9bbbb635d8ff9a48387fa61a04647edda7857a1f9d5854c519a543c3b41b0d37afc9eb6c30c66a9d4476dedb443ed4cd33a6e6df8d7630e486d3799aca4bcf5fae9efe0b061bdfe7c54aefa6ff743887331081144f718638c9d674368d64c2bde3e4ab62a5fa3c3ea642c560ecf8e1e5258464f8e90927480c0deb009d683bf3ba57eaced58de31d0dab82862d1c08a6808dddd214cedc01e3388d07626d13dc61863fcae8a0e1e6a54c51a87d4a8eaea0d79e31330eb62581b8ea1366b6dba66aadf15c35a85a6396fc16619cc12ce81244c2104aff2e2391781923c3a424a8272245477e0fa7975bdb5f17ea01fc7624fa4927f008920ee8a0d0aed313ac7bd40188b11ed37d8dd65ad8effef5479c75a1b566d1fb59bbb3a717729a38c1e77d59acfe54e018c10caff16c6b323fb1bc25132773bc86e1eaad77e5e6f42280524bc7a7a7e807c7a9ac480d1af5dae223fbf5eff0f21f5878fca942b62eba4e84a3da5935245d0af915a0a744108bb2184707d10b74ae910babb7315ca68dacb4eb466dc139c90c03f669d659c7177776bbf6d4ee597b39bbb79c8d4248ee9c5d4ed34ac399b0d33afa6b38cbd59a3c91fda5e77c7f85e77773b747cafa6bb6364f728a46941c05031e7d4b8a5e5b3009229a468d6f3862a84f065bc813ce4eebe54f7453f7ecdb96e655b1a1c3f8314f9094242a2d47304885f53de7c2c2e720092e981f8680ffe8908f5e731a794cfc37dcae7211f7e0f8f73763ca4a9477b2e38a15028b5473c6ce8f13934a415a99497eaa173ae03815b9d4ed2a11e59230e4a6217fbf00f03f1cb238e6f8f6c308a31c6f8fbcb03eeecf0f08028a0df1ad507c440847e9b04a46fbe5542ed1b1f0f589ddde1d9e1d9e1e1611e6e7538a2b9a4062edd5d4a29a58470bd79811cb1bac32831e02ea3ec7690d085c4938d29a5ec1a66006e378ad786bb6b96b9944213399003f5ab6fbe1e0a027228acbaacf65880a05ffff011ae89fc67ce39736a34cef6a6df5f9611ea271ddb0c34d4e0e119746ac80650001d9e33c38dda0f71d47ee899ea6b74a8fd907aec9a96d337eb191299a669aa5dcab90bfa2659ac1c9e1d3da4183d39428a4b7df3c19e6a0576772369162c4e4fb12bf8471c51bb673083daada4bb1a2ba08d2476fda4e60af46ba556ea1bef689a4adf3492d5e9ca413f8aee31c618214b8611d01d3940f950b2da9b59426d58ee599d75779f43788cce10421c3b70252308476aba5e2fb7a03e1ff5870fce091cc42a5518b5ec8b6d07f232738c9c1520113abac71863ecf534cfabe1692f6e4b34466e862ec421f710dfb6764965c5abaeded11a68ed0f52fb997246e67477e756a6da5d35d7439b6594a652cf62a101cd529b7913b6a8031a63e788901bc6287c597577673ee5d0dc63d4ae1b4b748f10c618636c82fa7f9e338e841181b98c7075a0159f631c13cc07984b890b04adf82f8c4361455c2e2b2e215af1679886aec65fbe7197abc618ee9e14dde322d1189f6d7a48bbfa2bc0defd15e81aa3f42105a343e8eeee7daa81eb54f1f40aee0841fd4f39bcebf524066a0751babbbbf3ecb44dbbd49e400b8b1709c04480ae4d37059c4eda37eb32092a9c11d1639c713af773e3f54cef991e66a637c1d73c8781d5f0a9ddd4710ae9526a9a0d1c6419cca66719776ce8b12fdfd8ca2fe42f0429ecb829e073da7820ed448852edf85d758ed6c96e9bb5b1eadf8eca3eb68d933a6877f7138559af5facd730d6eb8f877dce694073c423481198cfd12aad15578f9c0efff378dcdd63d6edc015fcce451170050835a7470e08581df69c1a1dd7d32ce033ee0c9e953fa7fd8b3578c8a99153635f7303cdceb0eb325c888295f31f1a56454bcdf44da6ad945e2450fb9d7393698a981715c18c9414ed159647857e4ce41cdb01c440afa120202476b5f74207e8c73f3f4776f4cdba5857b0acf8e19a00eb7d8dd0ec7cd0e1d2637477f7e6660e4e814d39a74318238919b1c43f1cc4432e777838c4a494d279f4681c97df9cdf0522c544160a4f33082cce0e1db26c3d4de388fa84d41f4204b05e7c577d3766e0530edfdcd4d1d021801abf4545436b7ebdf82c2a7a522d8daf4795d283310fe204595a5ada946822cb284da5fe59e0eeeb2107bba4f207912b5776d57f8bb3537595bf721c74adb7a52268cd139cd04903324829a38ceeee1b3be749788dd58975f69c71c6eeeece5034726aacce898586dc629cf35bc6d9b1d626861beaef2a3e4a15bdbe813b4e2acaa572a82a53d4b46e21d34f55c7d32bc9bd68f76fdd107a429807ee6e8fec26538dd589b33526201c8210c29e523f162b0a0a9170f00a15333d48d1c86e01d1eb178da10650024979dda332d7c29700a9628049a5a9dc47e5e6e901d7993ea79cd27b6c6c3021e8c9cf5290be71f50859ca590fae5a80807eabe403c8cf0f9b155e299a5f1d19dbc1c3013e844024495496d8c53dac1c201aac676554ac6258826a710cb02bf8b2dbb136f06d4c403fafb2a057133bd8f35747fa2b422152a204997429e3eaec92aa2343dd07c04a334aa9ea66194d753172276919d154020eda15b5cfe6fb43ff2d4a539f74c0a8fe1bcc321eaaa68ad5a76a48d5545de3c9c6d4b4ccab1132753c55745029e79c6c323995589bb9d78bdbedbd64842c8369c29903465e36f4f4fc00f9f41c01619103fab1cb55c486d7d267e180383b9c27b548b239393c1cb05372a05488b449abc44beeee395c0471d895431020a09f9f9ea52525a52fa7763c8e36e99136678786886a7f3945aefa63a73252ddee470e3fd35e4f19bc68ac4ef7f4fc00f9f4b8bbd3581d7ff2c48913279ca83b80879e2780c551c0aee07bab23e8c72ecf355384c64b8a1b3091a2f13c560d1c3840f1604d624748523caf45129e137d80725e82adeddeddddbedee45234067077e9d28b31468f6580d5d17eff009b05811a8109753df5c43231430ceb59f6382084aa8f01aa1add630f5996d4c312b53fea90a49addafcdc70055e51cda33196075ba66567adcddb38cd2548ae5068e045d9d6e293b5f9b2cf39ac94e48eb8c504d6bf9c46374f7fae346b0419391c9c814eb9bcf74646a623232050167a4d0cf0433c14c4ca00969c666d12c32aa4a66d1944b755bb0807e936812cd24330683e81e79ba7fcf0792d5bec11f7e9c337a648f9123bf33d72ce394205ffce2a124ec3de1571113a3988cceaaf1bcede3217ec115fc16019597a8348d3935317466440000a080001316000020100884c2a190503c286a9ae81d14800f689a3e7c521ac923498e0329088220866110020821c418030c50481a34730de576912d14b9cbd9a0176b156079e2156016c8430a33d63a2712126694cca597d8a44ea56f62cc15b801b30514a5964b8ab439db0a06fa6949745a547b116f36c20da6373a07a338fcb2e94c2874e8abd9edf1a65ca74c49430eaf716bbcada5770f12b79b0382ee3a7555d3d0a10ef9b95817c19dc421fe99d2ca76dfdac0143ed856244c59f61a95422d64a1913b09c4d7d22219ed4c8f9764f94870a65f08ba9c1f420977551174538938511cf43d800bfc5f36afc05b85edd54504b8814f95f8550673b084af6a991a1cf7565c69a6beb12144a9241caa9f368d436fa783adc4e155aa55525ace3446cc2aa514276cbcf99b31fd0517561db2d5f09cd9bc893bfd19818118de24a2c3c9d69292205bcd7af35df359705869f7d4561539d9d830b3417f6c7df70063298729759f7c9056d342c7edcebe988b7d17adcd9f5fdc03a1f13a04f56c4de0ab49cc2a212b7c0dc06f05c4603e1b1530de29302778d23e93e6aae0a928b2117b670fc34c18dc1563ec6a75c8902ea54247adaadfa593397c56c0032b61e71314959d8477dfc00cd06b1c47e1449615bc9871ede547ac1967d46d951bf258da8b0d8a73d07ce1ecb63c1dd267d2154a31daec48b42f05d31d279dc8acef2d4439b3c6eee726971a74396ec355097964f1c1a7ba1d7e28ace3e4bfa323c9a7b4786df178a46d65844a0764d661b06dcf9b43d2d9c810a7245feda091cd787bb0690dbbdf717136c11da54c2f1a42bc18fc887ec251559101ab071da2ab680ff30f6488b0dbf1f52e2477f323870a45b80ebeb85426af224b6054f05ccf80ef908c28decf8ef7dd0274a64856dd05c01ed3a991c20002b1249e05c3416b90dbe281fa65b20b16d0cd8cb9333e1bd0f6a3989e6dee8db7c13775df0c7d4e29ae946b8101870824c3f02ea0485b2d9857cae7096c972a12a43297ab8a695a791aacbbccc1698e742c2905753fb83d0d699032ba90fccde94a00c95a93e6b1fb84dc4b3da6677d622f903a2885909e30a2478212f09e995b92157fe44b5dc7cf087c0ac30483a94235da60aee560488f189a37c5337580f6906325bd386ab16f1de470355541c09f90689083317c788cbeb865582cecb7c360f6f726272e9529254f4b0b967b5d324328452385fb012af65a6c15435dc2ccfa4080280d82ea9e24a101c1487ae24b393d1997eb7a17e444ed6e8356b50a8adde8fcb382e2e202348d4ed6a7ffd21ae4d45c2c842f673f4f952f71b78202b1ffb88491fbc2a7ce5f3b15184c6ad5bf50307d6fa25b97fd114b44508f01cf0af8c3018fb8316fb69f9c0bc36801ba1e38b70baab77acf0c8da85d3d7d024fab6fce7f00e10deae01ede4e0178e3326d5b818717c0ec024620b0f1b9bd48ba8ce995174766cd29bd674dda95090b805b4b352d5900bf1b37be6f01422d046ed7d381b8d5b876fc43b83519242454fd35aa20c2a6980ee67483e3c18edcaf594f3cc21b2a91a66c138f3e887356a4e0e6303830912f2a06fb0eea5e13efa610466e060d940d30a9385f00327fb2e04a38943b61635f2090795f066bc17d96f08b60d9f5de119b744cee337f5a537a94a3374899a42e7a9f6ee4c4821ab5bc8328bc371b47993112bf652e02cb8dd8d7b58b5a8824d45fa59d79862c5d861e416d9026b740aeefe6163d1da08ad6521641d8c9569c51bb0d9b538d8d24a6d74d6f4421780675ce06943ac73c086caedbb54d78d4d5ab81001666613fc48a3ecc56c9c44ec489b6290893c30ce5c3283d503c5bef6a30101341661d50a9c11a8369ce82a8693d92aa3e7a24556ce245a665b8098305f7f8ed816c607601e7c843482d7233fbcbb015984e87fa7382dd52689426fa95f6f06b33582b00e6fb2b58ad32377e8043b57e58655251d1925a266007ff8da507d30297325b66876463a3b144b5fab8b6ec7b56b56e2826faed65d1016efc67804864c4dde4213098df4585ca4156f5bcf0d828e88eede03636bf449a9f4d5ec8df2c08ba26fea6aac261864b21c3f066682d96cc64cdeeccbcbd2c0c26c41574aae8890db0db2ae20a986e72769ed7b359b91596ca3ee6ada873f44341d18a3fe50c2263bc28a579cbdb05225a2fd31e93128f10f4e5e6d100855703af73d684784c7548eae4356fec905d6987de5462989e14c391dc11b11b78dc29770a2d2d3dd62efc777e29369cb14cf1a5d9261b92021202ceb3f72da48602e0f2445ddd4e4c938ca01eeef07c32d0400caab7792aeea8991704e4be963faee2cc53e9cd22903daaead83d44c5a5ed4d914d102496f1853d260214e57baf0d532c1066b338637b48fc310caeb2799cdc92aa095028eaf4d92e780c0f5ef338e816600aa7e07d94931a6deeefdba89861967de1e75b12dcfd9ff2d7af1fe72ffedd3cd20b76d4367a5aca8a9be30ce17485f5a56641896495273c9a21a052e38cdedd25953ac9e161ca4f4e15f62113860791e84d000bdbb8e099fb6a6b2b370573ea4045bae78ec4cf7abc10e6fa39712e5bebf8689203e580808d2e853db1b52a31a5763490f4c0cab99e814952b2e2679f637e7773df84cfd3b5dbeb47cf025101586c1b327806abb554225810b71b1cd0afc0ad571906a25af5ab0b6e00c44b4b3ddf1445e8863f6e186618a073d9b1042ffbaf9cb9664fc1b62d083bba9e684299e2cfe94f70dace3bccfda10213562171914e4398ffac514b32f616d1b576cf1083314a0c5f5550e90133a220b3011c45de959a3fc966bfc1e4e1be7762eab1fb2c6b110d243d14232602865871451fadc8933508e46620393528ff6ae49c52b05db91b3ea9921a7f8e72b8a6fb2ab80e30726be52834b836a0800152092e5d661b95816c60651d0f624242ed387759cc867096cc7673cd0de2ed7bd56e54ba6ff78591de8f28a06cb54f6602d2005185f14c01b602d91bcb8a950b68f87303e8f91b55f2229421f9f67d188faa081299f0b68cca0bb9be562d448ac9778d496e221af705979362ead23d5c7ee341a24f9718fb6c69a4fadc930ed85c99a08e0ceb6e0836b5c40f7da969b0a0f418782fb5f32f776e4c28f02f1f5663284861f710d48e279c4ba739142c7e990e119ddaf22da5f6a6dd9adeb81e1c9a00ca146714d9ea46ec204bd3fa5a7fc8c0fd653d2ce3127cc7f035bdd2101afa370f53571a8ac23cdf6417faa5f011b7e84fd33aecae4c70f3435813d69a63874eb7b47eb7365ee65db7b4e5d2672616d078d4a3af037bc70ee82ad092e9dd6bfe2b7e0ce76392146d809f99ddd68cecf51f80cbf8f35d4ad27579bebe7071653a925cd2f4eebef48770a97aea1f33357711c90f39d900c176404042237b9d1c9f6f148205f40752cfdd7299d24629f33ac3eb1360b64b78e0bdb300ea93d591c57e2bc4aead45e77fdcc2ced6133607b9b7cce13346fc62780c94553efa99f58d63987b2008c8c7c41187a36b4cdd840a3a445bf37755e88b7d08f20039e8e07182e76dc037dd9bb9e95e0e4c64bba9941108cfcdc350fb22c0684f636b27802a0ad4831bee1408b6ae8cae87dc9f8eccc8476a6a8e8dfb66bfd138581aee98f1fc96a16b49e1c0986c841dcfbf14e8cc09c89eef873ee6569f348316841b000e9317cf33b8f80f9527ab26f7a0c5fb7eb3f7ae3f054faafbcf8959ae62809934808fda03d36edcac489664fe589be0163a1157cac5691323d195b1e35e1018c08c4de75e26bf1d54c62bc482890341054831011927c14194386763897ec414b805e4d7951e115b43cf581bc5d2fb32360eadadf080748866d7a249888e05ea0002945ed6f243fce26975bf16611b6774a254888afe426267818277a975bcc0dccc73b934b915fcc91685cad605c7c8b2f10a0321cc29202369a92276ca54c6583fb3c52b6bd2f9bbc60ad85b82a9709a24e181338e4d3c684ab27f884bb4c1a0384a6143aced76d7984a6f27115328e7b903a19509f3b876d26a1e97072e32b035d74b72779fcb2022f90c05c3700e1ba7cb257cf70992a02a6d1e93d4c75b3396c0f8616683d742cae9712ad05438c91b59ab6b3a2b3a6ce268ec139e01066c2ace2fc8d041309a83e7e53e17722b4c849f70246993d3743d2ca3f005593e24cbe4542a3cb46986a5220a8412d114aa34a42f7073ba0cd27916d40137e37cf68f9dd4c5d747910cfc71068ee573c4ce007c24b36a58cdd1f0422b56b34535a6aac019efa4eee2ac972da90946f505eaa98eb6ca4f16f0fe2c7b50640a9b3cdbaef60e3fefd21bfd08b0e3a7e8879263346ab633deca92da62d7b130fdb4b7b9f7db868d4bea47b589e61e0368b890b5e1225e167be3ed5ff26a11291702fb604d8050e57b59dd4e450ccd4207c51940ce9de6f54b25bd1bdaad359e42aefebef4aae9f797a90dcc5101859098a27164a622a0e98f17eb91b0f5580c5c0f44e1170d8cac7c7eddcb97bbb10f977f29d8fb888fcc99a2f5cb60e6ceafc252dc7bed8538bb890ccbf3585471daec88df0c8c38dce2439e55e552340e7ff35936a3c68183b5e4309dcc9d8364e0bc555fec90529c368c5bedf9b954c11533a34c6f4ff399e8af475624d5b1cd1f662a4be3fbd0096bbc6cd122e0d688e62b90c72955689dc2f123fb86321e7dc141fc2e28cb12c8d3f970d0494b3cf19044dc86c514403a1c51d1eb82c411db08ebd2953e26352ff56f7a014db6e835dda09e72d485d333f410436a818eaabb61fd62bc0c1fb3e9ef4c716e879c43c6c32880dabc0a12254878f3a4558e8b48739516a41879e284b9aed12695d12750f505196ac1439bbfa4124c72bbd9a540f4af61a8b52993b7fb5a4d5800a40ce9798697712aa0865f67faefc93a59c905da8c51b2af95f8c3a98639eb457729754854ab1fc50367cd1247c58284544084781aab42112a41f8302791d900f3ee27cc56e2b7127ee4e989079c0006cdbe9b6aabe3b258829d736825a183ffa6c4016273bcde64b49d6ad05f2137bb3cf71af59e1866261b27e7120ad811852e7e52fe88beb4176b4f7eb5c24d0ffa4a8c280a788f7aebcb85561e76cf89a6eb8aab200f3881be06934dd767e2bc174c45c3f3c6128c8c83c2aed00c5a18e48d39d03f9ff30cf704f4519d6a1aff40c4510d37a417ba360d10aef101335d349245f19a69a2f8259341f8036f527501033924c20fde5ffbb82d6d13315e387bc9bf80adf62a4d9e00e8919ab09ea7cb8988790db1a4f643e92ceb86997b9b4216f50f6601b07fff628e1e56c955a67fff2f41319f050e2cb72b5cf9ed97fc3a9da657db173b84fa69a3caf92a976a3cfbb594df000f7e5034a046176a52e5dde87962f25e97a0c8ca0cf395e4f352e2f1710b2e65435948fed96355c88a918aedf03efa9dcd81c1e286b2a4be4f027594d824cf860d93c1cef4069285f0fcf9dad5f2e1d1fad1f6224bd468871c8ceb0f1610ada36c395cae6fcb00693b85b3afa11863e893638fe81d5cda331014ab24590ab99fc7f1a8a7c9748ae57255725e31f834211e9fc10062950e7484d3f5a4db8c547f34ba7824f2ba60b413185c0967151713db3e3eebd59bb5c660a82cba7c0f85816130d46a2d89ab00111e407582a1e1cfa5400f860acdad44e22ac4922667175c3ea5930b861a82dddeeaf6cb05534e1d491cb9817741616af551b84df6002bc592c26e89cf5ade96ade7880bc992ded82ee393b169de773a083ee5f0f693ff08be446cd31dad158259a1313e8ad08f618585427bfcbb8fd728a9b809dce70bd006fcd1acb8fd7fa9996ff0d7f1654c2e97242d015f68dcf72fc04e373ba97f5821bad13de197531c287005150de7dba8757c04d8e5666c0419f793e331cb936cc1d7a63203b1e754131c1cb703376c3149ab198d89278f63a1011aae94ef15aaeb647e645d3354f7c1c94c35f255c270ecaee3d0dea0ab73f5527dbf4881ca7f0a1512cd9524b3479db0d44185cc76ca5683ba7c6f8f94576f18f5a22efb70142989baffa0e8a7fda62ac465d9e9f63e052723e0d3cf0af68976bb2fb3966e6de283d8dc74624a80b3a9663267fe6c25621580ff03d40684f65cc03934aa8eab4f6d854ee633f0320a0abad5f1deb278c913739e8dfa6e1a680a3c627ae9e2db12d16c29a53fef2726254d3e3cead627ca1bf9ba236a219811317f53893d85d6171e45774b5a70d4d2347b1a76c3ffe28fc8f5fadbb81edcdeded7216453246bb747657c6d6d77578deb971a51e66c80f3409ce8f93081975ec405528f13ad8d9d164de35f664822552d2bad414acc39f236dd7c5eac84e372dcdb95847e5d21cd3d309063df05da6dcd7f6debc0f8e00c0e52d69476f50a70f21dae80d55a940d58cabeef4100f898f94ec8b02ec3618e2b51f3f0810d1b437b0c9a66e1ae0dc66cfe966cd4defd568f81d82f268b905d88729847bc374d680781d7427197e86e28889d845189a6218575d8b51280f9f75fca3b3c78fd3a5a3aecf337cd958d2b10cf9936f1d14073e7d8f8397ff730e9e8537dadd0bd0022107f136e99e9de431cc7f7f52f2ce794c86ddf15944b0afba2309ba144c858a4ee1941740f93397ebcb5df676c60cdae6e0c7a98f8a40554dbe265084ea74d1a8cc5c5cf25fdefbaf66ae31cfc4b9322aeee17cbf156a19129cfa2ae6834bf4272540364b967eb51c96a1ccc8b97ddc624b2a3bb892912f98fd28657f4849df585030ceea978c0e3541d2754b9342a8cb364ed81f31cba02f39b3949ecd14b413a8782b9982b53117f3e82511bdc25803c6ef950f2d7fc8e77035877666f7e54bcb002dc9d6d4d1311712cfd45d4ce54a568a6178799c45f1d7f908c28bf65ea309adbe24179303e2625e87ac8d4b5785ac8158223e0b24d1db2e7c0a7e7acf138674842e3a4eed4d036633452453be86c307160672e87082d53ca1b03b3d0071ee14d14bb17abc42684d37c9182c1f59639e15afe0dec570878e65f75dc35d74d758c2f1f79785aed626567e0809e5cc90b00ec03116a1418b32a9ac64649e9c413fb0b20bbd7086a71939a113e9b8d7d873f06bc8bf7f606364a1a94acb7f1649c35051fe703748426ffa6130580b777cec48519215807c55d7261cfe41a73f75c7cc0b043a7a2440beba7d1697b9567c2b7852095a440e61f184985dd521db9bd0eb0ec6401b2b8f6e10eacc9fe353f0a4c6a5c5519030db8377f6e02764a45450a41992b03a25a86903469613b26f6f0609a1d7511ff3cfa482b63e2a6e972bab18af929022fe190820e2d16ae514c1e9b8877db5523fa0d525eb331290ee564085d3058b1fd4e9f5bff697218946b7d83b5e622413f05a06d7cc3d3ad5835e9c3c78659371c858c152336888f6d896134deb54e887c24b7c082c848d32dc15b2e524c8c647a12f6512dfa3bbbf0b910dbbf250068a57c231a71a2d64f628d3f7a4cb4a51eef028eaa3d914c93349b45460ba1c38ecf713d52151d73ed7d12b820d65af68cdbb683879fa853ecb8b75bc8c172e9428bd84d58917789de1bd7782ae0d312dec4fab79304b8b3239d8086e2ce7f8737ef928faae737253bd33b0cf578002741e6e35908d6e1d2129d7d9976b6e3b89c1123d641e252806be581cf8354dee3546c85d7fc002742b53984dbe0453035d38863e480a0b5960b5f3d5227ac48f616250441ba8aec32b705ceaedc21192c2d8255ac951f6bcbb8af159cb573355d95bd7077bdd85cda6700249653c470f09e73a8da210321929d22a281b991713667f7ec5331e471184b8073806e79537a3556cbae5832ca1fb5737cde3023a00ccce44131a8086c53c7e984f85c981875a16281b600e8d6152b913c574fd917682681892c6b7b5c00757cb4106451e058a6de3342428f8bee1b05646d0006771f17a5811d270ea98f402bd67cacff782243ed9c43dab80a434c113ce1351506c94e0e313aa6ec7973b4b3ae87fee1851b4b7452bc35602b59437835b3e1d136d6a40e8429b6b621c8b7707656afd13a62e0cd88ec2a22ca511e901e989995ce2aab4f38e8e5d86ae754a93d0f4f2c5a98cc58521b67e6140cde46f31d2720b1c940ef3d5648823ed1b53c080eb6e5dc63275774dde2aeb0c78b1e0dbf9a4d72c5f29ed5f77433ce68908355387c745b2829c42a4e8022fb1f232a7822dd066987e649e16e481b28a66f5939a5ad0fff2f59ca6786bb3aa15f8dcd9fb25852d73ef51973caf5311b2a489051d8af68e653939c6f2daa4a418a7197ecdcdf831d2ba4add435285a67e6db49423dba0c3dc4ccb5836f83c7d9705ec75b4f019bfb1dabe622b7a0a73242b6ff39e408bc5f946937d18760fc4a9a082184c2c5183d3f9a6e81f071a96242d6b0cad214b1aae4a3a06cc0f0cf4d287b5d50feea27153de3bd1c3b2ece08790ee74de111376d51bdf641acb0ecbc75bc735d1427d8d3be1f9350185849d781537e22673fbfdd6eece35a9a22cdb9bcc98a903d53f3abd2eab55e68ff8c8d5fbcd28f4e212582ba17547a6835734decbb1bdf54122509ee113e481e48a1ec1874257c7331559b2945db1e09c58f50d0dcaa80fb82748b79d5a18de4bb71174d3dfa1f5c18a3877f543374a95a74c56de223a795354146dd9814322b6b6b520c6e630de588fabfcb6b51a58fef58b37e5aaa486dc683cc6e7fe707b173da9b723b84bfa8683671cac0e22fa79fa076f02d0ef3757aa4820d66c4d49a0b227b585c6ef29e1e551c186294ff4a46d5e36a32081536aedae4b8177bb0806424a1795ba948d019da57ead7985825a588b171aee1231bf46612f34906dbb97f2c0636204d1b9cccda743e7837e9eef6a4ec04c4765792061fc33226ca3b9ce275add9f746e5e04a4ce8a9992760bd19516b64a9b6abf7d5838ce160e68fb3be6c84d02203e7752c41eb827a021bb3f44a64c34c6157f9086429c46f7e1a2da7e8d67ff0b1815db9b50fc0134202aba0af5bef94abfa2dacadc6adad97d9032e4567d1fdf2a6db5a96bcab6825ad03633b53a073ad332ea121268881bc162245acef4f500ca069199a61c1b235cc8c322fe1ee03726e9d8dabbe35212850014f0067356c84c54cf92b8298064a5dd034375a1bbaa4058b7f8c2da95b6b8604313e08a05cfded9b549239ca71a50b1126f3c700eb49d4884fca590519a8328e94f803cbf6cf54e4a209db8877c308eb94e2b596cd037bd0ceaa63773859658ede708eba86977d2ec706f26047a54ceb397328b31204e82029830a3edc1e8d05919d6594ad6794bc940ddcd930034b6df1ff9e8020223680c15d2e216d289961aa4ec4e7e7eb7204405ae2628d57ed8a680eaae32f199b655179d016ccd8143d7581140523e6b3a8f8948b7db2a88a31c28c859c0ca375a76b5d653e84ec9ef10be6dcfe1da4be9f26cb1690d96ea8bf60d851fd435d66ef8bb2c0a12d26d1f3527dc9b03fc8043f832ec93fee9fbb56ebe4bf9f04c6c6f49d92bba5f52bad469fed90ad05754707f292064bb1b590a05847973baa27f3189eef28ac9f24358e6db979dc1a8c2106e9c966c85a2c61d421b717244b6017a43869ecf8221d9459504db861dab023f36c97e197b1dfb2ade30656af57527907fce8c4e8e452194d1c206cc6387fc48f8b8dd6039aebe032b8786172db00e6025187f0127a7e80d3d25113a98303148ea3948a98e5d9dac38f6e04d9a2dc1e2873f6fbfc1d43a7b264d5567a0bcb76727a0012b88529ad1c9510891998255e2c25b8ceb8bff09782b873d605b3ba3af40ee9d1a7cd01b87122de29187cc3e865d3258c63ce52bcb6136e1499d8bd2bfab50202d62542a3bddff6b2746784355d592d9217013e2198523278979e4621c1a8cf4c1be27e46be2008d6d69609e21be645048abb642d9ff9ac8b031b5196e0ed61d6966443ffe6788d621c724d082b137f9403f9867bfdb792825b6f3f17b6a44ab655cd8c1c2d09af92561ee9f5788db9ae76e354444c7f1e9375d05e681708ee52b959cd624e76ff8bff431d05133738ef600d7eaaf162893f34c979480434e2eeb41506939030d9093fb6104b6f79519997f92140b600cf6537f9546da687024a0135497199207e64dc904a0489a3d8948638ddb0d8f261b2ff226f1c14b00b526ac77733076d019e718926e9169c1a80a0962af29d492493c2813d78f0c1dc16000a4117ff07c814500d604441fc13097315cf83507645a62a921efa810e9a25c0332d7a9e1365689a3aed987202a613dabd44b9d6392123bb8774f5993ddf17075c28bde4ff7760a07309d567df9b741cf1450d802e53f754445a373f014faee1589e0fe2e71c3da7d5a51c7b65f801266e446a3ee39cbc05d26cb899adde6a91376bf6223284036ca15aaa928dc110a6980558e10413d4f483eb29fd3ec58b0549ea1af52a3f127d1f0d824248b88cc80db20489494545de0ec78d2e6af7a25bd187af8c81531ea895362c3d026f02da324f2dd17fa6b788444416e06945ad926ccc1011817426eb51915119666a63f22fb8881565f0dc976df4e107ecb691308bb5318a81d9e966a17485ff12df76840e6b1121871e67915777f12162091b41a7bae51b0869812dd4227eb409a6fae3235b064956b715cae8dd45d179905c8763abf797406fd67baa03554d7b1cf1992d1bf91ea2e218ba61debe7da0bfc293c5d93202984f46990e0c6348b3b10fc72e8498df31f0ebf8704c5319503a7da75e95190632ca9bcee9c065c89743d6d4692122afce00001bdb2b9c45e0803810dbc4c824af9d24c86afea17298d6018cc54144106a152d6ed0d68823c077d77fc13afc1e540896f89480e8c0124503feb387d1aadb93fb10c1a271eada07a3ab6a9b2dd83ab6851175c08e5f1df3580de7612f17823152cfdd6d9f7b85b36a98a543d2bd2e9694dce1f5135863e208be3ea6177a8329f6274e72eefa2918b9015bf810d14e5673ad4f48d806609a0938e402afc39d6e7876127337bd955ef6ede26feed4d207e2346c0b32ebe1eb6c558f7fab062c02284de633eb3bb6790815a07a9db645ed407132ffef37b1a50c47858a893c372b8203f9d072c87e758e08f13b232ebc1fafc5eef9053a954e3c1280c071008f0425fc0100c5ad207aa6742180952ae532f16c50dc124f4a95c3ab82b84a2bde308a7b3b4c7787a2c15f4e1734006e3bbe9e9d781c4ee6e9173c80949c02e295233d85992e607384f254228487733c0080421bc050692ca084f1f85a9e42168c18f6f8e4023d041efaa7b295092199fd21c9a5c74c854502df06ff805bb5b6bdae341dc60c7da07ec26c9699d0e7d4b63b422441c7da9b5d6c29ec449cdebf4792615d687c027aee099e7bfeb917c0bdba601f1d4e6ced630103d314348868ebf90e4b046eb5163040cae23ba045a2f1119b18951b22cbc09c70b36e558bccf74f3c5f6c066aa62e78cb18ef9ff9c9629852920290ad633b3352e75656194fabfef8ea9aec608c9bc7956e305f6746b9b4eb7703fa8e54d6df80588ee425c7c1cad46f0a395b2b04101f30f97a060bfe93331bfd3dee205589179e41360dc1b3121f2453d9eaa297b9e4f081681a1f5a19f82cc357f3df81fef9e3ab138a2529c66f6e2815270964513046d4c2dea2b0e42d9b111f994425fd610741ca395019dd06f5b5b8054b7ad3de72ddc5e2dfaa4f64466d5b48270be8819f05b58e23c5d58be07fec2527d8342a2a3df91e1626eda816b0a649317698456b408b5eddc7992fe4f3a2f3f8f0aa5a37f0e316a3e5ff84a83299c2793657535c808eb405ba79d7a3a767b0300fb81210f1c9da48311b436439cc6dab7a49ffd94137e0d5c2d3f58de12ebc92663234f75694358a68c0355cbf27b75dff2b4c37732e53c0e6c22202c82b08fa20d2e8ea743d3b1dee60e61da1357113f1fa18f9ded24c56319f0037bd4c496141932af1847ad9418c00ddeaf7fb34ffe59b83b38f83130c30f9ef8a29e12fdbe5591a64dd5be0021a4b5b0eb4280ef579cf49952b3e19f73cdeab80c756adfe5c945fd759f60fdd4ea838cf7b3611bd7b79ff9a5d160b9cec387debfb87f68f36a4aa150b3c864e7b0d57dcd33488e7b2df9a42d7d46da66c4c5d6bd25f0bae62e25ba43136fc72ef7d1334841b2e958f8c0667501e61677a1ef4384aa9bc7ca21493ce9e53d161134131e8111417551a6b73cac21559401b80e82f92a746972d4d5c5437375ea6e741eb3bbdaf440695c304424c9c98634c781d03b38b0f9668fc9ea2d8b5d9852a95957b07686a1eb0a0950a2a48ed32be04786cdf4a4633cfcf0bfa3d14e4f5fd2171e60ceee7e507d8a462a540c592599fe8480329b6e35a699ca5a8101853937dd24a952701f14e2b5c3b2bc47cc26bb5092969ecf387c59d113558faa029ee22c4c11de06e0d596045f9dc84028eac861140137c3d7818f347249fdd2eb44254ceb54968f79a682ebada217da25d39f9d70448885339ec650d4056d1705dcb904f1af0f122ca3870208f324daf1cfb33c3ce5ff5ef224556f92d9ae757346505c639ef78698b5a02a327e7279025c330d43b96a5dcd94de2fb4c0fef0441e784859ddc34f57493492d85ffb9c50784a6bbdcb10934ed576cdcef794d3bc8815386fe34b65347fa45340c5c4a209aa235922191fa149d977cf51e1e67996979cde23e843095d0247ebf6e5a83bcdfa44fd1705fc376d66816111ac9591859f255dbeaed94a031ac64ba81f1f3b64c4d021f033ce3acdae77ce49d2fb04d8dc9c7f86fabe7d421024957704380b5e046d3089c16e7ebab9fb3a01ff0fb2461bee8c4cd13b354a3416fb9485a3a0fc801f7b484c6bf8b2089146073eaa7808403e078174b313a236aaa525c4479598055ab10088c044e3391c54127dccb735fd1d5389abe1379d86eb43bd9a11ac6983b99faa98def0b9d8db78939e74155cf1f16ac6bd0a4ea61b2de1a0e9ca75fad2e93ea7d15c488096d151eb64c3e8f17f28e262fc69fb757c5eef6696aebbb4bc4449d8cda19b7b81ad96738a83f9c8395f895e7c1c1f10739e350f91c84e26316517c6cdab9839676060cca43ad06c85f88b34b34cd4df4d6be06b5061bb569eab837d2e8513a7452fdd25635c3ac734664109a77f7e6466226d3b9736770768d6fe70b80c7883c9ad9c9d41945a0064ac336450dcb3bed913992dbcd492d105acfd165234eebb77dff6dfe56fb5bdddfb4f67fad40fbf918e1a4a5558126eaad24d546a89ae8a393ee7611aa12184c2cc8d6cf06edcbe5dc8969899b95960e2c749f226b43aef66fb5bfe9fa6deb6f9bdfeafe56fb37addf76fdb6f95bed6f75d9affdef3ac4e0365c78c9a1011b0fdcda64f640626cd60f03a7ee6d1695bb23884aec1ea4b1872c619c63e66428f54168e839893d861883dc5215012da67825054b3eb441bb019b2df030eed6fb2a73ea343e93b96550a22ef744f5101860396ee4abe69b552ab2d695103870431c0436c8813f8203f145ecc21a094e4e129c94e5eca7a83a1a42134c2dc4402c7457c000175a6f0921c838840bae5d03cec59cc542b734d630878d4724f48663635261d16ebd57c238b8cf4a28565d77b18de1a0c4c88f311ad8cd910cad511f8b09d82783ad66cebedad83e3c09ab0661c330882df31a99c4dcaf5603db1e9071db2100b61d0013e7e00b9cb2d69300bd31d45c41f47cbd2841f8670de3333ec2aba2c82192e000a4886722d7906c7f3bd1837326f101a38111a16a05e9c9fcecdf894de83a3ba01a0eb6ea94950e946a69350c344b02c0936d8dec7c858e10eb628571f5e3ef3e7947ff867fd5779800a1498cce95a8d75c54d3575426c4787bb52aa1b443da57292f886e49e74cdda32326aaf6aa7d8a5173ccbb8be839aa395b651c1187a8870753740348ac0ef01a2d826f74105e8628aac88eadb829afd47bacc3d1b8e23d0880019d024032e8409f185381f064b062c5ee18e81b11bc9d219f6e1f5c1c14165cfdf787498143471085a0e134f8baa4be14e895ef4952274935d7d7c35a7cfb9cd5b46ebcb3b007d1496afc722e69d07518f79f44b021d98944532dc6639c82a0594e0e927f7553376a5c5aa46fac6c06ce5c4db42d1b7376fa441a19049c6bcd3270853f2f5f759e1dafa78bb04a5019ff5a561824203f1abbd7a3e553f7346df33fba9186158cb8c720169aaa230484c71b4e83bc7f9883f629acc910f6ec58156ad8495841d3023108102ba5c85f7ab3dedc86d1753e184d30a1571e0d3e9090fc88036f9cfa001ae4256fa1c45c4d31aae3ec942d2807843e44d446de916f3c7fb08c1b25df1b539a8a3651af31d1ff2fc9ce7352f260e56e6033ec751ade8d014dff02edf9f4f3fe22d7889cd8724ed3ef3539111c4a932a706a1c54af9af0ae9e5b25d3d77f92092a8764a2bf86a4a162455da5b4ca36667df4f99f8e2e4139481511415bb1dba9036374759beb7f52752e478f83857ae99f34b86e1581457bb9481d0a11aa3a648a30bd34300eae48e09b6811731aa0bfd23700830a76eb86fb09126a9823f816655209da3a14e1b784ea7a16f011865c17e56e83d4a8bc1aea95ccec18b7d6e3ee70b2600e4f0add0b886281c6a7f0b0add3ee3147db007e70dba154c26e3b7375badae531a2e3748fef955e6bd34d35784869a468a1298ac4671dcb3bf1ac33c4c47262423c37da69d3c1df7a14f1ab5bb160d507dcada05f87cec75ae55919f8888352f69eb1e4d87c4e5a9ecc44e60e080b97c77bf88a97171e8b83c97bcbdff31fb2cc7b76a59f3c40688bce92fd2ab0bf610b1667009bf2a7f4932e3729d3685725c59fe710ae4bae0416ce57c562e04913552b1b4b4e9ba203b80c2f90111559de35a259f180de14ffdad408c4e72101322287a30f847703024e4f406041480282dfa4c61e16dc886f2a23b6afde0d35113176532dae8fdd91a494b0795e3f4804947e66a45ba1a2168040c1d946e92e3a76f4bc97f89ad0c181f9d951c1885639b22d0f602369625c9bc06c295c502f88d750fe22d15e3ce3d32a98fa6902fc651540e69bf69128f6a8a0e3946834d08eaadf4d4f6599e07843a29c2864376aaa69a5bfe309fce54dda128f02add17a0ca2656476fb052395595a1a2e8555b8bcb6eed8ef56a540210c1e57070ad3d8008e531da2e4a95221c9dfa7d9a1b3a6cb309d98e934e25f6caf79cb4b6da88c39a79fc17dac53cd94dbc447686acf001d52ca7102274365c9f80057e3d18ee92797053d2abb0a2adc9ccaf9295842125631673a1ba001db8d89311512daa1011bd4955b5407cd27043c46c6f3333a6df6c4c2e3b22cb496656198d1f9a1e7891610e2175a8909d8f73093a95b4d9acb46e73c2cc229f8d5b569a3f37f3015d2d9d99d62bc45027cf042f4297d6d3dbbbed54345f52673212f24feaf44fe0ebb1e44276199dc07c9f08e7c5db085d6a9fe1392e135ac0b16d9ed5cbf5d1bb0ae3d0856ef34b3692712bf5e8612f804d9d3d65e54e6b27c6aec766962c6a52d9096b0e8e279511aafbc647a5ad70866aeef2f035710405cdd51117a086f03ed14b92845f91b41b7f4cf7e4cf4e808804d86dd0ad4810aad07cbdfa4d6790b5b9e838762d7007612a01f183b8a8fed105eae48d10629cf072e2ce9bae5bc4178e3869d01fc6ccb8ef0600379150c46fc68201e0cd4eef1eb069f864bbc7b1dafc289ffaec5e9d1405aa48e500d2b85922246a8b5d74eb1b40a2b58bb981f5910e47d98fefb59518215ac4abc4a70a0eae9d2a72607512d4cbf2eef435dc7fd57f9072b3ff0634a73f69a342d30cde4407d0e03b6263d7fb050cdfc393c965a313eb847b3f09786377c454655d9d0233f150fa71b6ea0c397b4baec897d6dfd5092c591f2cd60c52c00ba9108a8279712a8a7eb5fec9cd299999e241abe8023422175609514a6ac749595f03fa48838ecfdcd4680dbb81f78044e9b1d69018ab88d24905d101ab0b570f6f72aec5c3fd9a225f281c44c36a9d3000048522f5cab3d48532b1fe41ebc1f24ea81a84cb11cad6cf73918a6dbcc185f2f2ff53202b89bb9847678514a24a6fd4439b0bb6d9ca9265e928705124f9b6fd4cb55c4eecb8b2a26dc82e12abfb77161ed6fb11b8f08c3260ee094a60b7afc4fe11c99eef528d6bab0fcd7ee0dc0a1caf48c3bf07a27c16bf72a4983e57732a0649caf644b9905ed48ec267c5ec93b2c7e85aaee92ff5f78fbade401b27744e9d83a6d10ad3418807c81b9b22c2ae91134328eafe0fc0cb8c2b260d83ce6ec51a5580edb8983d0060710945b988b6045176df65258831cd87a20ea510521b62547cf15251d525e38876485cb713bd437b3a61da0ede2a32aa46ebbb0570fc6f4b8abc0847cad1abb809276b8cadddb9339df24100e9fbfaa2a31664d7855b52f464fc861a97fe5b704eb340a4be06ddb3c6ffcac2bb42054b74e417c83658a5a43d12cf138ed58d8aba5e248ae85317d4d1bcc943520fd824a0f10aa157c01ec0aca9da05041b82902c1600f1ac10242b095a2ed8af0dd8594b50e39200fb150e2401d2406b02e0303d12137a8b11eb211c832b06c53871820129a50a147f74ea4c3cae9c62871bec082fd8906bbfedfd5996a4a1d36294f28d941433ff1e2d163c62e16d0cc5df34d0c358002bc9a2c0e3dd871a8b5bdc5c03045d5dcbf733fecb84a0ac1c18cbef9d787a21d7217a84c328de6bf57fe141aabfa091a6966e9b11cdc5bfa7e7d7a5d3b04edacc417716680212e69e85f94ccf4ea5f656961ae396760a9da1a1c45de742915aa05b8bb8010477435ba60093392f43d4adc635c0497c4ebde960aa47a4ca384227af57d43008d7461fb4fa163156e841661a5c71d52320d2bba3013d2b9d41d582dec70ed44626bdf845a87631e70225269947a3363c6b0a52329d808de7706942f2b348d0901250f901de4feb156ccfc87039d40c53e379daafddb206fb0f17637aa95dbd5b7e1e0794fbe997adb35450d7bef1f76a4cf0934e3610f031df15b3e6f7aac85cbb212f035b35c15643fea561c8daef4a293bc6277df95340415498b6634833617bffbf137c109bad7778030a314227efab112dd5905302893f294292a4d7e5ff0233b0e46704c02eac838a489496ce9c4bb2f11289c40016542334237764423d0d969e82cfc7a87f2e4c61ade339d3d6a0a2c0b0e9afc74a0bed3fdaf2203f395ba8d53b0f9030227dbbc00e8550ef38f6c2c3d512ba1b674a0d75c6911815af01b8227d1002d3ac32c49528596c7d2537782b87c6efb7d46aa0d3fcd24392f38f356154195c56a47331209e6f058402249b1df8e81ce734a703d99fe814e4420dd6c3854cb7dbe6a57eab169c863e9bb6dfaeff245e3b67621d700f42cfea21c1440d81bfeca1f008fa1b6bdcb65a49cf8ec8f3f97eae7c44cb4d86d16200368e5269a070048ed0fec403a215599648e5a9738fc7c6718452615ef4114345ca3e777601429f6f7157a967bf32f6c25d2286c9de2290b2f678759a0df12fcec002b0cc18e37f7078aec6420150f68f1861ed8c5983f035aab50163106726ac71ec46f1ff12859feb151cfddf9e3163c533c3d087190061bc6fe0dd49e5f59c35cf282f4b889e6d1350a1bbd0250b403e2b9b10b31ddd7e93fafc56b157b54a632550308df98f14051549aa779f64c784880d2145049a2c160ac4fc08791df6c655240ca1443df18c8ded7fdba81c34c00f7ce722ad5164dd8e3cd6cb0c2bfcc30510baa00c9b444589aadcfcfef5d00bb36fa5ccb732bf5b85f6ef3f536555b19c386e817737a580159137976783618e3ad119ef92718e6510a591674364bd7cb7109899f9bad86fd71d1804dd6aae54dc49d98dc9b62eefcbf8493fd31ae274c1ff4c08521baf19d6cb7664f4932e42ea9d698118122433b3feba0895de2d2a82c7b109f8fb3283ad680346590c2feff5e690eca4df0be81be3af3c55918cf699a6a37268e7e0858bc59683a40cccc50cfcfd0c08ede2301bc8e9634fa699678c143bc73d4a0dfec4d67f445945b45c050019562e2a366bc5de65d530e2d19dd4b1d2fb516dacab4abb305456c4c7daae29a4b3b455784be64c1fb840c24fd4aea1e1b11ba4d8531a44a8f9b334b07b68c262a95788c0fa3c04cc39d1193c9f8a484abc8c04cd6bcd9a0ef5c9ee932f1b1483769732461a5f702d725ac76464e41172e914a29e8a43eac2c3ffc98ab100c72bd74b8c1ba2f8c4c2899bf5821cd9c4d106032371024047c24040a2317a05b3054b24a0799e92cb0b8a3897b817ddd2944e71fda97e6d155eca77fc2f5426ab874ed93cebc20428697c756a1f307aff1f3e3e48c0f00c268cc0974138e5185aa16a835c060287f972b630349f5ff7f49c8de7b6fb9a54c324919c209e209f509dba54dcc920e917c38fa7a8dc0a74ffdf422d333df260b3ebcfa515d731fd5354a1de8332ff5d5c35e5c1ce340028525f90f138281e70bd56347a4abd78b614d86b08b7209d16b67f8cf88eaa537eac527d860cdc7153d466dd48151276c83511ff121bca198c31bcc3f89bd401d986f329658aed64fe503f5f25217bc19621b77d020a00eccb10bc01b98c79c09666146f006731f76310b73ead1261d0cb34589a40d765d969d061a80c4afee033e751f7066813cf031a740409e766c5a790ca8e9b13a8da87b15d592457a8c62cfb9e456258d329d0fd4f3b5f006f3118cb0f23ffbd5f94775f81cb330ce2575a80bda605e2be77accf55c11d6b4727dfb3682119675a833763727dfdb10bcd9362ddb138d11e451e1dbe50dc2b2cbf9349dc2b04e4adf6e83ed098ba0ef6d8b6fff38a1ef2478d35158e9dfe6f46daf6f23024ad436046fda695097d49955a890d4a1713ad92a49ffd1984e52677baa4e2fd016bd9b93b431618afda8d06f4edf4e13fda342dfbe0d718e5ccd18d05443a74dac2344da50a707c4f73c30ac0fe1eeea87fc18c0ac9f1f77f44f8721eec87c4e2d36490d411ed8c44f9f3ec30d5247c6278e8c3ec01d41a28ee9133ae11041f1c34fce0a759acd398e522efec65969c2710a32b3f8e893067df4f9f41342f17332c95479caf4d12918da01309758580cf3a0bcbc5c19a4cd9c9e02917d711897e133ae848ccbf021322e4366888ccfdc1f973673a6a69d2f9e72222f7785f98b03b5524e0426f5e22ff707e5d6815a36758f6e127b51d7a346481fbda34b1f5d6261e95d518735b8b0d9a54f510735fae8980ccc6a77aa9c55b141ff60809867fe41c16e50769128115d8922468c387b74c095e1b2277360d93f9739b0b30617961d4a965d1f69834364e9e64a0cd13cf3ec6eae75639e39117a57337322f5aee69d3eef10ec873ae6402d2cbbf526c1e86df994c5a94948083e262424242424c4595e3a3bbd746eea999920a08dec3be32ac104f643cd30410d71ce37c3e4a510e7b48b732a6a09e77cddd14bef192671072a48428e8fb5e65de212aa4221b061647bc52b229857c7bcde4884bae6d4b5bb02c27e2f472111cde9c541091c6aa58e5d185711c332c7885c1cb26baf531b29b08e83c362d93082b1fbc177f583959a5879a097154269d34ebd1e0fe8e1037e8437cc0d21134dd2f22cc49f1da3843c50eaa0e59de08d44b9325410d046b2807abe28d793fd665c8f72cd081177a084a28e99269cf37593f39e2cca157734e11cc8514e8712670ee6a43ee3f4797f80aa03b522e6d587605eb10834826dba9c4b9c33a9709e184ecf7ec311158e844c4fec079d8ea0be76b1d3674b7a577978c52f5179b8c42ce8b40633399cd80f45e36db1abcaacf89ccfb8a40eca056da4d73ae362940be57a19a713c97c3a0e945bdc21bd641c5a3a11ac5e289bbeaeca4369635d2f77801d916ecdfb83a435dd87e7b54d98258750ae12b058e81fca5584dab4ac52ff761e4b629be8543efa165d8b9e458fd1b1fbb1e853d411bbfc37b37cf40f0b9a4cb3695a6156ec60c0829e4160e37f95bb5892222c0a1584053d7b09586cf40f1584924a12fef625d1e474440f57968800e2ca900e436009d242084b5a585e41ae10255d091281d51e264d51c414b63e4c9a4203419a9e643c4cb20118df0f939a8a5210219c73ce597b0a1bbde79c937960c1135a1369d0e5500b49e9249b24927cb54a4569236d1ff8d6410e48c6805978a0f60b5e7a64a24a9b7c2b5fd246be7a78f54bea4c26eea2e736fa792474d4aea31e62923af3f56a7a39cd2069c35e91ecd2917ca9aaf45223a954d6cafa1f922326957627537c21613a3a3a3a7a0e0a7a513a5fb24e97336806cd201feacda452592be9fd64f8795946a6415e54968dd5f550072eba78297dbbc1228397d2b55a3b47fa10cfbe0233334711458de481eb250f74f0495c8c600ba767598b3d11841516204501c5113f5c8e8cb0424b131e88d2c23ee0849386753d64effcc759b912c51631891346dfbd6c9f5d8f8e36ff71505839da41109ebdad952f18821b610754683ed0031655827ee0c3095a43a49452042fb597524ad95226ede0045c6d4a0335b8d88e396260a39412494a49d4dd4cc826f6986563e2f3360108cb8a4dcc7ac1d7c05205f0867d9346f0e6ca224964549fd9ebaa3d3acf58b5d7c0ffb158ca2e2dc42cb9d404121f75921c382624b1b149d66a6dd3b3cfa03a46fc2dd54484d128be5443d62594b5cb50e1920fd481d0a10e0b879923e51a5cacecf172bffe17daed304ebdbb3b22c9c425991b9180e8199771497dc6619c7a289799f13a9799f13897f1fc379799f1accbcc7829979991811b8c973985f1aa530ae34da7301e3bed86f134a7dd31b75f607ce48b37c35baf86f8327ee065cce165161f6ce2f36810049657d00f4fc0c00932c1234ae795ce411cc441481189858298254d00c27ed1296a894e318904362e45a412beb03126c64cb1d98d59d846ba94fe05e0e3e59935b8583621a98986f8f14ae761b19f2c92452ebc7c77ecda31a397de9e90d8246da4b7012b8db02b8b4a80818dfe49c8037558b20052361bb1a44ebc52002e2f1d081ca55b0bb3643ff56da7a6976e4212fbc9a222593483343021fcad35e7aad5d8c253c7b0235686a742349fb57acca026a710d537ea6d3f40adcdbf2a6413c2cd49c4bac432df380f87cd7f3a6f4564c3a1c3a1f3cd6337a4cb309f98f5aab4a98e09e1ee0f508b336221dbfd8942380cc38648973a5b02ac6ff7a7737bab0dd89094a3a417944a80f4cd6d13db90f370e01c1527d68fc50c49ca3b8747d8874d199ece30bde898075fab9f55a61c94ba4ab0a32e0edd0bdd5d0de1ee8ac8e6d2b73a6473eefe6c1885ade9d920b9257a0096235619f66fed18977d0c785a318cbba11e793ac353c738af34c848039b9e616f99d8afbf2b867dd4cb30179866bea21e9d76be55af08e6dfe6d5336f05042b4294794536c73c763f36c76ee77dfd5874cee3a8718f2c9cb2307a76ceee97d523ec5f8cae459216aec7f130290ba48f9d0b9c63f7db9cbbcdacee7e36c8ce0576eaecf487035c908eb955621b7691ceb52a8db06ff57e4d6bd6353bf2d486a75e69f899409529ad4cd901ecda2d529dded50f7a574030978eb9ec56c75abc1efa86fdc0bcde0f32ab529fcd25519bbb6347666666016b4e4ae9a47462dd4d29362785526b55d59a016dc596ed0cb8a3aa204f7b8d3b688056eac4e045151f2a9bbb6364d657652c33f33da2e2c1d2bbc28582e9e0e0b072bca258fbc9c848e963630338355689c990353f24736240d42c519f186358ac21c222d710d51471ce578394440d1124923044af79110c91b439aace5e74f61aa26aad8a61340fb2d837efc60d10159ebd8648ea70354491086e2a681f10bd5034676f5e8dab59e2c11416dcb0c3185dfe8bc01863746129a564e588dcb30bb69c0367cf49930234badf6a8cb0fd66c3b3dfbcfadbc57e2381fe56337fbbb1e190bf01807fb301008b859217f360ab67cbc9746936953cbbbb79ca49e7a4146339f9c2cb30a0419689259b5282f042931284185915ef0454849085890d2a2086069e5c2085131642489a22440f42a030106441449024c612cfdef5e56192184588c101d80d5dc239e19c734e6fd8ed4566dbda031a2f330bd8ae8f79ed84c3453e104328045dc0a8a24b0fc4e892c552172b8ce8b2d405e989071e9ebef042881594bcbeb862081f8abea022b48290d117525c2bf85065cbccc2ca20e1c4600546501981b685ca6b7e91fd808a10555505931fb66d76cf49eba4f4768d64a60e21e6957358ccaa396e0d4be6ce61960cb1a83d45963de9eca658ed9a499adf3c729c93d230d4716993c2f7bc4fea7de00d1336eaf858eacc2aecfacc0879bab52dfab48f0ff5e9ae6c5f64e1f8131ee8eb6fb3a3d87a57f4510ff41b9d4d81628c4f6c9bf7ad7264fd04fc56dc673046b16d53ca8e31c6eb6ee359b38699650e29a564296bec1338b3aa07dd90639e2d3fa0879b9414edb84d7b999bb669dbb6715ad723db5eb8c65a6a4b5e2133864520d3b616d49a6990d58eaae12585acd620f0d2e3cceea4df1378197bcc29e551e782c8b227c56aa66d5c874ad18edbb4947d9935dbb2ba6d9cf6f3d230315c0aafc1b064e5601d1c66085beb7a4c67815f1545fbc754e69134d626ac3736bbc21f73625d8f49bb1ffd10a3282d2ce8d4b2cb11323d9bbe1a1d679be860c8a0d321f393c6cf9a9f6050f929839fd3ed067ebaea033fc3d8c20a400e2e62541c3f2cd9d85044e7121493482a683c6141002e1be0028497ce0e45d29312c824a59c82e5a56c3802eb830dd6d0a9b2ccea806d55ec0e507d9bc0d0cfee79abf7845531b1d03feb4ca96cb61cf2c067a19a208f0a743accc97c4eead912c2b09f3b94704ee980fddc7d6a9ae6d06934ffa6939f997ff3023f7d0691f91ce21c17e4e17cdecfc86c7ad9014b299c2e6f369943413c3b5131c9ee85d9ea1c68e8679cae9f3eecdd6cfaf9c517666b7a6d0ac0d35b996539e9d57a4f58d6751398d8e8ed4d29f0863d7534831fbe28026704767b98f4c510350876c6102a062c7dd24060b31f08c105c5c2561d604b6cada20261332878605147740626984a36f530490820d87460510f93848001ac055b86f0013bf330698b46650bd3962a3e2bb41024694b111d420a8b92eb098b141faa6061810f465848b064088b114ac240c2d2810a2c61b9c00f06100213961e80304017d7952e4a0cc085e9ca5312037ce174c549c8004faf2b3c5062003086ae5ca1c40061046d21c2308dce96383829ecf48890847ac0720f93aad0210676c6c3242aae0461611e265151057681242a64d0c5f6c3242a9c58a2a281212bc2c3242a92e8818a0c0c61e9c3242a5cbcb38587573d4cba81d21217db1777e00d0efde850caeeee962d25c7ee141e28c6c8029962d970420aa59492f2e4e68b6296b265c76d5a562565863c6d9c604e6696dcccd6a6a4aa62159352b664e68a554cca96b14614cc12325bd4641aa7c8b227c56aa66d5c874aa1521645dbad7de9e60b0c0713b3c5c868323359aa9ba93264602f0255a9381877cc87cc9ad133389fd1f5983e83a6a9c32ba8304ceaf1d9f11d75409e962ae992258554696363091d998e3bb21c35758337ecd8fde8b3c3501abb5ad1601a7147c755af82533d4bef4b0dc8962bd72abfd648f26ad4c1fec235ee801f77d887bed917abf14a0cfa5b6afe9692bfa52004fa2d7af3e7c38f2373e42b5db6648c316e2a2d35a75b623b9863d441674b8691259cb3461433071b1d87590ebbb32f521be378c95005a7dc52b0c692451161b12a6f034b8f178759d0bf0ad9a3b4819c740707078771e08d6a0a9c38293029562bf62d719019d5e6d69cccb4df3aaeeb7a64dea5b41c35b6663938145cb09302b37ad88651c0712902d870a080342fccd676718a6cf4a31fb638e5c762a96cc0d2ea77ff34867dc71d10ea60245c6936b5de24e748a9fdc6715d0fcd39474598e3332dbe40cb6a30aab1946cec126c2e94b6a405752a3bf4152e75614eb2c469ca8e059efdeb599af0e8c811504b74c5261c9d3cc717d10a9e9378ce9268633cfb17ad3c17c15e8f20127c622d86b0428a2bba90e20346ad2f36a580092496b0208a962cac16197cb7f39d6f5d8f0e05859e7bface65a4c046ef50d16df44e5dcfbb2040dfdd1afab9edb298b055685a1052f09ae60593d7bcd8e23555fcccb1ae47d6b57af5c157200c7d75daf5a8164ad0633ebb1ed8009e3a5151adfc54fac153d5690d7d2a6a62d4a52f8eb2582dab1d7eb00ab308bea1a00283efeeee76e278830bb1f87234d105932e9a7ea0e4075cf840e919e7043e70f25dc1681bdd34bea9f8f66eaf4a7cbb2a4bd2777b0edd83107c77ed6ea426a9eeeeb64958b0a83dd860cd0a739ac1ba85375186e830ee80ce8e5119664b8e348883501dc3b0886db2d65a6b7568848d58acd56b55c9ae8e79b156afd565adb55257add5656dacc6af9487af0ee114e3ebdcf2f59b3ef88ad5aed43faf1a55ac6215ab58d5eaa6611a8669b23acb0a44734dabb5d6eab556add6aa55da8459d5e90b0c3b50c92e7531abba0945367a7558536b18f3e8a50ec736d13f9f45acf65a4737b882204f0dd335cfaa67577a5b6ce69c65712ecd25a0c8046f249603e499be596fb6a697d28e82908424d32bcb9cf3c0b0d4677cfc6dd61bb0a0b88326071c275693333d84920a491be92ed590bf58442f8b5e62387f73b01f5c2ac00a08f5c9d45a247a3d61563b0a49f68b2f94f78c56fbf4569a4f5ffd98d5a7033df5563f2af57a2bea7d987ad483a40ee4828221252a9050e24116ad4eba52f44237b4d7d7ebdb9948cc92492f99d8463a0df227956cca667cf2d12c499fba417695aa289ff155035b3da5aa1d4ad35ef3609697db6b34e51bc6594fb6a6877abb858d4e7147f66d04796013d55a95ca5f62d82fbe56a8cde123c527c803b9d51e5f55b314f60df0a68168b5c3b803f3e928af7674bab5e78d2f1b5ff0a6ddebf245a7f67ac59c4bdccc41e424756ec831036bfde5834f4cbcc6d1265ec5a7af9f79abe8e48561a9ac3ebd2a9f26c713f68b4eff2475a891b7533020cf8fa1cfeeaafab05633ed46271332c04dfe9cbc11f8543dfa342734b1d335af52e7c533cd85ce3589f25aeb5dad5e8071eb4460dcc25c28adf3107355d5377f71a0efbc7a9de655df66f8cc27eab2c00ea7b7b916bff3cc33a2face51dd8d419b7703bc41eac4d70d52a7b61abe3c0b1b9fa213b34ce8c162fe456ae46d1b573deeb5cd677780e89a03fd56bb0374502cff100e9236ed246d3ac6617cc66160ec1de232b72d0e8cdbce5f88c4dc5577572f58dbf94f8c5befee1098178771a0168c951e233d09cca546d2463ae7120b8bf2ae0617296f437950acc32e01f60629515d89d58fea28af8e4239ea16d13c7a55f27aa797de3151a3eac5cf3c8ebb1e42340a06bce1a0047d76a91666c9d5bf98275ac4ac1eaf5b391e04eadfb8b48859373cdae3c9162d8237cfc3658bc7fd41d2eab99448daf08eb7bae13c6edc1a88ecf01e273200e7e13dced3737f2a8ffb0337a62cf0867d26c939e6c9f57ce3ce202d5919bf41f3ba342614d919ef71c37d3805ffaa00fcb33fe33000fea97e4604ff6cfc8c6f59200f0acebe31710e8eb36f56588700cebe31c1393a9c6f9c7d33823c2798e09faa04ffec7736fed5ef3a967ffc29877047741275b0a75c05afa7083b29112c80431e2fc0fd5139ecacfbb00ed6077c1cf701ff060a8ec35570ef86ab80c3d3e127b80a5e7c1c1e8f24471f83d49953a04dbbd2b7a770bf6a836f170063f1ed01e069e5db457014da09e04d26d8a61dc79b46cc6ad7e1cd26cc6a3fc19b2e78d37ee34166e5b8df1c9a4ed8a6e38e1904d4d133cab79b703f5512df5ec2936fb7b917f876961300dcafc65fb9e4e13e0c7978d76b78ec5ca0e1f7c28e056fe515b91eff8687c37da4f4dc6b3cf824783d40ef4977dff156ed3dbee33cdeaa6f0d29a4200b1cb47e761c09842207265a4a48e7e13c6e5df6a3197aa719e29ccfc6e8798759343c6083700e0dafe1ec2d08b1e1c11fc16bdf564e98c52be95ed7c55bc9db3da1829eb034afd5a519ea9858ea1fcd10911dcec363476400dee3b11bc2e33cee0fd38089168fc76ec88ef7dc1f288516242ed0da711f49e3c19fe101bdcafbe812366478df9432e37d9b0fbee98af1687298525294e8dba43ccd946f0e695fcc530d911deb9e763c1e6fab418bde955fafe99eba27a943334433d43dc9eea97b7a569a82e5a319faad06ad1d1707b6b6c8f124400062e8a04a6b0097b5e3c1562fd98f65b301e5b0f712c19342de1673a30b2bd3b9854e3dcf11f2c0788f8064657c4675bb99da671c421dc7c9628cd228120955573cf2a472b298ad55ca8871cd93f1fe627cfd079d8efe834622d38c6f3371e6473f2184112fe37c8d44a69771ee80f413423c7919d8c95c9c18184f27c87e3bec3640a7cf061f214374208f0ff86d03b3e2123454359e6c3b0a05f6c55fda3b3fa224d290b90ffe2cf31166b0558c4e2391e9534c1f639c71fbbabd0f0bfa7e7a72726a6a3a8248d15938f743f28af1e7e8db37a734fc7ceae8bb140df253a9bbe21ca23c1b8e78f13d0b587fcd09b584ad0e80306cbd324d6ce6f9161db5aa691984c2c55a2c3d27894c5a34fdc775152dab9811cf972333928d1e6c89e0c1966b86555684a46850ec10fa61ab80162e680737d841070bf880054858250b204981c11229868432f03245084a8d274b12892de41414833460228ba02b48d8e04a152e2830c10503611491012743b0a24ea9401631f206594bb1b2a3c9c98911cfee23831298269864c4b4ac7b36c69557d8a22861f29fea099b3d5452c2c3ab96949404f150ebd5303a9ba60542625800fbb0e599ef43251fa6f0c1091553120d22ac746700e7c0dc18bdea9bf758bd30e3314e24e5314e044a9b940720898d71194742ea7ae8c53b47f926616060601ce8a57cf1603cebb0ebfcc5dece40d4d179cafb78e93bf79128af8759bc734472d77ec6f7ab313831dfce0b46763e3aad416c38f21e142ba4059f17a6466c10ea64d5da54b794379bcccd6e668a51d93dbb677743299823a639cece11929d96b9e96c86ccde53b60d724efb566595b2bdcaee6ee64a5972d532b65de79c933a63fe4daf4de90636c9cc118b0380ac56edb4f4a802640dc0477b6d0ae4a547860ae8497b4ad9eddd824db6943c008f5505c8ba016da463372f1d02796ef6972d218437517a41a7b0f4a1920f3f64562ceaa19290185bbc50b2c549488b20b61c255d0972bac202ffd51f7030860a70a005c7c3a42b3a00450b0db10955b145a12254d87905e95480e9092c414a9b16a3e9c4c9d0a8c9f1ec29f4304c8259a0169dff60971c50f03ce5390c251da6e080d20e5b3ea094848b120f4728f100c643a51ea478f6234a150841d0e3606b8735406080463c1ee0077bbbc0de3d7e60ced769f454455640b848bc2b20d78342a17f38bff30afa79ad84d60ab9612decaca873ae79e6ade825c2b9b6225233dfaab7a29cb7a2b5d6ad4a18390fb62a116e6d31b4f046767ecea879ab786dcbb6ec9a61d56347845bf5cee875156520fc0ac5aabab0d3891290406362b1874a3910614e763e54ca01043e2bb410a4c6166d658ac145931504890105112ba8a0480c15acb0822a2d11866974b6c4c14961a7a73209c256e08a85d9a21d59981d502d53c8a08a295b5481024d08551c51e361d20db6f0c006a5dbb8966147c8b329ecac035b4f2abbab43168ecbd9950697b506610f2233334b29657310c2c99021c31d29a54ab28cde07f45b9ced129852b6477985cc0b5f25a594b7331d365ae31c02c7128410564e4a1c4b73e258a2fe350e84104e31e79c13c36200216c0821c56aa675378510f68410e2a0d2d3238450353d72f006faacd365774fefcb308a83ca477fca4fa51581848484d418682424242424a49e1d45636022216db15589a52ad6458c2c7b52ac468e424d5cae9a69f48759413168934711e93987339aa1c906a78deb05c45085013230715d8442baae87e65de7837fa21867e7599ed276c42891833c9305c5a50dc72326866294b823aa00ea60c72e0be04d8c327fde6894819e9d9d157c52aa9c6864c450a092f568a89e506557da29d66086520e4b3e7acfc7181610678c3162f9fbd3bbeb31db2a052969a01965154260ea605d628c19cc18c88cf104473dc1881ee3c677dd818d3b43d8408e21c8c0d63ac56561edea61cc1144a6af47f0c2469e9d8359fcd19b63a4b2c4c62a71a98427962212af9f6eb7b031c87dc219fcf41c1ab0edd14b98c2c6e0d35b903aec4e3fa57d0d35575863be8874ce7eddddeeb7f98996527af56e2965adcc51727767157677bbc752e9abe6556a2e359fda959aa669f7cb6e95d21b366cd99285d058c39a397661e6366acd738665ded9ed6c6634cb304867eb748b65d740d5f1f3af11de0a55cf1ee5bc12d66a2d945cd44d326fb57af1dba35fe318bfa2cedfce2becd2e0837ff4cffb2179e9f4e36781f1b62afb30afdee718a6c52cd6fba9bcbb1e31898d0132306b019cc3ddb105690399636016775f9bda9136d09bce1a43367ac39e01de40666646c24092ab13d4e1bc75fa4729d5c1fafc1c010616875910c3e0ad4185be93a980b3bd95cf6f1a9f0946b3ba69389035a13623945e557242e950dea6425ea08f1e3e3c923a357a5c923a5aacc279fc62d3471859d2bd78249b524aa7c32336a8ab089a9c8237dcc236e7c421050e296cec49b19a691bd7a152f665c274313233324450cda059d1a831820df72e09353770cca49ab5363fbbf135afd5ccd5decc576f8723733e00f36da67fbb217fc301002e8b0060a1fa36bca1002dc1a6930473c8e9642fb9ca392c00fc2671fcd6377e9b9cf46a3ef36807036c552624fc86dddfaaf75be6bf69367edbb81abf75347e43ad7e4bd1fc6667fcf6a2fa0d4684df626438b9c3917a21b4917126cafc2623e63711607e53bdfc36c3fe46b342fd16329e70c5a9e01b1c6161843d3cc2a2e8e11116af874e1f1e6141c4cb787884c50e17f244e12ca8280521c5c80b0c3924f18a5bbe1c41086110420f21840c2194114208236408238431c6086552942c28adca593162ad0a79620703d6ca2e0a3fb01f7cbae1877376526056749b8fffe1c4200e427b750a29f5b18115e442b145310b97c5a6ecd6ca654e1e85201b8026f6834d31c6196be6510be7749edd9e226c7492f18ef14f367d4b2718db32373ac5c426eee5364981114ab2f7c62b629391fd2012abfdc87e314a9417d82f1211a9c07ed1891325ec175d2e22fbc524314909ec079f9e56603f98250b0cec07999892b01fa4422505b65d4dd8afa7c705f6c3c161c27e353548d8951396faf41509ac4e6c92362e7a8bbe2fbf6e606b1c1282e5e2cb09db0ebfa53c546262e5fb5f2b20152a59c0cacb6f8e926559f6da386f052456090afa4d763e864c603f7edd786311eeaee8bc2b7a81c42af103162a59a0cb532ef3da09b350b79bf41073178a6dcac2ac8e4e4bf40d6ce61148f5ec4220fe379d731fae1ebd58fd7e34723e3dcb327eceb3cc6996c18fb7488d2e66f9a871c885ea597c41a57ed22e29b3eaeaa157515337e19cd84f388e731ffd5c11e7ac8064ce39778b54cf6e642792727b7f7018a2092e2d6bbd9f55920e783144eb47e603ea86a45c89eab556df64bb9ed49bf9f43887f194c89c7ab46321f38a705e3b17d833a7dd0faefaa6753110d9601c760978f118ffb18e849b5c5081168c731e04e2c77febfdac7240c1095c2d998bc41231a505e331de0f9745eba787d952a273241d8216cc55823d35a3d8f6ce13e2e34aa53c7ec236ed5b45d9d48d454deeac32d3b9ac8798d5ed2a8a4d63d8a6a2f60f3655263292e3b3eaf19324f825a304f66bd72b36d91cecd72ecedbc539fc84f36213b3da338fe6041d587ed2c4328aec079f6ec8814209e09317e74c67400cb20521cc6af700f4602bbf64c3dab036ac5052ed1aea1638677a7b10213b6c13bd6f77ed1e02deb46b5e6300ea68c7bc6e026fba87a42be3b2ae07b6d5ba39dc38af59562b92e7bc6e1cc7a5547fb9b915c7f14beaa4e08ac239479cc43950c9b5f431956fee3f36622934dd5c0e16826faff5aee2d726a9d34dd8a64fd881fd3836497ead4c60637b2c8a51a2d176abf7f9578ee3bcb2505da35acd1c76358b35c2b9f49004138e3608b196b29bcaae614aaa522483242bb4b0e228c90aa3d84e1bacf91ace3aeb8ca194c69692e5c0e96eb8f5b6fd36b90bc56eb0ce3aabab89d4a1a1f1d80a6f94a35d8f7ec22c4c6676cb7018d70379264da5d1b43aebac2804d998ad3d6656c98113e370f6401e76e870864a0487243809b7a570bc6dd447370bcb3940b222b6c23afd92e123380f22780d95bbf330c36d38ec68dc731e564ec3c75b4df7fcba0d6f55bdc69d041fe24e825727c186d7dc1f12dc86ff5c77076ad1f0562f787e7d35ef10cfef6a080d27c16938095ec35bcd11bcd5ace1d36bd4f09afbb39a0ed4aae13f357ec36180ad2456da607efdc6fdf9b9e1376e953618506b04121cb648f04ff5180917b6ee85d2f38064bc3d1ba8e7018d005b343ca016ece46d226661de37866029e63197adf4eb31df3c66923102bbd4472d857334df1c7b71ed63aa538f9e8c4befbb5faf741f29433d96919d18ef3372bf1dc661dc87bb73c17a9491f1188f763d625a803fdd07fce9403fbd1e22e88c8cd7992b85883a64985ec67da48cc7798c87f217efcbf1304ebd8f7b98fbe23e72939c93ab496331de6f76b710a42184137be8995bcc535e74f2988a911cbf79c6b2ebb161ae79d06b295d1fa9c0f292d4e923698361be6d5f0c400fb6bd8f1e630861748a4f478dd41e8e200b9949ead8aab2ae62390b7b499d5aad55a9fcf2eb316f6f2ff5ddf990ce43ccc2bc3decdb0afbe13c8655973a5c3b86798dbef2228d07e50ccf8352040f4a9b0fa72d508a5d07d027852e215c61ca39af845162f70709d6c22e840e2d60a3c71ca8c4a4cbb3d755a382c4c08025cc8402272520ac7c03e1a469cacab143954aeed0156c90634f996fe7b9846f9bef1c37ec7d383bd2dbebee96b023eba061b70761cb164698b2f35d7b0002ac022811d4e0828b098ce0a28b232c558722bad080164f787801096812295e30a29d236a0d6df2df0e0e5114305069001ea93295d330620993951faac8c194244045b8e055051155a014910413581227524e78e84074450822b8ec9005d2c08a2d5376e0820a97a7244c9264000706a56685168268d912235687049686d18959d1ebec9edeb3482f61a1c7a48dd26ed8ce7476ffe8bf124a0c92f8309de02203b34b2771b073841735063b8411a7173b4754a952292d11c1f650698907ba701a0f9596ec204216be62f550e987235924f350e90727d0b3c13ec042a51f96fcc7d13c54520204ae1bf0900359930f32e362997cb01bf4106b78a86287ec68059f168228b101d73c545252829f0f959424f10456181b2dec8eff7cca752c91ea9c7394c7f9a6238a85cc424929573ea4f4945389e27e14e61dca53bee958c24affe28b7a3ea60f7a2110656ffef1a6529e622e76f356d9168459ec4393870fff8b148759dc3b4236d41632ab17605cc61300e33237012f1e736160fcc55bbd20e330320eb38af117df64bc15e6320e5b31de0a8b812de3c156cc4c37b76a8771d87af1567d5f1cb6ec12e7b6aa2cb7c492369cc3785c8c175f3cd8b21cc6c52732c638774438e7bc55778f592acc6229cc627b64916c956bed927cb13a212fdef1c9141b89e2cb535e421796fa175f3d1db046761e753fa0e82f2c6e6ab2af1166c93003b398015dec078f988e78f60504692afb4884a20aa78f5f7c75cb653dbe5e2fc803a91431d21e61ebc501f23aa53846ca066b3e9ba31d1e87bef94bef06125dde6df319de07f4337c86d3958d1c1db01f0dcd108d13ce198186b3c7aec708fecda697524aafe13e2c2502e2d738ec6cb80f3bec7a90e03ebc6db15b01c0a1d4e1e1edd72bb272f87236c9e170e3e1cd168df7c5a7f12fa23c0dbfbe315753f382dc7438ec7adc9c60c3fbe2db78417630d0160f1578789448daccaf7ef6f3cfb6cac5ebdbf550bec57bb7946f193763498f192e1ff16708c19bb67e82751c14acabe0996f3351d81b9b6fb3e994a8cd28e55847e39b53613fcec52d256a8690f6e25fccd30bb38572491bf6bbfa11fd86dfb89f0e8f0ef45ff7d474c3e36f4d37ce37776bd2e16d56ec1696668886099a231a2990e786b3b398208f0acf325c85fbf967321c85fba93e93e138f784fbd5cf704ef02ff59c439839843a1d93c78e85d4a380c20a05f7f196f3788fefb80e1d3c3cf079f4782b142e941e2f80bf774c3897e94fb85feabfaee511c07bbc96bfd7e3373c9a2078c34e3304e3a987f12f05f31e01bce5cd78427debce60eaf16634cd7092364c33c4f4ddd317f3840ae29c1a6eb80df573bce709f0f7c7e7d2bc08707f56437838019c00f7a7009766e8ae84ac5888373c4e69e2d58a5058616a01b576dc8acdf174bcc7e356cc93d4a1a9d5c6dcb8e1c5d7f16ab041e5b40450073bcd109c99e9e9f1a50ba8148d36754d0b95aa1100000000f314002020100c07444271482c9cc6d93af614000d7e9e3e76589a8bb42c87511432c6186308208000020044648088883300f1233dc602bffea6afbcb3320d16aeb9037f28b514d779cd1f01c7ed209066960d9df822958ab7367c56a8210083aa9cbac2a55611cec40f04ca1acb7a4110d05ebddd8c872622f1badd872a8a5d1556a5b739f03d52c3ffc9a90ba3b6bf474dee5964a481808a40d99420fdf3842ba5146ac92c3ca1a50dd2f0522cc53c5ead06b44e2c9b53dd311ab5ddb36763dab46ede6e95d40b0ee012ee490f216a7bb33524e4f2e8ab998ec0e8d1b4166a6aa7ce67ca456a5d089655b40558c40611857d4f92519e87dc6c0268de1fc894af0dc2faa999b9baaa25922d3d2614389cb9cb861ceba8386cfac25d9e31278cb5fff9c096a056132559b0fe4d51dd891fc1209af7a43d500147c2dfe0e3e6d18093708b97b991b3f65fa3087ae85fc8d8e431aeeda06d776823eecd3de4c1c7311965a45fb925d5734de015882e85c24eec3f11d821dad253d5c47e28f27e5489c216dda7981d2b67e13b8622caaa9c0f7ea18fdd9ff53d08b38667217cd12e64777d8bd38e223957b786858b7b956a341e43d6ceb2efe9e6b2d7f441f156c4bb0dd82159115a06bf2f6e9e55825921741485b021b4d66e6bb27e71ac50de534f33cd4da0d6e2342d9eac01f79a89597d4622e8eff0b5272d3828721e1a6c2897c27521403bf53c07380a732e9d5d78963beedcca3c496263e836523fae9052fa8d4ac72fa612a2cd2743cc297ff4d7e33949c2aeeb830d58bfb1016161ae2df3932ae6e1724c970407be8b44f4cdf05c65b0eceb82d72d2236c8b54669b22a49f265912039cb61af84b1d751809f6e8f19b0938d40bf70db067bbfb8e0533456ecbd1b5909996b783ef5060eac5fe1351632003ed1d1678e89b0f69a22d802671077e25ed7edec1820f54f65f7223963c84445ae08e072d50aee9c5770ba4b7bdedc4a531349ac5cffa2017eea38aa1f0273a73dba2f7e6ab3769e1c6d236075d5e12b99a00b0fe5d215ad8aab96cb88552de91b7fe0564961c8b5c58eecc0601940a4409de6bb300a4b6b433dbcd2791942695d23c00c06dd73b49bfa99feef38d45cc4f3bfee13c7813d5f46915c16878ecbe3f6a4568b591ac4e300abf023827e327193d91e0c8b60f07d8bcfb1fdf6248eb60e2a08649ec30a82bb0de83a583231c8dfcc35700a814752f6f0b05ada14b99cc50b860cce2177d354769005415035a131a41996f25f185fb1f031b4d147ab22bbde70a1a9055611e2dd1616a2cd4a9a9f32d9237bcddfa0c0c801f5ff0a8bd9b9fcbf7df3f1db8179b24a0c56a884838d22dbb4c88400c1902ca2d5dac409eb10ba25824a4ec9fe419d71d3033a42a4239effa292301f82435e536344ea0b55d648493835b15913be42da96180a20a5a9a0ff8129329e30bdc1d55c7649c3d3e7389b951aa8113577c41877337e73f65b9aa26c9e651b40eccf46e858979d437f8829d743bb616356a2ba6ae2bdeca4ba2cd0c78f08ee71a9b0daaf5ccfac78eda7fae6272f1155c162b5fe191e76285111f1bb5fae6daf0acd5d62fef24a7f9f3d3ca525076d0e1db9c1afbc06797efb519b44d19daf34018fd59b7b2fc1c7376b4fad350d9ef4024da7ffbe56980e13cf5a90349f9517cf12386a07af780ba2454e46544f67d9bd000be464b07800f7673698acfa55a90777b25e7c7424c24a20cef768ee90031a18624143c34e326a5128b1d01bd855a410b2b20facd1b5e8c5e18abe5be0676df6749aa8a78905196a048e8533c35f7d8e2a646c32a03f9709a4c16ac1751cab3601882943a74c7dd4268001e69efe173eae6080f4baa60227bc4e7098b3d48412e535a1ae4f21b01fe01f0c2cef405a14932c57eb4c2b9be36942443b34153a043ef2ac4968523de3dd92443046a1eea4c8649598ea5668d0f0df3bbecc2ccc4baa34c905c37f785f3dfa039298b61073c16ff06e5c91eda13664a8ef8e7335d6f3801e4a0b35c8d8312f185192e821fcca1998827f3cfb1070a6233602fb7c398f3c2d1bc888f3c1c8e0e30cbd5e8e9a2d5f4df755459dc87a079706257041a4f89354652db6e4387da43c53cf95df13831c66c67f868eb42b7825179233ba957e8e544c1e172748a8e48222b969436c7a1b6124700da441831beb6baf46b7259ed996b66c39c523aab20cf1a1317b337e404ca86d49989af46632b96ffa0ce40a96ea0e5b374c5664863ce0bd08b382b0bd14156a39c6090b129471becdbd58122714ce6363ac26888f3a533013ee4060aa060de8d70a4b62488c6fce645a859358c4410fd4248366a79ff0639ae895aa9a9daa3607f1418c5a84fd6034c173026088014da939fd73718214fc9cf4cc70375dd28abe7811b8c5a2596105ab9c911c059e77235cc9089c8e9c5dd41780535571ee80727a11f26a419ad50564aac8071697e3e2d05c55822e63aef4cdf5faa2613e5cde316d32a174d040b143171e8f785143631c01365f7a66baae9e95b920cfb5d45325586c76b3e0900cd5dcbc287df4d948ad7dfc9e96ee994a1198d9ae7ac6f3425e0c90cd3228a32e1acbc3bdda82fbfe1028438b8f174bfd0614322a6f1b8cc1823719c3094993fda72ee2b17636991e1898636469e65230a770c5fe724a4acc8274847f501aab0f9bd185f705d1a961a98f2a10b8c61975c4c9ec0cf97f3daf08cfe23091d480583514046af01bfdea0494b392b950c76de5924d62c8440de7a77d2bafeaf26868883fc87c8ae3388132760370a31a7f2aea3ebfd131ca0aa017f24f606d16fb54a8d4d778963f4fac4eee846d625c5b1d6e0dee8b8391e6d478cf85c59abd20a7324a92c433097c00f713bd7205ae6ce8eb7500453ca2e199986724d00fa4e71fe6c70e54748429b0e46e3519b5481727ffbfcf7188dbafb263d2930612695f178a24515796cbf7fccd332bed37dc47af3e4f749d903bb3a216ed68d33e041f7101e92c76eea6b1fd07f162990c070c0d8a07388a664a6c472e0dfb9bdf6288b96ecb431b306ec0d90d4f9b8dd7276cb9d70098850cd41912ba2335cbf49a71bd862d08d03ea1bdf48f35b06045a1f1c3dca7cc3c5b03051b4d8ed81ddc08fce7189909bc6a3839c7a4c0a9af7542fa3eeb0073d2aa5cbb8ae203628eadd68e0a841a21f6bf4e951143cb6925f8c5437fdcc8040de74da2c743a65c6ee3354e4f7f287d22fe01d707d32c72f922c5f3410e626c80463a8df7990148e4cd7979e2f9dcbf059d8c132a7fae9e8f5513303b81f1a927727238cad09661eca44c78dbba0cd4c020a4d1e67c24d4d336e531326bd9038c6f21982b660bdf12f84362c0d9bd484cb82e12b84e47a81f4fbde472f229ed0d4e5139dce6343474a8d4e581dd1b4abdf011a029bfacc404c839119c8c1e915014b6684c8425d259b72b8a037b0abf7b7a870eb0ea893d3d4a44a86374bb9846c16e607b129312bcc0c3f0fceae3cc482779cef9ce0e5e532cc1a86f6c280cf30c6015fecf19a95d1edd83e98cef41909be0064e01d73313814d57fc7b46af8afab8c9a7728153fb839e5ed39f8b956185826b0c686d572476af426b59a6105a650e2bae421f0447b7fbca77a4e3daf77ad007e926d03f5631210c9de5e69e2a146cecfd6c3e5aabbe18f3d26070b14711ad534c9cc84ea60835e0ddef09daaa709b4ead715fe7009c025833096b970d4898a300a9ec90641612d92c8d7daa06a17d5d45772ad73551973f157460802c1fa24a29ff931469fa97ad1a628455ea4daba5098655ecefeb2eb1fd8ca018b765e17a9d7bc3111cc09da467d3cb7e6507901d94f34bbec29c5c32c35b285159ce7de2c0ef765108eb634586396930bfcba43aeb381aa8df6547737e2d1bd8a75758b95693dafc3ad5c7f64c1fe80db20e570f4c649d03fe64c850f8d162d9fe14a1c2cf4abd18976556a740b09360ab7810ceceb472f7d4cf6e2a039ec67b1958a8351353653407c1a4afc5e10771ca298fef4a48467c2af401abbc4d9bd93d7a820108376786958fccf055599925989578f5ac77ddb49f8fad4d048d9527d1e27327fcf1aadfb51c34fb450e60cbbc568cbaffae41bd8bbc48b3491004f284f8c559e9da57a1e7b92345781d59aaf8eee77aed5b69a6c0cc50a1251dda38a30ca583a3332db4cd0e0f74dac646f4692e3d32ebb1e171aede5e0f7ca3d7c2c864ac9e8c4127cdc13a10f65a52705b5ed387e05323e3877a299332777134fffc20526e0ce0ec9d37606b3a5a8e1c63788b1baf9580bc92373f53fb8f1f385ed527fa121c5fc3e039b07d1a16de4670ca57145b0475b7e55a9371cb58f8d41f2c505ce10b3bb102cf3140416cb2c6c4004d05884324567156fe2116478881bf2f97d31b583cd7d844726263b95a7877940b0ba0ae4765075cacaa1ab5218362fcf2899a2f7b2bb73760ec8a5689083c56ce82995b410437b30ea4a7800a89cda4f8aa5fc3d6f91669b5659e415e6d1191c807cb9ce4dbc76d86d52ce45834dfc2a83e089d81cf3d046814cfd915ce0dedf03d6b6acc3087d4d19dfab3ce67d5077b7a3dc0c66dd2aa127e8dfb0c77f4b54d2aa17d0c8d0cbe13960fc6087d63212a3dbe7304b534a5175c4be0a5e283ed11c4c7920b137953f38ee5e7ca3661ad8ef656dcd181eaa74abac8b942d38bbc0d332630b9f3e15f0d28b6ec35be49c373b7982edecbffb2f0a1d3b2fb0be55cb38509ebeb6d618077a2cab3fe54785f03377438d19c8a3981e03f0dc1a6f4b8e4d15dd841298bf0ecf2915960f9ef9dad41e877033e99db31be9ea956136aaa67089e45055b85a67aa1fc7f888cfc3fcbc77b3a2b85903420db46482feb9a25b41f5561003826ad9efa420a6ad7e3c44d4cf03dbc2b4a1a998e13cadae832f2777ebb522ba04e5d1917f685316b46eab6416eb4f479e629779dbc2acfe4293a79edf22d8c0999f36c9a45ded75a008db89735eb539407fcca5722158552823285a53dabbc935a2e2f08039985ae8daa2bc750d93308a5db20cf5e44ee980846e49cc9e0fe18637cbb51390c9dee3c9497b497e11f8434b3e99123650d8cb232a5db30a7c089b376048609ea00acffb2f670d99b3fa044e89787050180667a3a461165a54e969e9a87514b1cb785a87845badd942749cb06bef7886bab391f4d269882600c8fbb759b73b22f8a0f2216d00090f0affb0b1fd9eac580fcf31d650212ceef3874818cf0a0df4b52aa07a24287315553c7aa0dc35ce780593d8c420c7b241adc862799bc87945dd9464a7f596310d8d8424369309cb096a7eb884e092b39254801e7c975749a78d26cd2eb0055c262f95c4e9c2d6127af29b7339aafebc7b0c3c0ffbc5282d82538c3bba328bdbc319d0e9b4af5940a472a174a93eb69c75e3c5f7aa61aef33718f8fd780047797b5b2fa938baac04aec719188ac0b3666015cc5fd03db1723e9a26f390e2935053594c99cc6cffcc1491e697de8bebe524a9e9106640906de84813aef7acd293b03ad3a5c6bcc3575cee4b02c16dd0775fa3d25ea2afa206fd078b2251c093bd900445cde52862c7d5150c0a23a4a2b81a00d6e10edc636210b5d49ff585a045a8d8ef8be0992327a4757f74115772b1b3e5014e05566014bf5acacd6d68411a4205a6f0fc5fbeb544b8aa4bc896e2c074dcca8d0918d6b046dc2690ac09b72b823ee5f113691fc8c1d82073b1e7c5df50561c5ad9ad1cd809563ca83a6774d744ea32753ca6e68db541323c64b08dc19a289cd977fbcccba9a582dcc69b2b922bc8cd860d0740610f10207da135092eef5178f794c864fab4e0fc5669ba9bf3626646bb3638aacf0d8362494617a827b0d8da8be181d65fe5adeb439674c2b4382f22f07f7b2ed0691cdcee46444ba7fa320e77917bdce4498dcf90fee5e430dd705c99a7f68ed8af326f011756286344e0f06acf43cc867b11edf132b0fbe85278f7aedb209b2be2fb9e1870f6c6cf5b09f87e22f11801bdcd65db5705b9bc17c8a153c7f7970a45ed8545e3998f894019eded0c25416930156618f4afe820fc19a6534dac7a5d5ffb20487d5052269e351dc2c49f94da81916aab2053b33a942840cd3dfc0de97c6727207d8a1e3ac60e621b2d2478f7ec6875ea0edc1bffec59944970426ee0f07471db4289f4396332e18369ff6a4af8ff6ac8861135a1027512873a2a1e8bdc252cdaabda9adc25279dcd9097f9ff02421283d079198f3650361ab648381a7170c179b29f58a03cbfc9b0bc0cf92aeaf71a03a1cade447c972018107fc6f2f74790fd75b9d5a19953ee24e21901d16c0c38d9a62712ba2cdf34709c8cd8da319b12c270aef4eb56a6af8365678f05ed3c15d48093118e10cbf803bf01bcce98401d5139d9fa4322c19d0b48002567c104f581077c4d172cae875a4f1ad19623169e8c9544c34a29c77a28cbc745237704036eaffa06890dac4f87113cd9441cfcc22fe5ec2f283b0baf428c2d9c6c45810b81bbe4023e0056c26b63adc5696dd997515c00f43e60e9eb70fb702f9c75e28fba331fb4129ce57fc158a40c22cc49a7af063125aa26f2719b29a34d925e1897eb35020caa4371abb09063128b91a9921ffd0f8e156af03dc2aa6939c90f398fecc629d678d5c303fa265590e1c0beb7cfe60849b2b928bca08badcf15679e2c9437f968886c3e1bd88433d1c86e3948749e91cd7e399238374efd91de638e4a40a929e6a64d372890128e813e24b5f3703d7b755b8519ff7813cf3b1074ed28441aefacd7d8bc31fe677982c4457e0328c218a90e432d14eb80d3a940f4147ee7e0efe9c2a67de07f263d21ecc29697352d5bc29f9d8e4c3b79c1636e75b2a5e7fbc1e773fd1204bd1cc7e5c3da2676f41da8472c09e52b27db383cfdd4fdf14cc47521446e0cd7d4a0cf101a4e5de90a5c2842602c16030664c7aa699a1bf5fd806f7cd49b154a7d4caf111d836018e9094e9f5503b2e5e71c6dab242bb8d84b5cfa0597a9326c49c06d4a36d203e1eca9f4373c031cc3f4ed04d7443f3bfd18bd056b4aa05b88e833cf99323aaa1b116816569770ee3913ca4bd0811097a14c3698b70a5ee70c86c3d53bf1da80e1e7cf096cc369d49f66034ea5433a508c4fcd33b1e48b2b490c23f81a5f7c9aa4b6b113f0c9e221f2e0f2be2ae1c2e28a2fd383c67bf6ca44949c496cde90cdf4a44eabd150324da89696b8923a9eefa1d76958490472e4ba772233ccc4b5b89c729fa0e0e789abd948cba2ec06ff764af76c7c193881ba9a25b6e79e6b2d147a7d3cc48d6014ba6a93b3dd98844408ed68626c9eb0de83192047a860b70c62ec6654e09f387b6892ecf12587b7118af5de5aced0bb143c7a20ac3777ceb08ada9aebcb0cb8d6641d2c687c0c33ddf3e1582aa1aa8acaec8d2475b8c8f5af48edd875699370678ac8d0ffb5b70e6ddaa12590f20580c4dac684ca033764bea87e80c6c67cd1806a0426d7e83d4a23dcac361e761ebc84e427761333423d1085f3b2d501838ca9603df0c1e904c10a823532e5b7ef592ba1f3b28fa74c0c818be139386c13bd747bf4fa1d1ba573362ed94d97d5fdd064c42dc054a7c7a9dcb0614a60e69f55322bcbb8b1ba229cb85399efff7d39e8934c9c7575adbf35a15abcda6377d979a9024034c44cc488ee7248a65b32f5613e869a93321773c0c243640a40d481dfea88004761b3aec4d7dd9ed4997d98774e240a6ca32343f1dce53a1ae9044beb2594fb1696798c0e99854a4a8248b8f8983b1ea2b3ea68c5cae0ed5bbbf73f4a4371663860e6059a04b396867ac9b7179f1bfd01c8d9a0698165491ecbeed69c39625863a6132740f1b7f79827fd9628572e126acd53ad030138b37390fe75bd8b928df46751f2ee218c1438846c04d2129da973d6ffa7486121ce72244143c96544b4104f41bbae82fbebc225565dd4708316decdba70b72ee7605e6171cb9d1a0a382786f13152ee94b0f247e66446c85cdcb776a345c67d428e91815004d1e700d904a9678c07e3d4b39fe8159ff481d7866a5c2caac3c71f33e7ccb0033018e1eda10cf3453f8bf9f67c9a1320ad17359cd494520251569c68b52582f0009c698c8347f7aac746204477f43e09871fc90216d2d3ef84d4e6343c9f2281fe35bf1734e483e5f63545ff52205e9e66a6a822f6f31c0f99539e44b876970028fbe2194a0c97e0950569e8c28139dd75ca38c0334cebd55c162574d2c58a9de39eb903e7931d8f8e881ef517549b4cba7d55bc381cb9a75285d9688baf3ffd65ad5ce90be4c41604d97cc79f276aefb59c083c974f6004ad43d7979e97fc892ecd6f4755e6a28016122837616197a8930f4d7b67a6bdf11cfb9dcfedd46077fae1c5ecd5b28b6c3aa258aa8151716dc3e49eb1f2e18c197c28b38efd344643f8d57641265bef504830f098b6f0e17fa6e0650aa1dd7d1a3ef5eb96dc64431cbf05b3ba13d6817a1fcc40256222744d9ff560092dcf60f5a75771e088dbfdc305421409380e0a956e49981c67b5e6334e4f2bd2437e7da8129108228e6541701bdcaa2856a3c1677aaefa36f2b8eec2354db53f72fa457b9a9476e7f5ab5726c3fe578ac9b606ba0f5718b1cefd0b898c5b41587dfd698ed352473881b7994225be23fbbd61fa6a03a965c7fb10545b6c735c8b537454b4d1d7083399b294521b8f9acbfa22596e0c4a6177a04ff2c9693b7df3b81221dc037a1b33ba8e7e19413a476628b26d0811bb72f0ebd882e4e10de949bb63b0b49a09d1cced0ca40a1e0a2506e92f4d8231dfab966e88f169acc0470c6e3d21f04cb19d965aaf47e4890ed755a1a5bed89e29b126340ec2ed2d4cf9ca0b3669051c834eb905db64e461938282001739c5d254c62483f7d3022faeed098848e604878d72fcaff134883b222b54e57aab0a789db2ee7a7c9b6fc79321ee6e3007b225ad13b2730f385aab6fabef4eb317331ec2fd155038b0564f6e0a9676d5064bbda75990428de9af2836528bf1bea6a499c0d52346540115b49daacbe1c32a4223207dd17f4fcb8fe58f812313bef4811d45ef6085bbc76cdcbc76c4dc01e56501d40dc843b6d3f60921cca801d4aed2b247400d8c020b755b7c5f547ce26acd61c9cdc5dc6028889ba8fd6687d804e10deeee09e58ae7c579ee35db572044441ee8bb7ef83e96a8bf915ab75b4840c1d440ae11c1a7d1c46938d125d7de83a188e9bafcd58bb4f7d575659fe44009bd00a77a6e6fe0e557bbab5b35abb656592c34cc64f6941eac98eb4fcf7d7458c4345ee2bcb1fa798c96f5307cfbb21d0267170d54fe2ef357667f1fb2ad7d25d06cf29530f3065c65627c6cfa42829c8d16862a0b7486202a83c7fadefe8ff6dccc04b9c2923d53b954aa3b50780e81f01a6182b6bc245c327b468c3d71da5f4548093b57a76e83e5be03b86e1f0c383fa5bb0e97499d23fda007e5ad3929dc17118143fcf66fa247f7f10038f5d9474c9f7e9b9b33b7227fdbf7571870b1ee3381520dd7fa6a3a006c07e50bbc82331e61dc97b66e3d378db68bc5bb7c52c59af367007f95518ccaabf9a731026053d71c5f2882a46c43bd2c5f961bab8cd60651d5b0b2819e8abac72dc9a2b22af463248d613aa570f8917740c071994e6609f10148e9fe8751d00b90b4692c59be2561151e98a55d2c3c15a1f410275c58d2afcab2fdbd2f8b6b1ea6d707faffa2d6aa1f3aba6eb2423fe05283fd0c9ebb2002c46fa8371c4b3e50b3a5b620fdf08ddd9714c01aaf1ca45ccbf21fbd633215a5312ecbcbac925e739bb3a3ce54e8de02eb6dea4af85b34871ff166ad5bdef4ccc4b5b5c6b361b2e5bf7f6a80d5a827365d93e08cc826d4fff0e1b68d7b1d19a04a0338b888ad98444666e53980d417b79b80c477df94c9e3e3f91ff693f55e23ae34258aebaf81aa442a50ea3dd5c789895e98e03caa83813a35a05e97205f1f31ffef612c2b8cb55ebc3a44435ceef181aa946f2b68de245787e42255fe92c89d30c0b4af86fb0391119bd5d97a6384a27bae50dd7861f992fa59b474f15bce1b783ade9e0b38d1b09c58530b969a66ea4008f8a51ee1243c8c800fe6bd316cf7d5415c8e21c3eadc0edddeb36ef11621565cf236d75f88c49ee8052b68017bac3f3f6ad090c2012153b0e3425194ef5d02a5a49ba18d4e65a30ed8c0882724487efd35408d62c9a236d8831d741fb20b2c3c39c0fc5d6cb809ad9b6f05605cae5cebd4ac413c0dde2627750b7929efe53cafa4e500252c71cc91301f3fc8f8c5bf5c420cb5a98855845a9ff2eb937313ca06bb607520fe3a421eafe4a4a0745f423d767d8c5b52d29cd954278a804fcf01478be289d7f00593067a530a73b907ee35f913d4d441ffd4ff685f3f1a8443fad9427a940c24155966f7dc2226b7a683108f061391adbfc94f1e1c8a68dc34a43d1e4407949554171865f6fa06ea0c3ee481f9eec788e3026f2650fa956112f007a8c291e39b583c085d97a7bf5acd484b2ff202e3eec7bf1120f4b48acafa3a46d6da6d1484118ba74ef8285c1bb3fa66c7e055f7c98dfe8e83218b9aee18d866e156c8640950e6ff8a045d48189fcebb4231ad01dff0aae4bbd62a355a7cc0524fa79a7b5724956a4d687e90d5bb92f0e6be6b93e5f0fc8f63be20a189458c9cd4118dbf1f1fa08803d62924575d0a2b4b53029f729dc88dbe727c32da13fd6385aa1fd1d17a58461bb732ba1d7e4853572ba614e9f4792133f99c18f5861c9bd931794990c04ca22d634b3b5f8e26e0ab1156a34a1b91c37275e48e8c9a45c6126386aabb2190aad79acad100509dc18d46ad805160bd2920f09c44709c37eb9ad7552d2c728ad2550933ef7c37791f11c5315666b528ef8e055973b6af9065c203bed64da36892734ebe186149c2039a857653a1ebd25d473958ec2ca133825b83cb71e9fca85b4ed182d60ed2b6ab1e6855ed8832927b44e90558e24eb72f11a04f2f5f10dd5fc031474bd056dc4525fea9053cbdfc33d0cbdade1c258d7ceeb97d8b638b243f1203b85ce1ba8c3d2edcd1141c23559a024352082b325ebb0df05e5287f1713eb3e7b3bdfb6159844227625c95f07157879b6fe19f26e69a95add7700e010fb554b177295364a7d932b0415f5ed75beb09a182e8363f4c3533a227f1f5901b2dea8a167b21d9444445416626bf29bfbcafbf685f3d20c3db26a0ba5d0a066862c0ef2a4125347f585571d4d7ec043c3719d0886b88070c449dd94d7638d48358c714b72adbc200f315da539bb5a430e0f0976aba403f67f851071e4be0bc16100b61fdcdbbc2781d3000ff1cae3f9079337da7f090e4ce1e99b50870e6715e22d0aca5c9f31cbbdc5ea630237827266f0c2672ee6cca6420c691cab60052562d8137600b101e81bbc84970a86aafea2081bf394e32b42845cdcf9793d6019e1c3df39330bb3261af85278fe099a12b79997508389a788fb35dac1a40ea5484232f4a36c6e5f721d8d5e92f70dc4e8ee7bd04ec3d9404ae6a3fe2cf0238100710815e2229cb487530adb6c09e2bd627a0462bb2ea1cad244f77d1861f3f6eb6d950d62b92be4f00eccfb1ec486ba7f98c059411ec938b84294c010d694c6a0156de2350bc8608fa01a10c87232ee502de81e6140e694680a2522275802a5484f6c1c49eb56a3ac7d4d0d48c493be6698c414339a80cfbd49976079a56b7aaacc3d9ec542daf6912125a8d5b288ad10ce9e0199561b5e6f14ad83dd176a276ebe4960928300628e99813ee3577ca4d6f8d29b0fe3598d5c212f2429b2c5041e2dfea43c043517519137aa90a5b757b78d91bc0af96befa059890495686da6483c8e21c817810f2c1ad7990fac43196ca8cb49a47ea56f19e9a86a021985a1c47f4463fef055d61ca80ba586e596998724d32f932d063af1eda00e70485d941c7ea253d0cb46a2d5ba6b6203b95cea66fbbcbbd0e2f35d250b51ed15414fb8df398bd52d3109ae637e20a0de8177007fb9d0e0b40679a0ced73f2ec64ed1e74afe394a3ebc5495bf0f464acdedbb76552373e217e79eface0440e89f6ed1a05d7a67ebcde5031ec78bbefa0267e0f1369cceb1167ad39f1b7faa36f323e2913ca7e827feabfe472f4890440daf2fc9b9323ce24915bec144daabd6cefc2eb38c4d082d5b780e0d7b4b3e9ac77560b0c931e7c65fbc3569fd45bd91bf128884ce54afbe5c738b5b6c6629df48b21d19d08f9cf4cdccf12e2d90a1c775855c15add606ba24a8f229ed3b58381bdeee7ed32eb74e6f63501fd67f6f9efa055428569d9244411b86a31ded970d29317abfe811413d0e93c0d1edfc532e1dd883088e113325d90b53f20d44897105caec244fdf9fe2cf3e8ff48228af9bdcf6fe68a87f8f806d6f3470d4f4d00280b86cff01e00fc6265c9bd12b504264d14339e086045bc04991f1cb9d750442be5ce053deeaff38cafe3ba8d342ff1d73e25464c0184f1fbf895083a9686aa4a81042dc13227f83c8f91d43b1e98f914404144fa83a98d373eb9a7b9311fc9ec783f2a0de416184cf7102fc69555250b050028d3b76454ea070a92b29fb885ccac6905f3f02087e60a549af57350ca49ab80aa6267e3f72bab3cb909a1c016db09b237b832bf05842229b0ce57bb7d1db092ef7c793241c29499a78befdd7749be325e6075504f1583b061cb71d952875e9395e7dd0a64595bf64dc4aa4eb92491dcbe61b15a1d3c81e92c29c9657b421602bf3ae384574dcb53df6e0a7771332e20f93493efbc590ebc71f74bdf31bf5fef65fe6576afbc71d5d38d0406ba9e7917f07a09d8642860cbbf4a82165d5357374eddc41adb835e875e92ea86155e1994f27747ec0003271f2562cf21d82c263dae597e49557cb66922d96e84f3e95afc468268a0b3ba9b3a14e91b7b8ccea3691b2720e5dc764408c164c92da704e25108c70c35be53496a454acb06844d150b6ad7c1807fff298278c2e8c5a5cc2a3adfc1c098f96956280c0a419f4fe714b968d36868bbe83b4e087482d38c47c0adf11533fcea298e77ac06535065ab645fad8c9078a3991db3118cce6bbd62c08bf04e645cd513a2db65ddf65d11eb57a4849fe9c529ef419920308549e27d0de69c4c562c6862ac964154b316f3af0e1c27888f0736109287b4ecbe3c374610842520d3e4a260cc043d562814ae49374976087ed2daf43177ebbc0c73e0d72a8391d5b652aa9102ec046fd9c8abb2bd4bb3e31a56492d894fe1c027291b5e24d7f9c8c5d1760025331b495fa2975bbe56007b3b5de028bbf5af0af40633211080824d9582c07efd5bc173d5b6b32f73fef7477e3a2c5406a29ff9420751db9b3c0ca817db53b79b4a90a594bc74a7ab03d3e966f7e7ecd58a930af6286e3a7dd8ab113d48d3984bccef2c4bec4ef1ea30a36dd65303a0ae7070b0b15c87adb90ab0486769a7adc5baaa7afbe4bbfbbcabf0b971b12458f896831739a4d053bce11bdc4406ee8122d2181f2bdf56353c09bf20de9cf329224ca1e7dc195f2e02c954936b02df5c296672a881c7cbb7314ab699708bc803ff8dab2bd27ab4cf48d1607b4accbc3465a186d5144b4a2ea6f09aa3c8312295adc9203750d710abcf3eec3161414d116458137b4e802cf8acf48c02cc79fca8de2c347d0f4930b1a874501d213c4f6915e08858ff6f404040b1cd60bcd495b44c1a9356705f6a895b2b7f4eaf4914738630400d86e68115bd9003963d7e73bda321f5f9568f6f01c15f23e8778c3e9d7cc291d1a654efaa51c82c78050ec5af6290ab263829dcd99e5cff8920120adccfb7581e051d0a8bcdd5938ee0746a8fca6e96fcf0c024d17ce1c9b045c636ade1935da46121d082a59644114978eb8d06f6d8ea410518b3a5d0fbc8766be7cf19e45f01c783c4b178bed13dde3b16789c98c780afdb125044505d00438ab5d532b9102e5de635cdf6586d1cf16643c09b71ba388158a73ed88610a8bb8e00c123cb009ea79831e8c6c9e27ab1a970d1d9e13511b4c8472d334c0563529f63e7b047a926c63296adcf028e0cd0bb6281aa4a6f0e3ac6f518e2b0dcf9cadeca01c50a1bd0ef175a0e5b56ae71c3928498596d19d0ec62c41470ffaf03df9cc195f1aad1b27e7836ac7bf1c054a441957af04174c662cd9b26e928ba5e2910ae4a5d0e0508bbfbb161ef1069444fc2e50c2a4b81624624f293ca142ccadb70fea72c39b9840468c163537c287890154f8a018c94afc04eda4c0492d90e113241090f24515c254850e8baf40eca04822a3c42292742864dcf1e9695f007c09a1987f7e15f048b8a1e7ee35beb8211a04dbb008e41e55c60a334746029494456d0f3c288993f29f1edd93cb6f0c7ea0ee4cc2216f47cb1348c7b42db525362785d10d88b6b6335385f1341719fc95d45decbbc4a8dd1bb565ac500354040c4bf9ea8244655bb70efe4ed4e7857f81fba1e7cb3563d930353f1dadc5498cd2ede28cb1abe06decab45c252c8448f401690469fc0a2335c91a1fafef283019a0bdeb336366ef97cedd9ba65065eebcc3080a6e39158d076b4045e61088e94ed3f584b631348d09fd1bdcba3c8619784e242039603e02c9a8bf5efc70aa8fc7400b5c957e5202936f73e565f4530415f94038c2187363d7be32121f6efc08a13c61e2178b3bf30eb1d2594bb07a167ded256910a506c410559c8be1f7fbb4ab3b79c69bc8463e39ed6da280b1b5477be9afb2e9c94ac604bbdc7b2cb3116daadfb784d1a21533ba4f4623935afe8337267959379c298588ae49d1c81352f65bb0815655cb85bb28455adf81b430d6eff22c80dc17ca5ad3a6ec57e699187725498022181f2ed861a7a737010ace939176e3a8e0a1871c6b913368c565d9cc0488396b5134e0b34d88601185fbeb605131d9919326c693fdae15cd6ec16002f688a4b59bb707716aa019b3a5259b43bb01487de7f688cd715541386eac208c9b48af459bc15145a7992ae90b77f00f16c5ef85cf10093e7a8e7dfe0bee2d5185431a4124b6ce1367956db4d22ad7d6d4b25e04aa471738365c4bfaac394ef3cacaac53a8e600784831beb76f3cafbdffa466440363603556eea4384b0f03e90577342514e1517106d04ea679e0a6469a8f7ea179edee9063f5abb10a0810920908d9a1a5a143ae61834085149733f0ac5d832d2dc47f0403e494a1588e89ca96ada9faa0b1ce8ab5cb5b3a613b6ab8e29edbb57c0068954cee3a84a085413b9018b61bed51db64de0503efb5fc4559ead42b53ebd11fe33aa98583b728951e71356bb64006d5dc442fb4e740afcbaa54013c6d15b97fe2688c0b7e95d6d55ad2c5fd576d37ecb229f3f315c4287af3333760c487b07dbc3304d1081f541ee125d8ab3b5b2b0099fd0f31ab1992fd618f1a118a3ff5bee9884dd901d12647aeecaccb0b5928f72726d20c0b1428a02095ee115a98495745d53efcae364e53d4db2ceae68203a1653213b3c4272b41fe679dffc33990a738d24a4f59cca1a579f1dbf40da659e4ac165a4aa95a44223d1057510235149a290f49cf61d6f10f634ccb7368fc500e39e4a5a1cb03e5ff1c05f731f9794b98476848ce94d6dfef475e75eb66d8a9629cde3f10d681c351969c64b129d2fd7f34650176767273e984145756b08b1f5b7189cbd1843c8e2f08d91b001b28c90204ba67fac1fc3e57c8309cf86aae391d1cb4546ff20d02ca7a72917f1d859cce75fa9f3587c709927b891fcd10552aaef40875249efd1ea9b5ee107b47070ec666ff843e9e4f768f54deff0c3d2e4efe8ead106f0623ad0ba78a8137a94bffefbb6fbc8ea73491f0c93c225297fa8c0be6cee1dc84ae1b24a129b6ab1b4836ec73b46fcf453baa786c5832dda23f3c9fad2cb47fb58b4651640136caa6a5863d121fd9367fbc079a78368878b6857cc83ebabad9f74a7363fb5ab74eb8b522ece28adaf5c39493c72c63d45f18fae4d664fcbaba092e9859d9faa494398c02a2652039d070ec315d2c1e4e0304789f45256f106d9ab7aea974420b4888f12d1f80cdc5d6ad24ad2d3cd031e624f3cfb44f671c48e9ee3cb488b538fd96796f3a83b4f5036326c96d9418a5ec8c98f9667e75f738da0da99ef2cbe07809403e66101def5987dabfef43595731ad6bb83282a9d306b62b5e2864e85a32bb108d2a549469b99f6d3414d63dda0c0f46afc3c90843b8afa74cad7ccdd26d06f5532558e0865e5c5a67264600e14a7294c413a75d780aa7a51e8c8718eb62febfef8f641499fd1a5db9682a7acba304fc2c74f21a3a4daa96827bd47b20fe6c846439ab7c881784fa5c8dde746d2c73829b4268fa6e4e5a8cc4a595571336d7cc659b03f36d45202acd85199181c3eb48d8edfaca2b2cb41082ed48fca7c4eb43f6688d619f6cd680fda1c182bb5554b42783f9be21b5d1a1ad07de3c3c2d38925f4ba4556458b2e3537c7a6dd0b94b579f71b1e8503c594c81e2dde500a14c561bc6147aee087be1cfcf905292744476c35d36624477087c2c112960dd21fba7f20b9b46820c34d0c83ae208a91bc0a96ba4340d73f35ad3e488abac47ef282d1021329172e9d22c405a8b71e62858bb18ac7ce17629a8d3a83567d8b6dbd45f0cfaa0fd81cf1f6434ed60da4f0a7130b46a9bd4c99fa6859265a64c1cd968761c3a80babb97df683a86147404ef1122c15f3437f138ede5d0f602ebac991e8785acb9a279059399f6e6050a363aedde20a83a361faa5ec47706d5f4917a775f6d525ec1dee9a04951db64f2acc8623a5e4e3e15a41d85175433746a2142270783af70e423cb9132bd6449cb3e5061f0cb40c58173db1366aa9434103d8a11e5ae4769223f2be2432fa1a83d55ac8c1f21dd2538a6f47eb6219f037a3289af1dd7c874bcc78d7c2754835309d3f5acf1eeee5aa5916cb6d9db48472af070d884f5e08f76ad22e94666bba7383a7ed7b136031ab1638739a958f9f0d06ab3b6513bc8d7218e0bf8ef4cef7ed32cc6b5eb74ddf8a6c2dbc8772ad8cf1ab61bc1361d6db28364a6845550f2085150437f11f010774d5191dee371b857a955ef5c00be1772186a0b27f16383f87e1f9edc3750ceda79c9135264f7e045f4d28f7a046b272ba12b887d03b771f3709e8e1c3a63756ec4028757e2371116090bc487e490e1b031c4c374315c2fc48478780218c23df9ad7a5042af967b69f8d8f211d29bdf45259d4065a9026d21e7012601e6ad92b0fa088b0b775eb2b065588bdb4b5896c0c9aacfe62c25d2176496f6519a4f55ffad94c20c4c477dd4f6959ed11c3be23972470908be52f9c0bdef44aff436f63fe8b44d8e7cf72941e406e9317318632ba48a37f78c04cd553c96fb71bc05e95b9de4d793086a6d1899d5169a0c82b918d01e4568db7b267d750566570240b4aa0d3c86e508f5548b74d26d50c2a4fdca4d3b93240cb1ea35e13b04040234b99bbbc32c88a3421d07ddf20b914cabb8373ae7ad109872ef36cf98fdef81e9461a6238ae470ae67a7214d719b52aa346b2b9e2533c7b02071dbfa1609bd05409b21c6bebd29039fa60b1d0b0365689461dd5a44dbae2e07a8c0992381de25fa7c29130118f0cb6c2c9fdb415e76fd687d0408fcececb3efc02a15a5861a9c5fcca397b50f2dd9654d1a06b8de5ad46faff15473b7323ab0a13b5b45edd16014346d8e5343ac5de9d781797e3a0a184f1fdc4c302845922927153524c31178f8a31c4da9938f36a311a66246cdf42294cafd338019d7b27bc332ea701907bbe8b140b07809e251a85c6a10d85caedfbc509162b56a72d2cab452754f346b15d2884f28add106c955a109398c3a04e510e23c25a6c704ab1d67970737cc2162afb339013815d4933854c8d63dab24a2db281314e093ab9ef19ad3428a9ebb035471d228b2c066c08741cb14eeef5f08a3f71e3c669b2cd3b9f21c81c0243bad9a0666fd502ccc9fe15dbe0057e31ea8ed68b94b92a6bf611ed8d5bb675c9929c56d13a63628f80c0c6023473590db25d315782a8a48f65423f597a63c759b0955910cbbba2315b32c85819f781c2eb747727b7d19cebcb34295b8083039acda3d27b60d30c467b3a2986531a82b549d285adc3e4379ed54b0fa598f1d983c73cc266720916c5cc63ff3dd05357e21b424347eb5a543e209fd88e022b3f2d8703212a28e7eb374e0553f1bc6f3ac74d5a0f8b4ef5b09c64a067648e9d41c3c941d4f9984ed8678ba335ca53fe0abba70c604a11b9a9cacda1decf57c4391968f4d25f9e60a0767f9f451850b85a84b07bb3f0105413092b29e2fdfb88e67197d4396542069e5fdd436c8c5b247aeaf91553fd27c652ab62c7d0f5169e0dc716e9df6fcbe60bb9d397f45f66f999cd5acfc59133b13c9a6cb412b3cfdbc05e80fe5efcc333416f249f912c0a6cc47e1f3901dcfd12c5778448a6016f5f723ae328f09d7f05da583e747c077b36f692d32f0082f0eb6cb50535783d51e116522ce395b145d98e31e2d59335d4e01fe9406f1076c40fe948cf19ec90c7d0a1fbd73409b61a8b693c420ebe0020ebb158e3872a99249f41b194a878531f7c2fbb6d27b7fc8c5a4e94368bca0aad10aa6ae2cf7227b5bc3e21f4676878ffa43eb2fc02511345cf0e8166391384da0bc3250d74d6865650ef76c243c83a2c2ddd3353c63b42ac0e2e2b60e9e367242dc404c6ee72ec8a12a62f5fb4298444b59cbcf89c2443fabc54ae244df255407ee7d348accb76b14374a632220727368559ae095489238f1d4c43a2c4750aabea39dc0ec39f5c815b27e4536f287b36633c712d44fb84a9ffda8464493501fba9250c7bad6387f31dc208bb210f76eb6a8eb263ab934805318f92c81ec5559f0f3716086bf03f48bef6566c4d02fe08b64a2e19c2027b793f2ee46ea2c8b26fe8f5324e70c05d5534ad8bca0e16fb3398ab2e7afa36cfa74d119e037b8b2b6ea3d83ef8883f62d7166d0b9ccde282ded084fbafa1bd6fe2f016e202fe7014b0a00fc79e2cedd494161b1b390d518d8595c4fb203efcb82ae2f418b45b921143cae471dec82de5b824c6c084f1aa9a507586d7631d4554dd8d1be54435926410aee4d241f5ae3aeb632592f8b33861c218a522e973014116a920ec023f05b05064eeb84fa284625f2b117b109494cdc94cb8c4dad37ed077963accaf3b628e4f71dc29ff6fc7af2d83852f9f6325017abfbc60ce8c50c9d8b90232add95015a5e52ad087c108a344c40344e9ec3fba0f6b3d13278316d4e84118bc0f26bf6bea296daf6fe279fc373a996bbd5b2ea50e2dbe5f747dac7d1e04be22068adda31636d8d054c586b9c98432f182126a78efe5a3dac46d3702410c6be5af56f5420bf6741e816335ac8d14049affe3dc2cc901d14740faa232eaa23d9a1f5b5abfa3c27a3ad5845607dcb17dd93deac0a8a8e4e72b9050a53e24a2968061015a35e6f33dad24b0f644b9a8c9e5e549dc647700b1b13476dacb8950b97257a41ea977d06afdf74839ba1469293368dd6753ecd15cf1ef637e03890df6d81ff01ba0c2872a22e427f0bd51f76df101d0fb8a978ed3df0866d0682c5ecb00b9c6931992b7aced9e4381b3003a98b8f69a91dcdf695ad7295e37dac463c3918a35c24ba2a044288e3742250c76d2e982c366546f9aecb8755717de309456fa4f7d47ed3e1d46d1ad4bab5b3c50ac0456b971c7366b01c5d9c6a9f09679aca185deb59586a154d9bb534a0b6c721ad686f314de6ba3606fbaaf59782ee2242ec3ab73a3aea4689b1de73c4b2fe7b5be10ca1474852cd552fa0aa5c356e24e3ed86ecd4725e081ec90862fa9203f3062eb99cbdbe8830e7848e8335fe6df1038973d870cf8803f5acc77baaa0b79485ccc73fae17887e3ec4fd3303685f90c8a0cf61cdee4de9d97a0350de0b3582459ec09abd9052d9e21640299d6d008f7e6e02e90bf90cca997c26b9eaed3fad57907313a3cfb97ee6b1dab6f856616b61f327c88ab6ed5bddac0b435629449bd7e103bbbf68f7fe9ab1d1c1fdcafe06713ef5c4a0c00e27e2612efa3f419bd5b714c5d0a79471b53ea1a6582105962c1b7296820ce7821226d558ab13a7b94c9c09e2662b3d0eee975a9d380e7ccd7de33096ad9a75d09d23b89a03b8c3e3f575299c6f180e16ed89bcc62714c00d17ce08b3b0f2c2b2296d2978bddd9a61491cd128c6bc91d8585636f2af6fa284d21d1eca4f71ad20c0a35900a5d6dd557ac079727d644ac4824ca1db64247bbbc67e328a2f45c876b86765ff1a15fff4c9c10c16bc23b62b0d81cba3e3e11df5aac1717fa8ef551297d6a2488458dd911c197bda3e7bf73afb943c493059dc2870b3506e8ca4da1873309357e84510a4950e456eb3bc46bc865359b9af47d24a03375c8dc0ebd01e576c08ae1f8b9ce5c6b0c7a3b9c83492ca173b54c5e958e7b1061d4cf2dc855818ecdb515c5041bafe811de76ff8153fdeacc4bd05158e111fa2500be4f3af74381fa0e13b9783120c1c58f68522fd38cc626a187b37e30c30222444aa810cc39d6dedec7cb805c900c41bbf164f999204765c2cc623775534177bd2d65decae9f886c36fd3695dfc8cdb9f89ddc9f6974d500980f645578800dbde7e2270619268fd3a64c9c6de2925e29351f780f7d46a4c71394ca7268d3602c24a1acc664afcc8af8e78c7818896bc1a25a5f1ea29acee1a1c1d557b9ba880c3745bffe9f50bd83e4a873518ed1e5366406b7a3cce4a86f99729b36ca5419d7bc73662dae25ddee613fea62ca65cfcceaec47f919df2ac0d4100b4a958d64860d8b2f2d018d72e52691ca4c7891ae44b37fcc6f2536bf3582f8c0b4b56dad97a1026d5b4320086fcd6487cbef14ba61a9192a99a5189987b81d9997ba6e742178a438048e15b6f755bc390b1c8ff7a86ed58e813c59f9ead4887438dc5031ab68b7f16b6444ceeaad22ca5bf58aa0ee60deafd3770ef8527fece159caea8fb59a9e2c26668b40d6e6a1c390b0400693835ec85ab6624a8e54e5eecffb124d74806f48e009ef804e2cc77b3c2ab07795cab75ddc284b05566cd37bd159ca6fd24d7009a1386ee1e0e72d17a9bda593f3421a83dcd0e82c4fb758aacbfed7a09e75073142f91f00d42974f2ca9a71c8a45d73abd70ce2f5c951358b788ef95b23fda906ad106b4294df44b5083801f8e884800f904e7b28f31e788e92c8ca3267280d7d397fa0743646c4267e10066e9d907085a0469ef3036ec3e78d7dde5ab6d325f1203aed490a4c3402233176065be3b7a780e9d09c36b5d7af9d1d78cbea6396fca53f1d6e0bc2895baf2994f9d0c36eb7781e2e08bf7b866d91f0c64be1cefca89bebbbde969bee35f6d5ddadf4f0e520d280bbd87e4581435d516d6c862a61d44611d4161e884ed4461701c8adbab5cd134aad71622bdeb3dbc9ad4d92f7478440a9b0bfdd7c43ac4c0b15bca88471a488f1590edf8883b446609173fd9086dbb7104b6f1a334ea1f92df256bb41144519e8cef4352780dae1f46d74e6972cc1df09e1cc948f730a9906ae0bd206ac398d946199c391d528de553281ee34a53b05d5be8fd4fb0ee14e516d09664d47819130d7832f159d7daba3151a7d7e11a09f78d2ba46dd8c461ddc480566a0ac5403c85f5502dd5b1a9342d20ae9fd056766404145b0463fd959468f10e542315b383340b8bd65bd8096a83dbf0dc7a98cac12b35ac921b3ca197621915be8b7ff768dffeb79d0411217a81dbb7d26c055c6a7cacde22a128eb516f22826a5fe5823800dde5317d55df2842c8c03b0b5e13b3280a37bc6f24e140d16c40cc7a2b04ecfb9b253f6adf3d884aca5f02a247e26b084c9e3d457520f0158d6939aa8c305d4426bcb73d266d4b385daebb42df2d48c29016ba3fa390d1285101293a0500630118e5e0a1d04576ba9af65265d53ebb841394fb5e76f292eeca6ea9cc1566d7410ed4c40c82dbdbc4076f5f8148818f969660df7d2c2d7332abbf98d35290a054d74cf243eafc5ca519e00f82a09bc786d01b9c4882fd24ba335b847dff3ef3ad7422be7ff909215b0b420cf84a779e13107c223d36120895b35416368a1bab5d452fa35a42180d75c6a47d50ae3626109a45d8ff8e412c4c49a31669f95134ae2b47f7afd5365f76f1c0efba30bdf001872ca41bca55f8f8ffbc778afc7e080a8c13bde0d8fd64fba23c63e36d8b2585c668151d8358703081293c07605488956c02b6b43cd0851d22f0b6c50c2ac1437e121c5758ec383f522b8469faf1eb93b32c9140e49abe90f362ab35317ee571df07e95dcf7f2d53771530a4d3d88782cbf4a2829cee498ee5634b4d8d36c4eee76528c79ad99086cc8eac369b60506a1aa26f0a588f709657d4eea10d08b06213bcd55d9089876c78c2182241e819bfba1555450a86abec05f26fcfc712bba3f4669824fc82ad4a0a30ed6925e4c908b7d4d103ed2a532034d563085a3c0a37b31f78deef7629d430cd6c5d383a2e87240136e20906f7cd5baba35314156c402dad8f19cc7844e0652b05e575d7e97752a90a2ec00cbeae36139261250627a9d99a140e6149534c6ad68e7b06f70e442d9997aaadf28ccfc9e42405979e1b6801357b3d160b8088ea1bac351ea8d0e2efc17bb6406573370e0017ddb233424148f5b65e790b83abe90ef101b5d56876fe3c1a8b8decc330baaeacececd2d65758023d9958e9d966eb456d707e40382aafefe8ca71dcecf4ea2ee088f9fe606dc96399ceb8cfbd7a701d703021611371a8eda79fafa8d4419c062667ee6578b4bc98f1143f5b97e53196ef4d389a23884bce6cc331f0feb32ff9150f94adb5a3a2bd0831e811c492963cfe41de6b1f080e2235a0b87b448acc93d46f4a98620333ac6edac2906a9e6a078c6cde340e4f15127cf53497d0154f388772f2491bd0a7a0587a7ab17d48ac2c10ef1130ba2107e046e8be30c2d7df219d254b9896867d3c76774787e26572a6050d6dd8ebfe8dc4c37e5b7ce2b31f01c317e784936f7097c85863e50d0562e71d4ad9671f9510cb2dee75852961c98f2fb3d9d8561f1d85e9b7adbcde8b30c967210b66dedb69b0bcb9e15c92aba76b85b64383c64f399a2bb3a5253cf871b53ebfbbccc597aeeec0c0c1144b2054b41245141cb243ca73d029b213b15d4a569a766462310f7fd78528e79995802902ceeae968b38a5f00440864d17ba3810cf365de00674a5e620b073596038adc27eb96901cda40c7314f63fd77587fa447249b1da6347c43a4a2b1e289037565c4a6c64fc6d0996701630423e65558395f210d79582227c16ee47b0a25a4bd3a7db3a272dd8a429132cc1c5bc4eec5c2bfbf01e06b744824c01db2041652c94b6b6f57353ee4ec01cde38b8b5db90e00b54269a70efabf482b73d365466bbb911a76cbfc0f50538087249f75009e6e194d4e439029c65f80820cca65bfdb0d3c543a62fa0d044e275001a206b6077c146e7e1c0f18944cc4addb1ee1146012094b2f3900cfb7693dc13a13176694c63310d7a035fd0433e266a12fb2ab3290178652b32b3f0ee4e032eff50b08ad1d59b1330f1cb744915f92edeb6cc39c335e77a66b21ebe4531145b31b46e1361147468fc3b44193bc570af9ce4ac09e320ee92b25da1285f935327c0c68e47615a08a5ae62db99ffe590b499ea0af9710c2f67c651c4a49b4934ed8c1fb9fb3a42da34d85bac2c09dac894e50d7c2b5d2646a6a54a5dca55926e0da11b6899dde9fa2658706316ada5ce3e4b85c61359d02165c78e334429a23f2de91ce3b4626009023205ceb1d50ae13eb055a2b182fede06252e605baa17f8cc0a26ca187189c017e0577e48cf509c1cf1a3924302070811bdf674ee67305f8f248024dd61a026a14c1249d533298220b9be36900780328e756d8c68a542b1f6290b78887c6b35064de967dbc126d7b690aceff137af2c59a411ae822c4a94a1a0181b29b629da52737128651c7e8ca528c83f0a04274505337b5e28b32cddddcb1a3634f8f6774464b7305d4dda73d50a1c035c70d8ff82b408624b9e8e1352432815eb206dc35962fe946b1128fb69622aca0231ab4e801516f64825a4d1f27a3a6ffa56750f589c24ba1834a4588b47f0261489c0918e7e32d68f990fc62b9db92706e195b5c6d9e10b6d61797c66ede1cee8c938a44f018b3cd031689f15914c83063fca831086fbc414e9d07bad8e2e83e8247075c7f5df0e090c44a0f8e54f06626275382d22d91f9e9088bea8761bb3971137e3bd0e5595f0f97dc01383bda30a7174a6c6011dcc36750178da7fa78e911f9556218a653acb99c1286ab1b060baebef0a1d108e8c022ccaee5c131af6cbf7f12c53c7e4f1fb4d84dcfb2f1f0b8f3478adee60c95899b8246ff66b1d106685e1f6f06fc1ca8b22afe280004dd20ca3284f9c88bff325a6334a0f8850732953896008683b41615c3fb32857feec858c69eafed4944d458608d5e469b55d431b3d7095c50447f5ea14823b2ea66afeb828dbc6a78d2e260eb8ce652a87ec5158334f13769affc29168ae4a55426a812c4819ae0e80499d399115b5c06bac525c6525eee3770df2b59ea647d2940bd88d3b098c7f299e7ad931099c3f8d14f730d1f43bcf0fe7f9d38df46e877651d57437702046c8354b0fb7b46537c0d30f1f77b913c69b03e2aa89b54165cacd8d9e45e1ef55f656339cf0b019088fc3ba73a0c8af31db85c46d25ee1ab245623a976a1cd3ae0a9d01fab040eb5d8e5995e8aa99d1887fd47a9e88ae6ba9af7dd796144111be04650389c89006f82fce479bea73e6e6f9fba115eb1e8f402f2ac1b51cd2faa47abf0205130e228777969a4fc0f01741bddc27f728d9af3b858ed8458838f0c64ecfbc5140f248529b5a3f1c0a052f2e328c585750361da0b8134ea5607a991ec88bda9770c46f8d6ae440e5c89a88e78e05b89e1756a109cde1ac59150ae150c52b5571a8ed759f1e6387fcac6bf92563667a885ed4085d8fa43d50fd524960ec1eea49b7a1c11a0f06c5b50c360f1daee1f078a74431f64c1ff3b444be21c4aca92d88315d936f3b06dc37ca89526cde13194445717b02998ce76fd62c3478dc8b0b38208614adcfef4509a43a12e52006889aaa5ee009328f2867a9ff459a1b4408eec256757f0de1878e1f62bcf546948186c2dfabfe1e001c9253503a2f62336112d6207a0de1c578e7f53586e42fb6c85a2320bb79db51fe4fc31e2282ecf5affba4fd8b6cb48d9ef8c7f4b72c87be045c4446b4ff3e718844a1abdef9bcac8a16cfe826952fe5aa6885040d2745688417203d0c8912b9ff762e8dea1e44c1729fc9294eb29f96fa9cd677c8a35b830f6c878efd80638196e1955440b4be7bac4154ec875e7c53f4d6b8b67599cdbb95056c59e8ccafe90244552c2ff6d6e65bc54f019c30b161ded69694e7a0fa22181d57a561474ed66d664d2db219f33536928323694e0f6a61c366d301699c3f6da6fe51cf6ad47eb54b71d41fd1c0a1d3997006e6aee54a3238e5bdb71b5659c7d0ee19fa08fe6ab554b2f57211ecdc78ac62ea7312153dfecb615af96843e6d3a0aa1165c19cf81c84fb4cb9ad78ba52c40be28c714199871232b31e4df42f3b532a207e36b234a46b169ae7da855f0cf71a766214cd0b83a669b354d021b3266a40d665166733d90a4205ca8e208b410d6de31a1d1388823f40a2c177f0c854f4914e3e430e2bd1e722336186a2162e41a15ce92f4185430e8d4181bd4267588b740ee47f6bd300795e206f5ac6cf0be58bc082d54913e300d1d19aaf5d3504c9d103d8d021d15379753a40e8fbdba5fecb8ee9310d21ddc55c5037ac15b3b3d913863086944695edc5f6256f50d3acd8f0060a4cf541ad2dfed806a75c45e4a2680d23b3dc55e0f9eab9f5753ec096736122c3b291a28aedd358544e0caa0b71132de2ef1402d7c0c47c4488805f309ac4b8d83bb28282ec75b1201bf091c0af5461a5028889004d0c03fa3bc5074c73c459ba8e7c7ff13bf9d4257cba0c5898676bd86991e156298df5239983e0e11b8ab85a2f50d6b3bd71744232654380d35bbb92e5d8cc6a479656f75e008457007d64ee1ee04d297f65a4cefd2f073e0e31fe22023769947d0e4e86735eac822f5447305624f292363e015d8cc46e852fc5568055abbb785bd1a0174ffee39da21dee2499abd4ab1f2ab7174136ecf209fc4ab6d0b06fdb4c8dee428ebcb52eb8f8466a830aee80a139c540b2ed01acb6309c78209483bbeea703e65afbe2159605b81ae63e815a95e6b3ef91e9a79990687b1016e382e188164307a698ef11869bcdca6378153a65a65792979cc959873d6b3de72296f8a63bb9a7e3b5aca34e072d257f63f00e72017523198634017283379629d0a296ff8fcb964edd00f32b69bdb00c6e80e3b874d91f2702c0e40b5766aae8f08c399a00295006b0ccca82961c0a7176b19088fcefe4d232cd33f288dadd9d6608901d0c04271c48ceae3f7c1e9993a62e1f8e8b4a7bb8427bacb5ec3c1f2bd7d19b42cdaab0bd4e47fa1ff907f8319d0086449d28facc9a1026028698ebaa94aff30e95fdc3d4c45c79e712b17ab3f2e954fdb8d09d2958d84eabc470e88452c8befed1d2083adc1fb086cf568ed9ad1bcfe253143f47cc1a59128040cb9bc6882e7493e563dd51326c1a064b244e56b81cab6171c55ae1e05fcdde460acb830de6104c7c855063a9cf43ee5835ba419455a8a1ee982d1dbfa0268ad956a49a4158e08d4685032e81de8c4559961610a44cf10eed1ca7f3687662c51481a3cb3b409036d9aca56092fe92aca74f8bc55131d35967c65ebc96c7a392cb0ac23256f0ab728c8552deca3c96e083ae0397360b84e11f9c41d81eeb4e43ecf689e133f890d2181c20d599f169c2e8f2e09f3631aa2106c9669c361162c8a81510c38b2986b69e5e2e9d1704d96316dac7c28b2aafb7ee685d89e8d7e176693acb3a57593c6c36d862c2a2a30f8c8ef17d09dadd06acf70191c6501999f444ea3b80bbad10e7ef3c26646142151779e955593cb8bc645b108bd4c93ddcf1e1f5ebf1dfe4f199a0ebac7e51291a7d6717644325816c802f57726bae2e461ce56ce830c7316d957fbf553433870c0fb14430cec2424364c411fcceefeaba45fdd4cdfc8fca710137e6ae4661e3e247c0f972ff7e8fc4762fadd8184bb95b313024ebd9de63ae2b3a0e2c1dd6fcba3080de64512d664c5cfcc93fa1c120ab70455eb276915978d954243933b0810af9f37493211a2449005771aba1f0b11050fe9b2d6624a144cbcc868e59fb8938afed914fb5a28e3d85b57b9e7199d32e63a6d57808c9762e651a8672fe4788a959669c0ad40af0419ceb4290941ba027fbd2043f99be8c581d17c4f7d6f65aa89b059fcbcfb978f315ed1c4146131cffabbcae41d10506cb4f56f4d2366999d690b36891866418e13a5d7151eb7c1d7bd4413e51edcdd180886bc6939aa37bde79ac8a53479de99a762754efe6ec680f9a6c9ee91a3054661c4a727e6386ee477f99e26c160f8d1cc0ff4183db7040a187d9ed0e77f3939a92dc4c7c78c9ed1bd12d8adf8eb9cc9d567806d4cf3f51f1ca742017850bca1de7bd2ccee060860c2c770cf0c0f50122e99c698e45c04c41fa264b12dd0b22e02f25f05ee978c175414dc5422785af196f7185e67fc897a45b64c12761f16ceb6e3909807ff171b8c3d91941ba1b608bd334033f83245a3ed408ba9de6f739f669120febf9503dc0b8edc5700547e292b4c04eaaaea4059325af13b2153712c8e60ca7defbab3950035aff022b095c550cffd08c503f501557f72630036b75112cf07d40c3d819986103057281e00f756672098f5c0a804a3c891d97257dbd8398bcabf9d82bb05dab00a5cc7fbe95fd5b48d5752955935ee9c32edb2966328b0a5444f9d80b6f94892de544374b8863ceb8ef3143b17eedccccda82d531e1fc6b41aa530713b8fe5ff826ee41367b468b0a21c4009f873be25f755367c958167fdc0a4a2347150377ea3b73c69a16b24cd4c8ef6302979e55e55c3a35cc0026121d805c155a68e6aa17fe5671a0750428e416b686ee7490793fe9a1ad74d8cb613893156543f942025ce448bd8866cee44155763191c4b24a25ae9879629b32d735bfe5f7f292346cb09238e11132d4488d145903e6d021c3b226b601fd944d12310e4318f70e0ba731e7752f0bb8239881382bd074664bee02009dfa7b3c49848ce071539693f71b256b49228b912bee6d9f6264a258ad89daded00863084c30de4d393bcb49d284954434da48fe8e9c02935b391f70b424caa4d002c7defce593d5b4e5b0ea1f44579c8a95c2acdf031e43c9f657a6e9e77e6e9e4b0d9568aa8262e076acf5ccd76e0f6f33cabb792807df3800743ee545be550a16ac2345be5deb92288632506f0e9feca75d98478fa0a2073265fb0b4900290cb991947f46edc158712751effd1a48721c8573b849dc6e3bfe6d8e6979c9046c3c3689eaa81ebf101c41c36f945f8719e3b737c006232f8d8c8e52d9a8f1d8f6066d81685cff8461ca6fcf4da700af61928f3a578013a0e05e6ae112ff243bf19adc734262b9ac5493efdc400cb1aa2ba53a2ff488b618066ffcded4311b1ca111ce0d23be27ee83c79c08896d62f81e2760d0cbad8652d00b47af7fedcfa0d64f09ec3f26adaf5f9243c474ff78bf78043f3e4f200c705d61809eebcae4dfb90ce6ab5439df02b5494d6925bc083c6cff0ee154566676bcc1439b9dacf630a1b618bbfeb93126928a035d8bc483dedf91d59afa90bd49a934880e8d529caffff6930a40925a82b0e7e7a3d70ccd2757685e4cfade8ab2c48f22dae327a1eb7ed683491f8d99b60720f38980e9518f0a6df6fc2b645910f1e0ae9f0eb4261e3da68a0dc5d65e9b1a2ae8de4c15fafd9ed221866728a2ee9cc4bcd9ef8a689306aad0339004727c8c09f245208611e6138b8ffab3abe60699fc6259cf4c48f83ee2699ff2f858602a72dada4ede293a55a497eb9ec9b25c1c322b46d5dfc34aa4f0b57a861e859d031b533c2d4cd921884aba562ef3a38b10543d8c88dca1d0898975d52bd1a56577739cb7daaf41a3c0f3289e12732f1d23e029f62ed4718ced2dbc4b6b7828e818a0c6944737c094d8f900a113eb9898ecca085298128bcd8b282ba8862eba6df9ec8cab1ebfb5a2028ae056c5cc102408d5496a7bf0e80bf70f9e0040b10642f51b30a75327a4ec897e48727f96e356d62f41fa58111810286ccf4e919583f8d3b7cef621bd6ebd74cadc8b000b01bb286021164a9bb6686af684031f9468ac3f8c661397ef327ad54a5c53e775d0036ca75b50c7da2d9f30fc00597993d81552cf03b34941664f48dedf350351d78c0383e3d645073b07e07c6dfb69ce645b66c67c06fa2c94d89fdf53d10ab304074c897c92348a9ab829d0a64be5d7cb2aabbdec4e64950dbb4f3014631339eb539edba4b4aea354e2424d7458eb1a962ca9140d5c404e38ba882e90ebfb56887bbc120fdbf4fa11a0c8f59c0311cb9a6743c3bb7c634007dd85fde58a15bbf7621a25472b49ae506bcb5b13b9f2287388af4e66ea6479885c04cbd429252f37dab80ae8941961872d62bb342615be6216b35b0f8bfbe9a26374b5c6c9843a88624d8cd1072a11092cd23dbcbc4732fa6b62bc8a29c0b998547a513c39ca282a7d92881ebe572318fd36ca53393d10013f4f718bafad0811fd1d55076c1a80e8584da1d492b0ef7ac4d47111b865a2d9139e0db78352ed5c58af8cd1973c74bb8bc2b3e4cc342bbcd07329e1b15ff1e3f7a3679c4ea1b5600eb1262cdee396c1881d93ed61a13a9b5d8461fe5c6919960d486d04e68e2a2243854b58a23e051d7c97c9bd42349825c136142620a64bdacd7532b1177e936dd7ca7cd01ac9ecbed38f38a6c0099d9bf6ef9658185e363828a021c11f8ecbd035054c25105206cd3523f7e85e1ed10365a0656485a68c81fa5571ae0ebfb1d5a1a2e06079f616470f4739486a0d810ed72034f38eb28879402e66cebac618225dbf1397775f48548f2e5c6a1bd7daf5c7c38c3915b01d3f1c333b052cfbe129557dab1fc555a0796c6fd3d4505e5aa2399e2cdb96a89755ae68d26ff94f7863a225a24686f88268b5628e976e7b3e5bd6535f99ab975196dca881382cabf245a98c210291839f04efbbf9fd514c3d52333e0a20536d160916f6096cb89d8d8f88ccd9dfd469f1e9c54d5f8a26127dc9441355605050bc062036ff358795a69d963630a456ccc8154409f89f7069f54a070256a984d60370d1e655e300745edc34f26bb5201e87ec5e13eeeaddebb88d606b6a51d9033a860599085c6d0a19ff01c442ee2492646dc5b093d98919de4fe59e4dbb47bd89ed30d39268b12b39eda6b87a3580ae57aadc70c46451f816ef0f297bd374f002300e637dc95ad13c781d407070413bc73b6ad97179f6ded2a19173e21c6caa283640302036fff5090a344beed50f5195e93b64d0ecae631dddbcd2f1e322c03e074c9667d30dd8383a1daf03502ca58be80abab6ec56c64b3fa788916d7160badabd94e80e882a3078050a4d4a02c7d2a3151baed265b35a0b1e16ecd24c837510a9f50ced50cb88948e651c5940f00d5d5e53e0e5f541133ef0f672747941364838012eaf7c31d4613e552fbbe5457d01fa2e04560874b8818704d42cf9825dbd829debc776979534fb7170bd949f975d0d535731fc0008fcd10082abb93523f62eec44cdde4d99bfce445275d5c06687d4279f1b1bc2c1159f8923d11428994f53249f20606f2848c3d91a6ce9373347e8ae558c21b45f726d4993cc01690c0aa04e008dcf3ad4e2c2163389d407da0569861488ac5f27ca268f38730e27b1552c30d48e78af983853b73f231ccec9b20f15af1e3ff58d3af78680793e20447a6e45790bfcbe9cab599e4db5f9a1d142825485528641402f260983a86c3eb207ff48c025d81a419f7d3b00635d104ac709d79c75822b006742dcda914a02db077124a83709e6514b36e6f13a5f6478c4381f28a15c3454acfedb6e30932e560bae883278055d45c19bd6474088816ece1c9bd7ae305f50f0e4746be6b125dcbe177a7d5b609107fe8798daab5595d448e6066c74b168d6c0dcc39dd8cfcc860cd8cf12e52015aa327f8048a2ce50ef41c95df6c133189d01b9d7776a382eddccf5e078fe24e407149f870ca257769365519e22fefa49e8a1d32246865095428e28fd028660158dd7280ea100fd89261c4db7dcf818a812e3a24bb4f6d6c094a69a52944684a87ad91b016d9264a763ff833106abb9831e94e9eafa1b45178cc73fa4b09261c3abb417aff5e6370e4e74dd683f8790eb0fa8f787a076281b41cfd4ca8c03079a748bab1ead7ec9db5023e461e223d08d71b1a5d665269b3cb2b104a51a42e9fe88898db846ae5174e721086eebcc8c80e380910115d543535d756dfc2b8b499041984af4c446f136f20334d005b3aa896223cf04b314ed7ed0a84574b711601bc8a2f665046c744d1bedb7db59a6290293eb4b2728a81f092a3abeaa51548db3a140e0d666af93bf37a3c06937ae19e40321aa51d0937246a3b44a7c97dd916ad4982a20817b845ab4e93a0cbdaad19aba2903a6b7a10084204971fe5cad1700c5caf88e30ac9a31278392ef6834b5c82009a398b1bbb553c62024616fc62c20468988b8c1e2755a17732b16a54e2169bc1bcd820dd4dc135123e4114050c617dd416b83081a11208f7f0cc8a99deabbe7e460aa96c188976194a29b783d0dfeb47444e7d541c4ebadf9fc6d295edb274d09d9483f20b76e7cc13ca51a50a7a7720b38393165c79c1021292a360cef0a3fe3265d89b8008751452a0006758fa61ece35f8c468701b75444300bf4221780d3da787fbfb6278ad6fd09d8a3122c03d99bf5105d350c9be32fcdb693ad6ece0ee8cb43a2428777a50f7f144c11a2d9901533119ac7de81b3e77bd5974fd0e480537e35a0e22535faebaad439eb71b2b8b9d6588cb448fb7a516d37aa3bac1459429aa22e509152c8bc2328064bad70a98ece2f85c76ec5d2d409546d193805f112a6621c72a0dfc2548212378764a24edde3a1a0fe354ed7f3b6756e5579f181206cffaf61e0994885528f794543396adb125e11eb30db50de6385e1cb6000c76ed5c395bcd76eb8f6f957fd1af83879a5084e6942d55d53244945249daf37d91ffa6f798e3b6d8233360cf35e36603117f040ac66ea2f346b6c161ec07f2eaa7cab24e49aa1fe870cdff3f826da1c5dcb088eddb266afc2582538a704496b62d90bfccd0955527158134cd86d603768fa6950ff328a88850712ab8685c350d1eef9b6ad4ac2bd183d7ecbc05bb6944a46b6384430736a65b279c1519031f47adebdbf439d7d87803a2c406b2ef744272ac46d42fe444f5fd9f95f28aa359385f782450c20e955df989f2d8c0f53de3c8dc33e88ecc4befd55bd99b4f1c944be1014aaf1786a54d2d0937569bf9101af6b2fe848367073ba1441be5242533343b7adfd87538105da0e28228905f9284237de07318eba50aefc557121fc49643595045e4528833f9d5dce091cb6959718ec4c3b350aac1a272a6f5f7ea5b6db0b53ebedfc41e4dcb4d2aca841e28e4211bd617cdf74736bc3454b6b47798e80c98df1eb1aca2af5d553962bc8905cfa5c576edf9e5fa42dbd5639867b7bd08dfbadbee3c2c4826bea23920fa81d50989ce9238104eed0c048c6a095bac48387a8a88ce1235f2b74988a0781da5d8b086427be3fe0f8a826c2f3b9e3ed1c6893a3335bab5b0f2a3dfc3520b38988ce324c8c4e42600972f18d26c4a6a12f45a0518a439826e60a09114d2404722acaba86f3fc9fccde76c8eaa09ace4f50418cee21b4f8d4ace7deac9ee7a397c9336e701ea54004c18705c7ea1cca774b95be5d1acd5676207f10c8a219d98b03861e5091a83881cae00ea4037bcf1db741c764c011a2067479c8dbdefb62a38a4887a98628ba1da33f4fbad61bbf49b1c73dd66e3b78678a3f51a3431747a5e38b6db8dbeb2dfbb9f7429fa7ec2e9ca5da87c12cebe6847a37e07fd7aea404383a7177f85e4247ccae35cb4e8dbbfe7c17daf18e4c6455ddfbdf6bcbd22dc05ba0d3dc00326d0ffd72c7c3a00903a24748abd632a648a529304b3cbbd3adc34eea54cd0e81e39d863f69c6053146b7fb64256bb31b6cb11da60eda2a2206c9b1d3ee62643daa654d743d41c4445f652631b037472022aa001555f40103a520749337a2ff74c9eb17c5fd538234b5d7f94b0aeab24a8194f51eb0b914295d6a0661834b85a30fb5282dac12026a46c81ce0077c299cb62cca54decfbc115a33efa5a89c860da1f697b9e45a2f69b07e511d94df6de52a694640a2c05fe043705d3a548fdffff7006334c30816a41959672ce7108342d42087265195c8910028d09593896fbf7301668ab9d8be511b3425705bdd0ff0fed38c1554e432bb5f5411fe4ac2ef46edb966d97c1c2732fe590cc02c73949509dda133a87b33ea8ebfa9182ba1c246efca01dd07e2f8abf64fca117fa3f09a9adffa0eb6e7f4bd7b4fee81e750db530d7836055d023008604a798850058145671dc78811cf76d0e677d4f685d5c0682c1aedbefe9b8b1a7a784c28dcb4cd3a30c0664a0059b057eabecbceff597c3cf4f952a8cb2e99c65c50602dff4c018a4e3851b56d85812c314214364c780af98e224091f3220aa62053b4f86a080e8c847902a349c7904edc8fc232fcc716bf031b44344e767884d2b05432263004ba2fa61f244143ad0600620a0244549b4c072b0e1c36b494d1180978e12ae08c1a8b2654e0413dae658e52073285ac827a90cd163d32dba60e3a20b369f3bf1893d94144c1f2170a88f0e3823707033d4812efe91d8cd4322a7062f12d00caeaf881bc8a4acc7e622ab1ccdc0975e0283adf402baf88110b358055d9437f88090cca6450904119b8f0592a31268b5296c3e174f8ac0812182899e17516043309a184216e3082747b030e6c3188eb1026ba266f3c9907142e665c8b08c8c1334b8a049cce68bc931c5e898d884237f6e301e9b4f0674b1451939b28d49069b8fbf19d2ca9478d07106cf90eed26ae1ce1703a92048cce633812e4a23a288c166d3a20c6283cd37430632e0f10074513a81a246037491067144cfc79fd835bc00064734c655139b17e58f1c7864f624458711f088281d45aaf0c85ce35703e492b42cd8b428b380b6f95e74c1668a2ed8c860f3221fe192c1cb864b9ced2ec749ce85d895626bf2dc5389071df9348a96c61896c06f1cc771bed768c92b9797296220b369d154021b17ba856f1817d8808418d12bede7a05f069ae104ffdd820e9c89fd7f4e4a39aeeb3cef0a89c4f37d2058faff77e9b8ffff7ffb55d03e51a7adf36dc88205c7712dfe398e724fffe9ff3f0ccc8b1730beed93649c2c15f97eb64d9cd384ea145857785b61e6093d671782b5eba8d7cdd925145ca4401bdd1e3d4a173c396128d3952bd6e7b5b54d9f63e67c744a01dd6839497a2aed9452be9ddd3b9ffdbc446fa860074a51fa90ae5b8591b9aaac02e00baaa95333b3da629902c250f6773bdf17b303496d71da8ff6a0e30a7f7fec412df7b747bb8f2bfced41d93aa5f2d9b6387b4cfb9c5de1dd4e3af670abc2b4d44af719504a291dd2dddd34d8092484e8dacb40428e70b1b3eb17915bd5b988dc2aea593ab640fbb6649f64bfee1320a78c0a9e3dc14b25913db0fba6fd1f7972d3722329013d56f8eb8d322a4caee3c49ae4fb627620a92d3bf61819013ef698d6ed1c7bf4f011ecd46a862a4729e4e38f4116ed0b10555a3ae79c7352cbb99d28b0e52cb52fb29da25bb72d8e45ce999dc1f620cccccf2477676667d18aef5f7e3584093bf5bf82a7563faa5b27b9d862e196c6cf798ed3aed0d76d277222d8bdcdf7f031aa822c655326206f1ec9b668749be443f7b32d6fb7c5020ca480bcdd6f6cb5f0baa4b1c7db1ed472ad1fa9e93a08829641b16bd15d5c25a9a06dd502c08c61a7ea25594bf2c6aeb3f91cb8fb689fa8ee7588b7ee62c7e3e7a4942bf1e0ba0e7c0f7c91db2d898769fc7bf14b3c3caca5ce1d76fd4e9c97177f77b79f14755aeaeeef3ee79cd4dffddd7ddabed3dffddddfdd8693649feb93b21be4e1de318d8fe0d675573f29e5e6a44fbb0761f76d3761606a3834278fc9145a9be738f739702caa933b35168d45b5d5dd07ed58645d9c008ddd19449f6406c00dee2f2c615247d61c088c9d72bc8953974ff0e6b64c93631e16f76aeebd3c9977d32c50c7ab51596d04615e0da67acc7b81b5182a4c85e95477e5efa1529d368a63d4aab6738b8f20f48673d861f306e3d76d392cbcf376e2a17e15137853f4a86b9e8775388b0a0911111515a53c968a5197c7fe69cc7178ddb62c9aee777fdc9677db5f77c85fde8b039ee542f9c3e49475308bf2aa3b57558f4f39b583dc964972d679e894568137156cbba559de4dabda0a09111115155199f3c8788ede8b36a1317726cda253a80c46563d99c77628b3bbbbbfe9beed2167f7d1aab6418afcc6c8e8b656dc5a05b96c63e4e8ae15f3c3b4aadf7dd6790cc9c7a816cb4cfff4f2c80c4565f14dd7533766c41c9da2717d5c75aaede98a7555e8aa192bee819626095351564a79830e999e2a65dcce59e1c949953606078333752f505606067c1aa24a7b12e2d4a44a7b0aa2049e4a50a53d91a04acba75895f634822aed4904a453083ad39d999d9854694f40c4004f20a8123cfd50e589a74a7b3af950a53d2da93366988e440712b343893f8e9d2aedbb8b6978ce69278c7f7b825569df7e8ceb930867a594524a29a594524af99cff4ff13f34d3c0b8df75524a2b6827f818d5026b0e84756069562864895245dcbde5b6dcc7f5b1baedba5ac3b0959a45b72d8e7b8ebb9552ca59d42c0ab375cdb43c463d3e2e95d12074466f688de604398ef8e2d22067791e0f0fcc59df9656b5f5c1132476d39323bb3acdc4e7f81df154695b1e8f6409e37ad7ba2606156a5509596acbf3783c26cdf21cc7a9a276ad6bc27730a6836ffff79e6982ddddf97fa6099e2b8963674ee7e114a9c65dfa0cce69a79d76064bcfb792bb3fb295737c87e1b9cee3ba1678f2c6b9a4bc55c0eb3620b9e9799e970a9708e5c81fc3ac87fa29013b81002c7bca752c1b9a22c8d6292afe0f56dd10e42c9fbd6b0aae79186641ff836aa1366016c9457a915c540724d71592abbbd9e1b6fd5793c0ee3367713ff8067ac5ed1bdeba5a1c90fb409c458f66a547b473750dbd75ea3bfb37f0ff6056aa5b5925ec8ff4c63492bb9d08a4b3e146da4adcfca6593e731ba433c4c4d6e4e67334e55def7216bdb9aa2dbd7d4675470e2a3966cef2a6b4aaad152c41424344b6a29bd111bdbd4b86030437c9ed426ff4c63a4830128fec9cdaca715f1c750d0cea01e91a0a05a77ae6aaa6419d6a2dac6a4b12fd0ac6d196ce3ca86bfcd6140aae711b70aa9dce5c0bf7e3320703b3e810bddda61c0db7ad9778d0a14eb5a5efe36320811bc25774372ec96d5bebe880eb5f52c1fa91935a5060de4819a00ffaad6b9a5b1db8f3fd0a667db6ad6b61562a0c39173af6fd69e5fd44209d0d69ec3e48b35ce640bc87754c3bbba9e504b90e13b735f1db8beb376771edb7dbae113ad576257396273423aa157946b7adb78573f9e8d5967053925ca4253e4681dfbfb74c91fa5f3339b9ea1a0ac8a1dba3b20dcbaa564f8c07d6cd6f8170061586235fae1281194808ee4d735bcccceccccceeeeee37d89d4170ff80aa386666073244aa7b75cccc0e64081bdd8b449259af505469e7cc7c0dd5409d666a3594a9531ce8d3dddd5d426a7ff25017ddfb8620a44a16df29eb1ed2804638030f98dd458b1930964db725c3fc029c31b7e5eeee73860919cc3142f7903946864c8c3bccac35653155aabc31556a8f8b49396ef2d0f08085a55199ffe58aeeeefe2f978a033233bf8852a5fd92bb7f2770520aa23e926703ec263755eedc29ae9269dc1d8493900ffa03366aa4c2b80c54e4ca6d851c14f5c565a02244dc16cb389d5aba0c54e45b02ba4650c244052428a2e449141d44143a3050b103262c883d15b513d8fbf95cd71d5152848d072d4e847c04e004162388f8c08b49139b2943cce0460054a4c80744e4a8080dd72f03150112d6c0fbddfd03feffeeefef333566e6999a64d7e7de726f7e99596ea4a8a44658515999422a21ca52b16047a583a954eaf30098a6ed000660c36c369bcdc250cec974b28efc117674ca1d65ed8d54cae74b5a08ca3b994e3a3d8927bbe69cfe9ccf4c9db9d9dddd3d6666a64382823a45e47bff4fc16ac75c9fd3ff1f94ff11b8ffa4fa3333f37b833876fce9e49ea02f38e64eba0ce6628689c9f1b4e0ba8fc402fcc09fb0cb5f4b964f3db8944a3cd8babb3f8f0bc5b9a71eaab4b3e4ee140c71ecb068e102e60507c1c0b1e313c78ebfff0c13a71354699f99993d4646cb788c34b1e02798cbb89f9038e184b4d5f07ddc124bf763979225d317579cd759f024555af7efb6925d46858fc0ed96ed62fbdfeeccdd4fcafd7f77b7e4cc952bcc5c6b8c18210768133464769eb9c2b6fd9464e68a7c66a6cfccccedcc5c7960409917304c251e0f83c3072ea4b5414a394aa9c3ee0c1931301cd6b00eb90ce8eea285f3d8d08662eb41165bf37a0b16b4bbdc6df5b84fe79c5f8018f7c7a0cbf25a1c3e5489c3076646fd77aa06337f5f1751351e46cf80364a3c3886bb5b8bc38769a5e83e7de6ca094b9533573a1040b8718326090d8d291544dad067ca5523b4aaed8e98549154cc7577af6296e5e727fc6933d9c6483bf1a3e4c7090b2544d044254458415332e77cda046135189a92171ea42949e2e727c8121a8d46a3d13e4aed7eba2a684baca04999732e9956d09ec88fcf8f15342b6856d0989052fed4a494424a29965002c8ca4f15dacc0454a494b424a620718414991145b8f7db8086fcf780068d94cc5d756aa8bae9825dea46b34ca14cd73534fed988619dd2714fc7e3f160ffddbafd7fbaff9cf461b43b8f7e5ec9a5e4c2a2850b98173068705dd766620f755007ddb61f0d295bb6d33daefae91e6bc5b09b74ac63e3090693e6691ed48ba2d93a1faa86a753a3460d0fe6cd3c2bde0cc499e1ba69a341e3f4ab3d06e3becc8c54694571044f39f5046241d968e1c18e6eaefab97970eb1ad8672424444434c354da69d729c5a2c8663399646aa8b869231a1a9ab619a3527d000208373e90522828282605c2b43de7c1da26adb44dcee6f4695bdbdad6b6b6dd9e2db1c4c828c99a077b81d5c01a0d4d890788a553cdeceeee6050a71aac85f002bb01d63a2c9d504724a748d9b485b7eb5152bf1bd346c3859247c2ba9ecec63a7c9af5a2d3aab642424444454546602d9ce30bac27466947c6240d1802c876dac01a0dbe9b08e06a7a3307875987f4212f0e100093276fe028005c07d69cd58dd3d65ddb023ad5f601a6d24e0324d3cc1600009e72ea08d336b90eac75a5182a014e7881bdd45e749af519c1c01a0cacc1c01a0cacc1c01aecbbc914b50dac8135104bb33c1d0f76000f96c208239478ec70932361729d4f37a5b3326dd3366db6ae67c9b4b9ebb46abaef88f94820a1c483ba33333309b3663e751bfe84d3e62aa34eb5a5e23cead496120a34ee1ce7cda74a19a59d54aa86d530b5b27248b0cb51027b3a1e6cda6651b3402c60edc11a97505d03b0a15d210897e5eda8e872ed3ab903212128b676562410926258e4e835a6e923ef71993bb92d196cbdf655b689dd16e7f28e9090629d024f7ededea4ca64db75b2653299ccbddafbb0f058763bec2b2c16bb75cd4fa366793e68cc6134e6301a73188d398cc61c46630ef35c34e6c5e61135ffffff3376db7a55b89e3f5a125161222a4127b8c1e2b28ccb56dad52d25a94f3881a5892b4cd4965002c8ca4f15daac8a09a82431058923a4c88c2882089f2854a03ce9713284104d82b0d6723c50aef3487408275f7ccf839052cad907aa54931b4216a49a295563004eddd4a4a0805aed5a2b8514b5da74590370cd89536d39556518b68a01cd9e06bceb27057cbf3f1d8774a238fdf0e42cb18742a345a145a1d128f7f3f37393cd59141a117fff2834ff28341f9969b44829ff7b58a5dc062925e55ac0b839fd273d22a3c9683f3f3f61952ab39f306c420394175854283a9eec3a124fa7643428495481a23384d28732c3cfcfcf10284368341a8d46aba1c2d5099dfdb1de4afcb9e94fabd070b8215ed0bb8ca6027f7f3a87bccb683ee04b75297d24d2101acf4ad9cdb8b2febcfcb894b2803f5307194d4693d14810fb1b94523a9fd2d51d810842c0040810fcc0b383f201b504a583ea01a504c58394f2070543254121411d41e5a08ca08aa088a0705043503ba07440dd482969a81c50425038a05ea81b5036a06a40055935177b71dd07ec398b94253624258bcb2b26737989d2e6932419da3c09e19678e86e25587793401fa8522e6ad219e67147c577b79779b797b57551bb21cd1866f6721c87ad9c653d972d69e6ac1448331e2908d516498824d4352d1214b7ad0e9efd51d7d51a8636bca49b020a66a4a17fa1c695b107541554b981133749630de5bcea759c294475aae52ce5c92efa1825fa7fd05c0205f74562d186ab548a8a29932fefe602d774ca76c86e0e992391d6674b29a7bb3580745d1f9fc72d1f8d8ba2cce26adc72e8345ca552d7c71c4aaaace5f031aad5e2b6ba1e5cae23b1b82de5c9ab050fa59b6c012bddf8e78c2b5bdc94cc30adaab3de654b1942182f6ee72c1fc330b401545b3b4cb8ad832510753ab92dd59c71d286e18ccd2121aab455f6922d7cc638f6e20949caf77291a47c2f8f8145e556ff226ba894359de56ebab86c6142166cc20c2245e84e24f19074a4e42409365f9435e78bda9c0ee726883461e290830d2fa669fb721bbc3077f28587927ee02ce9a8eae4c0e60e462edb49844d98375284e671d6c41927ce8bcf8b4fd7b45ea2bc44f1483fdc261dddf6665367c266cebc91264c22d3c8dc61e24c9c17d9ffe0c2e5f67b80bc93db922eb57983e315c19e8f14a14b543c69b9d46e976e321a4939ea59b9edcdbc293ed2044f0a124cd3b6e51571fbc513990bd70de0fd1567679615539e364bec87da8897d524bde68bf4f2644ce3b2c37c59cd66b3d56c367bad56ab5468d4ac06b2e5b6cb8656c2ef1792a1dbb66bac837e93db82a1e1d86e7b4336846acbabdd2b3e726ecb1bea9a96b7c45dc20507da6d6fc8e5e50575aaa987c5ab79435e6d88a8591e91373434b4828f51adc9ac63257b266a9652eff9ee0e93929ad457ab550d278fcfd86c327ba6cf944d188eafb18ecfb2747d5e961993de1089eb2c479a719934f2c8755c9533e62a9f29eb548b73868208d7c7d94354db96ec2cd2f29aa0b6ac458142f57f2585cc2065a8d2d2dc90ac43ca4f8a7ca5942820555ad48f2a2da362a8d2a23e80f28182a14a8bba280fa05e40b9aed8c1c98a2aed962aed4907555ace418c531555da18a7a32aed494b9516e684832aede90655da935195f66483530daab4272aaab4a7db890655dad30c664e32a8d276ab535195f6344595f614832aed090655da93edf4822aedc90555da530b70ac70acb82316e080e6f044880c95e1c80f1406f52f031d5982834aba0c74c4487704871962908a8ec40083fa721928470b079413831a6064158c82e44305af783e6abd0c947384e753635c06ca01a2ab22078937430e0ddc4e05afe8a4a8df6520234631232f9012c888100da49cdaa24ac7a4bab80c64c4c99c551997818c209937a8dd6520233b501f8c78e0a6966ee025514b0198dca8140d9aaca964330300010563160000180c08064442a15818459a9a730714801061823c6a563a1d08035112032908a22088610801c6004094310621858ce606000017c8c4065e76bfb25c3669bdc369148d411174584935211f9e0b17d910d4ab6bf9d078d10a61fa1b236ad794246a688a93890b6d3c505daf422192ff410deb3c2b370667e6708975744ff4fac4985edf5ae516212844d229c5b1f264926c40a11235d8d089ca45cac51040a626d22edf056fb1e588afb7d534fdb52baa1f5c8271d8233031bb5351be1e80b11f1a1a8a2dfaccc18fe01c9b24c4d5dcf52e6f84d9bcd632a405a9e4c360b00fc9541e21f77a9930c8ccec0f28ca137b0578dd7a123a15f433c3a849e1207517e3299443ac412f0da7bfa430f6c2af6ac6d4c64174b1eb24cbe6133c42c4adf2f429fd8cac74ca9e3ed247fa1a987304f58578af811b9e92c6df755fa6a4a7b1789c40d84a9096657987b477c45fe77f8a192f602524df59098a814ee63bde996946134850821fca4ce20125e6252de2015f040f9149597bbcccdf631849fa7c71a29e1aa308c868ae77bb23f56ea854c2e2a106532fb6efab781279a2cb49658b2b3c74d2c5f0ae70127ffa1b3af5acb026993826ce6d67b125d6ebdb93a4730a486459c8839bf8b233d54ccc306ad2ca08e2e08a89fba22434649d2bf54625bcab15960d304515ca1bd2125f8a4a06922a93ae01b5be8e39a3a34dea3ec9295f99f9e08ab548afe71139a9c40df75a28f10446285c1e8540801bd02f9b27b1387d3f07a99f41e8bf7c60b6026713bd130835e29348be757457c67f0bad08d9c5e2b1f9fc96f1bae61f31847dee2e67ab44be24dd8ada343c2017e199a97a322958a430919877f7e23a375638905025d5ba82518f5abb0312ba7cef86ad91af5984a1fe2b2eb10943136956fdd8816549c5923ba0e16c25d4fbc12ac22ed5bb2ea53096ae09817414865d49a810c9d7af8411a0b944e28bcf1a17eb2fc0b7defc34237a36c328cd276c29882af902820d68a4f08da5998953d06bdb4729f8f7984c5770bd845ce173a6f1d2b9f5c4ec9d053430514e73579e6fb621ccfdeb751870104db35a24897ae90be786cf4392bb0cb758d4720f87c94543d4d7daf75b9c5c8bf0e29910dcd489b7c03587037a1aad8321fe87e00ed6e05826ef550870e33f08b8ad4340287ef59335112a52a6d61fec3c60946e6f27c4f2070b8f355b83ec802dbad37b47099a5478f38fa7a0411b83da07bbc616048c4be200649db55cc5167ff1561060ee84345abb1734760e536580e8ad3303bfc893204eb9aefaee97468f19c2d99a026a153bd4225ae6edfae28040054e0a53fb46bed9a1ddf447842d22582d981abcd7e4617c3016f55a42e405140fdfcd6cf08c38b8b70c45201d4f6e912b3d41ec25773514aed5687643697a91e09308821be997e51ce0f8cead99f8fa73876be945ae4a2fa2df5bb2872433eda6ac480f77bed2bfcfe95c2aea551075fd9909ee4eec2e727527178c2e2721423008c69c94071b5012968e8a70ae91dcc5cf808a859dc881133f66d62559891904a88b76a10067e989cd9131365e873de257a92bbf1875802670c1aba0ef30ccec53df674633b2e77e658a0cb6cf58e4b41f8031d6aa73f5b9750f18ef2870a42fc6b99e5874a2f756d72404bd9b5f9a0a08dbfe9640f0305e6a0dd52042e7e83293bdaf94387eb3dc429ee6a9685b800fa40aa0743c037fc1807a2221f093b408838c7e8474ebee063eca1393d09b44ef41338e4cd5d77eb7e3d747990ad17387e22b1b639581d7ce3f298acccddb4ed1d017c40958132f590b62fe24edea512d5c0229e0ff511d61d98973b93b5ce5de3d349e913e2c9b7991c778e02cf90dada22177600740430567132cba3acf058d1ec9ae1e891697a98a52b198cf5d9e7484f300351c11a94307affa179d4dc53aa7bacdc0635b3259516f18c8a2af6a9759a258f052f333a51b8484276d366a3a8bc6b11118cbd83c8b18c1457f1135488e9d8081dc2dc7041561351fff13f33db70f48cb06ac94ce336bc16c69f43b068b8cf2695569d3c406d38b266a12b9adeba2038b8377a9515cd5d172440f45c702f48ec7597ee053997f7ee9067c8f97c138ecc27880406e99e09d0fd13746b80b8196fe3467e4a66d2891c29b0c98bf86d4e468d00056f46e3c2aea56e5ae03fd725adf8383d97c25af85e367527cffbc43f13bbecff80c45ab06e901576e3023d15664851f91e7eab39a922e179813739681a63828172786c50a6b68d72fd2f6e893842e33c5bdd741d375c56569a964d5b2e79fe4e8b498c3c3360ee762a6d83411926514bb56a043141156ea835087260bce2fe32e6185ae7903158666ea60be19b5e467015c2df89fcaecf22d8e2c31748175a5c592d89e1467f17e7d0bc97e29445491e38c470f8b2b2a5da1098a0d86af5095c4d4842aeeddc10069dd0bd100a7303f4a753c121fe730323348eba71a36df1fca91dc2a382f18da920ab58783f19ebb94124aabb0d01c9c14666c8cc6cd64103e16a1172971f97ffc5039455d8c24d0e41e509bf210d98312b9ecaed49bcdac2c96ec7c045635ec94e48962ea77e6452d58ec94130a8b262cc561112e40840d59a7b8c217a2ae703eef5ed5b095d1d864f3e6ced840a9dc0e706a43a68219d280101a3b13cdcf513879e21759f7fd638e0a9e40ea8a0067c5fdb1bc12d5d80b0aba32f2889b46dcde876030057c2f74140c99f4f44407433b656e90a8f41ef503d618cce2e719d521ef18f19c6a630fca391ed5613e200c7eebe9308013995211900934793282447845d722ddc3d43d904be7348351ae82fa7607e6a1dbb0a8f8f8788a6065715c2073fa5b88d0a74bb64a408abd5666480c37b2d569048fc0e9d317cf901987a11a225868536414f545b25ad3a0483721a38972565ff3cb949b50a3abc0729a3e5a0f8553ac890baa5341b7abe5561c5e971c3b52e24c14824a429378963f9596e728f50edac409e4c13733776b69e454b8f6e6d63af7a54c72d177f4a5f6a658e6ed53599a3c0bb825bbd0bb334f76824c98c708205e3a27a4d16e0078605e4d84d7cca8fa387ac3ee7e70e9b372dd83f37805109d5b0e205fe8eca0dca262f27b385a55a7b56bfa2db2503128c92a5409be581e2ec2617819482ae287789acf904b45a86500456a593d160cc7cd78bfc007580f2365c511b5f9cc03cb5e4e0fd20ddb63eb4ca870dd85e36dd518d1ae04a82c6b1884e140502b9d7faaaafeeae975e7d2a5599e8404ee50394bc3353a63d54e90168f1825b0bf73024be813b8acf82ae16734b47f467996b8ccd668149fb4ef6a89d4ecda43a0b0c80dba6ae6a3a3b8a5e9a7ad7c9f16ce27d2462297b32e997a7df02e623974c49c0394785b353857d9f52d0b7dacce4938bdd9fa72675d562de15dc2849800402844b9033105b5d7156d297642554e8b62ce010c16354950fce03b9c092d8936758be08259cc66a943649e29f381627d51494dd9aa6b00e9727a6344a309b89bfd5f806daa366e6eab1dd7883105b26a09208b3f75358aba21e06b2fd11753f86cc88154c2889d090038ba7da78261924181283f5cc190041971b9de32119d9750e11a7bf861cedc77421c98d641948dadc2fee774b6f6ce040a167ca5b842927a91137ef28cb847ec8f5b2e9882ebf87e5f05e04e80b0c20ac087447c3cfe67c5da2b48fba987d29e19051ab7b6b4379bb0713a11cafb5433ebd24bcbb730ae4c2aed09caeae15206fc90853c3820825e1a2eff2de859a11aea95ecc3bbc461d3d11f375ce262e5f8407c6fe1c0985d746d5d55bc7eb7dd0f2e1702beef0da07d6165d149e30572509e6385f5c6a86b4939ba37f64c2d8e09766b0b61f77e757f600896afe4ca53016d34dc418ac46795250a0819a09200cb8bc7d56663ed2d1fac0d351ff9258d6baecee52571442d2254cadae8e9e8a94c4a431a4fbb684ed5148535299a51877d5aba8a15d296c8d63990313c65235cfe1b8340d7ca551db90a42d956e914bb767df20882c42056c69261008f2bf5e586d0c766ee81427780823ca34e2f2d06b66552512240083e2190c08d8a58fd6fda6fe0ead5141a5b6e15e99710f430960a4fb0b5c0c16f2d1458173565d50a0639f3b0098d70b95436487e0dcb9b29a8224498aa2f5b740b0d2343663cf21b8a86ac8f24668fd88f1dba73613771af2d1ae1291602bd2b084bb19035cd8e0c2c5b688635c7871ba1c3a8ee50333a1eabb5a5e1d6c570bce5b61870e1ccd705ab314cad464928cc76c11cf334f89800239b63fa1f44f72cb7968503ebf3e38b45ffb7b38868e2c2bded7fd20f4bcb401d62c73d189292767c0c93f6296caf08d166486035fea98b54af7c9229d1f03be4165c33b23e2e021be9354c9bd1a2c2d7392524d02120fa4dfea24a6e1d6a87f2ec0d3fbf26b31ee40cea15a0f1a53b986bec78c5977e1c73881b9aea24a239dc5952fd605fcb850ff7130b57b813ff98140835455ebc0a586b33470a03e6deaa98304043ac4c93a5ed55ed7efa24d6a7fb43199ef8ae2555d966a7f33e6c915b0394c07916ee042c542d712283ca4ccb6374bde0aaff924e8d26b25ddf4fa5be9affe9ad4dd31b8989e4e831986669ac2fe78aa0e0e350877f270d5b5cdaa06b20edca9a7fe838b2109e7913035969a1bf0805ca8108ac288b6025b004555f9319506858df50d99d20e68f2d5412f98e21032a97a7bde9f65998a52922e1ea29e43f0d93d0fc290b143d061eb7e91d94f6e718d84ed143ce7cf4a4aaaa6c7b0efb8465cc49acef252997d60ee71409b853c14b5599074e1dff7580b42693b55a250246dc4b655e6d298907a2dea43dbdaef96d7b5a96a0628a8270ec05f93c2b92bb078d9ae8504dfaa0b5f10ea9f80fcb1977d1edfd7aafae57f813ad0dc6c522dd91a86858fded3167fca20ce2149d71509b92f783812752d9a3f4885a00461fec228480c00eed6574e68be2ce5e78dfbefdd39be7c3017ae767623bc2812d0c31fe9d3642f87a3ce995ac42dc8e71f346480e9b07b6064ec5a496d5dc7fa5cbf610b52aea90463a3e61bce091da162c4d337c9faf9d4148ae0a3f3fee7e8c7c4c37cba0f8b167a227258c40ba18b07302505fa3234e4afc7f23c58fd0073f1ed47308ed6ef60276255541e58f04070f1b189d2cf7f1f64f1e07a0c9f9ffada3df5111e1115066fb94aca842cb6a541b9b1e8b123c9063668ec4c3698457eae1d908f7240d9ed6ae055d27ff2db88ade33a3570683ab9b43e6fa3c75389ae2b4c5e2bc2335c06059cc622ce7a25cab732c25c7d87394ce6f7b470bf8403f832ab29b8d26a5f3cac74910ba139eb85420787f9071d9c0c192634ac00bf42cfc370c46344d703a8a50ba627fac6f630bd01e0656dfe12a539d629cff1289d94676d64d205a4c23f1258c917b5fad6b82c590574202e5a34e7e7b20e9add1affcca9ac2933ae01b41583f272f1d60cc536d7fa7387e0927a01459234b132d4f57bf768b554d0c84fcea0a42de0e59a8ca60a80ca67a60aa8378aafda6baf5636d3ba0eae190d8052bdf7175e9f0860617f0d5bd19314b2d8bfff58186612fad68d877810ce3b0cb3d6821130e06bf854cfa580eece7e35fd1786fe4fb806e74247b528f60b782624cca8abd816913d9a8edec2e94f7f04e2b20ced64616ea4476898864b08bec6ca0332894aa60e82fc5ae5ca2544db1721d7800df13d158d5a36c37b9c9430b43a2715b2ba1ddfba9d5d96f1ce8f14f108dc99aa16efa70c3d3e942ca57c985a11919178d0e8b77cd546701bbfeef5fc97a0870a6c9038d3054ca03cb8c4f120258d2d23874978d4c72b23adb700cc4d83c23c4a71f30254e99fc5b6099f26b2b81f7d8e445fcdad8497be052e31febb4f619ca5bfc439c240056177478e943e178163da703052b739d3b0f462bd2731e036c254000446bb472735e70849490e49ce500a3bfa7a6f42d4b0f5d9c73e5cf2d0630afb1cbe4a16f29b9413244557d7d32681e844d6c2412c8da46892211847f3ccd8e95455d572826cbd03058db724b01bf5efbb538ca54df4d0c772a96ff60873781bab0e5497d5fc9b94a4c5b83c5af232121fa244025318d0660f044d544d6b34b62dcd8f99dd9c00e373fe7194b1b9ab630b64c4c93ba98307135070bc3dfb3855009752a890f0074301370ee28b14df94badb5356ac68081615c2bc62c82ad3cb327b372e081d9ee649e51565c3e3755e44acd6ed21a3ca262c3f6e7e7c8d89d88b7c09b060d485f0f67db551388ff0eb05e400306f1982d935731207aa69d30a3ab41603398685f6503f6703b69858a6c280ea12686a6e1e76fbe0c20b1254724b5a2273e04e2c6ff286ab5f54c91717c334cd46e70caf09f07da6730b2e9af6ced3503d791a5800d1dc5244a148d10dce761efe6a3e74356026a288b39df6dd24062623d0ec1aaba113f926cc565c676d036e64fe78170f4a7e2719cd499d0301f8570620036d2fadde038c3db288b39ba6639cb5508d99c54fb8eb07847cb288d5bf961c74db4d00dd6b2555154591f1cb833bdc5473104a062bc519d418dc993b5adea51a619482d6eb1c6d73b63fa13a5a3e8a71b4c73194812d9e8ec00ea33e439b806e85821446dec4949bc918b68a1ca18eecfc0cc23519ec40c62ae12dcbb43b7c877359d93f4c426c28fa20bdfeccc239d04e2d35eb12e1f8bd9829d6b5548b1c8cd96293e9bc7cbc021cb8c14b375c5b116c3c55d87c45209a34b28d868461d0943b75a54373d883c6883b6dc7a7a191ec7323eb2df74eb2dbe42f7cb15e681f770aa49a99779b72b735703d9a9a7a169b9f75972e4dedca7cde43a335acfb03ff4e1827a14d2b2055a5b19ca5b3ae82a7734971cc061690c2433cacbcfd399b4da88598ac8d0cb6242917d5e0a08192960ee680e758c6858f6cce1a1a49931c6c25d4c134454cf81354c11fcce791ff796b0fa894b4ed8b37af957161a87f3f033ad139f357ccecbd900b44f122d467cc9f0b023c0108957f53b020c47ec29c9a2ea820d010f3fe49b406a6a05f4b21d6fa6148d509b9c0419f31a31b745cc8f3d7e6ac2d7eb72dd2c2a7891835a153750cdca9ec9862c0a0aaabdef017d44460302c2aad21a97e02d6e7c797954163143c7af60f52ad8a4fd53e5092524fa8901403056d3014baa8d3e2ea4e5c79b21d7c6913287fe6b865f2690de1c9fbcec7b8c4abf812986ef79c2303fd2246120770098dd8f0fedea5a1af9c313749e6ea5dfdf050d314af5458f445b552c3d0082f06de2d6ff424e5062795f29dd0b022f095e74e6a3deacf743f77a2441936ecaef49d5c47b0075cff4401e4ee9a8847367d2151528dcf2824327c445dd9edd9e84f7e664aa260800ffd3f9fa014e1759d504702321c980ee5c36b3d9260e0594684f0e1fbfa04588f66d4529d1d9df170a3044d91ff5141001b67cdc6931b9de5a5a889d51e4ae094d17efbaf32f4f4910b86e0536fea8f430a75d6922d7a260134b69cc30f88b2564b99a8c532c835f6d32b2ca6ac8009161fa3623690d44e185f40a98e719191905136aad91ca296acca2ca08bf1ae414e14751f2b5861d6b2ac5eed27848f8c8e095cba2795cf67cc635e02e8c05e3a4e965c1b54e3917558a4fef5347de57888860d345fdf90e856918b3860df44fcae3fa093e7f0bee6bf1bf2ac757d6b58eefde46162b815d54b09a81a9e82e84e0507a5409434f4c2013868b2ef044c24fbc084fe197a40779deb54b3a8d536df5de6c5d93db88e68547890c3f90555987329d176a5fe0d9410c9341a5a6e0f1e7f79c7ee0fa23f6c229bb10289b3804d124328f7f75b0084b7dba2ce7668c61cb4d21e38bc69c64e0ea869749f8202db8824fd20238f6c507830335c9910d7d9a1cd65c6b92dcf717987f30b430c9b86dfd35ed56b2e92fde4b200a18e1bd4766d30a9d029af66da6f061253b0f770706299e0c5a1eb94fc87cad3d41b7d0ebefd9afc5fcf424e6a933314e044b1641e2e22e2a8902f808af2c2a87203e8d41ca218b8c81401852532817a80c4655c40c3e129e40d4e2d977dba52597f4e2b49d3a9ca7d7b163e0869fb8cd18099d55f2f73f76af04a6f529b7d6d95a1a442d52c8e7c0d650db6681433eb21c28e8afe3cc49dc7ebe8388cf21a33c89ff2f6bec265480f10e8a422bd619efac3f49ea4cf1d329526d6f177a0e1f273bfefd0540b329160567ca8c2d8c4928d3b9f0cda96ed77994834ece298e2f303280b7703cef1cfe87c639eef237c8b634ded8adebabac42a5b9a237a3b30e502c4362a1df61863a2c8eab973118a951f45b3ac880580cacb60dae4aaef66e723f85222b0446703be8a8b208832fad7c5a9a932e0b531bac0f66b97e564f24ab1e08b318267c2c739fee04938a2ef15ca6477e367aaa764df7856b6d7753648a6bc5641304596193eae07d25d9a4b1a80f8762a6bfa5a431aa835eaddeb6d48589b645a54ce92f969d85e86135a4179841127017f46f7f1d16667afabaddd7db0e79140f36e61013a31dc77e8184a114a1b171d88a1f0883458dd9ab06c28ffde4b0503bf59c321df095bdf216fe31328adabd7e958580ae129125a7162fc2991b8480a9fc9c7f10637b093bbf0800aefb597d22b94d5563bea9b04f33db8c724e6429d5824d5b437947bad43766249ba61f7e47af53cc786cd6291bf2533f0dde01cc5837d6b4c7de6277d471ded92fd9e040b9633b0090e143b767dc3376d797aaa0e656171a89f57fed2c1df667b3501b7f8e9df9e933ac837fd3aa3d9505734076ab943a45b6c4f00bcc446b01bd15f77881fee893cd442282cef605f7845989ea25b0277181f1ca8f392a0c9c229e30744ff79caf2ebebaae197a2c5f3be58741f2ac6a298c14d7c5e844d07aef46d80b792c9f3375fa60eef8f045dc5f223e1c3e406e95c48a50502f5691d8be1cece50d4c63846220a88aef413179445c3d0a2b783a985f416d40eaf744f43c4b79495fdccd59a733ae3d2a189c54070b3fd4a0bbda396c1fce5a6ede4e0eb0a94f3bbbe37330a7c1c4f79c6d769933b2f2b164fe43edb4984aa985923bd2d541f4598c29f9eb3ef670afaeced996ac0e06e26ec7fd6221f7bbb363f4bd8c4b4345857f467c3a62dda7b31f19658d5e17390027744fd032e9055309c02c30f115a71287618a383b04701d9a6451b08f4d62877e7a88c84cd22bb305288d45956f0812b113420540ce1e8082840c66f29eec32ac1ec0e3953e5b2047a5db5e0f3a270611754d3ad782ff131bcf3fd46c6428352b6abd9c35f6c1558cc0887bb4182ecc05b8ae0b344dea44a3ab641d259b759b890474809a962112cf56ee4980f3694bf47d5c3056834c40c40f896c1f687577d45a43cb565113be6c691b518d6763e806a53df22a63d194331fdd061fde41fc3f6d431170692e857aa0aa6c41e1c815b6f8b66ac642e9d576c53c1e97c856c522b7d4c7efef718be179f80853a0661e2cfdc8e72646d4c9c3c231de05c21350400fdffff0bb33e6f51e51d890f80f446bce5c2b1cb23b600f44de3b8086782cb1a2dcf19861059e846faf9fa964fdbce1130c3d4a5e4706c695e32bbc02a3bffeb569c09855b83dc77f9a4d0c0a13bc23dece30dd8dd7d09097d612d152ad735f8951b2fd0d81af878d540302237e91c1fac738e17e3f348dfaf680500c0c91bd5b3ab795d1129b9f90664651e679c5290eafbca86fcc600f94652da211cb590a07e4a05989806cb86bf25080ae10b0fbc376b6ba818d27fb1dd9cc8415948f78c98e170a166002d9bb9da663182aecd6d83fb3f78547b5fa02a68371f7068d69ce6b996d9331fc0724f579b072bff7d7f4ce43fdd4784350205f3f82a7972e4448cd2d4e01f9e02d8d36129d945c86799d1ae11b1479cb4609a6dbf97794be1c190c3d847f417684cdac040f0e785dad8dcfc61f43974797d2c65626e8c3b3e2b3cdfb189858fc9b5456793ff0befe46292be6b1419f08dfc03408efe725b78f28527aaf027051f4685b05e88209ce4615f736f31cc8aaf8de92ef2ea8b95e513cb3eb39c2bebd6ec50da6c9090d53b4657e6dd9d70d25d18dc76d029bb34a5fdcf719bb7beaaaeea55f104613cce403ec8d85601ec4fe9db8f4b6504691144819012cf64c9899025e0cd02122854e5107ba8210fa5f651e854a9e011d9437cf8011b16e6e36724513ee5246dbea0a9d11ee06ed222361378d48da3503c75d9058e165a809d4c056a65799cc52e329ce353565c4223796c578c7d124d1d95cf08c9520b3eea2864ae1387a428f556a3a5f1f452aaa124d463d55b5ad2637576c2691594860efc6f3e41154582461b5bbff1f619b13596b60ed4b7caf584639093fb3d8245e933b7e31ae73a3180b8d495fb32c0fb930b7f0e5a46525f290883112beb93cd1236d02245ade41f1a7497974536252ee2d2f32b2ec5c63507ed80c535683a8cb2d7c2af2520690f57cf895ae739d4f37602c8015ddae31c4a33b2276321ba02e5ca3d005fd73155f1c4dc242f3292f0e72f89f3809e043bb5409a76aab34823f64fc768778a4424a826d80646e0c12178e7140d2e1596021c7e116e1f0698403a711eef488daf5eb1441aee1492015d57530b7b133b6a2f5b04cc1b27a75f49e434a63414e2bd8e3158d428abca208a32877c403a4a9278baa219da406774b56689139afe6140b16596fe10ed858f356e746ccfb5704cde0d1e8e075c37ea0478008300c8fc3e3783fad334b0c5d72f1301329397bad89ca63e5c043c11491291efa49ae88f6780ffca6a250cfbf7df7c39cecb7936a16f80b00588eb0d700494f4aeb2a7c3e2c09380d3e220401076235385663c421a36a4f71261ecc89a0a049e1f8251bcaca1a6b2fbe43680de90567997e3e7f2839d38f340f17344a1234b0120fc983babc39f8a4db9f714f44864a19c8e319faaa67a3462622fb053deb44205c6708a1a5d8c4470aa1810e4245242fee29535e9360202cb46692f5033049f12243101275bd79b71158ba53f3a98678619ce286b243c348280503b0bf879dd3524973a3d94513cd2fe9a78c96878c3aeb236052b2b77f4f28247e041e786f947c692b1dfdd83a38666c2ffe201bd0df9ee16547e7c445e5081ec4cfd6185e25bfe76e268197314c95d9c3b14f4ccd01b1c853010a74bc782c461476ca80c63eae96d1e2bcce65c0866c22f54c4d1dab0f281ad780fca12370c9a5959c54a3fbf0a632250eaf75a8758b1a79a97aba3d7ddb840b75dad81475f420af28ff5e46c20aa1b3df6cb820c9a17f98f0925f850cee0a5894ff1640213ff2d217cea27c4584253393c72d7b7bd05302ddb03a382e260d8e5da8471cd6f0c694a67a36404781fc3a187def450588cd61c3db45121c18c725f2243a417504b51955cb5e3646ab2f1f9331d93d582e9b510f7a1e63d9645fb1cb620f1dd150e66f4624431ad1fc9bd40b1712dc53e63f5002f30861f24cc7d2466d550941896b0ff31487b8b878f737efc865c33b4b611c156ee0a90213090a1794717564bbed6dc2a5ec31c3dbd27bd987b7099a92e3fe0c139193e7abc6ee702ab8f8dba436395dd53aa760cff764aaae0d422c448500ef49fb162280cfed3d98b3afd91dd179f27198b01434ec817b5fa1f1002ce3502cc5a6b15e740972b73bee78534f9b18ca25dd1226c83852a4b9a6b211553a3450abde69f2c1a1a7cca3b13d6d7a65322ac3be9ec86ac408c7581634125f5418e9bf15de246f912b80c4a3c3da206f588a8a9bf1c787efdcb2973b33aceab343aa7f2608461b2a5389ffd20680e87df965799036823015fff3126fc85c08eb42823c97168cf47f702e831640ef1bbc46183b322de5d2e001615eb886379e78163296f1959b4583de94c191bc2772411677d159668e1c5fcd973b0f4338ebe1be37ebe5be1d0a3aa05bee2d3025520cf74a79e06803a6b2e70d171433eeb5f053539443fc115462101b8dc517e27eb15525af886640933b039d6bf599f69303e9d49158ed18538b1c6e099f1b81ebd24d99beef03b3e56e11a8b29afd35cbdaec0ee96e0a230094293b98dc27ba42f021b97381bf0eb38c26e5ac01100082b6cee587245085db1c3a004c0c1a6c90aaf458345970a6c786a785021dd22a890d6c649b625e125c241131623b71154f34462bfcffad508118421f43930a6d60078fe18ee6a04c905f3fe462fc8680ce74f5c414abc9d81d56801001ed1129d2c34a9c140bf1f56ac5b31491dc09d255f0f3f5ebc7bfc2747d1f16e19810c1dcb880376a91031fd5bba5521102e04665332e885f18521f426892743321cc8a88f0a8e859a937d4db30f33c0e5b93dc82c9b7d56aab0f888d6d1f525a13491ed2c4d4377d128409900a228bb2447a7fce35ee69395095cf1945382531e07c6ac0038263ffe8d9b27102cf899b69548d3161579ea7f4ef328e9eef3bd5ddc41aaf5611c6241d7a804904bc7cb85641170d375520460e40560b2913d1151d6302a146efdac21bb48a47ccca7f3852c4a1511e4ccde0772f899243f6f12486e6f38c517771f4e64bc6c4afe835e980552ab6d9a7ccf068381ff34bb11d66d802c36308f255852c6d1089708adc48cb21d1739ce9b86feb15cd2ae088e4a5e66ca8c0aaf152fa8dc5ba2be23e968e2178c41c93b229bd88c212a190167fe7d03e035a4f592615ec15ee616e7140900a3cc0260735c86cc74fb102d554e61f3bad75d3fdeb61a6aba5588ef4be975fd25ffd9ae8f6ab0828dd23c84f510977fd1d8452239a3af7a35041313c81247573059426bcfd51c3760c6775a36b35f9c2692d37c415fd6639b943a4fffa927b33bb20a72edd6b314285ded9d4ec6557a4c7e5a06978e25183b41859a779f78ed141b03521513ef6d78bbcd5ef660c635d21c40171431cbb567c87de48272f626103532cd1608a0b205d93c001f06a4f912bf95f7c453473131372c8ed31f1b84e49c41ff6ec943667a0da46b7a07401d4f87a22fa8a7adef507cbbdbc15f2092e77aca23a7617aaea51e7970beea8314a63827d1321ed895a39eaff4cb1594b759b84f4cf6eac8c1ccd01ab365848508cd2bba84f7dc4a12e0f92763e3839cb893c18c0ca69ce073f02ecab5617e2bd1a44ff58e04c0c02cf8445e85fd197084e72f26333a2ceb04ec17e5b75ff98221c1e4d68508fc28c5342b6061a1f0a33fb9ecdeaed70e183609bc945ad245a4bbd842541c5b4996b76bb71964ee8c2d2c498aaec0811581487bcc1f4ee8fcea0259081dfa7400ee41c714df622d8950101231f04a51651cdc7cd2152f63e0a6f35d67b57855f2b9c7e5f9c7a5110a1fbc0a09f20f8437aa357d802a42126b2fe6973a827b892047ebcd95dc2d5dadb4678f16059e81c59e4bda8d99c8412e5db9fda6e393e6f31e3c77ea06515cec4198cec6ffce25d1b42b11c83293523670938cb356c0c991ec8299989028bfa1726d36d7d7908ea92c92d07f8ce2c7937a5fe627b3b80d65ac7a32b9187ebcfa06baf4e66f3df097fa4210b70fc3c2d79352da279897864cf6236fb32ee5beb92bf465e010465404f4f0834f2321c7b33897dee0c04d281708046ebb6fd466ac4222951d11b4b863e20953a5d609da7a87872b61710b60ffa58ec41dfe7a6e9529468e71d434079493173c28afae6d1025216ba1ba83433d1ca3aec451b83bd2575534fdfb4ade905d9807e6427542473363d26838d09a5f94629efcdb2842e2465cf6f1c3b6f2e53ae436d911d251d6fe8d329a4ac65812d13446c87571f839b265cff92fc19dc21c50246c017228000cfb11962fc8feda94b094181a0b7296600ed222a22a3905bd7334ae2c472bafb84bc8e65e05a0ad2b8a4334fd192318ce6e375f663b8100a5ece21a39fd03e1723c856d828862b47d301d5516ac6726e6ff7956b28b36669edac153ef43897fe0878a0e8f7bde98a9036ac8f440f0e08d142154acd347b0b5cf789a4a8e9970381bd0c95b1cef1b190f07f4a0513249e29bf2f9d26bb1ecc9e9a58ff9245f3cfd97fbc7b6b9eb9316aea1a4072a5b89d5b05f8d1f1fdb130e3be036f0bc9a457653b7e21da4b3efec4f0d8320ad73c66f88299155ee2534b3e88429665154cc0827e752a2d1f49b8bb6390f7add1a36275cc22ee190e99b6b988b908156593f35dd57a9ea3d91c212bc08ac15fee19683e652218a09d459e1d92e126f4254ddaa70247837f17265e1cca2630e54cdc952eca2dc888852fe973cf6c2b84ac8dd30a4c8b71554c210290b333725900698410d57415465ba1e89b74b7fe127a3a559257b9cbf0e9e01c2a5084325427cecd7ec5048d923cb699887090679886a8f9d8d72b38492e35a1d311ca530fa93ccb4f24ae895c31dda14870769c6d4f2560397e6030928f8c76e22e3aacbab6bb20439d271b33a27b8bc3e3724229668784c593f612d8fead6e960d08eb1538b2d624d904dbcd54461d32fde0e11f8f2aa24b516b0c7d6eafc562801b33ea52fb5660d5a51430cdac723fad9579cc35c0feefdbd9159c1ec0076eb81d11c63b7649552ca5a664298de8d2505e0ecfddddad0ba7ed6f184d78ece2063d38e7e9f1cc0c6fdbe285226f6ca782da34f8270f8ad7277c7dfa13187c4e546b585d9f675f43828b6c1b6adfd31cd8b5c776567b5d03160a08211477e906ca3c682fdd629f077a920ba4748227f6362202bb6621685af65c63273de63662977f6e3889a5f08177776c19baa361b03af2ca916ac6cb900041a473c83fb4fee3e54418fafced79eca298090034892aad01090a05f20c370b15ac335a4f8a9bf15b212b9b1cf7318d89051ea2af420be1e8e092ad4c2e492c20a374fcf54e797e7ba6b4f164014769cceb58b2cc16322defbe3fc35fd1c35aad6777e81d75cb459d01e829cf48807199655fd600d8124d9c9c18183698621f80334937b8cf087cc1869d34b8b6cf1241cda4f9010a25746577561988d12d189fd4004524e2568c50e60f7c83f4a95d0532730c819d46a20893237ea936df69a51362eb0e0219be6f039149fb937b22f1122cdc137e62569fc624496b22954b764411931e2dcf04d301887080bb3dcee827ae00624c5ca4242ddd534ad45eb9da464255abfde67803e460467cdcc4d06d524af71e2b33f3768315e8498afc32063a3531305850a288605b752f3632a6294d3890bdb61921e758157ab8f05645fbffdf97ac781144b6671e7efbebf262672e3402b119df6c5c942595a3f2b7ee968c5fa3d2813aade7b89c12ca2a710da7d81894ae7a229e02a97f712ccdf7321d364808f1d70714d2620c62f5de29d53060093cd6fddc41a99206c41dbeb01be41af7cce53a931b7379307156523e887e9e6035c9c296ff331a04c1c43da8e0d670e8efa967e6bd34667405d76fd8711a4f66444f736c145fa0e68bc1889eef4e839c0687ded7964f1cf483bd1d867b4b10cfd4313d06b0c9092e230b8029121102046f3c97fb1423ba9273fa5183d88cda96a3080ed4ccc7c6811a42ab5f51961c0054793c2b1a2a8ba8c83b8d679d2881295cad00336d0995140c5160af7b1b276946bafcdb8b158cc1fa7347fad0b5866f23280b3c0acc1b595517c2e559f6442cbd113256503d871fdca6a4698d20d2bc000306ca8d9013e72ffaa8473a53003d3c6bb874e49b6e8fb4b2829e77dda4b484b8894205cdd9704611721126878fcf1c92132cfcd73a60ba2da4da5a97eadead48df9802405df48802e7fbcd1f51ba1d49a2a7cac8310b8500cd34e3c8db04178b33195640389a2309ba189cb263e21d1122439353cd5f412c52c36ab71256307f7c623fb2c40548d9e6c5811a2bf09121ff364ce9c4431488b59f7295547e18d372a026a0360f3a275484970122932c1e9c51fc1a6e4bc8a1eefb5b8cc44bbb5f76e2f5f7342edb364a62af98c022072a84de20af74e83401038cd5927856b5f20e78519563a5fffc3920ffc2e9417cf8ffd8bad17ef9fa74d7337adc7aa3ff58c878aa6993b2c7c86f1dcb55e0f7640bd384ba9b508235bb1798dadf7cc5d3065a5d49868c324984d16dc7051e66abca35ca7ed67a674fce2b93c339e753cb5de828d7aa41c20ca90a670d280eaae01118522e78fe9703a294b516ed0b0d0ce3f772b27ccfd34bfc8e77088ce69640fa77830d7617fdd668df44c55ea59bfbddc11931c22a24bfd1eba50b89e721421d0af9f5c2756147bbe1776f801725295ed814f516226412d1e047a9408ef45420935d8106624450e1184a388061c63a418800eb9f21cc97b87c68b2caab70574f762e2873809132871610dee58eb34342902e8f99fe483bff0029c187cea7262765dc69cd93047b1d8fd0565aaff880e63a0a89569054e6b31c786bd04d3c0635fa79562ac208e1004fa5fb3da5cc398fb04d61f049232861b45fbf61330d0d1dadffb73002e8ea9c907748c8838d9c4c24837f79c47cb9f83e5f89ff1f277443649c458bba527be9423c2ce8777ced5b5f38bad2ccb29a134edc379022d2e39d62e0801d65b96d8c5b93234d1a8b9304d05dbec8f9aa1d519c41bd836beee01e9b67acb3cfcead7b57398dd6041c472e8cf55fda2f0d4971081d3a710145fd7df109fe04bcecb3c80d7bfa3fb83b80bd76bcb332a4ce804000bff360ac5069399a15e1cb463db8467d1ddc1039d525a43df75c5649c18094344cb6087046a5bab4ec48a00ecdbca13ef2ce7cf31bc41b0b76f8d1c35a145445352c6a66af5ead69af0f1f81495e8b4d99f208dc03b7aa05c1631c1f85d1b3ff218e5f4d313062cdfd1623902465c48586106acb183a2d83453d09c94a2ce61ffd65287ab69d284091caa5cc1129758072eba8071e5306e932834032062d5f3e4773b7c1fe1923adaa052947301f1986d895500432f0b682f6787969f92a2932e4709af2063c07813d817dd4ae98dc7cf505f49e551aa9ccb0bcc7414e85e43e88889f3e861a204f7dd8275bebfd15f8b706b4f33c3f4745c72b2d381d8547d330cac4f052beca757f4c3f8b492d6ba1b8cffd0d8b8674a79d03f4353930c47cb9686e049a416139d0603ea7638d772caaf180d2235a0200305c727cd56e031fff193afa5fbee3d1b900da5b80ba0ff4b34ac0342f9e1ec0f12fbf9b1874679a8c6a203b174f12c0d198fd6a36cb9abb0477989df66ed319dd7f453e08b8152790d8cb39d95489b6884f7fad4cdca3e87f27c7e95ec10141d8bba1afcf48cfdf6b8953c0ca459c531a7c13cfeb327abca4d2e0581f9d7be2c73ac7a6a2503acdb4ed40ba4db59e983e55aba8b4943d16104ee98544d1f1d91babeac4b7fab69db8f5c7ffae84f97a00cb4e50d02a086d5e091b48c48ab0929f569659d8c3f7f5a7ebf8dd5511e469cb4f877b804fc7ebc504aeecfbd3efee2c8b7a7ac1c4ce8cd7ce401b19773287a649112aef25ac95c2322057d2f26e4a03991e669aeb623e6b0e0de84a48a34f25e9d781ee221a626a0683e32a948385e1c37d9d8650246e80688a3432700e959ee748147b2595d4c37067dac072790e9402eced78c6cea0462f7e9c0b372badb850b9159b24b38d99548fa76ab93ba0b6f7fef27fd789b1465501926e0d3448af91f6d43cbaa26546b51163a49d63137abb60af6f678b87b8b13c1a4c825a4474bfb5ae006ac5c334b0a2e7fa92f1c48b74a146296561ce9c7da085ed99c9ec810f0fe52ec7e10ad3738900272efa68efa3cfc65957500f0d8aaa2d01457f8b02faa1f6eac59b2341a20728b26f52dedf3aa7525131e86df5ab449390ea945eeda3367a5c6832ab05a722243c5db6eb3e006778597b72425416510b6e0cdccacc4c9c0d511ff0be6d936debb899e441e5084974fa198161cf5e1b5ad8a490a44a387e6c341472b6ce54c4e12c174f224fb6c3593b92d15351b96c8df27c68bdff4d602b70b8f2550c1df6651758f2387fbaf5564f533334ce77c1bfa594367d6538e17a228032e1b2302cae0d570876de13bce74da3c1e467b19036c0b8c4ef1d6cccef17e34c3993a656a42f854ba1acf3315d62f6dd73268cff797217e86beff6fe055998b5f00deaa9720fc98447ac5a3a0e0cc1e85b56a01b3933d1bf950e5f50d28f702a481f72a911d984b682c4b39a4967584eb8166ac82a09026a900d8f9d94543634b91b483edfbb3ab47919abb9bdf400d2f1f94807f852a8a7bf7a8139dd869b1f3d814a16d0a8db4c5bc8161c66bfd592756a7761fc06e87d1c4b36c502c9f8f6bee861fd7fcaf9af825564fa3914013654857fa2abb94b96c20aa50219b06b78964587e69ec20c310d8c8056624e860bea016fc2b214ccb400b8ef2bf262895e15fc4cee7c9f5a5c46781392bc16424aad3b7190808e0733b72234670271de1717d029e7c23ba98a0107663cbe8960ea49ac5e97b03a165cdc176ecd471249fec85ac1caf9df74750e291e70420393b2b62b76e647a5ccd51e0262ab3169165dcc2466d740f2daed7ae97b091bc4705d1a831a434a264378ecc50e5fabb7303fc52336e32b8d569c541b2578978b91374c1a40166808230d6c397a22a85db3367315b30ff5a23e749ce6142054b35c5ad59a0d0847afb6d019a9d8c6380d31f1478bb90c62ea0c62eae23c09ee30792d767a6f56d30327cac70c5bdc1be8355d229117e7218f298049917810e145e8c9c0c46ca91b6f618bdb66712824e80252f733871c6a46378d11482008aa3b3f615514cc235ebb9b6e5bb3e22a68e292b3b017298103b9011fcfbe1c2010ed591f58c440c265014fe6bc93c4c288417185b3b992fa794231b0d1cb61b702c41ff5f84c7466c0641693eb2a10639098454031ec773fa394c1950a7afb05bd4393c7d56328338e503584fe2481b96c8e39bc29ed117231573ffd914ad8fb0807fe6b00665ae2fd4b2f8e4c7e7f9ac0203f9d5114443b6acf7e82959289b7d617aa1d78a7948ef905a2fd07b7f875b87b0631eee7c78651a2210e5d00410cb5c657b6999349d26d744f00179c71cfb48408c92c6ac03b20efe0bb84813710a785a88599b1ec8e9bf967f37f172efb09ca06bace1bddf5add55f6ad2e0716b4f5da1c16da6b2dd6236d7bffdf858027629086fc9d04f13fc202e23bdb53240b97bcd36894f10dbb7192dab209865591368edf3838e3ed0d917bf2372254c371d78b069985a2cebf2c7c8f7b77521dbc502d31c3585a6db7573ea49aded431759e7c6d8addcce819bc16b60ca50050c34f19c270b1cf127367b3ea4a584ed7d8c45b65b760d26780caf36deb5ec7d90ae1924548d3f1d755d0b58128395eead58bae640a33602a8478c501dc2e552ccb51e94a4dd7e8b4f1dd990143107f3c45e017af867b9f71c91dd2704ae663bfb2729419f03e17f1122e54e08f7d94f60ebcf7376521100c5f2a9ea41a7356316b922faa150e0e3f9353c0229455a9038946633c50327c92c72893270e47ec812647fbb1491e1a6f1b9f1c5ee903a491d4baed0b1dd5b782de56ad4503a8727f78b454dd6b7c27d829ffc5454f094e17c0e39e64233ff4e2de57f4ada7442b32ab421263d9eac72a0f51b912f867e11b694fdb2b2ea1ef6cf2938132726ab718339959c22be16edad268ccc8997ef014b5aee28058921c1daf452915f5fb9846786ebd7097d32f19fa5ff77c19a296dec8c8919f2b84e951e9739ec2afd25ca7a3dd4a3b0109826f48a8a8b7ea12286253e1ba94f3cac07a26a5535208344a2692aa871a850f753e08122b11c8254f5a5b44665154645c5a0fec51519385a849eb230d7e065e01c92a8199e903b72f7840c163d31c88f9acfd2926f5f87f72f964a1e3cbf84d6e4d4d3289b0f356b793658e2c9ea3b0bc79cebcf765d38ce301980327ba5f8a1b507543c1587520446fa32860b09eee552015a4aced03f7ee98d24d8cf78ff895a355a8cbeeed01fee29cc35d2a1b24f0204d7842420266720aa3093aabc9c6d83dea93ec9137f1e2e2b4ff6c593d9acbada32f22f57f43e80a368e2cf73bf41fdad935dc133aa38134c69e796ffc7507fd23bcba21a17e2c83c8fcaf6e10c8ff3117f9e12d8176f35efb76ddfd3dda399314447e79b1b0c6a0c8b50eeaf5daaf0911f408fc8ae2ca22bb725e36bea76647bcdef646524c85b24a223dfd75e1b30ccb189554d32029cb119feb62d652375f76c60545b7258d049e435546deac526f285799e4884ebc16e9b842cd34c659723582a0950e8de7e3a4e008c2116d749af68b83a9c0f55c9a98d7f93a229aee6d03927595fd0e091355b2a1af7c9bc2d391bd256f5310b950d5a6086f45cd2391ae9c5e26957b7ecc3ea4bb64a4d109059ab2b3141a9959dbefc76880d18e78110e0936a2d2b58689de6744b970de4eef9fbe878cfa29919ff8b8a57f8265c20d0b512c32a288b51380c6e529a0c9ddb9158d49c26f6877ddedadbc2cda1ada0d099934b7925e4b4df7eeca51710ab4b17a7ef4a6e6aaffa7ad4c8f70223a978765ef28117917342d73f303954f702caf87968604010b2a20ea53a02ad4d86ac8827d663d67a610aa469b876d11705d1142d635726fd12ca91ba22b2f65ee88bc3eead9aece1e79c4cb123300fccdf5c4683ae1f5cd753fb8143151fc40f1367d156344860869a8a288decbdf7de7b4b29a54c01be06ab0609062ae54e2997744a2ae56efb8c25ed5ad3b121624972483828375b9398125419a3d168f279327042a5dcae2d640e976f216fdcdd915bd4b2ff51cbf46b9335a335d488871c6cd06f0250def7bdd329e7af5acad9f659232816a3634939eb429212c3651d7b12b3f92b568b295162d767cd688d5892d810ac5957c668349ae4f39494fa61874a392b9464f558f2185957bd53a2200a026485a09269cbd64555a30beb4b9ae787bf92fce5c2e259c183f60e16be338557b18d643c10e560c3ae9fa4da678c568bd174cc665d279e1ccfca0a6943c672216dc8588fb7a865ac0fb5cca4652ffac7fbb8f83b85d600b5a035f5c3a04b85e78429fc59f77993ac4ef8c3baaa4eb8c45df5439a75d16a4e68abe6109e132a51a33af34d0a6f2e4e493232d0cf45f318f11ce159d13c45feaa0f6a416bf0f0e03529f0e8b0836a0e4f0e6e561e23bb3e086ab173d23be10fabb33385bb9638d2a6599d9d18b84b891d28bb7edd71819be55913c404f22ba87850d875078b5ddff463dfa17dc668e1ad54eee44e49326cfeaaa68da54f228aae461921d92b4f49ac92666d3b6a99cbc3e818cdc69ae8984dc76ed6555d1e458250b3bf32568bb1205b1788b33a2a3066a563644ad22b4d5b355d5ebce81b14a4652e3fba942e74b62e1717258bb5cab77361b156ab1569c37c629ab69797163a9719f0f5b978faba68f719f50d0ada2f5a8696bdbcd8b2c8678c2663c768d51cb23a1f089db11844bbc668bbbe68169614eeb0f7383ff64e49272d50a48d52ee9454ca5d7c4b39b3c32b2b2a2a2a279b0df349354f492ce43346b3edfa315bcd394f49bbd294d49c1b6b724aba1e80964a7d55721f1742e45aea015a10ddba5b2fcf1e5ba89ab4f43799ea5b9f7a2d406bbd2289da0a4423538835dc0a37b0f6c457d302851a9e917dce38c1872152182aca9d80033e4d9086a080480c52923022851a3f76ad827ea00882a0d7596c9a998ab6ffdd825e7727dd0ca74248bbf7deeb55c9c5d8886b0405c2ad4ef5e9321522ec2144c1125c0eda819fbdb6f33c12d4c0c43edd1684ad86230dbc74ecb841fe82003b904523600b35e010a5862110d4c001a11a7c844d327905120d4834acc085165622a3927828e4d10478ca08f6e9b6246880e1abd1b0011966d8c28a2c56b14fb785413268035b0e5b8e1d361d3bf0cd66038db0e5c8b1c3a66307b8c4115b0e1b0750ab3f9247189c6006187828f082ace0410104dc802d8a2d872db4c187016f06bc021b08a5a3d93e266cb61c3a7690803be1707474747474c48409931f98fcc08489576b5bb843ad1cfc64e2c3a87522c07657ae54b2f061d45438d5759f8a00b3416e39fe49fe09fe19fe29fed9bd38d29152b2547a52d7ed254af7a8e916c1717c702ca9287e2876def7bde7b4c7da12cc4d6dd0d25aeb84db6cf55a8cf1fdbcfab0c3430b4b0831840a470491c08214178678008a253a28c18dc2d6e3c920c2ed20899c1622387283911c30f18128462240e1e88885871996b833182145eb8917300060ba9c40427a1d44d156530b8a4c1f9743320982b9b1636ca2d59ec076de87546f37e61315896e2948d535c5d2327e3d08a97ac82e54564ed45e1c63db120bf9cb3f37415f56acfab8eb3ad1dafb27feae8379f33ced77317fef16f578cb212098bb7eb6ac5766c432adb14529b6d6ddddad75b76e63c46839e13507860af00ba77a4821c9b4d2982ed7581343c6cccceb05a5196d6a60f6451eba193f9a4292a90763c5194b410290a3334367868c18391a632c56434687b1b5d65a8cadc5168b3546ec6edd7e309682086074db76182a68d1a068678707f3f44c00a77ac03d3d328a544beb8877b4a6987eadb5d65a6badb5aa8af1b5d65a6bedf781608a29ac25836a77c67c15be560583550b05d529415365339b5298d9ea986636a530cd19330b73fc8ebe3b83f3a6699afeaa262ae719538a79dd34cd2e08ad0d79cc7a4c6a1ebb5e111df66b7d075b0dcdf61fa9caeac02c2c8a4c69b52fb7225b1172cdc578a6a6769dade962ac544b5438301accf5d59c1a7c034b4a898b7ff0fc7daf5205c1350103961414dc799e0ab5ae096e226b416931d15ac25edc79b49250c9eb5425217fd592504908862ff7e5721488182e73e85e233e6e434b4091393a3a3a3ac2339c6f3e9a21b947f728e7fc04a51477b72bf1077b24e80c7fd51933404029b5d70e913932e7312773ac4d92390f4839927254441145a8a41c91e076b317fb6015ce0787335283548c689153360af27d1e160a874839326272ab0de1213c84878c82d068349ad1162296859828045b3298e5868e8e8e8e8e8e8e8af822bec75ff53f803b7c6f4c86bc211c08e23ce64f6e56ca910aacbd9dbfa8942312802329869fe70dd199bfeaac88b108318c92e99f013cd017f7b77d9b94525a29a595e2c0c9910f44d888820062ab95521c88107aa1efeeee9edaee64491387d97810edbfd4f2f3f97a68751a12b65a1a1d66acfdcfe5031af24981cdc33ef862fd3e120420198300961aa86eefa98ebbbb243657396142c5c66d2c746bce22ac34f5cc10d96ea06edbdbe16ce640263d56daf5511f6c8609b3d6856cbf8ab0b2ed77268e5bffc325c0ea98a52a49bee2c73e4df0c80db513c16eb1c5165bd87a2d0902dd55d3ce7636308e2744f4e209215c6be381bfa8add5c65ff4c55bdab84937eee877bead8640dd98e213e87e0961d712effd0561dc61dce1bfd83fec73a5c8160771977d1b700edb621eec90bbe87f5fceaaee52ecbdf5f1302d08b13e16c234ab036e0639dde6d9fef5ef9766a823541df7a90f42d1712c7c101285cc06206e90f3b16f774fcdfef571589d17b0d3d9baaceba1f86ce983be09772b63dea45558a71616138ba18c5a113243f001b0fdf3eafd5f780d100aada9244c89c562b158a8db8d7563b14a130a8b45f3187d5e99c98886543f56d002d4edc6badd6ea5a865a549abb4b09c58321f2cbd2a1f9459bd46adac6aac8f11b5f6a161bcf816285a95937793a4c3c285f1a265fa9852df582d2c206a45b42a274f8785abc342bec99c5a6466468caec8d104d1a4e0e2429522697edc0cdd5a2c466679c5e88a1c4d0a34412e462e8c54462923d2e86544f3e366e866689f5a5037f1a4a24d1f53b6d46aa79695cc8d095c0d4345445efeac71f9d37c55d6b3174ac25b8b85895b5ec1d53044a4e805e782738153e180e4c7cd767d99174a5e28d9f54f2da81b289e54b4e963ca965a0d865ce922f8432d7b51e54f4443643aec008ad664b28e7c2c244646ac161622d910d4ca0e3a80a235a99c5847be23fbd4726a11b54ce6432d6b3da8652ceda3488bf8f657322e542952c88516b7164b5e71a14a912a999aed89bfeabbd082d688adc06b622d70a1c546ddc432e64d5ae5d47243bab5b0422d937951cb5aa05eb56e4619d5925961b995316fd22aac162323b185e5c4021fb5926f0fc3caa85f3d0f4441be7683e2afd80bbca67e1330d82bff2178d23298558afcf00642a1354a5368cde9a1ecfa2b91d5c29242ad90a035a908edf3a3c5944ca13562442c3995a6e4dbed6f59b3368c367d0c08f32b160b66a563ca91257624cc08f34af3564d168c91a5dd0726d432d68bac150c2bd43298076160605837160c0c69c384d204eec692e106a509dc6d25c38df50259acb19ab7db0dcaed06e5966f2614d3cdebb08a4b4580153242b27fbd94de40146584b8aa095deb1d6996110223071839c020d2a22d191999566be6611031cd9d2442e46e14770a156ede5c35ab4e0cadeaac7458e407f3fe7888e7641d1f2f780eca1fdbe035ee4320df80654458fc14424f2479d04dc2756e0feeaa7fdedaf6bf495c07cfacab3e1e02c9f6bf3e784ee955de4fef3e8a88afc2fb14097d14195f85f771f1fee08b4e69ad36642ed8b4e12fd5b1984f3e99cbaf681e232aa698f2c42c071b82a8369015543a1730ac232e7d312b7bd4b298c79ae7e62f9e293c483c381e28d5ac4d6a349bcc87cbabf0f9c030b1ebf3b8c06b6a8cea5f05988f8b8761a2248911397fd5770153f37c5c6828c9a78e905d693ad311da558baca2f20fa37dc0c8bc0a309ff2f58d105a439fde10dd8c37453734b8c1dde46ea8b0d944bd9b24a47d9afb8cd164748c08f7a07ea9634bdca6bed6b1241e805a3571d65561ca18cd6d681871ba117273c30dd17823e4a6e8860637b81b2a6e72f6a6e8a6e8f779537453e4dd14dd9ba29ba46c5d2a4c6d918acae955f422f29abda47821bd925e59b4b0a44031a4097a117915bd662f295e48af2c5e492daf19cb6b967acdc0d74c7ccdc2d78c26485c41a146fbe2056d6565e56dafc4df740c5a4813e91bdca4affab3a6e54ff3555917f92bf1b6bfe918b490be4113a9fed6f23796bfa5fef6b715fea68b50a914ec4638a258b44bc4a2b184582fb084764dbd5cd0b45de822f8452d638dda840b94b7e93f96101611eb86f09454bac25da59c65155516911af355d7b4b18e54d6ac9a44b066bb7e8c565342336209a1357892b06e40c222aa393c3e0cb1eb8742760dca9d924a57b088b08ac653923d2591a7a47c4a3a259d9286f05712af5152cd188d8611f97409126209b904a5522ca40def4d281921f9ded21eb5ec5fd432fda196691f29785b6cb1854f111380f21edf7e4a28e5426a28d50277d1a7295b0a978ae2267dca425314a4220d690a69535aead22de564c8678c463d1790ec9450cde1f1a1a4798290fcc58342aa0549299bd5d9992215654a0a5773769e98d5ec3335942a4f739f297028c81090d4504e21edfa5fb3ae61cb14cb0741f63fdfdf490278d92a5f42284d1b4e3e7ced3d42f4a774fcde35f8a23ec3107f085ef0cedcf2f7336ace57eaeef1d9638324e8794928c594522156d81866456e9fb06b2b16c2e442fe7d9ed0e3f3bed33c6ad78120f895e5596dbd9756773020023527a53b1212b0809a133e502a45420252e58e6cc2dd67ada55237bacffa84fc9236bd8b4eda608940eae5bbeebb477df7be51e5897a95f76aaa543395bfc4415641955ecd54798e5be50cb757f374d29468483d7dd5c4f1297b42e5d353166ace596b28d4021c4001fa34a8e6e44de9d31f54289f50b59a43cfea116dfaf549cd816d8a42a1503b584a902a47e84ad9ea29fd55e9f67fe5f429eca2547a9732012e34095a48559edf4a797e79a3ca14062a59acc82a4f42cda17fa252507f4abd982a5f44287dea6f943ef53d76a7a2cfbc551ea54fba519fd25ecd0ee53df64a4965406b4e47b603f6e9a4c1cf3acc207c8f2dddf713e8e52b7790a091d8e12efa377ccb587f7e2beea59698b8ffe7bc7c9f7fde7a27dee489244931b000d7caa37bef45b13e0f20bbbbfffdd99e3ae384f506d0fdd7bf4fdd6c55b362dc9dd1a75888b4415324bf098909893b088a3f6a0edd670958687f47366bdfda897f6c2f891434d9e6f6248228c1066dfea21f165972001e655ffc347210b4bdafa40d4adaa0919487fc45df7bfb9dd0fd57da1bac5df3570958c86a19f82526b22e98289ccdac0e26fabeed74b6692dcf8c894cb40f06b81f4008f59d00f5fd63f890fd3d06103182c8feeee58b6aa5735095a7a46dabc8dd1bbef57bc330b4ff85f6ba75fbf7be8ed879f5de1b3efefeea30bc37bce1f789e54f75511d23dc9e7bc30afac084859a2933eeeeb2d2f7d452e9f4c75b9e1410b125bf3ba1c726bfbbe508bbffe5e0f11282ffbee557cd3229d3af3e432c4f9848c72328b5c1ba92ac209217f257fce2d70a82fd1bdeaae6ffa0d429a54efdd63e1002e287f533f95573fcac45519ff2bb2efd29eb5bcdb1ccdf634ba8f1c3d38761b8f2a757d1e7dd2a2a2adaf4272dea5bcdf0b32e8d9f75f8a692fef4688665a971f937fdf0f780a298886882c1fe77034316c5b0bcfea2efa28d0efebc4f1f87cd16f9d62efcfb11c08625ca86864c3f7cefeff6deea17ef7d7fab3be3abafa6ab54fa7e63ce05c9d5a438eee458a26aaddac8ee5ddf5b8123dbaf6bf2c3998795fbaae6d0a7ff81967cd8ee3e2c75e1e35dbae4fdeecbd3ff2c01b6c9c79824316e971eeb1307b64db05d2acf1c1b973cfc79dc27ff84ed8efcd3cbdbfdfd51ebc8314235a9c6a1ebfcef1d99d0ce0443fe3ed767a641f961341b6e7b6e7b8ff5f403221082b74f0b6c7c428ffd40179624e3b73cec5ffbf575ec0a9d11d10404df5b5617ede6e14f9f3e9015b176d79d53edbd7fdfdfb86fa9f7d8bb074b5847abc6c14aa44db57d41b4995ce83adc75dee1af6f3bd7d8f3f7eef7b0f6929a964f34e87ea0e4076abd74972ecea826fd1630e083884d9fa506f9846d6ac2855593ea1722c83760c2020a9b3eca636ec4a66f4ac9272c17a9bf29e6e1b7275b7ffbde43a6db79b8f6baf2467daf3cfd5afcaeff2b61d6757ebeaf856920c34af78a9342a4ef2dea4edd9d3a0c6fbff75f42144db45ad01492365e2891fd45d32c3cb29dd2d938de71b4751c4767299d3d36fd991bdff6dac49ed556a95b8c3fb841f78cce236fd0fdd1effb1c979cd6786279967069add47330f4ba10dfd08661a5a1b34aa704368c2db36b798eb069f9b9c0a4c30b59b6b0d615f9d62fefdd41b665f98237dd3d768f5d03c73366f9847dad3957a4f5039c19e707bb7402c40a24102b92192801dbfe6f75baf7209a6cff5426adb687d9f7097d36e8505985589c107217fd8f529adbd4a935627b82641b12626492c1bd5e777789e20e83e97425b5dd1fb627399cd00b3426d4bd627777775b8776c52c4bf23b922cb69341ee14b6833c03c7073d3f23e4d0517b6ce80cdf9fe35ad0aaffd5347f466dc15c2892ebeff78af7adbabad581c196d8b02b45c16d7dfcd67eadd65efd807bcd9248b64952b0ed13b6daea0405571c19220765adb546830a1b4175a9413ebff53fe4903425065adda4cf82c5ce39f6cb971c24b80408897bfa0f850bcd5b238bed5f082656102df166013a63673575d7146f4dbf9de92e59ddb968ea2f5a0370fe56cd8c56bb6b487575a58b2876023cdbe07718d38c58cbca076fc9b2dac5c6f7b3ae981818d7906a5610c4ae221791cd4c859ceec1ce068f38a3d52b1bbf781999bf3fdee7c5cf8f0b6efe08559a229aa29f21ebaa43e20b8db30407091facf7a1c2e753c4041380b2cb03a9f67d59bd0aa6093f4356e767487521e1b1d3d7c739c2632a4e3cb6e231d4d7c731c263a9af8f5384c7589878acc563aaaf8fb3c4632ebe3ece91c740223c869578ccdeaf8f2384c75c622fabaf5400276a9f38b4983f59368eadeec47c7df16748cdd9c1ed73075769add56b57ea7ea55d44da65832b04da75836b887689c0858376c9fc555fa55d45ae1c5c23d02e222e1d5c4554b48b04ae1dfc553f06b54f1711cb76b1749117da2573d70eeeaadfd29e8f9337baddb988acce0e92abc8d677ede0333f66847e82acceccd00cd14c908c241955c8a8c96822c326e3898cdb8f0b333e7e846ace0c0a34455647061419538c76952165d7771191a58cdc1299c60d87864bedd6853d4023891d5ccda9bf836477a4ec5c713a7790b096b5feb6ca9f20eba2a9d118d1e0cc708c90ac0e4d11ce6b1c221c213843da839c075554d383240fb4c8020707c707ce0b99051b548b6c6636336b6354cd6a63a364574c82a0da218d2838b41d8e5f1fa709ce101ec36127f11a3f43280eedc747d581f9fa3f4130dae648b5f19536b3961538b49af37d7d1c25383558924d91c7c8af0fd3a2eae0f8b099d114d9cc688a6c66344536339a229b194d910d4d569121d4107bff9145a39021414030c4fbc0d4164b1c1a52e4d366f6e19021d40d7ea73d30a44444bb3e481feb4f0ffd04d11aee352706b2e9535712643568f5b7adf67617a325536a7c5b586ad84a4d29d48acaa9b42ab194cc5eaa029a181f3646413bd0fb28052fbd94d27b29ed3a5adabf17bcf77be9f9c1b8553d140c5001374005fc23c280ade3fe6a841caa5a75c6f1bbf5f558e220d7f38ed5aca5cb088d835aec4fb07dfc5dd781401ffc1bf7c112fc1e1bd4677dfc62edf179230e7a1d97b2f0c372842719071294d64c6bd64c5bab79556cba4df67adf83fffda7dfa4a19ea1b5d6daffacadd6ba635391fa1ef8511918987192e9fb5f0bf2a8dd574500ffb416c86e0fe3ec75228b4f7baa48ea1e3edf88811e3eba878f9337e8069f0263f9f2816e5f3ed743f1795db54044eab466ca8a52fa9363a43d47b83badfaa6f40bf507ea513b81c172865d00b65da4f688ce5d6c0d5517e2e8ca9e9ff03faff32ef4bc1e15adb1a22abba235563fd5aca58dffa335f64713b1c55f19963f2f3d2f74dd124f02c14fefcd2e2f469007e0ffe202b9e7fb520a32dd1a03f93d4908360de1f49191a54f111e2594e04964400741fb960db0506cf002bd5f09fadff0ef0dc3f0e6eb2f5a9e40d6a25efc2c794384effd6ff87fa5dd62795230fc4f87e0f74190fc8f1de3a8e64f8f36d2a38252690dc2874dabb882e8adeef3fbdfa7747fd0f35373c2cfa1c3526a677c945ad4a6efe995c7e214a21d81eebe2f2188392abac4412e89f737e9d52c5d512cb1c8f5c727c9f2a47b14e9586291e98fff5e73c6f14fef7b2c4fbac9c75fe9abace8fb8d237db2145fe55fb03d8ddaa2e8a40dd3d3cfa69c5f14ed98f5e9809def03e8a66f0261d4be3d0d80136c27b3f818e8ee8efc91d440779f2a7ff5e93bcd23bf4a3efdfd938a4a59cadaf73de91239eab3c71e45919a4a3a6bd335e91efb62f229f9257d3a60833feaf045907e106a8fd99d76274ac4b0f10c24ec97d65a7badf802ecbdb72a8e1f2cf2e934fa4eb3ee53be14a0fa807f521d0fea9e1cda477ef7aba28e3b12bda54a92857230afa480f75ff97d0f963d7c72ad2ffa77b873d86301fbaaca7aa5dae90c17d15a2d35479841b6f4ed57935293522f65f796d4863c46d951ec8bb50ca839753b212201e846673ad8e7b84faf8d42417eecd37143b97dfa94ea97097d6a5a076ca04bdef0289b46d9b4cc3a8ad8d23fab83e3cb385e901f47add62a9214b6ad600656d6bc8944d5fd96ee25acf6fd19b2ebacea99f70973ec30ed7be85e9a13fb8a44dd13bf1577b04d33d0a56e56d3bf9a4e9a2088a985fcbb5695fb0b20f2e934557ebf7f029d4036e3e771bfd3f75dc7f821d38f8124d3f70d64c910aef711d8f529016c99e9c656f3b8efdf0d4055aa6c566520df5ba2be27ab7a6ed868e34f287cfb609c1da884edd7353965340300000073150000181008068442916830cef254543e14000b7588506452389646235990e4300aa220438c21c410428021861084a8886a000a94ec377a98db164184fd2ca107bc803092e20d8afb601d4a1831d5f538326ac5ff87e9b58b9af2dd0282cab05aba9dc72a5ba24d06ec72cdf5820c1ece49e3510a2a430d3dd286cfb5a2c8a5a73ecaa7958dc1e3b8a5a71915079d91f2435a0ccacb949d9cacd2e9b82a295e49c69c5dbffee974187aa3e20db41a2667a323a01c281e98f5b054c2e4bbb818f797a5e01e05b1d8d437c6f1c5671114119245d029372eb8035cecac51a41986fc22a2f3c6b27fb1c71c8b930eefcdcb45c45f1c3eb1cd9680a56a998938e5d9542aa73c6dbe10dbb27c4f0afad2e77d2634aa408238d5a751e9acd25ffa07b29ab4c0aa8bc2a14fe11cc52bd4a901f6fe5ee1e4c6cab29142478e4c83de2889de935dd6d3c7135d0e45f06567e33fad05c5e792bdebf0ca19cd6205182c417986a3286ed6b8af8d40cce5dae75615f9932c10c1701868de00b21fb7aba3f4e45c36830741d1502a2b97be6f36457cf96fbea3407cf354d7d96574a9a0679700a230d53799049f9d6f70a9bc2a457d49edb60905bd38892ee88a2afc3fa0dd39cb576033cf47f2d9ea70ca4e9e4f6ab2e1f15b5101b53d91ba3dd9251cb4eed1098d9d445e55efe08af264369cd9935af54e647035f32b549177afaf3961fc934b2ac0b77596b5de70c56db73650915937f012c7bebb11390f21099fa53e745b03b49c9b2ee91394573a0379c4e0c2d3a5c52f81e3160c66d70e0dadcca2151dae51da25aaa0154b38b80134bd06ee8b834cdfea52567f65b2f235ed5c15bd91b32313c1a05d51ccd18818bc9c41119e7c18f82764aaac8c145fb0f508d48a6293aa7a3557eb9113ba7f27ea2ad017b074c4deda824ee165a8f00e3c24eb160a7c7b74ce2dc4e6455fbce00125151ac35064262a36bd5bd93661b2a2d35cd717c8439f22efb953ff6b75bfaf5da1d51e1eeef6bf81809061ab369982fdf98a97d0254c8c0501aa0aba290884aca49528a684f14b17f77f2c25455a6b2dd4ff681e08d13837a0bfed743c370b9243276164ca137d171dc5102d22b6a93f1627214993c4393ef079164ccbf58a640771c3be274c908cdd266a1909acce27e091700171e53ccb985ecef4187997c290c7f5ba1a51846d5d0100c0a63804695c51dcbece06e5a0814e17005737a06d4275055a0b088d482a6cc637dc6c58fda193845657584da07478d52bb3ec623431ac18d487633ae6a611e90be9d107bab8dc363d618df2994c7408f7e1d9c1121e51f15aebf3166f2088530d85c550ae2d5c85cd834c0ae6c5b711c4e4e22d74e7dcbf48d4eb3443eaa1e12d2cb920fc4ec22941579f082be1f4af184dd556dfc423830fcda70dcd5ea8dbfebd505254a5d914b007eecb4051f747613171626f3a8ada7d0e201032726dae64694a57177b757f512407b021fb8d0946747bda9b08566cfb569307279fe2236d0c4d3a61397aaf1cf1267c7836f3f3cbf60c78d08ce7a454952125f63f9f15cbd0fd27aa4a58d2256ffddb05aa6d4feb506a20ffe9f846b1d7900c85a306a8751ed40966b9924fb6a04665e35d5329667ab5c7c32d1511303b4381e60104abf920ea7bfc972f70be16297e32cab58367ff8e2a955aef1bf5cef353e72606fb210ad4d723d8c406edb95b3d1ef87af4b2936a84323c2e63f77a0543371f4649541dad05d1636a5139c4420f871d3d36654bd87c6e1722aaedb69ac192eec761f75fce573e8a22cd01852580c92719f0f215f477523deb7f5c8213ac41b8cf55c1709055d3b6a6fb8c1232fd0d45ccbcb1f36843c091229233fced0c9cd6de12200ce41448001f803c41e73099f72d50b250d6631a6c97f61e049233b27c8c5522f169c5a8218b8c48c1b9a9841b02325f2b6cd1d80fefd6f668fa9fbdf587414e75771387e0645a57efccbc64667e22d272776a44e89141cc1a6a878b45ae74023703afc1396018330b77a05261c26d3baa84342859c142c242f52f53d6944581dd2d9ee9de82412ab4690fe61bae6003c5302c4e0b401b3302bccbd65843a087748cd707c8f9219be551dee5623d4b00cc7a978d59cd4136135404f39a35cb8c53dafc827df415ea6fb5d3ac3d1f7d03bc5862c5075e05967557c6522ea35797e964d41cc7515a45f83ae3773c83aa1a3988c7dc10d6c60119b68096ea7a42072731eba73814b238b7decf8d7f9ad8e506d0b25f553c4819ea108a6ae57972d417025e79aa5ebd547b29553b22e090c17e1cf66e48dc6faf3f0a24c37a54482cd3f331fd1be850abd32bfb9a764407fcd144e9731cab47495eddd91301bf3af0242e857beb8d2e35c09af5333386cd813e98b84fee3d9c0beeceb7f341971ba41986075a159ef0d3d7e162fb6358642deeabb3212e2ed6ca903da27f273afee07721e7313a441e0502d5303e268bed0e0d8931c17992e6423f597a1e661ab8f71ceb6c8d0fc51feb20d885192c409bd7b0c756e11ac3eaf82d8d8017cec21b52e35b6496687547e777e300cb0c4389cb6c24325e0920aae4002687f1015e24ff25476f3c4727608c24e0b88a2e7b4a70df1ffcc66c840d4d6aefae3103a928e60c6260a08a29cbc136680f61e69eb48b83c30a0284c87748fc9d97ea4db5c6c78e91182d66baedf978f5cc08af5ebe6c5d9650cdbd21fc4f508169ba65229cd999fd52251b126bddbf416620a8cc3bb631ce880ab3c2f4164e95e1cb6e00a35e0a815a81d1fef6a587b403e41347e56907495c59df1c043717fc6fa8e24cb4913088d20ec5b6ed28de2acc95ac65d8ef8cebcc2800e890a1f186eec7196ea04f478b6317a27e38d214619afaa8b9d54b5a253af62230e27636edccea7422290a37548eae1feae60e2036cce62311c29c24a84c4b6d99053a4d7c903afa9b2e2760050c6b905b2c36a46e9e026fe372341b7602a82314f6e8cc28a41bcd4ff9c09520760ea94e638060c31d7a25072348a232de7e6c63d126c0b353b7830364a57a0d90569a7045058ff046dbabc1b9293103017a369a44aa8529642049cded9d46a00e50fffa08fd4d533b736704c012f69ad6bfef1817726f6b21fa6bb6ba619d9c08105c57b13bfe1a513c883e108a1106ba73cea5a1892b80d07ac4659f994154a88b8ef01028f01e05306170996bd3e52eb1ca3447693c5584e89f20b36453d11526f89aa707d5da65621ae36a28da0dbaab04085af70023fe769760d661f5003c074470f7c69508f56f9af92cf751b4fdf128b76ad7f71fce169e67d9fcaffdba3ddaf880e64aeaf24a111c0c87e8aaaedd51d7b27b4502e33b4afeccc7e6496ea5952adb80a5ae5a178f1b6cdabbe93f32d15ff978134f7196301d401463d6616630a8bb4d18c3bb66671081176a38925051c4f5f5c075da68b1eb4e7046f51f3a14eed8257714e0a8c4de9544cf8942a40ced808d08233001a8751b248186abf30a55185559522a403eaaca26c68ce53c06862867cd590f94799a019e6dacfdad319574cda18e52d4d3b3834a1fe6cfb9282d3805582b466e8c05c20c97c9645dd8e45d78fd1e005803205688c51b9f145aec3372e66fa53de2688b0e9ca1d4ecb03c1aae679ea07b640e21d57546c23b5ab8bfde38e4b3775ea9308150a9cba3e2ef9479758ece2aa9b834462bed857f96e4f60b367c6d8cafdbebc0b33f48780e9aeee929d1d44dc86316e5a5ce2f22f5fb161c6863dca2d3610007d0d80b02fa1e5a012fb7d7bc07a6ccd81f155b72945a77883f4cf52bdb4f0c5cf82e0c65494e2ae5ece4d809319b8406a549b0a91a54e6a950097405a1115e4d68e7cf3f879425f04f47b3d466d752710c0f4d68c80286d7a8a46f62a0cf16acb1e9e6c6e1199663806d3cd903d8fc728fd106cc027b992b68a9c3592cc19f0ffa2e0d4f75c3a78292a183dd3bd51236d8a1f6e25302a10ca30e368e19cafd0d677c1c8f682faaf933d17ed823680aac9ee01270887d10b7b79a818e986bb2bb7dd10a0ac86494c941dcd05dbb28181f6d09d90fd655ec2d2f81139ba5b80af877fd2e0be8e6ed62a09c5e08d7bca5a5338fe727841ef32732cccfa7e7eee31c8b6027f4c7fe5bfd0e6631504ef0e117d147528c31cbb4325d81c10285ec0380162346ca6984301c326820228f80442414342dda2f32d482500273401c9afb3095f172f834123880c1444a7248539b132307008e353b33a80f74d118406dd2078b593b6f744361f0799cc566adba3b70b7bb389d59b84294bd3bc17de327a076087b3c2d89b0de0eb2313d326fe86d14f5bb2f582e1c8563ab3f64b6ec8ffaca352c82d5c3eaa398c0652b09a5fdd92e90dbcf2fc79173b56e0814e89e965c466544eb36af0b1e4bc01a213a042d563b2b55540ad7c6928146575ce1b817ea151c8cfb7ce0ccbcc52b344ec2b4df43122a1a806d77fe86ad165b403c9eb3ce7f3dd123a37b1a7b120944afb9e66f1e573c72413117e52aea858a1f13cf10ad9ff85689fdf2f2e1af939d99f71ed8e46e264228ebcc61c1043c9189f8fd583534bcee9bc003443bcd054aaa22db0c8c840b3a50109a49d1c2f79f2f5be1e4d0aaccb1d3284bdd41cc54ae9e4adf876e35a19547695952be2199e7dd8104eb9549c355e164d1af5c67b250f67c8d8fe8d9aaa0674eca7b4d7d573c6280e5218c01bef7700abc165d96d7f6ff8e0611d6cdc76c222ff855019a05f7bfe475334db83d6d9ad56f085fe80cd75407b096560684ac5e19b9fae89cfb548132001d521fdefe2be2e2ff0a5f4ebc7b5e49115ce805eb67004b121a5bdab8b70e45c475d3ee60bf1e33b01f031b76f8a89c6aff35c2b35a89190a171783ab7137d90ede2c07b10905dc317d07b1118834aa4b40f3f576a00da5e3dc3ad647400a27c0e3e95f960908740f246808e716885d6edc4928d575005e00b42380e663d3d3823cb7af743decb57c63a0b88cbb4c4a5462bd5f1b4cc0915111ab7ef0ba70a703a184f31808acd80e7c3fc10cc1a540001caa38d4272a977f3eac5487ea1d4e093fedf7dd82ad7b4de6879dcf6524c5362ca3756196b83ed8e3a431aecc77fdc25a64847f75785b8fc85e3317d554785719d5c877dde3616b15b93b2702b74192d7278cb7929851abe3168b73f31fb31e4275db54438f531acf45a0dab100a79eb4fe11050e8519a128d91c9c30873cc91d9ee81b21e4756363eec3b7e10b2feecc4c285f64061984e35e5e06be415d3428e3576b6db261737720a2c6d78dbb94778153640c7a21eef50bb2ae67ba1bfb1d07660fd597cae1288098134e1568ba611acf2755a964b3cb117155b491764c9e2c62d1138e4ffe820753e69a4f9cb05ff920e46bf185e16e8ba220a37b8124da3669b1a386a0619c07e3f3a03f84a568d1373b2f63be859c964bccb9aa17541611c5dfefce4eb5d33bdc0281ded3caa065c1a2e83323a3c4c7887b07a8e6f3564399b4a8e5f6e4a554b029a166a7b8c88e987ebb704b7f3f4522c92af1860285fe84179096b732efa713068bf4aaf9fd9fd16b9f79dd253ca3c4ad9372ea87b92fcc8985086be8a94efc9ca87ce2535e72a133d7c5c94cfa9930073dd90d76879f94918145fb3a680b0d434491c857e19698fa0dbc7f3b2486b0168255a68553326751032b12742c8ed6d9311c54dd3fea4683cb2d6548a77d323f51bfa212f271eec42992174335c1a3764e572c25be136d5c97d528b23fb868df00f7b0e7a1359a066a1a569b8625bd42ce7c49093ab119f142a984d07d0acb5c34784c4e82b8bb0f360057cefcb93812895a3ff61f8746f89e576c354d547563cd976fd102cb02b617a6f103aa597a9568221802c1d5de32f7eaa212a7987e5d98e8369fc0b94382901cabe7bda11c1e0f3a26786f010f2bb9a19c8e6d16ec5adcf7283114324251b6fa2b23e7ba5c3a7c8078c2d27c0ed2f69e76a4a65d32c19811912b6bc52b5971dfad11bea9b0d582a28e2839105c4455bb5e18227a17c150151a877c02cac9544df7f4af592d951e1562603e5ba8f33ffe9a06307914158ddf0adb1e8424b5863163b30bf95e94545f3e429256342f086be13bcac0694e3c58a287a01eb6afd0d56fb01c06443afa1f54ae70b1bb102aa2ce18043a0ef3af5c3b7b2e64a9f6921195cc1d41b31281f5c022fc97cc53a963024963394bd10b5ce19a9f30ed9de99e7fecbda8065d103190d3c3e2f669f56742cd1f4094832aeb76bae55964249bbd14bc96458a36eb9df492e1f82ad495317bfbed7fcbfbc3ac742873fc4d58ce28bc39e6cf8e6ff036b6c0119e44a303bf37b311fa97026e90e7bc676c9c31a579801e116388ff6fc581c7b673a460041e5f67192a8dfb59593e3c7a1e946003f87834a4a424d53ac31487f664a6e23ba313006f6e02b8b85c4e71e85ef5b1c3cb10888223b2a2daa841f1f207aa8be749517211b237daed9daf58c6b556f7730bbc7b41b30617875f91de932dc80374e576836a2790131db99033370f29948ae16730a90a2ecf02d40980be967de3b6a855cea56e09d7d09f8c948ce3677e1f28a9ed399f54174e360e15ff451a580fe1c928057d60bb00f6dbdc4f40b194c0299c83af540dfc96666179065ab7a950061b423b570a53462e1b1b34f722ecb0913d0e3538a8b390b144eb0375ce75ae1c6c8edd09d6393b79737035ddb732b0f4152fc0687c70b621c77077ab1754573cb00d5c50ca529063242e97c70ecba8752092dea05999ce42793ece5c1d09ca62acac7e712c515b11b008246aa9647fac6a1e4cd14a57905e334f8e6b33c0bc7d19db4e630b8f82082b60941f2003f8cd99a7ecceff90e967e4a1c6b331acb38f79b1656c2df205cb62f76a78cd987b510f5070a4b51e048cd4375b4048929fd25fb9175b96855058c415cad425e0e8a15baf94d141f848689139700137a0edb6d4f9511f5b6f79bba8f7cf5b0c19f6419562bb4d95824e4f43953b17109077377d0bbfcfbb70ab88579693c5079b50fa8c336b84a11121bab47ff03d15221efc6091ddb4768ddc40f3f589a82619dd18ffe889800f0d9e2ba446761473cc5ac5d467eb40847ca4a507cf6956f85a72c39723d47c2735d97e58e41fc02336bf2d0518910916a2606dbddb7eaead09a3d60b0d98046e3953a3c88c66bc032015514c734f0580d2491b3d7005c274340b6b56ea38ad1770d062ca8871c13318c84ccfc58c3f06e6cf918681f90d5c009fe82565fd1381aeff8c720111d748e4182a7eddda1909439b59f3e43a1345413f9a6ec1dcceb41a818e5ca247cd5b6e8705b2cd0bd7a7c555968ce144b7c2ae647b6f34e8ec64fc886e850ed2b84507510d85c18691f74c0f4adbddf0c802b750c087e447d587eb512af4ff50191d96dc466ff4cf92ad3cbbb29b958d835b12fbbf21903e6e7f345b7d83bb8f98b426d27d6d1565845eeedde10f67a911943124c0ff6a7a7da47b52028c00cdf3ba7f0063b30ee682f73208cc2e0f53689fbf6672300ff83b7182a6300095bfeeaf33ce6d9146180da48190d7c30674c107c69bf0a2afc170ed44247470285c30836502ae924e8d1aa19d19c78f2e634a0fc3664ddd3439f29d7fce49178a1768613370425d023c2bf6b2ce36167c86f989b6cdb51c4f7836e719f5b911905a67b7e7f3abb8af55378d05ab7e839455a33266bd5b99ec9c2a8d755b53259584aabc400879ab10f19d95cc93d823133e729ff8c9defc1b12609277457654d7f40f60ff87bbeaf651265a9dc02f05e460cbfc73d5a80486d54664106dd4e97e29dcf46bd29ad47fe9b65ebe74e5d0a4f79079295563e154f266ba86ca38aee6b94d9a25493cf7568344668259f5a9b816987114dad41107a24935458043a405ac0a7789760b21aaaa3b27c62c9d4ee72dc67e8fd4bc0d43da362f5387fda26a996ef9993573ca61b3c0d09b46b06f3a7656d3e5181d376956463885a039b67e41b6cbcf7e2ae0e0cf7a55cc224a04b8b04e9964fcfdfbf06828ee47f92b8a42f8375aec202423a5f2c4fe85344f144a5274e8d64b8359c878a82eb11e77936990cb158fb0731626cbdaa97b18cb15b6b1940a9dccd7e044c26773716c40a9585415e39d6a87f7afd78947faf36983a5e20dae98769172ad1d0c35e1529db503ebdaeb264e60370a8318999f6561a067a2bc9495f7914a6e015d350be4d40d1d4f328029574bd2d8f22d3eb00235fb7ba91f12472323ddc80d386511660f509bfcac2bbd7d16e5a42b5c671ddeeff40b24ce97285b02a63057dc5e635b6924ef009753a728a9a5e8a6accd9aa6be00ae8e236d94dc9505c2ea5aa9cb70c2249f42d9323b032db001193f6c849a3811778d1a44fd2af62cc9335c267f26f9c5f747d5473c6f568fd8323f16af7b0a00cf327df20c255de8927d09322a696300b24101abaadab873f6704f8185ea79ea60673ea540655b0732001b6c14201f4ee46a8eec62996d064326e81cd08b5d105a3ff7fac1962520b96d95ccf0ed00350f79bb2d5c7b301a4601b8be3156fe66574f96f64043b0ebbb550fa41c092fd2cd99be3aa808f9dc94261421a91904c0990801d83cc2f4d1e413d67a654cc32a18411d2e505abcba267c78f2da5b720315ed2582c0af33472e4cd4b1af5b1c5d2b9425f6588cb36d12081ec1b30d502dd1f74642eafeb5c61dbb13fd0f99fd7cb0a5eaf4636e8b6822df31c2d0fab0823e09e7e068961eb65b5efec8422a03a89ad8903876ae290074f4d6e647c35ae866744073e985df6379b188408f596efcb734af6d090f8e521c4680eb418f1ab9278158a179c41e1f5e079322eee61241eff277a499da34161424e088f018599d26e0cb8f15a99c20aa6d91b5a8ab133d609ddf8bf6978d9b669f69b65bc8c71e24b93dfee4698536d007fd6ff4305d55c8e9749794c005c2255b554f5fd50b443014586eab7a364d38c5bc7d58e949409b6a9a06d71b0845ef35772fc34ed5f4a825b132d5bfb2566675bc23080d0bc1edcb7f71fb80f3cc88fa048f2062f1d6f2c91a233f9bc7b7b3643595c555bb4685f9ebef289e4ed5be3e4a0ea2df843a8fd1a4d804c2fd7e54857bb10323954483ef05e37fd7df8fe6a0db48e5ec89066da212d41f082b7f22ee98f40caec97ca9b900ac210108f8654de1e03473b1ceb88ba394ca5771fd166b5c5874326a90ae9bbc286f535fc9a9144ebcd7e86e18a10bb3276182e0514c25247e62969a760782c18b519cfe179da7c9c1407e12c803b9ae2f8f8a7341d45431d438bcba416b500af57c52a4024db43e264f901cc58971c1ba64a504f5a59168507520d5c5956840b141b65b02c3d4caf957622abdaaa5010679a23365138d8e068b20feb4025597cd42e48ea653eb2d42bff43a13957cea87e672f31a6b960d4cd12f9bb8aaa229582322ffe794a52f204a342b6d4717ef1f6b6ec80eeb2968a9be008be681fccb3b6d3464b873a20be208c937c9f3aa2f20a6b53689f1cc79855bb20cd0c66b1599f396d3e8680fdbc829de18b1778e3ab96f300a5133b49ab75b17db682bc2c204b07d8baa99b2256281c36f8a512ca134b16cfce89b863fa4b0a446f45848083dc7f2d866b283f468083d90495032e9f9b8991f61d651af8cbf141219cfcc666cc77abc88fd9a359cb169fc8cca507bcafc398c1b0c2eacebb42a6cd623e4397b39b73883871eaa5130550073ec3305f3a1a57a3013990e9cd786e1b3b92609fe893264cd877f000e2f10452dbb80696874e06f2b2098b880497421ae1881f4df72f3ab459cffd935b898c9ced35dde2357031510b7044f4c810ad0257ed97b13f9f276786f2a7a1508f4d9c5949e53ba3fc5e91f05ee43ea12d2a6a5da90582623f8c4f945222eb0514be85266771c794d1601795b1ef0ee94304432eb181e8159a93062cdde594658ab96cde40fd7f2e5387cbbe398e28f5ef2c92a1a03f168ed37074cecb3e01ca5d3d279137bd77849c70913b8c821c29616a154ee8b412033ba2c8fd601678291be8e0f1e800dadb78d97e8caf19a1bff07bf0d18c0bfd65471b816e5fb720403c1d6832c4e671b5550ad4875c5f92a5c900039b9964cb21c45bf1dd2d23942d6d8979a596fb9d1f083b8527c4f91c1ae100b971698c26a39f684374f92b0361e56aa9ef255591739b2e95c8e9721e43e42c42e171766c6809ffed8378494037d2a3c8d5d26d427b6d88198e3f1c77afed139d46ec31be10c537af69b4ea6005f008f605ebd50b750ed78618072ea6427cf9850705d8e15220573a6da15cc662537472ef78f15cf1cca0a6226299dfc1e3a9c6087d1f40c15d28dafca318ba3ce7c90f09a7ea62dd4b932784255e477553e2b11d1e7101a8526696cc7b68a341e0e3b6cc51e4c71c8c3e0f8860141df00217b784da5848185103e58bb1436f54236477f52e23dd8d218fd50884a51e2849e4d2b373fab497f8f1104cc79337e9839ef7f1be87712c41baacdac501c7f04e5ed3dee9a9811d6947bc6b48b8cd01419118eff1e3c080e1e776eb9af92648e59711e52da58248725328b18752a12d6f24b67c96a958c904396eb6c130a086c15d038796b7c0cfb00ca4ad8aa54857f8c70aaa41903bfe5cd2bf4d5ddd4dd308d5b860f51277fa6db2e80341d80e1596d5d7707b2dfbe7eb86559073f1bc04b547034f1bb424d5eed660a55b39171533c8eb855dbb2d9e1c4953c10bcd7935f0cb7dcc91afcba2ed9f2d7b8c40254c5da56d255ba812372305c5695a2f89b1069f22b8c07c301117c88376b99d9d9d88bc25b303cfd2de1b33620558eadafbbde0ce60adf8e1d9ac40ddf423631cb59b27ff8e2a5d399239278a96b80405ad3c693a81d5a62e855991b79f593e21f5eef32ad90b3884ea7eb3d985b629b4b1e02caf17cb9bdfc144710f33a9fab8b9243079263725624d1f95a22aa2e34804589f40889f32ab038e2b8d0a878029e29b767fc34726da2b04e40f869b49591a82656c021968d222c45d3972ab0fc0f471a9483cbed38ef4f382880d817aba8ad801530457c15dbecb0f599d21939faadba36a26f6e2e986280bf1e6833ee9869ae3cf2e5b9d2c3f6441dca014d86ab154a13e1293a4498b84e307ce4cdf124918d6b9b5ecd2fe84200872f74f5546e74afb9532381f82fd04b9fbab513e1e04c3030ed7363b88ff9b3b30036c107db1e297db2e8cb723cca2fc8656a35751a6db3128bd3ca7ea862f3d01e05f66fc79c7312c159974d695b5c12e26f10986b47c89f37929e7a945508b71b4d765d8667c02b0cab3fc8ba6d2869983dec07ee7fc49c343f36b3d8105f8283ae3fb980d317fa7dba838acfa37f5d7b3e7c78efe359faec2a2de3f78a403d96e0d8a725419ca020a10d955a18f585af487ad99dba191114fde62919b90da5ba7d5cd8ab1612b05b1ad78e365c1a4d71d2d7a5ba9cd9951f0f4a774a5400951d485d36577cac0a92e4f40ce0203afb80d45888ad2f2e9f08e526eba9303fd407bc393ea9f3d362ee935a588c61daab27a0ac4f81100e68663c849e0f89e85039def13970094d8f9828acfa45492d50a62f3397db0d06e4834df916d6463efa911faf87aa58ae8dbf7a108e57cb470238b870f109a43202a21f085e12fb3961b7ed7b857da9f481eb140a1109cfad61edaacc9779fc3df9a70e87e67834a1e8d6544d8466b463aea4ad680b3b0942c22dfa02f487544076908bde082711b005132d5eac7d5a2d07a16515dc9057cfd98b02e4fa071b8c9f7c3b789ccaa96f0307c4eb727caa7a88e5f38a58e0949cc9894076b63a4df18515dc2b06f4c789d0c8592ef1163d1b6cc5f95e0be0c0f5673aeea38c6fdb0010b77863d48b466700e25975960f6838c1717d6f03b309ac80e29d6819f45e2486cd709193f04e1ad1283d39e9371ebdac5c72dcf54778d48865a099781eb9c043763ce5f58f02eed11f42151083e8baeca35b3d08b5c02973e368bbaedac239b61d63432babfedd4259c2ad3154b499076739e006f54d41a4fb82b3f02afe9610e567912c6d3f18008bcd19bc02690074c3c9cc1d73b107d7a40abfcace018ab8e1914dcd076823f712a345f870546bb624ba71629cd2fc908c2ad109c1c43125507efd732bffd97bc7e2b782722769d682123342061795f0f11f4cf13d18272fa45db93009369889ee210ff2c091724d2389ab3aa1bce74c22b50996997d20446d922d497c2fe38bac679ce1644111114c127aab1a3a3593b15a16aff36e9f12de425a800442e5c7c220f3099f3e0609bc3a5363114bea908dfbefdb2789e71641f7299e32153371631aff063a7a3081ae44de06131218286929e7e11c95e7ec8ce86b1c4361e044e07b517e6d224c85f2c68dbbbab0bcd230bd5038842ec31ad0e28c36f6e1c802e013b98ccd471af9eb14912eddc99839f814b4c9e58d59545c20c4f36232fac07b5c0db3b8393aa28da48c581197a94d7e22cb1827e2d33368257da6d9da04ceeb699a8b0a4a050dc2b0d4d619defb9f472c273889c2f44873e5aba68f372365883deb7641dd576807ca6778eed070dff6e1dc16b915f6715f931282e8aa6b1105432f5a9c1a03b3e05133b41c5e067733947b699257b4f97d59bca95fc113409763bb5eb2f6f70d94827cd9e0fc71dde2ed4a270d998c944390536dc943da8920df314681845a4fa8f1d1e300f0166fe8bff529f61dc57e241c74ff17dcf19864d5e99238f4db39307240090e4552aaa8573096ea7eeb275c0e878cf5914b1886ecd5a2d2b53cf674d46376c12427db66d5e540f350e94df5080737d2c52140bd2930b1e9edbb46f88113c133503da547110dedc47e019f792e37d7e67cfc0e142dc4a84fd8dde008fc365367ab23a60181c17f32ebb0fca60c70870d1a6fc5450b5c9bdac2c355bc31c147bb3c8e16896e1d10e38f1157df3f2ba01fd26d9aa590a3077ca3fc1dd330189a1830105293466c9184f2b03f5f2af9084fa54c9cc19649021099e4b5381b36a026ac49e5ae3eb891432c355c6afaed37d326f21209ed0d23b537d11971103ddf60ce8084e594ef54e88c7709929aaba0baf47e058dddd99a384a5b257d4548dea40e4911c4d2dc6cd48bb91762dd92a35d390a8ac698924f0a5cf0357175ee2fd0e19175393bce3581a4ea88ace681eba6d821d89270a827e9dee8f40cb4f4e8bddf82fc50e18ffac78d28177213b282074c3d88390b58f07c96ecee28e259a3a6cab4100a1e01168f062b39cb4851fb441237ae47a99cac6dc220094b7fa7ee246ac285f838ad409fcad21cb1a6989f8f83529e4f9cf3de7a46543284c0b19c91d83509635126057c8bbe45d6225e6e3c85b03b7c55dc0798c37d61576d30a849ce2883b36ca650d40860433575e71e5fc0ada8a96d319ca493ce52d0a40f8bc22c924997781f65ed0624bfa4526f99874bb53a9bd4b33d99312a94d577e807dfb712930fdd244147817c4fdd8c0e97789a8c605148c44502d77b6eaba9b7715455da111d04656ed058e6dfb6f41ad6f8b439a11b249bf667743b64a2addd233dceebcc7b479d9d2cbc31095ece4996acd20005bffe921d4b6cf2bce3df4bfef40dfa715cdb94c8768c41289d55996e3006267800453fddd62437957f6871c172190d665bf6839e61a1cd433e031afaa8267541bae1dc0bea1c919ac346919d21f02268355334b00541592444932551606f06426ab51a8de684c37d86cb66f82ac78eada9fe0b5d38d36d29956a723c5f2aeab2e74c24134742cf32e10e217a35eb25dfe8e5f831c678b806a025a02d61a789160a0e90eb7ae4185cb81268a00a39e99f73b5806c0ba71a41ca1984de7a47ba22dbc090eb03141c8d6dc439799f13ea685145cc04b48886b3178a49576897e83b4f6546f31bb42bfd88ea49a5419e091b1b3d68b53feefc5eebb277a102f61fce2596de4295136b457e3638dcadde4472e255451f288874a43b532138759e3c0213358f0030e96de06b0993592b9f857a20ad0c2e36e61b2e2641e6e9f790a0700f8c481206e5ffaf08a04380422a695346ce87f5bd5e3959e4c59256b471c89aee1b13228c8bbb60383c5259816edadbbad3a74e261934b7cc8c553dfd2450a86e41bcb98265d8bd8c7d17f8243fe97a6839ad53b0b0e148077940b8110a252867ddae5acb9d706ceba685f4f89ae650810ac69e232bc4dbd5c4cbf4d5c239b8085c22a5161f0ca2d50f280b45424d0c95320232c4968e0e61d4749fbe10574edd820f573e52762c717b29167906ee74e38e75a4731a2a3b573d3b0f49a0803445e83e18dc7f024135e738d04f639b63d5f6f76423e3a52e7faedc2583af751b96a19d9686adbec4929f35d3b06df83627f0dfa59e7fa9059a249c269cddc88089dc23f49281b9982819aa931540f1c872a2177f470eeaaa9e3b6cb583d03fd38ad8f981508f5bef3373440e37fad407e5c35bfae55f4e0fdfd3be488c1d6bb8eb091f17f26b81d6071b7c73ffdf3e84f4f42984d8a3b541b298163768223d5fbc6637f964f1608926c2536164084f404745ba0763cc94f70b3adf88fccfaf91387f83f97d78bf6f70015dec83da8049eb25a512105e2ff245159d8755d9f1b03ba1bb6299cb3c711e93c46ab3fdacdb78edc65ef4cfa18dd380ea3253ab7cc0481ac80859fb0ed05dd2c9e0962c0de70ca5c8738c37321d044907962b222d520776db5d93fc1eedeefca3c32db6833ded4fce0cf1d641f1edeb46dd95b2a2572df077ff0574691cc7bcee098eeef583cd151698221caaf7b10f56fbc1e2ea7d163471242efe253154f0105683526703ac0a49b206bf57833dc22ab45428bb455fb2a7f916f5c8c87a4a242eb4dde3c870178b0ef9f0b4a9dc56baefe159d7273783007c83399779c5d54a162244aeacb3945406c7c2621247969b501b65082460d00acde7755bc1af4ff466649e675c3d04621cc3977feddb125752370d24341357bf2a1a029d6c66294ae8dd3dfc00adc52478f46506234d03bfbfd8b04d99c664d80956cd2e2819305a9d77111c5addccd8926c0e1f42b7699458a153c5c240505511d917249c8883d896ade446c84023c1ee026725a6fe5cbd262a361be7a962e24204418b15c4fb2972f402694df1dc2b743ac94260664f6480b4d20f017d2e5ef6d58057eefbc51abf818071a922b11f9aa10210c505e323f42ac486d2451effda11b2220165a77e92aec734e21f0ead41fda44d8e213ed10f28d21dc078fbca40fdbc95bbc2983af95542f63ca4fd5240c166fb79a709694e5a585d48efe129956973adbf2f7c79814f365119973cfdadf952a2d4ec5c436dac56fdb0460a20521f220def94752d3229fdce4cbfa9f39e66fa9827102dfa6145e412d6ee6f25db229157f7d01cebc86651c7c54ae26ac92893664ecc3beb1ef9f936ffa5f659475b5f2e70fe66a9bcc968b025f2e9a0919f5ec215c5862224c89a80f59c55ad7a82872602dab3c5c7994829e414d74c544948a245b3557eba52bd74fe6f41f6707053e2bc2f79702efa9cd3ade7a7f71549f6de5ea08bb6afcf940cd538cd70809a0806c2f380047f94081adbd6d263df7a3c5571dceabf1029f66fc60845ab1a01bb0949d8c93e281f8649db25c6b9bf88aa9d783b5aacc46c9349f8c78b8c2c8b1269a2f8b06e6abf7ce49b7b1aa56fa069c59f5b43412a0aae13a26b6f69d0c5d63ba6e4042950964a85055ac7b60359587fe9c4f3b1929437bab9066f55d7597145afdca2f987c75286122aa650e8d05566494c1a2beade28177d6a2871cf0eee2c746aa9e774c298a5eb08ad6eae3d5566e07c1e98f8c9d1acace6764261d0cdb950a28958a73d72e4264766d9f3bbcb6608ed97684e79a982d36bf2d1e8bf0b7fa659423f698d93e05f180c2607449c0e344fb047d4387aeec58d965ee86c3178f25855d21be557a4f489ece4c8510816638ee1081c007079bc70b2c4b39273f54ea4272df003e4bb18dd4d135e0600e823296faa3647a9c133f01c245d37cf21887ca3f2062bb15370562ca597a725d9c70757b62f024a31fbd63d01ef85220ce9aa129e8e689b14159a5f65a1a822b0621bb545c398c2ab4d549535eb539d78613edf94a73b723695c8f53534d5137a55b606ea1aef64d5f73535912397e0f815a776acf6e58a3bd72725c064983b3aba18efdb131584623489d80afde0ba4d3d9869727702fd623e4e175052a972796a7cd6fd76223dd97c68249392f1d47c3570b9e1004222dd0dac69bd5b086cb83c2f0280f14e65afcb21d97e088c17738360c69484cc7c9f4d4670d365862cc4a34c1323eb0f7fbc34b4ff21ae8a6fbab55789561c63dd58993f62f6f869b3a098dc7f86ee56253e5e808c87d22e0de9785eff4cae4c6230a87f51305773aef1bdcc795798a0e13b59022ac2bfd0d57c06e791dc9d3d21614834bac04c329860ebd70ed13cc5a38a8d4c5b8ddb73d93e172dceebbca9dbc46c69cef58039f8dca9d3886d498e6b3c0580193cd55591a519ccc3e04ccf8199615dc66669a4195297dd316e2cd90e732014b7b77ffe3b35f570d5a4cf4307516cb99aaf4db081c04c4915a7a6b07090538fc47d048023c6a2ac5a9ba4140b7c1a622fb68ab41a0ce7c0be4105d0a9668cf9b7a76bc15ba92167f82004d02bab453b0c3f80b1436052107b521134748f70310a9afdd5cea95c10ab8ac5083d2f8501f3197cd261272905979b74fe927ea78ab11b938450f3038a446b231b5c1f43e92a247e0f3ba76e4241ed982d850ff4746afb0ba271691fc6c7d8630ced105b5d0347e35a8b4c4ae4db8a63cffce4059a2fad7464f803875118f4e9e163538c3b7c3a502df9ec0121207abdbb87afe7caaac53d6c209a7e7dcc2be9dd6e1651d8aa6e82af27684cf496a48c043a0f8e2506cba568922493dfa434559e54240ff776b09d19b8598e69d8a0315d080bd2a19b2bda21afa83ead68d1594561544945868ae97078bd8c1e885d29724e1f7c020c73030d8da0fcb18d7a8f30d4cb4c5e3526ad62de88a75a010502b2d90d040eb7d1959186c55d3acdc95998d0b9887f493f9534c31571acbbba7bc4048790b3e4010d8ac51f5d9339729d49897a376e167cdc116fe3f206131e8eb30e97d5df87f8d1cd560a477c653d068c1f9416ab61abb971a1865af4ec5b09218841caf5625c88879322f7af100ba6b8247919b2d88fe800f1ff37846b24c6190003f2112acdbbd1178c3d193e6f7558a128ab73620f4336b0c80b430a2b68d582ad1a8880a3b8197441501c612eb08ca05103ad39f1a97895aab068485e9e36343cdeafc18441907f5297c347f1f8de6094cb60767ef469e57098f89408038d12e4ce9ec5ef992234021260177ecb2e534758865a0e4d9fad31a43e6a0690e4623c33653b7beb402806862c509acdd65b1fca143f28afae5acab4750fe76e59f064b87b6409b06241788229b823825bd033bed6c53f6b1d1e1b9b29eba30837771ba05ad52ba026fdb30cc674b33ce6af96d894dcc7d5809a0a36d02ab6303f01a340632fd516b806546f1028ddd6966ac3b76b6543c89a74e6438bffa52871c7a9a2d7f7fbab7f156396ced9ea7086ed3fa96ad683970d6fc3faa9ff8530d5f9ea7387b1cf8dd2cceca0acac0c7621f2e01491861605ef5e85e4ac8689e8f73d9083d3a620410579650ef317232320375e5b7ce6031274bc09427b8beb17b1901254d340baf0f8324eda1b36047a5a91e6fe923357044638c47c0d87959c9f4a22d11d1b1ad95b9fea7e65a6f6bd46da69d29b2c231418764520c64f4a34b32eb9bdf3b4c2097c21245c5b1b2200bd43bc53551be40bc64f774c486c9859768792947b865088c90afe182c7cd360854108339cc05f44db32a59eeaa49a971fe2994600991f418970f63de3e84723007200ee893ff2f00547bf22f8f263ff1c7a227d688b7e9e30b77d5928b1e9200bb1f1f8910dc89972097cec87f7d525d18ed31ccc70a768a4440f1deaea7fb1a13b25f1bf6dbee89fa93fbe0e20dc604d4726c19ab94a131783963b530feddce355f81d72535bbb841510357d6e9918510d565af3779c6c53ef8c91f53fb9dc6d0005e3e84168ce8ccd9957022d5ad9b781ca654c360fd160499113aa46eb8073621765ed841d1132810ef4f9b6f8b174aed7e3c94fafb05a724cad8d2449f214a248ecaee69394d9b29f27408db284c5cd88c50bca6678c5dae7e8c5d92be2b0832e713414ba9403f54184523ca6b602791c129dfdd092774251f2141b0dc8dfb9b4cce65c69017c0ff419fdde97f6a981f5c00f4416565bb28cf8aead4b3a1b1d43aecb94e35a6b75e94f98b59589fea14b5fd2d1d9eb72f36a2dc85a85718760e48d199251f456068fd984ecf3d533bf6bbf0f1e64d2a5d6a39be3d41155f673f03a170b59265ffd2fcc5159a8e5252dd3617665ac9c1f2b58341ac65a066a0d1b796a8d59102c53dd45b11c0e80e7d7471e3a4b51c9c2e3210e1212ded8a0a125f438c600c5a031052218bc6b17d83cd7562fed537725d58e69400eb413a7154bc22028c7a6218f01a5d98a0680787d1ec1f2f48e96d311a52c497eda3652fac13a93d9df4bb26bfc2ddfc02751e9ec418a30e32219768414af2420543bc99602df574b4eb8977e7354408e8cbf4b8345c8d8d32869aeefbb57a47bca929f9ae6310aa2d4843ad83e67c802656af922dc7bd546fdf4cd632edac8c298e4424aa938a4d374b1f80e4c9a41aab2539694335ab41032d650cdb1571be7939571763c4338a8af20b9411bf70b17abd7beaca3041ec84f284dba32d2315e76d61a5222d303cd1fec0b686d960d5d2a7562b4e6a00c45bffe4aee6c0f8d8fcd4032502a0f6125df3444d1253bdf3c3ae1669050b43cb7a7e7e9ef74cac5d5bab311d77a0a3c7a42404fe0b43b32fe5dc59146ae565414b3a92ce41bcd8645896c41cb67fc0db55b647029f3f78a52d1de312112325cf6d40062bc7b287e6b85e377a9153ad72328a84cab86dff10875b80e7964952cfd8e0ce9a493626a969a2fb7d06cbe165db2011c2de2b050e5a974253baec2d567c138dfe8af01c22d2a2c6d811bb8ba219ee985e37b74a6c20073497974747ec59c36700f0d4ad77026d283106de1d021ca879160e66ebb211e5ff088c7edfdbedb93e0d4ffe9f1b94f196227fae8e80ab5aa51da44f8c11e9e9dce45721f8d116ab4647ce13da1c55ff43b13be34dc78f818660f1bc73574026520d865794e81ae0ac5de9009d4ee09a897bec3fb55270fbdbde52f5796f05e84ddaa0fdabdf3ffd720d1c7409c3a6b41fba240cadd070aaa057f3210f2b5e627cd14ace510cfddee9fd6b97dbc6dad6d9270c9d6b259350023495a5b4b877f04b69e36d9f7fc5fc535fb7ba078fd032627447045afea3056097391f60739106e9d37b98d4fa326264f78fe1e3a57eebda44cbd9b6c7644986e1b00fce1e771d2c47e3de63d21e7df36521756e1c234063ef8b03cf78575a103befe90f5e4783d56206be9271b527b865b0470c0bf54d8d5430035ff605401d8ba6fc1ba925fa4f2d88b4f0fb2dfeeeac085436d58bc4699d95bcadbd02792134640b95fc9cf779d27f141557f9b3873a5ea5511a9803ebe2a678f05dcb9ea2ca3fe622f2850422f78785c7164d5cb6cd67fa9f94237bf7e533b409412287723b0a93580d1abbc52976648b360c99d5a522c7768818c9655674a8bc957588ca11b538d991fd158b4e653713f1691d862cb91ff803047e7a43d659adaa7eb7b663331257d65247ae2ccf292492ad2da0c6dba5b20e15e08d83cd3a7d1d1a4666ba2dbb51cc56e88c6a882322916e3c46017237256a0459da06cf082bf6f45e57fe68536a5e7fec558285e4a0ba9327d551deac6b06bfbd3dcfa75cfe26cbba403c243989fe7ba5d1f237bb7644767e5d3df8ec9722e93a6c7be47d80cd88f4100ad8eb9d721e5c7b64a598c84a540a60d6c2b3b3c8eff53135a57784627259cede46aa3a4b07502e95e4ee9a76a2e0f7f6676981ce91560b8c4b64e47104a7c96d781b5cb319b33cc4fb6087122cd08382a08093619728073654edc19fb4cccf7655e9989504abc77fcbac9095af27a17fb0ed563e78e7ce81c1e7f4d4e5eb8fccba72f1bca241706d5173e2b9db9faf92a43bba9309ef0c9ea0475bebc04952b52c47f770b24914f55c0bf9f0216cef75566e50a65e7223228b1c413b9af22fa2fd7a09ef755ecb158c1f0c7af225945e9cc07fc2a76ea55a04a821e10b702d41971c7ba6ec4f954f45873a0c8585568c229ac200790302ea21208246d07e94cd32ad45ab3ff597b7b7df7ef9ec85a480e9fae196b6bcd531e793d4ee7e8813c627855e75d67bed75a651d819b219b6add6271b43176935d2a047c8abe4765cf891944bdf0fc91a00d26da3fb10f67de6a37f8bcc3374f7e47ae4eec2684b8ad55833bc8f0dee9a131259c4a5b276cd10b9893119492a047ba3c5ed3ace569c37734e341eb82b1349d9510096d5c07b735bd9ec54ab4df63c726030e29d479df0e1e2da1b26665065ddc782ad053157937f4ad0774bdddcf035a505fe9c62e64f32e38aa1d47587b89b89b362d754b67f6d3844a607f94aba8c75189f661b05422c40f0c9f843ce2f86327573f279f7720815be8a2d2eff4e7d14481f206c25dbc8fda1309f30bfc13a8db84910c2fe6a7ca22af0f009964624fc337c8a091eab88132f4b3321ea273411f239004912bfff746d2ec2b956489c843466dee9224eaf1929899e2da0ab937c608dcc07eabfae6fb85ec913c34ffdfae2876edc7db46ca6d74cbbe36d087db90fec8e31a7441f7370165e550ece46d65ef203d0ec4b341d71fdc5ae940cbbe11aae62f90697ec72795218ab0b8ad4af9c8c3ae3d8b4088ecd9442b136850f46c3de7d74e36ff4f5b6a10c2e619d89a5e8a4a0f77d699ae5e2815428c2f6f563425b60248085af28c4faf51ef8ae456c5292b50a0f87b54b80b9e304aaebf6697be2b66f58a9a768f8ddda3d17f521110da5c28e5241ac651352184faf6de8e93521062bc31d6ba7f56070f8b1f9b70ebac82312cf15c48072ad08a7d9887d3a810c78c86dd63b1f551e1776af65de0bcc4bdb031bc8f6e668839c3c955d830c56f8877a4f068d1367d27cf54c6f17bb927176d0d9a21be63db5da68d8721e0a104fb6b3d3ce73ca4d80224fb4b6d0b2728736f985b234e70d4480ab8ecd9ed2d994ef2e9da60aa30d25cab1af88ee8a467c966a71e8d87b81ae29ffa3ce5739358dfb7c2e60cb6fa97d9e0e4a7bead943b2b5458797c557e593e133b0c06b32fe713846527b81e1b5d9541eb0aeb0c69bd1057b56db1deb5931747b79da001f6b11983a6773660c43bb001e89f16b588ae6ce2a2e04729da87bd7747a0aa8bbe8f3f28f658b8845fc09c6bbd6c845c08af35d0515d66f07aca39aaab8d6ba88a2d92e484a2c4ebfa01437ad5315ea50cbd7be3770ecf4afa8134d6decddff2660e7413d24b09f40fd0c001a01bc00df0ee7d3fd04c44972744d66bc309553e2bc9618efbb51925d89f8be04ff0d8424c3bd51395ee24306a87e903233412f11beb78c60755862be26a3660e44125a6cefaeb4735f2ab30980bbb0767574f178a0b31efc783631ca8a4164052204b0a74178ce11a50912e581638eb18c8c0c15095c2915302bc0cbc9671c0aeedc728bd01648cee0f03a1e3d0b3fd21de2ece83616d3d86f92bb971f79a490c9a12dbc003c1e02b52185257062d8bf7550913f86cd3cfb592ee282c2ed71f141494c73b4fb49c3b0b63d18ff46a0636225481398b872d6c8c250e90913c91226344b94e11379e3530370616b54e1b8aa502f0a12fba7533c9e7fa854a63830e840b43241030559f412fdd2f9afd309aec859aa845f3640c0b810a38fca92b852a4682f6a4b07f0fbfcaa52e2e1e3dc66f81acd406d59e9c45fe2e961ede3ba82035fa439ebae810e57ec23533862cdae1cd03a8f3f106bd4ffcb24e1ce1d69ab1a68ef177f50bc59ff62f9b1d26b940030c9dbb1483e8056abe89640621f55cad3591e0190a8eac0080e5f1518e1a18f60c9b2504658ddc9e5ecf5dc6c6d6340c828326e16984103f6a00450b7ed289b58bf4c6b240aee2b8d887db4f415bd298efd19102062bc6c807e0f74b211f1910ab795e0602195f4d462162dc90297e07fc3b39f2c506a9639f083746820d143e6ba0cc7a5cfd9604dde35e7b4d48cf751066663f96d2533769510fb7de444b42ed1d4eca9317c2312682498f76a0c7b4ad8833ef8785ce249352a2d9b4ee585566c902ace00975219f332e671b4c205c2f5b47a4fff707612e1834e068f010d4f102692b815d7f64464c62de47385f7be8a7b6dbb1156449381b4728e8e8d7bd49061aab1402ea1b0418721968e62f314e66f2df2481bf7ea042d765df79f80e3fb264dfbc401407199c1d203c08e5fa7c5cd06bb76232eb3ca6db357850739fd82cc53806848021a4bc70be04083969502f2fe636b28a79e37de672b64020fdc28e0043547c4bc33de3dc019aaeafbec08da0d8196c6d83385493d6b0b3ecdfc2eb11b829923e75e8ab06c207d5b71e960e9f9917adbc1ae265eba1e535051117aa439c41952068244bef40f129030501c132c0452dbca3dd9093a7effa9891fb3a6775f5cc1f2fff03c7f9cd4473bf69937b7023f80efc9daca5b822b208cb0be24d026d9b51dc283e5fbf12ecfa6e25305e7b2a2b4710f968c38359540d2e3b8881da805d5eeff5d631e16e06f0b7aae652aaa975de9e391e66ee28c459e61ae428dced98c42d4470780b1850cfa1eda72740613474f7f6c8dbbb39d9e1a89c2fc0d242dd01eb961d227795bd36628a005e183884322da459cd7e228910dbd0e6ff565be0f6da2a51d457d69be1b33930cc7bc3b90e82eba909ca6d2eec31afa9a41a57fd84bed391be814a22c7928955f9995640e2658f5de554ae26d87dc43f7b3e8379cd674313c61d9c00b259b6a2a3a1161c26b895086f9470374620bc2ed13ccb083e0203226497f8f82b48ad69e83e730b315d6355a05e7e3fde5833c994a0dbd1002f1f9f20dd6bbd3e53e1bc052ab027d0c0aea7b96d0b61e72a46f091139a429daa81e88377de936ce7d9680047d9552c6711a3896218ae1f45c00e8a3113debe203f19bdef0bfedc77eb3de9cd73ebd02efd7631bbde675d5abc779a55160bb1d6bc71bd0607226f3f55bb98928ca8e3c0d02f6f32fdb6c67512a925365813c280fadd0af7671fb476aea4a7d00b51bdf6be20ddce124f25f0c907322ba1fe5a3efe6df310a334f2b83575315452f0c28aae9b4a4fdb78086536f8ea489250bd0e97ac45243d9d3eb34b3986455b4a681ef9c267e20976981c5a7e9696ea0e771df16feeb3c37335fc6be3938e34100c1f5a7969fbda85dc79ae381819bd238fe3f0ad10e95abf1ca9a2fdb5021c5773a857587171fb5d06c74db6883c6c4abdcddbcc0df12b667ee127fbc94de140546299a262154f688fdd217e91ebad781dea3858967091cfb45052fc96e79b9ecfb4907596a513ac32f3b5bbaddb650f70600e0f1dc9abfcf446d503d71662a5ef90bb9ca02ad82b1ec1074cfa05d6fc99be12b5490b56a66a63f8e1f82c17801990657f96b96293bd767d8297edb5717078619fc9345c717333c70ea9d72bf080455f013a1f41bb27eea2f64254e44debbbcdd2a6249487952c1fba805c37f23bbcd8c77cd01fc96ec8ed8e7c875e7f8b96426dadb38ebb6fd7aebe57fdee1cc2d5735e60afc6e44f64c7396fe5b5a8ea97a4088b62174e2dd6eb3b8c0ce46d8444d198a9a1b7ed3679b1ac0716be6452f1cfb9b798c66ec0f60704ee5de0f4021372e3fc19e215e38da5583bf077c1e14d99e41163fd582513ee41fa682665638df1b2e7fa89db9eed057253fd797ae3f88ab26ff7a61717dfd4de4dedc2226407df3333570bd1d1b02cc8f4d7a24c35f357d935cae15ca6adc39cfd4af70fa00dbae18aa2c8994629626c4591309a5ae462f286f2455c78f5bcb4d1e0c9e80f3ce6242386bd4d6fff922166341d51b1332a657af519fedb8413c362c5ffd7abddfdb97c35f78fa58627c86ee9402fb9cc704fae816f70b243fa33d5c4f52a7059fc6c3ed73708493536a9b604e5dfb86c1421bd233984486aa347561130894ee73e4f94e5b4afd8577cd0d80a9d40c99f615d969b3d394ceb10cce29610e3dfa7d7a5a9dcbb4b64ba27443e840b015506ddc36428b674490a971a14707263ab8675e1dd19ff3d3ed15e889ed4612f36895a0ab049d7ca934b6f242acd20b03f9234f26a430e7772cbf560cf7db14de9d7037c38334d084e794983cd0cf3c743cb7f75cb103939b2a3fa255843e6be1ed13069c7255d14c481f78971416c2d48a437fa84ce0fac949339bb1aee4398021f6046d929e4dab95fa6418117f56e53afb07b92b8698dae995ee1607ea802702fe1070a826883e1bb9070567e1d06deb4529f2cd81cd35e2e52cc2d298eb9821b22465211ccc1dbd3b69ec89b08023387f8d75962b11148234791f01199d943d86c25a5d86cec8eca2fa93a0130a831f473fab960600ce58cf95c1fcc5a5d9429a8c24ef988a96858dfca9b548b1057147a4cfcefcb79e1923ee423ff37169d0a13c7cadf30c980fc12256ec759beee4b4a986b9c27b72a44a8ea867512212734da3d1c8963582fa2dd3a7dc6b59115fd18e035b149c04a54db03daaff68e5a20ccc29a0e75fbf31e1222d880cd51dc9fa684dc10d4a1ede1375973c25dd702748e775300b6da6604fbc4868ae1a7661ddf0238f0dbe4e3af96af43c7a4e085eb78e70aff1fa551d86b4e0c0ceefa65db7b77db724b29939432d408bc08cb08322c1165043332515d11db7dabb952c5098733b4a4ec40ad9d168e6a84eb7d6d46d8720e0a74adb5d65a6badb5d65a6badb5d65a6ba5456acc504da922320bc644d3244af38e2a7a3a19213342d6615809a4a4aed5314353d377efe18f9cb3e8eea71395a5ee73ce9f7f481da9cc48fcd538bdd136a1b428932a40c5585f5dad7758ab633d0d23409562ac7fd2153e8d89a4111a13bfd30ebb1f8e3f26835f14296e209f055ff4fda2bba7db7b2abb7f83bc91167523bd9f7198404f272ab32d8eae57acc761f77f8c7e30cf28a72c654ca0518ff510b9898a6c971923d12118f708dd51dd2fa432127dade89ebe34b1e1b834e51e6c379b6da8032009b0cd76f9baabd966b00788aac2351d68f02ba40e70059596613606c90527295a649b518f4f10075ff3b4204349df2afc4293a95de66dd3ac3d9d9a8021d3644b1158ec5b8d3d9d908e7ef67dad6cbdc3d75eebeeb57aadd7663ac519a8e7cdd0ebbadbe19cafe7d9d5cafbecfc3cb076b8c666d69d9eaee79c9ead5e105f3927adb5babbd53d2f87cdb7512cf55aa5b85dd0ea96e639e7a43196e3a657b4936776295f7b7eed6e16eede842f09f085c2dd9bdcbd095f12e09b67ee7630746d8f3bbdaeeb7c07be1ce8963dd7de2f4ff75c9996cdd9466b371282870d6ebac494a29b2959dcd0946ed874690bbb4411b923e2cbae5db60ffa35577fc4a75fcdb03c4f6a9bcaa1008923a618c3c51a21623ca099aaa20433e84046acac4a15aa466dcac2d92c22ac6c16139bc57a5d44d166bd18fe60b5c40fc31f623884173b7c30fc11662c4e4344995c667bf55ef86365c9eda9f1328d2399ed7e4e6982975ca14286268b619b288408226b2cfe794c10306cd7ee026e5ba34dc4a220954613e504181e10501460d7bf75669f58f2596badb5567300c40c9507cdeb98d991f318db5a98534d4b4f135f7e307ffa13dac130ee96ea275a7b3cd080634944e52731dc9895a92ef79c41b2596750df6eb80b247e45d31d53af98592f47340a4bd416edb483963163b054d8dc65d60a9082d4752b7cadf7f4f80471e0f4434e4c8ad2e09e4e348c609799890460ac214194027e98aa5937216287d1f27d140323bd85a69fe6cb5bc1dd755dd500b83169c21d4b8cb7bbc5e18ff91f06edd881762cbdedb58e2f2eb457ad0768577197efb51d78ab5cf8dbfdfdf2c501e7e0e04d1e987d8b6d0687f0dca6eeb762d002d12a5a8524bffd4965b46ac6726ea05579f274dfbd7b204fbf9ecb59a8520f69441f92087f48b2690efd493b4a2b67d5a6b2dd6de93a9d9ddd69d95df7b95b72b2bb2532bb6392b23b26355d0f10558ae1bfe10fec43927d65b6460f5218069a92125cd6463c529c2693c994dc701c4f1c6cc7b279ec726ee1816afb5bff0ce5caf6d72d2862b6ff2b316dff5714d9f6ef89f2b4fd8372d8fe43eed40311dbfd2794951d401ab3b63af17084d4ae8fb56729d35d9d9b8f2ab395cd5403132cd9f5eb0da7262e20a1008b2066f0c0243d393303539918dcbd1b020b1277f70f4c8daa3e5284916b820a3282202256eaed56342d0dd18509a06c42c47437254b92ed3cb4984faaec1aea505f57870717f7feff4efdc1d47364917f0407ca99dd1f62420ab4a875b4ef94eab6d1beb37ddfcb5dd074d281ccbecf41fd9928d8f771dcffbcebbaae52327f23d49fb208fd6a1802bef7872af879b9ca6c77f4deb00cda41f7ef972f16241b5fa35d4ea84d13c2a98f596bf51db2a62e94aa766bda25dd12e29c7290da2575cac1b64bead4ccad9bfe077553fafbbb209ee1365380cd9fa96952fd0102d69132a148f595545f7e5f58e826cff13bbe7ce9b87df93b5e07991d0749de20a991d31945f22792e566fba7e0404431a2587d3afa76cf41a26fd4877f0afeeeeeeeeeeeee1e000a34298cf5394e6b3cb6e8262009a8e5ec8273b3d17abaa5fee496ab076dbffecfc0b979fd2e1c4f6f3c7d6aab40441ce64f6fb4e9a3142aa4748a4ea1365a64a99fd025a01a24254b2dd5a27a333d39246d7258de39de67dc6432c7d8dd27e23f83b4714d06edae67772f7ae79f77bf225d238d95d4b62f937d9f26d12774c971dcbaecfbfe408e827aee97af5dd25b49a3a85a525a8cb7ee1d67ecc648ab1c76492a429dd5a839603eeb23d38ffbf492509bc688a80a5e89322583a5d645d3ff28add531b602bbb54af7def007eb3f8c71d7513d79329829a6947a5ef8035c853f30d62d100443d0022974799536fd501445960e7f68cdd262a86d6cb4d65ae36b43a4fb0b47babf6fa4fbd323dd9f08b2c2133e2b516b7691f9748b6108ad1bde54a72a207fbe238d9f66bee6fb92f953ab666a64f32b55057259911b55a087aa62c01ff1e7d72947dad9debbf0b11c3f5fa702dd9bc3ea0dfcdf0776e007ae40d64877063dd63831fe8169e4d0fde110ad8f2d03c8dc00d713bb55f8e55cebe38c2f4a91cf9a8a7cb66c0faf3a3162c829d8bb4b517cd8f433c963810ecb8685c3860e6dc74c87b66386937bd4bc118a057f47283a51bbecd1a3c74e8f1eb61eb5273958c0638987d2998b65b5295454817ac4889192a2a232c34389c6eec89eaa1b331ab22c9bcd764983064823fc817f65b78e1aad63dc51a24d9e4a951b5739f80c1c7b4ce911e5e1db0131f1b9f9dca42a95cfcde7e645bb84f9dcfc6897b08e049ab172f66a56ee6b843fc0aff15fce495074fc50c5b5a85c41928fe10da85df2806ac2f150e251b3b56cb5251f259f221f239fa3fa9a55d9d5878a0f1330ec01d5c3e63d6a3d6e3d9a7a6ce9d1e5ebf26541f6ada44212247d04c7efc61da4c953ff8f8ca2a4a6a8eaab7e8eb1dc49dad5899922352d9ad2d294d59c3d3efbf8252199a952b323db296272d4a4e4b0fa3a6ab62a58be0dbac81554304ecfebec48710549bae280e9187790680e9b4d9e6a54248312132535555f3b46a38fe5007796cc0ca8ccc068b027b0a51cdd2a83dc0e2d0333301a8c06a3c168305a267d642b1e4b1548c7cd3c38ad5fe56b016841f8e3beeb09eda3dd3fee20ed30d9994d5199a9aaaf0cd4ec1cf96ca7e806a3390ca604abc1a6c0aa806406b90dbac8f598528174d41f9cd3e57cf47dc9df31fadc1c563f87cf962ebb861eecd899f469c2429717e7435e9cd3bf4dd9f6c5793ed67d472801760a55408ebf43470e1cae1b365a357268e0dcccb0d12c3104bf95973b7cadd728727b7ad0e95450c512041590a38b65087e870e2b964674e4c0e1ba71c5f208164b153af1ebb228c69e25d012687df7c76056ded3f748234c74f51ee9ca46bc278ab9f2834f147357fe5e48f87de2836f248c85368b21c53910359a64d9a2463de3f43905c4ff81384962f2d2a439e7caeba0befcad514e944c265b610a6d3baeca766a44697489d6a88dde2854fd292796ed1437d4410ed79514171ce9fbf8cbdc813ba577ce69a9b5f30677a388da4ec34eaadd65547c53c7e581b881ecd7d6f182ae3b7cef4700ffa3ab11c86b53ef57ae0578ffbd10efbfaf47560f7e381e61aaa490fae047ba2a1924ac1688c3ec83631087d9ffc6b1064d95c857b6b909dbbfa4105ba780a062a9082590f82217ab4fc3ba1a33ad95d6b74d34176402241499dad6d26a2d68ade4696b1d1a9b47f88638908b3ea52bf0bf37e2c5bc5f3d510cf446d0751cc51bb4f7aba02904810d265004a617db6ae1c41ca3c40893c7be4f7dadbc9e111ca8551b62022dda627b7c7a7c6867a36d6b23436d2887d99b93da36876d7f6565d7ccadba6a565553a8be45bab76f26c554b32d6e25c627dbd668db10042b584921e2830f9246c0173154fd1163c18b6f858ab2f6ef0d577f2e547d49317f2e15f365df92d6896dff62908a1c94bd25c85463b7fab49245eac67a539c4d2d48eb78b32906691d5db8cb601dc14d3db08e333675ddfb38bbfbef03ebb8da1404e904bf708ae2353379ecdf30e68efd3a869bded156724e1e7b73e0cff059ef00f141f208f8e2b3c8234c42c01749d711f143d25567ece21c8ef6e67298a4e078c551bff66b0a5d2f268f7dfbb00974bfa049b6c52c6cfbe506778c6dbfecb16d4ea7be6ce80261d74a7e7dd99bbbb7fecd39d08d5b651f273d99d9163fd996c9b648988695b6fd5be9973adbdad7f9689a8b6fea945f2df47627fed45b1cb191c3ee06b39d6dec0b06c0c99c1477b80bc0135d62d96aee8a547f6ad250fd1267cf79bf04418d43492c1b81beefb86804c912e3ec12cbb0ec8218f47d2cc3e37c3a41d5fe30d8dda9f1528d37773f1c6fd50d1f6274896566be5c01b1efaf6a53a8fe5dddc7325c547fbc3faa3f4653087f17e7301a16f368dfa82fc92ebf59f9218553fcf085881f862f92656689cf228962949cba54e2d3cf13cc159b4695b476a3b6da145aa5fee4a7bf81d10631501ff407dd60e6818e7da7ea4feeaad917cbee54bd58cc9f5b664e7c1f0c184bdb3d3ef996993f73de169d2ffab703e9a89dec2f8374c4316a617f1e58b5bf1548c71b32fbfb403cbaf0cf271154d9f3490465361d5d983cc1cb906d7f0df6cffec02aa6dce809a49caa38da943cc1c8e640ce2e224a0166d99f06e9386388fdd9807874753f9f90e4b0bba7a3ab7b9c9dff9b01d271d5647713678a62fd70e3713e2151b2bb114af839c4469804495c545f57d4414f272ffe063568a88a491aa73585f00a93e7fe7d1b1308b34061f7af0d1bbb922596c186c230596225fbb6f6954d9efb6292d6f575c570c4b8c3ff652ccb58e64038b011134cab3f77dfc74b514cd9b7c453f6c5b27d31d2beb8aa5de227fbde2f716d5f6cdbf773876df5e7de6b05dc495c3cd20775fda97f1fa7fef87fb59b22eebcd7b2a27052704e507451eaeab5930bd47623b63b41419b4fdf01f52979847ea55f8fd4ff48d7cf1838664d8203b93c7f220ee4f24807801f7ebffa7045babc23ab074997179b636b7ced3fa7be7135f6883968ba6b57b392afd26a67684bfbeeee42e66da87ab6d2faf3ebdf5a69add59b3c146356f96dff6f86770b01a1eddbd083d7be7f6bfbc35e2f9d188b2e10f0c65f3726cb07ec4b7e9b061d463a01b65620dbda3df4b858f55ae55a16a8ac4e167ac82b3d81bbb5f9e9de9b1d46438b33dc597c5d475ea2ab42adae83e7eceeee4a78de3649116b9ca4d9220c1458ca0091f40210b32e4db1b2675b7b655b25b675a2b22d8f2d676653aa88920554cc3a31c132c66808a332c088596badadff5daf82249c0755238907358574f8b02decba7d0fd5228cf674d28245efe9a4e5c976da82dbd3694b6db7f674da826471c531d24cc9154849d702f4b35e887e16a9492336e47ca298fd4250b4218f301d211d607364066943466da24d6f689d2c2794991d8ad0ad59b3664df7de5876d9c748bf6b8dbea4ff161c1e628fbbe8ca4063e5aa458d57b594d12255df9d7a40d76cfa816f5d5f3860c8aff91e04089dcdd6f619459dbebbcc917c53a7874cfbcf1b63e81e138276aeaf7f1ddd33a5cb1935c40224d41f202370d0cd903eae63fc5d62e8ad63336d485b5f4d3b7b00becd7fa3cdb772ced7c0f95abf35d61873461ae3579174ad38630dab26cbd7fec2fa0efb6cc6cf8e45aecddb904f95282de44197bf71393b91a86d5b55dbd6a91b9c204d501f34469cf1666cda43480832c22740a702d178ff9d0a94f337dde78caff11d8643de90de6daaf56948da3cd1b61fb2f40fd53a126d5be46e16799ba01a84b6bec2909cdf371db4ff91b304371d729c5d7e39b1e8ba6a9ac9601081981898e492c8b7261ef20064482267450b0eb92f625dd7755ded3adc7d0d24ba6cb5c0a89034550605597820438d952c57ac22e0a4c995284aacc031117377f79e3274f9da3db854a22a5364c43039b303d20b9d65da5dd7755dd775b5ebae773edd7d8b290eb2761d7eb7dfe1aec3ddd8ca49a34b3def9206a460c9cc87334d922c9144134dd068001425502dec00831360bcdc20061326b8b202cd072498a0d59851454a1326baa8a108db1134b6d8a205aa32686a10a2ca9a2b49c0fc1005134f43100105092f4c7261a48ca6e88e5822089d19a868410baa24537039e2dfeb1527ed911df9aa313c63fe2d28364a5a9862885b9634606243bad97546ec4e092bbbfb0eea8fb83b1dba94a144aa488c24625dd775dd50d791b6c3b8eb7037963387871290c3852e7502a6d0cd422482335c64f9a1880526b6a0724341ce0c2ba2aed40003134a2871040736cc9ca850aa628b1d6e0d892438e84aed0733b42fb8f8709bb62a22083370932101e505882ec478323a798823a2b036700a96ec4065ea40ddee1a4c109fbdb703d588c5f8fead459470dfeeb9cbebf686f56b73dd1d768140b3d74b62aa41922eeb2e81fedc942cefbd25dcefb0bbe32f0163f283b92f69cb29e46848d03ae8fe4e66df28d029a400ba665b12a34037c598fa98f69ddec903d6a7fbf6f0b42482916d3f8770e9e75977a5f4f1ee403812c2fda7a5a21a7e40b4edc6395440477d85af8296ce0d2b1dee74f0d8417dd113e096844d2801a9c0f0311dad9e24f14ee0e4857c8224b3eecc0c984ac98d3ab25d8e7c08488b8911d4d6e32abb4b12ebbaaeeb3a2ad4759d98daeeac0e6ec1e26bbdeaec00f10df674a2c20b313d6c1b2adf7420cf6221450b1e4a9053051022c84256772802e389db6cba22e90b1c104f525aa05292c9625f680a8a25d1a67f69ac92ae42ad2ee549d39f3fe80fc779b552f47cdf96fa5069f8f2a2e9d310b2ed800edcaeba3e4ba902b16a2c9b055074a943564d0c3d59b45db26a33ccce5125d3f35935cbaad59fe9b44e179d64d558b54d9f65db4375a8eac0e1ecfbdb79eb0112df1fc814c2ef2f8ee1088ee3ebe43067507fe4f4e9c4ee8a588d16ac7ec276f7808c499dc9d3756fdf4a607fabd54d60dfb75d8749eb7374d23e511c0a76cea74395aee03d3ed5d65adf9fda6abdc77c6ddbe3b55a716d0e74bb3565edaff7c08a817d611800baa755cfdfdc403ba5ff690d3ed081563f7318fddc7d2b31b401bff12ed1a1077877e49de58f06a883630728c33175d8a864b7e580e095797b829b46e801de99cc636b0af1e0d9d919e4b8403653dad456d361c1c4edf80a3cf7d7e140079dbf46f8a3cb38bccf39c7b176203d661a5ec31db415805726f4fb085de61c16e0b8a0a56fd8684101400639b51d1a351e1e336c4a51966abfa32cd96a4b516cb525a570cc2b0d6c7a740f166d41c1c1b169611c1d00512b21394972d5b4e724498996e4448976932ee97d02082f6dc945f2beac3433e996205911ff50657267ee03662170003f409ead3f368342f93fd077c21f9d0674f25070f431effdb29557b7ee2f304297fed8bbef3bee59933d376f0e6e10e08bac88a9fbef439ff3de2e16f1bfd0af1f8ef6bbabe4b029b77db180e3955da32374796d3e433c85e7892eef942bdbd9dd7895c20f5edb0260e3f1ca6e5185d53ba5c39684ed02540380b6025d99d17641d11f061a5c60814e053c7876320000ec85414fae3e513e5a1b62d5af33beeaaf13d7ae4e7d4e12423f8bd1b5d65a83e8d10ffd1ca46ff476f354b7a67d165966912cf5b5d4d2d64863e0d0fcf93386501a0dea79cd2fa98caa35df8656396c929546b1eaf745cba9cb6c97383e2d1cfa4f57a8550e8ce5eaf6c404af26502a0fe81d3a72e070ddb0d1aa914303e766868d668921f8adbcdce16bbdd20ee8b985698a134db198ee71f64f58cf0b88aadcd48c429a19c9a0704db7fbe09e385dd38daae044b552db37f7fb13551ad349c3c5a4511fe540396bed9476a37d5425298902ddd4b17893dfeacb1f00686e733a6e0b0fe273cee9412a509edf33e44034d67d140c3f7c4a29a55aa4264ca8570f142d8a24931d3a6999b24510443102343ee785d4f896485252088dcff91cd208ced398b81d86afa54b484508c96cc3ba7996288affc1dce213ed702c7f0fb9194bba6f5e1cc31bd6dfb0dec6d6179ee2876339a13870123e1d4b22a5d18409f50db937769fc732c7fc75fd197b5ef375dca6662a3d497499b7ceeb494ad4ae0f5a27bec67a5230f3f444b5e7d393988ddbf3e9e9b6e7e33d9f9ea8ecd59e4f4f5236bd8013154ca891deb2e78bd9932c525f333c3dd9b0e9d313934d9fa400ae8c2a3635787be2ca90614f5c194b7bfe991dee8923036ad3999e4f4f454fb8aa3d9f7053b8a83d9f70381c13db66cf27dc944dc959814fdcf3098ad9a64f50c876999fb88cb1e9e76ecf272e60088511f3e5c916dffca933058dfe0728e8fadf1370aa36390e4dd8305032e090840de3c427c4c54b843ce09b8488d4615b0e530be3831786a6c3ccc2187d60aa3278c314217dd61478828c030c98bba713982ef435182c606cfbeb412bdd40830d18a41b5e98916fcce0786568cca042e3080c0b3644a9015503abd136564b6e581715451647921638a0a8a0a26c5038bb25a98a4d3fb4926da84287beb2c3f6504a50b45b1214921e2d944e7a81cc5046339d2f55d9822f53f9824fcc05a0e705b462c61318809e17fae013e017237217da17fa61cc7cb9a17594b3a7d317a3eca5eaa3a299060088f13d9d9c98b1509f01d8f41981f774f23265c340ff4997f45e8e567b3a7991e5a6944ed0d3690aa829703bc3a0c3291e395168407ba6b86dea9afa2e28c1534dc9812a90c4a504392b676460c47adc92a86021440f2e10119b3f7fb6ebe7392f9893d1a97ffd0711ffa360e8e0fb832e8cbd4e264fece92485b6a188645028d2f4dc753bcc488e248c502c8e9850c5c0ff6cf81503347a3a8cce1ce672f1dd4921e2b3482354242b4d365dc441eb0fff48f8abaf4242177609117ff54734e9c2a490f059226984a974808e2bb4180b0428bac554985c6631f13530a53614913c32e459641087d50f7f7299c5582f3e8b2489388c831a9c4e39acfe8f8a830a2f2f3123dfaf1e1c8da84097ce8c0087d84732595045ab4097c88cd1456c85a5deeaab3e8fa52d65bde57033fcc85ae342973557cd9415875d99fc6bcd816acec95ab5d59c124a0e840349ab2c9e314a2b0e69ce81c010fc5644681cc936fdd86a9cb14f93d165cdd9d8a69001f6f7f5ddc87fe540e0bb7e22d60b119ff59e470a61bd268dac8c804434259757bf5689afdf01acb761bd66912ecf9bb14b6df4e6b699dd43d285bd858f746192e22814e9f2d5ea3fd2e5ffad1e7c7005feeab7d0bf6bcd4d587def6235f5555763ad7258ad329256d557c57964abe2aa1a5b737ee44533669928d7d781fe47ebb6407d5112e8a465760b0ca93f3e4b220b90505ff6abb8bbd27a5b91512498c0529a4204a0f446161d9ee8fcd2a7bee807d517adf93f3b290a364759fb8d41f5e528d059c5211dcc280b90507fc217ff3559126ded7dce5a97ad9dc9d2fbf06dc677d88af543ae47f1bd1a869ef8ab2c8a9f37387e506c742a107d1b7288052a8c3e8e3752a13f4acb7060085d74f97a01993cf58980a0657e710bba4146e8241fbbee45b76c2e9723921b920b02a3cb9c1c7c94233f220e34348488030de5a0724153e832ef1ca61ad01faa7826aaf96664a1607c4af5a7c4008329e46f2b92a4292d967479a79ebceeebde5eafd72b686a031f578bd77d1de9f24ec9a6ee575b9df9a64e79b5cdcdaef3ce235d06fd941cec6a6974061243af219de78d133117ea5249dddc8c0b11382e45c8268f12a5a5a827b54a8911d3a5cb162cf466866af3c587f6123d5dcf0dbac44d402a7dfa5886c568cbee82b4c5d06c0a1f48b344db777cadb7aaccb022ea93a23ea6a690bd5483f29620850fa4c991d091f04497b8694e357546e41adcebba1170130426154fec3a71403a2036e812378145a0d114b25356a64453aa95442e31df1a5d521995c9681aed5fce1c119a52ae92a1cb193524bb56a3cb890b626dc85c9bcd661bd2b9e5822eb14d6963255cc3369bcd26457fb8fa63df66b3d966d46673208a4467363ab3d19a8dce56d065b6edfaf9498eaac105e9390cff2a17aafa9d7a24daa373ce40e4db7e1245ab54d52c96c974b6e490cd181aa9fe787df7926e0fc1078a216bd970e99ca7f45f9ad22e3fa9a6a0a6666566572a8be29b3a9ff893259247c4078f7c9a3cc262fdea8fd8acc66f7451f185b05e7cfaa2f820e9a246c067912eca7a21dfb39e86a411d6afde88cd7f1fd2983c19045fe713183063e26bd28891a9dd0893109b120aeb4919eb59a40a47865ebf0df859d701e4b2c7fdc19128f636a3f87a643d1d43f04dff03472a3332c461fe209982c3fc5160c08c9dc080190ba9ccc6e6cb99b3cf7a5d69a125673424da4c7c7064fd0c45f0fea3a34776809e50e90d0523e28b24ad39cc193063455464b186fceb8b218dcd90923826b476d7b9ecd39fe1255d960c811c9289ba9ab1d0ea17ecbc4e7f22a8f3baf9726786cd973e3b68f2b85b9b71ce57ad20784854436d0530686882690a2b62b3c2565fc7902c6233d25d8d6cfd3e9a00ee1950707e060ea95361f66d46ba6ff843874834786d9eaff06758041cad0d53d8aba72f8e73bec2f710244b237b455a9c51677cfd11dadaefc126b096fcfbb7de647177af2248fd9941863a00f23d41bbce39a188100197bc47522615568188e4ea6cb73411affed449ebd576a1d3e20e8258bfeed7cbd8ee57aa20d9eeeeeeeefe938b2b479ca9626326045d1ef21d7dc61e7f4a963ab90a1918321912e854201bdbb1024a6a8c2deee92445d5eae17377afaf5c5f157477b7d6adb5d6ea3ac5c5f75a6bedc5d6e2fb81711fd4ee6efdb670c02779befce7ef40ed10babe5b4a9f4ed14e7f70f79d22747dfad9babbaad1e4a14f378ded4db568d327da55b4d0163050068dad0a63c989354be4aeb460656e7172f2c416c51563aa545d3442a460090f3b0cd103166b88b00208a918a280f1421755f58c0e2bb22bc46ce982c68814be60a1a20a2b5fe0e0c4991c8603c0c82181a1891460314410275344a191aaa20cda19d1cc0c25413ce103172839dc5af89246891564bc08d3c5c148a20c346b72a86176c44252103944d1e4650b2aac2f66134740a1e2a68512499a2080cc1819b850b1c36c8be7050296a449e26987269a8c70218c29906842022f929af872442e48d96104512b8431430c2ba489020832a238220a49d8c5ce0f49b620394ac26136c9c882ca0f567e18c3c90e980b2750a08397309c38a1b261833267ca9c4982448d0c9a6e8b28a6386121e98b2a3150d0b0b4c5d4122d0731b2548154385dba60418b318a6861d45052021bb4d0a2872d569c01d2000c2e3488a9e149154f5e664fa71c90d0b214050f5c9634a0854793e18a292da4712244acfc20a2206e4cc4049193c50015a3dfd3b4f39e216d42f39a5fb24c2d16483345ca48ca940f68ba2cc25853860b293e3c71a4040353524f60400208a8a82450f46736c04d0a2427a81c92a4c059985ec89a907841c612150ce4f9f3025d0aba28a5618a818c2a2fa22863d39f51a4e182062758c8c10b08a634e942b5a4ca122fb2f8a03f734d22c8816cccc73743c9099d41ab2d1bae9c6db8e8f27e47f5a7c421f3ff6a1d0576c613f7c688297c63b31d98b3d63d2f0702e2b0fa2ffffb0e93a2aa3f75aafe7856e3cd2832f3ab5cfdb1d75b3d3db6007a70d487933da8002ad0d7181dcbff1b29babcb8d514adb0f2267d6249b42fd237cba9c2c1e5f7f05b4c5ed9142a217cba57e0686b9367f5e10bd5b05a09d9a0c1ff849274f89e087ede20f857368570f6eaafd114aa7bf5dedbda14cad92b121c73f687696df2dccfe183f6cbc27df07960c1c622640fbcc7ae10f2e3cf227424c629536942306983dc99c3ac06b48aaf56b2bcb76bbbdd17826d0ecb0ebbd9138426525bb67daf3f63f48402ec39792c5955a095ca8278ab2e77d923bb37cab11599b11d4b9b7d838c82629e0553c8df8d33e67527a4b02d0d45e8f60658738e2774db9225b8eef07fa0a35dc657f4e05a387448a0a71316b75db6b0a8ed32b770bc8e2b48feb9855459ec5b79abb1c885a0587ea31cfb3e72f579f4880860cf308499823d492fff073c8f9cfb32cd5b82add665490f6297340aaa3dfeb27fc73d8d5ab1fbdfddd348c7ba3d1d8f463976dfef57bff2d347ad94feb843c9ef84056d97190b249ca7414fa731b8ed344636a669572ba0767d9c6a43215516f3429c3bf7b7f545f30f790adb625c4291ba2dd901dff36ff60c43c0604f12ca07ac4c4665b258fea11ae69bf3c75aafbb7e39e79c28d05da47e39e958a4ceb796bed349913cf57867635d7e1f33595d0bf03eff085eeeec58d4bd2eca3f1d8667ec678fffd2862080ee7af7f8ffabadb5deb0fbc953ffa7d074e19b3a4cf78e1364eafe8e28806065b2f9ba21b81d7847148450992cf6fdfdef1be98479207831f01b29e86d8c6deee85a40f8e08ff023cce7c086128af8f67e4e6da21851acfef78d451f3816813f1db6e280a64f9855bb886ffc3336678f8e5a0f88c071c6cad6aed88e370c41003bd739a787a2477e34638cfdab1963ff72be5b90bee9404cf63d26fcf6827077154227ec5e9b3dff137091d7037f1d3b4ae4952a9436841b3ae7ac57a41db59d659a239de19b3a4cfe391e99e8fb88c23bad36682b8462928e60c47442d02ea1c8268ae1ff4ea0b408bf0b4c2704ed22dea3be0b4d1f63772cedb65fc3106e6ea8005fb366bb02f2f5e9b5567bc5a2caa8244ef555310915b28100000000c314003020100c07c542b148240d24395b3e14000c76924676569f4ac44992e328ca18630c228000420c00426066686856010ab84147f5bf29e40739a288bf58f6f3e206c2ec85a9cdc49152f2c85623a5307f5d698740a5a34f7238bae1fd53d60c1e3814eb6c756c84e35ee683700bcec65c7c19b5c071b2b9634d4a3643e8bbcb19375c399aa46f71aaae7f9d973a9ef3b3e2ec0a706201bdee2ccf801127628a477555f3a9b99ddce46a179a67f424207abd4555e34ee4d3f6ad50db97dec9e8245f25a595d11dc3de5e06b24141e451815eb28c7ad279bc8cd8dccbc6e160cd8a33758ebe6a2f7ac06f6027935ea6c1c669463ab32caa7269762cdfa34138ca8ecbc9ee36e9e6141c0f430508ba157e6437c3eafe00e095e714c5b35c54ffa9588ac0473efd332c7b36270d76f1bfdac5ffbab13dcea52054f1e40cf317d04584d6883be108f2136433c6437e8c274a75f47fbf21072912fee6668cd24318171fbb6db89725cd2153e85e2837851bc54cfbef9a6f3c9e257b2887dbb6914ae020e2245398be0b8bcbdf6732317b7a2f89ef92b5e7c53244adafe37b477735d1ee8893dcf681e2bb252a2e0878177ee41bb7ec9c742065cf6b593831bdda386f178bd9cbc280e7c3f3dd98ff70de591ec6e040481365db0645efdc741f43a4c957169ede04f1d15048d6e4674ef4d340a4127a98068492e842fa436a63a205af0ca745bb9845b6af47d613c9561ee8b3e8e1893e1b3d60f696e0a0b1f1c09ff343b4895e55c606766d70591160a4b705e224a71284c63d92053edbef334d605985affc50092cfe68a7a0cec3bdbb494a6d94f614aae4a70ea0341c25633f1bac6f0db80fe135154a97da1801c220334b8b267554bb433281b2d3e96541ad5f47dcf291b7fc7a11dfa95b3e4d2d8f909992f46f413b65c05cb69aa5479c7210ad709473aa061f248243f61d2a41a4ccd2801cae1efde9181b679d8ca011f9e78f4e826bb07f5be094574b1dd50d6a9dcea3080182c4d87143e476e7ded81e3d91498152692a5e37d445ac93b647414a6486c472daf23cef58c7926c5a99f9f7a192436aa93eba1024e45d13f518e89e98c2e95c2b65efd0436f471a8505b9c32bdd318ca218f360ba8bf25c313469493d1a543b2450f31013f08eb1d61329a4cfd39e24c15e3fbafefb08692a4e6aafbf37ad42b77a30ca561bc55eede9e183dceb4346bcff97f3d50614d46bbb9e367a61963582c210ee327ac78ddded6ad9ab03f53f3c07dbad9f4078057eb7d4ad705c5025b427fd8a3aadf58cb90874f97befbfb66bd40c38a58c6499187c589e1605fd0f0a51b4f3f45c5167107b6ecf5d5168c4b42051e3f4bc2ebbebd3c364341c14bd14ae277123fbb7b125fce0124c1cf1f589cbd5f939935363051526d4bd7d99fbe007eb32a81d7f11027a3fd8f1446ee0043eabb9cd393762daadad132ba383c87afd70bb83bd84102b5c48ad5e5a742253b4a6dd237d9afb19366a855f9cd1de74f0a341140b377ee616a0f78dc3fbf9dfb6d526ccfe5538955262fa214efe1e140dc10cd490ebb554341d6fbd62097b373a56dd5e9d66ec760070d875955df97f17c88a263c6a809f431a9120d96845b419db162b7e97fddd9c116419a8172159922709d5e88ba8b0a9f25652a7e79452154744d783a01ef777bcc562f7225400ee7e6224a316e20b2ca729fe4b9b3322e5460e5269f130df9d5ec5807006cfe0efc0feeeee4f65a387ce9681ce82d6a074339cc0946890407e3f60ebbaaafb87c07f98e3b9d382ae4f51729e67f0c0e1b90c13692aa6bbab37f73bbdcac63b5b31e03eba4705a1ce5a01ee1d442b7f0010159c092a0b5b4b22ff6a47dc5517d26e2986a8e9ae8196c5a0bc172050ecaa2e9b3023b78d4c45658c4ad404f2343b9b9d81646e3ee4693613ebb7e9586bc9db123ffad0b73a7a3f0039c6279428a0472499d8a54539c244b9c9aac7f7aa5a70e5d7e6a06ce931c7936ab115fe88b25e23edbc190bc0d3c8b32938980d4b181cc08c2b4de62cdfb4aad1dd3faaf7c70374da807e0ef4de05e16a88916403a93318bb783440a8dc3de5f4145ac52050efb4a5e2c72c35e91e22abb4effcfe5c3f469d2d7d56e5e806f330d075b22e817ac60d620aa9792a6e3debae4c496d0c6e4ce3d22d5c3bf4ea087fc4846484fec7a23d49e6d03258595200d46eb3269e8ea149f6c5d336a0897d72fe62dfc27678d80fc174a06823979cc857522214020c9abccadbd7274a9fd850bc8a52589ef3ffa7f486f2b7ccc8cb93314f912107dd31a4d56810c9bc7a59ec3d1c80c1c799bc2fe865e3db2bf55fe155f1a9edc352563438cfdede8dbcc2161dd255199b44b9032971e15065f21f6685faacbf89b4470a7a6ff47505bb2ba56ddea3d3ad758dd52d4c7c7ad25a44ba37bea2df63408be28710012d5f6d4b0f1bc067f2c481d133f41c6da768d0b84eadf7bfc4129ff022b2b54af3f4f1dfa1f248e2023153aaf8964942ba5ba253357d7b8e353a5d7d6809f4d4f0cb9b96455e18b591027b7ddd50bc4f502357a7a6239786749045755d1ce1e09b33299a2bee3a3e4cb723caa325888a69519e8ffc04f55d9054f3d0acec8dd3a2e62e4112666367a98dcd94159eae1ddd9712e04dbe465a0bb164a187f5388d81e7acc38ca38832a35ca572dfbd80746aa310b3d4d4fc607dea1f0443c166d540466599237ff0e67e4d06b3a28a69f747974bdcda227674f01d78c3ca9e2bcc5255842cbdfba62a0e5c8df4d3a7a78d4a76a0766ff777a879e3b6e16d3b9e3a316fe0d424b138b9ea46d2aef073c10bc1848be3426dfacabb2bfec533155c3fb31f146b099436631aa2811a2e9b86048cfb7b82a654db1c8db3d913cda8cc2ec62c7cf7c49d0742fb9b27667a03c3d79dccf976d0d5d3b83f7f4ee809d989b21ae4b6973ed3cbc23e19ec730146ed2ec3a7af39cb1567a04ea05adc8261724876dd9be7d9bd000e9f43def0d98f6916acc1f65ca95b21852529da9464f8317aee9ffcafd0d35c23516c91040aafb51eaf0f7c25340c393fd29c5b9cd9673a699775908d9a351a71d9d30e217fc667b0664703f2cf13238d0a0cd3f6f8d362f819d0db14e7c64a1a8f1dad0e09167931eea9fea7eb4fccfc6c43dd3525e88d7d4c9a2249bb6887dc313c4ac40a9bdd45077d95855802653c86d5717dbd9c3fc67a543ca216d62d6b6f2cf6990811ce15c892ec15bf35561ae33d9510ae5bb2d87b5e09848b4299e0b70835a6c636dbc6d626a798524d4adb0db0c8d444ff0cb1ad08071fe63aaf4c74709cb1fd3e79145e7eab8dfefc02298feda7b31b2a39bfc09ba767e55b2461f58578d7245bc375f3d9c7bd9fa2add836177590f4d41fd8befebf4935aebb4386d2668707328b609fd42f55d2d0d9ee71625f59704bdcd167f63f498894989d19b12cb14fa7f1163ea405d3c14770c0e474badf272e345485511b5f9e947b03a145878c861e39255fdd44c37664b03eb46b81a7cfecf205247580ba49115001e7529ab324b3e127ee402283d3834abf37d87c5758a77f4ef71c0113e41d622fcbf292e9be95b08a8f0c03e70e97e6e39dc9e9f012e7c99f1f47d2862df2ff614913e81c1bc4b6651920e5f88b0f967bad06f0fc1974b0c4f81a4b8ea913aac8836adc3b55bc425d50be0b328701ce594f590af249faeb7459d23e501beaa570fe1d97472df5fa778ae9d5e3fea9843fe76bc40e4761229a05a2eb0bc8e6e722e75476bb98a1bdb56661ce53d1366722abb79db14f4184ad1d34f81e51583bf6e44685ff46436b913193e420628343d2d9ca8404fb734d4eb6bf7f08d296d5e89c0a3d253b6f699f655a54088318340f846442f71e1471ea839ad44ed24787010631e465c027f6d27f4399e4b45bf1f1e0936809befcfcd193952612be140ae9dcce9d473d7d43503467dfcc7332ae81003967404b394f252696d963ad9d7762d7ad9d35efd6a21cdf7a4a6139ec7b833ff80409beeef104125b93dccbf4d9142f2f6f7f1b91d89b3e363abc8c7e767b13d10fdbb8f3db89cb2e9243377f42f463e5b66211fd44cbed4e843e6ee29ea459143bb9bf09d8e78d3ba6c845b9197873e5900a1a50212446ba412b08d72676ec02fa33ad1503f5ac7f7079984574545a6e836e2ddcbe8a6e94bb41b71677978a620f0fb91d74bb941bbe76797572f327e01f36f86995dfc959227591b457f80d9198e5c31a8ae847edb97d0d4c94925b9dfd7ef8165bcd38a2ad9ed70cc982686453155f414c7d41bc63d267d8df46dde75378e35ba58a89ce5f91288ee7b6351a339aafe333d1bb4e782bfec51bce886e580d67b937ba2eb0923edb42baf2f1f22eefd5e4ed331384db5c81e75e350cd14e834e1a852490c1d534b20e13a255399dab9b242809266abeefe08ff6ebef58f904b6fa7f2a1498cf703cad64e71ea855511460bf0061d9b29c430b35130edc60e509453ba81eee4c8874aa2db52c3e04127caa743fbac4ab0d536566dc3bdc499a6aed71cf6451122a912f857ba46dd49e17bb6f65fced1dab1c4db24db8874eb10251a1b706aba2a3dab77b13218c04475b09e9d123bfd45d1a2a32529fa1c5cdcf5caf3a4fb6feaa682d6bf84ed07f98a40408d95e7689008afe284449a89424c1d7de156fba4c3da2c4bc867392a1ea63067e66fefff57c5d81f88911f0d410775be2f0c6ac873fd06de47bb16c4a1367fbe9ebe986de20857f793478599c50244fe1574a5729d6a90c03d39b8abf6c6b0c39b5b16783f92c130dc8cc0e727cfec07d63c6b0793d9b6b2ccfc53600a3985e6e969270475fb80124b638df5c5795fd28bfc07c30fd4f2107ad3712d81e40c725b775170b73346db09001470d3d34b858cca2109084cc712d2000717e4d8b7cd1d997b8e4007ebf10d2f7886c2ff3abe2fe6eb8c94aab49b440fba83e1dc9825f309a6acfc3b408c8ecd80724182a1d4fd12533fe572c2cb5f029b9f2cef0c68a4b2ab01debba674b604dcbda2c0611bc22d6844cf77d7f32dcb0d9d5b358849879cafa2e2dd12fa3981e88644a45af65ce6a32724b0930c915732d8433c132abe7aa72d2b778f819b3ed5e1227240158dd120dc06f83afd5e6c77028890068da2ad5e30e8a810a054b247d761ff7a988d3a94b94e215c8866e477804f0464464741601c44e22281d1b730cd60d8881d925634481176b8da1779e7a8706443314b3679484045c1ee96d2eed477494bc0712bb7c6ab98849824b579d6ab2d75b9fbf9c0143641da1106352454ac5ccbdfd82b97953c1d79485203ef846923b9252817d3372ebd98802c9604374aa50a378d33116375af05aef69a4e365727a7477a3f04d7e4fa082ccfe540c209426a0c0a1793cda4e52467cf86fa838f9c11afa7806e2fbc01836dac9af11920c2fa855b2cfca53fad2994f596c79edbbded7319cf10224d4f55518a13ea1f6800817dbf0ac6f341b2ce4b7f8e178c0041801a14e33d342e233296302415ba722d110416aff8b0200f4c95a199e8e920bfe253205008f25c1d3a760b03216250e3bc8b0c5f22200fad89084b4c0a35da28eddaf9d938d60e6bf2a1efe52a2eddcf621c2eccd9d984a725b17656cef4252c8b4fb50505a4bac3afafb4c2e389e082b0e0704989f318859377d0ae7fa8ac62fd3e89c1cdbc628a2386db7a28a308108d0a92cbce365d7341172d330f3795ccd8d0b65cc6d36a4595cf4d69061ba0c7d7a8ff3a7103d175dec4b59eec4a0e8c78cbb76cc9ae9047439e048735c3b263b8b4f483947d94acb53f99dc1346352691b1cf1ed5116427851690fbe0b35378f55f2d025e0f6bbecc83e65c86547beccd1be6b7066b0e65423789f2eb7004708474f0c22bf5fe13a268e94a139183db4abaca2e5ba0db54ace155491fd458c278c3d6a2a684182a0372529d246b655cc74a675d3e1db9aa74e34fa46ef3c6756f8e9f74fa6c626dc133546b7d002b9015286e2d8972f92dbeb7b9a575f5c65203f1456cf28685f7d719bbff2388000ff4b05778d847de5a6c28bdd94c560918e86fb14ce1085f3c9e131c498d38da06b6167bd1dd2b15a9057541012475a5d5f22f46acf05e9f310c50d11b799736f658f78cf3f5cf3db6c090a8a898e5148a9d4f82f7fbb00f3f45b445f5a4ad00f138e6e67edcd9be5c04156c405db19dadb0b0ea3dea86cced164a2008d0a33c3708010931183c41e855804bfaf0d4a4e85b0ad9add58888b90c62cb6f8ccd61a71e1998b3c25b9326cfa80628f20e87cdce008a92593d60f30abcfbefad76598a792aeb1f3ade22dec589b6e893817a8e1ae02a25a355698bf893724faabb9e6d4b28ab13588c64c433426d0179631c5e45da18829535e8dfe1183e2b4ac44eb47cc91a7dfb92d47bf61012ca9d8b93c056b72a9b7bc56022d768c0859ac88265fd594eee8a82219643e4ca8433cf7a68e0c292286a6d5ded8048ceebe28b0d317dbffe2bb665242eb0f1a69655b54dff0567df225dba1c9053cf8769c39bc426173e20db3813a1bb2f5a427dc37dc00d4804f0b7a0b8f061cd517ce07ffe3003cc4976d1c7eb2e280c1372ebf7ee79fcb990f44776f3e5e37e642a1c92940b4f61d3667fdcc09f0aa13379165a5baaa867db58b25556cf922ed838fc0dd202e6b000ff916a4d48ff5c23207d38ba262cab4cff6baae29128990706480aceed12c95b10024977f31121db56535db6ce6f34dd78eea24e2c03ae90dc1625cb2082eb6b01312d2fad88a8eb3d935963899ff7149b9fddbc067ab507be4cf772b8b04677937469485662c1d0abcc8a983d55c8fbc420d388706dfd8921aa232b0b8feef723af07218e0b124c235ba4bd826e6c8bbf4fcea21097e11874b99d55b2d3b5fabf11dbaf7e18e94c38301937ef67fbb6dbf105885894cdb0e07adb7e9e85e1a459950e063e906b086f3554836f3fd4ef81f0acc02caed1ef99f268cf50e3b9210a4ec8ee358f363e09f8322f9984a551ee1b9afd5ce1b07156f1009f0d549d7c7d351a38d3673b64ccceaf983016f1d018fc33c1a462df98303fba51f68e05c2245d13815418f29ecdfc00fb74343aa57882ac872681c45e74bf2c070e43a14571beaa82510242e520a8903ab0406f85ca521b3c85d4a27e561ef440ef098957c866391e0c53af7dfd45ac26828e9c2a34ede99290e0075ea5fd1229456fac5e21edba2b16b98c84642892ee92d77ba49fdd2ed82d2ded75d0febeb144dcab70069cbc0b7451353992d42d38d99db4b250750149a492534d16cfe49fea1af79a1b02d25da4da09a103815b07a997ef7b271bcefb39c11291f41ee595eb3e93f173d2e9de4e675f040dcac73472cc0b65e121592b9ffdfe2c3a4b77675564cb48e10a365495d0a94796cc717e0946ba761308e10c3f6f11cafb396752c66d2a575c651449c2050244a34241fffc5b2dd9c71ac163e86b1816ec537e90e0be7e09411e78792c69c6fffd35abaf0d7aa2f9dfd4500718de5081a8bcc368717081660140f58577dc1d077701abe99be1338e564ff47c05f249b85d92de58cef003a16eeeaae4ebddf736e8f70d5f600fcc99bb21401961c0e56f9b772412585df53cc026729fe20f5b18b0c223ceaa97a1b5d2508a9ce5631ea384a7e7e85148ba5e470174526aaaf671ca9aee9def91ade0f5c8e7195067e7594b7d12e955d1c930d3c23f633568ac979e297800e8f9e384e056285b74504ebbb52fc6b49d65ab2104c2bc2ec73f8e1906b571ceba643159072fd19abfa5b65c5dcc3bda60913b1fdc3605a9398f8ffac5f9aa246474ec00ffca32002b167d4c75c148c95e457580fffa48cfa400de4be945ffb31340ce134f1ddb9ad4d6becf315077ebb7997dd2d8d27798f3b7213a0c1f155cbc34d64c37f29889870275b039bfe62f1d2dc0f66b510c10116f4af8c880273bdd3c66bd255fec249904bbeafa21426a22d0fc6df7d37f9d9862247749d5fd32e863b5994fccc86ae84ffc56de75b986e600074a5e0c617fa16bf2bfee30b6e0f6f9984dd04ea88a2a5d9fbfbb81bccae66cc15e3d5f603721a0a054801711031d0c59c881069497aa15fb765c07bb60f0f3f3e76240ea8ad7c04465d9a21972da52895e3ba4d2eae4835f55bbe6d725c8b29a5eef86e92932ba94cd5e5db46b925c80384f3890f9f1219e0110843329911a803a5fac562588d5f121a3df8efbb2630e881510ceb5781ef1fe55f43b34360c49e444b944917869b97260ae2494aa2b48275d4aedc3aa4924cf6d994baa5f0f22005d71038a83eddab4c1cda3985aca60302135ac0f259c3a18226ed3ff2edf579b75507f129a63a487033d292c8ef206670373cfb591a8aee2b251b0124425c3884a16559af16137115be15c054a078c1acf95121f41fc7ff031ce70ff8147b1d4d2e2806294711a6b7935d67b949224242e13d07952105b7c3fd145a816248a4900235649dab0a1700c00a97725523b35fe89ef07aaf3adf93adfa339770a2001039db61c6ba8f64b0c2520fd9fa8452d8d4395147c759574b7f99a8a81b628efe4e05b3f005f712357556cd95e00e0c0d5cd87023ff4c28fc3ae8eac6922e3a69d804c1abc4dc94925a8eff5776c1ada2f1120edd3f0e4f36ebb6bd1c8b32a6ad571511ee26ed94130903bac9d45669981fce989acf9f913fea418005510c8c85ac7f0dcb8181fb478548f52761500626ebadc67ece56c204b038f8474c7b1cb3995d7307bdf448e2076ba37600cc0335e1eae02cf7609bb040503524ee1e13bbda4d417aa356997ff29a315b0bf8a454fc4c68f5abcbb51c03b291f43593843b200aba8f689ffbb84bc574b4a54faf27b85b554724a4a31104a7e00840e8b84dd6b384d497b3c5bba0246e2a9d55326cb6411f4365d762f8004f299e5d93bc8dd4815121cc633b96db5e0d5b01629772dec5116b6b979dc8ea23583d0def9776f801371b5b5167b3d668632c8a2970db180b19295cd933c2333be39375b74f0c0e44fd3c7b12c4c25dcc62dc2cc44e805854733155360fdf484329256be245e64a99efb32f4f9b1b534e588117851d27ebb41fdf77c5b9d5817dd979fec7cb5012000a8069f21b8d590195f079a93dd77db5474a45e675df493028ea0fc1e47b4a3b406e38a93e9b2d4c7b371bad4046ab04a22184d4f8ad7750c536b824ae4c84b0de1185c63f737a39b84aa5dd51215d2c4e669b7a1689b7b63604a98909f5676b86c2f2802d786a887858776d18408f00795578ac7fc42c3343b206146cbfe5997f150a676e8ca84c0cad2ba2686c30079fe10609e0d80c58890fe1e1562a6974e4efcf0f586f807b99b06a44c1b4568ff78bd15c84c4eacb42ca3cd03f0163c86c135537a4fbe61445c457953ca531e736985d0a3729ce60125502887c70a74392b54a90e37b65a0f046546ca2d4752c7361e2cef83329de4abc3b30cb9394e04d0c1036dc974555d7825ef57a57720903c39452a4ecd3dcdbf130b8082dbf66759cca5fb77865927c0ba8e8a245b177240c8dde4dd0526192c25210fe16adcd4053f49edc4dabf2f4c06358c4a9d50d7549b12334b9fcf0c74a6411db55cd87876f4427bbf16f0511931182e5c62828be30e6dba566fb1018e4e6416f291dca89953fb54d9d14071c375a060fb7daf14142a4c7cb54d03ec23a48d8087b9c887ffdb80e922318b23b2bbee5b058c51d0dc990b7b321d1f87afb3d55a9af2acf44aae48b00a2d5fe4db2efb71aee7236959bd96f95d0fb353651fd045af3e9a724805123728d80d11a9cc992676a7ba871b8a134dbd838ee349c3436cd4531a933ed1b4e71a234c68089a8b7dbdc3751bc7f09e6fb4c594c80fa4d7ecf7ef0bc380df826fd7854506194a13f8e21c863b1609874dd8973bd2a78252c67c0eecc3b4b333fbc2215dc3db45e8c4b8c15a640cd9a5d441ad0d240d7e6e688777d957b5e1ae57bbe07369adfc8cd411d63a104af8a654d2258ec70bb8f4f7c38e43546eb936a9096810f87146de51c456ad6c022ba7ac89cc68fcd1d836f91a658c74321ba7c13598e3480602f8ee7625b6adeefbd5d78ca58e5cd1dc8a18174d334e5220dcf165d5c14a057f022eef752ca51197f6bc3a2c9a37794b989a25e33f95f8275c9c04b4d9610a4abf664878cd45044d51d882fc60efa3e280eee026e6b286b2ed534cbcc2c6c1856ab964a2825b6c655ddabb8686ae01ba9acbb14929499058cbe915c669653f54564a527e9107a2f722144277c53749033352016f58ee298f27de274ede7a92f2a146ac9148ac52e28a6a997900a18fa9e10a67093edbcea758e02642504a60b47da7e3e43f5feca433c964d1b367f43efdc69ea37dfb2c4aaca42c86050167f0eab5c84cf6a86d2f058827d187dccbb069b7e5ff24e1b8299e3cde69325623915a679a1024e33b4e021d18f452a0af7bac907d67b84ca9df0100ba692a122aa1783e721d984d0272e1971c460430b71873dede9b0002bd27e89fd24c613aa5fe8954b36b1f5fa8dde50c0c25aa6ad4f657ea44ee0c4525cf862e3ea30c06e14a09b77ba492531c548dd75dbaaad5d1fa1597ce4607ad0e24f6756c5bf0eac45b92a2c66df536f67a6c3cb29b3b40fb008aa509caffbcf6cd98d9db79bab94aebd1433ad982cd2e55384b4c6a23f9815a46b185af4067c2254c16cf556c68eb5f89f7f75b44e71f3da138fa316f70bed44f797ad887e5128851d8384e16c63bcd1297f9aa1d2b621977639d2eb1f7685273bbd288ecc409512020df625f393a1cd0442a807441c4f098173c6bba7d4c335fb915689ff9a601be3a73c32da664b42fbcba72e6fa36d926e38e984be6c4d43b0f12409db9ab7bebcaa073fa3dfea946b0bfbf4394a2e600369c62762fa74039fa0aea21ec9efff04ecae9b710a24c3104e2d9d79398b6f12cdb34b01c27d4bef0d2ab0731fbc9219ad23e8e34c267d0163402f997e9aed14a973286d9470db7c9ff2d7f9a014e552504cf45e00f34d4d1695ea85223e509df8c51bbc8b6c30626bfd1db20ad1fa967f9f127e702456d321008acf5b0373cbf1f00fdc25a8ecda23c7db8d14ab90d02fdbde092e88fe746a7f03efcf9deb2dd48ba13521a19017e0dd9272669f2c90bf090f3cb7426a6b78e4e8401af2e2cdb843dfcfdd77aa07c0718da89da5ed092a65907a8be91ef814f35ff94e2ec064c1c8c20bdcf0bc2b44145ee07b0b720b15f04ad42a42f07ecb79980b8e0c181235416e07b53db12f973ef81e118c27c618b647aefb2ee881b0817cedc8ea06b75a71d1b23b5606ddb5527cce3f4cc46d86fc2ed8525db0b54341a1c229c1b2f90a41306453672e9299d8008632b69b90613e22e8cc5a50d0ac2e878d84a29523055422d67cf1e6b09f53a397bc107f8f84b5476ccf4b01dfa0fd54bb58531b9ae74d70abadf1c27427d64ea87bb388e13d30bef302f49c3ce82000b1b6fa469af5025c5cb5c252c294230d8d45f301ad6e1c8537d52f8ab0556119333badbc5d7a05af6cc17ac18eec3a294e393a572cb1f4c2a55e0687f3c26c0d0c10a91a6c69110bfba6e5056cd87c6f4e8f63b66878abc293fdfe0ac2505eb0e152b4c1aa5cfa26780a4903e258ca0b8249937e60eb994f3e9412c717d080832df6faa13ef0142221aac58228e1f923d6cb70a102b346d6cec3f1110fe04d8976f4ba5e61174b5c9d42645fb26ab793f965c02e8b6920344dee42b7a0fb6cc14557301c9bfd3231453b8685b89650b1d6acbe14c680b6215b2a73e342103969d842d86d9c5efca69f61bfe786ea412369ad815dd258771aec920675d1d8ae34ae3b0d764d63dd6868771ad74d23bba5a16e34d8258d75c1743792f92d0d0d7e6c3309a2be926ecc8cb671cbb30eeafa82d1c194bba754e166ca79df45d46e2f04b78040c2ba0a2f87b89704f416e22e1dec9d0167261598842695fdd149a50700a5f211343ddcf94ab3b8e0ba1c3357083dbb3b2709fb9ac426e8b3733a1274ab98fed17d289af84b228dd0cd26f10b6bd3315740c772790bfccdde1aeb6d707ada299c06d5d7f3fa934e52a92b85973a8e4c945ea5e2ce3288604b9b36c8e00548d381cb0ffffbddf160ae3da3a2b78c4ca23e1a652c06d6cddf08f61e58108a43e4c0d2444985910428c4b9e20e70dc68023f2437f9fbc89dec4d0125c6742d1b132bfbfef09de8a6d16b942151e57a6a426764ace7efc97d7ab81ac8757d9981ba9b5d1d4470fdc98e0ec4869e4baca222173d588ee058356f4f541851d67b7e783e88468167cb81be0ba1a33161314e7ea4a2c38e9f6acff78646ccb8fa62d3716410689e726aae7e16be7889d38a843b3c3f0ea016bc2e0a493136734fbfb55a7ecb3e88c7543279938301440aaeca0b23c7ea9b39adec84431e4e114011c333aabd459e60e3f632dd874bd50c8321af274235aaa473fc7c47d08738074f1f58285309a092ef264af732fe2631fd227603a998e877480426b98cc1ef233fd7eabad2065f70683d954250715d735651878f6b4e6cc2111003d4914d357d35919b0716970f879b56d2f4d456b550cc193ccca4adc17e027bf98adf491e96f1fd238d1d27ac08246511eb2bef83921b5186ba140178d254e3f0f936709b140bec607939ff0df9e9c65faa0e42e01da8b9c9c1f7b2e4f062e322868b2396bf808eebd890d2d1dc557c2d1d1d9501b9e516d735b9f0a5cbff7dc9629c8a856a5037fca6def9d0c1ea9ec80b062e2dbb50b5de8e779ae74830b984f55ad1a1cd2a6e79e3c56986abaf9fa225cad405561b671aab8de651fbe29c3e305204b2d7a092cb2c884f69672bf005ee5de745ad43f5717387d6f103ea8eaedd34fbe1908ecb22e971ef20cda87fd0a3a944dc7ef0af84414b5fc67a7de711911da53c30f07461e63f61ca7097268e71e610d1b5c3c2408b7012378a9433414fbc318c6f7ff6d8d52154243535c1e175869ca12d031a3e39322b92400757a730fd0a73b8deb82791fc52a5375fdafaee29ec7ef78c2d2996b43b453d45fbc1ced874dd5db4c724ba3b91d5bdee140a4cfdf93b8d70834b645a4564e79d06e2d729f3a4ba422f096dd798228643e38a466ed21ce1ff41723408e4f747c724647d2205096b7c9d632366eaa0ea506eee1be45f642af3c35e8dada01892efb26d7e7722f87e641f71f892fac0e52e73ac200eb9a13c2cd491ea324de50da514a8d9b98d56b3478909ff9eb04bebd38807a9fd92e3b8bd2a718d70b29bc8bdeb6c505e69a1c2773d1948fc2a0f05c77bfce4a428cab734d32b329d7162a01a9b7ff39508af4906fb0d571f8f1ae7bd4ae3b2cccd2af33f02278892c3b68199607a611434ed4934a278678a16f5964b8f11f787dfb60097c33795200e9875e90c452c898c7d688782686563d346c858148155822fe04d628e3521e737015e387d375ddf3dc558b39e16a0a2662ee1546c72c2379a349fac7c4940c21e7322639351807af57be27bee1ca7ef11c28274d20a816a604c01f236eccecf3729d115145628cf33224cf56e88d0183a735afacafd6fea0d64e417c2b207d4323969aaf266371181ffe1ae2eed5a918c29bdcdd4e6ca720816db489d5db7d83bdc54df03b33b4138be201c3ed63f2130cc362cf3d8abc3b83aa9881d9ce036ddf22bacf2af62f65ca8d2aad8c11683ed0649765f2917cc27aad703d6499bd744744a2a5f7bb1eb1d992610ed550f4a55dbd95a987423939752525c94225e516d6c9854a79026d355f9d9cb4c9440e578fe350774d78c6a5ea696be1ca9e37ae1aa0c3dbc9372d1234881130650132a8baabd4e3efa31d24a50e1c25e83f1d495b32a4bffb3e21a85053c2569e15c136ba72025a9040d9d61cbb784179b409e1ae251fa1849764d14971c0b56562d554cab3dd3189ebc9613efa990fa76c84c05f79a772a36dd21ab217905adcb913c920bab6d94fd62d6c3fadc1003b786ecd2e393ef0d482fc072ee8f97ce3bb2c7b3e5c2586edde2ce0197ffc0b0193093bbb593420991c6ed6432b552e9ab83585924667a128032b7641cf2c7e0028054abd8c6c5a6ea918cc1dfb2c703660405ad8b5fec13778ea61a264fec90022a53194d642c37c97f800ff9dd46e79a23d446d31e69b8691c51b4872236599c15243db4a777875502584261b3425cc88611c7a99c6a03f29b6f6ab0088f881f5b740925ae075dba1b78fb06ab9c79f57d8cd104bf12c51f68e13190eb6ab0ee2253045bd38a4b55e541213afbfca7162e8a4ff03fdd2ac8793809508d4d8ed5f441ccc9107d37e6097b36ed946b9bf225fb947fe9ff9ad9b9d993b3716937dcc03764c2191dece267cbeef66708f348aeccfe4f59a0ded882653e78752532de22ed966f9e022de03cf4a1dcb345ce2cc063ef97aed9b8504f3714d5c42797bcfd6023d2729bb8d53dabb629ac4d7d83f9b45b4c47fb1256b82378965dd3509b62a9597244320fed618336889c2ecd06529f4860c2108102768d5c508e229cb0884731ccfa72bc6e4424ad82af9975e48ceac86c06eaa47417956ade4a52da3de6eeed31c6d440661bcf6761bcd21db6e602b77917c3c775471c49e2a0dfdedea2ef8a4673011dd748ad9241eec300b87c64702f72e142b4b6ea3a6843e19ea39ce3cb0cd4a0c99cce961429ba3f9f634e1184d9ee24d5b23b78d3212755d90a68ecfaa41163b14e7a2a4f925d2e4296513e3929017297352996336c0909052e053b84b5abbad38c9eaaa42619b2486b7df73c7222d34cb4246cb59fdc012577120ba28aabb291c5a06b68a1065648a2977cf990efdb5b3cd952cf40783894ab4ed90314c554e4bc84eae9662b3a8a5609f67af8ea21af02d5499909158420a097e73650892d158a9189556d24ac4e55b57630ac6e2009f6ce105c9edb9d35e7e6a409fd5ee1315c16ea5b7fe224786b87e8929857588ea433159c40b989b640d98efbd87b8d8a5c0d6a8d04d38d8c34f93d1acf7e8d1458b25b1bd47b4af604cb2759630e60425104eb389314137d09c26358a53844a26a4e11ac452cec08a3bf4f510a4718b61a35ee572785291bd165ece53d5d2141ecae3562e55ca954834268df9df45dab338753a19cfe5a8b41e3dbab92c642b285f435057ec644975384f883d4e79d224192fc24f2945172f1c4394b1c85c3425f83a56539327442dfef819724c1738c873dc818dd208c4d59418731e3103876e101a82371887a42fcc9ac421bbf344d482f35b074698e4fa6893c8080b8d12788acea47574ad6f824b15f02700c42870cdff4f1056c4a5b1fab6c2fcda632f6981ee9a01b84bb3ec738776a190631618c2f05a312fe399aa9bf2ed1cc1c4ada2d4ab3f001ea8d0fe78bceaf8c08a7b226cb3e1319b3766dd606b2f9921eed163ec8bf1d05aef8435279ff34227cd66b2ba27e9bec7b1441800874709f22f36a1657dc719692c3c83b754461c05bc25c9a056505dbc12fc72a42b48579410be09add0a6acd669f24ff682744c5b1cebc41a4572536146d2fa4b7e3bca24aee987c79506c86e7ef72b05ef78b0abfd4c0dd905526f89ba0b5811d8a710c0a70e79871ac1210ac2cafdeed01a3f1427e5048c686463c741c9c84fc19f1e852fa2a593eea6c9f03306dee60662f8074cdaa087f8710dbba37df033de915a81e310c27722cfdb884e530ac30b73e03b8216481883fffcb9dffad59e8fcfd309b6bda7088038ebdaac3fd358a97e364a4421f9271aa19ece877ef4a1e538b1ffb075118231610b9bceae81570583fad155062c8a5ba7b969b270ee256840fd9f89b85a0c455f6b8e55c72c666b5b79b131d737d900114412aebc8215cdafbdd48838b15434b2fce64550519670a1fd81416d1aa514e143f96d92e71423cae69973a9699497c67c37e6ec823ac2c1e00fa7ca54a3c71638b1537b678b162c6165b5cacf1e28b1733b67871628d175f5c9c71c58a1333a67831583c6d40095f54bac6b87ff68a6f577fd9ad9740864c6f7c74e8ca720dd12420e593724d4ea21815053a89bacbe6b7c24022570d3f9991f8d2153621f2f6ef83e48c0f6c721585ac2922c438a1895aefe35c630cab1633b9d02e8fb5c4ea6d489276919579a6c8301d855e549e16f5264e2df2c2b098a530605df86ccdcc7483ff0d12a0a0eef0738d5f7881b3826c92a3c353b1f54156a4c3ca61dd0690d929d11ce9d6ea0fcf960108596dcb292081c612318d4e40be30d2a92f53d02774e4c8be60c5318fb5a7ba25469c06df33a91fd2a9cfdb29394df8c32a7e1ba0806daea094d592f43a3023e6d563b52a8e5b8070315e7eb421547599154c10d3ea2a28a2f9855699dcf5641a298c5e50021b2b22f223b914ec1e46347e8268c7475f677296d16b5a8ec7e6e13116b9a056afe145201416d95a4181b47162021db688150edae880d5d19da310e383a857f37a4c3b232c9455d26535e00b454411ff2f7f42a4354d8f60adfb651d05a08b1a0f01aa96489f0483ed7672a640a02d085705731bd6c80144311577a282bd09c38f4f21090102ed6ce1f7f1332e91c5e37dcdfa7d386d693e5a3f7d92e7f9017cf9a3e75101acce9f4b61b9237e09b5547d2bfcfa39b42e40b3569fe7491c7d2cb961b100a24abdcb71bebfd45d26c85f1eca6c802d7b9fa9305d64f817ed3841a958c18e7f48fa20a448e4170a8ef278f85d2277f4100ea61c03d4bb87bbd67b62c02b2492d1ec67f121f7f033ab0de4826cb23c03bb0c45ce8fdba3176619171d680e92d1308abf3d0ba3cba11ee0573c268867f5625505d441f7df12029612d6e2e157c9f4185ce96abdfc4cf5498261d5e291d1893b4a5572532846277ef47bb19baf5e10992d3752e918c5d507b59a5df39680936478c30041610ef6bdf109b78bbbcedf2afa6e3b7432741ec8108a64ab0146dc148f3df36bda5549bb209fa74d1217321f46dcd474afe36057c0366d1c0338b09dec0a848a1ad2015a256a7582a483b69b6ed0191beec2d84da74d67e8b066da44ac005b1f91505b0c6c1a68581a6d720f833b8e335f800d4d7a9056a69a908a582cbd84b6f42b8ca7615deb5cb19700ee9d3add5e21e10bcbf664e43579afc0d5e9670863e38dd1ebcc3468f85e00f985783055c6b9af5464a1a3ea823410b17512ba24ab120aecbfeea4c6fdc397db16e8cc52c86248223fb70bdcf27815f3770a5459d397d477b057d2c02ff12a2ab763083bbc0a59be40a993757885d03eeb699e105393576e29e284613f5a83d33a1b1213a3b8f1a51e5a0805dad38c9bb1dfda00e0092b78b7486df01aa76b4091337c436f70001787c8d323a166e0e32537b0643335634b56ef47182bfc2afd146cc13960140d5601cde17a76c41988c612186be6e414f40a7af450aa1580703f54d6815d0eca1431b7a83ff507bcb36881594e2759fd3d029a463a20da9507b6322a7f51f3b76c8c1af1950f8c51a62b9827d063e340d3f1ba3f3dba70501d8918a527babeeb269bfc8723ea19958c2f0c95bec967ebc5d96625a869e2a81232b1cd60545421e4a08abafeb8baefde3cd1f7366654843c6b4e955186253a5441f8a67cc0c9cca51397c7a8b11f28f41f86c021a3b08d73c99e3507deec2bc1a311351885eb9b0cca8ec3399755d4910057c7fc572c25536cd9f7da2e25c5320b52e449936e653d43837b27b8dee49528328b46fdd8dcadae99d2896c3e4d79ca4b55d4f964a9309290c4c14a213e01eca3d0d762338fbf9b4e3dc7d91cb97fbb409c9e6ba2c87f4b12657ab0a26e6ba4d860c614073b30ef361b90f7e77215e5eb872a405b216e2fad261b1fda2fba432953a3506a664c31cb27da63f4c4121d28c1783976e8fe1127cddf908ea293e594698065b627597610962438f78286c246002c4fd2ed2329f0c7a86d83c0a1e89cedb3b4570dce2a1ddf489b7b3de761497a0baae725e400b18e82f35778782374566c4a92da3d8e7a68bf6413862247866e67c16a21cef152a23901a0b853d3805fa2c45d352547d12e68fe74581836513fdc7db4b5e059ed08b9086bd44c9f29eae8ba0ba7e043a268b6bf88a7891b989ab1299af266a462396a26d7646f43f1c14fccfa543a61a5a1c6a08e38c66656eb788ac9f072d478faae983709cb976b096e043c171fef32d1415c54f863756ed5d6d9f1afd19bce06c4e9c134cd1b21e1fe34fcfbd33588eb02365cbf2b9be2e780e064aebf9e4b3b74931b7d4fa40393c801c0ae05e81ae2ba12c686f86ffb3de3f95b56610fbe9d80ab8be6a6ba8ec47122794ae5746cc26cbf069739f195fb67995cc77326fc339075b1e83860b3a1c14b04a3c6dc30fd4f1ccadcb0e12986f4bce714c1dcefdb481a4714cd0271638b052d44e933808388876b5ed559f38563b28db46167796b048714313ecf247b70a45b1811bf4716a55a4a01f395eeb9be660bd7a0e049675b1830e8f8fa10cacd25160304230808241d5cfc2705a57ee949c3c4a69a10b7d1ca033a58b39e3a380d3a293774d27f8efee653d19205df26d2ef5a4e621e0bcb8a6c4c61a4cd1248d876901ef996b8232fbac948ff4548149ede3ae8a063cb009290f904c60bc91fab4cfc3f0f5161ba179d84f97269ca13611bf6f0fec64d1f520f658d4dc7aa093ac2d19de24431095255d8e379d4df005685531e2bf9447183194770f26b0777bfb221e0c5abf64e4975ad90fa7f7f1d781db906dad5962a565771d96f19d0b3ff92c37561ad83d5b6d6fe343c3696abae364d4d2bd3c7ac32df1a62f6940c9b8c34a5087855f823019c7a2013aa2fa4c717ea4b79a015f6e616fce196c21ba80c4f7863435b45311afdaf04985345dbe2f807a4e93a1ad701b98d2945f3cb7086ce81a70331a10342435306a3604d402ad8e6df83373ec0b96249c3f297ca42b739ceee736e3167d7cb33fd8863d3156c514dae171c2373641535735cd79a8abfa5571d42c8bc0bc3b0d761aa54fb73bc0b1278ce8a27a74735cc3df1e380cf22ba602cef672d2745b6eb48437a2541cd67ed5ac14b577d6ce81c1e0c0b49fe393a8c4d084de540902104defb529196097d0efef626b60d195c3cabb591ebecea6bef04169697d967794084300cd063b2c445c89110fb981bca8b76d89c552fbac292c4f42b7a04034a3ed98004bb9a63fbc8456b5a6010757ddbcdf4e1efb21cabbfc908dbfdb8f1b33a6a05a2fdbfee5a3231c4f157cde55e0b162549e983cdca5a11d7f3bd71000174fb84afecc6f65337f620022a2b6798e3a89a4f13d5ed205d11634b7a183a1cde8786431c8f9cee0c2db58dbf7e161d5a826b45dd803163bca6f40de11097860d87c45ccc5111f30a71565058b998a82dd2ae9e51ddeacea81a422be5fa73e93001246fe815f12f5a0417b7ce82465442b3b957def2c8ebbbe1db567556c04bb4acc616706694309216babffd87504ee9bcf79330c29d0b7f9b87b7cb2d83ee6c3d6c7dd5a7262b654f618ccfc31007fc2271f4c0126a8d4e13b9a365947ded5425e9ea7ca3da9164eef8a18af4980004bd9052df3f69717a70f7543171cba232bfc648db6cd43762b40f419d33fb6c64ddeaff619fc65f38e0a065bfde363a7c5d0c7782ed77e2075a6ef7200d8f51989bda2d03a67036ab06b4adfcb07ef38a5672bb59ae607d181acc24cb16f1c8d7bd62c5f5c978a98b9d7f768a9cb2b326dab66b6993b8045ed7dea7c9a1fc0fab73593330ccd277394ecc9a2956f3d5d71c42bec07808d98a5c7045721fc3b7424cf43c22f2ef1859786b327c05d6500b8459cef6ecab228c23916c7a9a3b0f5ed1aa96e86a52bd9d7c608a763a9ae3db0947efb7df65201c1ce4ab71a06bf6545f11dce02d55a68c7abc6f23ba90ff59e32de7ec9df45deaa032062909eca0a7b9d0c6cc482ff4648bb5779446cc9af0eec998b831cecbd6406b17f90ffb899eaf311ba17d6170892419327384a9c2898788614ef74ba33f2b70618bc172037ec68a535df4a2640b49bc9b20dbcf6b712df8105556b44b5026b6015e218c7bf04bb1cd6c48d8ee7227696312118a98189dbbbe23686b08c4b9973e1beb11e98f9ca49ea41becad662c46a3f98c37a828c902393b4e6d159e2e002376febfda8866433a097f1eebcbe7704bcecb475615fb74064b63f1086e5adcb04f7f67c0e0d42061b73021097670057878166b1caf06b0407ffea9ce9122a0963bfeee95f04c7b88c615a620305da3d546bb5741768f5c7a06bccfb730bc4270973293af9f35116e1b8e0b2e60449d7c20f6923c9611e1605b2c0845944f427e1d2a79b88943d739b1ef3e622fa05ee189d05301fb080b6e8bc8a942bbc35a6fd93819aa62d4c9da5c186085c928588ae35e68151813cdff9f15357b43151619c41b1a8dc0b53eb2dc09776e2f0e5416310624307bf43a29b00cb758ddcfce337359f37faacf02c3d80c5c46c6b805180ecbc3a266ce39acfbdeca437efa01625f6e092aa0ee93c07f0cf984dc3cfa0fd89e7b0eb0a551e803233aa96fc21660a6082b312a950d263fb53d618a7d2e32734a5c75e2196056ee10a5c0ed126decc61810981e1f0d7f39894723cd41218ca78c51be3226d10f243e88dfa8e73b2622797f4c72c77c3a5dddf24488eb62e49e096362ec4ba1d7321dd6fe40cd5ea75293bffdd0ef8c97054e0ca0e6b96767d4ad94a402d402f557a52b13527d930af807149dc495649bd6a989eadf14f386e1c5c2ae29bc60b185618d9177f1b86175f53dd8dfc29527fc7323e9729c120aa45fefaa09e1047aaa7538f7848af113d12b255931f12d56cb1d416f49706bd7ef8ea466a7c3a1b7f0efd6c23866f783c5a71f5342662429d994e86096289c12dabaa1d5a5c9f3a4955e8cb3b2a53c3fb1db8f167ca933d4b08699c254f3f8d0bfd1a835beb5548e3257a3bd8a38ffe90ed41f0a4936bdaa02ec7c476835f3203c193b08559ab6bb63df410cb2750670cc910b0b789af7f31c7ac1c95e0735e3a8ae6db68923e1ba6ae558393fae03668add06f0bda30b5f41d0548760391681cb0c5e3455e03320d73e8470f3fd5d81bb6cf68144ff6cd6f623d23c7dc43dc77b7415538ed6a103f748ad6f2e7745158f7240040a9c7726219a10d227c3029e7f1f85330370812663a0f7bebf17d0fb0862f6a83c4a518015e4eab418b9830420db56a34ec4f4b5a3a67c1277aac42d87a2094eb4461518f9044e074039cae4213a4b9b1e58511f5a72a45b4d3091ef41371f992304ac3535275e3dc7cf11d076daef7cfe4001a884ee2253092c7ce2785ef01a0a498ae256b6f6d2c2052f5ff16b23346281b3954346b5b541973b47809aaf97ec32ef2b3b03645c58305750e8838305e5c4c550bf41c93cba14f52bd0816f5728b63becd50f6618eb97c455e8052ea8e712cb80e1b1148db18b944918c32a813c0196b84d2ff747da0dc1fc07ca67e65114a962c05c35d30eb41f70b392ff814025c2f15b5d609ded73b718afea36f20836367e21a6784bb39fe6535d7f8a4618a349a11076e83ccf0ccdbf81332ec518668ba82c7fee0509f3da07ba6d8fdd6286749703b60f440c340b70f4842c88df337db566f394d80efa10900210a4623e0d03e8f386461fec2cbae5ccbfe67874f53340f8e484922d5b40704912355d2b48f2976d027fd471ea05180da5b8bd3f037838bd42bc2bfee61b8443d0101b004e5bbf935e486ee35172681c47363ae0297553c2f30922baa105c08102eb0152c62ea556ce82b827745d1f4cb7f28132bd0776bf48157b2d7b5789bdafe45859dda175033f85f7cc437a52be675930060b9649ac8cb2cf8dc677b8ccc9461ee0ace6fa8a37761ab851621d790b7d2ffb1ad55d1b9bb9d25000174248eae4b47cb3cf7bc3342f705153ef9c03baf41a4ed48670a43dc43255252645c0afb6da5024d324de75e8407ba6cb38139d3131d884b6ba29888d975bdb6251d9a352599799c83eb9bded27d61a74b6b0468c314b270e3186feec7224fcde8c502d778cce602372f4cd5f72e862616568be9d8b93f26475743af5524f4d612715741111835d0e841fefe5beeb316e22081a05e5f9509fb79575d92d5421f03d186b6488c4fa61e713d66f0d097d7f5b90f835a3d40827319619ad6803b326b641b183c6b08034787451dc221003774a2a5aa1cc039ef8386bc0168c228940df3e2527247db022ec8d09f35542abb26230e5af439e054d33311364c235cb0e9f92a4efa0d28dd93f36b021bd27cbeb38ef69df8d4221ab333535c42180abdc7e9d6c7da4991f8bb1bdf642c75dcc37783d7773f3eccd7565948daa7aa501c74115a63b63375c00bce93948549004eb8353e18518b5d50bf6b2a5bc9b03f0781ad1064510e8bdb1f1cd6f31f9720185167d9c42323d17fef5cd90e91d513460553204255f33a03b4ac04869a2d7ac54899a17b59b6dab912951153425dfd178fb80377159dc8f427904646e249625ab2599ee5ef7039db1c427f065947b2c4f843e5f1707c1d5666aaf9faa5e0c1a7be67ed392258e770fb70da221f3c95cf318b7cbea886d40b070ddc60cec1128d174fc911bff2ad086c067b96559ba39b09958399f4051d7a36129588a40b290346690afe9f9b2a7ae1fc5452067cc6504f1375119f84f55f70f08a1653abbdb163446281f476dc65ed1135277e57fedafb23e62d5b791eee76120cdde7b3f07da1e5e2194b4bea18b0c77c74825614d3b07826af2f9735c1693898331a88598b864c931b4e129f8be88c81ac505fc5c17b6a67c584dd67af761567187cba9846665d0956a12fbabad0671fb81db896b3bcc003228892ed7380e330130d1e291858e3ac0f1452244eb7c19b48629b3fa78e63551bbf23f511dafd4f8d1b7919a643f43d1bd12604fa0047d7385d3f277f9d57a80ac2c252774b479b25b57f3fbeea5b08ff181fbbcfab20267729b60e991004096f2985c938dd2350a9710941b395ac359547902270aae9812acfc34bfbc50b63d8aa9c310a9fe285d14f2bfd16a7246d5e462aa82f85c8753d178668b0745bb74a3d5cc36708d01d14b2e5e307daa67b24d57b3716276475dbd56c9db5558f5b5a53048a8d7016b5f138df35a93482563d2a66cb475710420d4c87d9891967886e257b3e33cd83bb75b338241b4852c858051c166301e5a279dc9b99c874baf59cecdbab8ec9661c72205a05b72d9837e5e13a995cf0505472f3928f9803335cafadba31ed4adf6f454f08dba5e8c0abb5b90fb0fc5d76d14fea831fc7c15e3a680bf2eb8e26a8c7179f9cd5d80f7309dff634409cfb76460e465fd1583b901b447ede8892a341a65c38e8549957f282041697971f459cd87d4a3434b7f45ce40a31c36a462d3e809f1514d09ad0efa0c3dce01748936ef2404119a9b73a62a9c03f12245307e6bd55287ca8faa7a1e86b6078342334925f21edfcec35da94ac4ac1eee8b15a922ae04eae5b0dcc4661acdae211b9d1500ab17d191da1aca8225d580b5bf82d5c150ba5dbcd5999e2e3814232e195de9b4994e2d6fb2fe3f6b43b29d7956d2119573b0cfa34a1ed8133a57459422e3c4246c5dc60144cb293d4da98dc824a2e4cb1bf4ddee5679c99fd5cdc4b9503e0275963e13440be59303d4f4bdffe607d07d5f6c52aff76e4f1a5a8e9b42bba97835b4955f0468918674b04ba95591d98b420294f11d6236aa4648a4ca46245c9762b111f9c566d364818bce9ef120ab45d4ac598ead45986c4424e8247a28aad29e9da3c27ecca70bb37c166480435bd2028c6c5cd797888a6b8393689a296da0866b1024f792b6c875948687aaa40309a89b5f903cc2d2d63a4a1d3991c28e5f2d7f446dcb2e679691207299efc15ee87572a10ddfb335e6da67dd400b9b9b6256971209905189e6ab36884ae30d1949f5ce03c81a7d54d3e7d1f0079ab57d8158137b33d5342987d98dea08b4c127dd952ff40956d168a346685049f961ab6635c1627f386c36bde4c4064bd00acf7ffbaf413678faf70e08cc54103dfc6a6548bef5ccafa60c5f365503ce0e70bc581b414fb0c501880914d21e20d48c9f3e2799c3abd16b6b5a9401baa07715534955f87cfb1bb627a795b610d804019dba52416fe408ae2b44166595af440a700b5f43f086f34e6e6fce4afe82e0eb3126aba3aa32cb8bf9628828a5addc522562474375e72d4d6c790aa739e3a38aacda7a7b2c440109413084bbfae1f2f7c5bfd408d53b8b9bf755bda213cab3b9f3415f1f894b30b3dcc7a6046e7675f5b3a28310bb74eea35ed67c83b97a47d8ac920a2c782771984297ca9234b6f2bce007c35d6d6627baa2bfb3e5487a77f84528ec9d50c2e7b7a152569fc033cd9558d6bb026a08096ade932c627d33374690180e24095b4c8d0e7bbc4831cc4ce63583c7911b7e9679c2b91a3d8c064ea461f2735d1f15d99cba5576fcc87c32ac093a0422b14f808cab14f32fbbcad8826e391ea1e808e88866441cace1a483a270c74fae90904ba7fc11b9be8d405af0ea73f7184e6528196dacc5ee25e518e734c4f5cd3f9dbbad1546928bdead044612bc0d32068b7f301f9227a1ae0d35cf0b61377d1ac1b57798eccb17b6cee58f14890b28c58399f3e67f4229c90ab951fc9506b8899fcd6e95a49abe20fdd6999f26d3d026f92eeeeb27c6d83a8cc329714c8adedd8f8be95b323818af50dc2166cb0e7a295543b0c2499701b31dbdb57331cdba7276422b4c1e2608016d8442d3a370f4fa22f9e62ef35dcbeb27053f284ef57872f6d4b6213324f0cf654fe68dc88f97ce9161d51b28c6cf16662a0358a38541a985a8cc34ef20cfc706ff106a7a7211ea3f76f634c1886bd18320b8ef62307add33a82e79812d3ade33ba34dadd96cbc9be9cee55d4264fdafc7129598367ee9213f9c2ad63da7554e1ca7785b2f1ad0bac235c78f70d790b38c8f61a35a02e9c6e11daa8188e37be39d6b40560e24a8825dd7655b15d88ef41d79e30ff0e7a32041325f6b46f3dd4398b229c71619f8b50ea0a27cde209418d26b83a907589ebf708a84ec41cc30b124973dea5a37f2909d9d5bf2e496908abae571ce359fa4b437c86aeee02c08b246065a7760dff3c1cfa817c31c59f620cd32a746ee952b25b15e1200fe329b3bae1c686ac7429f0d48b0598b9d16f9760224fea9753703af5d12476fdd999d6918c2d77b2238827d6f518fadab2e6f7b3c98960ac5f2609cc8afddae54e3ac61833215132758ce405bbc0a70eeeb4314c5f37ae2e700ba73c19f170ee0524928db512abf67111c1890a6c2fe4c9a4b7f3eaf0f664382dc193dde435fbd0ca84cb1ac323ec2ac3f2996055a918d83f173cb9f27ec041173cf9cdbbb1e4742585fb45c982f3d71eedd28905336bb531b9a7279d52c413ed64ed02d9866a145e96c6e079e8784224639be5b264167f8de8104fba23c06ebd3246d0d787c87b5aa5bf1ebabe96868d3de3cd8b537c2af1c7fa889419a6c2695b909e04ce98b392aac68fdf84a4379f327da6aafbb8d3c5036506da0b7d30e8b5d151e223d0c13f2ca85f769f8c68f2c8b1a899fee278fb6d5c457a86357f3501c4469c0529931c5276d7f5f19d7ee25c5bf8f037a68bee0f3854fe83a5fb9aeaa96736f99b8bdfd7624b68ad9a8c7566321256631aa6e65a364c747d95f320c434d3f25ec2a8512dd1d04969ecee0de828e6cd640d7cf7e03ae114006ef0b50bcad3b878364e32a5b6ba0718a7e931e780c30ed043fda17f5f94d2752e7592ab4f855aae610111b735f6c724d24d3feabda48b575769dc18e22ba5d353165b8ed11b0823707f948cf601b6bae78f602e83ff6544dad28e6df16201a94fb608651f749882b14583c1289e71de9fc3a44a80f9c4afc50296fc1c1f6b24e1bfc4dc029589f742496ee228af185892891944eaf254a4c59aad4400541a1a1fd6f4f9afbdee8115e5d52007baba076e98b8cf4ecf6a6fb65311cac83939213f9c21cca0a7e156262e94b20544122ef7a958bc74cea9babafd90044db0f5d27acaefbc6d5b79691d4f9e2780825d3c7257fd1d848998b181e0cb17e4a3b18941c1eaf5b0e4d3fd8d2355f110d2fd96b1cf729b773378538e0a7d9f06f06ec5159bc73e9c5918ee88603cfc92a9da8e3c590507e71c265490d57c7e288c24e1be863b37d4c610b6a3f8009ddd810342ab732cdb7a6c6fefa1ee81a894d18f0a7a82daa61aa1f6094281551ede8e0dda645d886a8fb143ca2f88982efe046c1c9e0485717ccb3742b42709699bcc901389c43c287a22a6e0975ba5c417ea9a74ce4b827e05d0ccfe7e1cbc57d2b3f08feab6316383e79b359f46044a8971a434b8f1d4f2236d0f47960caa0b104502219ccb59742abbfd9f2ebfe70a15835ca071fe9d2fd1043f7d76b85cf11e72059e2d75f829cbfd20b0bf613f64c6bcf3eed0ac7f6b3a893ef2bb23fa7942bee9987124a8f8574fcc067d3bfe6264ddc47b73a2118575045a6d9b1d4ea6da1653b1b6d7318a941dd6fa4122949195437693d9082d22ea87e2b2f3b442ea40afede338f5d1b28f70c546367b0157433dc98812ace281107dd4152ffef22c5622b700049e48e453ab447670a7baf217f3b9483cca50605954fa48050feafae6c1796b54ee60e9ba8cbe326bc68981787c77ff7635dddb1aa0bb67b9ccc4c2ba0b1ed395fa2232e43a7e693794c321668085a794e762aba4afcd18f308adac9b057f2540acf40c648a8a4dab45b052725ea7a09fda677ae0ed3af346b9a93e69c81cfd28c00e584a55a37f812a9bdd854f3c0ab7781c931d232eb1c2b851a9babc4c74d240042138a776b05464252150e11bceaed4fbb0bc686e82a5d109d56c5805c49b5bbbb270f49440e654893116741a280feb56f114870080829707a10cfc1dcad865925e73908b3a83b720b39ecbcb52673ff4c34e45a8ec2068288951999c8cf3a48ba53476d6930e486c3d8de941788fd23034e4a0bedfbd7da502283fcbf91f6c4518b28ae2e6073c055aa25ebcf9d08fdbe30abefa1251f712f829905e3ed3b0c81cb78015003706355c889d75216dbb505d00c7c40367609d9b85f372a91cb1d65020c4d9c82d783a255c7d547b208084e2663199ba9f0e579dc841b20bb3cd92b2244614959c39d61b20e7f1ccd6e0a43fb25e22c650bde901ff21651bbc795030ad25548d1373e85d05fe4300b64b229d3273f60d90212bfef5178a98be82dbe7e561544febd003b29ed679fe3e421f9d90615194c1658c7c0969697951fdddb41050b1411b1c77ac5c7e8f25d68a92a514d0078b9014d2c800089e31f838b0333d8d6c46a7f94046096c0679d07fc242902f03edcb7624bac8eae969c6fb4708639672494a4f67365de1c6c40d00d56cbf2209e8e0eeac77fefc73a0e37a0e6ae344611fc25fdec90e778f48a20eda50a35e48256ad1595f6949dd1c7496b3a0ac517533cbcc9ad42e700cd815ac405215e82ef098b6b7ac9915377f5b94c7d23b1e451ee06a79384849596576bf183d8c09d4cbd2283ef3cb8777e5d772a6f9395db3037a67e52b35f693718d1c5e505c890260b051d63d84edbfebd560686c9921676b36cfc55c20ca35ae0eb8e11a177a0e634ef32e2253746a782015aea5a8ccba41199772830c160708a419067633b9d30bba933807eef33e30f406973113ed4cacecd1750b6190fff58b38daf22ab06ddb1f3bbd8fba2db0d4a25f969ffdac06ae3e086e8a80fa35dad9042023586c1c830ff7ca299eba01fc93f5f4956a2ba882fec6353a113299bd84c5916bd095493e584f6b180f81a63d5876f89b3d9d9413ad61fb50df11fe2fe24fa7b188e98d8e509daa844a3609ff1e16d1e76f8ea46dea77d83a8da4b8b8e5399bbd0774f4bca985dff8d098140cb8b72cd249c61fb29c4b710d05129665e4e016830ea1de913b46dd8bb95c2db5395125455efb85e17855aef5bbc6c1cfa31145a932d00721f9c33879bd15064f78a5ddb242432cf0ff0b5a0a989e336c7312d04829aecdf36169e89fa4d025cf08c63cc8e750977b2539f110887e395d631633e2fb4715e36587a0bde726c64c72fe0ea988ad9a0a08923e5a3bca925d466191d367fe7899cedfc3a647421b4a7cc2b72fd744dd78f3b9a791c8bd5c27b7a02058f9ec91e89999a5a8d1e86368baf6f8240822a4c7f7ed5be7d9504cde1c840612a0c1bf4c33c4141494b4928af983da6d36dc8475965827140d9c872c0dd1ba16a62b1c2d3a94fcc24c179cfebce3cf108355d1c09eacfa2355a51afaa8d92470707def06fe80f01109bc037aebb9f45f3e7ab738a1d7f23410175ef227bf8d835ca8e6f4842e231342a0fba57dcf6f54a308668480600cb9f1e063ddaf1e9a0189bb35373d5aca6402456f1b94300f976596f8ae37500bbb1cffb0d4052c066d148af94875720d8451a6273c99cce596b50a220bf8b3916e8921c8d1759f3d6058b2c0753a546bf566b1900fe7779f68f20d913127b24e9ca2f59cdbf57d71096918550496405f32896858561098065e98602d37ce9c580a14d4ef95db564ffbf615dadc30844a84c9d4f42b98b3a7ad2efa3afdc5297c3ad22bc8f344207df2d7a89d3c93a1ff3094e8cc9bed49727f6f07254371deed2d7d6e3244973bb33ee7252df97afd4984092602f83a4d470a9ca4e290ecdf57e5a3ef3fe27bd0a0892a56e271836e4605d812c28eec041fbb5f83ede7791b449d9550a3cb3b8907be5179631f0485ab0266991b348e48a077d630982254415027cb09e942586ebc9eba1beda2371f85b98f50ee28853a4c105e98e92c3abe90a7b015e85af54f4e49b30ba8eaa281184c3bbd466fa096526a0e4d680f3f71df0e5a29f544c8551b134233d564e9234484833c53796ffaf81807906377ac31a8cae12d313e0012b25c8ecc1605bdd5c305320ee64b4a22afa64b9d0964f3b6550e3c6f26375a1c6a2981876b588f3e9b6f026f2ddbde7648e686af1f01179a46109bf2fad16a3b69044923b49addf9816164347449f27671dadecee680886ed7b623ae0c5549a95d2a00a58f9f09585166515c8658d34c9e25b92d4ec959cb3d1fd0a68fc7f50d22b826bcb55721acc6b226fa226a2cf5644d379840ac7ef90c0c3924a333b181d7381ef3519d9551c82a810f952acc5032555022d70d64a9c4c0694cb7876d0ee1278e207b34bcc18b91a48ccdbb1ce24049c0bcfc2af17d00b461053ba5407210c6838ea5e113fe544553627c1b6aed512217192088b9d86b02bdb00af465afed0069340212c933d3f677e1806a6a78755c80570cd60ff3838f1770f18d84d0b5375135cffbf4143e9404c682756475f4bd0cbc129c2b45912fcc6c3cf22dc92b94f280497a847c523676ddf6dda7fbb9bb0535f4c9b366e467761219536fb2cb310048e2f4721ff8bd3fd12f5e0120b1f25abee2c318aa903fb36217240a84638511112de160703851000aeb5b29dcc1e649eaa42744e71855919a0d360700d2506326531d6a964bc97d5969a7261068e194a8d366885ae64440d9eaa830600e423700673c4f1957b111e315eaf2a5f12da874d994307c3ecc4b7e08d2704f3bbbeaef9968fc25c3fed325a878581b01dc9a1118c62744b5e61c2a0a52030b714367ff9474a603febf52e6094fc29c257d10c565550c22d14b7081e21ddc2d2ef1ebc600cf751dc19af67ac86070d80528538e27807ea8aed04aec8353d8fa1c9de9eca1cd48d8ab4234945255c6683bc8960e6fe199056b294ff2fbd7ebaa33b325e8d5b05740517f42277fbc55434f670d34b0ab576faab32981398dca24b8ecc7c8e31908cb2e6406e446bac7c63539a0ee3086f882cd3acc128eb08ef34dcec5f90e6d8aed52e793bb0dc1bedeea7521dd3a481db3f9d550cf392655b297bdb44659cac040fc12be2cc69c16f875cd26e197f00354864965cfd829846cdf0af58d78aaa2e0cb66c48d6c3e636bbe6df292e62dba9e21b8925b64bdfea254afcc63a1a0c7a93f46574e37b6db4fc5636014c0aca8ab0fb041e0ae27f6e0e3e67127ad7e42c68afd4dec935482cd1d97d8d40c8673b8472be98b7e72fe174462c6cdfc0d4b0cd41c756d73ffbc936325f2315f349924a356c62869763cc94b67a257596f051a5df24db7add8c0bdfd6083f5911599d325bae0a297d59f6023186a921cacd9e20634ea31809b7c30c61d9b1eb914ff3d94345513660a5c4078fe5c289082f573ee39473713183e1fe88e1f1cdef6dc1efd122c5f9fe8352b570212c0bd7609c437430feb2713dc329548c361ecd13b7ce1f2bf3aed689b69a5e7ad2922336ca2de918e3905856354e94b78ffc29ac4bfabd074c5c5329c68ccd0e9a4db86f8acefa15c5fde2e46b1dcdae93d5977061fdeaded28e9bbcca92e23ffa3332913d0d99ab648d9cfdcd6eec610e181abc18895c3ced82d564ca7be8ef9b45bbd2909307aa262c0391a0c21cd28c8bae16eddc5b712e1195805c495af0309841c8bd835180a7f822d2b423fa2be7ccb0c1bae1cf4dae1ed2eb6b174dd5d67c0339c70b69503e0c7e4158b682f5e6c5ef0fe625d8ab983cfad431602e3eb2321fc47583712b61c221eb30340f58337d2f8b6e38d8490b4c7290a2dde38ce898d8193294722a343f9e43ae6cc7374e5c10f3f223e6f4e4686a7a99aebc56ca4206a441fe2815325888896b2cbcc8c3a55801c22d3d393fd620eb972d8ae15b76d81e6cf645b61929ca4ff2d73d421a83eeefe012d01425bf66e8e6b94721083d084c1eca9f5604b98df779c072ae795a22672c96f00fbe1e3def533bb65170aeaa8f9e1b3a6428794d3a900d1eb91a0e24b5803d981f728ef343c5dfba59fdc7c1bc31ee8241b91d2179f7c005c9b85023f6b481729fbc74c85b85b6a18660c8564857bb494d24714b23a4d2ee0851f50d2c70f0ee222d96fa4f5619bdd08f5245855fe18c1e5706a3e17f9c0d6ca362b44551106fac2af47343e4f01fa7103e263faa84e81a8215667caec395b8e5dac707ab3fb53aa88ee5b45a984a324865112b208d34df25610a994f0f1bbe12344b0cbf41515d848cf750454e34c8c7b13478cfc42c9e309720bbcec80312a29844e4191b48137aed2f395b6a52ef594eb8a683541f59ed5998b845baec1f24e47b0ce16680b641553eb148c77516e894c41e219be26d9cb2926d18c5ba737fc81a1a0087d61115216090d889f9f19f0d85098793e4edfad9fb0b720c3f3acaf17b87bb90ebfaaf3bc72cafd3d5c0ae7e0dd462dc39f88f2f4953cbc9aff8611ad936f4682f1938e2a6ffe8ddf5646979030f9c9cbcb0baca3480b3df9c42bb0063bd8773ea7855ec6e0ce6dcfe0f07b6e6322e4273032a4115773e14a17cbd2a2446311769b12b9885fba251d79a555f089d337035442de8716221f6399799e39cad3638559a7b0d75af7e64090b1c1a76921a3eee7666a3fb2e8a3a21ffba77db29b5b8141927d68fdc9464b2cd384e2657135a44c65603830a5618d9eec19dd3e47d0eac61e378eb475cbda24cc27d23362cf1acf0e12a807564b15a75e710b6cfc010a33753f60508eb26d0e6b351e9ec86702a736ff899e10b52c90f0c8fa099e3260389ed0d209a4e3798141b94b86a44be276a80de12082fc173cfc5a00d0bb85b7d1fca72cb028bb135caaeeaf30eeaaffcd96d9c4d40002f46627f1bb6bb6b79432492903e603dc03c103d6bede30c899192819167538165d3c638e69256c1e1c9b8deb59e16ed9e6e9689dd14cee70acc3446378c3ae8d5213a5a4182d17d3748b055a3870a175360cd8f87d6d8f16c2f73b56bb5e74822565155f1ecdb3d9b8b67e7a298ed13d810123fe9c67dc8f6692d096decb8247550613dad6a1a5e642c602c45a6b9f5a6badb5d65a6b2b0cdf3d320a002f41887e3bd653adb2e3575f63ec5d9252b275bb604b7486e5a592918b058c8872a6e26b8ff7de910c0c2ee09d8e306032458beb5e2653cc3d05674a1253a2702864a0ffff96ac96c579a70c654d1dc348de1792ea27070b2aa2d678f17e3c80413be49ca9c8a499128944fa170ed4dac472dea6c8832b423aeb11e88ecd2237c457fc36680104a42443a3163fc4a450c9d9a2a2c0fed7cfa75aa37ed6c003a17b3e85f9148ab8bcae10f19d62e546603f3dde4a4ca9c4f1a03b6e9552addbc2567cd01db74c7de35d1247b2343d261e42f70d3ee8058b7168bbbc18690c632108733e2ab81826269fb21763b7c6f2e95f3e3ad8229e3b7358973b028332903920722cebca54f9944ff96473e52ec7906748e5533e1dd13d668cc1728ea19167a07b8c3e5d5b95ad72276c39699f138861b59e973d3105ef616674f66e704f74e8411b6089e1057580d278fc79812586f94396ad0b9483a5d845627b73e566614c3b6f5da86434c6599e287caa74e7799e3a74e8c0202074a7670f81db1d836198057d00e3900e971732c0309644777a76e7cdabcc86b302440811202a8744891a8290729e6942690674a7a3492507026709a1cc0d0e4b0811204244c699171068935028c4449b5a775c9d5c789c900afa8105ba63f38465c2f14d1363139b246c62a020ba6313336fd6999233c69d0cd905bae7ce64f5dc61149098ac13a782501da3a4121c0f93f7352aa0d6c021864b9b8259bb14ccceec521d0aff2283eeb903adc9cb8a5c3843c2edbe516bfceeb0ea5f2a127bd3755dd7755dd7755d07ea9e3b24d6f443f8909c3241de73a7b2a69e895d8d0db72f18709f771ed809cf461740b49c6baab6505fa8271d3ae88c262a14a1c5e13ccff3739e2123f0448622ca64193a838b5266241606dfd897f33c2d8b87e0fd11823844e1f3029535f56bb3412c14af912ccd560e97824b06248356c3bae1a020bd0e0804ad9649e6c6e72c09dd738ee7ad367a922a72759e55a5e3f383ee993c5be48a8524c94c922449dec86499c93c927142f74c8667eee8494f7a5a11f29e4b6bea1ac85510254be176e3110e4b3a74187b44300bba672f0bada963d98d35f5bd312b5aaa345b673ee514aa1c42661b8b613ce89e3d56288ebcee5e22792d79ddff51a27bf6b6e889a5d93a31c6e14d200a22e30d7ce31303ddb3277a58db32c7c4d71e56cabf7feddb6d2f232c0dba5fdaa839b126d29aba3d45a1820294c6ef0bb4a78711314a84ffad279df1fb026b8d3baa31a022fcfe2b46f0373f25d0fd02b9d6b2a6dfbffb05f21f5d2a28bcee2a5657785678ddfdfaf07672c199a0e65c9a31c0084d483bef50773a9a25038cb0f38e42773a921023521c6e656e8021aa79c642880a5cad562b8c3f1c4782f056784567489183affd0cc91ee35889d95be5d5157a5f92247194709024c955a13b2549906d6a8dcfab1b330ba034eecec02cccc46ccc486ef1571cb5c6570ae59385ee9414f3ea570f43fff3eaf32aaff2cae6921b428736268ea5f005198db163841964e199b0824b1213b24d33d184153213b291915aa372faa24ec7d66e8116ded978e31777db18fb6ebb7dba0a8326b05fc12ae44cf094c25532f702ecea01c34036375023a020419b08419718a14976d092a851f07a650a2da0a8539ca82950c2513ef8169d99083c21cac8f4106a276bea5a8bdbad9ddceeedd43ab7d3967a186db38c97876ba186641c11194ae36a1f24afa1f806fab694b9819d929d929d92295e3bbd21499254752c3a48c9a80c520973b640d5b4901411bbdcb928cb3297b92c73994b100c24496aee862d308e5be99e4b1b991b64ebec38b2ac5560d80707ecc491e312a15056604a15250e1c2023bae7923cb7b0a60db6ee2d0298a8e13ef04869413174b5c3b865058358a89d3575edabd1424dac5f05b54f03b5b0d610374de4116157087244e00f8b822488874f0d1e583fac65856ba27b6ed55853a7a70e6bfafda981e7b3c2524cd350c6a160d482b4360e04505c7c44a0413470dc129f8f2afc7fd007a7d5d2b292d23db77616f388a3f9a034eee5000b00b45a2d9c5b5f255b0f53c1af55bfd6985b9f148472300e5b4a8cc04a05eb87eb3745f7dcd27c58abd558cdc66a438ad08a701d686387c75b1a35e4504f5b438266ddd6733fdc1b31319f2962ba1a7d5718e3d26980116440da787740777c92a059378f37f8c432e058bae373db642b6bea24e8500cbe422d4ee1c1934e29a5f4ba59c6137cd319ffff9852fadfc27fd7dbc269a682534a29f5800a5d37bd17a33b385625f3408a6affe26caffd2d4f29859175346d497457194e2a6eb957df7b6534b9ffffdff25f6dc79bf2fb5bc6debde39a41ebe28b45199928e1bdf7de7bf1a62449f85756733c4c3692a961299324ac35cbaa1332363c9e8bf386d1d242c72cd3b28baf6c09bef6e38bca50b1330a6557f4fc13702349784732b556259bf9f7627c45715dd7755dd7b58917cb8d8b6b5f8ff385fddf60ff5f820edd9efa1e4f8631c6348ded8ad52c0b3d4ce77e47d3f0de30a6176358cdb2e839cf3e5f37b6d27b5972ddfe5f64e92c51b5979a4fc307d2f07d20087e56efbdd90c1de9c8b54063f33b1bdbbf714e09d8fbfe25dfdf33b5461e71f7ff4159e8bbf3c62a6c3343c919bd6a4274c209100c6700c119401004c1b045d74083ca9bf2abf178aa029ef1cea3170ca0417934288fd66bab60ad89f23ca2417934a89535f57ab2bf69502b9ed1a03e4ba2fcff6950452c89721ad4d568509ff52c8ce634a8219c06b5e276a341ad284783a2410df9110dea5ab12ebe30c6b8096df1755d178631be17637c31be70cdf5e27bb1063defc361e5e1b05a799ef75589b200ca6f159cff6fc0f3e06f2d8f8cd2ed7757c1f2abd17ab295d2968bdfd2a7d5565a29a574db8da37674354e0204c3acba37df9c55b546fefd1708ff4dedff2542f7acfa70eb3b6e9918988119187a4aa0526113a3d86c991734e6acfa8c7437d5dd1afbf4cd1fc803fabbd9ace126078920715b6daa4d051ab5284030ec3eb0fb3e10044392c425909104328e2449e232f3b2efedf7f7ef5f2cbb248d85344807ddb199d5bccdeade22fc8ab06ab4fbed6f6adf665ee6b5b0b935218e220c61288a221eff3442d36f9da7c64e8d5d394f9bf3b439cff33cf369c912294e97dcd4dcad395d7283e255582e1e095dc5c66a39df1de2f10112fa8e76d796147a41b7843476b1694d3c3a4e99b43ccd29939607f8a96e0eb8b7e5d2c75aac386552a5080f71ca240b1af0ec2bc6a35e9ccd2452b8203e4cdc2a3e33a04c500bd4b4b9cc2b44a03b36b3212c5ee236b4332fe312665eb14329f3d13d8cb5093f3c78564574c722076583af317e42f7fdfbf7efdfbfb98897608e06ba63514a694dbf3170453cc4bed4fd188f76ac600256fd8ba755e452696c338e75ac631d47521db92b18a67528b43789f45d89999a64634a1286fd0fdd43dc86b82b544e8664cec9694db4f4ae9336ada99332155c478ce58ceb18448726dcaa6a976bd7d201dd313e7638ded80ad7a9888d8d5249605dd07de3e414ceea4f210e26decf123678ef7ded546aa7b6b7bfdca5766a7b39f52f9c14d7a531ac05dd774ead52a99410389f844731af4bb56bb0a14b5d290de8be5337ac9ee170dbb3108b8f89d684634d79e358ebc46216efbb0831ec60cb8112a2285e376e90c4a7ff2283182926959cf1f5b820e695d7e28288e01df4f5926911dda9585ed70dba845226ba53b1947293008c5d28e1a8c040ef182596624d3d84520c52081bdba17ff97d6591f658fd507d9ac49af01879b70bbc407bb21ef830f6024f7a7581f6f401ad914af0ba99284d603e69f1ae9ddc08af5b0824b869fa50cdba85ee9524496b3b1b839dc19eec091403ddab782a2f7bbac40e7240a9a2bc222f3486d9a03b164d8009d1f9b4c0f38992817e68a0203650c702bac1c587069a1b0213b9213e1f0e5c221f3ff01e83c44b94ee6d3fa059c8c11c0dca8725518e457b3bbc8a70d7022262838f83cf1400808e843816b87c82e800e4c30b24608c01e0420180bc012cd95c12a29bfc320281079f2362808410600a199c0f1fc440a2f2f26952004e091072cea01e301c829673fe1899f180138060d8fac0d6f78120185e01c130a4431ca8038cd21ef8b3a6de12daa11d0a59619aad20a519a42c4dd3bc4292e547921f499224598ae258238a35a2288ae2686e66cda6ccefbf31a5920674bf52243ae3f7957a01e17261874258e87ea5b6d29a3a9649de4b29cdc260fb4bd8663337f3eaaed4d662595913db2fb4ab6d16bab1ec13366deff8bd8d4e60d976b4c36e9611cfaeb6b5118c18518988ee3038de18e7bcb17b6d695770317651addf7d5ddabeec66c38355962d01bab7ba7bd0bd69598707bf2a5c9e8dec0aaa089e1eeaee887aa01babfbd26cb53cc254741ce3f7c3f2c62e90ed38a23bdd82ffa64cb4f85e72c8603ceab475ed7b3dc639be7ed674f78f5aa3dac0fc12fdfed2c3b02f8fd9c8f130bf53d0b1ff72278a9c1c044e9954a172817a801c34cbe79da56cb7afa68dae25613ae38a5448e1d49d863294c609d694eddf38ac49443f8ef7d572b0ec4cba441fb040dbedc5b6e5781850eb743a6540859335551f5a9cb4a665845239e534e19d9e3941f05e5103f88de50a51263929fe1b863581c07f9ff0b55efb8a5e5ca319548fef817177b4c3d355b099086f36b2eb4504b604503d740f17a315487e6d1e3c8b2e2d8b36962d6379f07bf936b23faa089ead897af5b8a788c733a296d4c1b68cc576dd2ec6356bba59a3d5cb4129a594562f877df94e4b4a3fcd726796512a60506bbf5e8c73be2e0c6bd2e9641e0fce326ddb2aaeb5561616120bfab78baf21ad31c6dce70513fa471d2301816aad2050cb66a3830f444d9ba0402ec20bda135ad27397908b8b0b0038d8c0c5a505e4e2e2f271e1b48b8b4ba73ac0c36fe7f15944e258d42bdd1ae0e1d707fce606e33cb2264e8362d9ca628522ce632c5a12e534a8d19228b734281cecc6c2d03064b1404ba234a8d09228ff9c3ca267b4425be1113da247f4889e511447194f4451c6135114457104c170efbd474074df1b0441d206497b8747642f7f40e4555e652f7bf923c9d28691b4611c49922caf8060f803047f80200882e69123430c41529156385ffc9b546be4df7f7ff702680c43a23b89ffde2a15a9442a91481d2c8c885248010a119253dd11fa889ccaa99cca9d5903254f9e80201816f181457c1f0882a1e77de0ca03572bcff3be2b2459b24692358e244996579070e20434cd560ca61983699aa6d922c9f20692bc81244992069514a8644d9b2b1d640320800000b3160000180c08078562912c8d23b1c7f814000e4f6a3c5e5240368ec762e1502847511444311883000c02010c0200a48c430e297c004a88ce44bf8ab106874144fd3b54967914ba45556ca8e1d83862b39986bda97098b486de66dba4e9c0c434be265ae3d784687c5c5cd3b789687c5c98a6af09d1b04fd101e6e646a7e3e1cd9f2477ff83c62855cd91d70bca9e1a8fcedfb5986e0854be060d0b384c48f788f82344737ed2f90ecd9c5b2516d7399658832748a89e458873e34762e2604cea91ab4b409b815f2384c4a29da67b7e59167bf8df016e60f38625a434b83cdfbc33014d5f13adf175219a3e26aef1ed229a3e26dcf8bab8e96322353e2e40d3c7c48d8f9ffa0b2bfa68d2b9b551ca0145475b350c958a37cae6b746cdf269de9cb0f135319a1f276e7c98b8f9718234be26a479becd25819152ac1c46306d764d22320d8072d7c78525ef5b8391550db325ec05ad7a5194c302565488db5692fc5628691846025520d0cceb9e829325ad24052e0c7e92b8fa7e20584b0d6b5f93d0adb1250d4d8e0501444ad4a10009ab8446c7ed807918cb9a39518b66fe8bd3803d2120c2b86a8344575a1c0c46e0917f2127576dfa202fd3aa12796c03a0329a7fe36082cfdf48e939385dab2761358ca1de56f6f47b9878a9d409e29861e94727ba63b26f2d7b9e74a9d009833163e9452fbb3e76806af4fbf1a7bf961ee35d6051290304f68fe86f21b85dda231074375729024369ef2bb00bd0184ce1797242fc6833cccf8ed1f0a732da80ccfa7b36a7c4a2de56830f180a3063a8975ae379ea0126ed20965db86b319637f2222df1d827fd500ea18b0accb6a7533402f6ab00c30f4e12387ecdc0af83422d12fa88fde6c518d49455b375d3a9520fbf33f2586cab77c76671f7e4c2b4dd33d53e60b0e7027007f5d2f62645d888ba89f88300f08e464781329d13c2430150bcd5130ff94f7fd86c0af989ea01239b577847e6f276ded9132e79cd1ad9d341ea3bb4b23d260332ade21a31be1901bf5c00823c9488cfd9b3e4d37b30b2ada007a772b5a1be91b995724bc6882011238848fed057a5576fc9a3bcefaf5e39d1e8598c86e8492a79cef7ae5163a571a18e953d370589e9ca098c2ddfdaf92556b611df1e6b40bcea95073f04072347059f3632c33160d6261f2cc192a152aac15697c366db5d88e123ffe06ff5ae17d33acd65becbd357e72b5cd8db582e06693a1f504cd22aac9ba52d272fad68fdd4c00988e0cfbf163f24c7e5d1672d39d1c4155b8b40548dca1951716fd64dea7a7ebedd33ea6d104b214ced1ac4f76d7bd583607ad25584241ec9758a36aa18d26cad19c1af63bdd1a2f4260159dc0cdc67d2ed49002b1f3e32c9b4436e42962bf7c8c58428dc5ec0865181d76ccf165dc030bd5a3402c68bbc27146367435415a1ec211b1c4f4fc26db54706c34782ca2816fd8314e2433d9057063292b3079d1f05cd5b9a845cedae96441fe0f17b900aa770ee7ed5100cd8727a3e1a413d13c03b9cd0ad0da0b040257796240422fd270a3bf2fd4ac4d11ceb50cb1a84905edd1128799c89263016f4f762943c69e4a63f558a01038c8c4bcde3ec777bfdb27e1afdc4bbf89c65e563fc0eba1c9e55318e2b0b100ffa4fc9c09cf96485bdef7da31113e520156ba49951bc8e6908a67717c43293c61f5a8d3ee8a390c0e9ce3f8a93877c7b6727102d38f7281c7e18ce28607d849413e753bbf35b2cdfeef8ec8c09f5c3513cbb91bd1b294a8316cae7ec7b708099b0dd2420642e28adef32f9890bee5b0cd6e3bc6da52f88924a15b7c456f979676687463da9b28cc6e3c6aef0982d7b1bc34596860813afeb6d87a56cd0668ae0e1ea9410431995cb02b6b2e3c6219c4d4bc25aaaf52dae73ba62108d9b241159f62f10120b46352003e0e79bd68345b2b875b9b258c459908c5ff2995dd27b6cf46f1be6739741e2a5bb621694a910f89cd2ea5dc1b4737f364fce3eb8469aa413c15f1cce289d5720f1c9b5d9ba25607e39e9245bc3168d6ba2b5f3ef0fbe01f4ceb1d111df4083c4c9e632bb0cabdd3998ba6020149ee8e232578bbce050bded2e493249879d2fe484c464fd89c9014cd84958d15d589fb727f9ec85f34ec85f32977b967ab7b0305984252cc22f2966d7454f94478b90985c9348325bfea736a5fff7b38057ea033d5568fe05f698f2c2a4a467d45095564d44dd4a975d2a892f9544c627ee7f3b7c56ba4ca2d7cf4511f3db8d99c6b0cbc953d45082852c087440e9d65a88deb6d75053fd5f01457e779be118c495de20ebecd6d7c5bd16f473a7871184271772baf86c0ae6c79343c10d60208a681881967a163d99e1d34627240ff87278e06b198bbe0413593bc734e5de72c1b3bc1a672f350b5764ed8db3fac4c60eb5e49f6b8a651b263cf9deb7626ef8ad042d7de0cb46f06daa82e9d45cc8c44ed5bead4de0b94572b5bef2b084f7756eddda2aac61484968d63093051edc8cd811d05cf8d0e864b20cef93dbe5e0c2f85990f33abace889a3cb652b57b33d1d749738f3ca1721b34384d9d219c2fb0f02070ac6d0ac6911d45b6a300531bcdecd88a3bf244008d002a0a0ae88fd6bd3e25e3312fede1dc0d0be4d5d0800a0a286a919ae7460468f0521a133c8a26883f14093180fe96e3c2b7f56541b3e2f878902b29c20a5c91c31a58d4559fc45d9f5df4006a85cf4911e44bfaca1d9c9fb76bcea957ec7215672acd333d140fbd9ca44b2f25e7e7047a1a1c58b9a5991a0e75c72ba6c9323dea27fb00e0e883e94fdc78581a501fa4e80801cdc70cf3d3d05271140c92d5c7003b79c292cc850f3d2a10f212dcebc458cf5692ae2671c3816d6780fadd16dd25994c883ecf469a08bfee1d3ee56aadc5d4ef46585304b0166d686cf1a4faddca71c2a801d98c469ec72aa67ab77bc7e5dc55c23215257d59097d7630c6ea76cb247fe3ee838d75b692747fe36182bfaf41e93b7576ab5e92d5b1fd51b793d33af11d843ec720fe39bbdd5cfb6b5513e2a3403135a2f4006b27d252c18d638ed5a240783c9954dd4c14863dbb62e9f9d40a21a5329ed1434d055f59a35397fa3b016d3a87107f3aa74243175e005787c97c3524f4687dfa2ba6669217c6cfd78a263f6776ee8f672c9e006ce73512fe6ef6c4ddc51cb443b99e5602df19a31a31b560f55ef05a5229468c7bf30b1957ee8035c0643f289a993ecea334038a65bf575a95b54b11ce7a2ed6d685cf43c215f2d2dc5b7f83af112ecaab05abf7c3b7c5976ac42aec3c6f21a1f71b0326f87a0dcacf81dbad9e63951d29badf1830a1cf6b507e0eb95da817c08eed8dbca594d67f4c88f0ef372abdce4e97ea0b4c3cb607a5b468b7cd22a518c11c775e6f93d17cf19c842ec720f639baddeab3d2b6b1272543ebc53909393e43c4bc6bbb25349278597935275494790568735c9f6c89bd6256335d39f74398c8230563633f01e73f0e4cf0f71a949e03a75bbdc0386b921a5973d760fb81f0d15f041d51a0c403dc867c5ad63460c2827d4258fccd8852ebfca977c54eab7b04f29df2d7691db4a21e8861832b37ed7c63a7edd81163b25cd86156b8333096820624fac63ffc22f04a1ae36dc09ec9297509e6d2b85ae0a54c2cc461f897cb70330c8ddc0b198ad32af8623653af437216d5cdd778c8ef8083b3e47ba885bead9ff472a51b37a8e92e069fc07406b032ce4e34ded27d61f16221462d30179d71fe30bfccc58c674e915a4b0206906d2f2d030444a54b6404c86b7c8f5e4e7dd35626451a2eabf783c7924aed2449f70326a13bc63b085c8791d87372bbebe4ccd73558bf27edf98bab60d77e6561f6d041ebf5fce3323da30a1ec6b9351369b3d97addabfaa9d61c022d4b1be454ac5f2908e58b3b8617b4b0a85a511ce51a8853182339a2e2e748cf14e18c44b2d8781998e4559fbf0b257d2588d6783b99ac8b925434840d86181123fc3bfc40db3a88b84089e4e20c5768e2c9b738cb20fa2157dfa3ebda769ac1c8185984b51927ff847b28bc13f0686f720168cfb32658f999f4c153c38f889411b164c8fc9a50f0adbdea7e56b5258a613d490d5dcdc00ceb89dc44df08def28c9d912a0fb621ccfba0d259c26c7c2f65cc5ad48e38cf2cd3d5a603286563646279da1bbe176559f123531954468b307f3a3458b08c1c3c5a1a21a246fa150c2ffef54dcfb8a724e68c62d791f8c980202b65d270137ef1ca7057800639e5ffb46c839f7cf44973a10418b98d1b0acaf9d3e77b08695ab728b5e18612ba9ddfac1ca0df5ac6095170e85afec27e291348487b9459d334d20ca9a343f785494e0550db26d8d6aea19732c552f9af6b609c21c85dc8b5c86f164012cd20371a49208797f1c5f55e6c1c032a01f0b65ea587848bf726e192dc507b9acb6eb15c7f3506435dd583336c8e573b6681d7df651f07fed217c1a535ea61aaee713d3a50cf53d06f1c2b98af21d22d867162016b70cbe4184ebbef10d29a9c9b79861f77cd92618be4126a94ce858e16dd8c8dbe534dfd689eb763653ef68178c5e903632645f020a0cdf10815381f8b530396d2aa222010be03ee5b6efc158d7d0d24b5aabc81218883ac387a01bad765a9340cd375c58b4d0730565d3fc0da67497e9140c47f9062c0f995aa50f7819f57efbd5705d4e429beb1a1c643fbe61e92de965eadc35a7f86e50a1bb4832f843572e2248e148093ccabe59a0c94861541138640b9165b660503d34868b7eeab712925328572b5bb0a56159c2405ca6d7259821f281fb6ed761f7d34dae4b150575dcad84172555f44a003c2c91b58f3c89e80f4eaedf34d14e3f59c2e7b937f31f91117268c46c7146623afa289111965aa0ffb6e104b56b061720ec54acb572e3f49ff078df9243cad95119d5e2d9fd25efcc600e4122f288bc541ab5ee7cf83cd70f092654d4273f63d6f65cf679cb50737dac314acfc4563b2ab5c2b7c3a084702d72b4672ec4cb93616c934a9962f06127cf64d30ea4e672b5c92810de1070edb3dfa994d2a4489f654f2ba1ed32e83de39fa723e7cb8ec48bfd3ef3190bd4c260e9d09e151b1a72e87e47bc3aeab4ef15ba1ecafd29b65526dd3f626eb0d27ca8684e59e422bcaa492d17cc70611fc7ea3d2cfc9edaae359cb8e5451be400c82a5b451fd6910ddb1dbf92b175c64cdb124aa1f41ebdcdb6ff0e10ad78adeb30c0f6defe027b5f97c604e88c752eda0c7066d3f06f1941174e27ab4c193200fe2bfab7040338bb6450400f6508327f5bab860ff9c22ef3b47007811dc4b68f1ab7f7d59bcd8a70a4266134ca067ead3ee23327969251cdbb6e38cf20ad55b71c723a3e42a3c8210edc1514387611cdefd913d0b4553727974ec518e1e01918638312d560b5277c9c961a9667723be82129bc510db2d07024b4c8d96843c679de274bdecae69c031af019f2c005689eff5ec7497bc362f4fc52b31049e494733334ccc993e87550513fcbe06e5cfd1e956b78d85ad01f0d028a3ac828470033afed879e90aa9373c7c14d68194287d4c6c0d6d5bf7b0316bbf454e8d2c3f2e2a3a08bc1e83f87374bad50d2bb58d249fff6f6f7cabd5b38d68e1f10f590a85a64b8de79d67757fe567174d83731708e3134bcd5c6f0fc86e49bf8e484d5af1f5bf177029b1925de93b7bcc575057193617060d36a2f2dfa058b89fdcf3b33357e1ca6c903e88ae4753465578070c4810694dc9597459fddf835e3217dc2232d8724e41aab88a636a8c870c5fe5d1735d2603aafdce79b5a3ca250a27be1242fc57c4aff54233f5d42f754416a644ce5547829cce17fdd939f63f0a4c866c0f0719cfedbcf2439a37f1d41453cb33869a787538994703ddd3574d18842b74c05a9b3621ad75e4fa238493d6b8b4063a684a1f9c077f021d4d9fc4b42cc142376dfc31fa9ecbf37f31b6777a7bf212e0c8cd7a3b87e089ae11b3a603f257115dac82d69c5e7d34f76b0f09c98d58aa6981e3800b38a0041bfb8e60386e6086af95af6df609b517d7d6c21c9a796cd5ac7686e208b761997559f81a19be9961420a9a138af35b2df77c12266327274597db3c6e5dc6ca1d6367e78d91650d8d821dec9f889b390ce478ba3eb74bb5fe7d0c5c1efe6020accaf9f1f2eacbfc6be46965f6937c8a333ec5e6948183d41280b20a3fc3b86bb5921ef4a62efdd8e31f1f8cde9fbb2c0a85a45ea29692784a93351af5c9b1dd0e71c68f5c63fbee0458361348a6597df6c93fae015ace9f2064de32075bc1255ed5033418e838bc1962bd4a76d1d5bcb7eadc8225b20d4d3eec1343f345f74828f85cd04d886ed6bde249bb5e9a2406877c22fc34afa12a262e70447e3296ab0368a8194f6175af82b6241f1b6a4face92e70483d29e53928ff137ef5c0f5a17a9d6eb76860ac50730a8490f36073ef03a874101884878094711120d0a4108c1853b24f0e7ea6b4cb09b8a2cf91123caa6f998d29b79fe69a2903a5b3488d35613eb7a007abe1b0f92e45224ea33b8f9d75ae4d3426ee1007385eb8f01174445f204a8f18d5aa7abd86d84d417463b50d8cd070f2f7fe82021a4023fbb982b4cea10e30e547410cceaea76285023fd2956640d3c516ba31baf4900a1a1e2b716d590b2156172a6c824305c41c8fd0e43a2e2ec480c32b3715f8d45489e6279409451020a1f16d7b01ac2918921c22ea2f10d24542842818275b264ee98671cc39922b827c5df3a12c581f7cecd4c670834fe87c86b84640222f9a6376d707463dbf9d3cd3dcee394d70b3d11765450b8d134c394b81c02e84277812ca00aaa083b36ae08e0f8048ff7310f08030b43f2124f807ed69115620419f70420eb79f336c812052113c8d31cd0e88197abb051133d09bee55fc88ab83448833453b2b40a07c6a17c58a20218830a4e34ca1b6f51297c1af21e006ebcb5406ee16e8d51beaaca2631e82a3d006cf389f01ec2bd8d318d5f1587f7dea087b78acb399f783842c24b37a0e2eb7c759d1926ddeea887d944ad845de0d570355761c2c459bc41a1ea6b672f6d6845c6411c53b48b8737d6dbda1b4a245caf51fceb75ea78a640f53eff387c59eea987392d90c4848f7557f69c77cf0c57042f51b52869404fa97a5aea6f95c7e3bb5aef88a58c4cfddc35c337fba00982765c38bd404cd2d1efb3a998642155963389f944c50235af0f30ca5cd5239423fe1b6c6e5eac300545557118dcab4217178cc1528f47600a041c3c7473d9c66c50f51fb233ab498dd3ea12afd754d38415553cc6b85627588fdf59cd0f6fdc832040f4482d96d690bf469623ae9c92db552105ccaf03d1005d9417757f74928a98230bd24c631d1af294b1fd49a973ca3cd5de3be16961b00e04cd31e03802fb8aea0ffb431ce42a99d1e92975b3ec68fd0d86f41336044b67305d76b020bc2bd73b079c34b98822ac3f0fa210e851ddd59e1f22be65442d29d0df67c2644760ac4b14f12bab386eb69a4747cdbd8002c01a0f41f8f442c2c6ab0ed77fedb812539d4bf8f1e5c49bf1eb18c7d01661089e7be9cd37b74f5df80cc10e2888b69f011c7fefc02d748d18846bb5c3328d26905cecf3b1ecf54fa49e5539c094ae8ae715a941d348f73ec5f3103b8abcf2e0f702567b00a379617d431ab514d956791d6147404dd173f786fa4ef045a3a559d66c0696af0a5a8e99a58f4308cc0253109d01afaefbfdc0cc3db5c9d3544bb814c413ea5e13427c8482c4fc6ecc537d347bd785dbd11a61bf8ed82988a664a03f9beda875eef7f745c5331b2929a0b9717474db91cb5c41f796c27ac32304e1bd1e2eb9835cf77547ca09133a43013b2a72844ba23cddb209e41db0e2b81e16eb2205f0b6f7e634dccf10e237dfef1e978a41b824368ef6991c2df2d43d49274a9877f7a1cb771cec48660e77a05cb79aed1a19fd27c61605342c176cf5b5f25db3e4d6d2b882dbcea6c5718be2b33ff8722716f8a14c983e16a16470bee6317eb6f7f820b01caa1362f2b7cd40535ba0640577eae736655e0ce83e2145ba8d811c100e22037bec6c4244f727f929a8db005048871192e994c9ae7c0fe7630b9bff92f5615546eac2bae681073218b2b4a12ccd013c680fb18b2acf207192d321a36b3ec12c4b27cf6d1ec1a0ee124a48bffdebf4d2a07b6476b1bdf35c42f75a65a65e1bc1e2c99261ea30374aebec58e29d07d640414eb542ba8759e9234b97f15ebb0677e0645093dcc0e6b7d037d9b7f6f5141cb14e363bb856c5cda8e0cb423f7d8d24a71fe463ae7b3c982ad489fa244d31cb1cb5f4d32eed7d090649465b9c1a468112c074aaa25a351ec2fe287704189598e25f7c423ed85c145fc8c1a70881e156a0deb5a5089f552caec664fab3550bd325770b22ca7e82dd0fefe298bc2c54f7752504030a8b12dca03df603e886de3e0bc4176471e4d182278e35c87ad32724bdc890671613deadea39272ab6d01202eca6aecd8838cc0a520372acbe0b2ccd951d927121033441979aaa241decb0f3d2ed07bacf946a537d672bc2c298acb073409c23a0eea0bfa7407179f28ac2bbb2fb861e6ffe3640b7e45c63ad3456263076f9961c296d0335be6950ece3a4853f62c0601ae0c3d387ef1113a34889ca39d6a1c519547c74bf289c40737dfd151d52663183312fa06233e7ffb8fb1444056486490b840f3831781c1644297526267f4c15400fa351336aa1506755f347e210e6128b3f8817c20bcda94851dc88aee800a833d6c8f461668c7830ce655746a5c35270c9801cc0a68e36f1c044ac279f1f9a36e32d7ef0d5d09a6e49f07f5873d75f9bcd3d4586a2be24d8dd176b48706b14ab0658d60636487551d8e8a8007a7a63cdd7be7018a056ab8994a006043acca1ff194171aaaccbfdfe491e8d0d84a3ef09b09aaa0caae9585dfaca7f03f1654e6b63674de76f90df1bcf910b53f94690d034392e27b0e322669003638ca80e3e19646afcb3085cac86e12fa3ed57d8509f6217cff30445c23999f48008084c215bb23ee98b1980e71d5c9287c63a1b757c25bbdf8d77fb9dd434e11fe9472216dc6c45bbd901833c3d27e904a14fe708c3bbd0db6091e8851b94f7b760e93e6b1f6b708440ed085506c97c3a4f055436d80d6db754b982631f6271143163092bb6914a977827ca6399a27e905951c68212ab060181b70e5d6135859eaf4f586b18fe80eccf3bdbadbe066d6775a31e243bbd8dd2ac4feaee3a1d7ff05fa89f18c49144c98e5f313e40f605d47d0d54d4c56ff460ba4be182d8d3e3654a2da5d3cd1f23666414a739ad789d9af06a00d6dbc2700d3f6a7537c94e4958de23566d0b197e25316d16632040116419cb2b430930b587e015016f2f5ad50b050b571ca3b801087c81a40c3121a3155afaeee94ba726fea395c4ff3bb34c2090deedc54f80a6bb80dbb1d78c1a8a206b0222b5cb93a83f18ecca18b36fe4eb2496a4373697959d1d1f0f348b4ac34ae026216afdc3c6824f8e88a6a28341ec059229601b48ff9e2e0727d886be2b90498b9d15e269b5def42654e1a66b60d5bd194ceb847ebd0921d23a28a7423c0410fff25e3c201a10f1e2f279a439f4bc7fcd8c02f280cf4b5e5134a1463f2cd62e67ed89c4ce4fc89a5cb7a0020d04fe5c4f13704d16ecbe51bebed16a2b637ca3bc74c1c2d553e7ef65164ed9d3a64c680f202e95c276888352b52779b2f4ab8ca06268a0010851480d8a42851db70f5ca3908d4a6ff4c2bf26fda0c67adec67bdc25c62d1bdcd396164ef8005ac9262214d867c36d6ccabbeeea078331f3015379bf57a5c70e6301ad33e98cbd120227a8522b9441522729addffd274aea4b7419c6581881a03f81ced22dc130dcb311203fd02bd84a0616b8913819d400a705f7e4317a12d69e99b8c27d5e3085ecb1f200a02b02872c6ea382c06c1148d3178bb31b614f08c37e5e864d1c9396b51702c7dbbdb800656d674c18945c4462d184eb3150a7d6942f970a103e2b61c3125773cef6287a2e8a52bba444db3bcc4b80c2a69b732ce44c4ee41761ea98e022433051bd551b4df76c538e553961e7838f321bf75121caf49f2bc0704512c54191a40a4d9c07e17c42f8444e573ed6f068d55e03aae5e080415c58263fb9a632e4c909fb443ee14cb0a542df7402349d12684f4ef8a56fc75e2289439e30e9a4760fbad73a6ef72606642d079ec2bf46a5e675eb5e5b6d024cd02120b16622d08accff5189aa2553c59c7947e82549f3f5dfeec1ef6120bbcaefebe7ee586415a7077f667ee20e7075a7d2a8942464cb3c6a4fb215948959666c363998e1dcb685c81fa0c22b3574f0552114c46f4e9ec8787a1f387e5094a06d61d99891c4775bc647cfb1fd2704d995d408a3f786d82c40beb72b97503d4b42193fbd0b2768bf352758bf51a421cb248cd14eb61a00e2b3a34edec661c8fe9143b97986406a77a1e60ce40c00dbb6c89a9c961c810467d88f7164e055e9ea14103ec4241f4a55761bfbad12e2761706ddaefad0e57ea8e73098ff1ef739e36fcc44ab705f8bea06f8a62a4269c05490808d08d4a8aeb02d46dd2ecb49ca979a93823e105cabf85ba85a82d71a46904149241efccaa3450121c67ee930c2b64a41006e2c49406ffddd5c2682e6d772bd572f97bc7885ad9295c21898047ce3b76b54b6fe4754190b6bb97c85f50e54153c4a6787ee743b12ce116580a5aeea936c43e1a0c989086b250768d691204d12680bee5e39f69fef0fcbce3f703a48ebf349786c9b0f8c1bef5bafdf7b320c16d8453b39db4ed7295ce0144fda07b486567023896ab63c8fabf3cef2203cc99412cc133034fe8ee55d36228ca28ef4846036ba01961886f75ba767f66033eec5279ac47656ebb84ab0c218b77b031b13c841b61c0f954ca864d91fc4c7b8848048300c93208a44a594a4c95eea9392d0401e745b7cb1a90171bc1b5decfb450d90b1942ead35ef8fba2e02a8c26c9f796a2699b51711151490b0468b3c63ba4bc913566fdafebe46da53cb0f7042bd24eeffd0cb4d22a89efe50f8890933e6f90c1747bc932189a00d6a33af76d862d9bd5e2ad769c0a6c10189cdc13eca89bc68d93dc541958c8b165f60c9bd6093d3fb8794dce11eb3041ba7b683ee8394c1701af600cdf0a4964bae4a1c32489c1641744b1820de30d7d088d058fe519b2a77fc99453b8b6132926804fe3e19f29a50a11291f8686753c08a11d1f4bb91950bf395a5271ede02d9bdc1f563f96e998553ec3a23d414e8e82eae50ee7a352cd8042eb4b559233bc08e6e65baee2d032acb9da4578b0b791dd7481edbce7b39a3d8de8ea072ec23e88101cfa4eb8283a97bb1cfa9503b72426866c6517edb05632734c665289433d72b560bfa135afc58325df1f71f1495896c86c7e8c88b46cec05d70816b24af82998802a4147e231461498f0cf57127a0efad5ce8f1d035da0f52e131441730a087288ca37745b4a23d0eef4ebae3427ab37200549f0f31dcc59c63a642797773b7c9d60342be2d4e191e0ffd584496ca663aae987bc7f604a122a9052c863a9e4e90e47eb94e8e04e56f3a2e48825b68a2932df60af71e726904bafa86de233b305390ac82edd9ea496a446692df532400118e988065f2d9c64a82200470522ed6e011a629f4894d5866ce4e01634d2b0031cc019c06c66358afad872757fc3511554ba060f5aa838ce8a634b81fc3536e019bcd51d261d667dc3a49093929b41cad2435c504dfb0483925548353ec2c8bdee43ba1c7640641e6741ca4c440b239e2b0b085452a6733a7990a466f09f0f8564ad46490bf315b17d59ab640d56414a6bc233cfe7bb62e3382c6466b536ce974af2dd46e51a0e22181720a9dff29b93a8358c744fd1a9feeaa804141878e1080c3ac23e753df53f14b6d0002cba9cb28bda760625c7ffe0a8bc98aa180dbd602cc584720c60985b5a970dec5372a5e03cf4784c9958e8ffca05c11ea9bd7362bfe1c87914c6b175e2a13ea6f59aa87070e46b03c24af8d480040897b1db6bf56fec692457b634499147c075a189ab3517a01b2aead07fe7cc96d8170cbb1ed6e8546d61ed8330333355b124e5db9d2d886e3ff315bbf228f2eacdf69609037ce5659e7ce581d2212a21b4f7214a6821cac30a9bd17a6e053b6e0607bb362796bde218616d70e55e6d8a2613c466ae0b9837acec080fa67b0bb36ea527971ec22cb23c2e3d95582293641fee0ed586688e9169e2030c865b96ee4ed4c459cea47298892cf53ac4612b8273291c8491507870cce0aa157da3bbc823d4dcff13e8103ac182c291b3fecf50c9820620e1c2815de8a39f645c4fa8b3cf1e5ec519656d3c544d4456bc9501ca6e104b4fdcfee22b5f75573b65b07ce23446258593b78859594c5594edc894594a087db85b8e8181a17956186756639c34544658459aff021579139ca4ff6ff6a566f1197b6ccd7b7e19e384d7319d6b57dec41b1ff3c3e34eb3c2f37edd498c557cc9db73e0c01fd0b8a673c5a90aaf9818ef5fd4cf15f7f9d2799dfc1496ff4933300b27eeb5debadff8839d77eeb513181285c8631c9c956d2149fe023a6031efe5f4494b9c1ef4da31f02d91fa84f215ecaaca015211b936c3194081447fcdfa7a8ac13a4b5dacdac0517b67032d480fd4030fab18f28900635b62474ca6f89ef2e327b889b5ce124b73d39ca4e4f91eeea26f583ef86b201c18cfb669d44c92b07687e77c76cede7ab083f7abdaada4366152a840c9ff9178517f29373cd64c936495095146438172ec201bdf48256676907666b11876924feeaaa91144cb20c4f8ef0ceb8c31b6803c41f5a3cb1705c8b157f99a1b44c0c4d3bcd848975cea1adcbb69d780cd23f82ab6256a2401b6a3382767f06acf8a1753061450dffaeee5d0284056cca2f047d247ef9374f6871c3c3bca9d415b06ee21bfb72882a9262434c4cc79fde3ead131f4440b40bed948f4df194d25933f780878a4bc9aaa5e2128ea4baef5c56db30d55367dece5d42e2d4c912fe7de0dac04bf5c1f00c563ae78387645b082211e793d43659737c876dc2a8eee8f21a295fd8ca0c5a20aae5dccf6bd234a6c1c0cebe23790b9d86fa69978debef3fcdc2f66b4f32ef0c7be1795ade3b669b0e561a1fd1faf884344db4b1eda33b16d2ca64208c5e40dda41967c7d50f669b0de6c1ffe4419c6f22753dd0e9ef7c8bf3c974e390d0751061fefae6c484214bfac0c9e8ba56123c0ed88770773a63ab6600870481562203f8ba3dbb8d20e088467c8b44174f3f37ee2484f31f5e874953f6347e9f548736ee676b747dd0cf30c4a330045d7f374d401eb8f99e16319466b324e9723486d5267aeb16c87de794c42a9fa67380de4d0cba9b00c8442380c8d818c1830224bc599bf6aaf4653a18a53bb03a6cfba35a1a90491a24d11ea40079b737dd234a04b036e5b6db92c59be1b4cfb18674d2d6b2b13d2df90bdefaf268ce2836ca45ed2bf6ae8536603a235d8f051457a1c40cd007cd8af38d5ee3a2b59789ffe683e43ffe9b832ba3196cc8118afddd4df2ee7d4b630e8aad5f438d84df63d6808602d3401d8620420513502aacca0b8c5dd6ef05449ed07f6ceaec6019243fc39eaee4cfaef559b88d79ecaad43994ea87baeac110733ce4447a96e7ec76d99c12c26595247ce0ee24422ab9ec1e8a61174d73604b34aecd7fffcae01747141a1a56a142e8a9e13ac241e6209828b0837430c06ee1c9304a2fc78bf8336efb59c8c39b0c1571f4a477972d37de16fd67afa22b716d22874d5b0b3c9f18ec0af850a553d991810246f8fa2d52c6903967b250ab4398a42d228799cc9ee3a20a32843e8ef1218b38698f1695231b9b24b19ddfd737ad65dab8cbf4da3987b2351b6a5965447f0d6682fab31d0076d6936d3d14d5ea456d8f08c3e84aceb0b03379e7a9f8227e6fc40988154f9ef88e5aa6a2271b7403e56486979642ba46c99f6b2db91a52b0b36651e4a973de02c312a249a6f52fdabbf2e549ab8512a7d02800332752d9c53732e24703287ac5256ff3035d2d261cbcfb725b1a77184657b62f21e44b40f6ba49f194fc29d457ec5ab0833ed07ceb0879eaa2d937b869688370197a9fea25300b3bb25e1af9f86edf558f6af3310eba8d861cb17918825bec6de01dc1bca1989846f9de6b905f38cd6b8e64dcc9a684363448b407b9a0d0eb7d0bcc252382a74636f3648486f577a975470837a9c06d54ffbb4e7e2052f8a1ce913b713b144cf135362c6706a010d1de31ac985638408e9a92dedcccb76ded5a0cc8a9415a0da5f3bfc30474ee3ed15e1e0b599f2a4cf62a8f306125413d449035d2eb485c2415305c60cb15db190ef2b57dab4835a43f268b06741c49cf43e20d0a92002d0cd40ea813c350ed5544f7775678d6ced8890dc4ec0eed2de4644eaf05dc62bf0e129a501957b4e14ee082a87ec4c7811aa6fe3b632dbcecd5f6debcad79670871da3c6d7158aa5cfa285d790087b77484d130b9ce3374539a10240c22bcff429e4adfb7168118c6fb62ac93a57238d8a733c1e4bce36663c38c53606ca2eb6ba847a6714c3f65200fa7730670821225b5235b7bf4c7c7342ba90aaa50fcda5fec2f99f0d06cbb6de39b291f9e15a3ffd58a3e3c3a597fc88486056cc476f175509f8ca7ae99d45a2664b4296e07070e9ebc954c58cb89a278b416be305a540ca04cc04a2b88604a3404730596bc628e9fa6282d71efc9ffadb2a9e6a0ebc82af23d2206c58bd391a2593630708d51904a389a802fd0e54b60cdf50f782d0c0209b9c3559ef16af2f522907273828320b4a1c165e6f15042a6138eb2a6b14a63380fa98e016f786081cab365039538bde27dc2637f69ad127388212ae55e51fcd9e6c02af89f09f256a17a1824634f02080dc2635ad8642182530fd1aff09467c07b03aaf5d1c846651e7de75061de69b145755db254a9beb16f0571ae2ae4992905222f5a3f2cdcf8a6de20b769b226361062609188f53ffdbc0fe9fbb9e19f42d67252ae2dec9f92bfb3fa07125bdba0a8d41bf3d0399b398f24b3f65a9f6dd1c8aeec2d5d44cdf23889d8cd1665a011ad725b118b508e610b0fd0f6ffd2fcfbca9f374c7c0642d3d74307f1b7244c88ee376bbcd86ffbd0f1f74d81e06c0595b22f4029d3a3e98a9b6044c25ef3dce2754f5f14e5b4fac5d64954e1d186a49268db54d6515ce9504239db087c4fcb7636c3f33c03173e4b4cc5fe82acf30a94cb68595605a465c392b50a62f647d7bbac077629f507d8ce7f6338cbf457651ea9a770f9ad4915c1e03e60b61a0e11cb704d6a61600c4f99cbbd1ba40be51662bfeae86f10db47d7bbf265b71552643e0c933afa7a52820f3fc56c0b1b4e04a1ecf1c00f13eb2f0e207c68c0c09845b9bb425ce8bc7a455f6fed2860e73ccc140a16cd9350de518d77a318b3f69790aabb7640bc23639813c3969b771361f72d5acf9fc9a36d6b0d4261fb86e7687325c1ebf5f62ea435be3f115a83cb2cbb5a49686c6017347c6b8d95293cfa2f65c630e5242338825a91ac057acad5471b7963ad5ea0a947973e10abd1889d78b0f21d0e225454b377ac8015792c47f6d77d64817cec6477647de2e8ce858a9eaac3199159141011b0e7c6bb99e2440f2937c489b38a1e223e06d707254ae226ed3dfcbb7f2bf95bae34a42d40a3a150b3b128529b4917d3d9f1723e94e0c693c9a137b6ec64d1f543ab230251ec6bb3c682e664d9379625d87de56051a3145514a2bc1a8e8c8ae61f8a317074c7d0a4a9428ad0b80d8878bb4ca4796fc1c603dfc5b1e930e31e015de5b3e50a695188e88085542a5c86364f10ac644502592a48ff11a59a495e19609c74b254c80fbc0cfb42fea5137d81630c9ae6239b156d838c6ed10bc7e8af750c9ef2074cbdf3d1b71323779db7cebc56cf7b81d165f9765710c7d290cec5e5068f572b23e8473e6752effade88d2ba4de2086b74e2af9352eaabc91fbf924bca6d06c19d9573fe4e79acb142fad39040de0d7cc7c62a3ae8e95094285b764b6aa09edc3b29065dffb9d9a3078d4fa05864a4701513f5a11301c6c7071e5638b06d05143539aed4cecb3d0ceda6df04c2437db1051190c315b22c7e2c19a709789bc448ed81481ff203d5648074a1681e083fd5a459ca6a8d16631acc86ef23593a400ecdc0fcd58881495dc842fff452c076db1b2b1728e5487a61c7b2321403f4383f5966a411184b7a874824adbd8e8142ac3f9c011f2c9113621d81f4ae209473ffe519d1c209a8b5f980d5a5e36d0477e42940f64056b971341f0992983149707d5b27af62410892059adacd5e16cd0443f58339387d1325aa9d1982d400dc00490e677db498b250107e0fed1e2840ec1f3655105ca01acd5255dc9cbc9ce988e00f5856e1a0d7abb66aa7cfd8843a222c6973065f9e2657ee762759ebacd5e442f05257c7ad97f52cc0b1b720d84b4d0a3e12ceb0bc53df8dc321d4b987fe45b3813584231546a692d35c65e461f12e59d22031825f9a73afcd728f4c27a7328fb454e82d79cf773fc0943d41ebf12ac91d85aa213f65b15049f37d8fe2d79cac40e0530ef87a5fe168b360c8030dc5ecad2685f42ae6a14743bb6a45fffdf1905ccf31021665d36b4d27373d0ef556676fca5b55fb61876868e59b198e99c8c34ca726799891fcf364fa4720a14a57297a15a1d9bd9330e091aaced2dc86380242aa3335e2412575e7fd558cdb92421d0d6af4652a9cc3d813bcfa881ee62806e16a3535e31344d3126034b54693a80c00f62017272f1756e199afc9e47251c8113ac1babe4eabde0a297d4bddfdf180daecdc0894a870bdce2c13f622c191fdfd07281642eef6b6f129eb709faaabab7eba17d9b8ecab5001691a7172308c0e71b3dc946e3e07c92255e4c2cdc620f4b746ce360371ba209f6c691077a3e92ce1ac4ee8131ba8fc8c8992647beab6b5dcb09b3bcd52c76994ff2177da16b66681641adf0a698121e53829258299414aadce767b62d05e731661e8fc5c125807b9b1dc3ffb100d030a1128e78ba347ace2820b7adb1deece982d53257e00bc8522d5bd221941b2808b8c7f4376d0ad11cd03388068407030a0fea685c30903a4e07aa31e9ae52fccad045332e99a4cc8de263f87da403fe1803e3897fec1d88fa587b5eb289ddd13a66b131ed0530300cc380bc8620c7916c774690f808f0746a8316b6c1244bf7429dd4e1a309416defb626a59432a524036e067a06600634c88bc2acc19317c5764a8a94142914d87c0a0594e8c6cf64ff700ab26b189b103f7e2f0173bceb2a9658e9410e13587f962e78135f761f24fa39590fe6a9f8d54a52d73476e3075bd8fecca8bd28a5bb7cfa405c76d1a8bd78647360632b4254d58c602a7e8dd18812318c104a29a58450c6d8f9094416fe8e2f2ceca0083a090bff535dfe0e858485cf3d25833fc2188b8257a5b2760c0b632283353327b0f03311b05898d397e9f377440d9975087d12438d06ca00500b9617fdfab0855240697ee961eb48773f73327887626175fb57b7ff3b2283ec502cb4ec28d05ab0bc6ef7ea3a07b50401dd19562805681828550ea580b911c99e76a82194f47476444aa59f1d6ac89c5ad73f9e6281fd4ef73d75f2d48f613fe8447564cb1054ebbace3406c426748139dcf51578d332de61b9ec910b668813213d823763c0547fe5e1e2b692dbcfa66b7760bf18a331c7a1419e6a1a1414330085c51c878853e801e6c800e2b41430f5ea202e95542a124808210414ea7e34f6c1fd1ae8a3b3734061fd3f1a14c1d80f16452f9b066c246a2fd65ef308c27253acbd50a8033eb79f3be6a9f6eed740b15a690c28d6314f7db15fed890115c5b6b05c7dea930ca2604bcfa552778c31c6d87da4f1c2ce8effafe0756f23478197eb2260b15f1bc19c460dc95e1ba27df6d9ebb4645ea715841a92fd96bd4e4ba7c52fc335100beca7ba3341d6c6e6a08425ac0851eca7ba03d8096af9fd7e5c7ed8cae2973815e0fd01849517d5517cd1e276517b03d809baeda5891a4c908e19c58c54465607f61da7c88d19abfb76a9f43dc3cac00f236ce949df5d2a75240ededcc8e82a56afa0bf48d1e7f257ad5a1289d25a6bed4a690ded31bbca7895c143c618444cff422a9650b9700b42bb3260f78b3c6508412e62a2dc2ff27cf18a81f28a501a07b698b85fe4b99f47d7dde955bc42e5f2472711cae5f7235609ac9123f6ba0cb68026f09b11e5bacc80026754200599b32fa5b4371578fb0184257dad9b0adec7a4cf2209c29bfa24d6086ced68f775d7d09e7f6f2af477c72e57afdc9231c2189bbd1dc352fa2e984fb90874d195a1390cf4c85c278237fc239c61f9fdc771b40f8add7ed94f6a206f695d0379aaeba9769f0315e9a2cf381f47da1353743f78c47359134374f99170e42932525f027c499d1103e8b8241748ddd7ad73fb935d912eba116a375600a6f8955c661cf8c9e5af8e03996b882f126eb09f0e8f4d7bf0cdb030fa646d83325813e17743d890fbf8a563c87e9a12fb591af8d03b147cbe901b01bcee820cd67c0dbbfc157ed695532005804bd283680c268ec41851a217940ea281f9c82502111635c57e7c04a4bb677777b7cb7c4f2eba5f929edb5c74bb9361be092670d1e5d2cfd151ec0e0067c27bd72e97085ff321fc07c1dce6fe8361a0d18ed7f1ab1ca8ff78e736cf8dffd8c9e93f7ed9f88fa1d4f88f7b40f88fa3cc7c2ca5398b89b7dcbea2d44cd41f8cf1ccee547777fbf84fd5e33f56fc52a5f9a8bd76116159ccb304f230faf3f81338159772ff11388ea63d77777777777777777777777777777777f71e1cecd46680beb3ab257c97f026705f112ebadea16e1e5eff123ad4cdd77bf37cd4ae1b1beec5902079c42b8211b66aa9676f8495085ff32174cf5f64865efdf31fe9d58ee7afa1573a9e1f49af723cd33c3feff40af5389e9f9df4eac6f3094aaf6cd400e17986a5306c87246e70b5d883e7e727ecf373965ec93c9bb6c07aa5fd2a2b912a007e2580f7f1fc407abc07a007075b3e38d812818317de8e8397dbc1c1ab83833707d77d491cccee071cbc331cbc2070f0d6b81bc7d70400aede1597e2ec89a3e184b4c7bfe286748a5f048e01355c089c033a2e06aec8733b7470357048d8b5c3dde0d809c72f8ea130081c47f169ef0806e22c42bc856318c757708cbd30110b807b4ff1fbe0549ee20f00d783839ed258b79bc77168fa1585f9a8a9f44f03b5b7cbe8480c1f31d721238cb8fc1cc67fd1b579781ca7d6e6699e587d5c2e97129acbefa3e8327d35616bc4650727602e6218710dfe11bd1b7642734e74f887949edf9ff9618704890e64c8b209760169aff46f12c2f2a3005354b07458b11f8b056456cba25dc7624d21202492bd02f8618701f80c9f31c05fea5024d8fa86092132190a81a95430150ce6442c4644042c46040c168bc58866cff4f161bee66bf6cc9ee94382588c04b1582c16232a8a3f1c1dfd7074747474e4841342423020828480080a12121282d1c8c21e64d147380d2bb18ae499a71b1d9185bcb4c7441c8b5dfe6c0719acf91a08e6c048aa0d43f358819ef759e589c26ab97ca2e2fe7085fc0383e3308fa798878747c7fd2011acc2057893c30aeb8d05ccf1a72ebfc9e0150c7dc6e5da8571f8c753fc5fbc68302ef30f7c860c1fbe0b30f48aa580f9791ec7e92e9ce2fff2f2e23283d1478c040f3716f6840b5d1a97a0782e95de028cc383533e4930e5a5f85872727a70dc8d1bb38b5d2d793958ff0a7370a4627c203de3ece84f44487b106601c681bc00ff0ac09cfafe4288c01cfa3a7a4e3dd81c6cb80e71701d76711d6e61a4be9442aab8fc5dbe7841afb7839552ce0018b9bbfb8cd0af0c2929ba1e638c100a711462aee53f1e975f72ace521165aae138137aec4921e5271f9610e2bdc9df4a598821bbf95c1ed0032c40ec528da0de98f620652ee11bf2c7425c742377a6e3a23eb8fb7c714bb1561bfd33de9d0713a7556ca4a9991d8f5181bd7304f716371998ccb5d8825066f82b01fbf7e18fa53e995771a076b0e2d2a3f00922abc710a13c269a114cce9bf2de4b57af7412d2bc01b1e2978e35f04c2bc63310d6b210fd88fc57091a7382fa2439c82905318bf1c47b3027320dc54f02c29b81fa96156ac0b7910094aacf69f074df9fc6c14c60e1456eaf882f6dbebdce66ad848903be297d4d12136611a7d3a3f973e10af2c4fad006f1e007398993f1d5e701897e378109ce237e2f27fe0e54bf45c061ae232ec1c0878c36cc445edf1736f69af612dd41e0bc1b296d992f90f29e9b9255c38e4e2223e81f1697461dfe1e80406cb2fb75f5a8138de2381608e9fa8b05a7aa2e02f6e7ff7491e48ba39acb09fe4e1a3eee3239b22acf652bea41230a7077eb204e3c42b724a913422881e3d7272b0608142425cb4026ffadbc60656ebbac753ddc7471f1f31fdf8a8a7b41498c3b77f0acc911fc59525ea9135e2587fc00a2bb18039ec400ee49e05c4e198a7bac01c3278256d60af9fbf00c3d600c65a0c28c6fd244f7c6d6113c6fa7ff1d5536e7f2b71fbddcaed871dc5ed97026ffa59c7e9f5f21ec7e1d3c95a20efb9fdfe5eab00eae2405dc447314648828b0b510eb86cb1437784602284103a10ccf1dbef2a74ec301ce84b9017420e06cc5d70db085f89451fb5113f0c1a92cc2104c9978c22a5c015b85e924acbe83dbdfadac8e705a5e32b1ee1ee6e0473fc7ae740bd82432e286ef3f09c58fede88e8b4ac10e8edfea987ffc12022ce0981c13ea24aa8d2730b25c4f4a817608b5bda772a4fc5a0d3d2def4a6105876d5105f3c35521eedb3f8f254bb1598ead771bfa8e3be5e2f2a4e5a6e33904701c446311bf76b1bf7e3587c398eecc2a9fe2faf973c0a81fc7120c791120798ea8f010101ddbee109ec2416eee33d3d502416fd9c141b7bda7b491ef85f7cddfe1d57348d1b5cd7da23e753596b8139fc47b55adb2ae0f682f94b972aa2f40d7c62ab8053fd55b8badcee2f5f17f940c5e5aeb570522c0f30ecc7e3760e2b2cb30ffbf81cb90073e0490b84285c3efa4eb8fc2a98139f2f1fd56a2d842f70b5cb49f7f4115e7ca8dc6ea227eea76d3f63aab85fbf88c2dcafa3dc9612217339620c13375a611fe77161adfd2978038d4ab287d807d224d293866c5f8a2a8d93ad1257a96537a158f0db7d44ee89eb56737c4b08b2b0055bf2493f4b2f896410cc31823935ee7c1cfea6879b02a0972212d2679a6d6fd69f25ceb600e6d43103db60eea44d29938c4a1065c22dccf3296fe9d57cc19d3f2b732fec78d11a87f4f3331247d3a9796a6fce2a6cc72984eac17e304848af3e29f4f3e7afd0027d219803ef9c3fbf005b9011ac98324c189803e76b5b6c6772eb1a7ad3021b0b3301f1d2799a949efae773d78ecea799d2285381d7b4f6cde0b0fd32acc7838aed875cce287a6666afa78cbf7a9573c9b22a299d916671c628e3fb09c2e95d9452ca8e177a476eca3d92795e2d65f7757b0d10a77e4bf91e83a7e0e954ebec38f392cdfa31384ee9e1d7005ddc035780156663b012b154a78737b8fd5eaf50844d28027af2bd153cf740165c8416cf4aa0277f85a7cfa48ceb31c91807404f16a1af64ccfb34d50e0678239f4a22ae0b81299922f2b90e04a6220cb260815c7f8f05cbb5be1149074434ba740f0117642041c4151be0608a211d4a80840f539668e2ca0caaa1633411a3c89c46e02c2480b8bb3bbdbe0212410500e2579e20b5149a25463a4389db0f8408049a9238a34b075280d819438861e7855ccee8c94070060e672c69d2a73fd10829c3fd8510810d113261ee66e4e0fac7f61a2691bad7b0ccd082644691193033b204f634a32568d68053f82afdaf54fa4fcbfe33691e6c9b698b5cb7ba99eab699344dd3364dd3b62ccb322dcb32ad542ac5772f6532524ab517b00f150b0a696992fd49fb19afda93a72568cea04e2aa564a65272e44a2b2d554a4b31c618238d4292085653ad3d9dbebfda138d4a08468411d21fa91a4766aeb4c4b596b23967adb4c639e79ca54a6b9c71964ab546a694d219e9cfca5752e1e3b24edacf7834aa1a968db5efa982b4501840229b156c8fc572d6c7fa1a161572fdb827ed673c9a1ab6898c63594639e57c2999657d5959da6a4f42efa9583746596bf745494b924a4a4b52b694f2e57c39492492c32be47a92f17f304bb5f6747aeb59b68c633dc535fa67ae7136b93effe418a1b7cbb78e53abb5a7d33f847d96c5fa71e7d7973ee41448b5966aac92ca5afa5a6b8d55525a4ba54aead81921fd917ad908e9e3fb76806ccc98fb2171b96eec48921b7aac513ed78a253305213dc618a3bf2e8c4117c64ec6a8e349bafb8bacf6eac6c9460d9cf9528230f3810734ac8c69d3b212a9d229a33733fb66448c2e79da83efda0b3208536828256cd90d3b85be31c61863945d8c313a0d2e846c027c18142f8a7dcf657f04924f1c07b8a23ced79691cfaea18d5c1c9a5403f62a484e1437b82a27822e57e5bcff6d28874d8a05c9e5e6d4f209018293d9d29e807fa721c0d4ca7fac3f484715bcced6de7f6e6a4f4d2884a2fee2452fe6b0a65b55738a84ced158eeb36668d9b51cd39102ee5244cc5b8b150effc8c568da439e7c1a571b34cd33493464d9a73dbcd6434e7b49bdd8c86f681463fd0663410341bf16627ed8646730385c3e45d8437f167e731c8384915d401a08d3f12af8dd7b99f07df1d8a851a335fe375aaa058d8baa97d243d8c98617e2c7d2cbdec20e7daf14b7ebe5819861258549902045a6046ad1d5c735af5588aa5d873ebdc82c8cecea0a6ec1d463114699c9dba448ccb7fa406c7d9f16068a704979f77802e0186988471997ba6e4ff1d2f85ec7cb7a3b3698f3d1c6c4b6e6326a8cd22d42bbac5b4712c1fedb5200448018076bc4e4bfeeff821ff3b3a2455fc91ecf8efea1024ff9c0d1b9f75bb7a2381fdba45840347108e201c413fa7d37f95bb8ba20f9c0211d785f0df09078eef381ccf71389eb405e9dbae5ee968278d53f3dc7f15a7fb1b5fc375085cbb8c3a857a4671fe05e9502bcc8efb66b8d252c961e087c607e2cf3d3fea4bff5c733a85606d8eed9f6397a7681e88dba0e1501c0ece48bcc17d0de5f29fb8af8fe88e7d523b6016c3cf001b10b6d03fdd6769842cc3186a941e840e45fa7a49cf5fa4571f3c1f997766fb0f3ad45744753db8f669742899af57c6dde572b97c58ccfd184ac3a12c98b032a61f4a50362d83818b0eb76380c1012af8e1b20424d2d13946907da5edb79fe995f6f0d2876dea96981e894ecbf459c79f5a4703e9bfccf4f5a3c9f44c745aa68e89fd2feb6820fd9ce17249c8bc95e970306ddbb66ddbb66d2693c96432994c9fc4b46ddbb66ddb165f6e2693c9643299b66ddba22cf50c8369734b96d435467267dabb7183e5ff54dccdb407add7633f55dd82b094359769664894d247f9cff727912825a9be8646a3fca8f8fef1274f29e59491d9c6534db1fc38d89af698344353733bf3925966394b2f29a594524a49b5d494524a29a5a49e73ce39e7ece94d29a594525a996c07b091524aa594df84d592cf0489ff69cef94d58add92561a2d3921d13f9b49b734ec99259f24b4e026352cc60720598169c51a585a40abfe524b54b5eb2f82eb98f24a409b7b2cf90dcef48bc3294b447a2d3d260a9a3a1fe079f027e93b080f6f48174b7044992312ded99e8b4b48ec9f659d7d1505ffeb433dc9984f61b97845d413e2f9e1d1b94b496c0312d9e1b2dadc341cbb22ccbb22ccb344dd3344dfb26ac96f649b42ecbb2ec4f3ed84cd3344dd3b42ccbb27e773ffd1c22838ec3443b74016a411e8268c187354e3ec81ae3a203242e3850633d508932a6ab104363215183e285434b74200905cd1d9c8b1ca21439987121260b87a12539dcef54e3fa85434b9a482d58043f4ef8c31a8e45cf8889c2f44e969793db43368471bf9aebc1fdba5b5f477ff5ea83625c52f8c7092de3f6f395d7c7475032ee57d3b026dd28c4f8b9fdbc83a45728db5edb184cf5438e712c167322129470cc06c6798195f01610e704268239fe1ec7bc9c9c1e1c77e386ec5ce854ccb156f3c09c293007d60a3dd50b42b9c58b08deb48a042596babffc386f1cc21f32c8cb35a716404829a5ec5841a01c796aaa24cfd095f26724e501c853f0caaf4f7aaa34aa69c1cbd48cfd832b709cc032bf9d61752a1f3b08c32506366a293589a2d6c04628e60eb692601e218229b65ec8254c12f7abaf30428009f3c3fdaae34404bc8a623cf1b8904b982c5e512e0c56a3b5b6c6292a6d02053243af0c5c7e66e6e18a8b02a545314a1e90d861c8f295226c50a4412976a872dd8bebdf168c134250a10110508061d4aa528b1a6b904f9dc2ca46796460270514c0b41b573088abc0891841bab27ccda0b21400c09eb838b1c5317e9a0e5e6eb71325ae8d3a57a8b0811533e892832e6010e30d30308a220c1035c8402b4ae1a65295c05ef20596a55cbe3ca403161cb76f2d4d11344f4f038124620004151bbc5060850b3620c490155fb8b0f8a2e5b3055a75d12eb6a059ba28a2932705d4bb708887089e1faac820cc8931c648ca4a5b0cd0a8d63a54bd162650bd5a6b1de386a8031dae3fc31630b37eb450bfafb859ea16d8021d10509200ae3c808cc9470b1b37a3790d03ae97b422d79f3d19914458edca4303be0cc1e08a2cb400c10c7490b8c2c91721c8a18b218eb832b334d1458a8e914ef4b049b14419590ad985433c4e4a57c84a659c31ce0fc8297aa031c6219e1b6e8c3fd3ab223593499c205c38740318376c518266661abc2f6c752a39ef0b5b3bcf53fc3870a79d40b9dc512ef343619f1dd80d9e78395173f56373e517c048caa0af66677b3539ba9faac909eef7e34a39e1195742085f8578e146e3051ba8b407650d2b563eac91cec318310a1fc154dc5dc89b5d06590d86357c2c3f842fc09657fa3a9c849b6340742af56049170e35698289a5170e3511418cda85434d3a703f15515402dea0ca17452f1db89268c2004ab09ca0035b7cc8125445b3e20135c3889985045224ab9a1471fb6313236e7f6d92814be3c2212662a4bcadedf5c7244add5744bbf32b259de4ac4f9a098825f95fed24f4fc6b4fd919217995df53caaf11def805ae7c08bfe8041b989da5d43498c327d81057809d73101bf0a6ff0425f6f36edb606863099f52c6f625648ef4016fa6ab1c764ab6775143d5b6b2bb6b47d9d1cc5865fd4f4a39254b035afdfaf43ff8f0366569c07a51ca0f04cda6a90e64083dc4602c3b1f484b2965f7b953a72592fc3ec6e891c8959f04932edfb6ccec92898c5af4c844ab9fcee5cb1f716845d2d56cd466da8b524a496ad91af58ff25457b53dabc5b6b56a362341afcebab5a01324b260247645bc2ce6ac7476d9e4aa26e7d3f93e5f06ef2cf5195bf071630ede530f58d91dedaae4b4aebf229e663d87ac5a2d4e49e5894e2b63ec8a68d79f708eaba0c11bf827ec58af32de2235d75f90d5ee29bbfbaf75b6cfaf7677ad1ee3fcfc639c9dbbb78ced710c464edfbb4f4a2244728518bd7d68f76ef70ac0ae87e0823f4de650b1833fb714d434c898dd653c85615965e3b998ac8bb0b13ed378c10630dccc094938c7b73dd35e4b97fc69f9bee57286b08c829175fe0884c3ee88bcf2ad3f8d14d29eed15853bdcbfbff0a344c922aa0bdb8b31b248dd9c13beec424acf53313aa4420521346251f2f9721748732ed860ce39679c73ce7903c990a103b0b045682ef3176f119a8b033a6577445e8eed822cbabb17eb2ee4ee63084991b9bbbbbbbbbbb7cbdd05df239412860f9897179e8ef43359760f0dc3478c1417ec28fc4fce272ad89a38b4026ed1c2059714f8bb43f992ab79e803762a3873a3e4663a0561f70fe1373441c9f50373a2cb792e2c037aae04aef80842082184902b4f7551585502bd7e08a1bb8cb2f8713e579afe7e14d42a141bbf0aff4b72658cf0398c16a5fc60b9cf0c901f34fe81d31434b0ef2ede0d5436d41ec2878dca9dd8d4784735118c5d0242c8f2a1b2f16a9ee63463356f08cbef3e48950fa15ac40fb63eaa0fa54cdba8c94429d5d204918dea673c1a558d2744f48477d27ec6a379980f93966a966959a645aeb50a1951cab4cd2443a5ad965a6aa9b532323232323232d46432994c26d3b66ddbb66d54d3342d324552c5fa0113e24264634fa77fef6b5844148a59cab4cdc432325646c646ae3255c65619196b32994c3226934946c66ddb64a4940ac9b0d5004b55c3b2511915c91dd2ef34b1a5df69f2ad253e664cab4af64d54ad2a3446d6b8568d526d524a6b8d7552aa6559ac91d2f91e638d7466b1465aa2344e4a4b94c64967294e4ae79c73d239e7a4744e4ad2015653ad3d9dfe44a38241a1a9d69e66c4e0f73c958d161a065673bd93f6331e8d559d5e457590f6e4094d23231fa77fcf5379364274074436aa1ad67b2c22258268aa0d9ccba8640dd934357568460000080043150000200c0c074402a140249205d2aefb14000f758e44725e3c9586a21c866110c518638c21c010600031c01043886ac60601222888c38903ee1cfbf2aec6c22181a7c6b8895c8ec5a2bd5218a73d02b5d7039c78ed5ea5dbccd46d8c12730d1ef01dde522cb6cfb7b4d3c7668e474735d1a1245940384448f97410f9f74ec2efdeb8d9dbb88a6ef659c8aff1862c2c945fb98b9a479d7ff19d1b87f29ad7eedb88405bf59d4a0ff4e8a5c6fd9757e6983e648509f1154020f3e0a311c24dd7e899c8013830e0b34e80039a2f3b78d0635726c2183abbe21288a1e540d7f0afc8569ca6a32a48a772cd9151a1e53106b90ba989ee9ca7939958b467ea7f45ee3f78ad0511a23e424edf0e29182a70d0ae20fe306112e344286cf322b2780d0270db4857871b0f348b26cd2eb41b93488c70d6e180150ad7d5d72697516691286d83d6103135e36453cf3ac68c329aac23e90c0788ccb21ed02c8be6502b23a17f4888c6645c9b30f80c104ac4b4844de31845182e5bddbd6c891237bcccc372b137b52da161dc3559cb2092f43a4e2f0345821b0598701d81597046a8ada3ef622141dd47a875c267e5368e68350ce999ba48e16181ebd3edf72052fe0a92cac67d48ae62440e45a9ccf110bcd00a3433a8a291aaf4f9564fd437e4576dc058e3fa07ce2099b861e21cc2f09593a09a2ef15ee3cbd48d060c1c448214b11dff54ddf64d4b18e6e77aeb66b28b3625619b2bb5a002500ec795ec0c77ed19bbdfa212acbdc273315ba2b6db2e727d93d6fb5bcba081e0b72a3b8061320a526a0959d90fa461c24e0cc840233ee6a3657afb1c8b38bfed19656401ac7fbe0d27230a35a6db100f7b3153769928bc5f6dfaa304bfdb8dc4691fa82d6ec127e33650dbf245d7ab38fe9d16b024613c02b5790ff9b6ffebd234e550e18031d8793741c8102259b5606f07f817f19ebd9409ed971f0b75435b3c3d9f3dc29e0c214be44d87fb8d3819e326a765085805e2c6295ff5bc1811128e025f079345f5110d2d30d399e3222680dc31d7d428a04a324b5f6b835b6a69f9a41fa67309ac0de9474ad1b2a92facb8ca9e6cd8cb0766bf5dc91386e260b3692cf9e2d6e80d652ad4024f95965315cbe760bf2f043c30b4d8001fd19a2008815c051c3a345f62a390fce77e165bb13d00465487ae955aa427afcf87b543776ea0a52e88c5913a6090d41dcd785c2ba9abf599cd7896da001de1ec23caf9239414492c0e3e1decd80191a2e22ef3d6bb51a641a3346849a243ac79c0b1cc72ef4092e86a0e28d77ea33563e2d7a392daa3d4e14ea11e8534c8fb3ccc25ba12ae95da887c300ca0e0076d471bd78660c0f8604aef3e7cedcd735f3b285e912363714e2b4f643b215d09086e0d66f8497bb8b5b93e3a4c406a0c4cc7ba301db53bc6106686309dba555895e623d5fb68ed9f3797829061b63ac46940d31dc4e8f46d484601724b39099a1e5cdd447a7373bb27a8a6033f84f58600c3472a768683b73a09490aa14fd9e0cef50eb57f85b372adae93abab6166bf6e58f4f1b388f81d93acfd3e8cf51711b4ef32052812c9ec8774762e2d2fc107cf4ef22e9468d7123b74f27e18928512a9987dc07d4b3b0e7d98a50d73a54c8284ea5a7b775433495ca451d66a23d75a44b0a27694311cfdc869ad4f529c1f8979031797164e4924007dc3ad024a14e831c3375801ad6628cc94c54024a27a3f64510110ac4b5bbac474cf3c8962e58ec262572fe923c52206834c5c7424d1dcbfb18657bd076d8c252dbdf255f89f6ce6e48858c85c902adeeb5dd74c7d9f93f5d2671c1242aff45dae54ef3057a3de009256ff044aa52de747013f5b83863091c9033838c7428ab1f8d63733d85df56072dd769615972ca604820f0128ff30597857673e6011102b3fab6d7936f6b5d8a54d119611e98c1320ea8a46c47d641a1348957d2462e8708181df58078e8a71d623ee5ed25a7c0868f81ff042c8e4bd93d164d3ff881bec1cc08b43e695c3e548b5eadf34443cf8618a1374740e6251a9a92c3ab58740e3aa035382f3a5ac97280d0e0a23a813a59d1b1933d0f3cd36589404ae2993bb2cbbde7d1f85ae453d8e427dfcd5939f079a12a6e48f32b57b5d87865a53a9b22b483822d99ab1112c8a614af630f0b47a8f0a7d27fe4840e91517bbf50b806212665ae73d871319b4148549c551d652c45261cb9559bb91e864fa6f68e91fdc13f2a6762a640de58a2a259d49954ef2284754aff6e07aaabd1282d764a9e4971124e202389531b1a9e336b731b840e0cc60394d5dd412e5a553a67e51ebd96266b428c2432a640a2ce91456203c3648bb97f862080eff3ae409e0f187801175bdc8773b21344175a68e18cb4bac38ffe8b5584b661e7c8c3da5a39c6d2159fdd18bf7e2d42c64a6e0cf1d669ba088e12c05bea4ca6bd9a63a66c4ae08b1ea3f1ea53e9973eef0673733514863f755e5b29b97579d5d0ef6f331515a813e8ab64d0f6533c83aecd58e5c24727ad923a690e0777e5220f13f19fdb3b7499a5f3b49d0d9928d232c18172aa7695736a0a1b347a7c9063aeed18bc176c454eecc22c237b91a10d147e6def467475a5a338b1c3c515033ec355de605e6edc9063b65fc2b2dfa8383c9b482095fb7eca4af9d1c8be43ee3b1182526bd1f6e3573bff996bb7eb1fc1850cd0b9294f1a439ab4f132da6917c5cd20cffeea489c1e33bf84d6f7bb2fb979ff90152d1d5444797d3048825cba5c723ec0e6ad12038fff499da757a6786a8ee34ff454e4806b87cec47862f6b2c924c731160f3829324d59d1400a54f3d1e6b0a05900840480fbbec28c13135b054d95bf0c261bac8b7589c4b54ea0a39630950455035641bd3b521601ab23de41c7eb78fc0d808a9a47f788d90b280822291c1c2712408e09e02166086050691486b04f0811a20881d397e64729098342d9306aa000b15f6cdf34cf02225a1a10194886836e060beccb8273648ee30011cda6a89b04fcd4b11e97d25beeecebe62540d3b581895a5c30929189608c9b262bf53712821cc60f622f9d388cdd06d8556ad88ecadbeab51b404e4198ede650bdf93b5f28c7d5315fa158dc432561296fd811eac3726f4aff8ab2ad548bbfe73563cec60996aed43aa0890fe0a671383f1b20d96930e841f10514c229d8831e6930f664b56aab3af9159d0bdeaf4efefd3f639291010a7bad8c59a208cd2686336b28faaa1ccc870af6b40741ae2723b8a0a719e146964e725808f4849f71a690032c1bc17db55d804714538a52bbf2fde3f98bb9c42c34a872ba253a77b5c666d0ba12ed54b33154efbca5755ccf0acf74568576d103c437740ad60f3132a12a2d927004dd8314342ca4d79263dda5c5db416fce27f63a28db1e9fb3f6c80184d1f0a8c32acdb2937c3c286b5e096ed0ffbc0d39aa984839f4749be3fafc10e3f64ba01c046a4943711d4b18c2aecc72384435b98a9145d45fc34bbeeb059d095cc5eb9cb2d40f4212775d1aa3b802249f88609bf0cec4e4ad5dec16385bc0316fa734ddf49d5e25cd259046bc44b6fb58f97e0cf478f3afeaff58a8886beedf96300bdb78b6cf30f42b176dbcd8ea12c13c1c2dacdb96a9f728b46a78d0286edc274ba2f46200e7c917922d5cd8214b96e03c4e0035c5e009504fb96442ade137389330f703120684be7181bd9580be44c35aa2100489e85c41460307943a83f577c433748a30d103c514b07e1a53fb4dbeec0fee3988022938ba075d97a4630ba30b7b7a09160dd365cf615734fa8f188ace8876a2e4a6407eba12b46f3ef7a028a6c65950832e83b88836cfbd416f27f525f65149abee0c1449ea516ebd24ede1d18550b14078e67e2dd3e4a14d41d35b7d7e795cf77879fb65d0cee896dd00eef27b6db3d313a8f247b5576db3d26850b00bca4c3f6e290dd6eea31af169a689c71d97e7afc113b682e901768540c2bd6640509d105726636e732cce19da63bb8100077426a303330526b1199a34a006ee0fc163595e72a7866fca5ae4e9b182e48e6795a9c291c278ca526f8782f65122c74d675b0826c0a84b4c89714bed3e99800ee90de515b1b06fbd07ddcbaf80883cf26914a89dbe2dbba15ea928b6c136b8c91a75e6adad3d533528b14051176ef9d7fd10af0bcfb0c14e6aaa975138e05c8e6390309ebb101a314db74cc76445842e280acceb964b336a71ebd80ce03d9940391f66bb6a37a2328cf116e909f52b8013b5d0c9200b523de46b5cf64e66d1437cbd8dcaf5c23296318f6870b09d05e730c7b6eabb1a692c5741d456510d695c4c42fcbb7d26315ac7610b0aa21e002f002a9007e9379759e919ef47a80dc27b6bfd3bdf30f1a50f5a128e696675da034460302bf281dc2fbb488fdc6da482dfa02941ac6535561200bff540167488035a5f5d4eeebe7a5ffdda12803e709e68bab95109f8d96a237533844eb84e34974c127e1c387bddaae4177370646f29d0a25de696a8c94d7b5892fd118b34b411c57da3137db07e4136a0120159917968ed7e113115e35eb47dd2ff90a977bff5299f72354245ce5c1084a75479ce9a2b23ef8ebc283e004ce39fdf50bc284f95e60a6f23a2679d278cfcb0c7fbc006a7d7bbcea5ebf245df9b3d7cf34562d9ab7b24ca1a5606c0fcab03d3180c46016a5d1015ea1be0573d26d4cc2fe7e9e8504042d26f55d48dc463db4d186f8e8e7323d26a439a5ddae62a6a9da381af0a7c8f3061a35d53ee285d0821c4e7eee9eb81cd225412f9a202a284ef834d00bf168bb6bffbda5ef57204b64b8ee07fca4cd8c39f2958371f454c46485e945d9f4169d2b1d8e71a12e959b87d51d1c8d1c6c21a9ad41d9f91c580a9b999a1569dcd271feb2f306623d3fe42a0dc28d0e5012d73e3b1cdc93154a18f18fdf6735d0a6337fec2ec3ea40284d77ec40e64fc29e04c2b3ef7a7ad6656e90ddcc97329ba64a328e191247faa7c121522e9bb08d850c869d51a299f465b002ff42cc1580db3a7fe094e55afe8a8e2a9a1b29cde5a4b24ce914f807e6a2390f5d3c204a4d02f0282d4d282df4dc41f5efc4c6421432fd2a342ae11c433ccf772e5c8af91f0786a8ab3c93466818ed614f241616730a9a1ea58c1db353a80b7ec0f0d1c4042a43b302a882f50bc5b70249a946fdeca14cb38d6951a9f12e31801e99e2d3cfc8606474f625fdd756814a23c9ff78b474095fa1595e3a8e636683f447b1f17ebdff08602d1c465c0fb2a2beffd77de144ad4e21feb131a880dd523add2d7ded90b6340606f564bd9ec25031e6796e17f895ee2bd2fab52a3bd1accfa898a8bbe3d56188138c7cfe45750c1e6614d936bcbd89f8988e695c0c0e55a690a83569f591dacf81fa636286be2ca54b4adf10a0dad4d8e3e243b2d1d8c603fab87acb859091cab49a8248e1fdbaac0f8ac50f52c5d706f41459a1c9444528270125121d02310060cfe13c701eb44d307bc7d0bfcab99cbff24a22f17dcd10ec3e9b4731d37e36bbff900c50e06090ea05bcc3f3a0c092319dd5c3fc9b4310ca6298ad1ede20833d6391dcf29346167d4e9e7c7ab731a68a1934b2429f3a8f1db29a030c7fcf570c9042851b57f287d9e1db51cc0b54cd84534b60955066ea3c7ea616a6aa706af533fca053124dd356fb77ead4685302b36d787adc33ba62bd31ef2eb5a218be167223e3e7a3fa8b0b70fb3aac5276b833d7544c33e9d59c778962d46e83cca61773de4545b38df994bed7358c2ef866141dce97224c84a31863c07ad63307197c000cb6d82619dc31345ed4b376af5762f1817b8bb524927848d0d93252449c6a889416baa7f659dafcb162543e656b555f48b5454f30558206543aa1c9c55fbaa0f9d90d6c5dab10e9470570e356cd2e3f9ef4818b99bfe71cc9137dc5cf43a997d9081d3c8d38b6ecf4b6a5a48d10e8403654c33b67d0ee1686133b511f395212dbb873249459d73c67a646c3b7444a77134ab34111b7028717949a49a9750f24c686591ee87f7774ef0471ec43ba662d2d31fdd2a4ab154c625f43541ebc282606bd9dc2afe51f61573441bd49ddd9641da30bf40f38014f671874de837c45d62ecc39bcab05874ade4a176d16fb5ea196030d9653ccf121af3a5fe55aa5db8fb4bab6602b51c9cd8081071a78403c9c603d8eb3b95ddb603adc6e6cea20104d1d9e0b7f2d985bb25f6d4765893a8d7e45b4f6d24e8413413b9c8dbec2bce8364d6a646d56824062db0a7febf8266a7a3d84b0b147454fb6ba43a549059e0a63268012db06a126df51b28ac07b63848f3b80498b22aec2ea874cb36a63a6e1df3ed3b6650dbf6ef8589e456b9541fec6b9899c31622970302f25457159d170df57fdc0424322d3a4a2068bc246bd6957be05a96cd3943cdbb64dc165b413445630826edadc583b62690c040969e882dee792f8653b11afa0cd989aa70979b5b049be7eb3c5b53cba23bb5de4605ad4e16bc0934c66ba9025dcf310d02bd6f2a5ceee40badc2afcdef04c71700463a3b4447eed09005d3ad27ba1a70f9fb8f734a3f794ef1e826dc96185d2913f244847172b5c6928df9132c64f7bbb8fe42f021c48b04af9605a9f3eef4a210a5ce52583be62a58d4fab9f934de0144614445fb48901e6358da5257a937adac42e541ab7cb41c198606380767f10dc08fc4768f6a1b81163f1a83baafff661def6d5e85ab48d13d9d629b9781d297f69824067bf09f46bc5d542deebc89433147531eefd0d9e6eb3ca376b136f9df9dd732d98078a0fff7ac4e48e1e49bd9c2b649bd545dbbf72d03f95b33d7bf3c3d36ca1fa826e116adcb45e81ee9624513e88946853239b9c0fbd52bafbd3de130e1ac10ff527e501580cb1492c89fd660bf0d33cc9d295158fea75790dd3f89d849a402a7d238c018ac1064a7c901d4e50613f5dd1da15753d28f8147edb13bc1457c50ee296a063c064ca5541107e22b61f04b25dc418192a3e0467c9c61be9abdcb9b9ffd502f22e7bdb79fa947830ddb21d194e643737e9bb5f4226a3ac855ca17bf802912573ba51c6e2a63de74bc924965dc0b5a37bf6093f35ad94bb4e947bcfcc22424526608b047e7f112bc66b0fe64a6f6df6fe1a4f7fe0c3be1fca4de0d16665891652a40b6b92d16b5f0e88511d4b4c9cc898c45ad7e842d9dd21495fb931ff084069c05e046d91dbd6f9f59d558ca3ad9979a25b574b40d6296adcea94652d36a09b440b7f6c93ce3282baad3af3c4ce9dd03484070b4f13c46d1d56163e559a5b46417c21d6def9ba17c5cb36ac5f8855e0d8d6c3510b94865831564eb8814ba1ec46f7e3b02676dae4fd913d2c5ee10e17a1ea1f75cdacbcd7f08543e8733a077e20805127f6e266b3eaaa1ddb4d14054f4beae5445062fe69e1b260c0eb43b42b821d247d406835a5488d14a4d60659ee00dd0ba468322a13d664262792162bc5a169658a50896e1b86ea804d6daf54a7d2a14a51e7b308f4efd74bd5914891b446e3944230a821dfe55cc307366f8780c49d8e12a12633baa561a8101b10728ae10dac4d17f586a67be9b984854d83a5866aa6b8ab95b5bf9f35db8a183b1a7be53f10d0bdd9de1cbaa55c89733db6fa5aa5b007e50b1ba6812e457be23c5ead7f51cbfaf702f20bbcf6b9701740c764c5e7b9a9feb5143e2b4683fe6137243d33c2bec8a078a53949d1aac97447b5119806b40bbb37eb16ad943ef230a3022c6469501efad94264b6efdddfd1e07a6913f403479b2ceed91fae61e55fcf46e018f248af36de4cf268997b1dc61bf0815d04cd06dd6e7afe42b69843f4db546f7f021faca60461755b7acf0510a1cd920f634d10e4f763abf5ecb8fd1d41945079b0e865806e1ab0ab18b66af39499e3243b844e31e912aadb4a8a589c2d5cee76812553bd5e96392c7422db72f96092063ece5b00563fa43ac3c3a18f35a95b5dd507a35cac9d670a6947fa84c37481d301729bc74a58a97d7b208b09dabf279606c270c1a70090b195eb0692c08a7f5d53c4a2a369be7914751eeed04cab897ed9755d0547e1765d95184ac5297438820f4ce92a4719797e058de1be0b4443255796e389fe0150154920a3e3707954689343fa032072def4f36b8946b06ad1db10910fb125c192307f0d97db7de4ac5a6cf181ca5b960ec0d3553dc731273f9d5634adbe043eea986485906a196f1a35c0e2b45e209fe817d3217408e9fbd15085811f5ec2191c134b99aadaaf7a6fff388d891f12b5050b943afa2ba1616ec81c24f6610df855cb7aef574eb0276c9848ed44788e7d5ea2ee81dcf170ea64b2b79ef6ab8918a7de6ce00ddd2262ae3b4a91038dae677570f1b077029967512b656202f7c45701ec34f5c56086d9bc289a0f66375317561a4607606e2402fed36a6095747a8d2c67ad19f2d7665db90a15bcf9b4bf239691abd254665ac539f7333ce552c767001537816be7095d1b9fa5d673c1f38981f39fcb8af9b4506b9a0406bc093560fcb0f237782fc316880e8771c43d3de71fbf7490149b59ba7057480f4f88c4d6c1e33e2d060aedf9b6a766e4e452051b0bbdb55b49dee94e3149fa65599e0967f4ba4ec021e8ff2d545715d414d45297f0fdbc155054d76a968bdcc3633c9eaecc00d4fbd41f70ce7ae1bc5bea4c29a3206c07875bf26079e3bb8585da2f57698ad7a568757d6120f656be6adfbe3df54d88fa118483e308058fb8966f1c2931f6c65da2925075b8921806920d984e123618c12f0e1d6a58d3c3ffd30de863eff8cebe1880efc26c90887c14e307b602beb5fdb15db5cdf2bd823536533b488270953c0bb4aeae543a41f1a72388934485ec0ed8c9227f05160ad1509f1cee4b6000110b5b2153b08378cf2386d05c78e499a46e6e210933b340c2c50139c25b0acbd6a21d4a8a0bb308282f0747664c7e61fe49e21e8f5527bc804e1c4304f9b1c3d4a278834b88e0ffc3476d4add4f968ca1dddbc99ad90acbeadc38c90f21d94aa276a7058136b0c544a2196f7ac201141ff6250b15665d677d0891aeedbc0b0b95c1a95aefcc2bbfe70b776f5851f08eccc155b9766e2f5b55c5240e733f5fafc2346757055a589523b0084e0da0ef31a8bb0b26854dd5140c48e405954f4861a9d03eb69a81206c509e9aabb9efab418535a54dfa497c640b4ddce5e60184af7f8c7cc517c71bbf4585157faf81336aaee6bacd927e6d9566749ab95555e566150b8604ff54a4fe855062a06c5ac1e66d764db4578330ad3220e1961896adcb97232dd5902f8a49f55b07131884981f19a0b60964cf58cf9700bb962590c6d28632b0b6ec1e94a9eef7918663948d360c8f6b3fdb4265db8741b62c43fa3a6d965d9e191a543f399f2e2131a55ab5241089d9d9d08f391641db21ae2510cdd51308b3e9328362e988e442c9dda6c9b5c727ceb15b5e089617d5e607f11f5df56d82d53733472c1903b309451d56bdd8c878d1ae2035dc4503a5e505e594094cc2a8441fa7a0e6d247ec1974bb027d6000f8214c5c735df400f8695930a014e34364aa15a644f26822fc49f7284ab991f8f6c10fad2f03edf32f34f44f1a80aec3431834f97de1664f7002dcfe2a6ba8f340402977970a5c95ff6247c8536aea08604fc44e4083ca02a37a93caa12092c0f58120a681e5a110d381c581129581e540131781f550129340fa90c0c4e406913bf318e97b02458a7ca1469c3ffd73cfb4f8da78f34a36a1ba2f42e485588794906354081b1c445883db2b516bc47de25f9e31dd991d2bc33ba96cfd170bfc577fa71b942ef713ef33835b7efe28284e783e11e0c7032a794db322cc1fd54cf247ca3facd8f5fa491f3558bf83e8a80472968ed0559e073874b0d767990cc3dba1818d445fdf77e90c3f2fc02448f818dd7c6c854262640ec4189007ac9be21baf0e561fed65e031350e8ae739d0dc741e5630efaa199df9c77c4dd7c5c2a2500bcb995f90aa71d68f9a470eeee04caf49d009bb512dc9b178219b72b5ab44ef5af8df73a52dcfd2ad0d92fef3a11d7054aaeccd5d739f682a045aa284abe391bf715ce7f374d47241b243a4ed80fb7940bb22a1c9b6302cc599464aba0c52af09c7fb5b46ee43f3b52e730b16848082c1133b5cd85bdcb8812623fdd76ecc716c429cf4d71b0b9b468b59921a5a8050bf985163a4fa5ca8c64372912df4aac627fb43b6350703682d661d887acd98f9f90c06bf775ef3d4eed2030fb0f075d3a77b41560f14c86c829c9d39541c79299de3b6d304c8ce62f68dd0b3362bad5bbafcd60dfd5a75df177ea0dcf3f05c170712e5925db701e0b799a6e7edcf97e089f45e2ff30823c7b01fd6a5253d18ea02b0fec91a8e99d6d2d9ca8c003e9356da2672f629209655a189e7d66f83969b85cece700cd94cda337f56045beab29fcd35a7316cabf4c59339eb6543dbfb2d8c990103e1a4d4ac66e8dc7df3224425da0d1d61c2a143580e1db324264271b8615ff1729f1e9b72bea3f4b30c8c6e1dd482e2fbbe1a54cf3fbbd39ae64d821ba35c083445685b8adfdbbc20a16de3b58299bef521932ea988b02da1cc4ed60f789eac7a0576ee500129ffaf88d09de5a64b7f39721948f0a4e0f5323b653962a700180da0f61a410acc833000c901d627af760282000292fdcfca87c362ef907e3f46f1ee4c9423c3ffafad77eeb4ca2313d9c6b6be44c83beac19ae82e6c9a42f03b5f0ec80b21f9081c48ecc1cd87120301b0a442f2227f40fffafaf75b8afc94e020a4ffd66dd95eb635bb3528964176cecc0dee300262ae3df7ac164355bbdf12b6e49bb8cd83b85f2ac5925a71cb8015bbb2eba39d6feb4ab3efdea4f079d23f3fe6b7813d18a0232a04af436b3053004308c43135ae521494cab61f6071552e9767b93490ec84a854ae36ece74ef6d00e17400fa2be229a971c12d75725b20f4e74c179e263f9cca8fe19280e2ba096ec71c4aa812a11a8febbe1bbc4239dad578f1800d2c041b58277b95944912b347cf40724503d1fb4952c132528892283786aae865be1c4e0ddab26230711b7fa90eb42a0c1b26b9629b93c856e1cbfea9f8f2cd3ee23a8fdad53a6d8d3689668d8ef5375434531eeb244186fc26c1eb00bf9427ea3e200b08bffa1a34095069946be50226e6e3940e368746d49fc93263fff91fd9ae32f00068215f6237f7b5aace2c03a1bf58e012e1146dba93dcec64595d7a15ce281609de11f34f4e51e00d9d016ce7b2a417c6754ba3188e07b51af5fe38b6d460afdc3975c897494073a00f2e6ad6c02f8b507bc5ef3f2d3e8e89cb2fbceb350eb3a7f9b4369323a1ce41c124fa9c070023dad662e54afdbbde2aeb8e66ac79aea9e4efb5e5b076dec7aaaa4be064330453fc285e24d39dfc48d1edd4d301e32c8a316187d762a1b60f2cc7285ed35907d35c6579c744f0e4e9149706d45e13c96746c404372cb6e2edbad39f144496ff5818da6ae6c8d2b09b8b49f1291eff72cd7c84d0a38073dd3b905e1f4df1952750234488a02c28ccb487236312fbff8132761e565b393bbd2d5fd8bb6c3f2de960a5b9930f97141981cfb80411fad3434244a82ee731038a2174b124f9f971adb82838dba949c913deaf854d7afdee138572a448b2546bb7f3ef81ae017111dc63d025b9a7bbdf2c0010bcf7c0f4faa98dc7ec3669aef60b03e53a28de2534587e36e3c432b8e2c7a1cc92cf014a1af794d25b998500a16ec283188a3f2f21ee74e3b7b02627abcee1686afb3953b4689c804e322984c15a14ca09915066db4f4a5d926144505846b3de06fa144dcda2607847ccf34f91ca472a9440dfca9d304bfc32137e0dea16d820593a8d414fafa696a32949517915a046f65b295b7b1bd90458e5fea0781d02cbbc83af7bcf5d73230ba44215156a751d665f66a060e80ea6b8bcc74d0aeff7b40147d7c58f9dff33da88778011609e9dff30635e1beb0b0e960aa82d6c3c3add728eff69d134911133bc8e8f074f3616edf2c257d4374f48d4fdba845afe4ef74f028b4447e2b85719f95a4c2bc7b8945f36a98642c62e1a746ecbb60c67749262f537a76898288883d770f8961eb48b061870e60d1db396ec86f7d055d72be492260d541074eb27e842c87e339eb84ec5ae715266845fd1967242ff04122b8b31bc12f3b4bb9c8158c63e1fb677a7326646a396b7b3f0225c810c7386ee902a52f9ad6b2b664636eb63a4bd29a189480b0626cb0d0c8165d78002c2c0a889a11f8b762f8c3660180b0c71a623053405ecc6c47f9c158b054e0d454e44e6c71a3616f19be785970a5c078d196103140170d22dcdb7cae7e9ff081c3aeedcf9540d31c8cf21002048ec64beb8ff86457bbe3227c980a587bb36ddc7bce824238e2268c4d2755d24cf64f77640ae7fe99cb1a412cef54f5e56f00177ac97d0fc57760c00a045ba7bf06e975117f436ce1e455d021ff88898700a6af71e48670f5c70140df7a4bc1a3423c810137d4807305ea49be8956b4adb20d49ec6d86edfb908477c1743ab1d23b51d19efb7fd141b9b588cfcd643a7e1042633f1783dc306b48c1e61179087f479930313e92e8fbcaf2d827ec5d2277afe8ec6b10aa32aac318d2949f95807b36b2fdd5fc9b502076874dfe6db4e3a28b098e64b92351617296ad36c4b3a0f250e13a5c2afdcd1b6d1da631dbc95800c990b39de62dc497e3163ebc57ce06f4c031991d65d03b5fc709666b7e17f1c0b6ad2c9cc0ec61119510d3f6d4a85ff0a5cafafca108fa99794b49188e5b4a69cfd8ce3ad80bdcabbaeffc51a42f28373da41d5cd9327bd84558cc0b51fb8e23ee3218c82e52dac80e83f182b09c95ef0bf0a97b62144899b19a13a5b82799f96480588790c80ca39948529f9d8f3cb602983dec327ed7d2f4d9de24354cb8830b34a1900c8fdd4c829723b0035ab4d94289f81050cb16689305a4d97354f9ecaf0a0e276271e121b8fa43950187a05a7a45ae4b4b8f9f42aad8776304b20a11e2f13584f56df7e33b943596f5f7932d3f660df60ebe4f8e67f1b1f7d63ce4311e0079baf5c0b45ef265bd33ad0107e344f1010e5014bba7d8cb2c46cd484ccab3f45d2d1e57de91c36b25f39cebc7fdc82d9f640e9089d7cc03bba642f9fa635e01fd046d6907fe80bd92f1bfcaacd1082be325c8b9236cd9ac2d2ff9d6cc44fe2a599850f5ed9d67803eb072e6c73b74835080ee8bd982950ff74beec8abab7264271f329c4a31992839b946264e0b459d71d0740cbc87aafc4b05e78816494aeb98eef8e73e38731a8253ffd1cecef700e53f601625821fc56cbb8005c1b9b7b1cf0005e853f256c83231baaf8a74167af5c2a05fe1ee00b6215ff04a65f16990806a60a300e839c50914bbbc62f2d91d0abb6434b911ad10fa6f55f0064b4fbff5f3deba4049252bc11bacd4789259ee31d793037941562851560588713dc932d1fa4ed78e5edd8e16eb45d5f7fb7e9d6282beec6fa7d4ef9a04f86182a39f4f5fd51f2156523b2c8e089d0611a8166d3df646c850b4dc311f41d1dcb9ee1bf18430b152df2a5c4bb7aea1be94120857c1a9e2bdcfad584cb3937c110eb856497103e5ab038944200c30b6891ecc684658e15b2dd4e449e0cfb2b26c513c1610e8bded7e31abd0fec194f5eddc0e06fcdaccb31ccced08577e25d26797b65711a589fdbd37f9b1f5caef71122a65c07bd78f0805c0615d14ca10a285be1f0ff4ed10b49e532763753afb709092218cd0df0a289e72df82ce77ad771097422cb89fa0c0bbb6c098546884850169313fa741c8cb1207b313ccb65a6540c5bfc9afd3c113ede53fdc4977cf920f1813d030e39ea523727bb1610cb46e056d4ed359feb8fe99a441a55b8a91255e943981f433a059af8ff105cdac143beddd60ca60619b1c553d3eb4ffc63e06e783e69fdaff2abb47b805207a8cba1193986b42679274917b7f49b26f3119807771adafd64946a4dca45744ef1a0d682260103d57ecc59a306f266ae4360a235225cd42bf393cc1b0a63702dde2c6abedd5e505291728648242a614222b6c9da941b906cce99a2291491f052aeffb50ac5912a20e2656349f2a4822d7437390552110219d7b58209167ae1d6803e9996e8a82cf4b238ff80d000d81966892854ee0ac62e07df3b89f6e3e29f8ee919f4651210de8c65012dbf31621ea49767ee4a541456e91f930449aa77625cd8b696dc3d3ea923875f51eb6312f75dd99ba58ce42242cd3d0e2133044f00522acc920e96a660079a51363e6bbbfe559b11df2c2aa97d5d44102162f802d30fcb6330e8e56fabddc616fc63fadc3bf05110997a0a62e54936a217bc9891ca800047ef49e830021608ece819cd1154f9ea37d63041dc83de2f53214291eb9c459a5777e2467f46f1a221732d1275a1330f4cd38d6b258af4c55c9400b47b9fe3de1b466c19b6618f8f50e82177c847748dc600317d20b4d51abbdf2065be0e4f1f45330161256ee4a3a739da560ab95878ff75e3288f320b32bd8cd26035aaf826a1f93b5a2688b4f39556a29e06422642a88148ad3beff85434aa4c615b056cded2e92bac84e95419238692ffacd94e5c30d64df0d712251c2833ebcc06a4c406d2ad51dc30ae984a05c0a9db0a58408c799b61cacb0c4daffc8fb5cfdf95cc3a2a599e866ac370c34333da97d0f2415817818834659cc78a8c39398554679556b7014067e4b57edf0bdf8c81a94a5c2867e7fb058cbed460ef3d2fb868a4c1a8387fff81e7474d5ce86539b908b4c07e0ecda41a0fe6e59572253cb961539d6ce0bd81fac9d46a93c80aeb7edb30678783d4985bca4caa055f5dbf9a4fbe611391247f14a2285659e22cffd367c0a93cccb00d404c21cd28baa4ca96912ada7cdf5083a3db2ee3395e8a49945248ba13827bfb23beb64f1d3821ba4e3d7ebbce2c74ddd8fe513fbb48efdaa871b21e6b96d947eda6260e5409b4f324277da6a54b626e316d3caa0ccfad271503a6eb8512f712c3ea0e943abbac30c46b6ab1ae588c715ecea5805ee03167693fde5acc0ef22321627d282cd1ceb57790c68fccb57d0a8dbea006f2ba472a0ab5d9ebe3eff21195d6ab7444e623c6a96cd9da5db976db569b21e7516edb2a5d2a0ad54e8755ba105ab75b492acf7680f69211c4c3fdc2b5ab691b77c08fb867996f3f29db23c21474788f20d33f40a35d0fcc693b955a2aabeccf0853f63c680864faa5d513c3e17c3e7a9d2ca9068c11590af3694d2c2afa2a1b2bd8da9e7258ef787bba084eee4f2b1e506356a6cf0776a11519c1a9fbd214d981dff8bfa3951bb9d63f14b972992c4a4c9baa33f43b2a3092cdc35cb65dfd697b5f605f1958c1fa001204bd41216ea28b72f8589d54ce6154e70a6481b0a93076aae29741b0b7d8396a3d82a4451ef34e2f35f49ad9caf5f546d2cf9cc5a8d0af5594ba8dd405edef4456abb7f534367153e8827a4094bd5530043bd5eccae51be53565f9d0d3ab19afa6dc46e32179fb5b89c1b7bb7c0b9abf559dc16468cf4cd066c69e72190d6570b368cc65d515f79a7d26af4af3c736de24344efc0ed650d0b32287af3a65a1b456525802c1cf9dbf27f7202c4fe03848d087a2f15e176fda6c02c2d4b1bde2c4ecd9829f31364db839e812ee35581fab446ee07883916806994045eda24771c5ebfa43568512fcef0e39b3cd57d535b0b161181702b1703a14ccdcd36d1caa5ebcb6f15f05a74c694ee58788a2ea2c2aafebe6b1e5e64cb8e5587493b27eae3c645ef5a220f837e5fdd19698a596f4f22eaecb9b44eab2993ff5417742df522907c6a29d5e7dcc58930760ba6620a0f2b10bbaf8cb882757d5f39e4b6d4208997ddcf9f2dd0fafb02ed325579f025d662d62d5582639edd45777c0c5b2e5633a899740b50e56296972f6653e20d7365c89490c6be223691de575cdd506cc8973500fa67a89a43b91760370583a9eae5c560ddac8122bf4214bd6ca2d33525aee4dae8a27f5ae5624d30979611e80732b8c46245a8cad8427c1b365952de9324074901f27c597e2c2406042b317c1a1bc26007116402710572e103321888dd2a2a664479a8168690f50cf8494aa23a7fcac39b4ec4affb48f0cd3103a7e3d2f995b75e5a3a11b240e466eeb90b8ba8a800de2a279d0d59b8785cbf5639e7bc300fb8ac37bb7632472e3d457eb1d135840fae6a60800fbcf67c393578f6a8b10b3c4af2a959ebb449eaccb5aeb5370da777293c19f3fedf9c4cc5570e29e7048d49b01e862dffae96c9d994ced52bb5381581dbe3e7f3ac35435e1b2c49a8cae17975dc69969d601765d0dc0823af0d51b5db0acea54866a4392dbfdfbf80f7628e8659a4a63f6f5c47a23b8f276cf17f5c4e9b81626aaf37e306aca94de7abc4e8a3da85848e5dbfb6194367048642aeb43baa2836ed947d205a091117b81f3e476398deab16833deb4b6f3df84417fd3119a08dcb88470b0ddc8286f7ce17f5b0051fe2fb306e315e48c5af6f74474fa68e2e7668a79a9578ec4c67a611c8615488370b3d23c2702458dd4ff005a65b4fc37c4277c95ec0c878305cf9b2c4b0dd13cd493f3aeaffb70aba44e6054047f15165fd67176fc14409f4fae8b8ec3e4dd1ff224e9e1821b463a50c519e3c07588c224fbf705eabd63ca509a1c80b7144579a2fce4117bb7f95b444bb667ca5c593e7081e3c437045644de8ab6cb3144df8cf3f005d082786e5773712b8b15f8f8eaeb060033474c0a585cee921481d21ec63cd047bf9cc05714d54eb4f73c2726a7157b385f95122f1ebdbde3d668acfd8b5762d4e1afa738a85e61e4eeff9cccb44b7d0b2f09c033c5bb0ffabf4a0e806c830aa0bd8be17b9cc053dd86ca7975842e985f3b6c41282bcbc84c38ee6102882c0752980f16b93a5cde54822a8bdb1beb10a96beef437542918a0e9088662eebae50e4845882ce19e4e00cb89c5a8861eb7a957ed45a0b140565ab91cdf04f453459f75bb7fdd71b26374f2252e34f5dcb501002a7da1376afc1ec8c838a4b741fc212bb4085f4037050c8d0402ddd7b8c46cac2e56f53414a9bf5a59232793bcee8107c462c6ded846e3eaabddc1adce65959852c559e3d21c4419712ba55a02c369caafc53168b3cd0b331cdf3652b14304e14607b5ec4c3f9bbf7f98732a47509fd4dbd1d67df4f3fbdc4ece0206f0234e31eefaf4dc8e60ad398d0c1c8468562469775341dc4038e5dd895eb2cc8e2a0d6837234ae498207306e07d2e135a627c16622116ce2986654fc9a52ff05de427eb63a9c8d1f2b271102d028f552eb2374f9f1aecb6c86615f493c986dbead489f6056c48539a13c2b142465387f78b3aaa26891948f22001a831fe15b2833ae7283faac1393d417235ff2e95e862dc8d84207fb3e8a7945275ec5849f10c3fea139dd1690e1bb5cabf133f5166be34536c7d64937334f29980aaea7d007c3db95ac3ab41da854a276f63d6eea50d7872c99c5e43ab659764f45692e7624a704dc4a6d8b086eb9490cc5d45d90bc73f22e9b2116d9b1066cf2b9f7ec0da7b49a10865bf4130e88afa0ef2a2055c41301350ff6a7490c6a868d8840b38a62f5a062ca6b0491c35e4799c4e39822adcdb07678b1c34e4d8a941e1d3d59a270644e461a5b53dc9dcc1870b57b30ed92b74428b6bb1425f2be37e45835adc507cc13d5e1ab1006a282b9d5220d22b2d5481aa7a65cf30a69b924004782aea5ef4c535ff5e2a938b0d7e6ae605e887e64a3c5b1f45660c0bc7123a4dc61cb349f1403d935e2f988ecfb55b4914aa6b72415a1a0bd2bfbf8c70943209ac741b0160e47f2ba90219363cbe597b5dc8646b54edd8175ed3972c454205827f7bed59e9bc30c2dddbb5f317222764658baf92845afc94f37035be396f666ae296a258f52c373f19272a4a5153341078c27deb402a4aee08075e350914c9224c0fa083d1167267a6731d7ef14bd9a3df0c6e87fdc89218cbe74aa1fd370787ddfb9cece07107b87ee4eae49ffca5919535c5571b9e973f48b70a915e395cbdcf7392a173e2474ea28a33e5b97d16946c972a939e8aaea6e96761170fb19b3d0de877db194fc4354200b1d92eae5758e29b78d89f9e5e7a7c9d8afe54007345a1bd24af4496765e0d0b37d91a2888b702363d161099b32d9e7068aa8c749ff603b05e91ad3237440ce46b3243034a9cb7b3f77e9438495757ca3647710bdd36bfcad11473f3e7f58be0719b1b9053f7582954d9a8a4f8611b19e92feaccb702a53598b8f31bb2cf7963a1cc4df8375f5b80e8cdd7afa8d44ed27fd61438b2516dc48eb9c65635f5246f59e88b1569caee67cee362ba39273276d85da021e8a0dd99fbb03eabe4865f13cfd880a79d5dacf0d21cbe0d0ada22fb9bc4518139cc6520ad2f2491232e1a37db80b1f10ffc7b22d7b0dd4ec8909ff47ad884ee9d0fbb45021b3612b85473032cadad230b0284ed19d3db0be753fdd71b56011c87eff547d63244d7cc36231f4e48c3b76dbec9e092ede4f5817175b1d76f259f70947daf66a77ddf444c3ccc8152d2c295b098809ceff6b700d8cd85e0c139bbf68f02163642ddb08ff4c2a57bab819fd15792562767d66350584c0ab47c53004f54f91e3cb0e7b40936c2fbb211f729aebf9caeb04ab37aaf0e6fbf019514877e94261b929c341345669587fac30bb4255aad9dfe0f01773545a15392c536c5370d08ff729e6d3693b028ac0e343dfdb95c61099e0db90e3eac07e089ebbb795ddb3768797ddf768020c74fdf524effcd13ddcb53cd3d4f04701a35fa40f92975a4604147504af4232760b34298881e7958f09dad8bf13911fb77a541d325e006e67b261c96f3a47996388b9705e5eafcbb3ce34745863d49d0cb2c061ba9bd0b0403fef3c5317ec6750df25757bd1c3c763c0630303af4b98d80e6ca92c841737478ad832b050279b9c3fe977e2717c2b9803efa862f8604cfc3f48cc76f5e4303577ef04b25ec041285300baa7829ea3fb4c9c0a627cad08d2585b82ebc982cb0dccac25554c40f87a964f4fcf4bd465156ddcb51fc6a0b8b00050fd85bd4ed2b58870172f034a2a26905a8e0d88c30cde653a992768de414c05e1fbe232689717d888c8b7b4d04a7a63864a934fdf0ecfd606c2d2d50ae67d7be8ad484c810523c810db76db506fb27b71a16e44746ff775d87aeef926d38fa37e00a428ec81078bb83804c4f0678048eae5224b55e0068fb3ef85772b3d7aad0fb73fd69c685f8904fa2fee016e5e7c87c1b6d4bef89308532d18999415064565e9e8fc2d8be2af5a029e62526520192b036577fabc18f07ce82e6d29bb7c802dba5d2d9f4d32cc6f3566135aea079d24072c42fecbe2eb4eeb4ea4a5001670a628147f6f872195c55237fb679ce76edd2797de5dd0bda5942a7829209ce2f9c6de69bb5144bb93349de5ab2cdcb8592a2d5463f059d01f00278169ca7d48698cedb91b250796b87f5a5e652bbf1d896b710de9b50a6066c28ec0800f1d63d83d11e5f036c702e78220263bb800229061e76eb253a4946162a27860aacffa6bf92792be532f6a9d68822c4e038465a5a1e8d9a858e6db88d40cdbedfbdaed40e877f74674dfaf6c89a7afd474a8a606a91fd39277bd8c6ef583baf041dd5f1aa8c97c25ce339190c41915a009c9a16ba783d62f971737e48ef7d6b111c82bb92fbc00581a31141ddced818202fd12e3a930516545f4aa2abf753dca314b1d02527daf0d1acf568ed3f1248dda1b5a8c62fb24e79e8b82c8fb24c6b4890982ed3af8589495867f2bf1a706a1f13c8552b1a750b83929c36af67f84f0d1c0affd7c0e595968d6df8d2320922bda8c1a9857543df386d6606b044915c2cd9fbdd17a57819c87da9c9ce278602be7afa0d56ad32456d6d6c2263d621c9c139ea8dd606bb7a5a3168b09a8e97d54af5a10d31b4835c95fb0b020987c0dfda7d2a6512c757f8ac8a0d5e43021fa6182534b2ae14e4f5209bea2a11ddbcdab04ffd1be5956980e7e4a560545684790df4e1f9074de605a23f7667d6fbf1d50bc5adb0877a4e7b9c0d0029af5dde03a28ae0c82f6fa8a9385e9ae3827d67c099ca3746f7411b03411caf222fb4b803fd25d3c87db39865309dd35bdebbc00a1f05fd71a5d18d142e738c0c5578743c0c32d02d6bcc1a7c754f602964e45bf4a59848173e4b947d8a59042744ad12d777c2b5cd6a0ad5eedb65da09042ce16b458075b6193c8fe365a3f5c4af76a58fca075b7fcb30d87c90f185e4d20f96579631fb1b2d38ba634f7cacdf3b3eaf67f701aa47b3582cb2f80c1ce7e00179113db311efecc575c8c12378bc13776d0f736512c39aa9783d373b3de83144372f79a482b1f04e1e63d67e0f38d3faff7e0ba047b498b8683a8dda91ac450bdf2fd5d5a0fe374f6e90ebd02ecae1743135d0ba353ba6f2488fdec95f7cc8c37e9643acc1dae07b4b17db027ad725dc9edb1615df4f563a8e5db6aae5e0ece61913d3685ea1684c8ce971598f185408aa13f9d1dfe3be931dc79be17127d40867268ad607aed970b4bbfa39371dd034293528e6593b7e8872e21d43cee3f19d13d1bd8b38046f19e1ed9e6fe261e60af251321d2d98e2a268509ecfeac835dab8ca83c5d989a68a4f1117f25298dbae649a18f368fb70d5258c38059429180320e369b6cec9941c2ce9ff40b9a28946ab8dbd4fc1805681afd157947451a9a8937fddbac8653be707db4bf19fa8c144c9a15138f9bcf6f1fc8ca66fd09a74c8bb513a40316bb072f148963701ab169d6c9957ec85692c4aea1000dd31e70133540c6f1efd082b6ea251e48c3d2399c9261b10e262f348d6564e755c0aeaa53e9074ac2ffa13bac0649028b03f3f39a8625a343dc4040f1959cb9016eb6d33bc40b7727cbf8694ce0f7adf170e6ef5967c9ce41ec75479ba187931d3831800310a3022d64bb7584e57b7b117830fe6ca03610aa5a98fadc59cf700433b8c3887ac4c6274f52cdda6da1382897cd6351c0b8d8a260f25ed5fb1bff3e75cb42c4485c2f5e379b8da6d2d6e834e4e9c10dfca06983dfddbfbfcc8ecd477951579815cdca9b03d1b148c2bdea816ca405862fc76d9cf1b47e3f54f7f12ed6623633148ad33b238d65fd5d1ffe48b519d2de0ad16f18feff58ef3644c78c9f025472fec6fb578447769187e22520f1fed809b1b54697982ad3d91773c85d7e95992b64d5acbe27ba12c234c162ea391804c6ffe14c2de510fae65bc0128eb0b690f240af786ca2726b8628a7c4a3cc18504bcf95a0b61a5df8b4dd52465309366e9b7ff8a54c5a7870e522eb9ea3a98db69563222068def994e9d0161178003f718c022b94532e86dda6a2189d798554d35ca1fb8cb591c56829e6a181f22806471b74152e30c70ee9eb9f64a4d6f6b2aac3fd25412d2927c0e05a10d65ad917d7e621cd99bae3a75b9716b92e17c446963dfc10e433a2cda6b727b64acac2663137b00d59d8a86526120117bd7de91231e53d9dab956367dce1d890a69f3a58f133a8161e2cc761c7e49cd3b0ce6f70ad33346529102be4c5a75b0f53dbe66ae287508c1ff5fd3bb8348fa6b2cd93ec013b36452138d466467b6212345b3aefe3dd634e3dcf8b88cbdc2d88cb58c3a9937bf985f32290496915d5547e510e65b5a37e3d9f7f15ea602dfa3889544b8bf376ae61c2f07053484eed422cd3ae884e5ffc47e905eb78b997b2ab955ea33fa93ce0afb5373bc821ce19e25ea99ff1daab0e11df3f477c37f252d22d9c5815c402943be387000e4c409b5427c8789131c87cc0ec902f415726618f781c4b238ccff26feeb40c38b8cac2e253cd83596b5e22ad63a05e861ff7580dea74849926eef5747ee1da8ad41e709380069f53d3100381bfc213343e43db760167e44989f468771a44a08e3aa3e8ecf2f033d4b043e3a536babd86d5980a4f70de6ff13fee1d5c41db21fc053f3d76a42bc429111fdb82d7bc43c7c75a70af9a44f4be62849898936a37618a441da7803ddc4338544f4d56117a60a3905d909c45cb7246373e4e0a11dd3a65c867701a0203e919af9664a9e749ad70f57cca2419ea4a807a3e33083836cc935d7f288b09a53ed9705429589d1dfb9fc80fdcf0a5619d7bdf961703d8cec7ec0533cc2cf22c3a30386b9e322ce2ba7a1a8bd5f1f49dab4c86cd44433ffcc26b0d00ce7f46f5d1e5e4260d6e06c3438d7153b8876e102ddfd2aae99b8eb67813b0df27271489e2ad4addb0a9cfbca5ffd572204ab3baa20c1747e042c53d03a383c070ba958f1e4fd2cdcec75341710efc41dbc3ffa14caac836b03fb04c66d606afa64279cea5d583cf22921e51f8356d11dfd27668fc6673beaa1cb24b73ea0dc27de3c1112deb5f9489c98207674cb0cd88b47d99ae28d28d15ebd6da43dbf84ce1ca1145dfca82b1f347174c345a310573f075820cd80a8a4a0eb4e7fbacabd12a16dcdfad4e2cfce6a4338159bd24eef96a0bf31cb2d7eaf5ba63c063ef1793839569d522c6049cfb756bc6cdf82778f84748b46aeb5f5174b8459d01ff091d4592d2579bb3d52eb3aa236419bddc1ad19916b96ae415ed48e0631b885128d73ad7e2dc0fba369373da84525af6c0a324cee285452a6f77b77e8aa777466c485aaad60e675d81768f5bcca93bd53f9da789248b9dc1a091440c06654cc3b6e9363da6130d10c4bd18f2b540bb962dc39610344535bd6427a5303118029a096577fa60ec57f26b395247f0bbadcb1f07453cf4f13e2280547e9cfd3bb9908d5991f87222ea42dd822da4b95e26f5b84821309460a6662f82851167fb3d920ee01d546d83cf3b7491091fb18cb948fea8a279c6c6ba55c107bdd41c69483d466a7e0d72d4ea88095d6e2ccf46a18f73a160d7b88ca4446afd5e88aec5b7edc5400ead898d1c024d4525ddc13324cc4ad40024f42d832fa377e4a58c0db256b5591c43bc625cc8485a5f77fe862a091c790408941f60fd7509c705bb289042fc8380d8145eb6a185e33f74509142e5dd6f01db4163dbef823dcb2b6e080a51a0dc36538ff17877ad2bbb77bf1f81c303e97c15a014c9da576eb918ac09dae3cc34725e881e0f14c95d0a4c610ad5ba03e59da3eee07fe6f1039a81de879c979454acb1e427cad1a012497b9562167c76986c8c84b14089aa66f192613d2a3ade0596c52230034236fa054fe7c2704dc45b5cf041c2d1359124f8b2c1617b46a526f37b6148c4e4b102f0dd25525b6324032e963b3a73d00be07b1ff8250c21fbf25a8efaaa161399d437b27f2ce12c67988f42d51e9486637d5a2d7a1aa714fcea1cfb32c210e83c3a9a9235d95264a58a64be9219777905b199dff4864a5d2b48392384eace41b29230d99bc571b3b62c29af02d1c16679e364f0c8d21e62e53a554f4188824578f87c20c92a63e9c6a77199fcc3b2a6dffc1a17c5653827c7e86be99eb96cbf32cc7a89b49efe29e26b58b53e0c12cff6220ece447cbaac920eefe93b3204f519ac636664084605f6a6cb1c3a0ea1bf3b8dc78b6a02ce4bfe7e0ca95f96a104d199304f66a8299ab24b905bc4d580a256ef191eba25ec5ccc4bcc9279712dbbb3f76d2178c9d231d069136ea641296afd069ecee03683221bdd85bbf3199794fb5f6be54cb9834d40e58c4355a936e08c87295e8db09b413d6944f1724ffc2183116c06ecc6c2a10da996247d9a78cc8266320e1fe4d8e13774615be2a3e6993cd44d9a0e99236d4bc2918f53509f88ec550ecd78a534c97aa069d3fad9e37986f4451f697e0bb0a8dc00c05387311cc6221adcb698b8ad1285a96f7e46e7377ee1e3f4d43fd0664eb77925f2d12b10ff42748ac53bda7da26d56d52d800ed4d4f449644da917d6a7b5ea87d9b033682c040f930773718570a98d4fe6c1693c31ca6cc58d2176913525a96bfcc0ba8be2393f1ddf22367723eb39b6f5bb2df9bd41170cff99c493138ce9a6d8f982c559e6a47f7de8eeb3d0f9655616c35c3d5371962a090df57cd0fa4aa761d6903cb91419c4f42512d670213dab563c451fe32835741f8ac5f71a0624ac62748d5ed41bb548e77a18f0710d695bc47450a1b874c46679bd075dbe5c57b13f30ebe2d0a68a3576b6e51c1a3926eb6057704af20ac0a6a1be33baa6806756e6ff88b853c58f405c404f0bf36bb05ad9a2847f29b97dd3267a80e9ae813aec42c9ac1fff6d468470295b506ba5cc5ae7bd70a52b73104bd782e14a430e15480e3220cc496305cef79c980ecb25cd2a27e4b24088ac63dc0f5eea02c7abdafff3cca10204f209b6577c2b7f643a3e90be5c891a37f116285d5728002ea8029689d87318be5b68402ec80845b5eef691379b6a9b24a10c6c978967e054adb6f4b265fa93f3e9b95f4399f83f4fe5954cfc460d0f63fdb35969b9599dbb2becec7448710682a7fd7f1688fde05057f9f474edd1e6a45aec16ed1943d3b45a2ec03504af1cf12ec4264400198ae7a256d3dac098d5b44cd38f0add65cac3336fac4d1b9e381badecc19dec652f177fa300d4e3fe1454528f1d78330d4d5f5503e80b0776063e1f50729461b83e63904620824f7bd6b5fb88bcc91a1d2fcdc3366852c864665897faf86aaa2fc31a99ecf7b7345d33f3891f560e19ef426dff389d1f97772ab409809c1c83a8c909ccb4d1cf546e70447a01a4ee37fa6189b94989164472462bf5c7c8885c52dd4384e5028d9a82cc901c89aa770095e15b4ec3527c533911d4fb145134bd962ea0318afbb5b026cf0f8739b1427691da997acc8fc15c834bd27a9ecf65b1b68b502ac1c2231f17b015790225936d90814f32a6dd7688876e992ebf656274752faf44832fcb5dc1cf4c05b3f41440f7acb68305063b32edb28c736726045cbb6325bd2e9c25076b1765a9f49c8912a75ca97f7d8285ef2c6df4d0542044968ac4c2da0d9552192af91d83b127e8060a6c987493b1f4680fe9341c4037b6b32ea33b636ecd8dd3503f071dfb516ed2055b5e592955c0a4841bb647dc61c1676be08c8f75900dbe1b53c993f3063b9d7919f21a56e7d2b977b0384e99b6cd946e03c2f08d5632b74dc6ae62566e2673b4bca0245d51f5e601682896ca954c834239e54443cae9971c493a94c4196d2346ee3a0bd040f668e5e49e943e924854c7b9d1dbd2208ca252badc4c394c84c276b28c3970cd99ddc9f0084502b15e1bbaff56707659c10db613f0391b65e33ba13c26c85ae3ae8f03e11b8185f126ae053e723671c5ee4ee8aa0f90a1cae00f01fd15839b6f95ce2e5cf9b627fe42041fbb976c7f04ab5f82e4eb0c378f559c5d57ff4e80e206b503fd88e04ac22824c686ec0dba2e933b191fa14020de6b43f7df2a8e2e2b7183b2d5b2b1fd6f668aed87695869471b57fa8334569ac38d15f6b8b92bc94a265460dbb573f415e4ed032af3ce965a20181ea5033d9acde470a13059648294f547a6e8ae580f6d8cd2cb48845e92b3385094645a8948ccb06fe0d102a9acb732d90397473a1930848510a016c9a10d324fdff46c658d5c140c3a8823961049c8de7b6f29a5943225198c0921090109398eee676844e5287fb088e786979be40f3e069a64f99f975b42dc5f90b867738c26e08006dd35a5efcc175c2e43232a3ef9b3ad0cb118c20e41364600d26c88b9fd3785036e0b1d496cb9011015a024888087ecdf120192cdcd52128951823bda1f7ea96fe6bba18347f6a2ec53b6647fd510d9ffa111126040a310c820fbdb2411348567b20028c7d782b2bd4289a81631370ec6bd8885c9f1498d1ecc1b5e5cf85144815b9072e14b16d09d712fda50c1c540930c9f0bd2d18c35313beec5ef4ecb86dc8bdd123fd94facc986202b7ef69363673b5298bab812673e992a891412f79b637a72fc6cc75d33ee15616222869423769423260624aa2184dbff65431f06e6b16cc8e62b7d3425528ad7681fb78f3fb94c2ff3cbdd7c8a4bf127cee3acf85bd762382bbed6f5f01b2d5ed362a2f09a0e93c56bfa8bb36ada8bb3aa784d73f1a258838314c3a5189761bcc6f4f1e517afb91f7ff29c3ebe048a35a88f3f7ddc35c56b643ea63ebe1c8a35323ebe0c8a35333efe277d34e953147f4637c486c88a9f8a2fd3f516671175385d0f4556ec5a8ab3e29bba9ee2acf8a5aeab382b3ed7f515ff0ed62f572a927b114cfee618950ed7c6145745e57eac9963222bbe9d63628e19dc99a111152436a0ad89f58d8a0d221b88384eacb9f488fbc1239c58f3f4c66957465819e1faf76feeb27805656b520c93c04c57b5ca3db7780342a55a41a90a324283e2064c88f112822d5510010210c42001842e437c49e28819f48483810a2a86a04188a1392acd913f9bcf6b1dd1041921c4e0a8aa7e2608323008725299608fe8a28702210a45d92106587811e28a992300b18322f430040852d0022e062ad80ef8db2e43a323a4c8598646476451691e5bca2863f4e812045a92a4947206910a7f5785a143d8337c9ca6551df67cc88517797eca06105cffdee9b62de892b0ddfa3560f86b58355e35c5abfeece16be21c4d47c3abc638db6b0f5f4d362deb1ad369f25acd5aed63af43356fe8d176aa4adde31747b9be5663c86754ab4701e6a80f13005fa8df823b60ae5f1a0377402295177707508b0140e8825c1fc26e46d54213d7561eeeaabd4a00fdf939f4275ec99cf92bb97d0ef7db4a3e075f8e734c2bf91cce7dd3c357939706bb5664d5377536f5b7fadd1157e216a8a83f74b11a4377cbb03322bdd31ec3ab20d9633f43f618869de35bd259c39ffc1b3a63a69c754922d69932ec9a49a403d00e8fed9a4aa403d24e969d272ffbb76b4c443b20ed70d991f2b2af6a57f3ec0065fb332d03a6d132f8d7af7087fc5aeb9b8ea8d0e894d27697a14f8f98a3605903c8f03b58f33fe3bfe441fb68eeee54cf5cb3e6ee32b9bbfb4bd261e4ef9497c87e4967e09463db9dbf556757458f51da1c713ca9683e991d1b0d15cd386584de320c9741be54a188a932028451060863945ef731aa50c4fc2fc618e34c01843046995467d22a65a553c21db336cc41730812b3a451f6c3ee49e5a4b7093a618e1cc4f309598a2811ed51ce496985453ac85e531b0673543b6924a40f5b06fb10e6982f3dc7873433fa9c9f69dd32ccc722d113a932b435443a07dc616b0da14b89b40c18cce125fb57eec754818898e36b1adca22ac6f7a21767384137aa3d518360c4511423ac28aa1fb928795168d053654c142b7ec8aa146d518682c0a81c6951847aec0882b2284a00518192b0285084a023b0519c00319500a344d2852246082022283e0842044750b47802e403258b1e2a3d50acf0814ad0b49fd20124d2b4b82730b25ced0b0f2ed5010f182e581260b6f48029b2110212be89975f441732b48c8c50c109cca645fe5234c8df4c1140c89326cff9f3439e3f5ff2d32844d90631c6bf5be4f8aa229a2022042f776411128eae0e7a4b49d1c116430c653722224a56b940026721ca163990b202c7a2411aad0613f7f6091e37189fbe72568d715e37ded2deee886b4311ebff41a4031019e25e6c98d449163e843ea49cee6a896589002855401c307f160150a4802c8965eb47d020cdf7af17dca0cb5fcafb448334df492857ae0613b70613b766c8c4c532acc1c4b53598b826ee29e763f32029b70bdc016f90ebfb4fad379ed0bc1b36aa5ccffe867b9f75369edcd975762120abd660e2cad460e2cea8c1c43da1061357cb7006ec6fb8c7cde05c11b7a5b8eb739e9e5cbf725fdf9fb8abf4f59da7cb8ebbb4d5fcd33779ad26fef92814ea7564fdd216d44b4897be7c9311b5bf7edfafdf49b1267eadef4240e91a872c1fb8c3f43b76c000430b2d609c420a1f2a6779fe97e5cf7d7ec46cc231b70fc4511fc8bdfaa8ce7d22ab7e2928d7dfbafad77f72fdcf725bfb11f3094a5cec391f91551f5371bf1e62ed70b5779fa8d5774e48f3b8571ffbc6f04a95e119f7eaab9ec3381a7ac7bdfaaba771af7e2de1cf72f8b31bfeae863f55e68361ac7fbf06249155ff947d915873fafacee5a0fe621d2cd8ebc847610ce7dc3f619df81717892cfbf56ffc9095ccac6466ac7329cdfd88d962b7f56fbcdb72ebdb5abf0530d76bfc8a8d9c84b81eb0f6686c3bac125239a78c31c6585dca6e6cad4a25a58430bb3e6859967387c54ef0e3d3e0f6cbf8b4d66ae5bf94766298ccb2a8699b675c3b845e4b5e196794f1ffb3ef3fcb4ada13dad70ebd87ccab200d719452cee979dac83499e24cbbebb256b7eebe23209105bdc7d75ff78dcf3dff7e3a5f03744e8a69a463430d808cbd256f689de9373f6a73f6f0fa59c62aad5362d99cda5c21db00c0ec708e5df7c11f31c35f05f10c71bf20432a72e715b8d81eb22b8dcdb5d8142d2d84508b0bc6282595534a08b718218c31c6f835e0a6c211b60610422db048859fdb1f1bc20dd6e0a87adf8d96ad58490c972293d49152c7c405915d141515cda028c6a2188b6691945372994151174545453328e284f01d13964548e85ad44a08514a4e43c9501d1cc6344f89eb9d9d7ed23dddf3b37156dae74a0705c9a4e61224476c9031a3a3a431620874399eb0f500926fe0566e880c3901aafac6b76c8888303fead237aef2c1ddb83bc3a9542d2b8fc16d0737ddb15a7a826b6aa2b5e56a55a8954b43e0734d191a4109c2055078786209da977bcad0488820685f5c9ba191103ca852ae96a191103890428823218a84000a632f512ba2705313db1f5200c48c218e543f280145c6077a4ef8018a10299f31337ee0e189cc932019b675041f94bd76bb4324a55a2dfb05caa965d3d26113658bb360a651b8380b6699eb830d82b84f76503e5cf1c444c4d0c987277c4a3bd707267ee0a004997ca0f2648302a6e4c310406849dc1844643f106d627ec08010d27a0002101688a3ac871a48a93e45986dc9a0c7de4b840f6581102d1b9b0f10d12582b0f70ad185f610e5a765632325888e3962ce19534a8ae7040271c8b78dd93a63c428a5ffd1f8f2e50bb49ed24a1b23ad31c6183b463b2d9c73ce15a4b8fd3cbdcd1a4d5ad1a88cb26a34c82cb14c398b56b111c620cbef39e77c207007f6934529a52ad036ee69b80ececfba15a0275bc8f05703b6b142960ea00fa05b6818f6daa02945cca41ac4f323871044ad8031440403088c20bf56b8903284232b4551c0e86245e827a98b16410063899a0cb100c38a1783c411e120bb05ea2027b2fbf021b44739a90eb8c3b940b805422d1066456eb5d28b2cefb20cc9f5a2b5f74ee8cd23d09b17898d1bf4a4c541fe50f1cae2558eb59f7536b2e47f164b7cadf10c0d2fdf91a63f3343e9fc1c3be331ccb733331ad6d6fa4724b0acdb3c069c4c9f7b72bfcdb2b2b7c26cd9b225ed8eb4727cac5ffd722e6eee5a05e95ee560186565af762bd8c8b6d65ab3ac7a0c14431f510e4183345f3ff62fd9f50bf5db6b7000b76ed106b59d5e436ae9389d4ea8d7704e9d357c81566e6c04f5a687dc0fd49b5e43c5c6a8d4cb4ee6b51beda7e7fddf6badf636eeb53e7067e0816f4a3f45c3b0875c8e0c5ee5c88fac89539fc23a2955644d14842a20292cdadb129058b3392b6eaf75b6bbfbf15375953cb59f280db59d50a7d30bd55ddacaa7bf9887bb4e7f429d7e8542694c489a737e0f41232b405328cf28f29c4579a2b4930dee9aaa233309cce974fa19643ec9ae7f3c86f93819f5d9f79f7e7e675bd73feecdc8f93875571fd51d69cd1f77ad82b4767672f632bb6a27671c0a7f4d32eabbfb5adc93fbf5cf76faf9da8995bd53b7c28d9f3a1b79eb5276e644a383f1f0012c2e7831e93c4005062ff9cef938c5a0e1cfa23aec1bbe28f7a35ea095336ca4fea9bfa27e43fa3ca3741a558031c66842c6be7bfb1b4761f802adfce1e40d1bd11ef5e164143ed2caf6d47d2d6bef55a9fef479f934df0484eb8ffa29f37de8a6875e7217f6cdf94061adfeed3e9bb73795ba4f95b7e7363c5f3bd2ca98fdd47bb126856d64c9e0cb5ae2b62ad6c497ef4d4a2e830570879225496af6ef0c1d7f3a8a800172c45df6e3db40c409a4ec39be72e03cdc2575bcdb4e89ec3c5f7674351fbef0e47e57466bef6555b91d45d0c4509ec9d0a889295933c1ef32703f9ba5c7c0115be218e7c3243537fe66f7dcced0a8892fb91fde15dccf1a35d1f9ae84402313e2254d78c90e8d9ad8e25646256849aa96a436f1244ae0422326a6dcc61205962bd93f2f89524a2e48bf941c0dfdd363b7ac75ee4773eed1bc85f661e9748aa7533cbde9b1d39b3ecbbe3386598b751f663130404d8231d976966cadb5dd25dbf692ad7d196be4cb47b7f6dbe9b1eea4c2432e890f1affa3f3cacb529e96fa1e776118fbecbd87e37cf84e7b0942d294c680ac07b286e1a0f15a76e365bc4c966553fb58f815344dab618090b28d5dc55d3a3a5b1eaafd82680452a6645b6d0a5d671d5d4f71cf6671af0a18482ec57fbc8a07f9152fd9be0b65b1ef43b10662f6c875af05e56216abdcb35feeb764e699b75f07cdbc5dbd7d1a2a7c36ff5fabfbcfc3ffbd8ae6bf3b24b2eca3f033dc0174fccc4f71d78c0b2d3ce492f8a0f13fb69faf09e0b5efeebb21e6d6f76f39feca55b224e6171e86d75ebe2000fcc120ff05254b6236b2fdfc2435b7f097036f2e6025416cc63e88cdf26547e3bb7bf72c06683c86695ce860c6817d707fe3bfc4b54eb2e5c9dc6b4fe3b3c734ec6f3cea531f00ac3be16f74aaf71df7a1a56e74331eeb240eb2ef685d67e771572a1580163ae7f11df72cf63caf45d14343eed97cc56671cf3e8438dcb3d0767dc53d0b71d8875c907bf6b14e3ef62cbcf7abff3ac86b165e76ab962c484faef0903b00868db0f036afc0c2416ca6c142e661cfc32ce02435d3f815fec64fd8afda8bbb3edfc1ba947b5850ac815e08d96fa12cf63b8a18dece6cbfb7d855b6d0880444d9facb7e4bccbeb52bbc7de7715767fbfec45d76876cbfb91966dedcb3bf02be21661a4362cd7516f636f06769f07701803f15f6187f8f7d873feff1d7c2be06ee92edd3e854e8ac7bd8cf749b7bd84bcec7ead4a5d0c11c43173b25d23e0af655dd0af52bec67bccd33fe84197815c466ee5742a411d4db1c1ff532f00af5728bbcfad13985bf19604e5233f637c48ce12f3eeaa5972cb9c8327885c2496ae65e76c9528b1c391f9874af84a17bf071dc355fa5ba1746fbac2a37fef733c4bf21660ecb94bbb0b7afda1e72da2ff11c64fb811320c8d8bb7342b61f386144c6320c3b0e6fc1031aa499f10fb353b79a39328fc23aa997f9d9e5c83f611d192f3f85a4dec1d19386afcc69184426cd7e48ac815f7c8ee0e02e996915a14ce996e98a529f4c1fcb66cbe6a70f99d239e774cda7df0388a6699fe12ceb9bd8dc8fd2cfc8d5105f06ce300cc364f02ae7f4a8476d1c0dda6718723f4aa94ec69f3a999fd1a59eb3363ac67d66448528dbc7b82f616f039f0c4b18c39ae37ec44da63b7daa936132994cda09cb07b5641cf7280d2fd23dd363bf3d8ebbba4fd2a03d864ddc8f12e42aae21be8c97d1a564b8b71d8d7b942b59eb91a3a1542a955ac3b2191d7c9d34f9a2ef99328ecb389389e3b8bf711af7b6bb44fe4d6d290ee2efc896b16fec4b9f659ebbd4256192b3cff2ed9274cebe39cef4d5d441d9a15e86e3380e857ad489e338bce21ee6205d26d3a15e76a72f52c46bfd70b3ff601722ee515ac30cf9278f81be44e1558e8ccc118ecc30769a1c0da60deb8a10e98630718d5460fe673871118fcee7de54eab8d738ae542a954a1808d7ddb847bf64fa2ceb4a2f653af83275df129fd1e5202387d4c7d7b8ce732f637fea749abc4e9f65f82bbdc984bf259eb12f7de50e90612b3dff423df796a3817bd4e9b3bf8959f619b672fa538785e3b0e71efd1b2f7543dc853d7d22eeca20577ac871251db27d5fe242dc664ab85f2bd3d7e12e687fa3dab66134eed12c3bf87a5a837c190fb99cd4c75f31e1ba98fcd75df5293744fe09af7264a05ec60cbcca49a5bec9abc38265d90fd192873c0d2f5eb63da7fdf6da10770d71d72a486b997eaa63825dc1050f5d5e5834ec6272f6a86e95831ae231d0477d9397c9877ef6a76e95a32333c45d329dce56050b1636783179a331b4bca0c7f0f9979c7d34325d972009431cf1f3ba89a80ebeec6bbda12cb6a70602c0914a755f9b72ce988424202123255e903fc8c5084a04adf20793a01833ca88002a479005bb5824c882190154c04016cc9f0a08c41104b2fcb5c8fe01eecd57e169ccd73480c45d5cd350fa7eba0407b8831352fabe617bed6fa20add4c6785e6571d740f854e8954752774df36a3fb545946a7a4a6ba259d65700ff7e6e34cd4295e7c136b68f0941d949f557dd6da4c916a380b4910ca34fa8624d6c878babdf630662fa36b185fa6fba1b6270a2d999ee409f5a697df48b4568c6489d65dbdf8477ffd1a1b09bd91455fe5c58791691232fd8e90beb5f766cd4dddfd5396244d6e51d2a639b25b6aa628d2cf6056bffe9c3750f79eee9ff00d9d51f8ebafd8c895528699b3fa29c6d3431df8bb53507868481b82435483b17d7c6ca0f1084d5e25e9dc7f83ccf5939872c55fc43dfa1c0df52fbea173e3259d2b9e807bd4e7a90dee51bac3fdbc53d751d07f95eac621f7e8b36c70efd79f2fbf46e2c9949e30ad987e876931ee925fc140775d2c1b4955e5fa944ce97f3ab01f7f92297d0d066db78b3ab45a21c783e77e12c90931f2d7434344994a16640a8d9c1043db6eb165a6f629fdd83526d2534687b4eb37851cc77d6322eed1b75b3d951e1a9d004cfe7a88529844e9d752327d8a24b2a8d528353d4d29696a37aaa98a609d84d48538a71103edfb0c33ec81c01d9eb53fa27d1058a37a085559785a644dd31e5a4d4cd6c4c8da8dc3ee4ed025c330191a0985c95a732d3f995b561d33b64f38edcb6c31d4ea296524d4257f3659fbc9c35d9af640b44d4b6933db75427b07e29ef6d0ddb601dc45b17c20eeb256d31ed268d848efd02aa8c45ed37c6bee00b4bf1e23db3132f69506fab633653a83294b9cc494fbfb89e81fe1bc2a77ffe813cb8738ba376be48698ad68807e0a5946865c4eefecc864c8e540a2172a47911d43c7d03358d033fd5dc447605176fc9d85f360815888c98655843d652bffc62376413ee51bf70821e72fbbe8317601022ab4392bfea41de3d3b88b00f323ac3523eac26e2da5ec606b5a51c16aafb47fe37425a446f66f6cc461fe1caf827cb6ffd9e2cfa6e5366fffb34f71abeb74f8db3762b10d6eddb8d1d261e32e8aa34dcbbd9863a6d6d2da7257679aca6ee15108608cdbb641f11ae33bf6a19d619c1525ec31714c4fd7afee6d46305f8f99ac7e9b1b8be12e982b52140262857b2040b8879048bb34352dd5a7cab06aa705c4c311d05191de891049a5ba77bedb80deb40f5979be3320f7bbc43410c79cef4031d2e8fd8e437ff0e5b50e4877e3c4fdecd66ab9c38d072dc397ec9d95c7d0595f367094a3d0845107c2d82ee83901195df1e16c0f279f287c8c96c8020805464b68e17c087ee7fea80a93446db55f6bad56aeab60e5ce19e28c0edc6ffa14f5c7eaeeee5ea103cd1fb8a33f6260c2cc2e5e0471c4b873f4c2bc82f542c742a13ba1809d9e382b4e1fbf02b2628f7b518e7197755177d5d9e32e2ef24886915fa4971cffcee0eec82eaf550d580e2bec79705f1ec51a2f82acf8d6caa31ca3b8227b8c562e37a304b7c88b44e0400ee4400ee44091d5e39e946c2726cd1b71d8714a29a510d2a949f1e9ee0ea7ff207d716f060fb7815a06a4f8c56ba214b82552e91aa741864a01b700831f459f0894fdc85df18abbe01781f214f7da7b9c75c583dc2743ffc910c877b4745296dc499b11341892b8f061f576f88682608be0c22c8cf093b1976f273d8a44d1bdfc45a28f18aeff2bb83ca8dcf692edd78e2ff36ca4c8f2ef8b046323493c5f6b307047e7249d9421c4f1b517d9bfbfd080bd440203774021d84bac93dd0d9d6d131acb0517d3200d0ab96fff4c865b9453fefcae9b7b040002b3c4aa9edbcfffaecbd9e5208b2574c9420962d89eec592c8127fbe7402fac8c436b8bebd342c01d504a4ff3e4ce6f64fac9f9324ffc31691e1c6bef55a9e2518e221b500519197e4b070e28030ecce1352dcc6ef83b6293210ce242a8f1f8c0fdba07764fb79af807969d81c0dc2477cf344013bce27c405f490c5b94f2c854c76c8f13ceef9e070f17be4b4fb6842e6969152443fc31c91d810bb340c24ede91611647d072a3ff5b792b888548f79c0794ebabfe6ed5ef65fa72d558889729f6b2ec96482532fb432b3df695edd063bcb2c737a21fb98c2df75bd5c7425ebed779acfe8d0b53a6e5989ec33a58b4d7e1de84350de3f4906c9f9df6b1567bf950c31f14a33d9452d3b477cda45deda4697fba54669c2538e8b84b7bf913f09afbf273bce654837af9a8cec29b5873f1859035a591ec29d59e7ead75dbb69f01e60dc70f49fefca97dec6fbc6b92b32e07a18c59fa3751526cc5f4d7a3941213615ea3180915e5ec3f834947287ca70fcbfd0d6b6c220bfbd6deb577ef6e758b7bfa5decf4d9d8c01d9eb127e22e98b1b7c15df1b11f00f658c4b088610f21866112cbba1bee6198863df7b0fecfc6266296c3d8853172337cb7f6dd5996411a6c06416b0f5ccfd0c804423410ba4378adad74ca083dec21570386e11cb0dfb0edbd6fc8d5e0afad8132ee6bc0b0ed31bc8a58c4197284fdf65f13190159fd22282ac10972ffd078e2fe4fac59c5fef69bc8eaff82a87f2a6e2a1dfffcf060bfd13441dbba9563ddcadd71cef626ac63faed7532cd94659dbfb4de4cee3960c9293df6397038fbecb72e8752f62b8973dc0a1c380982091f42e0e5b5cad91efb0daf245692035f483c25246561841d2821042a5ed863f0cb8bc33a364456ff865959c3a3177c61ffc1312f0d2aa05fd8ab5a155930671d7cf1d02f2c38d84324ebd7055aa7c5fd92183e6374d611f7bb2af8407878f817962873c45f13dcc3e14f77c37e221b433708a1ec502b753aed440ba03cf162d256600045d0cbf45ca7d3420f2f2633827899deca9ddcfceb836b8aff9e0fcdfe3c4ea882fdf62b9bb7b791a82747557c75f7d67518f7fcb1ae93bc22adfda60530976268d3473a79899b70cfbfee8d9b32dc3e3eeda3fdca7ee78fa9eb9ecdc411734ae21b3992ca115f2095bbb111fc580fa40cbd7c6cc45c21cdb5a239a7c322222f33c9c8043a9890be706254822f2a4c87d562363a2c80799efdaf2a15fc6e26c1f5fee23a1c7fde8d268246416332342a410f2bff53060271f4ecb93d3f7a8c31c618638c31c224249d43c8852d3647ee8adf5bdc253ffeca0497477b2af6636388b4b8d7337aaeefecb40c91488bd72c71567f7fdd81ae81a159fd598642a59002c62db4d082a16df2d7caadced15fefb40f34c18d9dd778ce6ad9d01cf980522d56fbb3e994bfc291a4b26b0d2d2831e39e50af79d997d0dc1fa57bb7fb54e242bc5a59711d7ff7c6d075c105175c70c105175c70c105177680e1445df0770e9732c7af128725eee938ab65480273f83f710c7c46622dfc205e85c23d21811880403a8aed1db2c32564d6e2ff167a6e8c3516b352eb3a638e12533b1ddb4208450c71b30c8d8880b052887a8876b8900116dda738caeef0ba47055164418b80298a301e3343a329ac5822295811a63062882b2343a32978b41e5c99a1d1143b0890628c4c86462c6041964510437a509112114abba3bbeb71971389114adaf285a8884b17243061c6788f509628babbbbdb470b8d488c50d2962f44455cba2081093366c85d1fed11ca12c50cc2c1832875c3de99f75a3a6c6eb048a465121111f970219fe6c675bb59a47eb8c3610371b9021494a587888ab674c9b09ff669293da57df2431c0dd4551aa8813a49cb110e0e8e9d3407e7286748ce5115347087dbf4b474f0f81bd5ae84941e664c6a1c9ef45e9c61a27b1fc36ed70348dff8945c23c16b99a60db9a9192bffef8d1eefe9b0b90162009c213745e3debdf7d27834ff566871e7f3a428149fc42a7127fec4a078250e6598189e94e34edc893c7127eec49db8138f2c1531c6687160641d41204c8916dce1407e6e7a18c0dd55feeeb522cb06e2c8c139c201c2a0f0b137445ad64282834d4f4b070f57fdbdb10698c00d909c21456c38820407bbf570cf6d0f203d886e7cb02737ee82f006ead868a04da9debbd1b29130051a8dbbdc2249699f23cd53c4061cfa49ffb8be0ec2c921028b6e580b9172ea86bd33efb574d8dc1499409122dbddac15da022471302dc3340dbbe961007777c7699e1cf7e051ce909c239c2584e00e1a70024d2eeefaa60fa669f38a960904873acf707dd225c308411c7002e58d06da94eabd1b2d1b2c5691ee4d202069254caaa23526678f7d5c69af69453a7064d30308ce10225a86794fd36a0cc3b0f8d0dd55f68d609ffd87fd96e154cb5bd84fc05d9147ce0e924d0f2038438814b1018b61628c313a67a3b5b2e9702fdbc7f72d4a1d31dae888b86575d0822cd97efd5a315b31ac3a123e60305b81b4bad65a57cd43892ce923864cc00624eeea19d0a80557b27fefb8ab27d674a5328c534a69e62d9aa76fa4befdaf06a91a942705e85005e2e88757dc83996a3f678b6a3cfc4bc3586a7d5b63adf8dd53c11db0d62139ee398e7b9ec53d98290be298c91d51d09286d84dd84563e4ce1536709891b8f127eef82b21463e23af9278c6563146bb8cf1657c8ae194585ed15c9a561a9a4a051df26136d1038d134c821ee20d90a229d9dddddd83706b86464543e40f12dd54372a92344e246664c515333234b2624ac632342a7292a12062915ae207405488c00318d0a03502275fc4a841115584c183e843f68759a693317ac42842d2109e24c105da261f30c2d110493c71842614e1070df80289158401c1159f2f70c08424ae502103268c008a11ed9202072de8c207598ca9220a0a7e2840051228b8628c183b2f8063f020063180220b9e1d2bb0caead67da60663c638e119421364a0c3eb536d2c38028c116334c18a15bcfce1154fb2d3ecb688eceeb6d229a3ca480aa1a61fe04288cc03114a0c51832e8e0045092329aee4cfd0688b30b600c2cce265ff6c89c82e032a54d005142f08038957932b4de820cc0e55bcc862042f7f95cd90f35627194521d4d8cae6e0dcf01a1e47ea11263b10429e0e1b286090fd6f80b86b4676a328bc64ff21b1c65ffe5662aa9b6a657f2cf7c9887cec3f29318823fbaa59f93008863df7dcd2ee2f4ba043b0e2043d2f880427c62892e145182e5ef199c8d0c2ca0e2f39f3c58b492a88978ec458fa23c6e207d060acd1915266b0a5e8a5c304ce000b1308bde4eb3061e10736f879c5d761a24aeac9e2259f8956448517af5883e8a5c344c6102f89b1f83391217a458ca51f3e136f1cad87fa4ea494928993262fa5940f696aadf5850f6281236badb5d65a6bad9562085fa8554a29a594924a29a59452d25a6badb5d6596badb5d62a6badb5d65a9f498db5d65a6bad9276d7651761acd188d0fa5d7e779d020a3e5cf8f761730a80afe9a73fe1a4f00ea9d769f24abd46b91f497a8c4c3f498f41b95f957eb57d7c137ef756252cc4cba52f61faf439bcda80b847538d934aa5b013993f6518a69d95fb3217f7907a274c9c34f9d3e97452cd4f412c4ea9542a954aa552a9542a8545e22db93f8555545cff88757a38e1e58449ea743a9d4ea7d349063be1c015521401050fbe4042e825f3a877c2c44906c0b8e04a184854418223bc4ecf24859ddc542a954aa552cf83cd2b859d9cdefd653a94ffa9eb2ef92d8106f10d31001a8c3552b6ffd0a4bbfaa5bb7c157110ffc68066c497c4ec7815a41ddf10b311f84dba5b3768703febd2bcc94e8edf648abc9aafe426c7863856130b218091f8107690c6d3c8fe340a204bd95fc92d65ff528dfc35c93ebb1e237bf731d121fb4e6ef8f1261a81ab88851020fb2b814419e2551002647f028c91bda575b2a23fa9bb326471b9fdf63f1bb31a35b2c5496a64fb5a7673924eca36492365db3274cbe03a681f4767694ad3060fd0619fc90ce3381aa6ed0a90212764fee7798602648b93142076e6519630e0f9069a6d8542b4e88c9427cd774c685e4ba2e9b0686fd25e6a1accfd7133bd508ecc0226cb2019341fc9fc25538c3c352459f6524af944ca1a658f7c9204d658697aad93575c0ac9229b4dd806d7b9b837df8f7e86c01db0a6214bfb8941314e3c1a1277997efe12994f827f3e127f0b937075c813ffd73de429a73665fec64d5f391f49847cd6381fd8772731fca3bf6edc7d9d3513a6714f7b2d6e5bfb164b10e2d0beb56e0c9225eecd67e1e0664ffff3a33886d330b4a7eddb61c7923d5df778f294f12183c74431dcf533fde8684e3f32e1d27750a94d12ab818452ce47f75a9b249605c9a1a8ba32c8069954585cecfb769bbe6dee9737ce838a69622f391fdde3b40cd9cf5700dc217ffe02a0abd2fc67b38c9b65a82a64f5cbf8da4588d5c8fd364ec8fd349de7cf98fcb4cf4c32d502c00600ba935967247b259db16f5bdb643299f00da67f23a64ffd8d678fe127dde3554e903d3d793e003a27726fbe8dceb5386bbe56ed140ce8e7274806b90b7f0dcdcf9744b2481eb92b8bd422b7cc28f2c46da70c823bae4821d3df20737f12536e3cf332dff886cea64f05cd9ff13aee92cd83240988bb4cf8cbdef4f37b689811e81ebec243871b6be2188ca5509e4191359f05c55dbd0a4fe3e3fbcbee71978fbb68fcfcfed1992d25979ee787e979e870b111d32fe92cf346e4949f5813c7641b6c99e72f19c3c3bd99e1ceb3b8379fa6f3a1c89aaafffca8793a8ea13f6b8691b837fbff53f8d523598283bbfee7eb409b51b8283c8428749dbc3291cc2415f7580605a2c0a8142d3765412b15a2111100000002e314002020100a0744229148341ee89132fb14000b839840725a9bcac32447511c841031c81040082186100344466a884800031aacf0d5d739f9fcbd14924a56f631046ea8a5e3fa9c22763b5c90a02edd4e786d3efdf95fc828c0af6a32ff02223cbe7ebd216eb8f23083ad3cb6bc4956b1326309f510fc9b5adc2e40e6426f7185fa9c1c7679add2fda25affb855f283e1ba02d0d4f95b44a06ce4188c6887b1c37956bdab508d5bcf75b7d152370839da51e3ac95db48566dbc3918d735032b92053175b47f52004659d8c23c2df1859f3dd15876c9a87a51789d866c0c60068a208aa4815054f182afd58b35de20399d5f9443b5a152b00f896f46e73833169b6e12c1ac48fc84b79a16a485c9d2a6155a1d120baf45ac96087f2b33735f178dc59ad86df98fb871c537a2ba6e36e33b6c7224a7b416a2a01b1125f00e8909a3849c9865c10c5941454f05c640a52680ad7f39af52191e940fb38b8d812bf0088579360082b07cdeec3377aac05808fc6e4c39f55d4bcf9343497ae636043d4490a4b32309098296ba4a748cb6d72e3c450976fda83e1cec50377735856ab64a0dc6a7be1ef3e5cc2062961ff6f0b06bbcfa32bc45c0281de0066b29ca1d7a17be7a178b1602a77db4a48bb75ad79aa495c8f0beab2d381d9293c889512da56f85d2c205731a0d68937f9384f2e0feceef5261d379096603375f9f4b515b84e0ed82e84bd9421c441bc5e1441cfc5c33141f958b714e1631b14199c6387bd96bd006800fcaf2f3e184f00e3dec38b9d9c2552f7f740b75093690bff5bdae5a2818789f5c80425c58b6e5034bf08306671df7c1f8c7581ee90696ffbb6655308f619a1e679299fc33afea08628d4e82052e256662829ed6febf2b6f6c52f4b8526d14d88cadcca8b62cb977ca75a478e0158f294769262995f6fee3179da1009b34eb51df62468efc9713da65bee239fd12cb105e1cfd4a7dbb8d98177dad4378be147b04f42c6f7434831e573c33afe331f7ff7a3056fc98467e184ebc254166925bf175c9a8b55b72b82e2d4ffd07695f9786cdb0b77de2a61c3434770b7ee1f1455688ce3c784b12355b04191d5de47fa13e0c00c2c4733040f1a6ee8b1e96bebba3bcc1bc48bbbf26cca946e9744e0575e0c50ffac3e049d4928cb7a37aa018b16e1d8f67698101694a85dd91b816466c658af64ff8dab9325fa12fb510c8c25655376eb968f3e9b31f961954e80b04121ea6873f914925bc1b33c243664e50184611f90e3dc217615f07dde084b1c04ed72ba845efeb631e3a34588e1eca217f18bcb2b43aa654ef6e8387debfed9006096e3d7976c3b1c00c419c2706c19c37e4958254c6686005e2dc9d0e1629839f8e863f876e09be2c38712740c32638b6a669e83d1f0457aa00d535bb754bee89dadd07a782c7199b528060bce485fb66fde52b4044913dc85473eda78814f7f19db6fe204043734d7969cec61220df17fba9c3994e968031443f478018c7a9f630e05a47f47ad10aec5ba278eb45c1df56c48461556fcadc9f0e80ae19d0b7cbfbfd286e6266af80a6718b68dfc83ad78c3254a74bc26cd7f8ec900e06514fd7a4c4b1d3ab17e3e356c8b44b3d8783ad27d4dbd518136794354faf79e006a66301e192d2a09279300ad3fcb540b15b345562a55bd1a0c5eb62f4864eca05799df1e5cbde52416c40a0156cff90be3ebaf4d3279e4a6f033aad4bd583316e27ab4686d336f2a58822e600d53817e61d2fb8aed9c11576f5b79c88bd71fddc688da7862cbf6886d6c7db8ffb2bb48c8da6e0d8005ba0430a6b21853a9b0bd9fd41137ae6bef2d93297b8a309e573c4733d2d467bd1a0cf04199fb855c60628a90c1e0e0aaa8cce001abeea86a2797055772bc8c597e6a9df4e125aad253e07ac8f814795de6772674ccf1b3d234ba9f1865fec358cc0a5b362d47652ee674ed5a01193425618d348479231a20b69a212f3731e7ada34595ad4e2f61414bf34d3ef23cc7d27f64f017d312c73532418ee7fdca39d6e3bec73337d127c760f141755e2a93d8b9d6393e9b066b53d8d77e6cb483a1cb72e7934dfc3144954140e9a31a1c8cadc40af4508dab3888da66ffbb6ab3781a9880618600bd0c727cf0c95ec5af34e8e2b6ba0a4878589738176cb33caefcc29a0a59e7354023584a594311b30e8d41f42f6a6a7c30d3c400f3226107fcdcb53603e97c538017518e54805fcedcf8fa051a189929c6631c79049f25824c7b0a2fa1ed6d61ccdf8b81539ce48f21e6138eabbb4172dabab51f6df013c5a168db0687f0fca33918463966871469727ae837286dcfcc87c04c67225d6959601b9e3bf01bcb53b71f0aa9f90fd24423ddd123c11c9be557ac4a90b7f1de2486441184b1de9857e04cc7db562f1cf53792402026c9b1986d15bda1a217b5a31bb92889517abd2c4fccd0fade9bf7b8dc0b813f94750fb25cf0c1d9a83067a68fdfc53cfd8f3d8bb8269647adfa822bc1ff1232e8c5efd4572f16b53466d7a0a09aed125f085b18ac29e463da9f3df77f807dd6c5fb207b6a549244576b2a2b209e6c717f6f4c345fac3c7fc82383ec826d73835275b403a21e28edc93ede92afe5e8f202b16539075c9c420806a3aeeac7250174cae26aa05cab640b24b6db10ef7287fed50d2478095929697eba1a9a116109d4bec9cd0c9d4c2db3c38f17c13033564d11e13111862eff1d035268d582de491f68625f8a17c760a3e96340d25442b3c182d7367f335c1c162ba67b550c2b45e7f3e14f2c8b5cbeb50a1d3f11923afe0c0fac7b596c39a52f64671eaa53ad17aa3addf58805f4a91c2227adc0b23375c117d7c340141a468ee049200326d2fadc8bf0cfc873b748a29d9d23763c5bab22aca3d53245f45fd350087d63cef5efe8512e7152ffc5c6771b7092e9a165b4ce47270e69ed4fa5426b6a2d16d4e029eb338667dbac52c344295f66f955c2051698234f3302e5d1545d515254b2b9529402876a6c09afd703089acb3d4bcb091d9ae3d8231826fb277b88d9a78b1667e3257e17691e0ca67e4b71a29c813f750479b083f7730eb54908b19b156e69c01444864105e186458363edf187a6caeea4d10c456fe3c6318869b47381681df190fba287aa0110c997a49908c71610a011120563e2e6ff8c508a8ea37d181adca052ba1a93f497453555cf4eec6563035963429d1658b99c888188ac9ec1e81381f2b085f52e419c0ea617003234e9f06abaaf1d39dbd57031f227692e093031ec5d1889a5f5b38c4f1f51ac1f366288b2e5cbcbf2ab42737909e4872838af1d490dbd5aacfdfae6ee012dceea0910cb2203a3d7fcb4f5f645e85c83627fba56c270a335b34974c08f660e55cdc4db07b57a23a2d63c17f79c0c262b79cc3a14d26411cb775a2d54187de7a048f94cfa30644f7ed829b29c66f8cc4201edc50d82445bb9a918a00b09f0b5168e500a9042e4d8ae62d1bd34cfb6e2c5a1910f615032406e5b8ad1747260dcca0ce436b185be4041e280d4f6d1200a4d06c526b54b3aadb42862850704b5a87552d913e9ad7a2fb209d02d52828f0eb0bc036f338c706a1caaec10fba37c6f9699fdcee47163331b39d586cfdcdbf2fca20ad74ec4d86b28df7e5d17cf9084f6abc15de52c831a10238250b74c0d4f583549af93d1df88f92265247c1e5c2a40cf5a4aa49b359af7fc453044a2afb2b8786d11bb937572c6fe46fc1afc4790f68595b76ae9eb1a71eecc60ec0a834114895191a9e8ef9cc24dc714210e2490a58c157872c8c308b6a5715c8ed8820bbff8d6350176dcb04d3f1247442a0fd41620487cbf2a9fb3033dc0e14a4215c6f4516ed118c4a65f1ab06ef9a7e6148031a41c5c26a490213bebbcd43555249d7b6d76e0f2798d67c3e455f801d961c196f0a958aaefcea6db962151cb2b96733d4265b67ed1e74385838ddb069da6813cef186ebb449fd04fd71851d114c19ba2253ad9a612003a65d772e9fbe9f23d176bfda3c370e21c77d9960b8c6e413451525b0ba9e4a2465023624ca95ca7165c1ac7a8ed0cb2b79da620ce60c91b961fbf1024d0eb2d6b3ffc96bc3d8edcaf1ae1a5a5954d07c5d02d5cff74673df6fc21c5e0ad2e52c66e3c8f7d81eeaab95ce560e40be196bedb3fca33761f8fcbc851b00bbb15c6db8febb128b5a42936198801aa8faa0e9e866754e5b88afe5ff443ab0be2bf376e405b112b3d941ab6d3e7603101623c04f9f5c6f9dccf1e399c3891008a0106f2a0ffc97ae71414a072aa96c26fda4043b86ba6b38798d5516114cfcd168fb414483795ba2896c823ef89fc78b429cdf79144af284939079352b2e2863f4d820af778358d710dc9ddca2c3520c546cf42aef31d4a0eb0818865860476fd1341b0ecbcf4235d256bfb2292b0617256eb5de696b54a18226b4996237c2d57a938374a209c9b191ccca099de7438052cebce821c131385460ba27421c6d9605bae20a45e00cba2776c674cf6b76b1cfafd7191cf9bb07bd7b29783cf38d72433810b47b27cda0bd54e3f11117bd8718a1e0f3ee0130818ee4d78fc4a0339f676ab8c3be0af5e83fbe8b28660ae5f9cee000db6e070d32b285bfcf7b402ebe5f38dd08147d2b3ebe837e26c1d3edbea5320a5e3a51d083d70ea314b50ad9a82041f35684053b8feba20cfa335bfcd98b3283be7adb64025da9cbc160cbef202778f3c3bb79212ecd847deaf8bcf1f8899236a082e3ddd7b82779de5a94da0df12dc0e7bc1f307bb281460af8b21bae04c8627893aefba522af6790b3feb50b4d4f155ff30bcbecbeb2fcff2abf698cb09b22f19d918b058dfdaab8a823cc7fe6936fe2d4a04c6039b99add6c4d94fd6a246af4df30038e1da00aa081783446bcfef69be72a2020f55ca6837b442ae75ebf3a59b1bbdae9711166dba81ef6e45b7b48a094e56bfcbad80e84a16397051f29f21ef1591253ffdb1eba1ad17557f414fc98357c256e6175d8ea568c8c763e9ea7700aec9e5a718ddff4228b8091b9ce6791d6a2af0c1fc18fd7f82b43062d9327073a9a81a0c5d27d7a76a206de6f7530cc6e6ecf022ba405b73f40a4e145003cd9e4ed32563b13790cd28d4381b4acc82b3e90b32d5d3ee05a6112b7ce6e5e4c727bb22aaba41b0c72e7616109c20f6d2dd04833faa83d14b5af71c7a7ff435ffa9f7ad8cf85297f193be949cf589e4f5dc0e6a6f36418854a9ea5fc0a41310ec36e5083e1de5e18ecb8b10aae6e3243b0a5441d1e5391645d217a4c15306e4ae5496ac090a9b30293a013041ea49f099c430fcee57812f80508c9bd47f6f46c01e5042f7b9c7b4c7d1639871340831b429be30cf7fce2614f7bbabb731925f81688ad1264971f79a316381e4688747252a75620eb68663a20386d8ab601388048c2825d9c1fabcbccea6307ce2b19b2dde034362f20f9f7bb8055cd62f4023836e9367d2572787b8fc44437b3e1986b48b06f4287324a7bf4313843abbb060d96c3b121ea0855b4572466876f64a5797b4d3f3cf31b42c2bc03b938b4ed35b59bd5a8a23b7612094e4f1d666441d8d11f46a9c8d303d92d551a04e79efbfee7a58baa53b00586b79375f7f09bbdd4c5bb14e899ace2e3d902b30cca123e1290624463595234cf3c362c5841ac741989361cb693a2b6c3d898934cd36706e9d3ccd9b3ce73404984b4a831bee0a5f095e4e56c0224b5d2c3c98b5a5acb12bb2cbacbc11c4a0241c7dddba53a09e732c1758ce2a35dea4134b1856696f3aaa52e7acbd7cb404a2382c31f82fb2d19b8e5945b781228902672aaa5129228cc6d3a445232860fd80ffcfdf895db1c0946ca8e89c2501016793735638790c13517ec9be4aad436447298056c4e1642cba91c1e2fdea13e87835527c1aeb614ede34aa4fb2e8c6ead4fef91f947d9e5393ab6c1eca8914c12308c486a8be203d088954872811373b9cd8472fbc2c3cd27e234746218db7983f91c1232a01182eca3bd9fbd0b10f0494fa677cc0a4c1948dc59683c6c87cbd5fa3b3249d444af3d7c0584896e90a848cad628e2ddf5361b133c7a3eba1e1eaa1104987fb2c84bef1201c9dbe349d9c583f217ceae136c62fe8da72bea1fd96e5281a4ef97fc58f8ef99258c2c0dd5421872aadf7da92e344e441b31b9dc38e626558540cf770377c0dae6b8d1ce47b0c93e2c66e2c42cabaff80c9fe19f123912edb17c6a5f865988689dff9d02b7611d2f53523a8eb9a64c5d38e5f3c2578951f1113b989de2853a945ed6cdb188fd9fa58104785d80ec81703bc491aeefd4da159ced79110ebeae729b93cb7f8b804c01fe58062fd9eda9918901aff4e2cd0707a810dfa07efc45475647be267e633cbb8642463e55689ce3c7c897da07dcc0f4a178afd129c4587d57a734551138d37f2d7a407591e1319961dc06c8ce9dd673a101df790600d254b23c4b81361ce00be42793cddbee0aa38185d63bee874ec16731294dac338e07969ff053a6260212ee3a565ba1727ba6f388323d0205dc297da33671a831728a1e1c419256952812b81345c603a5f179145749a86bdfd138aaa99132697f7bab48b4b19b1d003622712866f81cec4c71fd3772e6c0eab033b1e3af6b8c09812167a1e5f51044eefe6e27350c63408baf2a9c86aaa6a4d61f0128c6030140a63dc3e889de7e430319c352eb7452b3212d9239753bc9589211d461418b61881fd70283d9cf6ff62f327aa11488ddd20ce18210fdc7beee8e7e8ff65149f7a327a084dfccc49f682d57d2bebf3a0211ee402a1528300596c62d40b6552f430cce454c3d90b3c8608718ea7fd63200db7192797c3a5183ce4fb163b012e1950e89057457ae2aad81e786a6f32d1a6697bd6f4d9755b7997e3e45b86491e6fdce60a5ccb7d1e1cdc7d52b6b21f0421ce0021b7a545fcac833e4b217796a26370559e7f11bb70467b84c8b624da78db51e2565817d214f6e009d47f30c31e8bf72a623f2fe755935f9cba7620da556e96de9fbb9278906a8154a692af9534b3a499fc8a2a9429ab531acd546bca2294f0c47c3f1c4c61c9a500b130bc642874c429e9ab14f9bbc286034300407d00f0388315bb905a73988a2155d253382c7e779f0b540954a1f1626cf286e45dde60147de499d00a41042eb20f583e4cbbe1bb05c07eefc685575692e781ec204115a2da2268bc1bd7934280815090c0a6ef0db73a44bb238b8fe9b0b3260de0c1afbb671d8e7cacd6a8cdbc0940f5a30fc71c0a9cd837473e8e1c54ba040eb8eb863aee3d591101dda76987b6533e95e00e27655986e082b6773ae25c8581d60dd1e3042f6242adcc453433ef5d930600164764a41eec607706fff292f69a09270fbf57fd7c07a313e9619ecdc0bb21e95496cd275be2e8a84876575222db98e628a1ae0c5ec8056ab2a7c6476bfa6b1f99fb9486a8780efb262c1851f30eb23e8272ea47ca0d4681038cc651304582075a225b3913462a04632bc51f6b03a03f034d1a5413693f878344549006977d39d381f325b4e04afc3d8dab0e509aa75bfafb91d79b5d1481b222e285dd00fc0da438b987916c53ab693ef0796656a14c117d231f2b2ac32b3577906c7a2abca466dd08f2b195268f5b0a583c0378a99530573761f14de85b282748c8fb29283ab8bdf082ef83231f73978e3c5dff144726689f26ec171e0df3b28b84da7d5effb2f635839122a706e36ee1b30d8aba8e8212b1e9adb689d3f41ef1be947d78b0fbfce6fa3dde122e5a0a5eef00ea1dc591848f0655623d67cd5e5e99aaa03253fcf4f3c74de621cc2f849f7fe5da5d7aeb5dcc1fcc931bec0ff9006e91ff8eaa134905e2504f66ee9f97ce84b9c6b1376e29ffedf626949c9bf79401a38fb68abb370fb23958a313813131101745ca4bdf344ab7df7a638bc41423d5d7b86dcd8ea71b7b1ba1a9834ff91f2648c8e94f73edb866edd46bc4c7ab80c7ad95a1fc222f8ed6a199412a5959fe6de7968d2221e2b2a496f2ed01169153467f48edfca0a04fde9c12e792cdda0a8538e8178168f505bbd4c6c7fd93651901a6facf610ea956dcb6e373d099c9064cc89027f62a40e15e150c013357d224f240fc717f19491b641f56a1cc34d77d4343692b50d6c609aac031be8d9e6395b9b9f0457f7ad2d61d61c0b896f03f667dbd2f4b98c59baf03272171a8f4346e1bed193873b2a1d5a5272680cfa66857f2a934a607a2ee4c3a0dc790a4b5d7e73b01430d62bc75a6fc0e1c0c1ff09efa48d3529b4b089072875e88ee1d8cdeea96d7ad99a4d0d4b36e74be7fae3ee493b3a1097400b36679332ca1bd8742c3700acc945cb0962de4fae334feff7858702e1bbac7ba608396dc946ee61333a8deba1693cdd4a270201e0036c2d45da7269ea4216847bebedd9f60fdb2592160e6ec5f24961783596e0beb22f7010df381e34b03d5dfc39900d23073a2b509a7f99e492bf2c783e52204c9ca557fb8cc0e98f4a9c385f294629654e4569ece12189a678083a5dd3d24b3c5c3bdeff2ffa55ced1ed25cd954dae11bc37a01fa251641031c9b5b1bb21241979aef87bbfac239003f390d9997c14d8ba470911a1d99f06cfb60bdb632c729f3d79a839c84113017d197ad69154ac2184c2f93612c698f3564e031db719a6e5fea7c4ab4d238dab7235515a550a3b048dc3f996bce6e78f59277ded9a6ef0af715db0d5bccccbf67250b1975b4ab861a2d3bbe85aff87d135bc46f6d03ae7e4b313bd7ccfcabfb8ad1ceaa1a1c1be062e16c5b9293e2322b812cfc8e261f2eab294015254b384be12ef05e6545902cd7243e8a20b6325afe2cf1d578e71d62a9c691d3f62f655c5ad09dacd944c135f3cd27eccacaa9247db3d78835d0635b495a1e8359bfc5427e73222ea465c6d223f88bdedfcf2ebe2637af9898e9a1056251c65110e41a8ab8a6a818b4bffcd34abc655352e9331aa60e243b04ea0255a19db044d0e3ec74871bfbfef6afe40748428d7f94898b788f6ec82d9743820f86d38a38d084ef201e46c74e849811c876de555613075a51185914c4337b02ce81deabf44093a3790af912807057d377d6500f437868aa55d9130da23b8bab0e8624bc800b8eefae41d8f32821e07d0930367a3a70d218dcce55210282da01029e3ec15bf24c67cc6dc938de9fea6a21fd1c8cf47b916453b8bfaf0784f0348c4f2643fd6fdd586a4329354949e4516369d0c035629f302d987fc0365edb40bd64ac41d5d438a09ecf01f7497924edd12671e4c5b7077e40b97f89ab2275136645cab0a03b53e94328dca30d09e9a6753cf3d6bc39a3419894144a095a75620f8b53f8c80206ea6f09a999240c17dcb401e3fefbb76c73b6050810c87aa94d0f90fe5797e6dee5ba0904d659021532ddf5a3eb54f612e329c8becc62086bc8b350e87b075dc0a12bffbd1116cb30dc2f780d13a5f3a3a41444f9c46654e2790ae9126453858b602984a007e7efb30ab10c714a80a31c29b309cb018211294b69e0c7a16ead8c1b4e56612693a6cd7b6be98ae41dd409eb45e813f5f3d1440aaf1d80635ade2b0fa5026fda5f43947cd707526cf9f9efb08049936a610085d4e39b210b80e65cadd83a4a4cd6f0496fda19fc28dacb6abe3f3262204b338d32e27a51c42d9836e126c8c03e747881db53d351941cffc4df27e9c39cb67f56ebe91884100114b64e171ec2425de48cb30233e74d7564384921a7d64018ef7336810d44bedd7e159b49f4e568bd5f70d66fe4a3a951fa471a30f2cd3aecf715e6d228c729f2c3a0335bd3d68770a52b5ae954723e64e9deaadfdb0ed527afaba516894967a21e7c0f23ec095a215e4704057d383e897aac69210f8b586bb8a9431efc7773eeb8091431b12270629b5779722334d75f95a22fbe9f958b1c1b530aaaf491604d89ca00bebc722bd1733edf3712f51ba01b97197a2b48e8c62d3b6895852ed5e6edd1d0ed9d9a88995446cc06f0de9de03bcd5df3406a45807e2065605c3cf22a14b1457845ccb055de269a61852c07bc8bb267846a78cde558b5191992e0f0f6b9a471a26ff6e73108a174d3c3c5e020f001e888109b8cc2db315f4462ce388c85efb8cfbc6954c2c0b8f8f48628d77a2284615c263db3cb3bb656fe01171406c8246012193ca8b32082a6aaef0aec87adaa1d2f43bdf3ea43a4c24d5258fea705224702567756ddfe2b9afdd4f13362a3741fbe0a83d0a86586eea76fe9cdefbba0373c3e360affc2be04b72c004aab2ef075ad0875d2b5283292c5495880c1bb13b13611a66ad2b02deef77d5c8007620069249902b2814edab4c130a53105b295bf79b6e23a41c5ac617e90456dc69190ac113c67962e89b518a97c5b05bcc5eefc6130cfe65af303aaf30f74c74b327a270418cc699b3a3bcba68fa9fb7604f6f80e1c435dfa1527df580359039422d2bd8c3e613d7042cd4478601159977e8d0e943d563129a9fb5c86614d2a72cbe8c72aa3bba5ea5798ebb8dddc2e368b5a062e810dd571529f6fd6331aaecf6f23b8fb6e03e4b8d0ee99383e41a249801530d4c28efc5a35ed8e7d0292d467441706cef7c7a365554d5180e44016245155ef7226891c67375a32fc97c3d27df14d7e38e8aaaac7aacdcefdf434c9e01987b99f352dd8d44749b01ec4777f9e1f7f2d0b6326dbd73493a0e81941401ab423b71affee63d933f8d9e55295dfd526eb463821586ce5a0f55a47951644812fb5c7f25c201030d546aa4501b2ef632aca3902dc782d1838d6e19f1229c47dbedfdba512e34233d8642da4b3892e193d6056e03c8e19c395dd37a6c1d924d7bc69f088de661e1aeec25ea705344b89d5afc7c3f8650d8c2d28db43ced6c92fc83c07128096cf986a5768687ada8c76ead378564bd5387ed3dc2ccbb0f9d15373600968e892b903320da3a2a2b5139ed35a788edccdce0e6f33e2e77de6c921f4645a29cf60566050d6a775bfdf4f5e47dc785f1cac5e72158fe1c0c499d6a1a97834ddddb7fdb822487fd2dab252dd138d8b0994812d9886727de3d4b32c197304e597b7a243decc5ac759b9752afb42c9d7efeec5c25eff2a034636be4aafae896babb4fead4da5226ca40a29ae0d84beafcfbb336108a82f95b9aca1ff1efba00a17c52b361f09922ecc388c222aedcd41d03584845f7a014b394068646ed0690f17dce2cb4afed57527b6ba066a99760dc8ddad8da73c3e422be3560f297dc58c01bd217ae101795a53bbee5f29cb532bf1670eb87f02bf2aff8422c6869ebc6d845167814018c704387340cc97803570d03b5c7558b4c300c4163995bded53ce33afca44dcae6acd4dff1900e7d03cfb65a7c5b39cdd086adf3a8ec996ac376b399f78fc6c435b1754ffac16d4bc15da3ad57a4c12cf95eca996bfc6ce045a9083edf7b86cdbe040380e2b2ea548fa1703babf3ffa55ecdb3e778b55fbd70b763fe6c6ea310e9b4e806d43874efc20c11da9bd1fa01fdccf5980d051321f2ce1ee3b0df5f2a2ec27cc70958cd1625b70b694ac4f1d5a37b67053e0f30974eee66174028ebf43cb1045bbedb486f64d264dd1ebfc950c31e47c55ddfb3d44c87f34c2b669a99643f169fbf65ca079d55c8faae32e37e75dcc8e1b0c517a9765a45574f5acb854bb0e15cd845f606d580a275a7d5966410590100abe4bf974b1348c47a8a1b90842a2728a546da8e23d4637f75d08fa76c83fa59b6820baaf8bb00eb5d7451160fcee6b76721cd9f518c0f6370c7125358a9d8490fb453733ec26225dc5f0a389314150a5f536ae150557cd1a072a2857c80d9d79629a66d70f8c858a24924da042bfba3f6af8835eecb9f0d36f6e84e1a6d02cb0b34a4d8c4da29a0f2ba00e07d589f82f505e1506252b968dc279edcadc51387c93082674dffc2824d6402cfec21579c0d2e83adb1cdf61ef5b1c133772fdc9735b2c2b6609d4ec1037b393c073b26b741cde7c7f622c33ffe43c99d2df69c397f39592b7edefdb762c916778276a5aca98a9fdbcae94d9c11ef9c8b7ae0dc6644e589104328e2c4c96b65f85a6d5ce758dc0c7097a35ac842e81ab9be07f1eabe1f81348165ce861a92dbaf9fae248c8a62212f7f57e3a5bf54e3e7c1cc3c99317092b7e0f190710dcd2c580686f250ad61659eda436ad016254bca2ec15910691777470acb49ef75e46e0255a171af45b97c16b3aea6c8149dcdd04c31ed46118da98e6a38798f72393420231e084e4c924e25494fbacf9d1a327d526d53775334f9e5c17a035e84f3e38cd48557e700808018cdffea5ed4b515335813ccc73937da6daf888d1cb3b73c7d137bebae064e3cbe4d0c7fbf7d4e7f933bbe2e99c64b39f3bf3cfbae4ef24c76fed2bb02e60c270102a883e20ceaa54496b0941452aa283457e96b5458f117966759a206cba605bd90648f3e2420d86ec29a7201e081c0146931c03c310a3b8b84d6321b0b839d958f6c1c8051db7aa144133040a7c9782b146bfedd0bd01f31376f4c1a0474016f2151925cf38a89ad2478c6200ea9526e9f4ed26d1b5a7bf2a242a08b240ce91b8197cda2ee3c0a0ae23a2176ff0800877ff70384c5cf8822f8959736d40f6ce323ae3419b911aae896c15b143437eb2cdb4c1c1d4148c836634e7012b986675b080dd80618cdf61cf88eaa353854ba36d0379f906dcd298aac9f8f9ce1587c624499d72b5e7fcb996624e4dc548869d055a4f56546042cec04299e8d4298d909d7df438e3235d16ccb6150a3771cdce36b03ceadff59d8f80c708426102d0ca23cae81090429605513c446d4e623b522d8afe788f613cfab61c21743b9d02560697803ea1437a585ef22c580f047ce195d1fd543765bae341b72468b0a6adcd95e0e048a553bbd6c6b7380a5f6cf0297ca6bef1c0f12bd5413c5327aef9481e530feedcc1f946517a315ed17456fa2dd39a6b37a0053c88b621865afb41d47452d8fa0425c6092c08a83ace0a48d4947f628b961b8740fd9ebd31799ca40d2396ca0f86ba8e1a06190fb9e8469aa8f2e2b69282299c6480ba124df9d8652af17625ac1dfb7e544e79fdefc57eb0edb7d84a5d73ce0d0053c19e79c6adbe900d744d118a2c11f7bd419fb828b16810a8f6d8e1dca65a155c2b434f5e939cb7587503b562b8404eb695fe2a1e233770677933a400c6ef6586c60997e545b058d6028a06a3e17eba648b10a40ff55809ef3f938819156bf7d4bcfec0b27f45c437fa23b563b5b9a2cc011c653abe2017414deaeed6ac8ed03488e25543a93a7c7e7ffbd75169f7e73929ce58e8bc648c7792375144290478e9b0d0965bb8df146fcd20d807ab06a9239c992a4d5600af24490b1617a01b8b030008f460189013d35070d952e20efeaae58de3a6f4c7f9e45042714457400e600454f76b4b9106cdbbd2c1aeeb73e758e8faccf2f99383eef006341672e8d2ee46a93183f6c15ce494821b127bc89063292b0dc32b3c78f3379067cfd2a4dfd64e728f96b244c1576f4168aecdc7201c1cdfc2c363d7961df64bc9a1279b2de49dbc3602730e3e5ab3c9c171af92bbdd44af50cb817376ac7a8a8ab659b589ff4be915e35dc24193fcb7691a1adcd4f4225273819364590f660ab5f954bd80eaa1d9f61c007fe0d111078b00c47c68b41b0b50a5fabce08a6bb7e57d626fdd0c278220ca0810134ceb03ad0181eb6290e0732e396e0f1d67446cff7d49fef72c43b057fc3137cc8986b05f9ac1f3bb961a97504791be5f27eb6438a0a5474e5da4ef960b42606cf56d21f8fd5eded28c8411b5ecbbd4c3800132d86fa5add89267f851baff65dc29424e687ae736c9856b7f8b78d4770bc8816e042d33385ea2d0d516b75d1d93f4224f43233204995088f436c5b1a371a5b4f09a42111c850df2c2131f504537af3212e81beb49ef438a5fd77096d1c21250b64380bbe5e26234d609fe7041f160aafebc8ecd38d2996fa2730a07bf1139c70d39f1505dd0a9174274c425a62f654e9b82ad202050a91f49aeaab65ab9538c37409c7d3e8a0daf44a65be862d58e3d59bc1ac380a10db12a7a82ff469544457c92ab69007329b06f196ca68021f721617cde69e47c48c0a55d851a5d02e9bad0c10c47a3ef6fdf34ea3eb32a686138294597656f5ab029e4c3a04c9ce0fdbaa7bd97b265346cc6bb7b1bcf5b96e4f50eba191be03120770e04a7ca00c647ae64941791185f34cae3e502dada49fb52b9e68f08dec4166375c0c0abe3c5096590e38ebd1910c003e7201311303478521e5e37d473266e7514b1ccaa068719edfcc75d32c22f8256b8fa68c54c705c2a93909eead5e999dbc116613149ee5f9a00833448a3e1371a44fe853f85c559c6f58579c1f14d35e1d249bbd64bc6075bef6445b242b955be94e476d26ce77eeefca37a243a3f9ef0808e009da7c46f57303eea010ca4700e3c89c63d57ae8647e0103a8d9298a2b07710c53736b07454ffec31be17fe99926693f30712541f7a4233032cd2799befa2ab15d15f3af0d17a13e0150f3222fe4b55d7e507a3a28fe7519d8fe6e39bc9dc3c70e6d13100a431767982918e0bff0021de3a58b33056c1bedb280b093169ffaa030cee03fe152fef2ddfec857e297195de120afc73a8f3d13f04749655e4c2ed9df1b57c2e32c1cc553ae40629f1bb3688d4de1b01005632b24cb1335d8453d25110aa7d2c87559db5d6aa2db8256fc1928c0f7dff7670e685101999481a53215a443381741556c70e99b78be9e704c85d0df119c9dd413b88537bf06dff8ea7abbbee5d6a9d5fa77a336ec00023dbd2721b3e46702c8c0d69a6b77904d3e25bc1de923ce62b1320f3a0d470d8db97e2054fdf675d8e4e6e2be2a22cd494f6f3672ab0e31e302909fdae2a6246894585abb25d12e61949007e6c0a4ebb62d86c1c2cd7411f8f42aa90269c0ec60de50c6bfcb623863950418651126908ead51393df4593720507e2c044b7ddfab982a8f94cefa985cbbfb6d1020d35fa831bfc1d02ab942b37e7695969a28bc5e8ad2caae4b3f3d190e28330dc26fca6836dd25b227094c7be77964976c9a727ff595c73f9aa6eaa4942f904d4ad2bf27204bd384d22bd1b2d943e57996f3ebd242e968429f6f82d0d8dbfc92c0a9b1b7c077a0ec16c5892979f8319262658a2f2d41ac2f953bc64cf1a33142da1b8a3967a0ada0eeb5d3054e4267c6f6ad6a445304b6711d38516122bb36763db3d066b8d5ea68b46fb0800d9293b2ca51b58e9682cb656a8f951e3858d046967d68f40f5620d6e893104761431dbaf71ab09176657386144634d8fe1704074397b1e330cec3c66bb88f9acf61420834e78380366fe185d470eebae6a17b5c70c81b6a9800a7637f2b3180bab1382bcc8347ffd998272910af2b2c0da1de320914e49c93885f3cbdf5d5ad125983541225498812b1829ac7362325ac35e3f5a9b78f9c1b8e5f1f615cde33a61433eaeb65d09b49a86f1d8c78ceb7477a60a4eb0e76517020f938806990576440af4a574fbfad52dd826034c7a1d28b800ca9552fdb39185299df1e5bca918a82b55d094581ae6c605b6c3d244c385e89eaa6d7ff87d62ca3b8e36de8b10727fd231a678f8caa682ed383a04c6aac7f957022110b4459366580f206e420e93373e8605b6a04e37d790743e7243325985979b43a9c95e032935038615325b434736bfba38601872f7ee91466403788354b9c1001df73dbc8911fa5f49c6d4dd428e962b0204fa0c4f8a0799a72a61f64fdbdfd2099e4a99b648cc8bf9e9901ba216f1639e79d79abf5123a31aaf3e7384199a037eb3485312d3e6f9e00e151c6cbef41088dea41124c389f26ae1a646a2aa5a58fdd91343205b3994d0e4c354485a4ab1698a15778fe7decb78e53c5734123579fa4840f800894182572d2a7baa28677a65cda6ae8bfe0fb28e32e95edf536161d1a2296b49445b908d0511a1328a1b100a7d945e829a5a9d7b6322ebb4dc07bb4605c4e3ca84901dd4803ba5881e9dedb018ba2504123f41d54bb77264baea473f6470ad1096561eef4e02723fbc321ed43e5f46f3c68cbf90b90ef4c7e28314411e53bda5fc2485da9ca4be4bb094815f7081f091572edb35ad32a935ab23630d643afd3bf671d942eb1cc280307bd9025a069879d657ac161a409d243b6d3c2de5c1bbad6b72561d8f0d9ad0400c2027106a429828738abf543d39028e9fb16aede11f3048811e79d08b71f295f1a2c16b6e4306326fcdfb09f0837cba0083be8b4c93198178eff15fda11bf59a7b2939de1ae3942d20488f156fbbf193d85c7e9e0158d410e4baf6f11d340c5d77f4b27412aef2274a3de9ff08934c5c732ab2b7031592b2e667d19c5a812e54e250a4f7327d7098f697985cd05ebafccec3f995f26fa385c7136a86b22194169543bc3be1fe1394a8f897c95daf8a434032841d4c86277cc5e919b88bfb00c9756dcd1a0424185cc3dad6098ab84b1d05d435a441fe70d41782a56f2bd5b67682838843e1c11ac0cc397cc8baefeeeab692d9cfa2329a132ad730c107f8336e4991400069f793662e65de67cdacad5445f299faf6d11bc903276dfb982ad3167a3405eb92b622b6ee0d2f93d6a8af57487cc0a114401a4346828adaa1d8531a462a9e84a143a3d871768f60905b0d8d08877e3082f63a595b1bda5e11daacaffb7f4498eb07b00cf5b6c64a17e8da6d4d70745bdd81d9e16016afd33f9a7d78e1b6a60cca6d9dcbde9881795b3797e426013e872bf5f0d2db6587879102884a76f2e76d66e1b5ddd426a3b47607a84aa2a51568bab4fb141c02525ee5e1dcdc0c423fbb1743c80a1bb9eb873c1c6c8103666f394bd88962e487bfcd4f45afd09d5f90fe6f60071bbd02e16d85456ee0489d9565b84138add7aa51a4437ede145aeb8f26792126b036630a1687cde9b492ac5800dc0b4c60cbe79467a7d6d67e63741a630bd274df396e915356e32943e38dc9e7d4a1d3ea540a4db76e04d263798c42afa070dc437cc4649321e894d2fde5dae700b1d0b2ac0135cd314826892f4ac68842e048e7cf2a2d79069587c17671b416d953ec0773724b0ec11a8ce7b42c7e420df9a000f85407133aab987cba19a98dd92ed393112267801c8d58501ae9d5f0d81b4a0a5d5427081dead6f5b00b77b17ddb8dd623d7407b88d30b875283c298b03e9ef610ce309cac70204b8346fba11cf84b67941d03889a3ce0c9b3d49521a71a036389ceac62521cb0d607ebd4d4681523eb12988d960cfe95f469c4eb89ebe704164f7a7c8f250749c1a02e95e2a37220988b4df8028d2d24f08a827a7254b5845afb955bce17f8030cd17ba503cb4d5b52918fad9594f85f3608e0c65974e715702f5eae4ca0cfbf8efe58a31c9eebcf3361a12fbea7d0aabc307c93899a7b24a8ff4f3e58956e7b170396405938b7311b478b74edf74bd2ea21cc6a9b3dc0a750afdb73e14cab110920a0f69e2959f8ce7373c27edb63379703f06c5bf1449363f58b1e2b32726606c249d3bf19e60d669e738e0c448049777ef836d3c557d6dd0e51f3fe6fdbe3e8a60206c0e5d1b5bbe33a057745421600036bf11f9d5f6f53f63f1f01eb20d792eba3944123b3f8bf5e60339c8ea39211b35932629072d98e4a12942af1d3465d281db3a05eb1d26732b88b1bb0dca412c4cbe87d53efb724081791f2e9fa155c875446c57cec345aaf021b3a017afe3761434a5116a272e388edfc7f35cfc8282d4d1e93588207ab1510507f869474908fe9bae67b105ddb1acd3168672ac71ccfa9a5b4856294e0fce56781760c60134f0f9cc7788da28957106af42fa0c387e95983896814590036c0948b7fd5c69a6ed21456a348dfa97b4e96526dea1722861377789ec25cfb1c68e693c7a24bd8ddcac9e19d13a07dedbe77f54bb0ad7cb2a70646c1afbe1690810b6c147c50e6ede54a3f8625dafbdd5483827a2183bf2a655d9e76fec0dae49bfc8406dce6117804f8985dcfa7bc518e127c28d4b1636593f71969ab8dc7909d7ae9d152ff7b7077039730353728e6bd617a7f0ff2caf53821a144a83b13b89ff418bf0967609c144af819c30244079a7255543e7c8ace0dd06435c93e6ab55810dd63e0e57fe36bd79a7aba9d829001dba926b17379090dcaa80fc9162ccc188ff50d101cdeb6e6e5e639f0dfd6e33c45a22b4a50e7275988a553d730bf4c652c7dd4ab0ecf80072505c3dbd231471d5d6debe8d798ff6d3418b61810249d07f91c54e7131ea2d23a2f1499852c1ee02e9f49c67cb61edadf5bc8d8da036403401a9b6bdeb6e0733702bd000e7192662e59161c4bca2938d67f5d772b2d95e0c3114987f22773fa606c092c11a9c958158b2f43fff52f531f0f0fcdf25539eee75d1d78b56af6b4bc2f471c2379eb3f83daa4c88544f8cc5ce82e057c8e75f6d1615c39844901aa6112a8e2e1d67d24128a17feedd69a48080245e2d19a02b0a597828ac5e0041d108e450bd38efd781a6f46521a3ce51ef2668ab6403ff65e0f81db220ae282799105750930468d57daa10240f397a474480e89742ff9b8754a460e344d513a071942468aa951520db133fdc95f5cdcfe5fa7435689a864770c9428076a57b7aec5b01963ef583559503dc677c4195575ff6d6f0f5e9511698a9aba00d49c08069762859d5602611ff82dd2b8f8ff92373809ffc36049d7776e439ac1d5e03b3c8e424aa3012a257da6c4c8831f2038280e58431cc386e77c4a06f108b9915a7a0948f51a1c1fa7bb90b7b6de945241282abba364bd27a8717101b9724e81d4c3d4eeac948542b1099a624ca15569e4e304d959ccb4a310741539fd4dce51bfa6ddb9fc497446132d4f60c4d9bc1c92c65818180818d74e2959ae5c823e6c225e63f9fb428eadd71f83543981cf85e9bd599676409ac370b7396ac3c1ce6601ede26bca5b5104a431600c8816cde9fbf43e2266458ebe9d1b9d061fb6d0a06209acea77beaa533e7c4f5b07455b5f6775f5ec9476ed292e576dd84651a9aea61bdf6dff3a66bd68b674746fc20417a789c7b50e4d3da1f53c5e4eeb31e3b09e02882ece16947a2fc661b39affefdc3592528179093e10a9eedc5a086e42e4afa883736edd0326dae183d5658afa216d7fa06e9a88535edda315df216aade1ba283f891c1177c1a8231f25ae0fff6cfb58d3e126379f8cfd06305894698bf53a6e44fe7732fe9199ba8d5525a6d327ad8db33fa2e8e476b7ed7d1068436c443b0ce4e7033de9c6781f14a6c594ec6b85699978cbbaa991a3a9e8515b41d7abf1d3f5d462147aec9a3c7df8d0301c6cdfba2161a24d2516c74a1fc465f383f01c4868c626a11c15c81727fe86dc23535a0e661d05f4c9dc52c6b2387a0b82790b84a56932902fef4a03b61867456bf8a138265808df82660a387e2ed34f5e161e1ec8b408ff150737e400f94e6fdde14e53871b79c91491f71877710ca804047ef6243a47504cd02607c8aa944f43710a318a5f80b5c7a33ff62ecae4fd7562aaa38cf7df872857df97ec79f5c392a61097d5da097d677f5628662b9800769dccc5d0caa2511995317b5c95b41574e86b97af9c0bfe6710152b135281729bd5225d90e65d512dc111163e7d24401f8b3f64fc66236fe7f45efcfc55ed2eeb49d1e1c801f08901f378bd69f8be916fab7a00504261aeac3ce61a247ae868bec530dda8bb0ea3b8f0a8f44ed0bd8b81b1053a2faa3bd4796cd605ad06c3e594346a78a1a6f79683a5b26413c2bc7472e9769644959adf0736affa08c4bdd9c7fa3fa72dc64eff888e6fd905c458f325e3261d3422032caa06ef85e450fe355dc4c027897ea4ce9714aa2e40b40f6244f992db51545921e757d3268ac770c395eab29141d3c6a58730e8bd428e4a11a22eb45f5284d7c49700a8092a0b6ca6fd765c8eb60394ed0f444cef0c2d031179376b998bdfe39c5224f59ba4fc7de184f953e5440fe57f70cb5fb5446a4bc83465eceb1e2bea923ebb08e9becdd08c369872f7b490dfcba695581811f91fd4b5d50683df5e4efbc2a7b6a329b7485c12496f154fe962ff541f153ffb369ea4c2f9a819b3a9612009e500d57c366d01ef21b00cf1256416bf0aa64df84a8f8d30bcd6cf3de7ec06c40df56a93e9bcb0a9a0d746735f8ab3d07dddcdb36b8d492fc3da0a6160b9ef4bfb8cd046b8c5cc2983347d861ccca2ed6c7b44cd3bc1c15ada01b773d4c06c86cd770dfbbcfa7d884e87aa8b3a00b04ce2c91a4e61a41d2055bfd16345ba3d56b457eafa1955d76c6e0624bbaa2dc4cb88db06d6162e24aaafaba73045ab3e93f529e6610ee4163a2ccc72b105fab6addcfe687c6a501a92cbb00bfb239dcf0cba81ca82b66419ce0816bc92e5085b6c373d8455a888c9066e9cb5e84295df3bd9540c583da1dc138aeef6003b22ca32fea90308dd6fe762ab2c4d3ccef85884d699cb24943fa1f04490478e95de1236cc9b024ce1785a4590932b57bc40d04df12c0369326e29b41053b4b30dd4b7716e5b7c91178752451e224d6c856ed206a345f29ec439be3541e0c773babdbb85bebe3683cf923ea474914c0c22b949001146a09c2bf77f0d8fcef1c8a1c74bd5d589b6689e8aaabe505ef3dd1e7c233fa3146fb5d8b5e4fc5ec37eaf44ee9893207dd389054535529e15459921a0894e40358800089c5600643022c28eb971778c30eb032feaab460a3f2cf19ad2f04b2754fcf12d1af70d04244efb0d50aa1fac02f85ea5c51c2d553dd4f12d254addcf9745bd26230bf0fc4924ce91bd8b482b54f1885b5adf0594e7eae90bfd75b18f6bb0b107122950169c8bc716f5abdd4f3b3ec1a95ea0feea82bd2415d7f30bfc7ebf70c542bfe83250086133d754264cae015d641968e27fd40a83921bbf107181c106892962296bf84c6d53b7bf3d2dbc0ab928185e054971f1eb25b0d68de02c0da5e928e00d43390ad11cf775a20ca66202631962f650f7c5d402fff520be952d3630cd16305095e007571057cdf93754e91abdd15f2cb8d73648d214b23a4ce57adbcf8b7590678daf8a9a98ddba91e8e4664f7a4f27beb3e43cd3584c522756100a94c5596903f287991b8d41c012638e216229f9f9e9188a0846b0563f5c34a0c47a2d86ee7e9afff33af7da4879abe57ba2c5a8a046883d58b1c06c004b6860ae1a40c302f740d11e9fac72d59fc5f665cb335826eb93b3f259d99c9afb406afd7fe37b377a8ca4a3a72404465d28b066624cabec6b4f472f98e43d96682704bb96a9307401ff1b41dfbb393c0a05a9956a40d7ce12758a2024b99a474ea603daf3f5cb52d3bd9c328d126735f696c0e76b5a7bf060918e53f247ebb456bb8b1909a0cf6a2841f457114abdbfc2e22bbacc7cd9b025e6765519f59efca39af7e80f539274c8c0d598a8f24fd7a4addd3861cfbc568cbfa0de87fba0e95be132e79f446a1c385a76248cf66c816b37588bf188fa6a43e92ee6a222b8af297da087342e1fa717c2b62162df5621779ae4fcd076da873d90ddf42c6101c695c788cfc579672e537d06058457aa63a1aa19521bb81024fe6861394e665b2e7a33ec0b6f384ce0b9bcdd794edbd7b05284f2324c7a2123df064dd0a84b5c59c22446329f66878d7e165168ab73ec271c651e9b43292e8858874eb2b5765c02a9b34408897827aa1912a695b6bc7fe635b95dbd4d73c87a6f4a90eab915101cabf5bd1e56c8639a346030703316f5db63f39a8a64b9fc490620f7000073469f68f7b5121e1a65af4f612cdca6b22c1febfd4a1a39ac4560b1181799bb2e22b2e57731bdbb4f6def27e7a6110c673150e8f906e724d8ee4aef2e7618350ef308ae5812e388e4ac852d33144bef5072b1aad47f5435ddcd132fd0da41a3c758a16dbb7c2df5a4155d0a191596d98144d36e7a0a537e07f16b92ee6b28d81b6ab3f3867a448f03edd91bd0918147605c190b8f2c99fb97687d6b550e086aeb17a040ab9f36055557bf32b59f7f6a70454fdf437ad49d164c7aa4cfe6aa89049f4110619458b390fad1cf9a9dfb0e2636e8ed61d25188379986183894544cc9595b4a761fca035b95853da9f1930b3da110d75bec2b616729200502cb56e3be43f3feffdb0c86c5c7e3f011efb009779a932fa6dde2c2fbe453441aa2c43edb050a147b8594494620c4ff0097350863b096a3b6a647b646bd0253e8f36fd13d1adf7f1476857e90812268c518c4c0b4660b592bd158971edcd5a9ca8273ccc68791b2c5e50059a1c359376e0d98e69be74d9cd0c0f93a27392ce7dff2b78d2222c846c4340e1edf389b5872794963c07bc06425b907617d177621ae185ca551474a92754dc3129ab8b5f7c24782b6477cbbc2be80655ed0a1a175c2a9e93dfa732f5a4b5662a508ec6db6edc1214b15c0208bfda5519d40e44672b5109b2711884a1f7a1ef8fe05aa7df62baedb92973a601b610ef5c3cb842d1b67d7f0ae347f109250f350698e31295a4f35eaed8a5378d5b8e86f7c7332c43a255daabf05eac0dea6afa76257061744e6c07f7701c90e48c0dfe40585d475a3ff074fc4781c90aada519757a13e16b2d22a94e1b8f92cf30c98b1578ee82e1ff299f4a8bb11543a985044ad95510bceada89198663c5edb18e2ea0af58638fbbb71900325d70dccb084fc37325b6a3234a57c401feb107d55cc3a0b4c97f1c2fab8e277a34d07599d733038403fdd1cb05bacbf7ebbd8a88bb1c8d7b895d242354af496e3b81b3e0cf1a1d65b9a5bc5a4e78b77601f19d7cab8bd5af065c582c247d77376bc6f0ec791e6eff165fce852413c5d649e4c002ff5479a2271eb09dfbf8f731485af3961ebf6c68e52d61f9ac2d8669e8fc4c4ef025427f8d4ba920c1cdae0da4b73ac03c0db74a383bc20466793278184f08f81551800dd256c9e473742495fa4e08a2d23599b60f6892378d4fda902c07d5e386faf2335742218acf8b52f527924710b0837586f3a09cbd8b8f6c1e27bcc87e6a9f2bce042f2c84ba1ac2dcb2191b6985f0217e446d38abb91117cdb6a75db583ab74ed3df8b676fd9f5a909301ae981c815d0573b6f45282713d5fa2a49e4570ba6ab1d603af091f1ab79d852e94478b708f4847193250e0b3b3c9be3a97bc8f542ad69d5202fe74adb7d08f1227875e5415826df331d3b8cb53d8128935cbdf08708b553f98e9c9c42aba2415408882a2ed0664695fbf6380d87ad60bb39a5528b9ad535fddfc62f5cd6bd9928101e5a547c6f7def1417b81cfa81f266db7f23760e7d72beae533b01ce04f330e59985c5c0d154aee9d6aa4fb7f7d42c72aa9bb5a2bc86af9731cc640d40d75414fbe8cf62b11d2c67581eaef72a96ddf3b4a1108d626265bcf9ade1201c21d6c08e6b0ca846c72a3939db751aef892d5cf856b02286ec36a6f07fb523d3cf719f685c996ce3fd6dfa375b0fb8275a9b3830d7f344b724ea3838dbffa325b8f3550e0e573466fdbd59bdb943bafe92bb49f532132d142a10fe087f400d049cd6f1ec68612a9bc6a92741e52a376265cd62c1f5d8959337cc2805e49fbc2e6e42156533291632a8cee44a64db9d103277c6b0a5ab2c8993e326d694793e52eedb9f27905db60de128a4182cb48305eaab2c35506963cbc95cb990915235c78b02b322411b00bb8b70d7cf666b374c4578bccf2b5ab7f7f713a4da8d7298c18862b0ee9cda16705d11febeb972a87b526c5d5c43c37e8d09855c76760b0d3db2ecf9593bae8d22a90d04c11e872fe31173f536481cebe34395d8b898ae2de9ab094b713a04ee2d5292d475c67b4374c9a669fa524feb8a7c60b1329c846fa993668cb2684b4a80fc1094cba507b157c7dd7b024d62fe77a1b83c14ac1d67a7d4b794e352f271b5b05c6a223830211d7b6f86acaa8967d69d515f0791050c0d77c6df1d414fea1a2e35b8c1ac39967151cf426bf367592d39d5c2590c0bc68c8b15839471ebd0658c187c671a4c97d8953c42d738d5477df101a1eba6cffac020b05fe807fa1ab7976c778739176a5585978dd6704432cce835fcba104e3f25558e62d03562c20951742df3977c129bce8e47d3f76ec5f3b3f0d6337d978b9d1ad7cd10dd1de92f6335585f2455000c2a19653154e7303f874712109b35b581c5f9314643e1bbb22058faf42924852cb0490dc08cf95f0e8e5114b45032e1c3d0c63959b4203e8a4044009021a725b034a7168c43addeea5159b34397e68d7970187c63b630ea6c5a1ea374ea8332874308f6f771eb998cf1063d32b16c9092af6732f277d1bef3f66a7a77ec1fab91fca506dff29d222868ae361f43e3a60a9169cf82235034e61261bc961959592f5c426e7ca4401e8532a4e6b89afb47451b5a20e34cedaaa4808b526c10bcaf5a229a55b0817fa790af3215a7023609e105649f71d94785880fae7c76042a42ac99a5ce3db8a433a1de5f702bd5367118b436ea048d4e9ce0338d07d0bd039c8044b69a4c7d2a74ed4f0144484f4065f47c50b284ec2cdd41072962b0013d7b5435a31b87a4d2acb150a3e613a3aa147dbfebe279066d74f639af7a21a48c509cf6a638d138d5dc86b081744b02b085cc70687cb05a20f6c09e6bb2bc023243d77002c2c38a445dbb9f30d262edb70544bcbfbc8a8abd6860806d5f4f527d74661e0c13a26ad0ad959d4947b4ccd17d6b19e0654f087e0aa4b51912cea40481439d7e638fd29a671505341770741c575e5ea495a8d73f9a31566c8c17952c1ae789830a602a0a0a72e6343f5fea6778379ef5c97a3fbb7819078228f3e5f8931851cff050a899ba3d0a86a25d3b875f23d5f023bdc5668b5be3bdd416e022244af975154dcd957e1acb119a24698905e23c426b936239b63c6e8896b82dc247b3ceeaf2a423a9eb043178b923a0dbe033e2d5a823047f1fbd01e2fbad3aa9e76f84ab6ce0156336f179412b8153acc0e0450099c3ade4801bc9030bd972c68c3e94d0332a4281336a292425b9213b0581db7a8a3863214bbc0408e62c1ca997509888a425c5a249ed06b8f86de6ea1ed1e7149b4000533ca8f3622fabb6560ae85a44ce33bb74cadcfed829bca604f97e3c9f152bf09f1607ee00e3cc8f08ba5f2be10dd362be2495cf9c57ad4ad0cbb04bd29b33d48b89498cafc345050ebbbdf0d363f97f2dd6b51e9f1b0fa550d7bfb65bed016f07e69652c95ab47811165d7d8ec6fe713d2b9fc87f02bc8c8c00b89065031fc7ffc0c724041fd1d03e0970813e8d5ca695dba0be80bd742cbdd017c6e023a1885b0a644acd8473be917744078c84211d01f266192c7a6472baefc13f7282669f59ffcf13b94cbc0b2e9b239ee237e1cc82456daa16722de219f12d874767ffe4bb2cd790bf6234526a0fc183544a979ff8178a1f57ffed956d875aa1614179756817285be69274ded3db2135b0004f04141e4a3180ae2001e1af88d36c3a818298ddc6003e17b537365cf238504829465cd4fef6d64cb6f7256fe1c109a725debe5091a63b917b1db2c0e202a42a020bcb01d2d534088faf9d538e84b8ee264b7642785befa736d7783a8d82658f09bfc4eccdb4c70cefcf15e9be2f65a2795f2d1ac8406e44cd846c9885a4d294386255debd915fa18fc81c043997333b196fec91640826af2bd1f9f200df4bbb4d65765464885b4c0b81c51ba45d51c073ef65b062dbc05240ee9d22d574543a7fd37ab349bce9b15ee63aa0f37b31c00d3e6db0b04ad8701bd4a4bd790871319367a08d98541fc4ef8b38a803ae8c7d048ee061cad9c7a513e55eea5547d57268c3edcb912b637904f1a87df6de1df5beff5e64d7807b1d15b804a0136545b092f0d5b3adf53ae6f5bed9890e21a5d384d34f6c3016f4cd9e389a31b03a65bbc1e0a4b60ee4c9a0a8f29baeca79df10017b65cb9483153ebbaafe8c38ec540f54cefa4111482ab0d6e6185e647ec0e2678ed243c1ad927fdc172cafe41b087a8f6b10074e2149cf6ee8f3fca4f9932d8a6f0309e58b83d9537501fc76e43333143ab290ec6466bfe674d627e5495851d7a5969cd0c06c230afd160d691e929f14c76ccb3109b68ddc212d8e6f91919be4c56994133c49bf1dab66be816a5e0e1be92b23b31d2b6d85199e95292af83b2e46987e27d12503e9aab9d0dd0f2508733bbdecb76c1a582a3fcadaefcc7e9da6a07c0c8fb090473af0f564fe8384360d0f399d7cca2044db2614b0cb67e736dd7b20a18ba8bdaef1bfb1a49887cc82e0bb3049fef78a4c0ed31b78a23b286024636ef17c0f9bc45b1d74009980b01db65cb1f32ef0d0005a32470cb8047c9c5d31f0ea41c92b795202877594e0447ea0abbfe7f56579cbdb0b54fdf313f4bc3fd294b512d4fccff33968216d47e6ef3f1fb004bdcf109dc455eb6c5869cb8713f70082db7ea1df5e282e91a8643f0d12eabe63e02d31afa911f77af62e19e9d4846aa67b029a4fbb5b7e234ec6d0093f27a0eced70d88b6033b243a4e082843dd471a640e091064a459ec83f26ceb2453c83fb80791ef715560f0e6042fdb7dadd9a4c9eb75653fdda951240c412938ed14314a749fb377fce22ad9ddb7152d5d970b76109e7e98de96190d019ea9bdc89c1865cf4e600d37049b5a14e23fd2c15ce4f105ba86c21c2e14a0633475081266e1c78149c3968c4a1aec7b91913b42fdb7f246198b76c1ad964d7646f9cfc6027f0904895329f8865219960ae8868054bb2773e5eaba205b813afc152f2f689ddf3385f7180821c6b41431c248f0b86b53934cb6d4d2a8742ff909561e20270146c75749cdee5797da0ae59d069a388cc6dd4eaa5523914066134d01fc2196bf1440ff0340f7a38427070b9dc326efd5ad9a00e60ce93651275f5a45c7af3fbbe45bbf65320a02b9a449160451d618d8acc4e21513db31494c771f6d1931fdb58cc53a618a14e181531fabdd4fc3880d29875b240135e4034f67610223c1e611ab5f30bb30beace537e79fadc5b82ad569807283cbf3a8cca8fd6488c9ed52ac162d36757908364a9df7b6228dbd948c5e3599410aed018119282c61af6626ad2558f2322f006943fe923817add1b42dc62be8f3fe9593c889d54952392968be441b2b088c352c3db624ee308de425a12fa85ca6e8df6fb763063c588487a056c41d9ea86a756dd8c05e0c7ecff202c3ba04751a126cbaa1d2bfddba369f47c1373566823696b85bf4aae56559a4d2c30bc01301a027791144fd7940f9a193690a2ede09be857b21ea51ccf81ef593d0fe8d6221396fc052b6372ce73d6d9093ee9440c39e1907aae8e9878763b19cf6e6b007493a27e0ef976c7b4e34da5ac7b6630189b5663f2c38922bd171af152782c5eda6fb52a946bfdc92d0334de7eb2cad55de0269c2ee1720e3c88086944923a984d5583f432b36ead5b30aae581e0fef623f6069e5ff5aab906a26c32079c2d1fd7e1b840dc7479864c6a8a74496ee531f9987a08966c598fef37615ea4871f38ddc1f70312573180d01204ea54c40d00641e7065bdcc1eff97289d1ab609fcad7df273109073a2b5b596832c51a897e5fcae95661668af77243beaebb53c7fb5a2f902d5fb4ed9c6ac46f3b223dd83ea747c062becaf6ae04fb0eb3cc05c71281e017fc82cc90372cd46e8892a4d33194ef39265fa343a141b1373f17f24fbc4411a64007d1cf4e8c39bdc5b7f97e8634e275f1f7c8a57c0f5beb2eae2f3f34fd6fbb16d59947f5c21b85646f7682eb8eeaaf4f0eed2fdac8bec4a852487fb72a9ec0f49e5851ab771faa445f798830e073f75dfc6a6397667b86489e5cc3cf523cfea07894f84271458b86a9a5f8f7a8c2b5ed58f05824e1012d2909fb7dd98904414e1ec86144886415fd19bd77c2c443d1704730ea4eeca354028ef207f4420e30bdc50e79cf743dda8e0ad13a71ab4635075d319d53ddc04f7041d878aa71d60498c38d1c9194a9e63b88280346e525ca9e2e32d7c3bb93d67eb3b86f98ef210308e73f3ce6fc1cce5db96184cc4353a4cb69f51455e889744d50370ef238fa918043ee369fac8a5ff72491804f702179d25b4d11b63a5a40a63e685adb823f7a6ea827664c828c18393fb8c8efaf7ef4b6343450b1c52d1527caea6b7687019ba9f004f7e59380dc2ee94f228ff3298650b4661cfc8568b6dbfc4beb498d3ee56937f659fe04d1f8feadeda501b39c8b6ddf2516882db2379a1767d4d54ac4e6c5ca20643f13ea58227ede28fa8753452fea33dad5f482649b7637278030983fae6428e463753222796fefa88f00508430d00e788ee010e2d4a8d54c5412ffe08164eb1e3047c3d7ef0422f88ce878265c8afb812506c25c2eabfe09b9bffba90a073b1b52f877a22107896f316608034de08ab0f3157a601bbe0621dbbe8dccb139887af73f25fc8df0aaa1d3a20efb04f165cb02dcea9175c435c80ebc8e01699be33893a9b9a3212337b8293410f5e4c2baa7c573c6c9d1bb2d6c45e3278071a510c86a9d07cca10ff971e20ed73ce710ee3e8165ef5030d444efe0484c533273d5d10d7a0b143c516b28b165d3bf174e28e202d13d876edba8c09e2d7fcc0ad406919b9e60c22ba2c3dddc5374dffd1368323d50491457a114e87d449ec6b171ca9f875da8993ed8cb93c881983f20465cf141ac23471d04828d3d24c38e27a0746b3e55911f557c4a87dc8f86c5eaab57d5140ec9b7f3d6c438658b9f275e217a79f0e9cba9633dc4bbd7116eef70fca65f7a8a65632ba560e86a2570f85858d3a5e12ac698670a8a056757a20b25120d86225216928b1548148c587970a0688a1cc0e2cd565744b82d72e150aff899e0b30a1c412c69704018da03821d3e9f3a4c82e34cdf55ad87b4d225b8807e950c1f0235df33daec773ae4566cf1a0ba0d53993c8b5f21d4511f5409b50d80931e589e474dd8801e3336cde54c1d7787223b9a7fd0dade6d90fb8adc659bb2cf241c1296168712ab2ba13201fb6422f0b28a43dd40be377b5114dfcf78d68289316eeef425edb2c5428e795664431958c74da7715038650c64efb5021f629c8e3091e6c6ece832b26aea96b04d8e78b9ed3e88d6fc1d27fbf12789985af71ee202434d57405acbab65d6b6e9aeb9d6af69784662888908263ea1fbf1400aeaeaa3d2cb5eecdaec275fd18441711fee04d29abbe68fd0e9e7b12711521c620fb8f242e2da633235f8538cacb16abbab5a9bd521128025e0ae995404bfda91e6fa58d15beabf09471abb64c92357ac6744e9ccbb79b95db5a5b5444892dec56ade38f32de626ccdd840206410beeb8d24d95d63bdbc1ffadfda1d32df2cd84d94e76b45f4e1a86c4b133c4f7fdfa8a97c192c616feb0fcc32d1b0ca8f8213f0a96e60e0293361045b4ef84b9a251497cf7c7a0337d07916b417218509a97bf8acbb865f24a5731606df32f4c349ece4a7981efc45f2d1d0ddb3536a8450678e31af0dbb03a4b656714f21554668fcef1a6e4ba086da2b9b0a9b7ff59d31872807ba86f538582458cd2b249760814c3b7ecafe9fc53f321faf1b78884f0845486fa09d3d33e9cf9e7dd1010256be375bc542479a360322e44a6270f893445271eeba74e382591479a1f51e17e4656cf45fb6af29c5dadc20c95baea75ff9e36e5c832ad3b6724fb5ed250181b8379365706f2a162fb10fc081e7483ffa372d2d6a790db074cfa156899491a8a2a7cd97b01f8029b1676e8841837b249bbd416cee26956f01bed5210d2057dd9ec955e82500f16298523ea5f6efbb8ee678882b661e6f7c21a307b9520b54a7fc960062c93e5724d4481330e32bc5587f048d0a62b7392fc975dc3923af8741ff3a1a1ded2b97c05fef7a98151ff0c2a4cb8a36fb971a398ce04a5d06645e2a4a640283b3459f526f49fe862899c4686e151d6d85e0c24d4c4fd868cf7683033dd01140d858089b4f843317c276fff5b7a720eeae37443a60e994de1cd27a01df90a159408df370b1dff74a5225d7c2c9426d7c37162021b95ea2a3a02e5de239f60dee077746d1bda200a4f9a1f91bfae52768060b666851080eba66ef1700949aebf1a0f5f9588f289f914b4a5a98c8f19e2aa867d52183f04a09d62e55211f4e503395f656797b643b8accee5b5af33aa10e747f3fa7ac50700ced32b9c8e21d89a8fbb0dfe8cf841d9e93d91fba7be2dce745b59fc8dcd96af8c139c75a03e5f76b5dc07980a7a4237512dfb7def9387a6d26a9b81ccbcb30adc4ee91bf88ad95f9594c3135a66340ffa72addc4d8e6553f507bc0e0526df36eedaf952940d7ca86f4246dd10cbefc97d9226a2746a068ebf41ed7dcfe7f189c58ccbdc5d4ecf57e84733c772609a049127653a05b0e5e98e573153267a572b518ab8590eefb448934c0cc0a016e014013bb9a42130c3e0cb93c62c1483740489361db1bcaff7fc342521b28eeac229a0bba86197f6a901093572e2cb7443fe12d693483215cef596ed530f17a7802caa62c8ed6c88f571889c9d30a2ef19c40b0bf5985b1a8b67cc2ec997467d99aad17a396f7caa5a5800d73e1cbefcf3ad44d1cec2a1b19a5bec21df4507541fd5b9ed86e328a67a560db1b43a9ef78e3b269b4c6e23f1ade4777d0e45e0191121e8811a35afa3becabc27358dedd197c82a4d0077986d18b1d5c1d96e8314a88471c3211a26902ee86e52cd7f7ab92cc448c3d303061b6d6bac45892e459aebe2e7635c8494eaa66f355610ac82f428a5108158fcd741643126696e7acbcb537cd9de236d603276a2c1622119cf89c2af9c5a16f04711f68ca57ac07246ae80dac85a2ba50cdc5fe0ab25d90c4a0cff7234edc5a9f030d2cca9ec263cf04658b6cba79755a645b9705af0c3ad3aeda675ea5a6b81d2db36730f826f07912959f784acbae186e011c21279b4d97d8a726f1026a7fb62a72035f0c8e7f705533e679cb516abb31f4ea5b3a59835188f565c2dba4ccaccfa4ea117c3501d7e5d1430c3454bb9648ed3a2f0f66e369c1fa3e82208d7c56c34946b6503b6b471bd3e3706a30c6d0f097788beb5ec769b179fc9ff799bf06b2b350cad5806152f874a5a9804dd124fe0c5d586c53ce58b41f8b73e07dffbd7ab7b1a6b4e1fab5179c8bd13e5fcb7b066050d0f2fd25e35bfc6a73dad66f393aee650d242d084a284b7715c83c7b527ea137b7a2a23f538816dd473008c6747a148b713c3e6d26de3c1297331f3dce3744b7c66426169383125f22a4dd27e625862fa297f40299082a3862d0c1a4f9670921d0676dc2512c14a6f14568aed5c586fc28f6365fe5dabaacc4bc70a935568c6e094e9d2e277735f9c5b801f4a4250c172bb16b5a624df8c826ff0e559bac3962d1384d825109d25d5dc2deea44381a402e713479fef46c7446365ede51e6dc3a960c5028386b0b72141595f56aae1f5ad65c41ed61e7a244a55e9af5bb96dc2c35d04d07505f9e0f2af69a75b8dbcb9aefa5820ad4b513e4009578786b1a567e82229c114fe8e7a35164561c621315dec9aaa4fa052169aea2f6b8737b54548bdc7e1342132bbab7bb6a1bf56a25dfef109a5a742f77d1328ab596ed57a134b522f6b873ed5153ad72fb27046af605bad002ac977b30e6f629087f83f2357478707f73e81f41901f485e85feb7ee374df61904f206cd57689e08c10a06fe9e12cd613ca2b41fc8d56cda4b27b294e81de1012420024a7a394b5f509419271d93e39343ee3952de4e72c088d36b79272185b51e23c43502cce1281a21e1b04710ac8d00e914c75c8120d23539c01608031182014ce8ef037d1df16c7ea66f033a845ffc3fcbd9b8977eeabef5c04317adad6d239becbda5dc017c0475048c043e3d5d0ff1c0e3a2caa7a0dd9bc538f66a6ce06b7a3c13f16a4ef589baed76e9b3f2d0ae4a85b98c3ae32ef5e5b602e02b75b2946a116b537d97ebb8546a1116be42b577398ebd8bead602c9e1ae232c3f525a41c657b88ecba6faf63aae9dbb58b0a9b6a919b8dbe370b72ee7de168785db5bebc39e0515155b8485cb90711d970ae6aae3c05cf5be6ac665581f323ee33e5487b98ecb06e03a2e9797dbe3bcdcbe6f01f000581ff600b80f97bf5cc7c5718fe1be73170b67a9ec84152a0fc197f81900a830db4b5da9f372958578f600f3344f8c67a9efaed4c93f2b6cb7ee405b5866611946df3a208dea321ebf03d2d8cb50b9dccaa8a9f9c397781d97aaa6a68c78957d50f5e7b22a8b0347c17564d25a9ab7f5adb84b7d715beb9fc9749a77fec5505b5f5f8c1715860a35baa81c832ff19ba8f29221ae829dd0b0e6e2536aff5053357e548bbc784bddb9cbc55115480e77b9b00feedcf5c2b201dac88d8f403c2e3ece7baaaf54b7fb5ca8cd356dfbbc98f81da86659168608ed46e9b468161668d103142b4e4067dddd1d219b84501ab72d52160df43093457022082736d0323637ddbfa9397d9ce660c7186bcecd93c59c9e8934d248238d393738b2bec981dd7d8393d3af95e4d11c8cb1edb1a3b9a80395ddf4cc1b6ac0d08d8c5219956930b879f5d62d1289b61999349184219af0811336e8ee6e668e0c993972e4d867abd9ea318182c38db0490b24303ed0deb66d8b318a628ca2d16824aaef36ec36db9a968342fb514411450d2a5310c1e20828989939c618f9bd5a36319bd60b76cbe6c5e25e362b1b2b284fc82868fce6ee777777373f61e309a8c5be9a1319b8d112a104d8ed5ecc888cb3588e9ed15143acbbb9359b4528535471bb179b2be019345ecc7f71bde1db680eb2ede263bd69aedf373dd3afb7be79d908e2d70dbf7a8667b815ed8a0b7adde0f09999b907eeded880b063f15fef059e0914236e0c1a42d4a00c4d4bb65ef3f134c4dbbccedc7ff50c6f87902143b8d557cb6625448c1b5f22d8b279c5695997b196103a215c08ff007ee1710b7d781b10b636e8841322a89069424c9a50c244892976104510b1fa002604d400bd7a4fa6fffaefc6de4eaa1d8b0e02379e636a68d18ad7023c0fd4ed8e86950b0f573c0e5ed4dc907611d0aaacdd0e8a0309e18c8767a84108a1256993e3571c1932b3954f76031f993811828a21128804a62601be8fa3f639a3fc8c9a167780382011833c425c40d10198020d137473ce77abdb34ccc339e5b55595791f00c7e5af5a83125aee3dd06eb5623de92738bc5aad50f731494287d56a9684637d321cd609f48df686f91b5ae8d48b692db63caee58cb1e5c5b416512fa6357909731989d4b10794dfdccc0c7fc0fd5e0a2cee8befde1ef7295a7e35f1a6fb5264ed94db87d13ebed3edf80aafc67109a48e4b2b97d4f2d64b92b0593e798a1deb5c528c514ac9a8e65e44426373ef3581a48210aa0082beef51143f184008e106482a6e7908212cc128a36469a6516acfd22dde80be73bc017d31420ba120b5d4485a0986187768739b736e22d13677d844737b13d6108d78057104e1c604c6070e7ff196bf384b3dd236250393d9f6b6a98df41c96b1ace34a0582ba8bab5420a9b35c850a44e52b2521a88a7aaa1e119da5e670970a5fa939dc95ba4addb94b859d0e02544450ccf4922c76811c49790e77a93cdab33c9e1edf417a66c5234df266b8a707d2b0cf505579d743807e7c7c6255f8f0b8f8771c25855909b46bd9657196c1262c200feda6d45eb1f2532db262539c528bb85cc552577e43f515fbe3c80f18575920474ebfc172d555f6c7ca59fe5c326c8a77ee72b129b6a9195457f90dd5555cfea3c555bfe1f2a3e52e7f29b688cbebca9fcbdac3f88dfa15fb63e5f530ec8f23382bafff01e3f6cf15a3a6fa2bfcb9fecbf88d185fc1fe68798ccbb03f8ee0b43cc67fb4f8ff5caaaaa2face5d2e7fef202cb5613586dd5ee7555597da3c3ef4fc00d9b7a2be4bebbc293196b60d7432591e62994708d2c090419a19a469795ca91406aac55bded1bb5253fd158c9a6a7b038eca57b815ebe32a2c953f57cbbb958a3db2fdb95af48ff07b401a95168f67d8dd4e6a116a0e4a90e6a92b2ad416d22ff12f6af7b0d4075395c88d4fa1fadc781728dbb0050c71e36392375bea73b9a8cfc5529f6bc525aaefb6d86c03bd5a32159d94664103d253c1d0e3c5c4dee1e2931b6747db3cf4c25ecde9f6bbe6b9f1cd13a483700fa4319dc4a5e6696acea973a2d771994ca6d3e97dd09b4aa58aa2a777ba69339dce97aee31acdd271e8bc0f0e87bef492f541fb3aaeeee613c70882763c84fba6678c60c55c007af9a92d77f4f778c51d5df46878f4d733f3a36faf8686fe6b89fe36196511a43171ddf4f68a9ac2ad4ccff41bd4f4d37f9436d34ff68de60f6952239b9a81fef41bf4a7d3bc71fa9162299b4a6dbbedcec83086c5219066a3287a1477ae5bc51840a3db75de68aa01a1290190df0baf8c788955a0961ffea8d2d070341f0389877647a36fa28faae80d83c8be6c8f2aef2bfe26be473c8d31c6d8b01713bfbd213d2d7e48529387b147507372c9d476faa6b3cce074538f17234faa54d0ae615bc380749057cf7412d0b9a26fa38fce3c50528a42fd23397ab7baa377ac2ef57835a72b8168cb506988a48b488fa14f12d94efb0458e76e17d5ed5aabb98ebb72de1d2f464a48b3b9e45f3b5ecdbcf29b9472c555bc18f9d34db2135dbb8fe6e63bed26cb3ccdf1101622ba4683f6926521cc564a962c79547948659ee63412e9424dfe7622cb30db0dab3d9a933cbd83ec1dae94ef1df885be7c0f5488d4ae699afc2635c93cdd73b240ca53314b260aed568dba5c73244be10bfce9a91ba5937da49b4ebac95a54e905d48a073adf5195d39ddddd7fc12fd899aef1b885f7d137dba83bb905a690c664e1514e50cd6e2f04f4bdef53c1ad6515a4a7a2c9a1a3b978687134571f8bbc783c2f79e1628bef9efea1675256b41ee311f598c2e3df9b3180900a5d809678928bfa5ca8fa5c2c6300518d044baf5773baf1367ac60734755d6e0f630c9cd081109aa00312865cf1303fb4e358cfd047eb6223ac2c184823016a2e7eda6e7116679901ed3806833477c53c9e8362e991e571e5f10dc49be12133186319909dbb629ec35d5c0c393732081b36cdb9c191e1dce4dce0e4bcded00e1e3d7cc058ac85030fa4a722b95001dabac1116d5e38336d657aa571336a7aa9647ae94941f9241aafa6fb0a8007daad6e94797ccfa09047130c7f3191656a02edbe83478fbf1ad336699d2618e845a2ee157f26d6b92b2cec00b730dff3a3dae1b8f32d486b8a95692ece54bf5b694f33699606bc4702353dced86d676d2bd956732f12c9da3417e7bbee28a3ec8e3d8a31b6460cf9157b7cb59261d18891638c71c793f1c4a52745d886627743f8c316fa18813e902184273537ecd59ca2298653af56308250d1ed1a7600193a5078d22c35ecd574c74d0505fae0cb0d103ade21c59ef9fc00cda8853bf025a2209049443adc81a70eee90b652c3204d3f512a71945310e8832fd0be5114c80e6cc8b6513abfd9596fe03b2a954c3442407d200dfd369f681a6a1b08be44fba2b827db4ab8315a6804088c20b4658d1d11dcd9e29cf3c194128c24506ef873e8d34035b40b2df479319148734168f7c0dc80c69be2e1ce8537f1a870e139be187852a90423088d979f6653dabb9aad119b5019615040fb51b68207d20b1f1f1f0839087d7cb81713fff27c5ecde94410608becd3a91f91c8e2904836258af7417ac9a64456c7157f29a8663988633036a0af39d21950b22406ecb06fdec9714771289934a2499415311a414141edd33dfd43ff20a7d641f315f46a4edd03e3a3bcb677dd53ba6946ba192d694e760f7c912fd5f6a9f29507d9300e0aea9eeee99977032892b8d2a767e20fcd499808dad456f2e9d96ad0d3ef1424fd18597a29e8b4bd036b0ec60634be6b580fd08bfc0d1c4fddf6f562e4678b15c45a11db8ce0840849c4600750805df99652f619887f18c90f4766feecce5848d69c3c4c11949f6019cb30bf7d8396a3f00ca6067493d4875e4ad2696a3ea774d1734c1fa520a9a620d79493ce6cba019272d25b4d7f43749a523ad91f249b9a760668714436554ae18c4ca72050f82277e08be427cdc96ebba4284232c93f2f3ba01dcf64fcb3e40931b8320acba03c9b0e20837a21ba1508296750cac7d8fdb8d3ae22f7d557c0463a909e2a6a419663453417cff5e045446df662e2ec2f269ee2551308ec761308ec6a8c3a456dd7e2f6de6c868a36beaef206be70d68857b37f31f131d2866932906729e5679685cef25c0f68c74297675086b83cfa768c9760217ab9ad0d1c85d88b91871184b65e8c3cc74697afc614c3e9b66521215052c7423575e3ad841a342183b9463675e3e3084ee9a3a7703eb23e8e744576d8353a0c253dae91fdf1120c253df2344a50b2872ff2c19791e52124d7a3bd816ff76255de678a816d6aab11efb4adbeb509d52c0b0605435a05b60d082169a209264e8000b6e120670c4cc304546ea2f868d3c98b442279d1697845511445d1166394716ed3c6b25aaf18638cf13146196514da64898e4855e38f469af6ae941bcbda691f8d46da471f7d1b89e8888ea83c9f24aa2fed2dc99bcd6bb3ace6e4a59452e6a0f2524a25985c4d762f269d3074e35988e63c1192c97ae5f3a3fee9999ef7a6b9a8d2b200d7acefb2b48c5c1c3f6300d1ed764fe8b6a8297e8ba7f0969a9aa1c553788aed8d164f2175a3254e84544c6880074f7e0842d334a83961016b094b1c217f70a0c3114d0845a1890a9a24217382c414b2084a5060fecc9f2431ee63f26489100e4964387012646588206442c8a85c8e528bc1603024ae272329bdff61a7a2e776df81d00e4108f590a40510f32789123260c2c4921844a552fdcd5cd5c4081fd309501c400209231c7181d6e6fba5e138846d5d40bbedb6621d9359e0f6d08d1a40c2481048f03c264f7230cd8e78e288274990c1c80165e205ab950cfe40891ac4981022c42a88257850c42c89c8872492b8c12f2c2183264d700282274a86624d782067aad5b66ddbe5b66ddb36259c724a4d4a09653225138928495c60fe285102190cb61da129a89831610326c09a8ce089105b0f4b14210651c205b21e7e264e9424b1446c453c7f83c160b098eb3dd6d7adfe34e63f2642513490262660c18418640920926cf0bdc984582c23f02c42164b888650cb064208211218605101bb1d4b090dcc9230917d40fef0d08c09e77cc79ae74f39e7d662d160c1b318da55e458dd8392034ab39830018b8ad8ed5843311e0d6a50831242f8048824b21f55cf44c9a518d9543d93a25d80b46d52a55fe4dfca092a8fe3cd1483ca8db119ad0d3e2084f1c41393491cbcd54af5e2bdf0df2673b9512c5cf96e008d72e1bd2043c511617b1c7739e8502c6889ace3717bbb36f840d19c783e8365a35ad188052d91bda89d60e399401841abf56ccba66948df268d7e912c0ad08e5f4905c428215c49183b2bb759575d8fb992e9d67e88908c4012638da0ecb17246739ba816592107b4e35ee41605480911340e24b9f23048d3cc18d0abe99ee11905c9cc88d00f57ca88402143ac23282142e340ccc4d39c7c14234241b1a1a16e75632b9918a4310931110932fd2033191142321b224a6cc8c4d3ad6e6c25c362b56ce4e478453cd98312e54501233723b651c18384f141f6df525e762026913ec0c09570a785a494524a29a594b203579a3860e2a9252027f80ce11808a6a6c94b29a594524a29676976022adf8d7856bc186671b983c0ed4780327dc1c93cf1334414a5d88788e27633aebc1c1342e87634b8654849e1993c909b08ee9b25c92f5e0d0c534e08e59c734e082543295b4ac92d802a08655acdb58d666d5efcf87ddbde7befd5b289c1d64bc208212be2e8991c3a6a8010c2586b067b43c16ed8ddb07340028629010220840d2184a9fe68f4eda9b63736bbc3c4da4da9194cdf9ed2ec0dd3b7d40dd245dab33e4c36a57da469da7d94ba9cdb0f561c9aed76dcfe83a4543fb5dd52370c06bf6d70d61af3eebc18789e1c48b3cd0b7f187b41505a22b23722f2060784c7c96900a35433150ad26c2e544000385018a55f94575b2e7ce0bdf75a372aaf06aa1c0974bb7c353407dfcb2636b2cf42660819f21f4386d0a6f58a36af1d72d378c7460b056325f9bc66f8ea1450160d665142b777181238e051951ed0a62a92f94514440e8014b45f1f4c0958042ff6f9ef32421bef7ddaf7de7befbdc74f0a12a908e93fa0fd68d38d8343478e19db1c3a74e098e9f87f1d3872cc72e0d08123878e9c570b088f8c6726640811de61d8ecc50c078ca783c10e6970ccfed967b3fecc00d70b50954ceb6513db80468497d2b4f73aedeff1ddc0f7ee05bd436ba3b97ecc0c6fbadbdebcdeeba6b7375f369e665bab7eaf1b9c0df59a851345c7d60d1b769010d253a55e8d0d2aa517035f71a028982213e033ecf22bbd219c679bb637350747162d4e4e9429a8b44d983439e910cd000000410093150000200c0a858202a160341c877b5e7b1480117a96426248944ac3a12447631c454280006200000000000080cc4c89885d01a288a83f0c36aabca9d738a6452a7926df2a073442e3c1abacb4c80569a3ec7aa5ab3fd71ea553cb7b6740039901d696ebaf867c2a6ebc79970fecfd5f444ffa7892f4871a23af129176600ecc977ebd212fe76478472333cd0e57d0610af97f55b3a8d3c2dc3772939170f3afdca116ae2c152d09f347dea7e53c444d5a29352f496a02e55fbe0be2bc59d6195e523b653b685b9ccc5caa24930d37bfac2323d7208cfd3cd904dcc919d0bb4d706ed50a980840117ea2af79e3f7a8331f1b41a3ecb468cc8a59c63dc01fd79db778474c1599abf624323c0128e02ddf936ee829efe6a623130461006df38d8ec19d961337fb1289cc3ed06e4fe2709610c56819c225f1c43c6c674016c72c92d55537a762d4f6af3b5316fce7d0389d0599d542927bcf64cd70e73fa7ead95f969e47ac9ece46c428f49e0e6d40781ef72761c7a3d0c7b22b62834793440d56b44abca6e91f18f98713c5f01f45202f85b43da167e2925b1e7d00bfb79fb73e62058eb715a96bbfeac77b7b6247c720a9f8e105776fc95c1f2034d240aa999bd3fd10d30347c0b9beb4f593af0b2000abe9e104b833f1af3257c22607776427a3fa7d86035909ffa40c9174aa80753c08f086821e6c337be3ec1c9087bfd36c74f71b640aec3d43d3b1dedeb8c7cb2f384693acbb57f82dbdf971b509edeb09497b70495a616e54068e6e757d887b6c88d3e69f3422bef93fcc4d3bba8ef3b7d00404386e8f4944e84ca406601c577c158e04f7f01057793a0af76cd4ec0c1c9ea09f58f173dd17adb91c1d5cd08598e58449572caa8094fc268d253885cb7fbb591ae192f0c4675dda433baffae171bad5818b3e382c8ed72c6d67bd0ef527a28587a692780fb73f859e463918ee255a1fe43c761cc5035e0e666198e4df531a8f4dd0643f21da2d3ea675695e5736c68214153d0316db1b9f7f63697182d03e9259e9c45ddd29510bef44be984aecf4cce5b776b34c33f1b14f39b417ee269adcaa1aff59daf8bec4fb6e54aaf59f4da8508beed5ce226fb04fca930439cc5c2a66ee4ec019f75246816dca6e966b4c997ffc26005d196d36651b10dd42acc3c09f90b72086bb3a1d59dee36f43a5a9abbbc2ba2ef95b861f41ad37dbf15af4dda792a4a6ebf5890ca16e19814bfe6c82da11a8bcfc1b22fb93dc88f8e54ae2ecde1796cc860854efff70b666285c5b0c1f95538bf48e1a7165eb64d3dcc7de19e16bb6c1ad0b7fa03adc6117d31e3f63d1e342cbc55def9e895e97f48d7aa565b8d650939e634675a0df12c53555fc8d9344813925c524d59ae2542c136b6ba8cab54da337afebffcaa3acd08793888ea9fb6a0757020dc62c20353b92b85da758c3058a96ac863f02945025791f776f36ea31e73be1dad041491b7d103e5832664512b0941b1b79dcc1b35a1d7a69b44187445a3a525c1b47d4fb6c9355b83be861345549e51f69987adc887a868a317e13e96f1884a937b4fb1713dd5c1d874c33d6a33c63791b58e761a823d1db4cc56476f13218022d182579e7dc0b2c2a75a91817c5254a82f575c74f863178af04e040de2b8c0fce7a2d0280354dc39455b05941ae9228bb60e3db1c7383bbd19cefb7d962d8b74c9d3457e9a11864b4c893638cd63259bc7d18714d895ec7edee3f873955597e498cd179fbfd844b0c7fefa044a1b71d39b23e4e4c3d820b34203c0a22fa065c0d759409f3ebc78e93bb5c1e56d62dcab6746ca5d4c43bec341ae9b1fe6e08015775e963f20cd867e2058e3a2570faee3ac5a29a3bf6abcfd7cfde3e0f83fb74d23f4119fd7785709f3a3a03acfeb539651f52ebc7a791d5b85c4b2543444db1e0412a8ae772ba0b2383ea5bacce377b9f607c45ef68533d138ea4c7977354f44edf83fe4885a2bf7e0a0a0d928f9c0f2216a65f72d307b9c519876985c71c3e930fda2d35e99644f68e1171c56a12a3da5e72287227c516b5300c457209516addda4e1df7951cc0b0da2a4099b610084b913398e32be2e613329a4e05423b0eeba8e6e72cdef37319e7642c19fa5fc8f6d923db89a7c7ce9077ce07ac9f482380c0de32f72df4ca64c0a877143e76d44cd4259bd9f866e1e1459e69c0c81b992a8e9ca6871f45b6e269526dcea8f309d94ae3d13be1e5c9ffa5ac0936fd126ffddf0a76e5ab62b8371e49e245f08af874113714c966520e7cad3a9b97339a58cbab47c080ca59a8c69945100bb28a2c4053ce1d22899ee2b4f0a806125bfe2419afa41b8176596efa489a0103ab0a167c85860ae4d15b4c7607042c38141fdbcacdea6cd05a96194372d28ac1f251d5a7213c39929ea6d62f3c968f23a281601d89d12e456461eeb707f14a5afa51bef6bf2dbc15d3046f7e2ddf83c8f1a16ae443cadc6a797dbff72c870fb0a90b9e621da4235e6703e91c1d70e67598d3cf2e738e758497468079dd3189ee4aeb845db4e3d9604de3fd6ea503e8c9be96c88029d61135596015e0b9732f4029401364caa7c4661babce2ee88a31178470249a35d9ea06ff4b5aa481f44042f9e7f081290b88a0aa8a8ccc9e9aec39a8f508e461a4ef49d77bc38a6e044e26530e32843578c6d7a0e19307dfc81e521d10617df72e9e186cb79459d587170520c522568407f88343650afaada0e39cfeaf68928b91fea9d5038581c61641f5729d458361c0f54ea408f6db20e1477509a23922d63dd222226a8bbe9aacd278bfa5cc1c8d32e0c455751f5adcadb4be20ccc48072d54a6b63cd7935ffb258e847ddf502c840256272abcfe49929a562c4c39829aa8fdc90df163ce7bb2f4c49fc1114cf6a37d42c6925f0a8d6d7aee78ba9af9b05eec95621682e88fb4327bd40f1a9d7ca69ad8afa6b3b03d00d63f957f2412e2e39090473de701fcc6158edc683172a2bd7f10d9e81159d62b3550f6accc32e1f586a17ca8a87d6b75f8fd8b7ae23d5e35dddabf99802eed5dac876c388beb2ca8f0daa8d81aa192b7215ee59b5b2af5a68a8aad054f19ee5dac515f1e54e0504847725b70853ed2b3ff908b90748b91b5321e0ed4df97b26e62c7c9504590aa71c7301ffbaa1e32cf9363a4edf1e7ea0e8fc2131dd579c21237b4b69119459b7474c3af1863ed7937e3966fa986fabe19b5aeb7bbd87148763de70f9d64f6811d3e8e0ce0e05c5e62af198b889864c76972403f2e77d698cbfbdb0d35c1e4ebb1ccbf3c6f5c20c5eb1767daa1d7c081ec10d102661e4676fb8e378c05709c6158da63889c77b1e47af445655307f6fef165007cf388616d7816d59947c5c3fd8ad888c91e7f72e3dccafd06a1d5f3e6bccd98893142191b7ab3644756b9c2378a853e5a47736c8a21ec5e0e201af14290623f1a1ecd4f3e7302a3541b8fc896b0ebe713d04d03a85152d824f2a479d96fce279b7a386fd2d1ce1896e116240e3f1663602d1cfb0a0ade69a593998c8274c4ed4b3c4af5783b1d2da9fa958a5a0c8ccbb924e83dc861396027e4cc3bc6f741c0839e153203e9a11593357e0655d962a123d3693129127445099e0bdb2663073336708f9e57bf527d79659938f212184b6987819c3ddcb3d00be3e4845a2512e55088e10945ca03fcafc607d8742d0d893ff32a10ec9efbc9e0cb5915d7a50a6ed08fbf32625c800ff87bf92d385e0a9617eb0a0cde429c49fcd2e3b02358bdf74d711d8b9215bf4fc3a82e99329e6b085ca47633b52ee086447f480af4b370592fe27308f453fba42a569f3899805166ba898d3892938ffdccb2a5dcf38ab80d6a1b00d7849a671042729812f6380403f7626a2e24a09ee2800d09c3e56603ebb0fcd2cf129f0355e1043b209a652df88865a5e1e46e2f8611cdd60694cf6714009f758291f33bb5b32a3116fcde2fae46a7767b6f0d9200b2e8567d2f8fc57ed0dff36194fdbae1744dd8d7f2e5e2a81950fd99546109caec420e4c49d2f79f7f5ada965ed3b1843d5b5086150855a0a2b26931d21a66cd3845f90ccee0391a41e507ac44065b2eaeb495c9dde79c3ab55b575f174d370a1f005c1b9ba13022427d21add438d15f0d3309d8e5fa32b22dc1f57df860602fd25d5390dda830b09e6620f8081081e5a93aa229d080642a36e663e96971570c0498c88a7a07cd070ce43baaab48cb65d6f625b883ec2df39abf828c8c947c32b7274c6cef04e53b2419bea843f56d04167f68c9284cf308855d7953f87fd3aaa8ef2f2e46427333e070515101eb0ac5c71c2a8d242adddfe96de255a9e7de2b0f533bec8e641c530e502414c02e52202add7fb04db8446f743d3a1daafa9d8e30768a300cb1962577d912720050e08dd3489ff0cbc3e415d741b188d0dfb6febad095c46821e4dec2d05653f85fc9193e26b9dff1e4f17f90ce1a1bc98739bbb847dad131ee7e0a2b8410d31b5236dd49768eb1a434b3f1680afa4c1546c2e6a0a807a322b2cb39a0a7a118810cd493f03aa24cc372d4c58178d8efdcec3d8a177ea33eeb5b2be109fb796a3cf310239d32830661212a8a271b6163ee6007a594c23a288a383e3bd376e6cdf1b17a591473d083d32d1680b4a349a2acf7425e59d6636bb31316896314a92b96d76bb0efb6126a02939d4bf45d789c83f75aaad519ede398355a2ae7d138d2a900dbf93612c550688a1ad02b0d065bffa65f8c0d582eeda80f42b9dd7036d159b7ce47bbfa23854019bf34d7f1ce7251b3512b0d79f4093ecc41b58e4270757e4b3b86ee164fe593bb9dd80da9900e9dc855899c046e3de1b6915be5850bd35f26ea7d0a83e90d71227faf3bc50e2570f5d96c9fa432e41e52bd95323c5d91d2d5067e885210be6c85bd8ba0084b1fb5e550a72805661ebc3b4c691f652c25cf55c62049708f892aa539565026285e108e37142a8b6beb53a199f1b8b89e7a66c5214c7e8faa5ce12d514d0d0684c7def4d79e42b4a6d45024f0170099427d2847268e602ddc7385d270c81faca903bb497d8eae101947d60dfd7970b62f3b2012bce1321de810fdb3fe92dff4e4ee29883e8fd6f193b4d6296f6cded598b92457ea94f32a7ef1cd92dc1f18900e8b3e33f68a7b23a1e31080c70760716ac97a2eb6464236b5e283dd9354fb9b7a6f715176f2e4636548f38d1c76d1057b81006251a932bc9fb5a39f01ccf8e233903bfd38b14f9e6faf61c144bd3becf7c9fa6d68d0f43e6f4546bbe9021a46f1d9775f9a66187d37b9fc2e98c9cbee187db2d41341fd11f9275dc037790090f4c643d99ea8dbabc0c92dbaf97667b5e16f8eaa81539b2ff43095644baa520637f51114f9ab42fc7c7a36e9cdcdcf6aff7e8d7cde54eb53cdc7f8aa830e62200c9eaca301a8b44699c228ad114592333458092460c13086568b7ecd2bd016882e9383c2af0280e3e1f12dbce2ad70e835b2bbe2bea830487ef430c977ca078e3bc52646706489d775b02bd4b5994c8d1edce4091e39cc4116bd5a57787cf6cc03d5a736ebe634bf3663d948fbad13a2d540d3bc245295b2b848066239df94c7b4caa63076bf8ed621c5c548826d81d9f6c3732a00c2287749d00bf5a6a5c7c60a676eda8efb3a009b8a12645721c71555ef00786276bc0cfda14cc8742d262e8a2d538f6bdf1aa0e1179dc2ff2855357205fd4815193ee1bac98ffaaec181726d5c09881fbca2fc918ac995936c4aca0a7b8a1b6e34b7ab3780265faaad2df88ecc47d17a6f228e2ff3dd4648306f949b5a6840a131f111bf2f02c5cf6ee7375e9b341ba50909914948b996ec39d99114e34eb51ef476e6c7814c30932e175c2042c10285f824ccedcd3899b604d67f1cc7a142ddef082b2677e63355af19c139abb85dc68b5c12bbc7e327064442d2806aeac32cb137fcf5f0d6d301c56bd3a82f95c1893ecd3c1339c2378b8e3bac03a88f463a147bde21524ea3bf111d82df5f815f349682c51040d46c483783a83d29420a84ead44b05ee4a166cfba36b12704b78a79dd7e8d4c00c830c86061d74e1987415e2eb24e3da66d44bcd7a9abbb923d87181ef732b82004f6397d9ac1ba6a06d9350348d11b032aecc7d39b47fe499506ba37061a2eda9a8089597783024c6a90737d16835ac73e262902695f0fb09ba13d4bfe3bf489ca492f603ff32cffe4c71c4b71d60105f78ba23ba299c36e4d52df8269a548c1eca94bf54386c6b7b2337df45d7f4109ee80302119237053653485021675d2d483f130d4655d10c249bf271cfa2bdb0f971038bec95d9c201235ba44377082e5862090e329d3e27eaf585916b4be8fac23c6ff63c21224ada8cdfdd22f8c05cb983ef1e234565c2a4eb7da5a029f32cc82cc704ae987c3d86132a8ce98463bea3810e03c709705189be36ca038de66adad24aefedf964cd7544cf3ab346f9bd881de68d507fcdefd270788cce2bc1349f6389d66e9cd70524db14fb86324b3de40162f795d3da35936e844ea670950ec1cfa1b58dc8e9fa935742d8e0c27fc92aceb5fdfe6831037f09ac367a6511a4b5455014ac3acc960e33f67b7f669bf168aa0d98e01e75e0e9a174d4b41a41d952f7390f9ab93c1d2c115c08f4f439ca3e30ec167abeaec18551b97539332535a9aeda5710ec8dc42bbf4a73f8cb12a90814b122d39f0497b106eb802e5c23aaf179cc53de2d6de682f7250286d41126ec7c098cfedc7e227ebf822ee061f22fac44f19c9107db0e90bea52ee62e66d3a9e681bf20cca2747e95f5f80262c10a9a367685d3a0cd42ae3ea267314a5ee276e74a87f14fc5eec8b03347a073ffc4c9b4db49e4a74392893fc3cb46028e263fd817860e035a33f30d0d9a6d771285c5346f38601f457a756e25682dee0b45971cf0274dde01a43b634807e1e84cb5c6a06f7aefaa2955f5071fb1d045ef1a2576353e8df561f55bf22e344125c0afefc6592d03caf626955551f598250ede74ae0ca8d9f4113c3f1c9486bba8f58c1449d9d1075626cc9afb4e637b6bc1f6402aaf1f322a6b88ce08eb033691e7e0ec5b7e0708d88e8a67b27210bfd48b7c1222340cbfdb639f362deca0c4f41811324f3f482119016bfaf454b1b57208ad81686dd136dd69b5bb85c583176290ecde3b0cd09674bfcc21498bb22c179693b8907e9527c85c79c604419b34ff52ccca51ef8e5145d4a6bcbeaf83e4e227d9ed23e00f07d870e0ac740ad3c40cc35474fb5a1663af1689fc45b2ec22dab8211ff7ce66b28466c0a6fb2c6a3a7850d60f5015cfeae7518484438b313457d6741606e37f7cd4f2ff91e909f847a768ae18e68ca513cdb2dc664ee892df0b30c13b13d8ab4c5a1bfbdcf62ea43b2101ba1c8d0241d44b1156f438979ec4f509e6bb943e96b178e684bb61c12da4e7a43a0b39113ee7c4e34cdfdae766a2433f932c978d2c35d47c6208701f00037d80e017b57b6e33a98e866480bf531fc92dd82f914920af0dd96c2c233c502fb6981ee27d07431cf106325de81f48a925c4c7d39cf95f50bc74d770db35866c7b79a943266b4a6cdd345527e8270b648be17de6e60641a635661811aa641cc21900fd2cb5c04b693c51df3b9b2be758a6eb0bd2a07d5df8efce70959653a604cb2f9d6d0e467a73e7341aa20633685c202e841f6bb3f7bb7f1b9326c62fecdfd7745dd955721ba2fb48c13e85e6cb7d46d09ed9f7c278d7163f381d41477c4576cfd86a117610384e9cac79b1e6b0aea972c549ebc612642002016c700b1f610b8c9ced1d89f34820dda58a3852572caa2907dc96c90af7e353db508754c1db1725481a29a1e496b4bfef3b22b23cc108717c07cceb2c21ba0a41cc0ab1586b89789676d49cabe2b7100a3d738dce6e40cc31c2a9665f17e69676f4f82f6f65778111132521a9209e68b5310ef0ea05bf98379469d81705bf327456b504f54247f6991e8a384ac11066b61f62d4ae77ce6a2b310101a71349fb8e5ab442f04e4bb632fd39fa0684ebf61a475229d5c5080711bd91687440474108be39ce9a78ec50945dcc883d67e523e12f06bb44edc222f9790906e91a9db0d929ad40d101688a497973b45c98c8f5b2cb18b6cac6c06768d147dd9241ac46a5fdb759dbe134a0ab06eedd0f62ec093b0b8ee21f72f9291065f7a9104e008294c98b97d655d0550dab347041da13ea97890f3db9458e5647925cf488f0832daa5bddffb75c35771f174131df5528388e488f87206dd9309e0980627582e947abed8dd22093cda2d01a3e8d4c41dbd271097cecc79692f7886ab53511a85066d07378f0e97e0c011012fcf5614ba9c4f12f1c8d4f39594ecab59d5d9f5aa87062ac24444deed4000b0fd0188b9a93dedb5ed6d0ce9d74ebdde13af8140836092a08e3aa34cb69a46e8078c6b850650627611044747da20f0a8055438c7307d19114ddeaf1e2af29e28120f66cd50cc7f6899e23bb11311915d4210cd03d5f14a2a6cf5bbb3798cd9fba4a5d6d9208fd0767e255c5e1daf7df71f85cc8af04e15e2ef694c1c3c387ce5084f98ced71a769699de2534844606c1c7025c8dc1b762f0b72bff25f13089f1b611c0290e39e503cc906801bf981bb06970902145e745ac6f6e5290db1f3bb7d5fac6a84b02f593086dceba5bcaead6da902c030bdc9255079f3406e53cf6c2c7ae183dc28978d7ee75af71fbdc2b3c8a7fa3daafca02492a5507948c80faa15659e5882bad2bb2113352afbea574d520e5495733a40fea05b70791a26a39fcc6fe380775f2029411209a06d8539528edb024d8686755e0deb02973f700986e625cff752ae3df0b4704273b062ce21a609c857cabf4360b0921d921b964dc1b89465b652d8d3118d4e632476931f096db46627aa6fe54047168357630c19f1ef186a4f347999c607cdb35091d884440998fad1bc63e8c1ee0f402d981fb0a03167ffd7037c501d5caea1f8cbf0a79eb3eb1c75156a5da3694443760f6e06efced69ae90382578e6da6019af3534e680ef284d00626b0a956e72087b4f721bbe95aa3ba5889a3d42da6b9e4f27b50c43c873cecab6b82f96dde4672b3c33c2bfa7344879eb537463042371b1ffd972cf67e0fffadaf9ac3c7eea212f69aa98e335e21e7f0ebe056c1d257e29d6a392c51720cb32e29a50f4df392e3d809f4bfb86da09bad738884b73958782cba3b58b0e6f7a3f5be1cd2e74592b80bd635b8b19ffca331c60911f37e990fc271f47859583b8c7fa70b900cfa0a5823c24be84603935a6e034b249aae66d0de690756656cfa870807e90dcf4d899bc9f2d8cafe2ea0ba943639a21c87fa30bff5d7d34392588b0ccfb1977763d0c8181ba18b9132912371d39c3b3a4446b158ca8e7b6696981c09140c76846f7afecdd404402fea9d9b91a73c99d2d974f7af5fccf0bc7464fc938e758fa7f2dbc54813dfff6fc3a8ea2942be6fb2c16c39336363b6473f762657ae1ef495d0cfa16fda3b09ce8443dbfe114a7c65513d6105a2558b31772f21e3ac129f7fee831a7ff93731459b27a5108e08c5f9e9aeefc9e7ce17c88118c09a47edc4f54e459b7fb5585d36ff484e3b6c7ab53e626b87bd9d5114a140c08d3f09d32d5c490de8152f5c5f86b3f8c5601712df41ce232163940bb610795f17a87c72151eb08f5c07b9a71a620a046768b79b7db5e73bfcd7c47a1e01f1b326d8cebba7e94b814cf37ccf454809a768485e0e3b333d0da6e03fe1bcb59fb5fd7d106267d55426f86fe542fdd4112bd79237c0eb7f7b3623533c30b5d062dc60840d6f193e2f46489fc45f231238785417b1721cd0abcf9a1cafd1d7013ad5a0362e40eb0671d01aaa1e8cb53a6f538ab89731ffcf97d03883ceed9fca16edfe2ae2d256430ced7c9fa730c967620b2c59c3ebd0475e69a2c48d471bc7e1ac7b5c8350493017d8a30dd6283c7c499f371ab8dfce55c7afb49be1979cf1b8efd52ce231888c8c5df3cc3e9faf8b897ca2f6ce53b05f6f61423ffad826fced124a340fc83912fa06d263469455fcee4fb06482df194743655b2fe43f937b0801f71e5ec6d8f86ff3c05cd2ba97a2bb7cee3b77575cda2eeb1fe9e1eba644dc308682a984dc72f95adf5e01b93abdc4e8839dcb8516624a9cba5b6d1080f04cd31d94ca9633d999b25ef85f1bba66436de41a45f59ffaed7d966a9d3b8ddc0a9026e6005efce7ed0533960abfba1f7654ace2dbfb1d23ec3271447d76c01d9867e11092b718775fd581629c97009b8a50799753cbf5c6606f9fe9de1fb43d33980ebf517a5a754cc39ccbccbd45c3d9ebb3bd38713fe9530fb8cf9891cd18ffdf565469b81ae9924bd02883c318b11070a96a0abb351483674e619ebf1a82cdff6f2b3795cd0a0de80e19cefafd7d7a2b7740c5ed2a3cc1c9f058db1c5e9889fb84cc40cdfbd8afb1f1518a9507c185cd2a2955c80641f1f8d815ebf382c5377e2b38111804ace428093c3a9cf32282f570b7916f9fd1c56c260e67dabfcbfe39d3c1b4d83ae4ca770d949303e2d22dab76fb0d723dcc4bf633b5d2fbedd3aa58e3b7e15da1bc3109a2df29d3b26a0a04ba16c96eaf2e5b7b7ee382c444b0f75b6eb8a3b963d06986d99f98a012f2f0cf78921ad61418b245af64b401ae26e2df4d868c9a7fb987578b8b355fe21d24bd21bd95e157615f294c99ea5a401e02979d3f604f0c9068aea33c89e86f8cd3736812d9fbe8a8ddd609199239999fc58aac2cc0012cc1692e4e6b4bb1f9926901284a381bc2e247d74670d76b9b410a61240e72008acbfdc7463a677e33c2704d1425092cc0a379f647a93cad8ee7e101b9a639f26b4967a04b352715e37abde3141afa21cfd6051301d86be5bebe22c6c1ca5662249735b4b801d9bc65856cc3ebb777ea716fc7c9a7b1a780dbcc751805e3cb638784558ac3c4655313bad71e8ca472d2c61d003f7f113e666f69c06300bcf78f544353d2c13e528b44e4649ab152643a185c8252096f92933e0d45a4eedf9f2b6345c12c1e2c525bbfacd85c63c1301e645a541d7a91c12662a287def63ad345e9c2ff378af8d164eec09fc8ca32349a5551f553111314f1932a547b5ac889ae3a671f72a3d0580c0f18c4562abb5d4ee2b90e0d2155d3b03399b453f71de33075f4c523d4aa907dea43204c573cc16186304d7c86c627830424647468c188b437f0086910f734baadf6ff3335ed89f941630d789c07bcc3e360e1222a27018368e8f96048d5f2299239e97977d7a3fc0932644849829fa63425ca6ab0d3f62ffc483f91737dfd358e98116f480d2bc7866a3903472e7d2fb50d490c51106a04a3ec262d7e3a708b184c95300fba72549ac56d222911d8b8e254b82dd6754e1e98f35abfd3e207c5783d19fb46109832e7d558a1b3330298eefb548716805fd478c68e865d259aeba546bc9a01397ae444b745cd6033e2214cbb6e4c802abf0957862bd0240cb94d0a6e4bebeb1b2d56908513887095e74df8ba30209fa88333a3984d00c0080be8e55e945bca45b822d30a0c4e130646ed0535ee4ea4abbfe4156f89394932b8e0cf12180b8dae500878178c0d5574d7f775e5b9b0f2ef86ad0b3e1b0721bba3dc9cf645cd67874f28bb13db883795988ccacec4409241770c4ed6e3d80d8c777aca29afb046bb7a2d3f13ea1c6ccc6fd7c09f9f7d24c36e4e1825ae102ad1742bd27983ada2c913022690bfbe510c2370fd1febe8726ecdd30fc69abaff5c627456d62e434e4afb4413c4bd1f27974db5bca2ab0039eeccc210bc1b4298947713dbbb3259f300b183a4c3cb62ff47a721669f0a27d0e69d387b084713fe80d629b5683a2390e470c27c748c7a31d068393e3eb1bf3ff1bbb71b23ae7c3137ab9e02ff77bf9fc5b5046911ea98efb7198dc349fa3db3280e715ba5b43f36f1f3f44f2902a13fe3a9a77783813020174674f741a6ba2cd4141f35d754228922dafcf4b7d76a10b54048e3f307305a696ab5e2184e1b530c18740aa6907abd55cd8cf11cca66894a15178c0fad8ccf61807896f5e90cc7b05cd0d063fa4f3aac6f14c1399a325fe988cfc59f28c223a8d9b5264b0a557cfeb685530a5338b1ff62d9fbfabda97c7818bf5dc8bef1d27053435bb291ea7e5ed049f15d30eb408afab35735fcc7e93926190c77712aef9c4b194374c58dbfc630afaba0d88d858239e2d92e4873159cfa4f636bfca74199fb6ca761c3f66993f24e78664cc78ca71dab5c5fd27c951cd1f9e39ae5c83d6e3f1994ac4109ee9eaf546e7c03b4d64e96b8c20febd5f916dedfc06ffa656a733588d0b5e5f6ffa2bafc569285445220fdfde37295eac81ed0aa55d3ca3929766056005b24de6544a198df5896d15a9a3eefaf52b27dd05b581993fbb11b2404fe1f8335f3f0234414e113e6ce61f474db179775040bda69bace1db587b9745d2a54677a6d5ca63d0ef9a1fcc82924761e5b98b342bc609ee3b236f5df4b074a986642ae54676f775f4f8e642265d5682519ea0628cb9b5cf640a98ff2405d05d48d090b1415e1cfc2e97326b9f8260244dbf1ca6be8b29bc1711cbe516cda7500cccf34bebdce1c1d6d7b912aa7197658af6cb2881fbec1677b49d236b7c495b5b009cb327684d9aab13e5e217830661c1a63a3f2b43f005d00af8f918d2ad5638048f9389982c892b047241ceb4565ec75bf91f5bfc7d2ca74637cb0bbc135eaa994891eb6097370550bc250b7e31cc7c4fcb4aa82bda256e98297c8b76a4a205c09b74cec6ec48be9804851d2c94a9f01ed984a3a47862b4df1870212e1b35059bce22d5583a604ff398914875256a4b688ba42e1737f6c8a966454c3281d82be3bbb9e7696d90269d3eb176e7099fc48f29c26cfd7eb8db1eebef8ac25e1aa341a83fd740a42f794ce6a22bb68c47b77c11bc4d6deffbd47eca7397f5cce79c1f7c2f81bb53a6598a62ce4f39370f3e2b92816eb86483460ca65dc7f8209ddf86905eb876dc613750413aca38d97443d74940f6226aae366e935d9180fea521423c0afc32d66715cd5a06bb708f70d1d85bf791a96d8ef56a588c1a3d9efa7a8f898a407158795f062a4be71ee2265aaaa041aaadc56ac71737c1a8adf38e7b25bca09575694249394da1836e45bd0bac64b8141c175de9b525b1922bcdd1ac747b6b0a8766274049565ad201d1a9be07111e41688cf73c1584f74ee621d6f9b548c4aab76727af241031b5a49674320fa2b9c0e629d82bb7d71f7bfe68c54b3e1feb61f9b89965e49a070a108244580ea13207450080a7c71e85605e11ee4521cdbd80b73550f2aa06422fe84d58aa687b5cfae8b8fdfca9237e0a69219ba8a18d5c129e3a5b8caa64e949947dff40c4657d64f4107a3312c5352bdc204c301fa442347e059f39d8da31d8eef3c42856f3183a4d999283e408c422db9c912677e68763b91ad4ca0543f732cd79642a4b5a487a0c173ff7835aad2c92d6bfeee6f0da6ee46cd537bd7174c4339716f301110a4c999334a56e489df8e2ff914112a56a1e60b69184d0b4f9b76403aa71ff7f778ab7ae53e9d09f2ecb431675df372ca5d9ae58ce8901ebf4bb74daa81b2772802c8bb40aa8a6725048dd6029e706018d36fa7832bb1bb83fb9c128f802c1625f23a555fbe9813bfcaf841edc92ff318998fec2f10b5843412e6074dd499bda6cc396cb1ee180493e10cdf67c205908d4b17795140ca3b2b908bae1fe8357ab0fa27187338e3d482a1a62c1c7c7a242a077270d17cec50807f7b5bb2be80a82a521881e3652006671a37a6b596bf718e2f9a634857536d92a218d2e31eeb96b9a33ba4a2011567f66536d610f37c44ab12ab8cae0cc30d11bf6ace12ba207f1c8554a767d7a470df195de2ad3636bba2adbb635fa8c7c58ccaaf78ab4fd17301da87affcffe80d0acc687534b2dec9f892db370a5a3b2673c5909d69a1c88ff6c12bf1a2dd1ec5d3d6bc7071271e3a89130a0b19e17e3aacc499c32d504abfea0eb00c9566d9a2217a0bc854fbe03399de87d01779969fd0ff4793657cc2f239076c8c87783d0c797387dded6d728ffb4930a6a0281c55833dfef3a37411aee80468e7869fc06852e3ebf978b6d933d7a0f33306e2b37ab7190de6074ee88eb85bd0226560beaf96399e040440de8d1bf5667df01e5b52037524d340a10a489b3d879b5924e80650f9637d31062ebf1d2d282581295f64a23115ded90cabdcb8d16488ec7cdb8bf8923701565cad18da95c6478180788543244c440c2b89a484c6e90278de75953ee494fb5f4eedeb5304ec86aea1aeb746aa57e979a968c00326209283f23c385d5b6d545867486e7020a653f553383371525afa195ae43ffa795dbaeefa98956f0be8e20a7d33dadd5f407dd70f1cdd5485ee6d2f5b49479b2a757462a6f41285213f41f74b4a597413ea84eab86d7652b2177b3515cdbbc4083ba7c4fd3c94fb5a5014116263b592dca3ca7f3272099f416858cef73c9a756c047a98e79ed1d76f98f6e60131b027685def3be6262f33a25556097fd4eb6f17246722b3fc8c169b09ae8b783fbf6327caa73191268d04e8d383e17427d5f04f68e5119136729e1aac2902c788a10d2f6de3e4f95b6f0aea5aaa5041856aeec53256613fb9adbedfc1a1b0236bb66974e5155d7c1046be4c3e7d8c6268e186291b15e3038fd6da0989f8f78d47efbcc9d387669b98c3c77c111b03c8105544314c08fa7acf9c3cfa1ecf57f5314ef39c379a122b0cd220a0894a347f32418d2d22ae093f8c1be03286002045a5e41e51d2d92cc21c0bc199c277f618151b9da0b6e818c2ba28248cf313cbb988fb2c59a53c7ca2646873561b8d4d876f5108f0aa9e9eb48df288b3470189d246986572be4ff4c1ce00f35885d39765ae6ea7d3e60fcf7a1c3879064f6ea7bca5478711624886c10e47d3948b466401b730015e13a27e2e1ce73bf110987d61112543034cd9d8ece31f796574971824d642e80e95f47dd7f832269229be42a8b9a349e1d280507372f4f426427306bb600af20815d383ae094118efd52b112ec471423a8afc84d843d7ac391312c445ea423f6cf5692b051c7996f3f5f501bae14dd1b6e5909493c73f068664ab298e0126e501091d437b22b3d8f31360fed5b3741d11f988f8191270e229ed5a89b45b63e167129f5933dfc5578f782ee27b0e37239f9881e052a9e21c6bd90ffd99e2100c3912903ec6053a7255f9df28270fed81934a349d1c7b6ab512ee3eb58f89aa4b34e487b97a1f6770ac2772dcdabc7828009f434b2a4aecac21305a832cb471b81fd87c8f019740dfaf37061ef9001ecafcaa6abf0001612b77fff5d54bda079d71164e05f11a40a97ad971d708ef64bbfeaea5023e046c282bf9ad5538c6cc91d12061a93d590ba6aba6c828dded09b3933a21f89d26f8046fb82ae37d3ace04ece50c34b2073bbe9500fd9996d9cff26083efbf4e0a54bb3f893b20ddea7b47268b62b054c7c6fb36866744030d0228fe3bf767836f8d7c391de5108807ac16218e3170086c671eb150963d5d3cebddba41f9c36b436ae6b620f228e16c6160c10266250f29153ecd4a10f14740857062a261f525b9273180f80d431ac2672f8a72ddd401f1c92516afd4f923bf8553230959d16412578b040a5cd52cfb187ec097230dd8c6bd162f3fc97a611d4c6779f0d5ba63d6ccdfc2b4d863a11b56811d2acf888e9a26983958b5c671c345a813e6a0699797dc0d1426d962c302b9b2662d4d18e7ad434a82180d6581cd30291209f29bd97b8e18c7792fb150233c1a385ef1bca14949923fd1d4a410bf7be851b33199e337403e0cd7dc43fa6c5fc9940049844c1b27e39a9e74a1f2f9b5ab8f1f357666fd197fd3cb087c55767e732e2a3faa4eca135856670ce7d2a0b6330c7e5cdbd0a69d82454f530529aae8d26eef322f7a0498c1bb96562b3732577f82c2164f07bba6c7d368d28626ba53e0edc5e991748b1efb99fc6057a861c8359519a12ab9ba0f85eac437d95ee4a83e7da8b4f5960db0e634d380bc7baf4cb6608c240e262450e40042b427a9944d049f2707ae392811cc00bac1e76a96071a9f6a681da60c941a63055c210002e9d3b998513d8daa3e0fa95550164135c7a8ea8145790cd0026b8d6affbb03766bf4e061998932e3ab632044976d1862329c6365eac33fb9dc8cbf9b471366a76436b1d4fad514b2b5f35e4092eaffc825354a90765c9f5ed6380f9627052c48cdb54e76e5190c17e6ea7dcbbb79aaa496d51f8f479bcfec9dc5a5d89b2098ee2e995004151aa45ced007ff5854ed73f5ad46543111c7c1a2c051e722df30aab27107a4100040431c2d68cd9afe60d86780663f219bd54e3084e39a9608289a05b9152b58faa4213323c334ae5772d777d0a90f627e42aa377af4a066284ccbcd70d82a5a89e940b044405f3de207bd2db056d68df3df841e98812b864f3e7c443317b3b4dddc9d7260c018f37e5890aae32e780227e95af55e3610ef37d53863da4e348d811a9108063b54ecd6988026223bb9e772aa53224e5c8046297a52c0d83ca3a02906360561c82573f579c015e433058d1be3cfe272ab3bc4edee09eb6e7ae42c9b9c9b979384bd5cabd95f6a814820e3924ab51a146a202fb50430cfdf354ad2859e34154ea8792771da62cc8413c33893ca5e0f3dfabaa900c59ce84ae148a4aca18206d33c316b48120936dc84e7826fbd54059d75e7775452628c1fafe2bc022fafb31e2294938e7ad77411667c29d5137a15b5ea6ae158977560414ddb096880973ad39996b65207c3ca589953b76f5b2303de1231bd4e67c51d7369f7c9a362aeb232167950308a6f2b6e16e2383b0b57d48281b787e6c3b10068b9a08b01900773ef9b9a42de2987081a28a45102b2a794cb24296a7ad87c24e9d22762b63b4349b3470f3fd78eb85434eb0366a6781230b76935fa5b7140e5e97e49935e5f12fda2a442193eb5979623abc3a29bd41a29ea81a16ba0fd7f5d7e944bde5766df5e28ee49a1e160101a7a8a44fbf3f86b3a52626cca8af53254f746471e4ec88ead99ac3e95bd52a38f8909c251d86baebb35bc355cefb2e1ce646dda81a0eef7350063a2ae95f523b09ae4d63eaebd37b61364b24e0e537a00cbcd78392c30ac34ea98e62cf2bcc9199e548a10085fa1a52f3a077f263ab50e462288b629b1df00212cd3518c263c57f42e836498e5f5f762c547915b8932d9c13e89e20a06b71de73b7242b828dd6022b26b4a4167808289b3922bfb5cdf735e62a35f13976102af65d8e5bcccfa451c43581785aa5b1296415112868ba078c5d440691b480853dce5b78de947c56ffb67071f4cc9c498f9151624d58b1837735502ca267530c2bcf46e69ed4468598387a8cd3b1702135d10e1a66de9bb024c7b1c573acdacf33c84c1032fcdcdeaa8caa5f7a620f079cac02b6d88aa9e30cfa9ed23bede05065f08035853cb5df485614c1850a7524026b37b8803b5e6b14240bb75604c06785db135ebe7c1eef5041d3d0cb86e5ad2425a9fb25ea2dda1b450830a1df9a064651c7d44be3929f72fcf241256192090a5e7ba88964ef0c85757f1e873ff810e46546ad962d85292d283e8e4236ce982c547fdbcbf6c04ffa65042e51914c595f3edb19d31e4be5c980cffc61828eb9773a73d7f0363cd822c3197a0fb989e057c0d04eaa1ce8359301856a503398aa0449502d81d8c11bb8749ba20ffa05aec8342ecb5596bba7afd477bb3294410d81fc6a7ba8e6b7d06340cd1078568a048ceb12ec5e0428560216c6c185b8d823ce8f2d03bde2e3f2164932da59432a594020a08ff07ec0775eb9fcb9d6b8627494507510fb1201dca116a39828d25818bdc93274ffa35110f51d97edd361879cc4f964cd71debc64faacf5dc9a579b237278ca6baafbfff908f5197ba8184c33a4da45bc469fc67917b42cfc36ca029d2579fad4d19e15b7611eebf8f3487d6b6f73a2f03d25abf7f14486bfd39b4d64466f0e8e4e0bb638952fb47ea622f9f246525a9135f2fd10e26a5d77c55ea9c1b3d43674fa6a38fb2c183b9bfa15c30319df82c4ff66686ea4f97cca8b337a5df2f6230b1aca5ec54df573ba8d8968aeabfb1907696542a5929bdff909d22bca605941e83a5f8820c663f77c5d6542a911eeb52cc0f66bf9f25fcd661e9217cd29b1e50a245b06ca7b592ac18895e1487d55aa43070b6a6c51526ff24b16c42909361be7254c6d11197d136ccccd97e511d6c1f1fcd676f4e3629eef7a1ebe577566a9ff639623ef2e123f619729f1a3b8d4dd77346aa6bda21bd7fdaa735afd183b9adc10abb664ae6a38fd27c181302a74cd79fb337a7952461396d43a43bf081adf1154fd330922e7212433e9623e377164448d3f863a730b097d8cbc7017b893d0ef207f6248cce187f9a1a2085b9ed955ae405119281b59961357fc74fbe08c758ce103f9baecfa1527a7f66027b7f0682bdfae9dd07a82be614320ac982f91bc3003e8eb6f16bd5c2c7fc956dce0dbbe2253e433e43ec63e4e563de08ccb7f03e2d3ccc1b89f99737d2c2c33cff8f978ff91f30dfc2af29c5f486978f791c5e3e86c7c90fa781f91668c4d079d1ed48952d2eeff29807208ad9d8fc2bd3817f3ec6d8bb66d6c2c3f497e92f975fd345533e58fe7a1e2c7fb95cd7e5d24237863393cff259326ada9d19c4c868b535fe9ccdb031f86f8d3f4cf692a98c988f6a9bea83669344e02e8585380a7314f8ccc39d7ba854a6b56d7f70829eeab8289b81bf5ca157c4af62cdbd7e42b99a293102e67cf4be5d5321c1dc7a682b159c7e59d4a69b91dafb45c5b8f4fa086b1f9fc1c2d4c1fa0876fba8c030d9c04a5af3ffd19ae70cb9bbbb7ffb0405755050f577312bf5511ff55f6937edd8a3eabb3009ac8f3aca3d45dc47faa0a590620aa1edddeddeeddeeeedeeeeeeee9717b0144951c3e8860e1c160b3243862c66e9c0713a709a9d9748070dbbbbcbdcccdc3c05b69201ae17b6404004545a9bc1e1bf41a89282e13bc80c1932dccd54385ae367150e966b766666fe21046c679c736fc8d6b8eee74710fe5ba5622ab63ccb4f6ac4c98f9667792353b5370ba17f4bc63ed990bd39ed28712ec9a9cae47a7a96f7ef66edc0b5f4acbd31a1a42963652757a24110b03b1443756b85569d7bce39a0f7c4730d5fee2abaf79e8c5062ae989bac42364a75ffe0ebc70fa60ad9284f4587a7c421be8a3a3da21c5505d49dd2832ceab6443a6d438477d8c0d6f86aa769fc688718911fdf08e9af3792ba417e7c1ce447cae30407d25fb1a330020b7a388d3747a9f037211b45c329c164ca243ecb5743503c848d27ae230a9c9919250525e59314e153b967561804ac3f13351f75e539af02fe3a4737f88f9620a493965a933af53dfc182c228cf051215a752d8550f5bfc158cc07341fc8579302659acef214f2fd1906ecf5c6686fd60745e0629357d08099a8fecb1cc5bbeb4460576cc412510632e2c4c8cbcf67eac298469cfc98fff2465adee58dcc7f79f93f5e7e4a7a83cbb73c0e2eb485cec7e185f6e0796338b922494fab85a2b8054eb4e869c177026c0e6ec1c6e02ff905d57f2b40cb6fd345feccde945efe4be69209d1aa84f0e147151493ab8eadec1f802826bb127c20e6bf4e9207f6f2d9e40363791fa697cfc3f492ce6c0dcb1f49f55849750c319f856e42b47aa21b3f07f888c36798056d6b7a87f4fb457f8f984cca40d259be72adede1ab6d99182833623eaaaac1046d0a99daf40526596064e62a0d2aa6d3665c1deae79e21ef676f96cae99b93acdce58782698d73b6a69f851a7122df88c9488b164d54d21f2d74b64ed9b6e8145332b36a3ccd8c253b994a376c2b6ada4b291f89b93c66de2469ce45e2217fa51056dd1e75ad6dc6b3b92a8beaee36b9b2d63e29fe0664f6b42866fc477578bfafc3fb99d61af01e62efab1cf972984c47517388e588d4a4294ed5350c2598dd42a5dc1fa98ebe98aed7f2a7985f5fa17eb64069645c44ed7fa11b0751fb5db26dad85a2b2759a4937ee791563130b6a6a285446c4743a6b4c41a39d097c60ae5c29e28f05808cc957b0c7d99bd2fbd75d3d94385be37fca8098d608a343ea12adaaef16aaea6b85869a42ee83b56a6f56a4efeeee26637ad5e9df58285f6d8434088b8562c9752cf83bf6d29450323333ec2befa8350ffc545494ce843ca31afd31256db3614992bca3b629e35d11f28c4c37c016a9c55ed46dcaadb9b2eeda4db59837bcd7c2b09eb6619af2115fc833aafcd93b729ad75a938f4851cfa792b2d7928f623ed009c63a8c5c861a0032e6fb55fdaeb6f5bcd85df5783204f9a29291af520f4221c862f2376a7fd44f60ccd29bbec998ef2b03edcdf5fe6cc4ae7a784b0db235ee92720f5f61c068bda8be44d5b3114c47716cd860c621e8de8b8e424919639cb2b58d30ce0c66d9e8c174cf5f627202e25ee48f35c6da1bf9fe08d81505ae174e30b9625e62edcda9facf30e61601b255ac734f12d26fec231fc5a252b5268153cbbf6fa13c4ede894e7aa4f568e901719a9da7b992f9de81f86a9d5e9491d41ef982165347d21c1b399891fa6a3e03b5cf8c253b65920269bd252049c1137a5a913ecae4f4285f0129d250fe32244c47a76cadc619b38704461554aa1b90b688412d34818b219c73cea954aab8854a85c3624928657cf1c507df7b44443a4960b19c900ccbd288706820dadd6536c29d93ae72ef82d16439672f95e874293d7b215d948a7ff220184dc53fe5a46e383df6a948713899be64c61ad5eb01f277f02aa90650750b5285a04c99bf5051ce5d088a88e9a8d65898999971ba856a1ba73ac8bfde8504a9f29763203d4e0b4155ffa983a986eb5d4a130f29976390976aae4975041b434c219213ac64812040dcc62a42a15828162bcba1357e1d140ad53f54301d9d366ee03e1c44751563596ea11cd492b11323981b07d9ecb4b470cbb7d06da72bd3213bdd6b8649b584f9fee76cad7fdb1932c4848382ba494d6a09f302f3450e04e7e01886c9765f481e84c9e5fb87ecf42a6645e305e6afa791f5c8709c068636ddf620568796373de625976c9f4da7c7d8fd796c757aa472b63d4f6da9fb26969f476a4b6604a8b20301d35ab3561809a66e7bc4411021e2b6a67f09f3514a847fc78c21d486122d4d12c2766663a1ed8edf6aa761f9f6f9818f93b0509d08577354d3eaf53abe9aa827aa477a5a3abeda5691516ff790504d50bedad6eb384dff125d194b08f6c38183ef1dd6a427f562cfc31fa3d7468a72cf677627b1bbbbbbbbbbbb3d6eccf0e01eedc636e39cd98cd6f68f38fb107677bf9d98c25cf6b1b252fad1fd3ef2a426042ba59178b60f998061bb37f039ef5de726cbeeb6e6da19c130d13d93d9503255d21b37981beafddfbdeabfd3b9087d6cea88ea802a1381a93baf3a3d526d48e16a20af778fd1dddd2f974c60d8ba27dbf3d1665a5b199665795dd9d7dd39e79c4c6bfb6ee22153b98c1b4d4c860fca84315b468cc950bc603d2a0e0034b3586203fcf8beebe07b6ff7ad0a07eb5d319841d960c1dcaf802be2dfdd5d56edef0a678bcc98fb4c38a1a1306028418d29766912747b1641e510d4fda2a67c740db235fc4663b85684b9bbbbbbbbecc218bc3b8223b7ceed0b15f3d1540d5eddd6c00a1c3038aa73efce9d83cfb97577eeee7c092f5c3167eafeeeeeeeee5ad12a151898134f9a245104904f104838491133841c01a9f263b7b51552e198d15032a5246ce4c8ccbbccccfb7177e3f2261104b31793a6f2d3f062a21a6ea99782345b0382c96114d1d7fef5f02390df8b3e99cde43f947fdbccda2b775f8430a8335456ec460feca3a23c231b3ff81035b250c5a868071e472a13f83fde7b349078bb4c83c9ac41c6dc18949c1b633239428d283030bc5a260316735733ad7e9fd9b7bb13a7dd938dd0df935ebedcd5f592a2beb55d99182c3618267892079d8ca898c940d4a3645a6b94cc37db58626e73c1da6f0d7f0e6606b09d119a3586989bb36b002bd37f9f77777737e6c85474852d614c238b29e9be8d26e64ec1ae049b3ae75ea63577a33a4d43b50d7c674305b206ced14081f3540efc19eaab29567d33541b3008032b552272c0b60db084b571830ffc33f38b008a5b06c0ae50316b03f36ce66f8d8d1dccfdfe554548513a013863c6f8bd42b4ea358498db4ff69d7735124c7e9c5e77ba19a9bb355fd41a56cc652f98983375f79979eef2645517c1c1e782708155594e3304168bc562b9271cb19ce52c67398b15646b5230fd5907334ec78ecbccd281c3d281a33d8b85a3727de3068bc562b1de17af57a4528521511a9aa6dfd5f9fc6f4429a57c7ef0e13cd65834f46000cbdd5d4a09afb07be618638c91d9d9d9dd9d3d875e5e5e66762f689a0d820f2f851338b3fb83fc9c1f3ff8de735591bb226362f23b1c2c952ac618a373cece9dbb3bab543f3f103dd18325ecdadb60010f8fe3330e1ab83d76ec38711a87861e34f4f06e219cee6eefa3103ce71b3a222bc6e8ce721d38cdc45b91c2fdf7dddddd9dc3810d5230e3b226e64ce5dfb76166e699224851c619ad83f7de3f32bb3f7ece8f1f7cefb9164bd870c2f91d92d29412c89425294b539626f7b4d6ecd345482965510b7991c3542a2993fff9732ec618a373cece9dbb3b17a10a025b609bb5a5ec6e4f1020bc05b6dc9ec9cd4aa8a6737f9b13c0766673e9a9fe4646975193066279f727b08a51d1d64040ef75b02fa5e0294bc554c461be3ccb1b7179d9bac785a6e26fcbe5e7ebbcd054a44c60583ebe7c781975516b31bba1f4a787190ea46f895d05265b79ca8c38f9c1f2a596cc080b4d3d9a82f44789a620069f09b38d8a6a5431fbb72e223d5b995917b9d1915191509191509151dbf4bf4f693784847cd5455ed442b0a881dc7bb8f3139732a4c4e8031587a552b9604762633d0c5517aacb4f561cc434fedb7caad812db412c57f6068784627950dd39d73f145171eda7ca195727188612cc9e39b40dc38defa61d444c20e45176ca142ce4040712ba42dd588a5051dd984a75262ad24112cf3133b3a41b2a5a601231c590156419d369ce3937e426d11095ee86ce3987d58d9fc020c55ca7c1a188d3b89f5be3de2cf22a40963ee0cb7f116397a6dea33574edca6a9b652c4a299d9da1bb3b1dadb9bbc8d281c31a8b45a483088706e7eedcdd3944624807eca07622a89fb44d50db38012184bd6457bdc405e90e9c851e39bec2520cdf6746caaeacc6871e14e4e3e31314743deda08ba670789acae1b9aeeba24648543ef6a4dfe40b4854731a9722a4494a846baf941e4e0a2b5ec17ddbc4f59730e67bc77f23c70d6c863165d89bedaaaabdb9b67d792089b0fbc5ee187b5a7e1cff9df7373807cdc6e0bf37b42c93c17cce060d58865c1798b39473a250ff9aca65f5d7cff5632c1811d1d35239d18a0f3bc180f439482e9aeaa7a92ebdcb8a1ada2efcd1ae52bdcd20eaa2ea4157687ed0417dc58b9c46fef095ee69c2072aaeb4a268fdf4505369f9d99bb5a2faf5397b03ab2451fe691b4b4cf85b934a7cc557dbda4a0a8f6e17b852df63dbcdcddccdcd1de4b40d71521fd556735dd757a91c6eed4be652c55065e2f2ef4acf85201f24e167e2617a5734a58a264d000034858a1e18a65401f4de7bd1023c271ffe222f959f9130fb44f8de7b8fc7d71d8a54d343530304504d10bb68ced670c6a4e5b3114c1365e242937cab85e6d0345f2f20ade5a0d31a7f15a2eafecab22bfbbabbc952e9ddb4a3e4a4bce8eae547caaf0299bee01d7852103e77777777770772ce392e02cc9441cdfc8dfa70d4c772833e02b6336d33518fa46e3306d0c1641f7f6229ec586a9aeeafd2ddcdbd0cdbb9eeee06c2465bd50e3cb56de0e6b66bf6af816b3fcb000421a7a2b5cb2d8719b7b87d05337bd352a2507b93d9101fd0b54b6d23b1b8651ce1334f6477db07b64739ba18e376c4851e0c58266907f90a0e0ac5baf67168e8d136f16a930d2cd55dd27dd395964cf7aefdb97fdefeef3987cf753be79c8350dcb9b6d94ac4c580852bf9df9b5ec95f275422bc65750d8084b9c9394f3ea819950e190d074b288a94284b1e4591ff9052873380c91b2200050ed868623707ccc519dd503a0835a6e886ddeddabb9b9f737ee420e71e81ad5c1dccfd1e5c303733ff00fb674ac1d4360a73793695cd602e45cd1e9512b065ba357ac0337b6086ec1431627acc8893d21735c129e2a6efbd9144ff45ad9689a6724a18f6bbbbbbbbbb53840748a9a8f452ce8942fd6b9aeacfe88946a809337b3543cb67a8fdd3363aa4e43bd7a1c6bd694ac3d6786bdc825ded581a5f4d2a5a6831a9484002a49c1385d2321bcc142ce17fef9c93f2fdcb48efb1953bf0b0ed38d263cfb483f4188914638c54077e57657691b2f79bc1c7f882ef247cf735c26c6b37167fc2ec6edc1d1ec01f290a664e8e57103afd50f6f9207c867e7eb4d61e84b38b17e5fc98a9259389e6b4f62468c8a727c8e7ba7c2e9fcba727c61e98181a34b2dd980ce63a3d4eefb4cde9fb8bf0b4cdcb632b1a2d7cc7bcfc16321ad93b4d0c098624747a1696fd93634c5d7e7b976ce33fb51ca99b1901da7975a25a3b9d284c6bdf5ae9bff4a52795de6344dc4cdd76e84d5ffde802356572e4d02506dcefe796242d3d2d488ab605c9839047916a36f1d2ffc0be2465b7f4d4fe969efe16242d49da06be942d3d06a90448947f28acaaade94cc98cb48615737ffb2a5b7c9e13ccedbf776da3398ce65ad3948e21264ce55f38e7d6f8bf164c3411be443c43ea4e0b10a67c285fc8734c66fc48ddcae882291f5ebb10eefa83bed0a13f775f2a3eeedede03471392743a8d7b3f09e67e5ceadf9a3637544569d01f0b6cc843b93c29e662661eea45ba6a8c0b4998f01fe971dae5a22e990e566bd257aee574c70eb35e18867563cc7c750da7d29f1ecbb65931161af35be8e66acb63da0dff03700eae979309a407035c5c32977fc9b623f58564c391daeff2301ff3476aef7485a107e0185c1ec75f321ced4271bc2563f999b1d0781c67a1f13e4cfe96f4548a3035e2ecf45eabf58074ca27b8ee7969cc08fea25dc741fcc43966e71cd31622f2a1d6daa9f89013b5cd90536108bdc9d6bc16daa690a3358cb298bed91621c176a694f34327fef5fd38be3272fad2ebec75f2ee3d3a55995bb775a2a91cd3a77e947e1f85914818866154879d57e5f3624f7a99318d30870c27b61685aa71064b11a92115dcc5a97d49c2e4fba7f8698a9f7449ff6dbe36c3a4092a219e5f1f1f93725f663aac73bb0fdfbc01161dee8e936e378392c61691f62a423a553eccc7e33ded57c2743ec6dcf7206cdf5df32338ba4e6b4ee38ab9f10f13d24312d57e878445e8e460346da060364e4be8957fdbf197b407035a731a70bc853fc559b4cdc65dddc911101207c482eacf49405152fd541d0948aa738444d205d51f4666989fb9f1cfcfb51e95fca07e22659f244fcc248c04c9a9080950eacb96a83aa5a1357f940f13d37cc53fbb722dfef92a13d55a0f17190bf969d0dc542a370931a9c8b034fe08e0c1ba9f60aaea0c94ae72e932ba3b2f0e964ae538bc8c1d77767700d49dc245142a3b0f05014a1d128294b6f2f8c77c349523e5a77078920e01223fbe931ff05fea86f778247cc17c34d5294771349d9c211f035b5fbd250941551dfa5110921a535dc12cd8b7bca9647a6c4d3c8e54cee05fdc3f49d44bcfd9cb64b6c95aa2d7fbe88a7de4276539b51f23bdd3940fec99547a57fa57fa96528976b605a95b7c21a80abf25733f3323291fcfa4779974ba09b9bee55f361f66a4c7b2eb796861e69fd747966cc697d929934e13699b6a70efbcab5408a9b461abd48e4f3004ba85bd5b96eae1809099c975d11b5738ac21fb41fad2f5580fa42f416682615405bbfb516c6304f372530ec0c3abfb3e0094616f52efbd6ecd39008b8757477b6c0d6f590aa6d3d954e2606e0f0cdb1fd294fb232d28910c711ae71ea7f1c7d1646e8bf42ca7f17f1e273c4e7e5c0f9fc7c98ff7a4f7280fca699c47befc6dbd16a43c4e7ec097ff5e9394e76485104ece58e2889e9e16fc6d459a72746331ad51c6e46e0f02c68e999999999919720b7a7208b2234454798b2aaf95caccaff7bdf736e72b323233730fd89483a2084a28395128997f191d8c0465653acda11e3513843d5282064b9061b16ef72dbb65d8c64e61ccede12bed0a821df5d050d47f294acad6b410e61ced7675a30a07932b84912ea57c1efef282cc84f4d35724fafc358098fb2a8f82edbbe3b1153e4b15162396222196293485a6d014e22457eae2ec8de3a8dd4b847aa43291fd17b337379b8de3342df4c0f0a79343518dbff19d6947dc1ee62ef3ee83fc961f3ff8de0ba50248b91608b2e9a813c70cd68f1ac04c01d1b0ae1fc2e722906320e74c2c32d03090bc7a7ad68aad0fe440b257b294529e4abb372fcb2dc880c8a9ae01ea5266e75c77fb200261a84c89a47ae7d5dedc77fbf3c1ef32b012d979b533de79dd5447f52ba0d6b9f7778bc3ddb7702c958e1ecd7265a830f963bce15e724f4008213c8560655adbe7c79c0b8d8b947f5669aaf6aabb6275d26db1e41c8490e53087c5923c9976b8f76c83cee483e574d5699ba0d40ea32461a5d3c9b403b2904824928358bc349d4b5ef2a25b91fa7e1d0ff6283663fa27b19c5a3009dd2b99aee843c2e4625fb1c74c19d77855796158c9c425d2258342c909a10b742f5e246c003e30e460f25b4dbe7c86bc9a24c90f540825ecf196402b9c7b2e2ece6bc0112abdb8a909e8ed304a520933954ea575af84e3d5bd9cc3b2dd8b2e4f29ba479af9bf7c965eebc139dcb42a1c2c1d3834a8349c07f2f5511209bba40cca997c74752ca51a49a6fb969294e11cfe5be59358b21e3803f8c1b9e8a2bc1c8ccf7970261f0d5f1532ed80afa36d204eec815382596aad75b40df429f54909946a8ea032f714254c53a870e229506a8e1a1f9a764469f34c3ba07beebd7c3fb510438b25a81f2c6656b75275a1bac96c16759bf9badd80a2fa4f7f141645a8fecf82ea53b210e30a30aabb6ad5ad6945573e9ac215772e8705500841142e4cb0648cd686aa0e8812643185085664418812fc8080074660c2c41196b472488162a88c2952008194164a2221836b8da40580b46685b9693df4153aa804a8ec57acff4e916284cadfcf5d6052be77eeaf1677a499a180556c4d36643a6c0c1bc29d57bbfb5980edcc4643a8ca777fbf5b72bffd33ed60d92bb5486bf2b70a2faa70418b8787090252105860a95fec4aa70a1b9fb063541ec41934142822cc2dacc09ccb27bef2971f9bf80ac6a12a65eca2d628995b51db1c61736c95d18b2a5b8821b590d1c8de31e95ef86172d7df1bd38d5ebd2e9a463e2a4d237ff7e601616be46f03c8f1b6d818ae526f3475635095d9aea21130026d8dfc93189306529e67a50623f8e96945cacf3f5800f5b4b67f9b25ccb4e3f4588d24a6ba3dc9b4835b3159ea079c818816a4297f1aff829c46c638bda169d0174379d60a44082d69f1f060f2c109091cb49c5c7fa485954a0a50c28b29b47878c07c683999cf037422a5e5e49a8188d686aa12894cd2362f4b23df09bf4528aafcb844951f6750e5c72a339af148318a8c54ba00c2bafcf68c504fbf3d30aa945f83ca7328efc15ce9943994d6e43f20134c98dffc89bbd04d524a77e4a45c1e90d3c8081463243f12b5cdcbcb8f54daa6e5e5472376f586e4d51f9de86846af743c76d11d4495524995124995b18c8e56aa8c55249418256651e5639ebd275bf3a0581af9f249f1a2ca5ff92ef4866e41e9a4f0867eaaacf2df10bb62bd9f19b096a8d2a59cc2989ec46b1081253b7e74130ef0235095f94a2ffc30b11a49e616811e50facd7dbb7c948f23db81877c1f25ba438d0f33e6e51d898947cb7b4f8691aa0b794bf692c9270ee5bdc7572dbdc77bbcc77b5a8acc22268b454e23ff94c52eb2d8527c15819c46be9473a250ff9a1681e47f13a60fb526bf85ba94d66ab8606e6fc8573ab3ba64449cfc223abe72294e235f9e4ad95697521a72a208d49a7c97225fca3987acd047d49afc127d43ad61ee09ccb4a314a97362bee761a32e96d9a82c5f45a0a5912fff052be61bc2a2ca7f54dac6f4f25f179ca35f9ede943d2aadc9d31b3a55137d435b231fa76b92cccda554293f0249a02adfa54897f280ad52af67d38e8beee092ea4043282302c6ec1c7c8733ddc377cfd5bdf0c3ac41d2f8a4c7a0c9015c750c31e1c5d926771e468b60a7376e30d939e7a02f71cf45298304103f3550c2064710e2052df8e2ca1146e4600a1547b410c32545ee1cc698052b3c49c2103968c20c2758a10415380081122730a182bb422663c04408254e784117538042869210a060c915a04c3134858914362049f1440112062c24a41799a22c5118b51f070a4525222881edae1eb7cafddddd0bc005fea94eb235fb5c63aa9576360ec5746109937f06bbfdbaa39b6d33759ff323e8ce618c477e888084268e008612869c58820c31a650c1159c9c6186142980520c71723d745c2cb870428c02cad5e46aa21af20114e9440b21be0cb65eab8579c945e7dac78c2d2cc6d36e8d6b316fc183254894a081cf1320545284d822046264e10390348208084f28c20984b872020885951e643144122b90c0e804a8d5018bd52476f166ae68c111a0f0842ac838430a2b6070c1842d4ed053e404162c4c0924c50f6f098e85c417ce42820ee1b19088b34a54a2bada3eec151f3180a001135378e2071f8e30e2c910097ab0d282d61457c4e841144dccbc808584640013b56b37ea7de0c39204ea0599438663d0817f7bd99334e523bec3e91d380b3b70162a4e3baf2fd47e1b5b801dc06a312c0df7afa80b2e00f730bea3a9afd03d184ef5b7a66d9ef3bf59c9d713dd3fbdea265c4607e037364326f55b2b7161bf8fd89b97774f5a606f48bf1f4408cb6fe9779f93d89bf9bb2ebfcf437b03f38bfa05c0af007cf5c2ef7317bdea245ca585dfd8ca169ba38f88f98d8150f75b06bbe22327fdc4935ef1d090d03e3bd91c6cc58a12759f83e815070571115c82cdc159700cfb437ac53e572eb03938098ea13f0925d47d06f46ac8f6a0eed7cdc14a3601d4fd006c0e21dd849bb80c00dda40c7581c90b4cb24f61311f74325ea613a984b1b4b8ccff35ed0000cc4b130f580180ea247d440b34682789a17d04cc0d3366b034501cbda090e0d2326425ca9095899582b208ca82a583b24ec2278912dd1a4a12a42887b092a3235672755027d15a3bd1423847cf6063e89774eb28b53fd2ada1d4fe1a6c4d3b7ac38cb9ca28634df8ac9b384dc7df2ae1e3f4be7792a5f24fa6291fb3c29f15d217b24ea29b8460320c0c3e981b4c1d9269171af0cf0c899393e94def5eb53707a832c850d7b4e38218c9e537adbe977f2c34751da0ca5063762d1575e73dd735d9006ba665a8348e9734b9748846000000b3140000180c08060322a160301c10a55df70114800c7d9642825e984ac42889819852c810430c1100000000001161da0437a6b0e522f92cd1dea1f89e37971ad5d5ae6a19f08d1fda4017a2b26520cb6aa0ed8c4096de7a7c85e6fcf3fc69c0e1280c41dbb03ce1dbf8164a0ada0d539c14afea76ae4c05ebbee972f67c993ea3ac948e8202c3f4fc2926d0e056b3a5dd8c5f4e19e78cf55573264b50c74c72e178684dff59667d6b287d758ab6c6b84147fcacf6a41592972c166e59afc5377e3e1147ab9e622219a8118325cee7107ba4ef3e8ee2dcfd4d4b0956c934a8b32cee0b8ea6e1470a4a8a4867d0e040498af32353c25cc695a03fd8bb5d9833210360401d1bda1f68a8f2abade700d26ed461111c2a3fcec7172ed24bda9be33a2b4f4bcd1c37859ac64a7e32d4193173ed1221198a1642a0e84990695df40bbb8528b01e40299b5a7a282d3079a3899448abd99005d84a349db69a06748defc6d69d613ab6c191cce9872ea292a7b994c13aec11c00b1d459a6ccb7e5fd0393c8a3b1ddc41bc3108046a34cee57d58e4a49eb76173a8aa42c064dbabe18cfd566842b1d2afc61e2c4d6bb250050ac8c0d185b0e1c87070280136c1ee2ccc5def23e24ced8f71b9ab83afea5634cf6b76c1fce88e58213a065985221ec66ff4fac3ec96a850b5bebf57c567d1941a4434848bef5d4b0091f9327a3bd742eaeb26e487b5bb09cdf252ac5ed35395170539f9ce0f4a5654b95b264c943fc941fe1f74b9894ead8263769b0317eb466029b8d220459e3839c28ea990c7d3f4370633dfd331bb285d06acbe1b15ce55f4922409f3fe1375b456242cc52aa2a67666a6b94d178881c0a8f1a265362f63d748a7939809de85ab9590cfc0bb9c954f78449a4485e9e5667e89a4a5669a973568b732ebee259e57f34baf616c957623a29b7dedaab895ff888f41375c9701b6887c28e9c80d2d7c1e680818e368cba5915faf72dad86865638e9a3ca6584615786e18f927e06d17924563d4471c6fd5fe829081fdf011d33bd55be5d69084183c481668173b227b7b5bced22a42aa97d7ebc3836381e206d5d0bdbc87120913324513483a85696d75365fcebf717f041ee7efa6ce4a602a10889e5502fd53c0ea0cc95f32c5d09eacd083db3def055333d5ad4f65a023b582a704cba1d96a4e80575765b5f33b07a9f2c37af8a1efcdcec3f3488194ab170633e432a600cd5d64d6a6a684cc5b9e468cd019dfe805dac20167afd0b31005f190ebaab8ac58da12bea89604fb44d5f8bc5bd9e938cb9a72fb4807b061b9d3e11c7d0d0720801ce5f38a0919aad0d418aed7a138b95906c8a70f31d5f2856f88961f0683cfc036d9af8905ceb8b28a0bf9823f518eaed2e527bdfdc401664eab89ac9868579fc69079984a802c196546a4c34e57e35371e39712f5ce9afa8383764e0bffa4b8b47f0043368ac780e1e5b94ae037453de232812902c616971fdb0a8d9c00414c4c9498b542cee512ef9618fda4aba7d9e685f6ba3e3bc2d4c6c89e7558bf29351644542f5573e53044604c50e1274cabdc5db0a2e0c5b9d297b631cde910a1c73838bdb93fa2567455b40de3cc09e8ceaa256d8deecf131d1b10a290bf4f60ae71d69686d720e20738298acf90e446044250b39da5af7d6c7adbfc574f8fdb71ccb2d08c7c8f178028c78b5dbb1f705ec4371e03535c2c5635533d33bacc1fdf70c460d1b64f46dc11dd812c67c6cb1fcdec2dcbdf97dc69a7c77d8a1335967d90cbea9e2d24e6126e9fcb2ac13a09c385cafaa9347048b3757403c71ad60b3ad0be104cf7b4011a79ad4e18a9fa2b9252446416de918d40d8838f375fcccca3d40c1a59033d030fff5a34bfe9ea5ab8a6a52c80d94333837551bb82b90f9f8a520b1ee8584205f216a27e4be7c432bbf922239a4ee63d363e48db00ba1ae842936c500d13e6091caae4a831574e97721285bc7053534c9462fc9fcc681ad695ea818883c0be88cd9164d77e7aec733c320f2f150b743f75e1d81735d02e086fe3e45cf99ed5d601375bddb55c1517d2f3adf779c06b34f4366ab022f945844b6c48e75c948755d8aa5161b63f8e6421067e633986f30d3ba20fd1b1f7c1eab219259830668996ba3f60738827bdf99925ec8e381f92765bc5029d60197c94f2ef0be469ee53d1adee894e96f03abd70751ff87b5f08da0a80c57627d1ac10e2fef7f0e3614771621d55688ee881ba39fc359bc7a8f3db25e264e8db84c65a35b5741c928a4cba3eabe4fc0027d44b26d811b0fd584a10ba43ff18e8fd26ac3df562de1c86b466d161d8bf206331bb325f02d6724a18ed9bc4943e0183fae027f6ebb1f3f735a1c7e51417615c05b9f121a6dd55f02069da2a0464491ff376ebc91c726b58e255b9cff9767b1821355883fc6007e79767eefc56f29f1a0548e87462190757dd8d13cb861a3bf7a9b1254810d7e72d73e98e5fded4b29cb34c8cee367e791c9b84e6d5289724532e1cd63eb1302fbd00816a9f3b9e22af4cd0b92a340911a13e5edeb820f62d3568a09b8f6dc972c8742859c879ae757b7e9e49ecbd1bd87adeb42042fa91e0b55317d40d030f4521d95b76b06e3957c9e68083e75c45911f79f312a80840a48371f1e518494b6cc00f9b2265bbe9f6d71ae25e3a161bdab4bc9c7119c4f407562e13915eb4cd6d97cc97447aa3de3c0b6db5a2705e3842fcca8885363b86d9dadff2f08d262111baa1c4f7cf5fee4654001ace2aced542a9f48f1e00558138da355864e9a45a48cf147db037a77ff6069fc1f1011c1a191ff7f239732bd9eecb9c2ebb5a6a621e21c6b7e799a3de30499f63385682116298a99822f1e05b626e6ff5a465fdc8a35796d657e82513404e1efebf246ccdc228798811dfa1c5e1a2e5003e9aec41d9cf159be304a3dc48de91ca874f4cc8f7398f643b14cfcfffb2567b1a38cb9bccf422f4a11dd75a26f2ce4d3b27bec7c807cf4e2a32b3f5a5d9038d2c1a174d9d98054577bee976f00519eaf6fd4b5561c69f6860bb98052cd1c20fd0287ad0c0497810541dc22f7d76854ef36bd718397ecbe8c0187852b0e193a0d69d58ae2bdabf31486d6e95c8066f538a6b60e6e663ea7bd8f4fd7e740846137c2bdde6ba8e6993482ea4fb4dd898159619d684dd5df2a0069e6c6faa28270a8118a9027212e0f214b874c110fbf94d2c1d6cd8a03501a97e14e07b6ea6834b899bebfd6c0a3eb22f14f8c033d9b7fbbc4c7a4a494da664232d583fbfdf8349425fb3d2ae473f6c7e475f7b282a0c6eb74c8a76aa0009eeaa7485ef6448a892655084d9fb6785c79a71f9382bfd123e92ddc0fd88bd0225f0dbb6145c1c18f2b8805d05b1aee7c1c431e3c1230e96c11c545866c61d1a64c25f4a2f38d5004ee03250c9e9ad20c5d29116644dab3e0efee04961fea8a04f25aa9a0872d825d20aafa1f95b9ce8625b97d906ff39ff458297e20462a7e6f213d4bca78e01f980d552ee0b8ce95ada802d7552a233c3449f9165641387f1e2a52631a4e934d9c612d0bfd2dad6fab2d35502af48da2b51a4e8b3f1e25f14d72b96d842b90bf48845ff47151d2496f02889f89c96f0b220afb300f8d68111a1d5bb689e07d067d22b647e7a9e4c2d0d2c1b8b278faeef76a7e86368d5d1f8874b043815ad0b381934cc4387f2cf8766484e2312248706a90fbf4ddf681b9ae17da265c56a0db447013a7f3d47c0f958f9a302fc61f7ae351b84c9a4311dbce5c4b3956170e62e0bf86cb54216bfd71e845f353d28038429f97febafc4d49b4950472601993580b20afc5efc308cd518a7682e9a69c4f4b0c926bab50d4dcd03ea03c3cbd514dea36ab9595a472bd3175c736621a9fc8deee642f5a5c4e65d2af890383d823d498f26e37d8a88eef40aface055d49b044a1595ec14893624282556cfaab802dc134d0cae99dba1d3309594d33c8999095c5a9bd3619512d1ae85d673e80e2582cc95c8c46d3040959fe7c1f4d2e2992493677caf04c2c2fc05db515c9dcf02ea0e1c8608615b72f412202b3b84191d3abd6afcad98ec896c54b4b2133d9fecc235abd75b8db7de64ca129e0d23b2a578cec8b3d51b84b81d59f3c90a8e83b57f9d9880d0cad8ffc56686fab428f0b53ddb41215c17312954aaa9e4ed2204fa5e1c0ca6197a71f861456eda9958ca223266ef1cd45b794048e1d70e20c8ff6283e8e64027818f4e2394abe32e0c492f0b650d014935d7ada36abd6b794e22b6b6ed7b4bdc0b45a852a252e88a896da978f976258e73e1710957c9a67ce9a8dbeff41f187845e86f2b88b9144eff427aa44d8c1f95e8f910ce78104552dd1c295fe7a47a0014435b7613b5cfa8377b7731544dd137aa4ca6ad1054fb5c029c8fe260469b5630975d49d754b57ef06690728922f96ea53232346ae27c181186c632961d412ad5d28e404292573e8696a49e7c9d31e1d4de43a6f464213fa844b8937b2849d5cc86fb0efa101709e4ef94d502fb8050016de7b6525090b2aeb0a50279cd6934310ce4b8420fab73ddbf06c4e28ee6ac38cdcbe580c6b8302f3ee70a70853c0699d5d2c2b294c30f6aa6b2e69f37c6254458f7fe42420c9040ef993ec7e408502444865f21355a0401b2b88d8314e1bc11a6c65bba14124abb8ada805f9b84f1f271db02cbe351c292d52ce12656d0def703c6eed2af423803616acce8821637ba2bed4db1bfb48a64a4ada9b23d3780cbb9c46550c3f3f661bdb0a8410d3dec0ce54d5275f50e0784051acffb72536568ea374cd9c9324a5f9e81ba8fc15357bb4c94057ea709b3df870ddcc7a6fa9d4a68000238dbd23ff4d051123b67590c4e2fc0b5c5e1642c17052aa558bb17adbd32ddd30053ef4c3f09fa4b278a491299d7afca7a6260f60d7589df7ecdfb060f1e80e5a20eb5ffec13750963380f02c530893fed0116b10327e0309ef6483b764e184b70c4a0035e01f95b0c5e634816925441d19b0a58041d7b220ea2241015a5f088f00eb8770f41937629b3f21198e18724df0696d4351765cb121623e33d5c0693abcdf0d97db1da4b4043b2f987022f4447374a97c14cfbdd72ea40fe0addf7f262d71ecf0f5d94981f11e3930d99635f62007beb11741c4b1001f90f87d43c38353e8438f382201779327c24199711ff8e8933f11d5186340fe87fe66c48853075bdefde6d5bda5ba2485c5ec687e7908f973eee0ca78f5eca8236cc7a7f21576a50aedf7b811008a0d5abfadb6a1cd7e86f2a9fa23493edf886afb2862c0ee51814d0f820ac9903ee7b622766e8f9c358b445f7994830668006e9619a4c4a23ddd47e8f4df0aa5deffd990bbeaf34c24b897fc3c3cc4ff70803ff4cb55b810983ea99c205ea9e128182ae65cd3231a8a3efffce7f7d8a72cd934a90f7e7c6c0eb7c229657c3f44579ad0f77e96ae5c869ba29402c891dfd42e2b3f4b10febd750c690fe2f0ed26fece5e7b7c2cde893ceb77b1d267560eb57b5b391b7ee684d1ebffa0cf2483f469fd3f0f9c524c99430d660c21d35d5313636d32581f998fffe21815a7fd1a3fa087bacebbeabde37997a913bd0cd6bfe3159e42c6c9e85443dd68635559c296b53a48f9bf1ea8550779f48891a27594c42bbc99b8fe6ee57c177fe42e7fe56032c4ce73907b4e5fa5cb2eee0dffcd4074c19aae70d0ed6d33b0c299fcf0eb217858e200a33d313625a32df5713591f0a443fc05472008acf36e5ab71ae7e7bc8d57b89e6698a26f775cba95603716b8a35d9384c2073fc7a12b6e9bca91cec855d39a3b914599396a95c1499058fcb7e48f2ab54bbfca0d6936b0422cfd6f2efe788d332091729ff42269729cc190303b89134fe5868ad77d8ed34ba9fb7f51dfe22678beac53b8bc8c64222943305ea2b173764d6eb4dbfc50c22ee72f2c7fac9bd0639f93e5f357a2a22228a8d1158558b109c9127b565211112808aaf084d2a1ac147967821a691eb23e1662e47b6807b04d28f55dfef06dab40975bd671155295217eb554dcfa3db8c860e55854e8936e4f474c457ad17834bbd5d0a01c4098f2964124baa8105dc53f11adebcc69bfe98488aa9cf1d82f186b6d89d468ad922860725f27d83a9a4b7319336c510d518f54d7e385411dfc886bf6a2bb8c1a97acf43b1913d38f2124537b6c15d5c0a6eec27f06f28cf5a3541ce201c01698dbb7eb7d77789f939a41e470a23fbcfb2640785cc334a12255aca1ea88d20bfc319cf293f12067792a1271385d5ef0cd4786ff98faaa86d9029a48f154032bfb8e06992bc93f5a6358ece5c98deb80931b0a686b36312d4808cfba99c3f4b408eecf19170a908eabc62178cfb14cac67141e9ce32f0fdee7ec0950425f1f4070b0e5667fe6dc9a292dadf196dfc42c4ae5e8f04482e1752d01e6e6cc67cecce3775b97d9d9ed749f593c8b207cb60cecf3e3c787c59a41d98037647461aae97e653bc1434089094772c7cbf7bd626e94c446a234932766f620ffeb25b96fdbb2a1048785517106e8d76a3f328a756b7c134165a40603feb6cdbddbb798e70654e7e1a4ce87c3efab2524fb9ce265bc8dcdc32ad0c0836cf0974a015027254af520dc48f9d61f2f011e1ec523689ab9a1124cc76a0e8059ac5aafcf2a49a33b28335778f8a6f29fdc81d68b3e14ab97e26ce1f0e28b80f45a99970cc615243d9e6caa6e3eb9857a37d1f7a4c89061b1db4b29150ce61c290b5606fec0a5a1e249589dd65982069a861f6c39346187f8a0bb1a7aeb31d5b766c2aeb88f6104c8b9ce72eb8701585b7bb736402f925b404a8ef7cbc7ebf2cc2250bf08e3a0168b9abe070bec1579d7ada40e033d43077e3ad636d1f1d511d9935e0c2c5c916ed9456b5aba20d2c9e06713a2b2a18a6a066fc88e1fa0cac0ecece833f9d94a489c9e88bc781cd949c36c9956f64df1c9becf7642e3a8f0ea9df5c28236a318590a243c21290636195df81eac5957e911b1a2a56a5adcfd09e03b037429df89e6e3c2f3a7596c98e992fd583b1f6a5730e1442499bd1a0148c8d6708ec1502714633da40ea5dfda27083099c63a9ee95269672607cb63db9ba78e9a1d203b7a36a70d3fd6a6b220a11559687a22dfe7a03901ba69a05f9730b59229a2f6ec9f1ae82b6a72367505e4121a3c34793b3c174a3020be757a979386516b1cc14b411e7738c2fc8b8588e597b13c76fe64ad61efb052d096a2f23a4e1c32fabd8bb6ca479248ce243846106f544f121c6455496e96f4e5b80cb120c471b9b9c5ad14eaf0703f3afe0bc6d138ff7b5162201ffe63634e0c80fea68312e4780d99cbc49651f59f3fa1e6a7e36cec658d83ae0be9a481785746be9c259037e87d1e6bc2e68ea42d2e1df34f17670764f6f3fb584112114985abe277b58f3292c13ba94bd380d2d47d0d75749d42c1b520bbfb12faa21a465fcd1e66af1fc8414212ac21f9e2c789944b973ec5f49bbde62284074222d28bc180219db376c7926fa5f2ec0bf422eb7f5e6ab13f34853790fce584a578fb2be09f5ae194c406049b9f9b99742d9e59052316e38d8c309847b42d029566238d36c3de4fe7a8b3dc99d8a4ba633dad850b07219dc37dc18d529a7daef5b611042224fdacba3a0af8d3a5d6dacf36c3563db07b8e98dd0850621d6501da885b7d8cf5f99fd783976d320d79c28f263626a701301e7f14a40f4c5d8115c9ced7b8612816733bb6472182386365e122d1b8b892072b549901649ad8028eff9a74e3d74ca0a269dec98edc55fa2c59d8bc48bc2b641ddaa6b002de2fd3730f47cbd7b237abc6e6f462c1866e100dd20c797cc1e57521286ddb3afe87cf8ce3ec36e3fede6235cf45c4eb821fd7dd1146d6d8daef728df8e4b242e400e852b7fd6e5e2845df51ba4a460d7e1c2726634ebbe97bad0d103b24e397027a00d319ece199b8a85098d60a654ae268aade236ea2d12f5f2cd28804cb86f4fef09b4ae868ad2e0f3678fab4830190ed0903fd833f01db83fb12aeedc11e02ed1470d5cfc4b70924f3ef1e3b334f50eeda4815690e84336782572e302242c89a50d2189f0c897d5fa28fb74a228ae30b813d1286d50f9e061be052bc2326192bc4a1436a4883d02718e1e25efe8a80c6cc775fcecd1f62b9410b4cff5dd13ace15a37eb10cd2b22779f34d3560b7c30b1d155dc135e3b6697c6aa698b4d0212916f9c46fc4917ae01246b3809eb2e501ab30d29384820a15c4a0c506a1a72bb4e24ce53259a672916caf7b40bfa0c4839223c27f46787760f0e4582f66aba9406501e04f15dad249001f890b47c6d69a11088fcc25081532269fe1bc5ebfcaeed1abae16e410eb7b9edea4b908b9328ff7f34bc8a979873718f6e70eb40f57df555081708a63ca89e73df2295ad03599d88b53bc2c8e9e19e8a5d44263ba48c045c8f376d59228e0cf549f6779613ccd03599b5704ebdd678f436707f250965af1571553224aaf80c0d112451713a9fa2f2838f5a433fe79b81f3060c980f2850e5cab8ade9514b49363221639a420d0e2acd4f1db509220a394f0e6239601ea5bd9350fa834bbd9ba1bebe2b11c52843a61186841d3d22b5e091bea95d987ccc4058d369968cfe462eace3ac6955911f0a11976250e9fdbc3e6faa6af57f3ffd368144ef358f73848fd6f20efb4917d28f8bb551e7e61c20814c9a41245f523f36cf4a34f2f515f1b30a2b531b99bc4378836c33e45346e2525b027c56f5362251a3faf55ccab9244164716d4ccc8b4716e59fa5f9788230dc8da00fdb6c236449f83e51cd13218ea7c27effe38cc67793b9acbc4638ae4628544b9de8ebf291198933bcd4037398c507adcd6612de6d8dc2a8cce52205202fda76f21851767b2427126df9726ebd0434b9438602f1a3ade89914aebe119485b48a80471237b09a1962c0b213c3c0321350bde3420649403906511c24bca715ba30c85f02c030621e0232ae620408e7366622ed961327acf24784f5152af3426b39b5e4f19d35c086200e2ccf07e6802672cd14dd747662b8f6f50b0ff3021b1649af962dd5cb4d33c3c2600068ddd0a9b905f8b04683440fddded5345cecaf6ed3798f95a1a46dc318e3ab5711595c7fd74254073fe4a6b12e9dd07e9b7d283af5ac4d2144be16ae5183f50507b37c59da04720131f2ff5122af2232426b7c30defa2d65510fa8f47a6d5f14dddad6ebb1a3d88caaaff9d9e20cef776449e883187acb3d79ecdd38ae93ef8abf257bae15eb97ab3f8712427ae1ab0dd95d7eb579156f8ce01b1d3eef83ba0ca91aa4b01fc0e8045c8d2e9eeb5eb70f3f91c2890ccc64a7bba8b8919940499d2e3db1b62059a1c1dc081f2e5b3d240e805d6bd83818fd812299577370c43341e9cd49f711f1761aa50d9159c5d10102954afb820ad3977597c206c5ce15093744c2beb582cb7a3c1b41954a705e762790c78e60f7fbc6af2b18e93f7dc37ee36388627ac04120cef317ad0b1a8052f30a9cc9c827caaeff8892f15c97830bf8acf09d26a3536f795b1cc2e9882048b0f822d5fd141fb9ce9ba1c3dc12a37412a231dc0d43b9c6c4f2f461d5da5046527c7cc73138376e9b20cb006218912e6acb3e2b7ca22ac4ce4083bf5ad022085446696fee410c4bae905694dd8aca8b1441c5f3e1123e7c16d51ade484ecc50cfbdeff24f50e3f5a8d6368ca4cd30f8bc16f59a879206f3d1f06a83964e0e1762632001e3c7b47fca105ae41479405c2d8af40a4cb4c91af709f04ac9b303dc31c3867705edad89b30c7c11d4a43d762fdb94176241a9f0ed57231f3d0efa16c2487574ca9d130287eb67e6d3e6f8565bdb0c0d44df43e1c0bb518a8ef9341a5fafba1a41779bac1cd0654ff1be3277c3aa228af50b4711c44080ecda033f23a857bd0707bf4d87a860c8916ac866a15dc3f97f8eb0c66c002ed056f06cb9cb84e1fe8d917598b4800ac033a5533e4230c5d854be1f7156c06623c6068ca30c16064b259c1bbf6f1bedc291d7b35ff83936c9103375c736215c23b06019653198b8578b6075f99945dbe8c9f5ba7e7d9c3ea1fcd2e47847fe3baa53fe300e7487ce7f23d4c3f589a2e8cc36ac6dcb10a90595cde30efaa117bdf8b5442525b9e5b7407dfc7aec4cd2c6093423c79ebeb6eb9b9d1044d149d3951387c9894c998620fcf868fc3441c1ebb224e6acbbd1ce82010a3212e5335a2da0fb85b4c6beea4210e81f2762bb5485df0d08588cb556a0ea3a7c3a9d211eb63e8c6a4ca8d364c557c791581c3edc60593926a09d56cf73c1ae1fee92a2d252d2316ee06cb3a5e4161ef295dab91512ff1c48d2d161a83827ecdc4ddf6960137f8c6f5bbbb1a6f41ce82b8f94716ee03267f14034ecf1d316f4a7bb1461e6eaacff2111cbf10059fd748821cdbbceac659a73c6c0876e008b0a001836fd860c4cc5fe9ef7e7c614fede49f6b1985d70bdf98bd104d99a51cf3cf01374ee48cb80a11eeeb698110b5c2a0a0c87a4b73388e7a556eed13648e98bcd23072bb27dd7694b3344577f07ee9290b2e4ec62d1322ca4cf0091ee2167c10fd2c0bde344fe91206793e4180467b1b86e0d32a5805bc254a6df8a1cc3b7b0af76951650627b24af71cb0df512a47b87b7a960da0d0195b61fcf10cb462754b98f93d0c1368c89d4b9aae382a5e3a110ebb0b133c1ca95e0b9b72a9414a5ff93d0e3d45d75c49eda0403eb2582e47191cf83d73d79a037d1f16612454214e1c67202c3ebe92a9b046261523bf5380cf18b279731e7510d0e215f8c459ecb224ba3575e0dbbe4f3214e34af0216a453daac63d100a9c4a0fac5987ce78c6788de51a7170cc7b4b915688fa88c2c4a88fbe041b832315a63ff1ba0a4c7f1c0eabd2f6c003390f4e3ce76f9f2de1137f801efb6f43f3a3e67cd4337b30e5be8f6085aaeda67c098081f3866ae9448238ffb79deb79e10ddc99bb591cad9552461010fa4f9e5b0ae60cb50d78d26191da6b31ae98f4a2051714a194735a74a53125c6b408c2a8cc0a5e52e51b0fc4e9108636c213fa7af17135011750a318eba568c834df544016a8f77dd5e4907a78a4430236a55c9009667b8935a0326287dab23ce65cca5185bbbe5a6d93622c41452546336e4a4712a3fd0866d0eafaad3f728b3a05dfcf6633cae62b494cf9c3daddb4fedb5a009c98ea6cf979129f5e2d9063cae6af300f0a8443fd25b414e4f5404a9a019d636f365866a0bd716794c933cf7d7293eb5b09694d7245e23ee1d314223d86abab9a2cb294310eb41137c836f60228e5d24930827106c16f82fdf1c69716e4ba0b3d692de91ed517ca5b28a6c74b74a8e0c823de0db44010e62eaed6b0fd756bedac58cdc0cce2b20fa05b2c519db6867c4574a42a41a8a9d903b3534eb62301f258c22d7128a5319d5c73cfc0b420834ea219bec8f1a6a68a0ec93a63a8e21c16c766037c208948beb268c83b9133b9af9c432c755cac7845ca47ba5425d583ed7d8ca9bffe6e04febcc5b374f02533ea6bb2d15ecf4da2f10d8c01ad4a88a7bad6daecd5a66ba4e0f13c38c61afaf3100a48af17026be56922f5362e717a893816a6d6cbd504c7fbd2c068b5a3aa5d2f2bb2bc1d1840b0d81a420399ddec97170378d18b60a0323bc60579e881932580639ce3bfb6e4cb8631716fe41803326b0e65e235cbcd513dddca8182a9046a8b5e74fef09875750eaf38bf991cb3800f3e3e611e5a3933155514d2b41ab50138ec0be376befe13a5669026edbeb216e189db794969b92e0af37e125eb51319332ab9cee6029465395ef5c2a26fb912d8f0ae4ac9b31cb265de939449ef54e4c565fbf3d7ed769f80174394688fe6a06f3c977ac5e3bdba9f222c0e67116b2b59156217901a27643d93ab3aaab02e42d1a6de7148585fc464028d58f726b21344d196aba5f18ecc1731e99f4a470494d99ecfc4566fe9df8e2f6b7d1ae10a254db2f259c27ac973b29dd51a917faeb0656d90913b0fe5d7a3c5b3002c39d0937c1f0168415f24bcd9c361ceed1785400598519bb249886f80d0c4025a8fa5800ee55cbff79c9df684c5ba46c0faae04896a8a4297dc71b2e30fe8fdc89a5a744e1caac32b915630a11f5fa857823b7f9592b2ad01a3fa8afa79c6bbd12786cad632a206797fdef9865c1d934f8fb3087099f8e9d78748654747cfdab18195056f8dd02fce06b6958d8a1c6914699797638e0dbc1bdd8371f04a55a99187ec54bc016424df0a91f4bf3b448939a5f06ca8931974d904de36be11e24b374e5b4951c311d87cfda86a52a9e1e77b3b574d27217194f9e14a0ae3c8c6cd09e56b049e6fe6400dee422af6d65d8fd055dc1237d0cc3997b0395a90b8af31a8bd48bab28f787835d64c0dd099cd9bea5d0fe1b9e4c021aa6a2cea4c1f7517781fed540809d3a468211c30aa12dd495308fc9044979c087669b4c537bf4300b970469481cf33b8322cce8280b1b621d354cdd4184d2320bb8f1f9a47d6ac7d05300ca9c7d39645018f9406afad6d370c70b5acc726b51152d2b1578ebac3028892c8347ea8a5c3d2072373b2b21167051867491ff86ff48de7a2d7ea7303d66224a497c8efde42a55242f285342e11a3b10fd9c51790c392ee5ae2ee38592564fb86f9c0e10e13b368cecdf5cb27abdba24d1c41d071c256900d7a2a7e14f35b985c385b387485c2a0ede9171436a3c6f1095b27412b9428a394372c2fcdb1672c61ad70ab11e62c8b736f3a30587e1914a6a6eaea740c45aed230b428d1d23dfd853e1a290f540988cdbc6f455b66444a28914c747d9a963041487c0187c1c1b9e54afef856430cfcc6cd09ec0296c1fd63883690a43d2c6c634d9623fa482336c86e767fc563a56e1a08348a4d4433141a744fff8b5dfb2a222e1cbead10374aa6b5c09c621c95d3d60cfc466ddb326fbefe5bd447b98cc95c15ba0f1b7f2b8f01bd45968112d9b806165adbdd9296215d6898240e71db522c05a8e45a749ad2fe33d0579363bee81cde83638e7d8393860cda0ac915e25da03fcf51280bfe12f38785e4a8f266f35fd387498185f8aac2e762f30a23f4c46904f89b38a84c2f865c4365bc6392e349514d3696c6445d300a363741df73c8d6bdb85c01da7d4aa3cd87e9c128c1da963f644bd041fa69caacb0128a4dc3f11d074a19661c104ad66614d4d9b909fe65964d14aa3a819d83b1d830266ef6d38f72ec17b48730c500ff8156baa89d3d1d9c1c2242a430dc7afb802b53c86707fa0349c76925851e9e5f0ee94a1a90d0533dd8d8b6194baa4c045e8b0b18081a2ab3974a1aaf6ed4aa60759d7d0eb1c0728abbed2ef0c1d02a49017a1079250bb69486b416e786544d1e47990bcf71af5bdf3c1e8174c6fdb813b63b285403a641aae0b07d8da190b8c9ee397cee5fd007614851d3d2b7ae9c85b459c6113ee2debc0ef7a2817210587af26f1dd61b6eef953247830c76ba0462068a9b1a61cf141b77c7bf6f759b92f2455a653eb70a327e4d53dfd5ebe63ec0e03346e42ce882a0b6095ffcb58e9d2554478265534ad461e37dfa77a819d10e96fd82a2d6e06cfce7ec9e2742f790def169297d2b802149e75a08ea9d1651882ff55bb00a4386be7784d89aeb2fe36ae12995b13939998cb8b2e74a69ee433b450c914eecb5139afcf1a4480e6105cd21973baf81d28e75a42ebf464ace214a7949fd893b526d681c2a8d6c22c2c5b34068fbd2a1a7d228c719db052de518405b313c78dbbe1614e3d7ac24939d24ce4094a7fe3a4cbad2e19fc701d7c63289a2598a934def10ffafd247eb039aa7c4658b8bdd6478527316149b5da8b2af41a5492923a5dbe1748fbd69a7a9101f06ee62c081c3aff8eb2ad87dd919853b939e5a4b58c8d4a08c8ea6caf9aff75d4f2827c88b14c3c7c56575770d8ed2660f7c62813454828b96878b43c46a5b2a27bad018abebe9fa7c77fb7893e4c9c71aa1d95a7f5ba9b9c14a5dcb785a18a41f6e801fdd2425aba8099091892af4b5beb7dff39d8ab85d89db87871e09836f78d02679bb8af70333d3230c09881777f4be66b633a55137b4d1a1cff05ed846871e0e1a27781a5eaf01d22e841e881539ef3aba434efef091d3ffb4d499ef07f57c3b6436566e27bd52df34c1c90caa1586010b939051c6a2c26bd462050f4b1f45606085082fff7bbf1480b19911af71801eafd49919b38119a581c5672e3da361e11330c23be2b506bdef6bbf265391501cd63044a3c2992ada7001d4a4efaf80f5d9df65d02b874f3f622cd888700dbdafe214fd414ece95304e58bda70d860ddef26d5fc02b1e3b1ad26538940a65a09e1e5e306904106035053d83d92981e7c10436d066d12814a324734993797932dbec9348d8a3c1d47efd08deef0f2feea8c46b5a603ae84b91c7811ebadca3703c55d973a91e81d7cb3f212d1424e0b471880a4403bb018c4a5bc3d26a4646b91948e32b0d0c176572a9dda8f2b46b4fe61aba58545bd8c85ae4c5279bd4578db77a21ae77bdcf845be816f8be65ec5534376941421b4ff45311cac7a0417fa5247086a4e334d4d5bf2ac4f9effaba24918e4e44492d77676ec21c9785e5f860cf0b2f276e767120032badedfae1284b857fabf681f4ffbb3622bcd66667bf8f71c4ea7794bbe4bdf4e6489d9066ce2a79b9268aea46e80c496cef2938e6290c4cc1b1b893e1383e01dd5b351868d9e6f8257e8903b0f4592aade8b13fe23d842ed52c3c557f1ca1bbb9c4675dd81a8925fa0dbcb10e1a823e6ad4bfbafe7b59d6886f7e44bf15a9b30ed5370fe6c2ac6cce310f07e759140d79e28dd9a1fc73030509abf274e5eda474b5f8392e9e82bc36e251913e0f5c486f6a92fcc03668e09455d78a8149d12b9b5354862a43a3de804562f953c38bca13780dc49be93c70e4c09c22ae1f9cb83afd88eb34b43a9de4d4c7998d878b8313f5433090f13539927ab982370b5e6bad30aa1f99037d650555d401a6e869da500b5acc5a3d41203ab974d94ec06c129875c2407490cba3e8c6e45654ed2f2c4bdb55a2f6059d20501c16d9751573293bd2dc067a97435feab151880643c3c588b781ed58a63666be562c1a9551dc09243db5f419222d17c086f02e1e49c79b10446080a5282b1be99a5fff411c59657d923c778add45cca198301647fdc85bfe483233b8944489ea6d238c3506309c57372c22c1f7513338238b70e138455a109c412ce9b68a85b7663b9b2681e10875717d2d24aaf2deffb7cbf04b2b629aaae7354925c595e627ecf06ff880679c4a55103f549f80102fb7df80a6fe5b964f54f9a9ef2a46a35126014edc53a21e0de85c492dac630628c8298cd5d848e369f1db4b1bf4a684ffa6dfd77ae4e97ed96a8542aa9c3e467886fa81d13be30674e51a1b3ef90c822daa1382e0b8dc3f78a7ced51320683b4dd41afe50cd611d870574ad7206b05fb7885f5e53b58737e50d33142f6cc42481e0e8a663b2e5623ab926f0ffdeb6d26f7a6cb32d53cd41780d7bfb42cc5b2e737121fde26048984b03bd1e7cc2c1c980dbc9254358bfdadddad3cf9ea908fb4e8dbe610228ef7945c0823834bb33046fe11ecbf96f0890e72ba9337b2183c32abc4f6d8fd37c4455a6fd53a926ef3b5de169b52e8054a09825eb00db573d28cf5153405886ec37588fd815492de1a119f49de8c9c8e1fa92647af5085b26e033a555c76ddd2fca82da19e2097c6202c1fa03d0bae54498809f8e34239aeccc544fc58d662c34d09770a6b13421555a711b7c09255c60f02483e150c5c32405c3af12773816800d04f17c0d61611f29da5d2a06b6c2060aa8332994c399c3907a57b7632a42fb7babfec50b3fa6f958de6a53842799e1412a52f7d2368fb2e13cc335aeef8c25906dce6bf50cbf967035906623eb24cbc913731d2a1c6bf17242a1960a8f982bb47a4b07924eba5eae212ee8311ac144d5f37c9fca0a485565e18ba1b088a10bfe691021fe624d2888992c0a1bd3faf8a4f3ec85a9a06a2ca4282881acf4d3f96c2e77538f4db8a9b61ab9d1b8001b917f540dba8b2f1d51e0f8614c7785698e8d3484004ebfbdc763921b720780124e876fba631a35ddbd2e9e8d980e24addb94374f5fa5252b018ebb6787840ae6f1a2ff6d4ea118ed902924acd82251087f5a52ce9e63954b0f7963e99f169c95a82d4901644f025fc1425673c02f648caa7de8942641ea80b92a2d45d88b0c7f2ce993f037fa58921caa5d052517f120994dee841d8e90f01a4276eaa613d98a64a68128719715e05e5546bc60c047913186f9ae15a4fe0040fa6943d015495ec08b17b2eb20c18ce3b279d06a0976f14ee2ff91f1bb36447c54553c384e5d0c82b36cb4d44fd00a1f6d19a7d852638a5a919562bd74634ed8de4d1a054835b363ad503a08f5ca1c8e660f7882edee207feb0021ba045f8f1ef542a7ff3cf744c5770ecd16544be029191376bdc2c44b5303a6acbe6c16d57c867532b4d669a9eda34085b73f6afe660502926d784997651184f153eab5cd8047b6f8b9171db0342bda4e2d7bc96bb440b5e66acf246241872a5b058a52ee5676c9c8a88fe0b201baa609e2729baf49602dfc5f69f389d6802bae66688660056944e4b3571167455490a94e6be19afa3310c3ff0f7b06145b951c5904c6f66bf491d13a6c73ec680039fb847c2ec5542b80fa4b20b49b104a0738585dc1e82d6ab3c538c192caea5f294694708a52e7a64cbdbd05631b9ccb8c916f46b725d864d1c942bc638d775e1eb5eb1603dbc85b7cb069153c4fce39115bd7041d1d45eeecc7e5df631b1e01f0b0d67b3140c09f9da91c320d13ba946ddbe1d46e13238dc47d7513a38f0350021c95dade483e69a8b950e1701c7c665af92b36fbbaad8b1cd8114880443b03a69666da42361425d951a1e604cab4c488949a8dc4162b390c3da39418b19fd839d6620047d22582462e0f67d8c53a241155828f2828248eb2b73fb8d6a329f361bef0714ae685d5d7cbd67ae4d08c1e0115828f24aef2c745252c4eb2b76b7243235ad98c15fca4c98465122d91b02980c25240f52c464cda14416978ae90a00fa8e15c55ec18e7779df81a14565ab81ec712beb1e0516461c4cfe13f57c8bd2f552ea3753f6af4294b9d8f98b236151f3a9ced565c95b12af16cb0d61142c774a441793d3d44448537653d444372b9aa01429a33169ca4bad9f0db99c3a80a856d7c08d8065e9a42554943ecc9061c1dc636657abb2dc009b0038a4070774ca45f2cbddcd1ea6b8b156fbf1171784cf6fd46fd4f934929cfacb90f1a7a0403ac011ee78e88383b4f92c561500cad97baf59bb32735c218ef2baa09295c87cf9c002825b8e95ef60799a6a947b045d32410fb75138c70e7558513d9a7b94ac13f0aa63b4fbfa05484fbe7102dddaa4bd72416cc69641217b413b46c6597d3eb72e2401ffe80f98c562d7da751fd9ab84b8b0ca6c3c53ee09ad1cf0b5a734c14a2056c901206e97376331214bbe5bdf91e5955e7974963379482a83b6b4c63c02586775c06384be876980a8233db75b3a146c8fb97f8ee1c3b657f0769f8aedd0d1e28029562fc4f1b20770c4fd028c4bfd132715a2aa8d68006b135ad7cafba801a53800718f4e7804462b125d80930f141159512f276622cf55fd592c06551c4e85a31d51b059fc0879730a70bbcf362d430f3fc20dde6be140a2c711a75b2602dbef84d25260489db5b3e6002f34743f4367f6541ed994009d660be00238ba4a22076ba994c7c1806eb383fea291bd491f31e19422998b3d4276d302801a023a203c8ce91920161bf6b0d4930b1d408075cc0750564b22a7dc1d5f9860ad12a398ae43df821e01116a7d92a421da008473b23305e1819bd03654e61041f37086018896ca59f9edeb4330ec16c95bc72cb3eecd1ccfdb6dd7e1f43d0741aaf264210dc98ea80da625ba62dba112766d5188b8949ee2890588c83c5e3e36c594491a9826e5ae7d3a350230a45a0dcca52a415e905608d03d78e5f38e06e4d7027687b921b730ad3909295a764897ad2c884f1b4a61b931ed03806388a11e2637734a3d409c8c273047af48049ab39120d4f4b943be1c342032f47df8fdce1a00fe223189958e9aaa3e406c91279bd9f727beb4ba64d757c1038f1fde43cac27174fa0ef8ba0c1351c3eda8a870ef291b6da7e6918a37f9172855640953295f6a5e1c1200a4ddfded5f06e333bc02e94f2df9016084275549429da16f08bf686b632f800073441dba5b25218a95a64044457b5669af684f7c61c5e9ad1918f2ebb758f677e95f5274faa4eb4a5589205df935ad4eb30bca5353448f46522bb4cd6b73b7c1922e986a397e281c7fcbf23ed7566c13eefc0e293b741cb724fc50afd7ca092541d29602c51e289de3611f0001413300592b845147ce0c064032a19c8a4d2a6c9930454f01f3d40cd97a4c5f03657f70f42d60223aca318881a1e396ddc79eb36a89937dc111688a6cfc83d9d9f4ab0c244b35787593bbfaf4efa1169f5a0f268744618cd054afe27b02e337a7e91fc0eb0c44d0954ea5962d2128234e2e5c705ad25bb665a8f5efd734d2742e9495dc7efc3779b899226d7099a73fb1f62af4d4316ffd697dc6b32d973686825ac7d7b9187c6352253581f3891d57bde4b4354a64f71838c7390f5acb7a911c7db23988c7f09fd4d87496e15ee74e69cb46d808b417abeeec7f75ca1c2323e73c361c082a55d38d35cf8dde8e0707b0a02c07122c19e4434f190eaaae180825d027680f1eaec4fa891582fc9f68519ef7c6e7b50acbb077f456a00a1b92603712abcf6590cf7a5ec80cfc15e172f2ba4452e13b2c3b61eb3405dafa64d71a467cbcc814b78af114024d96557ea8373f077e3e04509fa69473f086ee89d1720353fa441478a6ebacc21c86d4c11db6ea914bd235377e96caae9733cc43445a3a9eadff5f57e748f531142fc649bfeb5df867884e47be2e34af9aed43df99b00812fbae3ef04d83788720bbd7fc6f80d4ce57dfc97273c30ea4011ff600a1faa203292bcbc7f59365a8a95cce5e9f42ea41933a1ca72d8db8960f204173f51982a85bb10061b4304497b56c84c548de60688ebd651d8625860c5077cf26cf2c24ecda4e97875cec8cea592ec24076cd56d76faf382c827b6c687b7873939fbdcc036cb3f97341314740c27dd272a8a43ca6cf52abddc423749a3b10385423c7acdee2afd7a4f1a21dfa591239929a3e0a8c7d45678d40a167064946913579884b2e62f42f2fcff68fffd2cf05fcac7c41cbe85a0178c1ae667035ed4f095d14f9411230329b487b5b349c367d4cdb30f38a67277c778d4d67f42b8a4ec9b34435e86a313df3f5f30d0273bd8e4aafc5943b17010f363879ee3c94d3fc39f72c27ff53580de411c5b686a16aaaf0d3eacf61552a5380c3d2e97c1de9c0edc0fd02ff6dc2e212ba5c20cf78a4a001a39c589f1e25bc0bb506e999989b6e19c44b16f98d86179da0b9d9f91f5e36f589c8e272618b20ce4361178f5cbe15b14a8a9e8cf260194701a2658016b96160ce9858aa1313d0b1425611a94d2089a55611b4b576033ce44fa6c8767fced849076fa1d7adc48b4fc062b99d3900ed9510521abf3e9f53cbd43059249446c3c2d589130b9ebe79c423d688b94f91b59cc8c1c4faadb1a5cbbb77fbf8fac209bcdb850fee7faf44df5dd197af44a8cae568749e749b3fc32312d9ddff3f01635423f677b8ca291ee28bd4a8741249fbb9d30c5709b17297c4ae18efc0fad0f00db08392100cce618f47c2356166ba18149ad989c7d043189c18f553a89ebe312f0211f2685408fcf36cb08b03d4943328cffd7aa3aa5054240089ac038e304f4ea99388f5074472e99582611866834a951ec5c8dd683f5f0424532f0bbec7690de72f28d9b9888626ed1eb038ac79e4bf7e1b976c6b28d1934ec0f2dbda7616c0c0f12086fcc5619ed9ab59b241474a0244ea76ecd83c0cba45cba45693e6c418ba3878bafec30d0c07b00bd0db7207a12c80623d08839f60f4a390e020a93c1d9b43c3e493bb0a76142cad280ad64ac0dfc1b169878fb7a221862728e897b8bcf5327d77f70006270acba3cd14674541fcd1bb64d655ac373c4af7ae7a324b53e1fe100c51d82986e954f26959687c9d2e67f2295f788673419be50b4fda3748fbfea585dfc2643c74833a5e441847e9ed36a3e79c20fd2bf6f8e38017c503ee7407c079fed559c7c4a940af76e8f8c087cd8f8d97ce2d0fb3ff8f9be6261c3f2f86359a3626d84dcadb16a05b55f1a892285611aa3e91082898f75d873cf16831914bf35a92fd1685cd0acde5de7f1f289cc13e3d346ad212b9343060719932b8ece56014855bd20e32533299ac63ff253d4e74626b1457f2a5990236544c41f370d055a30906ab6c74cf09da6762d96057c600d199e5d9f8c37b5db67c12c3775b1688c6e48d170c4254a0b013e0ab6d8a86fe23282eac0cd1e43859763f83f045e2e8f0ff51c39dcc4ecac6f945f8afbbefc06a43158999f4935466c8ed89c2587a0157e2d26c4473ede6292322e6e11810d44cad0fb63234c6424086739ebcdaac4ceec56b4a25408a15b132b27cb03666960c0877470a136d0d0540354debadaba2156f8ce8ab2711230d85b20bc133374c361be8c6b1092805c7c19dd2089410e7e86727bad81b97bba4fb6da6439b287ade143be60c0bc1d92205afa6d3e7b7a34f87d742eb182f60b9db5ee283eb31afb1b8354dd723f5b9a7f5c2242e8c705d5b32b696e5f2812b5f9509474f48ebe5bd95a76bf4538b4351e736428e9025d0101ddf28d57496ea12e4cf1d603643a6ae3d11048acd2f56f52464bf1fb49a313396fde52fdb8abea8510663a4a2c7a1e72a3298235f41e23ccb66bfaf925f979080c73320bccfb8bfb5435b647b2cbe7fb61facb9cae926a48cc9de11cfe4fed76cbb1bd3632f4893fa480158b556facb408f77b6893188de464046ac00c9566d8ae958a6b8fa0c1b3a66453e13854c85321f389040cd367035a48855aea86695cbca1fc67ee9dab8c80c359472546d884f0a6b8a9309ce13bdb59e639d4e8efb78d3bd9cc27cf746d6eda11aa9f2e0b68782e0faa27dd31db38eb49c238de771b457c38892ed42fc6c1b4d163619f60e671ce65f7cc323b3072f8d68db1a9e5ba61e42a3133c8e41aaf4d8d714e2d74b1dc8f901bf367d4b3b74a9f0042bcd42658c3a596e8a900f61ee10294a625ca1728a94273ac3faf8f261bcf65d3ef7dadded34b246624b82a4579d41fcd6f898388de0e51ee075143e2eb00519811718306cff5d57565c78909c58819360fa8b4611ea61c1171e1558206c1e4e77731a143cf0bc1302c9d1f2beadb1e2b66ea2a45e812a8aef13c9ed5a55a24521249786ef0ee1e074c91dc037a25fec35d6c92451e5aaebb2fc3341062899666ca31968e7c6c9094d72ba9829e0cabbab17324ee416cd852c5405909abfec57375f8c36c5eff2d511ee222a7b4438ed249f348a68b5560339d1ebd4eed9088010b9120b2e9bf8ff2534d166daac503e95828e45c1d5a7c57026ddd122693d749d7224a9adbc0eda0c321574a5c20b17ef5bad6a7c292314b4f413323bcfcd15d4c3f014989bad19d368020dd9b02eb83f5975c68a17612d9f9af8fcc07d6ac1b555e32ab1bd450b02fddfde09c94d26f6de82030cbf2c2c0b5825dca086b48daf0f234e5c4a465fdb071b99808127426142cc1c11a1b5a565945a389855d07e98b1e553acbd8d1c29b346835c440731024d4c6c64990ab4402814beb87d59e75102086217088f1d23cde8d549cb480998436acc40968255722f2c5dc535be8d113ae621ff1bb1a8b13576d09314845ec528d98f0557c5f814898d6f2ecb238b3009f7181ed9cae1d5e15178ab2c78f04c17b88a9ff7ef794558c63370ca7865b91a93b8a60ab259cf2792211ba4f6acce88e73dbc820eed992da8d365d004f35f2e8660701821be38c107c5493b16fca105a15ac217959b39b83793578046e30ee6514d0971ee35d832fc38e96aebef7e1967f9b3553df71e230dbe259160f51cdc9a0c55c60f63b4ca39391d6fa9901b535d20837c6de112023b8c7121b5635c8d8b5ec556292bc7a2b85c8e69a1192bc4c3f705862b416530b8149c63ffed98fc8dff876fa21526450901bafe1b588f2e80d5022a7b99b31b4b0fead3fa32a70b601cb2eaf3b205a9fcc48cf6adcb370a20f88cc016741338aaa98e9d001142ac0ee31f568b8f9268699f64313b22cb4f7c7794f9f55595d863399710c8f68400dc4c4f4d18ae0505ae9524608e1893370e4eb2a5c74cff7729faf308c1e06d1180de3d48b982a38d43b8bfdc17ecd4c7349a329b7e64e7b29853f48551ebbe43c869274804bb2c6529d6966f106a2e1606a5c303eee0a47bfa3aaaccdc1cbd0f3af68b14b19f4189946ded51cc35f191a546d82cd09fd1b7236d8598088a5d663efc226166e76688fe2e60a1de7c108f07332c1ef84ea3e0406c2f3ff8399c9dc6ed681856a48c15459a4732e8221011e5fbdc608ce420fb3c4ea8f87779c2e8dbe4bfb31f72f6e1ec75aa410746e01c1065c13b6545c540bd87cc3527f1726ae10ccab059ee9829c7bb90da6ec3d6b2ca8a2a52915d2af6c932f5243d93d6867740b289e480641120d7a0df971017d5a6e74695c6e2dc515c70d1e0db18d4bbe1958e5b627a6592f5f88bdd124f35628b3825d26ad30c058746748d870a6a9442fdfb7b29520a2626bf89a4257f83df77b9a5dac980ff0b81f450a3340aa7f484a87a949e5ee6c14321e0f1f533bfd759e4ed3f7962a653a811439460ba243e353caa77262979d0a3019e105ec7ed053112351917246045521c8e408bb766310240afe616cc6769c9b7180ee194b0f8cd5046a6895faded2c84187f8fcbefa9e53d88594bef08173593a8b24d62715f54621b56e9c5de54c4a87ca48cda10c13154a9682d40702c104f55890ab034d14ffbdd6017ddc4c2bea3d4a03803930cc1c157e9a959b3dd9898c77efb09f4f20661013ef1b1c7f4a033a004ea2043078e0218cd9e60623f7584a8302eb546653a3ae78e1bf6c8917878d66ce75033caf18bf0891d5f4fecc1a69d6e55fe1641132989dc91e6c095ce93d9a527f34cccab22b82716bebc09740e51ed84ccaef1c122e9f970eae1a94f769f46b342befa5e7424307605205919ea90e1f7a0dbf3a4d28e65f1d3ca04c957129c64e3b6420463c8d4dc6800c830d3bcb963ed535a30610c7a71f7c51687c0f092576598d8931004b44f01063aa77c0c1f33f75ebb6307ea59b1727877e8c104ea33a29cf164b4b5a0205d56907bf6db7f5ee45fcdd79d2f15eeceee2db3e458841ab122a049578e6c31c69b35a350db543d39d75af890427e30914f3d5c540da34dfb6393218fd76203f2c614491764932ec90a18c138b2670258320479bb0d1cd606e345532564ae953ecef89e7796706ba1a4549be570cce8f6c281a0805e570c74df88cc77146790cc9f709767b52329c7dfc27ddc31bf52f1524c3dd8db6f99dc02f08e6300403c7ae1d2246ed46d35f4e60bbe8887531772f4e4c3f953add4f1a6c0d8a3295a300912a36b00ad048981b0f4b6e2248d445d5e2fdffc0006f490f078eff3103d1b22dae8fd4d787369404c812bdc1ae8bb4f12159d87825cf56dbd22b5848559e1412804c2c1f84d5eec48d57cddf3ea3daae01538810f86995be2b22cfa180274e97d3910d05845c8ed00b2e2646d24538c94d6b57ac1142927f25ee54ddd823d2bbf2a0c1e35b4b485c85fe4bf0e6ab2438084cbe38cf3e5892ab8f4b42e0d83ca9996de012fc136086710949bd892e3ff20f4b2fec76c1b26fdbf3e8529ff53fa6f584133fe492df2a685058b2f12302d6690cbe3c23857c4e407d85e47f9e66c2ac231be138298b39710847e9ca338f5c57ced675f4d7a0891842bbb8c2a7b3d534b01093ab88562d684a6242417f3b17db7b0d9dfbc3559a514aaddf78455d741900249d7738a7b12a5395f3055e01c0cf7c1f9218747092f0ff753b03cad2f6a2358a7dde355948485d20f011f93ca34154a93a6e2f1e79a7a4f976d1ad1b84318f49ff4b4ee383342456ff302cb26e58e70a14acd3913f30b6d3124903565e9577133140f09893e952374c3ad13c5b49e15ea1edd8a58ce7fa4ba4d0acb9a5d2f5784bd1bcafddb4a311ffd6cc322ea93eb86f7e19c4432bea86161598280cda6c8e61965b5d53b7789525142a447570aa874a20ac0a04b67f9c222cde5418716484871559d00b0bc1296d25159f20cd1216fe0558c8a5cbc2ca91944431c4fc11e364479fb1480d6a3c4d5d5338832355283efd365433ebef58a3414931815219ffbb4107c8817b8c553648a31facb61863c3233df7d8b83546d6cdfcbc167b30114ba4436ec645606a0266c556225f2d07dccbf2398045a6bf1c45f79410ad0cb4ce7c5841962aa00bb797c60acca554687b80799153bfdb51f781f0df387fc0bc7cdb31e507d40aea310ffc08de8673cf0c0664b2d20c8dc1a1e715d0ff4f052d0d7e0be4a3aa2218f982bb1bfd4510a74a4f95dd744230d2ca617382a0a24627099f39c08d30f68c5d8309c8ba2804ff2240ad35eab9316b104953ef3963ac8c7bc9988cabd4e4b21040a181f1506706f26b9ccaaa4d41e63461849c494283d1e3396ade895aef2abba39dd3f154376fa613064361c94dc0435ad0b374395db17635bd4af95c110189f4425ec67658d59ed9fc4362cf8000f8759679689d6093514a606a812ab55a67300153ba6d37ec51c282072f1fc07c88398878c8ab3ee1e1653ef34893df1a419291362714e09951e83dd9e989f321e002e0efe044d587a665dd031e9cfe219a4efc051df94c1acb29022708c6504d89395e8cb5e14e40166e5a8e09298bee70664605e34fbee761b78e68bd939e2338955fa92085fd53de16cc22b3d8a1be709b38775108b183aa4963b0f0888600e1575f0575c42a835eed62227ce8d6db6a5f876f5a8d7c4c5ff96529a3ecd0c666613c61bdb0b6e230a716c712fc48038d99af22e3f31c110af2a84345058715d92222a5a5feae614196cc0d106de9e5c3902b3e6df150681022d8a6e827bc0cf76138376f79d358fc78a25563163239b24524aad1e595e3466534caedb154a7c8595f650eb4f355ec95d541e7383a68da882265497711c078226d8fec9a30fdd921946b8d2c60927ebf208fc63902f0ca85e72f8415ffbbaa96d4e6fb56988114a42b5a03173c963f8e34f4574830172efc258315e7d7ba92287e32d79250466471434aa322018a31e4c4f157159a34cba1e8d2ad19e82bc3b011161d95a8959da3daa9f46f2efae1129da985560644c77b5c04de98a730cef611b66ea4f8ba222722a00191b0790368a942cf73a21d4cf26f837451c013734555a84b72deaae38744a2b22405026a2d0b677aeacfef2e407a1ea07282a6f6c3e4ebe6abaf342eba52a442e342d38ecbf405cca44ce7cedd0f3af307749cb7e95dbff4c9261457e0d9c686c5f46f5fe8fe384b2d8c17a09991892b86b7494cdadcb72e78afe44e1b862d0bb8dcaa4534eab540da915518566da86e0caec121d056a0f1db1bf3acaddc9041aa768446f97043d01598d26df356c10063e30a9bf6a8a21589408ddef932809bc2cf8e8cf03db5e1c8118223bf02ac0125e0204f4f5a7cb185c8eb8f39637652265ed8be8c4007f78503f5e8ead8b9e9e0e7db02c35ca378086ee076af0492c708db609924a80e59580000a368cf888cdd38d895c0106de2c24daea3f5229936c404d3e30726f18b1caf69836146b1106b6fe428700aff6a4a06276098aeeff7e5416e8fc62b621769b47682fd37d352e72008ad95d13d6826e135d468cef1deb67fc6277909e2da0ba8f0a509a01f8857596facb6c1984ce38abc812e43c710d6d187594cf677ce40368af523822f2742c61c18c62d4819727aca2f5f1295ee4de7052fe7458db5e7a5994c9a41cf3578bd65dd63d4a280495d8221acb89e3ae0a8b315d90360631b3a759007186ea47ab328e592a70e50908553b343543de48d8ba881e0c1c7a681129a51772e6a8ed995a9bf7d60936b3fadfc8872b23dcbca4b57ad260aad8e5563a222e89b22463238f82f65ff317d420b362184b01cb5eef28a6e675145929b819c046bc7172a1a2658270774d7e8d06aa1a2b189f8a0683f9e4ca99a41ad94237b9bc7850ab29d5d64d89c9085ccd889294ec3b1d451b505a21b556ed946e4929d39cdbbe895ea2bd8dd38aae85b3c3fef9cea2ad2a2a8b729547168127c2b3b42a0c895044271607d110f4fa4e7ff52b79b206db45289e2bd21cb9204faedaa0e207175d165cf4a2441011a081180b78d1f2decc997e70144a602eff2c1bd0b6ad0135a30d55ada2b08e286800ac096c9d9838083fa2b41c0361a4ac0e069a9e46e4594a4bfae27acf7291afb32e40089fea1eadd748f817b40ad6dda229c3ec78d0696f780fda7dfb81ad7c9b1ce4683660a7db797eea7a00a1874aeef1a47c4e3f6bb74814aeb95c144815fb1edb767c5d484e4b50f3af23715868c2cb3bed0317cc27ca7143c3065e428d06933b4409fe8394f7344314f5c566aa8b55dc6823a4812d03bca708537b8bc9392ee0861cacfb8585fed01a595f619c70c080381c30034f327f75141c597ad7bd2410e2b760fa582ae820b1336ceebaf7958a57151718d57922d5df4b9264db174aaba4af2d6716449e83023e08730a66bb2e60faa7bd3c185b0ac66edd19494ae508ce3add8a944431bee1d6804f12e431b27f1725b45498fe7d834a5b47ce295e3053a1e798385799b6646ad7be246c433024b13722b7b0ffe2d1819ac408734d8e4bc780f6b0931298693363c99e68cfdad196cb56e21c4d90e0207f19701b24422d9a35742086c71d83f76c55ac016d14983a0d66c0f38b55f7e0eb3146b36c0e244396dae4bbc426b42e4052dd625d10691c1df3d645a01347330cea9da0ae47cd3d2ec79b6ef016ac1250665c0bc024f6270015a16ddb317b0ce4efabdac72332fa20c5ee1cbdb234834ff63e7f291cd75b0047b0b3d21849f1508e823e1cc36a5a771beff6f41a048affa0b1292b13308c98686b105f33ef4467a547e6b40c5e91f1e19650e9c4095373b6075118e5187494ad8cb0aa8b652578618a2cd15172314183d39c7ea3693accf65d60cd485750bbe2390b2a41bd7935f219781bb1ae312e332dc5a9551770ef3da9cc18fea40262e75c615c81478091d3d230fa78c60878c65edf35be60e32097724629e75b63fcc586a9a31c3e1d7ae733e6af452c668d1984a647add56ce19f8ceafea522f38d182dadd41c2418a82198dd36bb39c955e1df1edd34c128e6dd64482d42fedc86f092677c9a496268f6bf083f2606d04f95fabc2a9fadd5f8d1373fb75f0b5c853f23187254439c1af7f65826853a1f708a2cde091595545b5c0ecd29366ccaf67122c706ed6815d6f7204b3499c5a7fae7f12a208d46ccffeed6b839ada70682f419b7041890326122772018325dfe81ad88327eef05415d8d9aee5c79d6f072341335f192407e8aa28b2f07f7df247a6ea55578e682059b21dfc10ff9a32a656666da68660841d078563b0991af95a1ac43315d7058e306a2a30b5b453d13aeb96501356cef3b6961daf6480ccda6086abc98fa214efb568a6fa9908d7d100cd8549552194665d19688794a020069e9d1a1af2773dc8b616d7f6dcb23d3e9e16398e629d8e44408efed9ae18b72806458a61a4ca1a79b517cc676353d67faaa99f8e13a2697ea8bc4873f555eff101f48292b15611207b55ed6cf9882001fb8f45b0fc4da901e9a50241f860ca87047f8c41296b7a6ab7be206841c60a8a8d704985ec23be7bb812c33d65a894f650252498aa6b349d1d6fefeab661631ca5ff6819a32e50ab4ff81e08c63ff59876096c40423fe676dd7ea018c42658f055b0e7e131ee4a99aa05d02737505e9ac5583c7be063693744cb41bcb903ed4c9a5202a9761481b0101d0d5731e2c4131a6686105241057b44d8207ba1617c1ed41fa1ec5b4c357e9d7aa6767e0300b63466277fce2aa299aab550b32cb3892056717c000b3397eef1b2f4d7a655a7dfa1267a34b4f5c67386ddd613872c4632119aa4b0e0bfe4a949b58ce38d7b7d5f8f9574ab07175da1df8287b72286178dae578145304c210167bcbd64aafa6d9d4f01d6580feaa77dd66721d408bed1f770b04b560614ead1ec5accec125c78e1dbc1cc264e6bbc4f2b2cd05d9ab92ae8df35b53f565018f05bff7cd8bfd44e3e564b37f5dbe4b9d880ff2a2af8fdc8e2ab9e31fdd24a7b91672fd251a7d615340114dbcd5d213462147d425ba1d45bed0baa531570fd63ccb1526a84dd93ef37b28a76bdc0a55a1b40837337708dd7aa67101b38009623685a2ea30ebe65638415024537b8f6411354cb774a6ddc152d4f9bf08760772d6f82436594ffde49ddd020b381d441deaae7b340512f62cc14f17273e78cd756cc6deec2a956bfd10685d2bcb7b867e6684018a2abf82841a1eb052fcc4572df46dd474b5af72020ec6ed003a251f42eea7ed09cbda5f6e03de3847d108630fbfcd523dbe254cf60024c20bdd621f9ef752309c0c2937bd8471fbeb31cc128fdefc9a5e123158e2932dde031a7d8b3269836ea02d4f09d0cabbc752af5260ca8317d453d8c9bb3789db69a34e1f070ac4263ee9a53553c44696bd91fb595296197c2c80e8f63c1ad24b34374adccae4f79bee962e46099b14606d7ea98db23fc0f6d19b0ecd6d0a622936cf9ebbdc434b2f66ace6c8737a1af15a10ddd9dbca46904bac021a6106706cd0416e3f1203c1fa40e3195fa4da198c345f23d56d031807defb50ecc96b255cd25c0a8ff1086211eb33f1cf90c2c3ba6bfbd90e855c10d0242ecfd509cb49f971bcb8a00c28d2c7bd1f988e2ce9ebb74b4b355360b5008131a6cbbe12ff019ee30b4d5a5ee0427041e596555ea7704b86199819a627414ef0507f92454424853f5afab87042d735ac15c276feb9d38514e3d736128004ada955ca067a2eced1aa8b990e952f01ee88f03305f0826cbd1cfc40cc8d6d25dcb2bf4f980fd2a05b7132c7e46c9209911d8fa4a183e32c4e944a7146a29b7cc8241d4a8c13f326451210bb28bdb83304ada288ef0db846365e3dc2bf1739c4e993234fe6b21eab5290f0da895fa7350b1d327bbb67be456c025afefb3dffac3d135ffab55feab09b46710c5c9348468cd3b93224815de79cfff281ef062f045540bb2a3c381525da0fdf48303318357ff16cb8106945027421f90f293d4066a05f9ba1c9625f1a928c052dceea3a440f4299fe26018a1d8143e35da868e572b1000548bb72c2b148a5e60c9a34724041350e9be2c146bfa15eb0508e9c6b3e940c7a858333eaaf4ad0088d1fb148abe36055f0fd89a2b2005f938a3d2b70d775a35057db6462bf74d491e46bf1de7ce33a9790572af0f148caeeb841c48678a1590d36fe0ea40d129c6003e5f345e2cfd0fbb927b54ebe4c0fa70b846c760ac90faf87f0c3f2620c9484863595e3e4c434c54fa49ea6f0fabb62995223943b9f66acffc092e430c07be273f10503024c6299c409a4511cc07861441938a69e02f11dcd08aca566e9e351ad2d1e0f4694b63a8b8dfd0006762ce141853900ddb1aee2975f2d400074fedb4625f023dd756442ac088a1d2895e004d12082a6dc6789690435887ebceb74da86b198cf0a6f019b7389cca9616cb8883662e4564561384f362c1f3792835c3c38b3aa35a9f7ab5eed510e2f06e561d3b937dcea4b5a85c2b0373289d742676aa32a421301a1c80643e68865c02c2bb0013b6b19d914c1a17a2c91a1a916ffdf7ece1096531e7fc83ed4bf20e34b109b3458239b173063edcc7d61119208093f5ed8125d1bb8642a12f0ba1914b783a8b25012d434171b03eacd1c527421b01d9599438654961d119d211873c93293f04683e53224198a045cf287203b4eb18de4690ff8faef85d22ea54b49553749182023e4f3f7d30490a0ab19f1b003233996d243d5808a4672c3de8d3d5f35c877635ada3d23f5c2d4428ede9c9b8111f2366d4608c125e4baa7958bec4de8d7cf206a4f27651b23eecf9b9e62d8b3624cd74a2246c9527f12da85fadb2b08cf44aa78e15ba2524563258bfede329d3eb26dbc8564e9625b99306e3203eb583ef53792a45db09d6bdff660c2beb03338d7118aa063c03fa046d99fdb686ab3b21f01a2dfee3aab8245a3f9cb9336466ff176ed2b60f26d4b8ec6ea8285a0665be0f20a4db33305edb9fc22d6a78b56b0151deb719e42524dd819f7b332a74382ad63bc6cab69d260125cd9b8a426383768ecd88d180fb9210a921e17dfc93908e0db90d395fd04d870ed932a297c3e3b7a4188bc43e0419558e41f85797fbda6bb77e39b45097fd0fc16968ef8ae522e1a7264dac444a2bd0f4d4ec22db106d828344d37d1565a1fad795a36087267b390d3b7753465666e7eb91ec7afaf048682e17fd89d25c712d518f8d43e84cef34cf632629fa2cef7bf9a43c8fcce4bb631607b67215ed2f59c6e9ab305dd8cf58a980bc23d4b8a0022f1025a086cb8d9222332139f24b40a79a0df278d70e38720a1c5fd8c0e2fe204b6ba7b9c88c34b4d163763b439ed7a404ca1d09565e3fbde52010e8852d11f0eb7d47812d8c9f80c884aa240103eea78213a849edb1a4bed4d3194b929e9ea7011c4791776d7bad1b4a16375e1f4360e0cd5243d60d6a0d2a7c5abb38aaea0a4919d18135733a3ceea1dba37349d09d706f548929d34012f322d56fdf078d4029769dd71448c1dc43564051dfb94f52a843247bd320bded956caf554dfd85fdc991989d12a53bc1eb81468da0e5a07e089b8b09c8cf212415ec292898f7275acc2ccbb219047178557048d890ba85362df2aeee83e74de3b9b2f54ae8bef732365743fd4f5e150e5729446501d5c84538dac530d60c34fbf36b03f8465a2bfc1609c251465fead4ae71a0628c4bf401805efca8c32262c9b0c851b3a0d39bd197610857403b4bd7b6af10e43d586716e70487cabddee304ea3e06ec5f15dc544ce978d55202c563aff6027ad16ac1660856dea9a91b079e18b3c1def01556243b89f38e9aa61e67d39375463e6d23858e7c31e73ef2678272c6d8d029d4522fd1197916058cd41e73668236b3e0abe2300f19d2cc7489056b57c45894e6aa2432be00690100eeb24b9f047db98191e67138f83b635f8bedc2c5b2794c571cc65d6c4d20c46064dfd29595804aa7bb2041469aacc34baa4b1e240b203123d11b41d4fdcf726fff5e88f807b67e88939f11104cd507bb3dbd0e335ea1fb6c206173afc214c03c88f5db525295f8558742501ea252ff895fc5d12db02809d0322f47a868fdedb39449537bdcd6089a835bf48e384c388564c7b325e6b0c20329b3d361340e18aa12c56bbeadd3c5f1c243c9cb3df5778a22a6c9ab55189860a535c085790c6ce5a9c9a7af05b5f802bd04e71c016250c3c350c3fd0078fe3157c03495cbbc65cfdc62b6bac8b35deb2f0cad67d2a4d604a4d55b67e2f0dedfd7fb30980ae7b185067d1fd04ca80ad38fe066745e09151f97a31b418d1c377c4682e6e4926b4902d9c74c0d4d4c98a3f47a89ef86c89f8cac2e259e79431333023568220ad3645cbf8b470a6af254a00125669d66e718811c7ac785e1d8ad8a9928fa43bcd4719095ef7cc26c860d88f0b034793e8d776b775c930f1c84a4f279cc1d7263c0c94ec4c909098c546e131df07e36870dfbe73dfe5b3518a57568c0a2991cd56cc742dd213ade0bf4caf2b12419cf71abb861bb5c4a9fa915b0cc0e7a25cb340396bb4d2cd60d1dc1f3d54ee46cdd13cccc18a03db72c33311ca03cf9769169bfe27537355fc8db6c379be26d1522d439f796669996262a508bf601be8e20e7a74f129a603f5545189b0164e4563f5bcf97831f93122db697506dba799107d69b21719a2a3460110c468fce7930839294b3d7268fe63de89128243e35faa6e78c73d4c17f0a29c1c137f2f39cd5eeb0cb76498532d2787f746112d55f7019bd06c66602b18403534b32bab2a7600881d25026e1cf711eeda544c78f962e39cc3e86c1366fc6c2ce5d887105e1c92eca6d5ecc42296dc97c332fb0ec7145463a2183dd8654e875ca4ffbca284e0953c0870e9d3072c3e7a897403e8792646be44f1534aa77ade41eb96e9d5d8dac97628255b869335223dc46ae507021a141ac1e323fda5234f3a9a9313b501fda6e607990846aea34e69e5202481b88420833aeb35fd58f3f43bfc9564190d59c05389d90e4530960b6c83ec0ba54df1cc62b784c6424e946672e3c12d7f5dc6673ebcbc90da85d8d74c9076e4dcf0fd7e1c5906b15405c799c4e00702a6541ada2414ce1dfca6ac0a682c7209744ad60744d5d3270fabe412051310a9ff89f9a133b004d9d116404a195b2d06cc541a23a4bfbd8aa93e2c593cc28c66d959d4b94380bd09899f944d16ece81ef5a708dcd290e6c4db7148141e507684aabf4f12f792dd639d1571c1f4eab50b6b277a2892779df1a9e30fbedbce0bdfd2f13694d0751a452d8146d43fa6be177ecb7ea7f0efb338b8789fde96bf050983ecce49976e42264b3710336ff85833549c253fa58e1e82110dad4664b9ce5f2fe0fbcba28fe7b6128757d298154c81174d19b29a2c1edc4468e5e25b56f8a6340ec41840e2bc2491387cfb18d889beadb9c40cd0c3a0e8f29e580e7e7086b57052fe639519053f2017c5c3ff4c51677d9ed8f209a639511b11dc7ba4ce75ccabb0f0a33e30371947704418898d88469bb1d462a898466513a41592b84d66244ca425162bf475dc06fe5a64de6074674bd62256b82709aea1080b82f2b85901d1762c9d2eb0fdbbecbe43a6048643b1f0ed65dc511e33d2b7d67562bf32dd7c991530a44b8a03f85993ebd4ac1a32c98e64fe30784dcf078332df842cb558bd677619250dd76efcc012ed493ac303056e655d027aa40f00718ea0183e64c1001493518f31cce6a7c76b90113ca62f5187197219fa0748ebd125644410666ce70d0ae0221af3db1110d217e3a9bec92a998bb511641d4a3299bdacdc9751184a7f67ff014739171ecd315f0db80100d92ab08b6224e0efd08d2b508e385621b859f0ee0cbf44ae2630dbbecd260829b8165ada8a120d0b5a7503cd26d29e3930e00cf2264a1f24bb7038535c001abee20c87b2b49a5b201eb8a2a5a6f297161b8555de6516297b4c3d66da473f544662289cf1551152268f912c1c9c5c2ee419e15f83eac8e526cdf3f3b8cf12b0a2d1a99d1091e33ee5b7928bdcb35d7db1c4a3714c222202eec32494a2151b96ebad066a0e18bd1137bcfb157d5a42b108ec3bd88cbe0bac4772a4163bc633fa35146ea996d2a107ca3c56febb4d1fc8b326b7ce081716cb0125fad15b5eddd8ee09bc17bc5b1e8d4acbab5501984ccd6c2e29f5ffce5e15c5b5f927728ff9927a04dd6d38f1382bf2f4a2dd9093389b5fbae5501cd12bb4a8d2caf18a625a19ab872091052651eec5fdcf2c1ef675cdd29ecbcefc4232e1dbc77719d826c391d2e4e238bcc2d15d6fd8fde830ade9c82ecfc242042c3948d844f467cc25f26b35ef27bf098c716514fd2e9f9a3ce46743065a11ae3c66fab00d4b452a8850f204f8d9f654eca932822a66b35a23d676a70d9b78685f56d11f6ae62911c217a1b39bb03835d030c2dc675cebb43b9d82f7c8542102ea05e9935acfa19065ea00f2a35a3096f0771c647a20cb14b92d7475bcd670cb4fa5f7cfddfedb25c9d4ad2537376cca37cc6506d2aa28b15c8b79a06e6bf6c6021c0f2793749618184c68b2abc63f467518a956e5116ea452873373dc2c53141bbd4c044e2b0403584b2a7aa2330401262ef25c20637dc9ba32d2c66b840d392a8a55b7c34719bb2a52d13ebf8ffb9362253734e148250b518865aa76f5526c2f635f52c5df8f922140cec21bc75ec9a1a638b10ea109a98319d388472cdea01e9e09a0ef30a7681ff9e76174d5eee00947a034c859eacaf2611ca57f7d1715ef02a5d79f8546b8895e3e2537446ed832ac999ac240f2d7b002c4d91741d0b72d8628eec47c8dc8116a22d76b0a9aa9fa9e61a0a4d850d7921885dabe0e0d71a84cfa9b8030e280a404fa3ad84cc1e045ee1b558b27f6ebff87025885b44703b77e740f568f4934ef884ce59c3ef3801715b1ee243b3a30f800951dd1b30582c91cf22ee59d7f849575f3f8128f49980fe5c6ca03f177cbd0faf2d1e6172cf93504321b93b7f5c50aa3c157bd8119d1b64fa6a25115e4dc9400e38346b218aaf7df05be2898b5d1b01c42487a1c0a84020d14f5dd71df006ba046b2a07f2515f0286bdba40ca6563751e4d32b458c6ba3af6320014a01376a1cd078a224ca8f8e6a51fc256379a2ae89a4d902a169076f5b728ee11d3ff3eac96e606737e003af8376d3a1348384c24591f456859ad235f869e285b032edcac0a93036ce8b0e17f23863591d52767b59d31a91daa205d605922147fddbf01ae711609aa1058369914ee66efbb8867a23500c36713bdaf0ae8482a5c2c779f75406b98f6d257cb93796df3b17576dcbe8c48111730c00f75529a22a2c4427f39c478f501a52b1a8e0c7cb664dfd080202d3e86172a178f351b92612c9b1dade46eb16555a807bec8e07466d004c254b6044dfd4aeb888cc00242e068af9dbae20dc6ea015cb3031a0c4faa5420ca703a1d0f066d54822641171946b47507ad029e8549a1779794812c50852ca99acb720ead9779568bf57d1969db560102c1ba6c6778afbb9377a3a6b94796bfdbd16f534c23af7d662ca631369bec2da59432d10b950a260a67e268f579abd13667238f94324a82ded4ecc081c6250b180554a07d9912c7ce9a160de07213c3c40c15356dc8e4c061d482511bcbe5a36d84a96266d1239ca1bf336f80dc5961b492864593734c1824670e23725ec8b933e60b961d179035287e5c619b93858c8e0be3436d8d991b993232753d277b2e1f4489d462c7eef48d0f81cc193a4ba69cd181c366dc29264c0ba02653f4c46d41e943e74cd52fd9884031e5a8e34e8d3a6d3a0c983c20c8f384edcf9d307aaeec0de646482d851d2963415274b903060c99ded740a608731664859b1c3960d28476b977e74967858d3f7ce00411e285035ef0b429a2a3870a2970a51130b32b695174d47003223423248b8fb0e3169af30b98261bb820b3e7c899b3326f6c987480094294f315a73e72e8a009a991c46b878189a156a00fdd16252fb0e6dc947149f1e2c5103a491a6f7780fa9f1542d8e8ec1892e64a9913230f2f5668b0b945d2e0de8c20e264c699990933616b88c4f479d325c5598d17d98b172408a0fd109312034e720616377e946cb5f08af1d6a30b1c16f4ce0c2371a80439b224cc4f804f1c254fae80fdb972751cb824683ffa68c12386c4051ca413a61ae017da952326b214d98c7181ebe12b6185860f2b57c6885129b16091e265a2cfdb9c3aa71b1c0a23117169d0bcd85263cccec50257050f5814b02957ce2d5f9003d00a019136b917466a941f941d19a10f9614639c531bbfb829594471c2a58a9f2e2562ac8cd7b831be53250f1f0f215c68c489ed68936cfb42a65742851cb12a78ea548ce0f38dd94fe5d5d8110f0d167d6c40394fb62f6b74c00811c10b6c479b3c3605cd12442b1b8373e44e193579ad0950928a392776a8a0e2048d39e7c879f3171e4f3152746dd941064b912cade54b0b366408b2b68ad869c36546af38c00834bac6ca68e99344ed8b8920ab3178c6e008b91167c71d93b6ea9dca73fe482983c1a298e6069767dec010c9216913a6088e224729695cd8d1c60f3f615b84acb870da98c83509b22699cc02828d588f1368289aecd1f101b7b6ba275933fef031731343058d2a7dc878dd13cb1b96a122712edad2bcf0c0b5c84031690b82b6bedb6dec1b89c58f65aab7254651bb3c965d514edcb053745b63002d6865c0a29c719171654b99982e30b51e492278bc2c515387434a1d3c7e8e6f47be889b58113131b5262bce9c801b4a6a44c92ac2f0d2870b08f0a0f1f2c787193569e69508c01102074e599b0c3c416251cce4bc65ed5961a508122216173b3a4c10f9020357e54d849e05548ce122244e93b433baf266b1371526501a13695b4e64d1a205803a798e7ac04cf8c8a272d3fc89c3626dcf0d185f8e5c294e92106961e7c8b14c9a973b441f5eecf831c2973e2c44c045bcd009456d736f0ddcc94a63e30c189b277beb7dc48b170ec2dc58e375e5448b1545f6856bd3426b09111866c6e4285e8c4745ce529881e51102a3d7a2ef5e1ac111a7656e04639f2c53bc8cf9ba077ae6a4e1a14336f10196b66affddc965ae1730a0173ae4f068b105ec461c1b7148f14b0996231e3374a4906950d303ce8f1b376436a68c5cce8e56a2dcf98ae225c70e8325696d578824cdc2f6ce6135d6b8a801e3ed09dd69f4c2c5c34093b4197bb0b8e499c2be365964689d9961a37342f1b26217813d7accbc49c216e48d9a9e7befedf3c571114f649da9ed506bab01b7697831718659c2b676878e4e97277b977befbd77f9e7ce4f505ecc520706ac5029feb0012589579e33016b46306df6801dcf7a6418730c630676747b73f7f4482142972e5374903d71cb20059b1e4474d0b0c18664136b74e9a1c6426b499732275dea5089bdbd986326e4459cd007073245d4e2d0a859b1e54473737eb071078e971b347386e023565b8ada582e1cc35cc4c9012519e79e7539f34a82e78b2e0cd2471d76efbd371b11a58b4c15a4e8e27173b163abc7091b74c6ce265dc2ca0b770647943a4edc8cd129cbb20cc012a310375d61c60c29cbb32ccb3213e965a9d4cbf2875aaac40f3334803cd13337025b96393f9af7a7bebcfb7dee76bbfd278a1d368b74c132a7b059c46c4a571694ae1f778371618394abdc989b526ceb3aa326888c4f1d8d21658aa4d5ad38999c5951c442c48893166390a83f3af54ee9342ba420eb9898d97364ec9ac105f9a48800c6e46c4e51ac82595a762dcce5b23b95bb1f39f3b8652746069f3051b4ba80bd403291f77091325486658db9a121c7c9123ff74f133b695486d040c1b664b780a3e38b9626264608a2828b8e2224cba58f16b03d47b8214a6a98178d961c687ce4b161460a05f2ef8d02197929b871222ceecc9326713a49df7bcf98d68f3b7de8c8b68890b637ed67e7cee1eb564742df7befbdcf32c80cda05019d69bad37def9a382e54d83921054ddc59e6363774f3f4908b92f6c28e9c1686aff483aa9b90b0ce683a373140267611a5ce45dc1958925387b96d6991824d0f9935b43626ecde7bef175e0bf93fb379dfa9b2cc453bb272dd824ce1f28a1a1c2cf6d829cad8a3857708dc6ca46249312d59929405413285b5fca53127038f092878e430b91acbadabb420cc1e2763fcc88d90dc4776e8f4093715bdfdc3a85dee3628cec28870a933f346242285c79126469a90c9d248f6f088347c8c790286438617d60f4b3ae493623a239d6ed959388f4026286a9b498c3ff88cfd481e79501dd9f2762ec1e146e52d86153d7419cb85b32b4cd8c0655959711ad96265c84452c56d091b154392e585a3da72c6bbf28489645a477a883973c3069b4b452644c40d11b464c57901466b579022bd7d17cff24949bae744991d1e67926367111f40c4194aced4d48001e5cb87dabd59b6e828d58c372501e6c69b23689a80993112e5cf1e2349196ee67211225b5ca40a10b31397e624cdcf0a06c4291a91a0583b636288a2f84f6954238eb9c1114607c647580eb23a387ccca1393202d7102d1e56cc7abccdc833262cc91f227dd0ce8ca17811823bb645ebd440999832675b38dedab07befbd4b354c3cee958e356b51e478701161939d42904e69c0c0a814b1ce98f8f6ffe0d236bde5e724518bcc092f3073538c3cd15c580b4ec5723aa0681de19c357992e59e23ec36408b8122c81c96156a2bd2364dadb2d672ba081ad69c28c8b83a3b6667102c421dd84326075918dc93b3320b76801d371d76a2bc5133970139383dc25c8c5d99bb9a4e73693bbb000e3745e4b4c4b0e0215366ca8e2f3ad09cd4b166c6e263c3d69c386246c588442c89d96f9bac217bee88e9c2a449bedb579a9d655eb898e167ed4d7206db3e890121a370274c8d0a3811d6c8951b6f8d45b854b472c0a913e38b6c4d3693410b911d31a47889f145ccd053ef1bc91a9b9fddfee1bdb7d5f0748d5359e3281feffd1fe4aed78cfc0072c8a3e48a63de01a4d05a8fd070bab161c3cd860d1b366c805df916678cec184b9d468f3f6365a9a4c7fa99ee14d0e31f5618c09d0a7afc06f870a7861e7f0738c58fcbee944f7d2c410ad3619ce452e52cbce24ae136dc16a3e3b66ca3e3c739301eebf8710c2ca3e30701630c60391d3f081c47009ca53f610a1d7f04adf049375d2a03e00bf9712b3c4fe059fca47bef05629577a759ee7a18985d824a97b3da5cccc51659c51b79458c361b6dea1aaead2e32b5948bc7f356d78a21aeadae15614834a8343f8c7803746ee5ae6c004c9557986b9bc37ace397afe166a450b37d2bc557493e6e2250be6d4caf91f040484fbeecbfde679feed101474aebb5ceabd77690671207e0acdcfa529ccbd2c4d0984ca72af42daaccc1288079b98a016597a7b26613b0b4292a2fdaeb19189d9bd196474faf4995ba627a6ae012a0f8db8e87919f20183e706278405860cf42dd9c362e245d0162ede9d16405ce0d038679b59909ae2ae0b101719a697aff3e97c32a37cd2f004a5c1cdeb7c1a0bc13ed393977669339f9e4e1cfa49c31394863732dd74cfb52b2c627029ee81b1e5e886cbcb11016c624f501aaa80a83e50a443fdae31496231a13bc244ce2df5f5bbc644ed4912a9dfb533227df7bbf664cc0c8aea5b966559966559965a6bad4bd3346f5c59963bb3cadc69d06f9625d4debebd77ce39e74bb7f7a6c0bd77e79c31c6186badf7d69af79b7326d1b38989d430ce7a97e6ee040a2a3a4f11412854dd75809455950ac5d4b3b9a61e863afec212b1334d2ba3b1fc0a2710cfa5f10bc559efd2347b1df46e87b3ee14bec2aa9cb14dfd27750057ca4a3765a9c7e606144093e21f966fa785797116daad774e2f61742de25e2457ce725fafef6fabfdc8225aae177d0b52ac7747bba2ddce34cda223bd43f18e9718689ed9db3d8f97fba8c8687fe760a7da342a3ab2d23b1e90fc2790e2b3f9d992630ae426f345e4a199969e8fdf3c32459cbc2dff3cfaf63cdb2bb7418e3a57f369833c347fc745700a5c115a0ab3bd0244a0972fe2cddfc0347b1d76df1b80067968f20f7928228b02394ae8cd1f91a37a6fe2ac1cb545dc26f3cf27a37535875ad548afedd1df237e1ebd79b49e79e85bdbb34d37277acd831e7be875e03d51fbe5974fc48305487f7ffa7b0ff1f634779c0bb90fe5cf94875a63dcf19fe7699a3b4799fbaec1fd668a532bbb9cb3fabb4ca1df3539586ad4639533fb01da99e58ea0dfb5386569ea24e8772d4e988eb2598b03e642bf6b7280aca5f103d7cf8e0e01f50ca86d47a3199958c65c1a04b583fd214bab6a475899355cb0e8b4b0e6aaa54197247133749461c2c696ab08dd94db2bd7adf2f9a7b7433fbdbdc63ebdbd707c7a7b917bfaa9a79f79fa9994d1d6454d859f2d42583576f6e04003e54e991d368ec71cdb9020476aa8b17b4d3b4353a48bc88f22db903842deaa3ce1aa1b637f9c8833a3216646094be64647eb840d316dac71cb8cec8a9d2bc6196c8b8f279e3b64fa2063f0513bf182cd70b2d0f14873737285cdaf069173d6c6a3881e36b775c123c348450b071356277fc8c952f7c2ab8ccd64726c99c0026ba302069b1f042d9501186f66e27e20c183c62e8df183c41ad2c54c8b251e7182a40b868bae1f746c7e6cd452c41827d818a9f1c4c79f38160ee3a0ca7d7a9e52e3ca5892af2343cab0398e0089a1e518448f1036bf3aa726cb4d73e1f08b9e91a848be7861e7eb0deb013e7892e4786b01a7caed57871a9564d5910c2ef334bf56e4e4cc344f73bc820c56dbe6699e55687199b199ff1b5bc11536e68ea779b682034671c3165692cd5c9886c574d8e6dad8cc2f7bef60992184cd3ca9067bc7d85121c6663e418dbdca689c0ca1c39640e38c6087d59ff9d50435b684111cabd3aef9ee079f2872e78f2316326ce64f652c3ac4cb3c821cace657984c0710176c896c228d4904aec5912df5d80982c5a25b67dcbb4547422dd164f1e30e199bf9a532842d91b1c6f1263208e27ffd75bd0ae2ff553f91551202dfb7aa6ff47ba3a527b2fc89ec8427527822dbf444768227b2169ec852f0ba09bfef282928e18fd62088a3477aa4f50ae98f9ec8fa9ec8fe13d9f5892cd31359099ec80e9fc83a3d91ad709f02aea2a5162af027ac7402270a7ad2263e8021ff609652e01a48c0452449db0bb7816ec2cfc43b5092b697aee39fc0415839c64292b637898b98ab2c5de2d88be3af2529061f69bb93acefdbb363313c9687f8f1ff12591a36ee648ecaf9f7f7cd07abf765d736c3f210631cdc747988df68393da7e97cbff4207cbfb45e0dd17fe5f3fdd22fad57dbb7f9875faf30eb7b34efa469eea4699ae6d09039640e9926119199979e0f7d7e3ef43ff44b3b99a3ccbf9b4f96e2bf2ea1ffe8afbcc4e27c27cd2f2df5424b42e65791697eafd72bcbb2dcc9bd4b336807ed24163235ddf9a995f6f1cb9aed96ebf885b807bbb73b596e9d3ce572ed36eb1acee9449ac972d479a7e3cf5eb94c6bac732ef79a98316a4bd228717cd44df893386ed34df87f3ad2161f3b9c6ec21fe458ce061d468a90b698ae2775137e249eb14ea43f9e8b3c1f8949db5ce457be4f9e3e3e04a8fc5dc97bbc1eaf27ecb9f5f57cf24a0e047dd0ef64e905c4e5e6b6658e8e4b31336abd2dc73ad665cfa8e47de666ce652fe79c332f5f674d02f7cc270ff16bdc9325d697d0b73b598e7909097d29b6935a2a48aec4caca52591ac9c64ec75f6ee5282e2d95d533b6e9ea3847978e79c75f86e5a8bbc626ade32fc9b41466f1a75c0159707978fb105780891c5f516d3eed749cb970f378f944b99906b49ac7d534e621fea09fb4d5721aa97532479d751dbfe673a7f0d56ff4b9cd72ce3d332db593a7695626cd76d244f63ba18490589499c4b0b080885acdd5734e0e3b5ec09d2a1f6badf1961ca4b1e0a6fc6e58617afe333d6b3a1a418ff90c311e62ac3263e164f9b9e7afa0a0c76e584a01384c983367dab4e92dc6ca41fdec05ad1e74dfd2f1972511ef51203d1e84e6f3355616cb5ff9aba7ea267cd105dc29ddcb070eb728a96a9a96c9b5bd6ebdfc04dc29dea3497d9e69aa5555a99bdf2a25bf8256ad93ab462681bed548bce54e057dfe5b7e98f34cdaa6977f953a50f93901772a27e05a28d72009dc5e379e6caf5b6f73d283be60c26cac15787766c0c1eaab5b45091d0fb6440f481a7be60cfd39fc798bc396286ba861776930b2fc614ba4706ed8dd7a73865643c7e74a64776b30c4ee817e770643049dbb075a4f7ee60ca5ee7530bf670022de6569b90af310e70caddaf1a99baea6c65401c29628ffb0bb27b24972f97a02e95d6382d6f39f6b725e3dffc6ff548e41a76e578530619a4bd52ba1af3046164489c261cb35dd73e9de3b831c1038b6e4281c36d7484bda407ad7ca94e1bbf7de5cbbbc2557bf79f8e7cdf2efbe3783fd1c5cbdde37f7bdf8eefe815331e36b060e9ab7b5383c6cb840c98154e3b243043823e81329670c172d7884e0a862864c1f0178c9a166842772c8eaf2ee496673cec6a04c414752471c1850cac4dd3863aabc9569c32a42e3b805c96fce9dda3de8ae19a3640a6f2c6d0e907302458b24264e1c39e18840d416a1087133262dc61a0619507ff9b4654c35a68650d4ce4624b3214c8e679aaca1311903e39c5263e349b20bce5816d4538521139edcb38ed2564113156cb0f0e031f146974d88469c6409d3446c8b5b59e6dbcb55b877ce755af253066ba8d84972fd2172c2016de0640109a3960279cf376ec6b0b8e04b8a1a2d2f3fd07091f1c6c78dd915214bb67e70f2d39e3849fe207bc0e072b689bbd3419c570b293bdc1457d061b3913557f443b7a28caf5926ce8ad19a33d300a14646640b8e2a648a9c6cca6ad40d897b92a7c59d176ae27a1805a9a9990186e58c8a2363f69c7471284e0a18e1e81882440b1523194bee800d4711ca0b2349b2d856bde79a0b27a64ebae409968c316bd6c4e49c0570c3479f3c5fd6583039d588315374c9c0d8d1444ff2861f1854415af9bc38d2b2d4f96f8931d6eaeaf9f19a98b05e6abcfbbb23767d579dcfdf712b6d06fd59a2df0fe71a2440d0df0ffa7bb61b74902f2fafed799e98b723d047879ec785fef2201e2440f977e814babf6f1b02eea6f91ceccf7f3ff316e3ef5dfcbc6cf2f66c392040fe5288f3dee427ee5da0dea9796b3b62bd1d3640c4bdec75305ff732c8ff3b03fc39efdf25361128efdea069be367bef1d021b3077e2decc42f086c6038a4cee7cd13366079c338db9437b6de02c8b4a914b45961e1762e061d13564ae2c8e2e0303830f275e4efcc0c1448e91aa16509e88d17186850d093e3bbe72b0a013c735278112b03845a40439d307ec66e1e28285160d28715960d46921829799923068da9248a0cb8b97a21a8ca48c6b278d17133ce2b00901da991f4884eab6c088b94991278d59124a8c1a2d62c4f93acd9849f831cd96334b7888d1413136f70486989b3353736a6cd5a1d193e3c7290742903f6c8688cdc1e86196350982c70a181230278c1f8e5c5d5b6f5ea868d360b299cc838aecfcd3a3850d185702999f1ac4a8fdaed1b56143f1850d7ade7bff9eb83437188a629cdefb4355dd99fccfcffa8d7b4acef929e3ac772f4d9db1794b21541337ce5450f4485f7df96f6df7b7f9efee9bb76bdf8feef2dae2fc0745936aa4493552fc17e39c73ce39e3ab33d3b5703fcfb9cfbd33cb19fbdc99e58c1933d4d0dd0e33dda99dde993e265d018ae9dc0953dfd4042b13cedad4773864ba533bfd56e0faee67c7f72b64a9920c0b0b4b08cb86024b0f8845cf7fa63df5092980ba69b74b5cd777aeeef239f61667e1adae1c5de3b0318dd1a07a8bd3d470178deb2af416f3d17fdbbcd575eeca39c2aa7a9bc7caba46cb6d56cb5dd64075fd675a87a3eb57ebe074fd4fa5eb1f9a79b253a7ebd770c7ca47d73f800f78e074fd1a8848aae8fa3708d3f5770042320d569e24c53c7db8ae787dd175fd588c4ccf1db33d598c388e6d7cd8e0e444e8fa315d9f6416961fb262b1ebb53f6a5e2274cd86b547cc0417323318471c97ed441db89e8d141ffb8d92460c031551c9806e6693dc789b03c506971d36adcbc3e5065a98b6387fd89cb3be9f8156f4dc26a5e79c73ce64d2f63bc6bf3fe32a12baaed3a3eb3ac5ae95e8d26702d273cf9f5ae91819e64b73e19caa689a26d5383ddea9ab86bf74938b34ffeb4f8002b01408ba49ff19263da3350d0f70d75bbbe9d73a2369740f30feeab797b75c0b1a2731320f9de87c955e74d2fbf80d80914f5079981fc38c9487e5eea48f8bf92cbb740f76f7601793ead216cb0551a4ed5708eec75b7988fb5e719123d11a17711159c2b8dbdc1be313e889d22122554dd7a155e81cf6d2270f70d720e4a146d28196b3b98ef11b8cd44d5617d381a54db7497f05e74ec2937e17d3f8a89bf4abc6d48cec3cd3f47fa89f7ae9234b8d57de8c38e6a852dfb8ae776b595ae5a83bbc163406a183a35a8eda5f96aff2d2b22ccdbf24708fba1ed20ffab5d61d4c80276d791d1f3b38f5b16b5e8dbb6f137edee9130ebf86b49cd70442a373834e570a330429afdf353ac5b6353a594c5a5b679c55348f9ce956c524a30694d7aec25ad05062850ec99823ad3e4cda74a4a1c205472a240854e472565e2f9d47e606a62ae7d499533727cd1c376c042db55ead74d37ec28ff1df0781ffe207817fb75eddf557fc5d3ffe10f9affefc72345001a0f746e57b31407d8fead33ccfdd6edbe003b1be351c7b6bc8346b48b354438e6a55abfd55fb6f8eda7d69304dd3c406c84d7b00bcf6e9dea79d9fd6611e9a18c3be32ebde7bcfbdf7de3adf7befd4bd3a8bd56c7a9eaff29295004b664bd62c852e5c0bf92ff4fc17eed47dc24d500f784cad69fc4dc167793536f5be21d2cfbd10413ad979edf943736d2b9c6bcbd47bbdb64261cfc2b60a5d2ba0427f7b2434c83f54db3430b974537ebae0d07aa5e156ab8ce25e08dee35e88fb81f31ee50d3d8fc896436bee81187a74bd427f48d3b51aae67a1f5695575931832c9e3c1f28bc78320ae8e3d3fdf46dd9477105016eb2d3e6aa98da5dbd4f4d517ebf9d8731b9c1c9d46ea646b7eed5af3abc45f24f09f20014efce74aec569907d1c9affb9575f2de0aa6719785ea785866bf3fec85487b214edd94f5b3a56c53b67a9000e567623fef4df6525760d2da87e65716f0b479b1254e25493858cdafb29c1563bab0257c756c4e01176764330fb2692c34a8d0b1994341c926e6b6b0d8cc97b458d4e469ce6b50f921c7669e44854577c6770724d412fb52db962c586ce64a48d812196336f432b519b0baf9e88d0063ac817231b68cb8ca8db5993147b5651b900a53cc444bd15b336d69c97cb3880f9a75162a4ae6e152d652b12f652d6d29f1e94ac93c3497b03a061b396bcd95ba72ce5c5869ab6ba7628ed2af1fbf52310f4da7ae1ca595b2bab9a58485f1ef2f3a1ee5a323df13d2c9ec282f1d8b8e405a278e5a0aaf46c53c343ff73ae8d288ab9bdf413fba7910c43e810f5caf526196347b4832124b3a159d8ad7428b04d7cd477d41dfea21779f53514b51f0e5c4e594c349cca9accbcc09cda9e8f4e534e644d6cdde3ef5d6a9e864ece6fb764b6d6d51122e47b56a72492d4799c86e02652db54b71dd6c95b0ba07c1106a084a66bac97cf52f5bf26008094a46dd64be84bf2c8564badfa9e8c4d5cd8fe04ada3a15f79745272e2db557b26ebe9258371fa5c292b64e45acfe01ee4b6d71d82a757573e9782d98af04256d8dc4baf94a5e4ac7e007d7ab720d86088600fce05f16a8d476b5d76088fdc217ae2194bf896c08e0aa145c95ccf6b197281cefabefa28890e54a8424064100812bd113d9cd8bb8749359f2a262d198d64562abafa8acc80c2d0f8382f467ee2b22f3f122315e3456446686a24345c9a1a2e4d05137999f665e84a493a323426aa92088b2884e13217593f944d6f43d2f3a6aa28c75c6380b91c0186858671445725a2af8e617d16929e19b5f84cc51bf37bfe898a37cbd9ed7ca276d97c8ba79f419c5b84c0e7312bb5a7375ed5e07a7adb234cdddee3c8180dcca3a5c300b2243511eafc7eb39e570fa72f2ba1684b6847a1d9cb89cba2e845d10bb5fd782c9bb90a3c385afa11e06bb5ff0ba16cc47531e057329d1a73d0f1374a7af099013d41111f53a38e5c843f381655227af3c349dbe6e5151af831357516fb743ba90861af190f805b40b461f0f895f30a65d40cb43f3f7c3bf0b667968fa7c47473f9ed3561e9affeb7570e2ca43938290531044f0cbe01359210f82100a9fc8eef56a3f707ddd0404aeab9fb4752a1a61191575d387a2a46e325f294dda4239717127af8c71be4442ed073abe2c945c8e22f61fdfbd905f3608259787e62f7969295368c96bc9ab9b8f7ff8f7c34e6d6234bef0cf87a1927c7214d00928392d05758492833a421df3d07c1f1f760a6ad2b6c82dcbacb750c76e3e945c8e6aa1926639aa35c5928c39cad85ba72254f24ee16ebecfe89d8a770ae3be7b33084a6ff1d1c353c74b6641c6aed7fce6efb8f6f1615f42cb51476b3b822c47e5377fa96cc9a835913ef2bdd1588e6a9d8e8e24e0cae2ca91a32e1b8de2578ee2cd1033223bf269a7628e6a97968e392ae821a9a3c56bc134df692b470199e0ca51bc2eaf1c0594c3c97ca7b01c55c2d150e5012ee21e6c22a762373fe51eec212e0425d7cdef151dbbf93cde12d175f351de16158bbcba6955e455968bd2ee54b1484c4b9dacf944745aeab25f68455c456470bd35c580d69628d9d1230fab9bbd554f5ee5232dc57a5b9434c58a8c398ae8a8a52edb0627a76291a9c56eaa5c5e4466dd244aebe603ef51ac9bbf5bf7e315f8796d4f20bfb70c92c0bd94bb16cc28a064978e497fcc97f0ea5bb54bc76e7ed956c269a9a16e328b92bba2a496928065be11d696919751d8576b34d6cd6c74eb2d0f869aa2241b0cb3de1ae500f6d6e8cb48cc88ac9bbfc3d91423cb51ad06b31c65aec1ea2dcffcdb9a68ddd490dfcce64be0aa9901ab284bf1404f34680522240110909053141305c674f72657c9557a6929a13fbffc2ac3c4721450b11762ffd0df5e88f285b28604a1df2bbdf2f07c949739f2f07ca1f3d10ce75be534697bb625573fff3ccbf2f0fc3020642a1c9e0f7556f55317e9adaf9f6796b3b0133d4f7c9665255a4f5fc3f3fc2ba5bf8cba09bfaa7ac0bdc24b61b03ed00b39d0ab684392f5f5af0a3915c6be3e5ffa25a6677aa19010be225a60019a2db0c0020bae8842a6b7c04978c0bdc25bc0f49be90affa2bf5fd533fdf374bfafbe8af43e777a95f7283cee59087af87dd34bf0b79f39ca47f5556f95518c2f78e24f4dad20aafe82f56ac357fd1587a7aae2c1a9b7facb52f1e0d405177c88aab75a43d8f0557fc186affa10389455fcea26a695c703f282bef5cc431ffa2daffb7e6fbe054ea24385b760f520f5c247794bd4f903794bd497bee42470172e2d39dd2bfc35f7f89f40bcc55df897af370f2908ffdf2a93c05dc3da5678a99780e32ee4b7a3403c2025b4547da2aa3160c050c1d37058c15be50c19a0fef63a0060b783fa75e5f178bcffdbebb03e9a7b2470e79dbf55be5f01cf90e195d0d2e097bdfbeacdf0197c1b783c20d08752bd552676e0dfdf4ffdbd55be44f43304833fdfbde80a846a0d0a9feaabfeabef37716f9ac4654113d76f16346869bf59d08cf5aea19e87f5d1ff7174ae4bb1ae98d6d7bf2bb2fa654b61ec25ef0a854261a99126cf443970aadfc0ab5e8affbe02c79d73dcb5f1f1ebaf57d5346dcf60f0834ff51c5e03aa95c36b50b5de0e3af0373c7a7b4f5d7dde87cb81af7220efc25f4ec16ba43069eb5e06eb077fbffeef71312821ffe35e06ebdf35488009fef7b7a3affa567cef45efefff35e7b773e044f6c76fdfc089ec04bc25f6f5c3847ac03528fcdd0fd16030f8c160505541e8c1f6ecbe7f20e7cf7fbfbf3dce7fbfdd3bf3d0f748370f7d9d03dfa36b1b5c3fc89df7be15c88635285c0bb0fbe157ad59432a787aaa356b081400d62001763ffcdd0f1f25e2754de997ad88d5716f5d31f23916ae48dbec85e90ab0fba88f5a39587ff7b7e36001861cac3ffc0bf50ff5b88216e82b78fce8cacb476f0fb8b6571dc8e3ed55e73d9a3d90c07f56fe5355f4d50ffad46f89fa5551f5a2ebe9417dfe17f842de3f9003fd8fdf3efc9593d07f386faf3ad40b797bd52b7814f3d6e1f09f7f90fbeeefe39efa2786bf193ec3f378c7f02a27ea19be25ea1832fc9901c30361f8dbf39061c5f000d869390cbc02aeebb84e6a3e4ed2361f858f12f19ea7aaea9a8faafa3ce003d77677de2ba1a52d0f484c7b1d783cf5d5351f851d80e472d45d79441cf845bcdd7259c3c1c16900455454c4814fa491d4208a7e9bf6b0d2ffb7e7caf3f1d7e1fe1ebd1aa98fda48246d35b2ab5fc6f34c4a8ae07104aff2b0ee9d027e7bbb745555abbafa50578ac3abaf26fd069e94f4543ce9813c495555fdd5795c23f310bfae7b5287e9e7a46e62353247a13ff4f8359f8d7597962614274cf87ba570f15120f468f38638f08538f087f8edb8a851f47dbc2576df8fb7bbff90823f8e7e10453512090909e95121bf3ffd05fcdf07794becc147354f187c1e6f55551edf00eeb7a7f4c46e955515aaff1e05e2b8e35ef0510c81aefe13bbca5b1e011e575f0217fe08de852b067c2143ffbd95fe71f483dcb7eeb93cc45b833b857f6dcf756dd3aef4f7f6fe3e5f5bb52b7d4ea647463c0f83823e0dfaa3a0a637dfe8adf44e7996902f9c07b8b71ae9c14e6a892e50c04754e8f9d1a1a5bf40b1be3b2e2e495b5ccc49b9befed5fcaf96e2dd7be5b0962b8db73cf65bb6f55bc251556de070c1b7c36f9f7ae7f75af1a0bf80073d870d559ceafc3a7f88f5b7ca39a993582d4731017d0702aab798a3a4745203a4b51dfed6f6d107aeadaaae17aee3388cf116db8a64aff014d85814bb04af6e20fe13b89e62bd0eeaca2b7b1db49c6b01137b7ad256cbe9f81fff9ecb51490f7cfc5a0edb0a3afc1a99a32edb0ab98e5fd7f1c1e0fe0ff73a28f1b7caeadaeeaefeef712f83dc1f49ed3081733dd71fe955a5d5c35dd5ff21712df741ee13564de73441d30f87aababbcfe12ffbbb6b3001545ff521363c8735040ebfe1abd6108680e0f01b3e84aaa7facb4af09a4ed351d0729a4ecbe9394d7746f013d4af7aaa0f51b54a1082c3ba61fd0fbdfdd0473cf508fef2dbeb10c17ae6e1840914dec2dfde01287c85b7ca2acf148643eef4162a3439fded7598806735de14c14f58dbdd2754e8dd3ccc4a8f7e95ba061340f5550f82eaabd6ab212a1508aaaffaaaf52a53ad445655d51f6f71ff21fd552faf5fa5375fa9a5f0b77700f525c81a8957347775bd7938e1253c7f2b3d810f9f02cfc53cc42f41047cd8c4335a36cb43cce29b39b8afbbaaaa2a07f7cd8c6668c6b6446f6b538f6d47b536956f0077f5b3d1f8fb6c9687c64733f20de8aeae2470ceca6d6d79f8ed07f9d822bdbdcdc7ac639b59360a85a46df6f2ca81c3941e2b8965b2ac1c9524b2787d0a7f35ff082620fd93a67afc439a1001855582758d606dd33e61e52b6f55d776f8f454bcfd20f709effb24de127bd2a33dded9c3e05ff87071dfaa5d029cd2df15c3e5a1d2a3bad701f3f9d09132568efaad2deebfc71bbe3d39fcd55254df0ebbfaafa5aa5efd0b386c507faff4e88f67ac3c4c7aa5bfdf5be52a2adee1c76f47e2239ebafa57e933ab84415eb15c904eda623a8ccc51b81df1d4919e0ee9f1a3b727e17faf72a4b5add0d5fff15603880ef7fccbcbaebefabfbfbc7de217f7d72abffd4ae0ed0f09ddf198f884c7bda447276015c85bdc25fc8f23f11677a447558ec1edeaa39a378123fded21e07675053e4f551f83dbd515b8b6f77ddff3705fe9257060f9d5819ca8c43f30fb84f5fc812ff83e89f330cfe713ea2f15e9db54c2e5ad6b7ba27f35d7c6de4b58dbf3445adb14f7fed5f5ebefdaa6bfb555d5f314aeadda85c2ef0d9f84df6a10f2e03fd7bd0ec05f327aa517f296d8859f8484f4390ab8e254c20f871a793568e4da7e6076e0071f05f2e76a8d14f85659237f8fd3ce3b3befa7d1df4b585b95f7561a890b5fe549ffe3ed91d2aaa4c46f4fe2edf7a3a0fac0e0a3416090dfbf3de0bdc0f503b3ab57e51cc0fdae238cdee883dde8b7b6c4fe7b95b7afaaaafa565a45faa3bf48effb21adedee482fe155de626357b154954ece781ed336f5db0bf7ed0f9fd6f64357bfd50004aafce891f8ed123889ab6ef4aacfe8ad3212bffdc749e86e74e4fba02c0008fefcf9f3a78f78ea467fe661fa5639c36929de6d4a1fa75fb4b667fa446b9ba66b3ba2421f7af385de4a6ba10cd7f1f7f86b64c76a204654b87dcb6d3a8ce147da9e7923a7328681ccf94e95a7861e4fe8c9f410b7690f77aa803b4cdf46e871f636ede761d96e44bac630d5f795f284a8efbe020c7d236097db0a32003af925ea5b03445d6fbddb3d2e1fab1d65ba4dbbbfbf81149fe5fd1de2f4369978b7db958fcb15c8b9f68abc92b7b799777050b694d72f9b165795f4ec974dab68d4c28af352be2ecfdd79ee765fe9ee972d0baeadec972d4b0cca3542498ffa5d4bd3a5b767993454c4a465bf6b698c19647d99e6a7019e4ea8044d35463d0a2ac6d5080000003315003028100c078462c1582c8b5245567b14800c6f9640765230940763518ec338868118c61843803106006208414c19a3ea00b67659f1135a3f45bb41bad2b8d5fd8c33c9e01ab613befabc027eb857c0fd863488540de45ddcc94f31f93877c89690f638aafc6c196c195a4206df681d70c0a426f1c7241584c5a05183412c5310dfa43881add307db713a9aadbd5f26cf4e542033e0a9ff544c9bd38f1a1672baaf5a3dce3a4a02da4ef56b91cc436ab2ecc7d4fc662a072da512d204dcee46fdc5231826fcc658d7c89af47291441e64accf7c43f0194dab7eb313f98add55c9a8207f981c62c7a038a903ff5b05b89118c34825ae39a2b2e25fa6c31040eb5f512ce2b6e5721f78f58bb2b5d4550c26cb0867223613183034ae30d42f334f97c503d136a4424216bd7eae6d61f6923a2fb9306c421a4032ba9e7866111c092c50e169ea7bedeac223ab29f2c9e2aefd727e33e90087582e562ab5a3bf608b16b790c8110fdf647aba0a5d5f35c378b8a28c95303319e58d694067ef71536302ab034a4201f87d3896a64f149439505d5090a699c690dfe405d618ae1decc70308024909451370165c2122b9c3b018020e3a66d0050b665a2090845c1469046e17c3abe465d1684ab5d43a82095a584e7072eb1fc6b38091416a28c51a40c7085f20a2197c9fc48cfcb2854ef6c2a3d05edc9c29c22b5ce89d3ceded19536a5f2d4b84c6eede442b840d10da9c4bcbb1c5da6bcf6dfb8f80d5e95c63c8a375cde32e435fdb4e3d1899245ce7541f849c9adc2b99900e6eb8a228953151ea111cc12dfe6381b83e48b167a56762c87265cdc8265764edbd0703b40c27e430822f74d5745f7afd6d8f55e6b3c88cf628d037b81788247f60ef718d20be4be67dcd86154a55e8882fff19efcffac494a9144b792ae5abc4b2ecdf4e12fb9b5c3d34df5033463330f446cd0600b8583224dc91c2b1a88863b4d487ba9f028d39fe8cb7741d64edc907186410e101ca3b39ce6dd81a87874de7674fdc073c357c9b969834ce60243e110c99a9d6f23088729bbed4505aa0570cedd7dff9ef563a305b90b8b399d2018e10c05719ffb34c3e1ea3c10afb94f27b821550b3d6f5031cdf3860720684bb95457b6fcc365ce1e0dbead491994d2eb9f9b165388e2f56310380411ca4d341f42d2aef50419a89c12a5cbf09d64224da6f99df015f5e1a6e746c420095fdf74500bbcaa3e1a26f1e40b2d355ddb7d52f9031fff0a12585477b4661db903bd8b2f5cab3438afe9e578cdf63c4d1a406e75d25fccc976257df13ba7b306111ad5232b5fb431fd75224a3353f6307b30ae5868f7c4f3de595f4e7d9b706c960990813a1d7b34a65825519db587be4152e10810d04c7d12b29451cda25f6285c5577c1c0dc2a58fdc508c844ec3022b4ecd930267243f5c97e4d33dbec7327e936f06d7c38e630d21892742dfc34f720950be9b2f2f6093ba4a2e812d99a4af9ed450c2e2937c57844f3777fc29a57646122627d20dc4b7086cb77e0a1bd7fb155ded046e3d9027a14453e1fc2d79d570e5e27271259d84080cc319faa59dd6b75018aab0529f4d36d839b1ca1ddce4d440de9c38ee5c5f504201c04714b12423b3837df9b29ac4cf9e9b00578c7c6528898c13dc37d2f7542323577c88935044433a6e496cd461668941eaed91ce39242cb239ec18b1989f30c8e1aa6e5a2f5b467cca2adfe638bebd351fb63c565505e0e6b0eca2b6fecd0154e7d4701daf70866a3f410dcbe90bca91c07090e1d271222a89da4a0ae6e844975b3ca45b22505f06c44f4161fa63f178df13901c85ff2809c46884952c4fe7517c0c2cf46a202f18523294f2520512d73b8e471540c55d1b780300f898ae8c2a872fda11f42875b3d80be5193808815bf3428c8a47cd1a969b7085dbf4adf6508e930a69c17af7e1b2cf0128565f8c0b8b3e3e0168947efe84ad3462d891e62651174d862dfeddc08f94abf00f64c39c2843525636739ca7e44c61a2c5ccdbe7f051399742946c0e02f37ef18e9edd70097add5244f469275534a56d69d791737038e044f56f4885de4f1d7153a68c07d2faf0aa1e8c6f2c1343e3f7c58243c3698ceea74a04e7b969850ca0c4e7fe2e0581894b69ed3662831996f9b16e81fa66c256355e52015d063115c235877346fe298d6c620cdb0c8b73827d065ce22dca0d463db6df06d11ae64894d01946a9fbc85e9d9b43439ad9a28f833c7beadedd5be39dbdc0c1e7a4be73ca01965da20d5bb5b81f243f32d0b3b0d580b4c2a5c26fb825bf33db860612442a07d4cbe967415c000951b3ba8dac5113a15b7a8c07fec3ffc5a475964d01ac28c6fd77e3cc79a394f0759803cb4627dd6112a5bcd01d90f6b0c3fd036a497cf1b1770001b6beb4b14a4b55160374880e720b4cfec776a74d0560b1b9fff537012486881875590d1a828913488281b485bf7c9c8cc20159d2a479e392e596f7556af0f4ee7a756dbde2a26317e4e52271a42f7ad732d7e962b86e6d9dcfd9121ec1d3a214644f586c681a6622bd79f920a9a40ce26a1dd807cd749d02209a4b1ec8ac932415f2e3fba3546594f33a75347e64545774ae309c6a1fc514c34b8be3b7823b026564547f8378fa7363d40b47e1cc2a8e4120027d66cfef17d83e3082f3188b4351d082402537e7b360e707bc32e7cfa3c20afa3221f0f820a4b47eb383174f22586e33956aad1ecbc26b0ac37ee74f01e2cc7ba173d130762e4ce99594b1eb07aae29cb989ad103c9649f32a6af7237e79dae587553878b5a244ce64594f308c7cfa14d26268caeef72f2ceaf757674695a8f04c6e8b2d096e08d4ef278b3068bf6b4dd57cf516842fc98170cafce1accd7c40e510716cbcdd7857e50f16fa4fcf4196ec26be5272468da00a4d50744fe9b5c33e62c27cb7525cb93b287c297e852f12eee50bd81ca12119c255be343f9b229d9e1301f85e1995c03ad781952a5da9186c809ef1c905a3fba2eae54d084807374fcb1ee0ffc7cf1bacda35320d7905c77b3498153acf6544f7e12e77e9b31cfb5dbd5db7ac6c7de2867b5002cee598080c979c0b184c2570f231731a2e994cfe5ef06f99c2943fa1d7965223c268f7173f6ca531131ef2423cc1734075d143b337b45f3e69738a386def3d58b073e6cc62f3bd64697511b8814c8a118e840ac980aad1780a439c94d176a88c9d7d68a88ef240b77eeb655c54d381c36a5eaf17c63d741e79d95e31f655d012df80f543f66cf4ff0b2b6be7244284281f0345046ee784da26f8d9d065ae6a93413ae34099df820aa3a2c8ee42208872cc90bf450ac596b2d3752579c0176a5a2c23374303035939335ded550afeb2531a11233cabb85b9dc501afbdcd4101fa553c279c13f1c2b3fcdc452868d418a332badc9a6a5d6f3d4ab7e44af544059df93d2b011fbcd28477b448d1dce163094e05d7390f8ca7a8a3ddb333ad6e156ba7b0d716732178933fd507835f0b1e0189e503fc1b25a78262f574b91c084c4bd82183b5ed102efd19c0f6ef6ae8a97085931236693838acf320c4e59cb77cc0092d5a55db516f2e86df06234015c4f9a356d1d159048fe27c1f304055e5e9dd102ea4d52eb88957cff1aa907c04cabf2f90e0752deb28c228b42b35c2b7bf4e208a11fd89f5691b4ddc84f9c41cde09cf3ddb0be830e382389ee70e5ee54062da1bdff664b42edb1349e671c1f1b38a8410129245bb3f205339551006acd5d88ce5b27e715702b4a480c6780aeda3c981b2078d67b84a09df88c8c328105c332298192d18a86418769bbde714538eab4c4d3fb13079515ffe3e57239e2e99f529d54cd40da6f495d8ad9c50ebcbe3a6f0e7dd1ae2797513a5ead0e8aad8d2d6960b02f06e38557a184daa6ed0c3f773cdeafba390de0f88a885d7a74ad762624b687709fa35703d7f1aa92990d9e8602f5afac01936eaa5b92e2cc07bbf8e188e7a5287582605bb6410e648722a49b32e6449bdecca57e85581305706e8c95f2462d16a2989ca7f1524de513fdb281fa6db9edb85d8ae1a4d2358eeb72df4887f80aa09633dfa60038970479bf7e3da6ba4db54764d17333d5098a22e5cbd026e31449ae87774ce85beb1300a0eb3f39ad1b618df33d0101e4907796d6924ddb98c99a567651e5cda11911ac30033f729b1da413d4b5b29aeaf309ea3301915d248f0322bab1109c624edc666ab45ebe77c6a7daecb4ac19158997614d32815c4824e224b61ab0c86e233507ae1531016c0dc32bac084768d3f780e0e5a49366cecd2016645cf72b3582e1151159b1f18ca96974f086724586bc6f619e57fda3e7d2ae8459e2308968ab3f8bdd353b9da7a3ee029e684f7684796bdd5f06acacc5223f9bc6bd169f912664ca661438c7c92cbe4d33ac438c623816a241a74244db1e8e6455e591cafb8c1606ace5def66ae4813e81d589c975b4f82feaaac4409a9a585d36299290f360f8088b7daaaf313e10a4122d65579bf97ec4619a2d47c4bb34b864d5bddd722c0e3b3717d857a47e7c8f7d251e0182c98edbe0d70ddbb3b58c44475d37ca30c046b7974b347980e5b516d545b241c84e9ec16480db1ac84dad7cbee454be9d7309b90dbb582f5048eda534047c8b6f6a23e4f11d5503ae8a9c90958b4007d39003eedad5017a2e934ef45f4494b43c3017ed765c9e282b082d7dd98f6d8f4924cd09e07e3e3af93990f96a3858442d3f69b336be43f8b534b52518a37ae69cf800f76991f52385a9bfea33d61744fca0d84487c800ca4bd0fa276dbd6023eab148da1107950b03cfb01833a4778fffb7d0d04a12dba0143d554c4274ba1df85873a1d9fa92c6a5309875bd7b0ca5e6824e1046034d3e3143b5b99b5ba8b6e34db689eb6d39c4fc52eb4705531e75e0278e3c57c55c47e5c66b604b6da7a5ad28d1caf5a0cbea16d8b0e98bd8ab87c1ae3ad0018008a3aeeacbef46405ef3d1c623c07567b746cf49a95cd7ff516e2d56d6c7b889b052a1ff8548491f18e543880f75cff4c147fdf7857c01cc12cc48c25181d713e5ba44de7e4eb3cead7c0acd39d642c99ffa0e07e345819ff5925484fcc662ae48ad2593cb02307cbb03b877d35c6fa35a3bb2131ffe011a35ae814bf3b6343453f30df928840ac1f069e16793151f20b01dad35f2579a7d37634b2212d8cf2705db83d74c1bfa8ace2ed6a50f808014a2a3b4afbde58e285970bc8a5f39da408ee532603df14acf8db568ebec843f52465ccdf37a7710ba55e39e7f21da3b7eb8cc53e3ae289704a51852d7d11e66ebdff4f366843772ccc2a4ea00021313d3291a14f5f93fffcdf6fe71d51a9e2a70f51581f2006a3bc6c46938b7148278efe557980d04e68d88eb6254288fc0f389a8e0f4b96eff3d2ec54a78fb5c1f54cc1e9b81b2a21a3b361e993f789c7b4ec3f058f876cf7ff84a2e634c4ad28a62e84d429a153d658c2c8da25fdf935a41d8da4e43fdf7c686f42663706ea7e765595b345ea788d4a0d33506ade385ce7c6a88ed51072b81c9d0a7cc6e81c51869038fdd109392a37e206b84137d747a5529da5ae76950e866a47db6793307febf010784cc75d34a68480b17aec0dc0f82b96ac01bf0a317a2e09cc69c287e22cc00bf705f9b015b4630eaab9db69d166c1a077e2cb30ca5a4c31aabb614cf26b3225d07d0303aaae80b4a2a23ba7ddc31a7e1048456f2a6ad503f3a4207c584bb13b64dd355ed8ab4a18d874de53166729e76cb502e1b504fd5834192f4e804b97543b822c24c0206842b95c7402c20011e4b83892b726fddd33db9882f1342fc6ef32b5a464ff1ff40d712e791c3155874f68894772a35a2c9e76766dd7c08f68a7527d2a32a8e2582066cdd0180066d5a246bd9f596910798ae77b5c1f1667689b31805dc3fb9507ad33939ad29544d1c83345e3e2ff87fd34086f3edc344f3e271c36108b364e1a9e3a6c720aca625ee3e43b7f6480180e4b1e42572342ad0425c232f4d81cce00d3e4a47833d72a2879f1d4e4b8e5d309b32589946c39e7c08faa1e7d93ec8715724b75dd28eea4b927e826e4ffe6d44711cfc6986e42802719b125a4c63bd3b9b4fcf855b0b01c05704d3207ae5d296954dcfcbfaed449fda7f7082cf1c138968ebd7c515716f4eb2731f3b9193276dbbf2411fe7d8263676f10c9bb507c0f3184ba761f37071adc5bc0f5505ad2bd31db72a3ba5bd58be055f6511e01b9db3d6f80ed32ace09ef825fc3740cd9119d8e5458b9732afa6646e48c4ec003c779d4b7724ce4bbb1867519578b569d6c55d8f13a8e90844b9a167aaf6a3e4474f82c6dd74d4265ad1084caea0e81b282f468eb44320b0ccf7ba810ab665222b1f590546181a6f2d3ae83bc5f8090fc5bd094057d39687cc646e0532637c9bfce6cf1fe1452c574257696c9b74ec7d97d719b179c10338be4da3d85a92c55c1724a8b3ef2b05dc5df459ab5c88c035ea193b69eb949760937c3db8a46e18e8180301649f2cbadda64012c402248f50e1aeccb0c382d3a7f832c654eb6c5451d9e42d47a60365bc3d323d4f0fce7530de9d3d2981d537772e7c81fa988d2a3874e04f71bc4dc97b3087fc7c2950df300b8159a4251598966df15de001f160314164e0ac4a43743181390885b768b905e6d63ad1e14b98bd9694169c2bfcd8b22cdea3f87f0174011c016f6a868881364542a020646305b0db0db027d0cc5ab6aae5d07b2ea0cf9dc121647d9caae74f58215997795a6494c1660e4d60ab570578ed90d325d40831c6fa002ac15167a15276073d0f70c297cb67e101ac0d77da2c3efc56448e2dec945b95d16476f4fd12ed42774050aed173275fd9e0ca1b661f3bfb7eaba382c54f8fe4a7de40b8947b6efc6f7bb775d5e3330b5d1224109d265d55d156b0a114a0dc3fdf0389699f2c6bc6e060f2e8b5d4ce6a222ae5dda224454d08af899d1d2d403b5ce4423ec4a3ec2086276ff70ee9215da4f4ef518d7cda2e40d38b5ff97f690da862953a7e4c49b5a02b4c374c3bb5e0150fdc7c705fab8236118981bb2e0d719a86b16b66dcbe012d87055627631bba118edb2a06faaa7a28229c2411fa9d57541aa2d785695b00d65ed2f7c68aa03999f3acf977e6d36f57ac2fd85ad184d420653f0d7adf3f0abd24a17041bc68c4eb38b14a1757d4f781721f84b4166773d320a1e6c773dd20b52d1a122fc41f94a707f78f5547bd83fe61715c91a809783b59a1ffc3c41533ce01bca8153a040c6e4cd046dfd163c68ec0ff4f7ba048e4449d9e66eaca8598172ddff946564daee7103275a37cda11c0339f3aaaab9f65e9c55098a6e052c033b320a3930435c92321791f352837f4955189e65e9c4b0de4efa13fa12e2da20be72fe7585fcb4d6c0205c53475435b68d20c4045e88391b89a8f1862ba35a80f56c146fa6dd3a475ffdbb1b5b29d4d7466966084439c5c76d6e2ecc0778a76c7f38a4aee1bb0aa5e93d0bc06423c17694358a4c1ef2888386c87d4130388a8177c82fadfdee2452719c30ddacaccfcd69fd5b4644215adc3e9e136a07174153a89f99bad29bf1d9da113f03ff51e3eee53c2d647b62ef42e2d7441d33b21e5ea03854ba10cb7e7abd23b816e86756f0a5b2344820cef6afb44f0e4b25f01a5bf555e1a81c8cd52c8910c458cfa8ed1f5f885e59fa18f5af768320f14138acebf4e86188bb69a82397f5557cbbef32b31c8d10e925c018343fde051a5a4570a36d00ad7726f9d6fc782eab613af88fb71138043d4e4764cbb4f52af29f701b01c6fc67ed41dcd82e5d89f28805f0a0f4e932aab74d5d837dd4b31c6d7e19a5e5dcfc85e2b0c4c3256b47527e7d3a9729d80172e4389771739a01abc90e02efccabbd8cf1bed38c9d7db0b01212086e65ff2cdfaccaed2abd3333eaf84ea89d9f500d04304263690b8e43185596a3ed21e7288b4115092987346fc83d91825d0d119ae3a28d0af4ed22a3941903998355ae2e21ea41aee1d7104f5992e800d2b16351261fe7e81d3ec923b15b397a399306427a8e1d5b930e7cce108ba66a9c4840c863d30e265b25353118df0a6f12b79cc720e8987568b776f30c08727b79f110d5e796fa3360335f1bc60af09b8c3fa107fa636cf43690a11e05a4ddac6d725a0f7112394eed3bad53e0c6228afea810dbab25dc517d1dcb5b03c1cea2da329a6b60a72d78dfa82cab03837ef1cc759ed2cf037e2166c16a7af083932b63abe5413cf19459ce7afb9f9101d2921d0400639953dee1ef7ff880d7012803c798cdc1faa57f20be8aaa87b21fc801f2663fdb913df31c697a953d9942c2311b7d9428ee72e1f2a669093021e5c944c8530cef16f0df94711a012e6d878e3715851547af58ad2b5d18f4470b065794431e5b073de3b8ccd547983b8cd4b020c4ce58d93f12e022e93108d199cf0da6d9909cae355d7496f9745a1b8a010c20e572be790bd42242e10242dfdc064f42c8d9b6a85a24b5aed801d8e9d0b6de0a15536fd13fcd505ae093ac951cd35b8871d9d7ef024f291497ab13c8737d5a701a8753ecd36ea44db0e2e8c18fb6002c10469493ff2f2fd60353d2fc38214c745a7bb0fb5150e79909409c6161d77b071e4e5c4d1058e356de6eaccc7a91b9322b845b8f2201541b83798552d978c5901f5f6d0c59aa96519f6fd6147d4dc5df644bd9822c6ade50f51477476f31479aef5a91cf2bd36102916038f98a50ade1061ef980ba5b874c8a290630f0dc188e1d7a53f8b29e6a91673f7bfc07fd66e68f7b788adba51bb0fe5f2e94efce43008723313a80d6d32ac52327695bad2f0809487e0d6dbbcdf9dbf9e495e256bba4ea2ae3190028b5dd613ccd4caaccef6839b232ea92cd1da50931a9014786f2387101831a0ab81c697762dbd822678a222bcd2721bf2b875d619bcd396bfc8dc6650eb10c9f69ac701273e7f2a5d1f32297729d2d9c0f3be1893e448767faa8ce187c9e2be90aaf0f736f00bc42c206aac7f5528adddad0c40a2733e60e4adb03a62ca7c6d3304f085291a5b47dd469d7cd753f60e24815d71450340d0b73f93bc10c0073a5fc18107123847d6d69cccf3dccbed62db1d6c5c5a1a345333dd2e804d3db817d5eb10348af657de738fac7764b96c9397b4d7aac37fdf3c905f9c026b3aa5970c9d0424882781cf271b9b6acd0d65019a6a4182b16289c0a33fc64060715866003ab1f34cc16f3d8b92789046dc29ed208ebd0a58adc4869d340ac5c4013c3291154ba7a90d5783e3c1ec56bc787d4298dc1267fe9ac70a66815081205fa4fabfc8526f5b8373fc380c1e02aa6031828c92796c28eb60068b2809403af78af24dc5c903e67db74a3a22c2a1a5a8946dd6141f1babcaf2df6743e8c2ef79c471de8a29bde2a78df7fd4e05e7b3d5f8648d0ad31f2004c0e27f96cce651f57ec9c85853483b45477581c627cd4c1c5851ae13a5b3050cee3e9d263452db69c5c643017f67bb0184f9fd141cd856f5d281f7834374fbbed77f2363c4d2690d923502b7b2ca21cb3297437576652c0e109f55c402cb31f50a34a0b38aff0b336acf2c8547d2bb944f1871056f985711eedd8589657de578362feda46432335d0b66e442b1f54fa715d20e7cf6406bfdbe09d6106c0257868168fb30e930576506223768661a7de2135c4fdd6aeaf58e70449dde3a3a88cba420a636d1d615e47f5cb070d09d0a84aa2e08cff65ee05ccace999bceb9090ff7c9772f9c6f6e1340b05258b6dda87eb761f9fa92b153c44828ace90cfe8aad527cafccec344af98d2cd616c9cddcac13ae2c5e7cb709b447beed54482c6fc1c5c375e6f6c2a32ed32c5c7a541f48baec4f547069b66a9040d8759ebe4f84e89ed3432c8f6938b30dea144168c46e2a87363870d90a176663f92726c9b2e4ec69d490cbfa7706f8b4c4feff5baf1b8630d71a46ed5f1392deda8aa15277344889de2877b0b316d05f5d7ffd933a1daba3a08ca7db00e0e2245eba4465a5ff650b19daeac5d8d0199c70941d7e93fd8401ac41aed42b972047dada2bc6126d18fc4aa6e6f58b766b087289f0e3d951d784c376a7b89c2d1b8b094d5a431e04874dda4514b61f403201551ac40c6f020338ae473350347874582801af1eb0b036cc4939dbf90e87521111ebfbbdf08e7de989ef347adc7e578b1e992b8062f942c36cfec741c6ff6a33c6571752cc4b3999838947ee7422f0421089e2b91e94c532f3140e2d9489e909e0d39622d59344c8f95705646a9169ec3c88c48f982a40053423e7e96b640783505f7e7d50d8e9ab8af2a4d0582271f7d4493c245e6ce7063cf99cb2982ec0e4bba711dba495db731692b490d2b406401d09b000bf0d80c3cd8e4c223f52ddee6a1c9b82424b33955212b9b73ec216e8a58776e22da0cabb24acdda98315e2a2da88f7314f151b8e4f47912daabd5a6a002db294b9e2095aad3bec0e3d61c274b2da2b8ddd8edc8d82849d8b4bb39918af8a392b9d9e808b69bd0a419c7d9e323a5cf10de66447deddc22a10b67f827f8402ac9e1566ea3636f946de1f0f36a5c675de5725a4fe116cc04860fa1b8e8280e7add130a58152722f5e1fdb36127479d7a393622de81cbde593f3b0ef9b44275588ed96ebbb7737909a3f8199806bc10fe15f172ceeebb9720476ef38037941744d408ae76b0afc9b256293a58ab132ffe5d8f737a601b18f6001a676f446a15365c623187efc1a4fd46705fb5e47d8a30c34d4c23f4f2f98adf208ce6d1d52030099d890a4ec7f2f8e46923add566e574b94a4e532dcc202c4f07bf45bb2cd3904740ab1fb504465c05ea64b8974c87a3346ca138900d7c4e940fa719f1f2ba13ea5b4128f33e68bc2c507763e6f4aab29c062ec8db1c8b2b1b18fb04c591955a1ac8f3a829ce33d4e2bf66b71b4a3a787b89413acc1aefe240847f92d69f1b694f0d950b4a5aa887eb863048032683d65566b6f7cb4aa54c8e0d436ba1332ed8105d0bd5232e42c52f9d56743aba41ff8266c0be8d39295bcb563a5eabc27343b511b288f056165fdc56335797198e61f0217e1365453afd971c3e8f4ce0c656557c64d840c8ef3cb2fec4cecf8c968d254131919f56ec1111489af8b4df6fe4b1452c908b0a38d98ddb85d590d60ef1a232f7ed30c001e3240eea61a45bf4a808d9677dae29d7274c3d8e5e4effe962ba69ad07c7833cd6cb319bb2ac60b0ffe94caef6c4f67ee6b244866a9c0cc44634ff2b1db1dc13e299e200f04128e5b6eca20b12ac4a10819f800f25c16978169f62d69ad2fd20476f68a85db0893116082931048ea1edcc124667ec058feb9ec5e0768a745ec94d873239a33905e4cb936ed040d8ddf695702236f1353d41493498cc34a3b9c077e160740d4898c0b72410779d9ebfa931a2eebf4c7ed2c3ed121c04becd70f60aa2d89808de44658add1ea2cd71285b003937a045b68461fca2c9ffa7e34fe6b4fd1b8e094551463e9c9b6927c6aa26119f65fc70d8a774aa54f25d34cb338e8f145745fdb260d7ecc6a787f0e5f0347c2f389bf464b2c62633ec5c297bb21116b2bb62632380c1b9636e70e2c830d4702e7f6b8a1be3acf4eb37d2453df0533ad083838a2f489c8f8a8b77072ec34ab20c37b23a3730675fd10f672b1ec5a8f7913692ae92153e296e8e5335e2aaf4f928ff72b0c869be5b7b49e15cba0208894b3bf5a5ed815b6ccd05418b113a5ee2767d34f435c508aa56108e73a4cd8e1c017e11b70abddeea8167fa1ec628ea45c0ce586a6d3bffc01c5f137abad42e48203caefd91be2fa423a7d3958a2f0b6da2124a50e316959fe28e2c8a67b4dbabf2992a1336d38558e13942818e793a67b6caa8cdf8e50e31837280382eec9cb97eabcdf294c3bd1b44d72e87f564fd27c36037feed8cd86407b4b9b9cb6795ecb00f9241049f953d0c6dd51336ae8290abeec4fd643438df8096dc96c1022eb0172f06ac2aeb146e336e0276e9698bfa5e5f3c24e27c0e0c942e693421e3662ec73311bed66773a97b5ba73e2fec4ac63c7f311c5be35ea392889d5cb9329970cffd63dd45b715f04994057d33864a3663b7ac44124db8a807c95202866dcc310c4bf01c78c38a23db945cafe3de182c5a52cfa9949b92c096510d3a349a9e91d58eef7fd0fce5a3f9eab628b9fac1e4e2f1caa75148d0dbd81af1bb2cfb36aa90d7e210b6fd5ebc48e9b3cdd6fcb8b43eac3f426c2b431da18e820fc2f9cc4aa156125945bb6da94cdbb907a57ff0aa05f4a4d39c2825c2b662690f3e6970c20da477d6e126831cea533396e1a994d40634ea78acd7f41c6bd25ae59ceba5131bf28d5f12df564cfae3844f800aa7698342bcef57a7970cfcc66593fca42ad3461e506fc6ed1b347623fc02e86f42c071a9adb5daa6138f50ecd9b8bf36f2a9cc000fc07a278f5c041bb7a9d564003479d85eca42a4670e6f661316f1d1c737e88f6ac1cb27ae8ad61ef14aa0e2e4ee81dd8a0e713d61801bbe42595dfc24b6d4463e9e120353ebe10ee000f96cf472574578f5cce16db6849cbed900dadd4d28d6f8a72d87016e6ffe5da40c21527cc3142c4f2027928c4c6f6ee586812cb6fae88374c8a194a923f286a098fb9e1e2c988be0a40ea0bbf96477f64c33409a55552788b97869500e4ca356773ed743ef243aac0a6745bbae2a5d4381da15cb025c52b9e80c197f29de0942dc40f1b367f0aa82568973a636baa24bd71897687fa5107ff5711f53e3c93f5e2df8726aa4004b417621d21fe7443f8ed40f335f125599a86b1c34064d8b38643819a0f54496ac2b5a2ec2f866b17a5cf38c2b5619dc42b77b4851da535ad971794709874dd24d3bc7aca5966645c6396fabcbcadc84f90978c5aafd966af79c0615373c580bee80795a045f3a2f538b619f66e7118c1cc23716ec9f0b70566065edfdce0944fb47bf508fc43d9c829923fdbc8e7e5eee8b5db670eda48e83fc9657409e806f09d5ea26e6e80a1397c599bcedd92fb3d8fdd7602e851bec09cee61b1206629d9239ead70ea24f4d6e97977188f0b320d2b30ebf47a2516fbb16a5765d6dc5d96661211717b5994b27e353b8abe90fdedf764697d5747052316a42f6992af9b220ddbe9896c9044dd8441b7902e47b4f557abc48d59fdca59fbf1a266f638e0855263a1a1f7acccc173a01b9efa239819027f550ca1ec22b2d3bc7ac772fca89a05262e964e16d08cbde6ebe9a00e201414d24d874435f95d6fd7cf84e1965c9f4c4d2a3aca0ed8550e8527ca69932133a25ffc7e794a0625e534292c2b8a932f44f117a252a0a998acb16b02878ade41157638e88c4eccc74bb6793dbe2614271ad6ab852d6dd8fc3559a5f7ef59967e41d7bdaa4a87f3f3a7dc0c369b464edfef7eb04ad55a4396d2c4a49a638b0a7c612c7df8afa913467340887d6dcd39cc8617cec2d80cffec71ca549efe105a6b65ed66b5bde53b26b60e28d5190c383a9d0eb0ac944d6a28d86b7f5f911d150f4937bcd216ad63cc3f0e18dbb3652f7f4dafbc7b51c5fd981bcbbb7e966226133350acf6063c867b1ca996e95a348a86e361cea49740b2340fa253a0312cc67011125c1e40574b6eae657869aa93217c320840a37b30981a3282b1706df90fd6cef2da4395bba987585ae1e904a3310a2acd910624ce8e9b65750368779ec7ce29dd853bcd376c0347360aaa1b3d840e140014bbe4c5c91aa2c95d4b5cb8274402b7867880bd3ae2ef6052ee3f610395c479ed8d4bef4020b5447d2db908b6b7c9b8e3071ebcc946818186dd5425c33fcb1e37ffb1cd008db91bd5b9094a61727e00a79325cb4010713dc2e26eb7e7d23d59a64c9864a2c6aa767af1c1dd518abcbb937e34a3ee043e6243812208793d23dfc0b68fc6e955448b01695ba7b620a801697eb69b291257cc1dcbea6571362e508fa51e0ce6df0f69b55fbf162de098fffcca85e8933be85cea3dafbd66d989178600fece72fdc3468999fad43fa9f472bbfad25b370fff05194243cc926c2845a09ee24c9666c6cf03786748d0c1d3728e6307eb9399d3006f7c728ac5bcde0e02ff6a96010cac1d3f6a6f4dbfed005d97cc963cf6139b1f42c74e2d68fda1e40dcb604ef6d2651ce22ad06e72976219ba94a6f895de1b9916b75431dd5e7330e69568b3b48d46d4966b75f5d1a769c0ffeda6c01968654eb0e8ebeea379b086b5ee3fcfefce9705a0e1c040cfbbd477a10efee9f393ef02c7fde14b4d0697587cefb35d783773874751b1ffab59211f3ac46d18586318b12608f4abf3eabe50d527b4b44f038c5f81a3521b081a3333a524c78660b3b933d0c8c6affa450f213101a4297dc6ce82533c8576c7935810d7523a625e5555750bc49e73012b2a462a407ac31a286170aad500808257137ba95e928cc6ed8b17086960489065ce9b3d6deff4c7411516ceb7fdd8a52c61bfe876356a137ea5b0475b9292f82cf958d7ea4dec8cca0e31d3780d814a4d1b9afd30ea9aa0702bd18f2db8839d2c3d560cec63ee0d3e1c6c62ff44aeb6a6b32ca23f3dfb3164711ae1308a7afd3c8700860ea888a122365d3eaf14aa098db7203ecfdfdb6b52891c1131f6ba341e6da6c3c1fbf812181ec0a5da512c294e7fd1c2ce3ea6e1c7d1c17630773f23980f3fb856f7dc7b5d1caf0a67439bb8517420c47752a9f05f70459743031eea7616c8f172a3d3fa854af78504bcc5c0d930895c6fcf5408462d05fd518bd0b70ca1049492d43be221dfe7883e5be4965f77aa885c1b08fb5c25a02a122877f2d9b73828152aa73c90ca4f4e22f3d1f33bce0f9919b0925bf9460312250aa595de858ef034f0bb1d2662c7775338c0d88c5d0c4689b3374643cd00f1ff1bfcf5dca0242d492ee99cefc7acb21825b41754dd006de0b0eb5db5d2cd3889455c2209ce955d453d0a1871f7721dde5f12f7ed3e2dfe22f3760de3cf2f06f1e6a6bda0d2321d4d9d441bc335a721ebaeb167b4d7f70b3821b9825d0797e1851fc3d43176c980176be909b123b6b1eebcbe9aaba00fab04aa4d02b4783ce2a1e702328fcf7a720897bb582e5b2f378efcc567c3c5005938c45510dc586e82a32d328ca6d96f8ff1bc5718b8b352633a442e8d31250704457e7022d6eb40e855d9f39686414c806491a38c2b87d21ae42ce6dc0da17f26b0ac7fa9314ba796197ad2b9879b9595e61dae6775f5443aa3097568a6a2088b0e0dd4a31b631f2a9e5a0feefa4f9b52f883014d9d863b3c627950dc78744a1c00f9f615fcab68035d37baea167505f98d42af5d08f8b7961f17c6a0f2335bcf6058a0ecc8da98141b58698355854e03bceb9edf1fd1bb96d00b584d60731e09908777c2b7d0b1ba9301cbd9282313480e059722464f42283881473fd916c993b0546a1592fee2d73edd2f09c374b1e0e3a6ed212a9c3cf5f8473031080b61ab42aec3ead87b07e218df5667b64261fad172af53d0d0cd8f9cb55a65e0dab82c4f0f85f4a29cdf84c5c2ee88ce44b8795bb001c7b7b5927009f198abe57cef643420b711f308a216f2ffaf36308d82a10c072ca1fbd799943048c3fce63c340703924d7bdeddcc7294f9efa9443086ea4585063165cebcc40487c21bd0b4c8b632ca2426cb3723148b7c4fc9fd7341e78eea5318ce9ba5e37102359a80afbf515f177452ae28da8b67169ef4abf393618037e2f022075724c7a7a989922f523f30020d215b2b188d6a790841044e814205b7548e199606537565683be5942f693970319b8d83304f7e279027f4c462429375203518f5f7c118a320b01c2cd621e7824258720a1559c685ee43667484bf94fd67bb1c07f321894f996d8d27fcd0d440d29366a34ba5d9ebfcb4aeb89d942161a57fe9432745c05e4d85e5d02bd22e1d6be361a7b5b8f23f22e1e07042398cf1e81b2f4d06624e65c9f247d989c4df74f5ed077337589d42795fbe59910ca24f0c42bfab0301222794f7b2e8d6540ff47b88489d007966e9010cf2a32ada8ab221e45b7752e2799061371bece8bb253da2e5c2984faa2501a146215766ee27cb3a38843e9f0a31f03eeb900aa55c21ae4a536379b9fee0cdab6fe834c010a38acc3c7effc7b72758639436fa8d33fdec4501e87ba7f0358003113042dd0bffd1b46a03f858349158913954b93f729e2b5305570471ccb2e24aff82c8bea6dc12f6fdd070751595843481845a26dc0fc4672321e58b75db1d21837ccfd8f07650538c5963821d07125626ad0dd4d66a98aba259731f63e9f44b018297f6ee9e4e9448f84d436aed7ad9ed2587869d707c12929cb6b3ff5ccce4945c5fc8db8d41570b6475b3089ba2396f2024b8457655a78a5ec74b80032ac1090a6141b75ddb0d072bd68a7c93195fd161d47bd4b2f901c3fba5a7ebba352ee9e459dce552575ed250e3ec430344cf676396c4625c4513a5df1c0fb9d272223e294ba2a8c5de22bb7cf0955b97872d7bab31bf700090062498b090083d75df8db9f41a11da308a4b04fbac3b3c1309b6df883bdc2bc3ad13867056c51331e666fab129f9407d775025b58f072d7682091cc30355858c3afc7d3ee7a1c3b029b6350550843c174e9afc994574f71bd8e7fb05d07380e7011d8ccc474c3546b22708f7925c5714e46a72cf10db463da51908eb89efcd694c01a2f3f1e10f493e99e469d98ecf2f804b70b164dd50e9d07b8d716da3bdb631a7bd15a1d73187853384dff3d4c8a54de14081b999fc8f250f4d674a8999a6d58340b427d7e02cc540e8baf6166fee897eb19ae06234d804c0ac392836fa79f0d7286b927875a1f4f9a7bbbf17211252ad0ec85afa2a94aac38f67f29d55c70acf684d6b211b4ca8d101c15c022e7c183f1aa4e8cc5bcae3006d6c348f605dcc7efc5fe576dd3cdbf3b7f1c4f63b0ae22c8a7c88348273c9172f918dd49295113b3647a728c4915de1f5273967e4ba6693c65dc0fcdbed6dcffc3818e801d7088225ec4e347feaebc04d1ae33abef50c5489214bd14a2e355c47053141012bc0ef0256b00bcb1fd0a49721e3bc9f9098696094a7d2c43fe9a7f8a641edf296627a20706c0a5f74c040fd8b1059226c9f3125c5ea1cd9ea953fd48f3ecd2f4ef1b820a3bc1558963458ff6f885f7d98d1f6c450aa8232ac78a818a73d24cffd8b01822310f94bd070ab00fbb1a4f252a41b9e61254645c4bb35d4b467201d33423304dd0bc04af0d962920e93c82e7d84e6d24ba0fdb9d4d561e5a36674e5cc66958a1a438c01b1291a1edf561fe85615b919200cbc39959ac8b937f8798a19225fafbda4ea20cc8dbeac897fbe6b061a3629289b03622cf05a37fa85fa6a02843773586f94b75316da99bb6db10aa2ee03287f999fbbb50f4047144b2f9b5615fed2d165155bcf15376d753fef35b8eadea303c44b663f5e537d5d2a901d4f0834d97533deea56c289e6276fc7e5bd4431f6f6e8bc3eac34430b284fc14ff69a0ed097ae08af24c33e7d9a943b55ad6d68008c0b1cbe4235ecbf2a94050bbb7d4e6dc239d26582a1eb58e8c38000c8072d8bb13db9d730b06726add42e8cf94a241897d3beae8c3afba0c3465c1d4f061ef05dda706740ef22fd0db5e1cf9d14fc56bbf6b2065c708049abd88e6c3bbe9e47a41a527a8b87755ca21c3fb03b59396c77da85dbe9bdd876bdb181af2545c4fd1a4925e6927a9d13500e20aa99b0a8ac8ed0ecf2b43ca08626e052ca0d18d131dcf076c0a8f5464daa62f37a68f713b4ed9fdcb81268182098404cf71ff4d405148fda95c59a4c16189da52c1179db7a226fb61738a4395ef57f0744313f01a710a9ef01c14087f220c26056445d53d5d1e687eae2cde57a84c61e9fb3eb7c648c3fd52780c7087e5bf65a81475a797dc1fd88b7f4e527f01d6987d86013a9d4e93e3000224bb924ae2891e1011d27a99516741ed123bf685a881b991e9f7226c7c12285bc8c61db86f7601452265b54ee68893dd04802c4d86b4550895e260cd202cb422c83a360601479c329dadd74554fa632439c441fc874dcec59eb56c0aa008d906725126a930558e7a5ab9c6671b5e5bf37336bbabd5087515ad970e9e5d86c40931d219fb478e91f9b43eb3a322030bce84e608bf6ff9e2d68da4ce00f10310dd8828559e751c2d0f96e4c9a5758eeae60e968c68f64244612eaf5eddd970553c3712db89f5935465814e9f974e5e64f73c7a13c96acc90e35e5a0308858f7701163a52efc41cb7af9613c6eaf0df8ecf950e3ace48af4273eb8dbb63544675c578ea24e7390bb490ffff0d3ef4928cc74c121d54e592cad248b20e9ae2f88eeb6eb85bae19b95026c6495fc11a90cf3dbd8efdf9d9f0a370d0486d71a7db383cfdb924d0f256537360bba346ba3cdd736b519a11e3fd93125bf098ed44918560058e8bd54753a863d8b200ed7356bd24fc60bb89fbdc0d5f10d0b5a860fd1f0890a4edd65c65590830e2de4ec130a38cbcd4d2df316549b7eb4917935c0e78893a32497663a70ad0a1b7ef23b90cd87210c63d633d148a28df54b72899b7b174fd940b9e54fc8d3d406257d4581d8d7ffcd3af448b532c5204896dbedd8d24b1fd09a4ab3e89dbabfe79c3743c84a102283ab523441f44d49908a255b1582cad7b644b5b456b6dd828794b12a6efaa7604b138783f8491c4e53d2dc91443f1bd70755e296afab4aa84fbe3562276f9f5e93d2660a1065a96ee55c15b12b765046d5f0145e7007ea0c2aefd1339e83f6566af611629335cd4be69a71f20023a73fe871a50606c8ab98876b6b5b5c005761e99a98e2a7a6e11882c95e5c210bdc4618e546e5291021694270c50f171fd8540af41cb0d02d94667adaa02dc84b812560e014d4d870f0b425d63f54f42d23d5900379401ddc307d925e29cdb6cf6a097b0497f224587acde3a898dce8696ddb85827cd17040014ceeadf6cc9b66cf35c53b6d236835c63ede93f2ce496b56f9ae1b9d9af0f666a69e903e7ea4716f463e154b22bf9e933e1d3f603ea49213724925560993431173970c6c9b2417cace14f38e083e42ea59594b9f7088b23cd5fd3cf0548740ea007672307e5170384f50fa034bb577ef518914db8d70377081965513d2a87c999c0c3616ec5bd6538a572fe0d7a6fe944fceddc8bca9a7ae3e325373176fb1d048992ad6fa29f2114351131b3ff5f7868377cc53bef41c6de8ff173c54bc5ef1391a0a319a056629ed4011658813f399cd7ec64a838e8d7bc05d7ce18b1c68132ba432778691ef43ab0474f42548a5c7c631bfeccd6e9d3dc40940b02c7b58f7d3ef310c3ce1ed74824747d01bda61bb7f9b91644da9761ee9706982faf4092f99550d43ef378a5a667411d3546c4ef4af2c6df1b3b67f48c6cc8f86b5df394b1bf922825ce8137b5874a3e5ff3aa69db4a2761271a97d6743b0ba9f9989483a138fc06e60903fbefd205f20c0d2ba8ab18cd707d8f545053eda7582edd37afe84625491c75de97242ac87bd7e54b63530c494b6c235fdacf319d0f9c16d7c2e5047989be5aa85549ee24e02ced025bcce5c5067443b924a9af69477ad77ac52590347dd1d41dc578fe6acde89c944d2e9e9c66749d9ce85580969a4616f370a9cbeaa5cfe95bdb7502f5d2b475c5ba80d2a2b4fe5c411ea607246954b6735aab1c29eb6ea9f5341534c0e96d332eeee522d251eb4d4b969681756b67b8bc000fd20ba6a6ca6efd992db8fe4a5df853abd27eced2be471a6f56252e8b1f3c5b10275e85ed56f3b420b2e9b800508a490104baf42c8cfc008a79b7ec2529a377027602815ec57737ad7c01ca99b6625eb8a049ba93c82ecb575299a469fb03b8254e861d0db02eaf64872fd0254c323744e59332cce6a402f0e40aa1494ff699b293081b1aaf0ecbd39f3baa982729494bbc3a4516b38bb50ad92f41add9f5844eab4ab49c88ac27d13baba2c3086674d485294de3936ac39c9e72cde129830e9fff0ff3e4108a3a874a0983fa1ae9a56551d189d8945e11a073a0a6e92329f6af61459408ba224af8c2cb49d102fdf366c99659e5288deaa97eaa8307cfb9ea3deb1f31e8b2b1bcefc925339eb8fc48b7338457e236e3eb4914167065a47153bc64369ae10661dfe1272ae9afa411ea1b7de787a370929829c9bf7ed7348e5c31ef19a1f82c750364c91e41fda0318377814320a0fc5274695bec98b6c318846c2f6091218886fc5559222046848749bb4f63348d87d0e28d6e205505b67837eed442f564d690899c5cccabd71180cee6026e804c717894e0978861b54a692b2c7dfed574c25561051f0880b91c2c5ce44a7e10704191f1d793e4e5b121b95aaf7b6d88fca61170460d1cf9ac106410c78da688bd9fdfb11d3b7543d91dc640b0254da0f84920e0610060f6f2c900b9ff56966bac9d5ebc7e295306151d3a4928858b5f423f9b888a98001721de556c59f924bdccd8429d8ed95693d64eab5bc61d71a43f9098ab6d3ad0967f4eb1d507d85b70b699dac44d4f69ebb3cafec6da74a80233a74057a56d26b496aea60901eec40c5c6d5038d2abf622bd428104d816c166b54702127b002c13d7f180bee4a7b8412ff36ad3c9fac87612e2e1b95457e09b9557ce8b1474ee36980e282b2698e29ee2df0966c575076869e98fe08ffc5503533aa50e0bd52c3c81f460fbb327d899e228462cb3142d29f68e70d92ec5c43114b863749a1e87f36944a5144e23f589bd046631f4c1b1e3de3d4d5028776d76a685f2d83e95918faa4b04a75638937b91b7fed3ff3e865971724815dff1318c6f63c532e040e995068f77c7f1262f4503dad6e1808a1abee2074a5b57206f10891c02b6e8ee4c4fa9f6cd58e92a769a4ddafae17f69007d2e4a3e872ba54405ed75e213e821162fcbd38c6e23c4ff350ca23e9c90610f4a75e2d7d8d5d42fa191f4b2571186fb594fd5329e918bbb1a682a766dd79bd54b7228e320c7354f6abb0259836449aea68335992a821d3c0a647e8aa38c85ed983e1a2bc703fc3bec4ad84d0db4b4e68d099aa953513f969c3111e027b149df938518d998eb262be9fd15edc227f001678173081cdcacc9e82503e5700636b33e04a287c3abe20ebd07eb7d68f15dccccac2456df7393860aae8d097f61a788229ddb60b3791b8dff0b5c251be621e95b84ac455338326500153b7d1505704994371ca5955b0641844f6cafdcc4aec5f6b8d27067db24dd2924f112fc111c0aac0b16492b2c959f985d8846f4d13c8d8e51984ae4fbee65dfa1d7a4cd28b366d258a2d6f51c1b36a4b7e7e543d56c5b534e7e68d6248d5086761b533d6409b8f906c78dd6001cee515720559e6ec5bcdadc55eb99b5497b5dfb929f7e5aabf49d152943ace17c12c569a53f43c29cd5f57facdf4ca6f177a4128df236aaa825e0b4a0665a8b78f832e9669c6c5369906eb6d3819eb5e8232a1759ae60ca101bed6e05adebbbbe0c18f5b4c59d98b7a194a4be018f8e05f60854e4e3e9161bc06e06266874176891f1a3f41de21d2b0626495a7c3c16899062a367002629cbf8e408d25c76f7274badfd088d3d96c6f05a683d172c3919017137de46b65d1ec95904052716dedfccd32d1a4c50db6f52a0cf42dc31680105e948eb7997379cfb6e14b2a3ea0d853e823f839b8903625432cd7acfa06430c175c2e6636e631aef4c260f883fb0244a31c2418ce21905702d2baa354568e957d34ccc802d8c042517487055af30f04cd01f5d2cc653f7a732eb34dbb3f2bce2eb64ee9526b77e0db4980fe23e407a8a51ce36a7e791f6bbf55bf331abda96697a450666d0a372bad1718d202363039b2e0b699668293e5140ca81e81938c218d640b8f420863dee6a1991902b4873fa90f2b969e4188dfdbba61bf722387cb99833916c662ff13481e51f5599cafd31b369712dc8e109e7b244649b4c3f5036451a030dec16fd9a4dbb9cd51893141c6b06429ac375b382ab4d0b5394a05e730a90c031c2d4cafd17f43abbbf86947da3029a0d8e3ea3327026b205562c5511761389d33d539bd8117bc7909e7041dd6522fafd09c01ae53e0dc53c7ec9abf2398d9091fdc49a52ec12f2e56350dbff40a97445d08dfe7bbc01fbed24e10335bc61234ef0f10a1873eb2cf22673e67f351014f48183a0470e7de27252fc4613e80466ad1ea1ddd8b41dea52d582e75d88c29ac1f753acf2be29cdee452b15c2da709e5c0adcf1770210a2dbeb0be7fa4c01754ec84fb61de21bd34567b3c68388678ea553b5a23a99bb4b49399f87fab4733a057102572878821cbecaf5a2192d05a1a7bb0ad0716a85e41199332458a3eba82ab5ba94a22672253ece07232994ad1fd0689d37c7bbcaa2b32353b52141db412a1ace8887e0b1b9d931f1807284130a2d8264c9fc2a94c47ccae0e205762a92fc0ef4abed72f4be4696b0fc46375a0a51f6cbac15771e6b13fac02cd8c3facea81e303f5a0b4359414c1360e2e1cea8874b84b8d32f40181a1896544241b681f42e1a4b37e03f367dac85a6b6e9d2af383cd3789bd221f808d85cac9ee9f22f16b7b64dd4f685c300ccd306ed09b8f23a93a6699ed8a88019bb6aa313dd7d9bfa7a49c75c1935d123494071f6ba68f67104d9479be9f241096e5cb4495a9e9172a90bc120d04b21af022f8c8fcb0860ca647875e09c2ebe5c1b69970172870991f93b5874abdff06ca5128fa93911f2d943feec0483ec021e0dd988c7c5a971ddead8225ae938bb9ebc4ac18b43a5342b5e39a223b30df162dd066525831da8125003458c81660166b5c54858620a7e27585594c48edd7e8206f125ffac308f5e02f31e3bdd7380e119f3d2f81fadf21d946d40a377e9629eb9f1bd7227004788e3d3124a07e1ce43832eef9cb8fe113d01545402dec0317603e45966d9d68585280a4bcf93c0239c65bff168812d227377ed85a0ea5a6af6afb4e84c30f59012d213b63d3b2e0c74556f2e5f03bdf6c66aa3302f47898245f92dadd5a9e1c84a768ca02ebdbe83bf6ee7d6399fbe6bf9f753347f9abab077c0ac7cd9a0aa0ab1ece316bed289259c500d3e0ce58a1043334457aa58008c1305272e2f8c185bc75077f5209e13c841a7c3bfb5be90af1053cf382b7167894979150932df731c07619207c066fb8336285c6302f2e9184968767d4d4164276fd274cb4ce28ca268521357796cf5b2fd7a8d6055da38db9c7774baff9091989a28141a3d5063b65421fb307eaa9a1496683a14841f9af46a22dfeeebd4a0485407f1ae1b643debf66c28dcd9491357a95ab46749880107b4ec779c16799ecd127c78dd9a39edceea8a5a31de25bd277bb8f51d3394b603b26329fbd897fe5cd6c48ef8c7ce4a172b8c099607766820bfecd64a5cc3f4d36a9173ec2ee5d6f57ba9e2103f0e581cd62995834589d5ac5345486bc9c902167e1f4d66d236f37474013da25d09b8d1b95303979c58d81dfc2d02c5e6ae31cfbb41b96ec28faa70d508b400468679b932799141ade97351a5dfc0fd25a9d97fd262eb0d02f9ac0075f22bce782d10f4164077c6d1b1fb8a947d6d30766ede165be5ba0b308a10f4b5e362d609f4aab4c2969e5b942310b4a33ac8938ab02592dfe858661f1c19509df4f06e47b21d29b84300c16b72d3bd1d00bb3d38dd37985b559bccebaef28b29a15da12e9adc3b2d9353f7cd0c6f65956e98ab6f615ab238f01a51a1904861e6f5b60a14deec07fef3d104909c185a1468c498475eef0f1bb02ac6ec5b75ddb4decc88698b4d11dbccc1e367a21cc53b5b683cd48796b3080a1e6deca281ff68956c819469f0ad0dcbb779ded3b7d18c8618044d8071137cbe862be7b36ca972a542c05a2a30d83f113eef050a056fd078f8599626a321d4421d85c79f5c16774c429a3026213058ba2b45188a6611e3e08073697146bf1aa8123c6ac65b3d38081f90f10abc76e8a7f4e9abd9a814e2eb2998f03153673680af8d49f943137a9ea61f16619e16e22d63743b0be7d1ca4889dcf949861bebc02652d00497113cc07c48ee209e437077bb0a8e2c8ebe536b9578843b4fae1f16dddc9513a5d4294cba8b9819a2056cf6b31d50c0cced818ab2812159f37017d8d55937eb605fd8d134ecf20aa4dd1f547125fa406e11a86bc14d089592afbe5f8048464b19d087734ae2c4c88ee494fd56847b537169c2b5fbdc8816eb0ab5f8705ccc5db323d71d1414470a0261650c3306cdf8084d9d5157595b56c07773c732fe7b1a3229b9665d13b3a8f53367d75be912224744d14a8ebbcab006a81466bd85bd0dbff24c35055077e50e621d70cf90b28b9cebd400cef29a1b536ef9361638face3fd742a490bb45adbbad4a6bc005fab7844e6e0eea8a3e0916210105d3d36a66efe518572cc18ad154e0822bee6a2efeaca85922eb0d05bf56c70cb70e08b06b23a0dac0bfa28cd428cc8ada00e26c7682f5a26db409232433adc4e29f5330688682de3b2609e5d03f09caa749170a6581e020772a7950004a8c77a1ff69d42109bf0511922f6693927a65a0012a1687d8459eb68b341282360da20fa795b4c461d367a0c0bd1bb71dd46e94607f6fe55b496ece0ea7be44a529217aa47a09200eaea0e5a8d89064b75d6434640cafaadff0e9e92fc8d2f1e2861636815a59f028dc2725523a4851863e4fb1cdcfb628bd16b16bf2664bc32c4b2e681f26595c204d57d06ea15a89b1cc1d817f568550247b27a3cad850a038f808d8d88a05fcbde64e04d3adbd7763692850247210452c30d3e6674c4c7a7d4b5410121d3f3c845cc6758f9bc2b2e8c519a5efc79850ed0ed736b1d5f66d1fe5722e4d90697e0e67610b86a6ce0b6e163d800fdcb085c122fb197c70fddc7a9ca4cc0bdc9f73142966e473ef48245330df44c39634ddc0784dc4ea1b03c7076091cc8d35d3c5c0582361081dc21a7e95628ef8afb0372a061fb776f2e85e85205c517bbecdc2d353378b8964203537e5190c3c47180be2987ba262eb3d59446761171f69df24ec1e3c6f4f122470bd88b2b682a7b9eb14e37356f268457c68ac5c3c951a3ecf90495327b6137f283a1a831fd3abaf3656ec42afbc2330eb07a74b326cf68403a4fabb21040680fa63c45a208a98ed53a5211b4d0ed88c28fdd38f5758e53ea118cca426462aa6178389d18bed9ff13a13f6827b45df8a246e2120f7abb59ba1476c25860295ee7f12dec1a850cc0d3067354ef7ecbd7bd43a359b0226d0dba72c3fb9452483186012d45264775d7d46e66600e1856ae6028a035e1a4fe0b256e4a88f457dd8399e50c7a398954729d38d17e06d87cd6493e240f4dd1d745c4a06dbafc4e191338ebc9ce880dfa91c9b72f772a2752cd0002aa7068b26db449669ec8c9025201a19cb0922e1d5443bd4953c074836f3a4234ec45b3e676a13972bfaa742ae482c39d67c072e7b6e84d8156309433b7e527db34c4fa2271e2665aeba266301885055bf3c10ea0fceaecbaa858903b716914ba59d83dd3026263c79dcf13ee4dc4f883c0c6a02a12f392cf5267ea86beec99c899042702ca4d4386893b14c40d2482ccc0925d174b1e1fc7990786b0200fbcc501260e648194c3b3ffb87ee8c69b00c95245c5f4c35dca94ff468582691b40725c1fd898074ce4a4201296bc2b39d3f58889db25be33df67ebd3ab895d2797c97c4558c41749a507797c41e57a155fc1749e46c8266b9ecce9e6312ec47db26e8d248116cab45212a651f5d64534de8229e723c72b89da429036050e9e6e17f1b6763c09202408687dc2a47cba95994997541079fe8b0a2dc915072e64601a6ede530bf93f09b1f73dfc0b44fb5c0108a50f27aed46d36faf2911b6ee3bb6ccffb6dd44e887e2625e602a4f2cfde0904b77ae7933e4e68ca6a86850b0dacaebd9f1e2f4d54b506ad926abf4340a4d7ff808df6fd9b40121ba78e0ba200b286903a929d81471e31381e07dff25e31aa3107763c0b8a26d87cc6bad38fc01af16472e8a532f7906460d8f2d3230667cc76c6d80fd6e37b79709c3ad31aa0b79a6f9bdda008670e1bc651441766a23c8a05e1b02b1897d7b8a68bc6580d136365a85b7ffdccfb35b00b8a9179775c52fb8b7b0d46a9d983aa5fac07cf89756ccb1f078539f54a967166f14f7781f70fe209fe69d0c61d9c66c67e3f558daa0ced6de20f87e38784d287ab7e2f1f939e25de792548fc13cb88c51b77c423cd81b8498f7aa976f4270101c363ea590db1faa9280e41b146a60eb40b6913983a565cfe4b4bf6d4b9c7f3aee0db224d000de2bffba87087d432db11f71211f3e5df9da93d3e2a12d5c633ba97e5361a897c5ab4cb3c26905cefa4c09b31e2cdabef94d6eb7640b9acfe9306565cfe46c2e545104ef6c7e8045e7c1357c21325ec0d1da3451f2bd9d4e41eaedcbe1955b7c41367ee87a134388577dbce66b7fe91c4136375f6bb31e87a5ad77682207b15efb721f3638f8924600124f05288c9b3a21f78032152f6a6b48b395c0b3556e23ffdbe70333bd9d301c843b1d0a44df02d23bd7b03da298f3d107b09921f0e07f3b92425330bf69faafe3422dcc43afb1a12b2e090aeb13e4f5dd90c63a7668eba74ea5792f8831757c00998b5194148ca6a62c8e45b543c13e6d2b44c9f7d0f98248fdc82961026d9603fc25679e30154987ba6d50fedd5188045d9cc0d610343ea7931b347f765a12b05fb9934045033f1807749105d8db240872f4db5e2c06ebad2ffbcc2e26126ec42252d8fc129484a16f97a431553642834509733af9aad4b54586c898e4cd91ed9cf0673cc398950efe78623e0c20bccac83f71eeef0f8a763da94b08acd4f7a6502e643f40c777902ed33cc8a3f6b919af4aba0ef2b68fe5ee70f15ab743d67023e5ca13d659bd0f17a7358db4e5ae80455d5c017f6ed3f3971876bd9be56bf2a85c15926ce1e145fa11114756cf2ae51bf1f2e63444d6b204cbb8b03b89e393b88f5f958ba8af4b586cbc4c9be238e6aad69c4193742d6ce9291ce9ad0e261015b2a88c1c4e59304e75735aadbb48612f64ca373ca8411b10e37ddfa5c23fc5238e1c3b19970a2b5fa265cda612002c7c945ac466648062a0c1bf772d2becdf2259ed5a2f1de5bc4ae33eae24aff48e155e96c5ab4b113d825138cb70606501beffa4a15e5d74073a2db77bca2efed6e8a068be79d29e9353463c15c8559bbb0a8b2351d3c3b81c6a1908ecfae7173ebc18113f979168f7e9fb1550e56177949d618c58d3f126d68018a7c4c36c165afa010458e1a19148fcd4fcb87e2da44704fa4f3bab5c30145a4d07998ce5c354b49dcbe3d29a5a269d22d7d66deb35b42eb7a77eb363b0228c7b210452e64f9cfec0873e047127731cf34677bd0e9c838baa691761bd61abde0f109832dfaae5f27c34d6a06051486b7b77db726f29539232540ace0a630a2b5b63f498b596bb775badf09f6084db46f34663fa1385d4714c7b9036f469764c874e38e2faf78ff42729a963edd33f2d6b2022229a51ed0869ca6690d0d04c1ec520011b666cfacc9f9c1c1c3b7ae41871479be9487f327d7b57ef30398b89384476e8bb91dca1ef3387d11d218a349b03429e320803a40ec5530769d3df30397ea9ec35b20d153c16934191d98ee5f028663ce2548cc35d0efbf0ea520fdf0ecfa8e0e2d8f0cc3a12abe4f602244cee5cb185344278e4ce21211a38dc117834fc941c0c7c6bef5dad5c7e39db1652c0e619b82f9220f10c934bbf77ea7b2514ddd982f725fb43bc2ffd90ee2dcb47e9bd2fbd873bfb1d2e6169b175d7c491b46e2af3b6f7e6cb7f61de9878ca80489dc6330869b33d87236fb07870df7d67cff2e9f752c41d25510fefa7bc418197443f65c79d34776ddbbfe0b012163fd33d59bb6ddb865be81d0fcf99216e7dcae11390a87182dbd34ac3a68ff7dbbc62edbda00eee3bdaf6d3675ec9db0361c9db759fb217a7cfddb66ddbe44e28c40d62c211576cb105b087f7f73a6ccaa46b7b6b370e6fef9542ebae59caf2715670fb913622b44b49ccb6e6ba7d2802b891404a92225f0c7cb626410c5b802007d91757146104992c70b0c2050cbce80112b4a0527ce0a2a1b03d77e87aee6005122c5cb22c42f2446ec9b208899455a783f77ccedab2e240df52aed65ab17feeee95d659c35f407fe28f72fb277569730d5bfe5a6c23fcbd696d2bcf64cfbf2e94c91efdba9095bdfa75614cf6b6af0b61648ffbba70953dfb75214c5665aff475e14bf6bcaf0b532ed903bf2e6cc99ee9ebc29bbdd3d785a7ecddaf0b4dd96bf9ba10cc9ecbd7855ff6505f177ad94b7d2f5f1776d9537d5d68b307f3752197bdd5d7855bf6607c5d58b317e3b1be2ef4ecc97c5dd8d99bf9ba7066af35d3a2a99fca14b3363c830ed40a34df37d4f9787e94d24a316d91d2ed6b9dd551405531b8fef2638070fd37775fb5986a517edd2826929b099d9712d132ab2f85f36869aee1fdec479d486e1aa3b925c5a548485b9fe2e64ee0e2f6cfaffbfb32e8df9765bf6aeaa57c55ff99ecca385a08fad57bfee8fe94d66dabdb4b1cdd656fca292735d52a324b9e3dfba86b77d3aedd9614b79fc6a06df7a3905c393cde39aa90e7afb2ecb467c938fa42a96d72ceef580d6340923124a42c3d9182dada90690cabd5bdde1fa4c683d85793722621b9d73ae79c73942185c32bbd92c74f4c32652df64b09aefc71be7455e92fadb532a6a4c689156d146fd09e34d440739318ebc7dca93f772af6f976ea5f77c967f9cfcc3a65c72391dcc402155b77fdecc2f3bafb4a29e7fc666936c54879ba1b7b373fb8fd5248daf4cd143753dcf8a0c6dff88000518a6c000829638599fd63fe857e18ef591c13f332312ff3ac897fc4bc0ceb078c673d8c67d51a0d5cfb758993055c5974a48b3c73c8b2c8c816790723a8ec6084fb2678f148245f16c8026740ec83a6f53438c884b530ab9bc1ac6e06b3ba21f2a8339964fc8c909a6f59158408bf84ba81394aef2940e61242d60cc3d6d3fc8f99c77808fe1971c8bb207730164264a78559d347f8ad9fdffa9fc1425aff2f64e6c3dac5e3cca6973b3558bacb11d07d13166b3ecffc1f319ee669b010229ed7df04758078a4197c8f559a0959a52f95b08fd6d36021257ceb85c8f89927b22341560be18f7f56a9f5343f64063f919d1f345ff3357848eb6930ab8469f041f3180bc97157adbf43eee0e81270e963e027f3e58e0c5cf212eed1e27f2f77c050e6d61de28e32e97b1b4010cb16c1fb63e65b3f837fb486d0601cee32e116963b263cca1a11108fa5ff7e89f92505b4585b40560bfe320fc45f06b380f4b3f0cc0cf84258a56fbddc99c1acf9342f7740ec03ffcccf6021ac1266b5107eeb7fccfcff90d6fff80f3fc443667e0763d6c44f83870c011fe3fb3f688680d703c3074d263c7636fdcbe33044a1b08f184f0386a56781d8470c1fe16356e94788f1833f4f6f7a80ea1486d8745281e12964b15ac04ff33ff0fff889ba1e1e3ba33ec5327d8ca7f91bb258ab373dcccf67b1540ffecb97fe3e0e592b13fe1103d36016f83160304b855b88f134cf02f18f18341f3e7ed60bfe113efe103f0ebf61cba31ee0f2a59619646e7109679879e251ce9699670c2dca84a17d56685f82134be0c9bdff99f048249b7e965e3af8f369c0a720eed1a2e9f4a5f0fb1b8e1eaea11be439bd770a4b35f8ec7ece84ac39e79cb384470ce4d2cf70b4add0f43398059a300b047f060b7902621f334f8385e07017f8332f04dc99e1875f903b5e49e2202d5656963bca208db2fd69ebc784720746287770f8341149b52a09504e94a25028144ad51406068f44f244499a7d1caee2662ae5a1be460317f5f463b4b8281898944af5425e1ee5d4b75e857dd0d0a8706a4e0a5a87b57ebef45a1fce2009f2a872c495b58ffa71458353293c06c93327d31818f518e3b80bf5385a4a7fad295377869a28262da7934ca70cc6a3ecafc2710a8d32c89a0e59a80c65593465c9941b321330c7f631ef12c6bc3743160a8f4482568fe3309a8781791c0e83799a10e743e92e18cf92f9182f775a3f7e9e333298d5c23ffe1fad8f8187d07ceb311ef2c407cdb77e48f82f669c8c7188c35da96f8538ee4a3d4d88e32e98ff3035e66418d54f14ea67d8a3451814cce368160c663d0e6785f655e178736a944839f5a9d4cf9048f65621057950dec340a94279bfe55b212bf5e394ad302b8573d830c135fdcdf956bfe6d351ce685a3f811cf64f514f5533e8f412b42da6b0a79e26f5ad30f51fa61e26a44067d54b1c0de6001fe65121ccabc2514856a5469a51ef2002b815b62da2ba57955cde419eaac2a3ac65555086f954ea2dea671516ea5b307a14099fe65928cc6ae1bff53efe5b2166a14eff78855b58080d66a1708f22533683dc45ffa5bb508fc2234e9e6f23e8c678fc25bc90273e5a1fbe90273efe5b2fe4890f19ff4f83853cf141f32560212f7c88853cf1113e0d161243885b8f85c818a7ec4749f4a33c7ab94383553f4aa316c67197eae5cee37797ea670c8c8910c932d5a345d5c3843248a33c55ff1272d816e97025cb221d92e47116e950840785472119158e34a77e94443f7172eb5b44763e9c3b611886447668c2e9a3821097e65bdfa3080d6e61e9ae897178f7a8d093b925bce1388dc85428d3378560387adf79b8c3d257a83fbfce8914d32b1c3cefdedca3b294dc512209e997046ae8570d1b6ab458e5e4da478ddfdebd46769ceceefd9bb51656e4c936f390ca53915b67873d64a8912d7ee1e78eb216a4014d80eeebc7506590b5fc5776655c28b270b8638e01fa35d6d079cb51a1fe0eef041f5c58f7f2fbbaad84679176d5f7701a69f1c75db5fe093db8e3ca48bbead7b7b57e2de18beb0fc41179a33ffdc075e17166d77b9e9c19f47a4a2adb57c115c0d583df87f3311f53f3aaef8b898989514da479e4a556dff77d48dff77d156cc5e08ed3c7915a31b8d3c767b5f23e26f4bec529b36a71e2f083432c8b38002165f1c5a7e5180e70c007e49a08e535d30bf8f2792f251105f167163f0cc598989897a04a15d3a06d31d5443a623e7ccff33c55ea1be4f126e8799ee5c01c312f23a59c3eaa4d05e68879eebfd0c62402f2787dcee3e85438fe2ae78e01a34ce206d9ff2493a0616ef209a1ec93ce49f3c9d4a6eec658b264cf4103a2f68706945b3e4f56b11657e6ba7932262efd96a134cbb46ba6009298a66902bb3fc21205a99bf334815c9137a6dcfe0ca4e6b01e2cedf2286a8deba53241d91fe469a9954b41765d3e85216e4dad86d62e9f2e26ae9c123392251517c8324f4e094fdcfe31c7014b5a74160b4c80b2bfb300d4afce0ec423894717fe2c1461c1c79f851f169224657f1664fd7ac9fe2c2ce9975ca209a0eccf42109d0e009205f56b94542c7100130738e957a5c17480cc014bfa35ca28b35933a586e825558bd5f470c1cfb34cc48514fd2f0fa4f766b8e5140adb58f51cf15043aba119716b68996be1ea73554ab9a3d820fb4b589ec98c8484f51c4db9c1e18eb2762f0f2e782089220e4ea908f5f028a5f03122c5cf298914b2ec522cc9ee0501794c3c275230c91e508b3e7b36f6642d7aebe0f2fc19569f1fe9ea39029a228dd41075ed40eef7a01ea017d7fb51c2d0d97043f6dd90b5d8dfcfc0e50f869f161d06232d7ac3e0d3a27758661898f40b06188ab488420e77f46cc234ccaf148e528a22520a9f7c6f142320b57ef595232c4090b2004902d2050cb1262f2f7393d4fbc350a45f271f23fdfa812149bf4e5887cc321896c000d42f8a9ba0de1f0626fd6235f698b4e8ef2d9161e97679b270886b0987fa157343091c140d85593f548f7ad48b91c3583e500ff3303f5243509f7ab9837a223b13f5e3057bd89bb96ba65a5a5c6a475e2416f3a91dcd192486574d96efa1bef95e92c3503f7ff2fc8ce449e96724499ecdbc17eccd584979fe0b1e3da21ea429927af41cb98b8a965778d4ae9576485ea50da4d6af514e410272c5290fa47eb950c48a447da9971790e7ce15c873bf6e3568144b6963fa5a8396fd4f9b09f720b5e87fc31e2c3d4732556e6d56579f97cffa0bcc475f2607777b14a53f6eb1148ad60d66f5c1f8649eb8b53f266dfabd188be226b0a8926513588c009065135898e40aa3fbf44d373ae7349dde9b734e9134ca29bac8b216cbde7354a3f983d10303e4e9c1d2a22a8b59fe0d2a7794531c4d8114c3f241478e99b419abd00c93f5c97e8962167375c105d44b77398f0a4a74d4dfe836b76ddba48c69ac404ee9a03a6c8bb3e22b23333333e5fc36c9d6d773d2404515945cfa598a8e26a8a70e43e1991918ab150c8c419edbf198617e912930837ff1c5045550724bdf7d3fadbfe1e89e29983ccab0ca52b630cf40992f6cf11496c2164c7642ee150f2467c5e0cef729dd4d8d61345f4fd9e2fcafb586d8e22f648c2fcfbe12660f2a0cf54d07ee28a3a80589c9578d1352bc42be6a683d480e4b7dcd277bedc70999f74b4ab1f15891e47ef73c3459134721cb1b1e6b50a62df3627cdf12a933a54dbf8cafeb41cb15758b3c2514257c35337ec60c9087a3a20940ac485d2d326a1545117a8ebea3206e4d30c1041a0da001eaa03988b4f1afd18184bd601ea93b458d153c90909830f3645b5099695bb9d22fd30c8b294a1747c4b2632058808cf288224090801c01a901b9d2a2df28baa3acd520201a353e2a6f72b8433e947dac31eb7ec199a851518c5a33b83580b23fea533f7a403580bc469037ae01d42f54ceb31b4b5c290025ee588334936d91b2bf8d0dc85353e5e6e78e9e2c4b295f70cf91bbfc53d6de97973c8a20612fb82775a77c911d53c101a78606f2d45469d17b8e78b823cca706f381197199bbfcadd0f564d953c84013b99fd25278d47faaa7201965bfa2240348ad3c710364d2c6e702f5cb26fb7b4c1a16858a939c42f14072180a6729edf22949f966071e729661aa1fe51447b518c220ee6ad4a7de5937b8a9b067863da8b027c95ddeb8e7a8c59824d4c61a5af6a7dfa30cab5cbfc54c946729195cf125bcfda8efaf31b23981bb39926752274524753aabf209df09379fa4b4be8ae88e328a5acf11ad1d865927889ea31ea406c8a48e8a0749ea9cde3f4b99efff49293da8c116d92591114e8b27dce196eb46c3f66e3e0fe793fdb238287c37462e0f520c0a28803c5c0c00be09ea287de3f186121701decf921494d05c73ba9936d37b9e9ddeb314222afdaa6fd4affbfed94abf2ace44a7305369f1e22ce54433ad457f5398c1301bb528df5e8765234f85999689dc95672dee70bbef7b52007370991691c759b3ff8534ccecf9c8508570ba96fd3b907e0d5914e708a99cde079a4e7d5b9cbaa052f54505b38211c3929969d17cb87138868c126aec0cd1654247a386cd093738b23fca2c7b9e39ecc64f26aa926b194b92298ea264c92ea350c95ee48125799451ae64cfa38c72943d0a52f62849d97fabb4e7a8074bbf3a23d9a910ba3d9bccc0933262720a4a563545bf16536072ed8bfb9c927165defbc57ce306d7f3c95dc3cc9f0c63fb93a7b724cfc769247f2edb7ec9642985a4ce5057933aaa2cc75496b04fba52f4351b4b1d2f668d625315122a0de1ae26bb3d549a499d23a9a3a24627244fca18712bcba71f874bb2cd7f3e30fb0896aaa90651f2785a22cba61a647f1ac224491b2799069a4f4bb27f0d51442dfaeb7871fb4714914cf674bab8238a28053405799c31a2427926266d5c4776fbc719235af69f319aa9611fa9a3ca8e22ca3e93718d084fca10401277ac31d616d77facb1ecf6c33a644e7daeef620d1c0eeb902a649fd87fbb31e5caec9fcafeb6fef4073c19e4ca221faae4fe79c5bb0fa83fe748411e200f0be4ea74fa03e6f70af3c869fbdbaf2c3dcb593bede4388ee36aa972dcdb0770b766eebd7636734ff303b8fad4e2b9235760adc0e24163b15c3f572c2d53457fe92e6677aeaefc65fcdf57b5d64a25a5a1adb91f4767dfc29adfbd56fa8dc5f356fddabc66979f2292532228f241ca7dc0f68d2f8ffe5a9423cd75f2e061813aa9142b1ea9ac0fa0fe54bceab552f1675684840ba0a21e5650a9fb6084bbcc30a11ed02c151f5891c74fe80737e411c707b5eead521f1421512437a5947a08ae406319c89ec70b64fa8ea5e4415fe207f8016456520b191919191999ee362fb4d26567dbfad372d972145cc1e6effc56aefd6aa052a4d6062a843a0a5c6635e5a4ee33db03125638a14e4800b6176029cba21e4a800324900051274aa438913b370a50361063c1076a55be903d48410f412f18a20a124c8e6e52a7031250e050ad7454b8954e07d5ca8deebdc84b6c9765510f3e5809000b964082021b3401e58824274042104514a5204b111fa0229841877082225105169523f26e309d204977829f1b3924b02e23afecc5e1460f3aa4b8c8540b8f0b4fca18eb4fdede731fcfc1083746f3367b623a9b37db6f8de911d2667bfad3bf3dfda12fa03f5b6a436d2e5b0ba6474f65ba901bb99043e1422ee4426ffaef4b75868871956707354dea70bf6ddf4dc817bd428adb6f2d98ceee8ff6e2b14607a54e78b4a6edbae015eeb04f8ece1ca647d266fb138ea0b3a4a48eb54fbf3c233f9da45f326f20bf8200ee2dcdad1cdcd2fb95120fee2dae34b8a033d68f212ed2a826755ac22137b43cea85a030eb87cb10d4bbbcdc11d2f2a8166cddf564db36af49d7f676dbb66ddbb66ddbb62d07c78e1e2f04c931e26e6f57bfbd88336fa442223bf488ce286da3b35c7fbc3eed2047765dd7755de7799e47c548894b92f592581981bbc23bc27647918a2cab7e9c7efbfdd504a62e281355fc7c5ed8eff7215312da3dcff33ccfc3f032e141eea7f68b1bb9dffe9c9ee8adbcf74ad86209833bb3ccb308d9620e8f385b75ec92fbaa80f04e40e276de4fead5efceafe10c18f8199c043946dc91ce2811a551235aa3475ef39a1f399227d118f5f19807491d7ffa1ef312c817ad98fe04b320df6a131226e9aad6996b8d2261a174f9e7b4b86e5081dc455f46a61b664956fde7febd0872589df96ae2f1d6990cc5dbac45040742daf8534a931c460329c6c4654eb2bb7b0dca5edb8170992ff1228f9fd75aab0321759aa707f51a6bd1a1dc20d2c6dfae9a7bb73fb664b73fbe64b73fc264f720ba854dbab75c57abd459a5b5e844b31a8259aa461bfc29ed78589ef04c5a4873c395eeeaa7f14c1a0d072eab76f7f347177a2f926c70d8a4c9499b575adcf0685d68d2f0acd9e043429336fbab4c239a4c9ab8895d49a27731f79855a6118dc60bee7c1c706f59f6c52d64594c838ffafe34b82077de5ddcd3c0fd0c2ec89ded1d0b11b2c2c99cd7973b746723b25343223b3638acf5c3fd8c19e124cd4912ee04b42749702f99e4712ee1384e28735fb21cedc992ccbd02fad5f190b91d3267adb539fd92b413042173af42bf4ac8dcd7d0067771f3c75d2eee71340088ee2893f2fc06c00dae0d3e4930fafedc0ec7f5f72842df7fceea90d759e4ec9928ee688566a4b8a31ddb869d63851c6685ae5006e26ad9ab9594508ed49943b3ec442b5af6e7ace82f0009eb2da4cbbf3d86a404956b983ff37cda595a74f74ea888992866a4b8fe6fe53656c19332c6d36d4741dad41f698b08b794475aeadc5f763b1c26258e0d5352fd9c9f8e6db4583b7feffda459d2d5f4edfffb0e3bf6bec34f29d8a3c8e7dd704bb8c3fd230e8eb4a94fc381add6df30abfbd2734f6bad5f6badd5ce9a0c3b1a164fca18b75aadda98475276ff1060fbb19303f0f99ded4750051f9c9d986dcb63c764370522ae0e36d926db803627dbd026c568a3b2c936a1cd886db6116db49a0e8cac18e9a0419e1e74c906b4c9a05cff7193e56e1bb96f3fa5430ea3814467548cfa35fba8a9155aa347743652bfc68ef55163e917854177a48fdcdd6352e7a957c326dc6fa18fddd9de86453890b3b3bd8fdde1a8e4915239ca43211da244e1151a826bbbeea933611eb661a3f438e8564a582cddc5613a94c73edab0f4fef1843cf6111d72571120dcf6c11d6b910611b7e66df192021177b491b7f7ba7923c41db758cf6dbb34aed22e157733da68f346957ebdc8b6df921c46dfdebb7a2e96b7bf3f7f7aefc3dff3def1f5f13d8885f87ff86e3469d31ac20d3723afd68e3723776db4ba516e11e1cef7c2edbb9574df277813c41d3b48878c3c3770592bb06c8b5fb6f3bd886d31876db4d5b644121fc8253cded047d8402d6e9badb1bc7d953ca67ad01a87d4996f646bf7688594379a94b7ae92695de4edb3846d4d48d7f6566eb58d266db6bf51d222c255b5887063f4f097e00c43f24824b37270555adc7e7e91c30ddccd68a3b5b83d8d19dcde5ebe20d1a0a54528cf9fe1c19db972678d8a3bf68fd4a9797e27b94652c787c877d77c2f74e7da364e4e0987466b5aa5d1ba76a9f41f1ef2c4c7101924865aad7f1cc6f2c9f2ee7d78dfbd7f87853cf1ee4b9ef74476bec7e27effd8e0ae1933f1e0f2c420cbef3e4bffb84be6ae190a71a7cf71fed46eff8c0f6effcc0fae909090909cf3a74520617267fe48e9f24bf174f796596b51b608d976a93253e58eb37b5a7279fadf65bacda7d2c336fc5aa48f82cf1de52c16933aa5223e4b648a7a0aba7debb0475d19f777f2307d7d22d9dddae738e724912cef7b38f6957cdf86a304f2bd61f7a7b0f4a650b6e88d53966ab1f350f0b952babb944f5d22492ceff49d558bc56219483281a6932428990e511a3485aa4b1bfa2595d0810a8541a6524a49658884a481e46e5586ab16e96f61096ea56f4212aefc0bd425e179275ca12101e0792928b9325a4c81c995d27573e4e6c8cd919b2337476668d97f66abd5a75dfedeeeeef333447fa4fed23b16b81c491b370d19310d350c92b4f1d590c320ad8850442b9a4c92d451998666689e8527658c357e327d6fce39533018a92c0303d7d28ca7e79c73fa0ac68b0a66868fc36060d4cc5df7aeb0f49a83b499d567decc97336833aab869c834d42f234cb3af32493368fd72f9f933aacc90396c45e4337c6618e957e9e7cf983f23899c8d38e26986cf29cb90c9583273980c1c64f060650091276a264303529caf0a637c21c5f92f610c24f8cc1b3192e64d0e318e90e7cf4f85318e626069713e2a8c8114c6c8d2e21c710c13612a440ec3abd1fe154d785ce18c2fe218cefc52888b601fecb9b7f29741c7461cfbe4898bb438dd318eb598d4458bdd333199a416a74c529ef3659264ba98f36b5015aa43ee4f6952677b23d9dd578fa363c2eb2e7f18a19c3f968ce4f9311d0bf2c4395a7973b982a6c03494296ad62efaf4561f50c74cde46972b321d51b34cb91f61b60883a40d5d11c924b5485fc78b5b6b84a40d7d9d2eae4cd27c5a23547f9c816399fe0c1fa993caf467fcd018923aaa3048ea704f659232a54233b986e3aac64faa5b66605ba4c2795e66b6fdeaf1bb593ecc8f2bd8eac7ebf22345a55ee6b015ee2077f9e3eb47481befd9bcf1afb578a5c5ee80b27fcb77401d932ee8258dd640af3995d12514a899f48bce7270c4a7b2539685bda4456f1ca4cbdf9b87ec0e446b408a5f48d1df259c4890a27fcfe68d99346f8e903a476809e7d1c4226ba21d2cb4e8f7c3ee787c91c335fab5d8ad0fcc9ed3536e222a2dfad39a2806923b36918c8888ca3aa154773a7894fa69e6f57bb4c58903ea28e5d651cad505dfe6f47ef76f2127877add2a4779c61c50472953504729ebe0b8d56a03754c0b76bf479b524ae994d6d4a08efa5d71632b6d4e39668f221bd8c0d4114a9bf9a1b4b19d8ece412da863b664d9813a2807eab8b7051d5c09742197401d3353efc4337679fed8d1f7befebeeffba6b4260aeab0b82467a99dd68db32553fd0d57d60aa57102d931913abb291e7d8f86373edcf932266d64cf9063263b6e9c8388cf15a8a0efb4ab894e3f71208f69036f0d92bb7ded544fa7c779f673b7a72f4ec0703c6119aa50be7f4f9745b76af2fcbbf9b932546ecd28773cd6a0596794823ca50f12eb49ea419a1cc853fa7b3f0525dde0373dd1d34c0ae2d3afed67eec1d22fd993a5a78b7ec92045fa35710fd266da7a927aba08126bd1bf7fef6f2843157a567fa52d8622709c37a7f75ef705f1f1ac37bda9006e00e2d102b40c56a1b0fbae95524a29cd46609e1db9a5ed65a84235b41aa3f0da59baf100ebc70babffe577502921ac1fa857bd0a0f61356eb27ad4ab1ef5722795e7a70a334cb80af3ac03f0bd57c1ef842b20988346e6817480598bbe84947cc29591726d92ac15668cc563c672e3185af49fb9732a0c12c56d6bef5dbd28daafbf07c11de595a4ec2d1ced4c6d92408e3a00fe3048d95f1545920bbd03a4e62e7fd592eba51e853311f803f5f4ca4bbf9272ad274bc382201539aa463211d842dd79c12d0ddcbafd3c0dee8b50f6643d4750b24bc952da4563c604977aaf72a3427bed4c2eb1683ec16d7a93a4070b0fa4da9e109eec7493e47a42b0908407120f242a496a161e493cba88b16084455948b2840a132a41549c5011a20225fbd3aac3c5279b4e271e591af340e2e19ede54e3045843bb325c667582b65afd83d763623a6d8f235223d463b264a314476f3287a1308c2cfb732d15467643895bbf960021a9d3ef9f80a12d1395debb17e499c9f2bd1494dcd34bd0f4a93007adfb20e0bbd71ae72092dd939702935646210477945194649e2f0ede118ead76a80e4079228f72e65181b2c4132851a6dc529645505c60e55ea1a11c402d66560ba22b544407849024c444072e868482c8610b9f2d7eaed091235d1633af8824f06091804a4564f1c37161d415d183239b10862c8e7dc248c5c9c1b19163e42e69718aa8c10fb5d77e778b2177495bc40b8c607154440a7cb0002a020809164445f8704408b1e6b8d256a9e3e0d8c85161c61dc982491659f0e015c9220359c46ec062081cc0620b19606145c7040b28bcc0a2099c2c99d02207b4227b5770451114225c66965c9ff60b054b7df0a428fb0a82a0e2f6f522ccacddc244bbbb9bae54b044767b83b692c7546e192129723fed4ec192dc29487a1b2c454247c048c136c51b9d813cff7dfaf49942a6a2bbbcfb4192a11d4a7d468362eb46d0483c1a13d098e0963a2582fb49970609ee482912d856a9ff0863c3d55a8ab1cdb141022eb8adc47a9184a04b33458de2ae6cd0c57d5141698b9b020157c5f5b22c42810f1e1614e0b07d71c123949070bf2cba27b7a3a21be27656381b5c5bc5aa608922ee9665d1131b7826b85c96454f664f86b6adabd45bce701860070b56ecb684bd56b4b7f4413ce1438b4a104d10444766a6d45a41c84007992664334134f98105c5904c10497c888942c652420410c0a8421403f258253b50b2a2920443090d400073839f9592263255133518253f40bcdca0a6baa249ca09da4b076e976591ac96479c291e70594228d5020fb4d080504420b9472e40ec70324095580b0ff6bbbbbba1f07197b5321f1cc02866272e3cf04d1132e15820ac30e2e1e4e0d8c8c98191831688288e949e307aa2f601c184914e07419ea5c562b10d5819646bfbadb56f6d78ed8ff6b3f81611b54bd2acd1adb54b161dbde884338014409d10483603d0902c8e05e2c80e152707c7468e911323289cc5c9a284da6bbfab84358012f6b77be5c70d4044542d0e0e7a704236ebc1c8e807284672f0433bc4b191a342d73835218e88c8a3b54637264b268e74b046e06eb8a620944e705da028f9705335d8a0b897059d066e15f238c0e488eb65c984154a2ced7e593261c511ab81db65c98415459a30514517435c54964c5471c50c7e50e2a20a1c507155593251851145b85b964c54d1028e04d70439dc52964c5401b4a1e0d22c99a862899d794593251357dc608952ab9135591bf7d9affb6628a548221b3900d903bf19cac81e4864ce39c5f34ceefddb56375ca7fbb7c232fbaebc4bb673574da19a423585947de2dc7b73afeeabb7978aeeeefe77e53873dadb2b7777c7a3bfd8d3dddda59527d3cc0e663bad9b69e32cc8c28e10dcf99b3d759f77258fd6dd2dfee072a5d2aa7a5fd7ed7097a4d113f7a33c422785bc6307c5e3e7e8bcc307f7e2add26eabb424679b1cefb092522b613b24ad524b4da7d3d6e4cef770c7775b2815716e4ecbc9c52dceec7339a1daae5e94d451224e2e853b2e4dbd48f93b5aa43bfaefc9b4432696bd66d9ec0a3f7bf59bdba55c01a44d5873099995637af69ba14c6afc6860e598998eac16e68ec86a61eee0e82a0d36d750f3953f7f622b3d726aa4ec8cd900ce6e771b2e7a77535a719204dc25dff4cd90b5c2fc949ddf0c6df6ae6cd972ce79e7cc3dace7f2bd6497d06617ea02b224ee51b1cc3ee46c87621794b747450dd5f30ad66e63d912b8d076c7ea21524ae9a525ef132a80b411c2d24628d7d0f9fb64bf6452239316bfe290e51ac416e58f5b3876d9c3b104d67a2f7d9956aad35a4d3d726aa46c920bca5f56234fbda8589036f26d4c2a4a1bf9326ba5fd9a5422f56baa66aabaed6aaa783ebdfd47eaeeeed4eb2866a9fa46560f9b5b684d95d1ce55bb3491a917fdd1dde9479d526c5194baf8b7c2d24229a594522aa594525eea5e4f9b9b2848f3c30f3f34e09b18892c697ca0f1008d07683c70e7734f93e4ceb74f93c413e58c7e291929e5cb9f927ae9a39452ea811fa594522a3ff497e001bc866a29e5b85126d91a34afdbd738b16d55523979f56be9a4d49b6609a5d4be648d1332a688565ab797af5f5d75aedb5ce6c4558a95ea0045e9d672c39e70dbe6c453dad4a695d62d884ab71f4c99f6b0d1dac3466b0fb5a6c0156af64a371e74d8a80e558723b43140f35e105e82eea48955b5d1fac3b6fd50e9f6c3121baddb0fdb0f95feb004adb46e956e3fd43aa5582f909d565ab7252add7ed8b696aefa2ea14bae3f2190fd279dd2a66e7ee9122e271badb46e9ced4ab6049a6ecb0b4cca49bb9a06042e94c75cc17069a15e89ab265030be29612e2f5b5ab24bd8127e908ff9649e52c75ffa64b15832a7ebf232c7256c097be72ab9f3c7297ba1fd924ee74cab01fdf23f62a5234dc8f2b18475cc7672052387728a9422cbff41965f0009eba08eb9c7fa551d84b19191d3ec906ad17caff35519f938707678173660e22046ee0c65e0700c1b968090169be6e7259c3ebe83c23386e486bd3323d092e63d2a5ede4b70a7c49d65312145aa0257a0d9a3a101794c4fd3c5b03628c0fb7cbcd0c2289dc8f27b489d0e46bbc9f26de48d49933af6af8c3c85a89c4ea79309acf295b0aaab9c11cde8c50a51e1846aaa8751931d1ec6200ff7b8cae02460c3aa906964f92e79630ad5c0594da32af3a67fe47207b564a1611dd44156a851956e4655aae47e979630a7098e0c1932b6547b597e276f4ca3d9afee67373ba87f5a4ab094d29a1a90877ecd0c9dede57f527458cbe33cc74da379d3ff20dd3a66748de8ec02e6a8d9710779e0b66c79f9de0de54e8b4bd812813cef0de74ec5d973d1895b6e58744d50a5502e2f34539b1084dab41249c68a9ef090e7a8429e2f2860ce62b19891f976d6272a4db5916bad555af1b94145b9feaa044c72fd174b8044ae8f638225b97e4ebf649109b6c8f57128916b2d3ac116b916394122d75aca336c3245f66f6bab0ca8bdab3b6f8e104e2e68128294c5e20919227e0023411099fe8a045a64faa8878194d274a136882822b7c542842cd3a77f2d92124c7c9260c244a67fd2e21bc11399ee20d3215490e99bee16320699529b452a258222dc11e0c04357f28b243e80f2c654144041c8fd5704508090e4fed2ca065fbc7426d0426045082c110a4cdc0938b8020440f0f41232a0596a755aa2280201073ee024f7d3dba334eaeedfe1a3bbbb291414534a7fb491c54cdf5e1764faab9f4c7b4025d3a2252ac8b4e80346321582874c738e108277670471945be58427658c2eb56cfd732921119dcda27428b06e2e02e9b23e8b99373a037ee4b07eb77fa9f099d491525c2cfd403c7a2ddb9fd1c1e5fe6604b7be149793b42cf38cd11d7d56f32b3387bdbc45d11c26771c0b90bd77da0d3b90a97667963bf66f86b815bbacc597d089bc95e43e9336f65b46b848b28811f741eac8fe49010be4ab7b4bdf7ee3a07330a3982eeb17f7b6b990cd83099b3227ecaf74700d20210721db97b30a284f64fb2d0309b3c15d2a98376692d948a412358062955c1158fb0dd268e2cef71a4440fd1270b8f6ad5d4206347fd4ffe867f5403dcb05b98362fdf812808a208aedbcd8d4e3dba2b58f7279d6c53f52a977c12cd68f9747fd0b66b5a030ebe2e82b8496506cd1fe4b88e32efba9507cd3566f88a345fba87087bbecbb84d667d265df84478badb53f651b946d9bb2ed4bdb531beadb9f49ec4b0903acd6f3389354e9b99b64f882c33a236a5fba0d2795b3dda5566a141153468bf476776ff9137de9371fb8fe5ffaeee97b5d284b383eb384c91d2a373c5e49bf93aff9953e8ebbe873a1745778e5ae6e08ee10def4b95286b27c23b2446589c70b64296d743c29634cb588703fd3b488702bccd6a7c02ad3ea4cea98f2cbc7ed3bad138955e58ed75aed97700bb9cb5f08f75d0f65afb84a69d13da607a804ad9556454c199a1100000000b314002030140e08c582d16030cb1349f13d14000c7da6487a561a8bd3244751983286184200210010000020325043b4018c0f58006069b7f5681341a15507ed5c4750d5fdc46fda86218da9d6d378c9a6ccd1530461e85b913471aa077bb1becb7a0f02d3a4a2425c0dec7311fde01ab3cc8756bf877d3f069020048d8fd86e581e47d6927c29ce8a491d400fe3e21d540213116c00b940e9628904b4256b74159b79d59a5c1445d044110bb4dc02d8af8801285f6162cf65c8d71e09dabc420c44389a4aaf313815ac8789d626128ef3126112c07892d0e13ed17123260508ddac8ff740c99918b0017a590ede49683688405c23942d06bd0006a8002a2c30f01515093fd6815bd97c0435ff4dc6c46dfcce71c529a12b5d4bc9e84280066ef719a34e097404bcaa8a94408b3586bb5953634f137de1494f7bd93af997655f34e3ee69c0e36dd9333a75e990e841ab09b1f109bbc42d040f4603ae998616d10977f8a2e38d6502b6143f842c50a5563515ee9a4f6933dd70c550927864719fc0010a4d519e556f691c250b4cabbefb31108fc54d0d43e6b17804e54a54cf81b361dc79a2cc8e0bc302e568e68aeeb49ee9803e72df69d48c93f96959f6ecf9656cba64a3542f4776398a61a5c615095620a5bfccf21dd3649b1a12d9c07f6506852a5e46781d0235b13b84be4e9437ab7f98e948944da2401824a263b7236022c274a35e6111517f100e3a2f72ff07882e87b02abd73483a30cb2528e62e1247ba340d822993a422457cabd863958bc1e91246ed9283c69fd75add5c0a5502052aadb6cacf286ea0b8a221473fdc6e5fef1903811091dd1810764e857adfd177c6a1aa9cb62de1d67306b544978816f98bb33616487c22b662cb0111b348aa686ec50fbb500b68436a90bcd04080ae3b1807211720ffa7a061575eb7bb70b0527eb96766d75ea102287ba8518e3eb3242f5176b84e55db20a58aeed861405ba9af5d2148144cef8a9bf1b32739192a05c002b0485527072fd4e7293eeadc26ca903b51d4c9e7f1496f5ae6457551ea945cfa58c848175818bace80c8dae4ddee487418d3e7111345587603b824354cf71652e3c513f6046770fe3776c7ad1a59f6f001ae2c76a3d4d7c3f9a0c0486de681500921c0e09ce456102ac2c3f9b080926a217808373e87fb762f60225b61bca67056e3558c7ecae79cc64ac13ca1cb103b3cde58e3d8184ec8927528491027f336e6a6f75bd3f2d64a0cb80ac0a54a18892b0a6a778903500681ec58c5002d5f00f6155140cb1088bd451c50191562771903a44c71a4908c9d82b08aafb450ffdac089189ba81cf9d624cca60b0f5f6b0abb6985c3cfdacadd641cf8ac5f583747ee455102161d0bc6697903b2574b33b322034a2234b3a200a2fcce46f69b4e54b3e51ae745b3a902fadaede5f7de08f804e7101b0a2b4bf503770fdf30b46b8b27df2f02cd4614509905087bf6e893569348de8ab3c8974be506f9c0f274904cd8e2c9771079067b2b1cbcac219a36af0882a9af72579a0b9b38a3ec0f4e078c94bdb9bda14498e473ae1d67b0a7bc8f4b5fe28b4b9b4e69c3bd346f3ec0dd3371191773c5c43504ef71363a6c56ae7bdffa2414ce6bc44884a209f848f395b3ddebe91068624cbb190276aac08d7884e2e74ae2388bc9c68135365ee680d4ddfcfff6be749004353717814a23f9e0d5ce0b80250e28e42e16db6b641ec5d18b0e62bf0f37d4da6e00d2d1586e8a51900cea04468e53e277edfe311ca240d8de062bcd89c04cf6c55a3672554fef75b7c1fc008eb8f6a358e354e1e829430967c22f4dbe058353c1884353ce24a15b4efa531385700f821b0cf091e653150a94a353fca16fdec6a9af31288dc84374d278397de82174410cf612a3e750b96f6f649836274c474e5a333108dd0d75b773746ddd002f067903e84a206fba65f9d8fef5858f3c714b3b5ceddbc9c445194d359cef9c859d1fda047da2371afa89bbbb653f6aff9a17296e01f45d960dd73fef30136a13ee49ef4310c0bbd93f934d5d7385d82ac03bfdfb3ffc888b2ac8270bb0bcab89502f47a145c7a914a2b1f92643ed8d7edb032bdaa997168128ab232a30ca182c5ba370110e9c14bf857bfaf7b4a895526f82e9567a9320a9b60b739635ca24a64540c02839b6f50b85254d4bfc7d8ed2d2afcbe991f527cd8d7d79fc42525bf60f2921bda49d3faa175a7853d748db82af76c9451ba5fecb20a7f952e8df1c7794bc6cace4d36e6df326579e228e5d702abd32ec93f5c7527fe21193d8aa25282c215fa54773bedd48f201904800efe9f951b263a25767671cca6c746762c6b3dfa3bf34a67e9a0d786fbf8fce28083f3783be7c2e1bf01ebd39ba410832dddcc47bd2d03ae467a92ab1f59dbd0faa2ad71ec27f76e70afc0936ed2dd389db80e06efd80a73f7383069e234eca4bce08ffde8ad254fd09855d36f8048aef1f57e3119d70d472aa6f96be7e286cc5dcb60911d6c2598a0ae3289eb77e32eefa9f8fae899251669be66a6601932cdacaf9702902706303a7468b8864624d63a4ac4d6e046b0041e08a5c8380a3faed02926ccccc9c0851dc7cdbc491635681c3f9776b7cd10f701a0c98f63e2b9797a9ccb80f7b7eacb8152ad2d77554afed3005034be47c35a7947c6c94cdc72dd0eb7824b9b7a4103756816bf1cbf33a90180e615f4b000b18368eb1bd323a1f0ea16cb88fb17577d4ffeda2701211c97b81c15ffe0503434c7b9c4ed60d66d518351a06e3da22ee37c1cc219dd67706fd29a5ad127454a883c77d36c75f44eed50c20cae63db1376603b9a416b54d18545a9f8e8627f7de53a61cf89642873c2069793cb93f44d0169ce530b1b722f87f28d8354b1b510bb35fa8ab0de074cfffa8e7e5e30afdb125f22a685ec36acee7bdc1718f49bb96efa2c856627d6819d754fd10acc0e0e86ceefe6251056dc271b5de4f49deba376e228c8c69456fc1bb28668e691a51f985e54b94d6281af5c80e17adb30632ddf035a4ba6db02900152b33713cd5874cc5c920c8ae734fbfbeb2ba7ec290b894d3999e1b3447250822f81dbc0a1ff8e471591f234a3b80e7e2725233077aef9a5129ace43ca62fd2a364ecea94640ea5c0bf84bb851fdbd032b53b3d343206ab100288c031ebf937a57d37855d0ea6953416573f84182e45c851ad0c3d71449cd14d72fa988f17738d2d828ae9a4ed973cd9c9635066818b213938407d56fedfb61ed023f0f22e69eaaf09b62f7e0b677cbe54d8d5693538c59daab93dcd705617e8319ad18a13b98f90f64e9042634a632bc2a86e1176dc5d0d9a43d9f371fe3b5efce1ab0374e4cdffabce56949952acceae19e2d863e2263ce19ddab93f04147256bfeec1e87d4374aa8f83a2ca74d6c9832252532a681c07f9cdf736a35fa225163a6d8fd1849fbe4afd156fd9988dde35c829c90ff9128b0fe4c593d059254e940705e53728995478b17d95c85c70647bee82c71b6612d40a6bdd9b52615d91e1be2978c21a126e293f710cbec5bcda0a248d66e2117fcf421b9109097f78ad7eaf44b3a81edb228a321cc72ac1597fc32976940fc19aab9920384f8db32280f3b0f2a27a62176658c74027f090bc922cf3d9b39c0aa31b3a3d8050043297ea0168dd95d46edb4cd815f3999b7e12bb4849b654b9df8da4bb7ad5bd03bd765fc167c425cff115169dced3700158c5dc5da7e120eb55ae9b1beb93adfdb908c98b133d581cf8037cfc913445fd7144fc2ebdd7cb0037c7e9b356854f6577aa352fda1960986218a7a746aa042cc7ca261cd9897f361cb047c331b0e213e78ddc55a2099ee48fedab931d8c789714c38877505499645f696e9132db7327822e1f763ab1bc51f3cb6076ad0c410d4d6b450e403133ee2a6df338ded6edd6d332aeaa02cd9df02e1f637eb67517d5bbd6026ce85affeb0f8dd8a39eb353a45af6551eef5d9b9117e0be6f840c7b840ff9bab7e72cf3d2956aa26c853cd8854dbf11c0d7643e95b118077ccff4700c4dde15cbbc40ef266e021f288295107af41e03d2df6a555017ceb1dcaca93de1eb93da7eb336450aa8d14c19bd3d0b1ca3b7cc51292ec58ebb0ab0969e763188b2d50cfa31199303549d45b1162c6abe58186db8778b7279b02031bb6d1c6785f1e61285d8b754f4db709204b6bf6e88e84ad15e13147ac707149d197010901882689ab4c11fa3f065e25ec8c3eb00b08656a98b49112570c8c5843cfccc63d0f7b61979dcdc8f1be2c14fe71bfa8e577b0154f87920cc7251d0d53f62834bfaf9e7ee3491e90e145a950ae4d63c1401916098f0eb8fc3c4e92f69fda6e630041c06bacf495596df6ce03c7e7c36cd18c7fe69f4c6882382638b6a705286ddfab1bb74f961d131896e0229a65bf41204733792a67e24a912cb1719b1e58c8d5185214b4da6644b4f31cf7e2606feb667c66bbdd518b48175d3d2c3d1aef8229bd91d8a0f00f17b08d712a6a2c5f996d6862310cc612444523fdd623311f07970284888d9a61cc697b87d72d8ca66c3162d5d023ba160252fbb571a108248dfa647d26f6c86fdcac1524e009539b6143c40f138aba2492a1f338790d869773ab175429ec243b8c28e4d1a71a103f9721ef0891737407cce1de33e62890793f8cf66bdfccddf132791bca21a1745a4caf4f30b67441fa8cd16c78e6e6c7ca8f088f5a4b73d8a39ac6164a9542b16142059a394ef8338915465a8bc19ee720a9f2fd0768939b076d073a161b7cf50679b4a3990c3e393a7d1f7c60d714f354e4fdf0eecb2964018d0eb490af9d28b65ae558e2895262168175cebc5116b7b3157f3399229dd239dfa15f78182f17e5e7b65e4d218e9bcdcc1f6e949229603a397010c8dbcde9835e62c90063d041491243d168e04e0636003fbca694f1ed7a6b0ba23410f604fb68194d54331570f0280a5205e472c96e86b81fadb030098c815d49512a952631eeb0eadb378b5f3aab21ce16bc62ffb05dafedddce6aa5aa003bb824a927427d7bdf9a119a73bd57a6551c721f3b6420d0ab8925e744909c5d204f3ed258e208be43c96675d0196cc9d326c33a2412866ba9b003edbf9625b11c0241503eee7180a076223ca36358dd184df8f8c93e52bbb55518b7fb02f95a96556588a89e02ee1469d54f40fb694e324b7f405f945eeb2143e3c040b4b1acb4119179ac415ce33993d9f9e5bda0408f7afd44d63abe145da0124172e792e2ab89fc614f69fe698546bea13b4634e9b02c28f3e1b40aee9614483794d55aaffe76ab9f9a131767c20ee4bfed08f54d742ffcf5e0fcf33ba51496ff992e4acd0400ab83ae5ada101b1cf75fe54c3c83fa7a0002602a2fa53401159f34b2aca8d74453bf6054350216402924a2c187bea80e5860e5bc5da1127a7190f78cbf2ad6a083e8e903a873fbb5a85bad2d2d09398a40b34a929a95643d69c01904dfad1daf45b05711fd6a321a92edd8ef0cb1d391ec155ef363ae7ae929dae22682bb9b8885c8dbc3a550176753add7af7817860534f50824b35a6b7bae74cdf3a7a0bddc2e21722c709fb1d860595c7ec874103fb6975632d6b92451c52359fc14e2cf5008cfba4de4b9a81b9762564c896f71380ec7f328b00b133af8b694b1158025e12cac7866086eb3ea78cc21dc2bddbc11f84e76c029768feb27947664d0b0e8f6e717449e5b4b9b0ca11590e30d2923cc9a3e6dce7d5bd5f5fa9ab4d7ef8cab576685df8be9912be5b7048026b1fa132125197e988ba60dfb26a5efc4741ef4c84121fac8184dd335c3e72af182118d915f2e583ec4181c8e79ce70635f6cbdc9c150331041564f4bd2152d8fb1bf52fb06a5b0109dae8bdc28b49656aab8ffac714503e4563a25d72f153958a969361362f56d8c0b20ecfd88f825e093132d6019b851c23ec0087bd31fac7d58311ba041be71550c76488b67991c0f7d2cd02920a1a2ea43b25a9a7c33b2a67984480088bbbfb661a1a22be40ea8278bac04ad70c3ce6777e840eff83dbbcb9bd4268892bb4f403fb6f43283e19190ff911eb31086d388d6b9d5f7a0e36e906e891f9eb7c46b9d19a26d8d8b04541cc0adc0f85714432b64118c36074f51429f7709c25973f65f7b6dde65abe33d331b2dbfab471132c07280c6b395803afefe95b79c8acb2069295219bd16056a978a1b4056aa6ecfebee43fb99a8724daca8a34730e51b3ae40acc05d13d62b3e564f31779cd8114ff67ef880f90265a4037196cb4ea458c3c4dedaac4505bbc20007fa2c0d58526390032f21a8ef647ab2cee8e053cf1ed4a08ea313c93804c415799e8777e874deddb8feadd14fe8e2642ca0a558bb81b70dc9c53355381459d046e16886079671dc06b22113ed92329103308401e60415c0463b13e09479aa947de329c7a0482c26147b4b44c7b1fd535308269a505706e5e7c34001ba2ec7cc5a76012021868e53cfc53555fc54ae6bd12e3ccada661531fce74e22d6730f72960dfe6a2549c9b99852a3a3e0bc12055a7986016591bded7153c43df16fb48fb74162be2f43a052514e74e88a4ca788bd501d35f7075f3ad8742d7495db69404cb7ae45b75485b4e6f2a6223ef270ff703d2267929835b388ffb07a628e1fdcad5dc3bf536cbbd21407e4bf38c467f730609c29a2325b6bfedc715b6e479224870e3e0cc9f7a6667217b0ca3b350eb49f3ec7c2e0442f9f4b90248b1a2e99638e4f3d964456b8cc2439793d94740111c96dda5eefaed101b7f6a2b1a6b214915da55e5d66e2622545f5832740fa70621704e0ee9c3c570683d02666c2ab2f7f720582a509c0e47755033f2195506a240101c1a0b6e4de9ade24b80e46bb2bb4f15630595c22d73c89905cbc6c26bc3246550112fb95877492627b330be1517b8e9d50e6bbe92968b5811f3268f65f513108382550978b448cf603554b0877c0d44f93469ef043e84c422c1228043ec1cb1a8584e395f438c522576c8898e15c08f139c5e0a294a888b84e7ce3ac5999869f650637b1472b90461ad7a974b9d6edae1ab4b91c9a65e6278ad397fb3e39743cc4777d5531bd9355505cec77121028f9a5cf9359e550d6ae7ae608f0548bc2d2b1868e16c55299d440cef6dde2374bbf0ba46e7d04ee29becf7b723090bbd29d50c85bb8c7652a4af0525ee750bcf5803bd65f393e75d4b47d80e3d3e6f2346f4ab4a517504e7db3a5db3f513bfdbd1871852667d075e49228b374023d4b4f13c0164eb8053dcb180aefa42b6c727a9c0367b4afe049a1b3062ae984ae226734e88b301bb6213ea7b0587094bf835be56f14d5be81e7491edc12b8c72ac99319ff151dca3c321c4b41de748e244dc7dacf35450d0c1b41116c6466ad44a85680592bd9ee5a4f654f6e4c445a400844b8c2803a7f7c609a7d8ae9dbd2a3db50a71b647eb35992443315f2951b1885bae769ed2819e660aa22218f16b5cc89b62e629d6d9d7fb2afd68d1068e8ecfa7c8388b1903e2a50c5207e8d3dbcb0f9bd073f189ea888fb2b8de2a41460e5c2338220700e45a4dfbb602723673c0133aeb65cc8c48d07d84a8a1f2bf21396a146c4c8c0a3063cd24d8ec12363d0202f1e4b0f0da3f69c2a1d46ed8e035752e87559986e00f63c377e15ef24d2df6920f96238df4363f6ae6b86bdccaecae783791f787d9e08d36dd3dd182fcc8e1641779f2b6e4ad7fe89b60c01afb24ce95a9470111b87d5e8ee18c106b2024bc489bbb028645c6fb23665d044b092610bfcfbb354dc08c09100fa238ad3d9640facea5e51fcedb5ffb0f0f1ff882ebbd9c8c117de1a68a96c663e1ed5a18db5d152b2eddc70a8e1eb1669cbadf436250b364e0736db8fe9d1df80a2c7bc04322c6da978dd4d7ae55daf49e38dedf3f842936121fa32f8eec3b30a998da3ee3973db00aa607ea669504218e19b94f012ea7b690cd87398204bb93b42d3e7b0d6261ba9b0630ba920fdebf71d6f5636ccd397c614836c7c66a894a872dbf22002cc99bf184a5d0add5beced8ac15eab7676916acd84f597f3941c7dc0b89ec2bece60d9de91c5c279f015673df0be264ca6a4f775ddf3e5c65fa5e232dd74edd791ad7b4ae531d9f3986f4942bd5c5724994c7cca2e583b89598f4e947144fc7fcce9447ab29abd2d8ded946238dfa1a4bf336201d0f3df3464086364b4fa0686e3585a10881f55fcb84b5840cba413b16c006c69b1fa44403c1d6854ebbc0570b81a0b424504229c5073c6e6df81b5aad49815d4417ee91994784e3a78b044f97cccc0d8aad2d265a63161abaac2092861fc0d366fabff3d9337d3b589ae3c6f36471d6736127a61acc4d40268bf8bcbe150ccbcb6c55d433ff4a29c562a635675f353dec999dcada8acfc9f0fb4de2070e8bf28aba3bbf8ecec04864fe487fe7c65f820f595bd9e27bc3a4407eb45fd04fe6e521447dbfc29babf084575005c753bda17af366f3619fd975bd0b4cb478aed973c0ac7f55fbd39b9fa870d4924a0943fb97aeb41b0bfdf7399c9fbbaaf1a011c0f90b8efca97f01230e7da5c8076b7f561c7f0eefa3b1fb96da2786be56a028cfa9ab8398ff1f40d2e947cc32402a5f479e775351ef0b450e6d48321e61945893ce090c60807586c9eed9d824289f2843fc97255cbba04e4e6eaac52eb26efa432c45ed96218b83a1e04fde382beee80862482b2a633fe50a0aec9733c0dc0fdf038a743f1a1531ed13c080fe49738d169ab8d4c484e8e68c53854e8976358eefdd8dcc1d9c270d24a9203a003958b55bd474734c8eabcc553c78331160501539f4915c4e75d80bd45a2fd4911b3041b1182bb86a42d8507055773a7d7f87a9b3e48038fb875c7b5cfdc76120c9ce522ec2abec27630b7cfd2f55ffd0eb57270e3933ce958566edb1d35ae41708a16c1420b30451e44373a1af7c1dad9004545f474781dbefc6d214a72fe058d80588b6b97ac7c2165f31802a0a98fcd6328592b728551b080414cead34325b68fe7e0205f2a11a404121c3f6b76b988d83b49fd0b1b3658ed5e4f68699d8764cd43ec2184ff61a7aa770b165bb38ac439f01cd58716415e4e74a7a3bc983b71b493ee2229c6eb8f99897881eef693b7333647b4ab918a42660e5c67eb622b81e332275896039a7cd8c0b6a4cb6dc7f26c1239d9e8f2f0ed3425acddca7d812bfb11504c34e92a3c3d9b5662048a348721b023a71f3341db92b7982a8fca00ff96bce32f282693524c7292898a4a0e3384aee1396512eede26784cd3b6fc241d55033cc5829e0b6422c06db4b3c92ccbe706a074443a587c9daf6ad06e5fa9c8bb6ef8f8e59d3a5e2c9e3f6ecaaddf09f284d5a21ba2cb7bad612b7c3681cc9249fbe086c8c5c3aa3db7691043e2f5a2ca0be2520f09dcd941f82bda99fbc6bc4dec8185da93c4d2989af2ffcf60122269e59ec05ddb2ad4b3b7e69ebe4513fb3961ed199861ee3372ee17972fa257b4267b68bf27aa90d5727799c81d16c94c45ce6f72bb62db9e3433788921a49dff5095f7b4486847987a6ae67dab03bc356f230aa0d39dcf3a51433a701a324ed7a72c9cdf39c8f6bb54cbb2d82a33379bc0546d12b65d8a917eaf674d4d96f4934d69a96e77c59a7d8aa0f18d43a3975318e79174f57d2cc7fecc51de5a182852f09d46087c279875bf2c60da33f43e3ce6a47f0b68be8f38071711f9445cd37af5092dea466191f0e83e43e66905b7f0a04930e02cbe26a8ab04ab388050933275c1c53c4d1e12d0c52b842e9c4baea7e4fb7f718da01217136c9784f0695980537820d5b29c07f207173c8f3a17230a3b21708a4e08f166eef94b2770f01e686abc8a2662065869a0fb7bc077ff52be60aa38cb78380040d4e25ec7261316564c8a30f85076c50ff8630bdb9e07b9df694a268ce1cbb6d5d4ff423ba3ca57179f002716a7a3ba3b4d0f9afa3259ab40958118c99db4b87bc99145bd56594be54d7a6e2b14a831f26377e125614f0724ee42284dbca4ba891b3c680333323a311d0e7210714820321839e58a90daf00ad60937d8325741c44eb96827f3adc5ddcb806976aee1919946909f3ec005aa86d59b133918b6261eb1a4efa8fd03ce1283b61967eda2bea5be072e8a137a472b54e9f68f8881b1f57fde67488a6a45aad44e375fb9a90b5dc58a6ca02e7b3768b0b9ad819411152b6de189451e76528676fd2b152b70bce756b8270d313011159fd12f907bdef1cef2212c3a114c3421f659c2b0e27b8b1dc1306508cf6d4d5bd43ff74f8b6a2cba95d0ad1f3650ac059538f4d078c7a7776ada0f75347354660831c600fdd89d0261784754b7dc472af8fb1280227247b0c58f030f5c452cebab26f0b31dc7a09f3326538a645a22f466644643f08c1a6c6d9439e2bf0e496480270707fd9817548e7f15625ffe2ffd4370488ad6665d1cd3b55f0ea08175608f2a4c3118ec1cdb7980e4fc85315d49b783d25437f911df8b948724054d377a0a549d68bb6a3d28a42cc3b30bb1ad2c77294e020272275107c197b5e3fce910283afa3097de480b8450d744b24206882c7ed3b774d9063c174becb286f7a9cb567ebc236161efd8985235d34ae25949c88b7a6540eff1acc3061b6426793c2d2d9fe42a0d2116257039e325462e5a12508bd7ecdefc0ff6e32a450ea45adf96347dd610609acc9d09f61a4ac21db027ddb48ecc44ba4b4b306e6e03a4074682352ffe93d12735aadc3b014b7ab7a345cc529061c5d326a97f55318631202b064821e20faca88467b1a0b9b54bc1fb435b6d2d31b3ab54dd4cf7854948434fbeea2374bdcd37d8552e61f3ff8888b7c53996eb5e84513a8cabd9b34024edfc79c8f99e52a402a1d8912de38318b9ad1eb1552c8c95ba9689064ec1c714a1953d954ab0f18c31b18d416ac616b8682b5e0c98cf14ba64b297d087adf74236ff29bef87ce0b1d0432a3c81c4e685e2df7e4c46639954723abb3fb488c2aac78c581fbe48f2c32ebd6783e72fac1470bf0bc3cce41bb0b133925ca5175ea9baf8d6b64ca1e419838d475a246b4d0acc07c1fc51326a206e26090ea51b8a04b31f18809b2b46888d5a6b3b6066d32ad837b88f248df179a6c3808a230cf28822a911c11b6d2ddc9134ddd551ee08fb3a43181cc1470dd5582c7070e52bd8cd8425fe7480fc901ba76ef6730448fe0cd824ca0a74efad0f8d4420c9101289cdb48a246ee88f9d9df14a3e030a4330463bca90f1b6336f17135dd50cfeb6e9cd65a4dd608b6de7d7859abff6c5c63487fd3151744acf50ab1b72eba2ac65f22872548476c3b6c128269824c6032162d0ae46eabf087ba5290b383a7bb72037b54d347130634aa625dd6648870cc0585a25dd8a0167e89234c95923220c5e9411135e24c2e39a9991eb6e0165d914290af9210781f8bc133320c4d9abe26fa491f9243beb5b04b29b3f81ac1a7142a982628c8b570a1858a9f80978c3a52946c37b4d9be800d7fcd185e3ce59dafa5ff027b3d9f6428123f390b8ec77f9b1f0bae1c0419b1a8f0c032f250624dbba61408db092381630e4a043b4a47aed704fce3a59c74c1a33822a3c890a41b8a6c2cdf6a9663c545a2473344d90f5025af71b5cd801cd9726276a3e5da7909ae77695f8d18412180a40c98b0e3098766b7a582a577494c33d3734e156acccd9f06950755f06468b36136b1e13925f1d074b545149aac9b25ef125d2f70cf47f81e733c4fdcde218d08054aeecb264dde3f1657be2d6bab3ceb3376cfc9b98269dd3e01404bc1e907011f8890990f8eb5ca1386b79097aec48fe370525d2c6aa6b4bf3beea90ff2cdc54f10cdd566c082e93a2c7c19cc5534a4fdcde47382f6255c84ecb138a3234083a5d7830c8cf5c54248e3fc729fc3e84f0f3244df494e2f40adea8e2da5cebe670ec98561a07c93175a4fe924d360f4edd5b711582ca447403db33b7f089c9e7e177c47680e262a6de1f8aa26c804d3821ff44110878894173dbde7517056cf58711547b19cbffad612d85eab1c5e0a98b68189b6f1f8704a1c76cb0220a7bfba17120b98f517108381b40aa592ecd436d5233b653c8a03de51a00f7cb164dab42009a3c4ac35030376d4bb35027be95637f9f66b135f49029695966c6c3243fbefb819fb4d5ac8903e76c26ce19e89525774790615216f33f38fb56cc6b81f1c8f882c8332b48996d78d02ea5d4d5c4a3487ea7e711845a50aef0c86c410d932b985fde669f918bdccca572aaf6bfbcfadd6d29814e071a450eff99684d2bd3a6d4d756a94792c3bf4f3b4f41c5caf4f50aa151f26bf344cb14ba69b29ded698f9f4410dacc6ac7e25775d835c0b0d2e07c7528ce199bf224af630407c76857288ecaf714cac37197aea74e9a52d891c489d148cc39d0750b020af9b515f291dede25d356870b3484c7e5b2076a25614949784cb64f27f0766280ad76bce4da0816225642125859eaad811e563009a50e009276900b689dd450fdd5fa9171a080e2864894ead60ba9be13f4586182bc29485cc23fd13dcf0bd8f4e5d5541b6b479c1ef4c34cf32ae6f2cb10e97bd7d1b1154fe2827cc95540356fe7c57e1d88e4f632ba49ce4aa5bc29276f6eb638c0c04d07cf113717b1445dc8917f7471f1b0e4e41a7c97e26a3e2784a2ded6bd9bc705510afbdfc36cc60e74f8b3ea5271b4fdf34c9dfd6c62130feebec238a8a3b43c858a87353d2d1d9e58d271db0666f492530a72afbf64c82046182e39c7e8f3a2954227a1f5398ef79d46e23e721c6c1d85b73e72cbdd5386b37b1c0be0e71b942d91701c8b1bc2bcf2bc24b17ebd8eb883fea163e5d4c8baa4a45ebf3cf1b767b17816ef4b11e147b42173d9bf96a28ca9026d48f756df1f1b3296cc4291fd4fbc9738fa47214dc1a1fc2d887401f0031fc700491196c03f3242c21e108dabef433c2840113fda35a25ab347790345ddc996f481278c1ce700c7c28551e6bbba415cdcc23411a93a46e7c02f7ebe5eca29d623529b0cc0196a769f4f4c91299815dc47a6f13b62122cc9c45893a1e8f664f7af0291b5446ce2c72c92bf097272eba39ea976f06bc7ac1a2e9d927bd898c2208264f2aae4b458b98e547e86d6e45d7420716c87db722685d6c9e974cab0b38f983dcbd4765652d57ac85f51335c6469c284fc48322d793052be8fe580d093a07352a164128f291be0e677ef212cd3f847cedf2834f619665fed38d3098d5d522c88691cce5a495742db41378b5b229a0d79eb8fee76488cee2d47bb0ffb9c672c5b18dd9394c7b6a40bb82eec61cbc0b01fdb4a21c99ff8b1a8d278e05b6ffccd2d49cb31092c88daf85e7877701b27668211a72e1f0c2218e366bf76fb77ce2205c6ad410707dab2edc604d76cf7cf988c37ad2e268dff4ca0af24ef3ff934db86932d7b81de1402803cac05a19427d3fbad7309bb195deceb36f3852f5578f06901434773e3710b26cf10e3554dc2d1fed28d5b35da988171364c6b9ae03ff3346342b58daaa02fca85075233d1ece0a33832585343421029a7dafa7cd09914116852d6bc3b3a3b6a7258445859e0b3955ec5c245309ebd0a5a05e7fc56383132e3cec162c4331e411b81df0d4c616f94e90c8cd946c8c40edf1ab67f8b4095911407c5973e16254dc24d3f80e774570ed30f9266c2494f1c37ff0c0bd05c05e0929412c3e063060b08c719b3c78a0a8a87b4a4a33edc023753a091d286b8651fdc0d9f65de7f00c37b92e1f18a3d55e0a63a624d859d0a9298956f3dca8104d789cdbd0c67fce256b4193795c848c552b5228aa61ca44ead4afccd2005252ae28d2da8981618b48a495cdc4e57f1d8d822e97e2cf7333bf673bbc697b2bf7996dde830aac5300f343dde4bc2634ae12aa1285cdd5ca5cbc7adcb3a6e3a950476eae0acd053ed405b5b19aee99810d55e769e0e538185d4bf10582bab7b6715ed32cb4a3985bb4e21c0e1b15e3ffe57cfd4785d3eada310061efc06fc0b212ce26ef931bb81eccf08b3d2e92aee9ecf8d174ed15c3dc7fbcd11609f0ca8d0a0a82c301f612fb22f5894ac20688a4ed1cc00bd3e93319d3bbe4b4dd0f018533a1dba06c1306d4e16d463d7a0757cd1bff2614641f1ece28a0ce2ec9b8f3f88cb5feba607e519dcdfc84e0fe38ecd9d585c7c19f2bf3b1de79fc4363102884f6169994eca8d671eb8359e0a206449f0c21467287d2b6855f466d96a25991f095008f99ecf3b79fbf682cd360677e76bfb6a193088eac40b55ec7ed10d418bcdf74eb41e15198f0bc4a6adaad0ccf06ad9bcb5c8e4625daf3d2e5f5dcf51c020da324cb0c6c9fc13be0d14844f38da99408660875118a996cc2e14de330c41bf5e9cc7310f9e13e5d0d40690e79edf7e4b0ba223619bfcd7beeb505255ba33a6fef3c80098d82c109f2aaf97f5c55d1a4378e6453311c0918114829d545d464be3b419ee3611462e6997793102337784663cfe948740cf4aad28c2b408a8956ae64a1e992450ed931c6e7963ef32d22ea906d326e70c07912f617b454f66944538a3e251817278c44961910430109a0dac2ebc1a806e151d3d157016aa490bdc76cd5bf383fe74fcefd15941bb0d30b29c5a715a338a230dcc4714ceb8973399e871eaeb69b05e97a2f95e64b9a313b65b3873793130bc58548e80ca8e31300afdbfce4483fddd6e45e4c6c670ba11981fd9a2215ae01436fbecd4b6367e4da26a820c33006171ee4d86600eca1516ee3e14ee9b5e6f15a802aaedcd7ae6523dedaf6224e6234d9095e3ea914dd93910e672994de12d279149ca83ffb67df67502ac723d9544d68e72d50f69bf7911b4d5633738e2f697f980f02472ac32a37814910c628cbb294ffbe1d64fdd7da7ace79f69753c8709934aa2809cf0f2d20442ff0a3f3e2483f47f4d65ec5d054bd03dfa2e8b40c8b867f645e6df586344f5ddeea81d287ee54ee7d8f6ce51a315598ba53c7cd667594faea585c548bd8e2e7bb009577ee5ae81dd03d03eacba373b9c1cd529100760f601db3d70c16e64f3e5e6e928f839e487b3089723fea3e65881e312346b120259c47394b179f74449d53239c33ecd454518bbaac4b0495640584d77545c5f478c3609db8837340248b6cd95aa238e1e27399f56c0ce0755793aaf019d943c876413233d017858e544bfbaa9e913f8bb2232d1c8fbc01903c282aacedc4ea787d82ab016266a11409432351a1d3820166325e2085fba8f5e06eef8125590648ad138fd06b0fa0df58a2a636ee62071a39d4591c452cf5483c423649a4ca80ccafb3998409da56efb9f9e6c89774f4d41e742f4344729f304ad4a3ee9cf11dc655b543d56715628a37bdebe325b6d857521a913701c1b00a56fde2d0c477eb280d3bcf7b940e718eebacf32de8b637b5f97d9320d47186d9cf49ce91c574442ba86d273d07ee60b4a2d8b682d351f721269565392035b878bc91f4eb058dfb577ed1c09986d5fbd136f255b74e7f5b4bd78ae475b6a735a4a75fa7ab654393156562630f9f5df05ced26ee208f5f02a2b3e31bbee73c99a1a93f1fe93047a8974e08453736873c5c61ba879334a2de32f7a1cbbee14f9826e4920bb797ac7d67962df72938cb25960e232f3293d96c14fd0e123d158da6bceac37d104697f41932f81396226f191f919f6f6997d7fd73f60ad5ae60498cc6d48e840046de04fe5173885c1e1132b5b40145a1aa523ae1431768315c4e754b5146537b1f031957a0ab409293118d4fdd424ee3107b6897fbcda0ea1554059834848cef503ea23df8fd422ab062f10f14b4d004c6843bdfc98dc0bbfb92398ace29a3101cc1deac54770ba89a95ce32f1abf973950c4d3b6dbafe699cc9b008218517f8980bf482fc19b7199089ed89678969a9f532e50ab3460cd7ff8c945b8f960bac6098ca3b4e44e0c7d94b3571c869189522806f430e0c31bc558e6eb0bf1924ac6e4be75b8dead6849fa7d87377cfda02686f930f67cb400a2d92a19fc3d1d74a7987d79afec004dce023256601dcf389a31639a727cbeb43d47f2471f40c415d27af27077ec47cf6f0097133eb8db9ab2895ea51bc3d5292fb66b828eba38968262a18acdba2ded3f0a29a38daa603f4ae4158f19c5854a69c030e0f8d4f4313f81498dfa30e545d815ddb7f5b50af96e339c8ce0425da997a8cd6b7e5bb5caa3df8947c582f2c3d2b753f037bd48784a5465057b1e3bfcac3b3f2e264e3cada2f82f9b31c5020482e4bdf5f96ea23cc3012b15297bb37fce57db873e540d172b6d2427e24f30dbcbba8dffa6bd500bb5e8f681fff226e9ad43eb9612fb6b71ddb2abca31286d9aacda5f4f337f57c9704566da969b9ab1d4308788b1065528e6926465b364a69476dd861caf517080317b61010f4d07d96e748c1d17bb174ef4f660725743e8f913a64ab1921ba980d5f65e630ee985a6c71aae344b12bf8498d93131df11cbc0d0f4fb3adf9841d92a1df52b67c9b27349f3fab3ddae85988507781543bb653c99506090585d647a1cd9374050e1262e9536cdc8247b79551e21a30bad46af83904fa11b3db065abecaaeb45064a586e576bd000f0a3bd8095d92676634a7dc3790bc8d57160a96ebf64831795e12c7655c62edffa4506e4c121e5e7787bf4460f7e7e3d56173f699ede9886265cafa7afb3c41b6a2b78ed1bef983780aee87e6b95295eab58c9cb113aa86a507a234faba7405397971cd912964539cfac31c19519de2f3e704c3ee652c24f51f1e1a9c6146c2b115cefac5a8156ac20c34380562b84369a34990e5ebcdc2394d82dbdd139bf4cb3146fac34faf0ce2befa7b6a50417af8763e0eb6b223154acb23c02a018d7182a5b2448f062c2114fe9b69311f57aa78b2485fd8f8067bb3a4d5de4254a3d2145c77b5b0d67dc58d22d6d7560c6c44120f14b355a951805b22927f20c3ef69b7e9660f4de9bba747e3a79eb3839e2c0252cda83edeac07d99bfb2b587ecb27ca663378736aace4afbc90edde5f90c0a29b530ecb3a353cdba472b2c42d5412f90edf7fbe31edc0d45dfb41e91a563ee7ef60284d8159386d7014c9239c6bddc7daea2c8290a16f809880780348e9bf495ce1fabd1e505762984029a4cc1a567905ecaaac00e1a1fe15cf19c82ad1cf43ef58114150b3e6dde4b2ca8f341cc968ff1b0ae998d03451ba5a2d7f480563c18edd134458488e4ac888b82d784e18de8a8729d2574492d887404ebcfbc7274935092687771ac279e15db64ea09e8bf4bbf3106ea2117b9549f2753b885b42a061cf3aed4b030ae5091dbc99ddb4a4019cedb6cf875ce4ba72fd45742c5aab41270be858eb6864fd2c1b452f6e31c654607b428d0e43d4087839735649d82d2b428eb93471965acddd1d403aa631dfcfb90895d7d6943f393b0282e5a41246d011a4f1b938a1a12fa945d88493d0a3fd4ef7cbbd63a9ed05e54889d056df592b9d8fec2f73bac5f96a26f1bf3a28413260244dd7832d04c94d6b54266edf21c8961102965e31c19a09cd236d7f023d8a6da2612687ce4135613c3611d60612289ddd4a9361676781201a9dcf86173f5ca0f37a081b6ff292269b319359fc02aa4b2b9dd276ac4a32f95a254d226cdadbbf1ef7750f49803f186946108c90215b431131bb29c34d2abdd5bd06bf12d97152a295d00dbcfcd07d0f881958b15787200701574605850ffd505b6d5b09b1e68fcb8d25c3eb1b14431546b58190079dc0f41002cdfc75cf0f3f9ab30535515efc93bf47b20a50cf7fabb19b3031e7b377fbc15b056ba293b302a427a5620ed91f971dcfe1b537549131103813c4f8d83a45cd504e8d27538bc29d938ff9712f7cf38a5431e4a2cbbf1bd3427b686355ddb5bbd2044857632fcf50ff2d4b4649ab0f1037cd01b396beb786fb7af8ed3e9ed458eb96f5a4257d842a6ea54d7156e77c9f418e1e4fd9f43d48d2d70fe288a0e010f4d8bca9615302fac56c4926085ea5a460105b5b4bcefcbda9787f8127022d053c240ac657d03c424dde90c1fec2e7fbaf682f7f21597ba18357363fe3b25e9a460321980a6c980bb7670c332e2bbc49366251ff64bfbf15c80c220a1a1d9e239092ead4067eaba84497c4fe1eb7c20d66e803a271afd25afdb86bcfe3bfd5dee7f0cb7133816c5ed19aa6398472f496d450996021a6bfd814f0c4933a9dc30f3c835360557f4f815ed2f7ed03354918d6a89d44b3bdf958870dfa94ca920e2d4b547d52460a8583392961b3579b04f72a5da13d6b7a9605b78d7e53cf1830e21dcf9883eb4a41f7a09ee0120c9bb8bd43e2d0d6e0be2d567fcb35c484f2ff0c360d1baba6d2d28e664145f7a308ba9e516ef54dc76d47296745968f48fc1d7ac932da43058b1aca518092412ab84892648db03b0d1f1d36de362cffafbdebffa79056b6466ac00c1e0e0dbe3cde4a6515f39c969792142204d0a703af2b05442e07b88966ba023abfdc2fd0d64ba7ea943dcf37f8471b9ab0fed0816efbd2f77b321e4e4f4ea43193ef9d7264880869bef1786f58f52d17d80e3737ef1bda9a19f9c0e204589a7efb796ee0d0b8e6b0d1cf6dcbffaac4fe49c8f80337e82236760e580d0aa88c577fa589e50d521135edfdcf60627b372c4b573a5075aaf8ddf5c1bc82d5c4a31321be90a07a3b0a55eba71a77cdfdb5fa80e52544172138bf2ee1e5a2e7e79552780eb965f683347558d8882aca3ae15cb255c04495787cef7c23f0a8f7b43c1ba1d8ede6ba5df21d2efb3cf42772c7222b0a74522521d2eba805e6aaf5ac6bed2972cb7dadbe8dd05a57664d58866f2ca513d5ca5a328874cb5636ddd7980b5f21e3ea7fe395d1a3a1cba00802dee74ef70709c6deb2073d76cf76f3200837947831a644396c2234f46869586699c17c87a98a45d62e9a59bda417b82e67764e34af509cb8a9cd221acb8777a3dc13098c564ef33a3026711e819fb4b3493a0a134ad615513da2e966463b1df4e2bbe6a1cd3955b32be88a58347d87689609a6aad00d6e4368bb7f59fd4c610ca8047e41fb686b9810ad5e4efd0a24b48f63a0089d7b3389cdf0f3b9b2c3041d8704ca46fab2edee6fde20263d668683d0927bd1205626c27ae43c55626206d2d44277a7d55f5b48ab5c4271ae9479dd8e9ca5fdb2d215f66253ba8d9582bded8c4c6dbf222c9ec1a7ecf50472c12e89c22d8ac23ecad805f552178997fcfd671630cb2034a903b4e972a777255dbb6a9101912596180e1aab64dc07809f9952af5062986212dced7877364dad1cfb29a67f94756cfb2ac898cd072c67771311a974304b8d8cad5765d50d74d3090b005bd16c4a0028832b8885cec1c28f2eddc946eb7b69e4027bfbe0b821081ae325bb571bb083488f6016250de3be2904a9e8cb0a606c27ffa366ad93df3c329bb60fb95ed0162bdbc3368aa469e058600318727900b0121bb9d3d5a8ccf6838f0d102bff16b4cd0c1fb49423b13732e9db6b51e3c42eb39b4eeb19ec35765646f8acd252d703202c08bc02e3590fae9af79fbc029375a8ddb73e262794e6ec197ab0ccf24281f687f170133d68799472def59751d958b2661daeaf4003cd485062ba9646aad2bbe4b58fd294526f4be95fe8466dc6b8f0af9d6e88834fb7842093bdebe9c4cf47f01096132602ebeb82b49d2259f10c42b2fae62f1b5e96aa6b56fae5b2e8e5c91cc2c6c304240e1f4337091a4522018347555713148bc17194f7824e597984279af901eea8bd0154e20f0058f5f112049d29ff8daa305ae92b0298e6cbab6120dc0bff790d30f197cb383356dc3d02c38873a809d17bcac46b5acd5dde402e6a0889cf3ff78030f0711c1fbd78d0576a01ec1d3bcdca6611eac3031542b7eb5ff6829fca85e4325ff9aad19270fc1f9582fc0bbb713f7bc6b3bb6ce7394158f550a245680b37330d6be4766bc1632d0f272ceaea227b021108085acee18eb49a911ff5261acd4814255e5e688d7e51e470996eaa85f146c60d2ab4d0abb9ecfb58e79e8bcf1d9c9b3e05c10b93b632e9c6b53740b0426c3a44de6002060b54de65d86940294c33b96910dba089fadac1b55002d7fc980907246f76353ee2e74e3f69dea6756addda0a807495c57d46da15bce2d23cb82c02dfd24fab0dcc59ac8769b7edc1d3a9a6ef2e8b007631e1853523061626e0daa78cecf0438988fc35ab06e1ec0ee97ea2fad185dabd6302ae0795a862fcd44f01380fe18964cb6093faf16745267db806ffe234ed82edf4094ad551eeda10c8bf1bdee80076223f4175428b9a4250546b2c2591679bcc25ecb2504539c9811b33ccd0cb0140ec9c3c7fa72060304b0e7d606fa49be9bcc39021167452e3f22cb5c2d0f368d4bea976083400812e4fc0e3a2277a27167a2ea885edd107a5c2a50f1852542d68183d91aa23291421f5a5620399df757b8cd4c0af98a7b459b9d9d593f884d9fc0cb55179ba9282992cac43e6e3821fa4a82d718518a94979ec5a627db6a6870da25da330901c1b88af7578879ea57426e71091b9614b55ce2c8df5ce126de5503ff7ec64c76bf2828a8c340a6c465daa863c719a0f6df289b7a807d0c767c99b84f85818c5913ee23f13da00834f8958b904e77254dd45936529f8890681813c8b0252e2392750acd07aabec90205eb6a46b0aa83c90023083066271c2c512e8fe04a8941002a8a6c2c0c05fd2c35d20650308d2f4e3ab3e8a3162cf4e810ea77aa2c256e075c1e65f0ad37e7c8445428104ba1fc0dd6fcef5c240a3ef2b1795bb70d9a407baa8539767fcbb95253c0ad6e95a30d73ccd752ace0413dcf5e25ffe6789c8f0d8037315f1f8aff25299ded5b4804d097d21378ac88543fa20e6f209cab9db2d3b2eb46163d65c4a366b81fc58b24b40eefc59825a351ea546e2b11aa3af35698ea05cc1134cdadd118db7de148ef88d21d87a659efcf2c8231af51f04463ed34595895420d034bcae25deeddce40ea7b2ec478c35b8dcedd5c2ad99857506a3a19437c84f6a1c4cd604e99c83de14bbaa31f56f4b9cc5b7b2a712520aff06d72388ae38a57ae0cccf6644604b0fc476afc30f159fca169580af7a1bc702288b23693588fd7a04c676bbc14e9a082d941d9edefc81940ce28c9c4f24389c7a348bb9d5a2ecb5c838d2492dc19c87d11928b9261ed35009611b3258c8ddcd1cbeaa4c52e41f3543e5a3758c91de8ecb3598d2f0fe5a9357d6e0a89ae0fd7699cc42d274fca3051154ae516f845c58b130543e883a1e79d11a2b24a228c2e461ce4a7a59c8f0e14e9b33ffec6b787793f3b58552a5cdc6e3f73e43734df340fa94e5fb244d109767bead51887e3531380f464f24a134b8e9c8e9959a4acbd1ede384c3ac773190759b4b689c23967b4aec329ae498af8f1a1dfafac8b1e9c8ce84d02e163025a6f42cd152a5eea37e56814c7536175448072f36508dccf4bcafb84e7ad91e4156d36b92972efb6dfe65ae3a8c8241b425734e21b987130c4b130f01e0763de38f5aa4ab465b002f4f1eb3445397df7e7eba40f5633c0ffab75e56c40e4501037d066260e62b880789cb52aaaa029556790e16a89c1b37eaa70e02de77fd7079cb03fb9477dc1a1623785895777b93966037208c39d8c20808f042dc8de218e2d0655a64fba71b44082ed7d5822152d459ce148eac8522dbdce1938da9381c17ada130edd7ef4bee10584c89f1aec3df9e373aa4b81c44736f6132a995b2e8ec1d4f9846bf2cda4c2ac4726774ba50ee4f546ad152d97f104ebbe439f5519649b609b2769576715c0f93436aee6b5a4dea6a1861073ef5eb1715788749ae8a6102e5c97c97373ecf76b94138accbfe3c2f4f8077ccb3ad6c528ab7a2816b7a6bf86e0e934061b8fb2ec73e10f15bcd62c05159aaca17e097c05d3e29cc3a35bbe30b10daeac28ab9df28a39d464f07d9beb7550597a251042bbe8d082cc711231cc20107a731b57dc321c412dedbe9069e79536eb5bc031b0e28dc78facd97fa8174b31510ce47484d2353afa24e230abccb0f7e4b36d55fc316e452c71a45276e861002900340caadb69519c83280de88034853bd8bbb893d1766520dc605bbe020ab1199deba51ec997d8fce5e7052be09b5459c04bf884db2d6f029b1cfd479d36146753bf9d4ba681b957509a9f062ccf47c63e56f3214f360e6b3ca16e141ece512deb80500582787b3d221aa53df50fddf359858b65a834f7e6d4af650b1fa1c89e247ad867bb9b07d1044d09c1a092389f1de579b42090439e0b1cab51b4dc1d8fdc5bf89ba396fdfb93c8812b9a29cfb5e4ebf2c397a3e317c2fa01c6c552924f09103c834eb19d1e5256c9c3fabc61f094065622793498a04428a2e69982e8a8cd791e7770e2a4b23b698001f862377869bc1c42f4b01478d1c15e7991d295e2d0b30b6ef8bc405aa29b7ac4818e0eebf8597aa060d7a42200c732712c75f880000c512ad138ea9a8f72e20d0ca2e75b79a1ac5d9a53ac292fa970dba48521f3f9637915f8c880a099938f86b193b84e86a9bd5ce177c8092d62e3165fcd4bc52900517c007d352f98d1b71249c69621cf86dd765b2998f98fe67e16c08e5581a8207b314cb563d7f60a62d7dc70e7adea17691f54790cdfa8066444444578e2a98ca4616538a7be67c9008e640ce4aa18b9fda9512b7bebb96c69102320dd0a464a32dfa4524e4dc968edcd78a1ca1678bac09b5c7385c6553f7e310a3def7e921945a56049b40e35e2555570b1992d4ac5d1e85593b2b50dc66bb2e7ce360d825518e557e84a13d13162206a87c75f4fafeb1151369c58f4c306f61f5470d3991aa2361d8c0358735d0a49030d465c5ccf8d978edec6bb198d286b8bbb384ecf8477b78eae9544ed71499e3813c67daee0ede79b10db8bd06c1f2bda7e423f3b8b335f5885dff27a777a89827e85bc1098ce6b1bb9c3ee35e31dc328f68a9dc9501098b355b2a274105391f41b5e97e6f6e92790a384b17964cddccb5e5f907a97787d62d55c09e7bf8c37f1904a1160b653c8dcaa539930aed8e2ee20d1971bfb3d359cc40a4a332df16dc09963d6611e2e9c03e307e74c725ceb272a222825de6d0777c0266844f13b0652c736b5e404143cdea75c047ba2fdfd5cb7d3804b3f16e4717aee5e17a20d5c224ba38d9e0975857f3eb5702df56933ccf63062bc335a72cd3e1e821c0d0c319bcb154272af4188cfefd761e949f5ce4c9f71b5da2570f2694a132cab7d439306db0d2c1d983e9257329be9d91a5c2d048d6044fb2a4621e37e7ffbbe37e63122a6e90151981b4a2aca6f82d7cf1d208a7b64b5f8a2870954664df34d36052890f50dd6d62e66dc242314d2ff94a395f32063b58a673d34187f7dfa47422bf263168cacf89eb860fbec232ab48c40168c0e6a0f8791ba029e32e32d31b90bb9f49d84a4fa55fe64984d1b7049e19dedb7b6bc6b93644f7aebf404b13463f9949a6b7603fa61c154c421e1015e3c1e13f0bc2c9e53d4147a7c3eaaca6884cd7efb08c43146958b4f12a029d71a82c9a5c119ae9dd2dd3294b69a16152bb65f5a21df3b1f7f52e8ede11fa242e44bd68ec17c7b0c625cd3b271180364c54c298798a48975f06c35ae708113e1dfbf225b4579e9a62f376dc218c034bea55332c9c2107527e7c86dbe235d57ad5ea28041c69d0c611c728efe1305b563165e78420fabc56ed96c22f51762149518a696642c83235d4ecb009ae37d8cc9321fa7f0bd4c9c860de6817e869822f5e7aadbce64d4117a99160d7ced1a98275d5512f6d49dccde0d806c91a651966beb9ed02401533a9f0a55578a1895a212e7ca7f16c582a8ba3a64f13b5f756b04f9e0388ab16b0a636192a50e132163fbd332ac0c8a57082d0c7e359295cdb0235f2b341db19843c3045603d4ccda05ad847fe3a7f3e4cbada8c33fac08ec6eacbebc731a42d7cbeadcce026818ae7851892d63c64ca69d2082618d17ae42bea52b7117c1e810f0f0f277eeb7153812bceaa605570485d282b82afecf80be7f7ce23b11fc82e62b591e7949c485470f767544c55bd5ad4de8792115037a05f3498afe6fa10f7b11229bdb12fcbaca9b1f07a16c474ef13c883e843f7a0b011c526d00f589ae2ec87bc323767663276df2b7a1ed0791e7cef33a9c2e45275244d708cbc8541d2eac4d518296d1a58ea94ffd8a72a2102039e2ce59d28b94eed21ba5fb40f27ed8d1db3e2fdcc24e271938f46dd52b20c7ae6663d629e6101121ff177c5b8eb1c5a5d4dd39426333a74f162adfffb2af524811b73a05b1547e3514dff15148e5059eef75aaa18e0218f00bc6d2a5a910e5106a05cf6466ee6499b318134edc4b9e10ce677b13bb4ab8114c9bc8b72984e94984d4432a9bea8532a657685371341bf4e43095916db038031c0aa723650baa8816e6db9f5fcc8971b3030a05bad9b52acb139513c9bdca0df230f81364f9baf91f4ef599bc3763461d2d9a39aa60b893c4b69081e0044a8b3bec73d7ae594bf078f35b6db775196a37b3aa63504caac07a63d7fa8db2873c541f273854493a17b374602c4109d097cae77d3680002bd158eb365a51c6674e8bb54a6f1d93d0409facb494bf8c3f60f55fd779563d0103c1143048c619236f96b7bffad1f9a1942b4264c09c05f584417fcda8f035c50a7438fe0ca786dd649bc34003a0bba2bd788735590a272108b070a105b41f0411955952299d1065d3d836bb8f91811a39255f0e6e86da0f7694d72b78a9ee138afc9aef1c0a4f469af6283bd4c0f44d0d280fcae81dec26af7e23797295850cd437384541781b79e25792d2635cbd37622328e7cf3b19aeff8f730deab92ef3dd88359e1c7a4831ec147e9884a715aaa892a2f6aec359af7213bfbc8d3ba628d3b6c5536f1aab28b61cf7ca39e02e947ddd59b638432e72d3b5598d01ed815c3c78886a39bdf2e98b397764612dda1c7bd00f88887a6747c48ba0a9f40e91b2d8d2c5fe2c0df0d62013d06dcbec20b7b4da36c26695a96eced3daf276baf48e0959afb650ec2768271fe25770134089b0276ef42ca1427339d20cb3c1755195232f5bcf816137b6d41ef702b0224a4af76383a99e8e6641463f2e50ec5cfd3b1dc416be5038751d564b83c7ea0dec74fa290fa67310f32f641a995781a36a844f244ec2861d00af69b657fabf1517894866ca76460bd8c997c7eaf80a77491d37faa944e963c1c6aad4114dc624ef90a28f3e7298a82f1e1a11efd01ef4650c82f8e03335bbaefe3af99c1d561e345e2beb10d5bd5d807937caeb12e4e898ff64f6ccdd0a74be8a71e4309e823d7a3430fd1d65e0c97ca7d2fd6f34efb3a7877c9a3db947d6970dfff83d34b7a6e8bf97914514908f359a37e0cabd1811749455ada7023c8585d41c89391896255b064a1d806f261988f730ba42c0420e54aebce711f97c5179b7b08071da6e5653467cf6e53982f6b79a30b1546182182f950a72ab17222d31cf52006996f1f8b305db07ad31cf3970c16e22f3499adf6d37c969e8460b13974d0356c5ebdf0edd7b6289f8fd9049579de0386d69deb79b32d862594b7b77bbca21856aa427c9eba060ad414c80ed0b906262ace17144cf817a4444af4fc924af7a9df51ed925c21df86a4c4de168c048c1bd154a22c4c52c22c8a5616e9718c61cdc8d5df28b7778ec6101c18166cda46072b834c594cf231d93a4314ace5abb7fb2079f7a8a7e8e98262e9f7c4969aae7dbbfa6bcef28e916a77f86ee8cfb099f366bfb9625de77eedf68790d7b054eb7452b7582b4abd7369e1958981af589789bf7780b82c921e30a70d0f1c053f5962510e28b658d43d3a9e8a197d73b50b0188cc3170c2007f40404d168ba71c818831c4876862160d6c6caadf2511cebbc22c53ec98f58ee1e2fcb16b4b6541b3b9cd788e27862e038ca14fcb75c2e58423eb3390b6e225138177f63b20df5393a4117fe416184b574610a1ce780d4840ae57431475de325ef94d774081cef7dae04ca4aa0cbea79b1ed14db4ec52189c129c573473cc85c4fa45f800761517bc43630d6edd2f17e74866f1d21bf3c44ac734d5e367491be23c7a31247e88241cc29a0880d5f58cffb8692ed9f2c8ef768db35b9d148c4b0c784e380715a0243e873da7cc74ac325b873606a8eb82938a0347cf95e94e6e1c3ccb0d5f9d86216ddd7f050898de600ca358c690e5db0d7a0e1ae9ab5d4c69a342bb003b548ab63dd9bcd53210a35092c42462f9698376432d23955548bc5700535f5c788d02d8383551afcf32dbcd9d12cffc0e64331801913b01923ff5d2b2612d6bccbf419a23c2004463185ff3185c8cba703c73b29853c0a9b608108b1a71d3986da223d8d7ac13c3f4ebb85e064ba9974d7508569cca22828dc1a0e4c05998c3cb3cff24ba6f3d0e27d70406fade30180e16011d3f4e9d207dd5034919e564bdfefc3e83182637646f2de6a572070e8a051d413c72e0a1b72efb68a03df9a6a015f1d51553e4230c29146ea883859a8e76270b52b2d043b43cabf7930f9a6263b4619190caec406b0a981236d1b24dcc1df61e7b3fb24797c8c2bbc0c58a5ca0006c8134239b3cb780d0ae073eadc2d9e71db85843b3bd1735800f9fdd3bce5fe26a4c64ef0c575532fa41bafdf93ec78c01971faa00d1c12e030dee75b7de47770a02a14e57525fb1a41a76ad90b9662154ca4fdb121ddb8782f5b1b24a6026475217827fca025b1d51431c841dee534c211c8a6900925a8cefc170f5af5cf15d4b51678f6574c10ad3833ae39c2eb54908c4fa6a8805d2a70376a0cd1a6ec6b5a48252ec7b624d3b2ac51876608b80f016b0860533c12040bde77948e8e5c37db7fc34a927e03f3115ee585d47049a4074ef324a56ccd38d3f0eff4b59faca213e27a71c5336ac4b953ae4222db3218a4ca726380e8833cc8b7d95acdf00b84627350e413b9ca13219753a914344bdbbb653080bac60e53aa6f22859bfb20dfdd8b1d29a141697fc13c0a44b7e196c679272908c19edce8fce4941761d78d05dda4ef064470ee275aafab92355a42692fd307a2a2ed01390657adf00690c9afad6330029f70667f650f8cad8a36540142a00e1f776b96a38f3419f0e49fe387db91fd03ef77c5bb27c2dff1e12412e9a20f458de5dc68ca553e2ab9fc951c353a846d6391e46c8edd3a1b92729f335de032818e9d62f142c09339982a36b39561d944608a319add897e68889b72914cc165b18cb9fdf9e741aec27cee4d118875225133d2c3e76cfe603670fa4b14dcf41d4cb0b14874e4e64590e39c50c29172c87f0b91869c3c4b2d7c04b214c940598a1b6fca73754de31a6ca0611eeb97b75a7600b6a3cf58a39d94d8efc38c897eba9cc25e54c5f8c7d6c9b5bbe2d672885849d851b706dd690bd5c36791a04f4c551753e1b786273ba4ecf3830e435fc6bdc3adbabba77d1e415a3b9bd13d5fd3b110ef0cf567e35665cea1313752a276f40dfc307dc1c73c0631405540a5a1a66cc540f82edad7cea37869896bfae0c879d4a1e2dab26f6cae8e133878c23ae397c2827ac617ace9795746029e7cb25086aee560eb60a049e954bb8d34890deffc0686534c31d32c48a97d98df53886f7d9a75a2f05cb5f002c48c5f7231d6fb1b8a08a3f7ceba2dfbb83819967547eb2f4ae4f215994e99a70fadc66d6d60cd8d9f4e74d47b9fcc39105d8908791e5ed01e5f401e5665619b07c0e7f7ed733bdffcda82882d25d50c904c1a5af78c8de0834ce128a4bf2656c00b07205146d8b03ca27ce4bec4408679b9c1b67c5ecb8f221b91c12bb39f975e6a78e0405339146cbe424ef87380286a5e057efbca8553d1f156418542308943af506b01bc7309e654964304f864b60519504de4f96807e552466b6b29f79a2df5010c9e84612c46f08fea4a865053a17ab94d6cf15b24db344e41a4d29c0a3d235edbaba926894aaa8e66ccfa5626a644afd986864a0b9fde1492fa26ef8e128a814f28237a2562ab72c97203500dbbf59d04276723a15780708c88a697b28131a9556acf0727dca42f5c23cb8208b335041149e21cd0f72454ceecced393267bd73f33b36b721ce5c21ce186bd8b5cecf4845474a1c50ee9cf2be2e79729783fd322749989f25810d4db614e47352848c13efdbb6a4196018ced538718856219f5f2c94122780f8bdf7055824565c5ffa58869b927f3bb8c92c48fdf3d4c11d5b78a283764760aa9b4980f7900bebb90ceeb82c41ecabf4e9ed80840892b94a72b45a42edc9afb405800a1a22e63cc910227f3564e9924e0af19bc3aff0e6621b5665a0a45d3e8d4eacb60cab062ba378628147c6c727addb04c1b555ce7df1112c012a58f783ebd2d5df5ef29a80f86d06b518776f6b30837c43d3791de6ffc7457ea72467b25f41d6bfa9553a298c90e5c98858d692b01d2501836ff90fe18de9a249015e01db8a3889fb0084977364e58fa48b7c957cdf411eadb7e970616cfc8889f8d8cc3eba55c77fe3082343b4efa43bee7f89b47f1c9f974641ca57e33e2b1f3ee27af17efa583102963df4db9ed213e20afeffd47837a86651cc28c2743f7628000eab626de463a2af9536eac3fadf84ad14094661a3e6989a89a6cc91a0e6df272a59fdd4939b9565dddac7e4daa4d625d4fcd3386729680f8489730af36faaff03eb48444cfb5b184eed58c804b8a3d475382431b07ca1578b5a1d612edaadbde3f9c457d897415a31313a3cff89f1dcbe94986eb492047d9c395bc690bef00b9908e5f41ca5eb11fbc6b4395b22242150ec14e5c51b59df1c6977755b0f4a024328c30f8c52a8e8b38dc73568c99003f034a6dbbc995e704df83da1027c93a1f7ae3e4eabf3081d5e01c4b78a52615f4f2ce49cf18561dcc19f93018eea9bab97c278d79b9f35478ed53e7088d167251a635baf16aaf89889b8937dc3136f57912cd9a90c4ca9b22e8d64858f74412b5f516116aa8350b0775220943e899c84034d4ae8588dc0d8413d141df6dbfaa447ce384f2a74eb274f6639c73ca81813e6e7602c92f60fd9e89c45aa7c29ff3b25d31b3aa9de664abc2329dc85382499c60598b10630105c5779b34428ef7381f26a589f510adf684d31156bf58e111099bc66672feccf962fee7419ee2595dd9097db08580b9b66984040578855e8561f1214828d2fe184827cc3cce54d459ed38cbfb162def06cc602c002708283808898f513faf5e02499a73189fc49bb5b5b61eddba0ace5b117cd5b9e085d0210408b41d5343306cc72f92211c945c9b7582b77397c213001ad4cbba7e28184220e886e913d1e112750e2515a27f20896249d8e1c97f94d324395fb111a15481e533e5062e661616c3b9dbfacd16f95a91958aabb4029340f571b3d484139835f41861758f001254e14c90c99ea261395b69281a1b40b342384f900509e3034a840623904f74b83a44709308a19d10ecfd627960043200970e4d7d67ac98c5a16540e7fc1dc8149defab2a456c31bc124028eefe68548f6304a20e0b8eab247abbe4805b3279b2647c03830ea7daab8a627dd05ab8baa386f9e5df4452e11a221e10d97a04a307137f8b00e53c0716370b5fb854fdf95f72c8f6e0031a3027bf92e2554ba06c4a8a2410c734459ac3da3fcb76aae7b16c9889652f30241ba8e7b610b0fa6ac9874cdb9de21aac07d9d4e935e3ce87b4f42f527ef6952177d874fd0e7f123636d7ad23f9cf913c8e3a86b29261c4fd78250d3adc1be518c4988d1f45bd1be89e25ae3274e6f63ec91a8a658dd8ccaa3fe96de449cd1aad11ce9fa4a5041d0bde9c851a6a4459f8cc22e53ed6716bd4642b98ebfe532c70efe42a048ef4316ed0bb4032bb6fdebdcdc0998717894f47131fa007f0d6b50fe33009318fedef22a3759e8cfc2790927f2a1b53f7615593174b600646f6895a2c1fae5d0c36f8015f63c3f132317267940855fe8da43a67288ae1765208e41a7e17c917b64d6c9edc905589f6c98c9a09d07ef42cf305d9ab1f54aa91c60b20f0b785dd1d020f737f47d18c1483f82a542088841e71fbfbe528112a535bea0c213341b79e644dc70876a644cf81993fd6557bcd8044c716e0a8e90e56010ee315ff8ed471d17c36a24034c94a3e479fd17853c4f5f56f1293c5f384cc8a0e703a1ffdbd62fe01e99f7e2f6f5c1ab41792f384ee06d2a9052bd5296175a9ffee40e4c2e5f04c4c88de4128ba5afcfcbd635d001bdc5407747907e3deb94513770b5555c0a57b05c95a597ceac5aa7fc758ca2d30cbd1f3f3f5cad764b40c531acf1dd6e456081aaf899cb5aab9f5a9ab85692bca71d970ff83a3019d1f5bf1099fa3d1e55ef9011fb75b274ab532626aceca6bffb54bd36fac5efb52a1608cb6ebfca2414b0bfcdace371c865dd69397521c62e946cf477178c0a0a0570f767ac78254bb906d5060fd6d0c5efa6aeb8824d2bc67fb2815faba4b6c9ced052b7da7d58ec19e5506c8e3196b73bef62d51e05cfdec8ab6a144e410680d6214f6d657589d389b6e74daaa04a87ea8bada76a05771eaf99be2cceace522d0d636f07f9a54025776258bc0453798d83401a0bf33835cd0543011339384ef8db65260c5d4a7ed7db4026735bb91b14223c092997c05b4f9eedbee6568ae453327d01358b253b0b4c3f5a1d794a0b2c12ec3bfa919a4b42f053d801fc80ba3a27d6a7d78fee703a25a335f69c045ddbcca2a264d98ed34f48513fb209ace249a7f2a034b232689734d5b879a6d0e005c9b01be6deeb628f627f8dfb00d6d1cf017aa676d371f0edef4f360c6083b1e33061b6ee8b0b843758f4c15ad1599fc879184101748392d9e79cd0d6818740082474a379764849941b15b2b2f582ab4fbde12802a6cf021f5cfdae058ae93db89978d8849efb7f39a91841b4a2b4626b662dcd8d08774cfbabf7c87b113f39e4abb010ddd943ca835b9bcadf09048d15599c3d3434cdcd4e3ce1b5c241ff1d24e5f87f5891f5081e94da9f72941fe47129a3d11576a2bdfc0a5431b2d11b9f131c30536325dc6fd1985d364ae88b212d5a18234879bd1fea0c8649e0a617bcec08c047d64d1e99a8b38824678d4fb92e75cca479594f201f93594aef5032c2d09907c9aee2ab1fd00a7334afbd6064e02d49cfde1c0795210f7bd8157e3a29bd67c3394e5a26c42a5da1b6c9688284f0f0c186a760566f06df4736935eef0aeaa78e992746367dbf1b1cf14c21b65aadd7ea47840cb09e92ee0b231eb7a9eff018fb8e530a1c44148de3fb5f2a24e154484257729586caa34dad7d093e2cc4017e4f96e18b63b007db2449a736c00cd22118fda189cf1b7d83e945a0288a2913724f4417add4012770549b00f84055bca0bcf2fa9f44f7aff1a65b62d86cce137847466246e0d38c9d35ed0f73684871ebf9899721a2ccbe337e3c3e95acd37b9a58008ef2da0871634c394ad3c3183e8d5ed00f4628f4f968804ffaac6119701d0b256f741e25934738dc058e96a487ee2963ca61408fc9afd40a2fa58586e1cc69df0c653da9189a574bc67fce46da4439e9acb1396b2f1a4eb841a86f23cd74c529b05339d2eec8811e4b8934f72971a93a79ff0036241c2f3c74fce874dfa9131c049a508fb0683f46cfce9893f92193aba9a7410d592a1beaf41277a75cb54e028e1a8a4b1d73c76e1104ac53a2bed09587916d9cfdd0e8df78cadb5ab48391d472eeae48179f3511a692719f41b1c91bcb6e68b60bc04546b409df5f1c974da0dbf2d86fdf01e46a1d1d85d2bb1f7b89abf05d5a371ad9ca82b84152c4e0f50a6ba854a06a4648c699038b1548d4b708ed2a143329004a00546005e6a37fa9dfd3738ddf2408c3d131857174d219ebd1c9d1112e48d15466d9739162ccaacb4a4acf057b1ed1a785552eef19df539124f694c61442ea7620dcb9dea3398cef1fabfa404f61624b4d77519c7efa21ec9c0bc3f4265a967fd4eb9d6d86aebbd058ce2cad4b957d2d011d0b1bd3ca6559bda5037923e9aac99f5816c0f012e4d2398aa01a8d7904e91745d455b3d747365ddcc54bfad2720f9dff443ef5665f38303f1169defabab2c3813e63a9622621994e47782f1c7d732a4ed3f7a54ce38ee0aa8a1ba4d2a3e292e8bcea86f76ab824e427a77bf01579ef68476a1168f1e6fa6ab2677a500dc160124f591458b981d87f013686a7cfcbd21d21d6f2ca39b4044bf85529c98b82db541dee3ea91dadd14ed0a6b0d81143f8013746044d18da4495ddc16ea07df8e823742d675835dfc8146d9d265974b7ea92bbf330269731b81307c5b89c3897ae5da5c93f14e7e5a77ee1aeae17c23232d41df7c497fa9f0ce1aa53495a43fda0cd57fb53731dad3fe2a06ffe7006a337636aa98595eaebba26fc38538e451fa6d0f19a7d1681acf80e31fa5e8b763274e254a814ffe1530c06392ffb111d2dba6e84907a35fd6bf4d63b3b917eb4fef98d2b5d6edb91bcbc29ae45d91cb2e5c0b6e6aa6b5edd52baaac7f80eab8fc31bc43ff3d8d88bfa2ee57b4d65c3809f4e6c076bae8db66393fb674d56a5e066cb6a4d2cc16d1246ce24309530b2128e302c7cd33ece3f1186c19c8d5b4024cf7aef2aef1a1b7ddaf4ce2be3c3e7a46addeacd90f8476d18087d25b8fb2a59d0588eb64b8381e648da570abd835f39dabfac3ec5ca173b5589012ba00a55a5e6e7de0d54a368ddb067cec16e773105d2dd95ceefcc4881311008d6ecf342d07105a2fd31a4f6ff5c81107cb90a73f6a16e8056543abae33842a45f449f8adaa2c7ad0c351f7f4fca170312256857f9631b6f83794be8f76b0f307040852505f80d8ffe854376b1f7a3ddff0a741ed7503bfcd36baf69b8c958f425526632f1c2ae0a76b7aedb64a65a55e97d6e827db105b612eee91667b48b831fc596d0aef2e3305c8210f2b346db964752549239c3020685f96518b91f041e68f90b0459dd40190c009773e7e438b2cb6dd0a34aaae0db2e597efa8bb8845ae2374ea161b821193dbb377f17c36fa49c98f98d5f131fb2ddec88b1f3427f951268e226c5cf3c8dc5dbba08ea4cb3b13d23f81d8c3dda40c061e00c4bd31e16c374562682aab6caa650443c83eddb3a95f1e5e46f069b6c8c4ca558f33965101d9413f41aa522d2da1c4217e39184b0ee2d38ea78136a5323865902d3b3aeb0d9c81bd69aaa94ab6c8bd058c39463906a9bfd4fb5d2d7da95bb83b8305c595f063635fe2c72d7d1fae7a27bda68006845069e03186dc534a000ab9bd3249e8f3b51fd78124cabf0b45a674358397e1bc067f5495d499708e87b856ee32a0bfef95290176de9beac28888568fa4351719e8a46c6e6b793bbe6ea373531373b4393f302cd684575e9187e80766576e9e69d4de7bdb41fe602f8851102227a5700406f59b261a39f305a63d2e8f563235a1636987a6b730dc2ee8677c9b1730b2d4081e996024edabc83028ccd9c2e136a3235ae7c186c2ae3da3e23eaa2cf053ad54fcc524f1105209f261a3a2f1220e56d231c067631ac73cf59203d8899a99ce677c669bbcf37284e12e104f5cb70a30ecb5401de3f0332a83c90365cfff3b68ff835aae2e63362fe2c381946bf5f3a39350030b91528b70a41c1210d1a7614857cf5c201fc79a0afc8956c717c908c4d0d1fb628a2c45868a788a389affdf2705ca103b31a6b929665596feaf21f013d2d1585bdc8b2e6b290a51f8c3154d5f7f8adc1392a810b25f910ec7dda37831932c72dd3a85f001e33ac3de1e300c92661bb394c5c22a7e29890a6c4bcf732cc7de0a1d94e1cd611d282d809fa23f9b2c327fec4094c2f13ef7ef8e1bb3d500069b50371e1025eeeea5cfe9f3d625e58260f0ee0cc559b4ad615fb6f468ba4feea539f889bff602b04d004ec5c045a868bb154205e153707b9a9a976b26dc0de0f505bf22f677e12bf66ba393accda75396376cc077b27b6b5f374d6cf1ba6022c5e44eb83206cbadc8708a371ec267369392cd277b9017f8d419ef6dfd66c77f7cade52a62465270b5a0b820af38505a7575a2c961383c57672088611268c161484849bf9b2f2a1f79a5e6938389e04c70627f41e7a87c184d178783c0639f48e64be98807aa5b5662c9f71d2aa176798309a12256990cd171526bdb2b319cfac67f6036b9508c584d16aaaa0335f5cbc7a6563b19b184ea8c587be7b30616c50d00f72e8db355f4a1fb238388d04a76b424e8709637978b278325f483ebdb2ad96ccb68042295e98305689922a72e8696cbea07ce8e9925ed5d98ceacc98cc787228646ba8cb1272e8a992f932fad0d356af6a8cba5e39147e100d72e8a90c264c0d1ad2ab8a337bf5040749e661430ebd07264ce5a1a10fd2aafaa107325f3c59e813fa1ebdaaa1d73161aa12ea627feacc66a197d12b9ff16855f7a1d093adfabef29043a15828147a70f41c63c2d49a50e86bab268c075117fba10ffd0b104728270300f6f331300cb6c15af04fb6df3b88f0d6da94805b0bdc5aa1adb529c9f655c6d0cfb69ad00c9c8133fb220b082316148a8562602c28db77b1f29d341c1e50c309e168383cd97e0b93f7426b694a40ad056aad90d6d29464fb25954e9c6935a119389b6935d93ec905d72216148a8562602c28db4f295db7383c6e71423838f651485b8a6d2909b16d29c9f64728da5667b66636b335d97e38b2618dd5a01a8bd5580dcaf6456d086b2e379c8a537978445eadb8a441a3c9969252c4162b0969d676f659adc121ae35d9fb4220b0bf26ad3dc57c75654114c67322c6b28d05e59317d4a4fd2bf395377394130ae35d315dec5b99289365eb8639c37392ed7f1ed09c61dfe58ab0fef7b93e9798e3abf0cbc9b6334eabca30675bd22acbc3db3fb56a7b6bbbd166c7f11d0af3b9a88b7deb0139ca7e18e264dff180bcd55ac203479abfd1e736496f7eae154fc9dae7caf63f3088cfad7d9f00f294620eb3fa13a4b8560484fd34db0d35d2e81490fd7bc3d0064d582ec1c3dfbf5fc3eb9afaec6cc89f1b298f7d19403c8ce28f2d6493f63f960764bd7a40d9fa7f3bb883f4c09bd91365dad2d2e4c4319bce4a7bee20794292bba162e18d1feaa75ae57df7f5ef57f2d62f69e46a23d7f7ba7182f69fd46a8be5b86f7036c971a191d9a449a3b3a5deccb40a49d37890215eb946924bafc9de36ae6a535fed836b6fed7bf7de7befb655ee5ecff33ccfebf628adb7c3d5d5a4cfb8ca9ee1c64ed22e9f71244dd2e06e353900997fcf349256d1b48ad69badc93f11badb391d0c429041106e62704a021639f49a66610db2e91406f0d3730d9ed7d224fd80379a2b8f36d681cab3c9f99ed7894b32cf509d334224842d74e2168d76c85f860e540d997414c9b4a953118625d9ffc35c69109fbd5ecd2220f4a7f93b089476bb3f09bc39d2f95eb77bad96be678acb2293bafb12fe844e9e52c8b3c913acecb95011d29f266fa6f89910f6c7b2e323aa8b17a84f6e4c7da8cfc6528237bf092ea01a714a67baf7ee7d7bef4948df7ff3cd37df7cdbb8fb694f3713f8fede9bc0deb86dbbdb568ad947b276f6b927656cbe7d0585f0efdebbf7ce1defc0640feb36665ab61f2c6e9e84b3c9da39ee0d43519be068da504168df450e614966cd147afaf74d21bc83fcde7bd257f75eac914db637b7514b935c49923252f3e5134281f27b5ff620443716ae4c65fae97fe3cc9308cd1f9661f2be7f9a3cfa14cf1e63bf8d9970b280861257004971852c4f29ae88e5f95c9e525cc1244f29ae58924b724a714512a4b8e225d2d041b7d48aad103815d736fb9a28924da664589cdab00c5246ca29ca6ee4b885f07bf8dfbbed44f1846c495243417fab4ce28885db9b56f10d5aebe7ddf0958adff01505c5f7953851fe58c4c92de6aff46bed6c7dd0e2795f775f9e25a9d6af51dfcc5aa62c6008bdef2a188487a11d0cc28aac08ef6fdfdff72c5708b5bfe00e1fd615ee20a249fa751d6cccacc0639c30e9d81c832bf8c1097096248141cc14b8277936614213b97e3dca09e3d1046726dba74c5ae5d9c67c5d874d3b6aee3e889abbf97232cd3a49f3a5c5cfb760105f76172c84b3491a4dd64fb5e44abf9248cc171ac58f60aea81528cabea561985191edd442b6b039c3be0c1484dae338027e37d155366bc396f48e4eb64f9df46a5218908d2c49778dd8476850b665d8b126eb5b1c582b2c43d82a878736b2a5e123a36cc9560937497865afbf3a5fc23ca963249ab4df92cb39ab1167a1290cbd930fdd91d1a0564d2bb84007e749b65f0b996de8a94a7a4371ecd32596e2e4f0559146d93f729184d606891b25b26d91edb398212ce96b4f61968479ca51284c087f1da1ef4a9acb1fdcfb7b3fbc0f62e6f0bd0986df8d6179c308cafb3844cbdf7be38fd17f193e0a9e4258b2c8228bfca37bef7dfc11e2215af65ee47963c97df7c37bee272884877f74f84737ceeccdafc9a64e32fd8b04ae766774066fb6949b2bb76fda7bedd55a0b0ac1c13d1034db6f9ffe6995f7f35bd62a7a39b1ec9df14ef283f59732bed35cf58da3c63ac9cffbf92191bba70f7e1fee3a5ceb13cbc261eb13cb6ab27bd8824ddea9b399907e596fbabba508ba7dd4ea70200802153b5e8001164153f0c1c523061eec24c17505114037746e831d843a36484871c27603288298cc1c79a20a52004dc1862564564441064b204181820a278857d802c0832e28e141122cacc023680b6128c318aa8081cd0e783a9d1d58d1a22ae10227408315343f8082149630b284119830062098810b3d4b9002138ef040095e8409c8010b3fb059011390e4800a2870420b8c20861c48a1c4153355070859705e038e2e21093de5d964092c31247b42817c2e908c94afb839377ec8c1e3365102154ac8610203bd57188c20872ec8400b41541421073a504204275e00434cff9c2237143f557034d74b020e6a1294c8fd77873c9b2881437e916713253d1b8dd72f8488ffe4c9730a09401ee2ef1f84900ade6cd9b6de36179d39c39f858910b481030adad1cb46cc17dac2c05c51921c47159511c7610ab3df12c2fe98f94224cc96c2d8d5f7fe0a982fdabb7723c76b4e0ee78d33c6085f51ead32dff3967987a7446788c4c9d3eed183b12b93175ccde7b8c878b9820a6c3178b27f9207c4fc4711de5bec3dd734dc106cc986dbcedd6bf6e646122f43c8f1872f3fdd93d872dcd114342cfa5e44c3dfc8dc49820c6f33a76cc1d89dcbcd9ead6431bd6622c5ec2e4c363ea7b4cc5454c10e3783a6a3341b73bf1daf3812424697f6f188a622aa56197c182b024dd3c7be420a4bfd12d541af141440f915267e2cd9612c595b9f766afea7b8d26b994a3b8e75e636122dc7a686dc6597e6404e32e8b7b5292d03af7ce7dcfbd2369154dabee73ef35adea9e7be73eb46d8ff2a16ddb6e4884a3b80f8d282311dc880b39118e652e89fa299f843fe9a967bf0b6e279828eee7869d356770a14f22e5eb27414af9fa3e52be62d316c23e48effd2d9ea33a99c3454a587414e78413df97b013dd9722dd6992fbefb7d1e6067750264d7e9bcca35f098a21f8b48faf9c3551dcdfeb93396d9c63bde3ddb6df6e77051084108956d9e7befb2fcf14af3fd2e82e47719f32be32e7377306f7dde86567f90a0947717f6f188ae23f49bee60cee3d7b479ae47ca649ee3becac39cbdc3b2b7328ae0f0d5ab33031b91e264afb1a597b1a5bb8f7bfdfee5faef3ee36a6c4c9e1d49ca1556cba8f4d172fd19fef7f59bbdadfe85b23b5041112cd6b4f5aa7bbadd552ed0db47675bfb5da161db4b3ebac3d2b13d79dce5a37f7a9b9db396b7577f7e9eedbc537aab5d6e25abfd6eaeef334ebd3ead6dddd45315a6bb6da4b36c04a95bbac3dcbee32b7552df738bbbb695c68061b19eaf5bccd66eb8544d556ebb55a6b3532588d0c3d4cb2fa90eb8eec63fdcf7ad6dace5a8d0c5623039d24d75181b657ab6ddc56bd7a7dfb3ed08a3ecfb5480d3f1087f6a3ef46df14c5e54da568d4005355fbf9696110cf7d04e2d050b6af1e869a63d14fe56a35a11273456f7c7c598190ab133509437c59978c71982b1aebf1653d41ae2da83210e2cbdadaa698ab66f1f8d2bf909d0cae061d5f7ad08a11e6aa5f39be7426647fc2a3c0f1a5effcaa777ef8d26b905d090742fed29b5039c35cf5ecc6977d45ee38f8090ef0a5cf9ca0982b77d9f8b2b1907b8afe8201beec9fd2b7c36ab4119a093e7cd939221de6ca815a05b91b065d831ebeec24a3554d7d49c3e0f2253d03bd22cf204dca43b140a190f1257d42eea74988f125bda142e0e14bda03f24b8a03306ca12a987480f1e57c43eef7408b7286e1054bbf0eeefb3e406e1f72cfc8dd2ab93bc6f5e18006dc0c71d343c65f081ae3b163012c1dac1c4100f1c2f1fa4101313b3bf786a278809ed980797119c0756f288a3ec0681480003d3850ca6500ad19ad7bc3501459c83014c51855c68277c0657861e0f2b2e0f2bec0a616382e70c922a2e0524c0989b4196d8625971d8ee7f2a2e0e17837deabc36111434dc365b5c9e34a47d315a17b75aeae35b25ed6b1a063cd8046eff9b1f3cad8d953c901436c078673e25a4bb87971ae959ad3d85965ecec9580b81870331c6b06245e98197c623b2acda47369ecec8dae2b0a3837af1769766f7069eecc65958e64da793476f6c01d36c87c623ee1ab0a39383723ba241c3b831b6be3c146d3ca34860590cc079c419976b6374d603938dc971d4ec7842eb68414ae285add13d95dde10f69732e8673b76aeb8dacc15d5400630d05f5d29231a7f7f65cd158d5de0cb3a63812f2b4d05fabf6914d13bf4cc55b328f0a5ff4ce04b7722815ef9ae4144c3c099ab7e45e04bcf81c0970e7b409fbe6df86896eff79ab9ea1d077ce9491af0a5db0cd12adf377af40ba0b9ea99cc973d63c097ce12a2c5ef1f78b489c95cb96bc797cdb3802fbb474797be73e4f8b2aba0335f5abce6ca61417cd937407cd938389af4cde38776f1fd7d64ae1c48015f3692982fbb26f7e8bbc78d46a9ad047c496508f892021da0c36f1f367ac95cd51c982fa9cecb979489011afc2682ba788d2fe912e64be8fb696baeaa6cf52575a9bea42f1ffa7b1a5dc490b9b2348ef2efe1cbf984000548f57b60c21821fafe20ade2be1fc87ce95cbe9cb2017c397d66cc9595f1a58e09b301eae28ffa72ea04e04b1b02903157d6c779b4ea7e7f8ef9e27d3fc9436e1ebe7c00f45b0eb4cc178d4e1820d4c5bfb7ef17411c7de32bcfa5019c017a83811485a14d1891f20be0f2ba0570057029fad3a030f455048dec1d0d055813604900d7a030d486881a999345e00581d703b00d0a435d3e6cecf88acb71c0cece10b81469921eb8ec9ef98abb32b8bc0cc042e059f6ff81c2d01675f1e7a193fd02ed702dc0a5c33f0785a1353970d9f9c282c0e5050286c39f0785a1343fe0b2afcb51fe0ac0310e94fd7b50188ae4062e3b6f334725a08580d601b00f0a4367a88bbf8d9ae3ab6de7087591f96a7b154161288bbaf8c3e4e41820a7062eef0a975785cbd0072ca3819d65048529a2c51c456190a02efe05a021004d0f38e5824b312cc31958062edbfaf84abbe1008519425dfcb5192014268800b04f00ac0f0a972289cbe601972200700c8ccbf63c97f5f15c2e97f569621cc7711cc71e4da00c1ec796c7df827149f388c771a4791cc7f7b73ee3388ee397560ca618df12a305979549a6afd70effffff3f8ee38fe3bf0065c6ff1d7efc1dc6ffffffdf61a4f9ffffffdfd4f263cb88cbfada61ec8c3b1a9b8ea6a3e9686c60acacacacacacacfcffffafa88032bfb232fefff82b2bbfb2b2b29257565656565656564ce3fff8b8ac47642e994ce662399d4ea7d3e9b4b2b2f22b2b27119459399dfe57fe574ea73f9d4e279691e6d3e9743a9d4e27d3ffcaafe0d27d58c6ce30b89c245c0e97c3e52479a1a2a2a2a2a2a2723a9dfe74527101ca9c545456fef42b271595575151517931d2aca2a2a2a2a2a2a2625af9d3ca0997be846bb5b816d7e25a2d93288aa2288a2a2a2aafa222b600655444f1f42a7f52c125cd221645d134d22c8aa2288aa2683abdca490597decab4f38b0b5473812ed005aa69512a954aa552491445b1540265c45249e5c557114ba52f954aa552a9542a954a2593ca8b2a222e3b28c36860301a172412894422914aa5d2974a241228532291c42fbd58c22412c9c548338944229148249249fc9258c265efb8183bb7b82e24d7755dd7850465341a8d46a31189447a12699402ca9046a3d293be441a8d7e341a8d50469a47a3d168341a8d4ca5279548b8ec266633b3d96c26250cc3300cc3d168340a5140995118927ef4a41ce2300c439ac3300cc3300c4da41f9146b8ec9994b133cace919d9d9d100882200882611886e04f991004471ffe28c4200882a19166100441100441d3e8c351884bfa935fbebdb6d7f6a22cd1f77ddff77d20083e087e2128037e5ff8e087f8fb3ed148f3f77ddff77d9f297c300471e7d0d8d9db584536d6c6da584f3a8ee3388ee3beeffbefe344a0ccc771e07f0f7eb8a41cc7711cc7711cc799c0ffc00f9734490c89582c36f3eebdf7decb71dc73dc0d8132dcbddf73ffdd7b69bef7de7bef357dcf7d5ceec6ce9e7633e4e6e62648abb5d65aebbdf7561094b9b55e5cd25a6badb5d65aab89fbcb61203acff8aac3f12014c6738961a8cd6477f566adb5d6da5aabfd40996aedfdfad7da0ec73a8e35d58a81e89c9a333a9b3e9c5387f3793ed852351ac673f56ade565ddadd63a0b9bf41991fdd3e9d13b2bf4b50d8dfe1b87c273b6cf341765a1396643e7d2219bab27b2e4759bbdd1a618e08eb0e270653da4c1d66266092f43d97af1430513b4e64a7749cd9daa809cb8af36180d22468b881822b87b9dfbf26ff5329519c3d76440df366cb9761adde52d0c9f4e2eb36086910f57e74cbb487bad4a72e3da109889be76f99e2fba3312967319659b487c28cd3a57eadb4e7668bdf0528f4a7ac7bdb8ae45fcd2769b793fd2abab0b6a652ddeeb3b5c19b2de5b793697bb5da76b9cefbc090a8e6e49abd114a0aa9d4c285a8f2c2745a81c1d2ffd91bbfeaad7940b87b30d4aaf0e77fdf7b2bd4b798e4d9e271c77194f59df99ee3f050982f47c653bd70fc5a4f66417386fd6ef480e68c8ff586e9f2e57c34587c391b6c83b50a7cfb1b935e0520c6961d67835117fb381b4c347eadafc69b79414f7a8321c9f68fb8ac90edbb541196d703e256e4dbf7c80ff5a1401da8ecfd48dabe4e1c49e1e73af568ce007138675c21bbb2ebe402b5aabf1a21c9e5abb006d1197cd4f8d57c344d7e2ea0fe5c2d916887178900208af1220f0683c1442d2ff26432117e91f77abd5e229617793a3aa2f145deec991991e85fe4d9d88860bca893c9643291e945de11d1ca8b3a180c06139d5ed4fdfc885ebca87bbd5e2f918b17753a3a22951775332291a89b11892fea6c6c442d5ec4c9643299a8f4a2ee884824e260301107137130d1f722eee74794f222eef57abd44282fe274a88bd511d11771332291889b116d2f127136a20b83c1603fa2fb23f2177d90568d5ef440e64bf87abd442f47591dd1d51189ee8ce867cf885e46afee0c8f56712ffa1cf3a5bec846f43291e8bb6b23fadbab4de628fba2afad9a30f70875b12f123d0ac421da61eb005063885a6032d80e30982cdb277188c57be9782f16efe5bd74b27d1e46f0bd19cfc69b61f166bc19cf26db07008ccf24f38ec84c32997724db8fb1e29d603f30130cf693edb7bce85c742f9deee5a27b75dd4b27dbdf418513bb99ce46ec66ba6ec626dbc72d6e89937547443299ccfe48da72b9e17030ee470c31ec27dbff140d857b713a1ff77a712f4e27db67a16e082d37c3d988dc0c3723e26c3616b733e786c37e603087897e608422112e69644be3be74eeebbeeecbaf0eb752676ceecc7667ee8c5f9b6c3f0c9d4e9bec1ed9649bac6eb27bc4d45b678d7b4b8624ea138091fed4cfab4daf3618ac099892185fd62539f435f4558909b3fdb47c597990435f93cc971d3ef495d5ab6dab335ba509e1384c984d899239cce6cbd8d32b6d36fb99399905c55af5534c98ad66abe9024fe2f8250913bf6cd8884b327ff8bd939020e26ba0ccb7e37bffdebf951596b1777862304677d9348a6ea0cefea0dc3f9fe4fe236816ebe8dfcacda711877f8fcd647c31364f93dbab6c2f8edd33b64f93dbb718fba73436696c274d36509341e1d8a3b3661c89d3788db79ac4db7fa3bf1a46e9914622805ac1904b9a6b8769adb7de1009e1f6b4bb76d326ea2763bb2d9da1a169b91ad60d9b2ff65547da441413860a61ba5c61bed0ed2975010a4b1a4dfabd1e6d02c72f55f27298b8535d8242fa12c29c3142de2813f2f6d67e2e3ada6694541087a98238aa146cb60dc461ba17c471b18cc664935b53da04bda146982fdd6fef8d3d9aa44fc1c6531b891de4f6b6bdc7090992ffe22973dfeeb8b85a87d1a446af42476d7fb76dabd1e48d7fe9260c58ed84995de8bd10e779de8f34df50a8fbeb99aee3b0566deee4dbbc276fce93376792b7f716f92f8a61b8fdf4421863fccdbceec31da8a3c3443cf0a3d6c6beb4258ddaac92b64b341e9d0e972d9649de6aab3c2235732f449439efd65b6fa5613dcff37c3e16de1a4e73fb0c31fa0c7d863e439f8186f53e5026e479a20fbdc8f33c513b216b1cc976b77bc330fcbe90e3e805653c0edcbabfd1e1bd6178b5effd561bd6e84f400db4e00eefde7beffd3b6bbd9e4884e228a00e54ae364dd6d1b9ae7bad1f7cff06bfbbaeebe7fcef2deff7fdfeea3d0882cf7d1329d4e400e4d9e40959a6c9de4c0f5f1d43af8df5bde98dda7b4e914fe90541efdadede4ed3437bf2f6e25cd19e89dab8efeebf136666cf4750a6dd9d47939c880b7d73df1806a8238489d02cc2a5e8c1f75f0165fc394cc4071f401da86c6d9adcdec58ab0973499d3e446bfbb57ab45c7d6c19cb17d8f8d83e9b2bd1ddba677405db6e7c65662ce4852abd72ca00e8a7ba7eb6aadee5e6badeeddd8759dbbbb7b07c343a3fd6e89869322756cb0c26e0383b8b8ec1ec40ebe13a9d95f88c89b4d595fbfe7f33156afbac7dc2ab99b861e9469dce07fdd9a13b6c79942ce15603b34a6699aa6699aa6699aa66942a8e630c7cda4ecbe776ec87f510cc3d68db7d7301097225cd27e6ffb42a37d8f35e953be1b8550229748e8c3994099ee3bd62aaec7e705b8a3fb7eff31fa21ddba61280a814f1a7d0e73c6f629a3c761ba6c8f328ec67bc3feae031be6e2fbf66e756bce70cf7eb557dd72d4f6aeef8593b79c144c16b50ef40a0a345f3a200a4481b6efaef3ee09940171c544babfa00eefbb1fb7c9ed271884877f7c0dabb56dba3a6f283e592baceed4582d004d92b7ef9aa4c96d4e5c009f791c5c0efea4b2e8585b354975adea9146d5542479bbd3ddfd3f779abcfdf635dcb3fffd663869f8bbdfef534019bfeefd7dcfdd03effb97da3bf885a00e0d13a1d9c3d7876fcbdc38b34b16e1f6de6a95e3112873bf5b3beec5d93c6f746143389b33360a33f356b7b79bb7fab6dcfd0443debe9491a7861323cf39e7dbb9d270266afbf99a13e6ca67d53586af42dcc215a640a7531feb30639388f9f22a2aa3d1fd39a389d4dc2f4494fbbb9fa18bef8c34b3d5ea4a35d95ad6b49c25383a3fa99ebc7d4932d9bed6da73bb36add5feb5b5b60d56d8df93bb2febec6d6cbe68797bdbd3abd91aab554fc420eb246f77fb596a47f2866d2cac11b524799b4c36ad8912fc8eeb405cf6eff075a3e64493693f4dfa349933676ccf8dda139a14a88b4e93dbdb518335b9390662d2a8edb5d96585331bcdd6d278f2f6230844673acce6cb96b7b7af56f56f5f9fcc17cfe2157da5e1543a61ea8cba6cff7df7446af65e88287b366cfc2c53d94693f4fe04ad2bb623c2eea77afb5b815ac495b054a5c8db9760be6fe7aa4a3165b4eafbaff3450365381a7aee4378668e070dfd1d2bcffc20d149f893b7b2f6e4edeb6cc6fd27ea16a883c344680e61f05f73c6f6e0589b68727b0dc757f5c651330a5385305db6df60a2b80d61ced8beecedc787db05e600d2dddddddddd16c4d163b764bc6f4c84e60e7c2fc688a3ff8e1a8eb624c751dbbf2886f45df3c9db77eb037558ba83b664ced8be8e1a4e1d42ed9f7a103fba07bf5d497a6cb592541b577d912d7f1249612a07b603802f060844e31f20ee9d26b76f264d6edf35ec8e65cd6dbaffe123aa3f61b283ccf72f6ef2eeb4ca674dfa7749e149fced7de6ab54a3fa6be4ce0961e2ce6feff9f079e36873370aa1f9de1b86a258fea6e1e4dce192dc9eaba08e8bb7fb35dfcd35040cfefd069edadd3da157aba7b5cd5cf9c865167a57bb87ce58deaa150890ef29687bbe941d865c3f040ae1ce715846936d49df9dab8e4d54fdd93eb117367c40bfec98ab5fdef41fcf11eb1096f547ff109ab95ae336ad2a6b4eb6f548ab7ed0caaa3315c97c01bf7e85c17c097d0d85fe1b4b51083b2804fd92be03813ae873df3de3460ff25612a0961cc2d25bf357e1d7f7e6e8e1e83a8dea9873eddfb3bca8425bdc77a66010be44f8fda4555fab6c886353a443f86308cdd57faa0d148465a511b310ce2650c8c93fdfabaccf912741f5bdedeb0175a0b21f69b21e51a94e932dfed364f59c39a3aa9c202c2b2b0fa1ad5cdf93b4aaba5a65335f80305fbeafdff7762c41fce14a9347dc579a26eb8f401df4c7ea0287b0741acfa93447d45c768cacaf32519faf2dff6995ac913051f59d70a790eb5f21d7df424fcc8f7cd9313168f6cfd7ae56d9d0c97dcd1cad25c96b2a858d5487e6f48dd76751a9356bb5e7c907894efa27d799db6041e83aad2ab5afef4fcc17eeab7f0b11650b0a418d08a71441b3dcef8ea7c9bfac3d9adc6bc1bad2596d6bcea8475ad561194dd2faf78a55ebaf9ae790a42683341936598fa8f966b166caa2210ad1ef983e0f1efdc3a4c3dfbeffcc3c3016a186cba9d3fdd4f5f5d7882d97846b93bd0224b42fa2fd6bdfe2854808a715eb287cfadcff0fe35cf57094f63203f490b512953558902176ac130351520be6f81bdefd0d0f32a487d5acb68db57e87bbd6266bed6a576badb5667bb711a9c9ee67932778723977441fdf8db57b4debbacf1ac7dd9f2087494d6a7fa39bd41e01617d8a63c341b44b83960a0631f3f65fe9e5592910f40335f20ffa8e4bdab8cc91fbe958d6d0c2fb76a2e8773f27cacf398a31e78abe88461ee7d53ebfd1dea38ca3b10c4563682c79c81d3e828238c49fc32291a222b427982f47da6a3d96a9ac1181d3c387f526776fb5dbbd37ade2d1a4df1b86a22dc91293b034714fbf4d1c994bcacad1f2ad182b9996c0b9a22c47d5fbcd17203532fd704cc52024894d5a3b522573345d0c44a5375489833c8ce4bf6337daf041c8bd89728d77e01c4dda6f795b5ed27f0f5fb5c0a57b49f8a331bb6b93da1cfd3d9ff9665a471f0a8843d3344dd3b4da54738d7ecd137fb5f5ebe3d8b0687f82731bf5cf26394ebec74edfdafd4e73423d5262abb5d65a6b6badd65a6badb5d5dab7d6566b2d17426bdf5a6bad2543cf10c1caf58bf091e6cfede3cc74cc6992c393eb57b2be8cda5e97294aa62f32e9a8fa9492755423d799e33245587fbe8c56d1da63beccd9d4ab8f61273b2853eb04a235defc58d91fff38feffafacfce9f42a2a2f8a5f2a3d89f4a3d187e183e07fdf73dcdffbb5beb54f5bdc492acaa1c167e7c3c9a84baf3c1727a3301d0d75f117c530a4e1649e13deab9b818b3a673783ec2e5a6952ae8e86c2cc8e866eb9f4ea098aec5d8ea6f2f6daf2ce2830c96587d3aad273792e1b6f12059decdf2d89293b1dcf15ac6f23b3c93295aa5183c2a1cb306fdce4ba67dded04c8e3e604716ccfed98cf4d6c7f6c41f87e6fe87d93d01d34a4668bafc5d569a2a091b7fa7d5f9e322d5b3295914a8de048fa6aa641c31ad19ac2c12bc9bcd1ae0597e3b8fdfc0f90f9c77cfad6bf4d508dd8a659d8dee724732a7f0d5326ed5bbc9118d268d252de07e9535efb94946f818bb8f8942fd2c21b8d26edc5371283329a346c1a02e54bef03e54baf7d09177142c33e462fe2222e7ef4455a3cca1b89d9b0f82a5f8aef2b17afbdca288ea5713a0a74149054ce71a3156e3fdc6817a3496b319a347c848f16efa2f42e709122d3df484c10ff19238af8635cbc7f0b6ceae1e24d22dc8019e3024f47d198166f82008d69f134a6054e39caefcdd6bfb417c77def6a57dbec6b18486a4789892998c82494981badba392c5e22c4a9ce08d817053e270a0a61798f387104cd42bc0eac6ce7f788e778f1c602c24d3bc2ec3f962660e52137fbcfb1aca511d9ebe658d9b7d0ca04c8b389143fb90a4f76b201f2acc2139feccd1a61e86986b5aab17fd95fb9ed3e103473b6f31e089a5f36a73d2336807be7cef8eac662a9588d982bb6f9f8eadedc9bcde7de6c3ef766f3b93775c7573716faa41ce57f71c29c14ecde3014c57f924ca52850a571b1025d9f85ac99eca22c741f7a7333bb01f2771a5fd10beb9d0b5472a0f40dd4aaee9f2749b26b343c4fc865f7640f595ab0412e5bc66393cb9e39cb0a4972e93e93bdd4a13134cefc35292a117e393a4dfeb48fbb90ee6932140a8d424261e9e9d83c63c7402a1ac3b1bcb9848fa8791b85a1d1247ad297de0b471310348726380a47d308572a72f542f68484638de5098eb50b3a445f7ad2687aaf4752a7d0bf39e56f4e5b9df903e54bd18e10ff187df8255c7e2f7a2f34c110e9897826e1d2fb144cc4b387d23ff2680c127ad38ef047e87510a3534c72639bb0481ae55f7393d8d0490f5fd5da44a3fc6baaa66c8ae7f6fcec28b94b8074b27f45e24e7ac757cea451fe366292b0a61e119f8441373cb727fbeffc64ffe6e9f1e91f77248d6a9dd7129792266cc424618d1f119fdcb80e15420bb339bd44586e3e3e2954e4f1a601c2ba22bd51f8379a74f1222e5359bc69f128a75f791fa75f59f913ca89e54fe510944789d5bea95ef53cee2b77d32a25bd0a592c16abd2d880c2509f13a5f47f3c8d736a200eda4af91b4d815a559f06f5ea49774db7beefbe1fe9cc0f944f79af9553fec5d8208e17efd1d27ba5d20731730997febe911c24a37c97c6927eca7bfdf5687a12ca98c44da6436c36e16a03ea92f237fcc54895349992829738ad8cd351a113065340157c03821fc4574638aab6f8f2e2f296c42b523c5d1c47efe26fb411be225be0f266118cbfd125cd28df98e5c7510a2e6b4679d2f758d21c56a6a91a3367c2e6ce8ccd80643edd7d7a1c9bb099c3f223ee11641ce744fd384ba552a94b7f7d75fa122e6fe47e4c29e94946f1c9a36fd1a3c8b810cf28584802b2c8228bd188321afb2788d296892998f0e9e1a8faa71ab912b14c4cc1041872e31fa20fdfa3dfcde1580eb14bc038fdca09cf1e34e626ccdf58fe7844ad47caae41cd42521beb6d14fddb52c54699418bc9ab5fccb3c91550902a1faca1598af3bb07a2c35b7981a4de6bbf02dde8904c91c8b448a63f51525e03974694e452b7f7a0271aa90d7df59dde895dbe3787a5983b3084a92b280c8012a11129b851f00def1e08f7e1b06d8f8fe57d3bcef9621a62f4a19f40f8a29f74340a471f7a15842ffabed13444ca871e02a517bde7df379a4c43a47ce87d945ef4331bc90efe0704cd20ca87de478b17a17ce855d0e2456f249b8640f99487000a36818f62fa20d0029b409487c0e85170124ef840f9f09348f9d14320fc16df022781f2e1cf9812367dd834c4e849ef63f4a40ffb08513efc145cc4091f298ff2459c289740f906cc98244c8059288f824d9044f8a49fedc3f6298ff2fd36789082a7a35070cc084f2fdf519e67047dedbb2c53357239a466eecbd48f244368f6bf3fb4b7bf8d94654499fadaae817ea17b665a4042ee1e2b769cb615eeeeee54eb21b9bbbb3b6d2bb0bbbb3bed9ed475d1dddde9bbd3ee717777a7ed85ea4ebb2998e0426e1f2bdcdd9dbeb715d7dddddd69f7b8bb7b5be1ee4edfdd69fd42dbd7ba6a7508adeeeeeeb4ab204577dac4dddd9d768fbbbb3bed1ea7ee9436a5eeeeeeb4fbebb883f6fb17a80ff5c9f4bd40772a1c68e005ba6369aa608623997e4fcb9cbcc008b29e2ea7cbd182df741194d020d3efb1319ad1f9810d2aae6b37d4b52304eda6a792fc89b0e41018c1824cc91c98c87a80e0a659078c18b040075321c3850f828a20a376cc93a209ad19abf10405329f10f94401055e8859210b42ac47c63959e208b29eeb3db58ab714a8fa40062da040b21b1ba440d6736a896206400072828592e0b401d6739d0a20345262591803101a54ecf80a90e060a7876a3a42168bd585ed6e5400f9a660628a217c5588019882092e885aa851b1f395010939983bf68642e18928d89b1e20a40a933228216ba0d84441831a40521548eaea784b8525d1af5de866751562ab86d49953ab983a22164c410c53a78754001c303103898a214ebd8a0e6a9f2656d0413d48b058ac13e4eaa914844f6a202dd9df3beb38e15cf193e9d711488b6907c54368f692664a05a5dd943e118f8a26a5ee7fc4d7aa966e80375b4aeaca1ad56834a9857386f63593af91c20dcc19da1b5187f0b9a734fe3f7a827460c214415de6cb7ded4331bcf145a4c44eb1226b37b45f394ef3384ebbf6692eafeb8afa5edfdd2ff76e6f9aa41d6b92a272e8cb318f42a3b7363abb5d3845ed5b294c8418723fa7b770cb70df88c249a36e4411d4e4f479ab4e75cd19acb0ac403fb81f427d1a7c5a7acb9f5c55fdf169552773325fa61ae68be6bde6e192d61d0e1462763ba00efffa1cf71e37d658e5f1993f69d48e1c5cfe2bb0baaa4da3bcb5d51d9e56555cb9f9b23dfdda83ee595e5471aee277f07d49abba1c10b7bcf5a3ce9aa4414dba7021f49fb9ac409952a0994d775daeb324534fd224d569f2884a6d9aa45e759aa4d53567d01fdb0fa1331f8e558f5415cc97aef372e29266a02669e867aea57f05d2e1cf0535497fc3d5058bb024ddd4eaaa40ad32b9b7825ae5ae990eacba7cd56e9828fa3d879b027f81e834c894be2769b94ea6ee2d57e24d509f9f0fc4e17573fa7d439f1b298cead06da42d201691b6209c656af2af268e7bcedf959369385f66bef7de7b695cbf5faf11739b2eba8cdfebdd741fcb8985cf2c326541a65404134531c9ba6d6a8398327deedd4b9a7d4ee77e7beeb79f4dded8e67393db30299c33e66fa055261d37db07b265229e4b9a6d114670806691dbbec7c9a0b3a733da6a929a3abc83ccdd77982669f204f38542d1ac6ff4d1e49c307d435de86b4f5b3af3a5fb7bc390f416a5d45bd4fbef8649fd108744e670777fa3c13105e0173112037e1d4b23144688e9c23d6dc2c3c84d2e81cc9dfc8388e7254800feccde03e4c60d83a38f650958d9ff8673e3f613ecbf63f919ec862293ac4f2b44012bc2ba91af5bbe70a7f57eafc7b2fbe65aa7f55ea07cc23aa9cbfd8a29ab7af77661586b2d31094beded6fb824bddaa6d5e2796395f8f7febd57eff4f3fdbae95fbcca8ba7ec4f9231fa50f421f0cb09c3dc7b676303bdbabddae84637fad3f454e5e9935cb4f8d2d36f2165a45a350a5ff4a1a77fa355e0d3ff21078feed12afbf47d10d12bfc1fd540194ac2f89587b1c2a3c92356de5f7d2f4b1d6168a3f5c6fbe0e87d68045f341ac3474179d298f2a591f42dc6d2bb185746212660e57e1f85f4ebde7063f917a3e955c6172f8e2a7f1a69c6e3112760fc0a3e06ff0b944f489f36d1ade25ea797f45572fa9206fd97f40d7983396afb166101a87ca8144c180b8be029a21900000441006315000030101007442291682c0e34518e0f14000d829a4e6e629d099428c6614619621032600000000000008090c4910040d5325db31821256c9bc0c212f6d734bc1426cb686ec3c398e0e67b070b87956890058686b9cbac8a33c2d6d703116d41e57f5f5da201f25eec1276888067266476edb21f5a870ccb6e3168c79b3a361317ed071453a31151c6b4eebc6bb8fa7f8148edaf6c9a76ed8f01c691845986c3653d21f95c780bee5b2c39f2f8fb58505e59b1f9e2e560e8ad23f1d17c17888b8375e193ebdcf7de3607fac9d47cb573344cb6c039840b4f93fbf71ae3dede87af40f410b732444f0fccc183014c8bc8cf15da442753082e7a0837d5a3b19311e13c019bbaccc5a823d27e5a154ff7b3065b05cabba6190135c7b1c6f5c1fd200a347528092dce211ac5a932db5fdbec3694b7c9745230e7239ebffded8d6bf7d24fda0808b6db6855a117c44aefa98da10f7327b87f622090298656079f0b777edf9a274b883ea8821a65344eb06ce5f1870f627756855686d3adbc6a5ecb6ece22580765597cd6d4a18b1a2c4a111785f766635124bd735b2936428eddbade1056da6e6cb4d7943d63f4cac94b5850ae36921174f27df2edf574d47af5936ab074ab689de91f640ef991edffd35975e298a9adfa103a2bcea98f48c136888a681db396115db70097832f106b4bf706f5fc3c85829950e20f107ec0a2e50536d1c34ace53895b46ee9d30013d8a33df4a784d5614f5353ef4de7e503c44bd9bf726553b332ba8b3223080fd9bda9ac5eb9d038f39a9cd3cf3a1811b9b10f67607f012c43eb1edc6c055515fb56ebf26086aaee62d0bd90f3530583a458b233798c276ad65f3e53cfd741e1579ad82ecaba11b5d9a7abe71ecfb95f45bc782451808015e458089b952bf6a07ccbd2c7b6abe8e7b33fa57287a730fa50d0f58549668c1782a35ae53ba8f2407db6372f41e771a9c46cfcfc1d4c8a77403b1718d35ada1c058918a335501f13ea03cf121e9762577e8a6bf9c8546a26b3bf765288f6c26f9cbde9a07e149c4c494aabf52f29007500c70fe72b4922a9e55edb853bd5cd73b4da6b3100f719810356f1cd7f0f43782b5317db005cb6f0bdf7d907b35f6fa4ddc2ca79596b180513a691595bae44f3c2099cec9bc05d83904506d526fcf5dcbb3ae1e8c21db09e16515df2808589eb6dadd282a0c76863956ac81cff89c078693be9e3cfab53425548339ade7c8e7d6df95a385e1059d690c62fa1d5ff54ac5d41de00feec181818bd49fc626929240c42bc685d835fc5846a03283302fda2cb9828bc16c51c436dc76e82e2d32ce7873bcfceadd34a476d58772e45315c428704131802f7988a7ba07ca6e4aacfd9e6f80c3528a0c619d9cd2ac15b840813960bc17c7a103f6af642542283c793cf340bc32dd37f402c6950e9bc468f2b9b818defb58c5cdc04ab4b58e455218ea9f82e1b2601029bc08c1d1b45ac07fb75c00f69fc3c4550d49140560651be187de9d97aa778414d8ee3ce1edf0462a95872ecd910a60834815ae4f742f89fd5669803343e33a918098ce086047c1e0d83ee201365c589fe8fa8c0716733afb32ae4baedde2736e635c205ba96a4dd4486e99b2050b8513b49c2415f70fc44fd209b94a94d4608ede00f2eafe88864d6cc37ee22e7343772d828762b979a40e12f79b7406a077a14cc11421d52f2c0130a1e9d88219d9e066455eae88dcb4d3c4e196e7781b39ae6ee1ad145b38ea828836bde6226a13c275169c5942ddbd4ff765d156743a36ed6b45f6ff287eae9f59fb29bd482d9631785ff49cd8629d23fb4f5f0f69a7225047ade4a5dc3a85dd91eb125ca581f87ec02e82729dee7d6c8f79c37cd8fde2300a29cc204a59f5e916d0354f9cd1c8cd133cb2ff3ba76c748b34afb8a0a3333810425f1c6df7f5779298d3d1ff7891563e4f2cf6a43574ac68fe454a36bd5603494422f7868c98e17b99e3f438bc45489258e5f65726f637cb5581cca644bc4508e324de0cf19140a431c209a2056e90e9f750c3b15682e54ac83c308e45922b6759746f094801da41c0fd136ee239b824c50caa248fe0e1828766014bdc084c1475090feeab881d7ba30232cf8ff8a9453c8b3304a3781e7194f424b3e0f5466965a1ed2b674cabc5a03843f8dd081a96b3c3183202802b01ed1de0fc48a1b061b81b6c132c2521a265608e2ede19b73cc2ca5dc2f61e37602d695ff844a0e229ba86b447397e883b2f1997b7464705227b0f2cda5ff957d965c68a5df69b65679aabb18db9ff9c89b4cc1a986336503aeedb41da4965377e1116ada8a4d0c3e7d6fbe9c0f507d7da80a8594efa5b67aa20d5454884c1b0a841ec71ccb5fc8d333c164438ffbef2a4326122e899405c20411c1658b1dfc0e69a31901067aca816fab1bdfadd4b4b68cd5bfb4d2c0e6eb52bd1a23c1da656270671a6488eecb095820ef19243d460355034cb1e2dae27ab875c71b6220817f092da4e6600da93bce3b14cf421ac0c6f1e51f7b500b52c51c14e1e3402d7bad5f918750928da3e4b965770d55f3729a55334772c299ceaa3d3c123482b921ee7d9b300d1dd418c98a7e9b88cad8fe73de51b6238edd9f2b29d9361e41fbf21187b7422174f8320536d66b4fd368f33617f2ad79b105283fc8b4f500f2cfe5a3b2cfd94e101d05df25829cd7379935cbb3b1ac55f0567500008f03e8cc792f955eaa709086fdc8e6ec0bf1ed43a49c07e617393d0dd00f5808ccf05ceb1cee0feb493b9bb79b0bad123f486fbd5645ea9b78e2dd8e462cafb56a09501e58e2edf67461da01cd37fa868918d5215c35d24f82a6b92abc289f740b99f4661ccb6ea1b2450fe23c6f25567b91d25c1030064605e398d54281a6c9591b51a47ed3c6901d8e3d82c7e13b4bfa9249ca39a7d764fe16b5a848404abc99422fa93f6807a86400afebf2f28a4baf49ab0b87da1429794e64c2867d81f51e5f51e07ec1fc4421161cfa71041dfa00a7e27e99144493dd9f474afd15844c362cdf5ff5e30f43665db438f1132c507311dd378c816c47138e482cd01182a8daa74c16ed2179b35239033b66cb6749fbcb719ba175f0ebfe52f1849754590d4ac034d119760625a806598a3e5dce4f42938e87c3775320c37802f8f3612ba708a92db8243fd8c1406b84ce92e7399a433d47af99f3e103b35e083ef35519e40a4268853a5838572a6506588dd0f90b17ef319c52eb7ec70087dcb8a1177166a1a4631518bb1d9539fe8e7c2f678efe1867a9d048ab2ba2f4c9554b6a0d835a3dd1c7cfb794148ae56da02e9b6af33e798d0fea86eb625782845e01ff665bb99c30d7c9d6a0b54939a1cbb5fbdb39126d6c3350f930026a08327342f7162081de721dc2211c380f77c11f5f50ef2861d812dd7e0f4905cde6bb4efc0fda77894cf06d2a7ecfa032ca419f24744b0bb336805d909a5169287868522670ce83b63a675c73893f18e8e496aa5fd1b7c62ccf7332849ca0d4f044cff75f1e6e12905c6a1f209c6ab2f994bd991a66b04e9f2eca83d27f8110d96c5a840d385baddbfb08b440f4bb059fc7d1a273c0844c1117cc57d494cb3716f63f9d8f5cc0ccc62c6e84c370b39e820d669292e8b7bfd306f42ca362ae7381b8b356635f48e66abe676a51b6bb467ce26fc6957074d66ed1d7d0f14e26ede2b28dc7ec05569ba6fb4bdcf1d79d3337c7d4798c8996a97496ee05122e5ccf2afca062bcf40b7a381eef7ea4842a79a5fd96a274f1c595e86eec6711e033e73556118334f96ec0cb7e54fcce5262f03dbebaac9a590cfd65ec23cce649cb9461a2394ac84af57b9b6a709f67074e86bf8e727e4fd45105684297ebc525c2dae7605b286f6cd7e3f5cfd6193d5a73929b1d7e029755175e885fc9e78113907de191ab74c68b176bb4c1f3e340ed71ea7933592f76d7863946669fa4b70872062a76fe44444de7fd9038a15ff90fa07853ac009bd1716574a48782c03ee6665867cf9c99b1b3f845ba5d6984eace854b9f04caf3308b52122d543402efecd3f8d78e26ccb70a8120ce9e5c6523925e168597c077dcae38976aa0e4dd3e0620a8b67154690e4f85a57d978540466211343cb8654b5d4d7029be8e85713bccbba4c5a7f240cbeffaedba2a4647dc526bf00371a246c6df273a65433c098accfdd5ee145e97a93bd3a3fc27347e0825efd5e41ad6924ebe2db3dd15688528d198a336313067f6c300f6550624fa74cd421780d2084322c436886a54fb2a423cd16472e46f3479370825624d0f84251874eeb454594cb9eb98f463ee97292a5828bd918d66c6b52fd4b3d7a545248c2070fe13aa10ac8c057fc6c1698ab5dbea554a75730b18dac1ca6e1155d76e3cedf5b9548eebee830d23abd7dba32d9c59091e06bf59e553fae8ec0abd415fc0a22a6b8b4c1f25d954b2278f4b61bc9fb2d803a84eb822a920159575162b849a6d02a8acdc4aef12bb0b64764db0a7ae5056e8d01c34a2d4e5661d31aca0d390483f51687e56fd137078ba2d4c43d7f957aff8497cc311dc4e642fcb5a8e7ee406c7355c6f3f26aa9fa5d6d5f0a8c2532f8be6a80dcf8e35c470c5d7b64ed9cbdbc86c58e1e5e8cc6b35f223dd5c45b8e2e5b2c81a499bf31d4caef52048032187f3af3f2280ff050927a27f854855b438c25ae510a7d03b630fd265470116b015f80ae31a62bfa4d1bb600d5a72b3831e49b32dee6c537793c871777850cc5be9a60cd3b85b6c8ad2c8a8f9c48755442a89c44dd83d162144b7685dc8515939df7511ea62d87495a3ac9f400932b060c2aa524f6c84a3099d70b39308ccb49e7b9e42cb64e1a2e40ab64528d4db5ea046bfeb80669e2d332fddff4e9c1f5afdd593e94003da45761bd8a8a42e8e5be590002e65b3a89e5df9b7320bdbe03738920970ad8e4853202ea2ea27a22765f425486e544a605ddb9431adbe0644c11e1991e525e419ef096d24691db52ce7acf405e83c490dc3c64da2a76bb6f6e2d59a0b30ee17a054c04815e328d4de67a5af8c292c17a71c39e6912b90bae8395ceb1a97456f494959863d94e109297d1f1ee3497b9a599d0937df98659a0a78a2c960137f5c4eeb769e26a17a31437241c51da19bdb8f235f314299136b664ba416896dea1a913f33374fb4de61f181056ea3862b35c3142b9641afb3d75c17919fde4e66ae9441a6cc94bea55dc9bf60a7e917f7b252a2d3195d8757926be2b4c6c715c9d6080552f763812537e53914ccbf252ef65c1cebfafdc6b7ab1a6f0eb66ed05fba4992c8c7b039891984acb628eeca65c9a9856a67740d22466a92f50795ade3d6ac462e7ea066bffb2c4e279dccf7d8ba017a523f7e618dcea3a4f5f4a0d56588d8036910067213dbe194ae45d51d2d4082606ad182455e8fb0bbd892044ad9aa0c0507a193676d9182c01b42592d7d8a6a337c1a4c45863f585a69c16a2cfd0bfc9b1441916cba920f811e477cb5c2bedfced0834b9658b0d4ccee33acdf6ab0392c28395df20f711f7f3343725d6f16005fc3ff0e4b6e948f69974db0136339f575d649405d583a0e31e4789e9d13b814eefe837af6943ff1f5d2f9d1aa398455b2d28ce6e3501786fac5fcdf47e387ac62514df53b7f7d5b0ad853491b7eb287cac1d8aac80046df432af71988eee24ca0cbd70db8e7e64a765211551b29adfa7c845a752078768344ed777a430f5d51df11038e3f3a77d6b9b8f283e11b3f4761126a5b1b230bcb912d35b234426651f98735cbbd856f481e91ad6642ddd75a13dc0838c2f8e95ca114793d50f31ae3900be64ecea067ec88afc82f06a7589e5d2b7e99757e740705d06731f35cb86d1930a3b8ad689174e91233a64ed9371dbd814aa33f1d3ecd1224aeacf438b8d63ba795139ac1ca005063f919913c448922689437803963c78c8e02f4cca0ab9d3c28348af455bd5ef453c140699b5d1c59aa32efa6d283d10831cdcc54ce222674511610c5fbea724bb1d7cf8cf36120feae9c46fb42a4e0a7f84013ad3a676802a0120603f74b7e18c6e17c18da068054c8131a8c55b78cc169c591a5744b261b04c0a37168e91bad05003a5dec9a230dd8c3f036c5c5e91bf76e396ecfc2742a9371b159d947b7cf185cd6464d9dbb7dcc3d159ca4ae89e32d07eb4653a3f3f809fe1869f5712b52808510cd062fc52a75ba908cbbbb273c4fba4454c8947de657777ddb08d0bed4702eaf64940984ba63c4610e0684fe213e7008dc9a0d122fc70975fc4d18e12b4c8d567b235176169ed5423affce25912a8f654d72f7d6a11e8ca5c4ab30abf614088e021b964f30dacab97e9dac0f740bd10476166d509d4b273189c20d5f0011213f2ee8055350a7a0bdd73718449729afe1aabaa35edf4f948a215a7b7df743d1c71dbd34af7432e9d1179a22fe33a93032f0f673e6fbebace5d3262e335748e0905568c19b8bbaab62f20d61288780995278cf08920abba3e0b8f704f57e24908d86c7a1f05aa21f4a9acaa85f4d9454ac5d3ef58d80007a1291ae1e2b5c95712edab46cfcd682c0618fd900a264d90bf4006640800fef7f693e0e21655e96a235a0464957e1f2158029e3f242332f205c437ba002ecb9233b611689d4b1572728bc9b2a54a7ae524021b964ed9054bc0676c47b260abecbd1a495cfcee554bc034b13eef69576be2d98ac01f5467e02fa4d45293d0f14a09f84add47740630a6b05e8184c3e90ffad07cdc7af357ffabbe5441c03a8e8258613fec18a85810d0408fcc905e01343e87ff0cc282c67c857135f72179280bac2f1a634bc420e0436af101641dd7e4d4dce63a06cd4e717c19faebf72110300c763e7d9c5ecdbceffb84059de8b84925adb57cb937488817a19a7504d3bb82804d4e08640a1e5162b01d8a7da90c4d1dd18c6de83167d15bacfdf6da17f8568afd3b94105966b5d36b8263ea673640dc9e67d261546a087d446ce3fa019b8bdaca8bbfda71f27f5c8d6725d929594ee29baf8942f137ba517d416474b352ff76ddd7e7957a03a428642df331142b33accf3a4619c66089c806d848ad1389459b58fed954232cbabda45221f906f8105e4cf420e11de26fcee9c597615b3fecf3c641a1a48e97c95312387f8b4e0dd0156a51b3443e72755a1297257c7721d5a96927b297e11c96a5309eeaf273440dcc8b4b969cf56be7d6914181b107bdaa10f81b6317a79064c7555544c5044696751342d08c1b6424d210516041466dd6e3af47e4173be60b17e85c27e31da9f7328016f7c63e25c0735d0b08cc872926ade70ff02b5092709a3d08d5286d45dfabb0951902a20e400103edc1c18f51045f5a3e370583bcb120bc2ac27b99ea0f923ad39bfb78d6d2dce3f3c50c21cd1d8c053a137e870ef1ae142f9f68bd567b9eb0c162e1e00c50518351a3629005159ad466738955e2339a528c676b0b71b93f6c7ab40410e7e0c7b4442c507e7c7e9a1e3517ea3aade02dfb0ed943a8e5227e4f9ce252fb373c0f9e80f986112aa9c008a09079e1a45e506ad953a2069392543437e12352b51af941bb6daf5b26e10c4c50a9beab62b0bc5dc0ade6b944f7af61b73f4fa76b4308d1bb6e8699d20d510295f1d06d23af4113d588f62207d7bd150a754edcfbe4c0e28c540e59084e2daef7c307b01dc9549272df3b4605e183b2cb4f54331162156eaeb5ac2a2960a535454d153fa49af94194c921f140732282c0cfcfbb038b85096a19763a3f52b606ffc44bcc04f0e1084a627f4013283802f9875896c33400e81fa9950d001914e959e0f1307a216e33144894c014ee640e995ddaeeb195cb83cd3864be569ef3cede0869b06b00a7ee26ab36e90c708ba48f9ece423f9a66163f8216da57faab78fe65c23f5bcd851f1865438598ef927160009ed0558e054d30c8b185b3c8ac273a01b9a64ffe853e5531ed299fa0905788db763fe2c8ed9868d78623afd1b6600ee5d544d2be4aeb99b07f906bada903568bb214b3385f26387fd953c4e227faee6aa35fa4e8a4b610c8a2ec53fb368b9e4918db8892bb2f6e3a4a7fb06a4291cd58a26fb6d91128ce2fb8390aade555c83bb2c29a03d041e33aa65e291567fb2717275ca8213f0f7c56e2087e24ac6740069bb2e02f37882648ebc0833a6948156bb511776c67c02b5621b1df7de7c7ed966e7ade592c2b1c3616718c406357fe4a91d714712ab460f537b722f334af49524712f2d78c11dd7ffbb1cba75c0ad0e3935ea9bf42364c4118075b0268faaf5b61254514c0a6e693e89934c892b82be6b4ce3ae771a802d688fc16b1429155df7f95a33550c3a8cedfd3e6be56112b5087b66a7465982aac6c53078b3decad970633f7cfe5355ad78453f3b791d88d5116ba0b5ca7480eec68aba7642eb3466772adf514607bba38ea4fdaa36b107982602e476d769aef3757d85a455ae88ce12f105e70394dcbae6d8c6b6f79116f1433dc1fc0a37c9ed1ae62d1903ef6fabdd69c10ee354970f35ce3e9acdc2bd389d73256ffd773c55845ed82d9570da64aea83a53217bbfeb5b43458d0826e26cde0797986214c0139dd076be78377c81b7266f398b455f7560ce29fb6aca3bcb801e86ced0c24ebe47ecf41f91b404f37364064c112975f5e33ae505bec1bb2be6421a7ae2cfbd3ad5f4d28b89a7f925a8646f8edf56a0182a38f16394a4920bf426031ce30f5d7e3aeef3a13e2c411ae7cf089d36c53ed7a57cacea805d1941ca8961c0b3965bba6dbd3e71bdc1f7f91e651a9f0c8acb5f66fb8106b80daf43dc10230449e9b56eb7d4a00b838d5edf151b396ce4fdb8f9b4c3f728f379a05ea623e9877119f29c91fd13722086b1db7c7e9d63a6ca800e0590854e51b7d2319fc2695f5232d65a0200091b47a811255001c2dda1917c8a73f0f7a29772f74963b90e39a8e60b8d4018a79604c37f54ce2162b6553b2dbdc35898f288c22c25fa1730748cd9fd731d1672a683e2e816675df9dc1041c4234bc42d9fc0445f38ed6c0a8757b6bf64b32008f8c045b071d564c85fd3c8415a61348f9750fba14b829d5177e7c0e29cdfa6bd5d589fc1d14eaa526d095e12500ee30313541bab14d8ad2a1f24149eb7537883b9c37c521aaa86bae83f8e192436224b9026a0e2f6a89aa4640818766cbf8c5cb717f1ec97b056da6aa016df844a4e26be9ab62ec7607fd73c5ec994c3e1e61a40d0055924043612a950009a37febe918336e3879e90b59d703263d1eff31cb41be528afd1b523f520c49081d1fc796977714a10cdf317ff6c36a2930566b5d0ae7de20cf638d96070622e302553b05a617ef704a5444b763984f552fca11441d6a3c6bc0a39588577a6aa4fc8029a773576ff27ee990594ccd2bdd6f9d31a81f3a8e0366ac01d111f68a50313b9c9cb85193d2f95212d1481f8e41e3acc25883b7f1705c70336ab64d0631fbb85485040c200cfc8c410128c743c198a375e950768215fb3c6e99145a7027329241a10f02f72514bf4942ffb6353356c08abcbb7e156b10940e85d6265c1dd214897c06682be46647639e1861026c9acad9b63b5035d840b1023cb934e1a7377431b86959b8087ab57b08e676f8bd095e8baea2dbd0a7b520dab63db279043da3b8d5c184ef0635f554eded86dbb494f98c4f7b5b915b124e26df2d0c64dedc5456d4d35c4012cc887a0a8ecb84a8cb591d09c6407a9e90aae76db6d05850c4a7505bac74ad53a830aca5ba1f2c32d41cc5ddaae041bee068c565d766aaab05a8f6a2981381e3005d8e790e47e43baa07c7b720c8b8aae25be25a6838bf58540914d9424e49525a5ae4c198e3b149cdf4862c88c210b774f37466d63dcefdb841010c71e8823428e86015d6d346b1455fc50c51df200932283e609616dcd93d615704697b04fab3408f8360c2efcc9e0dfeeb04c2e543d40a341029c0f3e8218736bc0aa079a578e2f409990cb459824b2da708a312bedafcae64d5e202b4b2fb4f0a00b326e6326651e19207dc530e1e2d09be55e463f013ea18509ae2c014121e68d4cb194d00f86668df8ceb068f93b15acf7dddc30ce95701949508ee8d0e55c2fb49fcd1475ffe074b3cf5abdfa5b7aee7ad381d42ed45d632d98ac3ffad491285e9ae2608ecf46cf5fcd0443938ffc1a5a1c4d49f83ac95bd138ad5cdb4eaea7037345557ae1c0d255528059c10a8fa067d1049b287fcce22ebd7015f7f445ba974091fdd1da9e6f691668970467f444187e710cccc5f77f224094b48dac848b49f65506a079e98da82580606d366ce3555a5e6b90293b675271914854e4dacfb2ea2de58fea5730e216ed500f18c17f3e642f2df8e88c8ea1aad576d081c58b866beb7c7a5872f635a4ce156558a98eb8512c75ebd3612b8e377fc9dafba22c6e5c2a88035fad10eb60e8872a283c1f80c200126b01f995f4618b56b924c9139e01c6a7753c37bec63b948615444429980e505c422b4f658104e03a683eb80055898805007d79a608f7b2c15935d19b008d663289d46038b541e0396297df638afd580528dbf85e3dfda15f10c70705fb0b3f2694184109e2d5d25c9c767e247c22e5d2513a45ec02cdd21b2ebca18209aa648cdbd02b20a113f5a295f772eb30a1902245fff79142166352231994521496fd8ab1ec6a8c00421c3223290a0c562b5549a04b18e0040e472de7ecfb792ac3a1d813e9db44d39fccf4ec464425c056c99fe0dfe9d625ec81e3291039cf5323fb11b155825c6fdf561f28ebde728012fbb01ca44e6dcc81b38d66bb4342aa543ca8356eccb2b40d8461d04a600e27be1530575704a8b4e0c02635c96d13c51b10026212690d1814aa065a883d7e534265bc27ffeac1658c2634ab5f4a854ce36247158dcb8438ef84bcc70a262c77f0a3d854b1085181e098d693ee07c2802ea2f10ecdbed6ec4204a071b12c3fb10cd62d28537b5349654b04a2de67cd446527eef8456881c6f02d69f8ea3f0b180ef91e07fe1d304fc6f7e91eac1ae76e92311abe834311e596fbd08f830185aa2ba001e03431a95680531e67e880bd4d3af5144df9ded5f7a4732d23b0d24480138c47ec913d0b21bc35fda48ae107f0b1e21fb1bf02c0c788840dc64cbb2ba8850324c954bb59c2520ad25d74047d5f45772c16efec36a569c489bb058c0ac54089822b8e653eb0bedee244a5d4333d97b0f401b23d51ac03f950cdc0255994c2c6728b6402c0f03944859c5d364714333d4fb406e93dce3dee7b40feadcc10636f2add1a64c5df50c56b1d3446957d60cb2de27d9e1b8c9f921fe1f4a44402dadf969e6f2d03e434725424a10d596f2f0ab21d589d624e64be67ad6213e08aa9f23b4970920c70358ce31f3367f92a0f0dbac4534615308fb338cc977e8428d0ff7164a4b05298d6710edb4a97c4eba56d031fcdc6a0b2e91e82ede9de3ca048182795501610cf32e973ab524781a15531b04abc0a01c099a8f258bac6035857e4b384d9fdc899f6e2addb483b3fa7960d39a41ba7f0a0a809cacfcb6e88f42351cef124187bd9a279ce6633d1f33c492e5790357bdca2f4ad624aea9661add86fbb037437e9dc61bc76190c6df23f4a6e834d254824dff961eaf962085219eb5babcbeb77522a55a9af84a5f8d7ceaa05ea58b3f9f59bed095b67de356d6cb6d1fea54daf6d98109514688ba6780de41d7ed6fd04880d3d04f357e5a8d28450975c8f987d86dcbcee8c8077323ef2519d63a421461b3f6d75f5175d3438314e35951e3f6e9f1d8053ca9faf458df846480a761e2fb93bc1fe86fd1635e09954e3721e913ae1886d8d94f97f46508de682acf28e6d864040a2d6311de087c9511bdb4e3706a3eec9a909b6432495593da19019721fd98a22a2f725391e9749ca491d1b64ee46bd4dee46bdd775d602d95d490de2a809c9bce27f1f3feb754bcce8546fd08f78027e646557ef01c41ea1dee1af1392c1a0361e716357ce0cb7b696be6dd79173b60ab124f1e61386630bcd30ec2553552689dfeb12ba9d411867f5c7c4c6a445183c3f6526604ac56afb061a881b14b4a7b7dd952a1c905f175410c149bc0ab9671117a4c237b2a344ec77905823138778bdfa25eafc097e7ea618f0b6d3cd2629a020a0de4b59a604802ea744c07bfaaf1288f083b50debd4f62d66092cf88baf8677c0ada54e81c6de19dd578f0de37dfc8dfa7d1f3c851f978b5f4b42bd8c990619fbeba4e6f3498ac946b1732c72255946000dce8742730b3728837066602a7242cfab7dfd11472f369b3df46dd3d13ad19987615102180a822887f97e32912f299e9c11bbc8791fb8c4b6acacb073a2b159826589bd3dc5e8cf0eb53d844ba78130a5ece095b1f0fd94c3654dd501dbb6941280a010d776320913aa789e89db66d721ad3416239faefc11e872360c3bad5d16c3d9491fe7924dadb6a1c6f44e66f4f836ba76f897debbfd48381eb20502eb19e48fad6abacdd95747a513e8fd3cd6274c2f20cc05d2594d0396397c8c16fbae7a7123e4be67ed6aa24abeba1e1e43edafd0753f0080a4a11c469bf712f575faaddc07929d04c399f38528be6a3f4306df394fce2b6531b7f8f1c0359f7b968884fabd24d4dac5b9ee48edf24d07e4a1e921797c31952bed34065810512b3b9485ad3955af15f1e67f595d0a08525003cbf5fdf7e5d5c527137a39d92d8db140800b93aa1b20f07b4c5aa3d3df61890b1cb7e6dec166b0df6bdb0a63d5f6682a5390bc9c5af895e869b493f865eaa18e829058feacb97ac05781e439af54c41ba506c4433d6341fb24754f1a224762578c027d4997e7240b08081a5be4107e0e7592cd0500d636f6255a7b40fcc88981091a8520203443f32f46826b29e11e3246c7a82205c62235af7867b91605ed7865b2aa16d62bf38cb05a689e39d01129cb3fb92f23fcdff7283b68d80581c7b3142d0c1d56b2b29ad5093d00a5cf746e016a5be797dbfd8a01527c82f7906287fec8d91f578146063c94eb637ead774f2c8e79e024eddc5f7a5ae8c80739ac7390dd98bbcc7936290087b71a1385d13cadd2ee622993e9776b8db6e5521a7ab892b632e141359cd868b1071db241fc2dcd49259e0ef27e481bf9be00bebfde8c97353077bfa69d12e3e435cd143194adb8e1896b7edd69a68ccfba43f1e38d96b406efe85606549dbb5cb694146e9f52f1bca0e3ca3fe19d751f4baaa08292c0c76c0a17b21e6fdd04a0db12d5ae5a75478775ee4aac8cf72ed9539700d50ee1986eae2409cd7c3da12cfbf57920934b752542d8ce6f5831d9d1707d12a2d427192ace7ce0b37b2462c69b9d5633d42e3c2d54ae7b5da689b14f8e84d01b5d588b370f8a4e04f115ee51efaa69227549777ce54ed075bc3d51f139182b469764b9185f5c8883e11dda65964d01e54d8631bb3d4944abb4b16b212ba2f6455e500495dc5113d28148b46be3f5e2833992fc0bb416e441e9d28607b72d89d5a526ad2f91521384106bb1e43ff3a4a71935c139d46e94e71d7ee572c3a0508a7aeadd323d876ccd9384c1e8e102d7ca6d97da5e8e57c509094a52b3c234839047cc76c06b20861e4aefe4450a5d87311583b76bf849634c651c0b158c3cee05f6c641aaea5410d924f4bee0e3d0aff83b2e55420e2abb5ce26460f0cb261fa0530320c9cf7004ca212f4ee04486a74e493ad33a7d8cf1dff278a82c243da38a123241865fab718f4d5cdf43ec07762481d6da09c0f0c6c69464849bc2c826f190cdae0a177e80fc764312aaed274e636c1b23b67227fc6e9536a31a0f634fe196fff6029ef89dd4694886bd0965b6878b37910aedb185792ec5ce28468e95807d11c0c39adb98f87297403cf8664db0cbd55e3e00690b5a444603bd01b55a04f2149556b481f58d116f068e50da138c18f8006373b965eba8260583c22f2baa953eb86bcfc7b2d6119d91a9e0d86b94795f01d17b8c419fa50708601c0ce651cc75e1d5ea9c6340d2395f643baea0ec81f173fccebcf57c187a14ffe8774de590962334b3a9f149e320a886843c650e4ef7ca0bfcf9aa1f9acdc989acd73bbab1fe0607953b42605d9dd3b1a4ca79d10cfcda726600f7531db4442c34d2968d7003d6d98f4327deb0e4f9acd448bd83e97c8038ba7d81aad7ec13756fab171f83778ad3a38965a87c12d80d53f36f7c5e6441e52da15b79a9d397d8eb1a8a95c0565b25bdc6aa6526ca2a168bfcd34432dd20091ea9839e1419b11a1b5245e85d08af241c7e1f6d8226d79470570fc436f7d116e3b5882f7263e83d12d7bb69faef5bbd68319368bce8357302a8630a803d1fe89c4013c5125e15155f7373aefd3a788e87e1cadbaf034d7e187afa8decd62635d00928bc783c6076b309871c0bcc28896b42af533d8993034f30383abe7b8d673b2a81a02a4422975662cbcd26e7aa06a495a43ad254582bd802401259a95bc24d7684f1df7de8ffa7cb443e04e1f720d12cf384597fd2ac759376d78a2ac3bc7554de70a1ce349e620bee7a240488a720ca2719d0cd52db4888fbb38d0997e60bf11fbbcbd6976a6d796bd63b38ecfb868f3f6feeb437b7bdd8b71c9d1031a1929680ee299bccabcadc4a55a883490df389a8a0d6d6762649bcab0ba7d2d049d821dae6331a3b28d5187c5afed7c21ce99d5b01f4a2153dfaeb68823f0c147c7efb7e9dc4caa1726b5e5dfe4cacb3f9f567e64a2684f2cd2a309cfa346d96cf2d0fa0a12321217ef181313e23a6b4637980c3c56c96c865da1af3d148789e18906f30a6fd233702d4381c8fbdc312cb1b411b2d5b7f71891a943608620090a22833f232f9f5deda8710cbdf2efeaada4d113060b2a18ad26c0e7ad42ef2de048c739c5580069bd35dbc8c7234d48a4b7b66852ef3bfe9a938ea4431626219ac89f5ee0093786c957e4eed0c8599e482f297abe329156d2482fd54eeba85b7b32ec1d616ad236511056ade5079bd9edaa3585a737882ce4d839370209a01e682aacce33fc8130bb3d384c496b5342b06b86ccc4d0ce3a9d4ed13be31d1ca88b9e05e8db6e04068cbcf4328f59ed1e181865e1199d1c749ad144ef8f62135fdd994202e7dd434c464d0d3169d4ffb8a3b58d2850a79042144f39b9bf8bd8f3c3202dc43d8fd0cb9b6a1c0352bab00eb8bbf4247f63e79a382812a60276a8ec378bfd0feda9b0aa55142cfaed07cfcec1841eda73c058039c879848eb5fbeb953314e320bd1efb4e5db79833826cfc37be4942af1ba9066083838fd6403035acabb308b075bf43acd12eb0b8968d15516450e3cef4e4a276ceced81e2fff0187052431d3accfe062ec45e4676a935d7bb16b2343e92223490a68e208ac04f292e413860dbed642f4f595f93275c7199066689f37cbdea570150b6f93a44c981d2d92b918592cdb762a1bbc51f039a21bd527bb8d3dcf3d2d4637d484eeea26e491f254ce82b82f429694fdee245306df5f3399bbc2992c9c0254fd87fb754e4848590476dc70cedb32dae66fff3dd20ca57048070c8dbc14a22360bc5442d3e14cf430adaabdf0aedf75fb50ec2f02db5bb2f9d4ef3188412f4ee97150d44cc37c18f0bd5f57ee8a376cb8e768612d829a03c473dad6a9651cae9fb4bea2c4b2baf377d88d2b1496c24c25227b48ae983d3d39f6614f6e5f165445f9c892b8f602307a4044a61fac9d144c736c0ffab5a40be92ab4832efad4713b9fef024ff174e23e6cf886638652e4c09ee1d099a39f16b50af6cc8aa80c56edeb675d50563016b5d5a6c3f0d790acb48a839958216fb980c4048f4b96648f370f3ccc4bb2237d9f602c80beee95908b0715db92ad2b85c1989704bd4b41bcfe6bbb208990c73fc039c74092c3197f1434e83a92f54af67a23cb3f4d82b9aed6b33cc92f9a3a7054d42068026cfd790e3f7a0b924de1de639daa7284c6731f51e048ff65655d37532647617159a31d2939052f11d04c8ae6a5b968e655fce5178801cffe9b26ca5dc63264c3ed5cb6dd39a12ac0d88163f662f4b145c879bb90f07f787f3777ad03c37731948bcfa5bc3778884d417ba7b8b57b90940defc0b0d76d6a775807d7a3eab14c53dced5a35e0b0ec19076cf4c1a7fbe6738dc905498a54a57c9fca57ce3bea6a709d81225b2e052e9a962ee6f18ad96de70231f6bd6f0f804d9ca5b9dc7323bfcfb5752769362db2ed9747ec823a329c08baa2d3536a996b2384986ef9da0a1690bd8ca782c8a59aaa48e3b3c02985b50b780cf6208484cea56e3f29a7152427159c802046ab15ad675ae6e2b44bb9d20f5eef1013e3355363dd3a1cfa9284dd2d5990b8806c32fafe2ae2dda9c93ea8f9e85a80900d2a1e916f2ccf053f62a197a7752f4fc067b2c556c8596874147d40f3333fcbc6332c11e0c06d8eb069c2114104243be40643b934ae34aa7b1c30deeb718ae21bf254e9d2cd2c2f8bab79a5cbb0c0454de09ea03029e6b369b27290d5212301db28179f08b73a6ad5c7b3cc8494671f2bd02c2a666cf9b32ec34429c9a378d960e9188bcff999c1070c9ef8332c64e2d17f4b9b0c09dde168c4c1cfd1f73bc6e6b16c74a1a9e0ee340e2ebc2adc551e7e914c2f33c816d2100aa17cf46647f688feedb53ef5043cc1c6f8f481083d404099908e763a33205a358fa7f30bf8b105ffbf6ff249bcf1325a6fcc9846ce0e92eccddefbfc2f0db402d3db28daa4117b09cc220b429bc993ad5ace8a90b5835d9f1863785379844299165934e08486d29b78f56c3d30e0605f26bcb12a071b03df86891cee2025a09a66248d9ff2bc9e8ca8e0c20259fff63fe4aea4e2b164a696b1f1573e692d499346986e94329cffa8ed0c8d05a5f57e1de2f4e6a30c9262a4ac52fd8b97c8e9df6d3d0dc96d4418cf53a0114987409a870399e968081151510d6c4142abfbaacd1a3281d377109d3be2ec848afd7324cd0c139f6da990be2d9cd424e9ff976968b30b21eb67238aa552becb1bfe239a7b6f9a3756f3f6ce12b9f8849945488bad577bea9caa83ab531729c7d72477d799bf2b70ab7945fd75a5358c18a2a6bb80d94e38a77005e581704133f621e424fb18b9ac042042acb8da9f31d9e088088601208b715328fba07ac7241db8c2293c3a1779b3fcd5017e4a61ba374e5d72887e2a16c0f809ea013688e02a7e17af8d1cec34550f74b931d9242c5c6b68b595f1ce457abb13f66f9e2f3909b21cb230b6acd344812b3574afb5f92fa264ad5edafe37c8663f0cb6cc2e8acf4f3bc27297f14b71dc03531a35975f4e15c84c12ae9fa894c5141e97825145b2efb5fa4103c463d65034737dba107fb124bc0401ec658c762f968e6acf88a1cc2026be847cb6df4a33044758712ab71d91b87f7dc955985616e57bac91bbbf309cbd5549b429f448a6dc87dde1968c261f40e210634c134f578f344b43c3524eb9001104c2cbd8a668986ef6b3ac98334a85b13ea13135cddd01ed144811ef4516912e1e9028a8dd8843f84842be9220180cb0429b03a421aeb6228da9dc9d8d0b35d8cfd46fde9f0b1f2903684e01eddecad2843cedc2c91dafc0a69e9f573e288771407d28bf04b063ef31082fc38da84bb17c3bc6dce9400a9828fdfd937d31a4c02f612f1887463c0ff51fc53ac4bc4f75f946829bc865bf24173bc21565442fc521e22cf20904e1ea0e6423d031b049348adf609cdd761da2039a12290dfaa47d45fe2c763c96c80ddea415dea1666ef64ac2e2e8c95ddaa22fea770d36efe727cad17e61d921c960977c14cdf19262c6862dfcf09a49a766c7511d49131fae1e064fa81cd0ab2e25e3a3eaa46b260d4cb8e46ad71161879491da146a542e9b52fdfb1252c87242918e90a3671882a8fd42e6d70dfb293fd490cb8845f2821a791c438b83054f5c94dba76d46b61f65b3afa6aa5698ed4b45ff5fc10d69ab5feeab16f3e857c390cfb4351f401ac4ae4fa06a73ab3575db4a877f5cbe6c17d6990bc2569c2337665397edf2bb34e16894cf233384efb7f599220d5fe247712d013abdebb79a63baee42aa6d8eb8161b0cfb8dbade108c29dca5ff1decd7b12eb0452b6d638c59f2b10dccc95c81da4ef61fe89417a259e13e4327da78d7a255befcca91e135f5d8e3b529165cecb4635763a0c77d7a5fc7242f05d7a4f18337f756e40d1f5c725a15bd1e85f2a8e80d55403cea1d121eb41a9805fba441e789a55d26fa5989f6e29c87db7f84f88144cb014c0a7d10979c685f5d31c25ab2c45ff74a343aebd857d42aa40a8a5803c8d9bc81e1789dfc73376a6dead9dfc5c0a46e18ba1ff649a75ceb50b3ee7cd5134a2ad9f79a65c786df9e7181b52361ff3077eba7fb68b8514fa9aa98fe59924e2d0a7b3e78356915e0f5a790eff0a5acf60acb42975caafe24e28f99d0e0a967b37c493165af1305e09b3c4888fc4025f8ed10e69efbc8ebac6c21713927377ca2a4a1d1d698e4c1d64a421a8799c736209a1d1dd46bcd8a994e02781df00941b7392d91168266d1e073e430881f24e74b3142e3ad56cab59f5e4d359193f79b09b23d370214d559edcee9a00440c5d5ef18c7148f10cd0a845b864a9bad4308eda6640f99061ce856ba9c6fe55906f0ad5dc8789337c531c7b2f2d2e9349f2453df7392d98f06b2072145568fafb9e8ebc1f19ffe69ac653857370036ac7fb11f373263b64957c8e9e8552ca9d966455990d75cef59ed60e33a3b3ff55ba2546a73b8916a614f9e531f8695239bc5534fb1b5247de79a8579795f1ece42fb826abf7ec54ddc81bf7ec2c2a7c8ccacef723e3df3c7aeba1b016eb6cb6c87353adfb8a2afc8e8acf9035ceec162a1e6b76dc2c224cab1b293476e45cda02e8f1f2d35f1f6fb752ab06f1e34d786a536c2906711fcfd29de7f1449ef05c96d2a73d8d2dbbdd2deee5d0ccee2e7b2f2fd1ab95834b98669eaf039145a0d6174fe85a5c245694e9b4877b904656c6aafb8b0bca9e8bd43962dabc885680e7dfda6eef6b8cc25e2cdb17d060838645303e057dc573f15a41eefa9d0539c2ae27686c22bb986c42800fe617313f678be82981e8e0a11294503ceffe5db8dee5c17624241601ea9700c5858287ded5be24f05ae5412ce027ab24e22b5e888543849f34e42a09cce0746160159186ba5da51afdd706e625766834a628c2d2addccce983076f3f64b17fb3467f0eef18a1d58cf29e792016f71e383fcb2df61936ece69a6afcb7b3d8ecc84bfd214d79000a9725fce0ba5c6679caa3d021d7ffb50d80847dc31daf91341e1878b78caa56e207f4928413c481f38db8a1f44beda91fa632d3e7ae62fc2b36e878c5cb618b0d14af23055dba6d0a60fa40b6b1aed7bdfa6fe16d36c856b900c4350ba4c94b94a764c92b894a7df093242dd54faf731f7667c5bdda4be4005a34aa4b62cc443599d5d014e3c6fd9111a96c621acfc8ad6e308ea766d11f1773039b1dc46e981bc790bb9bb9952eebfac58a5448b6788208a86db7d3106ab2efa24735fc5cf84b6c13d31b4687dbe4da89efe6632fea2e1a341bfce6deab7f1725115f82013ae2753770fd26a8c9768b95abb889f1b2600650e12634da4d524edc699e21c39690b61452eac0bdd8508bc08c171611354ac65d17ec2fc5b6e494c7c94034e0815c4e8141ad9a61c38b06ce54d3f02d3126450d22fd5e332b1777bc276f8dda7999f6658f04f98f9939fbf343732644317fcd990842372e04d952d50d9f7cd278034f336be9398fe6f522df18e3a1a14c9414dafb01ec47c4575bfbe5deba37492c58df0dc815d88aad37353a9ee0d083e9097947d5b5cb7f2301b2674a728e1e5f10a5694ad6fac04e07fecc38e9d4a49e80df558c2ac46e91a92b8170474a2e672bb38978f72328b1c8534b552ec70a698b7744cdcab546e3c7a22dfd44f704e3512801ac4aa6e8ea2a69e53d8ce7a5e7b0cc984cbbd72d45328317e086ea09f8318a73036f58439e0ae00d930d4a04296cfe93966240e2c071b6d6e59483ed1d3429275023d5c44ed411f37a187cbefdc3c796c1f00e93d11b49fef424a89c188d057c0da2225c22c1e37fb5f41412f95b86289d4df54f28f06c1092126236821dd2817584345309a90b663832621bcd10ca1d958c266b11b12c167c041ff00efdc7280b24b809618cdc2c85fa25e3d70453d2e8703a0156cfc9fcc6d16a42b0958367c902c9d2fa3574b02b1db7bc62fac81b0d4bae744105aa6a6d651e1b91e07fdc158c3cdb94bc770187d9e5c00f9afb16246d97c02d0b15c065492557794cb53fde80ce93f3019869bab06e9eb7a48f652a90527426b71c96089bb1da2b313a308dd07615a6d285a7365b8031155b3a47aee47d417fa26676d3a8c6131f5db3ff72319af179d9dcfea3dd0be35c552dccb35e3eba6785d357f7f063a4f084ffa62ef7f093805ab2974bf74723d4df3b7c570af3e59dda1ba2bdec118398682ce292c251636dc3cd0187dfe671bbad8bfc4dd7bbbdf4f1eb5bea951306296efc03e74b673905a200462f6a555874f720136a3b15bea913ed439b80cc3fcfec2c64a8f432943f395a17e1b52b49ff1573052f12b8eeba42d7a8efc08940cf46929110123caacea6731149ef05d5a1b88e7a67bef0839b8fd260c284292fd6c197639c8befa6741d5e99bd50efcca53e32527d191f8c9e21a1291c5d3c244c60dad9f064b64175214374ca6baee9dc92967bfbfb87d89fd4b7930ed3063ed31ff74b1fc4cb05a82b382aa7ce2464aa6ee0a1a1023986ec4f8ee24d963b9cf0f830296d1dd34c33123c123b81dcdc88f077406203f09101d5a88e2e38134c708d2c7032dd41bb2c2b38e5ab28745d49967bfffd4f5c4faa2b91096b073eea77f7a30fe4d545c4299daa53e5a4302b67e0b071809d86f04f46e135207a4f49657effc6436547165b0e3827b0fb817df29572b1787d446bc5d4e8840fcc943430d40d4d65c01f3acbaacdf13a517a2f49e5bfffce4f1d4f16dd1b0ece06858170139fea8ffba60feaf502c4941cb55325328a919c628d748ddc0437afaf27811dac5d15a970f76bc00f8574e9cb147ce4d0a61fc36e9074a45f831f0e0769aaef48be184f4269578cbe384244e4f556e3644ebaa6ce5435c0dd72e1c39c7ac5ab3d17d132df78fb65c913bdd563e2bac3f7f7ebbee18b7475917865466d2a92f41fcd10306a50b0ef90f989286c15e4ee0b49b9efbef7b7ebc865a5824102c9cfc18986e022c4465f1fb958cabeaa86431b5f673009a8e732d6b45393be692063d8d2d7bc3ff3f25755e345cd020bc4574faec0f2a22bc3d1cbe6e7e02682f185d19f35dc9aa85e5882f1992622857d7f2a96998416528793756ec9584c3b88ee38cf40dfc9eb2bf79c48ca78efcd236547a8b045189faff8ca6586e9de3461dbfebd0ffb0857c1a61e69bb3002a60932c84559dc60191a06bb8882e8ea1f0cd84ee06b44f538c8ca7bf3bd4f189de8b43c862b1a740ac222ea817fb33fef1b3e28560b125372d44e9548cd545cc4636320d0bc287f4e496e7d93afc8d3c0b272f18dac8cb7de784468a476038b63301f29fe1c406c402c72b034d4d10be4040f9c914544a6bbbbf1b4ff299d636466ea1cbda8c84a0919234aacc194a9c6d79c4065bc2199507c1a6d4d09c29aff0f121d0689004a0d75e845314b1028b682111637c1cf378b42e2452ad15aa2c04f4d6727add9fd18f043214d9a925e1490acca2fcbb04a9af82c69869704ea715ef48b222fb90f33d334e97da9e5202f14da85215d723c6dffba94bca07ee543456a982ce644a15bb8b8d1e649da899b627ef08561467b5f06aaa1a8d37473d1f369e299d5d378dc480f28e53b6c3b40d9d0befb6d19153c0e3801944421609177ad99cea7c2f88e9a4ec546f9f8ab8a73a85bb178a3aa8af6ce3b90665e78d1651c66c56a16c5e79438c1d5f4c0d03393bffd607266af2bb696d78701d6888b584e390789e1a1ff1edd6d6267ad85747b1302471ce97627b5d4eb49fd7cbc49830179192fdeffc394265516e536a7c9cc20dde2ce4586ca0858bad118b19f5c24dd400341b231cc2b6906630cc2c38a18a0c1d03a4339440c01d5c0a11bd6f10d8139a320071e96e3e344ebe82cd9d1af3d95d5dddc951b7d7515bff66d5a0838600d1d725f3d81ce1f4c2c272e6f7c4846703e53dcd26d9f982a4aa15443176b1c3bdb3a9769b7dbe3905cb28da1316b4c124908ee2892d99b5ee69fdbd43ca2784ac0e32dfb1e2fb720fc9518952a5c3e8242bd5ce4805e1b594c1782ccda1a4db3f42a308fba4a0d33aa9a0a17659d840266d388331880f12a0edbe3559267a5f3e78453a35df8a10986ddfafc9b56847ebc6b47b91e1d8f9c81eab80ac698c9bc6dd8fea13a9e0c5a36d68e13daeae3fd4b60b48a655dee21fd3485a0c0a122cc328dcbf2e5d636ed7a4383260b2f79f10fc6da42c56b30b870b9e0f16b8db8fb3424a7ba9cd8f252316418b45ea1ebeaa32af6604a511cbb803be9149eee1f72e88e082aa312d7d2ec4b06d0d2375113244aac2a6b24e11a3622740d1926a842e6aaaf995a5c721c0779f8f86625ca8f42ecbe7faf610af5984bbd564432f007b1cb2081884a38d6fd724c8a803db26aa84db94aff22bb41b2cc83bf5d2de5756926bbc94c425db0deaa7b276dd2bfffb693d07d1d9c651317914cb293b0c27d6d4a4c0a9e8723b92d49a8a1a469c14719c4b2d7551e524c2b886dd86591b6b91c43a6dc1e923aabd02c341094a54079a33549ac449a7aabd3278286bbed4621e11b8ff797cc283e6daad8b517ea272571ea72b8a03d71957689036748cff24e64d8626f1e3e5451233cc413c1125392b4e62825d4b559287d69c77bd610b7eed1d6b3497f88f745e25d73f3376af7ec36327b262fca0a603b5afc07f7207df6e515e34d52440af5f0d00ff961ef8de191a16e27dc91e99214e6641771470442aa41b9c65c46ed66cc1aca6099043e0626245587ad411ace2420c7c787ce46ad3acd8653f964b9b8b16dea4738daae6d30330a514bd8180dc0081f461fcd4e59461c8bef180c2823691c7a0d40a301e8360a8d86a1d90874da400d4275165fa3550b5428ad11e834064d03a1db08f41b424336f287ce86d54850c2d7d2634b04ba5f24867a908e3998d52b08bb78e5c383dfd3e474a93673a951843b739e446119090189769b16a92543511b2766a137fff72bfd028e36c05022b3b6900c3d96f29d2b16f432e1a814a439b8af2f7a9aea3b6191fd8185ce32052eb038c346b2c00e6400d2725a4463608d7365ce6c90b7ff4de888d39aa119a2956536d2704a0e6e452413a75a744c8004dc9e7810a833f1db9807b737210445d71d87d14339c692a45bb40f02a502b3fef7dd0c38fcdcc528eb6a3ea311b66549246674fa95b1e0e1d0ed8328731be6ea8f6cd65cc2e5a9cae1db65aada2956a32e35e62200c33f8312d34f8e36d4102265b2d28c091fd371e0a09a28df4701c486bd949f721e71ddd49269ee98b999448dc9f91f6154d69fb69ad728358e861c4f84f7f54299366dd246b3be16318e514bd53ec47405f7f9ec47a7ae99fcec37f80b8a036d61949cefb997b89e953dd3bd1ef7e15916bba8a8e306aa94ea84c301d0e7dc90db4ca4b7d6d5e5aab3fd91ea1a5c54b1c6478701453f41137b60ef09a5f814824cec297881c8d792c5ae076deb3cdf51fc91a6e945144669b83c317171b6d13cf74eb4a868a587725472910bd5b8dc07b2699f623a52fd68313ff3a1addd91d47e7d03230e07bdb5ef0650801093f15f79f17f54eb5788c9afb094fcaf9cfc9f5a99f55f7cfb8f93f1bf9bf4ef7118fa2f2ee14ffeb8ffebacfb6a53d64ee1bf4892d2d29eb61fecd9efdc5dfb2fb5fcbba085ff2f22f967d3fbf746f72f5d98fe8bff3c5c6a1c84fbdf7f056dffac9ebf4ee83f89b3c4ffcacbff0bc7c8ffe2127f9e9e7f6bf4ffc280c9ffe28bff332b461ee5b70477f67e06d532c62afdff950fff351e2bff8b0bfc3ba9fea135ff2f03642b4726867769ceffb555ff637801028f2149fe8b94ffc94b77ff756cffb319ff8f927e1d3873ffcb96988bf6e4bb2e751daa96055ff437e2485172b570b8390667923c11a470f0a43138b3aa0cb6780ced84fecba669a7d5b5abba67adfecb6bc201cf35807584d9733efd695f38db7f69efea23a5ffabf143a7a20041786f138cff2a77bf0d1338e13f34ffffe612795e15d532ba3179ff45cea1da83f6538ffd656e2fdc070fbd1f3efcd7447a345a11bc7ec1c18de8886360026c16b9e8ddac8d636a8b5ac2f5198eb64102a9f73fd1d612830d738afebcb5b8b139a1b2b5763fc4850a6d3ef297f39727a25003fe10021c2640ea88fc6f8454cabb38c6a1336542f2479ce890e054982b518ae8fb0f26ad64ba94bf1bc7b9062d889e8c48fdc1d6cb4cd1ace5189aeb1f8f611548d6dd315f07b3adacce0cede3cbc7f56f51686169c8c8345ced23933772bbabc6aa8722e82567ab8e075c0cb230c1676fdbc3241a7077392b756727a04d5164f7f622a00bc5a5fbbfa3b190c2a66bab8e011a2ec6c024023cf9b2d186d8efc9b4f561b66a40b9443b3137637962959a904244a7d2da1c3e38df8d071e6f4252e7276e8ad7d38d37998461cf494fb3ecbd9d13d5d2dbd8486b6f095d430760fb6937c7e5608abcc1b3f94fdbd93f83671bf8b14c5e88d6171fa6e2693013dbe64e3ace79a7db541f8222b1c770112adfbc0669355d5f685b42415352abbacfab5cf97454d7a2b7148a981b3e866385087b15751448a5bcc2cfb2429068627825a83d62954aae6c3bd53d8ce6033baff2d9283f01ca1f45f47cf2a7edeaea2632e3178ff67fe3f8a3bdb15a77fcf745d503e50d9d0e3f89aa3089086324fad7f15173b342b6e315488d4751896202bd57f41b6980a37b808d275d3de5486217b5831f1c63c14af840c41784b5112a45ca3f7d20305154541030aa6f618f23ce28fa168185762f2e41c4df0f14523351aac2ef3ebb3de6038f0077ea60b897c420ec1f98417aac5a55b48431a3ea078d82b1109d616637e5cfc522d477bb794a95f1082f958a60c48c4175f2a95adb4c215ac1fa1981a858f1cfc3d2c8b8666da2e3b6dd5671e662ec03c7418bc6c4212722c9d1a72b7638007ce5983ce5677055f051b6a5c1735c3117377886d5ce2ad20ef98da1bba3634d638278961ec2cc45cd8a1cccb0c0ddc3fc3a32c40d9a4f676a28690412df34af2465e3468e873d0229b7773c4e7040f80dd05bdb0b0e53ce94221ed226089df6b87db5fc2170d4d822375affed37a6436d9d8a6b9046d85670f148579040b58ed67d7e5ea39b3061031298237e28a041b36abaad5e241619e82ef8a74081f6aba88b2c4460289b0abd75a09bb6d2187ef81c04b5adcd9d1b91f7917422ff18835e1e363f338fdb16146644a138c386f0aece3b082241220a35e07f0b0668ddd689c7879943a4b6d5db8598ba312a5e30d257129a22f902ad5991ebe95563be466326157a91c2d53253f3fc1976431f88a06cf8715a528d2e027d3627e576d79ed97a3f1903dd69c60efa7c528453d9518d120df88cf306fe415b5dd5c05d204378a61a9a7729042826693c5c4021002968bdd3d3e0a890cc0982486064444bf305e77770da3f3f91c10e55d958769916bea0be5b78184601f530ff2e70f022100394ba7d11c9dee6066274fb98be4f896170aeda2befd84d60ffe9399cd264d217328c574a3561396c9b04dcc2ee2586a1382828b8524548f2dea58201733217695aba9d6c64fbf0a46796172a5406659c7d91a9229d963d6240a81e4b195cd45f09d5366af3eb4f402e67edeb5fc3a6881336ee9d2a6e2a5664526a5ac804bb662c3ae41fba8369ff5918a71ec2909ada78438fca6ef91b65fc5751da6ff449142e8e6bd3101fe6585ccbb93bac737532c1569c435a675396a4f264bc3c5bf186ebc6d511e47684455550ab8f344b19a2b016181cadd35f84d7507bd0e395d158681207ecc9f03529a1ba66d94405fef13966af3583167326dc8dbfa7de8c7dc6d1840a4a900a35691cf83cc5c9dbeb01331e5393f0cd37cf0553a7c75f81505024a1f466e038fb73006e792ef439a5e35c9d43556362b44ce3035bf9e942cb8fdc9818556bb4bf6410ceb9e91e1a2b1a28d815408c45d7d8b389a96d1cd2ff3a519725a267775f2946656c684c4ab24da62064a273f561d4654e54c4c4303bb9aea87aea3e2d7953cdc719fedde514d0e3635feef7a37151ef404831055139e995d84bde32e18dd1bb4ec69a800153aad0d25ee44273a9eecc28e015b2ae539c14076522f8145f14e21a2df408d8c417bae7bf5d94ee51e2ebe10421d8351ffcb0b35694ab2b5f564bbabfa7df47ef63aa100eb72b81e6704e2090328e5547e94079dacf38a65887350944d56661ba1282a916a6225d1d555fcac2713597121dc2e8451c97c23aa49934125608267bb78fd339bc6b436e259c23d7753f511cc4d1805360bbe12bdada2b08cafb878025cc5c72365b15673ad326a0305e675557523d09812af4b54b352dc39cff278762cc33c2c200309cf3f73421274100259a1c6fbfca5707bf27ac4f1acdad89e7780c1be40703bd80224afba6c03a57fd2ad61d6a1fec9ccbfc57622fe10f189831c94c8bdcacd62b27cab7b3925ef5738a85b6b7e340b367cf9c62132b0989837b13aee8d8fa0f548eb3adc519921eca814e1bbca41952b5bde79c7b518db9c4fde2a69b64b92fe45185f34620eef22885b4a143fee4ece91da5cac444bd517d5833ba1115283b3680267ddbd659e89e02817bd5750e28cea29a4a65f32c66b01b9ac46054b3ed41c9dbd007b149269d58be88581349485832bb2b0b111ee302d110d3b1fd528070f52d822a76abf10375e19f1f2e1f59d2ff2f31c850bafa32f27242d70bea093ab7745110f397b754e267c7d2fe5f7288c5f517d46316b759d11cd902394faac175da31651ec85f96e7799134fc81c3142cdc0214e51b4a47529cccd2d4e2203da294f8d6bfca8ea497a25aa4e027f4335597109406304c2480e43a609f00ad8ec681ed3d736028402db8123b30cd79376cb79506b1852059380d48db2decc6086bb4d6345cc8d10bee2d78af20bd05f512482f41dd4b211b2407d46a7305d5094ea2bbe921e2454c0f385f2726f9e31334ac2a9a09b285bda8e4a77fd1b642417baef274b342a7686fa42718967ae3731d9d52b44b769e700c23ad9797590d43174a83bba25a29a56373ac3cc6e017f975b7897e17868b70ab8778171446bf2ad0c7502c3358f9bb3612b9074e0524f4b4a81d241415b69f7c417a9cba34f01c4896a65e2538cb4916ffcc63a9a4ab9f180efd662571999cdfba1e2fbb3a784424cf7511f9b61607bc274a88d7b02158f7d1bf058d18f251eba03fb2c7cc1934dbc61a0cdf5cb2236dbeb4f3a88c285e1d937e3e10f086db02b7e4fec9a1cea1d15df3845efb80ff64080632e31a29a27bc8d78370d82327f58b8aa04a8a9355a5c73e5544845b45e98a0bae910bc1fd25403b7418ebb0e2510e5318f7e3a8e72515f6838e93a468d3866c512c347fd765ed519a3ef123249540202096706d9225f61d43e164757d4de18ba39209bf47b1127302b72234f226a6cfab4e6d06a3ff3e2d9d4e17cc15508a836094ca90ffa3582cd2257d0358041408a1f0aeae7f520064449aea8e4e1c235ad430f98eaaea53089d878ee9b844452b7faa6d169856e911bb87028a21426a4ac7f4bf37f40d5dc62c287b0b091b77077762af0ac3810f11d9a5b290e8163ac824afef3c6ce5b13e5bd35620c28cb0ada8e9fb8d01f8e397e9a510ba53c3767c0b9bd3fd61840947d11565befebe8ee8846dfb44c5d6178ccbae4f5d2063e81958dcd42f0dfa88c985bcece7ffd9ae1b99a6fb5395a7227ed323e7af75de773c0a76848aba7523657b84d605055c43d2a8c3bcfde7d7efe8618c00e51544aa2f023f8ca90544637d2d880a699340116210f4a89b168ea387eb6405b9def464e215230c927a108b0f63ee6cf872c609b2ffa6a4230fb468fc2494817afcf27d44ebe84c4aaffa63dcba2024b86c7ef5f1435330a01a0eaf7b0c4af2f08d0068d8a157dc868dc3b1558712d16fd27d547216cb21be1a95c638252de0194b08abc1cec9e30e958489e4543d0489e599358749d936b5cd9421d5b2c54ffa7203f7fb168265be6cfe73ff03221994b9683cb4ab2615463933266ac9af614e9c320c9b464b2e7e5ecd114014c655c455dbf28f9722988d5aa12cdf2f62262667129dac08696a9f06f12d622e0f173fd2454d4ff384df033b2db8afa1b6b039bf1ce91aa835866e259a22f51546c9feba8f72d489c112e84d85f37609dccd187c279c76bcff5ec25bfb2e1b59677702503c76262c127a2d6d9699cf8c02e294ee0286556e77b42a9eef585368bf7432fabb7205b5b2bcee6ddc9adea628d3fa21ba1a3dd3b4d3223b9ff39f30cb5288c80d540fa5e110fccf08aea1041f6531e5e13a816a26c9a1bf2ba18a233fdf4a4571742d6c226fcf36a34b33da7ffa44fd4323436f65c8bcab8aa4d5e690a369b46ac791dcf1ed0b67aea91ac7666f07e164dc812a17f043894f0d45f0d9897180a53bd57772e1f3a3f9b834a60dded1051a29595e3a6b9ceb2c77dfd2c86e816ba2b4e88fa1c90a597297aec79df4e8d1fb8fe93d41b40945b0e37b33618a0714889525789298bee8b3705a67e3b065a7af8abe61c273d98bfb51f19dea9284056c1c9c534263826f7478b1461d50f13d57077d9cc4c361097cbe10e649e319a25b18d7bcde92e4290a483d074b6d985f106c2f953b1ff7d3be445587850a64ce898cebef46fe70d5e78fc96db29545ca02d93c2378446ed31811a0c29a05f8ba908f81a957427f4f2ebb7348fe155155d2e1985be0144a7c8830cc0101218079184ea7bd2489a8d687c05b45952a711c81b624f500d4a697088484e40ad28ee783b3b9b21230807c99a20ff4b8f89d8220bb25428d81d89410d4096332f072555675d9aec3ef6afc119cfc41aa312bd19c827ed44a4d26721155b8d1d97ea5eb087a2138c5201152f54ef099e4f1f562c10059c5e895e084c42941764bd58243cf708f296422687fa1eee479e02943cb7b5ab4e9e2ec47371e95da452f0244341988a3d8ffcd364d6dba8cf139818e658cad0d69e7a67326f89f197ba6801705b26e3230c3ab7f9f59bba1ac7bd56e8e6ee47ae5e48292e06d0e8a17261687a08ea99c5def24e0fe19edf7494ff01125d41b7c95df2e8305d217137845d71f3508b1ef55ef5131140cfa0a12bb9d27b1a18581fc6823b33d5d811023bd34176f6882ba28a090b1e9d52d680a35d188742ff61f5617e83eed574518a7410607dd0c35676e1f777dce5fb85c9056f5345e2718cec63fee79b1dad5a213eba8be1e2812bc74ec3ad008192587f66d636a9be1a2a7657f6eabded6fd62d7587929253c9c40b718d9f6210395b35d4aadaee2161e60a52fa9a43632e5dcd8dbbd2027532419d397145e5126ccb07f79488495b7d863338760a723fd2511ec96e803be24b74334b60ceebfbe8a7880c41602e2a2d09bc87120210a5677140f240cfa6ba085c8f55cd51cda1caf79d560c4071585107caae29939bf165e1e6caa480dba8a0bdcd84501ec9102de7f4707b78a0a04a2040ad89b6ef0433706d85408e440297b2dc33c1b463489757dc84440e92e6fd71e4e3eeff92eb0363b038a57b58cf7bfd6fb80cdd5fee1ab128ff5815295ec632b20aa849ca859123f294a604da45825f7d35e8d458768e02e07ced61cdaa14f8923c43f4b203d3b53d31f3c41c20a7954630122b0f1b7db020f7d69c32b541925d90a986b2db539ead6f48eb1ab76143a23efd1ca5e202c106a67eef7cdeb374de4ab7514e3fcbf80bed755eed0ed470404140d2bf4ef22a7a8d796ad73f90f85f8669001e473aa51a6e2fc2b9b83c9efcaeb6e80402377b2f3f0341da3836c6b81643e60634f9839c90471ee4770b839a3a97906b1098e07c466547febac1227750a0e6108042702baa2efd35a6f45a3b8d5f31f37b206be43da1bfb58f68cb78ef148a2abd7a94d0fb784cccc30e4320fafd68af20259e89ac5d63121a09586aeca020563afa6920fe980afe81dbe7cdce64efd5a26da613783d21c64de3a5c5a85c33c320b4b371996e90f2167edcbbf91aafbae8123c3c206899210e7f9895ff0f01212274fd3ffeb88547609391646685352fb9938aa31073da2ab9e8179e9f9015d30004078ead143d5acf680238ef1aff4aada5576464d0a2a6103d5f0cefadfc5737832561c1273c25c37335915a3229a7eb22a706d2ab96016a4b00c387de2bab98f2647016e27e9851e6ecaa5d7668e69c01f701b4124e301faab7300906a7bc8ab41cd35f65ebb2af014d99ee9577657e5deae4d241b56c224beca5304e45cfd49f7cda075b4969d59bfabfb74728bc1b66d686512acec72f6df102bde91c43e823f6917928dfe51591d54fad949ad74b517c957d51b950b8a8c2d81d666381501ed04034ca54b27f5aed46207c4a37bf33abce4a6ef4be59583ea5fde507b3122e00a548541b59c06195abbe13313d42ab8534c8abd54edaae2a22bdf105fc6c011a9541e3bf070d0c434a7795c7ddf5cd4a59ac2836cdc022c9ae38ff4137ede955aaa6fcf0de1540a111365a945062e02782abd83522aa397fab8e13f37bb7e40bd02fda7d8efa8e0a918c0bdd00db1dc2a2a670f194d59118aac0f0d389cfc56384767d843344d51e07c098eaed011578a5ad3d8d3e3f63d729c0fb3334a805e924c51406f46c3db17c20f97ee1f5c7c950c3b9da87677c83213889c4dd4223f3ea8e55626d06093824116d93a77f06995bc05c031c0e861708d43c381339c4a4292e12201c75e8f07c30a8e714cef8aa4f3afb14968157ff6d58ca8a6da5afe694f927885018b28c458cb01464cfc3388f665be63562e775cc7180a5125f16db9f110dd19fd1bfa213e333d12c091dd70b541b330907b72b4d4470d36b7de9b4c2f3cd48a34cf51249515635d539530e94758827bd069c2a017444b8d05063e9ff107577e7656f82e2065a3dcfe3340c1b612f239d2a39550849e90ef8f9fe6431331d65929fb1a7c88b4ed660f92ca00d309035fcad9167f895a9bfec940453dc43cc02f7fa0ea05beba7a2aef6fcebb9e3aa1f682202a10e5f4c7f7ae485040b69c7481e06a378cc34b70a031520ef6ae4043a70b1a78b11b03a99e1566c87c170e9dac2c6ba4e116c3bb2f5593fad87f5097a0365a53b20aa650da7c222a5379280e740faa6630e17d9c534d10a7a136f6ba2a674ac43ef11bf14e0f31e94b65600d6649371107e969d7ae9e3bd8c4d36fb49a1b0fc480fc0a1ef5a8115e1512aead377ff7214a0e39f324c613d05784881186ce1f2c18b95ba01cd847133595fd9230187ae79a163e722d31fe1ea51bee6929078b36582ba94e26b2e81dacf5d7f81274c62f6c47aa2194588cfa632255a7e19af219fb43bdd64661f57698d451967c12fb474e47b03f1254507bc8955a57ae18e32b1021c8ed824edf047ae5c9dc70d6e2db92240221f82069857b93d053f7620e3897441797a78e5e0713ad791e6ccdb468d50b01c3ca8625089a650bccd85c961687011822b22886fe02d6a8002e43b618daa4fd81692acb5027c673f637d2c6fab279864c823b4669e99a2e9239cf52c2e8de61214cf9cad6eddd65458a0a367c00af2abea716e82e34081dfbcf4b84aaa9804d2b5fbf42cca2e7268bc4f50ee9d2c8077c1bc84d966fe726075d70aa74c1fca613b5f04bfc5ed0fe0907febafd244542e12090e981f5beb3fb7f6e20e08a62a96c12d69c7c409e50ed8292c69d7959ae5094c3a79ea6a50a296ac3927585ee3a002b60bce09296acfd563c9d231193090e070adb6af62fca4de46a2bc5d37f7c93680fc4ec184a3593ebcc616a5afe1a4a81f643d77742ca44b44ad3433ec2c7dd82c014c19ba193c5415286ede77cb557d873bd765b71f6f06eb9e5a6d71714c137ed1c995065236a508ca25b12f99c894fa63462ff4cd9c31b5459a5de069fe9e64866296336b9446db6912aa23b4cc3957de74aa6139956d3dbc0fbfc4fc4e2581d3af5f653bd6222ec3095abf3ba38e9cc83a638b1148b20bd2d140cc729fa7aa544c478cdfb49c97c978ce845b64b6b88fa13f3d6a261a88cd10034a197c735b6d2a658181a391b8b804aec2d9e938552e70fe0ca28a583cc35776d99e07e8b221d9e85cd85fa5b996be241771e4d2cc66e7ce0efb3b8b89c462e65ca376c169b466a23f18503c6b7f55c550745b693da3d11767f67f984c93d5b58d90d87960485cf7e32d9e90697873b7cbbd0369cbcb40d515aa95a7ccd61575947c27599f1863649215be2641f30f367dda0ff14caaeff7b45033ab2d92f1b9be5f62325d5479b7c2313b38c67ca9c6af2c03b91fad138077bf7e0fe7d052311d6a37586b4f830d01d7648e20a6ec20abdbb59a66f4efec40ef047b23bd4e5be9d42b959eb7e4c7307f8a504298a4726953a49e1a3c82b1ea02a0ed407ae63d9583d0c625fe5ded12d11e623bb102fb5d0d62e2d4241a2ce30b44d4a74c155f040437796446318e4eb359fd2eb959b64559a947ae35accda2f3515e9885d83150404b146f51952ad644099592daf847e8a4aae2af8e4cb5b13b33b1817ec8a9ede5870f18f0584f23a6036c456a3cdf41622b56e6131c37db8552421167d1c49bf6b1484e08e54cdaa62dd960f1cbe84fdd2049afbbbcebf4d3f2070bf610eaeeac96f82798979aa8b85d5bc80e63282020299462ebd3da6091f08931876902c5749197e509157da47950130b28bf4228e1f4950f8c09b6befcee281b87bdf0a2f2c513eac8d39a681b81357125208fa10c04c8c90165f1fc657aa0c9245dad2032f1cd528a810137d9e9e8be90438bf86dea29482d6ad9f30af2ee122a33cd017f9e80ca918c03caf202f567569bc66a5d90461a0e8ceb13a8f0a6775d9e97115ba2b80104ca74dbfa06122c08606efa8ad56bf86b59d944f1401f8f2dc5cb89dfa3fcf628f464377bc3ab0d60f7e579f3ab6c30f14ecf7042f9802e62246be8a3bf83dfc9d635081408c8455b668cc03f8e83ac4746faff3aff9bf1ab59fbf2694c8475db4e75a983d0afb4b5dd255417858186d1d1033c06bc41fad1188920109cae256212a693368c038e52a7b881473719ddc030dac6f8f891a2d00f1440da4b84512ca0c28706197c11a3e065490376826c0a2a66d19f33a06a5928dbcda9f4d74c488a6f44daa43f536cc65a11f049b8c4292f2b1091ff12b84312037fb2987959ca47f9a5444bbb1fca29ebf3813e7004af2d59dd01f0c45bc8027c3da320c402943465acdda630936df4e62ab018030832d00f3b6f7df8ec0a249ac4b272e4a005560028d2e245c7f5c60957ffb88b5c5b78250e0e0f48a2051b8d106e7ed7534e72f91d9b7ee880a2f008acbdaad82a11770956ea8a6f7ae85148c8a77466ea0e19b1f7bd011e451133334cd9a24d42cad6468acccbbd4baa1dd7c51ce8d6ee9b4eaa438e4e1fbd084c304c55ee3478f579cf5d9148c06871b9c6acbb60f76e54ceff11e07f93233e6926093c322ddf88046a3f5a6526ede3a70401fc66d3e4ecff1c09a2a904dd70f345990584dbc6d6958c2bb7a06321e63879c4312e9fd41c903e7e6d885d5c686ef25f970762542b745972fbe09e10cf612a9e6b56d171557381d2725f800c4fe76f5560f9ff9a8bd3af3d934e65da33d2f294df80fc71f9c8bd7d537b2363ff73236e279788c872af1ee8ce2d2819573720b995ca3873e1f8249b22e88fa179a1561aefa9057f693a4fb4f22353778f5387dfcd9d5321ff2a58344dd06abec0c25ebcbe23083c75de0338554c756db432f7fedadfc7d133b96388169e23a7d1d47d7cd7b49bbc13d2b3f65fa6ac2368fb95cdc2394f934dc10708b8e3435e5438f0d618f882ee9c2aa8ffc7ebd1ce7472c93ccc007b955f0e3c0a8837021c66ac97091bb1062f8ccc574b6b78d9a939e8e8c3bc6b2288c98e131863dbff724bbca94d46378324165d87eb5d3a0862d37d5c4b35dc32c7750f922a503df8010e08d53d186d5da7ee6092b0373a06d95b2d31c297b037d0a3999ab3ac8e5d2e6181bb09e446c8abd219f7bda45f140ebe4d69706d275dc7cf83ac042b35f9218b21ea5d9557b2ae8b4b88de69b03924452fd6008cc74036a818e805c30d61da7036e2b2a8e388b3729257a04d5568413120d836f7fe6e6122a48445a24a49d2751048aaafd841265d853e57c3d7a6538c3795a10e2e521f2821550590557405ea2758c95ffb517eaa48efec57f696defb626a59452269902af072508c2073b76ecc861661089535ae50a35bd424e0e13a794524b2337abf4975eecfc69942e193fbe949d247bec72a4fbf4f86e939b33012c8346684f0f570f263d7a7a7ca087ab874b688248e86c325db387e9337dc03825d76a679445a3238892084f9df464adb7d64b2bf596c998a3567faac54d1a80013187779ed13b1afcf35aeb37e7317ecf2836a5bf6fb5ebbd0cd0b3d0184720a1fedd6def2579f66507ee506ba58ff4d94e70bddb6fb507ef97bcf8f4da7bbdab79162b5d5436c13f70a29d9e76fd767baa3df5404ae94669f4ae7f718aed52778944fbadd731c77dda4559b69d27a5d3dafab69b5d90cef3a9243995525f765546dda9532adb3f69b3ad7549a694d6ae3ea5524af94e65ad2f65935aa98c5426c589094e626cffeee4c7ae35dfe8cb26fef511bb24cf7eb943ccd12e6572879823beb70726914dba1c79c4e6ce9d9c54c88410839021342e933b3071c7416684a669cdc13429adb576cbf12dd6812c493891040f7890af0726c9f7a5732fd84cfa982547e638a9039700b9be496b800845ccd1c9b71dcc3f1aa18839e8d74f12b3f8473d66d1e4463bffc855ef88cd4e3fce1d52ac3eb13b83e28280e383465059ceccce334bc62f0c3e5705065fda6002617b463b3f850406bffcdda8b27aadbdf8e184ca17a6b779d373a04dfbcecd3f5531bb140f3889bc117224753880632b897f36588063f8e42d79ed2b39ebece9243442e5e3bd8081c1df9c0158c4c4bc8c8c8c0b172e5cfc4e8681992e60525d8b984f753b19b7887916319f2365bae91fcca35ec838150a8ac5e9d7efc60199912981e6d2bb3be7a4b4567b372bbdbde74f6e6de31a735776b777d4677a634eca52f8846cefbc6b550e70f4403ac53b1407a45fa65f86058bc8a25128ef58c4af29e55053459c56867ea0f0b46458a804f934d9328b5989f2d3c39345165271e273b4a5e686a68536891fdbbb312b517e664f165948453a39da7225068be24cbcc7288b50189d7039ba5243058eded750811bc86c1c5facbbf11078ca29a734d5c4dad22d3511a1d56f9a2e667fada60a5c6bad35cf5a35ede705533d3df002b94e981a2a708cd7b11cc28c3d3a8c0726c93ab9be0bf2e6d2c41c2f9ee4b4adc334d14701a610b824632f028dc3887ff2bfd293b8e979fe18e0f9ed369a57ea2810c16b84460503cef671b65e10ea79aeea039aba12e89bcd8baeed9aee12f2f45aaebc1b3a3791670f60e8d57cf92ec81b09f46afebc21cf77429e17c613302ac7da38e6771ac0f8aa10624aa3ec90d01c7fe84e412635893e6cb83d348e0da9cc43e38ca0a32bfa28fdfcb843e3683f83348ee64d20eda3e4c5ce517fb290a791c689795edbb7bf6abd5bbfd2ce73d3cceb9589a6e1f86207387ae094b9e6e8ddc6b1a395c19a79aa96ce7ae7f6cafd1685ba77bb3f3333ddafb515d8b7d7624b9726b048eebf292b741ce1f81bd7820a598b59729f380e88fbebb0026baa2a387a272ec84c6efff0cb09e6babf50b38cdb8b26b04c6eff3e2d0626e605c79cae8d898989a9d48529fe8c8ca8d925d19fbf7dccf3e60976a46dc328edb9f91af7820e186a481c904a7a4ddb6a1773c7bc6dcec15093e7bff88182982be95ffc408125cdb75907583be6b8b3bdeb4d6fcb52fb5e2caf5f7f7184630f6884264740deb878fa35c8246ef3d2e2e947fa2dba1fb8cb41c1c890c5c37c4c4c4cea77728b0efcdce27107d290f1a33a161d184932df1c867916dd8e8c276d1073c03caa03bd28c37c8e8ce9a67fd86bffb0e7a26b16fe93093f877ffbf69be92b0ce4c5bb3732f6eaa933755c07a6b2a6f1c0ddb67928a7af8931eed74edbb6699af63bd93bf0411ac0984daf75dc37b7932577fa1cb9798db1941f3d0a1c49928b20f968f2c023366b9e8af49e8af4f1643df04fa50c6a0fc45f3b82c43f66fcb23b3dd6809c4c5c90ed8fd86cbaa523d60699e5fd2336df0d48e9a1e0fb24396f0d7d41cc03b1ac426e1d84c0276bcd0531bd7fed4c7f3bdf4aa4fcf2a08bc62f1d07e4e5b5582a953e48e7d2efe4dbd50ea421d79fb2beec7672f529620efc39f2a59bfe693d4fdc774a06eeaf7f9b0d476ce3b826ef88cda5a7a00d32973c30e6bb1d895d3af707922297e3d70ebcf314670b342779d107fd6e5eb98a36efdfbc9dedd577e5cda9578d23feaa6d647f31462ffaf0cf6d3c4ff0cb327a2d43fde843f5c283d4eb98a3630efbd68b39e8fb178bd4808066db50a899997f1a1a2a47f9660ffc6c63c64f422277066bc01b2f3fd3320625f37d945f3c8bd7e2869fe3384e2b956660c4e88f0183e370b76c926f60bccf7c2906251323060c6f7bad3b163f13bf4906597c8b162d542a954af53bb95fbce86791ea77f1a273998b0e09cd294fee1073b0f81cd9a2ebfc6e13f32ef311bc37dbcb74b7677ff6b31e3893edc378207ef1f0a9036fc440541743bdf07bc4df8b712ae536502474c6dde904668ccc44a9b971e3fb6a6aa847287eecf8f1a37ac0ce0d35437323c71d3f426fa116f21474687ab0e647761b2a926a77a87b0e3768beefc68dea110a29a79c31bfc332c53cca24a3837a9922a637bd4906f92761fe499774b5a40c8b169145d7bd92e9686ccbc7a3782516b98dc9c358bce25f51c4d2954a1ca7c9d3e9f4413a9fbcd39b4c27ee05c604f39223711779fcabd9c1e3478ea1f430cb9732d6e24ba89794c4c2a31e8f1a49438ed46a6a626c4b9635f827e57b1f5fba94ee21f692143c2e4efdb763874d38c230fe1c897175694da37591e5f3629c4a3dd7040cf610adf6efb776a5e6edb0def43b2cd2f55407d0def443b437793a524aafe395bc21da9bdee4e968de0e8bb4752d3decabf81bea5e52adb5deca19a0ef95ae4caf7b40f43c4b03a29d825bfe898a41c50dd5c5a126c460ac980e45042bc7743adb1058318f92f9984e67039415f34b66102cd4cb743a1294302fbf93f1efe4d3ef64d3ef64ee77f2b643fa9d7c7f27dbdfc9f57732fd9d3c7f272fc13e20c142fd64027717d56dce427c98970e77584aa41b99f8d04e7ad7a78c4c8d297ce043357065a7edf402138392993232d2a38c0c95b5a059a896ec9fa2462e5ed0996aaa54d2a38acaaa4f6d529d549feaaa50eaabbaea5015aa56ea500deb951aab613daa5b2a977a546796c7b6eaccfe5828368afdb12f3bc5c2eccb16d92b168b2db2319bc5cafc731b83b1b99c34bebca16d48fdc564ab71aef84d0acb67712dbe257aaf5158100d8768ac0816140ecd8e5ad575a73895c96454ae10b692bae258b83c3d9ca293561b8661185e97cbe57291a88ccaa84c86b6719cc9743ae197f9f2223dbea0326dd11eeaf2a12ffa738bb02c65f4b3efa8862e0a73b95c2e5750384463b468e34ca7300cc310bb5c2e97eb616250281919162c5aa4662a253da662666c16c98c6647afd7ebf57ad559485b61188621eda12eea435ff42706f57abd5e2f19166118d6b0865dcac58b172ad5cc0c8c1833460ce931064c9e3f1316f4cda1d9d16cbd5eafd7eb5567335667b35b64343b72f1e2f57abd5eaa3aabb33aab330f460c1932febbce4b61a69082f498c24beb68f64c1f1b7bcdd7f7fda75218cf9f099b41339c433164bc5eafd7abf35248818666c60c1a35668d1ad2638d2d2c6a49594b1ad9d8ecfbfe53298c3da77ade755b9e8d5d5ba98d4d7f1a9adb73792e93db735bb7c975dd5396aedb92a18b933159d42d797361d76bddd66d65ff1917e6a69c236fa44baefcafcb4543baa4d4b8249374350e7f18d2255dd2e56a9cbe5b04a3a0028f3b5ad380b2255d470a70942d1e8df417acc92d8bae70e6afd8a4d55e7bad2b86337f4d5a6db5d515c319add41dac015b36e9a4d135dfdddd678d16e0f8eeee5e53a305eeee8ed3d7895643081cfbfb6b0881e3f7c7d86005b2c7e6abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb1b0808080808080808080808080808080808080808a81b08080808a81b080808a81b0808a81b0808681a4143e50675220ab42827ad765a2b3d5a49abbda44922498fa4bad54b2a69dbdc36e9712b6da58d339df0c4587ac426fc0213839a2894f4880a8784ac0c855762e1ec680b97a319e5a1ad594c4b868749f667d1d3a249f64fb95c4c172ea44717ada02954826042214c1ac92c528b349232b945cea4cce5d3c4898f0bca6b8642feb99c4372ce7925fbd319abb356e9b1ce5007140cce998c0946a9542a915af9e53f0ef3a05918866118c26030180cd68ab55aad56cb8b5ce6463ef3230b83c1603058abd56ab55a3164bcbcbcbccc40cdee91b7bcc7150ec58a6461188661e872b95c2e9794c1fc0583c16030ff719807797865188661e872b95c2e180c0683c1de633aa0e01931611c8ab158248b46611886a1cbe572b95c523693c96447def21e77b98f75b95c2e974bcaa44cca3ad50c0c183162c890f1ddec3ae9b183715d1ffc4afd3c2c7ff11acd8ec2300cc3d015ba5c2e972b0ec56291cc280cc3300c5d2e97cb25a74b868cef3acf4b21059a1973c60ce971c60b0d4773369b61747ddf7ff489aff813613128fc19a6e0a540433363060d1a35bef97dd2e3876b2e0f1ca686e6ecfbfe53a9d935c2b187be5e7366677346e76cce999c331a9a2dd257ec68704162ec6afcd4d8624781f97141e216bb15ccc6b461437ab4714daa1748397e94a75876faaa91ee5d446337f531a7313ac3949bab1145a3c179cc6d646aeb014af0a16a41e61d8da37b60ad221428734a2822c0f35f5082c8f2391f0c7e710681217cb032c5103e589182653d9510fb3bac18ca8f3df2668725df7649b464f93a6e83c3f89237cd92f1eb11c4a04c0971e0447e0d79204f221c08c91752d278e5233dc91207b90ba28888bc49d27d5424a3f7611d2fec38f69b9b61b2ac872e9031c39e7b86af8c198eb967589a726b521660464dd268e1183778c9a494f23f1aae2dca311ac98894ba21fef9023a1ce0a741663d6a4411d125bf3999b8db95339c514160f7686e1d1c81c4911766964bf2f4542dd42c5f7aee9eb8dee5451891a5076252111aed91ee5e8f0ff460d2a307d638317af400692de58e0cce9933a79c72ca504a49a994524aa9e55ca11dcd6a52980ed124a8100d6912356ed334a44374688bbc194412ffebacffef36ee411934e2412fb4641089ab5e2a12a87c5e18a948d02f8c542fd58b1423d5590691481bb34b582b76c82e811bc7ed908dd9d84bbb118a288bb0e936ed020de6c3870f1f3e7cf838d19ec6a93e7c48192bcfbd3be69d3b56a8e9157ac7e5766ea44ed01afc3cfa31beb5525a79a5955e670f3107fd29e76c927dbaa8947252f78eba28952ea564f5d722687d53d2b6e7dce7bc5e2913c9bd50a97b4fe79cf5b5faded5779f3ee78cfe5d8d10054b962c59484e72bf101ef266b2bafffafb8d006eb0820914284c00718065e3891ee8d0822b74d8d2040bfc620b68f02a6242103f5889a2ad74808916132b41a072f403fd8112563c1982478a12b0c0043989285c25b062022a5010c49322f4f840020e04c10a0978809f900f3e8e48c112a01ce123840e44705283032cb04203a10c8040e43345c7119c2c9101275e270865144e98810c7c3074031a4811d42be594d5da2357f810851c6c1142122fd8f1e13284132f2c4988c209a411dcd40b92288a519260424b12b194d08e7fe7bc59228ddd9d78d2e833d4082ac767424ea63f677f911a6ab2f48cd4ac90bb037574c7296b9612531632d82f9b7aa0e7f9b3cada42ecaf903d6b75eb4eca287b641eb2b3d958c8b303e54f9f43e07bafa7b38465bdb9a56d269594c6396fae94524aec84daf5fddb994bdc5d035af7cba65fefa473ce26b4f6fee836fba337493c8106e309f885eae409ee584904be9fb4f2a260f0c793474d07c2277e83eb81bbc30ef6a6a06031e064891d58b00408a68022959ba84a145598689aed088c55e84069877fb186087c63e7c859ea8acc2fe215914fff37afc87d6d76f26bd7c160bf345193e45d9a29bdee46879acb2ab4a6895afca36f4bb86fdfccb7d696ba684489b8d13831eb481962fa8d7bfcf23af85baeaca763fa93d7de8c7f18c3bc7c25a69f0f83779f3c25f8e5c3fc09e6f4e2a9ece96778f9d3e99570ff72fa194e9b9017afe65bae72e40fe1098008e1c19e8ea927b24c3f430696983c2535fcc9a341ae4e2d3bb55a3dfb017b2afb4ab8c79ee95bce60fad39f4c26d39bbc254ae2ebf4d83b799fb3101fbfe9c1e8327911265794fe8f1fe6cbe7c161bee971908fe79b7ec87c9337443ef654766b16d7a9ac2784b334e22ece70c702ec3e2eff287d1588c0f4a3ccf454c690eb36dbf993be88d5ba5247ba32f85b2fbeb4a0499f762da594b2a5941bc6dbdde89540c4e036f2d5382d90deb5d760e03e6eb708f751dee8481982875a1683df4456dfc428932b8781e9fcd5f90bc9dac723f99d5e7e1b89473e78fe9678e49f3b4c17a65218c4de7c79b9eb425d914905762b7ea549108ff97785f0e961de99bc1c16e7cc6772e53379237be4cabfa76726a5d05048c541f9922ff92361728aecb9f247be64cfcb474a28fe79284f1ecceb9c1ec3783a30ffe2a9eecbbfe48f7f530811b93a75a77ff919601e7b4af0c3fc8ba744ca10fc30af0463fcd85b12f3f85f4e9e8e942127ec29a979f99387598f846943081cffc5f31e67c171cc9f1ee6c1cfa9f9c2a0984eca7dad3352f3fe4916ccf4be1a2570fc96fe9237fde33c28eeddfa38f1d68c473390c0adc609d2b9ea4002831e128129058274762d8dc31f06d2d7f7d7ac944a0fce5ccaf15267ea8a90bebeb66d9d0b5181a3151948de9598514638201110c2307f7ace033d742c514635fb0a39c944bafceb99cd2cc7d90e6b9ab5cfbde6e9481902f3a7c73ffbe6f42f0ff3d65aadf370080aa65fed16b916863819b88f5e49db36c9c9509f1691ddf61389e7cb79409c8080f9ad030283b2c78d3c8b96c669bfc19e7cc178add64bde38c6d77f8a8e23b007c15e2fb7013dcca10fc99b66b5a29013ec431efae72a74006bb247ba667ed4755b8751a9196d8b1c0cd75309f150aedc7650ac0d28987a0de34aa404e9ec8f831229d4038180f91962126050a505932baf41aefc5b4b605e493c7dccbf3cd8b398172f86300ce34999de7dfc606c99007b118c2e2c5732a3582c929ccbd8800cca4f8e580a1c8b704fe3e0e4fab52b88a7942f49cc2ec262907fa61a601999f4a5219ad0410f4de0605405ab7ea94b2257f5e7cfa03dc9f366282991dfdc019ac5739ff4395e2a59efca15a94bc955353d81a3e7de2757f5733c660798be7ffd30575b6d558107833c72027a557f08611172ad4bb0d6aaeac721b7b9e2362d8b5a222cd76a25d75aeb51ae6f6757c9c14aae1fa7542251a8d301c7a118fa57ebdbe81262d99d428b41a3b902d3afafd54e355f9b3a52a637e4bee6e9707f3d25a4afaf73df7a4a94949efe0e4b6b4e7ab6e33c25dc5b255286706f5f89e9ef9b9e6093a78aaffd7dce531d408bde10edef6fdbdb597adb913c062993fe7d92a792de10fa5735a4da2984e75a1792654d0f1981e36ad5dffffe1f6b3ea123d0eafcfa028d9c01689619dce1a4e77987c6b883ac663035ebb5f7dad21030cd4d54e5cabd81a80a0f3c26640891051055c18126233751959fbce526aae2443699d0541d3dcf317b6e1aad71447f8263ee6f9cce436453b81083902129274541326b89305fd6dc8d01336adef52918bd79b3f540cff64b9a07c6af3f3fc62e5dba5cd142bc5e115b372945867f65510ca12e0809721b1bb8ec018329fba939b59fee46bedcbd111eb97e24fd9cb18fc710377fdb1cfc52c9052d027992ae68ee051e197421cf23d1ba67e4c3800f56a67822cf9f008f3c6541d327df998cc802687040cdec01e36094c3ff1341fae44b939a61023b8bc6297d300730f87df76e180a063f17f29f8e92b20929a59452ca4749773f7591f42dce95f458a703cf6a5f8146b2ffb4a42bae67c3ccd5562f94402a1c6457c221ec681c199f4e15f0e89e5703f843df41b8f51c020637d29764c906ffade70a3254010671e9b1db809f7be08c9df651924aefb1449a2d1a65972e5dba746e61beb45b8dd432730091053481c1ce42f3dd70c0dc4e5d30984a19ddbbe10c603095ba17a73cba47f72863f021ea6e4f6024d22d03a28fce310281efdb4f813fb592067ad61e9c597bb0861cbf3e4d12c6f995005dba70c9f723b893afccd7b38166e9d9e0397a45e64b3a8920422905d2d1769d4d9b521ab3382d81133f720a802212c4cc0f3598a69637d7d4d590c12996751d7fdb866b951cc77d107faeb4936dd759eb90cc5caa371ae59b23678d644c6b1a1c59d76d2896dd2757eecf83db82c12e1a722106213a84c02f8fff7e091bede04a6ea2d8952c80dc443111e4779bfbee5ad4e284e1fee9835c920ec933e74528620eed495ae9dbbf17dc5d2fca025e8302bfe191227f03afcafd7388ec76e4db351110a2644ab2d666d28d1a1d47c20aa468b1b6a7592253850a6b7b29ef4fcfeef3fe27c57e8c510ead204b4f0838870777f743dbc0fc712481c83374c03fdc467a35784e60b0674ff3dd78b066478e3f83077c7f860f26bdf69a56e22293c484a49aa84b987d08690599d40591a49923b429b9898a82b2d7e036e02711b26566d2931bc902b7c8334307ac45ee769274affceba9b010795343cb591527f9c6597c218de3a4289a04d1c8b7eb50ca4fe6eecb4e4a17720cd9da97b10552645ba5c81b192e211121fe996018ec590dd1756a822b7b4260b026dbcd9f48e3a85aa839fb2f8086c621bdbf034e3eeedfed1b9fed9e60d9adea28c5956bd0b9c255c3338b9a74ac7b4b1f4d193f556ac6bf1d35312563c7544fe39fff69769ac91b21a7d969963df6354e6317e9045ad3802e62b97fc60db08d5f7dff943c5c5128323a92531a81b1887c54d4c2c76d543db5a800742e2f6fe6fb4166be3a9880417bd4e336f7ef6de236d7e3e2369de577eb48026602660323968ddf6195522d57f8a94baefa3bda3add6bc4bd290ec5999dead882c1f8207d714f5f764a8e0fb6b0475df0f4acccb345fef5abd004df076d91db5c4c7b729b3a0a4c190566b412875252a2abe29892ae22eae35fbf00a6e850c38a28be99f3dd3d78ff412c2385ef96b62800fe82280a4c9cdaa222b751b910837577f74c3f8867da47b8210332d64c0758abdf61697e3d00ade61294bb284aee6ff0f2e4fef6eb2437bdb0dc6f6d40cf92fb5b25c43fd2938eddebee1e8b689c98fb6b38011391ab7e5309b0ca3fe777580a20c00fe08708e07304f0ee0d21c00fe007e0e910e077582629f0003ee7c17864d46f8f1a47e67e1661e3b412391ec957fec97daf0722a9f9badfeb974449d716dd6b8b6c51eee9236f5adc8b712af5d5b4f0401edde24ae368d5101b3a4b5c871e7c802565c6df781bbfc35a75aa21abc7f1383c1d157ef53b2c1d55e098fb2f4ea95ce078fa00f8d4e7f8167f53f3fdb7fffec81b1ddf7f61778a5f2a6e83fafe1bca9b007cff1d729b98efbf56fc66c7f7df2b6e03f3fdb748deb0f0fd5776b3f88dcdf75f2d77266f6ebeff1e5d2e7ec3e3fb493ca41e79d3e3fb492eb7e1be9fd4c46f70be9fe484f492373ebe9ff4f3e3fb4953dc86f434be1a2d687c1f8d1761cc4114b6d8f8d5a0d1c2a7bf85131a3468d048e233ba194fe36978e00c4ff502fd193fc303532d7e27b3f89d2cf33b19f53b39e677328ced231a0fbc3705cff3624e6709d0d9017402e8e2d17b2096e175c3f0403ce381299507fe0b0ffcf27d171e5893531d9d427ffceb6fd1d1b0a356fceb97e9685147b3f8d71fd3d1997ffd301de5d2d59eae36a92ffffa4d5d8dd2d5a02a5463158b7ffd3fba7ac557fd3eba3a2457fd385da5e2abfe1e5d85c9553f8fae42f155ff4d577de4aadfa6ab4c7cd5cf42575b72d5bfa3a35b7cd51f808e1ac955ff0a1dc5e2ab7e1d1d8dc9557f4d47857cd59fa3a300e868145ff5e3e8e84baefab5962ff455f646711bd07da83d923739662d9e2760c9fd97894bdef09c6250e8f1719be90407af0bc56d9ae80942b9fffeb88dccfd1766493486316cf1b8937e7f3914b7995472bfff7814b7a1ad163ef7b6f069e1939b524a41fa5a75cdda3ad086b95feb401bcbfdde81f146a7c3e28a076247ac25a8276c61d978153a9d6d88a5b301ca9262c393a2f26feb13c354146c8f2c177b64a37bc52254b1273251dd2e91be3fbedce667d5352b4ee982883ded2e72eb000743e4d8b247968b7ffd9d12f8ed51affafbce4e651d20f1cad103717fd3b457c4456ce50078a2af26f481508713d85f662d4af1fa41148cc2de37b0e20430d6d669472c4d8713980b422395b2d0b5cca8bb8c35b80d187992f038925944ee82b894c6182391221e313291277438a14308b87206a89c0cb1870c2e2942b62fc411c8103ffaccae715d33818420c8585ba7f28165bb22f16dfd9137ed040c46c5897cf0cace034b76eb9155b59ee5dc203d01db4a0afcbbd710113255a56682483da9fe2080074b4de368da6bded3744f7a7ee28feca13f3fd933b900c738c33bd0ee6e7953ba2175d7803d727fe7b953449e1f8dc8f7ce0b3620cfa775d29ac43610a49f77567a64092a4b5a29e560b0b96ebef2bf4cc0b32ee1a8d680061e9082082025a620814b091958028f14a02a551c310512a80e3c14dc97dc444448b04dd0486303c02ecbfffb5d9edf65faf17311fad33f235d9e125391918a483c0891482f57c2023d2ba832031f0f18c1072a5917261419010b028a9f120f2f80219d40ca9c87bf32d845e057b342152596102208212e432cb08724a0041c8640e289236cf00316d8312c3e88a0c8a2e52622da41136e8e0b0570d2c56108d212851610b119e400068f112478f2042980e8010f1f28f1e0834d7095c849ec80871e7c9a40a5080b5112587c78b281101461072738403485e827f53359f016d31146b861cbc0e6030811501384e8e18708433420063ff881080dcc6240c50e3fb0423b088154021e2bb8311039c93172132d71c5125b5247885b94316b73c6196b673d03c4e9dffc5a63a44392873aa40123a225b2e41cb98974309435ba4db7e93a80fbf2697dea9c0cd43b9224470f881e18acebd1a76f9f7b81c210a5b7614f029703062f9d53ce19141483291d8318144427925971b8b62361b701413a27fd9e1ef6cf41235bb6e0259148d6de4b64461a3178b9c611b3378e8d82358346369b83c682062c68d0dded050147f92f1cff3a8d0c3405e5e3d8f582807bce5a2914f259bc20e0862bfe75eb8861ff6e97eed1a8ba5adc90d4ac12725f47a674cea9b5a424d2c592075af7c04eba6f57f2b66077d2d39949248d448aa59fa52ee62091669c33a04ca8948df635350991a201000000200073150000201008860383a15028498359731f14800b7e9c3e6a5218ca234996a3280c8320849431c618600c1802403332432600417652408e9e5a57a18edca51e9bd4aa002a841284718d62085db891d1b4932b0d65d852b70e39fc1e61821426a5d4e52f18ecf670760c2f5e32e1e0b36f5e401530c04a3591cc82adceefa52a458e031759c681ac48b32b858f4658be4e9c56b72cee175f0fb20b4cdd458e9511461953c26b107826ee598afffdb091c1396aee88da6761bafb00c920394ebe589855e803b79a6e0389958154367bad5c7d37e3b8d2d66277d5a1f6558e764e501f2f4e8f33b7315c6e17a714e4d94054683ea6e085b8c12cfec5035e662615759c38cc6267958419faa4835fd68f9f3e8f7410bad72c8e70dfe2e6d6a3e1cf87ab83b93df800ed87bda88893430f7b7325d95f3dba511e3138aa9f03426ae700681db01bd89f6ce279f3e704ade989daf5edc51e67f931340a1ac14b3c5a745431ed30839f56c2b4a7e8c5299ec4e4663188a381f5ad03991ab6f018368cc8cf903bcf3282273ca77b9ac62d9f28cb2a5ddba7f4c08365ba97a530d7d40d6dd87cec500234777c129b326fe595c712376b1b7243aae828aac8a78a066bd261575e2b354fb083acd8949008c0106732e6315eaade8c94e1122f2c2a212d73637e5b9e4d30ee730e604b2eaea7d887903743001b5348b1a80de5a58f4332306402277ff62f0ad25a498e7b011acd2510298392a4faf167e1fb5b972eaa42bc289e07c180aeedd2784ad945c9722384d604a5f8a9a22f3533d83066f28e00af8bacc466bd3fe17eec70709f5b51e334ff947634049d1d8dec56c23f78e9d2786f175dba0a4275200e7c4c8a3bb9a9318de6493b24bddb12c386f41e97a7bce667244bc3d8dfe53a54bd4c909c6a56d8b598bc17ec63591ec9940fada5538d5f44cb83fa332338b4f63995b1cea5c0a5e52f0bccfc99e14064dc8e7918e48967353bfa1458361d401006dfa9b029a12b5ea0b616d6102c975d9187a5fcde717ea7ec96f0a815a8a7a7a6359fa7a6ed71be7470037979876a76929365c1fd618352c22a7a8f1a9dd92f2215a701f2a64991db8fa261e106ddfb8773c6610468c4755db60ccbd065268e325e1560dece671846a4a3138ec4f6f28ff3b04abfef0e438714e38a27157cb7f7e4f13edb9cf3ba768f6042072bb7a23e9c1e116be3df40f258da34c0d1f0228e637a5e728f32442150b7a9ed67b6533ecc2375bbe864da7fd27f725d47ad527710c097a6a4147ba3f92dbf2c7782d9a3de53827c9ff43b50018c056db56aec94abd8a9eb558d1af09f4fb2faccb6d2b40466154d4d1871c3e5c18d9e076a988a86a89a2602738a9072c71a3a6c05c5ad2d8f43131c2c207b8eef5f170cdfdeca27052e6342afe0738d0e858ef55590f53afa3dd8f969e005ef6e3f270d00d0e4d2a282b7664cbb7c5e57c2da651a46f822a4839636f1d381b5f970827f2564eb59cabd129042c56f4971e0dc6f64232e4b4b67f17429af83eaf36174e551d0f203471695e799f7bd420001681733d2762d9c1026c1b61a8ee5a785c05835f33b844594dee556a1822587672255607fb4c319921d3d934f144206b2d029212a4cc4fb5fc4d1c506b428c06dd4413e880255d523302ef379a156aed529fc270aa02b895192ad35980a1526485344956224f92a584b5a444ff08007b1e2ff16a7f667108cb19be2ad0f655f4185062176388604b3df9270cbccf7e75a03823654cc0b21d54b30370d11d448f6733eee6324df21f60db8b135022556beca9d0b1c685570f98bb7b5021f44de2229a1597831819249e398589b7452534d47c9696cce23b958fd3eae888810d007305ff2f2800662c0c0158a6e5ba634bbaf81a35c8c0c0c61b3e4f97e601d0dda4069f1f45a2690e29288dba3b4ba3b632dca5bb9178c390c71f8db63c846dc6b8c6b61d7c755c5d5db6120cbd19a48ff7ffab909671a941fc1c38c460395c5b0effb1b74e4e3f8d989491126ba40ab6c8c210ee723b1599fa280622248999e46cb9b43171238649648cff91fa6b6f348ac4571a8ad94f7d944975686759ae1a783435f88183c621d0d1b7d68001a470551f1b4f09fdca6f16fbafa9a02c9e28015c16b00b39212d1e917659034db367b7add3eca9489603b84837a0275a4ab5b54610b5d8e87017ee608ad68c43c09aeacbfc51943a36ce928ab1962a1ed5f2e1162624f478d1663c70d7fc405520b47057b38e47ebd5d77b9a5d39707c03a8c941f75781419b0db62d4bbbd0c37e9cfa7dfaa9d9d347ee19c39f93fc052fada4ef816a48c70141b26edd559f4e81abbba5193cca7c5bce510a9f7ba3f331954c11b58f7e10aa0ec8be79f7fe0f4acad2b7a493047bdcac0f4db7f8bca1b24c40638978b114a5fa0273c364d17d068700641ee598a2bd7a9859efb48082a712d195ae3b1d0e87b0a9b969d870ff7e2f71d8f652b74d8cddfa818bc207970227ab04ff3e00dc753bd6849e6b64bc4b4f2802903e9ac8b7a613a2f0c8a22e026cb31ec631c0ae91a99697dfae59d35be2e3f24a93760a214d261f049b3cb923436cce4094743b660990672a00002f56f1246a1b3139c817373cc50224477ff33f38bf7d56dbffad9bbac8961afc955e1ffacd59bdb85059002b908345277ed93aa150fe0867220e3c5aa5fe6f23d999ad3ed3082ffa2c89acbc0120a91d56160da4147eef7b32779773fe44323d0e0cb9318e0211d6cb5888b5c22e1a6772879b9d6beaab12179c3e11e3b380671d094424587ffa44abb5639b1d3f35cbb09692bea10de82257a622c5af8b4584865df06135600cec10980ce131ba739519ee954400a080d3f75511a4064874db82a8d1ff049f8c1243779a81121333a38e1fd508d3d84818f718d9d7145ea6c82961302360957417bdeb316d5f8a4df78fa613d9ad4fc610fc69a9543f83cb8f33c4343259b7697630d647702696e0361bb4463ce09c993a43a6a3d6586e91bf1b6f2f811d1d00aa021014a59f2a604e98ac2c9520bdcda668ea071c0185b772ef742a0d12108d5d31f5db050f499dd1691c964f8b4f0fdfd87d630ff20dd2d79381994bc554e5a0a6675c28aa3029a82026c90dc36e2e6afa9cff17157c4abd223c32d0fa851e00b3810fd41086f996f70f4210f3e866537cf5740ea5d25d1c5e046005d2ab70a59a164e51cf8734d69225017ae31dec7e22e7f89c73d4142ada1592aa9fc0af9084c278e455add419347114e9091e0cc0e78272748f0768b32314823508c5f96fa6d9ecf91eeee7f0a26fe7fa70a63d36c0e17b211c0fac8e7d99d008a11986fe8a14e71579b320c0cb69a9c18e0ce21b84b05e6602eb14947be3b8fb72dc6cb1c118c2747c9f0e1c51d74849421efa8f7847960db87ac3785627c42318dcf801052f6530e1d9f400b6d7edf0cf3ab4a79e34a88eeffb47bfcdfbfed288f33bee34e10e2ef5f3c7a1b30e13348c45a03bb57cb870746623679be7a5da388e2794798c070657c237e99c9f62baa112ad10f94452f7647efa29b2af9751319ead32d3547e547701944ea6e501972e582e028bce328cb95d44f5da06bcb03f6b01b9db305d28c8005640a44f0814ae412568facbf0f760159a8c0ddcc216b61ae80943108f214f8450ad619395229aced19e408869395626c65742846e4e01a12f1caf615903c2d5f43e447942291ece59eadd5266953ead1c56e2178c84458d33e1ec21256f6efb2b401bc34621377978287cb68adc49db328baca2b8816e3acf4151fec28862392511b3890d5924fb8ccfb80e0ffff162acc55cad68c292a3d870a8c6bdcd527e2925fec414764e50a360563df8b0e66a12110aa221602ad88158301751d2c27e7ac06b6160550040d89890108d2746bc2041ffb69e5a9e1576433a9582a44687c99d0aa6d239bc4a269f84284242435fa50ffa8470e56ac9e073470e36a1192b65c1455936cc800da6a6353461ce610a6fee36ee21a15cd65f7cb9e28b273e9a88b1e4fa16dd2b5f352744e111d00e9d73333daff45d4ec58509ab44b73fc10963dd2edf6bda237be6b41b580822d404bd04d8d82287957dc7732ac3483b9fd5ed914ff84bb1b8fd004e10095df4472dbba1ae82d6518e64e5f829a9561baebf3f20dbfb1fabc85bbcf9ad7102fe78ef6fdd6f4e1256293cbbaf77438cd1c95f34e24a9a1b5216d3b693ce83a832f056bb717c1f616f041f15721dda784d0126bacfd38b72d0a0b2285540355d5d289d97fbee0ae7fe87cf73f3fe19dffd774b206402244359847309ad893dcadc137557c157032abf2ffbd2d49ba447d7ed9d1c95921b355ddc0ef29f60269c3cf4f61cc7a42857dff44720df6630e65e965e848e8c05069d92a16e0af00efeab49a3c80c5a595980a0ec9a1cb671ffcea44fcf1cf5c155b5c3c0145c4e7b732f3b3558e05f73237061cc6fa9d9e4a11fdb9b2945e2cb254b0628b22f63d82fe098958ca8cd0e71ad6d205bfe5b48229e00b2610208f2b5064bbaee5b05dfc7f5d9788499f851fe2cf06bf539afdda5253fb956f20e7cccf752566812f368f93d38ea9ebfdcf51c1421b6ac1b3655d6ffbc0c4bfe2988d626a284eac4e54648c07ef266ed3847b4b2ad6d08c402857e52b3e73de5b60460eb95a1f18ea0aacee1d0a80ad4812c996c2a344502c3006bd7063a78a25a5b2ffa24105ceb5edc7896d0cdb3eec2c07f37b873ff1b8bc6e3cefdeb2fdf81bceed01d3bcf3cb1cd47f880a1b785060c0199fa2b92229e412c334dc875617408566cc16e3fe4fd55064d2e48d3277df0d1b93042bf344146cdfe4c87bb8ec1c8a1c347f49a804bd94b741a1b033066e439580523cf6959b88719086911546ba828ef3fe0404486fe4a5bfbb0c7e7c1893b3e3c965ad9adbb44d3d4807f6b95ae12014ce075b80521c69a01959804b47ebe70ced2f03560aed83a964ace2c7110a2a05eabd3396bff6e633636dba6de21c4c594f1c7fc0c2ca8fd2fa35dceb129f28a09cf1efdea1f8842c316a771db24c83cc97231f56482a8993ea0f8c78f168eccf2d7ec403a83b5192f95aeb93ce58096fad8478d2b551f989ca791ec7bb4dfc0b8575afd6543e6df2be80f8e5cf58c305ede52fded057223a441ae7b43e57d9db7231de7b199f562429b13bfc6cb5b9641f54d97e388d4ee6eccaa2cebced341b5492d4a5bb6998d73193e3a5c43779514f5387ec6855abb08d4d284bf37beaa7ef958f391021f8d9d0feae0ec28e6c4023d6536c4a0722fd9e1565b917bf753a428aa7ccff1d7bf18e475c17bdc5f3178872a1d01306b8c9ec7cd9e817d66e6e00fbdffbc830d8e3fb68e164638a0ec23543ce9907d42f3721f49b1f43c907388340e2ad9973a10532104fc2ecb43416ed217081e6b03e3c1fac61219e60e1594175f5221ea948db66af4100b380fccb285dba2937e7a3025a54f5b93ab3435c7385205a28ba42c430b42ed1a9c9cbc73f6d705863c414af195e90b02f7fc0a2bb865006b14a9418171c6ecaac746afe14f12a6f488eb69cc809faa3ca2cbee776e86a14b58dda1d98da73365508d3c6f94692a75e120a8b4307cb9f814bd49bdb085a1c558c2fbaa7759fddff0eb5051a70ad4e69d36abc8d804390fbdc62f92c2d4d038e3f01ba7444fad387a48def6821d6d3198caa20ee46e0a293deb85b052b4a7d369bb86f48f3ca6578050f5d1d4cc142fcbad40a11a3b28b77903ea792870e83495c7211c3d971d2a78061f21944039dd517954edb4ec30a28798c1a7d33268c2d0c678083b7e97a2ef4d7f96ad01603e878a0fe333e312eaaa28899a35667844caa0fb0e163549996c7bfc5645ed7da1edbdf2636264968e2aa6cbb097159fd75d2f80213793f2933efa008859ca07c2b8d6d167991042ecde6c16e701763f5a6f7e5ab089f2a821d621685057dd6851832cf0d97452f362b409dfe6abed123d766bffa70f4eee4aff7ad203082fa2855d90244378c7af25988aa70fa6f64a91d2d7e634aaa98720c7633201a23877bf39360a1c6233b4082ea5e8a481d6375f4b6b29a4b43684b6702dcd9e7070be0e75cf1ac0c520250d84875564121064103f0502a5e2cf4da077a1bc3fc94adf14ba8f7e4fd4caac1e9a3d4e14b42a33a98e8434337470d6d2f532482ee890dfc6fc93e8b52d27a0f600399988530f2802a66bc7b5fee6532e650b319fec4893abcc0faec5f808f694d338a2303c51cb0fa1a227405d2c4a86c81c7e53d5af93fa28c9d276179155697ca65c95422ff9667dd12a1989bfc88bb20beee03826333aee03c8854f4b46376e4c85d62b13867df088d0168cf949251bca4ddc38bffb1683b3231b7b7d00a3a71818d0ce900c9c125765e3c0ed4eb6a03b15f7d6dd28c5a6313b8c4556f62046d285c77ec1ce2c98e258172ed7f3fa45b20b3e2cbf3336cce48bfcc78122a4840630dcbd335d19ee4b9e7b5c1e8012d067190b2b719c3b690abf7b65d8411a710af49eb593c6050ef2ed397ef675c9fa294aca748ff0706862b6c1eb0ac452f60ea00eb8b5a68e7aed6e44188b232f20f14686bdba80e55b6c0689ac953400225665484d9cd87a2ebf9004926f55568a8bbededa8f2d6b7845b61196a90ef23a97bc5c80b2de4ebc179a64c7655ee3ab677aa0017286de4175b71fb1009993f58f684fcbd81b9a475fb7b7bf71d39c134ab817c9f04cc1f6d2809ad02822dfac941bed6e6df42b9fbc0c0ae5dff0b2daa86e5e6431f786b8931dad4e2c6f361766a81421d575916bb5103137afa08846175bf23ea87d2f622691e57357af0b351019dde272f0a0b3044e161f7a31d4a83491f74ddcc86493bee377ebc4380ace1a3576fb680671bd2e9c2317132a4eb0de610a01fcecff12c280a47370c351dd02cab5bbc2ff6e17b9eed5f9fe616e54bdeb177c24acc080c66140b25460a9874b3c6b38cf619358e1a3fa4f1190296d12363f09080cc38cb0dfe7b74c5b0df52336ea2b617838b6d2e02d2ad39e5547d8cb099a965117ca80824bdcbcdb3b1f9ccae390d137b871bd0426da833a139ae4a082536b7a08e2497374f3e20d0a51fcb6a1c2cbb81cfda3b903d3175293751e4b10dea549175dc146ddb30042758416c531e0cf73cfbb23eb402cccf691bea3b87a81ad990a63c1fb0e3e6862cf28411c63162aeed81d7948fa622120a34a00edcfef49178752b729a13c429af3c0bb267eaa8a0768f32adac8f24d6bb9f1282da266736409e6023176ba8bf208268fe56af81dbb2f21939f1b72d34dcf5a02ce13b6261eba66b63e8843f1d33820064a4d9393d1de4c876a7f4184b3b3204d49922b2de90149c0a860f6cb53aeaa0e0d289d84aaf30e5a8806f8acac3965e2a901229f51ed145565b0924d50163f8c8be041c6bec508c644a38c85c4a612ac016caa23bb128b11f14439f9e2cc5039f6734355459b451e71859b8242c719c45aeef229a95f91d5ce631fe2f912661f7417228140c20c2417bc37b1dc7bafe633a17b2438364c85b08f8f7502e58b06689106fea5da1571665f7b7140551030f65c9f594f42468b5e12cc38274304bdf67215c79a7d1a74b82eabc39c82765ad928a40b1946b01d55fa09a662f7a86ee857ddedb4d8a5d9ceb97366c1cd6c8a7f933e7e3b6951dbb40079457a259fade86729f2c79494dc423ddb4097cc0ad088fa3809217c2cb5f65234ed95854ae1bed397c2e1c2a13a4f47c6887f2848d8b2e4ff9b5ebc5c32a37960e3cbe38e555032584b10e2aeb53759cb5ff8fbc6befc7e281c2d8dbeb33f54fa4437956e689f4f2270c2cd0c07a175c6dbc03e532df39fab4a4a0be1dbe5e39f033e832f0b1397391419d0d9dd537d5634a6b5762263f27b355d30e87c706aafbe4485a188339d7cdd8c0071fb5dcd4e3a18a14b88dc6a3902d28af5fc8132f97dea8b888d64a2aa2b470c7b1fb8530d434edf58c5efbd8f2ae88b7e955638d599674ef29e1e04c1eb54ad482ca57d4c4547b96ff778c78ad2854a2c30f86f3dfea158ab6e87b95ebb90b7d081ddb53aa4c7140906eba4c0324374505d22dd852d04c0a61308a50a0f3b51ebdf03d67569ab199aeb328169769b2bcda2aebdf028ef42c7a3168c5597f75db7e9ee6b1f857104fc8a473e4b62ee43b70b948a0d58cbbef236a30ddeedad6a270a13a6edb5c2d80c95d91d371fd4c2409ddb7d046f9d5e0dedea3e9e2a518092ebfe3077007d8baa5f1e23574f3a0d95b3e84bad7be02ca1135a6b7d4badc45c068a9356b76a2be43edb8b4fc36346584dd2c87a8727303263dae75ddc980ca4e81f86e6c6f193061dd506f4ae41354b6c01141e2aa3a2590fdc5e87178b401f04a8625f2d53c3f5f8c7fa14932a4cc2a2bfad70b08f61e907f2ad8e12b57dcb0c7e37ccbcf832192ba82f9014e23c013cb4f57f590c5a6f73746c9bcd8142acb66a9f26f630be9550856bb5bd420b8a0dbdbf5198680b51021dd578057fd70a1161c702952d2732122d64f625e80114b071c2690431dcd09f0e1768c0b5ec123a0ede1aeda5ebb7c3d2f59251afa0940f6d0549e5d994379db58710af7c9d7bf69ca908429cf9255c25595d818b482ea28e89407398c541ad652b67bad433b7c7d9ce4826ea1e895789b785cc469158cbf608952e1953ea387df27e1bf1760107d3e547b72b2e6f3e9eb1db4888fde82f48f53eedf45752038948a6f11c7057bc27ee12358aaac7c0b3f9a43a10000a5a671d4698c82f16d619c3ca6e53ae102c25ddcea6086f87a00abd5b950547b68b6c808b426094c9e1a413741aa6bb187b103ed9c6d09b6d68c82aa2af63ac5c81c8e928356017b7ee1a6bbb788e09a8e2ee3f85b9270f4552fd07b78f2fc784b17345846934a9c469e3231ff89ecedd24f5e7dc04d0432dad2c9f816610db840aff8970e9b5b9eec701cfed59ef22c0be37cc4bcdae5760be3ed211ce0bee1843a713684fe2cc91a4421922b15ea88c7c9402f222dc03289869bdd88e19d948b13c8269713a17100047939e6ec4124749e1bee471eb7775bce0d57944cabc3b0cdaf5fe8b88172e6051813acb9a537b651bf0a3c1cb1105629ba99be314d1ff1f9c1eedcba6ff974a1c031095ac12bd9b85611a494eb357f123c64a237b902baa3fcec855072b6e8d5c20e4718a869ca188ea257d476412d00a246625168d559c68d4caf1d91103f8f3ab8a1c0c449f6a1c781986510d29d2f987fe0bf41a8c9f9f8b9d76af59047dfbad734471382d783b6cc43ff777d5165f824042eb47f86207827c74adcf6b02b832140535d778f030cfaf3a8439abbd54ab5ef34fbb675ee751cbcdd78f0cabcee7f608be0ea96af9f66de81fa46f654028a103b317e90f52174e4d0350daf2cc84be1c2e3e63c0caf96adafc05982c872e5aea860d715a6460c915140f82dc50f6f7a7dfdf34c28e48c0311bc4ca2505f3270d8e8f18655bb5665af7e9327cce5e07bfa6962fbd3e770c2d6973e8ba3959441f61614eaab45b57fa8ef10d5d72d8adc7b11a08199091556252dc4b682e3d487279613e2930cfa34c017327409c9ca1dcc17d667a8718901faa04cf48c04eff2c218b82f975e1f19f5f96a24a3b7147107a1e70e5c0383d550793936abfeaceac4eb1c6f4c8b88caad3c748068d424b39b48b6ff065a21d92ea9972846f17fa003d4ab57bcf99f962e181f88a9e007ad599906b1df13ca4ed2cf07b6ec88dcc8dcb2968b90848aea471a30f21d46745852c7545a14c33f8c4f7b277c3d0a0b41438fba80e863f4f2ed9a46528c7b2b342b6f0bafefb4dec72851e80c182caa1892d81121d8d30bcef2defca0ee2515c428280c796fb417d7b5163672e4ef734de35fbb6a6a92a27b1dde54ac691c5f9a3fbbd67a0abb74067fd3d48ade85f2dddc142d74faa40aa82524358b3d1730fb048a35b894aa07de948bb55ef0a3d01f1b5331c71a0493e4a689fed2ed775701f6cfb459bcc6974f6211edd5375147e37e36305b34498c30b28d099a91ff27582b90531a552c20d05cec952c9860f1d7f76810d4f09953a74615939919eef38b1ad8a395acd1c3a598ca07cfed4b3c4b7410f1a08b9be11be02d7a4a1bcbe8128b06374249162c5d1edcce16b984ca6b485b95ed76038057d7cb8c9d5656931d22f7978a65a141a7e22093dc78855cdddf6f09c796d71391c6250298e15519a7d1e7c8ff5e9e0abbd9e466642112ae17577df71561a1fb415e5850c13d027ce74e0a2ee1fbe5a1a8543c251ed56d1d11fb240630447a31003f60ffd62ba44fe67d074eab3bb01d9509231d83091a71909e7dd337e569b45b7f26b7224caa9382847f44deebd31b6860462ef59a8326d3e44ef973277d818f39592ed50fea00ee47eb90b5ea23a894e55cea8809e04c688b58b4355b7da7745f4ed6fd7a9001fa474c62bcba000da1f662c9a26ae86ea14a216eac16e28ddba90843e43e2e2f0bebdd19bb2461d7982c726c53b87c13223cc42d23a3f14d9e7d7c94d50a8d4b84d6dfb30139ef8ece0c8b3581dae3c612da6f1e94bc6f1745f8477caec8954ad9a81f29d16e7b9d36b1f28e42721f9d04e3375ac7ad490af27d02a59605896c433ef560c80fb0cb780e6ce7c99a19c7c979eb0b9ed052283c946e03799a7328e444433a6919225adf938ce9f4644b21f9ea94583efa0dc4f06723145f9665b9255e0f64d39f226f8c3b5132f58c286acdfd4062f7c2a9ac09a8d420a4f475e989d5a44b3f486c1d5cb978c33ad48fb1f58d6eea85a219748920c971c4e458ebc4c981c59cdb57812aa3ea5042926a1b956d905d3e654ca8d283a1de2266b70847bd551a4d6a4c3c732de7a7cf8bd53f315db87c54ff5eaed500fd82e21807cbdef89580c5c5a8b2c40e08d5f5f3d24f4a2bfcc8fdb19b5d3c195d715b92819242f525f89d0683d359fec4be40a08fcb26b7f919ed7c0cda24f6a2d978dd282bc054dba9e2399d109c024d8caee457a08b6a4f870fe842f8a433a9cce30bf5440b6232c4b4d7781b1f431a797612c58a106bc706ae46fe777424eb0c6d8c5867c61fbf2673c2831ba4e7e139ffffe12d8295e7ff717acde83395ca901feefc7f63cc26b0058df29d0d9ed7c05004436a86866d66a921043284317aa40eac444200b25cdea026ba07c647cef7f39d90c862ebf7d6d38a6b0e32fbb5097c699321ea5d2e878885cac71edcb876afa4ae3826ec053f38ead826ca75e46236742bdbed488a361cb4ea87465d4523f552ebe86e62ad4d877e21e8d33b7ba9680c7ecc981d9696af9e2b94c6de2d7df3a3190b64540666b0a2ef7a2137a5cc52ab9b2a560e1a34b66247a2f9ce4f232d948fca030ac36d7ed63180b09dbbef36d522219543fb4fb4ce23980edd810a4d5863009635c56618a3a14dd2dfb66c31a904dd9eaabab33e1d40ec225d0b574794d2d81d4517999eb94924910886ca8dd67000cb01c0d0acf0dc0651cda2c67f2ab3831b55dfaec26b53e16985d41d82b43b2d82c0e7999c441d9f59a677536fc9fc7dafbb228a48b768458facc335cb4c305e4586a6e50da71097ae7d6e8182a5ed6926749c4c0483863d132b27347c325a66943008247370dc228f304b5a3f0161b61e5d8d1955f8440902c4a414b5c75a477bc82e201c2d72e7b20be4dfe8f516e055b3965e8cec9adec1981917af33a0b66c6936c0916093ecfcb2cd3917c3baae3081724e25bf83767fc04e476ec32ae02df04603238fd014b64caaba44af5025ebe05ea2500d8065b50e243355d04724d399b4c140b700dea7c0df965c1aaccbd0bef2da4da47ab47350916b36419eec611ba1a4c74afc1b71b10b5e46de7f0f392a87d984f4b78d4d4a076ddb910fd2657cac043e2767e3d7af4b7350691eb61567ac4829747428c07839e56cadd9a173e6a515935ef44f79043384d6aafcd66e15443bb2c5623ee4504f120602735c33ee9fc34a30ff9430240781952a01124ef1a8f614fbd5ad62d614a07a3647bf40c521217c9dcc9e5d0a6efe0e0eb28005043bfd8201fdf50384d3204953c842bf0041f1fe422d4b81fa4317d2fbd24b2f0bdfd09951ef2f1cd8a49f878078b565e468e665ff8128f12fe489348046187f213dbbab3a826d8f0b695d05316afbf99ee32fdc358dabca0d5610373bd21349ce087b237e2f5f179cc108abcbd7410aad54479a69bc67386e7d943c534885421559b405dc4312595180f99169ca83e99f820b1668afd2424eef628da83ec361b47684ba600163be100ce9f11e4f8e17728fe70c38e37cd37deba2520772065575183116e23972bd99fe66afde1b3f370180721a2733d04f7108e967a0d68b15b51748e384068baca0f3c2ec38e54e3a686b0dac46e73070636a2946cec1e4021a0ece6831db88ae8a3f277a734c8ac4b1d120c029527ea4381065bb04067f8502aba6050de23278024e89ccb5a785233556af211d6152d117056b5256a8cbf99ba8b9a0360f35bbbad36936ec41a0149e25cf1e7e766bda6813d47ded9f36e5e1bcc64f9527c46a6811c32e73496ba74d734e13ba3651a65a12119fb669385ebc9db549b65bc0cd7f29cc617b49ecff94e2522a169e27e45b8f16e29770aa04ef805f39b0319b388d8fb5ee7098483041f8e21eb1d15a708d031a8c8a448a859f9b61303574a786aa4fca4b48be9596494f7e96928f2918b7da891a08210c2527885cd564bd2ef709d8b498aa7280c7afbaaa5b8fd6e31e3d812c043ae24674d2a85a54843b7e0fc7b5efdc7c472910c0e65e7a376f526c3779cd42a80545610cfbe0fb782900c57fdc007e7ea2dfd527d317e4d84fe38d9db59d5ce745e5e64b6a4ab1a8f2644f7232df46b8011510e24f1111db6e9ebc0a20d9d951b3aa53c969880d1ee5225f0ac8ae4085f75e0cb741e3af93619f3eeb4b50eb1bbde20e7c4b6178fe8b3e965dcf4662d62a1ec40f2ad8ba9fd88ecfdb5c332459da95f6eb990b543aef74b93870bad6fb80963f7817dde0b023157195c59a2f2ff7a0b73340fdca4113d1524998f17c82a8dea8f0ee556b5843611b02079c1b78f9230e2cdc48f152271c01e32286d3e7cac435948c05f18eb75e3d69c15dd093a6d1cacca2ab386bf6f8bdf77e1445f157709a337198b378a76e93d003d69405de3e0701998a35413477208559d72ffabbec879f4d570a580d40e9e93f923c22ce3538d0696407e8d30a3b897198059e4b349b80ef4270e35a9595441406c14f32c9fec1350352afdb0a66522398053d97a4d83fc1115c7bdcbd2304324f6e4eee2aabc04b84b53f71d98c573bf5a3f4042a8e600d7c679af1034892ca0df56cfd5f42f6b5f0b0c85ec0de33e25e32b0ffc2af3706963d1ee65f465002049aab6bb937e1b162c3e8e588057dfffa6f03ca9107130b2f096afd4bbefe386cf6bc98775910a0b69ad062f8160aec10bc1ba00acdb0f7938358cbc8aadd504d5f8750cf4baa8686fd3718b67fb7728cbea0e8638afb3bd67e48da91f627ebcfa491257e73350af7f949f81230cdba8d064dfaf9c6cc8d22f2d94b3ac5b2f122ba50d8e743e11e33e4eac7193c1a5de78d4d3aba13f7add0ab3a2ee84edffa88c4faaf266b12429f623ff81f49bb12df59e9410a08c37cfdc76b0042d1eb5463780dde3554f1e9ac0f70f3a15043d31198c3e860f99f8c662189f7881239528ca592c70c63485db3650be900175bf01e69b611fc519267be933c79046059226d28849046f071092150c05866fbbd48873fc2798864e2d7c6dec69d59227aa51fb91d30970d1fbf4ba4eeafbc52bea7f9b40424371fd4fed9f92fbd5b66cd92e52f397b7e16b70417e78b60ed9b08ff1b1cd9a95082d71746fb97f832dcb003af3c5162c3f1cb3869c1c5bcfb6d671a3c1944047a5135c402136812f26d4d6adcbec84a2378999dc3140fa1393a8d9a53d2e1abb15acbab4f55516c877ed571c55acd8fc1e973e88b4fe9febe76f47c6d8d8f0f68f7d75f20787b767bcdd63e90983d0c6c1810ec79a03598a1014d371ddd6093d155766a96690d1fae88c3d89f28b535bce5ac2cb3f4b2f7d979a0486d379dff476df75a89b691f74372548a1bc24cbbb66b00971b5b87f52324ddff9a29111e65f563a5558581334f7e252791d4cd7a99b96971241060c15f7f83e2ad19ecfdd9deb1cfc49cdddc79846139f65b8ae880fb20aa25592d79d99298b050aed95491b93f68e708f80931b69835e17dac3f8ddfa70a31e76b8e3814b409940ac47bb306f6b677553eb717f8bb9cbcc3a69c87f05a3b0bee070a97bbe00b8a1ec84860cdf9fa936a3dbfffe05a9820f354bed4958c75971b4a1d06f61cdb5c4c32da096eae0e73bc65bf88de8dd0241c0a05f42e678686e6639da3b249659e2ba548a49259127c534cea98c1abc9775f2a8afa9f32ffd771af90f0a9caa8860cfc677c784d1701f6c777201b2170f5f48235c254e227c52dde5eda28664676df324192bb5cba23b3dc30b6f5a84b52a9ccb1bce4802a984a171b3a33ee1766cb7bcea519a6d35033b804ad8056001aa4aa3f24cf1bad4ddc586ce118d7d1f3542bc1300e9537a4a6da8951ea14156f5ffe28b7a5d75fa680d74c905ef1cbff966c2916cb5eba2c3f46659b33251618a7884316bde3e194d1210dbcd993ea330afcf8cc9a6bdf5b8b3c837648d78f2a48e61080181696db2d3f0396c5196f5b951f62c65b8a8b645dab511bc2a8540978950e8d2070a5b3f7a24221f5ee7530ecb4e7ce492da4c60c09dca38b166421e567783f2dc02e26f9755865684065813564150ae41c6462d41e0ca65d10c6682d16eb89501b1882840a0fea27408b06db04547a419a0143983612c6a586dfc6111a42dcef1dd22cf364f98c2308b2455fd962c7e13227b8c231fa51b007f0c63c9edb571ff4ef5009ee05dc014fd68bc10e1598eddaac8f03681cfd649b8b91d2637d3c83aeb341472088256b60546e1816b585dd46d41a238b6d47698b18d406ff77a4a46ae9e1a5e622d511e208f66e1de77b1c4f3716df1e6f9428df798b75d22d7f0ee7d6df8d54bbb3757bf17a61d9fe1f34b4943e7e31a7fcb816975f015cc1d0a8976bb8debd57cd43388682faa6229d414f82d7e1e9470f37b9528bd596ac1b51f5f61756ad42a2f7fc416eb4f1757b926e19ceb3dd188040cdb2db7b109ddd20038ff35a58904147b7a0f12412db11f801716113aac8ac6bc78e0b31ab436227e4f6d6401da8c7da3d3d6a619df2c5c19f7f21bae3693cc7ffb7ce048ddec75f5256349a5132e618e29f076be92aec1522a135e430eb29eec26da64f30bfa5ae01327df0006740ac7ba62c59e113b084be0e34b9873f93b72aadc3bb24066a22e5d4d9b84232b5be09af7cdb852ae9cc7280d526627b4713f5b8f0a3e2f10be02e659b50b49f58580ef0139185ef173bb550e2d516bb8fa65773949867f5d3b6dd28c2a623d687da37e1cd2ca57e8ea149531d04822697b2d391b303185237a353cfb88b2789732306cd741d8e608c64c554ea9cf047a601923dbfd643a388e5ca8412aac314673e45d9a013c65aa5c96ea5d18e7e9427b99d063b7a556a2b251b276f8e060bfd566a955a0d167aad142fb51aade856a9a5d434dad18d525ba969c4a35ba5b652b3d14637945aa576a3856e294d00bdaae967b4a2e8ab6845e92b6845e83dfdbe53a9a89bd5aa68b7f5aa28375a735f956e055d846e1d5d84ee0f7d947ae7fd754951b7d595a2ee9415a334ef3d596e6b2b45dcd32b56e9c67a56d145e9753ea6e1f43b8bde41719f9c923f77b7caf2a028e606d203e52e461b30a7bdf260702e3c3a03cf1b5807751767d5fdc1423ee918fd72ab34a6245ad5af2c49523a5c15a34005682f98d760124c38860682506f6bfc74022adffde499d732729a8290f0555f88f85f323fd3e5dd5b8a6207b259cedd997abf961dd51512fe17ebce7b0ec1b5df65404eee2ecb55342bf1f6286905c74ffd21e56badfc1c17b8be09edaeb03427736472ef265d05b303ee1da702e9abbbd14eec7907b0ad3b8e7910edaae9c4f59c384e2b270470ca48789ddecf244bd9b96431858c34af2321a2d895dbf8ba637d2c4d624742b7b9aeff39378124f63fc0db4fbccc6041b8afab53d631087be594c5bd9a6dd28c30fd4bfca12a4f61894e5b04ec7c3ac8481c567390f9000573cd0437f1e175d9063fcc55620bffd27a522b96c98719e1ab1d3419cb6df8316fa31923b70b37a23c0a9ed3784a233950893ae6861cfb35d777fdeafb3c7b89a99a470da656020a002b8a0d57616f17b384558e0bba7b1d2d5608e0232e75df7af0da030c1e09aa075685edc60074de273658982967cce5131b829e427a72c543053c8abab656b0d857ea58ad5f7959f7eeed6ef0e716ef5b8e7785b5e5975b2ecb27ac4f93ed5df2bc4338ef644648d753be4d7cad2c63986218cbb3b24da5983ce1764d4a558105da2e545ef180f4d5b139d3a574aab0bee71f107e21309b5ed95e9bc30a22f3a1bf3e7fc4ab84063ee3968c31df8c3be10ef5e332f796f0a968bee484f0a368b6377546d6a75bf57e7037fb4b6ee27ea911ef108c08b124584838f3f8ba1ab8ba9896e99fd1d0e51b9d9dee1a4b4b2fb99c974f2eaa4bec1e9108c0ba9cf6f1a6c9c26e40310ce33a1981e031fefe40b901f8f7e3c4b53739ccb9aba5554dbc9f68a24114e28af98ab1a4558f6bd3545431ef5caee8f7df57575053e87246a8d04145b1d29d57f256940f9b3153cc43188eb5b7bbc09b5ba46f39437e30a2267db5c269717c928b992a5c546c4ea861d060a541cf3aff57ddd6bedcb72fab6ae208c11c64c169e902fe6c2ae190e6b427f2d8eb40036438b7ffa2b28ac6066a64f1e0872a12ffd4a1c7a5c43659859d7d33eb86d4188906ccdc2cfba3e700bd392bcc818a7ae9223ccec5bec551d7b35e9e9776b8b5aff1c681351a1310c1ac6d71b87ee47f5905fab7fba7f3b38984e1abb2ef32faf0a058086ce8973fdd190ce149124034bdf99c2afa2db61815126790322cf2fc3dd6df89f71cce6fdfeec957cd7af55fef163061916b2d192199ee2bcacd0ec950120db1d580fcb56835ab2fd303d27e52f4bba5dc1e53ae5e3389f23297a735ee7e6bd07dd3d8e511e65418ab871d95fda8e578d8c855e33a497ead05cde2a7d7d9608c22065960f352aa5fa33fb29d099022163216f26079593501b76e198ebcfa4d6f834f0c47ef599f9fa8248bb59e15b25e4762a4e0ba3262e1a55a8fd9a39caf0a19490f5e0635508a4d597217e263e38811f4fcbb5f027b5954240a3c4e6696d209ddff3c6be25a3229e44da0b6a30844138edbaa4456a1cf17844e4bcf7094c7f7069cce177a77f0d0d1be36021de0fcb71429b6421ce8ae356fcd2d135301f008210c1ff02aa5886ae1ec6ca2a98b298a90ba30f93e3d2694755888601f9f8c4673a67dda32a34e0431708ecc36137ecd576ba30012e4da5d95aa2561b124ee86bfb8d81f843792b1d841f902c5a858a9e5b24fc50d23c9e49961f21a5997c1bb07f5b0c20d4bd4bf102a1b0cbb146cc3d350430629f020f10f73584aeffc93822f248784abfd13ff7472e49de8a24f8a8ca30593529121dd7ed35a9c6588b3544b70bdaaf1fa04df8b638aecf39dabe21daf76ade96fcbf9dff6ac4982d6ee790cb94b6ceae5c78849e6a34adfb0fc008c77384c9aeebb9a6e269a275ac7464ebeb5cd242ba4cd9608ecc3785d5c431fa29e999e89c550b76839ae54e2940f2815b9853760da071ad82db071a3e006b6b9abde04e107c7229a42872082e5d4f0d96cd1e26f031b46d14d30974599afe2f7e3d0f224b02ecaf1e60a9159a04ec6557bebd8523990674e59895f367d4582b852d353bd3c8919b62443b9acedd308fc89a2a934c33219c02a1a998a0d46306d5357836b1ab020e2ad89c0d23120c913cc44133ba3f186fce4ec36e6296a1bba68e72735e6d5dab9b1121454cd9c5b7b55e9d28d424188633d6db025a5a19053ace4a7b1f3ef1fc1177909d5eb57e3e2f13e11f575a57dcc90b22b73453ccb0284360899863a374c04debd9ed09116d2ed458d74b5d070a810b6befeb3238c8a90d67850afcb30d41309c1454956bd0c29be4b92436899da192d4e38e72446a0f4280dcaa543e7ec70548ba8c684734613bba300a80b2b86dab4718132ecada7e95ef30b2711a4651111b2a2b402f79d115052cda7415898545100c8f0a319738277d6ba09ddfdb61e173c7da0cb2ba95db0603175e542afe458206d469cdf2c52c6d4a54fa1a8e792cad402714b511bbfdcefc7c2c95620b4550c20797ad109eb34dd343d90a65b7469c0633d5ffa5c8396c0a429d8888a00abbe4d9fed17e27263434d318dc263dc4c0a81b22360efe2c1d60f0bfb4c16c9bcb8c1851dda2a7671a3844c8421b62edc9c3501c21ccfeca4c152797d2a229a0be699679e7535ac7361cc2a4d81d746a9b2748c6673939d347890f330e02cefcac1e6d2b8dab5392897743078a0454b9a2b2ba069468c25ba9097a40cbc20e40f1d8184671a15ad4cc8320610c830efe4c3dc4e8742d3591887d278f90d9432044e5b2d81bf4a487ca4919cac3087c19ddc9293982ef62c0502a3fb5149dac781b8dd09d5f8f092b24d21ba101aac5c7a2c59da119c15351c820069ef1d1d98e8f0a5dad2871652a06dea496aef95691ec2c306adbba00f72d913453a3beada27e5934b14d0e59ba6f6b532e5dcf70fb9c833b88c54cc788b14c563ba3f6ef6ac78ad1cc7990a5a44acee76c0f729c387d7ed79a26b949d8f4cbdb5f2aafe39ec2cbfff1de747447b38abf04dcb6a926d7be6d73dd6f26972608595dc23146e8d42eab5248341216ecb37c828f13d30edf8832d328f951709d362d0a3e152e6ade20788e0817e574b7b5726391fc3192704c4ca28878686b90fc227572078f88d534c32f177ed3a1679b7bae9aa9417173efc5c7168404c94003d112bdcc535efc2dee2cc639b59d299e2ac65e8e564ae43b5bc5b2c678f3cfcf19e1d5c6526ef631871c280988ce790689cfb48f8e41658f94b13dd204481c7d4dfb5eb18bc22075a788d41515c0e472ece71909eeb08b7a38e8c1b99683e0f4f9c10142ba00c6d1a7a1f848f2b10de780a0f26feae5d876c531fa234ed83042489e5889974cf893f1543eec737b4974a428835eb71c2f88101560d1683488c8877cba7af7d123eb986a0d0db1c1680e638acfb805e40a81686ccb6302a3110829085a40ce2a11d1f3e5849994c88c528c63f26e1fee6e32faf2941cdcb4fd002bf8da92057efe0bc17aed3550bb6ea734a77478c842fccb94dfc5e52afe530ff9b2326daff2207bfc27cd8eddaaf1d983a68d1b09fb132ab4e6c7e2324d807124c8aa5fbd2f54c3476fda77f05c5c13ac7ca14b24e2f594d094bfc36b6b10c49bbb1d3febb9bb8d3b6c59bfd7821b79cb5250b72e9f74592d70f000d056c796c43b0a900ba125042ef6ebcdcb7a56d073936100fa820d16cf885d9cc1e9f21decf769effa482510680fd2b2605040ec989a05b4e695225a4ba9d3f582d7891dfc0e01ed81f4e3b9a45376ff737711f7bd90dcb3e8fa4ac55bb53e191338e668f506b9eaa1aa2bb9607f10705220b2680c083fd7eb9a29f42e87bf75a1b4d6714e971560da93ddca1da6b69e7cb364c31482679ec697593cad270d29eba0c9d54575b72373c97cca4b13c646ff33e16f9fd54673505a4d0acc5ef433d1fc25ba406fe35b7c3236a7ab7ee49935c347b3226d7ca84894c2fdae58def3b3693cd4c407ac5744682aff96e90f2564739d5d8409f2db4875f5498a2063a77ce04535d089315465c3ba39d6d6b29a32b37b8000b6dc9a50713775072268c7dedbedf88db0f9a959c302ecc56d9ee781979bbe540c4b9ad237ac13e425c1b383ed7de5733453458440ca8d6152f854efe2ed7c60e1002f8a02c6a06ee0017fc944b05a2249e6b44bfd933c9ef3988d9e2edfdfd2d3baa95f2b0ac0a03c15deb392e97a3b55e49260a79904a0ec0f5edadbd5af3d339538132735da11d99de40d27f7ac5e9dce0710aec50094efa3d7938a421ffaa1435e23880bbdead983f08b99e3c783b2c7f38954b593966db5fd5201f2c14d258044c70f82f0a46ef21ad045bcf8283eca554103a92691debd8cd8ed3d4b7b11fbbe0e0a5258e9948c976fa46056451b22b990db4152eded2a198a9020912a3fcc252a156052e9a1b4ce09225d8b0e43641257fdf68b0b67c1fe2ba0b29f01c19843bf70c524c94343fda5295db317522a309ac24c6815208c8098fcd58e2af90b5a06480a7604215c0cd0095a8b298cd4bcabc90ec948cecaf4f61f65ef0d6eec444af0888d3509662735bd515f9b248b949894daf6c4cab9bc81b130bccf3fdb16508bc09eaf9984b9fe830e11e48aa47aef5a2a2769e805f5e1e5ec1f2aeab5efd79a208ca2969f1bb9460e5579b0c3ffe9197243fe2acd38e664e0861ccb59f8e09e330104e2ca4dd7b88a356ce0d14c1ef39f0a9c390b2850cc74f306c327cd2be80d1c7b158bc18fc3d830669f096b54101ba9f8c11c7f12041306f5e15863476626091c8d52c26ecac6c2ffb9b296f814fec4cc9cff6014bbc6601871e432371e5d4b8e4c074c81ada445694e76949c4592ad5d10c4bfc78c67e8c365254a7f93c170b027221f00bce8e2d2f05c476800ae99a9082052933608c501ae946eb084fb023a4001af736bfd9253838df9b708e6f5711fcd84da2702bd15e4e2945e18d4c45d192a1c3acbb5f8f1c61e20e5ae173419696d04bd68c43acf7224a79137f0d3e4a736edec8738b384af38be5a4d258575ccb3f4f8129c876a30177359a60d13911442b6fe2afe137aa8744791b33b8dd66853e28b3cd76e5301991843110a90f82b7e054e803770f24ed75cc18ad240f1dda3bcb1df0909c13a2a3a178807c295324436d499bb7cea689d16804c2a546576ba2892270e571a5c01fe5ce42c7fd0518b32e0e5f2d2af71b0d221c4a46d5ce799391c5806b5076d44de48fd01d061078347fa4b518e5c24e3fa4e6d35d0b110f99a9f362b5368c00bda9dea5bd160fec1c6850fd14deae68d6ede7f3a3570de7e1f7040b28cc8f510c7d351aac70fa247eab4693aa0480c8d01e0e901db89532cc9bb7dab6224c23e7ab8378277bb30a04d883e667b9977248be95eefd5c3aab21d39f188518932b1d69d59f495f64017bf064231731893b3dd17596d78010b10bba3d3720dbb2b4e63ab03d32eb4fc7d3ff83e1eaab27f50de0edfea0c68532ecbab30cc70d42e88789d3f6fac4c1955333f4c619957ca2bf24bb89a408703042ef5f5820a5f970c99ccd4650a71c0e01384ed87cf791a6d7b01b7516b6c653cb3e93d6df4b2010d701ab6e7ba519442cb9f95c14fd0038c01a2c8f5a6eba63cc3962608a22a3193245e3b44c8cfce0eb74ef934f362ed382f4176894ad05397689e55d99b1a550f09f2879b6f779ffadb2273b260d22231e763995d3c3b47055fe8b9c447f8426337a8e2b09fee9a31bb09a7fd2c08343b0e6cc158e73f3f50af10e09b2cc0dbe43c09ce7cb0f6f266503a9146f8768457654ca5136d7a407977b52cb3b03c54b6c49753585455577040c3f01c47049f1b92be6858971bac97aa5179b2cf84f7219df76b819a782d321fbdc52cd2057a37ef1db3f596af4583c164d60de4381c2c9ee5f659210187ca1b9a04f116d0fbb87e884cb8ec1eb191c699970ebdc2e8016feeb51bdc3f4ca8b0199700feaccedad5cab19d657b02e1734372e3352c8b17e55770f590136d113be1426186d3b22537bdfc8b98271ba428ac49f4cf5bfc7e99c007e7aaf7bbefe7944b84f30df23835b2a6e901510143c970d68193bcfa2ce7ea9602f01ec846e80c8d93871db47d0a220e1761e001bd794c6a0e62bf9be0901b498cfc6782daae8fcc7910810d6951ff83aa219defd00f8779ae3040f7629e6be4b03710c7bae9a591dc3034298019fd105929f0dc81413d9dc05e85cc2633683d5dc95fc32593717ea4b328dce2e5f9beeaaa2e494fd1106b2f6bdbac7fc64bead3c6d1d98fc2ebdde9c8854a607b776010d42ba0fabf95e4dd8219aaba04bd85dba43001b0d50f761280788d17e9bcca6a02d7544e82a1000cc195ceb136e8f7a4229db2c1e311c616d08590890de056293f9118d21b505c87a41d5496756dad1acdf532893edfa3f9b5f2b0aeae408fff75159f0ec1c82d037e2fd4c853884316b992c127b0d091b82ed41834c5c4d49dc3ae80aaebdb7578b2e590e247f0964f86a4439667a353e04644e9988dda060d8836af62f3a44046830766002ef6bba03270b1181fb9eb6e234710592b67009ed62e89c9059369e69705df44cd5534179b9cd0faa71bb386c035c7982ccb9e10b8bb556faf93d0f1e06ae61247e7f07b2d785a86dcc80ce29582f3c385aa8034851c213bf9bc44305e8c2ce9d0426c0f52d47f898668646b514ab2e2241c1abd261b5f13baf80b1e12ad1db3ac609c9caa553f018f1c82aca475f1f16d73445b4ffc6e0af03ddbbd178f21b2ea40e8e004e68284e2e6bfdf40e06d67b2914ba1b37d7b590a626927e2284417b888da9411983677c8b9a3cdc905c1b0f3487b99b6efdf77200b432c4608c9a60e95fb78291aaeab4a716d78e4a90908b9af2bb5d41c91b1c8504dbfb375f602e0c7e6245dd736daa3842ad3728e903c9ff1639ecae40d84da513b59d4245105ce3f733ca2ecd0c2a5f5c399bfb40f26f34a5b0b0c0fc0c093fd450f1e3653cf6715ea8bbe574b90e589a4af9179555d90d84cfaa6c248e33b3861d9b0a845827b397aceaac4df3025020e3828abfc25392b1098b14a20d64996b7a540ae7140673a68a729aff5c71c43171ae7a044e987044b0e7612fec022a7365fad1d29089925a959ba125572e1aa947323cafd7e833a1240fb8c60c54bbee6cbabbf473679f808c83e5553660f47250f6b2c1d1ce08a21f350eff6a1fcde5b2f01b7b2617c1f02d9b880d795b81974970432feab7d93d76361d7d0629ed8c54868937cddccbe22850e893e16f4c141598eb6b3df9551745f932daebeafe446431c9c9b78f4934e3ff3106935bab1015176dec37e90ac3a9090e545a2c0e3eb17fbb623cdaa3128c6ca5c44c667ac244253b84cc94608b574847cc1c50b30a577d9acca6b5206965ee8d98975638255583331a1df0a69457806ac5e0c0444292309a29f7cc8598ac2a179a2cab74ce337572cec9f2dd8168794da8c1e413c58186504c28e4457d4221d47ae2f733eb66443d0f3d36a1ead85acea7582a623a8b694ebfdd8ea301bd5e218c83f7af6fccf70a93b9fd889e29a0dedf31a252af4136ea4b37daf433412f49066ac9acea577d76cec9d1f29ad450d1c09973a12efa1a9a951ae7e6cce2425d0f9f3c3101bcbe6896d7a829c81ef60dbd60fea0591ede6e2294de91b93d84d6f402995e416057b53ffddefdfad4510247a03f21c926d5560b68ed9ad467f38a93088a6b1f5da6432fa0f72c648a6a20981bfd15af212a147595d7e8d29780f6d0bf024166fa99f4c623dfa0c3db91250e9075c973d8cd3e324a8a3a68ef41981fa8ccf9ee84d02eea008c875cc9a54a8f64131f540b6b72ac2933b24ce2520bd37550f12d856023b4986fb2c8805e48727f6c2c50df9b4ebc415c97fc44aab90d2f27e2620c5005bad74a66c87cbbdf7e17a21b803adc688d05f25dd4c26832d100b630a8e3e7fd02742fc1c5448532deea520435112acafca9dc09908cb8d6e8601406902ed6714f227effea5408f1782744bc52213777e662c85cd023d21e50e4c4a00701b40877da0bad4087cd10c52681cbeb1753e7c101f07f5b2a214c693b9ff2a3dbcfd851db058a0437f05beae019f92d75f08dfc3635780c7e9f127c06bf4f0d3e43bfa7089e31fd0f0d11246d4a740b274c696f5ba905bd1acec8acffb452a4f9d5559b056b123a71160c24f3153101fe56a2c00d86999f07ce270a532e36ec57fac13096605f9ba6483d98267e4b17dc47003e233fa70dce6e57985e4b70cc253f69418488afec5f72150123b460699119e0580e8bba7af006da0855efe7eadd469015b8abc574c66a57ebd47054e920b19ba2f65fe917e4c04d4f82aa24987883437271272978b1210ad7c65cc6953d789201e3cacdfa759cd2546bb9115338fab8e3da5b008c9c5e182f753e1c119cc93286a6dc4879701acef12c0749ba33a8504181044339437279419559ac172089b1202b0b9a72b3255a3996ca5e294b3c4ed4809ebbd8b09934a4fd2bcd358378cd7bb62ba3653b70108bc256b9d77594c966ebe21aa06845d858dc500f78cd9e866f4decd8bdd2e971cc54109f68b37c050c28cbb42ea724b62ed0667715f4ee218b256ea18c4986c2fd41d36df3cf5834ae99602efa38c7ffbf7ea1319cc10535d8a23f6060bd671534b8cced698394164c6e8368a830e909f333d6c34c3855b19868db2d6f02602748867c8b908389e97b073fcb06570592bda3366e54d0009f7d9ae4a43387b880d8c90ebfb18c04ccf3e48f994674527c123fe5e6b71ec913a05f13691045c2c8f1e1a232e93bd890192216d8a7556a4629f1fa7740c957cb5032ad3d0cba3a6547d001e1011ce5059729dcf9566d2f69686f75601428ac9d2bdc090f4f454dd6424df78ce70bbf096f9d09d1e4c15a252ce778355e84cf79a4f38c807eb1feb735f410474d247af54fdbd11f3c4fd10b5e96c642c4deff93ec3a5c697cec747fe9e9325f196b8ee1c44c45890d36d024a54e7d7ec02ec49f1ae197b0c184243aa0f86c294d713198fea818dec4137cc230acb0834eecfbd557c9d01fb07f3707b1ad5b39a4f8e0ae01f872c5b6f53eecc4d058d4e2e39a5f460bfd38b3b6d0c60baad8ff8bc69e683ce2f6af3a2e4a376ee34713484f5f5aae445be9ebe88b8086fb9b7cdf56bf9ea0dac87d77c12a5d869296f125a44c880f84b1be8a09b037cb87b9397a310a31ad137d0501c18a60c094f6592f00783d3066e5c8fc8239cf0906bdd5bbae1a67fcb643c148033f5c50941acbff1955b89fa905d99f139a16de1da54b3cf4b1b7e3fcfa6135b8c6aa2c6fa123a5ff40c954057c6a81e39f834b7bf5d56bcb6fc23ff835f95c82ae9ec8859b4da1f0287939543618f5a78e7f9fc4cf044b1dbfb74bc67843006e3e0235662e2fb72d673187c1c61778fb56cffe7cf266825b6e5ad8e7fe87aba4594dce01123bcb66c6e8ca912fee0cc1d31702785323cc933919d1b7f7ef8b3da7d66add592e63e88b72b92a9177bd07c062337207e94924ebb8395df808cfb851092e96b80388a425742022f72ea09cc7de632dabcdfa8383340677a695adab58573568f6ae2a0e03a74390e8f9b992540566c46da30dad9d82c2f8839af8ec2eb0bedc2357b3720fbeed398abbadbf4d7d8787c4cae231fa0d8571fe8319942fa095aa4c23b1418bf05ca3396e70414572ef9ebae5c15feadad4e714e6d92a3096bad7888ae0e6f8c5bcdb4641579f5933f4d64329ae4d9f5582f0720657a2ad3a73f187f312cc4e70cd0eccdc18b3df4e7b067c0baf35260155f87f382eeb828725b2b69ed2968154ddeb3d23e2d3fba160f0756907a06919dd2b15dcc419a0c50dbefca6a4cb95adf26bd171e2035f05b5bcc7813d8623b63153b925ac8271fb748df44479adb98a765949f09c69001e0e0db7cea22419ee87058d34f8be4eea7270ae64d8adf13813123b077df887fbe521ac862800df1c7770f39aa9aa4c22450e7d5c9547517cbe79ddb3151e729b097bcbdb4bdbe2a9dbd8ec32f70100508d84036437501c586401463bf4c9d9b05effaab06e841dff3e4d5f116341dffb97a039bd5045048a7592875857eb901bc5209390be4d8cdab7e8d8496589fd3340f65aab528df322c722474120e0bc91bbc29c3738bf43aa8cdf8d9aa9b97357edd70c20606de3ad4657ae2ec85890c724fea20cf29171e4264adb4bad353d2d98967dbff66b2e1abc408467a945d6ebb009945e39f043a54f044205c9aa114c76ea1dea5d20e60fc638fa35df17a0e70bd37cbfb7834dab6f32ab14ff5c9e44c9b89a5c9309c21b9872e75cbf8664c2c310eea14ae1677dc549505a40185f599ef0fcc5ad7d219c45f6bdef9664086bd07931e6e751890e640f1718c42980744fad5d49ccf9dc0f3aca92ce0b3c336e64015071cb6267de3093f920d4c51a605feeb9bf6a31aa4ca475c8ed26452ac3e74e14496853b4e0f820f2572b355d23543dd0229286789c27348b3f35a92c664a963958481c49c0098bffcddfc09dbd1fef99274c895db2bfedcf61efcd4a849028a2ea1654d730344a1250e70462c9b78e9c6bcca7fa85af0dcb42ebe224a520d824f4c1a6ee271215102d9de754046faddddf65442c6b3c7107b7fc25b6de21c74119fb5bde8e721e218a786204f4a1c89ed7e2f88fa178b793834b641fc707288647c8dc891b85ba831600a1e7c84eb35281d99434abec69fd2b311b06af6458969cc002a3ff3d3a109d904395cfbc5053a37df5a9b280623d44fdf07d448e127f53fee46ecd0fff21d7b92a35120ce1ace0877826105bf893d4a4b913f5dd92a40c84af0654e2e85617c99cd39b13184f4a78926e6025333a1d61ac6fa8857f167fad90d527131c4f2da4be8c697bd9b6cda8d6b8201f1216a0058937426645b83f1462cdcd5e8ab71f6dabdb92cf2dbe5fd9dcaa456751506180db1ccc9c568011ce0b8e1373df908e161734e3b7da10c5a007a3fec510bfec0a380675b44855bb17e4654ae594934077eb0b8ed3469e39e75ef11e79cec6a6e6481324f4a7d9c27fab24c41adaeb0628da42c44bd97d0463f329bd6a53fc8e2067267aeddd6ad9e2acb3a1552c635cad2cc3bc4bd02bf2e1f42b64902592a0ebf4cbe0133ec2da8b178a9296c8879fb04e6604ccf26371ff05999b178fe8d31e5741b3a8b55186e78c099191428c21fbcfeedb85a6198be6fc830fad987a60f47f43313eb72a49aa5f51233cd49e6ab7a8700698cd48d4c13687918d11bf59ac95e3aae679a3043d2ca8d99b4222bbea6ba416b0c492ea4366a2a228f385615c06ec739619bb035ed3225b894813b0812ef202b716ee052e06514237769e61789d95a26b1b0e58970952b1b24e1f3209acf8cde8cc917f650367b4a7503376281e51f4a1a3f7a87249354a630671a230c13cbe9d57cbc632e3b722371e61862b403c9b1048637bf9aefdbf8c6529db7102cac362832b652baae02324d2b9d0401d750df8527429be5e89f5208055410c316ccab8c700ae4a06754d5fbed5b6e9b6b4c8245fb59019c550ea648319c9bd47272b7b03e01472a018384251e1cdb58f040d9c5241f28149b70c2b07ed48049ae55131ff1e306881c068a2c198906c82839d8d4d303f215d0f501de5093d7a04f495ca82d54b05141bece06d016a1a2b239565f36ac266df1461559b2d3c34c68629f62c60f481f9f325a2a6203f881143813d34e3acb5a3e9fbbdd8a4738aef0fce663db40a218522b298dfbaa8a1d102cb6cc12b64f77acfb196e38c485d627093dc889ca124033e24d1a33eec2bdb634e60b5e0395f75d8aab193b4d290769a48d94e740ab82c94adcf8604a40805bbdc52f8fbc2a49e65a789c82ebbf55ce5c68296a653cfed5be44c5016e52a20e324013153cdbe009772c9ba351b34db65c9a99edcad14eb443fa1910c4a2d802b08552741711b8dccc9324448b9fd2de9244a9a59ea7594ab516a97fa7a67480a6f52c662e3205adc9cae4d12c9eebd296224ca5d91a07aeb651192f5d794b88a45bc8bde218d94ba92748e2549e2f846fbc31c582b7bca270629a3c2e958ef9bacc5ef34ec1813689b16e59c45464b5353a6683b44597b1a8845869a04a42c37e3ae964845b0c06637067a697f4fad40ae6a4f1398030a8d048f1ac82c71fdfd08d38f4f7fa891f64396ef8e261bf51e4ee4456020ec94c15256bbf3d706ee02f0a01d5c1ef296b865fa9dda39eebed2e0d394fcd9c3458280c6e730d843c49d0fd65bdd0dfdba480afa99fd3e06e29903649b9c1a2e2413d2f781550659cd74e3713ff92037f26ed499b1c2513777b002341906c7d88859a40b739ac1de102ea56a0f17029ebdfd645ff609b272413d8ba369bb97d5765d61c4111476b4171ca8c3675907df9e4148fffe574c1b34582f138418035a2ee2745a300cda4a07cbc0ff1d299d60cdda49244798f1b69358a11b08a96cd17027c854a084fc4a6f62cd0f787207e03e73fd68570cd3f14b01e1f8b917ff2d0478bea9081e76d32bb9928bb82d052184eef8fdc9de9b6cb9a594324919060724070707b928f42f440a3398f5a4cf83b4277f1e8cf120e8629607b18828f220569790071d162281ffb917227d0e839579580b2f4f79049fdf983004992c22752d1e0f71c2e37bdd0d12992ef9ead4765effc3a94bf92de82a280889153f541882640443d6b400e5ca51e5e1bb0b99ef13dfdddd34420a9b05786bdd7479eb4688b70e8648d663a4a1a0cf4f0dc650105158042183104a8428bf3d886b856fff6e745aac81f103140f3fdcd982b245070834df413447ceac302fa8b0d65a22cff6a0068431f44d748027a755950f4768956153e5db6d586cb47cfbadcd913642f800435f893082304458202342396403238820536641c162e44836c515ae8410cbf86024009dacbbbbb91011ebeeee4a67bc2501102470e1ad09d2f440c3f3f0edf6c5112275d27dd6647d63f540e507962f22fc50c4d797198448a1c508293144409921cd51fbf4e9f4dddd7dc3f6c882488ae21a313c48560b87c301f902e6d2afb57f1e0601be3df300e49b071ebe9b072476e0e17dea483df5cf12cd7eebd9fbbdeca32e29c75039f2018200b69c1cc51c84900e9a231ea7fe412df2c16288231f2060dc51cc419071c4335ef99cfa17a35d099d07fedb389224eb0fdcb7b7fba0543fff731d3546ef7f6970142b2b69da1a2158c1ac3144299834da7bbc5d606443558bc025ab6d07e42d4713cd441f0950f1e787688d0a2605d46b1075cfd00648f3ffdba4f1f3d42d68a229c68e0c538c1d19dea816f951a560caa7b30cc1eb2985aa514ffddaee7a0bbc2aef5e5d6b68833e8cb6d94420c41c1dd0f1818f26ea320fd5ad7e60d6e800df59e79fa0a27c7cc0a30333064dea0e680d1d933ac96892a77ef3808dfb75a456660cea624ecc89b9167362ee69cbe841940a7bc51dea2a5efce98e46aa6dfd513346cd5136622ec5cb1aa83d83a28fecc76bb687f141332bc9b7ff7483edd33f5d6b183df435eea016b990229a49232c7d775b3b2b6ef5f1e999f58ddb7cb346c29e9e7647d3a75823771eed12bda3cdfd48bf72164599ccdd667baa407666b1542d6a81a9ac9aa86ca23540a09ee6a8ada7d80cce7a5a3b4735118995a4a89a8884390c97ade4a8cce5a954dbe814a62ac526ea4a568fc5623c3cde3c6ed44d33c063a526c25252392a477577dba71ad544569a88c769057be9eb8dfaa916d1ab326789b2aaea7595eb255aa39d704dfbc9e22a10ad61976e57a7a7d76da661a9760af6b8e39258eaa170b5c84655206aa5d013668c965192e0f52496c25cbac8e6b450c730cc1ad6696ad2a06aa2a7ec978693c291c246a7a7220c76cd7491575620ea596bb4b6b8babcae1cefeb29f59ba348fb949f6819aa6df8a902516cc57a3836f58e86a9c63b622b166797688d5c2d1247fb54819c688d3ae2244a41d2d3259ee7f9ee91cc71bdbb6b77e81d861f9e9a3144a78e93f0532d12472ed80aadd123866152409dba9619833a8981d4118f6d44eb524d9404535a6aa21da0f3c8384777f0109fc7634e5341d6d8080d139914500f693887976838096ec24e6da358c993c04a4f1d86ab45580a86c3230cd723296229d8134fcb8af830beded531c61763d701c2ad158ed8639eb44e4b2908b43bc9a4a1e2e7c5b7eb5a6ba551d7e7743b5629a94aeb6dafac5a556f371159d75cd5724d13cda6b5da52759d9eac66de5a4a956bd5a294525aa56ad107746ac6b02ec308b1675413512f7a7555965924a5a232dc88d455fc1d653386553181ac5bb147b262d5b1674dcb59a7f32d094d6f49daf5166c4b2dbed58ab33c1f4c80b573cddbaf0f6a11a59ad3da5a6bad36dbaa451b176ee1a0ca53085219ccb4a995dc97ec6705593533cb2056be67ed15fc9c344c8099aaa9aaa2fec455cee9c662a5719a5cb3a02115823c5a5655a05912e5ecdd50f1fde1aa7aecf993b340be9e6a393dd9565ee50837d029fa88e396887b2b0315888aa1aa9a3472066a117daa4034b745bd39b942067447192793b513eeeb40196dc48e610251e7b1a1e2f3d854330675a31e7d10c976ea2d644eb271ad346974d58c41b9868660c0a865ae9001dd116c6caa0a445dc60f2218321d9869b47ce2e1a93d0d08814c5556eee98f5b620e974b8813d75769fd7ec7efa0ef854ba9e4e28a7a5cce399793463b75aac32ca2546ac23ca54a54429e7a98234f9d3ed5a2cfe9533bc9f36da681a86ad137760d5db8ad5e2386a78d483615552da23aa8a1544bc5f7484b3662fe590a59f399fae73384803df14d558b606316656e6bdcf8834836ee0b9dfa592691794b36ae71b354b2f2d49b4b13f553a7b86eab174444a4491d531898d4f59356e26d98c1f48fce19a6ce097e2a607af6aa94a9aff95906517a1a6e307d7a8fb9bb3d7b306350cfb3dc54b588ae40e6e92c715c32a5d56b8a6b2272cebc4693284d05cf1e4c1a3dce6c60db8ce1156822183428b6da4d152b22ceb2d3254fd225eff98c3a3d1dc1c6b9a2a70121fc3822c56faab6518aab454dd554383ad6a67aeaf474449750345c3e5dd7598c33c6b9c3d76275187b8e3fcf2f2dd7a2cf2fcd83ffbc03ff8da4e7197bd8f3e87b9e7b38478964bedeb977ded98862de7906459f986787c1603c3c3c7ea369248df4f73e30f468f3431a8ffbe058992805d93f1ad95bb0dae4652bc54ef08a78bd873ecff31bd4bdd17a5dee46a1a1a18e83bf9184f164e7414d542790656a618cfd463b1e3b1a693bbfdd0428059956289ff5599b3ef1f54c6b50bf794a0cb23d103fba727d56c75883ce617ea373d868495afef19607fd3c624a41a5d7d6d9b89fb5ef7cc2f82ea869165a833e1691cc6fc920d1f6d90b82a0df6807fdc7631a69c1ef601df8de48b3500aee5faab74fc38eea6bd6773b6b40c9891d8fa407df6e542dcdd22e32be64cc913147069c1332152850a4482193a950b162c56c26a34e8b162952c8642a54ac58319bfdfcb070e1c25db6e2675e4a014dc55c8162f6d334b70dc597a28bce8e9122f83c0b33b09f678c9f1bf427d480be5dc182d622bcf1034e9a8bf046ffbc2dc09fd0860b9f36e642f47111daa86fdb86e421122d44ba127bac2f5ebce8172fe88b7144aad55e0460084900e18d0eb2d9808006308049fef83c634c1f4100d4e88b596324086f6bb510e9bb2d56bf560e1d6760c4ce2f5e843760b88c3a31e468aad9d3ccc9ac6905d7ccc9ece9de4923f5b49f36a459fadcf7ade06aa2f977f6d4368b69f8d164ae8a10c9a62157179b869cbfaac175d06f5c0747d07f7cf61cf6d17e7ccf9c500ab2f58e8647db3717058e48dd8249e33651a6301fb5c45976daee6e447fb2b5b4b4b46a0633beb29f26eaadb6792d6a2e2f4f42f4d6f26c7ddad651dd488ad78ea4185471d7ea8a0f3c26f175348faea8f97c642f389df27d7312b5db39aa19d588d46db7c5b7bbbbf1ad4e6dad55566b9d330022cc490130634ccfdd3fb3986fd63e5a411f3a2f9edd7b69a55d5bc759ad467d9b4e6b63f5daf7f24d74f77aedcc34d3222fcb68d1e7d3468b4037aa401fcd4834aa40a207804983faacce49c3ce6e23f7ec559e51a781fd3a1ad149031b19e10e4ff8a8ad183ba573c6c0180498368e12abedc027315d1e27d01dc05fa1bf0b2801ae182700a31c2891bd2be606404c3846895fdd95af0d0fcdf9de3aadb578bce3bc47767647d53a9287248832d995d5a29087274693b14148eb0155d028f0d5e7ed49ed91950147ac3ea62022d52f9bb174559d3b08a6839d2767d51c3a47f8408788cf747c28d2761a682635d07c1b45961a680a21f6fcc4a293c3bd23c67e62d1a9a243e5195d8041021a8b4e0e9bc1a1889697214f5345702978ed90bba2c3043784111b4b4f694aa0fa92247765890d25a528466c10c161a921a1898d2155433cb121442aab7462a304ad0de828617d55cd1388267e6289d1e1c9fc02969831794964f1134b0c0b188b38fb892506c96725f2fcc41293f44535470e8c9f58614830c72b97475cc7d93f1e3ad5449d53fd9cde753d775a3d0df285cd534aa7a2ac48f1f0c03c77eedc918a727a828a59d0a3643505ca294793d0a630c7ad04941826da4473494a4be09089ac1cda2c3d4dfac00ec57d411fe4f092038391628a1c16e4e4f0608bcbcb615341268817b83c7040d69a5cfba12ac10f6b1c8041d9f1b8185830adf04f4d0c13d4d0dffee61cb2019c59e1cc2da8668361b1cf8c26648280f1b476bdab160177eedcf1b13807786685332bdc8fe28b6f4ec08fbf238f3a3b6bbf693f3aea33c2376b3588b479ae931e893231e726a2b44a29a594524a672c889383eb5f06c12e022d9822d2afafea5757659995a5a55565b81171188a759bc52ce69c6f36671773eebc3ef7130e87633a9a8eb7ba28a88128eeca2975575dd56fade9ac7c7b0725a7ebdbcb8ecbb777546cbaa92672d1357549dfdee1c84075913710ed6aa596f54a09574565bfacd795ba5197eb6ae127dc84b38e48cce5dbf114b6535add252d33366ad6ad4a85b5c85c75c156df2d70144e22f5dd7ebf9ae8e77a7dfb5d33b1e6a4f0dd2ba82e549bef9be4dbaf5213c92eae8beb082a299cb46bca264271d56ea5e07cdb269bb3f3b5e5bb76355109af59dfd54ae99bac53432ca9b5df6af876d28259fe560766f826a79ca822bee79df7bc9d92813949cdd02c2cdf5b49bdd43938409a8a4b775b7579e5f3649b69af96d3ed93ac4a2f7c3f5997eaac9a57f30b3749ca45f6d37777fbac4ddfeede224472ebc25984482eeccc340b87fb16fe1322b5b0220b332c707816487879162c9028f32c8e38e259f82c4462e19ed4fff88a10e9c70ee0674750fdcc558448b3152e0b9156a8b8f32a3c4588a4e226f1752493398a104956fb14377c0a3f1122a5f8ca148153853b4281c27d422414e2f827e434fd093711229df0f13c8b42241fd184115ede84f784482672091743a412b6d64541413d697ab07a7a5e7c4f8f8b4584f03d2e2b22eb7bdc8da0f23d3ed77c8ff384483d4344118329513c238a0710c5a1177d2a79b182174517e1e4f0a2cb4e78318e9d17dde615c38b1e5482a5173d16228937f1793c0c9178ac8d1131c3c71c0c916201a153da8e9897701e1a69c279fc133dbb0e0ffc78d1e79c347a88ef39f5ea4da239dfa87ab4ec301a0973f0619ed72367f77acc32f0a7383ccf79e8e8de67ec91df1b2d68db90d1056dcb3af2c8233b1d41ec94c7c9a01d3ceac7fcc33011d36622f6bc2c3cea831ea3e188b9e8e3d867a8009f1187e719f699f0461d1d48c3811d741b6ee0efe344ce578ffa9c317c9cc72c037f98cf878d382c685bf5fcf9cb307f133be68c41471ef9b38efa264c38ecd6361d17cc18d5c8440f1ddd57306354d7719b31866030cf43278366d8619e09186d6682c232cccbc069308ff90c15001b7164cf1f236fcc2fd133f6c831d1fdc5b147ed5133c84f9d8746693bb07f238ffa7787e73aa89c08dda3c9fc044dc98f4690790a2a2948ea9f83b058fddc9fe97b2349a98fcf309a8e9a4176ea39a45191b993adbf954dec7cf5a126a216ecd04145c98f94fcc8738fca092a285c46b31955d0a3e9f0c08fa782c24fd04640e1279c869fac6df5e7a3050dddba1ecfb37f1e6de6c5f01ed5cf10e6d166302d1ecd9bf2b2fc0ca91b75e73b72ce9e471cd8f3df19752fcbcf6ce4f760786f8af6a8241e7574b3b7638ffa748610b13da87a89169fd0127dd569a80841c2979a375344e61c39539472f08a3215441234ddc25587e98a84480d304980d85e413624c704576a30019c1d56a081cd521821a40411a10b92322abc176eb82424510394262648e29405c995365a7408a3c31926745cc85c51826891320526cc2cc2083744ca2d59547040f266e6b5606f188b45b116cddc754c90f8aef349cbd8ad753b55e78b0d288cc9a1ab841f3354719284a393041ba8a3b269c8779e54dd61e6a87dd70979891d15bb2ba54d0d56253cd1ba537524d6a207dca0640b570397d299a36cc97c97e32614479c6f71e4ac9a17c8423b7c9b89e77834c2e002eba39d47be5607bd560fb2631dbbce25c9ec08652e84c7f571df1963a44e09375a623ce0c081db93b7bf3e8bd82922c48899cec372c71cb7d76264e9817e9646aa7cfe591a39a1fc668c113d21166e0dde2ee8a27c349d832e8994dff3b35c5a23fbb208098f1dc4eed86d411ded07dfd147212c5994fd2c89104144abaa6f9873ab8e48cef2eb5707698d165d106d3e6eb76c453edd01dd7a4bfb992d76511055130b619ec05046ce51f59f269212c9af851541d3d7fd5489d4ed639f61033ad0b69fafb36d20ad41bfaaf966ad6dfee336918d48fbc88e648ee6fa3aca5c10e79332b10219f54f0ddd43be598baa5f9f209bbee315ead341a0944677d55d753974a5d75f39f75eddaa6bc3bd82e2eed862cf4f392aa790a1f2534e2147e5282ac5c5d5468bd20a942ac855a05441915a414e4b08ca5a6badb5d6363535d55c6dd26aaee6ea207aab8368aee6aa545555555db854aa2eb5aaea5e4ac7faf4244485ea537daaa195eead9deb5c17b9b79794ba48e73ad7820c11ee37a77f73cc9da5a2ca3235b350613335723596d4c8d55852a3a926d444946571d26650d2a5a253744e2f23a32a9bdbb24df7da243667973c4d7a3d986be604a8072318c277e8d62a343444c3acf282c14ab8b59fb793d97962e29773f6d0bf9c4bd0643edb66e43d6e5461220f8d1caa0a8d4226111cc976cc0346f37ae8efd08d33b7de86214f8e812e446be42b4429b830999362f7e08d1c9a4143f7cead871d11bd7148c80a75a390100adfac2d71d94203f5413f6d3823e7cf9879ff698399acff3a7036118e91d845bf9de70d5a3b923c6ce865c7a106b0b7236d13deb0fef967bbcaaef7d0660532aa31ea61ee2229d7e7ea337b3bd5ca397f341c22b5504e848d5cdf47494b8a19dfaebfcf23ede89451dfeb51dff410883282882b3e1027992b499ecc95a44f00063e6deb29238838de983f9dfa6c3a11a9d7376bd57f1cd9fa659c7327f3bf30826eb9c393fe8c016e471f57b0c3461fd6dbf1e800eadee8a33af50ae49b35f24ae192620ec48f62e3950fd754892e359117133fa7ef734e1db46957fd3c74fa81340ba6889f8763677367eda7836ef039cc3fd8e7f341bf2112f881df375a3a52adb64db25a7596671e9a95aa964bdbaa7f14b4483c32a6945a1df471d88d96aa6dd5bb9e8ea4b5b2b25556aa02592e966a0791a45a5c526012eadfd7cb3363f43c422479baaed3c0fae737ac7f947a97ddab3f7e34aa1d6d875a7fe38eefb32e68918f243847245db80b5b7ea947319fad559b3a91e6315a484724bb37ba00836eab32dd59d61556e09114c1d563da8aae155c33275632c64db5a26bf684674fd746c13e180c36929e5f918a488a1c7cf6b39f1139d4a117f3783ccf796261ad2192f7d9d0adb5a10dddba98dffa17d26e3b48233fbf9de7d6fa3c56264c715edf27d02b087a6c2461220c2207356752bc437fbffccd180db434d0ba966dc23becd7ba28764771e826c2f81ba3d5300cc31f0f822208bad725a6b81b2638b3078ea4f8dda8e2279d1e3c29936d552615dcbb8e93582d19e38c4712e78931c6184b055d96ab2ca5c555a099b15c5d6ca526d12fa0a192430984c0512335074c1839658088214dd3085263605e993159c418638c31c6f331c618bb80ab4033638cb1956c7d8a6deed4174ebc34fb9d2125de2ba781260730d869204feaccdfbff7de8bedbd3e6150fa7befbd335a2881da160ee3768107bdb5a0f1b50e5a4a29b5d6eba351a893cf067ad6d01c98d1e48792346ca67409a3c58ae9071d7e4cc9a1882c31805193e54e95333ad05862822a2fe454804a530587c7b85400149c3425308571526786139e9f65952e5865edc9dae7a8fdc5b45a0c8ca874a540c7da2a5bde5a6bdd5a5badb5555e786bdd67c613db54ecbc8b9f65952455828ce0fa2c03d8539ebf23697d96c14cf3414f623cc349c4d8eddf71d610c9f2a0df5daabdd65e5ba7841dcfeb045a71b5d7da6badb5d65a3b9271300a493e003fcb146e48c10a05203aac0c6547cacd2670b8c589c0d5161276f84213250a064d26a8d13ad3c52486890b53d58b1c6e71728ec141336f15130a20d34773321154411307c893375d7006b093c4cc102d38227c3952027be408131e0e44863092a5240d982d2dca3421c20419b0e8d839ea8e647d77848d48c6037f96506d32545843f016275719610055862a89b3e9b0077f3647ead3a16c58aa7995505cbeeb6a5e36d37e96504fa094b29d3d69125a1c54dac1bcae9c856210edcf126a04ef4ef6b219d6e16bc994279c00ff2c4ff852e1a35144ea3d5e7b4eafd46b90a61178223357506a816f36d1bcf7de3bbbaffbbaaffbe677bf1147bbf56ac3fad4f63a7bb976edcf5a58adddb45a1f9d670ffcf8aaa3fe1d715487517c04881268786e71728b9fe5094c667293179fda84c544beb6368b9fe59423a6fc9026e6840213ad1eea0451e1cc950b60c6883083d451d704654c3e8331ae615c4e31f218638c31c6425ba68430831132883e3ed4a08317295e9e9c55425562accae66b6b4b997adbcf72ca95294f4f0645c1526dc55de76fe660b132048822ae54c10202a4cd10261411e7868cafad52b04891fa9642a58ba78e007e9652708fc99840734384899718de9410028d324c99aa375f5868ea94b0e3cd8132bbaeabd382d2094fe67c29296dad09e149112a4854c170c4d4c533ebdce2e4173fcba7328f7f964f644cc839f7add5d66aadcd6d445861d42c11dbac619521db6aa565d769a35eeb5427525b2304e7fa8553b335384f5c66882092414143375875af858c10b3cf0f41cfa0d37003d0b397fd0369a1675a06a0872389a3739883383a076938a87ff373e76ed438aa7bb9a38f4dd07ab234e1eb7faedf70031c5566c3eb1fce007b3792382ec6816938b05f9f21aed5418a8da8d5e4585be3c02dc7ad080edc6a8ffb38aa8360e739bbe75f9e25103b9fdf7ef3cfdc833e1d6d8ffb78c461fd8e43bc2a245544683549a208a7339e181c0b66d2dc995a1204093250e3045f4808020e141166b8ea2ae17051422748112460a0081d303ee4aeb0a074316900852e2430e9503546870be4664ca162650810282e27a047e808f9c1871d5048b345e668fac480cdd4af5fea382e38d2a6948a24504a13040c93285da264518a0235bd37b71b93120f139398953a021532e9a163b255a2b130190166a2c6d2a46b6b4741929de69bdbed4b9690490a22932232392b961061c39d38260071b3a509072170544dce68a9a14d93252e884bbc1020cc12269e25527a6c08a26acc92281898bc1113c70816921e9aa03113a5e44d4c091d15605a00d36469088e0cedd2039210b4a8b06507255b605602b0bac5c14aacc49434f9ae5302f55dfeee0b1c99122026aa6e71f2f7b38ca26462879b179ab35259426f725e3a610b105e6fde6c89e10813c25439428622565c5e0d5e95074f727237b450cac91ded70f244a72cc2c40914906fb7659420df9ea1d849a36525e6276709068a9c92830ed83c19a45579986f6eb7ae282357554ab0852987b0045348d0d08406ac21921c8125795283865b9c24251c6901bcc5393243ecc898b062b9c5c9267e96507290a334fb594279e184ef6a5e2306425f44f0670985c993321a449e9f2514a59741c165153f4b27216857ad6615a4e6450309352febd4021317b4ab565b2148cdcb3a355921d4ebaac96aef49925ae65d87976a5e5d76d029a9e6653d143fcb2770644872d7be1dee3aecc64b52171c72261852e6044d475278b3031036776ef80e490b5e979b11beb6f613366acaaeebbacee797ef9060692b69aac070f07e964fac722e6690f9fc2c9f484d71070a9ad99be611e8eb8b49649dc5db136fc3b77e6791e77962983752ea7402d119fda6b507e8eb96189678790bf441288cd9debeb22591cc426c7a86900bfef50ee664d7751decde194268776735f2feedbc1bede30bbecd3f2e0fee62a5dedde149e66e847919c4ddd449d9f58f0cc1db4c2b52bdf7e924bad3c6aadb78ef12f169c938a06557eef26824c445ec7e964e5a4fce52a88b130f4fca6cc941072efe2c9dc63c19a455d958a9e9dfb76f2edf42f4c07407cd1c252c6c8ea69692254360f84188d59da3765950772ff94aa39e0090d5643f7e2449ee49e84dd775b4d63d0a0d81812dc5cff249094eec38e59c4f1932c392395496b8b152df3edbf38f2915baea248979418d972d4f86226c90d0300488244c477309961ea43081612a923b121a22480a53998c57f7b694284c7dfd4aebd3eca497b3e78ed6a3eee0615d47f75dd7e3019c57a8048ed5553909111909000090006315000018100a89042391389406a2b0b90714800a749a426a4c30130743418ec32888612008a218038c310620640c320a19950d02043759ce9c6b0904bcf5f909cbd65c7481c2654205b7cc431d905cf7a0b1ac251e5f4c3ba8e83c6eb8c8e30831950f372c0ac03bfc9392f890f6a39d1546cb6ea70a26f746c1ce99a1a830b658290af32dc76053f5b5e173fbb0109395ca4b160026d2de9ea58d9b32e9d65c28f7f0cc2f6d20ac224b8642085c140908a60f39b8b0e97b61af82ed0f8696c6d98210e2e9d4fa865c9a159d58e6415c969cae8fb5ac8a0e7a52e1bcdc290180471e28472e33c3f82f04e57ba58a0d3ec5018801479ab7a847562863c2c2c3b188025231826125a9516128ed36181611843238f8b3b59a80d5aacffde539b05d2104127ff964a8be111385fcfe4e34065683b6f51cbd7f4f1b48100aa4e581a80021185654809e170918192093965276ac45f0dc93004792bf39d8fbfbf506d47712608edbe95243aeb20ff80cd57e49b929a848ac62d28272e50ae7b0ad1d3b39b1bd8b7cc7cc48b4a7d6f7fd3a05e453c235b4c341bf4cab861dd157bb66538d99d642305b00b899d6b39c6955c7ae76933b92b418b6be169322c74484cef2d4a3311c38d2f77ecc75d2b47e578f171a11598b5700a47d8f867b9801d0c6d5c0b54c4c89d41de34ccdd3fd25f75d09a6f1dfa95d7c4f24f7ef5c7bbcb036e29e2683b478d9ce96fe2457c7a189f55723afe846e473607a4d6ea524999fb75d75c89d4aa02e22c8328bfd7923f99bef705981fcc22d2b42725a1cae42c25cad0b83ef047666a8fa7b0bab3eeb178f246b2d684db38355e6f6726eb691628308c0a72a08e83d1c56555f78792ffff171952e7e85180ead0af2c022a80b079e3851646f2ca51fde564d26db8599be577df87cbda5bccda0a6855b6cd0c540161e1d3ecc00cd7d7cc855c4dee61e3f04ce30b9737b702d7523aad30c700d65776288e4e4eb6b6c172ce43ae534952cd9a63232ad2b65cb260c2b5fdb7ca9a5bfd7f97dfb7138ca17b6a44c6cfa6553d7cfd78ee5f38c756f1b1af0a356423615a197961c425f647afcb00649d493a87a4cc8bf683df756bc5e59dd153801af5bd9f102f1578b5cd38919f45e3bdf723132962a3f544824f1df6c68a2ae620cb821e96e004025e5484f072d52ee597f59a7f06259b30baac796fd7841d5727c4e420af9b1c2adc6d9a6497e770d762496fe6dedcf58029ee0810fdebedb47a03fcb648245cee0b863d2ea8d664be90dd624069cc701cbc883e13f728b454031085629874adb5765ca39e8b2473eccdb76fdf7fe2c1b7c9ef090dcc8714e6910b339679873198313f6692e470a2b6591d4173c1813465969d40f32a2f6303ba7a0d470f4199021103bbca1db19e9554aa71335ebe8d8f7e2c08576e9e7da245271a62efe396a6f843a642e74e8699634f72a1ff2ee5d882a6524e7554ab3755d2411add001489d7625fa78d15fd22bbf94b1e7855b80387eb2f82c529f7b43dbdc7b31c7ef8569b492bb33880135eba6df0713d60a796a0088bcdb45c38a82efe85471abe4f283f0217be852cf32ad5f62003ee16677d549602a0c294791dbd76cd6082c17241d22ed8b064521165a80e3648024a46f4dc7a4ac27889b26b3d6e50684677bb3b747d8619ce40041f0b90403998066ed893052251fdd28b8e151acd7ba16eed5b970512a363fc4ca293068cde17df822a8b024699c14364a84da38c07dd1d32efd77214c231ac22c6956d589fefa88c49304fb5b69623ba22afd4c4cab51e8c14ba39b7ba87e43941bbd445a717670ecb96ca1b27e480571cd3288abc113716a167e168a3ba28e1f86bbf1862dd873b7aab4ea423ca4697edc1dc1dfecb79b263498edbeaa0b5eee480f8cbe6bbd0649a84de084c00c47f6683306c773aa85473e80a964024c30a04c800081e83190ff402552ae8b363bd364077c1da3221b0ca23d2569ef963d3db4a380bb249640e0fce3c776f40701581db2ae8a9d8a03940b1dc43bcec7e8cbbe50a82d05ba20f09259262436c8308fbe5db0ae5cb44b94756be3d2a4a2dfd3b106e5edfc57de022b0e29c0f643588941bbafa793ade209611e5974df089fd4e8d5c165dee0d1d01038088c6e84d6f172e4886cdc605e549f0d9fb40feae386dbc7d3ad9e696663e50b5803cfdf0ff5f4d41658bed053865ba31627fd22ad11371cc44bcc8d115d1e55d79245ff584c9ffaa98a48c2a8451d198b26cdaf60cf72461dead2f2e9f9965d06bc0228f69b82763ca3b594de80204456de8d671aa9c5fc7e581f940a7fa9d03fbd30d0bc38272ff15f0d280798973429149358fc8ec78acd126a744055c34eda8da0a5940a4e70bac84e1adbff3b8a76bc2ca4a3c432b30e29a87939cace2689006dcaf9c366dacfd1fc465e55e7a5d83a8de753caeb01c198c0e9d4aabcb1aa5b4156dca9153f6275fe8410a328b98ab1dac2672a09e0f9e416a88523955f78b31862bd06aa81f641e919a5e522bc11d42af53baeba4d8a2edd90c48fcb4e2cf74e8ce4674178b89e3880bbd87012d7daa33eb5d4cef5ec396a410baaf811b1bbacebaea9053680d9c3e111ec6981a26d0f87694b23971f49212afe0859753765f69723ff60c00f4aafb4f8379d9a882f2530abf7707b09b828411c02a194bc3894cc6a14d1bf6ab3e9ded9438b58b0e703906e141e11fb98b8016aacfe0406789bf060c72b5125310c11d18b9a9b83cd8c81f4634d7e621e5609a80f3bb2e00a35bd223b04f4165fc590682ececdd57e9e5063ed4bd958fab95e9c846fe63f11a5d27290c17c4730d6736dad0a6a7dc4a1a8ca1e60f8e94467bdbce4ce9970423c1300be3d8b27a069e8b521087e3ad1c78bc25d728bb71a82949e6182e540f75025c4c46d366d9272b89c3fe06d922c484f1ec195ace85b874f30c447935b891d07bea6aee4955887df38edd77be8c4d80e44094a16de801d3177583a4d52ac29de965dadfbb35512f9b956d93938203ddc200b6a14066d4a6b07cfad3e0c7d9ed5d8a14d08f849998720c6549b027e46100549707f7bebdcddeb86f37172a7bccd9cf626f760889ed0077d0513b49fc0b21eb5ab28c6c58cfee6ce78cb638a584a2734201cdb4061dc06cd3e82c3f624e58ed53c089267441558a3e387b2f528dbaf66cd263a9a12938859034fd29066072372e49f80fc3b21e6af4ea5e063cec0658a866dcb047d9d05f615d6c10a0a8f437807b74ecd70842aabe06051960f91cdf2fdc86824cb10318af1ca034015f00a20feea6c74470c41830d4993eaa0e5cf95779cc1e1ca1a1da5664b5f62c479580ea432b468a8ba4d6f133ced7bb3f116712144335f60d35dc6a0901d04b35ff34824d34c21ca8db918ce57cd403b540edb5ebf2f24c9f40e4c5fd4785318577d418b6b7067d322f381aa54d749e01a2298e53d079f0a38499e9816a3f09d1a1a27d273fabee72c621b87e907c8d09312ebc86b7ef74df1db48ea535d032c02182b8836b187d8996fe82573c6b778036e137ce82330363110726452dff445148173f181f0387c4e8d7b39fbf5746c3ee45de773d2ceac3133776f6fcf26b0faa0430f0ce7b59d83a3fe18a4a682e4e37ae7e11891428f8c5033646c78c1a027da5b6ae9110ba2a44fade25660675add24bdcb0fa8e6652d2edd22fe5dfd9d8270ca877fe9088a5e0b46e020c3ebe01c7db0b920d0a68144f342745d36b5cfdf25d7bde689cc055e99020c22419a5431a467624beec4a6176cbbcd36083137dbbd2fb7a400c38d983262eb330d75ce34e8b3efead9f52f5ac324d138a61432b5e4163ba1704f4e487242f72354a4c78183cc463f8378a2b9dac09bb7f3393f933ed97158921be9fd59918e1f31f1acd582463e9095e0d39dbb265e81cf77e65f480af3f58bd0202f020998c52326aa2f11282a86527287582bd5bb443e4474491dd2d1232a11db9392447213d2295c201b458b739719b01f303f42b6bc968b49dd96f988418d403e497c40c5485eda287887eebfeee89881cfe44168556e76f0481fec4cb59afda220bae47ea7a7e0f1ab0bbb687a1de5f3006cf279478d19e64a8a7543a9df9ae08ee21b956e85fa203b657728802d862283e24b1d7e42f408ce47f5e832283c026dc826506352d231e357184fc7e2218ed53616481fa5d2d7017e6801c406bc26c2b025c70b2c2a6455dbc94fd693831fb99c10c5e489cd15b18cfdba45cb98bbbe38403a00569db12ff8cd65dd771c63b6775b2ac4204e8ea49ef6b1391dd7c5373299cec29c1c7e8151ff8c83871db75c865d2fe0b356afe6f218b9b0041e43f3bb0fe2118dd607a4012aaec9e357ec0bf33f00e3ca001e8ef1ffcad037e3c0cc11d7cc9d37555afe582efa51033f0ec06e0f3e9d878e34ded4a69b44d50bb4a9a2ee771cb97ea0204f9e1a72da7fd0cd6d6868cca6960353066fec53caa32e0d40af76dd5f649f623db8cea0079f34d5ec8e90b6b926d962eb91ae3befb680c6e4bba3cb416b0208c84eee5ff062e64bd3f16ada1c480c56eeb7161e4c11ff156f568e6c4876af6bc94c05e5f6589ef421b64bc2e9a0f1e0db4692a6bf1b86d1f4397df5a66dadda272babe77725deb8238701453114fd4b8da57ab027e1ccfd8f6b225f109aa90863ddbb599ac22b9105ef735369afea56ca108b7f3abc9b0772e621458a18c1f8fe7e236e29483a46888f6d0c5ef64c95fcef2247746332d862e37737004998ca914436ca3c3f06e33a1c45a8bb2e76603b38ef66a66bda3c46d530ba37c07b214ab5af90172484f4bb99f7a4ceea2243e91df91b40108cfc3a8ebcf7efd277f6dcb2773dd3c340587ce0a62137d2b079663c1129d25bb117ee701f7aa20a03c817305a9e657b5fd4a2fab7843e4f8080ffdad3dea21bd9b614075b021ecd7515c31a3f07ba4a18ec455bb9854e99c5dae071ef3bd24b7e133db7cf07ba5379d23d1436b53193974e34233dd1c60954a9660fd1eab2896bd283d20c1949b394d16daa1927008f54e7528a1e309883e0094a7b3356da35b9029faf00322c05917d3925a4ef31e8ea408fb71f558e05a6f7eb10238415f23eec31f3b159afe8bba9597026f395e9fa8532b9121df7c5d2692a319f9b21d387e22be86bcf4026eb94481e8107c56fcc050fe1c84d2c201ca6194b1dd20d60b5ed784f8f73f2f6459c35c6d82bdb8db87670aef751fce78737ceec7b5704c9a40ea544bb5ec0dbdc12593efbb3165ff129d02970855ca9377eae0592e54728b2d84292a5e6248b98e0af93a1824ab871f6b3229b4340174f7169a061b1c3f0d09426c8883d8895b1ad2917ae417748b0441cbeae3c90904d44fcdd10833633c063dd451f88e64bdc240c621b2eae22219e5381be9d26124945641c1238dcb7fca1ceb87c4e37992c3623e08f2b4c248dd33f606f0b4618331308021540ad4b8b46eb46c359b4465959f254adbeb9f72eb1f85986ad26ea75aed544fb6fafadc28e22d6e694c5d59e9cc80d74687f56ab259c7e557b5588d3cb46ca973525b794b8fd9f75550ff59a84c60915d5bc5e163832b447308a88a69a32e818dd292b8eef84d7c00f6ed2312a9240f9826dc379f157fa078a115ab2b53968559e9edd9fcdc7d44261b6035c741f908d0fb25098f8416138b15125be48156a04c095d04505740308f2110731c1fcb71e03b7ddd5ed58c676e710fd7ae82eac64b4021db6e72003bbb34e897133de8083e38db27aab76fbce78f56a855964ec8d839bd3b2f8011795d1339f79e65da31dbf3e26cb20902567610b56538b53c356bcd708a50ee32ade65cde08e436a5117cc3d119d2c8fe2b4b5b81a2b607764d34932ce5aa79e8372467bec1fb9d9541d384c1d46dedb6a00a8297b6473265b88e2046118064f440ce72d7abd33ec2a166c5671993207f812ba45af56226b26a0dae37d26567b5a9de2a149e9c1280323a9bd80ad23d73a863321134e1738249e335048b61ec33343ef95cd0589330a7452830f95d316c7367969392b84851cc622ee227d3c339348c5e315f3c60c8613d3a77207d67e6208bed3a3df2a2202e005489a455f12a5d61d25ec1267905da54193f4cf69c3910c9fdb439a768057d94b627071d38e20f089923c792e14f577e3f4f8315dd8949c1eed18e8e7437ffd34004e143c602927c7114d75c7f3fd8f3bc7a39a433eded13b051bc8eb2e2943684889b12da0d2bea00110588366733e3ff573c107e7aa5f00a96d6a222bee9648199cac2a83433500bfe899e056d5232ad3b37010908ba0af66a4b2a475a6ed198d481c1e446426b7def172888a8a43cb1a6283a199595677f97d4b0846a01550f788769e0f8c62d1b2d4bd6b8156c4cc5eb39c6f7927f84da062c536bac1c9cffdf712a8b1e65cbffac220353f8c062bed3bd6739b2a3088d1d08cf698543d6ff2daacd60e6cf53b75ef045a619f9fec2f32649faafc026b958f40087579cc6d20891cb4a663266cebfeac1f2816d6bc4a06eb8e8d28a870c9a88489ddefc255331dd6e989c556dce807345f1a872fced4b8006e2ea8f4b9257bc15b7fb2c5cdc03a82ffee35c01564ae8997a3dc27d691fb53d08f34d0fc6723d7313659f5a6d7f51cb9c6eb4a5a52ac6697bc8cdf0b7ae306bbfcef08f4d901b295dddfa9364802e3ae3a5ac146d8e043b911e03d58eb5afd161ecbbdbacfa34e0fa275af0fa7ae12619149292c2581bad58e751d8ab692e33d17e6715efca88ef939934bb806b1d48ab9c33236bfa7774d81fbe0952be568158b6f9652016cfbecd5c15405503c766dae1ab543e67e5dbf225fdfaee03876266b44d7ab89cec90f7353ded571ac76fc77a1384fa49a8300982ec5cb790deafe23c7e17bc9c13d48a933359ffe2901bd6ef28285bec2232a0d675247192667e5476abbfd13dcd0e2409cbee6c15480ce901734ac1ee2d3968d8c8cf5d334ac6f2c4d70aed8fc36a811ce7861668e4eb9fcd2be75f6b18a26de2faed46b6f5d4461c5f91b551fe253c9e5d1edb435460ed9b08610ed326fe56647776aa1c676ea9606e5faf1825e7999cc2b16fed4edd8c5800aef329c46ed5770dabd9f9b31ba24645ca1e476edede9ca034fabf7e5c3065572030c9ada125a868bfc4331cebdef0e502f06eea56e7aabe3496fbbe2afaab1dda3c5bdbd06d4f6a62e9c4a10913eb45d1da0b9e9b8e10b92405b826869ebfaf109700d6f28a07ab9f0a0e37dd806d80b26cf0923c0f5d282941212a1eff85e2e6b60285d4791188f2f1a2c4dce6a346b7879404ae8b3b9c2f31a4f3291ec09cf1b492171b795bf4687682f5625dce53dd3a4f5c3612f0ad6aa359832ae726a55552aedfdd951d52fa603403bf3cb24c37c3af7e3893e5d82c5114a54e826c96d17a1b5362e33e1c23b7900747141d3520b428538a2dd97f6480021576642e9b731a2240b0ddbe4fdd6a352fa77c80c605e750aacfc4436617a6ff3988e91b7fc87d21354de7bac0be01707451dc9233042a7e81d19b478d7e5666bdbc92967152fc30d1c74d374ed630328c0d1dbb91c23b4fe6dc3a5e496d0f5d8547c0ba07960aea2ffce7801c3ec0a811d61fa1d4697f5f0e3c79912dea37ef5bf6c26fb24d14fa8cd1d515acf8e8577c61db31df700beea112be36f2b61ada437f50949f59a1028744022a0b9a1a292181a279f62a7c481605f9cdb027860587b6388ede2d8bae854a6833832f808351e02adf5e5c7be9fa765582e535082c55d72c44ec7b2dceebaebd34a9337a5320802f9f1280e65f0d2e28c6563c99960d7400b822b2851986003443f133ccb89006767c3ffbe00a556e403afef2bdb0bc28fde91fc163123961c0aa217671089a904505cb0751a9a794719c18d101cc1ecc3ef792a37e99697b60ac816ed3ca622f9b558d4306a1511887c5c0118f751ace5fbef539f01413aadfb440d14758692ad1eda75f757fa58fc5d39097525f0eb19d2565e649423b5ded0798fd27139748c072629790968b478470667fe24b8d47444228fac13e50d54c51bda49c0dc396133acc7781425200abaf3fb61caf44bfa5894ea06d3409363c2743980d87bbe73f8e9ec6a2c73de23569274f1e367231aff91092e402968152d35ba1ba714e7a2c12408ddeeceec8d2910087450d425ea14b091c35ed245ede166af81e2b6c7c74b804109c6e564c1ab6a0f0230d142717e661cfb83226d604d79cbebad25d3695f3fa84c711bad70d69ac3df4fe7d7abff24299cb934fc5eacb2e079adf667175f524990eb50378126e4c3b3a7601b75307f632c2c7fe26cb72b42881b6f4951bddf7c82c976543a3ed70c4c9326dcf58779789c1f310ffaf06afacce9f492b7555d6885a697f3d374327018bb9065c1a9b16280adf3593a82750e5f415f9f3d61004780a96a5f28b55789d50b90449d73ad559fa0fd1d86ba80910abb774a794487061585df91e0adf3f370e8b092886aa7d88ef7b76e5ebf73913ae7291642d3a165816590aff3aac19f9b3078bf7f43ae7c25d5bcba98f0da998ac357c0c495edde25c7b2487d3842734e016ce90026cfb90d6c77ada2e51c2c8142ea1234589c054b387003e0d046565f2ac427c1aa75fc291012205d2487835c598df6eb3cb4c406852cc393c47f38d95662cea562fb45f957c382860e184fe7199e9cbec48b5e91b618efad74fe92df0c319d9efe03a9e97ba20989e4ea537511503072e6db1e8b7cbafc28f7272004295799347472fed0ea7647d3904bd2fa943248934a4d5520389a10b0e1eca0eb691f333815642c8e00f55fd4113adebe1ca12ac478ae23a511b3f5cd456bdd7c462994eecbbfbf33a8c0488d162b3f59d56a3b97c52a506eceee6688890702d421258875871f04d1c820a1c6753008fbea4d421a0dfa9ddff8d2363afe163ec536c4bef9b2ecd45cff2250c0036bb1eab847190fe09d0c332fad03bc62236b7b2c84257f544c37f532cd7b9cd6f1b5c4abd7c6fce6262099041bafb0664671a2837c9a918bfad7f14a2f5237d2e7d696a9356ef9674072a50931c1202628f8302560c3d141e7e93e6e708ab10f3fa33874481b8843b4f0c615fcfa4b738cbd51b75a55bc4949a2b3a147f6709399328e51a867d21daf9163c58fe480267b97c81e1f4b064d4256eb2870cb6f5366bf6d2a5ae864c681a9d812ac03fa943bd04945c0e88aec9b1ff4cf425e5c17365db048841026fa17e18addf22a099debdd5bd463172cd9bd3b8f672b25ab7d05aa30eae86322827f2b8b27d55bf6eaca9be58e12f9fd0ab05d45f6fc47fd5922933a3f16b25b8a05e0f0a7644821ac25c5ff8bed461c2420f4130ae85837eeb5d37d068f01f7be4c0f2baa0d5834b4314be260be0dadd8640198c9a6d1da3d1f7723a2756ff28eada35488c2879e2b9b9a60249c07f6260ac40d38fc93b257610b3aa598bff44b4a3e0a93cb6d17af8b4e2b6e7c6a1e3682b525e1e37a191af3fb7ebe5d7915c64d83b4638e00f47c25604194905e4b5fcd79f3d7c5ca01566ce1bb15ea1773b0abf4d236cfcc63fd6d3feca55e21e872e262af6d4e5276b4ea41359c54ed52f6f107b59c60359da60ba1a479afb66cd67231d8271b60b0af9a749d6ced0e896b28f08f856098e1fc8a7bb6983604bd246bfed0d6938ab65af790790c1e508b1269e4da2f9490c9356ba2e9fbfff3b4e7435e04daef74585104aaba42c36af765589db165bec2a9e61c236733bd83ded33e66702ac843b50134f97037d8a6a064a37ddd263667e94d8dcc52bbf003392d82aa26df142caa9eaf129addb45bc1392b3179982a850d0a9da1327800c9b4d285e5bec0fda36ea7c147914fc05ca1cd8e1a592e7bfe56cd74a3c286dc83be3f442831172833cde089bc164cd08e8f2228c55fbc1aaf6eca3f29f28b1f1290f4948bfe7d236979e223e36fdcb2cd4eb7508a77ddcba333d29ffcd352c1753174be53dc4f6cc2ee5b806ca9a4d9f3ab3a6c050450f99b322edcdadfcf7be1a7ef72d3e3de8ebcb15f6491b803a8945aae411cd0282f67244b4408bfd95d0d6101faa78c985f924a819e4a1eb064503aa1e3297af2e8dd69bed43e2ab149ffc94db89bf4b46e4a8ad26984c8b2293d811f62c25a7aea93726bb9de4b231034255f4b8de6b021551c164448c9a7a71506983e8cc5b88b5b1341009b103f600aa30c5ab9038189957733ff6c29bc0a743802721d4c4920334dd1f9ac8169f6fc73d806a67ef13782d307e5d5a0e06142ef5274e881a95926dfd50453bcf909a6b2ee80c28ab2571f21d249a87fb6f19b9c57f444c50aae9a47741af88d9125943c38df904e43d73622131ca7a75841c261a40274ca871a2af05ca30a722042dcaad5f2d2943c0cb74f312b96ff01df629240b4279f653957b9c5ae611537ba34c1a9f343b3e8cd1f6b4637b79579b88940bb75c56573c813673f61251abc3c1d66671255d085a7688fac38e7f0b97284fc9d23c2a357b7da65acacb252bc2ee94edb3f2826ce574b7ff85541b216d855f98596449e2256820cb250bf6b35c91914a1d6d816e0fe0ed1ea6436a8ad66169ce9687f79028d0a8118846085c6ffb5bd120d60cd5aaa13c010d099590651e59f3b11e77bfbaac4b842c7f20755c72d958c63ac9aea73f6c9ddd19cc9d0fc2fe0238b157cf707620277c0e3150f348b8ec5b86378268d39f25044619d4f032935640b82bfa431e30ca2d12767a144862818a92c1382234bb4528dffbdf9861a643e5a4ce9405d00376a699ab2a74df7bae6c6f44c64b6387da659d4f041028e1d7923cb786f94a8c603a2342c948154a38da56bed04fc0834f4fd7a2d869d0034ad5bb646e6f4141b8928c3561199f8f430949e86154997fb68b965276e5604e23a4560432dc340ba7d3057425d10d7364039bf65ad4a3a3c1871701592d627ea4182891f681f709db36dd07398d3a5419990a8dc2e2f3d02c6fdaf31a79e0939f76ba614e4470095ff0b93375a5e2f1108157de56d995f1a0a2ea346e5492b6350f644d087cd906dcf93675d287e1737269f84212fb51f67238774cb3f188508a26d9550f53fdd8a84c6bc91c53fda2d5179b71dc17f20ce4501929edca6082dc7487d850945ece3eb33902212741910ddd4efca96d943a931658e59b1273f10ce92d4442a0e64c54e841007dcf4fca029505a3b7ca51fc425e16fbd5d509d07d69850360f56070e717b3c0197ab4fc27c202c009650e6757bcab32c1a0d5ffcac162b05377a2a04594512ae8552ab1c9e59cae30787b22443b8f6c07e8497430b8bccaee901f0be41a0366da8646f4ecdb2536e393bd60507613bb4d4cb4c2b9454f64c61ac98139d42eb5d637281ad3448b8d210f4b6524d1b9533300f5f8e2161ffa2355c0d41853839ee3f13cd6c091278240f19ebea40f4ff59cf0af444a40ae7922ad7271becddfb8590455d6ecb8b13623b7d22954421b6a96f4784fe5a943174f1ef7b6a5db0669cd2ff45b68c6553e8403d53455f4e9468c1c645c1ada9ffd25de6f8785e0004826d4da8728c9987538964e4992ac3d7df50f095f0635a50b5089a778a356efddd8c1644e91582a259b109cf46ecb4f5ac189ad052edf57d0dab23558b8fe879381cee77ac7b1d57e0c23cd540cadd89c461e61aff870762c3e4de608cbe342fad0556174096b0ca30d48e2f095695b7cc95ccf386a469fe88f6774607e4c53e03131ba8f771d86015d1b9733f21e459d89569b1328605b725fc28a979bc72c7100ab81690f7cfc54fe039a195c66bf11ce736f061e313e718c1721f2d2c604ef55e6c25858d5ab9b67d1f71432f61d0f1d902a52ee7b1c07e46e07a500191aeaaa430de1ab3608a0c91561106aaad7d5df597a063d430dc9f9581a0020990d55fb35ac222ae6d0c84b3e826e110d6e8e0b5ea675d487a9f547f12d1022a5c31c19481944f1e81509be6bcd29d05677c04354c5fdf9056799e89948d8d52e030660eaf0cac281647d599e91ae04d2db15d98d71fdc437b0f650eed3eeec764a1992abad409fbb55949b39b1bfe458304deaf7154b0f13603993d9f4abac4e925fdde6d07e3f98082284582fb9931a1a5b55f36ce92d2a562ae1cb4ee65ce45dc68268479752b02045f2ddc4b380c6a149414f807d6dfb13e41f78ccebbdbbb9554bcd64be663193e630f4232605c230975e7d947731ae4b389b61fcd25ad1042f804aa63994b31c1cf25fb3224c1fabf4297d9ae4b9f5e6418b9d55255646bec6ce11ab5a50b31ce7b418086df1268e481b953fb4bea455202ce2574c991977f42d9aa3564c339308cadfa532886216d385ee017c3795445f10151f1addb4df42b0f3f36076f6164963aea5bafc18304064683346201bc1a6bead9297059915b39b2b85d4cfdb15927409bdf8e023c762526b46e2ba440085a700a90eada594095b7e521af9e7508fab63ed98f6335e4c887feb188bc7a7388a62acf1afa1114aba1d9d69e561872395ced1484fb67cdaf1c1c9bd673304d7fa8373f7412a536d17ae588a937a5efe4e05336c5da92163cae9e7b60528198490363428169b7201a28a5d37c10e66e3580feb5a612fa15396436c164e15dd3c304cadc6e4f11a5eac2ab419bb1ff088d176e74b274088faecab1bcdd24e5c7735863624d711c501013b0cdc2e306bbb529ea0e1ecf95baf320d4c9a5312f0d0cdbdb99a5235e6f9f8399b55e196fe5405d6e63f37cd1ae20dae6f0de8f62200f731f86c990221e27dd0db5c79a863946d765a96293046a83e0118f3c46e0722f15b8575be0a101cb431930657437942ebce52e2be21c664013da5d49a5e0bac222f10c72ae6fa78cd413e3707266ed7aa205f916c77d0b52b5782a4664b5918916be5baad76d6e8f4bdd9e0fa5c5ec0f9a79589b6a881550ce237525f51edfbdae6b6a249362f1a696fc18e0ab9ac8ff0a02dbcf755dfcf8488b4b70d4bcaecbe63ec226027982c23878d0735af1000ed9d8441d408e90b111a39c28b92f4875dfc3811806713d835ba18b14ba8bd567f646fab48f9b756a2eb92f9a1ff315f35bd765d902d2ac07507bdd848ce9b15a31f147511f4e666e68d4ee633219fe602611f2d7f310f2b8664ca622fd61c1a87db9aaddbd8f8a68e55e2dbb110e25d8ec192b594334c87d12ed3eb17df55b0332c2c438b67d440512ef90c0b47ed8c06143a0579f8c503f248629982890ff826b7ce9d3bdee5a1f1c5dcb7a7803bba87d09f275501717086a133d913b7ff948936a2016b6d04c6f16e460dbd6965e509f519a91bf46cbda32b82657acf5a529479a846bcdadfb00562e806daa1d24c0ab99269f2548769c6ea8809debe3366771af87b392d7cb7a6025202da8713c03ff3a6973b43419918fb2c717c91125d0c66d66a5bdd8e030dc46017567490f6bad46ff5a6743bb2ac638a3323e696baba58ee14c9476d4728002f215ee8ed2da6aaed2fe787efde22c49cf60754cefd111b6cc68f884e516b1dfd8343d31f93501c28d4fab9094f0d8a2f3d0178161801891eeb57bb4a44db051fb4cc16021d100928d0c85d2713be6a2be0fd1458d6b25fe72a30ddac7782d87abdeae4e2b33868c026b669a55af0fb8c9a34a97b278954f44167fe14ab33f6d9d7d50b60fbe0ade21ea1978e8421160bdf898f08d4fdec2289b05ac7d1cd31f7ba9a2b283bacb1f54566d97fb018b1707a480f19cc1a0c916ef8a94752ea460261877a3035da3d894c7665d2dbb7311e925ae8cd5bbed198b81c020b13ad0191a3411e0bc10342035a30ea172e78f16955579206e4e4b0189e9903bdadcbff1309059b35b6e6785aad8b1f957d6a6225d58a31ed8bdfd2716a7e9702cfec1acd91f0a594c88d7e9eec057a4c94c8469d1bbd0b8f9f435f00aa0259fe1076719d638bf9301e4d7c9b494915c10a08d1ae5b9773585f6e8426668d6ac09ee935ceb4eb9b1df29e893295f755b45c84480e38c87f6acc8b593657ec3e0f51081bb8537cedf4e16bfce18c7bfd7ae089e3c764584993b9900be61684d22959975fd7003f1161c5a3cde139771239cda9ef83419501d5065146b460259c758b29a2cf27181de23ad2903d0bde14ecafd99a4b03379756a496be0523ad417780309a5349de66d55ad23bd9d2e0fe766be8be27424a97823398bcefdaa1d09ed3008364a8a5fd5544f9698f848a3084f4f4590d00e8360a35cf1d362e56aeaa2d71696fc47c7208e7ed476a11ed0cfb5ae20b7836275845fd00c3fe30a66e6c79992542d1c44643516b3160acefe12aaeb10d214fe730de30dff46aaf1959d6f6fe48dcd3a0be50dfd0ee209dacb1f8515fb79bd38f2a6fe8aadb4a658c94b99ae904f882bedf035b30cf8e2b664465644383f99ba25ed957c7ab3a0386f4563ded78189ebd3d1a371de50df988b13e17db1c2b93c9fa0f50d637f4ed50b9af5fad54186115cddeeaad9c4c23d1153f4ddc910aba8dcdc63500f8a30b0819d7827d48a00388362661f131de545ace8f11c5a04af2942ab7866ce216b0954a1233470709c0e05e37568a10266a644fd3161de09451d831c3e7468b05c78a6551ad3cbf056b25c266d8c4c2e5a06379cfb1cfc2ed3ada60dc17e24f94b3b517a7b3474602c6d93dca86aeafcbdc5dccef235a5b3cf095d44fb3818becc68764c0e79baaed7032f8c86479413da0ccf32a1869d47c94f267decad843de4a2bc1cf17e1e51016c93cac69997e14a26cda8deab7d852b9f3ca4f7199a2411871b6335d697e3e89261360061a7d9ab7b6fe8fd395819432ae2e4c2d577c3c0b8b97326aac0568d1503aeb395a60c7979b0e3888ad01c554bb66e505b5fc563d6377fa9700ce2a39bdef9d7b09fe506da41e170fbbcc8cea4601f3ebd177ffbde73c10ebba1423a91877743ac7ec059b009b2e9f6415dd4d44ba6bc543732fbb378f311bd1b3027e34be323e0c601e31d0907bd9a12b11c5171a11af7852a4f94ac3fd2f3255308128abcdf611f5c3644b1b7281e9b41caa654865410fa376ac3beebfd7ce61de80d56a81da98d8610c53de5cebfb610d7d547b84c9ec37eba1ec413a506a5506d8e4dd35bd5abc03d4c9fceb1e94652a0f810744aae0a29f9cf831b8ebdc59ae8160485fe1778498522edd6d9a18ea54f2630bd076e885b69407527f3f10f0b494b29d25dd7e930329ae2834520f338dfaa47d3f2001887dd3d12a3acb633e2d7558d103bb4370839af49ddda6c12cd977c6aa2e2355b8b1fdf0c124ffba103415549662ac24b32a083d452b762d4ae2416c439eb92a787f7b7521046916077c5933f90ed1c0d33bf98cec56801442fcdbe65b55d2eb2310bcc59aa71721795302ef011a8a7520932566bba572175030b5bc716b370d9a198a8399880c59fcb6b55aef4d773524f36a28d7f11dd3862abf058f245d3b508452712f7d72f1cf2ca5f6c29c386995305bebc8782079fc709f1061e4b4fee4c4a9f713fcddb9db71716dc431db63b76096f354a0d56803802f8ff29905a58110297e167cd88dd8f4b0409487f9bc26510fc48829817e8e1c4890e4186a2bda35664c88e7ba12f3ce0b171b5083484c19c3ab530fa184e17dc802120950310c6bcdef24928d138069ab608a640222d7c8526011a781a1a4e718d831ff269647a1e904766dd98498b3f9d469a984ed9e725a2b92d41e2db1429b3b845d2bbc8a37a8d2032952a1f2cc4067581af6d2bcdc44f905732ccbd264dc11732a402d29d187f494a4dec60929e38dcd84f7faf8d3b64055094987def5a5fc230477eb1ad0572cc0f718985ddc8490b1e3f1bd1538f1f72a003308ac8c1df58d2a67fafc31dcd522d490f4bda9484683e4564c0e626730938427fc25461a285cd530b7f27be6baa08f223f3a5f99e1d7ec8cb8cd56e40b843b209f9e241ff1628a2f908ac3e45e41fa289c3f464c0d5f93075b0feda419ea4d36f5a59353c7a453e554aa811464ddc4b2712b06250a29506d39abb84227ce4b921655297bcffb62841d55876785527d2301bbd63883a9a501e68a2f8a601e42a8d9983d1beb00857c3b5bebe187042efab6d91b5ddb670382fcf469793759edcb40e85f6f56866815aa0d0fcba11fc55f0e363665ff546b3cf6708821c1590048dc6bd8c38089a047567079ef15e4ae1ed89450df0ddd0e6f199caf295f0306cdc2444497b2ce3c8149c39bd2c0593b492928fa2919136400e51cb8c8daac6105b0460e9c49a02b7ea3f539cca2a98ba3f0d482dc2c552ead599cf22e176cd1ce2afadcce43bc7ed4d39b9dfd257798b560a834e6bf41dd061b1319bc33e92d15398584b0615bf59c4361c1be29f892aa2413bef4145c9a62a4603ed33d06de83568bdbd4e60e15286227f1a3df7830e9b57aa0449b2d365e90a3ce8e34bd137bc0fe3385e285a144b8c83ccb312d48dcd074e2941eaea5b6ef5479f448dbb4e6f12a6cb207c8aeef1368028e6ab837ae18af4a1c71539320350ee388f1782d3c6b4beeb9e7910b56b65414ed9a8af1560387fbf494330fa6600bcaa93e2fa8800dc8030da21527a9d3ce85d67d789df4085431881d4e4bda613c7d954c4df91f3053eb4186f4a1bf7c66252a6dddfa8c34639f1a742cdea0c05ecea5d0e598c16dca108c98cade11a1be792578bec2308fea40fbbc01888c81b4110299ca7c00fb050924c2fad926eda6eda4070e1201843675ef7c279cb5b4023996fec61c0909a0f50492dc924bf0e517075337cdf4c39c719276a72776f4fd0a1b3f14a15e3d8d97be1e4d1f246f54ca4634f25220d8f9d4c2f3124a3ed55510444dbad33f32f6a6d79b5bb20e12d44ea1ca03e7c97ea510c67641ba0d0648d3efac8da609e514efcc1a89fead14f21d74bbf47b313e812799eaae41b6d37a7af18c4a99d7ce7db9893234b488e84fefb966fbbf14bdc1a4a2ec58bc5b464f716e2dd7be2b47e247b3b1c7d7295a6efc6adbd2cf87487947e8e7beb9b6dae1e1c989c850df38439fdfb19aa3c736b7c65e6772b3241b524240074ee488568485677bdbf73351e77e221e44dc57bfe265775d85bce223f6457c31c004810d1b2de45c6e24b526a3494942c0585f4b284c43db5f3bb6351297f7ed30d2948fa9798285385074a43d07b5cb32f0dace61a0208abeea856522744069899100eeb5d9be56bdff6f59030f09a8f92ae52917c5903abfd2b6d26f7c58725d0da5f69f3be3e59e067d4b3e37d2f89d6474d810ff32d1c0e7107aafd5502ce9787580d41166b9d9149ea736dd167b32d03872c81d67e95c4f3e521be86e0137f605a2d81f78998037ffd2a61e7e3a386cf25f0737dc67a211f96aea0d6438f6402cc831550958b902bd91ea7e731d71dd04fb83a120314fc0c49a0d590bfe0f45da54bc458cb940e9653d21520ff85688878c2fdab712f3fbb6fa483640d94f9c72c3991412788d0f6bfd3402d7237c2cf7d4643f1b2ed8e0c3a9a182a4a9b6a2c78e8fd5cbd1b8f401dbecbaf5872da8794e5408ec709c4c253412bc639d699b091fbb432e8041b37b1d06d11c57e4ab1ee9c780ae3ecb9449968b339fa08125e81b4f52149881db64a406010d8d29287c08f06f29e091c093d7c274822610e11a9e5b1613c0e674d6fc09074e5c9d2d0c80f1bd883cce105d8342a855eecb9d71717cd0e05e5e222b3f82c129096305de0608e46cbc6d67748cbd0cf4654fc817860700e18cb5269b1fe6559a5e6322b232585a88b222f5d61ada73e1cb3429840ff7499f615df7e95da382e1e0e4ec554df4284042b79407f480911b18b6084afcc3c8740909b73a12ecca6fe242e27a2497010c485a64f35aaf7874e26ea032da937add48655b46fae39392223f63c868377711c4ed4dcddf98cd9fb593cb9bccc72973067859a240d33a7e025ba400349038ab936066b1c58f256747a98fa42b5a2972f0ef65663055f25d48789514d0ec6cb2d1847189e836adeb2490a2fb3a3dc19ab6760095f5d425ac34a567dfaeff340123828a0152c143d7a05974478a51d8ffbbdf8d3958a6ef28370ad6bc7f3a04809a78443e9261cdb620d378c248efd98c8a8da98d8d047180679773f786a072a9813308d8b00413a56b7052578389c25c0d4a362ad4034bda4ca423f770116a230a14cd47215ec66ac383098f9e13f4d848399db9c84258533a8b7ab326cd0a41a0ead1404ddc8d7f9964d5695ce5e99f907f0ce2aa28e717f5158d0047f3b86ebcdd02ebbe5879dd8cd27e60691ad8302e913ce7cce2af28dd464cef730947a6833235981e9aa12caec70303c4e52f8c027e934fb92a8a3a55fa0488979ed9947eefb6c39ddf681d64fcc333de4fb6d247bd0c3f9fc6a9c6a4e20d988b417aa4a61cdbd62f79358fb8adfc5633f70cc5d0b05cdb756a2ca866d185d22518579501555a0e47d58660c412d98d249d46e7d270ec7ffa230e93485f88f92c189afd1a8c331a9b1ed08d30de8d7ada17c1742b9db6b488221110f9941367eb8f47105301edf43d830bf1ce932ac4a06c58b8d305850ed48f2419c74f47ba98bb2ce1ec66d5220b8273d4ff2d15dddf3fc36b809e017092b3dbf1700d95d7bb29580272bce9a1642049bc3043db088e7994a90ee6c1064562a2e957349182a96fa0006841063abfccdcaf7ac48955a31828204a193c768bc20884dbdb8334528d8dc3f5fa45206eda2250c5b446600c152c033fab6a617e387c87846ae6e39f91047c9150c86058453a4417f0e6d67aa5442f48d90c93166e94ca0cec8b324fe441c4f7410d8a8dc2848b8c63d75e97ac258a0aefa8a70468f34ae2925e0b8c30575e7ecc0c78707016d712d665fd0bc63ced1b1a7c2a8f97516dea822fb76dc448a5edf2b55ea92f5f3041706f70771a9190c69f2f66c306c1b019bb0d4fd4a78e6a9d73657bb113fc633e28fd77fea7c24c388d046efcc242f98a9a21de0dbaa88d868e2d18ce114c53ba073358495701125780f8b58d312692e601a1d97ffd6c9b9fe4d4bc19fb8b60604054538c3e6adc2d64cce23a5ab10d82f2d594d3ab0e09841b0b112efb19c2a6e3914876a7df40cb65c6e0846d2869ce542e1f25f9d06ffd882efa13e5f482d640c43c5a41e2a12945b3dcd1bac9cf64193d48aec2b63808bdafadcf67c077a9fa4bb543c4b425dc892ed699d73d067b1698b377018e293dde6b0cde9c7057a1ffb0bf4462d42f8ad9f8947739c6fdea9cc79961e1ad08047ae77cb484b07af5207ee121999236d151568cf7212d99876c313072529f7a479e4d73df7a4691d6421b09844dd1a9bf38bcb69ec2b5f8da3fadb44e7d9149de830a5056ae5f2dc1f4b719cb7b9d55fdd3043fdc61722bb8fc790a8527ba7270fc62b61888d215f186b4358a9fe0e34ce7b1608c371adde4412745000c38c844b02514a6bdeecde9c742c356f5e02c5184285f701ad782bd10586b66a07c01341b1b9186e03d5a9b0e4dc32aaea0577412e0e14846bea82a75d5a90cb4efbeb9e7d7a1e55939461df5d983e4e74a02f95b837e395053c2b08b488b82c28abbddf8cc9e98f9aebd4a70416b2734ae739a177315b1073cb46bce298c4fa8e6a82bc7d63a950a7c20074e886b24560eaffbc837d609a43155856200240e213e0c6578fb415ea778228be065bd72eca2582b174e73eb90560a62f6a2f2f38d201b3bba728a171bff676d10480f3a9f31e6dea54353ea41bb24d90e96e929e65aa93dba7e649a2141d9fcfeff3f31be30154f0271ae6b49fd5abdd97199d9d92c0994516412f15a0f6cebbf5e4783e7d739d6c2d279d83d3ae04b9752abd68eb2c6c4e0bba037be2571c57e1e01906fc13619448a0cd3577f7ce3d2a05f7530152553f9ba363e4f2c617168723738ed1e144c09736857e0ecefb1032e17981d30b81f53f3c23e16f98a39eed1f8a62ec943ade2654b91397281dae75f00079b572b29d9cd676b8358c380b384ea2422271cc2936c4eed234594eb43201bb5621938b7dc591ce2b20235f1e8543c1490ace10e414ab60157c6432d88d90be951da002e02a91dd0fe4d064255a8abd2addf55a4f71b641e3120fc4f7a831fc9b0c8a27dcd9fdd12a05c5728cd381ccddebef0296b1cf37fa83ce51af2990f20bb284845141114b7bbaac2fe8e2ea4149d49e071f4da8788ac8ccefb49f260487c81155b45799f3dd00726f74281e95969bb44f6d099fabb875e1a3e92a296efa093f2d44326464ba4652add2662727e0988afd50836e592837f57bd88f2530a20bbc29fc3d08f6c561775498a603e7ba562a06b2e7c7f257d6b21a34eec1df01d465641ce9257145833a419abdbe6b0daac71ba91b40f7f9060e06614819b1d02d3f6f2ff5c02bd0542256ca93a604142a590e812c8919278139692d638323185eafed048c51eb5e1f605e6355d281b45e9cee158081425b81389234dd5889e70a34af4b389d90019fd33ac58c1e1343934302c2ac779223c4a69eb133695f236aa8521097c46d8b43d1412b422a08498606f2bbc6ea4540d841ecba008b7b1aa5e85257d526c12a852883d2bae2d433eb97d116269cfeca700c621ca944953029f55c43547882c2bfed8750478ca257022a9f1e1315ced868237d10901a42c1dcf32b4033e58577e93f3cb2ce51d0e3274669c44f3b8c62a7cfaa00e7acf044573521b2bfdd680deacee54cca27657c5322c717180c4cf19d8e20be524918cb5149a69d6dc37c5a4d6a0039214dca5bddbded62b3e63aaa4bde6fd41626c2566fe11fe633a5694012d6b353f175c9eb19ca1ad25d02aeb9586dae999dd0dedbe4623904f94f5a4c0741e192bc4c294bb651ee3d7310d99323537924296ea8e18f8d9616b94e009a07e6e4ebe59281ed31f6f08164b9ab9ddcb9570e3423d81e3a6e4faea3520d3f461cf4767890701b72ef60b237dbe061ccce5b35555088fbcf534febf62b357809990d5db3250a471962287b122ed40c6a0d9e71ea82c98a91cd7bf0d3c4d118a8250c4d1c5987c4581a6febe334fb895be2703491befa598047a64ed0aa95d201327f8e124399f5ce00ba7739a7b90d7d9aff7c58e5036032060c970a700d851dc23706dc530f2c140dd8bbb56072a4453aed64ba043db8ac739cb987e064535c761801d30d58c77810def7bcedd4904a2252c94ec37a020f5ffe87aaf872d8f6bd0e2470af0b4594823e6a7643e291024c3978b8ad40f8963670091493a660937294efa581ca8c8c5684339a09357a69f9bc0baa4649c974234d77222c8e3b76fc2ab08b6b5c4267ab6697d120ff8a635830324149bf55fc705fc09f8e4905e1c5071af1f6a56478bf4f15001e39a1b9c128ac8f38719750e0ef800b2d8dcdcb391ea9973a0f2be11408a1e2c63b84d178b23e249289cdabc22171cf505f9d130401a12d1f87977027da0ab7316ded4b0512fae9d927e9621c5c5b61c9928a42286506869b360665fdb5d8efc1c1974d861e59600e45cadff72ccdc3a97e2ffcb918ac0f3a7d0fc0a822959b047d253e044b464ebb6ca1d0812466a784111608ab4d6ed7b6b2f62a5a948d276318a8e71323f18bf4b20481ac87081105e5b4c7ec85cb0740fbec8161feea796c045c2df71f8744501588fbd535195b5745ae74ca43058c35db926bf634f37a51a655db4b7bbe9de709eaf5b9c800e6c2a5292eec9d91562718905d7021b8fee40c2c7261cf3ab0032f811c6473d603ac2b46e26c19ee9e6a2947f674d9e409e5fe482fbf9e06a8b2cfea35fa3ea11a6ca73a1b63ec8cfafc0f27f1171dcb0df4f8b2aab849e3ac57f08cfb1b25a4ae2a9e822bf6742771c2878c8ff70abde039a7c47d69c49b2ea781efbc70eea9d7bf8eb4fd5addf64e901f3d0d43bdee6fd5182214109961f297f4e7300cd0cf52b92174227b917d23a7138cb595254849a700fab5d105b7659f40cd262441f98ea0f6dd8fd78b53f32ae6fbf04f988a568190f22597a6ffabf185e125b0a319e249a5e5c683a34acb214e1751c57af9692a1c2aa6f16227ef263ab41c9fcdb461e7ec25402bdb81d462b1ca3d4f8e2071a66a481908da9df287bb73d55e6734504a6cdd67cd22b96a4a13088a7af58abdfd4c900d1f12e11519a5a2f8b7b36e46a0c5fd34d954fa7ac0d1328d6a3bca429da0c86cfe7e1b808d3c08bdf50e964cb14bad649e8834916d583e4ede40d1203d6b8bede74e934ac8c3fa8ca1d44573e2efb031a0698bedea92f3ded65c7e5917985540e95e503e27b2b4f508f4668ea2b8e2ebb411c8845e9d34598495854f992753cde7636ea726d4c86630eb55aeeb64b834ce1bf6649f56b593bdf92337ca9c33d51533e333e18046a5e6d8935d3740d5040a17536d5c4d6c906d66fe98ccd872edb95cc836c1b79288d51ccaac765be4f6459537485f7c3862f6c40bb9aeeee91724e23357bcbbd4faba9402f4ab4b4643172c8c3c1aa6190757e8078d3235168eaf6be22f5d0c56381909b1f5b52b1c77f52423d32742dc1ee0221c1941b4840f91224bdd5a309454c274783d3887f86f6b551bb1d118742d8f015e9cc604d5499e04dd1117123e2bcdc17f7c13c493355c517a5237f7c2f7c094008da4b01c2722594451d901bfa24a3245a6a6ca254257be50dc176493dd90ca686fec55b599a4f8cdadd0411bb23628d0fabb30ccb766eb78020b42bfd53044551b9c6869654dc48ac4e8009bd931b697888fc1cd93750f63dec02f454f84d1158a958433de339a90d23d5b84f3fd845c2671d3015fc910800aae14fb8ee77ff854fd9d7b612a194ec1f837eb3e88dc524c20a483cebf9d5bce81cde1c7157f9dfc429a32c63a61ad94851a28cceebb0be32062fe9f340c9636d54f328de21bbf354ce014b9f6019ae16e361c2b36bfc2008d8e21da688bf12c56d4b8a7b0cd6b3250c35a53c8b96d05093ddf9df547466cb4a1ff6fc383f4fcc5fa081af5a79fd68749c2d56ab3900ab53c7386867815ed5ce1dc3a0555730efc0110910a21ab2ce7f5d0c5213244f0a7a2d09335e842b2650f23108d1d582e004aeec5f3fdcfe5816693de0b43746e0338215599c82c510a97d7b6d4801b76d55f7dba28f936297a3a8679707ac0c2b66cfe1cd0b3df50e4f8c6398097b78833f061557849ae3b6a723c4088eb57eee80069782d66cc158fd9b87a7328b8762adaf633aaf73f53328e6d6ce5451c37a7e4f67a215f60a6d41e973e895de8afbe1f86212dc104cebf1150912cbc05cb65b2e89e407bdd4596932f04d724bf2f326b00ba31b01cfcdb6d2ec2f060a30125dd250c7114641235ce85344d37441f421106ce88b4c1e181f2c8c9193ee968b369c40ea369baf0b48541c3852992327879cf6414b9ae9865d1ccecffb7cbacc360f693d2ce8e0827619889f73f6dc2ab629cf98d5224ad5e1f11f4cc10874a6b85c1586308a4fef486ca092c569027bc4693d76c616655f6e69c85892633df24ceb124dce334a2701859bf771091b7a9c60af8c4bf3060e120b7824e8791a3ab75063b360d307976eab29a22b027f905b2fce02069070de1ca8acb816f352c62e7ff2068e57a4106a6a5f416e6fcb6d63a8e78e0d89790f30879fc96a0b711e98b4c24210174522a076f6f4d34c0f5e87569ec9823da547063ef0bfc023690ef2de0359c5c10f72f68944baf21614c8244b6d327adc2c5dde567094a0e864d7e7f16367fa6d4450e080de2fe724010097ae5b91bba4f03b17b059d8f0b1cb8c08a36b00c11a2607c67af2c8b623c44b0738c98cfb1f49a41293c968b79a88ad3f6979adb7faeb584cbdd64ce0e2a86299c37995fd1004a477e22e112fca54a2497f5f8b53ab671a312cd250de6a9b7390463b2fc740bcc326ac29b837c8623a70a29e340dccc0a39c1c2c25af5d25d3d0537ddb4212fb55dac0c14ab0404260d60ca53e7db7bb4761ecf898078d86df602d6c816b8c8a930f0baba9b3220ad5ce418569518f45e9bae8e94c0deae6c9bdd31219649e25accc3b91ffee7c455f88af4ba88066539f968702906f74e670ef1273b74770cb47af75af202c0b1859541585036493bdd79db7ad1d0416481604b7814b3198cee24f900bb59c1e48645f117d2f2248971821950a0c75ff38cee086621c31c2d499d571ab2e947031d82e2564fac92dec4462d3dbd303aa03ae2ff1bdd91798f5d48cf68620d3c6ce7412d54a928a7daac937d70ad43063c78dd9d9f5ef1a9e60312b5f561481b021102ef371d4832082792fbc6afc37de3c954881672ff39c578d63c86cd3a4e5a841b003e65a9416f723fa8a499e56ce44df44095bd0aa738ee99675c56b98770430d16a30e9bc5f80a7581014a43f9371418d78a8f5a4c994f4ecef1a3ac7b6e7109b57eff9938895f9b203aeba58f9a4c0612c349510dd91f1854d4d8205f7c60864207ba4f9dc082f626fd18187a0935f1bcc422ddbb05ab2fa2aca7cf3645a91861010925209e6330258b33a054e3cd591871c413111dcfdee71d43faffa1e6b33b5e90de2e1e3f5d4c20b175739eea7787c667ed2800bdc8bb4633fcc4aad77b4cf031c1f2b9b790da2d2791816b2781be77ee73e2119044914e6fa934b3e9b635b5f80f28eef14f138763c76c6f7c013b7593cfa967d5ea5f1811b6c9fbadfcb5a654ec8996e0ed9a470354e2341a134a61854010f9e30412e59b5a2339e154c7f4935141a705faa58ce7a9be08633df21754b00cb7e297b919f6aa4fa704b050278c457440b187a14ce7ef5fdc83fdf0e97de1838871c18580dc0b5747214b354878a23b9729416404798453fa721817e19bf20689020a44e139cad0947866847a6369bea7b9aa5c54ddf10e668d311ab4ca94a0de82a6a6209e18c8a2e010f09be64f9276740d66e45916219e3cf5df6bcbb0e73d75aef789478cbe93cd0337656258bf3e3ec34138bce746840f77db75aa5a86701dda9c6f98b0fdee31044522a26172cb42e5f685f759f60ab90810b82c9ea7716f7ed3d8078cbf2f5878db9e16a5cd69ac240ebc99b17dc37b7b1e3bf25065fb8d735d3f4c665283189fb0a7bd373da0f1c9d70e444cf311c2ae5e032c6d63e9266710e33ad7d1724bf7fbd7df4950a0196d9b6558a1bd24aa28a4dcc41b4049ed4bb0259bd4444372d26163be1fc56f029ddd24ced93a441404fa523fa9592052ba92160366452bf55cb0e97813116ee22bc6c94bffca56f16e5559efa5cfabf4b3efa637db33f8ba01079c049b59dc1cccd1018818e49a4e6dd915850f970da4c33e81b4a15b2df6fe64fbdb6eb2112292882412d9dd3b670ae809490af897e8713b8da7daf36c8479d4475bfc6c6824b9e96d364b6f6cec8fa8e538f9c4cb1177d9e24711b2ce84ec3599bbcc379f79759a8cbab18a6ca5525765d6d6c5548c5d0a8c38c2977d747bdfe2b6594ab9544ab3b667c78f60c411ec33ac7f48c1487447ef199c37194e1eac3f248aca4698107fe4e9eeb52be276d45f77ee1c77da01e12896a5a48a0759c4ec6ff8bac11395ddb3e12b4b1afb064e36e8f24492cd6decb346d9f4892d1b68c3d7134eb6135f9cb8b25f4e98d9777ba74f4ebbaab2fb8cee3bb5b038971514f3678cd709d976e47e313831ecf489eb806097fb2a67c7b2fc0d4b27e7068ecb2ec8e6e91b8336a63f11eef5eebdf7685bddfb39e3bd79ef8ffac8dc47de371cefdb731c47e7a04f38f42782d30dfdb5b0c8d1dfb9e8684cdf680cc3f4f661ff8a44ecea230f495e782bf7617a4a25579cf14bda7bd234f6278f248fe665d858fe26d1dc5ea4f1979a99fb8b459fdc933e8db9ffb86799dedec3937152da2ef273b303b61afb7cf68fd34e2d2c7656b30c63f912b0b303ecec5fcf4f369fb11b14364dc7cc6bfde55c3e33623b944dbe8ddf0b3b1488e6bba279ec62e208d8a38edf76546702c6ba97f527c2750e8d43dfd0d1f1725e67fedb3486bdeb4c983fbafa8b5c57c4ed1967fc6603bb0df69ac389c2de615a47db28ac1c7372a4f203635352311b3b273471325ee5ec3739751bd926d7e4295d9e125445a0b9a67aec4cc00f9a2a115a97da0b82d8b2b67387fb67dba8bf9eadd2471a1d1347c062d498f6fbf8abdd93d9a3fee2d63e2b5b7463285cd53d6df547b74ab3b663cfa6882042abf5af56184fd9b5de63457eb6f7afc8cfb6d9872453b933c1fb91d5cfba226e7b8f53aed8b5c65af557e467dfa3b4f5f40783d2beef3e268e009f368d547e603be5ee4cd33151044cd71bf15464077ca48840546c65832b58b4506a832d5e36a5d4670a9b7dc1b264d30d5f58b234c92beeccf1e1d8572ce6248fc9552136bd22aee0c29dcfe26fb5213c3dcd93ea8db6270cd3aeaaddde95dde8be62a737c2c7be356def747cdab48bdabbe0e4c96ed49dbed66f3752bdfe56b1f9bda6a3938bc9a8e6d8b186b50bb3da9569976b3ba5bf37ca4edf4549bdbba7e3cbb5845d751b1dab68573d8d76a9b4cbd3aeeed57dbbd52e4c9e69647f9f695776ef291da368173d4abbbc8da9d3435c4c46d6b569abf13432afe392a66393a7a626ab1ea72af831ca939d56af9c328d5f98b670884a95529496062569ed93956d49a7c95397e0482153e6b96ba61b27d350c250528e67f20cce53ce99e4eb3061691d6b73305e59b90b1cdd5c07647b2aa5e50fc9cef947f34f3ee12e246988434caaabaecc3552bf6084e33a371ac0710e757e63001a87eb5aec6abadb78771b2ca2ee35ef5ef32fae56f9a3a9afb7389989ea178c7070985e3062dd429d84a35d3867e9e86af3d19112d658438dcd22b2f9fdbe918b7008dee423f1dec6ef6de82331758445745ff3fb1a1dc3dc47341a69eeedaded39bd5cd06244bb988c70ae733879a68e76c5a5c9630500ffa0d3ce3ff814807f71291e27eb3c66239ceb68d78ff39cec521acab9ec5829e81ce72ae8e8b310a3b0f4e150cebcd0c4c949b1ca0f1e9a62d3e49142beba95b6d4b263e1c7d170f2a8f4a73404bba2baa3feba6f3a5e484eee29948e61eeafb58f3211b6b90b200720c79d1c0130ffac91ec4f7e4751234da4f9b4271c7af2443eb13e1fcfcc1e399f974b4c668f1b9f389fef201cba91bb915d37be246bcfc9ae9c2fc9ff75b24be74bf271e064263897fa9b5bea642638ff8dcc04e73890e696cfc94c703413d5474ab052c7806daa8fb2c3262baccf39ad1cd150c290ce6f1ceaed39c7718d898e4ecaf1df18300e34bdf6927c9d7f48d34ac42b2c4f76d3ab298d3d2fafc82cfbb34712ebf0c6710e7b363c843ad739eb1fbea17b2e3479e66f5ce75f0f0f38394f9221e738f452ce718ef31b1ac3974eee52804339dd378f94b0b3e74c43094339a85e92e3377e37fd82dc71498ee7fcb3975696e4388e469a3bea18b09de91f726810e0b83cd49fc51f8eac63c0f6a7b46b8e9e37b40c337bd8c9ca70f254a27aaa8f7e609dfe36edd805f9010470f2c81ffd00829cd7d8a4731d5db35cda9766d8b459190470f244100cc9d17669e7681c9b36ec800cc1c9387a3579e269964b1ba56443e2f0e0c243f8dd451bbea0d9e3f242b3c787e44f7000f431f7c7452c53e2d676b025eca20df8eb69e2cb96efc15265cbffc811e02893502eb62a9c86c4d7acb4561a033c5fb489268268c2c9fe7a74e043056b1bbe9ab081be86acc044174c7871824b0d5b986842079f2498486209134664b4d229993001134b30c4daa52030c316b2d5aa47c0998a022c51b0ecfa0bc5880029f0079b5cc059411fd06aab5d85e66b6a8a80720840037fb00908242279481e95053060b2b4eb19007dc0d7ae2b2e76b562d72876fd8d14c334843be69fb01b4ac0f1d662bc5ab564c5b4769bf363070cc3ec4ffbfd5704864121d3df1e959eec2230cc8eda6e1a763f89e50c8b9bd48e28c58d6134c058c54261d579129a0d342b888082224206decc420413229c6c4a978288b035f0411da2467a1d2db02752508b704277aaf090c3dca9520315d82077aad4008711ec54a194d660864de94e15aa9d765785b54267f52a42e8b47067605a6c6070972b32d8362aa84154512285812b55007184173be0620713381304133960228b921eaac4c0561142aba20a94ad4a0eda18585fb9e17a012b034ea8a2c4a31408dc18d888297402a57576f1c0d894ae4ee9c459363da53488884ae910486c4a8768da94061161972063892eda933842dd3e5d28b0b3e333034a777c8cc8b20db0e16b0927fba268963f78d7ae179ad216d563fa8b5b22c92d3fa52d239729289f2370dc1185b8e313c95525b4eced4a58d905d8f09584182131ee69f3bb62fde636728eb8a3ce3df5cb659aa7328e476db151c7d992c495bd85952e7b764434c7ddf1b1ae08758e7b2a7ff4de551aca16772fe59d267faac33780758ce3b277d83d206ed6c7ddd33fa460eea9430eeb50a039ea5cfe5c9b3bd6a1903a667547e98f55a4ba873ad61fabd3442a7c4f43d982dbb5f139d531efb53b216ed651f9439d46ff9082511ae9f49e3e62bdd34738475d48aa3292dca8e3fc711a496e564a3f677642e251971d118ea6b2b5d2af47e9ef86ca960d8c02d6f7b043c1c6267f32ec8b4f947542bed4512e6c6ec60e85cf467f49fbfe6679f1539ad35ffd47650b85aad19fd2bebae6f553764472d7fce61afdc57d31d6dff30f291869e26b192902c14874df7b9f23304b48dc18a5bb47cd228a477ddbdc9748b2756cf852c2cbbe9243e523ae23da3686dcb78bb3d743fcf60ba3140c5f4950b994f33e1894b6779a1f21c94df30f49a29ea21d90237263bb5347e50fc9d6392a759d0c254f774f958fd0d0e818e2c617929edcf8b1131289f037fd71c75eec8a20d65f4465d553797644a8abf4678f83c8ed1d13a13495adee42f2887bbc9e78dbfcd90f896b437a24438a443638b2ebc167082d8286d8893e49f80031848f148c377c59e1617fd6c7072b4da658492203cc9df901892f4150e10303acdaf085041256304c48563aa58f95132cb604d8f0754419bb6ef83a22ccfede83217c1082089f247c5e7044184778e16345067144174778c9b26c5a894d3a9a75cfb2dac8e8ea14f0e9599956019fb254407d1ef5790b5f5d9c366469df5459deb29653c0561ba19ed22ed45dd9e331861b8544b77cd355da646a87ed99b5b388c8ce8ed92d83b295692212881a585ebee7320ae3eea87b94574473d53dee6a221aadd2a977345e4ea5bc73f744b677cc5a8c8f53879bc8c7a2d1442a0d652b4564639497baa9a352fa88751a7d84a3f2581cc62814eadc2f87cf79a8e373a8638f439de3388ee37e6a4061fc8b51a81ba9dfe0501c8ae3baa3bc5c94c22bd9eac1919d152a7ce06226cbb2df8fc8ae199cb1e39ee51a372b05efdd59f074a75920b2eb390de76a489195dc0117263f4a5e672c9729dbfe7279f2daa2691deade2f2ad3dccbdc95d7152a2f28535c99c2088ee6dcb1ae081fc552a13c8f46b3543a9c87facd5feaf00de8aeba90441d760f88287c8fc8461deb50f0ce1da6fee18dd22c152b751658d7390b387e83a5d2ac944e81759d1bb15437c2a18d6cee37b4918d0f3791cd1df5a58ea1bae3fce1d3e81f5230d6dd51faa8bb2a958bac36ea5cfeb02eb2da9da7bf222b8ed334cdfbf5340d750f6b9aa7691a7714d6bc739ea6e51a0d3dcdf3bc6f9aa7fd28413d6ed4397d746fb9cbe50b172bfbe8dea2eeadd743bc7de1b0ad97bfd526b2b9d3a868f48759787b1ee779455638c71037eaa8c75bfddda3b21759600185ba779d7ce3ac8ce35cfe5646ace3d0421395e5e6b244b152b8719d1bddd070eae8ee462c7d395d64b5afb687f80b225264b56358494f8b299abca6b061db0d5f5388006ff89282cc042e94372e31e5b7fff8c0efbceddaefb474f468a9aa69536a52d69e546edd8bca19b6bbba718e70c7dc9ea37540badfaedbb6d32d27dddaf45059ee2ed38c43e5e8c572282f53d9c2027f32abe4258fd67197b272d73295dc29a7e70f29da6f9472b3a754db186737d8dbe196ad17787bdcae0e15b89e62cbc10fef6dabdfb60ec8c64d1226094c3e2449c0563a9247bdc738560af3a8ab20efcda3b412794f2b6d7bede658656f14bbd0cc2cdd24fd72e18efcbfabbf9d7d8fdda3f9b7e2b4cf0eb0f6968e9e1feeaad707491edbab2ac5d1642f73dae6ef7ede723a7a528af1259bdd61be10c20e42a5265bd31e08dadf09bbd347dc8fb220967e9cfe8236f7eccbc08e447634826447d74ff679c2f79b86f01a841aea8fe3f0d6d91f52dd5387a45d401c08c105c01e3d43a09c3e5df0079b668692e7dbd9518a57145b6cd8491f2b4ea8913e64e06ec397145fa470dadfa5944fe8cc36953c62165b7bb65a33fa8870473ca45ad435c36c96ef6dfe8aac36fddd74576d6e2a49b09287cf13fee09ce77216b7cf15f883673224ae1823f7511886481123485c71e92b12b4b3d74fcc6e1d102c6a31bb5624087a4d6c0ca2d8b21f8faeec7996904965cf4701656797b7f9966d5e938fb2d75c95bf2c88d24edd9a61f4526e764084a476e1859cd024ba37375f6516857bf5d801615de7c66fc7d1bcdd38ec80dcc834e87c491cba192b7ff77abfbfab4c7f93e96fec724e8fbad39cdf6ce334e37bad2b9aa7b75d515644732db372be3adc38fa53da38a71adcd115cd7ff7343bd5ac1c1d4469a7ce12b23acd57a7b1ef72cdb5acfacddb7172761d9ab7d4bdfaf36ef3a1be5d69dbe8cf4e1e1a1894f67655feb663f5a97c84d2757ebb9025d7b8b7b3dcedced923619b7b81ebee397b35843aec8581dadfac7541b2cfdface5799a370eeea8d7f251f6a9a96cc9d7d3cfc39d7a23b7268e561eb7594c4905e61120f3d8110b6c43aafe62cc5f6c22672bf1b0e331e8058ddbfa04618b962419ba132005f2d5c313552a5b42137645557f2e561078fa2378aa8fb8f6b785a4ec8e2049328308963684ad1d3f8da041b246721dd48ec48ee362dceeddecdfd936efd97624ea7851478fdd51fbf0007ff069af668f303e42c0f0d662bc5afdad1696f6516f7bb3dbb75f9f27fcc529565056f2c4d5d55bb6d73412ddd8b38c490a63cbad8179a25327b717dc0885290a81511bc0f138e0186fc0d1a70418beb658796da9b285871dcfc933d9d2c296a5fdad342c74f0b477f69c3c6496da870ca6b16aeba305fe562b9d4f2a49d0b4dad94a27bb90cc32ec93ad745cc8322089c411e2ce6e44f2883b3b12922c2e51b9f00318be745065c3570eae6c046cf8cac10836aea134531f329862d1fa6c813fbceb577021fa80e586af1c30914f9e7cc4c0579e9ec68c799aa187bb72ab95db58cd863a1be3bed6c6303ac687cbcfcfd6341d539bb82d1d3966736adb7728d5eccc324c764815367d87521a67a492d208ab27246b0a2e9438d802c5192d62f64541c943fed0272a06d231f4893e4d2ea8f4e9a2cee9d34545a25aac5634537bf953bdd29152876cc9960db363d6034bccc8873b20f01489e2cf66914aa15c150f03b3e2122b26912d192346aba83d70ad5947b624ecaac0c25ec3ea87342fdc34eb4f8698b3f81dd9337f716f1927a5b55ab4519a89d5e70bfe7aa8de628cf160e021df4dd8a98ff712b46bf4f9d2b3c2a2bdab95a6bfbfd5d25f4f0ff65827555a01ee90ff59c23a3e5f62f5c1e92f4c00ae59562b77bd4dcb3e6b0704f58bc2284c2ba6b57a1d77374dbe46292f51713e719ce39c9e7e71dbbb715d7743a18f223b37f987141c7ff39d5d23ce611771223d464f753ddc517f936bb046e5ef1b754353b3e9716ef3d5a9fe50e71e73d60159fdae705638d4014a1b4723cd7d73db65b85737366c32ac895d10d4bd8e76403c8f5aaf3bd67595ee9b21ddb10b82bdfe2bb2136147239553ae22b6e5e86ef77231bef3b0c71c638c18e6b43bef7e76dfed990776f651466de630ad06a6a75d9c47d03a049abd46214955cb198282beb036c829ba00c397962de62be6450f99f3f6d7eea00c20823e3ce823ee2d1b3b4b483c5623f3871d6159c8ea5cd95aa85cda01f1e2cdb4ea98d601f1bee56f66348770c75693bd7fd9bdd4b78c9fe579d869c7f9f3be9d267fdeeb5540bc228dcbf2b59cd4367645d83ffb69b337848638b4e51bb91aedde85644d26f228f6f91dfb6f3ef5ae0b92bddaae68162915d95feff7c2283b1332fbed9dfdacd15ea35942ae77e7356d6a150d71689ee636179a4232eb8ab07f93fec004c203d8dc8cd29fd2468a5b7b7d2a1f798f1be7a3ee9a4db693d2d7ae08d3813ee2ccf61cf41161207261c7a8b11c678dcdadfe28dd73c38e082fc99d75416096a5a5fcc211f8b4b4b49154fb7e2271fbdec8ce7ea4842de10eed48d8de5ed88e8415b9b0f3911c474ad811eed00ebb0628ed4c43a8a31ea9ba138436843a3efbfa4bc3c52e88bdfdbca6f387833be86f07e18ecfdbb2254354a2915d167a7b9a53bf1c77f3ed9bfe90a88e9d09f71bb560c4305c0724da5f0defefb5da3bb5dfec66bf517c19b685d6467ba1696dbc08461c617bec8e5f844fa33fb9bb0b499b6d74fc76ed3f1badddf451777c1b23de365372519bc5db2f9ad95ff62d1fd9cbb023a539bb47ef89d9ba9acc7bf6fb8ffb76fdc5303b3bfed66924b93b8d243f2ed2536b6df7a85901d109fcc5a6262fa08f786b27c6371bfb77b323122d76bef015bbfebbd91f3c5302d4513fb305a08e0a9d56f01235303f4758f9159808c1f8b0060f2598810c7ec0021614c1c5c91548fcc08b2e9aecec8b0b384d8c199a80d8624509bca051c30fd4d882ca0e8c78a2cc17253bfbb26403e30339802ec8444106142808c21939f4408c332a50e3883174c0e2e60b0ea60d255b5c21054c13a62a2c40a60b33388c79a2c2e4c9268c277e86505a81134d40b0a18c13229a28cde01406184ed228a3039430a0c01a183f557e88d8d99901a53b456c4198008c2084b0860e3a685f888082167029c3ca184560a1811d2184102248881dba43a57ee1e454c6174f3f4c9913154e5ba215779e8b2f18576ee6eef74a3aad8d3c3d31acde84a961c520dc1996e98fea3fa2238d7544f1f5db96e31a1bfb16e7943048b6640f367f61fee88630d3c7fa8a75ddbd87a751739ce71d7e72f947ca3d8ffbe1017f3db0076c4291802281c9873009f81063d41adeb9cf1c77e745259cc61a4f1e78a9490dcb853b5766dfaed18c7dcb4653d346f499057a4cbbe21065a580691538dab152c01e6f84e97a267108abf59c4eb2a48421ec4ce250fdbd8cb04aea0d993cf637bb3079ace5b158cfe4b1937ed24b3c79ec65b48fda7e6a973dfd6093b4ffc1031e9a111f0ecd7f3d127b3d7c4a32bf5d88bacc2e2623ee5e69e47d6a57bc77eedd7ff020a3c693273bfda6e73f2c6f6ec3e637b7b9cce88de2297dbca68d562b3d44bb988c6c3c6a57cfe4c96ee337da46761b996ddebbcc6917938bfb764fbb6293c99345cd6997912bb5ebea26f251dec564142f5d4c46dca376b93079b273ef8e7b52874334d0490587620687b60c8750d969b24abbe2d04de2be1de72426234ec78dfb0f1e30f67a75ac3279b21f2dc03ac9c58425d54338d46538c4393971aab22f94507a3fb0866087001cc2ae421caa43536640c0df2d43d7c6a01356316e66fb592ecc6c389160977669dfb46b7be1bb623fa2e0aa8fc0212881be7f48f6cc47368de62311d3476636b3fd91eaa614ab139bc78eb2ecf4b3c66ec2212d26b970436a84cc026faf71d1850b1f367c71e1647ff6c545926d670f97bd8497fa08dece1e59b742122881967cc84e1e7aa882b6934776459bc6471fd4306da7a653c3b8c96903d4a7b463ac97f76a5d8dc13b94add915d54b7d245fa33e92bf7a45b917906c0cd8f16d57245f9f7545a8630ca5574af2488e7de43dc7f60ef78e6c6d9a5623b34dc69387ca861bee2ee2e35fd439f9786b70d024be459db3d101499d090e53a86ce181bd6fd57d28fbd8c9df6823a5f93daac67b69912dfa186514fcc5299ba6452bd14a53bc92e553ca74fc60f30fe9b52bd22ef5a7fde2fba8575d11eabb1a06a55d138fffdac2cc86af2dbebcb6d8b2b5f0a2c5d38ef7f2a87bdf7545f8567ff2f89c0e79140c4adbb5b15e15d5441f88e26bf4470345b6e8553946e9017f9149f4b2297d8f117cc8e6f276dfd35fec5ed555511d82260f3d928f932dea923c92401f30763f30c02ce013260f152234737e60803ff8a2b0e92d481e14678026c960e337b739bdd14b363493bc8dcd6dfc36329440401f92c697f4eaa37b18528f9ad32179a474769ae252f03b2dd42de63829f1b58ee81e3f5e14c517cf1e4356903c28925c6148137c2f8f332a23c97d513ca4fc0105a38ec2871d0a4b944692fae85eae648b9efb8d50248f289247fd21459e939ce4a4e00fbe86481ef4b0eb80c827b2883ceae618621179799c85cc22a8b38ec47d1f519ea73770bbfc030ae6501d10d955aefe8082f5a649cd3e6eab8f2aec50a897c71d10a92d24924f3a50e68fe4e1c6fed12419ecb76f7ac95ed349a004fa3ef9f909b7c6c41212f7b3fc1d21c93db12c8315b284542985c0e8f1a164d8a547bba27aecae4f1e7e4aae6d7f330ed77341ea512c21f4dee9bdc36df391ccdc6b3ef20eb7d0f43e24c9414942aaa2f4a7c4e443291252da052550bd2b7519a004c28712c87b95f7a83c74b1f68ae8b10dd2dd6aee35a32ef391978fb86bef324b083d777a0ecad6b4b6d6cf935505978b1beb340d013854f32c2321493e4a8ba9744da5e48d66499b24978d6692af391cf22ea526539aea577553dfdcd90552ebb3ac6219966159ed82a872964dcfc3ef3a554a95b7e30c4be54f69a7bcfcb9b6f79accc4d2f40b46355f6996a6fd46b3344da4baf6a49adbe8241bb7f9cd935c3634938a49bbf7da15a9687e6972dcaa0ce3539a46438355a97c258af3b08cc3b22cc3320cabaf4a29a93d016567368b5bfe81e6f772b3c33eb93197cb4857947d461ed885a691adebb4631c0ae5e5adc36e6932930fd11ce7cfb531ca238146bb9852773175a7b9762da5fa55e5b85358d5a57e5339ee0e759597daeebdbc9d66630d953fd746927b56bbd56b9a24d2bea5b459dc5bfe010e5dd899a02969bf5d5176ecd7eb3af97b2f5dfbb347923bfb94f6b7891d02d1b485188c1bd35f3c969b1979ecb5c5951d5f7f51174a1e94d61c7f2326257dac4a3bca599d5c282f844e4932cc63b335c33684e9a549a130da86e8675eda8628cdb15baa3a49060a05d44ba92fba88811a499696e6125e5e66b2d0b204e4a8083cf6cf2edaf07d853f1d5b5a1d23dbc6b407e07944a26dcfc3ec816dcf1884c5d251914983bc98a1517b8082c1b4b4a186934a16658ed0440e17cc19b24822f3a205405ecc641165671bbeb2584194f8ccc667750b1ceae99978f9b2af98b2e5575744d9f23a3b5b12c1635dd1a6230c2854dc046b871ad611d5798ba726a590a37a63575435d570c7981f14fce4f07382a01f124829b3f8214116990e3b3b7745921d5e42f04705599609714493306ef0e2822784c852bc10c2194d8af86228f3c289173bcbb29f12d82b3b67c3d70ebcece025e3d08d39c9c20e0242526618b37dec6088001cb287001c4ab2dd2aa9a18421fbed32c3a1ed4a9422ec22a034a45d48c6cd9ac7eeadd1f6bb7d6616e2904d127f5943e2210087e255981c9311f7ecf1469976d11087b2739a491cca22a4927af542f2e69e1c93f0d00bc99f2943f6f435cb7d638efbd609c021ed37564c6693c2683d25f1f23627d92bb1ba86128692b22bc9740d250cc9cb21b2895a895e24e9e2043f4e76764c500269450d4c76baa861c38f09b49f145831841551b42ccb320d66d0f2b8d2c8c6f06a6778dacf22514bb7f6f816910f0fd9f6d0624a56b6bdf183af0db56c7b2e1f99db03ab6df547647317925aa691e8966bfc2cc9b22ae3a7720a6314ea34b7874a43385f9da5b4b367f6579593289311bdcd93f06db4abe6aa5566455456011f7515e8575a27ad926a4e8fca49aba352a039be658adaa8e654db9c4473acb5635902b19367fbd492a4b44b69c8c5645519df6623d5b176290da9aa547166cba7308f3a0bab63cc6281e6f84635da6b346d4473ac5d718826764392a4aefab32c1b91ffe2ce5298c76761656d97a62d9f75796d016cf8eac264c70e082b05d4f18d50c72e9aa33436c2a7da5573acede4b1d9b767f2591e62e3701bdddce6ab0cf38f16dc1bd1e31bcda3fe93047f3f41bb26a96ef3544e5a3df56bb56f1e53f7544e4add86ccecb7da597c9637a619a96e430394c86599d345e4cd696a6e3493bc0d9d9454739adbe8a4d455359a6569342b53920a4159c418638c598c31c61863ccf4c4e2568a6131d68a61316211ab955ec6901d5eeaa884c5e9e5c29d1d49335aeb9c73ce39b38c6a669c70643279b6cb1371411ff45ece1bd1e6d4b2b8946924d84537a02fb0d19c3a8679dd017fb0099f7500fc8baf0f75fdf91588cc1ef99ff0853383809c7e481e3d33c76d7c5e5e813e521fc0a7003e03f09dec72fe6b7db0494e9146ecf97f41fb93518a0465d981c8c03164f34063e0bb923c6e3e7f6fe4d2b6973fa4e0082406fee20b1392587e8102d9ea8dfeac46ca76d475b3915b3579856c04896be94995e8c4dd55cf3c61f24c9e7800e4c824e76865f2c43f3e47c691e1bc91e1e4d1c92c9cecc50be7541346e7cc9ed80d5c7250c68e2f1a31acd61831cc09d7af9ef3b9820b48d0c7f6f921d8e53c91f9132c76a02ff0d7d3f31384946d31712923c12ed94a02773c912d33f14c1ab215737264b2ca677684af189665524a2925a63fa49ac636235b11491a510c50185846f9c24a36125503eb823e3017dc6126b6207bb42079e2aba5e1663348c805e8e31ede62873dadc9935d803be269160aba91ec617482ec718254aa325419c36841b66234027db8e08ef89eb3feb57870b485a0d9e3468ecee1ef0d1c5a76e46e7f2f7694dd3b96bf1332eda50ea5ea96e650f2b0719b9baf50c791a1e459e90c25cf0d8d5ea9f4a7b3ed53fadbd91cddabcfd31ca7c3ca391927cf1e4060e0afc76616462866474d245372e79d827af610d9a25e2884104208213c9d9773880b77bef88261b05a2b952abb2a4dd91586b115868161c20081c1da83c8add530518b1208120322035fb9b4698467ceec6f05f405cbc7ec36bf40b7ac083c83248b9413ac6177cc70dbd963839227864c72b1deef76398ee3907ab6952dbbb7fbead9c35bb94cca6f405e60d435d9e2ce5d1e95b9fcd9a346f270af5a6b179abf79cb5f8da663f6229522681fd14349bf1e0d95e9bc0ed983e618d61d431d8ba1ee23949d3d54c76832943cf7febab0b5f8691ad5a219a52f5bdabd2eaff28e953cda53f9e64fc7d6ec61b769da5e6862b9eaa951728631c0ce0e03e8280036ba566a02600350fd51f97a2821a4af32b376b5e2c1f22c4cdbd5048282abb69763dc961e40adb5d6facb161016acf39d56c5e41440cf0d37004109e839408b8762814d59248c52a8d2aeb168ee588fb34e48102519845e5ea2203f8f75422ab0e967fe3451ae972790829a347efeaba7b205299124a2d087d28c5207a57d2b57b1675548083a22ba8fb0df8cab99882e2d499a752870510479da0171c17257e8c35e7635c77d35aec620b785d4cb88b0cf7f714ea69d0fef8ae18eea826cd5b7205b404de00f7ad97585165cc880cc2fc4f81967a400a84b3fe8b2e10b0d34829078e215602a5b700aac7f9897536bfcd9f84486f3ad1ed99ad7215bf34055e0afd5d2d1f313f4185cb803b140b8639e205bf343646bde01b2350fd4057f50cb090e1862b4420e27326e90b871e0799b1b380953d558b65612a8a60658dedaa0862038d9f170070853367c9d99b27f367cfda0ccd63a5848c21d58c265c17c7356731e7e163fc19d9df45808fdac9562194196fdf5ec2da0961624161bbc6cf99fcdc9fe388b691dc9037718503fa9e4114f5f310502c7cb1da79c582764bebe3a65a1342801df0136dc7085633548e9672744a909788492399032dbf1b41322a1943a8201a7e4f1c59c190f4405feec96ab0887e431563b201895672eceea26a24c803b4bb1ea515b55b359f5acaa5f88f6da0686f0b10c6d83e1956274c0adc13728a574c56d202cf85bad74bed3daf1f1324639697a96dc203b1766154ec2449f844962d8b31ae07912dc1486343748dc18c30ce575181e6297c390de0d27619224c8f788526b38c6045c8b21bd7007b3b28561d88198c09fb51caef92a6e7a49e5cc703d3d16a55462398b0513c1851d10a8235b404db8b6e29697a752ff80d188e98a857083c44d5377e22024d9f0050433db001bbe809025d66395ab814052f06777bdcc2fc48dddcac61e336c5a926563fa878cc60c5f40b0b26127332d7112a6f9ec71bfa08f488fbdeeaa8f9ec68dd8bb11e2244c5102c9276182f1300152b25aaf84258f4c488c59f64e48083a229a554a543fbf68821216650f17c22c05011a7c883f10b3e3068a828178c0dff756c38e3a6e88315f01781e1eb993250f5f3ff8b2a16cc5166e06ee85f2c62f79cd9ca41cec4ca072ca5af53c1681a8987352298605524a29e5bc625aa8c10dde16e0ec14cfbb59f85da9d0ac5886552139aa8ea16e3ae7950b630ff318961b9a24ee214f65ab13328f55298fa8c638b850beced852e646208230e2c79a6008f11607108c114c910228410091c60c361a9a88e1258b27747046131a009100880452ced9544512507cb1c60d94e4009d84c8c20564845072260b1a4f303476e0e40b4870d15082860dd68c1143b8679801ca81564a2b174d3421e50614bc5eb082231278c922075d74310111676cb1e9194e0158a3045ea6988122849911ecf81b9dc057992b1bdedbf055260d1d73c0f055468c6ac357192f3bdec289833ce38a192d765f548414835a78c803e530eb9c1506610c210a1aa0714610a6984f2d788205116768c082c3d0d4d4d8734ea012c421ec2f684b26a0d0018a2c6cc0c10d86ca74d1d228638504c478e203174454f18329e8502cb3250b33c8284961811638a8b2449632d47041143b20b103304b38f1414b26843245604d6894794199271bd235d688f409374d5ae604fbeb2181106c9a6468a5b492e141a605218d322348e3876b0619648650cd98c10281cc188c8c19ed4ca5539a6186156640914412643e2e3a20e344162ac400338134a4e8818a22aa7841165efc408b12a5090d3330101bc3a10732579c6146141ecc2053e5a906642ab064054ed830e6890e6c70801252760863c3191a0c41660aab99015a32c3dbf065060accc02196e06600cd0044c3ce0e900828dd39cd992fc40d7dd00d218f17e446ca9047d594523bf79e7149562075d2ec81261e544b9f9cf86087d57e526263d84f98a7294f3ecc566bd7d34927a5b5169133ce6c770ab8e8e2cb181a6465b6b03e18c1be29e3033d410a70700310383011030e810a199cc0075de85004122f509931868c30c694d1e48b0f4498e0e9098d14f0a004a5043d40220a134e3730c11814992dc21873650c97313ad0420b2d88c8c458a15263dff0a08721166841c10d4968610196059401e50b1354a9a12989981eb0f624851562ba886245971296f081921aa450a1c4175cd4f8020c0a66f0c3097c20c649a7f9400a2bc43021c68ab4c2f6200b192f10a0b102272faec8e18a2c3d4003c7982692681201152f3af01004296c0fb4e84197d71417108295304778d1a5890765643248908145cc93234ea001a05bad073bee000a0f2d30838b993286729c44c96203334488a93214bf8a5129c6f84414514411f4050825c8304293810b11fc6083982f960801bde8b203130b72204616598061020393c5061d03e6080b86ca06a6874bc610645801c30232c8786283aa584bc60c592031060f5a30440e5cf01a83899d21e81845e4a035e95cc089918159b28169b28d41c30c4e8820892596941053c419595cd1c41332b8b0f2a5cbfde2c500b4301b182ddc172b5f9c08aa628f68d2c3184db6329cae60f94435acd259b38516a721f18584cdaccd7e94c0dc862f317e9610c306fb83af9f24c45882be86ac204611664419e5ec01f1a41c11232f44db44853c1d0c7b46d8a2b5567d29077f2795717a9f127dd2c4700156c68ab1c40a78041866be58c34a501007d0a8c2cc1445486922822651aeec50a50628510051a5ab01a7f160f52cc3a6ec2c0c2a5804550923092a8c1c6c7eaa683f47801103660b347cc4687fcc006cb823ee8cd08a22c87f19ee903d3adabf7710987b08262184624329e113d9a251a204a12804e415db22c0b4fbc3f312c9e491974df10670c7d402b6e465cc22e39538426c8a22c84b2fb6ac62886d03b843fe8b4cec11d4c0f1557ff148fc086ae020f501a240a814adb4c54d4b32e6d00c0001003314002028140a888422b1502c1c12865ded148009a1ae4266469507b31c874114830800c6184300010400024006888c580184030b8a11ee2968b940770392ae982df38a65c01af9dcbed90e116e2947167cbbff800c1621919eb31bfd26ac969e587c6c52e55b9b561170a7608b0c9f7fbbd188bc154cf992be1ab71074820ffe6694d43548f28e701dc1fc2221b790d6ed5ca39e5e5d6f315c738f9063194029d00ea9ad2e477160c049f029a127dbe8d17606dd40b052548847c14e2bab6e9ce23e9aa6b71ff45edd42388ee72c44c06a4c794a187e009e56719b253e94f64c1e34ddfd78d18e52768c547cc02058e96cbde0305b4e93d08ea1497af560109d4b74833692f903680f302cd7653f29fb6fdc01116c25ad0d1bee49e65d8fa147e899d1c5b3e8759bcdf4536553bbdad201a7b26d1c827fd9145bb5554bbc1d42a2518971f515bc077b8406d0a63a66a1b5aaf4363727b687b0c89b573a718381bd2a0c50a34ac36507727ac7cf54b670bf1dba282fcc702871e846eff600628fa8059dec2412cd4ef147e961ee53bcf144b5b27bc2c757dfa8eb7969e45e0a5a11f851fe3c1ee64cd23b4110e511660d661df61daef6e5825c968b373fa2d092c8687033818b8a2f92390e7aba30c927c55bad23d5abda633e573a684ce9c2e585edf4314e0e34f9616ec76102f2f4c400c705cdc53e61b496275633c350de0f30f31379ca6b9a10cd47a4b7aa7783c41a103ebf116ec7eb07c6fe73b734a8933a71a77d0467d3aa46fa900b3373f3e945862de0e9bc1c4322de237843e76e031b8e53583def47dc166af611c518bc089c721eaa874e8a910dbe3293f390d2dc0eb0c360e1fde1116f95b2d59d358f8e99b7ea7d137acd11630dbe4d44d39a140c97a128cdce99a3af2764ad0b780c5ce4c6beca9dba81251bfb0edd3e8abf288bbe0a795d87b39be773d558cd3475f69412886caaff2cbf7b086f8941d96176706e7aefe74a241ca2ac6dbae623ee528661ad5f8c43e61db4994cf7e08ff6e8051b2ee2f9b5c04cac0289e28ca5ec18362d05aea9cd3cbb8f2c9e1926ca6bf80eb21513216fc90ea4c6cd21178c2adb747ce8ba17f53cb64603d6a84e8dde1e385a36b2aa4bd6f6c8c8c84ade3b4e5c4e3ba13a348ebab430ad565adb61bc6c8e6f54562c2d0c9ef59c4a557eb2f044ac0771f83ba26eb8bb4cb6bd88e1f40a89ae435baafc75237f1e1b4128cf88f6222c7e471def96d7a3d7229b7e004193bd13143fb071e8d369b492741d1d45825795913039948f15ec1446c30c61b3a3d49e7e90e74f5a91304213e7a80de3e544b544aa8146356ebdfa59a6a9ee4fdc1d7ce28f174f0ea0bb42a5a87c178ebcda1048a45eec64ed02df809ff532ea65a878d2e70d75d33be7b802a7189f7c3b0ea02b65d7cb8375b2853146dd5a9878afb93f3ff3a85b047320244a16b138f79819c356098718aa71de02fea86731d99e52c1d17a15c49aaf8cf320c6d59be77c41cd682cead514cc0bfc12304d386ddf1e3397032b0e11727faf331a69b93d03a60bcf09a2bba7945c3391e9be07da9d3c423ee6d88b6f8e856e8d356b15bee320d8e940a18391f82925c0280dfe0fe44ce8099de4c62e855dd6847242370b4f533ab982ecc871f103d95a298f9d7139ddd1f26d607e8501c29baa0033ce62e30d13ac39cf8d6ffbf3a48aefab54d63127d1e5ebb0a5c8845b390430f78506b707d8025f916fa7a244b12e0989c3cb73bdfded0708443420723eee4475c082766ea487acc89bb089af58c9c743bd4f39d1d5f1071dbd3a70cb311ba6763ee45f0bfbd84607cdfae4b6dba655374a08a5fa44fc4085bc5e5b74fff40ac6864e29c218cc0f298278f306bfeec07f835e3b87e62291e8b535fc94b0d37dbd48e7eb1aac045e4f8c1eb86b0779f7829457f328ca1b5becd778c0bcc11a398834e61c47750e91d782b7d8635dde86b30df75e0bbd691c0bc19de32ea511d993ab3e27e4dc6ad18dfa227f1024562dc060fa834d8f622b67367d080d8fed2eac4814c22328da7377616dfbc936b7ec11a0c2258f3bf0a50d02af55799be906736f86e17c0c20c296aaa1a3e783191c93e22fdae58074046d65d1916d24a18587a8d8c2465038470db0ba7a074023f73749f12807833958232d3d663e697353f87677c09789c92b6b9108b847e5fdfe9e52ecba59e177cb8ca9725e067fe127be7a3929898c66ed139bedc44c67a16f0421ace5eb3fc0ec547ef1e326ccad2737225d905797bd81993982e85654b839ef330ebc8b6dca9b9fd505857b8840a5a66422858fc67c9b2cfba35ed68923e15076eccc347196921e5388342c50a01b52259bbb5987d927916cf18464a320c639a7face711016160d8652d5ad2a6518fcd8a0263680c63f09da26605c75de811c97a64cc46fb93061cfde419a5e31143d28f66b1e1ebca380c8209706e30a6805d9914a4f4efb22f1936b4201c9160cdd45d5dee30dd0adcce3c9a24a4aef1db00ddc2388427e7a2290fec4206dc7086d88615523169a53647a9714630163c3d6b3ed63a8d5bc8128ba3588b5559978f982bc1969298b72cc8a804b12720253bcde9d1def5f360eff95bb08b7102fda401707dde9b1df38ff9ff8db3e53aca767e658084c0c3e10316cc99d89a6a45332b1c4110e001e6839905fbe98d4895c034fcdefed0fb054f1483d933cb7e6fc0bc65ea3734d40054fc87afbd9201a4545e5839c84e62e7394a11fccc681062779b99d3fffb0d3d281c75f824b1aac002c7b4dee3cdb1ee9f3b2d30b7bc1b55d4339340815185ca8e6934c812e827acac5fee8aaa4f7d926c9e01311584d941101ef3387fa2e21f469eb462823d211fae463c118eb4dbcf15dca843a3d1155576d030c138a9391eda410da681f3a006a681d8cbb9dacc15259b0e07db48969cff9178c420d8cc747029f1396850bbbc7e5303e77108f6bcc0badcac0bc786a21771327cfd89a7d4b61fb021bb309ec3e84c348b2c90fb3950104123cf89abe001ec5e5fd8661a8b986d329d039cb9af93fa7dd1e193c31ddb53a5df9a16b7e4ba8e56c7cd91c974670cdc48ec0f8461014d11910b864eef43ec091404201c5227c0183f04ff59b43e86b23846840490a7a2f00fcc661b170944a1b247a228e3770e220249487007cfa9de4f841e302e343dd1016d9783cb4d01a2bd3c126f6cbed5fb8a4499e25286d0b9d66fefd6c2cfd224a0b815a1634682824f55beddc7bff24dd8a3066661b74c278225516d91a3af88cc88d4c5abc0df71cdb368ee62b886598b6f9699eeab3627081f57432dc55a6c344c68a2207624b5042647c97e9493acf6f16ab35b81bfd4201a0bf47ed666b371432d0f4e25f5a400afac97c2aebd3f1a810e365e6853164c1fcf7d10c77190bab441af549d37d5dd92ef9dac688822c4fd35815240580afd55d70588a57b911a72458b30d2634b397076fdbc85c36ecd7e0a228c6d23cf8662816eddca1f3a069e44c23a4ba871e8c800006b49d593f320c14e768c65e65bf0d88ce434ad017ea297bd2d32d13649ad9e510eb81a4d2cd1ca4bdbd4c6be72d7f230bb346a15e0620060b42f9c8633a23ad8a3c0d959f8a8aea9ca0c6cd9a61b6850e270e7cb50dd38b9c5c0d2d9232fefe9612b1a1f3f0e5fc01d63ebc372d80e52e888be164c512430566f7e3d92e62dc378e30f713691b4c2b879299695e76d3b829c592225a7b8f4cdd9cf1fff26fea0e38da1728c54eb9d79e8c652ad810c927bb64ddb759f29f9ab5fc2be7b69d50b8d0c006846bc9a4e861331a8cc944ab4aaa3434a90fa354921d6b1b89953ee5b4e1e9f48ca1cfada374f222e95ffe0299725fe20447ffc4c83d6e81e36fe75b9a48640eb42460f4321eec38fdf139e39825fd9d45c914dec32ad46e7c830de96b5198f531ce02b59bcd8c62450d9894e80b194d86aaef7b2b590475c444fc8878403e8a2814dc7b2cc9003e2a9f0a1c7afeae6684a9d334700bc0f54c0c11dd54ba0129ece5107a2ebb9d74bec8daaa6ce39eca3f23a73e55a8d3e2658718400132e7205223a9cc0949dcb2cef5ad3dd0491a52c386f8a52430eebe38cf05522a68ee64ae2f48d73a1ca94dd116ee37b027a6821fb9b8b52c8642145a411da04cf0ca92b00e92986bf784333dc1a6c44bace7da04476bf87cb4b4f7e5fee9ec9d1d890b927200e6c354e26ddcbf6332e8be4e55b46c7a006d3bc4ac417986c08f5b683378be203fa11174c0317d512acdf69f21e60dc9b84f1b13269982f8a8ab791ea139e0863c1ba3df9e244cfb7f9a77252240b7b67a635f465023a979d0fdb48e06538900c1c369a2edf1a1fb1805cebbcf7e40ce349a97f08feb352d74da6d2598cd52bb62b17165fd9faa520228aa7542feaf43ee96fda4061aa53d1a5052a9117ccba8b934fc57e4a95dc72a3df0047ddb27ea6f014fc4ad3fd35b8df696658872a2c94b9dd9f9123bd51767053388796d46b6cc2dc01c7f22b2e39865f8139ea9801625d6af8146543cac25f6912fa09fc43d716bf2a0da800e7e52a1287331a2a7f768831e217f617f9322a6d4dead7e303e4c4ac10c1bfea117028501897e1348df84123a28e4b5b8b9f1a942a89a24121d131ab11ab8671fc0afd9018f2b5b3d82c6120bbbe0d28daa1f54c744310fb0dc86cca45b38a6c0fd596788f6ca02aa0dfc65fb5ec49a455dfe81bc84ba122abdb26e0709d1f36500a9bab4a604fb5f1aeafaade5a68089b463d217405dc0b4852f17e72255bbca4e08bea2b2491c3ef4809d22c687a15790e1cbb00b7a0388cc2ed28679b2dd18878fc8fa1d478c0fe83193e6f0f7897a21d6332ce954437c0ac1f4d72e574c952af63d763e82b6e47e4db1714ecf72759d4aa778073aded9c7399a8c334036f7cd5e3e359270fd7e3364294c9770cbf1307434d285fa11835b83ff738d6f3c0be1b21442ef2bf555ae6d99f0bcb78601b2c3faff51ad0de1f656efd0ac42bc8cacc278b8ccc5b2110ab7afa32afae6c54f3a03e857a3011caeee18cf867bda6516fde0ee6d14137f26f8126f4aafc9d9aede2c4f471e11bd6ae48d2a3e12fd53837c5f0f72565163494587e116ca66c0939e8fd8b79769802e541f616cec6d958eb1b245f86fb85dcda23c663b222bdf5c81509292e5521c5ee6cb965517e6c9a07fda0b2768c84db19c2f540982be12cef661772804bb38863beeb2d1b51235e694d782975cf3008690dbe803d5234fde5975b2a2e689fdfaef1f61eadb1c4e6c16f511a9c5a4ad192366647e60c5f008069e7623001abde309642034370b33899986656b1d48e78c81e6eab3d6f95a524aa7d930c982f06436096286077688224c4cc27eb88bd953e9a72a9e9d9bf0d9655f0113cb2c6cde1e14867e1b6a4d8b88fdc9199759d7ca62bb85aa5468f6bbf83bc58aeeddaa90463787a37ff547fd43700021c822905acfc1e226dc542a60188da032ac02c7835c8cf18ebc8e791ac64d22d50e72c2353f54da7e4c4e6c59b7e91628963564a8ab8d89514c6b6437b97dececa815e38e626f8816d1e7abf5113421aca9aabb853509f49b7b81f0ec7b3b2dcd9c09af284b28a0e07a4afd8c38dd9d604f94f8e50ce06bb51e74dfb421c5eae43350874ae8a0f28de2e905d9231bb0477358b3e4de89b2d918ec623ce71979cb1301a74e0eb067801648e8b3f8d04be990187b29c38ee0c68379d828321d39dd5df856fa16ecd5fbf48f021ef6fa81de461cf443b143fb5db0b81281ba70965025a62f7b6135c908b3d29f207edf2736415b1c0f9791d17591825283a78caf262c2cfef1699e30ba4c04d005c4e0a83389c73033f0488d5263881b90d39218d64dd138af3e1396060956fb5f34a4e832fd2923bac124e27d3893f98f9071d912feb3194c8794f0986d5e475268ce15753654d7a5c42e8f3d7a4e0a398736944ef5819fc9fd126aa7af23c566e2cd8dd287a6cf4681614e7c00cb3a45fe807a37048ad83f42b50c50a47dc8db9ba25038ab56e66afb9c66bf5eb12fa616bb27b3e016e8a6a60eaeca15c1feadcab4a38f83a283ab5831e5c2844bebfd6bc15fea7b10bdad924a36cd7130532305f6e9f68b24d096c3a4f4eaac87f4674ad3028eb3143f3ac25f01c03b0a9cb0a81915ec84eb2664dfd0670a7db7055ed1d799b4609ec2d05147116ed5cb53780e34b791c06ef3736ce2d3d35be2effc33c14cc43dcfd731ad2979a2bbd3b6a4b42f6cc9e0794d5bfbd350ec7a65f3d4afe1750a901db56170fbbd9c89cc73fefa0cb6d88606b5859bfcee19d695c5d45a91117371359bc579b6bb2f0b51dfd3253ba79ed99c4885faa36a213f3fd2b7a00ee5dfebd7b225e3c6e584bc9b9cb421454084d54b0908dc8148aad8b121fcace4af0a129742c6cfc40a8be1fc523cc777515c5fc54cbefb7a90ff9081d63af5bf44bd344b431bc48a760bb242fe4b1345ee90c5303d5453d2c7bb12448fa003240bbdb8f1dd23acafc052d6f2c8a28f8dd5ce7b41a02f58e82bb912d6dffa8eaf917b2b24cdb3eab91678b0c44dfbd00453ebfc322ee3995bec5a7df83f532e90bff7a122a2525edf8f649949f8ac29a62724c615c7b918912a5a70d3683936ce96ec11474a207f54234cdfe43fa77cfeebb1666efb40ba55a18815a284c1c9d80c643c0ef51685ef3a97705e6b50e9df679d91a7f359cb56577402eafc5fb566ed393e4031db8f5dade5fab563c8404ae577f778a10106ac636d241a38615c1c93a0c9141fdd615f820c5455d256b8426b874c21e4633e1968d5c9737e82f3744c758c69267b93c2052b7e237b09664493aa78690334065d7732421c9811c44c27acf50a00087b9f803351961d6072ea0507f2745d4a88ed20ed405cc7c465abec0fd42d440a6a94eb90d698b78b6807b80046564d5bd8a38e420f71434a076a3a10fec61d973b62255cdf1485a421e795a8fb7cb8d11fa2096d61e58603c791ae24f6f63533f4dd26c410ab7d43abdcd85a883d434b5a1cbc2d0b869ccb661d833448c00a695d5ca96e63f5b1f75cd7ed4c0f77c03f632137179b63a2c858ae07089eaca1c4321cf81a30238e07ca0652a97a9de39608c6259c26df1a0210db572ef1df0506f8ff76e0a0077f86cf0b43d2861e9e2405024fd03484d0448747e9dae5a9fd8f5de2d2f5e39046b17789e65326bf0917d41f90867009898f1f72dfd8c8c6eac58cd4ddb3de8972b9040cb4f888025e13ed5c7374bbb3fd85049621304c783822b676a0cd0ff007f28446bc53a550ba3008496c345df6d78b0fd8ce89c4d1ba02b0ce41cca410d1203b0ccf5cd34d74ec61007b0f556834a2fd4c7fe436dc98c5aaa1db758bc4d15d772da40d6fd043badef544a83463271a44110484d275c8aab553528e16125f106351ad2e6fe74c50fc591ff5132291e62a058c0a45e3e219e8edc4124a6e65c7c9d5a9c6056e3f78ebbefc2dad8027fec51de0e5d8d4577bf5c27d84c18b211870c0f2f193083d272f82ce47da66fe35f7ea7378eef3c39bbc0d4e05eec9a4da4b0c26b686e5af375114c04f5b579e952b237854c81ccc6ea8fb976082ba6d122334473a995b8569725f48a8c68d2c9113a7f0a4c248639f9cf7b884e0ef61a0d0e1f59552766c67ce034209ce0da17500aaff1e320ddb55c680d1bca118c16cd18af20bd17225a393dcfaa41bbfe4095a5daf4057ef32075c5982e4e8a7073931cdc8ca58cf2cba70822ed2ddd69b9b65a2ca70baa4da579802620fcd28104e246b4c6cd526453d25af386ce19e931d44e5140921fe4989c85b92ea8b20e344a41b2573c56fc6dcd4e66f49b2edefcf39a5579fa1861f129df4b0b07c833a922fc86675b46dd549cf5f1e790bf0ef0dcdb37d773ab4914651029acfc6c045b962cf3815acebc5802765ebdd7110f36f645cc0e5868ee16c2a3734f6fdef511d34da9a187483db05880f41608c8ee58247dd89c7e38a5a9463c4b798b182148b524b69ddc1631fcadf7935082f0a3da49f589a2b3f62e5dee3a508e744122f3c3c863785adfbaa50f3c448827f2c93afe028b43d48a93d0a5b3bf83de34f0041a5a16efc89e4aae8e6a1b5c6d09ad8232d4faf475c2a02b1219e917eb1028f589f7f9c881c48b6d79bb8d9c14af6dacecfb04a4467b9c710fe5dd795e9dd8416b29211def557e3b71bf1de9d090d4c307ec8c509970359cd77cd7c546a6842fa4bc1272da3ecefaa86136eeecdaa030ac6f2537d0b4171b14e2335382321c90482cf072c1d641710e5f3390d7841bf066877a8ff7e1c894d2bba8e6bfe087801680cc76655601f870883e951fa1e088577c79e3df593869a645fc968330f599842228323ef9e6f6790856354967441631583141461834305d2dfad0131c1a32e5c2dd9b22bd8d961ebc3838bfe43826172d2fea6f94db69f090cfe5c46add8da162b029ac98628f2d6f69a93921e8c0506d7166949c8e501ba2e7b4606035c13c6df3e322b96406917f98960c921ffb6f2a1b47e17d99846ac7fe07d3a78a293a51861cdf210e70894b0a5d511d703f97d88d350bbece678e68ac0c19fb1e1b351f89561d198808ba13ef4aedd8d37355b706dc279482b753a4067fc000a7da177a74120141d9f4320bc8636837314186f8368ace17bb4064cef76144e2709718d29dac578ede55bbe11871ab15cc1f2581713afbd7c3a13b07647aef77d5d84744dd20fcfa3ff0df8eab2fc9b74b5854ac201ebda5e5268bd4963d4d2e56f59ed499b18e6bba0fc25be342afb8a9471802d0fe86c984352adf7b9e0f933aed1b558e186b2f58dc4e778e62a2408ffed59d9d9a2a5ec5a88644ef4e2adb842409c58538d4c8bc90d64e0406322fb9cf73875e00f7daf6f8d586669d272b3899eb8b43b7eaf08ddb0d8ad49e24d3a4963849bcc0bee897b5655c93068b803adb7232a6cd43e8c64d0b2aa9bf507a410b6f730079f87e936d4b338ff890f86f310db718c5aa35f2102abe258d187fcd08f63fab1e4dc3fe9d448e50d99b325e863727fe5d8dcc3dac5f34c744bbca4726dc1fa0339622d93d3f72026ab52e9493c8d652243a4c0572e5594d43633a5e62ff2dfeb51db5c6670593dcfd59862e399e88913111590391803b294d3efa55051109fdb7dffa5f1a4761910abd0a6459e07f088b2b298d7261f6c03bb8d3176a163201de35589adcfbd2c5a76c1ac27439a376ea0cec82b4f03f9b23137211f0257b82d8dc91840097aaa7bb03b5ef20415abfa35f8288abb80bffc8f50bef5c343f9657ffa5133dcc61b0f10d79aff59222a95fb31ae507050f125ba1f3b04b9b92c9feda1a70c0923a8e1829b5faaccb4efb4f70a3f05b18b63276ad04dea5f56a300de1a7a8b241ac352deb3581d460d5a2a0f63d287de6a9d7e595183d447181540a978084e3e179b3d34f65cc898ed8a5bafa08a0e903f0d4339f019825f50d6db591bdcf2626196a9d6db4139b66ca93197ecef5f13a018d5da421cf99106362984bed59e40f61f9f8b6dd7a9afb4279d21d86244026620646833433f1b9da21044519f15c93143a77e0209868bbe4cefe294398e03b73a4063597e7aae0a424f4e45eba165909284fe1527d208af3a285d23aedbb6bae6a565fbf5454b1e0dd77427e7c4b2d766873661726c8dc83f2c7da6eb941a04818e0d841691d28c517ba3f6083dec8610b7460ea7bee7c3c77c9eaa19ee25015decc06ff1d8cbf725e6369246d09c75d842b6d25e4e90291d2dcfdcd52be1b3ea7f217733cd45e81aed25dd32daf057bae6092936071fa8eef4daaf199c023438b59a313f694b5150f0629b0bc344dd71c9ca558974bb74345f88734b7a7308b0c3d1d46a4861754a82bef77c0a7c6b04ca9e213618708b1a5e3d28963b32372d0e94cdfdf20b1d706f1d6fc277039a2ef5fcf91fc9ff6439bc599e6339bfde5c48f8da216c8599c3ccdae216d06462083fee1f13c5b4f77d84e2a0fb2a55cd2f705e27bce1a6a5bd97d82d78af51b616af341838cb36012dcfdd89db0dbaa6e45683fb44d60d6e17c546fedbf57d878976c07de238ca1503b34899befb3286feda9a585dbda9150690b826b2b2299b90f48bbcdd01f2df94f2dcb54397c08556af216785770137ad409c485253fb8e1b582b33d36be967bd2e2e45e7f6e663656466d1def01905650972cf6793f8511836036c90f72bfa314fbefef7c47d56248f318a0565fd13330867dbe5563e416ae1db8189db8c872d4bed6ea4c2879e5eb67be73bc5e431aa587b7ef90075e5ecbfdc96e58e35ec4fd8108521e0865c724a0115b927bcdc869caeddbfa399ae9f96390ae63b73ad1a4c1aabeb3e16e4920ed8919acb1eadc79f20579c03cfcd62b3f84d1094d389ac2e660b172fdae8fcd9f412591dc313dd750bf586cdf2566bbb8220218134f4e488df2e94bf51270b2fa860c09f1a6c7edcdb7872d4441d3b79801cc9a139602fb24e8f491a16407152216594990bf9bbc83211c84aa5f5052407bf62ae16410a64e21b36dbe13205df83ad758dfcddc70b65a8d35fd384d3ee899409350c9dab46af1c8fc3bf7fcdec1e5d903fc60122d2027793553b5bdd7b7e4d3c227f3ad0ada9a5c74a882a45d5acab07dfbb433c752d7d357e4549f392fd8958bbb208fca220d1ec9265ede4bd1535285cc820b765667ac19763c1e8671d4a6a50fea840abb910d27856d94e0d3f7a84fcdb7b276300ab2f08be473108125bac98a8e35b4bf542b1c4bf7c713269d1f9d16164563b7b7b62b2466fd26240301f5d09ec6418ed1170ba0607a68544dd61e64115c0a67ff12fbfbd1d375e745b1961c9c07e1a58b05493ce038feec81c6524a61b0db613491cef26fb0d7d926268d7c7760ff84b41fb1cef1f4242f833ca3f6d45306f2380b67b3a8f824e9464470d542c0fdc0a0928262268a779c027979d0678fc884069847bafddd7bdbf8f534a2f132c79fd9a737af15cb35c001947b3d19569c54873f20613201c3ffc5427d7aa870a7d8a78f106d20e771c7615a1b8f38e34b86f642a770193e1564641281c428c066a7910de2dfb22820be9974adb4ac435771f80f15ff982d334776a16bbd9f6ccb1e2809a0d20e66509925e7810d92365945d987666952492f4c390ce0701168743193ded5c1e87148965fa1101e0888b90549b34d3c45c59a9d23e2384634c0375698f3648e48c4b3641a3e57a77a234f9fe555a0a227b3e094c7aa7b7075227faa1d1034a20408ae7fed648a45e1bb05c3729e98b97f286506f0973af41665b42caf690180cad8f1ebfa0421bba971cf5cb3b6493305174d47022b0df2b31cbc767d8e128f81241413d7ea9714a6bf7b3065237e2aa199fa0548741e3fd2a3a93a283497e0a6507d071ab5d29348a03847b273c5a45612ec20998bca7bd97eb1bfdbdcbd16950bb56720bb41b2ff9d8534582e056c938af0b8fcc148270894a2eac1cde5caa8f9c6eabe4c6c105212a2886543c777f38a84e499a198157113b73a0946c394fd84e3d214fc5a271ca344c91a78856afed88325563cab0b4b6a5d86f75c4ef6da011ec160e817c67c7a1fdef016bd82fc1b7eed78109c0280ec5845a7a8f52d39ef3186b90d70be1ca06ed06182e8fffbe8371fae19067d91f0a70a2127b2e4eaa55a473b8de2060679018828db38aeebf987395eab10f398504734ad86c9fe1989c14b7a130461bd3747524ee2cf5dfaacc3db5650035f8cbf3655b123d8eb6906a478d925897d55b5c56af64d6e910e0039c551b4eacc1c385ef0f55987a80aaa4423bb797f82cbfcb62723dc4f9757544a370c3c012b4a707e9c4f66de422864f5c49e53035556371f5b6df54b3d5971eb68502144cedc80a2c007075297ff24898594e4739f1ba5421b5a0e17d69161a5d2919c53e84fdd08cc9a1684a04f9daf481467186cd0d2c0582004e458a11fa8c5503e97ee9cd0670fcecbf7e38e66cc4538a4c48a7f9c7a5afb1a6f62d300b6c11ada78cf51569678a60c815bd55c95f78a1e9c095795a2cb67ae7d02ff75bfde5156c22a3f616b52cf142d313137d3d59974146642db0efe24d8a815269814668ac8245e4d0ca75214065d51da03703a3f94239a9b859c0031a22439310648ba3666eb77e83d6dc29a64ace22dbd27e4543f084e474f80cd1e2e64406743babd08ab88d51f0949dd326ab8d15c20d1c353244457cbda80a85f2336eab181ca33fd4bd3bb2cbc632e44adf19cf4e441fa3731198ba212a98ba014ac36c70596656a0e493b0ccc5ab91748c03b4ebfcb147c3529cf3a8474d9e990ccdbec7bbdfbd563d523c172eb81936840b28717d5e13ba25e3037d2c94a734e1ec34d5d96a9abcd49e1180d10418dd7b14e8634a38fb87ef98cff579a0cef21ccc1ea47afa401e42003a0203190b18c72450d829319920302609784e97968b2cdfa84c816199f06544e95b9897689965c36351270f3bf56e01b9134ba945311cc3bc2f60dad02ff86f1a40cf2c15b79416b36582a1cd0bdf31559649c0b221a5634f30cfa64eefa49e1172d885a2d4d1c7f2e092ccb17f2ab8fe1e9cbdfea4c77c3571b191f50cd2da43db9fe9c3bba583a3e5720dad1ffca478881b8b758cb554de1bc94bd0c6c2e39521a6f8588ba453b67ff2e5d607842139a76e195b33196fe2d68b23dfed52fb04ddf12da5d3ab55598524a1caa36c11e513458b72969cce3d75be1ef2a935ada9788918c425ae63b90d259dcd4c8f828bacebac9f6676954f0c0b9a2c5926ac857511127988acae14b3f7d563bdb3b3d8f273aad0cc372b01c6c1c9780d0db1c98fcbaa117473b623d4e5123a9c38a57a69451bad0d81ac8a66692fb885f860d8e4b76df7afb1b168a62bec4d4b1655dadd00ae16a5b497df0b80b6e7a1661891f8d5d07649015f40b5e6a3da8b86fdcbc7a0f5b2b8d6e786c7ca7f65c30ae75bc0fe24dcf4f74421a9c764ecdd89729acb62ddac4f7bb07ae5452790f1ed2bab926967ef8cc764ebf903fd2319ba2aed545adc4728b8f0a7d44a727c91668bb84ae649fcfef8d0a00746e68120f69079866be9b343bc27975dc5c08fe7e94bd77385abbb57e611586e3771e556b8147c104bb42fc8ed25da1b66bdcb63859c3433f5f13f163e5ad0682289914550d03a0bf0ee3c48b10d3d3621ae2531f03f89b25f539b890a609fba3167dd071013da943b61ac4091fef198dd3f6807239a85f6bb40e5845f33474a2fd2b939cf511aff9b1499eda1bf58897dde428a47d29ce648cc121a2c75000d59782f6bcd53bd30d49096d3e158691f06ba1cae4bd4c5e402f7a36336949ff8845a3a9035d2a8c9287ef7eb8b5f4a925045de0fed6b4926347a6c9fb2cb6e41e13bdaa46a9399b7f45c931cc1cf7b13839cd75e64c7a8cfa9a73bf3432e1a8a999b88e9c0165034c2ef34f64a223f618db00e02d829f12b0463759294a230da4e874d81c2b13107ba43326412565a0fae074f120deea0a97f51cc3284f0d0f302432c050a5014014d65b65d8981fb1d31f6e1bdf0e0b4f13d1cd0a21cd6387ace1ccfe0909ca49040d10d07c6d17f25ef75120072c15dd7648cf24a20c4e8362e2f6f50110de213c6d77ebaecbcf482870937ebe88a0bc49ee8349052650929cabd73f645d7f027cd67fc6837489f83e65cd732aedd7eb0167683d64b0cf11974b0e042ed67962bde41e3c9e33cdfd6c12204d854695785a176057d788234ad8f7f50f893ef9969e0a9b311e0445235148b5fa5d79126e50d7090071a41386890981f9d3301458dc8a9a87cf723a82824458e8dae4ab5e8bf590050024d4862e377da56c3f23721e8ab74c952d125b72b36533a2ab29bd3bdb6402e68abf719d80980c561b938546c1be55530a74234c7bd8dcebcc781d781f5e91e96f80062190c14575a8d006a9ca2c41968b0e996fea83ee0abf2c20b99e350299f87232caa9a41ed06864fcf3fc186af50913ea0702ec9d0f1a45f4b6635a6d2c46ac2d259d88c7ffc9e0d2905e86c279cb0ee7e409747602cdcad00b2f12660cacb919ee4d6e34b808a746a3fe4aa63dfe529d5bc4e21c8c5b464b331112241b74a79af82ae531925330e6de36254da380943dcd83a9285c14b13b9494c98fb5c914845a195ab4ad8b57088c23356d36b36046afe0ee21402f96387dbfea2907ada2939f6d360a0539aeb1e4d7b315eb22c99c19bc59758cc0bcd89f4fccdefaab882aaed802c336c0fcb9a6fc29a047a6bd3f098ed0180f335a33902f9628b7aadac11500000042be841a7b09681e08912fc7741e07458e98e2c6a74719247f3978e48f278a92c1b860cee85f0c5e1697a1235168d8bca225009e86409e75630e0d8d0b7a6cca656f8183b6c8f608b9965ac55a75ab04231d42d9f91da342566a633b346256cb53c7da49c7ab39e4d79e1c573003172f2c36600c70db9b47b6c8fbf7084746a7157bc2341e595fbde178d88694d058f76742823a024e3cabcc0b86035794ff291044780129c9ccb8a09e3496c988c540e118e9748cdefb311cac071e0b1155bb4b5d37126cf9ad1bd3c410a1939ae3b40ee47f718e918b8d65b205d3162255b923f35ecb906f0cd4efd127ca1075648e4d4ecb669e96ef870f63c26252fdd688e790971e8d1dd28387098b7e3df5707f7ee7a92e893f341f826f44a594f28cb71ad99c8a94ba95c1e3f21348901a5a8a5c4323de4b2c278d8d206d06562022eac5921c630a4105ebf061bb1bc8f4c4ca14be67c05bf089f4898c06b23a3b74f17742d64d756cade818c152eb6fe8ace8e3a446097beb51354cfb30cc49a6eb3e070271a70ed4b1ff2218e1017e97a07bd510cdcd3571256b1d4438b6c72512f9ebc34c8f4b73fb5be7dfa6569a355dab7485a1a472f8ee627b6df735dbf63be0d1bc001300e18ef2e3f0b79a945ae91b539f7536f8f3e130180315949cdde9bc8bad1c558e9e5ab698e2e80c79ec6887cbb550c6d2362172387e0dbb5aaaa94e54fe572155259046ee6d0d00e9d9e37d963b03f946ba2112d20222e25a5915b8658c2ca3dadc2ab80bbe37249be45ff7d84abba74289c00d8654d0a2a783650fd1db0e42460b8af613572d1144660bed6b1a8f683962030104809fca6b4b3bfd127ed6b902b961a46d981a7d3805111728180aab7b5dc3f863dfbbead53a84cb57a91b6eadb4e0d3f3041fb0d502d20085aa84a12c98afb51c3885d68bd0f8bb2cb3e681754b7a0692ae29a3f1a42fa5afbdcb9d65778b8bbdc3ec3697c04ed963db8b7b506ef4681ba9f1778483e346d400e43d815901a5fad8df28f600f8359e753ae5211e7c5608a80bff8bc88127a8d9445a5bb7f551cba02be0cf6b6dc152cd2baf138a3de46034036678f341c86c975bc7c31f620740f65830ce4f872e15b5e359dd80d5f021a26335e93eb2b6e9b138ee8bf5aa1f211b65e8ac80cf71b525762e136f239d2f0f356b9617fd3923e56a1e347d733d390ca44fc030af62ed8cb36a2e9c7b05f69ff7d0a69f6110190a8ceda3a0c4d143188d03d6eb4e083bc56bdf4f1fe56ed53660cae1805de188da75a9fc2be14e0236665ef3bde08e714581019f3bebfc4cd70612c625068a53a6bb38b2eec05f58a80b8a12b1a2ba94ccf6d00ddb07ec539e860750471dcceac67370697fc3b88ae1e90110e0296e1e27be597176f6d325cf2cbfd575ddfa5b4d1c31087cdbf4eb46c6f8e1c6cd666fdcf0ad19565585a307afa39a1b45c956238e4e15090a86bf6d02bad8d9ba3861641ab6462d1c2f0bb429c0227cb2fe3122c8ca25dc3aaf426e9700883d29ac74a92e472058a9b35ed1bb8bbefdefc0ce4bbf9d5ec81897e338866a71242b7895391c10983e2e82fcab90d5b90346010157d56ef8349173ee31a202ecf00649f010a33748da9f7b9764e53d4b182aea4a6a26d919c02a45bf360200e7f45493f45d374ff2bdbf0eebfe88ad74187159df6c17dc9d079e27e3d7c95bdb677b365a2c93a607ce64b04e757f3d452c6146cb544bb26d1a0c94c238628de8e325c8fe1cafae2cb4d666e0bc758a50f4d15c3eeacc5f183fb8c7474f2253e0933cd97ac5fa110b774d296fc03dc45b5b3d769dc94eab1279971d0db99b1bb58245c378e52cfbcfc15fc02b643f81388422c478da0463092f2ae429c2475dc76ee515669c28a9693c9a6b20e19a0baa1d77d1195fd63119a6c8113fa9367fab9457130f535832a65288f0257b4304e181ab5f9241a3b46b747bef26248eae3f4cae633df56e4de574dd0000de3014fcffd331d670436e31a56c057b638871aea913dbb7a5e51fe056bc33afaa81733edb6053d842eeb7c23a46504fba6d6de4cd76c02dd8f117c9803acdbabb5d8f0b37db12c5392414b0d29ea6a6eabb258dbc501d4fda3653e379a9a04fd835c0d019db02a792be1f9b0177807e0f2ee4caddc89f54cd6740f9c1507996167cb081aa3c94b482c90f36871372ac04560722019a0b5bf68ec7f46385b96d90f9932dbfbd023c26136573cf465f32dffee5b8e896409a07c7ea8889f514b906218c5f931b4900e1f82a5828d66747dd23ae77314a3bcf9366c13c945c0925143ea0621d3f559e4fa1f6ea84787d0c2d904b829bdbbdd61a22cd03756712d66b71f9e1cbb449c35de07da41c6a36d4238ce00048e85a3d2ebabd4d282606a1a039d6c0f2556336247c5002d98db040f2b558fbcd0138b1cf0937228e42df18603aa1fafc35039b4cb1e203bf542abc63e6b83a8f16f84e718b81915e42558c64dcc8db3399972db241c55a8c49926bdd3ad5c35b0b72562802eff62dc30cc6a993a5247a6df41baf86d3134f612d833810fe23ae6d4a7e89ced9c2c94d6c6e674823a2f3c09c9c0dcc5d03765a4151d1bcaaa117d5f5390181b4b6b475e571c95384d8828160d17d8d40f14d45ad2bafcd8849a242698eb32001657198676359c8679a3f48e9dee47735a2b5f58e1d82c07115a3ed6def5b6b5473df42ca3253269c0f70a84f0e3e8398c17445ab368f76951016b44a7bf7d9cfc39d2e83166b83a602907214da32bb2dcfcc62d302b3a0fd06b4b89658ab70d08df9e6bd9fcbc6cfd25bca186bb97716def62dfaaaf02a6737e27f8647ccf78c5843494428c6b21a73708e41e6fc5ad35871330294630fe81b7fda703bf24581f0428e4aa6ea0d124bed48d102dcde0df8d6b3c5bab1dffe0370d53da9aa25c1cb5a161276d4b9c939a1669b0d0bb31ce3470a17fee2b0da0f01a7f72b83414d579ad7dd4db80fe5bd07fd46bf5ad405cbdf6649ba14ed0075695da6b3b52255e5ca4159d2ab9b91d0b4057e530d8a58105778c57c887846e749ecb7688e261bbebe1e62c890879e5bdc00eb344a0196c72c0c341396252069a7c9a625ff99c29ea8a9027e7a9767e9a4fc9c06db743c3e7651ea069c82faf611a0003183268cfb319d2d3c57fef90fdad2cc2e6f3b06a9a3fc8525d4497afc49d104d7e79e3dafb2d77e1fb4dfa5808fdd336a36ef597e09a57a5fd96d4d9fd93489796f602d492eed95553fe5e13b45ce1acd4608eea5a979715273921c066455e301cdc79f8b3ef28ff9632c60fafb6567b5dc2e2a68c6bc7748d791b46347bcad1ba62b69e2d8e8800b6fed7b68033a40a66e0c6254d94e9e870d6975d20ab756f80f1834ef6cb14223d930358cb427f2b88361189e8bec09a1f34088f8ed031e40c0bc2bced026bed894f2497c59eddeb1e176d06cf8d3e75c3a4d37d0c9696a3f9c51bf83039d9798c81b52e6685d160ad317914a7b02ad45f6ba38b22fce013f823d67608eb96d4547af7a7f50c68494776556433386b9f3b1c977459d94b61f949411c4036bab0e0fd183432c1257da0a2edcae135b737fa175f063db0e5229f384e16758ba497608e150c4800482e27c7bbb2b656f3e2c6d593e0f9f6c634cf182b54e17746b449795545d10ae957557bb8b4c208aabd82a4aa9ea9581c2e9cd6703c05e84b7a3565524f4bef3ead3042508b2e90e20024a2599921fc185cd5e6c19ca0ae09e5177e35f072fdba4669099f5c20df3478861275e6313fb8e7d47cdf8d724dd9404026b2581ed44aef671a582c1792b9094b3320e3eca91e9f1096527e0809bfe3fcc810feda5de3ab3c3239728a3a0bf0c67d07c690f9cd4d2935129dc9690836dc5d5faa8e4f4e8d0eb3956a9bcf40b44a5d6b4313a73027e7f791595b48551c712253e713a8ef0c4ec56b887c53b951254e0d0b6ed85a3cf24d5b960937fad1b01dd583f4c0fc465e6242135599fe96131c9fe94bc7cff1d6a6583797c00c85d150b59183813af6499394b6df7816311c9e0b6858381e4d92c9cc43955271d1f108ab89809b61d2c9b86fb7407c69d5d09f9e0e2ee3419918ed196e9b1cf88e8f7ee66dcd27438f9b6cb1fa579918bba8d4eb961ba193eb87ea7b6a0c496994a2b85574e622278dd3bebd5c2ebdbd23d403f1a46c64c2226bd3fab38821f94f88aae56f90903f7ea9397c3c7bfe9f84b58ffd4e04aca3fab654ea57242a369e6416cd473a0a3569eb889b65c5547cb7416590f2cece1254e815bc1eed2142d638162de6368956264e8790dc44ca5012fd5178cb088a91a7767b61d73f14c4389d9e320322edddb297ee4e5370979a0daa136a1266a1a669c36e18328e680529843ea7c460ca6d748276cf29d7d9f3fbfeccc0dd0f4b89ee4bc410ee954638a55b2e85350041be4e2d4cf17930214eb179250483efd0cca98ade02e89fc7c9a2fbad9b0f50f591e09b763b88a65e21fd35a97b149ad75fc16da7d52cb806ce380897fe62fbe58076d3048bb663fc357b9e0bd74f31db5bb7af22272b0d7fbebca85969e56dc50bb5b269f72eb9ecff601a940ab92c465922dd4f2fca77ba55243879e1b9c78c47fe38c17fe4e03551ad118d4441d50c198517090c628d4ce14c0a44369413612c1300a9c37d068b11003c000f96fb33fb7366aa72b2bf5e91c50c3db626f1152b7225a3f9b4c7970ab63d96b41819f22458d144d4a3f1f33264e8303b5851b3402b5da9f548576f82c309c49d15ed502a0510b4619ed2e1502b08d05382a36ea99c64b325ac8ac96f0f27f186e0ae4e3bccf5f54a22b660c4e9490edae06241bc1daeddaf78353eba71261901c366eb6cecacd428df76c90c2a352d40c3583c1aa60c1465f0d87903bec12b75e76e92e157285cda428b1dc5e7c0734a6bfb2d060f4dbb371f5a7e35367c143c29a2354c144fb387be3a6897b8370a9eca1c1fae0325b1963191fbd4c8827cdf41da124913a3ddf0c9db20819be2f0932159b2f8fbbef875a3c722d1d22cd4b67fbabea0e2d56901c4cb710ecf8f044226b52a25a8eb6524d0f084856af29abdf94c2406c9ee08302ce28c7b631fe8ceb850904234f2b3869567cb699d63e2b8183756047828041ada118a4c5ed7516e55e63b8a4354228068d503b482ceb082f4268705a65c121a38abf3be68ab82ade2b85083908c4aa82e7cc0cc290b611d030607f0bb1309c0212a17e4026e8bcdc73f88a21dbc1ddadfce266c36d30dd38df2b6386db38d4c627b27ffa0179e43350d4a22624e15e10fdac3ef758f173572bfaafc44046f72d63a762e9236cd37c7bdfe1a058c0c89bf2d9f0a255ed1ad5af76aa1171c38295358f77c98912ee66c668f98dc64e6405ab0f6bc5bd1187b9f252e6a287a91c95a7cdb288338a5505a624024ca90512cbda6c6f94a208cbee06ca89e4a608f56d6fff704aa46985bf6b928591fc500df6f2346a40c70d8bf4b8b6c0e98d8b18b0407d8cca6971f661d4c842828f7e3d7ee215cdf89f61f7e8312c14d44b5b9ed3e0d15bffe40892830ca508005fec27cc5944555805d23b6bf5b23c563b78ca00b3abb8292d1c205db5324a6fc89206450c4aee4738e422fa14abc3ef19110e563c7d7482c4bf645ef3e4d0fac247ef6480b3ad0f5323195e4b412ca169d9d28e5838754812ae5ebd9bd1a680be32eb71343abb681042f1cfa9bcb8fa7b5fae63aa360c95ac54908b159e6dac6007f810c09b8cd560babad3bbc63dca7b3a35c2bfb4c5513d28ad34072dc7e3a794a6f03de212e12070fa0e04b217237f3caba77e21986bc7cdc7dc459cbd979d2b41a2eecd515360f79a238598ab3da495d80f64a4d1949e95e38340a86afc28eeefdffe685930aa5bbabf0d68c7abb0151580c873b2a0d7adcfb0e8a9f1455740e4de61c4ae3b6a3bd4d620a7331ddf6ed6d5a027b32afcd59fcf3fbda82ddeacacb5f5a9b505f2f38822982a6bb5299d030bbb8d916b7529b18ebe79aa5415451e285c6d6439dc0650b9d76339adcad3401f1a34bf498c38c0658b88ce61851f288b58b61cb9fd48b85277348064bc0818c416612b91749ce3e534a98f55341dfc6f6d8473196bb2499dc89ae2c98c104881995de83b2a207c9a7e9c1e4ee4c7f66995fa7143a83b4fe24ea2700312c2c6cacbfe77c3155c9ec122387436eb337edbf471eedd40788804a08ea04b21626138f89d4a0a0ba167703c9dfd0be6e7731f54c7b2ee303241f84f9c36b11a898322827b84f1d88a2f76c003600db30defddc9dc33e27b7fcdbe235789335b7e2f1396273657827028e9fd762a9f6c790744e42ef085eb35a19ccc58b6374046e08a5679aa0abe5c5df3b2f59501ed59f97c73b8cd9e73db6d729950114000217f592b68f4877fdd3b23c2b07a15754f9a3c2b2f13905d74bcbc4b04f60303a0a272cc565fb4d0fb9df143928276c688c099c745eb4bb8090484cd07cc13129c2fa3e0bc1d2084b938df09886d6f39eead6ee080fd06f7eb31985cd9bf7856d8640689da3355d1779d308a839662516f312592205ed247ed71c4ecbb0801ca8db6abe31a801cf4f339690df6d965a6f79e5645f047650047c60d1793e82795f4531ef23088626c01b2bb4a05bc79295c0a840a6d8423a9b9d14484f1ba5fe74fbccb25f17589dba51326c539f81b494aa37a5bce14f6621f5de4dd490f57e7d45437177d095fce151fb6af39636aa979dbefb870f088ccf543ae38343f70cadd7bcbae32e746cbc98ac9c64b42025859d1647b23194a695453c1ff8c2008edf85b02212c405cc60bc97f194203fb3aa6c4d76c6e02fb1d2f3c792cc3bad01c772a2ea16d263d65bff6d4ea30d872e250c7f45c39420e13c4ebaf54785ab1b66ddd032aacc11f7696536228a59cba24beaea32d0b3a0ff5d42b0321cb3d613dc8892c4f41359ac52f6edbc7006afc0ed3f9cf10ae0bfe389310b3f995953f440a2bb43972db1155931a083482d8f0c85d68ebd6c2cc832d100971dad3526b8eeb0fd3d6c2961b7968ee4c6dd22b2f0f7e097be18fb5d2e035a740a47501261ba1cc2e2b500d25175e1d166da09e5914878b003f4339acb8c1063a31f2f80812dc416066cbf0b3e20f9307116e1f0985ced773533aca5d3a812bdf265019c62c182310885c925a039f77cad41d1d390f9be2fa9b2c69db406a3e256380705be3019615e5af3f1e738b1554ee0349599313b58a8acd2051c96a4a94114052c41ea2f4ef8ff78645619ba6eabf826a5950ecc7f4b3cf866a2f07e315400d37b4faa378d28533d491b8d111f6cf3c7ee52e7672d5886e912db401837d3bad46b48864592ecad788fbdb191d248f0aa13e813eb11e88b86a29d2567ea107c64073c608b1e19926bdf1a937ab5f41e356556df1e6b6a92807d69e4c7bdfccbb4ed7f1adc39049d5eaa1169490c7bd0af960117abb430a2a289fd0ac52620447403b6a70fadb87dcc95ff8913aa58e59ecccfad187f01554bc6faee89d4d8e0ddaa2726dd932028c09c849522860e815492392834483ef5588111eead79066ba101cca8edd4f991f65f19e04fb04738005b75e8df44f04c0c8e88381afb2b61ee5c0b3643dea8d4ca43d300e55a70c46f4cdfc8165c2a76c3bcbb7728e26cadd169fcd3094e3e84d7c7d43325e7ed20c6579a334b26763588407265629fc99f24b9d936a0622cc5eee39f660aba19b720c634704d847465c8436cc1b455b27111899cf0fac8a69ef76d7f1eb64b32221ed875877ece36cc2f89b2f66f4b43fb20900e2c50efe9057daec87c7c123338618e343e7f37aa615aef7e65121e4046c30050e6284f781a3317cb053d89cab1cde7468eda6b8fc94657af7c62d3bcf8f48054d5aa2b7a5b934a208332939b457b4a956896a3c1cd666d75e0f71a16430b777f4b7f22cd024723177cbea4cdb0a5b1da2b649dba5e6dfff83ef4f3abb22d6b3bc6cbd4155956b727232a81ca9ee0a55fc89f1955ddb6b1260e935a12a3508a2b20e9f658105b9281d393b3f80e2e3f36fb42f4e154071a3601d2376c92d18b50c8b5a2d12ec6109a5877d127e168ad34fe045b29a310f116b229187116d23fa0d8fa1d2c3bcf2e4ab648794eb5eb650ea59f2cd6cefd9070e97f029530430ccf16da45fddbd4a84c778e6e226b4e2b1c6e45fef16d3d0f87bec99a02f23b0b6169bfe4b3be8439f698e8bc6895706d123dd9e298d1025c46244d260c9f4e393ba94cd28e9bd4c5878da1e519f83816679d97ffc74cb18ce61404c75b56955bd265e83c8c1350ec0245f3843ccf11b71e9c38008a6dcc78d728363648597e86705b25c5ca06801779bd8cb821a6365ef593aa442e214ed37e043b7e803abfb4ca309cc865dc42c1962e8742646104288613e01a2c707418400fb7b404bf2e0d37f0c6661961b25a648c46783a31607709974a94235e7587a61b66ae4ac846475a53ec946fc486243235e0eb24c511c4584b22abc26c43d2eaf433e21f48ec6c8793f060666a4ed1751deea314aa7c7c4ed8b9755491ca1c37fb11eba554fe08c058505d2ec8b53210e1ea744814441a85e4d5e9c0e8ba99b350bea28c47c1bc7d41045ae4ab2adf56efc8e9295a1e9fb8866f1ea599d2a9290ae28f3034d684ec22e24533c45458c216db28282e06abde31351ec9afc6aa452e601b884eddaabc50e4a9a9426e423ba074829a9a0d28e8964ff2359acfe46508e99c3b4c3de4f81d5ed16ee89b1b5d8b0144fa83d4c3e8692a058d3ab639d2ab2497b19c1aa2c11c9759adaf61b0c52ef8bab47388302f7f6c678477d23d872029cbb7f470460dfbe5e9d0677dc5c3da359596285cec6ce0109d6b35a05a702084eca8bec734597f5a1be295efbceeca630b6af3a2d4d790a83683d58c1d4f128c3bfe0fe8d6f6005283dead907225bb0dba88bc9ff124f9c00fb2eae10d10414e6ff29e66a8da221790b8b4d21312549f10f6f46c8289b4628aad84e568fad21e0a7950a9e1ec75f1bf502680da1553f80189fc0d56ac7ddea82ae50a13517ec3b75467f15e702b890855e5fa55fbb9873c713594a206d5a2260fca74add26729fe12480b4eacc31c288f3ac9aca1c4ac4becc603dd5068756aa964ab81a0ba0d2f4c5e0149e0f4182d3c79fb2082431f6010bb5acda8b41998fc8e019dcad50aba1a9166a1b5d206e77ab49362eb673c6d00d27f9c65cf9eb5e1263d50d7f1382023a5b09726c6b8c983cab88cefa4490b82e809e87d32f12ece162e5f944f1b64b02f75a5d05843b251241fea6618e5f42262107d9ea54456e33086b4cc5a7269f44b27e4b809b67c105ca0e13ac7af73138f5c42998c4efa19befcca6b6bc64f684cf43cded400ad2fdd4ceb064e19e8863526e586e2da9270aaf340768c21e2a7ae0294aed4a352cac9429294b3dbf2535a95d801528845df116f8d835a4222635ebf88372bea507e0cc02a2d3a16867b64c1a4306e87bc0ab4d33e3cf4dd83adcd2a15764ecee1221c3a0cb4663a09a90ed53e2044fb3c3111d2c767e014edca50488115269de0ddaba2c8e5c041dc5b45a8a33eebc40db75a0f4609db6df2fe445d9c0598a926125fe9908e421f4b24abf6d1f089e61556bb572c082e588680961934baeaa4c97c4e83b5c8a0daa5fc520364e7dcb3083675330bd38d507da74000df6876b8fcfe4ae815b9906c79e6ee7aefe84976da9582277ef53a241f155d8eaae5e95b1d1c5a363a95f28e81ee27d7b656ee077fbe8d8c0b7a2f0b25604e7161431e0a625d054dbafe59d3fef6fc8c347d1d946f959b70186a2c80b6534306fcca4b70fd08d18d3e397a3e78a91f3334e65d33bcd88fd75e7b804ea1d241a8bc39bd28a8eeb96cef105b23a10f4fd670fdc2a2ea8496366a2af5471f85a29fa909b3c208756472955556fd404c9bff37cd656b705615d1aab6bcc0333190879186f8eed19be5b12e2527a763c0b3bca7f3211afa4add20d660d67dab8b6a69bdc377d90de4b6f7209a92673f52462c9267514206955bd1f0f8ebfec83f0b9cc41b9fe9cda81cf0b1652fa3c2aa145171d7de367971a794a7100e388f9944c662e54584380fffc243a787a84e85d155f7086b0f0c317db07d21681a82e25f400d1f44c99aca07c9eb19ca7d4ea7dd61cf3ac526e2d399483f7d3461335df1fc2a22e94dde6f9d8024afd0957dde955999df58cbeb4ba2da26eadb7c19ea464b6f2bc3f9d849fcfb250e42d2756c260276a8dd3402fa555351bb85d09e852d00804cd1860f3b3bca96769fe9cd527a9c505b768370b66427d31250919c1388b8220d6ed94885267dd42e8cde809da3e0bbd01caa17adb95213c62e34df07cb100056d54eff8fab232c25fa8e3bde04782795df7edc585eef396db37d1f3baf8a7fb0f3e651660a90765641ab1f1362465725b1aaabe6e643f9ab48c0ecbb05e91002e65ae2e33cc9ea9655a3180407c733842c9326de9da968f5948ef345c36a04c4c68d3da0aad83c8189507508656954414223c35d541fd0179dc66a7b6d200153de9d184ba31b72afe07f40bc0ed0ed01e44f15323a47c724a8cb36ec3817d208002845887126c761fb1f2dc22ded8c61d37ca2cf501cf6074f4b196b1dfc28b081ddd588ea2f2479b9593acb390a77785f39eb238bb0c70b8c7d8a14f095f5ec21574457d40e860c07f925f1a0293cc101d8fac9a58ded7c10b1fe517aa4cd17f9b960bf698015e35974429aacde3ad9dfeb0c4825a029c866a37bffeb9284b4475bc47c77bc99b8832d57defac3ffd1c4a18ab8b5a98d9bd3ba30725a1d9f23da6228ac82f067a1ab761a48caefc5b0e04a7f230a1fa58e1bd1a239387284d6981df8b8f9756d04515ee0a35c3e959c037d548047eda7278bef0b98ca1fd7cd5f861a9467a06d5b83b0b4f99a785d9ccde960b850dbfcba75d2de4cb5955d542ad25e3dd032068423f61ff086408e0faee155ca00a38e276d31f4d402a0cebe98f2a10d3d95c92c4f255b7f4f8aa060c7953c626cf12c26c60b363d2555e4f0d3c9b4d376c1a3f35ced71680bb720b96d52b4c7b531d11ee2b3d50ff0b31ba0478ec30de017e9e4bde5571d36131f0be7efc4826e6008b2d5a19ebf9c30b1fd59545d1c97dcb757e71c512c8a05ef1e32714306ab4302979daedc16be72ff5f93209195e95a634c42c57cb1377018aa020b41f9e70ab940041877891c916a95a359176ef705a6a29892665a1a80c4c8a874db6f8eb3854c9a37472e01c18df34148a1409815ae0a7488835024b08a0f4d00f8c2803bd0b9d100129ef68538a2d98700de603d1be11ea0a6aa0abd2de7f8253be6e8ec0ccd97b81f779dbf6a0126b24b044c88e6c964c45da8384e9752d738beb870a2e7902c85011286ab7d222eea73e505a387f0f788b27a1311026d4e064b3040880b5dd9d17d4d75085ba5268f7d0a0820215caabcbae91c280197598286eac2ad7549344621d638a27f640627dc408f4fdd7bed7be9fd7172fbdcc8b35fd17329b509bfa1456c10b40890787207e3c11c61da304f76ef51e5d4c40f68a8a8c2eb01932003778a0b63b05f5430bcbb4a141a922253b04176bb0e1c01f03934a913ebc1063eda07eae6dab94a0650beacab2e27f7610cdd4216deea56adce8104aa12c9f0670d5f3eaddac38f2226b8d8f8b698bb8f5b6c1947ec885794ff30abb65c5fd4fb34727ad2a5961a1dc15e4c67a0346ca1c15fa07522b852b7298c59ab67a3a01afb3e81524552e1d563c8847b5d6057fe8e8e5f0ca98bd8807cf9b38721606975bb7cdfeb2ac608572d53fba95de6bfacbbd0728fb9d0770f9e099d25d835691e37ea4d465f96d8ef61362c4ddb58213faa2afa42e85a2ce856fc16a644b436eb59b8eb87ea26a6926208c70ddd94b27e86615256a63bbd1aa5162634bbb2dd8152ed453a24716c36fd4fb669644e154dfb0d49643ee962884ba5fc388b0e21159f4da242e36ac98897653941a782ee565ea7953ac237df2064004d178850aced5cf8b5c304aa9deff9b6d176211fdf98b4152997d6480e027ba8d3c58f710b68eef923960f704dc95dd5e5c3746f1f42cd6cf56414b801500e145abb30d875c102c6e3558fb7cf0eeb88dab4c7ebb76287d9e4497fa6a3feed72fbc751bd1fde326524f9c229bf6aefe869c7af43c74ec1d7c7c3927dda100fd8c408f1227037c0d268ff31c2384731afa71068caa39163e62c915a5514b7bca19ba132b34b78cf4f8ce4d798c5720c593c83c84788f56181cc5fb28a7f2c7be0eed65b0090f0cbb00ba7f0219dbddc4a2ca0cefbb554bf5dff23623bd87420df4cd8cc3c62965b35186de4afd0318ab851c94c6428831d7f32e910f793c199faea8afe4c5b9f719a76c0a04858007436c7a01ac436e0b2a93d2249f00ba2b5ab4403fd59fb6a0b4f612c108e28f0425a822d100592364a03be18ca37460c5cfc20cbb4a11d477c344264bc1671bd39b2373b35421335c2a78a26915a67fe71dfac52d6c3fd500aee219bd3dcfdc5685580490d5520ce00308c472a2a2cb473297210a1d01a26c86b80ec072a8b802791f855ec22cb67362a9bfc049130767dc7404d1ec4f19c6875799db87e395f82aa6c50a304447dffe52e357c419238e43154675b5022f30df355238a6b02c04707d226cd999f1ed37b419813b396d20ae120e6cca58724b5b6080aec5d162a1efd275dba2ec495c998ef65e7a470517711fcbc5cd0036c434906b67ecb7920bfc0f8a49f4794032694454fe46abe1a649602aa00085ccabe860c62edd83822a0b808dd66fda0194c0afd642a6d531f5b5ca15a72a0c46b75696d43d035b23ca016f6f8fbb3f4b8c3d8ec3a793580afd748caeed32071a0d32e7090d6bad68b4c2ac7c5507572ab2d72e10ae34a4a74b766927016b9fa45a24f9f5182cf65f5c5cc2d3937810e83405056195817cf3fb7a8efa7231e9d4a821b35443baae10f2307201dcf36081c1f92ed7656051d55153574514b401b2088e635b5b8b724c58cf27d1a90dbbf83bd0445f3675d89de1f92a51b144ce2962496b3c9d24a7b0f0678aa8699c2140ab75730dfe74f0a2180119438777271dbf97e25950905c09767cc6f0465236ff2ba22294043ed0acb970679dec3eca94d8d01071b2bdc460e2c8020146cbcb55faffaff2e51d0d291ff99716239e4d70c0ab273e53d88a3ecc3a076d438f799e2fd0117f4086e63e251c54096591a1903a9d2713ec8f34d652eaf086e06cff07986bd87adecba1b32e4981c7eed9076da42fb0a7bfa73b5e4cc65c63aef02c567d8251f1bad6614a069258907d8c9470240d0ca7811cb270411fe99760a5fde9b128347a6deb0e6a241f8aaa90bd45df19da7158ee2d25cb2f5016a62df338af0e981b85c0eef71a85d6b73d951965544d082619579eafa963fd4cef3e67ab02cc57ab9e5204494975166859c77efd058d825f18f5133cb5f0c1700fe388680f36b51201c4bae4896d6c8ee237f2eec6e43d08d8967337971a551d8dfa2e373794ed42676069eead2bbf03adb81381e8af6b36a619f2e21bfeca9693051e231c335e120733f9836fe8cdec42eadad24754022e04e87840e9a651a89ffc8575a5911823eb3a78d50229e3eaff7b7d45f4f525739a5d5fa1d088fc027404e606d069c6a88e18aff3cf859e02aa8c02624dc5fb96d560824034c652f30fdd11f2a6aff1999fe46fd0b03480e25e7213bd0e01b66d947d79f8c4fd1e38cd41bb013d2e2111e31e28c3beceb2037268b1ed681957b3dce75807f2e9524470f72ec4ca98a3905f2af272e0b07843bd650bf06f11599261f1ec619b858246302cc4aaad718fa9a6e97f7f2885e48dc251a1b0518bef347edf079a9a7984ee7fbf4331c0ebb1da80942e7ae2833bc790b52dda7927fd05d5e213d80c60eabc6bf65a0192c2a566009ce332034bd212b1ed378c1fc3f2cd32c3c841d7a38fdcf3464030775ec6ab9260fbd8b6ae609cd828a140e0b98a1b2f248f6ae6b6722dbe891b2655b2ca68b80d4140c7fcd0e910d213a2556c1da51c4a7ac3b0641048b51006c2385d78ea44ac815ce069c730be2053a272f5f6360fca1274e0da8a8939dd6824faea95ab4c9f60742097ee32968148cf2899e7a681ec7c30b200e701ad3d054343483e0e65700eaa7a91fe44d06d2d955d48564d78893d2d9d28aa3d3d0d0d7ed2c5454be9537050931a14036962892762a838d4ec5dd7da5dd41590fe84b9bf60f7e2421d1bbaa5e3b48e1f290ffff46f1850af51bad93e7e65b3e0b8485b7cb0292f1f99c9bd20e82ee8bd54a80d2ba2f3e88c398d53141a55c6ba028525f99355560a970b0cf0815734699c1d48ed9c3b361062e3ed4d424f6802d7c7ef8629f2612563bec54213bbb8296808c133855ac7816e0e42b05df6cffcf3b4f4fa7430b875340d60d51c9ed33adaa097abd744028a331e861b17c1a134b7ec3beeadea4344e517184b8ca72788da2f9ea5c52f9c9cd038cdee507753f13c7416e4b84318588e481c634f212dc27654d6d4a3b7df22e5c7bb5683ecb812abd7056c8f57e0e3d59dad44909d54ddbae456c11bb1ec78678f576472f761ede6b512ed53d4c29bab88e145499184159180bd3f015374ec24ec8903ed8e9c96fe398542e256e9668481790c4fd58004ad539a52a7aba2e962661409bd4a809db7757e2fe9154148c71af5cfa8a5b5a6087d63d2d7ffb308a07d73374cab1d799c0ccc403d6566b62c64b1825af2d661e90c2d75ee1ffea5084eb954d7ce3bf20eb9503d59afcf779f957ad2245832185846225857f7b75789cca8ba0034abf8a8af3b8c45070698c8373ab9063243137c3295353a07b1f7e6d08ebe34ab0600035a28cf2529433ff06d8acbda4d0ad7d33c9e463383ff357f09d39ddefd23ec6190955777012029e466c03db2736a697e44cd9de1c46df1cfc3303254e1a34b64d3c76ff6d80009c771b80e519c339ecd5c5520b36816e80130b4cd23ecfb18b0c15366f9e40e5aae4e3ea9effbbeaf33f3dc0d16f594f6f126d37de6e95a33404e74ab8f1807c2e2860ff36f19e47965a21f22cf79b6bd3a0544077d7f892773b92a29dc686a3ca5acaa4ebbf78e780ea1fa464fcc7a28e0bb9777b72ea95de11fa5ab736e45410c2adea685573abf0e2c3af3bcb65df0038e55c61ba6590bf707a5298c8cc9ef2a139b437c2344870d8f079260058c2b103d47d408a50683632d3e568bcb907278990cb21097596ad011324c06d5396492d1af0459409f2558f44bf060c1e1d455cc03a78c24b3bfe13667e75ad07822bb6daf1e427eeecb80a0c87310a1a053e62d091f31714dbc5f727212d1544fe46227c0764281321cb5ab3a2e76c157a8403bdff841e3fce55df2a0be63ae59a8d957421f650180d8d58031c5d131517e7743472a3b0c7713dbdc4035d330d4a11d1cc9401da6e93d3e57ec93f542d720aaf09cd90666191ad874d9ac381cebaff0b0c16fe50d3595e74d36c010f2b2928c51e3889c6e3e860c8fc9ef447bae031a83f422213dfbd859dd5b091b5f4bda85eed0bf677cea477a258f382a83a99ddbdddb08f700dd2962e35ec993a6c70eb5acb703c718460c09eaef7a16fb412ad8ae6a11fc8c04ed51443e8275bfe9f0b06bb009ad12250427543b988bbe5d215b03bea09e19d7b548c5c6709bf3764a14bd183168e208a1886a1a77f194ecec95072cf8b131368fc29e92d14b13468c332abf4a9e38be43e65728ee5e956f7b180230c2ba3b8370d3e07f0bd5507bec2cc111c92a2391068a5efebe162c049e9880cb761f50ec32c3c6907b4a494fc5dc64ed9fe43490b410d9ad7f31ffae2b2093889ecdb46b9a347de34d5331b2823081146e2f8d0db2cead6aec667032272cd4338afc00e4f390570db8b8cdbf7fc6baffe39b0d7ab390363b5a119fc9d844942be14da6ad85328a04d917845974cf83b55d0d0a39408149dcad7b3023bf4d5d72725da35a5614c7a9de131ad769e21bbc6b97806a47090273d33aaf7d2630d493d1d44af5409940d88b5d2820eb1f39d81f885f2b1cc936f6d03027f3028ca00de6839e0650566e24a7517faa048019b6c315404b616d86117179871c4f596ba02561dce55882bfc4e44a99517fd02910d7b445e257aa2c19c1c8ff37a6b51caad7aecb09fa83f7e06c7fb7d474aeb4acd2932f0c77b71e90270738f6d5322b7e3209b4291ae9114fd94076613b403f17166eb644fe3c5601aedd27b492ec57c023fd9d530a373cd8ee979ce4011a8756c2a08507758adf0162022de26116e3c01213ab203a50f6f788cfe6a7620c5be6ad45d9d5ac066c8193458e2bb34a123ac0fde420082f084dce791f23ee131ff1f19836ffb6d9969d11c302c0b51a5774472a2576469eb4008ed5480228c81f3e010b5fb00dd266c627e52bd40642693488c8cfc32a6cd2930f13f1959abe20cabbc0f06fa52f2697c164b32c0ffb6ffc38618917f28458b1b9f4e06c9af6f4365f4c19ea2671c18e607cba041cca86e69e46e5d232364d41112d9d89b3808776504eb42acf7026e36e015ca933cf472ae2a42e7fc7c5b82ab494f6a62b8548ec177a5b4338ebe4857f6ce8e52b755feb60a5b289a70fd5f63bd020add4d1aba33a56a65b7358425c3a14398e9c7d0c386eb6dbfd975060a3e8fc801137f37927cde1bb60ba5d51796184b3cc4ade3384e45ec42a089ee92a5a87570efbb455880932f98d6241f719005e8bdcd7592e27e959928228b28270dd3aaf2f5cf88c5d09631ffbd7c68573a809a26ecb6dea9cd1bfe18820d96fe34df0e2832eacbb800318ec1f17b484f3e5d1596083a6c0f0516f10301bda34747c5f4e5f102fcc50f004640ed4b5868b65d3d5074d75d47116303ae074d1ff6713f677ea4fdfb57b1df2524edefc97c3aff2dfab9925674e03c60d0d1b16f59d569536a7167b7b7ae6f82bee430c7355f07c9bbfa70344853e0c75162f75c3b24d84e55dcc78eb2f0b3baeb6a02b7ba715509680901c105b72957ec17be5e60926f5770cb0268114ee4d67d4a41a248b22c2e84962f4644e96c837176b8afacce9d40211356dd9f7e0a82831c229ca665ad4c37ff636ecf18c011d20acaf8458a9a958cc25919c8b4a9b2137c2e3032ee30408cda09a4b13892af8eba5698ffecba6365eb6de9d8379823cdfaecb54c1670427b98e3773216c1dc11dbe04faa7e1c71a153ee6f72930caabe3e43bd398b7ac3052ada62345854caa30f27ff31d49ff5770d8567071922f812731a8512a696a1b40a3039188cdc88ac00d3a99b47bdc6104882456ae061b508ea4a62519aad5aaa51b653743a6294ade4fec38f43874d6bc1c75db6046308ac20ec1f721430b509fba26b1ab49957c76b990ae8baf12eed5e3bd7e448c2cb74ed7bbbe9337b971e74309863711ff257b6a3346b48f6bbea9cb86adc80895ed34e4f8f0ef621dde0d01c2cfc009ac3ac2d525010b53a0441001058c98599a8925ba159813995851515a345a608480300000060996666b68438153db32cb422b2a80100b4a8016823c84d967b1cd020cd1dff3d30559b3121f28f19235c37cb5a29654a01c702ae02cc025438c440b625b3d4fa2bf814ffe238a6a1fab007c3108c761a690e0eda69ac9976477b1bb23f70a86b8f723c0bb85f433157a4cc8e154a0783ec850c989190a029ab119b6f31a0621f504350f36e2c623b6175d90bd44d457d8a5ffdb8d89adbdabd3a7b00baeea83b4c4fb2b3a72fec06ea2c2cb46663c09c4ccae60a4875705bd32615d29012a1d4943c257363fb94c5b033a86758ba5004354f332349a0ee393c4ac976b181345849acb0cef076b0da33a9946d6a845632c21445d5eddacab6a03e1172b6b12b7b83daae46afb6b041386a63dd53741432b29e958cee4667e56d713de50bac73299ef5a8b96c23bb1b675550f7360eea3bfba3e6d971eab841419dc6ec90556a3a3ad7266a881dac5a7b0dc76e8f6c2e66629ba8793a5c877234ced59140575b6af3bc0eeafe9274f1c5c25661732e07a0be6d10358febcd5e675d2ab3ef1126555fe95e6af6da04751d64cf35b643c5d8559d6daae7212d593dede1462d43cbe6306c335bb9bdfa10b5883ae49daa61779c27fbf59aaab3a3ec0b6a621d663b4bec355b8bc103359f5182a9ca16a026ea54fe0443cd2a2667772db90239951fa768cf08897279bba8e23a49ce548250549d46813acda6da06d4c13acc1e515bf51638eec5cf3a558fcd638cd9c53aa42ff98baed5a0ee2daa3601f50a14b6af96a096f3c4e4e013360f0b82cae574ba0dd77e2351d3b07f3998f58cd4886867ca784ea0444f3b30b9b53b8466055500742cec397b867d072ca0be45aaa6b2ec7e4601a7aaa53a0d98bb79e87808d45836efb27b0ed460f20efd04a1a172bd38ec3e7e05f7debb147655bc1910b00787af782472e0a90041e47af14e6e030ff9219623722291e31d7147f6373ec7de75fd23b1c876678d3b9aead08fa63a1841b0236a01daa0fcec4c52643b9167b7ab66d23d23e98a95a875c1926a5dac1fc74610b5b86bc50ab5b1dcf375749f752e5d1a39a802244dee2e7579b68c20dcdb1947cbf4aad27abb7a9baa7f699a5b20cd7541febae39366685640ec549c612ac8bb6e8ab7f96d3b47b55e5e1e484bc5756651f5214d5f487337c82fed98cc90ade8a438cd5290535da63796ed1ca2f5785e2db468e575a4eac79ac890e62af117e451107f3b509a99aac5bb41fd0d4a09c81d4ac8ac53c327dd7cc9f61f7976fe3919fbc78fec8fffe0f903f68061f8e4ebc3c5f883ff0f36122d84fc15cad06988bdc87901501ea891072ff24f967f57679bcfce4d8b9d247182a26ba885b6e7e9ece7713f04bd7c9fdf50a88f30e6e8e0e808c1d11182a323445c3c12ffcb01770e8e78088b803fc7ebe18e9e081f7fe15e4f1ec62fb0078b10018e833d6051e8130a3742d0208608177fef0751fefc36a9e31fbdd879704304e1db391c7b808d84dc481bc5c35f7fe1e1effde8ef558f471c43fce3ef97808b2f7c9b88c5fc3c464032f9fac712330d93ae99ce24eb1f4bd410a5fe019fdf26402638ff588c97c2fee3f1efedc1b188235cecf0db7b271ebb872cf4742a011e99fc72506417a7ef8942d27b269fb193ee093bb94f67d68945794a6d0c018d4628e3d3b9e41c3a879a42273358453c726a0bb126f6b054145f53c9d9e349896730e291539b49e64bf7145302373ebf973f580f241e3ebf9d50ddb9f4063fbf9d434e1e27cbed4cf6e08267be6657132bdf4daa500908e2f3bbc9136cb2dc4d9358d84c0e3fbf99746762df033c03637ddeccfaf904e0f39b99f5a35f465c16c8eb7e998672bb4e742c5d574694585c1e15ef8a86f15cc4afa70b6f762f59d03137b2fec1cfef65d4f7f0f9bd444162f8e59b597f7e33adbf17f9024c219ecf6f26cb3ffe98cfcfefa5dd3f0e97735ff8f9bde4ae80bd9f74f1fb165320de48965fe2463e7f87b107adff49d83f8f6f284bf21ed9ca8a3fbf47ae1e27c4740c9d6234d227716ca4519c5c25636455d434b16c7488f4ee60ca9e907db2ece1818f71421a5d398102d6841358e9137b0205e932db838ae6318351ee0a309a7dfebea231a25529be688a945ed4681947839470b487246a53129549028b9fdf3d753d6751c0f780201f1637f84f04fe3f38890f4ee267340243188dc5df4384888b7047c7eb7baf788461f87d455a8528177dc5d8e3059f889708530979cca563f9efed43b5a1e3d7d0f1df5edca1771ad878568515f87c02863de0789b55c1051ee5415605165c80a118ffae41c7e7378edb873fbf71d6feb1e37b1a65fff8210256b3e5749d77a0e633260fc36845bab5f14e2df310ce5305074997d4cd476df3cdd9360c8eeb09cb3345f998a6196d4a2f7fbc12c7375fb037d0b9eb463927d905bd45d13c8ad88a2e1959fe9e9ada20dd2465909cce8b180f658302675392c5eb899bd3b833576bc7e0b97d9e756d450e0aaf3234c7f1506768a4ca3c55c3a4aa09f1d43922b5998dcc937c6d69cdb595dad38b143eaac8e74467b91a2b0bdda471ce6e3423c81a56b679c9ccd7c9f0382ee6eb95b6eacf54881dbdf8cc3c37739b8b979a31a14966925a5ddfe66642432d3bc378313b59d023527ea89e579040ea806672b060ba644e62c890c8dcc9c0f9a6edec6286170c9f861da39a974e564a53a1ad1d3f276317932214b34491172537a7a4cd2d63655e1edbc2ae8a6652bdcf521651568f0fa3295981c234e73c1891393affb33637cb6811307fb235cfb8d680f22e9866db683692a6d8d0b4dcbd3c8f5e901ea6ce23db66a2b3192accb3e0f2715877d448d30c339d517e5c708a5e7cd605ea6bb828672522d06e7e2202df3cd6d65b696717af59aae595ae5e5b9d819ae62024a3202fb423360382b7e2a52dce9316e44cd2c57bf333b64dda59c42b46cb3bafc92a485ed3bc86343f833cd20e77662e5af14b16a7476341ce3eddf9ea6d674b27b5beeae5536831afb34d754593ef419ab9825876ae66e6b215cfb6e2045b41aae87aadb7592a3ed857c39694541acf8a6b51875dc781d961353e3fb7f82c967bc48ede0b4a9c303a64cf8ec95559a54577f3b491c87ef049efce9714aff9a62a3ea7a5b44a899ac509c342b745c9fa2a6c0a530cb65969f07029e1e484de58a852b8e7c916cc6a859424847304807bdc977f672e98744b6d5c64564eaea5c9a8e53991c9493240b0c1d35b0eaebd30174802773b7772337263765dca709542aa6371c078a6ef409484b547646872480620015b6a55f1a6bea6701b6aef51de34992673816849213d984b76774d4a86e545c590eee01930370d9e967cf99e367fc12d0c26155c1d2ccad7dd06d36b9c8ab713269c0fe423b22f1f718168dc1705167321745865d4189e32c74e56afb692941c347a4773bf33aad88434b8ec9a6b2323695ac9745bd59127221653a5180d9899e8f1f26df5606c6cb4f49f90b7918fcc7dbd2223a2da2678409d5491c918171992ab2ccbcc29f5e6c459f9dd463370b08cfe2aa27e013ebf8bf08ae88e6fef3f7804875fd883c3233ab2c4715862062dfa8d21832099545dcb96c7ceca421b32c6c396693a4134aa5a1a70ef8d8986368854bc203201002055a36c47868ab6cc415b2e5dc5a1a889109dc4442b5a22e4706ea8050117832a8a64a6945655b5a66585915d73922127f4415ce451c07b086b83839f100a211fb17b28e916a2c231b7fa645f318e637a2b8e83337690a288e17a7391c352750b495fa0595953352d4ebaf0e7b7104fa7af6e2094fb8766c687360f5741ae61508cb662926f202a6d0554f43f7c7e03e170abe82cffbfd7bf2f09c51488c7df4ff21f7ffd6d41c8ffb117611a8b087bfcde8ff8b3fd19e47f03001b1f3ef5dfe0db10d1ff909be8c52e02fe1b37f83e374143cffe1b86bf17dfa2076e82861ef267e8e06f9450ecbdd8a742fef2179a06421231018ab870d05011250d3d6145617972a1255834b7a00c1a9af522001afa237e7efb24b1c0aad46e299d534ad94a80540f469086cd335dffc8b1018a05a894895d76992998045014b319000003201c48721c86514814d10314800432ba4c5c543c44948c201286826150180c04040261000000008401804010100e85c2b1b990ee03c2817c31ce6825660ec688091fc0e3c9e6a86584e2f0e01ad0c31738fad419e1278f954b2c88c61cad542eb686b24b815a55b11098461082ce2040104b916820eddcee1f734c5f6e04acb792c1a3fd619f8cfbb7d28774032a4d3141d251c101aac70fc61e81e7df15668412021c0d2788fbe877f439a9dfe3948a160670d234c37154393c879eb5cc757183ebbb2c30db4c2d9bedd09fe4909d8a34b8df2ba821ebadf95348ddb7d954bc2861b1b5ba1a3b1cc40c6abc3357b4055a1e4316932a1671e382300fe71826960b42c08386d2892058490a7b7a2788394de48789dd22d9c995a6ef58c8e8690cb193c6dda3c88a4a1f005335cd6150941298f3e4e64a20c08eb447eb658ec1fbb98b0da8ca7fab496b25a9c633cfc61dd5f12b4ea9d70ff8920935f41272fc02404f44367e59d5cdc97af750ccab3fcfb6d63593fd9b56190c0630c0270920d5b3cd4df4b2fec4e68daaeb6b41a69b1fbdc066c19de53e3217938c61a09caa825e3d255289927872ae985806647853d596210eaf6a8d646986fbcc7dacc171318b925a2d6458b9ceed3cf26b37da35b00ceb597d8e9dbd6c6b386ad360f94248acaa8c1b7a69f8866c0b84aeb71fd9bd065b9a56c81a6be902417a2886fef4e16e7d0333fca6d3e47c7c35154a18d391c319d24cbf5ca96a3ce3d5d5d2eff8826d23e737afea3714696e5eeb1e0d65163fc9950a5318b7d00de11b50fb717d0f6b2c95ec5167e10b5afc245b782d2da696ae6cf746dd82211a5f403fbe068ae30d7a785d4a6debf4e77ae57667841a510775c41399629279c05cb05a0bd1dc3354ff1635342a028a7de030173387103b7f9ff416880d47f0de9bb08ed2412d301979143ce1cf2f3db44761e036b8f7bc18ee1e0598e3e32477803e700111e2a3f84325d86309d64de9565737035f8b7b67491136b9bc51c4ee3da86f445c947a46d094a19821e15b2a921137ed3df4add0a6c4292d1d817a10d131d0926e0788fa4fafd199d6a5621d26388bea719bf6f55d3ec943e740632abf7a24edeffc69306e866c8fee66f2c436535d1c145a8e5b05f52d2b260beb9e8f3139b2bfb8783eadeef9a5e48e4c9effc3a1c6204e329f8c3a3e67d1f8981e4b9140197e4a372be819ace7f4932d6cd81674d19ecbf3755e0124dc968ab3bb30d616e933b33c87942a3a725e5edf481475b7fd069a479bc1e3dfb583317f0dd3ffa73d96bea4d6155f7eebff2bb9fadbcb1fc0e7afa9e5f140286c41159a700b4fb948f011d6b0dcf00b6b5f3daa8424f85b3326c84ee8e61053ee95e0fa680deb3e24c1114f66977440d490a17118a11896ad0b5445b7bb1efb99047fa688f107efe469124cd8a58a14d96458a460c222d2eab5432bb1bc2c2bcc4a6c055322c997eb0aecf0f53189484c1289fef8b43904ae2cb5704737fff84955626c4615c4799ccc05fff761414b24abb442fe13eb1f047350e9744e41439b587db6323f57105053e92f5f3cce973950418c4b00e33ae7177e8144d143367a322a06dd395540a31a7f944279bb44e0eb4741df2ae36d93584e954090e8ec4b16e07cce434473cc5476c9fd2a9bfcd5566b46a6e2413e12a9f0b4cd2e1aa61a2ac19b8d6381f2811f998b0663f633b66f5ac883d784aba823587536769f7fbbb141d03871ddd7ca37e99760ed245be2cff85a5b602c4acf1504d17ada740da15107d4a5369ea15692aedf396704acb3148991d76c45629d9ed989f336efbd03ed361280249545f336433583f43552ff3b38f4e2a6743f05dc68e682531a13ad86985741b7e632edc489fa82bc0dbeef4e10cf5c98313c9266ac71c2127420d8911234421eb4b880502a6338fefad8df202e47e8b4b0258ecdb0975a1cf9c9b065b31384012bc7d75f7fa349408b28591b20b8e3c5cd0add60382a12aef7b5fcf90e1d6612eead2ba8b9271861be3e4dd16f956c036819dbcea46d462e11bad826effc220ef225a52b7cca4c2603886376b63c60406379460c11fbf49b6c56194b0407bf2d11dc65f4c8a7d60bf9f287aba75121c70832095b9eb01cb5ea9a687590185ed6b7c4d8a99656be5f7068428f92618f1488c11911489f1e976b3c96847885d082069b10231ff97d84d31c47ce85a87161bf2b12b4784ddce297ffda65f3e2b6d034488c484e9796bd201cc4da309dec1301916c6cd953f9f232f37bfc58a5b4a4ea0b6c6dec596923e820c7760f69df724c89fa09e40c7d3ed3950035d591ea8116154533ce0db7aef25317f2baa539ec377fbb7555d59bf71b569569b1b581bec7da442c5e0b4d629f9fce0478bdc40237d457c36663d9d9c3a6f60d9b80c0b7fed3a6464c03376fe36d3946e811faa1eefaea5f4e287ddca5f07b9dee2b049772e00611207630f2aceb63472289538d6bc268f54cc1d1d6a927472902f601050bc489096d13b964f224e18ec600f5412496c6344e60427ad5ab343a7a2bdc8191ea6c2adca3ed6d432b0d0d638448ee794d05cd2c9d91a2541759275a9d988268b229a3c0bc48cd4750b245b16d000c8cb9c877b73c79c91da26e7920b16b8e0dd0b43a58e1605ec4a64b28d9c410912417044bf3b6c3c90ad7f076b0acf56c313310ba08d456358110d4b7f305192e44182d93ba68e4229adddf3149f823682913830c155e08e011340f9231c02f54a5bfe2028d493c8239227521d94e28dc57345dcd096fc1fdf68b982017fa4b188c6c4e637252bb74d79280a1b97d947c06c0fea239bdbe41c85c84a612e1862747a5ece48e707c16688ffdf660c90edcd336d6b1e57636e4a14631056404da0b6904e117aa1256dbce2ea6375f244d5e77b0fb589334dc8b8356b4cfe4ec707bf36cc03e3370ddb333d14a66cac34ecd1e8e49697467077c28f60aa9022a8758428c1f4006c86e7dff622c40e3ba53e9c7c2efa8da74a2c7ced1bc6e85857107c3544ecbd4c55c9e57c3241f81236a059d7c3eef737788ab116567398af47211050b4b04e40646dbd3099824f309faff2ff095c4c4d5af00a617599cc7fc1e21fc856785dfab9162feb535e06393810c2cbf3e4faeb2db481f09bc54bf5bb392c8ba0988e4e377ca3642141ec4fed997eca94d0448c599595626abed054b9d3c5c65b6ae6ebf47ee7f7c7f1eabeb3004ddd318aef21114f46c6d02d3f98145cb42d1b78a5320285c0edf62cae572775d050ddfbfa4bbac92e1ae7fae53eb6802f813cff50c0435d0b7d25a0d9d3438574a564334589c5a523ff524a670e6aa70ea8e6aa9ed94e1f72e1977d4223b3f329526fceccd942998b575930a2ec9aea4eb5fb63984d964067cf236a458e6ea952ab547978bbc8f8012deef6640c035c8647d8c6c0062bdd840d3b99cb85267989c06da7065957a9fbd55ed8cddc88087a739c7d255add77fc023cf8faa44b9543dfd3d08bc1494d947e4e300dcd0501b3f552d85963c83879ada345c86bd7b3ef339446b9c255541014ab38d2cd0d7254a380cb2506fc31fe8d39b30b69c036debfe1a18c46b70978423bdc415536d0446679c470f40c6455eea049e3075d478c3483e71c2620f8131e2325e41fa6b2f8d44178e1702be22d9072c1b31a10b0c011dd8a56df9ce197027d705a11d4226d9c571c031fde8929b470b8090d1175337ed9d080a27db53d2a343d52dee0e50cc6fd7327245672280733938b11338bc531f02b1619a487a71a31ba0590449e6b000d8deb1749ad7246e953b978faf04ebb96582fd20c7e42734c8b2d121c4118d0aaf4d0222aa1e1a2b3f8d18d87862147f0b8332b6e034dceb66eb6817ab5ebfd5ee2335c30aadc0ca2eabf03678841d0cdea6901ca6d66ef44dfb24c82423c0cf769322c2145a554fda619ed6bc8203f90e9540897fc6905407d05f5a589a3bf0a848802b4a9cddc96ad1afc2d5f039c501b0ea64b25117db8926a03156640b1557a57daa2cdd2c26bd456b1c33b0e99319cd7aeb535a5f5ccd9a43ac6a31ea20dcc90f140ad5375fca4cc39ed0d6ef12d894140d99f6380ef01e2f237adabe544136cb244b8b2d1364f41ef61798cc3eb870b1311f1db966684f8c5315ed4e78169e6d8a28132d373f97b622a170b8a76df533eaeb5fb87730315fd008905e57e0d58b1c3e21f19967d45fd7925919688e910de589d50797a35a96773bb8f479b931d49f41b21cea9ed02508fe000c51b836676e2200bbc34d388cb43000916da90c81a429d56a0a8169272cc357b3932dd4d559b034c33dd6a7deea205ab33e3b238a16cd115e8995b7b366bd7c166c8e5089edc0acb58cecd728406778686781639c805defc796f2c12f9dd08650b0db7beea371888b973509fba2ebc93dc79f1c138d09503352c56efffca3d9a95ad4b9931963a26dd5e29f72840e3539501243fdf4cefc2823483ced29f6ffecb49a9f9cf8741bb94fde083be04beb47555112274bfda5286e68b85ad58a21cad2d853f77e455cf5de7c16b2ab0d053c9de6625629dfdcccc4b2023b47caf694d1ed9f72a98cf8276d3e0b0898f47ecfe0be02583b8e5dce3867980f7511dfb84ae2b0876b110e976e281e7e56491c78b8fde8b9f8db2a5f0c73d734d50285accc85c8995c9782e1abb59616958e56f252340ce06276b1a265baa142219fc6085ce4e7cc086d219223e079e0e252141e5eac150598cb922a82d8577d4a38c84af92f19adf1e8ccf6b24a542fdda876264fab8b55b92756dd28c91482dd6f550eeaabedb190d37a54fa20107eb737ae9421a3da2cfb092823e03a1171639a6b59368a6a6a2223d74adc88712913ad1fe81d97884ee2449f0dd88b439c33b4cf1517b8c655dead9a95bc178fdaa59c6d745a98b8231977e33bb67b63dc131ded58aa28e4f67c82f1671c638b752c6f8cab24abe77cb024404e0985ce79d10670a15954d8378b7c8ed2259a12bd95616bcb934ec89b888f2e263021917a8ade37d821888de90e28b79511e311367fcae90a0d4b6a24b3a1583205f9057dafa41450726a7ca9234ed28b126a525fc832f1bd5768c99a6691cb563e6cba23c49fb37f77b874c71fd8b9fc5c27dda1d1c9eba4afcf51e896d011ff912ad7c5bda483dfd5f9e49b0e7fa001290db205ce1bfda0e2ace96fd63e3fbf06526b40a8311400c7ce3bbc1d35bee3cf732ef583827304c6cea20e4247ed4c76bc3b6747ab68a1b7028ff4bc567d0396fcc90cf8a1cfe3abae13f49e41fbdfc099e651e8bc1d9421f488d4e68e16c101c71dc7ebe7fd7f107ddec0d179f4a819b43f4af876fb4775fd27d81c20d1262020740778395f21bd33fd8e3fca19ee0fdacf3d503b5674ec2f4b07903be3ffd999a27de0b58ed0f633cc5be850bf23c4d69910bc77b4b0c83a1b6f4d0f7d65065da37d82656d5f6fd37652bddf9937d8db7b86d70795e70b101d4e9d75a7f41d7fac33c43fe83eaf7076e474d67707089c33fb76758264e7e1fdeff27cfd860e7cc7dd415c9f0c15abd37b431262d87ac4445d76f58250a6f3ee2c3b0d1d7b87ae238ff620eddc74141d303ae2e9fc66ce7b8310f7fc2af0289ce130e8283b9ee800aacedf2f6b1dc3ad925935f20e1e949367e26d0e2fa8b382f388728e3a875e5940e5759d12491d282efb6774b49db07602e9b3df9f7ae7b77adee283f0e70a823a359d699d97ceb38eb253da4ea07d5618fc3e9dad9fac0e20e1d9fde20ebeb377b6da09043a6b1bfc09cfd15f40939f660790e0ac3dfc6e492648da327d4279921922f7b6fd41a7a7d35864b9044bc3400e190854be5a506b2721ecfc8841b0243ac2530663a2290491f6ee033a1ddfb9c7fb0c002c757cd3738081b6e13c9305bf3be7523e487a2e00adc3cb4e20fd4c0f089dbaa3a763ef00bdb46832c3434673efea07bb110424c09ef5f74827a83aff41ec784a122826272f70e641b0853b54d765c2e13987d0482c48073a72b18e7b2433883008c8daa020244fb460abfd3a7482bae73c9f41cd597b01a15c11acf05d23ae3c5d676488cc418825328c89bad0dbbe93dc73d63c384918ca0fcef90619c5b191075d90672380efe4fcf80f72cf0f7d40f2ac0804ea9e554861073ff4b3f9a09ff25c804427171ddfed5cfb699db763cdceefe5ecc407e59e1718eba875e69dcfced9597742db11bacf31fed6f12b74acdf6f4e14372e43dd88bf4de777fcfc0ae44238430c7ccfb3ba3fc89ec1f901d167bda1c7ce79d40f92cf4548d3a93b1b3a161d7a1d9176023de7cd5778e7f7757ed80759e70a6e3a3374ff473a9dd3f97d9f035fe86821b6c12addb3ae1f249f8b41d01d0ca867b83e483f3fffb9e0a40ce7e312df27009ab2245268503a8530c3eece72878d64fa19b7a78881c80221497904d28264356eeff9cc4e4c9d707684d69f1954af03087cd6168e0c9f07fa8a66e164439a3040edf7a80e25eee2baa34e37bdc2b33be20e4365d67bdf0702e18b7369a09fe01c01a5a3521d61ccb34082224591d0d9041162e0d6fcdb23fc76ce0b3fe95074ac42030a7fe1842dce0540a031feea4c75e0744e9def7400a967bd8210f25cca07149ca397974e9073c6a03ab490d8a18f190ef6bc6e4d93a59c0fdaea2f96842c47fdf14240ea3ea33258ea1a26958118d336eb56e221c903842740d2650e8abca351fd3e88daa56277e6e9fdd9656a85f4446948aa65f71546cea5f7a754004f64c45a37066b8a929d19997bd2294386507b8cb17386024358b942d0b20794e9a573200853957c575a6c3e130d3048479e2cd5db7221322643cd4d3aecece746dc2f7cac1634482c87f6b770e120f26626a9c67438039337c3a7b64e6ac1008e9dc240a20c6d237a2ec139108428f99be1ef5e1c074c6294658ab39cd788a959a3eec6b71702d8fe46c781ac364ddd6a5e092df7db83c33a966765dc6d05e53c00b3804c5f2c472c8159ae4e1ab49d2b0dc52d65c9333cb94e736913e1723c8732a45f82412dd25f882399d38471488e45d9b681cdad5811cf8402e072455659a9ffe94e92aca773531d080458e85c0739419ce1e129f8062a04611677156c3097ccb5d6912dfe2df35e6a41bdb2cbd1d182d8aa609d53a9ccd3224573b9812a8463096a41d6b2209075bd589a83ee78d4ae12ab4295fb8d36fd2379a7b68ab90c85026ad475615f40125a4d07926d422dcf43dc484799044a99eb108cb557339bedbfb77c5f1495777c9ddc827c7e57b762a0b9629d226154affb5f0b109143ed1bfbb991453a6b13166172e09f95017c18940f7b09f1f1dd2410635b6fb2f7965b4a999294017906b205f005b3c57dff4ac42ace6543487e70c48dd37fda59a64fa03ca11fdcbe1f53732e9d90fb80cfb2e5a6cbd2177b84fb49eb943c5b9f65563f2dac648d252cbfcc305bfdc2d32d95e8d5306bfa57a20764d6f4bfcc306fbc1f2f3c7de395ddaac17bc17475dfefd1305ddef77b42bc193c1778413c1e0fc87485df6f4b9781e271af05d375bfdf9361ba76bc1f9e0f2f06af9cae94a50a883d09a4578e108b4102eb499527eb05b0c61d3b7a3c09acef11830499577dff67afcbcb4fb0460a21a05bf2e9531001ce29808f42f1e04c47776fe74ef553a2b54d9bfe18d13a316dfa61446be545b438b046a27d62da40316dfa43d146316dfa51a23d9a36fd27d1e660daf483a2d5c1b4e93789f68a6891442b859d62daf463d152316d6e9d807e19714e03902a96382902c8989c57a28d62d6f4ab444bc5acb1544c1973da236beb8904b59cf8225b9bcbf0ca59d38f711896b756cec6cd53cc4d7a25379e68d3a6df250b49144fee27bd32f7bb2075bb1c39914c49148f109d9d971d3a4b997449ca1d94c91088e47e140f4a084a06828b47724c7b507ca81a230409eb6c4629a5943a80cb608dee6e2fbd74f7a6d5f05a6b58cbdd5a0d8c7344e7f98b4421d7ef7e9af322d7b1ce725ee41efffa94b9fee7d222ecf7af3e763dd3e55fab8f9527ec6a61b15cbd12e8ebff5a9c2c56d7f9b77f8f78dae018119235d38fb9912958a3e789cc19c370da4c98eeafef0ddaa8a3e8a3d8e0cb053ff73c3c1a09e0e7fe04cc7923ee46ece02bb441473a6de8376a867d9d4cc027e071c638e305bee8cfe7401b74ac1cf8fa66e6c09c98ee18313a10e7879082af2ebb47b137db3bd59f21a05bae1d4340c911e449b7640e07dfbf6c587f4e5c7fceeab59ec2473d8fd383e1a3fe84704485e0eb7573fdd95b5edd7b94524a298540aac6e6777777bf38f79e4ce7bbbb7b055f377f4747b5beaca5f3adb5177cd53bffde9773dc880325ec5e6d451c281df8f2dcef7f238d0d143e94e93f93fd4e245b2ae4bcc8f7735e643bbe788147b216b9588bf2b537d7166f5e41bdf1b5a9fc4ce0c2908226dcb7143ce18e78c45eb325a3684a98b9ff35738f377283fdf8d49f5b859797fd5f5ea65bf2045f9e978574d944284fa2263da63c899a20a9b489904ce22665a6df0496c98a6d9e443e5964fa552953a40fe7a7a788e24c1f8300867012f90c65d234897c84f224f2e9c97912f9f4e0a383099f0f916906ce5f4f509e443d434846540a37d4404bdc07223e08a93ee8f8c0033359cae2c3e9e123825a9762887b5bc81105d1101f687003951800c04654048825183081e2e3e1e4e21d5dc589206850bea0038a26464cd4a00517105144468bf97608717689129808b710dce55ae829305ee8b06006430d6234281949a2c6440983d1133a9f0e274b863c7cb4849639672205ea87104278bde252b8dcaee5f15305cc081341722c2922cb941d90d072832c98c04ece63081a440d40923c3184092c7c14e1e10644c800851652787c399e7078079c96d5d5c103804852c321c9952458c04316a01854d95102067e382ad6800c8ac00289500b2f284183081a4cf103050c33f47cb0192a4a5b7676c8420a904f8a2080b40c5142871477cb9576242b8e540413235c860072b96108cbc140831c749e8002ab02841018600287233b5c208203ec861abe2894071be76d41b10d6a98b28323db0f0e2ad3ca0b3e9e60a108901e598aa0b49881039621927414c103061304dd7c724cf9b192c41215ea992bb42d5908e19061082ba440f1e343d4630b26444c5547ff205ba285161da8e4a872031ab60022881938a1e50a2bac1b2d092242104df450c40a123510c1f2444626035a1354ccc0a78622ec65318412290a40b92c4294a80ac124c827c4954173188f18cb124c9a4009295172a4db00196650030f233dbc3034e489a1248a08a2b16024968ba076100016e8200a0d663a58986201263d9a00b282051c5070705a62b4c7951fa2c0c109901e769853b4f8d163871638b48045c90f272527c1852156627812a588942119ac006d61238276039399c9631863f18c68f9388ee3eac5583a9e2e82cb6227125a9e10d9e2881990da11b12a925002cb9392b653b10061052b907e0c69c202202670840db12850344113fafc8710f8864e922a4410d14356e589d913259ad0804410131e9ef030832b2e3044942b43362458c4b058f2821c10d1928389e6a1e7264d31a9382a12c48f155ba62c01a40543418250b223040f5180b4852b4f601886a03532eca0c20a2778a04287034531620643961e587af001009e154290013d2ee3ab5d26b787bbe42ab93cdc2477365d31b5af277567a9275599bcbd8054edabd5a7d12e731bfc061fe244bc881b711ca64d7b0e0e03d7c19170a2c7e08a2e03df61daf4a7c41e314870594e009755a2e390127d87eb3bb8cc26754dffd28e5067e70ac94d4448957db4371c1b849f0da6310c60a5e0eb4a80c532993c26e685c11ad6592b6732e11875e00841c2faf5d5ddea6647bb93bdb63ecdd52bd0e74fa290bb863325bc94c4392b7577734a4742eeeecd7324546bad61ad25294fbe9733791321e7224e1321f724ae39f471a6f46b8d118284f431f80273a64db754c849e5a472fd222a924d6547a624c618635ccb51cd69e3017d384f501ae31e76cb446977b7cbf6c78b6362ac0d438c6bb52cd6051f70efb54fe9c781ce8125cc8c82df97fd8b824007be68ee7047bb7baf8d2e05d90a8d3f0af4e7fb78697bb5f7f230fd77c209347d1cc7711c0df728dc1182843477c4cf514a2905f37d21a1ee7677f74a6badb687f6587b692c76397216155109fd6d2b53f7fbdde87df734da411bde3853f97e4e2a95cad78aadc471dc0aea8dae4d40aa6e2d7d5223b5d1fc96e2b0e9aa59fb2ea6f27ff691ac41dbabbd1ceebccf049e50a1cb0b4c4c4ab562c9cc9035ec48336da875316de80b0fa6cd0776084b09a95823a4dc4fb64810fad6ada46e298d16878a90b4b79b854d1b0ab3b7dcde8dcb41b7d4244949132632c9aab50854e02746afd769113e110a097d94743431228a1a8ddbad40e38522547050840e11235b163e3610e18328098b92167c2b648ee38a601ba6c534d70a2a24f1602b1242168bc988d56008922542372deec2f7f598516446114ca3518296104bc8e549e44344888f4f8e4c3b30e4424f10772fb6d59b46a3841e2bde86837027ec396aa22f519221a2d914578f194d84383d426e68061421396b33b00849164e0b218bab618cf10760b0a6e78ad13c897a74324d9e443d39f408b13b7352da187745bd6cd43afb065ba97b5ec517d9eb38aec39c576b8739cc5955d7ec89de10a5b74ebfe1b3ecf3fe75b5105e7f3bd6b16bdda28e95a86e373a79be6561def4b4319f3cbff64c5be70db5386cadd36271b8f82277e2e926e4324e4a5ed38f8ad5c8d3cd5a8b390b6343a7e548264f4aa79bd7348c0ce614d4b4a5a42424242312e646c2dc4c9984b9e57e981b4c128c52df58ff691d366d54d93d366da837d435ed09754ba85bde50b7ba366dfa4fb7dcfd2858df90b696fb9674523a2dd9da74d5d72afbd835d5ed1a7d3842b4e83fcb384fd06799467707beef04f4b1481d05f8fd3a1eebccc513d287c56a122fca7646a7f8686cccb7ff9afe1f8ad26e378da66ed5da737430a74e6f5a6bb7288d7dff1bf963b9779d6d6badb58db18d971549f041b6ef9dd375d20ec117aee0abbeade2b4b1e0ebd24880fbfb3cba118fd86b2ef8b2373207beea9cb8f33cefeb3acf046e9c31c36b3acf7e2cd6770277ada9ebac7defb3b556dbd58eb8035f3de7e781fd2670d4148626d004eeeffb09dc75da2058c2ccf6bd561bf6c11ccf53c1cbd5cb76f44cfeba913fd064c2604e074e0c7a273b8215d41bb5515abe0fe5600ed78f430bb9fefe9e2b61e62e04748bf7642d9a73ce39bb1e4a29a57d94fbbbbb9b1331cf91bb574ea8d66a95ec25ef910b8e9c882314e2efc00670d9f41f3ed96faf28f70b6f24bd586ed216e51ec9a25cc713d4f207ec0c7fb433e2038a5156508aba514a53312bec2c53d495d96ad451b7fafd5522eb57a28ceda9e5c64a666bc6aa4fe78d3d6267b9569791b0d61aeaa86fec91465d79127f1464bdea79c8fc6a842028d03eca84199f5953d3e06bc667b6fa532ccc97979f13ccb9f98a37af54aa5ffd09aa5ffdfdd5988218dc51e6579f02d68c0744f87dea29f8bad9ff657cd3cff4ccd05c86ccf7cf27fd5d3e25a662a9d265acbe4f3acc8cfa396f2ceaa7cb50a5626478cb0d23439f95c365b74a5e46b266da373d2394fb6b0a944cc55a994cc5f28ccf4c6dc696fb3daf4672b3ccf164abc3bc99b3696ddbf6770c28383e6250e549f4039597e96f71cc9b599fd6d92c6a1db3e50deb963f5d3a922443e231a2df525a46c7ecd3fb747c91ed0f5b5a9b8d756bded8d2da74cc1bce85d9f276aef41a7f8cc390c5f27fae63d8c6fac6e2982d177664fa8e63b668f9f647d98eb1fbdbc0d2bd7419268f2b3dae2c3dae2c3d7f972c747159fa24165268d4a8f255f15b9bcb7031ea1a7f2ad8284462257dcb51dc1d5d6cdd720f5566af494eb4e9e2de3d160363a8ef6f327a7fb09c2e12dcc9bef4492ca4d0a8f115bbd6521c078e15619d4d9707d45fc216666481c3c29359042af04313225a2c8ba0737fadec4a12b6b2d77ba2a38f61166d4ec156ea9303b94d9824f40b3838b6d09e944f703c9145c1d172b560d25d0b9e4d1b142e8ffeafbdbaadf55a6befbdf75e1192dd57dc6e34da1521e8006e621a1b6d977cb55a4ccb64302f349770da6c289c242a050bebc2c6dcbe96e535d439b046b517b3c20fdf4d17db6bed75569e79526b4f9c8bb56bfa5d65d87ebaa40af21dc3cf3aedea74d569d38139b46210e7d05c614cb56f6a9e38871d24659295058b0c6e394ca18434850eb61c0d093b4f22275038b1b2a3cb93c80916486005e89821c70d499438c243451622b454119bb2240553e97c8b12239c2cc91ee449e424c80910b2465bd637a7555ada69a3b171237fd7d513ba7a4213155d3de1a4e37c8bf44d18e4a5b4ab575b6db7d76a6d554a22eb9212aed5d6cbd9da9155286848a813c92aa5e6711cae9d672b4fdde956935548e5f9becf04f69c4c0de604d18e8c908e926ea1c965874eee7f89c190bee3e567a2a403f5e4d0ec555badf734da6d5d6ff781a89718950c8d18e3525b6d8484a49700c5088a3194e7b78c26b58c0b2cd97a47ebd87aa785dcfaa60b6a19b42c874a292595d28822e5f99446a34268940812da920d60a43089b5b423d3f2027d739fca4b610d853308846e99c790d135afe9af34994c269369b29e7a9d7d2e21ea04fad7a56841341a8d1653ee946559c2dc97d96cc96c369b59186c070c068381207a7081699bb669a3952693c96432c5a8c5c4f8dcd6a14ea07f311df60f86164473da47a3bd943ba5975f599abcd96cc96c369bcd6c0400c345984ccbb22c4bdaf77ddff75d80c42cd3b4751875024dee82b92ea405d168b48ef695e54e599665e93637729bdbdce636b711c034809a4b69341a8dd6755dd775655896256e1a079afc43711777345a108d46a3d1ca72a72ccbb22c808d4ba6b71bc618635c6badb5e28f46e36e1734f9d79d2ef6aa47a305d168341a2d86a900269c2942ced432996cacb5d65af38dde2e95795666655666c15a6f35e9abb7aede70bd71f576ebcd0026031ce0000808c1840030278404dc24e0e6c69bdecca7798e5d6bfdb3586158233126db23d2dd489a4c782463625cb8800102085d7319964a91910d29694909cc76b4351f42f2c26a300ce61a07623833273a5800948593156c2e001d013d01248513201d80860029612baf1c61a40a103f7cb25421b28203c90e33004559800c44704005902355645562e03132d402161bb86009084a04682d48f8e9b0330488098e0ed00e0e0c403a4042706af8a1fdf8fcf0f083e4c7c88f0d3f3c3f527eaaf8313a32297ee5cc1b4da9109892e55dc3311cc3b18e61201c73192095d28807499674045cca7ddad1f3e960a00face1d8c05ff5c20e56f98adf8e0fc624244f1f2cf79f76fa26d63754a7ec1b3ad66ee1578529ad111f8d0d7ffb2f77af31316d9a31dd634869e8a3306f70360c31ee582cafc13726c664b2ee6168eba3605fa08dfe9cf9feafe91c9883c1ea15f9e6bd1cf77ddcc77d5ceb82353e9c1b8424ceaacc44f88da4cf32f71c48d33d0af8bfefb08dfbbc37cd39e79c4a99a39452da42dddded962773efee5e8f32c77dadd5f6587b39ee1b71ac7c228e951338d2d8c0197c9cc191542183a7c7f934922aa0fef40eda40dda2ccfd89fbc856ba4732e745991bc9fb954c412d7fc067eedf8f9751a98b494886dda2e324bf0983fc6c4a7da3ca534995faa566ed087576582e8445647e3d5ed3f88bf209752b25de1fae0fb3a6ff8b326fae92d9ea3bebd60fd3f5e43ab940f7e736b93eb7e7faf005f48adcdf39a599a0e4fe10e35a6bed3e2cb91ff50dc9fdd493e2c96842b522db114c2693c964324fe6c93c9927f3643299a8cb819574107ea765ed8872ff89fb463ce227bb1cb95fa6c3235692318c9654468fcc7a60aa9aaaa6aaa96aaa9aaa06c3300cc3300cfb804b92fb5af991fb29875979dab824b7d65a2b375e2b370683c160b0d99dddd99ddd55cf6ac90a68d5b39aad8256b4d52a3bf1a45bb92e6c2e6c2e63babb7017eec25dd85cd872d7d13a315bcd7c06a68542acda17ad66eedf0726550a34dbd14529029090b4b072babb85b985b985792abf2881120c06b4178ee0243152865284378447c25b484b82029467f22482920494a13aa3b6f6d29b566f96ca44a02124674d041a44a021cb47deb079d9b41b95a15c800d88794133d327d2041eccc8b0fc449ee003d64a95aa2712059f8a817971b1273205a24b883a81a67b22553072277205f903c0884ff49d501a5bcfb84c65ddecaa6360d9679efe8cc074b19e3e954dd7eae9d3db74a99e7ed3a62bf5f4bd9cae7efa6ec34fbdcf04be5841852e9c28f31feb93adb28c917c45f6bfe1152e4c4fba04657f97201af0c9971fd93ff563e6f4e48b95ecaf7ab12283fa154c1256f8e427cb2eff7598e671a699e1b0a8ca32224b8cc0b4a1bf12a96cdad05789f4d6342fa7cd7cf92a7ab569e3301e6cdab866e83ee667625e441791a49388a436645a4543f118bceedad63e596dba30fe640eb03132d4b3599897e0ed9ac46da5f764d36ea6b73335a70d25674d4669a4979c3be1b669435dd0883332b26b6a9125ae44957db226a1c1f98e16e6e16061d34583b305dfd2b1cea64d43a0fee8ce3d69719c66d3c66135142c4848c6d43c58f68fa94d17f8fe1f28da1428be744fcedc6664d3c653321790909cb9a564d9ff03d9745924ac586731b099543689337f286fe696fd3b919cb121fbc7881e2ce5373e5a63df84f1b9704a63f39e7197f1cabab95de5116e08abf76cba54798e9c85e5394be55967350c834c63060dd519e58e64fa3466c00021841166908d27bc508ce4989e35173040086184dca50321d2b4da821b6e56061995dd1d28659e5074326d89a694e9879896942907c4e7dae1388ee3b898cc72d1555b6db5b533e1119b8884336323524f73cc48dec831eff2a42311410e99ba7841ba0eeb3d84bc0221d318230018404325fe18c3650060f41e1fc7e935420c98371e65b6ba040f5e8c242bbb18c9a719c99628fa12b3a6ff45af326bfabd47a86fbce651e68dd760b6fa5389377b0de68deafb7d8979c3c4bc513dcd7f18ac41c3d1d8fc357bcda917a944cf5e53899dbdd6bec49451650173268074c9f4e7440099ca7484390d40ae32fd17ee44f32a71662e8b4f33ce69937a99d4cbfcea3f0bd658a56e6a9592f98f9a4a984253680a4da16e257aad5bfd33a24be956d195f90855ef7d4c0bc98830d9e5c3f432e24b76f9005f4674e99111431acbf4512f23a2b2cb4748ce2219f1945d3ec2d4935e5b3dceab915421af5e04334b1c53313022e946a44391fb5d447266a99175068aa42d2dcddec82bab5d221f70ea3e6b40efb0c487071df6f8e60cda4d296d1a826fcec0f83b91b433941d22a3f4b169b4474e47ca1e3b64ded89fd9ea7f7ba4a7dffecc9b391f14a78fa4fdeb8d73da74f66d27dec7a2bfb53f414ba9a5d60554ca2d031568952dec816fc22057b014f5fefbba2321cd9e572937697697aeeb52a48b08b110043eb3ae2a216969a4cf704fdfa8c4fb3b54919b1c4fb26913149230355986a9e19e6ef98c96fb245bc16c163454cd3ffc170fc6f33ccff33c2421cde1f74ff0157e3d7da3c38c642bbf4c1aed329ac6cf1bb323f19efa8e4e2fb5d2580305d21c87e048b23e7ba38fd48ea49dad72f74ec3380c59acff16e934a56eec8e70aa84a4776fd3657338fb34dc937548a817ea21b5fb0c09c24994044c042e18b87270e950de2056056683157c24551c1400b2e50710cd05447240e1c1e10a154a8c96f0174e58a600fde063840f1f275b6049c2a30821555ed09f909d2237cce0882c3d3f24cc9f1dc02132638bfa03964cc6b8efd4c504c602ee57f70ad6e86e6b0397dea8e4ad9506350a9532010000a00003160000281810898442a124c8b3244fdd0714800a6e824e644e3a92c782b12c478118c3310c87100000310010438c310659552b081e3502e61e98f8688a58863c2983f088bcb7c28124f4c45ed41a8fd9dbc25478644e18d60859ac28139cb6e672293e5a7a4021f5546cb85aaeed57a3ef4fceabd58f55c4124e8fcd13b6b0ce40f77eeb5821787638f9a1d7b24df8a62b4fe5220c72a6cdf8934076fdcc656ce070103a2a659401d472f31afc94866db417d773f464d7760b882579f98473809d9a0346495f63984d1f4c83dbc171dc5f7c7eda58cd898b7f03f8e5113ddd900171bc6c2a58ff497bafc72564aa00f16e2eb881a442d49fae200a2d3c1620797e308f5f32489920a2476e05d15aa83f2817e586a1de9f153a46a5e462a04cdf74a68053b4e90bb48bbe0157bb2220c1b452d2840f86af649eebb2148e6173ca6ea0da7ffd26bf8957d1691cb88a08ca7c8e99725a75481a802b337c558044307215211b2f0be6ded7fa4c2e1e0cb8e6158169d1330845ef16b9d70557a9dbc185aa1acb85dca354d72d648b3a7510ae151b7a5fb247c66e62d513c4a3f97779c607b75da857367aa3cf573e84709955743fc77b05878e6de47190d3ed2ff204228de8ce51a75393373474fcf038de872279d4806498ff33d032c0e3e47e6ec5b2025b79209638623c9fe4cbef595a1a613eaf5fc1ea036af5e7d9962c3102ca1d1b4ecf45e75996958746d1e2611f772ba63046eff9393a19eabaaf4a265dee5a2819ad70e8ffec65d74593f3145cd41918d2529e4dbb261a157051386289a95b9202fe68cef45791dbfd78d6968005fa968e0d51bedffbc2416ff4fe739c01475d3ba359c32c065a0cb7a83356906f7d4b4817ac73bd6591a2e12f432dbd8a4362766771a83bc80e323555dd03b7b8bc20897e0acb164af3b23d4b7782b775a2bcc45723c22df40a3c64d61ee27dd24cc992325825f2f19d8927a061cb34bf44914166c9d2e52a95d45a3b333dd9608933832c3bd4406066dabb656cd1102f6d71dad651bc003669180945ff75e0bb1a65fe93426c2ad675fe3eccf93a2a32439e195d129c9e61db5ee7994709726799e05be491b1e79c0af17e3ba2bfa652938639faed79f7744bd2b8bf7f3f22ccefbf35f1719fdc49954fca9e66ea9f41c245993bb8fd7f1f6f80a0929fd76e92dc7f812619d2941ac065e847db9a329d007444a9fe0d42864ded0332c5ea6709e7582b85f97478922032219544f2b543a21af4a3566f5613ef2f7d1c28a2f5da03b0cab00248355b85688fc223b07bf5801449a19678e3e0e93e06531e37f6b64b4963f12d5a79b1a420ca8a102d4b8388e3a1c825bb43e03f97154ad4e705e29052074f5a139f677aa9f0991f8bd77e309c0d1338cabe582549a6a898d391dbf0267a083650cc40399762ef653f210c45f3cffd7be7c44656aba975e878b6b2471820bf1cf4faaceb2595d30735da39bd9d079398149eaeb9016516e4e5df5eadc73df35ab3668614e5770aa3595dec2d2b968fda6d7edb0bb7d9c160fd429d91940f80daade70045d03eaaf6e63e4671219c7ab76f86e2123433457a8fe8c41a928686cdb46b5c34bd989d18cbb7fcce83994c93009ff6381261b234093ad060816cc3f991aae0cf5796021bb4a08bdac4a14348df3cf574f5e1f637ef93586f1abe28d51d1f6ceca3a4e893fb05245767eb006c96a25cd42efe5f60037c568529d6e6881339c1f09242aa380b7463a187af986cc0e710060145c1269c0178d68a6c631dcfdd88d18760e88390b1eec3a011182d9a0d9a2c641c5bf9085373c96aafedf16a4ce31b14b1d880be7ac9c1a2007cbcf0c53cfa88cbe5121b4ec02507ec03b9c349e7491b0ffe154fea28b8d0bfd90abd04bd452498962d47016bccf66085d514e61ba596011cbd6bfa14a32dbf960a4fb5cfc25a5d18048a1a9c6296612d9483dd399d8a12d8e889d80f3918fda6a4285651cc9d44f9973ab9ebc17700db9cbeb0509f256bbae9533996681f21b17c0b53f6f3d032b4f8ec91e219d4076b00a492637e02dccfd2e6115ab8822313bbbc1ffc0f027da2aeab42b11c7a2c2ff9a1b3efa09046da4218fbc54a519f9e542e46263454a777855ea3f6e09071f27086986e3c605371d3ece83ed67072509d96ad8f39466684d4ff0cfba2c29c8ce333c749ee424a20061ca18d8a63ef6e33263344e58dbbff0ebde57831e5f346f4a73d73893dc02109dcb3a765aff460655c88694a9158233a5a65b231ce46698d5412e1d5a99f0890bd74500fbcd06d1e99b502bd6edc14717b6907ec15520c9d2daf929c80d926e45735b9e83319ddff22cc220ebf70963d32402e587ba00c83cc70c03453ee06282e26cd4b5095ec3046b08a4e96259a857d9ae90f8e074bc60bef335ab43c177a12281dfdd151016a93b1660c55cb39bad07cce8affbbf3ee151662219d03e1fd983070871668007d9daaade9263130520a601fea65b306401c02f6f1802259b168c955c842f178bbd194926a73848e10b53cc3812856ec79cdc13529926c1a104ec9984d00f2e0c6c20272c880c86e0fc7d790b6778dafcf57e82143c2f423dc48cc0fe8fd4d4e5ace262d366c4bd79ef308a11cf50afbeb50338dd0f13d33e8524e15da75c03dde7902feaf405e240dd859a9e60ade4c0951c86d39d1693203467a1a9f494a34636b091f6e23cdbd8fad841565a57f34c09302eb4b62f5a5e48ef5e298ed23982e1f023ad47517af95cd26ad19e8b66c1e792e9df53d6ea79381c58ac1e872d563a11e68cf07a538b0bb28a73251c99e0ab18840274b977eb82e935c2a97edc076ac2e60720eb06047edc0ccbcf78bb8c386761bd0e12febd57631f6b3911c2ff6ae673b6b5b5b6430bf765ab7db82755ae8bb38d72809a586acbc2019351ec6d7916d249d0d26525fa4d44e145801dc9017d4c92a2611be3e5f002e5f9ee8ccef1b2bfacd377908fb434b194214ba5e4f51bf97c9cbd4829f393011c4bc0ff36339fbe488cc9c3ab4a014b404d7da245762af4257b80b4be92e09bd066060c9a8b07eb99fd930b45d07e0d57030ca41139cce9e6a65b4b94ae135b005021a1339943ea4e18eb0a63e3517004860d92493c4207959d446959887a19f3db966fe0cc431c8602f53e3f731e91170fb8cd1f38a6c8591b4385f97d3950d0ea025ebd4d33285dedbff8bfd010daa015d241b4461ad12685c7deb3ab368b97ebdebd9ff2c1b66c4b40b21c3e90df6628fa85650a40bedcfb8959d740b618b6b12373336a879878ca3173aba58ecc9f964290b84522eb10b4a22be481d8431fc708d325004e929167059663f3972435cb947ca41d868cc1227c3cc0b4a3b6f76b8228587cd59d61a56039aad6c63c9ad6701d24905854435eda1aec0375fd734ff72a24ebd4fce3d8e6caeb4d4a388172a5cab4a0a46b23d4b9b1650f71251fb045690f2944dc9c28098a0da4631d6e465a063d866ac1e3bca334640bcfa50bc051441d2f348c22f580400a4d116a88d4acc89db1ed5c0c750aa5248ceb16ce842c99582a83fbfd12c08926357da05833740ad9dc054005d861a00ec23878f7ddd447bbd588a770e9af99dfe5ae7c24e921105abce7e3abcb9518fbd34ecee78519c35523dd1a40696fdb6dc318bb2b58578ea8cc8bd1115a88e795c0abb7f1e477e7f230fd76d786e91b57f7bcea69ddf4e4e96a2e7100a9f3472e3455fcb74604c3428754d4980193a76e0bf608345f7235371f7162b261f301375360762e6253f7dded1e4dca4d213f60f9156bc7f428c433b54b689642e016861cda44d7e2d5afea809b3bd93df268852c7607af3a6c0c41f9541a985a202e9f776736008bc7139a1979a2220ef3202b88d7402ffa2c21ed91fac7c29c30ca1ba4a01593721dec84ed10645f8e72bc77a6381364402321aba14ba6a4a3c34120d9d6f087d00b1b5b14b0bbfa9055dc3be3c1d3be88f664be17f5888189e2b6db449949e4217e74231bd936017e08a54010d6021e4f781f16345a2a4c655ec611a5e44e21cb42157cfbd9a24b846c4d9e5822ac1626ee7a3f0b436c56375d297bdd82e86b36ce822fc7843ead5c0906672cd6f1a7705cd293dd71671b1aee6d3715d968d843b3b0253c655de98b3a703f3db633cb5f8607d54dcbc6e73594285dd4c1a6600d67fb2cdd80387a48369e5c320fa2e6f5fb583bb774b93a03ba88849859397a68f3923100ac7e283793859511b6c40e5d2a3cd05bb51f0b810900e4060dbd0a030a64c2b522f4114401cccc10d6a72cf5cb57b7a3a3901c5524ab0d7eecadd4df03681694e8636c4a73476e0b7f462d9f90ae32383964c268ca375e7bf5dfd576241757aa3e3ce77fa685a77519e43b108c22e07a266fb63acbf335095514eaf292adb6de42447460946b7d1b592d0b5144cbe2be3401835cb768c002ccb791184b63234bb6435305d2ca951b34a6131a1b530309b86951099a5559b2d7a8fd02209a39fd7afb895b838a5903faa8bec3464bc2a267356e42e8cac2c214783a4b164470f5af623d9224cb7bcd165276e491396319a7745021c26c2fd987b9ca3dc53802d543b4286b89fee0552fb9c35a7a0f69eefa33065a61ecdea61631188d279a55cf33a7d90fe609b355498f681142689c9225d6bb87a8532463baf21e3d4a8b0838af62aefb0c4611a7381e25eeeabe504185e97946fa910e2308d71a812ee17957cfe916ffd127a7066851151a687402c8c8bbe3e67a2226e005accd45485a6947e590b4a6d7c7a6fb694016de4c94fb67596da94ee6d871ec415e63c962f31e2d31c485668c22e2003c04aa8b11fe27cff3864c0bf4a8d6423b690bb49762fd1a67c15c219c2ec3a9c49be3c05f97ba803e34319d817f7a827a38bbd9f56a77ecd0544d15d3e72f0179c5acc58052837726161325090eb25d43042764fbf27c07bf7c41a6444883a75bbb71a97af5dc35d4b3dbb9742416e0985be1fcb99b68ad837c2f2fdf5e020a4de476f9b52b91f474af4b1184ef31dbdf1856c887aa84ac96cb8f25f215212c0037f6eb439e72a9bfb243cc1331c1c2f0f53c78613c2d2e62908f0293113f088766fcce17cbda756325cdbb63b8742ed1737b114d3146e1f40f23ae77201fc5a7ccffe72811a8252b7c779b8c368753ab2fc2004b01521f6ff41047be2b2a8dccdeee062889b73f8c727bed6c3cacd6f271ea0973963361d116c5bca8270b8d2bf44c0b03eaea92f223088262929067f973a3365a9a712094f33ca12b7a52a9513e1009f32370adb1042410233efa5524da5f63195a2d1fd887c4cecb8ac0193b5069933f89044e288a43cc31890aa5213212e1f2ec41816c97941208cf0f78a18f64bdd1d7f543b2f093d0c198a787961c4be77bc2c0d560da218c20be8589b822712bb52314d29429b5900e8ec1409b7924750193d132ba852d138c7fbf68a9ef1eab8b554f1032a30ccedb15db82dcdd2cfa242bc3cd1ceb93c8785b8ee63c28e7281dd53bb0809a091400506adec8442bad4e8764fed922f95c085dcec005b43d631695935e5c9c55cee75eb9d1fe91b75096821d5621a0f88c5d432b310e5ae699deb41c0c71291358bbc8b3433b5f329d5a28916a80b1085497cadc46a73b924fb43a81de0bc020fb5e1a911aaa4f037b86b189bf8e08be2042dc02fd10071ebcdc3c22f089439544f8e2e93b7921969806b1c517919c2b28d40501cd664f42282da4398f220b591327f8049a5c2f7118e91d01da60fa891dc317630c7487d02c0603466a2e5bfd41d4fd7bde1c34764fde848ab0c001f00c21a083ad42b982466c2d2d04e5703c6ec1ded0468e9d367312b524f6699f6e8e69138af7500dfe5657d2518aaf2a4e25a826310416cdad76bc8dbf3ab2890e8f242cb440928aba996ecedff21f3c522ba02830aaf4fb7691109c40167f350e20c0822913aa32a2bcce10c2220d5ee1044109dd67f6fdee9f16c568f24321a4093bbdcd1b9e42b7e52d05a7021c7f12e9bdadcbfafe315802e030b5ff38da2c363e09448c37dce93fe51a11946abc4c7a18fb6785a267e5cda2c0ed83be6eabbf5cdc8ffa1ff76ec7bfcaf956a5853ec5b7bc05e4d5db4facca00e3c69628c259e6efc632da8ccd4c6aaa018af73e2e6fb80e67ef511b1691cb9f60bc9986a107dcb5d95fc897c2f98dd80129ae4d7cc3f5713f154a4548c50555497de531e456d92a32240de1c8720a6e8aba9385a69dfbae3098f44582f73a94725d28b4fd08c4c8ba84bd80900fad4283893b00608bfdb6e0af1916b6dd83a1b6a5105bc2ac9462bef77802c8d0565b0de59d95f59b61e1418f907c9aa5bc67ee5e3978c2d291b39da9712154f8470700e0758b544f735d293774daf6ae4c28a88c4fe6bd1664274e712a82be17cd92f36c27716376bd0c83f98d3731d20aac4bce0b39d839d1890557d11ff119e9b5025322f76fc1c142a75b45af25bee1c1a15291b9efb8f0e0e3fd98b197a8ee18767e5f6c2028be8eeab24dbb7dc854ee580d6fdbbd827c667bd0abcddfcb5af7cedfa4cc3dfaf94f014e6bc5ddbaddce677081349bc97d5b5442b4524bc8a33a4baf16804fa7616787761d63139193d00c1f30273ef79d182b1ab845e6b415db84aa2cb36ef8e1b561babe5f1629340947e2f081b485708189505851036f170c19ede8ce3b4f810a26a212a41f8e3ebc0cea8670e0fea8294e9b4b6caf68d0a55649496798a2dcf5a5f1d802c05413eec7c07791a22ed1e1e4ffa292ade5191e1fef608fdd06ea0a037bb75737265f7d65763abb236d94ab391a86a42d1e76bbcaab366239efb8f674440b2b482415150176ab56c1c78f91e8f38b9cf233380785d1eefcbc9d80be0aa3301edd2e3941ec4256e0287bf2586e4150d22b13d67c33d6a563c45b33c8bb7e8f255890e1e1f53be7eee4d248e8c74c8ebac7327a5ba6228d3b3e245371139a4ab285e772a3d65d6313c81ce112f3117480eb56faff35fde859c07cf485c1dda993a225e40ed269268752cc0ad820e210e05ede153ec0b39088a102ac6c211061f3511c46e517a508e86dfa79c7fa0b1dd146f03538cc5d93cb1c42291041a816a376a0867faa4026ea784bf9d1c342874d6c1cc84afd5af8b0f022930d38ad0d26f0fd0e324583c4c4d79373e4c2e5debefec099bc70427a984f858fe08119f00afe03d877ae8b3a9a09b55647003e4e3574e9c5032ad2563385197211eb15e49f2996e5b9d7b027f7b29eb18129fc89f737dce3d7fef87fa0e7f799bae7791e6ba4d290f1e0c823d66fdcb6a9922239cbcb7e2bf21aaa3d2c918f38ac848492e83e2a8a6b100d063cd69342ddee9b88971004c628ecf7d449435ac047224cf8b88d8eb1c39f147c92529ae51716b2565f1f3a80803089bd0d115230e85fe188980c0cfb890192468664b795f40a098cc3334de628a400c7a3c394da3d5be6d91b6fd0c390c5398041e3ce81a5a212d9aad90b4c1f1bbf21d068ba49876a32b0f5f0cf0466e137019304d7313d90a4a1e1447fcfb5f810f11377ef560d0e8b5979423203880578fca7580c03606b1a50ad9442e88fe6d534dec2f7e1d0c0d373996f4ed879f818d50c0536f870623359a4a918b5b58731f7d0ccb17292b8c0649f8f548ab31aabf52e41c9957f02a67e216c5ee4cee4da063fa056d353fa0e823b013acc0bf4432f0e6127e985cfbad581b4e80be9c8e1ca352b4adc61623686cddc7c8633706cbd1ce1272e3167cbf77d7e051271dbd5399e6accf2cc557494036c563b223cb751fa3da75a74be512eb76132f1952044ca699b4740e64be3072a6be324194be0800686cf23907a0e15e5da2f7c56beb49a41db80da4d268dc2764e4ec86b8b3f05d37ee42f01814e226524610cc915ec36f82402ea8334d62bbb5edfe01b8970ac741af6a16432aec1ceb3897ad3a21d93fb6784ff01207cabe726e486e29e86c48cd549349c26c86f8c363cda566c266251131409319224a5c134a139d81342b545a97e98ce350256fd4212599efedb30c8ed66dfa42cfcb0159e14bcf4c5291521f9e83165ffe2ef3cabce8be0d161343c16ba373e0d0c41b8c4add8eae825a052b73bc201ae40c3fdbbf6b36551ec4d10531ffa8d5f33b6975a79ba9825ed8ab0f338824263d82e0888b75f5117c01b40ca4c5f3811a040635e5f01a965bc6d8d93b98a547d828089eb00efe3dc1b5ce6e382e4bdd71b7c464e36e668edbe07d2cd99fc15ea3a94d6a01b4908cdfd7e710114a598ccf052d4e73863889ab55d19d659d0e6574dd5f7afa87ce4aeb6d96894f1e5643e637844fed00d7f21759bf02dced1141ff3dfbd050279c24c8156ba0042cc9b7c040324639b33f451924b90e67ec62ab3e8cb0a2ad58fa94dd31eaea3ca4d337fde809a84d91a5ae288efd29feab8be6f08dd34ff0af4e050ef65654dad99072ff07eee2ef10a8c51cf85ab8a9c727fdccae3a5815ed6f95817a118e3fcc5d26135471292559bdbe94c369eb2c8ae74d961f7044ca1f3b5e76885f82ad27039c997533480fa66feac364b26a4e06206d5820dacd83a3d56491dec32174060e14c65a825e5bb19815aff7f84c8075f83772ba0eaa064884bcaabc43f8776c0ceac65fe6d2a7097246db66c0e7859077f03ef3a6781d90489ae69b8f549301a74b46c1b9acd1fe152f5f6fc57bdc956b2fcb96507f2e8f382f40e423d4eafc081ee5a7291d8fa24de134b7a12310f043461d115f03c51f6f32623e93b7c3e64ab540021311a388819ec4118776b7352c6c19ebc64f46ddacb0145cdb2c70d682541c77166056122474a2c01a518a2178186f0d179e28a609e9584de77d11986ac94ff6730614fc9a4babc8c07a6ffcb8d5a233a085d57bfe7a0bb3388a405720ecb72522d0d184e1dab81ad49b11244163ceeee16920f05ae7c1c79a2ea827e7e6f9e40f9e51c5ca371ea7eb40e7be5d51befe797421264414f8372c10d0721e7cda223932750e7c8f6f45c87970ff9dfea057836fa746c7afe4dc2af5fc886672d92d435bf076ab9c0bd9059a6f659f2e4c5c29c75dac3702ed0fbc04f1bf10a181cbd936b95946701499f12b0601923f2f05c21cf0070a4c22c35f6ade71eba00f8a13c946a53e38ef3a09ce0271e616ee0b0857d70668a7b97a0525a096d416b70c44c97f01f553d6a08ca1a3f565209f77660c2865bb0ccc8f3ac5ae35161e084450e8635d229e5470b4cd8538bc6b59990d7618343b3ec5d12b5e8e72d66a5459f38cedbbe413f1bd3250bb48c835040d0531cc904040215a96089b9f6522692dadbe010ec3428b1d6eee43662fc7c8cc2eafb5d6bba2a89cfcc711424452eaef1899498ac6b711b097526dac0461ed5f80d061ea7b0072be99c1fe70d4323a07463738e2f2e06fb88c390a4029d754dbe58c49c625923216b17a6db6237a7ebe63cf4a4c7afa38e72406eadf7256aec8ae4d097c3c09a160ff03732ace668b412e23276e7688e805efcdd345d7042e5671874bc7bdee32af4a959281ce66a809e2ed629878f01d8584d99f996ecb8997df850975acd0fbc14ab6dc63e2b3958bd2de3e2707b5dbdcf4bd39e4feb4e62bb1e30610bf039ff38d0c722d1c7210743dde8837a5bc3cf176171fa44ac8ca9aef1c07b95703be19e7fd66fe3bcf2def6f38de52bed7699ccac0cb114de5b891bd87863da3689ea18a9348c75362726a4d382ac81c81df6df093686292fc26ebd3d3ed9e1555066831f590487b35fc4d306b0813f685bccff9a6c32f24d8698e89c5283626f4a81d3a7642e5aa7fe9df8ba0c83880f6c6266745f396c71c0b7ed2d75147752f339dd4f1461fe7a27f8e04f4863d9bd3e5959211360f3e4ccb36ecae379c12bf68b078c09739ab796cc6fb97d520da6a53b56514d939c4f5272974a3ec28116f4ae11185b1153c54053ffda291201dd6067ef5728e7f155c61ace9b23ca1326b6b3fb0d87d35609c3383260eb7266102cb0d30c83d766fdf8ecd17abd8c95f178704a44727ae99a5e2e402803c823fa0a114d2f32c3abd927cb12c13df717a93d2ce143e2d4381f6c8d67cc21c762c4e15d3f9e3a1ed57f89849ef2e6e85a7d004df5e88e2ce383b058f6f2ae9608d835b0a3ac6eeda2574f9a7f0021ce35cfff8c091229b5348ea81077df377deeedcd7f2ea2a980a15a249c67eab0033d442c58a37a471b79e150728686ea73b52f1d16595f66d5faf8f0146ddc6567c033d818a42efeebeb33461286015385af79de81d1e292dd5f40e032de0150c0f93244ab80a0f73023bfb9c4f27167abe47c96a31a731f8e4a53ace8516003f9fb7f7a93b674106df4b57e183734bf567f0848739e137519dde835858ddcfe7979e3c47dbb1851508b64ba549ae9f09105c2169405bfdb7b011cca3655c24281895e0c14cd072a304aabd2838d4cc8f6b75bf4407ae3557dde33e67d714b4988adc827c08175f9a665f0aed135b31ec340c65f75ef2b1de38ca13c586b72ca185fecb3223c0dd04690c9070e741c62068a0aaa1a91634a3c90140c23ba369544dafe6dd5e384f0af77bf0de1972f2cbba39e76e7fca62284b2aeadbc6c1a23fc43c4157677e69927f7f5e1c94c1ae9872825c1698a03a496bf5f7d7be5002e417c7cc9a58706125a956d5f7f7966392c30d943c92cc53d8444dc9f7d7705f370cfcb0fe6f6c084ec7bebf4b3e88182d902187689ed4f9fe8255b75ad41d6a84dd8642407ebad7f7f79df5e35f1bf499f11c4de58681d1a4f728ecde34d3487f665e1dcec83ffa17f0c74c0cfd23f6e21741085b6c0c428af0339fc794aa7fb6d19a6ffb2b7f46638efcce122c930dfc9924ee6cbe5e97a2855f4a64c3db51646be61a9abaa6cfb3d86d468b06b69d7baeb02c6032266e4a2c2206aa411e4d5298af650bc13497b3a521b5813d4cde61f70e15b35eee481bfa3a077021e8f0d75b6c4dbaa98ada5bf4a4c6363a9cf38029d54c2a0544d909bfbdb482fd51d5abdb6d3621d660aa19f72b150bd00383063e7fd83114f04aafd0e95a0b73689ea7718d662dc66eb76656bee957f6699ea355e213d3ae740790086a1d9e70449bad94c9fd4aeb63c4decf589e697969019c649c89c9f1af3d31c912fc734f7bf9dee9f05bfde5cebb3045918848eb2f331108444765e907265bed4bbeee363ed96568ffd879f7295e29877eff19be98bee1251cd637c3d0b3823db258c240cc33f65dd9552000577f19b24cd10d47bcb3b65aecf7851c5d0e53fa162a4d8b7b54ad7bdcbea8b1796c3a2b8b238c12663baa01e79f49e8845f2413effa29d8cbd02f38d45ec2ef562169a21c227be5ba3c407d885f25907651947970ac4dea71e2a3ea22634a28761996986397c0fc46b577ff9b30c64593e304bf4cf8dd0ad99a271dc82f57ff01ec7d8ab203164653f2536e81a1fa299340275d423a52df2ae20441aa0156009695945fe359b52756164ccc98df44867b94c3b53895c2744c9b52f2c31e4ce3e1570f991f7cc23118e7a4a12c15ca8d3a602d91f181cfd22a5cb3bc771fbcf8ba7cc430ff95fc9a63826c7a1305e158df1a8e72aa8bffd15d0ef66778109c2b6ac1800c135910b0f094838c558a734639fffc882992332f4d6c2a688e6ba388a43a42d1cfea9b0a80f83fc0d699f1bfc9cf564812f5e14b26b2537b3f5220d79890e182f9ec2d8e4d07a9f11f89e57c9262ef9a1ffe2450d72d81c724a60e067d9dca93cc5705f14f13bea3e007e22e0c9e1c1b7e9e68803acde305998d676d490fe960bf59c418399007879e9f8c20e7cc5405d16cd9fe5bf291b069be5d06ccad2ce623800281b8804758a0646d6d46897774b6068b6169594de85ce5053b86dd130b1d606b48d5c4bda9f5334a1c7a4985e2dbc844839309bea74c049d65e2e898097b9bcb1bf874ad8af8910901788a68dba1fd831a360a7a1ce2c6dc48f826a9dc7659de242512cc19804549f8e47f715c13b6f608171113496f1e513f90040b10514d59c3c34e982ce8377eba7c9ba944bc0ed14a1e503be2175824a7224989700490e1fe763ce1a183e0cc28c88ce45a4493b49a2e11995766defb8cb73dbf939ed668411b5078b717cb488f3d140d19cf0f69410eb4fcd7738894ad63c56262209e3446ca5338fbebca375b2a3f7cdb609b327ea93288312fe2d62479c25e934b66fd1d35b462d1e7dac1788c5dec96030bad13a6522ae86ad4b7c3c903a8b867bb8f8a6c34dc0feba9413f31c6554a507d94d8d5f157f0845847cf2b51ab332da3b2057718d9984424a3e374491ab14b3cd21e1913aae28b2be53f83695c9c6c5522b1e42becef728eee1fee31fdef22bfc8daefc6c7a935d1801acc1d0cc54e66086446bb1178806e7cf9bcb1bf66266c4310380f016a3fa94d37ee38c9146ea2452dae99a9f85bcc4d71f762862d0e48285d84baadcdc58aa4bf7190406cd1a4106a3cb093f58d47a11528cf0aa0590da1feb5637c54f407d8a977a2bd8f7b498d813b5f4dbaf1fd158d306be4ce8294467a283cc4041bf55f5a8a159d5ded6c1cfa9ae518be83dbf873ef4bd58d17e01b8d7f007a467ffefc37c3ce6a0124f5f909b23495313541132b7bbb1d06b20c0cda56acb1fe1bb8954da5d02fc77177ca31340536676ffcd22b577b2d3fb92c06c3caa1529198638b2a4541fac6b1759a05488207ca617782d9d7dc57f986ce290497533db1cf2584e78157f9fb6cebda12ebeb92d928ee6770a9e6244ba0708059a41bace83666f7c63ea90f7006e63e38f66f8846d710c5f99faafdb3bde142784b5c152f077938587bc32ef849d97f4b35d6157719bb5769c73be09163fb3ec5a83b9c4422c88cd8f26122d32659b51c818dd714ae4e7ce881ab52fc67de101fc678464dc4a73cd06db2af85788752861983bb134d0235dc1cb88c0b9174d9a1f8d2c13fd28dc069ade5233c1b5ccef1a17a525375d9347bff1c9e5d8f43b4f4ed7d3da6ea2fd06ec8c6f086418ec7e0091a4a704771130e569fcc5d6e521677c7211a8f6042b54538c177e8897120ce29c5424c371aa269e36c8463df31aa980c1798ec09bac1b48ddc4837b0742363cf33fa884333e625502c713bd751794691409f6ad880c0210ecc570212edcca2db1ef7f2ae00328bf198e783439ccfa4d8f737d65d614a1227da0218ce07692b6613f2963e4f508dea5909195aca8b6bf1440cbfda7bb48fc4ef7c2308988da2ef31a4ef9418dff3c1ace94fe5021182950b247d3e1776eaba3cb86f3de97fedc8d1c32db0d39aaf7707a62c2f9d6ee7920586988682200438b0c902f51b2cbba8d55b90c7ca05405458d9d7f57cc340a89ea3e3f0e99d423bf6e1b9ad5b5e6b574c82c30ff95080132446477052e7e011aead81f393682a7b22dac234294ce484e24ad203e0617f03af7682b075d3d9d320bd399d2ef86f5944d6f5fd909c68e05e99b34d6adc1a8af65a429e61e9f44e2d1049690a2134be5fcc79370b62efeb19867c55e92ef7bde37f5abac87d5f16c6697589a74eded8010ccd55bffa2109727cb561b408b1ed5f4ef11cab817b57dd3cfc1221eae71c00888e03e0209547548263069849dece4fc5de39268174f71d280cb899667f4644fc6eaaed86935ffcfee2660b08f7a05187dd596a8348f9c15003298783c950191e5eb872e9e57a8c47c3050fd07c8b32499dc241764ba1ac17079f419031b9f1a56ec285456b4138a810541e471c532cc600ca31bc6eb7cfafc52f3f4231ab87e8f067dc71f0e876a1514832820c30409bdb8537a17fc0703eed63fd7302ac8bb7e8188ed8046b41819884e3760a97c9a0ccfac50fb3a67b70ecc9ce79ba7a50ad100e6d59d33fb68fdbb381d22f7e7eb83988daea692cbd510e4a7a2de17b5957cb3e20c78ba797d7fbf3136a7912f77d76425fa3d69b8b67048ed3821cb8ea92d195a4154ab9f03cee48bc9cf817076c745115e0cf257610586fb9e7eb43a0cd65a108c3851504bab21fed3565d3486f91e9c46d5780aac4e2c9aa298a59413060b0fb32105629ca32329a44d521e7473377272f8daa2be3917a2dab3a622624ae5f7d99388b603d32b68e21bbef985f70e28f0fad7ab3136b8090bb77442aba9dba62804a2d39cc85bf01121c9233faeea984e0139583d42aedee69428755a9e3096455c171ab3281d4c98055355c22705636ac4d690996b1d577fc308757414d32ab5d67e27bb6402d9297d4339b653d206b8c9d1baed4798549a7448e9ed21e1cd05c4ea485963ad7a54ef0200bf8801b732ff552ecb70b17cda0976fb3dcee42cef965696d289c9027aab62421e5688de0e6167348625a16aad29dd09318f0df52da6eb7769caa76d35fb52b274ed3f81724e0ea3c17634c869e36eb58696165cf851d67693640e3f0625b63259a631fb3b9f80a04aa0aabae12f995792437b99ba7901fadf9fe4d9f0c6417ffe65ed25af91f770f7c18c4d2e2dc940e66f40538aad8313126bffd06244ac07bf360ce5ae60c9b6b147b93195115f0af689581d2ebbf110a0517f6a4df10620dd3169dc5fcee797371419a2565f02fdea037bd0390848e6f17a01730f9bc6d373c58349ebf2590ed0c2d87c2b25859ccdeb8266606b5f17b4fb83747f716f242c6f8c07b1fe472a74bdac516806ac4dc097f7a8346937b2dd104c4b74ed962a9adf7e01cda4978c2af433e69e37dbef5c8a6034fcd3553453401b0bbdf33cc75eb6abca36ba534b3b826af0eaf3b58dc41a1102befbbe3c9852d8339b9363851155cd0bab8280e4fdccc2ff2d058fb9fa271a041dbdf79f7501b965f90391ba6380718dfa5b51637d2b4f101fd2a0601c7e83d0adc98a139a1d5ee9744454c36ca3bc06e422b1cc22ecfdaa137dc51ae7b09a6339ce7acac52b57ccf7c67c2a2e3998b9f5d04194e412475d7bd400585fdb08baec85623dd7b71c3c305d375f22221b29f3ac24fc1c93a972eb299f734230ce8390af762f3c15356df1ca9803cdc9d1d13b415a8e4affcf3925c02a65783ffaa6e811a32e60eb62165ac7245f565d53b039d7302a0597b8778431b263a6b18fd633e8797ec54a47d9df56b6fc40b7816f5332e42fef811368c0459704db0450f7ca3ffdc55e5d80338cf1fd3303beed470d2ba5a2046a688115d91e1ca103c694016880546c477be01c67d23a1b279252a98a7959b74dd1a1c948c770412ac48fa8d8f1d92f3415b190121ee20b7940191feb711e61257bbcd2f11a84f8836707f90a04ee447186f52f670fe8c3512f3f6beeabdc9661bcde4cedd9b86374732d1f8276c702e28a56dfd95218218679947d8b54baca6d549fa93596abf08d73dc7d5028e560045ecd25dd0745c7466e015ffe08bdfd13f84abaa938eeb3b0bcb6a2338e485e4bced911c38c2f7352db289bdab1ae2a9a986f29788518d50aeb233f5f15c357499b264e66fd84c0df65e641d078942f92c265ccfb7eb2cbd6cb9370494f1c44c9c3d96aa4a54e5aad72fa7a7f6070ca9d0947658f1e467de66296750535a19201aae112197b318e8e57cdf03cb657677c4ce871b9f8b4e2e223bb50954a999f66618f71fea25174d9d7cd6e47803f127829771800a94dc1b47f93b92f26ed74226da9654d2e5ea9264f0474d537eae778a8107c3bd580a3280f9005ada51181a055545e7011431957ed7c514a265cd103e2effe3ecd0d930920b55c3b2d32f223f6467d4dec47494c29c500a6743afacef7dc23d93c6ccc4cd5867d12119a157e032535d02ffde24936adba64af2709710d81a7f4768059db1a3af21f8bcde0905ba17a90dd4c3c965f3b113d379bd3c8a32efeca074012aa90c1b66c9bdd95788abfc83b1818370569e4a7622de395add87d09b01b863df011daed74695d66706c72ff8b02ac607de56f3c005fe3b0bbf6a6938deb7210c496cad68209e9306cc48af64de7eaed44a3c8e3254846addf001bc918348a51fca426ea3d20da72c64dabd62f63f0cde8a0c26d3f5eb54042d593b7c0758f9e6c401925b3fcf367f1b93ef1cd95b5c202b4d91fc6e83965286ef6b85a6262643a031c361412ed2159881c8366a5fccbeb6037f7d82adb8a35534c82570905a40bcddb787bf64c998a8a313ea47941d10045722f28808c593255dd39279605727a00773f4a6bbd1f21bd3a83b0d3f461416c842b24bfc8c2ae206a83777280153913373d1b063b6c26964e8559ec9a19957ac35562bf9e31b84d03f37267aafea80cb7a234c2173606818c6662a14c50478066836df275f97c0b922c2a2256b2d5e0d226149c536ea00e79adff708e7938ebcf447ab3a783413e9538f534560b817706de2529d730f2c9e20a5e124fc31f3aff0a99d061ecd480b196916fb9556b504295e5aa7ac0b1a65ead5f0acc284107350fa47b29189fadb46aedcdaa254fa223fb58a06988387efb783c3d49bbc1e13bf898b63d1d83060a480ffde6b314e236495061228172543388364847af127e3cc2951b6a4ede1b29d55209a76f5e845ceaacfc94c2da4a3e6f06f65f1c7087b05412eabcd53b9924a148f1fe206646a4df44de3b8218a31a44c78e89fc0472720085e4d79df044da364fa2bc5d8f1cab38ed2e2c466d1623dfa0c071bb65b59fc8d0859a2c1700227b34def10f04a9e05e92047065b416f272d8f71292ad9bb4e6fe59b7b8f2e1419541d8b80d90f82b5aec0e44568d3bdb077178049e0da79f3a50b242aa52f92bf876a339a234753075dcef88d35a2a5d0c1c72e9dd7c4c0b885cc4726ff53c27f39ac164cfb2398b4f42cde4ba1069d7753a7a9e16aa6f43e7e8fcbc9c39ce94a9f20b20a0f9772f4a07b01b41d669341cf838f27c2012a45c5e3cd08bdc1a473cb2f485afc4b94dd3652834160e28dda50fd2bdae481fc92dede88363d52fd4306dadff99a5f76732aa0ebab8e88fac89acd94b366a334188a093a34f045be831e511a42f3733bb10b7cefb79bd3c14da0f65902326e6ea77669a2a1c89a959767fec3370953a0149840fefab36c52ff457a925cb29dbb42335c99b083f7f2509245d95b5017111533d5f43dd8e7e7328bc3b52490eeffddda87241355c4696235c2db09cc72efb2b394455b75875f1a94dda246a800da6f84716508e3f9d2f6c5baa9bafd7995ddb85e0b14fa4dad06fd2642d425dd101bd74241db113efec586978764f022389e8934a699207a43a96357cc43af63b7f4c966c90b6ac3f59ecd5a8e47f2db758f1563768b4e200f6ddbc896e735e7fce17079b39cc7dbee73e6ac75cc547798bad63974f905d336e7fdf434bcd76dd4f8ae8f297b4257097c197eff10f051b9b70a3bef23ae822be9f8fb702eb56b1c6089b3ba33eb443920bfa7efa5443c572cc7bb5ff6dcceee64b92c656ea68583d130ea19d098645f72ad84e331699c493a5da10e41b05d404f8edd2ec06ffd367bb665812f081891594cf591bdec166ccfab2e99632ac67a4adc63e4587bc22377c99bb5cd3e462307f7c867dbf76f800cc24d64e5f6508fc4bda598e94fbe854adeb21603d79afa80cf60a666409209aca231b43eb85d27f9b1f37cb020ea4432dd8461c41428774fbd45bca075cb357ef61e8e940c869e3daa278d1f521ae8e7300cd43756871cd990a9808862d763e1710c7c710575ecfaac888081899557d937c34b642183102647b6591aad3d6e589349c9913d2e904458258d8e9e42ae808c6ee0b552393f06495cd44047bce30ff510613f367b24e3296eaa9e7dd2f96eb720bf611981e4c6dfd21246339f800a08e23c4214cffe8b050862ffbeac03a4124d89ab933475bb33a3d5602f21f735491093f0fca214e398d1b216fcd58bb46060f37f3530ceaf846f840603765f451a8598594264191e68de3e2e26edcaeb217f683a91d05eb76ca8eead8c9679ad29b2562478901fa94d2923c0419b10846ef60c7b27eccdd3289f403c80dbfbd214077f21747f0877d2da931bf43200be39e977ab51c5c6a17d938155c79d04121548f96b1b78f564fce82ef17957866d2191bdf7e9f53ab60fe9309842ee58280229ec875422f055f78459d9ae70322c2785f901ab154d759634985256dde8696ee5d87204fddba16297173ca09bc4da18b6f106fee8e58e53a57cad23187de465d780f467dcdef8ce10c6fd98471712920919687445b09803f93ce4bc73a1f1a9d376520222587c435e18736b096fe519f40b544df44960963b96ab48541ac0045373dbdff7cf1c294462b5326b12dde2d2306c448f150f485c3dce4bc766e9da2043e73fcf8d2c27e0b18defd81d31c38e2105af100b101379613c51b49f3d318849e96a42dbf5b2c21c1d25ad9e212055148df3b51f05412ddf0d5e666efa0e478b8d06ba10bc80fdc4532297bd29dc5e38b754c2aa118c7a1fabb60544b087cd02587862eb1ff2c03384f478d82f89b276fa4f47c02400e6e31877fa27d7d7f52fc0933f3033fa5928fb06294e1df961a3cc332de3c24cb8f23611b565106808054344333fece06fc4085373e3abf85108d83aecd78985bb91d8774f61d43ca17a2f7e38769c5e008c102b5a5879d27050894d3315aab128315e3652b51b3c9304d258a42d7bd5dca76323f6a3d6044a4389e786064f03c38558d352c8d5ee1013f7642288d1fb152ab9274183b5d2126ff6cac7f30b199ed274d6c70c6b222606aff24feb647dbd0bb578f5fa5ad6433ec9dc86038b21712f0e4bf19af28ff1c6eeff3da2681d20357ed5468f6afa6d7e5526ca3172c9072ed177172992ea760f01161fad206473a2ab071981341f10bb91e5f84adb5767e2b984662e05b2284b7486922f49b1f20d97749775f12ba7127001cf0ca8af147d986fa5db0798a9dde355198c7b7e7360967e29e5f7a2962fad52631ce4fd2906ae1714bfedc0be07371ff4dcd9e1a5b7e627076885dd075d4fad077d08978514e39ede18fed677db5d416579f73f9f483777fb17791fe4ded4485101d39809cfd31c37ae8a29ec1491f4c47f73b29256e3e9504a9d4bf8aef37dbeb0d00cef6d62213b4b370a3b5a0436e2bc91dc85f948f6a3cd67bc02757e3981c7d2294c20b3b8c785a3b93cbe7b145317efac114c1068f09b27c547e6f04f2321f3eb4665279afcae6789c957b3f3182ad6c186d9e993c4d2e3a63724778192905e4ff6613d2b57bebfd33ca1a4fce03e723063258c60d051aed599d3326667965cc62f66f5579aafe64cd257ecba5119ea6806136fb6612f649b2f5c705908e0a44d1ff55df651ddfd0ca23290be6f04820f7df006b542bafde29db376622120c9885e16875143adb344ef6a9e06f4985c74df4bce5ed9d4ebcc82bdcdbd2a301df2dc0dff01c14f4649d5ff939212f5037e5c08018a430d02818f31974be9e5f8c887cc177a51fe69bb78e73e1a9ff4de9cc704ca4f9aa5d4e4caaa3e0e82d8d2ea91119e60b00fe2eeecbeaf9abe9b6f174491cf4cdd1b62c97cbb7fce4dd8cae668d6270e8fc9a2ac86b57f10904d966d9b1cdcfc7ae28c22ee35f463df412151044b6396427126b134f1187667e9c9b03308bd32cc88335566df43eed5bac514a4e3c175782a4bac2ee77ed8b729fc69204bb114a58f39787d862dd76f72b5f4580b5ead94836befb504d45c8bdef127baf7837d0215710f6384b86949716cc4864ada8b4f0bfb8b09d26bd7da9e3af15bbe066d9ed9cd6570b61eb08fdc4472b9f83796471138279e944fc70d0153bd0e6ecca1335c67f5380e35d4980bfdcfe41f9f58b7dccff5cb7948b20efdf5ea04fbe18219e81eaabb9fc63734bba2fa56ac00570f4e990abdd696ae2e3227b0fb3ee4e7e0a11744f9437adf603af968ec036f597ba185e9a08d3fd206ea229e564d07500a95e7381cc961315ae34657dc833fa80c08afcde7e114b0cc7274e4e78cafe5cd9a05761b9e7275892f06bde73d56db59719b6f10238e625368825137b3290e9b6f902327402bb19b913a1be57f56b86df7140aa81605246638828c32a41574b973824789eed926afa25c2dc9917426e2d6cb520fd107ea1078f54ae9213d5cfadcd3932597db9c08beaf3e889d4fa61cc1bdf303a7734c144e6334bde936e7c5e869d87c14b57e1e6af74cf5d6ea389b73c7ccba49e32b9b1e0998644047b6497bd4647b7abd1a2b7620656c39daf6ca45ac25857b215f341b57d4cae357ec80630262ac783dab7e6342f4d15a58ece676e5a30604904a6aa06f03e46857d3f631137a2503c459032a7e8e805c30d659491bd6476d36a53e30432a746064503d35ec74a6bf46fbacf987d35da8718069a337ee22846add30225dcf271b3faecdeca1ccdce77ded1b5a40c301542c60f29e511665f5ffd09b78154d6c5d476b9b88904d24b2bbbb7b076d08fc077b0744d0268e34c1441349ae0ba0407975c87b481994dad04967a7c188f1dcbe1a7a7d01d8b86fd5394010b780c295de837eec71eb174c1dd339ee635a87006064d9cce8563fd33a04d0a97dd1b144cdd8407bff76b8f2930bb6d797bdf2af029d9ebeb2c0c361890e23d18d2ac73875accc9da923adc4c933554e5a4ea0b49c14110d4929a79c52d26a2fa6184f19b1b417631263599659d6f446b76dcab845a949bd719aec3627f0b996ec3ee94476252216cac2326564913f728824f22387c8221248fa2051a98244c54ad2110b491216122743427115796290b88a3c7148f4892a098b2a3c8a52ce49698d724e4a6bb5b45a7b2fc6d8c5189665396b59d634adb78dd35adcb4c8c51dbb2f850e234b0b6d699932b6b0b4b8b8985278e95a527059e14b0127caee45e3c40e436160a68c30261c65e43269852d5c4574a00c04e1faa1b35c4180b8880001072a1c21021f29e222e1460b38e8d11606d862954ec9bad142eb88b440ec0fb69ed8396c23ec2a5b0845767087ae561116b4866c1dba5a3cd14a4e8264a2c83d120211d7a14b08435408424208eaf1b52a842227176c053a3ec10cf6aa7f314960420b26b2c8a115830584000475b1c0c2114626951b00d549e5063f64031801c2144392a0f8210a252daef8a1c8094058810e4f381285e71563dd688109284c181d651823803e6bc81a78c77ebedd0d1fd0d1d1d1c1613f532865942fdb7c1c77cb1909882af49842876fd3a7c699e953e7d0e4471a2396a8191dd2e7409f2b1011041f0a044105270061e458441012466ad00155bed162c7d7820004218d1b27187184099c24c5d7a213253de20b141184c44dd2f3b06dff70108a9840d2a30d1bf08bd1341a6d48ff686878fa57d33fcc4491fe21a03771f384d68d09af94b2284af9cf842e1fcbe8d0e5a4e524a875440c6e90c10ff90433b8f9912ac2e5848912176c27495c4e7a10a79db556d5a641132070682284da264049f98bdd8d111bde18b1e14beea3ff9c734a89d17972615aa043f92486da9a73a658b084871896a880dc69812b76b6051396903a81d14b0951144a845aa0c4c80a94106955990e5d4b585da87f2b50a49ba31d1f721f10c28fca8ff65297b44be9d221a733524a29d7115de24947ec127eb1df7b71374286ecf596a7cc1dc4a1fd781c2cc804444a33168ccc596bd6add065b2cf293becac4eeb59b7a3c950bf07eef773ec768c582376fe0d69847ebedd08708f8ffd08623af61726eab8d1120cb4c336eb208edcd5c84f0fb19e3b8cfbec225627d735d329f1b511db62bf9d76194b4a29a553ea1418e1441599bce612492c4c50263ba85b153633c2d59e60ac0996b132db9728a22d118476e9d0b5840e5b4b87ae265a34c162377995e2671625432d1a0d5ce26713131d5eb62b305a16315915325887aea1d7cc4b87aea1d3d00d34d7d0102e86820ced7453872e259200237e7e97124f946862ead0d56407319a145123d3a14b891f32627afc0c00dda16b091401582225000090511383770fe3858bd2b6d9ee0ef9e6c8773d7690fed1601528d9e9f179e4d8b33a27d6b394524668b34169d3a4079998988fa17917c4f4a044500b9478010f4cae9c78f28f069ce0832d74c0e1093f30f141832194f0003d690152528cd2ca499da8780800132a7a000093570e326eb44053446c960e5d4c98b8c164073dc458a20a6e0414744f78be0910184bb05ee8e0878b223d344b049182d3123a0499d1a207192c7862627ebe7a606eb400594d5aab9798a72c1c3141a27f9045031e17263fb430d161c572a5a79405cfae0205dc0bc8d64488bec10ab4a12154908782ec9025018b4287273b3401b28315b89a14c1e352e2870f58f840a1836b8914d512a00ed3a1cb890f2e265acc40c2c89b33a8084537434cb91982851124a9d209d0a12b49928abb2883706743883d1fced0eaf6ad087e6a50bc42c4dd0831842575ecb30b08472e200c61f9ace5e55f64def42e315ade3afdb9e3e26b40e0e9dac358d15c4950498227899d3e9f6adcb67dde3eefd29679bd65fe86d476d6affdb6bdd50ec8cf9d4aaff1ef8413af70fc3b95b88e78a56ffecdd0eadc7f33b4baf6b0cfd0da5f750bb1cbbcd67dda6b6e4388ad711e3588fee63932af790e4c4993f9cc611e7e8c8b06f3d2f2f535fe995c5cb296cf5ab2962cdb72966d2d59966d39d35832cec2f259c792715cc671f5b9c71997e1cf6e84c030579223ae242a0cc3302c3ee64aa2a8635ae9b5dfb4dfbeb4fdfc1b73c3302c6a1caddb3fb5df3af47f3528736cf7db7d35e89ba155837cc0444d4a86359f8b559771d21a67b597e298ee436a2fc6329a6553c6acda18238c3a94d68bb12cd39ca78cd9befcdc97168ccec5b2ac693d65d42c8d63d26e8c31c2086f8cd8caa7cbcf418674f99a8f26d2e56f3f1ce5b82923b7d238a65e5943499c0cb14c504c2d168e49dfcf52332599aa98ac9892a209e97bd9d13121c51f202245807e8e04fd44ec5f885ea0bc14bd10bdb4e88bd1cb8bf297968e6a8747a51364451feaf9394a3927a59896695bc31a06a34d18058a0e7fbe620c78e8f0e72a32e1071d623289123ac4b387203afcf813450cf0c63e84a71fcc2c61660819283238c4e000868abf93d24d6b0f678d19f9e9075dbe9d73ce2ca1cbaf599637ad65999b19a2cbc7b04d6b589681d2e5532e8343ecf35e2d6777c6e0a0cb97d65a6b2d0c15b1babc6082648bc562b158acd56ab55aadba7c9797cbcbe5e5f27279b9bc768985a5a5c5057f7631bdd0979729e30ba6b1b4d2b424c192050b91d2104a3f60942ebfe62c7f78e8f2698629a574b624c19245976f5988c8d2104a3f764bfe000509b1867e582c168bd5daaddddaadddda2de8a2419349832f104683d6853661ecdd06ee884d8a2d88561263d0e5d34c6b996e1bbafc89d1989867714774f912e70cf3c93729baac5acee616442bd12ba424a9a35afd98904c482624139209c984d4e5eb955ee9955ee9955e6933790979880c4adb5f9e739f7b4ec3a0c9fbfaa5c6526e58fb80f1d5f7a5d6589debaea9e3aa24e9bf6f7517f74f98c7dca754190ff61535ce8bcef990f160ed9758f297e2a67feb89de7c9ebf1e74c6061019cfc19e0b8ada01a5d7fc8b18c7f9d0ed971d717f5ffb1955577d31a86b0fd3bd741a73380ab73955c7bfdd544faa27a54af5d8d48a439236f6b38eab226decc721a57a5c7eb6843902abd3cf424628f24aea2b74e87a0d75230c29020f455debf5e37b432e2988f40474e88a824a8f0249b7e9d01545901e85939ebbe6f974dcf3a679abacc61863dc3e7a59e360f5ad10cf27d3392acc8fbd8bfc70d6a8413230a6969226adb5f97bc89cf835f4bab50bb3636bed6b12f39cba350c19fe5c3f7ecd40b00601ab0f524a5c1f6a8d3ba07ead41967f3bf22fa6d6a0ca3fda7dbbfba0a186a87d26e8f535ee11e939fa6be8b5fb668fdd85c63d1c1f736f087eabb9e039f8350c2fdeca5a5f68fc9e4f6ff9af02c1af4060fdaa82372fbe72aaf1ebff78d817b4e5271811672f2ee6f7e9691ce0427c6f2551f2ed7b41a257df72d96bb55f0ff9793e1acfb1af3f6b18b42867f6c7bcd0bc4b7e99eb671aff22a661d06a7d9afaa7fabb3e577394d91bea60741b898d5df3d7af9fbbf837e60bd85d74dad374a76e771df456d94b867f3886c3f06fbf7013ff625c780bff60b0e46a79d4c8527aa9716ccf5eb3c69ed92bab2a5149e2c7726ee9bfd243fd422cf113fefab1af660d1b8e7fd8c62666af3acd2afb557ffdecb7aeaa348ef6399a7f4f350c5ad7de66d6a840809408c207ca03ff78548d7f21f0d1ed676fe509891ef47cfa16da48b650a7967b42a20ad54413659c8821b6e494d55a6bb4b3d82d6badb5d65a6ba9ecac0a13884e20a484edc3cfa662b79e40d2c95fec32ab53ce70c19675524a3569eb97c07ea9535aa9853df69710c0e876a6db986e615e14d0338665a85e6567eab45216728fb647dae3ec02e8794a1967b6c5e71d6a1d19c59a1c40c7b20340c71de3189d77d8a4e73ca78c31c60873b6cd4fa25fad23eb184b8b558ae11653ac38d19a82c594d71429535c53964ce1c194235fccce96b2c594266011a7bce41429738a6bca121e4c39d2c3942114f3c829278898942d7adcc15e6ba5d820059814a014e0225b8a0d3f2c147edc68c1da2a39c4bcb5d65a6badb5d65a6badb5d65a18ec0fb27ad8529c4899424a51ff56d002762b4416668dece1c4d8eba8753bf97f601c3b46e6c5af7dee220eacc35d8434eecf4e421af763d7afc4a18d00cfaed471f71d5441beed62c000c01972c6a7429770865cc0bfa50f2bee28a411f3ad5dc470601c1747c65aee2c8e8a23675aee288e9cb5dc4d1c59bb5ab64117dced9eb186753771e44cd39dc491738432d38d6e2e7246d453424d37dd6538b4ac35bd652eef08e5a61bfdace76ecb2e77db516913b9ec622c1dfb504410122c3d8825237207a00e5d4ef8f4b9828e75c0b3c70955b781d2daa16b8a1521b2b77ae2f544eb0916920e5d4f14792208f984cf7c224887ae2776fad77558b445519522a322a2a221a1688b80260c341f6e0df2e1a21f5ad14e872e27aa3841c58915a61071820804f14aa730c85e8f0da400f56ce892e223650729394c293650281055b144585ca223ec4054d4a18bc849efd045d40322a11e77874440fda344437a7c8ae12b93c81e4f8c73ce39618c4872b0ba9456747a7d796447561e8cf1c517637c31c6f8628cf1c517637cf195b4da4bedc518c6b28cb59ad5ace94cab9aae9a56bb2feed4fadbce0625aa6afdbdb55abf246db5d5566c6b8dadb6625bbf7eec2149109144271f6040972f19305b883c35861b318834f2e15304a9f8f8f97cacba8c52ce49698d724e4a6bb5b45a7b2fc6d8c5189665396b59d634adb78dc3d7765f0d4696e334bb6da9a459167c6bf7ad504d26adbebc681506e38e65855ebfc5a8d77739c2dd97028e49c3dd67a3d77fa901a9cb7bbf1a5ebdd620d4e57f71a8174048d4894205baa2587111f1c42fc268071f7420c40db6d89982a7095454d1c288ec83285644b98215a54914564d9c3a58e707082b66800d38a000c8106e5022ca0b7c40c41278d0041e9ac880aa2ec6517ea23c20c39ac96f5cb0bfdaea998e8672525a390c69d0a755870d0efd12b4810f75b8481bf8dc739be7da411a50c7b083030e55eb889006cd58b33a077dfc19c3b29cb5ec6a08b03067d08799c6c93af7396b5143808bd17404740efaf9a7e6b8fddc2e614803624803af90354ed6f7674d8b1a027b6b1d013c67c0fd79d3a6ce41f77e4de370bf39ae23c3b40e9ae19bd96c2b3d0b879006fd12ff44d03787dce3ce6dfc66c8ce897f636a8975f8598775b8bb954fdeea30868f52cc82305d4480d2a16b08500ad0a16b083f7dcb107bbed98d0ffb5ed38f96d9d0e7df8e6b411ad5868aabe55c7d7e66bac2bf6a4397913e0cf2f482845d6a1da6ceb5208dc965fba745316cfff4f9f8f6cffee9851cfc9d5ce8d8e905fcd8633ce7f2aac34f2ef4fbb0736a428a22df0cd9f4e1674e86fa33ea9b1f76fd793364cb9b211a07d2188b80f1c205cd69462606e6c5e4628b5a584a9b12e136ade50cc348aead14ca191c89b28aa2ead04584a44e042510c14802743f7639020a0fa01c8192040a0cfa075b46a008a902ca0a0acf4e112b7c9e2ca17f31503c8142c81329373c69e249107080b2b3458458dacc19f91412b11f35354f7cd06f0d1146f4e019e4709f08a1b23544dcfb8405fdd610f1a4873ec10108035a98e2898e951ddba1eb8912190a127ed4103185eade7b59b062d70e5d4dbc9eb8a1892c6810b11f35354d0cd1efac21a28916f45b43040afaad21a2899d9a2c2c2c92857bcd229fd32f75a954fadc95a494527a3bd8f8f5a63fbe765d01c5750590969cab0a2b3d7b4d73dcf6bafb78549ffe692fe54bc941c9bfa8bbfd53fbc84fff7da97548d9a1a783bd6ddfb7eed39c47f5f139f2f961820b2088573aa7235ef94df10860f40a04475ef83be09cf1b4de5a55381107b640a59014924252480a492129e4803be79c73524a29a5b5d65aadb5f6de8bb190f484e4e4736a1d35481f5566377837f08e701e0e788c31c60883a9cf979452ca3be79cd3524a69ad15beb5d3c38187831d1fba203975c1f2aa43e7eb70d1290daaf13a21bf84120565d63ab23c3fd22d2bc66901762d7badbbfa0481d26fbfa3c4339e3df7f96ef66fc8fa9aaeaa9e7947ec8c7fd863b9cb78545e5590c6dcaa4f9f40fafc1aa88f4cce23f85049b1a73cb5c258d7434581523ca99e8c950d654173c67c9b25e9f36f26d42b500d80523d35c85a545a1bf22a48a2229594c3ebf9489b4b65a434d2ceca2ed6ac93557dfe0d9977faf48cb8c81a34fc781c9e907880f8f337af39acad4676a515e755918ae4f3d52155356b6c3106630d138939c87621627fb5b55bb3460d0a6a05b5825a42ec1cfc15071d91284c08092bc9109652fd645d2502f44344a2322018d04a84d65410186cfbb1fe007942ec186fc5329aa57a52ab1651500b4a51aa274ba9b254cfeb0ee3987f511593eaa94819d2fc1a2451541ee931f21839a443c01ef38d1ed0fe2ad27c8c9190bc20760ef635d716942289ca2f89aaa878c43f1ff7a1ced15bbd403bc66fcc9a44da0cd521899290566f085a87f4f85e0cb6fd2189faa217c48e56240ad3b13b12a59228ec82d6bfd83f4f485401e33ea068cdaf491549a2a00b8aa13ebf5691a858adf4f9517b42a20a913e0cb5d748ebccb7ed2a1322e288816282d83e60ab3367d8c7da638e7d604f88e71329f6843c52b7415091a8b7bf8f24ea771589c23cbe240a49a29224eab791f5841475fb5e14fbab42dd3ed44e2c7ce33c1d95deeacc1a3968ceb06ff18ed9ffc1b016a8db123ff90461d86ffec1e0f8178305a9884c479086fd132bc3e8f927ff60e4cbbf0d4fac6e4f47ddbec7846dffdbafdc7da62abafdecdbaf6e4f3e746b751e69cb61ce39affd7b398ec316637cb77b31c6b82785b19df7de7931c6f8ce0923a8c7fb75ef48948e44ddcd235138b5e292244ab55712f59c9578314ed2e37b50ecaf6e333238e96c1d7e25f4982d6bc6076a1d2f3afe1b328a126458d97f79c8a43367c4dff9bf1919b800411af1a4d3e37b59ecf81f97d4677e4c2a17199856323fe8f1084650cec10c62ce7a7fce39a727c49362c71823fd0ac3bdf70af17ca8ce71abcd6123bd9e8f44dd6bb12724466fe509c1d99027c5ae9e8f27a4bead1912ae42deabb57ea8b5fe942ad2dfb66df22f760dc3be34d6578f31474a95e2b13687a53ac78c114a944ea9523c30b592289bbb4ea960e784e60cac6dff5519748cffd5f1674f889d63bf76fc485440e9596a58a270dc3112851f738c33d49ed1b6ff65413a5e50fc1c13db652a9874fcd3da68ff45871a47bf7dc19bfbf8b7ce06101b52d1e76336cb3428a8e3c7d5676a1dfa617416bc8141599dee3469833956c79fbb6f77fa838e1f0bea98db10624f1a78b7f4aded5e9ad498e839e7dcaab49b94deca0b223d2259e334ed3729e5a66d766aa9bd0ef28478423c215628a7861eebad75abbf5d7c2d967da66d9bb67d8a273524276b5af65a7b9d452ee7d7369d7d53975e6f9afe52b7b38f87a6cd2d6bafb596c98c43aca310f3ef5ade3779896cba6ddb56e9bdb75efcdbf57c3c1f4fc86fb3446910ba7da9cbe12ee577fbd2fdd24629c7fda5a5cbb7ba9f7f21f0f1d5cdb7a7ef09e13a4f485461f38478423c215cbc3924e902e8d045854fa742d5230f1dbaa6a8421f3fcc258ee3b89c2f7b1b63bdf86ffd1eb25b9c7fc686101956f5df90a99e3bf773a512572addcfd9389612e7b8cdfdbe250e82d94b5f0d3d27c2b03df73764e97bc81eb9df746f0e4469bf4b4b867df6b95ae25f087c7c56a873bfe3873bcd5f7feb387c21f7ccbf0ce32e7ff3759136d156ae71f26631f5fc9be2b9fadeabf5d5fade8b69fdf752ad756a75b5d6586774465fec3ea6f9966efebb71ad69f9de8cf7a01d4bf5acee15a3a339edf79079ce298cba013a744d1134e77c29679f1304b34bea83861abcd594f369ec608c543e1d42239de2c728c90610db669923f917b39c61d745ab41968a154ead28c613538c53ab2cb5c218e3c71ece1a1bce19cfd26955cfcf7dbab46d97ed6319c7523da99e544faa67b5497b83144552d4583bbf23ea07e8d06544a4c7fe45fe490dd7f915de2e0704344cedc2ecb546f8d1de437ed1a74fa3203d001dbaa4a0d2f3d5ec85f7670dea19ffc9713e1f3918ffe29cf527cf8937f7cabff8747289456ac59662a5562e3fdd7ed6b487f9978ffcabfcf22f6a8d936ffc942ad5935a659de346fdf95bf45720125562c915487d71dce55243ba9ced6be811b77cc638a54af1702d2e8fff86bcd99bde857fb26f6fe2a955bff4bb37c6c8f19cecb78fdcbc57dfc7fa3e4e0de99fc6b793997e0e3ff7a534e65e63fea5565dbfccb0cca494327e3166596ab15b97ed3ee65fcc9ee327d3eb977ff9e7c2fd944aa2e4e34ff144ef3ee6dcfd2fb54aadb6c6099ee7799e943e7e8e9092f0935a61b183842c1280042324245804394589692c7d4c63a9b57cc634b1bf4a1445038c86e66580b499fb28e986b499bb481aedcb6d48f9f28cb0bfad7348ae499b1a9b6813491494f6b5a9b4919456a1d401f73ff9564e18ee7f37543e5dfe0b1afb7213cd18dd87bf1de33d91d248a264d1ab52a948336af8c58baf3ac70b1a1a1a1a3b338331a639c28c6950e3e4af12e5cfb448538d728e35319ecedf3af9b5755e7c628c18cff9d77c0da7a1e6797e55226a7afdeced7b7951f5d9f233432f3e2f435e7e5e88bca8f44fad6241a2287f4ae98d41344f3f22a1d4f492a88f0593914451131589ea7e726f52cdd726da451245f3f3f76b1bf9bc788ce7bf23c673fe316a3ec6c7e034c4f81aaa6352411a73fff7e243d3eda2dbedd736923652ebe6ada617bc913fdf74346bc4807918f3dfec2f0fa729e65f384df7f9e8349faff63438c6f842ca1793a6b341637427f9fc637c4d778200ff187f927c07ff18a71d35326864d474313ade51ce42cc5e9046c63b4ce7d845d2663ea6379111fbab4432ff6da22e331367f6cc9d99a1f94d3423fff0befc8bc12f5ee47061ed7d1a1811c68bbf2f9e76df07fa0b9677d1953ed339581e3f4df7d9747ceabeeaa392e9b4eeab4060baaffe00f9ea8fcb8bcf8b4f89e823ea26a33ee76754d3b1678c6213a39bbd17d680a71f18925f69e5a9bd27f6a7cd54a059a30a5596c4da738f83feed4d6044be09b4e7feeadffe6acffd0eed39be43ff46a3ce8131fe9ac9a00f744af10402c08afea7499a81bf9ff367195f731a3a0d9d86628d8cc75e5a128629697b69c5aefb1dff9d8cffaff99f41daa40663c6d37ffff2d9ba1876647ccd67af08f62df01fe32dd03d7f1318d951f3fc4d20839fe6c7f8ff186f821a7eb21c0231feff34f98e187fdaf1dd738e7d963651e7a82aef883da5dc7c74d96941df07baf637a696e1fdec973f99923a6df957b9fc89e854747a9d8c4c49a6a7a6a40c6c007b3c6bfc6398c4b089611f8f44242955aa07937124511f7cc9a02251988c2a12f5e229cccb88f97f693f31a5272256970fbbffdfd1fdff4bce77f0efbee33474cfb90f1c72c2fcf7d292b1823468cc7f27a27f491bfa5af7467ff454a48d8c2319482efe9b7d4686e667302c4fed4537adb516d37803d206c32437b54c44f389cdf2a616bc914fdf44346b744f399a871065878036f45d4c3bf917a3ea3a3c67e47f3b04a4f6273fddefa2fb66a7e15f0592757b68f799eeab4064baaffec474dffdeb33759f0c2a9dbe4bc7d27ddac763973a1a3a12489b287a50893c3c28f6bf1ea9d391a8f99e131bce19704812edcf02c98003fbfc4b658d7ff89f56a3fb6fc760fb5da7c919df4139237e545d0b3467d0977bc80259200b64812cd08daaa8028a3c2b890a626db4402fba8c1511f667813e18e3c4feeffedb43ff82baeb641ccd19f41fa953192b226c208992424312851fb3456c903d629158964d2251925369036570c0fc0fe32e5e14f55f328ee08d859ae61ec21a2722195c98ff7940dad0bf5f54eda14eff44249f9e88f4890846978f9d88ba05eaf4935145a71f2d9771e40d617f99c56ae59744e124434e321489ca44b948a224ef9aa5d603d286bed11195af92f456246af20d481bfa300332c4fe451db74bfe2f4883267dffeaf4ad9e4f02f954d248e9661fc64837fbf2350f5401c08a46026005af3e6d9f339f4d67ea587868b76046f45ba9ea1c2c9f69b7a3dea512f62c33e68cca98332aabce51d238db36bdcbef307117bea38543ad0304f1ca5755de115bce90d4e3b3f8e891e5659775df077ac5bed471ffd5a01cb8d3dd877bb5c9199531773680c8a88c5193f26b3da26b90b489ef19b1e3dbc71fffdefb3680a899d7cf38e595470dc262b769f6da524b82174512326b6bedb0b7134ec8eba775e841b17794add9e8943e02ae4b0c4d8d4d0a54839408cf5e3ffbcb5efdbfeca392cf0df90c91a89a89a8a691aac6ced9df788f481492d8ef5d65afcc283ba21205fb4c056fe257a222239decf3ea31fb1df9334e8391cb3f1cf937676781e864aa9f4ee45389a44d91b47949af6867f233a49e2575a9718ed85f0cea58557df4c8a3aa7a9d1ff70fbe21c31a38e4b560010fecd8400362c040063c29fbf24ff3a6ecf8106768536c39b798129bfe9450f607873c28fbfb39776c40a226a70d8841a22aec94d22e056ae177786535423ee1c89ff433fd537c1f1df21048aec305d7e1422ee15eafba0409c92e4142ba4b962cc14b2eb6042fc996689c483f6b2963d4c253e229f194784a3c25d8122e335ed1fe32211924f41c6bd6a8aa3963fe6ae5e3f353815c7c84b823eec8c5873bc25eaa8984820c6b3e2ea8cfcf9e13bbbe9dc1f66595582b0322fa01fa01ca806806d4e7474eabe48294f8a0073de8410e0f092504f1606b6d7fd6b8bcbd1682b83d24b6c6fdd634fd59dbb4bd7d49d33e8d7b486c1c76eeb52d731e9cc673f467bdf7f678e021e121e121315fa236032a41ae30a2f66bfdfcd107eb629fc17f31ff6638eaf7af8f1541cba7fec81c582c168bc562b1582c168bc562b1582c168bc562b1582c168bc562b1582c162bc9dbc1b6e228bbc2a767af5da1b20209cb6753ccc3e8e73a99d73a195f5b51a4eb7f19e2b282a788ab0a22322ff9c743bec5895734eee5732f5fdb2fd37d1b17f3325cccdf90bafbb8df5c9379fd1c274fdb6bc9bfd3f6cd70d4e57f331c75fdb0cf70d4bf2de665b80d2176cc6f9e13f3323ce7e5350fd97d5c0c87d2c6f41a7f79f8302dfac5c4f2f535ff5c5a5aa40ca105a8c4edb556b9848a46000010006316000028140c888342b120c9d23cadba0314800e7a884e5e4a998a24c22046611405710c62c6180200218410119a199a150016746f29383d0d840dc709ec8cf6838b134d1662ae6aebdac3757f84124e5012adbefda5b5c71de54d05c286ab9b3ecfb47f2327e615f4b7d6dc88bf4d14a6afbcf4e5af7fb417f7665a5fe48f5a062b9e70983c97fed46c03ddd643afbd4047f261326e27ecde9414704ac0d2283dcb3b98616210d049210816bea8a0a1882156a616c4b7f18cba3e07fbf48a50062aeba67dbedeed8493ae7b00a2ea99e4a39430300d02116bb548e5f2f0ff7610117965a0b09048557824061c4367148e4c481a18158ebdbda96bbe9cddc0fad2db5518a617674b122d490195f8765d2c227938a6f93a090cf5d220110d8a50d8c9492b3d2e0732f7665f6749e320168770424e02df44fd78f7e6bf6e64d97e2ad8cefc94ef6f79a5bf58961dcb8b5fa33efc2e7da567bdae2b756f158725c963d737c71dbf14aca4d8156e7aa2ba17fe86b48dd4cf9086b32a7edffea193a8b38b2f95a063568b29cad0b0e4ba770c1f13a2a8527e488870b7b1f1ffe46c0879ed63a7e0b110826cc8cd794daf946ddc097a15f0a6c2b0e0503c6d4429d07d84f9cb85f8f5470f83eb019a824d3ccb0758ecd01f6fccf2f077ddab530c3022563f46787999e8ff633a1b1327debe9fdad829d0a2faab44fc1c6c4ab3cac76c1aef87973a452b43812fd9d1712f7c1a983510e740f76e26f5fe90dc425ea7cf30e6eaef343327a2322db876fb62b1e4f3809f0666406981e73f27b374ef8b902a6e105efb7d8c869a8f3454a1647c64724a66f9606559e793819d87ef044cd152a4814dec59c955068c7d729aef69c87e562092e757c3cb0e28680ee3a16a90cd9b7b246c01b316e91d9a3df33d3fd248ff54808398b0ff496967f5bc6e853d12c0aa6e1681c5f38b2dd90798eda3637925d441b822d86280c186379ef000830570b9a10053a0d82d91f83b05a093df6409d501de73fee9cfcf6292d0a6a85c6f2f6f7f6c20f0fd2c7e09f436fd0a32fab4a167e32108428061bf1d7e0f30521820605a75fff368a5f8be7f94dde7bf90298969b9d7ab504048ad1a617a814fe3a1e4e24d1970a1bd9363f2e0d4a6b7db2b55e2b3c0d773bb1180809303791de6dfc0e4712f81c0278e140be549303d336a1f842cafbc1b087c4506bd0217987314f0a3fef6047de30a5348c188cb4957dd57059d34179510f5adbf74a1e26c121025f251872e8256d3dee55f187fbe247ea03eced85e72f379ede6c655353d18cc5975319ea151d34ffd24ee1483299fb71444a652a83a778099ebab75ee4d3e2061d40c99aa8228846ebc215f2174e1a7ea319e614f8dba0117f0b0d4ba559d590da289310774ff8198b561c4571c59edbe16ff5cf2ea0f5a0280b362242c9a6f93710677affc80a587970cfe175e50f6d335d158534858600a2286a29e39530b8416be068029be67f53d69ed025b440865c11085050beec8cea6c05137622435c361b482ae4d672d7d5945addc570683b0e40395ea592b28aad340b842e2b1b9f93068fd02ebcddb89e24bedb69e2372142b10c3296c918771d9d075bf5c37ea8cf0b97aceeb6fd3c97733ce8773c3c932239135099563803d683b855aa67e5e1d58184fca3544226bd5e3e9e8830dd24f4c155a8db17e30deca4cc48dd6afa301c7d95e6cab039346aa44ff06d560525bed1bd4c75c158ce9a65cee7c98220c11971ae640471531d610ed4fdcf8e1c2d8e704d449931ead47118893c3f4016264d8a134806f3010c29a3316f4c5c8ace1c06f79eb219163f9c68a477fb1acace17d170768ec8056cfd71a551791b2e5705d62fdb226de8127662e3ed264466b587846c24b2a7116f58bf6e0db4e1c99321f1958980e6d81bade5450b942c4ac969590f926bf847774771d313914a308005eab2cd6aab57dacd5f5fc0ead8a5b7a78036a0fdbeadc8acf5a884771052f19c27796dfe4c4a95b04220b03bd88d7be24a0b27711c05bbcc836ae40011392dc2e22ab0a89fbbec0d936429ecedcfcead7ca18202f3bf4c920b62d44e387bb6be47de0dd71e2eefc84124413710309570143efc45cedce0117372179a2a80f64e2d57face0223f4666a1ddaa857dc2bbfe5ffe9f59732a92bc9c7c22a04ea233c8d11f2ddef343e9f6538f70311e48ff3d1d1a81f8540e5dd4694a5cbf13dc841fb3c86342b49c2c0b0515f6b0ca6488a2d3cd8b6a23fa1e82349c0bfc137d435b57f05d2c539bfc6b27f08703ef0ea147a35c13bf4c3a7fa7ec901a667755c273c94445652b6cce154df5020ec86b2556189d42bc4df0f5f03333a3d3e2dcf2a17fabc5aee8104ba83fbcd5cc2ee539e6120cec9b36eccf876e0aa967c24880f8cd5f151ce5538effc77d6d48c2c4923fb1805603c8eeb0288081885b67b89e8b5fbf4217ab1afd4ddf1baefdd036f6c1e195d9fdab1262d34c8b255ea0bd8641a2bb5a62f631ff7aafcdfa36821cdba46f0769c7978348994f884fa4f667179568557871518c1f03f83c036fcfc3118d572c2e0f25f8c09ee212bd9dc5eb96b37ef1bcf5ba122bbf7656a7708131afa8d82ba5a6c766f3cea2070a36eb498215551be26d8f2cf851b1aebdfba68c6ca7c4fae74a83059cee8fc3d1c939f7e3a27d8732d2823a8a41eb8484142936e7c4295238706d9c32ffe589453b40abe4113e408237d41740a2ae223a8af0c526770381940fc45cc879181f6d545de69e87e0658bcff7b41d32d19a81473beeb959f80a5ddb120777e8753b4bc7b42fca70813f52cd3c01e5da42a19eab6dcc5b8dcae70b37848b804a5a5442da01a38101885cd8d00c3c78d36d2cf53c5d81b45f809a1f89ae0f2e72c3a0838ec8c0056dad64797b876244f6d3d9ebd9296d713ec88a17fe86b26dccb145ba693af40ea1951107901ce8cf93d65479ff394f8fa740cec2fadbb8eef0316b4218d0d7a8df02199834a11441e213d9df48b39654cdee648f815701b66877f99b7590ec7e73b766932078292d4ef9a7ba5e0db1bb8dcf088e48ca33680d4d5beac44062ccc316703691015f00915678911d056faa79a5b178c494d43a58e6b926ba2db91940f04a999b4b162dbf8988df8e077ee10678f6cc3bfeafe28c00f6b1d5742d997e0695f70d2f0968f72ebedf55ed870c95ba78bad2aecdec7110be19ec12e0c916bf4564540abf7848b9367a7245b67f38ca5f7f15e6aa980f11cb7256e44a08832cf488d17c9a7765f1926744c8924b8e0cd239d1cc860dd166a6db4332c2efc46f0da7d7cd89062a122235f82f4346cf55f9b138a3c2b4e9fcea88077bfb1b08f93ee1d93676af5a59f7b7b32cd9e8a94b9e01969e50494dbf33a8cfe238395ee058f9efeb02ae94524e6479022294fefed7a8f9c58f10b582eb8d57280112c30b0d6620ef761c0e4d86a4ddaf45770b0b660ff5535fa75d29ddad0d08c8a511d0d70626217072c4900fbe0191a1fcfd0d82f288cbffc656ee76f1dc67d60143acac0929229449b00b8f1478acff452d1051597a57a306a790c0c5d9405d880940da9c7594276c55df5a7aec41fe5f1f8bc9f5df679d93a8d8ad4189418a65bbbc632fd630ef78ac2aa91ae8d4b061351b94f3b1fef4f31e5052b9f2e48b7c64032d7b008670d064073f1509a2c7204a658084364ffca156da6580762318384307be631d2f8f1d28d26d37d44a1e8ab5cef2a8eb8507bc6e6080074ad4be7ecdd960614e03eb8f1781abd5d859454be80236cbe3aca9aa3c3e654e56c841f24aa756a1f0e40ef5293920cc896b2e6b96f7ce652f2bc85a6f88b3122dab401456586557aa865504975a42f13ae8ddb0ec542b4234aabdeaf8068e079e5ca6102ad401434113a9b835078490b466c4e71546814bf8dc2f1aa44c3260f9278f063e542083b7ef790ee48184e0e26977074ab612b4aef0c209fdad25a4fd14f8e0959a97953b90701d99214726c947d2a8c5ed4c1841cd99c49b82df9f586787a40157709a83db960a871ad5f04304650b3fba464e1d2dd31bcae22a3a6c58caf20c44eb8f772f8aff0b05d62e01d3d3159eff36710fecb601110fb761d5207854a3b82f70d3deee36a7b68fc43ef2f7c16656a2a95ea2265005a94c1554eab1362196743455ff3ee472faeee4afb63ab62fadeebac6b9077a9f218aa228e0be8e28edfaae5fe13a7a16cf0fae1641c45da46e33d62537b9be7dc6f8241d57f2489d38617e22c6c0aff4237956865d8c7ed1952ff8ea3cc8e3ae44b007cba3c9bf9d209b83e4e15c801d251cbac5c57bcd6b4e0f7118a21a56771264921b3826c820d17ee9abd924e7cac946515e690953e0853856d2660f52025ecd66d85c5f89e7308d37f71a97e9a6ae47cc98f922cf340576edafc4a889176df848dcdd247568ab9c84babebf072f218bf3edafdeaf8111ac3db6aa62e9ffa18109ed15052aa54dab132a1dafabbb9542b219cb40a043854953603d3de10f8e0a4ac977009936ccec845e87d586590c79702c387aa2470da9b359e9193997ce8f166c4a9d403830853b85b4ef643ae7db2ac0235f962b3583cac655662c196622b3c8e9f24932a5b36155dc4709f8779c399594d5c22ed6e3b5e43b09d6b590e666a7866e2b9bd7f1b646125c07daa5d011a7074fa5eb18979be52876be147c248ec3ae45cffd5cefb2119cf2d9b29c7e850afd7273faee26f49211afa0e87189c31df7ebcf11f92af03b5eb2044d728e084f2cad67159f067ad5d34e3108b13008a2f0c23e03e79dc37aed53eb30181435c31f6e27f7a530608ecc0eee2a0be3cd01fe2cf6df5a64a038f85a9bdf8912706ea56cdeea893fc40e4b4ded585c3aa3e5a665d9147362f23ea2848117105a485fe83c27474d3b25121bc8df972e74bb3d0d58184946e62f2c0322ae155dbd9f43e7a12e96e7790cc4ad1e2fe6db5d2c9791cdc458190579325a7224fded9e77bb099b17b7fd908563270ade1c180c4672bf94af64731434498390386d50ddf3f31a7ecf4d8fe8e34b73abbc178b07d9b5370383420e690b7a4b897269e7d6183d1180c7b65d8516edce37d2bf2b30b7036f1d111deb26daae7a805632821038e794dd4b22a81fbc84e3788f9722eccb2e81ef6847db888e1125002970572b1ad015ed08ccea71d72a141f39c41ae2d7d9341a83710d4ad3fdb4c2259c3ffee26a6c815d8dc86737d00f81c392dcb3ca2a85f5608bd5e22799e5beb40c5a8a2e140cd6f50fc8f0c73af029527a64b07b4f4cf0046f50c2331f73162ba1b592f4e3aa2cb87e62eacd8506468de3900ccccbad44eb0f009594cc43e3177d8234fa5d756167c548ef7885b38f1c1c93c3cbc6457548f7b485ab55dadd36467d3fd106d49cc335322b2ace62d7d7442ebe8a639442aa5eed34b82f5bd6ac0a85bdd0b95daf4affca92d65346962b5facfb452ea0fcfc6c7e42ecfb19e7c8b8f0a8948a264514951901e0836ac28ce1719e238e45110ac7d5c05bf6ca6d8025c31a12935efc5d1983b893c94c616615443d8ad994bbbe7db4b103c74195ae20a9f55dd62cfe1a3d9baa3a42b29f5b8acad78d217927eeff1ec31d13e8c5bfbe22df6f93fe57bb7da7b6bc4d86eb46f5982b6f251595b9133533189bbdd6dbb0c79bbfe6c144285895ee87ccdd911424c8a4d6239b51946f3addc948af972993f27d22e9fd2457c18b8cdc60b4e02dba79c7376ad74e9d4f2181a84ff0f0524b14c8d9a558c005614cba3cae1c407d90d213a8814c064e5baa8a32e6568ccb353dd57d89fbdb881038ffb24846ffea6d2b65eff1a3ad42c17d1829b14ed48cc50b966a14074e9afdbc20f21f88d957bb7909343c3077e0c4adad665a1714d0d62b4450dfad113c9b3e7b19c8fcfebb3ccea3190cb80875199a7f3bb9d50910b6ce202c316a96101258c1dd4bcafb75663ec5964eb8547e9169ba93e970b58d0ad3d07468c5afe9961717339f4b4bcc7d3d6c969340ec9a4ef3924511c9519d1542562f364b67f5ca19e39cc1995f57c2ba6e665dd37965e32dfbe08d4bb0e93210a77f65a9952781d54772764b72ad8c5290c5ed2fa19325429c8e2d4a7462cb2172ebff1fc0ee74a1a14a67bbaf9c229a9c5cc2f6343ad2e21419374eae015f0a4cbdf563a56f24308a96fbc1b75ab1f8ef7418d7d49d1a9129652cf6749679fce9d8bec3a04ee3189c451aed54db8c16a418d9de22474d9059febd075b45677f3f9558ba2c6285b8fb6087ec5a947903fc08a26d92c3e34f82eb49c74aeeb1cd79afd81ea5f58943a1c7e52edaf600918038b20dc6d6ff2cb85ba8b46b165c1366e06aa1c2be3990b5a86267068c6666c0d34ae5182deaec9892ab1d4530d02c16fcd4e3cf502b4910481aafdec353fe95e0906d83276d1c7267e6ee224d0b70beddca1f20d158b1215a42b6c1494fd5bccb05b69dbabf10b678dcf9b81a68746f42b6c7bf0350a96d1460a1b6a8963a957ddf6e0b0aaf2ef6202669a57aa6cd0342aa77f54c63c1ee8522da1d002fbe4c178e3dd32a66d917a2578a122ccf34631236b5b274c8f0b300a3b1569daf66b91982ae65743a8558e98a6182835c2aac3c7376c3a35ce9e662a3ae634048bb0285e8ffa7a811b8816d1053a868d644d80d8fac2b341daa34298e7ec31af6870b962737c52034f0a4ea867708ff132ecac6db2cff49d400fc847d68b1ec89c6809f0c293f24a4e5a717a0905afb660b135d9ec39d7b82065c739132ed04544966e7b783b2f92add39b22854ca30a734dc9ddc25988a6e172dd11611cb1e2c567a438909dfd082a770fc4a57de0cc51c5e8bff740a59dd812ede98261ffdfc2bdac12a716d3d2375133d0835eef0792b99e09b4f887919b9ee129224bc5f2929068af88deb0dc8d05d4170fba2f11be1b76873330a668558f69bcbfe0fd61dc0af3c1ac57b92022f1d345e8717e26708c6029479b13592612cf2b893fa8f5fe1e987aae703de3fdd74a2c713e39a950a32700c1220b6e9435d99fc8150698f5930034e1b0ab9f970b71347b06219ed3f07873cbec3840cc90ffd585b1539f8f8a9b7e328b16c2cc2eea16f1169311f2cd0da8b066f591c3fae37d5c5c866694e3d41bd96cb64cf83558a33cbd0e647df6f81352d3e1d4447aa3e064cd08a4337c16a5e13d2731d403855896eddc06874044855b390193dbb3be9f2db1b4232a4a1fe3750034effe6e4f9ba33db6fb157689c581d163a0975307fbe316c557d32b7d654ec995c89ae19756b2ecdff76c8a10c4f1b6a169c054af196c377c81ac281b80d150380fcbb06e8c0e07df372d9d43c3005fdbbed2c60fb46c228cd621f092ca269324dad49093e34ab1fc0e359ed9e017e596e8b46b2ed9becb978c6a3904ac896a4635003ba24893ec6999ce8c383f04ff74d1591a2d2f700f4fe3037f0a4fee8b3c8133882bebf0acd051f73ba54a4afe9b1f947bad2f7cb530a00c98386e6c65bcb3671f7f06c10c2d3c3c67e668aee1a3f4ec0fc944116bd19af5351b5311b684354b58de49d2fcf29fbca854190d6de12a280634ec90058ccb857c45cbdbbcf164752091df17523e62132650c4454f4b83ae87d0c5e78eec96c77f739b4a7517a42777d3b7d0ec2b322b2c4e9f195ab4e839afd81d326f54f09fa0665ea4e4d7d7d361bb89a88901b1b5df8ea9c1206cf39f970c7ad22344312f0644c25625fd7f7e0b37e543667684cfbb9ab18ec542106cf8620cc9fd60e599fa13a16cfd115fa0f8dc7afae05f3d8229771717be106d9aa72fdf3139619837b29d63f65a922d13097fe4c21469a68e0c511ad7f3106c473739d800e703f422640b91e41bcb4ec225cde177eab3606f793a9610d48563392cc927441ee32228a4509538c89ed172502fb32d2674bb268dc3e6ef50d641d4d3e2307abf3cac7f659f820b21327d6e64b4cc058b276d8f60fae2e9ea47ea858b9201aa10b3399820f73b29dc330128d70b0285696ae643944dafdab372525c7b2ccc21ab719316a6ee85b461b4a9f600ed42ea38bca80f5ff9939115107f73fbc7150460ad1f9bd137de19976e73527ff1359cc42edb130afc18f2efc8319cf8d1fc2c91d7c12b58b2a1ad1218cb697c182169b75c3d807bc1b7138f42354d6ec476f7ef7ea241c5c66536d8532e01d428e1ea1b81be6e70a8829d61e73418cacca4b5d8744aaeae666fb866aeecb8c609c158bac7287b009b60b0209024567a7fd7a47d431a414ac4816a3fa2b2f114c2b5fe105eee1c54d404ab9ba502a016523df30ae708ff487307e0a1d9d849f7b0534081f0f74e58ae3df57bc3bcf5ccc22d05a6ce2571b0b93d56cd4cc5761982a55d91e7b604eb2d10735b32cd2141c462745e0504a02bbe94788d18be5cda6129906ad322e5c02a78afc4091f8d50d07c71454ed7a498dba01733a091c7c9c3fa6564af770a7ab5c425566c966db22616591a36be16b931b4fbdd2adf7326ad89450160ad2b1f7cfe43625a3e729abbd6872b97ae6b9caeba459a2cceca813abcdb4b143ea058cb1327db3cf528cb6d784d93711f7c954e6093500eb591b7336021b1a93ff39bdec478f0cf357fd8f873ec522857b170b5423f94bd4d5e3e2d6b32000794518591c4820bab0df0e19e99816cd9b391937d335a70e6fd91d411d71c18861d16e7edf883c8790666093f4bc6f0e893669c84cbbc3ff64b8852d5ceabfd7e5c382879affec9e32e4e1671ab6a4c466b462ad7832a5a9c407a5fd940eb4ba7382e689b68282b458f78f1458f9e629c99b698251067d8dfb7cbb706562241d749fde02f25259dcd5f3e60050044696af814df2cd7a07e86f886e972d02c62c200ab73b15944d7bab129584ee3b6fedb7bb3617de1edcf3ababfd3bfeb44962c97f62c0b66240e55ccfc04b16746f7f59f15e4030fd50d4063a2006e34cce18518df21c05c8d8fe9861ac70879c3e52fd81b8322de0e3079aff0740527d1530873eb1988768c4304c7d9b3e37ef054bb117a017d58d64e9c589fa64c5fa89013a106461f3ac25027e53f5e8fda123df454a53f2c56984c94d1644653055a906301627a33dd53f8ad4282dd495b48eac3020060d7a802f4948ba168bbd70de3c4a15bca102dd79e59f97f4b21e978e5e60129ec524502d1aa7f1b4ba798d1b32f443e8ee6817a65eca4040204cdc43d9de625d88c039779851cf04d480a7efacee1336abf1044584975f85af493c32d37e6fc79e563543a16382eb23a3670d804e8f861ae0892090a8a098f647d78738648f210ac9c72500c6b869d8746610dbea4f7f87f5f6efa479eb003187722c1f030a7366360b8e9856ef1183b756ee565a488abc77866e87f7a967f28e4e72b5cf5264f9584c9713fb05b23624166d9322b4234d068ba464d693941b34f3d2524afea11953cf3843f6d16a01bc0745643af3013f35e1377c0169fd3374d56ac005133008404c29423b23be5df5b8c8e8eb331e6891a298a6a5ec2cee8995325715cac3ef3a8d3a1d1d5e2a3c3fab1ef27ae298ba0ab836abac101f9dc4e5047343774f9a9cb810020dfab251c58d33847d4d6ac33d13dbd39c0a26140275c3a7a0892e3b789687f3d78c24c5b5283e01e03b87634222d2b56b61555d1916f8389935468982f86798321f62e413ac608086318e21cc555e57acaa1282a7cc03ea2ef2ba7f666bc666f5e8e7c6661a0e4c562c3abaf79eb217797535caca59984fae8adea9d6b6d908cfbbc0fa32670c06e105e3e2a84f51f896622ad9e943c79d3b4e4ede9e40a30d440afef991a143ab696d018d96090d6741f3bf991d18cf6eb188cc154e1012f901ab806e3c7bdfa2c440d57c0e7ecaf12e720ffe9bff21d32ec8c51867e03eb75329ff2baeede0bae2762fe5ef6e14a6f2e5c4a4211b85122de4c31400e29f1f60353cfa9a8271961fe87c8b49327e899b82b586a70e0dfc906d4ac9a55144ec901aa69d737634b6138fc48ebf106ac246253bab965d2193a9ae6b41cba4637bfb24a3def3bead22799eb0c892f5b942e844bd9270565ea987b53eaec3712da17d8d02b122cd018b7e2ec5bf74a5645189ef94071cb72b1de6a2d4ad1cb793f472aaba35d85810d84efd0d0a0743d56420a036ea3e5e50080b0bd90b28f0d34db804302654b1bf72d0546ad662034bd05756d4041c43da69105631aa70882ca7d735fbf841dc4134cd6034204caac578f7e454f8f391e1b86a19602b9347af8dfcffd6d520b4a7e9f686dbc774492073561759add12ca4a72ec34fa6b680923ef80b6488aa15c06fc5aedefba624f371cd356488fde14dd275a752639168609bc9c599e10968344308df29f241bba255b04ae7b599c49a1a85ac672e75e41b3b8740c7bc5d3dad53a67f7c71883ff4f6b196aaa756ec2b65892a825154d42df39a088447287d2b57b153418605f88fd12fdf6dbd953e9df8e4a7eb8b6055b839dea4c2d97a7876315842aba14d442852a1e77d05cd1422249c8c37a4e171b2f4385a1bdfd4619d79d12ce3c792fb1f6981c9061ba22b64c3d2b424a194d3cfcb49fea34849709219303ba19ef500ac059cde62b99125c4c474deff3b312170cb44d8a337d05f8fab0c580e915239c7a7a453d7f4aa264fb0ad5a5683c647d69a56ce2c44648438d2291b01befc6ad122dab84704576abeb2dd9aa672b26016b832c8dc0f08385e221bb7fd3af45aa74bb3b659d77c1733b92a839ef11260a8532d11b6a8550d462d561091a02c7cd2f3840891781bf6564f7e7e5d62c206092d4d68715c6f4f498cf84fe945cb7cbc0225656a2df9f500494f8943d867175653b254a0496e227fdd85121d036feeb3396b5802b437384d3abdf5a09bbfdd41e969e1380e30d293191e4f36a8ef56458261207655718326afa2204767ef9ba1fe84a2b3f4127ed156719e89e2430d342361c579c1ac2c017ae24355952220b6d3a7a402047a758c4b666c038cde7e38056fcf7a0014ad0f01b8b399244fabd55dad16fe2c803a98d6c1377a3a56ffd3577c876e2861df25b56e6b00f5da31d67c8d5ee7e20edee3fd526b32260d0cfe63eb70478bed74236d0c86eae7e2959d09e9f075e8c7c580f91aa81fdd7c9c0547a33da6ca26ca904356ca2698d643ab6ebbdc390bf3d4a3316cf5bf17cd9907d02fccb45e346c07ae9bf0c66d2586b18021411011e8596af42ee70997fb4efbe0b1139d713cf969b972d2e121ed17f32a174e436d1410389d76c7f8859713770d27a45dadf0f67a9cfb59a4acf800986a60d02be5f65596c5c143428bf1afce8cd163b93adb2aa3d918a57d2682636cd883127c6cc50b21f6c6531bc8e6f78d23c564d643c4201044261e922ce5db476abd3faf73357ab4ffcb7f17b4ff3c17db448779bcb17bdf462df7671e906763a5884e15e34c5d2d9c7305b02193ba91c6475e3581afd7631da05cff357c042addd71db71eb3221c5a020b086f595c2e25f4c1141058ad917000684b972d33f6ed73136b292f9ab3cf6536d84a6426959bd0dc0a01fe75c44096a845f15c5d9c3dd0e9e0b4061d4251867c1cb869c478e60cdb43efe3ef597747e9e4a7c6b03b0b3a4d2dc5a21546accfb5d4970c20711bfb09b8e36b9a4569755b4c538c024585deb2b14adbbae01b208f2f93772546069c27875fbfddc39f3bee901610358d1da045080ea7bd1f29083ebb2687c8412ff9a703eb986143bcc9c6de02644ab9a4aa257fe62e265faa6cc0218341dc5d96eaaf5a628c08dc123f0646d58386e7c2794c946c2af61e4d595fc6f8f28c0e013b39c4262ee07411f0dbfdcca7ef0d7c19ceb2346c58486d1fef7827722c014eda3e10c6429f396ca2b9740053042845ecf6f78aa62866db7d767b952360306a0230de0d903158a624e24340437c6e462145fd804bc04067b69d0d80fed5810c91ed1d09039507b7d1c418c4269ecdfa61f5fc3fe1a71514d663cc4d794e6e6c0a9bce7bc42fcabae0582337d5127e523271538dbfbb0a864b1f10efc42530b409a8b3d7268fb0d24cbdd43e079c8e019ec6419b39ce3d8b5b66047c173bcbb105a8955c5e61d5948f4900489cedda2ab5a47d254fc65c0b721f9fdf322e5afa3d6c4299e090ea15cc924ed2e20c5d6624e958d3f6f86607cfcaa59be49d7a2da68195ebe40bda5895ed9b55a797bff32e02fed511ae16c6de1a37f44d91edbef43755fcd851e6cdef68e9791d0ed4cdb9ab1193c377620e50132ddac47dcb914286c4eb7045c43c5c8e6d38009a2f6e0306619b97c37606845a09018647974a49a0c78535cc17a90d6f5270a4385aa8904a826d48a220701048b54a275c67a9de7fc6537305ac3cd3aef1d57bd60925a64b05a641de708dd51221cc590b8ee1f6eadc17e128c000f6b8c1dc65f585bab50fb96eb787b51e93deb27eee2084665042d4b95bd06b326f0492f4d8a75b506dd1fe946659b893c001c966293e1190ecb5683de40c8fa39d07ea596a6612f2fc2b90da6010227635d5bf8b55f3eeedf586fd5f854313c65a3376c31491a6289927cb74c3cf45cfb6e3667fa7628a2b312e79b9a8e4867f3b7eb1317e6e9c34ac083bd577783db5424b119cc1df58948ea4dc4d79ea68e5449ad0a6d48730a75e6d018115f9541532ba4a9f9e0823ffdcd8388e9ea2e5b1634ec3970cfe76683453f7b506a31196371e91f96f9f221ad2062740ca5f2cd59e490536b6f1811baad1d24765d41385de8102e7b52f5e8a4600d4a95698d06ce2448a14e0d771b4c55908abdca3430d645d2520c7409f7aa922a603f9dc5a684b7632ffcc39266033bba05921e9d158062cac6164015f00db3868888acaae727b51ff7a961a6d88ce0b6a2dcb9d178bf1ecf4c9903b2bdee6f944bd2c2b52c15d0c8f0dced01be228103d3ebdff011dc2ddd719aaa1b0f5395db162aaa37c8c7451d7a2b1db9231374db4d544382510b4fcf811c86d2848a2c06a219e9dc21a844c65e5b1dc8378423a531722b44db503b4269a6d4381aa311801a8ff7b707738ac07e34bb243e396bce6d6b64233cfa179648fcb55689fcf2a22096056d8481083aa748e77713e2288bed4b3f51e9709233f02be3854cae2ce206acbd67f4bd9ef708c73aca894bd756240e94340164be18bb37f909c601a92725cf2c79072d9dc57871781486b9f15fbdd82289621352857e28549778869b7ddadcfacdaf96454f72d3d87cab1cd6b1b923efa100fe7416cac92cb13cf577e7484d039ec7e5d5e2af2897815ed7fa428ca2bebde590d140d529964754fadbb392d1654d556ff172afe4491f3abc4d3c3de9b2b04ec3b51053af6b562673976b0b048844ca1def81b465df6ccccf86f6b0f862b10b187c1f38e35917bb8a9671c85f9f7f91b26ec52f46e3ef00ccdccaabbff03fa07e4bace15d6d0d8ceee0504796758c61c6dfb8a765251fa62d1d9fb23e401dc755793610693e875184386f82d1b2946eaa8eec5c8907967597bad25b2bcd461ea5775e89ea5599d86b421bb0d2f00418f0b211a0e9d93671a6fc38818099a59d37451ececc9e9145b936d197203e47c242678d663498736d1895f0857e238c9c2c40db020e9b186e53d954bac50c325bb2508f558035805c1fdc8fd69e50139cdeb0235549a5980d33226d814b24da58c4b8bb6da1ac85281a0c0eaf99ee99b85fbd5aed98e6df9822cc24fb12d699ab7e81ccb200b820573947612d0fdb21fbef4e3ba0b22ecd8b61cb190e2bd69e93a6415c20ab5526ce0b58c442c1ba5f2f6abe1736cfa274e649be78f4b4db48d258d8e188ff7f123359b89914d546e7a911dd3ce1cdbcf8490982b2acdf22b05d1243208e9e958aebbc8b1a6264440584a7900c0498aba51271495702c097ab873165babfa6347ddb2ce944402cb487ce4b981fbfeb76b354c0dc9ff6f3338deb8b1ba9e827a74cf5e0a67b7b1d15f9460d9661b7bee425fd3c216f060a5a1b01cfd9db3602b985a7819bf91e2f377aba1bc9eaed819552d91a3fce60d5aff67f11c7bb67ce60635219e8dced839918f1b5b33d540a2e422fabc28898ce387e78128302ec185c965e72c9c7de6c6927ebf52fbe847113db22b93a0b37d4c78d26091381f817929a2060e9e68cb046085af62bb8f45b05a39cc989da0d9e79b8a5559f986bb2e615d457793a5d9719fb2df9319bcb13199000bd25a8da4968944af8028039de478f28a8b7c4eba8a6f66136746eed85a2c1aa01631629a0562b31618664eb282d6ab52cec54cd5bd3100ce7b8038bf8c7ba1497bf2aaac7d98426dd85f838823b394dc94acf91a83a68e819260e990c2031f318a01de1672fe1fe421a7e32f52107c8f515031b5bddb0628810107ff991efd2325bcc0ee94dcfc2912a2c51e286ac8a4619aa0b74c5c89515dd9ba74bda78d10b41088074b24b54286e32aaaa59a0ea7ca8fd2f921431f83b08afb9c874fee134793230f8b47e23e577785089a8171be57c980bae49525a0d89c917501af40a35006a6952a12d397571aedef0acdc3c052dc108562086c9337b8f0139b707280e74cbf5f93fce1b0c5f453ac6d1d64eb4e607ff57ed83028b1b3948618b6880fdbba6f12e44894a80e20ea75c672c959625f1f578234895ed87d32815c75aca312963112fdf247e87762eb38ef7d620b73f42563969956c47c8decc4e7ec6d8ec1ab22e2be61227e7a40c2503b7048ac4aa8f527aab32280c14668eb87814f5c1e6b3e6a09f0917327606ed30bf837577c5d2202102b27e9e08ce0dfe0afe109ebb85447f9761b820c9f4387d79f8dee35c4d63b07e9d57e2ec7f169c4ef37a1d865f061d6d163ed3544e19b2d2ab5d8a9e345f39a273f02e6880ee0ff4ae2a93fbf77793423aa5407dc96211fac4360007db3c5cfd2dfd44799447719dabceaa9129fb7d496ca284c2f082aa00dd6d567cfc254b9c68a3cfd6bda96059e5f4bc4ea96ff453a1f27698a302d851cf1cb48b9c523eabd5c3482bd5c2400046cf54c1275be83111b6d4a73b18324810eeea20e2278e72af314d9f1223fabc88ecbc34dd78e87d8628d8a9af7700bbcae8565774abea996a5b2632d8dc80616fc9e79a4cd5c096658567698dcb83e1b87b80ec2a0b9e47e0805998657667234407d04bfe3b48ec1dee80e30b63546edab78a43cf65875e91cb8923cd47ae47d20799df580a10582ac1f042ac23e2ca273956153f7f1e4100f69baab4b70bfa24c76eb0a7778cf75c5e252b8ab40b543e91f51569b7e24b6dec55201b9ff2f4c92aac19e08eab3136b32e8038ea1979c3ac56dfc86086707162d587ada2f6029a4048becc2ebe0913cee99adeddb323a806dcfb0715658b57a2577d758db26767bc1166c87c7a23c487c30262a2b6c3938ce39d27fc00b840224f300081d2828d8cf6390f3284b89c6c1c4ad37921598ae40b47a51d7dc3cedb2a37f3744ae7a06bf07d8cd861343063b9ba79cbedefec5b7a5ce7aca283e1e60131d26a366c2064a9479bb8a7a7f376fd7426929bcc1c8c133b4f02d1060325324c050025ffa8cf6b9880a31dde9726f77fe8503e0606ace643f1c4a0c0065f857d483d0006405270ad2ee3a31fe0a40647b37428d905b47b99aebaa17b50657cecb63dc16a2f5bf860c5d1a9b866f0b6011e53f4263d81fa9b4a2039186d1c4e405052c97b9dd2c17f5f34112cec4a312af78844896942d2c6a67e1745068a7d4fbd1a172f668f4952a480a4b0397d61c7e26d8e0e2994caf7177e2d931f91ad0833ac6c37aa96238d4b3da6373c765af79d71ca3b1376008bcb43d9763d28936d771b5deb372655f727152393e08defb500cf80e24922a24c84959558dcc5eab90047d7358ae037632498dd604fb0254a30d3842b5798abe0fd4385af61f763d1ba82da5c94f1f80d25aeaa4425eecaa02f944ca7f65d98aed94e09370d95a46fb7b6eac3f6a2f005d3eeba3f0851d59dc0bd0c7c7e612875042df57a5c1aa19079963ca53d88493af0daf0039c41cad70c8e5c81e54069a23c369c3f854c1f7d8bc0a3b2ee78be89887edd8354323d5d315b89590b8c7f154c5d168ba1309512d8490a90c82fe5baf3008b249e9d8eaa026d66e49318c946cb1eecbb666f793f279faf26d535c49b5d8f0dd972c5852027dde6ad154292e6fe9579051da73b843b181e55da0c93151e63decd5e127a5dc101940eaaf828984e906b68faf359ff15480b5fb50c4341d5fd0691cb4f487bc740ef5bae6c31fc23b20a1d0c7e799e2202c2c552570624503c2be80c14840b43a498a95dd2e831032cfb24c4e2e52decacdca18072a58024ec55d77856cd28bf4267a0ce9a53a5e60a7fcfc08c6858f043037d0b3964e0ef0e41794bbbe4a0281bd0256704d58d6ece3146b51516d6aa51bf84a95c55d698675881988241ee1361c486c96be211a0b126553015c2d25f59aa2c9e41d4cb3652ab8d6223ffde68c539c77fa443e35cd0580938ffe9a6430f42d7ac4dbdb99de900ee1e9aacc1f1f967639c4ede0b49de2d04abbf4f06439095d5688c210e746f4e243de45e3f4fcbaa9de4c4151ef4ab7d0e6d2dc13dc4fbfe2fefb7dde0740c60391f4582379ac00bad02ee35715270e30e0b02a7b60465ee98865e44698e32f77b72583e37b1d134ca3b61cfbda09facc441f1f442fee90089ce9b032dce0f38a3b47dabf2fe6993b0c9569d0ef3d6deca94d8a8f18c3549806400461f206a0bc1e6a361e8a78eedc97fcd56cd5781f03d6c15be3e6056b2b18ce69c894e2dae990fc67269db490d2fbd25a1e25e1507854ea864d6467e378039e069df6a916ff66611b9766d9ac5c36a1368f250f684916e58637caac9d174314a902984553ec47e87e867de1130f97510aba6d2524c35b237188b7c9ab62d7400c6a88edf5a502618670d030065c778b50fae6b30a498315ff264597503df77edf919adf2e95ebcecf145cc98f7a7e4d502e7c8da3101c5482415a554c0b6597d33d1ea161871ae813645296c71fd4fbd1f4fdd575030b8109496989c242078a446da84aef0bcc0e3c2538c2ae41f74c2c3713f81e91519ee235ad219873ef13d4e48a1b94775edc7ffd63ec6186f21f823c123053002f7351de8644d3a2446e43406701c440ba1e7b85f257dfcc40778e5e64175768bffb6302a29881c4c724facc2787dcd058af29cdce695daadddd235240c573989101f1c5d74bfe1970e97fd99ed3ce4767c0d4a2e10e5021da245cac22d09d3f826620435b741a7c5d8d779b2eef10690251748122f300d519edb8cdc15727375bd8309129a764607b7f97a03cf1b93e1a2fd7fd5117dec0724b0e2f2eb88b082a48fcfa12f2e29a1040b98514a9a595405e4a849135fe93a27e0e028c4e16f18eea85db8e0337b03e6ae8ad959e0248f0fccb62380b608c75e120f00e704d0a039d282b0448cc040fe1b43216c5f47c81dfbe65234f7bb6d5bcc2c43d77a8f205076816198046c46ad8bc679e3bdb36ce2c2cdf4df4453220e2fce341f83fb533686485290324645b3fcf17962d432efa4434badfadd15dec2cdc894680dd49297832d651218cdd6874ccde6a694f062e8864620f3d9ddc2910ecd245bd5baeb2e87f5f3f61644a31066a97528d9d12a5957726f66095b3d06c322b4da4bc2a678415586ab92e369dc9a9414ae7348eb1b3d28a2af9f51956990fc8accc559697b323bd253c553e058e00114c384a7f10bc3cf934f989da232721e8f5563572eba478224b281756c8f0990a01290725e68451120905be6814102590449e0023d1103e0744483e6244cfe84a2a4a24b3143b7356a42e4a5e1210101fed069a516efa98f3734729b23404442cd9af75ec127d19a1fc70f7ea15232c3cc3dd960be4f9a223069d8f6b1d9ad99694e8fdbc5f911ca89401485d42d75cd5ff4e4d249e4e4679490a21f02bfd4b34ef3bd1dd22a84acd6249ea38dc3f438725fa4e12c7138a04f17c9028ded29f886b7a25bfe8c4ec14191fe2f2af7c00fa33e45805a304197e315e0621272afc7b0615f631fc86808bff153a8b92328ae7d7444391e7b28975ff932c03fd3f5e260aba7da520df1a8d8906c52b25bc2d1eeb9500afba35a2bb8b821abf027cdaec929753b8179c529073b1b84798bc9ca9fc8cb8040876280791f32c0e361cc6417d356de37cea00f2ea84e3cb53a5cc8fbf4641e89402bfcce892af9f780f7840bd82e71a9300385255c39e9dc50089ca21651ae0809ea195e90af20f6bf7a82a43f37716f9c9797ad48774d3cc376082f8eddc18c75e447c807dd586ac8383794cf310f85513251ce4910962aafd64704d1019876391ce2d63640010c894792260328610b1100f1066f8970a35735fdb4b38f37600e476e6e17c8ac523f205c51c01fe45d823781675ad38d55e7edc9eecd24a5b229609750ef16ae67d50e05c140a4059841c74a0d3299dc29c56d22bcb0f0d950dd619af2b6fc976af2e30cbdc102494948a494dbe01f204ea73e5fa784442e5503fd638c6625a481594ecc12a42f2112455277660f7493ab0af9a65d633624f80e2bd96c6111f021ffbcc05ed33153976ab88fd6759882816b287265559c9fc9ee0d53901786d6909ea905a13b74e5e9e433389d1cf6e37d88021bc3640a25b984f133bb624eda7c3efd7fcdbd0d8079182a84a718e1a0850778b89dced7eaff80bd73b4ec6dd545aa56d40ca3e40a0814456a0171eb01b62a5706c4010870a1986287f399a5fd96366a5fedb6a75658dc14f8e3598a5050c41fae10333d97db3d83fe11aff671b5e14dcae3fdeb0b04e05de83e754138666a698bba716ea13da3d29ada19e94de623fa15085087599a917f467fa9b36ec78062ea9584400ff2135a1333c5b181c470d40e993b46210522a035e059402f51e5c306a0690ac557c5c097574b7186d6b884de17e152b922f312e5c55c4ac76fcf0fdadb6cc9523b724fae1d791e2ab8a7498844d31010042aeb259090000f7abe69faffbef695fd85ffe57e6dfd9a81ac01e9f3e8c1f7c2a28f9d8303440328d120743285afa821649239874a1cec2f000deddc6b71becf7fde123dd36291195f373601be07ef666fe45cecdf757b0f85cc8d0df359bef42b7f0f7a1c0a9198b2fd8b3ef01f2ff5278d2c3bb0c81a1602c223ebf0c59fa979b874ef30335fe27350d05bf63f2b9a4d4bf12ea862ff3336734f97f9ba36f25e89a7767beea6113e97dd12bb753b560b3ab80820e2c6ab49162d20e5bbed72fcd1a919c2562fb8950fe871e4363f488a3e46eb7f533e71a639ade40e070d844263939e4f0848d7f804ed151c4211a4a1c44a38853ecda27707e0ac11ce8343a820cae825e30c10d72ffe88e4ea7d1a0ec3062237dfd8c4b579e298a051635814d8163bcddbbdabfd117bd999285f757257764126bbeaa52538d089b3465525d81e03889c4cb87021bed6804a7bce9ab7598c6495af89f64611fb02f59dcbbd873617a4b49f7aec17fe2a470ff552df09c658aeec5b9e23b3a60aa549a46196f02441fa705279b4bf66bb2f4d641b1924d3be627b23c748386a3d869152737ca570cf76db3f5771e503b0d406fa57f794121003ab1c36d8cc1cb621bf866e3c6aef2dcb890bb8fcde4a6f3c4da17a2e30ed48d9420bd0e622539ddda82529e1f776536f2419a764392310aaff2fcc241600ef62612537652fc69d5b0d859664488d4d6df02bf32ed49ef397b410b2c1da722520532cd1006250d57ab890db0416c57706cfd88f3254880c8bfeaa37a4192238ee25dee7734c7140b300176a0a06fbbd7b37d315f0a4373e9b495a256d742df3f560bab5926465235f183332c9ad687525216b54410a513e22c76bd1ca6c9fdd39a70126324a89ebaddbb6de31851f492125b6165085a848ed7993094cbd212e7c4a3cf7dd33a5e92fa223b1f2376360923b43954d7a3b204b14732aabff09e467f8b5b42b086216db8025a4aa8c88747e4915d79bc7f8d32bcc69fc625e54b7aca89ab9f881ee1fc542bb6463e6e669439f2c5ee761aec972f102ab0503ddfb0462baa8419052d3e467ddc6657731badb93d8888fbcfab99e6f2566c4a76a53431fd9fb5a77446f3121ebedb0e003729f5680e05a651b269326b310332c496228e27b50237a36e0376aaa0b75bed0cd0733c25cfe472c033586276a901224aeca3bc082f091d3641485e9d430cf5e81f68b18e9d3e7013387a9926a54c2b84997dfa612e591760e1e615f5e0805347da66165a47c9d987b49967ef04939c99ee9bffb20020306bad6096c9b179a8ae7cc1c69894cf4bb16a6c56ac75e71721d11e2f41510c7ac1955d7f588d8e8b013635c0606991bb2b77afbf0ce245d284ef8c526738125cbc5e3b490394d63ef73258b498a1303003511ff20d2332b31a8fbf238e0164df40507f190def9cae633246a13f6ee5790bff9894f11a71764edc77202e00d006db993fbae0948642c532acb83c43328c8f511a8a88cdb076780dc8300ea36c28228661d5e51992c53864a64694b6216bb638c1c550d8df18259262904aa35659b2a702905c6ab23ebe03315bfe04344392d07a3def91b1ab51bf090ba8eb4785ff55244340401e3574cec583227071e055a8915fb38b1ca4a7686ec850c4671460de5e01a015ddcfa8ef9e26da2953eed598480e78a3ec9efdb099e9d066e73d0c3de5632a177fc84d9a4716950202eb2d2c58c57174624e05010a80f357144a7f088d3b750699d75d4f7d1d1d49885390fa566da2e285eea4939100e77edd50fc203603246d820769c5020ea1e8ba94bcd0989f374b704f1318667ea6657754b69f21863bd4492b538c86ecc7fa343fa207ba99028f05bcdbc49d5f3c823a01480ad54383cf9a16c04d5329437494fda03302b8b4f470d021c98309d8cc1fa8d3660100304be25886c4941f6820adc00d502a7b8b3bf8bdf2f0603b380b86a50aa5d2a53d0d425dc21ad434cb55365b24cbcb33d674ac7c3a8f70baf46e17b2a52f362ee21c268f9fbc1b4902b9844dd40252f194820a2e165093ee5b0b50c5530250387140efcf6f5940298f5248c1c1813ea3e42d251936a3d392c416352ca0a09c88ba4ad9e60ab8261a0185c8e275a50d5886c714a4b9de8d97d086a2d2f00029b28aad685715113decfb5331137b6fa125b9508d20e94f102f2d0ab322ace5d388972038f152dbd78f3b08cb4e15a9881f8d946999a6fde8138b59c2afe9403f9e20992f46c7a9e97fe808871a4d4b8fb9f9e2c846cf3f31689d2d70ab898d38e40d1c90494cf0cc68d83970aab8de9a6d02176214628bf361e0cfb4abbcb5580f85a4ba99bd8c218eaa70c1957b0f61058ad88bacd0ece5c62c95244443562ab438c929f5e1cf0b243c1c102f83a477b5815113fdb98a43a509a2a8acbc9548550733ffb8c13765ded4805d7cc7a125b397133b3a423f094955352c1f56d455c6659466f7e0f8d5a0395d7c29bbccc635eb6c3060a6fb26b501dbd4171803787c3f75d94fc4d1a8b5a33378edee6a1fe6bc459cdc62fd65ad2cd04ebb90e88007549a8a13a21ff2073128463096e6e614ba452bddfa394a5110a4d109ccbe04b61914868469c769e298289291f9a8caf1c7448c04bd27da70eecc1f5c5ddbf24bb5ffa8225e02bb7f1b237a2c96ae0694ba2830ad7cd7f7c3ef96e8d0a4c05ae0276b068032d11ebc9b4004f4de911f918887da54325ed2fd9308b6033398e1a29ee7c1609cfc4f057a422b4c14cdbbaaba312c1bd382711f45b0e6d0f26b8b0e6b1bded7148cc159e9709d9199252fcfbe64d507b5ffcd6991d34ec689c16b5df9295da443c61b6a398b35c7773a98c99d2f38d7df330ff63a177caea4fe9089cf6b79c6ac3ad0cfe0fe2c07aa5d4396b774c28f540e48c128089eee982dec514938187fcce2ca699d154d037161fc73c8b0682f018183fcae071990c7b401e867b25e910e833cb2e980f6d408d787995a97b76255b3f54001598dfa244765fd0dc954dda31eab1caadffb539622b3410d0b2076e415a77a32c6a5d7f7ef8e1be3eccaf3be13eb12e87bed2f56d95f8c271635fc83711f8826f0d585dca7e4b20b9d6a7609da41d4a270a95c28afa22d342625ec5965cc28589c85502e311b1e9fcfb58a51ae898981ced82501e00fc2c64708f03f24a539c54f1fb172438cfcf17d7c1fd28a90554adfbdcb7291ae62f4bc206b393d0ede23e28842759c24ad60b638721321c83d6580d5132ae8a77e7c9bfc8f68638dfdbfeb4d45fa017cb1ec9bae341fecfc995beabafaea5a3caceb65acabf3a59c96e6592dc0662d3eb2443da658803fbd9df02d2d80eff49c5575d00154fea82962cb17c3cdcc46c5fa8fcc806d1800778b5a793f6559511afe43c411420f05ca604500de2564d268a3f8059966ad2d70051774a0f50619a8ab081c1d65b28cd6307a0944d42a403c1e1425e52e2bc528f1f944d4e8910f5d7d313d38ad29388df227c06ca9656bbfa8aceb75452f57e20f4e68310b72139c7b57d7d32b85a857e26df6103e23bc1e601b73251fc68615b183d56c7918a7b5b8d88aca19cfba5e0c78e5fd53bb5aac171e4280e94f71a6397207831ac881943c57c68f871a7e3867d37559da4190a60a14b0a37a56fd50ac555b188a6093fc330b24825e7bec9be005f1c83c3057de29b675deb8981d4cbcda4402968f5087c18db8d848d3a1a0e9739fb66d4fc2a85b435994fdd8e1a11b2477a484948f3c2a3acd98184e23c9764833173ecfae8554c9c3844dd381f6fa201aa6bf31587504188be2b4f003981df20f0c96c8c07fd2b42c2f07f9ab4707671c4d880346f5700a14594f1a91b907a8e83e4d480595ff5d9d888a4ef3abfac96335582efff6c0c4f045431ab5f9a8c73f5618be91deb75f0595fcf6613142842a7bd73370105947a413df93efb0e28a5809432acba0ed872c27d0347f44c259a80fc2aa8066cca1fad7ea58baa824af49b0cc233eaf434d25bed02445fce6df1b3a03a695f3d41c070a6e77de98f63a10f154c4b9d1062f035681b30fb0aea60ec061326c84f09af0d58da6e7e6a251a31932dd4e1c994f45211528790cc3f54911dad60407e394f4ed2c78bf2dcbee98ce505e18ab020ba32f3841ed4c2506f731bb9f5dbe033c6ad8947e741b033cd616e1c0b89a66179d5017e1085d2f8e67ea88351fc9e6809fb038449f23405cc31d8f936bce9771b12d29357038caf541b355d61912509941e3436a67cf835cb7c70e8562c96ac54f3d28ccbc55bb1d0ed5b8da6cc37b1a45aeb6efb3fabe3f066b71e3ef03909d847d8e275ea1d18d74d398bf75d7b4a0783f2b56e82cf9c97fcd26e1842b82617152b288cef51232317d23beac17345208c283831468516e1f564847f497e0034c59818545a285b8156ab4fec2c7e5558848f14175acd725e566fa8e48ba931e92a6577fcf978f8b31e1a6032af8aeee3392f4f40f0a58f6cec702cbe54dfa55b77427226eecd41afacb184c82e32f84759d02ca46063eed729d4434b89130feead8944cf699e2ae3d9cc23befe27776befafe9ec4050672b2c41464e55ae903839a9cd511651ef4dcd3a16153280071c69e0dbbb236631c48b3520f0392dc9664c3141d16f0c6a13f88ade2baf264221c4ead2e05981eb9f27c8fd813a2dd7f51dad8232204d5cd8f48aec739c9623c1e325fe6acc8b52c0aa4d7481f71a16d51c52ccab6586c5bbdae539d7942940cf11826a23040e5a1f680c4f099e7c108ed92cb454071adb31be9e092811dd1c7da14ac644d98225e4b7497f2e3f8d5bd7887fd8dc7b0e4b82547bd6384000162c8f13c0b9b4c3c8e449f3c9a81ac0bdae0511ae89f6c911196d2d22d89f3daf060759517067f495adce5c2016529c8a1c257153a11d40172ca61519e56c280db00a74271366e2daa284c4edceccdab0f382a3d22b5dd85c1d742f0d1dfbe98fb124d81a7c24055af40ef2cb9cda9b217a2a08b6584a5b2b39c2e1b76e1c6ccd6813431e44b082df25efca0399f144230570902ac9098650755c2474b8abab818eb292518fa1bfd6701f1eda42ecbb7d741f9b8ae17706389c9c8c7f252da64a7266d2013bca316398d9db6c5312337836bdb604d89f6f8ee38c7f3ffc1e29f51a1fb21ab77e6861016a1bf1c4f0b5cdf22cfcf795708b82704bac6a75887112e591c72ff537e347ff16b48043b0e38535d63d061179abf9d0f61f7329dd2f540331aefd506a7d85720250280adf085c8d6934617ad5184b5b6b3a0b59b1daf4d8413b8b6e09057e3a0e225e89a63c37b23e6024eb338cb03c3a3e00d8354baa811e3027026d04644b3f9088ac26fe9b0602a3442101b1e87efb57544093092fc3182dafa6a3f70c84ae130a2484745362dfaaa231f1f74360c69dd14dec35666442c1f1479b1ad746ea3b9fc96afc88b4729bde88a7081cbac0ef23a3c0abc18b4c2858e8803b8978543de351c05e09d407194d8879127234b08c45bc6f0f448ea0dd0d1cf84c529628f8390ef3761d133b90d1e41473f098b53c43f0ea1fb5994a8d5a1768a2d4a62fe65c22253b8ef8dd0305e2fd84c12417328390583c3a097b67213769c305f24e2fccd1fd5739005700faa3a9fa25d4c5d202fc2bb06e4183183088b14637439772d58d5e65d63602996fe40f793f545a367eef19151d2943cf66425fe1116babc7d46acc9ec958f6d0a13957ee39720eefe8ad8d916cd07b25c1d16b1ab6ca91f762eb6c5ca8d16470aa88440d5cfeb07e12f209352cff84a104fede055f6fede7d9d979188396bab259d2a5c39c19b8ad0014a2c64ec92595e9ccc0c8548793436c72d11e737093b7062aaa0733aa33955b26ee936b475582a6aa74a350a31726f0d2aee2d82bc74adf08b1d1bdd7a83e8ea5872b708010cd6e15d26cf5b20ef6f12ac43a6f48fc320ac76f419ad815667e9c364c089541a750ae617f8735e5c66ed2d97d3a0b2b461a248312cd7596afb261eef2a3f960586c988ca56df8e50686211d16e3209c8d904bdb3a202d5c9b959b7e69ef5aca5d8f66feeb792676d3f01ffad7eb91da17200cf859bb234f47468823c8b64d899e9de50dec61befd9e2668030208035dce1901fc99ea1c2d7c75405cda030200462c7b348e24e85a28a688bfb0b9c0b96dedc3518defe4e10c2ea5889bce0186a819551f872a07f6b43f2a803671a3deee1903d986d32d8640879ba21e416b8bec6162607140a04177b256312daa1600a2eb5ce93918bb9c125bf2ecb9a021031ee33c08e22d27f3635d7e002e26a70edcbc781aa940f8d97e969e258a76f882223f2c26b3fdf13b7332b5c09a459a65808914ffa73ca32414ef07ef8b7e4369be8e57ca233932e91b577737740d836fd8964d1b9e024e7c831bacdece3850309d35e9d6c2a04c06c900959c123203eebacb4f5f2fa0c6940af3ec58716fea9433ea41d81a4c569a20dfd3bf094bcd327a4ebd82b68f8cb325cb07fd432232be8f8f4ac746b80fa8038059ea6709313caf9fd21d3ee569edf07bfa3cdcbe78f5f0c8184257c2cc6dfb51b6fc6a766e612d94484292303b90233fe43bbd6e8c49261de4d45caba580997fbce9d5fdf52a78673243b835c783b0031c78e406dc7ce1d329219b27696500f2fd59611c2eb2d1ea2a7d5053605043c52eb75e7c975b218e3c734b612c4142a631fffb222ac10e70b3771cccf0e36e8fa74d853c8107bd8d1915648b2be683fcf5372d215c891a0d463acc776dc994ee1f43bea1cf760a4af23483b7c44ee9d3b0d66a3f60fe7854f43ea291c9509ad901ca029c062168cafa404c5d44146c41e18c8d584900fdf33df76228fce8ec52907f77568922fc901a9520bc653d5bd4938e5bae1345325da493283053f4fc1944dc84ab9dc9871df0441c11e94a9f2e2819ecbd840c74af1642437b17981c0a9549189d324b24c9644c758901747095e0efe05e88ed7c86601b20e3686ec320299f8ec3dea99cfe70459c785ce506b4dd8bb3b585984c0ca0df4a6f675f7a74af714a83d515780f8c04e7cd64a833446ce8b5001857cd947f020c087dcfa5acc68c0c7c1e0e013d0a448d7a76eed847dd352eb0394a2b78e69123533a8ab588077468f0fea3be9878394de5e706e7ce7daf8ac43fdf8a2b4412d71748ab8c429be670a8600839b782bba5c754dccd0944e685f4ab38e9d9426f21704018ec3ccf41485e8eb57beb334b03495a0a12f9b24e11883752a296b61f59b62365223c34704e9e90aab272f442289243c5c3796cee73a78c76a62eea043e21d66671e64d7c14ff3d7430777cd5f29c961bb83f3dba395e19d2be02f4187f8882f82c46307ceb78814432e0e8400e9579a8278083f8284fe3f6049ac013658b08324b3cc661b6d2c368600e0a3a381cc54500d419a0d1c3cfae4b845cc67e87ca36e1432d77fcdd40c16ee0912adf599e53d044a3c9c7a19046509f69d97dd2d6643e1c5a5c75070340bcc303c1e6b6c3aec3a0df89e7ca320a0ebbb623f469cb4e03320d7d08bdd1dfca1ef01fec74f71125d9cf41beea28d7963a9df6faf6637e7e12a5fb317bd79ed3d985c29380879cc8cd12e966f8b29c62e1c86dabd9d613eab886a70c16140bb7e148bd9b3882b067e66cfd8dec18a2aaa80644246b615a0ee180c0602fa8c5264b4a26aa63b068c62191c8e248044a18547b40b29707a992132da486292c95ca8c28251a507e7aee2d0b8cc0b6516861d8310c9edcf9710590810562b0833a1605baf07b767e9224b9c74b5e90ae465f0291d9f181763a7027648108ae773db085dcc9c1b40054df69f803770f958b1ea68089dada617e06c4c399f800947353c4a1e3aaf036af75f5164bc6653540046007d43b669ba00935b7574b71c789ee4b25c3f1599e3bee192f774e7bd770cb1143f76acc32e8bb10918377974429cd71eaf0cdf7c0fa3eb6f9a8ef3893f94041c74f9242ad6f4678faa0ce0e8b9cf47b80f79e0e3fea328d89880475d71e58fb51326e7a3c55c85675e2a6318d7721951416bed6ac9415f0cfc050edbc5b813571058c96a3af08b8e86152e07f5536c597e30ebbac3d22721200eddf3c5d65f51ef5de2ee7b83c42d25d916d9c5976e24ed6ec9dc5a63b3eb9a6cc8163ff11c4e4d8f482cd768c79e131c03c6b909d8ffffbb096db2770a6915a012b4134286006730044ca4bee5083870c1952fac90a0ca79435ae2c910a01a68f081af1965ecd0e1b2d162f1b00392a22d280043052e288103c589200a98410b52d085073270850476843120e0dc4ae80c8433b4881106185c5c208800f4b0640725488a8808b9d0020a276cb18120aea0400080105958015f176acc40064c724f5b8e2084202ce10185135e2de862041ff0400630808512491821f6a0430e488a88528082119c8003508660f0821474c185073a2005048e20420067686941181ee8c0161568f2f424d190978c1632c6980109b8d88006b2986289023c29f6b084871c888600f1a979c9a400052468c0029668f2640f3610090d01e2648c9102149460041bd04016584cc144124d946c20a201888f0f1e393524bc40df42c6183228010946c0c5063480c5144c2c9144019ad440545a52c38e308d22182962a3460c567882c4114a72c089a20047ec9cac70d9923ac2670455113e22b4aa00a9f8a6f824e0e97c39291c2f84b949cd90a227b8f0ade0cdb05448a5e0e10051f04e7029810412522ed0464c0d978c0a3129c0acf0f27261b556ac6fb552a9529eaf9abcc0608227960bcb05acd1e261b9a458884912a208d68aad5e5a3d608c0d0f8c5989a02e25937a815704a080a7558d8fe502dac8b0d04381a797243124685343888fc78c0a07d05bfd80e0890623425e02f8c017d0488d109e6e30840c5684f0543e2f178208f1812aa46e4c8f46a69a218ca7d5ca05a32626d8002222454488013ca5e09243cc8d981b3e089960b6f44b109e7eb60b111a132e964b4a46c5041a8184102db0c68a05cfc68e103888c24506163469453951e383510579b17e80459e87294394a08abd08bdc4b05a02cac0fa318416501019820a254e70e13491198d1040044f30a76d010290d1b1e1255921058495028f102fac1fab97568d940f222229165e8482f0f4c22292416a0dcd0c117a71198a41227fb4784201b4e17959f99420b37a811902eb418aa797d6500bb5239e542997ca5bddb07a510159c9200382395d74b486562fac146484b8e4008b5c50b8b1420c2a9c20436b8622473108f1d20a593b323b3e888c5831204b05954f8ac72506d44183b05c582fe00e5511b02788a79a49d1a84ec071698da91f4380e068bd9ce0e24388a022181ead189803ccb1a2e249861aa010d50caa165c72802bd8c849b130c453b8c34bd95237604a0500580f4d7400df2b2860056aca15544080004100e1a4996c3fd27a58b283922438201919b161c8a7672716030c2f5070045c6c31830738a84106034c851458514ee08504a4b861480d3e2c981003b312c1161ab0428a0420f00028a2340087988e1de102149084b4250d346a3b9851860744fc6242096b930179614959e2890f17175c99428acf0f1e146ec0bcb4582bcc6400034b9e4452640391d0101f1e393524bc6ac8804f2461c40048c0d283035750808a207248e28307c70df00b2b3f4822a381c785b5c2a2080d54200a04347104001cf0c4134a20299201d111e3152145842f0ad442cbf8b28038f868a0c2e2bde06bc1c702973062c0f8bef852f06df16191bae2630297bc1c9e0b2d16542bc8a4f0a1f099e0dd7895a022e17b792eb0c607a37af95c5aad8fc5527da097f2bc95bbbff0b8bb0a2e189c2f6b755f9bcd1d4fe2d1de9305772f05037adefa050c776de94b142f4fb85e9eb8d3e8eddac7e9680da5e187c668f859b9eba5e67ad9c1f5c2c3f55243a3364c6b688cd227adbe966a4bb7a54076b9e68a1b69b574ef6a4a6118f2408eab1e38eeaa2430950bee728180eb1cdefc7b577347de7a0677b9541723d76efd24a51b5faa1f93b426f6633eb176095d7038797f57aa5dad28f2beab3582561614b76ff74b6ac3f4475b6a9ab16de7ba35fddbadd9dd5b7077b9e132f367deafcb6a638d00dcee3ed3aa71f798bbeb78c1d3c18f1c2aa3399fa30c3f7ef4fcf0f183e7478f1f3c7eecfcd0f991f303e7c78f9e9e1e1f3d3c3d3d7a78f4ecf4e8f4e4f4e0f4fcf0d1e3c3870f1e1f3d7cf0f0b1e343c7478e0f1c1f3f787a787cf0f0f0f4e0e1c1b3c3a3c393c383c3f3a3474f0f1f3d787af4e8c1a3c74e0f9d1e393d707afce0d1c3c3070f1e1e3d78f0e0b1c34387470e0f1c1e3f767a767cecf0ecf4d8e1b1b3b3a3b393b383b3f343a747c7870e8f4e0f1d1e3a3b3a3a3a393a383a3f727a727ce4f0e4f4c8e191b393a39393938393f303a707c7070e0f4e0f1c1e383b383a3839383838351c271cebee33ee62d9b8ce61eebc50c6702fabddb99ab452dcb63a9cb6d702b97be8ae1503dc77cf44f5b6f433b67d8d569afa56a5cea1ce4f96f6ac09b96bb582fb5f4cf5896dd367933eee4b338747ba4f8cdb56477779dfa766cd51dd5f5ae9b5b7af51bc29f9dbccfdde5509002f362fb118101488179b1700506a43014029a5d4dd63707718dc3d87bb832fa8ae501f5516d487a662c2a52a62ab78701a8dfabcd8d068d467dbbea4f48556b371379b29ddb62f6334eaa3ab7edcb86b8e061a1a6850d9b85431ee54db7dd628d5f671dbdd61342e300759a88d0e1d74574a3ed3686f35a178f071dfe7918c731ea2c339632077ffdc052ae1ee61b873b6cf7804777081482e30e635f4e787e6c4e85f5c44a317db6d2271edee3bb82bc501d739acd972675cabee26b813b9832f30550209ee2e77b7e1ee35dcc5dd6380bb2f71d76700d79746caa98f26ef896bd486e93e31c55bdcb63435a5e187ba7b8cbbc3b8fb8bce214ed823ccb9d961cbc1c1e991536b351d1dd2478e8de706db50ffae790c77796b7bfbbc03df721dc31db58cf7f8b81d3abfc6610709eefa70ee658d8282bbbe98bbdf70d777c369c8afaf55e9bc2c3a8724ceed18bfc9e5798101773fc15d5e1477bf5fd21ffa354a9627c6695a43b58d51a727afa5df84739f45b3eab4bbebb87b3cb87b0aeef2b6bbeb1c8e77a75b7f96b589d2721e42a3b7d28b29ad2666d6acbba78fcf2e4ffd47344a7e59d6d1dda9fb5773771ceef25c3a873b6763b9bbe72bcf38e7a7b752f26f3ef7e77d3ff7a599b374db9a37bd5dbb77cd656ca3350af720e0ee2ab8cb69ee2ee32e57c2dd4d7097fb407e69ab8deadfbb1aa5364c2fb6bbd25dc6b9cfe91c7e31eebe82bb1c87bbbfdce53cdc5d874b5bfe264c77db8ed5aca3cee1f84da2aee61d63d63b465c9675c72ed75cb3a5bbab52a0bb7f2408f104e3504f4f334f91d0240d18989f03e07015e115013671e2d1225a291f3ffc10808fa668003c0ad21facf8a189130aa44a72a12aeab01f8aa0402ad80f0158d11798130a94a22eb000b4604e2890475594050bc00aa682a5a8d300acbc0bf383809647e3c40a2635cc524ec0264e4098154c6af898785e0e303f4efc28c005d21a340e042343f3d1181a8fcac8a43e994f6646884599583009ec3eba82496097a235cc3c189aefa32f30d48907f4d22446e6060772691203c40bf55c60405891f4423d0a040c958909e285a6881a80521486a689130f28458ba8010804a90c4d4a7940df07b6649ad4a02d9a263034c6833d0111801485813da59a38a14032f493d94186068800a4680dd8538a7e3724a58c5e689c78402fd485c68907e44261689a145103d00b75e201c150988f46867a343337805486ee90a231b445d3c42587208060a8478178a10102867aa91a156db9d0146105931a662bea01fd447131f12db3158c4902bb8f4a6007ba8c3eeac9ccdc60045297314ad1d4b7b200cc0f14d7476154b0541029af088c83ad264308f1d10f74f7498160cabb008c7b1e93b7c4a22d26a9990b0882a00b65b540960b9862b15c582e2d18530a04413095fac1f3a80bf5886872d34755b09da22aba822dfd9052fdd052c1364d31a954302616fd5654f5518f8689f5c30ca4dfa7ca02c6534b140646e544a9990aa4aba68fae401a2638664c2bfa0263f2c3cc857e344c70cc56b09d1af266add4cc05b604520fc6e487190bc6945a02614c7ce6d4658ad8987d1f08c018087a204c4a86c6a456ab9915a5595232ab99a9621f4f6cf6e998adb60ab6b4a22d153c6999a5e86a66453d5a0316cbe0cc2ac69a69d16f15f3e80360fc1381e7ee35dd82987d9e02541fcf962733ffe208516633ccfc0b23a031db82c6163066302996475330a918157ea268cd107d94d5527d9e8c0d41cc58d465843ecaa22a1a9721aa997d54c5a29951d15891ef0818cfe1c57c2bea4259608bc2b0965474453dd053aa948aba8a36dd8298ad666656b1996a2947ca0b18cfb1a452d1964a45795855bc453f18168da702411655b158b09916f55a30cfa32e9e475d582cea59f97854d43d30664ea15a312eac15930b25728181aa97992753244559acd58aaa562baaca020250a4282b8a31662cda022345554610c14c455725dc28a104125c2b982023e441cd58e04ca582c1c0d034b16249455f2e26992229baa236648854307045552b98d0376351976fe64213832307cecf5012ad746af2840152bc2c604e8041e1938981408c4b8b7e2dbab4a25f11ef0b2380d192216ab9be98d7a251c9144911ad60e007a63cff54353c281b4fc0781f08033f2118ff56de6aa55a5198956aa54aa5220093a23029f7d920119c5c9979959943997d54458508ab551338642605a3817119a729e2cdbc20664efdc891156c29889914ac480a4cad28cd076e30055bf22828736429889994cd8c07b30153a994cdacd542e279f4a3aa09b45c38e8a78281a9a80a86aa543f4cb8be99960a46e5f281339715cc05d6e4a932a8a2b0a5184e18511ef51c9ecdc7935ad1d58a45419921abef9b61d1158bc666332cd88a49457f06e00269cb8769f5425d56d405e6023bb2a22e2cf08b28b3144d3d897a9af94c457f80840f9e6cc9624b94d9f66629eab27261d1150b06ce409818bac199c752b9a8284b15d36aa5605232475474059bf1668ac466ab214b29baa24b3345623315934757744635a3821589b15654b5fa59c2b5a23e43f4cd56b4e9b694a21e9d69d198079b69c18ac462309b8f67459760331e0c66a5f29915f556aa9567e3376e63e6f98d67f3c5bc55050c8c8d8d162c5666206d2da5542f2e34e502cad0189a92194265a8476363d604ce58748333f005b6e4d1189aa25992f1b4cc9ac019483dea4b2d3ac3c49bbdc0664090824ddecc85b6609e0b55510f64c2e54e552dea026bc1fc26b5145b026752d4b3f9620eb3f962319e2a0c213c99398ccdc7e3335eec8b398dcdc099bb0f134fcbcc832d7d7486459d7eb019162cb55a31ad28ab45615c601e136b49073103bf9922b199473d580cb6a48231f198bc0f66332445809894d06acbc808c1f80b9d9189f12331a09782155951b7f9c2804905218b598bc280d485b6102ed80c9d49c18ac462e817fb62423331b4096c0267eef48589770406d6441d968209cdb0a8477d86052b128b11ad60365fccf38f044c290ac6c82cada8cb80344d2acfc30226cb2c45c12b369654948945895c33fd511818caa2590ac08c459754747b600ac6046382a133a75982a12e4304d214fdaacc521444e38b211860a6a22a2636667ac847d3e435792d22302ed4973c242bca4a51907ab026af95a22c181348b7375bc140150c1462e2cd9878b30fd67af1400980942505a42d345a2e1c34e6b0a519a29a99cf6c66a9235ca91485c9204d5190e6278a15055b542543b4a22c50954aa552291006f20c013d19a29a9907635ad116fd689640daa22b19a21513afe96bf2662acaa482b57200e339987860eabbe13155933703b780b1e1371eb5e13e4e3d1360fcf3a6a0220b175a606185191552c081c20926dc28818497cb460d9918981797d6173e78b2811082108420b0a86a096fe5ada847554f5230400e7e3552d4035de0a76ab15a2d560c250286bec8d0189a2413034b8281bd106911b5601e90b3605354535ea8f88dcac9142a53a6b88831f3281517171a4fd5b03e150ca2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a6cc5a4881543c164859340e04040dd7920a8a0ae652c56fbe166080b0e09bf295000a1715f80114205a54aa2f0715ae58cc0687874a05e53eacd9b78217b3852b453dcf7503d7522c16530901c71950ce4062e65f6849e30b2d65681963e6d198235ac0d062458b1737b0a82045e50296475920751fb8bc190e5c00e5c16e40bda0f1e4050d951752a4489122e57bcdbe540aa6ba81e549140da4b430036137a03ee05a3241ca0aeac992095266dfd28d0fcc3e1b52fc064a0528550fa07eb856ad8fc7fb814acb929d79206dc196cc99075b62d1f8e725e17cb16f46e89bb16892cb10e1f1c580d4c0f502ca28f1d80f62be305c2f7409e6090fd7c7e3fa623318d8922b01b32ab3179a251e51ae2955587ec5794aa8a15aa95454055b4a097d9ee7f862de2cea8a0b4a9494d7b241e38a422365e69a92aaf95c09f0121830fbe84745852720cc05254597609ecc7200a181cbb301c502974797609ecc3e28972198007502901ac47832deca6379aaa854cde70416c5e50c973783f93ed5075bc211038b2202330150e5cd54556026f0f1bcc096543c507d55be2a5f95afca5765f6d1568c14284010474ae5040635035d70a1062e0f08085c4b30535c54dc27a5025d98a9b04c8101612664f19b8f0209238a77c213170f688f06081964789ee7b947c6f77dac8f0c2d5a52a9558a0c5005822a32522b2064b83c4ae4034206abf579df9016133242eeb1580cbdc1819a10e1a99aa5184a440daa7a92aa89a1435a32371831ab415546784d0c85597d9e832995ca89dfd4a03232d465808ce1aa019ba9416da8f01385cb8556a9542a4555506cd0d88889a931631159b5545358ab198b3a711f191a43dd975c68c13c06e664a5a2aa29a997147589b9a23282456158f44586c5125ad11818136f8b0a8afbb066535c683e150d9499eb050b4b014010f0e3c9941a30186a0354d12cb9662a570c8bb65a322e160bf62309168b92f00a92aae1d1158dcc0f03cc3c1ad372c5bcd0146dfd70f20389179a98161697cb8f275fec47125b159ba5a64cf991c40f273f9258bd40cb04a4b8a4605c5c680c58837e35e84b0d1919984a86880c6d5118204f802040e6bb8163f5a272690179f2b56866e062c18040f910007e54f57d2a20568a00e339965c56106961060303fbf1c4f35841803668544f3eefe54b3921e23960804071a79e0b7ef3d1964aca15ae2517b0b8e03e58b2ac66402ce0f2684bcb18365a748a1507b896b04479c1e2bd80e1535801e3ca8b942a383ef0a2c50b16b1282a900aad664c5e288be6050d9ad56c1595c68b16201648799f0bb32f6ab69ab2840defc5c91753d9983253a9e80b9417245ea0785e4b85256fcaece5e5e5e5c5c90b124f523e64a8ca658afbbc50952a86aaa8aac9c7c3522101f442534e655e625e54f485c60566b55ad980c2c05315ae9694094cc982ca165022a8e2851530ae8881658c2c3c785a0010282b20137081f45b6d0125021811577901c68c47b18c9185071f8f0b8c081a5133abcfa3711ab0d572ea7935509acc6866fe050db0ccbc1f4e603f3c8f7e535c4bacd5c762a562626258302a2729964a05f591a10232856b69855989c57d5c9801d1024816fad18f5a492901048819505872f03445044ba56a0a90200276df8a6f1d4b5bc56af36f9bc76a6abd4f739f382cebc9e475ec1eb7777f31a5b7dad45c4d5cab364c44a9288a228dfccf4234aa2d253fbfcd56aa7765cd559ff4565c564a23896aae46b48b2df95b5b9d3f776a5d492bd65c4d31cce99aab79ebf89f856848be35cf71c43463fa9f6d343f6edba79f83e8ad4d5f7ea6ba8eb42c2bbd587cdcce58eb1fc793866d97e8c83c712642a3e9f0a5d15d997013fdad314e476d9852b2b4b8713f6e637387a34fbeae354abe0f16dbaec5599b27ce374a1fb743bd9f08b5e66c67fb070a494bf7ebfd9ab4e27ebd5f8bfb356daadaeabf7f1377b6ff1af93bb4a5fad4f7f5c523d54168c810201dcdb923e11e6bfe7d2dc522f9966a7b43bf498907fa178fa2ad89d2681bd728fd5cd5f42b8eea1f2d792db5d52f2979ebc5a6aea7d6f46b368fdbaf4f6d6b5b5f5b6f7567b3f99350fd4df5cbd7e5101ad22eede8c8111b5acd8d7d0e23511a68d44644434d6df935ad3463dbd19123e2d5e1cb246efd352ddaea9762cee5b40d8b39970b7118677a74e408b5e6ec6b1508b7ad4e14c5703bfdbe78bc9696a7ed2f121ad6dc7c6e32571cd53666e9ed5a9ba5e12d7c6aa34b5b6dfbf3a89932d6edbff4715bd791ac38d7e8d7f08d9575c4a5f9e358e9d7c85bbf5643a35d5b770dc768a5196fbaa928ee9e09d3dbb519b7c97f7deacfe73e85687831fd265b526d7f57baafc526dddd4ac30f2db5d9b89bbd5dfb354a62dcfe1ca6fa6df99992f5b7ae36e37bb3547faee66a525d296de352d398eaa64446b3db89719bfa0c4942524443dd644f266f73b553d38cb5fef12ffd5cb50de36c44c37c92946eaa2ddd3d53c5bbaca3cd786b8b2bcd138fe549e2dcdfaa3ee99766ae3a3dbd336a5a9cce7f75d886a90de36cd24ab5ddb8d44e7fc31af2c77be27b2bdd953bb27e2e2bd55517a34e7fc95c6f9fe9c5f65a31c48dd8fc5dcb7008d00ce8bc595ba5b76b77db96f5667b32f94cad59294d641a1f37ea106f4a7338dbe82ed7265a965647ebaea47edcb56f0b85e8ae34cd1a6e7c69c6d752f2c9b31c2dd5ff393cee539fe5782dbd955a73960392d09a95e667ca5827da6c38a44cba6e7a6dc58d37361ba68fdb48343f591fa7775f24b46645a264b87b263a03d5d5ac6da977cff4241e5f88de3d93780b4d4a3e1d6264168444c9dff5feaee3c5e3110d35a5f5d8f649a3957e8dfcbfeea17ebb6d596ffeedf4d53651f235369d9e7ec67beb90fcd7bbb2ac58ef9ec986f3df2742c97f6d856b4892bb933008c922e40b979029ee4e69f8a1d48776bbf6da9afb4ca35b5793fe786b1379eb383e89838cd85d9e4764b29ef367fc243f0540e288a0330440801c5c414b70767ad0d1facbddad547f2e578a1b77cd19793db83b93bb80b0b8cee1f823e409776e6e687017101477279f0905a2717e1fe8edda5d793125eb97146faab7ad516bb39d9a92bf6d16a75f5f6cea3fca8d4aaebdd98ca44442ded94ee7b736bb7111d2e746a75bdd48377bc4dd7392e024b935cd94f20c87ae3a5a9675a43357902aae204e1597fb6de997b76b359db9820471f7509f355790cfddf1257576ce1ab870771cdc5583e96159be4e576a73bb76eb6c6dd486290d776579dae89396a4faa90d53991152602bf5a558df8ab58259e919f9b9df44b9df441ab76d0e41e4ffbe44b87157201a36e0eebecf9c8730211992a49364dfb7e39de524d9f773bb6a8aafeb977ff463068f9c9b6bbbb9b9b936318b3f36b6c992d4c7bdc4b8467e0e8f321e3ce78fec67fc2419db6c8a38bf0f17df9d752daba96b1e524d2420405cefaaae9cfdc5ba2ffa3163a1dbb563c642daf6d9c8963509b65da2bac799bed544ba5dcb54b7167d82fcf081875bffed766aba71379ba36fee76a5f96bb9f3d2c76d9bc7eddc79cb15b7e953dd1721fdf0c00f9cb28e389b76fc2312e976adae9fc71792eb5f6ba492f7f3db3e37e533c87d273af1e02122dfc90a65bcc76a23b1cd6f9abf3579bfb43f668c4b5b59da5a7ea39e19f78d4ba4cfd9a43f99541309796d11f25a261f502e1fdae5c3050f95966c5c6a1bf25a261e9684fa71ba969a92e46fabb1f9e4bedff4545b5c120d372e35fd9cddb466b4363bbea96fc86b9962e4ad9426bea6bd69561ca591d732d1e8fd267ba34ffeced8fc4ce9ad545bfaf97149487c80e19bbb4df5db6c98e7ec71c6aecc7d3622bf2c6d119cae1b897cf262205d626c543b91c85c757f54626c54626c445e5cbb385ca21fab8984bb9df80ed9b8e89bacbe6f7b21b76b77386ffd42c8bf6f22f95db72e3136c51cbe395bcb20f7b29ce96a2671dbe6704f6ce67090d65f929fdf4834cdeae3f3d796178b3977bf378b34dab2761af9f8fcc8e9d14327eb1d32769c765a3a6578febdad2ee96f354794ff76ad9079332a6dcd0dd9d81ed53e87b2dedec8ae96a6b64292b605b262dd55084f0f9dff8c4b2ac2d343a7e290787ae8605dd233d512486747578f727674f5086747578f7ee8e8ea518f8eae1ef9d0d1d5231e1d5d3deaa1a3ab473c7474f5684747578f747474f5084747578f7ee4e8ea514f8eae1ef9c8d1d5239e1c5d3dea91a3ab473c7274f5682747578f747274f5282747578f7ee8ea518fae1ef9d0d5231e5d3deaa1ab473c74f56847578f7474f52847578f7074f5e82f2e12da6dbbef93443942fcc848bfd57d11ce0edc8669eebc4f6934fab8241f9f6a92b7e6dbbedf34c4dd75b80b278a87e4e74efd192787e4ebb39afb7ece67d0d6d6c86cbf165d38b1907c5b9a66a5f7bf4675c5d1fd9aeeb6cd18b7cf4a755fb4e302e110778534b82bece1ae7087bbc2586b757110f9e43d315012f9d9ea17a2c346304efaadcfbc2f0ee43df1d1673c22e5df38c911af17877d4f1c74bb38e7a0b373ba7bd2fe5baedbdd918efc7db0481989289ae269e67090fb6ebc7fcb9f1bc234d65a5956211cc8bf378b746dc5055d243716c8df5462249d333e828b92cab2069d2546223fe38d848b8c98466c04c96edbd2d6acae2f54a499c6c77d16bad86a6d73b513a9c4d8e8cb5a2d6d6d9a5d1c36c669b35e24773fe23e3ef9af3df237f7bc795d71e68ddde599dbb1db3657738605b83bf1f4e0b1a3e394433ed3888d04f96fdce4e373bb76e326db74f1f81b27f98b8b7a74724e7daba550cddb694859ce466d8ffc0be93777dbc747eb8b75fd231994dc55b3c55d353f70574d0edc5583c5dd635eb6b6a58fcfd6b614f5add644535b234ede130b6d5cf4242eba55a0cf55a44bb471517edb547f68e3a2df75b4a5790aa929dd7c7d93c3a4931a166a40a778534dfeed56dc6862fae7b5fbe2d1e64d4facc3123277c5ac701d573f26b5c56d8a1b2d4e476d6eb5b4d124f2f5494fac83ff80137bd091864e8813e6340d014272948444f3dc93e2e91c7e0de7ad73429c50e7e6da327fce06a2978e9dcea135abf8bb36d96c8aa24ec823c4b9b9e1f2f3b9ebdb284ddf536c62a2e993925fd6ea7dfa35baf599a3e4adb4acfb7ecee69bdd33b93b11f721ee8a210d213b88c18826a908072441a290221c901c894262915950d09022f456dca6f945f29e38d3198f3027c4b961aae3f84c4f2defe94988a79727f7a727ff9e3cf5e4463cf91147b8bfb88bbb3b7127c093bb3c3d09f174c493fbd31301fc690877f798fbe82e1856d0097772429c9babc3b986d31597238a529cae43eeee3974e0eee3638469c425907b59b8fbbbeb852aeebec7cf198f74e3ab29b5594afe1edf747aaa2d7d5c12054213331669e403e91cea6d73b6bc0902ba5d9b379268eacfd5bbc76ae670908fcff8241e9b74764e597e232de6379d6a8e69c4652d9775e32d3ad59c53cdbdf8bad6643a3be78f53cde56e128621717fb2e69b89c3d1d6d588ddf612f960cb7aadd068f5b5793b0dd995a639cbfdd63b5d7146f98ddc3f8791fee2a2241815dcdd88bb688cb80371f71edc45c5f0dffaaf88b34d1cdfd43bc66fa2509e003c1d2fa786a772b99086eb1ce6df56ccd5cf5bdbca276d8e24da5f96d5c8e762abf3274172f71f3d6575b5c0847b18863af69736bb7ebed18d8b68a869596b798e651d6fd792f7a49f2bfd1c7cca6ffa52acfad6bc7d70bae25af871df19e334c578e374c5519fd7f99b3e53d296b5e912e91ce274c535e5d77ff49f85466d733e3efa3e13dee7ae1be9c75bcb0ae4ee64f95687fc4d48c8bf3808911548e77c7cf4dfaad67f44eb1f71de1a1b61db25da65bc2b79eb91b2e637919435977111a977d54846be69dabcb54f4e57dd8fcee18e7047e7e606a72bee9e3e3e3b63d33cb5f8b99a6d7fab196fede3f339bbef99574061051356f068d4874677a5bfebd667ce380817e9d741a98702e9397990fd88653df758f5ae1afddb44bdaba6d6b50cc28dbb9ada0ad1ba96630e1b77b3aff30ab86668709d43b2b4274e4ea873836dd7de7c59474dfebd59ad71bb1a7511850a552c208618280ea58186eed7369b2a861862a034c828795fe523893bb80107ad08e20e0e000c721008873b380379b87b91bb5268ed8cf50e170e1e3891bbef70ff50f8747077d15d389876bdd9a6ea3d0e2d81ef7be291d220a3f74b71dbbe14c912b356d89aa434d0406b62f7cb70ccfa8be2ee3cb80b051e27f1ddf19f776d4789c71d3b23ce68c3e961e3b1edece4f0203f8787ccf951499e1e3d7a7aecd47478ec8c3f5e67ec41ee18b73ef30e1d9288826646b320fa439d489bff5e9bc3eed6231827b98336f949db84b351dd5588bbdfd8b8bed8eef1cb211a9b4521f9e4ffe8f454e7dfb8897e3ef51de25f905c03b8c86df19546a28b203b9da75220042af574e42923a3261962e083af166080182a70860e9e6a6a62c6075478389884f544004828ce6a01912074a0a9c73d01e01727ae5081b38210850800e1cc16676dd9b265cb161eb80a0147f8b8c20602f7a814d73a31857f392057d8b08bb90a01a910ecc4d0c3553b5021a40747a87b0d4b86236690b9337951021cca98817b2108e24905564d9c9542152380220d240eba7cc000e2079a9c554495274b88b0c55737c0541aaa6c7167d56f6fa1c4bf1d0c8539ace087bb11a878520aa20315e541410d30b0c5593f463046f9d980ab701005cd83aa714f4a0c880997039e3a52821274707a807f547486c034587016110790e2c9c813ce32a30706702086e61e4604d2500247037c35a3c3861a51a6b8fb0cf766cbfa3e58bd4fbcab465ccb13cd593996830ed2e0392b8a47aa5e1ecb6d78aa13bc1a5e4b07f4e12903802db0be564b05a63ccf51f842ffdcbb01acc173161095db5879ee799e4ac5e383f9dcf3bcd437e4792ceff3bcd4ca87cffb3cd677c291e7ad3c967f9e4c98fa56abd80bf5c0ef039f78a0e77d2f1e103ecfc5551ef8a5def3963ecffb5a387c339ff7adc0cfdbc1e77d9ef779deeaf36ef050f0bcd4d70a812ac5aae19de07926b4525e03bccf5b7d9ef7a544ef035f5c787c319eace5a972a468f058df07e6a45ebecfabb1c1e30100cc81114a197d0efa17010f4cc540d5e7a55c7500af069e7fee72b9bccf2bc36b7d3278dea7fabe94e7ed783bbc9617f37ddfb70af2747c1ff87938a9102685560c9e0c092a7c4e78aa2f050ff4529e7f461f7df140ffecca29cd2b40ca6942e07990117c296fe5812c4fc64b41f9be964fcaeb4979df07d22fc625e6a93c8f8503e6b880e37d2fabd6e7799ec7f23c1feffb60905a792e1f986af260dfe979a91bcf05e6f35a2cef0bf2b5f0b5f0b190f2947b36bcd5f77932a02b057e297cdfe7ad3cd0e6b9e4f060549fa7f26af898f98858302e9f576bc5b03eef06afe579a9cf03bd218f85efc7b7c207f3b13e9597f23eef83f958a09752a53ccf8797f2629e8b17e3791e10af85ef25c5f25aa0f7799e8fe7ad4ef86e78e0e7a940efc707e3a5be16bc54eafbc00ff47e7c9fa7c2f7e2b9782df0f33ccfc763e17b61a53cb0057a9ee7837a386468fda466507929cfc50371782e2e3e303cccb4e0bd007adfb7fa58efb94cc08119ba71969bbe43109e161dca70aa031459ace84033060f72a835a0000e34c0e249342f702428be78a49a023f82628b061cd160243740b1a4c5a8f20862048a167e305457c0f901058e1d3f6a8d2a7cd04026870f9a178f87069e1178685b9ee0a147f0905684166e68523e1b2c52601b8a23c30c516ccc708146635ca02890e0514a50729a6a09a7a000dc53eeee32b8832fd400702e711e2f23661df5db9e1c6bf5478f0f9e1e3c767472709618b95c68e81cd65d4951c6466a26d58127b0004fa091950cd46301410897144f2a550c2b86170801429103a21003812a560478028db89cf0b2020e013cb9e800ee906a0166af625a42ad9ed54b0a088e1795099e5a549e6e2c11c2c547aa013e8899c1936acb932a4605163cc56c58079e5c70d4f85840543b54067062024c0a4e0c0122f16483c6064deae6b5a385e3b56508d50cad1ed64fca46eaa70581a7d4919c1dab97d5049e52302b15401b989c9407c680362f42aa19583aac5458bdac96626ec4dc70c1e172024b8794118658a9909a3284aaca130c4b608e8a30b000fac4d858bd402f75930a028d6250587dac1c5833ac22950935bc154c4a05c6a452a92fc54ab5522e2f2b8029160e2c126c18bdbc582b969762813cc01da0d74a213523848b0baa2a9e6a4c4088d70a9c6905da1e79008b97a5c5690f480971db7c92ee2e91130f98a1078c4234aaae0307e8801007b4b8873b74a55ac75f4ca3519b8badad29baf608ed62a06b8fd0e8bf8eed6ab627bfc49972c0021ca085b6aaa9be5d8bdbd4fc67ba5dcb44561a2671a027db6a0671c015fec9c4de9392b7e67e136d8125d44cf7c48df4d6a02da0729fc35b244165329d1d991099cecee954739624c98b6bd7e6f4ada61673e7d5b6cfe6c53531e33d569b6cdf1ff31bfd9848c812e3f467dc16afb87f59abf96f79365d0d48717751034e1a18daaf3540b5d0e255d4c28a1653eee9a45e5cd382965f8b9e9a5fd4fdd5c2259af573162a55dca944712aa6fb7e4da547fc31632aaeb2c4795f2c19a0e2eebb6a8afb7506a0e0dae70c98ee62595adc98812039bfed4971cc40cb3de3bf160359dc47cb84010ed4fc22beb27dad598ffce724205bf3cb340e4ef588ec87e99eb8201c6ed7e274dd5a86dbe60bd9f9f824511bf3d4d78a5aa6b76cfc24b29ad8cff8494c998cdafc7c3e35369d8694f5246d93252f910e5fa015d22cae78b8ef898510d18c8bb288a22d898bb2d83dd35116397cc45a578a77ce52ad635b8a35b5f9265b7e116d012dee16a86281271742f43e600b0c795873cf18354f6a810a68a9c094b28eb756c0e9d60a186d5d05647c07f99f6de4bd3597df4c727af26271c5fdb30d8b291e2ad1b078e2c37fb661616261c4b178b9a658710f6bc86fb2e514281e6e5dcb8bb1a65893ae29495352b8220c770f6b3e77ea18de7446ca64d4e68abab5f81bdf5d45525644fe6c6d8dbc75fa5b54d6fbe55f5b5ea28cc5ff7c9a148080939502d8dd7db88b023d1e3a3d79de6c2d57b525b7d5fdcda74967564485b6aaabeeceac80f2d06657eed18a28332b9cdc37bed40a23775d29196445cc277045eb7873b7f704a0ecca7d31de3675368121bf7d699b6c367fd7b28efac99ac337a88aa830b7e3ae2ab4a03c39e7d55553cb70ba0e95650daa02c7ab68854a34920a2c960a2aee4e92958a274efb264c054e4edce32f7da6c2354516a87c9abfebedcb277165fd8cd375c8c72729e39c1fdb2ed11431774d319372855e2452a854d23c694fe2d18726058a597533293329d4435d714fdad19e4812f022572f05729704b04b023cdc3d4c92312deb38648f156f2a01971450a1eeefbf6e7f8d3ea9c3652905ee964f338733ceefc3cd75490183fbe3765f44ef9ea9766ad9ee99647f9635c9ee8be47edb27f11801288fc0935089a6f7899fc46304704ed6f6d964c15d11085296962902383c54a2e9bf555334ebe3c4fd1a025ac4fd1a02563c54a241200a77a65c739f87c8924cbcb5ed8f74aebb92350ff1f1497a1207d576f588ac86dae8ec2cd5cfd5bb6fd591444565b581bc9649276ebb941fdb2e51c6d7e644f1da1c796d9137775bccd8be0f563fd368b71ef265edc442b6c6397157d1a9e672a393e854734e3527f44df6c683e794e5ad2fd1cff849749a7e72a3121f9f9d26998f4f924896180a27f7d0e96da7a6da922506423e6edc56a79596e4c7e4a9795802c590d2121e96d090099f4b1493a7a6332866307922d5c8fb48babfb2a41f1b12f364c2d80889713a270c549675a4122ad176cf24eed751a0844a345dc528b87b8a983c7594214c9e5a8b03a0ec3c7300ce2bf9db0128689bf10bd94e5f2493c9927e3216fa19f2e384818cf25f1d92dd17f1f149723de1e44f0479e286874ab4bfdd5a9ab2fc47393f999f14b2f5df2cb94f13a7ebd0be9fab29fb193f89ce4fd61fc2b64bb4c9ab84a3a3a4b3c30012e4dbb5bb6aea7f1b4f0f9d219cae38243e3e5bffaea58f4f6e74fa5c6e549271ce3d6759d611a7eb506e54425a716b3c9244a415650b704101555c010450008f0460f19056436d48229b188d3655dc4902a96702aa48409204b8879fb37b674c6d6afea6bfb76b6bcd41b1425d509c3cd4e47d283d5e8fa0f83b6102279a9ca0e659bf86b78d4dfe5d4b8a00331000055f9af84c75d3285911d072f70364f170dfd7b3031820aca1e54625e47d24da6f1b8ed1fc3aaaff850e707400d03dcc914906f8c2003f78583f1b40c900373cd4fad426de9aee9a43132c68e2c9c323414ab2cde930a564c53561c43dacd48687b89818828b8929357f33aec5e8b6e1d7eeccc584c9840a5d2ca15b42e75a22c7132b7ebf4631bed15d59ab359ccdfb4d375ad6f3d6233424df34712677fac4f96fb7923564fd7cbb96d658a8afadb9214f9a9e50770fb7b6396d67e1b694fc8c2fc6bdee4890127a32c1297103259ee88aa32e2592dccd9a37dd3fd6d27429e1ae24a84842497932b1fb6fe4e954b5b54dda924d49d4e0ee39b8ab0059dc3ddc96e26dc3745775145f5a4b6af365ade2c6faf99e54575d01a0e8b3e2b6c515c00c0bd013ea8a43428b7bdd75e3dce71f772121c577fea66b491a0d89a14dfe3de9e3928ec8b51c9fc48db7de7c0e3a828a87e43db18d923fd2c7251de1b4bb3547314e3ac228dc6d33f7f4b34e721d11730f09a0c5afcde5af691d4904a84200a7b0e64890126ac3648dee3a7e2d4680210ff3efd2da86dc65445448fefe6c7e59a3251911e5663f7f13bed5658411f770ff8f34e34dda6a7e92112d2aeeb6b336569369ac25ad549b1597df28d4f45a5a73bb769f3863f2d4da525d752e274b2ea698a458477735655963f4eaf0e392643f4e1848262bcb1a24d33b24aa2b4dfaf9c98d4ab6cd592322f9a4cece99fb6dc57f5b6e54229bed72b5a3b5fdfddad64fca6435b19fdca8c409030da0e52ae28aab8828453895bf8b18ca8d4e38dc55442c54a2b988d092e32e22a67ccde651d74e7d4f229edc9568175b7ddfd4a7167fccd8e622622854a2e9fd5a5731bf4d249f08193c54a291f7b58f0f8d07fa8fd4a39373ee7be25ccdcf34e252a69dea116a53d3a39373521ba2a0d8cff849f2e74e7d3f67b7aca6e7a4363d67ece79618d7446d65f96dfe9389287e6d5773e4eb22a6119740bbe6273f89eaa59261b5582eee3d66eeae7abd72bcf0824b8daa874ac5549a4c37b8bb0a869c1eaf1eeefe82e1e505090c50e9188153821120a20c99e0c3dcb163811577f7187ec822cadd5bac95ca25f5793eb87b0dee6242777956db93942cf15059d620d2e224f9cbb206dd6f1af2a4c5294ddca749c3c1f57400ff8b371eef496d849e905c4f323869cbbaab8d5e7ca9ee2fb5a19fc34866cdb4382de6f0d6a76edc3b279ccd9bd535912c2d4e64dabadab0cea499cb386c13b5a8b3a8372eb5aea3489e48b79ab39f8dbe5681ead69fb3494ea4677ac891e4887c974f5d3f272539d25bdbf2b7c5e5a093380e37abdd5dbfddf7c44064697141aead91fc1b2779a6baf5c561eb2ae4ee41eeb9e290888872763327c4cce5216cabb91ae9df67cdbae66ae4fb7e6e567335caf5c8ddf5c62592f68a4b528773901be54625eeee983c917cf0c1dddbb97b4e9eaec9dd3bbdadddbdccc4dd333dec3e3e2b7fbc35e8469e368cb7defc4d98487edbc545bb3b7b7397b473c2d9c8079395a9c446494884d05d35dab2858c21844058400dce51e00494123530e38a6b810016402db1445d0a2a4d88219e11e507e082ac2f1441c58b38820720282054dc29064f88210113d0bc6c620c166c6003385e8d2882d3f9423d0707883120f042891761e0052b2880060c70210cecb0e5388115af81082f9ab861450cfec3d5a4044a7c208aef041d1da5e06ae2a14c0b44a480dabca607258638a37e0e43cd0bb430d108719a5a03683ca080390b46b8c01764c8f0e42a9c9143074570798e63c78c264550200137a103608f190c40052fc1c90b4d180942c95f479440054d249181db08017d4201352a4f35623610c3043f513c86ca929d12a0ce7882c919a1596419fc25688ca72c5570c05d7ab4387aa206503cb5863200011e54e09e584c5620a288243af8ea8a920c29b648c257de1542f40122573da5e16106368280573080021397251cdc81092526104413415239986d19c00d864a09a0290a53872b9e5231300a2c5e8882fac2908114412710e0e94382840b984c5e501f51179985224488f2d5f8e1441143977a57b4d8c009657481e349a1828816505e583c2080b082024510c3c84b92c50710d0c309eaedc460880b4ac8428b77e389026e68379e78542e4091344ef0e433c039326e0568f12a41ec185e98028a67c1c20c11c02dc41c8a13d89dc40870bec40e34a4204636e44334c14303352660c54f235d1809020446dc8a30d84d718228dec31446635491c593e3e09200db0448166e845c22c30f4c7721516025945b20e13448f1b2829a26aefba8460420f7038fe740c5544338d1e236581881011381171e8b8185a817a0ace0395e37353c79c089539b9317441089c15998d9a902082568c05580810a100709a081a300448e260ef85101372105145460070174380968384006481fa880bf58424c452441e4368c989093b4012d2ec3011f8800070e311ea3c4062c8606428739e1081ab8392306ee1204a5a01b362082b77e50020d9070e2f3d64b0c3050ea0012ceeac932f3840a20f8ea07338e3481040f5c0506095c801101ebaa9f0aebc10b443898c58c01127003000efe989201287478c05326c880109680aa9ec2f50007811c74e129572823c51737f807b503f0023dfae71446168f06a27f3d4124512027c6bd2358008806549e70af045d6c192ce1718f01b02258400440b8977f761520c270cf089473478c08eec950a505174c10732fe6c6029b0f28b89fd1020caa1f10e07e45015350118203b883e0003bb4ec92b853c08b175c81048b7b0358a416167cdc0be06ab2016cc13d005ab42cf00410ee4c5820030fa480bb4d48aa898a8c3b0f32a87d67e0c0fd68003a80a1420eee36bc80cbf18026ee400960818e133fb80301c3dc32acdc7b7860888e0d5ee08e3364bd20018ffb0c221765e423b8c7108431649822e5fe827731ba0005ee2e30118111472080fb0a35d07e7c0ce09e026d479622b0e07e82093af092c2c5fd860f4c6831b8e04ec23709d1920277571154c0c00921b8d7b882c40bacd881bb4c921a1dba30dd618a5083062b31b8bf848006fa810bb8bb54e142123350e1debae207266460e1ce3ac14d800942e0cefa968405d081fbaa88192fa70d779514991620f1b9ab6e8481050740eee093033409238a3b9842173e1ae0857bea0a99d60952b8a790d840b90114eedf10608648e2c6fdab6202251c200bf7cf26c31f39c1fdd3a1c5160280e2ee99114518c4e7ee714026809905dc3d2588503406cbddbb19fddc12e0ee015569920615778f46084af40872f7c01f2a600207dc5d071e0e11057757010f54099670f72d5a004528c9dda78040154980ee0ee5731eb8c1dd9de0e055a5e6ee3e14010d2e9cdcfd02008503b8b8fb588314272cb9bb0e31025c51c4dd8d70c45c51c2dd89fc60d78475f720518021821eb8bb8f8b89273877e75193031626ee1ec2e0032307dc5d061c383890c0dd61b0c2801f9edc9d266a69053cb87b0b4d869678dc7d66c9e5450877c711c5882049b8fb092e34616ec0dd4b98411753c4dcfdf50222b2a0c0dd5d2e2f58000edcbd062e7763e6ee31676012a4c0dd61a230d1c3e5ee2f4cd048618abbbbd45498c9e2eead9c0d027004776731f1540606dc7d7582b2c708775fad401343c8dd5540e0d0438fbb83659c4466dc1dbc3350404440c1164df8304087bba778422203b8fb570327b090e2ee9f134f4ffcc0ddbf249831dcdd7972f658b15964c9b3de9bae3557f3e29cfd5aaddd9a6f4cb60da020eeee4c487777171331a5837954451837b6fcc0dd4129514c6154c206aaf87077af06267840f2c488066ce1eede113b70a126ab7eaa70770f04a920566003183ee0dcfd1bc00b371c6003184a6002774f01a1073d5460025c24a007eefe2949810aa6e09841184bb87b6a4a0c019266aed00191bbab68c8c9a270e2b3b9c2dd3f23436a20e3081d4708c1dd53262861a50c27a06ca10277f74c090000030f5062060e77f72c40819acb6c21050aeebe52c001a23c307c8e10c4ddbf3180b0c40f693861031fee0e2e80c64a00ce044b3370f7fd77ebdf373bf48e1df875358f1c0969b45d49259af6f1b1958f44e381bec6818636e45b4aa3d5fd39fab89d7150b875ed447aba2b8ef6190759fb341c1296650d0af7695e4b3f8769ff423889f66f2bcb3a86b4b2ac41b4b7d9d01bac3933fab789788be2bf0ddbae15ef97dbe9b4e6ac28d455c45bb489babf22de228dda70599becc984b46289b1298619db3e87713a6bce7ebcb828c45b0c6924d18c76f11dab356748629871a51b9f4ca8b6e64cc86e9669373bf67d5b8e346bd65dfe263c6a4bd29d7e1b3aed9ade6622e1aeb4d930792bee5a32633c9678c41b67f335b6d55d5973789f955e1b5d446db8fae8fd9ade6c98964fe29c3ec3d7373bbbf1edafcd3567b3495a5dfb1b596f74b77f5f4b6434a3a47d223b31ccb9d196dacad7db52a0300ca98dce0c40d4266706a0d8be95bc3fea2729c5dbe66da90dd07d5c0e34245f6b1c79928f1bb56975766624a468764424cc6fcbd8f6e79f3724917fbbd5249af8f9c98ce99735ab3536e9ee6bfa4b9396189bb98c6d35baab395a96ba6aab6934adffee116ffa4c35a74b5bf793f4e65ded9df6d678c828d4bbfc27139ab12d69dfafe567aa4f7c71c68d77a7abd611d65c4d1b164591469f24ce26c54228cdedda5bdd9a56aaad0de7ce9cbd368771ba70f74c2553fe1cada415f5df33ecf177ebad7159c58cf5f84e7f312dcbfad914456d6b32c3fd3ae35d4d28899128da9acc126393d27bbbf6e6b34985921851bd735b639b0ea55b631cadd96afae5aebce4db2cb5c13651bc38d4e43795587fa6e4c64d63ad519bdfa7a92d49dfac7944dad544bdad68e6324e0cb12e6b0edf201a6afd99242bd5e5df5b71a30deb7d45263932fcf34f263457ddd561925ebbad69c7cf5accfbe6d7db86ab2886afad2e3f6e631aed7318e94dfabb9296bc75a4d5b43f7e162fb6b4d9671c4422a131ed6afb85c48c6d62480bba5d7b6f168916bb287fedaa7848afdd39d905710fb5cb5f3b1c4e3a70024198b1cd673cd24ae94ce76b3fe37157271c1d16d74d2971d24b0745a7c4dd431d4e531996d2260334d9b82b2db9d8f2b08486e49f669c5bd07036a4e56109cd76ee70aab05bb0a15c1dbe4cb89b3d6bf9cd53d34dbb38ec8bb5160de5617e3bdab2e668d54fa1d6b8480fb910dd3ab17898a1f8c599c93da90d4ed7a1d8cf9f4c5ec8f849b28bc995ad9938b94c94d86c98898bbe501223f3cac64d2614770f4d236a33b6bd4c9793d80a7e52f19273e7b6c62da7dff7c7cfe2d638a7cf7b8acf84cd28d7f47a7bdc6fcb8a489235072557864a34f1f7df6a7e3223d9164826d3670db23519ed2aee2aee2a927fcf6cca8a7ef4e7fe2867f70f5e06f110e3235a6dd3ac0469c83481274e537a1faca636363cd042f2df44c25463c2e14e5322ad68b3abf1400b773b5773571bf56b498beb25289c7554dba527e412cd7d0927c4a1da2e799285b24f3686d3e2e10bf7c4dd71381ede4b77b5a0db15cf46478e86e8adf4f6a4e486e3a1b6b6a8c76d9b140fa9cdba7ba849224b7e9587e25ebf1c9f86132ad1ee9bf83d54a291564828aef58f24ce4325dab6d79247c6a890fca6fa1aa5f8683a39f6b81e5d3530f2635a7715a26b4feed78c3cd4fdad51aff55571b5a7d2aad09ed094b8d3622e6a0995682215f1491cf2dd787f6bab7535772fb1872baf1ea2844ab41ecc1e7094b2b8bf94a428392929f912a85089b6c4892f315a42b5f000e5a112ed89f340e30167872828dfc1c90e467edfc43be0c0e23a4cd1c1e9a5431071bf7ee9e00a95684aaab82b49c0dee27e5deeed5473e5dea2adc9041aef4ecf709bb43a11b7717e1ff4e3c6cf39ac7518a7457caf0e9325c623169d6a8eac8fab4c1897e2ed5afd3e58fd198fb56a736d12ff6d22796b4e6b118bb6dc84b7689e4914c039c987a41c18a7a3d15dcde6df4669a6dd341ba636b47f1b6df66f13df26fedb44d36ed90bbd4d1472d3b95dc57d5fcb7a7c7cc8ad4553231d45b9d2121b8cd3f1b08486d9525d71afa3291e9219db6cb5261d3d31d5dc5f7c64e4ae752d6f88da9556d7bfc18a1b947878d26c48fdb8bd77d5157703ce0d2e6c6474c5bddcb8c9c8c93dd4e16b3414deae110e47228393bc78acd844a2c41d090e1297874ab4571116772f82c24d4550eea97f57f5aedeb26e6bd651466d6a904cffc6497ee3243625368ac984e88b654c233652b7aed55dbdbf71925d3da2041f71b97b686b46b46821a8b29c198152564d8de0fc766d90911e0f33d67d0e465a78cf5e45aa58f22bc5bbc8114582e8dd33d1cf61b2de8acb2238f6ef6c88720f5f365c711b9edc3d5f9bfdbb970d384ea33b4462ec94445c109961dd95d888863b920867084bb6fbf3d0d3eb9bad66ae8e43b4d7b61ee9be8846af1db22102e5eed5081127770fb52532e44ec415bede2fa12bee4e858e92d0c7ed22212a7eda849cb8bb108ebd65ac752409b53cc4b9cfbd8654d1f80e6142f6f9dc15e73e37c408e73e2792641d12fb212d0f956858a0c81702458813133685e4102ad1c87b0ac982b6ae466a365bf2b5add9ac63d0134146dc431a92b616240344c543f25a4a968fa37ab4ba0df4837ba8236ded05640372e56839d0ccd758a7a38f4b9a51a129f140a3f96f179794246d4de835abcd5c1e925f9a6726ebc9843ede543f699bc80f72c53d2ccb199dbd8240710f5f41704186dc83d01aa2dc6bb8524307dc3da477e352d76054434cd4fdada15593594942220449064566ba6c4826030d57dcab99b344e8ae9a3a3e3f2e898628428868c8cd643531912cf16713a96a721c227eee1c2223af2df213c5fde7c943255a55f2135e9b1349206284b76baf92c8030d0802800c79f944b987485a47cdd53471cdb70a859a56ddcca7caf54180bfae6f24fb0409956864aeb876b198ff76b379fbb8dcbd2cabf8238b157f40b907fd781242441f97f4e347cbc39a1825eb67dceec1e2eede0315d26ad403c5ddebe360fcd5e3430fddd5529f179bf6d61c2e8bf8cb8795abc3a40f06f8c09b9a55a7730dcdaad3f4cb7137becd967407ddb8d495478bbf266fcd3d797379ac78f8241e79a4f06822dddf27f198abc9d3727792ac3daef498d2e38959753d708e4bf17bf4bc7ae0e06146fe5bbd35272b31aefdb57889fc5d370f283c682f1e74070b6db66380d70e939d15dc43ddeb50a19383ce9743829c04e40ce5cc7078f0c27902c7c9c3cf66ee4f4d146e4babbd5dbbcbfaa7d63735345a8c925fbb79e1e0e0f01d68cc5e3bb4d831ee9809d1f030c762bb6b7e5dab3638d06a697316c96a4bd2b27d85458434f7b086d694658dd15daefb9e256e2aeb2cecf1b035bbc18087341ac59bd2688931ade6a7d19b21f25e5c74432d5e32b18d96106f7c6da0be66f3a4c886e64eadcd8f87336c99610ab5c17b776b89b1f99a8166337dcd80c3dd5f3290b62646673248e0258391bb87369a31c59b2ad17c7c683cd06b6732b4428a77cd150f31ae89e2e1aed4fa4bf27546af1aa3d0de7049751d2f119dbd6a78b8bb117fc5b2843adb1a8be2545f3127d727bd3616f39c2df3697be9d0e21e9e4c9eace34b47938e1e2f1d5f0c54c26bb10dd71ea11da1e1edd2c88b6b7809efcfc5f044bb6fc4a91ef1f1a1f1f08a01c7b7ae653e75d10b862c7bac4e0f0403153f77909696181bc1b084a9e6f2d7d4170c405e39b2fcc5b8fcdaaee66898038a53cd51ada3c43887510edd5fb1ac355cdec451f757f757a6fbab4b4c5e0c54f376fa6bf192786daec4d88441b9bf60513c54a2c14caf39f1051b7ac170b8bb4893c59d06ea4513c5dde2251ad3dd69863c54a2bd687078a8f4a258442a2275628afb69cd43259a1665245189b1517e1f9f249953cdc9763d0ada358b5fee8d336ecb6a623259d20f0ed44696f4935f74aa39f15a594d7f898fbec459cb927ef2b300e5ce42149c3b0b41dc672cb4aea52b507177aa4768fab5822edcdde8feee482b92565c2196b335ea3553e535e3805089b623c9fa1b37c95e6c3e1b511bf2f5296a23375f2a68ab823b4d218a3e639496312d0523f7508fb629bfdef8e6570aa0df5e38aebc700ca1c43f97f5dcf79bcad7b9c76dfcfbd65ccf1bddf8e2c613e9666ce67e536d71e4f8f185e3e585c2c6979a1585261ebeb61485174ec8e21eee9b5dc36dc95b5f2770e0568dde078be4e393f4b76afead9a2728799db0e332d98fce27aee16ef6af48debf55a3ad6b29a336ef834532eb0ffde8ece080f725a2363da7591ff73e58245df413a4f7b5356f7df12833fa193f8953cdbd0f56d7e0741d2a8ac98e72e715cddc293ad59c282bfa193f0929abd927126a232bfa3162e6f21091993bc56b7340331cb6ad1d0919ca2f931d0919fa01fa193f09d3586b1907c98aa8cdd08f98b14dd455c4a3ace86797f71da26bae55ef13977b376113e32cd6d75a8b2253ae3a1ccc530f8965dd17cb9ec441babf75572164fd21b23e4ef65223aba136d446d4fb9190481c94442489c6266c8aa425ebe332deb52c71503e75cdbf1baf4dc4a279e24ce4cb9a354f9c6fbb8a385d87649f71d089c58b45f3940dfd64ac716ada888f8f8fcff84ddbd6a84dcf6981867eb6191424bbf8f79eedb6fd193fc96edb1bfc5543898daef977e5ab46cb3dd4a5c5e9e8cdd6d5466fd7daa02e253592974c14f7f02523e41563860e7fc554f18bcd9386b87157f27eae396aa369483492a675b82cb18dea5dd5bd629ed036beaf1825af981a3058dcc3fab917cc130fb57dc104a93f44afbde70b4626246bfe172ca112edf532e5f55284fb93ef8345aa91c9927e6ed73ad523e4cb92509b22e2c625d2c6a596511b9288dafcc64990643f41fb7e4e964412ed4722ad115971b9aba6ac06370d91d9ea1bf9193fc993b8e867fc24d87689b6c646b86d7378b5a4b887af16cd29ee6671af56ab159a486e701105f26299c02b2eef97a2d5892f96d38bd5c372bd566290efe393a4c377558167d2358949d72d7bad68af55cbc3b23c6de4fd9beeef67aa82c2b55bc7970ae7faa51af21f6ff84b15235f20969cdddbfe1148c5c1a76a1279814174ddf8e6627d82383c24aded73b58849d7242aafd493570af74af588e42b7582874ab4ddb63299918fcfe7aa7d7de6eb1b7a7d36fef2b2501ba6943e2ec9c727e9e54df1a497f78471ba97470bf7cb6bd5ec6a2fb7425f1ee5e546ee2f8fb9d7d9cb7dcb94708b93708b120fb7d02364f1f075c599478072f790e9084f47303a020e235871cf9da4119c84f67746a0b95f6c049a3bc934b2501d6940699bc693ffc5370d2569c4c2671a6b2e42d417218afe7cc3d9a4d7d24a6db8160157041e398caf0ca7eb104e575c59d69c48045a7edddbc4bf9808389e3bff469e77085157863065084f3e04a350892692f7b47d1e028e330d01a62696cbb5acfa73368969ac7997650d92c9aedd9565dd329bd98bcdae2c6b12b509a236d40609d3587352eebc5d4bdaf149d1a9e6aecdd9f1c97d3fb7c77a5fbc36776d6edfcfe123e2e76a7e36f3d674b4bb6ead2386dbb5b94cca64493f5f9a6752109e8434928816841e5bda6c185f0c84a81cc67706842be1c54540b800258764a639a3ba529208083beef56b3bd7c7dd2f458ddbe74cd4fd4503aad6e85f7c040d21704023481dab6da62d89cbbf71375bfe20ea075642259a0d8bfbe26c13af15f769fe60caadd63e377d36f39be629de6acdc7476fa7bfa5ad9bac8fab41a236496262fe265c9698247fd7cf3e802a4b7cad0fa0f800e7a10f5ca5ddf7a4f99b30d565893310a433b2787806957cd6f289a90d9ff1343b03577406f5d7e15ba91634b47ca1e529dcf7cdc76d1d2ea9b65a9478e8f4e4252a2b69452d38ccc8e20e152ad14433a298e1142ad1cc30720fcd885d33dcbd0c28f75cc6b6fca60f65e0ca5012de722da3e5feb9f6600ad575ebdb83c777f7a0c7bd07ae5089b6f1bd270fb0f0c002f7d4d9a9b95d7bbb9607d4fdbcede02ffe1cd63b98e2e10e9e76d083ef0edc756fd381955007523ccc98eae840498d6e1d97ea80963607583cac4772f064476d70510e681ed29acf3817a3bb5b7340ab2e8b95da2e0b942c41bceaf2937786031db8cbb67e9bf11671309423e280de408bff0d40e0bafe7cce26ddc7e96433a77a24e31be0d4bc3fdf405732b0e419194f9c8c21df6d3270b87b38c695319eb8ebb2ac3b8f61e43e1ba3860daaecb6ad399b77353f531bf2673690e2eeb8c8064e5c36303d24ff856c30a45d36c0d96d3337a40659dc77b7527da406556a20c53dacc19310a21ae0c21a04a135a035700fb5ae9dfae52e1a60d9318d7623d120cab65992d2c0bc3a7c533b916810730ff3398e98062cf7daa965b7cf3232563bf5bf4d74aa39a3fb194bcc3596195c99a27f064e2ccdddb73d99cca047dcaf67e0f2da29832c1e2ad172fd72a402c526039324ab0c82883258c16ba71649b2ce9cea116cbb56a665d4462f695b696bee6536d1bc991bdb4cd65e57d6db9764f95688dad4d45d85509bbaab9058dd55c816438b7b98abe3d74831a0c488a2fb22319ecaf2472b4690fc3a204b62e070874116baab516d61b085d66104032618189d78476d76358a936630c0f1f008067eb335fa822be10ba4d48c695935368b5e5056d70b70d0abc3e4be27d63a76bc7541155aba40cadb5c5084bb93567c5246446d5c80e38256ae3a2c4d389b66bd42c5b7f9e358af3cc15de9c9d6747a71777f3bfd1597bfc6e5d88231c4ddbe27067a5b7e8d4d9c4d7157f14f52cc78d77c8efffacce16cc3bb05389c0569380b2cc0029abbe3cd82180b5a619630a6b88761863561d0ad698c86e12109c61530a884e4eb2a6e17711718344b7e1e5d60e0086b32b64d15f7356d73596a2b80e261cd0a701eee6b7354d71c5e410dde314aaac00c1544d1b8a4fbb4113284ea70f935bacf9a0a9c76353a5301ad3d496d68b4b26e9cf48596b2b44c3abae30b28f79026f4c5d3ec8b2054e7ad3fd3ddb6a43d99d8f28bd637e5ff5cbd56a0ee5b7982bb591cc5785bc1b9877fdeb7d273f3d904b2d2a269b2c443e46bb2c4b822b2c4ff19c8c72729055452e0c4c533054a5210732fab68fe33a1206ad7f1b3f9a4a851602554a2a1208a5d9f1445928869c44648ab75d6b75adafeb3ed043c38019418bd27ddb62f1f9764e909701e2a2de16109bdb313e09879818517d7d2fc391a44c3bf98b4619a76aa476854575c92cb0b1c5e7526c8620229b4ea6639d87689744c80638256a844d325b82296608a6ffd4d2520c2bd29bf49deae2d01908f4fd28f1306aa65594712946515a790c049937d52d495e64e82202448c171dbeac83fb148da6a3a3de9f46425712edbc4f7c1ea2aa6bbae42436ddad16edd4506ba20bbc0f1f099eaded9ecca5addb88856dbf44a4b6c785842bb68f908b0d4cfef83d523785213a323a0b98737fab9ea18818c8b280fc937c9f2c463cd7f675c40dd6b69cd8f8b28174e98b8182282dc496a4bc98bc7d73719dbfd9ad62c821188c0741a8de276c63a4ad315278220ee8e13c10d4de25c08ca0801145af3db7cb66fda643c0b01ce3dd4f67154575c08703c2473d5659c04022baef39bf4fe787e7e0d8228198f9f29089e4090e40281cc07a8b87fc089bb7bc639fa015ad10782b88764aeba9adff58196bb3b75414d710f7518f739acbf56d60b6586b46b8f7c49773d42431d2e29c64150d46b7e1aabffa864308a26c29e754ca11901180000000033110030302c188f886432c96c4a7a553714800377c06288569d49a3288721849c31c02002000000000000002000d692dd89a2067f7b6868408e3cef9c792264d6a9893ecb9337f547eb263b8f97f54c86315561b9af52f180927b3928bb8ed6b64fc379229d0329e7ef4f1d0bd5123c5316ccd7a42fa5fe962db51f80a6364c218bef71d9802ca7ac1b03567ee934a32814b2985c97aac948a27a9fa1407cf43097be70896858a65dacccab0417aad0049f2c5032fe0865e686883715965e84b5fdcae6a94a193bdc42205a996bb002b5b2f1d2285723d172634ff5c379bbefdff2fc4396cb92b4d533f16b0a9e3cc01e14d7801312ae61756c3b234ae4f231dd9b38795e28ac6d6c4c1c4800fbf44b3ac03664957aa7100bd196d044e9494ad1a70909ee631401b06a2b5e18a463501a1781b35319b560ddeb94ee37d49dbe0c64f8f6a2a5e285a446ff43a164abeaa0ddc014b095694f76b5ce674bd987dae255e07ca50f7d361219dabc1322cc951c5435786746b9c1903d70bca4bd3de12919f4259031458abf4bb8d5d9ab27b4898a5e2df74190481f739570342e47ccfff9c25c4012d27e95939597204807e26ef580c429348e7251fdd0139bbf9def2210e8787b7768bb077004baeb212a0406bdefbdef162f660deea2f8f91f2d8da70f765e52cc5832a4756b3684bfc646930a113510e8eef12c50399c5561e11a72c361b48a5b8c5dc704e1d5e4c8ea0d2a180ce46c350434917d4eec13cecc98adb182d8005e12bf46c4cdd21ce40d37179071eb607c25857d15b3337e16155a860716f6de7743fb0e3b70320801387d5d96267d9000fdccab6b97a8bbeb8c3c5349f06c34ade9d55e478f81cf4c953b5934f568925651b39fbc1189ce152e6ee806b22c5e7228d32053171ce65b73a9a6d7123cfccf7213cbfc25588d19e4e9b461c4324d9a187277e73bf3e7c4992988101f2b10a078bf6931c8addb5a967977d9b5cd8da716e2cd1e9dcb72e9b7c27dd17d1d6ba01123c2874bd7b7880e82867db26d3e06c5c781dd9ca7658f5570345ecb37fc5a30334450e6605eb604ca95389613868a9db08d3ea8ad11be6ba665ee423b54a8f15d6141eb13e674f13062d694e73b333cda5c3675f4116ae51d0088ffc0c0d573538947e23c1a9f468da6754b3d537c844458a7774236bd371a690e1e207ba46bd6d36d6db941695cdc27f32faa4fc41d2a2407a00da6839f2a3266dfc4e9b8cdb2363a7f9051c65dc0ab40946a59774037094f5586975b7c00fca6dece8d16d04ae44c45483c7aafb3f439c2b3284b644d3e9ec26763e9731996de31b4dbd32d991aa9eaa80f8f2beddffe196a3b23b017d4448882024b0cd9a0cd46dd4fddb96292ce6f711ed2262f5289a3505557ff459f37ed732795ef85dae12c369b7300314bce1d16332b1298136fdab84903ef32f5ce1f95a2e217afc9741b96e17476853659e391c1f7860758f5c7f2b7478c1dfcf2b941d9e350476aa7fe7bad4f8309219c304495c98eeca0f59cec3a247b242b173945deb09e7cb36fa18386962351fc38dd2c9603252194de5c5d53dc0b9618c51af3f8d84e28deedc1e1ec0ed5bff7479e2dd16308e459f9f9231d684756250f0b6598ca40a318f27783ce9c19dfe45eb6b1a66323a9ed862650c7874bc3942e1c7cf22d91df652d0f529025578b4ea18a5f6877e226cc74b627dba170cf7ca4e5affe79b45a9fa38d35819d6906792f99eb1c4bad48d8e15664619dbdd46782aec32a17ac2d0ed4379ceae582bffd104a0c16e4fbae119c9706f852bde270bc1f530300aeef99bab4127a2e48124c6f9cd6df15ecbd751562aa42861b6f15b5e4ddf3c043061cfcfe2d961558b497d965eb88d77ae3de2898e0e1bc43a8955f41478aac0b73b34d04c0ad7adea8b94febfa0dcc3bf528f9d15c8ce45bb309aef887b25cd9bfc4b0f812c30c352881eb7a3a97a424031c85b5a65f162c1fa24f3917568c2d31a77f6e9ed8f333a84626584156ce6eb3a87a3ce448db525c8072669dd6b05a3a2451eeba631781cc2cc221d8d93eec7236bdcacfc99790598db92681842e4e81c9e0b8be7d75af87964f38606d640832ffa6bcf08e164962e524d60df90587e0248663bc1968e11ac416acc60ceee93536e010f638d28cd350999fc4d30a5eb05695fb7c1468b104e680d2713c00a338df5506a4a30012f38e463fc80a8c406f3dd2d73cbe528951181c316c0f79a79f5b96a7dacdfb96e9334b9db791e42618cbfd378d0f7891d46c6c0c86159163b5c94ddce1bc71634fde9c1f13b09b6fb40043071ff639d4957e714efdc8226790f68afa6c176b39a40529ed207b66d4f81c71518a4b6ca03cfdd2b1dbf8ec998581e0469abe2eacc3469de065e0cd865953059a6e24014ce1caf569ffdb333b2868abf01fbb42e2e0e512c409aead7d76d906d0280e151dd0b43f3ad491ec7903087095a3c7f1f175983020bd029e912a7f2bbb27803a37535ed42e9cad87410f0b115b864630ae285c5c7924d048c7110e0c6ea9af3ca215edf2ccb7c3995a0d3de5992671e4719eb3d9c1819eb16e9ebd8fa91f813845c532f8f0f04e76b31fb2ee172bce5c3f637f32bc75afd2a42797610a5be64427be1dd8d08a16342cdad3799aa2094a52f07a2fb0ae6a5b9593451ba1c4f84206b91af30bed3d8fedd2ad3bc2ac36655b539b07841801777e295f8b6a748744b08239b056a0e9976d4057b36385efb800317c07f726e3856156d5bb43620abf7b8f0e4a73f3a8a0edf4980ba59cb1473cd846011734061cb871cd393264deabdd6b4019d8b9bde92a56c08ded488d180e2bd1633e18ad28fdb400888bc0daf858edddd488d98100914dbb3f92f8510904172cc9731750c9d494add9b5ab7b66bae94c2ad31f9203d0d333cc64f70a9b1e244e1f347052e73406ab32298a26accd9a8b8c3250c6293e6e84cd6f24fc938a5e03503076185c4840b651bb9ae8b623100ffa6c170e818fccba81fc2f07b822e0a3383aa802231612ef81e0542ca13b2edcfd502279a07682ba47d5cf8617ff750f7e718041eeb9a6254534cdaf75ef291d72e7b8dd0fbdf57676f3734c400d159c385541fbc36bbd54572876b727fad6db4501cea8d5cbe0cecd41e6c28f3f4b19a5069832c0ba05d85f1c64d940f0785a3b294e4566ca81d66e9ae38e27e49edae11c4849fec4709cc064c8ff54d931414403b7d7ec72ebdfcee3ec27c360f091bb0e73dcc7a598c05812631a26c8d84af20a8ff0756a6e4ced63785e79c3169aa533c108f78555279cc61d7612276f8e886418efb8d951992c02aa0e131ecbb524ad68609d25663680df767aea52523482d78ef6f2da448bc51204f46c61b7c120a4c9f1e305a61c73044febc879f31ce44d8d1a173d2691ce5c6ef093aac95245405e5d63f6e5ce8c5884a75313826d3b824cdf636d496f457f4ec94e4922068f0c282209532d0b23a696f4c1c4b9fb8b1815f732ea36bdd06c1c374321214922d31233a500c9b46235f97f40f413188c717609a7e33308f296782b3a9fcaa10f27a01e7e8ae498ad90a81522d06de26c91a800c3099a615ccfe986fc466e232c15b9fb97dcbd6ffda675fadc5f21724bf1c90410aff2bfcf6d765a0475326c5ac1c599a52c79ecae4ae2595dd1aa454b56b4f332d81ad75be1bd4f651064a0ad015244d134cb321832b7ea7b48a89130aaef2e0a3765b517e05f29804f028d192519677b71c2a65ae8352cc71a311e91aaf5b480dd6c620bcb96a0582c95cf9b845331e4820ac7db96f526525f3863d4c65edec4255d6e091a039268caf0f38fcf88f4998aeb39f8d5321cabbd7060bfcc8f1580336c5cb6e8fffcfd00c5c0feea9824252e2ab5ab793c1cec4ba206e962cccefe55d55b700e5be40d0617f52cefa172d2a25474d0480a9b44036a34e1966f9ca779b374451c3ad4e05010704242a017b33e60f9ef88c277b9ccddf0c6d07adbf319c9b428c72fe21406d19b95c5ccff68aaf8e9cfc066245943bc05302e53543fcb7765fac3c5a684f29b1b3d7ea13404b7d905dcf85c126eb1b63176dc3f1ebf4d01774a9c0b95049163346d172b77bbbcbdce79338885ab3751e8a2bbd98aa40c435d2ff3e0f7b8333faecffffd5cd509d6fd852e63354d234d24a54f0d16ab89342be0bde77a0612e735c52f62ac18c1b557a850ddf85b689a682cede2c646ff4c57e2911a800e3db01a30ee5c4b20e876aafa71489c7c18e2049ab20cfd82522c210a160416fc426c50983101753bf39abf65684e1fd1da6e546652c312eeae89f6eab8d1722d4d4c5516877f522024e79a38022844bc16844fd28238a8114b11f1b6478e5d82d224ecde4ab18abdcb1584aad43f6bf0877e6ce77717655fba907edff2a6adf1672871b2833aa4f5786e468ec7fcf87f77f5a5cd0bca068ec62b7f1e50d13eb16303f1fc9ad7c1ec73439a41248a2424d0af2735298335c619b9c63b89dfa247ca3a42e8d04334cb0239258df2fe310c6a5578c4793df17447986cd41ba1a012db8edaf09f0a74e622ea01d893ff3a67249c9e0bac52b734eea15c422a8fa84004fc3bf91dd3dd004334d4f61e700a19ee9934803449b5272c8594c16a4a82fee224c2f94b09cb7a59309e29bc97d613e0fbe8876fe0b449b6e98fd207db11278c2bcac673ad076e4dcf9b4690a0318ab7c885664fc355277360d80107ac9dd00166da455c52883fe224de2c1e58639b5c72b45502c91ac2b8c5a0e37b5fb7b918f58037ead859dd27937fff82daf8fc280c6ef60eec708f3d16607292b6b566015f62c6b9347d71ce205cedcb41eeff61fbbfbd43f457ebf209761ebc1e00dd024a6a37065daf3e06aa5514d470a2b2dbcb363f4eb37b5e351595b7612f043b9f72af906cd725e5884fb73f19c201e625df7468c089242efe7e21ad677e56df6e7385ee0224e2841034398f46f58647cd33e1376a2f3dd665d6f3c20056c8c80a191bd015d21452e4e8c7c2a43decbe279af5c3d321b5b15112aa1b49882f1bb6eb604303ee11cb1c5ba5e45322d89e3b6d463028915bdf4b0155f47d127483af7238abf5ccc77ea30da2bcb5bc0688b4a028465dac7209ef3f59b18ee676930680818db0d00e9bc1f2ef747efa46fb74dc0942ac96f37993b345d1cf0ce981713f4cc0882c313139f32ba8aa0b8c79296d210d3d6b3c4f6b6e65fff1fbe9f50e1f573b4ea1d907377c9b6c87666aebdb9f0e34921dd45b509fd5224243a4ee17a6b500a69dd2b42417d2abd954754c3abb6d24668f99cfbe4ed879265bf8db384bb25bf52c9e010e7714029b9c8abb735130592a33191e8e6f739421113b8f1347d2d64fe558ef084738c390622e8fcee36875436742264c52d6749f0239dbff42c936ab380a136032f94305bf9e5b828231aa82a4ad801e0a56c1837fb3b761168e84db526247b7146e43f3bc39bcb4d956b26e78bbf770d22d8460019579af65d3432eb21e84b2ce4af85ba5ed1d4e3fdce89b7a1495c09665f5f1d8b5fc5e414ded8ddaf5d17ede24c172c633cab581d69613b550bceae86a243b65a2aa2bb5145fa1f2075d23676d84989c0ea7192d28d30e5cfb611addb1dfdcfc38247df832f02a615bffd7e9090054979df5544103d7c009eb2f0c97d36f22afb67f48a3d31b9b19372dbe81791fe6bb51e71ca9a2cf50eb859f8eb5d526fbbf8274c18db9648687b676840916c314cf498609f55db69d86cb07bd428071bd648007a187d04e2fe65c255feffe7723b17fddf02b78087df57864f36d17064976402f61c3cfbb200dc7d504f6087bd5f8742a673a54a7bedb1064543569159491cb8e66cacdadae10a4fe48aa854d3e2a3022ed38b420e42e96bafa616399106c6b0fc1ac83894b45ddb6d88d49a3f576472bc7ae1e887b0b09045ec44c14b4834fd6b865a47a64f71a853c84d1e131414a941ba5ac509cb556df5ee452a46895626506979672a023a8b3e8f718590152a7654274eeb772d68f512d7eff1a80a91399436d0d41e7d94ce31dba3131b9062a13dbf2e5be6987900e99ddde5bafa122aea35c210b77679c876c74cd111675762a84be7631a4fd9661eb0c21a4a0301cdec30275d2929116a2ffa19f50cc1e65610ea94b55114aa973255216f7b83bb7edebf092963a700b832493bb8620257cd16150b4495c90484e6d8536865f2bf3a7c06bf3ff79bf067df0c1e9e6a70bb1301a99a92bfaf9bb8bcea2b20145220cc0afc0f10cce828396e89019cf57071638856a966c84a40e9bbd741a4502b4e88acbffbf39c8e3e3d6c2458016c678fa588aeca103d20719cf82e358890b00c2654358361a021f224c680ecd596cf725e973af931e74db1e8eb73b799c3fcb91faa685a201c6a5336404d71b9afd72d2b74d5be80d6a0c52c00bce4b6d52b412deff49da6fe558563fd9a653b3f443465856d2e7a8721d6745d777ce6f2d6958af6fe91cbd489580905a639d20094916c0f171d72136874e4c3c2244c77bd5ac10cf9dc20ea6f28f818af27451907f0bf02320830ac0ea99aa58da056b01af064940a38f32507f03af3ffd773f84e270deb07a7bc0f22effd3e14fbaf7445abc51191556dae1aa1582a3897b75430bf7df88f98a5577f9cea29117be6a1d4d578768a5e0358c661d52f3b2319024546145937467224d2fbd9a6ab75764560245d533c77374316f89bc7ac32afe312e3bc0e102f7e74db087e70b7ed29110aa0e6f1b3e31ecf8699769baa465aa496ac453828b7912e36769c9ba06fe99e12f2c17990bf55ea20dd6e225aca9eb106b9300c8180461e1168cf025c28dfbe6c5d13d200b4e2aa4b81191c4a801b5783a5a46292bded8b21ede724351570094458e03dee6c9c9bb75539b86d22acd600fcd075ca71b0b6458457a8555b6413cfb2403853e81307577ab586e49842ade485779c6853fed15cc1da2a61d2e5dd2834379efde389ecc9cfd99738893b28bae06105ea9b72d9d59cc5898b91e93cfab75c208897245c7c4ddcfe864b72d39de6a96f082e2177d50f5bedec4a22d44f58517619aa814ea747434893c8a757f645ac97fe79de2085bcc9d0d9aa6fa407072c9a3cea7ca7f863792b42dc5354a7120168c5085d6069b9a1b796e59a76e1b54123654b0291f90d64ed25eafafe81673d35a682a077003904d9e5aa194d3e24649c3990ab32b176dc58381e44505ce42ee792bfddb4be6c093fd42321fd83529d9ad1b37843a7392c3029a4a07f004cf179e7b7b287cd477a5da187c20d971679efa0dd2d02a888146fca9036134eafd9236cb5ff7407e3ef1cecb60a014d5efa4a68fa0b271103d584f258a0b7a8e31f8a5d692d7f91b165a505efd59c2b63e9efb4e46e2b33426c70594b9ed7309d676c96b9ec4ce82113fda531e46852e25343d65342fecfeacace8630935b4a520f340304ad55d54d0a11915563a8705d265f404c5b399ae313be65d41de0e074a1876c7be57cac69139c0cf42855097306fc1e930467cc540ca0ce60b0bcc47d172cc3a48cb72335713399636bf6f7191f53d3bf77c2644ad2da57838256b2f94f609201e1675d1a28550421942e9e7d1bb37646b3cab793b4f10c9342105312ac5f41551b0085c4b460664139b5820041a64502fb14f75a4680e517adfa42ff7ead1de5e4754407c42cc239fbba19f41cd6e7d3ce50235f084d70e0930c03e6fbe4769637cc0996ddc9142a7be9b9077a758057a1bd9fd15ea85598a6306d574e851a003eb124d01f227ef13c6d67392d0b5c14903ee672ead8d6ca558ff0c4e78024c888763afc1f731d74194b7933f06601b91c728801837952e683bb15327e9815b74420a84edf96736c59d47fe5953b82850fea506205627d2a9862e2b9ca52d602893c6c66ab85843ac046f2835bfcf384b15309e1eadd7e40c54db38ebde76736d7a34f4cae109fd1571c488d26c1bc20ff47563241488b9700cf227db5c10585b35c76c3c1f445eeb5c9121aa8ac0bbdcd95f35a0ce8b4f353a92cdc680128de035b614b43a3b2ff2b83a4841e7bf63db986ce1a6d8a664432f238545b160c0b2442fec0a8ab389915c3ecf0606afd76f105300fc505cc00d533634a581e6803154a89b9c1b6ed49be65335b7021b4607fcbd0ee135394600f3ec68cdf530ec3f1f914c74ca5d02770bab283e297583e629040790b7a72b8ad2e5dd3cada93ed5e878baeb05215770fbccb2f250456d8c8a6cd3e54c135f5e16ce08a7407526dacc992fd8ba0b5b7d1a6ead82fadfbfb453bbaac76a14b5c5062436b6a66768589dfa7de18a75bf74f2e672828e0fe166d1a148ceae954063ef922a0c586dfe00da81a82d060437bdf7c1731a8644e552c4b3c7688e13ea891840b7f7b1171cda475d4a6291f4383ac25da4bab0802dab6a8e50ce03d3d91b280a65c6eb141c1cd32e4d625122697914e9e90665f66eb960274903719ffd75992c97b82ceb31a4ee4c0856ff2dceb058175f10743c3d8981e79521b3d1552603c440446311e3170d66fdb271015af6c983a3a6b0c69920e88b388d83789010877aafccbc8c92cb42c6bea2c359e34ba9ac82a1f49163a545bec01f6242361bcb9bafb8c6c5c482ff672d1db032361e8ea805ee1e4d949fe486054f487554fa56aeea972a015bc40eaf33804848889effa72d6117b33ba0947c13e9b06426095264a4e3914fd7764dfcde39aceb7797a0d2374db0b335be381acd50ffd64aa375d20ca56ebc59d3631fff38f0d42c93f2a9f7eaef12c9a1a7dfe11105c7a86b045beae61a9123239c2f725df263d154ed7cdd0be06a8417cef1a9af0b7c745bdae38cbe98dca6d8e0bd546c8de3ca47ab0541b7fee0eea3d0a0c096c8dcf95b6c34e4aceec201d85d25e0d9c460af3a17c9eb0d1807fc2d871c877ac8f556996ba3c80a6d43f8858187acaf866b68a143db8601c3daa06cc3bb14a73617c3c6cf6a6b77c7c152b82b587bb9a03f480b53255ca5dc86201436023d740c13c5988f7766ef155ce320ce0fe77f718f867011162c4c2ee5864ad41dfad3fdbd2c36cf56cd7c468da0f69203a912cee4608f52d9aabaf8b81d5224c5a3786c1c601fad2d7070c45973fa8448957be63bac6f50ba3685521d04891bd225e3abbbe5442cbed448e050b870e1362576ef10108ca0a70b8239f6a637a0462ce1becee6b3a9c800c37c86f8f72a549f70a0575373ea6e01170d4df75a563c1caff18268dd36d50069a13c3225d5b2988a306fb8d7d934a7b4f67f671f39e00f587fac140665b879f005e27a6b6cc6524141377d0c6191e6e534172affffc9976124701a3681a2ce395c7e1ae7aae5c147ca799df11308f16d98c186f6e0b1b59e226ab43d90731882c9a8ce361360e299a0174f7308a51798a244cdf3518329837edee9cd701631e806092a07b2cb87b321ae198250a7e3235103b136d81619e362783364a756a0f8bfb3dd1ede1afbe3be1eca091b71f2c437f1e8a56ced8479d48830488575029c59d72bd9b942be5a88ff2bb9a451bf8e8d4263e4e1c0ba85dfd0591d9ada146f9784c35748a3bd05f7104962012ff6e3aff5f65eea6963640bd6a6ccd0c09fb0c9bcdfd46d88c3cfffa16f09586fb6d6f20256ef4b2d5f88c9d4edf57f26787315e78efd0f5a808913bd3c016d753504e3f793b6ad001f624981f5704f764376d9cca78f1c60408c2b3469ca016eddb2ad279fc8c5af5de0d90c69dc19b412ef43400051f42687dacc64d0367ab8e1dbb5d3f76050ad93f0e1e9262ebd79cec9d219509ac0f21750283e57b8c0942e38af600abe4abf2132ea67c904c610da4fe76d09b104335b6d67bd34ac676335d857362e7c2c564b6e0ccbc7271f92a57372b7c9ca079143663c05500820ce372429fb448ae18d8a1d7c5b60d52418ee9c11072035b779f9158082811d473001bb0e46674dfa88d47f39301818bc15b7e9a9a731ab2d9ab621646e3ec51aa0ca1d1347aa852efb6eb3e67a2e19a9ecd364edbd4a1b6747034c536cec00ca6c90f7182ab8e8c00b719665ddeb231ab2ca31df3e830881c7ce8c1d2da603c6cdf1db1781a9cff36a1d86a798b2250f9095885816c59b7ae419e33543c35ba9533dae441fd109a46d036c88f0f468c0a6c49bea41ec18f320291d3b274dddcda7b170b7712cae036b4845e0c652078f69e7651d9bd97c7fac8fbf3e533ba4a757da34a73bfa7e2fea8f6d950bdee5df158f07174e22a6f3c9392f37275426dab6240b5e06c5671c3edcb50dfaf6246730408b89f4bbfd0971dc8d19c4ab9b7e6a9d4320bca1a77efb05083e29d040fda88883789df0281bdd46506e13c0062528648e0e0293cc40e004a4cf342df98f8d4e8286fec94d5f6bd40f804c2f2b00c687af67e214ce2e4202da16c0cfb6a68e252cd01507737c531613a94be624316b5824b089cfe043aed0c21677d251ecc05105c29d561e6fe6106be4dff004b18c6e3e7b0777a2f25f5c2ae29b1ed3825c2b8bf7ce331f5890fb64f32cf71a94cfed05cf4f76dc985f6f84e1d7d74f29d508e5ed32dcec103bbd6e1e1acf5bc23109a3116a172fe275320ad8d681214fec5ecc5ebdd0a18614e40da19d8f370743c61cb8e8911d008df0915806210942103874b4853faf938b694f09b3cf753d7918dc8efe665955f85ecfb239e0bb0efbf0b83971aca6a21fc7b5850c502b10ace0a8d9afbb069ebf844eee01c7191bae6a68f4a2224fcaf6e23eb58dad1631cc113e2c67b0ea031af5921af81cf61d4af209ccb4c70521ef61fac7a412db67a30b4014dd9da5582ccdaee4460c45eee091d93079ebf993c5efd0e4837b719abb9dde887e95aae9316bf1edf08c626bb3ab2a98e67ffe55b0ca66069460c74bcb37bca42e42d59a233b7e554bb27513e32958ebfb04280b44ead9bbc433eb160da116c30f3693b46969c572a9da5ccde2e3e36f85a5c7a8db98c072a83fb4c2904503ebb21bebab497e1f89aabde79e1db4c7d8e6e5aafe633ba773cfefbf1aa17647b4a625c36bbf0b8ea929754b67d35439b71bb345b871837698b54dc303498f4804601737296d8ff7a5ca884581741bf00b761cc0b171f50280318f6c54e31d8c648b65b07efdf28220659b05761b00edb2b3f734fdacf25888d8e194596b654cda7284b3d57110fec4d5bd05be07c1a45987272677779d7322ee6b107c292f973e786dcb092aeffa9ec191a3fb01df002e3adec76a73e6a6b3243d77a83e37bc8bc20856c1f9658fb710a6e43e417423a5c5db093972a83733a4bd4752abd7c1e4ccc97baf772f9494426aabd2988f060f70226f9ad32a7129f9322f5f03a05ef01a7764811335a4f57c47518dcc69cbfe7041c5075a8e4fed6eb510f0a7d283d1951be4c6bacce8d2927b03dde1d38070d3faa3b26e1cdba50d90dc641a78e78eca96a4979ab6faeb0e1a3837ee9a2a1bc535b0108dc8cc321601946fad79d6b6fa2c0e22aec3aa911bb208e61289c0a1528cc2a3ec824d6d17881e51745d4924ec126b607cb5ddc3ca4d33f7805bcf7f1f369c4f62fe5a7ce0fe53282fea88fc676cecac58c96641e7f22e1eea4aa9aab2a4b97b6a197a2a2370fffc791c5cc2a0b2d33718ddcea4f97c11a490d454145bf162a2117dce86672afe6cca8dc70f961bed2149f694680ec8eaeea075a3c5471dc2f0ff6d5c8fa6c31a074a0c7ca3f07d2ed3cc76fcf22e3175cb5edcd57dcd3d11a763a5d94f9b500c006094a1bf0e7a7f32a728cf9e83283636b19f9dd6419d320c1d18c3cd3066f705adb6e59ab500f0f0d992dd6647ffd76427854f61c85295c61d6f035e12e0c8a041edf77e6b4e1bf8bd58d85785de72568a32c6782de63c489c1e615cfb6feea25a16e9ecd019e9f0c416bc3f205f035ac43eb239f63b87e4394ba8b845746483d05b7744c17c6113090e64619231b7a41ede21d115cd64b8ca036b3765522fd764e55dddf925087013221353af6193e25c4171887334c8b45a86f814651b9986fa2e75d9658052058f6c1324a17fa934194a72964312562a47b4c4b36dd46b373f67f1eee87dbec414deff0707c240b3b71824ef42210ad8bb5fd282817374d07165644e4a24aa3f43d195f0c85445fd951317b265b1a5f3ec013927b5cf44aecaa24060d25a26c795953cd0ba4dce3251d529cc0076eebe6bad17d5efcb7ccd9b21c1ed9efaba2e8ef109b5cdf949aeff3444b2def3dc7eb67452d93582b9160445667703bcd5c8b2155c0b69c6c515581b4f433621eb2f3457b0964514992490de25a7d911bc2f4a534224ec69c019a8065d2ace735febf8c7db14139c890983fe19e81d8300e025e24dd9d2aeabf22bf16a183e71af5e4bdcf2fb5edd38571829d907139755c2abe51a30ce629c271063d622697f4764b7aa88cf2b11a666bef68f03c359ed4e0401bd3a117215c84d74d9fd56cdce188383c1182eacdd0149cdcc56ceee64bf45eb35ad23ed1499eb744755b8fba566312992ada51ff2dc136ef3f5cc666e36f05c8b0ad68d5767073542c63a63441016cfca9d1f821aced831a451961bc27af3bf1b22d60a6dd286adc19005e79ec5f916fb611799394a334795f41e1c27f214ab65e3ca5f8798701003711762592bc55799e1ae4a5ea0f75e9b15e4793f3957315206610e819ed558367fc55d6b6c7db97f7c676302a6425aa305658cec8b4e261f1703e096e1d6563ff049a6c4b2ef33db3779ac0bd0f435013d3c9224c445cecb3c03ccc59ba62cc46599412317ced2c212cf968759d61f339d71de3f35eaad51ba9471a98839d8fbcad2b60253f275e6528e6ec972c54edb22cfcee39cd7722fc6b3021d2e8b588e54850a72a3f620c390985f2d4ff0d171a4b674c28161884778268cb7b93f0bdd600a0a6ae84cb8d7e3c4f730c867900396c23b13249fdcf70f69e4e5043eda095216db6e5f5bbd35ebd6e88c119e320774a9c0baea5cab6d866f822ae4d79f88fb0d4567733820cf7883da7eacba9976844b323e1ff8980d0d62be90f38d3a8bb526436c5190592bf08c4d350d3a54d85069103cd0b28604f083ad047793338e8f852018571fef004a0248288f6076c84933032cacac02a879cdb3010bfc487cc6361352717c2db4b8d542cd67dc761ef3aa4ee88faa46d9bd3813d3ffb9c9ba80716c80f966525cbd60854a8992a04575f075ae0423c36ff8269e4c528bc46dd1b67c73c258431078f7af81602e76f17a045f47e32dca309fd5de35fc7d117d0d617cb84be88c28514a0f816a8d37bbf50ccc0bf7cbe0d34729b8c3740cdb4136a0b4d1b1146b041da8882a23f07dd932385122ca069bde25618ba96e867c7994bdcb774475ea1c84654bd88f07e170a0c3d3589dc4a78f0fb3c49c50c1b600ddad3eb0c90ab0b50fb86d4ff11d6e0bd155de7370eae3f9c853223f30af395e62ff84d6b63829e9a1f782f67764cc8a9429ca3c059e84c64096a7a34a7cffcefe328547c025a9f79b54fc8823b930ef078e21c8f94e0bd38fa98b5bbc14ea71c6c70e152aa6edba4d40add7ee3171072d091ca9b63be6d7b3d015fa55f1fd3ddc32dea2a70cc289f15f63d01089ff56fd4b64e72c33d2a0dc9b0426eee2762efe234ff54d89b1fd7aebc04fd783ef7c0d5d034ba8337cc3b9d251ca6e523afea8e71719cbf2bd85ad0bbc542287200aaedb865babf5e0c0d902081e6df944155baedb24e54d3436fa2fc8608cb66001ff4bfed3633ced17b38d34301206df25f1cc6a8945147eef20e0516f14564a1d9431eb6682eeb2f6fa6fe40c5174beeb90ed3499afd894b1593f2d2d7d05da7fd5e171327f5f492f8c293afd11e4d55cd7f573dc8c621d3c4ef6a0ff81fe0bc7057f3b02239ae521773558560becad8b4af2ea5ffddcaa39bcbbfc4002ecc370d3e05a6705ffe398331ebbff0a251736d848feb922f8e185132cc8998153847a18c9c119787cafda1717b5d3181a9e37b5f837240be2f6e56537d17e776db5fa263bed3b7792b3c5f1a6d510bad1fb3529eee500a51772b6c010d1624c69bfa9d5a9f766f7cc9ea397c3a156f058e2a218b78d1cf49265f11244207632a212705b8984d3afcf355ac33f71aa0b227eca9f86e27daf0e2862f885264aefa63628c187b3ea09525e40b5aa30ee504d6ed2d9ac4013eacda90411f83a4736209166da428ba68a1aa56dfab2cc1aa1493840a1cd69b6a1a51fae0402146b8aa447b52cd0024663f9a7a3082915561846b787af984ecb90c926f968cda8825e2029cb627f699aa87adf871b23fd14d97af1540d776edd03785d7aab90c4914417fb8190288c1d75de49a306a5a4b48e124feb24c75ad0a4494c3278627238926884851c6985815d184b218a32e700bf0374d538d8e4a70ae455552cadbabb450ab7d8db0d2222d559876eb8688f5c4603aa57149ba99c2b1721f96ef91f82ca4dd1b06be0d9144d2b97feaaa5a1f16365861aabc1a9c332721cb4b93fcea6aae849570d5028d36b82a1e9ca24a0ffc20f05e862cc2bfb2899becc43ea3264269bf4cb88f140b8da2296a201057558966d7c039ad296410b5659e1b55b6e33883c6bcc6724f98c106770c50dd6c555cadc4c5b07d2a3a81fbe1ed672a4c2776dc8f9ac45174b5671ad6105d0ee6938cbb2055a62244726d70952e4e2ade2dcdfff0ed176916de34570153ddcd05f762c79ed9d6dfb82391296d91002c34307747300ee38ebc92236f7d4246d96c2bbd18d9bdbe5a76363988fc0b67639199ddc7053e1ef9d338b3f658cfa32b12df363a4ad87d69c51f0c0eedb7c0522bab02bdf2dedb835adbd91f64831a582304bcbabea915b6fdaa16edf708277c1daedc343b4c932989d2e79bb340d1e3d6bc1830da8e03ef29b05e1162666505231af48249bce78a562e12201edd9dbb4062380757f76dd9f8e052165e78c7478033ab7d7d111912861f7477be502b7f839e14c02bd7c3622e09ce8381f3afcd884e26fcfb83f4752e78735813d38ef8fd9a21c0f2a0d6139c2b508ffd20c0c3f5e6526e02f25bf1e0afbc84b15ef174b227023e605b9850af33a9cb2d17a4e040defaeba4ac35ec5f3d363d822f680650ee722cb407d022fbcf524fee25114f218808d617fb676f0bf762f77e253b1ef1a5512edc394d328beebdb972f7cbd24f0c6dcc152eadd18bf56e50ee0f3ac18a95244d06b016b221d128379d41d6cc017b8ddfd195fd1c1dc9f807cb75a9872d0749b85e27d8facc5f461103825d149bfd516b32182a769e16de3673bbd8db2bed7f23dfad6f6459446e6a276531e4a161b1469bae6314bfe248617329ce6c1209bb8f902bd8d903b2278a5cd9f367e441683bb81cad4ea6778240685d79d1b88113240bf0a97172c773703f9158064ea64fe4c2f4292f3d9fd2082779dd282e7f9aec53c882b41b40c4d42e2d100a8f651e6db9820acbbadfd8286bf802b7724978b19dbf92658f46f265cb15cee4175eaa42f364eb5d66a7b2064a26c10aeb381c443a1a717942110c1cc67e0c7533a1d2d5b653ad3930f952e45eb7311acec8aacb8ac6c6eba6a4c9bafa27cc04c270cd7b9678538d5ff2302b3f99aa554fbdd15a4e209983d60e4fd4c6c12c216cd8d770acabc0551a99290b681d11dd58c6efb199091042d28c665366b4ed0ac35dbb3846c310f52f62084d82c55b0a92558893926c90d8b32fc7960b197133dc2f666a9057469db3e968e36802017fb801836fb26131b8626b3a061fc73233cbbac745d45124fbfa36445bb6f3bdd19f8ac595f1a60c20d7c872eca07b86f1fc20d2e4a55ba38d7f296d78ddd6771af10cbcb93d37d35f4af67e33a32043e1dcb1a787997069850e609b74d196da0992076b9e404739ff38af40c94bfb1b88cee9f984c993d11532826113c7344c17f2c593048883830e7bbe8750204c270b00b4dd384f93a406b5d23ce895b7243761f45517b3d46fef80b8143aa0613417c7f71a96e80cec9f7bd71b36fa3c64af1d15b0a9987fa66ca7b443d5f00f39d2ed8000e4c05c47a67c2afccc7379ae6281afb21111f57c47490fa7020fcfcc25710dd40a6b084a7399d7a7354538e7996a6b4126d4668a405834f4e3686ccf45cde00aa9cfb2618ab4a5ad8899ba07d79cd85c79c42b7ed9f3c267c50e49b61c0264b22d762314c73e77de76b5ff649825e026000c5dc68ed967c0e6d652d4c26e7fdb9a3be8c64dd27df6a7c1b55e41bf8dd9254b31640c776474d3b04094357e60901dafb573c9c6da05ee60d54e506e31c785e594ba693cf7c20138546e59e912908752284134dba3e52014dbf9b48fd39800841806dd05cedbefa3ba386276064bb1570e07728b77e9eef470a6766883ee7fecc3822c4c61761db8b373e441a102b7b1c032f667d19168840355ebe1f6ccea31a7c902c8d60c4cb015066301d5af094acc4c04c9d5b75bb52e0b5aba0da9ae5096bd81b5e325df69a7e1b0ca9c827a4902fc4b5da0733872d4d8606df5a2ecfd9d9d19b9f7e351ebf2da402aaa03a1c77cbe16e222894dcd043f730c7b89aa36a8b585eec403b69a4f62d0578bf9b3c0cbb984ca9a697a73a47c205612092b3105f6ab5d5aea6fcc7465591cdb9263dc0330351085c787ba0cf192ae0344783fbf060eba3a7bdbf15a8c68ddac44c6c5c6462e35d8be1ef4cf0ad6dbf85b75eb3581173089744257f98494d9d65b5384b717bbf8e7099a747451dbfba52c60d091f7b3d77ee41b6ddefe1b8d86d5e266ba5842a616a86b94fbc9bb757ecdf0433dc992afe08596d58da5362410974ef0a792b5f434e2d8b00052d8a8ff5f777bcd789a4ed9f619624791093ec9c86d012b09859d3276281991ed5dc5e18bcac27042bc347618daa3b48162dd2482f9a9c225b7fd4eb9a7b7d10dfe3d4270fd32cec23b776d0be60e0d2bd6f2abea0feecfbb8439386d416db73a38cc73fe648a58fdd823e27763b05955575de47d855943863bb314b611465614474834c1c4a7f87903ba6d2ffc5132599c688bafd58ec6f28b8e717b5ea0bb1653dd517c15c00420166ba130fe9e42dde84cbc6744fbaef5977bd17218032b22b0d4807a23ac5bf220925c1a7960c3468fc82383bad9020e22e491974a60869883d3db8473cd5f505b3433e858f30b213d7b77a261526704da34e2cf722e0d0a4952bdcc80c154a580e5a7a027e698015829caca8b824d551d45a082626ae71ca263de9d3927298188509f64d82b998077a587363294f0cba7bc35f12f461707c421a87947d44177356f6a13734bbb10c7e29e6bcfb0c4531f45e8fa293efd48e78fd515335d6960a5f71784460846bd6a30687163dbaaabaa410c1f581af9bf6b3b66ccafde309c4565deffdd24b6b2e6d1f2d5f9d452697b563007cedc5155f5839d6c211690e8f82f0cea22e42a09adf21ea86c6b54895584049e6617b41fca16a97dcc4ec09bfd4abab60d6e65d9403ac8836af7f68ead51456a7605a6d14b438f2bf8a2370cca0df9811a7e1d966256a4b21e90060c3bbefb1a8148fd48e4c160f8c11b58100ac11eee836f94f5ed150c6012ade08da277b3389c53f5f82ac8e24d62576da106b05e4f307bd01f208d83f4319c6a0264250fd61e5a3b58e2df578143d1a9db5f8d4ecb10cd58969975c3025183f4e701773eb7ac113f1b31befe3eb1d98e11d462bbd40ffb76e61860b0f35fd3bbb72ebeda48975df67bb60e2187e13c498c1bf81d736aeaf9e3b14582ab5a6b0e7d511f69f099cc17b1e816b0c8091a51c96b85837cc70716114d7c7dd71af98b2beb54c7157e7a8fc99307073e4ff45c09f2e1c45b6c4ebf9841aee17cc3626ce99c429f1c11e9558ec644caf42063ae5d11b760b7a724e2ab48bbd4cf1418f7edab664ac7436d65682efcbdca79101773271f673900e7eb83e6a3867481b9de99bcbc6aa854134063415821b1e04666dd18e52fbf4360ce420c4418116941a6e8fd6b114544377069ee2c419a89069e18591246af36935c52bdfac49d973757206994ec669fce20b3bface0f25a69964b02aae63648b753d8b296cdd014547d5e8d69aa8cf7179ca81f2d207481e3a47e510cdd9bb7930d5a46a5a17f2f7e7b079b07a85d15e5408576daba48656d013c45dc4cebce0f1dac1b0497d703164cb57ab687399d148dd49dc430942c759565c0b056945ee2a64c97e67e6bc4819b5dc89bb408b59a9765bfe33f3bc6a08f5da75b847579b6d533e4af9ac7f94b7620051e4b3640e095b6d3e282064aae4f97631b2388bfc9181f18274471ae9ee34490921ead08a2023bcee3e67e25f4b115f5bd7d9dcd6475dc8784e44cfb58fbb8ed660e352af9e467568aa7a6de8fa4e6de8c785cef2ee8c6e7a0b36e4eb9bb53b7b7321a037198c4d30129b0c0f638b0d5968983f0e138d1c5b45cc6b39720900f707d59feed717256cc2341cb28edb4b974ebf51fac3fec9edbbd572aa5fd96f73290f8fa39e92216a9cb06629c8d79083a5f2098a74d112c3e4016d9a2430f9529dcd0dc05789b4c517ee166fbf62b9c21f45027245fc452a3fccfca450c7117e23918d012fda738a23407fdec53882a80f03431612bd3ec1e17ae8c87c2268e7cbd18c763cf9b075399da6b9ad494102f5ef8531ecf130e81016467fc79ffd72e7d52a6c18dc275dda76278558b7e780f102138deb0dc90bd66054c7bac7037e2707bb0b972d72786cb67dd7196b30e7275255dd1127bd6d8db72532f13c753182b920b8d346c7723046036cd52dbb316f0f829aaa98595fa86edd1662835fb3294ce1c819c823948604c563241845a31d0786be7957ecfbf0e87059a34fe30a5a7344bd0d8786f5dff2f0685853401ff9dfc6667805794ed40c79394b764298df48011a521f90e346138e9f69749a98a091bd087be9f94a8a26b2a4ec9e5030f4395c0c0808398054e77179db13ffe1744d554fd437d70beb2f51268b91ee315eb7cbf96960a24f1f32d2216da8ae3dc664a929e96cad0ea00aac094da530521a7b12c52aada4ea5c2ae5acf8a3d349d2591547cf8ce2cb313ae0517c8aecab31b2fb4c755611a9f07d9c6b10d4f2799315b0b0ef8d16027b26148479eebe0f348dfeb922cb8a61ff11c03607f98a86202ba4e4f9158ba5561f9bb00759ff55a9bf5590c58b593e3ece55f5ebfed04cd9d128c381c71d72897dd94c4c6ef4f621d7bbd79267fc3332de3f05ce3b3859df76032606cf32fcfb7d68ce6597311fed4064fe87e231227dcc40185f0d7306c5b430dc83462f03b7a847019dd583a4df0c52de23336a980d84dfb2af7ba11c963ee8d9d72031ea9d818d247a2eb83a0c3e8e27856ce324cc6c78b0b3ffd4774872a2150dd301e14e473bb8248acb86904274b1987549b01cc033974353547435b51b747dabf3c348db65cd701caaf62a6b08ec29ea7ff119674acb8cd81bfd186ed1319686158684d484dfe69e628cb05d0c5ec9c1e63c6f98d67e48a296977112e2661188f8a92789170d3361f4f6f15ff930b9573e5549bb9e68a591e13968d68ded6ccba9f498735d142e2ceda1fd5fc8b9b306162dc327c3a26dae9b42f43bb79ccf419e82d0a80c701b709692881f6efa7f00ee5ef4bddf95cfa8c36432ebece689d3f113b5e513dbd8e10263d1b79a98bd5f9a1bfbb0b315e37168d248b1d4cd72b85287f864eb95c903189785c5d704cf3582360934cf29d9d775636ef971fac1545d40338771aed5c77ed2a620a262b58913335da03f148d9ccc07ca94612f8368b183de65c1395339150cf7c69a657afdd20c9f469f06633be92a7f469ebff3edc82f13e70e0dd07a0b394461b8c1991079a52df31430b873db1f5d3701790fed938c0b2888ece2df23a6f44e70e580809178025cd8947a47ad15eeb07772477eccd366c11e043f5922d9bf04fc3450d6aecb4f544cb4442fef217c2f7db6b51857e122ab6e58c39dd369989ede7f0b69440d8a6d0726e2c8328d9896d304c790ddf09aa610b9200d70ce522edabc6123a89327a60bb3e597839fcc2da3b4a6a22155ba1cee8eb6224d4f7862b86c75b3bf518d22ff061cef0f01a5ef68a7b92948a182b59d8fb32ea6e6a1da86eaa1df2c370448e9d93a1dd2bd5593daec6ef0990c06d8e0300ee93d635a0f9d53408f4b806e7e38bee12521d309ab776087cd9a37495194b6d32c3cb94a2ab9c8ea567eb6aff2edd6280ecd1d17793837a3db2da9a9c33d2fbfcd90ebdc08a5199bd0164e058a1de38d45a0ecdbd67d6700962d530cf4baf5792a499b43a2d2c383864624429d08f9a0c1ff18c1cd18bbbf4208cf8280f2083b3c1e897f3e7b8d56a96857865a0637150062bceb9c714dbb7f803cba8f1d7c26e00c4c73abff5c4442b0cefcba549dafe6f0da63d03c09ef20351cbb13c7a0237a5d83111c31b55b1382c4dabe1b10af440c4115ee23f6b3ec1c233b9943220079ef2225046dcab25e1c2836bc3226364e3da6df1f1fcb36316b3a07170a36ccdfea5f3d9c0f3d5e75dfdb32c130645f0118a245ded62cddd065052cfcf806422b7380761620c50010b97bcdc7c626fc0e93ad02dfc4a6c96292655eaff4f90532f2c24b7106b25f2e54c7e23b5dfda345b26766aebeda9ca78c93855c7e20aaccc3af00689bb1f1a427e7df7b4e9b37935c61b17c6d9004d6809fefc011f6c060d7e808c793e9de35fa3039baaea499f8c6048b0166194a1fbe42daa2c4842026bc0585f917f540fce614512aef1ec8983ea0bed647d0db83ecc27a386605ec94bb7627de399262e6fc603c374ccb0bcc2a41b767a9c32a7da16b865f4f10d9c7f611963f6f7e82d88f15290b313ee0e338ff66b722f01117947d1f0fcfd82d74124d1f7ded47f54891f10e6e59f1329d487afdf9c2584918083a7fc7d1c38901ed14df02657ad3d43f8dc38c73d50aa271547e5669af7e07989d6dd8aab1161d903a44da8f50f1cb535b42acb1aec7d429f10bfde9b20a246df8cc3cd97b2149b22e631ddd2336912044bdac180653dbdbd9e166f669fdf93b1c75f1e27d1ba010b67c51154db4c1546189c17b475449a0c69f84afbbc3786a2d5ab3e3fd6c2bb7c7744e35b6587753c4a7907ecbc8064e3349328e1a681497bc8abd956963150b6fb125ebec489b631a4d5f51703ba77ae4bbabf8f1cbf5fc248aba904813f07b1ff7193a893cfac2ad1b11b481400f0a684e518e1901b9e154d87d6949cdfb72700f0503d08b7d10025ace1c5884c3dfbb00d9ccec88c4103a2b8a0b92723ddf39950f699e66c853066486a365b10d51ec75223e92d7ad4681173b1dc79b4967293f3f413cc8521bf01ff8533b001c380a89b8e86f7f47161671b44de5b4ae1c1607246c27b71cb027eadfaad1ff84e47df05588a0fbb98720e9137f1e7cadafbee0d86c30dc175b4135b9a3a005a99a2f1b4b5053489099e7dc81d500a700bfacaf324c0a1bb373490ae3490e289508239ea7074aff54f1b9baec8d55e4b7b2627cfea5dd491243b3d34cd47dc29a711fd01f6da9e0b057c6d33f8f1e50b96a9a76c4079baa2107492c4da4b1f9d3938508345504f21a93bd4b5c4ebf75a55b0ab25f123f9f46e985f7e58490ed05d194d9d084b79c6f4a6e5c4d102964bb13cc576041158364bed5470c03c52cb60e3466c2b06a95157e9be192ad7f46b947c47cfe2aaf60da08a8befa4bd67eddaa9adaf4c8e778cb759349ff302a8d530b32fb1a5dee688fa70168cd2b90a43691403318f495b6397bd794ed5d5e3beda7004313a2986cc07d9305851e09b30a4ef2895058eb0e9ca22e80be677a15e03903818491d66d17aab5c86c207344cb01c679980eba63ff75df7a074351385bcb1b805e393ab9beefa05a746de06cf5dcb1af48cecdaee0f0c18b7071996ed7b613b6d0e850a7ab4b847352d8bacc7a9a00d65be27094f30194c93b0d2528809658412583caac8aef4add0059ff81a10d3f24dafc58739dd06db8a8c3562a9b21854a69a68dee22860fe192be791622f215cb5891ea9933aafeb9015a8400f2bf5c98a203802efb29fd9eeaa70b06ff8b3d7d1c140bde5692da0e375d7d233b02cdbc5b067ea6691dc42ac7a470db5d236d14c2bd227b171de4722db7b912ccb0f66aab8c1a44b61cb255c890ad765c4371b3396cdc86f198e3fd28b0287a2b2f35d4184b40543c871fc63a6255de5a766237d6db62b8d0845baaf9780cc3ddcc77663fada52390fe35be01154407ce2b5b98c64f0306a8ac4a84f7667bdcbbd2bf691931e51155171ee0766fc602d9d5ffdcfbc6e0a6d0b2f5585d80559309cbe1f5eceb4908c5e0530c0ca6628c480072d32259ab078951042053476c84e95bedb0d50fbb3d2c386a7c0cb6e94292dbc28376e8a2809c8302e8d6c417aac250e1f75a06c54b71ec1578147b1147b365efb77e269c370084f633453a29eb9f73b73d76d81ec6a1ce46d5b929572386799e7f7f1087ee10a4c6b7cd0a8aaf2664d367b0bfca7ce9e18c79f372fb3c037d0e97df0d68246da3ca98b3c39282c7a9994d67ee67b89709f7cb396dee1d99e7ba219de9c18eadb9c6911215b55266a7506c1950c76fccb2e41a75f80e595e4d2ab0786f15e579bf817ad3c4a6ee00b2f908270af02571c135d92a6cc59b9db66753fd32819f73da748c5c39a77235977181675e8fd2f9ee5e6d0d67786b48bcc92a448cfb4bb32d04f3f560cccc0fcab7c20ec7b4740a9db580d493a12520127e1176144cdee11427cd944725d2749c4bb88c1e6a021f6306ffcfd9082b652a274903d438e117ca7e0dbeed27adf79483382d8c3fa7a8030e4c965ce9f0a23411e76d80f020d8a97cee04311b8a7f87542b335d7098f26e70873279a3db4f6c05859c9a52c30a8b6501be30a9057249791ca95725ebe971e2c68d50cbcf1a038497a1f2e3006ece13e65c0db13931a939bf0b7eb720ebaa72a04738f019730d274a50d19a2e8f868fd5f7867f27fa384f1b509433789315b5fa54db8741ff86e1001e04a832b5e42a3f88afe7d3cdf692a9264d625f3d18516e96cc6bc050000b08334a46ce491bf38e90ec1900161cbe50ee14ca9558fe161ca327cfc46c3f35ccf0e6cff3ce613af9bfc66bf5aac736874bcb16c0b6972e669e89cd603571e026b6a05d2abd874349c1bf035cb2543eefb6c884e31641a1310adfd1c9f741655ee2e582afbac162fd7f0ab7de71f4e139f453576d54e2aba00333ef7cc1808ed4e593481e6894c75f8e0419462d348f2515c25ff81433c3fffff78bf74fb8d5757287fcb14c02cadcb46510641c549a5d34126eac0074da99deab907af5e2032ef4ea28d82a76134ef3cccf741bc4df7ce60e0e5e1b9179505a47fb439afbf9e2eea04a3a4890858a6e152e11110227184619e00d3fd1c1f3d2915e73b7dbc71a28e4d999974a03657ccd204225be76bf09407ea326f27a80dc8a8a0332a2a10e1da25a59a7caa01e455e8b0c172512b78a4565bb71723a3298f102d0eda9b3938e6ea1a9da0d43572cfdb99edb087c9e3e4e91a32e9fb2f05cf55e996325c66225fb4b234d084d164b3a57c969f294cc25cba81e259d193b9dea1a5a0eb69b19b60dcce42fa63e2b6bf596c07ce8ae596be540571f7574f3ebe464ccdbf4a9019d8f8933293b4bc32ece653297247d3f8469235d33008d10e471cd1f49bc339c923905664300b7d59856c549213ae290b35aca4321546f87ddbab92a63efae8559fbbeb1367fc5dcb3b86612a9639fa5b5e39edd37a0618d94b310406e89bb77a87a311a04ae3b91b8837f69df2a6219a45208ae8223ad5beedd0b671e2a4051e3472b1481d221a34e3475f33c02fa376ab003561b56b0b13103655f2d5203de05e30e5c041b9ab15a96be4a5c6f793e6d7707852ddf36c142d0f622ee751f6703c0a71bbd36892e9d9468818945ec12392c69a99d31b61c654a7f89fde57e8a3055c90c00c88affa4384987929b26c09443ea8e1ca038a878bece09e8d887d9080b4794ce048297c6f203221d1ff699fae68e68ce4da87460142bb85f3c3bd08c23309b5e3b5b165233c54aa5b574c3cf1ce1b16c9ede0e236fc2b1495a450caa2acc1d4620af5a1b07692498df450f9dfa36a64307d2743c5698a0c3a78143ce0be0fea427a37c0a82af743233dc1ef8290b31543bfe1efe8af43364e168ccc826c49e00cc6bdba1976e7951314be087fda3bc769c75b01c3f9c753d43eb49b416d025c23346edb31ed7882a80075e52a0506ab684bc2fd437abe907ed3fea3df2890cf544971afd75211b8c48242469a424e299016a3a728b85348feb9e28bee1972e8321fd598f764323a5ee3db28b7ece06d90ba08bd5c72ca9c804ec7fcb4ac1c6bd3bb0143ac007889e97023900f906cadd05177694d3818e08b600b40bc34a02d138345f415754f601d75c1b5ad74e500b709adfd94677d72b455e36a74c7625a5720d77d396a02eebaba8065bfa57e0b286293622e0d50c4b550e32b2f683fd806958618ed9e6dfafa2999e20aec8c0a49d3a7479b2ea153c81343bee58ac66224a57f81a036ea4eead46e7fbd9b480af637ac312bdd2ad1cd0937092efdadbf5f31ad44cf14d907fb60e3cceec5d14aefc42a7020c0f6c0f2f41e1c2bf210742b4e1664c3032b63fc2551499ec7de04d9b214de0443fd6e14d9651b4057494a16ff0b17644552ca35cd0bbea2e694112c50f011e91359783c27898aed31694a9340f49060b60d8174964c62a7e7251e109a7bac249e11a31f98a7f5a196629ee403038b80298d789858a4e8c435072d6dc79244b5435342dc0a718634900b7c2ba7cdb44305e8a005fc4e41185217109ed3a0fe4414ff91d73a58820762964cc58e01c7b16d34b391922eea680969ceb05577c48471e88d9b5fea22f421e7ed7139f138f62bba538dcdab6834b8e8857bd1d71dfa0890c73a76e6313657cbda9a87c3706739e4bb532edcb277aa6779e214fae8a2d6ca75164e210fbdf21216b160aae3a4a66fce8d69f82ca9750f7c06a55f4593e353dbff8ca140e189ea6ca3f31275dc5d7f59633657320e60fb4e29e3cd99ea6cfb80091cae9285a4f7644d0788a4bb870ce10d42d1c6ba3b06add8d5461085f379d7057d6fd51cf32ab8505bdbe6280e1262163cc1e308cb09f2706c563d9c8ca22994c08f276472ac4417c877e5b4ceadf002ded60bf26aed2d840a030d0cab904be4abe98992673b481a87a5081ddbcea8be408702190f2172f79c8f1df5163314d6ed2c40116925d52787470850d53485a429492bbda66882ce34e00d078b1c99d0d4d02f092af514ff48acc48e003e8571a9e7443741cdd0d21b4e680ac26a753db9f4f25b2172e22f86e65c00de0b91d57e772f1159d3f60fe2161b38482d08f40caaacf52fa0916eaa6f13dfc433331285c9667221865461752fbb523d5de30a75e4866001ee29af227a5976d7968a7bb2ec9eb6c9cb591afd05b52eb005b427fc5748cf98679fe30748c117a055b4df4ca591e8000626a5856a1a2ad00b2ab9bb6e4039f16cdbe9e1281c69ec73f85b1e075d9514f90fc9c164160758c440829727604392842be1db7bc719fc5d1b34784c7a408becbbfd8101832a9ab314d942d35dde56f98afb8e54eae3bae907242f66552d3da82a1710a53e27c1251f46ac44c8c4acc2663dd0cbf56ba33a705971c8321a43fbad07c8c950f5765e2b8069bc5534cf4f252abb37d15e98fd901c82000f080f46f6ce2aa043296299e04dbef6da501496e83e0926722dc4458d3169b5aaaf00703e84ec99f698dd165ff07e644870044c0af4fd2d988b842075966bc14148350874146d075e76073b3442bd477e74c286d79061205c7668da52feb339d47a331fabdb5b8aaeeb0e85655f28697a052e699c51df596a0ef7fb0da54b3d0e43359ce4785954f3b9b009183837b9cce775ac1c4c5311953f81357413bce0d76879fa0c468c8a622d181da4461c9853a002c252e599441bbc045424ec8a98b8577e765fe8c87577b3cf42af5d1db5cfc4e6fdaaabde7d4e4f52b7a15c9d9dd125f1566c6c8a7cd7264597e6690a21f176518dcd4c1c0eaa90f15cebc065b290438de01fba71e6a4bcf62f3b651b4a4252741b17ddfcd7757cdd4788ce90e9fbc09879d4bf6435b6818b915f50759f5d2d1b5d102600215b190c40c6dbf26b70d2ad95e7273dc397b091413cb91cc79d3e6d3c99fdd06f13726e03fcfa9271f76331e4abdd3e0f972b51f04d87e87145e945cf3e4b3994fc72173e89a9af42b14f717d9eb727c525cf41a0e0b3dd70ad9acbf1235813c5e452cc97ea09eb763c20021452150258356bf6920c42b65c295e6de4e5a311bed4f4c9bfdedb8b125cfad0ad4cd9e53c9b2cadb4fe3edeadb08158b49821c7edb70dc138169d7f01715239a5cb9d821159c5551526f8bbd873af240d55878516839f0a20cc924912e06bd19efc319044dd690523af2f2e4dc16bcb1142168fda488da43ca9914beab340b13a5848c6916060fdb77803d0d391d1484a3226b111aa703215c4438b4d3a79736da8910e43d02a6c3781fe94fb813adaf6a09286aa79748a82d08f614c402056bdf71d77d8ca0c24315729a407f326c433ed6b830f8b48063f1c7ff1f5e411315957b93cfff3cd52f55d3328748045b2c9068f116d9d3ef8ce6e133ce86fa3b215fbe6265b545a5f1fb924efe335da16bc34b7ccfa8c5616bccf506636da3f0f07a170d0e7af4c62aba2007f0a8aae166e0c1dab14230d2eccc601d35ecce958138485b390bee6fd9d9147888e15b8f8e0d0c1112f78ff5799072004c7f17c1d82f02ac2738b6ff7814e01590adc44680a8ce38e2cb07a3fb7bfd63de4de4fabef00f75a6d371fd88f24e0e254e87bd5a102dce3cdba1697da1487b37cd8080112e7ae0c22231190be88c996b7fba16a2232ef86924149ffa04a9ae6281bdd2839a92e3d8300679e94698c8b0914383b391b4d52fcc41d3196517f0b0d6baa84027ac13a5f63b3fc25800c97788fef1d237dbecafccc85e09b972ec41f6895ef536fe412c4ce758127574e20083d8f4b78059a6e8d66a36f07bbc047db7c125cee9b5f4ccb649e40dee6660188db9d6654275ba0113ba6d3201bcebfe2b9dd721f6555a0fd0c5d1000374ae2fefafbd293de7e3917b73b44df518c984c1059660ecaa1bd2ec0c660adbeb3dacc475ac6f0deedc0402a1278f4a5009739d028717fac6458ac0710c04770ad399fdeff3fea4e6c08ace59f8a0b3b7308c4d7b9d66881c4f8be2ee521ca6a5bb47793fa6a69c8e15180801af9b7d8e80eefa92752c3732ae82464f194eb1806ff0fff66da1ed875fc01a7c88d0be6b49da93c9fe45ca662e55302a5bd8b6be86d3ac3182f7235a33a4e4dbc932e34e8f48c0cdc37062dcfef36e0c302b7cec88625cd0eb2b270a2e1ed92f80e75ead0ebce901d50e60b3c36819b240fff97da9b8faf45d663145500ff179dbd85824f400682b60faa6d2429fc240f605bdfa0d502628cb63e07cd0a67a1c625f772dee2f0c96823da22e50a12f2e8cfe378793aeaa216ecfa353de01e30436370f9eb3960ee029ede19741b3fa5242ec4049efba96c288c4b32b24d1e6c179a018cbdd6e748f06039d95359ab91aedce0e58d9379d071758b7086611e13a54a3caf6b284d6bc96ee38807bb2dee819d36040aed1e86b8014d67f11f08b110893186383e48d19b63e4a1c375d915b005e9ee77c190e46e71dd377483e6462aaf5ffac9dfbacdbd89617e95e81248a6e5ccc76332b0a06729f460bacd2454a74ca2c9a3fe440a6bee708f2b768e9658ba66690e10d0b800b1c0fd08bf3497cd0598b56e597b54cf566a5e63429d1e00ad96c6979648ec215a38262d2c4c6a28b1a03aafe582456f9c6fcaa9fb61250da0e372079c3e97a23f152060af0aee0e8a34ce048eafd954f8fdaef7891e9f9b977889dcb430a7a3861b7cefb056231e9e34891918bf3f1ebcb97b60f6c637fa11972b528224a7a84dfc1bc3ce7f19f73112e8b85a3031e1fb782d1709307ca182deb8a09a49951f0e24aafa75da75e8e282371e0e631b7aaf6515b368ef8621d1522d3f52b8b6175a384934db47ea5c0ed049df5db3e62a177ac37d6e572606114a388cf2b62f7456f29693f2349285ae42f22c343c173edb1d555a77c065ea57f8598bf88f3dc40f55ffc11322159f25c24762ae58a25ba38977b27e4018fc4cb97d77111e72755ed7257dce66273c5fd98770c9877fe8b45fb734cb1e0b772bf7535ff784faba594ee78789f0f5d11c5a0ebc658d2020c8bcbff1d1c062af2d5bf2579b640be1735322dc2dab9cdd950a4b73c226e8a179a8e248bbd9ba4be8f9f4f33ca38db4ed8c4d192cf7074eca1f15827ffd15d17a05bb02fdbc35ba0904cf147e8238e6bf609e59bb1c298a18651134f5833f3f9af793874c3396d01de3908dc17a62fb1009f091676268e55e788d0d7e6f8a96675c04f6ec1faf00c0684f76bb1d4c83f9325b5442a1fd777aab8ce5e8aa57f4680316ec47a61631771ee7aa872d002b00fa29a2409e038a22f430c180b7c61dde3bb964183e64658b59edfcd65c8b4bcbf05fd98f6649cca26165773ff0ae96444219d4d932741efe38b40e336112accca18d24c1c4d2fc5e27f73b177655da545cfa9b74b9a5a7a60d1df66cfa3f6ecafbd14b57537c46ee461d34d30b1ff3bfa67ba5d90bdac1b26a89845cda9c3094bc69e37620aa5ab5b79858a56033d462c9ad3ec9798a231a198be66de611a1c7dcc79a21b5ee9622d0b2bd6628aaafd9f0939245c0f22e8db9cf0c1e9b87f8342e864302fe5435c18095dfe343333bb6575d9d8335de3380e9f463da6f3082c3bf962e8e09a97159bbc76e69ddd94feb261b22b960885f8cb19985dcfd53663a7fd3e2b458689b81dd32e5e3f22adf60046fca248d24eecefdac3a3930cd76fd04db592a8cb35f9e3e6341885b74babb7a406f3bf97e1a37d4c5feec7bf015dadf9fc788f9af39775499f87c5179f93dedd9df2b2cd3a917907bbdb306041f72029a9b5c23973e7618aa6300f98848309c79897a2c57016d4f2985cdea8bcf912883c5ef5b89db27fe8c5efb6eadef06129357c7cffa56c18517da52c36a23f064f5cfcc0fe59d21bcd476af86f43e03adee0bfa60f3ed6141642f31f1e101996bafc99f9cf9a7f013fa8e607339c8fd1689440b061c8a101fd04f0150ab6aa7c4ee0b1f9039b9919ccfe110b25f0d5f9c70f62312988d0c58a92747cd84c8d5c3748e4593f0547edb141a62c988f9bf4bfcf0103eac4a14f3b136a536781d73d7815f5e352b78ba9ac76465daaa577688b7ddf70eefd7d8e557bf5e8b8df7a973a18a2f503b3fae94326cec6b042bceabcc305fc6145d6afd59adf02721fead2a95f524a1eeabb0c94faeffe35ea4bcf7a13994ce92bdef7a547ffa915c3dcf43d1932924c3d2e5662e92fb440a1c69cb5657bd88cc3ca32acb861fc7189e364d78f7fbec1f977e5e93232c03783f658d0c2e56cd38fd1f4cf064e7abcdb9dcc5177ad1e260a42e9cf4fe13492c4bf4f7dce62febed15dc67a8ea971407d236042e0770c177bfba5dc8df3366b643a0826e80a60e241a6bc876117ca53b2ed6dfe8227fc4c6ae7d149eee82611046e10743f8a7c894621eedbe986ca1470b265d9430e4187fce5e4af086b7abeff2d1b0db7df703769776cfe16f90e7bd08f7c0cf0db148e532f1e4e21edfc4aeb7e90d03399bde9ad3ed470f8285533e7252fe79afced2914de96df568f01f2bcc3f440d258d7da53b1f729a47088da9ff1a5d97daba6526523fb6fc3da71b0fdcf2c3a5f933e404e60f1294da8ba52f0cf82db042376a71e55f1009d414258f663f3bcef18691d9a5f0ec607fd56fec814a55cc466754436d059f4c8a3aff605592606510bcc83ca3c67273d58babadd226b7da6c2ff34a730e77ad80011fe977373ed7f11d0bcf36fe73fd1219325f01cbeba900e9e7f8dea516a0cb4e762eec91cee36015ae35fa5164b6ac6ad2e9b56ff8b52f0ecd30b5217955f6470e669bdcf530bfcf953c606969431fcf6825d550c49c6927497f122ff0cb61acef46e7756f46e226a1a698ea7845925ffe4200ca8b4272cad857dde776ba84015fdbfb9f0370e1b0d5446cffbc5df93919396125564cd16332ad64565721e0ac67d223c0900cd67b61199a656946a0270c4c0620129b537a6334e91f5ddf1c6276d2bfaa7342b1ab796eed4d7d6c5c18ea05d45c3944b803dad3400e5401d8374487270edc3ea4222f574b02a9deeb29a6e178eb230698d2cbfae5824943575d0767625d6caae45d133317c5fd94f9f92fd881cf0b82490a72e314a9b6f31c96a9b9496ab8882780d47071f5c671cb97d2f9221b01f1681429eb70f06282d3f7e34ca06b64b7369172e77d83c0e03057c63228b70010074497ea78fbe74a8c1a922f8d2cc17e36bf6e216d355f2dc3796ab40a2ba4302b26fe0a23cc8ddf78aa27ccfbdba9356abdc9f5fb494c11718c0932c65eafda926e107640ce1dbba8a12a40bab185b05c2c5853cd1017d3984020c1db9d614dd4dc7d160ad8a484d7362c86900272d949ff550812d80e329daf8e57d7a653612b84c8be59972175beb84d6b21a8a4288dcfbcd81e03c0e192cc021ed440cdc301aa6f8b5caf2622d3cec3928c122c789f5ee1041c580acae24c485a16175a6ad1b2b5d2d6e1783578a6815645c88aa0c91d5dd218ac268b4bea0a56d562f961000344954b5c93b56d33ab9a2a8e3617118146fcf82013f34c4cd1119d3999deb28bee6422c04cd2fd6145839232a85d3ebaae4e3710017840a78ba582c132258fa4bbb27bd6ef6e207f7b738438176e62fbe746b66918c163377de5c171f4fd7537c70263244440e0c17cb3016cd3e9a222d439b3a1251acc8b3e25dd6a2d85d1ed7122ca9dac882c1172bcd02e8d694e3877472a94a0b5bf6c3d6dfbc882866287a6c61b154e99e960750bb0e37862c72e9b9a262c21ca1567bbf55c65fd0f9ecd4cbd6e28b422d5c46c27e17947a4aabe4755a289abe8ce720ea554cc256e1aec55fb03406948e6650d2d3842fe476205562590179377b73194f1d80fbc8c3f7afd2d056b05ee83dbe0cba746d116d90c5708029b9dfc2c20692606e90ee87f83d4fce2621648c0fb9a587836af1a2c6b422e26f12323552214e4ebc023ac474dd555d0ed02e913f373787b2ca03933146a91a93c130baa6156aa96bb373415a09ef16d4d6f9583eb7ac7c460e6ca1c28ba40dd8953439e012157b92c5f1b2e305e860038f8ee0208a62091b85a9fe5ad088e7530249bd04e293a548613489953f2461c132f9a12ab8261bc4535d6e7f0e150c5cd3067909b996d770985ee8808147952ac6776a46240a83f3cba900086904dc7bcfe46c5eefb8b8e8fcd914ed27b410274e82819e109759ef8a366cef94ea95ff58adfc82a2299e382e13b1415e2d4c7c395d683b5b39f245a508ce51c31057b11f9647c3e301490f10fdeb909c1c00ee162bf057ff419e60d8a0f80b359e383f8f419a57b60e219703195b20a8a6a9264edcbeac280a5b9ca87ef02723d0403d8e761faa3f0b19e9399130d347659e99d11ba0e0ff0edc9c8b7be5c983982af3dab4f6599962489a1e2f82b940a02b64f3b2cd34c51541d2372ab6b057f95490c701e07cb46733b7b71223a16ee65a24a1257f0ddd5934d0e862804698bc35c896b108ffb481dd2009ebc9db0d111aa4e9c4652e3f33d6fc967d14a0f0d4e3b7e6306884446319449019c457a6ec83abb4a7d197fe96b3b9549910799dca51362636b30469114f2db38895c3ae7dbce69410a18beda545e0a92d731f636e04abddd971d4082e48610b314cf213cf9703876fb27eb0c3ab3f70c101e0c06e8835ffce03b0190577e13ac8c011d1c9a4d31623400d3df54400a24c740a974f7d25082c1eb62099b611c4c47a7fb11c5dc94fb5ac99f5d1adc3bc6858baba74f3800a2b66f5594b9176c2affe078d4ff281baf3b4ccfffaa19839e963c770bce10b62a7aecdd2a42c3256415279c73d5062005ab5fe834e4103eb511a0f3a013c7072a6930b3252884f37aa4079d39eac52b6366d94a3b03d4567e6a47edc2f8438b2563981bea903b323c0c60c3aa4242eb7755f5a39c26dcf05317414100c57a07ac6f3d4de0d6ecd7e6cfd9cd7f2bdee68ffc4ca360fcdd236425526586b9495525fa22b34decb95b18be4b0dc272f3dfc2114bec9b9580d0b0846e57d6a4e122f00cdbe95e8feeb9030b639a48521418bda43de92b2dea0a9b5108c7df43c893727d3885160e9652da9d8bd1cda7731abf4b7675d24a624419ea82f2f98040a5f374f98648fdd6205793f77d843c744928c317921556a4ba41e897d0a7348a991b15df0f14753ea6f0ecc37ce69ce61f44ef4924b2503a0519842a366f4ac81a79e1a97c92043bdfa7403b9cee1e7e6922e53da2e60e02c6078128278806a5dc338dc200652c05094973cb152d83ffb46ac6e1ad6cebf879e28eb6b6afb13ad359581e6e7dd051c1a3b4606aa078a75e670a17ad6c956400fc55202c0e2fc29f6715fdc31524d57c0f34ed7c75ec4952aad65e75e53905bcf7e1e14360868248273ffe9b15060a5b1a977271fc80b1f4e66b5ca4852c9b8f300b7faba05a19a06b3fbdbb0cb91b79e5b7801908e98f042f0b26425f2c23541e0ce7197d11cfb90cee99dbbe45cfcb20f5f8659602d3bd7487276661a754870f746a40658bf1f00535059dbfc810eeb8f8ba6580751891f4f13fa5f7a9a2037e67c602e8986fb149e5555d1db66c0ba72d078a0bdb69a0ee32d5e4eedc8148fc8bbeab4469c04bff49c5f746632191a55ea485ee6d5c9226156c647276022e6d6963e8b03f225315cfdb4f09ec54e976a148c7e328a4328d84886df869b94298b02d21e1564c49ed8076bc1736576f317085040a4c2d4481276f187e980d4f3ca7484425087f5836ec12f34ce98e107ce0923206204a0cf6c51b43bfebd0776519c886fb21c1297637c7222dcf47a44c80d618ed7e144b44d49c7d0b5f9058cb50b37de66621fa34da89121957abb6d984e013a73edc8e971d7664cb9818e614dbe29dd692a271754f6e191a83a142099718df86db7cbfb7b41f49a62c76e0c034c0506efc9d5cc932272a2c9b59cfc803b673e8da9d3501063925886b4b56adf6511607ece176eff08b47d262965b70edf97822ebdb875839a1d100362d0103a64391c812f078199bdb3107470b533c014b85426ad548c4159c51e84dbc572f89a4eb1c6ec226901638a1848aeeb28027f9ada36685846e91efa773447403acd48a00d66b053971cdbd87380b4eca5125b25a8af2758d6951b74a35b12f677ba3e6b6b6d5c56c4a88a98426d1b9eb0da88bc057f9502562dc4fa4fe73685ef318ff32c36673fa4919f965fc3e0699216d18d60176c5a9c7310a6063cd4ea8abfd57944bf1ab3d8ba865f69fff105f6c97cd7e8c11706aca015fccbfd1327969be2aeea177a469c19844d2ac92051d0c99063de06c19c2ca7b0aca1a9edb86a3595db02f65b962807c3829e80460d72953ff07343652cb5c549040bb019e2c1aeb4d597acd6b971f15b6818abf35cdb5f2553b998491205742cddc6d47a387221418b47fbc7e1cefe919a39f8d554a058b08ee29f175a095212f2d41204b1b5acfa5de1677c6af70d6193f830e10d438fc0fb31541101244f50b38a584d30584ed4d406c7f70759faeb81377245495f019a37e2da5d89f60f8ddb537d3661a49f7b4d2cbb29a1bac547504dbc8dca5e3ff3c69de044f2f6c79a9d4106d9a46077da4e36260bb42686e84fece4e7b6a4766eccd21b03f2309f24193184bed4c6e390a8abd8a70d5417970c9290e2251a40e8979ed02034fa657817c9e3f1563fe98ecd83a6755e027204f5eb02b8b7ba9e42c132594b8f77a2dee9061001770364684238834f8543b8c1daa4a03f0022cdb508a5a217dff39afa2cc7d48cc3b97f76774bb2d6bf9c432776a5acae2d01c58b699cb023bd29851e43d0166d6d97ab030ade74aa9b73e1734909221fb24c55b957ce62971252c2130deca751e402031794ec5fdf160496c685c1baeec70769b1396122c46e1b4f7c9590831df02dc264052644eca7d0403b3aa896fbed9f5f0bdb316521732ca00b3fdee2dd26ab2b9bb9fb993035ddd2eef59ac864505cf88f8c4e4a4ca5b3b279210a75f96789f48f5ed6a1f5a403e7a749bfdfec456135435dc9eb9f638a61033641560d3e14e50c03bd55a722cfb595cbc73752bf2fb0e3943709e622b649e1bf32667633b2edf77650f7c6729a5537f03ccd3607ee9d379a6999c9b133ab0699095e1c07349abbfb0556a354ad783134aaa5ab7f2e36332385d56ff1e11c45ace283d8e58666f4c335c9530b96863dafe5ad75e5bbdcc2d681536b888b87795afb11325ae6d8c6a2ebf7de806161fe42f3a7afcc289dc9777ef9e4f8e2dc2905b6ef8358e47f85963c6746ffc57c342f26d33544d073a6e7cce35f6fed121414fc54440b02dd9c6885363df63d948a479b264a2410041b06cd44255ba6a53f6a0b427bf7f2a04ed6dcbb5901b4e3f52e9167aa193c0a446e64cfaff9d639da55d4f433245929b1c5482f05c7d9cd6bb0b049a46583c42e2a7ab1d5604420588b921d50d38bc5b2e8a3b920969e2b4e5371e09848a9e4927b5dfcd5b988de333ce4a618f6384e5b24e874b9e238278c6202c2fc47d25e4871beb84b6d308e0871c7d67118692e72fcc9671b2f7187701d44643d3dcb40f257f650dd2945f8f56fd5960b71b206d1308d66d39987da9ec6f07c36226bd01b061378a574f728ed7ca964ed385eb8c99d35cf20781cb88e5f20c91969e2f8e5bab707b0a21aa21691121f6a69e54249ed5398bfa51e4551ceb6745acce9ec984132b825c085018f072a6790a0c956d6167423710950b3e338e23773a3f2d4a93d458034323789d22f9ab954480b927254e715ee3dcd0f403b116aa31bf4d07ab5b29dda079acb2ffa7713e356eadd4709f672eb37a043a21aa7a204fbc77e6dc7d653878eb1ad34ee2bdccf38c221f5e7be14dd27424bd6a59aba34c8dd4fef108e477d88cbdac83ec55715d02eb5acd6a98d2a6235e54b33cb8bd2bdccf86cc156bfe949186423da9d9455b46eefa17285ba1f00e42e6cab008107f130ccef64322b89b0d57d3e51b856d6cb29936f4621ab1e39476cc690710b10d71771c47bea224ebfb6794c88c50e11fdb9742f634b26d0a94335678d2bdadacf6b54249d0bc12b4afb542ced06e8d658d1cda2c362895b4a37c5ae6e181d888dde24ba2b967613746b2ce966d16db1c4a51ec294cac8a8f544e1da58834731a4aa910c60ffc53b2dde83edcc0f214845c805fb2875fd4aefedab573af7d0b45c9d22072dcb508784072552ee9608bb4b425194e7209713c992d4249f73b5e947e32e139dcbbe4f8270e36b5a4f470db0e67e48d79bbc64ed26abb4890d785268ec800784e5004c6d95688214da12a315be1654a9f51a0f6360062a35097d9509bd1f1d5664a59930f9d126cf95571b44a89e00c664305ada760ac26461c3e8db02f58da859013f52c07c062a26b847b67c5ce669e91a0e80161403ffc0da2e1a522e6bb03fc68a60ed5ba1e2784340f90fa43e78132748d509b3a823571369d74dad1a52d8173e93f18e4d3943fe434a1475d0a230fc9a85f42ff41b7a80aea29bd059e81adae8a2964aa5ae525aa928b596a4280bdd864ea0abe82634ab4b2b354aa9a552e98aa2a10b742b9ad46595da4a224a459bba10e79c42477095306f7e1ef7cfcb2bff5e291717a211d0d8fd9a27bff2a438a4e9b83f8b705a128bb4591445300bf6768ecf27a7bd29422f85ba50a7247695525f2b90c86114b2ce08273166bf6d77143dda681488412970748cadd81c9a0a72b2e1abb9d58a1edbef9d3a3a355be466880a851c1873186b42d9719de885d29f4c3eeef75e725f559ff1e5064d19e7c35081d9bd02e5055b4c54fea1125aaab3045c6828850a202b9be4f07ca845e6545d65deebf39c11b459d6169380e016005dba69671957b8d6a5fb08bd4d1358a5576f301c0915ac3cb12a658760b74f112f9b1abba40d598472bc70541b1a18c65ca2c186c1968b94e385e1f5c05854ed767d0a8311e33bb62b5848d762a9e197624a7f919f2ef09c79f321ceab20205df491499b43f287afe641d233efdbf9e31c6c3ed034e14084ce2ba35e16ce075d3dfca146bb8850822585e6bda886c1eaf24b08de2758791f9d5707d5c711cc83a068c8a1020306709aadbbe5f66ec8317d08aa2c401ce030f4e5dd101878093bf57f847e2d296dc27e832ea93a1be75e1daa553aa4843a081b217e8e2b13c2f920037e7780a6da5d9e8e771c674a3a66cfce263a5f891302be59d60280a5c2d8e92c6bfd03ebacb091aa043e20536cc5493ea67f8b59094b8fde8981bbd45369835a56726a902d83af9603fc4de2cf19eae53f3642689b7e7220cb82f13a6afcc6038e038bf8542967765bb5f20f5e51a9a280975b0d89569f4c639b1bcec1083d739d0a0907ee25945982b51786d5b272b630ab65caa3222ba04192ac89446dd1ed7e440e01e92e068020d7aa59af47bc9c93ee26da6ebd1adb642dce0ab29ce9a52804c3fd89a0a141d2b2269b9e91a1e8ddb9415e99afca280a8e7e732af1ffad456e6c2ebd45f9af6669f6d0a0961246293e1491fb6bb9913d997d0342a713abfe86c9051382eddfdb6cc2b81cfaa6ac86ec98b796a57cf28993290c1a7a4e155fcd454c6b53294e154f0e6d0cb4dca7843fd9a61e5e0063871e47fa6e7c1cea8d5c83aa52325252f470c7d84e07262b046d2d97dc5ef2ef874a815a763703a627c6e00a96daee982174f6c515c28ece7828c528d498996816af9760556395a213fce64981eb15fdebcc2647659279e1f0cc9488393c3f4c0b3831b26d002dd005fb345b1ab79de85fdd79a6a9b191f3583f4dd5352965f617cc2cbbe39b6fd5405a044f7eb5a09ed65ddbbdf41f37bcf81a13b305ea1ab461a2018fc062bf310980f4609887fb46310b1713ad0f8b1d2380cdb129fcf96c13e2677a4e31724b60480375ef6818fbec2254545d6ec42a8f58293b484bf385a4cface27ccb4597f2e25b86cfeb1c20f22571c2e63e768d6fc505948c924ed631ba3451408189d092110d2283dbde5005ee4b2b6936f195f53d98c414b9723cbcb63d42688256503448488b038dc2edbf51e5d456ceb539f1b2ad507c23459ac9d6a469e39b965a465f2e86c435af6fd32172e662e579b072ff002fc32095b207646a27743dd22bc89ca6f3f2e53d5341bac2c815397e5b442edd5c231609d85dc9c151eee5399f2cd974a73181ad34c8764d90eed5382fc1dc58370d57effc630a301e39de2ee4cc0ed26451c17741c69879f6871b9dae4aba1f72c6f5a279e91d1b3e70dad9eab2111df1ae454f72cf0a5adb3991bdea66384c2d846ba3a2c31c87ed3507676cbe22fd7cdd041e427d902a4583ccc8406ed34d93e990e9b15a1cbc0c256c6dc3e166393cb47417eb88c2539d557722668c96893292113b9e08b71c0109d4f4ea5649759a7dc0378e0ec44addc948c04b395d740b6c2d1eab4b4fde135161f30aa6e762894b3d4d53a4044551cb41838e51296539fd0e697123370cadc6d832a785412f3e35072d8c9334fb57de398d3ee0569f58275286026f9993fe004fc70bac486cf1b2697a9a314f440361fc298eeea6506d8f639a9cb369573deab1336f31b0f8f7f24b49faa2fa3c9210d8e843ac39b7eced03726dceaf7a350f5d5a7973ee723852c72e2fa35db66929ea92534a975cb45991974d32c228e228a58e9ce451b9f57e9cb51ac66e943294626cc90059ce093bbb3a20705a49621ba7f455b241e27ab9289f08293fa172e06cd56aae43c75a8c2733875f1418e4f2b1498c9d26ff16e23ecc93540c700daf077737044b06b19e591e34dfa643991030d9f95f3beecd2be18e644b8255b1aff366b49792b68e4b465d7424801c974d321183b3038834e37b583f854dde9773c65258b69a0bcce989e44a3ecfad9eb52eb702b38632e873b77b56cf95a2d191680261aa9156b2fbcdb2c715f5fa065705feba0257bdaf8603dce4c646ed5350668c6bc68ccf1123abea00940702ef9046170015b00a70b68f00849e1ecc15b8f394e06528d1e92c402f6a5bbb4c1351cd88c2350d95ad31a7408fe7d58f991705668ccdfcd1a27c692bbf23c64568b129061325f1aae0a8ef7e92ef7f53fc54822bd68bc3bdf29d33426c7337e85765a4ce3246cec445b9b36f13f6b26fe77f00d88f5d6f87ef3290fe1cbd17d6ef5086450f7e4ed673375cc4f1af5427fd2dba82e31d9fb748a84c4bd7f455ae37e4f9417556acd1ac739228711546258a2b31cdb65dafb24672c9ce6c991757f9f66750e529a1833c3b6bb2c40b6a34411ddf7527940e4a5f32a645edeaead5e842a8ed58f40eff4ed33dc485aa8981970fe0c61619c99bcbf3abe750c88b10463a159482a8a531a81b0a3b254a464d5172b6148121afa6b06f1ef7db4bc173932c7946f7d42931d8f2b7eff691f852e1385c45e4c248da71cc29d1ed4ea7e4ffa8ee414c671d67b0db054db794ca98338d59bd38258b38fdf3029d823b672b0216f0902ab4ab4cf95a37f5adfafa5fc507ca32d3243192eecc30bcbb5875c9cf0005de4742802db12c757ee1132024a1685ee8e593ba771673718f441b06830ba71b5596d8d9af5e458a96da6e815056e268c0c044c9682c052cdfeedf1cc84ce4a3194a976c140919bb987b564473f81449692624c3e991b814bdc816e6071ad70d29950876479e7783edfc4d0c3324745867b857fc4048ee1da162ff9128b806876d034cb902a580a5df95b1a0cf2d650ce995145a2a5e4d2d6a1dfc6d97dda676fdaf5e79e795441012b06d3e72c0a0df6a154be4f6a3c945502186e1aa77f81f56ac79ee944fdc74212472f74ae03df733252ebcd6077dfacf443ba6e6f0f37f4686433165ad11af678d61806abd21644eaac9d85cbf16b9ec8d5ed39e099161de7791a66bf3992c369ee0099a4f6308d5c0bd5243f5ec671247b53a780f53643da83179f27cd655666f4fac175bf0ba4ec9437b5c3a485e727f2f493a5a670ebb34b0fff07246c5d00a5c3197334842a70055504abd3e54904351496e541510a1636d608f4f63c3e83440c12afdb39ae7bfe9d9422d8b365c0fc902607b13b6e82d71720d9a6fb45654553f19656e8cdf222c0b0293035172b669ea46fd8f1323b3064c7de0a8ad94a0f5b6e0bc1308c9b8774c5b4ef718fd4803c678db3291c89f56af0db989430517536ea7ae335976027a8717fc100c1936703c400d6103c5673092120712f1cd24b9f186824c4b0c42b81c4f6fd389e8099eb66d8949a0aa872c74d85c1a8eda6676eb8dcacf08667e0d82a1904810d9bafec2e6489b518e6ba35c1a5f8e7842be1a2f4779fcef99dd7fb89ee5c1a0d1dbcd3aab940eb29b84865be2a60bfb627a434f53b5b83a854e704ee0b8ee86b526980a30b36f86b01d913346c061ae6a9031f1c055dc216a26ee0920b868cb584baa46c19bc4c971d2092c9ce48614da27c15f4c77508a129a34fcd5928b12929f921f7e374f311212183d0aa09069a498b8966d297b91b0e838738fb2d662a1b6d6c190033ad69a92f58f2b8bc9397a7fc1645dc7901d9ea51d16e1220052a7803e58ec35ab0125d013ffbcfc95d303c9aa028cfdad92dac829e245ed32b94812416d4a79b2ba5587d46429b488cf2832fd3f3771f9c500bfb4699647a1f0290c5475b738cd30d449ac62f361a3096a4a5a6d901a895da1f982d690da9a63c79411bf101550e1156076dab504a7d604f73c2c2f4bda5c19ec137f4c9e8a2a240f14548e37b16ffe509c62c180132a2a38aa5093963840b32013b13eea95d1973ce4c216b4102ced405059a8e29dacd144df34cfff2df89ce61611ceb03c903ec9ec59ae6402b0bad4dfe3c829d9c1feefeae1b12c3fb692ccaf088f8f1dd4ba11a2dc3a406f72b024447b14244de142e389dd9c83a24304e6520c762da41a09ee58c19de18b3d78d89226c303c65dad3778c6a7d80320ae03d35565515c4ab27c546f1e24eee4124594dc8755951e46add99e823a449408bc803b42517215801fbfa4a4253be2b3aa1544bde71cc32f2bc5e5fe78c4c54f3c0686a47158352211717fca64713428ac6e1f66dd3ea397878d283dbdf0792d762e04f9d711a89366740a40268b1d5d13aaeb5c283af2dea84be9cabf063b06d6a7c2f02143bc4f19ba569acd3a3285ebaf051269c00e66bb44dffb89915aeedf4c251d83b09d9036865ec86f6537526c8b5448b73acd594774d2277d92d85bc2e97d106357bbea24b591ae8dfeb360ffe15f49f0c1c2cdc3209c301ddfe921014492da429c4e1555e31a783d8678e446859f9f00c74afcbe6a7f01e6fff817fd3ae0015cc804da2cafa6551048cc381d80f3b9d4d11d834457e1d7e0b20710eb5a011870b10f40ee0daa4462f51dbd4a257f4ba5d922fb5fa146d2ee26f79785fcccd446386708fcd3461013450a43b88a03f31c750572ad774df2c66d8cc8a6f209240a630a37980c3329dce0055768381c197a4ed889c243101626d0462fa1a177d874778d150cf8418b09ac34571ad30310e39b490550e042c3278a93328ae8ee965118ada4e2d3eecb28ec3e49d2fc1ac749c3f7fe482b4792ce70cd8ee3c7ee574a13e7fd71ccd65e1274f75173a5d76d01178e464ce3741a4d33823057774f698e262729c7d349a530c71c73d098c0cd90e96e77e2fea53285d97477019a9b594049b3a1122f2755e55643e241c383338575d3e8d0dd33549c3feba699d17c775f519c4bca1ddc4c0d3753e266ba9d386a27d39eee2e71dd34abeea6d25c5fe91d1e2bf196783929b1ce2b42378d0168a0d0c0b0c20c9019ef5294520b073428908302d7629a44c5d9342a394af87ab34cefc4c1a4f590ae8d79b771e68c21e4d0f87a4852291a1e0e68531c20e81966f8698e0aeb0d8fd0c33ffcfa3e531c16888304c1387684208710da10c2170d85e54df34692854d6f1a2a4a414c572ce96ed40de6953ecae84ed60c53a22824ed0a8d629d42344c8966780a61fa53fb95687d5e76e790b5aebf41f34e564f3dfa7a748bb0bd8fc338f27c15da62dde6f846387f0b7f486f513d32f251dd609e1fa3c8af9346f192b4b04fb23deee171de4f7a8c6595624c892ed1e752a4ad1f6595b65ab1a25c16e12e6581457703d1a61f04a16f8fe4b61afd08e5b2487c1a7589d7fafcdfa0bfd68725ae8494247d1ffe249a298d5eb21bd08331b24a6dbac736f5c086af579f269b77a6832485b1256b8ac434329a588b0fcb250d5f8f46b3a19829464aebf81bc1ca96f8a2c823fe91910f0f986859a5a8988d669b44eedd72fe4bce221cd5cabd1f15ccb16d1279f7490fc90b8ecb91f41f95d39bef8fca6d689fe98cc14aecdd27438a67cfcbc09b6a69b6341f6958cbdbf848743cb98cc2328aa766dbe7893395d9ec6e045662236304acace14f8a2a9d3dcc6da6f93ea9f29f6b83bed68ab25dc1ca95f81f94edaae5aa5fc5de20f1c57fb1d210bf914a346af510fd181d89f933b64319973fe2d7ac588154d8b34da2d036893c9af1df462ff2d5667a4b9b34633eed8f3bcde66c7bdcb3d46fe9f965b749c3a5bdb5ec8f5fab03597a7dd27eb566fd96f6e679bac56e452feded6b560814ff5529e87586f67e153f721bc7f9f7484ce5458a8c8070f0158f90cb8d805c3c40463538508fbb5a4744eed527edb4be724fac288c5b98dec66a4110dfeebcb9522cab769c20e818856331fbe2bcd967b907042d1e67690be02008ba0fee8e72d40e8dce5ae4246a791377771edc7fa424cd86b6822008e42ab8c599d692065168e0a3bb3d1b1bff44fa42e1d85fef6edb263522e07d6ce25cc2ea87486129da9b2bfdbe599bd410e2e1520771f2b88791423be42eceff91552ad6276d4078685e20f181be0a6de16f3d4bfca027f5ef8f381689229dac7981d038ea468385eef6663046cf59ae93dee9338ed3c7287f8bb476e57ad5fb48b73a81dca332c52708ae10e4de2c9c7f3ff63fde2dd35a5a544ecb3dd40de6fe77e639fbf1ae8dfdbc40f759f849c71eae65b2bcb0f992551a96e25f70de27ed252b05417f10f42fad8cc6aaacc654ee81af943b7110e6bda7720ff4eecbc41f021d05da5ec41f88f2944f01bd526a83dcbb51f76ec023b649049efc063c726d1078729c7c677e5ccefbf9659e55eecdc23b1ffbedce4a61e56dac799ee423392e023d461dd7470ae7bd271c9bb79f5101bf8f089c12d61bc613267ecdce7c92781ab917bb19df60d582549cc94b56e9bfa680fefdbcf37e8a662f494e9af3b8f777fa0da695e1a5a1dfeebcd9760b63160447b1ce19c65494d5795fb444392af76ef302b52c0ef59fe57c23d612ac350bba38fec9bd8c5f26a33007af75816129e2169e17089c82471f9f3355a68e55feb38c348e23d2740fa4e2284ff9bc405340bf7ff381422e16d0cfab004645ae964a08ccf7baca66f7329d79b52f3a6ade77db8bb73afd069b721b3f4f2a3e8d466f318ae7907bf7fb40bf9f64ff5a22f748f0e6e4dd9cf0ed91be0f046f636d96692df517357e2cf6d7c6fc4b7a73bb3dd20b83494f6f46e1799d0af87d33dbf206708a639b5c4b5b451b5672d25054ac9f1f63b2666f1e366b9db553befd13f75e9cb437e237e29f50600ee836c754a3bd76163e76a0209e564a4a511497632346263989dcc3377e4b1bab9d7c9c333c3f7c283e1ddb64957b7e1b6134e4714f7cb1dad07325720f5f3bce17697ea26c57781ce9cc678ab307d749b67c8ec4cad3ca76856345d6352f9058cb20bb12abedc12c9e6c57d9aeb6006d5952a97b410653ecc517d78b097811841756bc5872e398a24efeedd3c50eba10c3e7fdf9230aff2d9b4601dd4d6b531659ba6964a079f17770265f856272d2fc6b262ed8e8a611bbbb8626e482092e14c0850f5c8cd851f85ab2ba8b262ebabb66ab631f66f878f00f04bdd20f088aaab5020a02fad9428be721e13b9f24278f7f33ca1638ec785bf8f89616678ca1c5175a3871e3959edc2b75163c66e7fdffb418f23c5d8b153c8b37ea1c497cbd91a4d12c7c4c2190a1bbdfb380c005c43815ec2e2cc43416572c49c2c15992f47ddf7785077a0914eb7a22b742dff77ae1ebe5a452df87c910d8d0ddaa29d70b31a5e1e01053dacbd6a60f7cc1381867167ea6d9d08395b34c6538381f26739e799ea43311ff96a24fd307b6f0400efe218514e98e239d8562b5300ff8e86e2c49ac318ef37fe68789036e74e3ebc1521cd8e96ed5eba563aa828a55edab0e0bf8507340a19a3869e23736919e72ec873ea35b94633fe4ee5e73e0c16d227dbd4cfcd70e1e3b46d82143184d765cd051a6348333ba2609980e225324e9ee176dfdc4f72f091d4f3569e2decbc467c20126296c30806d8a020cbe1e0e3969226c618ac287c6d72327cd8a65cbe70a4dd8ec71d2dab936681ca7cf387dbeaf87482d94efebf17ddff7627d51a4b31725e78bc4f8611376edbd562c31266977f6d2f950e5a889df090c3a3a3a3a3a3a393a322c89010625495e40a2b3337776761e367b761e3661d6f57d2b389ebef31f7b25fd25bf2f0b155960598010610222762062004388f1be5a9ab517fcf26670b4160682dfe7026f30bfb6e8ef574a4381374fb32dd031080e9145b737c42c1c4248777b54082e8480a23d914e9cedaaf208418410a76a6f75e6fcb0712cc974fbb5b1283e4558ba747b58528e429a5fc3328b8285863b1f0b8fee927605cc952cfa0a11f5b1acda1be58a5f0952a78308a0c16d9231274eee571a2bdaa94da31d9bed79d5e6c52f1b0262af20bad4d21404134184ffca8f9dec840fe59d60db24c22d7c537b1c355a0b3bb90e80c401c003b8a340f778ac98d1ed59b1e2e2b5b2d30d440f80a002db64fafdb56108440b0822deb535db4a3d759b363f88f1fc872cba7f384276e70fff43906e0ff4418d54b5f5e455e50313ed89749c3ecc72e90311db8b353cf5a0821b2fcc5f4b474dd8a9071b257b58d23c8069f7afd6c4438b072448f7e181ecf678106a0f8a657995515c854c7797978a55be10aa0236ec5afc235905dbf87a295a684b7ddffd172db47d1f2db40981012122d0fea1fccb8fb1f8585c58680873bafdf3be965eff621b66fad7e66b48ee51a15440f1bf6fca0de6282ae08f227d559b678f7b54c0fb2cebc2f302d926116ca272621693ff4f289e54c059a91bf9f28d04b1421042fcb38e7271c6074fc37f0024ba1b536a7b6f1a295caca6bbd473749707400d803bc08f8c2df9334c3a0a0a2618ff688595283e2b51ac1059b9b182821522dee485f226fe42e187620a4fb6ab719c3ee27ca16c57e3580665bb7a424edaebff66d8f77932a47e48c10f53e0bffea40db1e7f0935e48f36bdff7121f697e946e1a39ba6986d04d1347378d10babb068ef6ea742b827605fa885f646355452b896cacaa90c2795d2d28a26a257459f87a38a99758e70bdfc279434b7bb18716ba8b54b12bf1b35d89cfe31ebe30bfd5787a8cc42a495af5238d95a85958bfe747d8e75bcf7dd6ccf3c7ab969234fb7fbe556a9b73d2e67dea81954e2210cfd9c7f2c474d66edef4fcb7db2c9c229e421f54fac8688fb52edb8b19267265097906ddcde505544ae481d76bbfc2b49a1dca3cb24aed0af3e8eedb78d78821861dc4c480af97ad35aa4da3fbd9bec69c5fd5c6fe8786aff77d2ca29f3992f87a2285a5ec7d1c5424ed0ad92611adacb472659b44e2db26d10babe6cc85f10fdde6f83f4996659b44b649d44d23813b855eacd959cbaeec7d1cec7d1c82ec7d1cf0f566780addc42565ba9b0799eeeea6e14110babbd291465d62e5c9f8938a9020d45c0f1534d7434a7323a8d1dc083331cdf1b0f1e8e64420a239118234b70389e67678733aa0e074e43457934597686668667600496107023a89233956142145036ac4b084088898f095617b018c154f5041c5131ce8a691a28a6e1a273610451354503185145140f144378d13dd344d74d368e9a6d140374d06ba6930c0bdc6702f303417e8a65982468917182f2ddd48a11dc379e5057b4971eee5bd84747b51dcf33c0db0836e6fe6ba397106c8a2862e2dd144c98952144d93848fa612032a6674fb2c53ffc0042e20c6a9a830a54b19e0a810a552292f895ef24517702d74392431e37218bbfd8b2591399cba48c674c87fe69ad246ff486735b2746e0a14dd0de371efc5295670ec2f3745ca14af671c0e26f059ec96290eef1e0b9c32c55154c03c6bd365773a3ec2d54e9f13c83d6c43b2a4b376b163fc21be39f9d7fc6be3e471ef2f256d99ce9acf1b0cc855b42a5118f3b8370b33ad619c6f29ce9495f9f45ad26879be406fe26496e98f6a9277e6faee2539be4fa2c4fb36dfc6e9a8da4c2c2f19c53d7c29fe1a0cb3dca35191a278dca372eb79d1fa80537cb0a5dda44e9e6def37f53f2aafe3386354b4348f59a702fe2c9c3ee014af45a17b182427d1670b2596c402e9486d25cf9c214dfa4a3de55f55f98b367c1d60652b5b283f45dc100fff6cf61ffc6407dc932c50fe656c594faef41329fd2405ce063036a080b30109ce861c3aff751467c34edb2080af42b18a0c3e529dd1ed9f6d1241d1aa2054334ee5eaf6cf05c7fe7d15da529d542570426c74b77f98ca14210f74b7cd294e8886eef62fa77aa17b17ab583c3640443c464199ce329d4e6e4e20ceb62f8baa2ac808cac366cf0ce580b80072a2dbc3b5c7e7220a4c38d315dd343574774dd35800db95f89ecdfea3f2594efd65e13c91dc9b8ea188f5285b965de129442b8d5e365962056279b711c4df874b7babb7f1a9ec47da977eab739c59fc1b8ace7219dec4ac47058c15d51fb24d22708ad3db384e6cadcc79fc65d3e6974db286e78fb091de60572f9b2cbb32ca76c5cde0a35aeae3840d5a918c38275abadba7385fe85b6077a39a73427ef9b77186ff06714e5c68f1fbc23501e361637477acb92643dddcce986e5ceef04e583b3355d0ec74f74c051a566212767874977ac031814017f11e7a70f1bd8913efa107bf3961eafddf181ec7e9f37a79781c27acc4adc38a0fecaf846f8693a18c0c626450c39bf8383f47cd88e16418298084873f69fe187e928b3f71aed4b2808efefb422a7e3d12c5bf254b7c2e06bb04067086a710e8a8e9ddc0a0e3b75b3ecdd4d36866d92651ccde9c3c77c191bc0082d7e67006d52f672ef740f1667bf2f1ecf1c447026f6260bd4d3c6f8f74f29b0df577628b63e3b7ec4aac472cbbfa1136eb51507ebd5e383772142d4d7ca3daafca964e087412d0dd2d20d61225ad168dc590dcbb652379d2ae0d5aa2046323be4449abe532f76ca2c07ebc47b221c61336f31467780ad5f2c5d19ebc0fb7e03310db588d51bf39f9e37106b9072279a104c1f2badc03dfcbd88eb89c65b715046b1ea3e00dea04e2bf311b73fc98d6390be91d537926a3a3e39092168794e471e2dad9719ddc2791834e5c3bf869e2fc8b4b1d6236954beb56e6d9569bed71ef762ded69a94a7d42b1ac58a52a2f1de58137334fd1867672f7f093932897e4382bcdd6e7588634cb2649ce9f7d23b5f771a876e5f353ed2a87d6f52aebc2e27ff864eb6973153ed9d2810517a44777e74c6086e76c95391b03dc50c4d9ecd8e0d89c6c52b0e961c3c346846ed2fa0d0b27ff6e587047b1e01f691dc5829fdc3f14762a535a28836bc18b6eff6e4eaf7973a5df4b9c3f7bd186dc0a5bb8155a708de3f4c1d436896c93c89f465dde0dccfe7530f494eb80270743b094d1184da2378734633a52fc30a01e9e1ed9bc9f34dd430ae985f1c82af5c9788ea8986d6fda8c3fa44fb3db3c5dfc9c8ae5e4e8e009826ef309e5592769fd4c6b56c83d4c478c6ab977832fccbaf8361abb9136966dad51c015a8935a815f6789025fd58237d3b34d3d553a47d26f77624bde273d46fd26366f2ef76e13c9de9755b0058239e02da37ccd519816b9070ab96a58010dbd5c2b20a21a805aaf5591cae57364e46aad8a7c5e46403fab23b0f498957deaa3b8178bd9d4fc286eb40aa787635626fe58b3152955a90d53135bf296e4ed4e7c3f499c3e6ff0f87f7d3a9e390a877446ce2bb399bcddb0d202f010d1ee67cfd7ce7039c62a95553ac26853e6d7c65c45ab32fc96abe0de915cff2bcd8a75de1c3b3ef56c4fd2192ecd84a0b59ce59904060320f1903e8c1b4286f723681a1950ff9a33c174165a1288260c4ffc1d9cc92d7f6ce21b2681a1f41875265faddf604e4b0243e978ce88e8eed91c9008701d190d663bb640c7d7e338305eaa529c31dbfab0d9934a650be52f2b96c4c2d7fb6040924a3d8c0332c4fd3001f7630aee8796eee67eacf02348b77fddfdfa5be2a72ff64c1be922ed9d4213a087b490f6d140fa4797d024748f223a4637cccc703333a49592068c8ea0610a397e0540a52454ca192b76788cac200a1bbcb91a258e4cc067a4580117194c53ce1b33538a08c04700bb1b498321a3892045388d949ec9f2c509424960b81a214490c4063e4840c90c453485992c5f74e16aaae0a000483a4447886c516688ea012a02ecb0e9191370310a6968ae860e99c9f245090c5773244408089321d880e4e940bad100cd980c14e00757e342095c8dfb1881c8ea32d15ccd092488c0a347ea4644136faea64796d902da0d0f8ccd52a15921c7278ceeee1ee20caabbc56e1c7e10a40a0dcd95c804377819a179704878680e09d91c12b13924539a43c26a0e8950734868680e890cddeda36b009c8e68ee84a5b9d36dee74d4dc8949732754770b216282079a332189e64cb8d29c0923abbb7d98482841473747421862736148692e8c55736130692e0c9ce6c260a1b93050682e0c1ecd7581a3b92e3c68ae8b0d9aeb6246735dbc34d7c58be6ba64d15c17269aebd280e6ba08d15c171e9ac32475917486593fce90d659f8ae9186b5b43e3fb39016da706ee410ab1704b568ab38edd85d5222090b5400caad0300d86d45f2f6edd0e96e2adda120a643618c0e852e1d0a18a732256dd8a150e4c806d45da280f822909a1c744418d0e38748648a5653b19bd411396affbeaf3be188eefe1212e304241081234a4604d14800020f28c201a5062880e60025069416d07d73aa2962c8986e24dd0d61a2bb1b92d30d39754352e86e17ba1332a6bb6f4e3727dbdf9c50379d90d907bafb87eeba18e0ebe18c239d25e8eeb2bbee84413c613b7426b0bb33b1d0dd9e37d25c8e3497df87d35d10a17e8c64adab4b39219d6109a7034244770744a803524207e4ceba1f23e86e9bef7bd91489eff9fd5c5a7722aac28702fafd5ae79d5130c644ee5d9b72af52599d620572140bc8036f588e529d40f74a4115c80253fe61bf819ddcc395facd3c91f771aaca3d679d30fd3e1cc3344f0cb2404f8d9407f5e5cda0f8b47b23c551af13f835292078f3729494138841bf36466b98ffc9a3598f1edbd12757fcf6077f15daca944687b08fbd8f83ab3e593423801788d1de0de6ff313abe68f30dd14908f4d4ec013de5ded76b3f10f494ff056f6e884e428eea7194387f7602fda321553afadc40e4f87ee80e816ef22684ed0da29b59015f4f4912ce48d2e88b92134bd746c0c1cd1104ec5efd71af89e78940a0bfac66c54a6bf67a36463e1def7c10a372a5d36dbedad40d968ac5ac4db5977459a5792651158b87c7ad1882d843c019020a2b30dd4d3617c70edd294e0839e8c62ce8c462761c674c08a7eef6af39d0ddb53938a248a5b27501a00c1825ca885d90a941f7b5f70229a0bb6f73647e96e08290c50e1e8cf63e8cf644a3b5acfbb5e2bf416f802127ed8df08da12fa0c84192c2a3b564ea0d21f9f5d4bb02409840372527ad7c1f63c4748fe9625228e37c232549df37c798d267fa832d1a5fefc5f9808cee15e641f282e883246a3e187d20d4ed1faa847d1fc647ed0506557a10c7e732d32856465910af1e2471f13f4ab62b3c8ed3a71efd65f58321427bb85a7fd8bc258fcc7bf790aead15c0bd3b4972fa9123b3f63deee1197076d0f3b4b9128570838999aa748cc5446b6b18471e548e597fcce31e069db87644704eff1263ca0396e17c6c51a0ed57e04867ccaf7ba328529a8fe38cd566e1e441b28e6d441e1abac30c09d3034c0ec0ace1df8d7f27f7cfa9f837050727633a64c20198ee1496cd04000738d5031b5edc60fc6283310d470fdd3dd3830d6aba7be6f9c3c6c5b566eb137cbd7c3fa9891a2400d53335106b40430d96b8cdfe7969540313d608b3c6083cc7b41641f1ee357237598f320de948da80d648a2c23c2125ad2b7f4b56e948e775d1a00d914ed6f8493f445a170d92ba6dacd24e428d2e24506388a6080b92e8eed4ede69202ba4b09e8ee9a5296d2104f6fee346669e45012a2bbeb57b17f83bc5889642dcbaeb25df51b221022828692ee4ee51958e9f6cfc6aa6a064e3a08dfc229fb212cfeebb52a52b58c80a0bc806ae0312a72b55eaf0f5fcfc66cac529c970c86fa5bc18c6e9a146210b365da0be3fbf4de092bd2dd3f9a834107835277a3d09c193968bf7f513e48d385af67c6c90c1b3352e8d6e2890b8871c7d72b03a90c270d45052e20c68bac80582c1e2137028202b4f29fa1a322a196b754422ef7fcda187867244d145fa49da91c1956705e48c2d2dd5dbad25a1dd9f092c24364ab5f4b5fe2f7b5408e16fcc08a656b2648b66289bb8a167423857684bdecda5cf95aa25855e52041f2426d1a892adb8b75963615bb4995a66237c928c808ca0c4fa1202328792cc9796b2b1800396fcd6dc69385ff836e46b71be80c22bac56876e1fa48d3f5d848b4e1dfc499ebb7c44f4199829f6e2cd6c763983e8bf38dacf7b35c837b5f1b615456cba097cd77af662b12121d6beec5acd3bee618e797dd49ef4cc24398c8478a7b37e338a9ebdc4ccb1b100625481cc923cd11f6c43d8c8faa0a29b443f83fa8956b76a8d5b22b71f6cc9e37ba9f34c2663d0a12ebb78eba69c61202faef0346d0a5bb69a1ed25d6c7277801770215e017c17023f638cf87e5db3941342db48dc00a1b3680a37480ee9eb122042e4e74dfc61c72664ca3f9ffc69afbe2f4858f2f52349a440e384a5b8ee81f61305a6340e2e5a460a20861705b58e8ee9417a417d30b17bfa5705db00185eb6288eb228748921360a03201213f4177370a615e1021071d38a0074a0dbabb878ede5103a561186341cc6c02c0d494910289110c00c42354c1c1a1224698729c7a4036808a6e1774370e4074e1c5c6853882d4506201a6fdc30204fef5e01f163ffe61e1a3dbbf2bce68ffae80c2d62b48ffae48826f8f14822f2110bb3b0e102ca01b042b7c208bfe80d0077cb47f1e30c3035ada3f0f2ce9ee0019dd8122bafbc57560a7db3f32382b462b503d72608c7f1c20e2c58115ba0a30b3e6aab055b1a4fddbc097ee0d14e1df0686dabf0d10a1e20cffa880c2c6a8d899824cfbf79a020c1d9a9b823545104e0a32fc93e2886effa458a1fbc545914547c18a4200fe7150a80145b77f64b77f1c144bbafd83a2c63ffc840afc7b0209fff013a8ee76828c7f4e2c003be1f2af09315c13593471a5dbbf1d5ab8269234a74505ddb9246dfdc4d933c71c73d4cc90e00225ba4af70e7d460690d08095eeb6ab1a0ad41fbd89132767f8aa7dad198367c6886362d65de2f17ad15624a9a737a748dc610656e8d6498dd35e9a545f84d20e0ccc98888309369830c187c4d3d1f17452e127e9d84273444da94433c30677811ebafb06dded43734bb4d15d9ae96e1e64ca3a456e899c76fb333c48284a68d1ddfeaad9ea54a6dc608e23e2f9a58ac5436ff6feda1a8ae23287f34f1ee847dcfdc35fd6b23fb6a969f330cf7702b98794a3e3797ed7e63a2ba55931272747279593a3e3b659765a893ff131acc49f7210836eeffc5ae41e9ee1ebbd5e111042b7ac84f9f48a403bf398751a1bcb98cd8e2758a9cf04a0bb939a3ba28a54aa68e627e28c40a23be349915adddda4392358dd5da48733c2877fa5c841608b96552afe87a3ad8f642facf6b59f4fbb85379cc5f96124795a3cf2b887e944d14f12e964fd07b93c6c3326291d49da04419256c2dcb6dcc318974c6e5c70261fe447dc05ff8fbd4edec4499a5ff947263724cda7709ce1ab89e71f7170282ae3f28220e89eff0d49f3c971ea36d6f2a656a0cf6aa9ecaf574bdae9363b0882d85a2324cd97261901c709fab5b14cc792c6e37f6d48d2ae90acd26ca1fc20857688c593e948b6c43bc53a738be6079a2bddbd4373315a378d0c3cc4df41c75d701d40670252df711d40b0c5620df98e53b0487c1e91f6609fb1759f857d5e56a751b6630b7bccba0a4d1cc4711074cf9bf6e6bf3a9e722639b8054be5d8e4e88814766f52b0129f46073222d677231497b694d15c5ab2ccf5ef8cb9c59ecb221128db159eacaa62054e9620d12977beefb64677fba28bd49aadf1514342111566dddd4e687cbddb23bdc6195a277a8a06d0c820d0d996d4f4e81ec7f942b2a4a53d8d8a7fff052848a0d042296518e5165a684be5cf36a987a0820ee3d05d2554349beb9cb15e2fffecf7e191cefc3f1f36d146743ba881af777f16e649434002ba1dc0ce8edd0e3cdab661cdb0665c4f0855a1855000b410daa385d020426ec2167233d4426e92747710213eb485f83869213e3c5a480f0d5a48cf095a48cf132da4a7012da4274a0be981a185f4b860e331f41019ed21ba2fa33dae719cb4d6bd41ae4a69627729ca0d4a3628b1d15daac1d3662dadd15da2811adda53468b8e0ffd804c699ebac7d12957597d098c119d7e6fb25198ce30c63509292f18bdd345b1ae7120cfa3e35a3bb5446774902dda517b8808c4e871c09d4b480041e9e351faf14e8ab5d79a5d786e284d1a1eea62e5015684d76947f347b63677477778bd0dd0c8c9915ed9f9dd51c3563402e6d3733c04cd5ed1f0a5f8f9ce27c7532b0c14a5faf3a4330a6466c8ca236fcc3e411be5f6b69c4b2fd6a26013341b060860122c696ac2ff22b89c0021874ba3fd23ff663b315bb505818c90b4740b77fc2226a65dbaf3ed31f5c4355cd0b24aa78c46a7b2a25bafd137cfb27b77f22de591371aea5c5980ed9d80c4fa15c5f28db7e8569a1143c85700fc65f3fcf21a36cfbd538d2d9ad3f84438a2bc58fe7cc368944550e7db2ed7f24e97559d7c726ae47f8f64f5478b4b6171fdb118b63ab067c6dd07df16b9685e705b2fd0aff643be2a719d3a18ce790acbbb40215a4600c31be784141185dba7482ee9209ba4b25e82e81512241abc4faa451aeb7ec7218d24d6143e5c5a8e3a7168fa2ea4745ef8b28d1e6963ddedf49629687c54fa22cb1da1e0f299c30d82d749bf1cc769569d47fb4a929ffac8a524649c1deaf92f3c4a05707417184d1fb359ce991233f2a8f5937921f1ba1b4fb1676cad87a37a83c4ffedd5a6e5bd6ba3a160edddfe702b2b1aa2ac2938e2f5a22fc1f94bf35c2e667bb420aed50be769c47375f4bbe7044da489efcadfbdfc2e548deb2752b7b846c40ff337fb4a34f7db2c8a7f62b927685de25fe1b2149fa3e5a28a51b1a3314a669a16dc83514c3900a6efb2756bafba5b3a49b4812dd3e565deaacf44c962f807ca0fb08866e214c46c441c487f6647ecc518930f2faf121e90a0006554516564638c1a5862949078a084202104400396105338ee0843b84142105183a2cc1a140091129f0a1552105093a2136ba779c7eb9c38baff0934a1b681a09744252babd70c6629dd04efb77857cd0d8743578a981033534d1dd2eab34ace5cd8ec2e338439c2036ae084aa2f1f5be2fd50551099ad219d7d21ab5a868254a5394a488c58a6acfebf562a9627f59f7937e857b8648970aa2bbc5daaf6e309b3d9cf11ce9bc798e344f54aa5a5a5fbc964ce5d88f36d323f96f47fcce98e3e937e2b527c7f326633ad6798295d8718d8d7346c7597ae2cded84c517451ecfab5e6a8e25ede6e39e97edea966b697b6097467b91781cc7e9e3e4eb4e813e1de636b9fe8fbbe02549f24f21f1bf1397962625497227297f2169c8bd6a51a2caedaa06c84905dded93bf25be85f1b48c7eba2f04dd2704f6f0389368778e3c9ef8b396955a7cdfaf8de1e0fb48b3e6b9cef20677d523ef31be5199689b441eadbc393908d24ad15f366177ca7c8e34d60a62a9fc5a2769a5e8aba2960d181cbf0f043df6e2a7608e2aeb9c13693acaaeecaa1eadec8f75c92a9d65bb9a3de3580689780a65bb22f3d3dd50d1dd5d122c5d1225deed915c7050543d7973ddfe09385fd582b747b2c17816529aad36fcf1be5829ce2b7cfb277675fb273c76d5e93869d005c6dae80e53c60badc8ea7ee3c74c00ba9c24bd442715d2fcb414897188003b1c237c3d1ccf072f7b523aefa7c799edc97d7cff40d08776281a3a14aa43a1bafd6bccf397751b478ad41d39c18f11bac728f2040a205e6cd071c3d6dd1d845aa182ee6e1e31cca0f86102102001e8dc20eace8d9eeedc48d29d1b2d74e74690eeda28d35d1b39e8ae8d32ba6b8304ddb5b181eeda58a2bb36b074d7860eddb5c10a32a401d00109e2440430a40538ca36c1f16d8263a84d70c8d026388ab4090e1f6d2ad3469bcab0a04d6544d0a6321f68531926da54c6016d2af3439bcad03695c1a14d6582da540686369551a14d654a6d22c383369129830c176d2233459bc854a04d64b0b4890cac4d6476da440605225d778400ba3ba2a63b2378d09d1132e8ce882edd1961059020270081499b80706a1310506813104468d31820b4698c0dda34e64b9bc684a04d6390e86e1357c484128876343724a6b921349a1b324173434d3437d480e6866ccd0dd1e68672686e68d5dc104f7343495228120002082085165448410718dde968a23b1d0ae84e870edde978d29d8e9cee7408e9aee68dee6a5cd05d8d16ddd528d15dcd0fddd5c0baabd9e9ae8600dd9584d05d498dee4a22e8ae444577ffe0ba20123417b44473410b682e08371704361754030f1f5958d05d96137497258beeb258d15d160d74970502dd65c1d25d96dc5d96ef2e4b01bacb724377596ae8ee127c002181041e4450e8b084a03b2c1ae80e0b04bac32244775892bac3227687e5a83b2caaeeb0c8d01d16af3b2c46bac332a4bb2b737477654c775770d0dd95167477c54b7757b6e8eeca14dd5d31a2bb2bb6eeaebcbabbb2eaee20266e881334370417cd0dd181e68660a2b9211cd0dc103f343704adbb83f87c69cea78be67cac68ce8789e67c8a68cec736820f93194bba3303a73b3356e8ce0c0074674609dd9521477765eca0bb3268d05d192ee8ae8c1274578616dd95d181eeca60a2bb328ce8ee8e840e052236438694f0230827c65177620875274693eec4b0e94e0c21dd7d79a3bb2f33e8ee0b97eebe3cd1dd9722bafb42bbfb0276f7e549775f60e8ee0b0bdd7d39a1bb2f40bafbc2a33b2f3fe8ce0b0ebaf31283eebc8cd19d172fbaf34245775e2cd09d170674e72577e745ecce8b51775e68e8ce4b9246a1738283ee9c8cd19d132d76cc5081e66608a2b919c8e666d0a1b91970686e861b9a9be1497333d0f083b3d2a33920e6680e88379a03024c7340c8a03920c628d5f0280901226689e6c424a03931b73931617362581c8f1d1ddd31f941774ccee88e0919dd31016304127a744a88ba53f2d39d1226dd29c1e94e090bdd292140774abaee94ece82e491cdd2521d35d1231dd25b9417749cee8ee2e4827654977528c742785eb4eca8eeea2e4a0bb7df8e02107cdf1b045733cacd11c0f2e688e87309ae38104dd5d0207a46b42a7bb268c74d70490ee9a98e94ecb1bdd69d941775a6ed09d961674a7654b775aa8e84e8b05bad39280eeb4f0d09d16a401fc2801480f1ea61c94d0a63062da14064c9bc2ac1166056d0a03469bc260d1a63053b4298c05da1486016d0af3439bc2e43685d1a14d61c0368591d2a630ac36857122a4041f417c943968ae7c4173a518cd955f34575ed15c2945736512cd950b68aeb4d25c999b2ba50039811b92460fda94860dda94c60bda94869736a5018236a5f1449bd288409bd208a24d69d0da94c68bc8109c9bc33934875bcd6127cde1244146e0f103003e82f8e0c185076de292469bb88cd1262e5eb489cb06dac4454b9bb848a04d5c1ad0262eb6367109dbc4e5a84d5c7cdac4e5a64d5c4e68131712dab4458e366df1419bb6acd1a62d2b68d31612b4690b166dda22459bb628d1a62d1168d31622769cd0e950d19d8e13dde950a03b9d20bad349e281460c9a432305689ca03934ba28a1336aa13ba31fddddf0467737f0a0bb1bd6e8ee86177417a9cca864d467eaa6850a91080000000000b31000303824188bc582d1805846a5f901140002609662aa624617894914a314420618038001000003000000834309920a57e5639f5b9345ffedd4cd68d6c0c19b77c8486438460023d037399665f13586fd89bafe7725a66221bb533374af2a36ca09872ee5509e6a6a6f3dffa874a5b882903e1f1321fe13f0c3740f129b618bc3c26748f93dca8515badd9a1e3c6d86e3a5d7f418c0179c25a6e37782e3ed2e430576cc74662500d984e006be07a1303b1a5e717515aba0b07ba46d37869e1302c41fbbbcb518c52dcef09e4a0f2845f392ad5da7d69a53244c7f867ac283be38fd37ad44ba7834423826600241d7c80e09c31bdbbd2cf9e81c99139ab1c0e3d260c5851617b96aa4abdd44fb71b66f204d3fc2127c534a688cb97a6c09a522833496f39ef1ce1ab887b90bbf0dabc57897a3bd2ffbdf08e3afd408a7f3f150d9c399de27a1c289a9d174e9940d4f447f4f325c471aa6a672a65d945ae4926f75a148feb47b70db0cae3980b1a162b7e172de00a9c983a65fa3b2260271925103a7e4b10e184e0aeeeecb814bcfc8c59d735940448efa8b0e52dd75e39cfb75503e7e3dc586ca985f2c3fb1dbcd965b4de979d108fc7d83dceb911da33ec72ab947640c1bb11f3712117a53f4fbf57d43406b1f6aa4905c1c294bf7bd502b784c9f303dc5f485cba169264f76cef16a86fca14030ba77e20eb58d286ab86f067a603955f8b58b130871eb21f5ea43c2f951f55b0791ee2661478fe59037932e704a0110815f51175a0a68ed83bb0c5f0e39d9d32977b42182db6437fd074590b996a7bd4c87921fe25aec31199a0f8d8ccc0f537f4f8b1324ba7b8befc89f5322e58fc2d4e425e3fc8746314399859a4bd734b822a2f547706d66e1caf1bff456aafe69aa7666c6513d186db0fd77e82b0da53044ce7ce25fb821e1c736d2c83838a2ffba7b3e86aea173bc126ea2fb0cdb42b7f01b785aeff613f75782ee11235d80dc1b137017548f673e6ce49bcd3fa16fb6c66b9afcd2c0c1ef9f7fd789ff09d91b42f6ba4c39c4fd7d37dd71705125df42db4f41c8e43350897ac2ade1e130eedd35f9e56a19605bb0db89b351e22f68482613d8228141bd8fb307f12ec1fc671a8df1940ac5ed2b35d7c362ea4aabc7c96109f066ab7673c77861eb4663bb848276c47b475bc9376a77da5718a558c82e81d5a7b9df5b915270e615eb0759abc8245d7d4ef8f8153953d3c1b0df03c598ffcabc085fb59667d66cc27e5a12d392c0d9097514f6aff3e62b21baab6a54871b1df3f32aea491704deae14880738cb28313f4de3e9fe7c6c79c2337b0265f957393f2ed6392f6848fb95ca41ce8c90bdeeb9278cfa77e3dabb152761065346e9ad6e338d1834eccf5ac79f3c753c4393e7afd7cee93e4ad1649a3511ef13e45cc947b753bffdf35d23936453d3ed1694878cb1fc0997e844565ac1a97905a4003327f25041fde0d93aed8e0cf059045d626240136ec9c12c7342e166590a2fdef08636f3854d333bd1088c90e9a2d106278b12719ed49d252d5136441a91ff58fc255f502f141bf4fc344e0942c20b22a6bfb18d8c83f67b704ca8bbf17a487a86bc878e042c67eb98ba062615506ae546087d4c6f324aae086ea46e2a1a49a40be43d32c6c21c53dc573c3b2db0f0b02cbaf7b8ff101f57830311a5b250794ff5e6cbdb181932bf1ead39dc1356aa8a3432d53b78a4079c866a3a5eaa29fad82506c0fccf832d5a77fe9332dc9bc1220d57fbfbe6b4b5bb34e23cf63836144b799c160fe9c201e9e650f7e0a936b7bca9ed598f28564460bdd06e185a20cab05027956f3e7ed54acb0e57abf5f652210a7c49259e4951c6d45faaeebd77de7d92a453a09e42d4a39a84f88282dcd24a420d9bdaa1467f6915cab897d6d3b31e18d92c8091576c845ba2a32aeb1ba9c91cd45c556a550e22970230b385cf0bc527c010809e8816b89fbccd9df7f9ae06dbd09f344c6444fec1d8535372beec2c3760ba7b19d16371d945600066b72e313405b57515eed30238642f23ada7328fee909451724371a3b62e82be51a8672c7164f0a0a1391d41d441bc69bc6c1a244187965be29f180674d19e1912f04591260008421a66f9da636bf74c600fb5cae2056c0793c192fd43dc906f1bf1f8e5e4e3c65c640599223f08cd6e2da729989bb72fd697de8c12ec21d9c92a1afe53384b4d8d3fd173931c4ccb8338f19c777cd46437cc0b501fe3e61fd20fbee96efd0c5fdd28849e2594554b125eb44268194ab3310ff3af6ef78e1ad01da6374b719471ca87a5d0d839ffff5de11c0f7cb0f2dbe1c4c021ef2047b699a02426ee774c6162eb0ee0c7aaef16d512c19dd07783561077bb59cf45a15e7217876a80df76bb804716ee097302cd7ff464a597436d73fb0443196b360d4975a9979e39be158f19f0f8f947fe178f4ce6884483e66012b1aabfabadcc6dea260f4a270e906f30702109d02d5cd85bf5fd4bd96ff6dae244dfed366316cb4f9a3e90bd259c6cc2e4b699c244a38c6e26c10fa8f3b8922c4645358e2299c72be95c33251f10dd21517dac1890b4a40546dfc42ff66ec594709a5f060ff76c3c8a07ee25c4f6610a6fe2bd547406e45062d4a746b4346acfe450bf73f00db7974b486703ed40577a8450a598b98f64467aff72f77858464fda8e8ea7e09f578e9827fb905894898b1d40fb6130cf068fa87b4bf38220e397217afaeea9bdd51c15a5af22e1920aaf0ed12572ca55aeccd73818ac8862883f3aaf7bb84845da66c9ef0925dfba00110b3940c229efa20fc6505465a12409c458a4ba22912e17e532e29fe065336542e22bc0b140198154e7421354302f0dcc841ef2d8ad31457716b063c6f8755586ed9976ea30a3ceec25b3b52b3be0ace68ee80c6e4bbbf84e677c4fe700805d3c964a67e8c27c9372827b161a5d8b9191e262a962354d1c0f7d683b6e58d671a891c1df22fa023a8a0849fa597e1036f759058e5c8ff6758b9a215fd110ad6b8458f84aea9b57ce6a480bec8f8198087ff005f2dfd751ff3de033b73279a89d30f1ff297efc2a3bc9cd49469f48114e03e7c77e7ad71bc7dcf7a80a26afff58b6f53746f02da1a28d3b337aba9ee9b0a46ee74c8302963204c8bc9ef9c05690bda8d12f127701a9380866d700d08e34e6665e2cea264801adfcdaf769fce3bac75dcfde455dcf5fb5542355cb8306ddee4f33e6a5b466042c77b06abbcaa192dc6a02d7e39d75beae96d9a1c716894e9014b65b899fc872f812d8dc392d9e7a64a89aa56ddf1f4b8e9fdbc123093a21140af728907e70b5ad054fb944c887147aac51f02eb3566e6afd790682f7e055fb30d482273e32a1fcaa6567e1cea4f0de82cfb2b8e7fe2f743faa296570e32d539cb14f92b9e0d1f6d255ea44437e7268ac0ac69286509ac56b8ae2b99a2cd80b2559a2f085c41318a1cca84a6efd19b1cb07420bb83ff4f9b36b0f34edc340ece18cc316b258efe83c2bde118f7fedf3d77e2372e1b6236edb9faf25321fbaab3a1907ab68eff2c9dd12e3d577c639c3888bb9fa231ce5979ce4f1e34adb3d443fb7530120bfd0f63acbbd2da09c95d428356b83b0cff5b3af0c9718871b9bfab2ce575b71d1838efa0c50bcb414063e60fc02b7c70b127875f47ed461cbd14dc8c9d6c7a63a2c93b0aac4168f41feebeabdfe7839e9638fb401c0989c5bbc02061ae81e6ac4b2804fa61b430f6f40724857c04443df436e0008681b87d516d6bb8dac5c9cd9fe10fbc2b87cf63587ef2d53164f4b39248403673e462b7dff7baec28718eb5657734463bf28c7564577fc9f6dd112e8d5d7e13f4f799d2653bdfe29750142bd00861a0029cd3e9b710897688c04ebe3ec1016357d9b9c6c65229c1677fbc73a2db1175cd1dd1fdc73339ad395e18e0e0c7fdb48c798d19a6d550cbd8c1fb46d1e6e3c660dbdcbcc0b88885c13b8daf943f2dbf9e5beb1646e8a84d6dfcb9f3b80fdaac7108d8101961cce1c05e2d9e4a9f30bc77414be2bf6b140dc476d346783f44b7a217cc308af379e021046da59e2973294c1d4518c0ff76b534d40938bba985c2eba946a95148129cf641b635b0594386e929201744ddfdacf2d66118fcf596f92a5ff4f00fe32226d89e6e6093bc0ef65670e00f6853b17ce1397a4c1a7fb6e80afa521f3d5538de30f9cbca0fd74842711b21c062f6d5c7f51ce866958ef6b4eb8e7cf2e035e6668ddee8a8e2e2ab0a2cddb205b49a49c54a7c9966b0df3b5f7d976d34498477b05480248ae8ac8800767cac3628d2fbd70744a3ab16e51f6a587f6798e67a949be389ce2253122e477f86885d957f94f7fb5692373346019dde302d3cc243a94495444a6f86dd9d835ff63ff2b84a24b580181b1f7bd95941638af3fc66a81b985dd04929e89369d9064fab54e320e1442c2b7581fe67ad04c2056904fdcd65816c4822cd5d8b529a278074abb23b978b7bae2b5c93be9b514416591d83ad789bbf2453b2312023c0691f5aaf55c2adbd2abac0185d9e78ad34c2722b09542c1612c5cdcc2324f770f63df1bbf775c616f26ea3cb42f8c4ad68e3c183a0f6884160f6fe5f011b09f6e04b9ce082c77fb323b542c3310ac4a89665c4b58a6f2747a71aeab644a87eee3655a56509d32ca144be292cf9a0e1e08f19028dc91aceb6fa66b6041f0880db4530e8c2bd80923a224828976ab0cbb3689402242ddc92d08374fd0bb75aff3c84bce5dd64b6215fe1353a93ce58eb9472a205e178afdc28c0c23c8431f11e789af69c47ed80e3404a71755cec1d2a43b081ace7bc3af160fe6396dd8f1072ce6399f27ba07592897fcc42ea25664e8e3a9176ce759f961413b4878d4431c97c008a21a080635d0ee98c4b4cca9eb84bed17c3fa8992b9887282528a69b479d8573cbe6c8b383f65074ba7344ad2ba06026599825119cf840b49cc30cfc6d0a8f9115ef95b3bd87c02c863c932ce4a382a3feab064839322c0affd334c05164e4758df06c883c4bd03f4c7fbb9d615d7d34751741b6d93ca8397b81d72ab52395a06e71437046f3ddb8bab175b4277375c09fcc610ad75770acfbc60a24fb72809f426f817a78e656bd4aaf1e6eeadd6756bdaf1b1d018c64972dd5182224b7307f8ca0b90305f01d4e3fba825f43eee83e0dc59c207668957caa025ec37f4b1e1100c59265d1b16e0a25634e4168cdbf3d37f063cb117a6ae893ca0b008eaaeff72e0791bc24d535979475215a2f3b16a326e5f6f895c99021e6204b31734a697ddefb0583fce0c45b6dc5b8ac0ed184b334f03ad735b12d9759f0a0c64d9a76d0dd6a827c67208861304bbba464ae923d9cfc813baad71ac471775ccea3646c92d9d6f36e729202086ff9829b3a845177ffd99b195a1fffc8a227c5729b78581e0dfe4febb39ab39f7746fdfa9b158e29c413dc2a4c13304475057bf596de5dca23c557eb607e5306df23e937b1d31daba48df9c04b800c7c8582793cca7e4103d7408bd544fb2f85515be12ccd7ddb387ba8aa1762079a2d0154ffcdbce93e989b016518a18fcc1a5409e258c28e494459d6b05386ecc019399b6c8c148c3823082bdf5df8415735ce863d6fb8df0875e316042cda95a2379620042cbb7483cb2ab79afbcf3dda6822ccdb0d1ffa0ef8ad836bd58d11badda7dc4104ea60d1b596be5ca9b21ec7caacbd60d99a4ab2adb39340fb428064f3066a03ed995fb2ca946011aea6ce84e849f517a3b340420d4324704e37f787db4e4c2c470635b321b7650c3e51ca6d23f8728d73b7a38db91d5bb4c5ea71dffe1866b3bad51fa0a64eccf7f7faba042543a0fa7c9cda84dad6ff59d9cfd0a938ab810d824e1d6b51a1355d418d34e06b03f47236579c4760af997bc7c5b2cc5e957afc055f5c01c0cda8aea679cb2f804a4ea757765ce07b6a73b2f239aa3c42b75c46d0f0c45464d3ecff48793b32363349e30f605abf19112e229aa80f55325e237a4465087179e846b12efb062e26527844f2c4f2a751c2cc1900d03f047516529509229552f4a9f7907101126b9d9391ee12c6efd716ee650bbc89635b5a795809ba0c46308c542d53f839046b37fb1406f41d29e32e852e80a0b4f1d510222391b49dc88d9f1e64c04d8baf08de9f2190a572b6c84646ba81f54beed944d7baa34d49c229adf095c21f3907f0f9fb5cc9a120ea13ff7c4131e95aaef687215bec1c22eaff2472ce9b359e97e1584ae87f7b3a2ef8b2076ca758d71f3d24cd905eac2cbbe6e61691ba36a5c48474402256272cda11cfbf4d3e4f1c404f32a8fa6e738d4e4702214e435ad19921a1dec233b04ef658e8fef41d1e5d190ca82c23a87b63f2219d9d9f46b4fc03c1ab04380404bd1253dc4c50f6241c19bb31250af81f34328f7a1faf05fa7f1c03f96d1683fdec3034c830c4f065d131d681c518f7b8f2604411fcc0b3f508fdbd12da81235384c7d9d6821394845e0590dd87ef9ac8749970170c29e080b8e5e6819309ccd39febe47ed6719c4e6ba0995a49a4668991f721029f43f6dfcdb4fe7f1408cf2d254fe170ed05ac3a601f67bf62fb43aa0b5b3ee30267477cbd87f6f6fae6f0d96d9119e1fc477b5f98ef527a3199ee3c552acf0e84b7faad82f2bba08970ef19293c8074b992932fe43d5ee869e439c6d921ceef4ee781721542f109aab0f6eaa47a963ac60d4cde780eaf981045f3310a8d96a77fdd143e8a727fb81fd150dd0bea9ac61e5eb26f0789ae33f790c190166df3185e18c1ef2f674f3af889882f1412a6526e58359721d1ea1dfe7ce5db767883b1adfce51e1206048d20be77504edf970447885ba51f966b4f2bdfe3b778b7f63f0699c70ff9fcf6967ed1e17c35e81cd2cc15afbfff1ff61fe2bd44183e7f5237e9299e45da4590ab5a04fa4c9cbc7371b3236ed30abfef3e3c0ebf77794adaaf40bc173d1f07b30e01f7cf9fca94fac0437cdaa9b77ff44e3452f4f4b2d3d9363a1c11c3c3b48e723f846ca3bb1c5cd62943bf6e67708e1512cee5dcc343c909d8d3450cf458c278e70d1e6ed1737d2285e046e53909405bf0ca730546839918ec6d97f20f821f367fb9e4cdeb562b798e39c214e7ff3fa4a59f131d6beb4dcf8f1867d21b6f8c95d4e3a2b51ac39541d431cb074e6503cc2ba1598d5ddb827860b6e72d93e9f6700d5d1157bfaaf2c0677db5c538c079c7f683d02f8932439c5fc74c88424b1fd3787e3fc6cff73147196ccb21504dafd2360755d8b14f778b0b3509e3be00eaf9352e29b166485571ef314d5f829a5f6342b177ce9c7e738aab7b0bc5ff1b95783e340198b79491bf9a224311780bf4d881cf9ef2d8cb45d1fb461fec0570adf17ffa0d9c4f5f5ec71ea09790aaaf5fc0edade74633b3aa0e67ae07dc8397390cd3e7cc59e6fc71909f9465cf89dc2316f80bbf8771bf76e1db6036d6e89c63ba634e286a52178cd4286e73100fb8359995098ae0225e3bb3c538f31f893356b1162256f70ad777c5b5676b0046b4d42a969335dcf454eff6023fbdbc9806e6c51c67964990c0ca6c8b07acbd111d714065146c70791d7ae7a651be353bf57d06b8d777384bcc8da3ec3b8bbb65546bd9b619caf0be9c04b7f3c38445ca7ebf40841f5e824f9bb90418dda334179ed9398c7a983ff837a4a0b55167ce43fea1decc079b061f43f28c9c3f3b0606e7b130f4a1c626868a970e542a1c55abb6706f729fc8a4e97b1e4ecd4703bc50d64ff285fc1851644c4e6b1fc60c6fc50f4a26bc995a64cb568242fc403649fa3992e650035f7a5b35b43aa71c64ebcb09912ea4f0f4c9cd00a857fce4a43983e14b05f44ae0cb20ac484f866650ff78d72eeb2725a56e7d1a0a830f8df9beb640805b5dbd1058e2dc380c73d58dbbffd9beafede2c53909bc617672d2ae317fc402058571343bbe872824218daa8d55817fccb95b1e4b2daf8ece6b87579c8627f005b4a228843b2470d54947fcb7c03727ae4c30a88220c664e9d33c0e9748c9a80c5a39e438dff5e0dfd08d236a130f89c326081d914c343e08e15c3254d720225f92b9eaa61253cd19903e8e1f9f8d6f0bf587a8a20e6e0f11738a06f4b355e524cea79bb7d0d2fe64e41f5952eb406c95c2911a978b8bd788c1922401e6f4abed369cb46a329eebeb64ad8976632f384254825ee941477c44f174e4ed1c70be635cf4506e17e08d3222826e5cecf5bb5880d5d20e53e778ce73259254e0525c823393e063340f75e550b883e628d133e86dde5d40c13eb38a863fbad2220870959123deea5bac66937b41a2fe3468f403502ae8b03e27ce335cb305694a5fe7895277ae249bf00f9e2db224dac0a05120182f58773899d643bb5880f74c25afd12bd9afb8603aa4fccc95f324ae5f86d2b6e3a1aa017b002cabdbe25fe0d63f8191609d048e98bd60d81fa4d66a10e287b4f33d4593ea2e326a4f516c1321d9ddc008887fef067e4dbf0c141cd4ffe5a6951e3270a09762cbb78fc6b9b58795691fea4d478e2ceac866d0f9d350844ece0c159528aa622b37a85d247beac06787f5fde7ec14b8152b942615493523f15e53457516acd6c021e7c766ff7c6ea2871b64b50151b99304fde9f456d350ff2ab93dbe6aceae9b46f27f1c705c6349acdecc1153ca7aec9c831510c7b38afdcf29a94400c2b113ce6c32a68a28ac05ba34f5cefa54658c9350fc517f1f13f96320514d0d153f299e96d1b2e35589f1b2a06fa6b3d71d29c4d6c0aa58ea1e0ae910ce1b63f9dd7a16ba1c48a02272a306570e68c3ae0f9a09c7a6de9a19ebb95a5da0642c441720c806edcada3a01d94a653d5738c720d58417adb24edd350e2cb1daac54c13ab61774581168ffdddddba71012e3be3bc3f19c03549905076ebedc98121c77709c56ce0998ee387716db907904aaa2fbdcb8cf6a853a61d32cc3bb8ffe9d775505c1a6294e52b52d0d3121ba5db7a3d354fcf05e3422563e396cd6e1f2f91934e0d1db89e7f1ffe98b4a8c8e3ba53ca743e435a74959b4d77f826d69922815f2c6bc496e094cfc839dcabed12bf49804bbf454c487b66e660956295064a367b5995a36b415724ec88c0f11116e6ca55c77aa1c36188ac200b193bfacd48f431ada94ca6c8e103552f739913a7519836bcd252dd07d4fe819711471671416947d787c874ce9a58395c14f54151f9dea9350dbb9942ccd9309037c5ab1da2b1b1089d444c21abe0baf853bc349032303d744652ae10cb26ed5ecb61425be40b271fd82ca96961a10196fe35aa3917e919b0fd949795527a3b4b90bb30d3c290c4e99eb5872deb15034cb6fd02ad823b5c2aa9fdd12c7db8bd6308e0b33819b3f875f9e3f19fce17cd0dc6d5adeb8f64745f24f6f254c5ddb901f9dd5b958169298f67e5cbff44225a3ab692dd63cd451089c83d7a4f31a08edc726a793ca51e4c03af30691cea619a9892cf2a289934cee986aaabca466b1bd2348534dcd511c177ecc411fcf85498635a9615a9023b47e50a464142598a2638c73335a62fdfecff3f4b25924e755cf846e498c15fa48615ca330d363976bee0086b4e3441615ba41a9a5ed608ae054ecbad0e26239b8e2233540fa0cc8462ef68f8eeb14df7534c774c1c8abe51a93f818b34255c61ff2a01a3c0fdcd97f0c2b10f7fc1d86169edab7c2f6fed3af0f9e633eb7c5ce3b1be0a322f0f87b1383309de0635f89df4dc9205f7d37671e07e04411af2916c633453f24ec15cc9bc544fc78f7af699ebbb10ef9e7ea8be052800b7f56bb68257c4c407bf8b5d8b7bf15c19b51e573883937e35d2449f18584b84e21780754c901bf11d728da0870d7d7a45c2ae6715b612be868f90372e5e4054dcbe93391bd55f4413030c461af6ea964412deaa07db79dd709633d366caa91b46ecf4c30e7a410f94c2b83168778cb44b6f0c41ec8e18e7d0764c6f8e503b9e77610d639d08911fdee066a384550e30ebe38bc063a4babcad8c972a56f046a751c0c3336a393cd2083c04674a6aed22f04215b22afbf58e21c31be910c7d530235658780492f5677df8a5de7945a92ca078aadaf57217ac802b8604fae60ecfa544af7067be053dc8882c967dae3b61effba521c798d6cf7eaa192671bae3715b6a7922d8490ec23d8624454c1c059051022e805acc76bfb3f1fce0bf5de4f29b927fbe021b9e0891b18229c7200c07f85d065e4bed746fa94de0a25750fb5fe4283b57d7c7208b1db46b8635e20e35cdea4942caf0b611dde31e5ea3606ef99ce22fb33e734434f256c75a650da66dd7d9586e98510051d7a12ca72056459cf1346960e7433b604aafb0006a15a2084398affceede9c93994894a86a54bafe18a350bc6596ac7c5232c964e22557bf2f207a2c6c855211245b28fa84bc232d552bfb6505f73d96133c4925063402b766fa19534a0297a83c6307f0064f5f99222facc5d925f217c5ff5444c51d4ffdbd648d11b1974d15e3ccfc860744fca6cf86565dc9bcbe1a0d29812a2f36c85f859aa45fec0636d8400f359c9b0a8f4563af9ebb516b860076ff34d156ecc3e087888bccf8d17810d6eb8e0db8fc012a12ebf25e725091515645697918b96544bae6918cd633ab6c858619b085b6bd51027fbbc944e02671d8134cf7479cb50223ffd88d6d41914d3123fd089d6a5d012059732848bc96daa4599c17ca095c46f4162acbe175058c2e7ca89481447885817bf33f7815f13565fa325a5bddb2eac79903bd8e5e295b4ee20a961730b4c1190edb6e504ecba300d8005c40edbd6962e5f2691c8cd610f20a5f5b32a194b0d22f6d8f0d99ede2bc654859d1502df1f4ec45218aba9ec0a17a30a5b91324214cf16061e77c1ed3bb11fc16bf0ea46872173e139a8eaced493d5720630834e5c5b231d7d3fa9a78232cfb9fceac7e8d0b95285c08f0e66f070a59b4fa9f13cc6c8fddf2172eb127b696de14f5352922206b88334a0db78c55632866d07ef59e9d08e602b1e8d6d836b7b1a7238d72cce7b8ca11e29059c47c171759261078caef753368f41223a56fd3b48de1bb64c9ee3b07dbfc3c4843b5f08b77a425f1bb485c55465f537e13dcd5386f74c28a67970dd11b061a91c73c4fcc2677aa3795e0159d13a6ba914d4e50ddcb1c1bc4ee493e34635855d98f06ae360baf05993d501f965177e22957ea7cd481a4a7b95afd02574151cdb8c5d85e086eed1e14d6113a7e1eb528b1facf37220742c206999b5a15fd7e6277252c33d46646736aa7061ac4628734b59f82bf4435208cb87355ad2344a046546f5429d1018239150567d9a747b60e60b1d19f2f1fff55c17f67bc8ca6d50cc02da976afee6cad5585bc8c707f7fc9259ad80f120aef231b7558cb729a6fef71447e57b6aeddd6bc13e5f4f82d58f9fcaf5c7f58efcd5102e180a1dca2cf4806505ec56f2b2b05c5aa250f2eb28e04b3120c771ffee5aac0d397b362882d03840d3db913e03ac2fcc9406e7c80d6aeb9c4ce0a08be214db9b26fa7a09846ae903221c9c62072efec4cf7d31e4e862196f2636fe45a90fa017782574af6c7dcefe0f0d706178dad3a3c494c89a4ba1dc158a8c8dfc78f4b614d80190e32d7abaf9f9a20dc40deac5431d54bd6a5b730a183228cae2718bbb13cbd973a95ea07522184bbc18530767e2d2f3af3fb6b476258c40a48d263a75ef5d81dfc2e481e49b03c2f2d3fcf83f6b78e4f712a38b42ddedad4961df0fef1f7997c2ad00900604265280a7cf35457b7901d8fa466dc1e725c3d53b37f57f748b6063581edb2f77bf5ec7fbfa05cb3d8db5bf176a0834064851d57c4fc3982d124729e044fedadd181ebf035c22697588a8e9e25483db57a80cb35045c53e1402c86d6ffaf7946d0b5ad3fc63e1cbacbb479c8309b2ee17108de40fbb666d0a3c6e01035c4dbd0a0a47f55c31d62bbf7a532c1d1aa231d258c37bb767d068f6264174c328510ed359e58760753f2e749eb74eda7c9c2b289ca154362f4e6c0c07a03b98b55adac6bb8ff19740247556840af80eb4ecbea9d54989c22d2a62df40c0fb783ff247570fb5a3c2142ec055f4952c53d45d3aef2c2f6fa2b27e76da87302ef852a63ede2e5b58469166083020c06ce1b62788ae52bcb16fc29a71b6e256941af4b3bfe37417582fa5dfec3f71e6c736c3cc8d81abfc8cd273f129c825caab7eb1b0a263b241b525995f8c40b3a3ad1c7693fab5ca9e5aa2efab194e46992d6bd5b96e25bbf2ae16289f0a2c4a23c64fe4608d05f5d9bcda17c0427e1a5fad01662abf4808ecac568c60da63c267e0dee3a1d73a54922b1ce48ec8c75afc8ab0da93ffa8bb187aae57582f65b6a41e07f4f672cf08a70f21ac6f0f94e745c6402f11ae5638ccee29c477be216a0aceb4d5b743d70867e741393a89511ea205ae82bfc604c4062464a35fa02fb946374bfa6e469262ff396f1f76a12c9a87f86c83c7ac67e9e08598483618c43f66d837386380306d69cc4f5e7f5507cbfb26f00ef8811abba53fc9565a67fe46144f70b3709a24cb0b315d64a881c77476d6a579ab5d1f665d51814b1b2234ef81834cc4dfb430f4a343b48f92b36439ae497ee3504b41d860326a827bab02c98c03f1a8d58067f7106c023ccd460abc50ff2b12366d3f69bf8ca612a411ee50dc0ed1aae9b1574634bcb0ddc8ecc1159e9a70fa473c0bd89adf435155033313ea0677733aca31c73b19da001b2f24561cfa56a37a3e751d1c4105cc0936cb0aceca14c751d1019c9bc192b555485200f934049b15cd84979754d00c02b127f90664abc82cabb8b3968d7eb44657880098f328b150bc8a939a5ccb35c07c4d8b78a2ba56125589ba39ee19fc5ec290364d82c61950d4d1de5b8773c048ee304908c0fd11147d45aed9489d6bae3a97448fdd668af511067fd291cb8b1996744f89781f091ff65fdc1c09a789ef918acb25f7f060b109c6011196ee6720a825de760f06102fcf13ec750f61b51a97ed47c6ff3263ec682375c368ff280f72c4c8575e60c4f561bde4979df268db83f32988faad10ed7dd62a173dd23bd9d13ce67d66200439e313a7731fb66148ca665cc1df2d9d6eae3164a2a88b6e546f3b889ddefd9e91e1999ef1af21ef047bd7390d61b63b82b59ce503059ac0d707b1fb8f9a3e974f107755a7297891b601c237b8563235f9d1ba5d98f369c292dabdd8b97020787d2a74f8257fe872a90f3e1a70513de0770a843ea329ad7def16577e816b86fdb0a0f853a4c6fc492f77b9859cdd4c07b1a37b83206265d5661ecf6bb2ca0a47eb19abc15d7cd18f78266a69e3ed21f409685b9dc2635a9dab028335c1952f06b8ff8934b83d064c8f876b0311084cf33b2ebc123240e7b36a463ba517a68387faa0713f518b31629e215eab8c1b86960bfa0fe63bc3d1bfe8372b207a950c05c7061f979ec312fef6efc75a856042c30acfb8a19c555415418dc734e4c390f0eea91a256952a5886b88c160aa30f6d24d9037b9c4cb328fca42d16e7d8d75bc61bdebe91c5706f8cbbe3620124efc477eaa144470d201db015520c13085d7277fd8a5f5f3022cbffbcc05ef9102a39684662f1a880953e4daeed7429e63147e364bc954c509d81271277db43b4cf45b4e896d17bfb187a390749db02bc76166243d36581722b4b65fc36b7e174831998dcf5c1a2e42f48e709d722b08e88d9a485fc978f0036f14e2ed3ea80d047e145d543626ecec4e2a6fb3d386897e787108ded6f448b10c589be0f3ee08df3888a79fc3f36046bf32cd4fe433b8cd71102da8805ccb93fd9217010d12c034eb837104b87165e5587cf953284a1d828d6b0e0da5b40721729df88a369cd12e158360084f46b00c88d3aec9ff145d1e2edc23b2966a714124e216c57aa5818e07ddeb1703650bf350cf1ab886304e93c1b9bdbdc8e1d4a012c28847c0c443dea4d789f7a0238db5c8fb9d453beafae77e3c1ad68ed7b659cd218db7f06f8014e77fd15852e99fd4d5346e9f55741a8e1761df28a0e5e38f9fbb5766aaa520b2173e31e806be87245da5b30fe921ced4214ee5e8bef370ac3c7cbdd4331b0f5aa92ded6dd9e761a50d6e49d9d5eac2af511c25dade8bac70600f9735b096610d52328d1577694ef801fa79b44c9c33daa80fe8b4e0679debf80fed7b964fe13fd3c9233dc7ef4eeb9ab65e63ab7c58b79743737f42b9d09550f35e6e407f79bdd96d10eb07d58694991afc691be9bb6eb94f6ab3d283dda89a971066c0b5f46c058e699ff6182fda03bb54875816527d6108b30b86cba205c274edc0b9eb11d3ad386ef41ba2304a22655352c8617e8b7194b8dc75277d3f25b48eafcbfda58464806bc34c1f25fcda87d515b7520c250cc827619c37e786050a277f1e77d29b2ef331dc5c9774d260a669b2e9fc13eb5f61a467f3582471a15d9067161d09a9a697cc96eeb5bd9a07897584e6350e01a646e4aa5e7daa65d63d5194d2b51b1c6e777b38d586dc01b8679b6eeb65700cfeb0cf4159cfe338d1e04c5fd670ad1f66bc581f0f8c2fb773f066ef4822e88c2fb26078e332b93d31300cc252b37466fdab5361a8a46336f3cf1a0475bc638f0ebf2b9b5ed5060ab3b7661018ed007fa2b07adcdf1a05531b3f662a110f0d5e878e5774e142d7e29e94cc73e2f008c18029e9fd85c55c611cd5222cc1fe076616be02e0f89bebf1268d5b45f41e024c2e9872db2d791a97c5935a7e6d2b66e2090dfce48699b149217ad2fd3ceacbec48280a7e7258eb7682fec4f7cf964fb84a6e7f02380b29ddedf59823e73885a0881d5b30171aaacda2decd918a8f15b7908a1f5adc46b314000807e07a6fddf4d3443a9201f4d861d1e7abc09500595c3e3b9b37acff105acca0b01c1faf4c71ded8ef1b63db154a6cfc5c6ee1ea580d45280d59e8da831497a6f73f6bfac36dd2c7f71334b0e3a6be5d9cbc3adaa5452526b532e09c3ea318298c684079beba37382b0c4373309ae664be5477fb477df65740df72b67b04d0e90590b1d7dd040f7ebd65e1b133a0d0f04051c1dd2533290493bc88b69ee3f3e2b3f591e9f04d267bd9ce2b438b611b0cf45e370c5744b6abed45f2cd512f75fad2ddc641faa2f690bfb1bb5ebb89d0496c9c9c4e5bc323a6c524686d4892dcf6c654addb8d68ddab36bfab7a9db3679eb0db8df15b98579b766c74142a217835c4679f08ef6a9fc5173e42d6bb7e438cdeda6a58229ad14d2278a81f4ad40dd65d772857e01e3f7fef6707e86fb846bc796e321b87c867641bf35505b4f6f96ee4b6ea44eda7a97f06588d96588ad6ec47744e780b75b3633aec815e9e4b8d9fefebf8b393dbba286a28eeb86054584e62cefc9b430a75c9ead330e3969831e2f7cce84dcf14f2de736b1f286825f4cb9a053d808589c30cf3c61f9a23d99e67793b1f8e8b3f5442363e9e3d245c6f913a2c0e48eb189faef662f8e0b029e88f4b6fbe0c29d03cfdfb45d73be8e4a84e3d5574e72779814c41f9424e4c0067fc084686b62a1a082a2398aba7b35cddbd3f4e18761082f9c0b9140200e0ca6e3431d734a069aa818d7b3033c84540b52563b7a67dec11c83bba033d2c76feea55bfcdd1b2dde85db74ac8d57fcc48d68be2bf5f9b854a798b61951d7a942694bb8632ebdb9fbc63e823309bb3b02c5a6321653f519dd00d4bdefeeca5fb31e6bb1a855fe7f2c72a44f2cc638f481d95bac6ab97d83a75e5ad05cfb9d1b0d7a93b46f443782edd82165c02202761b2acd9cfce60c309e95b5af8ad4c59d77f7aa9917415f15d29b56c406350124601ea01f1095d5720fbc4359cbda72c57c5b61e8bf1c5558b21a8a28a9fd814ed7410302bbe3465010b6cf0aafb8b373a95831448994a9c1d93453705d147219397ef238b69d1b2227a7551ed0be15b12609bfed7b511a8c7d1cecf8c53e5944e707e170786c8a314a6449f197cd2b4b9d7b0404f93bb2bef431c8fc1f07a74eb08462042b50174617020e331ab397be036a610e90becf0f8d0a4c66502caf73da2a9a42a153460d2013647ea86d6632d7c4ad3917925b4b30ac5715b57cda60530c5f8116a87a7a89f25fe406a8d4c7e2a1cec29d7322cdb66080aed4fe230e528501162921a10c9f0f5d93157cb0e4565619b18d71fce51890817bd39f530280b5058507f16d1cd74059ebac6b0c84725cbbd9b17f74e14e11ff2319ae89104ca36e8ee7f65f10200df7cab55371946b6aa5ee8800627e880e9fe04cbdf7ada9b6741328359590eb01af70ac0dc5aed8273c1bc90ca0181736466ef09d807b5e508debfccaa53fc1139ef1b3987551ac98382cfcd7109486e00cf8548f969981dc99b0f468ab8503d30cf541ddeaa00dd66aef254933a691dd9f43418b499e54db2634e6864d5959161faff71e460ae8a707141aef4e168b1016a693b86637e3c0924a33a93c98d7ac028f983c52f122ba6ac2befb64b5edf75482cfb7f4c7d8e6ce382d67d5ae21aec0e389a19f00e7f3bc7113e952ecfed33684859d26a5c8b17be659d0c8e6b740bac68966f3beb453bd1311e32a327165a2ceae0983df46cb130c3f9194474e7c46bf7f5f4dab79234de6e0968ba4f16d2f52a6cb92c54cd976cc84a1e2958db7a86e310db0b0ac24c10b1dcabb7e0f978462b8ef0e5cf4fac6b0c9f48273ce2d144360cf8e3ad8b1d852619b448d4bf01b84f119a53f316d1eff8917cd5c4248553125a796ee100204329c4a5c8d6b36bb857357ea2d69e52bfcc3959a01c2139fe05111f88b136fd076706a5822bbd5f6915e4209b7b885e49997c3e5b173b1f932c40a88fde3cb4bb73508ae369a23162c3c138907a750ffd2387c12e99bca952b94ba469b13e2c01cd33416485701586e5316779dac4961cef5babf706a90e1cf6461a89d939c930fbf497f1556df2f9233368b1a79b1d8ec4f29d5629803bfa6312bcdd8cba48970d92e74b1466fa47891cd1422504eca9a438d2b23854fc2971d412a1f4b84b01a06249d0aaaeed28ea1e2216cbd03f65de57ebd13bf58bfdf108a66d2a7e769015ec9b201bff10443864f6bab91639dd8315f9c9bb1aecb26032fb65bb1c5dea1b2bdb84ad0beb7cf376dc796484de51832d3a6055d30e54de8fb3c4fea44d784a92e4c33e7148b0ca8325943b9a6ddc665fe7eae2d8a49e078af8498e960cb1423d05656c6fbb7059f10288d67543f46b6fc7ea9b0e8b518bef437dcad17ffb8e2f63ee4d18939047b4a61ab49389d0bba4bebe29810daca5dcf927d09fb13f9352d638140226878a945650cf7a14d2a08b9220e45857edc16cf9c0113d1c3a1f95319e61935ce97d98ee85534f18ad52a98150920760a5eb11607c9f3167e087df8b58afe41fc524c3d32117c7654d424d3a7496f4bc07c22677b9ae3edaa3453457632746071c8b41fe1d65c51c2a29151bd2e57d12d1fa21aa6d78b49992ed759914c298e4138917e67f1a49cb425cbb94fe111db70f470021cee1ab1977e5568e9c0ecf49ded764d3852a04150e1e55cd177e8b856adeaa5b26891581caaef3284e8f838b98c2959cdb193b66ad046559d546882747081ed6d2983c9bb41050bd3639a743f98896711bceed68b35c6661c4520d4c8b704d5a45231c165036cc08f06f41b7985879d5f58daaaadb85c67897660439d68fc59ed7ca23c5e29beebddfd3416cc7011fa1f839421f0cb03c62632007f969a0bc825d1d8db4684e865338dc0ad177f70ccd1cd3023d9536e6d4846d70417fb21af881cdff073ee34a4321f4353f32646286bdf30dd5f64899d206928c4a0dd6f33d6140e4d01a21b1fd16c07d2170489dd245fee1478782aee1e00b0d84347640a0882db1de91c87b3241d2a5957efa08fc5abe909e91681e3a41966c344993ef9b89a1042076c0c9ed9e024350c3801b31ac3b6150503d673839a858af2baeafd9c3c5c388510c90784fcd708e27d50bb1767a74cfd8db58e0bd67eeaf0d00417c87cf84e0c1e97900700a5c2a03a653ec4ea05ea9c655e63cda0b2ed8ee8716e8e572b95b631333bcb43c0f0c53ae5ed43a9a9d6e4e2263eb06aced8e17f994d3f2ff644eb77b2023980a4e3fcd87eaf20e14f81626a63ccda8b4f48ed7fcbaba6fd408296a30a94b6cd2dd385508582f4b4ba86e67784f1574c2d5b6d6030d6db14e072a69d4c24503fa02d331fc8221f662eb8fb5cacc473be6b360423d459654a87bdb9225538ca5184cb5fb995580612c1faf405a9e6e41cb5a1b4a858756c355704317bc1ebe9a79d1c30dc7d4b3b59d7ceac3d607f2e9e3e271584dae1df4432036b6abe4316b9fd1f19683dbe74ea8cfdfa62856042fc5f3de9ac13307ed977319adf29974141c986a46f6893f562eeb72463397776cfc8da1273869bc7d76a83838bd6321ff53a5ffe767286f3b77375b6f747abe4055b91c11b176aed6ac29be7b91c32971bb530cd595705f6a33d96e57571b6584054f2ee9e484bc9578c24420c9cd681f79ae0f795799346b3d34fd88a95ec8b51a9b3a9e05245893a721e88090c788ca16f3824f5e6be5fe14e4d0274b058c928208dd461676ce5a1de8867b214ccae5156733a4c4b43818a0a47e8f2ee283dcc54211bc6d8b7f91dd737cf06e70efb9bffc260bec09e40976aed384e45359f871e1b92dea4b9571265fd2d2099630c57d0d322a5e86c12bd592fa007b327a1e281816a7e85f0cfda3cd24edb27f16a2c42d342a9527f0517db934e45f414fbf086720457b8f0c9e36c04438f048616b547df19f58ccff3e9b555841f90b4d17f2e8a42e80f3be03c2277593b065f4fa5cea0a1b503421d227b0ca6a19579d2eee4b9ac8233023c413d116d94f3075a7ac23c60feef13cb484011c09cdd6105d05205b4b5429dc65764bd2e47898807cab354e17b41231dd81849d0b04094416c20c7b0684c65fd65e8d3ee988b86864a7071f58e58c2ae6db80ce552288eb199f5004ab7b4e9e41e0a3911b542544fd86ad26a59528470c3774a1ce71c463dbf5e2be0f18655396bfab8820be25217b4d4219abae733b89437b544743053922e176b5bfb34870dee20b84a852ebfbf0a6de26161f9e7042ac4273ba95da9b94f365c9a70f8f046fa85c329ff69efdb06de81b8f6b459838f791a1da2b317b8e3a4fd6be33af364d3e09a167f4e4b56dbda793432d1717960321d8a23a999165f29d11d71dade6db1ddace6512ce170c352f0c87681aea09383e25f9435eaf055a6313dc9e4a15481617e82119c2b34eb496a1d7a6339872f323afe8317c05a372031663a4a41f01dda7c4267f530b9e82dea4d58de591df0ee8fba05b9b8e87ef0b8571973b5e5551a4d58f54ad7b6fd88dd73226ac4047d37f41571c26f041b18a990e8db4180169d426221d70dd2c5a10394a961074c0cf27f896376533484f2176823fbcc1b2b281c1fc52c2b368ce4905f38f09454f54aeb0ca926504392d1a4834399189332d4ee75bc64d1fb1251f8b55e4c5c616298460be291ab986ed78d99cd29b66a9a46f2c29f445d3116579c7c655c6d54c035baf0d5d6eb83be83a95f1ad286e4578d7d26c8b490d7bb2a6e4cd6a08cdaea5890ab6dc953855bc001a9ed0c7a841428a692da6ec243c32c15f3a592ee6cf072c1bfc1e671e0fad43871b98b895154827951c394a009a0bdc8080ce421ef34a2a028470f1390905f172dec18c495ae2ade9b789174a35678d3549f2e8d1c7d42f49d8d4acdb6b29be6ffb1436e7d29cb4c1cfb1fb3a76312a8899a93f0706bcdb4ab569d04bc1975d7e22b014f7e98f3786180c5e8d5c1abd91392aed7caeb3b2da20ae9c279c2bca013a1a8b75863eabfc5946aabb1df5213a95c517acd2c396e6dbde5036ff36ba826d00370a88c64bd2b9412fbaf779f0a08fd01e6cd8c18dbc3f18ff740597d8f9772df8c654d7d392d09252477f1902785e99c6e2681a56f5955a8813a084e4102e104e18cd0330980e52fe1f4035569b036027e091126e59840f999bf8206c78d0e702e2a338e4bb4d0c033d70ba51c293a490e8064ab82d01917fa4d77e0242077cac40afaab951e1f7460b5430a3edaf11d4486941e06bcc7c8c7116f6417f1e2e78650b5489aae312adf110dc36c75b0589cf9785a5ac6482e3d690e0211f244739080212ce40146b0b8c1151c018be7660b924c1523d3af4dc80c6ddf2dcf26c26cc44e74d9cdb73cb4b811bef76d760e224de938446e4cda2025b018f7065b4e487049d0051859830b9ede40f85b5fcc0375bdc196673d4f74824a1411018dad3044ea55051e5aa5eab0670e7efbae48ea51b25c570e36b85274a97699fd90219fa8602593c248166e87d2ea8c64d57c796f9770e917eb825d283b4153a5f9618b84ba50b6d070b425f4e8a77b4f158a82022f67f9b03fc1f8c38785d418ed71c92c776e475ad9a6af7a922acb38378eeb13a66e80efc89c55d8a255691a400a427d61b7e1077886b6000c0df7b62c784de243bc727b61a15b7d08051547aa3f5bb2ee021089528bd1f4db050c0d7428facf10a5428c35551ddcf23bed8ced931b86c4c3d2f4df343783448c716edcd4df67e20c11a012a0e369527963febca08acccd86fc6085877d18c7ff152604697d278fcf97cba1882c2c3e84ca4c8aeb1bee089bd770ad06877828062386bcf6ee7796b7706bbb69dd29091ebd347d7a58046b67b9cca346da21180453e8743ebbe6fd362c9a07ebfa87f2ffbad7dd960f1e5a9d22fc960633ccf3705501e5f9a9d08dc6aa8b0d072db296365f2a6f59f99097efddd715847c67be7c49bbddcf6a8dea79449c73c669a2f8fea32488cbcf35b0d803fb37d13fbead5929a3ce05a3d76cee5ec100d7b0f626188a7470fc85b0f4ff1f592e4fbec41e043f60f906bccfffb56f7ee4ecd8796a48683850fbc1d20fdbbd29299962e936270afee6fcc7f236cf0e0096f6970c8fda531408fd5e3a902380a51e07e0c9d761d05fbb1d1e9a56c14d8cefdbba2c8b5ad8f844aef138a5a9a58ca91b96816e2b3c0e62bf53e0321612c9e64420bdf37bca02cd2cdf78f60664f6f90128f5d55569e67fe1e9f5a862bfa7f6b3b069db9f1dd3d6fcdccb052d8a957aa7b00f4586f28da94da704b2c0406e0528de8cded497b0a09801ee646bbba8ace0467b82399b84d6700512e91b911f5ada6446d6cb83f61741832a390dd177a9fdb9ea47bebad105cd303bc3588180a23928af8e6df208287b03fef6da9d274b96a191e0b1bddc1136e16d3960f240f6632487101274039a5681923d406c73768bd8ec2e447ec841ed6048e37655004ab440e3284e714f4b0bf8cd8f3ffe6f3707e1fd5c95ea5d863e2074d78ef0209f2b7bf88cf2590606e8288e2abaf3c92db071c3dd78293f64b030a218b8bfafb8fa868946478e26c07d12200505948db3b00abf45dde5513d22863a14c70757ca394a15a7f558e9d03a7a05120e400e489883ff247aa5795f01042b592ca8144db5e9288c12df9bae1a43692bb45fc9f218c460ad70aac1333720179a957b42de510481c15feaff5e5c171670c2bcb7742ee01ba457f5ea4bb3d4c80cf9d13bc1aeb1f2b559fe09e68a3de0ff91ef230f12388cf31e2d4b0570f95d70ccffec5c3a69939f598174b19d16ec3dc615a5d8f5eab80b65faf3db0f5f880975a7382c9d21cf39cce6780bc842e249c50427bfc55f101a2d56c9fd5b975ab4e96e6d03620039793701263b4db0189009c2607e9f8a2b968961644c02648370938fc777e77276fe99785cdfb5152dcffee36c9f80fc4cb42d27797c7e818eb3b2201be219a067af033be32090e49044fc7db8545904a897a4f5df5c1998f4d2ac3f8c0bc3d3f82203213b4eb6346c5577370b9d6e94101ae095c78584fa272c32a4e9e33397ad273e3d22fcbcbe4d8e49c3383e0237a73c95e08be58f53b3aadd4d8f743806e064d8874c40a5691142feb021c1e889c457849121d6f4874c30fab86e83207e0cde39f9abe600f3becbf5c82bd3d91a8425c4516c284db98c9996b672ae0d50bb30e28443fa19384f799ecac3cb6bcb1f6b5fb39c47ee25bcc8db6d50aca5be5441dbef2df3f1add02462c3d1c4d8e76e7840b1b23017af18ed0c92939f3eb6dcc516336aab7d31bd37ddb837795f607d700d8d35cb5c4cab26be830d18900209e4547262e11a72f6507af8b2354785e7c8d03027df6076fbed42f1c7e577a52b5bfef7b7c9d32344d82195a5f1a2cd2c27eb7e8ed73200681ed112f1ab8547caddaf949043fb9d6ca73c86ce273529260c890f123e481738ee6f2e979bc9747f4d491bdaf032ca60ae12f163be3af029da1bbcf54b58206c4d86c72c2b544a3e842f11babc660e7472ae877bea243d366841b19cd6960333486770cef4fe4a3429803987fd0406b5061cdc7469faf7a0f8861069c2ed8241b2a79610ecb13ad1508e5ec46470f0e3cce1ac6625dde41c3cf1f0052f0af3fbdeb7bb9671240154959b6c19d61f28146b3fd3fa52e3cacf69d9536ff3dd52e3d24225a7eebbabd69bd5596e1ecfbb2a851d8b32ec22a99e682257d9067ec1127b1cd20fad809c0450f966e32dfdb61ab7b3d9f14c05361bdcf8fee2e1dc0008176dd88911bcecf8e4dbb53bf2bd162176fce29099680b7481b4cd3349dcfb6ff2c2544369b7f56f98a6a26b65e65313d17db0b2547905b238f01fe45880b1be2441333902dc15072223971452f969189a920a4a81c12ab535fa6b0d8a1e7cb470a31241ca16aba5444912295609d5137bf3275c9e04f4ede1f4f13541a18c7f7c4e6b217b3f6b7c60388e2de350f2d51ea429dd70f0ffd05be00a616dd0c65ad5f4105d5b01663bfe81599273624bf680abfa90bd33f63ce8b8b46bae95297a49803ad066e39e4f05ada03d4ac365c32463fdfc93d65bda754c251fe2771041b3bb12fc7a3ab2194205b1ea150f5348f8905bed5679516c2a3305af5737fec21cb22f8bb5056313b1e6081cc78be4956008db5331e9029edc5505f7ad15f3fade4a4a4f2de91b33cb0e6ff20fff2b7befcc82de26e7810f67ee8a437014344eee8007c76450e58ab15eb16087412b5f4809e39d0d2e7c9b1007ae3b31fde6c1aaa8e257e90762cd2000f8f766827ef114f53f2f2af9dead75606dbf3dc7c360318b71cfbc95fe1303aa172d7f97e84cb4d03abe02a74b6ed839bfaf31c343829f3c5a07099783895f735ea1bd69f321f363a4a5678331a1b4f61d6729c7e6c501905e28602b3a7149b44b105a8c4644717e3f9c325ea85af2bc311ea0ca8091a80de4c07138057c6caf9d4d80eca4f27fa355f16bedfc85df5f9dc43b53b0f058c38a633bc16d8eb8dc81b69b173143d1b15f2a1e1a1faadfd4dbd083372c8a35d042d3057310127a62a1443647e3bbfa8e82e565c11611136f880b2030e870518494363ffb20ce0eb0a6e2a7171269065b681050028193999763ed3ceb14fca79b17339c67673db3aa7ceb85881a7a27543f945f451a9ec4c9c86ace8a84a5de1a9ebfcc298cf3dce81f380ebcdcc5e5ff8b11e7335e77a7f991611727b4ba124e17fdbcb0fc97b157784b422b0bea61f8d6095c088d333bb4fc4b147fa7ee53f7f13e86e33c3b1b58618a8ef5c85bba8a632534d87385c283de451c41fdb49452d6dc284cd059d81379d84f6710f465f7f014cdbf213888e2dbd26dcfd655f31e6aec0ef5df0df71fac09a94d06afce5cd23ae732f3960b9220ce0d7349b10766a53951a02348e00bca528bc8ddbce02d81372ca11a9d751a0fb290b936bd864f19f87dd02d3b5100134fd8f86d05a53db87e684569622180e579738a80fbb8ab08dce17e2cda7449ac2ad85666c646ce0d7191bf4242c3289f25c7af22337ddb05db5010c543692ce7325ab08affea98b542eaf7d286cfd502b34ba69f40fe7d1bbf6c270183fc6f093056a0b583945d89e39be75ab40b563aee1bc48e89680e7ba4f5573e2d1de6d9b20e3ba8dd3dacc6c9d4918e3652ecf3969c6d0058eda49ce2ca830c7dd991612eb161b9f60f15656e4eb3ada95e3ae02fd88411385c16deea0baf428324d2ed17048aae1abb460e440d049a1d561910a1038e1af0be4c338342d185b6a93cb207cf7d857407a365b7c520ceb275893e28e602ba70ee1c0c27a26916ec0bcb21c4ec43f57166ae8a392606b6f295a1e7f37fa4c58136552c92e9d2306f2d4c9085041b2377c6cee603c08ce3db49b49307d9b547c0e447196a377d50375f687a41a2e385da0d03e31b1ff59c0b63568399de009b02572fd42e19dc57cfcf0811e3fca9ce8bf0e8dac16c3f3410bff6f921d2a9c0644463667bd54a7cfed38d1f725259ebc68665ba0d918052485873dcdd203678efc63332d2accf9115e885ea7eeda49a7727122c7b1cd0543f6c9b4a868bc8e14962ae140875e2baebed072283575bed8d36dbf59e1efff79ed3d27ec05d09c422daa9ce89c1bd1670822c9a9eff37f25b8554282f387a7c78223e90bda0d0619a4a9d8d339e23b8ce52d53f20777644d49578ce345e1839688cb0f3996d49dac68d75a6e7d8c966d7ff56f4f17216aa92c952bf9b0867b6c59f02b3d28cf869e317340aa7ac45c5524ddde9b87556dc29d55809ad7b4436b35dd2894dae2a6fc04d537d3665b78dd5c6b5e5cc8462500df71ccf70356a0889afbdcd9783211299b849fffe2588d0ae2d3921959156191762ff728dc9467e886f8f8c480067e0107b90d632fdf487bec9a7ffeaaa3f1db888f16d8d7ee2c2a8688af79a6ba46f4b06881291d8c6c16f8fc650e48a9ae0c7819dee75a0cc444155947001c52ed1b5cc273f9e3b5a541f629dc394bb33b40cfd52be022ceb8e6583fa3097a29468d4ff4fe8065ffb6dadb0eb37cd95ea6f639db3e0a9c19f1a589dbbf0f3a77c15edc636f8858301e01d6923cba4512769647b4a63e814186b975db8cd191014241fbc8caaa69ed739a2f166312161c750c699cbebc9ca288d8d74a29acd4ad49a7f9092dc39fd8ec373c014a762352d095bf222761387f2e956249d46aef2f9abc2719c4fc58522623ece8b1e5b11db2202c6da8cbe54ceab5a1d7df922b96d7b6410240bd3436d971045989320c74709bbc516792cfc453c0d4f84b05d0ae96eef634110d8ac2622029efadc408d41d0b118ba0c62130eef353dcf938b7e354432b322f78cc3a47b5c6110d9b02a398e469b07e33d230634404e3af65115348221079ce56c64051ae2505b95f54c9b4d0e4dea8e218deb9b38ee2be60746becc353d89cf6bc175e962f6994ed62eeec91850d5429992c2a783592c7d1b28132f8b4ee8a8cea22fcf1a99e36d5610e31fedc6d98618ef59a80d869848c6f1c8cb4a218bb328fc0f87b5fd36c1f779c7c65dc75bf0b934fb5c03b8a5b83928651bc996c36308a6c9670d2aee5400984b76a8a7b9814f04aa6ee4fae5de308395d6320985a84a83072f02403b3b8e8696c0fb70b83100eb0b4bed01eebd5ce19cbbe0c17ad47fb26bc39e1a4bb7b183c024bc7d48a423cd71fff8487514a2beecc8006f9ce0616f22292f1ba71f0009cc24fe86314dfab9c709a620b3fd116ba6d284f1a057a9eeb6bf2002a10614aee6add1eb75ff323aa784a3cb2e615ede82e344c804be57c76c4d233e7baab476e254d7ab6485cb20a7bdde13de9935c1b4e5d5acd08e558e93ff1d725494ee4fe694c6518ab125da9a04b4c2c286527364118309865c1d3dd4c5f155c882d606e6ef7555f9553b43b192836c864c038c2124144e5f632e30d5310cb6635407d6ef8027568c8df152a8ec0902de1cd2ec3383b4361c9a1bad081a88b174da7d86268d1822f2cadaadded8a688898e1fb8762b00ad48942f7f32a28e980bced32d729cba5573f0b3db44952c7a192cc56232e830f43ab4acea33b520cafb17ac4da247153c8ccfe86e4a888c956948343f45b52bf19dca8511535c09d5f1e5220fa67c1a9045f1641c6b1a1c317f3cd5fb34545ac6d405da18bd3af36c1d4c565af3efab040945abbd7b7d0af0c72290cab03d2a16367387179fd1198622b87172f3605bcf515ae42560cbc9f670f328ef0a2c52f54309369e226048af96a596c0c3abebde913dbfc0e9f02c2cfc8b7741d036d0f1bd6044bde65c86e477993dbc22203b2dfd37dbca034628e6d8ee9280c8e724b943037fd0495682108a6df4baf5056dd991831edc49719d80185a262f3b5ec04a06864cfb61d07fe3c6e24424fae25ddb6508df9772992df3a507efba4dd14b5c52d59ee2e0a302b9c6e913c4c6a4e183446c6a7a3f3d9ca325f62a86fa9347161ec83bb1cadb148da9b42896e797af176b60a7bb2cbe20cf2ca056250061d6c882c584431f1f6c08a482617bf48ec9656c3442b5671cb5a0211c6675bfe7bead6ecccf20f02cf53e05c5250c4ab96db5a67239e7f8acae55e1a47ad4858151dc07c3b2fbecca62b896d75a69b08cbce99cca1725017b1301342c617c0cba34d195333209951015d0ee682bf14141b60aeda17e6fe2997da65adf7d47e7e3858a51533d4dfc3442d3eca21a5feb752b7eeec9a0c5497ec67fd1b131c5b6f8233ecce4a887982f8ce9c35e32d95d0e565e95f7f4fe41f1aa166907a0b1b3c59a72280d6816c68bccf553600372cad8ea56142f00e9b8fdc70f1688b2491eab0ace10354a284873eed197d6ec7117c7c0fc6b83d60a4056115b96d2312eebaa7805749ee674f26062b55ff71a5198fa46db34a80cf6f59a5b4cd2aef36fbd856c010716f49914cf5689b30337694186787022f7be551110da7211da2a1607ba8be6dac2d86434b9add96715a1d62b45fe90692c8cbdf6f4d1d980061ca2241af7ca82ffad0a6361b11d65b535446f259cc5040804856b2c414d11e81ceaa26702076756bc847fd96bf9e1a96997b2742eea9219cb233be349909cb5a02f3b236c8a184654ad8475630a8ee597efd6e8aa9055b2b2ac97b4afd7ad498f59afd3be16589ed3537c13795c1899330a87f1b9fb5a046b2bf45438771eeeffb0025f232ee6d77723b9d331a56f970a3c8d958ea5444012c7c40387d4d3b6345e74a2d35f5342d919ca3d385b00734c43351202f7359a4ecf5bfc3aa7b068614525eabde95d157481fca6a20457c0fb588e54196b0f44c255f74660c57436155bc89680d859543baa8069a4eb957b901eb811660833a9d70098ffdfe3b118804be3619014cc3ba57dd7353c466ae0f5f686fe1df1fc1957e55fa1fed6e4a435f9a5647d2b4aba1316f161e996d0de1d28370bfb488407bc2cf95938e7fe0a09dbd817682a70cedaab4f03e2e3f09db1e24b707c273979d183ac0566618b867648d5efa233a9ae008fb70895c5984840d96e29160bbad83ec6724d74487e90936087b84a74a4162e04d89d04b0d5f8f0a17fda02d34a232d7aadbd68c811322a6eec025367e4839ee1aea634e4b29630488d069cd798fb5da57b873e887b2ff24056f66fa23529f00a8b989a7b69b26d9a3936977c91f9bc7c9c80141d97f2151c0ae3303e5123cd58043c5245c0e03022407d2b4146ebe0f960236df9846d1f5ab7de14e4aa48c16f8f928e20c533e6ec3a54259b6b9092581dd294f5426ca8bc43201dd722523553dd640740319b4bbe93bfbcb83430cfd3b2cc60ee6383246f4cc1bf5822a78d7310a92a0c1a497e603741f78db44a4a09a470e6ad052900c37e40db10e2d38e2c8069a6eb874e5b301023fd258507041150b17308a94fbe7cdbcab512743fc9c9df32f6472a72c8809511697209ed5f260e8bd56604b7046213f95ca9de0a9e1cb526d62a19231ff4c9e5f0c75a919c1732438c75300af9a1ed1aba3e2051a6e84136192e4cd0d4592a772b978d6352f3d8f9fa57f2c6ffa0809bf9c32452b3db5e4aec00933037aff654a4640e9d8600845006d3d928c9d530cd6752e26adecc47b0b056cf0a2bb233c3eaccafd32be1d23984003c9960e946329cd13e9d9c6376401b6ea96bc4328f7126fb090827c7ca73a92049822d6968a648336bb2d2e5a928304b1f3459cd3c11ea5d24fcc3b9acef1b5fdc57d84566d56cf8048aacbb32be748ee9b9136ef6a00b4d286fef92a2d3e408fcacdfe094321645fbf50fe48e3b720cffcfb3a17ad22c305ac078e2675038018d3fb0421226502a0e2808885bd044c2b78e9d03a946537302ab009b90df4a3c86d48b5f2644b7b563b5a1006d18131949e46c5bc590370e09802b0c36940ccdd74ca7e28eabb19b749e61d03eb62ceb7c242be6711dd18ffbf6f4852c0a7aa2c599208785078acb4d3c7e23403ce3494de7f0a0088d37954508d3993c79be9e138c9311f4ef0d79b67024ac3c6f1751e7ab21f5347b2f53d1c082b24d5958a775ea6a4c3d5a5650bf9ee0e2dfde83defe78244f4301e24f13b6722b8c5ed97f556c100b241f9c94b8b338b94407cd9e877024ac16156723243cc298704e73dfbf82d7d72283197c009b448a2f318a5b5fc75bfd5cbc5de516c039c2f2dddb06a1260eb9832456e8de7d3c0cc51da176acdee7bc4c227173690927a76c2b13ca9afdd7bc79a155d587f23ac0fe9cfb332a3ac9ee3ae7161fb558903b45921c1eaad34fe80fbda1b7680ccc064ac97e5a46046939d578e765edebe80d7a5ff8c3851d8d325a681c93e99e2ecba94c20670fb023eebfd1b591288da909e029353df1dc663eb27b32068378ad8a39f38155b0c293c5417024c46b0ec74e27746d87b431db03d4630c7d2ce6cd7b8441f7397b734c1e70c8d21c29b28d0db00b64005580310bd1b2212f4fec35fc53ca31b535efdbaa33b36b6854dd1f6db38867017de13ab688ae174db07fdc4840754e89a3a8f7f24a81807ed24869f9dd9193c03463ea3107186cd1620686fe6ce90615ec7185577fb40fc4320603a917eee798633d324e21c4cc4a8860b1d045c3e7c27067789086c6efef9d554623b40272cac7dbcd29985d52618f4189a0600c4661b15271b6d58e4de831417d7e537197f645cd81a069e81ef809fd76a304f034fbb966108ca1d24a7784f3b7b8591fe58f5c7ec86272567a8e786507f3aa67e272eb7f8d1b063354c88f0079e010db85f0b6153afd5756f2b18016eebb4852f35f9e7162ac2372862e203fc37e89b71115f1140b7a198819e6b0865400d61c4b142754f7000d5e01c95d69d1364c09a28ece3965fc389cdd2b53f0387f0fdcae6fb5eeefd9e5cc9d0482e08b06520a3cc4c60fb32f214389599e901107bcf9a47f99180e5074f009ab16d14bc311018ca03b0ccecd4f60804fffa2b9ed59297ad24278a7ada31e0ffced5b86033ea49029b8214cc14ece47072f42b1214d99076351be3fcecb10ed13368c7ca88bb6e93505c4616a38c5af7d10552e6785cf060925f0e7797aef8170f021fff4f2cc550760b71f63efb2679e6f783ff3e406bf147d6413ba260edb661c01ae6f35bc8dc45ec7f030959610ed1cc62c8874ca4fcba8b57867067509cdf167b34ef5da8523515a6c635bbfbc1b5ec1ea1d2ba241d00d5feae71bc9a4f160f1f7390d99e255d402c197d5b9d6afdfc0f546eab8768a3fe78ad66b4ab2616bb9658679aff8311d1dd7868043e2655a749e38c72d01faa29f571d1003350209caf303da7f3b19dd3d39c06ef60910fcba537180d79e6571ab0b47f16b92bcf077cf07c56a16e0d80b3f26794ad01c0a1d19927cb078fb25e5296fb909d118c933f819d743e6078727619fe5e727183fb5f14ae1f85a33fb968b96a3d7c72e063ca0e686b7ad37215049bee88fa305069740ce0fc68be65fd3e42d042ef37b79cf3fb1f81fff0ee3c7844b4341d684effd5a8fc89a026b783f092645a9e5373317ccaff2c64a67fe3497bf80b5bbd6bb1ca62eff8a19d9311d1895095cee5bd113798e497fa8f6e477eecad06e52913d8b75c921cab02fd6c263f0e42efa46bb951d47300bde06d6cd6a686748b7de24c123bfe45be025543a150e6d2fbc7c7dd3c17668c0347769f48d703f972c712af4d1324e0c8e30f4651b0567ab4fc2b3ff0ab974bb0d571b259bc226c49052c74ecbbe4b5fb37afe4b703cb5948312a79b3d8daa1d8978f4ecd0c8c2b7a74e0302db2314838cb4a0b33261c5c302c99a21c7409c6e95632e548d1f324c02b8bb0aaa6d22d9ebd3c9a5fb1e50e17a291693a4cba87379f953ff5b3c441a68629ea512576e4fa52d30d3bc1676c7da150059b4d47529848403b4cc6af5a96a90ed8ff66d88bcd41f2f32c475585391a3d90cdff0ada764694a931ef6c4a47e6a0646bcb1d9118a9c6c6714c92bf63dbc6cc6de93c257c032c614513931434b1249cee3a0114aff46c1651ba4b5017486cf10eccb579b871799bdef68869a86f3fdd04cdfed6a5f4f7c54db3a11d09ea37927a1daedac52fde9519bbd8b84fbd5af71dbe04f2e7bce25eada84130c3d1411fe3bf6f1287af50b596778dce4ded2ad4afb53803c2c5dcb3b3268bc0268293b70857fd3050d60436352381f4955af88c44413de9f00e3c6d26410218f755a255aa97727efb617d7b264e26e8599eb1a31caafca6020f067f251ee748e2fcb5f3cf18513da11a241a81cea6ffc47c594ea2dba2667c3c441f9bf113781b6f40c2930da29ef3b0ac9951809b81dbd26b0b50a0c38d0263b5e6cf7e9c8e43e994f743978b0ca0ebebb804bb8a3df37e98fae70ab2e93bcfb5fa7985328f6497011c828016254bb7189e262312c746f0bd62bdc6ec33551a40a4c245b8fed9a247abb8a4a9070642f6ae48eb2c7dcbd334828d35c86029c11637cca5cd53fb6c3a2807b2fd341860029491907d89cf804abbdb187fdc18fb9bd1ce5f67a73bc365ec6e1d7d4bd819a20d55df4f5995448ba4feef4317afced441dfbd3b45c1378b81f3cc0790fcbcc36fccfeb0df0b332badf633273d28e16623f53ded6c5bc4110e826492e240a7f4db66e8344f82815ccda13f30337f57e167122f32f371abdce9c07133435c703f79c133578024fa80ae6900b66438fca89b1779e8d635eed178b4b1772b558265b1531992da5fa16302cfa07b46a21c6ddf656605e31aa219fc4f9e9d77cad815136f6847d84e2d95f2adab6ae059c00811d5d5e1b739283178129e849d6bac04bf8a61a2c6b339c612be1b12ee987b236e4962e8b3c81473a88e9aaae51f709d6a6e5506d9b41343bbc2583639dfb153268ac2666a75d82e50fb3164638cac33a8841ec05a796424f1edddb20dcfb353e72ce23acbf16d4dc5a4f8c54e13d802cb180bca18c9183ccd1720e6b01a1e2e849bed92e69ca3149295d76e4bc3536134082fdbba727c2763af50b1b84077edeefacf984acad2d8df31dd9800c984295c544864ae74767791b4fdd4f4a16727f6458dbffd4e4bbfe51d222cd88a4035c076f9b4c4e34138b45e3e1c9b2940892cf30e599ac57228bc16d768782002ec118d0861824fb10260ea2fc5051c4c2785323448344903d2aca7b598acbdfa2a10dab8319659a0d4611ca8c482a29646b5c33feda57aa5112aa506831ec5ec410e7f69195548eaf87060c4b731aa48d633e0bad71a2b47bcf138b4663aba863aeb2f4e7d65ca36727b1b82c36566539338e1299bfce6ab018ecd724d6f00053fa2125560ca30ee1fe50e436c9de57dfae887d08d5115de756a9c514e86d2c74123f4805cbf054224cad1a28ab12a3d57b1bc9c9523421801153090a350508b5285a9462c6efe8451619e9dc01684310da8c0ee55109050c54804f037c1294843d65bc2d65d5c63591f291b315369fbd9e82422b5acc7724cf64454293012d6437d0aa4bbad1a6094ba04ac6041d904bc397778a9c5b6fccd94f1da80cf69365ecd85d881e4c8b0a2360321f74f0e2b3fccbc011c79fb28c32a988d586cfb1d73b897c113f2413e36cacbc1fe25263b7683929ba1b03d052336f12472e8bca0d4e1573806dddd4db8f5555dac6caca40297088b4612ba90e0ff0252b08428f38db33b7d75d51599de8ba087195b39906ef0b22b321ffac66172c5e91b5399023a9f88a34057b672440a098a6be91337f5e676c985922d926eaf58b9f01d4e986b52b8acba3ef4279a9be9242d1d6cbf337cf2aa30c721c0905de9c02e19056a16512ce0b3d3d579d404af11526a36eabd7a083d166b1fc626a53de85e56d4b10ba9045ba20bc7b29c6b06815368570b727b31d32ec1c4d0e743446797b32f30a8d501b5561b897775e64c453b1b7b42ff564380cd422f141800887b0698b0bb0026660f600159f92ed1a238f52dbc42b37e99ddab981390ec6faaaf167a99bbd37d87930064ab87e710138458ac01510964f8624c9dae77bb283744a3da846a876514ea7c0bf3137248ec744a6aafb6522db90222489b7eda90c0b9d6093033153e73dec541e6a2e50644627467bb6258f9a6ea6626cf81f4f7b19424694e5d9fbc31c02885502dbf233a7a93d7fc53865ccb11169bce715529f6aa0eacc0d4605713cfe8d08598c3e8a81d0fdb8a01c1c99d78e615bfa1a22834a6c6e817020998c0aebcb2c3483fd39221ee7dadab2d5952e93833b870fc7225e45284c770f888d0a963d91c2d4d15d7d39391f27098e46be68747d1d33aa417805f9d95b7d899d02140b94c81172fc3d79ae1dea3e03bac4c4571c0b72d1a420bda479613deacfa7dbf6b4843c1d5116496126c1813208356937d60e12d719bfe5648a0f7f72f07408394a1f75389b2d7fe0aa904f5c7c0fed77a28c6ade1bb1499048a8f02e223bc5fa9b2be0291496a7835e1b7b8b9a3a7759f7507557196709c2f2d51f9ec88b4482afa64195800857c909c6d006d2d7c4ab64533f26a3f27914817209420e80ebe8f09a20e27e16cd1f019ce78501b2c9c731fe9c860097b491a583032e8646925b8bc9b645369a25a093e12b3083c880a96d5c5258eb05a4608f0399be9ece916011a1a400ad420f8236fa543c26433ea938c19c4531e05252f99e440010c5d10b53cbdc2ed814ae7c251aac8f8239a9518d9b24ae7d75d16271c5a48d271040a7ac5e7be4d5c2ad130d5ecb8e710beefefb91bf2527366058e12f4fb514f8bd8f5a1c44a0857f3adc86e2f34eb29d081b1848e7ea62c513ccf8a5c0258cb20b4a6601dfcee6bfa88e493e836f35642d1e4b2d3e032c919fe0ba22021de0b089dd55b051ca9b90caf1eeeba700e345823e92c1169d97d9c75eaeee55d1e7e2d0769b9fe2f34fddcd448dc563e54552601d65cf8291accbf117ece2ad906573a52dc020f004b8daba9a62de2c21eab9d5262871529b86393de595f782ae216a330f78101c93d95514587d369c037bccfe2fcef3303c24d001f7d81ea76c68d6c28c7094e1002f82bd0a1757b979717c6306b3de3d3fc4588b1023fe8721fa3015aacb7bb83ac3ec75c53a9f55fee53ea84d50c70281f0ffd0f9592afd41f65057293100be03c9fd7fa0b28f613d52a0f98bbd6ce6c5eee477e680d037bf315e37622846c4b5173c120f7a65d23b95654f8ceb59722c8090cc2e7a7b3a1f1265f4b0027e94d925a2109970e59eabc4e54d7c86a9a998e9cc08ca121df19a94460b6045424b7583793589bab38adaecb81e42360cef437980e685b549dbd967aa89710de5b99a5469405d56a3eb7a99d0c882e7e47420b60b4a794487be2d04bf9cb986eef644e8ca0d8ed139f713075409c1a1ba08aa4ea2532ffa6c266cfa4b52f5ec45e67cb07be70d0003b49795f15bd9c708bbfbc7f4621c3475d2bb0a9c35affde49bc72b00abf023d0f64dd29a4651bfe68832a4215cc0a61a7aaef7b843ff570ff14a32fb72c9a1e6a822a89cdc098b4011a9577063269cee391c702ef67e880c312e831368a1c6e0229fb9f34d7323c1c940fb40483b852d86b5549fada64d48a91fd0b688bf437166881729154de2289931359520b4c0f7421f0e15737043c4b3712bfef60a2e83ef9772706b1ee0fe4ddba895636c195e174140b450572bde16cc4ef5322cce7c6b00c7be23f307bf424a743f7deb5d3d1e5f2b6def323a48d05eb21f411f43b45593ba4d5ee43df59299e913067ce909f62e1ff62be49d15cc8ec17c649daa50b97e2d9cd53612ace05abeab7ab8613e145cf54b01b06bd837f98193f139f1a9a80733c66c2d52297baee344040375c67f077d69978d541103565c6d0b8fa7d9fb18926d95451836478229640802386c824a9ea12ee44736a36678064614a30790964ae04718faa31a16e88e1e88ed07a58be39ba3ae2000f43008aa76d98afd564b6774e84968fdd8ebc0dcd7e7004c2ef31ee93d65871a94924db3b4c7057cee6e52b5f0e01e6615d8affa5179eb6edc994c2e05c3fc010b3a4b19ca1054d0c000389520f5ad4ebd82bb3ef34081bd7622d00fb43a481a0c08e3ee872e38b3abee215892df41023b9a36be9cf13e25e5d266c3ab183b79b345a52d8f15ab3f045ec71ae385a47bf5492907c89e349ec8b430e4a3a73a8afc4b56a4279213a3de40d080804c104c27f1057745bbfdb0a884f6efab326f032e4a1e210f8dc012c1b0d31e3ee54517431a24d76c5347e7d5140da543314c3ca2000e2f1a1c87a1455d8d96f4a7b98fd801833261197af23f50520263c11dcd5169943c906bd7254acfebc75b6f98973fe8c6894cc90dbe9689b6291c625eeec48523e910920492ab4470f61335475e59dc6ccc2bbbdf16a00092961bf488900694b8c10e19229fe60aaed92aa73a6ff5c94516490279a2f4851bf5e89e7cdb5df5e21e0f8c64b4840ed2c595307c2a7ae4b1470ae404f7736d932d2eac00a5044966ff499d8ded8699163fc90542f3ed048017d2d86956a6fbb51609b0771d4a5456282dcf63681729f0c3bb25ea5012f185b9f2074bc19fb10f4ed7be0873443d3f94a62f0ac3e2b5128970ab5cabf9971dda7d50aac41bb37532c629286ec7b496e59bea8109ec89384df70caafa5492468aa0895795e3ba226688000d35d957627d5ee0ed103a19aec243f17b52e40a08a0b4a1edabb55a555fbfa050c36dd8b1bbd89e086529869f1030e2b1ff5a8f719e3948d2dc2c36ea99b56c22c645bda35d921ee398f44131edd4c50c0217ece13935016cd67aca4cf72caafd059f8eb68ee517296bf8dbda08d7c9328e643681d8ed3590d28b18758ee76e04d35aec4cd65769fb84ff510f13ca44ad36546e8713c31b9705f115954b8c7e00914e28ef411f05d91d980afbb32b6df9e043f19ca00b4e71104dd2092f9649f3e2aaf08dfa1e347742afe613638b5e5c74bd18b1e2d91e06e9f50bb7da5657b8032661838e31f348d40ac15fcb4c80fc6074104acaaf511fd0c27da4534dd116002870dd98ba42e35073462b95efcfb378be7a9d9b09d6ba524897a7bc6b2d2f98e8f042649e7dee4ce9e57e116a86c18e0a318317c1c554e1f6607154038cab48517b0d4881b1b0da9f37d66b69a7309ba5c35782bded400af1805aa2a54045cc396e32ca6ba5af19c58215eb7fc7fe42fc72afd9e08153dab07002abf80998feb32413ff910692469551ddca9fa0932fc664ad6ebd29b702570ece51efcf6e11c2a746272e6600f2fa85d26a4afde38db90bba29bc33573056b5daa3f7644e8af305bdbacab73da49c774fa65bbfa930f0689cfa02149cce3dd61d4bd9708f85cb7ff0304afe93a41f8989a556f938155cc0a57eb5148eb004e178d500d495a05e42bb4aab714f6558c4c1f1f82642b410a1c2448f1934e715b50c2e2e57f7e08f8e87a28450028cf1c4e6775bc270a695db9f839521204dd3e7ae815a1e943381c17c957101c4c174bfce55446e2b78c268d2a6e09cd02a641378e489db6a1b8f41777a86cdcc9216f7768f7b3565392bf93fa7340196978eb978a1f3bca4b0338a4f9915113d9fa2bd525099340ac02057fdc4fc00e62c8e41db9597baf4e0a780a4ed7d2f8e995720b3f5d0f573dc45d2752c4efbb7e6d46862c2d52f133ca8d1d49fd1df85102e036a6d1a57adf40fbaaf3944ce2406679451ed402939dfdbce8eec03db1f2d71112e27dddf100807549ec04b6d711f6c8f51e6d01a6ea0c7d43f2ff14aa56b1cb1fd09239c055fbf897573d252d4a23b407bd41dffc5f9c58be3d8d2116b5ed826c209c596734cb5c56fa3490fc5449c38edabb87f56014800f8aa250eb6436bfa5f7def10813bda0e5675d729404c72572b09640cb6aca4a3d2dd6345177f3067bf971d35af725a9d20d7acb7372d0db1e07417a4506dd425bbb903bbb50f38b8a8fe4ce29b9e105cdc3484f090fd0a2b193150cb713fa534fbb809fd667897a9cd67b7e9ae64bd84956faf6b6ead09f37bd3e1612a35c21f49c5f2141ec479a7f4b60a80a90df5288f628339ece80fa577a007b180362fb4295f418fedf3f3260c5a55ec1726dc66dec961abbb86c44ecb478f19763b316c23669db2dea5d7d9a9f50a5ffaef8ad96376a633c689194680568d29dcf7c9ac627935a107617282f940ceea89b6ec4166a1454d64ef6601ff011716a42b9ced359178976b77d1a6feefe8455ea62a7e5d846d9c8a0053c7787a6a3ac8553383fcd3413af2a83b5bf4dca287f1f3e14db9803580fd0710c95560abc3a03d1158aebec3ce678b4edcc49aee94cf293a088562fbf2b6b21a727d2633d4f434d1b4430b8410dd4acb1ddeb80006ae6c5576cab65702143c4d34690350bea4c503433a774eb5eeb5f73fb9cab93845dfaf3ccd1039be89bbbe1827e69e6609ac68d596155de634b7bb3da5346e04baedaf1e3237d614c5fd7781e58dcf70f95fcc39c084f5a1ce599046fcd6d3ee84cf076054ddaf562eb7e111f824214b365f46013eabf3fad7f2df3b2757ed57bef2358b1fb3f446d904c2af059fba709665e50564e24ee219e46662ee227e0729bd8dcd478a10ff15d0725de5d0a2da23b52ea3dad919ec3e3b701ecff7a477150143187162fea8697018cbc53bb9d248e3e5523cafa335ad743379bd0316469b17fe8810ed228c228e79844e75b748274681d9bf2a30e43948c6262d12d1fe802e9d16223ad5b1d2fce7fd44a9fef10addb78b1218ee33ba80bba67b568cd4732470f9b9cc409eb67ff8a59b616a843cc556c5f7ae038e3aca221cb75024aac481c534f3205fe665919b8fd97da4dccae37f67404f3f7bc220849e3922f08b8a512495c76e0f64f136a3201571c2914f15069bf87f23ad8c14a983e97a11494ad982a7dc5bce161e02a3c50d9f9e60bbab2e42f30c4a79cbc63aa0d008ede05f84ba9ff257110d0fd1796160758fe9632703a113e8f75f7fd58f21c0fb1b94d20f341d9729983933d33fc74a3f3acd86ecb3a279ad21cc540c680d919973aaea522f7d27536e6cbc14cc1dddbcf8c2e606e7d76d875004b6068b2cb5334493d5e4112d76118b2144801396a25792c0b32de5784d4e1d58ed898651841a359bb189482c772a16e115b2fdcd688805757cb1b11ed3a9e7da98853f0454c2cf4f8ca583d356fd8ca240051e4ba115d6dd4f9ecc35f7c63e8740c586e54b7b7019d6866bf8402cf84b0bfa8ef934f9e71317f3927cfa6b8dfc960f0c1e64f22568f4c909110d8835b122be92153eaf4ce01628434956446054c31d7faa86855e578960a185de37b4b91668be4cd82b73557f9e83e22b8562a5674219a3811fb569f6125701f07027fe62c3ac1e93f905501eb867056443a46c83298bef0e868bc56f3201a356017bb109bc5ebeb73a0b288557c1cc89883d55e015bda153622e265f0e28d62ba7fd267ce26abe86daa46981f1057d4c970f76eb4a27190257f333a5e3e77b62080c2e3844a81352e089faa7841cdc234eaeba20cf2a139d1d537b5cfd4f1e7fb415437ff259930c3ef8c754415ac150ad048627dbb1a8335096f6451ea9eeaca74b853e8a17ae3a2572a78b2158377f1418a1b6dee3573c46a98df12ce719b8b852168e0dd829bc147c807bac736a302ed60f46ddfb0c8dd891cfd2d9f81e39a2ba7d6048e3d35ca6e820be106be42f6181965a7a482092f42e8d00591e482254ccea7107ca442c1c254badfb39210376c8ee223187f0a06af7e8a1e2c25c8d2c99fd03afe441ee6cdd7118796a19d0849242f27825e34c81c1b1ec642fa29d8cc687884cb16e459c963d36a3b6c34126198d00906942d1f171771bc226764d0c291063e5927eea180b1e4a52c0bb91cc482355e9d7588d035e5059fd720b202019d12a1c0e76fbfc3f6f566aaaa402844fb0043f7051275ffb3b610a1b2f6b850eb7de0f3052a501cb4623af8bfc48d7210450794655495056e7f964c1d2e5fa746ba04c0196ef03761a14e2a5f69dcd450c5e981424589404c7d76e802b66c2bb6a90e5530aa2c1c834a4ce33e0b7339224d150e130a0f2e16d40e5ca5ad857b6f23c31da77950475a5c6263aeaa5a6442ded4c28b3d861b4416be458e32e22110fea2f66c62ec21040226540c14052d58267770482eecf4e93024a402adc0a82072f2ba7533135473583fbd2c8360b79202bb36a7ef836a529a7f4061eca4f73ed603da7868564ee1441bfa5e2355433b6db1ec81ebba53884da63918a973a3fe469c2e0cea38b2dea32e5f85a49a04c0a5ed79cea49d366abccfebc4e65b9e86461c50529815e1be49ce3941126002824700a061a3e4229c0c0acb62768c1d4ef74f51a3bb23999019267c2ac33b991db4395329b4400f87bbcb0f5e35d1c95a0a68bc03cdbe16cb3d789347d83b4f32fcdeaf0eda432c522f7420e53d0b592bd4901a8ae6fde033cc093f25cb8fa4b48b334a70a8fed0b26641708b19da179ecb6cbde197d7838a104219c28039b66a7fc987949c1d940faafadbab954bd2ff57526f79b1a594a1d2286e7d2a915a0bcd1a8cc22ff3903a10bacdec4c568920efe17272bf672109cc4c5557f0f815a0ab7beb8d4909bedd12adcb0fde5ac299e6e713bcab9ccd1e21428df8de0633a61d1d9d97713acf07bb530b999633450b6bafdf16862cef5e636fa02ea326e0c63a793d155f69613545030e1acc85a380e4b2ef2d2bedc4671622ec40a3dd8cfe8a832d0c7f6be95ed15e867386f7554fe454d9ec8b6aa5b4f810cd72fae0c2b38904b91976fe335c88f79db46899057c479350864f869116e5eb3b715fa32b9f2385c23310f4725018314817ad99a075973b44a836d346342931e577deff7e1e8fc04165a4d3396064728cff9abb8fc91206d70d88209df3ee9fd74c65b5105df0611af067630181913c2c0f7d53892f9569f0494233eb7cc3b60555f27249d0a71d260970e2270fc46870647a7f3c9272502935433541a507ecb4ad091123c20a6826ea733695a3350564ff438791b401e7e5e878d31c865f032357632aa7a22eb5ecdeae41b351edabf0effcc546e176b63d734895037ab6208f01c253d19bfa79db7efd775e150df5b0ecd300a9bbb9d3f6d9337e08ad142368f5125cc79abf5a9c2a60ef52b62889e47d9dbe2a167ea7b964b7e2a38e0062cf3f4618cb847cce32c641c20ea9b26ba616e9df47ceba2f631e7dbd81f715d76c1ec3cf72c4e23b9c8c566994724b43ba155214c617262c6a7eaf0ff5c570f070c56c7ae7cba5426288a4ac1791108d2a713a2168d1611e049673da9e29009510671e01b8ea929f1c005071e34b4d2dd8c3133bdf129b7fff19b8e7e61963f0adda7f2f2af3c59929573314433425948b917a0a19351898afccca67216a5ef7e61ab9207d93265a0a2fe8f4cd1992b84fdff01e800f516c4db607d8eb5ff1afbd9d70812e6b3f9a5a371dfb7fd22aaa5a9f479cd7a8be6e7548d412ffee59620581e399ef5b1e5bcef804121d848176037220a89309ebe9aaebeebe553181e915e53e85b98314b8d10bbb2e59a75219949bced1a5bc35d08c969d1e24814e9a3b167dd1e9bc0d14d35d74a15ca9882f330908d405aa92f7f2a1da63d910df66797d0dbd453bc53d36e3763a033da54d65ba0635415b1b70434cb274f8745107ca363b0f6140a4582a5b03db02a72ba4cb5e9aaa515e861ff8aff2d97c634b08aacfb67ff40c1825dc6878105097cb399f57af40cb14ba3aa4976308f61080bf1e91d7bb5c28aaae4349fb908be57df8c4108c841e17978c9adab3910c9e6c6018e05574d9e9ee021453046eb704440e471098459336c0c040a3d6434f5818f0c9b22cf6d53a913c6e81502324a391d6da505bc995dddb293e0c03a8fac0b24088227a58fcb2bbbb7bb34999229d5dc75466e1c2ccd0b71dc910320e010d5884c136586cb6c142036c8345136c83c500d8c6481ed8c6c811d8c6880bac0b12eaa5fa1efaf6f07155538fdbe3f3b93e3a16151347b2eee3fbe158d77355d3944397139a7238f91d72b9d5dfcac618638c114208218410c2f7de7befbdf79c73ce39e79c73777777776faeb9e69a6baeb9e69a6baeb95a6badb5d65a29a594524a299d73ce39e79c534a29a59452ca18638c31c6182184104208217cefbdf7de7bcf39e79c73ce39777777f7d65a6badb5d6bcd65a6badb5564a29a594524ae79c73ce39e794524a29a59432c618638c3146082184104208df7befbdf7de73ce39e79c73cedddddddd9b573a6584cff9e75e154504e4c2814d902a1863b7fa29a400836da46001db485102952d3cf0b98fa4329227b601c2836d8038db0069826d8030806d8030c1364052d8c63a826dac20d8c6b6c136360d4c1440bffe50424249aeb7ac96cff798f9848a50477c58c654967cae0a0754b460d6912c86a86c80cddc21d40b632a4a9230c6546018639a238c31c65490a81cf90a89bd9e277fc47ab93d2c6ba238d70887268efe497f74f533f7c3f9dccf1d71a18205632a46185329d20203c6545e185321c298ca10b669d15730a6b20117b6855de282a4f3c3fe28e2e3c5763a7648921f458874b46821f2a164ae88aa44439af090b930469e090543848e7880fe7291a13e3ce8c8e543934cc85a231f19d8428587158ca954c154a8d05fdd1117560734facf45c203e6b2bec7be3f64664fd52bb92610e8c8f5413cd6c888a8489eaabf3f246499155030c67244a161ac314d11aaa00cabe8c0000bddd0049aaa6c4dbaa2420f0c0d1b2a3cd5774c3b00f0b932c8ba4e3894907bdd1f9d0f45e199cb84e251c5bdae664c452565c3c281239625b22aaaaaec0fc6545054348c59f7ba3f9a7bda454f9412c6d8ae9ab0b0ec4a49915d2981728bf7207d81723497c0188b7e6946e75a3a3f8f1c3ce848bbccecff1ef1b20e90234a74a805df1e9ad1e301034d9793c9f668e9e14a801c5162312633f1c8f1388a09cad1457d2ceba23e560e28471c1d508ea2c8408e28f9184172592f6364574a3abb6ae24c30d64a20ba22abc8660a20303661eabce3de48fa888ea8f31194d3144e50e7234d1d26a60141a5b1da10411b44c0010b58932b363b446c2433e12001b062a3e30bc63e1fe949aa378208f684554956a77ad146878e4b87033050040cc48051e74996f0c1468a2b30c6c282012818b32aa9a3ffc9b43b22ab8531d623c92687c57eb4845a36505c6103850f52eac006fb5495cdd4e7d3d2b035e4028320c2e6021b60cc021563296bcc8185f1441a9e5882554b364f0cb9a229662e3acce108c7735d11e7f3696161d9acd880a54c2234a1e2848d05d6d858c0033ed838c1c4a60913308e1c988c4ec886330536842ef0c0494105f470814d05f4c018eb3c691bcec418732eb51d3b44a024325fc9c8b430f6b9991a62c9542db7ba463e04d34704aa3c1b09786023810c5c95d67f512ffabe1027ffa2ef0bd944c0061148d940a00e10c80193fea29a58d789c7ba423610d862038125623cd6f564204a8c70eeadae68f3802d30eb4ec1360ff8820a6d1e20a4e5014b30e600351863317a32325d119a98747868cbc5059424730192b13a1f8ac2d9bd51037a6c18b0b26100130c6082310e0b753eb2ee16515efb223972ed6b858049e6c0cb912020a03c2068b99e8c5ec92f997302a264c9a40513101c79302130b201219eedb94498582d727c4097479a429258861c491205479a7991fbe1162ded0f0f8c0d223292248b249e3c2da9921c993e8913bd64511f1209c30507b4f00cc2c2d32204c9f595cce5cc60171c2ed828a00d1b051861a38032360ad0c1460134b03e32161e15e8e40005f2115c684305e070f590851a2031c6133a0e20da30d156b08735d070c3049c4530f98c7a5c4f2cc8ba593c93fcb94cf2bd9010614aae1089ae48743b2c2c1b04186283802e3608d8ec0afd14fa2115b5955c0172b91e897e1d9aaef80a486cb23140caa6004e5827f49f4e27ff13bb9b18d1a1e90a1194238f75857c280a8778f0e0e8e0a15d3a3cb48bfe7fabc383078f1c5154915f890e4d5720d1a1e90a3df1d02e2e3cdc1bf1d0555833cf44bb34094d577c0e4d4cacbf46226b09679676716fa45d84f8606109000c020001211eeb0ad900004401c61eb1516983f9610e8cb10fb08d4acc2645114c0cfa372967489b942752689a9ca454b1b9b1871c53141caca9cd8d2aa46a73e3011b94456c50d0d81b941730c6a0601b14cdc2a9a8bde32b9109d846a386a68c8d66c846b384b4615bd8b02f366cc8f5d5862d61058723e94aa481b3e32b512568c0e940255c2ad17870382c1c8e136c80a31208a844007050c2101c1d1c4a8c8112656440070e4a0891383a28a1b22761c5240cc0a25feb07a2bfa22e2492208331c6246125eb39a129128ba8de88e79291627244c1c20213c3a1ae98188e355d333baa37627dc5c212d3014e2887b55d38f7c925e2e4439dcb1a813a9c113533a2667458574f5493cba12e6ce409cc11e999782e4b743f1f39978ec8b1a6fba21e121227aabfaec74e70ac0b9a389bfac19162622e1ff737be2e14505c4e45714253b56387384f282730216a141303c3912c8e745d0e68531cd07baec9c9358db8906242534c4c14319c4de968e1485fbdc7c5125d22d657a3eb5a9c99ebb95a118e745d77e25071672a10b5454c4c07383f71b68889e9803551d7a642238a338339928e8ad271598f6338a2d1570fb2a890cc9db40e5d3b5e8f36c7cae256562644554e72114f1e11a128986be4f3190161727fe6535dab8701086293872f04a20d10e7af90953a81786be2688e0efd15132615e58449a63e80900403c41638a1175180a00120520088108b8ed88485c53561619944f76238fe50848ada327f600063d80f9a31b663478a1218630ed071b9689747a2848585593e34a2734dd88a2a461c0b33e18310c6d80464f670c6198c85ae08498b1ef4c0f250823c8c40094aaec0831d581346eea01f0625741540819444c884a626526ac0580a194b04a048455595a6184ba1016329638871461b0eb8540ebd937fe9811dd6084d1f2555b0c30d18b38311096bd4e081963a9c810896883ae8b02ae9006c5c818d19e06023056ca0808d1184a84906efe05c0e0218634eb0b159630dc6ac08fd87a343c602ade1e8b004c71a1c3a54820e85608c55c170d0c1094a8430c131872bb0221eeb0a718284f3fa72724894c5a17444c1917e46749d20a17cdcea1af9f1a1282332a149eb1fd7a8889eee1bcc8079a2556aaa6ee8b3c541c2919ca53967535e514e387f8d3e5468ba9e4ef31135c3d1d19cba704c8c355953458940530c27445d3b2c3d41019aee47445dd3547deec4b1aec96af97c6ef54d2c1e599787a3e3529bf3202adfcfd7b29a4c204a474c0c87874c753d1f8acad6a427275768c4f9cfc789075d99d0c4c47242748da8eb5217f542bdc08046a049ff8fd00f79728958dfe40ab9a817eba91f17f512ba3e422f2a5215a99e499eaeb8a8978a62624d47a81e33a1960f4519a1607a9061c3382c478a1c3962394d34d1841a6750e3098c75aa8e0e0ecb145647871a6170acb0c20a35b4608ca9b1a2c603c6a008c661094dd66505631a2eae18c31bc30e58889a44f73d1c960fc184c4258d277058d270018e344690061769146139240e4b13fa7b74ae497f07949f88010c31a4400c23e0b0e48e07b868012363084dc882198c3110c311861446857376581d2a1c10bc08a30a621802181cc0d88d00b047300d002ef0852730c6a41c390a0ec659e04217345c9064469803f25c5345c97c2e27e643931dd2a345888f167be425c9243495a82852682a1113e4c63014260ce58322330386f2416182a30b65c8c85cfc47ba702f6b1ad2851d5c58438af9cb9a86c470ae9b0547d2ffa14454e6709e63018e94afe7e870a7a339a7a2384d4f9cd0168fa3c3717478076238143ac99fb4e61c87baa66f42e1cbd1315072642ebe46a2cf272647141d6b9258582c99db6307c79a2c998b774c617da66b34458ce813c32486f3f9e4700e069e5c9094a32305678b28385658c1d9c23918e030e9408c8e3c55d783a897e15c1fa27c702cc091663e94934b874539b980e0ab450b11169618cea674e8529548e6e2175d1c3d71583a3b26d05b1d8e357174e8175594058596b9b8ba7ae2845a7435d22e97c5b13ed3bdae3caa6e0f998b6574e8be682ac4b146435e2a690a504c01005370aecb094d9d101582f91ca242a2ebc4ea40a10bd6381715b22ac99bb0b0e07802179e608624499c8adafa9f10191b85260a0454f54bd068038d32a05106c6382c3268683102612178c1189b49c2188b3896d08614ab620ce5105cecd8a1843d304b66b280848a582f738d58b7b221171f936882d9457611075c8031266238ccf0006348ac99af2820d40eb984ae0889e5b1ae90904511b13efabea7850a62fdcf5c23d68bae132414102b025542fe81fcb0ac9f2a0a0835f9b0f61f115d22967575e8655aac9f7611eb87b58bec22d58b46482a0a0845f5b0be326259fabe90d05796e812691922737b5cd63444263415b1f008494b450171f22f445001bba6d0280707031c782b6a534ea821d4934b24e43255949307425130d48b35a23e4455951d61e1841af2d7fd4151413e89f5e4120951d305841886861f74c198e882585858587eb088bfeea7a22e0d193f20007b1085446602c1571c2a1a87c7680394e1304302f7351bcc074db0911e7158867c88fa61b5507a8444cffc157ad23d6803470fce601c4a8f9058b743e911a547560f9c31c612c0832f30c672fc68e69944c152f6c018cbc170f0e0048c735d263cd082071a608cc3c2b9eecc3349d93b00c30e0250064c13280778f2c4856287282020892206808223780660884230c10227d2c0002cd08032c6aaf0c318386954a0063d9680e2107e5802021798431a9813444460103908928302e420004224216a8c31160197323c8cb18d093230882b30c6363b88c4166630c6981ca3038e605625791316961c7cc19837e15017a722e28223070588030e1ca4c1188e1b48425397435dfa521fe962c65216c058ca2605a4df9a58585e67c652703096a2000368c0067b48b991925f090e1be8c051832dd4600835f8823186e270d4c0016400828c32ac4a0a51d385830665b40089792492f52e2e42c6d8c1185d30360587e5832f68d484c22d631861d635e18e154d74588224e931461d638531c6b1a2898bc57004631c1631d610430e38c40802632c07a70a4e144d70582eeb7e4238c400430ccd3856f0e070582c3134c0981812601c16315066408819881863d60e6b87feb776a07421045d608c594da84ab27e5f4e35ca997aeb3f31f995c4bccc05fd35b570249910f5b1a6916585a8c91aed50889a3820eb73ff7a99184e4c8e28a2b8de8ab15a3892f5219840d325aa804cd515baa04742ed90cb03e93c109de48712e933dd2bf41ccbd211bab7a23c16870a711ebb48319c7f8bc332f3a9be09c599b9a0109599640af415952fcbba9f10d5e4f6b0acfbf1a18ffccb45bd84aee740f517a5e4a25e28180af444ecf5997ae8cfa7c58893d75f08e18b2f66fe8a98cfcde1840e8d769e6246e40496228a7cdda91251954814c3a9a6095794be9ecf877ad99592904b0b057a223f2898197d2dea054855444f3d2eeaa54911d1f5415130216a2a12b2211b72a92e108a82b9ac6a0242ed90f5d38e1d3b44160a8a30c6383d4e9006564953ece8585e80c19864ea93e435f5e20223737b781131e04505bc58801706f0a200321773f46fd1014e193348490063294ca41c20c5005d14813126737b70a890b99810265803634c92b998a3a990654d1f1c2678c23ed3d513e571c2c2e203a5007a28c11349238812e8608c713897046d304ba34c3848e00346e120418cc4c508fcc0186b32e118c115248c63045d541c2300526bc521821656450174ba0ca360e34797aea99b98ea1ca1060a56bb4c61a315cb871b4a77cd13e06e8f6afa1a7eedc28c3dd3a19c22d0f45c344eb037c38ae38591ba8ceb7d4db0af7fd318ddf3bfeae685311a26585de1dc744a7c5f7e0e3f346c96db3d8cb0f97651e308e512ec9c18ba6ccfcd5ca7acae042b9fbba8a3db78cab963126c951a6fa8ab768777f333acc3bc65dbf83918f17e29fd753448b04ec7ac31a65747e7da8c22519223d8f8f0ae8e33c4aee5a7f3c90ba9de0935e4031a23d8dcfeba0de3ac19cff8ead4a379405304dbaa7687ae5d1ce3eb8d93489224814621f9b2a4833544b0f969eceadbede5e6fe310ec1bed71ef7735763ffa8bf53a3460876ca361bd6cda1feece443af7a24d585c47d5697f5aa260896fe7b3047c7f7e656dd047542ff993e23a272741d472b302b388e56dc6b806065d3bbfd6db051d79b66a701cd0facacdb6dc75adf6ffb5b7ed843638675b16dec707bd7e17dba5ea0dda9fe697c609fd64f52ead7b9ceb0beebe981bdf866ec0fe576947a9d41343cb0593e18a7abeeb59bf1a45e5dd60eac944f65ceee1f218dd4559755869df5dd87a586f3669829a5280c5f9674846874606b7559679413c64df7cd9ee9a20bca81ddf766f74fe7ddd0f7b4a64f731c58bff331a538cbe92dce6dddc0ea9aff1b7ee8b5ddbc5db481bd3b53d71c7fbbedba4b610d6cf3b97dcedfd929ce5a3f322caeee379d79c28b9fa3dbd1c0eaa751c32ba53f7d69c5d16ac6b014efad1bdc1eabbb9fb367bafbd48861fd46e75b561d7fbb1bb135037b6b7e38fadb5a4a39217d61d858e77caed5fbf42774e9c0b0dadb9cdbbdf8ad4a7967a7239d0cecc6cda5d4336a7723f5e799eea8260696cadfb369287d579f128a44231858dd74cb39ca58b3be5a46cff427efe954ef84fa44d7bcc0c2bfeebed1ad5f9c147eae0b2cf59befcd98ce37e97e6f818dd7dfc3f1b508a55339a1e60bdbe473ed0fbfce279f939ee9fa8a9ea461818def390de9ccfe1c965b7ba63bcd0aacd4fb3aeae2cbd2d51aa367ba4569e8b1ba2c8d0aac7baa357d70dfb6b3db3805163f7aa3df97efefb62bd6a0c04299ef84713b7c6ece173527b04f5dad33bbf932d678568d17d66d2aefdeed494d639e2d0b4d17f6337c9f57e60d63cd7a7ba67f6e25a3afc879f517904a4d10299634d237756bf8a7673a753eea5ca04d8194c0be0863bd186fbf9eefced4f9eb90a0e5eda8ae6e3aedefb2673a7585a60e94a3ce5bd51541078d428fc8086ccb93c2fdee67a5957a135d22b48ac036faed5108f7bc717b082c8d3ac72cef7d8ce5aed5337de6993cd12542e58c759b3a296b93f9d6d974135d22f4899578e7e77cbbf9dc9e2f5ed634a43ab10dc69aa97675ea8ab3feeb296de2304f7db78675be97a3677a8419d978ab7bbd9f8452ba9a75abe2b2d7fdcefe6486ad5ead9b65e9750fdbbf4c5f432db367bab4a2b2fe5a7d18cbe65ce28da1677a44e24e2fd07e5c5818dbbb0ce55787abb7d8a2af1189ca97251d199175dff561fd36aba6b8d6e7f22b2a3bca62dcb096355e28a76cfb4732554b8d2f4b3a5a84a84bf8aeacf86795f039f8b2a41303b2d7c5afb4bae95cc77c6f752a3ebfe7ae1162f8a0bbf8c2c4e6465f83fbb986cde5083dd32d1d1a5118043662fc6a73f77f5daed83dd3a38ec9e6e88dce7c69c5184ed8746872121a51a10e75168fcd396be8d037c4f29d5611687a58c662fcdcbb2f259e54e6fc2edb3aa7f37bf355bcb784fbbabc75fe76bd7ee97e9cef84d40eb9e429748d48d29b2f4b3a5b5b97dff2acf06ead6ba453263431a92d5b8733c6d1b5b8277cb44e08b17dec1e7df7f1cdd5eba4cfa5bb763ae7f31d76e7bcfe949ee9a1ff74a48bf1478c75f4b55cefd6f8b5dc66f4cc8e3539af1dfb68a3126287bf3af9707ba64bdd79d07b44b79289eefc3595a7d0686ee003d66985f1757d1937e9f13dd3af27df9119e1d71d793dce9ad5f564b885757837f9195fdab2a64e9f7c59d2f180076cac73df7db36b10d3a7556af2654987031db0f9dbf53b23c53edf9cce335d4f9d17cd5c730526c8ca4ca8459266421746be97251dbbc44ed772d57abbf85eefb93dd3e305da17e0c09335d20af56b19fabecebd36d2c25618738c34df9fcf719e4fb4cb0acc90154992244b44757cbe2ce9e82cec6cfffeafce31bbf610075132ef53e80eb56ef373759ee92b30415668f5978b0f49d23f89a82c499624557f4d408eacb8e6d525d2fc20c9acb0d246a3934fba196b6bf5b1ab2ee68da5ef8f907aa67f0e51f573a8480888a496884202635bfdac5f95d5b9ac145614be164042e1866dd7ea6f664ab3bbcb114867f3e6a4c7595b7d9ee9ef0a2cdece8eea78b5bf87733bdf8011f95e6e5a9b7315666faf3a16452e6cf7e1db309cda79959ee99a42f252f17d5953e7d05fa3ee5a534788b88f2e1bae58ba2cdfbdcd1d19626184b9c6292bfe87bd5dcf743aafc83fb3debea58b176fdfcec16cc052072f9d7a36fcf47eb079ace9d22546095ddb58de26e95717fa26dfa140542572874488dd30dffb153e776b8c2f7aa68ba84a7b0b62db9e91eef82ed49ac68f9ee9f99b74a8eb39107b657e8831a6d54157a7f64cff10f5c99decdcad7d0e4fe9d29b7c59bb163dd3698f1f165f19e3bf5c5dffc5707aa62449d28bd525cac247a4eeafb984d1b9d92894d2b3538ab7fbc3f5e5abafa2b6cc08ff8f8f0834b9081a85de05da4e7a587774368f32b6fbea762df6a196afeefade6e34e32d5d34601b6db3359825d653be47cff4ce73979ebf49910c58795dc36f57fcbfe37eed99dec9d5752f87662cf883876df0e1db22cd544ad83acee505da4f5a619bceef9ffac38be184d533bdf96b2a04a37b4b15208aea7c74d5e908800a2bb75397eb96b1e647aff34cbf2aaa01160ba1a3fbdd74eeddd4587ba67726ad364f37f1c69aee8cf586d0339dfaa456d71bb73bf7d93996727aa63ba12a998ebb69fdab9bfe2ddfea17fe65498ba77651527cf78b2e3ef44cbf40bb268936be5be795d061941acff74cd7a14b69779303d0be97f3d5aff3b1935537cf748f3512752a6acb96151f2b302b304356f22b71728f549ff1654967c8b3d7df778bd1e5da3ec3ec995e5d4feeb4bfa62a0beb66b1d2dc68e51a8156801c59598119b2d269f16549270be72e657b51cefaa874f95c4e97404d3e1fc9e2fbd74dec5ace7aafae927481b634df757babae784bd75ee3eaa2f44c5f8109b2f22198acd10acc90954e68ea88a84a4b575da2f71595e1cb924e15ad638daa4e070253389413909e504e2e0aec6072737e263a64741c0c38f770a4d0df91d175a4c80145143aa080e202fa3379728e27dc8acc643561819967d289c289ea89261c88ca93e3be49c799c8e844f92d1d15b000053a9d2726d07972411590800cf591a13e0f88000702a007f8575b020ee0342007039c588015c5260a1c500199fa4891808aba6ea7733d790b30e14e2080ee6b3481038046210378e73d9d4eb62690040a000501ac070cc0515405010150522ca1ef57100800050070bdcc03542c09a47814379c132811d078e7769ebc0458154060c9431b340fbaa114163db8803102b035a4a00d2d713042a55346f89cb729a41d52e488028a0b3cb16201279ae05480021390400420f000073480010bc0a180043081800318a0000418800096604c40b10463028a1579a30d04606bf0a28b1646892e524cd0185ba20e84609a4168e6a0c182e60a25f8a11252616309190c618cb9b00d09604002cf86049e9c0116f4288109be08c266048df5800765b0a045053cae8a4d3d385438ce139cd07f1ac78a2638a1ffc410a4c108452461093d701006184c09339281993200408819a90a8eca1a74604c650e292750794307949f30a6220738a00ce20deca7ab7a1537b4c1491a94e024032a6c5803632c8c261eab922c35a0c1984a1a984c68fa8caceb8c2b8ccdc536a22f587c00065506aa0a95227c2ea63e68b8aa2b624ce50c4b98a10c337f450b1853990219669e099413632a6a34cd98ca184054880c151730994214916b0a25f98ce19305507ee2b1ee57948fd044e56b02421654a632754487feb23e0bc654d21003634c2a0a480cc2c0189be9c1980a18bec0988a17bac0980a17b68004267f13c6b280852b6c40a007152b30a652052a3095294821743d305f51443e4f9492cf9df2a4471bf85893cc0fb1a1241774add11533a116d784854587a62b269f2e00ca4faab746d58b46485e18538902cb9388ba18538182ca1318d353c709ec7a02ca5ae8ff5012c65484a0d2041526c830813115345496a0a284eb33b26ef0f98c5ef427a1a2aaeac960210304949f9071860a12185339c21bd45086cd85cdc6c2664f81a9c4008c22a81061088c2161ec09e13ff8ea0f25f9dcff41bd3cb1fa33a2b278d07dc92f7a623f9f1110ea458792886e05237a621f08f5a0e97e7c505528c95551a21ffa4309f90fbe2f8ca904e1f31901d11f4a929fc81000e527d5e863e4132a32f3577c9a9bf92b548000e593d721f7547ea0428619b7003185b0401023859833984a0f18735a30a6c2831d30c6184341805580ce12e694e84e013a1a06ca4f9e128b6a31b5905a442da0164f0ba7856bf1d50bf9c0123e1004cb6d81862dbe80a94f0ff7a4531ce8cf9405632a3778c6546c5003fd453e1f32f47f68b08b7c3e2d9f4f0b632a63588ca988111a6dc65466f005632a61303db980f1d7573944f9604c450621eae53faf090b8b0702d0014930a61203f76020fd05d40570e6562df882b15012cbbd262c2cee356161714d58585e136a875c2c6a875c78847e088fd00f79d07d72893ce886ee75350feb7ab44be835880a59153559224b7fa62c7854915f4968b4b5747a55d7c88ca67a5cd5156997194df5e0c1c3bd2adc4b72e9a0a32aa8f3111dcd3c132847937b231e5a8040dfafa01cb9261d968ec8cac20e9b2cd490c5167270583afbab28b220c246577e25d6246ab126d1fd884093122c2c1827940f168447921eb0ce4fd50593840e63ac022d6c73640c6c73e40bb639128431d6002aa4a840dd1c696c830520d8068b25b04d9456fd996648d8dfaded8ab58b14cfed8fb037be1a377653664765738eb050427ff351a7afdefe8db0df2494f1377e7a5f8d9d115637ff3b1d8defedfaf422acab74e3bf98527729c68ab09a467c73db386fafd85b22ec86b7bea7dbf96d3e9d4b120c501061f1dbb7cadfcf219cd445234356e408e510f6b5fdef49e922c6ef74348485bbbe9c77d4afe5cef015e24d29618d113a74f2c5e9e0ccf9697698b697b7bac484b0f452badd73f5c93c1f66cff4ea2b4686ac482b3a1c84d555c37f72ef3adf7b924e4158f77b4ffc8e27a5133b0d84dd8fe2f7d41dfaaddaa37bc79f155000615dc23ca7d4f549b71d6749aa7fb0f1c936e97bb95dfd176bc79f80e207abeb9eb2fda35afb8e353b41e983d61e6fc477be973574d5258241e1c31ee29bf545877036e8cda1bfe9dac9d8f67618ee06dbbd287ab06dea889d431827745f6b1e6c960f7f6e583fd96083120fd655399fabcf61dddfda06e2f56549e709ca1d6c7daf46279f7a743a57d886fdf9f4bfe5a71b3b9c9b1d6c6bb8be1cf16e33ceebaf0e767f9b3ad628f7c652cbc9867df79bbaa86bc4f33637d78093521addf3369fcbe7a0cbaf9bd6e7d863c639df7a050a1d2c7e30361ab7cc34370c9b244912d54c01650e4dce5a9bc72725ac4fbebadf5feda673136af7b1032872b02efede58eb8b237ef8bf76bc39744a408983d5ee395f5c5d95d121fd8b522249d27c59d211a1c0c17afb17b337e7383e7cfa0d36df88a786f13df98e9d76c374281b74d8a484b5c6d6e4bb5a567ab3be3f73be75b7c16e77f3d6991da55043cf6cb06dded70fb1c6535377db1aecd595ee07e3d42e9b6b570d764b579d3b77e862f40de30c50d260b184b15db8f5cbafd04d499224daf168453458fcbc365cb1c30f7b7d7806db1ac5b83dedaee7e79a51cc60b1a6f7a95ff9d34dfa50868152060bb17b584297df750fff254992320a19ecbc32477f7ac2ec52ef7f99d07f3ed793a31af6debdb7c6f23508df431f83950ef3def5c9fb13e20ad3bc390b4a1a96d698f7e74bb79675ead6094d328f29758ea4cad0f4a91e245f9674288a18ec75ef4df9f4779c323e9430d8df9e677d38a7d68efa9b56a080c1d6aae36df735cf9462975fb0bfe3843736ea60cc8fa9674ea2db792f4b3a128a17ec7bdde884b8e9bca36bfed97103285db0f5bdfb18ce78df5528437d1e0a17ecde17fef33def7bf0bdea992e430dd982737142dadc7cae515a6b9cede55cf5ce3f3d53ddf0cbc8504344d48b24c9509ff8aa4b84a20537298475b62963756f90ce569bbcb9e2d89e7f75d0335dd4a1f26549a705250b166e8773d6ede8942e3f2c5818abbb784ffdaf4e78dd156c8d5a4e0a6fcb0dcfead20a36d2f93484ff784aa7b3ab428db23e176bac74b658a1d7e96accde34c513d6d62e15ec67773faf732fe25c698b60a04cc1bed44d4fec326ae920aeb50c1429d8f8ea7efffa395dff522c064a14ac9b4eeaa871751b5efa7c800205bb6996377a8b94ba863ac6f9b2a4e3417982f5f7bb5ff5ebb67caf66da91018a13ec3bd8aeae77dfabf57cd9d3a336c1d2ab73c3cfb76b90ba43cf746a39973e509810619cee39950eab8b9446aa67cc9756b827adda9f675a49926a44c3560c258e50c3e9dae3c34bb0336b5ab38c373625d85677943b6e095b7bd83e09764eaa21d5edeafcef9e3cc33e95f16186b73eaadf83936a5c808204eb6a8bdb9de7f66e361c256976dcf9cb92ce0cca11acfb94f0b62cb7dbb2ba68041ba3d718efdbb2491210508a60bfbe4c658c777ad59ea3ac44b018625873846efa75af710856d38d5b9dde5ecbb4d52d043b61bd10c7363d4257e50b82f556e17409e7fcafaf518050e16d0f6e9721843fb0ade918319cf4eb7ef78f6286757a77ce1be3bffa56977d601bf6ac33ddeeed86b3a63db04dd3adf1d40dbe79a3933cb0f5e64d279c0d3fc75aefafe00a4c10941d389d6e3af86295d4a7cb09a7862dc7f75aeefbb26acf7499093fbf46a2908b73f70aa50cbbb3dffa6a8b4fb6ac67d32e1dd781cd324a27bfd17f3fdf274a0e5cba6bd04527658befb953f8983649a1f47c9dcbd3331dc89115575da2a7040507d69f7c137fa5f061fc3a72484b8f22438248e940506e60b3ab6db6c772d62669d3d51d05f95c49a2b50b141b5857abc3a6b796f33a7ec16f9600a506f6e926e1fda6b59624a979c7b33581a04c020a193656a7ef5ef937d7173dd3c0babf7cf5abd5ef7679c2316cac2dd3a8779bd8abbc62d85767731b6a4d31c4b3350ea0ccc0c69bf7f597d06de7d0c130acfc2c71c553ea28b1dc0e0c08df7b95d2189bac8f5609676e4d62edaf6e7f1419d81a27aceeeafdb729ceb0c6c04a7ce9f6187196783eded4baa65b5df20c1418d877a57fd4144ab9df73974519711507282fb078e38bdf376def6d664dc9407181a5aff98c0def7c9fba7ceb7e7cd41aa0b4c0ea1b69c5faeeed9e9ed23dd3a91db266ae11499224da718af285adb746d89eebfd1e694575ae97814e67101416d81971ceae69bb8de68b618f151f2b2dd3f5f890ad05282bb01a6f8d5b8338dff96f6e1558cfbae1595b7e75d7aaa367c20c59b1a6c71f2829b0dba99bdb5dbfaf3d8e1405f6e24627ac94b6a861845eab172827b0d23dfacc7e31d63abe2d49f46549a7098a17b6b9df37678f0fbf8475d78ed300a50babe76fb8ebd31bd7a869f64c9732039a4ad8b7bdc128e1c35bbbbbe9824434d2ff43bf68a45fbf2268286175a33f1f95534b4863d33043de246cf577133be72ff3d4f985c6d048c252d7decf08efd3325f7c6186ac4c303491b0db63ddf8dded4ed74cab04030d24eccdb5c97ba9fcfb68bcfa1136cb58bdc2d8e06c4e296ca1ae90cba57184755bbb747aba87b33f293dd3affd9f4ee7aa28ab135d236cd5eebe89bd4937ab83b1f9555116648475d939beadd6dff1bd5b84adb2c1ab5d6dae23baa0e93315a58ab0f546dc689310c2fafc3ad10c8c24d50e2d439308fb3e25d6cff13f89f3db4a24a979c72722acce716b19bf5ea7ebbed29233976b3fd01cc2bed4b039fab9bd7377f820d10c8c24cd5c92d4f199cbe9406308ebf65fbde9cc2fd677f52e84d533e68c3fcffddc3f6342d888b5c4efb5fdce3d6239085beb751ddddc2f42f9f487da90ba2e90151f2ba24b44924417e49a0bc2d6f6efda9bb966fd506f178fa00984757f5d8e32620ab58b384640d88bb3deee5b7ef9dcc33f58b96fc6f9622cb7bef83dcff42b34793a1f82c98a31fac13a591f6e0e3b87d3d1996312347db08d3ea9a57e776ee7375f3ed8bba384f9ea5aa5ce0ddfd7ccd0ecc162d864ac3ace99af8bfb453d58b79da6b54d89b7abb079f31868f260ddbddc78cf17ab4b4863c48395ba55d8f0bf99a17cef833bd4159a5e4519a1ae908b24b51368ee60ff46df7a63f7dadcd81b7425d4a10f4d1bd66386f7bec732ef19a9d694e77a2293a825d28886c60ef65539dd673765d4f3c12895a0a9839d98fe8e6fce077d6b4c914812f42692e4de71e84d1e1bd6e5d86ad5f775d331b617e51a96ce2a5df3fbe24f389d337264a51d59f1b1d2b058313264c54a92247d44a0496a78a0a183fd8df3d6cddf7b0aa38e4c3e235cab22fbfe101f2b4a567cac5cb1e2634592aa67525dd0fe23afa91749922469ba6484660e565648e776f03d75d92af64c0751d5865f19912410550191a4cba11b412307ebda94b2dde8e8bb8d21ad2f4b3a1a1568e26061cb55bf7ef567bbfbe16029d454d20cdf95f2bebcdf60af7c5db77c9e5d75cf19aec004591151d50f491251956e1a37d89bf76eae4149e57db80d36632adfa5cfeaf46bf1b2c16e4d23dc2e7f9e75e737d76031a412de87ad6d6fd3dd33bdba541590fc22249294bf096dded19ca15183d579ba0863a412bba6b469d230a34b07a38cd4e78c3e9d378d2b8538faadd263fcad4183c50d537dfda7cb7ac2d07f3a54a8533dbfa672cc1dea67b0ae758c50ba6f714247a914a2a44e87be2ce970a131836d6e6a186b94fa62d774037264e55597e895c1e6b8e763ea669cd0694906fb307e14d6f99aabefdc55c3e2561d3619238ef7e5fb3e3fbd7c13aa32224972bad5713e09cd18ecc6f5797b74fbaecf697db56eb192a47f089a346cfc5b5dfcdda6ce1a7b6e4ec5607374da6074b44aece0969ee94cf215c12849d30b4d18ec6baf35eff972bfb7eb7ba6239195e4a10183c558bbbd6573f5df749f9ee95c7ce7ca710526c80a17f641138c0f49facf85479624d197259d91e60b75d6e9e073fea43f27db742d5618a76beeeaf7d7e47e764766fa7c5eba271a2fd897718e6fbbff4ce1bfd32b345146e0104d172c75744fddf6bd7eefa6ef99feba1df1519dbaaeaf2e6baa2a8c860b56fba3b24a3cfd9dd6fa79a67f46a0f719119124ba06cd16ec9ef941ec8e1f560d31f54c67e29c50a2a885460b16fbeb57e547af51e2a953716139499224284792244992343532d064c16aec9a7cee7cefa7ffa8673a75518f10cad1fbdca97a4bead064f29fabbf4935cad25f96743aa0c182a517c6e862c38f3e89efbb82bd4ed74865d6704feca07c59d2d942630589777d34ffbe53ff8b585305dbb0c6b0667c2f84f4c646052b67c3d99da3b07e8cb569a6603de356dfc50e7abc39cb9114ac84b06e077ffe0c3b48b983cdf35e3a238cdff4dc5b7aa6d3a8e4b2284f67125d6b8c9436ec8d70ca7777bbbea55bd12549923ecf5c9324499224f95899d97baa5e09911649f2b1e29e2449529e24a9e4935f4b92c822400b52ecd0a88c59e3bb3dd3aba9e33e6152ea60f39b18378a5bd478ef0da363a362c7d5ddd590e635ac6389aba34ef574173e6d410a1dec6e57ba7ea7b47aa657175d8109b2925b7cac54a1070139b23253c1b8f8b2a4938246ca1c6c73d7b3bfd32d4edd60f44c87374891839df94109b78cfadd8deea6c4c13629379e323f74bf31de70b0dfe474aaa5cbf23d0ce71b6c94543fbcdd7ced36f8a417296eb0bf37de185e59a7f37a771b2c9c517b7498278e373e6483ddb76977e7cb4f238c4e6ed59c4bca1aec76f2b1934ee97ef90d7aa653f72a52d4606bd37257ada77bcbb865e77aa4a4c166b775d6b5550a37a4fe32cfa513844a4183ddf27fdfec4e7d42bfd59fc1e68ba1aed7f17cb8357d9ee92ff39f4904cacf45201f461e1252cc60f19d13cb4cdfbf37df9c2ef76987281f3f2489da920463829432b43cdf6d774d1dc63547eb65494783821432d858ff6dfcdecf9ce77e77922402c91435ecf69cf77b74bf7734ee36065b5fad58ca48e1c3f73e9a868dff93e67befbc7262872962b05afafcafd76d1997a484c1d6862f748ec2ebe4ce1ace9802060b6fae19bf07a5a4f0ea27540f49d2ff84c26e7ee1b584d8bd08ebcceda9673a04418a17e8c7ede8d70d9b769fcfed486e87942e40a7b9fa7eeef2d6ee28a5254992669e50956877b4be9234dd0aa655575d22943aa470c1a593d8b9765b9ef39d674a1288aab624adc00459a1710e295bb8587adcef71e24da98e5ab0ad3de9d37da4fa41bcab67ba24b91da464e1a386f4fa7d2a9dacd36141c6dd60f62a6b7e7d85fde294ee4eb9ef74dc3cd357f41cad80268f253559c173b4d2a015a0d68f237c31be46a5ce9ee9d708d4f97c6ea6d788480848c422a50af645d78fde6ff95bfdb83dd3a37b0a156ca3534e59ab3fbc5752e7991e2d4af4e2dcdfcb920e929429449f703a6caecde9edc1f8a6cbd06d1ae7f629efbb5aa448c1ea9f4ed6ec4fe7745daf67fa8b82750e71d3514bba277c170a36c6cfde5ceea7ae3eaded09d62b6e533f8f314efad279a6cb10a438c1e61c77d37e9fa637eb1782c9729ed204fbb6d3747aa4feb03d779bc2042bbf51ad61adb76e77cd1d0d1b1de6b804ebedaf7ecff0b9ada3739fcff5f15e90a2049bf1eb58617dd16712a2d709a7cbeab2b9e79ca49c61e19377bbedaaf4ab6b7d2948b015bea9dbeb8b31cc2d7e4555d5a71cc1d22d75931352e7bae997be821423d81677832d4ba7637c72d32258a8ab96f1d5e6ad627c2111ecb7bd23add0f38b3466390aa50c81462adde3a7b9e297d14a11827c50c2592195d4ebf32825f45a5b8eaeb79e75d61904ab73ded5bd86bd3989bfa500c1bab6bfc6ff47f36cf06bca0f6cc62fbfe7f08e504e7d3dc50c38ab6baf52d76a6dad3638a1847753f897ba79e1c7ea03db5a93916637357d87ef7ba6531e293db0d5259c99c2fbdea3d39207b6e5475f6cee77dcfb6998b2032bf1d3b3c2791dfdd8fea59461a1db2deb9af1cb534eadc148d181750ecff9fe1c8ecec1a6afea1aa93248c98195f8ffe148a73fb8a5ab0e0716de3863ad1a53a8bded7b034b6b76dedaadb4fe76b8dac0be7e7862e7314ed8aabf1ad83df593b149f9cecd3c9d8c7bddc6efd5877ac64d039b5fdf0d33a5f81f53776b6c2963449fb0be37e574d249fafc4df8f7797bf3c514312c762af1de305289b5ce50cec0c629b1ceb9d53db56fbd619012868554c71731863fdd4138c1b050bf99fdd2ad21ae7a3b507ed2526460a3acfa1d958e3ec6b3c5cbfaeb0e01e5278d052931b011ee2631769bb638b5969204841418d887d251df4ec65869abfbbd175838a38bf7b96b3ce1762e4992f49a77fcf96b428a0b6c9e70defbd9b16e54cb2a4992e49a4812754d9c9b91d2021b5b7c0ffa6db46ae8365441ca17563a0a6f9c1f3f43f77d535860f7dcf5b6e81aad583fd5292bb0f8de7b7d6387ef6189af4b5181c5f475ccf5c9863d4f083bde454a0aec9bf8394ce77e5c67d328b095c28d5bbc38c7b837dc27b0b4eaaaa76becafa5dcd90b4bbfe29ff365ea974e7d53bab0bab6989de30c1bc4aeb94a5848e3733bc2ba299dda514ad8f6dfe8e74b33a5726bf8ea359a84cd17b7f9343b17f7de5b5b496ac10d4958df4e57092786b5662775246c8e34d256ddc52dd3e8141214beea5e95d5fdcd1aa9d388e5d4cee59cf95b8cf73dc2d60a5ba474d288dbf3fc92249d23ac94b335979b6ed335f86823ec7dd1f37b0e697c35436784c5994e8de957ad3dd33b33b8d364d2d17bdc588475705ebdb3bbede44f473dd3afa97aab53519f997b75a20bed4e471196b64b65acf8fd4d848d5fabacb5ee0769830f23c246a861bd58df0bdb75181fc2d2f6e0efb6e3ccb0ca070d115d95b0396dee39e7b3d2eade863f5dddee6decfbbd10b6c196f56e75e64b08eb627691ea26e7c337e134c18d41d8a91bdd524a7ae7fd3c2b1041d87f92cefaa0bf8db7cbec2bb811089ba9dcae3d381fc377f812206c9e77e2e9f4ad735fdcae244952ed38bdc18d3f58b72f6cf3522add0d3f58e74dbfec74c44ee7199df6c1e687f1db5efdea5d2bad7cb0cee17d387594f2d6e96d0f56d6d72a9eb2bab99d8e520f16b65a1b94ef9ee7e74e5a37f260ebccd0e56c72bff67a3e1e6c9539bf1ca9d3b1b536e51d2cc6174efd52d2886186af0ddb1e8d7753a9df84f96a9776b07b4ef9eeb50dbdeef7eb993e733faf231537ea60e7744ddfabf59e51d2a83dd3eb37a9463ee2cdc00d36ac9ece497c5f94ffe6c4bf8695eee78db55d9ae3cd35d2c1e246dd3dc2572fae2dba3958e7323b9cde9a5f791b96836d35c2e9393a775d377c6fc4c1cee7746eb3d557f18bd16fc0c1ea396f86546eecde63279d4619dc78839d6def1d77fe2d659e53df708395946ee820761e9f74fbb5c1c2e7b9b9d72a1bc5cfdf0d36d808efdfeb33ea776fad8f0837d660db7dfcf8c5f81252ea1c1de3861a2c7e39ab74beb3fc0bef96a4daf18ebb9106fb26a5ede2ed3acf4a9b43839bb5b9da28ac4e4ed93c46f748b7f6c754d38af78efa0cd65fae78cbf7efebc78a9970c30c967eae97eaa8759418ff96244992a4da71f75906bbafcef7e5bcb061b7b52683a5fbdf761f5b93bbbad8d4b01bd7fa26a6b7652a9bdc63b09246985f6eeecafaf3b634ee9571d6e9ea6dbbfeab6278de7cba39278ccddd94d5bdbae384d8f79692bafd37c260718dfb5df48a5fa4504f305898e73f9cf3a3bedd9cee0b76df77d5a33bafcf6bf41b5eb091b6975a66da72d50ebf1b5db02fe69739eb27b7d6aebd1b5c90deaaacb2c629a96b2fc249a3638f5a468df1fbf9e28d2d5888ebbc15c32c37a4fe9e0a6e68c1d20c5f6aeaad6687299e59b0dadd3c73ad2feaafb3b91b58b0f9c61bf3beb2bd2b9fd6f4c615acde57c3f9748ef5c1989b15eca492d6d63ce7b6e9c4efb95105aba33fe759cf3831cc17afc004f93173bd2ce95437a860e1db6ed388b76bf1edb8a760ab86f3bfea7dfdc29782fd37bfd6a9e794adca1d05abf37fc453ee1963c4170a563fa7b5ccaee6f7d2d127583875fe1bf3bbecaa7682cdb256fab7c12c9b9c4db010cb0cbf6e47378d4d32c1ba19e5f307a996b565f768d877ad52f85b6378e7747a09366ad97ccf0a6bfea795609f83aee9e6a4cc3edfe72458a775c296a5bfdcda7bf80cebda5f6b95c29763dd8f04bbdbddade926bf69baf5116cd415c7eceef5fcfdf11ac1c28af37de7e43b5c1d17c142bfd25d877f43183d5622d8bff0fdbe7e8feb747a0ec1c2bbb3ab7052f7995e298560dfbcdbc1765fdbdbbd0f82bdf349bae9dd71bbfc40b097eacfb7c147b57cf8c51f58aadde559a76eb945bfd00c2b6fa5fbdd86d851edf8f9c0423aefcc7246a877a5b707f6e1ed1ed6fb23d6d2511e583ce97e7acb99378e74eec04a4cf7d4317ed30e7a7465d88c778d9ef36ed255ea5c07f6ba1aa1c7e8247df0e11cd89fb5392adb7bd9a5531cd8a99d467c639cf7d6175b096edcc0c6166b9eda69df57c76d032b6bae10e73775854ec31a58fc3abb5b699e0fd3e7645899e76dfbffe77dedb54d03eb1ac6b1c928316d4ebe1ec366d77c36ecf2fbb765cc62581ae57450c2ea1f1f3f3c03eb5c7defe93c356efaff8661a5ce3037fdb9563a271876d3483dbbf84e7e83b9cac0de989fd3d2b5eaf4e318035b63a5eea8cf786f7d8dc2c0fee787317b6d335e89e70becfedbb0c718dd731fa70bec8375467f77594e59630b2cf4bf384afaeaa4983ef985dd124aac277cdabd5c290b6c84f2ee776fd6bf7bcb15d888a99b0e63778d2f842ab0573f87fa418d65c3db630aecbbf7e618a3d30e3a5c5160e56becb1d61d7deb4c4f603d3a9cf2cdfd1c74ef7961bfbea6dde7831043e76e74615f6e504fbc5dbae7708395b02e23f6ed5fb7a41b6b4ad84b9d8357435cb196314fc2de485bcc7fdf6c7ae3f6246131940ea3ce38ba7ddd47c24689779e309eafa8f431a9859116a390310000009c981b007312003038241c8d05a3d18054b08ceb031400034e7e62aa4e3c18c963c124c7511044318c410618420021c600820c54383702793513a7c91280b511ad6d9522735c2a27fb90867409efcc57c540f375e0df93c56a4aa99b00f0b687cf290c6430a2c704aa3713da25c89357278fe7aeb8ae9831238410c75c8156fb3c0aeb32f7272093abc6ffd74562a6b1f62a2d66c855d36359165dc2bfbb1d3448f276fde3125139830313506d8b4858696eef3ec9130110aec8d2f4598463dc699a0484b7d2ac7e029f2da19398ccfd9ec5bcc6d76f7f76200eee0489a088b9365e455de0523f88925cd55faa1318fa2080be3dc0800640606e4986d574e0d20c65483a7f9d834ad9f82fc1755e186ecea81f4ec956c6a16ca63c983909a3c5785038f4517bd0eabce68274c0ed259d38b641179a77ea3a8f5c575de2402aa5f4ca0821f7404aa342ccca0685a32e7851aa47ee15a5ef917434fe4a0e1cc7926e52a154f11e639645053d2210db98da3041a373196d1cb787b14092e5ad5d14b767377b1b211f649a3282f60f27a4f066abc76a400abe786a6f05a5f69b1078d6b235ec9a03cb42483835160b5102533cfb5553b55090a90f4120246fb80868356dcbfe4fe9284069e3c54af047d54085465254f8d745299a9faf708cc33ff2d9f53a887160412750c28afc215e41ac7ae23ea32922002e1c4d81f58e14804efb764d6448b4f709be151de2d7563f715bc62c04c0582c56072f720e96770ccf051f3952080c60ac05e67c2b75d1829ae8c6dcd9744da0434cc3c54824af50d409b510196c0f9fd95e776178473d06f990e10d40c824e905316cb4582d439cd19012e60e75788d83239936be6c6493b5b3247dfa9e84d4f8ea8750b0d166d3b4bb4433f091e54b64f8d3c2d7a24e8a2118b20c8cdd7b109e3a9b3bd1e18f3f3c262278dfc5aaa71379f7b7a5cd50b25dc86233b515ccc85a0c371a7d4bf760e9872a0c36582aadaff6ec64ff6d93c1065c8a08e35b8c4100fcdba2f7cbfdfa898019fa1bbf62a15fc1a9281bf1450d7b634cb1f4ee5338e7db74bea9d551f5dd58f9487ed6dd329ca2e63853c5ba40247885a8b56e7ec513de484e2f4e4b8a36b58f2e53c91aa2485244342e87685b102a77048e605202f7a226b1ec97b1ee41e2b0a6925055cbcb0aad792f9b12aa802ad172a6b900cb17508a031dd99399d219f2cd6e609d9b9d902d970907a2ca25ec65cdc9df384c1376cdfe783be9fae93bed866a6c498ec4302f684e3b66a1a5a30ab709a72fbc6d35959bca8655ca6e4270cfd6dc7402b81e23531ca8925b869d6397cbd7f14d4c4aa6f6e6616017f45ef52fcfff988d5f6fcd68e00c4c93b88741f012db69f1c72f655f1a4e3bc14101016e0f3a653eef6ab5a23fccd4f8782f126c87b36222b94af66af6cfbcc0f813f5048447503c6428de763159bb58d1ab927a01f75338954a2f68efdc1b16a3c3787721416ae4a1b676598191c29d5b160bf1e243d16affe6b0cfb5d154ecccc1a43a857c0876cfdd497acd49ee672d57f166a2675091235ff8f6b720734cb7321ab7a3f1d2162b4857af567f3916151cc5aec76886e284bf0a471cfe129dd6659ccee403eb5854d19932322edc84b6094050f0bd35ad0c498139a16496a11f738f1b235220028fd169f4b6d6354c9c10dedd3d8d50f1605c91f48d2de10b6968c9ee5f86566b694051855b234b5c69e25f8abf930864a48e39226f312ebafbad0446fcf0f02b719a89081974f24d65eaaae7baef2914ec544dd9562f59b4102da6f4a4a0e0e34cbd7c79a8682b6582df639b14947f795f5321e3cebfcc765bbc4f5bfb1580953458ad428071dad0ffc7c5bd079134fdd3e49618450e50f7b263e0029dab5fd56d5b9a923623fb5c52024e9b0971e35a5229009a948ef4f0a3429838b5b80ee476689e07b23131a5c25067dfb62f971535bdbcc452b63cc9b5399fe475f93a12a17b9a4cdb0c131155044f5c42159b76fa99541f80b9f6a00b0f3defdf3a69abf1130be6fc6590a531e2ec6d8445dda86ca3dbabc958f62cc0890846dc3219e6b0fd0e7364bc45f3f2596aa799cdafd59081485482ce9704172900e0904f5066d2d43f1e4b0681df5dea48a39fd636747e06ead356548cf52c385109ea9419dac9e3921ef7b4034ef9aef5bd59795f48b63db86d615a12aba3051f9bdecbe1905f4f743cd2a5d84f5cc562b70bf037623d719bda0e98e96420c13509c40cafc9c81d2a1beb8d8a682b2f07cf11a1c4f26ee88492a4efd6f0e138a9d73617a1e60257e5a3f8a175d85f3cd7585b0aa8fe50ded5bd36096b4aefb2df450a5e9d814da5878d0849ecf35fc246cde79196be9053da8379dbeea9644f0ac0f9b16ffa9ee264f56893e46a38d0f3ab792142ac01c09800b0b02de543031d6329132bb9db4e465a73cd6a0e93270a7a9413b87103a4f8121d9aa1de54813ccd3a39b0912453e244b31a13361d6012472ac43c5f1f5d7d77dd0c3cd246d4d507843353e0e2ed44467ac0aa659702e9795bc23dd2920e4865af9652899f80c38d77da4aa6cd1cc0a52493e73b4b311f0f694e63e71d7d22c04d8d27948142a758eab8e285741978573f782cd1f35cc3b2be4d3b1cf5dd6219f7d927893f83b5b6f9983636d9ca34d1a8c47cd03722701419ace2de470bfc31d4cbd09c3c1f83569c66805b74577c5ae85451b3d2460be611f7a32d8a1a064ab0722ef688ebc402795973692c48925842fb8cea03eefcc7a24b38f87156cfa68f75210cbd99174b8b0e2cf728e2a342fc30ab83d3076b44c97e78afd4b366d3a2920f95e4a0d2ab9d73c93c39ddee2e53f6e62d849a3cb9d7591663e2a6bc7b83e2aa90dd88f5fde5b9cd7861041d17e8fc4cb5a6eb99241ef2e0408e9475b92f4d918bc370db807fe88e2ad34c1cbf2bdddc629761222d2b629a5bb70bdf30ea19f46a7b9da61a3007749374d4cef4937666ee8328b7a7dfb5801d4434ea57c3d44703b47b6a65d1e94c0055c10720aa1f5cad919df032d1a81e20d2d3da024febe8ceb87850832c3531d32c1e4524ce0810ae93a1f7e66b171b66b48c69ce96c0e734b6334d6f7f74a15ec7a7b8fbcdfc8164fe1c01b089c41eed818d025d410edda7fed860c3a129bd86b34a7a7309da8be3cf0814d8f9913591dbbbd1186516ac455da3fb0fbbef2cdcae681a784cc447c654ea1e1c71e1c24ba02f8ee1e3d0ae776e8ebeeaa9d9ccbc62d04266e317b87f9c789573871b3b07970b2525a943f1346c5811125ee30b3ff98430c545e914f8783b0105a6f371065e58c858e0c175544ff7e47ba0431b303f85627f63a0c76e2e68e3aadb7e6b3469932b7aecec02ad15c676e330d29d3bda62ba56d69566f36db4683f1b7a687437f6d5c6bcf7ac344833ba73b916dbca62bcadecb466136d6e7587e6d5c6baf76c346863e8ae11ee466ba3ca3bf271b3e37507661953384cf331b1c6741647ee1d2b5b659cb6fc49ab2745d6bcefc394f72a0e74f6bbabd6367652dccdbb3c9e38d0d5efe5daaa58cd6d3746d9afe3c6d3075deb6e66ad6ad7367952c49977fe3045d79bac26db67f107d70ccc4a28100e796de497ca0bb45f1a5add4c8449c737e49a5c80d4cc953a4eecffa4f2a0e987d98cc1600e26d015d22da4f5e3dacbd6fd4988d0f21d5eb8f1e2930e34f12405da45c889e441887416708c2a9d9960dc04948fcd2d05e3dd0d5930366d89a7b946463902005062ef18024557ff428d5ae50b26a0859aeee721810bfdf7118366747db528f63b64987663661e4acfef73748d955d5748581aa49f5e6dc4e440a8c2cea011909ae288396dd4d73124d34fe8ea10658a84a648c17390fdad525eeb71958a289fec1632d286704f91e99b42f17921ffccf887ff96ceae4de398e6077d18c285bdc70889613da721eafbb940f3b2a3a3f2cb8d0708a607db79a6f530b8055d8c2c94ea47d3666ddc3545568bea9f7ca609f0e19c29d51502a00a9803105d98d6c2a9aee04c7327499e9d344333b4f8a6d0e641f1ba3d7235b12c6b231aa699208001809f0299f019051e78dfc9079670099cab082d2245dda47e132701f1c4753a61b5485f2a740b65666507854fc5558941f582719ba5237dfe2c277b2551430f9b16890d596d23e2a4b4115d7b896ededcaa75991d178485f7f352cb99a0df0d80b9e25c4cfa016861053ced9048b757473f1af2f14c1bcd500af1d9dc59846552cb2320dc91e715d5190c03da1794d7965954fa157e453fb7f64e5522eb9f19bd8a2ea3573f1a437d58ccc43d5391b45b59ae3e89ea75bfc89cbcd995a5d38dd35d39ab3a0155c6bc0bfddf1209401e23aaf9728ce6d5d9d8382461a856852153602d6eda42c9fea3acb4bff512922c85c9aa0a009b2accc7d3231746c6bb179a8f2749071e2712c8402205b16dcfb2c4aeb40f186d0c608945f20f84fccf11ea4707040f5c37d25098a0870c45eb51f73d3d9d9d26472b9532ddf5851f055b2ec657ef597d38791431009fd343d4ba98f5259a659a24d588f99703d858befc39cc1c9077a0120b01c4028be575683c543c272f2a0423fb21270be2ad87020bbf5b436f638db3c28561f3a9a2b773afe6395ec3307b5ba647af7ad57351593a5b8d9012099acf38b4d4601fa16f87d335e90f29b61f82969189fa99e18645954e0905bc3bf8ffa4d32b781ae41e3b4198ba0819a1d393a85e05c98a6fd56185be131e01a2775afe6a7d76717381f88018ed8307d435f916b502209fc7268e438f65ff6551b569ab54b6b6312e59aaf670f971c11a065e26bcbcfd5d610b1326f353477900780028153d277b09fac131bd8343531d40b8b73ec074943065d27aed712e44a850f8bdb3d34b3d1018b56071a2686403a66f00abd25a711e687393034e29b502f8347ab3888258d436086b512a12be70b13346633679607626d0f953c39fc847d4c0c0c3543b0c3289b5fe5a70381e2ce6b728a38fae2a81b63c4133a6ad518a8e0f1d7ac9701612144cb4bf2e30467f9468056ef7e2abfaccdecc6a4c7e5c58fedde0b7223729bf79cb0d27979ad06012786d9366303bf430a439c558f4d53fdb9593da1e6350210e4685fa88cd547207548de6b6e20f6f0c4ac1f614e754499fe95d198725e73e180b158cb6c457ab65c578b94fb2971903bf7d602e6959f0289f2420c652728d8db4111bc541407e74c86595e14806ec684235d524ead9a8fde34ffe0c324f547de9970c6f8bfc71a6119b33dd14d155f2a4b5bc3bd0c3e9f0a90ab707083804c08edf6c1460c5778efb31d3d637529022553b1818be6b6bca62a8f351d81500fd33e003299f4a6e06cb81489d1edc68a4e164385c852a8ca44a14659d0f9dff71266cb0bb2e734f62968853a0b02504c22aa22e29bda8815c19e462181223edfbb554fec8c949f3ee6a22de385a9f13a93e1563d987cc90937662027cbc9519006e46f3cc330815f415655a4b6de936183917a778485d36abd1b639de4cfa8876c6d7635fd3f682bec27a74d39feb2ea2ee81a2362cd536265c6092cae4261f166d68eac46cf260f21a60ab5b32626bea08a8104b9ffb6ae61fca23d28d3edc1df0f38f513863cb3618ffef3944090c6da5e3d5662c090426649094612acc4d203207ddd9e2896f0170d5aee8a8e2110d7d4700e0bf354cd351089ddc4c466291601ae76683342d5f99e101d01077b0efc1d612f51f60bbe247c09fd3369f4352ed134f0837c7b913e58d41ea81de4131b2fca2072dc09465d8cf5cb05d913ac01e55ff5df6095b4d5c0da916cdaadc3c8a04f08147ad6d21016fc65013fea71612f66a845f6ba7bc2062fcab7373ac96a311ec9eca95bf76022548c6c5bd64e8246bd5be4e6954d8fff0ca8ad0318e95f1a054b92ef4b7448f96a10c0593e8c424d500fbe63bf06ba96f7dd86ca6d30d9b58996c034dde42d1f72a76d0bc313ab81496eaa656b27b3ada7003e0ef06183490627554f4c4ad4aec9480626570a321b0d26d00a8c3420123b9c64696ca95ffe1c429db52f09c07963807d3cb3950007405a75019681fb8855649cefed86225b02e805635cad7ff005548bd26c574c57f368635f606431ccdb6da59575d7753980e56e6fdaa68dfe228310d437d847ad119668c15b05d5e4b3072b125692b37dfdc604a9b060168944d6abec8220ab9f474626530f35f436cccb85d7c539b1507bb7504dabf68d916253588760bcdfe603c2bd208f429550934bced60889c119b7519ad602f42fead85a7e10923aeab41582bf2ea4347a91902b90204c94dfb1d9f9cbe25e1a5ef06aa0495f3ceac8b828ad2163ddb248f6dab047cdbd01c26ac4726e9301ed20aa80617fc5855c6821044bf2805f0fd932bc6ea9494d85007fe273cb38b36742a34b719b13d7d2a714ac073962786b319d10f9ff6877eac0b36517bbce71477b1bd6e6db658206a2573e0d2473dd5904f9847cb3166d74c3ad13ad19b36a337ddcc4817a1797f88e82c2abab80331188e2c2a9f3e9289fc88964276ddc97ea8704564fa7fee0a1b1230c3292c5f38ba4d0f065d1b898bc8bbd7300fe641b46e902240545e3f923d54583f25a2bfad1a5ce4d122ebd3bc013eb277b77d28f134dea958739a46dfc16c70870dcc0cb3b5b5873312378e0dbaffdb04a823ac499a1ab6200e82633a55488a07b6355834c7551a6352cbdcfa846689decfc447bcc6d7498ceaecf89bc452d3f6bd3c5ec97862ddf43b1460c6ec6fe3fb7828590f6386058883da9d6deba3d947be3d3955570f24e01dd4b0d0833401bbddc1bc70cef5a0ad44d5b51a925504053a6dd01781f91df85f35d8ee4c4bdf70a6ffd68202277ad18bca07a7ccce43b6fc542020d34ad20f02e6cb6af6dd370d8edc5de04d77faa771aa0416c226ad561396d67fb5d63d35aa1e0614dd2a78a0cdbc34144a925cd383b7eae179a40518540fdeb95351814482209c1838780f8ae1422cfb04524e1e0924cb03262875f9fab569c8eaf45a15605dde2b0a77e3651cdc238a314dff4aa6ea8b218ce4b3b32cbe05b967a052c7761ecaf9d04c9e6e35e5ee3969c4a17da77c9a46656122286a1ebc851274586613c385c886b3c80d3700afa7fd2d04fc647a896b7a38465ed98672de9ae674e5264f1ffb534bb5cf069e0e64154f1ecb5b9de158d0a1119b63b0e4ba071e637a942cab89c9202e068b3e0da06851dc2c631f59707963ac6e1f9dff8de90691244371b246f9c9df2dde81d6e620fe11469720e8d23bd48dce150cbcacf14f03be4849c8a605374a18d6e26ea9ce9919d4c04baad165ce00a55552eb526cacc80c9097a96a886866d7cacdc5d67abf308b543896543f5f7050199cc6aa81944115dbac64e3f36e15cfad801e37b9fef4edde1ede15d5925ec8c1db9d7e4209642a9365805b4e40f146709e1a07020a805a2ad75790d1094d246a980326fc0ad6ce19ea6a5a2e9abd46d2a62b861a07febe277820599d470293ce30b895636280443c7c2a330e0b75c0207aa3479a12c393cb01c9898a17344675e299ad7ad3b1c518d0bc8bc9ded1de1afcb31b05ac9dbefadd5f82e23320d728da96bd8fb878e956decf6488e83414128b10d353f0c83078d32f99da710f3937fd8523b935d3e7f93006a8f3c620c6cc87b254b656cd95988142ad89e253c319d417aea2df56b1c4dcb20dd046b19be8cd722ad48fbc47beac459501bc01b0547c1eb3c0c9124799ea35cdf41a304147808ddf5e3bd92d51f3fcf3a9634cb8beebd712eb05c6cc58422dcba67d0c7cf9eb49c6f6794ae7d841e469ed1f96cea13e0c13820941c9a6319bb991853aa62259d7e7f7c0a4e149117fe7c37410178558420ba01b622504a3242742e6f96e6247896de25624b0cd24e45f90b608580c79b4381e3e459315929574b707b88cb9025ac4494d54c23f69e00d43b16bd1b7fad16c8bc725d92010bfb75bd9c02952f1d67d8de2e45023b31a72ee4fcfa1e3bc2f6a4b7ac04cb2b4db983d44e50f1f37d48834b8432f79e543c29cc1b743f679b37c76b08340e7b98771fe3e1923e871b761747c6af30fd289a59c559ddb490407121ca5d1c64a73fcf85ec115748dbebabd072c01301723b0090b0227f9ffe63835d851742092c8cba1550b7c9d6b0604bcc5f0e24560c33b1ae10d03238d2752babd8baf89ba70ee978cfffb0bd1bf8efb265357487ba1272cc8902329ed88a6b234e22dec346d240dc08517bd44d663b407e8669245a25d8a4b25f8a73cc6e792bd1120b5956080ec508a180d55562660836299d460eac87968bbe258ac7a59720951b8a919562e7e20b09cc693bb45d41eec1f4f5410a5ce80a60c692b302bf829582a553e7e13f548809335e9d34a6ea3dbfc2af295099e28987fafb9447af65cac9c64cfde2f840bb5719592200cb648846eca88f045480afeef76d32e12b314cc76e058e77a24811972b05de1a2d41848b5166451c2410ca5767aec0bea4f5b334db61344d4f87b3390ed355e98102ad5c76321300456f9358c251d5341d1c36755774c36a8746aa7b7863ad13bc00d59bb33ffc24825cf6054c702ef2b2e34239532e23c349ab70b492331f13cd32a4df0ae95641e5ad5c021dceca41a517b4cc87e71f11fc9d285a7c957123547746ea78f86a00094ba4f62f3fd8841085fa4f716611c6f016674db065de55aa15a9ebec6ed1a704f7bcfc0fc57fb146ed0563040d4d037b77022c5135392246584c204bacb313ddad640a767a77b82b21fb721c0b5a8a5c8cc094269ea351058975613d4c268b147086a8025281b1b165c6e01e85fea5d8781ec8e9023a204ded0beeccdd228a2073e15a1c023be9f568193aae64aa41ee31952845ebfc6283d0f5fd0e7130243ad3d5f0f0553a062583caea3729e70e5f2891c100bbf7c7c8da64252f6a7b48b4164301abb8a984b617de792f9ed9a69033cc5490b00708e288bb402d43692ce15b1a13b22e2912b91667240808c872d2d111e4a1d2aeb5118739e5a9449d9156d871c4f50f6b33092e558145bf4a19d4e8078709d75a7f88bdd9981947f89597d5d158a81dcb265e13b3328c14d820490a6b2fd1c733ce08cbf501b12a02a0f54eca8263409966759c364690d83baa2438f1a00f24f203db8a50d7ceb1900d6161061052eba5fbaf56a8560ea377b8331fbb64d9e77c0ca4c1f22a8827a65d33d48d28408b7e26c4fc885ff6856c224c334612f51eb0ff45c056fb776bfbcb5a5e0d4fbca4fa046e0d1f7d4ecd29d281a3493c7dd24421ace52a4abfee7100676437ab565794a5ce713a6e92044937dd3dcfa39782b689b004173414bcf67b722146e3390c334ae26d699014a7362040930b9350702cde3265ca77ee9798f2bd9f696555476205dcf8533a8faebb0c04c90554cde7529e232e56cce0724147497729e8363d28aba4e9bc5d96189c52ed2cde3f4b0542177a9a7e6ea9c3072027a303d832cdfb61079f849d2351fd71a46b7e7c75f6b8caa93ba0eb9dbf76f1b96bd3383f60d90bd039fbe7fcb6f8c0cc4c5ae35e1f7b2e4cd3b35cc9ccf9cb96ca4788a33fafb1a45b95620f1686ecce9301f9de7126a8b03782e8f356d7e2df1a1ecf5aebe45d740f6b79cdb565e8e64a10284fbb2e41d958945a585791227e83b6f1161f62f0e049c9d702fcec3cecafa074aee256d07e04b196e376905cb474ded3191330a2c5d3ceca6a1eefd05729d294edac1fbdeb367b326d970596357f5b21ea5c0838334da66fef77ae6be61bf37def4846efed2f4abf51bfa498c65ed13e87c4ef3efd806c00916c66f00c08f87d907ebcc1f6eee6b9424ff8ed9334f3692387bd3a1ca22b1b0bb8c1f9af5113bf22a90bfa69021195b4f729dfb82ab856060ce321270af04dfa71619067c08a9a18f28dfcf10a9ccdc783beff6d801eaf741589f579bca49e030a5d3ee9ae809c7f0a76408eee03df83c998fa517d05322df3235a7cd6f739e16ab52687f02e83e06a4d1c1ff75a00e7a901303bbe751375137c7752560c48960cde80b3aa3492f295c9fc0b4dc98451f9650047cb54195b2c72166c33a1dffb185427e46d9e10cfe675341b8e36f9eefc29a792688211de6d6e10765435a801eacd3fc4684edf4d08ce9a38998ed3ba8669caa0376314143c08d8f682c66d464e54ea26b232caa6b1f71db09197e558c2b4b076fce8ad7e3104a3e37164c38119939616c4e400ebfcd75e0667a39aad2bb67fed0590301278eb95f285640c00706f503fa3aa3fde4c6ee4e487c7869122433fe3e12a58deb7fcaafc621ff22149314114d22466dd3f3a18ea38dc955392a140dcbe0a41cb0c07343589debe9717ebb61879450d9f6bcb5193bdbbf829ce737b3e2f77182fc5336d91a32c89bfb0f7313ef582c023353794461b6c0c599ca23e8b92624f53f9f5207c8208ff1af3e2d2e0d69754033fcc734ed20258fdad9241d76dfb498de17e8f4b19840dec658d354dc90379fc6f4b7f7053cb777879c5952c7763f2bd844f51cec05d1a8d8ff99048e42c71850316c7a14c23b265b7d0424db4bfb0304a0ae25244930886f36b304a66d68dfdd2421a4e566f4dbd4aa151b9a432d511ef1f08ab4f879b5e09217dcebc5fa6b188796e0c121eb6379145d07d2a4ec54318b515e5854f4423eeeec39a4685b754fbab2139816a0123d5cd22bd2dfeb0369060903937d0d6c0e5a9d169899f8c4b261aea3bbbac96f5e10f063dd9f2e245dea01d6eae6482d43c570e65fc53c3b7b42290e31cf30f8f520069d2ba0b146b5cb28dce0b514668a16f7dce4c24e6895b776e483a85f6f72b9183e9ea9974abb080f7fc2c19ee77fbd3936eaeccec1bacde75df40af69a71344d579ad8a84d14e8c00f8d832a7beb24672030fc2cb4b26e21a191604b398e6bfcfa33d471f240ceb27316017b31cc4394b25ad471e24eca4c394858b450d0d5ead804d9d8e50d2a3089c2fa751eea7d9157bc110098dfb1b9ff8e3084d0990a9baae0f28e87354ea0e4ccb10144926b8bf4ff0baa6768300af34900c8f3b782c76c22e4f64b1cd5a79c94c8b9a4c79873c6ee11f2c4e666debbff5acbc34b8d121ec2c363a1614cf3631f4ce2efbaa094446650a428fe5f6272b8256cb2fb2a36ebd612d34844eeddc5fe4815739bd72330a71640f62080cc08faa9c6886edcfe68971e7acdfd26074943b77dfb7b08c9ea5ffe3e1e147b7481770228dfbb042dc3cb995a29c773da4b7965c29caf050ffc4065017f92b0f4a72d6fc0cc7f2255806d7ce6f7390f93526709b23972a57aa569f635bb8ad1bfce84abc5b9001c8c30eedecbaba9b2fa034e07005297fd1377445a66cd93a31a2caa068073eabdb32461a9e3cad949bb15ddde5d8025bef1ccde57ba0671eb284db6dc3e6866007483a2c87ea286d610860bd42e335678d22b01f8cd451e110a5708cd3fbfa2d0608ee647fcf75a607b851ab7a735107ebc8c7ee739a50033612a34f0f183ce7e1ad4fe7a13e236ee5fdcc7273a32c44cdd70bfd80d697c241583275c28f6f3f001f9be8a7ff3a68c01ef29e7333fb1ae435a1bb4d7daaf570ecc7521a28d21c2bcfda89e9c630f2fcb8dbdec4eb120d814ab4cdada240d252303a2adda42b927ef64b1bfc1a71c6c89bab1b1b770b13ccde68d867b09b4916a30b04ec96fcedd8c5ce3fb8a51f7f3527cdb6eb96c9b0c43f51968656c18b5bad57b2debbad2ed732eb704087a3b830b798d0ce480807b6e00a5e9b35d76ec55bf2d9b985eb2d37d9f72dec506f95ceb5d0cc38a25a258c86b735fe3759e1ef1c22189295f53a610dba88238259e30a213d4306d93ba8131c03ee6cd51f58b8c14218ea0ac9f6d161ad936471d1f20c3be10587a34443570541b9b010dd04592d5ca196e10d46611e37caa3e841372f03b9452dd3e31fdeea79cd1b1d47b67041fc450dd99355144dd46cdada8ce484a0fb1c3e69f97ed7664be60a8a854d7fb381ba20bbadb2cfa7e19c28b022ec02e4d673fe1e00c0abd7c53d5fc9d8fa86ba56406ed8428a8590ae2a96cc6841cc1718b9cad47a5f190dbfe1fc0125198151e99d955b065833bd68650e86d951b141b28c08851a23ccf2898f88a09a0d4d03995de5e97a0ebdc5ab0ba8ba1102967924b10a78a977919a3cef5511d88eeea965a68fad121fe764ae223c6c7bbf7080493fa00d9f86c36a617b82d5e0630e249c403bb99134649a74f495e66bbc9955a7a27146e751283c73167f5c8c9061d06fcbe1d276a1958157f1b7af1363764516ae090c2f42d65c0d79888163094bce8e88145f23c987c944169623dc8ba86f10ffd053a4f969dd33dc4f12454bcd1d8080e54260499db40c4d04545d119f989a40fddf7a65d3527227901d4a24da809aad9c6a20f17014c6ac92c942b9c700e494253f12175a9e2e44eb5a836699efed6a3ed9a07cdcd2cf037545a4806853016bdc27c4916cdd7be912242328954bba8f909259e4267f4030037659e05085e6d996620e5782c7a4e663e635afcee0487668040ba91fc8ae19d8469110fea340a8a7a01df41dd594e3dbf008c1e8fc54b3e27ae0d5d3b035c1e9a7b4d5a9632fe153a3829ee267e3169f519dd60f0e259ec59b2c2f7d0b5292b726d4ed0e962da5b257f33f18d49adcfea068d1fcb6ad79011ba9fae0d0e3d839c1f2d7d4c1b97327e483a3a2ef7907c356cf5096c61f8ec2df152bac8f7e0d0c4b17bc8e589b5a7696301cb4f71a793ca5ec2af86063fc1cd8c2f3ea51e4b173c4e643aca2ec76ce9869b6eb639a44dcb6cfe62d372cd1b6b1aace612355dc55fa9ade9216414422fd5d678123822e17715353c0c1b91f885ba7a9e068f22f44e754dcf01a3117babbacea3b09109beaba8e759e8c844afd4d5f6303c02b1776a6b7b0a1a8df04bf51a9e858d4af84d553d8f0347137827ba895c69c6114250911ec29ca91ba464ca2f3418f6fbeef0f9e9b1b679a670a9afdd966218a02c9f9c08e9d8b17caf03f7d8a6482ae9eb154831d357681805ed777cbf03ee1d8aab64e93a2bebc02029955b3c7bfa7711b803380ecdc3b3cf1b5131cde100cccac7454a9f6e0301c5cac9ee63c8d06c6cd2078f21cd44ee1ba2168c3b2989ed2959d40c49d06b1e488703e84084a918fe181e6a84e4160cde5c3a18fedf9331dcf2e6cfc832720f7f672fab0ecf6304b5b3b224b7a517a0702dce6a09530cf3fd4f282a5b50842b71a45babf81b31467ae62373883649b0534a8cdc625b4348857076190aa38d14b82f5ee68fc741a361f7293ab56d9bffc7b2a9e3feb20577554e4e50417cc5d57727bdd73831473628289d9ace1148c29a67cabe3bc8514f1a40d21713036db8a05cb78ce399216b7067b55e15d698c2d36a5b0825b673ffd78ccd0aa1ca3433eef47d06d1ab4132734f6cf2ba11c783e7f75047763dea67e92d09396f66750eda688ae26ada64ddd02f19efec8dda4ecd05c1eb9f8535acb46e271e0c75e8351ab4906a3d35c3b1907a288b52a9b08744b7c16402938f669e95c0fe2631f2f2cc11caff01824213a695a6d215c221e9e89e93409d38eb2394dbf179597e48e7ceca4d0210fef76b36dbef2413b71cf430443bab29808bb97330880db7fefca0a333e19f4d857f842d5707a201d1754d4bf0e678a1ab57cbda0f8c9a6b7a9934695fe8f7b770c2eeab3f7341c46b914bfc43cbc5e362192a581b175586e3a29564df5959fdaffe044685896489e5a103edfcacabbabd4b304d551f70ee1965c4862e59d09c43756f0e0e99038fbe66d5debda60b344ac4450899e546059a7e6cf5f214ce1f8c4858baef651648185b1f93998526d14194a8e99e92ae80d45a9db24a2cc871cae5f45011b9fc01289e468b533f0779db6830fe83349c55a829b12800e9b46573c84d8ecbf5ee3ed7fd64b07622824a96e51caa3a4e01fa979455191e0d75a3494390a6f4bfe1dde47817551abbef31f587c96551b71d7307ecab4487c5e461b8a027a582139ac821ac303d40cd9fffcf1f8b2446a08b07b0e6c8f8e061ca5800fe6e058a1fc8b4e6183aab3be87a12fdd93498855c2f8a3746b7f6989dec4c0ed433ae02de0810d4d136df9638bcdcebf7d872de248b262322e06d64b5a7797bf9b38a8e249c2bc2976801f52a8d46feff8455751888ddb4098355fc18f7fd883d2ecdf10b7322c44d8ad3fd0b339251ae4ac3f021001b00c710a48db83bd32d55b9b998de7c2fa87ac93c99bb93879fb078282a82c89478072ac70813c53946fce73cff8378f6669a80236f161cf74cb507b9a29509167247a60f314fa44cba4c0c8514729919854042c14c277ec0614a5f437eb00d52d999b56a3dff72690e72b21402732eed4911092a024ee1793547ab0eb3d5b54e033587f729ec2688d1702f157cf8bb844378fe0ac3f261ca1eee5c65f3ccbafada603065cf7daf35f9e092a12195d771f49e80553c3131dbed6ce3432189eaff451dfcc71973c6f002f987f9ca10744af5d6bc43a28f1cac3050c845d9a9c0ed271781cb299604f3c5a8595c8622de59d2cc165530e8739f51df3fd815563b254ce91888b70f8f73e124751821114661c8ddb50a46be157d39ab764c4b15134ebd5e8a432588392043c3189447a2b0ccc1c4d74c5a74e1fc888fea255be9ce2857c8381555a16da5902934af36ad58de9334d17b529d6c7b23ff3f149b8c97f65ea4138cf77d78ec8b2f7e6eb1e280aecd9d30e923575de827f1909baf3f2c70857f1a8bb4c7fb35964eddd5c695bb64bb58888311835bedb47da5dc4ff515a18e7c970ba780c473c65473640e1f3e9032ed9c875c7836d15b46107c3362fac3e0b4a31d3621191ddf6b73b2f963362cbd7a67b8e687001ab34c55bd55d9e752cf1b86e8eba61a52b5bc30e8be19c3e58b9cd48c98e5fef2a639b6d947c40875f6a4acbb903c3af4e4ba8037e58e15ae31a0c26c2e87e5846076099812ed65292be56f97a988e4cb5c10fda2ad873fbd7acfca3475ae9509cd2140ceca897458cecb1f91d24a461f54bdcdf1b425a95df79f9b71280f0985f2ed1f726cbefa916f454793374f0fd3113339252071311bb436e6cf26b864b7e9e6ccfe7e84fbbdcaeffc89abbc64c4ba75a063de028752b092eb96a03642f933b742c43c5e783c2776cb26e0b0c101c624c3759c9ef05c3ce06878d415b6cc8148238f72e9e50ead0c09dd2eb50db7d68d1d9adf23ca83dd3d6bfd51c3e28c9db8344b28d098689d1bfe44bab94f3d566bfea0509010193ad62805eaef6e00988f00f28dcebd07f678101807824f8b55ae3b2e366b1a685836dadd41fa3e97e62c9d79804070ff9acbff366792a5c4f2ec7f3b24f3f3bf95021b0bb492a6061fb47827046f37097823750c9b77d8a92df4c3477dc6aa99a4a79ac2859ab165d7555aba7229a977a853f17b90eb196143cec4cc61c1d312f24c303502d1aa8970c3bf7f88bc8130dc028d8b58b338b1cbe0229ffd308416f676aec9b429443afad1c4440f092aa3eac920ae3542213264238f4a93182e35b9c2d7c9574812c6ab934ea13a3090339266f6a3c401165d4627fe56c8b6c4577c7a49bcc7608b9084dcd7025b45949bed19991c8441c1b81ba0e65f842fb721710dff1369e144eb3fa7dfaf44d6d22ba6cc774e1949ae065031f86688f19f48b33bfd4346f60f50e4b4c734909f3789f02aa60879bcadb32be2b3e83c28daad90077158ffbe79e8caddf7b627792c1cb74b21e39a41b4b015ad774d9861db09e48f519aaa6ad3dbbb7ed54c34b4297e1727433f385bb7e46bd9510dcc3fad3d56d249e0b62eec47ab02c1ef9a373ab57c0855b0092728a469fa1da0e817043244261eb85c7bbb04f0d3b22f6992c2779b19a5b750a7724f03321eae55faadbb4c818284922854da6d6cfd4368311dfac42006f58b66e39a064322708ddd1da9e5f82ac9480775cb1e16ca37372b33c2931a7b1d3d18de1237aef6a71d13f28b872e6ef50c99248fa57dfd2a7bc7040c941e0ee428effda06d36f52b54550326d67d71fad726c3aaa726e92e4ed5cac8e9d797aab19a259ed415c2ddadc463f55eef98f2728bfe24726ee179edd1727f2bac6f3a274663835ac2497d1e42211ae8c90044f350a4bf97355a8be49bfbcdcb38229cc26850fc297f991b924d3df5b8115ca3be2220187780a1a9ccacad0af65efeee5433108360bdae2458e9093a8ffa8b0896760f02b7c4c4d6dd1acf43aee5c26f3056a43cfb56d4981388f2d3ab47b8518df5f7a55265f283daa7304474bb3de1a6265d7ea7e3bddcbe07b84f1e31cb3aa9c32c126829e137c6aab0f6f658634719a2e96a5f438891f78cd6afab39212059f23b0bb15c722177a04bc1339b89a41fc1503d27bf7bccf1fe7db41fef7364f98386ac6d4e0f1d63d93923c9f585da88ab7eca1dbc954a52b5fd564ce28c4d7bc3a7486dac979d6bcb9a97a35a3b47add727f443498cb8998a6923e6dc78f3face0f09c4e819916cadc8b9bc5812e13fbd161897167ac7f85d1334f683eed2fc2e731fe4b71c377b63ac8abb4f33a541c4098faab7a4773abda227f65cf8fd10d57d295413629ea9008357742206b28d4c6100a6c1450072ac52766d580d16c253e16e57e4418490f5559039d92108d053d86d231e92910185de0c6522db9393fdfd62aee0a5973371ba7637e44f741a722ab53813b428dd7f2372e62ec9523dea8765624ea65e698c45bd8a0abad8a669d191f5737aa6409f96eef7d7f95b3250e5ef745f04f8f44a4fdfcb9e0cdda5ca1d4c9e23cb372b07f808b422f274235410d0c5c25a03adba156f18e722edbc5b26ef4988ce90ae4f965cc195ba0e32dcfd3e9855ee03136ad8f7fb25dc48aceda482787c5bc1cbc2e314a8d72b042e571aca7d4bfd04979ead16098420047db8e32394aa6754c56c47d0a549967cdcea5af1c46c35169ee121436724f976b4ec83dd3fd8c237b5a7e91024652c4e4cf1a2fae336f5bc5276cc6a350bf0cdf0fae07c5102f85f3dcf0dd6d312143eda9aa5ee49a960a53af4d34dab428b918f0eeecea0edcf452216ccc44613400d6c22cea339d49639321d67416aabae6734db0a0ba0438b7e391340602491e1f541b01afe6c35a00177ef898d5f8c703085e346e05df4406896f18cade50852fc130eeed0589dc9eca9671c136172332e07241842be47aeee33daf3754017338c7518f75b7373981e99c78aeb353059af6b030e4c607a31f86c88bbf0133cdd0b42086d0076cee68985c74fec1d93359fc3252189f9c34c9630d04867afbf6e846e389ba3fdb6377d6243eb995bbee3f09de1a406021606f1306caa852734f18795adbfcd7a9e2355f3093966ac0718b812c105f0d0eb987caed73ea55e035c11d37ef2c48f09c840c359c294e82a0808089cfbeef400d87bbcfaf433769af38fc19d1eb7ab439c15a9afb4e3becdcc861ee5b9475a458027f1a17da5fb17eac2d66708f237c758c47d5edcea2170b9e4f74cad5a8f6eafd93eb61e0a81349f15cfe8f10b1f42c873baefb0726a09818e53079c6f27e63117c20c2ab06ea1795f2df802eaeb3b1536d3cfb7397a963ae1d71e127fcfb5b6fb3ba2ca12a840a492032de8cd698b21534fd50dea84fb812afe95008914112d29f278b9fe7cb83044de9a358144cae3537c00ce605d1429e9bef7ba3b2229c2ccd59e5173e9b620eaf603bf661ed45dab2d7e6825af00e910a8a3990b22e73b94c12807ca0716b5de89d4402712f666a846a3aff3ad01628f522d7815178115ed2d1035a8d4f702fa4ca0d3253e4f2426e8b4e8f703259ab51e60347e5ff746f06f42eb51474b4d6bc93ea6d4064d046682961bc3932a0e47d8159762addd97fd1ac06c08e5c2bf594db641e9061860f14a02ec1e5d35154ce49d9197488004ee354ef3d0c8f092a19dd7cad02fd0ca7f33cdec684972a339ba694010b14ddc1ffd5f7717d298daacde5de4bc4c006fe878d531d78d696b90a14599c10978036ab1648cbcde6911a78dfa0e4dfdbab8dcdae56fca06f556dd75b3b2be043ef855595f20b09618e206be2a4987cdd34be7fedcd9411db2506d83eee0b9b7b5b43ff19459027b899f7ca6a3b4a1dc08f78e8a897111acc455f8281f80f296e82b8650ec1e2d625f43c0143ae40c15f8bd3c9eb063dcfdaec189b21f95c6f1f0bac31a5c49704205c7795bda28396fa7baee3579232262a1214facc07b5698bbadd447a7c714dd82bc863754672afe722683ac8e0fc7a95babb2c288e8ac45d61f53707f13f3ae3812102b0fb7c11879871d6a8310c0470a34febea19c72e12fa2f2accbee2dce7da5c05810064800d3900a2ee3810b62758a43f8b91df5fed942413f5e6e231a733b254cbc8ef2b96623f75a0c52d5b54d6733df6f14f0abd374f75a7d8adf810b77f7805067d472130fb921a70dc504409300b4aa0eea154392c503b6721b56147a4ca6f234bcc2376be27cfb09fa27721f58878d66ac2231e36114baa0506da92412f3a8c5f8f4549a8a99f2ef3245c316868660645bfc578285766392577244f2c4d7735d37e1bb6e879b3183cefdd047b1ad25aed046b80f2eb7f8d01a2070004758501ca245c3c1361dd166f6b255d7218720e4aa7793293946d17106641b15feeec1dd108c5ff616352306ac4e82f6463eeb81d14ef50eaad9e4941176ee900ae50170a0b6c54d4a7fbab1b42c5af16b8316864ebccac868063a4dc27d83c3c36a4274d45ba2fdb9eeafea711421fb1440c8a63429c5c255f56db7e58a33893f91f3fd9cd2664fd413aab7b948f3910c2ea2c7991481a5763b700316508342db76f8bef3d24116674c721ba6f6c9b9aea7d71b82927b9a137a7969ea5ff70ac10bb5f302114c36fd50e96ee5049ef42b879825d73df1035a93b1e179c288060b26878101725c1094852e7dae06db36ce0f805ffaad192916ab077f6ad6c443c82db1f7501338e43aa7733b061dc739c970cf1145d32030781cba955999049613489acb3536ef03dd5a90179e8ef78e23161e779c175bbecafbb2ee627a77ad512c00ec668eed1fe6092156c404dc78823c5d62460a7c01f16f25e3094e59f511a017694b95e2294740dfd9603005d16b120c6160950b3d6a90f4110b7b1ba949991ae56741935771b024a8397ab3e9c23e8d77618670273fa99666b6d3d851ab3223782685de7aa3c617a92ada5a9dc98d10b78a7969cffb0961ead3b3eb0ed5ad2600a19965c568d55643e0d35759e1ed21d152a44cbf0c569fd6cc9f9ca5a2f81866318e40aaab5124ef7caeca3fe7f7df413736e4d96d8b0c1f4c654e4239c2c9906b47ac868671c39fdbec5292fe9b7c90234001983527fe752798d311efb6fa769fffd3355c37344a98826f3e9c4d6fd57a09e750f2478e022885b48cd300059c67f60eb297b2ca49088f2714398cbbbe106c64de7dd7fb7c1bfb032ad3303b16991e7b6c30aa890923ae3081f172e5de0644fe4c528728cc94b90b90550644943ea34e9e7c78c3a888240da26524dc5f67fc460242f4f79ca10bfc0d9222bc58b528fecd19cf09e48f364484cf837592eb3c8fe2443c1ed2c80bdff153737efef0f6a0f8f684ff5212faaee3f0a3dd2ea8e8bfa80f36d70bf9ce786bef909a2d94c37c47fdddd0e3bf32c4e92f85dc3607b39c4fe8b76e7b72527f6928ef0139f9f8404b283fe55dacf40b6f192a5e1ecec1e672c2cd2f7fa932452c46743a5672a1bba62af3c1a892d8b2363cf2719965f7d0106c8694421e5cfe4dae0f294f71d02230e80eb3aebf84ac8a7da52433ea05e66774efd602a0e5c4d804bbd7d776f485f176331931efb1bad80f6aee3c6b4277a8ba9f4f1cc7da4148a7f826e876301c4e927a8644e32843e70e7560bcdd29e24cf3eca24499bb71da440ccc831288db73b8fa73f33956a0eb3228e77024f772fbd227f8c818e8ee0a1cb05ee37ab3f37e002881fc7799d1995221cd4dceae4e10df738ea815040c10f16a116362065cb159e1cd019f8f3d12c717c3db15f4f0667929d4c4e97fdac5036f9ee3101752792fc00e6ff1f391663cb881878e7cf0eac818ce4bde908439431962c79bf3c3c9fd018ce55c63e7d0254619b3028f27e49cd3285eff08f2086c85b18974646c3967e0d32588801383f9510a0d7d89a46e138bb501a03ea8be809a013128190082e256e9330ef90381c60161bec78efe7b8da1c62c8c7fb250bd71988e9cfb28600a48ccfc80c33839a4832f3b8c330ecf3da44861b6a3a37468ec1116fd800d06ac8758dfd7c5b4aa5170869386e06c68eeb86cc45358ee8ea798a873efe05310a3f2b470a0eb544b6e26cc831fe11eb3de2067dbe212d686868a328367b8eaccbd24aeb4e5d45deb5f3f36107db7da07fa4f1cc030930b9c0922f72f339b897c505a3efb284066a74b6c3e6f45c5cf88eb87a0ddf31fa1b8e36926aaec98ddec110c764cef07c715b216a48d9a61e41103d7de33542201ad6299d7c53a19ebfabcf5d45d85e73e089b2bf493504de334324160b4c012224ce77a3c5e394aea91d00a1d7bccc4a9be8923e3d7568e994d04fc5b876e1b60251d931ae44cfa28d374f1ee1f3fd4dc2a0e95314465980bb1151d6bd3cb26715018915c022a853dd11ef5dd9db953eb6f9480aa3458f1effb3661eed29d9b24fcf9baa19398fd9fbb07e3717e5e17432161fb278d0a8d464c5eca1e1310efaf420a9769cb819470976946edd6cca63e2b38a7a4ea06c63be22e45227cb3075efa6fdc24f62ca7425d8c0d2191ffb0f30ddf3ecacf97d472bfb2be7dd47f20ccc90387fef311d8153a79e32daf8b2684913137e777f64dcfbcdb91cd136071c50e714511a3efd3e731aed09456fa13fa9961dc093d722527c6f61cfc59c0a665079b08f34bb1edc3ba1d91041682cbbe4656d408c9843150bbc04e34fd7ccee36e4f8b80dc7cd5e5510187db841d80677a023155ec042b9464933aa804eb93b580cfca62890b368425bad0104a64f73cdac6b07c6d00c36bd919cbf743fd0e42a91af98743512352313b0d275cdc8bda81b44ca5724c4f7f6e19e63c3feae7d8ed9d1530eeab32ff1f041fa96ddecd7118d3bfaf5e8aafc3545a7e627a968d528b1281f2152f0c1687bf9e56ca7e23d77b11bfa113e69c3f2997a6eec1aa5812b90698c6cc7f00c8057982bc51115379d22d4085f10465b03747d0b9b0b47b834a580f4ba97dcdd22a2c1a3017150d32204275117fd7e2c75ed356923292ea34386d5fdec8edf89c19116c31d560006a1493847f22119c66085bdced7c85fc9b604e955d6fb9d99828cab25ad723088a71d1f64e064bb0837dec016b1e9028c997013e27ad4a3cdfb872ec387175b4f0c62cd651a396078d9d8b5d9d873600928e7d75aaa462f23bb546376090701801d6a7a3c4c1c1a7b76a6240914658d661b1c293925327e0bd10d5666532a47fbf599e65ca86943319e740dfb503599149581d0f0d19548aca10561a3ccba8ea6722e260eae1ca79e4fd398f8424e6464a912c270c836fba4ed438cddefbe23c92e272996d0521273036272fd5f21a2c3c1bf32170d94096aae6dbf7d0003f039fcc0b8e7cfe104066b71693e4057d366954f5134abd0b48c25ffd36dfee0601b72d921d0915892222a4ead1bd63c605c790f414259ec9ea7ee883c83579358134563511a0e570e95b97046f8df4bb002d9092e1f4d703516dcde7084a3cdcdc3d4345470549eb8e72ae9046b3d30c3ea471d915bb9f673fd1a7bc23b09f9e2c1080047a3c306e20bbd2a7314e4a38fc8cb393cbdb824d4a7e411525c230c9abdc2d7ca6ca73b216a554148c0ae5445424b84971bad083322997fb0da8fc29bca9dd20c8f642ef825a7de880248bfe94e960803381e0cde36dc5a71fd9b053f6c8d7a19e54ab327104658a430b018426344f1dddb23f8fe64d60031ce0cf4a1019d2907cfb3d4198c207a9af60bba635aa4caec049fba537dafc2c098410761f1a0fec9165dd119e9f6d96f3ae6b3eee46daa66d7995f7f7213ac826966c33aaf261c73b20a40b91d0517bb9afc1fc6a3a74faceef666a4074aaee104c135c7f45a44083c0d35fd13c7a2842dd37389a069454793eb79b5823a25202a9a8bacfd1e6d5cd1d71a7fd61775b426d1b0c17ac6d0730b8107c248edb807bde1000419cbf75348140c26b8dc31693765e35cc251599510cba8c5415ca9deb3d5d4c512d4b2c18d7eb1dbcd790ef68f716675703bc785a395971d77c3a5bf81d804c36d7bcfc5eb372127b30c90a6b38edbae78a3f53322d55aadfd0f837e849f90b2ec8eda5ee519b8be19a1aaaecfd1e98c635a0d5038bd234c58eb10b3ee5ce23123f8454c586bc1f19b2121f30e3bf15932d6068bb52cc0691f24bbedb566ba458cc5b95ffd4187edaa63d8b1667085e06d4a5d22e3a5cfa2c162586d05a63620a8b080e8eb61243c0d771a80e17cdba05f39a81359ee619f6f3cd42ed566b087c1c1a11a02871a1324e47680c8e59ae17705ad5b1ecf505c191d3561877317f7b44d255ae952e81f6bcc0e59e0c401ec738ac01a159d42dfc7066b0de86951e2b77317719c3d88177bda7ac7159a65c62742ff582e91664d130352e48ef13c927fefdece2c41192bda9173887749e2ee26efb68d69213a3bdbbc87eafb47fa723d806d6b45333ce1a2348cf566a6d975e9d52c664ad93c4b050325f868a364fd2e8c89f0db9a3347c7c53b4edaa71268e70a28caa492ae34ec4d9570454b596592de9641d3f7b624b0f45dddde2222dfe8485d22ebbd65583c17211246951fd3f809f1f9a3ff0acf1e7fb9ea6b759e7ea31bcde103afd35f290e48b944c380a4dd3ef669aa49c98a2f01629c1b2919427345e27fc0b29b36f24c7212208fbe36c531e73bf2313ad5544a76e1812adb662ff95486a6e73d8e02f5bd52bbca26ef0b499ee09c8d7741a1fd0b92865e27e73dd4f8bcc541b1d6e9ce821dbd8e1cf2c47e31d4fc81df97a3df7268f4bad1f56db0509190359f71c7fe70ee313d49be16f6976ca636d801a52c9a1288a5d7fae906e29460ccd6d86b196a65c5cf1c6356870a897ba030ff73fa03688bcff69c1fa04393ca81ba3263b117a99a84ddfef97b0023ab0fa7d928b5dadd813dadf27087691897a9edf70740f81d881e306f118f9b9fa445f7d108954e9b39df5e5630128d7be14805b8f5c817a2be64484bb12f07f08b1c7cd06557959a4b7b12063b6b0b5647c1964aa074a86ca043c5d20f1a272bde11fd475ff133ab2c3e561fb69f2a38322ba33a150ea6fff6efe2e80d51754946e5abcd4a17da47a2e026046d578268862e78b5891fa442ac16a2081f232631e00227acabb25e9630159d7b16e613d5f86d1827f9d195e6fd7b883de7f388efcfc60b3ece61873acf55bd35a5154df1067f367f8b553d8cc8a34be71431a571abe6499629721625f72def0423920baa11fc414a6a0a60668e5e90f0a37fbb33635c7e4613ea9da64a8598448b464727c549e4665069c6354f33bdb8857c1721c78834313b1a79e2609c57ec3b80b90827fdf66be60b7a42fe56bbb94e486cfc3c1f437029ee582864b5b713d5493d2f326fbc595d38e523bd9dd412adbc27bdd8c05631188242261c01b3adddbd7d9400d5fa3e6fe6287b0c6ea7ebaf72a70b29d18ceab746d200b1ba8ec6669f6c12669c240e70372d8339743859fe111c5d2fb710ec8f934d15e14c909030fc719ae936bcb71df5970e805e3097fa2bae76cd4878edc6a0f62d1df707190892e330b9688b82e5964b469c2330b30f1243229591c64553f5c35b91aa33f694eb44cd370f13a3368e92954d04a0c3811da854cbd88f580f0be567d37e35292919e197b0df2497af534ab9dbd24150732e7a6797290d7d82b6f700c4053bf62ab7963c19329cbaa398ba0c63367cf3b88ef06b30214ec3b5a77b1de8d858330b58c6e5e6549a9200d252bf092e38c252b918b7d30eb96a727ffa6c503cfcabcedf12c4150b3b74c9da6f2faa908490d73815bdc31d2102f6241ff1f8071bf237ad2de32d775d0937147c5b8e4db2277743728af110b8e198a18d347edbba689dec3b9c4ad7415d1336d672d7d57b2ed2686bf73e45958e31c85780b853b2c35f156102b219bb72f91b253ff69405fd51da95c45c00a15fcc512779ab51f6606b33f895467449ab5bcd4987f54d7b94f320b056eab033cc912f2b72e8ec588b9a69433cd6378d39cceee621d5e9e65b6674db1998b7808c3cf7e7184c84a232d0a2bb2fbcad0b69a5155c4983057a34bf802e7162cafecd5501a4aa699bef00c1427102362a8ee0c939405437052eb7795d6ab6afe7028aec2a30fdba416552a6707aacb7170f34a704e472407cc21c99b3910df1e83e901f143a2cb403010532b56578dc00a89670cd9fe0b32947cb546dcd472f35ee47153379b2d6d1afb0dab18901a51ab339a1547bf0bd6e7a8f453b0773335b20ddcc30450c38d856b29546c784195e017bbb6ebd2f18fb980f95cb2e17f34427923b66f8eac1c0a5e00628e4f0e6ceaf7f2223133c751626e0cad48b1ebbd40a9d3f8451a6286c2484d96312d33c9c663f96ec3bc7d7a4b874b3a6114493d07447e55465f87a686d76414c9f8d41fca0110b8f41a67488a849df41a09a2870190032e6beda58ed15b395f94b5eb991b750453ca8fe1ac1c45d8d762c1af8399df75c9eaa13ed143ae5fa1d50720dbef1e25249f13f9df9355e3f7b7f01c80145469a51dce75cadb9b971beb1f7cb8b4bfdfe93d8f4d000e773dd876dc3f21f83ac0694dcc7d3415804ae94ee2974ee5030ef561611cea9e37af168c2d5cc82a5ddbcacafd8414eed8424e1db5bb90130706e3a66979f7487431ccd5d77dcfddc9973c9f4914bc1a69a00e89d42b42cffcb51c5b0dfa7544f3076912f0c86694cf3f9ddd9d9a2dba554e3a0dba44d7ce7adcbb544155e9b4755d63ba3a9a15e231ea305b8f9f8e96b737dd5d54202409e9fb9078c462f6264ece361a9100cda0a13b30a2ebb3678113e69b658dc0dac79d1775edf30ed69459652c508cbfe026694699caafe0be51f9258a294506d5a87f4a6a0e7b92dfc1cd7c588971fe782c896e8574b8a08d873384581d40d46ce9b2f60042788cb456813c5492396e0ddecae8c3082a661baf294b357372b5e9a2a598e248f68d28868d479f22c65cb7beab16e5cc7dc0f862bf332c582639b2e0e7220d2292710e8834e88066c56c97a5aad6d6eeb052a217ea88203a01d501bfa1d2508f6641783d99cb3050470fb18a2e3578684d8dcd87b85b17f67e6d6ea4540b40895686107cb4ce002aedb8f8d4c973525f032f98d9c982254bb6ad5e736987e45e351d934785faf8bf4aab7613ecb62b9afb418e4cee10f02025870f4074d205ecd2525c82cd35990cf449e342c82295ab8629dee5af22aba75085a2489096754bb4816a3f1d9432a5ad13a4dd391c3e23e499521c4b8195b70c7176ad7ecd9c583aae92cee1f829af01fb2217fd7eef27e64d8e99818164b80375ced2c3ed0fffba81703610afe19034cb4131074e3db8752672c2cab30468bf1427817623dc7071d01eb47bd2164051828ff43a77f5714a2c4d352757fd4939057bc8c035c51986116857f914bcaea17b378cdae49032c5702927370d8bc3599bdc931e397a88c3f3df5cb95ee34d52891c3af724f7be0de3219b189860a0898122d5f7eab63258a0d221feeafedd7bab567c0978141fb340c0d4c34ae803564d95c7c2cdadc6cd336c0f72fcc303e813d4a08252312a9db9bb90606c139608ba8a135cbddab032710a7cf22066fd6cce4f502c4e15766e446ccbfdcd7d251f64c8a559a21aa4473458fd25fb93a0302cf94d205af18d0c780f3a6dbc993e0b023ce889cea9971532a2020ba1d38c6990f1920360bf2f5a29db2c3b8fa0942fe78ac3d5b0f55ff1cf3ed0ecc5a05f147d84712a8a38109581b464024b738ef21217f610922fa399c9d2886135430420a711ca9da665d81ce954bbb3f4b7720100c233c2582cc4001b12b5af189f8980a3c5f85ba9de928918c1a3853e09fd00de8163cef1484e0a97fc82ae7e2fe1b4d4ff8b2e308c20c8d3358eafa7eff2ec5f2ddb6187a9f9cb18b9666d27819ac8f527a24e0916a69dbdbfc0335d29878ccff9bdbe0cc3e30aaa16d48fe5c12002a726609bef45fcf3cc4e1cc7fa57bb37d575b2fb9d6a4a920b346992c9fb3d840f6c3ffb087786288fe2e0168f1fe2040e2c30f54b10dd92aa1968e723d5231aa469e5faf0107d6f5f8ed0dcbd6897774d785e5566b381ecfb99ee9e92dd40a7dcfd958bf02277b2ddc9cc8dcb66c3e7406fed30e2288a68b2dcad8fa7833110bd5f9ccdabd5305ef01009e9f682a4b75f7298dedeb0701de6e23b816823121be786a364dbb354f323637348b56ff0001cc35b6a880e3254d05750c57ce50a77bf9a3150cd7a7ab1a6b591bfd6914baad0d97fe7fddb750cb3a3c43f91163710eb1b229d5b98bb5b2fbe48a368146c181325d16d018a54a8ec7b1f7e82c6ee76355d4ed5db9502805f4482a2c2945887773230d599dd2af2b7cdd24cf5ac719b2a88c2147882455a23f903128f8147533cd9c0ac57e64432557de6f43b34450e2d93372881097f53513374f009071de6ad8e74091e5d8ebbb23aa49f85626e2f5136199c8acd9fc2d29e45677f4d575361aa760f38afbc3b6f46acba5f83f2afa6e1fbbdef2ac707a241700d9e3e5eb7942be4db30ee7befaefa715d413fbdcda29f39b66d4f528ef49c507fc63e2bae63b07485d9a733ec50b3c557f6a6f1e7b21fc6ec3b0a46d704f059e09b77952c69f882af484d1df1f3ab0d61ec0dadc8ff3c9aa5a7549e5bc9a1cc9403268736fb5b880c2ff7441e0d642b1fb7cc1ceb62bbc215118d0035e80fbbd06bdb1e5c807e504721701d413cf90c93fef433d3cfdf90b971ad8ca5602da2a158523553cc8103e451a4d4481e366fb694bee73c512d11b0c1466fd032640c1dcc8ffe367ef10510f6f56cd9ac461af82c84aa9c29ffbaa08772b0834dc7e3c8c94992ccf3d85f9c30eb055897945fe3f8f5c20d075412270200ede7ee04431cffd05a3bd6030c6519b2e9354274183d3bebe84df615bb801f5323b56866fe6724c71389c59ab9c8e5659067289db9309a50b67e00dffdf9491214e75fb039732712c8713509ced0131c0b4a70195ba4c8ec0b283a22c7b0dbf1fc6412ed2c4de82859e6abd3f51180d0d804e499c2ee45002613fb99f968590283d52786289f149ece6461deed0759ac6e676a0a9b298aa163f0e24c96a0a98e0c0852029aa42dfdab437bda93efb23edea1a740ce383cb35d81744fcd9a6be9ef47e2542f680061bbbe4975e70d160ea6f6f4e737178e789e45eade59957130d30e5aae84a40444da2b6f30c458054be0608abc611221c80d3a194cc2d2566904c4acd1ee8382caef84095c2e80f4ddbd836fab2a862108b2adef33ac9471aec7765a995367a901fb3af6b40309937d205777154a7262d31cb03b48f16438a9187b742410d097dcdf4807278fc11c35304fc9fc868ef696323aa5f91aad21ece631fb45dbcca5d43f5c9ff259d530c306e5110677aa345a0c11dfb973ddd11a4c50198f826ee3306febb5c547a17816183f00237edc975b99e3288bedb4c40a9b91b95e65be7e1241ec820eea49089dcd61019cbe44f6869f6be914b33965f82e20c672815c3e932e2bbd637e38034572e01b9c38a9b80a30eb4af10d4152773487211da08141226a60f818a1cab2304ce7f435e03154bb801491fffeccff1f8c0c02236c5a52201e7731cb094fb0061d569e5066e1c28f37f6ddbf859dfa58b4588a93b1213981e291efc2995fe312611349407e3c6c9e27cda85453f72c75f611bb62bd1d664df72a04d9f7c54434f64561a4279373b901dcbdcd9e56a20630d838b2d76ccd5112389233ec95006d87476c9e3ccd6c376f4035fa58e8ab9e1d60959172e6626dce3ff6db707678e462f99579557d2dd4b71b353fe48e9ec7ad04c55576a4971e8b2bba9426f56db399d1d25923a3c71e7c0655904af4139a1aaeef2453ef0d6420becbce48d6e5041e0410423e9742403c92db38e65cdb7dc290c2a92f63380f85ec463a07b28960fc40456909ba96e5d40816b2e1cff8ce8898871de7feb394c739a1520437ebe9694e7119a08d221019cf12846dc58c1451bea34307450277311b01e2898618102670acc8a388819becff18ae7b9e900fe53e894b380a0a6e60a897e910d81229d525a9180029147f02cbb0366ebc698d4d80fd0a18697e69f883d6dac496a5b6ffc42aa9763a417db0a37d9941c116c311e04fdcd96f01b84ed058c7cfbb2a07763927e43b936d3e312eab38e802890736be6303755f5fdd8ac8be41842987d5d9f6d0afd87006448cd51b90ffb430c93e5e0692007b82dba29bc0c138c6ef8343fad430a23146ed6df1bbf1b36df6dd18056e31bf29040782cebda4e26c9ade103a369bf8acc57d07034460f170b6b80a0d90708f9e0d6ddfaf7996944715304ad3e42a5cc88825806eb276aee9df8e20e1b533cfc0b9f9269caf8c0b32d8056057ef670b96af062537027cac8cc8bba92c5a0da4eea4880358eb62bbeb5d76e792e1c586d6837de51e42629d15a493a874c9feb8b7d84ff5864a8fadc03367c980e5d98e6c5bd3383c677e485f0c0c9dc9f49fdf2edff43e8ee514e5000fe2423f1c65e437c4426aecebb0bca3022b6324f219bd824d42c8b981564c802993bf3844ac9703b2d2fe32d6f0d555575df68cf1ac49bb28cc564aeab893942a2acb4810ec39017f7df1fa9f276a25ae59dadc7e298ad6e40b82c1f79e1fbcd49e01de4e754a311f4df428b31bb2aa251bc4fe3cd0be4a23c32b1eaed0c29e930a1161cdaf51e8439452bf928e0a600a4b3048c52c00d1927fbdffcbda35015ba1c93e1331c7612243b4998151df56e69c169678da810eb54cd7b4566dec78d3089be15016fe9bd9e0784c7e94e44039aa2941a77afd746fe51e152fd4963479267a3a1c4299ae0ee2346dc75eb9c3d06210e7b4394370c59cc613e0af1a5f316228fc035ef1027b34b8cef22fe179a3c345799fee6932d953abedf3e53653c76157beed0c142f8a1d8ed079b03be5fb7bc6a60c62cac42e0a905e0193c4a9a74a128772542d53327a93b30e8001efe9abf705c9410bac1d760b56c387476481c1d0df996ee4147c48026e7f455f0d2e70b4940e000c30c000030c30c040701bc4752559a950a60e5ccede00be297353923649d64684c6c584c6c544d897280dfb0c000d05ed5499fcb1d38535a554176aa11e68870b6b94665a4a39d336ce16762063e1289e77485a0bcbf763b06a394a867016f6a0a124ba41ca560c16f6d090524cc4fd87e60a8b98c74dbe98f1038d1536adbe3c9141f0303155d87a6433da870e2467a8b0e583f45929b443be4c618b616258f0c813d3228575f3665075932be31a851da4bfb42133c5e42814f68e8aa1b19369a7e813b654f21bf2857558d4097b4a9bf667724e8b6a135675f0e3d739440a95093bca9cd191ee66ca74095bc8e819c4ce500fa712b634d1247476ce679984451c3df4f0649f538984e53af94dbc494f361e6133ef1053e6ede41434c2de536279e1a25a148bb0aa7fbef88cfb954388b07ee78be915ab264d86b0dee76c469d84b0c8a6e431ea2058fa82b0dc7f8e270f4b293d20ec3874ff7aa63187fe602de99c29a59136c407fb477218728c959ab31eac394ff97ccc5be9613cd8ce2cf5aad442a2b5832dc7a4b75329a399a583e533234bff9841c8930172b0fd4f55e8983efd840c8083e5bc1ae5905421f171b7582d47c621ce655c639c2d164bc761364cc7f25aecddd38f52861ab369b145e98f161be57cc82cf6f848ac742ea31f2f8b75eb51f288561d8d8fc55a53e2d7a1428aecb05852089509e5601ee4bc62739072d347470fbf2b76b019e628c374f5add8bee4f45148f2b164c5e679b36773c4375cc51a3e690c2162e287a862d190d97cfe7399eb54ec91a4bc7388d628d4a8d87e3b83c9b08f297d8ad573778d468d1d6a36c5ea481dd7a50e530f2ec5a6910ea4322d334f8a1d260797d636a35852f22e4e44bbca1851ec69aae1c86842b1a79cead7b1b73e2fa0583c273d7f4a939d2b9fd8734da806a2e7a12b9ed8530e15fdf42af32a9dd8434f07cda9441dad9c5827751fc7910faad14dec2867fcb02ecf63a99a58b3a763ced80f39a29958d671b2f0305486a59858249a477e9834b29397d8c637d287c6a88aa625d61cdd0f5134c334c94a6c15b1751acb623f92124bae7cf995a1e67f9cc412d2776a5487710d94c41a5592f92627843889c45e9f699e515d5e4c0c123b88aae0e7e9d693c41eb1559ee4e0323d4c133147ec99e38ce48a9ebe41ac119b8f748639724a393f63c4f6d9695e9363657eb6882d8e87cd8b8b569f3345ac23b1573967ee5bcf12b167383a13f3731ecd0c119b55eaabd4cb0eb18fa7147975693aa7cc107bd57d946b9c9d725921d61ab5e429555c8a6584d81a555cc9f7d13a5636882de7adcf61bcba246482d8f741b050f952c77a58203689fcb70e33cc3f0d03c416ca3f47fe154ff1ffc3fafb4173e77da4fcfdb04ff0d987d1326bfd3eeca82e4b4394f59fcf871d6c4e0e298a8778fe1e96dbda33e9cc49e1eb618d670f3523cb98f29e873df49283941482e4381e36cf0f8bf92476def81db69493c5d5c6edb0d5a6bb543db9abf13a2c9727258960f137753aec18259f8c7ce28788cf613d9fc69b1646d473e4b0f85ddeff10711c3d71d82e35e2ee79180b1e38ac99127426de7a65e70d5b8cdbf399d9fbd071c376df602d754637d269c39663dc0f590e1dc6cd86cd6a3338ee8c61d45ec3963a1e8349b61a36cba01bb7eb81c5390deb48e78d52c93c9bd1b0683786a9216fa283cfb0f8fa5eb81c331cd99861dbb416222733dfcd9461d57a64319d5694a892618f9bb89624fc9ea56358524d4a8f66f1d24f31ec3f2529634ebb1acf30ec3977c671a25c4828c1b0a7e47e102155731abff044cc5d3ea917d65bbd9c3982e897d885a52c83c88e8f9d4ae4c256b93bc7875e1346dcc2f255617ba2c4ca19a8853dd4c49dd5ca8cf3240bcb967aa43507192b040b6bbc4751663999577285fd73520f19828578c40a6b380a31e2a7d5ff5558cbe2e4763263f4478535c66a2a5c5e68ce4d61f5600ee3b2f23a7d52d853e3c38771738aeaa2b0c69b0ffb413c8dc4a0b06dac987346b292883d61998699a28350966b39618925317743c918aad5843d775d7549c4ea9298b0a39d108337c8891a2d6169904c3a2c342eaa843dc5466fa41c27c624ac9df341485d740c1c85842585c6186a6ed411b6f99fbd14339ea9514658344c741ea4f7638c2ac296d2e15d296e34cf136199b48c3a0f618d31fe31ba861d2c21ec3096c3cb39e37482b0566d74c5ac0fe17820ecd92176e56b3cd73fd82ec64f396348c3a0fb60ad7ea41227e142da83451ea61033720ac08325544d8a0c96a2d95d801d2c1b3fdc4f28a94ebb003ad8318e9956536c0cba2e400e960a1126963bd267740170b0c6e4b43197f76a946fb176c67b96b9f63ac6b6d84c2576a73e5f655c8b653d4ee70c2ff9584c8b1de30a911752a46ef02c96480fd9fcec8cf6228b3df23988c6f7917389c516e3db30733e896481c58e7f27f67e87ba4d5fb139d0941f5f3e134b5db103d3f91424667492b662ef0caf4769a51b0759b1fad4a4b58c1ae7435ac5e2e11beb40a28a6d2e39c83417835f24156b4d458a7ab15b61546c19761e9cf9a71c3dc5969eca27363b5c77a6d8636eea2abba641578a1df959663c8f437c1c29f6f975247b711df2a3d87335c7ca7361cd12c5162b678e21fe61842c14ebda4efe74112c3f0c147b4d9cde7851970efbc4be13e42e478f647979624b0eb3663a74fcae4e2cb97445d3993a2a8b137b9e079b06b1bc6edac45a963c4ffde4a6106962c7f74124a47a5c7c502616bddcbfd21dadf44198582c4f77dca43d870ebac412ac3776f9c3ee14b7c4d2a5e163b2bc128bc967eeaff59bc829b18ccce44d886b933a93582b6e58debb25b185d0919a364e4c3947620da39bf5a71d6c65482c9db1a278ccfe8dfc88b5c43f5d64c6114b839fb0fa7c639569c47a295a44bdb39c7761c496f158c81fd52ee28bd82c34869a8e50b95645ecd1cc37755c7314d6446cd9207cf0d40fe5828865662a4b743ed3cb432cfa71fb61868f9bd210aba7b85f617305b30bb1a6f8a3f59fba4626c4123b2af56fed1a3c883568aac7f315991205b17f657c1a92a8fe858158a3efc983ca30860c882dcae391bf8bd5dc1f765ce791cc42e50e113f6c96e366eee5f4d4207d58fbe1c5f015dabff2619dbc6a3b261e72c6ed61cf30e7b8f126421ca787c5566206b1b63c2c957cc77c754d420c0f7bf8943b6c712cf6c5eb7c55db61f35ecd9206331eaec3f655b934e3dbdfade8b04c9a989b6993327e0e9be7443bff9afc1539ecd034348d58e59d71d8b2e124d1b81c3ac261adac06761d7fddd11bb68ef09533885bde1983006ed87322d89ddc46cd8d418036ac1e1b3b88444a960408c0862d4543481995976d0ca1600513d01f10600d8b0319db2093fb779a1ab63ce65b36aa21fbcc34ecf126c48498baa48d44c372a725b6197d4f86e619d6bce099a387ceeee3cdb046ccfdb9a365ad46cbb0a5f8112cd53ee5873964581b79c74893fc316ce3fd3de952df474f11c31653ca19f129457c180dc31e72c8c1319c8e866a83614d0f7d43c31cf2c6a45f58a42c536723672e632face93398d81c3b6d90ac0b7bc89342c4703184d91c2eac9ae26ae5aa0c4254b6b07aedddf5a418e3fad2c2163545cb0d926f8810cac252576ab9d16a83890c16b6cbab1fbde63979feafb0848a948408f99cda5961f59433c80df3868fe1afc28e7392182af67174f354d852bd26658a2893616a0a6bc67ac31a3bc7791f52d81b843bab8a5d0e421d853d2393fa0fba97620e0afb6e7a1c62901cc7317bc2de20868df9d2f56f8613969ad114a22ba514626cc292fbd51399e7e36764c27e1ab1bb3db621265ec21a628c68a59537295f4a58aa73ef61a93a46399f84f556d622747e3ed33c12b6b492379d6e78ae0e1f619bfdc87916834e679411b6d3bca4258d2a348c14617b942a67982274c8771161b14fab9bc299e6c9c710364db964b13f3444c684b05f8e6de6cc254d2b08cbfc8649588c81b0d7f8846af4e330eee6074b8a21a709d98d514ff4c1323956bec6ff1121a4f460abea502a9eae31e88e077b8c4b55191deb1ce4110602ec601ded4855172202e860499b9252e13fc25c740402e46079a81229b9763f790a0170b074d894d21ac78f1acf5bac71a4bea76763ca61b4c51a35e432de18a29bacc5a6fe95c36426dda7a88b2477010b8a1ae0010934400603a0c59641e2c579873497fe2e924810031658bd008906cb05174918c02cd65f8fae39914f196764b184de182533ccb8514563b179ce04d10d916e7463b0d87724c5bc21f2c6c8f52b763cea492b65fe3421870424a852c107b8e0e2b8627b60bfbf73bf5569d245b66000ad58ea42ca182b4e5acc1d566c92e2a6484448367bbd20cb0a0358c5de51d9931d43e3b3e3820b2ee8c83000556c1a2fdc54c678c31fa5048901a4629033a34da83cfdd56100a858ca833eca959df92e499e18c02976508f3e44c84dfcf1060330c5a28d43ce5f49cfd5ad60052e381b0ca014dbf5a410cff5ab0fbd0b1898600624a8810b60408aad73c2e4f8a35e1922198511e14ea52b1c7cb84571c73aac0c0e73582d4331ccc04348040b8f195d2491402b0e0300c516631d9f69b0e0d5e84fac132a95536708d2bf27b698fc2936bed00d1d547430804e6c8d62431bad4611ba2e41924b209513abe9570a9f112d838cef22899c02ac30804dec1f35ca490899722caf8b24a30201176cd8d93026c01603d0c426391e43caf829a730779194d48047a59c647a25aec5527fe9b36be5f77e5aec31ff8659cff711f3b3d846bdfb2667fb4697c59af3e86cf0c46219cbc956ab33241b168b87c6385191af635eb1748c1b1f4d39e6e9b862b58c8268ce70b5fb56ac5a77feb0f1831066c53a1f63e83ecad4995ec55ed538a7c9fdf31b55ec13f395d12f5f2653b16846a978d428a6a8d852af466654351be1536c51bb73944e9e6636c55a9f1fc6bb20569f29c5b6f7b53966902bf3a4583b37a7fea38e4f65145bfe89fb979b2aafa2585546f6470dc512bd9dfb3705c51e12e18d24c61c1ffa897de24f9aa54b590ff5c45a91b1ebc852cae9ecc46a5ebf2144c65f8de4c4fe513dc4c6c84d6c7e214a324cf98851138bf674c8f834124cccc412f949f22e6cfa0431b177348cdd19677a849758d5373b36840ccb134b6ca124a6fafc71f34e2ab14c6ac817663c544d28b1ca58aa58df603b9149ec3978be4ef96a6296c472393b7fc3d91d4b24f61836ce94cdc89790d81e6720df971632788f584dd4d374ee1cb148ce31e3f14979d93562d5b4fa59131969ea18b15d48c6304dbe936d8bd8624e3925ad4d114baa0e87b192e6299588354a82c6fc78b43e64109147d499c6c0436cb9f25583f1943cc4107bc7cae8e4d1603f2ac4e63f9e7191552127c4fa38e61446a3366dc30c62b15ac9e9c19c9e2c882d797566673e106b5a70b8a13e20b693b5cb7c12bee5ff61499e522ac731ac96ef87a542cab519a4f8efbd0ffbcdcce8898a65c7f9b0398e347dd040d53f7bd8cf51aeaef9e861cd31628d67d967f0c9c376174efe73f00762e361ef0eb6295ef4dad577d83c37cea441fd9285edb06eacbe6062bf31721dd658d1a38427cdc9603a6c17c33236389fcdcd1cd66816b476ac268e460e4ba5c638492a5fbc4b1cb6df87979b1f776b81c39e3592b78df2864d42ae7c9b232319ea862d9949a4998841fb6cc31a196ec4e6c986c5c3a5feeaf7e99e6bd86fc5d1399028614935ec1bf3b73e1766d54cc38ec2c7eac73b4234d1b0a8c77f18d723c68f67d83a95a743f918d38666d8d16dec9fa95f0d6119f64915334c32068e2464d892e7dc17a28a448e8c618fd0f827aa7374fc8961cb1837ba685b09c3baf115352b0d65b602861d68482fadc6d50f2b5f583f2cdf84a34891afe2853d069bffaba9ed5c952eacb7c972f0cdb5dea970618d2126db88ff9f9dca16961c336abda6a2852dc5eee77f0c246ea86461e9eb0e15a1bc3ba382854543c7a1a7ebfd6e942bac9e32d3c7186a217f2bec21dee57421ade6f3555844c23fa4b39826fd545873755aafb89515fd29ac93529a87be558d7c292cd9992b792384c53e0a5b10930e26b936a70e14f6d56d90b1c3c7dce927ec316d0ed9ef9dcfb413b60c3484495d3761afba88a9193bae6a26ec388ec95aa545a37a096b8ce5ba5b0d6f1456c2de1f2db2c2ae3a9093b0a35ac993cbf9338891b0361ec9cb1834bca839c216ab2992e28f34678cb04c76a68fc690f12fc29e365a8f873f693c11b6aa10266cc6b13e9721ec733392734873131721ac5fa7e297813548294158aba2c9e7a3924a1520acbf93243da3b7a7f283a59269ca41e24bf33e58ec41a6a9dceb9bd3832dda4f883c2977f0280278b0ff5ee5f4c8e7955104ec608b19c97c5d97851045800e56cf4ebe9d6299738a801c6c716386b312bb41a508c0c16af17a93a64f92ff164b94ebbb9aa8e39fb4c556a16725324acd256bb1a4eae30fbd239a91b4d8828626fdedcbd9c859ec38424cbfa375a991b25822ee57aa3439e283b158d334d07218586cbf123c743da45a5eb139cef738cd53da892b960ed9cb21e63851c3562caa3943d39aa3641356ec239ea7a366154b9e942a1fe454b147cf1c5224f865ea52b194cce5b89ba262cffd382bc2764cfd145b2ae98d8e7ae41753ec5024efa224e52ec55af1657bd9513384146b7408212d1bc51ad2591ccf9728d6aeacd47741bcf7506c8e73e5301a3bf9028abda2846838213dc027f6888bbc1e32ee8b911ec0136b08d188121bc132d2037462bf0e1f8e7727ff3ff4009c586a37a6f90c73307fe80136b167146df4a327a131f4009a58834e0cda251d1eff3c4026d618a283ce31430dd1cf0360e25cd1559a3c7e8965746f1f68f949d82db14666485cf1c9a03f95d874e74183f8bff93e94d87a2a04e90de5a13e9358e6335dc836b0981d49ac12194d324b0fad3a9158435fca641907124b06d950a695c236ce23b692b80e0fcb31fded88cdf6e2679038315cba117b1a7b1cc239128d3523f6bb48760f6c337a5ec4be92515e6786e96256c41abd32ce4bf14146e1442c5d95923be39d451811dbe5efca9faa0a0e3ec4e62973621b9ec96e0cb19f7ea67edc2863630ab147d1185b497d326208b1effe4c1895988e5306b1d876678a91d151b40862ed2889bf890c2a5902b1d874434d21d7e7ad006247d3402d7c472b2a7fd841046918aa3622ed87d547e3428ed13e2c65b63983101e68a87c587eea91e7b29b1ca27bd853a6f054b929744ef5b065fe6dd00b396ea779d8f3d443234de261c95ddde06294e79a77582ac3a6b046da289976d8b74e4d1dc38e3dc93aacc11ce859ac250d493aac79266ef525dda8720ecbd823094b87e96694c38eaf2e73c957d605e3b0a9eae71c9dd2540ac2614917464ced33e804dfb09e45eda05b13e34337eca1a9438947a8aab00d7baad439847a663c13362c929ea2e73cd0d39035ec9df283454ffa713e35ec9dce2a04f5d2b0c34819f94af09c3e8686ad4fe28e5e3890a89d618721671425e59d5eccb079f8e47839c6f0c132ac19aed9655a473f293260f1315ccc498d61ab5249763a6993a4c4b05c9fc5ad1022564d61582e05bf702b816139cbd9d028cfd1a32f6cea31392af7331a79618d379636560caf88b20b4b8889c550f2bdfb482e2cb13fac9ae5871b1fb985cd3ec3c38ffbf8f3482d2cb3ab318ce6308f31320b5b4e9744c98f852df25fc887edb4a9bfc2aafb99992167f5f456587a52491cd3d4cd7b15f65a4775eb337351a7c276e2b03b4e3e85354c8f79752c8db814961c42dc466cd0e88cc2f628eed677070f00852567e5a4691e91b7830778c21ec74b6e5732e6d8c103386149bd13ca77ea31b4f1004dd86f3b1b6a3fb45c361e8009cba39fdd94da388f8d0758c252398f5264733e8ff1004ad86e3a2e9cd458c8311e2009fbda4ed0289ab2418c0740c2a6152ec4048d1554830738c2de207de7c349d5bfe0018cb0e61c9af267301f6ac1031461091f62ea376f70b4e20188b0e6da8cc23d1a8d18c5030c61d194ceb7a50a61b1b5ad0b750661fb8e6143c7bbce198130a8cc907e55fcc1127d3f9e7bf28508fa60f5b5681b927e4851d2832568df65b47121ec3cb81fc79bfb77b0a58c69213d67c3e860cfdb151b7b3d400e96b2c94857e223e51d0007dbfd48a89e3ca972768b7dd5f38ee39afdce6cb1a31cfcf427858f19568bed72ea39e9ad897ad16293f39861ca29eb4ccd62cdd395e4d46b2e4e288b3d6f9e60d2e9cc73c2582c75e63166bc19250d212c96185fcb9cbf9626e12bb69c733226e9bc5284ae58e26a1fcd442b9d085bb179080f7a67e26667202b96f8d15297c370153b0a8d5453ce43890355b1fc8fa40df3eb1119988a6ded53658e1e3a1a0351b1c84f0872c1d2b7f2a7d8422ad86759340edf14cb8547319f8dec69bc148b65eaa6648cc7d049b1894dc67b2144f0948f62ebee4ca331a95fe5a2d86c1d79fe78a9817f42b18e7db24671506ca9f6fd199fbf95f38975c34f94a67e8c7a3cb1060f693431e6957827f61cb5e3f943d6d6e6c4a6d73d12eec46ced4d2c55e52867aac760d5c4269fda8de44c2c5965d921c3fc39c29858536c5fd2de5c624b522b49631bc56f2cb154ce5f1a3661276d2ab1afcd9de7891c7e6228b1a7cd172773ca24360d2158fedddf6d8a24f68ce9f651c550566b24f65a554d9b3435c50a89a5ca1c84e4fdf853f4118b6f04d1305147acea20a9545a6a546923f65c16733ac598349a8cd8c41f36383dbd1ccc45ecf5b86625a78c7ea522d6d47fb19f730c5a6522b6896e9842c768dd48442ca9f364975f66f8e3219692d5a0a325653168886d4f52646da7a8060bb18f8664cc2135981c12628933990e574bb627835852c56ab89489a113416c97cf5278a393fa9040ac9b32c6a02f425f0e01c46adb9b72da8f19a3e40f7b9e67caff5ffa7d7e583e2744b4b895337d7d5822ca91c64bd78d727c583544da4e92f27ef4f6b0aee4c438793e76e4881ed6d0933d92e7618d25294dd9a7fd0f1ef6483e216dcc11efb0f7895dfc9439d8d861eb7e541ab623545a8735a409f61ff61b11a3c36a974e3b836a0a7f0eeb6a8f8488b127c672d853488efe99b451340edbe795e4d168f37170d8c17e5c6b942759f5863534ca75e4b1ac23372c3f52792449a87e541b3687314f88bb7131cd86fde397e4dfacb0f21af68b5137aa4a3b64d4b05cacdf8c9deb23250dcbad57081d1f693e090d7b681c2c6784b49e9f618bb6beda2985ca7410332c5d8e3393c668ee65d81f6a6f49e8c9b05d74905e8e1fc30e76337b636cf8ed625837e6a4214489162d1e861de647a99f622b630e8625d337befc112b5dfe854d73de65c4950ef3f1c2623901c730620ff37c514aef2a52cc2296c8ce69424e1a45ec0f75a2f67188bc9f49c492f930fce9a790c36610b16cd09eb234de4062e610fb7f86863146ca81650cb149059d8d9de12ff885d832c9e70a652a51e2845873566d79dac66cf8205629499fa17daeccb720d687299c4d705c9f7609c41a9226c79f9769765200b1f4e41b1d89e89192f287256dbeb55011ffce2a7ed8614446a15921e51c953eecb8e1a4d1eff061e9895c29ead54e83f7b04684e80e25b1f662f4b07a074b41336c8798c9c3bef317d3e799583178581e654926b3e81d96067b3fd1f234c8286a87f5a2247892681df6b878d31d3e3cff74d8b3635a0c63153f3e873d23f198f1e54c43510ecb74f9e6cd30e16c8bc396d3a598b995983282c3a68f71bc9442649cbe619d7895f2cec3ba1aea86d5be472337693dfedbb0558a0731cdace4e4b061b91cbdad98699f2a6bd8d226cbbb7fa61af69c274a3d4ea661fd1f8719ce4e37b81d0deb679cdbdbf29ee8f20c8b7d4ec6e1b0ce264b33ecd133c6299f858a69651916f9cc49d27888c1a724c36293a17fe5f5cd9d8f61ed5a9b50e56863c3c5b0e6a4e1624d8361d8a266d81d7167be3782618bb5db195ace68f1c62fec33293936a485301bbdb0a379dce9c2966b4246611d1bb5825cd8ce2ba3989437132a6e61e9b8dca892a8af03510b4bb060d62103adbd0966619ba8d28ee9195906211696ca46c922437dacff0a6b55c6f9f92c6f4e6d8575d3fb1e63183dc67015968c4b2337373f480ca1c2268ed4f174660afb7f0a957bd24c8f2a85ede344d3c8eab1948cc262de9db224a7be0d42614f3391affcec234dc813769c7bfbe96a423b77c20ef3520acb9c262c66bf377d1f1396f9e495750d3245be25ec713a1983efc7b2ca296149df101d79f549d841fe10294a277d4591b006497d65124d37e38eb077659857e1c633a233c252a9518458a8149a22ecb5b35e0f744ea226c21aea828d444a589587b003c98c34ca6e798c11c2525f31c3f40d323a084ba6de182e7f8647251096f1cf30c2564c57f783351b6ad4985259a1f960db8956a9bb95aa523dd853f014a258cea011321e6ce291a324cd6b013bd83e47cda386ac289e5a800eb60cb18e838447fbe15a400ed694f24fb49c28f6a85a000eb64c6191c1d37e77fe16ab434d66162ee2b3b7c5d2b30e3dc40549294eb5d86fb3fac3e595be9c68b19ffd87895439a2159ac5ea67612b394e165b9a4b1f2c796c4a9158ec69995327e386c620b058638a9e2b2d6af27eafd8f7611a95d017519e2bd6f38e07174a6d3c45ad582758c7cef9493e11b1623b8fbeb291779bff556c2156c8884893d8b32af689dca99a3aca844b2ad675bce17188a062d174c171943dbbbc4eb1df57c50e490d66a4d12e83421150802996fd30d628fea5d83b86c50a29b3c3e749b1a5b90af97248079b1fc5d2f854373c66c8e78b6271e0b981ffc79c1d0fc596267542ed038ac5e3d1388a948629e7133b0e1b37c73a584d8e27961c711afd934a659c4eac1b620c9d2a3ace7173622f930c2d641e4fda9b5847524cbb18e283ae35b19437b8ae8f924bea4cac65f753d561b177c6c416f3e463b4ff481bbec492d342dca45a62b5d0fce515e162ae12dbea86f558bdba8d12db77debe70d560229ec49ad24863604953081a492cd28f91a5ab901f47622d4d1548ac3dbbbf31541eb1464694aed9d06177c466b11d526f32394b23b60f9b62a60a893732621d0733e2218b58e6d641aa862a62af4c964ea74fc416613e469024229647d2b0435e6708e221d69426ebfc426a730cb1aa4daef1e4fd13420ab1a6899f642f78c39e106ba874755e6e109b7ab83a890b6253db911c2fe6759c0ac4e629efc60815c2d70588c543e51ce3868320d71f765039f9cf4442aae587358d993acc70629dd5873de683bcdd49e2a9e2c35a25bb8eeeb2fa517b582dc7545efb180bd3eb613d0d4f07abba51a2cfc3a6c96ecdfac482831e0f3b8cbbd05fe7c13ee3efb038bc48692e7658f62794c50c09ffd5614b13aa33ea6d108df174584aba629c9677a7e7b087f8142ba3fc992c72583de6ca8d466e373e0ecb8d239d95780fd370503c2d74a58abf615bd10a731437acd152def4dfbf29da86352aaef4639832946c58e6ef2b88e79c10f2356c41d7f72b6546891a96d4e5f3fd795d7d1ab6afd06192a4c9ced1b0e449de9cf4af7a67d834e7d5e0316dde479b61a994277aee285b269761898a0e1573ec1827c372314e63d8558de231acb71dab3f3a859411c3aa62b1715f09c3925386292b3560d8b6f4f3e53c29a3a0f9c22a992c839a8b3fa2f1c2d68dbc1e89478dae74616b50df1fac324c58b9b0f8c48bfdcbc9e1935bd8917aea14c4fa2f9d5a5826340852a1324c9a59d8fcd2c68dc91cc5142c6c1333ba88d7711f8257d82b2d8d4e9ad30da11596d3a825e93a27c9c02aec97fa3987daefdf0915f6bf58eb4e21c2563285bdf303d51c97c2f20dc38f66ca30c75c14f6c97b287ef2d59983c2d6f0aee2ab7bc21ebab327373e98ec841dc4c5ba3039358e69c2d2158f626ec6841da3281d92c954a86c098be6aad4133257c28e265c474c51cdd3e549d8b781657f389f102b47c23639237385a89b6cf223ac327be629a60d31496e84e5520c8fbc242fc25622b99d36a529464e8435c771ae49da1cebf021ecf511aef38370937a212c61eb8d56ebab3a1e846d73e2d759e38b290e8425c5143267dce391fa0f169bd0e05198d59e8f0ff672e4f13cc5c5c7b3027ab04699afdae827d559013c58f326cb191d6d928615b0832d265377e3ccb8152b4007cb360e8f10436ee6aa801c2cfd38537d46954ca20ac0c15e3a1e739dc7c993de62cdad3189e5a91b9fb6d8bec2a74e6a195f2a6bb15fe49832ef75860d69b167bafa9b4e31ea338b1d754c8988f37d18228b4d5384b514b527a42416db49ece7111f8d232149c7c94477e4153bb85d47121f99c7882bd614cd8b7e0c3f3d482bb608b5bbd98f157beaf570a531375e6f155b86abe937f5559e9c2ab6d8d4798f5652ba4bc572d531b9277e4e5da1628f9571c7f4e19286ea9c629f90142b32ca147b0c1593a71c078d97623b1d8dfaa9d2e69c144bc830e7c60ddad7a1516c71e3a428bfcb4d9328968f1c954f426caae88462d59c63a894122a6fc601c5e6492e45868fbfd2389f583d4cc641abc38def8955f536cdfbefc472f1626c459c649ae7c45299bbe2fda938ee37b17c4afb9c51ae893dfcc606417272203999d822c64fce9c422cef6062fb92780cad73892d244f51e38f4ce6b425f6198bdb09c9f6c25d89fdd2362c4544cc375362952947d99dd1250d4f62ef18613ec7b1f41396c49e4b42ba18e28ec41239e7bc9b361b48dc9058ce3ce78ca99b9cc1fd882dcca61ce5724434b81db1449a8fc89d6ed26fba116bd84c4d89916357d38c583a864544ce48f3677a115b08291ec66684cb29ad8845baf4538670ff38a513b1038f7c8ef26394cbd2885852081f5b29967358fa104bc6ca3039b633ce4a1b62078e343772daa8a37621682039729da784d82f454aef8839c44d07b1e6af3efebd9cd25410fbc44aa7cae9df280dc41a6c52fee6b28c7902620f5a9bb3db319d27ffb0740ef59989609a4e3f2cd16023a9858894d987a561a75fcc0fee82c987fde63ad7694d5724f7b0449e9033a9f4e62cf5b0c60c3f458b49cba4ccc3aa17938a6674f778c4c37e133ea56eccb972b0efb0c389f5892926cb19db0eab4857494abe394fec3aac5269438ee9b0c4e694abb9215e6c0eab7c2ecd8e97e22f94c3e2683e38c8eb1036240e6b663091f13027c361cda41ad3b86a92e70dcb8590a16e5969c4b8614792172ff7cd4dd8866d33aa935fe9fc216c5825a64b521a7aea352cb99f41bcde6d903b35ace1a257f4f81f3a9786fd6156686479fe618686bd2a8ccf9adfe7adceb048fe34d950ff936d86fd4b3c87d775984c65d8420edac82e4fee9d0cab44c83d09f99b312c6329c73cc2579262d8723dccd049a395637418d618f7dff5201efa60583d9437a81c72c2fd8525c5c7991f529c49df0bcb8587f1fbbc0b5bdc3c1361762eacd13f39ec324f2cbe85fd626398464c86e1a3852565d31c83b0deef6461ff181ecaae465d76b0b05fa8b2991c827c4a5f61cd949163c6cab3acadb07de658cc89d069741516c92f3fb3a9b0e4e568f138e3633d857d7767a62fdcdcca52582afef7764ff62e8ec296163d8ef72e86104361cf981a2cc661448e79c216a7123756e5ccbf386129698c27c6eda7579ab0caa649394c4f532a4c582cec7f3cda941f5fc2da25219eb9e1495c95b0c4e954417334093b8a29fe420a364155242c65e5252a61a38749028eb0384c162a4886a1159200236c7ed2d31bc276d59780222ca923fc24f756e3e3041061154f21aea5ced2cc710286b05752cba87e552e739c0021ec0fa4e2ee324a548e1310843d1fd9454e991dea710280b08414adc9387f773a4ec00fd60a5a3231a74f998e13e0833537869a71875f0a1a27a0079b75ee88996d0c43e304f060f3907108870ec23fe304ec609ff9aeda061956be38013ad86634e7f43974647c710272b07d59ec7c879c3ea5380138d8bec3f6c7073a3927bec5e2113233c47c1063886db1f76a01add89238fcf81cd2a39dbe00600a2f58b163f08fc7539d5c881329bc58c516d71d33e791a8624991c2c31c134242f924206178918a4dcc53dda48e8f1f47e98517a8583d736292c6a1a1c6f8293655efcf94185277a74db13fcecc9052b0b0cd5729f6a8d1232944bfb263a4d8a32b422efc8f7dce20c12816c73087bb8c57626e85043570010ccafe8528d6b3549231acfbcf60d4e217a158258790e1743e49f00214cb5f4ccf547a86fd2110bcf8c492fc235a841ce73e5078e1893da4df4ed468a3d2e82e926250a4f0a2135b7d6a282977c61b22e582725d78c1897552a8186b9f3a7d215d249d2319b8c01d056c0e0b2f36b136bce84a2911628e9226b689167e3ac3908b6a3951145e64624b973c85cda4626219079e5743e4fd9ed5451209000e5e5c62b9d09b3187e069a2c7241885841796d8e72fde36865136fcd645920a4c9723bca8c466a93f766caeb8b0124a2cbebb579d396359407831892d9957ca9c3ad245d22001f0c10b492c993663cf077f3495466291f4d131b936191e975c7801893d4aa4a4f3ca186bd7472c8dd2586cce2d8bbdaae18523f6699c61ce8c3cee71f20c2f1ab1d576e40839e646fe388c58620a932c262783ab7e117b9c18d7334a8459add3f04211ebf9862bbdb449c47e397dc8609365a4e15210b17a6510657cf37d69fc105b4eae8de5302feaa986582bc46c824546131e2cc492616708562a19a4d458a001426c5a13bff142b8a4497a41991783d8720631e4575e8be4591749242082186dc63087a549aac12e925e70825e415141c18b40acaae1d693e72b38a38af002104583177fd873f4b3953899469d7ae1873d324c35890611e6b33e2c613425c93036f3dd860fdb3786e17266906190bf8b2412ace0a4105eec61b3cbcf61d2ea6d8eea610b9f0b639b1c85f54e1749e71812ace060105ee46187db30e307cf94e0380a4810033cecc11c64a03313e793683e787187e5c349ae9fe87a1cf50c5c0524a8810b605088082fecb047069736e2790ee509fc057a012eb8185475d87118090f7aa2a3137791448215c0400526a04ac20b3a2c9954477be2c40ebbf8094c0ae6b07f8e7c716b71efec413c7821872da7a3e7788afec6413376f0220ecb4a04e98ed520ea3e5d249140052b18c405172f40010a62100108a840035c70e1ad02ff5f01175ccce1051cf628be212be7d18ef9ee22a9b8e1c51b76d420a73f43927b90d2459209000d2fdce0dcc3fbfc1479b1c28b362cfe295658c5909b50cfc055c086f5bfba2f6c6688fdbce0054ece021380195eac61cde82ce34e3157aa8a6af1420d9b95747430e9b0348c5d241d2f46bc48c3f2f062d48f8dd58d9f857881861767c0426692eecc2078ba48fa1590c08c62811996fc79c2a414f57b37c661b0021990a0042a204436881765d86ac3e2a71ad50ce32a861764583c3f1cc4f0f74943ed22897ce1c518d6bc35cb104bef942c5d241d4f36bc10c31a2fc42ae5073f270a5c008326410d98046158bc4159f4faa7b30c0d0c5b659c3279d0989c097791645c40f4854dea33280b1d63cf372fbcb05d488dca3f1ee4adb58b2415ac40b9e0e2052758c10aba502eb8501970c1450ab8e0e2008087175d584cd2f6f24fba3ce3b1a3820f18135e70610b67f79d1aa44fc9e82e921c059c14e0820b2e4635e1c516b6d310a164733c3afaba48520ca00bf23ff0420b9f58cec0e2a701d8c18b2cac1e2a7ea7b047673a0a6000037f0162e00516b6a435938385751edbbb487281090c0bce022faeb0fc5428875ffa1721e7820b3222c20b2bac69424d9a2a999099430297010a56a035680dc18b2aecd01fe4db70631749480df0c0051ae06568784185e5ae3a055deb8731a6acc0054f822e5e1003160caa4091c08b29ac6129e586f4518b1927853d5987bc39329c63e8e8c28b28ec18874d953cb42b99264d1abc33c9a6f6842d8aee49e465b4f2d50b8a69e18513f6bdcc394622ec2289a80110680041a00103052c8881071ab0810b34805e3461ab5fdfe0eb0fe278a68b2412bcc0044cd8a224ffd754886078b184fdac34cf726aee06a12e926a800214c4e08b9020f042098a75a5acd095a156d2486ada7934e4460e63a4035c70c1823cbc48c292563a2be6dd5d2471c185111256c9a0b31ae1f4d1668eb0686d860e73a3c4616060108314e03b073c062830442ff0c2084bee78d2e9a234a7ff226cde5bead1a6cb40032040667841844d2b92e778c86826f5212c976a1a3f1ad56ff20861d5281d2b66488bbf38087ba5ff10162468ac1d08eb4fcca7f6d9153b8527c00213783b07b8e082c8800b2e880caabcf8c1ea18fa654e0ef4c112bef32348ec66b0b8073bfc1829aa5229ae7a78b05f8a85b27cfec5e0c50ef6186308f590318d4d8a0ef6338b39f3a7fb1c07f1052860410a4cf082173958bb1fa45c9e3b3eaef3841738587fc256f8fbf81d7331e0168b244f31194a08ffdb6db154cc343122d35d2491801ae0010934200529a000962e8201b558755267e9c65d000312101dbd00008d60002d36ddbab92819b398f259ec912f622da98653ffc8629d349662869863baa8c4628dbfd1a27c4a9f690a8b55fb61c55784cb07e92bd69473a24f34dabc7974c5fadfc143f4a41e520cb66251fbb815a1222b960dbe39a7a5345d9956b1a6a53d7e307529a7d145920c4ea0380906a8628fbd9f3a3b6a6f739f8a254226dbc655411a7550b1ae75557ceae831fa29b61869fec6b4c2d366536c39ce678c7fab1bff528a1daae50809b98c272a29f60d19ef73b84c6739a3587d2269c69582a25822844916dd5928160dc9931983b8dda8ba4892c10948f0c68f406001520128040340b159cc104c63084b79f29f58d2a5ac1cb9d51043de137bcf5834ceda10bdd29d5866afbb1b464ed88ce6c4e6f3703f7c2791ec79135b7cf8594aff68f36f34b176daed1e073963a49a4cac7d9bfab152e6a8c860624f36e97208cf25d69bb8306ab395528a25f674f16383588651334a2596082595419edbdb0d526253dd08192dc3d998dd24d6cb18c9c69bc3068d2496589f54c5310cd131060322b1e59cce51c6b36477372416dd4fadb8a27695c28f5843de0cb43b928e5835f4a50c53c69b4e93466c13ce6635678c581d3f8a1b42855634c82296c99f19eef9d6fca614b1a30c71120d53a30429114b0c2b13e75513f3f288d881c5c9fd9f64f1727e88fdc327ad1895342c850db1a7fe4ecf28e768c9510ab1e70b0f378689c3092221d6c69f39194d5ca9944150da9d628c0c15c4922bcd675cd8240fb140ecc1b7af6c33e8380948ad800180586387a812cf32c3e3f41f96b9b0a1f633d64cbef861d978f9f3a147b9cbf461cd1d2e46cee70ba1221fd686b92af626526f7c7b58e2585f8eb5e9306d7ad8c363cc9b6dd09955e561199b3f4751442e4e78d8d13d08a376375df1bfc33631c43a2bc964c4c70e8b8ee68c227ea9c39629ea31058b871e4d3a2ce697d9694fee53c739102c4f3a327ca01c5647291da242cc518c83123f4a9ac3a8e0b0c69e9061fc9ede6afc1bb65aef4ffa3192eced6e58735e77e7c7c8a16c6d58bd7ee341c64b15d161c33e9b3bcca488d7b0766ee3dffdd5b07e880db5535506319386756432c44ea2924c336858e6fbcce358ece59433ac75b521e5ddafce1334c372712232580b29c3621beb62bf716458257756a48668dad0c6b0c7ad3c917037922a13c3bab1ff1c5fa7c2b06aee10e65265581d074393249e2735f90b8b7fa806990cf52cf4c2be62e141a3415d58d28710c7ba739c89a38ba412a8c0042f70410cda5d4002a4129c9dc0202a30800b6b79ce0dbd6a2ee474749184f40cd8c272392a95c687601e1517780a48b082a3236080164e0fe1f555350a8cc3e0052438010a62c08420f080527e56a082634016760c6dbd43deaea8cd5901098e0a0c096860822783410c30400313bc0500080cc0c212c252ce290e4b36af2403222081081870852daf6e860a9ed67f7334062403222041081860857d3e9a8ee6acfc9bf22aecf073fa509f3bc7ca5b790003a8b04c06217dc5e0abea2853d81f67b4dcd9717a7d94c2fef5382544bbc9182451d83a626c183a74c8d98603180085ad3ee3854b9a538ad43f61077f7b9bfe710626b11316bbeaba9c223cfc7c69c25ea931f2a829ca578c3261cf172dcbe7c2252ce1ff743c592cab8e28618d51965358924bff86041890842deee690bd0f3673b091b0a4a39875e93b837b94236ce981a94e88f1de4c8db0a30bd921ac995cae598455c43f74fd451b4d95084bbc990df96c7b42cc86b096e58784b0a7687e79ca736557461036b5082162f2e9067120ec20e332cfdeb578f80fb64e1e0fc626c689b40fb6080e6ba363701b323d584b2e4f0e21dfda5478b04ceef0a82bddc15e1716ad73c8d570ea6053f1b11453e8c48be5e0a918561fc3c73300076b6d3eaa9a90b18cf1b7d8f3a4f0f90d7463c76db1a43c0a2134ea9474bc16ab8f75facdbca7233b2d360d52f7fb17ed2ff6596c71f229ea850c25322e8b65bcbcce41fef44ff158ecb3a9e4c4237e7574582c758db7a256bfd7f357ac8f61e54d39b92b160fa6714b4cc54ef256ec79316568ff3879aa59b1deae6d8ae44689bc8af574673c1da8a8c4a862c7b7f321c5907661928a1da5aa4a75944a3a878a753d23d9982be568df2976e418a79d1497d4a3638a2d53d3c70d19a7149b9a68a6b0cc99cc27c592529cdc4a8e6289f86b192693a9ea8862071e345dee878c3a1d8abd52ca7d94c9d16750ec93be6193570a71e4fec43af9d5e13ffc66baf7c46a395c5fec8f144f3bb16ea4cf29864e6d3827f66b7495ab1f3219b689a53a348c9a2fa5fd686275dc38c6ca8ccec40e45d567729e31b1560a193c367cbcbdf325f68c7e42da99e81e0f5b6253ff1434f3757478732576188d2c7326cb7a664a6c92b344ff24fb3ac293d8cf6b2e56d4d2183c96c49241ce4146277caa184762d158954422df86943124168d9211f9e02b558a1fb14c54c6a6d0e91c8b1db1e359556d94aa4ee3a6116b574c6333a3dee88881a844c7c3c22161010141c1e0e0a04060606074ed3a43180800000463419023511244e9031480023c1e163c16120e1010080a0c0a080a08060a040004060604080006060800040400060608e01193106e00025a44a1e8520a8b62820fa961834b99f6b917f1673915de9f0ab5a9bedae966be543a985d1e661d2fe43cf5c0b7316041545642de9af1178bcd3a801c76354a272f2985d2145e964ebfc952cdcac9ca79ea314e497b453aab2ed292cdc6f4d16a59f8699717ff12978530f93597ba65aa6292af40611dd1e312c801988d1f10f392e8e73a92ef9bae42d8298dffc9ebe3098265d241e826f965f620249a02f5cf29669951bb3333030e16f9ecb2710fdc5bf616ffe4187b1d1230ede51c38ed24864727d44c2c60229aa9d42be91db70fab943e4065116c1135ac7f3a270ec9274c123125e2b8cafe454da6c05397b2f88224f516799844975a5a704559d38320c907c5677b31e95caa838515ad02fd1a81665f2030f0fb8c0775cfcb50ec89090e7a50f6410b6908d9ee0f50dab9cc6cc9169abd4e86bb2410d4f2995c8b151bc64739aed26d05569bb6a8c7040d03a81bee8bbe3770e90ddf517a9e72436171ee02fb223bd84dd046a6a1d790c65ff27081acd5e3555781030b011751e6c067d0822a32907841844345b29e5eb04ad13609b5760159546b76b43dc6b264c7f25920a5e974f0d6589c1b0828a08ea77eb25f4b7ddc46f159205cfe2c4e0babf8ec4dd9045d83f25b91544aa74694a654201b5af50b73f860fd926a576dd4235eff7719e0926b97d7a4c52b667540efcf0e611bba3fb3f24e7ae24776e775ffdc15f818dafda524faf0590ac466fc69118caffedea723b5c701b802856118596fe05b83c97ca796223e14727b99730e6e5c0e1225235c55a5cca7710904e75f0ef9a65d2e0f71c55cb5156ca5eb1aa6ca12a57acbd594b9aa7bf62abab3ec99043fd20e89ff796852be7c554c637d8e37099aae14be69500467e674b03cedddc67ab4948b1a7a087fe014450669da4a1fa39666a21c0c4ec60974f58d6313346731c5fa8d8bce872f2716d2baa53851f265bc155a8be2b14ca02594493294026ecc7986b0bca5f33466acee0d8f0e6e1bb38ac2fe2ae9001c1614a320b4a6df7bab1c176bc400c313e9a9f91d1376eb8d4fa9dd80721a8b6043f1601a42916ad2776d1be8a16e2e29a4ab0b6de6d4a08f66f6a07a04efff2abf12c635db7b5ea277f3370207f599577a79ddcee44a71132325ce1b28b01894c200f733990b6b7de23aeaa7df7b37268d8d67b0e2f56a7c26dac1d6ef36bcef370ce5b3ff2d8d245fe8a15662afbb8edd0e2b839fd467bc8d5d2799acf3ac25d00d7ed8660d8ea7d8fb5fbd20bba166424ed0e82d8af1b156d682519c32cb61ce161f46bc9a14a7cdca9e0c7f4cf6be2d0346a3f8a6afc8c992e582832729160f1d883c5743ab756903b850c174a98005b85c4674c64d680927758fb36f8affd40785114ca363f7515250997d7d47053c808bdd1dcc091b38e119ff75cb7b87a4336ed92c4174f3f3eb4854fdb2dd16460d8c0004fb28064e56481e89b16c08e715e78a93304dfe2373a8ec4d63afe24f06ee9325bf18657d85b8b0d4ce50c43da93e04cd58014e4d6ef70769c9466873e496cf5154e080e85b86888622a3ce1715022b5f28b40a0a7d7a172ef0b93756dfd66247e4bedc84c7941a8c1b07fe0f4548e696463d6e5c86c8ade04de1b8d25fcb6e10009f0421304f3751a47fe2133bcee87f89b063451a4b58a6609286b6092f1d639eedb5a06bd1dfb996831bc4276d691535a5c2403f22dc0157f16db7eedc77a050c5a9dc37e389f5bcd28b1e7c0d6c442a7c4d8a09ff83dc51f899aa4db139344599916ca6a99b5df28fb157161db5095393e7deeebb85782958fc748016b340150b73e9e80a88d0d0aea3e43183e74d9c9808233cc3e28227acbd538319e3085a73786bdf5899337f23c1370287a3fafbeda6f94e90af02dd6da13060e8e06425976a8e60c9b4792df36ddaa4a9f2ed55135d84cac94bd496ddbb36162c0cacc026af234ee9b28aece305e1866102a48eee0fd41fdf2c030aac4cbdb3d40f84acbef731830dc11a388aa5a979e649a5db2ed3a9cd080bddb3b537b9bf29f89b3b6dfa4377144929449c214ff4999adeaeb23e8a2c86329e13af36db025dcd1d35543f47614d2e459190b6254fce4d2a7511ac1a857aa98ba49469fdf7855e152d6a775f6eba0c9cc50ae4c18a191d67a7b783e905a2c72d79d2e7ea7f96bd11f40dbe97c667dd7477f8cf343ec3fc526a6f848345fd45e8860627f294220ef0d02fc659c1468ec1b13fa527290b29920682ed980a75585b23e416e7657fe9c241ebade4978b6763d9874a9f92ab3745e29660438934a555ba91af89c5dda7f9e1e1e2608c4ff0a2f2d8cd93ddeb3337f8af9dabc0c218022ab52f63f074e6e4d5f3fcb0fb0eb5e4ccc3be0574c23c2fde1ac44e6e44483d6256d34225e1878e9fa09f26ba86f001aa38df59fe061792185a7157ba18859355eed26409bc5259ee2958f9da64323abc85fdaa02e2e406319018e96d587127345377c92bfcd7a568a511c598af1d3b3b2122d15d5329791fa9e4ec68391ffe94e42b9a64f1da904d428f6d2a2a2eedf952731e43071f2b234d14a35fd310677bb516d4e13ce22395ef116b42ceebfb24813f29494cf25587ca70c04384b5b2c1152ea2b171cf78c702675011ec7b9fd0e82209b1a43ba06cc80ea044cf82f302e6dfc797c208f29af17692230194209bf5c5742a9713b95df8aa8b90d677ff893f70eab7efeb9a94a5863a3ef936e4dfd877391f2fbd5d25cdba7d008ad1ad4e208965f69204a1698dcc21098b1bd3ef48e5e4593a92edca3193643b95bcbad13858a767992945497c4a5750da47a97b4a6f94025a5b299869fb2b85299d0e57128bf4350f7475b19baa2a8101b05d042b9b8e3253aac3539f273d3d4be2e986e72d0fa0b987ea53dc771fa1f050a18a540d4b209e878a54274eb56dde3b4e38924b3a4e441af9fc7b73e46a8f4a55a69caffc41995206af8c5306aa2c34b2fc9d47bf7998366798c195f7ca83cba6c4dc9f54f2830e562c9cba3b8452670012d692b51d110fc57230352c6d69c707c75a0764341e8dbfceaff16ce3d7cf1ec39c856fdcccc6ae77e10a2bed316f24876153e50f8ed122e95e00ab6d643e9d516723b3e98c32f389c5b3148b9a31704ecc0e2d46a36861083199db4c73b8ca1e82897fa8f5df60b51b150ded2d60e1fd42740c5ebf16461c67e250e58685d1486bd89db70ccb62e0bef01ec344f185112a728e53902e8c05753dfe0ab540cf02a08f852156888cc1ef0ba7048621c64c91d62303b93cc3c8fd68f01950f70b2378bfa181cdf419ca53cd822348033acbf3a25289468de8c19be0bf0269ff3269c4794f4c5fb2549b64f00da4df843ee2219713f3ea986b5ce444b5aee9d462577ce0c2e1d72909347dab80f2c5a67ffefb1987427568d3a3adb6209c21fe07c946dd8bcd853828195edd6e78c2fdc51324ca9a0003744638943fe40985dcd21c8f8640e6b074cc02caa2cf5228f667d92f633bb49d14c7f10b08a9028a1eea4b7d9af2ad99b38aff75d4cba87954e9eab9f47228c676410dd16635288de73e3c34664cd4c8e364ca0a2f184825385507a6a296ab5e9f267035961b363627f566522382ef2ea365ea33d14e3f27570f1d07366e5caceda4341262641e2bd17e6775b758bdca8a09e86c424a70bb25dfd6b8eeaf6bf045cba9b7abcb9b49f8343c916100dbd89a90a221c581811f03172d44f4c8a8911019009e9c877c681078f05216f69b35e1e2c7c6c84f38175816e0dbbb1d9d3157e889fac3c443a44923f7ef548ba9bfbcabc99eb7d9ae2f8373d3c65e814b92ce29522ab05123a226ae99ef893bd5720952049872ec668a3e16e884c8830e15775c9cd4dd368d92b95172d23636db4bb4b3de94c1108375b57a2d19d539120d418f01047d56fd99dbaa866a5f589afabfc53ddb1a9ec8ec62abb85f39bb6eb1a31436a6207633ac37499bcbad1d9a2839361b0bad04e6596a1b5f99b7719c87513f13c31041a69d380d4a9c9aea006e8e2ed7f7966c20976079797d787fb9399c8f0bae5524fc0fb1f8134fe6512ab9be4824bc3152dcdc87f3e33eab111ddf13157edcd93a4b2accdd3a2041a66cbbb78312332bd07c6ebd30cab5aba02277e2018fdcd5c40b1b4924ee17572707d7f6e969532d8abec0fbc50903641a768e014445c20d86b2f53cf77f92aee3a3e4480b2d146ece0d1bab5062a6c2ac14aa7ae5598ac9371f1dae6f2ef7372cf917a7ebcbf0b0612e4fa572c7d0c3f2297479db9026461484c5bbcbf699557ffc3dd1404e9b545182c05bf0a71122941d5eae5f6f53a3a54e4991e6707bd3483f3e99f07f70ece8fe70ad2d504aaaf787d76776df2528196055bc319273c724192add06b1844782e6f2de3fac77276be3c231d55ad7dd78f74747d7eb7b8539a01dd8939410151102525a0464884993458ed83921b2e3cbe9c9f1f4eceafae472df449838a3c8f4abc0cc51e53c29062a1c2a0a405932251eb16758f93c7e7c3a42e68a29cb383aa60ddb611a0d56787774bfbc3f5e4e1a445ff2930a36f1fe747373bfb3cc1819d61eca90fdf1953ec5823133d3e74f9c333f6376e284b1f95454a58793a0368717bbf9a0b1534c7859664496b2644a34c95a0d50c18bffef6f9999bf2884d0f1e5f526779e7310cc1ddd3ddf1d9e2fef0f361878c2c33e748ba58483fb59e4b05ddf7b0007ac5db52ef6171d8d4ab08fa73aa682c1483120d78af89d42f5e2e0ee70263888dcf58a87ef9707c7dbabd3f9c9b9e4b0cc6e0a4337075683689a600b39b83d9e1dafa7c7a77321a35f1acd29449b92300922c53e797e308e0e46984859793cbbb85fdfdd5de916909cdd9ff4a3cbddede5fcce1a957a383f381aa024d1a04d91ae927f71beb9b890cc2cf2f80330323ef7ee748a7c3b3ae43d23d09b88f91de7992dfdfc7a432483afb74d4566db1f9d72d86e6b89b131363095522637614306a68c0c1f1fb15cce67699f5d8ececf8b7d43ca830e5efaf1f5e0e0bc3d3a1f9f9f9d9d5ceeaeee76fc69e622aa081ede2f6ffb8d052ff23ec5cde1f5eef678f7fa3a39391f9d236b5d078f3b1fbc3023a4cc6183b1a3925f5c26b6a36d9a3de2c5a91d7a12a4b450325b2c083e3a3a3e131eb66cfb2668880d45a5709319e2a8a17946c60e1a99333f7ad6fc900307e921b6b48886e154c22bb88f43789e8307a7762523cd56a46834ea7faaec173b629484dbcbf13196f4296952a0a2e828886c77d40d09ede4c5f3ede9e4fc1c35faed60c3c279ae0c29378b4146144205727c48b68fd58f16dae1d19d313357cbe683f3cbeb4d6ed685d3156be7e4beb8399e5eddefdfdfae6e2e7757e7eb5b16ae645d6dbfc315d1a772a3d22d302878f0a85403321a35c9089dfa35155449cfa24753c984d175e1f0f87674757d797fbdb9b85e9e5defaf0f6707a7a3b3f3f1e5edcefde5f61eda92b5686782dbc91a9bfee8767b83ae0a050d0f33f7fc7269422121a3d38f4c522fac0a196912442a9dd92ee76a881376878757a7c7dbebd3cdc57976f6747c6e9408291d4aca34e9d1154a17d27b1025212a3214542951a50f4f27c787d383eb6e570742d9a6babe3c5e5edc8f6787f3138677f5358179f1f1f4fa3a39389e9d3d1d7523331c10009d7b71beb8badfbbb4659fdc6f2ee7d3a3f3737304643f7d500db616a24d58c98e3e6ceea46488047b639963c04b458a6dae5c10a6234c8e78767e3e3dbb5ddfb9dd5fb077c93a2a8ff3d37716e48cbb6b0b2afde4707c723abec19e02b5ce1ad63bd52bfca3036c1f91b848029d5fde59ceba0d0f866f793db6cf5dd9c88e8c90e8890713f4cc4d9bec1df5229ec093e6cffc26c838a1e9b7a6b8a8711386183c4a4a650acc788fa12c194a3a99affce85400d5731292bc635e8cf69a0621dc5147107430b453cf96492615c038c0e460bcc3a431a16414ab18d55b4086ed4ac120c0c060f2618260746104c02c3153649a3015613a60ce60fe618e605e6132603c60d23121326c0c40192d8c7018258c441806182a187e9833985f9803300f987ccc7d40866c67e2f8f08479c260c37c803912067640cfaf531d411a110aaf7e341e0f01326f6e22ec1f72426ecd688f689e63a3b95b82595a38fbc86bd2a8d7148208b80a7fed0ef236490be9ca14c22c2a363c4ce1c1491be2d9f95f404b98c1595cfe6eb3416c82a2d581f86048e6585dc72c19387f7636098c888170688adea8fddf93300f993b61bfcb3824270b386fe942b62549293f22855e09e987abfa351d5d3c58a86ac2f5301dbab4b50c6c8f0e0d25d4e0a873621631c3440359b2048f50f4aecf00d6ba37a0e637a02523d2b356ca9e9d39918c4b88a2e768dd1478ee317523441b64a184b9956f59bdc9ef867dd6fae5143914d1d809f143ba9260fa0ab2049eb60a2c40be8a866426f45964011b45767b5d84679c417083cd5b47373236c48b928756f04d6b814cfffca634c85ea25c4ea1f49101889019331249ac308e4bd7e14a62d9715b1b0a9bcaf804bdc33006ab1bac6e9f1dfc1f57a7b9143024272a27ed3ecb1a03d95af2a8c0523c49dbe0166cb4f8a5b066681fb88489772673010dd63f2dd1dc5e1b2ba1e79fb49b44cce40813884b99a0b76719c5168673ee51dc2e507c9e182a4bc598cee1850aa3e9e3e8639e4297e1142e645962877e8037efb0c198ffe9a05a63fbccc3b2658638885227721f513946b5f5b58ef6711f36b6cbe301b68b07b00f42f906509e66001c4b19eb2299209aed6e7f26f9951637611c330addc80b4c8d7b15a0f1399ec56ae51a7c4da69f83170a465357194bfd6f97c182998f3717aa4cbde6ec15825561a4ef1d83b6939b0764b31e04973a510bc5918558068813a386010a428e5e7190813bbdca99e0477b7f5395f49f024e6884460b3660b46439330f0f0f0f0f0f0f8f1c341352db36863bc82465aacbd52715719a644a49a614096726bef47466e2834248b2daea90200c107d0bbf0a3f0b04d31b445d26c4400413828757c9ea501fcf4330c93e87b4a2be84d29212420c43706b79fef77bf739941f885108d6479a65ddfd1434330bc420049be95992fbdef45278b6821883e0ee73c5cf2482902af687d6aa20062a48cf134deec701238c3f14c408049f84d2f8938f1880e0449bdf76486dadba3eb4c23801d020c61fd8cbd85fa3f7f3456d90cb8183eb6211c30f58a66b4a2155a55c9a2b98ed4589a723efed05001bc4e803dfa5946aaece27d7b4e60bde8005e01031f8c0684aebddca1e91ae97ffe2020030458c3d702674c90841490f6c0915cb245c447574f0f3c076f4ecba9c60cab5475f7491ded1175d38a0468df731c4c0039b722e19d3dd5a0789c6b8037ba537940eb9b603a3b57fbb9a99eab4ac1875e047c99c2a59f0ea9cc4187440d7a9d7d4687de478cd3322c498031b73fa4e1eb445e618fb62053852d0457b7162c881bf58316853192252fd94408c387031a909696732a7519a1a350811030e4c8e2125b99952d0374bb2b13570548c37309276554458b2eb9cfed02a165c210662b8811339b424bd177234951c428c36b0265ba2f5a78e3f42ffa165c35780436d0b0e3c20023288c186b486a474d8e5465e808b2d2ad0616c2047170c28f6458781a3dcc811c64120c61ad2daa136691efd5b63e00531d4c086b81e62f54bca3d211f5afa91238c479986537ef1d14df79c835c10030d8c484127d5e952a97cc1f002c7b9b100ab03c43803e7624a521e51cdc0594e29377f78f89615a30c2955b1d664f1636f67b6e0c0034cf085066ad4f81b606880587f70d11f5cd4a8d11fa76f680c3270294c44cecc6f18fd1f26c618f410cf62ec1cead71862e043545de5ec90b4a39ac6458c30b01e428c947a3fccb2e1457791e34687610a880186d247244b2eed3eb470d84041ff0d2f1ae30b6c4a6ad2a41e59e771f702af9da285794abede5217b8d371d2684d2217d8a8db6d766a7273fd2d3039c964d59e41923c951698745bb9b4049511cbcf02ab5f252a05d398d1372cf056393a4ba5068b94bf023b16263387c9cf685b812b1122a28e968e575215b85135e1bba2aa3187a8c058660e6921a6da4841536093a992a331660eea7529b097c44c5bb3a490e189021fc3e34ed4496a69d450e0eccbee74dace13d88fc954c8d7c1d55a27b049b3797c1b3b1d546c022779c553a635abcb2913b8f3be9cd3c9509d447409fcd7d5e41c39727b25b0412fa8aefb4af2c926810df1d24f969062882b12b849e11a27a5c449b23a022bea43c5cd9da5439246e04e9908112fc44e3a761178ed2d95f4f847ce151281ed9874c86fe5f1f44543e05253e7b7f3a4a3bf10b8f2b4ffd3247350c90f021f22c974d7510102a394ae6edd248f11253f60ff5782b611161fb0d9732651f2c77214951ef017723adf10bd35d58807ac6e8acc6699e6f9bf183be05424f5d59363f2ce493174c056249184dfe5911dba183960d42ee656656acad91203077c90317a34af98fef28b7103de52fa76532d3a6cbd1836e022689e2c32a5f6d2b11835e03da878973e67468ac5a00193524e6a447c1d9f189b051f2985f2ed2f65c107bf2c31ac8f055b6ee32122c5359931b060939a48114998eb8ff50ac6c72599bc1d6b5129aee8379ed457ff5bc1a52913d5d198163ac20abe528be8a6d12a185331bc82bed839a9d7a10a2e2bf533ea9ff649928e541cd95247af6497640645c0058fbee8a2468d2d3840811c2970000c5ed002fd41072a4cddcf4bcdcaff6fe408a3e314fbe6601bf5324c654cc1a7c73f152274edc47cc1404729dc283992e5b8a15df7400729388d75e92f9508cf3e8d821fc9bb9a5387a524f3a260d3d8a6da1c1e3cfbed0805dfa3ad5d418d6e24610728788fa2b39436bf361903015a4004366c747c82c91d849c9882550e161d9ee044ea8a20440a32c8cbb3a3134c1ad5f92124a8f86b8e2e1c2f90a30b06d4a891a30baf5103471860acc0021d9c60eda45dc4d1412c947043d1b109ee5214f541f4cd4ea63fb4ce0460131d9ae0ad7c47092deaf67767828fe17ad639c5bcb136356ad4a8416aebd08109d6d6467256f2282af71f5a557ce8b80423dc5462aa0cc28172bc09b45882f7dd30d35529c875cb875617613429956072be7c3aecc60f2d7294e0325f3368cad23927ef43cbc61760d8c84970ff9e525257fe29e9ca246150e2dd16163da7f1838b2d120d02356a4482bfa46d3d871053bbf61f5a37f2025be75970690111d848400724b8f033774f3b49a4463eb470982c743c828ba739b3a95e8c76a62318e997363a66379d4ffaa1d5885346d36d1677b4093fb46c2023381de3c8097696d38d4e7f5166118c1c097e26648ab82e32448722b88e51a485c4a042ea89036983e848043fa2134d95a7effa2822b8dc99e2e4ac3a4a85e4e5a1e310fc87bafaf68d7cd16d3c741882af4f5253c52075ef3a1f1d8560db62a6cc18c2d25660648d1ae802356aec133a08718b10bddab123a60f83ff1b29c78d67c1df3070e8180477b1ae4c7de4fd9319213a04c14955c96a499d644d203a02c19f320d5516bb362d0f086e2d6b59865231e44bdda1e30f5c6e34addba6d13e0801c00e1d7ee06488189ec94e525f4c1fd8d0e5a3ba2d6ee4bf3bf8c0a9654f7fa5e627cb1c8d6ce4b801468e3e5d7871872ae8d803fb1ad2d3d8954af57b81bab0f105186a81f70245c0b0a1430f9c9bdcaf131b3f4a391074e4818ba9933acddef0c08da44a1d63f9c7b1a4bd03d7a2692b8a10ae1df80a66dda24af3a5d775e06a3484f46c39a85f45075e3f645091a78642c71cd8aa1132e5d5aa5a47ed0d1d72604589de98c272960e2283868e3870ba3ca914254f77f30f0746cb3d698e99dba3c6e8193adec07a76ce489ae75763ba818da927bea15fb2cbc23630e69b354df48e58fa2a6ce0437554d71fb58f555b1b3ad6c0bb999498b32f439250193ad4c0d9a55f4ef70e3abc948635d7a7d2da776dfd436b0b0e3c206fe40863061d68d074943c1d96d2d3c5fca1e30cdca80c59cd3658d66b06de53d0b78e23f7ee8365e082cacf4aba77c12d880c8c6e0ad716e57f5dda18b8084208f51ed5e89a1103a7134f926f454c3555030df8424718b80cb9a2e489deb9ae57173ac0c07b9ef426625db0b7f20b8c8c3e322584a4c73762bcd0e105eeba438c49bf46bb9ec9858e2eb01d3fbea5f47e153ac22d7470814f9f837b7a3b9d31695be07386ebe56c29dbd36d58e8d00227c146865d08e964be6e80c1454716b890cf539259b592c820a2850e2cb077a94984944ee468fa2bb056f1f428175159626a054664f537e549e47dc6add05105fe4f7abaf44f8391c8143aa8c0c48ab8d93a482f1dc40a43c714b8ff1a69b92dc4ac9e4a81d31d246b0a4a59c53b21d01105fe2686c81c3f26494906053e746c1d4d2241759e743c81d1c9fff57749abaac7098cb0d5f3589362aebc37811139a6605e3967c9f732818b1a1a3d44769ec7940314d88280a163095c56f10aaab4365ba4046ebffd54bcfcb2ef4a125833cbd7b5f2fc681b12f8d5dd683a73aae3088c105a9234dd9a3f49aac308fca41482b79d6e3dff011d456025c914fa37e930e0c6d04104fe627b321173ffe9895da16308ec96d2df24924708dcd876decc14496f073140858e20343169bc09faa27e1d404873c99442744fd1a4297ee8f801377a5b2eba42be604aa1c307bc7fc7f024457750627280025b180f64d928c3025bb55874f4802fdb8b13b57f47d308012543070fb8a4238ad29126b32d85828e1df0bf15fc2e548f1e059d6303d745870e18db4c61b513b535a673c0c6939f792786365e7023c761600b2eea705499a003076cf48e9ecd5489630b2ecab43a6ec065351791f81afb42018ece61e3adbce82fba30c18dae80a90974d880d76413db7c4be65fb5065c08a2c793654e6a33892ca183069cd0a583fa175b4d3f1a25146016dca80bb2bdb44416dcb57e1d0b5ef775344b50124d5558b0219f8e17f354438fe915bcbfe44cf5e61a4fa45dc1e75edad4f4ef2afd5bc1fea8265193af5e93598502b0829127bd52a80ee1080ab00a46694d0b96217812f368a000aae03d2ba78bfebc2145c81601e6a878f164cc33c1c6317dda930e9245e598e0f57ced2be774d5a74b7097f574ecd35b82b1ee8941f763d2ec5782af0d7ee31b3a25f694e03d72d64b1541758b26c168a43832898f69ee48821d753159e505fd7723c1c8faae20c294c66b21c1ef4b88ba1da64d691ec14a52916afe9ffca48e60440c1a94a9da083ec52d2f5756cd3219c128df5cbee1b13fa9f422d8d4229e928688242dad08eef5ac35868ca823441f365af05f1c130c9008f625f6c6906123821fe59eee1a82ce54e94370d5ab3fe9df4e74922198b4a66bf5f773f72f049774b449ab6a9264040310821f15d15f8d6a396510dcf65ec5a4c6fbbf23084ea346941cb9b4da81e0577faf444de2a41c105c8cab162c8aca49f7073efae91025d2e4aada0feca98f8994d93ef09b162992d4f081edf2ee90ef6f9edf03a35349cfe0a3bfe2aa077e3c44c516bddb319a074647e4b4a2430a42a878e03c477753f1256512de81b7cf49f3438e25ddb303a3b953453ca14c9d6cebc087607d794dff636b4b072626ef31110be5f1da39b0e527a29d4892036366415850b2d674290e4c3c597ec1cc5573090eecc68eb973ff377025d2940a9153481372037f3a3d249b90eb1dd4063ea96c67e2a672d60e1b986cb72754dcb417d93570d1b2c53c35f03189121de2c4badaa481bd131293e9e9ca1d0dbcc555cd1938dda1aac64c6306de42fcb41873b61fcf9481b718c7cd926b0cca3264e0b38b789d5fdacd791d03db697abc4527d3e9ab18f8a03545c9ea583a8e340c8c7e4b48137d3345a460e07cbbb368ac8949d5fa055e628b8a9344c5de56bdc09f75327353119469b40bdc64cfb395d4126d552e30c2f26dfaef8f9852dd026f71b546639aac9b542d301ad15c545cfb1047cd022bc184b6242ab75d50b1c0a6e8e7254345afc0061f4f5a82c8daa5a915f8adf74f5fe2b56baa0227d26d3ffbf79999a8c0e58f57b0b25c4af353e0ead376c414ba7abe147897241a3fe507534f14184b551acb3a6e58070a9c4cf73e3183e510ea27707947f28e260b2d5a27703ac64ebbd72efa671378fdae28c9433a3b9309dca85548cdef341f97c0c8188296f81a279645095c14535a4f7d49e064e9d41dd1a0af3724709742b552fc088ce9674f9e35d3ab32022b5a32a98f481621e9fad6218e9e08fc6584d49522f2a1b53930c010584d9e56e3d952e62021f0af2939e7b248b5a320f012276daa241544040181d7b40b21d5e7078c12d3e731ebe76c393e602475d25fca8248a2f780bd78fac2ecf387cc79c09fc54a6679ef80499944a69cab93ceb50e783f53e36d750eb8fc92e4a91444bb5a1cb0316da58ee419d773033e93f237fd5cbfd7d8800f226dbf45bd28b9ac01674997ceeb8d393f67001a70e126b34adad287565512b498059bd362361d72b2604cc44e95ebfcd72eb1e02de8e96cd9251f5a36120bc2b091e3f4176f0a169cfaca93e4b5b8980c5fc1660fca7288952bdf86aee023db4ff2cffd2b2a6c057796af2a5a0459c147f7687aa9eb459e56c1aa45ab2433472de555c18ec69c2d949ee89a54b0961a5425a5a4238850c127d5289625a5e4163a052792a7ce21454fd26e53b4ef9eadfdb4a5e0eb7308a9229252ba2505a792f75fb39a85acd0875618675a8c829ff45992455562881105e3976df94eb388a8a1e0b2d3dde34791ae8282d1163bd31552a849f9043749976dfaf81f774fb09154bcd510f53aa613fce54d1284d29d524a71824f21493c84a46c82fd4f293397af092675dae892f299e0fc740e3a6da48f108409ce2a8250fb25187335dfdfbdf1505b821f553a2be75b093ee968d5f15e478a28c1498ac1ac3bf4f23e093ec554d5186324c1c9ceff29fe1a09feec738ea4bc7b4f90e0762d24a193a5bf2b1fc1d7644d16e48852330495de6904bf7a6ae3ed8c6082b632d5f922681317c15dbfa608f6574d4ad63fb7950a5a24821fb718728352a1a73a4430da22d6c591b816876093de8aa94292f7137286e0c7e366c5c89f744c8560f5630769b1358f2511228716836023aaa890f51704235abe9744b3ae8702c18f440f22eebfa91f40b0fbb152d095e4f875fec0a9318f1e927ee094875c49b78e0ccffbc07548b5137f4bc598e583da9b1bdbc321e51c2cc6a492693a045ae8818fd9af7a2d4ed23998075e741491c654decc100f9c9a34653b52e385e01d3865b9fa4c594515153bf0b1b3c8fc21259df55207cecc3af669f7986a313a702e9a9a93de1ecf98cd81512e2aa8d35e1599991c78c9f9f3ca92d234497160afc39489e910ea3a70e0a39da5a8d137b0297abaf8e72f1d750327f3eb65f698d49ddd06f6db3d57acd9c07d9260e9bb4fbdb9064e45331552a26a40811669e03b85dc63b14ae49e85064ed88fb6d7926b1aac33b0e5e957937d881938a9a17cebf6ea23576560fc23d6e898a6648914193811ab0e55419decfc18981462d61cedd22678c4c0559031689d4821a54e18b83411bd2a930eeae3606063b0c8922ff5bbf62f70418d593ccfd376dd0b5c4cbf1b323772c77817388b234d921e5b372d17f8dec91272faf4e8e916d80ca252f792527f530b7cbef5e815611638d71493b64987948258e04dc97cd954635ea75c8151aabe6b79f72d58acc0e498f527a355e0fa3d44f28b51ed3a2a70dade7b2cc8ef60da14b8f34f22e4a0720c5a29f0c92d96c7aba2c075eccf5ed741bdf691a38b166479d107054e5b9a52f1d34f60ef3a694cef7addb972029fd6a38dd09126b0fab993a4d86b22e6cd045e63b64ff1d496c06826e9397e0ca141b44a6045f27fdbb99f04f6935a8aeb223f942791c08f461babea1083d6f5087cc5105cebc33eedc98cc05a5dcec9955dd172faa1b50fd0a208eca6de60264d746948118153ddd39b2a6e4e33915d408b2170ba6a64daadcc4d3126d042088cdb76b29822cb34a81f5a7f63056198175a0481913124d539846801042ebf2849ca3ae507fc697fcbd12da95b8b82163ee0a4c78b9944599ce89e1e30218d8c98a2e59f74192768c103b63fe73f9dbd73fa10b40336f97745d04207bc26a1935e0b1e226891033e7bc4a0a4989d088be2800b719d94d495d670c914b4b8011364101d3c8d84686103b63545ce39a6f4a1950dd0a2069c2719727a309121aa03022d68c07bd87da45097c474e5434b67c1a9bcd51f21e9023164c175f0d4542a84d48e4d20462c18193ae295cd62b5e71f5a8f0316dc6accd11253ffa155afe033fa5daa0c12af332688e10a3ed3a458eaad7713df0f2d1cc55a118315bca5dc904aa612a59ab120c62af88c96ad52cd847c0d7e6899a28118aa60d74eec47448b05e6458c5470e942a50cee3978ed3150c1fb66041dd51d740aee09629c82133a4b483accbd54670aaef3d45bd456ce60a55230a653482985e0bfa63e2938d32429b88dd8af3d0a3e849cc7cc93d0912a48148c7bca964a6bc938c2130ac6b4e60829c74c9d4a07051b21ae898afb9929da4ff09ea3e3a931b3daa027b8efab14bb903ae9443bc1ee788a05fd2fed6be104a32267a864e229c45236c15f1ea554cc9682658c26d25bb6a3fe920cc6c804a7bd2c05b529bf9fa99860345fd2397758aeabea430b7d189d021ba81819625ca21c23a914f2a706d5170e1c7fb6e0c0034ac5b004f7aeab57b264ba51a20fad4730c4a804279e5b553c424e13744ab06af71b62e53d09c64b6dc4a4795983144982534f7133fb7f6ff03312dcc93c794d5f82f7a60e12ac794e9f3e95f608364c8d778ef9b385987704971b3435a7dfc70b7623f89cab4e7345df45ef19c1a818b362f97f9b4c2a8be0e2e6a819939260999d22b8d3a045bf9ef011ed13c15801e994b9c3b380113c16c1c65cdad1ae2d9e9dc543116c2e8fe796dae291cc148051812db8f8824722d8cc39bcdd7f63dd8f08b635724e91dc82a6f7108c4aaaa3a95dc94e22670826a61275c22c79f068290467ad1d3176cc3c6a1282bb4f3a597d8212d99fcf01060b8a0d33780c822f135e1523f5e66b26084682ce1632b49e0c3194038cf40804eb9ea97d848912952d4030f2cd64496f55fbbdacc0e30f8c7f8bb6e8bf39a71f79f881512a37c7b2b5d4dbd0078e86c0165cdc78d4ff91ead1075674722ba5739c0f8c59bde80e1142a491ee81d5bc10b4e46cea818ba2b294f6e9f3aa0a53e09107d6ccbd538cf69bcd843cf0c025fdfea54ad4d9c78a0d1c78dca1d42c12f3a460c1c30ec50e4d1d9e29b44ce9521ea20bfe8b2978d48195a06fdb6dc77ddffb020c0482071d4c1d83be0499e43cf098031f2d7b04e5515c0f397091e2c690511c60a42fba401c7fce024a297777777777666666666655555555556b0111d818002b3ce2c0e7935c3539a5943d6f8788584a29a59452cadddddddd9d999999995955555555add1c472c605016ce00107c66d74c40d225b79d0be81d1218b52f24252e929f370035715337d88071dbdea36b026294733ed49da95e078137481960d7c4a6dd12228fd937d8d81c71ad8245f635996eea1062e33a7dde82a168f34702145cfd221367034291c0bb080086cc8c0030d4c50ef41e420c16f63cec0c752fddd9baae2f67f689981cda582a6d8f9542999b61761a4e0b5051e65e0b67db4e7100b3cc8c067ced71cb2651aef13021f381a021f38fac30113d8828b2d2080c3630c7c0e2bcd6d21a877bd376eb0054460e386871818913aeaea7da38bf91e6128a648c2444c3a33040f30787c81db187935585ea3461838b66cc0c30b55c30b8f2e7027712f293db8c0266d7af3640d1b13da17fc043e703404b86040036ad47064230559377284e1078f2df04982aa0ed354abd975408d1a356ae0e8818716d8ec2c3d62a2cb834cc902db56d1b325396ede211e58e0d365882245fa25f5ca8796a60be0594004360470038f2bf0a25e1a42557712325bf0b00263d972ca66419a54fd3eb4aac047b54893844abaa236bee8a35af0a042298fa898315a58089902d7d5a1ea6288177f1b5260bfafb44dae09959dce8247141811e61694a80f0d7d17f380021fb5327f091dd2f7877c68d9b86156058f2770fe1ba3051f1596f9a2df8b63a36f74181e4e30ff8794256ffe3bff432b25306ca0e0748102b3068f26f0eb5fa7e11f9ab1ec0fadf4376c28143c98c0554e173a223a6e5970091e4be03e47580ef6d9a64dad044ef98945be9df4c12309dc066ff56c1b93ea344202a339f4844874cd273b7af03802ebfad14ec7d1b0d14d8dc06e6acf5359a392834711b8f24a0ddda4525ccbd5387810810f6d27e468a79231533c86c08b0cb2bc7644cedaa30f2d05c343086c4a309d838cbe961b02e3989dc023087cb2d8a53ca432536f910710b8a89ad27d693395bb8484c70f98949d3629d58c0fd81c4292ecad9e36c2a3078cd656883967da2bbd192584070f18a13b24efcbb8762ac563077c29d7947553ea0b0f1dd81d456f341a004178e480517639896422eb5fc4160f1e386062ef46b07c6ed5c1e3068c6a66ee3ca9216a49efe06103469e8fb41293bfb5690d386d77bbb416f248be8a0e1e34e0278b594c1bf4e820f159f0e9175b447fd498265a830c59b09b41075d766927c8520d3262c1a68b119389dcd3033260c1890e2964a9c49c40c62bd834dd3a1949dd325cc1a68c5e4982b68d6a221f5ad60a36768d4ab7d458c19f1279641c954766dfaa206315e96c262f97481a2ac850051f54ac501ba4a9e06386e829760551c19b925e962a654a66b15370a15534f2a6460c324cc19659ce24936ba560738c37395e34c9162cfd820c52b0ae112b692b2df6b9b1a360b5ffdf6c2c7fbbd72590210a3e624b4e7d1f4ba7a0f30119a1e03a47ed1a797254243f1f21031464915c2e7192e50e055facc08609bee8e2868d17a0fe1b5a9fe04d8fa5a4d0195154f4a115c67f0b7054056ad4c0610150840c4f7032e48b9f04991e7deb045f979e1355e4b6c97f192083139c6de974b35751d15d199b60d3c49c227834c15bd7dd4bbc904162454626d81d611d72ca4947d09cc4049bb946dbfd6d4edfa3bc04afaef7f93bc492e9271f5a5b708002a907199660625e4dcc29d5460bd14a703e964cf89feeecb212e32083125c5a0dbe296be8e80899049f74c85c5141a4041992e032bf6afda424093222c17f4a3a658d8d57c40e093220c1fe569bd68e7916eb3c823b0dfe49b74a168baa23b8ccbee96934ace4688d6054eee4bca21af4540e23d8339db542ba3c41d43a05198b603b5688e575f1ffe4f6a1e585176d6323204311dcc9de6f4fe9eb767a4c046f7b7a2be96f0c9e768e760ac840046fbe673a5dcad433559140c621f810238527e1915a4c936108466565cb1123662ca310bc6d0e52a377974e8b2c136410824b5a2cb87fa8a047eb41309a440effcf923b952708f664acdaf68ec9080497dedd42f22c32820c407017a4a7b8276a635c8d1064fc8109e9d3de7966164f1e1064f881356549eea4353bd116197d60846d8ae4f676191864f08115cfee792c6fdc8c49d805197be054a9dcf9734dd497857a602bad8ad075091764e481abd2797eb983e83d0f1ed857134fae1ddb32cd92051989767e134b0b32ecc0c51ff1ba4e42c60a32eac0895c2a2619720aa14edd820b3a705b2acdd5da44529986828c39707e1a5cd734be5a7fd6041972e0d547fde69d9c64ddd1403d41461cb8cea27b530e95b1b5c76181e2041970e0afe3996975d31c826c0b2eb6e0620b2eaec87803779d82d488b15479de0dec28bbfca9a48fe5b4816f8dd77d2f2906391b58179d93a879aacdd01ab828de1d324cc68c1c35702a9578f260daeef334b0a1b73b4a369b988306269e06a525620cabfa0cfc8ff2cdeb9dd3a4d70cbc8be7491a8465e083d4f494ee918137d188391a82ba680c5c6eade039bf572f62e06b93b85ea691266261e0329bbe9cb3fb8350253030aa3607bff1bfc08b70eba032c80b5c52da4759deda309d2e706fa61a29bd2ce40e1738d31872ec982ca68cff1678cdf335ddf77f417f2df01a3d585969b3c0a4f0d6cbef0a5f150b9c8c9a46c85379f7ce2bf026d4f9ebe5bb4fa61538cfceb4203aba2e590526070b11cc829abf4705b6a4e9111d9ddc253705de6bd56e82c8c9bb49810b39a490e29ae797581458ff8f904e459896eaa1c0e84e9e7bc15310abfe096c9d9d4a7fb5f15bf24ee0767b7265ea975ec93781b52c3992498826a2338193591a7563fbe9c497909e145c2530d2d5e3a7be69bc98243049e5893caf20494f24f03909cdd39e75948947e0bcaa73480c8dc004ededf9ab3456a61481df2e1fcbd8ad712c44e02be6cb93c52749d00d818f64228a090f09814f955fbe6f393ae45010584f6f166c7b842a19020227f33dd6a6e0416d433fe0b652be536bf980d333dd1126e46711413d60a3db55bcee9165f2800931fb5494dcf1b3b403fe33ab2b59f624261db05f13fc3f8559b99f032ed25f8ebb796e4138e0440e326e1a492ad47303467dfa4ca12ea96cb50db80a4a7b968d4ea15403469fb4d8bb2ef97e1934605b3f7494c7cc82d1904b7b26b7adac9105ef21c44a9e31867c31b1e0ed7458a5cff51115166c1a13159de72bf8fb9c73ff4b869c82ae6074b438714daa886c6905dfe97ef4ee54a74861051fc95c0517b384a02594ce1a9e2af8b0187289a43aa9e054c6f466691d5430f233d3988c3f399d4ec15fde3ef548aa524ca6e07dcf825076edba9d52f0f13cbdf89e5f659a14ace811667563aaa4eda360749a0575b628989c639bb0d016a96442c186caa1a12c6a5279e3a06094d4e4edff962b6efc13ec862acfabe399b4e99e608370aff6f47b428ade09b6f5ff4a47c70f0d9d13fcad6615dd8f99e2c537c1e5cf1ba23d082bddb926d8cb90123402c198ae18720a410d08d62e555dfa9341e7ba7f60628abe971354fa11cf0f9ceefe4925c53ef0d9d74679c7ec0ef181cd71434413727793957b607594f77e0879eb31470f7c86a452de88631e909d6fef62877860cbdc4582cc19218feec08a6e9a5b471e3b91b303632aa9cfe9636a7c6375e0458fd229fa8a08ca5374e04b9366520f0f53ca39b049273d316651d39003a75c37ed2c84d08803a79dfaa5b9b342ab080e6c5dcc39efe45bf57534dec0c9f4e9638812531242ee06fe26e6ac643a525bbe68b44151fdb14d24a55d5727d060031bb2c7ff8a2a925334a540630d8b8c222adfb0a0a1067e93ca194787fc3a4a9b038d3470fe2987949fa9076ad450a58106ae641addbff6c281c619b8d1dc1d26326d50495fca24689881eb8e24cf83280d992d607491c3062a031b3a4b42d07bb71c6c32f09d2d6af2a01b2e493806be3f4b2fb3a47422420f460e3d0d010d31b095ae335ed2b10c34c2708c95a379549e95b6468d74830537d20d16dc8d33d00003eb973feb44481d3bfefadefa05466f23c46f33652e711a5ee03daa9976515a97a2e443ab58036874614b26258ed89746521a6870413d791b7c27869ed816105e7a4a77a8795006400a34b4c0c6113245543ce420ef00d4804616d8147eda563f29dd22d556d0c0026791ea4ab374b6e0620b2eb6400058058d2b30297bbede4c1e2b7017e397eed17c7b5977028d2ab0f563215ca04105c64b68ef1193c614d852be9d95f4a510b1f5c0161ca0c016526094feec27926ff29324f4c50a1ce085170be800fa6201356ae0481a51e07c83ef77b85785e61ffa5e78d15c7ce4e8e20336684081ad929b4474d2255d251a4fe0bc336e9dded0c13549c309ec9fb9f9a6642a814613388bec7ae9f626059d3e1a4c60745fa3b504258d253016fc5554f654095c69dd14f5784269cb6181461258cda22bfe4b8ee636228149da6ef5b46f4fe355051a47e0ee4646fb9114925462046e528f055bb5f4a6361f5a29b071030c1be8bf304117388acd804611b8d6e4d9c3f257fbc60534885069aa4b14ed9492867ea03104ce2e242926833ebf8a87818610b8d87dbaf92e78051a416093768cd63d1a3765030cb4f5021a40e0f347ef2a0bd50f18a56ce377d22d1368f88089e16974c5d7bb98e4a8011a3de07feb22e9bdcb537ef3804997a21593bd7de8b903367704d5a9dbf49bcce1e822dd4043077c3a7ded79422607fcd9e9ab10326adea938e0ba368230a1466492e40db80b1a342b45fbd0ba0146187fa3a0b181860db85c179692decc165c7061822e70bc81460df894630e691de94c3b1a346084c848e9ae828994cf9805af29fb7259ccf298643364c17efa744a7d5e67c4824d6acff24b8cb13d68062c18350f325d53e5158c2ebd6ceaa2549094e40aaecdde84867a9138d919ade07fd36cad3cc60a4e8520ba3e7956e9cb601666ac829316ccd49b50934d8e3666a882911f39978590fc37ad54702ab2ebfc6d9f810ac69446cc340b4b9517e4f86205572d98710abe36e8add48e23820a3fb4aa0f334c418e685ee1a271e0c8f14517608461e3061a624629d8b0a4224308cab3a6f5a1f59fcebeb840072ec0010aa4e0051d86e11f6690828f9424c58ba61a9a320a6ebfda52b5883344c1a83ca23747b1d82544c28c5070263d2fad94d9e6e5d80c50b04985dc4ddd1235c493cdf8047f9f624e74fb4ca6923cc1ea49bbaeeda04ea051b3051de45a3338c1885ed0a99e3aae6e76c626989cba2b72cc925a7ecdd0042f32a5b49b6189604626b8bd55915dee39488ec1046ff2aed3d896fead9d81199760337f5ce3a80a8be0f9d0524bb0298e8a1c159d4cb50106322c98510926ed5eb8e9fcdcb0f743553083128c90629541c6f4a1a5d436cebbe00bc198310936b7a8750f9a5a29671f5a36106a62409821092ed6a9904c7afda185c50133010b02b0831991e063aa0921a94376f1941990e02e4f4ffa7e6ed64faad261c623f84c2af366b6103289a02ac30c47b023b36e7fa7688561462338b190435031062543adc8083e9b8a52cd4e178448c101062e82b75c25dbef93ffc88961618622b820a93eeade29a1b24f047732f5ef4e9b5b6b66ae30031128987108b652efb3a978a4c298610836e75c1d7fc31c1ba0c08c42303aaaa5ea87cc1e51f01f4679c18d5f4106ae70ec0c4270ee61fa6fdad24a6c808131983108ae247ee4d1397474c9ff0b30ca243043108ce63da1a15de27f84dc308196b180086c2060462078f136a56434fd432b53f03922b0003eef811a350e10fce937a5ef69f1acd63c38ccf8037779622e1df378b258316898e1074e575a4b2693d9074e63ce996e29a253b06ad4d8c20c3ee06d392d4735f7c0957bea694b59d2a4d0f4c0459710f4a7548d1a17851979603ce5fe967249fb1e84073ec5c817b3a9fc0efc5f789a9e4c71534eedc08fee2c298dbed48191577a5bb6a1031b2c0611838f2c259436074e43fe2492d96d7a901cd80a69d94ac51c925ac8066ad4a851a30933e2c0e776a5e89dc6dcf40f07aeac946f86f44a0bd137b07e27fa64d647fde8bb81f110a4a765fd0df6c936f09174882725641f69aa05c30c363039688b23b3ba3ed7690d5ccca91964e4513289781766a88111f7bc937eff3430d93be7d6490b5144101a98e09b54b2a89cc72327c7e3c091e371e068525a98710626f578c55c328d7d9ca819f8fc1e47e78df6505a512bcc28039b279a92a9a9d44ede050e30304006ce334f74ca0c9683ca47c0046f811a3570d4a831630c279821063eea696bbbb7242b34230c9c55e5dfaadc26f4da1b5d34066a9412668081dbfea4e6bb6f95b4fa05764f249be8be5d5b671b6678c10ea1361253cc7781ab102fe4303dfae31e3135cce0026fa3b6e4a61ca480195be0bfa3e897e72c26d2a3052e69b1accbb0189e6cd4050bdaeaac0433b2c0e6ac71737b98fe901b3bccc002bb92840e9e33bba65ebf00a30b626e987105367dd5bac72039283d5981ab204f7b664c1518bf13cbb8b15e84a8c077b4322d5d229b58d014186527a69e213753480adc25ef28b69373486f1478d3365ea91b63c4140aac88b85b59c9f3043e4427652ab3e304467829b53d794af9c79bc0de5a5aa47ce59334ce043e88d024645497c0f5e59d6d59b49c4525f0a694f9e4d75c5b9627818d9ccc94aa18b525d54860bdb29b6b57fefcd111b81bf5973ca946e0dc46c7f16411169d74b89590086c5f92dc69164a2bb83386c007f5699e237d454cd91942608245ba9843fcf879db1941607312cbba9359253b660610b8983fea7afa5c79bb99f1034e7ac4f7329997a69b193ee025073d32855ad1989b193de07334ab246f3463bcd31766f080dba4843e1163362ba9d9019b9245b0909374c0e58b46b3f6e480c9563a42ea1c074cba8a183d96f2d518bd01df51f399a8e02b221b30bee12f7af3d4ac643a478d1a2c30336ac09a567b724bcfa0013bc2337eec1cd94ab3e04226d74ccd64aa29b2e06490496bbdeb7790652c38a95127ed7710165ce8145b24085522eafe0ab65c7365be64df96ba82cbb8ef1d622a6c2dad6072ce27428c9b929a8a15fc6ad2bc69ea3d720457c18550ba2d795d25758b2a58db6c97b285647b7f2a9890f3b8ae97870adecbe458e64e6bac8d5282c729b851d79842f48be8eb4cc15f2991d3268b1b538e9582330d22e6bed348c1c44ad72443b4b8288d822d1d5293d02551b09b2539a9f0ea607d28d8344b3b93dbdd220705a3ea72ad289ddeaefc04bf397a4f8aba59c1e2093ea99074c671ed64b9ea04af75e6b15a249ce0d2f47fab7d69135ca76589be9bbf93724d70fe399e946dec902ce891095ea36849cae48f08e9c5045f39df9952a14d786d2ec1ee2895f304cb3b3ae6e90c3c2cc1b69daae78b5ccdf9af0497429a9df00d3278e45082dd572ba12b7766c8492eb6e0c2bcc063127c04ff4d5f5f9204df31245f59cecd5ac21a356c54223c22c1276dbaa23f7520c1694d297edace11697d041b3d47595987183cd28ee0c32cd8ed4a3209aa6d047beb96c482e8cc0f414630f95e4bb5018dfaa87470c6e25028100744c16010c3307c625d01f313080010302a0dc782d160a448d23c148003502a244a282812262a181830160746824018100805046150201408854481504820516b9db90671c09953c3ff104d00fea586362b38cecec9445044aa0a4ca281ddce3e486c0678d35135c259486dc1bb74c8fed6d5ff3bd463c4a6c50a504555056e23c2e9c7192efeaa0a612982df0e8b904d972f162419298ac77027d99444e53f450ed1135dcc41cba0d9619d326d012b65833afb40ec70e01baa7a120186a375aabfcf87a7a23f3eba2603196357ac0f389d023232e5f8b66a49778c742b00cd5aba133b897241428069ed9b4b1bbd2e1317b5b9341ea880a2a32905b70b39d21f98b07136f58c70e9519fb82151005ab1a277142ddb283ddbec027c22ceb100242e780f78fa174b4f35008b97855e708c0eddb90fd3f91709a481dea4d6d52aafb7040a31e85c8eb153ac29e84c923722efe921a6211336db4df45b6a43b8fbe1a34d1e87a5a5415a76fda794a08cee2e4c2816dd070b881679812e3f47444fbb0f02a6c221058b1effbe44a2106fff080044615dc9d963569084c9b3f443f5ed648248c752577d994b8b638af5134417471c8cf4fab456e27efa89a3421eadf740d12f384b1ed83ec46960881238a0939d7446ed081f83879228a65c93285d3b44c7cf25502600a128303e884b14ac43a5b9a356105862fbabc62658c92581bda1011044592eec764c341840db3e845ce61f51f0dbdaeefc575fb6f15d5e96df9f9bdc14c32e3405caf196a8e5fff0fb092d3532eead586ddf67dd359741a18f356b4a54c7c271e0f6c004b2af0e5b2294d1b98053c8cc10611eb1a6fb73bceccc9300eb2a55b77a0b3555304b1913ac5877f58720078bec2c7de64e98f6c3b90c089ee25d7b4de69b9f6a9d9443099f77f96aa5c15a6ffa08155d4b7b44be316f233810756f9793ad41eb39bb5dbd4cb803cb84db18f2b4f3e9c41f6d1252a4bb8d783ed61e3b2765666daf4c528f2d48bc2dc80254490f8b18c04c7cfda26c0c6d4ea9bcd0a2ec5fc75c9e868ecb0ce614aa098e4e6046ed61d49a9d78fb3fee61cbc4e24f0ea590ba18dae721d933fa054edda17cb664c62fa9622d2ea6f1ad4638af0423e64ef35dc4db046f451a90262b46c1e263b6ceed43472720a8103589da56455e4f7c175c9b8b9d5ebbb3d7d6c49097c338a68ae8f607cc0ed9fb547c892f550cdde50409f4503b8d1a5e19aad4dd03d4637aa4055f5defe022ba2967389a4d138e64d07989661306df9c4c5818346bb6b633dd99065e0cc92d8642ef6519dc1b6b2f6cd841b6a2bfa3d66e0c695d8e1603484b71000af7d81da913ff2e147142c4c2e7c642cf1be37c0061b3fd8a584eda3f3a104c0a60f2cb14b5293226056a8593014b4950e3bf1eca4a7cc00c2e38a284800fc1a32b387dc20a8d97b2bd49091a7a3d80c5f9f4475ffd13b74515abe0d53a41cf9ce88d3df9e9e2d8512c8e1735675d7eec7edc107270057a63af1b49b0aedfabbe2dfc8c5a9dbccb7475a902dc3c06efc57e2531f4c01a619f2988b8314719404a9bb119e35966ce8a28b1f06baf70c24778ece25004df46d380e78452ca7856958f1b65fd7f047c27a5a62a126c1f14053e25fdae7b43287cab1f90c8c7eb60b19519673bf735e60fb2ec49a60575f4f268258278204908eeacaeec5da3f24a9fb7e007975710690750abba1739531228416cd633d0522a515847ffc5a4b89285b0d6f57c182cf9f1bc62d2aed976cc91bc7940f30e336168a8a3d18ec33a859ac0678d866eb6674c7354b85a0dd78156a01a93cd094d2b429deee6bf07108e4e5c87ec2409ada82cb4a14f2eb4cacd7ad71dc1471b25c4903935386089370108d7a9f2503580724093b98ff2778353f635d72a5aa0f39db6f1785d30329578ae80b49968d31941774ae6052a42bc5c0461aefd76238ad4028c9ab003f5acda9a7d97f90011b2c3326ffe97b7f8f5a4e675a2d0eef6d94a3e4fbe25ba24b65d769edb2b02b4389d12c329ad3e52e8587d135355f048e498cc171bcb8a3d79a78995a7820be964ea809f65fb0c7b830eb4a410ceed29828dca0f17dc081c17521c1145d995484ab5cc44654faaab8191985c43c5ee37bde7ab1237f4726758c876e2cd56c2b65828e94a65c7428654a159e273790fb1d1c37272ef8158d7a647b55ec8e3fd42e07b08b91961573286ef5686fa610ff29fafb8f64e7cdf37adc40fe15080115162f8e93d3d950003811d4adba50b3268cb34422b65394ff059c064ccd4a2158543b335b9688426310273a3f29f7d07b295f3d4fc0481a391661f1d135900c9266df5f36e529a66163d89b6818f467cfa796e273f5af0f2e58ca8ef2f6cdb7c89e405e6ebcac1b501d62a65d542cb1e8682d552945ed1b34834548b938a3dbb387b127d80d8beda4e130bd9ea48f391556bacdee887b736768391cf985df19906d42dc2c99dac3642384e95595b3688c969c57c95171945aa5bbabc883e8b0aa6f2693a9a14185a540e1adc4a40d382c753f3ac6b43e0f34105e6b5c7770bed5e6becc3df970a2ccc958cf24369f26db8e112f8f317102cce41d84ac03d8ff9f2425f6f12ca1c093a70fdf94c998991f4498035afee45682c884c871575395f9d045481e31a0504fe6a802e48c2cb45a2da057f53a952369ac1ccc9db427dafafaf37a0900595d8ff332302314023b6f52280be63f258e1feb3155500337e70cef42c77a555dc56a5679cb371e61fd3d0927b00fd7656769ecc78876ef20ff2c28a41c42258a88d7536c3bb2503a4b63600bcc1c4faaad06b12c042284ae2c21057088b51345965fae18ee323339b08c7f7921b82f0a2198bf565cec607202c8d8e0da17c57398adf9e4012fdbfc1ba420e6ef17270d7bcdc1e685636e61056630a86e2c76a05a07d563cf731b944caf91412711c2eb17a26004932a0b9eeb6b4a32504a1b1ab50a31b14a5a2142175728ef190c816a2c76f5c47980de15c8400d97a2927907b086d581003be50825f111227010abcd950c237b80234c92debe9425b33ba6c38971661bdba0976e4b1c172ae82b5b7a563bbdc4860aacdfeb499b1109660a87026c7cd40d2d64f696ec0c08a3bd9f1c4c49902b9bdba128222c4ab189a2aad5e19b8ac08505cfd1ef8ea8ca1ceb708aeaea2e3c3895bd88bbb8d7d64e8c0d48bda453aca201abc5327d5e0e205c7115364564a214ceb80cc0090636b6c5240cca98699fa3606c9ccbee99f7164d4e3f5bd4a535d43a92d3724a6de1269a8efd5c9fd0d92b95b41ac95fe66db8dabc01f4fa9f8ede3451fe27e9f3eda4bba9c56218b9a62387d0ff377a36a87505142ffe3d8b15eefd67a582860fe9baf165a70be8412edd110f5595068a5de4757df737a9673ddc6fadaadfcd7741b10965b68a001e15f35975c8e31379ba1f9fe818bf7f17d92e0e24aaa10403e4e423cc01743787b1a4b55141a19b44a2185212faad04a1f1d24cc0f6980129ce2f02684f8eb45a1711ea7c10696822128cdf9fbd07c56a86a638191a67c6dd89acd5219f783c51bc3a29ea2c619903dd01d507c3485f540c08c3ab752a36a800a397515a90cde3437366b2bc3ee43e182ff2b0354ac7fb28265fcf02cf16ce759eb99ebecfd59d219f76f37e25c27a090b81dbec97cd20b905b94413938023a5665582f60469cab15985afccb232aaaa00c68607f1e6a7a179678bf03258ad56c9ad06103416e9b18754798cf9a33a7bc49ee2f97ceb2c5428deb5386f3812a086c343dd597e763a4c1422502c4772b10ccb439a18a5825cc7aa5ae5fb3be72ad168636214d6656192f486b85fdd1d716268adf6b289681ace3b317d5208ea7165e58adaa80ef59dd53985def1ae8247a6da51508d2b169e714185873ba6236d98c5695ad0c5b6b6dcda9e69b94f12cabcfc5c1a8a38483129b03bb9498e36c9e45ac698ac58b11e0fbd306d4e3523dd91cadedfc62ee2f3dce3739febfa5c9d863434060548266286590b2e943091ab81b28c323cec734f7a532ac56646677ae1a49eb2808718221acc6be168d087980de3034b26802a10cd861c034c5614414218b92cfe0bec11551df9833e6ff001acb508906b4cd08873a6932dc6ded81c94d13092ba10ad9d0f8d08ebdd490181efbdc169f5d79663ffa454ea593942248d6cf5ab8c86afdf4f9a7485053b318683cf0587038b98c039790213de8c46e659f4c115b8bed15c7de0791b79a183645ab0407b8e2419f6e0fe2abacd5b07854eefc94b63fab9cd7d0af28e16899a527f7a790807b7271ad89397bcbb0de85ecfc31d3d4ecb1330351a16fb005f26082d4d9258cf2b5c4fc0439d328b78ced27ea1bc82fc3c0d8df6cfbf9c3573dfbc5ba9f6a91e9e0acfe0f04ae569b5b2e3dcc5769c178c1c69586f1d34dee7f0fd29454f3b749edb0bdfd5870a7ac05829b9410a0e50909fbce0f7039e988247c1b42a839549c63cff5f8b4d796fc3b3f7fa03073824c707e51f46849eb276244b9eefee56a2f5ec27a28012f402f21f6e13eb4ab305c93949ac782911f96efc2d68b0339ba816cb4461de7043419afd9d004c8d616c8080aad947c6e6dfa1d3118510bab20614eadf51945b0d10a503151ce5af6236a7011145829c4d7e9809515f63eb18d8c55986cd2b21ef23df30d007439b121ecce08954f32616f6e5d4a7283209c47b48766ad29f3d036a8e80bab92748e6df41b2d08110baa2c612edaf6174190910a5631895cdbf52188ad43b1806c3581aa57a4408a1ab7d3174cf09586be2af3574aa76752ea9b643d241bd935f4202de6dfb70be87b8c9a8e47ad4a985887fdf63b2325d21707d850364348cf80271cb8bd357079ac1404e6be451909c809322a4d316c255b4c9051fff2925b7e3e3f3a3b684dafb14f4259188ea01a870cfb626daa30e1bcfd88fb48e0a570b0551c5731e9051bf11c126b2fe6ecf7ed8ba83b6b7f23102934ada797279ab4aba50accd2afad3da38165405a28f26382ad0e615a572c7b9b660ce6d585cc3f114be7619f48c31ff0ba3ad1d8a533497e79c81ddbbf035a34148b708f8650f3cd04207496df515497cc0ca3cb5dba4dd52185b95e05e10f5fa2ec6b09725b038744e72abf6667fdc243d71b042f8a620d7da8ee0f7a4438f8557ad7dd5376b8d8028120a2a964e15b3cb1d4d7489b56097a134b3552eee43b302dd7ba1e2557e57d077af7c6e5dd2390ba2da1df7a82b93895a9657d9283b4dead1f4260a1380f9681103bd80b0c8486fcb36580a087cc6d83c9b4834477c3738b5d51faacc947d58281d8aad7fe0ba097dda19e6528ee76f8a28d144caca626488638a5b53432d15bfe621bdafb68eafef5732614bb89fb5008ec5f284e20b04f70ec4a23f477effccd106c558d4b7528961ed1efb8d4260cb52d3fbf7b5b464492a59b1b6b89ecb2b89821738c5f1f4346ea65da82dd1bb2b6c4cc1aaab6dbd29931f4aa28d640b3c75c8715ce4b27740b1d21d91fb18353d829da93991ae9401c52b7cc10efa66074ca0c55c9adab29182eaba080fd268d5aa27a606a8c8044810bfede14391b0159f6fe2f1b5e3ad614fb840d11a1337edcc3b14e14e334eb5ae9e906a7a3f727324c7903d69e5a06d6f66834dc55e002eafe4b62e102bf0d00190785bbb50666223394995cf037a9fd6a4d8e252587113952dcb53168e7afdce3b4391422051405721324461c147173ebcdb2da312ee322724eea8a93c0c60bd01c5b2ad24b730ce4194dec0c4887642d330e65d8d5ce3a9001cf57676cf8410030cda597dc28a5db60ff1f8d362ceac28453e2f7d29142ef9ce2114f91995ab4ab90e489c395e324de814952a3fc5d42037cb81ef4559090e02cd96fa1661275d15b90b0ca8ac6767265b25d3d73fe7e4d3906890801aa08ddb45a01f3e9117bbf3e60ab358efd2c0f1d1d5e2eb954f70756415da71eba7e204bc54a5809b4729720e2ecb74291bdb02d647d2279b06f05f1fc62c1df57c8af658b2e788744dc72995bccca4a843a00245b21bbf3387649a3614a904465a19c02d6bad4239222943e5b74418243ebf135975a51cf7019453a60ddd1eb68313a266720f3fb6ca69dcb875a26f464fbb0ba77c640f822f7e85076bd5892c2107f9108181efd56e152d7da11e2135ef215183e04e0340e8e30734c49c00c093c688b0106d8d2c50e049ee6c51b4eae27f71fac90af2a67dc89e6d18dc48ed617666d190d3e1a942501ac53d4c6e0001b894aa2fe0fc67e15158513dc63e931bfc13594cc1078a515a97aa2973c6fff1bb38e0b1c9b3c0d195ee7ff0e93d8ca57ee1390661031d1b2b6e1ec99a250ebf336fc4c68f1af6eb48d4f7c9caee76638c351585287e0cfe2b52e27801d845759866dc9cfb444235bb482ef72dc0db2a7594aba409d403c86a99d7c95fda41ff85e7b8177144e2b72a1d395dda85a06ce9836df559f8558ab3421d084351adf4177208f867faf6136c55f9f6dba67821bd954eeb526abf45bf84d29819f628336995f4e2ae3011537654913f478cddeb70b6f664452f1e58962c16f6b1b9918912e87ba6b53c9c7cbf2e587f065c7be079524a075bcbaebe38e21b0c3c48b9db5960256e430f5a38eca08740f362fa4500ff6665613aeb4bbac517cd4da283983ee8f399e652385899fcf0e043cdc6e1c9d4811b56baae5d1c13ceffe7e3bda7a184e1d815537a4bc7d87d7c0f60455f0dfcb502453186945564c1141b93b233133671d1822738901afbcb8e1d3b0eae4dbdb6372e07787e874b019088196aa785b4383d0bdb7ce1aa0d86422b834d5b37e3d4901f8af6d14d397ac8069404b98a873443b1bf53f248744791af015bf4081571549b992fa65048dbe96fd209b4e228729fe1f6eb07c938c32b53b33423838c19c17c044453767577888f52e72486ab91075da28a86047aa355d74c1bc4c5dab3af560ee7c937b78df01d828f166480a6937950b21750705552d1e85c2df02aa6168c8282353bf98f752d25e3f99f92f17c844df8c40d1c650a5becc793f3af4683c28efd6078cfce002b12f5bc0f0355e003214122850d29320c32af2003b5355a5e49ad767110b0a77203522fb01254baf2eb290f6a45688cec6accaec892a0536d96724d9ca274942f66c8c603ab316b695092c70d74aa0961a6421763092bd024014ff860bb0932156b32a39815275fcc78b4ef9a47d334161b9cbf31372273998bda3985bc1f0d6d44d66b369addcfa4712b2ed5495f453c020484c1d9b4f8a46d570a923d4d17d48812c3faebd77090799cce6d6611cec7e5b8cd0fc3640f8bad70b1447a69bd50a21cdb4d5602fe5d4f6128b9f6c10eacaa281609eb3d0e844f758a6d2a0063d42baa5a0df7c09c801bde26f48d1acbce83d33883235562505ac6c520fba8b7ac99df2820bd35e1c687f00c1ce601558ba14275342b69184b188a0c3abbf9faa2a1dd283d62112cd6f5fcd5681b23c3cc5c4e5969f6e360e83e0f25eb476d67a6347ef718b465750602b10dbe5ce3ab07004173777cdde3056aead6436acb193eeacf78f7abc3b621fc7b77a70d968806924e36627d6f7f6ca3da787ed373d48cff077faaa1feab2bdb76fcc4b883a3454d39730a7dead11ebd8c64b89fd948dc8ceb49db458c44b8e94eb82ac02e8acfe439b58d785085233d86af7c561292f06bb781dda017be72ad39554d901c4be5bf4007d087909a7d3abebd4f39ab0ce5a9f1e2857f8d0f312ee016457f09d3b4dc6fb0e2b732ade2cd0da510bdc72ac37763b8c863d147a9f61e8da4f236a486da979b549bbd7241b8db85cc7fc0c91bc036879ed593b6bafb5a2b6b935462f35c05ad67d2dc55c68ae7a2e27a1ca3bb0cce318921275caedb677d5e572df213f179ad691e04072eef01fc0170e411fe891e12b7f06cff8ffa0ab624e5ace757d93d5dba2b1e61e7f5e8fd7cf7ab77ecd1f759d5e77cd5768ed316d0fd2c0883bf7c64410cf8eac8fedcb7d389c2fb44cd27d434b7948af36e3dc521bb47123b0d1283eb88eb2fea9cc9a4b9b6b474da875b5488dd6425a5d436a448d58ec1f71e2d3bf5072d6429bd7d2dab796ad456ac7ad4fbb6d6f5a49abc327ca9d097f7d3b803e190d393df97f665d65b29a6a955b89c8d9b594a1055bdbe494a1d76e5e2dd9b376a06c6d43a169f76414376a3b1bedf5b05a5b34f41e34bde4110f38d96c53fb4a7f463e396e606f657d43ee1cabcfd2f0dcb1d8672fb705b92bb0514161d9cfe029827c900af52d3c7f4a2117f6bb86622d4e59e81d64365390d09a14208101f21c158fee11e64518ca1a8c01d14f063850b07a8636884cdbad5a7a4d1e437bde1ab646a44f9dd36386d536b9cd4c4b3a08b8b3890a4e20a48e184d46882c9b14738920f06e9b07a2de3ea79a1c96fbfeb01417e3dd0257c3ef2bf7bab55ac6014d55ce2776605e486bd3f0e97c176c90459f4ccebfad0eb5225ee0f8cf2bab27824cd99c7f88a3290372a62f4baed68ff3ea7b0095199c0e44c37e7a2e01a99c1fcf7785a3dbc9060a84a45ce7733f6c71c7c36f58e597a0a66e17b0794cf0878a10deb8c087aa31e32f17112bd030f2961169fe15d92f497de993a850b3f573a6fcd287529a40c4b113b5cf2d8df3649d101b8ebf562bb22b8128ccb9ddbd39a87632a105bf04607f23ebfeac015205115c5ced692b693bda08cb57636a73456bb1e93ca0395021aff1a5974fc4b49ecc87ecc65fd5d11849517185ac84fd99cb73cc7d13a10dea53b42d34c2bf4df4064d69e5b420eda2856809ed41bb6bcf5a59bb6e5e7ac80be090b4303db7cf4d5ec20e74620a7f9ca6c219e32b33438b40cb5ca15e0f399c8bcc54d3230ea58db7edc5c7466c1a47a5698824270b0400e9cfb1b3fad1ba4892d7ef11bb3578f8d71a266739b324295096769ad2d94affae31a4b83507974544f29768935a3e09f0932e0d817ed744f735379f04f8aa47a814690392b38729d9c2ef6adbc6d5a9c63f5018db5217b6da72b0816210b3ae8253de93ce7992fe99c8bec06559045333f394ed4200227b18ae668809cfc576f4e4843ab26eb54618285e21b52365625fb9168096a5f01aefc3bb020de372da8580a4e9e6c5eaecd99a415a7f107cea08217cc2b08c440831707036383ae0a936c800dc3c345260c616932a9797e079784efcf222147223f8584775ff098d1375a0ce0efd7a27956e64568995456120910ae00781893fe35a97a3092e6ed116ff994e136175cb24e3ca16765f6a7cc5795f1acd95dfe7504c320807483c395077f530aef978f66c2b06cb9cd506af04f49155baf74636ccf0e2167d73f2b82e26693eb4a1720ed0286043c2ee753111929098a21205254009d09f8a21140fd0137ddedd3ad4e567969e0cc0bb03e7f36abf8f58cdcffa2a4f2ecc6649917d28123d4d64b654191026aab6fe056445cbd1475dc994e39e1f043be3a88598b3a0556dbf894e0f42878031a66be13601fc75d561cdafd6b43de415056f50e21c38c80e95d805722f7da4e73fbc11883df950ef7c789b0f7bf843bd0222b7f9b861bdf421037afca39b40b0d71fd13fc8923d13c012670421a732100769fc29b3f139cd166ae3d5b0d4c409bb2c7fdc5437af4bece30226eb454b8752052bf91abb1f45c51ee744ad21297779cc27a3c8b2cabbb58859d51f424d9c58627a5b6b06ff419f1f28050da7db27722fb5931aa4e865952c681422137d31f0211f1a1164372dbb84f0e19746184ed30bf362a57efd2f9c1f0437d1028a7a1e343566049640d3178015080a544f3313d0912a0b7e84149b453d6cafc14e1a2547e167320f7b27987443022bc8f2f049a9e8c8433bd07605b3c61974092abb440480d2e3e408c83365a50acb3e12fb86b77b0c329725726d56b882d199d82814c995539acf380a117523d9d18bd7b5c2f361e09192ede1a3573f486bfa625daa49a65221517548b60e6dbf237dc6e833162bbbc3be59df41aed2ab573cb4aba8dd20c908b29e30961546fea57a2f57cb687070fc26d48686f973a1b31108bf7b5a89bcaf05ab75ad721119aa3829ae44cca0fd639a6fe64e9d849992f3f1a5b9eb20c8f31fe37c78561302de5844dab0220fc6caea10e8e82a7b087643c8eec32ac173aa428dedc0e24c7138a01bf9f57383ab7f9fdf77fbbf79f2d3347b27cc9635f29f8005c750bfa46e9e1e8f0e726551afc822f669e45c6b4c97a743b30ae54e447552ac3dd06d9bfb66fcf619f0d8f28373c87e2a605db71633ae50fddebc98154964fe9d06804d3abc5277a3cb6a4c8a87065940e347db0d622bb567a266252c8c7833970fc1842ae10b00cbc00e4ca6a0c77864530ced6ce1be5ff0da1f88826fc183314c4e954d90dcd8aa7c7e54203ac1b8af22a7f541f4426b8cf32ad48bb27a5caee1b306a3a0e431c04ff4c286ef60464b1964b1a123cc6653dbe3954e771e6a017dfa4a554048058a3c2d140104e07985b8eb3c485dfabf245a842340729470a7f8c4de2b95ddb90b3fc3e1b95cb3be2af561ae66b622807600fe357a06277cdeb8c16a8392d29cde82152e4e8e40848fb8704bbc7432b1ebd2de0c543ad8792d17f5d764fdeb1c8981cf913a93431bff7d5d090c59f49cef89cd4a518568a192a3c1abb6fdc825054bd4c573cfcc033189254eaf3ca651c46560adb0a86287f471b2edf1a462d0288f73450acba92af8f657568f896e6d705126d0d205162b31eba5372cf27245dab01e0d23e11eb8422fa6dc3608aae30bc49778a46d603dc2be5b0b1065557b84e48ca2afd2153a2b56d58e290557bfea3f4b5e2581e95642b635797fb6657792c66b16cefcb6cf31e768681fed91bc454b704edfcbc3069e817f65e52861c4128ce22bd2b7dee7dd20d96f1482497ef54cbfc610d503ba68cd6fe4809678be64e9f215a91057ca0dc12a0db24e28dbaefb3d5e140380022c3ef403f3fffbc6e817a82bf5458da690abb680d3f7103ecb65bacbb51a86d6e38f289a2edb763e1315067a2e2eb041cc64ca72538680a09e90ad10a87231f6ddb3076af7794135422118ab0beeb22f3c6820cf88dbbe89d91fba72d92b476df60060e4b5f43e20a59ab30038b0c15b6b7545477fb76f8ad20af2930d96e6418411644b9b655300e1916e39a5d95a8658a97890958a07616955c4620d205b1708b37631f86c79bfe4b3d133c1c5911234a3dc82ce29d5d01ca40e9a538ea043e5193a1fa1057cf04d412400bb13c00b00d2a4642f2db48610d29ce82e5cf9e9da9f252f9fb81aae537fff496497b80ef963265c802c432434a6990b1f9f2afb5105a56af86c619d0670f8dcf7b443e6d3502bdfa3fa86241c4dfca4b6da7463234df8ba2f6aa8bd5825b8e0aba27d8ff1dd16ba820e7206db36fdb11c8780568129077ad8c41d6f92f2dc92036a1b2d6bae6092179eb5950f93a6f32f7387c0414e87e82cffcbb925d63fe8ad58e6f164c704e442f515810852d3b64ffa2f18bc825995686d884b8995407a1afadee0c90b6dacc15ff944152faf00b465f4383dabc6d51bba8771497ca61edaa267134215427fca7935a3b69b8623945c121f31c2791e134bd2f27f4655eb04a9f2e612f5bbf18589760eb9bdfa31aba5e1c77d277b96783fbb1369a089b169812be5872e7e664930316976ec9f5ce23466130cc9ffb2e73728a81decbfedeb6309a6cce6d9c329b4f554b6bce7827e9ed715f8beccd19027034aec642873ec274ca2a0f3ad83c480193a82e9b64f93c60cea05ae0570ef36ec6b28654da989c2ba23d92a8e4d33dd0e342593529103975cc045cb1a2487a0986a964ae4f0e296ecf28f648709371b1f6cef56749dffe25f9a30795aebad5b5c9010f1bc047ee18ed33a27252bfce0d450fd47f2c6ab8aa639825e49dc60262fa4e687ff22512340a6f9ee55eb554f1005da0101d5169120f400020a8db9d4fc29ccc027da88d6e1823de7e0737c00863d560eb8647c253093ddfb325895ffe98bb85257d46f134edd9093c98c5a86c47985db8a87531ef088416fe913f23af53aa04ff36ce9ba4b5e875d07f7329d48be80516c8fcdb9d969c6be203f1bca5828bd9e3c15d693a0d1d818e164f6a5a8e92135b1e6ab8facdefefd226a481d2fda8f85393f95ac26eff5e58f6a8890742320283ab06ef742484aa991bb8518adc3d737183209f99736feb9b6af47c38580566a323c7dc83c86493e4fe59464adc57fe921ade491764a505a19dcf8f3bddc5d62616382333b2bb6912738804de0403817ee5f489ecdf736794a44f369148f6ee5ff86b55fbd811cf927d64d5da56ba0166962526b9b965c768d78783e007dbd16da08a9a2c40ea536295094b628413f91735b8722f624894d9826fb2707a7a96a08409e0d038b191ed390466fe2960c37939aaa965857e6a98d16d62b0e9e4f6124a0668f56921b27c3f56d153649e83800d9642fefad6dc3ce75839539cad08c8aa7e9a1eb5656529fa2e5056f2d6df57ebc9e6203f01c243c66c1254dfaf390c061c2396db5cc370b8b6f36716d557fcfb1d3157a20a0edda966d4aa8608ae9022f92993b630a9833942354cb008e5835318d1b3d5481248c231c96a170883d759495308914badb17ab570b9cf99258def046fddbc207c5cfa1a0ae27998f1ba9467ace564ec90dcd2802bb6c229fedea82fd1566fe33f0292a8845d1fa8108eac63475ffe698d790df940296d02c2867083f4acbfd8946725101bd724cf3d1abe2605dbe12f7a11e47d5f9e336f8125f6e079b8e2dd21063da7401316879d14156f55bbc69c957a1e1555c61a1a4309120ae8f45992f724d513d63a076c8ed11e65467df206ebfd5c458d0789b67a3df0cd0f58b4df1d390d8a274a2ad7a3bd2f7e8333217b023b8960a70beb9f28eca20b5fbbc91e14b7809bb49b7220fab838671f26c4314e971aba26e2f1ae632d8d68b8927908c14a09695e26d4649eb0b31888d140bc83c3bfb8bebf3b5e31ffc515bd01f7fa15aa8eec78c13490c25bdb24b51c7ab537e172ef932d598b162efd652e5cf40ff66c732b67b7015f2da70da6219841bb6c1680407f1cbbc9a87e8911ca490b15cf24d594c7ea0020acd3f7f5d8d4ecf1d2a2fed909576ff5235a024472940d377c635dec7ac03e201de21f7536d29535bde74cf35947d418036644f22563265cdaf8400a32591cd99225554030935af495df074ea6b0ff0d79991e98647a169ea43d2489dc9cf0862b78beecd57bf044039b6da167d7a6a74336246d413084b45159f37dabb61eac9da9234f225492eaadcbdc46dff2e404ea372f6cea4294c88369d4f5bd4e4641cea28d70ef6f0d050eb3d7910b461733cc6921bdf241313e441b1ddc07b44065b9593a5456e3cb587af1568f738f552f3aeceb1aae1e11857ec9e7fb0a4f956cdb16d9bba8b303afb84b546a9ac28f2bf091db83ee0691e62a348b71d8be86c3d3ca1f5e3860cab25be3b25262b7e17db076308de42f392d3e55601ae3f8854462c343310e4573ed5940710462e20fc8b351514a1e7058214db871ac7ac484750f98d8711fe14e8a4a2cc477ab2d2775dc15f6f8ac36c559a678313d97e74bb93e8b8816af731eade6eb485111b0157c2b254bb3c6729758596a3e244fb43a754706edffa34d9eb04a8743aeeef20d012a8bc24afffa0442b43e240b6091b0db882186798f699a07ab6dc5fec039e8b6802e05526c66b59c4c1697c0410cd89141cdccd8b989c279f0bb53182421e3f246a4df53176df5304b510190354654388a3d629e34263c890b8248a35fcf248ee12c554290b25a794d8e4ca046c0990ac8e6ea41e0dc85648912b9a952e13a3b7d29623ddf4d47ce21f7574ee80f24d56f4c554c7e2b2e9991037641c9220288c65edd16e0d2f2cc14cd956c613a77df4db331e96e5e84258b0bddd03c7e00d4c2a0faebc317006c7e487799f31ea0a047467022e1c44ab0a3540b0a6d0013c0c3c0c3c0c3c0c2c25e2b73e4d7af9da90524a8bd43b3c1de2c04529934c49a6c879c3ac66d452f21bdc77f0139c0b870aee0a310a854aa762d20892003207dd73acbe34c2e4ebd741e4a088d92d319f6495c491c741f7f2923a9d7cec32e1a0c834cac5ee3ec917f10d9ae456f2fcf725694b03e206c5bbd3bdd5bd69fb7806206dd042e652a68389bb8f61f0300dc2063d3e434b6d8d89a7533f7a74d90d40d6c0688955a3ff6b6bc39115c6c80d1ec90d7ca43ad6041035b401240d6ad222fc4eb824a8fc972c40122263e950c93ca6c617366c60dd4005c819f4ed7c5b328e92a43433090a6b006206dd5468083dda366efe560990328090a18c41cf9592ccdd1fb7416cf400220645d6ec8d5d856bb0510e1e61308f202c80844133cb7f5f96e498e27cc30718fe23c78dbb3e808041edf13af96df367d0231c593a74e4781fee3dfe0b9a5c397d0ef9985f5d738e0e63a418102fa8a779f20591c13783205d502f3ec5da33613ac50947d60d8306102e28a3f9bf5a1ff971c3ce00b205ddc2b505fd6515b7651c59c540b4a0c9e5b2a0e84bc29fe6d62432806041bf6c6964e85b6ce966844718233d6670ca868d30805c41bbac3896d9db4e92e11e09078815d4780d0f72378c23ab0afa7ff925a5e48cc8970a9a9787b757e63b49467a4718470390292832427e3ed19795c4947b20191029289b24bd212b2eff940847d68d1b3e121c685150debd47787c2c592ee2c8f21e090f3046f8c68d3e5b010814cac608409e5036409ca0279917795e1fe34e0e47968f19243a3690f5029026a8276bda52a54d05bdf0880d6ef84870201026684a496afe734a154c6084d163248c1a1c9025b00044096dfe3e7e8ce8d091ec0def51cc4e0e2049d072c36f65e5b9ce998223eb86ef08a3078f2a5c1024e8259cf09777dcf652ca7170f2858f3317801c41513e173abdec49e1bc94048811f4f36c9739e8f854693644801441319de4b4ca4d7e002182daa62f7cf25879b32d0e41afaffca9a41c1e5377425063952499a49312574a5977000982ba9f93ee75be98f01004089cd262d927a3a503c80ff4aa5266fae3652be6417ca09e2a693f77a86ca57d2fd45282de2ac1e3ef97ce0b3ddfd989f2b877a149e5efd77b4a9235dbba504ec5978e27732e349fed8ac144a6379b71a129794f85d2a5ae4f12be85266b2c081da19795846da1a7fc4fee3ae7192eae85ae497c0c9ae7d242773fb9f9cb7251d6ce42532a46c57de7e43926b2d02b55dd78be66e82b89855ea663491e0fb14987856e494e2513377deaec2bf4fc7d9663c49de833b94237edfb315f4a501ba65668b9742c654a09b142d1e13c8312511b4e08ad42b17cea243f13a942ada052ced1a6046d73a642d9ad0f319bf5a7c3890a4553790ede5e9e427dff9a93afc2e8fca6d036655399f76b47d9a550b4648a29db6de7a60e29743129732f957ca8d38d4233d1ed1b71a1377651a83966f8937193c53f149aec5c17ea3ce54e6a50e841e6bf5f4c56dee8139a5ef99e8efb29f1f3842627fc6ce3640db37542df6cd3aa5c194e282a29fb96d7d826d43c935d297da6092de6c82044c62561de4c686e1b2be4c905994e4ce8a5f34f85ddd28c99ba849e355c4abacd74b96f094533097a1793c92ca64ae8290973b127587064ddb861490945886f8ca9e4e42e773209c53ea86427eb2409f52d539b244bf75d9e988811095d2c7e50e1ce83849674a6e46ee1f55df22314fbce976d634ac229b523b4d1f3ac2594a811da66998a4f5a67849a33ff4edf8e129be38b504c4fc99833c594795184fa7992a753594b63a612a16997df697193252549661103118a9097192c7699958871082df46696d898ef8e3d9311310ca1c9aa79fd8d27a57cf91b310aa15edc984de69210eae6b0f04b8297709af71163107a5cdcce509e3adbcf59871882d062c85142b7fcc39529108a6f968c6162731266b3430c4068bffd9ac2de27b1242a36c4f8831ae72f96e017630751f231fca0cbccc84bbe190c62f4414bd6a137a8cad7797f1c5923bfa31021061fcc6e61f468923df438b26e90f4b8e1fe670c31f6a0e9cd202fc4c8a0bcc4c821861e14fd49febdd1d121461e142df5db69bbc2e9330b0e31f0a07dd055496c07257d6dc3c6d91df40afdb6a0bae352109f638a1876d04eb7443ba5aa734d8da8801331eaa0e7584acc9adde1f359e38be48b48c4a083be2789927dd93389883107bd832ce94a4962fae4d7430c39689a723c2567cf1bd796e2438c3868c162d649ee41377e0947d6485f1562c041cdbc93415dedeee78f72c47883ba23f325bda61ccb466588186ed0ff642bc6d80b6132598388d106358bdcfc88cbef2986d8a0689127736b0e7262726b50c3bcafa42c5342570a11430dbad9999843bd8c85c5d3a0a67adb0ddd2941c4408396bdfde249ca5492b8cfa0d798591293e6511e629841930df2e4922ff55d123cc42883769e5be393f0f457a58e1864d03f84be8c7349ecf01ec7188316e63efd8566fe14ceb1375c47ef4870941862503b75f68c121f619c63c020000c214618b454fa75bf259afcd4d6871860d0775f4eb8f686764cd71c627c4193b2c71474578e79410b11a74c70cf5cb2635dd0cf24f9ab45bfa90b31b8a0d56dbec60cda29a81c17626c41133ea9aef23c354a92b286185ad024fdb8a7d29c681c3f636441ff0e26ac861858d036680aca33bce43c7d05b53d56c99b51f9253231aca0e860d946553a121ce7811855d04cc924425c5e7e90a51b31a8a02929a7b798bb6497950a624c414f2a73c885b6d3374d0c2928b22e6f443bc6135eddc8418f1fa5cc8011230a9a8a4997ca27c3f5a9180acac62433e992bcbdf4c4868d3c448c2768233b9da73659c4b6ec043d85ec1376b931956413d41c3e4e924a774cd0e653095399742ac558821a3c5da6d0f6f01f39ce470e10b4ffe831e23e5260c34628622841ff30f661d225193a49d0ff5e4fb864fb61498f044d7909d1b9374bcd47d08476b93ff9ffb7736e043d2eeb248b93929ce32e82a694f68dddf21f934d04cdb3c7ab3ec443d0fee38d7fee08419b131774bcd0de650541933be1535cbf9b5c18085ad89f16d34157a8fa07ea499b77a3421bc3076a78e9747a96fee4d8f642998d41999e6b79a17d988939446b4edf26bbd063d6b895e4555941892ef4fedaecff36a12e95e44213ae662bc9ac27f49f70a14931bbbf9297a0e6f65b683a9f788bec6da1c91d6ef704192cfc9e6aa1664dd94f58124eb624d1420bfff93e252963a6529a85163bc5c9b15292ec5e92857a423457d60f2f56c742db54f632a35399bd0816ea7b2a2985b6e8156a49f992cc418968d22157e86ea2def292f86f06b5420fa6e193492ae497ce0aed7484b90a45e3c77d0cc25325a95485eeadf993aee01597ca54285faf5963de830af583984ee26e5fb0d23985229a3a5bd29d5726774ca1e79cfacdb94e29f4123cf6937462182588145ab06ebb581e4a8ee32894bf3f6daa928f0a1e8a422d5946874aff71627ea1d03ffc28b9dfb66684a0d024a5b2895d927892d8994f281647872939782649f784a6b4e4d16f7eb7b9c64ea89b426e68dea446979ca84c64689bd035639ca066fee682a609f524415805d764424b42c8c73b1f73bb1826b492ec94b09cf53d9c5c42d97039db2b7512c42b4b28ee9e63492f42c95a57424b196c2e3bc87639a18426e6cb13ee4b85acd22434c124933da71c49683a4ae4ec4824c9fc152b73ae4042cd549b3926f9c40ea17f84fe5ff5a6324999c4ab1d81926d11ee17021aa1f559ccc8fbd1fce96584f6d59f5e3eb34d6a8dfb0823f98247a54c427dec924f2c6313cae7d71d1584af09f36e6c3b26994ec7d94e0e6464c224496e5b4a5c0707323081d0712f07f997c421e312c6860e19969051093df35e9924891b541e1513c8a0c4495899f65839c9e96e063226a15858d22e3188a7934b7064f1e091fcc8480f12f8f831a2c3c7156b850c49940d37c8884442a61cf4bb32a50c3e8e2c0f2026c88084625a5ccbb6b249c2c7c8788426f75e0e77ab3cfa6f309805a57afce0a104198e281b25a3116523063218a1cb9c7815c3de245d2e42d1d029bfb28fbe5b5011ea8953f1429669785f3212a1ed094ace2bede460930c44a859692c957decedd2ca38847a61179e3ac9106a9fa04cc6a432320aa1be7fc9d99784109a123af7e710e56e9b3308e524d9ff4a7b0a17640842f913132659388fcb3c105a9c11a2275e1240e85f4a369be5301efef983f66e7d5756e149939705197ed0aa33bc99ce7bb14bf7412f31f7cdf01f3e203a93668cb933197b50dc2d3be68d952a147cd106197ab09468529654a88c1b84a60bf64987699091074de87676504a6df00ae14191d9957b4c93244931e601114441c61df4d1295f7938ff4eb71db49ffdac33425fda741db498cd5fb7ea467e121d3425e5d225ef680eeaa76022d47c5be82907cd2c74ac2d6937651c1479d29f9cc634547770d09364e289ea246c56ec0db95529b1f5f26e383cd69fa05b6e83266eac8cfb41bbc5c4064d25bd7d929cb5925c5a83665bb5259aa43d41a706e5d49b92299934baba34a8a1b24a9727b1910d1ad41c3669bef039b3c6f81994372df9beb65499cccda0e524dcf6cd2469b3f232285a4266781d3de92f4e06b583f26aeb0a77221e833e4aece0ad49e7681331685b614b3e53183431b9c4d47573314b60d05c6c838b9d942a73fa0b8a6e3b6529dedf79d75ed0474e32f94b7517b48a25b246cb8f884a73412bd939f5bcb988ce6f412be966d375da119fb5a06c68ce5c820967414b72777df6eb91f3612ca0ce37aee237be82de29796a11a2ccc4fc5a41f9182b7fee2b49967daba0ebf829d9bca482a2a32be67de4959ced14d424937c79620959722f05fda4509225e9bb6477a3a0668ba3a7d932fe29a1a0cb9f2c3bba4d643c414f3165c78a39bcc43191e104459d4abaa53541b7dc8d1daf4a98a0658c9f4689755a82664227e92beb42e7392941376d573979de943c494a829aa4fc5e2a49262468250865679752ffc9a42368c9b4e7abb7a4476c23a895eb839ccb65655c04dd6b339d8a39e4e88988a009eae5723666f724918c216879f3f6ed9ef86c492443088ad6c82b553229133c484610d4203e2595a7af6f2392010435285131c7db860b1692f103357fac2a994d92aa4629c3078ae713945e78fe98b2ec852247f8869cc9e185a6c3b89b263f49dcd2d985b21d7bf51f3ce9af8e2e3475274c94384adcb29c5ca8d9af63e84afa35e61117da07752f2797ee1473bc85224c16b14126415be81ee4cf49792a4fd6602d744f31279c9eaa581ad242339b51be751b7ef29b8526931ee557329c7293938526c444fb09a658a8d94c2ad9e4da931882859a67628971f9717bbe421375299868670c973c57e859c372f06b7f17e1b5420de3c9538925c751e1b142d3e6e39a3e5bd056b955e8616286ca9e2cdc6aa30a4d4e922a19aee3f5cf26159a6d8bcc1bce73f2924185223b37974a9d5d548c3985963f57f2ce639beca6d0664c5b3a39e860e92e853e722577a8203e889614ea87e5a0938e173a996c145a9724bc779844a18789d9741c6527fe69a1d08328ddcb95639f7c1928d42c268c12bfec92e7d427d4f8383a7fb4f284e673f2f535f394387742dd2e4f62cecc094dfb34c9b9c74de8a3c41ccc338658864513da888d31c4b44c6871e63ae7dc944eac144ca897e7e393b8dffe4e5f422b490675a725cf7e344be8a595736967395382be128afefa64a1eae2564aa18416468385f8be749ae94968bdb1c42bfdd141fd48126af80997e2999cfa3b13094d3a4d6d6382362569112434bfcda6c35ce611faf5954a88234c1742c5aa342a25a4112584113a74245f2c421113084944044210716301218770de31b2e386488821141052081f39701a302084103e3c470e1e186040c82030441035420251801040fc2101217eb87180903e4420840f28640f21217ab8918307066884e4c1870fd7211282070384dcc10e0708a90318211840081d1e1032871322871feee3461c6e2020040e3f7c8ce878030342dca08090362020840d387c24381a10b2060784a841022169981182861cec8d3398a10c3ec020c3c8cb08198318b8022161f01e619110307c0102215e78404817768ce4e01181102e846c814688167cf418f9e163a403202159b8410e1e18e8e134e831b202068460c1291072851c3c668458a10a3542a8e023070f0c3420640a52f0b18090282420040a399811f2041f32429c3023a409040861020d7844c7014296e005085182004292a0ec0837fb947749522624a89d4b10f3163f4750636c3f29269d72e56cbcc71508428ca008ade7d9db4614f43049042db8f1454811b4fe3031094a9874a72c2144d02b864ba7c424c6bb7221435053880ca6c438b252082142b82ae74f76334111b4e0460f4282a0a7ec0c32da0481a0c8ad6dcba23d8f92319fb88ec483901fe8169ff4b7999d9ca10ff181da9b4909dfa0ee85fe1aac64f39452cb563a7673ecb8918c00c20b353f637adfcc17e7cc5d28bf6757e9f45d07cfb92080e842134cdcfc4fa2930bad5a94971c93aa0d73d9710307ef487a6c550d147020478f1f3778f8f001082e948f29bca60a9d7763fe169a870813c284c7246cb7855679fb1f766c949cf45a682af4a9aa4d7a2fd34d0bfde4c81c7a631273c7f42cb436d17c52d92b0bcd3a93cc2243b5273b8985fedf713b097e9f354e60a1998eefedf8a33509df2bf4927ae45d083deac473857a49e5944975d989d8b44211facd24b1db58a1e67f73b3985cc4696d15da9bfacc1bada942efb6af1b1574dc184a85a2174f2cc9456997e951a1c9cc31c8cf5f82de703985221f37e265769f2336856e6eb2c8c8709de2684ba16752fa8269119fed5b5268212e7897fef6dc95c5cdd36871f9a444149a987b92ec736ed74d120a2d5b0a1f42971028b4a0e3c9cbb8be85ff094d8c9554cc524a558c7b42afcf8a59e64b5f077542b90db7259b1c73722839a15696f925f9839fd272137a92ad245c529a9729a9097dc455c89994529cf16442d70df32763f7557e0713fa5e7c3993bd3f5fe8127aac5026f97789418b67092d466b0e5bc1249584570945571e7dadb3d849779450540621468f2c7d7e32935084b02a5355b2e2e94d128ae9b07757c2c228218b84dea9c2684eb290504cca9d739217da96aa47e895ff317492fc74ec38424f5adac7e37fbd5605a4117ae6247e5bee0b27c6082d7d5ef0cd7862ef912fbc474490d87b844b6ddff01c3d7ea4085a70e302208b50e4ba9389951fff4a0cb3a077f8098c0d52116523116aced667ffbb51b9734468594e9665d13dcae37d08f54d2a294bbb089d1d0da1081372f129e3e62c2984b6592deae492648aaf0e211425efe7a67c131c800c4293bfdb2a36fee960158820f4f4268fffc504428d6f71728e38296605d9b081c347820310fae934275e09ee49c7fb07cde3d3ec75ee1b31fa41ef124a8ab1c4756bde3e2489d212258e1f3b0c1f4a4a7fb860a5754f6838b272b0374ac900640f7a99b4d9e289d224b72f12e500440fc7cd31d4ff7c32258eac1a2400418d1c02481ef6132d154a5ee57064f9e831b2011ce4f81f1cb861c3068f14e8486c3002869b60c7084860822f4e00d60082072df5c86cf2e71277211f207730103b249790ed41c60152072d499933b38df8c9325900840e5aac2fb92a1d698c95ed8e34da31a312fa99c536fba083501a836c9841094d8965f5659ba48310c291c563e4878feb61d63063129a24c74a928f093349d4304312fa5f92d118c3e47023c69135831d397eb0f3c081a3f2861991d04bb2114206a56297e6cd496640a26c1c13cc7844096638c21f0b42e67f3ddd98d188198c281d3316a16df8e9e624844a1d4f7064f5b8b16344115a5c8ad5a77465f37d80c138b88186198950c62d477f78539d7d4684f659cf928a2ffab74f0ea185373967ec5e5efa922134693c9dc526332f259e422816a7f93e7d5092d6f908a18689bb7af37751791c842685ad2ba94799c9bddd3304a1cda8f6cdef49c593c47768126604421d1f3d42eff38c550c106a752c19de22df6e7bfb832e724176d55c75f61c8eace30146f2c3878391c39c30c30f7a0e26ffde44449b3cf5413bb71b4f928e30830f9ab9c98f1d25bfee896fa4cdd8c331068d9952652a0bd6413c430f5a188f2987af1c0fccc8837e55f264c778d9b267061ef44cfff69bd96325569971072de5932544f676d0bf5d2f8941d8898bd7410bea3f67b3183463a6837ef2b493f0497a93da39e8a6217ec47e2f07cde2a974b22a1f074d49a9840f11257f901d0e5ab565d17163c34cf437a861fc7afc43878ccfdda0496249496ad3bc0dea98b527398c901f8bb3418b318c78977b78d0f41a347dd38a2bd10b66b51af4b2fecd1afa171e4f8316a676b33ebb68d04a9f9cb9b47dfb09da3368b2155bb69d19f4dfb025277d1f3ea9b60cfaa994e13bece5d12f193419971b2ed78e38e5183471e37f98d34a661e31682a7858270f933068e26f54b9a8246050f3257562684a9f4696bea0c97c25530a2b7941933663d5bfb9b799a80beaa63eabb13a416889b8a0684e6209febe6dc9425bd0449be0f6be4950ad6b412dcf1f3c8307cba4ce2ca841a58d21f245c68f492ca86153ce3361dcb4c4f20a5a329dfd35894f4abea41534dba045e9511b5e7a15d42bd93022d40913642a68e299ca29c98e915b3a53d0ba5cc4e7ba6a2c74a4a007a1a537dbc84441cbcacea5842ec96376a0a067adb11226c70977e3137493359db21a11154cd009ca8b6a934a99b0095a2a6d39f9e8e9b91099a0de99e778c2a7ccdbe01294374d1b4eb2787a62a704bdf43f6cdc14b3687549d03cb79cc76fcb265c0e09fa96e4c9f63376de6f8ea0c89361495f4ed7a61b23e8c1bcfda47011143b8fcb6d82f0bd96087ad09c7385097f4bca21e82264aeb11cbf84d0118226059b1d79b90fb7982068bb5f234ad05def0341d1b145654b79de74fa077a922f6c4efa7929c5337ca0982849d6a912eb853e72949d249dec9d4dc60be563124c4e72ea54776c17dabf85e5fafe8b3d9a2e34b9840a2d71366f36960b4dd0c9eaad93185449315ce8b5a97cb369cca14bea169a6455a764d7166ace774e165c2e4f580b4d8e38d9cc0493cb52450b4d9e6ebd3a9d472f3d0b65ccf7bf4653fc14cb42bdcc23375bcab261120b4dfc2e07ad8ce1e207165a8a99bab4c39db0ec15ba9ec69c6496fc217785a235a762b8ca1012d00afd62948e999b8395b88b90005668257c7ef68a9fddfa2ab42c63baee9224890422b061830448042db8f12301aad04d89b3394c38155ac793249d41b3466850a1c9ef687e0bb714db9f421384c688d6daccfa9ae2ca702756c7949742fd0da7f4f387149a97aebdac31c6f7d7a3d0a4204c7fe598b29d49149a6cf3b4593a9edc16874293e1bac49dbbf8d94940a15e12374f09a22d63d22774b35c428e9ed331959ed044846e9edbf2f0c1d4092dc3cb292194f8fd9a137a87ef78e2e41832bb9b5093e42698590ae2bf26d424348fac3862428632a1c91cbfebed4dd0a7c484a667fb4edc903d1b73095d932629748caf4d62c812eae8abd39354291dcb4a28b293d0b12ca7b8cf0e2574d161a595db9b8496414c94969124d49493c6a046cf98de98486c7db2894142d13e717b8496afa418324b786ddb119a8e3031c9f8cd1bb711caa864736727fc2fa518a156ba1894a758d52e971d0958842698a5b0a94f8ad03c5e4ac224e194dfe889d08498949f9d468426c89279bc663e849a239bd4e5e6cbcf0da157dc8c31cb6ed2a9c34228974cebfb7674aada08a1de59577e53ed3907550206a15bca783ff63196ac5e109a29b1b537c5986413f64068b245954ac265125ed380d0ff7f932cfd41718d493ef95e9377c90f8a8e9bd2ee39585e0cf7413b99fb6327311ff4373b4f9bc23d68a5c4245d923fc5b14e0fe6ec77f69dcae641cf9952f6a4743ce8a553f0eb1753f9e13b68f9ba52669d9ef4257650b3694ac2ff7f66c7923a184a8e25897739871fe1f891634ddd48001db49cc44ca61c47dcc473d02c276da52f891c344b4927d73a495292a01407e5ff94e0a026716c7f2f36492627bd41dd39b919f12508d9233728174f7ecfbd501b14b5a53fc33e095adf6483a2e5e4fa9c8227a14db906ed64c7cbec9cb3767dd4a06c9ee6934ad025a720a641d730c1e4913188064d36d9d8a0a772c7cc9d41b30bcf0b9a54d2261b3328f2ec72ff32883b212b837e498e79f30f611726832684be6066a71dd4a8c6a0e96062fa6352c11d233abeb0612337016250b67ce7820eed79e40e83362774dc7c379df2de0480417f8ba1ad4efc0b5a0effcf1ce4cb9cb85ed0c4bd7069948dce25ef82fa3d2aa73fedb275422e68a12d660c262b85cdde1634f74b9b93b6926465b4a0e909153fa524b2c93231484016f44d15c455ba3c16d40d5ddd2332c3c4daafa0c91bb48fcf5fa7206e2b2832b2c1ccdac2c9555093bcaa198b2f6993980aca2529a93c69be36944c41cba5b64e127b4f5097958226293965a65c924441eff132135d92a0806eda11b921db2768df9682de305ec27cc9098abe503a7b2aa59117d404e5332bc70695e674944cd03a336b77bc7f4dca5c821aab92149abe5482f619ba24931f93f49f044d9b684d39c8aa127f24a8d94d3bf7fd7f4a82ce11b4249f97ce255db992c7087ae56c3a164fbe7dee14411383face110b1693e61041139358b28c9f5071461c8296c13a3c650b85a057e78e977c5b39c8170445775d503949a7ba6420a8b136b7e4f67c5207fd009539967c429d26013ed0ed2441a5e4415bee8ae985764a8f0621175e282707b74c25c5b4a9b35d68a72d5c073bb55592ba5073c96e494ee28f8f4c2ef4da5ccadc2b949658c9c085e2b22979f2fe4d95958c5b285a5f744a952c7cf08b0c5b28b23905937f628f901735c8a88516ac24e1bb5c941021740119b4506e940cfab66983e93d0b4dccf8c83ecf14eb3e5968a66f4e89a50d8eac630119b15047334b598c5fd22c2cf4d14966ce9a3d6bcf7e85a2e775bf4eb8309a94aed04aa8bbd441e79875a715fa49d9a4bdb0b1b5c302c68d1d39921fdea314b242d9986fcfe4f555e85aa6e6ddae4d2cb755a17e86cdb4f14ff7254985f6ae95b3092d41859adbe4a04d104fa1bd7e1eb1db30696c630ac504537ae4550ae59352e22461430a35ec9496effbc9b65a2063148acca5831a954c5909a215c81085e2e6a6735e12a6849e8442cf7143a83f75cacc64648042dfa4a438e13447e8cf2712c332999262b8f0a799270a157c4c448b230bcf0e647402d1400627b4f8023974f88f1c386e30073dc5b4298986f8e8a493837682de9d8e7cb951c72193dfb32363787050de3da96465311a6f50b38406792989dca0b8c5b6923cfb9879b20dbac5e592c3a72094f86c507393cafcebbcd9caed1dc90d543aa0b1062da70fcb63b93f1f94d4a0f5f66fde24deddbe491af41b39569e3288d80c1ab47793cfebca847bb1cfa06ef0f1dcc1524aa3c49841dd7fd72c11d1942cc98d3a8ba051062db3e23f633f932ecb87839188c0d48d0a040d32684a9c3331c6207325d363d0f7cf84ef28f5f01ba6470fbfc1230123eb0234c4a0e7fb92c27826d1c1ac30e839fe8cced26252ce1318b44d822633415f8dcaf9b9028d2f68a2fcb7a4515692e0392bd0f082265be5b5c9f0ca40a30bba6ed6745662e4eecc3b5cd04b8ef915e3ec87c616b42bb55fc292a44fa8b1c240430b6ace494425d9f3c4895216d46457165e5ac7d2854e40030b8a5d50c2f8c6cf545dc681c6158c8615d40ce11e26d0a842e9c4dc7d19c6913e72a423d0a0822654787ec7fc7064dd701d33d891c347190f684c4193e9c4bc15962d576e181168484193b56ff1fe047541230aeafd8c987c2dca53071a50d03447afc297491b667a82268cf8ff64a3366f0ae9487c8cf0e0020d27e8364af2d29e2429e5679ba0de9e0eb541bc62de4cd045db6989490c9fe458db1b682c41b78d5f328bce589d9494a05e7bd89c6e5bc692fccc814612b493e56385d83ff165773ad04082324ae87810fa11b4fc939412b46d030d2368d556aa24993c455063b2aacefdd9a674308c113030d01e3062a04104cd4d8ebb2054d0bd7169c0232018829e2975886d10e3ef498560a0210465b4fbc59445739624bb1a01168d2068ba55c1fa24a51dfa03c113443e46433c347e90bca9fadb3a5ebc638707bea871a3060a4050a368f840f3924678295197356370649df7f01d366cf858fc83482fd4ea707a7eb2c70a4ae485b64169124df983c7be204264178a9631cb79fe614cc9db1e4474a1c61d13339f9d3ae4960b4db8ff70620a9627639ff820820b45868961a9c44b723fdee293213a496ee2c81f232326f01f232228c303115b68412bce2cd5c8ef367164e5a0878751835a684afb644a92f6b528d960a4070f1c81082d1479794ddf39c746a5e0c8ca1c22b3d0f4fffee5fad8264fb7cad1030533d851acac4044168ac921cc93944f495fb3482cb4a033f65472cd16fb24020bb553a514c3dfc7d75c0a22afd0ea4aec2c49363942f33088b842392574d55ffaf3ac39d60a4dcf7f6326995366f722acd09418df545275d7179bc82af4934cde2a0f23f25e52857ec9c5d49724c9a5ffd3059154682925cf6d9795843b2954689a83fdd8e8d315a2738a94d4b59df4c92b49396e60cc98640a4d5d0a8f2f6d954bff31a2021dc98f1114d4f8a2868f1ce8d0919442f1a04a744cf2a4d08250b22589dd6d6f3f0abda4ace17305d7b39645a1e80e22348b1b0a3dc6f7987ab4575d0a02855e26c43c2e66372b3fa1d94942d9dbc88de31d4f283fb715cf53d7092f3f6486ccdf38a17fdc701d2bde832ce94d68a7c424cfe8eb5c357a4d68724adcf426e68fbb3a138aeacace999d6315c498d0ce669387123fc6c7b8c825b41c3c67c5d767bf8f2da105132ad397d8754ab812baa8cc8bd3ba4ae13d9450b4537fd2935fe4c571129a077db1d2bfa8d3614928eac44cb15f772a099a4868d9f143ffc8f064260512493a8c98bbfaea72f0830718da3b727ca0c617353c0c1d890a6a7c512307fe8146a8bc20f208ed925516d7e42dbe7147e825979426b1d00e228dd094991cf1e7e92ab4ce08fd622cab2d290917165e841a94a62a9341c91c4414a157dcc6d820dcc418df4722b4fca43d65b16041891f115a79d073ae733984baed77a77233ffb7c8108a264ba599820aa19e26cd745a9384d082924bfcc87110ba65ffdddb174f721205a1ec27a5c3c92313087dc3644ee94bee181d40e8c9c42c95836566d7ec0feaa6fa12762fdcee587ed05476cbee1a2b227d504f25db50d93b6609973588f0418df3b02e11e149d01d8e2cac81020e341a44f6a09c4e4a86e59631f144e731821a5fd4e031d243033b4650e38b1a19b061430f5a6ecd22724ff897e57164f918493550c0011b360c1944f2a09cb79e0c3bbbf1438607adb2e4741a44eea0ff5f882729a72d13da413ddd72d7bdf184cbba0e7ae7cd24349e69e7c574d0468f2ed5a9626f3ca139e8314e6f0efbf3d9cd23074d535e8a3b715c0dd4f8a20609dc06236058a941240eea9879e7dbde24efac1b3a92ee24ad0c2270d0339f66bb8c77b2f8e70d8a2a25336ed0c3a8ec254e4bc6fc961644daa0271584d55e26ab9c713668e29a2c267163d757bd06b5aa34a6b34de14cb646440d7a7e0db29318f3cb09118eacdee1c69840240d8a52594b7bccd0b129354283e48795590b44d0a0987caa54976e88926bd5800d1b366c5c9d415359dc32094a689635d261f818e9307c9841f77caf5562f09c41a40c8af789b9254ac4850ff7c061c3860819b424f9b999b88c75e2c70a22635053d2b1b92fe5cc41867064f918e161b820220645e6a42e4e949c3d69587b0b2261d064ebbc9719b3fe6512e7f0b123c7221b44c0a0e59f580c2ae87ba592c817b4136e43a8fc4ac40beab69b92245562c8ac1dc408912e28ef1abfa4ca301c44b8a05dd2399e8c28d11ab41fc710225b504f763139c85538ddb17c94d28236e697b4286d725031dd238c1fc98d248864c13f51a344369f902082052da9ac983fc959534e572a82c815b47416540ab2f26be671c70c729c20044610b1826e25b9c711bfef29b68410a982729784b608cb53414b499d943c743261df0a84c814f4ccf2d85e2e16df495677109182e295b9597ef2547c3f0a9a9864386933f42971311414cfbaa727681df43a4686ffdc25e904bd3d67d9044d8f0e9eb5043d35b2668222536cae3ccab2681b97a058da13222fcb4c259b0a224a50bb933621771ff3f44624095a097ecae2e5bcdba20409da88c5c5af125ef425891c41711346948aa134840c1231823e7ea6a12a43bfe90de540a408ea57779c2496799ff644d0458c903fa2a487a076fd9d78d85908ea9f12de20a81d3f89db9c4d2953920041f9fc71caf265c473d00f3449653149dca0880f94cb7faa82c6ceac782ff494bf7b5fcf753f7bbcd0629f2468cacf4a5a5246464880bbd0435c12aec43179e92fbad0d39bd020535d9b52995c28d6994b86fe1617ea770942278b99339df88c5b68d226e1b4492fca3f9966d842b3f22f0b2d622df4785d735bfe9b213c38b28c47d26305366cd04213af4b7b94269985163f552e9d64076161862cd44da3824a9ff4b69e5b8519b1d06eb38df7cdb6553ec1424f2e3a7ee4c9afd0e382ef88f5e90a335ca15ce9cb964cc6d7aea45668a5e95a4fb6850a3358a1872f492f09d9599e3b1466ac427993b594ec3e69c20c55284a0795bb94797d70532a342f255d7c0925c9c89425cc4085163ad678978af313944a98710a4d186bdbbcd211334ca1cc5c296d76b1ade2efe1355000821add6384dd04c804624629741394c8519dc3eb9c1029b41bdd24f39b280d3346a1e906ad11323a6698210addf2c40eeac6467672c13023147a923166bb0cd3f1abe4c20c5068aaf4840cbb4f08667c42d3174b5912764c5737cc6aa080036dc346f200a3cd0c4f6829976eb1badeebf3744253b1c1736e903562c43338a1c66cf71a36df6383199b5093126d23229b478ef07eccd084a23aeef69618c6919583cff1636487598f199950f355fd58e8cc6d9e2f42f0458d15b4610626124f50713f9d97ca30e312bab9f8a7f6f976b31c1c39624aad4e30c3127a028c02a8b44f6542692c108983c150401000902967020314000018141a14064391501487b1b27d1480035024264834321a241e16141a140bc6815020100807c26050200c0a8401a140483c160514c51f2a0b03b21b2907336d4d86b1b3357316ff74bc3a89be68d11babb4fc3139e8b6ed9afb5377d70b290a7d1e78112f0e279636b09344c54a306e772c682751ffae301657f81a6bc2f6c02dad2a7252aa095e98c3de30d44d65925d58dc8144291b9ee629cb93487625f78486ad8e3d968c5e31ceb8dd112247166988216601ab2caee188600e0f956ece9ebc32a66054eb9a2be905dea7190e1b30a907f7713755db4fae420700e5638065575554f83958b3cac301847e96937039688df8d0e8ea6c2601f9da195a50c0d5c9bc39e422460dac55f1ed92207e79da3df21f25489c60cf81a3c4aac0e235bb965a04ca965bdc2833078a6b52ca50dc4c5ca93ab323b68b56732c0909d2846fe41be491912a5a31dd8607241d4eebcac1fae35caf6cfdaa917a83ba46d67036aa7f082f3647e101b3995a35b0d4408e51287333e97c85a87a23e86dfd3c5daee58d18985b6a013094eaee226b1b015c798bd426f1c5802047ff5827a5476ca9f178553fcbaae770fb30a8c1eff39edbe39b4eb3e2e4cd856ef2032dcbce2db8f1c1c751f369a6e66535ad76561a0d8d58388669d5b7de337cd92d3df4a80f4304e0a98dfa5ce08e58ef71d997a3e25eaf86b7ada391e9ba8b5211c3667ca574a8e4511d0238adb3e12c491970e0e32e0c0ef91f81de1d04a9031c79c3016ece8eb604c5141cc101861c2f0721a526d81b5cdc6c31ed2f54f251f27d6008bedee7decb2ef955908ae1cb0422a7465c2fbcb1214452a75a1c46e76d3c894818b12c4940620e50d5cef6710073566e967fedcb580304eb438e61d6c2e5609cc72968da8a0414aa072dd63632d97c25a462f8c4cf0a0cb68d67e0df97981b2208d983a105635546f26b2411aeb96b4387975bb0fa4b0b0ba0925dfc1cb8e4f871c8aa3cba8c78b0bcd906b41ea0b1b09472edd069933016070e3a7cce5835facdef99f242997e75c422344765b2fa015f9807cbac0d14c4e80b456a0bed96057194da3129d4b1d6e81b59f32347933b4cf1fc927098fda6a62ad940db909df320758e2c2cce080f2f434b3ab662a87a53d8e5fc48355967070115952a5391576774bfd5d64219e0dc8071a40abe439731ff72cd60b3710ab439079d8f5bfd57e5f2cd2cbed9036c3112f2c7e004fe2418b55ddb66e8afe54d69d97adcf343f4e61b6ede9e402925f9e1af7e1f5ee5e50c9c1852e653077e4694f73846600fb4f3ffd195fbc486fe395c8631a888c5dc862b449f2762c4aed3e6c496974ce265474f66231cf55780acae835de591e5c9c987d87a12c43703fd71e5ff03ce9c86ffa10cc0870da0184f4f1e93f2a252852d16bcd986eda0cbd6ffc0ac60ec0d32488a01712b2905ac750047e67a486dce893dcc7088d1c77624c955413b009caa123fb2168877d6970298743958d22edfea9626b0884450f260f1440b3d2d076bf91fea0c99d9bb8b53f7360d9ccb1dfc10627452edd4a94fe9840ca0716bc0421973945b8fd3c1a2557413a29db4c68d8963b45a3b251026d98fdec07499f72c4ede494bca1af83d7ab51e2f4301015102c4625390624da23ffa962c9e7d68c268394cc38d88020290487ffea81c3aaab90a2def116c0cfcea0bac18c213a0b1986d56f751750576cb468ea5017896fa9622954e285c476cfe3c3c51cae0c7a0fb6e81c166a061eff73283947493eea8877b3b21540959c9261fcbee5651797a68d78805913787cd19d84adba56a87aa6c9a1af312675670a838ff30e109e109be67db8a8041300b52e995173950849e12d9043d9c180724348da84052c746520dd18e455c6a9a21ca69c3f5393cc45ce943fc99fea851e49748e989c47027260374a81194493c885479a41d4932455279e32bbce50994f219373859fd4f781d36843fe59e7f4b52fef4f9d24d54921fc5e7dc9adb5ad502bc6e0eb284e9d88fe61c04e03901353d87e46bea3f27c71232847efaf58102c357ef42e6c2f907be8706c9ec44e295387f4951624656f773d064103fd9da6240269489245dae4e4f1723c6acca88aa3ac183bbada800a35d037c0d6eb334e2c57bb0855a7c699109495b5eac8b25dbfe98990f89178037f53e5ae8bbc596fa7f083c1a00105f84335264afa8774c3786615e5e1de817c44438e9f5f48e2ba203a4960f9f2e2a22347932c78d1675553b3f22a7d3a50cf7de2b39d1a345c3246c52b31518b12f00435ae20e65f80d13b44dcdb6837c6dcf97615c6106f793f549defaa95ef4f2d58b474b499bdc36e55f06cbb8f3996b0e560fb93bb777adf6ccb3f5af9bc8a2980ebd136064e51433b0af367a6b90ed417f5164c836ffcbf865c4c804e26f6108ce03237a924f9402f78cf8bd60d5e43a32e35e88d3d4263c9b9c36e9be996559a6b5bc7a6abf496280a38804dbf933312b64ad1791889b3396c25e3b81490ccc0550a9c190b5dc4e7eb20ba6764f9fad973d7e91ecc631b41bcb21f85b8cd01ebb60a3e9b285c5883e427da7db511eecf1d8d28466a635e28916614062901385fcb0ae8a9854d91b24d2cc701b86aadb80daef95da16f6abd15809733cee3378082e11d8b222f9351ef98a0ed9c1ed5e3e550c6cc201d8d80c2b6e304ec3a6de951cf812623f59b935160785de776820e35e363a8b22c3b2b6f08a7e6f56e8f2c2230f9b70553723ba693761d03273605da017bf9b41a21e68bf89886504cb77471404d6bfc046e752506fc16c57d0a433612496883504ca5da0c81514a2d6fff03ca0569e92bdca28390710af7e80a7e21602c8002bcf8f2a038511b708f80cf1e6be3f80ded122e082ce4e3ac0874da9e981b0a8eab198ee8938318f3e354006291945009a5e7a0b03a70ceef3ff9cf96aee7b5d937b84ac0e4f63891442ec4e5dae090804cc930a6d65943b72015cbeda2e47f8845c07277d1154dd4db9024fcfed6bb3860061272e21e1b2042745694c6f344d5309f204e006191207bc5693415b9ab550828e43fb586f1d42e0eda887f86eb07db352f56223a0896b2749ab01b5ea6920052f39132ed15ca4cea1a343a1f2170da464437b1b819620cb398589a6c352667954007f135b8a18f8fa1593cd0b2601a3e1a8a5048375a8082eb1d7a93c706e069f25533a1621d46953735cfd8e4f456ddffa0474ea1eb534df3eb1816168b2aaed4f8d625842d40af1e5e17b1a4b43b44e099e2d71502b480727b70c4711dc41aae6a2f143039415868ab8c3d8d7b46f542643b0cb30e4cfb04add480d9454e025e401bdfd26883a78776480d78ee463789022240248b7c84b3d5dff9ddfb939d13833fc8899746145fa8d9d405fe924ebd867ff8ad6cfc6dabd12c9e8606aab6f84348e3d76c8c790b9b004b390fd0483c3bbf1ed8c98058b1a9a05533083e45db01012a135f6cf1cf16d3e1fe92cc4f38b9e05524f4cbb2cb370fe42252f6c00980dae4d8831f0f754e68eb8c27377b00cee4e6683736259a94f2b06fc95761397ed241820995c236f7cba120170aad24e8b3da4958f3ca56d87274f075367221bba823c7cc95f15a672d8049040e1ea4c45b8c6731010b5cf47f0830059862af2f7a93bac90e61a12e0ac42c76bdfe9b79941645d7126a8531e3b96521bce1452a1f409130105072cf7a94f081579154704b5489a0679b382daf6b79630b495a156a82ae61413e22bdf7bc86822b30e1facf24670bb4de644fb48e14d9d8094ed02cf689334d73601ac498aeb4aca97131a7846ecd02b11a0301b0bb2d7556162a2cd728a721dad32f55135df965955f1ca31e99682093cbe56870c66666f3144247571c3e8f8142fed0ef74fc021fe823f88c7c3a29762be820917a41519ae5baa25c21ec369546af336ca86caf177a86c24003b02cb983df6484c6bdc1c32fac341856c1882318ea3d835813e2a47fe4eb93346090536889c11f616682154343420a9180de08f5abe4bb8d1ee23c8f3a358a53f6006655a24acbcbba2fc546a66f0649a8c5a0cb49a33b7504ce804c343a6bf715871b8096144bb7aa3a4328b9424bc0dc869b271defcd0f451d411c50c07ec40fe686761a00b9521e198556f2258a65191590e1fb8be71625330032b56d7815561768c89ad6aae70ad74aadbdc7c3c8251c85abe1970ce8db9eb7e382231e6100f542cf545f49315c6461000df04ad13f8ceada5a60b3e0b0b383ef6d9e38669201d2dd43d8f25f180c7e801327dd3d46b029abb31fe2fe72187740f2689eca214d6849a4721a1fde78c44373124d0bbd7fe0734a734f3ccfc1d68bedd02e943cad8200d12808ddbed06fece959c12ffbd6e54fdf5525d10f1702dccecbf72d8e8b617c4a1b227419b853342cb4384e2d89331de7b3a113c2b82a9fb025f7289cbeced3df00e122073a54bb962eeeb96a335c74e6b6b7f912a390fd6f8c0865b1071eccd433ae65e97e6eebfa75fe93df789cd2e43d9ca38a42dc50a6ee6d963b243d563be9fc931b34db65b845cfc4f6e28147878d41aa8a19420a8fa1f0fe31f93787acdd7d3178e4c224e0fb32d16d2c8e1827a864bc26961482a234b2165a87bf250fb7ae53522c3743436c8981c20a87a8c0ee8e4394e2efc614070417a5860956c64ecf698692f0f26d587768fe6b2cbcddf13b7576b8b7e175e23654a90a2aba0398066d860aeb8d4cd100bdf8efe8b66deec63044db3b73fad48ac600c506a40e3e59bb8c0a39ab92800e6818597086141f19b534190d0d8e48d4a0872fd6ff29b8ad3464038e8d6e1eec39054de17c9a277b046644f46241b4eec20e19e97847b6585b673ac30d71c1f52915adca14f9179c0ec6fb8b91ce717701bf9b20a41bf741e84aa49b78fcffb48734356c29266b80f6b12044c6790456d981712c64ae1db4c8a24e6abeb55b6ccd5010651b4a2bee6b286ceca4820de3397193d31a38a46fc500de80c7a415358e30e2e1e33ea807e41a7a617d95aa194be2668a096348535d8b68a24aaeed299ebe8d6ab50190ed4192060d28a0391e1a318a5be28be4e82a84267f401e582464d43aaf56879341b4d20cd738d5643a0d11c7aa202041e61142c5a8dc6e4e812b334027a8f5aa264d16c3481e646a3d18a065dc28b42381bec1595b5973559ed011aa52def1a5d28030a56994151b3e835ba88fe4597d1fb04a5260466da51b58b2aefd2986be9d62a6bba6bbf6a09b68cbe0346411fd7e9df0571062125a99ef58d55aabe5a947cac81e0097e2cd4ebd01ea38c3bf4da0ca0af06ce497f1707db8916d0b8074545e6a305c19f27b3d20e726e88d58644473427b1a697918704b587091ff7a994081a455909dd246e4b8e971d918e6c8ed81d191d811e613b923b521db939221d64324d2c8390a8255c9e731d09ba46b54ccff29fd28102025cdef1b1c023b2eb9d5b3e3247604ba8831cd384a0b202beb88171ea474ad20319130e9827c3d7a3608835a2da67539b48ff269f018071c1f7d2847187382ea21ed918c39000890025339079a430cb97ab45580c50b5a3ac04eb11cd484c30d63e9c53a008e0e004b50a327b797a78110c95192725d0980325dfca16078412d295adf8737a586f98bf7550d680259a96b10db6083a11647c3a3e7c88a7dd16045802dc0c817fbff28d8213ec03fe079f803b3284e15f0920228254c0f2e099c37be2380714583a85558790c11a32861ecd314883415367431565fcdaa07859f4b84406af7d276fa2efc5539b6f59936164676267dac8e2d80d0fdd4b0ac1903e98d8a69b8d4d3629eb74e8a61a4e96dbcc3656151c35b89945020c3e16bf993beae5e457b241dbc6c7c6b68d1bef66304017b5a5a21b62cfc98553cf26459bae36d56c727933cc82357ec5ae0d41de74939306ce2c35f4abf05163426d86311a28811b6728371bcd390ece2cad9a7f35356b3203d3c611ade3071122985c9127ae0900538819d1906208608b491ec169a610984b8e2b9fe53a551c2b01027d957c543a496904df4b42638faca11de353f304f16f3a17a288bd2c903cfb16fe2243d0346f5a483041f0b593bd60cc27882f6cf6d8cbafb9e634684ad6a72efb69beafb781601c28772c11a7cbfbf194aa3f8950ad731d04b3021ec20284b720b312994f52a1d4f8985674d5b82c6cab4fdc084938d1e642e861418074bf1c5f552fa02a97e42bb0df345b6888225888318b756788d28b1f8b6a4be3ea530c3dc928eb45eac923fd079ea4f56cb424068d3c349a30a5cb3d20f9e158f1c11aede25b180c7e428a6bb58195e94a1fc7ef0492015948ab5d1596bb63076b8ebb0a7d67a9ab35350d850f002552f19bbcf180f11053cbea22158215772abe736529cb7b3ada6f04764ef0b815401168a1466bef78baf7cd7ace53b5982e95faae0a5180ff08003bc880f4610c63ea595497e38a2ce30c68ba7d1c90dccf0e51882b992430e1165604bcacf7793cc191b5cdef43b4e27730a323c106116d4581e7fd292abe7b82623d912a631e60ff5a00ba69017e379f9ab6a4f23b98e92f8b0a89a7c93df06dd606da70349c0bddd32000060897aef56ad683e4e88368d3a8e3acec301b22900a6eec7c984e62d943bfea7bc240d2e82e374a9fd216fc5fcd35846d4e170ac181842208f10ff99b141948219a4b16a20c765890a813ac1f13f5c0a12553ec4374e6d09237c282aec5c8b0626989f3f4d4284666fa3cbb1ac358b230a105fcb5511347fa44ad5d6a0c4158b7d496510535f3c9c20618c729bb1050a0addee42dc74a1c8ce7a995b38f301570583765499aa65912cfeb0ec332028ded76c942901b3542788651b9c3d536a5c148adf45e94e39ed638863ff98a1a19252bd1b5f84c08be303ce0a51af96ba388504c7097f14978e5f010b1481debb23723645b3fe367d8dfd06d5842187b980aacf31abdac5e9caf7b617484138e5eede8620c71c0242f7cf0263c41db3db3f7ece3200cb270814069d036f0d6f91e37cf49cccd63f6f46aef92d195326005597d9d0ba384c10b1e72c547b5d54de510560f0221030fda7441b9adf7980229f9f59ea347b17b1b01f69b34e52dfbf119c682e5bd9a2ebdebd3a5777dbaa8ae267a1b21daf3300b0fd22bebd579895e7c7f972e8b8d6b28deab77cd5bf4d6f7fbdd38620e25f5104dd8038cf14a79755e8ad7cb4bf37a7a51beb28455c264301e78134abf9600ca209b57c50be9de023da2a9e2e90367c3034ecc43f3e0c21518c88681a0c0f7e810bdd8d6418817b57758b537a7d9d8eac51b9d8d28bc3b82fed86bba3947b432fe8d4e7c08b1137548e50edec1fc66abc029bab4eecb9e056ee3f8c33b24c90a782254d3e050cdbcd479170e7d901a93e7164e07970cb325016104261c7d72ec8e134e0c8d7a0b88a3b233deedd18ed13a3a7d458d08633f06ed19fbd7ecd397d9b4ef6bc8fc06822596db0e396c582009a9a33cc19b77e4d0ada023b2602bfa6a12eddc9d837614693a137acebbb1cdf3e1d7cfdbe2d18ea99c644b93f46613aab4dd5e445c34f72620c5a5b97a6c5f3e91f7e910623bd7c69d0bad5509da3b7dcd2fdfd7defa5c8fa940e53e483d0a1707ee21ac053ac32706dfee3fa3d6b9b52430423c0c2e626718aab7db6271cfc7156e24dc3116c01606e27593e49daccfd337470fc7f5f5dbde4a91ab67df6c199661c8632646106c6f093feedb0e6af37bf7ed664004f5346e6ccd8e411cde467317c945e5834aa499ca716b6f9583f26b81f8937be724a2977d4f341e097cb84a54f37dd87cd25d43a3f73b4a544b3c880c8dacf858eca3bc303661f5f881774bfb46185d787c1cf2709e91799b61d6c5b300ee18c0b64a9a6b6192f15a3405017deeb2ba3986f33e02f848b7a5b1a2555dc7e7011ca2aa4aba0970d6139071e0671a8e9e665a43431c345428ad2f6be9248d720fafe77ac636617c1410980664a0181fe9aa0aea86d804a3cb191e3e2b9411ac8f02cfd9e3607333cb48776261f90278bc63513de7926c2e6c1542ba9278ffe52637e78161b219b091146222f28996ac7d40d693ea8d49716de5b444be99b5ac47be0d58d0a7ab5d5c03a8167e401199f5b39214a01fc665d150d5a89bd5bcb63d62b25dfa97492ca7d9447b4c2f09a600352573fae1dbbe7c20c068d0969c76975839e09b0088eb3506bd3713079d1f3238d418040556640ad8109cb4a0e532861f4ea376ad4164d1153ac40e6cb50fd57903e0a1fb0049099bdbcc308f3cdfa4c28a037930627175f643486f472bf70e5fb5c062a2864dd23c058104a50a262a1f4c10f0bc6a1d30d519725e29abe4b15a461c91afc81cb29026d9b03207ce3e12898845aa911224b693faeaabc4ea807c88b8b1215d195123a151424278f543da2051f02bc009a480e21f1bba1780398cddf1363d207af8b398a53845dc098bc25f614df8799827ce0857c282f0475812eec7a16cb114a1d20835c3fd893c3004e197530804869c735561020ee78ad890500ad81e62664638dc634cbaa25bd3daa63e4b2892d802d07fcc6acecfd2d12a69fdde7a75ef78218447a39d9386bb067a11c352389f6224f00e8826490b709777967a0abc9cc19078446423d598e54b0564080b9169a157cc2c025a4f6079b21876ffcad7c9e811c522cb8723209b43fb1dce718882b649398ce1220e1a4b7445e76d4373990a04986e76897bb8fe10d44cd7c7def0e014a20112bd323b0bb5893132180b105d812d8f634a43d068d86e886f78f284b843748f57ff17184852627f5d402adc092ad5f34016904dcf928bb9845f4de6b4c8344912c3c84b18e25d6222d2cba12d302a032c0c4b4f8bfea1461b26b19b503cce78714784c9b036df4a79561c334e10372f08a8e744820e7a21b90351da009eb44a7d95bb47dcaa7ff643da2592fc89445f43f8b5e30501d2d74ee4226d225b2fe799ce13dee84eb810bff4f4d4bf0a8441e694d6278123dc85f1bdb757ad96b4739d91221125090f8dc87ad8b6db19f77bf3787cf695a3a0f5dbe4d384a547d6086b364466c87c24ef118c04a4b475f55305d5f6591d685c167e3cf14e74410668d025da5c3cd1f5a458f4b5ae676fc9d395356fd0400883b4c00e4b8b12612ee18b94ba03f8d37e229384ad250821e93d825d9fd40b904628e5812e8611e83d6065b077abc7246df0f814da40d2e9626e4fdb4692a6babd72906eb5ecdb6b80b8d74392ad90d825bb64a5a8cdfe4ff2e470075dff711c781e05065d1f43aad017fa74974b2a72b0621e52e2d70db693a0cf3cfe59e2f3a6b0379e0dd50c592f1eaa4087c4d29a04d0f2ac20a56ddcee1b694a66580bf246c3b6ea4e3d6546a85c668c3da391ad888d4030f78df098fbfd09d6d76e5c3c4adf646ffe866f1d7bfb1e8a5050a6f8338f6583741b5454388e6f40311001bf510693f294bacf2a58a5188b22ebf827a95d5b2413bf4f320d3f12aacf676d8a3a21c21824d6464860f8120948b7717c49cfd65d3831485d939da9bb9b799d206fdc85ab497590c467ee71ab401fc74154477a0f33e2d9d89a0ef734584b1a04029c476b02e1cf48a881d87837b607b1e81a2e5a50400ef37eeef2df4bdf5fb513b42100687b529948b9cba8676a795acb347a25881913d35bff2505a26ac4b6fdbcc7f48ddff25b83056eb688e197de7d37368f655579074bfe228b98aad3c8087391e0aa0c60eb6892cd5cd7cf95ab90be7a99675e524c3f2d54b5cdb31473374af901c361a5ccc01334b5ffde371079eda096ed64f0b02cbe7afc993613a2a25ad8cbbc6cf06c1985b193f9ce4ff43ad02c4cb54c5aa406798290170e11c12fa81cc844da4e22d45b27e16fa93c41c64ba525e9318d6bda0f2eb679043555479b5553216d0eb40588836f79a04351454db044174d514f2befebc1b2456fed8a413852727d852fe8f1c93223976eded7fd13e34709802c08736d6dae109bbcf789240e6f156873c3212cb9feb1d1ae45f0f131658e607f6dd93d3ecebc08da3d001e20658e3199ffe3eeef560af2f118b50203da4e53208f3962554d0ccb47563e54113e0216097f28f431ee6f7ed49938a952d403671a60d44dd015a162076df240136b22a9fa6fda13fa39440680ca19539bccb8fe64f8ad5a696326047093130c2a0013ea282c1ec457a8b6137afb957785fe4269b950642449ded816325ce8b3d00da1a5fcd06c66e7ff6b9bd00721ca422c1c226b1177223a42a8b4d0dbde28f94393d0dd295482735482e510d22d74c818aa5ec72d470d870859e495a8be502a0d754a54bda3768aca50d4b1a2742acaad8e1401f83a944b79d089381b3a0266ba90fe6ea835454211653314bfa2e89128b74e961e4fb52000fec40379d6803516704dcdb8faf870459a1156fd61d50d8605c94ec018ec4a1e2be885ef55e3298c92e1698f983c2282c2f8090b77dabbd260815c03d92741e61f1996ffaf859c5cb227d0e96014e68cc9dc94bf8dcc3f256d478783d7bffb8178fb73c1dcb046f42cab28264fad098154a90c33f43c54c1961bb6206e7f818650f3ec6bbc778cc6cf964586a45af6de16f5208504c80375c5179ee9d24edfc0c5a8f139a3ebb064e588bfac2e980935b4b92e266ff1a3f44b108eac472bf6aa232c31d4658259e9e098ae22cb3b47708e6c3649b483334bfc00c731f264fb9280b515a1d55759a922e3716560ea4eb315c755d49a122a3199a0d7c457311fb0b02a05d5a07256f03aea6e12d0c4f1a563a5cc213a51f74e32d0fb9d2add8af5d45672c4639284c1c7c3e0eac0740f73948be82091cd8de125f55ceb550069d9f20e1705d70355322c880511c2a8177bd84e6f385fbaf9ab2cd096b3469c91b87180595a0c621b3561613a388cf265c51cb14b10824e6cc1ea331dcf8c07852644d06cea3ed078146229e01a721ecf62f6da953c4d05fee4d76b300bd235439e57041fc4dae95b0c52ce8c52677cd6da8a30fdd302d7ba4ff6b7ead59a05dd1fc52d726cd3701c4f4f395c8771085b8408a64ac526bbb49c71f03fa3a6e2225ac462d58dcda60be753000cd9b2b0949a17af0b50b9dfe083917431477764e18436fe3195a115fa701b50b1884c6e698b9be83469417c17affd3959e0e064367c74fa746b44d335c56cc6952773d4925051b3f90e979361d28eb55438dbc3eceadb60c0e01da1ada008117099a9b81527492554db9c3d1bba00207e94eb1328f59b2d61acd4a2e157f8cb440ae3dbba744cdc38435eae167df2da716308abf45742f809cdedf32d386d0bc9fea5bf723404efa203851768c60766bdd1acf9afbea9805f3182524a84c82af9cfa28032dfd49a5d553da6a75cb5b8dbdb26421877b35b3d75374258ddb1d2411bb113c3dd6e5592d2e40566c35c8aee449e1e1e1648a86d01ba135fcd4362bcfede1387f5f5c40400c76f3fbac0e76004c1dd15913797764d795dfcbe3377c15c8067b78e16625d582c27eb49c5dcb5c1b64699e3ebe49538cbc51751c3091ccdb936c81d94ce666ba609004d62a9a90d246efa0175afae4f6500e8f8801bb0eb738fc09f181235a362c4bca2a2a64f364f3ec486645dd802170b2939613efc1ed21a326a34f83306fd0afde51ea7fb5b769f05d30a0fea525bbd4cab691858caf236924f8c1130b04f7a62218b2edb12f3496fe11bb4355e4adff858a8568e1eb8b645a532d084beac38d253fce7f1547debb5c4b3fe22c2b4614fce0d7de157cf93344ba82d0b3af8c08a05916958b3c5116bf2d47ece637339b35108b50f4e5a8383b20f1e81f00f06f9a56b05be0b1c8eed162ac3d515d24edccedde11f36bf6b3a0b8a631f7259f2eb5fa25fa558d2bf74d9952aae8e8261138d2b6276c22a94f95daf66f9917d1af074940025fd080dc710d94390a5e61811b23f2cc2f903e62673932377eea58baf5434f10949f7f1284865da1cae6e4b91d065e204a0e1b32d60cf54420b650bead31b41b47249cd9fa3b9c5051d6d913bce6ca23c426e9bbf1caea335807ed66f98b8ab889db91733399da871f5dbddcdc5a0162e6d07381e72a08eb505cee45c9697cb002335f5524297f292c6854fe4a64ad1c2c7a27fd4a49130279efec07b34235b922bfd158d435fbe92e6db700fbd359a8154620c66da75148dc17d00f24e282dbd2cfe05a4bddbd2170bb3f4c9d64fb3704f90694577618ede99d55d1cb38f360a6bc3a5d2295049f105a2be2f29786cc4b870f551ac38c9dfead41a6922bd2298632c207d48ac4902aaf8b3a13860b46439330f0f0f0f0f0f0f8f1c1ddd08a98d7c02a932c924c9921e4b2db325c994529229929ece70b1db6e7b98f87466e2d39989182801570a080a280a17f8303474e4809166a26e2953144d29d9c08d2e68a8a02390451635be2a081d38e0e2b7588aa7534c210483c60d5233504001a3808e1ba0bc374a0e2946f3aac8205d74d880b5329dcfd2422899ba7340470d8c1d94a753daf7633ed180cbd11de1173972f067c0f78996c8abb6f823197032c6f2bced343aa463c09f8a9713bc279592c180df9ccf36d70675bce0d815ad72f24f50d976b8802f99225570512bd80c9ed39584104735c30ade2fe6a9fd2b1399e52a98a86d6d61b5c93eaa6043ca2a9a49c454a4226a568d4a4a79083850c1f6a6978b5bffc4ef148c2acd0e4956670a5ef285124169a560d47b98caa7eda96291821d153f988d7dbe9846c1bdad6a5e2a192dc78882b5bbcabd8e9f739da1605762cceda9645249231ca060a36d7a499a193260d4a091bae0c260c0460d1a0bb05183c61618b8097c004600eec0f10936fdf77fd0bce9a17749048727f8f8dde29a8400b8034727b89c16d4c4ada0b2bb3c46707082cda9abf27ecf543c15ec04c726d8aa9821249def1945706882916ab23e4b73cd049f7fbcb2a4c5f4acc9220b0e4c307afd3de531cb2dd3f3392ec1e6c7184ccbb625a64d2dc159eedc9543568db89bb2858c1b5d7880a3125ce8cc7a42588b7fdc500b1c94e0947a9c1c6a524f3312438b548163125ca54922b783d28edb9004eb163bb3edefa88d158e48f0a9f5b63e4c24758cd210c18d2e68c0a8f13752c34083020724f878a5be15477f3fe378049bb9d61fd404339d238ee042a307193a6769897a0cad1b5dd06804fb93640427a6ff5490da496457091c8ba83cdf95adc99db41b4570e9e2394410c5d0328e4470d953fceeba1a1d6318434b91c0810846e46bc81aa24f57d0cf98d185081c8760dc93a8c81579b4c645096ac42041e03004a35450d513c1dc7d5365078e42b0d71eb207b51b4465afe6c04108ae64dccb5b7d1a049fa74a87be5504c16e578974fa59154d1308f6c2f3f37e4d23c9910310ecb725939d6df9037b3a44d39e34d7a75f86c30f6cdfe9cd1aa28e068e3ef09d22f4248d9f4608720e3eb06d3adaa592b68bba468cdb03bf9de9441051a52c1394006d0f38f4c0e56071dc425f478fa12f85230f4cf0a473da1b2162d03c2a78e0bb94da0a7529875111f8d0e2e3021f5a7c183b04c71d38ff18f3e5c8bb61a27124e3de97dc8ec05107768428193c530e071d38213c83c83a5f060c159835c71c185d13dd89571939701ed2f8e65ae7ac93230e65652eebce9b02074e7889c6985a938a5831b462dc9081827c031b5abd4ae888ea2538dcc04591f94e780afaa795bd4a70b481cba05793965c95bb3f071bf837afcd50429d8813df82630d9ce9ac5b5adb520c9d188d34438601800b1c6ae052c8a64b94085a3770a4810b7a54a6ceff914e9d0a00c2c081063e8fae47bcfab51c2d05709c81c9e693f479997cd30b963a7098810d2962869d5ab19c3d1fe02803d79bd38a05e5a71d1978d5094945edd06cb9bf81630cec9a6a939c83921838695bc254ed29256eb181230c5c85baaad20ea5e612303041866eb06a0bc172b4c1f10546994aba3d66bcc0485272ff745c4f9dfa337074812f1d6b3b948edc1282830bbc46494166beb6cb169d2038b6c0654b9a18e358b01399f4038716783f699f357c93f0af141b37686c6103f9c0910576f3e64cafd71659afc38a040716d8d7fbcff5bdae9dd457d8f35269f00e8db102a3f4c9bdfb8db4215e4c1558d72dfd112de94dd24205b693fa50b5496bc8949f029b528a5e5eb514f8ea50952d88769ed24781093945f95824ad9322287031888892495350efe92774193a98040e2770ca835a3da1fb44594a1318252d620a0ff5d7baa98183098c8fc85d00c1c0b10426779f9b6a532b7d1d871218c99a9abd429f042ea9bd9cea2ca68d7f41021f3ba61c8356ce14f4b6058e23b099293fe7efbf0b5293050e2370327a8a9147d2c5d46963058e22f05b23714dc7dd98f12702ab6642ee8f09e521a22130d93ce6bdd15a086cf2fd72ebecaec011042606ffece64135e8242070a6624bb677d30fb8d54ea50f586b8ba555e47fdcba078c08f9dfa45eefa9c703ce6c4b56b2242a16eb1db031cdbd5c2c6796a80e585b0da52b5a1e8f174281a402470e1865a783899c3236050e1cf0bfd9a244cf9c2570dc8091b5f6966310396cc09dfb5bb999f2b353e1a801a324866c9a216920e0a0016bc28350d125399f8763066ce92416294d76d4f148e034b6e800870cb8bba4d72353c8fe8b60860c0e70c480b1ee58a51ff9185ac80103367f7448f6ab2692462cc0f102ce3c77904909379d825025c0e1022e7b65d10e328790658aa1653cf0a2155cd24f4a7f0e1d224c419700062bf8bd90a35dec12321378b10a2ea395ca654a5d446b94a9820f79fe39e6f63cbafb185aa9e035e99a6a8b674617da8117a86023a860a6ef239e82b54d75ed1b5b9474510c2d1b68461709069a41e3c050418d1ba78117a6e034bf830e7943c60bda185afea82ef0a2145c56330f51ef2e2f48c17b58564b927e4f9df15cd080f107068d1b304840a3ec28385d2ae9cd1f4c7454ad17a2e0f363caec5d3a4b726aca5e84822d1dbf5474074191a634b937bf983ec1fd9f7bfe68a3af49e409be84d4f893532df2ef9d6023d5b9e87cadabb1c30936f8d88d4693be92de4d70234bc7e8d17f847257139cc864a9ff9dabc4a399e052f49893420531c14ab2fc99d6c4f7f4e512fcc62821bea6490cadb304779a3c6216e9c1844e4ac38b4a304295be982e4a1691934507b4f8d8c087161f1840c0ff02d0c320f689179438ef7b6825517a4fe8b560f06212dca87e04bf1064f4a08ba105a3b048824d7aa7d378a8e98ad987161f1f1988c087068ccde14524383da64255b07613df8941825fbf0a2aa748316ae93c823ffdd274a63a82bd9c34055d7d1d6a9d4670c2355e0cda67694ae70c2f18c17b5a64f7d4680c55418d1b551f5a68a1821a1938412d82cf2e31e7a07e62aa184570d92d77dc90f375f2cebb8c2d6cf89f00c60d194713c1c934d16b6236a152362182499ec294c823c754820ec1e6cdfb1fb4c9d4c17343f05152d24acb9596fe168297543ad72b8e84e0acf6525ceba0244507c1452aa13daa2b077821082e5f554e7a82a851eb03c15edeff4d6326bd3f258b2c00c1276b8b596a343f349545165b022c3c81d1e1c51ff8f10dd139ba882431c70fbc7b4e27515392d9d5ee036bbaee44b2cdf281913ff9fe94c7ec81bd49fee94a947a60fbfb4496e0ee1d1ae6819f9819fea3bf1778e0ee945e13b523ffea7b71072659b42439a4989eb731e0851d146dd749e5ea59cc8b29195b60e0868c0494c578510746857c36b6fe1943ed1774e0ce53740826f574f2620e5c9956ce21b7c9f01255c0092fe4c0a94b6fcb599b23bb1307f6775cd3d6c53c2aaf2fe0c05ba86c931f4bef4632092fdec0d89ad00a65e757229d1bc8228bcc176ee0924a49a974e9c545a5112fdac08d6a88dc3152a86b644005fea1c5c7ff023e3210810fa388176c60efce32c81695bc41478b176bf053e84692d47af27b2d3eb58d191ac87aa106aeb7b725772e59a7160c1b32ac108d09948ac08b34f03169537d2b4a77a930032fd080d2d41673a9cf258d1767e02dcb83dd051d748766e0e379f88e0c6a4706a132f0aa9adc75e2646062e5e849fae578277d697b0d7b0b0d2e607499e20a5170fa9fe139726ec836cea001c3466fb1058d0a5429ae0805dbd59162fe741af3bf4b842b40c18656980955b24424c9159f60d3d9a7f3b3d6ced35ee1093e0625b3e48c1d561902852b3ac1c4ca2023c69894d0ae73829f5461c22f879790e0159be093a84baa6c52aed004132c3f9e3e15bd086a74c1050c1aa898e08a4c98fdf783a5a6941a7339b80213dc983c0da121b546306368d950c1938006bae2128c720b4968548f2598541a6d6c929b0c3247aea8041f4276eb85549af27994e037ee8598dc4e05b86212ace7f6ead4c963c82349f07e2aa56aaddfe47b24d80e4aeaaddf0912bc05f97b225cb5ab4d8fe053799adc6772041b53cce9463da90ba9d408fe3d05ebb32d9d17498c606257e55b532675b28be07368c8e135123fa68ae0dfc582d29062267d2582f1743177a89986783d22b88d2523e4b38b69933f04fb1273aecc0ca54cf286e0e4afc91cea540856fdca74909bc4439e10bce44bdd35d24e643e086e73745aee08828f64ea52558accd10e04abb1a387582b39f405045f39299612eef9039742df3ec50f5ca508aed9f2f729ad0f6c886b1674121af388203eb09bb729a92e6dcffa1eb80e094147f6f4163d7ae093ce1d4dc5be3cf09f95d3932e1d0f9c7acb8a647f7a21f33b709d93b4b899d2d74adc0e4c90e631e55778b6531df8ac184c9549074665cba5155210dfce1cb8148b5e1aabbf4c39f0137442ec1db597db38b016e4b649ffe0c0c8fbdc79035f32c818e9f3b4a8cb710323422c11b3a4b481c9994743b65ca27236f0551a93e6ff77d3c8590393cd44ac15a564502635f0a576927df654b97f1a981083ad48cb49881c4703935a3c3d861c9243e70c7c474ab51918cd0f1dedc32e035fc97bcdb3fcbec22603933d548912cd92aaef18d81472ae1cc9e4e6cf5931b0567a225ff0b318ec0d031793599dbcb08b965e30f0eae321779c9c64b8fb0524d7a7c9ce7881bd2043f3744c9b57e90217227345996ed0967181efb3ed94bc82b0a0da2d304ad4a7bb9bdb7a9216b8daa49daf5f22d79f056e736a13b699d53c58e03fa9ec371621a778aec0a768aa9c533f8e69adc06d784c15b8ec98d62c260d1538ada46576ba29f01dc44de96e568f9914d8785e9bd4ed73d494890227ba2cdb53fcac3c3150e042f30999d784d6d23f81cb417d3ed18cd7277782e6d7ae368137a979934fba9ce32a13b83c3375099cd059ee2992f4c55502ff9eeed2d7abaadb24705b5a16722599b36a90c07769e48c5fe611783bcd7efa4383cc5c1a81b78b5c71641ab178c922f09354104d2a7b3c694922f0315a929d42ca10d80b25a647f57be92b85c04dd4ce6ea173570ac920b063675b79132b651f089cfc4ac97523498a3f60bda4a94dba2ab11c1f702b29c6c8abb9ae3a3d607465b5dd85c803563be490d9941c1109ee80d56ce7bbf9a403f62568d2185f4f257d0e583da162568a1fd47a1cf019736392ddb1c6736ec07daadc9f57214751db80cbb7ba11ad32d7c6d4808919c1b72a86067cf6e7fea4435cc9e20c38ed39a2a2464f4b940123938ea93a2f065c106e395b7d4ee3c2804b0b26376becae7801efdf566b694ba86a77850bb8949299885a933edab582f5dc0f4134a495ce8e1524ff1f95dead5b05db21778c12723295d4a982ebaa0d9a6f2d3c28a58293982b9bc4ce21c4132af88e1f256f6dd87ed229b8ca5641a525eb137a5330495bcaf6d43b32eaa5604ba7ae936ea7846749c1897e5bef4a12bda3a3e0b4938e41435544c1d9c59226e4a8c9d92aa1605483eadecc75112705147c59d0d7c97d82af20920e3f7929a93dc18b5e6477b7745af54e709deda292aa34125c4eb09d217c2b2da49d36c1259926961764aadf6882bbcdb425f96299605452dad339c730c1c4929eff64b25392b24b705a4c8876893c39059525f00ad78ea5ef4ab0fa9bc74c3c457b0c2598e0a24b548c981dd4493022a74f4a8dbfc71325c155c57affefbcb9ba48b09fc4ba7df27548554182fb8829b3ba72e7f9084e254f929f3ba6912547703769e37bdaeb8adf084e86cebb5c91a47b9a118c27cba0d29dd2695416c1a9d3d2e5a7228ae04d5b68d9e6fbba3c13c19788ef113d29bf1a5d2944b0a516479f521942ce762955a7e310a89c3f6d26ad37c18371c37f8b2fa6353a0cc1c8989bfc2b8a285d5b472188d51553ae98992d5a34af83108c14bb203762121d34a804fd356e60a0c6ff16ed1d8360cdccd5cab2998c95a41d82e03475f88dd5e7dfb004823d4d32e68a9a4ee507299047e80004a7f536c1239866670d091d7fe02769d28a9fb6634fcc0fdcc98a51db93e49844ca09ac0fac660dd53b1183bb09f9c06ee648692f84001d7be02a646cfdd1594a8dbe081d7ae037246fbaf76ecd9d5542471e18cd49be564ad7930836a1030f7c57ec8b216dbf52ba63e8b803b7f7e19ea38f9e6ec60e5cc6f16c5522e6a99246e8a8032792a8d251fda703177eb5495f4aca1ed473d037b5e7484fb1430e9ce7ac26a49655b84688d01107ee73c6ca2dd5bf1872e0c0c7586a495bd03a15d42e4cf00af0df401659bc8109f2534e92d3c4edeb7003dfeb39344fbd8898343506b2c80246093c05a5b2d0d1067e52e70675f69dabd10e36b05d2997b04cffded56dc71ab8ba2ef37c4993e518a21d6a60ddb2e58a9535a550ab230d8cc9ce1623648d79226da3cdd9053ad0c0887493a405bf4b4f39039fae527e09c99dba7733303a66ae7ca2338578fa04ce7494814b615a991e5bf25afa67a080060c1a37b008023ac8c0a9202db774794dca76dd1838f5710bda84b288a6150357c2a3897888c433191a37b850410dcf8e30581639820e3070d9adbc349fdcdf3f7d814deeb132774c27e9e35ee054d5a9b5f7a8219ada05464834b720ac639650ce9001e3468db761a353021d5c60b7af6b8324e9a34afb3568dcb06166746cc1d21a59594d08e96f0103358d2df423030c405bbc8cd4a105de6ef472c77893535a6368d1b821e3c0e0c206b6a0230be898d2a69ed6bf788da0b1d0e694b33d23336494e00add7699a68a6c21a36f5841bdf60da9efe26dea3baa6059165193b119339a0b1b860aa5ac912db43f8724e3a2048f0a283643469780064a10744c81bd3cf7d551efe3698471c3460d1909061736c8b1b1c5c9f0e7c2c695144a3d3652bf17c18caeb1828e2870e61252e54f2f14f8d3ff79747aaae45c660a3a9ec0c50e1e439dc8e9b4b74ee0b2c474a5496a3a9ac0291d247ac8a629d9c9fd025964e1353a98c0b68daeed3896534236860d195b9c2e96c02511bb10b2ab8848994445871258959822774aaae367d1231927602d2af0a1c5c7054af0376ca8000338810fc01080293a92c0da26e9292108099c92994734e7e8c9d51e8153114cab44a932f0a1c587063e2a10810e2370228db4ac103adfbd45e0f3455eede744e0f2928ee9cce347909b8e21b07f42e8a0efc6b4b60e215c1616840e2074fce054229b3c4b9db51e1b30b8b071dee183ca420f1d3db00e1e70d1ffaa72e5654b5ec70ef8be4951b3c4a4189a75b00b52a6d0a103745ae94d10030b08089941e44c21b85eb151594aae69c71082f5f3772bfd6339773a0826df5def9afd498a141e602108ce724d909793fa839653c022107c09655563dfadf92f2058d341db7fd0a163f2fb0f6c86a04fa8f02b9de5f98131939ca7c2b38230953e706d39d9b727496397e703bf9bd934c6b49493577be037fb4dd00efa19935e0f7cc8dd3af194fe7ac9f2c0ff4608baea43a37a89072ec748d22477cebcdfefc0283da12327a92c2aff76e0b3a7d98ffa5607d63ac9764f4176955de8c0678e2357d25fa648e21c580922a6102986c881eb984c569e8a395fb271e0277a3ea1467b10b11f0efce7a6b03135327a0a7a03ab957547fba75c5a5b37701bff2b25db531bb8ca6e5ba9e31f399b6ce026c620b455af6be0dca36b16a1d496696a7280851ad86fb5cb4cd31d9ea6810ba2e5754ac354751c0ddce6e9de3c31ff46edcec057c5b81938a5f58204193b62faa50c7c7e0d16344c53de7892810ffdcc154cf787f2c7c0a549d9fae6a546db2906762c4710416990a53d250c8c8d8e683a49f2df8d8281d1b912bfb4bd5eb9e40b9cada47d0b9e7981578ff93a396834937617f8d2fd1972375f26ad7081d1ad52e963ce6d01911973d56dd6b4c0589910faef192a31cf02ab9a8248d1b3b0c06aca513fc7ac89972357e0438520667bba2e4f6805fe3ab3084b52444b24abc09e77ff0919a454e05237d3d5cdf45afedc80c5147891ef21a4cedf5f7d41010b2970d9f3c9abbccc12da5b2ca2c0664d2b1b3f3d144ca521a5570b583c81496ff79e5ff357c57702afd1d6cb7bac2b60d1043e83bc98844ab6ae923281cd31636a4a7ab48b0a9760b29831585aca992955724f356925da41870558288153f913438f4e99619104d6ac9212c964ceeb8d085820816f3b114f31e890db2a45c0e2089cd614f7fd63c4cd31c908ec8f5ecaf51dfd6ed92270b9275d2c2f75501625029772e8750d323904ee4c57ff5a704fcb50084c74915ab9f9633ecf30086c48ae8c19520ce941580081499aa65468baca77610219333410e3860c0e7441a34601018b1ff09f4b259768d36f16f201ef7d69e2bd254fa5dc1e709d29e6d51c736d0c010b1ef0766a379eb2b403366b68d60cbe7f3af63a60bbeaab1c70218368ad166d49671c077c0e22ec93c9d40d7877ddd441c41855c4b60197ff2caa4a36cb2a3135e032db778a5731550a190df86c222283fa6c065c3c59b974694c6b6ec9807b1349e9b064c580cfe6a5c337b7e7aa30e0369d0cfa5308b194456080c50bb8d19f374dccb921ee63e1024e851cd32d9a23e718f36845ea57fedf780658b981072b3859adc12f3776d0cd7bac8211f5ba1e4baa7877ae8a5473788bed910a26c91494dd77e5810a544cc9f2ee15434b055cd0f09de1718a75842e75167259ce14edfee9312584849482cf8d9593ccd476b2871448fc5297acbfb2c551f0e9d7418bab77f08fed073c44c189bc976f7edbd16df30805ef5954f6156dcf9a030aae459fdb8518327daa57011e9f502b9648c8c172f0fdadac2710315f5afbd223bfd289fe56bf37c595061e9c285b099dd6d26a46b0041e9bf0d0047a6482cd29a851d142dc132ee0021f66000f4cf0a3552a098929e814ff127c4ffe64379edc94cc2dc17a122a6b5e51594d5e8963faba0cb1ee43092e8f6aeaaa20e396951e93e044a7b47c7b4188e8100a9c068c2db6904102f5808724d84ba22a7869c40e6524780bda216c5377fb4a23860d2e7a868d19324aa066c303124c0cc24d6e88cef6e6c5d05a8f47304a5f503a9fc960fadd185a30b46448e01cc16afe10ff1c4f0cad3f41db281af06804b76f2a552dcccc3788114c764927496ee69e1c5b0497ad777784167bcbf901c243115b8fa6fe6bc77c6851fce091084ed55a2a3d2948070f44b0bb3a7e1e2a72886b37622e0311f8d8337818827b53e369b1a25a083e664d32e6903323011f19884021047b3b62164c4a8ab92f41780c82d3b5b765c96214b315e9e021882e3c02c1a57fa46bd5fc1fa365e4e001083e95df25efeedf08528f3ff0b124a87aff3d117537c2c30f8cae131509d9d6c2cf220b8f3eb016a947877e6f03c6165bb40ac1830f7c458bed92fd74f218327b60d3e51482b688e9da84dae0a10736e50e22e790224b25cb1b3cf2c086286ad4861a6d89371ed8ae2aa544648c0d1e77e05f734c3d326976604c24e74c2fdd6b9bc43178d4814d0d2a58b54b1a9592c4e0410746fe9d0ee1f5234f486478cc81bfccd0d2194fccf427075e63dccecadfca0b82d1970a8f38f0a1995e5bd22d3e86d5200500a7f080035b19da2799509d949d6fe0d463a41054f333438e1bd80b2294346db5f95d03058f36301a3177be2c965254fb050f36b041729c98b2e6a0237d960b1e6b609412b947e7566a60d2e8d22b31e3af28791a38ab71d11b42ed050f343021e90ade2984604a68cec077bac82b315132f82a630b1e66e04ac57cf5e22996eea4f62803afa2e79f43349efc4c073cc8c0e94839a65a2c51175b1510a381c71858db893a71abd42ad819788881fff829c46a2c58e7340c5cb2cee295d524a7918381cf9ce0a2169e2ff0d979f9659af4029bba27d4259b5d6092b20d15fbf2c532e9001e5ce053f6db0cba390615bb2db0214f4c66114134a38b05649145c1284d7868810f22638c589ddf2f52b2c008dbf23f594ac6a08405f66d3f6d2c4d497550795c81dddc217fe7a474e8146405f5e8ee641ecbb792f4a00293b35987b0507f8d4504784c8151adacab0f9922fc6582871438d7abf6da0bf1b48aa2c0656d49771b7d99b74982071448fa3f9308315bb4f82014f8d0e2834ce0438b0f22810f2d3e48043eb4f82010f8d0e2833ce0a30211f84038783c81b74cb52649250b13490f3c9cc0dde90b2248fbbdbb206d0257428fbcd3715f4bed2cb240820713f84d3b4ae764bec712f81b13f184b66ac8537b28818d90e4785dacacfaf148021752f5e4d1be1d12989c2625966d527d263a29781c813b915d52ddd26e92ae11b83d69eef5dd16810b2aab7bae591e4458a3ed66cf69538f2130425e4a96827e45fc140f2170fe49d389085a6b32c42308fc6435e191e2e8999918f000025b5e963534a495547d0cad46335e040d838b2eee041e3f609259d613f2be734e4231b44860a36f901a1e3e6052927ea9a162ddc7b4075c27199205b770091e3c604cc8984dd74495e0b1037e3dbb7fb0ae7895643ae0346445885aaab26a6d3c7280fa87c89ff63ec60a1e38e0c44de7516dff98d972036ec54ca6a436670376847f753e93b7f7162c78d4800f965da2868896ee9b068c5453515284ca63065c8f9815020f19b0eba3b3d58807b7ba39e011034e87c79cf2e8580c2d187f83c68c6231f080019b34976b16a5c70b38113b2449b5a33b3f1943ebc6dbd81b1e2e6093fb2469f5bb69c115ade0b353c5646a7249af6005a32949c5e0914cf85d31b468a02a1b57ac824d972f42fa1f8f952a31b468a0e5e20a55707e95238d8a575992c4d0423066c810c19fbb2215dcda899979ede48a0aae40059f4306a13e7b506a3fe714ac5a89ce8ddda0710215d4b8a15798821141927749cb943ea5af28051f4787b6b7cc49c1d56fce12156c1825a8d15bf40aae18059b0d79e073e76b51bf232a95f0c006993a92a7a40bd2bf03eba1af6208db0edce5c574f1d25d07ce2ce9ef1dff1024b87460e37664f30efa83773b07bef259bee5bca15b5b397067a16f44c4b32cd5c6810d13d56b8d1cabad85039b52d2b3afd3d1b4316fe0c47e7783bc5e3bd5b8814be9f91144c6d44949dbc02955e5a174bfaa69940d6c5ff018cd43d093e95c03a742dc738a199e8226d5c055864cb2eb539b8f99062e6ed09e22a79cb4298906f64e2b338a8a67e0cbf454a46bdaf210cdc048ba6c9d39f3457fcac0fe77a51b2b61a25932304944feb4e8e9413537063e8af868268ff99b3931706de56dd1be0b03934a7f9a976a056d3930b06d31afb46ba8b8e5bec088a023e7d039b5798e17188f9f763f49d5e0ab7581fb53d984ca271718fd9e2a4cb7afe95be04fe6756eada0a3a44c0bec07d179962c45104f16588d316dbe1aedadb11b5d94000bdc55d05bf27ffffdfe2b3076d9b28d0995dd64c80a2418401518196429aba0f399be3815380fa97256acd45cb19e0263a9b347fb4a6308610052e0d247d446518b99a451e0d276c54f6f295a47870277e9b33e94081694a89fc0a964a372923e3142cc3a814bb66ff9552a791ab309bcfbb59acedcef51c304b6328a9ed610f9b404dfc612d8149194c9ac2b814931fb7fc4ed24a8edd984a61b91c0b7a7a495b4e83c41d7476083cea6d3b4e99f7dd6085c9e20da23a77b3591290297736fac98fa2a8d9212814df13ef628a58352691b02f7b14595ceab58a511022347db4f866ce6494160938838329708da64b2bae002088c8768d2bb797ff5f23f6093deb3d01ef29936910f18a1546ec4ad3c3a47de032e770ef6956b2a09f5f280b3dc14ca4305214adc1d70ca628e17216e74c08552394ae9cd39684de6804d29d45a893ce28011bf1095c27303367b907d4a9e0edbb3d8806d0dfba0ad6b74da3560dc7a2b2506eb0703a001ff1352e575d3a0d7f60cb8504927f9514d984618f05d6cd127c01d800cf8f6acc172aa517ab431e0b46753bd2e21f2ce84015762424a2e59d9c2c62d603cfa2eac1a30801730512c85770a52826f5c04351010e3860c0eec0706e002bef3adc47c71f2d10a266fe614b407510cb5ea02c60c1aa564ec083e58c14a9069e365cc91c9f2555416e943157518f84805139404d1498fdcd229523e50c1fac7d19899f2970499b2027c9c82f76426a25b4952cc66df6805d028a6c0d4894a173fc330c2f0510a4e0711f4df69ac48e183149c505a47638c96b393e8071fa3607fec5d3f74e2e48f8b820929b3291dcda6e3e942c18812ea5577d55e3a0814ac9b7a6a095993bd7f3ec195768922749a56d0b82718952cbe28cf124385d9095e4d37e207fd6cadb11d7c7082db7135d5d9442e31d5c726f80f919cf746f7c1872658d3f608b1bbb353ce67821092c8bb172bc5061f98e04446f40a52fb2a89d02578cd1ff474ad64094eed9b99eefdbd5eb7127c08da3ea55de91ca2e683124cb44e275a2dc6838f4970f26f928824d53dd49404232d8f5aafbb23c1ad7d0ab1ee36e60bb5103e20c1a90fc256bba4650d2139f87804a74e997a1e193926e539828b62f655ae57426fdf087e4524041d254670265c943e4b9d4570bd591f6fc7a208fead73ec34759b6c2d119c049d43d2eb8d082e54c7e837eea1b7ec43705a342695ebd26bb49221b89422c73f4f2a87e4ab106ca69ab08fc1738d6409c14fcefc1cbaa345d1f72078f1985bef7346106caccad79c64a7533a24105cc8197940f0ea15a286d8fb1fb82be9a729fc22a8e4fdc0d8a492e895b6496ed60776fc4f09d951628f88f381fff11033d3b949f4dc031f399ea63655e9b9463db0f1b22d6249ce11f39507cedd3e63698dfc963f1e78d53c2ae418730726c8bfb64fb264072e2ff7c53c5d06f99d3a707b497b97a8470726474f11b93be90e1634072e5a485be54175a44b0e6c7489f959cd1207464773ade9e8c181b1916a9ea37d033f59946dcef92a7e8e1b38cf18335f636766e4b481ab202d458dbab9d5216ce045861835bf275d56fb1af86c31a769b5a01a78f7b498be924c4969350dac7d94f4225a77c9333430a6f49598d2330fc13370b24d84a8f135035f3282d68e25722f5a65e0bd35e9ecf14b7fe84a062e64c6aed17b595fdf18189923b6e40d1203675fc2644ce139f461e0644e39a91271639dbd60e04229a52ed742bec06fe61c82fe94d62152bcc07e9c20316fea3c2ae5bac007116c33e89c74cc762eb0a9459dda4f132184942db02164e98598a916389dfe7792560c49044916f8641a3725ff94d2670d16d8f461b2b4c4d1619db9021766aa64b434ad595356e06b4c349569ad0a7c069534f6a6a5d15da102dfed962c7bbca7c0a5ebcd4da9475aa490149854425aae52f9826e370a6ce82e6191440a14b8dad2117472b2cc9b3d81c95eb5a6a7544fbecc09dcedc60b397375bb3d4de0be3a8b54bf99c077e4245334dd2cc97c094c48695d35a994a03b51025b3a064d22a734e2499204aeee3e9ae605d30e151278b38a9a297fc811d86c49930c3aa71cf48f8cc0e8e991e3f9626a6aa5089c0aa63939e72e917c1381911163f7e660c2c7ab21b02a2289bc2f3361a710388d185a82106910d8ca48a7828c1cc2f207089c88e74e0aaaf699dc1f30528369ce67a9a3f7e7032ea6124aef88b29c35a407ec9b10adf5764bd2823c602da4f13449a6ec8057fd0edf538bff1dd1017ba956ff64e9e449c2470eb8fbbbda943d2f287b71c02465712c5a9e99f8770356e4475691fca7c57d1b3029fa6b05cd7aa577d78031f5d1ef4d9f96c7140df8dddd12daa4a5a887cc8089b1e28e74d71c554d19f031758359e527066c9de80a06dc8a48d041f9a70c217c01273f7f76b1353f5cc0e6b825738654bda7b782ebcfdef696f5528a145630b69293298bd62a1c2b6d5a446dbba2a96094ecf7ca3d13156c0a7549c4763b05bf7549f76db5a660df7593870eba52b0a73a650a8fd9a1244a0a4e44d717211a44c5108e82b314754be95acc9d2da26057636b49dcfba42e1a0a4eaf266dce2e41c1644dd64987c84906937f82c939481029d9dd3b7f9ee03fb2a7d0a72753077d2798205bb332ffa720630a2738d1ebb89bf29a9278d9043f499ad03129fdbd26d104a7dc5643b3ffd8e99e092ec48af95444523d398f0926a7d1d2796385975a976094dcac7b135f4b309a214f361dda64969c4ab0b153e6355922079d1f25f8516e6a41de65a89c3c031693604496972691dd92ce6212b09004e39df43da4ba9160d4b4d2266d1016b46627304830a2566b2a65fa083ebae8ac4fef9872a53882c9bd7b3a3fe5b74ea6ed01168d602ced4a2e7d59a2df89118cbc189645f069c992d9249322f888e6c1d32389b6f789e03d7e5af1151d118cade82bd91937c71ca3032c0ec1870ed31bcb93d2d1d48660f73529bd078b59a8746f650259341288040251381088e162de2300031408001034288e4622c1601e69baf401148003512e1e3a2e2a141c221614161a148983e16018180c86c1a04018180a0703c100421e44399c1ecf3621fc13368bb43dc1793085894982986a70654067d06650cea0cfa0da206a506e90df20dba0c120c5a0863c981c2b691ad606df1ce099d0809062504334d8177b704c3b836f06980e1a11aadcc19884946d6f1d614d8133076594b099bd88c9b1323d63f7555b15d2800e423bf476563f2859891c3ddeacc1fc30d8bc0a504638208ba2fa7748601cc025c015c09380b3027ff78da2310714e50e4c0160c82694e5c42aeb259d0236e423d941001c401d401d403340e901fd0b54c5b0437737c0690600640002002c00600dd0c293ab513e02f0de00cc29520997b10184c326db53ab40ac005f0f60aa140307735f66cac75da310a07adfd85652bbb31e09124a594099c2384cd9801f7a8b048e3b7eb92fd889a6355a1b593928302fe8b983b113363fae1da64f4db427f1a6dd835458f880cdef902c4d9b5e415673361a887305290c1a94da7c0b14b46f6dcf1bf5d7330f1076c8b0646ff8b1801c68d10a5ba43048b39da9da42bbf6e890f567b4fd539d02ee507fbf2c83ce9185583072a16426b80802833941ba8fc67bf7a2f568d019eda3772a8f4ebf57125648eeb22a351747bfecb3ad58da24850709176281e0a873161770c2fa6b08415dd32926b91b7a219e2d995c4173e450c80257c1a2de2f537cf5166323ed1ab3060f16b7790d949ea5a1b6a9b5394db763335d74142bb413304c40245ebe683fb298cf5faf90ea6ab216c17857f66600669b1743c7e2aa7fb1c7e8ad0f3043e6e4600363158aff284e29e0d95885a2b5c8f05b0f28b6150bd09d47d7d7c7801d2ef3e2a7835a9780c6b7c3aaeadce158f5fb8011791151e1e753f39e32ad6123466247541c44a6528dec5f4e1dd55643a5d26fa238a3e0123d1378904c073106eb25326731055f4b7e247b6e38a455729beb20a1686b5075c999d07cfcec75bb8b30a61bd32458bb59a3a4ec541fa0f03f0a0822511ca5f2511cb4cb7c46ac48914d9430a902aa1c849a625284845982223f052cdf40cd439540850b545fab3bcd61110a1ea180ef44284579fb437bd47a184e62a71b4a18d427d415d415d42bd451a86b8b02a2c1a8908403aa2f1d6743d4826a6fa274a8e4ad890fd57194334f017b4674c4071430f8d5f5d61e8a769221e4511fd529350df500759a46dd9b1f4706e081fa037575d45598ba371457534d43d543494339c0a29abbf5d2d651ea3fd53551c0b2972edb10a026a0a0a112a03ae628da52f33eac81ea85b280aa868a41541f029c6299076a0187d2018744497da178416565d4bd6f3df4bd0a3505050785e251b409ee8033a55641f141d540950a541cbe953d94289413d43aa81fa82b51a7ec541cd98bc19838141b546aa82e543d54f4a3fab0a0624531a839505473ad9353544e4115ea0c6a1bd41ed41bd431d49fa38017121c701e8deacb78f970f2df14b301e54228e013f304a6734290aa4ba380e4105c894a1410af53be5995026d8102c6ce7f5c17b20802454301a1179d23e943019b9315d786a180e4b4f102d3a368c3b206ec0b8a3f940d5415542404aa6c85d6b32ea84528b050b550b550b1504150bd50b550d183d2d1bb67903002e508f50a14f00f4f5a2ea4c8eaa43e5dd3aa06b3dec11e269bf23c7bdf7f40183c34c630feaef1c0a724bfb12354a0e9fe1fb3f29628ec9bb754af1ceef1b02a47668ca534e370a78f886b610f65000c7704d3826ecf14172aa857c8bba7e076ef6c59d9296cfa0ed97befe9d67646c33db5e4b1b3296cc32e56883afeb013f98a145940e48624b6b249d119e5aff5f39528acd9517c24aec86ee12bd2018e4e46a7f1705947251e9acb299446846e5e7e5e745e745ecc5e845ef45ef45ed05e08f0ebc99cf85ffcbd78bdb4efd7f56f9ecfa37b4178c578257925e2afc5c7a924b6e9a5cebed0521d6bc6972582b3effe8c32ab1ac211c477f5ab0ca58a246da2bcb2e548fe9332ec54558a86160cb057c65f31608d5e895e3dbd6ab9d7936cf80bbd7a517989f2eba8f33143ffbf1621cc030d5caf35fb3511da187c30f362f02ae295caafe37652f297e8756cb2ff38c29c8abeb26fa0a096bfb810ba02919eb461e6639a95c2875d3fc6acf7122c1bda691862a591b05db357fa66d6d16117dace9a1236aeb3338223513ca8c2ef889320fb8681d180e1e5c35fae0c01d99ccb581d545ab7afd2d281f0e5b8d682b1c6379149fc701614157e1751158ab67c5edbd4e7ed9e782b7e4499a2657348c211c510f5103b9f38b8a5e8c4ea5273f9f725992346d7e63feea1fb81e99f2cbac0ba8202a304ae5be0c5fbd02ce420009d40e69c56138265692f72978717ba72a743389246019663f117cb39f9fc8743176f0387c1d5b25ce26903aa4f676cab19bd526aa8ce400aebcc18904b84bd39880c52953a44004b04ce5909f480d6d5840a17acf033a254c0e58d0a6bc6977d15faef13986630b26fc9986a108d99f16104ecf5b3f35dcb4d44fa1b377c498ca0443445b18a51bbf880fbfad91b8b3fdef860b0afbe061c173399c00ae791c9008a039f5094fe1207a6c08f36bfd9308b8ea376a1ad16768e2c7f0155b6c897a220741a13a496ba139edeeda09130f8da532091ed6d3806e3c2a0623f800677adf312143ac81e0762d3cc2864befba4b14629011335d81fead98c69a744547948f10d977500f515fd3d08badc967aaf793276e10dc199f78ddbc1d811af15c164dad86a708fd4ee7e42d6af1bb82e5d5cb724003113fd360aad505a9eb86c0ce861f94c113d87aa5a148569c455a53f252b7d35404a0ca69af4ac6e5a31c616eb730582b18be988440ce1501e795c0d0a16020f77517e6f84745c09d9816b3b6d63ac4e5050f0f0bc077188ecded05fc790e7926382ca3af3b2ddac2f52c02b92f82124b39956203e88333eda90f3e907137d00bcad1f943f48cf21b14ae75bc1bb9a78e39e9b34e51c866c6df82ee33a68069f1404cf46d41c22cb507b7fc46542799ae7e1bdf453f8197f81031a69725f06688384434e656d70817f1d6fc7eac7c619fb43421384f27278b3b8204eef7295968e0939fbe58711456eb9038b27d3719afd864427cd6c2b7766d9944e4736339f2db39c7e39a51946c04aa995430bbe0e74380b189881029652e2ac5d66a81e508afed713a76d6e9baa2ca14eedcd17481e1769cd23a146e4958ea06e6ab4aab00e90d31c47dda97b135a14fd67e993636af726f47e1967f828c7e265d9f98b7e5e1d374de306bc8c245504de9fbe8924ce83373ca3c1653e6fe8f0ee2e2a54780ec7d992b0d43605fa8c39d1c5f15414776263a3040636919635fbadf36ebde856d8c2c0e02cebc9ad68019631e9cc6894ea7c4da0c9245acce6012841c9d004947a389d7240177597499d9e6e1700a19a381edf59556101e5b8597d981369af489487d700fa9f9e2da10ab5f44efc86d16a34853f2fbaa7cabbaa3f084552a46d349af8abcc804260f6ce43ba17cbec89f3d528c4ed9e17ec57375c8ee42e72a4184a9bfbbb48e76bcb65916ccbc6838d8cde355e0e8be1459058195976d4e400f695c561c271b72fafdfb76e065423e492688b78b5a2d05671674700b7c8096dbc0e88d2ae4db209ffeb99eb4b9e41a1d71f4cfce865e0297ef39c2dddca0ea9f050879cab4af6212ff2c3bbd751b6e4549d959f2694ee4f252db9192ea0f13cafbddf1b0999103eb1e7d12401c480defce89cc7edb1ac00ffc1d11d55e04ac55594e7d7a5064c805e5a65337dbd495bba123c56d06ae304afdf320106ed5e21b6e8a23ed1eab0388a172afcc1dfbdf3a0aaabf17eb4fe0c7649210398b3947c7df6bce0be3a19affeabb5706282367b163403b1a6a58dbfa60447b300bb718635db3c6990e03db0ff36107f0d42b9fca17b40e499c8659f9b25238f187db8c41760684af5a5383412757422cadab5da0f59c80e9b8a1e03b6a822f4d179c0a6cf1e0204d63dadbd94628ec5688c7f1564ea7b9e8047122784151f7081328082804fc7d1a8b20887999f3cae091c54ac35b609d1afbd728cd256b56d5e6ed3efea8a66d66d8a3faca705da88435c1895ab0f5cd4e57c4160470f51b36a68647004de59d20abfe9685cc5ff3d0344964c6d1ddd9c01c404603ad2eb909d485a115dc1ae7c292b15455feb70af5ce3a6b469407efa09e1e52d591a3ec37d7de609ea64ad73f1d40f1f028531ad123c115fdc20b2ba5eb7ac14c16e36c8168e6946232139ce7b4406fa0a3c8542444b98499bc1fbfbacc8b45cc102935473ec3afd721d1ec74ed393453e0e984786eeefb6ad288e622d0d668f44b2d92f309f2c49ca5c22d7a7891ae448ed102b7b5e20ad5448eb65371f0e2b914cf9543e1c76bac6ab484d5f4a2868e87ecc97d5f102e3360659a935f1e040d82c33ab2aea48019506aa3d6ef953c5add18476f563d60072967426d756f1b4f1803e263e2d072377988fbc2dba89d3f58689b30146a084dab04eb41e98f3b4bcb2d22abd314cf41ffc169ecd2fb9b7c86a188bdaaa11df6694e594f6cb3ea8365eb28d31c95517f9518343badb38d06b050c1b9e007ee837fb1e000eb8e303780f161f5237312af388b2969fd2db42916e6744fa8104f54fb0d1146346cab827c8d6d7628492fa79101ede960211bf72390958809e8139d7bd4386a606a7e69059a9ab232f52e6c253eee181c6425dabfea8d79a75927d826b2f06ef10fd4628e809ad3914568d35629c7c656e2013fb06ca91497c458ec120d9585cdbf18035120101d761c0a038005d5cc1666ad98f1745400a4175d048838ede6c2fe7df6945d6456839dac46e6d9714cd5a8ba729f9e9f2272e1cbf0412a3782ce9a2bd965dcaa68f72e42cad2e9eec0040d6f9580148a14746a32946695d9bd14ff6910d81901b2aac38dee6c2b51a7ed474f0d020aa075c30920d5c1837693f27be836992b929b9f7ea21beccdf7eadae08251ade11a35f965fc8c17a7ab2007bbd46aac9fc672f299523e33bb845c678e317b93f4d2d868e44afa9663965eddc13e0ee06105f5b22439f82f998e31cf529588ec8749d98332133f90abdea3da267fb3008ba2802e90af13284385d9bff0cd166f5dc77a5e5fa4d7b6a0c84eee8780f3cb37e5c3f1ed022ad0039947e2aba2c9a87153efcfbbd87497ff1ddb1e06dbf5ca243c5545aac95b6098637246cd193a408eba48f021eb528a2cc895dfd53747d592dfdf5d0a8488f62a48c5827a3227e099d737bdf8d0adec1a2b7f446edd8b8bd99ce0bd966ffd8dced97ae45ceb4707c560f43dd2cbd6a890aefeaa4df71a01bff8897d432d45049448e51cc613a4aea029f28a01866016f9f747728acc2ea797688c747e2657d774cc819780f916b7d01db878d0f24d712b5f967397e5aafa90fec3891078e4f3f988643ac2ea713fe85e0bccb544ae490c2e2da36b64babe21628b32bc9e02af4179d76896f219ae65edea0bfeb0547ec2f38be18f7aec050d3954e86ad7c2db481d943419417eaad29bcbe0e5a43fae0ecfdf27c3f213f9aedd169e0947796552e2783e0c182bd13f59efeea5c6b607b2a8de9db3731b89d850981d2b444e45e7b9a68a8fd61448077190d2c1a8503acfc9de694211cf10b562958b501bd57cef3a453b7025ace16a001a3413a5cdbe815d1f9ba5af4dd91235cdbc459b9caaffcea6ec51027b88a71e9a1254d020cc8f29d409e6745030de01edd4a6ad08560831a42067087eeb86d901493d51787eaef6daf77f2073fb99eedd8da562e88d95e8d694869b36d79352ffad39e21eef1c29b8c128151209587aa4d2057569ac644ee884220cfb32280fe7fce417095ea64dd6deba87787579d5d7ad7ecc1fa09dafbb865e3a0a2a122b37fea3e2b322063f3c05cf9cce9277774c8b91743567ff195552827687d5321ead36aa8ded6fdb7d7f6ba87a6345e00b9eefad53e138f51f0625a3e16fa00d3207fb67f1906f5ea53a4d22a192df25ac1d038f4ead5b594291da548da0982c3b310283365e26540c7c9604351b5b4451b66e1315d9d7faed4930e44c759096811f19a305a2826e36e7b2448b6e477b86b9a48dc3cce6e4100279fd4c64c7693c5e05a2c9e2eaf85caaa88bc0d1ff4dd74d9d261416d3ec89f8b780a9c6e522219fed7fde73a831ac8b1a199ee9d411ff4c17524450bd84fa4405283e5c39c8348ad24d02778b7ea799f4998bc8b568308c00c01cd74a1114c59c583dc98c68bee81656303d231d0a67ee86554c1563177476c065d12500e10ad7072e898fd309b6960d405d91acbc7a31fabcafc4593f717439ae7fad7390b1e25363c87496cce9b4931eabc92121ce8ed653881634c47156c41c48aff5510e8da5378810c32c64aefd160c12340ce4455b6c29bf604133c9460a1092463467a37cd64b4033dc0ecf039686cd577cfc67b45ac58a25f560592bbe2990883261b7b39fc03c9c2c247418c11e18b72e25233261c7b1dc4b20938c0dc1827c33c6d99b40d581681d1158472e364bd8b3c9649891971f181dbb89c59679036e5c3f11f578f7b462a6cf8aa24582b632ac90a70d41a8caade04789b6dde3e4b276536af0f7ab6cd6587ed9707d335210646c958b9c8bd28c326da35f1fbd21d138860f3487ec9dce0ad3ca85b8ab872cbf183fa5118861939bbf4cd6d291ee3c353619b1ba9d256b87e40bbd10b142be2d3ed6400fc9dc4aba3cf40a056c5e6b021b9281da68905cb8b9e371d30f57a4528e960fa3e43bc86fc437b1c3ce824d53067e9c5141b399d2951ce852f0146cf3ecd96a4e22b6ec08dc0790b63890c5a0e6142190b683078b164579bb1d29f820c88c0dcc7bc8a5bc3aef229a8484fc7082370dfa46348c156192943a1f8b2412e0a0403e85d5c98e0a1eb75b7f4ad0422c5b7eabbb16c1ce89c71591a19c42425626b5d8066449dbddea5b3522b4f79e31c3ef25ff2f5330fbb696a2a0204bc9a7b7df46de83fc8d577da88c59b385ae6762a6675f2c9de66d9ddb7ce8b9505ce0727814cb06b7052832237c6c33c5c2207100ecd7bf26ae292d11d0184e170cfa154b3327b9360e0326bdf8460519a48cca6dee901a92df33b7913e5d0360a2e94dc175a04fc5b39e052f4945909a670185f7957a6964c28c35e6b3a250403ca2d0c5d61007c50ae191f8041149035dd831e6116001b51631575ddcc851b66680a9872a757a8305e988506062bcf6241678a6b0af071db832bdc174886441e1a40a6fc9177b8042c79d93409b17f15372670dc395b93184ef642924b13f4de5e0a05c798702d549b42a883da678ceaf96b0afb188301f9509e60fa8c4020665d553493c04bb496eab290e270b3cff361fb031e138a92a87714f9bf4dd6838a814c77be55fd7660c9318883fdea12da67f6aa768927f4babfc35d99395438cb7edd1caa1de02cdb40fd19eb29561b3e65b2e910b83a146ab3ad507c454ee67167ad8fe81a2e838796ba6ce2d78a382052b9e9b5a218d549798d6b5747d107e8a419a46276ad3b8bcdebb37c08d05ce48faf42dacb43e01b7637952c129ae596364879fca85bee6d8c7f5628332024f9c921060f8d3f5398f4d5d5d55b68fd263b4fdaf9f223881a0d0e9e574939dfa179a5987be194c7fbff03c7c9c7d7655f668f69e3cf1b3f0df59ed40e7b2d1567627503970225c4eb0d75f3ecc09dddb41fe5266139a3cda8978b33c3fc488d4d7eb3fda7af694c762044a016a8de25207edd8fd1c571e661061003b0a2618e0dffe08a3515d54f2103e593b2d8ad6c34eb136877476e6c0ca167cf2ed3ea0bb103e6e898361fa5805674e60d10b83ede3685b9c92d7c1ecc65e04b7a64dc046e954ecbb57512424a08f0f12d203bc7ba52e0a646c058fcd3b52fb202f01aea8ce0df99cc9eaa292ee68c4ef5dc408fa66c6e06c658eba4ee2dbc52953157be27e987ccc1056e75adbfd5c075112ee9e5c6ea844b02db43e78b835464df8b26c7207f334bdf8a23845ae6cb3ae0c4b8ea8963f0d0fd48311606571c4770b22ee910147cc825d4a204244d770120f796d2e7346c590f2cb9b28112094637d7a417d401505cfba9f0190a8aed59bbd67b4dc7b4b4e0fcdfc0c5153480976c12bd84985f43b99d13a28b989bab1d6016ab02461b453ccf8a05ad8173f62806fb50ab689f91ef66ea1f9b4f75f1ca6389f6c4f6e9480e312359a29b00a7a1a41fea454b47555b2d28464efe0ed77a0efe53b309ca6481914ec0adafe115c026c72213b20be76b16947beace79ff90e5c848e8c5c2152cf148c9b22bba3ee3a556c87005d49f268c7349306317a8f3f9077720340b5489b27e52274db89e6d0ba570591b5ff17ae0101e93fa9f1a6024137d3b079c0b312d3a403941348075daaabfb8c35043de75949844e2ba3b1529023bea5d8ce0f7f6dd11bdc6c1abd3a7af574709c256cf61904be356c73bd026a053f24079d474440c39339e2f0b02efba80a636bae759bacf9f9948181c0d60895ff870425cbe59e5ae710de2534bb8f3f7de68cdca134a7d94ff4469dea045fbac79cb7cf1b522ee2f90337454a386c4b097830210ea31f762daccc424cf4ac822548a98210ef61e3bd42f730da373f834f32b0f362784a85520dc49fa82c15bd266f30544ccaa66cb13ed2e3898a8a3f3aac826e94c608b497827786aa8c25da2f5600ca1b01901452fa8d87d3c587af771832e3b4ef3ee866bca201875a44cf54a0912a0dbb5d6a56d9d270e482528cd8ec243dcd1b23b53a3b11b1a2dc49aefa08095df45fdbde26ebb751415405de50a10d5791d10efd8dbe5bc9906f24a7394061ddce5513251bad244455199f503d81484ff11fbfe4e3c9bfe93dea10bb5812dab028f37ae5c39d5a645d72c32c53006881ee69555524bd178af4d4c512d283ad51c7f0a4c26deaa6660c93189d0cd4f35ae130abe0bc974ea36b919401409bfa28505a9eb5a3365dd45cf3ea9411f3fe74113a7bf9b5159893b0bc1e4a366245824eb8c02ed05f676baa6717df6aa8781263018af539d7b23320252e1b25b6e33509fdd9a34d67ab0f45f9d66c6e149a11941cf887528616f5a721e60e2397fd1f407b7bf21893d505c0b82a3bff0837489e74d2e56cb8481119bd8f5aa7cc167191d70e6718f1a97d8f629b42de93fa2284c33f42d5e44d20d39e2e147544592a469a8bc394511ee813ddd2887348ed23479973b1b62b58133f05f487fa6cab6382711cb3a351aa40f562b165bb17aaa5fb931897d0157ce76a9a2941a41ba08a36b816486e9724615223ef4fbdc49cd4eff68ecca28814eb2780a3293bd355b3a6c9c67a16c9634dcd73b8dd5207bebb8c4a8c95b02dccdf09e3b9aa39c5d5d6b494d3f8b2d1dc1b45e4dc0ecdd9eaf74f8fc4593222e68c56ebf8389963c41dc8d8165d325aaa11f0036808347ebd155fd324aedcd2f0a63e705526a15efd59e331ed97fb4cedd5796db744e2ee51e4a28f614ccba63e6b71ce4a105bc23269148c15f1727dacda23aa466f515231d4f26e1351da4e70c9376e4c261326334a614108941cebd7dace8341751ab44553d449251bc56da73f3b102d5adcc409da1b8b0dd6ba9ed841c4cd44e59b91d1f0744ae0befebb853dd42d4509df12f8417e1543d15c8d206420101fea167d28aa49f19174b435ba50f193615fc7763c0f60609af547b9e1b8fa85b2d1cb7124531a8ad8a3b8f1b8096ffa57bb1679096dbd13de15b1222467945f80427cdf351c4a6ef384e6840610cb0d22e88e420edf3629640c4021f3b3ec7b0e94c7904d150685164ab1069ee6f7ccd7ddb6b7397714b51e63dbd05dff21047de3356c3d85bc01ae33fda37790a28d2ebe69a7b1dae7a7bb940db87e4165840b3a0da3a65845ca72b802e6d6820b1dc2ced750bb970f98ce1534857a2950dc876d1e53fb5134d271cda1d4a2268820d14fd798d00950210dabf2cb29f1aabde0bd2f7a7ea71c36db020b54baa037406a10f290c58c6c04c9dbcd969c7c0c89ccadeaad5efc4bbf26f181f77384b0b8bca61227fa5aaeaa29f17e3cd7c56846cd964797fe50596d607d58894d37b603e7d2a6fd8c1cd9d0da9284e752a972c55e0cd6a5522bee50e2565819f3a0e5b9ad1482842bd978cb8a079e71f2b631f8c8ea789136797b119dbae23d92e4c7436cac1cb5caef920892d51a095cb5e301c6970a106cf76ec668ba006878daac83a3fed4be9db17cda7599232116638674b8ed64a2031a1ce04d744874fdf9cf4775eea52ee93ceef9e8eb998ad1a6986a243ec27055cf499da0739fc70f235bfdfce9fed2eb7527a03dd161dc23d89afdd25d77cade96a78be6d9201632ee86729864614166e49c1f0d047ab206ffbe8c7d918a13da212f2f810942b8cb8f775dc8994389037873c4651ead3cec31d010460548bcc127cf63f56b9eef8a7e8f9c0743a82f0599bc14cbcf1b190795a18b500915bb0201d8d7536e763fe40dabee31924ed85e8f09e5741e8b46c3c8b42865ab7c74b1d6a07fcd12690d557ecd6b9cdfa7e9a1075135e39eef400a23c83ffdf779d6b9ff68925c69e7584075813393fd6376e47b275752bfc9b76c364614358e98b9f93067b131b129b818d8ccd171bfbb00b50ff4da42d6cefc5262846a3f7287ceaa602b98f7e6c4b10083927625a49717256f1ca9e92d2b63c0ee50b6d757f742e04cd39294b608a5fd8f486bf0313f69af348d1a5761b6915a212918092d166e3246df3f6ae405618b686e6aa184ba5ff15e9dff8a908c31d05a053020067f3d479534507aa048e55ed86340c87627dcc015d7332a37c984e723ac0624ada9d6805f6eef8f25441d8117f0845be44339beec49fa8c735aa212892479c89ce9979839006d014ffc9a7d4cce3584692187e1795042265cb4f9672ddc25a01b849088efc664a42e635400899db12e577a29ccb3e1220b89fce1732d066acec716e60d0140356509e19f7edf6624cc8decbe0b157f3331774fb5bf45d1a63ed833c5e0ed712dde89e952924e96cbbe3d6743887c3b2350b86c8f663f9f7f9eb54d019641243279d0710eb3ebb255056a21b963dfa0ab51b25bce9a738c7e3ba5cc2b957d3a80b1db3525da812aefefd0ed5734899aa18147e8b740cb2301eb58166e969b5420d371e1fb1275851361b764f7196fe34e9f537ab6e6d835c2a1665035aa54d14d11851c138a2b3ec708a21e22e3b10761d60526639189b080fdade1ee52e8d87122e0ca3f37e8c32f6b5f1a99b91021bda98dbe51d38532f548d09a1cdb5dcd46658fb76dd36334ab15be947ba424c43386c7a0080c5f44b23da6fcb963a75dd223ea12209ad779f61a72246ea9ccc4540fea6feeffca7b9df83493d502feda7518226a359829ce0477311dcb99164b4ff958869cbab0d2df5260117797ac97d6d4410dbf8bf6ff38f2485fe9e821d6944542f52794dfb212b43cf865f85e844e750f6090589d6cc7e7da68cce627ca1ce9e7b7832e2ac89f700aca7cf31dff3736a601a9dcbc1ac5a4160ff4229701e7d163d2013e924964a424cf54ea74c4028f9813375fbc48419fe392862ad47a6fdea7e526753a0fd3424e84d57f0e259a74ada54a5abcc1b3131161d65f33b15265d35b173154e42d251119436b5816a8f5b3e924b36cd4ea3a85eeaa86cfd1cabc94b9b6fc4b7d0004cdc9c9ac7cd6c51d7639b5a01fc35027ace779b3a70eea4900330fcf0c30f3ffcf0c30f3ffcf0eb6c867010f2899864a5f53bbfbaaa12e07c5352529225e3ffcd9afdb58192b58192b58192977301c809ba09ec09dc041a51388a318368881355a537281ce4a489a975abba2a963ad078c281678a68e7042bcde128d070c2417f458ced1fe9734836e1c8ab8348975dd896cb84a3ac90528610dc251cbef9db55aa38f9bf42071a4a3870dded8e3192241cffc5ce5c59e3c4949b31300e349070ac72b1ba3fbdc43e4738f6b40c2ec13724ebd3084771ad315fd7ed5e4d07071a4538f64f997f626c79df9408079f534c44f53895e319c241bea8bbaed1df95c34238baf6fcb2399b37d008c29187aa30297badc518ad25d000c251b6da75d2aca41df70f0e52d9a494c2fe56bb436da0e183e324599e54e37c47cf3d3836fb0e99fa3c8fbf448307c753b177a272bccfadbb50fac298c0ef0a0c2cc08b118401460abe088302ee0ad8224301347670f86d5bf93a03c38b2eb8e8a20c2fea28023474705829931db1ba39f864061a3938cece1d53a64e1a2345c6400307c7dbdb2dd9624b688959e00b2f4c199e002559a07183e3a01f793a3d675a521dd0b0c1f10613cbdee9bf539a6b7098fd5cacfd3f06d194185e74b1c51662d0a0c1e169b0b9b0b9cfe028e594ffd2b6cdd52eed820cc380531a3238d28d17374e3a06c7a12fdaabec2777ec6170185c3527c99025636d1a2f384a5fa9544f1b267dd170c181e7be8d8a752b8e3cc22c44c6d3bd25597110fd838618e65a12fb2a8e3f86e8c857a9e2a8bb66c3654e638e792a8e5b3a6fa7246e39114105111db7d5f33ea720759c8b7c9574531cbf67f7596a67cbf629c5417c38d11cbbda181e521c4bdca60d369fa4da328a8318d5d6c3edde778e8be2c8e32f3f227abb2a1b8ae38c5e19aa5b06c5815fae10be2dc987463f7118249ea7f5ac1a91a3278e37c7e43421afe710cc4e1cec25ed4d2bc9737a72e2e82eddce972689eddc260e531a89ea2995ba99451387496e2fa4a46ca163cbc4b15d566baee9f1d462e2e853dc2cd3fd1247e672b7258e4454b2598ab1119daac4f1ba5ec9685429713cf152fb74e50d5fd1248ea742d6185583258d39ca82199238ca27392c67a9eb98934dc18c481cc5f7f017d65f636c0e240eb4b354ca39da8f38eacca056b69d230ebddf2f86d68c097d69c4a1d4d5665c488c388eed39e782c5b7757ec6220ea2c5f55d2eaba4bf228e3cd6aac54c7d333b1371bc99c973ecbbb890d50c441cd444d59290b3bbb855d630e31047ab9a1635db45fed28b2e4ec005d5126618e2f8e5365b6e25de7e5d8863adb4292d4fbeb9d210e230ddab425acd64b71c185e708134c61661c6208e63e608b2192e7d292988e390c4726d4d6c2e99e00e6604e2d03f3b62f3b576a42c200ce311b5152efdc3917dafdcade58f34d6e960861f0e3edc55c879b3a7caedc3819edae585ca4ec93d3e1c455275cb6ed916550d66ece1683a68dfcd4868598f1e8ef4ce3ccfa2bf66b9f37090824e7ccbabf07020dde942fcd94b293e7738d87c9353feca4acd6887c3f01424746d5787c39a4da12d4987430f579b3df5ae25324283197338928fc934989a64282113c40c391c5caa6fd7e8751ddf8a718130cc88c3b1ba94a5bed411fb61381cee5b878c99adb255e50d4726c9fad7226279e686a374e93ca5da6a660adb70a4417246c4325b8cb2e12865c4f210e56ae73b0117472e460a3030868b218619630334630d4712e2a41599520d475b71c368a8cd01c3c510c300291803032a989186e3b2b5dbd8de561a73c0988186e3eb584936c53c3191679cc1142554f2915630c30c4761d63c429e18f2e614045ca181321c65f78c776e91cbe292e1d826c56cedcc6c259d318643ef0c3df71417c3a15eb8301552864929010ca4c08c3186c111cc08c371fa178d27613fbb2c60388823a5913fdf2f1c680a121e36c69c1a572ffc51ff428ad9b40b076fe2997261316a835c380afb13ed1566b3764280195b389e8938a9dea5fd3205ccd042cec8c20c2cd88c2b1c6f4fa70b1953dbeda60bb2c10c2b582f155656d1aec271cc10cba3946dc5149d4185a3e825d3eeb7a156df195338d0df8a613d74e2c8b9c5dcf84b148e2a7bd6226c9414c30b858332db18aee17dc271fc93919c75b256ad4e380ecf3dcf39984d38f2983bbf8fcd84e392d9d4f8d12c395bc2a145da1295e99470901de653d6c4241cef8b5c05fdcd4a63876006120ea345b38aa142473892987c2e963e4f9ec80c231ccd5f4ce599725cb26d46118e474743a8a89d9d4184a3f87962c4d3b7bd75c80d3386701ce5d7c724cd62fe344308c7122a9475e4db88a6705146185f9041e802338270b4712d2e9746cf1872188514338070d0957feab33b7fc6bfa398f183a310affb21a7dcb1ac77a154a898e183e310d54a9164f454564bc58c1e1c6e52d51cffc22ef4b6d8826a060f0e3ca7cb4e69a3329c0c320c174766eca048b699543fba020157943106152ee43043074793bbfa1fa7cfc1919dec06c9d291c2a57170e89da583fbcb0598718363a92ef7fabd9552cf06872135723aead1276d336a7094aa43dce68f1049f2193438cafe5292c3b6e97bc88c191c7647f35bcf4b020e0203c6d20c191cefe5b0d9a12e5ceda70a4303553362709cbff22de494cf192b46980183831ec9e7912e58678b21c28c171c74b6b8aeeca40c672b1f238cbe805960860b8e55fa3e5c5ebe1469314a508693518b452b0ec62ed2737e168bfc75a144069162c18aa388b963ac74a5efd757715ca1f19db9557e2d57c5e1dae6f53f3b1507b1a5b37fb060db72a3e240c73eec36068dcf9de270e6d3f6aee62b09b1298edb737df4518933c9528a63f7d47d1a1245d75b52b0baf5f12b257514873abd19c2ce298a0399a929cfcd122262a138ae781d425bcefec983e2305d4a9a3a68bac5479f3876971855be725ac83d7110cebe724821fed175e22885a4decc9359246d06c83d60c1092653fc7787486ee2c0be3d9f6b7bcebe7b12b0d0c451d8478ecbd9629189a3f71d71a9aef50a5860e228dbba4328d5bc948c52018b4b1c458dfd69928f9ce62c712c12161b3fbc953848de9d327f904c11c90a5850e2a826a564b521c60d396712c7c92564fb5871bdabe014b090c471987c7943e62f4e2a2eb088c481f489a58b9ab579251690389098375de73fb7a78dc5238e937e5e0ca55f712a8485230e76be3ff67c52b77c5834e2d0276626a509352a592c1871b41b3fdf8589394d368b38c89ba2640caba08085220e364fb21039ccfa053711c7156ccceeb25820e228a78f1cfd439ef05ab138c471e7a78ae43a626188a38d1fa298449aca21195814e278ce25c49a24b1c6a21a032c0861b49887ebfa8e3977a19474050616a080086cb1051765f8180d46180820a3015b6c01868b208c32b820c3bbe832cc08b6d8e20a81c520120b41d41669012c02715c316d45962f9f109518b000c44168c4f88dc4d8e4fd0f873b3a93f93256dce97e387ea908093926e193f7e160bca67aee2d72b60e1f0eece4a34cb26f9ba6f7709c51b36c3e8d583bb51e0e3dda2464edb902c5d4f14206c7a592d2535e772306d85aaa7e083617611c33c2060c0e82c445996dfbe4f2e161e305c716e4c286a0125762aceab0e182e3ac96d3e3c4e83db915c73329b769635b3b3dac38c8d1f6e34ae73307e90e3556a14f879aeafca22a8e4362f8df963c99ea151d6aa4e2482384a94e91e36b8ea3e2207dca4f9f776ba8718ae371cb496fb255438de74cc52adb7e32821aa53870b98b14e3fdb4e69453831447fe1ff3e65fd653737ca8318a4379f34df1696bdf3936871aa238b4d777d9d149a6a146280e255b0e5972f5559e078a438d9d577721dd48ced5f8c4f1e430e551328e4ccb353cf1c712579b19895577a164c5458d4e1c6b44ce4c13529ac389c3fb2f359fa96c7241f2428d4d1c564e1f7b36d6f9e5790935347114dadccc2bcf52cc452a13c713baa13b84ad6a60e228f47b9cea9a4eed145f3441d5b8c4d199c4601236a68ebd5be2b8eb35fee323e5264f258e2b58985429ceaefd4289a3f0d3112a9ac673b44ce2b0b2a7dfa04be228947fa409fdd12c66240e434cfbbd1e41481cada59c923d498d471cc745ced92ff78e38e891e90d9f2fbce802015b6c61871a8d388ae8d192a43a31d5c8888370933d048831823118506311c7512521de8615711c23630a8bed127118b5e22df27888e620e2e863b4354971da620b2e680ca23ed43844b16fd925e8668638b890d917b9558d421c65b6cc38e177421ce967399becf40e151fc461d4bc2e2e3171fec3823875ccb10ac4e178acf06c31b946a580b8cfceea65d63f1c65b110abf553629e9c1f8edf2b59fccd55a30fc73efea163eaf0e1c87cae636e088f22fb1e0efbbc6298dfb49fd37a380a973fa887b314e39787430b1727630ef36b13e3e1b023844fbe361252e70e873bd39233bcfd556a8763b9ce29576c5e52d0d4e1207bf96910eb4c532d1d8e7385dad8bd8a7f967338d23cc1c77d2363ba723854977ab5ef8ae12c8cc341be9bab5a7e7038dedbe8d099e80dc7394d75c4c76bb8e1a04d3d9687aa0e95ff361c88f77bfa059f0d871b345b48ef49a6d5d770a8d97a13cb72351caaff8724a9b6663d69383a598b1e47f744d368389e9c2f597e7cce70109521449b6ff7189d828d6d88fb4d97e1f02396e7df6c93e128c532472a87cfb163c67010529658fa8d21846dc4701055634d8b59c2701cf9630e995a51fa5c301c556d76c6fbf40b079e5f2155bea07179f4c271ce8edf3bf18d1463178e92776b97c620178e63929e84e0aff6f56de138e9869c5a96da9c4e0b073962ea31454ebc3a0b471d3fe7ce28dff063e150f7ef6388664c86af7018f3fca4a5f859216c5638923cea9fc43f5d3aabc2d1cba46c39db4585c30b979496f348b6650a87f17ccfea3629901937d5870945e1305665bd4908b9734628e0841a50387c996c91ba50952dfe84a3b4f927ac63f4387e3be1205d45f65fda84a398653ae387dc92ae64c2519a14d613a992a6c8985063093594709c26bd496cdef06076128e572c5744434d420d241cdb2593e91021644ccc165b24a2c6110e63ec7d798e560d775da00b320c03b6c4302368400d231c77089751e4bb752fa70ba5d43dd4284241f466f334590a11ea820cd3450b6a10e15872bbf94f495d1c2ec8f0130618554609260001f7620c0c44a2c6108e72689e48aa1217ca2c01185c7c185c143ac0058c12033584701442a4d8926123d49b65841a413888b8f296d3e7f89714a10610acc60f0eff33f5e674d91a3e386c0b9749222da446df838308d1a7245894681b91e145a3c07970fc9f4683a7a9608451480335767064725927fad96a7661400d1d1cba46f0b8f96fc64732bc80805aa0460e8eafbb64ffd3f8565d5c5081c01c206be0e070b4c76cc257ba02030b2003015720e08a11340746d0284841d4b8c181ce861863746517ff9830be98000afc9049a0860d8e7ace3dbc2f6ae6e732d4a8c161ef7eeeff7618dfc5508306879a73d8c8fb35166acce0306454d1ef490acaa0420d19d488c1d1fbff7a923ca163c8156ac0e030e7c64af91023776a6bbce02845d98a7ad9a328d470c15143889938217a1446185d70e15f1c2faae440a31587dba6e19b4429d060c561be3e310f32792d3a739153a0b18a2389902d87c47fb8185d8181055c81802fbe30c01508b8e20a045c81802baec00004ae3842484315871f646d5435dead30cae0a2d8a1918a833edb7429345071d449ed3f367ec4c5fa1487973729f227e7943c6c8ae38db1a93ba5e9d130699482a49f3727cd9e1447616f8fe2e8628adc985b3e8b4514071be347a59a90fca2a1388c1cd594f2098a0309414270a9a0f1beffc461e7f348df515e040d4f1cda9bcd67080ffa7e278e34e588bf5f9d1307994322cb8d9b380e9e36e25dcaf915714d1c74b6f20ddbcf1cda4c1cc4ac9c72a2b59321260e2fce7aa60e5eea1f305c0c329006342e719031db8ab4b744eb8e250e5c35f7c7958694a3af5860d0a8c4816feb670c6f97824d8963d50916ae159244a52771acc973db54a42571bc7677a3295f6c951c89e30abf7142b6061247a7bf633753f5ee96471c6807b949a92cd5cae28803cb9f53af4efa5fcf36e2302f3674b46b95ad282390eff8f198451cf465b01c62bbac2355c451468a41b3dde59a9f88e32f8bca2013f31f4e44f02f751bf25e52e81007d933cbdde6d21007f9537db3536fd9948538ca29499d7e4a65a424c461ca8c7fd13e9645080771bcb7ba6a84be4b3182388cba4bb9914b547302711c1b2e4be53be2d20788c38d512da79918d467fbc3b1f8f7e68743b50ae9672e75f0b90f59fda64cf3e148e2be47ce3a27c37b388cf163a755ce33cdea81d2ac88112d9bc46e694b6331735a5a1a7938e84acb1ce2e3e6070f87dfd17edfbcc35168ff878ef1d9e1287f287dddb0ea70909eb94bf32ceee5890e8733229f65253a334c7338885e4992c3a1c65deafafbbb55e370e85ffbea9e63789e70388a8be1a266fd247fc38124af0ad3792923e786c36ce956a3d47957aa0dc777933b9494ae278974a1f485e93020a054be30ce001a6c3890dc2ab5b85149048d351c656edbee564abf9e622168a8e150a26f5f6ba64d1992693894ba370f99fdeb316d1034d070947749c25dd4dc8c92331c5a081312566e62de6a82a06186630b952a345f321a65384ae9589241da527fa0418623cdb952c8e0395b9e681f688ce1d83ebce4fcb3c470e861f795c9a3bb028d301c7a4c92942bfe5c555f78a00186c3b8e43b9dd2e6b8b5d41d687ce1502e877cfa59a33d5776a0e18523e9918ff943a206ff74e128c7f1e95c325924d24fa0c185e3d6c9dd1472660b473ddbb17b1a936c8c160e7cc2aa9b84350dab6864e1e0ab53be0db92c5838b2948a663d10685ce1e07273ecbcf217e5fa20d0b0c251d4df6b5ee9b0b81df5018d2a1cbef8a7b55cb129c5910a47e923319bc685b4eb7e40630a07e36eedb26d569a39522858bcceba3505ff08b562ec237b1c717cbf9f5dd45463da4e2308d1e5b2456eef9411c739c4cd9c38d71666594466771b36deefa688239b75b9fa34713c3e8697e105f9175cc89045228e275d67c7bd8f88e3b0103153f38738f0778fc1ae2b346537c4b1e7f1b8a7655196ff421c76ca7c9fe28734e631843898f73c57cbd11f561bc4a1ca464e2e270ae2b86b375eccf96ee90fc441dc1ce2a5a496cb920b88c309f1b7f442f787030d2512266462852cfc70f4912466f1cd92b61c15b2e8c36148e4d13c9bda436f3e1c5584cb6f2bf71e8e538c9242f9c5cb1c347a3872ebb1903bce29649187e3ca95cb37a7c6c9f778f823733e79cf8fef70d019b723a2f67638d45039bfa4742e3ca70e66d188fa91f2fad0e13866afc55c58f988f21cb424933fe74a9d28a21c7e491d267b860e9a389839ef62957e957587c371c886247759bee1307b947c51f5fce9a31b8e6d4279e6a9fbce93e342c590451b8e534cb66dbaa1e3f767c351fd5d48db4b9765fb1a8edc83a678baf799425c0d0753c942cadc95341c7bad680e9573f6b48986a3902168b29043fb3b7886c3087957aa524e91309917b230c3f1b807c949e2a9bde4cb7094f62fc242eb64384e1b2d660d97c770f479727ebb8488b7ba9085180e4ca34506cdffba97301c780833daf9413786070cc731c678ddf3ec41f2fec2e159dbe518c3b5536cc43023302164e1858378b1226972dcc686d403ae40c015b4852cba508aca87fe5c20ad66e58466cb6f61119da4160e5a15c92f5976784e16e8ce326bf5c1c293653d7c0849f2397d857334a70f5f5b414b8b1b1727882797ab80578e4125eba496af50c1168f199ffad2296471e42fcb7bfe4b2a852ca290c6c4f821426558a0c09d4b2e9f1c29f3e6134ad2154542e54caba1135eb58939b2c7bc3781e8f3e830010b51c29c47ffc92de1e80fb7c430114812c38c8050164ae824f24892a425d62661496732f3a97a4124f0ffd2b9ad53ecacfe0887fe9e7e26669d560c3302338215c483844a112a8dcde9adf3d7f94984e3d7dc1de2f93f0462ded3fa678cb13f11c2d1e5e4312dfa6948bf8390471ccfffe7934b201c44ee78994359d0989a1f1c73ce88ef1f363e8961a8c43023301464e183c310c627e374787e64c53011200ac8a2078719dca6d345b4f5869590050f0e4b935f8e1ae39f67548e90c50e8ec542dd7da4570707215d57ec85c866b63938b4ac97cc36d13f5f2c0b1c1c59eead8cadac7fa96f5017c8c206c712f383060db211b2a8c171f0bd903b711331d9343890dccc9a1dc52c66703819a12e6ad6d07b1bf1200b191ce5a8a9623e5fd765450259c4e0f03b3e46d2e225ef1f06ae86883291f80b8ef642c6780b1ed43d59b8e0f8e24588776561333cad38ae38ee12be66561c78da7b8fd7cd2a0e3504ef934d2b1131ab8a239df8254923a74fd6a6e238438694ac3e7bbf43541c8a465df5cf8bf7f24e71641df675ab62a638a8ce52d1f98feb77290e5a3a4e72d25ef20d290e4354e7d2ae7f6a1cc5f17f8d864b88f4ae4a14c7929b5fdb326e6ea62b104043d808c5d1e67b08dd8f31467fdc8b313000840d501c7af6e99308fb13c75eb9c23544d0f27cf1c451862db795b93a71f439447db0c189a35c21438b474ac815c1266c6c02f7ae1a8d6d399a3848371fb7fc6236327174ff5e1f721213ce6d7fcc921aa15ee2482da3dadd9f77e66f894f633d4f5e34a5b21207617b5248ad6da93713c30625485e492ba668967a0e9527c58e21ae863cd898c471cd848b6e1ddea96a0afc0144071b9238cee4f312237754c4c546240e424e9d57622c4d529e0bac2b30b000481cc4ec9273bc30dd73b90b2511981194016c3ce23842497fc4297dadc9011b8e403c6d46cc2a13361a4165c48edc9a236c30828a9418c26511476ddbd44abf4cd8091b8a38482d757f9d92a55bab0b2531cc09c8e0028c30d49ce002604ca0c060231187a9233605cf253f1e93820d441c7988202924d94fdfb00ba5431c7587b7f31cdd5b47c086218ee3b6db59f478751eed08360a716463a92b5134edbc49888388c1628fe5fafc772645606310074136e78a5e9f0c22f7628c32ca86200ebba2b337ed53cfe60371a8fa7d15af9b2ecd03c4f1988fe69c6270bb0f75a104c6182528c3c7e0028ce7620464981370e165981d60e30fc779bb32e49430ca00c38b30ca00a30108d8f0c3d16bafc686cc9a3378fa709cd672fcbcb27615637c38d670ad1f5d2112427e0fc75145fa639818212bb8a18783f81a215351fa537784aa4660ee6394c19887a3b0d7f119c52585d137f0702813c532e7247a33dee1e8ca5228f95f759d330a1b7638bcad482100034fd8a8c361e5930b66b7d77e5117ba4107fd62630e1b72b88d387c71f597434cb30b2513b805b6d8c2043e86d118658831870d381c24bbd408db1095dfe5c2bb68d36294800b118411c6175a812b10700504aec000040a895102118411c61769828d371ca54edf99899812c3e586a3149952c7b451fdd8461b8ea5e29378c4deb8e0b3e1f0fd6f3eba2ba6edb2b186a388d6f1acd06d194236d4709cb62a67cf29de85d2175f983e301450b491860d341c6fca1db5245ffd59772c60812db6d8620b0bb802ba28c38b0d7c613c015b6c7126810e701180196c9ce15036a6cbeb36792a8e8a880d331cd5879e44fb66888d3294a2aba628eb621c36c870541937e4c771af6c5a17aa63d818c351dffac776486c9ca87a61430c59a7541eb9c984c446188e2bbfe65ec9e1dad906c371089735c49bd8ecb869c4c617dcfa9a49d974ae0d2f1cd9495db089af8b3407b1d185032bff9c75593136b87014d264ab562b4d39c7c3b0b18503f7aa0c1bd2ffe306b9d0f262430b47be53ad1acfe25accc828c3c9e0820c343248b09185839c5233d3354264cbf062045e7ca1b58185a36c17f364fdcd9ec7eb42e9ca031b5738d2368d3ea562bb096cc30a47551e652d2419f53a27b05185e3cd1bff2a567bac3418a60c2f38c130c00615a83eb031850d6c48e120ccbd6fc4f5603617ae022fcaf0020c4346148ee44c3ba4a5c66ab31cd880c2517a5bcbb0b5cb30031b4f38b6904a8be2fe86138ed3e4911d17b509c729a55e464846974d02b1c184a30ed1b9db431e09f737967070c15add50027935b5f744e1b09184a394db35a5a26a3e6d01400b1b48380c2106d9cd6f4f175d0f1b4738ec2f0f71f1b42b1070870d231c7d8ed48cd9381d368a706cd123b5a37bae4bd15d010db0336c10e1f82f8c26877094e34f2cf9ae741aa7f2c186100eea3359ca60317c8535061b4138f61ad3c8da6631edd38552d960030847d52126fc4d48b0bc651a367e7078d9d61f924dd20c1b3e38966a5f95b6b4d29ceac1f1a66c716f721e1c58f0105541f42be244c3c60e0ee4b54227fee965fd75908464912ebb3595612307075ddf9b2df9e85dcce3e0705266518f7a51bb3b17366e70a4f9e4375feb4362b4850d1b1c746af0d9beb58b8d1a1c7b4feadf90950d1a1ce4dad98e91f62b8278c0702eaa9eb03183a3241772eac91ba38538b61c430e218e3a4eda85dc64d43f8823cf9f5ff553942cad200efd23547bee609d6a208e73b28fb9b2dc144a401ce67b8e78baf51fb60f1ef5c371bd9b59a69cb69ee43e1caaac078d9af626850f473219d2e9bc8847b8ece1b057eb5752c6ca13d74376bdf1e38770f3706c1722a9a7440c77119455bb09480402c0c391590af183d84e5c8adee120445cf675b57bf4b4c3e16699d998d4cf8dc13a1c764af5a73e221d0eef35cd4d67a227787338ced9fec37c7c64b9981c8e45fd4dba2bc7b0d4e270686a2eed49f33eda0587a3b594ce2ac525b8586f38c81432bf3dab7ffcca0d47fa90192278d586434fbfbe9afe39569c0dc72e6979d3b3e9fabc868348b969530c799962d4701c63f927a6cfaba7a4e128a864eb56b4447b091a8e3dc5599c8de8caea194a618200cc709452a9955de7feb05418045086a36097e29ee5dc8200c870902eab64ffa8ceadfe188eb3b52d623369cee28b21552080301c4b444fda49ddd6b407c3e17ef6982a13c2bec7bf7014736b887d1173b4b8170e2e3fdbef8b65cf90d385a30da51d3af675a4ce85239d57179fec9683d85b3808d1abfa43b01444d7c2412e0f1ffae349eb270b07e313536889aeeb2c168e3fa5ed226b854ce6150e83dc869853c888b9d80a073b315b16cf3199dda60a07eff37eb91e2a1c47ae98e52a2667a9a770a096b25ca572799d8b14b82080281c581e0bf36351a2d20285a3b4ae0cba339fb5ef138e3cd7d4bf7deb84839a3bcf8aec1b35679b70e89a1e524f3e091a2f130e3fb56a5287bc90769770147453ecb3144ff351251ccccf47b08e7d351d4dc2b17e65bdd67c22e120633d44ccf811729347384e9ea142e6b3f89da6110e425fc6a9cf482f5f16e16832b28789cb20d913e1783a582c8b380ee1b862e8aca9b2536c8b42384c563a9ef3e618a1c4201ced5e8b450c9a5e3404c271ae54f937e33f380c1d3359be5c2652fbe038e44ebf8926f3d7ac0747e79a576f26e647cd8343b7b218521ae66da91d1cc56e468b3f9621d93a38eef0f09250520e8e2d86692f7bedc9530802c0c171a57ccb46caf9463b3738d4ed4c7e29c4c9b2c906c7b1eabd6b9f1a1c8418fb556f7e1317018200687090c7375dda28ff1f9dc191c549cb46f60290c1c16a6cac4a91211db900627050377a393f2adbd72d00181c9ccb84dc506962620be00587924e3d7d9ad5bc712300171cdf7ec76b780a6e49d38a83db942e0679d9bcf9c28a834f51c6e723969ba9ab384e1b61f935a93b7a5015c72a16eeb2bfef44c3541cd8ece578e3f23bf9a1e228cb974c083dfa397ca73814d1f87eb14d71ac11733e64d5965aad1447e173ae7c0f51f972487190ab6343c59da5d0d5288ec7c2697e96f0db5e140731c753ca1fde452d148a43df9c8e6f313ae74d7ea005288e3b494599b8b93b4bffc4714cfb9669d1633eed78e2d8436593ebb5c65ba71307314c9af5b49f2288cd89c398dfa6fcf4673ed59b388ea32986060f6d31c89a3848b1c2f52c993892d048a9f9ee7dcf60e2d852fa2037f21337572e712c9f247464a994435c4b1c7affbb9ea85ad48a56e2404265980c7195a6494a1c86d49e2c6e0527716ce13d224e779238f233d3ca5e31a2a72271181b2ad9c7ce49b3a4207160dda2f351723add896af188438b5d5dc9fa71c4f1a48a714f377948921b712439cc6f366fa6998611471a3ec2f2878b38cc15e1a288a3a82771c3b78938cc39d23a37aca6fb1511871d72df6396aaaf8c1ee2a083df5bddd746c8a4218e6225c9187a8285380adda89dd112296f23c4c1e888c479ea920dd9204892ece7553b411c7d0e1ab59348758654200eec36dcec66251f0f01e238b537766eaecdceffe1c077f32685ad9b684925410b3f1c49dd5897c7b40beff7e120236c48be7af3e13866b1b1d6eddff89c3d1c8a4d8c9c7252b2183b7a38e89832417bdf2e375ae4e17066433a06cbe0e1208799feb9206935297738ae12ed942f2475623b1c76b0fe984919cb531d8e2356d60afa6d5d214987a32449e72a559cc3d159b4f42159ab679a1c8a4921c76474ffd20f681187a370c12f66cb294fc6eb085ac0416fd79435ff063bb3d747f4dda0c8c67aeadbb0b998f8ffce865bcfc42d89e5ec6b3827a64aa49025e36a30f676ae054f73f134e8298c7464d2d1e04f84fc92f3331ca8e56fe690c1a26d6e062a4f7542fd46b14f194e77cdec519d31870cc6892198e668318627b45ecbcc7f3d5a88c1aa30b739a7b71661b0bc27c6b9c140dabb87103e97fd052605cf0f963eadec0566f4829ee4cc1d2b77817c5b1d4fe6029e2c34f4cae9c95b28f684c7c9d0295f8cb5405cb5eb94fa353fe12c50626146cbe5eb7d838533478c61b3588ef93657387cd287b9e8b2adc08ae4f5b61039e4520564d52ee9bcd5cd4b05de6c3eee8674b92964b6f9d22fd8064b490199a45b9a3da4c46811854c23c7be58f8bf40a134edda3d398dfd5c9eb0db6d8cd709e734217872abe8952d4d30a56fab182ca6a58509e6644d87a73c31e525102635f59d9c89ac0422866db647db3c4d12f8efd8bfe322e1b0b3657a8ece123a5c2eb438c2eea17eed3ba56e8df077f028d94263cad416c1149235fee7ddd410216dcbee901cc1552d8670b23c8f3abef1a91642e8642e5ebeec99522d8270e65f8a9de4b6974e2d8070be8f97e47e67ffc0ac9a318ace87257d60e467448f75d7f6608921578ca6163cb073a76a3f679a9fa9c50eeebc4e99f37265a9850e9cb9b09d69e6c0eae41d9752750707c565d590df6dbcc11943cab72c0bdaa0d457e639895ad4e0304b56aa129e29895ad0e04b3a3197e6fe0effb498c19d431aed8976f5692183f29cba8ee5dfbdcd6911032ab746c829e197725ac0e014726589ea1452ac9c162f58626e4ebca22e8ba7850b4aaf3fbf89edd7b5c2d515950a413656d86f397a8cda2a0e5fb319b3dcfc97a68a46bcd24f07cd525108a94c156e6f2164a83035697a0c6143f7750a6fbcdb93ca8598e3650a33c74497938aea54299a1416e3666bcd96278569b329fd37add38fc264f1bcd24417855f975dc59365fa864291ffe4cbaccde58282cad50c5149f737fc04122b5d33ed7d4e21e4896f7ddf6b346f759d784fbd53facee939e1a4fbaed59ba0ef43dbc284945813c6e011424c33b1578a9b4298206d8c692e52c72f4188398748cf1294b44bba50258c6351f53743c948082576fbf288eafbb1f2320926ce44952d092ae73dcf712b7fa81909e37e3edda56472fe42e23869ae46c81334b41a8aeda8440ea70279301689c4e16040144861e171015314000000001414862281402c4b637df601148003512a1a3e2c2a141e1c0e121414121e100643616060201083c26050200c0803c221713132c5d503dd27811ecad464223f1da44db89bf03621e5089b6644bbc918837db09376505c91b648237866b0a960e9e03461135bf52dc29a34c8014f20171c2cd79c5ccfd2fae43303c2d22332e29cfc75303abdf04a0dfe0cce518315c246d807d380646066d0c120dfa09a816707fbe20c1521e18165091c27e449f0baf91168056a14d2ef517f27a0c79e37a55664b352fdc6d127d02f59c5518aa7142605b74ea93a9d3401dbc3a3a68ec89cb6701a9b91d74909bc2f4a48bc0987828112a23767da76e06fd2a7546fdf58bb21efd36fcde3bc95476f1039b82a685916490e045c656d3d0cbc2438340037aef9a856cb303e38336f70f6c02f827d071f08181ca824bc9a1043421a42aa81871f6c1e2ac9190d4d98414658e1a0bca6b7ec2143dbc6257b83f95a7c03c57530b909e26029379031b83760668035b822837d26a180c1cf8096c1d9e0f541924f1873b2f397c4da80cdc06070f50d263b4ed6c18c09ec08ea1f182108767023844dcc776b50fdc1a6657847ec5c2701200864ba64d9933823c844ca4194f186f100c68ee863fffc59ffdbfe0aff8b7e220009c078806e805e808c00fe131038aef12ea9080416d017b8362046a02d004ca31c3207bbaa1e6c1e101ee41ec11efefd637b5e887a8d21d2eaa1e861e4e1c9e34e1fa7c849c626351fef106447e9f18318e4018fd33f332b9accf120492569abe8e407bfcffe64973a8ad51448a510093770dba2162209f766cdfa23ee46a8f893f2919ef2518450f853b8d90a7079ca195b5294539c73c59f901455dbb120a5185c61660b117e70cc28702436153e0c200e619f05076eeae11744a488f0aa62f769ca46756f8b10a28db869e25302a61120856db1af0c02a48e8801f457dac41adc94b3b6529de4c17ea1b9922c3710101ef9938520e9e8eeefb9841465976d8d91eef24c1384a6645ef5e7a8a3a3f0e3cf48a4d16d703fa5a2c2f9d0e187dbe7e6decbfa714f730115f7686937cf4d8ae307a63e4d6dd0fd6cd9811f2d5264f634cd52d59f71e58d9313f3c2d5ba10bd9b0cb294671ad99be1aef8f27b3b2b83b1cf21ca9fd5f776054bf9b7dab508ea3bf45a5326092e26ee24fcd06109126b777f7552e9edbc5ea5e615aab5afb0badf3b5908219e4c8ee04b24e84e7ed72d7a1802b9996490dc2f59e5052ecb93494c12ec2e7700a5d558493808b37596dea30a74b96219bd170ab05aad9ae07590fef17c49d99567a4b6eaeadbc46bb4b58f2ee3e7fda11372933b515ac8be15cbec3e565bd3ce2507c481dffb5dc9758e82f74946f2c34863162375eceaf1fc5dc9e127b49fbc3fee17b9cf4c72bd0b26f01aa2c02f6931fc0899594f1aa9721cc124a941dcbb87faddc8e8d34bdd9b274ee9ea31aa473e81dfb0bbfd76ee1d16cee38e6325008a9c6ca2c74a1795139abe71e0d6890753c9cf6d92f6ecd8d4c46f4c5381737779c208cd219a422e6e2a5769c9a72b84c46da759c2a180e3fd4774756038896e236ab5637843f323f97df09fdf032fddfa2beffa4d248d7e37e3994de1f657a92aff65d7dbd7f34befd7bbc89b16ee79259fda4ac9e883d41d2e5b19f7e58e7ac9b10eefd041cf6719cf67b68d1332ee51439d87c0527a3fb8ca37801ecff1c6d6f2b9fb64cc641535cbc3c0a8fb49a111b74a2cc7a24cf60ecf3a68b795e96cf6915b41d621fa3d893f8e5f001da51187b51101f7808a581d22946a6f2901bd16804f4a1368529766b6f5a15779df16f7fa1c50578bde9910ae397ee16afeb241bcbca2f340bbaad7571c07262dc598c1b1e712cae5a5f593c8ff390e9071a7365e7a60ced4cb0b3f8b5d240d9757857fb4cc8cad00dd5a589dd7849a6ea10b28559bcf44331885d550587a71245c29d293b740303a31ade02ba5e367bbd73dce3aca60e4be3a3ab6c4b3b601c0113913e37ae7799e4fdad080d37488a0d1ddb8f69cd2e11ae160b42b65fc77e9726b1c82f1c327dbc7b7f87cc8742940203ef93e56fbdc8e0bba11465855168a01401edbde726381707b6c90098a27421e5bb004a18989f43fd18c481deb706837e1300d1dce765fd09b1e97262aabfd470ee12edc4c4bd091bd44618e9fc083a1cc5cb4c64a487085516390502d0aa0b0c35b2b975f331d52fd635f1a3a0d28954812a48bbd6c1b790919c6d0be6110fde1ae09a8bf42fcbf0e6745cc200a00878f0d4f85c6d82a983e24db7bac0ce8cc20f7f1a6413f5c353ccd22e6e0bb1b093326f2b76c1abb0cf2d077841abd0a11622305c3e88ae2afac8681940fc8d1e3b93428d0f860b6730ae026fb2508d3292a279edf4c3432a3379e4de856262cbe5a92386e499bd0dd9346c5e5013d41c20a54dc3edd423afa6c6b3f90b5e14517ab172bd6b7ce0c92740c41ce09a2661d64238542c267de48c5d8e16fd6c77dd4c434b644b08d0ca41f2f6160a99f84a9173aad59328ed18a7865b67b4093a49f93c776e758e6681024d4c196d13d4bf478d459b1546d6d3eb97fd3f84cccd55878c55c445b956918bdf068403366118861740197a832f57338d8c719bc188d596c009d5635871418c704a5a6ca00622ce610c90f4a213a01e848fdaa8991443e6f69dccbce6afa502f3d9271da449127959b25c6b161db1fd9ad4d2026f776aef0a5ef5a2a32a1c579af3ad85c6069109cd5cbe4c7f0ef15ea8bf4b8bcad720df2ac2eab5a43973fbdf9accb66d8bf6c7543c56c63420dcac4a58761815382cc091c8d5f156bf3048069f8177c1581146110c10fe1992600d4610ada589560c0c2370bfa0aaf113831d3f31890f290398f58ba0bc92b33de29035700cb5fb4d0ef66dac0252c2ed8e1a84e62d8df365dc0da7fc8fe85e7c6f64fe97f01fdd58b41fc6e59ff0302704a7e6d91048032a95028e81a4e9085959b03b74a6fc81f0ef4f460f388980d17149c4f99612f8a00cb10bc50898d9da235c07a5131242e6ca3e0b08f2e6166704f1fc477d463210fa4c909231d62c92c5821c57c157504e3d5436e2b9de0f1889cf68eb6c2a225cc6699044fab221f8fa75e219d545199aaf515c6d4a5ee12447f7aaa80143b51d4f01ff622a2d4af5bf20eb2fda988e25d2260d8314e5eae625e8d331b5bf7383a5135b6e09cf45c9835a3f3bccdf59fe9b35eadb13e1dcdb6653b4d9a94008842458d40f8e0dcf8446f4ff51ed07490bc047df61f5af3834ad28c6001afa4f62cc2169f8f053dd088da2760099cb9a1daa11c1f299f386725c2821b538aa02c657a346e259c60851d08a7c59d739e098ab8813a1436de750253df2ca4381cd60812eebf332cb7afccaa3e1284aa36c2a3b34f06614fda8fae05f568795a9378e31e9b274d40257c66d91d44a1f3e474bc00a0dcca899795c165f0921842a63937cc355526c78b06b10f5f2c17828acbd8296ff346606ac3808de57b8b3b62920c1cb71fbe8433f4a5a51976f78efa109a645fcdd04bffd17c04c31e638095295dd80457144c3adb9104ace2400896e813f27a2352f4c809fa5f458e4edd0601ea1dca3226202f0d628410774d66c426f217a48033d7a858bbc408319c35889f963acd33c6a7d1f213c079fdda76d30bb0e60e2691640b2ea708006413252dfb896b17403ca512394b0054d43f60254605e547e1e33f35d5edcee8f2eb4a81b7c45007872ea944eb5ebb12ae238dd0bac42380372b0cb59edefa12878cb091ad584a54bc12420778d9dd5836c8c485eca46f917c110a57760c3a1627aa1dda02d67d604972cf1ab771123311e80a1803b5de1b6b67536cf7ff4cba8ab4150254255c52cff51475aa03ec11b232cc686e7aba3cf5889e91f0ff29d847d52968fe6f81650828da4590d5bad1c9dddeadb786529d6108ae2f28e51284a1c0675b52994cc2e6987f014bf22fd5200655713e267463a371af5c5e7c8594f4b251c431a0cec258aa1dc4e63ec2d281693fc76973229837cab2aebe61d0cfcb322e65238cda88278322a67c954f06ec413c256ddef1e928ebf0319f046d1b0c43ee3c256f16d0822a1291880c8098b8f735895aa42c4badc0004aae48ca6b45f2001bd5e4cc3f7ea130f42d8f243502c62b02396ce759e272ee60c189c0c1aed80a36ae3c21778e3f07c8ab3db012538a894d5332b3ade3f7735415a5827afb2063b79624ea56e56e925cf7f80abe5bdeca6333bbdb10cdc9056d588b15e85490c869be8ea12a38ec0fd1cb87eb98b8ef3e76c15733a144326fbc8d412efe284b91c1b86f217627d2d0d9865606cda32bed71abb95d41e8992ee4e44d5c754b90a671701c00a45be2cb36c24a4eb95e48976332a56f1401f59a1b90712e9d9c039bb1a9805e1151dc55b97806f127c1092566578c3fd82b5f4578c1eaacfb52807a42836e86f38728abe82c2e3ed576d62a29908a353492b1c4c98e599b08e8d80b02c7e538e73e6319fe593f02975677870e5665485595ca0f6ee48d14c9e2333a6d50c989daeba0e80e03ccae9d2d0cc6a45aacea04a0982c485af5aa40a42c2f1e1758606694d39cdc504404064185fc16157b5326eb911827f41d7d9c6078c3b8723c657c9b5580c13169798871dc8cab07026dd65dcdafa36920192c5941c4507ac977d5a062e147b5a39fc502defe9fb049ca45e749d3093b95a4c14f6a3984da382fc0b7ee5c3c605f0bc4760aa80e3f9661e02700892590c5948106357d5fef4d55fc3830e518f1a6c7ad8c95953567e49fd23ab61e4e1f2c3e6b424c2404f95dcc39be5b25f81e0db5cdfe6aea333891b71a79f26956d5d83ef12fd04733829084258ac78f533c28ee80a0e2b3d4b94cd940e319292f1e06596feee67bfdd49cfa855428f6831ff20e4553a7f58d446b6c5d9cfdeb219428b4455196ecc5620142fcde9aa518316dc458256768e6e099e988ec075eec9f88bb8f3cef5bc594614cd6247b52c1b82b4fc25aac7479430fab9f8bccf0337582730510b7b8b469a54d1b6b347593acb391dc0fc493feedec1033482544641db7f7092a678a8469ce2895e8e0a352ae6eb81b23c51ee3f9ecc10b2f224bb8215d78bd799b2274a693d377da9fc52a1f80200ba6928c8fde84b4152ac792688d833b5a5052ebfaa15deca2a67a270881adb166a30ade07bb55239ebe5f0eb0c1e4a3f02a598dfb58f74b09f8399689346b9fb5c18b4bfa96756925c2665d35de089713dc7018adc788881a7c4b1033a2d24b6bee7ecf91fe829a0410e80bb48f2230d1b801b6360ca4eb88721918c8d0251dc8cb99b4ad27055fac3e872d634cafbf87afbb13e3e0923df632f968f58b60d8c9fc0c3707c6942123c0f87e3f4c8bc54760ab694701bb85a914334cb9a368b8baa9bd047af4c36a5ff154020f966688fed0d7a65737993553b59c0947edcb880374c9e1b972870efd733e65dce1329ce9a262a90307c592b0f2ebed554bbeabb3d994ac6f6c506b368b4b0c564a307d85a829231624060300f53ea0cdbc12ac53c7412cfdf08e07c4f367ed79f59f8f5e86a8c6d3f6e64b1641defa0e7854a42e8064fddcade5ac89ce6be386decdb7f790d823569fa985493be0ab5c122a4490eb249b5abef836a6440db64b82cb478e2747da7694ddd7209c7810fcf214ad4a74bb1fe939d4d18fd846c604f65674bba2a32d4a04129b1f87f6dd734ec393dfaf717ba9f97e403363d7736d7dd4640ac4fba7c0ccf2ec2c81ead9326e3ddb7a943a0bb0288cd9dcdac90d11efb4e177b4bba2d27b6d4f415708961a6242b703696b73587eff434b7fa373be9f5f724a90aca72b4390ca8829478b40e54aa0c0bca18abf53f99acb17bc8009c3218f8fd28856c7cebf337a5033928201315652a7eeb88be8e72e59b582959b3d218b61a3416fe7d39e6e69c24a8f4538f512bdea90b45ad8361a341c6548936bc380e98e8a2f452bc5d2a1e2d60748dea2d155b0267a3c1e15c8682d08a601646bd9f32b4f7e37c35e5bfe8cda7b019b9037e9319944e1bbd12cf7ff62ddb100693d708f77ee7ad8e217d8bcdb21749ec41d15475602d06af27fdc50ce04a643d2411a9189b8a1b28cb4467c9b87de20362c820b567cb38dd8d49e57e9d8d2996b0be992096d604cf2e3c306667a97eb69d46b807466876ad96fa26cc3e3f7f7b2fb9c9339aaf00a85d6d1a6b7c98cb7bb621831216afeb009eb9cde0d5a447c6c797e4e3e0493121abf9ee60b0826a14bfc39d164e259c9a6137a133cc93549eb2511261540a23af6346e62275181240f35432c51d92fdef7a195e09eaada63496efac97af7d8d7c7fbccf89bdee203e1909411b28487d3294d8fe43121c54e12457abcefae9c087c1e561e3fc46389544a4e308f63f67847d6d49b20e3f1eb31cc1e23b9d4573324f4f0f6d8e58362109c917b90668fc6f26309f9575210f2111b2127334fa90290933a008be2db1ea73be36091dd406b34e9c27198cb486729d6b88a8da31d4735bda1412f8dd2b479ac882b4fa379736b1e9accce1c1dea27902944685554e1191811f70475497f26ddc7816395e388996b7f80279d651f836a68c9024a0983bb08f4309761ad01682ae2ba614b8683bf1ce9623f97516600d282d36db8d20f91b0940e1a4d6eb365c29824bb20ee6f2077f20f7e89f84304858c26d01ac57265cf3504467aa693081dd0c5fa9b557aa03a411c3eafc41b138a0c956ee4f188ae38c8816ffe2023a59d5c547165c3f2187ad35f845695a95a3b76374bb15ea26336bb40524c506d3a8e091405736f1b4f6f3ff7ce871071d7435711b78572e0524a9fec1dc469261e9cc54276a5466c3571fa14f6bbd1679d819dacd2db3fbc178e916dd07074b3fb23afcec126313973568d944fb152fe8d5d17760dcf0fa296af4f33eb4d676ade974e103192ce317c1aea447f165543be8ebc11179ccd222565ff03c2decf3a2725d62e1f0c529838d9a0bed5b1e79e9cf316a23b4b39c5f71110b41a568f45246d6393f70419725757a480319703f587707a1838754c22c258021605f19d8b8f39f171cf93caefc00d3cd249644959ed0f9af9408ab6d210ad5e543ba8a2c0777ce23f3b1898d0f20eaa8f7cd742dc46c0e91842963eb78ab9abfb972e36c9a3e58cd10a4ef9f96c3f88f4229b0ea1538e40f934c8a28ed66ad1423a1e01cc703686f8325823abc051cb364eb4cc192dfdc89bc8a6c365d1fe3f1efa61f2cd1f981802107d39fd912c234f056808a688eebad2002e85dfba2fb545b093c3a1284c15efc8d0d576d770b7a003eaab3683b77e2e8e8ba3811f85e1a560b41c59f1ac035090534284975bcb65a8fb2132f7ce6e02bf2ddf482fe4cd25611d60adae3fc78d8df4620b5ec14d3e07cdc0336da2b108154d91ac94c4678d0e23c1d399d32f73159f06137d6135fbd14b93788a2e1fb37266fadf75bff099a65da7231078b4c86f79994281578788a00902c215f467d7dc280e877cccc92f3378111fe64a46fbfcfb9ffa4eb5d2c8eebf3b646bbfe4f04feb2415eda1ee0a2590f81c6cf3b7e71d84c61cbe2341ce681d854cc68582b14df18bf789fb4eb175ecc1bc2305c6c076ac53bbb9ef6b531589dd6505b0ed2044af82e049bb04036875e93b90b5bacead9ab1ba79c69992d3c9804a8c7b9cd17a561a4c35fb106b160b8bcf0d5b9e4a872e0326ac41e636af0695d8f6a52ede33b312479a6876003e84ca706c677438172ec0f5c5f71eaca8e7b4ca0e3ee6ca6b51546b953effe36de0f6553a9cb20a9c2aaaa6d8252801f3efb884ff75c494ff40a9587bf0e9c177142a3b9c78044cd79370e8c4f8a21f26e72c70c8f9153adcc0ee988e2a0d3c985c7c0c3fd41cc589a52e36d8cf0ccc69602f3ad49f791f1381b29782dfc11d227771ce62b9cc468136be8eea633bc1b92e9c890541772b7a97de07c91c35c5100910ce52fbdd6900314a516b561c878ed1a222b890178c1a1d23525baf61aa14358aed1b695988ba955087ed67c55e5b672603b6399e8e2d5cf7247b065ac99d0ef64d441ab5c7c6cdaf2ca9f5e09a0410f2826056b1243b504798443d4916795395dca3d61d06fd0c72677f412b560560d8c0b870aa05e41fb43f4e79a4c59e2e50381be8e0cc42d95f564c9544fbe55ac43041da584e009dec7acd8cac89abc76971cbbdfbd858ee5d84f159087dfa00b44b6810d4bd1d119738bb8f00ee28cae74693b9e187a3b4cc9ad7442645992222dac213ccdba62a11171c95992f53e5048e30a9d18b74bcadbc1bca24906b62b08a9b0ba87cdd5ac1d8f6ad414a0ca6e6059456ad6909198cd020f06b0fc83963fa88cfd4c9fb01307f10e0837de74787db13b62fab28ea3021396f2f0787e2f5246dda4328c01f7cc2795541a79f02f971a40d89e68897a092487072eca84b46d251a510524b186b3c5e46d64a9bbee03fbb7df308613424c577dad82d9ad600720555b4d3b3629e2d4d7327ed0bb8e3d8e0470eb8666703cc42841de9191f2f6ab237d8471d028bcc76fc195400095e1b453c2a399c4599ad299497f2c96e172075916f40453300159a7d53a401908ae4c4bd14f1f21484a29afd9388cdadb8a75729ba110a89ed641ac02363fc533d59f1d31f242028e3b964d3395ff0400d294a53d9a95265e79c9a141ae695483bad43710dc15bc19a1139c08e17fbc3bbcfb29adc241414daf705230b8a592ae295225ab0a8c085b20181c8a4d0910c6752dd06b012a89728cf3564ea2fdf094fb8b289b2c61d93b504f5bb67c050fab294ef779d33e473d489ae462a0488c0bc0c8015afd5f707b7022359588547f5adea36c432542a9b29b3a52da93dff8264e58200bf9435d888e532adcbe000cb4e1af7e7c821bf53ac63e9e2728892747621f833c328ac884e4504e25a69da60c85428307709e38eefeb6e97023765955437acd6234c5db9d179fd28339154dc6be1cdce57c6e9109061c4a41cdd4d3f8355a40d87e63e5d0a52408fc07176b0d90e10a37473a258076d858120a77f8a4c59cca0182b475bb1f5573d463fae8ebe634e3e2c02d3c55983dde1100d13540f3dc31290bb31ecd2ceb1d8440730ccc8d9082bc7a7b1dcf441c0974b5811404c080a05122b0f1c8bd60f0094c2b6c41a6b1807a0cee304fe13a8dc6f8a90383805bd5fab9944d8178f9d9a8e743f68074560328ec8008182ad324a1cd4801ab844e0c4acf421c7120b013f9a1ac188643063e7a46081d5c6e8e61abd5a0daeb82975345bd959837375907dd1efb5bf955a57d3210f2c65688dc15321872aefac90733dd4a394b6de8008a082a50629cc343a77eff84ce76389e46dcf5cacc629dd4cb28fbfea41ff8553f7e481017c423c91e052d8f1c9833c93874e15223ab32eca3abe39292b34691203f87f3332f5fadd98876428b242b682305224cb43e438be0aeb6a43e59d7bc35bd6c6f1bd090b9cdb282e42ae0dced789384aa2d01dfcca3e1134fb09af7908a4f655492cd59800f4b319d627f2dc007717837654a985319fbe59063f8cc1a696ebddfc94f71d797332dc919a53e186471caf2ab80a4b1a1a534c23eddf6d9ebf2eede844eb809ba6391da3de765e41ba888ee68ec55e603dd554d4150ba54880903ef9a602512abc2ae1acb2ce81bd6cf983004cebdd15425734b987ba603593449a4d9e6c136593f2ca3f92692ae0a3a737798680255d264f3c5a9349204062298d59e7005ed49881eb7a8fdb225551910630b00993e8a2dbbdf98d5dd98f5127f36c25a03a9d38e83a8c0b6045b3aefb95b8fd87a80b84486e38d44a0752635734c6b50608220daef1cef4bc9a3c4ca66ea83475e79b1d367a1f05ea417000d8a97428bcde4758e3a21050500a3855a003330d44279eaf051753b6d823c57d3d62011ada10b144c8a1977181242b2cb5ccc92566ebbe8b36471283dc47239f0933b272354e1a818f903a4e7e663ac8b72a911da030a4fcf75cb641dbe8b7285dbc5b55fbec626432fab2f512d15dd99fd0f5fa6dca6f6610a4642fc4591cef01bb9dd3cd976d4092c4db8621776e9ceac44315f38ef006dd47580454c068546ae7a01ab5f9486a58b81eaad422ee97739db1bd02c97e6daef4c4a11f5b228382cab1adacecc4bc11d85e1a399d03f209ef056c37953429a70fb81192ac00ff0f24d40d282239e119d6c06cb14bb0eee758a341ebc4236593cc74e0a1e115d634e56b606c056049897b94afeb0b010eb3a53cdeebc0e08cf5765b111970f493b019432f94ffe7318266fa1adc147138385d52c137194f76f3fcbee4e160c691ba8f0734931a38800fab6ad12bbba14aa516fc03246682a85c095f1e24e51cccb9ca453a602cfb5b26df07796a8c7b1701f791da2011ee4c3b6a2650b266501d9ac389e300db9e19374319ad726a84f9ca885ddfea18e38cf18e6b306202ee1da226de0e9c38a507631125ddc76da756c86f14437cd7bab541514abee48d2868046ac3a3c1c28bd889aebc37e9420a8d59a64b635440ceb44cd19c7cb8bc47b0abcf30939085a2248e5a900d8bcae36c93d9db60fe1826a120ab81887faa9243069e65c4e7a1cb70ac245f714562448aab28c6d8ec9e17ed82675f00cef408094df71563ee1106f5132f55cb6e40cbee7cb3ee61b6171f5da1ea69a2ef7cb08ec70c7d78295578004ef0bb989107ae0c4746d36c2c6913d259393a7ed3b8c1f183119f5135a37791750a279c8c4ac46a7970958c631bbd3866d5d89d476f3964f375156de041987b68a08290834aa40c7b8a74efba82e416b0d653c9b0a034d8fc14881480d61a9fbeeca975831c345346475315395d3a0c8e2bfef4c2bfeb1512390d0fb7a80e7adbeb2904b20d2f64f89102e81749b80491a1ecdd0f1e46042dc23de92a80b0ac8bb4ec6bb11c1ab20c086ab5b4e7036f282b65028749c6915c6bb778811fbeb9295d5e17c24b94d8f32a14ce251456db1c0a865c52b8a6db97e70ee76b2eafd42cabf3fbf3dc30802cf75335b100151cc14dc0cbb97f26a05b24b40033027d8b17d1d088dccc4cc62642a7605d3dc87a9ea9dfd23b276e96a60fcd73ddaca3861f77a85bf4447b25c7d94752468ab2f23b9871e3044c826680d5abc3b4fc7d72019ced1881b61b4e5cd2123bd7fe384409e2dd99ded6f6b6ff6a141c7704773c03cf017130e3b7db3df62487024ab02d3d683ca1ba6b865a9f4368d6e52cf63e7d1fa0372ef6f9655499b227a7414f0ca3288612562450eadb4b5f73ba1e265796183113d2129a9f5186b2e12a1add7c94414a39a0208046b6022657ea9bcf666d20119b086dc4cbabaf53c9d24aa2fd0855b0157f6ff036f359505a4920187c472e284e2568db416d08a32ba4411f0c2a0d6c06530665060dd06019e76d4291c8db544c1c47027ab3c7953870b0a490033ccff33ccff33ccff33ccff3a4c3f82cfba2012ddd95528a4db68fe4787b654acacc94767bdbc079d6064ad6064ad6a2972c173709e90906096fe0c326d323471ee89987165e7091812e8c1714d0d098e105175f94175c7ce106b6534ef5c12aa859693092944ce9a21a6d604d2cb8a7450e11181c34d8c0a69021c71392639cd4a0b106bee3fc8e27a923a93466a0a80d1a6a60eabb3dd6b81e4f48510d0d4368a4818d93a38f8310a9e921ed002cb4c0a2015868810503b0d0028b056881850282a08106c6cf53a447f5719c7f730626c70fd94166df0c7c6aba8a761fe4fbc82e031329a525c494d52003935352ccf7749ec12391a03106cea326777f485911aa1134c46059842af15055c2d4ac2255cacd62843c41230cfc5a8ced71a74ad9dd6980818f2d66dfbb0857e30bbc57cce97b3babc5cf16687881cb39770e0f935b5dca7581cf7bbbd61c6a25cb6a704135b6c0648ad261ed66010d2d1440230ba581056e23e55b09d3c8a0710576928795be9f1558bdf590277fd4dfe4abc05fce1d586a123bcb9c0adc45d85360b3f92611894b810d096bcd9fa28792de28f039cc2a2cacda4e5b28701d713aac723c674f9fc07814f247e6b40fd45227709bde92fb2c47d13f4713b89052eccf2815426b90099c9f5fc668ab9cb20397c0789c2c91337d68a239257015e3aa98c476d1ac2581cbbe9f36b790c06ef4b05c9a5287f67df162bd660f6254b402533ed03002df31460e42ac4e4d993f81171ed0280223212de264ae602499e782043370031a44e03aaaa895e81c4a8e1c20d0180253961a429d94da4b15070d217063f91266fa0902d36b19b1376288521d2030b93b0e2d6a073d99343f60cf527f9e6ce271a5dd077ac78de91e7039aed4ae46b7acee20b325692fdbfe76c0474cf3131ff1d8a3e88049dd2959c8154cabb31c301e07cfaf29830356efa3f4216add80d58fa38af162fa38ac0919346cc0791c4808cf8e7f739c1ab041cc3d4ab569c077f6facd0f351d3e03b2a48f21dd960167395a58e8e6a89cc6800fdf835a87390d18301243446b115fc187fca11fc4ebb882cd4c3e2989755ac18a7a9c232973c7c80c2bc87457992fb7ba23cb2ab868d93e2a91510513246285942226154c5eda8fc33899f5f247051fe5ab3009effe08fd29d8d50f5d93987e4c216f0a7e3c2da492a6145c966c63712f6a5a4f0a2ee6b4a6a0e3be9a8f82c91dae1ba17151b0ed5178fee4f9f1a91e0abe3b4ae594afbca27450b079ee152d1dc729e4f04ff0d51bc72b6bee09deb5725b8365bae674825bebcb99030fb2959c60fb737bbcf3d1eecc2618ebeff8d2de45cfa109fe53c8d1744727afcf04275231bade8b09ce5f6332ddcfaa8a964b70191a52e2c7d3bd61b144eddbc927755482cfa167caea37091d4ab09fa9c3f1c9ae14b23209734eabe017edd62209c6efd6362ce47ec44482dbe49fb14a8704b9b732f75e86b6d21ec17e18729cdd2e7a67ba1dc146cccf412a9fa021ec4694cb03db3082cbb9357e54ef4bdb16c1a7e8bb2966f2b073d58ae0529969f568bd552611ec8464493a36bd8f5310c146aa37dd1c07a631b287e0aeec33846e0825a64f885721d89a541ea79a7d9021041fc79acf23c7ab299641f061ff5175fcf45d1541709f226f8e730776b90e049b5e242b8ab9f77800c28b1eff7ba8903bceffc0ea76da6f0f2f62877e60cd7255faf4d79a26da073e8a389aee23ca07c632794e31276b857e0f4cd77a1c5c4b3db09731628c7439b47f79e0d424ef8744120fe46fbefe0e7cea28e8e6702547530f3b70ebe1244bbf60d3c1a30e4c59e705f12cd281f1524ff9d133376a9c03e71de640cbbb445244b453485aaf9b348d033b113dbbc34ba96c85036f9562471dfb062e749821ba7854896ee062ce1135d7f48510b6810f2c6c22a2a71c438e0dfcf988f649c8ad8135ddd448193570a6db21b35a2cc24f0363532639da4c13394703ab99d3e4ffe50c7cb486142d5accc05df6b1fc8fcf2b65cbc07ecedb710739b41e910c5ca6945bc8098d971b03bf9252c8f6415f6a4f0cfcdf5977af785c71b230f0d92dc5ac223130f071d420751e4fa5b37c810b413fdac3d60b7cc6cca9c374163c8e76818ff2a6a5df8f3a8a8e0b4c87529ee3fa6d0b59effd65ebd8a6ed43165ae052a5fedbe4120d992c302107962262d6ebcb63814bf13abb459fdecd15184d592dfee6a59da4151889e943ad60f5517b5015f8968ec96d3799b9870adc6578dc2b8931477f0adc9dfe6aaccbdf624a81bff4f1a7f40995d19128b0b1a3a421fae4654879220b2870b93ab61452d6b37842b9bb52fe68cb7702d37963ca802c9ac0fa76fa7f4e31223aca043ed2a94e6fcd8a1d57592c815d095539deecc98ea612d8e492dd512445fdaf64649104ce76d52e4eec0f621324b0f93bb847c8e208dc5f55be4c6963842c8cc0df079ec314bf3645acad0a5914814dad51ee5ad61e1137296441042684fc5635d92395854360bb628a9cd683c7e88a10988c979d25a7b3eeffb20802539792393615089c76b9b9bba959fc80fd1ca68ff4e69162c7b3f0011f5d4e6cbd98b42fdd59f4808978c1a7efdd93651546d217db45163c602bcd3a6d6cff20f20641163be0ce52c78ab9b7534ae21647163ae03fafb62e65bde6f08491e4458ccc22074ce69f0ecfe3d8573d471638e07fdf626d86e4a5d11059dc808f7b16d473678a13a92c6c4054b4ffa05248481259d480d33ad7cecf9b43c762b5210b1af016a2071d07dd6731033e3c560bfe6927642103366acce1eaed7928a1958108862c62c0c791985bee847538b1222d64010377daacd202015ec1c7ef1f378b672a893e1908e00a2e7614c7243b8e6c528700ad209a076a79a304600513a1afd3add722301700030156c1c791d346adcd174d827d0201547179fb985ac81f74ba54b89b5a7cd3dfc355543c659ff2f8e7b39c428f5323e8e6ca080f9ac2fac83b996847da4b81c4dfeb0e2d52fcd61d27744671d03595923253145b08939cfc21e9070142f178243629766619014041d6209635887ef009f08973a8f92dfb3a9c009ee036af064d1fe49de04bafe3d4714e1781009ce0573d2f63ca994db0eeae5193c55f139c87a196c2c31c9607954cf0ad1695d42b68ed07135c8885b4a9332774d825f80f4d3c94456d096e3cfac8fe104d21a42bc17ef697d841524ab04943529446ec8bef31093e8e6e24244991041f4b08e581e46f971c4682f1142121da7290e0f5aea3b60949bb9c47b06192c3d3e28ee06388901ed75f62d01bc1c53efdd46d31fde3388ce03a8ace91379245709aff93dfa733d18d5104e7ad5f153dff89e0adae537e88b839fa23822f0d2179ff73dc9bfe0ad87d18b3638bc101ebf1df927f9c2db676033e69645d9e728d48d980094956398888c888718e08901af0ed71d8dd92e6620b2206101a64e5716c9e69191625a1d5313deccae36e4180cc80499f4b721ca88664c1560191019772b6e4a569315cc8c8c01724067c90f437d2f6ff91ad5d1018b0c1637806cb1c09621819f90ac42f4ef96f7eae735dc16d4a6f3ac61614d868c5e9b96e4368c998333092cc062bf86076b92ba5420a9d55e829aec65455f52055b091b276f49f1453f79f0a267ddecd96089a72082a38f33c0d9fca39051ff7b5d84a889c2998643b9e9fd293869c2635818d52f021eb7778e8231ef331ba40076c90828d34c9f996a38de9dd517029512f744ac1df1005d7977ddd1ff6c12d9711630bd3051724e8828b6bc0462898289b7897d5eb3fca4b1043c689c0023640c1c590a31ee975ccf11a01116c7c828df61d42c5ab2bf4054692118162910106601181126c7882c9d17bc4f3e9956fbbd1093e4aee61fbfd6f7082cb083fcfe9b1a224cf26f85ebfff2855721869a309d6735a0d2d95c17dcf04bf6d6621c92d5f678f09d63b2484e46b2fc14d8476983d5c2dc1c6ae8c394f5909fefe2a5fc78e1f2c623092483728416563122b898d48f05148d1723c966024998fd1c5160686b76b6820ba610312b8f108b6628896db6fa37d593547602945f4844a6321193166cc30ee2798a1a131c388806670a1c5db09b0c0a2d409ba58c17fd1245880864617e68b2f9a0487d00074b0d1083eae643ee9283bdad812206c30829fb2f47bafd7d7546e2c828ddf1b35f95fb08c16860b1919204590462298d4396bf2b8330779d31b8860438e5d24f190ad51da3804a2eb3975903bd61c2ed830041da5f56eb2bbacaf22700209244001860b191950da426c1082c996a349fe21e6d0df0c82d194bc7c697cf7c34bdd862098143f3454dade3f991b8160c34ae2f925cf6a4152850d40307ac9a34aabac9bbc0346d2a1a131e30b2e62880001303c86176cbaa0400962c858c005343434344cb923003dd8f80357514435e74c1da60fb561c30f6cafb77e678bc8d63f8ca453c1461fb2db8e4c91c2879154ac88a560830f4ceac89124ff405fa7930058c4c61e38f58faeb4fe96f4b9406ce881dbf8bd1da5102500017bd8c803174347297ee8f883d537026f1919d8c00397a33a24fb24a13a856670617407267f684dbf8bed512723c6162da3bd283b3092d7e369cad9e6d92d62fc151836eac087cad19ee39a426a195fc4882163b7b04107be434b478e6adbc717f35bc478abc2c61cb8ced6105457425e955fcce04204b421073e694fb68f42a4b011073e45a5f562a59aeabc1e62030eac77b01aefa8a284d878036f593f26e96e491e39dcc0a97e5a4d9bd8461b180b6a6945731cdb6003a31a39954f471fb6ea83d85803d359faaa3a871e5954037b2bf55d1ef77f760937d2c07674c83144f3f2b081065e542be4be1472f0c8fc62e30c4cb5875e8b7d8e60c30cdc2531b78b0ab96c7306067d9b06a4c04ca00b0a6868cc681965e0fdd38bbd78a051e22336c8904f7eff30cd0e46d23962630c4ceee817f3aa7d65de328c08ba8b2e810c456c8881296bb728355922453f0c7cac13928859469dfcda1536c0c06e8966ccbdee9672c70a1b5f603d98d64ef6d3f1b47a81b1249dfa2adb326c74818bb8314ae68e5f3a54480c1b5ce0e3dde4c7efd4ebfbd8021f49f5eae724f639da68815fbfb41b3c859fda071936b2c0b6684e08416c3c7f1e0b7cd83aeec9450fc3c61558577fd1f4493bec5f34dfb0025777a9a7c9537288b0031b556033bbc37c1d5a46c60b36a8c05a08b1ddc94f818f42b0c82147bdffcd772105265d787e60daaaf98e023be671981a3fac1834bd0105462f871d78dae6474fe0fbf2e8fe7a188ca4de1c6c3881cb1ee7acfaca8191d404be3b9eb416cb41dd5bc478acc10613b8cd4c192c7ecc3cd571022f96c04b7a45d718d3836cb0a104eecc43750f546b435ebe3022a0dac14612f81cb9474f9a238b1f76c048da220612f8e81fa7183bfb47963730928c8ec055e4f31c2bfbe7a7b8451731340318e8820216803a6c1881cdb4cbea619c72061b4560f5ed5f2d5b4cf6f16b5c8b2d627c31430b0d8d2fcc8c197d28e30b2f0410870d22d4c610f8da2f8fbcdae2a8df10026731599846d9871add185ecc3032b2021b41b00d20f0dbb5298690efc2cc38096cfc806fdd501d45b51b3eb08d1ef0fd1e065df5305275a3801b2f3090010c6cf080d31c6991e57e606307ec454afb30de8729c109669413cc381d3039f4a3686a5357d2c148ca015b1f35a6e6f8fa5b53b888f1050e38a910e36be7899e2b3732086560e30666fecbc6f0628b2fba7ac3065cde5ef39c4306234941b05103c6247d7986fca17b98ad0d6cd0804b131dbafd7e42c81e5e703182193360dfe31cbb674b8191340263bc2094a5810d193071f2887bbeea70425e0f8f3cf2db850d18b039fe4bfd6ffd5141e315bc4e30fb4074a2ccc32968b88273ed8e3efcd257ed38165a606158c00506ba0250d068059723092b984e116f246eada0d05805275a9ff93a97879f3fa85ca1a10a76d27eeab84bea643434283552c176349ebfca3b54f01a31dd3354d0dcf147151aa76062448a6ec922962b33858629d8e8d0157d9b552c2224550a8d52b09f7353edd5be7d55aaa0410a3eceabb6927112068d5130593a0afdc1c3cc9e155170962468e84e87826d5d5f41c1861cc749894c7e82cffb358ff891c4c9be274866d92ab9e77acba14e706d213d457ffa40a5c2000d4e70b7e6414f4c2e6ab1b3096e42ec4b9df36d57520d4d18a7f2a69d0ed7c8441ed579420e8385164a1a98e0325f740f22728d4bf0913eb29af4b91c342c711a95300d4a70a3c1a2eb473c34ed4930923f858ee5a995b205237325c1ee4e7425df5c2e4023124c67d6bde0f1fb5d2630338a14011a90e042878bb507d6713a341ec1abfe4ba88e1dc7070d47f0c9722b25af1ac125df646693c5ef427730828fda3395e7dc3516c1b9a4b68bdbd1b1050d45301d7dfa452d7920f52a163412c17bde143c79fc89ed1a22b88fcf3dfc737308f683eed036ba87189ad7828621b8b158ed13b35d084e35a87f68e9d42004eb6ea6fa91466f4e798d41f0b13f487973491a82e03b538721e528072349045d8c8c2d62bc462018b7bbcd10530523493140072a3400c1afa70e3f8f04a9b8e11f98183ce8eca8530cfb9c1f98ced9e17d347a9192260a8d3ef039b42fb57d6021b80ac0420b2c52a1c1073e8c75da6194eae8b2c3038d3d705e672144bdbcba21898516584c008b0c44008b2668e8811bcd0ee3c721c13b8422e8820b181990612aa00fd0c80353639ebace727a477ed185713c709a3447b5531309b8281a1a8434eec076cc62a17f2f2a40c30e7c94a45e8277e7f4c84d83461d986831666e32cf1ea544830e6c7ecb71f54b688b188f7534e6c087ffc9c30f91aaa22107de63c8f9d284783abb68c481abcaecffa3954d42a40107264344a8dc4b5b12aa12f8060c09d664154612161960c020a8126cf4bdb5865676db4705a204f7217f98cb352f3387c3487aa3059a047b75925325b7c8b106072409f6aa6af3e5b7782221e76246978a0413b37d64676223081276e5bafa047a04db9f73cc1cb2b3725439c8116c889683643a21c4185ac3f0620b3a1ac185d0932ea9dc27530c122398e415762be9032d826fbdeb8fe95fb254ae0826c5bbaefdcd6c1828115ca4a4aa9fd2e6204508768110c185a60a39ba2479274e0ec1daa4785b52d519e961000a6408ce7b729c3ca72e8186c6175d981210d24230f16a34b7ba49081a4308de2f43c5f0ca6fab318106c15bece8125abb20f8f036bd05cd716416b740705f1ff880e053a5b479b40dfd81cb51a7ee5845223ff0d9eda3607dc93b2f657ea03e709239d99f239b0f4c5d4cb17e4b5afae3a03db01772b2f58f1ca407ae72182edab107e581cda17b300f2285d402080f6cee9876561e861c7e312bd01db8ca5b49b73e7790a3253bf029c68c2b96592dd581d1aeb28a5739dacbb61733b6aeb8203af01fed25b47b8ce6c06777e4f074729c8cbdd101480ea76039b6e514d59213e3f5021407d65306530d562e412b2203101cb86f0dfe1766bf81e91ced9dc8b46d1b9303b9810f1a1e8767394a09b8c800a281dac07de4da3142f0fff8fe19880dbc4884ecc177fa3fce5903efe6e52979583de5ab813fcd2d5e177214d5e3d3c07e89dda4e6942c391af8149196733b3d036fa5ab1fa9c6cdc0b47510b5b1d6831ccb32f0a271cdc6373742f420031753de38064e6fdbb5dc72ca8f1103a31bc93c92328d395461e043b87706d3af541e0303e337f1356bb06a0dd12fb06e1e6e46e51615cf626980bcc074ea252f0fd9247fb60b7cce22116d4d4223ab051c077ce12de30b15307181affc93317424a212fb2ad01698489f6b3d8ac8a142ad054e22e6f4e039d87fa859e0a7fcfb5643720b9fec17080b9c89667eaacc0f335957e0cfb4828690e3c72d215e202b3051272572471d35e7982af049bba773da1646125181cbde6ead8af9030a0b05b5059a02921498fab795b6caaa19341405367e8eac82d87dfa8d5619080a7cd414636e36c9a178f813168f71dc63eedc09dce6ce95721cd216b3a509ac0756bb1dc5e49e9d66026fa11ea1a72d2fba5c02af2e759bc3e2a8888712b8acd192a54bfb417d30097cec2ab669dbf2a78b04ae23e5cfc89bd53e6947e0525aba8cc00689a9515a5d3af668085404d6a3dcf73ac4cc39bd0cf385037c4044e072730739c412dda0608b2fb82809041a021b56b7f93b640fe347086cfcfad461c8b105cf05814f73cdd9de464b420c084cc89105bf8cff807f29ed8e7208d29d2c27900ff87409e96f17af3fd41ef0a92dd94fc3ab343d78c0e4b11ce610a364c60a0c0476c0c792f387398ef17733ae03de827ac7ec38ce1cb39203ae925d264fd36d173f1cf0d17244b3c73b594d764037e0f2fdc4f420741bb0796e69a123bd065c879419c13a9418834a03366a8e83befcb1860e429a01933bf6a88398b70cb8b0c9ea75d2bd69121728068c5f8ca9a3068b60c04a6df8c7397ccf71947b055f9635788e95524a7063405cc1fe7938213fe87a5dddc8c84002b8405ac17ee84a3a799233b82801ea80b082cbd2db6dd7b166f1cf2a989c2ab7f3a474dc9d57051fc46334a95495c8a4e2a83aeeb8e1b7a382dbe89837a7e3b8ae7e0a264ea5d8595542cab74d71f428c64f9363e6a458a5d8df6a2ca60c0984142403328a14053b62ee5639aba1e0fa92e5a0627c0b21a8a0c04a2bd7231b8fbe136d817c82eb94932677f38f90739e6082bdbe670e2b27dbad137cd6e6987a226a24ad38c1a5a9f6ffbca14db02946f1a0593139209a609358cee9e328472f9a93094ea53dbb4287470b3d269814db2ee468f51492e5126cf20fd2c7faee761e4bf0e1992da587a13287e94ab01235c3f52c071d7728c1c5d7ab099d4e02c97b1f8bebb892e03f6709e9307987461b093e489734b84814127c9ea85c5fc9adf77d04dbc1a33a67241dc17e9aac93af2467df4723f8d05b438accf04df160045d7b9a3d658b242ff0880359046b39c7328f2afc3f3a456c193950130f42f542b25d748a0824117c99e5eeefa86fba1722f88f3eced1a3b01c82bbfedc5dff5183e98660cc72d0da91466a400ac158471d897bab79b81e42f015e92445c871f4d39d4130de933427858e20b809d2765eff397a318160bc2ff4ff23ad50391e10bc76aca123ddfa07a6a53692546b5e44eb07263a8f78fccf999acf3e309ed9396d47aa18c4e4039b37e53aa6e71ef83843578cb13a3bca0f3d301eeba6ea0b1d218f471ed849269a25d4e5403ac403f781a5fc81475f9b72eec04e6ad4e02731a5aed881d1e4f133796a75e03b7a6cef2a9bb887d1a1adcab55f97b239701e927b11c39388587260d7e2fe44d0a4515ac5819b4a697375648eec8703d3e935dab93624fbdfc0a6bb1b49aef71915377096e6faa1a36e8eb00dec65ad5d30fb78c5233630fea1c774712f3bea680dac4844889ac34c1b2f6ae0554f72693a0d7c1029f1930e926934f0b17f7965ab8eea2242c5017206beac2b34eaa57c621f33b0121e976fbca9bc8d2903179a6df3c67ffba41b32f015bce2a4a4f2d8ca31b0aef7c1f72c96e4efc5c077f4d921e5ab680ef930b09725dd67c941ce610e18d81c126a1525f4c4f205be25236fb0885ebf8b171849fa696b24ba3357bac088e85b9547e5d3172eb09d5f42ccb14ee4b4f616981c62de1d0b397248b616d8c98db9fd773d472959e0bffa72faa7edf68ec502933bf2cde3df16438ebd029f636c6d8b1ebd3b45adc0c4c89e9022744871d32ab0b9d62cc7202515989ceb63c77cb5be2da7c0e7649a28214b29b0135288f49fe6fec8230a5c656e59bda79f7e0714d8ddf0e491997da80f9fc06ece3b81b7adb5e4bf9a3eca36812fcfc9a388fc69553d26b0266da9b652fc8fc55b02d3aa91d1b6b3d332a6042e48ca1e25f645f0cc92c087e3351d7aa890c08e4fe445e53c393a7504ce34b354f6d83202a31e58b97b300bf5a822b07ebd390c75eaafc1220297a472c6b897a287590d81adee5bcb9da5d73f0981730b8fd4427db25928088c7e106d2b59fee86204043e4e1aed393c2e55fd077ca6b10f35afae07711f30b9625afd383d6072fe9843ce69924fcb033ecc3de9a963cd79e70ed8dc716488e0b16f3a74c07db4dc71d23f55793960da0607b64347a6799fd717ec0d5ca5ff2c792cd8a769e6067e2f072155f5a598279583b581b5bb6c9303b3c869b6b1810f7e53133c5ef6a8ec05d6c07a4e79299ac5ba4d7dcbe80aa881bdbd0a71cbbcd353c6d2c0e49c223937672f4fd5d0c0a598b356b2beec0c7c87f6b1e3bf471d3f970033031bf3669a1ce68c905919d81c76f83132701ee24f6d5fec487fc2011b031f420af983fcf3906b17836252e90b037ffb418cf5b137c7d08161898ec3ae96d8914a8479b7bde7d0edfa025b9f3be5fc0d9a17d8b8db39af8354b7a176812dc979a382778e23ebb9c09e6b8e830a8fb242dab7c08aaef956eeb5a7e85ae02a8b5ffc30ef9ae64b1658899f7ba3c79f1823050bfc068f2f5aa8abd6745f818b8ec2229d8715f820dad2255e8c91c4a30adcc76158b6caa151819da01d2af2274deb9f4d814b165cc5f753f6d4a40093029ba274e728d6e4ef2c11c1a2c0586a53c99f1f94752814f8e0977773ca1e95c6d69ec06659d84ebc8934c1e2043ec8f464c9bb530e6d6b0237c163ce0bdd3381cd219dc51cfaa310f55802aff539d0948e94709c6e1eb8b6c761b6aaa7b687b4392f2b596e49602c7c2cf6a651bd5aaf6048e03ed774e4df7158d6e4da11d88a1d37c724ba29416246607220ea21fa9ddb33e5820b9fd15bc4f8a288ad08aca587794fdad3c7d685c188c0c7904aa3ff524ef13a8d86c08418cf624e71eb367721f096f91bb2050b029bba2985e5282d32994060e2a9ea4dc574efb0c37ec0c41cfde65297b0201df3017fe741e6ba18faa32911c1603d60739c25e4cfb7798387f180eb6439f2b55def38d11ad80eb8eb69e98fba9ce9804f59fd63771ded1c8e96838389e520451cecd7c943f4ec0dc89ce3b4cb91794808cc0649cc9167e7f0bc950f580d923a499390d180148b6ce95a216d1ea61d48bcb475761de26fc666c064aacef1338b5b45330726032e7fc7fcfeb8bfd67532580cd8fce19feb8726e56f210603ce83b879b173cc4835d42b78c9da19252f347baca4a15cc19b65dab1542e7aa7562bd8c9da71dc6aabf2f68a156cecb842d417d70b2ffabe50abe03d332333cb5f2f942af8514ff9514bb22a15acfdefa60e721433df4705531562c4b4ea9d72903c05bbf79a63a48ba66033a3693291d49d1fa44ac176e569d9644b396287144c7ec5b5d3eab6942ea360ad2648485fab28b820e26a7e7b71a042c1dfa44eb12daee8550e144c48e93fa305c9270889e9418e52cb924ccd16735ad66ad7137c94e891abdf5483ea04af5162dc4f95e6445e9deb2e44886d826bed382457ee9ee690d2043b31e40e428e9d4cf0df313305c9794cb011ed3b7d56e219f14bf0e18636dd8e2b5156b104a341f3a4abd7a7d46825d8942ce657d987f92b4a7076ed418aaaddac21a7a58f82052fc98824b80a31dc3222ad365b1509d672189da34f6dd341c78d0a1812fc4753176e1a4f53c247f0215aa76095d287acb412ca11ec4796f6524a5289508de07245cbcbd17a18c15b9288d28cf2e4a1bd50a845301de88be998ba7b7b10a008de62da5823798301265422f8fb4d6d1b4c63f2c85a150a11bc7d65e6d68b9f9b3653a843f06186851ceb86e063f4e8641dd5b35db9842a04b711f726ca2b6aaa1c02b408c14dfeb753cf4a6a1fba46a84130adc9235279a0174345105c48880e3faa0f2a76f431840a04973a6ed671be0aad1023238616422840f0fb6184accbfcd184fa03133b6f75ea4829b11541175c7421022e662061e00b6f2f4a10438be302e507aef7b6849134a31e507de03fe67a8c929572947580e2039736453f77f6e64c933d3031c5cdca8f2b3df01f4a76e532b1913611055579e0c2ca7a2ae55af9a7ef048507c6d5e385d0c922e409cda83b70531d87ea1511428d47d981bd4e698face3a896993a30e225da1b6a752ca7d081f1f03c5448e6e8ddef39f01322ddb56e85b9bb72e0fb27783a49691cf8bb24314a6a120ebc6fd20e6348d91b188f7eef501a5ab3a3dcc04f587ae574543127d5063e568485b0c9d2dc101bd8095937eb725a0317377f6cb1c2ed63aa06b6eec3fda41e5140a581f11cfb77544e9e9a0f834203f7a75521647eca95fa0ca4680df138f2f4282a06dfcfedffc9393330d522551f5e249d94920d55063eebdf674e9af227cd2d188a0cace6797abe5bacd059d518d82c2152a24555db5062602c3f88cc6d37b679f9360d20541506de2ee4cb61473e59db0203dbaf2a39fbdaf5055e720e4c63d4aabcc06a6ad4ec944aed3d2709d505363f0e9359b63c8c242e70bb9373ce1eba72ca879194b9053e9ee6b1cc315ad9335280a487d2021f7ac77bbfdca134ef2cf016573a77c7103554120b5cfec0cd74732821abe40aac787e475449b963cfb1023f1e27b65bfa9c737daac0874c3142b742052ef57853e03be838ceee289202372a2a11ea3a6349260aec5bd4f18b1c50e0d6b3c34deb717a079fc095c7af129af73fcc9cc0648bd1722cbf31957413f870a5e28771254877cb04ceed235967bd943dca1278cdb5b1e3f84395c04fca1572591493c07eb0315f0b93c89203097cf4b1f27d7497e33875476072afeebf685999a78cc0e43046f309a12a027ff13f56b43411813b314f579ac78d410d010f72acba3e42a83c0e839084ec1b53ee5d0723e90433b6b02b1410f81a9f56c93942b444eb076c44f2acedee0fb5bfb7987122e8e28bc6005941f9808f73aa8a1f73f4caabea81f93bbdf54716e701272ed2ab1ded0ef8b83a74b490a00eb89decb01c709b135df92f5bff3738607af2fb454f6c3cfc1bf0a12db6e40eda80b5d35d8fea9e9bbb5203c637b333feda6e7e2c0db8dc0dd123de6f6466c0c4a90e22cc3c6bc8910117b77348ffd1c52f47c6809198c226060b96275a30606a3bbca81b8f5770992a738578314db6cf154ce5edb8f3a51b9b94b4828befa669f2f346318d15844a40ab2055f0bf21e27d5c16a2a40211c042c6175e3880527118205454a1531899828f5e42f03e099ab9a314dca5be3deff28c2958a4e0442c04fb48fba21a8c028d828f6e9ed365845c59d287a440a2606bbdbfeed7fa0385824ffd29e8c79d452b3c8e0f040a3e3bf26065962aa4f43f419e6042d4d66ecf39ecc5dd037582eb919cd27bfb69cc4138c176e7d4c72aa14db0b1d3efdb875c2a129126584b1b528ad95fa44cb03f962247ff1f3d5b5a036182af5429657fbebda04bb0ef933b92c3bce3e593257893ce928bd0a8a45085f27824100904e2601c46414c721f73130800182c288d46428168248e747d1e140004522c1a3c342a1a1e2616101812140f44016128140c8602c13020140c0343c1b0404020eaa07cf2cdb1e36203f813c3de3996eb261d7ba03988f65daba5415ac7309a1cbbb53e1ccf24af984892e28bd2bd81a83c43302efb50865e1eb751907b48fba9e3ccbf0c1fec0cedd9d0ea3054529cf2272947349fa71ecfa108761e8529f6ebf5913097f7f1b444a1d8ac5847961408c3650bcc215cf4de721271cbdbe93a5bc45fc6bcc99b9bbb01e190ac368f6e7f6cab7143178dcf8da5346537719bb90264e98677dbcc8989fab2b497185428977fdcbcc88d178cc54921f2ce43419817aec350de4b6d6b639e4f49a4de4ac901bc4b67b62223cfc758a4aa373646cccd3f60a310dd8d5b141b73910921c45a8ace8f152ff4e396a3469228f46dc289b8dc1559aa9a29a413b4a394d50e98599d3e67d91039a5b80baddcf86c19a1825be8b4b2a4341b18859a913bee7a0bc82435eb4719a1710873a86ce199adc9792669ad9c035d5cc9019c0eb73eb95850d899e4d7123e81aadb6e9967016a91fbaa14e677602a06f05ee5e7dd75be5ab12b6a1b9fd76ce6184d4dc6acb1503b41754d661ad73b9af2965b00efc9d71f4a1913b3f065d9bdc77cd6c651dc5b3a146288d0698f8c7748ec4eaf68e7c0af30f71a97f02903231d93170b9f212f2477f87c9f017fce5e2293d1e264062e1b5664a62d63dcdb42d97eda47d44fe32ae8408130c866779cd82a46e32b1420722f62234775666d2ed0647e405614db73d0541f0a5f4c273f71f34407eb0e4046570629aa912ce4321f29a10b6121a86790d1215b4cd538542fb3255a76e4ab35f5273f052e1383222464eb435e407d0f88e90988a2ac0a65cec823f398592cdaddb2055ef7c21268fdcdef345257f112977fa513314faac5dd27636fda71a142d9e9409e54b04ea3c9a6b3231d8ad7a4a9c6ed3f1e672cc05422274df5e1fbd5da0e5c16978bdf5ab0715b11b58d2a3d41d20d3f3ac3b9d191ce62889065d22ce1ba3ce8e63af6a3be36d5ac6702c84b675f4ba56a77690fef264cb038cb9374d92908b0d5a1305048c5a28fc0689b744af10385dded6cefdef0c17455f5a45b351fe6a2df7ecfcdc0f831079e40e9433b69e7661a23dbd0fca9df94caa9a4b72f2d63ed343ad702ae261f6b2a10c69e322961f487fbf815553cc289ea51d441b67571a9b87201d869e7a823d8acdea099a00aafd8b40d925604c99794576d5e1e7483ea7dd07f93114ee0beb189164433d3930151b82fc9dd428397816d6c8fa39262399e2457b5cbd98b1bcb6ecfacc3423695d5cbc7570ad4a4b933967f8421cd53328d1ff908420e3c32dca474a8b432b6ad59d8e4d0600ad5e009e1d080c2c6cc5c5e399f3789f26df418c0c3263cd5bcf1f7acfe8d08a2f00e9ea5a35212f38227d1cea24f511f14a0440a0356ced3b2ea2c09ad4084c0e70d55ec642ba70edc676af39deb1f7868891de5c68d1e55f79d84b0fc1413cab8581a8f13ef8f16476d4145ef5636e31aea6cec40434b9bb331ed941bf04dcec8613868eac753c316b0db302918665808e6e1959533dc9e0a51fa0a6456a58a4a4fc5c6e70c9cd7e345eb819e113068e8d97d04a71c21d7e1d6eca26ea7de34e4672e929007b80ec184ac447668a4236c94afd068a6690ca66eceba90e62519af45bb513a4bd7f1c8e0632c8063c0f9138d8d111acc94e2bd4c06db4dcafbd844480c1f89e18b2bb70b8f1178f870b82a1099f0a3fa3b082e80af977b4c914d0d511e99442c3dcb14fb30f64d9119d852f8e8a9923834663082864ff4bfd8a38063d9dd2cd06cad1a050d7432d8b1558343059d99014d66e40b4795d54fabd8faafe7fd138ae98ff1b62bad29de7f5e2cb0dbae3ec5559e1b470cd5312ea59dcc331af14815127a397eb5641e36f4d38e441151ca2b458fb657e16629d0f4663eada38fffd37d144049d8f417a1bd157139c9c5b1aaf03f53a899575f029218e3b696911e0697ee9a58c335089e3e6a923f2a26a8805cf6daf014ea2672a234aa8b325855aa1ef4e274637ad7483643efbbe2dac0fdc1d02390e62a1acc238e83da6589b02fb1a0d3487563314970c1776efa4b271192fca7ce2e8791024673db82223765a51313f0a918f91a51a77706704b51931006d140fdc744c3262b00c1209eaafca20851b54778daee61cc88461ee872963cba644c537304502f80bc8c301a60a7af9a331c3c63765864ae0824740bade94452d706fe60bc3ead9bf595617812fd99b66f570ec37f62b8cd6885ee70e6cd09a42d54bda930ff9f765a0fb5398baf1aa92b00f63fd011c3b1374d618e64bfbf297692fcc29325ada3215968bea2ff591aa1d347afacc6da39238a15897490371125e40051ea7c524718062f0f02abb97a24fb923c818b1cdd865f22b2ea0b4fa36d1a823722b2f722e0acaad0e03236048216526a777e6c994db330e4610e8613a9b1c2e35e22f9414e0a536c44c860f03df8999021aa5ea8374c7c198392074a085e1dc9b55e1174ef144d8e06225c14dda309db2014591291cdc2240f06854ca5c955651d2c42f0392705d2d45d989f966d2583053c420658ce4a77cd320fb83f2d421664763968af5f36adfd0e05c54b8b15a80d3b072dc368b1105dbb8119d7a880813caa8930416a4f85db91bd927a9a31e6ce8d74f88bf4496cee8fcf351d066395b0464403cfd394274e3b192f08f781b89647b40b8303bdcc0122c7caf2423f32873e7d0fed35ba36939cb903a6d47795a88836104735f2d42b26c50a71e1baf2886ba2b388b8e1618058cbf64630de7d9fb910676afc24dd5ff3728422b1d96a44ce935569431b2ef5f0d674314cbcd9961d998ff6f697d7aa959cd02406012866b63a81ef468a420a050d13b21e2b98935db6697f1592ed3f511668eaf98abd09fa16471392c29f85a823a7743a7be343c1b6d0630c0ca730a99b54221df5fc758aca2979454a75846b20e9c6aee9cdd53a68c3381718a7e47488964125c87727c907dd1fc2a4ce5f20ef2af931f1d15a002461a3de26c92dcb3dc26e3971b4cdead392378be78b4498c941d864cfcff481e7c7d5f491093d9092cb0b00eef777070c1d3927a738c17a280af858ad63a8827fc7a7fd4b7a3e5a2a0dfcc4e8fbc7a57d8ca433d4f7305791205d13572177b01e3c1e738ab25d30ec1140db57c3a1e49a06d7718a5b193402feb69b5dda5159d22c2012e3a10f21d39ce6000acc3b7ddbad10779b32338f92789c790c868b03429ed1bf8fa14cb1f5f62d6296b5013d4b6d9f96118ee4a9afc2295a8980385ce5fbfe72541e06e3de475025dfc73b3cd11281ab2bb237cbde884b76f84183d823c927920238724d8d048803adb332eb8ce4a3f6404ac1c52fc1bbfcb933bfc31c0bb3cf81fc30079873a3475bf518de50411633ff94675c93d794ecd4289846f96f5fb7422c8dee710834b65f89f45a6895a565b8358244dabacfad2019d90f3e4a237d63e1bfc21ec358e11c1345c744913dde614a4e052d3316727ccbdba821a4ce84dd1f1981eacb1444fd8d6692ac3e2e5602ab6e50b081432f30ac86dac657e6b98da6e4002e830db0e111cfc7b9f22a04cfc19b70012928d186c517bf5f355d21ccd28872fa6ab05a204fb74b8f967a962f464deb2609b1b6e0c651e822c7cf9d0f91815a2a03f07a6f425e36e72a5a8585955685a26bba577e4c2fac1d38a0d6223cdcc5a17126f92679e7a47d6797c44b8a9c99531abd5561cc947c0db1b8141c0b89ca5d22a1acfc442cbd2c3d2363ed1d703f443281c96c96dbc0e8628f2b489adda89a3609d401161472a94c1810cfe82634723cb744a063ce9c0b66c9a0d7ef4e26dcae0a8e9aefff143db0e149b5dfdb6b248603e6ae0aee57e47720a77a3f28de98ed19992a28faeacc5919c3edba34a2f0b58202d2e6986c0c8d567b4149d61d2ef5cfb68e213c5d306f6fb4619cf87d5f99ace70fd28026c52c79fa8d6148c8eaa8314ad9ae46ec6611cc40ac6ec3023fddc932c3d387c191f7eaec2a61174bca56083d980191f4bdde1edb86ddc4891c2c2154632e1862df5a4b3f19629dd5344b0d2e0b14a6ca106473870d87017e5c21e791cef5bb82b101669e2b3c0a92440c41701ee378c2ede02b5dc120c799c6b35612a174379538bc7513953933ed7baacf77db4c88b0ced3c9c6cb06e6dd8c811f2310f08d761bdedc1acecc4c1b1c4056830a24337dd9b46dfc89c51e52c8c69cbf26efd2a000486bb4a40e9fb40ccdbae4ce94e168aab512a0f578ff421ad60a08e2ca775fe598f582d4e727a1cf6233a5bb8b20ffecf601220f7e3cb6a394a0b526e0202a44eecf8c31c7ead4e0ebe7ba719b21716fe0b20755f3706df507ec8360baaaa1459f55d34c87a60f0b2cf08bb3f906e9dbc393c1966d33873aff1a74c521d77513fcdfd1518dd31097dd25e00ce21b83dba07b48d2edcfd8c3d38f4979b61a68e89936527088d10cb4a7970450d9f80009729cd0434f56b08b47ddeb128c4068025704fb0978127063411483df10682060ae27da27bf4e4ea0017de723506a4152ebdabfb8af13853725dbacc062e84b137f707aba58f24e1c62fd9de9f4ae4ab81654f82121d5f1c581f96d943c39ac13ce513ab81b5a69bc6015a0a0acdd109de4651d45b220130fbd93253bf3ff90c52bdbba1853ee4569906916a325bbdfaa90a43a527cea257a187e7ca7565eb1601bf79a41251882377c8956e653048a0580352fd9bcc553da0ffe070d854771d306c81854e6e4736240724a6c7e3e82b14f1b9cfd87ccb4965f3ff8eb4bc0e8a3bf1d829087360343167cd9946391d02e8baec3f4adb718754a4155c520360fcca4f9db1c5a38393144cce0d8cefdb3ca1823fce4311433a48d849a533fc11d6dc1bd0d93ed1445cef95b1fa390f1f4c50da9f909499483e61ef0932ae1abd4966cf805597fb284ab487791528e0f41f0655f8519df190c4db9b56326ac62feeed85764400b0f40332be62e3499cfb60b33ead6f06a929b4362d8e7e32ca48cd75d860d6b6d9dabba9121f45808034cb8a02f0b767ceced61d4d5fe69199d78c9c1130f676f3044e95b0238511832996e2a32ca75a0a4d4827a8a1e44ca8cca42693c54194a593a2b865c2bbe59448369e82893569023bd89e44f15ef9531a1e5ac841e65d04f545bc114a7a84a031bc2e79edaa029865a3c797a778f79b5d13fcb93dd761624b39cbd684e2186b37684b4eb59baff1536c60e25258194aafe28bfe48d80063b156d2420593674d0343507598ef19c47584d2b68a5f07594f4105e19543d1e8c8e7289115acbc30279974b7d1785dec06ea33bcfc1cadd9c26afe23d670ec7a21bacde8ae0d9036bb896dd782efbde10c61729dc791de48586eed16e33755409e419b70b37a2b76691f1911d47be20f91d8bde308b3b62cf7a5089a01fca6ffa8f222c24bb2800cd9dc81095498c22f62ef6ec1dd22ee5f6f786b19fb877b567efd0bb14db8d9bc40eb19b608b0ad56c4b9549c8ea553fcb60a7223df41bcd38455fd5ed454af26d103526f0d4337488ba283dba862b0415ede40db42c29658ee73d0a5509536217518d604590a3072b6d3addd6f6f89345172098547b64e141d231a663837dab537b4f8a6d0184491e8f7b3e8a74e7da549a63f7a0f0e0253245e355ef891fa7d9212302d41bf8c75a8011eceb5a827e53c0ff6b782134c5d47d3f35c7d4b6a778aae084cca96732b5fadd5b3408801de52cf02a0057c5619ab06111df936484afbd192a537f4d03d87f0f03a83dba5cf490460da26d88b3b9fcde68da611f5f8deeddca0870bf0fbc73b884849c29f86514bab08064ed54f24df57c43289d4dd9101ba72a47aba7a3fbab705023e857bc6a445567d2de401e56e880d2e33171c0be7b55a12b6773d86394873dbd32850c584ccbcfb4309d247f50e400849306150b4dc58336c436c98d2b07f8bf78df1996998015fa3181ba6c40c38ad9f61ab4c08eec5a0e210090f9a23259a4cea55ef4c397b6679cb689b73ba8040690b473f2461bc218d582afa6b8b884d0783c0970bf524b4767e09e240ea49f3124aa82bfe232ad98cb655dc201346165344e27f12e5cf60cbc856913213bd44e51a3e950e6b5daec25edfcf42ce8de22a18754fec05efcee94f026bb8bf8b9fbe2911e568586d73d6fba54dc2ee490f60c0dd466785ac31a947c86d21552e96a496eb8a21eea37780a0f3da57230e5505d7639db0065a33c811b33ba3cf55fe3346d7dd240b3669a3dd92076c180926dd860689ebc87cee31021746fa2e2beafa94d2dd9a0197da10e4ddd6f39945ca4ec6c579166b67cc97c90a37dc2a5027bf477f061851a9832b9e1782253f213e14da4a8b2d19eb564374ecce2983af85bc1f17a9c58f05ec7c6de59c8ff5d1aef7ec120b1400d13b66b71082e138e2a13b311cf49161758515a6c5c5ad085a1b2509f92288134edabdb01758368847f33c97cda82b0dbbabe691569d1386b13fc95a95517a3d33d482914e1a87e8e971fb3ed20090951e97bb02f25114d2747c33a4b5e33af88995e7d458d8d66259ad8e4697b098679cc368eec48bee8e08838ab342edf69a15791c115a140060c673d4df3dda44c59f905b83b46b72d7b6845f37f82fc52e921a21abae8875f824142f455e21d3693636964c2b6451b620c43e47fc11451b4772159786a9c4109d39059f35e2d3974b5a7602e1fd25bf33090b928104e5307b5786d3ab73f3dd4a3efb377bc64898062ad8f15c4c31a3f30a374e5ba8911bd8a0ce429e4ca73aeb9876cc366292f74035189d8982c920a04e415975e8f6365f5196204d1096ed8355e0a3f4bec795e961a5429ed47beb70f6327fbd5be641f8e162f87c31e3a29ebaf1098243786e5940ce2776cb83006911aae69fe807bdfcac108f6dd0e4bccd37b95d614ab8740694c0968d0ad9a3c6917c2a26b6ab58d0e271cb04c23adae4bb58745057620c9fbd8f69cbe997397f9607241f2cfe3eef7902690c6fa77e1efa2c5d1d00fcde4f5a6fa57bac54a2b6d9054081e48763a84a14132531ee747949f95568d304ab5d234b0d1351849506d5c445ae589384d2a832437e11d7b129154578117339edebf9c8b0abd1b999d5bfcb742265683b4b9cde02bcb82c2d9560d6792d99d5bcf1a1c24d9f2f2a524631b02a8e23ec2d570b2031d5c3f5e2b6813cf0e2610b0cb67d17954f5845730cbdbc2aacc933a430854c5ee4d04a259ea36983d3c8c531c8049f3107040969c3f99db999082db86b7e45f5ceba337393569b6de994bd1128ef3d3d3589c2c15bbba7e2602d5057d9e70075438dacfd203b3ecf235a8518416eedb7946cd3f2c1773f4792264e7fab9139e9f5b7b609b68d53b6b637831506beb659824140154eece0efd13fa02f790a19f4b2fa65612859d3c213d50e2e8eb2db839811e20d9dcd1e5ce2489c7177f265943d2c15d3987542424e1da8a45606a86ecc0441670011712630fdc3fa7cca2a951cc6819da05916236c78c5772c29539c2010865a7468eb63bdba52904c065c0edd9adefaf65f15e755ffeae3a12e706d42d0e371874c1fef8d21942e7a0d37ed8553976821b6668fa5b4136caf77036f30856b9615b7571677d8dcf1ac3008a605d5b4e8cd0f9153400c3e31551ba0414a7d49d0997bdb9df4413ca586a89b673a6327f55cc6b5848289b7297d21aed8849564e8ff8544992779541b89599fc287fffec52364f0dd8f927693d0748b25a74a0c034410038977008e8401cd369967755a747713ea8ba26368cd8e223602378755757ec3bb1b9f56a933edd130c73f4f11dee373ae82409c1cef937c1cd080e1c326e4c4838a0ce49bcc71c879098e90d2e95ac39be8129ddbc0ac0f1aa31822dd8bdcc8632cc9d9943b2d8e8624c4008ffe565d0d584e378e637602ec268cadc8d6408515ad15240cec75e253ff53c8e7a5c70e092b0113d788628d66d0136fb430470c943835e061b4e865c1677d9e1ad2be0ac7354487e2e7eec5070e3778988315ca02590762c814db2b273742a84638a73f0459fe24ab289321a05c93eac64d65ff3536cbff66899ec43a81e080c0acbbc114d7414953db6083c1b0b006fca3453c03d03b89a0af33f0fc28436b3b4e33977e23fbf3322c6a939bce512e555e4821ef61aaa946bb33cd1a746e64ce9b910e594bb0b578e0571d5c63db0e8503e5efffe102221bc219cfc4be2f25411d3ecbcaeccf8c34a0c97111d89ca1c2c2b865aa18e71ea04957f7caed9fc4a92c9324568bc27707444153fba68bfe981d4311be0254185ffade440d93dcb2a50168859bc3365258fb31e275f8ff99257d5e903a822b12c963ab6b2148232fafff35ac7e3acff2192e95d8aa4c144c606f2862884f7fc6123a2b997794df98f1608335a5cf635e9a669b6aab023242e5f432b709822b542e6028347de19383f6b1098dd6a0071005715886abe00bf319abfc79b87e4474c69c35041d58815105e477483aae9a49d37714a8fdf81e2d463e0419a9df50211a7499126bad287c23e80c4003f120ac41d8f21ac17dd94990234de1e43ad28899a8837da3638eb1c937b0e35cd618c2808ff702d2319879ad980dbfdf110e4df37ceb257b99a769b5e5629ac52347ac0632353d25adcd0ead6fe9077a390af20a5e451b1f4916a0f51e328f8573ca98b63c86d9cd88141f8efacc78dc4c77e5aecf799f8e39c3e41e0489be672a7d5ae585ed0148759c89b8cec9c222910a1c44a0dea3dd0495fc7cf765b9c28d102d0719dafb6079ba36d1867882b8c899c6749e0afc9542f4d4656fab531974c7867bad5d6adfa250ecd4d826a0058c73e1276f6ff023c094ea2e1e47f0cbcc54e81a2f304d75bde5d2d5fefaa928a06faa114cdb7253307c503c50cde8bbf9eed8141d1058c0a936bfa2171d149eaab0fbca2f371c9a0d241b928d541a684baf8c3e2d4a942bb5c2f3fa5ac620e9725088130c7ac4315a05ea82c36aac1f64d65112427b5b8a21fb233d12aaf82d4459288c354601d5fdf38ec72c3d602736e0235a273da40c67aa371e3411c388bd6714fd18c3b97066b851fcf90b566b64f1ca976b725b903f0ef0063127f281f24f07050703d682d901474b5411e8564953c4082507d427ddf2df8e3d2bcf8c552a383c22e4061f083a5a983bf9fa1ee8a777d6579f4659b17762c2844ad140528ba27a737bf393c1a755c931c111ab34384943dbec967a282a19fb5e3f4f5cd5454e4db7cee10d9a491952a18f3a4c3cafaead3d52449ebb34039b45a0f04ff76ae4e0295b31e01da7ba4e1a748bce51618c3e349f4e96d64a641910bf845955f92d231d331cf229d7c0a84a05f12346ee5966c85aec3bbbce73888d145e65e4c7a5756a34ecbac3972de26fa4254b0f9d08e2850337a3cb5e77c1fb5c6728005cc87653462a5996ed93d6462f84d36315579d98d1bbafae3c09af6b2b8805891e3c832eb964188734610eb59ceec1266efab71623954c294e569d358d7d91e587611e4ffe7cb7d948521eedf7113b361f3283c75cfcfdc1dd2194c322a5c213c816cba08d5657c6992ffa6faeacecf0d7ecb437104fd08b655305c0d5a17c69870de6d2b1c526f05583e4d01580e176abc43fbe453c454c511310605d42670dd439180210130c6077f8e0ccf3251fc82ba3418222362360b7fd7049e09683dba978f45dce7844a885d555e46494b989639eec82ac2951cc165d55411ed37c78178233397ba3649f175e955e6c3315add70708445e430adde5cd5fb1acbdd12dc73e5e1f8f628361f749ac2bc729e9a26c229720e3dd927554613d48c5c7b0d7a83f9d6013c77cc799f145f1220a6eee63349409534d015ddcc8a793f67621176f575881c98f540b23d1387bcd10df0923250e53836a542bd287a7cb1d722da55a5e479e93645dbd9d7e9ddd131bd2788d658b405b887ff177a1f82ef3d3277e141bb05d7b5314e7eb13bd235732eed451a5c84217fb759c8c8c1a54d659b98c1f218100b5d68c403631cb05dc4db536802450a48b5770b0031a19551b2fba68ba105a897b9572a75e15178703d406f56552f99c288f68c43883bfcb00efd55938af14c65baa02d040c8214586081adc69821ce2d55181c068a82ca0f456e101ab3e931cd72ab6d93b9397a30d72fccd54855d9f83a1b422f0c01385e6c832bb87a8a9a8a74179ea5ad4ee4a01f1178dedf808360f0b4c6b6028ea1a423dcc42f599a27421837fa83b04551c29602c4e244a15a12540c13758df4c1f6f7f127457f932e771b26c345fd882a9e631f977ab28ef399d34fd796151de28da83a02b5d51e473514e8a2503c67ac4d72a276cee39ad6d650ea52410c48ea561ec1a547ce1d73bedaa2a58fc627ebd83b9f254ded057a5d497843f77349fcbdf608722fe2bee7ee4a2c5a9e19eeec49a44374ba3ddb632e677a1e50ed2fdee202c945e36b75178da7b73ba6e585bc42fc01a1a97675bf241f718f1e6e21242fd25ffa7a0c4098ca86c7c89506465d9dfcbe078d59da708439c619dbc0d1116e0574fa2e2fb39d4f18d79916115b9907bf009e8f811fdcf0462a6111850e18f84c9d50c3c80a1e8c73fe39224106fee133b2e1d59e9c051ae667d500fe2fd22534e5dc6d2a27f25069db667eeffa98b45f11a3c7194169a9e314dbfab7c245ee33e1fca3eab3d6dfd3d7bfbe5bfd29f479f599d20f02f54f980798ea9ded4ff757708a946da14f5753304f9f29c0ce3d5e0f38565b7270943e43e7bf81569a080caf10ac1669ed9642e75a4c19da6358de05f1e7f2f878d9309555fdf30d64b0cccf2a92ed49e623003e9505bad11e6eecd33e7f047fde970972dd3b90ea065ac07441e2a119174be267148c0e314acbe87b47736dfb59ea29f289608d72234d3e71c3dc910fd2a471b4d36ec5cc4043da117ccbd314dc68770c215d95b75fc56f5ac5e446c77b1ec9c6c5ddc86bcadff35fa1052025bf5fd55bf722334cb8a46eb616eadb01eaad5342d0dc290bbbaa378954f22dba6fbbfbc1d76ce44a491a7c556074973bf01c51c2e8caa80b541754ef66e33a8d66b67aa3b95759f62e778d5b9c45dd0975317507a8ee6b8d8bcec58c5deff0a2f9f796bc32ff2a6ade7a364ddbc49457352375e5769f05692be8f396d132c28544dfba9dbbc69eee0c6a3ceb235ccc845775bc8afb6d5e1b4d9e46b8a4d4dd8b5dc7d4a77d6bada3b91eff11a079bc41dc9daade7abc77ecd621f6e31fd2fb5ed57128d2e00e90d3aaac30720cf6bf19f74e50bde7e8f666b317d77014a4579f73e4d16ef38a87eeb9ef029563d7dd6cc57b5e3640b5feeef5c2de3adb878ea18bbad98a1a7ed922c668765d1774a1d76eb6c0d407fbd4bd5137d07d8dd0ed67411f811608e25d9efeaa5b4ad297a8bff0eb0507de7a613348f33abbd9b84012a170efddb6def8f0d6f5037c05efd3fb9a15dcc7e091de55f58eb757b3ded5797199ee79784b4a7bcdaee1e9cd163ac61b915cafab7ad1bbb76e8708a7dbd4955b1b844a4517b5ff14e1e8e070a0273f1dd011409233af1aaddd18f96da35edf5b23f5ce893798bf2b796fb68b672f05f5d6651b6f2b9e1c0db8320448386a820f65792efe5f06acb70214e00ae84595304a788a0f27b742551243b580d02331d1ad25b0dca62c7e2d10e5045bb31835e83346d716a4aee499f812c0173cf1e048461e1c71459e4d286ac2b424ae15a8830f7c27b3a90437fc3c4331f13b62bcc82b37c472bd19be8e507d2f34344089327c2a9e1289503b48368a4b55fe803a9b681666d953497fdf6f685a830e063459490d16e0521ae6699e4d3f06706f77bdfcf34055c5c37f3482b29367b1d17ca3add2d0c42b3ababac2822d49077e79323d866bb148695f0815319182540c326cbb40019c23553a683b44936c172f2742b84da9d32ec753cc6c776bca3487007b190edd78b026380b949b04b544c1cda4bf707b1a542a3919fb68d33d21cdb5b718d1ef935af6564b3a313f0c7dd1723a4ef034ba107465f92bbe1fda2ae0378e8e46ac1fde2789bb4d5823eca0a4421275d962d117633450c85531bea80b4b7c9f108024f42c1e9199240366b629a03202400c2426baf08b30474cdac186c933c6c616bcb05288e74cadd1981233a28a28c9ae611d7df6447748d284d0ede01f3599c23ceb0526189fb2c326fa65d1ef6d3a11ad483d656ae5b1e1180270e0bcd1cbca1acd1925cc565deee5b574bccb1dab4deebd6a448e3f6a33bbe722afb835da29133e39e61b84634dfdd02d982fd671510f3c097fca68a58aa4fd58b3e8dc461be3feaaf51de3879b2dfa4c2cd0181c089c45769d8c2466aa7bf8c051a2d8bb1bda9ee5892c9087b340f9e69832845f81e7440a37ab43c640e23c5e0a007e90514427e54323bb8669bbf0f9a3c013ad0180519145d2914001080ee63a54a530fb8dc9d9235657656451257842cebf8f3e86fd8694df5f4b8621717cdd51e70d5f5335c7637fb2e0aec8644de0404e36e64909b19d32d903dc4dae934278a6c198c89a10ea93c1dd07694bf83d0833ad42c428560c206f83195805ac96d0c0970e66842e06720502d426e349cf00b8b4e943d790a5aa8bbe84e5577e5288b0842708b04f831988ae2bf918503d83651779be604042039ddafc086fadb602fec504090c2f40b46439f003fc003fc00f00d546486ca4f5dea2943291872a34966a7ba794524a29258d9a5f618fdab7563758d31f050c890ba50bdaa5970c368472a4cc816347f14098ca938cd31910c42432c733f75031eb3469e8e817e81ffa0e21f3e5991f48d2acd4264f59ddb974f481a459713f43c9d0967f363e1074a99176f641b79cf88aee81a0324744c38bd012ab1e0af5b1b464b0e9b871d629d03c90745af114f91a97944e062b1e0842956af16016196c9d76a46163c7197720771062f27f2e470daa33ec40ecb6a05f6baf037945cae8a59bd66c99ad054a8774c996d12c22d5310762cc6d672a1a54a73ee540cafb5a3aa50bb31d1a196c757120aa78cecc2d2a3dfe4c3810ac931261e2de5425cd8e1fa033fa0d041de3971026be2dbb8944dd404a42b8c825cba715d536903a5b4ccb531e196c37cc6003e9b26fee10f6fa6f1b0a740d24399d4d1debf255d540f4f6a4e43be775d8d8a10307193f407b21d03410cf45c5d654a532cab841821a3570dcc071c3061a3a140d0cd0333472d49d6a4d15161d65201b3970d840a39861a6335033e4217aae745c1ee10e1d367494f51d66a4116819f6dab1bad5d3fdd8d82e8d21d62947a78d5132b86b1f3bfa1e72f1e6418c089d8e8118c46f08afa07245fd37524a117ce00366e8283ea851a30b2a06e2c78eaab0e09673ba61e0be633f45cc52af5e3bd3a3c6a4b3acbbb56020e934a1928d96fa05923e1994bee6e097d2a65e206dd820c3fc6dfccb942f03da05924c5e315367cf0572e6f914a6f4ac5b20266d8b265bb1d4eaa95a20accc55e768e65dffcf41b34010a641a8db942e6b778a05c2f59850531b446faef50a4419958416617aae4aa45620c59c938719b13908eb5401dd1bc4af54383c4fdb5e633bd5cbe54429df6cab383729ea1488731523e635533a4b3b41a54078df909ff2254fa3401c594ae62b7a5ca05020f66f7af2687f1eb38f0a037d0249f8860835f11dc425c960eb4ea3d509445db18ca26f25833681a0275bd1e349d19e7f3e823281a4652ab355e6740904551ea6479766e693512510a4e6c6286d49492088d85213d2458a0472697fe6ed6496693632d023106d456a846bb75c443bf57464cfb45406d51fab4184a618c4cd1a7af43abee824dfc0f18235238941ccba39ec37da68ff6f021fe430c815ed3fc7a42f6110df2a3dcde6d4bb9c0c06d1b29a8cff99524cf10706d94d8c145153e6d0f10b82a7f424b43bd6be206aba13ad27568d1a28472f8863e21734ba7f12b9b708c90be2aff6e5cd31f56ad63a84dc0549fdf49a3a999e6006367690ba208d75e62f9dfe2ad6290d3476a48102cc5cb8a24dd6c5f77141b48fd1ca6e4f6e32fd16e49c63ca417c3b5b90b37c686a4b41e7a0d4b52086986a326161faee4e5a1c35f8eefdcd3c8b62ce61a6ea74f32e8bede56bd6d5755ccbd43d6f3e68e64fc682d829998ca73bf4b452b0205958f65bd22b88c953e756343f5d41f88f31767839a599df6c05413b948d921ebaf3476bd45042b282f8e9978329a5bd348f70ece809b40004385a50a3860f70e4c8b10a82503166ad9ea40a62e5143206b1e184f4945490ffb2cfeba92c17640c2a08c275d5dd4f94a88fc390a720c7fa243fa5a6759694b990a62005fd362a8858b9b47c66214b41ce7ef3659bebc3e38714c4fe70fb2848a79deeb377e69aec884271ad2e75bb2ecdca34ad1dfb5d913114a4caa1d5b2e7808220e593b4501bfa57e4999f20e5a4f72d7b05336d9a43437a82a0f39da95741e6ebbe13c4bdbd38a17644e860d6a851a3061012420c848450738258f731fb687e6c46cd264863d5b677ba2ffec6344190f5a173b2ca4c902d74d43ff9204c103de9670ab364b2d6b904f9f2c7a07aa5640982c6783f7f67a9192d9520eaadbdbfa94bab16a684ab7b6d2936db21eaa5f3e92c934e234323c84910bc36054df94979e5daa69092205667f8e938daba8219099218194329d12a32fd270909095252ad499ab8171f4114151e548c8a5962b53b829431eebea74adae7fb834236821cb64e6d3ba8cdb859a34615921104259f6f4de5466ef8f8224849d5c83b5323db534f4510b48d46d3eda3a5211341361d3b67b8a86b0d890852f670b5f87f7974776dc84310de82de20f425cb908660ef63cf6ae4562dee435b3499a65ccd3d6721c8369a9dd7922c0941f4cea59ac74646093b8d1c04e1c37ff80eb58c95194110e5346f762ce15e0a044966d1cacbba39655f4090cfbf46aaee698d46f30fa4522f723ebde5b9a0fb812052e3c68ac80b5b671fc816c446e68f4c1defe303b1db34c57baff84178f640ee94a9f3c68eae1de3d403492651b27193f2f0981815335e8ee381987d76498fb8ef403ed3df9b92b8ef3c253b1066d447dfb01dfeb9ab4396a2baf795dd9917a759d51aa6b2d281346e2553326161addb39701f3776eef965395696ad927220e8471fdd70617ec405d1d071977120a9755caab89d45d130e331070a6e05356ac081982e624ff54030368050061a8933c8375c296a90634a293de07d763ccd0dc45479ee9450ff78db408cb54adbda7d8d1a356a241b089a8492269742caf81e835c03c1ec949870ab133f911a48a7f4adca8476f6f8c61969d8e8c18dd31bc834103e5abb5e5b4ca6530e1a083a5d5fccb4a92eb52683cda4a1e30ca4936b42d6564c11eae39166209a4af16ebef36f68dcc8b1434719bbe38c1b2ec8c10d0e306720cb40b0a4c26baac7b49a3c4192816836efa22aa82043bd1d67dc48830764e41808a284ca4cf7991103d96459ca202e571e3d4f8681e8ade3e999c49b868b196020e720e6c5733e9333970b520bf90592ef664ccbc9644afbf92da41748e9d4a6f352dbd339b30b244d5984322f9da593960bc44db72989921d349e9a5b20250b3a5b5032a65bab520be460b2632619c733ed260be4aaa062874e97c402514ff505ada42d6474f30a441f55eda5de6655565a8160267b3f6ac7d0157f568124347b92af8b97296f5460b3c43ec52a3566e53a4b4e88f6bc7d42cb9c02f92f55c905fd859402c1920cdb1f64d6ac3956a38617320ae498ca3eace949065b0f6e1c1b69e0c851972b82b6152414c8a54de624d355d2fba2b6b1847c02417754c8523b4bc2fb7402e964cc9d797f9a60b09fcf9cc4e74c20a5119d74f4ad7c749c4b20b727ff186aee5402f1ed636f688bcff7d10e641288b5bae18e347000a194914820ee75d4949dfb3c02b97565449385d30884cd31b798fe9d8f226423070e1b682260cb81ba1824f1a04ae9c89a12f71f3156fbecdee22976c320ba58dc6c4a16534b5a4647096ad4c8814e0e1c9c041406f13edc466586898341d20ee73ffa473676e4b8916347e7d8a1031804f5b24c2a5fb6a472f35f104d76eda68b73c9d3bae10b8272abba4f7ac254f47b41d0ce3998e5c5ef9e3c9717e4f4a44f689cd7d66dbb204991c9b53ac76845cf7207a80b8290c1dd2be5cfe7b9823ac05c9433f98d12dab265e0c061ca405c90ec842caddae06edb271d69e4b0a1e3469b8e326eec48e316885b13b62dc89d5a1e573389bea0af0529ccbe27759eeee37fb42026edeae2e16b19f7096660a3e02c08f79b72d0d739a65596461928071adc280ba2bff9b6ce8dcedd07e88cb558903cc38a9814259b53908c1d250549c68e82460261c725c282a0f2d354efa85a9ce7152725fa3e9fbe8f80aef0d2ce643ef5146cc51d2d3372e0f8801939702420ec4056ecf1a965ad73f65a318fd214fee44fc68e92821a35c8d851d0a85103083b6ad438347015248d1fb5edb327bf18a12ac8fbb1a131a754103669d337fb410549dcc46e86cd9c82b06a5f632384d40cb229c8a9a4974a571afe93b614dc99ec7db9a56e5a7dd6c659af8514a4b54f1e5b4c681404cbffbe2c3597621705a9b7c3e383e8aecf78763a8d96d4e442501054122aa7ef9ece2ccb27889d22fda456083d4192bf5277f59d139ec14e10cdcbd3aabf6a3419cb0139414a95e6734cb39ade933641d474b229a9769a20a86439c78c10d6fa5526087315839d7e7b519d8309f2ca8fb8f50a1fa62bbc44666e792e73969a15e484e798f4af328b96207cbe24fcb7f208f57425d0d8b91cd18ebbcb3a3a36479c8a174a10346e9cf0e4e224482767e572527af62c896d984ae2cc7b522ec5284682b4bda1c3ddee7a21a851030608095267fd7d0e13a765001f4152295c43e8ce5d1a7e32d80e0e336cf4e0c6e1d573412a3a821c74ca1c84144f9549acd80882f00f4f0f42870764042966d2a3ab821061a7838b2026d3e3a645a7db075404495b96b20b3d424c0459ed8452d2dddb032282984cc9a54d2b196c27c04310c632cc461bb18ba62683ad8e056d256b0e9ee9acc38cb3206f8c1fbe2b5cbe4559105cc4a5751363419e97ff182d68b4d2c1829869bda34e9ddaff5e418c319d1ccf5629beb98220ef3389d4cd2063ac15a4d3cb58414eed2997297d41855641b84c4ad367d1dc29aa205aa59196d5e43d9c0a726fcca8280ba182f4962eaac742a720e668d234d8fb5c523205513efe53366d4a359582a453a687b689535b2205c1437c5768d02888972ffe8fd2f75d17511035a935f50d2fd50905295e4c2fa92b32950e0a92959c4dedf527485a4d6cb4c69e20e776f8d5f67cfaa29d20beba9690bb4bad1c27083227eaefd904412df7e652314d105c3429f54da5396999205fa878ad973a9820263d1e536c8c49ab752e41badc9fbd848c25c8c9d572c9d5660a329520574cd522ca4e996528418a27db83be5e2861990431d9691765154990f6e2894bda8352a28e04c1a348cbe0516bd40d09d2969213279eacc4fc0882dddce989bbc691df11045de9831637cb7fda6f0429f7df722cf71941708f39f557fef7d45f0441cf7e88f051e3d97c45904545abd5b0495e8f9f0862acdb14e3daeda1840852e9e46341f9e88be910e4906f320431cee7e41b4f58f07c2108a357fff6c3299d79429044e64d1bbf7932fe83205f774a3957ae50b31104a9dc36ed69261044b998a73626ddb60104b142f7fe27fd67fa033975257129ee072f65b9784cf7816049df94de9b0f2499c64c07bd29dc650fe41fcd0b4ace7a20a93d370f861297725493e2816c3986f43842cb7a66ee409af5a0977f3b90d4f5b8a639d58124a3e379b14407f2aec630db0ce6999f0339c7b9a8a1e32835bf1c48c22f677378beba1863e97cf587dcc081f01d83d20b973710335569d695ccc5c50dc4f63a695f9b2c064b1bc8f37331ee92d87d9d0dc4cfa3fe548fa6737d0da4ef6b93d9aa1a8839b7c12ec7301bec3410f3560e95eb294bb56820eab847134a7a78909e8120c469d7e5b598819875e4a664c14efe57ca407ab9d24ee12b64208b985b870e96d35e650ca4984f51a76fa4b655c4400c2a4267514b3d161406f29526d3de4af92fea3e97d20f4289be40ce5f428eb787b7d37b81184c9f9fff794a4ad305922e95c5ff4f9d073117c8f977e64ea7ff52e12d90d7c63ca9b09be35f2d90b2adcef73a69cc6d16c8996fc4e37a0665522c90827fd063bd6d3a46af407cf5d94fe623f3aa5620c8e8f88ffefb23d42a9052dea4695029943ca940caf09a57f79c02e1bc2fcdc25a769b5220ff797acf6929c38f1e05c255f43b2d7b8bf1732810b3b25a786511cbcd9f403639b97a3aaf9bcedc09a43ebb98c6466f0261ec5ceed774909f092459d671f1dec4529640121d457918b957655202399b98ee11d77131ea53fef02081245c2fc6147304d2bac5b01108eb15f36c4c2906b992ac4eba6a71de420cd269f5344ab4cbc6f430084ac3e26c270c622cad619f95ab310e0649e4e2fefa0b0cac42f429f52fc855a5820ef63adfad2fc8e133abc8cda0e3aabd2059aa32a57a362f08a3936aad127b17a478d25c6430517abcd605f96e7365178f317dac7341ec2837f7a793f2f3e08268326387926a5bc2bf0539c8aa68a67a5b10ed4cd7bfcfcd94a616c4179391e1839552a205316809773d4d376dce82a0e9d932a3e96541d2a0c4792719c782944fe78b41ae8b186141f03b195b43b5fb0a62d7eab87509a91bb4eb8a3679aa309d7e2b484a7e8e9bf37ff68b6105d1f3269331b47898cb2a481593c95d564a5b155590e2e8f3d0a9f4c9d153411ecdae29cb4605c93e875032daa3997c0a82cd555bacac29c899642e194f952a9196822c1ab272deae4f5a2505792cc958323457267514a48dada4535cd0b6e48a826095537eb89aac186e2888d739f462e5161424137bf1544c6349bcfd0431d489ce14dd43cec91364bbccba8b712f9ea813a4932fbd65329c20587e5e55f82c1f6336410eb253a7feabbab26882b49a2ac4e75e6f2b9920683b33dba0425def9820fa584eee79c4e5e79720c6c50b15ffb60441cf5b67858f94712b416abf52a61eb3a7922a25c8696bf4de4f25b1a64e82742e6327835b8e6ba924aa341b3cc9b33412c4d6bf4c1b8388d7132488f39d2c5338354a7f1e41d2a3d47ffcec9fad7104b2ac77353ede088206f70af1d123bb2723c899f4c4b3d68b20c851df39a65db55a459044bdb68ba7d76e8920dfa6381627db7f2922c869b2eefbe2865df210e4cd9c62ba3c6af7350439de8f7c10195e55652108d264b55650b2661d42904526bdaad20f82f851b7f4658d20889b646faa58024112a64eaec7fced8f038224933653297cde3eff03f9ab94526b613f9035dccbc6a99231c57d20ebaa7f4aa53bbb593e903367d7a42ea8bc9c7b2006dbf89e643d90948ceeefb3add4661e885194ee381663951d1ec8311fa36536ec738677205c080b2ae9d881984bc6f486a60e64fbf0111bf1ef23a703e14f7e4edf06798bcf8194c462909ff4df4d2d077207f16aba6c3cb41c07727f901be99f729fe040ccd98446b3209a83f60d24bf10623d643cbc75034169aa8fcd987f94da40509596f6dfe19bc30662caa5f3a792b249bd0692f6b7f9b8d92b9fa906824a5aebd62fdf6b990692a6e67a10292a6f4403c9d433952af1ce406ecd98454689ab8d9d1988e71b833e93958198199ff3be2d9b1b19489a5fa6d3f87ee8756320a90f1fd9b97350729d18089b625c8d135739ac0b0349e42769f5f184fa2430903cc6ddcf31285d26f405e2787b9e0f425e20cf9cb0f3d4d1ca5117c8499f7dab67b9e0395c20fa9d572afbb740124df7d142c669d66881604a09cbe9f12c10adf42c5d732c9043f75e73b6de5ff90aa4bcbe19b7a0f2a6a815c85b1f5681dcad26c42553294d5420afc811693987b5a56c0ae47b791d4f9314881e2eb6a8d2890241c6b051cc35c62003058257fc98838ae8a69827105eb35ebacb9fccc609e49c4f8d5213481b4caf7e3d69bc0b13487ef91d57354b20b67db5e7ab537fdf73e2a724902b69dabda60799470279adf793fa7f86cd11086a7492799dd708e44d967490ba79b4520c728625ebda1c3c7a490cb2f5ce9ed0e33008ee2fcabb3d6110c32bf496824130e5315faa97028324638575b42d7f41b892d1a2a5dcf54cc928a82f482a05a5e35c455d737d7bd15cccb8f2826849d7736a53919f71dd057bd71e7b9b63e6032bd0c5a94489f272ec402317868bc263db4cefe4cbd66c4dffffe618bd0541ecc7f8f2259f6ab5da8214efb4e70cfd5e416b41bc94f547b3c5e8fe3c2d527396e459983157b173b1ad177b973d3aa58be1634f5c64b1856b95a959a988957ec6edb88a4c6341ca499c698a413fa8496141ead5242e87783f191b3b500e72e0488776fe0af2563ccb9b94d6a5ae20878bd97d2c08fdca9f6a2b4839a38cd00e9de332489515e45139ff294f5f259e6522741564cd244aa51d154625ad07356aac400438727c20ad0798e3860d3474a4a92ac8b9373b9d584a1d94a6a9209f9fc7f8d8747d99840a62d62d59eb9d34e6844e41fed038ffab9ac53ba6205c766e92d5510e5a0aa2e8bf5cd1b020ce6511282948b132e5912722578f827c26d426f5f3c1f26664b08982f06126324241929f3f86ac650c0a720ed1d9a77142a8ac92c186876ee4d8919f2089bddf749e2d3a3c41d00b23d4c4e63a410c7ac294527f49dee89c20955cd21a73b4c711ca32d228091dbb4d904b657c8a97452b658c26c839f6d9c3c2b7678a6a26887e1d378993c12a7f4931410e9e27729e847a0962d62ebbee58822422376ca80595635a2b41da0f955184ee1cb486942099d8caafd1d286dae4e0868e3b814e8218f24e9accf3bf4b8214642bd6c4856c073f12c450dab4546b4619d3b191781412c49341ca85f250eac67b04b164ce39e7583932d8d21104a5a2358772ad11d7e5d1ffe799716584ad5523662127f316eebe2e826c614b9556a7ec6da21ea03214410a9d3f65d3d8397a84a38c1c9c71230739c05146228896928ea652a6f67cd91fa073c60d1b6926504490535bc7d021df5f9774085297253932658d214c29c9e41943ae85208839dd99f67c44e79010e4b8ae146ed388b0940e822cdaf5847988af65c60a826ceaefda1a93017f68d978548120adc76c73ce983cc650812862639cde8e61a3dc1e53209b36153f684ee59d9692ca99f27a4421cdbccf1915fdd0b11c3da040124ae52cd67208956e8f279054c56b3295dd0944dbe42b9f723c9a40529e2983fd688d32e51c3c9840b8647aa6b205bf64992510a396b053151d5fe3ae04e2d5e8171de4ed91048236a59dcd62ca5979f3400231c920b6dcbd944cf03802d9e295e94eeaa9335369781881ac23dabda39ae44ef56290b265e83771f22da8d507eeff57b4d0518741d28f2f5bab68da4e9b2e0cf2d85a507f353a668748f0603430147f914e9f23772dba3c4d705ff49b2e674273017082f7c26ae0c07961356e17a4da37e1f5fa93c1375c178caee65d99d6ae89bc7b4ee963dda7f8792e482a9adfd66d2abdf9202ec82175e457fdccc468b7207d96514ff24188f8b8db82f8967b2184cc5f972c1d580b62c6a0aa2bfbfc8c5075064e0bf2573c9ddd4bf674e7dccd8274a64344a998bd9305416b1c13eafec1ba4e77b12086f9a80a7a3dfac3098be26d4ad3dd2b08aabd9731464f217c73e70a72b9968789c8ee5a41dc4e953c3c68ee58413cf5d173c7d8574110d777b1e4c54cf3f7f5a0460d55902afb63ca183578a9207ca6d92833f15041de0a17eff7e19d82982b2b2fe6309e2948a15c378c1ecfa6c388570ab2798ae756b7fd3ed639298849e6ab5c956459a9f10c1c67d8d071432f053e0ab2458f27377d9faeca4e14040f4fd22a7575a12085b00f55d14aa970f9030539e710fa1b534e8988c9603bfe09623c254ebce6d19ec13d41ead4902237293d26bb2c837782207432d1bef24ecae504c94fc82b15543bdc5661f04d903d89dd76136dfd5479c13541acd8121953c9f34c56f24c90bd4acc5aae909ac131412af7f0aa4f71cf63e60cbf044168664fa94a8515598ac12d41cc9b5375ae18273f9b64f04aa45382a0692c46a78df9fcfb240842c8e5666bf9bc7a3925844b82d8d59d99428e4c0f51dac1234118addaa3f3f86a798d69704890b7a3f6a57b6966adc344e08f20a9a826177b3263071533d6e18e2056ce6bc1849039f6834e9f0ebb813782148458cdd9a7789b3d7b704690544c2ded39ebce231d86be0892597eb8be9c4b051ba9c11581d649cf7162fee924024f046134fc49ed641592c01141780d3a5a7ab3752d49077e08925ecbeb68feacb636dd10c9bf564e23636ce085209dd4de2e5de153bcfb9d1055bddc79c89197b43976a041041fc45bbaaf3f9bd2665073ec40c30541700ffbb1d33589fcda0c0f443999a7fc1602046e5fa9326ae7da69eab27a1019447afc0fc4af7effbcf5f881a0738c5dab10fb40beb2ec8e11b11e543e10637d9c4ed329a74d7e19be07d2a9cbd822de4456ae5c0fc4f4aef240f0bdb5b4793c5367f0404aeb24c36626dd81e86fe3a7740addb4273b1045f34b3be4d9f99dea4012b75c8be1a203d93395ecd0d19a97990349d6abe6d02de23f2e07b25c75ccca1b83cf1d0752d46d8fe29fa1d3860329584e9d84c86f20a9d4adabb4ed16ad1b48793466d968a5e449db40b0e0e619326503a94c4ebcb5764635d740acf472c24c5403417fc924dd3c94862e06693a8e06e2cb7c979a8f0f3ae8fd0c2971196433be66207fca315fd920747a6520bc69553c15c5faaf2703b95743a8aa2037ba3f066265b58d49566f8ab71808969dcb6a4b13067210975fd5010371bb3f75f3abb28cbe408aee5ba23ae405f205d198be5665ed77817c5266ad820c17c81d5498cc9bf4a9a0d9023145f5f67c580bc40b9d4c8f56f317390b24ed30333a69b1408c9992c9a44aad97ae40ccffd0d2cbf8e361b182212c9c5dbc8b5781b461cb5cfc762a907b37e798694ea5a64f81a04dfc678fbdaa2f92025153c55c4afdc8dd942890848a31e7641528904fe59615556a4f459f40b8b09be2e2677c994e20a5f8398ce95c2c2d7613c86e9d367754261054caaa945f0251c5c2265d8fb2494a20e8092581d4f1fa3fee3112c8d735d2adb3eb47208cfc665d5279b45feb46207bbda9cf894c793b5a0cc2ed8d522a5f07b5192506b1332b3f6c59592e0d83bc59db2a6cd68be1220cd209952153fb6cf2381864ad34aabc030ca22597d139c810afdc2f08be612cbca678cff105297f4ad18467d90b92e9cbffb959f282dcf147a91cca3e9c7641109b44f6c8cdbea6d105c1ea93ce1594e5b44b2e487fa382b820fb26692ae5740b82cc4b9bb5185293c916c43816c32a3e2bcba8164437cd6831644cc1a3b420c6d45232a6a710b5de2cc849db94bce9280b82da4dda634aa7e962170ba255b0202f740c173e2c92ef2943bde8af20ee25eddd90c993d7ae20998c12d6b7c2a46445d6ac20cb96d0187dda2ac8c1f2bdfc25135a3d5305499c5ed22965a9209ca77bc614d4c7b951414ad77cf9a544b6cca720d8788e39a7cfd3b3a6206bba5e4e3257a520c8bf956d8df13da98a14243df22dea92d997aa4641f4eed3105aa2f7ed228af2b6acdadc5eace3433d9bcaa1a55090d365483f5913963cdda020e68c9e39dcec6c92fe274896a9b5d19e20c6264fdbfc3cd96745a13b410c0b29971e7f7382949f49fcaf6e7cd09b2085d2a1b7f671bd5ad604b3592f2faf9b2e2aaf6f898cd4ac726682b4a16abd52cef1934927c004514e45f524ffbe04312e6c4d98702d414a312f7c0e35e2d6ae4a90c46793b86bf19cc4f3018e0e34258e2a2ae78afd397a12ab97c6e688dd78c7184fd4cb2d0952bb09b19231afa7a78bd09120a89cf36f7fbef841a74082e4a9b275764cea47107407e11ed3cd74acb423c816f52abd424f295d3682b01fedb4debc997f8611e437f75251b2baa01741d2dd5839784ca92248192fef29fd9cd7edb8910306356a9c4e04d9e2aafbdbd998ce4d238258b91eb7b6b38720a6df28f770f22ab99f230d1c2c6843102be998f9a57d0f5d08c2854d53393c8bf00b2204b173f014f73feb315bead083207710cd38b2648ffc0f3ae3865941905b4f78aacb4d8e1d3a26f081154ce004d181206ec9146da25d0e52a346c9816e34208e13336b2adbe2a6ff40907e1d5ee1d3089da91441fb81e01a5fed93ae080dbb0f6dcd5c7797657dcdd8669ccf88695b9a0f84bf8b716d2eedf8a8f64098bbf0fe63592eb41ec8997fe921ddf258280d1ea092060f48e581a899e6db3fd56ee4e67820299d61d4c594d2d17720ac86d6aba03734b968056e0772ffc970a6da29e5f31884ae03395426f99af62342d3a1b6605a4554ba760e7c502a670eab17125a0ec4bebee4a2555f695b1cc8ff63e16732e74029848603d1a4881f8bf55811bdc10d849141b7a5e8fbb42143ef361047efdcdb890faa7ba341b3e192a541274fa2a45cd21ab8f33457d793cb96f93465fed9eee9154438683590cec2945eccf1a23e990682f2a45f2363644c6f2cc8c1193772ecd09146a381a493d8b4fbf3995b7dd467205aee60e97aff360341c74bf2e7531853e7e128410eba0c84194d7e229ff97aa6264363dade7167e53632cea69c76b374ea942007ca410e7094d163207f0e63973786b74a4d8b81a0ad964c4e3f1d0682f6125fd7f4f8643718482553faadf0cd17c89db7c17f562f103dec586fa59915d5cda1bb408c97b2ac4f27ada5c2058252b2bf6490a32d10355dd42066bfc9d25a20d6eb9c32137156a5d459488610c202e95c64573688cfad9fbe0279b4688ad3fa512af3b60229889a6b4e198f7b7557812c3ffb75bb518120933c19ddbe140f734f81a8ba1a3f6bd229bf342924b7612d7255a61d3a53fa7c263633bd1d0552c89f4c2a26d54d27289044b54c9697f4d2a12790d42fdb680e9f749c40d013bd29bd6f02416c2ae56926107fc7b2657e9f497d09e4bc37627b5d25903d9dd411b7ec717712c89b3129bd13238164edd69bf3db4720e9faec70aada8458db0844fbb34e333391578b41161563aa69e877391331c8a7e29cc558a6611034dd955229ba299784516eaed798350a0631465febb424b75b040c82a6cae5f9cfda72ce2f889ad2e99cc673d8cffb82f041bba6d3b1518fe90539bf776cb19893bc0c2f48f1c942bafd78ecf82e882766d183cbba2087951f13f95332da5ca4e46e161784f1a0c472465e737b0b8246d3ddd6fd0d4a690ba22621bc2ea5c6e8662d08326797b71cef61262d08673b7e803070460e6ee84080057460009561ca8e34cc58800504a003e548634741c9c6022e00800aa061c00b03787512487c47f77a282001ab715cc322f03b74a491a300010082c1800200b043471a2b204000500e4a1a3938a394810001e8c8813e8d8323071a09300100000000000000023bd0193b74a01d18481c484741c3010b581d37d0280a08c02700a04387a9410001941de5d4284000ca8e7270e4a87100000ce00109c8816cece0cb0e1d366c2c00000168c0018080c6a3016fec3838cc3803ded85106193a8a0d1b0918c30c68c30602c628c301c62003ded891830c1d65d8b0918031c6b003e91003ded8d1831b270d1b36123046188816d69470118d0ceeb334cecc40396cf4e0c6b17190db8e336ea8600c30a061c69b81cc30c0185f20e8dc79d39fc89cceaf1708a73ee5dc271bef63ba0b64994b1f362753157d339019bc63708124c49a6fd64040e3cd4066ac19c80cd471c68d1d65dc48c3d8c881cab8818619389ec7d802397768c6b31cacecc007563001c5c4185ab8f262b372f46ac618592067326d9bf4be6ccef1118c8105763edfda4d4f3635afb5f35cd7cdac538e8b79c1185720c95c5a4ec65cd9308615484a0579425dfa649c51ca48018e510582d4747aa49ece630c2a74a3f9b9b6adaf2aa6962534c69802d93cee8acab11cbba61d40e0c01852283eceeac4e958ba41860ed781060e1b65638c110582aa1653e62f1a030ac45b339533bee51e43378cf104f288fc494f3a7bae99c8602ba31c1a610c2790dcf49ab9566b9a678cd1047218d9d3b1b9a45926c76002f93f7488ddc564b099eb608c251094e672f5afd678f300dda317c0610c2590c49cdf46f7510f6ce8480249a5d116645f38c6400249e84bf5fa0ee618e308e44bda7749b6770ca192c1b6630c239052533369c88c63070b4e50a386192ac3981b677c148394794e5ddc26fd0f70181b3bf852867154c60e93868e3dc10c6c50e0831804cb731bfb339ca71171063e8641cca3f36ea53cdf76b63048a5f3bb3ba6390bf50583ac633a837a348f5a32609037e9b8b1262fe7f8d52fd017d88be305d12b988c9f847eaedceea2b40ef90c1b59af58d37541dad4fc7f49a598a222c881768800e5200732015e0eb4e3060d3e7241ce5a9b5a2cac54460817e458fbef93717fdc22f18e1bad4fd92dcf1fcb243aa9ceb388e0c31624ad171fa488ef9c4e5bb5f8e4586b78eaf8f1410be2596b4aca46d6d73d356a04e16316a856edbfb834c70e34caf89005ebb194de0df12c5ac1472c3e6071bcc85a958bcced9a5e4134d963c2f3c5ae2065f52fcd9cb5561065d49eba911b35b7fa6005af829d1bf990d335af9456e16545679ca361c67fa8821c1e64c95aaa956f2c15e40d5e6a541037c8d1b9449c3e4e9152aa53e5d914a98ebc9ddb7ab97b9669f7eb67cb9a72e8efe6868f5290720e6a6327a1270531ee737c17a5320a82d6f4399fdc5bdd7b51104b27f1a4dbd4342ea1205655f8133eb796930e0a62ca4d7932e73f3e41eebdecb94f79e9670c196c4038f30439c7a3e9649d4ba993a11c3e3a41f8caa1b4f4e864edc90f4e90d3bd46cb87aaecd8c72608fb991d5bf5624e7bf9d004c1f63e8648afd218692648e1a3417b4eda287c60822033df8cca89eef9a44b9092e9cc3949179d4e5996c0dd52fea6f94e06db1937ccc00d7c54826cd94bc89327b4107c5002a143b33c5968b4d828a3dcc72448a7bcfaa266d78b9f5b093e244132a9174bf55d1ef8880471fcb545456b360f2232d8b8031f9020ff952c21fc633a56c70e127c3ce2686e296f9a551b2a7c38e2a311c788fd580429e5735d4df946d59f1f8a305667aeea544d2dc5650ba11d94167c248224fabe4fb73268563e104132b7945f4944a814ef8f439c21ae1056e38310a4946336a535bda74aa7419074109de149853eb59d2048a59982f8abe823101f80209da650b927ad8f3f580d3f10fc84921dc4a898f4693efa6035f860353ef64092a139ede9257de88168f5f9c645e9cc29ab7948eb2e5de33ccfaaf24eaf9227fda50f3c10f76aab4aa86f131f77207c4cc2faa2ad1f76209dcaa4b25d78cd9fd50dc5471d08b316e29376d5581f4407f27ebe2d71154fe2630e049713337e3517a39ee440929babd5152ddd2d1f075296b1b958a247a5a7e1404e62ecf6e2b51f6f2026fbd7f87e354277ee06528aa2efb25b2e9552f7d106821ea135cdd7ca0692c8f4b71e9ac2f1b106625d2e5329cf5c8a22aa819c5310ba54b5f343bf4d0341c7abd3adfa95660e1a489fcf627dac31ab289e8198f4b48dddb6a8ac9d19180b99655c7efb280349a98aafeb759dacd46420c7d9ac9a4176a90cf23110542d699805216ae1430cc4f81f5e4259a792d13bc3471808bac13d4ded52a54a26163ec0407cfdda2edbb1b0bd7f7c81b8bea34bf8756ee80b6ee1c30be43c0b23a3a6743edd1c7e748161f0c1858f2db0e0430b1f59e00f2ca4f17105e2e69ab63b6d41ee345650def3b3eada3e3f5545db543e65f09c8f2a9063877c4ae541bc6d863ea840d41474780a441721c75e3c8408157d488118bf735fa768e2e7b52810454d9f7291660b3ea04050bf79a699f9780277aefbb26297651ee2d6da1783f2ccfc1de1c309e44d152c77877afb68f968024183bd09d7768c0f26240e3e96401e91d916febc73685f09c41621d52ff7ac83d03f9240d4a0e362ce8e955e412410ee4ce858f44e0f1f472067bda074eea9ebe87f101f462027d9f9b1ef4d448f6290ae754f7452970da5e2f02006f1d33586e9cba4b3591968987143479fc06318a4b469423e93c8d0a582d04039d03816780883203298d82453f2e4a943069b8d73460946fdc98312977f040c721ab57e49bbff054145b6b66c967d412acbbf5eb1429856e7d10bab8135f0e04542e325d11d2fc9c8f9051ebbb8e793bcfb67557f051eba40f374c642d4dddee1910b52a5ffe0a9da3705d1e082186ffbaeca32e5bc7b0b7267d18c97f79d3e856c412c7751cffd7baa345f0ba228f1ea13fde915a4b4207b101d57419cd0b1c6591063949d89ac7e859179c88220bad4e5c8a0c74f055d2c882995ced46ee2312a2c08caa4098b13d2f22ebe57103cd3cb3d43e73c5c415e8dd760314aa9cc6f16c1a31504959358f04f6e496ff36045fbbfc92bc5b96f156455d9b6bf96cfd8d5a982a0b1f4f5a83ef152417ed7b09f53389fb71415c4dfec9c63f46cb1a69d8218eefa4e68ec9c41a83c4cc17b65a6a59db8553625aef4681c4d7729c8a63d8aa97ad2a3a6f22005495c37e5d84dd19b725682c72848663d1ef62a03050f519036b869e7a02f8d672714c4142d544ca5336d52a507288817d73475cc6f63e16d82c72788415564cca42ad883f3f004496b924978a7453d3a41f6b9d2246ed473820727eafc2b9e6db4f6d804313745bdd3fedf53b28726cadefdb153d2a426830f356f7864c24ab9a284125f690b3c30a1566cce3bfb27f081154ca0f3e07109b2c655f1b9d936e119a804c88c72821f1413a481050f4bf4c0a3125b94207caef8f3a72fc594a1499c2ffe4207d714ae732441d0a699eee7f247d31f09fdb4fb3bd38951810449e7d89129c8683258ca2388f79d19c5e64437c81dd1c5daabdd65765b7d79e7ec7f41de3e66c68b4723482aea76c8ad476d9311445ddb4ec972fc46d78b207caf7bbaf476f192154116a554543a3bf5bd6c2248dafd728c9fca7d224490e257cee6858fa9510f411e8b99c383ec39a193862068cff0979385356aac39223c0a4154cdfc23bd5c47c61221484287f8242b5e09130f8268e6e94da5c84bf01004496b8ea174ca8dcaa9f408045145548cdc478bd7900720c8415ea520e393b65f0b1e7f2028dde953bf525e0dab871f8841c9a6e0493ece275d0c1e7d20e9a7a926ed0d1964d8830fc4f8f3b9298392b99dd380c71e8816542cfb7dca95cd71e0a10782ee5d586d0a3f56ca03e1c4858b3796c60329b553959081c1e30e045535a5e5fb82ccf9bab303794fc9b0f7acd37b9a3a10740a9584e9fce05ff2143ce840eceaffa43da7c8a0931e73202595732d737c10791d399046779d1ab9216c94e240d698bdf675720f381034a68c59cb2f99b4ebf106b25cca3699a2a653baf3700331ae840ee257b781189a733983ee3cd840ac2e95af4dc7bf51298f3590477e9af533a9871ab4f1ac5ab9d2b890bdefd129f622f74803414ffcf5c85c36163f0f349082ad9cacabee710682852ead7ecf3ccc402a4f1a32ca82d2e92c1e6520a7e7ff36152cc728150f321cc1630ce4a09256ca3978cc24f3d3808718c81f7f514ec8ce120d59083cc24010dae453a8fc98ff520c8e327260e38c1b64ecb8e1033074f3b1f7b2f99d9a21a3997764980c96f43370e44836d874f817481ab43b7aa5663125cd5176d8b88123f0f00231fdcb092927fb2ba7e82865d8d871a30c34747874012f612eda1c3bd0f0e00229e998f94d5a0a3db6401221e641aaa6cd6dc6430b2415af4559b01a3bf0c002b12c7335d9598cfcf415089f1ad393c554e2ceb50249937ec7c5038d29a8e4adc5620269381a8903e290200c6234cb0300531308001048260d85a2c158a0278a2e0f14800265281c32322622221c12101a20120cc6816018100c84c2803018100c0643a1504044932bce07066fef0303c11ff11f9d3889dfb30c4b3f4a3e670479edbc0733577a0c4bd77d5ee85e670879e8d0b770cf16223f7bc053f6b195abc85909870887b294a546888bf39175b7cd72b90f667cdae405902051c8365f4dadb69eea9403f2776c5704abb428ffd6f1c626b596a5e4bcb8b17aa8632e22fe70c1521dfbcfbc3af061037b4f467a220da0af29db8ba8f4a7564c1fa6d9cd901aee26bdd1ba2cc481814c302857da5619568ad7f1e4a2e75a200902f84281f602c92e46d636ebaac596af63c0c1da93cdd924970a4480c6655546a94a93b46a025740141e40b539b62065d686510d178f736baf1a7fc99fda72b77557b9224f50f4af7809f9e9e8d0d28da65a1da0c48cb64829495fbad0e112e280557e307863af2f410bc34b8ba5d2b5d0b1f5e3a96dd9121660e9f24fdfc59752d1424cb5ba63203741de0839dca5ac9a0972342732ab0967eb82b3fdf6e9687ac8dd4ec0276114ba00c5bc11c4327572bb3bd97d8c1a9f692d2698c68d37f4104bbe61c9a7303b3ad6a8f3914a2f25d0f105fa6f664028a01840da1bc71814327c36e8aca0dc813e082e1b555a3af6631a06d16202de3446ad3834666c0acc54128c381352d1cc02bf28a777740e82b418d1270261295e5eafb445276b01c269191be79b82c588e6e6c030f8c1da4cb67e54b6c0b6d07b368beb2d9ee1c1864e2e519d4de8d7ac2043c3604a861fdbdcc18c7b7f5180c9b936bf7df1911822993700952889173d61aa8f1a4d404fe5ab316d8473cd2e058dfe1fb231bd8b52810c976e243bb6cc4ad072988c91762f490cfc361a9958ca01ca611292c5fb5c115b41046422dfc4a246d3d57ff53bdca185b3044c0e7a20dec3d84dd971b2385e9916b654d8c334f8111b270c4bd58d4356fea8202b91709de3c81ef38721cee1730fc4b70daf121d56434cc08452a634c82720616516d2af59247ceebd3e4121b2c2f70d2c190cde740453be5b687183949117cbb135ae85e873aa98d7943107a7184caa1468a68c2df6be6b692823cf98267ea235d193751dc526e9804798dcc1c69b63c9206d5f068714ed37312519bd4771721a00b2215177291abbe7265b850f4d685e6f5042049f1e11846413c40edddb9923a4afcfb0ad89d9112a54fbfdb505339abefffc0bb7bd50c43e4719521aa8b2c2d0f3a2ae370eb8dcf76a1b78108122a1f994b610710cc1d5be206024814541c471b857a16ac0c00ae6baa4160b1f32593cdef769e5d642d45ae76adbb12e788e922062e5826bb7b798d89531413dd1d7b2c08305745560d4f3731d10609a1f60f24b5a140565355b8f38e0945ea476e91b71c99ec9aaa6868b74476f49054c7689ee155d5898f679f7ef830e44fec494928e6d9647069c7cc1f05e340d7adfaab8cf8d38f0f1a812853ee99c88af0f453d57e05d47ecbe2d8daef170d53ad76d8a772e8dcd905215ab7844ebf7d5a8a49d420548221ff69c4bb916be28dda17117588e456d17c22a35038c6eb3cbd9d257fc9f9038785ec4bd7df15d6a3fceab0310cb33ae23e760e52c66027ab73865a902a01134cdbe39b6ad2776e555b489d44f46f387f51efcca928070cac0d6dbfb85136369e55949746fcc81bcdd7cfc69b04616f54bd0edb985a158f181038680dfdd581619aa18acd7d84a91ad6e50bc7d8663b42a72b8c8ce419c624d386fab6a3a944431afa3ae1fbb24c027db5bab92767c6eced47d3e73a5a03adda3e99085286bc7b273f1760be7272ff2fdcc9a9b94ec28df682d6b517d0146767cd8e7d93021729d9777945fe2027fba39de8a91b146370c98d2ccb5bef184d85cf3ff24e3f171ac240a4594cdd65c9c443dd0d77dd53896fe0134160f9547134422bcc3287fdddb4481cecad4a51cf45feec3eff4c4564cc6b29fe867c7705c4907c86cce85a5e6ae79c799a569c5121848da4545ecb8ddc4cfd16ba30830ba32ebe2e497f034234b08990edf62351b8d700b2394347d16268c0a23777783ddec430992b2eaa9f40bf4b5d50f611dbe912799d0904186c284669b6912672ac389229047fb954d5057994670a618da7e872381f8bcaae9bffbe3d3ae97f06225fadd479e2965fdb4e35bb578809721ceda25a68c5756440baeeebd75a4d604db0ab993737ec22e5976b075c7581a7eabbdf34108ab28fae0a75a27feb878d4bf340013581fc9550915f98a3d2d6ecbeebe04c3975905267c75b7a9fb078e8d274383225346eec3ae5bc34e6042b9bf8dcb507f11e3c2b487e758ffd2583b9b2cda72a4cef0a55fe15d935a35abc3acbda8b7121c6dc054c465ae62a8addb82cc8c823489440196ef960297a90400b38d4c2b2193dc082cfecce00e4d3e9ba91fcb4a4920a63c0dc3ef60a72cb31806f0e410c99b4987165926b760035c66ccefbdbe094a59986be3aee4be51c4d16e53b2b5c08797a08746d5c000a7afc0c906e960896299cb0d4bbc3adfb6842c67dea212c7236527f5ca00f2ed44ebd53d27bcd44da15b6a18fa45496aafa8fa42ba0de9b87070fba47e2a87082c118cff77c54c71892dba80a573851e51700110d28c18c3bf81611729d7b7deb34badc3a1f1b4f358c0c2e6df6867cb9d752824dbb9f647ed1f5ee74f5e00961e77630012ae8360ee681524988902cf8239356bc613b9adc5d11f1b6f5da2c45e8b5da092d082fdc1a98ed5b88107a315e6390c596204f17b9533688c91899092b1ec76b11c11f27188b6dbea77f675b64f6e43217248769b8126141db2d7af336181c2f0c8bde9b2710b971e07445845712144f58b81a7fe47549e2b10c6fdfd0d545ebe7e21f5ca831bd0fad8f3d26b0ea4831af98076ddf6472ee2a532f044426a1b90978a5069af43084d048ee86a309e02aa5a26c228d2711461468d8b2bf25bc2464a2962500df72c6d300108d9ecaf9ca596b6029e5152742c9e2dc0abb22ee890b98a1294a5eb69444e46760c11ff2dcbb2190939ff2c003001b1946f7b6a82bdb7dab6a68d1415a822a8e6f5514b64e3e8489edeaf0cd5932f12675e1515631bf22911f4cef040f7e915da379964e66e9a383933015bf39cf4edd8f217debe0d1fd2411c83a5fb0c61df22c43c481ec2b7df0956b86e597117d26c75a4a3f934bb6494f978e8be525f4aac458011292dfc5a85db1b11b1fcf68ad2fdbbeff640bb60bdd4c881220c82d140ec3deea901a6db38d540a3063a92e2e3d8d29316417c39bb87d8a1f2e41d3702a1f0fd27d36d940bc6acfd16634febca0caef30234c79f295520f4eddf7a68be4195f569440f4e62e3a9d26212d88f4c73242c072a29e94f5b36520c9a9944173433b44e97961a5babb38a76d8f67aeb1ea973434770f7190d65bb56bed3786ad40eb248daf410e57488492d8ac7ed9050b846e6e6c5b99df6ea3e155110e218943b99df6a1e78a70ecdca200bcaf0e47b4fdc5eaa4f85fcb648890e6fc51301db6d4e6f71255ad2aed3eab5932d47d66bdd7a98965fb868aa0c27f811310efe56cc8e6ec7dc087a9b52584d5288c28d14aca24c3341259a4a4a68c86ca276f855539c81e9b65e22f67273d1c7e1eea0f7d609b5c1f420a5648493a7c82191e8fae335643f2ad93455dc95113c506ebe6186525c978724c5d8b0a4c6d9fce0abff4fcf0f3379461c111473a9f36ef9a5ac616368303861d648005d9b8e7845454ed5d4903e1ddaf502ee6aeacb4bc14fc2e19651355e6cd365239c7fd3af535a2ea9ded3c2b1a3fc10ce0580e9d99ed881fd647479120fc36462618259ec23dee403869393efb9f2a903f83902608212ce32daf72e7d6b011e23ead7895e7c90327e60d3b1a5da8323f2a5f6dc7de754373be5f383bcce2fbcac543dd3bb8dd9a8b777807868eec247d2ec7b01d517c9e33e3354e3445e5a85a16ca6bf8485aba962420868b8fe5dd17af3790127e95136d51b15ab0ffde8fc186d56a0a354d21882f3d086426e03711c695b5d5b2aae89422d9230b0c464b5c1e35753db9c7e6768f31a2eda8b1ecdd7b6277dbd10c7830f332e982867bd9191b10c758cadfc5f868e074bdd7902432def49522a0e442cd3e00fe22a3e9c008a8882cdb4bcc001e074802af8cd022338cb60b45064424c5667de87414d37fde9f97b656cf8a9e42b6e660709875103767455fb1ad31f899f706fd729c0c0c3d69b703087c6a43367989fd3b74a7c1807fa3dcdc677f89e650cd8ec4061ae2dfcad7183d00becbca6e94d0dffe5410eeec75335fafef9958a92cb51785cdbf60deb086023123968e0b642be2c0412f45e4021055db6a5966ce57a7db88a068776ad98e4818ad39c21ab84342d1ac04504b94ad97006f07200786c5c7022135f190ca6d7ab13b1de7bee3d47510d73cc42cbd487ba677d6556105368e74b02171d61a766b9e54ddd720edb2dc9eda484f6fedb874c0dca7b0b0809ade5d88598fa15a74a1c7246570586f2450e966109be4dcdcf6a7543143b3f1b6d942bf12adcfddd5e927c88f9dcea2b65f4a8796484d912f6e4b090a016b1025fa518c092a52ac34e9721b020f5892620c1be5abafe8593374e5892b3dbac34369326b47e02e88dcd10ae2f46168f814e5da8c567781582384cf57326c48e81730488de44b9a8ec879b3b1d0898409582e7f4c63597944009f5d4de3389097644aea4a8195bcf04f287d6d2496065902990b0ca9a3c21976421210ad5b2f3baad261a9912a359722935686a265a417d65c1340e41bd86cb8fa8b0e195769952739517549f02018406edd99564336f0d68e1114d3a1f49d023ecfbb056e13c886f3ace5985c1dbdfecb59bbdd33fcd6aeac504a4176fa0db62c29302885734a1d333c44b6a751c3a301be55ccba68b38b0b7d23d65635a1f11c7c1cbcc296b8ec0d864c1b158e36821b187ac835fc6b29b4461819eaade0b47415f181d9e576ae8946d35ef7c93ca80d6c619156a274d5099eb3d0b8ec06e473f2973f8dd74a398489da11b2622c776c753c7f96b14584c9f0f44def1e32a03a52e3fe4cc481ee7c19a0d0427b5b7ddf10df767c68210c7dc1f1786cf99bc7ad45e99404d1e4ac79d40cf56a93a83ed4d23c746a97bde8408f0dcc0566d3a2ae39e2eece61cbd32864bd79cca0d2491cb67c71f8ada966227e0b5e48627f6ffd45f9900d60519e3d3ebfb7d7e8364c91328dc963924aab88801ca24b4a56dc74a093dea79e319bce210f7cdbe7e91da78645369d5eae03da6bb17a2d3b0a5b2e6a26d55ddbe843902c2960683353a97d3bbfb2e41d668a7203f6549f4e205c6ec908a5da04b5eb93b93891f74973cb58ebc320f8d572090a287f5531d576fb3a95856105aed3f62873dba5ff7b8004d895be3a4dcf0aa128bd4eeb3911724c2746357b02dcb4c05901652e8a9b5fa03de23ecac378f438785171f3743a4d1f7e23d91c6bf2e94197665c28b574d226bc136e19674e9ee66b8ba29274997e12dfd0eb7a4d0218c5c6342261c2463e0e0c45fe1c50b8c64ead59f263f528fe46a765b1077a8580ea9c496a290b6da44b7cf415ca60e624db40cda020ff6258e2906a9c53988a1175a776667369348808b230b52bacde0ddc4901b6a98810ed765dc4ff669b2d3be0b5ac0061a707d5563ca126cb0cc8d44c0c04154d113f8649504e890306fcbcfdb1a631234d0d3d7113fac59b62a90d0ab8c071da718b97d8412c64a17833334a905b15d37e1b9e10d2e9a4b83840ae8490a338af30e7d6b3fb372a9f69ada74bc4d1579f478dc6612e6d9cc956a0843060bfd91c14f74b29ee532d805b4f483c0be262f471ac3ce8d11940bbd912694d94a6e3ef7357f0baee5f9322cd7568f1ae26c276d1631eda438101f0e53bc04aeabf6dc94f10c85ac3b522c60803279298c060740d402ec4cf4661bebb273669a2243b67ebca222d676bc2b99dc71112ebc4022bee6b70873774f23ba665a84631592ca7d1934ec8d083092ba95a16aa5d04cc250ec923ecc6173b05288d2e132791f66385212f80b7b66966252e064e01384b748cb4130b45513980ac92589a71914f94f549ac9e06dfc496926eb41be6378ca4841b9bf0cf7cdc39ec5ebf4024969ce9acae021c27a5c1f3a5d993727c471b29dd499d23f42a700d78855c86ce0cf2a6272c6ddff3331d3a3b0fdb340704258b95b4449af0bb474da3bc5818d2de2574548d208911e8ff18574347faf4f3b217d4492ccf1fc65ff75387d36ecd3a2498221822418cd149b06624deb422473d8dc30186eb066080f602511d444b410473b57889ff92cc84b3617a93669bd329ee5814df7facc80358392b3f149787eb8bb9cd68d4bac2f8ad8b9626df7a90c1de6ee575172aa93dc460227c6f2e01c7284c6c2840b93f3ded9d2b37ac3ed340dcee67f8fbb43e3aca7095c44861b888bce7cae1ca96374e8e993fcd4cfbf5ef482b804106d017d582723473b12adebdc136fbd40b00d642e7fd0c88e5b3ad36b39b807fc5c4f40178318ba682d5b26c9dce39e4672406b1c92b80b390f0326656444aa616c663ac39a5a82215ae784a3f0a01c05146140098a98d5c9cf0015ad791dfd48857b25f082eb6b22d89ad3a434ceb1e3f44d6b7d81ec12e2a8753559ea13de01cf7ada2699596203d14d2323c3015ac0bb948f1d6158922358d5bb3392f0a0842d79f2320eae6003616c63806bde99a45fad3d6cc0e4965469cf5118256b1ee049d7d398e863959878bc6d1adee5456c8a0135e0ff118f8f192d84e93e42ae9d3831522d5fa1fa65467a84c207b06fb66df9e7ce9d6d058c8e426705370d1564159a9ff8008ac239a73a9313feadbdae2a54bbd9ea472b5ca9f033c46c46119440bffeeca85081f94b214b69a3f64d1cbd82e2d44c58a9f4f031343743430dd4eaff2908067ef30b12fe24d5fcfe798577cb590afdfe632167973848ea10986f63cdeb2914d9cab14434c2400320083ea62ab529ea8a3bdcb48fe741c4ee6013029d7ab0e6ef3b2018b5255c5802805e9ee1e1ba40551eb7abf5126794a0cf87c9bfa7bc6a4b247ed3a7d266ca7eb731af1c98d9e0f4b365f03225a8182a6843d23f2b139aba2fd3bd7a72b6210d64484e7a2a23b5df30a7cb605de1c941f778f80961853e00bef583ee941f79c6ed1468c742662ec7ce6237096ae3a1e8cc3bc42ac31ec427e3af4ea5a355594792fcb693410b0a9f4b5467f683b90cbc35af7b601f60c6e1acd003fcf1841514dd57c6628c6c093b61f460fa755ea7ccf4c10c8ed88872dcc697fb3971e4c0f683d6a9758ea0eaff74d06c71647e59a418fce529d916a236d006011a4a7ed5ac5d494093c66ed378b230abcbc7a805d45aec33a552a0118313ef189c1d2a97572ec7516465c660bac060f45cc21d2b2882edbf36c83a22579ab2f958ab1a4b510b6dc9a478b3ca95e6fdb1138a57fcb0b3a387894072cab46753fa3543e28b2720b544c2a6fcf737ca0978963768f7fa498eb3dd6f177976c8b465438a0c9bcaf1af2789ca1787d623018a461f70687cafc4dfbba97778989012ebe1e7dea188c274bb454001da9be987c1b651c56f01bf50b7e49abca086c5770ff586b927291b67eca844ad9f523f1008b05d14542206646da77204b999afe2351a6cdcb08b50fbe4fa2d8b5d84ffae31e495d694bf248763c6a7a028e9883cc2a53cf62a2bf22fba16d3d6a8466f707107bbb9e1e7ff0c5c94f7e46ab148971b8ee2b8cb36faad4b63100bb6ed1ecf93e49e5ce419beb13533ef161913b8e657ff3c9c43da07cee679e77d190535267805851c9522f86f09aaf4919dab212a520fcef3ac621f7159cb1c6157689b536a4da9f766a71030ec5a513bbf1fe3656b53cadc6233e519e1e1d79a6257138b0c1c068680a9d6fa881dcf740f37e60a2fa95eebfd090a2afa929c930b69232a23b5c6bf93d419a8135d27cde5e5bcf8ccf24aac8fde9ab1e0663920277876366c179e60609615301dbcca487778607a4a179700c31e1749372b0a6f8dfc5309ccec1bf0d29425075f28e6cae7e32251bc89ac1ca3572901cac1c5915151c6b67e06ed234725c98b3df4e7e0c27b9e3ea59461664d0ad6e67fc5df815379a6b88f1889fb8b5f8bf338af5e846fad7510404928b335e8fd00a50464552eef3381984f0ee65d9ee6f37696dffb937116e7eacd39c133d46b8d9ac9e6e4c3301f098d5c90d19159204b8e33524954924e6e35c5af4b3d8f47284c143185debc63cf543251f6d0a45cfef84e2916fe7788f91cbd685c040e864427754cf1856dd7d6312c715584d036cbc9e529df8f78b58dccf47848a64a72813295df735af681bb848d2ee7ac85a5a6790af921d6fd8a3839702aec6958a838a2e5d830db461fc27970f56a9ff6cbff5e61913bf2b5e0fd30e35a17a49d52baebfdc09f8ab9274f461f497bb6eba4d225f1b27aad56b34d17e28b709217cb7db9029f59d4d15bce65983f52243fd1471061030e591eaff0a96c9107120d808f81aa76ec746d70c49d35d626254fca62c34f5558a688487d3cf19a529b96cce46c58261c1a58b16b726ebe0fb44e571cf49c5ffd53867d2c446d200c92f1d2b2f792627f3c1991012b2f5a01fec87c244ec5393d3f7699bace9b59872f514a9a9c2b37f22282083a6708e497137d0a5619ea7cf3a64b56645fad3f0134acf724dade07e42cf2222b390c05720d6d0a46ed6c0ae5b09f556bd1fb713dc70c4b7c075e49eb5c54da3622d652bc72d99871631fe10b2e4c6e2396cacff617e91d8c3eb05bf9a73c65069bf2293ccce31ab2d9c57ac028b246dfa1323de5b0f35429d313a760f956a5929c82600b02ab660acee4a0968f55a822b6967ac6253f0d880fe23dc5d243bcf3ec2dd112716798c51065c67ef965d46e9bb79806134e1aff2a839dd02fbe86d58bf46e245884b52ed46378c1c058a897e4bfdc8336814033dabc5bb8af792ec057b52fba2bdf05027bd0489daeaeeaa9ac11aa0aed9f390dfac6761eef6fcafcc18c3df59d70e6e1b975e3974d1af22920d3deab24f731ba74c199382151ffb9fc03de46fb77a68fa88e797f301bc5ff6fffb8c748ef15dc2aa02afbc66818e6eeb14c37e114cbae2476962dbcd66a9d8807f71f60297e8ca89eb7e23e0157da7f697d426a748adafab0bab1637dd3b0b553f732bdbd274aea1dc9a2cc2b8eae52495801df6ebfb4b63f271b9d309f3242c4900e494c1ed3d141f612713bff316c6968a0199a43549b2deb429de218ef86902048e1b5cc2944abc4c63eef25c2ba1bcb680ee3b7d78c7d6168973a32df5a428bd499244199c66a91ee9ee068263fa6462ba799a8752e723be31c45b23e6e40c73dad314f2eea937a635769f7da508f1ba00367264748cb68a5a203afbf3b4469045b9640a119101e242e7db682e77c367093b39bd9aa0f3be17eb095d4f45400a552141777ba522caddeb0a8aadda77a41b920c3561f9a28f043436c2dde10745e4ce00b74741aa44c94b67e612a8423305440bb54a067c35820066773643bd2655442e291b085d97f65e1ea864aff1093a7eec6eeba2242f82d0b9653f84179b6b6cfa1efab84eb403d83e2a261d31db7dadb0814fbe4fa64664eb38519571639ef2ebca2041324471a6e631105f338c23497cea88cc4426d64709ba2ead38d69931b32da2ab74139855d33247d9dbaa8c9d351ce3ad857bd1458e44583759d3fb50d16da62d508dbec3072dc92154a91be59096668a4102f6f09dd9199e4bd9dd15f04b2d9258737602584f3b7cfaf4fa1ffef459870e874aa52436ef1bec08e6fe2566b07c191fab2c019eff5191b3acd8813ee3551fea999863db20b5f894b5553b34f85fc9bbba1a8a490e39201073584fc4eed9873fb85c011fb80ffd5d7d6ece18d878ac0d565db715f84a809e2ffc574a750e650bfe2b26f855cdfb3b6fdc08952732e78e64c697cf041bd00d50bba26751106cf581dbb1bf9f69f05e9fcaedbcff378cd13ebfc4818fa10a86fb1b7112a15ddd19a5d1f765f764259f44ec92df0d18ca9463deb4bc5694f070c39d3e581b853f4ada70a353c00d697b684a177ec7e4254f2a497e45aca8eae11e706c763a5d2010bc9c53b02466dd6ea4df68bb03608aa6328703d0caf9b4232f089bd76c188fbe4421396082f4230c183af89e58981954432d444c8a345a463ba21cdfd067542e8ca671587e422431a2d581a7432f711acdc9250ca406da4e20ba8b560e4d2b50ff7942a5a2f17aeb66ccecbc51bd599efbf63605fb8df38300914f811c2fb519a1a182427bf9a1492974d22189edce32ac2fcd8e08572b78401b46753f0af5a9501342b5f73f4bda4ad8d6a1b8bb1c76c798206519de02b5c3593dcd1faf046be35d54ea47e6914d01bd4aa4bdaed451d0894a8c2ebb99ad0b174eec3e194e55dc2e5b2b464bcd05662c9040b61316feb3f00203879d90b06e05373433e85ab8a3abde181b123c625b2a7db1f2e496cd6d8d5d7173ed37ab833d4d8172d29efe1e8226f6907327f6f4b51876438bff7d61a121706f78954cb01adbdb3308a6b6c3db41282f70c9d3892c869dff43a3e91561b199344068f7385b08917c67a42653dee7510fd4ed25954ac82c1f2261f9e484dc70b525392a64dd4c3e260b8490f8207f7939e45d42ab8764e78a8d222e9d8f9dbe78ea57921b51b3e1828f66a1c6cae8393a159a7c705b43f3b479bfbc0884d432a45d7c158f2c59c40b1584b7e85bc2b42e0cad3467c784a57038c89cfe69d7bc99fe1b6be71e024844a2ca4016e73150a25f67861ca23d2c92ba0b6112218e9f5fdebb547c933843b9c7b6a9899179d2291850a40e7e88076d9f7be3ad8e75b42da4411831fc8c7c786b4c0076c26082a44b9bdf4683ea83d88ddf48028b1888ce18c9e1bccb9bd483c4a07b3f311788f3c7812111e63bd498cc0bc4dbc588a32ab218d8074c54fdbc6e9cfaf07aeaa0032864f0bb7c101424c504bdc332838642edb67b2d04a1c9ee10ea60a3e32fe51b5b7376de42f078b1ffebfa48378b70407d808a54b835f188f4be8d90cb962a2efc34855d66b93167828576ee54cf895a068edba81f8b46281250e09e462a7c4565e315590ec525ccf8df45cf9e55c6b1befeb1de10117408c3222ecc6508150b7ff4207b90e3d67ef0719749ece71440eca79f2af172738795e0267d199f76e81daaa19569323b64d86b4aedac7be78771576c429fd2ce8c86f338234c371499603bb4605a808783acbc38c4929eb5adc22ec3e177b3e4ad89f6bbf9b63e6e2d9d1f10b9eb0432fe428672ca5db0d7948d9dd36314ed7e0645c9e05d0e7940f2a748061bbd0ebb23d0c032aa9e01b13a099752d9973c9209963112a999e2830abc2bfcf2e9448a2618218cb9cb9694add0cb852fa13e86f7748519bea86fb98f7e8714224220a0d8cc7632c299ad6e1518037a6bd83266560f546d43c14a98e59d332dcc409f0d131f679c8708ec41eee3a57621bc9b1e78a5daf1e4f1816f7ce68692581b3accb433bbac62b18c6d92ee31c5b904db62af3dfe1ecb541eeebd1fb06e500e3db1e03901df7514447eaebac56bf0577039e89807594c0bb5879e2d87a82502101c4c46043582343149bf9d062c35fe190f329be6fca881252623f451d823f7e6dc6d96cc2f202a5e17bf8147584e82ec11acde393672cec0c7b60a9a0b86e99fafce1d61e8f3c6e11cdf109ce4b06e2491861feee21e71143c9a82730c81ebf045ac5aefb6d1748112203af1aeed4c06a289381feafcbea4a602f65371d4bb91920baaf105b10ec1d8aed012e98554783fb24f8c3e757b89da60de9cde2500841ba217fdf43d39ec66041097b6e84c20090c23860bb284a02660f080c53c13b9584bd1cac9e3dcae9d051a92704dd5adafe089d0b40bb7fbc537f892dfef6f22df8200a55a9278a93339c448adb0fcd6f190ebb814353b471d6293abdc31dd88d6008a53d69347ee9e411a10ed2a5b322aa0322e0cc1acd92d0c6d5a5bd3e5208cc1fa0b487b6fa2225ba454b2dfcb8e83dac4183f5b6311c96f53341d237bb9e993b212bb6170712ef5a21cbd1990c4fb675aa1c5077808ffc518f2a16dc253e1ca65a96c3170f338939c54f5c65728e7a608e41fc74c75c8c44ddf06cfe3dd4844a2b3a9610c765145810f5fde301700b690fbc4a9c122c01308925bb33a89dc237fb8e985d19370aa7fb5f54e94c5220f4fa297a8e8824aa41ee8bb675e9be80a66d3451db297ab9b4d0b6e973ecae4b014662e60df65b5ebe3e565af545a01b282d41e803b828a7bba8f4202a18c22531fbdd153ef08e99f8a24f433d0b024ad59213bf1d5150c849004b3aff41df0ec4a10f9a3cf213476a81456fc0031a8d37219d185878a6f90d0ce7b0193aa3e2d12074e16f4a214d70ca2142c85f50059f41a30e04fb1e7b988b2fa871969d3197dce3d0d47773d179d3a5f856f795c0d61cde365c34699bb2c673c346b2d75296b2e471edb09164e42a25e7a4b3564691669a6c585bfffba718796d0f64033488ee54b7c902375c7044aeb3d77e58f50e46faab5ee720acc6c60107529bc08117d48207f40773b5553e56959e34fe01640854564bd6da721ec652e9888ee24af81bbd4d0ca6d5278bffb798cd0c97e6bfdf922dde75de337275437f5f1bd733ceb98374e4f83900bdef5cd09063cbd02bcd4c0c385174b05058a116a2a0bc155ded02123a647b9f21044cecd3960424d70a66aef4b36bf408b37f49d00a728f5f7f4350b71272e36667130e789d27aba6b66f6e37a940b4d5a683a6a9716a123262f55d2116da74309515f25766a5473ea08ed1b8b1e417c80be254402a8e44d8ce8a96cac1207408847c547aa74114b483a682771ce5f9330424dbf8da2e2b306a8a31ceb4428272aa93df0b069bbb8cc7aa8cc2b6d94877624c59096111581540161b73998ebcad9ed0935bb06f2927a337dd763a1d95c2c4bb8c656a86460705594c6c0fc523c6a7829dd432e5e82dfbc1b0c4c858da77bd50833afe2bace65ea28dd3b5cf70f3a63dd2003201082f40323e9d103b85542266ce1da1bca00413820bbb0182599af116e00896a8a7cdf36d15c997fc03a1ab301ee2b6daf3c0a55e5f88df85989a1ec298442fdbd03157689aa7df5b29cc5b32c4502d890387c900888887d23af1e1b07dc0d4e8ef180158fff5f89d8b4d093a6aed2f3992a63e820fd3657f500b403dc7fe7b4a48bb97bd7e142d6dcd614cd67fea9b120fc57beee57136c945991c931ca9c4ec57c30affa2bce01f02e6fc34cb83c945b01faebb4c929a0cf519b441fc1870997b319ffbf6cd2884e2dd3734bae1e3ab2937b1a2a43c36c5e24850e446d3447df4d214d2aa8a29e3cf55f71e4d2742bd0919d0dcd4ee9af06b717bd71aa657e8075e0fc440706846812e0a0bc351bbac3fbce92331d37c2bb230825e880282a5aeff880f213dd821db2b37b6fb485e16872ea5190e1548df147de29c9d72f0c178944cdf86ff14908109fb300b1d57f78487dabeb62137c3fb6b254b2f1bbb1ba60bb8e5462c3d0e0f68c16fde1f807b0800f254b42a9d47b9e1be9f32912d149cc3320f6e6e69d52b19fb0d92d23c9fce91f1699a603e82497f530c2a5255e351154e91ad07bd0a683558ca681b9b874512c12ec7b3d2be9d75746a14376f59b6df816bb8dfc7fd7bec4ef79f8ee93b1bd2890fc6fc8da7dc6fe8fbf737735ac834ba99798bbc838e25506c79d048f9f656c7ca29496e7b6a816054a0ae46858ac9dbc89d97f967311540ad71508954d4d90e49c529d4cb3065f08000e747c88ed9db4a4ede9f042b2640698e3d2ec24b13", + "0x3a636f6465": "0x52bc537646db8e0528b52ffd0058540d061e1308c819541050e938e9005f822fc197252fa2ed5713e0ba46c46f094c0fe2307326fb057d60bbce8bdfcd175f1feb2bc7604d3068f26910799b2f5ebdfc5148bbff93d098c88f368b8ee8661e889a5a2344ad1142f6de72cbb41dfe175118bdb120c23497929fdc3aea901fbf5f6ec5254f62bd59323b7e76fc0f30180c36cf35e4cfafa724fca1e767a5f2247e3bd43a5ec62ddc3617c3ae39462e821cf3b8db150a63cb17f9629075e3b88be0ec6e85aac4324d45eb2b34294e761194ed5dc9ba317da543ad5095086b2a483a9ebf1e0d13163d251face33b2511d6f11c590cb7bd712be4d16c7cfcf8507e99b5e724e8c2c797dfaf4703ff89ac1bb3f6437c14e300b805fae263731bf4f1f773e356fc9ec166e38be7cb73ec2591317a0538ea782e76128cbd5eac1bb3e28798c16556fc11472adcee845f6b99156ecd0fb7de2f032df7f0f7dc027dd963731bf4711b91be8d0591456f2c88a40e53cd6fa13706041acd5e92a22f7e63b0a4e62fb7b6f327b7b2f3376e6df339f6926c75a34a0145c098b59d9d87028ee8b23edbd12bc05167e7629781db1b189b8b5e762e038b62678f1e95249359f34abece1e3d19b6b3af97649915761d3fc41cb71eade151d36f60b8f5f60c0cb32fb3b60fc90d0c6787f345b2b5af97847e88396e3d59c357cb6f60f8de9e81e1326b7bb8cc0a7fe8ede1322b9cd2dbc3eccbac9087de3e2425a8552aaf96cfc0ed0d0c717a9e8b9d066e67e0f67a34cc961fe221a62015d9f2135c66c5af9744d6c9acf8211ee2211ee2211ee2dde1fae4ebd539d2a23482db0b7c1b03c28b0ebfe6b3b81576cde7afb815b29acf07c2add8fc8f5b1b03c28ae6db708b9bbf0c145d214ef3b98d59be8d01a1456f875ff359dc0abbe6f357dc0a59cde703e1566cfec7ad8d016145f36db8c5cd5f068aae10a7f9eb29e00810accff61077dcdaf37787eb9321bd3a4731c61170bb13bef9dc067ddc027dcbacf06bbefc7a49e4a307c30f30180c8896e7b85b6ec9ef27b7e2f7eb6dcce20fb1043b66f15b5f68d3fcf8f9706b3e67c3ad65d69ebfe2566c3e0eb7e4f95cec56dcdae6af273fc4433cc12b396de5a863bd59b275fcd6b1de2c899f8f9fb528b6ac9359fbf592c41ac68e1fe221de1dae4fdeab7324630cc3ed05be8dc1c674b8f5fee3d6c660b0de6fdcda184c4cef3b6ec5de2f03ad2bb4e9fdee6c7df25e9da31891702be4dbc7af895b6ec5de4f6e6defb9d4722bf67eb9c50fb7de4f6e6defb9d4722bf67eb9c50fb7de4f6ec5de73a9e5d6f67eb9c50fb7de4f6ec5efb9e8258975a34a0145c098b5cde7a18023baaccf3617bb08c65e8fcf71b7ab5200116698b52dcfa3d9f8e6e5e3a59724d68d2a05140163d6365f82cb2c794e76118ccd1e7fbd599759e1d6f243bc5e92c92cf9211ee2211ee2e815e0a8f9eb25891fe2213e8a312281db9df02dcf6dd0c72dd0b7cc0abf968f5f2f497cf460f801068301d1f11c77cbadf8fde4167fbfdec62cf9218e60c72cf9d617dab43c7f3edc5a9eb3e1d6326b2fbfe2566c791c6ec5cb73b15b716b5b7ebdf8211ee2095ec9692b47cdf566c9d6fcadb9de2ce1cff3672d8a1deb64d67e3d25f15c437efc100ff1eec8fae4bd3a471ce30db8dd541db39659e1aae3b9de186c4bdb302b7e71b8dd541db39659e1aae3696f0c066b1b66c52f0ec7edaa14408419666d2fb3f6eb2599ccda0ff1e270cb5cd117bf315852efd7e356e88bdfafa9631216860f4edd83ce41abd13a68327a072da6cbe8a5f6a2c7e82c9a8aaea245d04a7d45b3a09f68271a8a5e419ba051d056b414ad82fed253f408da4b9fa053d04d74145d8266a2b168120c1d61480a4346186ac1d00986a0188a62688a2129869e184a1a126208690836c4652888a12c43450c6d1902620889212286b40c393134041235903c61c805487c80240b243d40f2c41009864680440b245420790112162099029215201933c4c51013434b2081028919244e2079634889a118209102923343251892c1501743490c79602836d4012450401285a12c5e38c10b2678a18a17ac7881042f3cf102140190c20b1d7821891738f0c2085ed8f2c2102f20bd20c40b5c0270e6052d2f30f142065e38e2852502308517b2bc1002a12d2f80c0881823608cc8c0481746b83012331203235b18818191258c28612404464060a48b910f18f180910e1849c2080e8cdcc0081246928cb4c048164658606405465460040b23293042032333307285112b8c90c04815464660a40446bc18a1c2c81446a430128511288c3c61c409234a469a30c284111118d18091238c64c04811468c30328411242129084141e80da129084541880d21324241105282d018a11e080d4148084263082141e8084261087d21048690184246106a430808425d08c940088c9009845820c485d017a19810164572504409459650240945d628f28322658a04a188108a00a108128ab051640845d428924611342217518c226414b141911914b9a248098a3051a489221a28e244101482a280248a201b048d0962232808414a415d044111a44610164132080a139482201f04d12068064160826a105446d00e82a20872220809413a08ca411018414b41610489116482a02f415904b1200809a02858420049517900a4045406680aa0250041f11346eb07401c58150174c40f095400c12a06ab180f183c39e02102cf10789cf003e907179e1ef0d48007053c38e0718327093c25e07901cf183c51e0c182c74c4b07ad25211bf0344128072d295046402101750454191796c0c21a3f63fce8c00525fcc8e2c21178622eb481da82c81b2e3c41c409750d17602e34f1d1c085215c08c20511b82044f5810b4bb8805481e08216224aa8648834a10ac10522883cc185225c30c28524178e28f2c505257e3ef04345902578967852306bd03242cb0700d0004bcb4f976f8c1f2454434841e1a7053f4a081102644388078418d1e241ab8d1c6bc82708f940d0195349c816211a10da819023841421444b3542103041dc087283204a0862031e292062e6071541ba207284202fe081823ac6852d41b8f831c50f2f404c0419230810829011b425480c809a20b20422653e190429838514e48b54526a0341c0d049d221426708f0043a45e820059142903782e800080aac20829c2088143f26e0e1e2c7169e323e4af041c20f08843ec003854f0e7cc4f0012386e1f3850f0e7c6ea093e54710d38a59029f297ca41842021f0e0029021022107183e7083fb4b0b0041694d0eac124830519f820a31261853456f8c1102b2a1b1f1741b4f8baf8624162f5072ba011248b6f065f0d5618c3e2c21a6285355cf8000e332b90b1c2182c2282b4aca0031c4ec0e1068e25e068c20a2c5841052b60b1c209523be811420f1b3d6bf4008195a5e707ab2d5a68f08029728691345a40c287831f23f8d1c68f2a3e227466a012824e0c8428810a03480f524008d9006a0c9d1da890e573e2a7043a63a07290030837425c042e2041478c33f121015103e5858e18214ba496a013068f1428307472a0f3058a0b14193a660849ea59d29141ca8c1e3474702064089d1a0871e21b42870b214a3a6ae4f0018f255065f48891a30729188f171e12a49c90638c8e0d3e2656374829e1a70a211950b1117482225d8474d14123a5861134844cc183c42304cf123c43f06c8027032b9cc163c40a3950010c0f123f849848b49cd032f393c50f172a28a1420882941094041e29a800fb89e2a7091e312a00a113849d2738072fa080c9603478d0688520880c74cef0193a3dd04943e70c1d1ee894a143868e0e749674c0d0f142e7063a617468a0f3021d30421ed081818e163a2ea8661089029129d424fc90c2052e3a42d42054346a11826c51d3f001061124b890258819d5093a5b884881c8997a847a860e103969d428e49c51cfe488a96fe4f0a04a21c70c1d580e1a750a150a393dc8514327091d0ee87840a7034156509f20c484da84ca843a835a4695811441ce167507f104750c1f2da82ea82da85dea07aa076a524522080caa0682b8808e01ae01022107991c43e05923958194065e30e22ae019806f0cbd0146017c0268066402e8469035c02404498347093c4cc821424e16392ff021c60520829ce1c38cda868f307c90f1d1031f3bf021860f1df858f2a1860f367cac71b3e5468b0f20f818828f347c10c1c70f7c8ca1f162b6e18307467c80030a3e5cc0e30394192d245011f858c1b7850f27703081c70644924084093dcce078428f347892702841880b585b70a0c079c247042a984027081e58f058010f2b8a3cb182014f153c3c3064044143f06c2124043c2ce03963c71ab3055c021e2b8034b083044259fca000350321483a2dd0d902e502941642885829b10a010b3d70818c1026503400fa802a08a830281c0829037503d45210255a6c14f900aa8b16115035f844e04211827c40052826098480691d61c7085a53b4d270c1084536d073860e135488828519804140f1a025a615041e18fc8015f1800b43f09941cf98a012b4cc407db1a30a1f6078be1072049e32563af8b050418a4f0539d40032a2550625c6f7448f194538803a83052f78beb48a10c4033c34d089f98801cf0a7c6cd11a426b8d9f255a40a061680d641142a490460ca922c719201200788206073436a0a901cd0c50b11f1c4c333c4e309ff0c1802788ef053c598814a18a09c2021e26e0016285c42a690531448cf06941a48d1578b0eac203e3f1658532563063c5019512aa107c6204694155a30e8105848f1c1081828f327c8ce1e38b0f4ced4145c21783cf8c8f8ccf8bef8c0f8d2f8c55078a8cf9be586d60e5812245f896561f5825f1811157f025a1880f8af480474b1129725890b3822152f0bcc1d3021514aa27544ea894544da89810c225f584202f3c64f068d11ad31202cf09789ef0a382203482c4f084d152a3452648972244f894f840f07529e2a59679210531073eda78a10924357081083d6050628286904283c708423f0842c19fd013868fa4a0275464503040bde0052780422089288244d099941b2b2e90d840a806b209159c10c281540f68085a67f04c1174c52a8c1ba41f227862b09a0190078a74e0e70b214de4c47eae6829c132008b8002934a4308172a3ca142132a28adba102ac20c41cb891f1b08492375868f2c7ec2f08c19c2e2678a1f2b86ae98492f7409ea814ce24acc0cb85086b9985c5a55ac64c0c3c62a8c0a5d540862688bd5172b1b04a9c0c80f8468f0a3082148a06c303520991082042439e03933a484a4053c64864c502489151873073c66e8fce0c7892240f020e167053f60a06200d401214fbc80444e0d82aa081a411011281df0986045831f303c9410d281a0229048114404432f08ca80500764077e66200404487080dac150133a63e6153f2ce091411130b80beac40f0d907c21048a1734304df033022149acc07c8919048329a22444cc0b53acbc102202236adc3c010eb1c2811023ac8cf879c190164243042d41052682489033032430f8d1e2c70b940c7e4280440c242e688901444c91a4202e48a658d5e06749880c90a031e4e587091d200cc160471143219847f478a1e38322301f12f85ce163854f1540ca40e245881a42a210d2864e179405130a730a14080a9b676810f38d1905fa654a8166092286e60bca058dd118b89084173e20848a1c19d02d80940002c18f0c78a2f851e2e9426805422ef8f122d482940e84d0f801c48f144265f8504a8991c3450e0d72c0e4d8a08523f050f1d3c5cf133f2910d2418b8c1f43f08c8047053f30f8d9e227c623841f46acb4f889c18f0b7ebef064f153039e19fc40c1a3c68f087e4ef07383203378c204112148084145085a419011a9314156041d91d345912a5e4812f2414e18540b788a60042674c6678b10117eb0e0e1c10b5f5059a888b03ab303881d30006c00001c08a2250897205b88c4887441840b16c06061898530762cedc8c10e318884217203223658018a15a458218aaa4415415da29aa07ef94cf09de0fbb283cc0e22ec18820a6178005104043c82f834f025ad0066051aac30838f042a7ca102182b7460850face00115622a74a10217428620a4084288507150bfa85e0c616288d290265a00a385a516c200bf00c300c1b801c18d123721103286901d0821a34709134ccf125a88410b5cb4104b4de183a5ce083933048821b016d66821082db041640744c41029c327083e647c84e0f3049f28f840017442a2007c0284c18c02dc6226e1d3850f181f19ec18b3c3c54e173b31d00ab004e0152d1461d5849513401e80678066ec88c18ed88e2d7686d8296287081e3178aee099024f10785cc0b3031e28f0fc8007083c3ae0b9014f1a3f88e0698367093c5e0885119a22688d2032738b900a261bd306431b9861cca529c60c33bb784189223a28e2c5ac628e607a1112420804930373035388893487104a825019d904e903e98664824443fe400a412a410641f64002418a91652412e419d20cd98654433a4192916bc82448366411a41939461a411e41f2400e41a621972089506449880c59027985549220904ec8276408e412720a49858c427a911f9052c82e120aa984f440113124103288d8059fe129b014f80d36023381dd6036f8082c045e0297e12230190e02278189c0436025701b8c84173cc038601d7018fc057bc13760308a84c151700c380601f6c22a602a9805bc82225ff009f8056c02c682afe02a780b4e014fc1246017b0146c05b78047c02828b283175410651081107f108310c1884b4422e210718ca883095cc921aac0872844e4126115f8a189952a0f70000e1250800d09880106041ca0061a6658420025321069e167c80b0100400cc20b828bbd710719134b222b4d26c0644a13221e9830e1a2d4210a111326271f9f1c15e800c5890f13b8c9c162898a9a1055c921869d9c140cc9410114284d728002a589004ec0431105a21041f9b244443b309152c4a488070a3821aa404f8e09d60a14274d8a8874604244b4c38f9c12ac941da2386162812a443e5061e2644a174521eac1024d6a78ce154b94431429519834c9218a1403e4d03d72acd0414a0e443ae4e49060ad5880e889150b102d4900985385152703683067042ee478d9c9a1626972a6582996871ca44c21bac98962abf84001273b449192031327539a68024d5c3872a0f891f344508e13ab831326454456aaf890c38e1ca5b542e484024c9c4ce926537488d2a44a0c3e729a28fa8128ca4e0e1316287252450a0f453e34c9c911c15ab14204a547ce1235394a84608ba2f8202507263b342182822307045ba5871e7a982195d345859c0fac0e445128e0c44a141f98e420e58a131fa810b5723cb0454456987460ad38b162811d888826c0c4c994b6c00e4444ae1c39496c911529509854913285a80a0776072952aa4c6132c5090f56aa1045a980142616207a02e66c60ad10f160a509142b4c7420720265ca9426517cc8c94162ad1015f930c58a131d72e424d51c0d2c5195294c88aa38f1810a5115265676b832452727035b1485a807a2a226455676b832859573c45a212a9272850993285270728c581eac34e181890526c0a4082b5088a24469c2430e4ca6f4508507263a44f141ca04a23821a2288a941c9850e9418721d64a0f4daa3499c2a48a14a495b2038f1c21d64a5114a22b44395c96a8a8890e4e7488d2240720395b9648072939f4c8d1b255a4ec6085c84a96b552e4c394221fa4f0e404d1830f56ac34512107886d52d444072651a438d181a8c88a132b5588a6fcc881ad15a22a52726062812227509c4ca00914274dae34b98f336b658a0f52aa5080890f1f53582b55a41459912243932a4d6a58f990c256c0c994ae42f4a48a1406d000fa786389887c20f2e10036e84044010a34b181051f51d82645527ca0c2c44a14264ea63405a23879d2a42801383ea0b0528a983c61897288d2044a9309309152c4c44a51142752767c98592b3a54695201a22a4c2810c5890e5188a6307132a5ad409122a58628529c143589e2a4072906a83e9cb0569ee440c4430e4d582b455188aa10f110c5c97d30218a931d6e7cb8b13938b112c54995a21f88985800ca94294d985421d2018a131f5c4f729002c585e363096b85870f256c1326383e92b03d306952d4448726454433a87c94b98013284d9c143989e204870f24ec931ca440990013a2221f7220fa8188c6c711b68a1401741b89a04ca04951141f76605294035115273a4471c284c98e19704ca17d21e388287a8fb88dc1601d8fe48ecccbe2658953a2367570361c9c6dd3c1d9b66ddb984e9a6db67c62668e94329572aec44199299dcc534a69c3ccbc316e8cbbbc91ee4e9632ca8d4b296566a6bb9b9cbb94e7d2dd38ee4d5c6daea489579bd9e4ac9392661acb93c652ca9394cc268d4eb9f4a3cb1f4fc99327dd9d3c79eeee049a508e73755667714829e54637ba946e31524a4d1ba554a6b4a5da04b5b92a497160c964aea675734e4955544a2a699492b2a473ca18bb9daa8ed967b7ca65cdc98c9200b310639494258d546ab31bc272638e41987723c0922c519297e54e6d71d089929287e70a524aa6a66566a9c91865a7824077dab873eea472b59573abdbf2d87d00b3a4da7633959adcf1d464c7546adaa63ac99407903959f260964c1d207969ec32a9c98d9b940db8214ac92ba92771ec763491294b962629358d6bb4c9cbccbb5152aaa2ecc93853cc92535288fc4e3b94019399b56e4ff3f49d16703a514fdbe44ee66e519379521959c3c13fd68615b0492997999929534a29cf9e7657ceb9bbcd39b739a3d4b4a9f1b6bb4d29e5f4a494524a1a66d624a56b434d0d955ac709c0a194fea09e4480644f4e8d0fb03f9ec73548a621ca3925ff0c611b96924e969272dc9d9e67e35596d5c6f33c03c49a1a49d7666d3c0f07087a2849a5dc4d63c92c375bdee49c34d249299d9c511a59f20c426847a746299d944a0aeef6581e91ce2092f2ae941a53a65372645e9e3c234f9edb4a161740d2c8949952ca319d94d21825dd6c728aeea4cc9a94332ea13c270e3997f2eedc9697256f6a575bde5d4925a574521c934e9f3929a59c993893b4d3648a67c63b774a6dca5d6d93bc0460254c2365197fa4a6e4c98b8399e6b8d965cea2b632f2025919a39492e2c8c19429cd6edc3565d9eeae2639721677974dcb6c32994c6bda35adc9c4cb2b354dfb989775ac8ed52179994a2a7923f326996764a64b99255d96a8ddb18317c53b98e58e1dbc2c70e48f23c78f25cfb81c254f2965a452d33466c9434aa94d9eda5cd6e69474ae9492512bc3c648a5ec2265d6a4a4b4eb54cc1d65eeb8e378a2db89c66da3943b1983a6ed524a25a592eeae64de9dcbddeef2ee6429e5943c254f2979ae9c92275366661824cb6d37c6dd8e57ca8e478c34d24d8b7105f9ff1b9d52ce69a3699ac633351b4d4ba269da00a63605a031338d52b28cbbbb32ee4ac9947799eed24957ee6e94bcccd44577761c378ecc94a9dc58ca4925f3e4c99ab6946edc297929a573cedd49174597eef25c66deb97432f3dc5d9e9a26792eed96e9b26439996564e6aedb9d93796ea4cbbcbbcc74e9b6514a7729a5bbcc734e6669c351ca96cc1c99797799254b5e39a5a4cc2ca5643a44a5ccd1344a376da3cc2a243d2fe4a8664e007a7226ddb64d45e9ea083522448bc46d53c52d6e5145378d529992945219a35c5e4a996e94d2549026a726e9dca4a4bb94f2524ae9c73393737653ce49b7f3a49452d28d9939e32929dda5dcb1ee42e658b64015293d10f59001e940548548872a5298b45c000091932a452bc41e767f88aaec90831428509ae0dc4ce9a1499115a21e9c14ddc7047cb0d2436485490f527488d2a44a455961b5582ee810a50913a22a4da6f42085c807a5490e52a0ac609252d4440727509a5c616245a7072745517ca85275ec50e4430f221e9814457152650a931cac38e90187c80f1580a8f0a34607284e78c8814911141f9aec40a443cf0f443a4471c2248a93263ce4b0c30e5288b47afc20a502453e9e34c92107a2272d1700f01c4100f8610200a2274da04c800905a238e1c14a131e5ea54991951f35567600408a942a3c9ee4d0640250a048a9b2420b4d88aaf0f041f48449d10f44517cf82822a2c08e1c45569cfc4084934971529443132b519a54296252e4a4871ea4b0545800fce06407a22a53aa8efd69420425879b9afd894234654a132644146852454a91151c00e800200a059c580169f6c78a05889e30c9c1099409f830855545051d88ac5821aa32a507293900710b802a4457a4e44054e5e749cb05004cc981c80a901d0bece0a40ad1159d223f2eb800001d54e84154d4a40a5114220a30696245871c889848299a62812a39e898a0105d2182c2e487263de45c89422451fbc3248a142756aa105d61420129509850208a130a50400a1426453f10edb81285480e49b980579b46d2c8c8c8e884c366a6a3686474b47538ec91917674448d4cd2c3e1281e9952464653e270148f5e47f275344d381cc523a3232323898351343a3a9246464646469ad1d1d1d1e4705823a3a3cdc8c8e848ce2323a323a3a368148f1887353232323aa23818c5c5618d8c38e270148d220e6b64746464b446468c83513c8a381c45a3233ed2240e6b6494e160148fe2913ca238ece270148f8ef868e2b047474712873d3a621c8ee251c4618f220e39643888bb1b7bb0d2640352203595545fd9b268645b86dc6166f4c573d1c3f27171c16030d14b4265c2603b666641d1c8d6d868249241a3f71c81d6b53f452313d60bc3a2d1f1dc6adbb66d196f9b8cdb4659a8f86c8c1c32465ef075534411cfc789466223e1f602df3eec3a7e875ba1101b6e853b1defa3e33b301dffed4e9c010505d71b93a24bdbe0702b81728cf0a50d24b634c18b0eb896d8c0075e6030c517d80c5cfbfd67d1f7718ba58035c7b6a9f2c56f6c29e0766c2e7a4926b3e29935cfd5f0ad7de31a16c98e37dd865b5cc665a7530db3d3e5b90c8ccd9dc06556f462e8d19359a66745b24fe7226f94a80cdce68084381d2f8ff375aca1c6c91835be09dc9014519be6ec1194de52d5f4765375ccda6196bcf6334bab0b2e18c6a61257f69e3b5abfcee68dc3adb73c90157ab8d3a748a3e0f66015163666f16d8c044b7484f5ee4e1861cde78094f89e4818f7c6aa78a363c7b3b724c27a6b18612d93cc2f7865f67e824abede4b303c6a397fa3e4d4b35249f57ecbe8211dee990ee579c1f8c5b20bfbe85179cbcb8ac3acf80803838b67fede8659f12b6e85ace687409acfab70d5f140b8c5c31ea7f95184696eaead9b0ebb0e57cddf1d8e1968a36b982c3aa7370645978602893e82b3975bf321abe97770cebdde7cc2970fbf87d9f95c59d627df9442d3059ff0e7a53703cb86e28d0ebfa636210ed727f294be5bc51ae5a3116e39c390def589f20a4ece2f98e619f8f2092c9a2f9f18a3f932353b09862b74bae9d32b00e5cb4f700ee993fce904fe34473bead1204f97dd3bf9d3e99203e34fa17c7ce62d603b96ad62d99e5d3b9775d25bb275d15bc0e6002ed1b51d0b97e8cab263c9aefd86ed58b61bb66b334a1074142dffcabc27926879497f7aa67aacaa676096edd929687472d1ef0a69cfaad1c995d580643aa5607499c02ba8204949f94ee7a2fd0aeeb0938b7e3ef5ed27b480514ecdbd03959c509f1e0cf134dd43f00914eeddbdcb0e8cc2ddfb908ce0360d181eb52a3e95fa07765faf00b1a6aa0f5f8713068b479d036f38cf092f1aec8d2969e18416bdd31b73a28b1348b4e3c01b94e7799ed671e00d87026f38cffb10534ff3967877424c6bde9253cbaf8780756535cb565f47ae53e5a23dba2815485a57b90f35adaf8c5e3365d588d2677f196dcf2ad25dd991ee3255a3ad22dd452b172424ae2d472e7a7a2d935c7da28023fa1b6e1a7ddbebfb81d61bee943ec67ac3d17aa4d44c695dd9b31965bcf580dba8e5dbd8115d9a635398e9ad3bc2ed4e38a4e7394edde806d7b700ef4636bcf2be5ad5dccbbede0dde5760778ebb194ddfdff0c2e2aa36b0eb9bdd7a3660e1f1ee58bef3f87a36f078575fa87ff4ebddf02919d1f24dbcd1f2927a36d45cf50ef48e02b1d41c75ea3960c7bd67a00d3557d517ea38be2b748e76cff90bb5e35e7dd5bc4381eba201b174dff11c10cb8ed71c0788e5d5bde61a181ef552efe88d3531a6b9f59268a7609453d36ba09253d3e338c745cf01a8e3780ac4827aea2af085baea1ff842fdfb7a0ea8f98e0f310ef0957ace3bf0a8b99fce691d5dcf012fd5bdbf52a7f97a36d47c477d7df772402caf97f7ef3767170d88e5f5ead695025fafdfc7552016f0587e2c3efe32c282739ae3f86bf5578ebf6cfe51cf06d455a7de0ddf6beaebc8953a0ff0155da94a411b50f4aa8ae5bbea9cd6496f01dd77542cde51d7bcacda50732cdd535f812fefa86a8445c7736ee86a961def9eaa462797ea1e6874727dbb42b486439a0a24d4bb6a747275cfae0253ff402fba6288dfbede02befaeaee552ea85f91d52750e8b567577d88b91a0e69eda7ca1e0cf1f21a18853efb908c59765c555fd1552b969bfae2f197ea393781db3b30cb8ee75c07f85a5dc7b9ec08a55e3092b223943a3bedd94cc47ac5e8d8c317aec2afe73cc288304dc49a486a02a6b48492154c9461620c134b5d47c19bad2e3175f6d8a7d6c8f4aea191e9ecb2b9d753b26b7416002db1f9832b609d5debac395447c11bfa0dbca155496737f5d6eb2911524617b0ce5312002d31250b4612ea39f5155d2fb0e67c7f3dc7c7578d70eebd4735c2b942fb771c4474bc0a44ba4bf51b10e9aeee29d028751ce7518dbae35055a3d453f7be037c1db96a2a1754bd820a927e126e14126e2c09a48ea7df8eae158874d76b7bfd8574975177ef35d701be7254a3ae3b8ebf8c688ea322dd85ba4d45baaba61ad154a4bbbaca4555b32071a9deddab595267ce9c39e30a379604ac632df26858313ad61e3e303aa4547c6928bbd43f526a53d71df5f995409fdfbc05a09efa2781b2a48eaa48aa7a45f623d7bce615e0a8b34aeb13ad2ae0c8f5b10bf569f46daf08837d3f6cacded0a3cee52ed4b387533aab37b4daf0c58738747cfc4aa054c5e2bdfbfc168dc4facc73c06130180ce5d9d01d555fa87728af33d271b4f1d7020e7c69f953166b7a52ea258ab2cbde5d7a34c89f923a7a06f0e1eb18c1a2afb573270f8638a47f7abdd3b3f0a8e3f6cca3e1f430f693f8d376e2c7f074fef496645e122a617cac9997844a9278ee9cd6450f86989d8bde4df7ce4b349a28534ae9a5e93b641d07c6e6d68be1f41de7c052cb9f7ee37120d6cb6d5df76e33f180c1f3505d8c3d52a91b1f57f2ddf8e8e1c52f9ed7c3f3c01e28eaf5b8a9072a557373d383c7b8b9a19937cff19bd4d7c5689323cde4dcdc809e4ade78d771ef9c07de58c1ad9bd3735fcd131e3f7d48d77830f0f8e9d45b227f3a47d331773d703caf8a92cec7bbef4a52dfdef9e8de7d35a492f2c01e958a51df3c8261d781b1716e6e3ec43d62b397e4e6d2a3813b3b0eb8dd35e56e4e6fbcafee2db366c7e8c110bf7d48ee00c3d83cbcf30077ec00b7573a40da8559f43940e906b33c100c5fad02c3170d18be5060f88ab40bb7a234d3f451bac163343d977527709bf34ef54689fc93cf6b5f4f86cc0a6e79a7e73ccf3b7b8f20d14d6fac8b3038308603653800db40990d8cf990ee7af79f5e5fef9a7ade8798f33a6f49eccd74d44d47a14ecfa11a753aa5fe755d1525a713f7eda7d3e95b0db90e4c65e009dcfe50a813b89d42a14cde1296f778af462b9845ff83a71fb018fdf5b5c27e1004c175c5ed041ebc227bcc3c1aa89764634778e922ee534fc79a69c12c7af66630f5a98615e0170e462f4977a31f3afe603c97bb5ebfd10b8a24da80b9c0c3241a454802e67ad5c2e5ae7fabe1e49e85f1db43ba448ca0e927509e03c31fdaf4f56660b5e94a4e27503ed3825ba6d3902ed1f42690979845c3ae69fcd2d4093d2fc52f3462d1d4a6e9bf7f9b3e5a71fa8e5ff8e9f46c00ff4bcf86ff55ff0a9ed62759ac57c7481eddf00f37c255cbbd1161d615762dff188e5a7bd1bcac6111b792f055e5ca76f9a2f9ece1a481d5a151d3f0870ef71b4825a7b7af4703e52e50d07207daed87787a4964bdb2550da4975c6ae90cf945dc374b9aff0952c9e9f8ea8c3e0b6546f7a0f496b0ae501a4eb08e9764421ebdb12eba34b744b19352cff3f87e8b46b42f2dcf030cb96fbe2b34a453e7d143f86e3ea4c3d8371fe25da19fe61ec2977d4887dcdba3b7e4e621b7173bd630f65643cf83a148effa6c47fce8c170d41978d411bc790a0c799c716678ea3838383812c707ce39d9e1e07c88bfcf870f1fe762f7813e7c9cbd243e5229140a752e762910858452cbcb887a8fe7e8706c8f21ab5b5d666d3fea086e60181fef3d25dbd0b2c767951ad1738b9c9704f514b8fd81db9c8e2e7af12b2e7a06a0b1ca40cf6d6fd01eefd1a3470fda23e7393ddea3474e8f1e38471d0785e2b818050f308c7d73e9e3a8fb088734cec39bf3330f06f99bd83847ede0c17128d9060ac5a150600fd906a3eacd121def711def11720f1e37351c8aeb4193503d7a703d7a805cd7e33deacd92d5b9afce9dc301abccc6f90d8e4d8645eaebcd103b3bad4743cf8ea7bee3a97329903b0eb87554ea70a0dec3ca51a33431b17ba062af97845b82036ec79b6e401e1f923cc0ed1da03606b3e65760f68559f33a406a0418be4e60f8ea30c3e2b5399e7a8eba9961d67caae2009d7cb2434d4ccf6f66343136a0938f5b1b835b31c3a2e72358033af962675fb8950a6952cf73920cb754aad3e9de921f7d22c3add327c7cc614e672fc9e90c865bf1f3dcf77de76217c1efeb0df1776e773049d985318afe2ebd24df23b8ad02b7bfca6098351f953893299a3e4de0b9a3ce2238c4dcb9254222a97d7a634963901aa83786c4d20696bad51bdb4097a5c6c122298aeed11b4bd2d21a70a3717a631a28a3399a4e3bb71cd7adb7d5f0d5db23187e1d0f824877815d04eb0bbcd1c9b5ecc2b69de33a105c5704e7b32d9ace759dc92403e532f0267efba86f966ccf1ec35663186bf8eaf8a38e5e92218e601177bce6d1d0d3b1de2ce19e3af754a546306b729fe7346fc98fe6bc73dc454f49fcf6e829c91ebdc7ac2eb3622de2ee50e7d64bd5d0a853cfc070ebace33db08a12efdb95d0dcfb726bab611525db5557f27dbb57c3ec347599e5dd5b6ea96a4825b6f7ad86cbacec5f0aec2a15a3ed0d0fdc4681546273dc3d70bb0339eede125673f566c9e9a69faa24c3ac79d34f4b70cbf4791ee1f646cf9bc0a8c4ac798e870e5f761d74d0e18bfd44fbf6bcc6c3c9f764fb7628dbe8792e761c8687932f7e6e356aa00f5f177d9d552a90ee7a31164a5f380173194d325c84a00b17160bbc8e5c3b1762888bcb10d715f1d4086ec936b8157b89de0e6599e6303dcf5ee848323a1c865fd00963143d1fbd5406536314fc42fd3c8f1ec217bbf476b8f5fce4d64d762a90ee02bf3759b5e183c160301778eed8f3cb2f809f8fe02a0a89a7208f05124fbd193c1beac14bcf868367ef00ebd2a99fec898fde01d655eb267be2d73bc0bac0bab2277ed627a779d4838520c1c9ef4e1895b865baaccdc617957a7eb778d363353d82db290e49b92d4fe77607790269873a4d7e77e22cfbb6fd74daa84703ab4ff127b07b066a59f613486b763ad77ddb3c18bc9f2ec1ed1dc87d486edc9e03b73dfa3d0a0c63113773cb6d1741ef26f06689bce9d2744e825a0ce9b94ac547cfadd7d5f0d5dde90391eefabefcc2575f46a92fbb70fa6bd905f9eff2f1eb296175fc23c8bd03f91fb8ae147845772e825e0d67c777e076024d1e0cd9e325783a076e1f92a7edf343d2b4cd6011776cfacc4b429f816111478f869ea6a713ec217c51a9b7a352c7d9105390611324c1a9fd8d168cea8d65404b841d41a6776353cc7950e0e3ded8114bbdff38d6ce60383510e92eadd3b4fad26e24a48c2e602e4ddba6b2edc06a2e7651a9885b2ef9d1f2546c1f625ac3a3a60c26a15d2035abe5ace1abe719dc40a4bbb66e43ba2b7b56c3f9c2565fdb8db42fbbc0e70fc9f946cf73dc31b8dfc075ad47836cfe1053908aec59a9c83367ce9c690d5c7621dc9813687411b712b756d2d0d3b24625ae5434233ea29c1d815be696396ebb23c9c3e3f69c16d1041dcff10824ed8d1911c5342289ce7a63461cd15e6fcc883052ad3756c4133a9ecbba05a3139fa9375644998ee7b46ec118c5b7b122c674b8355ff6c68a30a34fbdb122963a7ee3169f5b2da35372dc0db5ebb367265031a9dde1dbd810647a7b7b7ba77c30180c881d62f9e8256135af50ec7d1148fda36516e339dacd15a2bd9735943eacba68958155a8ec99e617699d9d93de92545389675a7e7d42f9ed5cd6cd15e25e25f43306794d86b143f9790dbc5942cfe7fa649ebe336fc98fa675d7477e322b5e825c6aa3b05ac6cfe9d1b0665a9ec128ac9635ae0f3ff392c8478f0656cbbaebc375d3e22401b7cca5e67727dc58338b5b1b4332b361a247837cf6e825d967e0cd3e8b4f7cf141dc0a7158dce21f01c240d1c53fb736568416cd746b187bc52c3e9f822c66cdbad3716b574474e98d1181d46150f3bdded810663a4802ed7012f692ec308bcf2c66f2bdf936dcda4b707b63bd3a4734ca28b8087cf1cb71510660c0883508f3c520be48e54de56bae38e0518c46c2adc30d68720f7fe54fcf4d109c0f670c1bb3f8dc7a0bc85ec3a3963772492f89fc905cef06ed597d1db95ef2ec921af83a72c58e5b93bf12287b58247bd68e597c5a27b3f8377cdbe16cb6c1c8c5e50a2a489a3eba26286b187b9e82a1ecf90cd43e2427b8ad81ec5acf06e98a1f62096e67e0ba26036d2e36e2a3c90c0306ccd3e370ab48b6dc9a8245b295c4f80916c99e31ee80db73935bdbdc6df492c87391ced3cb4b2f89ac145c66499039d949303ec91147e6c26df86d0c894cd3de181252afaa8d38eb567fe00cf0312bc5c5057ceb11e0a8e7ac310ee0052b05c044a2b1bc7caedbb9d8ed9f6ca562d4fb901fb72eb3f68b3121dae88d09e1c51442a9e5e4b838bd021cf5322b9c7dd491935e12ca5e018e5a76193d38bd1862671fe28d5b3730c4ce9e6dc75330f6ee4c19590ace00313e01bb8d18178605faba9ecda576550a20c20cb3b6b3f3b96ecc92979f34e3cb0ff172eb0606bebccc1e3fb915d23f91e7967cf68d5bdc59d7433cc44731c630dc2ee0e35242cc021ccdcf73a9025031eaf9f9f88d3deb04b86529a53c7f4e29a724e2965b1be3f246cbef7e412e3af171bd312e4974fca2b8dde246cf67400b060673ed61bd9f5c6a722bfb3e4befb95d21d439eea83b0adcf5e96ac825a1c21d0357436eeef11d181a75171b155a316aeef3a7ef0a998e5a1f540db9cb7b3781bb3e5e0dbbcbed0852d1ce9c3933859eefc0f0a8b3af0743ecf921e6c0ed13f864d62bb1b32be1ce2ebd25f35cc3a3e66f738f60183b5e7a3064479d036f9474f462e8beeb133f2487b803a9c433bd1d05de78316837d530b6e927308c7d3a978161ececdea747c37cf6f592741f626e89be8d71d1d2f3d9b9e5b85b2f06ef5c0d677392af6c8d3aaa464fc9ecec1cb71eaa86478d7a075ed9ba3b0786b1b9ef0a7535ec0e45a8777db8731f921c28cfc58e03e5d743552ab2b327c9ee8161b6643e5b30b0209a3b7d1fbd18e299eeeaae4fc8552af14c73a75f4f866daeee02315d9ec06d13189f81db1b1861eb43af81213f03b7d7e30ff1912966417097405b52ff57fb961ccfeec3dfb2e3a80791df3244fcea42be1268cb8efaa2b9e4f12d39e7bedf24d096215b747cc7f72b09b425477de5782af51daaa7c0e7f82b477da976bee3af1cef9efa16595fdbf6afbebe6bf22f595f5b1d22feb5ddc755f7beff24d096537d9dce7c6e477dd56b3aff71d6bee32ffe8efaa2f45f7d9dfefdb5e3dcb7ccf3a82f1b9bd3d497bca9be4c07b9bfc073f525e55fdc6f5ef37defea8bd29fea4bd6578f9ffec97f7f75ffea8bd6fc45df7315fefaae427dd9d81c477de1b8a6dd477dd9f8380e0dc755f84bbb0af5e5c3247dfc65daa943b06aeaabe63870fca606078e7a9dd3e93e7a9c4edcc904e2d89143253f8d4da71c72e370d014483bde76a852bc81da27bf938683a35d8e1d393630a5a2279349729f8643d57d394cdd0e95c61b9f5220c521298e1d72fbb1c2c7710ae4ce824a85d38f1f353b3869eae9f98bdfd363ca91a39ef56d67752bacf0d7e92bac006a5aeaf53ddde93d94c5fa0b3ceb076b4be1f85ebfc20ed557380b7fe5380b3d3d7f71ef51a1e72cfc65a23f7e70e0eb5914c759fce3c78f15fed2be427dfdf8a192674105157afcd5bd87e9f53d3ede4327070beff96bc77b582c9eab505faceba8f09ebf4ed7f9ebab3bafa9e11dafffd1a3c7757cf8f8cd7be8bcc75faaf7d8fee340fe4a1d481c827316fe4a9d85b8731d160ee4af1cd7f96b7b0f0b07a71ea7e7387f81c7897f71c7b90a3737d7f1515f3deaabc7757ee3e3377f75bf897fd1ab70d65fdf5991e7c75fda7fd417cf8fd7fae2b90f1f67fd255fff321d487dadb0c277eaeba6be6e5e53739cfae2c1e337f585f39a9adffc85e337f5c5e3e63cfeeaead0f6c4ef9c059d8ee63dea8b477df1788f77ddeb5fa7d7faa2d179fd8bab53b6279ee62cfc75aa3f6c4f3c0bf5b5421d22f67057a1be4ea7dbd497cd3915cefd65aa3770f575e28e535fa777a6777f81b586ed89c7f90b4795617be259f5f503c779eaabd657bd0ae077ea4be7aff5b544d0f2042fce8860091b407281620891441850404208b688e1da027e6847ddb6271eacafd7e7a8bb3df1397565cfde478f1dc7a9af9bd579d4d7d10b5250842531535401c60b5c3b8e9408c20c24bae0c113c434e1daf197aaaeb6277e477dadeaca1e213564f5fe95aadff6c4eba89becd9e7f84b561eb6273e477de1a84344d716d56dea2bf59a3ac410d716799afa52a19eaaaf2329a8900215529871c3084970c93da34c0aa0404209335d3cc1b5453ef5d75783b6273e555fa8bab227480d837affd2ea90ed89f7ea4af6ec5f5c71d89ef8aebeb83a04cbb525fba9be8eb0408b2398c00d1d942181cb5487b86b4b0e174d50410ccce0028522b8b6f0b5bfb6cada9e78adbeb2bab2c7a786437affa2f5db133feb277bf6fb2369d4c33e67b6c096b44471818f7f6eb1b815ce8f5bf23bdc8a2d6359c6b47cc72dd9b20fc4aeb0eb706bf9e5d67e4756e136227d1bcba2d41b0bc28d0e532dcf42cfa265d1a60d5dcab96a69264df0d2fbeb0a1b6e0ef20d8f7373751eb1661d5fc19a7f1dfc98f4ea7572e03c07bf86916c5cf34bb32c23bf34ef388acf3af5e5bdd683f5f5ddd4d710c79d477dcdd8aabea68efa92af32f65a1b9bd3d4d75c924b3975269d56dfea6bfaa8738cec31fd33f5c0a9af2b6cf0749c4f57299dc6347f934acd386ee2f36feacb3b8f8a83ece1e7e0d7d4d710d9c3d7ea8b0b1097f6aebee61759467e913dfc6547e5325fca569e8e9ad57c7f71ea2f3e4a2635272dc174d457f61c35d2d4d714d9c34ab287c7c81e56923dac84a3f2981d534689da643595e62fd35f48445c273e8dd1d497e9aa1a635f7dc52fa9fa8aa8fa9249b287bbca4bb0f86575008327244dce545f5ab874ae539d7c2422ae595fa61ac7c81efe7cc6a7f5c55be558cca030032780a1021c00119762172048218432a8c8a219710db038c106c4784309d7acb14c19a5b994b434631316934af38b2cf3a58cfc9255da658c541aa3442b4d9249f3212f6967ce4c810765dc4089a4592912c7e211766006109a0863866b5d9273f0811db440882f8ce05a97ac14267b981fcdf8e2430a6ba64bbd3a46e051e41c55701b1197961dd7c2a573cdec5c562e7a792e362ed68284e3d282ba162e412ed3a93b17968b3b971dd7a6694162b9b47009727dd7c265888be65c582ed5b9ac5c5ab4a02a97952b752e9f0b754f0b1796abe65ab86c2e9b6bd1c2e573e5b8162e77adce65e5d2711c5ab8dc35f7275ecbae0bf15ab2683b2a9721ae6c7fe2b9b05c74bf027dec4fbc0eb0c7fec4e70071f6271e07c8637fe26dc09bfd89af0173f6279e0644ed4fbc0af4f627fe0353fb139f026bf6271e05d2ec4fbc077edb427c07e6d89f780ec4b13ff127d0667fe24da08efd89dfc0d5b610af81dafec46760b73ff114e4f6277e82a7fd8997e0b63ff10c9af627de6815e506b86c9ecb74d12191e5a4da663ad1ef3b2aa594ac9d1d5c57b207a7878f9c2967e43132e9f5cdd3bc84b58cc15a1eb6ff7cc75fb8d8b7fa92b018c352f5b55d1bd3923e2bd3f2f3afaebeb80c7f9932e433a1945a6ee7bed3524b8f935a761f2fbd38e915975e1b936a78b112a7e23119adaf58e6f14b6a639d8499621ac326ec8b75434c65b42ff32be37d315de3b963beaf8b7bc84aded7b57d95e8c30ff570bf543daa6e4b5e57575cfd38c954bfadae968c6a5c5add5c597d4c5ad7ac2b7b58a68e229fbee076278c65b66b19fdfe12687e4fc14f705e035f38be812f1d37aa71699f7f5d614377edaf8c7bf657d29ca7a8cfd8e67dfb6b658f1235fdf4d715367c37ed189a3a8d4b3fd51cc75f57d840f39a3127d54f7f6d191cf5a5858b97e33ab4202171e13897e87a5d6183cd71fca5a3be72542ed18543dea64698ec91afa9af3846f6c8d3542ed175aaaf21aa3a45f6c89bea0b07d923ff552ed145eb2b2ec91ef954fd0b55b9449757a3d2abab5ca22babaf1a648f3c576392eca14b33a9a992e9618ccda5ec3b6688b6654e0fe39813fdbab2871b3355a31ad7fcbab48711e6daa40666200557b2277e82973d31da1c45d696b8dd09b5322dbf49a0f00b57e14356c7be2af4d9f727d4a5c974aa583cee7c3a71158ba9eb2a9653eab1ebd84725b616667de4d7b5a5fb0ba90557aa62e150154ba76566323312c8ab5b3caf6666648f7c57b7749df61846abe1b9ba85e3eac6620d57a7bae5f42cdbb79cea66217be4670dbf0e3333a6bac5f42c5bc592259e715d31bfae2da61abfc81e0dd6b1af4a767e14f37909e365633608d359b614bd7891405b7d6d5f2490b75258ca4202755b4c02719f7c0c23814ea68a659545562c973df148cab8e429d8b16f9edb1a462af31dfb60d8f5097d427ea88589918c2f92f1694a999950531213bd70875a182d8c048a5e648ffcb67ddf6ad5a116a6a5ec09df61f402d394b4309ad2aed161b69499c99600d06106cbbc6430fa858aa15f6c3a9c6328d21c73ea7026cd2c9268873226c9c82e32c66564973065580916c60b2b99f112463343222cdc7ac50c09b79651cc17cbf862f3c3e845db8e28a38ce076087165916366ce1e4102e2ca22dfe0b14790a68b8f2075387b04c9a6c71e41c2f1b1479076b49a3da2050900ae2ccce7126df6089286638f20a572ec11241d3af60852ce6a8f20fd70c9faca8ed4826b8f6841f27165916660f25c326f8f20316a8f209d527b0489e6db23483c547b04a9d2ec11a4155c5c5ff4482d647b444b16cd8534c4c5e7225d7b0489bae41124cfb4479070b8e411a41e2e7904490597ac2f79a416e21e41da788f207d728f20ad5c7c04e9ae23482c171fe1fa9a37aa71691a67995657947eb2be905a70c953a4165caf1ad7acaf2c521ad5b8905a7071fd8db238635c152977e72eb3180728051cb9f858e4b7c82a0412179fab11c773f18b9bad0438eafd2bbaacb072d4fb2b6a6c61bfa8fd99f34787477433ea0502b89d820b10520617675cfb0952798232aeadc2168ca4f9d0d4f2c77e3d07fce8a80320a00ccc4f701fbd2537d9570bd2e6da6eba06226d2eed0b86463630ccb5dd0472097269374aa252539ad51ab46fdbf0b9b62cab54524d2b15db51cb2109eb4d0357f6845b53e62420262688345df312b4e173cdef4a59a9a49a8a39c1953dcb1c9b5042ca1996104114c204d012df5c29026ef74c022b3a7684b55c1ab8e7655d303ceaa5125b7e376e808b1fe8c01757b2b067904aec573c8a1c008e5702690fbf4cab2b7be457f64cedd9e5794b72e300d3b3dbb05ddb4eab0da667f57505bda95ef6c82a3664dfeaeb933df2f30858d74af6d04c9e5cebd2d69581eb9a60c86ab025cb27b8d8219453cbcfcb1aced34a4536bd18b6a940baeb0a79e92d31f5ac610d2da5a9b98647a1027a63121c95d87cce4a6c537d126fba0ac6e890abc4f5a12fda9aca9ee97e3a71f491c3ecf42670cf2dd17cf735bae34cbc1e87a625f3dda3b7a4bbe9dceca2178376ce04769fde92edf1b1eefac490abe91c18b2e9cad654e4146061513cca221361c6f09b4a69b40a96e8ec72eb6ec021056166d3f81a6e20238f866471eb26fb90a6af815be1ce0ddc0a5938f0c0ad70b5610a30845b1bc3c24bd39d0ebb0e378c4e878bc672eb1d6e1b40d4159ec61863163766dff8a2ac37f60eb768957d51b68449f333fe462031c993cc2bc0573e460c74f617162c469b11c3c097a6bad5507e1f663064974bb28a0564ceea9278fe8a5bdae9713e9b580a943a03697fdcdaec540a539842af776681ec33309ee9f5600b64190644c7b32c63aa823b92fafee396f7bdcd0ae73b2c6e653fea13e85d038f38ee74f90ebcd16eba97d43305b09e379d5ba2d8826f632818d3d9977ade4341999ee7ce9dba0c9ce7b8a3286f3281948b1de5a8c8e652dc9fdc2cd94ebf6da6eacd70da4ca84d3b673a7ddb74aa306837ddd45d036367118613bde974a261fe549fd087f3568e3abbe6d1f024fbfc56c3ec5d353d8b9da540c95c767f5c5a52e7b2fb933dba8664079e2a95977c0a5c17c77529705d27703b3c6a0d5c62aa4fbccf244de6f31e7297537a4ab86735f4ced51beedbe9d953e2d51bae2ed19e9dbe69db136d06a96da61a7260d8fdc6f4bd315518e8b973f50476dc4dd993d3b91ac60e331ab8baeb53a9c433a64b2ef6c904c68e447ac3235b178d3010bd470d09e296348a4727ee86e038198327c3d210b9149096d3b55c2139ce046e8c99e34e762670c77805981e0d725dccd1e5960438d2406f340cd9320618ea2dd5dab94851a15112cb30d4dbd98b214a533152d2754e6b1d7b04386aa2b773b29b1e0c474a4d0587c88c4285464abb40c2ed994780a318648fd7b6eeb4d530ae8b337527705d26705dec29e167353c8546fde54b67ffc0cb2a6b283d1a2615d94fa456b31ae593f89b25a1059abfbd5e12ce989af9d2458629811bf159b69a96659a96655566670c149532b0cad6746620ad38e066311e818b54d504b7e06caf435da14979ddadd0eeeed230614abe2455b6652f3f7af2ae4fa63ddb9f5648abe1a63d5eabf1a78ef4cbd935eefd8906ae9ed68723acf9bb3ecc4034addf0f2d32175c6ce28be7b88d30f8e6a7d411ac4d2317d92b407706e33bf08917033f3e721b53f06dac045ffac485983e75778e935df462d86efa13e618bcf1d63b83dc9ed6cd5d9fd4e919443d0586fc10063eaa86913d18f8df87e407de2ce1a3ce4755f066c9a9f9a7e6ca637da4769640eb9267307594e6d170eaee3c56288cddddac8f7c5779a03ec411d6ebc5106154a83ec49f0452d599aae1d6d99ff04f0ff95b80a3189c4e43cc4d969e12fee9fb04b53ef2a9f591b09eeb235fdf8401d1de3913e7d5d4777d4c5eea281318cae68ee25e9435ca03aba052dd8738d51de5753781616c0e08574d3ff52e5569f56356566bd36a73146b4a70b1891280a09b284112bd3e2ab091edf5428423cca0144f90526e8c746bf8436f3c423e9c0bc6aa01cff3bceedc3dcff3bcef8ec75a388ee3388ee3be3b9c144c269369bb7693c964327d774c4dd0344dd334ed8b4800b9e831189bbfdefad08d59f4f1886f36a5f7562809af1019d30a25915f22dcc62d9fd6dab994bc94524a29378b6163c6ad37ab04c36dc158c4b7b11268697a5696813164533b53914aa550f7de9d7b2a954aa57ac071dce9a66fd7ce711cc78dc1ed0261bd0563586f7db46e7db4473016f165a7e1d69af66e85f8dabd15dad6cee08e66036ee50ea9d91d1cfdb31a76cb272318c2ad25e53ee5d45c8d72e2900f2536a1698d72e2cf1a9ebe9dfa8a359af6e9dcec38eb535d6651309c9d51e99dc04869a56c3a831c8564e766cc98cf25e18d35d770a8f99ca9a320fdc67a635744d1cb45739dccca321318ce0d0cb596d7c0104ad7f45992594d9112c129d13ecfcd6bf39ae9a6f0a8b38dd3a6a681db13d4ce317f7df6c936c3f6eca61a1eb569e3b618e3fc16638cdf267f8b317e63136fbcf1237fa618bc998f9f67f0667e82320c698f1c7771b207039578a64a513745090e0458200b0606dbce6d60387b5e9a6a152a5b0606eb229ade2e6551d7db4f5f8f862927b00a1524cdeb335f94f5e96195d38bb2254cdaf41c2a483aaecffc069aea2e90e9c1409fd5096e1bd8fb2ab36e9a1b929e93e7a247c108c6c5c973dc516f31e46f1294ac5d72a5f25a4945768cdaa9e068e736666da66b60a84d666d37691a95f846cf67a64b3094bff235940903a2c3ed54b4378038d35736fa649ecf5dab1bd8690fb7ad6a0fb753d9b404014457b99275fc15adad1cb5f621a981d937707bc1908a56a6e9b30ff156c43d6fba51126349f8191843edd919bcc2dbb9e9b7af07039557cf2434945103afed23f824560d94bcd5307eaf5d89ecd0ca51c3b0b33e91f5c99e1f332370455fbc92ecd933d37e4d5fd34fdf054fe067caaec4ceb258bf3ecbc54e7b778acd9d3ea44d8f5e9258c3989d3b759ab6243b5753a6472f32b17deb8a597b538dbdd94d3fd5f0a84ff1a60fc9c87127d3b675bc09d4b205c2a77381300cb363a5f26a7913287981f043021cc5a0e302e113e02806bd0b8467cb53912dbf26308ae053f231b8217dfc06dec44a25b65671c0c060cd4273b1db409fde675b7034a9e729fd8f0ee9f636d10a5519d254ec8f36088fdfad59d5c2c5c7951da9c66504b76c7a1e4ad30fe9d0a6b5648f5dbe301ad1f3e1b2d1f3affd277b98b0040b9a60c1973130982b7be432d8244106a008e20918b8b470f171c523d5b8f65ab8b04b3bd20baef80c447ac1f5bac286f8570db2673e2ebdaeb06148f6cc6bf575850dd9637d5df6cc6775c8ca9e582c3edca56d821036a0c2086654e1831cbce73b08dfba8e3ae0050c9860820b312858826b5dfb70880d87c15cd1086efde8199398a7135c0cc1277b725c9184154d68a1509e7f9a9fd3a8e5e31a3d2b0db379ad46c96a981d8a3c4199a635ca4359c35776098291d4197d68d461bca48772b4446b51168ca4a60f2fd09956a3ec1a4db32801d0126b5a97bc6c21a48c2e6af843cbc7fd74c01053f1da1ba5ce9c39b384cb4405acc7115224a154450525138481154dd9359a0a989032ba805d098096d80fb00523c9b50f2fd034885dc365aab05dc3b50f5f4d6b182f5748b8311294a08b625301cba1c609b20c0106736d7ded8da230e1040f80780306736d1516cec7704a4b1b543e50638a296881c15c33d43497809bdf9db94b35d870c3a2d1f29c9628cf0227b3e46f8842e46d60967c0dccaa41029d7be425b3e42ef1b04b2d2fa17caa70c7b47cf82e031f8d70cbefc8b33819576e8f3df94684b9993501ebda3e2f7bce5f6085e6e5719040a7cbf32081a24b7e8a04f22eff4334a25d9ea3bf991e78334fe0cd3c9da26b823570d7e834fd26eb7e93d51aba4d3677aa3774db4cdb844184d12c384a3f6e6ddf7f85342514e4be5e0cf4f334f272b35b2f49bc2909ade151531b908261ec2bb1c37825f69ce778e3f2449dfe245e5ebea867d881374a768de64ecddd70eb29d1c83457370a09b969e495a88d42e8e504a174327b569ff47edc1ad27b1338a47fb2e9281895bef815b336fb697bf4a86c8db33efb0dfc98b5d7c0afcfd6adb3cebadf7c83a3df9d702be3812fdc62316e699fdfc0708b3fbf85e1d6f6f970f3a2e7b928beb40abdb128909a935108117b9e5270ca37e5b76f60625b01e8b7ba858941b69804da92b8677e6eb1271ffd16db9298351fe5a3f54609c3602d6f0483f5931ae2e82b7389869542ac6985427f23c336dd4ebba8978846b6e7a6d4f3dc9cecb4cc4e03b7a49e5b5234c23dbf25c1ad8d450144cf6f5db8257b9e8b92a3443178c3a7020989cbf4d8148cad8137095897e937fc8d4501eb8d4171a695c8a6974d432322ac10fdfcb62481b8cf6f62245074cd6f632410eaf31b996864fb3c97fd86be025e740570d028f0863ebad8c58137b41e603b97e8e2fee8a2600ddd3730acc0179d7d362739ae9ca8f0a86f6a38fd46fb6cd93707f07ea3d51abc9a65cf98317d3677ec2196dd8159a28bab3759a5923ad354201171999e2575660a2e2ed165ba96ed54b36867ce9ce15eaf497c046110bf95e9d531ca8e286b64b4d1e1d6f15b156b747cc73fd89aad0fc7fae4d90acd31554451c51249324ae7e5334a29373beacd249964d682dbce5628da78b111a0d136dd08b068f9ef5ed89d5b1248bb3c101c1c66d9acd6bbd3f2dace3884c95e12a619cdd6474ac1450e7cf3f271031f9f86db22b40db3621fc5e8829c13a48f51a354a3944e9c3884c9f4138c3d9f559c39c1d893990c2e7e5ba158a3a841db304b7e5b21f97d2413d76725d765d626639442c66d85e8f71c95516e97d96576a95d7ecbe465762925a78138ccca380893824bb3c7ec37f3b1b96f261bd9a956719895d5b9adcfc69ee08ee41c70fcb9420cc6bcfca06d628d40e8e3ac4f8c6738866d2af10c8de05c9f98855bfab942d9f7748522488459f4637a08b3e8d70b719a5e86dd105d87c340a7d31f59a1afcf767a20dcfa98b59d3ea867fb0e036ddcb385371d03d970cf76fad5a243224d7fb342b12967027198b55da631c4df2eefc54baf98b5456ffb8d76a369df981731bd312f67b40db3b66754669b2a0eb3b6ba1a48d7677d36f6c623cad204dc52553c0ca766b99239d2c065e7b2e82539bdf34ecf71200c471d763f695fedfb0e0cb5c773b137e6658c5d1f0f0690ef81da4d606c8edbc0edde76dc1a6edf40de1a9ee3ae034ffd132739ef5bc3ad7fd0120410b0aed275958a95a3363dac4014a470a6adec929724886853ed6ab8dc72b4db40e63eb9acdbc0f3a5b7c4abe10fcd7dbbbaa71e0ca7eea7ed27a7ef562aaf0e659fbe9e92adb9fa643b87dbe312fe762af14c9b3e2487d8046e6fdb19b8e0e4e27c01b717f8e6c355d3efdca227c2ad95172b9a1e674853facf664fe937a6852bfa766bb8a5aa8e593657b8d14c05d291cb508317a459c798a7d7e85ba3bfc0973d486b859b0cdc0a3f1cb8a5fd08b7deda6f18a3b543805bb2b515d31a18d4da975b6087ebc510e3700c6a4bc410b4c6bde2d6c6a8e8c271258a4a3cd3fb714b5ebb0db7e635edda7747ab4fb68cf422a5e4cbe3acd0b67c8f1582815b1427e5630d5ab6605163cb52d2961aa8b1866b65cf961603051cf082cc139cc0856b650f7f59352bb358f1e1d621ab977bc2afa750eab9157df4933f845bfc49f146f36d98d57ca4597edd6eaaac76cca2b5eb8d4d9144cf6ac3acc851e06213df64d6c6afea6b09e42bd3f23612a7e51fc0c52d3e36416f6c0b2e9a9be88d69f144b37a632fc88192a22c653a3cd222ebd0072468d0fb54dce2935df4c6b248ea08a637b6022f1a486f4c056e442f86d317639a0a0ebd8fe1548689a66284eab0e8076aac9ae8b0c84b13dc0f3a2c2ae207b4432b3c50010b2e58ead04a164bbddf60b00983f59ee94dbd973be0a569195462cf7313a4b386317a4be4b9863228d3733e3605c3a39b25b48c9ea7657468e5a8e7294865cf9c39c347cdb44c73d1a5c1069be38e82b48c6630a7a317c39b3fc12b38622de2256ffe12f00983618c219e9154d61b25f1f231c4cb5ac475176d741137ad21ff4a6cf9a396604b106c2ee27a7f44233b81138ab03ead90d0a9f7bb46360a994fadd04a01288b3df1b3865b87d9101763accfbc377b8d0c71918315b23d6bc83534ea2bdc14a8123bde6473fab8aedb58fcf560e0e6c7c0cd1cc7651457fef2d5f4c6805044c7313e50c20719f001d298316e488e3b51374a642f2771cb447ce08330bd311f64d1eb0312b4a937e683273e36164c6f6fd017256002892ec840a28c335c14075720e14510471821082e1a7c7143726580db15279725551bb31eeeb0ea63d60dfdc6a6f046cb1b5a61889d49a2e7831848c6f84305b841072c9a596d4c181a415abc3230180ce6ba62636abcd1e12ea9e145878b4673cbde320a386209500143a0012a608831db4533171c0c47b1e5157084d2d1562a321c66f1571268e3ac2ef7ac54298088a43438353ab0a375b85cf4001688480d2bb57b01b4b9f6dc1e7d1b1333a655bdb132dae8f5c27c382194a0fe67f3312bda302bc665630b1b7cc006660c5103194c0604a14b14699c40074e08c335270f54d0f31db7b49e447aceb962c50f68734520dcc3925ca406dfaa01ebad37a6c6111dae3afc9624156662d0d1ab8034cca441268d35d8d41b4be38cde581a63a4116693698049c305d34c1a58f4c6d288a2c3d89b4608daeb8da571c4a46848010d24a03104347a804619687811ebd0f88246157d52f2d048a2eb8da181943273861bfdf5c6ce58438a30bdb133b2e870f69e61459f7a63673cd191a33963899a3392b0a160646fb8604616d101527c1b33a38dad3766c61abd3133c6e870ebfda2696fcc8c301ddf7dabc58c373a068de0dbd81963747c17e3eb3a805ba0efbdb50ea648ea556ca1570753c03a1e08b7b823918e5b871b106b5958a0550d1268ba76998fb4c2163a7e005c838f358408b742283b6d533b0ec1377b6366a4a0571288c53df1317b53130045187d07b42eca5ad6d668460900d0f29bfc3b49111c7c592fb7b2e6adcdf0926d6c8ee176871bb3466f6ccc181db2172dcff5c6c6d0a0d98ba69224462f3e34eae8842fbab13ef26154da317a633cd0a2c3f8844f1e6881a219d343243248b9da0a999140b18ced916779fa90d5d94321bd2b2444b281918af591d7c008c5b2e4658846a25214222fcf2b149f581ff9dd9e504856c345028bd6f05f7d5ce510be9b254ff8cb45286f46521771cf2bf301e8f596d09e55c28428a287c16045746bfe8683205e62074a104d1436e04050b70433efb43cb3c4c922096b40d991629ad019155c964d6e65d1867132117cd951154a3421082cb00111c29c717d1288a703496ce186185e9ac0c2956de716003a3b4b024d57f621b476cc9a67e2db9eef7667b20886e69c2b431007828ec42c0392d5d5764414c2f7d559ad0583e08b603a666d9c530cab8ff47e6885a6ac4f4c2d9121adfa3c94064405c6e68d66fbbe267c41aa8ebbd3f9c49db62f457342bde589e6f22c1aefc4ad040a5ac2172e98961f00b7ba6d6edb2e0f64bbfc10ee92935082fa74e92da189c2061be8d3a98d316b908100b3e29752ac15d17de9cd8e704f967537300b02ccca768dce5ec4055f18912212b7342fdcd2c0d81c05b7b866db4b44257a83045a6d9d984d4c11305f761924d08b7bb2675df6e84696fd066e75cf0e011cb8d5254332825ba7678f49d96312193ffb8b5bf15d7da3b36e677df8145c318b4df1095f7c78a4b3af186873657ff6ad66d7a89ccfbe3b597d12bfd0703fe79c73f78b4e90a19739f0c54309ea5dc934d8ec5aa869d9b5ec4fb48c6e966559986559f669e0c601c9d627d3b4a865f5f1e1bc4689accf3ecbaed52cab5bcd90f8bc70cb2dde5a2720ef7bce047212be09066606429d9347813bdcd2c0706b69bad6312b7aa00df7c45393f9b29b625866c9ba52eb6cd34e6770e7d65df8f5ace12a76df8e111f713c91c0edb6e6946c84f94995d845cc112ce2163fdccfddf0b3ee7a4a260c1665944270374a8a6687db43edd963a57d7aac8ff54609f7f858c31b25b168367dc83f6aaede28e9ce71efbacddbbca50decc00de4328e7bc6d56596090ccf69db766dab32cc01306bb3ec34639e40684f8e54f20ef7911727144edfb7002bf45a9f687ac8eaddc0c48744e404c24010e09e08b4dacf6d15c47d606cd662415a3d224d4df8584086706bbb96ba345d1b3ac2adedc8f6763a55283b4b70b2480210daf45903b3e253208ae5993a30b67703b74caacbd720af0237d9d36d120808f7c86b219196b18d2fdc303214a0061bc8f4e9a6cbdf7002e335309e879d63b21570360c04847be2379e5b9bfc46277ce1ce0908b74cf452d2cbeda6cb533d7df67aa65385d2f566dace52700bf4799f1dc7b4696f030315b10cdcc3f5a237888178e01ed351a96f00dca22b06ba41f6988064903da61731e3dbcec198a58559a60f71111e985ec405eb797cd3390f8c2a8e4bb4e9b1f9218649a01dee317ddbbef0abcb3b6d52c1a2e0469b1ebde01ac3c630dcbae16f8c81e196155a684338b008982fdc2902e6d31e8df0f16456c6d574bab5e906316e702a668e935e12ceab45b3190766f155e01acdffc2a486a0c02260768a80f9f81d08657df83248a03806f7986eda4c8f4c30991e61dc8a373d6a8948310b6e853b6df26205b7be700b0b6e85455a7ba7373d8ae19677d3e318dcea6e7a1ca34d5d8c15ca2eb5576773e0ec133899e5321d481003adcb04a64d5f718bdef44d02c99bfe49a019c79c4ad0f542e96e3029a57477f7457cf16210b13c05224098b505581f1b3a29a51f0476360065e7ccda775b125f7c18d473a565800b17640d7cb18a7cd16cfaad374a369c1d6ead321b4a50f3a12c989e3feaa33e6a2ed29ecba736c1b458cf9a358361d72b969366e16c1a190966c658ea78f6a2e3105fd8f56a1523912140e239a8e3975d42daa5950c412dcf5abeb06b0eea3965aacb17768d624f7693a3a7cca475365dcb6af3e1c469b37528df31cba667cffe98359bdbcd865bb37bb7a5c32cc0510d67cbca427cf147cda912ecb61d4bf9294f1f9f5039ebc6290c616d5a87524a29b3169a8febd3e17c71d29c5b6b5e763f915356c91a0476b240d9e9f92c725b87c383a03daf7949e6b729a59cc2407cf145b3e70e0eb3966a9aa669332c624e0b6ed66de92efd3efec9f225fdc4a1a7200e4d3f410ee28b9f45b4299db34eb9c53e7bdc6c9fed9f649359f24372ca6da50d77e05b1a2311b838679cbbf16836e8978242f8fe84d6d91b13814607e98d95614573a970c5e7d6c603c76b60b89aefc068f2c0e51e6aaadae9cde94f4cdf7e327dbba96e2cad863c347d56b7860ef75056cdff4e2c9562290ef6c58e33c48e5fca5862074b3bd0d21c173bba24360e1df7c21cdff1158ff36836be27aad3702a107513f8c5abdc68d5bb35c818438ee146cb31da6829b36e3d25a87f57729afbf7cca381e62ad54d60b86a93c994aa04386a4ef57d99f5fdbbea26d5516068f33d01723ca502555fcf00b1737c8855377d3ef366409de62a30e4a155cfbc194cffbe0c64f370b379f8b54dbd21c051dbfc4bfd3b8d95a34e551f72daa6de707f92bacdb9d46d9e4adda6b25235e4816553431e9ae634577d48aac0d0e699ead49321768ed38021cd51b5d9f8682a0d39aeaa4f723c559f74577d886d4028ab56fd03439a0a65d539aaa98650563cc070f6ead25be229e9ea6496574fafaae18ebacc5a7d326bf5cdf0d530b68ed77cbd1974bc4607181a758d0a945d738e7626b0e6d19b21a4b90a87b691b2a33743f89de62ad93a6a88a56b4e4fbd19b86b6e9ae13b4db5a9217d91ec9a87935926138e1a1e754dc5718ae3436c0271a8541554351b5f9154fd04164515c3be9b25b1691e9be65ff5cef54649fcf7f8af86a7fec027dcb773d153726a9aad0c237630a6b9e8cdc07ddb408e0644c56f6480e9eddcb9e5689702c355a76e03863cb48d4d7f5f6ee9f84aa5faf79b550dbffe9ee33ac065568e1a7ead7a0da8fa32d0cd73e4a8e1d6aa1ae2b8cd6b7e032ef7d4d470ebaf86dd531f9229706f0366c7018650564d732536cda7a7849be6d15b124ff3ad86dc69684054f40870440372b307034d0d63d31cf51458f30fb4b90a0c57adba4cfdc9779ba7bedbfcbb4d5d66a99e7a4d557d48d280dc2a30ecae35ea3420f70dcd9fa8fe9da63699ef4689eadf557599f555efa9ea29e146d527dc63d85528abe6eaf6fd3a24c243120a6b28abbe123b1e47c7af38c5846c630d08cc33cb27720a0e8da663628c310ee91a9845c5c418a31766ca340f5acff315ad9ff063dd3a49030e29c639c323de18679669ad6519a5fbf821e6ef8ce71863e448797e829c446a91720007b461d68a594af8429c1f191a800cdc0aa1ac5a7e2651b03bf3c96f18cde7ee03cb7ce1cf0c052e6ada762a5a6b463db32ed9e9cc42074be420a9a5a7647a200aa1976790ce24a2107ef492d0ca1e8842f812dc76c54b3e389915199c493f343d83f21c7734bb30eb888274562a5a4b593b666d31fecc8a59166e7722123e286ba63766c569c3ad048c11a659e88de9c08ae652bca56876f679fea1b7d5da744e1a9254b4de8c5aa39fda331085ecb34f709f816c441432b73292066e739cc4acade927c849e090a4a235a5d97c0652baf121d7ed5b9453e07627bcdcb4ae77a2a20d0e17c32f5c3557ab4c28ddbdc81e58d2344dd31e14b4f37daa237b1b9008f7f06b401af0a4ed2ca97842c149e1e353ba4b1d9332f06949f18ddee42e691915a60ff19e977bc2ad358e4908fa3e551130615704ccc7ddf40fdcb4a845ed282d6af7b477da230a0c5721ab8774ac55669fc0f05d34bfc848e08ec6d0bc686dd36078a27dbb06864b669ed36ab8645a7bf8a11eda780f57bd38340fdfbb4305d25d381eb26a1e02e97d38a4379cfd5181e3aa1ab00898cf74d291c34655736669e7d380b306c4398141ccd2ae0364e51842036e9f584324908dea7c9604c271be0a5c314bfb070e314b7b0a1c00b3b4a3401b98a5dd036f6096f60e8400b3b473200eeba31d07b8718fb6124806eed1cebbd41a0cdca72d8452350a4e1aa66870bb33bf44b37a634b6eb41863f48fde981856740e6062acd19cec681453492ec15d5ad33aab4974e5246669217d16cece1e72cdb44b0f86d8279b673544d13cdcbeaa67af5906aa79769b1a16cd4d02d55c16c936ddfbf71a70b927751a70b9e70b8b6473cf52a6d3371b1faa16cdd6ba83cdc6b7d522d95a77afc6f0247eb6569f74559b61d16c6ee32b921dbffcad61fc42db549ff035255c9fc4d3d62857e9a54703ed582bb7765a434eea2c034f52324bee304bb2ba556b8fdcdab34f1e1a4acf2984ef55873c6854626735caaa677d123fabfcfc102fadd1ef8d851184e62c3ef33c1a62493d9b5ba08f633d1b28ab61d16ced337ee91e462c3a6a9f9a119a764e9a5e122d3624a79784665996d4935b948d884616895b19e0246e694966ac359006ae93ccca485c6b153c723a3dab27d0548318892f0cda3616ebd5da275829277106a290f9a9512ab2292d83e2cf0b778408103091e5a46f7c479815631d29ddb64ddbe8b3ce8e749c603a7e88713ac618671db25bc3eff4ee16adfacca2aca659a6d5f0a8837af787ddbad0a6975959982028bbd43316e10b67470d15fed0cce5488ba737e677b8aee3c255d31a9e866a58d43284d2323d9cb29ddbc08e085f10b33ea0e553cd8e308b33133899a56535360581f404c35587abd5fcbe55c755f8eeeb59b7db704bfbf68d8156dbb6d5b941dfece8cd59a1ac7a0532aa20a3a5fc6c596fe48ffaabf9705504cc17ae1956fc0f122875d4c3cd7bf8759fd54c0d1228258f1ab37964be4eee929979b94b605d375ad6100aab23cc4bb2b2fec0ac08852f2ad123139bc4d0b8a465710a9f04c335c3140c174c371bdf82e93022f107beede1c7ffdc685395da4d6095d99c4623b8bd2d180d08d18599a6b3b9cff33b70b9c74c5c323197c165a6efb7cf3967d1909e6094a0e63ec130a86750cf4730dce9c87d192848f670500c0ae223beeefc30a853e76eb3f970563b3d51447ade9ba7a9bacc9aa7a3400f0c8734ad5566f3393094a1e9a597e454b98eab5076fa95451280e065b6095cd60c1ad3ab73848a530c7785f693ecdabbcec47135dc38300c6aee2f6e4a7345cd716038a43766993653f7ee0aed27f4f340d315bf31d0c660309816577c73e7be699d77fe32503cc2170269be693bea7c22dcdace50823af5ed747e0afc98c57d43811db3b87fe08a7bb87be06416770ada308b7bf4927075fb90dcbe659582b376f30afa1997f0853bf4bc4da99db36f91d20a25c8c80867ac60c98b61f21765c934ad4f66dd6a973103c1f159cc9a4066a6adb6ceeba8683584b2d3d969993599456b58447b7bb655d329b89324fb46c5a8e94625369ddde439e352d4aecf3cce3f66cd1a4209ea24eb456a83380429a1ac3ace56b2021955ec00ca6a367f8ae1b6865f6f77fa30fb66a010bef8ec3c39e9ebea3c0d8b66c7ef65c0452cbef85595e96cb8150e1912c4401f62a0bbf8321460856ae016377f7a914aae25d3928fc3e7f385acd0fc69ee7035a4c3aeb9095691af7265eb3d95f715aef79c04630cd69cec26e8a3b9d94d904773b49be0aab9ac9ba08e1ccd6ddd04713467ea2668d3dca99b604d735c37419ae6ba6e823fcd79dd04873487ea26d83597ea26786aeeeb26686a4ed54d306b8ea69b206daea69be06ccea6c3d14d909bcb61538323878e5aa5e86b21fb58ef969940848114d708b7f339dc1818b1ee76b825048c249a83f0faecf912e4f5d973d264667a45a02934328d0ccde4c586dac2e49de0947a82f33ad0c90d781b11a82f60a95313bea90495ca0734338d9a4e0c9b530d70c43a9ecbe1450b72e0b0a9a1517d2994d77127d3a6033524045c5ca3e3f6898f1f7d9abf5e7c69fee4ae11c0c5ef4e945f336474ecdbc7ba20958d1d591d953e1fc584bb346bc8923564f51823be984edfb69b4e9563646ccad0b0991a55163695bbc4ceadbc2ff59540ac146b662fb287b3903d5e207518cbec524fa42454974ee9a45446f59951fd3046a582915121a990caa892544966be2eb2879f458713298c14c270e1502da95435626a6a4ef31c39eab218078eba32d8d8d0d4a149435353836a9ee5ab79548a4a613892d9e298d3b7a8a218edebdaa28a4b1ad8b12f56ed31cc6743b314c38859da92e5bbaabee6355b54cff2d9542c352a558d64ac1c35c7d6875335fcbc1aae3eae863fd57065aa216bab4a1c5b336674d0022742c04612a0782d11b6641143461a3070bdf8096e4c0113023602d74b8291451044007bc20b5c2f0ec3a50d27106184332e19546490a4a04599a42e133695a6171920c1c5ba41970e27120e929a63ac301268c892040a12238186788c048a359f151b237b964c56c3ad0cade1870333b2677bc80b98ecd9fe82629a2db8dd0967acf746352ed55559d0d864f1c5e65f640fd3dca6a66251d5d985662ac52533a90fa9059a313bae834ccd55aa8a85c771dc2655b764497dcb0ae7aaabcedf0d8ec683c7cdf6954035b5e63c4c5f09b4a3c6af6b55b1a86a2a96efa7c7a4d87d2275de27cc435d9a913d66d84c1996316dbbcc62335d7e319d2ebd9c3e64db988c9463e6e9a598ef5952dcd7b5e5ab2b7bb2cbec1c38bbc4a52e4bcde71ec625321d32accc901bc4d88c04622fb287bfa16ab87d5e0dbf5557cd5433cc55f612615ea298ed5b5a4533cd0fd3252e7551ead2a54c98e632cd4bbb2481be94989ad3acc6d05c870e32aae7c8f12c925f58bee3c0f12cb26249dda6be6cce9f5d24d06b556b903df135e74f2509f4d251e369feca515f386afcf7974d8d4f9d3f4402d55496a419126e2a530dbf2f5c694322ade1b7ea708b97357c875ba38e3c56b1c1ed0ec79929135de18ae9fd0646d78ee9dda50ea598e945f6c036a42f693f6112e84aab2e5f12d2b67d52cc94528af9b22481d62566cc24d33cbd7c19239124d0962cf45bb46b5e4c9c1725cea4d4e55b5e482db84ce7ba2449a02dd9b350ad4aa48a257b566592440a2552f3a5981db391f9caaca41909c425ba2e7bf8524c128f21d325298be673920492cc5d9a3f2966c5493bf842f925aeebabf0eb188b64c89489b12fd14c982c604b3146121346f6f06338bd347f7a91406c050dd460230419b8818b3fbf4820d90128bc4145154f74e1e2cf2c2450e452040fce9839b303177fc624d04f0d40f083335cc0b8f8338c048a2c7802079098b001988bbb343fec22815ed1753a9bceac9d1fb398c2f17f9040a72a83ec61315cfc089340a65a83ec617e449240f586f36352c5a2551cb0d0ca83ece1f386e1924831ebc397629a2fa564c9dfa42bfb3257b78aae9abb903ad76a7be2797be22ca31d49fedcf881ea380a96e329a45e8ae3df529bab685ef33076e9fd72cfe66acbcec91a24d00b751da9d473d4e845ccf71d478d5fc6a82a97e852dda6d6542ed115c9d0ec55601cf381510c189740560d3fc81e79ee546f903df21b913626f1207be4c62e739796c2c487512964356bca0f99f334a8bb37743af72cf2f23268db4df7e2bbba7d12e8c5c59feab792402f53fc565797402f2d3eabb4b2644fbcdc5cc0ed4ec8b178f970cd7c3edca559c3ad21abb7866ba6654ce3cbe8b178470de1de05997e7a1895b46fcf22b1d0670f374c8751a94c876bc64c87514902bd5095257bf8de8b7b9deaca1e53fd640fbfb6bab247ab2bd9c3afac86693ead973d652450993264c88c690ea3d28a690ea312c77a758c4e47cc9305dcee8474a9f991075f48bd741809f44add8b04429d4ff9340b09949d4f6312883e05d2ec95792f0f05a2be9e02a47c5d6183fcfc4b96693e928dcb742190b84e2f308b760fcca26560168d8259b4fada2acd7c7c9b4a730cbdacaf59860b10578f0b81c4f5d5d791155d0891aa2f0b6c7101d2096e80c519d74b08242e547d1909610933ba7811c30157162da84ca8542a7335da584f928e318466684613001a63146030482c188dc843025dd4d4071400109fb0545a9f0ac42408720821438c2186800100001800184dc000a600c2c1d94553a2a299258205e45a745b0e0a532622fffa44a7ca3ce7ba36d808847f4fb94025b5514101edfd170a477ddf9bec2a9ff3b0fb520c84ba0a6e9bded66401f6c18b9d2397e62af84663026c1f3971e67e95202bca8faee684fd786305aa7e964d2a75de25ba76109d00aedebd41023dcf25a542524f8ef8db11074156b3eaaf18e433f3703ecd49e04812a5afd8875919c4c18881dd4dd11675ba62bb8b0576cb434b2d679d9430265fe522365e9741fb8f2b283296ae624a086caeb04516e678deefbc62774bd101702884cb21a23d6bfc2236d491e0716f800a0d8ddf2f1f87b9951b81df69dcc02e18c22c5a8afe2f6d62779aa69b59fafac618d224bbfffbc0760baec0050ddf8b682d452c2fce5d1c374e3a38c4f0fe7b94ea55ff4e3f5a69fe5677b39a40bc2b62adc6ec64f2994ec5bd6a646e78d89b02be14389d75a5d8504a423de9e4bb7f230c5d8534dcb9d4bb26214b4481a62aa2567ef300376766e7092216b97eda8b5c1d94cead18e171eacce317f79ab331bc56bf09855e49b85b458a2d938599e876c0d831ca0d289b69e5094a8d887c839b7df2cb755abdd2218c00a84f9699d528b75d481aebd03ba745b1321357205e85964dcce3f32e129e3306e5f0c46b2cef83ace0094861f777a27ed1205cdb559cc43fc404a260cb709773f47e730857001a8c0772b17e40d17ae373ec51f004da9f3f08ca4dbacf07090e2674d08731c485b6f5fb722feaa48248e6a581b194d8e1413f7d145ef591533b1efeeaf7a9eab9aefa69b615223a60f0b961e90206a0b20a1717db7bcdd458871e5b370da4adf45fe95527cfdce421129217fd7534f00b5047bbe274a617d345f81fe991e51d4c2ff500432c36ce02765cc706d28f1339ca8c2fc26b96a99b7bd50bd6679f15ffdecb87154da3e63878ac8963613baf92d77971ce201ad0f435de65b0cf6887558328e437dbf177acc9a1d894e7b39a5838d1a96e6e4393d77aa7cfc0ca570bfe220a4a8d84daa76b56f760748e6c80a734de07bea4fc44ed10cd97cb83783f4c442f5fb3d2e63cd8f93b03849139c5f40929c5c8f8fa8e8c3599b4fbfee879bbec1dcef2631f7843598056e5523c43c8a20f664c64c66eaabda986a8f6ce67fb2c7ffa6f4ee293266f56096292b981958c46c72fdc31af6a595ce4e75c813736124a5cc9840d877480e3b6d2b6b390b84e90ea6cf12e26740d102f8dc75ddef18b4171a7479d6580e7d9758efe5ae5b1a5c25c6e2eb19c680fb003583232b11c45b406ddfb1e2c28d5294862c8ffdfd336425cb80c348f7e34a012b41879f69cb0cbb8856ae9508019bca9af8e2041b6aa5445dd1d8d4ef9b9aa6b4620ef94c61851d4f9d55e866746257ce17729ee96303ea2bdd9bada05f9ca5bba1e707349ab2a14b4369e7aa7b19528a1aae7b3c46aad879ddb4817bf3468d6d395a96f159a23bbde48b47eb6a1c3aaf6280398e27363bdbe45fff1b96f053d687bde70b5a5bf2e4b643ec27dcd1c6558eaf4f982ddf1e0272cc2e7eb1b0af278e421a6676059b102c0ce9f8a36a88ab855dfaf808a4d5623b87be742ed2450cf6b5f707a644d4f4bc8407efafab476d81fed165a8510b251011097deaaedde8ef827dc37250074950b15920df1a8f28908afc9fea0163895a3761ce54d28385d384627ade7f781d819affbb9e3fc0124810da67fa5677500f5fbc7704c145abbd66a047d306e5af07c25847b3e2ac763897d77cac82b8b645c12364aa54e2baa71939cd679faa3130fdefcaf54e53394118f5763c95d7f5d167f8dbbd01c16aaf5543de4c563da6d769a69930ae1a34056dcf8901072ba252d51225cb1a76de7920c2052d00b07c46c31885ab01e8cfb31897ad8132248444b6444a5b62b69b98dc1bab790717917fbb5566789f062ab8eca12945d48ae1e719dc59ce3871cd6b0a72c64da714889571ca5c3c7e8a9e166978394315b7a3674af2c5483441e4834bb2fdadd570c4e71452d9969d502a1c1a3a5271f6ec07ac4d5b4739332d4098efd5cdbebc9c746136295494278ae60cf07768e725a22444e6d523e96f707feb14d76dcc9201cb66049c2b94e0fdf32a57057faeb2f2895aa9c5473ab22814395df5f31166c603b5e3de54c259891e1b283396f1ab1e140cf0439968e66fb364cf33e8328ea7eb97bcf1cdd13f058d750cd5c6e4149f5bd516927805a5700f995a35a3a3189d1a3a0c4c4f667cc4254cf2e0ddcc044cad15397fed22f81e4f7dc2bc1a9295ad0346ae5fc45c5a5fd9b184ee277fa462d59852bc661e5213d11c74e65d2bfd3627ba4c909a50da87690c499d495dc4fd7341c9c0b8bb3e27d0c3b6e70cbd3095259cbed550dfb406133a988a31bea2cbe5c20104d4b922b33719c36fa8c7164c5c65959d4eee0d69b1da935988c77b95e212df9ee886178d68bfa31e59e3f01c3b87d819a1c1210dd4facd2da5d425c48e3423b7b8bf50d9a87d8aeed26ccd27775812e335829d39080a3eb4dcb6fce58a4510e4e81340049ac22576c42a0562f164c880b9f32f6608424768d4491552cef8c307ee04ce8f81362ea88de1595cc00c8d9540006774816f9d7715d1ed55022d8ae809ce2a18c027b23b33b99957af39a766320af27903dd45244e56f12e4eb10dc0a56181a1bd967577b4a32313b23c1e1a030500a77d390e4c29721ebfeac3fe744a2bb91c6b34b328f010f2e2bc82a20ab75623d8e1d7b14018ea3dc0aad1b55a0235a8b1b1891b4343ff1971f9d6062075489b43c4085a4d1466bc4bd599def928bcfa5882a200549945d52a89cb84e6c0410184efd3a525ecaacc1248499fbe7bac0733fdbeded0628bbdde65a44e0f3d2e40a34fe80ee2091c9845b6e06828f9c86239d3c2207bd9ac2c7be7b49061ad5a47f9954c666505ffd4f1b1c7b27f4981790fea1886f4387096be84adce097ba850e9ad0eadff267fc1295cd43ad1464034aec41594704a559a2493324e33cc0df1b47238a81b698c012bd6e8578f6c20685cc6dc80c8598daa46f8da266b4897015ac9cfb8d33317bf8a564d539f8ea87daaf0bf7df89cb5b145f0f431c949429422e6317e586604505cde881aa913e77ad13017daede493cb069361105d735a49cd85ab782425dca4ccc2c500756ba4c1a17e7d763cbc0dd6c00366c6aff0e0c7aa8d4f51131c7372a6466bf93338c76531fb1535b787da4d3440db369302d4c31ddbf3d556558d5cbd91ab91a409b5d5492972fece24cf02e3c9b4fc154a2b9680f6b31e6c47cebcf41bc539efacf12a86a208eb386aa6b3ee2b2b786b09d88f7a542c15fbd6dc250c13730378cbb1be4e3206e5177fe0d43efa29d8eb407177190951563d5e0d67102548b0e9ad5b730a192eea74905d0e79cadbd3a479f8aab92d2709b1ae4b66bdb5ae27081c0fc858200458bff002db2269fb244e088768bca09eb693068363e2e3d3e2621d571b08c85b05e76dd54004099c979af73b74446c1ce5bf634bc144bcabc3887090722f36eff26dbe869fa016fffed61c2c13018a90695cc406e8f5f249b3cb07aacfa922ee5ce86c205239bcbe2b6616f82509a551f0d2b17832c7548531581f3adba1890312874136b7172c823fd47427d794407105c9441bc37e39002fb8196de88795870147e198fcd99d50e32d660b49b5fce164421c98285b55a21ede77da919df09563048614ef921960f4cd94f4b71d350b164ee2c9ebb5fe0484641fcbb87579a764a2c78a30ad507ed1053d5bf083cf206729a5420199cc0663fde2caaa4217fec92eb740038455cc29703794a3717880899667b02e8f5e82f40df4aa07a898ee484ddecad3ecee20f0fff3999327d85e5e2d91da284ff16f0a4eaa5c92cc48c5363e4dd90d2dc80cffa8577447ca50c70c7e2cac82ef7d0868bc3694476d07079b6ec58c93aa81b14f4c1fe8537997ff652dee6a79321c23f44e7f19f663656bd01accf39e0563f2c0bd16709fe01004c314dff27c85f9ee6de1a2a0778ccb566a0cd10b1c77e0b59ff901a8142d2a2273f1a8d24cd2d39b59b3b4d488b24dca424197569d81def01ac52d83986b9a2d4e028c0d507657be5f4942901483ab9cfa883ff864256bc3e7c452fd0b526ac4870b974982251c111412464622d576c3b2e497fb3e9fa4b4b4fe928d02f73f4e16b839bb091ca092159b6f625081fb2f38b7a89f98725cef1884b29b17fb06546441c5fa3aca4f9eee1858e2fe4974e4b5030d22c729b544817db2c9e287ec556a5e310977e1ee6a001c2f49801203be1ea7af19cdb50d920d4599d8096bd974f1dab3d1869d5a1a2b027dd0506700d07e21062b6c8700fab0b2e81d5242d40064e4c85344ea656b0a08f0843aee614d541d49b4d9eccdb6a2e553443a65c1072325e9f2037cd5f61bd4c352e93688348f5b47fb9a1567703f32ce309dd5267824fd7a402eafb8ff297257889f1b626d7449c0365cb3e9841ec278a52817672b9bc8521f859c74ef003fde958d7810516d1a14fad4d69db290d1d3bde7f394f057998148de17c9b704cf18506c187f6d610e6da0a1ac1aab4c1129c53c3e2bfb40fb493fc564ad38b2192ee7f58ffe3a79b17500571087cdf01b18633460f084b54cc30bbdbec173ed94517ccef4873cebc47aa3d02b99e6e190e2617de04f4aa93ba673474444321a7e6af1d474bad78be47abd5addd8dc5137050d353c123934d0926de88000266f9df0e8f5553b6a5e55970ead7d4c10a9bbd6f7930a95467fce07729b1ead57c07a8a5384f8fb58460295701705845c47646d6a7bf7dfb66ab5f3b1cd349a04c78f653e12b3e4692c5ac18526b9d586f27251f09b0ccb1689406b3f69dc52c372be8f53ef41a3d067d8dde47afd1e3d1d7a977c366f05b23b35684fa60de37479658adf4723896505832a0857973d286ed8ef3f536eac6c5f14a064a9a0772b4e323647687f978237d59aef8cdb8085407ddf3af149a5504d6f7bf663ba802dec1a5235403cf043c8c3d8b93101e88511d88b7480bd94e05217d4ad95adde27ca12eee5efecb42c25d8084585b96ba76117919d7864da9604ef33387f1ed823336fc118b210838f4f8ce4f98e172f48070aca1f277078d6a3558a2e8def2eba321bbb94af7908f62f0027650c893adf7761953cea5c4d34c8cb261c889fd7a8fa45358a2596b64e20c6f930433499b67c3f988521cd65bb29a5d9b380aef2aa0554176b211c4edf28bc403154de89b17e219864c17ccaf098c4cf59270ef9535c1bfe21e059be34ed89bf1c13622eae8c07a3d8514ff7f82373adfccd49c2c5c1a2ac85301e41b12a3c871461476979b278b294e4874ac86e70161b8b8daf838727c93d54660031d3b5686361f4be57955604dbf97c400d1452734755cb22f75542e2e8ee6ccc5fdb307476d8e1d7c9a4e0c1a87d79163cbd233ef349fd984fa682e5507b568de97ebae673721a7c87d8ac61787bd039001483d63c1ee981bf8e837a49e3f3f86a5dfd5cd639def58d81093c0f0f1e5efb0ccf9443754a8fae795f2517be6ce86736097e2e505b76b1d6703cf13d0ff360db06d890c3ea7232bc7394f45f446cf4c9d9c4780ec3ff3d6eb18220576d14353456a30eff2fe189ce334c3357ad2d6c7e652dde9e164661267e96435ab984a9c8d5d72732591d31e97f76029c6f7200e02925e975a95459d7dc901a56a53bb783ce74d140e66fd590e0c4843407826829f2dda521fbb9ab5e9d82f0720a542988435eb2607069a2616da17c4d8b5af302383ebf35593266232d222b40f47a7a2200fff6ef8f2ee3ac3a7e02b7d5dba90e13fde67999d916ffb95d111d10ddd853d8b0bb2d72becaf860a167a9d02ae0a66839e67c67ae097b43de063c1e7c0e838234c3b3004660aa6782df3e93561f4930bff0d810e1fc4675c0313f3a131defe4a844efb55e67f24f2cdcb15b16da0e8d569b8d310b26f89e678a2b82c60c7f5a803e742b77e5a30a5a95d9617042071c18a4e10f0f49ff5586cf6312ced0e58cb139f53b1c43878821d96b18395228adaa2241aed62964f5824012fd83a0044941c56a5eb56752121576d5fff7d8c87c82eb326da356af689d0087cd97d3509a7a16a81cea6af8001cff1dc01b565116f04b97535775dea4c607d2b6e24e594f624416bca0f19dbcc85aebdf0a3344400cd6ccf3751e69c236139abcd570515eba886f5ee3b602b1b6a98352366076c83fc72c13fa1c6ca9ca43abb684def62e785863db795ea95e855e11e9d6eb43c421cc51e807dde4a03e3030019b23664bfadcf4ef308c965a0f5b37f134ff449d10eabf6594e3f04814eea9428319087322c62633d093f72955234d19207b564906afc674beed9b0dff19078b17823bb20dc751b220f96329fe6aac63371c47bebd271a58a758aecd988ab4544392d0aac6bd9bc334891197f55b8fab42b401bcd2034e83c8334c35689ad256cf8ad7d7675024f372797e10a48a8f621d840f83247e8bff480b4bb613d0a391ae8573b3276430500cc1dadddff5d8fc584dd13804599f67f2a5cb1a2055000e8a4411afcdf785c109c3f6e3f9c7505f95232f63b2d7a1a748eeca382cc1a2a549d1393c440d5fd78c76513946297838b9a442c8b529c1baf587b6d21feb031d7cc91e863c8ccf86c61477de99b22870b500412de9a07037822327f37ab80aec8255d3725054796cbb537694d4356d81cf8c074f27caef892eb7a39ebbc5f52f8a4038f237aa90a596de82e2b1a2bd8c56cbe6bc8a926066725ada42b0cd139bd1acfebb46a45389902673297a9aded4c2a28fd3035b67115c9d67ee93834f03baa9d35dec59a73abd88de4fdd9619b0624c7971b7e62d32ab56a93a3698c6d25caa9c3b6538b17a13883cf861ecc74169b0a392991084fd74db5155736ba21454303d76e412a5962075c123fd8b94dafb32e30ebcc358084721a1541944c183b1b4e15e910bf4bb40eb395d3956e042cebd5be1ef91b3b626edcf7a2b11167c2c03af0050829686cd38942234a65fc0ea11db8f4f2bd9b80948b66c80e42d2f09d04f16fa2c49d3e154b125fa90d65216550df6a4f738b0b94c75734d54b2e60a1175efa7fc224244221c15334095f5b5d8909f876f8b31d5e6de6571d4301bd4387b3ecbeb2c495a0638db2e8eba1bf8e5eca4a23410387d46406cfeb07ff9aae02179dee9bd2cd8ec925fc04a21bf5d7c34a2fbee2b640a88c191355a0475153d894d65bd49b6d1a6b012551e51689f81862329cba2c47644a538a2dff90a768e9bf1b5b372cc5609af46a883473a1560189a62c284bf9631f78a52a02c0c8f2ff0334ea73e2ab3594f49a05dab44af17a4715bab152edbd1ba97cc33e404a639e53f9d4af792c2347926fc165543c1438453a982ca0c9b828a051efe27bc0df9d17a1602a39860d8b9b677efd588cf7b28ef71657f4e72507af59fcf84221f9e4131bec7a12b0a1cbd8833dce1874dcfde89200cb534c6ef2974a34306ac8668090f98ae4f37064bd1f919f4929fe882e4b13ecdb0a6e362c63aa100f15bc471f52bea26c820f4cbef3a187cce388354acf5cc243f6ab0a584ac796e4cded40a42d595ac4eeaf44b9b787c108359bbe0ed8adf96ef780c4ffc592ad4547db9263b724dd6aa8859f921cdb4545467ef16528fa8c960c15524046709dbe01d5a2b6915ab51943f9e95bc3ceaa4c51d6fe667d783b55bec041e0ef5944a2eec42f75a4da4e130e2dd9ae71de824e6d16bf87ab092506aab4b6537f6f59f3735e17c80271c173d520b12bc96838430e9d74063ae248d576b66c58d0e5479b210d1a3097f4e75be43977f8bd9b984bdb68edf60e76f5a9664a74fcb2d8bccbba37d7b13f1ea4007cb4a24314a5db55204f4c5b1c2f836ebfdf37af0feda52cbae3e4c4627ba5974489de886c4a44db9bafac964041712011cb28af0e5c5f8d25edcf170c8534e56923ce4e061c3556bebdf5ad0d8458843f55ad1fc19a0f4205ac592ba1be3fffdf6b1be62e745ee044e840a15cd80938369c6c7e5dad9e62639da26e60d206880f44d841fdc2abad2c2b576f4caafc1a6d8e8ccfc70dc005bd861d74a1dd0fd26c2294535114f7518ad18df70cff1d34f313408fb8e20875903bf271cfe99236b8a1e9b75931b8974c483c16eb91069e2d14f8e41fca9da15f6dc15868a0df2079f5197623c7758d7ca361026d7275cbb3a0d8046226d72ba19e63f1690d618046eeaf6e0721a9c20d0c39ede1ae2e45ffa28db7628cd5c665525a1969e85f86dca9a93335d1303e4b1a836b6484e4f20e351568738a109311f9e9b35a4cf1c61d2ef2ce22be58e1627b9330c1baa6d02d4e342ecd95c267b94a1ada8c80c3355b9080760bd49ad58c4806d92000792314f1a265412c50b6d411a292684230b94fd00f16af9c69bc5c7907f1055988b9ec9aaae4c6a5c063c016370ca982732ae4bbac36c96c0df0acf0ac2d9e6ec81cc2c13541ebc7f327b625fc38c4318985dc79502d60a4a6510ae81abb9d82332ae16d7a3b2f9238dd5ae29a5662c8d9b7789548c17b6a81ac47a391517370960e51a9ec7d524dd86b2752648aaaf57c305c7ae6e1e695d0455489ea8e28aa59e1ea6dd423f0e4048d4d3d740ef1f2e7942ffaa3046796c5c5ae3abac74cd75884a75bdd6da6e16c69b50cafe85a5a1688d12fae8ea5d3dc6a762cce599c9fa5ae9d4eb15da26127affabab60e7d1f765fb200333989d36786097f086708e35b2ba837ae8d8d20c7827a51143ad73c0203a005bf5819ac9ff8c18e949876d40791193cfe365441a0e6346ca7f0962bd208c3d16566091fb6af22d0a79ba4f81816bbe3d47498c195dfd0a8f4860bd032d6556379026fa53f71037d29918d20595f3a6826872efbf69fffeffffaff2f96461e27a7e7fa5b50205a06d92cfd66dc0b654fccb16f5b871c06467cec8ed5c359e9a63ea40a67924987b63bc777dc68600f2dbc3933b0076307bac4b5c2e58e2ccde36ceba948c6491030a489fe0b149ef9d303f9f72f9b7d409c959bf602fd6756ac5a34fee2b3541b12c97cd64005de2cb87021bdd88653e68b4564c0bd34f9085e120411f43cd6e6d708d6e238e44dfe24450dfdea6273ccd841bc111cdf390d1dab2ee1c2abd392e04f98491a462b3b56a1697ee050efd4c15759b7ae7a43b365a6051bfb173b739c3ac89b9a8df8c47e65ee8f22d258920981de746e780cb8c60d44890882cf30e4fff9019d11f4e482728f96fbfaf2ad2b320a3a43e02ebd04e1d72301f56f402371f86d5a13fe2f5e20446e5af2d0af6978da1e86deeca4253540d8dd3a31ad99e9cc778005fbd55f3183850c2a2262bf39efd2e6ea6fbc8fff02c7a6a342287f3a320897d332a200551b423063ce7f81c75185165d4ac0de2aa6c1bf5bcd6788d1a9961d385b6112880e4e9e334e9139465bd6ff313c42963797178dc1a25df12cd0fec6cb620ba262d81cb278568ace04ed2d63a022272b1565c33aa14c503e5e061032bb25014684eb652c9befd37920852c385a937552af17c79796c809ad25ca21edeefbeb3caec19be603736fa08b827eba1907199d28838706c42d6b34a9a75e28d97cda5a3cada69f78e3ae1c9866a4d060f84fdfb6719d48f0698e1d2d08160d60a3993698df5eb2e260280b5c31e2f010003255fb72e711152f19694db11ee11e522f2c444c280b651d01fead712fe2e0f49c6c467d843713b5dac5e6bdcdba7e09eb592b287b5163e1e80ccddf78d337960bce5c443953270bdaeaa3c03be5e616a87d2b6e5cf649e35e208d829f07100bb79c8545d53910f32cdf6f514c02c21aec8434c4a00ae43adda04e38ee4af64c89a0015db5a8cfcc8563cbc1fdf7945d23483505994698f90969fa8ec2e0d4852c5779ce720d084dcdbb4704a208dbf9025e886cf17e101de33148af81701a36f0eec0b66fb8929ff9909b9c1205c5d4a888674134068ec013c32158238d782ebbba488f2a39bf7b0566b3744e2a40b7b42d0c63ff3d14b5f70100c5686afaf4ebf4406099e42bcde4821b0623023ff06a78db3b4dbf0cab54a149c1d88d6b71fd20a499834ea207e66e5de6bbba14460a287d9a4e3814a1128e8e72988c81f05fbc3718bf90ccb33bc7d3e56bbced2ae6c1c7ab1ca20d572fb5af1320a74dcaecb797d78d035850d1d83c304b85dba4feb6b2172e5fa5722f05855a2841e745b5dd98511c4e44d82381a1658a0e0687c00206ee75ca97c37175a6e117d6a74258848c2b8b061caadc6906cf4e59c82b0c51fc4f06b296943be900401dface811e24cf35eb5d78d338bb1ca94c6328de0f5b0e1c1936a7152aa8b028b4a1071398f912b7f8b55c3612885b07decd99e05faf3eda82462010234cceb44239ffa22371b0ed8a5afdb416c1f136e8b7f4a18d3c9e000ded99c0873bae3e1d0251f1c301d6b1b0d69dc44ca61dccc19589b093a7901bc918ad44c508adc2426010a029df19aeaa4bdc5168e5a511dc7e08e11f74a1569a27ce4aaf1215eba3401020ca6f88c421246f7d7dcf71fe02a0f53ceecaf492f56b874883e299dd4e0f1f220acbebb95f6e97fa5b588e9338a73772750fa88bf7d0d5337440b87e693f8010c0f735d290b4987d66ad4b62bcd36c570f6a411ddd8e3fb5ed99caf5b42e765bd2373143face32ba12078bfd8aec4e07377b560afb020f4f7d983fbc2a083988ddfa978d34b11e774bca35b07cb7deacfa5eafac3625f90e8c766d50c12f83989302dee826d7a0649f1a2f73148d89f134c2443535cb35ce443200eb473708acaf1c10cf70ec87d816c53d7ee26eb123861d834e33e9713e0e42997f14555ff63aba33744820a5209da942470d46c47d782b693e0efd0c1e8aa1619637bf4f41f3e317e6f148000dff08dd4f1339e937e9688f65659eb16f243a0c3339cd47de46e7961cc92677927028121b37059b16bdb25a72878a8147938d9581b8f0b782d297eeabe20a0b3df0bdfa4455f729ae75c8e7a8edb34d14dfa09d4689ec6f9e0d2dd6cd658c20dc70e69ed2e27127ef8ec7e367b0c20ae618239fdc14f91115658e8d866fda06a15dba1ae7613bed668dba260355d15078cf22dd63490cdb8bfdb803d09fec65011c817c910f9a380c7cb8241e99d066efd42eda93c8636033adf8ec2e4e44ac067b80c9eade933bbe42537d33e71e193a908f2729fbaebb48d740ff23cac85d243ca59add0fe6c97b264a1ad3f44a0528eeea81a4e32c81217287800b893f7a1ddaccc19bdc07093cdd7a327beab932eb1962abe27bcf908d4ee3e4178ca2cfe45f5334f2e909d7ba5fc616c8974e0de790268f1a091f6ee9760660b5697efc305935e45e90a1540838b63b4bb05369f4656ab1ebaa388506a153dad0dec203db50d0fdbd49db126e1a5de5fcabfb894aac824f56e58038ab8a0eef60f0238f93f0ab3de711247aae2e5b1001a54690bfec2667b9dde76070ee80d82e9d471cc53a478c6083a5e5fc91219769ed87bc1afc5a417bb3f7d015136c4f997a0501d0da90e5130d8e00ea651c6dcf31198c3202c9bc61548f89d6d91f1ed300767b5811882108dddb0bfb1eb808e0371aa4c6fd3e19be1e4ddc1c266430b62e7e677ea8d27865313848e36ac68423b966bca5468c9126983e933659e4ad83f332caa278b4d42c05a34b3f26f4046cac49c1b47dedfab970dc013c53f2d59145304d108380764712c038cb05155750df8481e7989cd32c22596f3348672254890ab84634918f63347eb09fc3b39d82050a655090f5ce0bac673b5b529be849784f28e907ecaa5085f86f2e85eb212327f50641185ec13b5f43a035cf832e12896d63f24fac224754426230dd10fd69788c4f1c031b26f6e7a789013439f6d9be14ea8946302b0e0694f5c0ffeba4719ede724cafaf606543b07afd028075a08ac631a3921bbca44a824af5270221c024063f201fe1a8df9ef4769023d96b27f14f8b77e604ae5cd2be65e36b24753f0079277aa84b8a87e995349c1f2372a01b5ebe25b284ee825a0df6d4e4134688c58087f6ad9a7365679925c73dcf9c2457a9b1f363ff962f3fbf53ff5552ded9a1d63da4acd5693a853e6b089c2e487f9d7464ff18fe8af1f0ed5753c916853dfe7ac890b659b5ae5aa4874ab1c2349877b6781208eada1da28f75b6fae1dfd8d5605b67d100de821981a0a1047401eb67de32514974e11a12567e9da9c0ab3154e751ff87972d9677d06c73b21dc696d80fb5e0fde12dfe9ea47d816d18335eed2f041e680120e8848515dca74c69f637331cb9f0db443aa3deb69e981f1064618cdb770889eee9a25beb9e0428b9bb1e0194c62a5845944b01ea08e7ce1026a17f0cdc9ebad2a050b3306b4bb3065004f11ff6399307efeaeef2ea77f612c91c9e6b1392aad4205d0f7666b4b24373e5ca910bda3aec141dcfcf60d514efe01016d2f828c1cc01c3a61487c23673907f71bea8965ebd8d140cde667426707228a94d0171a71002b1dc212de099d6908e8c8878a4d8372fa48685d3aa11d785d931edaa552dd7c3687ee8d2c3965562981aab8c2b81258f207c1c8e459c6c65b4da6b8a6be13991a427f5b826f9993d2d9152c7c91b2e9e9475d52da8c2cbc1d40c2d0ff5c0012ae8db1fb9436c74c92f09fa99ff5c105e727fd20532b8dfe91180935558ea44d26b597a6c7c52ab1cb9bc4d47d9344e205471f4e0d46fadd966b2a3132967cd9cdab071e78feb8ef04471642c2761ad032664c0b53400d2caaa050b75e23b3c6391f1e8b82c78c0cc38d3d6374f613d1fea5ff3a98d46da12ff0aecdb5853249ad77ac54944d39ccc087888d8dde2a099c40350cffd0935ba2e1b49dd0290e57f3d6c79df1eecc77a3517745a8a4fca4c6652996406d700d7d17117d755f96e41925811770376c29c1c36de2894e59ea4c38f3e16234cf144a80ae24e11339de07208bbc02b38236b842b131338430eeab02ff9a6fb79deb51d8ea10a48cf5136a3960c2b46e3cdd1aea4f9d202cb82f138addd254505f741a503a8f221166072ee0a214165d6a99024e0b5aa6c3f3f10aa60caf7368950b5be5e9b9cc8c6a8925c6f8b7f30c8ea37aee239aaa248870af9f0c3d9153c08668aba2448754dc003bfded164a207110d23940fa826aece5b39af807b7a4339a3e2052bbb61cf9c61404c93f7a9d10a539dc1f40de3cafc38bae2ad5dcdb30b40abb61c36ac17409deea5da74676bf00c25c45acb9621219abe297451c325fe43f1418b3d26d52134ab0ba3baefbae8afb3b28bed09457b59651a51484e29c8f2fecb57d1bf2072565455e3f899c2df4d09a05d25c3f89f3c9ce75bfc30b1155332abe234987f882d469c0ff1a2d50d622f4154619e825f4491c876985307ad101c496a63767328cdadfe8f34c300f6fa077f41cba7ab69fc95dacfdbdf7b24b61ce901fd5eabbad1ff051cd3573695cad87dc65eab1712032ae72d74457df78771b114e1a61f84394b287594e7eee59fa49ca2f39823df67ad3d4444727ecf6ef509314969a2f14389c1105a5e1451a0f24b37d08ec8d738f89b50d6787400382a4325e5952911147028ce9cc5990691306b8b9c233727a841ddf9f5c82a3a965310d56f833d8d7963be6f292c41d7122930c30b041c16439620380b848d724356c21253100bb1c3292126196f2e0ae81801c8f9d10970e1669dbcc304b0744d8d12145021b4c1fac23620234063944a1a285f40e03c16b66a39913c8d5421983ad2eca9020a2b6594262c92652d4f9833986a4471b6a485f653328b547d105b4bca6e273d2ab7a3877494f24663982252992b5ce69258f836b0b09ceff610a350cce368d824a0fe4294f542b34aebc24ead0fc18ebb68d632b40d9028eccc2466872dabb6d2ac939552b7c296ef2473d3a9dc3bfda868324d6beab3d29e1892ad36c5ff5940e304e798c7ba554a2f1665d1454ac5368d4598f0984ae368327a277b2d010088e375df15a7b965be9413b63ad8a0dd7c42e1a6e1d107b21c2f39ab5005f380f4a3cd8f33019b26cb11b00bc8cd4ffeb87bbe82b524eb3c6509141f797b3d8c280fa26746c7e4b21071ce75bb170150f4fdaccd10e680b4a23ff1e38b565c2c0789a013cf8ad20bd0e1b4e353bb08893e1124150d1dec00943214c11eeb9c520bd4f66daa3ff7cf714c9080a3ff68846ac382793c474a5c57e359556c5f73e9e44c20fba63a236beff3c368ef8e0bba82161d9f59759490275c54ecffd58bbdb8d8afa833b8892af33ecad8e3b663c028b150d4971ee5e2a15c34ceef6f5dedcfa881ac772e38e5820b1bfa9b733bd0241a8a26bc7634512568326d78d8d81f9fbf3a6cfd302a2a6cd0b730032345db65c9e5f5715ad5a049e4f9809103474327b65b91e40fd3a9013f46be2cd0511af37f1a91ec7f1a2066c546644d77b8c520dac1a800075f4d7dc990262dd19aa7abd07333c5a7c50b62ec15c75e92d62848ebedfe91fec81812d937e0874e30fa0feeffa7cafadcf3a840c33599dde4e27bd065a0208b05dca334c85266a50696927164e058db26035fc37b43208254c537dc9d075049fc9192a7707600e05627ceda09d2797f5d9e7853c4e3c1ff0b1b04dfacf1547be49e80734aeb4e9955296d480592140b4b2625195a903f4a6ff37c21650d8172214a54b87c33436d9ba814cc8a7f92b7e00d6cd9dca21ae2f27bae9f784627f1420c1546739e4ead602e3aa183ffaadb26077c54495b4648c0170c2c933fa605e4b31b8c193ee043fde5001e74ff2ceeadb797d8b99b493c31192dc49b6f3a65bca627ef95ee0e80d2004a1f987809bb8043bb9fa293a8809ba369b03a2bfa2854d1624e48bc50f89ed899b79322fbf652a82335e418445588006a690c8310fd413d249f242a3fabb912d47b80f1275ed897ee6b1549bd6b3009483e983c6f2240197a8133d355fe98d552036e6e332f1878190bd9f0c55960bf9a8461efcf50ab6ab075ea82b306a3a726482ec30717cdba75c34827ea2cfd72738deceead79fe0d8e9090baa34e30412cc56786bf20ed46c45ebc5a677932b926fd01bf1372208b7d9068f5d3df0d36448852ecb1ceadab3ced064a6231587856b47e334400413683873187861652d58ed20adcd3b7bfbc199a64c60aa36119f8811a371d00481874ced6c2e5748c8bf3885f863f748e1deb44534125badf88ea4a6eb7e3155b641f4a5a4d38c0d54eff58739eebf32bce4783c0a9d39e2fd2b708c01ab34496f23c1aaa0c8c8c999d355896a22b84365402ac3ae28b4e4bb897fe72133bea0723a7a102523a3052b0780e6f62551fd3c66b45cf05cf6cb9e707fa4c4426974a6db97c355b9857b9b763383c5164644fb91767fb4a6fa731f5a056e8f9948ef5d91e56fdf6a610daa6e5aab976572004530d5b575c111270f9ccad17bec6a5f6bf4c0ccefe3ce79728115c788578ba521af714a923b841e99d08fd48b3570c217a8fa8c922b6c1ab8c05a754a17022de53d3467c5a75c2da6575e48bc3997415e5c307be9a83e5c2530e5080fe8eef911c25e8adb4735fd043fbda5cc3a45e239f8bee642ece317fcb68e7ef7c2d59df1ccc85c66b3b2b8131c37b441d97e4b7d6163348fc0bd0e72f515ae7c7888ec7d08a4bc87145135f58f47566c0d47e2b33b09c566aac2681028c20f6c735b0d0c442c40c1e1ed25a707ab2936dc52911ba73cc1f042e9c31860de16bade416710e36548ad37ba67df0d265b008802d13351f8a82602b6912625324b2e0744702d84f3f96bd4edc419ef00544e8bd49833db5152203e2314c91aefb701e3affee534af229ce0379f9f510d1602869a13dc218f1a87927439eb149efb53ff67ea6c53d8621fd6270c8f6c1bc00fb611a509bcce134f19498c8f985226f2015593f5e2c73c64da9872a822b2a079dcc6822662452c2ad5407bcd1a6c84381f60e9ea7a36b03da2a969d04732cbcbdf7d396d8b682ed66ce325f03f1f5e66be9449db8e0937c8058e4087b89947df90b0215d842f8ae70ed0426431bee794be4a118ea8a794ffbb3ae40528f9ea0431742898e4e9af8e1c48ea4a12c4acdf174d7245d3b9089b842251e7be0a0134ddff33f42d93820828e7d6f8613a8fe5520762d43f69af7d397c14bc55d1a8ad03d89e8774f895eb074cf3560b7758f261354e8cb6db1c3edf237a89c7ee3a515c50d76a1664ae862cbd45d241f066547ba7f962c2a7d62736481ae7630dc454fc4d950c7732e1be44c15d6001e24ba123c165ea4831d929dc65bb4a912afa333b59c229ad44de6fc7c1075d01851d9189ba22383e00675c1812b59f2b1ad540c6c5aeeb9ae9335fd5ca0b8e58b182bf1d458e11911ddb1f04552943483ec2cdc0b4493abc96b4c0db91fece11f4bf6a42231ce68b918386ae8020ca2f19753edde28905a0192c80ea727033af785dbbce56a71560f79277311daa1df66a9dc47825ca4c5100699f9b4aebb438705752600fcafc1a8c08c0004ec1201e2a48f0df19ff5d839abdc53f131a021762c5550ceddb59c5fc49dba4a363414e3b0f6d83c91c7e86f368d2303ae287c1c6e0c969b8ca7287ece25a0dc84f4bbeeb51f7e1073a534f1db5220c36cafc9f0d32b2f396d6359e6102b5c1f7e460d60108632cace2e802cf14eb10c826d081da150792b349560f4989c6b48ac00db2ad048a093bd122a82422a4b57f3be7249cde9dee199493831f0f888393b5671eae062438390dcdd970ea079b4806d175c1110fdb41cb88f217598dac84f624e01d1a2b1ad6400ee2095dabd5631beeca399115cae986fa5640e8e79803533fb9d3279d8ff8c63a5c99998d1ebf844e209960e6041638371fba1746df7778a1e0e513e6bdf0641680cf5c330b55e96377860d1527efda7697c37611a5be64935f0591933d96fa53b313fa43bfd10800a1f09806dab9f5f4db1448c7233b04e0f29d6cbf4f0de9e713cbcd46405702bdbe442758a934f28259899b5e28a0588eef5843f1f0414be0ce49f46b7594a6e030daa7b2c4fb226c057b8e0db8cd284c497670814c129397a39db7058a8f8e187b7f23548f90d1fc93398993807f69958de7d8c07fc7d6c47709e23c84131d33b03c80dd5e480685e55632a96d1136383ef88c2e44b39286fa1e3320c7223a004f9fcf1088037c51ac1058d6c873cca07bf9e0f29ba09609fac47921d4065a24946157a87c7f56b3416fa34fa1a6a1342a0860d13ccaaff835799cd3414cba1f07daaad66cb9dc6ea7dd9ae932389dbbec13ab7ac612855dbf8579e53e3b8dae13f5811c5865e05e772117ab6e9316f1a8e8e348c5ff74b465af58a8ce23bc35802a1ec64acad61f3132627058e68235062f65278d6dac7159bfa0980db6ba32a7066f9181312e4e0f85ed4c6c0c5c418d43cb0a5b8fd4232121e282d3a5ccff670949ddc03bda198dc608c7c87fe0dcc86dac8cada140244443bdc52322b75210488be01e52b7c530337cccb0f89c53d418d00ee3ab4e34be97ae8df7420abe02096e3b319779a982fd716741ab8ceb31b39a7083d3887f38257ef8b18a9020065fe8f3bdcab0bbabad8a07d643546070c34da088523ec9915427aa1a2f0dedd4930df81d1f3851404c5c8e8fb4f1b7139cf599a5e44a930dda8f4894e926e10be980020bca06de2affe6ad35e836526bb274a1c34d434d24dd5e94272100882363d3ca1b6039c530f8fda7ffaa46ca44887482d609e938d1c186929f0dd2c35d1ff8e0184af21996f8ca4cc3b11a04fa4d0581f8a989dafcd51311c29b7872fa708b37f9c2128f4063e433738dc80850cdfa01ce9a1ec87d211cb484f0ae49a0b8c1249d42201d4b1b3653351b25be4f0bbf941b84ff10c8908c85716e6c8af17296be3a892d1c87b2cda242d469a622f78771b962b09c08042b87a506247c19722b9042585375de00ef3f9f6fbe073be1916cd064384eba032a6abd9a087ce8464d25f67e09399e3051cabf10c869e54dca3e774c28e0e580e0d7697db4fbe61c769b8327d28cd595750695d729c5eb86466964c0e5a51c7d6830cff4a5bb2c0db40d37e9a9825b57d1e5a4e68008bb29b06df4e451c3cb608f07278c948c7d059ffc47f4ddd2212248182f6a0909b70e1cb8e157387bdfce15bb532189015256a0a53acc85269792539438872a5c5e992e3eb92b4ea95e45f99ff665cce546b66f08c4013a9575175a2089fe115c50032db4f7629e038b541e4b8af56955dd047b79abf2db6bf6d441ce208a616e7c8b9e44028f893dbaeab6ee88bf11eb5051889f50b5442472eb6e4a1b484f24c5b7b6a250c399d5c0a82c58e6b7942dc0041ca85685f103ef646591f8e249b6750ab6fb9a3cac145e484215285ebe4b1ea11da0a05235f148d646166cd17a534f419ba10f509a48a51b0066b92006da95be120f753a8a2bb606413c688992d78972a3e31e32aba0cb8e672255c0dca33fa158179cfe29e355c62813542474e683274c38debfa5b4146182544961e17f2ddedd491c49aefc53abf61f6a3483a50dc724a602e57b30d781750c8921b5cb2ed844b9e42afe90bc411da21f3154d3214878fb5616db361e74a0519456c927dc6e28e431485e3dd8895dbf86f7923447791d2368199009005cc515a1a1f0b1b81e956144a28fd647d38369c21b7843ebcfc00d05f9474be87aa63a086b3fbf3f931407711944ed1036a72428635e1d03e5f80b9e4145f5d0a73319205cbd5e431824b0e05a55f75fb11b673068e82c245794d5e96c6378d597b9eb0a8778086b20b06853c23433bc610c0ec51785edcbd7001866ffd70b40a31062b0a706215dd32fa97567052fc956dbc13395b57d7fa0d51b2ed35cb1e45fa701150af8c0da68f83123b957e94de757bfe4bc5a92efe21b195ce41dba784817c1ae2a3a1483a464a86c105c2d9047e8168b226b1646718d0d7599bcbe96c795a5496d45e48e150fc6182a4d819eb72080c9200b76525d65aab2bb4d84809342f274db4ccc00bcce8904017201ffedcba0c62611f072718e184411ac999f246b14c0a97cb6c9f4e4845e822e1d1d1d266743908b0263bc69d839e5a48ce9bc679abe5b85f3c10d7fc05a48a0ba0a462e336b79fb2d043a3cf3f22491d5ffa1889befbd3bd0b6046586f00f95a2b502bb9100a6cd6b4e65600fee17991b625087afc690ac27410a359d8d602f0c8c4899b8c872968944414db7a12e719c36f2e9c5f75615e4599946201aecafa34de5030dc70c7e74f67182eddd0b2d64ce5d7b72557e491350c17a8791e99d96710ef1aa1315d3aae40e68f5a4444c556c0d1cb7f3c446d8f9115ff875b7725eb70f689acd81f32d819849f834e3a30ddc55f292bda2f98293ba01bb6e73bd480e53aefb698d2f76507d33a6ead61dee820d181db9c85610c91a826c01dbe73929a0183bd695ec26883151f6017d776b108e26f32b8c14389eade1f9890861510485412e3a684999dc5c058bc09b4e06eaee0b4a24803047226a9b437761902067304c6032fd5555b621ca3990fc894de5aa3348c67d2843766abec6984d207819f890100a12c23ab34002aec42b1fcab63c252a701cdf08c119e3ff9827dbb6414229860ddb1366d02527de8691df076ec49ccbd0efc6005e48dcc79855c0c6c070d92b79cbbaed10cb5d5b5b1fc2c798908ef54f273bb8ee303a3ae7f45afe80a038c1776be59f7c331d3b0d7deaa45302b0e4f6956f4c4134a83a7267807253d72225f117feedc8c5747b4aa6fb1e3d022c2c357a773178f1462274c1d151d2d3a6b28ee80c381719445ab092779b34a9df97daa8857809dd663eb6e84078a023bf2890087fa9934a904a25e377b7ac4c4966c68dd645fa969f30cdca309bff1bb2c6fcd4977709c843d7da6d49ae7610d24823c381b0f512c42211a434a8256882b34575adc93c6634bdbc3ae20640240ad7e7c19e107f3162e671c7a8d4db51979e7a87dd9bac4dff8a7533cac3ca7ec9121a1de6702640171c1c395acfc64a7491ed81812d53460e4d31cc286f24c841442d82711488bbfe9bae6005213442a0424ff8de878c2098b42407c8cddcc583723d81c0a7e24cb558f38c5b88fa1cf2502ae22dff9c32d86b9c70b88839f73d8ccd63d3bca8ecabb8455cf53dd888f73944bdc361e12b6583d954dd12a14f43d71f654d119e4d3fcc2fee2fbfda27e8a30471d388b656b209ac6eb88aa025e9aa7e9e02cbd83a87ba1793e8e3d6cbc99e08f74794a63e94aae0ad927ffd060ae66e27a1a21b1994e19a15038c566cdd303954711ddc5f6cf609e4bd0d86602f1418120d3f213aa6761032b14d9eb242ba1108b33b65c75653236a77e6271161c3e158fa243085f8d61a26618822be0065c89baaecbbb8d122b206956197251738cffb6258beb53448d969b60f6b7dbe3329dc840bc4c578b87209fa33bd24c1991a2f24be0d191b80158b4bac41264a2cfd9e846fb510e6b37fae82fc9d560fabda67e2b29c9bb2a5c6b44afb3c0d28e0efceb9cdb58ebb24196a40aad70433e4b068cc695467ecc1c43d6637532a55f7b42f784a34792bde57242b4ddb72b801efe2663db5aa011de1cafe4332d37c7ee7f5fa4e526fc3fb6b1cd8e6b5c3cb0c7ac7aa789ea9d4a4d0b45c62ff16ed24695a760108496248beefc5f7d2f0513595f5541e0fc402592c93ea6c9a160e38d5009f43417460254670978d967c55e600640dd3568620306f5800b0265510c358c935d68b3a50805be39aeb44fe74bfd7249065c9331d914c6fc0213be24cd549d7769ed68f8ecdaa5c18b9d42559a1290512163b0b414cfc26d08096d582abb8846a191c7035281df2edfb85899594e29af2e28f269f6034783e939aa91ff560a71ddec47e43f2246191344b596edf24c5b3c96135cee105d1b63fe00d5ca88a3e19e49ef0c21e0e5b1477d966a9d3ab09e26b77c1cc2d79602643b4876a493d86e6fe61211e969755461ef008e1814c222b65ee5a6f64959fc5a5271e9871e5cea808fd05bf931791483a2cc86db3d31ef57505e5d293f73fccaf956204d88050023a37215f9fdf7a723bcc3530002b93a323d7c511593685e806a6a82c41758742f132ec3fe46f9b633844bb99531871516213b80f0cd8faab289a228dc90955464056ffae3fda62d7e78261d323c0d010320f84dc8fbcd82a1d66e77002a3b6b04e8652776febcfd400444fefeee08b11a5f691e2a0f10a99b11596c619a6b8799302c1d20fd27f3613d39b029832dbfa83f6e987606d5efa6ff05437d54088ed5e12eb85d190e6fb7491452136c53b39b8f3494bc111be9caeb9043bafa076b6401ea33beafe05e9373337e20cb60365e4644a4dc8fce41851c58a9027afa91e12bc9bd29cb4825c89990e9ef3e3e3c2a0f8875c921d7450736e449b3a4dcf1c6d85b477d5f90605e96f972aaebc740f57c5368b0326ba63a60330be901db8702c496dd55073b3556b49874b95054af146347fb7b0fcfecc5e560dec0a0dad267f82db0abaa2602cc90107972f25bc44d8336e340f68666aa720a2b3473a032642bc565066ed69e48fbb4f1b7b6b25a9209791d014fdab9f644d4929408271fbd39fd6ea8014ce9f8c73cc0d3eed727b58ebd6aeedaeba1439bcbaa1ba087b76ad83152feea531ef7fc04154d52e7ffb84688b8a32703b49497ba8fd3ca0fd935a40e80b4656e8caab2a661f8bf7f64060ea94eb8a017601b6b65a86fbdcaedf9f88cacf6c5664f6cf3d327ef7970da3a408dde698c9adcbf288c758baa3bec6c56e039ebda448a5a740d702cb51c124484e5fe067c9d84ffd7d74fd2c35a1ef9f85bf1ef0b19e9c4e0b7b56a5b0efeff1b811b8184c906e630cd6e3b0cd0803253dc6df6720cd826bc7968a4fcae01ac728500993a9bf43dfab089b957612a60946ff0a054ce8b8a22574a3a2a3741bc15cee76afb1a7c4d2fb30188f19a5a5c97523980a8b036fb7a73ca9a4135da9010e7687344a5696667371872d9dc7b0f573e83a306b25835acbd6d82fd4655f557350a5926aea9bc9001602bfef78219144125ed36dc718d8f68dfbc221e32826e75ff202b509f05d46223414473a1cef9c62401fa050253d9dc427d080e83f6d1043795b280659e014320041c1009b445757de9ae7d05094c793c065b272812ac2882be5d8ef2b24ec7cf5b0b19ebf457f7cccfcc78cf4717036c0c320f1aaf8329e4a1cc9918f774269529194a7c61d4b98b57817c633689d2dafa74b16e83152a5a4710af737b2a8bb218b88b217057be1b99f665954e916a95aa147f1aca11a7bf2a53981c16209a42e43f74ca03f2cd51a5ec3f096fb91637786edf52030715f8bb05e42ab005737f669343987424198f180c1b1d091f19ccb01e1be2c2f4dd81ff156da744c982db9572d101760b06ce8ec117932187011b2870b698e4741a255065a1a7bef743d7851f25ef7af88b05389afb74e4623af4060f27328c60862dd03f60e2e092e75ac8718b39ae3825d8886970e69b46040951da1ba18df44ab2e9184a5d11505e02b57af3764ad41d8baf6a09b418cbf1469c05a3dd4094628866246fc2acd9d71d11b63429fb630121f97290fcddac3ca5a7759b883a6f688c7738120e4b703000d0e90e6d01369fe4d4df01918d5c7ed70ec13e03403569106defd3e231153223bcd86911c860ac127f8c517a5d5e6ffce32ca921e301d2d93c30eb4ecc70dd42f42603ff65f32fa9d0bab10815d7781f08984d94665375e4afd2da520cffdbf405c6ee79e35054cbe1a3055e5d438d5cf0bb58ed416af6180618e2bf6961976a46ecd6767911180faa2fcff356cb86349b2cfb0678aedea53a41da34d30fc3ef8c6aa9a0b3482fc9dbb365d14e1350ffcb6260f91b6e18bbb4a7fd8d5bd2c1976a3e9d88254290ca81d90430be1dfe007c03982d30ca8231433003cdb5e674d10f0ee6df4c22daa4b8f059094114b940b509960be05ca97decc9959e3b919e28140d0770f62becc7820f6f955a57e6a2b222323eb77a54bf3074c0137e8fc4fdcfe08b02caa60af9c5aebcae6a4646b7d19ec3fb6b7a5e4c01935079c8372e129d66ee4f6e6160e04a940e3076cdc3ac60a1be15c7809ce9e1652829c6356d54ebf0481279d654cf244cdf22ec81295709c27b612b382e6a447b2ce161f648ec7a0333da72c7af7446b199c5b78182b65628a394ce4293b6e4b7decb9502ade7a252ffb378d4a9997044ceae7f16600e2a27e5f4cf317bf782698f5e8ab93b5909407df7724b8503ee1412a0eb6f9d54d1db721192f8d547cb61aa55b0473670133b46b2e07450761850c48d3ab4d40a9d43bf9a9100c3b424a3c5dad9900b02c94506a46b95685bb615a42d7de25c5e80f3ee5d2153cbcf14527fc0c603b60107c7a80adf718eb1cc96405113b8d02f07f16796434e9eec4aa4230f17aee99f3f88ac3171217c1d2c5def9b5e5d7a567c314fc5641cde8265150c2d8c396f836540a9631ebeb65158619a6cde19bc7a0917ee95d623130fb4aaefd70e24a0718c88e75711dc19983d1d00a9a1f8a7429072f2575901a56c195d4ae9afc1a0ac0bab0807938b2432fd4d26630230bbcc105aef1ea5c5965e0e537dc385da2381efe09da1cdfe872b3e57ea74be5f811a55a4369038dcb16a1e87122a60b3a5e8a219a6dc41a66abf6af59e4697bf3f7d924ba11bc8dc03614d14bfe6c70f5763f6a9779444a3f196646c1139f1c4b21a813cc9a80d39e61599850d54c002cfab648c852e85f893799f78d5e420e8f2cb312834dd4c82146dc456cb5d07662934dab65dcb35ebf1ca2b567c4940ee564854f6ea25912706d42094d6a23dad6a150ac1884c810154fc633670fa3852988fd6d563440cae2feb35047ba409286e2af782b69c1159c08d523acca4582e26f29043decbde4876a9c3f0c4ee5847bb9bc80d70171717f3a4bf8d005cff35c7080387ec65ec81a24e0edc11b2306a396e93e6441b15697d910d9c20203a970848a938a2ed07c67fb82dc2c4e37312de59aa691eeb67a5a87f531f74dcb516fb3e12c0063ed69b80da8b07a0c61e89e84ff62d2999f32bfab192b4a21b81ce097ee6f0541ac82a0db6cac0e6f0a5e2c8527fb7455af2a2d94f0e53f553ef4ee635f7cded4c485e0657df83ddb26112fd1499e08d8e1337572f972007b30ce47136430653802b04a1868b24be6f07351e026970b573bfcbe4e706c0071073a40add46ba4db1019dba8c3689ef64d6a401cb2a8099acc084652fb0eca614064bf2e79a1148e4bf7c79ba4f47c047f4a704ebd81b954cc8a17caebefc4d765c7febcd1418fcae664eb5b3840acbd326940cf0c1415bf79aaa02b7840a8dd9e18ab513a1cb48a006b46cd79b3ee72a0b3fac7715a40cae505f226d691e5f4b5e12aafc9440c46afa2ea1e0a9ae73c30f32063d42100130b147954068942d49ddf77b3397ded414bf3a1df622a8e4b0fc77dfb4b16f01f52f91e506b30c93433e0b5af633be49c9f40dbbc35bc7887797a99dfebf252680e2b3050277964f1a93a4ff8d35561f84aee99dd92d4087884d8ad1c6ab936c0ffe7cf4a939f736b42efb8186f97fd09a3dc15c02422ce3450ea4c5c191a9f6c4f856487a396b4b6dbb0d18cb939803fb918a757863b972be452cdb00066593b5b55190e52babc19e490cc40b635c5800798abf3a8c8896bac372face9ae3f40857ea06deca74542ec9afc8de3ae3a38e869704671437a91099995d0591845674ab567a6295a78abd8908ae2577df728ca7fa37e12017a474cf94bc48145ea3e87b24b7609101264fbecefa12dec3a92f63425ae08e70fd92063b04490b2dd1b421af24fefe4dbc6c9e0dbf452bbd94744a81d2c4ed63b18a2fbf9c9ee112e5025f13704959f5587398239b3c11f70ae52780d4de66820a366b14af60e580c75b4791b17a737fb79a008c418a93839abbacb3f2198052a2f2e86bb176136274e37291f48aae218477176a085739a15b92faba87af389986eda11e49600205a7219aaedcbd116d1ab4f4883460f344c3d28749520fde3c55ed5936b8e557cd12e74155af547b7f8101a0efa15e43ab49261055766b4d6e090e6709e41b4d62d72470f69456159b5af0b49b6182388fb8cd4337167da559e5e003b1974b01c8a88824f1c8fa4439c0199489878cbcc12147f38a9b9036bc53702c5c32bb3405a4e246433a279b67278ea2d1294b0402692e3ec064f7b24f2019e461e87d315692f0cd7a80ebb3d74f51757d9afc843dff3f4c8168c3edfa1c8b890d305b70a992cd91eb43e630dd916cf8c1ebfb0f1205740be7a7ae3d79d6ce6e6cc5f239ded7a8d1ae01f0517b10d4d7cfb41f5e10b08d88edfb7379cb8b14784d98ba399e24d8500b1eae6afe3b53fb43413624744a163239e73fce9ad202a3d965386babd0b602286480b07e59da8c0d6bcc71a1b0e0271bb596fa5340ee4758d6be1c2791f9d6d6fe169277f74e0af066a59ce4325365cc90df8c6ab7e8bc9300fcf3b9d33334edc38f224723d79a85867081c4ccea2ce550a5eb973c01bf037a69622970c357ead46b867bce4832d39e8344976b0f2902a3b06bd8cea4981ade0c8bded2e235a641a786557648f0b0c4da389a04c8281a556827949d03987eff4c32ba24ea2fd70bae8476580724035d024a5311b54de73e459528d88f20e70a473a38cd48a8fa96b826bd079a2c5910e3c6292cb937bb9804b59b836bcea6cee87cf35d74216702a3c5a90604d971c939da147fbab620600bf43f6336e6260218bbaf62d320ef1ea360df02a7d7df3b0f8c3e472b2912ea52fce0eda3208dcc5256a6dba43664c23abadce7cf6e906d2550c29700ca43d6b23b36845f148051c1e0adf85a178f3c87d6b9d01cdacd7aa8dea001ea9d1ce24591321ab518883b1e107a7b6d55b6bcec93356dd084e879ff22d55866397751386bd01393237825d30d0ce005c230e87e4fd0fe22a6a89eebd7a10d04d780a5624bb2657b5642155789bfdf0397372433b1c519532db2d2046552a13c574e64234e51e14ea2206122a069a638694d0013db363d50e6c5f0858ceaa9fa5797bce9e2fe96b3b07b30d7fc66fedade73a70717977f06947be0c539404daaaf7bf9fc07b24e7654da4951f24ce57a614c23c19f1b5cfcfc62ecae6a7f7b1db80963e802c7754f1532e53b4338ea1eda9e8975684fc2b7b5ef693c0afe49813b5803ff894acc7ac503fced347624653376263120f57147801c487b7d06b4a489c7cbe8a4d257b80e493c7581e0abdd1502d9665f6f7669a059a27fcef78771b153a3ef2cc2aa3c86d8422f9869962c2bfef8d8c35a9ac14fbf08ebb2bd74a1f0e58efd97aef23a37185f048fce21294de9dee17f1844dc39423e8e80fa46ba88aa9031c4b0dc05ae7810e12acac4399974fbcbc870eee1bb8c9737c5bd820c1d627e8152d1dc7c53f2e4305073246a70e38fd52c5dcd7e888a9ce29b4ea6591308ab30bcd61c905873b6ad781edb7c69fc33679f23cacd96f4d93fb543dff517a83452b78d366973dada30c3ef667f3b77180112a03a47ac61aa7561cbb1377b35f944cecbb70f2adf2090fbf36b355a4ba110ecbe8612680c2c4ce1c3b3d108c927a1295739eed73ad2344854d694aae5e3da8616514189cc45afb38c5c9614163f4d3b49381df57c06b1bd6d3b78f95c596eb5b4592e336d87a76d84b365547463bab704720a8b54bdce188f7a350468f80dae2bb90a4f693c8e59c3a06926611a94e6f7caa5c66de3cd960db34a7d250683e3ffb4210f0906b8a05ec02303377e66c236eb2649ce14e95cbf510a951fed229fb1acc07b2cdc8524da3b2c4da53c51c573d340062cf759aaa10af3eec1950d07f86f839e68fe1f2b7b1c4393dbd848c180ea8906036acf219931c7ab4b9537ded65be86525e3f6a2725e17f4d2ce1aca6388905240387c13b69b51c938800743a3328d6842bcb4ebb7694a5f67ad7a103ef716e18229cf8ef83ed27ff1ae9f5246285de14df42e59e92e19b543e9709a00cfcc068ceb545b0c3fe29c4e940e70e0b7c438e7f33c36d0496feea47897890fbfab388102efc713f78388cbdb800c07b27c7b3a4b250565407866b1ee8c1030d7807f21d00226fed60bb6107c39240c6daf0bda5737b0d050dd313c47d6ab2e418f9a858e2aec06d88c17176de2215065eda699bd94f15305e1aac8c737a89c682dad746e7719f6abab762eea51a7738ebc1b0595438f00065c7c0a6e428f3b42b6d5061e80953cc3ea3aba27849349b4d3c59542d59cd099122bfff13ee2fb9a512ac2e1d43c84cfeb06953960e735177d77ae84b3502645e06debd2c75a51fc6f27f0a060ddb6593a6566730f23ef57ccfe40dc8905d40104542a10ae070cf45a44ba4b20a3849f6bd550d52604359c9baa2720ee237bcdb6d8ad87ed0c53615555f5eaee554485dc77716eb237587d8d1624ddf7487e9f21512e5489a024092d35af1d9101f213dd1f4b8349ebcecf88fa8a51c095384b84cb8f951e445c55e931a169de92491f730ff5d7cade355c54ad03d5153e90575a3b9e18760ed877d247458c8395536316a5265b34e475f9fa0d8a3851eea3acf47b322b92d54c66cf7d1da10bc7d1b1b790e68c45cc1cce1f2c66667c603a40aea4d82b6ec9a8eee4f6ab49982971ae5a0d3d51b037102ec1e65cc9fe2d57efa3adefd13858ad4706f0e057abd0292a901850940faba635b0f4601c3cc47b17808fad9531972cc0098aa4159f7cfb67a240b216fa94d404b40624a77f75426cd7838c14c1c660374317245dcff8748cc5504f2082585bdb41e748fcc890100b5b5295a711f1a43b961a3bc63e59ed222f5586313ce2acc0957845b82464d2c530e18e05c0c80d37c83f014a5d2f52d7b3aeadebd85a392a8c47161d255c207447460724d8a09042f2463bfac902c4bb555a0679344246c2a38c06e4c62b3b184338fa586a91cdcfd195f8406ff99378ce481bd3846dec65a3d8984a2152070511d844e1d620d1a2e213822826a5585bc21d0f750e4236f3933616248930e35f2a7f7b5228c440ca9d14ac90aea63eb03259a4085e7944d571b3cf2dca973a37b3514db73b85fa396db54034c93dc7953708368586bf8c995c86cf867411a200bcf0460f7187d1bf4a433bc5bc3f41f1f84d1fe7790f2dda83d32a6ef038253f81fae9a1e1dd5da916ebb7086592ccbc00fe06046d9bcd6da41a414121c1cf135daeb76f1437adba486f9b559f36c90b30fd2cff0e41215c70cc5272d027e429e7bc70399efb7f638e3e91105462e3325afe56ed24f6f80709e5b7312cbc81b1a848d22325b8041185945e6aa623d0c5291d8cebf4197b5c6df2b8d3578dfcbb1b36e40ed9519107cefc1f59977b1a61484d64468935f94086f47638eccf9b8d1a43ea942caccbaf9ad423ff5630d0ebf8a5af5448895653d1b538032a12724b1e05046be492ecf54c70e1347fcceeb7bdfe9d40ffb5062cb125d42e3c8d11d16110b0b3ad5dd90e94e65526ee708da8a5ea4c6e89b52c6736ff2e83572e2679ca786fe1f47bff89e9e089c73d30102783aa15bac1a0c4f7d197ca09d4a03e29995fb331c4a58bc765bd021f5da7004922f647b01599fdcc1295e792d1a49c133dbf3022f4e44c9c460f20c5064fbb843667e2fe8c41a08f1f0c9946cedcbd0983401f7f0c09ed9c993b130681be3f18725a391377260c923efe3164347226eecc0c027dff614868e44cdc4f1864fafac190d0c899dd993348f4f18321a1cd99b89702402176d8ed08cd393737160602b58efb9ea424064588aeb9dcd3d0acefbccf9d2d1cb897efd089b92a9de53513bea44653dbc598a426124a1d28a60a849adcfd98e0eb8723f90948a50bc8a9ca635611b22a08924f28e82fddac4822b1bf4859f3114bc9a3006eb83edac35a1588056d143f7a2b1f182d75337f044500b34ca75f79a9d80aba43dd49789987b8113cbcb6871f8de7647a4dd6632d4c5431d84fef0d755a907ac06a2f112af8a9e4a81327d9a0fbd68d6045bd21bc680b381392c810224615e9cda5fbcdb9e5187ce45553770611a53ebc66adeb05a889cf2bafa71804bcaf0c98025ea2cc2e1ed4c8581f8b5d6cf7b1bf2da2f12f598af4650f1cf73c658f2b3fb0386b39a5b42ff5c7bbb50fd9fdf307f50f9a6fd33b6e3f7ae1a217b6dd2bf422ed17efa92a6014fb251f69c175cfac92c1779a5b878d1290ac9470412f1c197e74e92ba1075ba5cbd8da2a02aa52ab5fc21742d8b78ff2a0ac98b7aac7f0af54c5ebccd96b43c8b8a6e2e8e9c5aaf8cf1a0b47339a5bf4b1b24891607c0efb4af46289dd51fef4f8aa47a29ff177a5975c89270a0e7d3fe61bdc35b535a44d48873fc88ac5e422bfbaeaf32018bc96254e3acf82c67c3b0e86db87d5c868305eba5480a880b39fdb19377727ffdd30a2891ca8d00af120cce40432170e9be084f244cb31749b6e6c2ee08a23521cb7b3103f489afb54c10e0fddcc6e14abc47652331ba3e3fb99426e8c03c7a1f340e8ff2bf29bac21900dc21882e26243d8cb4522af1ca8297a44a715b50a3c6a8a44be3c0ca08a6e1a2c31c50524ac848e7ceed9cb9663a002e8a8316b85dbc59d6bdacd066e42d88b2c87f2dcf0e46d27f659b3b5d9a1f361eef4b6c6ad71d53d1812024e0c3ef54acab21bcffcf3f254962720e36b709857929ea4ecdb0bc2a3337d7abaac8ec8a0bf3b8a969d59c9f60efe919754387c3ec241921f30fb72909846500975bcd80325a73ae87cf35c298bad1899ec899901cd1c43dccecd122f6cd71d01d34b39f59f683b394d536cb5e63944fac5ecea6f48a6963cc43775fa1553b7990de54181f581e897d6fae6259a1af9c50359a0049543c7e8f80e964e0e674214f35978804ed669d8039de79f6b2430d83e91cc6d30555ae1e8b6413454a7d297964c8f32da9780b27f2610a8583dc79492cf66bcc85dca6567376f429f4c7430c64daa2bad8d3e601738c6f970995b126368eedc6500832f164cdc76febc7c70a9cfe1b22d37a9be0d22eba8e30de33f6759006c4049628df72c479c13c301182c9be1ffc85f8cee92d471f20d15e8e58cba5b887b271c2f74d8702a40d5dec0509cee3b491bc689733310fd38caac13b1d46328656a70d50ea709de4eb143e28000130b69b30c081bf6864766003a2149d3443d6a23059a5858e0933a6e2c7301c0b917e6af1eadbd919595e616726f5e3ce2d2ae38973ba31347227db324df30e3d9de8a69fee0c0a4e7c0d30538ead3398ed480636ddfb1f11cdcee240e9eb522a29c7da30140ebbcfe2a80978f048508506848778112bab9e3beee0bb45d8f9240628d74c0cab9a62afc18b87b1070c6473fd4cf7215c64371b1c51367b7fab733e287e634e7e8417514d61dd433334329da8c9f23908647fb819220b9845c2c9310009953f8bd440869605f4278e1fade0fb337a8f90fa5ca5c385efc069f09eaf672b492a3753d9103f7dfa81522a7138a9462dbe4a8493b1d85b0fa7e6576cbe37daac420624159a8280937b6ffd261db124ebb9db61df40f72be264e9697ecfd51a910e8601a0dc9eecf88b8228870f39a6f3262a4668b4774987fbac3111219cc38d179d9e2dc97ccd7d103cc5b9a82a2aac398041a47cc0134242fa21e7145aba04e312ac1673a17a44aa883625155dfd99c7775f06202c5bbb84db5a5126356c7aab42d88e424b1e10212b3c65c09558a1f7617809938f641f8865923d66db25127875d525ae08018351287aef06d30b8f1716242951b520a41e3c3674d78602599d137b6fe08407cc01679dde82bb8a229035c00c1f251c988bd5e26f52438901c9e95c1935a01845e2d030c21553be875b9389710830df98c21ea60a638e290fd674d208a9e08eccfb5953a69fcc31a4a334a142e3d56d6c47cc7ea08aae7a644484b8e7c7486cdbd54417dae90c8bb0cf056b36dd3dffa75d8c6c04690c2b381a7630254882a787ea7ef3fd6c094ec220f28f5a23777aa0f5b52940610ac604483b65d1d51ff78a03e06d2b265b7f422bddc8dc664dbe8bded1dca79075765a342021dd040f115ddd990b11e8ee06782788dea5f2de027116625947b120af12a513e0a71c7a6ac621c905d42e32ea8394e04f9c124bf325325841750f6b2c8c4eb0d46497e899d24f050bbc32648cc5022487dc70cfa02f314afd400dfa4752608c18eb261fa07950aa06457c50f73f072b122b9b4c435f3700b1d475d740b97ec925267e5268e479ec31962ae50780ca522dd44ffc8c58555f729bbe38b920c4c8f12be398773f06692549a0499c82356739b9097f50c4aa6835f2b312e243ddd3c44a7c7bafe1ee8f2e6d7c3202296288a533254bfa68d920d6148a65e7a24147c5e6dd22cf42a1f5809e764d5c699e83b23bec8d26162be87ad2ada6fd18f8dbfb53edb0b20a1dd16c66f713d5a09e1150a4fbcbd09703a511870916832ae9c7450d43cdd0403978f2a22fc0ae4b1f7f0b024bc1a2465708409398407f1bd3f8162b5de7aa20eff2022c0e653166c52b2f056f41ff0d9139e13666e9df3c0a7eaafd9366d3ac8d0f7a3b9cfe3139c710edb9e3843c153105c0669aab3fe5f416ab2e34b486d833c8d0b1b35d3ce46d9192fde2da681d6c866a23ce9341d9658795909ac9f5cba0e09e90420c9425348bbff2a22a1f3fc967e0b1e7de4fd0accaa1338c49e8dcffdab5504c870a6c224b2d9b0f5fab9c8541c836431100b4b9ddadc856ccf0086cf0b4afff256705bcf5f3d780893e6b5408708247cd1108977fbb03891655c26263182cc3672b47f235ee6326440431e347fd06fa85929c805bd7a867a9425e3d3144b4a48231a8db5a23a2c9a46c185ded954a911b2da6fd78e4e3b10a1f6905ede3bca93c9d5f5359ff6fec822102a2c3c00af0bd936e8a8fe16cee6ac8722b1356aa57b52cc2799ab7f8fbfc3dc8b5a4af253a45a077f857e36fb11540c3a58669cbeb476162ae49c54d67626be844425c540b1e83eacc14235201ab2f70404ef53eaafaa7ffa09c398eb8cb2ec6b408c5d19a74033c2d8187fe3ae1757aa901af08b6c62e36d4c6c600c466342462c14af56ecb965b5e8962933c44f84cf5eb54c7c66c367744d25acda01d3851d5884589cb8862d5f55daede91dbcd2108195f54e6c055d47719acf669a1b4c4ca3c92cbc1e573c93edfeb937350ef4605a02b486b3ba1e7a9e0fb6e01a4bce23c3cb434785793a8861019e06fcb200d07f329125265f5f7290bd654ff08a542fcba2255eb82539114f316f03f21bc938530837e75b631a02d6ead629cdbc20bdabfd24a0e174a4f6244f1a9c271e0284f49a6d970790347d8cb7109d1a846ab50d536fd463a47fb991e094680d6912d612afc50da4e360a3a360f53c559bc2d7e54b41602ec08927aed604e736ba57dfa84c1e898583d4aafe1598d809bec11d8fd83bf41f22dd054f928e1e2429f6bc25a5f90d66ed52c692aa7d130becff018460037a55bfb258200c5a351d575f5c2af1d94a6492bf661e4408bcab4105bead218333e18482f41d74f4c30b0a1c865e9bca379d7b5e66a3574ca74b6aad4657b30c276a74be5ebbeb03116804cae3131a55a089b6ddc86e6b7b6f29a59429c80a8e0a3d0c349f5236be42ec4ea45b6f72123d88e653cac6977527f27a10cd9b9c80dcc79b9c7ebcf426a71e977993d3cc476f728a79e84ea4bfbcc909f4a07c03ca252dfb4fa6f964a29e5c2b736d9689649916cb377722b38fb984e57e6552ccb776403dcc62eda07a931398c9da01759cbb7650dde966b176d041f576271b7d618def2b99da975ebe24fa52e84ba02f615fbabe74c302ded28d30ebabdf68df5b0781a99da9f3e92f677ae593487426319fb5d099c27cd2406702f359565c33e17c92d7996e3355b7b56bcd39829ee65bc5d13763571937425fba715d747a03f4a51bd85f7e03e64b37ac8f7e2346bacc6f9433efb9f1e3e334bf1104e42a6e08f912f51b35bf41e44b342fb1b861f31537a82fd5acc4b4b41442084b365faaf952902ff9f8d2cc97ac932ec2cb45a0de7f83fa12a5f95ca279f2e4f96a5b914f225b3ebd36944fa15a3e898054e43308289f351f5a3e7f7cf2499bf5e4b39ce5b32465f98c91f924ade718fa319f309bcf1c438f3dc7d0bff2d9be3f730cbd98cf90870f9758e4c993e7713e730cfdcd67873cbcf51307f836e708fa9a6f44f402192b7dc1c8d74c4462c2017ee84b05f81c34a146625a9a7d8ea0c7484c4bf673d49ae65bc55130846522d82bd762a2b7cb448b94c3e743a41cb00f9172d40f9172900f22e5b80f22e5903d46ca013e46ca513e520eb1916e769f46b2b9ac388af4a2b6cad855061313130e1c82306f1745d84be6ede448ca62de5ef6943ea3793b4df63e34c701fe8fe308faa5d9abf0f61af940ce94e3be0ac7713fc871d07ea9006ff376a22a830987cfd79c0907ec859c2907f836c7517f88890947f91638130ef1573891e3a8fd927d16de7eab329870c89e29477d16b9ba05a6ed22ea2bccdb45d4894cdc45d46de6ab8ba80f996217511732c32ea25e33c12ea2aec224bb887a90397611752013d645d469e6ac8ba8ff98b22ea2ee63c6ba887a8f597611f5d2ece922ea33d3a78ba8cbcca02ea21e3381ba883a69d2ba88fa68fe741175982964d6ba88ba68aae822eaa149d445d441d3d64545d4afb9a28ba85bd30293451751d76101b55de3ad324e1bf6fefab00a0594bf0eeef8f671a427b880eba2c884e38e641eed251d36fa68631dab5183f4a5d9bfbcc642089df45be471c44450f1349f2678582c9f3674487172d6189d2e00d451c3d70cf325fa95dea7394bbe7a38a7ca5797fafaf59fc0f3c4d66ff0ed7b628627f373bc7c75108c89501dac0fd2b7277d30749babd3dfb717dbc69982d5c1bfde4bb307fd0c9d08f339ee8335acfd91c6b08722cc1ea4ed01e5ba7a26fa38ec9918ba2317b41c01c31263c634d169b0d8c069024c1074aa705d7971c920e483eee85edb82940f3cb02902e4863348be00f1c40d35fc600506ae212497929f1eac966871b7a06fdf0aa22e109f889b5e5b2bef08a9652d0657136fa576d65a6bf319c39a49d6cf18474915c7864b882f5fe09aab07aeac3f7141683101c1355c520f825a537cf081a8e6367e98b2810b8614de5c99e2a5c9105a5b58729e184209130d9bd7191859064f19cff6b3c74f1f3f493f657ecefc2cfd8cf909f3f3e5e7e867e87e827e9e95e63f3ed26834ae6ffa306ce554106c744f8f564f4f4f564ffbf9e33e3efebcee8f597d3f26fdd107867d4c6b835ef998f47b4cfabc2eaaa992d755d21f63a4cb7c2449522693c19199f4c9126c0e068bbd5eaf11e6a48f3018cc4792e41169d287e9425ccde65eaf570983c1e8bfdae6428c310882346c0e5b6babeebd5436d74e69bb520efb515000e4afefd80897c71b81f2783b20af23b46f0744df89eaa0d552c912536163d0826649d27cb8c1ea2a8e103e298ee8806272c5051a8e0c61e60913752c135100f1a045c3ddc66fdf124ec8ea66ec5bcd2a4ff1b958a317f551ac97568582f30229970bb41c9147af3a767b77019babd608e6d5cbda0833e92e346dd8dc0b279a5a361242175dcc268c1eee7a37521206820df10573317498188a2efa68365921813201830ebc9d094e4d4e2f87f9989d5e6e82132cf4b05655ab97d9b503ac65839ad5aae26895a76ea3ba8d04d15f2e86a68d84d05f1efacb86db5cad553657eb15ae609c516c24fa75d73eceac68deb12512605efe748c6632d17cfc4533997e68f48a72a13e9f17cdeaaa3c8af5d4cbacf594723d751f38729efacf6b46565026731bcd4b1fd1631ecb26ecac93602321e63dde934dd8dd9e6b7b7209b503ea369acb5cc7aef431997c448f551763a2c7b20dc8676095d503651b3c4af5d469a60da8a72e33a7987e9c698904985bf771a62512b0bfdc271fa03fca75a6129a42071de625348d3f26d38fc7bcc6bc562ab36d8ee631d3e6e3a4ebd88d3f2613902f31916023013bcc61d904d0b1f72ee624d84880f9cc67d9849dcc1bd0bb998f346643e6346623e63f26fd8ed998e5ae1dd09859da7cbcba8e1dcd3c6b95cdfdf8086436a0774fd8613ed21809a0630732fb613ee60a6573d461d946f397d3b0395aa7b26cb46ce3ead8fd983ea60d9dd5719dca2aaa19bb8e1714ed11363f982146bcf7dedb0498bff7de7befb5f736c1c2dfebe2d55f27b3fede7befbd14dfdbc490bfb2bf4d30f97befbdd68295f6ed5b62cacfbe7d4b80017b3873e64c0688bc1004073748d880c399af5d3b4c0933870918282a2c4c905982cd93e2d107a049e41547dbbc6a6e2dde1a67d0b0b6664bcb84116f9928c2ad3dc25ab5183547fd9a3aeb349fb75afd568deeee8512469478aa815446caeb1f2f5788f065413dc96933df47d6e8ee0800049233bf213b8c59b36bef0edc1ad1ad5673d47f48224f1277d6d49288228939be24e6bc0e0fe814db915ed16fe8a059c9ba78620f4fea30ea98b4b6d62e7ae5939eb4e9411fcd137b08559388f36ef5d56b555fbfda1a5b80fd933acc5cb21484eb230e4db2ae50bebc17f072d05ff9c4d8a99275d1c31808972c69610c843037ed7900101ee8f43b06d6c00ee653c93a761ab38e4da5eb57242b8d99ba91824a1c1d5589e2d1086e21b839b97704374bb7aca567e8a2571fbafe7a99f74979b1f8620efa34df1cf8c14c86502b90f1882824a27a37ccae444e9eb746352b670e10394b9c20e785283966fee7db27878610899c2950725c7892d3e36374667c40433c72c91c3529c568f1f98822a20e981436308512375b45a264f8c126492c8aac0c8db25696466865a9287fda28067ed94a228adb8700d03fa02258a475c6cd9d29769ca1a18bf03286891b869022c51a3642c423974c596b52d2ca078c01f2c44490362edc3941159a24a03cbd918202cfe30f777cf8e10e474dca32f4e6fad06f18866158bec0d568255159d6fc881fc01564b1a8b5d10cf1e52d6ab71a91d788fc56731ea26acd6b44332c9803901934daf741cde7a356abc5d039514db446b717ed9b41a3e6b823b4fca9132b9e62fc213b478d74946251a782fc9226a62ca9d7ce30eb2a8e7a086e7f14a3e2e8093cc230745dc51d857eea62541cd5592332d485473c7dd8631786614892d8bcd14a93acd51cca53a73b2269442abe7d472cf9fbed3b82eacfdb9582ea00a4ca57a76960cecf44d1ecf72ae39ea108d7c3bce8a1115b1e2445b37a29afc3407cfd450b1d966d35c05726dd8a4aa1d7588dd0c5df2ac3ac143ae8275971b1048039ccee9928ca087aadca20a2b51171fe3a7623d47c8b6f5f114c7eb4b52ae3ac8e495acd4338ed933d0ff851956b5909f4eaa2d3b07962279d66259cad91a9f2bc4374089616c148c560f1b83d0ff8c1e5c9daf38028ae8aeb1f2b79abed5e6bf4e2d1da47049e9bf524f3c591f2e72dced39fba0bfe8cf194bed9fab37d1de6a95f5b471b0ff801e70765e471d43fdbb7f5d52df501bc8d2d007c6af38c7e51bd4651f69f942a0cd58c8aabce426936edae55e12db7204762dfd0deb993c5420f60b44e406277d6becc834d8466698d54b0c40c912966861831c48e96ad1011f6fdf37143c5c2d77d48f592f8f0f5b80df1e1e5e9e6a34b8f9b1d727db0f0e1f7cfc7923f75595b468ac954354f6dfd3df97e3d76e80991b236df6c73d47f3d1e7fefbd17ac8160d7df1fbb7befc5d9fa8831362a6b8efafd3d35f1f73a79efcd5197567341dfbf2736fffafe3d65fd59faddb2503ca4c0eea2504c8307c403f6d8f261a9d31d61a781dd460f288f9dc4f8621ceaf0edd86f78ebcf178f1d742e6b71fdae9539c4bf16044110f479aa4317b5878de4f31804bb8b28982b985b3473dd56bdf5211fe1f7af4798cff251070300749c0924b69c28e2de3ab54e175947ba6155e822eb95cecd548d74a9bacc7717f9496fb654f6a9f4794b659334525b07a9d1ef38d3392ae377ac695cff297b1bc3f79f3ebf634ce3a807bfa34c6fd0556497ad366d7b94fde311e7cf1f8f257f865f7f3cda7cfdf1b68c7a57fdb703cf53acb73e5a1fef2f8062fd8d8940c52cdd9e7e89e6a158d483feae77cadab7d3288d74833e3d8dd245ed48375ce8a27617dee6259ae7b11ae9ba15f3631ae9a46f33c5eaa2f6315dd44e756824eaed8d64f392db3cd66bff786dfe14af00c6aea0d7ebb69a43a82f7ae84715f412749ae82b6baec11a98abfe32c59aab2e86f7c723f3ddc3770c841b682b3de2fb8e5da7d8fafe7dfba698f2e36c6c6b34b4c2db6990c01a5d6f22efd1db67582398b77fc01a65e0cdc2db56faccdb2f608db277ccdb7420eff612acd18f3706de3dde8eb346427ef3f613582315de2d62b466deb20b87e12f3cc86c917bb7167e81fb9818e45e0e03c7b9ccccb907a3c8839c34cddcbb20bbe92f3383dc2b0af2172e9a2c720f97816be0a169cbbd6cfacd417345eed940b72651ee65a081e77cc8ecad70d059500762e1440ee6a8173b0bbc347b2c72948b5d4fe62c88dce6a3d923ca5140bb9ee844394ab6735f917b435eba90d91b6d0ee434b36703f2153e337b4039caee7a352f57f8cc61331f7d458e2ac2666f96a306b0eb91ce62cc51446ecb51b45d0fbbcd7fcc9e0b18394a68d77b399117e52871d7b36ef36bf6827294cfae17e4e58b1c45773d205fe12e7214b8ebcd7a1ae428dbae07ba2d97a36ebb9e90978e81c770396ab6ebc59c856790a38e76bdd0891c831c05dbf57e7c85f798bd16dea3a76377418eca60d7bb6ef39ca372bb9e0a2f732f7b94d9ebd1d3b1bbe52802ec7aa5b360e1b0dc03f21ecd7b3fdeeb711f6f91a38c763d9813e5dc03bd87bd77bde7668eaabb5e8faf70377bd56db9c722f746efc1bcf7f25ee8a247d19dcd2d307b345f917b517447947ba5f766de93798ff498db726fc87b42deab792fc8550899389b6baf99366cae5d8579029b6b0f326995cdb5039934536773ed3f660936d7ee63529ecd59d95c7b69cecc239b6b979917b0b9f69849a16cae9d34471366ceb0b9f697f9019b9ba25c6cae1d34dde6dab149c3e6daaf49029b6bb726ad26f5d99c4f8aac3fdb8767ea71d857a25efb5a111583f8bd79563084f6751781331b5d44fbf7ad6b233a6573651b512d3b6ba4ea35ac29df510dd75a5ae67d3a658d48d039eb5c535c535c4bf47b67a373d66bb5b2ec1c9d1ad24516f7154e7952adac2afce60e97ef1f2969a391dae6acfabe72a9e6d4af0f59997588f2a45d55c60daf443df4ea144f95712ac9fcc583f9f8443a0d2ae64052330f9a2a5d85911e17f2ea95aaca383b8f8f0f79f5baa4caf8719b535efb6c665d5271d587cc4a558dd429b34a5528b33e999547f1d02e2b213f7df4b326fa98148b8631a9cf8c99940b69c24c9949ab50ab8aa33c154f415233233e4b685e9d42295dcca7d8f3e338d7bc1fc86d2ea13a05aa6f007bf510e0a8de64bd7a87f914c77c85724d451010edc7a7a79cc964a76915cb94ac581557c3545cf5555cf51266caa5e2aa2f81995ed12d15573d04ea22504aa6e2aad737e5ad5da55bb27695ef2bfb2f5ea253bcbd51747dfba290f3e3b72f8a1f9e5a5519f6adad55431466678446a2be347319056aceaa91dac74ff12ccf9a10f6deac14f3985bf0ba0dc3ac04826e45312b85a1db976725d1dbc26059e9f5723b8e590906734b9259691cddd69a954827ddfa8b1bd563b96a559cfdc94a34573c1567dd3a69d62eb3ce31ebcbac5b558e59e354381557db08519ef5eaaaca962b2e5bbc70f17909e3c30a43062b8b925153652cd1ac24cb54cdd32c3ae5496995b74e9fc48a83aa46e45435a2515523a2aa6a74ab39ebf645c559a780ccad5f20e6d63f10ba7512c0dcfa0948b74e79a08bee934ff1e53df92c7df4329fb55916e10c797859a65a15d76689cc74ce9829172cd3ad57a6722acefa9298299c4ce3549cf5eb215010cc14cf5febd7a45d6f4aea27d5fa1e2a123162bf8efd7c113ae8a19fbad7196374988f7e1ec5ce2499cffc6c9f9f1de6c71beb6fd01c488507b90a6fbf425e136d3ee4366f27573891aff0f692855be02cbc9d66babbe9edb5169ebd85b7135de037bfc0db3d03c7c033f0f69bdfc839ce73379668565aa2796eb868b7d14837a82f29d96ca38ba8dbe8a2eaed2e34307115573d67e2cc5bc555cfc0c4c0bcc0bcb530b369d2589816982b4c229b39640a9935156690096456ff31bbe27accd2ac3e336531d2ac3e9e475fc5ea61751d388add707d755c97cd556f6b52d29760337b1d04a6d98c52a5ea7350a97a21c24a954b8d84b952dd428329d5ab5254aa552aaef6a954ad2aae3259bf52e0b1f9ec3c7984f0f2a752adaab83acb6798270f9e57aa612a4ea942a9b8ea5d3deee3e28f877e6d4f0f2d8ba437cc0a1443f2c2ec0b763d7cf1592f10933031bca08bde57ebb3445829d6b0125162c1f2298af92ccb309f354cbe782b2b2b2b2bcab3a23cca6bad1244b06cb1b588284fddd75a15d65a73d52ba8d3e9743a9d8fde2f11c49788927ae9d56b1556e9b22e8fe5b346d2ae7a73d75c8815a7ac5eabac51d75a556b55ad55b55671c92a52d61d2c779edc597247ea0ed4959d2b3b55769614b1236587d785a7cb89abaead6f5f579b2e345d3874c1d015a56b852e245d43ba9eea74d5915367883a5a75c8d4f1d5b9aa53e5eb2ca9c3fbf6d1e1a21387ce0f74d4d02143070a9d25df3e3a52747a747837843153474a0276e4d869f3edb343c60e183b30d0f142670b145c76f0d8e992402dab95552bc52e56abb5b7d62976a4f576bf36d7dce4043ae833ebf5627722aa57b4eef4725cab5edd07dd39817e4317ad3bc168d7ab3b890e8e8e9d606ebdbdf4995dd1ab3b61077b5e1ebad3e8533a8d3eba53473125f301dbc562a537f980ed64590673a7d7d8631dbcee84bd3ad4d06ee64dfe72a7d143f701db95b9070b596e7a855e4577b27e1d6a681723f398bb5eec4ea18bdee4841dc35e59f42627eba23b857ec55ca3bb26a7106c72c2d7c9d6ecb5831e1ace305e4b80269b430ded6c6ebadee403dcd925164e210f3b9b9b7cc876d6a1827677895edc6396076a6867bda9070b1f307c730f164e310ff21eb3a1dd10cda7948d3de48c8816e453cac69f594f2dc88756ca46a09e1f5a10adf4112ff80354ae08a2f9c8dc89f492687c85d89d40b75156d884bc86bd56cb3d58343989309b90903739c1aed8514ced888682683ee5e84ea4cbbcc9076c67cb3d5808d57213d4d04e456e7282795035d387a3fe2b5beb45600fcd8ee15a31687477b5d21878ff6663796434dc2c386ae5f1783c1c954d962c47544b8ffb425689457a69ccf800cb11406e5ab00411a5058b0f505ab090f98105873f7531fcb0f070ac00e4ea8715863c5169c113450c3bac8499618a3ae11437cb04be049162e6496f0923742764edf8d1238a0f688c807185f44a26834f8ca13bfa804914449e88228919b24c3da9818a891b3543523802c48845770485453324ee8645ca12a8ac52fc60068ddf55d7efeac9851b28b8e4b1e2049a205220656b090b555255581883cdc4e815197c9488472f5851229a79216761e19725c8dfd7dfa317c4daf7ef8a1c2c431e0d58c503f7ea77250e9caba5bcf286f6f85d61c3468adac2ad85a32a6dfe88f28af88af867e5ea31c64e9618e32857ae6aaeaf7011cbbfe28b5d29433ec6186317ac58bdaaaca0cad68d72b4c28d8c719434054b4a0f970915377749d9f3fda342e6cf185709152f7f96974a0b54aafec43d19ad3541b7d5c84e5646d06ead5c9dadbddfda4bc95b3b6807c1dc64a501bd33017431f3c26c853a98dd52a56bad8b40fd8e95b420180504b309b8180851dcf451f69b50136dae6957ea6475dc0a9619a9a71182ea85bed3c0c9fa9192d4b435a077369b0dec0de81dce24cca2e08cd4426312b0d398037a877313cee63a1605c94749bfc966e3c9e6aa779e3c361b0fd0b103bdf3e49981d4426973a2cd75efac503f4b6ada44a034db44b04e9d66255b1428df61b7d570db468928383b5919c175ead83b68a73110a8d9151785e7043a0671d417a166a5364a18e17df536c58a1b692cf3ac5c77b262ab71dd319d234244d14ae943b3840f74d004a1050226c4dcb91345431d39547820151fa2958b04ee46015a3a4f5826b0833d0fc3300c432fab8c30bc4fca30a495157793b8f7e22230ee827eaf5ff0a2406a485617569a2937697678d2d56bc38605345ae06f4a1021ade2250b657f79cbdb4479c12a4a596235e527a50cd4cd64c5a9509ea45873d4a5c420a5ca9fb7ac41ba5a4a4529ad4ea9c541bfe65b716dc3510a2dcc698147edef8bd5860b5cae93a2ebee8b2365cfa9b98e82a7e644ef6af4564f35d77f962088b50f410c9c51c20a95540c2870d99db537222ee92d59e20914aaae8ed85171dd11f653f73174f85a49fdfd6b35f5974e6924653fbd2e5cbd5c8872e1e9cf9acf4df540f983b2038a114ba0f83005250c11285ca4a0344922fbfe4199da32f6edd48de0f6e7ed9b5e1a0b4f08b949dd90c5f78f851f0b587fde667842c38ffa64cb094fae9e9e44818259e0f204872747509841e38327bc232b2471e44aad1084d4950a557cff5610b302973f7538c905729321d2171983c9bc7d9499743733e96eec1803cc9883a6e83393ee640710a919336326cc6766ef6426dd55b36d4e141d3b688a7e4d985f30f46bbe9c344ba21387c561df6b15677d88b7c2556d046d2088fd453512e2b21e63067eeb254cbdbdc1b13c282fde925c555e6c15956dd371de3a88ef2dcadb9f512350568f40598dc4dd5841ad1388df4eb8708c5d473a46073423c873c5449d2d4b84817265860d982d3250698102081f175e3538f1d204eb91d4a98108106c9e5838810a4308993a73c40c91ddfd392133a32ddca75f93a7c7e0fbd7448507bf7f4d8aa0b93d6c6b35b5379cf9a2e2e80834aad1dd65057dff986c3191f367abc9a11cddfc9974eb52bed4fca94bfa528266fe4cd2d1508e37fc594be202e64f5d2d862e7f26e970d8f2a72ee90c963f93745aa6fca94be2a1853f93745baafed4258951f26792ee86237fea92c0a0f06792ce27f5a72e49cd097f26e9d030e1f1a72e294b8a3f937463bafed425a579e2cf245d0d4cfca94b2a83c49f493a1de2fca94b82e1cd9f49ba353ffca94bb2a1873f93745825cefa5397e403993f93743360fda94bf212e6cf24ddcff7a72ec98c973f937461b8fca94bea61cb9f493a32577fea9276a8f26792956189d59f6252159740794a4aaa7066a04f7fbcdd702fa807ad03add5889c7ad0583bbef2ca937cb2a4510f3a871d5f79a529520f3acc8ebf7ee9e3fc4894d6ad63ec6fdddfba49bd1d8c81407f6c5066e7f57ac1eebd972ed11748a9122ebf2546b4b2aaadd6caac14943a1803e1d545203e40ffcd9dc54e61a388e216c5916f86016c3e6b6f71eff0d431eea90a5a54447cc76cbe555c9ef26cdf8c0f6820c0563346c551194e085f00a108c14e7a57c993ad49a87ae86a919eeec8ceb8d926917a6badb5fd2a40f1b1ef9f0a72febcc17aa8b824901dfa01a9cc45a1928845cdb622689cd15e21b620d6e303ebfa23885121bdde134f5ea0909381143d5049a105861f5fa03081cd7181073759acb2802409da8245052fbc28587260e1a219d3e48e1a3b4bc6a8c922048a206ea2f0443d099a6d1962840d5a9290d2c47767083a4594990a026a85263e3f346419d224895f90169a006235866a880a3df450d50408e9881454b44c4981b22601509858f383889824779c10dd4033258716be440184120f5678e3c4af0715dedcd08456c28f1e5a5548f020314502d24091022f081d7c1461c2c4023030bcd0c389154cd191c3011b9e9a227200e286c99226a00e2b728cc852044a0a893c3854f12184922b2778c9418993320f0b6cc63c05e1f1b3220122a898045901c91457123b64a42a8c0d73b26c5d71e0c312274a9ce061ce122a5413e01003d49621904ce130048e8fa8272431ac5982aac98c7493268b192e3c3c4ac48ab05242448a26e20481e4678c982c687e49ece092d268d2701541018e0a461c71c4c9e8e44413659eb4f1610a991756000495d6173b56745218ca008829425841e2491e2592f870b3460e9316de5c19b9208a45ad052b3c6a7867a4927852a6c7112867a058028522f8491220c45cd11066892998946922830f45d060040a112742750b92284f576c9454a1800c528e1841650c11572830215b4b4c0b6d8638a2cc8f2c0cb0e242922d2c4b4429990a8bae5000e24a1169aea4f4d8a27acac22407224c0c51d171a85c4922093148764c21ad2912c788ad3149c608e9090286168638e3048a136084aaaef88268c2862e4e82d4747cc963030c2eb0c1610d9808fcba7c3864c5604607a9262da2c4fe7581238313407ee015d16f58e841cad31c1bf01401c4498e7afdb89945e461e287993b4986ac11418b0d46144125874a4914ed3561aab8a9d383480f282228e3cb8282c277e7085413a7400f364ba2d810a78834318c10a9a3250b112b302730914521d9c10a8fad3339b8e9803703151588bc61e3820fdb093c7a5841959625a23cc94eace07bc383181690e8355961f1a8a00c0f5e0d539288c346070b62c844e941091e6ef8ede893bdd3e408560a6a6c5419b6d63627d416afd8556ff5f6f447e5838feb18e31b365f603f6f8fc3f90596cd55a1c27abaa3f2595babb89aa34ed57bfcfda3e2fd59d3adc18285f6f813d7642b0729a286484115d99dfecee369963344b4e441e18cd4133b03e850a5840f4d1a1e4a762fda2421d2840a1148b4b0a3ba17bf6354f76276749541c2871d98aca049a53b7252a0e0a2f543618528bbf6f6808c97835eebab127c24af171a2c776e3093c50e103ba807c11f92141e74d1c38e3556a2d8c2866b07f26c966a84942329b71bc298f919416344cccfc817235ba0fc49fe8c18c1469e605d45e414815324eb69111c7e45b61481f22bc264fc153152048a4817d753274799acbbc856d1174aea422e94fd230227d4c2fa53f47dff885cfd49f68f88d58fdf3f224c3490c2530a556cede4876febdc5dd43f2370be7f465ae0092dd713e0cf881dcb65a9fc84e07051809a32e225ea6e81b2d9662155a0a60871c1c714214e4e980206b9f3b3ef5f90ad3f7557c66e9fef5f10adae7dff82f8dafcfe05711284d744df3fa938a51a502a8c5495506a498b3afefd03b286c5f70f081721250d42ad4aa1ef1f90210f1b654b34cfdb6a8cf66d3e992c0ab6fe50a0a24a7e3fbc70f9fdd8028191ae500ec1f3ed5350df1947fdee229c9a1e71a88a212850994aeb62addc159efe86a4407f437e50934a29fb07c4eabf7f42a678ea24fdf9fe095182fe8400f11261325b0dd8b7d7ef7ca2e07f80d4d629a0cdb58a2bf20427b95144a0ec8ca81f503507a37840cdc050559e6ab6c80d6fdf3fa820a0d4884f63dfa88d9aebfd0125ea85efd8cdb5da87f1f2dafca2e61b91b2fff682a43d7501e4505af0fd83daf2f7fb0775f567adc280020a74abcab046d5c7e3f18cecdabbad111de98c6a04aba231c205420055794d9efc9d70e5cfd63a61eaff6c39cde543cd9f3de76bd7574ae901ee53a392f6f4698cd2de1ad1aece55dad7c69db5273ea3d6a200410a86a2188254cd0e9452300cc1300485e05b1f854b6234d5c208c09192fa2d12c5b22cc273f18b1a0d1874a10343f1f5124310bb4003861af41badd6124a138a391c088a2980d106a25896b59a7b0c32e20ba7810b2f58064e6023d98d84c1b71bd53870516bce3236d205df3493b1db0625072e84b66232f25619b60551ade2c694d4cf9a6c969bd8da1abf7675d1908f59692231d2c2488942d943e9e8f343762359f0eda2589617f0f04323c52a83aed0008592fa59d28088e8100af51774010ab2ed80d5022bfcba65032282540c85d98c8a9a908eaa2654dbe088032ca121156bb2b2c0af642acecc6188c43cd888808e8003870141bb3a65731b94212271d60a0b7ef274757d97290b58f8d4e1e2fa92070befd9c08e9be5195d2ecdef7083071cb8f8af5315c7811b33cfc460fc66cd9916031bfd9cfde9636e5b96b59a3b0ea7d31d1d7d0c36b905d98d24b37e1ee90080fbd37318f79a3ed3620af02f58db576e6bdd71baa2205adcc86ea4581a2a5f6f45746e179046350f9e0317a25896b59ad9e4020c48aef7194aeaa76390016c4d5611960c70641ff1a7b7cde0abc3f9db0cb89cd862ccbec1030e443f5d88b96b59d66aee385c949c06a4188bd21c20516ae0822cc083615896b55acd8e8b175d006fd14618e73a75c37b505d84b92bae7917559f51cd342f487ca62c22db7ecdcf9777066d0482b9623f8d1ef47383b7fa9aab9dba0529a9c320bb91ba08c60b182e34c8c1c06580c105306e2d606418304c87c1c2821544306c432a846a308260c0800144fb81e1d353ce60c862248c11665f30441821886fa595278311ebf7fd1758c8d4fe44de5da68dbbf8af0abe1d7f7b8d7517dddbf9da9d8d2d40d6ddd59a4ce014d003fd2932e1109ff606d871d41e3b9eb246b773422d7c15f9d8b105fed6306953fbf82e39f1de3e554cc580ba0b339eb2b9ea2e7828dbb1f51a0b21006f7dec0a82180441aa42667377d1f55b6554dd30f6ed84f1befa482b14edf2ed974b6751ba3bf3e72bcb5ffd8aa7f975d545d501c0654da820295619b571d81b4c416877d4634ff3c5bb9192a1597754e6d4573f85fec43d46986773f5f26cad86799f2bf0d6f35b6a6537d3b64678d73e86f85619ed22ec8d5fb10334112104e0411fdbbe603058552103737711a630de14235d214c95a6d5db03260a36128e7a4990a93e689e5746750b92167452c495c420e07bad5d6267f6e2b2cab058845b033b76259ccb2cd246ea5ba3467a0394bfbdf0ea97cb574ac3bd8e95b08b37f7ede98a237bd736168215cb8b7337eec40e8aa0025ce3be12e68075ecbf304b1ebb8e1f2f596335ee873e5e7c7102689ebf99886e501d8cdd24cafa2751bf9f2f6ce6a81f2ed9bf0e62b721dc5c823c46031841bfc6aa572a068bc715428823215eb75a4b8a179b295f4fcd94e2533365f8d44c095e33257e33e57d6aa6b44fcd94f5699992fafdb3e7dbaf99923e35538af776db7befb5e6bdf7de7bf1bdf75e7aefbdf78234dacf91bdf786f74d8b5d54efb5a7ee4d49bded12cdd3481463fcba17062bc10c899778b5bafb14c18bbbbbbb1bb4dd4855c4185f9ccf7bef751b8aa01886a6881dc418bfeecd23c6d8cd7bc33ae3dd61879af5eded2188af3d753bec9055713687106431e166ce1b25a4a8080d51658a246bb0a234f9cd99cdd0c50a4e133bbc3077a648b11aa720e22bc20992264776a00d3dba50190206227468e0fc59f365fd29d688fc66b3217aff0895b783f9081bcd271f473bd1a1c4ddeb35ba689a309304b606f4eee54deddba1407414bc9c83bf3cde08d4d6d9c62bdf6e24ea41ad94cab07e99eae3a81f45f4b16f9ab27f3e5f0d5c3e2e35f06c6c84cadbbd1c7c9950e24ef46ea428a29fd6436b5f3ec3becc36cf13fc0541500947fd9b45ff117d4615f34d42abb529c5ef1f982e20c040f10207a60921bf383eae1e92d84cc30d98df839982e436049822486e435c9fef1f981d0ff4fdfbb2f5a72eabccc5572f8a6595715eeb621947bc59a9661291299ddaaeebf88bf301facb2daead395c5b78babcf8bc84f1792183c5c5de8b310886e215455ba98841300c45f10592a128be5e30d8c885bc24692b2545f205838d2349c6e4c8ae4c662b9569c1c891246331996c4683947991f9665ebe7a5992f9ea3d583ed7c7c756ea53a7aa54353255a5ea920a05a74d1c386db6e4685dd12a5bae68152f5f1d73796a457978e813e5e1a15214ea04368b4cb7a16169add6de8bc10b82b65290566befc5180c6f18da4ac38b41300c45f105bb3098ad14168aaf170c368e64ecc662b6d2186c24c9584c269b95b72c6da5654c369b95654f8fcfcffdf9b195fef8fcd068404041412a6ab756b395d67a461fd29a3f443fa435694e23adc9741f680422ad79bef8ea41b103d0c7b58aab4285ad54857873ade2aa038932db8daf722aaefa0130949aab5e83a0644a5ce53aae82a1545cfd1343f9ea953eae5265742c84157fb1a05419d80b00045623017d754cd5487dc50199366daedbdf17327807322af859bb8a47940318c56e51ac06182f1cf1bc57dfde1edaa96f07dbf1b5f5c269b12afdbdeaa2f6ea9817f270a9bd6bbabbdb5c43b1ec45c51a5af0627cdffe5d53c92ba7bc770dbd724a4abf526bc3cb068b7ebbe876cbe8c6d1683f340b9257ebea5056f3ac91b55a59b6d37c5a7f6bfd2d8b57b2e6d5a1a46eadb52279d79cf725b3d578bdf5a69ff1c6eeeeb3bbbbed69adbd6bfa524b7677378f1fbee0f0e53744f9c507c35b17bfccf065862f535e967ce192c3971878e4f0c5ea4b150e3718b4b6142186245956bf35cc50c49fbafba5840161cd04b1e5912ec611172e56678d441b03551575a5489672aa6867b01242f1e84517e348862bf1fa66a0fa5314cb19a6ac87e6ad0b9b2e6afe749f0d23f5919a21c8dee6db45717e3454796bde4a4199ad06fecbf4f637c39cbf1405be2b8229edf7af8b993fef9da1acdfbf2e64ae6b39716f755d74b0ee3bbc75d1b6af4b982e612c132516c11786c130c63886ac570c5a332ac618638c3116b348c600e7318ea188c7b84ba35d22d84a015c3aec5095c5fb614b972bb04b0c3212c2e47027c9133e50d9da4229a59452fa7a1509c3300c43afc160611728252c555851400569626a77d63e8c41ce87610c4b7c08002e6dd25cb103440f2a3b2d40fc7e4794524a29a5e12b9ff47a29c3b0cfa4106788224bb6e8b0a4e90b798428c3a34c992670e0611782385f1aa82e88b7586981610b113cc4f2fa295aa32d3f44e1b894fd341aad36f4fddbe27bf1fbb785cb9fb429196eb37a2f894372528241aa7eb4b7bf46642d9212dc0ba426e5897b8b7b61d5f4ecf0789404bd3d46c559fba2e6ace32ace3a5255d9358b339293b22bae2bae2bae1ad5b2783cde0e4fa23182558c58d60b58b817aefe6c325a2f3c59c797d29b9194945c219cb16f484acaa3b276cfa8b125fab15ae5650ed26a1d69496954e69e34446c7d8f5ffffba535ba80c7cc1bf4635ed22e9091989467f9d5faf878758bddda0c822f1f1f43b2b48ec4a4ac17b04665024aef2973575ce93df99a3de679fdc74bf3bc6e4f1d3ff3d9cff51f9f398dd59865a599fb789995aef7388ed5b8dee334463b40e936cf6633d367a40135fd8c76c5d91fef07b23d3e3371d4efa1f5e4dacf8d2dd1bf31bbd6b18f24098b810096e609661cf57d1ce72841ded628287bae33efab8be1d66846cdd51e25e58d410d1c27e5cccff6a98183d4a43c75d75a70044dec1663876198eb62d4c7b5eaea88c4a414ddf7f2ea1fa8325e3027fd5e985ff33ecc613111689efbd6145be6336c2c9d17a8b4ea570c4339c91845330218000000a316003030140e0a85a22409f354dc0314000e7fa64c504c184a034910a5288ac120c6186008008410608c21c620e6e63a00d02f0f6628fe4f663dcb2cf2b3af3207de05498e9699d9778001f217d830512723901306cb869636d449e149918a201820ed51f456529aff2f2e9f5290f00dbce8b22352950d0786f903d637abb0fff842641e736cf9c0541f3338872af34e0eff60de850722d4407335f3b33cdb2c3bc778338c67c935eb776c5db453fb35d000016ce95456fdffd5d93cfc502cc194e54c3c99fe462027bb2deb6c7778a1a2828144e7e372dc3f9e89d95337101e8989e5f8e6528ef8772343058c6b631c4939edb9cd82f69e977c16860b601860fdf191bc19150a36e6b4b426b8134e0770d4a105ba131dc63560daf28803f90861c106da250a5eba2e71dbbad49c7045176598534010eff2bcbb7e2457df702f5290735373c666246780b6f847b9c22d1902daba78b0bea6bc1402fcafa03c5685da295fc53f958bc41ac7270f4c4d60a6f6e9b4beebba544a86beffb3212d9b9f4c6a3059f1373356c0a4f9f4cd59275e052eae2dc9efb3e76d8a5760797f62d14a3da3372d66a2406b4a7164b917017353b10122efb7aff10b9e8eae5cd6ee2e7961ba5dedb7bc0de788f3581d8defe947f45f453cfeeaf944a6b18e47f92a2ad001837c08db32e49ce746823214562a69a7f0b47f81388fdd242ec3a448ae6d92acea08f7618387d2568bbaa492a74c02eb2415e8561a311e696ba6bf6147481e8c299032e2531f5c3b5aadb86c2991c16c84f0340724c1dfbf5316ee5115341b5779d02b32126e380551b81ce828efb1d3c17f7fa723ea7bd00f7bf02faaea34d4f703026ee48f9be7ccf34bd8b7323a1363c32fe568341c484011bf76e3ea541c44218de3e015976bde6b5fdf43ca3065df4fbd4363c05dbf722fd706ae7555207a36c4a4719bd54e6b33ca7eb6b7df49b7340381fb77542b9a227787d3f02550b5f92df7af1c03104e024394d619844349b440466ea55649444c65a3251f4183153a3212c2b2f131094da15f565078b64dbe27325f840e2057d7809e7d6b6bad08ccd46c5345bc20acf29c701d59c518d84eaa3715136d9dbcd9346dab9ad850d40f04e176fcb0733acaa1d6ceadbbd2f8dea50e52c0e87a6248d233d7ed859cbd6527e0fa25fa0a90dee602e9315036e4590d0253506e33fafcf88c7a2c52be7f6c56d03159464453939c803663336784822c2b88c3ece3b063edbde959a2bc7e5d527288cbeb04e8b44c156681d07b86d708835e24440dd542a403e84becc903d377534d90988224a114b298919ac8660a14a7e9a47ecd4754193268bcb0185db0b4d7bb998973d5841fa1da9316876de27abeb10b4ebc8e9d5e5f582817bebca353a117d3f7f433ef3898ff47be9fbfc6791225a9484f2a0eab9f30b1e7368114a1bec66952054ae7b885ebad8865c4c50557687351ffd59c74f52e93416129ca9805a6746f1690d7ab6e75db42cc610a0660d7032426e0613e6cc1841cd82ba7ef8871d0131649bda1c5e663dbd3123ba9bbb679b3d192875f6d20136e80d4484f04918217ef409f93668b182693e7e068e35e0d5f9ca84fd10355b85182baa184db53465a53241716625bdf3aa5d5955a8627601cdcc7584d56535d4b7b3501e70db0c27977ce1784bab5b7bed15d5253ea77281642d8277940ae65c8f463a5b9e904a7930904fa08dc6015a304c04ad58b37ec9c972dd1f1be3ebf56d21f38b75a3fc5c2a90bf0a509750bd79a99922757362eb8dc1846e52a112520e30882411ed235874bce2b62e1983b39167073a3b7027f9194e0258ef4d8f97779eaa0c097a1c7de58228203031405a5c1c46ddb021469246244f61b7cc41dfb26731496f25b3803ec342d3f0a76ba8457f61cd7aae1ede0e10d61f071ca11c979c76397b7b644081afc3c2a4ffac03cb071a246728972eac0448b8c5b1ce28398461dafae565f67051cb39a73832f6534d3e20632de4a382cd13959bd7579beec91525bbf980fa2fe8ff20021602ce7c9ee03697a4043b6feab85431300c27d7f3b6122ff8ee83365dd25b08849c70a3eaaa350312286a96a1059e358e38346de5e8b3d12350ded24cd734a53b5a207275b0793efa1acfd86db90f9fc890c57aba3b03bcc8f5c019cc5f6bc584230376448292c4a1578735a7bf7dee671bfd1e6a123134823c14064f41c288ff1c360e40e37f54b09f4974ac0652b81635e07c8bf03d7b0a6af84cf07973085d3ba607509e5c6a9b4f3e329f54796efe99a3e3aa1532dfe72676918f4ad1cb688e2d0b51845db1b242137534104326726cebd6cbb9417d1060eab48f952a6dd64a03fe8ae68366a590cbfd810c062678413f97f7899788ef8235396f46a6e10ca01f7ef7f5d05256a7da26317b3dcb258d4b7651c58d6aca61c35d64f163ba9184d95759f57e398d93158683238bcf93a47bc03b08d485baef1688c2c1ecf65ff80a7b65c83bdd0cc83ce9ab8ff2bbc4aad31a7d5639e96165f13e5ec2b0d67d3465cd421b0495d0705dd8921402d0df71332122c71456e819b597409dab82048e684d97820b7299a5971525731726b751263935db05974c933e2828a2ab0b586ce17545df097abb3205dfd6f7408396a6b368a5ca130538465c97d784853686cedd0fdac5cce05a21a16ec0e65545a7a15ba637821fd415cd0fde1045e455a99587c08f3d0600d1ce919f803a243eab7ee18abb58356f4e6c2f76e3ccf8fb9f0442ee1d0ed3df7972fe2d57e6a0862b5bfbad58fe6f90a6a08c3097182a020e2e45ed1f3cd4b40db5bc0fe5264fa938985945db47a243f7cda9015f61e8684ed6cd4a7009dcf2d50583355406a9700790b2b0e8a6ed4ebe8f168570bfb182da75d732e2b7b95b40c21a603012e4595aed63b0821f79dbbe580c7e7f8b1410c8c2a88cb87e1e2f5d5d79eb730834a98892cb9337b4196123cafe97ace8946b06059833815e6029f964304c923f409b51889debe643db117d7e0d073627ad84ef712fe5e6999f54af81cf193371778730027c419117168acd3c691e0ca6f2b42bf651e8ade93a45485d9f378a4cb70eb7219387f9d9c18e2f4eba14b116e603174e3f50e6f19065a2d09aa86583639e3ef842f7c3e41d8500c35fe38ee6c5bad57dc9ad6ba01dee4b0298fcff38feecaff2432d6503e2c5462d1ac0c9d5e34b7ad5810160474034c4f90c163e68ebfea8731f07c9d682ba832250f8798cafd97733b5edd55e3285fed213f50030824ea5329409b9cfa6c2c070c6cad777bfe1f367c89b1855e32896d3a72f731e380bfb598148e9368a0ccf8b871198b3dbe60842d40b2a6d2a181ab8dd9f1faa76516a0eb0ebd06103319f387dff194dfd91743003241bb99f4706feae2826e5f6030b402b3f757c42f2be352566503cef6a0349d9ed96cbd27b02400c5c750e2f9ca8e4727018aff35136c46f07247ecb0ee432d370743d37ee83e37feee20ccd1103231dcf9c313ccc584736bb99bf34f476be212f218041276838459e39d2f87cdcada9d713791d30e83025d761fb882264ec9ca025821d680e6058679540ac983f705230d84a806dddf70d29a6e729c4b9c2dcb6a9cffaa05a8a5961ff85c47736417390f063ecf80721973261e3bc37dcbd5a172f63de00fc10996fac801518eceed60db19a9c9410c0d9a5b544d701d3480dca6bc4be3fc6dd02e866451d89f38eb5f81fd9a1ba3a3ee8d10c03c5c8b8451a0a6a990150cf5b437733549d1a92f3009bba491ac7b05374426b8310809fbbe3b149cb2167f80370f477c3ca4faaa0691ec79b05630d20ef4e0764a81454729a5592881d59b9f9bff01cb169a3203017f7a27ecc9eba90eb82efcd40a134dd521c33c089e76c3afdf057e410286d976df5d78aad852f07ac016c67ca12576bef27d90d7446b38fb424a8953df2fef9e9ac0c6d91f7622fbf6aedf7af15ef859f6eff430b1b8fb6733a0ea40775faae26c48dc9dfa0c89ee0135f99ee290b10043a23e22453ba0a980f9bad6a6995b3a2945ee110b9b1495843f2c5697c61f463e2788e071269c57a7019b31ef05e368e1dceed0ced29d9b561f1ff82043798f6a09c2a4b3f4d7dd94800ff257007bac758f10bd777697632ec439e20fbc6d89b5a7974472964f3f507dc6ac955e58ebdbc6e4bbf1802348fccb1161584fbf5870b38ba403aa5b3fd04e0d753da47d592bc0585c718b968c54b1955bea62ffea0532364677631106dfd7ec4a763069195830cb15a9c991970f37d9a3c9e5c182300500a44f39834512548d64132f40e6dd53840b25552bd7e8d584c6fe2d10b79dbb8935f2833d03f8bf04cac2429e2b8b7346dd5daccd0be49c07cc602fe1d928b2b83f4e44fb310df47d49cd2d6f5da5859cb3aa92812bfa8d3a20bc592a93b6d94b15ff6636026abc06b8184a80bd860efe8561fe79c0044aa92f4605d85ecb82043f5103f707be2b342597de812f54494d5978fff4ef08a00ca78c6f1dac0cd67a58411fa581049a84f78ecbfd24e8be91f92008d90fa0dde13d736cf2b20b14889401cd539b201303366c0145cdbba0d9fdcc936c970f683eaf96ea7acda96cfbf5c74b83c0b7d78420f52b882cf3076a74d653d2be95dbce127607569052c3e7f2ed168a5ed26d80137f5217197688566387fad3db31519ff325aee39e1377865f097edfa63d62e4ee67401abe0fbd05bae4e867434e3e9fae0d3e65c467401abe0fbd05bae4e867434e3e9fae0d3e65c467401abe0fbd05bae4e83d57f49a2e09e47806674424a613d9010ac4d4cabdc100f59428eed12dd8017de607c81373e13d77f1e31d9b390ac7f4ffdcaa5de600d65bb21a4d2d0dd772f9f0a27b1dfefffc9ace53437a82960d734d33385bd2fa6f905a8bc15064879ae49ec1ee127c04fb0e486bf9c13771129be16c24f5801cad86072f972a515ebade409e425b723929a2ed21223e2c37e031fbc319b79b8de88fb6c25fb5f5ff87c1ca18e5a35018d0bbdef2d928a14de10fd1dfef7e5e0d8fece61e6623264bcfcfd2c9591573b9aa931bdabfc9de3c6a5aa847b7a83de9a81d0b50015bf748bbbda368529882df5d67212b4e230cbc00d357a7a3ecb47c6ba2f30a74ea6031da2b10f68e65e8fdb18829a6282bcc18c39d292a0e3145694da2b004662ab84c5cf58accde0f6cfafce3ef3c67bf1dad7c233a324bf0cb1db4900b6fe4b72449c4e537021adb266f08b1f99b42b7313bbcce2a7c0a440d07aa14fbce95ce84c812161a3a66dba03a5b70790a233d5c7691794298eb24927d51d81d91871d7188ca1f429f64fde5ffd97e99e75f8ae98b769966ffbd89e05fdee1fa59da9d9fb12ec319cb784bc109102d72b6fee325aa48c58079227909055aec4f48e0f435590b427be9f4b0ca14ab114047e789ef900ab7adbe2c7163e9f7048de74e2f11cc95b9f7935c1d681da932702d78d2fab830b4152afe907fefd397330ebde9bc15406e9ba140b16ba3212e663b8154dfb49e73fd7ad98089973240ff37a7ce52d2fba9c0b5cbd4bb634bed5da3d44665300df1cfa0c30cbbb0b566df748bcd724655f8810f4ef0f15ef420f9d6b7c2e17b52c00c3acdd424d099374faa549116440bb2d699217d4c703ed4ef74a407b86a60ea9c9c50da93f68fb6dd9144d35fa40ef546ddda07aa4833215a2e062a9d501baf3831bcde74124c4363964caa29cac6f4ead083b2fa88cc9d0f1866f18fe6f134b059d78335684c8057b4251f6ed23cff0a7499c40dc707b165430e7d41a716f2d799095b36e015d5d9fe825cd5682a19a8c4445a13c1441286315c6760a87f8c1bfa590ce53a41c4fd8fcce51eeafbee8ef6fe32bbe4f0219091e7166d961cd4db631bacd8de6e2ff5c8374e2685bc5731db9b81adfa778239d68286db92c7cfa5bb8b3bde5443d9e64113d79a5a823a843f4fed45398c49c2819774497c0f456c7f4151141be7a5e9b6c8bb9c2d8dea9569373cd5b8af20012ec4babcadd72f7f2f4f29646ea2c728b58b792fd769d5f423bfb5afba62aede71a9d6fa20beed612da3e087124006b00638f1fd4b336b0aa87bc234e580b84cbd8d6d8fba5ff7632a933c38d49d6199650c9b0aa42b022fe10a54388bf561ee9b97e727e1aee0eaecb13481aab3394892a997b4d6b5d8ee3c062507522042bae6c18b931eaa330b823b1023d3364c48d054f279bbe9d933e4e705b21e110e005b68e07e610b7881148d6a76ba42d2ddfceaa681b55a80a6b7f70940b6ec0b25d062dcf142dd7a36c909fed63b684801e142a9af3555b7ce585af98cfafe1c77e4bede7db4d342a15e1739b57fc962164d1b1956010392d1e2a10456ae4e7e48f7ab1599dafce20a9ec01da48499a89e12792613e69dc2727993524a1bef2ab81f012fb3107643d51422c202610a1a1cb023730d56b31a37f8c46b6b6129519b45f7cff5c00616e477d0c377f81d55453773e9757635cb90ce52d80a76c39c9553138d7244387db211f55e868fc79da5d6f6fa80d09f561538b1397257216f71a5183621dbea5e35800b0082199a36d1b831f900ae78b61ccbfb32ffd1e6127a992187b2749a38de088f46886e3dfae6b25fc0397361fb16cb2a23df8f30a2c1b07183c4f2d805149de0b8813e41dd59e60b257c927fe5291b0a4d6c0dcbaf1edbcfa2a5e25fa02e9e36fc4f3a85a0b5a3dd73398854c424eb81f62354ebd15e58c381d499c9e533acd86005413568cfa39440e9327fcb797715e2571c2207f362b16c69cd556240e12a8a37a24e94752764fe693d98337c7567fe9c642197e4a37b231fe00fcc4eba8007ad5a3acf4f72634e5c13e6d9240afe1d725e1d2b9ed79f9fbe3170a77b637e0dc54887db3f2e595a30a1b4d7d661c0a89731a7469fc88bf1def88e7eee9761ade6d199233d4f41f609e6f67b96136a652c448f9dce358cbff35369745e6ce6578bffd92168f2ab91e735d2503cfc7b8e1ef3293e0f09d9d2e4c5588987d868031836d2d63e39e8f16a7248c5ac599c9528686a97cf19069f0da8586a9dd02f6e9374f486e4dddac473b3f3231cb1904c89288f366fd3d101108db469ac5b6f64b653079a7c5cfe9bc4b9e5b9fb4f577488048589313e7b94f0f073f452bc9cc93662cd2d7eeaba488d400bfdb09bc2e499779e2bfb2dc35b77ed272b82af7d8412d93aefaaf40d811a01a5ebde3ee68e3adc55c3fe997b9b2f19d87351005449ef769d2874463be90ca73444d45b61f71299742aa18fbd6be8f586554db3cd14668e0fbe2ed54e40635d59c0b99331bacb0aad34073b7eff0601c87b8daeb87bbbf457bfa432c6f4e5e8f0073196d05e89b760a8d46bc554cb547268e7948e5a00196e6588130f6b940093d5fd9c757afa824541e58057e306049da16956e811ee3cf72033d6a7629088571c77d8c629d29ad47a790a230f6106d08c081c76ea46eb692404a17623ddbf264e051056115015591eefae1795176f62afdffe6581c18886d12b014df7de7dbd1a7f88e1fdfb559a04213ce6869b724a3b313752aa012e91cccc02f4575118a4eec20c37ac2cc6752f874374b1c64bac3d0f6e6069f2d3b2a0ecbec6bf2a6da08cbd48f41a6874ba87ed35bdb2aa7c656b3155c8cf28f1265110a34042c3681d0a5ec5d918912f43e5a5a7e9c1a5a6b1956c7818b3fe59404d60038f498b6fdbf084b4681814a4b57b88c6114b9595699582324a12c4dbbc4ede92fbf28fde15cd54b646d68839f9ddd6aa689bb4e1182c335915175830be7f1bc5a1f5e5452d5360c496e75eed11873c54e740f55d479c5a3241dd74840d31f427945b7a2451d57086e70b7a701cc4382b332eeb1ef3b8a90e5149d310a52128e37c0439602a3511368fd84da029b779e455ae05a3343cc5a7b7fbfc2c5f3e4bb95bf13da8bc432306adfd12d56bd60c749c84f1796f472b5c6d106a119136b3f6742e0c90e7b1e1827c9367195b2bcaa83a1573d11dd4c0097d0de395a901f3892aa830589a8ea827f24cb094c5559afb57f3ea626f7f239c500b10d09a777522ee1ed1f7ccaf6930692abd3a349d50f819df1cc7958f406ae5fb3738ce0390cd763e1f79d4d251b0d851386becbf156508ac3da591b5a9a58c176a518694db4d3c5780f2b98afedb95a87565a37813a19523efb56510838f2c14d9ffb444c07a06211e5cfe7024199e2337a0a6cdc54c42d3a2a666646cb05a0745cd4747225bb60e87e6c6b773eed0591cd3ee82b09309a218f37f2834b6e119e2a55b561c880a251af4b759d7602b420a8662a8257c74adb2937022f1c69bd45ade89c480511389549cdb7d053e14e0afaa5576b5266f939cb607c6374e7fe839ae069cc3c669a8ae589d040c74cffac629f6c55467282e349107ee50678af8b3558e930248b591f9348ad7db9e56f059a4e0639920f80d90004e2860deb94ec34f09d3ba343dadd2f99c5861e654e147624ff9d6d844e444b6656dfb12f14ef52fa429224171b918c8ef2f6011775002b316ee4b9997f330355231ec4f73bed5b502c2743603b108be41f27000f874c79a3d784b819e8351c7fba711f6fbddc54aea1c4f53d063ceb6e21c4966e5cd86f125bc2273aae138f812b9d1f36dcd8b72382404e03c18fa0a400e00a9691a2a66e16a38e8ee063887afbcd4b22623124f3a8aedff1bfbc6527c50dc24f0042963d789e085a6c579107f646958f94e4c74ac76fa56a5969f7b415d157afa3dd653bc1d01f91f142c8157c666caef210f84adfa3dd9bda8cf807741aba9489bae6af0a91efe7c4911df6132b9284f863acc4bb22adfe1a433e6a685b2e6de274c25f97b031b5c15697bca983c24d9a913f6103b907f635b1a98d425c4e81f8cf10acc7814800eb17b408d44ad89e36d9ee144e5f000d62f1bce6dfcfb4ceff98b07cdf4c287f4d0d9cf08a34771c5f9b1d8dfca3804bbf58665370ce801dbf78abac39a19947a45ffbb6dd4ba30df162878d27212970c9281115211996b755f37581177bcec14d4735eeea98f55c3392b4cff31428d6732872717b365ad1b58d94a9fb9745768d10a435755090d5e14e82e08e3c72ce8b29be8b626a1b8b87aabe309f77eb23a76794bfec276ebc8176e6631ad018f1f2faca2712de2bc9ed099ee66ccc622f0f6f51a0919db2ca45aa1a390a78562a3d8d8904d37a45b22afcec0e66db00a95d934d7d2a562e438308892e8b45eafb1e2e6f9648291c3072f3b93d6f8cd2f13479f835057e36b4d9d11ca4273624528c69ae125a8e6630507b4ce2f2fb3d729eb23eeccf86ed201671c6b729424bf2e57b07b9df97cf6215a688ed4bda14424cf3c2048144aca11fb0e59d113e5887e9f271ac949cc6db545d7ba5726d6119ad5409f3db2c0ec4edadc68b6239a576afdeb8cc1a72cd40d971b74e4667e8c6a2b0072f9a90c1581f7f8e2e4b2894a2fa046d9fa83b01c932aa74469133912351be123e01a1f0494e4fad5a390a48c3fd3680e9f5e4f95ea7cd1669ed305020012bb9d18c22bd8a57aba0de504627a981452b1966962486ed70f9544214dd7c7a23c837f44aa3d9ed0f876b75a45bc04af9b803e3bf2e5ef7eb7dbdbacdb079461afcef21db2b2df3350959e04b8e7d8bc24f22797029581ee414cf6d94bb8a1b814fd162d2726bc519e91931b7fc61a2fd5b3226b88aa8f40e6888ee0b7d20736b156a4d44274e33e2df66f02025e35c8b6d109abb67ee256d2f0a5e2ca6304a1f236135a66fedb098c13a04b7b781bced541b00ce90ed63b709fc6639ce69e96181c5d9b0d592fa1d10ed14487b4763684802e9eac833ad59e3c3718afcb0fadb13b5afe657b355032c900e7d8cee78e62e1834d98d59ac63476d7afe1f8d4eeda2ffde00997aa45e0c0f2190be32840203913b6e44c9270a2d54fa00fb980dbc1e5658a53ca289e79b9c09d22b74ec16f5d3337220a867a5a0d01a14f068cb110abf3455b4bf62f464c3c15d1e183e161077ca7c8dcb27f80f209204582ebc22c948ea1a55c92e21fdff9dea713d3688dc42253ba8b06bb24d39e70cfaffda9b1a7a6efebb39f6d09a9fbefbfd01c787e751afb75566deaf26101daffa5061735f7fda381836484cf4853f511172d071ee874594bf113cac49474cbb76d20db4aa5a658a4fac38aaaa142ade4f6a2b0a03e5d6cd0400cb65e3af497761e4caf434c259c509115f4bf26ba7c7096b72af27f5bdec0021fd36a8c4ffaff9a3c74a35bba24c826fe9ad61b60402ef010787c82f8f19903508153e9c142a053601c859a491a3722e362dd9798263a1c4422dfe7186c4cbd1b3a63083ca0075f04bd6317a310f00957701bd1978607f627c6fd5d4beb7b1514956448a602a6e0f576209692753b0c06407613b7cf5df9447ea90665b091ed93741d0ee345662aea3762aa64bc07a64aafdccd96641cf50b2ebb23389dc1c801672ec7c3f6e292eee072750a2d968e40aa20c5bcb93e10d6857b0b17301bb1613d61576e67beabd5aee4258242045ecf4a9afd956b1b97e11f1e6485e0bf5e575f5d5b48884566f7b5236a649e0ecbd5a433c3576d8583e1129f22f6eecd77b2e3c4db57eb59608ddb5e4a507bffdf214a566e8986667a59db08596c4d036d95ed29542c642442e231a7a0a709f557f760e48116d436c6206e396e4df8848e3005faed501f3d0f262d3bcc9802bf03fef9eafc4d6e0352542d473bc87990d21403466978ffd29e800e8479e2886790df18f5d37f60b3c36b747b7312b7c44247ca05968e155c400211662cf3fc7c19dc27f9e15fdd65d19a991c319b4ae4ed7e918c0c6a100c328cadb2627a7944318bf732c4fd410fbd93d8a084d2066148b5a22cd466d0f0815412ac986bc89feebb14c80bb7aa06bc33c82a76e1a76ce00f3bc1b213c14b86ef367f0a92940e0aa61ee18615316faa81205278291bb828dd2933a0681d2fcfee6bad02e612013620cc6b289d7977f387e70ee5834e11de3029dfa50d4df6f0f185e70e69740f2477e5a0ee247ab7164e04e0d59651edd9a68d6e6c9def6e94285dd651d120feaeec55925f93bf0137f77bdd126efc9da4a21415497f87a317a202f7f7f14ba642ba1c0900cffefe7f351087d4d4cd0fe4536620f48a55bb535a7411873cf4d6cf40e24a81a616448127bb69d0d46748c6274420a89ed01013281152e09b8997ec2dacef645edaa6ae8ca360dc7fbf1002e60fc6b944b6d0e24df45ffb975250390ab53a412928a714f40601b53ccf4ba4beeecbbaca0d31f39dd8dbe5fc4d1f078644e3f9d6a7a612868ee1460746b4f69192a18abb1f7403efb1fc9db91d373f2f516335612e91a05bc563f51b8afd11c88b6d22fc668e62bd107abfb1144761b2348cae47c0042803bba41538d1907db12166888414c214a03d9f00679fe527ad525fbc0b7710d18ab696afc4d6ef95bba2af4a57f1f563e5aed0d6b2556cfd5e7157346b69155f7dae9c15cd5a5a89ad5f2b7745bb2aade2d7cfca5d29ba64591efa1bcabf3de860641f7a9727a973f674048a1b8abcb2863883358e096e5a3e602bbde2d2bdb8018c0eaab4720bb6908d7cff3835c98951863d3585d6f88da1447c0a8926a5cd559720a8d4b169755d8722f0d7e5762a21ef3b1d19508a6da712f1b5f38652346f8f730379f1d1406efd209cc55ea1d3e406ecd22beb1214122b0e564d04127df2722aaab0fadb96fc2313a5ed5189fc3eced08c787b5c8d11cc5b193210b615a0872362f17175622347c2e64806c6b20abaedb0df33b11bb71dcac47f28051913ca378612f929709453da5c71095eac0cdfc195566f07078a229babae5c68d56563d5dda4c572485ddba984e48f48a4650f2bb12cfa2d0d64059591981c3a1c7b2652abee88236fdad16d11d62afd1c7a4af1898df4eaba341c81655db7530979df4191f1536a3b9510dfe980a0787365dd1c618b4d89b60a89a4392b1ae1909c0457ee2da23beb94eace459aa024ee5745acecd1485ee23e6c3e6a91a2c9602a979a1b502d3fe369cc2c8dc8a0368a9a1f947de0ccd9bae7b73ce6bc7f34dd943c46d45fa6786ff485c6ea76e90b436ce4e0dcb620b28c8ed6de48fa7421a4b4296c54284b9f9a9c537827211a334ff7503ce126f236405ea0cec6d5f1d333504e656cee795a7a6b7c521834c2badf2af2ec144d7b86c81aa9ea262455d7cbadeab1195618725048cb61b03a9329866eac87a40c557918937326fa353ae4882cb5ad7a2eb81f83d7d992c0301fa97baab9c008b54e8abcdb539e16525d864f0960f133d4cba702f0ff0cd00981105e93ec297d80ed17125fd55f9b7fb16dc99a2515e8d0b47349896f103d238ae7a6e5fd1ec7a3dc43239afc0dd3347c5ca643aad40c5d07e46fa6722cc172a127d2ea60afeb235d7982b9a94509db7899b9a96ce9d66dfa0209b23f892945f598776d116ce2af837851cc595ce1f70bdba864289c44d6d3838baa063c874d5e43b64c77e59cf4b55205713827825b5846fb8cb75e803d5eae7da2f882bed0831180fe0d8380c01dc0df8819d665338ede81a086a0a8f94241682560ce5dc4a0ae044fe037ff188688d182a9b725091828ff9b1fa7993d8dc2551080a1492ccbf434cffe0ca1986012ebd2df789a02d0b2d8ec912171beff3fd73290697f020b2b6e7229d52fbd473939d3170d1012edf1d9ef16e92c6826b4362867c1355d4e94749055673302ac4fc53e8fa368bc5f42e24cf503f6c6734bb0054678f3334fbb4ad60672328601f22689550675f06f512df89aa1d18537e014886fd4f1a5aed69ec39d3010f39475875f8d2c63129928fb272befe097e71fc33738c775fba03fc096cc1c3a8021ddb1e3cb2d5e982b433fb03b99d8786f5b6a0ac3015999250cadfa87c3efdd16b4a55b945faffe7a98af6663c3e50052c4670e514e3ed404e77a333d9c6027d82436b854b113eca247d6e313c1402dbc54820329b881d88b9b32880f68810a6247be716b9ffdee1b9516bb0cf4b6b85f81d80e6898f6e4a61f9ee0db6810a9d8bad70065b699b07bf7600fadb4ddd2dec7721634f8015033cc1dae7c8683a72dd8d331d9debe06a2043efdf6372e272b6bd730bd37c8285a17b11be044affdf5904fd3bb3b8dc358a05bf53bbb3674f28a67c503d5e1c352a3a1a8d210708ecb4e1f3a982687bb92adff297c5092306b2187deb2381a6f5d47f061a91127e12473e3b415da5b5a0a1065cd332bd9904d60ce4e13778b1d096cd1747ee0abd474136e9bc967df0cbdb7c513f1f6c6123111a13eb79071ed03fd960be57b8a403e8eb11a8261cefd89b240663907364d866a1082cf08c7ab5f707f6d82a0fdcad678a7ce7ef174987d50cb80158c2ba2f06d2ddd68c040ce935ef855d33b661269949cc2ea799e47265eb389953d1ebe2e692075a57ecd26f13230d165419f077b3a88cf442494122c9929d1ed4b2aeb42846865977d7b13ef4cc917429f95155b6135e0692afee83000804c6e81d75881e52d9c0c482f165ef7b898373306f4fd4f6608ffc84c148592540065d4d6e3d5edc6a7ca2da8690db0f2921e827713b4ed4ad3e178d0b76db942d1474f366ef04c91b4cf8be26ff565dd66a18abbe31b9582a7c69466dbac961aada20979b3183139e7e43329219eb3575fde2f87d87148dcf188053315188556808f62f286795f0e0174dfb2c214282483111874a90368210fd62e16aad17db3ee0333fc420659e8afec3c0d10a45c212f424a5e47408892b7bf1c58d1831427276a0c9ea3dab34ec1542938c7a2badd253910b2218038ac46a00a23d97004e2a14d91c72af1c9671a2f39e31bb08f6465af25253d968522a5c645a4d121e120b1c057eab4e9dfd0e805d77b3aec96912526bc4677687e516522d353a56a62b768c650f6105b4925de0cfaff9143f17b2e4afb767147b8ba3a45c8469c23af2060bf212dba1a011be12f3eb161ad4180fb85686f55964284ea52a2ff03fb40c81953cf434ac082764f16d2570e3ed71aefcd423f7edc4d76c4615005b6e8f62fa9290cb054624bf58e0206a83b60231e6807e39eb65809f9f0a2e965587f8a61d1cb4043e7ce9458873a02635457daad1ef2cb99cb0c5935492fe90e25cafcd8b60a3116f0d5dae8ee56a02a9b76a9da32c702a60b78ba33809a2b56fad85b90b5966db8b17e7d86c7c3878b8ef450052aaa4c94c144074556a347b0d93c7f59e36b802c4976b04087a75759b55393a92c080c06be5e7ead132b56efa8385ab76a97e818d15275a8fa713a847b152bfb78a9aa149559e051dd417409e8f04c708c1d682b315aef29dfb38fb37ebe48653bf42dd0e55c708b6f415f8e9b43e74b7862fc7f03accd0c499c9e90d60ca24b1a8ded878157ea9d416e0abafd3c31568da53f979ced027e97d4be281958bb2acf534c4e95741b4330e93e86c2f272adb1d46ec9eb4eb2b064cc67cff0aecfab24ac7c9330fcc8abc26156340fd22d31cc8e34d4d68fa5ed306752af2a6c47c4df21e0fd370ae202336f331d9b3da7773699e68ab9bb28fb5d652ea603307625147875eeace403d1a4178b8971e7989a6e375d565eb0b27dfe9125f004e149955966fd4406cc2c50931564120cc8ec20a850d78ce8ffb8bde1d520d17820018e8d788fed8ebe72ac857a489f5fc022564736ceecfb5f9b0a47f2d9fca4c0101ac3bdfeccb3912dd2e3d9f0d4ec4003181029fd92892fc24c0961a8227c19c33ece671533f74e7d805337801b1078604535833f2bd7dc214e9d112a8544c644a786482365d1faee01a0d870357a4aaa92b757c2c2850358d3f34365eea5185de32b4c4fa8f35c7aede0a8e2828b51fd1085e21d8266569cccdd030ac50fe51240a7ab04e0aa4231fa1c0ea6a69dc4de1ac7b654e829117d250074395e0245fc5000f3f6ac2a02610ad9e21cfbde0cbd7aaa0725316cebcd9ee380123bb7e8d3a2bc6606c8fd03133f9af47cbe5b4af5fc1bdf7cfb4f41b9fe1f56fac7882d75dead1d1d60f7d65943f27bcb54fe22514b2654400e45a5009fd43fbcfc9c18be576e485e9fe9878ad6ab0c84147c3f919e2150f56fa10439fe736a48b0129f7a23e56c0eb70434b10e2980998fcf4e921a3f702482af9b3189efb8d740554290df97f12b444ffb7ee3533149197e8b741b82011fa6f73de4a15613de757890003e58d16dab096d4ae19e1d9535ba9bab4a94c6fd42d3a1d840e6c69cccf6d342c10c90ba2bba71566b91f4fcdc1f9c687d3ee922d11f0449ed25027206b215d0d4c8dbc32d255bf93148d3cb6f05da190d22df8cacb3dc1a0473bf33b968bf46f507ba71e76be282f15078159db617d11126b0f002bb268fb617f6fd18a535b5925c1a82b0da5818bf025aa2592ea2af10e29afcde00df0f82eff30566e916469772a27572231571d4574b330434fa1c01dfaa5d737b8719ed9693a5c03196e1f24219982664139bc8898961b80d4e8690a1f9ac52e24a62c9e1b4b096f65c3483dcdb5d9aeac09f1cfb52aea76bdfca0d491dd80e84f37bfb7dfb0464e6cec380b028f50379fd7300df4fa3786a96d564b39659b9b1955bd14eb785716196cf05c6dc93ed5f7712a73a2d14f8fc19a1e28ac475cf9829c3b4bae78e980b71f6d9e2167b1f2fbaa8cb7a507551730298c34caa1850cd9607c45055922ed0354663efd8be50aaa3989d49fbc90b93a31d78466b3d1cc18bfac9a771e9cc9d529df4348f875e86ece6cb21ae772e1d15f62d52316fa7f49ad89817401939582c771a461d888297ed76f78e33eeec23d03e049760023bf747a2010d9fb1a295c4328019093c478662446bafed8895449215e39824a570e11119c02d4bc1cdcc9de08c4951f27392453e0709a52e2e424bfa0b452626f9114830a176652a4ad445d6a776d0629113135050c34a89c35fa0f3d858daa9fbae007ddaa558217f262a633eed0298dae1b054f8f76e162f8fd7f84d98256c9f272052189475e1137253bef54105e5b268492d61fb2abfac306c870df004ef9e40e5b6c8f10716e1be7f0285a399c0c24f3684b44617933afb6615bf7f55ba30c2568d18309c2464b66a372b19053e0577eb502d83c15451bc7e2e5ac4825b7943eabfb5af27b428a35a8ced9414b65e53c10b6d6621949951bce2692323950811262d0632e4ad82391d92eb0da73062efb7a2e092790dc7a3bd2c07174554a279770a1ab819e81401069d60142d2d2ca6ec3623d92d354781e59636bbb0cfd39b5443dc51428b0136faa94530200f62683788f170d16ae765735a1af3373dddeee6e3f42f91528040ac8c7dcd3ffd06147a16d6bf877f01d50066ae04bc11a0251982b49aa31533bed7821f8ac87f0794c0fcb792d4ec086c21e9bd4cf69365f6c5c5acb825d12f3db7c7ef5ef22ff5c448642e8ed6e3faf2a51eacc5c7f788e1750659ac83ae9bc1605b7d3024800286d6d88f66950b0cf6eb9f9de8c63060cf804065fd4b0c76c1c59a7dd16cea365525244148a34688341c42f795ce19fa39ef8488d946caf8209a75b01a86277cd82c0b2b1c8d8bfb821a0622a68b892a16074f0ce0f0d80bb8b0c0cc00673e18bdd807e42767c3cb768e34ba5d283c0b1c53f46299d31af341d3e6b68258dd803e30c5fc24b7fafd0b706fe5c556e48a59dcc7e21711b37fcec6999e1b500a4e9f9b1b7e8bfa6c6cbe2d1a1b36c2525eb672af9f20e1aca8a7021649a4c6e78b4b859123021c570a921a4a9698d21d364ba2eb1b74e298c4458added19a2b1414e1d68d7d8c202d419e5367c25c736e038a9848bac0c94110e6b5cdac3430a5d6b3db1c8d917dba6897c233fcfba7e7bce0059c6239caf5bd34f3b0fa5cab70497d27ee137bfcf44c2799c7507867621b31abd02d4e45529d1e5dcfb3854569c22d4bbe0b678380608c5224b19b55f2a23db995a763886ee2a8abc4444f79401ede8a3dd3fc9fba246de4bd13f01499dbab03e568e3fbfd3d7ab55bb1458a7b9df77a1bccacbf27617d1d3c83531f0c2e9e50438dfc61e5352abecadfb111549c2e46778baf3f38621226ba56a12192cc72aa52a187c1f07c89c4192a5b778e33ac8729632d93350490e30179bf78eb12e8c75e6fac119dfddf827c86f00a4bd1c70fdd3d118929d07b192f10395240400e6d19381fe87a67b59a7143c768669f376fbf7b136e11db8861e904690f009cd8a2bcab93ef3479b0246a5f8b3ca5eebd079d962b29527965c66df3d6e085b69b55f3c25a56ebcbaf7fc97892719be30ef30caf0c4fe7c4dba4a0182c76175329ec66fc0b186e24deb63adae5f3c914c8dc032bab5cff962cc41024f26a7a58bc6202fe0fff9f88c21d576660c53499531744bd522e3ab84f95973abe4e392209f344a660397cc8817ed76bdc79c277374560a5c9c88a87143a3414e66a332d9986b17ad0828e62f6717288ef88e036ef075061e147be73e829ccf4abe3120e4089a6ea46dc15fee2d291e463bb3e035ade4a5057256e6bfc274595da425b3b1946b228f5bbac30fd3019cda9411d5086c967c24331300d7f3beddbb5527433540c2b83d7f834a85d7840362e61641687b06ecc7ffeef6216e7c18c92bf36b347463951265963f00657a8ffdc688306dfca6784699df62d5581dc9cc461027b20d0a4d3e1dc8b8a5bfc5b20351fd2c066a8f4785ace1a6e57a76c1e26bbda1fd9d2a19ab0f313f9027356c942e48b90eb1bdfdadc58b6bfdeaad6bb76bd72ef89c2a0750105a97ae7b358a117a3a397934947519a296b272e271d24a7962fcaf06f35cf8939655c6376a6dce9ed4a7399348b4dc669fdb21a499aeb8550e898322d0729339f831f325944c60945d4efc78764f74837c4ee21a43787cac3922a8b3f0018c2d952dc3c30dbb7499c6cdd1667d5c398798ea55bcd339e20c35ab615791009b15ea92966547c4a5cb1ea2967b097a8af72c2896d8bccb4376f9420fbeb16d854a48b4647a19908f812d5a33ae8499d35c1a1628c06f5130675bfdada9f46dc28491ee9fcf1db17056ce9a1742fda3ab481a038bd4c8242ffc1f7fe05ffe512eb16c0382a997485a8372f5faeed5e2e0ab3501f93d309d1c698105706af0acc9ec8e0a053964fbb62857860f2d7e7c2efd074b60e812baa4662287438a1fe78ff70f65ad3fb4a7cd4bce398e661354946f9379cd0a3d8ae0b88aa3ecd2137d57dd2007474334813bdfb6fe6ab7fb33e029790dff61c8bd6ba338ad0240084fc0b7e5f28c8278f02da342ac7daeab0b7f5e2a17052def621378d635d0647d8a84d6634c68ea7c25435a6067ece4c1c3d84a90e43a5fbd85bcec8a9a4d633d7d9d0ad1bbf2d0f6095051ecc6d28b3a333711ca9121b491986743e693196547abd14dfca34588776f21f198f63f0d1c6c23be0f2bc4ae733dac024c330713cfa39e0855192f00919d0129a95a766485258bfe1e9f276adf26ca9b359ac62d2b328ed60fb34cc6b92450e5d5a0fab559c131f081d6c8cd8315c9a75797e06edeee4c9e0a46e07444401151bf4ecd13e6da91c4553ec2265f2a917b69ffef2f1e641fbfbf018f6a1b8583300359c5e9e90755d3ebff63ce37289cc11738cf26249328887186eba367416141fbb4f11308b849b51e630710328f526d363f6183c20a2f4a67abbe170e343b08961cd9ad8f32be54942a3b0aaaf44bdd4ae5b0b179706f4d3242112436fd7022ba8a50997ccb191aa2a87b09f9ec01e341084a3c50ac81b1a1a583508b5ed344326622a6ec07be86d97b0c75e49788efc6b163cd6c851d9de03e2544401ef05a29416e75649c018b5074758ece25bf659d86110f72692f989763bee194b7f456cbdaf00652e4c089b02c0215b205507ef9c9771a6a5db52cbec5734c60fc4f957496297d663afc4941def1293cb36f29c517cf3be6795d3cf18d15f4676190aca741ca97972c0f22c24a44190bf11ca06bba843aaa9222ea9ee235b696dd28f380f07a0ef945502f9d898c21cc25689b8d6b524acd5e5ab1d4abd05941a3a6ffd217279a1ce48a6581d684924826a3b5d82696fc59b10c37c7d96376e7e37b6dd09db9472c086ea53bcc63681bb7beb931c37f350773a22ce4b6d68c80177ce51f8449aa88e69cef2d5e0bf83a1703ea6b617fcedb70018370a0833029779d0f33ca0221ec69b43a53139ffb865c0e5d6cff2783247446616274ee44989e4cc4be241631efd54aae245feeaec2213cb0f489e6724b8149db159a0918820dec1233149b7f5499b78eb1aeca4bdf1d971f798ba50445add82123267a85a1d6d2923fde7f6cb15e077c42fe2881de0ad6922a78412aeaf04e9e464e4a185e1ada36cabbfe391eee12d4969cca96284500a6c9a9cd7f2e45e6f20439a6a4acf7e97f240b5a686547cb80066e8e5997c5d586069e56a187356430706f0770c0d870a2eb25944351904ad6e2918022199d8243e3c89cdc168ce433d91814ca9c319efbaca316365d6a06dc250d6f9f49103ed158491243a4d0a60d8063c46265a14c061bd70051c97ac6373812b08f7f924797be2b72e1530d1c8e5621d1645489e06cbff39c42abec17181ee3f329124cfa9265887c99e44f06a119be82c9673b56f8a8208fba88de8a0876cc673e04dd825cab732c1f3ab9fd9e8d5a9192c7e28f6b99ecca73af7c9829f2b50b20a4325253f0463e415b7e3ec8c49f7368e308f46869ca416ca3541af0b506b76d64ea8fe0bd329b23838bfb44a66404726d4ac2666da55f2c09c3c8a1680577e80a2ca7fe2fea21c960adae0a4ac02413e4bbef228c3d6e6e69bd673f2979305bc0c554932e224758870671448811def58d9c57679043ae142fd859b824f96de33ffacee2a8f17931455a0b7ff98e50e8fc8e2e124d427460a60a877e441cbc837cff803fc2e5ead135a34af7c6063a16f356b35407ca40e1e4acdf2b0050ea3cb1b7a144c814c72e81b86255b2762e031aa60d5ad39af9aeed75869476735a999e9ad0ddd87cc342f783cee2ab638a54c1fc2d575b4f5fa1811eed27d71426bbb592a5a986c384ea591e6b2f294890081b38890f4e34ffadd19eb69b313f43d8a615860963d8852a21162d10b99fdca8c895eb510608c4b7e7673866e9a5960bc9620471f0708b5c328f2da64b0631322c6d14eec3584bd3162cc3309fd4c1de9964d53b64ab6b7d1e16418e438348466f62845b75c687662fb18ff5cb0d57b0fa7dee88e14c62f629315159a393c0810c7f2867cd25de292e34879818bb1db0538491579f658e887d6598ee6d2d31cf7d78d2707bb052036f1eb6c5a34f56c0b7a263723a5438abe766601fad94a2519e3ebd84c0b4e84df4cab5402edfcf6dc92bde6d123b18da1117622bbc3f4d8edd586709bb26146b740569944591c6b67b14d92712aaca06594faa0f17ee2bd5ba41e75bc062771cdfb85f5d068a9d9cb519c2320d35fe6ff5d392c07d64adbf5cccf499a5d1de7df9df42c8e39efc19d0389b94f4b0c74a87e81adcd4231f295639c518f9b9a08793bbd7634b5c0416fc027cc612e7d96bead6f2700bbde923eb5d4326b2fcfa807512faa44012646872377c16e977fe4c32516a11ec7ac66a77659993a43a871d7a6125c7cc29e4a650872903f0e703afb0f10c04b05a9cf60765eb4a6c0cb6876247c13c9ccd10b10a18d68f16c0584b94568c687cc0cd4ee6c92e7cc661d0e2fcd32f6d6d0f39086023da07ad58baabfd465143549e2f8f0c1a998410182cd21db5c63a77dd34cb9bc2f43c8b63d11f642377af89f2e662d76772ce121b112b8244285feb47d931c845d1ebc5cb6134dfc17e8bf38574c4436364508eb1ca9dcf81e62328ea0c11c24c97f0210e0086fa32f12b8fcab7fd11d44e890bfa8dbae9cbca7f1aec51aae008b2344ebe861ab0ec222388975dd5832be4e6ed03544f1ed43245789777d595dc3015044a09587c57d3425201a0990c0807e13828e350a1b27a22aa452e05eaa1b8d0e4aefb52b8c8a169896666ab22ccc96b967738b18d6557644ab1cf0c5519056f87b8dc7fc009b0e3949b41606fab20fc3b4e67844a7d6b35c782d6c515dafd12967a9dce80a8409c3eecd55036079a4d1795cb414a737cd8be5f4baa7700b7d405e5c488bc133c50326c66478ee288ef1b7d31779684d7861cfbe625dbe690ae06428627cf907209b35abe88e09b556f9dcfb1dbcc5b3439420aade1d0c0ddbb4e60795815a647486464af4a2356690e50406c1aad249f7120e785a631637759fe115f9db290079398d73e40eefd33a0b9d2e169b731516a19a65d35e15f31b4f6761c366ea0f077c2997980beeabab4f9dfc5d0421b79e1777340460990473b9f4084923008ff4932dabfe1838eafb806b6d5b01ce51bd57fa60fb374537e83fa1f597f05c118c67f946454d8d6fab9084e12f93d93900b191f8b34b0c38b34ac9a2b4e417726da23a2f1346fb192b9309a293ef30dd2c278fb85fb1ac5d1251fec9e5eb84fe14a404930d0ea6b473bf3ffb5af1e3ddd32a0230e90fc245c30130b9303d2b96b7c4663473d88073aa8b3dcd5b21a96115042779250274ce4f9f9cc08dddbfda35326130d16bfaa88dfb9aab99cd4f8673ad69ca7cf43eddc9978d06ef16307ef1c2f61334a80c7e9877a33401daac6b89479a0a99d6444de12a9fcb58fde7c702de0682c796a57731a26ecae483b4d890bbc8850bca88aea65bcaa20ef6cb93f8c05f28549022153c488cac41ef27ce575ad1048b543d14b086ffcc2ec798168b662c9e99c917d99128da979e88697f915550d5e142b61a651b1bee501ce9327a7fb0231dc1663fd11554f4521e3f05c2efcdc3d10462e94ec1d688be57f2719e689efad090f4f00a2189c40a6d4bc8296d1b50f1d6815a7e90f1d183fc119e054a8aa82e0f18d8cb30b7efd2f9b2f2d4de2147ae004f9834837066712e4feb4deaf485fb1390b7cb3b2fa703049c391a2b4b4b9165e9d687c211edc94f1899a498c4a9d9a63e86c808bbb99fbc5a66c08ea83945434b464f482a2044d45533b20ae4a3904c82544cb9f226a16ed72c78c7df5d7b1cc8214a840bac78218768fbe0a89520357880b0208d0d9072439960c52bb06d26c7e6b8380e8f28faf38d5ea7794f83858f81c878680096b1f074c3195d9b824122f89fa981b9d826a35db6d01cd22bb29600d51ef231b4c87f43c2d683ac059cc50918a28350310cf65c891310d6f67586540104aacd341c0ed299b52ea12dced2ba63f552b914e9c1878d0d348af31d5d2d38869ee621c327ba93284bf1b1ca2bd62f614f4688576144aa53f3f756de315f563676d80eb36d22b75d233da7cf556fb58c01adeddfa0bbb263be29b4d8a295e4919af0f9567191048cb57920e06011df526bf12a64e8154a4565dee2fe8cf23db4a694972697e9da1c3b5ebfbad712e5bba2e3ca54ccc96ccdc77bd9d57ffaf8d5bfc7eca9579e8ef92f8f7d88282f3ebf30c9c0dca655643589c015369ac5cbcb25a14b19666349dda0e5bf484a777cd48d8901701056d3ae90662914073a26471d0139790d3cc6a86dc59069a92139ad874832bde631b6af2d167060cffe11f4372c27364445527ce3fa04eaecb83007681e56935ca8d9d3f6b8fb9cb206524f187849747ec117e6740937f80f91b6659b0aec951259a28373af2e4c1b76616204d9b845c97496621266071212f7fd4a9b44ccf1cca7938f98e4478289cfc8f66e626aa2b7bdbb54fa94cbdc551938419e28272600a26ef42729623c87c5363294daeff93339e7a3f15cea2e5f11aa4b904de41457812501038e36e3a00a07167ad8106a071e75a8196c65deecb6ccc3257c3b8cbdd65b79af50731b5c145c58416cb91327acd49c96a7814f8d9db8de8c644fe6cff7b3b8afef4e093f6b7dd6eb4c9de5b4ab9035e113812a6131fe857bb7ef388dc0bce9ceb93e39dfee94eb7d3ed743be14e3d77ba668f684e2802fdd3d30254888b833ad1faeff6b1eb290d3a52c8c9716745121e2fd603b7e6c60ab2869e125e0e75ee4ce1e1e24c09592f067bf3a28d881917093e6f56e365e7012960011904d6ce41cec46a8f0591e465e79d79582c6aec393d5305188da746859e3da256ad79b21ca42c08d574329db0630fa84e9cc0aee984dd359d54ddba476037cde1f69d2c88fcb9b7477c8e05d1b6400ac8fde90b30775bf7d8b7ee74de9ab1a9f64e16c429547726de657da2694eddf5504f51e10ea360048a533318d6b4661990aa322d65191064595695c99abc0781e9a71436851ba8f5d6be53ad3fe8533b6fa7aea2a708d6cff936bb3ceaf879e8e938b79e5e9442dd50e3dcad4e7f32c869f1b9ae2c367306304560a2b6602061566f05628fa69b017d79d479ed9abadb3cebb5fa5cd9e3e9ff5b73503a613552710eadad8c936855fa025c77d1aaf4c46825ae398f562189e05ab4416185c2a222ad2e960aeb118fd357a299eaae4c73842bd413d50286df6e924e1fd54ada6cf3a6a9e679172efc567afce7929a3f75d24ae4a32aad50cb0b6b54dad2eab45487a617a6d5e5716258cd2c95a5f679d4e6319b3535cf6b1af13ac3ea04a5694d7aa2ba439c569d7ba45de73cdfb9475ac8c1ab13561973510f4fd7b9bc2ae0ab73ded3badbbd59d5be3a776239c8bdc9029dce874bec0596b802fba8c5d50da3612d6a726e58935eb49ecb4148dcf19489856950f0d42cb573ce7bf83944d3b0a86cb39b2aa6c1f3526e71e53057d027845b08660766312a69080cae1a0d8f679e61b4373d9fe5b4375da3e5b3b565f144d35c9a5375aa6ec73377bc9535dd5cd91ed0dad3ea71bde9405b5a6f7a6bba3b7bbdd9f566ceca43d3dfe0defac0bd652aa4db9818d998d8991918c6bac239b0f015d67ad3d1acc7c9bca6d9d6dedc4288f210651671ce5a9f278ab3d6e789a2e989a6692ea7aaba9caad3ed762c088cd71d6f5d59b6d70372b78a57dc629f6fc53fd374b76a4e308786569308bb4179885d21ecee1304c66d1e9ad8f1670a4f3d78542d90c703c2599f680a946341a4e7ab6bab638f27e69979b76341e45e359d4c732db2c4d5a278050a0d81b4d94d7607a69576bde94b4d5ad33f68734551b45928a4e65254886d85565d9587da4a6b9d85a9934044aab590edb1479ebb851ccd189b67cf349db2a3d84f3f75f11c7ad15c16a372ce49f94d09465513d5eb118805b1f4aae9d4b6c75f50109ad143948976143a9b3061682825222242894e9d3191b9f6b6083ef7b736659cf367d76d107b14ca39e70d50144dd19ac209194f30cf9ce7170499ae9010d0501e1ac2262ad4b6137ca6bb5b20500381198827b0470f6a1e169dbda3ec43434444c3a66311447ea1a2d6c8e8e828ca584442d219eb88888040e3d1431e9a5ec482c01f659a46461b1c3bc843d38f5810f983410aec71e8a3cdc2b4259af2cbcbc4c249b7b710661d3425991939c4d166e1c67dde1456608fc03c743597a2a76b77f78ccd1ed09bf35d4e28020b5ea051903d2e2169338a4d4c34dd748b8c888e82199bee5e4d779b6d47ec00cef628040207d902e0230a2e1285d5741d45d19ac2b642057737bbd875cdb4425b81e501adb147d39d0581dd56686d9376b459a8959494b2921256327dbddd825785162c242529295db8609a4b4ba98524ac942404c4c26190360b93580e942eb047736969099f6793c69031e025f6083414ee10eb635e7e37e7ac3dffe996007f0662628f39da2cdc2b860c4decd1893db64f3807d41e872c88fcbefe897637e9f33776c163e15190890212135305676262728d98988a9898746a2e45999a46782c7c49c825c07f9a4e3ca004e857f3d0ccf2994d40eeb1b1ca04f2359b8023adc20df9279b00a2c742f5b1708f809ee799d1f33c518da6e7899ee7b077b22086804cc081ee85a0ee80de8b1e4b80f3fc0ef1da07e034c200ce87c06be7edb22ef7f608de336fd519c5a69a4b575dcf74fc3956658f2ac61c985e02ec59e717fc693a611f52753e9bf04cad31d6da4d1745ae6606a7e90404638d3106a14108fd888cf1162ffd83e1fc79cc260008bb8ec3f3994d40fb5878f401d07bfaee3766c1ab9a4ed82f3c0f88c29cb83f7fb209307a2c544d27ddaba6d3f3726c02d0df23bc8ad901e85e553111bf6a3a9d2ff893031e900938c83d760ef263a1da53d95e2fedf572bd3597cba1bd1cefcced74cee57239accbe572b95ecf6452df14ee1184f2d0fc17e01139e73b3c6cfacc3cd4a7d01c71f6c13678f8cd93172604c6d19b61569652a6177bf42d2ea01c596d320f3f64aade0afafc42b8e54258d37d90876a0766312a28692884271c5156b8bad65a6bcda2beb225c0ad109887a7b9cb4d104bb3a7bd2ce4f3f97cbd2bedce66d92ca3e5b42015f8d3193f685785db58cc09f7f027ec097dc25618e46e0f592845955e26101858bb3118d81899188516e8c3a2072385e09191fb109b197fe7a488b48b6bcbe79aad0728edc65d5dca2fafa131aa7814f53b27d7e62c3d6865e5e8b9a6cfb89c6367b95caa69b3d4c8e5524abb71d6169756f0c8c88751c5e091511136dbd82c83adcd69e363c4ba4afe5cb31715a5dd3899c4ca7175e4c3e25153539415aec254e6af18d66e8cc4485c85a98e5aa0370df3501f6923ddb640a03b5cb1cf0a724d53da6dba916005228800027d689e1e040aad6ad26f6ca6f672b2e9cd2d84a99379785e81485d0bd1aa76e7248f1f49cd74f2783d374d1ebb735fce640fb04355b4598629a5cd610d732a6732b1b90b7738c1886fd7292093e9e7ebefc7fe4e1d17f7adf003269e1ee484f904f2d668acdde6f24f0fc1032134f0c1c88b7cabc0244cd4be733d0fb591f034b3eebcfa9387e9aa3be7f8d379eece44420cd9d642c8aea96ae14e7acdb22ccbb22ccbb22ccbb22ccbb22ccbb22ccbb22ccbb22ccbb22ccbb26c199028e998a89da7834442afcd74f0774e86484a43fbc0ccbe5c2e97cb255cbbf3d26de7245bdb5a9113f95683c03c648b8880ace72d11a819590741ae6906f3b4407315b2bedb55e8373633831e825cd39380bbf5011e0095ad1090a7a77cb70e87bb35e7d379e0434f1aea7cee0946bccf8335b7aeab4f888489a7bb9ef2c0f4e2070f3ec8439d04d3c9a11c5327b119910b6122eb3cb7cd439648686626d685acab6608a031aa689a424843304848ea6bb7c544d6f5145078662676ab392b8450d33069826bb6c3377acacc4cea8ad3449c1e040e0d0dcfd379bc74c52c8820d681c00c16b01893e9f49d7bed4741e614506bad7db74240de07cd747ecb73206f7bfe33d903f03ae860dd44af739e939ae9f401cd303184f0b57fd06e07695aeddb04db40d881cf8139a9a7804c268d3bacc2ad6aed3ed761b3138c38fa7cc295e540c7c5fd4ee89878fa073d85cd7ec29e10a881420f74f24f3fcf3cd05379295c32b968735696da45cf91a54ecf5779e94556bb2a26b2a8af6e12c835f71ae4ee10ab1e72859f3ff5092e565dfcba9f8bbf87df39507d1502b3d4cef06cebdbc2b3314ca7d377ef593f32a7f2d2814ca99eb31e644e1139eb2beea09398783aeb2ccbb24565cbb242605eea296ca6994e3fbd156ed5e4399070f9a7eb183e3f5d2771070f30f104f29d755cdceb5d01e840e654d16fca8875ed466ece6462fde76a73c87a910b6432b10e74596f590762855b04faac037906f2cc1e807520e19a875ae801ee00e427d05bf70977fe6d9af99c47e4ab603a015d2093493b906b9a44ed446eced4e630e7acbb0a75ed6f6ca69eae33b5ce0aca58858e104d7fbaea66f174ac37e0154de08877b7235ed379b915f2f4b76eb6ee069949473d2adc22d23f5de7bcfc28fa6183475fb04db7d7792e013eae6ccff770174df5c39fabcf47bc2cebad7fc0aeee138ae0f3d547bc3b9eb7cef3d67bee11f69f8f7881dc232c3c520090f7fc0320ef39f69e50842258f841cf7f42118eb0b79a29f5116fcf4538c242137cf0735533a5de7a90500411823ce837e205f211af9bafcf77fba94f68be2dea29eb9aefea9a2fcf1df1eedc112fea6e17917e1676e022bd68b52adc200f732e928ca29eda2033a5befe873c4c3d4f8bfae9a6d999d5ad2214386e03d689c79ce2d6447dad6538535314064b54d91886ad2bc21e567a70527c5a33003b374d0d7e9ba669f2d622391e7e6bd77af57d7a7a9ee7e9a85063605465ecadedd52905b42a7951a1da15438c73a8f4b5445c3b958256618a24a1b57843bd306185ca221c5add3124a2f568c74901b812b9048b56263723a315ca895a74b4b654c0e04aec43446185423301698d2aa30a55589dd482dcf858638d35d6588305e041604a0d79bdbaab9bc513aeee97cec2ea142597b4267da9a8d2ea6e9d17560b46b4d65a2fad403e6a1eae2e981dd35ae4e4c418d6a4a4d65aeb0c1884ae5718e129dce08d5dbd885c54954f3f857b1dc099334e7e36c1f9a759e74fa18833ab23fe09799e290ff866d09bbe375bdef3526c6674cd6e06b42231b935bb515cdaadaac05335a66b769372297ae6741cdadd9ad7ec865d697b11f9cff5793da0e7f9d4df1aa4e6527500bacfaeb6bde9277b0afd08bc4314b56b1c22bf3dce28ea1915669c5da5b376abd93de240ff9987ed9a5d2528be35bb4436ed3e7fbb3d7af4794226385f443ac1839c6b78fcbca13567f3343178a3d49b1c9e67eaf3e803f44d3dffc62f24158af082a8e705add92de268b79a5d282ded56b3eb6669b79adda3ac769fd9257669b79a5d263aed56b30bf5d56ef5c8349db686379de94d2cbf4f73cd9bfbc80353336179a53fe220ebde34d59e879a4e476f2d364da1065eed6ef7081f5cb30ba5d6eef3b31b65a6dd6a769dd2b45bcdaed9e579ae3e0f57795318621d91872e5ef3669bcb82c05f021cf73ce19a5d2729ed56b39b04258987d1a301e4ec4e781ece6b7637faeef34e9df1b9d7c7d9cc4a6b764190faee95d0576253cfae7ea554a8e6e75d58b30bf4d36e35bb1bbb26385f049a5bb4b747fc395cb35bf4a4dd6776f739807d9a239e9743ac26383f04f04473a6dadb235ee561a6e1d205a5240b1884ae57c88044c1348347464540222727f54fe11e017decaa3f94254ddd4c324d8df3f1d9daa407f4d49b4cdab1b87531c7b8cff6c174d22cd0f2d0cc56583b5f0358b0e5a1f9db04337d6757d5b6cdc847851d98ee870df2503bd00c292277da7da618f59dce59b0739f7abaf93a4f8f54a1073b13ecd50981c3f3ad3d85bbf866978e88b15577a7eeb13c20b4d5f972bf20a1094344c022a3a32005a40aee0a2db8c91e93fc435e3fe42fb138abefdc10a698ba0af101a5a0a2e6658a7d7d30c1e858f09d2b224db27003684b44dab5818736d783d0d5eaf9aac47ce4f0a0d58191ad82d12be86093468c6580a83914a29028f85883d0b6a4f9d4315514b6f2a0f8e6a8183c1ac29b400218125650fc54f841939ca226a322203b221f6f464234bd81307c231a028970e88ac8d824f9d4430831649b40129b09494313b6d4d43f0891941682bb05f9ce15810a05fdc87590871a08d6c9f92e4d859e873908ccd1ee24dff9ce933230e8abb30548c21243ebd39debc10d11fc54e801a01b1df07d3e1f5055733a9fa3ec5157f4e97cc610427650dfb92184be6d5ba14fcfb3fd9d70a7aef356e8db24281b646cbe45db2612b47078e70301a9eb8af2805cb3479e88f38180dcf345ac6d7abe7343accfb2ecce55dc41c5c4b4a7037e2a24b4d7dfa9bf7aaf042fc8ecb117627d96e7ae6c014c30248021e1d91e2b5cc1ef3c4db2725a18d2ee356903f599aeaaa3ebef7cafbf3a6fc544e14e1dfd546b2d14a15f5bc0422a3cd3711ee2b54e6bfa6fd14f698ad35c2ec5c00d33f4e9049c22aa6adb3af939d126cfe554b56d814027689aa1985375bb9d4ecda55fced25c2ecda93a9d9a4bb5a4699a53753bdebaf2763a35970ad991a6692e979690a6384d711c8cb3a48891e672692e979a698d934ed2e454dd8ec7dbe9d45c3a254dd39caadbf1d695b7d3a9b9b4469aa63955b7e3ad2b6fa75373e9952b655ac8942672aa6ec7e3ed746a2edd93a638cda9badd4ea7e6527c264dd39caadbf1d695b7d3a9b9940c4e539c53753b1e6fa75373299a3b698ad35c2ec53a9e2c6992a638cda93a9d9a4b7190347d93e672694e5573690e3bc54aa93e7b8a647bb4cf67479154cbdf28169adfe899dfa8197a86a6a16b4ddc7ea36cb9df68db0acef8dcb86a132546dbbbd12a1031ded020b3268e899877a3492024570e2d778e4489f16e34cba8ca8b2873a6b8e082f56e74cb032d6043926895f892e2dda8f2b3bb28a17401848a1a9777a3609f6798443c23ee731f8c7562ac13639de77972719d7df61399a5ccb026794e33bf4facae734cc4151a293ac0d8a851f6eeb32a45e364cc16728e8e2aef3e9321d071b4268176d36e703a6dedb36b329ca990e76f4d95f65b636d5de6a9a88173040f932158efd66692a0d02211e7c58dcbbb75d20340d6cc5021e39aacbd5b2bf7993d2aa0b069c146f96e0dd60093e8c70413f739f70121b3a165ec14d7c1c92462dfd8cfe72266c36e54bf331599df196bccef8ca6bed9339ace5f6470254984bdc96af2ee5cf55c6cc869eba28c11c5cabbb308686b3b966530b0c87877ced282026d3944451d1fefce5b0e4803260f1017795468bd3b2b7f042a8e582569d18602c6bb33d8e33e1b9ffdd4061b7d9c7d04b3036a12b1636933c66b050d275578bc1b2731b88073a27c7246ebeddd42c44f14b7253d62087937d663a7c656122d3d7f72bc1b6781e551f3b2a704197d8ebc1b83bd73bdf9520349d6931eefc64a31bff1589807f3bf3195d56717a17553b77936957d021a087332e3733efbf2d84b131f33246825d5e0c4bd398c5b111d52be9099a97877fbc6214e7e20290b23f6e2cd42fa8461d901870515b3d7a8a7462861c18385932279aca8bc1690418584305d7f926479817f5ad74dab8146bbd9b1c7be0106ebf5d83724dbcd663d7636c926c572eb97df429f73d3c4e7ae7c8e8b90b5cf51c9f2395fd9630ed8a4cf638f52b67bcd20d6ee95cbd7632fdad2ee75ebb1475d59af1e7b949576afc8c78ec147db63c7d0a3dd3cb4c72ebcc1137bec421bede6753d76a19176f3908fbd35d2ee1ddb632f5ad3ee9dd9632f6ad3ee9df2b1177bb47b97f5d895aeb47b57f5188b5a9247db4751f7a4a61ca5a2edd48837e73cf6985377ec11351a21dbad737bec4637daad437becad8b76ebc01e3b062aedd66d3df6968476eb928f5d89acdd2adce3f55333bf839f76e971e5d3339fba0ae453b339699f76f181e4983a0617668f1d438b76abcac7aec444d57aec4a4bdaad261f3b51adcf63272edb9d637becc2b1b3c72ebcd2ee1cd8632fd2c81567b43b0765250725d6eeb44ada634fcd52333fa88eb3573aa24733d2afc77e74d5ee74ebb113b3a4578f9d3886f7fc793ad093cef374f5dcf2c50cc3a39e9332c190f0a9a7ec313d9e462826688f1d4a49bb51b0c70ee407e57aec407dda8d623d76b44a4fb1cb13adc2d143b2cb3ca5b250696f8f1daa4cbbcfe5638f0243f6d8a3ceda7d2acd9c5a8fdd29addda79d769fefe4d66e6df6d8dd1cfaebb1bb38daadb71ebbdba4751a83dd6948bb4fec4e5bedcecac7eecec15e84a6b57aec4567daa425ed3eb12729d1f35a3b50bb27e5a9acbd294ba1aebda855ededeb2d8f6678d44ff6889a53f98d4a1933e47bba6a4e99ef6904d353ec123b919576b3cbc7be59b8c7cec2b17df2544b3683eb85ec92658362e37aec506d5ae09d769fd8816fadeba52d5ad2eef38b94b44926da7d7e528976ab8f01f27bc9372d8cd000673179d434158ef082346796c8b908454480be909c30e72f30d11ca142be2a7e4dcfb9684e7f54c030daa0277de820557ba1265d219322c785451a0506ca24854eba526445063a3008f4c122e94a98170f1349574edd9b615e347e17cd766a3c33ec8a92573f0b81cc26eca6ab7b1d9416ff067aec26909981d9009e99b4b105e126c15be009e0fd0d1f3404a0a80111004f1e9c3a34659001030c46a6a9a1d41207cf9e01ee7021cab36bf001778032c5bcbec2daecabf24b00efbba7bab642c0a0270d9b8a51460f1b34f47e434648c20b189e36486570fe070d1a00c043870c30304e49718892327ac01d36f8565793363bcbd5f51f02e09eeada0a01839e346c2a461935147bbf212324e1050c4f1ba47a01d00000450fc40e4f193861d064cc3085418a89c3306a09cab36fc01d2e6cf0ec5246dc4183871c5a5cdaec40595a01d00000eea9aead1030e849c3a6625491d8fb0d1921092f6078dae0a200f040cc0003e394148728a80d4fc528dca1684c624969b3b7575800f0d0c13dd5b51502063d69d854243ef57e434648c20b189eb2ebeb9001064f46a7a926a90c1c304431410d372c69f0ec1870870b45cffe54c41d88519f1d53593d69b3ffaaac3a6480817baa6b2b040c7ad2b0e9c9a9f71b3242125ec09062607492e21005b541439198f4e4d9578091696df62011301203e3947baa6b2b040c7ad2d0a9a9f71b3242125e109a92e2d01495010ac306260dc3e212d1b30b71870b4f9efdc21077701a6a1179a8279040c4941407f754d7560818f4a4a60cbddf90119230c7212ac3060d45e2139227650fc103c52e6df6210d78804314947baa6b2b040c7a060cbddf9011527689a03668c05064220e9f969c3cbb11ee70a1c9b323e10e4a193e9800f14a9b1d08c204a03668704f756d8580410c4cbddf905176550d45a627a7a62160307b071e6469b31719c0030d45a27baa6b2b04641af67e4346c427a761d35206cffe131a02e20e4cc1cfee6183296df6a30f1b109f9cdc535d5ba1e152efa7736a5ac2d06b858ac6246df66094d1a929837baa6bbb74a1975d0a1930787675873b5c187af65e8b3b2c8510faec494d606d76a46153060c4ceea9ae1776ec9add9d9bb8039367cfb8c3d0d51577b800f4256df60a41671a2eb9a79abe2f79f61477b8a024e4a4cdeeb6424bae8989d92fb81913b32bb9272666a1d0b39fb8839267612e4269b367a1aae49a9868a2295a8dfcf97a165ca1ebba5bc1457229b841f7c835727791bbcd312277c89da05dc8dde6db6b0f727fda7d3a99e3b5f7b4b3eec65baf7dd5ced31a58ec2084152433deca53e7dbeeb611cc44cb09b7c9e6960a3746566d8c750a37eec2cac74d633c338929461bd447ad3e85e7e968c6214c31ecf5e5a12822ddeaf2f0a7a7450fafb556d4d081218c388995e6284c9587b8d894e4c5156064d39f9e0e9b42e8b724608861086c491fe8341d54cd827f7a9a5bf50c117ced28f0755643008bc610422b78114942adf67cba88758bf07acdc3f5b5d0791a1979694d4cdc4329cc9256332908cc435cf490a5b6f1b5632f4609915d688069f33a1b0285069c8a2c2f6eca0841abe395eb52802b55945084845511a3c345cb49091f584aea14c999996e41e03861134be304c6082c3a2948dc11c34126a74e901c972fcaaeb01d53ec64a1657169513b03c4ca15313c725b8c4ab4d83242040d8c4f1bae132e5ca83111454f1dac5c590c3733625e5a902a7ef876e489ab31040d9f248c1c199a5686cdc91732435a14608f1f3b2bc8901c695167454e0b87195e71ca00b91a4b0209230b53478d8f11b43a5459be989c2dc9a2a3849517126ccc117b6202caf20f960f9298a86a41830e95da0677bc689cd07203881bb8b1203194907d9dd9b242c7d4a26cbba186c5151f66ea5c19d1040905c68e2c269c6819d1a46a0912155b5472badaac4c515bc1c72a8d8bb72156865cf9b3b5a5146353252bc04d0c6bcbcd881a31261f1c27aed658e1d155652996dbb2068e103960f60819c164cc59982f6caec66890a1f25aeb2cece1f5c6ac871cac2a291d59632f54a49153c2abcf5ebf3aecb5d6c53ca59a6a3be1cd30213f7e0385d2903c39c295c48894183c58250f56098f558cc7fac6637dc283cde2a182871a1ecbcffa44d39caadbf156b607e43380071e08415595a5f59587bc7ca6ea6eedb5269045638f382d0ff35b1e62b8b13c85dfde5e7fe5298c9699b2a3897d76dd95a7f097569ec25958790a5359e5290f648dcc5306c84cd9bf94595c98ea8a4c2b4b6d65ae2ca5cc62594a97a5789e3da765b6fc96bd54dff96bc87706dbf9ce6344be33d9e77c06f49dd13ee765916f53ec739b91efecf63bf29dfb7cf6252fedd967cf39c4f05512e7ace1d6977667e4db67cf56596a8b483508e62aac9cd36ebc86e6e6816dad0d280a9f76e3b1af3323d998590f6cd96ecc95a58ceae2f26299ec6937a6faec3847115fe124c65a9dacb5db7c6b5a81081178c3af76494cbb430c5f4895bfc109640d829e1d8410b25490670feed86310abd59e3bd61472e4167a1ce9d8a3cf4fbb0a31720b3d8c54f608b492d00ab53d574851518e3db24cda608e05ba42806ea1079037a34d4ad99d2b84c82df42042d9a38e2dd1360d850c0dad5f6d5451c88409ac93d683d11522e4c6d7ca4c396729db0d7ce72c0b3d5abd7cd3c20b74237ed937863f40cfc2fe84f961fba5ab3609187460d0f310b3958193e345989cab38644c6039a184a3e2a14647074ac7c786292b94e461f1c5cd8a341e392a30b13228b0ccf071d312e4762600606af4c829f103cb8f2c6e7c54a890b9519239d9e18604727be1418a04808091518e596d112bc01c1d5d5e36ecf4f19ae3a43767cc18c5429c2b2eecfcf0b224cc065a8444012386c714397d74734e708002743933b64ce993474cd90a33ce11232d94c0d8fab1bc726ad1f065ec2097cba93937ad3e97b32247c6477d0923314c5d8a01047a95b367df0cd3b2ba4286f787a793399904539319d8c2b901972d5a8bc7dc345376a05bce7552277512ec05606e6e6e6e38eb054b33333324b2ebec6acde588ac3387dd50ece6a66be3a6f65bddd2b82b89e5810e861809e7b644332b1a8140cdb6443353e3e13e8f273c77a7db1b9e69aa5abbaf1d83407b2e87e2ac9c737aa6a9a340a0aaa2e6f2cd344d4dd3d4a88f48711a8767e2676bb567f6d9daecf8c46606e7b3b56606fad95a3383fc6cad990106619a692e97cb9d39d46c7b5b84cfeea75d2a6bf19b53c498e4e1faa2dd182c4c88159d36480f863c2dd09bacb69776a3fdc2a2dd1e1664ecb79a21471b1684ecb7faabc9e735f14b2371dbc7492412d9e3c518638c3146c34b074b5d2d30de6c7529b3d02a9c6c3116f26473830b418fa966681ff2392c1a1dafeb893cd7e292166bacb13e7750d43ee56130531d6bcdfcd13498442249a8a58eb3305632758cc4c8104c93cd7413c27d6a9a996340635b1caabbfd6082b929ccb1c714ab7d969ed254398b994cd981cab64b536d01b1da645e53d95ab10f7a2a6b994c39539978cd64ca0e446bcd80c6b6b887409d70035b55b8dbcf685aebb3a74966644903a695a53497ca1ed18caa5a5a60bc51fbada9307ba6ae838ddaefbca6638125cced771653a19071f33b6be5d8236a8524a2222ccdef4c759ecbd4ce89b536bff1da67cfda51d600233e4575175018cf4cc2261846eabc6ae3a42e04d5b37fc8797687537d9b6c40b4d66c9b6343e3a3a703816d0b06b6cb7ac1128934978f8ec8423f9ceedafd35063be3a89eaa69eaa9eb5c751172aecb7ebe92c8d77342144d3361d44c336134a7407866d246978fe320df0483c3652edf046bcb7a9d3433d060a6135e407eb5327769b7aac419bee439d3857cb117f5d40829d85780d45319dcc8b205867cf18817e317f7ac78c99244be5d7aca24036286ccca8cac826212844fd78b3d636533cc86f35263c76ed8f15617567a404f69a566c2ae7ceca1058db1173b08217cd0531aa999b08f3d76a39ec24a33532735524f99afd9a2ca53a88559882e5df0cca4ad9147baecd81d70ba168e201c61849e67e1799e193d8b9ae9ddc09e500b4510a1c89107da1760be1a887507a47034e0e8d0318644be2300093f68a6b4272481e9cf060bb3f0147a7b3a906f172277d97711157a00260c41339dc2118a7c80baf611902f1c01156236d8738a855988939a293d5da7cecb4059d9518f40765478a473d4cd3702d88184473ae191024e47dd01a7a3c2118a7c805dfb08d94f77801ee1fd9095780c2b7b6ebe63471fb08e3a2a14a1c98b88da9315235e56847e07b0ac10a369a6d4311b46c3277498d042b2e349ab35d1d8c484e1b942919a294de1f230f50cb45afc1bc31d29e0f4ec0ed01e50b1ee0839a99952df79f9c882d3c68544be996b2b2b79f4818797750f2feb3b677deabc9e9bbb3453ea0fa735dfb14f3d8369a6d477eeca600e30ef5c818302f9a2ac5b91304e9e2491c897c7ba457667bbaabb00405cdefca07339dfe9783b9d4e98d3d0f29075cdd76473c27cb601acf5d4773efbd4b39b9e1281153715627dcada58bca908a658b1b31ce25582c49b6a305ac47c41165153f6a69ed9f4d4882bb3336331962471e2e5d5c8158d977a707afe23f5338b56e7aa9ba6699aa689d903e49eedb1e918638c716641e43ea7b11efbd639e7ac5910e9e7fc88b2c0a66badf5c982403f07f7d8cff3445910e7e7d823ca023b8aa62c08fdb96da2a5391644fe9cf3d435c71e5116edea3c5779bad57577c20d823f95a9ab9f9e4a10d8abde83eca80bc9cecb790842359dcc73d56c4ee75217820a4da190537814c7df99c59845323197cbfbb498799f3b7bf4a96f6ef039a144e9448bccbbdb575531afaa612bc1caca0e9f207d5e550b9857bd027b548dbe75b3c8b78ec41e5b35789405caa35a5864f1f1a853608fa8bf0dc173a7cb94386752d2304ff4c28a903d60618c6079d329596c7cea41f698fa117bcc2dc11ee8078a077223f60894e5e47beaf7c07ccf7dd8ebf950f1bda05e3eebf57c02bdb59e8f3bdff3f5f2979ee3a49e52df9e63ac2c657e0fed159148a4899eab7aca449b8125eec41f206a60de5e1b384a966b548c69827c77fbbd3278762cb9b30409901e1e2641aeac9589238145cfcd9ef7cc1c8fa2a8b73eaa3cea45ec11056acdf4da5b38afc37a70bdce0a7bed40f6a83d4dd3d45327628fa985cf65d5f89c0fb1c7dc04f6d833c79ee5a1e55917628fecdaafab975fddf594faaeab3765a9d4572f6a230faa5f3dac0e4296d2befa04cc35b65f9d043c9efcbabab971d5af8e93abe3ab15e7c059bf36e972560687ebaa04dbbb1a695164cd09581a20ef6ec15637b709f72b46fe1ac603c6abaa07b14775c40c307ed888093344cfdabbdb47d12e8fc68051e64d0a9a2661d05ef4ca9a47fdc71ed1a2cfc1f99cfbd8634ed5a3c3ca8d071821a7d96b192bd494e420014b9adbab9d4cca6b6fa5923edd01f6a903b1c7b4c71ed72df6782e5db68f7b7a07dbf841ef5c9d50d743e621d60959b83cc42e15d7de31de31c6fd36b2704616cec8c2198d4afa18b9fc366ef96d2cfb6d341a8dcb0c2471d165cc971f5761de6d6c3206cdd5112a5c92bcdbb82487d80e2d232f4860bddb78012f67cca4ade1b2e5c6bb8d137041470b8e14b73950de6d2c22c3890a275a64a0bddb6866cacc14cef27b6a39c536b59c82fbec53c8a9a9a9a9a9a9a92a5255a4b0fc9662c7a4d83129764c4a6a899514155697949494d4528749d411f799039bc581cde2c06671e0c08103599e62bd582f0e1c5e7020fbcd018b8396df1cc64694b0268d913125d09480f66e0e40f0c8b142430d161d5adecd21f9e78819202a98a8197b3707a5dad9128ec98f353defe6c0b688625b44adf91dc526a3dc3e47c17df6286454cef23b2a63f91d95c77e474545452db9fa1dc516d596b4b241c7445b111639de1d55658466c72d88893b3aaabc3b2a096587891f59ac7419797754d61bb82e7660c0c9e2f2eea82d1c65695bb29c68b2e6dd51ca3d6e2eb660787d817b77d41aa835506bbfa1d8a0d8a0d8a0a0a0a0faf4813afbec504b74405df90d65e5375495df50634df894f0e1b5b5e6c9bba17a79a8f09825c58455bd1b6a859e3b39943ad0e859f36ea82c5646520b8796650b2aef86da22010f9c1336555890bc1b4a7925c7878f3d2d5ca8bd1baa6c43d90635bf37986d30db60b601eeb36f18b241ecf7062abf3784fddeb061c3862587222adac0b42cfd1c79f786aa2d6dacd4d49accc91af2ee0d490b98b8b3a5c6c8599e1fefde9055420c956411146a3cdebd616b6dc5d50e1b5e7e2cdfbd61ce1d175556dec0d1f1ee0d2b1093b80289fbac61ddd2b06e6958b73468d0a0812c4fad5feb97060d256898f25b03d86f0d527e6b18ebd204cd94235762c478b7861e5baa9c8179e9ea7ab786e408f22c51c459ab62f6e3dd1ab23a50c34d5a1b347edadadead616bc50db12329809c71f26e0dca3765255879c930637bb7063f453fc5b1dfc515595c91c515592c168b64796abd5aaf8ac527c528bf8b507e17bf7e17c730d861832d39c3099f16ef2e569d58a621221686c657dabb8bc9f6091f367ee4b03823e6ddc5acfca38e161a5866d0e4797771ab4617136e41d04ca4787771c411382e4b5270ad2821cbbb8b604c2298b8cf4434221a118d482412dbda88679f9db8840af1c96fa293dfc426bf89639fc17cc9621624cc1334ef2656ed21e1860a2a1540acde4d4c52f95263e72ccc16ac77132ff0756487d51c2079dcbc9b3800146f66bcbec43da1f36ee29b316fccd87a542961c7bb89459e8a3c59f9fdc4eb7ae2753df1ba9e9e9e9ec8f2144f8c27f6f4b464ec49f9fb89c9efa725bf9fc6dcde28c981c3c81be5bb9faa3858d3838e551bdc9bd7bb9f922576f850210547189f773fbd6c4c7839e1a1054894773f1dc08513a4da9d196adedefdb4858d46f28d9d253262bcfb8967c324f26cc47d06fbedc4cbe1d4f6bc1c4e6f9fdda9cbd06f272aac2e2727a7a5139b1f93e827ee73130fd9c44336f1904d4d6d9a94fc6e6af2faddd4d4d44445d56645cf9f363ed8bcbba9ca03578b1779500069d3f6eea62490b41245b2909133e6dd4d4a3b4a963d5a78f940f2eea63526714ddce70c3bb60c3bb60c3bb60c1996bc6548f23b4309bf3320f99d2143860c567c6cb418c246824bf2dd19d8d8f073450c450d14efce00e58a4e9a145f5e5829f2ee0c59187c2d6133068a98225befceb09580b715253801334386cbbb332885cc6833c3f2058c8a7767002bc350860100bf31986130c3608601eeb36360420203060c183060c0a0c4242a89fbcca46452322999e03e3b13932453d76fa623bf998cfc666262625a5ac1b9d3c4879d3f6aef66328183c5902f5a65cc20dfcd5425cccd1909aa2246e8bc9b8958b6359694422287897733996e7c669c25bdf0f06af16ea6186e5f5fe2caa290e07a3713d84ec770a76398c1efe12e6bb8cb1aeeb286c3ab21d570381c0e97bb1326717722eef3d2ae6a6957b5b4ab5a5aaab154e4f7d2d2d2d2d2d2920232c2e2e0a9837687eddd4b5560b26eb40842840cc5bb9792714c629cb8cf17dc2eb85d70bb00f7d92f30f17181ebf70522bf2f90f0fbc2d867bf6076e142da85b55f2691209532c628bfde7da1ca4c0d1424eeb0513363e7dd17925bb4e2d468ab8387cfbb2f643db92ae3032b2bc9d6bb2f6c6da06dc50e356282fc81f3ee0bba38ca3a7161ec8cdd78f705304a6094a67e2ba129a129a129c17d7625264294a8b0ba9494949496504c2294b8cf49604960496049495e9f9386fc4e4adafa9d949494b4a461c2cbc48e323375de9d54b5470a1b3e38565ccd797752f2f3579d396a5daa78517977d286137ad66c59058181e2dd49402c00b1c0e1b7852d0b5b16b62cc07d760b4cc02c08f96d21c86f0b407e5bb060c1c252049858193a606af448bedb4255da18db962d30c844b1f16e0bc927634adc108223c78a3cefb69005656d0c4d97d80eb2775bd8fa123882d0f852e3c5bb2d2811804589999610e51c23efb600a66b21d4b51046fd16ea92425d52a84b0ae13ebbb04ca8f55b88d525140a85cb11379ea4a9f19ab2a68b89770be1f82023b2162606981cef1626ef98c43b719f5d3817ce8573e13ebbcb04cdfdf1dbc572b38fdfaeebbacbb2b2a49698382a59deed5691019b9104a245898977bb491467fa2ca9111763cfbb5d655b92ac2536a0cc38f16e174ccdd57cc36feff3ea5a6e7b75cddf3ebb3359e354585dee6859ca7c4ffbece6f6a5b3a94a2aa84a2aec0aaab282aaaca02a2b54a850812c4fa966aa59850a4ceef07e57e8f1bb42d6ef0a3c7e5760c01a267046ba945e24bcbb8201a49c81b1870c0d3a6cde5d818b9693b63437616aefae904565060d9a8e1f634ade5d814415ade5913d26d2b4bcbbc20f2b355c34d0fc20a27c7705b50592da026923a949a424929a4442424222cb53aad6463afbec4848a0df483b7e23e9f88d94e337d298903a29e4d4a87273e2dd4855cb352a4e9c6023c7eddd48c93b61ca12fa20a77c7937d288ae3137d494fd21f3d5f56ea4173fc82cd9b1670c9b9b77238da0ec08133e6152ca28df8db4c624ae89fb4c818d021b05360a142850e893eb43e1ecb3534052c0f19bc28ddf146cfca6306707d8d90aaa1443b4de4da12a831a2c303360a0b921f26e0a2d701343e6cb189b3c5dde4d418d989a373b5c288152f66e0a28dabca1b193a74b0e907753d8000b09144468ac0951f36e0a504c2294b8cfc11c58300716cc810583c1e0d95930a8c2e87710eb77b0c6ef208ddfc1b6b2146368725e14117b77b0ea8e8a651cd59430b57707934f040a181c3a30eef87977300b0f17b41650ca66c8787770cbacc2a64a18395fec907877500964b365c9e3c90d3159de1dcccd3089b919719f8f72584739aca31cd6d1d1d111599eca71e5b88e8e943fd8df4779c6efa37cf5fb28cbf87de4228a9d256653e67821f1eea3ad3870662eb8cc4c59f2eea364708c891c36c4800511f3eea3ac0d48d4dec468f225c7eadd475b31d6d67e5475a18d79f791f22a0755123f6124c8de7d14c724c689fb6ce466e466e4666464b4f6d98dc8f2548e2a476564d46514e3b7118cdf46c9df466344ceb0d4d24c904979b75195084e2489f3670e9a182cef364a6270828d4d58094b5cb8bddb284beb0d0aae3c7fa85ebcdbe845580f1e59d4d4497bb791f2023ec698114266c713b2771b9599c4b2b8cf45a9599119dc17a515ed22b6b6cf5e94965654a42c7af1bbc8c5efa216bf8bc66898a5415251c951e2f6eea22a0274894341024e9d296ade5d941ca1420c16166971b06e58bdbb28eb4fda893a5ec4bc64bdbba8c893b82376e6bce500f2ee22351751e2ca6c4499e2f5eea21488494c81c47d066e01b7805b402010f8f5050482a1bf8156bf812c7e0357fc068ea500881c18666d905adcde0dacfabca38433234fc8aec87937d00cdbf1828d96b7256bf6bc1b78c5c55595236b26a4c47837300e181e267aead0a991e6dd40250b2a3d5ec9333ba0bc1be8c724fa89fb4c9422895224518a2422222222cb53e9557a4544a4ac42a4e23751d56fa214bf89d2deeae820fb91d6f56ea2aa2a1245ce3c9901e4c8bb89929fd3b8e08c51e58081e7dd44599fa9d6ecb03376660a8c77136d7d7e83a6051925494ebc9b48f919c98c25666d64baf8bc9bc88d497413f779086d1b6afbb6a1b7cf3e543684e2f7d089df4354bf87c63efb90d9d050dad01a9d2524d27461f3c647cfbb87f6121d2548f8919c23e3dd433f2a2cb4f21c712b8184770f1129e2a2ac4e1a9a9f2aef1e5a81111b7d84e8d9b365f5ee213e6ec6789918f34325ebdd436028940928940945bf27a0601350b00928d88409132690e529140d459b30417936219bf83d2197f83d2193f83de16843c5933c6247aacade3d21051a3f4e58b85993e5cabb27246fa4d811a60a991695774f48337685c5978c2b3d72bc7b029aac2142e82c8b5c9d79f70405a81053640a9bb0af32ef9e30c324ce88fb2c846209a15842289690909010599e42b9b6d0d967174296f9ec4219f95b28eeb7d09fdf4264525ec0b833a6c34f9b770b554d51f9402ba3452dabccbb859247154ed2b4e29ce13af16e21245a676f5cb0b8a0b9f16ea1addd1d3841eac8b9520295770b29bdec8003054a1c1d2cef1602434f04f9f913719f83d0aaa01d04f7d983907e7e07f5f91dc4e777505050d052a9f63b882da8adcbb28a932b3f926d38de1d84c1922b78e2b2dc19e3e4dd4120e8326749458d09d7977707b939f2e6cd969c2b5669de1df40124708e587ded90f2f6ee202c33e47cede0f1860bdabb83cc984433719f7fe7f2f73b97bfdfef4796a7ceb7f3edf753d2f9edf9fdd3f3fb07f7fb7767ed2b081f2f5d5633defd83000940622cd798ddc8f1eedf08ac272cceb8bde1a952f3ee5f1293225f56c07003a27cf70f03a41de59fad2fb418effe69e15ab2a6c6441c1a5ceffe2931894ae23efb943ea54fe9f3f97c64643e9f728f2fcf6f1f9edfbe3bbf7d639fbdaaacd1da4182489e77fb4e40a70d123a7a528cf178b72f4bd89cb73e507c3c897bb72f8b429a3831b6a0d07245e4ddbead26557ece44994135e6dd3e73cada1b1a6edcd4f048f36edfd9c2249e2de23eb767b26dcf64dbb62d599e3ab54eadb65dd1befd6eedfc6eebfc6ec7248085042467705c7e66bcbbad223249d145d985230bd5bbdb640867c4c879f3c20a9533ef6ed98021b388294de0f9f1ee76ab03111c493a5fc2aa687977bbe683471adb9eb8175adedd6a200db4813450dbf7017afbec40318080808080808096406c6526b12cee73cfac67d633ebf57a3d36b6ded967ef69f5e8fceeb9fdeecdf9dd1bfb1431b8c8f4b9ba62f5eede8b124aa873c5cacd32f9ee9e0d2c7e9428911104489b77f7b2726481b186e32d0856d8bb7bc82a1438e2c250f9f3e2dd3de51e374d76a801c391f6ee1e10930824ee33bbc56eb15b2c9bc6ae7d76962c4fe9afcc845d7fb1679f9de562e5fc66e3fc66db7eb3639f7dd850d2d002e3aaebdd6cd5672e2c2bbce8c9c1f6e3dd6cb20538d8c68018f10292e2dd6cd6671663b2a898b4483e79379b876a4814384f867089f16e9645d7971a619adcf0827c37ab5b9844dd22eed7bdb2fdbac27df6b5499215ceeff5cdefd5cdef755d572956c4906c0943333bf1eeb52a4a143145be909044acc4bbd7e4e7ae3d389225ecc191e4dd6bd602667cc5b982a4aa079e77af5bca3c5957e62851d2c4eaddabf28d15b3b12835c40079f7aac724ea89fbec9bd7a74f66c2be796ddf87f7f6d9794e7854583c1e8fb7e4b199318966e23eef96bbe56eb9db89eda8d87eef76bbdd6e99254689064d4e172037debdcb425ad1852d2d8db20bdcbb775b4a4ca292b8d76d1d9b5297953a9d4e474676f6d975481d559bdf3a2c36bf756b7eebc61eecca8a85962b2ee0bc5b579585c8d7da95126469dead4b7e56c1a50d45dc902c2fdead03c18d961f3564e840e2e7dd3a07f020434369620f9a12deadf32165c68a226162dcd0f16e1d58d66112b38eb8cf2adc6757c976bf552aacaecfaababc93f37327ce7fe7fac0e5e0727070b9b4b5cf9e23cb53d92a3361dfb9b3b2b42cf563969aa566709f3d5d4bcfcc8024dfe04923e184c8bb735b9fddd69475b4c84811f2ee5cd6daef5c57eef73b970bf3699f74edd334287150503f60e846e1fe09d90e3f35486cc5887b775aa5b45c3384c4993044c4de9da2658921c18a4c942f26de9dda3112864c8f903327c2bc3bdd42011991396b685a56dade9d2a392831a3081824da9a14ef4ec1d4fc4ec7d2fc4ed53e24deaddba07ceb370df7a79fc8377f9e547f9e55565739fef4334bc89fa7d69fe7d6c9f5a7d79f5f7ffa09d6d6e6cf53eccf73ec24fbf33c43fbd34daf4742724c027b446253f2c1603018247a30e8c6ad0fae411c4107214b69f0a04f208814743318f4a08d3b5780488141624a7087561a9b3a24d4e013448283e406a9cdef28b62d8fe42792ab6e863cd29bab477ae3e79190e04c7924c743d82392f17c0d1aa6b065d96afb2db4fc1d7ca29f44221b374f6c03e6896c823cd1b110f6480cc21e8339c0fccf7fbf9f2735652929ff79511b61fc6fe887f5fbf9047e1d7ebfdfef47bca2f0fbfd7e3f0dfefb59f8fd7ebfdfeff7fbe968f316dc826320ecd182060d1a346870acc51e3550d021e42938fec11e29a8442291e8c3e93bac7d07c73dd8630724242424242424242424c759ec11492a87899772cc833d4a05836a7e5489d5592ea7a40583fac6078316f852a3b3c44a8c1d3f6f30ee838e77b0c7a00ef6f8c3a1e37d3e6de37deef3249f476529f37d6e14f23e9f0fcbe72064a9a0fb7c02bed3e7731244f1215de5d07a9fe32d31ef0bf2f91c8f6529a2fb1c93f9cede9786d462461a1f6ae0b0a8c1c5c99012249655d0d4787d5f57f88c91b9d146c2279547cd4419931c5dbcf87c3e9f9b3e2776792291e840a2e31cec918884e4aa124730180c0683c16030e8f8067b0cea1f8e1bfffb85e1a8f13fc736d8e30f8b3dfaa0b04e3c94e31aec114a7572a0933b7952767272d5c9e1de69acf83fc734d8e3cfe79bf23ec733d8a3ef8a3d3a199bdc04fb26c732d8639315af7727bcebbaeb49ae17dd2b45de756bb80e42964272d727e0fe5cd775d7c49c1324e08ed80013e39a91f18227c518d79531ee94d9ff7eaeb678fee738067bfc019190683c92ab4856b03c926318ec11290ca829eaf4b94ae27dde52799f037de8b3827cdfd7fb1c27d9a3cf189cf141578362ca0f3a7ec11e83ee823dba67c17ff2334b5198a1e59f1cc8e39f8cfc93e316ecf1c9fdeadddde7ee6faebe941183c682cccdeb674dac70a9696952e7dded8c1fef6e9a799f9f3ec756ecd1c7823d3a13993acfe478057b64dac244c6a3eeeea817b5f1cea3a89b2084e084ba4982268f9a6f5549ac271475bca5e3d11daa63a0a86333241475bc4483280c649672a97c28ea190b7542d1a0a3e80f454df8e8a166cb09103938de1047c0f859834384eb883966c259a1c2468c093c6d666f18182dd420b7d0507b37567ee8b1024cab4509384f5053ec4916da924a5814258aa2fefbfd7ebfdfeff7fbfd7ebfdfefe758057bfc0575f2b7f183242ce3a04902c5cb8d77b71fe483e64d588f2c7d9ed479f7f0836dde2469d322636122187cf1c1a0922d4be5972548dcdede60d071157b0c8251a1221646c517e68bf2f97c667adee7f3f9be50bdcfe7f30f675adee71da4789f7b80e57d8e53b047df97d589286464b8ba5e9cda05524a191638deb69ef4795d3785bceb18057b74d747427215c523597924c727d82352fbc4a5ea9f1c53b1c7270d5bc4dec9b109f6e8b4e5eadd7109f6e82a09f68866b3a2d1187ce36e7ae3efa8371a036034ba0a43cc1bbd05a678a37b0cb237faf0c51bbd28a3cc1bdd680cbbba7aa39b35dee818c91e8d4918df7adbe2dbb66d97ad1b5ba7164eeb206429a3b73e015fdb3a09dad6aa75bd757cd5b66d180c15dff65a6ca255dfd6b1599632bf0db6adabadb7ad970e2d566a98f028d31239d2a556030957d5bad9626552cd850ffa08f6180c4b6abdc075731bdf75dddcc3775dd7755dd747608faecfe7f3f97c3e9fcfe7f3f97c3e9f8bc01e7d409a0509da50014911c50c1e2f3f2d3ec080bda11225460594ac9db9e9dacae2c668d42bde68c4aa9325e52a47923e715ea3d15dc01e8d577eaffffbb9b983ffe3d2f43fffb9fae77f3f07baa8f23ff718ff0b7ba116d6e2c8ffbc054516b0c776c9cd37bfe42b608f4b450716dd87c522162f5f041655148bc5b65874b5380114784ca0c1c17903576c83c22b0f15b32865452c2dbe8825ebdbd655c01e5b742ccca39e02f688a2803d164d37f795d2f0782517c11e95ca64f934adfa344d5d4fd334e4a7bd34459aa6c1343563e6d35eaa51a4be2b639a2eb57cbaa63f4fd3629a3a5eaaf874283df11999a9d236dd3999010b295db880a541f9f3a64a4f82f001e2c64b9e3da90a301746c274ac9dbd306a7ca9922cd345459a162547d61b332ac4de6dc22d2551335206450f3457efc6c854c8981a39697cc01832e7dd98edd31e40be14f101c625f66eecf669dbfe0e367d1bb52cf36debaa1a8e6fd5c87cebdefab0f562eb27608f6daa4da0e80944dd51ff80ba3a6529e65137c1162af33ba8562c9e49f24507a279f14577346fbe6806cf17bd04ecb138443595e9e709d80917407ce8e19282c9132d5e574dc448f95d79439219533623cccdef67e27fee74fe77268c89305a5c606f30de9f1938ff7312b0c7dffa46a319ab37ba59c21b7d04ecd148a44bb0f94b1a8ef7b9ea4b73f13e17017bf495f1f2410f017b0caa6e1921ef7a08f6e882803da619cb5fb8e6cf0b7db347a19a14afaabac4abaafa73555513f62aab6a12aaea211455d54950e55527155725b3547b954305e3e7d5a0aa91aacf5515557117128964a16ae00758da18166a6c8479d52c7073b2d4b021117353a5a498f11137e5480e1f6a9f3a3666bcb519a35255d5e8a50459d698376486a84cd610794282102e3578de8d95afa2c124b1280f554c2aa87966c6e4513f5157d58079d4dbaf471dd8c5cfa3ee5ec01ef5e1dad5a35efc62e551379e553dea1fd6d01ef50e743cea1eac593eea1f608f28da8aa7f87c6644dee753c3e57dee01f6e8d3e0f71a80df42c19d14f6bb29ea530f6a983f9f7afbf5a903c5f0f9d41dedeb531f92f874ca182a9f92a1fad4c9a7de01f69802c5e130338282c61b197ca8acb87144c58934ed081d2e5068d9914c9695b5bf6fff7ceb4ee4db13a059a1d24406922f4bde764a181bdf3a07d8635b5473f545df007b2cfed258f99f6b803dfed40cb04715832aaec7c031c01e318803e3b5f6f35a1f19e720739fdf208410d453dcb84c3ebf31c6147ce31c386bab4e98a2df986bcfe3319d6a241279423b5edea981f520331592ef6c95b1f6e41caf9168cfca2cd5baf6fc55c17716cb6625f259667bedd92dc36529f3dd77eea3abe4bcd6567a2b4bf95cbbe6f2adbd5ebba95d83e9d1a1c5e07e6bb4d7ae97594ae8daf59a05dfba4dbbbd760d87e2b5ee93e7c43ab3f6a9756ebdf6b36b8f9c138ff6d32c4b29b9f6f3ec82ef334dfbc9c6270fd2efb3edce6f145995a596ac86bed12b14ebb5a35960a8d6db6f54f9da51b02cc5e4da51310cbe5132d4ecb5a3687e7ebc46d3ecfc46dd5e3b0a9722b394f9197ca754dad36492f4aa8e6e72eda95776f29d7e694fc7ac52b2d7e9f2b5a76c59eae7dad3b627dfe95b0ee9274745477b2e2bb795a5cc27face7175bdf69c126927f7e5f63b67f6da736859aae8da73691a7ce7d6726caf3de74602c8ebdcdb9cdf6ad56b57932ad606df6a8eacd7ae6e916023faad72c9f9ad82bd76752c4b41b976952ccab77aa6a2bd76756902c76b752d8e761d525795a5cce7e05b67957ced3a2c5d8eb6dfbaaed7ae53662929d7aefb9af2ad13d38dbd769d19d5db6bdd199cdf3ab6d7ae73cb5246d7ae7bc3c0b7aecfeb1db2cac584df3babd75bb4efb6765d19f8de79bdde295ffb0e0c8599d73bb137bf7768af7db7cc521d5cfb6ecd83ef5ddbceedb5efe0525c11fabdebe3e6372f89950500df3cadadd7ceebb2f19ae7f59aed374f3b0f4d03dfbcb4d75a8f0e145b42f8608933e5d54cb2a2f01823c184d5bb5b2a624ab47113848e1822ef36d9f0b0a3f6440a999b8d779ba6951b6060b8f8c95286e6dd269c9196da8d3148382a66bc1b1b60085b9a263c944ab377e3ae2b35155d6968e0e053e2dd784b959f382c207ae2eebc1bb3bdae1164481f27684594bc792ba3e5a54e6aacd75e3bb0b419437691f26e3df63a4d91316bc01c5111e6dddaec75559f3229967825f3bcfb44be0ef183aa4b8c136b5b62e833509a6c9992a4488b779f76e2fab859bb82c46dcebb4fb0d75b636eb4889b530289779f6e4954e0d972d6674e5c9c779f70232852c2d24e16b82247de8d6ea526be662873a0d5817b37daa5a48dcd2c4d151a1e6ade8d2e5f6310a38d0e9d332c9466de8db2bd365156c4080b257edabc3bc57a6d9665cbca1f2e593cde9d66bd4ecd5ea768af1370434d091f52ae3c81f3ee5cd56b1b3de2f498c5e9d1f3ee5c7284b2b7125925a81841f1ee1cd86b23ca3657702ce15202f9aaf598c1640dc98d3f64de9d837bed315abc91f9596ba37ab78a7c4d45cc941676dabc797bb7daf5fa4b169d1f79be94bd5b55565892c46a471435b6b477ab6cafe39ac41992a78e8cab33ef56dd5e57b9b2634e96e59e34efd665bdce52a5c41a38246dcedeaddb7a0d825615b03eca12c8b4bd5b87f6fa05132743ae9cb8f0f26eddf2b59b7b977ced3b2c13e4593333a35366cfbb77634f6061aaaa2455acc1f2ee9d590466e821010d173c70babc9b877cad33e1e6678d95951927efe655bdae9396640b7945c69977f394af8dd4a8a3a44a0e153eefe681a528f31af899a534780dfc02ec5103f504008a390f000f813d0240c5e03d68bd07b7007bf4a076e8d0a143188a1fdfc12bc01e3b38007eaf9f0195cfc0d52e9fc109179f8153803d66d056c000033f317015cc63e02d0661542c1e039f007bc420c8d8e6b7d1c9c6123025b4b84832e3dded1bcbc8a8a9c127489994770fdf28268f1c3034780881d2e5ddc5371ad9bcd11dce1b159034c1a2889d2c6e5d5ee39f37ba04d8a371cacf2c05f55353ca9ff208b0c7a9b67d2929074ab92a156682eba51c02ec516a7d0e7e72082b01e639c43d0707813d72689f3ecac947f903d863940a05050555e4a1dc01ec110ae937849148f11bbc01ec7183aa4183da6bd0a0210c19e335f807ec5103b0582c168bc562b1587406b0c72291482412e3823cd117c01e894f4ffef4f4f487ec9f5c01ecf109a8fbadf96dfc5f89226d6be43829f1eb61768686972d4ac83079f7f07f6a304ef4c0fab106e7ddc5fffdd6fef787caff866ed069c3c26dc7932aefef8f94ffb907ecf1e7e434f54e4edec679a725efe409608f4ec0a6a6a6263f48bec911c01e9bc83e431f319fc10fc01e33a84b8fc1c6637003b0470c5b4e097ce06459e531f3eef69998d43c93ab7a4a045a9890807351a4edc4cbd467c6337901d823930f877cbefc70cf0f9d00ec71d82e2d2d2d2df900d8e3d2853d3cfe8277c01e2fa84a4a4a4a7b68bc9283608f4aaee593f43cf924e7803d2661b120e62dc09dbd853c7ede821fd9a305a1502814fa06ec51e80abd1b7cd775d5f5d675a09bc7c6bb2e00f6e8bacfe7f3f97c3e9fcfe72f7bf4b97b78776ff16c79c713e3dd9f3d3ab0ca57b8a3e42bf807f65841cdb569da766c992306093b597ade3dfcd64d3d05a5e6070c1f6b5aa4a1b56d7bc7c8b76deb01608fed9ae5b7d02321b96ac7ed91bc7d2b7b243b341ec935608f48c025f58caa0e5f5555b5ce9c5755d501c01e55a92e177e277d4a86ce904fbd4de9a0f9b44e971b974fdd037b4c87bbacf636c17283c4923353bec0a8e4c811850b1bda5b5619143c546eac968fba57298195294d4e98585375e445dda23cea1dd8236aeef529380557cd3c852973924fc133608f145ab4dfeb07a37e0b7dd0cfa0ab6f1f9443f6c138383ee818b0c760f08fdaeefc911bd9e3d1147bd46c46635c6fe452ecd1482d72605151515191ab45ed988e2f82f3e886479d037b44b5d65a7b147bd4ce1e8b8c402b0ff40dec11a80a3d5146f3444ee44944445ed4533889442255bc44aeeaa90e596eea2c6ba85953f112695952d1d2244b169b77b74fe466094fe463ba54f8ddf4dbc3339530529143c59d15565efbd0c66b2fb250bef60f562a5ebb06f6a8c7720e839ef96da235800d9989342b4cb8d29ca199f32626264f1d36ef36c73420068f0c2b3442dcd478b76996663355781ef50f55708fe2205c32b8d8a0eae1f6a2556e8f7a913da24b227b24f2fdd0d0d0d0d0d0508d203f94e6513f517f628f288d32afdd893d6a6f628f431afc841b577e8267608f136c50bd90900385843c290b09b9d1869917f22024e4131012bab1e4858484841c5f09090909090909e5f900bccf31b0479f0e4551144551398fa2a833b1471400dfba99f5ad0fd9639b9a73f6f08bafb576bff13acc868cd7bea43279d52fb04755556321c30d182e1a7dc4741a148fad297cc27ce401f2a6585e9fba127b4c3d893d0aa57d909b5c1fe416d863d08e329f734f6a2aea9c1baf7cae9723937310f494fae63c8436977312707d2e2897c7e454cfe57cb99ce3ad2c654e29d3f1b91c5acef11826fbe5d03e77a4cc8a0c102625743979737ac020011245d9a5c49bf35c87ad3827bc547cd92acb8d808b131a62d6cc70e1c8958591c94203cf94322cefc65d9f9b42d6450915321849726e8efdcfcf9f0bd9a61da854289b89a37916635231c86600800273170030281c0e8a666194045914e30714001666a65a60561b08c469940331638c21861103000000000046461b0220aaed11c9557d1adeab008fc3230558a7a4264c52638115267ff94379473bd865f49c0f6976ac4eb694c7408077ac2ec38d8356af4b5499c5de89d6e9885e320458ea9010ca51b79f439e442d39881526d8a8a45b03a202b927ed25934db68358e7b6e585775113b7a76d40d5a1ebbd88111c226fcea58435b183911804b450ec404054ef77ac76b53a4ae27f442b933d95f57dec830328128d993ae997b1314926fab47417b3507d7941211642c8cdb21f87bdf9b825cbb8d7030d9551d956f9723c5e10c2969073f383f12ae64200d226271a138c435dc02d9c4cd0f58732071c13f1b3486e776291599d71d545cc021a7e2584d24ca3c60b814dd268a084801abc2fbac9136db0c66676a67038c37421bc72053566811a31a0c1afd21871b1fcdb985ffefdd7204ecd821f9b534fbda8d79d422e46e1a4c88e942ec7cc974878f7f2f98500269d50b023d0f471aadd00935249d27ed3260acef98362f68058fae17160241621c5baa04c6199f3218e33ba2b76ad5e5374a4b1766b36040201d0f2cc989f27b4579b07d7f70e08010ce04a7845bc11180c4a0eb1f131deed03c90fee1198d2f3179ab88163aa0502982330135c7204be17f3fc73e30394bb7562a7da9aa1fde770bc2b45e2e73bd056c0e080b804761b01940240bbffbe21788006ab2a9f74504dffbfe46c4239b2585f5760161c4ae71d9ec637c4bf36694a08ac7ee8e9129abe06c21514538f3b82bb4f3878992ae1e24e5c471db1cc2edf9c993bdce6488cac5b92918fef94ca7986855e8323e2e4c183d6f676a928df1b813d35f6729e9ae5a1fe1a36edde2bd6cbcebf5b0bd95469b83c09d92a5c8634baf15a8ebcbb1d2342c331249e70f8584f20ea459dd84125e83d21265e0e468d0f514e79e9e056d763947b1fa21c75609350a017785c7f5389ccecd3110bb637d8e7bb69576411233177644b859a97419e645d867ebf13d1cc4bfc54d16c81f635aa276a09572946de08af912fb76af9c940f086077caf0096e5e026acdb9c50fd9504c292d811bffe6fdb45ccbc96db4d584cce9c7b17331a792d297438c044636742a7723e7cfeb0591b473c6db8a630ac5ff95ccf364bcadb78528603d46e59d542a077e0dbf483cd69b1e8261502c845107e55e8d5c872a4b551ba8589698b805aba57c1bd5008bd13f78f43fd432f5cafb021859489057593183cd8d9e8bc3c306f0c35662312925cb0ceb44305072b0be7ac8db6b261154268a3338ac2662e2d95446770126e436777347571a710fe1987afd6d89deb436e7d04a186b23b2fd24637436431b491b515d90a816e33eb04d64be007243bc209ff012f1a0bb9830e4360fd1be2e311ba47463335a5730382adb522dc8df38ac4dde8962e6e1ab7859eb203fea233956dac77d8df2a09aa7ab184fff3554f611d69cdaa98012a1c26b13202bb627a11d8152ed204606e13a2d48f2e9d7b3eaa2da05b4b0a5ca0f5a5ee15f46a36c8fd5d4a2e6988511f160d50b31d0881766125f4e550594e2a0e4ad7a0e66b49db982bed80300058caff381c6086b7bce60135508037d567ca87b30154de23b55ec714cccaa4602af577fe3905800bddbb74208888fc0c0569114bc51977bc9b60c6c992457bad9c280a6d4ebc8ba14453d97c66b6629d0ba917cce8f045e5aa65f109502a91f1a4a9cf68d656ca9528c5b4448f7d17793c9d078c21fa21567175ef0f8cdcc8f1acf7cc2547488be12b70ff645d9f5321e4b32865a05169497150b73eba763a0df89c1e5aac82948bb741a360c97bd5a1034a39fc276fdc25c0807edcec56b32f4f81c8ec82c5a3812115de8d3387269abcf81be9cddf3fbd2475a43f3025625244fafd85d577ed18b6d2cb42249bd7965de60efe7ad4c77ec85a50079b6cb1cb7e5644154b28e6964ae5fc1f4c618cb332823bbe6bbccfab6f800fb50f867752b8324b72e819a8d4e675025c864faace2a0b0adc45b0c697df0b3ab6d28ce1faf1dc9805e476d2f9acd5431e4141fc5a5905a58c1649b35803b8984aa9070c697d638acd865a97610275ac57d1c4c5feb602fd085dd2e9cc57d1e32cff3c5c015ca958563c7fc3c53dda808bf0bdbc2ed47865e6d8463abc392c40b62cff8b738dc978f58161b028ce172b06bd24cd40901ac80ec4212fedd031fb1a80f010891a27cb30349ec1641ddf04067a62e06ab3a21d78cc364f1bc2a69c3a9f009968949c30fa6ac06714919fac86014f260bf1fdd28e3e6d09f981f9b3a61b3f12f9c34b905d9434237860a857d35ba985f6fb6bafff05b19899e34192aa3202b4cac692add4c488f14c1cf26cc9c58480f2a4dbf125e2537e8c98b05ee6b8a37881ba4d2d7976e10185211e7596c0ea87df736364fd38b8e89d7945859a91ecef9ead1981b50b359d743db1e51072104071302aab3aa6a6f9530b609dea9541cb1e53fe07bf42a7650e654eda5f11db55e891bb580e31e891e469f3a182633c06954a60aa8cefd85aff8156aee406e4137077f38509c96f608337e2a45d5084c589a839eb881f5b277ecca7ee9986c6085b357a23d07cff492702c8c9d1685cb8fb7d50b7d152199b548da2fd3475dbbce8d2140c73d41cd66816933a75f65664d21f6086f031de4fe5a70632c18fc6fcc5a7f9e09e600b072a6598c1d9ac22707323389a8d6b2143cd4cd00114de82904c18c9cea36bd52daee9a09a3858c16a545199f3e3bfc5392b87cd9ee1aa4587ec81d6dd240985068a0c6b9b5318ccd2a8316d3b08eb2dd0f85cb2b9f9510aa9b0cba8ba4566ff9a9e8950e9ee1d5b223f849979205dcb7c32dc469d8fa8737538574be9a648d1e60e41f7e77b5a02d28f160b97eec5c623d1d009cfdc82a91e8a8f66ef336d9c2fca84887a4b8d790d44b4343e52070f4279f82c48e84fea5ddc1618bf8d4971e189ac45d8cc6aa09a3b6410ed0fd54378ec14182b179fc4070048c9d3a6c022dc3d99bdceec148b83421353f40e909320b250fa00c567728d507700e0510b4daa1f325ce96f44bf77d1f332a721db8f51b358a5e51c7fd623ef3ce1ff89711dcf034902fe948c8eab202091f596c6444d77926e6b302cdddfd223097d9ea83502faf1a863de7c075efead3092db949d104ee633b5fab0021d05152e8161a0a5f40ffd47b66c8d70d2944a4e1867e3128c9d58f0a027750394a251c0d273a27d279bef8db0d9c9408967126a00774c0cb5bf905edc88f2998018108b688a52a722e37542717ec26a4a5f17fa3bba68f2a3e8b6be86bf8b58599f38b54e8e453a99c7b7b062d29f424b27893819c047294b196b3d4842c06cf6617b1498b48eeadefa58049f2d0430155bf22542f9aeeaa3e4ce8995d185c8b46b2a5693963c664ea98127d79aea5bf72e4e7779f1583442ef9bd3b901cac0e6965f8e0e35d02817503af74137581e4df7e157f6cfaff6f86c72712a9ddc8fc0e47d06e9bc85119ca963a37863e0882c32a7c7c5b29b54516f5c8447b490f8c2419ca13e6f329f742f853b802e0b7a2d3d3e6882be60a6fc161fcce9fde0fad4c581296805d69f7ada3e08a2f4fdf3fd855e5718dd08935d25b39e871ef5a7a097e1e6c6d2cbd1a2f9bf0dde18ac71a39c5494a6e86dece599fb5be2386205edf527ca7806811416fa19165aeeed14ff569f7a75613373ad34f9f45aa935d24ffddf39f86d92c608be41df6ee3b695db40b3579d88bd5c741eb4779bf7da2ea60ba450d8cc931a162ca5e9a87aa587254a5fc4b392252130c14407366209c65d0918879e086574abf0777dc04a0bdad365966a0011d87acc4280b3e57b9aef02f8f835f074018e9045882a7192139920764a58e5003a11fac16af287c1f0d6d0e38eba3885034fe1e676c57be1f71e8742c077630c098177cf66185c4226068a96e8b64bef8f07d7f81adf4d115f4deafb710060481e2a397ee0fb2a82649da69a820dd154b9fb182f0dcd4d9b811e53191317328bbfc50c0ea0162cd272743221be3009bfef7e76e588c6f58053d3443b55c375e391a280af63c3694044ae91fcc6fd20b5637361c6b5fc759cc2112d3ca118fdae049c8dfea75bd7103c705618d868ad1d04ad6607d1740b36580b2063d9820ed0651ddfc309714cc16b6c1cdfdae7f72063b767477863ce0a931fcfd236309f708fe7759034135c58fb7c0163f411dec380c506dd9652c181b65a0e42c5665c10cf8b4f3d50051714cccc46d637d514c3038ebfb4e543af61dff41c743b12e1144d1865664a8f89d5807e2c7bef4c64bf3aea8b6143f56e793ae6f11a0e1b472c3c278443f731402d65585d450953490a97878c1c02cc4e3afbea16b5d89ddcf0e63b5209a6086dc20624149317c3020f8f2f475c1d6b4e8d88fa681af6a8940acbf73d91d85b70d189e7abf1a5c7821c3407a2a5d4da5b4f9815a425eceda52d23510d081ee826fad14bd639e1b77a0f45658a8e640f4879a38bcce71c5fc664cb837d9c4c2ebdba479ef90ffbdd33a71de2ccb35387de76fa586f8b8a6379ed86dc116724274e026ac292d83e8e47e9773bd4b7e42619c900f5659c98922d041a7247c90732ba2724715abcbd80695964cab26b681ea91516df9fc823e227917f9b95c403ab15906a25284e1471c7adee8920fbfe06770c14f093733f3f8206d3983cc885724c084d514ff38453403120d18b9ef25a9207f29bc9727451f9bec1a838949eb2058f722f643416833515200b96a2bf7b87f57cec5e2c1ef4e10783a90e5886c0b9a2ab4404621d1e0c5e424ca488d705304a5d11692ff10f39936a71aba390aa7474e1e7f47c67744eb4356f65696a96cfa14a97e45e846309e9f0450c7004d5e6b2bb9b3c59dd3bbf5df08288818c0f9c55dd05063702e71e03c9d60964ae1820558d020830a664a1aa99271ec6d46e70dfa9781399d14aaa1c6d772752f65723e216a2e605e523f9473f3a92f304daa1e2f10e78e91457f167bdeb2be15c386f9dd3930bbc4e923850ce3d49c577a0e7b8f5c0831416607d93ed1c0d3c4a417e010de9e08823bead6943e2b4bb311c983cd737857044665f2dbf38389aff0f713665244b43c82be774bbc450a5da28f82601772378f0ca922d4480112e61d998dece437efcb38d9328610183c688410abea5e4dccc574db467c6741f62fcd8d37d0da2d6482c80c94a029d2822c5232535906511182b566e46a7874c8a55443f46e09dc36e1d59cd3cc35f61278907f430eb3fb2097a31306c637a5805495abc4f4c71245a368b3def961e1c70304a88530635e83bf276ae2024b5b3268b52c826a5710fe16f087ac69b3d44cccc8ab98595943156a7a86c8188ca5e5716c47b8d42c2868aa0103e2e10755b06450ec7e56e79ea9e11dc25c078df8a8b071f92faa292590012329d13794daf84249a2b553a462ea27ed1311122f8cd977d19943e92d9956c64ace13e67891b830042542a50e981f9ba6d3ad6862d514609bf21e3e5445f343c688b40b15e001d1588a7b3a92dc8348d196b5b7d79f561123bd130279dc9ab4fcb3493e597ad7528919e915a59a840eb600cf0818eb7d36ae55f9066f015f027e20799f081573ba2a8532740d11a7c6ad0bddb0dfc22b90db046a7173ba223a01cff8ee832f828e938eeb6629be25684ce8ef0fe82c0535bba2380c3c1f3736d41cc56b14df69cb04cd97737d17eb813d2f32dd5bdd57942aa90436e54a9191c25d8d27bbabcd6d2ec873ffbf67bf16b79d3e3f57d026fc1e0fb2850a14355585cfe67899b3991466bb68c1fc723c10b205f50323dfa86132e5955cbb183b54c582d2117d98551a05c3bf91feedf69411f9bad53c348c51b5fc0c7896b4d76701a0356b910b3958f6867896dec68a5483de32abeaf4630b43c6b05f49caed7bb4b308fb72399905aa478ce1a1338dc1e6e6fb80d12f1386d9904f4c39ad36686006aa25a01617edcb598794ac15dbaea2f12eb809560c1ba4bb382db68ae2bea91cc28283771c6c81ed4f86a42d9c7549466f571de7f2c6faea2b702608ad8308175ac2ed4de24e3893e612c8566cdb4fb99423206dfd303f83212df12df15004d1a3ac04be53fc92c96f592942754092ea2e9576a0c349c1c1481e341b16ad2bc4525ef4029dcf9b444a3e9283ba4ea0ca4196e3b396afd4391ecf221286c56fa6da07f6411c48dcd6ca9b37d9d2c5c59ec6502de29cc5a661806f4cfe0dfb4197b21b7ddada80de407ad6106181c61734136e75de6bc718eadd425685eb22d77234e1f5914ee5acac9d607f0325726818d2289e2c87bc1a368993af2c0b3909349c8cb96d5ba613cfaf9adab44551a4671a0d94ca426f539525e3314e58cc570bf7fbd3ae20c29a10fb1fa1ab3e52a5a2e475c1e3ac558ddca62ca40689f1941ee64a02478a17387ec47e8ea1c249a84f4f727fbc9534a7903e213e25cc489f138c49d6edff297116dc5d5927c9bf3e7f3b1fee180b5062762ee25fac08b3cb2a88e7e0ec36de7674e757f4f33eef5d38a6490ef61c354e86a143566cb41b09ccaebba22304690d50cf0d2b2dc943d750ac86e631209e005943c16907ca4ced6a6ff3c5e481e8a2e97b3177c48160b89989615f325abf4f1387b0de0cbbc0225d76eaa1d70d2b2a8a175592300fb0856101eed9673f7c0cc5d771613970ef203620f4b82577292419673e897ea31cbab1c721825bef367fe80490208c6c0931359f10ce9b6daa3e68ead12946262396bda0414c453e71621438d2c120b92427038f60aa74a53fa2e0bba59efabad83345ac8516cae55c2aeceb4c2aea7afadc86356eb5dda22c1e7970d6097bbe3feba034d934e985eb9a48b2109fab92b314d978e4c68f6d08796479f40821152dcf9bb7c7f5ad0db8c81dfbed7509eb04136c3c62914696a12e311c592572564f856e7629445a3cd773c91f857855d52688a3045ec7e53c2d0c4ecf4a4c4f8ccb9024017860e3e8e15f8934b4a93fa8c4a96bf081ca684d285f254ff4fb3bb337162d26aa5fbd7372fa01a0839a3d052332f15e7412c56651d9e91b897c124af94bb8803319d71e3bbcd711051de0ba36249ce892b2ac30caf7248076e5c67f18cc976942149fa8f7151196229be224b2a8ff32988271855dcb8a892c89b694428980de8a6c95609268ec4c03d6a10bd46943fc940433bdd67886219d1578aa9587e7c1d3710558cf252d8900b923dca7fc215c1ba006c3a98eddc5ba46240b374a1b6cf8a7129cddda826707388fea06e0642652f399325f49f0f4613e4c7e032c28e55e7c339386ad82c2abaaa007c2b19ba7b8516db3011e5340fca5666c7add659d2910af25349c51dbd6d322f1faa3be927b1057df640527af940c4362fd46d6d2452eaea02dce8e89ee925657234565acdbc236e032be56012b422204930f184d1f3c78251bed095b66014b1d40c56efe8816c78a3dc185ce5ddae8490c1093c9c4e6596d7f0fcd03045c430479047c1b849409e7677195f84d1041ccb821f7472db7edcb0509e1b6a1a7e138239c69230add20bd19f2f2b2069dcf8a07ea63bd85265b391b819d9bd55c4eb4aad4d587395802c6f5a5ad6e2a044500aadf6d59908a302aef926d9e0bce28c10f1c52087359d79fbe6cfd4cda070eff0e796650616f5f886a3160243b5bb0655ccf21e241e6aae9234f024f8f0923852672880b096ba468d194fc68853ab6b9157b74b5b4c528612b9cb8365d25fb5008ca963c8c1a09d953777e07d46b870456b6c8e3960933e75882de6485547024dadcfbe6ad0b9ec94f9df90b59e72276ec2a89576a2b822ef65d2a1e08a6e32ebe0a4c6b6082e0cd0014b1de9ac9e7b83874903b41436f33f15e31f592c0cd53e05ca364b35443975d8ef55ed84d04df5469823a81dc2bf64b681ca50df1f543c109ee2ed5d89c43d03067e2b949c802820a3e4f41e9c597f341a7d1c723085c0b144b84e1089000e2d2405c430421bfaaae8338f5ab49a7be6829df9d0405478b484bc7f916b0914342c2d039ed86690e2d55316e921e88f97723a582a0ec809be9bf47627e1af6723da952eb513afa1a27c4c44576aa12e50293a12255a72d54037797d87a4c6c0f008ea349e5034207ba4d9a0d79d243894eb4f30866ee8a39fee985a686e0db3a7327a91eba588bbc45767d59bbda81f8a8738d16ac024142fae4ea6c9612fe0b1ac0de951e19799d42478ac8dcc787abe05854a43320e2b2bb67fefd6553f33c87712322d7d2276efc313da859d134766790d6d832c398ff764d6db617a28d07e1b58e8a4f8b073cf331aa87e2cb01aaee4e4bef5f47791e08f0b118735059a7f453f2fb9679eb6bdf1d7e380a4f4d67bd44f20a368257beacb6a8e420aa2c01f080b133e124680ed7885a0ff0619b140a7a98320e4e4b5b8f62f292441eec41a6e9a41940fe57c518444a14e131162879c9ba27e250adf8c81c61c2a4bb888cc1f6e1e0363e91e035d761bd104b4ac64860663a4654938cfd53fb8513c5270393eca75b08d2b985e9a6bd06b71d9433dc9b5f531d099356026c05ab20a84fb7b6fc4d84d8a45df89f62a3198d70d8ac9d0452b2d91df5ba7b68d18ae429f3dba08f3aa8d00f8563578fe01380b00f08366a601c24cce7aa5dca2b49829a21b65cce9156789e41dd735ef99f4fa1f149eefb32f9e94c9987aac5fe442c708fc0c152e56d8a51f56cc44009aad093a36dcb44b092fb98b68a52bd9fc778d821003cad0c3f55770495b78aa2ca7f605cf5b77c39f1d12f1e36033445c00c081dfabba904a9cceaa3616249cc5876ebe660eab27f1f51864018d8ba41f3411a324c168c739848ad475a4637fb5464fac78f8496bb0a9402bf7ec4c5342312bd9922b2550df3826b7648cb480cbe21ea763fc3d48bdc3ce9963c308e037d8e4660dd95433e94ffb5b017a974aa246f217afe19f241b7f001ee7692d8e1e99b648cb8c7c3ed9a7106094c03db9298217213883bad9928f1eaa7d58e44d6df4e06bd521f1db4324df63c33c7ab8a8ac00add8d3ab1940594189f142391e51d0cf169324e000e3c93ec20dfa637f135dc63967f44268ad5655a37ff9ad9811b4373ed81c4899ff09f8319209caf2be0d10b36c8403e5305bd3d6aca075ea511f3ac2d68c2d91693ae81a12586e9e3b5075ea5f5c9c6b8917459f6703c774fc7620165776d7708505d46e1577cec9a6935963895b7637907fdb5f1b29abd952803e59ae9cd3761d402f759492f425df8d28d0db700016b99f22284ac81b3b3234ed0fd2d626501e7bf552e11f71bd43e0e38964c4c0801cc7616cc4c1a093c49bcda61bf7713a25be6bc17c299b22fb12b8a28c5c85b6b9cc88cf605921252e9c815c85a47ccee784679573b245da23c0f9e982ad417aed7f023d8c05251988f239d44b108598df12022cd8de8efb8dd824731697e0af87fd8fc3d2c9c3252526cc41230d9a70583c630d02fcf239109c795c02728525d4ab6d63339d605877f4990e1d657a6a9ca9fa62bc17d6421f59b1b8f2842f00aa7e99ba608a8b02e7c7710f9d2823b25a7a5d5c7e3eb0defdddaf87ebdb8d2f9fe01239041eb43ab99491020a0fcb60da7ac902c7cb58e43b8ed6075c07c1f2281ccd6bd074c2b733ffb73678d45b779b94adb93d7f7750e28cfbd20abe5e8d71691369367e72f4718b04353698582d1d612a091d3fa53da3f12a24aca13312dbe46e1612cdeff3d51d3ef48549dc425655e22a5a3bbf4b1c843ecaa6277c8e648ec2cf88726a0f98bd293e0c6add597bcd79aee9cf57a9758fe39d8727bb3ba4d807d091a25c0ae47584f3ab48e1c05157d0712f8b424e23d5067910371dd29c683b10e948e9c776f1e1dc0e0518a91001a30a0c80d5895492360786b138bbd2bc0169a9aa884989837cc8e6fc4ccc946851405def2851a4dc11fd7fdcf455086ea84a97ebe0dd467f260ecad51da8b5de3f149a7b5defe8aaa1822553dc25bd85d754c3017b04e2ec06687511a0fccf4242ad872e1d2078545ff97a78ae5440bdf36c0eb481f11cfc843f51d30d664f69727ef530e246e036a224e7277c54d32b2f7b01e61b74f24deaff65437d12fe3c7ce57241c1a6e458f0effb72d7a697363b256831fc2ee0aa11dca8b0b6d6e08d2cce5c44766d8cb1890a7174d82b1e2dcd9ac2d31df0e0d928b6f062ae2e693ed2a6ba8f20210304fb615fa5b12de22951a5e6b94ff2521760b85f31a65d863689720572f26b94fc2f4d78a88567df6eb6e0bec6b76d72ca35660bbe17dfe2502cacf6358b5debea86cc2f4c5aa8d650d3ef919d8ec24557e1b65cede2c4798d08552238dae89bc7cb494f08b7121d7dac0ab159ed6605a433f9d176084f9c364bef6960086b9c647e121485381e9feb4c77636059e4e07e835ee0a25d9610225a4b5c403575207408e4c65cc6ea6eb43dd319c76a80e7d639a3aed75a596cd49b9ea4d3e85e85ecb115876601f5503c48eed6937fd63e2d4b0f1c2a7762911e238cb96d2c5624bed1c78a3ac4d313df2ee46f9ce4bf0954851e4e41f193531b1e67937131b0c0a7daf115dcb5c1cf9de10af1edbe905afd94dc63c31beeaaa00796dee01393f8f0b977f3a8e83fd8e2131a705d5c6d53ca8542605b93221e291ab46dd3fed7c7e500ee4651aad014965b0127176dcf6471e08cea59f0dfc72465a28fdce6f8112f8632c20a7b7ef6f28ded4a0fb458649e90b8852414b0341de418011a289d345425c5b4da2f77ea5bf2cc2395f242edca700b212550ac5051c429876ccd5a8834b1ccbc6b50ca2774b33b063a6df9eb7e48149626c4edaf85b8474012f4903a6ce4a0379004f256fab66decc9637e52dc53512b5831f382751fccb0f4016771753cfe8a14b0609821016369acd263a9ae3f05dc3ac447b65cc1f914dc0d8bb724deab16666b6c6b329c956de5c4ab6bc4d0c646ad24b2c0f4d43d399c59529c88c8673cc77286558ff2e3371c37a2c5251f7a592bf350fa1a3d05a71baa86df1275a22718567fd05683199635719980e44d27932a3cd255cb535cf45ab36d9e09e24d3a22e2fb946097d91f052dc6e717346372ff0fa7cb590ac1a0d8c45bc1de6731c4110b1be8ca7e52b99f38271b99da0074f6607ee9ef9010fd2a60be785f595e38e59f0d88722543c2a410819b5168c96dd9785c11906f518b253c600a112447d436b4a82de12d7e2dd9fee34647955e482d664b7366d76e692c97aff602eaa50bea40c75b5d3e9eb93f7570f0d75112872cca092b46852185c73a8f3f121b56b6d1042bc67ff06ea6bb9c874bbf725ab6de1580863f05201ab48a0055f7616596423e66cb4319d323334fa6b56352090fd1dff001c45939a280a875fe65f45c0d0c4b2b0e099f4b6bc73d1791c161b7de5fa9c8cede97c837b9caeb318d404a0fbc8606e0d29fdb9b7819dac810aeea4317feb87066561d526812a05f59162871818b1af1db96453a22cdb7786e82dc98627fa0dbe41137abf012ee78436fa3d9a478aa00577c71a719380a13262d4e9d177d5efdb8bb952abf55346068a791bfe7793a839c08ff879ade277085d31db1db1b2cf93d72c35447c91318e110fb0d2d030ee339d60dc7f8107100aa40e47ccb8fe33160cc71ef38802e6c1e2c7984b41ded5ba4bb49523acc7ec3dba1a2956e5a3425fc4670d0007f6f25abd680592326089adfe0dc4f8a56a2a294dd519e4a17a68f141125944f0a041610236d81120cf81e47a5e3398c64096230b49ef19fd8d894d7065a68ed1855224cf540f5e3689955686db3d507cebe413554212dabbfd0517d4a6920605708a0b483af84261c7436388f63553c3f261c73ff6d1400f318d3203dda378b01ecd9b3c367eab7dc75da75342305af508a0665de0e1ff420859252bf9dbd6cd8177e6ffdd7864e215e3de7ef847890c1186be03161d8c63cfb02e9da888a6032bfffb14adce3bcc4cdcc632a22522cde4d98704008347c1e6750a829199212aea8b78689ec803e9291528302b708305fb3d790d9d852c8cc5e25a114e9c7e4a48224a6b0506a3ec08233fda0969ac9e64f75ed9495a50ef71e92c0104db383a12bb6fc3bc8b6c5275081c664c96eb83e33a112e9c09c7a972b747790449bf8e9494a910e56e6653422637dd339aee8b01114d8f9083f7f4b63a0552ff5998b0b4d40176a411326421a21c7a807095dd1dca12b1cb2ff44cd45bdc67266eb2782e0d26768eec38cb4d303cad38ff48e388e0ee3cf7a0fbd43efd03bf4827a7f6c9934f0cc92c9cc9769e6cb24f36792f933cddc7f66eeff676c9a919b6c11cc8550f2a21d4895e61df66a3ba1515a9b6e620d44a50dbb44ae20739ff075ecf4434a12806ad338e006176d273c550a66688cd096c21a6cac494b52f0a37a7e47c99ec5b76d7be04ac9a2dd0b2a897376f750305706815a08bbf31c11cb5f8afbcf72898a93e1ed2bbcec2962d5e6fa22258bde9aa4238ddc4562983ec8cbe2ab7a50339d8184d09137ce67076e913f45a31124b10357113095b7c460a5a1575837e348ef9362ab5e5bc83fd09764f2017f33da2f1d17d9e8e58dc669d09b3ebeca276e97502ae6f085bedab9306ea2ecd4cb0627552ff71d8c86bc30d04d618ea47e665cb8c4d0677a0d8c07ae96c9eba995e84ebdcd57f90440b2a4b4c54729b050874b6236c8c290df153b8790e1150f8cb938eb885de75e8a4c3423882e5a87df0a024b35abeeefe0e0aac5e8bacc29f5dcdea8f99c959c6e55a7ff2492a352313e5dc314debd485441c2219c3398cb27d53c78c9db093b0e36a21de32cd2115c17709bed8ce9b14b1ecb8684cf29533bbf901775ba5062a811a81cc054392590bf3bc6ef06f56794f9a46ad035084706e3db436e9a4319b11ff3ce3e3a0de45fb45c62b6169c89a2b711a79c5b3a6c0b8ee02ccdd5484df38ee090712f8390a033b5c622ecfa1f5e89dea9b40b03f4508bd37f8fd9e0486b3bc6c0dc4609cb3f17130d56767612190f9dc5ad740da851012212d08613f2239380dad0d55e458944a3ea4b5e161a245f71d83cd5f223d382535dff81644a11c117da4e6916953fec4ccc8c292294e93b51ba166412075fb6293df585c753c9f4fae18510c1041c0155614e5cca6ea673e364c2b4671fe8b3749be23e6ec339f9b579198b8c9e348b8caf8020686676803a0f73252ba23e14db12473d53976623953ae5c8dd18aa89d1614d8a5d39b9f4ef0c9b5e1896e04a58d25df73f5f25619dd0dff3d69cbb4b83647bde837f5195514b9dd42486028ac8807cd005e9cb1e4ad9f2498317a2acbf14e63563ff4d31521e6a2fa7c0b3836f2fd60624e6162954124523a3e9a97bf856df747079e00595fa88f14679a16462c960a1684c1a25634064347ba7aeb7f2156ebc0b4f4e9c425548c28c6e853ab0363fe23042d6f540637f2f17ac90fbd675efd5c09a926490f909499d45ebf4fbe817f53e63c638d1527cf04142c442e1d5dd5c5e0cb9b77274739b9827fa6520b438693ff2fc6a441f64821bb1ed444ace94a932ebe81e0e63897d2d2f91969280263ea207847af03adf85121c4075de74d60866ae467d9cb194b8307ebb20c1bbaf0b62950f40ce8070f375d62832f16f01c709ef8d29bfc3f8efee9affc1b9feb4a4ef323ac05b2771fddeb61f3d40d264453b64c5e27d4679f0100a8b0a38d0819f27c471a03d819abe7d2f0d86523d644b858b1b61eba899ab6506ce2678a4cae056ef3c7adbdfa72bc39a671dd63ed376468b63ab2653388d19794b6928bc4ce7c55cb3503d67c26b0b06593705d86254eac1a8ce892c8a56363a71ed4137d823230a13e64e13e015753f80d64de27f8717648e7742e9c046f426c1e477778c6d40e691eb70bc88eeb7168e44123f74ca238791eae40dc3ccd88691146d0864e57241847d4f5967936aae19202c752594886d2c501f43ab92a0336cf6e3a1cb2b72c381c650c12fcb65a5ea899bc0d2a7b1c3b41465a57908a4f06071d0677499a55e59f0a66b3ca0e37cf13136a9afc6c1805cba610ff10bf1e50b29c9386b4b11a5bb8e92260cd2b1defec783893e7fa59af4d325c1523dad75b4193461c500afff8238c60d76d52e93a6e34d94341e41b7fbd1c84628dde500c969e682ce428c99c3d4ac674375eee73e780eda124ee6b1f246a0ab6f1456f5ae075ca7de0a27717d3ff46b35a3c8b922bb866d79fbb0424796044b2586800f5d2bec6b3e7ab859eb46881cb6574470798c0a1dc616247644b597f14a1c3fb68a20755e57689360a3ae732742e48789d8cab27fea48c99c0c565b655c3d7e92be7bda3c12fdf1af302bd20cf779de2fe369399e47ef46aa89dd98902d0ce6282c585e7e81557218371abaeb038c3d8c841131acea719a819498155cd740795642c4a33fdeca6d3dcf4220639846eca18a214d2e31a5c6a34f5130529d19b1481481ca323c68e8f8b3eea3b05487f25065da5cdd84d8e873320db517a35eaa3337ec53bbfa3a7802360d653714e3fa721dc97595b7de1dc97feebf2c02e842b776e2ea9581b72076f87add3671e00f2bd6af8c348c2b5be1dd64a4de0b23ebc7c494636cd49148fde0cbc0ec11db419166ec43fd903fb8f3a578ba0941886ad9ad7eabdc4a92d63d1aea547d02d9796c44649f0b5fbb9758483fb4c2f043b12446cfc065c1f43071455c7e6d434aa6578a4f2ca618b096aa2f86f5d3f068336bcd5f8ce8651e28c89dbe147f0b1c1fb0faa003fe873734a027ee86cf873b5375245b9f42ee790279ad0bc7e152d0848fd3669bafdedee9c3f2a5cdb838aa0c357ba787dda554ec8e20342cd4fa19608a4864b2e949c3aab9ab0ad617d71bef6c5554ccfc03b38cb69a2bf7d605d95c46a4558fe6510d44db28a8cca0f5fc6f21f4099b5d38ed84935a74cf009b3c49a35bc91247cfed0c9cc4648f7d29658900fb36ef846fecd46f178bb95a64834e6d84f7a5785cf741263c13a016ebf49afbc90d0dd586643590c795190e2212707c785fa417144dbc9fa510174845d1c5eff259fca49f7eb7ac3bb774ee8357155dc35f067ae31feb51fda0f6363ef2cd922d016addceb1185d4bc138e92dc99a2f25a9f2cc04e990096a15317655c0cb7b4d8a167ccabd598e243f306d66161fd4baed11d47031cd6b4634342c9bca1150953ce702dadd083f115e809f84a6fba02c8ada3683493909a79b4209da91bb12cb441aaf14c366f8e2f6628b81b1b4e44a824311a7b87722323c723be5d874e13ba47a70e5568dabba48c81f4e67e3b4290e9461b809e9c4cb980f484757ddf454efa86a97d96f379967911e6a904115266c28da27fd471afc2941ecbf440f89975ed38eeb81a43f6874d52b63973a19f8dc0709e13468c819bc46c7ae45906c49dc4a8cbfad2a663395a0f71abd4c3a289c239d1f4643c7c28d6b34be4df8df18aa7d63b358c931328a4e338bbaa99434ea05d29db25853a69c5b1160b9c03ffebfa484290312d747c932ed129f6b39e83b9661015c742266ebfa61fab639cc4ddcc80ba8eec34db93c07d99e58388ac81036970324c22e31e20fc2dedbee00a7d7ca00b7ce7105482e01eeea6ec60ff3ce5883f1311871254f3a91304eb5ffb621363b9ac55af773cb59e14ef54ec0ee82927ba1df5c242cd7453012b03a9b60b915e36ec319ec83f65caea46d7001156c6c7f86eeb271653544c43658bdbdcae623c02faf8c788a1051b7ee0c30a3e21ee2cd1465be31d491c68d8a30a6f62196347be4acb356d8ecae73967136c1b258d275a01f954508ad58c5cd741a6b1c896c1334468e7dbcfaef757c3ea314a81c818026a084d1a2b76b9f5e2346f3ff11911788f83c71b98e59db85c3c3b62da6742d72f13fc4f9c1339ec745540f16cea6416a2ab45f37ceb971a607f6e22f87a18c1479f2063d1cd8c63ab7c1e0bf98e68b59356f42c5c4b4ba4bc41722cee69a4c66756f4f2df6c915c6c24c50472385d13515660c3eee88fb162039eec0445741c423ac616b0364fb942374ee7b866fa7edc4ad31b91a25e51e0e8b08dd36f456e807a9dd7ca0ca3f23398f14b4e979eecbec72d73ecbe3fc5157abb1c3ab514ed4b8ecd4b708e62bd4020028976ef425fbabdd8d2bee63b36b319d4437753a952b684e0f129c09acb1238e9ccfcfa2acb575d4be3d78bfda28c25d408a0deef4bd3491ef476c1a6a70b4cdb1ef5f941c3e6301ec95243eee3122c0e5b9007d86d503cdf4e693b2555e9b6e40d1b3cbd3f0291b402a482fcfb0a8a2d421f213b3e5e436bedce40cb1afed6cebde59e30803c84d35a08f1c70b3817d147de168089c0b8bc02184271d990c580f781c0a8f41580462272a13dbc623435f9eec665a7814502c0809bf0ab29f9607af6be7cecb9496506ef3101064e46b0c527f06c4d86583732b0649523b172ab2069f6e696bfc3de24b0ab2627eb67aae9d8f4462653dc943974154f7fc646c836efcefd9413a7d655195930de3604fab02a2eca1bfc45c9a6e48c97b8b8de289525c2326e8c3d0a483e5b15487f2da2e2b99f62fa752f7b6ad3e4bf3bb4e63346a2b4d4e6ac773a15352b803d9196f72332a1ea9cd4a98b4b26ecc56ec998b3a9b1a79f79ed1cb9a4e2ac6f780b41e6cabe870dc0ace0ef71358078a58dafe7fd8e851159de221c0ff02fcd6f65b85c10345c18d30970478d9d55faab1bdd569d1855077d7e94a7f37550ebe3fac23afbcb63177455bb56f57022dc148d2607ab64ee116bd45857f17ca94d08bfa27572e0433aa8704d99813ce07bb681f02ec350d5c254d01ec989d9f095dd7f8821a245421c82448738a7f10aa5d374d1a081c1d13f48686212aae66a767fb83165f278258ac6782813eb18980138ca3f0e2fe3bfd43b997c21bde9369bd53ac8dcad7c18498a9d7c024ad5d760c59d164a3d07a6df33df891b12b24d1d52716ffe3909057a7e734a62e1326268c38d96a4b162d16e9078b4298376f13819471d421b8ea9283ae96923966db1ca226e0353d4f4100ef9eb907a65f8ded0a353de0c157b105e248c26dd818e2196e05192cfb309ea58e7a8098333f93ca9eeb392543cd215f8c12a49619461d83b4e29c9194dc41a8e47622d045b67bb7d5d5d5cbf425cfd2d55c03fe607470321c19ddd21c11b0783bc38316c0f7bc11fd6f7307b671d04cf2b5a3f517079d28c6eff84742439c629f4f42e575cfb7a267fc2f9d16ad903029205aa06ee2fcce0f768a2017cede35e944416351e2e9e14850510cb473a1ba1619015404daccdce24a3404bdd2441ac8f5e1c0b8c1846bdecd682356531b72ea24a6c20430f28301060834d79ce098f1a150e5ae2c28c7f819db1db5c1e555f6c67fa7da3922e45c10b1b1d52ec700be3a4fc6503ec9d2b96814281ca4c4c79dbb88910613f324593d7f365447885a51687e2462ba4dac516d646d188d0936ae12cb8453c176228d239bdf152c223ca54a87231aec3e7311114d7bb0ebd6f501fb61afa1e52fa1d322312112f1b904b1d732bbaf77b8137d95953dbbf4e844e8e1d05b1cd34a297557a48692a855236edfd75eae9ef9bd8af414c1eb1d2e6f79aebaa6ac7144728eeb8f84a4deab89f4e76a21c52e29a972d9d9ea7852891570facd3fc33bf0ff28fdde5f61d50788c2b1e429e95b3efa2cbe1ea98f2ff692d82fb299bc08cfbe1ef2301da15f3d241a156945c676a8a71bf1436c0b090d143717b627186934b995e6ffdf6db86937a79a5a5557eb5ebb455e9930aa2e76b8050814803d349df5734957249448f12109110a88958a5e4dc5677525ec0340ee75e7a210c4d9a277efa725f07f6b70c0a0323354849193f85dfa39f930e3947395ea7fa042a3f97050730181d00631a753d3b26d73a4dc066f0d78ff9a2701ba36cffd7edd3cc50b80f3ec558fbb1dd2811320d384425b12ede53ad42a6b11d3bfc33d1ab589e65a34cf365626df5c5083158b802980305f731266b5292ac8989f06be43910f1a40978e2e0b28996e39be5ac602d55bf0c12f754e346881e680b63e528f31e836ba016af1e23e482b849c3c39993a9b039961bc675483184b5525e3f0f10d3cedf7e3cbc09b2fc26500d9050061597f73ca553711667ec9df5c4abb519c5605e0d896061743e0d6c0b9eceb8cf52fa833e35a9d52363425e30eaad62f5a81e1bebfffb8bc648e144302a60d4553a81124e7e003b8f63d0430a8472c86279d8eea8fe9b80fb00567e153ad6e8a6b623b85218340e8033802e766a87b53d0a52001133d4350eeb91d3041efc1d4dab7f09427605545f68bb48238783da2a7c0ed752cea01f94d558b47dc51010215a158c934b95359ec1da07c18ea002c8fad2903562202a82a78ac6579d9f54007b9fb82d6161753b4a70ce162a1142b0238385ae957f6bc0482f9a72efac0b7268b82e6f2c7aa019a847c3c5e21d3656a5e82853c420f7ec58b14f3f7f254650b30721da0f4c70b58674fad814a98a089ba7372f575ee77cacb618e1795a19bdf537a8ffd6ccc047da690167f841161890ae8a44232d767eccf538d8949e253ac26d8f2dd03712e62be88a117667401975bc29e03e5cab2fb9f42c5eac607723acfc644426ea09ed67a71e505457ada4cc4ec315c2fa880b5bef5a18cceb33d5197204ccd50a819d2ad5a746c1dd1c30cfa2cf66b34864836cf48b303564521a8be50091a0b15a198bb237118ba199e230b6d1056d2a1f2f4aa5b3940b68d18be643cc5cce552a6afef9a9e5c06f1f6fba97d93323b567e6a44058c8738839748d0fbcf338fa85c0d378cddf31b9093e07e5c43a46f830138f8398a93dfbfdcf49fd136726b1271884f5ca13983db6815313e6de49928608ab23967558ee2129914e037b7f42202b8ffa03b72b0abb3ca9755d177da097706c6631143f6e00dd82d7f4e3bb633c7c824269e0b2ded6f4d46f521b828ed3b0a10ac31ad26aba789743e9f2b8174b2299c3992b2225acba2424e3ff5d79a4d9f8590992911425a2c7b6c7df8f050bdab7c233a5a79f212e8c4da866cad637e6c341276750725f4a38fb80b9c3dbca2c0769467c036204c9d326167a3f354e388e29ad847e5fddb338c5d7bc9473873aad5aa1b2a1b6f49ab723600fbf0a8944ea1cda3de29f21acc4c109667fda338deb46a8f885b5fe6de90f02d9f1c5c44414807618fba68ff3da1603a0b025360558aa0566a9d03e0241b0a993f904dcc3aaca145670a03ac42ba5e70e423eae93940156393d5e3f4459101d1303464f9d28d05704fb4d0bcfa4b95ee90cd50186ad0fba0a767e04b4a4da214997200829ff7758c93e28fd9b71518a4a64f98104dc21dbd887b6c04565647dc5a6cad0b6587ce117a1e105edbd1aaeeb7ff091ba02bbd4e11040a5505bbd319235ff5056ed74e2b4543ca1ad7f9b94578cfdc8163b8f8322833971a56118d22c29ae796d354167a9a2263632a607b367de66324730deb3cb0af01316909f0dc7fe9c8c2ce78dd4de75370b392469acd17acfa462f5b887e4dedd24ce787e35c50bd6ca51d303836e5a39d9f470897ea19998b9e6b8a1d320807038f65598f45e329c3e2b719b14c62545d7072be81bec79f232631b5d7944d7699ce7d12fa6f93676e5e609a9c0926d37f638d0b891e3ff884fc0b72fb70e4a5865db8f8c3abbf238cb0e0bff6e5b84e0449c957a484ad3899e419558cf162ea76da74de927e6f4aec994bffabb1c5d43a249c91c19acd7071defaa3b45df9e6e6a4e26084cc8331cfeefe06dd7c8bc4f5f75c443350d7c5a2b5ca0877c5ba74489583888e5a3289d064bf61fe134444a08990f19d954ad072309ed1a0b6172b28cbea90960a75cc48892cf895ae5548e056a19ebb3d0fd53180e941eb4f3cdf087030de653a930b04551acdb9785d431748f7f62bbfc43adf982a55d51f4ae57cffadbf1249a545db35550f73033248ae6763d7151f8c510ba45daf0921f56e35e7367eff6278f0a80b59b5be4f1f1cffdcab5bb39d15e9a34110b884a978305bd80a4889fcbed67303e6f4d4b51a04ae15d7a901252e429d4f4830b39675773bb85d9a29ba0b9d79240c4b2590bf6d1d12b3fc4394f94d1f29eb47fb2bcfde00256f75da6f82d876d51c7713ad6357cf4815037f6bdf78e476893f076eb60a1eec66c833de97c0096a1f456633100555a789f17bb38e7ecf0b3cce2b480004faf23a18283d3a19b8ccf4ffd4011f0b9919038f618f1b1859b78ec6db4a3075fa0d9f84da750aaee3498584cecdc3da5fd6e6df52a7866630a4137f28ecb4c136f3885462acdd0a517fa3f30126a6dbbc28c3fc7f92b375dfe3c5bd0525d285656012aab798d00050236d476f571d5a6a2f74e6dbb37606a936dec68c87ebde78bc015d89bc9cd1e0f496319002c3a76d5f56250cc23b9514fe225747739a0e76cb628d71daf5019f1b1dad99df682e04b0819f3cdeb5217a8ebdb51e302b8a78b6cf1ba8f7a5523fdb276d45db631fa941af7e49bfe31e74b25501dd8045eeb901c84c59d106fdef78616d8774ee0623aa4e69a78702b903d9dbf00dacee17d244dc22c90102f61a8715722bcfcd64e3303956b50b4ddc8f756c0a4511d8cb206a331dabc82d6810e81a7c2d75ccd6f51414050fab644dca41fc50a1d7be7d33f4b4ceefa882b21cb6e6a62268acb2082f7c3cd5c6de7357fce74acf07bff79fd8f9d88e267ca3257ae06493afd7ab8bb5238422dc4d55fb64791f547f17407fb1e190703abcab819f12da3ef1a8924295763fb08432011bba42a983be6518bf266ba7ed2ac55b443c968161301b160c93d1a962bc84ca4ad98b7e3031320f84979586cdef9546808df05a5096f8e3072fa8a7ec53697488bb638c70f823ab7cf7c89742f65941cfcf07cb8d657cae622e744e1bbe16930d0f732e2a7ef26fda0acc668146e0d6bd5c4c7365772be7e850f8b63fe7c8e627d5c43bd1230b471f3337f97200b6fa4ef239a237762276867eb01fd04ffada2ed19acbffd6275892875e3ee87d74d826cc31656b84d83b53f1037135d33eb28849feda35ba86a3c05ec1899ae20b2e5cc6a6e9636a11f22bcd2a0135482130d9fa2e648b6a93e4e7b0d0eea204db28c432cdd11d0370eec50ad6799ed83241719aa8b2adb4e29d861dcf041b814a92fdb91885bc316c679a5f4271cf1dab3456085e95e8add95d3224cb689744b1cfd8c6ae9a3784d400c199ffc125a3863ea659e705aea822ccf914a6d305daa9d613077b9f17128c1f277771c86e5d41c526e0bf07d8312906ae0d3c8245537dc61f1c9c5972d9e66d5ef964537b88580fe445ef641b497371b6c589f5ce2b33c3c1b7bea9f8a136b17f231763c4cc5b433a00ac7f01e40dd14d78c5838c293941d2fcb98b69b6691bc46d9c628ff7047626bf472019a63ed4611ddfc4d94c7a2045cb43688375f548fcb9c86dc44e5a4edf7f058bb7b5c31120ee99d79e58ffe8fcc2e413d035fc9508feb3811f9b33d7c24d07022131fcdd0f3b90af9eea506f2388eec402e02ea5e69318bd8cfe28cd6a7d514e3c93c187302086375b203a430df22b6f139e66bd9620ee056881fdddbf7a01ebee2f9cdeb8c84223d463d46209ad264a44daf757d2eb3496d0ce8a1adaba4aed5ce0d8ad282daec30c28ded196f0c6be9e787f33bd1899d165f6809c71e3f19673b33461bd018524014f79de637ec6f1cd0a1798fe3e25b4bbdc3a08cebd12ebe31ff43ab9f01d64141a6bfc30159470f37a576184ed5e9b65612a799d0a5cc63ff8bf48d035c78226b70ea3a85b2769cd72ff96106e5da42f73abc159c0d6eff79659e7dde1267f6a4555fa22f3b3c562a0a538951d26cfac031a487dc8804f90e370561638b8fce47309d067bec80236ca2aae4b1a02380e3757a31b49057488e4528d6e34788f8caf7116d45ade38bac93039bd484ab10cc6d680cd111138543960feec38e2876e3e20efb3e7d63f4f44bdd269241780e608df3a06b392c81416c45e8f16c9b7c389920fbe9044b5e505172a45884a203f7d812064d191bb20bd78d98ff7615b99817a79457f7fb6ef5f2621b72cfe546aecc8fd2a0b8802e4d110e2a5852d60ef15a64f6443e1882ad3c721d93be1c8f6b400bd47dcc57f27350205aa9f4e689f2b1e33c66ed481f472e033c48860f52a15b145ffcf0027cda9848472a8543c15580c6f912dcdaf977e27a2c2bdc013fd25a7c3eeef874b0e0df4706c0b0cc3be4927dfb7ed3dc25e795eeb0d87bcb7dd620c264ed45c09b8b569d26b38c2d3bbaca1d7506a161fadda2dac7ef8c4d3ae1a2ca1bdeecc1f105b019f3a8b2c380408ce6f4a1f6eab5b290a17375b40bff549713cb6333bb873226759c16c67b98f66e4883b8586f3101e22eeb21401fe13c2cc657a553051ff7c741bb4eb73cd0f5dafcb732d062f0f3f6973a98fa895ddf983f3a726cb1763ed2975d3b58bc83bac937f96032c73f4904b16a395989a036c8ccb44570beac0863828ee35dbb7b83c433d111ac8da7e3eea41d960fc5fd826247bad5fbf241313e643891f4bc9883e3ec309964ccfd12c221bd4dd530ec333e401087392a2eb04ba93a675e25b5ba82bb3dec875b6e3439d146c51f4df859c47092b905cf05cfa474fa598fb163d66e360954adf3147ca1340d3ba412f34ae9e8a0c495fcd31386989b2c35b40e72026b149c04f267473648d39728b49ed54dda17bda716106f9fa949257e824d6558a52bc4f6a8cc987698c1ee9dff02cc9356d5c1f66a37b0a05fe535ed30557a8b9ca304386ca606e887b53b792b7347a26f69407f51ef9fddc6ec8452ac7316762e78ded474849c5e265ecb8890414da9132aa58c3196f24d81d770feae1d8d02d74e368af7783f79409e79a05998f598fad93eec867181601aee4025504ca776eff79489eeba834f590b53b11cf9cf241b8443e351b51eff901dae346d90dec496c1c5bb4201f32090815b61184b510e2bc0e07aa8baa8f0cd222436ff4aff7792c0c96a62ab658dc41d399b804c65a403954aab10025112bc1997534f3c3a3ebe6a3b673949a7237c8981b5872ef00f5f5366c7c6a05e97fae62487531e06d2245ff8d221f8e229052a4ac36c22f4e14a53a917308c31d7076d2a849bd6fd486c1d1fdb574f42748606da2492b4703617d5d9d7653222e525d81b4b5dbaaf812b05121535fd83d4ed0b1a8f11ba3ff22eaf4e93be37faa8d560ecfbff2af973770279f6ad8c2e97f5dd83833141b9b07f22fa657eacb365b94329b73522639d98bda31b514ab174994bf906bb7aa79e0b6e3ba45fc2ba1bc1029255a04ec87d18094e28f2e119d89add3c8df9f3d92e1118470e7049d08ac573d84be47e07d13ce9cfa091755110e434d83a2c61a3637e52ffe9ebd53e6e609760e211eb0c8be42f57f572f795004fe1b75ec11dcb09633377aa77420aa05435aae574c9cddecc08470f22d25e447c25b77e93409723157cdb35239a825ccbeea699e3b7f7c40a4c61b5175f819f99a8ac0b82140b9d4c9508898d3197c54720d8ce097f2f8850d81d28424819c0c3bee386dee91e24acc61b261f91c54566bcbd63f833d0786539dcf4e51c1c6042eaba0fe51681ada03247e61ca2614abf2cd74c2d38cce4dd0b78d162fb40029e033b8b8fd33cd8a7a6816558745c7630baa4c255982dfd20052ea05006cbe74c3d018000ae0597f567679d8665905842f307664a83862b39d6bdd9a51b906f71d9bae9c06650e9b52d688ab8101d9703077632017dc702e737a7c2fa9bf012dba320e73c34b9cba13fbf8078292b2882fee0014b84b0c0a3aa04b88f8cc7e7016b1217798c35c8bff9422c423d703b996d13ab934d74b6816f09d71a168f860ae7114905a98bef343cbd46fdb4b8698e1ad1d76ecd19cd658c7fac99586fe4ccbbc7d1cc36f606878d1be673dcd70a460830cd949b9a5ac9143697cd987659133305b0963c36dda85d726e4c1e5e8dca64044aa1d6da3eb0e0dacca948f6c52322e6704a1c00ff8baa6e9b63a4984a2d5be1468fd26c2aaa6c0b0913e131b02e8c56ff2fff94c5c4236f9bb725b347841fe6d71d97be95d5d9072dac89ae92e68cd1e3602ba9d109dc40cb9667c682f547b026dc8c720f365ba6eaa1d4f5f5d271c5b4d50b3b7a344dafceed8a68783f6fe6e564e04699cb44ad607cf80fd8215125bfe511070919a07111f20e69094c508686104e380c12766c1acc924202d253e7348bd9896425c96deb25343f826e2fa7f666f2ebaa9169759f76d0d7d7b82eddb865257a747fa479cefd8619c7d6d2c4dca9827509832574c11c6ff347384af967c4bd522a2b7a7ff06b081022c51886d3a732a2056550b99d8167256c285a48bfb8ac90ba22b96ea08f87a7b147c4ab2b5db9767ac8e57a88a222e29c0e8bc1a81914b978eaa9cf77148e66b8ca0e8ae671f057a25ca3c01568558d279cbd9602725a354e5338a5999fa3f57abca0900530bf1ecf59efceb7763838286440e02e930ddde321d812fe97969ed38de228dc6865241764afe740ca0b59fc5b1e09c3101e132b80ca66621d3df6982d6f0e364375002fe945ae6f886d98e20da9fa7003795d70efa0ace45606a56846861b6c2ce66868f533875db4a2c8bd99a7db3b7fcc1d1a6ab9269ff4815279f3ba0072ee595d4ae9a7827e22b32f72fa47adc4b21631d7008e853d01bbc338b36e080d7223ca09c40dfa5d6e216db0c230328d215fed59da0f574bb53707b12c769940994210f36cba7e4e16589616956a7388bd840b2db541c54fc5609a9905dca554966d4ef9a931fd400cd2c3bf9a02ff85da6e20cea059f95935fc402cdd6ac7e6bb96d54e3666167c18906f101cd6cbb81d0d647402271378d20de5adc0d20a0b5e918c3b028967fcceda928555850c8c5282d44dd0eaf853786b678ca0a9c15a66ce55ad86763f7f82bfc4dc011795e1393e388f87038880f9fe7e78cdf4ffe5cdf2d16fa2dc27d17fa30e2fee973b7046d11f0d602ecbe8a71516481f6c56bf92653ae50682cedc3b8d001849f17f5923b3aeeb0aa5ec81ace7224bbe204137319e897a429849347ef17ed3320d2d0fba33b2d0f326dcda1d3f80f5e151f6a5687453fc6457a06cf0a716618dda400cda78cc7f0932664756d02a444509ad83d4844adca85b787d7e7aa7b48ee05dc894e163ebef76b82d4a0ec177137d412b7b38b2974d74847c467c431d94f7e9f04f9c47e0b1480df63a3045a8c7560d0d2152b0a820acf4700e8ca884526b51540dc5f9ac21722e5e76d0e50a35e603d66ef6a5507a8d06a077e50051f7fa417fcd527ae91e69ea45f8b85fddd941ec049a597b54932f7eafb6281d472b9802230d47f1a4ead80372f68875e60005bd967062b44f6164fb3d6a201a33594ce037243005533946894678f0969e5223fe7f07147c2e249d58e39671ac56bc553a0a3ba3530e7311afe3e0da38fa4735c118a0ed8ec1a0b8186c4128dd9f26440fbedb1412e976ad51e55915bf4056c9f642c85942c7d1942c38c31175b86adbdb0b3213754ee015089dd53573597e5958cbbc4e60b60647174bd11ce6620fe9f51bac81d193daed36145e3b034930e02771a19a0c4434a088f3338796b25e3cb389a104b07a4c0f3d096f3476bd198407ed08ace09a645f30eee1ac53bfefb3f388f0ae00a54f2008087b95b6e4f176a8edb8c49623293b010196c4ffc4c7ef8cb0e9de83c7d4401b8649992bcc1b89eaf82c86eda14517bf7a5a1585f603f1f4681026c0b3260ce95fb88daf287ccea9a36394acc10b3984dc9a78f789d79355b65121df43a87646e806afb54cb642930e8b1c784c39a12a0ae7c417ab17decbe4cecb019f457a86cb896a5d062685bf112e01da507880620d60b81df79c053ed4e656c4c52e13d0beaccf2f30b44f91f447d9c395370cb1e6b9fa11e27424b0a66c4bc51841b0ff2024eeb093177a01816226662e85699d74c7200469e15d533a23d390754515715f603902cce8265fe4970c33cf8b25ccfc5b95d4b17eb778c355bd07d32b3386786f336b03bc2cecea2609559c0ba38d2d3ff7d79046bfb3c4f10f55844691c49fa4175c57df3b49b4a37d329e8642c52c8c19871c8deba48db52f8caff1b3a06cfc027f72045a13b85db6d1858c6b10cfc59a0d9fe9a8579f81a379d01d214c80a2770fd4185c4f22bfdfb64a709cc6a41cb639f3a91a3b3eddde0b5b0bffd59991fd5d34d1f11099c9aee4e60731b89ce799a1551651d4ae222469eb8459f13495ce90d652342222b78427e4c562488e328c437bffc65053a1bdd01eaaeafda8fc395dca9435cdbc6dbfb17ff391b2e304687ed336aeb09f0af4c5e2682a57ee75b8039f4d6e79b4b0c39bd04df84723a92d37941742e20f8083fcfc77939be849ff1a37c9c3fe14978323e0af9e62225f3f7453fbd7ec25590091ef055fda0d578ea3205482f253112fd07425621905b9f9469d69515e4c868296e41b8166d921850b79d4c2c52e83c34ef3dd3cb62805b93bb6ed5fca37b0deb0a624237804c12f4ee5a31512858a2b6ad958a01e216cb35b8f651ccbee816aacd558589076e8b7bd047ff1a6efcf00c6018220989036e9b7b5259752057dbd60bc5007123a871cb43c930c0e51cc9987810976382315c31511327bb016f2d7d5231406e810f41d52856945da800d159985f85dd069043080ef992a5341be64a51859a1afe21ed41c6b7497e9a367b75be6a725c11df1f2051fbb6f0d4a3fbebc46f633c75232ca0e117f5f6f3cd6b0e1fa9febb37b182a7fdf22068f7ad0f32889b95e06b48f8b7e7f5f6e0b04147a64cf3ebcc227df5b9883feed8960dec068c4e259fb1fda3ef81fc0813a26c188d3e495ce5394f073bd1a5d0822031491d7ea87c15321a4386cc2615e90616194092b82e63057c0104972b7641702a7eff811277b8f74da2449d323336b0400eb7812fadf98654fb63add759ca35937e4a541c6019f14a3ddfd429183759e40b180a75d007f22ae09bb8a638055343712ce5bc244fefe616c2a1ebe3527319e6d320cf73e7858638c678f249136896cf663a1557ce1fa82a06a51c7c252efe7721815d554e5b1982d1d39a66046283757cee56cb045725b49ae4a584dad68791041e4f10115fb5c8775bef0af5159496a1695541b5f645ccb43e93b160bff3215ffbac485e8bb11d028e373af25186707c684a2dff8d00dfc6ce3166905f5940979180a38c98cda9d4147aede7d82b83c89df1ca0be5351596990fb602b657b20416c5f3a016a5ea21ab4cda265738ac357f1244e5755f1bddf75552e858ee1beff11714b2bb98701b80d28c3f3177f346ff4dfb47c6116c3c5f7a87489fd3d3c14dc88bb622998cc6498d1d2b2d1fd7fbfd4c198a7927ae775c6923f2d382787aaabb1816402a697c4c49e303e5e37a742d3000893482f263091e93f55550eac408bd26759f0790ef3094cf7693d1bd143c21245ac802e98f597c9873279655db9565daed00e69973d41c796122965ea717b61249bc4dad0c011d34f4131a1f2b3dfcb4100ebe7a93c60548251a1e286bfc00f9bb130c7ee526080b50251b1d55d2e881f2395d02d45514bec96eacac4c8a64532163501302cae4c68e959edf45b76dfcaa7df1d537765049c30384bf3ac1f42f3683b080efb892c6c74a1a61fee027dd188acb990a08d90f52b6d04f68f048e9f92cbd4c0d85316513ba89e78fd2eb067e03416d9f7d2babf375a8acf181e7990e73f07f298802b0eee048a5fd13f809cc68022a05ae745630cc249e03330468f56fa1ddf1259837991668d6e5f97785bdfb627b2ecd7fd70fcdbc332ee493aa38ab8a30490b183eba4e35046755c42bd110f40d7266339020aea480d1da4f891fb160eafa2db2b79432a594640adb06d50677072dae3fd389e07abdbd36747d130b5c4f36c1f5654f0aae2f42747d5ad4c5f566d00aae87b22faecfb383713d92bd0b5c2f16e37a39dc5a703d94a38d1d8e777ddd2ebade88d1f54eec645cff7cceb8fe093bf45f9b0bae871b4261a233721aec30b8fe2e7f68695c8fe7a347d7cfcdc8d5b8fe6de79ad4bbcf2114263a23f775eab56f31703d5b7f6d3e77ea1b76555e10d6f2203dfb9c9ee6bd37f1e5a7abfff5dbc881f08617086824f71ac98d21ac0099daa555a66ca4d65aeb9c73d659679d39d02f6bce55ce55cef7de5be7af89daf4e3fddf3a07faa94fa77822bb24165d3efe699db1d8ede69ca6693af30a917ec678e8a7a9cf0de0481559e1857b8ee41e5961efdff106ee71b000123ec61b3ce8e92f70e867bf81431844fbb3071ae50febdccf9ec589414cf8d90b87bc0799eb4820152211ed8d733662239b8f3963228be460ff75d32ab79f77aa91da2c0076ef9ceed4a835d5d71d8348fdde2a8c5a21074a53ed4be065554e361a39d04ed32b15e45218989d5d56dfccb021b1c7c9491285bcf98a3184646faee09ec856abc597d518427a87c2ec0aa91279f10502dcab5e3586b08bb2903c2d6366d9217971176521719044cea08f08d741c9ead674b1aeeff1db7a732ef4902ba0a044057b7d215790f611bfbea9015a0242b62ef14de6ae13e358d8220658fd852166df0a5d19bcab8f975ecf9f1a4190a1e260a2bf5b82eb777038d1a185cc100537c649079d0c4f1cbcbdb82c7c195cb9c0edf0d3e1cc424b11a7c6d4157e42e5a4cc32ba8e92485eace942d251f53c91bc38b33de419b94a61aca01285e445163664bb36c582cc90bcf8a2876c59774bc1624242f222cc0eb2fdfd58de125f8e4b49149217db22c8d6bb58df8480f9d49c3c902bc8435548ee43903036865c415009921b71e6001761b6ea542861768716634a646b74b1be7949bd9eea53f244663826232fa931ad8187ac6166809a71659eba8c0c0c2ed6370448cab547328d8b91d8f7340021a8267ac4984b2257003c1b42ea78410076fb2987b36512d91e5d991944a6feee8f818b41a9779d833cb28a71aab5d6e9fbc1d0c8e6232641fa63e27a93cecf39bf198ad537331aba271261f211ab9919d8213714c9f281fbd663dffed8969fba00714dea81be4ddd0f0402811adc28be007df6f9bbc517a00ffa8d64d1d9bb3e457aa06f62f0ae4cf09ce871820a32bd6bc223e9a987935b1732f5363840a06f5b230b90d5fe57dc3e074770e307c7144765bffa7711db68b0e592e178d225e5f4ac5da06209da911b932a2782451c5d937ab76853f4006f48bd0650baff695b524f0b28d024676a48100cf151914591bab144a649d69438a488d11921d32b393a92927cce6a0421dbccedd83617d7e27bfcab36fe8a5e9358bdea3dd06c91fbf5f8b7d6b99880125f1b3f387eee35ff38a835b0d1871f2fa9ecfebb7b166bb1c73369dac1c5506bad3108ecb377c11fdc7ccc427ccc43114503e00dd90b9907c0c7ec626308bc8106adbffe67aebfdf0fdcaf436010c05d45ddbedd5eafec0fe8dfe36f8d694eaed91e08737c71d4633aa30672cdf6db5883d4df740928dd2910f73bd57eb73a3822fd18d0376eaed97ec8c274a206cd3ba4bc84ce9b459b6e20a3f6695104c577f8b99a163568d16f5e989fb3cf2c51fa8b93375dea695af4d463a59fa61e0683c039fbb7ff14df9c6049b706858c098909327b22bec155cc7c9ec8284a319502993dc6370a8806cd152599c49ec8ec597c630266d19a143ca70e0f64ce416d1ec65a07db352023b1aef12087201f53bd37c6183bf5ec658eba703ccb1271ecbc12da9f9fb5b1c3891ef310f46f96ed9d65896c67bb678947622be7fcfb47591c36fa59cffab4e9b3d1bf89ecde29ce670190fc2c0bd04f7d9a020720b88739a41e07a9acf84825969234b97043db295ac2454a15424f50aad0a890597b58ca34352662d829d5a3c712a69426c8377d267d8d4484f1141f4260496b70744e1a1084891d123bb81452382a994cbe40e6d5f8d8638c86c6b4842485244a847cfdc7744a3d407445763a9a486c63021c32c8c0c0a0f0889006d037b82ded6ecfe90614a92f244e3bd156e40991125f091f203faece945544f690d8a7391fc0f91ef885808210e40f9ac6c7471f7b0fb0d1c7be639fcaad40c964120bfb17dbbbdb0ff387a0df9e987dd73e6af8db8307623a7f3b319804ffe2320ca4f8dbed6fff62393a0bfc8bf3f66458a53913fc9bea08fd6d34e3ef250afe4d9ba088fe4da9b64f95cdbf53a68b7f5327d8df15b64fa36d7f07f78e4a269345c837a5fb3bcd4bd2f87bebf418fd9b8586947fefa60c75c1bf992a1369b17306a3f16f2edb3e47c9805b2ed3fd9df3debcf7b7d749a4bf75cedf5ae7d53d35fed542db6ba4185d7ae96fdd04f577067bb7db09a6c1bfba0cfab7d7d11b7f0bb796fb3bf998b6d90d5babcb123f2384e53976110a7409b2d39c6756e49c73aee0d28529059ff6cb09f541c8df680810a71c8b3738d5d4fc8dec2fa7586780c283900c49facbf2230eff720b769583969cd31403591cf6afbe8048ecbfff8f0e9a1ad558fe41c8bf0311a8040dc6df0ef7d0655f38f1b7fcebfdbd60509ce11b33b1f3b7adebba41966030e8b6c05f905d555ef33b74007eecf597c1b8033ff0bf2040ffec5f4864a2fad5dfea9d62bc7556598838e786b87d10f2cf7e4290040b933925bf75d95f04e91511fc6cc45d980966e4c2feb682de5cfddd2f1d7eb129f3d35f560219c9a6e90765d62aff6d8af7d67be7546bdc5936defac5bfe1ad8f80ff0ff0b3f85b969711f0ffc1f1f361fa31fc0b3fcbfcacc138e33f56fe565ddd5cdcfff8db9f9b8b361f6fe8f07191dfb66e2ecefcd66d81c01fbbba2ae7dc6d61c15b6faafdd20721b37c6c7ca9f92c5659b6f04dff8c8e85980b605e2e547099215290e94263d16348310dcbcb0168b2f11dc12f91d39636e090970bb607b8d7fbc74babb7174cca54fcf7f8cc693be47535ddc5ed99b2ea57555d55954db9067eef09c20f35fede4c7b0539ef26298ce8ae520e3f4d27a06fb6d1461f3db1ab2ccbfbb681423ffb6d50f434e7654e4ef8411c8dc2c0cb514f932618fe344db7cf46af895d6b9f72a87992e6d4488b673af89973ce7ff6af0be71cd7e41bad8d1edc68ffe26c4fec2ccbaebdab4422f77e1f8f78cf0317ab9e46a55963b5420c8275530c82e5479bcecf5bb6fd45f8d8eb2d3837c520f857ddfee57aeadb3558805f041442e1c79ea79e25480283087eb9ded246f835614800a67ea842876a30f56eea23a418c4faf19b15918eaebb2048e69038d8008c27057502c7d363b90489fbda7bdb79effd87d30c5485db2cc34e7fb7db161c0677fdd5500cf0faab819a403078d2df0d6d5ec5e0534d821f6f89596540d15f2cd75cca60a3bf5bd93c6ad15fad1462c24a7f798a268ca2081f2f9b28aa60cff251c959f36e74277decdb8bfeeabdcf5cd3d9ce1aeac74b2674afb14e09cd171958e981019854fa89b9f407f0f192cbedbf4820014eb49c27766aa5aa1ab9b3d58085918ad8d6df6d618ee5aebf6c06b822517f3771aebfecc74776c518ab18638c31d619638c719a3d5b3b0210d8bfa37eea5b0d74fabb53e3547ff7c720145fb01fc10b369260f9d8afbffd20b0ff8584fed888dd6f41ae3b002337926b1628fd657786b7fe6e0e827af6fa261be59a6ca4a3fdb1457f5d239c937f1b65547496070b90ff7aa52ff9b39128a7f2755df79aae352caf0a7efe396a9f68d5d234e56a4a33ce384d35f62f5adfa45c33fba7de00543ff5387d2ef5acd164329944eac04b1b62fff5b0647e0ca67331023b6ac508ec443fa436820548af609c66af7fee92c9d1dfb6938fb7dec7dbcac75edf74a8bbe48f2076466498ef4eea47d18f281d71298822113a8b6212a995301acbb2b29b2ba2e3844cdd3a60dfee125a543e57ce1b575d6d2282aa7ef8403d71f83051597295fd385908b97441213b6bdbc3bb824cbdd6421f0319a1a0f988bd0b507f37d8c77e26a9cb40e91d90f4772b3ff6c29cfe6ae5c75e835c7f798a8fbd87b7fe6eaa8f7d06293dea63bf9bdafabb8d3ef6febffd7b7d83f7e084c4b9452da5b140a6fea86f42a8533225ebab2c4d0959626789f2e7c69a8b2b360b00b9b165649582eb0532f51694f477037dec35cc75ec65eafabb733ece79a8ecdafb994ef440e7a22eeabd7cc4792789665dc6adbf9aee635505b085eb0364871a112454666c35f654a9ce9554a1ee52dda595b9b81bfb69d241939e92cabd3d1a6a1d0b208ece2eb146a054b0be4e0177949d957395fa6af71362db7e4c4531829092fd27c4c275f7c8cc49dde93f29608ece6601933ae7e250facff9f6abeb1b8833e95c49d5a104faf8215991d8a675a7a5a13ab567eddaeab4fe00c698fa1d01f27062d77ecebe42ad4bfa3ab5ea7496690398d6237cbcc432fb4df9b56895542220d5d24be957c483871b7c2362c5045089ab070f1d74a25f3f5e7aed78dae52e81dd1cabbafd6f57d7f78399df81d1c38facaa0a30abf39ff54b88e9e3c88a139814968f2c57860f2ef5c987332bee848f3c1c7d03f1bddeca688d3a57628574976a05a26c7fc25c145650aed6db8f97567a6c544ad8acfe4bb6f50a3bc0283d68c3adb3516bd8d56f46e74aa1ce36815a7d0d637ffa5ab622e96adaead57f4a78aea0a8517aff787945a56d7696c5cad3d9a5150b0baafdd1d7a9df92ca4a5dd1593936acaf1f2fb1ec5aa9fefb78892505a8a3efe40f4767ffdb5b2afdf75fac647774f5e3e50f18ffed9f55f9d61f8c342e965d7cff3d7ee098b2cdc7f9245ecd47f147a07ec9cbb2abebf7c29e3fd733f15256216deb7abaa1470bbade8e8ec5f5635be8fa28b4bbdead0d6470604f1aa95053cb5bfeba62326d55b5f055555555762b8598c879ba4a2372e2e24a8ea5233c24cf153e655f1d73c223c29ecd31b709b6d4f388202892b687b3e922d9b6aa95d6227e9e4ca1a490450ff1da11e492953f162e7e4a751dfaeb1ad5b597f35527a91222de6b9a0d51ebb1c4c6095cb60364c59415a4675d9218560f9e1c2a253c787c7c0da564930a0d233cda30af918418239251450b8fcbf973922494dcc1c3680b8cc4909caa925d690b7e74cc886a7a2b92e25382e22b8fac876f2fc78aafea2f4c62f9cc31c683e8ed6e6c0a5757934eb8c7ae40f9188a1aadd0445c9a634cca829a46564af8d041778346598c2a492467ee25837ac8504fc9247888ea6a386f40796d6d3931825326b19155e5cad9b48690223705698a532ba5341c3123a9aa6a8acd5c55c522904411bf0a1b7f5d7df7d2572c9af2afccb8236f483f5288a879691075a5141d02c3cb62a2a56061a65d65e862c2e0b1eb5aba7ac539fb39e79c8b50b1e7b21bada719e5042487847c89ff4452d5d1f13994831f764bbc1c4796d468b65055555555d589c46ece1cd2f40680165d3a38e79c73ce7908194e97e503c239e751fae4104786ac381f6e1fce394fa1e3b22a9c5a058f11ef31b222cae7dee59c0f87c3fd83e1852f07900e95d692a0b6383a232e3c2b396c435a290b9aba5a78354531d98b3bca18a231a5b4d493e39363f5f97175555555555555114aa2ece69ae1e4e9abdeed790da94d00337097978ee657b355cf4e459f216b0ce8af2eb992a0ba226a25f99c37935a9f73dff39bd5eeb2ca6ac96e7d5dd7352ad760e494ab5c83ffcb762b438055e4dcbc8c997c57d86595156b8a82f3486596374de268006183eaac81e0450fa0b13214534cae1f99e55f99cba5bfae5f51ecf814aacff9ce1a4388e305454721e76062e1560100414d1637d2bcd29804c0a90f8fca468c154026fcfcd5bb5b3c4c1138e79c730cd4889166250c2c4c6b03a72c1e153e685e5fc89ea0600f8d16ad446b39e7bcf905c49eb59c7d4ba2e333b60605fd7a52327d9e9c3ca1d4d85c3e4012be16c2133681ac2ebfbc4909b5cdf0d1f32a8183a9432fab8e0d2a88abc7aee591026ad109470c3da35b3b537850986ae8205f6291dd57d5222a5f2d56f57d2d1541029484d44170082bb908f888d2f10971f2e502f912bfd69a569b85cfd7849edc9c4f2c21231ac8052a2aae8a7c15f938510157d199dd93b1233a905c3dfa5c9d85471c191af6755dd7755d4b31e7c6c664c9c98c11594d781481564187348f20f5e6734ff8834b858ee61aa2e166b5ce91b4882b251794ca3a4588908985f4390f72ce57960b3fe79cf311543abfdf5a6497624b954bea08e79cb39d757b92260cb7cf391ffaddc3fed6097f5dd7750d51d5c4395bc43c3e96885e3083902ff107116309a2c6723169d38b4665fd406a7d83c9cf5a0f0ebd173c902f310a5d320a5f16989c9025a190a9962bb5073121412868a539d0d556b537b4f343a985138a243eccce52e40809922014b4d20203a102cecad1dd971e5e0917615128526cd1274c419c44087265820ff68e056bef868a3c262234b439235f2f54e080c252a2975676acba6ae5d94bbeb220168ea825b135253423a0bab3a58d3126cca5be255996cac5c2ab6b2abf9ddcdda5b1154941ba3253a737e3ac89ab68acd9f3424c4f4169585e31c16aa9a3d70ed357ed7252533a5634c5270849919c0847509aaacc50265bf4384a45404199507d2d53c78e8e8a1b6107c4acf2f3d5267346cfd1b7259859cb619941f267dfa61e5c76d2ac370002015e7d9d8109bd35d0d03b91e8fdf168638383c37a08b27907e19210c9c38fd1c11b32a071d5c605aaae1cc09cced5c373cd1f32f8d8973db313fbdb6054fa01357429609bc1a5aecd1f308099612ba0708335598dcd470cbc822c478ec10b16210d9d9c5ccb052d61c79039c4f5960baaf1d9126186edc0c3cc0cccf0d73b91e8fdf168638383b36d8c224890112af3114cc2d058a5f835b4a0e8c63f8b37bcc8b06082172af10623132858184af82cde50934721062b3bb0f170d43003e3c644f58d360a951efecb6af82f3bf35f16e6bfecf0bfacfb5f560b63a25a1813d5c298a816c644b530266a63f3f30641882e1780f5142e1560d4a050a152d770b052e1e5c52d1aed5fa84c396cb0e4a5c2c77e2b7b5883b94078f5d97c6cbb2086481ce219bc618394180addb5b1b14f85745fb4c0c3e4e3062445e3b06583d2887d8598688c5b162af58d3676ed5f0b463ffbd782d0cf167a54ff5ac8f939c6bf31793fc7d0099d2c2b540a9542256785ca97152a5f9cff0a95acae71512283f387081f7b3528d4822f54ce68cd5c68c9c7a70b9d3dcee01b16ebe21906617789430f739cb1d1e0a1039605d2530e58c062b6501913152a6784ca9ff3070e8e34182eccd0c8188b9ec6024d0c0d0dcd0534343034341368541a0b86126822b474210d4bd0a561571abe696858bc217b9a20fe38c862103883649a3f00b52e2c760627de3c68b965486b73411be2a188f3c968a34f0dc0c5ae830a3938cecd010642c70b426838c85d301699b139c2b041186b2c82c5bc0ced0b3890b130357abbc2065a2e5d0591431f850dda580b3cb00ddd7aea256cd8738b4bbbe55c1f53af8dd9983d0ef968ca3a345ad5da10584e9ce492203d494b50a20811538594ad2d39573c6b7a6c616cba6f5dd7755df594ba06b31b376310116a362faac90cbc2e27998da4b6271e54583672f0924d3c167fb5a2b73434ca51be7833ca5b10ef070645c91c6e4a36a4d5ba21d1cc993566371b95f64eec4322e744f5d9d2442e4719b122bc9c1e500ee92cb574b08010d9012472f583af2aa9e307c78e94aec2b99044da15129fe65ac63361148f5647e936c51a23eba8be32a12939e79c7b71ce3906241617f28b0b802a68e077e4b4cb5795428153ea523ad519e9d9925992e2fb7962f2a449f3d1c0f024774188c98b49c857e51c60a72407457464a52fc31b19d4d294269f1395a3f5a84918e20e4965459848aebf169330a1a3769900fa6aabaaaaaa8eb062c76e5555d5561c31eb510666a5fcbaab9b32b28516036e6bcadb0eb9e2109f996ab906bbd1fd4830f388bea5eb9ddff317c147a975b04910331532964cdd95a8f2993284c9d68c2515abf7d6755db78442d6301fba75dd54a99d9be4a77f743366b06956c45d57b424a111b9156a0763421d7659f9d14ba56875d947f753d323960c31c0079228a3a2a11d566a06585cd591f1e89194a3a53c81847832fbb0ebfca47efe2ae684ca6a3fcf7770a0e46226df089e456df0a2a3c1236585d21021695c4894a5c885d65752db1226407414eeda907811a5b560a4507012bc8eae2ca4772e3f4efd0b8a8a0892eb2774ac423f5bcb2899d6755d63ece91acc027f1540f2646c4d2bc60e2b1b08c264c95c185a5edc0d21d58c5e84bc1b55a8f4709ca81353a263a4026d48df1eb4452bab256f840a1745a07665307040493a5740b102857536f78bd21a6f35abc039e77a8b734e5c9f0ce51a8cf4a4a913b5d4a2d035a1b1e24a4e9c06aad47eb49892452cf45d920e61638808468b9efa82ba2d77185901079d6ad2493d7774884e008fa21a0ad152d02f55855d2b0f904ea6aaaaaa467f3f16362b39224ba743e77e7aebd0ee00492ca21cac2234641cc08a330c480aaea792a88e8bbf6abbcea13689264fee0ec958bb9c446118f668556f31a9467b739f73ce39e7219e20fd7e6a5d8bb44b1679d188cba1b4421504f912bf5af6d724123b1e70625d65c83a352bf75adbd2900acb27bdf3356489e47e4774c11954d8a191bb534582dee2d941b175cbef26137e552c1bf3ec4eb6c2cd820fa70dc4ea274c47af242f995ca35555b5695dd775ddee66dd2969694b533774ec9031f5465454c3a70c4a3b39ca3b4a167c411aab6e9ec8fba551cdbb1fba870f0ee116e57048c0ac3d34caaedafa33528b49e79a2ca8ea63432ddac674f2fad292cc8006d9d0ad552a8a17909113cf3c253aad6c9a58fe38e711deb20836e8baaeeb5af64d409901d1e36164eec7f53472050a2a055da6d22497d08152650a89cfd29914852a623f4f369660cb287433a36a314c68e0353bb5c5534e18d56c016da36c3c3726d175d5a50c767585b5e8b9b4078d0d78ae5af0883e25e72d1d98817579c56863526a3732aa2044694355b4dc2a46e61a896a9b5c96888d1e329e7cae98a0827c899fab458c15779f7bd7c934c4b682a7e9461cdf493134fa49434093ab05205c534878910512668134ec3555c08e98181224ce0af225fe3bde6421c753438f2d67c86c091c1d930cbb2a9e24455ea44559477a7c62e84c81295151f444d06feb2a952fc068d2a9881aca8dd71f52544a43d9124f4ea6b0a51c3c33921c4063aac80e8ed9c64246f2c794b103e3c64492fba92272aeb8cee22c51214c20ad3472189928c2c4bb71a285f0c4515491b32a2baec85b0cdd66021ae1869c067a0926d12339e7b254f657bff52fafeb5aa53ec9017f57cc9d1b3d6b1e50fab09a5cb4704271a00d8d4d2809f484a9e3f3d389a1a4074ed5c96189cac261f34f4caaaaaa3c3b538e4ca0b0cbe103f729d17252b239b7aaa235ba94c35ec249c76a0998912410d195ce24f2534287d511ac1e41ceb7156c48cfa825689126460f484bdb1b7bce4d9960aab15d6b9948a80f8f2e08b46a860a5ef8480b7ad1e42468089a508e42120a4cc5e9c1d5f0da49f204e36a4ccfca8d3a3eb51c620a2b254bef6b68d446799ec4817326e3685a8138541e50555535441fbb79ebe502c593ab98a7270b2d26fc8a00fd70b88e8435c3645c794282a82448663479d4fa984da6d993d5696c67dd7ea6a36b301faeab50c310664884c9c70d4d723e8449bec4786a8dc3451285dd13d8724995c4886965e588099cdc5aa5860548f41b7001508ce4780a515a3d594a325376f53cb15a8611b156a22cdabaa5e6b4e40ee088d2978625e3ccaa04d0195971369c9a74ccb827130ec85fa1ebbaaeee1913352df183ae07c555901d38a910e0008a33e265a4f404c9741a02c452e2ea33a91440aaaaaaaa17dc006cd090e961a28fabe9a96345280a05a6ba68482df17a426126a28993ab2d2eab7457744a358ab38d4bbd6ef0f9d42c15117d72ce5b968c2d79229bab73022d11c447550b2a4a446e43f4913d44a8aaaa1a426988ca57552e9d265f557559700d8ab1380312a1808263c9cb0595285328ae10617b63a103b9ae6b27fbe0a5e4a32637a5cf24073ef2a09c6e705154205fe25ff1038271058656d0d6d99214521b31a1dcfafaf12605047481246f506761513f448a4cf56611ae1b5da48f6baf62ed1131f68c3ef79b7331bf7952b1ad1d78673df0f87e6ca802f684892f965da8846c776639aa0cb248200020800083170000280c0c88235118a6599ad91e14800e43a85260542610c96381401486310c02311000010000200040210cc3801c8a74ee099c04023e740ba02d7477029d8106b027b3d2c49c1a08ef0c828d294f402640101423ce81da13b2e24dd0f7ac279f7660aeb7cc62cf4c1769484e3f435b0317489b959c4f3a65ac74feca770db9ec1e40de4e1e7c8ba1e05148dec5263105e540600e8316ffdbec659f3c04cc4b4184c3687e1b9100646f638608dffc4ac0e98196bc21c97ca1c8035de0907dcfcdf0ce192e3f0e439324e7f1ec54bfe88e76b5c4e99cb850793cb6ac3c719d9f48d0c78b405a4a56ca4d772927ca75f26a8ce2455ef3e2edf74591c87a19f05902ff5404be8cb991c51b5d281644e9f86769b1599123d504ba3daf8b3a153fb37763f60cba5a0a24cdebd29890040af1571a92737404b3a36eac8ef82921e49c4ef4df427004c48d643b5af78680de0e68f7008a0e0052a3029b7688c9258422c6392238bdfa8c4e9091dbb938600c10a647b40695a011e0bd9431b8e967cd7c0a256583583b37576d08ed9203e316c929784b213ae0d528382400b9970035576535095fd01caf711fd8403610288ab5994f5591de604a9dd8ef491892b83bf31964c91302ef064ef0d4269fe954e4903f27f8e3f070369223803ab40ff5429e156b953d2fce96b85c1352d2b1d550cf1b4a4398d29a60413f1593f5ba2febd8dfc8badbc517df90adc3f5a0c6dbb448f1d3d50ce15c41db4a15f11e38115e5534b636e93b211aedec2fd83030a153cf2f7fa9273bdc97118142074252115828fc65c5287e1d2bf97105ccf2e23667dbd23b9067913b89314dd35a77b2074cd38c57ec99f183a17d4d75ffb9436a4b3aea963a478a3b32bd08da87c66422c75ddc24331e38170232ba4c9a09e028e4e93063e033cb095b64742901131771798eb7ce16f25d7b57389b54428b1981e0b516787854f284357e4b0351609b34d0717f84a3a1e22a393308cfbec2d337f032095c3c9a99ddaca693bbb3c8295e127af5dfeefc43cca13a6ca28628a50ee5b20da45fe90a1020d8670bd750782d46a08135e98e3851863f898bf16d1ed7afdfb0b2b27126a5dc4dbe9c75a6704b449df76918cbce615fec354b342f9480cd10fd108c21be0f3df42f7d49069bc594e2ddc66ce37538539ec783af3f6543627683154fb445041cc03b987525eb7885539696e6e8306f0593c5e262d98d465d0576639617518225d34406d1d29624528ee3f99388592c58e1042035a0c4390c5f1c49ce04395f5612511d0271d6167fd7f92ff1c6cd4445705264a38c7bfb13eb58a79fc455a5cca6ab3ef207821f9014b58ee3e39716e76c4342b86e956a1dc3165e54dd5e982628bf6ed4859d579ee387032255588717465a0757dd46769e959415c0e9c9aa3350b06ea1c70a63a021e0f4a47a22319cda3b0505884e4b2a763846bd0c429be5199ff92bc0d5a78be9c9b599fe045897e6e53a145d65e989418c3378be13ddf909c3b40a40c041f80b79a53d32f2c8137b98bd4e48b3dd74004a086b6c7432e8d04d6e2a885f2fad0b02a070a680b8abf52d9daee51dacd9bc6970fb1719a2df53d7b4437970e65c95253afeb82e568ce7b1e761ff4fe4bd3b7a5f14e58c629ab3a22479a0714d05904101489eba24a0398d116c8a6d7bf7de68931014a42038c804114aa97ac3840edd9ea3448a389ef29bbadbe0d6895e3ad7c982838eac638620f8cdf41bec9ba2e2668c0ef72022ca1da33914fb5817eb8780794e3b069bdd289f10370fd63b90c38ad752ee6e1cda39b4b39320cbc5fd7e8636b3c292ed435dba68ca0567727701251d33f2bfeadc843737a7b1b339b7d75f58729297099a334b3697f41762dd3816ae5cc817affab829c6df686394fa6fe7fee0fc085d9828f8ce9dd0560c0cfeeb4ce0a7dca1919016b4a6178829b8f3d7658b1d3c33832b07fe001f5e147ff2441ff9f79ef53140b1c2c039d9fe091c33809c4d962481a2253c1b00f2f32b8d94130852c4aaa1156a2c93d21ffc6e5e3c77df90688d75ec2f320331f0b044b65c9901d419c7c7f73baafa180d6fbf9225c2a506e6a230919a5be9576e809afc03adc15d833976c70b713c21f51ddaaa659c53df6d842a84855ae61f2c7038937557cdc49f83cecea08ae288d0cae750a00c22832f7be3974b971c4814f570ea006f370227dc550d60d2ed35c4b8bf361b1f9411a53696ab70b7449f13721e2bbd3fe5f0f66caf628dfd28d1103be3e227608c7f378c2b0da0e66f8b5d8e8543bd31aac3f34c20eb6c6283644f9cc64a97392b5aaf77146882811c6944c8f1bc98d96108ce719a551236a24f30d7c8aec3dc6d503ccf322fff67a64d86432995c15e6ed6c8031b59a1d689ac9a0416cd1d51274a2742de84428e6465880fc3d0c91fe79157b7ba54f99c852adffd15ac30d08a4fbd98b3cfe4c57d5e43ddc8b00fbf1d1fd3ba13b3065e55d948da094018f2a509e9b68b86eddbe206940b4a93d96cb005913882491ea0c69510b78332e8d44fb304e3c7fd7686d340a1fcdf0c145fc4c0cea3f3239a660ab8405c83506bf5637bbcf7ea80cef058968c6ca4cea422f2a3df95e2b76c546e120a1b95f67a28c9ec3a4d0afd363ae28b86451d3a13383407ac0c647b48f4a855c3b53e3f8607e9614ca87288cc78a9ee4406b0e47f5bd05864fc33d94279221a753ca209d000f8d924d40b67f02346540c821631a1b9ec38f654bb35594ab0339bcf2a77508be235ec77a6eacd25629b36c94c377417b46530973d362f47b9ef6303c5a91430442c52fc6fc533fb52479a7c1ecbabbc334bee909b4ff901463c794bf4f689d1374424cf0562de6cb05994c655ce41117a519461a26050f24cc40596118d35e94fe12e81cba4afa000d8bfa26aeb8b07792b8ae14278294121c742809930969aac872aa977b2aa2092d4861e737a20cffd5a6338e79db4a949ea615cd4292c3226e9b4ffa8c086d2df4d4c43892c6826baa890c697fab37a0ed853e45bbcbd046bf94546b1f906a40eb3a8b5bf1f9453ac0fab3799d39c7c830859e7361fef2cc0e678b6c6b94a9ae50b67ae59695f0517ac55b60a2e5f1662a58603b0cb23fdb06df44dfde859e6b7556aef7732d2cece5ea31e0941409afc2509005774fcbbe08ad888c89c50fab922566651e4ab2b07664b7bfb1f057cba0049b419b6b4ea8e7cafebb8943393de443685924cc72425389a7e6a86bf5af3727521f8465c0c5d065ac4694a5ca1fc4dc06d999d1d14a72c97faa5e353ced3a00eafc7cd40be28e4cb2bd600c38a7568280a811b4ffade3d6c87dac54d9e7144c080e01e4dc3a066cc368052b1423be208bffe3bc701a12338eef7dc496f051f8a90aa413e1121d26f81165b62e8ab066bc8260d9ce5aa9938c190dae2c2f9f31d70665a20c60dfb41bb85254360f84a09d20f3f1c2e86fa34bf46c30c2c9b8d1bea8df76ec37744e9c230382988b6207e8962f22bbd84d25cf898017c51620c97c516f225cb54d0a13b9c610b70ec101747d5907546d9a2a2f46a12d8b411c77e43cc8c162540cfe91a6397b68fab1116b7c7c173314c3cd8af051fe6d5f1f3e0cb2cb6b91f4730417df311013a600646b35b322210d3f7e262ff9b635dfc587bf7ea17c839f66cd05164a2ea3bbf1c809ad3000c63fb3bc35b8ae4310372f18e07d05d4deef8c807fc59408635cc6322b2b911f72a76d4574968c20f5ac3e2729150e889739435497dfe004e5282a1344bbd0e47119fb671200b6ee08978ae7c0b1e3a0ef728d383f6a441ad5a64b3adfe60e22639defd82a8e6c57d87ff16429eddcce5fb0b4c263d179c4728166bf83ce7244e23a76a28c2bd98cb1bde56c001c5bc4ac32f3065ee1364f6511b69f0fd7d7982e0fd69139ac429d46b1a86fed3bdf6c403de2c41674656e9b8f694e77d92a503cc86c36f5bd9298bbff1c08a9ff49801643449a8f27dc87879fa96298f4556568463621aa1e829e7968e1417552f5f79e0bbc191480eb1ed1126ab5209b56b7c2f8a3de6e5c5938c7584a0f35477a1ed498d38bc377d20211d159209d861fc971a63c5f53342ce81eef79462ccdd12d802cd956cd1df881ef86493a82776585b8ea160a68e94171f79c13898fd843aa48c73ed4448e285a30e67866982c7fd2cc6e2130d2ae12dac7b1282c06f538bae2553ef4c4844dad9bc73f2374cb6e876c191804aec326e7f487ce59e9d90ac00b8cea24945dd05a83a89eb66ff25ceb483ea340db81d988337c45ff0206480d95b2e1c79d9d533acbcd0cac6073490f6373b5b5dba6406da5f4e04bd41fb10106a2f81973ff4b2a0bf4f9639e1c72ea02cde605bc5ef5fd7f6355b5aac77bfd7b4f7b6c2d3a443bd5c99d88b04e2a23d5cfaea32fda8ea7cd54ce4ce32d95f010ccb47fbc0dfbcdf51ece489d1214d767a2251c481f0f1955263b44032be5448b1dda3d70a923762a64422b54d2ddd3004aec9986cdb28697ebf0a7c504e692eff9792932a30b9f319e4f413a98d508f233e55c93d7d1179aa91081098a41e66c4da0cfd878516b1ade6cf41641eb4e75d0c3f3147153376180081588ccc7bb11b44e7f0b9ff99de76a9ab2d7211fde321a7c6d332165334d3c83f8d8876c63e7aac7e71ea299ad58a3569cdc31b72f0a30abe2ed31a5997b5b4369bac38d18823e0f121d91bfb1fb1d5c4a05c377971f333e207c6475bcc22ed2609435df72303e9a323c97d5683883bf4caddb32105afb2d111459dc602ad2e26e32e3269bd8cc01b2a33c972da6d14f497e303859c4e9775bf9e07f20da772f449fd8080cd1e4b1c87a416eba517d01beb062b0c8c02d35124724525f0774acb3e0086079fd922afee1ec3355187725d4ae9122506dcb8efe4cae810fe1d9015f1e26101fefda08c9d9cea1dce89f87349eef6a92841ecdc5d6054a7522a24d667ef96ddaafdad2461e39e9326c912ce6fd35198fee79e30e97efd4ceb455409b135bd0934e173a056ebc8515a623d8b149819758725c2e5e474fffcba471737f1c616d0f4be1d4c6fce5f4405cd4bb327bf9073282b0f515156c050eb81a43f59318e98aa3a9d13b681d4742e7f0e3dfdaaff0e8262c731b4ef3daaa34342d45c83d2cd4478a11315538cbecbf01dcb2348a69941f5a76597164efbdfcfbb7188d7c1a01e60ce453258918b2419ed295ec09c0dc8886d00c9057651c284314e26beb8dfadad2e15b5973b9b4a97f6866fdc6fb46930cd3c82cd6403429ce9758d12d2ebf780ab872a0e3f86fe49d3f26c7a21dbb17b2b8b5b6575d09538d33fa146a93faf3bfcabae8d6304bf67d23fbc3cf6ed2fa0ccd826be035e352b3e71241290e6f2e894b8519cabb38e35c2f110a2f2e3f5647c62c476bb78f935034751cf6e96acea5e2e6d914482bf6c7c27d66e3c7c0cb527edb8d476280ec1725fbca6187339104240a535901e0b7a5e95b2fd901923ceb19cb7e381b43aefcebfe0c3add476a00aebcc447b1b84ace25321d85f688e0ff50dd6b40dc2fa77ff281ecf52cb35735204a643a970e2babb69c19e0ea92a4b0427660ec632e46d3a24515cbfa87784b69b846f4e0be4ebbc11c9b3e49bc99a4e8b94ee48e859817797c695e82cde551c3901789a1b6c0cead10621c73ad2869d9568710ab109856113ac2e74b63a00cb1c31bb6614c52ba9652876c98a6e60385bb1cb5e4663477093a6c5e6777d9631a5381c6a9da5f528566277dd3a2f1d40402cadd2f7444d87047477a6ddf8a37034914f7899c832e861383813ab7053caa06bdeeed2873e7a5ae87d1625bc0f49eb24ebb6e776eb3c07f3196ea4f1495163a3bd702716e87bad465fa02477ce4000e92f16343ab18402daf8dbda70ad1aeafc05bc185b8af7089fa4e04e296ab93000acef50e6c52c2a25af13b5aa2414a9c8da4e5da0346825ef9dfc24b15fd6f9da04dfbab52daca8f681d0730df784d6b3ed0eb3b281626c966a8d9ca09667dfb5dd172bea0fd872fde9131d896277e24e81728d2c551e328c99728038bee1400af2114b9eef0134cd67a081b3c81295c763b5a87069db37cefa83893c86a4eced2c8b3b464351828e1562f5cd19f26f9099c7bacb415fc4245260abd7a83758a37208e305d20b6baabae7b1bfdd3d918db915185cc066f68ef3f037d790c61f2716487637f8e1bc465b7bdef133c191dbe6cfad55da8d0467e4268ddb5775a5015ba65556b6d2a03a7b1366f52da5a4ecdecfd7e11c5ea72a4f4c1c69359bb25bd0f2efc97bb4f77c87189bde59697965c62567f726d68b3bfca034abbeaf2f544e36f8051c41a1509e0c8ae69bcd01410266065b36a4b1462324b976a170010351175351cae0438877ce207e518b96d752c5d9aa81c20114b232a642c804653a9b14149574dd5742c5e2631fb987334404fa842044ac91130ce12dbd39377311e2964f32798d44155188c2720d480107643d7c0f41055008d228fc149426b8a4fbc414825c4cced3799c49c036b136236f9c67ad8cfbab537c4528b236ddabf457e54698cc81208f4ea0aeba1a4af172e0ed918c98ac045be0cd7cc2a1058b65c782ac117ab63db596e400948ce63f604ed2667805430fc00b5877a0f671ab3ad98149e2af8c8e173a31eebb7d7248a24e1895f0f689e8bd04a959e0ff11b0355c0460a6ede5b344f98d0610cb44a89ac1dbfa02aad4486fb371d2926b84d99afeee58f0a5e36ee104ec1374c0056e0f5709408dad78a613f336158e54c0685b875d8caefdf9e2409eb49dd742c7047402e5d74b2152be20007b9a80489fd2370306214825ce6b96c0127cb744eb7184dea121091de869c35f2f2600eacdaf20af049ef5cb7ae1f4b467023b9cdefb520b09fae1bd1009df78a272ca58ca6419303a803806650c57a79a998ee9cd50d6820bfa3047cc8c83b77414fcd865a8f2782c94ceb6d6c68f5449e4835f9ea7450221dd03263bdd266dd7b76362e0ebb0e8c894a89fe82eb259ba0bbbd0fce9fd8b3817353f938a9bcbf4b3f22bb3b64a4d7fe18d63ab9e41f20a0449d5441545a623c6f093222de8d455c60b70e39de811e9e90ba0b9e00b385abbd6b1ee597208d0eeb94b44c1061eceb528260ece507d41ebe087f08ec8a935ac443651bfef5deab2044d09f9bf74de4ca273abd7149198550fbbe5563ce471fc86fb7c13ebfc08e30ec454915aa777bb27907786ec86300316febc93fa07c86e64f21a78042cdcb2941bd85af3df1cc9d4eb0daef49f006347904925318621dc021a7f570d92abc99926db61cd434d00186b888f1263fc1f84e693587063363210b37550e0db9b72af461822a2ba80daadff3525148afeb5f1d1ae30c6b710ce90603284ad4433d65c47fe469431461a838dda6197688beda6155231bebc8d08b7f38d334dbb14ec44364142c54e06697680efefc177c12af44e6c775af32c200e68e0cfa14b0871e7ad7a121f45041e8fa63a198550175ada68521a640cbfe6cc0d1f5940ba262dca7ba188806705b9d9eded26905f1f62053b24a9b2b50d3c2f910806f9b2380c5d70a2c99b5a2c1a41805f788f9499f6c9412b88e9be32eb0ed0aa22e8080bdb45945ca22c5369b36a0acfd64cf33f4c2e54ea4a5dde32c5b9cdb3f2fe9a3f6f3b04be7587670ec6bed52740a15943c885b9cd2701db582af88560a7853861615221108793d878315fd49d00c47afbebc453807a316e5aff08417f3ba6141911fe323567036c37488296006d0ff943199c92e42fd7423845a6bffb80adf92a7856d490038e516e9c992933dd7fb80bdc4249725e40f16422fd38d4f9374adb927918166b21c74913eca3c74118e662160e8347da56b9fd6fe99dac63a96a0a01ae6a1e381a73bb124869710279ba323503676bcc1251e1e6703ec9e85c3635beb7bcdc045ee51c0e001181ae700d668647b6772ca0fc950bde1b962190cc935143a145fd755054bc1231edd493643126580b08a2fb2b781cdb8b9b954e31d1ce1c7ddf6c30b665a4685f187f814055395df50122db27e4ecc482f40bf1a58f5a8d5cdcbaca3be12b637b71e41037ad6a6ca7edbfca626d742e8891ad6d1c3c2c7e9a2c98349921753e78288e20def0576a1888ffd59fc6c4e57364c43020bb373d0445fe14d9322e23a1de58080f9632ceb57d1e0beda4898317d5db2d6641dc9af10da1e78c2751ba5b51b0aa7ee1496dc41fa1a268a481980aa251bde11cd56fa14ff24ced58ddbe33e54674333b69a4b2e23c9db94018dd14a61d055c4b683c155337ee6fc380db507178b5febed59a05be00c3ffd0148b69e2d69d8c99dd9acdafa878c2cd000370d09efceefab9f075ede159485d3536658ada15ad3ad11ee57f01c96709ee02b26accd699faa321889d175a6741a58020bd8a9cb7a63ed6ae125965ffc97057efad0e551107f492356cb8ab212e7d3084b295525c3a8692ce943171eba2855e50b981e9cb30ce8ab22b072f62df474aff1a5b44e928fea3cfddbc292dc91a996867a23a6e3cff947668978535062b33701771aa87aca7bb1b6e7280b90822f361366ceae45c504d8d30e2198193b01f5ebea5abd19d7d79c4dfc1b7369fcb14f1ae05f5ac14b0cbb3d8dd5add0f506bf0bd0d60bde5ab470a871c717046500a45f4fc885017434a2c42708306e6b7d14e92af65a11e257da280bb41fd154793c903b392a3ce12a9853c02c3b5cad3019d32d71093197da5b6653bb7dba90d9e27f62ff4ff58c790dbe8f8e8e68c90b260c670a2bc01b19cab53f94a91f0556d832f5a7454c5cd5d1e401feece89ea046c5fc2b20865c1b6a32d9000a286db83bf8ca4a35189f2b3c2af2b31aa24fe5d71f3506817ee551475c9cabe668fde3e28e1c91d910ea08163a3276bf5591fe294f9a36206d8ed6a123378bf7228a79c05b1448b286856025f091183f41507208abaebac280e6edf828429a1fe7e5a889c1930481571678b82e15ba1554f71a25151591aa8a0578f06e732a7f20982598c06cfd2958252b9025174ac986cfaf35c193c74dc3ba523cd0e72a4d36def94af62d42da754996a823ebd6aa22bbf47927c2a6e60a98144eb23797c0073d9e9ea5ac1ddc2d0a2838b8912e82242e77450a8b79aba01394dc4126e948bc808aff7c07c081ff28bf821fd19a660db88e2ac754b755dece8cd67330c6e0a1d634f2445d3f4b078ad614d960796ea12ccbf8d752a89e9777bfbeaab41fade4fa759601712182c4d10a2a9031ea36a57ac146b2272cba79857ab8a0e032ef2c0d52a8633304ce5905dacdf0a18bfea83e781e6ee1a1328103aeaa2645dd8a4016283cb1227bc5fc958ea68a874e90089218de4db70f60931d8a2c46c79f5bf04d217a766cef59f59c29f8c3ec3527cc80c71a2ea7f2c133e297d5b440fce28d7fe66393f9e0611a32203e194a8cfb2b19c16fbc024e58f9b8971a26b36074ab85c1053b686756eda4cae85874b9df112160f640571cc8341fc96c3c501c9fb1c280ffb0fa3ec36286916aedf61b3dae4b459a978e510127898157b3c86d209fa6d12f73c88ec06f07c8391c2f1879263d09c7ec6b2caec6f04edce1edd409e0dc594e730ac6776da81d4b054abc94b5beea8d751336caa5b636ab8e40d31176b2f2f85012efc47e20baeffca04c62decc2698e1dac14f3e0a58d7456e3d2db393efb2f6ae286c0bbe089cccbd0c7499d6a49345e7cdae5f466423a497c3c3d7212c68603d5213fd255be703fac3119d031f7bcb70eaa3278c7a3cec8e4cdff640d0a5212feb5d175a7aca6c3042e71ed4d0d219e6570a901226c1b0a3bc25de01886cfa482cf470879557fd06700c1f3d4e90b0f8984eea3d9127d6f9e7d5f783068d7108296329b04914a537eb6f428c8b599e19387f919c79f0f8e01661eed53fa799f75dc99bfe64d5908b689bb3daa03bdc5f1dab4b9baf80d0d22ede36b4be93e1e724d56cb0a185045484bd0a351d80e4e400c40195d287a5bc368b1eea1622f43836d4029f31ca23ce27567b4d82605da006220026456352a1304663036517514eff8d336a3530f25bd5a3a532ad61c32ba8639eaa93e6eaef8973ef3b20583c9dec9bbbe4cac2379095b36c79d55f964f7c1a2928e9982fb5dfd21d5ddc649e55d79323889609ce3ab9892269de9a0c922782c7b13d032f406202b124b2d0a1bd694169f1971725787a658713f1d5d0c4d52df66a5f0901af0603f49013c4b1cf69e4c8db9c06cfc0664b3bd01812d76f10a98f0c144525b11784c9cf9a0cd243606fbc68ef5f5a285da380460d8f4787bcd9cd82df8f539cc574356c4b1ebefda246e3425d58b29872ba4c9ba1a0b602c16d63a75cb84a88605a05f5cf3a9b21119596031a4e24bc7e33021295ba6c022222f31a0d48646c3cddf27be23a9c89c994d03021d0016372dd6998b260a636ba4ac6eb1ef2fd6329da4ddef69ab42c3c5de12f2a5a35c801dceaa38ac8a18065c49f7dafd29bc1e2d49441c54f4fc0258249c250eed3acee1958b8abeee64573738e96d0b7b69c2a7c0fcc89bb69538277c9ec76c7c723c7cf1c90075f3578a25e20bfc4c27593ce4687554189806accbfe8669dcaafa871072ac84d3918dfee84b878a79aef7ee9210c565d62ad48a0e4dafae0136abbdf4a48b083d82e9ab4245e1136eb026cc1e9e784dad0933340b75ee4579fe94432fd659107acae17337454e1488ef103defd2eb4ca4e6ff9d6165eba53d3c48415fe2c6a2d5d507fa53beded45dc65585a74ef4b6451a051d8cad7d865192064d289743083a224bff64702fcc323ad716257328b172861b9ec86e1eaa20f212e31def9be0e79757ed75609add853775890b62b3f89f8ac55a7b254462e26bd293b00549f7c5c4fb360cad29da9d2ba39b6bef041bcb224cb923638f7a9bcb0048225382bdda6d4fa8fd0238e6ba2a7561d273b12aa770d5b930c7e7ea549524bcc899af2aa243232df7608e712ff6ec7121645272618d67bf99ab7f26f2459e1e017fa96c46c4669ddbe6153e72d56d4f6a4bfa81b7b20954f9f1fcdfd588e5bc75ecd35c70398ddc5fa0352041d48dba7580d711fcc9024cd1d9db7a8dc997ab2a054fab250fbdc115bafb5f43a10beb16657dd69efec0d760a3dc82656bc361aaacbfb7c5325bd078eb09d7bacbbba8f472dff24999f73ef32d5f8f61b67ef0fd000bc525f38d22f2571a7780bb7c37d5781d65204a8757e9b6ec05f95aecc5abc9beaf948af45909a9a3858be4e5e67f198b995a03cce8163f55708856ffa4f64cb19f698d1adcd7b315831bc9ba17bd7a4ca5801b982e679b905026b4dda98fcf8f657a44e5fff7ad33b6a985d6c96a6f0c25aea32200ea1722eb116cda658a1f5a3e325b4fc65c08984b886f5d822d60b3bb17dfe97309842c97c6d5f388ee7f8c9b2768a997855c73bfc1b3f570447a9536339fd2ee17946e6bef6d430989a04125232a5ff3b7ffc648953122a1d64d7c0964263e26845c36080b7b8a5c8bc9ef1ed30b0d2992100e34530c690459381c67dd0504a2abded4c39703796568179fed1d35f8e1ec067a61a7f58ec0c69d172795fc2259fba7da4509503a0fc83b07f96c7b8b564b5d9505a152eef1ccb9f1e9ac56a4e2935306cdce0d0e18ea00fe86b952f5cf262111cf2412b5e430a27fc63722544f32147dfdc8b4c1144db3d82fe6abf7384bdd829599c3db011690420ea4d947b602593907a0761cb886c3f4b232790aaa274d18205f9a4a2ebe7ebea660715320a126d1a78244ec9c8b486b9d73209bd863fefa91ea32b85a9650ba3347ef040bedc277e6bc5a63fcea24df3d6c96fbe613da1ad6cf77765d162cda83a989820b18a39435ac11190a04fbf683294fe06fe7b450daa622d8180e67e7d7ee09f52d2754e2866f091488560b7b404eefa9b32da9f23b3e7d151b22a01832363623100f7d043f2a0ac418d84dc0a7cd450622ddca11f9bfba739309b1ca97c935badd37fa7c1de84ab752dcdda39a37cef2c8c9c625b1481ba7d5666526ffbaf08344cc43a26273b4a92bd1392af9bc42cd14efd58dc91d6cc6f5514dff15c5a2a93bbe59cd003a4bb0c267b8a11e1ed8561f16cf1f94057296f811501c6707e690afa07b61a3201210a7afcd0db04777338635c84679e262169563dc14bcfc4b7205731e98287b1d0053df4a54a1b94c3e5abc5adb881a61e8296aaed357feeab82a44ac596f521b06e8fb52425528672e08e9bd9cc1aa8f534106335b15687b853fc15cad6cfe6271379f952f41059773330e8b1884439ea519ea0323007bcde51d36b70b94c910f1705277d2acd16ec81cf3717d247d842a48929df91ddf3c925ec5fcd57555d0af1c22e787dffc7ff6f0235c4ec496e9d4c859d88911bf8c1322f5c29aa3ce851d3ad7d850437c16fd65747e2fed6285aa68519b9bd3d070e3dc48ebb4bbd11faf191bac8501789088f27541bb7958d004775f5f6e4b2f507082915b0812fb71a8342f5332daf767033a75d3e10a7c8939c77266757c8f22fb33903658e03833f5cd51fac21b51ba1429d32a4d1f1aaa9d28d54c3ad5b5172e06b150312d3a8efb5b228877a30f7f76a965f28f39ba8f1472a14c4d0b9a6fbd0bc4226c7f864da90e51ef1a285bb0de66b30bdee34e89021b905ab48d26590fa6fa532215779c5a45710596e9f09feae82796c505ecc3c30b6f8fdfbc73ee568c01d201a2a2384ac2a35fb32c5696f97ae08cbf5e77a0fa1a5dafab6950649990555e33159e25a5739ea086b324d39eec76f24ad4c6068c684feebc15e2791df19521b02cdd59408e59e8a35956d063a295bbb200c448d6371ec41777a80cda9874dd4c74e9dd01dda875a53789f78733852936c33f689be47692b805b8698241fea8c4d00abb14150a212a2b687a4c0ad46a8efc4880a54fbb8480a9f06dd6dbb01cefdabe1e508b1e3b898451225c49819cbce815c42451f83e503784e83d678ab777214661d26a279927acfc9988d2e18fd95d1aee8c573d417ae262a20f2327ca127968489ee581818e493f93903d7c7112af476c1d48f673359deb96288b0642d841f8ae88406b2a2e05b8de44733fe56125e26cdeb9550e2f5089b64a7be809032684304d85c6aa6bd0a19511cac79a0a5d96ce006c0c044f16dff59fc8e19f5cf559f0248d031c0b5e47a499a41fc8ce33b131b78500cb9358ba7b5de3af38955ec3cea2836887ed673732ac16f007d13568d9e9332e75b0913185a6f4ad48d0aa4814b60df013eae193509cd60fa783426785b4255e98d7e928cd8b41e189fd5f2c4bb8cc7b497ec286ebb8f7832274086bdeea8d66990ae9de9cee2b3e0769ff8762ff32796bc96b2fcd41a2f5a49068684fd530bb0a08b428b11c4e3addabdfd5b258a04bfe51eb2336a9f3030ae47714bcac26c20480d97915a705673c46de58ce8783a6a4c38510d6bab4957e434ec350ecc1763710e8be460351c4049bfe876e9a9408515f8347c8e39351f5575e00e13ed4f893925c65064fe260710066dc1bf020f74597a1e2de87648896db04bb969a5a9fcfbaa9b62cf8879bc56c9a30d96ba7950fc940ec9914260291eac414a0d5b8b5176a7ae2efaf7be17f065649ef6823c8a6cd5233515bb4c474d3ec4add7cd42c22870f5537a190a660328b13bd83f93ebc9f379b25c3f743a5cfd557930d45e03f8f426833a85c36cd5e2cd37dbab582d08b8b8f28648310b4b47c084128f4e2f30168b27485813f69798482ceb9e08c2a62511a88cecd8aeecc1b06115b2d1293d609319e511a99ec607fa256a2c9206114075d82b3f10a2ba4c0dbbb24c95a415e986c383b5a608f15494222a8550e5656fd36c2fdc69822469e154bc4a565d5c39a3f3868b89f0cda1172982e1784144651a7439ae32a3ba980def3d86d57452f112484a6c860cfc147de5d2932923792fc19bd464b0ae89021d9b8c9c1b95381e8d2f35c8ec5a53c82c60573f93f64cf51957f029f3d99ff94f7393a1225e482082ea1cfeef3aae9938a23ded96953eee4f3868c33f06ff8813c495158a6b5385c9999e06a9d391ca392bd20e1e88d689a634491a7151956064cd7cee4bf9ecefe6f8f5648ae7cec2278ae76ad6a1492fc222e0077412459d18d6533f9281970cc220b150ca0e6547ac85cdc133296c35e624d114a8f1f44d9ff47905e1164aa6fb54b2827dc9d40b18b84d0b4dd9a56cd6bd0f012f462a9f76e78f16a29840db216d268314088496a4f4890885423c88224d47cccfc7e43a7317a5b2abae7d603bdffe232fbfbfef23c24d6a9143203628537a75123e908011a53239e1942189434342882eaa8165e753cbfee86c63208d7eae1003a2ac323154dd735ac83391fe2aed361bfe591227ce8629cdf2b0722df0b00afe8df8ad7098e31438dd3e7b9a6169302a3e728b62273abb8d202d690f8cb2900d9e59f85588ed4294e1e32e98479f14138be9b61ded19e57ceca597e67735619dc0550e6fef43d2b9354f99ab88c0a6ff93daa29731247a9474b08ac7be663f74b7725fc352a7ed757e8c9d1f867fdc248aa3952eddc547318ed2d6449587ffadd8bb2fa42d7875ddcd3750f120f0cd43e0d6a85472a7504083a310b2f6e9c65af60d66bcb7ab17ab2edacda3a2ed8c405b30c8591845baf43f01ffb10f9f7bd745c3ed8aa7ee140232bdbe48fc4af335413d93e649b14963c532de96c03e1a79dad415ca8907eefcefa7ab15740104b78b538ec5bb2243b7ed26b9889f08e535492d1aaf5aa7b2a90baca078fcb84557a539edf5e54c7141e0312736237c151653897ee481fce1f548e5e580879377abecc18c882697a5775c0e914b55e9f7b9e6f75b46dca64070d75e83a31a83e11b5bef63a0fd59e81b56cc80038ffa18747ce862cc3e532953196d233642f0f296f0574d83b4b4ae39404321df1f47325e84f7444ce86b222dd1da34c1b2a6fe83e48508f58a3f5e14675be470a2deb4db01553c84688bd904b4e74ed59b33f8bfa9ca6c267080286c306720f3c1f3e92288b3faaf171af1701b323e28565e26df74a42301a8be568dc0d0166a47704fd78f6d5eb64b85a0655d6f1cdfed809f56ff91496fe3d19fba1195f1d05d2e15d09af310f5c849c9f4c06c2d42c84c9f0f3f08ee073007bf370b13e1b432f3884e55a254c980b06f0ffc1545414b907c3ba80c1adc2305dc4d13ee8c51c509807630e695a02bac5093d13d69757fb99f8dd7c48ef108d550f6e757c6bf67b28be7f518c1b201334712a85aec3471e08fbca221372186c7945f0561d1a32f6e3d34b5dd4e79f9e9d52607d24b6b0833589c7c2087178b226224642908c4691b3da4efeb56b16c586154e5a1a95ea1958c0da2ad59a77349eafbd1c317e280a43f35eb07186eb86024c31ddcd162e364f373b8cfa0136538fc436149166b8bd504805dd7967840063871072f8f258301e4f3cd6fd3b8c9588fee3fbb91c008d27c536c9cb7052cd26fdf018274452e490d7149446fe9a58ccdf39d49cc2a16756370bda5cd3d9c3e0228c2e17c948dc5f49b3d81f1ffdc159985c45d7debc7970f1a00fb20073ce364333167dcce5f3a8c2ee5a1d7e94e69798d47851a7e5b197c32ad35be097168be7b946fe03d30b3990abf889c101e17055d8c6374809bf16b45a0f7678729dcc5ee905004cfd4d860c9a954d4f20a53a8959f8b3c44866b858e6c5881386b94a53ef33b432ce82955a355ea0b36b329ae2e731ed6cd5f9cd74973fe4bcc76fe94a542d006e0ffc993bf76c49ca199ab855e2c450e9b5a88090645fb5cb5ee130a3e82ff523266ea88267a8249a933f025f010b0780ea7f4bbae8ac62fa6eb94455879b3436674c2a0dc69962c71de2f0e5c742ec903d73d15e312880cd03da7890b7c68c2e6395011c48c70e07fa2193230d3a565f663f18caa574625fe8a7e3a584133e04cfd1dbf49b4a1dfe6666f3348e0172d852f97c66583b1ab8fdf9a38f1297eb0d393ba52bfa0107f7f58a59524acb4cb240f4d3f5c8393946e94e0402e2c4b92593b2fbaa0a427cb56b56d10af30d6f094eed88f727ea13249d0465711664810a60e01a5e7d62a6d7baa0e465e157a7d82f46c650ab85ea5b11242dad7a674e871aaaa0983530700a6356b7fa636404109292e6db063900df1d2d308de276ce8516db2c8602305c587f8f89678127e7f8be4e01f8a1b09217b958d9d6b6035a25bc5579d090d4c62516f0b66f39888909b325b9213c3dd113b917617c5aa81f0d68e47251dbfcc0021bbbb910686861063e9469d3ec11ea5cd27fe82750129a30c2cf74e48e96f3313ba9a95a9374be37a95edaff2c4ba3fb7ebf1022f734f5b5f4830b292a748ca41266e9ab0e90cb4ea4c0fee740bb44b9f27772115cd7398b3e10c52bd8c392ff15f5677ad1ded937d9be5d4118323a9b7549498c585ed84c7979db0d4657235afd23b412754c3f4d1b15c50a7ef978318dd64945db8a194b73115fa7e6df7866954600b279d588b771e0dc68358a03bc5460130211ee2ed69c92f23e9c3e0488e3d11dc52d5ecb23687a8a6cca36e9b3503c1266bf8d42189a2f9c84dc14078544f86873ed86c3c0d31cb233cfa80e6a54ec32399d33fbfb7b9aceb7bf0ddc94bf80556dccd23b423ea33d62e31a429879699de2c61eb4074b3332207653a9a8804329e150890987fe373fd0e01b2de141483fdf1a1e3e11bf0147e7a87fa0df77035fa8eddc524d3a451ea013345a02a055c406ad1a324634cf1486218218bd4b3c4886f49c15a8402e1c1a5a0a2a6f67d46c9ce42317c6f3f1ea7c08b552862a149d9d5917ca64ff13c66e85704fe6de7e07932fe6d4fa6d58c8cfcb00c52b9cea4c73334730420e05001d7e4ccccec47dcb10baf928765d17ab1c4a806a0450cc3b194cd391c739bc4bc0f19782f47f29622cd9f95b2da1e3ad8a0052bf4f0013cc3cb99eb21716007abb27327ac665889f3eb124692c802c64e9f10f293d9c620fe01e4af983183dbd55817d2cdf7ec5137dcc115939b3ccac642f0a0af5b4f41e02e3b4c419196464da4142b1193f057d59d13750742d1436be8053882651abe9d8ba68f3149330c0482e743dcb23972de8644a83d736cc15f99f8da99f2379d8648f2b53c719610178479f0bf0c5829e67e22350d153bd7b1c1e6e6cfb6d4a5b81cf3cf7492ddb9ab11ad0ed3aa8b6adc4bebc7608eb3cb79f4c03cc36012ac6602d546010a9e9e73900081921e3ffa53201989880240a83e913ca1520fcbb611a191018a10010fe6fdb4040a40cde4efc41b22b6db85186bf68179d6e8752f887e4c1741f87a6ea27b4c9a6a5399fe786b69449eeed16bb02ca02c102dd0ac43e19cad8ec2c84c645a1870eec8cf6303a1083ddc09509c1b94a99db9b32aa43dcc5c163508fe958120799fbffeff4ca2036f06dc419fe908233498ef1586fdb9c7327eb3f39feff4f6245b8a66f9c73cd763ceecb0fd5b5edb787ecbd7739aba3c3d721f1e5165f7b1761dd5e03645459708c2d57cf2aafb4caab4b85eb6c39c42cdac004526cb76d9ebbd1db916bf6aecbcd1ecb4fc922b1f42d2746ca21ac24675eb2ca1c12265a615c5e30b9c85b0877a9e33669e306f4ad3fe79c732d65105b9386ea8e3e5c3fb032c8f3b8b2138020dfe8de7bef1fdb6b13291226e53d1d0ad31eaa6a6134e2342c8714bddd73f7ef8099af0861f7250966ed71def1ff0f04bedd649c35d5e8e4e008811e19f16c108ded2022e79c97dd80315039a35fa127e0af8594a69ac95368269479ea64a4db846b7b18690fe31130ba9c467db84c8d21c5cd18584fd410262b7138c46067101b4d3dfa74fe5984907db933173b3e23a611933555935adb1ba92710ca9fe7746d49f853b54adbd8263ef07f7e95438642e9f0b89f1a75e9ff316b650f261f31da023f5051b26f18f2b9245a7174220a7f4abbe4f8ff3f223d92a1fab21225529631a73334556a16553581c26cc6a9c6db24ff7c3be28476816b350ecd7059512602d712ca8aee11699232f46ab8edcbfeff7f97b76ff3f6857ea8e9ffff8f857268f0dcedbd77edd10c62a3754bf557a7627979948bf053b7280cecc54f082a414c35c1b29619bbc48ce51c4b002b4e55071373185106b18d842169dd9887109fa3e98e73ce39a777103a161344554336030dca9345b80c1b9b41b4e3bbc769b6cd8d9919a3222388cbbb13e56524a55d6a614c01258b7049ebc6bcb69b1ebadcccd63a50d57e775d0e216689db1d17a1414e6bbab802d69c680731b187cc14033119003cefd5439785fb769fdc35b757881d4b7bdb7bef3da4b8fd97b97137f4de67310d02325b6606df6e26fea3fedd01e630ff7e02873c85b3c78d7ab8e3bf9b9ae8facf4310bfb6e69dbc8a1d7bef3d3b83d87aef58c994df1dd93b27ebf36df39a0878d487563e549a456840be8d4f9d8c7bef5d0c4a06b18959d1ba11c084a25f51d3a8b037ab41f245d3c422b48d244e5b9a003e4203db09f0d5789dc8c8de7bef50539b29ec889dda2316d39a8fea8b2f9518261d6db530f1ba136bd79d5db862d5f99493e7979f9517740cebf312ad951e108027ab864c926525280684b5074326c191738e3678cc938b050ca5ac284b48d88576672bec2df1ac31383b05ceab08956b35c0aa3e9717469f1d1f4277fca3c6e96a0d4f88905036b1f7843153c29d15e61496d2ecc5d6d50f698b6cc7374c9c150014d90ef3290a9545a521b9ebcb27d3891331c0fd32361ca48c5dde7e78d472d2ba3c5fdf162e3125358e8c50c5330e54a7148eedb26dd8bfd6563612407ceb8170467e323bfc8067189aaaa185c74a5a48cd2cbc20665031a5d4955552bb74768b4c0405f667a1e26114d9126e1b53b42b8a880a4a43c760a6901595d2ba596162c3db2c25b2bbde37c400e7743d8654ddf49a89b819d8ff3fd8f676fbfff898e48a19e09c734e026b7bbbd5b0e09e852d558f5c5be38e57b73adba79427211ca6a5bd92a4ceb30f0aa1f12834b4b17d9a6ca93009e37d9faae8f2d8c3e34c5c63f9ffdf849d416c34ff4de227bb9535d4945c4e665a0cd611ab066b46f70575cce7c016763022e75bade01514ab157a8145b9d07a368f532654aead625b0983f43e80627cc5bf7c414e602b54ca70172b065153ce958a8d828673ce7d7a223e401deeffff6b5aaae685ac71e2fac698923afd7e4968bf1fefa75ad0ddefa00d4c83da04c3d0b07d999e55777d58c27559b39a32b9bc9d325bd93483804ca8c05793a0aaa26b0a9f13c1b59f7d62c48c89183ee215f68584a798cc928f876c660c66a3c8f5128e11c55a124e540821a18bd9114c8f0e2f5cc9434657c60c1c95d763d93a02be110bfdffff0067101b3d74d3c1d351d5e2c805cb128a198322ad52e33e19317572c8af19d3c06d6ed79bae434e96ba5967c7246400516002b14133195e972951c95fa5d810c3ca6ab1120dd93037ceffff9f00630cec598442339a1ad282b1e29712a55a3ed22db794bbdd76cd7228887c6989c27281a9c9f21aac7ad815541c8a028b12db4a9e69950601d9c939e755d9db4dd6729d386bd12a22cedab0b98e30232f2c49eb6afaffff49e862cc831c61053e777c4c3e2ad73e62b0052c33265634dfa9aa0b788aaa50907c952cf78dadd9b19447ca809cf3ad98012e5895d70b48a5528267870b2b48050a74db1c6d59c8ace58e4fb372f8ffffff8767101bdd3fc7c3144096c65664c75c25d4a648b52e1dae947afe79928cdd7fee2c443c837b39feff85353df59afd8fc5b19a92e6cfaa1931deb65c69447befbd932d9f47d6d4e59a20e4162386cb598b73edd4d1da4b3245d4c98385d3a43ed14adc48ede4d39d73cebb5a64109b31a9e3c3a293e89af6be819754ada3699aa6b91c7665629242caa2c1f4fc14457f9e485ecc5c5df5ea55b763d7e8bec606586fcd8aab24d85480d6040a78689d91c6e352e78e6f9aae02acab37f1f725e2909fbdd97bdf39b9a6f73322626e06295f309c911f624b4f4e463b62f74f4b5da5b0fc4b9072369580cda445b5e677e924054544eab055fca8348a385ed99573126f0357dfa49ea41419a813e03e49015123a160c9d9aa2ad1b4914fb34c2e698ea7ab6d04092aedbd07771d00b294183516a592e9c609a8c6d7e3ee9c18410d6b2899dc9ef9a02faf51f6850c3c2bf9008148624316651b77dcf85ebfe69a03ec3af7a8ebad8bec2ebbcd2eb47bd4bd76b174efbd772f052ac239acc63786ea6a4739add8a7c79504388a852899bd840b2410bc4086e9dc1aa893e7e66e6645a2c81ac686507a3e1e27a4ee620015487e6a30365c9dcb9d44d23378dbc07ac789b1c99a39063d535690667f325a4889cb4d1403151dedf8c7e6263439498dbe5fca359907eac66946486d6a0f7d301cca3f1e50b25a572b8b5636e243a3ac820cca6bdc2a3962a5a39b16d5b0e1bffed8311e5f40dc83b33db66ac61cac9f55b59ed2c692552a74f94cf4d0444956783b4c670b6de4703ee122205c3316116efbffd756b14c0e6a29a2652b77756ac051aa649520d9b9f628739e5cd0823c36f416838c802aa55d79aaa1a9b2e2f42b533712925c67dd24199e951df47151194f55c7a0bce22ace39e7f4ae8ac3ce5e7d4111aa85f4ff9fade9ffff3fe1b0d9889f6b2b4e06588ac150dcfcffbfac6914a654890c16d78e782b7cd8852d77d895530f56f14c39c3db405fd6c4950d6d6812819c73ce390f7981d2bb82a8710acda854f185016fc0a4d5625adc9cf00b116aff6485676f4701c21def92531a48e2b2114bef61562e6e0da085227befdc2662d48c6aeafd0049a95c6d4970005391cbd912571a0c6ffb346baccbb319af700827b0693b5098b52523a8519480fd9c91b82d18284e843a69e1133fc3ef0ae32bcd9835b1c3fb2504db199440d8fcff9760f7ffff5ffdffffdf374321e218ca6138b7f49fdb5b7ac300ddd2a19ab24123d20c954bb26030480310ba6d4942a22e69a8d6d5d4241fde7be75b9cc80f392f6531a1d8762ad6dd787a9de687dd12e7a39b7d2f21b8ced68308b7a3b46137e32dd2ffd3ffff5c2adc1c45af9245d48428fc43031bd3dee781856f761b85a1d104b35770dd9cd3f9ffffff08145bd32b33b83ac5a636f4927191c8bc6a5ec8b2524a757550bc78704ec0790538cb0f04c3fca3eef9e63f6e9ea5e49aeebd6efa62e8103b1fc0326b7140b32682c7e683e27c6a1c34cfa917369a345b74578a26bd37450553b44d45dfbdc39c6d337f8a82d83a5539b96f9501760e876d03608e76ddd3c652eff1776fef018d21a8d48f767d3300c403b318080400c44018c9034d11e50314800315b488ac843438303c3c240e06c36040101006080001200008060340814020082687c88a81d9004b7892e68b6ff32ca233a401574e9cbdb25ac87aac7a9c21a03282d12944e83a9fc24a51229be433fce0d89646b189f012a5a2f16c622ced673669784eec24c0b1b6bde025317cf510454dcaaae98b684312a9dd408b9448143ca452b3c0d2f4c66ce153d40b5b1c328c1544349f36478e889c4f550b351d0b1d0506b1a2a0a23b5bf079f7294e80ab1375bff77fead98d6fbbd32785fb34c1c88cb1d7832b8586bced0411dd7c0cca60a1c6e007e8a5a22e5a6326973b47854815fd6a5de5202ffc56c363f431f6ab1ce4895a02312848138f9362e39ccda71b15bee048c3a8130b3c73c5d84656ebec0431ad06dc409fca8aba16e5ce3c68dd0466ff8d747c1c2f243b9b423401a6e5290728d174f7d1a1bebd90a06fe82816f2dd31a5be458573851e407c60da24a33a3921cfd8d621fd7efb74b1fbfb2f6a2f092f0b2229e14831a9d21d242f8b4805b17e2767a9de813c8d1c4910c5692f9fe23a189f24a22a913bd8837d59ba9f8f9b97e5b955bf9c9734442ea94c84a79b9045b8d82da8a0dd2d820905a278f718bf2c3f0a985df55480699d0401a021b34ba93e84f7c06ab3faba66f71835b81cf6b2b30ccb6183712b44998c9f6b4233a114c2cc7acc9d4150d413abf13900808a8ad5b86a946040ad26a9974db9c26500a338fd221a9f1e2243a35ea4a56645642638ce0e4721f55c5e648e3e05289f5844c926364a16dca6ac4b1900e253e5cdb1c854c4dca11bbc85bcc20b82f9bb3a3778714cacbedd8dc8420d747e034b44f60f2a72e61079bf7e1da036530929299839dc8dff3f4f84b572fb991bf5dc2a5b146bdfc4d8523e418256ca1ee5f1862950e6c896a609e2f9a36f31b9448433e0fe43e83a20b709f0d8e37a57de666a4c73a3419a0319e6499ddcd5590c2bfa8bc7ee611046539002dc5ef79911baa20a8e2770fd54897d4413bba0112bba4cf35a652fb31c8594d8f068df5c64bea435cabee2dd01ce1cc825e2a1c1ca1a2bca4073db489e81231fd43fe4449f74fc1974b8806dca4c153541741bc2edaa5081fd46d1a1431950d2011d54cef26693fbac08ecb4d310f14e09f73cbd26adb9f28d5172ddec7614d23cd22da423a8ad1eb1aaa62c21bc1528eff46bb4fd396a3d3f53e70922844c025322d57d3b4a14859812c9651148e2d2b0133df606ee2f3ed7c48046816aef724632035e48f3f25823ff1068664881129da7009641796fe6edc395bb75289c2643ea60e2d501fd66b91198b8b14771e2cd93e5e493c4f8a7fa00299259edaf1c1062a37d234d00d2f5a6164610175eed87d9b5e157b306b8da8badc48f10032805e6970bc654692380a23719e4d2acaebed1fb8c9b0cb236d4a8365ad56072d74ab6baa84183d17455ebe50dbf2e111fab084ddb7968cd8a5a0699070748f4372493366f2b3aeab52aa514c04807fd32cd11294c3e42c43b03640ad413bd0aa6a21bf8a3a6feb2cbe05458a57aae6eaaa26c962aaf62d273122f5a18a2ef8be1988174de4ddf22c6bbe7919ee1a07b3361a4f2c64b22d972659b2d30750de21e2f47870b818a0db48d6b892fb7aa8db9b17019b72ae2f9869558c1ab69f1fa868d44a5c227e4e3a07cd8c191c85f5a264c9c41694f4b36a69ef0264e818c62e5c5ce4bdcc27b2e60e67aff0d17d17649fa2a7af302ac8f15afc9cc14009ee9a649ea5b81e2b8fe2410c8fbd71c03102491ad601e17b02b658e19e1ec11e0a822d1aca9d5d3fdbf94c5bb0e4f92b8132208fbada6b6ace7bb449f1aea33989aece1f28e521df3fd4a44f4595fc34dd82e17f54f27c7b291aa8f82b4bc9fec76db016ce9a6e4869b5a566c900c45953ac70e8b87791e413632cd8762fa5adda1862f78c35c8a3d33936845825454be6a77fafb61a922ac44f0b4eac4333962705fa1932ab3e6929b3659d95c127582d703fe67218d371981cf59b6f162c18ba2be9fe18797081de33e5e9cea3cc7c4f600f9b9710174368fbd3762d3bcf5596c10cf45ffa128887041c16273274a8745bb6fe8a9e6cc44fa70091629e3104ac06a3ea93d52833e358594ee14b4b82ee07d5f4cf963c5bb397c655e132c3ac6c30f792e999962bdc10c684862d560f43eae627b43d9245645a77fd48c98256d0cac7ee83d5e2a2b1d10653763c9f6c82cb807845ceb8bb9d4ac4f5753d2a6ed4111b1bf1dc871403868fc66e13041f2324114e33c8b5913a109b2872ca18a6c17018bbebf6bdf94b3cd73ee83c2427ac3adcedd417bcda125b429465ca2e63b8a81e8f97ec8bd84327768883e1187ff9dfcb55e04c66333407868cd9ced33b215ca31af490eec94634c8e5b8ebdbba5f573fc5fb5727334938cf78850c60a2c3312f7b9a9ddb0cd75c836d077a5b172890ca787a88dbdaee82e60b0c332ae8333df9259ff8819a61990ac8e716f5c2804d814815b7667b8ed87173e77fca0e1748907e272ba3236f21fd1c093ce7b9e351c4054bffc1c90ffbce9a85dd6062af5c75c67cff1a77d9a1db7ccb8aa048463a75c7b89469a4c62cbd82c3c4752d0b1b1826955801c56d2459996982720df1b1d75eb9d267753d23ede4789f04b2b9af258021a1ad2184ca83755186364fdaf9b2ebbcb52d40b4d10608be2327c2a34a6e04e862f7ac2ac6944e9b9e66d42e1564a4d615179f5d04adae7d27760b8cbf23b9b65648e162aa3b76db3cb72f9d9ead24c42dd61763f86f399e5413d4405a2c82c6383e823f1cc4f5f2c9cff3e3c51dec51a9da30adbfe5c19b208d0700ca87b2ec40377493826d42d858e274d3886136e9195636ab26b822e2015ed57c25a791ec35fb66d588ebb6c3df99693065e1e8430929ad402fe22ef6643f1d1890f628d152d7a3e0c655ca6a6e1e28e6adaefe6601e7a373dc2624ed5d9441d7d4a4a6a891dec10177150413c33e21739b4d75458134df60d1c453064988d065dd5fc4fb83cb0f59d3d024f33c01cb50b26980963212aec4a9208b0103e0c6630f81aae9937a8a6dda8a2a18cdb3b04913fa97f0f9358c0719ff577650a563026120629ebc5b679239b8e6bffebd45cea0ff9a0cf7edb56366e5e52eebec1e4e3c3456d4a91bbb617d5fd21f71354b409f9e00a0954249793522e7742f168b73bc0ad4a346eaf573086a56de51369c51f2b090d466d5cc0ad8d40c0487e8743238ed29830e4f30581a863a2e0843d160d04ed0c5fe7d5540879d1ce333a6d509dd9b944d6cad4e4f7557323642287a78a27f621ac3a105f4e8f052743923345f6281e41400a5240b6340a8724e1af63824044501854d62c560d6f842d03c630cebf84633c63f451d8fc3d1c7bb8db5d033c93e2863a22792c800116dc1efa1449d6e952f18a0ccd9c2e62b21dc2c70d03379d00f0cfd64f37eaf765ddec429d031dc5cb0272043a9b9b872f76d8b226028d069520495a64e08aa87a922a86bc299df72e7befe7eb6165217e2d3ff1da59fd13e16005889234a480ba3a83cf241b49a219a308bf7a790100e6a4eb72a41b779aad4699bea290f5e6e4a1f60f270f4feb4c8f54b353b807bc551a99600b28e648c7f41c8167afc60b2bcc99b5337f5f538dea09f239c2a25257a0a9410371bdb522f57d7882e91ee74ad01d6d1d0a13d552c7d111ce38878bd86156c674592d5c14aecf1cc6a99af9064ee5c448a49242fc27047e3ae0998518ea66c6ecb25827f3e3d7befdc64b016c1f1f4488cf1c93515513a78c7cf0c23139cb482da0b9f8ae47cdc188801f031fd857eac932da7dcd7715cbb562493554a7282c711cfc3a6de89994c58ec948222d1d9bfae130f4df8c0ae96509099db8e881aa3489d392fe1578acf5e7d7cebf6f5263d85203fd072a352e8cb2fe8995b56e65598b54eb20d55a25e699f86d0cb3313d04105c54208020ed87e2d8c35240913628f8b206046924def1c11683c69b5ac7203871a9c6602a9da37f7790365cbcf13bb5c583277a23ac39a849bdef6b1b9499842b2d116e8348e38b961d2ed4fb3871cf4292b8a43d3da9df6a6293ab8cb46f24e05f988ea42aff9aa350b27e9b978b04fb173f8a44cef6c1749fb26a3a18e98d27e1c1b798db7926e643dbdd8e31f7e74bb3296e8a435cb81d1a036cca8d04eeb0d62af2426e64543586409037a53888af18f69b50e0d41ae959b9d2f098fcfb5a6502454112890d078baa5d68bb4a8b8227d0f6aa32f6245725380722065413f7318089c8c7f5ca16d0a4dffec0a88b65e203cc72940d2ad5e7c016b6061ee0731e10e34d27cd85e31f4784ffd6450b839fca3cc5a79b1c29ebcb0427655c074a7912d30b153959a311a1ed3f1d71d321d781ba911c865c7fae6427b5e38b0b70204538d439f22476080aa8c0a5c1e4b7e73fa085ccbc639294ec49123e529592d8b291a09022f003f7c85d9185e407ea848fc87501aa13ca4261d832f4052c4f9fe3d9296adc931660964580978fcc17e8c7f492de27c668ec7e9192f11eb47fe239be02a7e185ad48a30254954e0203c39a06028ffae69a0065c8109cb04d90dbf94564917efd4f249c687d37f321bb8e89cf04727c33580ff74c394e6616e7ae9890c918dea8e7c250b2c85ef70d443f24cc630bb4b9061a8fbf2a19cb89911ad099d6ed4555926ed648b5d117592b2246ac6b0833b14840b763b6d2e49ec5641cbd58f6e63de7dbcd55fa49322df99798b66811dbd3f39b80089bdc4f7ed898c120300cd65b098cc361b4a28f8595ed45e88cc0b882b4601848dfca70fa7c7d9249d689a7177b3fe20a00cabe1c2ceef3c2b0261b30d620b79adc79dcfa48866bd521890f83cc1a5a0cb0d4319bdfe854bb12efa800cced284419099dff07840a2e6e584f11c1ffc6220a59bb9dc3e1a2b4ebd9de3e922c2e7147776f1af89929c9a88fdf896fae040063b1f3c6c3e4702e31b32e64b078282084e6ccfce4d904299089c532db8c7740119a459aed7870e9f5f3f2558c8e5c0b80b47838cf848ece8971347e651193a7d446c4b879deedfdf6ec08f25677a304724ae3e3d5c6ff94af6e562bb2dc4eb2ad6e1028d3442d93aaceb4a523061a8751c49f81f06caa1986a78d50039adf280218213d2850bc6f363d21c0cbfb70cd4db61ae90a7ea263e3694ed65b92d977c7355be5f4064c82ce2f42f103aded94785ee716bc3eca69b86ce396f045465bb5783019ef9dd325e18bb61271b0517368ad976953199a9cce42fe5e220761d0046eb2e7f877b9515250ebb8c7d558d929dc3c60ca0fa4d58cc4cbf58d785beb2780c97622b0040d565fea91fb14e70e380740219360c0680779f25a8fc139c298425dc96ebc3336476818252df5a72648f4ca153c40ce2ba749ecb0a2bef726250149327e6439f221b69a32ba1c33b24281c6f4413766da06907243a4df10ec811700aa5fb2bbed239a13557555f9ee168950821658bf84502d1a9c6d7c597b2d510bd35c7a2eb2b2cd19461ee13a176fb133400b4dfc6bb13d4443886c0222081f168048d3e3a3a2fd2da4374bf2c63a550725227c0409ff68451562a289aa812fbc310969460486254d68649c08f40befe4faff6c22c18464ed5d20b84534da15ad70be6c810b6dee0afbedd72ca9589c6c5f1074a3809b6f828f5ee50f5f89a8a14014c44d91b186d097c6f6db83d2884b07ebf6615b60ce4a7da53c2aa173867c3f01fcadb3698db343681b765f58fbd2e7d635270a6431cb893c7fdc01b824c38586090ac14da51ae45548979b92494190604b6a2a60d2ca31985c6c7fe39791a04fae0205ed93582369ba480b9c030ca53fd38e53b02dbd5438cca5b221578f949921a2adf3f0401c4ef34cca520c2925cf1fb52e22e737f426ce5488c4cc4d88671485455d03ddca93e0d947598a29e34af95b1ffa59909ab00819292c4222e2ef84726d815e410a50bfc2af8ec196a026c1012b16397a74498df975c013d956550f45c6d481f311db6140b0173b4b24ad46638f4c381871c7cbaa179b8b161baecc81774a8e726660e57977cf1d9889dae0ee14a772add93c4bf4188c76f88c5c6d0244602831308ccb708dcd177c5064c1e758126dc211484ce6bc7d66464b1c51afbfacb297ec8b4819fa768db583a72c32d678bd5c71fbcf191325fde71ba728c795634695ee646a7a366270d0aece502c23c9fee9b3412487d0b6ad7791a9819a2ce6da9233a20b44919346f7de9a0326a41e2b44ab6b53006b3deaae56db9d5126dd428f42e23f4429c3a17cadc115216761e240b0eb1eaa8200e93e7e8d4aae4e2cb92776c27f07b541b4fb8be97baf4f770e9e28b298ff02540d74aacb5bcbf4310094996e864bd69d919f86c90f9b39a3aac584b3202474846769378b85918b2d3c9b963c75197cfd9c94a4899d2ab54c61b58102c0455d02ae14de2df6a4b16157b3ef040355fc2176f86c2568a96b406696f308e8ac4b81e9d247b3f1d02a5df64dcbae3fbae5c022aac8892290dde1813ab4f74f196ff5f242243690f05d0c09223f03491c0bf391339f695e23981140fb157a4b7a4de2db870e3038f87b8e3da61ce1877c4aad8b52d8b031cd628909eaaca0a575ba97011f8d2e8581b5f626ad5a333da22a3d56c7a4985e7bc4748c548f2c6e70823f617c6400b9329a87df522a1eb71f6a3542e3cb71b233af4d3cf2749702a7ff40d64b21ba55b2850af5a649f67f6df8c93efa433092b421f2cedf4afd141dd21a445ac9ce2244d5e31303b556c1a02e646b0812f0db173ba4824865c695fd67b478c73c0acd5689ec03ac538448b36856e077b848740d72bf8edacb3d73d79fec4839d1998bf656e923ab70088318af0aec1672a5baece9738e830df0f7d8b2294dc7780234916b76992386d8e65e1e8be7314b8f2efde416b322241b59a3bbea4e8ba3da242c7df30aa876a5163029e0f227122723897344b1912e6dd3072c07ed0e624e23cf83f478ff02d81632b1c4ccceec7d05d0dd8d9fd3782cd9c599aaee6664ac4d2b2c9155a5c4280f518e7427b7b9b99e4b1deaab88ff4ea48658ee24f3bea8ec01683ca8e78456901ab1c746fea953cf46e1442b553359d21f97bce1e4de7efe00ab363751c7480ed133c67b43303f8d10e0c744f3758e345ad9e81a7339df68124a9e183242420372e30841d64687745b4934e1df6260a9184d2ebbe2561940da2c08c16cec52024a7937e5372d996a4729095c01f2fc0c02a10328bfbeb2c2150e44fc8bd8f683778704ddcd0481bd5dd33b745b0bea50cd07510483671b2c6a7b1cb2f8d6e201609d4879fc305b7c9bd869fc80b190c7df345c767907e6bc165bbe38473b8cc326d32d0df37172b50dcdff74377cd7d462e8e36b520dd00d9fd7303f3bf398e422318ae80635c98461488b727080cb42376a55270e61285e7cbc1a6e458b9e3bd4198b30f124a939113216c53d7765b298b70563c9de88b37adc6c24f1a186b5f1acde3dc673bd27e644689961226b0c2148a94404b2cf4d9dcd9db2dc26d15273dab6969a16d5acb99b019d56e90b1d3c0f6597cf4c39ee39ac71bb62eada7d56093636bc0a2f4eed30d8d6b5e33f37b93a7ff29fec7c0f66257ab170011f5f4913b5818dcafaa85da21ff1c3e4bc0e9c0282619e662007b26af72dc8faee68b64574fab6b57094d540896b51ce1193adbe85688938a36f56b48b2e49f496481668051e391635981dfdee04c39320262e0e76186783e5e4cd8771cad996a20e2f529fdcc94886820d4397bdf72ec43e28a842472385c0e3ebec541b7a716d3f2d66b760872ec9278814620360ad8211b7c43ea1ca6e480c8e62000d9252667d05e0ca53e3a8e05832025849e193b3194dbca864f66828fac6d182151a40a4cab1a25ae48c327f3795d115c001c3175856ef1260b9c8f7d24927f72ddceca2190b4b055a2c11390bb4ce8a34a91b6e63e364dbe65e6331d810edecba1ce1047cfd3ba5a05f18a7e40ff0296627b64cfddb1550e76857fe675f97e738a0d3cdb27c746c08a8342885c0bcf324126465bab36dd92e8341c091b4c5371e0341a3d98e561e47a4bce390c7130f0bd812687042874551f1593a4604c31d1311c093f19b59c4e7f4a49b010a163652c73492ebc02f30b5969bc3948e9120061d3ee4e69cb3a2e3895f0052820449408019de71f33b9000d2604398859d7db099ce0a8f96d44065af280ee09a0e8a49d9956bef3f49b9b1675cd77611806d655400a3b9f46c0fd75a00efe2f1cf5498067d550a2c88b716e96700f504bf6ed8494317fe28af0daab259e4cf13a30605c8d1dd04b2c1019d8461c4fa537f1d1e5c65d77f30d9be688d11375dd9a552fbf32b51a485248b84e28ad4723488c5ad945be417721d1531294cc4d7cc17de8db8c344f522b7d0fe3cb15ffb9f988a908724a39b35277394355c70ba937bd116e39e89932e352763135b427145a20ab2f0d882a0e5f349c70e99428a5e2c00ba48730c23b08e80404b145e696e41796262c1b3afb05372df764eb110df660c8ad1a3a54f9338eea2aac89c7cfca7a635842c9c7c692be25e0ebf56dbf8df28cd90a4b84a866a183ba5c556c07b4c623a6613b47274866ae12d62023d472dee8158907a47199f1391c1dd7ccff60281ecd88b5e8eb8e8234b2e4cae2c52d2ebdddbfd14bb5293903c63b5541f6c864ba5214b52ba97555980d4430cac5b4c4672a28e8cb0baaaf8766187b0a92b04029df9c076ad25b338e0a80f18a9792f1713b8e81d75e7f85a60faf267837baa2c61a981bcad46dd2f3d85893f57133130089f64c1437e398357a6a01436b74712a2e0843b9af0636a41901b02177045019ebb954fa5bb4848e1ad4db26c15fa84b2de35c454d279ada346aea4dacf10c3809a4d5a1124b09f762e235c6868aa500e2b35f5fe7d4aab3df3ec343907c659a10c22cb743830d9137fde32842102674991424187d59b2eff88d175e4d9d9136e48f5583ea5f0584917e30f4bbaef97b98e5601996589b74e49a687d90acd469a198f136f4b511e79bb292fde23aeb86b98f4cbe404776b5760894c8e61e112d22bbd9c901958306829af23ccba61090509489f9f74fcbd24d5d35b988cd3ffae2663fb7a2d8c8754ba491850fe46432eeac7600b254e93e26591a0217d95c8ab08f923c91e8e1b614fde1cadd45e1fa98fe1e4fcde0a321721ff55ff36556a1ca017a5c67e464bac34f1ad414968f847eda2f793d6d4c8e0a60558a2854acd31d9da0063824210bea28ce0ab7492a86feed13d6f56eca94814c6cac92d1d2ef25422703eb715d9db18ac7d4274906b0fa1d5f96888422118bb78d48a3585857ea51631122620d74290d969040980a42b11a5e75378ca1cbd88b3a71237583a6486488d6791246526638a904cedc548bd90f3f9cdc38be18fa617b5797bd6ad3291f92676f74dc098d39d15b74b823f3ddbe86c9d567ee1b52cdc45d48a9369c2a2eeb933046c30e705c872c3921b11685021aff86fa4ac98b0e8f12e1eea081edc51e6a53c345c9b3e4045c00ea3361ab0058031996935e20ba25627338f69c5cd3438a291e9901a4cc2ff939942fa8fece8d2bdcafdd537cbb5e9250fa85c31b5c0e48bd0fd34d28091d1082e59d89392438910b85e1ceda1c867c5930a48e832abd31c8af87738b1cc55af8df9ee173595d2b69ed76e26ea7c75e528886f6aed2403d86017e6cc023babd01eb30eff338a4e237ad03aba699e400aa9eb55d1411d93f270c2d2070c974e50c8509b398835c74a6235379c3849cc5cbfb89039922847c72c721068d6ce2c9500580a4320d181910912ae0b7a1fa36121ad21359c2101daa37c2552704c6d751430a4432c81e1274c3608672689c4270a4214e175bf05579c84f441749b403b290023511bd8b5640185c594a80d964c3c363c5e5a74507693df5c4f943cd2b928927bc69d65fe76cb94a4dc7b074e024a02330227482cb09f251ccd97a67a5d8ec3bdf756669116d6f1f4f5de7193b064e91967a020ff934926b2a498a8532cae495128792ec2944aa329238aa89e82feffff3fac816c2d18562a1db2520a8a555d13992630ab2ae755960de42d2d06c8c9f2a553e870e038dddf83a4ee0a3d04cd683ab1431842ebe7bde05a931315224a3145d0a1a10371dcc212a1f41b728246e1e69593fc9ab430a5c85db128b312ab45151c17665b28304678b440f4090e0e2fcb4c818409fa21dc2d8ebf3c259ac00805c388a5cb057577af2263d8ddddf3cbe10cf9c6bca6b4cc38a794a823600f1f19e4c1cca0bca9b0aa93ca2554e27f2669dac8eeee4b310cf55b825270ffbd1bdc9029dc9470eba1b8d9f6de9b4ccfcb52845b4ef1d697c6677c1105a84a6103418007aa3da4fbff0fb451666baec0476a802377772b3686bd497724a13856429cfa43c2ee6dc20abf7b3bc0d386c0db7300518c0372de9168b1c22759d86982b030db116b910d4a8e492dc471098308e343c7c61789bd3714442713fa8975181e82fbbd83d9a36ab916e2de7ddc61b519f28dc5d6504c8c3a09c66870879d8c80110fbc344249c8ffff7797d1ad5b181b9886355d0b0b0be3bab300c5cad972a41a4bca3211674509a34a30b2341d81b022fd6000756375aa613a99666d7164adb80015f38157800779672b7b73307bd7d68595151e1a3107e9830fac9f5cb4ec5efb0e62bcd970dd81e94445b3c5b0102f5e9473c0360ff74db8af5eed9012987413d0ffff7fa26c1151a8c153da58105d1ccc882912d5a9b0a7251214cbc6e96d8b55aab923b9e3dc5c360b160444231f4cd010b451e7d4b013c0e24a7125e38461624477edfdea90872ab0d2816de3650124f982ba37fdf86bc528695a9e8cdaf5c94caa7a9dbd58d1bd68ae9d973ad0dd3d1ac35238cf41c1b4bbb751322c8509511f6e8c8ce7ff0350d541c9431ce4645e9525d521d58a7856c6ba3e584be8a815e84300502812e55541f4b2b7935c865821da9c4595e85c04b15c4d477ecf67436f15fdffaf80fa7c667a0db956c2ddb57223500434c0ab6440e6859816cecd8f870f8ccb4c510b1b21ad950374e6d566f35789dea6f28150dd5270e362ca921247edb0e2e1408f5d1d53da55d26a242ba9d391130532f394cd27e7d616d2c48954a2c179d5916039fa32b40a1d9b20905ad5a605e7a7aeadcb59d5c633d3d61494cccaf8d058754b2804dc17cb7f1f559d943b1dca46a3bb09ef53aefaebeeee7145df48dc5188b73bfcb64c33bbca8d0e6d04e8ab1c64081cccf3fcfffffffd5fcab648f46d506aea9639f5fd8640a4c6debf3723b59709a975223ad1fc5ca4285331f86eb062ff7f811a22d587a611c4ed221212934f5f73753bf5a4cb5228ff3a83e8594d8c5e15f3274cc58a4a686af584d664f53339a226bd198f592b7c9c80645ac4489d6ab04d153494c90cfa70f7feff7d1b88c09703dc21cc160d6114dd2697facd7adc1cb3b5edaa92745dabbea8d02702284585372b934caf2861324040c714a314ea14a6aa69d8d11995261b333b9c115df52f0a6ad587788f4bf223d4ed8f5047ce3e563907ea826be5d0eeee2561c8185e0ac394c3268cbfbb7b490d3686d95c76ec882750acaa4e684cc9cc990478c6b51752371ec6f074d99b464472a4158579efed91e2e2e592e3150804eebd7716f98ab4ca91ec12a923e7a510a2bc1ff2d2b743b8f7f0e568aaba06667702b33e1a74a14a6a422d6a50d020a1931c1dad00c114dd8f1816bac4a4c9bcc405fbcd4c4107ecc2dbe1ff5feaf3810dbfd64ef470efbdb77e5e91b668eb483841b7315298855af1fbd5105f4b87f0840f08dcdbd7625f9fc6a4e6294602c9650dcfa8fd3a5aab47b83916bdb968063d561454ea0c1b1c518d27a2f2764098b8a804f554c94dc5103b52d052571acc2e06a87ccdfcfba6ba84eeea1a5e72303b435f36503acaab3717d91d63cb887bd4438be5a87b0b77bf90db600e4acbe6507fd518e2eefe5ad257a4ad5e9f440bfbef83e3bdf7dedea4b69544fa90e584a6f7c9ac3b2789272c1f1dc6e1568da7ffff5fa7353384d22664d7c15a98de4b51cd0b9906cbf1f93cdf78614785cb079298f7964060cb5bf3fffff215699bce6788f446cb6465fcd537bb9796827b67bcd720d01de8127df90de18ce689864dc76a0409475b62331f52ec14f184889515f417480d345b59aa46993d652c025f777726640c67ff8d687d657dae12f8ee0ddcfed36f03758f83ec1270d57e90af938ec6026960d79c59ea8e1667b1b684e9e8fe5a41bea310354d59314069332649a5f2e6c9a84dda53651366c10b76515ca1d4b901d8ffff95a0af481b9556af254ad8dd80317677f7bdb770a76cbc2d3fbbb8f305aa6691160ebaa930ccfe4d1c40eeae3db21f978cfb11eab6e8c179f722d9e2166d04b9fac90c10380c6f11263afeffdaba23328e6d963bc09c24cba8307682e33473cb03b35085a54375c4bca9c91982936c1fdabaf74be67c39d4d5218b2be43a987150a40a81e512a7b4a3b26878ad26a47bb2bea51790d798a18cc40d4c1596aa6204bd9b131c1dae3c2a9d96f31efff7da976072a8a747a716352b981db9f770ef8cdf684407264129fcdcdd4540635844d69da6eb48aa4bce9984e7a537745606b6c774ae8db8160163eb152f7a593774aa33eb893b8b4bd9208d57ca13cb94d3224bbbc624878eeca6655c1a5ea331ddeb34e8ee4077f766166961f796a88203f12b465da6224e7f99834aafc7a55bbe8937e381ee06b9e6feffffb7c39582e6b71ac365174b24c1168570fbec292ac82eca6d4f6fd39430c22c9d00a1ab3c4cdf9138f451dd51dddc16332532d1b702a2c6c2975b6595fb90ee49b44657ad160d6331c7281e4b1c2a5e54622c9541a11b58763d2c2a467366672f86a87ee6fccd29dbd234fc3b958927ae1a5e479de1cab1dcc130e74dcaace1cf2cd2920193be0960925834435e8e109db585782eb86bcb5f100e06774c8f6c497f5dd70d6dd692e77ee68a60610cbbbbbbbb270518b2c21093b1b04b4c057492b7cbb468c8dd9dae18fffeffbf18ccedd43309ffff3f9cf793579477d421d47b19be47c1517777777f3ba38f807a089fbf35a7c206cb523c9b52c731ae1aaf180f78d434b1144dddf900a126cbe335364555d92b827bb366ad30987316f47479008ff24d2eddab6ee3ec58edd370f303c615ec8f044f269bab5499d74b8c96a8c41038450291ec08a31808040d0451248ef348d0391400020eb478bc78302c383c342c200a87816020300c1480c10000000c068383813020440e9556223b03e123c2daa70b1357dea207bfe8115cf0e05991b2004ddef243c08ad2566aa0e788c1f03c23a59aac2edca5a0dc78b97d6331b10a4e8970aab7ed65fc71db12d4ad783a1177eb172f2f3a1e190ec404a9e64dd93443ddb31370aa378502ec08da93a43309ee4e829b753b90d439241ad13ccd7139a4c6fe50796352db5ef47c17f262d26b3ec7f588fbfbf51e869224184b2496a014ef86b5209e3b56e844b1f74b7910ad4f1881d15469959588e43458aa58b3d5a40d3d7557d32767c070f751af6188e7c7505a1f0cd48c1dabad8fe2ab776ea515de522483434491468eca381bccda871885913f280f3cadf518ed0d23d0759197a9b213542b6eede1a8c3b6000d569758c848370bf64812bb5908203149205cfdb95fd98535dd86f18c19d779674397868b8c5aeccd78f6ba70eda73293a95e689430af3b447a0276a9fe124ee6b83f44cee75490fe5f425a194e196a6a580d2d4b654105649481a81f5843b6e656e719b8f018774c50d3476cd5672a0a1bf56b75f3d68867d69f989368f483fa26caaa4189ed9c7396e4070e8568c513b5785ccf0f1c0c14816c9099fbe10bc9767acb0e530b89728f4b2c2270d8078786042bf03a759dfe20fa311a2b6eb001f63ea618e47262f84a75b71cbb471fa8ecd0982bb8452f3c2b90139dfd51bdf0f18e3232c4be073c6a5693f3364a1d332abf5a902d0ba3e070302592c6326c7ac60baa671b169f9db2dac29f60131ca109d58e4ea2013e3b335ecc9acbeb084a938cc5230e33075b9229bd699948cb85c7f4821710868fa1e42d6744dd743e32e9c97f2dcabb4e02f663853045019284c9e160fbae6fad8c8b3e8c97b432ebe34e5652e659ed8f907d4fd623306edb507890245a46acce424cdc8f32bfd768c84ebc23a8e6c692465e69fefd74c170e5ee35f2f8d433a00870ba6ca2818312c604c6824b3e48004cd96b18d1b6a359c8d793559a3829e032a2c59d55e25a8514531c9cf9d69202c682a9d591126f1e5106f80a77fbd9c0fe9c89e5dabeec70e587f2a5e41f90918b92c831d0b22e56675ffecd713ec4a0061d16ed84bd00906e2368b219b2eee5bfa990b8f4f81565122e566811f1d747f3d00c20a6fc2d08786e70c1a71388069453738439f125461db5321bb2216448fc29c9e7fd284956171c3e408b4007a9bb9a4ed9c8084df003c028a9115c1b39ad79411364bd8c053e82db0de4c522491bf9eb6e92f32a8295e7d0cde0d24db5c734c16e6c8e42180ef4da844a72d4ab717fd90f820dfc305349f94a5fd2e7223d303f7ed023fc8f562082c6c3af042b628935add9d3e4b938dd2c11468cc0adc423cbf05b253d6e70f6b1771157785f929e2682873114a1bb6b52e3b810c360026f310b5db744dd3c16367d4015448bfc216db1375bc4e283171d082c90a64664042d5dcd5e442489820c0cce1065771d573e6f135cb23f5ff43f769803285488385edeff25319fce93b4e6b28e78ebc630370079ef10a68e498b236efe1f11843e4e4310b91c16a73b9a7b6d0479fe11eb11b2b420ccadaf5302359542fc6c62cd248bf34c936a0d6ea3c952638b63227f4facb8ef2ebb23fbc5a1158eb5944932992382f0129a9af435459d296f2b484c915956eb8f5497a3f765bbf3c1a64fe97bf93dafab974a82978ac5f0464a14c6dd3e2302fcf4bd79b985172bcfb94d0fc50f05adf5c66cead0127c2c2287e3ee063ae23b36900afffb9b2c46207d2916ef72ded728f6bd68e04f2ace81c518d6f44cbeebe4319840d3724a258fcfd398b056c85a420b617b252eb00bc55525e650aaa7c361ee6729f9cb0b992c096f62916b838ce1c7272c4ac6913aa9d32140cfc4999626f5ce2116c1a4898881619635013afb274d1ea535be1484e60e9648515282960bdee6d648cbac63f6ba05ba8b372e95329f8c5884c6103546528c4f1eb45e62048d1845684c4b7aa0b259c6fc53a619ecc11fe1003d2204a38c79f71e08aecb0c18b886fdc3d4420f02741d6cc7db41475eb5e67aa8dde1444c2301e60d14d7e0c04ca524010a582e9351e416a19315fa79f3c20b71e96a02094989ed832caad3be3382e6b5071a2f344359cdc0e65e6b3ce991407d099d1070dd1b5ad2c755e0a0bcac5a1c18eb5f2af84c5d39959e057c997a4d1a18f490155d55f2a55f793e64c30e1f88842db2d5fb32f3f6fc282d80b405fff9a1428961dbb302c940f774d6f03431f575fc8dfb5876c4840dfb46e4f5627bc3f9b8ee9ff1a06f814d00d1c4ef757850e40519d68e5639022ed609f024059be167b5e909fb978099c7f2613f8883e7a02cd466fbc443dc9ab4fb3bc7982644f6660e960895fc505274f579ad05b8b9107c2a10c6c11ee824aeea0629bd244ffc77bed7367ef435534c5c578923db279d0878be2493f9398839df092123df615ab25d6ac34a3efff966e9ec0e498a0dc71899594f7ab9613d8449ee63120fd38d0b25a7496fa5fa9334b3e418e581150eb0c74c1cdb918b782a04b34cbf9c54bf8866f84f01e9f427ff319c52944b6f3455d8501bdc3cc52cda05cea0255ce2c0c74e4000e4ed402aba001220bf3ae1adbe9d086ff6aa6698441e593789170bfb5990a2116a1a4ec732f7bb89a9f3304c086e4ef70953830870dce8da135fa79121d19e4cb100a601723f0b0e5d88fa5752b5133fed1006440fbb87fea2d33d8403fcd8512a863120dde812edc6eb1afa50fc4e941581a9d9fb323e77557baef5ecb7142a87ad8073c7c23e52240e256389303870ebd9e7a21a2faf44004927b9c898f8d063fa1e14b72b3fd081fd076ace5b665abeb5a0b1df67071f3ba4dd1877ade381015e8570fba5088a99ca75ba85239af944fe27e844608565b81093d41828d448ba2c3d768f85aa2cd31d1b30a26f22884770e47fb2c44067c28c4b6c1be924be2cce91bf6294df2aa7a2c8979969a69b7c8f24347b783dc8bb62a7a1ceaa980b485254506fb6357f3b59eaa6519466b3bd240e0b367ce4eaa0897f7464f9b60c084c6b43b43bb0dd3a190d5a72d95481855784c730ce63ee508344b4395b5759eeec4811a24b05ba535ba6f0b44389f1a93b8d95a6ee87a7fa479aa74e37557d6d60bbcfcc516e003039922ad670d58a9e6d2306c20ac8567f0cf863dd0dcd0981b98658724e72b51e6e21204c6ba91f77dc6b8f30adb4969adef72583dc85aeba0c25546df9e36be311ad5f474300cf3a1426d183f8bdc45662408571747818552c1710bd695f20506c18a312616fb6c7a2b6746fbf52b9b6eaf6199c277c934118e820c8317d0a1ac3d17891b360364ee7a8b4349e80713876ead37276449e9c8e30bbe4c5a8844ab83957e42ca7b9a2290c4d697c61b4be4e8ac47befaba086f6551e371cf2b6bdb02cd267c544e67b9a35bde49d3cdc4208e78e06ce07ce543d31adbf44247b3743269c8ffefb392b40509d768588051474d13803bf907382ca91aae5fe6b55b2960f4b49c820899494e8163fca3fb7531186991c47943a55fdc34c5612f9da7fc3f338c7777dcb503541219c78c9ba3e3fc840205e8447bd1ed10feccd2334d4ab5e901ee5631c24fc7f37264ff92c87239018fb30a47e26f70aeefda49bba9ba951faee6020b65cd297dcbc209dde1e908180279d38d962a4d3382a4d58afef8dc8dcacc597bc7d2227da090a6df5481c5d2d1b01cd9ba4c54647c41254e469a31ebd96f99c1e78296c2f6df4f19951571a070c2dbdd1377f67e863b178cff157cf0e03beefaa4ce04628a515d35bc631e36f54f4a0482cf3f3fa13f905c1f585f2bc4d2a8c37a660e3f3707e389480b456d3759ce253e9708946e44a0ea62a89c9469ad999f1f5cd48feb6be225e73dd4c12c8347e3548a095573bf961f5f3054b6c5818417fb21d337451cab517a20665aa7795d0537d07ec738dc8e97e7ce38af1b3cd7f524af8b2c8a62b2703e2c2a2b562190f368b5d68d4f60780e628496c219f6bbdea6ef71f1125350c4356c70fde225a73817e8e99a10d3d190b6abebeb5068cbcc3682cfdff96416dab13305641c5a0377960ed32a836b1500029c7368a5149e741b5b19683e5798aa0306ecf251a6394d5459d97a3e8601b4580d74c3755e0d3231718a99c6c4c5cab58d1b7bd50765726e0937e6355db47b487aa7076e4994e00c30f94bc33108f03b0e85d619fa6909a18f273f172ec2f22b0eacb50444b4163e629b988fe236a38ea11135a525c3802736dfc24890e68774a80014f7795bde717ca12b07c0d382278f858f64fd384fe652db83a5809004a6b5ecaca0ec85a26143fa3f24ea6af618fce73dfb62dee545ef25bc087c40fb5c337633df50b006b2c91921b8c411e4fd4b6be920f94c6c86ab331271bd6316dee1f8bad07e4c1aab89fa666724191d8611fbe27ba5aadc7398533a8c8e587d20596fca24043222ce4a9b1c68a91164ea433e8c9f690300c7b769935b0310439d67ba44e52e0fa8f15f69861a717ad7c50071762f67db6abe82cc2efb3a9da702609070922d13c309022faf3f2e4e601aeb38c2e34e86f3da2c682646421e167a0f990a27e67c7799c103338457fac27f8eb5171c574ab3d3989c3514b1b885f10c221acb742e7cba15a005432383653675501d4e5c0f05b2b78dc94e06d911d791c3597a4878f1f2466bd36144e5e3188cc3ec3c9570f81a8b962c73e94e6a764ecb0323e4c090e09612de265e9b9e395d86fbc824cb25576f46f444a1033be12e9594cfc76c132a82ec6e98ceb821e611291bb3dd645b367449d29bfa85dee45389881a02efb454e8c9869b0c5ce49512b24ac3f73a6a612104d4193950ca81c46d46553bc043697c59665b185ec23be33e72f1b6820f6e1d895e0289cf2c7771136c122021c51b59ce9431a35c074a23026edff523d82c9bb19c5544e9c77ac13741adc452a5b7b23e0d4b6171faf60ca252b1ecf5d728ffa7e707bc78d4760175fc270b07dd41b88e237a10ca041e299d4879072596f7c3a78e1c12688085e66b93e2d3cc89619c99b28a65a46933d0e62e9fe422b70530a67086bfd4451f6a898212296b666ccecd5500f4106daa05e3e7c1f4ca40dac84c8c5fb65a3116803a651a2b761113e24608411a33e221681464a6b72225aca4876de70cad5f671588a0e32a87b1195c9d9af7cdb5346394616aab76b201e5b33402660ad77a6e00f20392aa46500d12933bcd96df3448b7fec3d08004b231d2ea70ae863340e2140829176564ad2ea98054236e6c8acca6e1500014903b137ccd06e3e8a710fbf9abebb274bc69daac9a39b32faa2ee64e5733bc04df589e286b84bc8d1b87a1274d60e132390080ba37dcb0b8f1f67654b345429d84b136055310a565a2a6af2daab7b4a3bdd6264232a969ccaf63b7b7e2d61c70e166b7acc79fa4c380cc8dd2f97abd212ed20262a849652fc6519493791998cb3941ad710ca8c584279966e508c3dc210ca55e7d052eb07ed9856e49b403a2641708f2b3863565c514a98bb9af7902171c55a405772ee57dbccddc7c22e99cc940f8308a178c055718db6adca7dd24eec6875e42417a4190d914d119555941270da2bd320c1a54c090bb23269396b4af4c2c3183330c5b51469840126444952b7f873532769a116ce7ddda9d47356167235e6834ef76a8a509b5612b951eb98dce0107db6414ac723c383fe8c6d9633afde69af1c639d2c6f257061d92b0f0e820b78e8b70fd01f3b561e3536e776e4abc26ef97690366724996c113a24858aae813a2a130bd44fbebe8f9819dd0c1245c872d682096a4cdb644dbcea80aa29d8586bfd494c7cc6aa0d97c16d681faba15cb5d7c12a7feb82e236fc8ffcb335928cbff6ec9e9170e3a239f95478430fe52fe3bb3d8248b1a74432274f3e667447e9e234ae1e014863c5a21f6cf4e6cace9aff2f36aec04b407b1214943147fe0631a93c58d7329c7f145862eeb663bab852019a4e67979c0aaa63eed49178549c3c21b45c306bc215b000b977255f8a422e1b1e01316a4249bfa844267133f6a2d296285f1f1666c93a45edec20bb76a944516b5785b1543e49083a84570606b258bd36b7f1d1da64fda5a456538d69920c9078775422822898db91a42c7b8aeb0eb9232257871472796ff42cbd10bd25410929841e43a26bb8c6e977c54b6c41c2ce025269c3ed734d6505e1e1761820bb0859f1117d29718216a26d3ead6add9b5bc25024b5f63dfc10baca5ada81598b100343b3caa751a24879216646069b5e742b1692292c3e8de194ca6deccbc1581abe04003d916bae9376d1df6f81757ae077fb11a866fc60b9e80a0f3d6589de3efda9606636f893b39beb0d0e5dd615aef66db70d91ca71c2c219c2886e6838c0c80cdb46d4df12bd481af94a7ec0d3c2294cc80a4778263fde87ce7baac11fc37ae724d6344f7e55148f35c3414654de8e06e80c29ff94eb821177347932ea528bad86f0157c3c1e9fb6e1da16be60425abba56e730bfa2504a62c42001272d80f10e158851c416cc8695121014a71eb6c1313758549da66121071193c9d8431c00929726f82d846ca4e0c4f7608bd39e38e65fb2ff379a36307b7cce32c9e2ec61ab10782e53228ef99f9c520a5b016cff2c0701083455c977b8057557507cd4fd508a077ec0651f5dd527548e2939be298e6233bfb26376c89a96e6f22a8ea659c682347a0c96edc9244a2249a3c341be432346a66f68f93dcc3e3cb8f408780f11d6b8b5e9866ce75770bac55a49f4fbbe6106c76679409f273890655ec021735f93ea7c525b924924470d2a380b0ac35e8b02823271a863f97b38fd1068b6a8cd67e6655c8cfdb4b5e55bc5755c39a482af539c64814363a1b0804e0c77ea50206a3b1ad62960232bec88a22f24e83a116c05f04dd6dc0aaf554980244e92392e9abf9f76620215cd42c8f2430a4879a539f3ca08b7fae4debc3fbe51e5fe9cefb25373e785072b0d86da235cb28e161c2eed08deaea9c7a7576b11d6731113ceab7be9aacc82efaeeb0c0a71b334c8c2360a0cb99b0e4266c7edcc8c361ac529562e89be663820500e3ce64bce23cc3bd425f13b0507759a439631d011d6cc21eceb002c7e148db683e692b90d0651c89ca6fd153836a0604656a8dc0084eb3ac39742d7c121c39b373ab569bcabbcbb2a7511045c8504188e31f1fc20b72090e8e8b73d2afa4f49a2c7118d6650ab6c3b104c5d9b0975c04e1e774e61eba0cff4ca81370e99bba06adc66e81dac3862e66fe4be49282805dc655be0cc71b9f828723bf0c9c656297ad67ffc75084b9c1192e7d086dbbf9eea58f1f513409734909009091c97843223ae655a0b72132c5f7bcd136024a12e1bb8974de4b0160ea4a6f6cf5bd5bbf8f713089cbb082d1041b9d0aa836636938ff239debd63173ffc0d89f6b2520b175456b3a71130c704e6155e00962ef8bcc39c729576120945970ca367056e64595534e0c821d84c5ed7e3bfd26b4d3461b5ebc8cfe7fc3db5e164c0baf26d86eb5fd9b8dcb4d4f25b3b968478f03af5392f801af3723a608762ea7482b09d3a56552beb117c52aaef5b944f6383e5650af8ee68ba0a4f934ba1113c22fecb2769220576e05bffc5131ddc9e854c699eae93eb6208451fdb82713783a72eac079aea6977b035961f3641c07386646f98bfadc789822138beaf44531fdef08ab2a55cf5d03258e0853f7c4c49e260026fb95a41ed4c5a2f85fc7679eb46312132d6aab80b6163e141f6a2b48b319ba83d08aaf8888ff874e87e9691f18760ebf156e403a031a425978603e046d829c12c06b445c6499bec40f0f88c859b334d0db2686230790f8d94bb080f417583e51172a77aee6cc33e2ff002c6d0422e4fdbd62c22a32ff7da4087026154d884dbbceadad2603df4197e74c912921db3f4d90277ab4783ce71108c0671167e5c93eab4be09030802a336db68dd5c26fcb183d157fd8d5c0ed2d14388b8ac2872482ef5ecc7cb36105a1cc645109837d91872b0b8ce364dece481888fd1b7213f702ccbc17e91497e8ae268679ccd640d5b509bf1a030c9128802c66da888b7a46b1708e605591909321386185b2184361a60fea2ed267491289dae241a5216559cd5eba06085b5cb61f684a231bd1bf8ff352892224b93224a104f16fc221e9fb2c2ed5fd9938349bb5a2e929a47f3614033d5a392e331653cb253343c652eca24bf503822ead70e33e6ffcbccbc608dcdca64bdc0d025031959b2cd132cf049d672b2fbef33117522fbd938b482af261f52c5e72ce54f4fbfb2d6b2669ac223109f4bca1c2ba614eab7c080a57635dfc64bab893d1cfc3ac94b7597f1bcae2859f82a8b632b10aea13b787089a1995c635a015d0186cfa10f1369f7a7feed0228a4d208aa23171877d24b77ffb440bfc87995c631b461bcb1f9bc42228c00d0c40fcac7db415cefb58152c20ab941a765eec0302444b526da15121e6ccbf526d64ad5d88af0ea7c299ff98d9139df7371cc1ceda08b6c125c851b494b2aed0d28f8c1ed0a432c1c24d2a60481196eb8fc6df315828fa7bb3089d0359aff30a28012b83c44dc5ade7010a501fe8b3b81b8d079099a71070b594693ae2f8dd6cb41c19a0d1154dbeff1468f22d84e7a55d94528bf6089cfaa447667e3f4e3634ffb45c39a4d54793273b36d4ae76cde828207e3a3677b0b6d68a6cb7d95aefc2ed8d426772d4d96ba346896c343ee4dea8e87d8972d6877bf6c3c08f018eb0bd9b02e729500efb742915aead894974820d0c5d32e3f18fab0846f4f91f9e938a76b0e80621772c6ac849eeb7d0078c932f03f0142256433c1a53d213dba6354f7e749aef9119337ab0bd279d39814fdd2a2505e2a4ddd75955e419132534930ce026fbbf88c25d9bc68f200a45fe7f4c1a314e6d9276574f552badc3164cd8004a4b8aed5f36993f15b3ebe4d12ca36f3c31acb9b6fe1674db82708bf3363400a1d16010e8068f4bd0337dec292d383ff7e481e9e34859bcb144ca6c39c974ba0921061d88312120e125321fe7643740d3e2a1a665e8d461db94a28e1a05e67a6e73424c50102e034d0de3be44d7fc09cf991426a8ff3942e408193f367b63833e15aa98f5ce0aeadf7557d6da4989d42f42260870a3c546aa35346bc4e53b30e0e7187e491fc9288b8df562cdd01e2022f8453e6e5dcbdeb8d0791378f3af4bcc2b7759815e95c4b6fca31733ee7283d6d8202dbc3abd05ab5fa0782f45ec962b0ced590d2822504ecf18f232a36c1d86ae97a46b345f935269dc7671097d4e42e3b145db93ffd2ae132e447c6383f97978a5ca6e13b00f25ae1326fd00ab536215427dc5c5aa4902b80f8512841df5630394543acbadc8ee1547e9261949db0ef008dbb145f442da081518cbceab58fbfbe5ab2281a340bc43657cc42b2947d8940495c86f06a290e3dec6393e41fd0ae6c99f052d4a5df0e4bc8686d419ca198e62e5d9dded41dcf345560a6f0d3f081192683c46d0dbd88e9eea0642136a15757985133286fe988d4435966be4b82b17ee90ff08549b48d815e9dc01f4d4024a023e61594056daa4030568cf1d9112804cf091fa34b5b068932f27d255b900e20fc1b61beb49f6349b1e72e3030f1719bc40d73374cf46a2b9a10cb4f42a523587f6dbe20529d77037d0b25c2dca989da7d14a42b6dc7b4b99529252ca7606ea05b00548d8739e758ffe80aa29de92ed0a698c89998df163308a8db00669a828e5142aa7971646e1a4a8ed88c9223de5782b5b96a8c73cc8eb8a320f6be6f3975c7835d633134199ad0a42f7dc39e79ce3f80e8bd70379b19960a187897da3e1afb012116afd8bc01c1f85091346dae0f2b913d2e353799f91a2b17caef4b060969991cbf6f3f4613999190bbeae2a503aaef05b93add18e13632c343635bded220f086c9633f65b6db9324c42fa104bd863f9f9e99042dbcb1a0601a158864f288639bc335e0df479602a34027b7c007d1a4208a14fa9041f9813ac57d8a48520509803ec7951a638813d3ee450a27ba173e012363c2147609830b6067f1efc49e457ae067f7eb6865461c2d88b64c912cb95fd2b77af41516b3c9865bd4a22365fd6dc1c0636a9aeeb753fe7ee76efd9df8da48ccc2ad4f4f1e554ab9ef1e5b37523a16496d6cd7bd87a30db8a848d750c41f999ef63c26ea8076e0c2616fe6b3ce0f318d4d5e0ac1be219a8a0897443b6c1a12c3e329699e57c35193fcbec65315be1066d440603323e4343ed5b427f96405852938ff4e1e6934563393439380439a564ee6766e6e6414eca5f5e115c47e6265472c18f38ebdfd8f5321adef68d57666666669679999466c7ccfdae2f924c73c91a51359c5dbfbfb9172692edbe42fbbb351a7f0af30c4c586b3de2b325845a89c921ee65eec9d9b11a2159f7e824cb353ef8a4c976d98e3b63bb5db7a43105db31b627db6a6c6c281b528e1cf6da58af570f1b305683b372d21999238a208419e93a0c212925a5b731c1b61f2ca914725221d8f8d7b1cb92a12d5752e3017ff4822b62b7ad9c94bf4c61fc3044fb225483217f422517fc1d762489ed775d32327d71cd431af8ed959152970b3c1a2090063e9c2cf032f8330a755006d431f62deb7ea600dbf840207d2e620979ebb535065c249952a90d391719e363e1df7cd1c1ba6f3ad63548e3e69c57ec2f59498832146a40c7106b858541dddf2aa8b907e4c5e0ac1bc7e0d30bbbf16aa4bfb89e16dc60bbfb4b8c8f0ffd8ef432c8ddff6e1cc6ffb02349acb347dc25d3d72523c3af26c9f4fdb3deab3199fe7b5992cccba010b75fbe7b8ed27e413bbab50025aeeb64167a68597fbf1c7ed61018c284096303bf93aa9fabec49141e004aaf9348f7ac9756f592a87a7faa40b2de52df0644a368ec5e7688e4e6e8f800b65d570c1cc0ea3018d0cdd6a4578234f0bdde9cce6037ff9bea933596667e401bcbb6a181600fd5c8c6f2fc5bb29c597e12fdc6f2b95e230d083241f99b15848eeab52995f8ad7a33fe59ef57157aed2b56891214d65ae65fc109ad1b6676b66be397c1d9ac2337d3cbf0ac2130b075aa5e24b6df75e51fe84bec87261f03ad127834f001016842dd0381dd806617525cc038843cae186840965f26643d8fc2423d8e04194190c1240464ec40869306c6086ad0030e5da000e8084c04fe616e5c8064163b58022125d18bd4fd32064f081fd865441df1857ac26405a74513e10b04ba6289185da4cc408a1fa4502268b2a1620a25784045075f5cc1627012767aa62980785d8ee86e4f810b0971e7e0eeee3b474876bfa1bbfb67ca257ab096c841774b1a3b0d27fb544fbe8c62acbe7d28c2105e125c05a5a57b727777c99e8319d3093de9ee6e1d749964d00117f4044da028610b21aed8210b332c1268e1431155c4a8010f1cc67309bc988e80af0750670aea490320a2602c4480450e4d2fea63c4cea275627abe70a482070731880098285828e14a0aa6a8428c2abc38420a9c0822038c18b8149f254c469c800026d8c1871b489d1bc824ae274c0508312a09a63d11aa557ac240020e54ec7006efe0c99719214f84d982090f3e2461081e42777777379992cf78c2518085055488f0ae544834594118b1db251943287046e8c2c104e0b0e47a620306602295ca9b881d22fc528d485480464ec8bdbb1b0848d324cf1451c830234a16504411ad38c3860376a8006db1224c9428f88b6e17d48472720d35092239f1815edc508c311e0169da45db083176cc8b4af468e131c6b804d234e7eea28c2ecef04204a48b32e10535acb0a87725c61843f0b18c2d95114a10c6155ec0507152f2928326549084162652f0206710f325c618c798f2689a12318c7185c40d325551e76283fe9080255fcc20020ebe5801451548dc2084df20e5d241145caa0ced4c414116f622c618b5e0e91b2d80a04488f9a131ced643131b53254690439fd2d34e069e206f3e3a30c1142e3ce862045660f0138130450f152a50bc6009260083bbe8eeee36e5c7ddfa6fb9f6b384b9f010750a53c0dd554ad9ddddddcdcc2ca8e0e24b4eca7d6551a3a3d1b0161d37be571a00175096936160e73c23265a507e968fc91d59f84f07d6f00ea4812f9989c6037eef3031f10eeff08eb39799783a4c60139684714c2cf3b0c0c7012cbb607987e5bfd0f2cfb4d99a0ff92f3cc0f5f8d962f300f7027c34f069bc6d8ba46750e81ccb206e91341ef0cfb0f0278c02455e06bd4aa0f180a51004715103cbe97e6cec7b1bfbdee5bbaf66d53de52789aad44e5f9aa5aa1481408eef51d6463d16a3ba2e67f6e7cfbd3266ddc8382d118ba23b24d0f932684d7f595153b3ec2e928c9c5eb44193517a932c851acb29ce67d21664993967ceeb5a0011d886e655c4a4d705200da4b982c2e616545151658716e47ca014cc5d45776c010cea8953d5f3673b5ecd649692f2bfc0a3c97618b19961014243948750fb8d26938094f2b9114bbabbbb9b999999a96867b6b18c820a5a37ddddd463eab1bbbbbbbb9b7dfa79faaa557176733777bb47ef89a393005a37efab6639b981221331324602a78e20e865cb7cdd81dc657e05dee3788080f09e09831ed25104e57f172ee1570616949fe51b824b465e3496af8c2714c408f895d1434d22bf6392fda954d3d432ff6669c0764f1b702d73ff80edb6fd1537f744536d8d87747666eb30b8ff7baf36c02db2a822e5373619c20cd658dfdf24ac29d9f42895a6ca31fe0a73315818d668fa270d89d4020df46215108259fe8a6368e951bed611927236a0b6c53514b2ceb9243ad625d1c1ba2349ba61f2b1d77b4d497b2027bd177d19b45e1d989927a86b0560ae81ed7572521622e3ba785eccdfdddd8cd9d0b17de26e4b085bc76c78b15e25925fd6cebae1fee9b9716666253d96954cb1fc38467e05bc9a2290063e84b09a3efc210d8482ca592403b086b690a4246a88662539344464d402dab648a0e6e9e2121e6666ee2e979c94b95dc9c21c9b99f95f6466666666eeeeee1e4034cf10f1780750b316099778d690185f3eeb86618396eb0d4e369f16b3924d8e03814a797d562ad9d8c4d0a84104d65cb5068944a3d6699ae2bb295ee923b75c45afc99033d9cccc8e1df2e9f3d1333baecc643bb067fdc0420d4833d90e49faa26a336fbeeabdf71e5f231710d8d527ebdae533e9c8f6c8de8c0527575f72527e97e51e2a08d9bae7b70485dfd57e41a17b10c710f8fc5c711872a9d7c8b7fbec7bf79a1b7f63b225ad2227e9e272c94999a77d11543ca79224acc727ec254df2c7c6b885c618493fb329026b622ab5b119954aa22cb3fe27895451da2e10ebefd3594360b01e9b93ee5dc6cf7cdbfa63f7039627bd7e444f8e28c28fe5ca135f0b61f6bc2bf51a7940de3cd63d087aac03c194f75a07db6f5e2f83eeeaaf91cf95f480b8e0d745620de5d1c06f9e2d949ba75db1b779ba5818bf79b8799aa7791e94c805d56407eafe524d2c8ccd33e9f580200e39ecf0039a3d4c989ef925ac8939fdc48449ec590d8831c44a8234f04b2260399d5bc2ef71b1a143f90871292a289f1faa098a8ad20e1d289fb6c51338503e3674d8411dc9133edd01114803ab499660f35b82128132ba642ff2b6959e2aa258ffdb562cfc16ba7b2c33618509cbcd3d961a1202c7e96fb4f1afdbf8b76d7c6e3fac8fb0fda01fdfb51fa38fffda0fd1c718b111e61a8f7e11f61a8f7e0be3c6a37f6215d64fb96d1e37daf6ee697b8a1c3311ca6c322a5ebfeeb7d9d125cb2c8e218c836348bf3f89ab8c652fa46cd079bbf742dd7b6deeb9da2fa8fbc6ae9fab39611c176666666666e6eed6c14333932c123a87b534b611093b07a2e7709368894634a6923ee6d3e8041543ebfd6c546f26a256bd3693086c94d60bc4fa4ff54a29296dad46fe636f45ac4becbe7b741e39bfc192c62dca89aae60c364dccd07eda4ffb693fed676a3169636943030a144e6c96b013efab9110ef1be4aecd61ef9bfdf75c85ce3da123bb27aa9a16911cf767c9cccccc369679d0cc3a15104f25192bdd0d05b74c172e9ab9bb703c724a495b9776c5892b5d2ea08b74e58ae361d2584eca2d45c78e9cecdd3d432e27aa02b2e30839bbbbbb7bd03b5098411939d8c134702cde9c67440cf0bbbb1b7ab7373fb8850ff898beecb90af9212491de7bd2be27851f14ede57c159bfd5776a52f931632cb4983b8eff9bbce775c2f08216ce6e607c1cc18089c80e7ddc7fa167e3ff7f365d773f5a2ee65ab91ef9abdd31a32b2ee1f5b3771c224d620bd5cbd976d35852ce89312c257711e08f7c386d1debcb96e6fefcb6e09de5cab934ec7f14aa3c705287197394cd5a463f362db7cc89faefb5da52f6bcd820de89d9649a4bf72a075bf8037065565c0c25613bf2bc571ad71bb7fecc57b8637ec5858df37ec5666e66feb86ffb9f658c44a1c063123ed8b755b6efcedee97b5fbc2b5756f491b540512009e475600eb10605dbdfdd44b4cbed72f3ffe9d9e7ac9f21f0eeb5af3d13f6192e3bfcad175cd62dbbbf2b2f6a31dfafe0109c16facb91eef7141ed75df5ef6d8ba7f38eef9658f051b482c66acfc4a3e1faede29b68ae34ca8acee63956fdd7beec9971969571e0d84b21999cba6bbbb999979c70f3a2bc306d6888890d223e0c2c420aa2d349a36401069e3a8bd5dbeb6f24bda3bebf83d57f80e0a61f82369ccf78db6dd76dbf90d473f44dfffda0febfb49fdc48b4cb167ddb08bfc2dffe95ff95393bf8ccc0169bd73b4f5b80a33337337172ce7735e989999594eba855e2c67bbf023c4cccc2c677777fba0594ea0eeee66660e02cbf90333f3b39c4098b4b1e4e25c73ce39d78d3b4adadc84107657503d2c5bc7f2573aa450156c8f9df3760f43587eeef125ad63450f16d2252bd8aeecd378c04701073a84bdb459078b1721d0a17a9ea0735eb2d136311bdf1d9b59904824ac02d8a4971bc16c87608809cc7205426376f7be5d1521f81bbfbffbe68fcddf6c377333d7799164dce342ce6454352d51cf8a12593f64006828034343436644eae48ff8fedc7c341f7356b16478363e63d637563db46ea6af22864306db53e34159f5da609b8d3df1062cbf831f68d7b6b96ad79e487a4f2c5e56a0a308dadfdddd73c4c5f4d95872bf32da097e7a3d7ed7ddd33e53a1f40494e5642c26aa9a33b890849cf4875e2ca70b3582b404c18515382092c452aa2845275a2a954a2ca70332c33d3ec2ec830a6335c43f32f9e4ee2e7bbc24ef07a1eeee6666662f8de5135353dddddd56b25053777777b793d2df795b49810c000f94257377773777773777777777b733bbbbb396eeaede91b9c1781302c3c02b90cccc3cdf647e5f2cf3401a58e10f6cc205f248c84372c8635fd0b31a0063a0ea1b8234f07958417a609a68897243132adddddd72522ef4623979c71035d498999959ce2d266d2cbb2483c81200b6df7bedc7f434c618e5aca8f67732b09dfe5943a46dd9eecd4c03283dae59c80959fe796d31e92564619003e3c0f8c0304ea8fb0b8360100c82611c98492f27c4503881e284dae705ddefb9bbbbfb1d49c28dbb4652a1a44703ff7a01cbd956d89b64794563497a6198999999bbbbbbbbab682f424d46395136fe2cbbbbb334960ce6e57b4b24b38a32c6e891a3fb835154cdb9eeeeeeeeeeeeeeee66669f6eddc8772dad85bd230b7a7a8f11632dd424a5fc67b5c6839da5fb3f2b880ee912daa047961e59584ee61f2b1cc85d26874f3098e11231b22381ce9004ddcc3cfb5d4bf3d0dddddd2d279d825e2c2763e00054a094040066099631b3edee9eeda0a2da5dbac7ae0c952099a9ffd1f797a474d9484622f6b6b0d6deedae243e4602ca14ef4142e66ff0619f192b58cee746504103586fc13a8d75cc7a0ad663ac4fad86481614fe45f5d21a55bd998d9fea2d9df05ceb093636366a6b34b7d468b562a726e4cb6870fcd49ba618fb45d9ac581f0935c10403cd8a8ef5bc898a7d6666878c5389bba710f128ad1f2496d580480472a006ca66b21d4a30bb5fb91c78afcdc7002dd0448abd4dbbe2840dacf12ab2e8a415a5a8dba902793db248a005fd19cf72f23811eeef9d75436af759abda45acbba95eb6cdde39bab99211e444b53b3333cf04f10c8442b66099c63256cda9d5d01f4e849c5a0f7ba985d6eb0c8d077c1f415017d3b713e8bb6ae37abdceb28288bc7d047a3eac1ba7ac9b5855a3776cf41426820f637c20298afa988592188ef54968707c29df291a35a216f702f54e23cab7e255a3de67adbf2290f577ce558b72f2ad778f42944f551cd6c31fb9bf3ba4dc7aa1112802595690eb7d5ed07ff4707455b152315e237f389ae412d96e2dac59e9eed05d0992183f66f18fb18bbd23d127b1d0521f7f9e8fd1c38f593c6eb1771481bc277a1781461fb58ca818eb8d4076f4145571fc451f5b14b6ff4eed478d8ff51a19895e747346ee6f89461fb3b81efe6e05113df523cc9df03530fa2860369e06367a91086bf187a3702ce61d8da930ca7af735c6596ec8f431e6632a0ef9a377e70327b63f6a712f60d60b1dbdff84d68d5ef4d787ecfc1ed5eb78b2a3bfce07b69f62b2f118fd09588334231ba2a825be55a316d7e3276a8111889ab066a35bd9013b7d0567d4028d5c230dc8883f252bcef4f1a9970c881456e5cb7cc84e1fb1698a51cbe3a1cfc61730f66dc332441096882fb6641b16228eb0433cb102b00d4b14285decb439fec732145b00dbb04c09c3629992c556d6fd8ee5aa3d1fd4a2be7d35e1cff97ac9137a4f64d150596759416e3c7c9e9a9d7476a675f37ea07533d522d0468dcfaa0abbf1a4136c7c8d8f79eee1f4ac03a70702a79c87e18c2699afa68975a6af1e94a97e7a20efb91c5fd5fbece87354de81f0afab1527fee8497fe5097fa90d068cea745fc5317a5804d2f4f70a9fc23f0ad88b70fc45830142dcbf770f7faa1e08b45ee8f40effc6b482e4f857e5805f4485bfd2e2f8f66a7060f5bffe0af5cab7029ca8a9e6f8a934bdcfb1820a5584424d41fec4b623b7a3db01f7defbaa55eda6c94dcf3a4c0cc55eff9c8773e393d8875d685da5f37ce8e05e700f2f3fb1d727208f2d1aeeb337deedd80b9fadfe4e53bdbc63bdc6e47eaa38ef6ffc346b4c35268710362137fedd9c86d875f606db88bd77160d6ddf8f6ee8e07ab88f56901b5fbd63ef65b0f90e73eb6f60cde2c0ee63cdeabcac3f857a25a95e8942bdf4847aa9a85e928d7a4957bd5fa3de2ca6de8cd24855d439e762c5a17e7a473d6d817be1ba7bf08dde1b559ceae34fef5f41e71cf5137d87d18a437efcfafd45604dad7d5b1000fe7efd4b62e12f9df9ae4ee767aa6c166a83b53638bdb375d5c76abdd0eb3f3f5a41dce354a3778b8669dd3b9deadbd53baa42d6bfabca5f875be05e68767ef30ec6cd4e58bb95b70396fa8ae7344d0ca86ae51e7ca2fb014bfd845154956c25e6b805ae8777c5713c2a3c15a218c1c57bfd9e115b8c08c288277600b661a1f2e5bdf7a2f7a27ed17bd11375fc07ada82d1994587b5bbdeca2f62217895cd45ee4a2f6221cb6ee0efda1a81e81f3afe8db379148d43deb15bdc8fafe9bd376f48ee32fbd8657d2a5fb5f3ebd1c5551a53c06a358836d67bd4aa86b8a9e8401123e3600b6614142075b8ddaf3317dc5cc38d71f7e12f667aef8ab23d05e675dd47fe18e7df2813ce8e4a7afaaf9b1aa6255dde92786437db30ebbd0c6b72e5b37fd8c3f2f7c62eff439efa6aa47a0ad6e128b339ffa2bed1dbdcb69e76abc73f5beea6f4ebbbfb01a188534ee69383789eecb71b4e63c5b517f4735e7d9e85e54af55739e9d554eff9ec2a013d763aab15e776f93b092d18b3b5482a8f4d86ac44060c3dee73ceb2a874d51c266b66199a203151eabc3362c4580b155bbb46129e28b25806d588a9862ab56f1bcae5e254892bcef0b02ebbe6b831662384790d8fe661b76211421d0f2bb23d0769b6acebb70c75a51fe55effcea658cf16b60edaaf16d6014d244d15b396ff4570dac411a1a58830d62ed65a36ad587592f74d6fe5751ef4160c5a1ea757d73daba7f93fc9bf31e17d6897b21561cf7fefd5eeba4615aaed73dacd089ebf1ea95a4958c9efb5041eed2e213db2fad2c68b316161487bfeda5d33a713da2cb9f813bf6e63c1ba47980362c5280480d8b941febec834e5c8f7e67c50a75b027c4962b7402ed0c2a1ced71c8e0acab479c75f6d991d5ea03aa3673a96b3f468dc77b3743d59a8ff70c5f90aab51af85a6bef5e92e726f0de7b0f42c8950ae62e0d039d73a8146d5aa872a788060000080083160000180808844282f19024a931e37d14000d6a8a465c4830140c23922409521845318c32c6104000208610631052101d07f36a525cda76f6833a87e4ff3e405b5ca6ff8147162a2ae847b235868e6c6b3c1e80bd0d9551084c2dfc1cadb00faa9cbc93a82e8d640c66d260e544d97e88ba32fee1282b491ed31a7046de09a098fa83c3d12b752b570acdced491e333bba026762e6b2d7cc199d0f835432041aab2dddb6363fa72796451bdebb1a5b6dd99421f5c81c9636cb3b2ef44df5ca0652487ff57872bcdae7df5cdebf645e8e456c4bde46234b1e3098df2a7b80b88b5013bd1e1de6c4e50ec8b913c809b53d2ce29be28072133f8d08c4f9381335253108b05f15a8ce01b5c53210b41334c2be26b4e194f268c7694b1b04e986496e801b1a53d705ed47eda370ee10c71a7fe1234089ea5c849768a1fed418288c2f352a4bd4c52710b2b97625d8195b0732fd8dbb166f82a700867f721b89b14d988d9c5c5c5a07a15abffe51b5153ff64fd98f5183e04bfdf77ac527b3497e25ec2eaff51f851c07f52f42124e4546358f5f2fb62aca0133a0028ce3cebd5f063b21d5b9377d62ea89f1d8a01a5e8b66cf205fb605cf4323b3247a157d3eeff2b698bb8f7da9fd1748d56ee0d435042eb1089e57f57030d9ed5d86551c1b2e1dd7bc1d3cc5966748f4d4cfe51fcb078adae8b757d0d8c5a32a547454467a1b45443bb7216172eceb8645e7d6f7d51c438553cc978cc33b6468a5240e9fb55cee34a6153e8c689eed18ecff4298cbc7073644fc32febb0fbdeafa4cf9883b5c1d4c01022561aefab1057dce53a1b69d97d8393e86a48e6fc444562a4deb8e14ddb078f08964e5ffd37629c75c25dd98838d50f075ab48cf2bcfcb5e5cc7380e0d818f132b1471fff63b8c86373cf3a74851801d82c0f2f8a9bb7268d18b5645861edf1425a3758b934bbc483ed352c89fff1426f117be779b1c8cd30e863912b36b0ee17ca5d483198eca501289f0438649ca5a12431aed0a1e8abc1a4c72b997c2b3cb2ef7336459568d36d77c7fd8036713dbcaddd545657c227b23730011fc3c5b2d8e094fbf3931b086aca6901670218a0884968dcf3fd3d70bf4e6a481de3a57cd411ba3b08693f42f169a2104da1a807e1714aadfe6f295c9adbb118a7fbd294f7d0de8fb6d771af8e04753dd1d5f375539a41ec4d0729044912f432caab7a5ee893024806b72dd43bd7e14b40aebc2b1906d2e0e14ee06a6156690062be4733c6ef525e632f8030435f2b0a49bc91e46a8100448a180a3166a708d664f5b0a6e824b2c351e5d8e70f07ff9e0fcb9667d41647d92bf3d528eabc4ef69b80a1b855bfa367fb765e50985d29d6a9f640c50a7e3b0d503c9aacbeac4e17cc85c5659821ccdafd12de63abf43397b70dfce2595f1dec2854a1ff1651ecf8bada494025434ac41922ea61584c37d134951cc715f96b56b8f8693abb8976080701043ba38f5a1094ea8b9771b1b9bc0496db7d6fdb16464bfbba1c80c6ad1db4e263d6a8d60c6fe1169a3dd716df6654ab6c194315148984b25f9358211c9676ec116f873d0a2c153502dc2a162d1e0f0482a796db49ef52d8069d6970a1b543c9bcf8cbf90dc20b6a3f3307a98ed7058a1e9ac1820be1821171e0c6fcd0772362aa8a8276f9d6b3da1901bb9328918202511b8fd59f51a7b6a7f38bc6b02fa3c69c3a8fea3eef508c7a5eb86e343a4c463d9042eaaccc493a872648bc18ec398e5614ad811f0db7e87cb574548787b29c6743045900694e24c117884bfa6fddd5de2e0378fa7d88d028a87be7e228ecf6b2a39aa5c12e911020589db15f8be64db95b71bf0c4756775b239b787ecba9a8371518442569b505e63227f5db5eb0cd2916573ddcd7de0afd6902ad3ae8aad4dc33350eca218be0a4a30bed231e88011a2c3e0f35c53276818983c688d2a8ba498f3c1d11b93a237ff16d955edc002526428031d2f689c4e22cb8533c929dbeee9f5b88101c6331f2cb986b24ced3444dc88a24677661af615482a63d6917951b1c08c0ac9120fa09b32e161ba8eaed15c7e3d4b3521b02476805a23df89bb8b703cf47f0e5d0a8a417f76c41191ec6f8a340a2e4df51084aebe051df8d9d4bb5f44e2eb3518e7c2030ede6c2ecc3a0da05eb38b467f22d1f9b381a237c37243b7b1dc0759f317588e823e994e5151a7c0768fbe8870ff0ba8e0fe6961ddbaf1f118332fb5a9de6e5671f87c24cc1bc73dacbc0bab5b6a1dc2bda45759de22e5d10cd6fa78e2ded304e2a288387ed3b51c95178cc0a06fde85150036640200007c581cfcc9eb68f704155bfc832a3b462e94076370f2799d75a8c917700194dc5b184644aa8f091c417e7d0771758b685621f7e516596840e8b836e8453e8f8c376d660c0bdd0d2706085750a2229e966b3f36ea71afe0f6eaf2b50a6564b9397e4cd32a8ded66d89a17b9e601fe43568b1faee63f128281c49c6b3caaaab67b276173d058e578ccbfb3384b9597123aeea4592d85e3fb83b7d5b54f614a89d279fbeee00ab515c144b08e29337cf51f3e275641363bb1c4738919945332bfaf2ed61a03186876713f02ada1df41d798ab793bd2541b52d41a009862b53767ead53e6eee18535c65d01d1422f6509a599a72ac7ed80c94dbbd73930859e187aa9c1a4403a338064758b76241388eb7619c352fa0ce999c0d62db27fe2961c306c1422f17eaf7166e91355e2aab9e68fe25d04bfc9591db373fc12e55ed99dbd6c433dc7c170db92f65c8ed2c540438f26b6a77b7f7a049b63366d78af1bff0f418f1105bdae699ae84c2254af9d81671595f23bf62a54eff2b40075df837807c8f428705332427c5cad915d60e03c1b9f0d57f6a5ade305add67c02116bcc39be75e09fa0a8fdee7a050901c1bdc18b5c188236a3fad2656926754e89ae2d4077f54faadd29b25eca800052d284a8b314e652c4fb0fc130c7c8c8603edc9d5790aceb3f64ccab86772401a019b7de4524e654aa8289d77a9faa0e2a0873b4d1bb6d4bb2b152b6e963f24e0700fa62743fcda5a5742ec6407ec4614a292bce57b02a4608ecb483ec38d243d99e095872297af9e19a9046da6ef416c6d4ce7ab494e18eec3b8f9360e1bd4062a343dfda09445323dd4cea18b92f462b38fb3f039b8a6494e040c83cbf6229be1d58148c641ae960f18969dfa0dd463e8f44716af7642d7d72b1f3423aee8faeb671e61d49e57c084e3035b3ecb05be6077cd748b4eb0273c0b04140d10ee120ea5ee235f21c01f84b89a1a18baead5d875f149d70484f01257dc522cc7172d185341dc5205c9150efd1154f529166b8a2b5363a8ee430cf8bc509116a26d0a1171d157488e6d58a43e3101a948f37469414839154473bd45c251b1e7f6b7b64534aa41f34a01d11e36f7c9531a11445511cb41481ab85bd6e9ca83cd0aeb5502aa2ca0c80b4adc38a4ebff4d33d827824b84a58c606f62dd38aeee14bf1f452449a6e3d8ef3f321f141af4c26332964d95daa64d2c82ca8ff919aae5527ab394ddfbd455806614a91c37727f0f35a34880d8e0c11c54a6e72bdfb68b975fe241cc40a704c4dfbe11784d0812837666a8fcca22e63e9068e9034f7651a7fcbac79782e3ed79ac6e0715e4fbc1dbc67e81c94e6522692dfedbd3dd3ba712e5aa7501957891354df1bb7a045ec0463dccc23f8086bf46b08f12fe18b9b5b042b2989bf4a37e5c73a25ff4e59e91a66a665573506196329ae472bc9cc032dcb2eaab4d1994a8308520c535fcd2a345285bb25c184fc6aed6824b1a0bee446b92ad25f44c055c38f74e486c32f83bca7c809710575fd882517cf70c09c9ff99b017e50a2670c84e068fda2b5bb93e89875a53411e2254d940d074ee1ea507cd6ec02fc0e073bbaa4fc32f4e8eb25bd5bf394b671d8aa74094c505e686bbfaf9bd0f13ccaffd1c1e7c8cb08ebcdde8663882675c9a9c2434b48fe43914c702f800ae8cb50fe13f107ec9901bb23b3182e8842fda6b972b8ae095e89bec34b68d7a0588a98e26f2b2cbd536449e9af0debec463133e1f1f90d800758a32618a339b081bf973ec0e908aaa2633ec07092d9baf9875fcd019aaf7052e79ae491d25ad053dc1a959ba65e2b928d30e5c6207d0cfd496eb76297a6b216d4980d119d6ce31306015006521ba7a108b068811db4c1de0f1bee778780a3b80a270e8e28cfdf2c8c827ff9a2b6f52b9ebab5a8be4af5c45460da3cba7e25002123cfb522631a8dc828b39790f0019d7169d90a1cf1caa7b853a0e880337172bb00598977e1a13180e7f418336b5cb7eae541e8cf1b7540d7686139a439793c57400703fa3fb3238bd7302b6e4b52d55e3f0416edc6faa116f2beb75d17aa7e694fdeddbd7e3c16ea6385f50d08894783faae27826e84e076e43c858d8643740dab7f70f00bbd608d8aae40121e81e34840f40067a244b4d2712848d039275771790f17fb2330e80522c1a1ab40ee43762c4c2ba387da1ea2146dcfe5e091902af75988bc1907596c8b59363b848cbd999f7ffc7a7d98bdb46e87d54467c6615f1078e4a2b78a151c420d727c7e6579c2fecfd9990e04c106c60dac3cfde03a27036d0d1858715fc6ea581c75c53ed7105d4a6ff260d88f21a03b4a9ed3361549ec19d0cccb93e87a04ad0fb188a35b3ba25d8b700b4861a6af32f6f7bf2015d5fdb506eb9484aef16f08a1f3bc881ed03122968fa130dc73ac4fd123457307e84c94346c5c6e18947c14924a1a6e5ef303bfee0634445e08d90acb6de5e5f5412284f568653e46fad9449c64fcd295a166fbda95d7eb408653ae6ee44b1ade89a0279bbef752eb7fd47d2568a19c2ebdeaf4c0fa8f6b76edbee727df7818a4a743a7649d8ffb7b9fa33fd3de70499c9da35250315bac60c9a298e76069b9c2e928b2d875e6122400323df30533f432077ce8db4e502b560c1e46b36a7604a180817918294a9c7515915326a77be53932edeedb8157cf08b53b60c5f8d27701e6fa53eb3d98e4c17640db818d0606e5a2725a7f56b19428151f6c9a51b8531e9088f38329973c6e6dc3a8115ea8860ce2e6523403e6335985de31dfc63957c57743372f0de9826906f1c94dbc3d9642d8e06cecebc6436622a50fdb5bde07c00025f03b98f00aaa16e8f153839caced58e9a28bdb6271cbe0c2ae33454b7992c8ac11f88bb91959077d6f3bfa863fcbe86ca6467585024322802b461aa671adc8e159f88c0d622b12a40a0c2d540abb620e7dc5fd8b11405af21ae7d065d1ae8f8f7ac64d9d3bc28a96174d34db59709d6f17b260d0e0a0ea2259cb9a8f91f396caefaaa1c12337b30a66c7b30fdacde1a3e2f859e2c452b8e860935a2da7bebd0323074ffda3a0a28a270e760d9312a0a0e6e19bef5681ae3cec3d24e33641896e08283e6eb707d2bd33f128cefd6730020cc68f9e47b405f2a282df012bd10fcbc67066d5ec9076d9b507371f63f52395cc6577c4cfeeac4c8adddfcb6c10bffa85989a2de370c9ecf2f8a1228d750da8fd45b1666c0311ec948245154b5185d6e8d8f18c68cbecaec76613e670db01854518e7476f1505cd128d5b44d811c5613a80c16ad1af20fdb098e94466b47e414f0fa7d486a7d183cc49b53e66e9a06dc7d2098ab08506626a19c027f076fe4cf5bab14556b56011ff18ffbf0489cae60323a49ae2ff2a4a5672f2f2c04d72e7a45ec30fc9523cbac4e57459668e870f9a91d0c3e6fced15f5e9dcd843a4d32cf0790497df230c05ff39b1ffe8662cdd9376644d3a18c272c13682d06af5b4e6922b9e97fe16a39efd120fc285da3602a7cc2d4cad7e186c829ad945452c859b9940a805fd6d63d8e592508e35c14a55f3dc10fd44659488f972ba50ca4d4fd99a1b55bff427c8c9fdc8c805f9048b15fe79c79054e54de102f1808a8e0c2139ac649b38505acecb79903d1b327573d2ec021f1f7c4e78c4dd8174315e9a8d00ef90ce45a8b014a5899a782b7be3857f07cd7fb6994a3987c0d452fb63a3d42b71dfbbbebbe394b90dd8ddba65c3f0b00a2ae8ab4a9ede564f69ee85c300e68b92d3313d5af261be446292850446af2ad9f2418ffb6ba3a268fccb564efec9bf416b74d0f49a42a355b200567bb0e7af7b0341a888813fd30a44d183a7b5afb869652de574777a52147fe3254592f4b5424f9015992612ab933a447964a71a897c1677a0d5c030d10481b210ddf1f5790f88fdea3fe1b1c964d8642d90ac67ffd613075b0511bfa65ad0ac8572578e706aab1d0a85802de6f2bd181d55d91abeaa54e6009f1129f2123f530111ebc4f0cfee23bc5d1e9b85ca335a024687db174893d47a3ab5cbc63ba63de460983b0c72a09e937d8603ec2034827caeb01ada8bf68e0fb7552b5c1f4966fba2c4c7aa4016fb50ac7eae5a59453d7296e75e9054ae38f3755110c338d109434d86c36dc8dfea4029488ebd06b6ee7a7cf40a53b06fd785ee7109059a31ace039ccf5e440b7b52a5695f006c8c95c5362788e62adbb8f105205ad8703ab3debe163f4a8a61902be91354a625124cffcb22ca090593f5e08c937c1ecc4e1bdb78f5504cc4f934bb7b78195ef0aa07c19287e8435a56bfcc115f78692e4bc790275fbdee1c8ab3ec7b98861b6700a0591899ece597fad9b871cc252dea684d7a6801b81d1100c091e2330a9e2b0d460dbc0cc612cd519c0ed87ee541e29a5c3ddb142903909d36c172d85268fcbaf1468fd27db30b882ddfb06a50d75c1e351ac13282a97d2b8d258f28cd7d1c0a202a1716578c1516b25050eba36d163f6a3590f01533856e5a66fe4a208571d2dc2c774711be4557608746e56a105571409ec112c0f13608010d7ba789695e795196959968c8cfeac8efff2625bc3a17ca33b0811511aaf213ae513a2a554496b9918a76c13d9dcf93fbc30ad034e4073138e84870fe6cc5372e485cf9e7c8c5c0ef114e28b0959e206df908cb2f69166ca623a540092220e9354a886e2cb0440208abf8c4be2791cc491fd8785c622832daa6cb207c6f520d05dc82c1a92ad18af803c1530e3bb0d65488e2f2ab3b9a33868a82e949bbe378a939ccd7f16289127b5a81c29ff88cda2d91b8f923f8c908042faccdbf3efd7f13adbe18e505b945d2d23a6b0bc23a63020c920d5ce36e6609190151a7c901ff7f8ad3ed744ebb8118a353378b959f025cf7abab48e81f83c2971b97d418672df9ba9f0b6c8d8d34fd285f8d256d22ac660e0081639c1133ea7e7d3d76ddbe8c36ef3684165b4db8674b7698a376a20795401e2e141f884712a7102fa553545c73bba36991a7afe5012d858d6a7fcee55c7068161de500f384f6330abf0de7adcf927ea3bf090978e55045eb9e5bc1fe394ec0af31788c1f210d880a94abf08dbf30de99aff1e6d10f2153cda92741af7cd0c569a2c1d7c7556b42496c5a543751dcfa8c2f8d801436380769fd453b084882ed318562347717072c68e0434dd84e42776d8424bb3a83a49831c26b0f65a32d13f1030ce083f557447735f572825476ab04d48bc55ead286d3279521079879d2e5f29d8196c0a97014fad16ee4940fe71afb19f11e01a8df3ea2265fe42dbfdda51c7d08e48c0bcefd3f42405f8e087875e40738c1a6ce6b95648a120e03b21cd5944d019e1032d915cb838a58c7ae0e41d6201c1593d8be5fcd1a07d043b763b0493d22108f758c8540d2f7a3d04cd151fc51b281a3a1cf57a7080947f10773351ca0aa6818a48a40cb1d9db4c20e0413b10c4a7bc3b31f218d5ee0c4e8764c7ed3d0623f8e6542d0d92b4c27e67e043d0a143c8b0fdc1260b6b9f4631c39ad48eec35318ba0781321cc449bbef00db253054e397e62961c03b03a619a8c27a4147219e0c19b359f1ed06457f20e7e57e1e881bc47a289163ae63053d1aa1f624bc094238b96dfe4a6a36ebef02cc51a4412480b81718d48466d44c1d284166bbe35803581a449696b1db2eb05ac1adb83a41e1d4c475b7b2e9e4600d366166568cfe21072d2c9ea363555395913ddb9c2f63aa5e2321aaf71db0db4afc5c71402cd29d4ff7ac5d959848ea858090a0b72c70702a37727d6573d6960c928ed0135146f6c1da3b1aa7bde82235db7125d4114efd6dff72ef9b560940cf2f6711666a8614ef573572ab3c90d2d7ff761156bbaa6cb1820f03baa2bfdbb9d33ab69c8d3eb7a50c862b88d1de38ecda5c06de0e75cc40adbc9d47140fff4c6b7594c2aa7a89a4e207fa4c1eaa7b2934d68ecbf17d17bd0cb51bea793ae65af27a97c01b5a45ef8cd7e0160b56dc6a7f7b9d5b29b72d06c54eb0fababa570fd7f41aa60174f6d6350239240216488dc756124b6f2ae1e0729e3aa9726943b286b6a6331763865a54e11c48ccf85a26002070a90b4f506c16851cb76a30cc969a4088c1d2a63378a1f7155b2d2cadd1b559780e70a3f4fa1a170d828edbd6661db80e17524eb5d253cb800dbbcc021b1ad225c30a6ccce4e2ae72cb3088b686741f0dc3d673131336d45d172c161722b0a3dd0aa912bf8cb009ba09ea1a81087f25a796db497c6d6ba2d91de941c2b9992d07f274a36d5c40fa2f0e0e69d34520ebe13d27b2a17d9de424493e4edc8a2e4767a78a4e227c0c99679b0f9d63926f6090732ac2c7edddb4ca8d3f5b41d9489884cf79d059ee24001c5860810da49194d8879c047bd606c3c7f70813c9333f3a618c74cee5078e250586b6933da4377f0b51704ae16762ddf52592dbca0f62ff6b80a03b0ffebd7a39472af8af96feeb628e56f2a6ab2bf71f9c750a6b96b49f410d043d9da4d596ea6ac0592f076a5c5181d7443c39ef045476f74d07960593883107f036c09f10383b98b3cb00fff8bd0b6ef8343d3581dcc45f56b1ea1e54f5aef1073995a02a69de1820e06494bcc9f9554ba5a469b3fa1c00b77b0839ac08cf52c3de4a4ef9844bdd7a342d27854cb20d67b03041c7f79fc649b0f5a81c083ff586cac7237e3ebe035f5a9103ef10bfa09e81ff832b80a4479056154e8cc9b06493cec914cdb66833028fff31de86b834545fef14271e3d30c489cc83218381c5d672fa4714a8b1e380e947d1cd64814238ec862a870bd8de5223979bba0c74e485d9d11a3752fc5b9e1fe207b41eccc46acd9f97cb0561896df97217ec8bf8d750a38e7f1ab0057a5c62eaf2e1eb4103d90608ff34945ed7a6e941516d277e278bfaff87f41646ec0cabb95257980cded5ebbb8cfe734da1cd8bfa5999c43352248933eb67368d690655091c746ea757305f6c764e01f5b6788661c58400ef3597952438547f91576800f023289fe0985e874c7900356b7984d26f21e11e11f47352d564c806d75cde7beab408554de0f29b9acea0dd9cb71609c986d3807e87eaacfcb4ede9e7d737e24b6e03c1b0f754e041f5629500f40e5cddc836c4af7383540c7d29eae388b721b15d490e72cf9464c90cb353f3eea0f8fb8c1bb52affdff3e06f10dacd014a78c8fac9cb862899edf663514e8106f001fd3ef92a58c6c09564c15a07e3e0cfc896659f04656014760d787547446bc56ba2930145b1779611fe55588ca1414db3c828936004fc4884788685694b6e745b89bb499f8e4042b7f9d5827a547614efbbabcb51bbc26008fadd7507d3a35ad6bec76b246796795a0715ecd445207c29233d25fce3aa8f51bd706fb728180980d8f017028b2e8b1cad70c5d1f1782e3605cd88476736e168a04e1be77268116d10e7b2f53c1157bbe4b7829ef86f21f916942e98fce7d12f7afbc80fb515d7acaf775cba1bddb5c4e951e9bd8a8e9afcb618a379e19ae92359088cb7236955cd20cab06c41f8cc46d79fb0fb3371b1daf7a70f9785921d31b11e50331eb2444afa7740e0211c22c67fb48421eb5a319f301a152825eb06a0ad218d460c27bdd93a7776297afe638cd49200244cd10faca433ead78af044a6047e2f6ee9c876b25a041b84f5c0e288fadc99417fbf536af3394bd6f325d6d9901b16dde08d732efe5e174b018729fdcbab7253fb7fbe09b0090f6c9f8739a21e0f42b4a5af8a11c52306c8304657bd7312a4cdfc46eb2ab0f5f6bf761556bbfda86837fc3bb999ab89f10a8be58dbcc8e794d37ca91a8008093c4efc05f8fe491cdbfd7a1b62dcfddbaecc291661a4576f1cf4e97d700c1161e9ab2e310a570bdee4ddeca2954a58ee905bfeb8a90fe1f6b639e1bbff8cdacb0f8155a1b9fca187e44416df75f94879f8f27e9d9a308d2d06f08a41cb15ec96ca623ab094c2e9531802d101c4d48f63033f347ca3656c0129bb3ea60850dfa9e411ad362284f75225f881794bb663beb9bfa4b980019963dee1d6efa6fdf1cd86f136d80dea0c9d0a939518a330c60461e590186c57b51fde283d30f9b42b1b14146d11eba2846f6d3fe13e32585260f10ad3ef77dbe51d947696f3721df4f52f34b930defe50347d6f16f8131445a92091389aaf760e1811d94e43617c298fccf263580dd5de2ca5cfdf2f52a2b6330626e63afaaa8bd1a38cfc5070678e6e4a8dcf776de8ae6c9e7a053b5710ba205c37a1d1209d492868048541da5b7d6b5595720bf7147106931a4b8e818215010976bf6f52c3a65e83e1258601b9dc19692188537683066c410b2243a0ccbea0953b7866df2341fdc2edb6028d14d1fcc29270a1f5ac2f15ea40c20f33013681f75f05a5bf86c902570c2a2acba15de8875fcd397a0c7011cf5ebae802fbc59f278b7f27b96e5126af88c5914806d579075b4f61a2315ef495d46c496379e4486e07686554bac8c5efcf7eafaeb32d09efa08ac83adf7fdac520ff349e235f2de6ed6d3650f6390e74de79130a562fa53ef23e771d3b3249ab51cad6832c45a04ec50f362dc00ae353d4722e06d8f86b258b7b0f8c48a523f60185eea692386209d523e64c50a2bd6389c00a695d37c94fbea37c194e8c646e65c87721ca64ab01209b0404df438f2b535b972e4b2bee3233e4800db3f690a5af630861578a96ade9ff28e5e0379348bf1b78e7963cf9badc6082215c9b90ea2c4dd65e7c146cc0020990102b4df4c28e2e903a87c94573914e4c1542624b08b9850c24f4fa04dba9921a48876592800db17bfc93328636ba95934e96545b528a099dbd90d98aad25b7d55d0027cb12c3fd860514096bd3fd10924eb9ebc76c5a0d89a0c3a59573a74a9358d311f3fc18e794220762e197edf43f5b55a08502945e22bb64a04677abab6742ec045c7eef5d9f023f79b0ed73dc6a3eb3c9ee994fd582f0c0e2cda8af7780901bf89460109c957527d60321bd690a7aa6866b6a7d17a74f2737fd4b3e4b9be6593278b6087d8c5991dc35f0430d49ca006534c2de610eccec78a00f0dfea3121cc91fc8833bad69e9ea11bca6e281e4b00fb28f3e386cf9e4ca9bc324d5976d732d068662525f1a59d467ad62401a65a9d6033bf29d6fb57f67b19003a03f815f95ba582890589ea5c2603b13d5610857a66031fd12c2c16f405e5c22e16f669d98827ee5df5bd474f5ccaf70f0abc1aeb55b1b5cbb231a0ba8f4662b6d622d30de2eb3919d6e8a542276444b674b14da542d9f0ca5fda484c1d65479a001317a0667d130d74ad35f1a6994d96ee4f6521b408b858d7faa33479272b9a7bfe952da009e55fb246f4ccc91a290f824e4007d71906885e7767c918983dc9121a8c7fa31df3fe7134f4c574769aa92a228a161c47f52977cf7d43a0f4b8418c20b2057dad18f7e73a6006e45f95ee8f0668294a9ac8b71d51a1f2d8763bb89029996c0baf47e1df20e67034bb1358088ab0b2af0e816229fd51d36f64bd11f2810d8182b7c59137329efeffdf268cf93bf5c7563a0227a1fd2a141e332a78d58d18a71ef8308dfb8e04a14d4c768602f50171e2631bc000bd3fc0dd56c5b7c879e0c4c0c14d7b928417dc87e0be4aa34a4461f0294cbb70d9e75a26c8bbabfe9cb745522c7355f0672b9067c8789f66048b88e13e5d833869e07c18f837057228c1f121dd22ef7f9cee33c6d52ddf13133c82ef89fbe658706d071f612cfeac7993de28053d9aedb529d1c54342374be4506fb4a9f1b7d3af71425206860023a3a6e3f280aba3fec42b5ab10831205d0246c1cf0ebf039d4d1aee40c6802ba34f558627d6af9ff5bbca31014e0b48183f1ac40feb5fcd63b6e6ef70ca8c4ec4ab6a7d28432237fdca6e426b5a787eb9069dd98440bec27d06f0cde99ead295ed872659e3fe3db8b3a8fc425fc557b112b11552728481c52603aed4929d2b1706144d0028b73d0cd98183c09b6e31b027aba0f1c6a593a4e4d46ade17b664c0d826094cefbe99276ec92ff721524ae689a933ac4014a2fb89c4f92f3f633d4e5bf4238a7bea76622778a97638d08009020152c0e290819d42118310030090b1f8c8eac8476f445f72c09b82043eec9b81b4faa8d838c06ab9c4e7578513f7c203781edccb25d8948dcc5d5165c9ee90cf4b0c6a8238f4efd5711392a97fa1125aee05909f80c5ed94c251052c816334e58a5cdbf67d8118f49c15bfb00803a0694cde08d29931797dcfa09d4cbcc393011af2c37ce134bbe8daef2096d19a8002f86e823720fb200b69af40735f588b42c85d2cecd4dbacd25a124f166f142d94cb2a600b9202c1686e8c28e57884d268209f185d9134ab9a1afce693dbc58585abf5d6435c98b4c4a172ae313dc3f5dd606a927ce3091f08530b0da68c5f1b8de90c0c5fe1c27fec2722a5d546511b394232e74046a0500b31aa438ba4f23cb48df590d388c2ab0e2d1fbedbad31d29d5e77a832f6bb222dee79fbe81e8c95c3ea6f917f0429e611dd89aa4c0735673bb68b264fdf180f2f0bdf50100956d3d071c4f0ebd9d68157ade97eb697244020570248b2c48f0ef9077715302f8014f85c8614b8fb3a5edc56d1aaf05064e69b43eab7138241103cd529800e9909c12ffc1fa82af7bd764964d2376acc8eb4b3e32ce0c35d714aa28c09535c527aea7581514cb2120719af385e7654061b365c796df8e714d4b8b8d79c9db5e2701478f4fad6580d5843ca7429d652e753d0c1344fb19e5b422bf7adfebf626a9c65e800ad1e6548284b096c692ed1144c5d88c663143a320dfb59856559a9384b2fcfac1b73dcf580082cbbe7917c5b935ded98d45404c4a0c6ee93f470fc2a2bb9c6248e0509771798cdd023b1ed2bfe02dfa31ad1e70881f3c7209404f6d4245f2f39dd71c95b9a11e659e4d7bd6984021b21c950a8f4890cf689dfcad99257750be0b9fbb6a127d001493cb959c7ecd80f54e37484f0da000bb3cda89f59bc80968339b3015fb23413abe72b6747c87d86c98d9a995b438796d1e0ba4992bfd887397032c81ebb3eb4fa977ac3bd06f60586e1c8ffba0e933835603f91d326264ecd35c0a1f591a0743b88e08be2944e8231139f0ef65b962a50a59138453be4a73e945b53cf63140f4918fe81f15bdf352446d9628f81ec80a66755f45df32e2ae8684f190762ca45f2b9b001570f6854696d8b9955775003fd619c3698a3fc30418e0271868c4d34456aabe2bbad348f3ca38009687130149990e3477c27c97c93dae522f911f6a674cf7de3f8bb635b7d2b76b0a78537e86a03aae1705ffcfdccc562b2ff9fc47a7962ca24a328dee7c49076a34fc36bb7348bed581a94bf29896d018a39979905590a69cc57bdc8ea2d3dbb027670f35237267aab63e664fd09945b4353985c7731177eb5cf7357296c3e10e6f2120cfd9307ae06344c53fb8d1209a91c81a60fc591c4bf211d23c80f6cb22099a92ec438cb41f36bbdb0b1a8001576f66aee22a0e69ad535001456eff2d07f846bdccb5158dede05067eba8505bddc7cff614b321398e7f1570e9f27bb65594de3bc238596893d962b7e1d5dc9ff3d47833bd8d8a274c82243e089817176f177737788c61dd6be2c774b2d3beded655f6e9a91dfed754e44cd285c8a0a2722abfd3908440742a04d79ebbeb09271dc9c30be8c55819d972d0c1a4a60d424e1836229241adc7ab572149ac2e5a01417c68168f66b5d254dc9bdc44c75504b0cfdc8c6d188fb8f70b4b0b32a8c54f13a7a5cb30404c84f5e67ed80b615d9fbd27c7e4b0d55ee08d5556ae0cb8502030fb101a7eb7280a5b263c2d94806ed0414b823f2de1ae964a52633303909240520befa1336433b46a24c82b249f5f657785225fed5c35a8b17bde8fa07d6bef2b1c2945aeffcbe25c6516ae10353f8fe54b1289d1634146a856623b894616873fefc5a0a42b167d1148eee22acc72927cd98d2278eda90a8e57f62e407b47d3f2866f2c57e93a9682f575c2924803470eeb19a36f71bd9d6caeb174b9bfd31afba3343adf594f9145b5dd00448820924ecbe6a6cd90a78bdc26776aeb90a7669416725d00593ec32e5d12fec7e6003939543f870ea04efd4ce321eb2bf65b1a5e4c19090c00e3d24c5d4ce3262df2d6668bd69177a0d6764ddaf371c6fdfd1ffc914890e2b62eca127b5d57c45bf323012c544e6886a40bf425c04b344f9146711ce120d7859f6d3e7bf95ac2c0a269ac69a7b0fb7f81aed86cf0d154d43690fa8b56a5a322b0041bf7f5b62fb239c4279f211fb54a868f3e7c825b383bfe660b4fcd73fea5428913133853fe98363006651a1f3f7d1b1ae30ee909f8c3e71b26add2174f164046257f19c3cd1011b60135dd615e39712ebaefccc04254ce28c7ac189d493ccd4c708554b9fd1c04885abdbf29f6c101ea21f44f3594082fdd2af92707611c01a32f443b07fe90552143124364482fdb696311198c20286d3c843eda4e55109f81cde1f4b87ba51e1d53b19f0a84081d2743c364c1044b7f175116f825d9ec4d0ecae0b58f3f255c439d0358415150b5c0c250b8f641433454dd9b801255512a1b550b5fb24cd38f430b6c58709759209003025236ee189a4cab30ccfd93f9d1616717505e6cc9ede3a4605f3426c426b07a38924dc526b56b38923fc4c74a4a0b6708c9d5d6be24d46430cd3e5a0350266b4fdb5947939c48bdf495f1b7f09f315d1040e2f0b7e974c027267cb40b8d97b7a9b36948424c01fec371b081e82b4fc2510c1c78c70167a6cde6fe5edb12ac03ec2825bcab0165680ec59136270e26b7f4b91c5f88b45dfaf97fc54d23b6bd615969acb7483eee8464afc294f24815301eaae2b10d035268379d61051ea874201c9d9c513a7c9651bd72d8851e68fe2b17941eacd8ce7bc56ccda8554f546c56d2bf6bc84bea7c338322d2dc316eba31e1e92ffbe8be45491f51e08dded902d9489ca8ada5f49086493d5b92484b1384682f69982bf14976eaa953c884c39498c7bf43bea8fbcdc77841a487948c56d7a90cbea9914b701a5b36db9cde1d5593ff6ceb3606da2c05ff6d6973f545c911796f2c8944cd5b34a9fbbdb411d40d1944f8e01ad03e31291de9f2324c7896b064fc143f7e1e4611216d3416a28708d9091891dcf1001f76754416944b532ef29e6df27aecdd6e517f1884286afa80f3f23d8618801acf14987152a1238583ac0c48b2fc974703c7a4267e815bf7479c635b54c66be3b4d0a2912ac4f961107e062d41f31ac1b6530b907bbd7da073b011c93702575e0916bd3d6219fa7645dbe442e8e47b00b55c6bb1c63c5e9427c2cfede5987237138030316f884840c05be7cc558624051009af289e0ecaa5f7ec70b925d80296b05112d71b124669eb27252cbc2ce2a1fedb8b7ea6b966c9a5399dfc44afb646f4cca1862d6f2eafa9b2d4ece360275b7fa38296f6156aceb2341ef33cef30ec6f0ccf260e7d2ccd5c22066611a2b74bb11298094f8825ed71c8cabcbeebee0b52cabb821de6259736e977b4200e6ddafb6be61653375bd0ef6c52267186e62a65d2952887db5728ccf0ff98d2a9fd05742164ed1278ad4daacde6e4e1d9dfdf68fefac97dcf6322fa2dd34b6ceaeceb4180454434d775dbd54f3fa0737ed0ec846194938a01f1edfe282b66d05a019cd293f1f685df5c851258fedeae110bf0d11ee0750fd38466501536bbd7a07184b77d508f81d9383fa1b37d190e7937887aadc603a4432186c5f389b700d548a519b9c39fc3ad97b2e9482f987359a54360bb15e70ed0b7c39b464d5e4a453dcf3f2524710e85339a72404b4880c448ee7fb5ebcecca579ec0920fc3f82480c95712038c23a87961b86fc4659df9ffea56f473089ece0fd572449c045c6e9244a56e6a4ebee5915767b1e41d78e10ea52d67d44177e7957b50d344cbe0302a1c754c348bf5eb8f2ae0ba731cc0a56c7b3d361b017d0f730a841a4d4542eb317c2f690b5e39e5bc2c6ca02b177b0db58d3834c0a8321537eefad0777ffebec418bdb78bc06d0633b1bd7fc01f9eb7d14392a0f144ac4f43cbd8b5dc50dafbc7081fae504813150fdc98b474d5ffc727f3ea8f61b3b0dfee6739b07d3270a0edd59e8ae523c42a92f1032ebbd481017549db0b26976a2d0e55174f8707bf9b71e23d7815c4af21a8aea08bf516365c7e28fb4ce2c34166470a0b7512a2e053c5fa043dfb7eeb3c0fbdcce71a561d3c36996c170f6ad9fa0be23cd1ed24252da3891119f5d85200d5edb2bf208c95d454b48575278c3241b25a04cdee9b16451c585d5c3492510799821e25e1d6730eef477192c5dd9b382c914080050e0ca0ce9043b742e61a7b7960874571e5fd0fb82ac8cb4aebe992e6c33c30250888bcdc0fce2c8ca9f096ff188f12d77dd290ab044242f03e4a0df9cbc5972e2539ccd60395faa26300ecce36a6dc8d7fb86326a57322b99fe28fbe20e566d1eba2af5a162809a2ec6b18521d9291b68e48c59575b9b617aff88e5b239462e0c0e4b6133085e4317dcfe231b1917d462b9a4412d427869e1617f69848d3b1c34ab35df6ea2eb0af028ec9c0936ca0de6be0e6c1021cab7a764ae64ecc48b52b0d5460d707b8fec7fccc05600e3b4b0a8689e8b73bf61c300b062d3aa232e0839aa49be154363c34470b5c90d5c58c711447d8d4f726b401146e39e06ea3eb27021634058e450648f98ef730f2e4fc89340718a7a4d2b4a25149755429f8cd7e9593cd47b78870359ce6a6608578d927b5e5c10734be9165ec4457d11d19719eca517fdd7795490effdd5891d35221390f649adf71741b37751422ecbe4ed1696bd2900535f08783953b9bf0c16e6d4813c2bae02543b105888686f8a48c81f8625c61d07b783126262fde875f00ea00245e13561ef031d41f12440ebeebb0e4fb4f560a03074701d490ef3d5b662c639edef8375ea5269e328c3e9f4c0928aef10f8139a792aac67ce1817d6e26ab00371101884d75e4f60146f1ab45a9500a2e470ec6ae39c01ac441c52040b1414999b555477617fd9d01c92b2a48d2a479ccfe38e27d0ac191c1c07c326a09c0c05bf0dbf6b1898ce37f0472c45b6f8232d03c4cb2838dcdc4d6e413d3b6780528cfb0ddcb18d9789bdfed9e79fd2c3059bb82967be020e566c68f80acf212396da752e0599230e4de788249eee0f098696881e887dcc9bd8acf9fcb1cb90fb361e839b84ea38b793263e797a2051732dde839658438d6f326a9c86e9ab13209775415fef87de7d3e95b9ec5cc14aa3638a249031411380251feb66526664fa35c06e212dd3ff0c007a5d1655589ec010459a86d33d4517df62604b025b9e1d4e3bac73a74251ae617bc23f4bb482f79c65c355e220fa45f4b737ad5584c44f1f4f347d75000b738e631474f079d98f904b1f3fc44f5ebd1e7242e095402ad59348b5b6e4a818f222a7aa91b312155dd8f4c369f874137ed0e26331d3b064918ba427d3a4f6b5a7805e76f395b1f8fe6ed0c9b7e895c251bfdf98fe024a1941ae6664adc18a7e15be210d4898eade7c6162c5016ac51e31f93f2c3c660fcfca0c351ee88221237589def032be44b25489830aefc2107c7e57e81af3fd4c42fc064fc0d1bacc4fdbf9ebdad5afd80b35ba97e67e370f60d83b73e6453834fced0fdbaf26f497c9eb9c5f202e0840de55ddaaea95070d8753cf3f71c13d76a7f21d609234319579d97d9d37b9683ff5f147fd5e1aa96bb4a00c64f8f909b246c3bbc1427ce5633bb9c676b37d212673b5e94da0790c3e379a031bed2bccc8dc4fcdc33fad9ab7308034394df9dbc860db70ae5a909dbd858f5b3ca58617620f6d46823783903068574bce3859c3f5ecde8c856b0ac16e1125ca25feeffcb8ce75196489363c6fa810019ddac7a22a3cb74af4ada7b070998d1a1b2142b47c220315974b21bc0b698c5fcbf792b6351762638be3e631ec2079dc29689d1c590f0e37fd2606c69a216c96376aa6074e376a63911f723115f657186f330ff1f2bbd3002a288a7192dd698bf1d7f63c0d02cfb67dffd2b764ce387a5be7633314ba9b97dc5aa53c28f83e81341f1bfbb1a49de69225f0b5339e1775494b5c62072d0116a4f495de4cb77d256740fb60f69a8338776958b9b1b1d3a8c4f842632c25e063bc826012f73d7acee438d42f9d8b26823e5e9a043bea0380a186de162ef8cf4774d46a9987f9e18c5c31fe204fbbee3f89338c555c89cfcd2e074224c00f4de4fcbeeab83297565b4410b6907974fd08a4ca440fd8e639263d60faf48b793c82fce79d78f6b4294d7cc1c6cd817facfa1b0957ecd84baa2211d6d067bf80772ff5ee0918def767e0e81a603f65f79c340f39d2846aaef8e004a9425d16aef38d1790b3a1bce27ecd0c59dab8118caaadcfcb12ec1fe222dca5f967bf164ae70134f1a73e35fc14226af4599b72f028d6a105c02e8c6bc27311581dc5668cf6e8de3d9ee0431385458450396aae22de8e16cff61cca3d9282aba7af182a9c60134e7653dbaa5cc00e387e82c6dc0a560601cfa921851fd11d4fb58495dfc2b9c1e9f5dd4f618aa274ebb113f4239e1bc55ba616910ba45b9a90a3dddaf686f874b1d29dc4398bbf860da27e8c2d92bbb505ac70bcbba7038fdee22733e925f4bc04187dc9020151ce20a9b849e981804b0c41ec9d0295adeafe159ccf52147aac1f8c508bcf278b14ae74cf3a2bdca28d38dd904b14acfeca6df13867f0c5267ae008f2dbc2346b63108c4222c2828c923f3fb98efeb487025a2fd9f6d10b7e47ede102c12041565d5ad8497c19c4467f9ceba4ed1c28d562bd353c3a63e702ecb94e2dc2f3a952ea5306f346dd00f21e3c488a567e7af2d01aa6c25e4bace1088ab416bdd2d3c30ec34c4c1bac4346f31ec0327bc2873a68cfbcc2edecea080f57b8491fc3e9213a0b692dc065f18f593e0519c9cda90bbae747db901b7c600f954da873fdae73391e3528ed4473fceafc557e5e8080a51d43f1d63c862aa0b9f322f4f1f100238c157d3fad8a5ca0046a3359f7ecafb1751e5af381c106f42298452fe9b8a07e34bba11fa2f8658c45f14a4ef7f5f3b9c33a236c7d4592a82a85fe4f6940f08fe19454b4026cf79d34ced981ca3a3d297dc95e599492e27b7eda4460f26d6a98c9536fbbe3c8b9d1f3f6221d2d39f2e573a83640de541df1ed3a0ca6557bd4b591541058a409d2fd80ce2078a9b1f261c68ce16342596cb66407881087d53ff3e39e27b5cbed175f2da66114e5cf4c7b507cc23d14a7c6945076dea6e78eb16cde15652099c572b903f45d1197735057978ee58d45b566b4cf94c42b21c97ab94c9f2afc56238f9ac9b4cc82027b6c58a39e5593dc829351bb04a508614072d727229ae15cd1813497270822b834f6a6eeb3286e6edc250f382600c69751cbc7b6b4194bda9afcba18a752aa70407fc26fc6a803b92f380f0baa4f0479f244f044e68b96d882b7cf9b9ab01f35d2b5f227b1907ce3e0d422dbb1ca5eff2ce16325bc348a18ccad2699a1557b79b5479d40c876fffee443cec9551012bd18abfed611d47e4e1428df0179a933ff275e625a76911312ca07f0ba9723c3561916a7f108d7356366f3e9469fa95859a94dd58f649620a7749533697a0e32e0d39ba182b4630295c190269e3a6972dfd9c04b92878a73a5c8580c6fcddde569b8b122f7b45c968eda2729f0fc878744490876e76922e284b1b4d30b83d0d017688cba93e06c0513d203577aac687b4d05ce454b6e7a5db41251680865a75fcf6ea4ae54270fff9481f052ade9ff2b20ec22bef9f363c4d0e1b54fa4e8defc3537b3b8844ea37195222bdd0dda06389b477f5ac815cbf9af74ac44ab40b38604e55fd40ab41c4094869ed5f2dfafc2e398402b2e48519732d01e46f15391f947d8601960d1ba4a2c85bc9429be9d96c8e79aa0e5e1d685fcb7c20571a505e5ac49ec63d75c1b628eb53489cf188e293db78d160d3538626c2aad4cb8596366bd36d9bf84753f138ac50d0d2dd09e850bebed26d97fec199850f847356cfa4d1b5e7117b8b4eb33027c621cccd68ceb94b92e12203c9b99591b71fa12bbe87541aec143e56c763dc3aa65503552e70b83f0c01b77406f536914a48610c0d62d182c045637486ab9c884d3db11646b7601112892d3a04c04bbc33b755d6b6faba642d8c5f11a680c7be8ced62d8534d18e83e97c998f9f0e8aad6dfcf4a9a2320d4149d6f5892bad5d4361cc2b0f442666a06766ea7646a6dcb234ddf0d5a4a620d6749be239cc26e6a198d9caf873b9ca46c95f66cd8c032c10e71caeae035581964d7754f160fcdcca0166f439f9877b7b99095c19054e8349a8d46cf20b3ab92b36286e34b9520065c3ad670abeed8784c262b37a5d809282abe4cca798c5d4d4bb45aa7a95079f4c771f0c0546cbe86b63b39a333b38a2942654ab03c9134385bd83412ce3455a311aa41dcea6fb6341fcfc29b53f4bae30d4fcaa085a254a0d007770be24cca00eb702d28fa0545cd8214cbd7c328c4bc6360b6b293954fd9dea9517fa61be42a3bd61330d5cd20ae716f21392f3cc2f2733e1aa59b3d5403afc04c26ecbb43e89442282540508f0c92770def2056ff8b8c873863f525bcfb21324f6c31787756a891583fadb0f52581b454fc20603dc3c91e74a9903cffa48b50441e209a9ae399eb997ace63a0952e140978f6ce0621f75e9a190f6bac6c05d5a79a272bd273bc27f178cf1a958f572f3cf929e2debeb5ba7d65fa6d05950210dd1f33a21b3b59c41c8a69ee42343e31998af52ed399528a2d911edf1cf3c93745818c398f5ea4d825c42c24cc87e2a3d147b7f12750a8d6673938f1e3061700f019c68872b8836409e97df44f4784e6a4e71d3c222505c64692b1718fab92eace095038516b7bf326a17266ad5dd85e5910d11c485a7011f344ac838942c5074cf33de88981930a22a70f0b817c40bce24f133569851c54034fc8fafaafa2ee96cf47e736c6af5ad883c1fe2856e2238d05f9ac6c88c16e4bd2af9a2c2cdef2011133dfa0c224c62e854df310ab939e8ba4dfc0c84def387d043e65fe1058c53e3d5752227cfe460dd2b228d4ee226f1f8f84423121fee033162c2da585a819dbda929f0226c532c4fbc391a6e19a18a1cb609374aa794bb1fbb741c8b64aed42d5cd8948b6c712aa13d10fdfe34aac230d53c1c054dfed1c8526aef10ea93de0a8b7d2e8c32e02e571db7b8b3490168a60b89e67091aa6775788d5b6babce36478c522f15bee6e69de2dc9abbbd369e47f02718241124a6193eec11385093e5eea094b2049f015c9b837583d413b922dc43892b9818f2307c1e700c7f203f9b1c05f775979890e958d7c7503037ac91e2df6cc776bfa27de419a8ff61e064cb235cbe4976822fee08db83100380ed9b4daed97184f1ee484852c68ff07b3d327e261183eb158c82315903f2516d5b1ca19798d4c4bbb3cf37038e85c68645d3fc18e9858a9fb0739f2496cd7cac4b4a50e2d8dbe8144370cdee3c4cae6996373410d26e5f503ad2b4a3498799eb91a256045086cd2d15db9008b08d5f3146d5cd1235b5e595e7a1435e7fafaa17ac2f18830426f3822c83a201c500408b25e024e1e98f10f20486b89a6f861c2e4d26c3b6fd488caa2ac8620a3bcb44c21cbbe72a14067b74603454a2d5d184449b35b20fa31bdb1dd240dd2bb7b522584db49b943096a6440e4fe63d23abbeffbe08ab278d376f30054744c55fd7a75aa2e132346249506ed15c2e6d2e2fd35b9b1e844dcbd11472cb2470b5644ef7290295a4090d358653d70d8e1e50b569b05f13b1b67378ca21fe2419bb8ab7f78bbae92b5ab56722f332d888031776e94fd8b0115876288669021a23bb9cc0ac118652f1117c60e0b04ca59b8514c32f3194788d0ddc4feedc5ea0715e6f85bd663a56e681904a976398b8369cd8052baa1caa8b2ed5dd8933ac15cc6a010252614ffc5c3f155a6966c22fedccfa83ff9891e16bf0edbde97148dbc1002891220e63c7f1f994574fefb20108fe46fcde97d7365e631f1f8037aecbef1288571acb04d67b336057ddb9a4971dc3e28ebbf7d2e59c95355f07f8831887174d8b0445b835533de205285f0082fe8054c200e8acb6645806f3d8c0b46ac93e37459a974654d2e19171d7efd6185ae4ba459678fc025ec8d3f26d884ac32ce8cfa5f2aee3e107306d9abc502664c3878924ca720decdca8ff531ac0b8dbee3107844e5ee0dae52dd243e21900b0db14157bdf01730f28208ccd4bb68304cd052c030a53c97a5bbedc69c857cf213f1677e74aa0c0e727ce57a2c959521b104fb3300c801e75902caa34f0ee3293c9bde3a49c407f85cdf1c59a2827364d7d6ea56609cb9842f8451f4b44d2acc1d2523f4201b0a81ee1dd91d63caaa59be02cd30c6951148f4003cccaca01369e52a8559b137cffdb6cc3428d9db8c8a9de9cd34205858f9335b847cdecf36708f4a991d41b0b33a825eccb0e2dd6b6adb43a4948a68751860fc0973eca05b6824e07a9aef0f6f184566ff532316b399f0caa21808ba50383f28098026e20f57149722c03055cfead293c94a93fd55774004a9cd32f795fbb2590fd749d9ecca7c2c5c27d2465d2114023d899a39bd0ef10d9e28d2e31612c7ca599e5bc56370e109f9279e32ccceb5c002177c11c9c545a4ef667ae411b3a44e7db4f26372a8ddcc7098d30b3b41c5eef0c9d8855bf9529a58230d64553dc28d772e9410d5d711d4c2d0683e04629a2198b24d43a8055f819202838ea1834d8be1f259e5cccfc90d548a3e39e39083bcb158189a9a23c9fd463586e2a4778e9d319c98c6e88d462eb797fe32a6244d402f204c459e751a2f241af609c3621dc34059065fef41159d2d1e58682641a450e1209a72fc990df9c9d874367f2e4d9d211527515282ec23b306b29148a0486fbdd92607e2d6bed4676871aeb9a37f29fe55838fafdb95c7960add5c1c57936d3e2761a056ae92bf2ef076191d160d9da16d9b683d3e851c4cdc5806c23cc6ba89455f3fe5fd0d229f3d8ad7cd0a571cf40a5285ef51820c56cb86a23ff5c2dd85f5e0f6c7279199805bcb9d59c007983f2ff929139507d42ad5bdf7dcbb938fe6bdd18828e98de5c67686cfdb204f4d3762101f3b939f6ce2a0e0fe507ec583931823885d42b0969eaca1409eddd9a37f34bcd742098171bbabc998e2150b6b89bfc390b4839ad2ed4772d314b5679347ce93cc6f31ce6631714ad41045a95e48f0c002cb1bf3db8c6d487964d93cbc016ea2048fc55179ec031f8f83eca2bb42a2c287d99078fecb9ecdcb001f5dd40d1bb355c8c29304a73e8d7a9e73cfc980e8f8f4d09d9ea930f87fd153c8054e883f24634af512fd97d4e11f9494f744f4c33c52edb604682036f117ff9160334e624ebbfd019744cddee1dd440708c7c8e6126d2211cd668c79e68d4d27707a9f33b2e92272061ee2d23fbd2de3ca407bcf941d454bb712434c5cfe037af10a895a801615251dc336f09eaeffb4f0b08228e0b4134705dce0a6b58445a34df8bfb045ca637248d771504b8192450097d3e628ce85bce37c0cf8fb5103276f55c17f62baf2c10837330f2dfae2ffd65a2384ecbdc9de9b6c22a524010f0852088e084de3ae711ff728dbbcce735eaf73349b495558a3a11ff7f876894559caa698dee6e52b288b745eafbfa855d19e3245a6eca42142e752364505d58d97b482b2168a14be2e85d3a3607b9fb0f768e6269ab2264db31a25306c1dd96bc9deab30cea365897c3c8723b4ae0cd47c5e6213f00c03bb854df0641aa3c43490ca9516f0b361c0cfd0f50c6430a2e6847019e43be552bf2094175c0821a493fa75f83a2fda2c140855e18c5afab93eff264b19f237af919af966f9c4b2265cf5dd0aa12accbc0199dc2c6c59ad83ba286a32370c7e9f58482349e6f7391f4b8de610cebf47eaccefd6b75254f2d467ca9acd3487d4a569189acb3f4bc246de30914fd8e71d6c73a8d1702aec433dcae4e470260dc55ff391e5dbbdfa44fb52f95edf8c879f8f93433fd4f70ffe7db1ebef96e61f6c7e049b17c1a22e99f7cc8de6da5b6718ebcd6259dd22231527fc5613ab2a2c5f8c147c177754d0cd319c4c889cee7372873fd83a77d3da9a5f67dabd0266458c8ce3e60a1b79e4798cbd7cd7eb425597e85ed1a7b604b5310088e712675a8256e6ad914cac6e586666e6f8eadcccccccfc806adf74e9a784c863605e01435132ee23558f6c4c0c17d90e806b666666e67e88721d801868bb3939462c51028bb21857c0f057c0ac80d920788429e615309b8267b65926db186a3ff2be013eaf53d6af0d867723f1dad9dfdfc800d8fbbd1c4b6c0ccc9a7005006c9e629b6398e6c7ae93c0400e03667d04f6711158e71f8c73c626f991911557c8bad3107e314c513ca9578a233c877cb190bdd8bd5adaf3201f9d3d275a96a2016c0dee216aba8c9410b329dcc6acc9f4f9151bb3329219c2e884004e45ca10728c00b0a844a3ec11c28eed1d55bb4ceef1710a42c6110f323e40465280cd2b0a767222a5e593766113eb781904db7cc2aa3bcc723c3527625a3d9f4fb49280ce390e7514e21c04090939bb6fff0302211fb4324f520642dd344d137c7f2299a6a999de807d421e5fbd6b7ea21dcc7bd03ad7afe22d6cca090199713c0e7d2202235484d6cb43a7571f692ab27d0f5f8389c4a69b531160fed464fc8ba9e7fd6453c5d83b604808166510c6951619c0610f5a1fb25a4d7c9ee2419b821f7b46b5cee2d776c96af5934d115fedd2da2e59f5fe56e86868baf5e58f490445b6a08dac4f8ca164150cb140d6dd2b8cafa241b0cd3f30cd3b58bc8545d9c4ac28025dd27ef52b89ac92488ab37904fa040e5dd2ce21e1a968f55caeba38bbbb5b55bbfbe8644d38af6845c938f4f370e813245dd2eef15c1749fb49757d625975dd7a45c9e23758140d60afa91eba6075926e1410ab28d5c99a4c8f8f4e62bb38aa4a13c4324843af3760d93ec618e3de80a16427213bc2040c776671802ad777cbdb90b37bc344336cb88d711e691ea364e6bec44233ea30cb90377768487e76f6c6a6e0f7079410a4034217c7bea2c896f6b976641f865015fecc3f4208bfae99abe7d339988c13022e7ef3bd5141aa878684c087d8823f83447acbb99d91534ab7d2225a1bbb8310476268637f989a399cc3c5b13736858baff37d5a97df4d2b281bc97a70deef1b18c0f972aaa47272d6c69a40cefb937b07b30e1babcee1605176ad3cf56be5ee0d48eb0d5266f1fc7996f3716f48d97583bc418232376fcd4b5036ed8d49f7c69a4cdf1bce2d8e2a9a506252b637da4a673f3e00f2f71886e43cce392fcd9368ddead2a5d7a28c61b089264d1a1a8d62f5181f8d2b2ddea57d975eb491a47d94e07e34786bf3b7a19533788691eddfa355a525abbe7d4fa22178ebefeddbc7ba74f7defb4a2dc60623935e817c2308563793f6b58348af4912bd300d06f21e6ad2a315036fd2302184ef9d5df00e8f79c8aabbb4efb9e01d36c5bbc4ae451a5ae9e34fba6baebdc5b746db5ba735e941ebddcd1aaac73b6cff81cd7730cd37d875c642de98e70f7357d1ec82493812fbc04759ac96b35b715e6c8a6d4bdd23a41ad210f527c5e67c310efdc06feece2f36c5bba3d6dde73dd8e62158d4259b77775d83494c72d1aad2aee217efd5e7a461c63665f0f5897efc039ee49e94c147f9c59a385eb9b8f3811d9a1d97a24d3155a6499abe6362e6697a556577777ad235df487dda14dbf81a5a1fcf69d269da214992248364a9044bf9e951a6a1bddc14d69f54d9ec493a49d3a6d8e59ddeb4fbf64dd3f46953eceebea95a0b08b8bd838e914919c3c42ae4f1129be08e111d16f268e423c2c5c8b15d5c4307ef46c4503b91f6380fad9cb56704ad2adc2cf3c1d1f40747d32cddf1d355f4897749fbc8474474aec2f0293e44ce1ae039c228e29b9183300c74448423a008faa12334f60eba3b324cc3689750886398f88611bb05867c3b867bed8e914d97878e42da5485655c48480ce910da2c0d23e44e0493f760d5179be6434218e620f45d1e66966916669669967676af2c9359f06e722a9ac5d166619866e918149cdac88adc40b648062593b2ea9d922aca7ece1ae437ca5edb3d8a9c34eca421928f71626656e1090bc5c8629e367f6cd1d0f468bd9dff9ac6a2953346c9de86aa7055e1484fd6e47d7af4134f5d6a5f5a19f0a57835975e5132ea1293b306f9a52189d5cda89f540d55e14c7329a959437b4843ebc2d6f6f24d1a28992c4ed3eeb7adb478efa047bb4a57e1104fad51076d8a760ac59b6868cf0d25ab2a279b82fa7b7c959f93c6d09eff5e2555a16aa42acc72f791e9c99a80d6a4ddcd1ae4df256c7f61d42d6cbe61d255b4c4f66453540cb1cff4288b74abaca29fe9d4a54b2cca4e3645bbf4912a65d42726693c9fb4c7533fd914118592496dcaa6934d51975b03daf749ee0d738e6653a3276b22596bf9a0f372c89edb913d763ad8041002efbd5e12ad9eec6dae397f70fed1c12226e1d0ca321bcd6555521f8662bf599aa5595e38ec6248af77575abcf7b5f1a4d76d7a6d5a1c59bff73af5418955149ccb47eb0d32bb5e69bec1a4aba21c2ce2928a56b44a93ca9044eb0d0ddbfb7b63533cf7c94d928627104430d234b198a41e908a60a6b7e51e69056555251d6d4923a4deaf14a4292929296d05124a14a3685a69214520a9b3698a5e26944699a669faa31e2fb1884922ad5246d12a4d34d4f4e4e484e34a3ade88f7b2a98a968481c42bcf7453524a8aa274c8ddc7795848c423e5bb1443e2619e3d2c428d78221f31972f45e48499e645a849844a28a0e647e4f2ee2ae429ea3d271ff246848c903c425252d2aa225192fa444d54d3112a2dcb9a22225894cd29298aa25cc8a328e9a81712e271f2ee5194a37aa27aa27aa2288aa26ea2266aa2284a4e11f7ee30be07b3de180c9730125fcc556e9aa6698a2fca4743f1948c4e4a4e4e475114255d3c75d10ffcbcc7735dd4dd47dea45913dcad93c06078f47d929fe424279526a1e0d62518120aa4aa6590c2a60c5214453da9d21c85c5484928983c3cd243253b0633d386ddce757777bb6676aeefdc748eeb88b7e3f6c4c89abae866dd6619d1f413efba1d64ee118e5d8fa0aebbbbbbbb439e81ac596a18dddd6037d80df2f6430edf215f3963f327acadaab7b5d69a6546ddda6e6bf2d674d339e7e6ce0846643d308801b621b227af237bd9a68abb38b2218268ebd225edbdb4497047dc938686bb282289119f91190212a3831072e88a0ea193f03424ddf77c710c31341dd976bf5fe1b157778c5686e918e4aff7a36ba45b0f24a45be23088d08878403addef86dd0d4f2286770cd093595766d59759b700704aab871ea3f52ad19f6278e59778659818282f8d41c532ecc7a011510286470d004ae96234c636449bb2abbbe179078d0821129263de4103028973d3f1a6239bdeecb9b4ba6fb7edb6dd56d2509fc4f73552953677ee6498f72e0690784312e7eeee5f2468ebc10e48dc1d8b67125894599b03092c6a2f4c02031d41eb1341af8c8ed0eac99a8786d04a92813e5e50649b8d3bbf6e3c926e5a0f9a87c898caf3eb6cd9f46cbe587574433fef120588e49b439fd8972e6947016a92cc73bdacf5c0bdee2d49b3265c8eaab42cb4328a5a0f36856c3d5893e9d1e36977abada3eda5f520c6a6a39a2b69eb01b6580e627c40bc1ef8c5aab60508183b60e7c0259099d9e361e629468e5c1e8dd7039b8871d210a9b42f1cec82ed226fe48e7f2edcf1234af18ef247bc0a7e34ba690f19f76643bf1cd91836c366d80c9b61336c86bd3424cf79c7eeeeee0770f8f1f3f17d0003facc1b5f0ff5c959433c4f08d8107948bc5e11bca6a2a8a04a525f3d10320c1b1d356b880f393821e0d2671712148611f036348cb4624004ad286805f547682511a1f51e5a3dcdb0aa1e101f1fccbc2b2de2737933e2b311ba2418e3737933f6f900fbf59055157e34faf590c56f3651a545860c193264c89021ff7af40071eda84d471637f1bdebf2787e12920a82af28e27556995a7e5cf4d17833d6a4391dac7a73b0f9ab462fd10bbc983e1798cc7214b4266a3d1acdcc557b99a25ceb11abd6c2f489685f3c2d170c76810205084442f27b3cd7d5fe688cc8d7f692393a4dd57b1e496b7bc9a6dbf068bc428102048a1106e6d3737934aaeaf5302347d1892823a4e0a3f19245005811b125b6d0d299899b4abeaa3cf3fefa84c81fadf241f978864dc816f8e49bdc841042159e58e88a3810cacf29218786acc93c7627cf64921bce57f84e474eebd72b94927eaec3bb3faa82a19cb3f3e0f7bd7ebc0369d684ebd58f0921adf0e38356d8999007acaa16cbb2a09430f22c2385806f4af9f7dce1596653bc43eee1e47ccc434a5a792673737ed23adf79adde91af15959772c267b1cc9a3c0e569d319037167209f33cccc16c22f681affb6b63ed37afbb791bfa81bf345894318fcf8b664db8a4ec229eebee219ad93c26651e6be25e9d619847f59d34543392c7a638f7abfc94b210e51e157958cc4981067e767c5c46663e2d6da487d3c07523331f191f1736e1dad5a683e6ae7bfbe38373ce7d5a3685036976eee3926decee8f0c07d2b48ef4e8761f978f4bd6d7388da6379b35e16a9043b89acf8e766e64e6d3e23e3eb4732333fd4f4b7f66b88f4b6b5ee3c7259b3eef2eef689d9cc6715cbb911efc6971b2baa64ad906d38cccfc20a95f9571e0701f191d3fff9131d2837f683a64ed1f198c83718cf4c8a48338b27a03e3f8c8f8c81899f9c8f8b88cf4c828f891b126138ddc0b8d96cbb5ec0c75e72877d5889961131445a34861974461f5caa87594a3dc791d5551ee517f9d2f573454bd5357c11cf766e51c5d577dde3d60561dcaf3fcc93947bdd7f9c4bf30396bb8be3474617533e6cef5b136dc75e82e29b9a5aa2a5e21424f923bf5a05edd99798aa275672877bd53afd35114f5aa9acf5da738987c631f973010775d9a578da6aa621ec7769a2f5669e8c75515c87551573937e320a4163a8b3922e0c854f20b431b420eccd68090575ac0ad0143f119c8e05c9890afe39e8fcd71c6edf9787817a7a39f08b235984338cc811b07391cce2104a19c39a7ebde1a3041b084706bc0cc4866991890d7386583448979da9811466e8d98bda683cc713ec65d8bc9296fd97031315b6363a494591b319ced7881332d8c4c92348f110b286513289b68caa680d3c4024e2936b009d8139c24c8dddd2acc58c845b39b99d3136ea6e99a1755c1f01c5a3987af9c7fbcf63f6087ef5e3994a6ac09fc04a769fa3e6201bbfb2d420e07ab9bc5a76c8aadfdce445598f38ffe47d3cef410a7a7a76c8a89560cbc494384c18e7982109e058c7a64b55d050b49699ae2596c8ae9319269b02398acaa70caa6e8b71829b46ed10a6fb1bbe05b9413e4c68ec59a4cf00ddb6fb0f80bb33eb1ea13d6022f41348e1c2f3f348e1c2f41e4681c393cd8e6d025240878dd4d752380a4bb9b860878badb43a32e897abb5f72bce478c9f192e325c7077f0c21ba96ad076946bb300f992449b463c8f8fd34d10632894cbfae4f22467ce4ef9ff779e72244bcf31198a7f3771158e71f2c8a46b00ead2a4d048ba29237ddd3b907c47378a96520af2acd499732101a7a076149a16b99ebd0d03b08031e05597a5592a3cd32f5547daad27777ab1d642c13817454340bc3348c8e21758c666118e99b437bdeb04150b8371665f57aafcf9e0b2ee9bf47146ce28174dab60ec8bb8a76b7e1d4a3ae7e7db37f5c1b05c075d125fdbe28f5501730f41ecf75b9809feebe2edebb2e4f7d4651ccc0247d817dcd02c21f4a9066260424e9e8dc98adb1305b636376a6656b6c8cb4353666675a36666b48ef715ee10a4d6f59bf472692453eb0c18e96c95e598fe4eeb057337630eb1cec7a8c6224a55983fcbcc320a783ed54c0e3dcc23a57d11e0e167507036570f36b730ea6e9682a40d2b90870af9bbe2e8187d8fbe5711076f5824aca47730523a07a47ef257a639a84458e53902c796acf05ef10a7e31d56ca85352a39636549ca5955e417fc825ff00bc993163e2d5d4d1aea7d5a28d7de9a57296935d2432ef58f8c8f8c8f8c8f8c17a7c365cbb699a4a464bb545252d4ac34575f4b7187396cf1c64dcd9234724aeacdd22ccd62044d6b6f8626724dd3ae71d3d368de0ccdb3319f86be477dbe4f6a6a36b3331fe5a676c99c8d4676e7ccd950d7b84fedbd1b8d55c9ce7ca498c31bd6f0c5164ffa2ee9a3f1683c1a8f069cc1c2f06c578c0b7349077f5d516ae24c9322e7f17a5591e226ceb51135f01bb3311bb331d31522080402bd440974721223287a89668ca038e725ad28d5c9c949d6ba202549622125295dcef6565ab0887a8428179db3dcad95d75570dc285f2d9857d0379a6fac6fce9187b5a25313af9d935699929292b226bcc2d94907936cad85aabb14b96e979ca921754af387d56ba585fcdaa03458283e8a9ee65d43ed8c7f9beb92b2646b5e67c8e4ad4716651415e5c84b4eeafd88ed8d35a1e0a3b54ff0d6da14a9f7f1da31565a304cc3b03496d530dca5b92aa763b410908de54236b47a3eb6635d1b0d5561cbbd599aa5599aa559fe7a900f3ab7d2626decc06afb03c8ebe2581c7b63a545b436e2dab0362fdb4cb73aaf3364d637b48232eb92d450107a636fec8dbdd138eb9c60b9e01d98074bb2a44641078361f00b7e5159960bde8179a8b0d0a4288a7a355d15ecbe4a2e5a43b3d968f805bfe017fc825f3820348c9e21350f9ad72c16c3340ceba2a85bd665715e5fb669699d0f9090ea21201f1d4bb39ccaa23497d52ccdd22ccdd22c1990562e764f883aedd9e8ec9bd1793dbc1e1e8dabb3ef74ae8f4ee7b95c7f33aee7c3d509b90afeb8426ab3a616f26a518bd6f632d21664d7932d49b6a06ca7b790eb55f4de87e4c9a4952a2893f6b2e8a3f1683c1a8fc6a311bd503934f99c73eed3e21e1bf5e919c8dcc6d8eeb0fa99110f5f3f2e1f19779d9516d63f2dd5bd8385aa78c5e8de89ef38ab73157c55d5e307e79683af6d7aeb58b73e6249f0d56a1f5485b30ead1858a91c7ab9f891b1266eca482b056987493e32a6266dd61981aaa494124a591d442359514e4ed6445e5a2b2daa83e4a3abaaac8364754dd7452b4a2635933c591319a9e9e4e4e4da4908d64a0b163dac0852947516562413c1443029299b9516967516d686aa2ceb14457d63559546f30afa47e775f30f4b433bad4a4949494959e9ac8b61031db27d91453ea8811059ed7ff87f8cd54a8be994349d122254e15b04294a9a5c0fcafd7a92dc98c74855d5c2549c285b8ba2389c692bce55b0b59fd5add7cd2b5855b4aa7040fe515daf95c4b92caa524d8f818f76be316bc26def74cc6e76ce39762b2d9cfbf8c0cccc9f19ce398692efce705e7146aeced31ae911619242d791ce0aeda268b389369b68b399369bcd4a8bcd66e3e222b7d9dcb986d1d266b3e9189bcd66a2dee69be9b539df402755960b712097fbb05ca772d6ab0e6773bd83455109cb58d36d18be90a80886df4a0bea2ca847453da8179da2288aa21e45bd57b9a9f7defb837456af904638271a23f54a4aca2929292973dd8b76dd2b2d26e8e07bd14a8b686decc045ce39c95d6a895a1c0e4228a977fd72af34bf5e1de5a83527ad8e35f492a6db447a83cc28ba373af262d7857f9aeedce42637b9c9496e7a8fdefbdbbddddbbda35f45bf2f61a1f62873fffbd22fb514457777ee6fe71cf5a81f92f8f4f7e38bc4f9d85ca0ccd1aae9589c8fcd554d08b2b99c7320ee9d8dbbe6729a5fbfdb74403c23227e182e803f007f0c7f891f003ffd69254155a6c34047d08ac28d50115a493c21b4de75369a8b56f5728dea48123c9dc0efb5f7de7b2e7887c73cbcc73b708cf7de7bef8f9a9ad7786d3493dc4cd754d2252d8aaa7406695de1179dc92e093c679b73aeb498738598937bcc3ae7cecc39e3946faf5c7dbef86855e9e9d7545d98452385ad8d37d18de9c8c90e09cc5253d1b53d8a2250048a4030828f32d810468710be400842012b840c217c87f15052af32d2bad2aa949d9c74e454035723731f9791994fcbc787f79e3544e6dca3fc9239ec7d8a6f29bdfb1f191f191f191f19ae46db42b7eb7dec9e565a3c97a8a347d973d1ebe151d7dd2f9b8fc81d9037adf2ee83d68b3bcca1d5a3a1f55c3187702c1bba6903221aa2ed888278b446333f76cea3e804fdc7a3e804004a5ce4517422867f1e452702f011ef241e002c8a4a62c0a2a8a404f60e002c8a4a2886615154722c8a4a1ead2ad3495018684531825610e8434568fd432808ad9e0fdaa1f5e2d08bf6b99a91721da25a7b91f6d178341e0d1838428161b00bde817958d7ce39f96769a8cbcd4777cd34fd72b1a4aafc45aa2265ed0c1fe517fc825f486e4c68cded4c738e9d5b219a9be99da175b264755db4aa486b63cab8362489633666637ac5e206334daff624bdd730daa563c4f75ec8eb03f978f5c843c969fea8e43d4443eb0b4cd22dddd20e3dd9b66992a4f648147c550c2eee9631b8f82dbd26751462c4120a0a8a949d804e669c74504e50665c4f5e3fc4a844057164830d0d24710a8b12222a1774522e175cfc2a65d293120f7e517486e118866b4cebf223f30b17bc03bf2061926eaa6a01bfe0170ca305173f925efb418c4ad4e6f2c226963deee3f271a1ed6e1a99f9b47c640051e5f591213f326070f123e9b5b6ad87189568925a8843b74c2b3c31bf761851d49f631889bd4ba433263d562cb8a437cb12602f5d327fdbd666f7885970496f471b2236ef71688b639aa47349a3fb6c6fd85893a5a0869d49ba049734777ea2450572c821871c10e08123606f2c01305a573269ca405d69342e6ed7f4901023d536203dceb4a34f76c151cd2d09aeba2e2e374483f2d46e7b33d6c46d738f46af93680b26c9617568c126a4b83a4492eb82e4dcf3c179605d7041073631c4b52e1a0cb83cac0b9b888fc69ac0d78383aec7bad81d36c6a3f166b4f85c5c4407752c1094f4ba3059b7695df47bd7e5f1fc24241534b9c8685054885189ea5e64a4238b2e42561a5838a304576d30b2e0e23c6c3b3f2d23331f1994816012253010ac0436216122a9551a8832a97d6674e09a0e044c16ae8dd15a1a0fcda5cd683db009f991f171a90e08198c16a3f1f091f1699123330d061059c368ad32101f19233ddc0e58044952e2728d465295438b10c655a3976c5ae10ab9371390ba1e772fd8b65d45af8562612866b06688aa1c2ea9b5105cd32bca0c56b836539180053820021458d1316aa404150960130b04ca5956bbaea9d23c50878867ed8c7bb1858df0c515ae908b77909a3162f37061d664b786c43c52c406aee9d116a416d363039494f00a949431338d6a2f21430c8c935ba3c92649d59336666dbcc01cc4a884ec5c273cfd28e985853f5c1d115c1574097185a8b7ac82320862132ecea022010ba80ee9daa0e8de982548649832445e8832a9ed0f20b8a6d7123208712d0845450216b0381ad580004299616facc9ae0d17cd1932da286e9072c715247c3b7c61a5cc0e55b8422fe551540a8b94aaaa3850555f905a6b1cb826d75e55515570ed55d553d6e4d197f2288baa4a717f92a650efd0d1870309db08b4b012451b0115ae108471ca865d52d09a2ca427dda8899a1cd5282d480d45d3e19a5c8b1405a9e05aa4a8933589b49d80d644a2a44d511b3d91b20743c4b34b3e7ac7131960772e8da4e6c2524b2b96abbe679461e10abdb7ac3ea3ce261caca8f741282828ac728f264579075e3a318f88ce14c1265a244d5c90a689634c2eaef6ed889858b836ab25486400a1b00969be695d79d633bc840cfc6287375d482f5628452b95aca93d29e8906159e4031ac0d4f0a145d1b328f26cb730c9d2a5d23cc2b5547a6c42468ea612a24c72fbea03d7f4cdea252712aea5e2fb2f4112e94a77bf331fcd481bc69a4812045a6681fec21724a9c226767549bbc4fe9e44214f4b7839793979397939b1765f4eac5b8fe65a56cb4b8f5ea401e6f42a65271236814c4852925e2c0974a22208e9c4b2ac130b6c26dd77c21c664d8d08d28e0602ebd8aca79e3e725d7a577ed3260fa30134ad28599d7f7c8f957adfc2a247da688b5ae593e9278e86dac99a48d494eeda49afc3a48671b6b386f7e913b60d93a2014c1357350319759f307815fd9e8b06f072f272f272f272f27252adbc91ad588b56955ef1152bda8a15323156440dc6f99c3ad28a152b56ac58d1de3587914c3641687d6a958e91d6a944d2780c3e823434ef260dedad6d8e924f522b22a3163e36095f612fd86c3a99fb355f705d05b73901cd39ef4983bbc65d45c7495ad874179d9cd8744a029a732e6c1329cc7de74435924ba83b78ea13ab9d8c3af5893d26a1bec124438e0e3290c17b345f70dd6134444cb222287871c94ed6dc207613420aa27bf0ccd46f3fbd4fb44a779fd1a757a0ecd4f9b0f2a747d8235a418eaa701645547ebebe4fd7955c4a55389b769a5a94b1987ab6364dedd324b5d63a4ab1a1a7d6d19be48c7f7cd8f49def8ad8be3d62fb87b5b7af06977d625885cd9e0a707f190dcfb5a052775dd9683649ee04c24be38234440bc141c8cc3c78cd6c5e1f888c3a7fff7807c1a2a8e471b00d959a936888a2926bd7a5c30b46c83c669887c433dbc2332d140ae6c132cc83675a9807cb300f9e69611ecc03459fc0215228ae78450688b2f678ae85d4151960b3fe290edd8f8ffa849cdfeb51d4e0540075771caccf47f04e63555301d4271cfa443f3944a43dbd47452f7a4c69b2feb63033f30cf3d8ccb4b4b4b4b496d65a6b992c3a5a7474668b8e96161d5884009610ab2448d860110220f61ecf6bb0c725cea9689e0a781a8cf30a03f9857d9070b08f974847b4a38379cec1460e8285fc031389cd730d36f20a0bf985892c0246443c214cc2c11e97c07f601e2e8120d8e62a1804abfe815dd76c1e0805c50c4cb2d76017f62ed95b2d2d2d2c7325f28c11a53684244407c13d5686499c35b7be5fa736d13b07d3bc4fa7aa45f7d461559168083e421a726f59a41bf322b8321b333549461e11d2eb90dc50014f27ab3774245a424646464646c63d42402606739489212313039361aa326420cd1057bfca9035f32f13c1586c25e1a4b5d640281bc99c804e50da49039da09cb4d61c15a4934b7a50b2ce3b9955a455aa41d2ea2a3a9a559aef11eebcbc8a9ed87b282727d0876885ba39ec0e6cc2440cf76e591d9a45a3d16834dbe16c56c5e4d63596d168341acd898f7fd00f904fb4be2e5910caa19b6f0e0f5225b2386ba87eddc2368b1eaca21c38932bd12eb39643bbe29bf50bab5ec3a6ac5b58844924328050f6d76ed8ea41ac424a8b6026c992a248b2a2261966214a4d082988eec1999336a33654f2edeeb5baa3358299f6f1b95b8f4ed11af1427e5ccaa291a22148cfafd599abaa3d1aaa2e2b4953aa943591a87bca9a383751555555d5231611cca6442c526ca852aa884594624355a52840debd611ddfeb92ae01dbac61138d98c4bd5f70d1884b2605bc68bbabf80953d1f249114cca353df05e2382b4a381c03a7e681c3fbc745ae7e55d8f11c38ec8f4918a29a4233a9d0e841d08691475206c1dd8ddb9ee2e2a7540dea9ae815c029168e7903a47bfe4782f395e72bce478c9f19243922f5995bebb2bfba583f054951c8de387c69123ac38a8e4ec198a6aa968400000000033160000400c0a060363d14494043983071480147a9e50685298c7142589410a19840821040c1010000100121200000db1da1b6931cf903fc47be11cf835387576b7ac08ffeee476bd26af6401ed9f15bc28a363a326ca55347ce4bf19c54351c88dd2cbcdfcb1adfc022a5e35bf64fcb1998a91447fb9bc3c943705b2c06a15cc963626b6325392fc1b62409129c8f4a37ef507dd4086cb28876bc38e875f653ef9b39c3febefdc876815249d5e4f52bb64d4517bc9afdd006a6330c02b136548463291d4951f9126ce87a2662fac01f0fc812a370b94268685396f934703239b70d785d4ca92dbc6f2320e909e3447ff3eeed5ca276ee4ad780d8a447751815527468cb0edfe99ab51a14c68cd5a843600a1c5841970109a9d45843c3206ab4d7e3fe61a1429e731945940d99249294407e1e6d25c1a7e8551e5a1c00705107a36b1a87d14af5d1be2e1cc0210d55c1b446c83e61476edacd7291d609b2f90162f47967465d36b399f77d5219f88c17ee28d07d1fecc578e1ca8729550bc8d1a15272fb26405669e321927ac869d77e16443897755427f5c5a6c0a8461517bb06d0ced04dfb456c5cdeb7c3518bf01b39cc1d26ba5b00e4391843de8d8019f0546ddfb1572194d6310e0fb7ad988cac250ba7cd384f612ef67a40fb21c1c659f39587dee1732a735f28f89dc4274bec86097d90af6f8c3930c0ad9382378b4d273c34d370c7ce3a77198bc268bf3cc053293c0e4a98cb89799f42724d6adeb0651b7273b8d3de36e163d282b1e56987a8331d2b4067059088b1c60004eddec21f5f1eb586a9dc1da8cb06d37b4e686d69bcdeb1e49ff685efccfd64ba74c9a1e2b5ddeec4844ed499667ba016cbdd2dc31558edbe681a577c28066546560a3983b77aad7ef7f9f47b75ec6195377a73e7e6168f63601a5f83c44f81f946f770b663875683fe5f4682025ce60f61159c5cd1c5b891069fc5361375d8d2606d357be57c062ea4cacc3986c98f939dbf1030c2ea0bcd6a7a94548e2b90be6a26725b1b90110ccc49cc6cc4fdc6dee4a2f98f6bca912937412e5f2606858eee0d44ef21fd0b6a885fdab10db6ec3ffc27f4b5afad5e25bfa924fe1d1eeb25ad6fd3785666d12626d93d6f3ef2ae12abc9bb2c9a0036b7731ca82b7c93e4e0489273c1a69fffcb41a2bbb9769bc9ecbf96c3d1b96e76db1982cf7a6df66efa6c4ed9a4049b1930d1fd307e74729f621711e7b0e44e329a77318a1f77cbea58361b6e2740eaecc1c419bfd5ba474aa6bf0a354d32e53c8b94083b0a2e23be2c0ac5b7686269730bedeed8123474aed9a732c87af4230fab334a7747618b3fd3803e8c72a827a93e803617f5353a83df5be1f14e6d7756b1f3a40f4fe0f283ca3fc61a5e468ba54fcaccf29a4a4364bd3417a813bf869cdb61b627a448378b4e517f0b2a12e461b6912067928433c51d60ee8f58728c6e241b99e634bae4c87cc946fb8e5dd9db83cb14878a889236e2ecb4cd78d669ee25fa3583774ed41239805c4b3f683793a0af6d44f6dff93d9f38f9009192cecca2fa680c6362aa92a9502e1a2f22ece5806f2026093c2e5640102ec0a1a3cca301307130497a3cd3ec8207861efa00739d99474a72613014fc23c199d44411426cb1d839273f023dc5c52bfc84ffa94f800146a11c4172683270df33cba893d842a6e3f5c76ac309fee12eb5778d59133985ddc7ceccac7738e6a5885f19647c8834b382d98292cc0d220efd235b0c9e5eed18448a71ad4387a39c5330a8b4b60fabe7ee5bf571dc58f7e834c409525ce4f42667da7c27221a762cf92a24297a361b9a1c08984916838e2b90ae59912e0328bd177f85cc6c0105fa358b5cc3c3ec7c7ca4cf5594470de845c2a0bda887bf06b102ab4d4546bad86e73ea22a8ad22bffec041e056ab617c9d38c9b9ba05f25711c0113483b8499465f30afd72d24562e5f06ff0c18076db2e1625fd1dcb10c47150ded4e39c172dd361629b7fb8eca0b11d6ff5f753a012b07c06140bb8a494fba4189c3b5554bee81c706bc071d086eb3a708003e46027566d7a510c4a32d350a32c38d2f46aa1d0d2f1bc643b728d2625b8e8dbf60560289cce997c8ce84195fde66df9c44e86bf465662a5e14dc459dc4bfe52e5e35a71acb79068789269c5d9a6bd569b9e2fa954bbfda3b7e92a3c0a0888860d87e82ab987299250a6ed9f803c918914ee886524999c89e62111445b8d7faab19c590f20924bb086bcc8fc13925662c0885885f90b4e01d46d27e9b9728930040804427acdc74a4a000565c9b193cd6016b1c729c20253a5604fa73414a179d42a910790d78f302bd44c1c0cb72dc1dd8735cdafcc34ed50086570360f1d14a8e1a859fff88a7a67277153464311d8a2e75c261d5dfae5a72f5c5ad1a1d43f59606ed283536914ecf2db04056886f6e4bd3408392849fb84901059003a3b4459ba2c28939b05730cc5f4436058318e6172691532d400f6b62feaf20f6a76d4f2f3845f8210b41a24c9ab3a482590bc51a84a846114b3c18152967b7270101bbbf62f1971d416f15e3ac9d585c195d5087ed86ac123629cfbc3ca195da92d4994a981dc975b6d16e641b2f571d5b54e4c1a6173eacab89b6092256cb950aaed94828a0c12ec871fde102cf8e24691eb3b8d0ca0eee9928a4a15c1367c289b0c113d447a10e2ee0e174d840631d8f7e397af6e3474cd373ea18c56549b6b02339a2ff69a0a75ec7d4d6ace58921fb64d6edf0cdcedc22e1b83b591c4b07921c0a8fa5461b164ad7fc22b7a5ae0544a41ce377521e928572437ca884d9b81cf2b3ff2f30666aa34d8a5950ed879546469101a2802699c83c203327e98a64aaed438903521d9fd124d025592c9f489c1b5e4c747e2443adfe1250764ee434648c0229ac589924c9f210d2464df0499c20c2834095e9163e1108858b7d31591892b7099f16914ecc032871a3032640934c2eba4a3edc7cc1dc220ab421e3ad17b432ed53cbd0e2fdbac8dbaa3e7a2cf272c99c8e07143c01fe0701551001935d972a825781d8785c1d1346a9aad4bcb500d13ba40c456624b6c004107b369808193e73f39c78c46dd03938e0059787ba87e86b6d564c748e68c2f56f14343c6280b8f1f0f27ac36be9810d3f0d58457020c8dfef9eb903865bec315982a9d5b46f6b8e4925da7a352aa46743e069e32d3c411bd5047814482e8fde00644d8d760ed233383ae1917581a52b07dc8a6580d3209abcedb4f17c283a1624acba2be17705ff70708b9529187591b4a322bbc550a84255a1221dae3a5b04d1b96638a8ce029b034b28b178fef4e96d81b1fbbd76f382d6e44afb3d61183f5ffb4234462a1f8cebcd048ae1440d04cdb6839b90fe044a95adb1cec8cf40c57e6bd84988c2eacec3d2704744f756958a6d09ad633787d7c0ff13f3848b33feea64d5008f18df8d9390dc066319800e12aa7bd3e7ba36dc7551d27f98f6245b9c9ed67278d90083ca3f84a37c100bc90261720e2137a575eddcae26cc9d63d26c31b75235e251eadd563e185f179270e2c18d9a0e8a8a79b03f30f52d51dc338456cd42609998c83eb81ee6476438ff07be23f18e6254cf8ce2a6c5cccf15f0822815983d2ba8f2224715e930ce1a20afb895a5f6b02f1a792c4e93e2bff8c1630255bd8792d24e16b35470c5980919a716af5ad41678280d5dc21345bd0a12d072f99022275f5d0aecc225e592a7be5269d3bc4545fac58c2c61aafa205a0feb619aba5f6885dae185ec3929bce58376b47e323d290e2fd4a16bb5b6fa341986ae029465dd54a1b9a6da4435c59f6dba278f1c8318c7aa3dab486e8bde7e6d5aa62aba853d1cfce5769103ff4bed30b55017e65fc350b60f9180091a9b0422cabc2b89d1e77ad433a05f82dd98e331327455878ba59b60c0fc29df10b2b9024beb82fe4c47769ba127d6477dc5f0e8e7580da6a7d61419224b441f12ecc69a907371e27f55df27a1e81a6f077fdb99ae83221c297ba593c5e6c175e98359ca45c18fa911d3c898a14bbd217c094512a437616ee7c77711cab3b778609bdedd1b4bfca9f4d6e33d9a4b01e05e9826289872ea41f9ddf3d6aa5be24a94e0cb1b4a2efcb9b298fbcd9f1b249ddde7507897253fc4607f593d0fb20ebe865f04a4b417a9b7609480e6e2582fba781871718ef5fccd0d5b18811f2b8746f55080ad0e246a06c8a9ac496bcf994da5369d84ceb95cb9c6bad4dc07d33d2126a90e47b8c015fc0dcce634985574f7c7078ac611c52343ecc1657b53a4449e2c8c3bc55153d0b320f2730214b20a3e7531d4a965dc101eb0ee38142c69af2ac49db06938061b9a8707df3d95123c3645b126a170452a013ae318a164a835b904248d66a1d856048807d598c67f4046736356df1632c45421fa8907b2205a9173f6b684427325ca9aba322b8e45700d98c1465fe81aa5d22834cd799c463f9c2cb7f11ec7035aa591d2b01d0ed9bb4741a1508fcdd3e649cfbb94cc6a4603231dd2cd87552aff2e8ed4ff0554948be6e9bf892c5afad1f81144e0192d50de89ef12172f3dad380d4c36643769470c167b20110d0490ddfcb68b37ad2e0cc7be9ea015b2ab10cdfde5f918568704cf6420c3be754030a82e44e9cd779b5143ce2b7b97df0ef24a39dacdbbe5db7e2875c0a63f4a0e9246c19b5e2a0bc1e6768d902f5ac759b94b8bc628aa2fd7a0e27f91e7e28a3f57472c42568174ed3aea5466ba0d141aafbd08fb97f33d1c1bd6b078906206371e73945e973074b2ec2e704d9636e939e86f59d4786d70b95d3aa7a717601a646954c6fa29bccbaf461c871374295fa69b0fc6481dc209fc97e95c3123d8efbc529411260adc03e0795102dcc59d4c42a968fc44cecf7b10b7d4b6108e859658964e79c271d4e80d8c44d085fe2b412ebd911effa28dfc176a3480f946030c1a1130db3060e8a5cbd6ccb77dc180a599aec5c42fb9e79ff8f55f96aa54d10fbf64301c9785bfe05cca19cf6777d5cc024f66a4e0ae9ebffbfee8ac50b0e26286f757f2cd690f8bccdd9dbf1a521152cc37844cbdaa379e2eeb9219d5bd12aedf7de2f1628f7817ddf5e5ebf7652c45ca59c35c1523ef77b56c5a63316364c4cee28639c0855f32e25af5b01726e83062019fd603bea6dc99461ef15fbf0042c2a20fcafb254dac172d63c07af42277d31de8a50580c0a9477252910b4fc2dd04a4f40d1a97d7ca346097c75e63cb9e22110b482ce3532d7f065fe78c6b0d9f3aedc819a82ce65ac62c305d66f884908de6b50be2bb6c4529a7a7e1c60c29872d564b1f4bb973e00512f7b5187d604e74f5fd2172cd3b614995e3ab85131f7d4a730b5ccda2aceda7616dd062fef87526df3efff82233a8034702f07a86206dc521052016d236353802e0f5110bb16d345cc04aa921731c7d4302c098b30568419a273fd769a2d2c3b2e00eb671605c735ceaba0609f9e2920c37a366d4c2913673d03ecdc010ada0f9fa9210625d90bbe4d6bf514c50eec9c764287f1d6cb51c125ee247720402991129e918ee5df442e6ed64bb0480977a6a481fbcb865eb8b22066406ee7993fc4b9cb55c88e597d64358dce73541d5c60598c7ebc0f66deb1adbcaaffe3413001a5b8cd927140646e0305940e87a98a96195ae6a0cf2d2f1cdffef1a5c5853e4472731e67e129078b778fa65a362a443369bec1e28286e1c1497a69159243b5c8431079357e5eef6529c85009648ee58bb520caab9a10ff5977df54d995ca6fbdf9c98525781428c597510856bc8a7f4854634d97064a8ab2635e1996ec44258963c6a2d061bed92d12d0a75e8b705e8a45686a377212fc1d0d81f4c0568e3076326f02cde46b1197130a175395c4af1ded2685c9227043a3742132ef9edd7a893f7eaea605048b086f37e296080984a44de5c391766cca99e37cb05be387647c007ac8cb2d8b78a5083b947aaab72986680c42b41a5fa4fe9aeb04d37cfd9cfd216f005e2aeeba6a5a5b72acb98cd66293f03ab5effc98f70d5a114348f58499d4e99fd4485e2d20df0204e0a85ab63366f5a2026bcf5fe6a0bad5e00ac2b49aed0350c9900faf24452c6fab8034e71a54a430614428b080f70528346456c4d3e22663907e95c2f8dd76f1038bcfa802fd109d202d1aade0e3ab940f488830c97e17524d568c782c0956259a7b84ead1d1c6698b67fc001b1b721409fe8c35ed5b21f8d9cb71ed728f68ef883bb7f225aef60a343aa106c73acc476722a20e371b85c4ee4b360ba5731a559108a58f2d1cd2c51d7f9e493708981fc2bf29fb70518c63c133dabd53630dc7695d4fe5e13ce216789f2055cb33e43a335a6e624ca2de3c8700ea9463922eab08590c281c517d9e73e37cedf497776e0dfc8b2374decca073d9f5da7bbad3c8b45a6b21b65b79b35a8d15c7b06c961e822639200c2925dfdb168b5813bc251f22e6ee530eb95cd10a295ce5c9cfedc1f2e2c718f3b45d82b97cf9db3e9751817977466ba131e37112964c00f6cda91ff4cad0cf45a813d412c2d39c128380683a40f2761dfdf5fadc4e17e47f876bdbffd1a92764051bf0d32c0f4f1f635eaf3caf0d2e81ccc26780b9e57443b8914360ba4c9700d7788b67d8c346ac2940e3413162cf431837799e80f2a61d141c2fc41beced29b0f3dfa8337e18e7a74b89f809ba6336df23a650a539cd9c41f8269461a3633c1bb15a8d9d05775aec94441586b7ab41e34d51cd809ee39547ace9e502a2d298e79583d984bcbc871fb9a15e797bdf081ee3ffca60e816d07f52478df161781dfa57db579425c161dda48f37a824b9c841b1eed767f0f72d81c8b5155a68c26abddd9a3eb59deb68aef2564120887b70a276d0abca538efdf01bd10b2df9359b47c8188f4743b35264202fab56348ddfb6e53023d254120fa423bac7b932233e04d81987ecd36240f8b13a51ba5a5cf90ca1da5d2db859b72b5851a69d5cfc796b5f3128a35dc5eeb4f7cdaffdcaa2a67753cc62a724499c7f30bdb5998531235a2f28fb7e82aca7cf2f6f66963663a0f0bb3aa6967da43284be65bb67b459355d505361b56f5de41c00d6bc2c0e1e50f2e69670c6c2510b0b78fb2de505d14552718de048154e25f15ca5d601d4e5709152f21442aea85d9f9ecce541070319701486a5b6de6d0b68fc019f4dacc341944d01881f35dfbb5db15d5d536407cdd48a00a08f6722fee9da62ca7d5eb1f79c062e37e6043ebb0d574a2157687047865819842d0d54b9755ae819d94f21a74d49a11cbf1fa7f46c7e4a240790f0838fa277ee526300a42bd639211c5c897e27d3dd62f0810419ff91d736c7705543aa6970b5906a00f0528c331ecac3d65132252e5cfb738d22fd61abe59fdecb47f2625f71c0a7a4e8f2a35ba319710dc1bbc91e45b3cae514b1d35e92474ba5d00cbf58ac81b316c92c046a737ab77ba3ae5f427f5f99875a840600f3a251889c06c69b35dd93c0748abf2d840221e175b59575e24a0502379a81d1993f2385c22cac6ad0352c5a7b4569fbc8f24e33068b2069ca51260bc83841394c7c70377419c695a2ea57830fa920697fe773af9386104b5867e9fe77dc031d23d324f5f103f8918cc0870c65745e92450363c9441d1358a09e980a3406b492e8b56034ea45fbda1d2a39d662d89f30571482774596511a76a216c787d110b0818357eba85301346025a85bc7510f7db4326f8147dd948b7990e1c4d0f417a6773cac38759b84ba54571363b141db3f00ef6391e817846440e79bf8b6a345e785ee7c1c970c7faa7a83f169aaae45778fa236f0910ff93a9ab30b450b06b17c4be38edf28ed54beb2dd8b400f4d7149ed2491f086bc73bf4ca10b2ddbc54e0bb7a7da0f31ac09ef3918709c175e124808a3999ae3068595913533fc596adc97de00fb0fc60127713d3a753a259385247cbb4a8d2f3e9e6337e04743302cdc05c3ff120ba03b172d83bad44bf9d0c43e2d14fa5a4dbe26bf3edb7567b46439cd5af8941ca941c9f00a78bcf12fa5ab04a7155f7362bb1d7d70881aa6c49d6a84fd9d7bed25cf12b675a580188b96d7f4148c032769bafcf4488e9a22aee8cb2b223aaecb817e44fcc186499da0b442d045c74977a0182d657194a57d0b79022689d5c4032cef9c47233adf373a370598b61083019a09061e14381e7b5de3675e5951c2284b91f1d536c01a96b80d681bfe1c7342cf8aa13c58f7ee588261cc62d72ba03608d4a6c09017ce6178f4d71cabe992f1720ca6ad41ee7e1a471fec179d122fe70ffb2ae91b7122f7fd03a19eaf171852a7f2f01df6aec0cd211715f88ee26c417bd4f755bcdeb6bb8af7f11e21d23cf1412cc40fdc5249fb91718c328fd791f021a569ef2a0b4360acf1cb30477152e6e8960e73215062a5469d683e17d5c9dd428e7617b9f2b286d873a30aefa9616cd6a50eb45923b145d2dc181656dddf352848363793099ae70b7d148f076f75c876e663d67aec832da9acf9cc4e6ff47042b61f25341ea74cf75e05d6f6fe1b2c57714a9ebc86bb83785c384ba7f6ffa5ad508bd56d661077b46b122abee5efc7d17928b7d8c9f438d6348344fa852fc7c6ebeae4ecf73f21ceeace43f09bded1111ab9310ea9d110c7aac70c95693cbd679cccf2f415fa98a68d0b977d788049a2acd1b32492184c7307c59bd4ceb7938e29e7f2228d807cffe217e8f8425042bb7b8fd1d39c1d104835810ee85d9d002691ba31b315d7dbda83c2488e9998caebb5a8214d5686eb343db95293110d5a403316c62a68805c4b110a7a0f58cfefa6795f55139d461eed8380395a36a9a81b5bca5745838ad69c8a773c5dc9bbe52cf4f41d968357383b1011eb6c8dc9206c453698d6eee7df569dd3062ed606c41201d3c9cd5fafac35c041c6dba1639f679ada6a6050387bf92da6283f65a6b492ad7352d0d6e60c07e82d965416bc58bc7fb9c28b32c53c142aeb741583ad852539fc8ca7dcb6aab73d58048aa53799b4e7347ab61b99437722dd893b3ab8537192d0b48e1a6ea5ce035161fbae233b09ab3d7709a692144b7afc5c086b75c710890652102ea8103c36832e3af03f1a3675ed4f468492037845fe500071d6c78854ce9e5035cf0908d42af389a7279857025223b5129734086d9fa073e819f579612be1088baa747ad6a04482593c80d7b9c94fb329b6b584a22124b0b8f4c8f1754d2b62787c9d45b2802e99503ece3524a8e6c937ec76378eeb205aef19180759a8ca585e650cbcad607ecd1e2852e64c944555872de4aa72ecdcf75e070ad5036d5869c2dd6e69d3a49d1abea0ad63e0da33874de31e7be95287e8445ca7d1f21662b2b521284aaea96060b7dffb2c53d4b48169ec0ad79ae4ab61903c4b52ca4c9e5b780fdc11436f720199391c2a152609634fddad933ba2e5d9a5cb2b9c74df4bb3d24614c10bedf6054156908f7ce0a1734fbe00f94669951cedd5f840e9e35115584c20f83b5c32564db895c83cec66dba0e755ddf7a879263f8217269f8d9b6dc7a5eb9e036e4aeaf81376c352c9d856b0bd0c5da5e16f240c5397997d0f91c03a11e58117ecc94183a38bd9c499d58963f1ab53ab527f205f30b5a470e9071a60c26fc104025d13332bce4fa8612fa0c08a5ca40c59a974a74b6cf415cdd1ef4d8ad139d6a698140381a0773843e1ee27100ee834271691c36f6e5fbd533154a520ddfcff167b6814c80cdba2a4d5c8046605504caa6e68f58fe91331c6da7f049c47fe801a059685b37a7538468e141101b320aca9b15574e3cb40c0c4f63186251d7b357c14b3939ecee0e8b06093368e31ac552c4beb14926cc567df061d557efffbc3d23fb9252ac00d98eb3e859f0ca224b49332b42e8ad5f48ed5e310018deb12e138838782634b0fc921322584eab99d2b0f64e812cc434af76ee9183d7ae3b2277bd1c3c8e40e38eb47153666be33b598cf20a631cbf7d4a33cae5df5ad6663932200ad1ef8810274f2f74158630f448c0f2784b9ed7d4dbc9246b781d75431ea1d5b24b9d4f06c705e26ac1564fec6a56dbdd40971d2ac5bcb312d1e7df8afc194644949f963aadb5179e486bae8bec3d3cd9e7f34eb9265ba15ba2d418d127d10f5bf6932d9dd772127c402861284d219b9a02b5604c5a63d229ed490d86cb65284701284d66da7ce01061ce67e57c776ace4eae8ce73b12d28c8cb3fe8c68b93760a9f0ddcc57576150cb9f1be5500aa1ff19e29d507c00d304cc259f8f78ca64e2d2a3a6affad81ae29f5e02a4a75b63452a6986e01f6008e8bcd2425c572da25d6c9de12654d30925c0211cce093df0e3306b306cfdee61b9b6563457dc5f544e8a4313ff58442117d00f965f4caa82632ff86ecb928b91b573b826a911268bef3e737767a7481fab72c8847e0c91990a1be7f9026d23a8648d4b292ff5d91fbc31b16447092b4cbdc11869da3331c873b4162775b7bbf8a364dec86255a0898a939af086951ec2de9179b13fb1d9be0c61a2c27f443c80bdc5932ac03d8e54f63a32251a1feb1ec64926eefee9c00047723f0405248aa58a009480bd4fe0789d28fd2c20f73ed4cbabd2cedf5bd6a01b5d872ecd8ee3af1c63aa598aab739ac6aef0a472fc30db39c414fa2dff521daaa0a0f16ce0791eeeb11c2691c14613f13c0ca4180ca0e36a6a241c6bbbe6aebd2969cc32b67a761b52387151423981010abd9a5cd265b48a891ef8d669b78365aa825b50ef0e939e701b2480eb5cdce5d3f6a0dcc5b40b850db4a85734abdd0a9c84638e01c9abbb63ff533bc2c1795616ee0a794693855013eb5267093c36e1a8bb6de3fad2f23a9a4293348659ff86d3485c371d42514626ed59909cd260175163186752c5c96065ff548d6872f9ffd3938d5920a0f9f62478ee723664e3e991c8214584d5497ec0680e9a1054c7202dd8a91af6639130b17b8287509d6b2b67a4d58a99e06ca0f8477d7a58369728625b20a2d9b34c75e2325199e5a1c95832279ac6afaa0b26fdda0a29c844e387a124e0bed0ff36ca615e4c943b08dac0b6d81b052e61c2689410f71d1a73aa3a0d98b497f3ed46398ab9e50f117f6c14186930c421faa6c36e027e783b7eda66e846c1c1bee85bf4bbecec6edde2252172e9eec97e1a0b4778979e17bd7cf3bd7ebd22c7cf6f141bebc51966ca6b614356e2fb14f68344ae0b2c0a6b63567476ae568ca02352381a4215cceb990014507c8d8fdb72395c10c2241fbea96ee2217e1c84d02ec5b9ddc3152516ee5e8d5db8f8912d878d80be9dd40996af48fce439c096b3f8a98243e3fc5a4dc5e3de5e395c07dc97f1aac471e035d8e2bfe15050b82d429cfb94ba3159fab44c6ab47da0a85250d7c744106e30173eb1999f7c0aa744e1be5c48bf9a7382252131af09378e7b30fa0dc931b038640ec914560898d67672be58016b46744c26f40665f62e3df19d8e06c678596e003970d8ef27d4ccad6606c604fa35ecc1307b6636dbb9e2e0bb2655a2e6853da0405b46b34c8dd896efbfa8232fb76ca72e9f81019cd43b90f17258c83b2647cff6edc9482c2bc70f8f06f2b5f85ada409645c2004e4467e860bcb94d9515ad6ec6bdc5805e64fb61d370c78d8521810c4beeace647044caaa1029895bc081fbf144429cd43511a617168e6c284f59637c3e5a4f5a54026c7b41fc033ccc4a5eb3f5e755bc53c78a242485470f89a75d3886e3f3084e2fac63687d909301750909e50ce1d032517ff3cf74394c0745fb55b9eacaea755b49ce3d7ffbb5006e772e44c515634ed070b3d17b12ed00bc804250795e366acff3eaca9fd10253d85a7e42d910a04aa4a9f6e4b444ae9ad38e8aa55c7c98cd28a62d77d6c2f8e11e68256145969a64064afba6907db245101e8697c7ea13ddf006ba009a0317ad1f13b9a8b8e093295b36c4c60b63f69201bc9f80b0dee545dd1424b7b5c6b9e86083d9944eb657fb52d3f31b9cd685fd0dc7b1569d32363972af0fa79f9eb594703db03666a0df809543a49cbafff6ecca44f7c4b060b0b0e26e82a14450e01fdf93721f4426f6f0112b8c6f142a8e2b36ce592b71722872b97f087e6cd032de86d7d37ad077239ab59cc4fc1fab31b1707b3475dae35a549257f9ffca6c91803436d1578ea785983009fb0ed6a260a78a369808e7d9443ea72db6064ad3d81dc570c439a75053eca6c2818f64de745bd038118e9f8ad1d9c121d6b9692ec03c357664a032601f14977cd42fdf80b1ad8acaa4c2fef26abdcdfce576767b43392acc642596ac0d703a36f703bce422a882f09530e5fabe2fab72e532ef80b191d9544c2ba5945c7e64bfef8380d8443a19134da2ec89c6ae51d0a3958137b6d373281bf2f32295307b6910cca3cd1a5017e41c3aaf4c86755dfbdaa48c63bdfe69c9cc5c19f4f2ffa2ca9a13e0bdbf65915d7dc51f9915df6cbaa72f5b7ac449d7631252862e91acc5bdd8e2c06a45add2858dd1ffaf624fc6dd02a309d596aee95761ae64656e98223cdc0a058aed3088c39825e494cf737f1b08f64eb123768dc17677965a736bf361b6db278bb5b94670f5b80ae3d92b718fb3257f07746ec6b973a5b9ac9145aa4865755890c7341e800c2bef8f1e94018eac82ecf5714797b646ac8d641daab482d364b1d96ec139d535fbafe990274e5c0906d33fe54891fc8dbb44ff5c0a70d115368b53bbb8bd97ca1526e082e4ff9fb2ebd9c69453fac817ad70a4e6d6fe3695678bba6b33bcd554e122530a042b391a5aaa8b7d842fd5cf6c85a3a48b8079ea9f921872464c996acf9291a799a62506181441d713e408fc49afa6cf72a5bea0bbeb9eb092994f6f2b7b61258c81d96b3a88e3c40159c42fdaafe69f74a1270464f13b9895f265ea42135da7d756f5a0192c29fe74a98f30f14e80a86f84bde46224561f4c6376010a0921e57ba5ae7bd5cc91f91e90255533da8b6ce3e53c0f6b61d4f8e97b29f10f32940890ab7eba61b8d8e5e9750c7ac36c947e5a273d44911cca3855801e7aa0587fd597e32fd84d509a7263cd8b877eab153a602ee62862bb0bfe81df77db6c25b1af86906910bcaefd65e5910a14f04694e004afb59283cacf30e35b8502fa462c6332bf3b8eacca80600a2f5c6f9816f267960f456a5cab919703c4a90e7fb79fb246cbb2d306a94705fa00caf84fe8f9027d24656a9ab0f5f9a8d4964c463a0af65943ad80b8da53136f2ba348a1e889df41c6192d228c1f7dd862d0cd2a88314ffbb0b4883176391d5db90df09755b1a78ee44e57cd62778b075977a671130c4c442f075c55d3d4661056262633fa54aef6e3211cddddd7f3c05d1dd7ecb42eb713723133807f5f0ccd79c24e2a83f2c61c42e6887d4ede88567403e3fde8731127c1c40114013f38e7471b56192a7351237a6cb9a8f5bed52c507d1dec36719f7610f6cece89b34b29b29f469a8bc064aed9028b4edbaf02cd3f67e8df868b0128c721e38a1b878f6c111a2fbd5c6eb20860ccac7d72f6e4522f76c5b03d5f83a46813febad77e7fd3a03f24791edef1224963674b91729ef6fa7a65f234048f206f0f5efbd71e447881bb6ccfe1a153f2cbfee84d7c0e48bd015f95d2a8faf1f31fe37e185c6ba7ea31488f8cc2c5339f144c02c5c022462aca0aae16111cf4ab7bc363f25a16829483a562f48d811320305c2a702bd85d25e0ed2ca9e55adf352f9c45bc1eec570d7ab822484329406b8cd544ba7f6164b817e25f476c54206218db376b3d2a59bf7ca72bfb6223900c96ed8f764596fba8e3b03ded4f924626b7a8612765af59ecaad4d60e18766a408d48b8750e0012f6f5a9b552063dd685012b59fe8d470a059b4755db3f25634f0a438082a947cb09b1ca8005ef53bfb2c673ff9c91bccb6071c4d96b1aee2b2f8fcb05e6223520844b0f92114109b492f0f798345417a3ba0108b57da5f5025de22c44c2bd53e8fa66e8776e99aae07ab72fddf0aed78381e39dd60b3d5bc140022629c4150e5f2c9bd4f5e0ff5d308a36b6bf91809741b0b246f9784768b071ae995f18f5524645ce2e3388b61d7f457f1ea0fbb74b829aca1c82f47e2c1b746477f3752e24a1ec4d3fec588af7437cbc54e4f15d30e55df5344fc100bd01c72e47b383c16e097bcb6974ca55f163dac2fca4689e64d06002e64c3b85ca910541237653b1681805065f43c77ec9d58fdc3e328057a4e098a932877650c890c6537aa2d8ae022dfc7075232a87fb999dfca52d325340f62a9f6825cf2f57634eb1f2484b10d72f200cfae32bf77c95d2940048b5f89dbf461c5b0ab32b936dc8e76c354cb8bff1bb089dd4cb71fc78a25afd5c9b8194ba7cfd68af8251276571fab9a2a214409fbf8c4f9f62a87e9925e049594af8c21e92509189156c2628074bd2d516c83bd4c4329754cd0487cdf6ed75498e7bdbedc859a730a7f7f132646d50e024c7ce42491062123ab455145f3900626a70c65e9f71e78104c5177332a35d4abc3d3ca7dbb9c09967e326be7bf06889699c3f08f2cc57f313398a37072d7b775f3f907158cd7cf26e81020d1b79d8931741a107853033d403217af97f8643a4472b41e4124d7d2dd66e9257952e44c62b97a6a0a41018fc15bebe7eb92c6253f3d10249e4e8762d80598af47692f0408d88142698d222e0b7ea34fb48c73e554814f7f9c305f996d5cc9d74b3a5c7d221f468a5f6b427b9cd618792a25f97e520e6c2d9ff1ce8c6028991b3cf79ed0daaf5880af5a54ce2b5180b596cb2cb56703e5b373c704b8f813a66db036a332e2da00d2fe3965a789789704436f755ee31a2f7245368a0bee5a17a62a02b325cc0b1ae6119998d9a3fdb2804e401333484e4b67c64758bdcb45c67a1111226e1959b538b30b3e0a87a12d72e35d59f0893901dc1826385fdc6ba7b628137397a6a9304c74784252a6b688a83c70841333358e07454d202f735bef6d4ceb38b744aa22a1ae634dd144bb1d448d325aa4260ea681735afc3ca06d71ea5d44c9ed22f3dcfd797fff7441fb8a2bf7740d2a5b6dc4c7f31a5f0d12cf13095cba14982e2cdddfd3f2a76b98816ca788465737183214acb6ea27dcb421ae7fe3bcee22c953cde01c3f3bb3f2e6033c7fd4eb766c9248758cbe7446d78d7e73a10f144f84c6611104e4401f4414f9c2857da3acad1be29c1d53ff1c1532d70f60401f0c0be24f0ab2790dc11e4ddc24b34add8a1c1e4435f90db714d19fa5a09aae39b1ce2572d09e836e3f5461383abb633e12b9d2ef7b41688c59065e8503409531f40d1796593b6285dfc8eb796c680427881a3d1f3e708efba17a82072f08e100029d60020c1959abf46fec4d1e09e81266c34bf2c7a868e188b43e06cd1d00ba7b0445830c5a7157084772bd1d78a6f288d50770585704e608884f81084a1314006c7065e25d5115e19b2aa477f93c7c3556741b841365718e0fdf95a9e359d1815586752d249d50de19d180262c0586532741a2a5b23157cf22ec71f6434f390cc0bd9b964d5c4d4f771cfabba4835700121850592177247c56f333d78eb708a9ee8ef1db354817688a2d390f8174d9b25c900ed96c4bad95ad289899722f83f0c67524c93728eb379dda7975af1556017c247e5aad3200ed05abdb845cdb14b5c8d8a3209ac3abacf3b876c4330fcad27f6e38047284c8d36e442e887a87bc6e043cb40bfab7e74585fb28096dd12c42b09eb6f9aedb0656e75d33f5adaae573fe2df8af5b8ee3f9aa74358729ac1ef63b31217e589b53f3fd86c6e8280ca412ae09278de009871e1241406138638e82558efcc1aa810a86489bb6a459d46e00e8b47c182b42d536489f049499daab56448c33c9454c05a9bde55a23da8b2b27c01a900588b311db1f700106c6f33d05e8eaf5ca2af61efc0270ccb94882fbeacfdfce810ea082adedadc1468baac0b6bb1a08108ba165bc4f71707edd2448e3bf2c011fdcfa770dfc9851a347f8367394d507ba466f6b64562178af752408f4081c3a998c9c8f810caaba2cba021783b75df7237ad0bb4abb161403e741e6259ca8c83d6106b0f007ad5818999b45377e258539507504c0f8454a97748e950b6fba1e08626aa0d79286d44831da1d0c7c12cca8ce0dfe0fd426922c3df06a6d6aef202480f38aee00a8a8eaf49d5cf199a59b5cd3f9e30e23e806c22bbfc339c64e1f2790eb708f49720d0af75c330751384268f5b6e712ba0ee2a4288beef7aab2469336714dd765193976ae746218e6fc2b75a3f413b2468a60238c6929a5e9b1fe24813f95b8f03de93c79a522d4d9261830ca04cb7e35317044af356e6940161decf98494cd3d82a23cd4113e7c98b8cb6c9ed36c24546c1eadac466c83010cca630e1fda2b81446e70ea1effb5c114c93e88151203f4bb4e4c2e895dd47310c80b93c7d8db44d9d41860072c71219e7651bbf5d3f5cf6ca4d9c871de7e50431f87fb2380690704fd11ddefa4ce3044a57ab90e9bfd7426c61195644ff724004b871ea141c721a6ee154744cfcc36c85774c32196df919d473c7e6ae145ca47f29c38519553efc5386ed7139d30d2765a2d691b5e7e932ee224d24d1abf58ec8154682e1a245a3adb6fb24ab5c453385a4e3a63d46a2ed7eb923a86df782c74e3716f87812da472c91e04852b7f7002ada2cfa32c61561112ab25b45918a7c6c161ed42dc5625ff670e765e643267aa1e886971a9bf70c18df3c73bc1cf864321685047cbb565659a208c7a349398edb48dc8844d9f5088fb1d0a60a51e1d9596980b9fdb1ff807c03ec024c387bbf8d8c86d4ff4f51dce3507172c8b1c4244e16340560465bc75062ad451ee64ec290abb8919c0e257c886e8500b0d3042eb4bf07b45bcd25d5d79691469522728064267fb81d18eeebc05e5a0df6712cd2c6881f9f23ca4ef946af89882cd13daa03f30e669e1bb2d48289bc3796271efc21dec004c2984b3e3deb33a0b4a3bb574b7d300f7bd89b6d01c72e7d2d3b391f0c9209bc6ed207eb8fb03323d9777f1b4228e95d9572670ce165e71363d040bcea587ed209270461dc84439a8f8d6225f1eedaf5222f5e4d4342aae9993f1aa64e6c30dce482aa7582278cfb66b4eb071f258f163371561a1693b0866fd0a6bd1a87699bdeb4b3787d7fc76fb09b6608fde1886d0a35488b0866f224f6f1a694d48b3d2281f42700f1d847070f1186bc846c1e737d99d51b3a38778b9f417e2823f1702806fbb555899912ed4e5a0ca8147efe442f4dac3832683da8d87230e33e095f21d6265894f002272419cdd48d6c9809b48bdab975f0a93382c230d244cce03181b63590d6cb61785ecd01b5b3487db762865583ea813c696a0ef9718e79c7c0caaa6488a45a2ac8032c179d105fbe85606ddf96e8861a48f57866b6ac0ee0b04729811c33220a6a4e25f28209a2e29ab4aeb30172de98395774f1556ac756b86348dcd37f86915b4bc7ced33bcb30b56066ef96e6f4bd650775617a210074fce1adb1b480bfcfa40b680a2ce011676e4f34c15c16d205affc2115b4a1e58ab201264870a5fea983eababbe62e5818b757e1c7c03b3e71ac8d702ea4a24f4952b485f8f6bf21be08e3a3ce0ab90daa8bca833cf1eaf140880c6543daebb9fca75efba097f7cc69e12480f2f02b195a438f412ad4a64ce71f623c5c7fd4bef74793e3c43c7768101dfcbc81eebbddb6da996b69332edf90b2c20c1a8486145951f07e3572d1d749e93c3df877168d646ba15e596dc0b0a5b3b29052cfe8bc97130370f225706c6e634f56d78f48aa84be647ffb24a8884e7ef32f5e4362b2a12a173507a6c0d8e7a5d13a654ed687836489320109aa34fb96b7895f7cfd36845c1d4d740d7f7e3d97e383f6d1662ceb9fc3040d9657dc39ec6ba8e5865bc4902ec3ea1ded22f605687fda7c41a9d32c64d34c739fe709ff85b4c6c29209199951d6938d3accda101d5b98ef332a495f532ea1f948cfac70b35a97c6a9de484ca9f88753bbb6330ce796402b7963c2a0e19d89265961644fac5c4657a9c5a2f57f1bb797caf7fb8a93cbf7c36fabd577281f04aca21bb4fa03f3fb44b6df8f0d073835c4b9c00e783e61b27d983d1c0e3d98b69f0ccb3435403a4672fa9815626259326b14e2196b9be3c9f065c5e541bfc5baf006694fdbc4471707e5cf9563e8811c800f0fe1826b0edb1dffd7eac5c01d223446aaa790dfc1de8fa379035e60a7a4d3f0eafb19cf858ae34fbfa7c6c177a45bdd92df8b8aa1365c1602a810c60592ec3ca42cede09233a03bb118ed1dc8ada103b7c11ce0f5bc52d965a67cdbf566e8e48bfc5d5309ffa6c2b445d401fde66abcc420e08b80842014a027348ec764003d4d5a571f92859aa2d3cd92c24852ec8d30268466950ee32de8676981d1cd7f10306381c17facf004a75e3c8f990af28d3c93949e026bd5d0e106a5e22d300c300d6ba3341fce88aba86545339c439533635d23d7f366bb3c30dedd3c5a9f0cf582af0dd58ae02d42020efbc573e56566b5082dc896301f0865891a696e940a5290ca8ae72a64ef7b2f68e0579afb751e86b8081081d6572704ca4547c142950c4b799671e9406b26aa120593df506b429097b17bd14f69d4237c239106aa023271626005749a69420b8c1e4d1a64af4586598243e364acf86a96f2dc482727ec959787ef8709c37f67fe7047a27f03f821ce91c4ae6f8a9e976eda6481d3d334a65f214b12565f4e44b4dd9ca99e61c592ee194b5bdccbea48990d4a3e6b1812c7f4db00c7d220d7488276622a16c4bb8959d211efae018b3b150145347b0076c2bc2d440aee2643401e32175e1ac0d46e03c180288a30cf18d084c5ea95568eab186fd3076156fcfcda8c61d95a6fd5fa5158c4f468c4bdd8a0cdf3f5dadd98fd4cf56d990882ac2659adc70eea0a515b8352e55cbc216cfd3f2f3d07ed9d3961a8d2514c12d8424da5f64ec041ecfa86314066f4cb822b84038bb6e9c1e8e981cc9c32d80201f60b395fd2adfb9a4e7c865729f8aa2e945982d83d76699ac55674f7a45de18a48f7f79f02c95d05ed06a880df3aafef0096336ec9a4023fc518486b068ef272345e24b35a85bf250ebfb159a51a66c975b6cf99f146b54480cbb642ccb54be44fda05c0db63a35f5d1da873dd522cbdeaf0e8110cfd342fe6a04f76d9b94ca8e12525f52fafca091fb3baabe52364f19f4d8238de9aa34453cd16c97b9e6a85e295b0df0bdde411765423e54f4923462bc4b91cf6d5e746d19cd23fc15d63fd5becf50072c54214f43817e6e4d957f054cac0e9c24b93b665820ac208c3fd388df7ec19510e4884fe23f319ee2265aacd350ee937c72b738741737cc06ccc86eedbd1c77ea9679f9342a259a07934a5e0053225f32400cc6bc542b21965957e4edd091a5a2d3275be4da9cd22b0794ef65f2ab0fb34fec7a42f5da64f2540a3f0baf66f29fbdda4293ffe0bbdd6999689edc50911d3dac3c03950230fbf34d84d98e9e8f00b849bf9f7f9a78cba53988f3cfa3c97ffe0dafb10ff114d6a7e53f9fe64b370a7d690e4c5ff90eb69f72332aeb73e0018dbf32d7ec1e453867fa810dd089d743714388d1cdbf555dd6a7be07461baa16fb81914dd4a7a629c65fcc69623701afa5151ced1eb80420a903921115c9111adcac37c4d8940052bb647f4228481cadd93b6b7f226c9008a1a0139403b5a84a4c89076782c4468b19dd9fc87d9bf411fb3562d5429d18e0fc3a46a58629ed7870008e8a277d306fe67528c16dc4111aeb0f67130652e430cd5c9a035fa86f94a5a7c8b4e6401f1cfe55acc9219bcf9be5a485521116897f5cf538d06983ac1ca10008b0c457824952aad8e46e923e1b183d83890eaa5fe593930de4f9219cb9a84997d39e04ae69a126436918823a273b8b4293eaf1e7cc31ec558e252c7bae682db0a0e0a8d4aed7f591e90937a22dc916850669e32686883f18b0ebe11dd21a988200ca1d3bd2f2d4d805e35e61534ecb9338cc45df7fe7f1a7872d1400121f4405505bf9f1ba2deccae23f2015de635718b8ec8d9af27e676178fce24d6343f8020903380c11db623b88179a723e3df799ce186e592f7ab0154b063e27533a2ffce79a4d3bb7f044956152a0277ee2deacbd5786c55cc0cafa4e0c21b6b3ae23cc57b30a6ad04a9c78f733d4236c846ea0e5d34be3798a345fb23ed6ce9c41509f1fb2c130fe383cd424d21289cdb16f7543b0fddfbf68e4f619f70b6db8d77d89c83e547503d00ec32d0b5f74a2f127cf14280451e6c2f3d50330ef64c18ab92e5d4dc3a05dea43d2a172b1a6d369f9249f0dc34b890eefe7a89e50de7c1337e7dab467d0c7c4e7eb519234bdc7c39e30c573e0c2fc9e2497ed1e4c5a608f571d9b49d02f223e75b0614a352e3e8500821c15e2a8169d75aa17f7d49e3dcf5c6cd99ed7dbe311efb4f823baf60c463f6541d0c1cb0cc3992ed7b35cb3bd9b8eea10efb54baab041c39c95f533198792ff53f161f970d9e7d763272c9768f3ea7dc3fdaf6700b93ca58d107ac1224e2d71982e6a7d4f3bff62055321b123cb052d433e0ed0682e3d6935688a344f6e987156fe23d46968f26e32fd3164afbe1747852442f85e41358fc41f07651d6b8dd4714adc6ba495ca2a8086c375ea30ffa28c0a4cf8fd0c70b8affbc42e88d82f8a9eb559644b097c876cf11f01b472b9dca501f4dc945f82806ac739b8df1a3ade6ad9bfe9258e92fcc5aad4899ae86b495646f40259a0a1c890968fc9ec0442fe42b466297790252475725727b13587f50ed0d85c28641f235aa690641b15e9aff757eeaeec12eca4bf33e753fb84e3046dde71ee355074ee7bcbf3c8a9bd6af28d6f446b80b7abb929e4b800a261f399beb1eb5a1cbd44767a2914798755fd611f5afc6667d0b9a20b6b7739bd46dbcadc42719b5a72861a5a041f50584eb392151473dad296466827eb8d00f970c7185c426b5bcf52033fecf822b0dad49b93b04baa7fe58514108c2c0fdf49880dc0200e584061337111a2b37e70cb6981605a2ed8e898c4ebc2455832df02ae46c161c74086feb8faa3f87010b6f696fc375b88b6b72c63da9edcd2aee19d29c70ca5a4bab65d7343c6ad3c6be93ba709cf8a45bc393b5801e12a188e23bc74f71cc7dd25414758ef11791771781f8f3b08f20a84d32d76d6e9035626f2b2fe85ca921f9b489eb1e3b72df0133c002dea815fd4ba796172967230242c8c6ea20575b3c31de623cd6a279a8905ea59cbf00314298a72623f4c4ab7cb9119dfd96dff7f8545e75f6aa99e835022a6c01706a8a306e6b18776d5963de4bd0c61785b84cc160bea3562c2e0360960bad3689d5981db4c93de2cddead492351a3aa84ff36dac7583580527e9de4b58d89bd8664b5a7247a0c44ed38cef910576e4a10c1abe656755221cde6565d20a819d6067a1cc81b4c8762c70d2646039005f96bea7e60988d99f96a7e771a0eb411b9cc5c4037bce68d08c476f8fcb5d67c71124854b27742304a5177e9ecb39851fc845a956572b7ab20e141888e60e8a9051bb5af1fb8ac8a855a1509b9b84edc3ca8a3147d67ec02e6c42aab232a9156a78ab16f50999e079246c2aea5f63e31ece0438eb2f86ad7d62d8ce13ef3c9bbe56ecda1f151a56427e93baf301beb005450451ac890f5547f80de79a715d514ac155ccc2822869c8f5aa1bc40948551143745907b6f508090100b041d5ba2385be169dfdc9e1714cf5247cb76c506e7ff9a4c5feb6f88b8c1f8de44feb61d495871cc08d821219127d1164e3846c56f7fb89fe37952f3729ba436612eb3d43378662a05a3e7c65dc1cbc44acb179e667a99c850b94e65779db71f2c2b64649408d686b50b8e0d85700db58d1e8a7711638aa3f9e12a89dc61408dc52f128c09bf390a7b47c42423b3a839a23be96e606c959f6b849dcb95324612fa29dae4227b259131cca219bc82e8a6f83bd1270293e5591dbc1ca8e727350f51d361bfa9bcdde56792c1812a62f0eab2dd069cfbe9e480a02cbc52806b08e4d216ea057eca2cd43ea0e99838a982f65030a81b4610a2687bb66f959d5382646228089231892973019ac82e42de86d414879004f5f2382f2cbbf922341f41f1e28ac565bc455c9ac9603df8b93b670b0506576f4e5aea5f499d8b0ac7da7c46cea32b2383042e4290d1f6e7d900502f960188dbedde27027a0d2a88332c2b8451ef2545f003aa03c3f865b28703509fd6f5da87fb022d2db44cfa5bf2132a8fbed6588259607ddea8d401d667fa0ff16a8969fa16b527c796921935e11ab9cdc276c417762a655b66a1a24915089733a5db389b41adeb15549cb13ed77446cc81433fc56dc7b8d7215841981a8304434423e2b09855c11db6d85c0ee20ab8939ecafcbfcfd617d64236ebe561efd5ef17c91b10b72a06952a9ec717dc88c488b5426477f32e2a7b13321f49df60d61a016c42691f6815adce1bd0f3b42f3f71ce07cae44bc143fcafbf13656a9f299e358fe82df016496877e3bcd459de7b87815e9f88d5f7c09acf6cfe8ac973fae0530e45dee997a80af2fd0418bd9fab6e0279c16cfa4e0faa9db0bbd585f58a6042ffc700f9a77c8e0c3520f5e6c073bb426a195e67721be4dc61ace8ced95d7be69d4bd59f445788b4012c2aa77e3c76c1878b6624b40ea7ca969ca0570d5f528798182a2c5543025d91a5f91865556561898358e7b3b567242d5718f4a4b836afb11ea1b05981d463015f96e293e846038cec21a893b2e0535b18473627161e53c67378614ba7e0c16a2d434840c2a1db315d94100b552253249cfa9d944899004160db803aa86c92bc07670fd0f82f6ef2f855ebd9eb287042758827c8390a8739091dc50c28f401c686435ba6324294feca9249e75f2f86c09e77c12daf6c9d0cb8c625108408794d8230a2d7ed032694b4536c4c0954603d1f22a8af9232277573d12f29898aec7584c8c7dd574b7e6c5f32556c56db57f5f54ebda419ec1d00e4b38de54403e71cd560754ceb93a98f7f0f8e1e355f9798e7f5c75627b0f4342a660584255e7175061d637dc185e0520559d8ba899311c521dfa0cd338e50bf32ec50015b9fe7aaaf26fdfe03c20442e77de90398dbf8a9152990968cc23ab344012bdae77346a6ddd4c2c4342c3f759ee8b22910dcfb713a9f978d7a8a8896dee51464762cba19456ecd68e42cf0e3f9edb34be38d098e1c6ae79a90cda1cc35df06ca4a777b4f99d88fb062a7d29079f803a241ea39e86d67d7847e21b4eb2f28e04f075fdf8c60f4ac20dcb69770911f17a27ee66089f5b9ce5848b28139cd60ace09a77a5e1345542a4b08b8c9f8af41354c806155e7c49e98255733f24f0c039b24a4af454984788548e74d8c45850aa5d3ab8c4681f3f3e1f074032580f9164288f160c069a356276e74e122aa4bdc9a5a353480582c02485a86fee9852802d02c4e3f9a92620b65ec9d6c88225276642cf6501dd69bd898ddec94671976d740b448cb9a68184de73d71eeac2ff1d2c2bd03a3513199738095f404a5de21a9314ab2b5b56def8ffad7136c56e6e0ade750cb7019ca7c38f8e12024c179599d01497d6b683a1ea029b381cb905033b3b741a6536bfacd648e91956139d4fc3c3e162d75b087de5111936ecc2721efb2e1018b577fbf6d340793efff042f45e564aa71415dcc43dd8eea0a603f9549372b77ea3f37e8bae26ee8cd1b03a8111e7eee398553df187740d7800e2387eabd03bd56d422d1cc5640a854d2d09c33c5b41484d1f92c00974c79c871c74b26e98d944df014215ee8b0c368d7fcbc6eb1b38e97e46cb715d12ec6320e021c95c2d11a51ad287c2f5335027138b18c635c1d05815585bbd900a95134321588bb6334912f3c61a079bcbdd57876fbe74b98577cb89ac88764586d4f27aad7286cb061d95c358048e37d54cfe004dd7872551003dfb87bc498db894834cf6f984bcc2c1c3c10a5fb833339be96e880ae009ba05160a4715cb58bb690333a4107ccf11f1d169bb3518c523e8704634ee4d97b8e54376b5d9430029ca07b81bf2fd41d0afe6883461ac54117ee313bec9a588c2c76c168f6b125183088f880f91cf212f87b52634a0a8a4f4df997657d283e1356c8953a6e14326d5568a5b7beb61aaae162c335165b84fd43da6286a558c33082df6d6473209e5bec819141e17a16a7ede2f5a16931c74189f0937b164ead88f6c5a23153184a26605eeea3b522b1a2612bd867b90582577844b518ad65d3fe7737094ae6ccdbac1312b920139c7d2f8ab687643ddc2f1c1e40363e0eb613273a4548318ae8d46b08d06ddc5014a3f6344dd608d724135d8a473b806114e7c7927568358473dab37d3a01711a6d2af82cc7f4cf4bed760c16500bd56201cf6b956d773f586b28be21f1e3cbdff8847efcbb587f1d5dfd62e6ed8ada613cd0a6b9bb1d3d77fefc81de6030c6e7fac164815a6f46535dc3d35ea8f52c88d7fb124c4d6028327576b976c186c725762fe3da8ff3c5b4edca130546b6b90205265641b514b7c8720cb3d393a799a41b7a7df37178dae1e5583c3ed9dd419823a1c3b015e7d969dfa87e90dd06f8a00e343bcd969a3250780e8ed2d0cb11cfc5d079fe169aefe60bbb1c258a33aa77dcab34070e49c5a3b6ba5d793703b2be43971a9b5ef1d21f0bf18c48a4104838d1e009a9803c2e84a9a7c6f3cf9efe86c773b5e60681b6f430552ec87c1fd5ab34ce44e3bb23cdeac0c44b0fb0155aa649f50f604c10f924d4b4b99230af81aef428c125ec0f593ab73415b1e1ea9e080501f21eda37715a05231e15b94f3a75ec9e7d9103d23fc5889bac737b1fc8e25ddf475ac05fd388d189846a14eaf18b3eb7f64a98dc0e47305b2660c91763e290e43f9487e4c2a6916348c2b1ea16ea2665d411938e399b63ac8b7f98f7ac2047928096d8f47af9dd0808b7564f161a33bed9672b09739294508e9805673fcbb3075cc48ce410b9588f1cb181b047fbfbb94f6704853dc6ea969d495333ce9e549b297c900b8248027def361ddb84f318b5484a2713cc4c2ef3aeb792c7c0274e69e8b42b68d8a479fd0433931702bf5493f35d20482b6a950822dccaaa0bdce7d44dc9bcb501e1c87885642bb69de76abd57978c7fae1ce09792103ebd972739700ef805c29f45b92ccbf22f42a9a260d96398825e70c0c2a9798acbf548e6333438a0c4220696058ab0329d9498a019f79544ab79d46a1aff90f8ab7da8d1230bcf1d01c844e63459f2a14244b531bd37987b87d065a3fdefffba6cf010cc5cd5daf91211a03df5f0d58f3c8e47e34ad9b34d0ae2598c3583cf0aced862bb3a6bb022337f6503049b38ac1d8805eb75d5fd2f81439b00c4a6078d2829313306ecbeafd4e34c5a0cb4c0a33c64da91845883a36fa0c3da5b9909585f84ead6c60390789f9e160b09a469091fde228f07cb7ba48a59d4e1e6b202c6868b0a8998bf021e0e433cb2209c9a325c012b9545cfab8da300b51d771f35360d06b0efc8e41baa5c9931a4f1ae7710177516a491f566dc7f6ea6197740547968c56ffa4dc65b4fa594b8cdc8a39b72216a33ed41c0c6011976808f3e52a59ecb0e49aeb220a6f70094a4b80738fa0005cdc47ba6fe53cffa942c03be48884014a480361cdf9bab9dd21e948c600208a59e1a98796af00c22b12461afc11bac615f70f87b3909773b87938eb6e650ed8b553436acb8e39552aad97ce25e97e937f6fcf60f1217425556031c875e4333c9a79279aa67f246fd9afeb9b1bbd2af95dd18be074bc008feaf1ffa298bfd7280889819769f20a8fb19a65f096042a0ad2f7c7cbded4eadc018b67328d1a994e16e8fe56e651806e586ae5b6956eaf646205b2b798370387ce4b6af691490f287992ad4b65f6fe03d09c087a8e0d4e74aa324b5bd45992315b018376eef09a8805836a53491542b2dd96635c56441a70ef476ee0d598e550925353a565459ede45ea52698dce3dbb4344b24509dc9c6f9317c8317b2b7aa41e33ef3c4ba05d278dd41726278e4dd0c5c0aeac6490efe4454954904871d508b27869545ae56fffe3ac1d6c201b2b40c48de0465fffad239ea660f40d0c3fbcd732399c28840d3da4e0ebd65d8f3f1560cffbe65eabb539dc19aa9743dbafb1aade030fc5a39ef220c439194d8f42b9be8be8f3a241b8db5d9509b579911b34f7110d8d33cf98598fbd09cb3341cd9cc3a6647ba8185929d7dcd34321af605eb8eda08ceb006550c30b9f6aefceae20d61c27622c3dedb861b3ecc50119b34bc50f8bfb3c178a0c2b91df8bca15f269e8562f1388d0d4384c5e03af3f011ec666e540af879f11080a9cb540500e7472a639464d9b14ec360f6b7542c700da44ffdd20d07a62e107123031fb56cc3edcd0da6bdeaa4e5342bda43b1d9b032db54b0b6ed68eb6c4f75986bbf7e5bd6183a65c49233ea6f76a5ffa68fdc9181dbf558ba158a9c74bf9555be17b47085dd4c8424db1fcf060c0c6b3211eb993015a635bbe1a40690ca4a216c0df8641c76e62a093644309222942edcabc3b4b9b6558d29d23d8f7b260b0435d31dc7efbf9585316119f8b2bf7410ddd37aeaffa137628786f492572748221b102de55610a09d194191948f32beed9ef51e28e0e8428d558b7ff630e604ae34501150609b3fc26b3d8fb9567d447dfb4ad5aab6c3f949c898591db5f95b7cb41e6565a53273d054a8ac6fb57724740b9090c37da165c7047b1e57b67f4c04e708198cd7ab052b5107f95ad8572b4934459dc58d589393a2a600af0c810ef03dcaaf15dbc7cd32685c01c2105430611cb92466291caba299b3acb998589342f1de55ab04ebce3ac9b88ed6ef1e22c3e373b50a19babb773c6eb0d0abe4c00a974f8ebeb8c8256121a9703ed659ffc759c8bd1423d6460881f84156095e3672db55e58052622951ac52cf24c141fda3e45c9b2f71e0afe8951bba2ba0b74fd6f135efbe28c9114594afb84a678d10dc33c45ad3c8f112ec3ab791df744d0f79a64cc3b05b38ce84053b35873bb73546f6691f0a72d2748c3ecef9118247f88ee8f7e868c7195c1bb14190bcd96cecabcea97c9dacec40212ee0a6505a4fbb62bd2ad6e24017a863b40ef3d5404bf189880d74ca42aef662769403ceb83bb409cb4f08b7234828b93dfb19cce424b7a8e0528fe6f65e8a4f74f78665a11fd57c4d9e4f13f38bae878a1887aa43fc41b190ce9a7822520747abe2531666e9d40d85b8efb3191d9d10c375f729c619a331e4caa851a197b860efdbc64db3048f58d796d97e82389e40f3b8a8d4367196e3d4e8a614075e87afdae2738c13dc35e807efd3b2a27b2106158828765cb50fed8eb3f49deb0d22dea1298f69a8733299976dfb8804226c794551d72cdd5af8bd4b93d3dc2e85079d4729a01763ca2e5a3b291f7c87810e0e57f32e4f0afd7338f130d45cfbc2f8c670674f79f30e7689d798e3d80a44254aebc81372bd4794c67a0ae6cda1c808b2e8deaf5dbfe1c18ba77cf0d111a86b0e4eb5d0599376f94adcd64a0e9c6218f87b750f8628813813c82eaf4aaf9b826ec39f0b4d34435a1aafa73c343376fc66234df4e4d7e8dd9e9b132498e36384d2d87ae08894027be94521de3b174f99fa98728377c49a5e201134470481fd411b72b5ce56533c43e005840d4300d8305715b27497195c23020ae989445360b88a2f135758df50793faf77edbc2aa35b007e2536eea3699f593787e9a740cf72b24fd0cb37a1d10220c7227e96df98a325ae2a65d705ab449682c1520e516326a88349caa752bac30d81892fe490833294df5b22692952bae30c3110a5832f7792ed010f39b90ca85a86cabc316ef5844ab3f06311a8d17dfbb340650c26b89124c90c5ff85a612e265b0f570224ed07daa685156ae5f782fc81f18221360cbe47dcd2b221ad969fa16756dc953aaed0d51742b30f6d3e8a5d13edcea43182f926f97cc5465d6ece253381011d75f476c4feeac01a6eb39b1cb4c75b505539d3947a2d2074c8ee08365f49e29faa7eb6c3435235c7383753ba320efc81a3bd8f29f17b824ec40cf11ad090e66f700d2eb21b6ee947f6206fc038e89bd20d871fcc7909d9a93d7fec29bd82bcc5f75a806fb849deaab841fe8beee9a6907850c0e18656aed070d34e98e6dcd432966259a4684eb46a7f90e70f457eba8a04521c3862629e8e46896e920c658e721a2e8beca34c8820c391fbb764b980811b553c6f8fb90a1927151bd4e0b63bf970c2751834e9f415411d8845291c3ec6f4fd643bc4c164105a2826269c07c4a86b5872d51d4294202ebad99ef7fb7b61ac2e8a4d6801107f0e249570e698556277c9b732f1faa90af9d913e539525728f8a919ea6a6efca00cb1ad9a7bf819052d8a730fd6609d63c3ab44633145ca2a86eeef57ac0ffa96b4e1a7e154ddd80c2a2fd0e9276160c0b0156c28345a462b30b27c169cca40f52f67f1b6f704fbce0bac49a910c30acd6762dd0254e960109d47ce79eedb45f9317bb8420b86efff6d85ef82e66f1dc7e62afe91461fd9cc3a300624307c5894e2dccd1d7c6be045f94df96b23ce022f60ece3311d022f4f405fee02af5baaf7a536ff67299d151696eca5d7d1b55d6f01090ee691b7c33c1f36bf12948e5f64fc7f3a5925b26f2b802dc6dc48d4a62b9f85ade5ca1808d320bb95703b845480a6bc13e46f48b15429e9bc97540e96d68d8594a3f03740d9386e0ced4a346370ea7409ff0ab1233b38e677daaa31c16c573176c2e0c57a1e1bb522d8d80e00b6fd82790b608885720e1937d0c3d275c235b48c50ad2ddc8c70a753212b49d1bedc487f86993185e0d00b85dc5920a62ec9d8591e7c9b770ac9d540aaff0cd83156c9f448cde38efe9e5ee6b356c485622f1c2058e8bf1bbb7f6c30ce29fb1d608c833d883ac017e764d5f5072dcc53ffcc338e90c2cb5769e5510bd99b16a99a6725b43644aa37324cf60df7ff07fa3e90feed231369d7c9c7b4a74eae3cbc2e269aad4c5198f6a1de7cf9b3267467e3526454bf95dfeffda0298c97d3a28852f9b04fa74554957aea3200a84363ae645b3f5a28f17f1993fb007df79cecdfb0a1319255ebccd5115e9b4ab85fce317e912f9cc4d618aa558ec3d4d26cb9003ed008a99feda309629af55440a26d320701589c3ab4c9ccd9fa01d763c21c1cccc25a5e7aaac806a2ffb5091b0549796075148ac7edfc9588cdec24dba4b93daf6b2919119fd74a0def7f1693b58157f4ebdec4035d6e28172772af1d19a18f9cb8cad148c223fe9749519dc78c9d1f03bbad70c8a97fe79d8cc888fc898a9ceb0e5527bb8a2311d06cd4afa51f6c16efa3cb1386a150355e7178964dc3238d21fe9bb2df2f8034308b85e549fb741c74496fefb4d936a3ff6e161eff437676f8e39ad449311edc5310c9cbe66e63ad804d201a4fb20a5c74b3f4933c29a30adb127c46d6f0f8bf3ed7b17a0a0a67111c3e1d5f4fd495ee85e1d201d257519dd721727ed424623f1fff1e0835b910657d30c778feae630eecd1250b31838a329d5d476d9227cf92c4979668f351799792616d904620058f579cb9f81391adda937600f4a58c8cfae428a4e22d076d0f467f8d22df75800767d240f063868a1a0f02f9550a76ede5fa3d874108626ac07e3f6e87bf0b616f99a9fee2765b50bd4c069e477db200de6fdde3c9e6d88c4a3a738c880bc3b448d3445f3a797dcf0f7f28251186da79018d9c70c62d8b102a3d9281bd578d4d398e18ac4857be3307ed37592837a21491649fe500732ee5c720c513e0f30a8ed0d11c4501009fa74cc14c5aa9de24c9522b20ac139e004b176576cc5ebe8153cfc1a215cd6920415822e97cd7e36609ccb795e98547d458eb19f5dfe7429cc698993de36d030eaceeff63ec1be8af7b415bde80106c968e0095cb57f61be53374b770b63696fa376de105977a411fa39f450b02c78967ed4e4de52e4919d64d188458cda89c3a7adac8f3870b394138656497fcc52d88356ee3735324ef6afca03d405ed87162fabaeea47e5dea5a8b4075888a6c89da771af5bb8f53cc8fa8f5e7e8551757fedf58777d6f7bff89fffea055a0d27d6f8d341e314a9b48b832e2516dc069a6e57672bd110a0dc1648b7cd42dc710ce1a82dc0a6704e93edc6d5df686aa2bb14f011d6f22d94c6fab38800eed191cafb554afe73769fcd14bdfad2f907fca4a80dc6d1412612f083003a670c16376e183cac597b774b05fa4182e6c4f489afe77ad0c6b599d852d9f22feaf4e5e91eb8d452dc5956b7fc5b1874dd15659fae186debf29ce5d1a204125aea3d806e48053f8b3807048e36ceee745883549953f06411d3c363578d1bbbff77027e31fd74a3df182b31392334ba8f2d3248818d8d1e55272a63194850e30a6ac44adc3c83874033e52782227e9f516cb53e2ab5b47816ffa5d7c7cf001ef6a150ee43ed03d17c5e489a9e8bd9ea088074d07ea197b648835fa8f8fbe6c03375a0ac9506f4c920e91bcdbe96c312b94bca04856a1e72a289d1261a5647a18ef91dcd7de532a3172ad468941ec2a7170812fab196547f10c8e3923b4fc13658903600c57fa59ace928f6cd9a5e1ab4c342699739a087e79874ab29d16aca42cba088a0233cb264551416a0b2f3019a75c525840a8f0511a060932679801e34e646938af8ae2d99162517e301bceed4c31b1475ac1f2aaa84843c3fa69d58d1ae7f3806594020d6b5ceba95219dd4c3448c4dce336d561fa5d10c097d1ab0bf43eac41365dcf3e460ad1b3e5131a61270fc2154ea455c94806f2b7e64ea1d8bc4b772c82434ef0a4f4341ca1131926824fdbffa90d634b096d02c2e8a959a5c8675dde1b08426ef988d3a6a495d3cfff33913bab086cdd0b152b96b6cca79559e9a59a936f69933acfef18bd016d7a8030c0800c8c6f6841f7c3040a16e42b19db86c854e41cd844527ad2a1256cafbd7fca4fbae8aeffd3b4050bd568bc38c45cf7a3ee903c2356a71f4156329074399c28a1cdf6652beccd40ad19016091c64ccbba18be77644ddf3fe2992a49365f78dce2b0e9de3cc393e454dccc4a4b6ec4ec5942f2f3001249fd8f68e8ac966be8453d804dc994f347b23598a76dbc9ac43f372376220497bb0d9e8ce3d8ce4e5aadf27e121ab693e581c3a34269b25a3ae2155346c5ec4e4f901b4090b2379b0491be512238dfe0505475ea7250023fd6ee73a11a236684721646f86367bc1cd91a8bf1aa1ecd5d919dae8348a285873d6841d3b297fd95c0f8139ee38577399f07829d77660b0f7d2a037604c38d271617974e4066540a382ead132105f0d50c69e7e4c16746ed2cf0f570dca216fdd7e9b1edcfddf432ba3cec537392df37f0dd464189974efa5bd74fd77848725b0ca992e6886ce6a718e1ed00c040050c9eca061c09996a066151b541b2fcdf63ecee7ee06748a6e4c190c5d2ee038dfcd7ecd08d93732f4879a33c322830bdbc8255d5d22643b61205c95e29cfc18d90a270c6774b51c1a68b64c52f5d39adb85c277805d97ad3ca94f3aa14f9b71357e2f459eb1359cf2d6b0cc2f0ecbc041dd9efdeeea63850ef7ff77d7b08dfee9205fcc0f67f1e159ad114d83dcaa4b922ae4f661be14f51360339432fa2c0bbf80d47e3ebf4756408971c0c1d6076189e8f3f3ede59075a50d9d1089b1e1eff662694eaa492756a71005a883c3363d4c594c13a8669593373fe011745028758f5e4795b5bde3c7a90487d4b6e1d860be6ab62e32c90b4a6814cd55dc73c2c29557dd2f06c954715c1128f1333bf9dc7dfa3dae02a4cc6872f19c2d21a6a1c62bff49fe195f6a369e17292289bdfe4372e82da2efbb6169d64b844cf2954a2ee9661beb8129a5a7a43133e8c03eb04c12e17999ab4308a4db67787c464550d4fe2e4dba0c0cd6db66270a62ef9230eff0dcc66299c11abe69d8fe3a50e29749a1f992bf3f7e8e9e25559b1597d2ba5dc32167e000c905ecc6671b561b241beb9bb003b57dd00cdd41c724776b70e57b995dd5bc7c26d1040e9ad221ac096cb6e75b414f72e4f6cab26d0d695cd7862bfb0d976a097f5f1009a12b0d6944d5a4f33c6b472c90087baa37b2502aaf8dd26f5405722e546ae01f2d12278c54b6bfe8ae2392953e61fd39faea2adef2cb7c3de965adeeebd9c83db8061adc851e706186c8f7767be31ed4147f910993ce7efa51fc164209b4306ed7b2722f30292abe3fd2c86540f6ed78d8168586510dc14088c7eac6b9bb5a863736b112f55dff93116812a4477a4b33526606e58d68c1e232c79a540175b8f021905a1616030008fda52ef258a7a3efdcb5fa014f66481b4afaf445c4f588c28eb62fef15c4c92e00b0807abe92edf500b99613d34664808f1efd162845b00a2357bec38a28aecefab7c7614423fefedbe6f125788c2421c1074b1ef6a680b9edab258f8a17503a4c40364d3bf40820d4746a3704f0615180f9e49d77dc37f8807b83dd1121f095300f0463d2e55d680fd49cc390ba09f667a0b1e3c4b5456f157972012ccec0db1705dc46e9d2da009261fedb9a173864dee2b63f009c253c25fa4038affedd379a16bc5e0e4c020e66e6d1b849a0ee3bcdc58426146b025ac21cc98648eb19983792fbbf6a6420cefc0b32f065d763c05ace59d13e6fd02f09c2becd2d78ea1f919650e90155719190377755148bd81ca1f8806d7b71b51afbd388a881b4a1913b873f2db80ae5ca065a76ce55d045a61ce15bd4a438a210fc29707318ac4cd2c27c3074f0a3dd237fc1573d03c65e08d7cc510e47eebe326501ce9bc7153250baf15eb5d9fc6ee4e6ac816af919ba262cde569c950214e76c82742082704f8741a45ef2a42097d0c0de681e9d57b86212e5751045c87522551f7361169418efc47a807c1238611c9f530000210b2ac7e68786355ab34c390681dfed5f7edae65e11b0a08a84784c51ea26379dd8e7516c1961d530049a20300373266cc04048ea964699170f18a2c424e50daa7079d30b0c6455e8671f201cc4ef60ccf5a193d61d8015a2d58b536d1b417f0439eae7601277dfc8f75116754949fc439d6fb2640d4813cc8922a314230aadac86c2c8181e72f5e5bce4ef04de320d35b59457060324de8000862aa6dcb9e59a86f7488b010953abaf7133cef51eb55cd054dea86615fcb1e65d76b0393343263fb4264d2693d6ddeff27659c9b6c7123cf61efeac10f4665eecb9ec1918a20c1d055a175ce015e2a58621be766d0756ccfd080943909ec5d87b748dd37e8f26560c642c3fed849929cb2a1dac6ba1a0feefbd6cce3e51fb5cc3ab352d8efb5466fd4591038ebd238dd7b7bea6116ada4d7a3f40abefbd6e7f7816f898195189797343edf92c1ce3fb2e1ee3de904919f191cd66fda77b0d7a37bebdf3ca88f871d90058cbb8cf047f8011669de472c64e786f196265281bd2e71426c4ce531ccd4e1e206d787cbf424df1d3bb76f118fe862fca54f7b9f7e77c1313955b6bf922c79e5985e0b33487f8ad5b2881fba4452a25764064d5ab6c6bdd9d9d3c761213dc231c79d70afef8dd6aa86b502b3cfd10693dd595acfdece9b1dad5c386a6c3b38d5cf55e6ffd1853680c8d046ad69bc55620103b4a0702359eda575e176e9f6709e78c135b30b4e2883dcd189c9d2fe0b9ede1fa6afcf521a19531eab28aed581093d93647ca3764780f4c79ca08e451839c6a34ab7b691f160ef6ba4942b6dc7bcb2da59449ca380caf0c4f0c0d5e2da956a72eb7482e5af5cc35dbee9b90cfdcc2e24f7c81e1a1c76b4d34c5557c8d4312260bf9ac8bf2c153c97cfb64ac412bb960d728cfa4a16bf8ae67fbacccef249706ad5f4f6e69d0bae6859d63471226770ee443b9e5ed9406ed0b1068f0ba6bc66cd08dc555fc139e80211491c47f0206505c4520afd39907c4afa7f9e645d1fefa149bf90b0d4e69d03a0b29671068d06e5e0caca752657bedebc0f63714f2617da15df2657d4a11fb519149170d178bdcecdb3c95f493c717e7a150d84f1f0d27c7d9e38b06ce3b5fc0e6f9a301e59b779bd360e39cc7577c71d8bb4f25bdf39e170f76d4c739ca5de01ce5d2519b771f0fca37e7b171ce7b5e3dafd8f18839d755d27b5ed853c92f0617b0e79b6a21be4e9e3f1e9e987b5e361ecf17176c1cf5f17c09bba07c01520d27ae80bd501f0ce5a8af061ab0e7e9d8bf3857f77a984bb8ce2ae3f4dd47a373ec9dd7f3c25ecfcba5178228d39330ecddc7c3336586b99a1e430bf165a5850e7b286171a9933226816241b17e893d94731cf5e41702f9d435cf4a3f7594278bba185c40f9e9e3e139f9e9934353129d501e4a94ce44c996afd8c90f27e6dccc331575b9d54f45bf2874cad15d22cfe999f530cbb28cc812d4299125eecd6d836a6ba594d26a29b5153f51049d5448d22f4ce13ca39db95b1267b6e2f48d119c734e6be328a2592c16ab084a299d55055c2cc2554f291d2549892e2973d59e3262b198e4c88a2e168eae3cbd196468b01d2365da60337dbb949ed43a6b66b67a1f2562442a9573dca1e7ecaef25dc95570be22252949a196f330955d6b3d1c5bc4b1e224b2c4c6598f11e765902238aea41f79e9ddb2737a159cafdf7dcfcec8134eb08fdeb149bb3c217e74b0e2574e05f1092ee1925b91cc1472fc4f57a15d60ec3c1bd7ee95b2e699aba84732512c7d2453f4c4d7ee89e62afa917929e62b67b1ec76b2d83de9bfe192c35804c618c19d1d493904c1d8c4faf4556c527dba91e89a4afe7ad8e45d609427dcef6aedd9678106dbaf37a81373a65bef63cef4eabd62ce7470ba081057d3e3163fbd4c1c459a091dd99f5e716df03407afb86a39e33c853d37888b21faf5582464bdfcebd4d2eeae5570f4b878ad6bf1a3a5b3c198736223478faec612d7566d460790e520577e59fb11470a60e06588312c388342153368e2287683d10daf36c11b15f6dd9def96ad3e9221d3c5134f918c7c246374c39f969041cc645cf098881366b54d534c50d021839453f9c84732465ea230c1876014edb1488f5a6b8c35463a298d39e2e8c5673eadcb9f5d141f6fbf50049f519f5cbd3de69c37b3746adaa6695e7c75eee288a9c7da757a2aedaa3295ed5a29ad5405653a9d1e9d4ee7accd029d597b8247f79899adb3efd5ee7512e7784aa72d720a45f0f4cbe0681abb7bae6c2dac94b46f7738333bfb5eed5e54fcdb2d948c3d3d4eda73564ae7a45305e59bce399d91d218959c4211484d561bb40cad4feaa92c9d9e6ad36e2629f5a27d2a67f418bde716ea5546da196756da9e1751214afad453d9aed6869e6ad3ae6c6badd796cf49e7384cd570715e99f46a890972640f97fc7423b72360be4e62e4f8b18b277942c35059e67efa49294737418ddc2e3d36d97e3ab7033c02d636ee97d5e4305037a920293276b8b1830d9bdc2ddc753bb4bd193dbc9d93a8e6a95b354f274ee724fb54516cf624bad1371d0bd633df2e3e8512f8ccb9585b4eea9dc29e243ea36e2beda480cddc2ea7a7eada2de5cd2c9db3e79c737e9785adca4945c4b5568f2d7b7a19f5785599749595aea2b2c6e94d3ca58c229db2305d7a6ca7d265678018aff75c3995accf8be5898c9c41d9faa35ee684faeca73dc2777bec6fc69fde1d6d6b9db6a79a6de7a435f6f4acf0b4152f5a9ca3d3e8338aa6336d7c4a5d7606b853eb58984f58df9fd7cbc2fca8262d15dce98b7b9f4432de8e99d6a3fd3c5231404f95120cc7717d3b0fcb0c6280bd5fb16b407c751f0dd8e3eb155f9d979aabe95a3421354598f93446e6322cbb273cd4afac2dc4ce05ec3629c3ce69586a639c8c70bf50ca6b1d0bd5ad632f94f2d7b90d53b72afa7642d158f88b73966556ce38382d09e36cdd4efe22c78faf76e9dd2b668e73ed76b22ca31927559aaa3357ddcc5ae1792adfd24cd228d5a9731dc6de9776ce53b5f7c060f1c5cdce4924238ef9ccbb7332c26f99f5ac7bc2aa747b833b25652a6f14ed6ff52cf3ec37024e8590537d4005ead60b103f30030886bcfda8707e4f65e4ea5236bfce79a1e655b6e79c935d94ec492ca30921ccac10cb68428832cf6ddb6b9b5b16ae77d36e3a6dedc6f9e6a938bb499ee734155555d5556576e33cf95b2633b799ebf4cd5cfae44229f68b2cdc6e65b1e53c850af84c665cb8ca99a06a1f023bf648dd524f3e3733b719956d3d49a9ab2e95d28b99b432e35bfa7515e85912027f47748ee90e95d54d80234b0f2ff690e81c5311c2b84598a69761be6d306090e809c34c1b58d0308aa580bdbb02f45020c6980276e23f603f100c79ea3406d36391cad33d595335d871eed6c9b13d792a8b4f217decd50b3bd73aec2a0ebb6ac3aed2f0e9ab159eb727ebd8da479dc2c854b0532a377621e6b922eb787da95ec3f68a525b10e2353d762ffc30534613429829a389a017ea94740223e348c6c7e0df51c14e9d43fdc971a6ddcea97a2aa9d513cf9fb017721e6e1e5aaf9e8a536d2aabb94a6af5e4c9af9dfcd8759f0a0af6eb18bbf58bb73fd52f94f29dfc10fb46c53a75f93d9bb471709b73b85b9c6f1bb785163e1cd530c7d5df7c763b1be7859d73aa6e5accf39d4f8f8b1e520f4faa5645159dae3a4ddb795678de5a99d7332b5f769cd72e0aca9dc498d339e7a1be50869c57b79cd37047eb9c70de8e372af75345c99cba5baf93350d773fd38f5dacaeaaef5ea8796855dae764fbe8aafb39d954d9e7647b95fd9c6c217d9d29ab5b5141a94ee5f75cd934a0756ca08b34b420c3670c184478600ea135ca98a2680a19b841c787b18887337438020526282222871dd62c051104c5134a3485b1e80da7830cccc477d7e143a5638d1d5f4c6aea018d177c01050eb017a02022882ac42cf102a63aae9ce00862089d23051556901733fdac5112871b5bbe6cd14112610861b18231ac38e328a9891ec422560fe4f830164dc102209a804881183578854c84a0c3cc17305003cc165ebca4df8f9d7c434abf52b248d04ec0299c71584b983428e1c84116a20794c584b504378b0539a698e3092c583831a6670bd10c9ad62893c31b4d3449b13559d1230e8cc122381947d6122628744b5e8c83f347325a78f161ea430c068e68c5098ab0388104130db0e880e6a80a2e5600461725b6203383684ae1064a3c71c49a1d90f0e2d5832586268e2622bcc08e5ed253d2a3f42b3d5585bc22a55fe929232a86d10e8cdee8410a3396c2a84087184c213d4abf6e248139c28833d0e8208bf902328d86f640288d0e55a441861a46f8d00507242272b8d2841839309a56488f577aaa93aa986d503746c8010837d6a891861a59f4b0800746a851820ea216f0a093820a0d4a37e0f8763acd7cfff8b64276b78c356831744cd15da463b3b44023fb8b325d7cfbd562ccfbf848c6065e6857f418d22f655ac096164c916608a51e76b8c01452c8e0cc173f24bda0bf901eaff4140fc8b4c0c31847cce1461354ecd0460a311042820932603ac43040d9d0c670c30d1fbc70b1820b5a82971ea5dfb803a39f1f6cc00108c6032358193556ac81454c163e6b3c2009130c41041d68ac01224b8fd26f155d80a0838b3137f8f9c9d274090a175e9ac8c227082176f08a1e3380a2d54ecfbcbbb36806893276a083a12c68de7855b96105455a9811a444183fd8204b799072385029a4322a603f5bcabb334fc3b6f1dd73e8bbbbbbbbafecf6c8c537f74d833ac2f8eeeece6ec6f22057629d145458a15bb20893ef322c9928d4e8b44ea73c4526066b5ef5914c1465de7e2413c5984f2ac39da0c8d163b6f342831202ce43fe74a4ab209d259d89741007593afe9ec423337eea25c51195c5efceb9f8a954887ffd49fcfbf57c9649eab5877e12e8a95292894c8280dbd432b560ae3b95dab414cc4899ae22d914c2d1a2458b162d5a84b6b64953ba253d7e335ca106b32bd4605669ad538eee0fbfd47b64d4534ddda74be5b3e7864f99e2ecf83c9e3cf6173289947a7bf5bcbe5c2412ead2250b570989847e12d63e3f5d1e4dd7945ecde9f25e4d07f285b12995fac2b8d4633a8ff9dd7ca9d317fa077ac8ba9f4ba0155c2570ae122bb8386b678a529c9254da362ac14831e4904c92626c6017298652175b69edfa6536a765175b1b7186eb6196413a95732b6f46cd552c92df8e183395a76ef3f517defc65d4b703c2b7e3c4f293f85646b19f4e8ff9e6389c3232fdb04bcfd395b51ed690c1184d00c9c1f492fec27445a31ad471821fa22b7840c58b0b3092484a020d3264b0a507054234a9a1c1115f986e7849e7a8f5f627f60be9670f490251d4c783f2fcf1648f47414f3d297bf145bdf6ccbe70d2c828cfae33c34c5fa8d9f2d4da1047a9f5d88452b75f343a22f645624eec6ea7dfec12c4569474ea3418e9a45ec1cb6292722a29fde2edfe6eed6d882cda5c238eabcd35ac0002f5918c153e6c2469379e89455c1a5ab7866626751453836ed6773c325ad21a8d8e111c49698c90ee12178b843f927e3a041a9cb5be50450330743b28e7783a7af24950e2dd8a45b0d329db525fbe10a7b5763bd9162d68e9c9cd98603e945ed8fd7170ba90b86421f96427759a9f309fec3a0d648d0ca48e0d26a5b6466b6a7066e992c32c68c6a62b894797d1e5d04f07e2d153d15241ba75728f2a8fceb557796807e2d1873d434f453aca69ed197a94a3aa0c51da97a9bc6ca903aca7729d7ea1f4b00aeb35bfda1776f5aa0cf23b10931ee5d50b973cebc39ed85b91df01d6a3be50cad78f8a74cd4329afa19cf552fa75edbb59ec7e5950d6e30a0aa40b1339bc423fb464290024b215ca30bfcb8fbf90b8f4a90489b771e9d5b779318245a63070881c5ed8756db1c53c0d164299108e72b8c5c22c4c4861af01a51f43c8ef49fcea2e3f55fdae50835e1a9c242891fd7fa42067433f82c886a8caa7f6851b989fce79192a93430dc605c8123954b9a47d42e9f4855dd810fbd8656c658edf0099d30669f8e884f6a365d180342d5a90b6a5c1b9c309a32b84d228fd5083d12db60935788532237ab3d04c7919a2f2ea5529f241be0d48e56d3f5ae4cf6d7cfbc0dd2913ea1a1287cdea1ff8100f7b39aea4c719648b4dd517b2c02de6110422d3069d5417e24ebb9d0f847c55e2d1bb676afc03ff3226232dc8dfa7e26c3c53f3020724896c8fc840cec8d4a53402030f332ef77b125faae4a735d56f8335f803881c6eb11f0d662687599812ea08a9979f99fcb2a031d93f7a21441b434c52f810c41a6c5c01630634b89245186abca6f7b08117b06661504e9f876b1f9789c9c4047989633457558a3498892113e667511600334c4b1bd28fd560b189f4e99a0dda0df284ab65e91bd7e92c4c51833353235bca98bcaca957537e991a2f4b23e64ce7e2102143ee10a7a793e7443e108a00c0b334621335b1c9e9a7733d98c8e1f643c59841cc8626493ea4cf24892cbb871199ba01a8e3f430410ef37b2a484df9705fe621f22624bf2df6136a30a6ed4788991c6e3f4d5f2505d29a7ca69a42a82278ec76565e2b087a1b503d528fd46fcb72e4db7e402ffecabb47d74c83d35b4864f0a6e9d574d0d3981a9c2ee9cbf8f5bb6bac68f279113e1a9d71e2b9c66a94d21485210233e4e5c88c918646436a503ba36dd182342d1a909645fbe982c4b9d8b5108bae0c200986e4db6273158489ac39f2d3372eb1c998d8e403393e42f0e1c363f4e160b551c00e3f0dc60777f8903526946b30d027e8391fe8216830d035a66eb54faff55e4ffba9f5d6fb693e0d4e0db67169359137210d06248d4caf9aacdbb94a6990d0983922023314e61af9eed2656af0c70fdb505193fc8d8b90976e5127dac2748b7e97c90be7cb207f8bc59ce935899833ddc81459f584aaa0f4873d2a2731474c51984bd4e0bc601a1c1202264be7a4a73deda27460be2a8a74eaf20bc17ceaf17310d78b616713da912e8250ae397cc5e173fcbafc362e5b0c05997acdf96ed10d1344a6df057387ec1b29ca424cd4ab12958c4491a5c37e6eb14d75bf2d264489e80f19f4106eb76878ffc71502f23357d37f08cdd57420ce5d6f2bfad9b274cb884fdf80bab5ca39e222f874b99d20d7d9edac7c7656768cb813f937478423ee447e8eebb42a8af4117c848fca57afdec625c7db848e88708dacbc2d0ceadb62d247296b3f9f066b7047960c7e217ecd43f8c223af79a8c136a406a703c0dbb834381d046ff3e26d431b9806a713f136a206a77fdee6799b9806a7bbb71935387d88b71d09f1b63342c0e4fe3053f3c117cbed455cc32acdf17d556664f4d3815c18ce8717261443fd1e5e789f8774cdb3a26e85c9c474cb5351af1ed33ceaab52e4b924e9dd8da7a2be29fd0e4f453f27fd5b4c8369405a9006d37e342f0b924f3f744fe24d869a29cc90aafb87d5ed3a5d6ba54d60692a25614912bf41d392c45351b93424a74b094b4a29599e4a52cf85258ec4b94befad26c0681b3eb7d22cd6e0cd8c342d9422f17848f0251f3857499cf5f128f1241feb4b5642a45a00126739eba3810447f28149bc251e3d2126d9d02246846e853408088b166a5a7eba9452762f207196c76e014b3e3af4d1a0b9f228516cae2609dea6c48b7395054dd716bb468832259aabd58449a5b99a1a6c22792acee5739e3d15e7f17109b0edcc6f48a725f9c25f241e5e968739898729252490e0c55e29f19278acd8ab29471aac1ebaf0557e457d52a9c19ebfae2cf216f3e45252b7ac926d9aae243e3dfb99aea8c443bb84c4c30cf61910eca3128f1acdd5f4241e3df22812cf88975cf4f7362d015a2368f322251dfa49345d5f86a64b83cdd5346a707a51130cd6ad3033f2e956f5a194d2cca85be11d7a170883c16c5882c15ed3ef50b78a60b02701895e2f1acc434cb4f43325a7f4d343cc35fd749a4493daa50446992aac6601f3d36358b5fc54439baa4f0dd260dd0a31914fb7ea950a94c32d4695681a255fe41c0431a44412b138a21a441c91830e40ace162044d43951a4c52c2c59431b4f802c98927704064c21a686039c2044068b8206ac1c5193b24f150c70db4c42b7af0218e1c52e0458c8bd774eaa55baaf82834383f8916262b1bbc800131268b1338b14501451731639cf18312d0d24f12160b766613035bd260d34542bd61ba90f8f40b9b2e257ec3879489064d170febe361790d9a0acaac61f4fa723d894fa7b1e952f2f120f97890b81227e15321896724065989f7a50ed52f8c627e8b19d1816b3c43833c0d522aa5f6cdf049989aab25b196d0eb55f3ac4825b99492414192c8fda12bf1e44b76d7b758b724de62dd524191b77ffafda634e8bdd0e0a41489a77201c916eb12a623f19e170a8d1c6e3196a77281e5493cc9c793c459def3da62dd4ae2f1e02e6480b8e255438f1e72c0f48a5d42d8699278b28b0d329843e8a5339178f1c5f2e24b7a1a6870b2bcf842423f18380a9b2e9ad4ab7961ddf269577c252971230d20242fde48438c1444a8408e13fca4f1821b7ee8e2d5f373c4450e673c61822b4dcc90868e1bd830e38727aebca6f7e022cba60fb7981a2f5b6cbaa450afa60f5db911659cd2cfa5a69934cfb40b174d9f683ad6ada02906cb6bfa34d347d345c5f8027b2975d274ddd7f4e9a5c1b44b13030683c1c2b44ba6595a82bd310419b0d7f409d442334bb7d4b42bbe846233c8a888680e31fd5c337d7efa168b2f5d091a9ed1152596f0d20333c0f46059430d9fa3352710428828460a30571869f146181c72e0c0e18730aa9001134bbca6534f8a0b0d4edf86a66f44d3b7581b398c4d5bac69ba3623e26afa123017fc9c1b143fbd69bae20bf6d3405b8c2e4d170758f082344d148105961d5ed369d374ad90450fca3405e1c68f0c5ed369d274aa349dab5b6c8bb5cbc8d2f44d084cb722fde99b191ec07e86db999fb8c8875bece766f433dc8e7ece57b821fdf44a93ba155e21aad4ad5083fd52b7c20eeaa06ec9a506d3744b760b06fc214dc2f9904a4a95a62be5b109bff023e9484b1e7e5a4aaeaff4109cc816ef745f74d612ac751c87bdda9b6912a8814e4c99d3a2bd20e37b3333324ece524b83411268892c53d50a2e1609e912d0c7403feca1a11eeaa31e6a1708404dd462221935621da68dfa4c2375520cd6b476a5a442d3c57a62882c3028811534587a692a4dbb4e8dba25d42e000cb5d3a130dd3a436368ea501a653ea460be5164a870e385d218fa909a0159f215d2a46fd7aea4b16e8553e9b974abdaf02d5551faa53fe99753e9de9c5329f71e9a4a2df46b1acd55fba90e494474d116c4557bd315c8557b3b5d816cb140bab6eb2185410e1f765dfbe635981873861a6ca7238753e97b2a754b4d3883c4338da669fe24bee63d7fbdea85f8eb0caf94c9a899e3a7f4c4f08638930234ffe3e3991414dd4091e5091b6c471a597e5d542ea0eaa8a38e3a5ed3759a873a0d374ca79f6a01d5a9d38f06eaf5fba2baffa25f9e2be9b29332bf3b572fa925fb87398ba32f6d30c1030e57dcf06a07a7abc7cb14368062091b8c41dae2d54127f082cb1a659c51e225821d04f1c311195000ad79b5b364770e5c3c3232a2e9e527c3b48928fce0305f5fe417f65ccfb1c9132eba329097d6a38c2e949f3cd4320f6d3e7e29c4953d7d666e04c378e685e99244c495751bca2da1dce2c4d20c62d3181816f2066fb794602972094cafc25c31d94ceacc4b342f3dac60882a50afb25c2d79cb4b2e2f6198ae8eb03b8f905e1ebd741a4487664c88e8e52b898c97f22553a9d71cfa5738895ebaa43f2f815efa646a977cc9352f612fbd12b52bbec0800153b5b42b4a2984c1e98a2f59372cb89934d3203518d11c7577d3331fcd34185d32d1222ac6cc51d114038648c8cb161a036a30522d47dd1dbbbbbbbd5a91df718506a3ebf834487f9ad67c9c430f66aa6930cea59e2a2d8fa4b7ce65de49294bef9c93a9286577dab4ec5e89ba281bd4457d594bc949e1acd05c5997351a0093966b8a0f6fc30a1989b14836c9e6b40011867cb0a305154e0f1e37794b9a2e0660d70b4b9aa6ab014a5c0e60014dd70346d8d22e08ac20345d1110e29200ca052db33ab04b3f52f71a05010225052ffaf9f9f9f9f93132d2604b9c9a6c6340ff09bfb0a401668ede3a18cbe10e336f8b1ab43bc4287100eb013e02047c8508ec18d24502ce7599808348641f539cd368b773e39c8683add174f188f5359aae9ba36b748daed135ba46466ffdfe4cd70ea5fb737feecffdb93ff7e7e7ad14eb5607b175c34444ead68d508336c90a4d178fa299f4f2f022c0c37c002bf4d699b43ca61d03f8f01a3c8aa6eb001f8fa246c0d7af2fbc79073d6e72b5c1998ff3e1a5bca6e6e7a48d7d0a6b7817be4cc614dbf970cdf3e1239fc123c6834bbb26f0c55e9d2e66c2d205719dee8adea67e781d11100f33290d3161c26281a07b2a9583f490c2c50fc575fae668ba70d35c59ef84582c10744fdd20bd85f2e1a51248c0e334ee632744f38408f130131043bcd8e0fd3ef076c0de7a0b3e6f5de5c506c3eea713e1c34b396cdae33562ceb6134704b8155cf3565821bf01019c7dec46709d1e61842b0fc04d6f9debecc78ee53acd7558f3581ebb1d162c3be0a404cd898794e2c2110faf4c506072a3c20a46dacd0d8fac75d549a148bbc959db01dbe123c5eb32ee8b291648a2e011f0050820b196b01ab0a40b1e12061996f24c054969a08a52f622fe828691784898f48161d7fa399bcd8b6fe784bbd5cec0a3752e5feba2f8f8ee0b45f0786a5d330ed7690bb00971beb3e1a668ba30d39ab71ede18bd75db39a18fca321e52fe64e93c9315673bd9e97463b7736383eaee3de5939f9cbb38778bf322b55ef40dbddee9c4692e9fd3ba9c73c631d33c73dbed64f79e344f75d2b44c3b69a7d377d24e278ece586b9f18e061a65ed9fecec34c9b8d17376072183992c182e9a3512ccdc7e7bc7eda65526a9a952925aa3b6d9e159e5741916e65ba76513bdc7bb3c3bebbfe363a882e2dc9a6a95bd7ef186fd1781bdab4f1d6b310b1b5c11accd2aeed27c7ba15c5ad672edd5ac1ad67a1e962805bcfd633986e05c0ad67a26ea1e0d673986e9de0d67351b79ab8f52ca65b26b8f56cd4ad216e3d9be99613b79e8fba5500b79ecf740b8a5bcf48dd52805bcf68ba85e3d67352b74470eb394db78cb8f5acd42d1e6e3dabe9d6086e3d2f752bc7ad67a66ef570ebb9a95b2cb79ed7740b895b1f6eddc6a75b4adcbacd4fb792b8759b2c3640dd5ae2d66db4748b04b76e13d4ad1f6edd664bb75a6edd26d6ad12dcba0d976e0171eb3642dd62e2d66dbc74cbe5d66d86ba15c4addb80e9d600dcba0d51b704e0d66dc2d814d988b131ea9610b76e63a65b29b8759ba36e11c0addb9c894d566edde606f10415dcba0d0e62eb895bcf41b1c90eb79e61dd02dd7af6e9d68e5bcf3fdd3ad2daae44d07a98b7bc96b7be0529bdf55352b712e0d64f69bae5825b3fc5a68b1b3a0575eb03b77edad2ad772648ac23d068a868e84434741a1a127aeb5dd274714b46d38585d0744bc7ad7748ddc2ce020af1929f60a9a6bca4f46177f4d6f152b7f27461a2d90d75cb006ebd03d3ad03b8f58ea85b2cb8f52e4cb7a4b8f5aea85b0870eb9d986eb5d0398b09c87230e539b57442234b4fc526a1ec3ccd7144c0f10fc8ecf5c72e868ec7083cfc03f2513d583dfc0332cbaa4839719e655996659914e74e0638c093feecd787121ffe0119bb187652fe01f9f8470bfc0184c9ca9fc407e23acdc56ea789ab027044156400ef4fe2c76ec7052b4e3ccbb29bcc9fc4d8edecb877b743c45b73bca3715eb839b7c5d738ce6f76efb65d6d43656210010367c3381c2782173f7622b84e779e13fa1e650547793b3c7878ec7646701b6fa7470f8fdd0ecba578ec7610e09cb7e3c3a5548949bfb914d4f685fd9b77ce79a12c7a0ecc735c447a8edba478d7420baed39b15f92db460008fddce015ca77d2871eceda4dc63b7b3c4416fe787732d5f793b409cdb61e2dc9113bcbb9d267ec48bffde4e100f80eb343700e712e0ddedb8e04e766e5e0e229177bc1d21ce09f1d8eda4e01c0f5c00280af03a588fcf5d48c00e180c0683c176c08838e703ef50e252f8a6c8f3bc05af13d3a07504785d5183d6a5785d9806adb3e075440d5a3f80d7813180d70d1d11b93922727344e4e688c8cd11919b2322cefdc00cf0ba15bc2e4b83d6a378dd0f130070eb374220b8f59ba1225ec48de0a00f717ede7ab805bd756e68ba76c0e6cafabd39a752ee20c862ed80bde586de3ab7345d3b9426169aae9ba2b943895bdaa1c42ded50e2967628714b3b94b8a51d4adcd20d167aebdb951b261e134dd7cdd15cc1ba75231441ebd6b79fe9ba196a2d69ba78c46e4e397873f41613dd0cbdf57b734a4b0281c3b8008ebb1d284ec48bb27bc271274ca338615fead68d5bc74cdd7ab975dcd4ad935be750f8c6068c2728ee0607719dbee97654cef9c03df0102f7fe01ff887c76e27a5e254d887c7ee7e4efaf307d8c693ff01965d0f4779f26df0ea773218fe09e976709c0b01731f5e79788d98635d050fb32191587fc22346c46d2ae56126c223f6f623c2a3082fc51ca510564694e9d58e134ffe7bf28f78f2579e7cd0938f51f23727de0d7192e73062141b1ae23abde344c09d5cc64a048d0660119c82a7390144c0428464348e60215e3c624414425ca73910f00b37d56ee7c606871c7ce3c59cfa914c1754dc7cf09ebb27fd1f3cd0089d0b3e709dd67154f7a41f67c9e190a03e1a197104f601789a0b00090e12440b0b07616991431095178de000789aa3708287d734f13a98d7f934683fbcf493939099420e95916e47fbb21c2178f259ddaab3223f04e744c04c3ccd5d4a301020b90908093b3e1a19f103e4086e799a974002fef1c3e7c7122323603f72f0124f731296e054ca86540945a8498d8095789a272901fbf081a6857db4e0f0d1c2d9ebce7d744ffaf3d77998e90b97518c8dccc22c4f73242edca347173d98dc8f646e00eb91048fe0699ec304f3e0816402e6e14513b28f648ed6f0709de64cc03b3cfa448ef88fee09fd1d5f078b39d68f787829074de847a322da78224e280958044f73231e6e6a8271703ebc64e345ceb813308e179f8827ff644696aed3dc0958f3b218d97e348aa979221ececd89c71431c73ac8238b71e15658f3788869904751ccb15eafc8b8c9431e456f7dd539e9c74b98a941eb26c8917d098733627383b604754ee21c4ebee79cdb3ccd35cdb76e475b610f6d1cdba03ad035075720f7a9a0701a8742a15cfab471f9d38643390a9583f36b3bdaf524909528e732ceb911f0e669ce69db46679c93fbb2f82baf1ff4fab1d71f82179f02c00be783f0859d0d6fbd88170325e22dbdf5cf0bbba2b7ee796167f4d6dd1be2f50bf1e27fe0f507f1e2abbcf840bcf8b18717bf7f0714cd37e9dcc9b7546c723a75ce79fd98f3ce65b7d36d7e551ba77956e6f3fce68536aeb24175270ebbe6d835d79edbb20acae69a6b7743a1b0c78e05cdb1ebf4e661bf19b2d2732a3649c51c1c1c9d566e5e4e9357d3501e761e9e3cdc9c73e9a950dd69cba4d60377de6907391a1511fb900718b47312e5f84d07775ed7fc7ea1945ebc9ea671dc178ae0b7eb996b1ffd78703d525aeaf005a7886638611adcbcd42ca3db903d218738611e45d4adae3a7c3b6a48e9db5160ba25bf5161be1d270c188cda21f7b05e2855d55e8a3de43c547598abf6d24bbdfadd503be44a838c2bd037ddb634b587156813dabc6c431b182d9db9fceea2f8f8ec0b4560b72c0df606f46d5a42d426f48d42e990dbc32dcbb787a8a16fdfb26c409b9676e5867d6ff9768aa325f60cc528db63b7f7bc2a0af8ed2d8768908bf227472314acf9688402352fc247231dd2fc4d7aff681454f4dccca44f6e62bf2a28d46386abe717d72c73eab81e207e3be9d84159bd94609476fb8159b858c42828f6361f8d82b23c277167d6ab7399a779cd2147e7248eaeaa4e5d551dfccc6dfda2809fe94c2f7329dd3af8f4a36bb8a270c8d56328ab8720033d1f5f7650eea5623f95f5ea5465bf28e05707bf7e6083311609e5d0cb09460cb18b3448acc0082213d8200b971258a1822e6de04046092aae2852b3b0987467403f4e5cb921290d2f4cfc840182074f98c00b2d5a9ca14676861bad5a82254c5000f2918c165bb4e0e1816068d0e808498632ac5be2f4c9d23d15140a83c1b0f868e6630745c2607fc5112b7eca2c8b17191d2155a121a22d5ee5bb9265ad48494a52faca182d4b1eb1d9adb5d60cdf9b69b5fa90a48f9e752745acd382896c0ecef842c59ce1023a7900f3edb4c374517714636c0eb208e37b4716519ce13854f44a51a7ce4326f1d334edb331327d8c696c98658c6b3cede981d3e2694f0b7ee62461017b20c415a53909f809c2037e7a04c3fa94043f5dd29f1ec37033906ccce83166769b51070f7925856e491556c842a847163ebccd473259c0d0483a9bce59bdaffe546acd497a98924adddbb3d2eed94f701d593863a6657b6da6b6518371ce8bd44773ce39abfd12c5a452da3a6f967977aee49cb251e0f86b29a753fa517c69c5b3d3542963adb54a4a294d7537f8b160f6d79eb5571ccf1aec0eab809d71c0b9c3911966ba94525a6b9b075c8c2594c1328b34d618e7cf8c69add44bdd3461b7dbe9c984098b0582dd03a0f48752a323a4a44c68a8bba8b3ac6b96654a46f2288946876920ae2cd06043e08adcdd32ce53a4e16f7ae028c69194a398d654663db670a5e1e421de0cd30ca76badf5cb33e3746bd669bbd2254f6f984de7ec76e8a4f35e2abf3b69537ab34a7d6a6165a419b5b6d2ccdacc567abbe532e644ea74465aadacb5ab6c154c195053e8cc1abdd4fc22d8aaa0d8fa55c1b3082ebaf28e974fa76d239c54e304411206270641f2210e52def121ce7bc76030d80faf7982b83243444412cd9820aee2eff81a3f9c20f40b32abc4100789474ea968d974c545c69ff5a67c66b1a595524c69cfeb34a59489a462f3b1ab36762a0bba108b5ef7f3b992b98da034a3d7d6fbdd23567a2d12579ae6deb3e9165cb76d3aa3adb5566bad4bbfd37677ada8cb4d3a27fdb20696e6fcc25a5f48fa486d5561aea267de0c0d46d78278f91a87e9f4a61fd2a792468cbb453bced3749da6b2e2eba2bd923e35ede5773735d9b1e9697e3dc5d4d8444a9a533127bab59987d6663d1fd2d983569a691aeca40671183166ced82d5cbcd09a65599665a9d4bd2864d99af6e92cad8566dd68d2a861f221613eba986be6cc47efceb22d718df49159a8ec8e34ab99cd325b977c741a64ce944d0f95d6196348e367a404b96b77cf2ffcc254df2cbba9eda66d69a5edd9a75a4a2995a19b055e69189d46b79e6b74ff2f080ece4fc7b552cf7f4b0dfb696d2991489c18e7a45efea6f58ba1c7cb507fce9e2fa8d6668c837132c6c1c138631c8c536666367af6e1dca0f530c6186908627266b3cc33cbfa6bd31eadac3293d2d66ce2b6dabd338bf5d35aa3f87ead699bf751ad6a56d3b2fa31cd4be974bae2110c06f3e1155b521a942e43cc913e6db2228a32a66f85e72f7d1cfb5501ff0bcd34bab744871cd210aac8b87ea12ad259269323c09129f6b075e9619659cfac53c93e9c06a9758a735be1d568e6797a997c51b75eef871b5c82ade70627cecc387a094839c45d1539c46f371ce73cbcb7fabd1f4ec655f0636b8b7c54156930fa1115141bd20f65c0a1def3b58b4b37f770f330a5dbe6746edbb67da1f661cfa8a535bae86bd28e437e9657de0fd3d487f4335ba374cdf9c5336836457eb4d65ab194d265a8b8521d709c27514239c619299d9f9c7376e1ba5cb7de025ed785d8182594a97352b69cb3ce8f31c7528f42d0c8d9cd19dfdccaf7e757c7ddbab9c6a01b93434ce91453c6cf868f5e5190716aa52eabb40ddf4a747e58ca0fa7c19e6d6b566fa532469b1b67ce8943299d4e854edcad5a67d3302a9df299d75abfb849a933334f86fab2bea4d3059d14e3c4534a4a29a5544ada30fc516a60aeda979462d39284c5a52897967e989ae4921b59f6eace7035a0a4a494a4032efacb4c8232294a59ab9452ca1865edf0db7962cad14309e4dd8a2f7c07a5d65b6fbdf58b111604173d19eac7482fa5f3de54ca87f8b044872ca991121c993670b75b32ce8c02e72ad2e90ddecf67ed56419329634c399125cd6a66b3cc566a468ca9318e0518b240f8424a69cb3aedd82476bb9c5e3799ddb2e79c937ac7e3834a2b75d9d309fdfe32a9ede003476393fa418c5ea32b82105d278f391fc312360f03c07918c7600f23169d87f1061fbdf8e827afc3e0f5c2509e385dee5cf44f023f7f7632e6549f14cb8e05af1d144ba3a4f494d5b9432516d9ae5966b4318bb15614a898b984b21a8c4eab9dd99c5fadd72dcd94b6aacbae421a8d317e617bf79d3326344454ad56b5feb90d94a3df8fce3953a939bf5073fa454dd3b448354dd39294969ae69c3395a2b118a3cb59358dd27b959672fda6fce8446d91cde563df2e93baa5ce238e1863ec21f821eb1bcba2798dbee5918cc1a65ca121a21fa0a01c97523a0d9b11e9c82815d440dd5c421a4e1edb87863532cd965884bf507241f3934a9faf6bb64431618a7c8540d6c9ec081d1d9d6e49d796b9d53c6e9e05a6b020969a79aeda897461cd55bbf5ba8044ba64e93a5dd433c82ee3ab697ba43dbbc418bf9ed6e56d0f73a594c65863ad2d1b6bf59942aba98e95b4886b189e8a0c1453b13edd0af57086cfbe10fcf87befbdf7b35281d88c91a3c7ee5a91d6fbba157a8e84d967857a68a54f9742ddfaf4ec7eec5a882ff9c5b80aed67a57e5da4f758399be0c2ed0b6fecbcc3e95628037d2ad8e3dfd377e574aa7e1bb4f8b3a279c89dfc7a3d9d4e1f96ec1df759d11c86cfbe2e28cfa84f8753d7755dd7755d773a9d4ea7d3e9e4359cbaaeebbaaeebaad3ee743a9d4ea753d7755dad5e6f6dd1902ebfbba5ec9eddb34a99654ea775dc6037cfe334d85a72c8faf6cd711a6c4781355d77aedabbdb639742019143563b4bd64a83d0a86599a69a4eb5ec88c69a5e9110a41e16f93088cba52ab314ec23cf22cad2290070c8451a948dd3411a0a2e4f17fd4218be37a79aadb5d65a6bdd3eceb50f06549e2e5b6badb5d69a655996655956c3193ec412e34a7a6c1d7cbcb0d450b32ccb28a58e039317752c3cd3adb5d65a6be987857af6ddb98ad65a5b6b751c98bcea87a5bae54a2821e4f9507ac7488274eac59824ecf9f08b318974d93d91df5ee3ab86882434079633696e40c79717cf97f63c57d17b640db7372f38ea5ea87de195dd8e148ee7c3c845dcd8797a5ed8b9eedb60fda8c8407ffbac84607e9711e0d849c1df951ed8eb0a4f0d754801060fde90638e3a5ed8b1f4bcf087a5f3f859096178fbe12ed83baf06092b8a01fdf8dc60c3eb4aace3f5f3e3853f1db063a9014bcf8b73cce485bd06fce5b99ace711ce7281f72fb7461a921470a3296a0010fb43802e9c5b94fcf8f8f8fcf0f9317f61ff085dde727f5c2fe735fd82b11ae3e30d80b7b10b017fe6ae8e982831be26022052bb0c1062f9f4b85101d5c5e3e3e38dcd71554130c967a5dc9d6c0602fce7d70005f57261db017e7383079711f962245e4408b9f2f597cd8e2f5a56fb28831262905539421e635b9f8d4c0e708336bc6387a4d1444b1050f6240d1850eaf944d818f7c135d3ab248d5ad25e5ee231933b025717c777777dfa08c3f9229a3c6b7cef8f679b5639c6e7d61952259b3954e9d14545841e654e63e922903c68720124958a42d7c7a90e50d159c404889962b5e008b030e2038b8c091a948420755dda1e22acbe4a0a84c99bff948a60c9126c4419975d0f1566697301f9deb80182058f3ed610864d02da554720a7b843431d14c16df552c7dbb93c88619b18c30df0e46115fc851860c221a2fdf5d7c116b00c53716597c7b175e7c1187956804b3e16598517062f085096098b043add9298432c68888450d90d40064e3db3f31862801ae01044b0d6c503024893805cc8697a171bebfd0036728eb14c220854d10ad2fbe65f78453f3eddd39b95ccced1482e0281be3db67e7c49ee0fb491d621215c06ab937f87e32b9503a29a5744e4ae9a4b206a7f0e713df0540157d37f9febe67ca2c0917503be43012f6f2c99411fa48e68a18928f64ac58fa0aa65bddcdaf82a9b5123558adc815a85b6105f312f69212f63aadd341d3c59a49d2a99ad824be7c8553493a3dd32efa6a2e625e7a0cdbcc4b8f619f79e9316c342fc356f392e9e7254543d3c8353edd59b4bcdcf23294a1540aa823a8840c7765490c32a5660680000008002315002020100c09c582e178344d04c5e20714800e7a984a74529989a44910c4384a19638c31c000000110019a196d132af7690120ee74a835c5af9be19f9ab647821b03d6d8c93d81b6b8d0a8cd4c6d06fbb4a2119cfa6c52f9e3813a1271ef9647d05724ca87f16151dbd7b7c4223a63696629984669c69f38f53d083e156d27c07cf1ba6b95d53be78e79bee2b2fbba80362f430d4e537a93c49ff6ce71cdf2536ddd8d394465f905d88135bc4899a30b62666d361b0df7d8b20c7d9d7e604d99835e21fef701cf4592a79c7a7550aa12ecaf725b5b1990148dbf1cd14390033ad09bfbfbd3845c951a6de8939708953ba52750998ae77c3363dbf1f2a8e9b66abc81b66fc3f89c35b100a504cdaf22490b2fd49351382b9d2a5367e802e0c204041202076b0d740aa0a2427b25af83b6616c3e0f5ed9fe3831f54627a60243204bbe87c0b96b56764e66d2f5bb34fa6f199040c28764f7f35fb2836d16bfe4d90d8aa8682b59a6fb6ec007d3ec2a81d310fd79fa72f3705c7873489e78e4feb410b23e32c4dd5fa10089d3aef07e9bfbdf0af5d2cfcb3d3156276e003b36d60ffc1790ec48f603a3027b4fc10dab4a76ce11c6196c33d258730f982c59f912161f982796517da77221cd58bdc4959def13f8238f2d17af2d758491137dc458c6b324471f094a206f0d69d77c890248013431e872a448c9fce8daa3f103a58925a134a39f51046fe4c9809b1834512982b978f672d4002d18ca576fb014df75328b1c05a223ec62997637942820fd612f9c846968ffe8b9970c908da5a001d724df66ee82f6ae9c349d888dba18850782f2765aa6b694decb1444d696d17ac1f1778b0463bc48c0dc70d48a7179c8452401994164ff82c706441e495ca8f72df575626788b30e498145e43d762eaa2b9d8e24a90176dd16053c79ebd0e64eda77f59cd6f8b7e415d8fd4411c73da76d92def7dd538f09a508dbd347eb7a36da4ba1283f9eca17db05bfda0ca83f5174ec83a1478df6911c362d5a111468a3630229dcca4d6439c8d08649723aaf82c8c5ef77bb7737ec56615eaff9d081144bbad34f46f1a510131f9dd6dd54ade4098d53914e03868f61e4e657a8df940c9dcc7aa1097d2e492afe783402047f3fcd7bb37120492503a0eede32aa9a231809318e137624638a56f4c3d8486df41840852b7ce6d135e143d6d03a4841c8debd347441dcc0c3a01c62f3f41a110ccac370cefc95c89580f1868c07aa9d59ea58e15b456db3e37bdf3929415e405f0a0e26ceda283044a413c53c2f6d8c33de84e25ba8a0b4658d3d7a0cab6f8d82b20983404bd71a76ce813686217ba15196a01c82b9a517a1d1ebc6151fff856ed13595e67117d2bc05afd12a8724f18b7ee874f61bf95741cbfc8f22bdeafed76f2d672521cf64932d487c223badf4e917dad47c5d0844b767d9f6a2628a55577938f18928038828a4a28609adb24ab8a320780015226a798eafb9a769d6bdd287cfac5e0cdbc431e8d116cacc8d3011759d48a46802d84c16fa4570ec5c55e47c61d600f1a7521b5288dd70aece09ef11532042cc9de3fe71af8403dc4381aa0e1c3ce178a9e760d3f9b5ae0f9c6d267593cd9c87ea02414d9c62d09f0b20a073c9cfbc6fe0529743d3f40ccb5421d78e80b49242f4d8cd1698f520e7066ed94a4dad0e44e998afba4542eca6586511c070b32ea39b8f82c55128fc020dfb36d0887fe60a796c88f39c0eaa8ae0124c4dd2255239b84d6922ea65ac4f0f1daa3554d73b4954cf6706f789c5d7aca6a3d2e3ad26432e829ff14176ffeb3913eac1784025a7033c49d027485b7c0e6a83f8a493286164037c23f3e35913c36db6ca084c8430692f9f950eb9930cf0e66096cdc1cdfd68d999b6dd11bf18191dbca081647486c6c41d74ef55c0086abe80e3cf7af17dcd01c8c48a04d2c77117dd4ae09358099789c9a319b24d816e4a55cc9de288879e492d11870b4679b7c71710953c23fbf628dce27a4d67f851ad6ab9273149f52f78f90f4892f9a72958fb1432fc4400e62f589f21e8547cdde573a5273921281a46f2fe2cc9e132445f6553f0daaef0508d4595feb40256447cfca5ca7f608ba108acb9ae03d39face9da4c84bf32fdefbc3fe47e63ba65ce96f839c3b25f55102f805d039a9389d3cf117061cb2bc9fe5678226b5f70a0183cf10f0eef96de4b81b74ed21f46d359b9acd31780b8c9a9f879abd7d2e67569a48a7f1c36443518dc02cc5e05920082a2a8df06c9cc5610abc080fe1dbcd110ac256824b67358ce09a130734c831bdb4ee9815b9b4881d8bb29b06666bdf9c5cb0a999354841eec7d1cdb09777560b07cfee03435c606041af95363db905b029c620a2e1e0720edabb218b9eb3773494605217ca8ec544ab0ed64a9d7d5fbf161f1ab0bad61ff1409b8686439e4d678a866dcf5c95e6520087ca106873465e682d1d45527122dd0c2ee1116b23e1e7b7d60c5a9a7605f5815fb1879a0e1dcbc61327008fb634d82c80a3fcedec5aa513384e66cbc0fdd1bfc804acf24c1852037e66fc080ea22481ad1708272fd01962ff051d6557fc3d2f1a6226d133410c5a903a03f6ec4ee542b27054b4bd2b041a98d81c09b6f0017b0651e328ba7333a32de00de561cfce4eb75e407699ce0aee926f6758bf491b3580ba16dc4bab64fdf641d2a18e68e3aea0d5068f1177c159fdc0ad58f2d0330f133a1793c1c100cd4b1589f172d2d1827b2144d26fa79e8a7a2d33de7702a11427efb04cc60d309743dc7882f1d26049d73fe9b57b39f5dfc9bd503804ce207e29948c464bc469853cdbb5d5aee8991657bee88bce4d3773b33d0faf8c576af72908e1e80b50dc1261c86bb731815f4eb1db39c57850f3f243ee525da8dd5804920ec4efdb35453b01db8b5477c61377a59dfdfc49e377c4590dd024190ac6ffe24727c677023f7f507990843ad5a936440c2874db33c4f90b084806ed1904896bb6b384795ff54fbb186767cb4073b5be25b6c9305902a8d8fc1f90e4a1f29782af8df46815621c486686b8caf86791bf76b036fc484ad0f3f3fff31b9303775e2b6465d9471084a295fe4058d7fd0937fb02ac775e58f28b44fb2af86670bc6447a392d6527492b83ca34affffac9f49a4949c673354605f5beab7b13fb30cae04e4d4c67f80bd0b8b6396d03cb4243cad90a5d76ec6ed8f3e0401fd1bb16140c7bff5d1843047e0d0fb727c8b15f48b768f356abd6767d3a958148198ed40917290359595d8ae6ad1b73eb444fd36f92156f7735f29bb337efae7103b209e690fad4c51ae294ac66032d014498ec7fba5684219b6e4b1df0bb6db8785dbbedec9b3193c8d12baeae4f06e720dae026e61b6d5b68cf282021b50f8685e0a3228f2e6a63c0ad0cbc7bcd705704af91c88393246aa81896955f8e431bf45b2aadd7d40dc188d942c1e7734dcaebcc34e922b1d13edd3d674bcb6f27db6efafbcb088f9b374f329702a38de9a5d68379e9b2c1dd964e7f932604acf72de1cc1bd0b8d5c29d6b7853cd380bf6d4727cf94643f9a44bbd2137b747ca42b71c255ce0f2f483f4506d4c76a5539b905dc8fde9cc5a3a2d40c3e4418013bc935f36a24a50ea45c626d2ee3c399986d10420eae5a5de6c92af31f2366242c9d8e2fb1c600912477390722dd556183be27327492b5befd4744d5a0d8bb5a9aa3466e8c32a418f6aae1bdcbb01a8caae310743c2773badb0ce818808af43da320c1fe1aab66304dd0e2298cc2c43a0070ccb04eb265db263a195f18af9dc2f87411972c4de59d871db004d6c234e0674683a7592ec67c564b04909f6c4bae702dfa7d656ed4ace9b3a0795785f9c45a311c9853020b82d909bdca360d4541f634fe55ec01e0282c11f971c4ff69603370f8f84c2118adbde8ca943595eb69ea300d1388bfd485979623a3846189d8f41447190e5007f86d2f3f9cd9ca7da0ceef708def0bcd75763ae857b560934d3aae1a3d5e5d25546eb4691431961e61fbc670727cc04db429a1cf320e8a2ed92f6caefe2e3b4c8a09be85dd7720d472cb8f935f6b3ccb1e1665efd1333c635a1c56ea545513348ceb295bdeb66288dfccb26c4d714266d9fc883bdf888f22d8bea17c3a5c74106d8a413645827e313463ddc29742216f2d2276dd41eeb6dde40b38353d8ff78216e11acd9c3e290d54bc13034a5e39c9c08fa7669f369b4e39c80d985bc02770bea5f1167ef7da95cc0c175c49a1b6a912c3df508f7ab7c931a4df52570b7bb2dd3abb79b3bcc3a44709459e9cf8fe2129ffc21cfa19216b1a33deb94be114bc67f34011ca99dadcb0c1cf411f10b647003557b382ee99ce1f3b2cc19fba595a24f33bca5e12bdb78bb361f1e1a9607b6acf2d71a1f10b6205211b9724ae51a1b07889606b18e4dd312f3cf6b58c26482286915bfc9041c6f94d7ccfc019134a0644c5c6df12a7728e8c85c24df6aa038f9efa566201f891d0554c78963d3ae0e674145f47d19ca1f9f42ad0ebd529873fd38b240b295400ed2c49b4d22d3a589cf8fbb841aa7caeb0b9c0fd74e30f398d15205d31deaf11f0fbc62fdd326d22da8837c0d8eda902ab2c84b8b75f8bbe9cfca0d5766d534c422158d35a2ebbe16fc49f690289f467a478aba93258b5354d5754b4dbc9b54bee2034b6a0e9f2b24f1ca016d018403415c8c6bb5ba0dcab708fa588a86247e63545fac311529fdd6dbdf769a6fef1426ea94b7d9d8e153c3f0371358b364b4141a7dec54303badd439d3112cfb9bc067adabff78974b4cd78a6176f42415b338c1e7a8513bded7ad95fdd612352dcf06e8b54dabe7fbcab8c1801728c6641f132f1a3f102c936d80b2c488d45b8212a2d20f2f74e3672251b0fbc9d464edf4452692aaa47b1d227ad14823d7a936feb014b9cbc3ef6225467039b4b82f52895ab09734393003a266bf137eb7989c83091f4d9978cc9228fdc959dbee22e3ae038280c960b20887067d3bb6d6dda33ba56e455ccceb4fbf62dd7b0f7bd3bdf5c2739e94e79754b0cb8b68282a30b2ed11b60fd1cb00f2f92b4001a96f170498089cf61e090abc3313325253c3bbd7a71a672d2ddf28493d2d923cea6018c5fb31e756852e285f0e99249ad138e66d23fe102b0296b46eb315a4c5bb3ed4defddcbfcd1b1b2716f525141fe4e405aff7ce31dc60a3aa489bbdb337ae54bc2657b6ca74134cde0277efd6a5278e26cf53fa0227f05840b48070eb8ada4c6e6bb2f0ad5c5f04a8689df889b81517f35668b9fe339bc0bd7db90e8a4b7de8f832d79506fb98a1499b80bbc3613f444920ee2b5125147f0418d2c6c81e5d58322726b39aeba30a3eebe2b13e5b7b741b84926db838402f68998e06e91de091fb037cd66cca79fdf28e70d186b7b04204559a065ea74ac227565cac8d94519649a1f3e794719ec2e5a35687f2c3c28d1b825e9fcbe7c7476b61da07c3c08bc735f4ca199f3f88327bc53a1276eb8ab9902a8cfd166c2e650872b619b70f14b87aaf13efb09c8300127e92178fe41f54a94c24b61fd4ba8aa6889022575d117853126fb0c0918e7223a677652a7b3822159f45924b4209b5d7e52e8448e8bbfafc3485d50e2b4faaafd4d7a44920ac55474bd2043c9dacbbf817dac2ccc008c8c9ca9a07b1ef57afc3a19678d2ac74572e6fc46a5d6c769a3f36a7af78a039d0020ab4e63a0b137d7b3099fec9135247d4424e316afef94f40fc6c331d0a3cafe121c50034d2584028d24dea06e7ab8f4f9fba1f855548b6838f11080832aa540311b90ee97a3204eae1f6c8edae815ef312091a8e3126d88e6bc7d449102a6ece9283800d8310dc789d99282b9e63df4167371d23d27c0089de42a3a398bb44442277aef469420d1fa4b22912247edca2994a0efc8fe4a285e61daa0088a24855ffd75cd38a46e265490d3e2a1fad8fd597a291b8d3dafa7c30f72ef6bdc9e6d64beae386a713bb5f8686dfb9956c5052f04b17990b70ade29c60d88da320915c5d2cb0879765258b5ec304f84cfadd3892da0e8eac99997163964d7c55e9b83a793415638b7391002441b7baaf3a5fa59e188b72856f481e73fb400e50c73e8b5abbcf984932cd4a2bbaed26b24465f9020c3188274fe2afdea5c6dcbd5d351c1e7ccab740e963a3e51e9515b0b55cedb81308ddd46c26245a978a9fc3912f02632526c022e3e4ffcd1ece6fd6d4b1d5207e11fb73b3e428ed7fcdcaba102ed7322f214d6a83da6ca50089546ac1f5effd806b79c542529c93de198298bff596fe3a722bc435f950f3ebcc110e561dadc97ed9a486b18a138d38a848d65256f5fba945b63456b706634a76e9286006829eb4cb11067d0826686b3fab5795d27b102f3faee22c1d169c172dd2f5f85cd75f8041f6a92555941ed226d38be3864297320f9239f77d31fccba73d0c27b870e1660fbebb85c7e47b66cde7a5a5a66937b8bd671c7f362e88973cf62596031a5ff30677202ca1bd00038b97ae1b77d15d22c1851257937c256f41c87f633806c2b9153df6464320987ae2786055320d224f5855741aa3c4cacbc6eb8c15b0a108dd3848ebec19197d3e576c6c78238fa0a3919493f9246ae7e54c43c81024211884c098625ada13addbbb381792a8352c1b4073c8cf0492e1cefaf136999ff7dbfd3d58a6c1ae3bd83c0d2aea164cba0f6ea3161dc97283fde0123967f3f8205d727b2d908b148a3f043b0842b3aab7250c4c90f33726da76180c10114e1030efba4fd58a10adb92e68265e9c13ed1f5e842af22b3ee2efc4f5e0a990f260248169b70a2b99c4d883c8e7c122177a3b85bfb4e7a703f68eb5c77230b38207b826bb9e9bb11047088db8e2d588ebf093c51c82d82783d008c5cb11dc309e7f6e394f3bc98ec192e394f23769ad60e1bf1370dc0787c3692d9080b63ae4bdc36350b64c6738b5a6d53278a928a619cdc9aa8a2e2a465b8dedc2605188a616a6596a537c02c31486348889869f90000e0457bb66c2715fefe69a057681708f4060296fcae9de18c9fd10b1cfd2dc5d16e8fbf3a98718e51070136d283a847aeea6ca7a30c70772cab0407062f1b6480ced76d58eeed07d038c1d72a4b57eea93ec11e47d1b78c46796cfdae727a688e9808f1d32fa10b93934f0e18c54c874956d0f9985b05493069e8145377567e429db321a933cda4df80b80e6c66bf72ff21c3b57da471004e49866c5a195ba8336a239919616f9259dbefeee94a16ffc078b5c6e37764d6c2cd659bc67e2568f36190585bedbc4170acdd50ae05d5a44a0be9dd801b8a2854960839e67da4c8e665ec69e17f9ed54b5b762d03881bb25ee483ff5e0723436a516a65092a18c928b26267e5c86f91807bbb7cf13bdb92b3e47b2ffb424da660644770e6527ed7386752328b29aca840016a929bcc1e2b1b2675ba001627f61863b99a7452d3f83383143807c85375026b93e52ca050c3bdc151f944ff874c400aeba31c43cfc851fe1f3c0d72fb65409b5b95e4619d9fc95fe1c17191fa86411b38b1b246465435499f36d67b415674aebd38d6d41554662ea6fcd88d9f96838df0dc68208af894c8117f46607ca25aa07ecb9be2f208f2e21a3bcad2fbe0fcc11694f89c8c0393722db074b8ec0db63c6719f6f2ab788b2a82288492742ceb883d4f1d425ccfd61d9917d6b3b62d3aab62fb78cd96c8b1a6d2e5a9bf4059196e4941186b7b4674e335139b95c6497ffd885d7eb52b7596d44088a86a066a013b958108a251b98bd636ad100a0cf04540b398d8731a24d2a7629b35e91deb6bd09127214d47806d1695221db08583c55abb7dbeb84a8804cc1b8c606884fba5dcb783e9461e6c49581a24d263070e4ee29c2129da460fe876614748aa9963193cc04c29551825253fcb710b8079c802431eda07ec559a4b9071a5362838c0bc7c2c350430322c4877dfab0a2a1b0462684b4040f5ea1d3fa1aab374927ca5b74d8e9a287ec700d7e2f3a610fc2b83b3dc3e8a090390b25de9ee9633b16c146b11b1129a20801fc78892f2462b3809166c4b38470b320450b7fd7b178e5c83da2d6ac8cb84b34fc2b3c40c858f842b2bb9efdbc8ca2c250b290b5c222a3d47f056d8297f44e1949205685c238c6a984240c7d18b2a8731bc0200a0f46ecf4fba91f499cfff2fd83a82ed2d83b66148e2bb2cbbaf0bbebecf15f85810af2c53f9a37265d60cb11984132b8c9352925f24bf51e7134eb1d39df76dc10fd0c661502cbe42e90f56ec22d68f796a0771caf230a306f1d27712647d0478b156ce46509354663d4cca6aa4659acae27b2a2a78e45de4ca732fd7177f4749dd3e45e2d435dc29100357ed8a07db50a7d8501441b8808558dd29165ca95c8ef7805a8951241f0d5a898f4c6400093ba8e34e5724f515d58aa83a21a8019dac09c94f24254b483ae71445a8e6f8f886cf04383ab3058419217eebc495fc21f5e101f994f512b7c36cdf91b3ee4e7f7877efc5bb3ba610172f419344390f850d87eceab5e14b67bac4542619b30084198d724e589d2d12685aff460a7d3dd08232bf227544aa536021f0bef6e8cb584c1b0b0e35f45f3ff117fe5d00e6ad1cb487f0fe289615e262bb74eb64d1d2f6081e15e4e6b875c2bf8af94f2a68a20e238959fe052eaf8ef5eb98bf607010abcc757b32ef3811fde6fe207f918e88ef397af786ed769b0cb24e94eff0a0e73c97a3540a886b9ea896ec190f5e2f605db1615408ed911b6ad7353919cb3dd99838d4ef22bc4ae30d3aa5bf6bf0a9ad2219fe8ab3b085f29ea23696e27d42f92102007554ac752de923a302822e932b915960e9a6c1403bae166596e724aafedcce84fcfa06ad1f94da719815fab4cc516ad7131fc75508f403ef0d78cb8875c640c433180d6cb43ec011e0fe5bbfcc87ddc6763c067c5664dc773478ab976247eb2a3e0d55bd1da4c1a424927b860f93ff5e66aa4e194bb65c676418e2929280aed8b4a811c8cd1090ebdb6012fc406c0486683434dde646660f5e4b20852c54ba9e7a3dff1e2c499c05b8201219a0dc2e104a63b998a87abbae24b6b76da59a4da5fb2c1c6f62f585f67bf6810f54b245c4db5ab912a494e95205414451bbd5f3f901fe9887529f126618173b04b962227fca7163a09b5401c545eed4b408ae5af042ef8f0c083447c4d7475bfef383a558c212aaeb2a6e816653236bef7f6516e22fbf9a788b89e979544e0ef1b42ddb773c1819e592ba7c06297e22de4a9d9c03fc5d8f52924175fd752b0b726e4d4dc063d371c879759c35e66cdcab8dd38dbc61f83bdadd49a6b563087f38c79260684e5966453fec96d84782fba5829a4b3be0e69ea5b0a1a282be5042268e923b6963d03d6f70bd04e8c08493d7ef03762997adea07a1680f4155c2870ef58600a1c314841f28ba9590f345a15c0b0de396b9630a6426d65ba63920d8d9b774bba71b7445d987d3ab2369e767e8d3a9eb013568358e403834065abd2956de49a18ff0d42200144aef7ca9f59f3bf84eaf7c20f3818d1faac373c99bc9588946df384595109522a2f14b61b65ce12063062b5fa1789237fb10ba4212d0c365ecc227a7c744715d77073ba8438938f6209421a80a1e72580f93fdf6ea55b8ce91111665c65c3f20cb3df35c29511508592360e0cdfba0de6d40967a6e92931841eb65ffcd53e471042251fdba03222f77fbe46030db11434e287b4483a1fa1aff58bc46d79381d59964fa48120720f453eedb3ff7df18aa8ced48fc7087a092f0481df97093a637e978b3eef81d165cbbdd4fbb6aaf48ce45d6f9b2402349d66084ad9063b7372c6f33819c51329f55a13a4b1898776a697d090a4ce4b37e6a62500ddd2c0b103aaf48cf4a15675319f91fe748fda8bb10456278b0d4f6b03ff351b31b6bfbf68adda1ad090057744acc58c2cded3a9c86ca3e4300f590c6f4f373e047278e3c8a2fd195d51a4d6884af682ee289ab2a37dd5df5ae758ca418fdc10d78891798fcf982c75ca8400cc49175bf32eb95e354667a70ae588a4bce6f06c711a01f9495d6319e3e4ecfeb94cdd88b228ad70b79260ac971a6eb571e5c6061fac598090a9b5af2952ce8dc21f7403c10487045c33a55fde73fcdb5a55567addc5281fda44d9b2d819fdffe692cc576a17f83309376d4a79a60499e7771d28588f90b70ce9e2ccceab27110385707fd3a637dab289b593a8ba147480ad7d8ac0664db15f4d68e99d26457fbb31e512ca84a70cf9322c7f0026e12bc3b43e7c36440c22f5bc895153bc6aae9ea360465885af52bbdf92a3c83986867f8e66537a2240bfaf665fae04ef1cc49b70660f5197290dde1ed33255caceb0194905c829566907cd21e6360bf2d681ef45fadc7b4535f65ea3c563b4a726b76e911a87e4576a8a21e2d562b660d6a4e7ed6e5d11238f8e050148df5b4b0760967f3a8911e69183213b87b82eddfd97c14855d8cac0e186a36f83461f6ec09e7d556966e54344b679f92cd8d64e304989e3739ddd13a36468e0cb1493cbb8aabebeef8d070420d5c318542210b35abfce11a119d6add007a778fc998c7cd06ea0e1098ad7cc0ecfb79df8d1e1fc356f17d433e31a886f809f7258a779dda564be03fd9c0f5480dbe3e43719a31ee4bb2f7a775a4fdef485b7e54524d539dada14fffbea9cae32e0237ef987185b6afdc027be89729da8034a4132f31201883360526fb645c68e1ad04ed15da738889832bc4983da197ff7b1e351b503fa61a319eeb348d8bce23478dacd82a1c78673412517de7c6dbecea802430c52fac4ba3a6ccbb755b3258788da50cf139c22abc413448abcaf0977bba9ba3649fa0bd5ac8beb76853dc30b5197a0b5b1943757f8514095eaad7b1ea65af98b4c93c039a69bf44c801ca72d45a1563dc0edffaa956abf126b25432002574334272e4332e637b2cf9e2b150fec429639ee52328de55b6a206b85eeef673ee497e71972b5370326a166a0792d3c7c294a801a8533f89cc5ed0bc9401465c0790c6d9ed358398fec184242339a9d2e6b5f5c15e86bca0c4a482bf894a174d8445abbbd14bd62c1b3eef0ca51a0001536a5c9a596181810c39c4ee0a2e1236d1ed57b809d02370a904fed10bf7dcb63a4dd5701433c9a6ba7ddce5386087feb1931833c23b1fe5146c7a9d1be6ddca03593be8ade5e7747395f8063996feb66cf369e3a1431f77b2442ce82ca6d6edebe0173f67109c73e044118b93e77faa95fa89bee0d16e5000ec26e65e255c454a107e44f950943947aa455d2d48c6fd1e17df870eba241ffca0559e4497d82448b31783aed47b8f5f5581ea45ec75f4cc80905230bcec9b973f3081a5f60e815b328c9327163c380183eb2ed921827e11deac5588655ca22307207a2817cae4bbfdb24f4dbce02a2374e641bcdcc00a2a0aa3521b170a582f510bfa3a949b265ea67c321b276a4e71cc33c5f24e6797ee665fab51e6783a0de5fbba61984bae89a57931abb558b990daaa48d8e5e1f5f7f22fc3ca5492551b3361b31cce1e931e61d9cd755402ae62b5618308b343ad2ee81e305a87d1f255c1fb502d2222f2920853cc54530de502e33a084cb4dc66f4eac7f7eeeeff81efa57c196aa6c514c5d9bb10034e09fa9e4853292ff718724c7c7e43bce5116e0c7d27be3640407e9152a5790ce9dfa90a7de80b26851bae693c91bda9a93189953167543b802d3aead4f771b83d72e902ebb117c04570a47f07033b1726d92cb7625b017513e32312d03e9cf2d211a0e8c0e1e5169f92303c1191cd9872b698ab010229f3f944a97de7f66ff3ebe00da58c5152866d2e46730136fc9896399ae3b48a4d00bdc2f289dcf070d42987658ba4b34b1eb2dbb474aef0098a8a98a7d5e35d0aefa1a6033406627201c0112bc1d49562953de61e06bd6b4b6312e00d6b831863ced0035b6170e081c4c5bcfd76059d76f9a61945aba429ec60cb8101bddaf2b301e449ef452e43e15e2a5ed93667027cf683be5d181811ab9bdf8a20e55203a1ca404de2ac8596d845100c2db1d07ddb955e8c5be5acccfb8bdb0ae6fa73d3669ee7a4877e88cb2bad19446d7c1623574cdde4281cc35fb24a1560558e6009c17a60cb1cddb2c70a167021b8e45a9ec57e8c93a8a7116f58f02f7e4c7c02e8dcd1d7f1bcff997943ea2ab5ec447747ac271632bc1ef16e84797bde38f6ad08faabba60d61057fcf4273ae7dec10457cc47c40eb07e62d0176efce8822914b654f43691300ed12d42d1339d59eb9bf3e0dd620db388482cba7469fc02f016eca6e5d294d4cb5304499f2340ccad60509ceda35aafc66ec2466fa4ff3ff66ef2144b1e0119d73e8e2f18e6dbd74f4eb54548ddc00e545ff20e34204319bfbdd8a497a1925d7f2da10f6da8cfb63d7919f364d24ba5ae6bfbed356ed3eba081f815e57a0bde9991d8df466839b8dfada5822d1102b7c6e17f08f57a677db14894ef3585d8aeb0a2201647228eae687d7240a891faaad596aab5cc4ba1f352e9022e87d17f14001f0c8dd9bde3957d451192323bfe110733e3fd4bc59364817dbd23480eab0ff2d5d485cacb2535e4e110f96134e1136a54df0196c866413ebcf544ae065a4eeb2e1cffcff5f7d18794a2cf4d2c3de22458f3461a9af3dd6e0b4a0da85af499caa9812d45570ec307e6d3c4b0b4b82ae35a28a42a30dfa7342c3c5a6e8770c328f296ee085394925b968d1441c6b8489652921fae941037a5ce843ad351f25db8512ff2d0939696722f35906392af997dec2e67df027e0c9c20189021de533a2d5a65abb80c0ae86e8dc6c258f34030150c273dc4e28a986e93e9907934a1006abfe0409f930de4fa480535403504adc14fdf08989aa0a65ed7e464978f15a3292d7a0a4e3dc392cebd7a83214511a3921916e8ca29c754c01d174ddc5d24faf236007527b1a1657e5aed19a6030ee42f936dcaa54e78652df7256a5f0503a01a6e8306872aa8f4adc8048a2f8c1feb25eea77a29feb6f3d036320711d470bcfc0b522265c2b0e27f4912e53b357ccec905feb266c1478dc7467d85ac233312a917e9586108ae7db9686e60b1179547191e17e9e5b2565e96c3613dcef67b18cbeb734506436c52761ea586a816306de4895c1d72d1fd6a08d31ea50fcb05d4d28924d66beac6727ee8fd5b69fbba12294e87e82296224919e2c2aab48364bc4458e9c32a2a2baa318e0c1fe909dd33f074aae47d55b5820f42a408c6da1d08ecb5929b634d9cb19a3cd4663c1870a56cf4efb86f764e753ee9c97eea38db806b6996aeb8bc375bf8f9dfffdb55b041ea254ca94b771cdbb88ad9b23c3604d0e67c455a9c7b9e6c856a0d71290f008736b428e5ec90bd2efe8aadd5dc035bb49b6166197c8a81f66e66834f1d45cf757d626ab116b075442472c1cd1e4985e4d7b474e5f39a87b2bbf2fa99344f562adc9ea126d0b6b53ee6c92d6a214e33fe483d7a772190e4fcfed5de7058fcbb778b536f2c1dc7150ce7380fc590284f20f5c0529489552d0636e210cf7024bd0563101f9b8e43ca31c1654b53ab0123384d0647302ed108bdc14988a5805d513c6cd2be02b9949fac87064655e6e2d5a907a8b4cf5a013e69e4a324e12d275c96dc8fff666d5ccea35e6519b0790a64dfe7ff07395172b724a04bdb6b1b75f85c3229bf28b7a69044ba08493158131f42b96f2c0c3c63c6218ba52d0408aad955fba0a05afb0ae5140735002050ce28b3a830c2634a3b819e5bcd3d699f13ccec6118f0be5f4a8e04462a46cc1a4b2d284b4bc3b3dc2957e7eacc9ece4328060750b818fb0ee09072a94114731f3c5238a2b96fb5f9c4f78b9139cb21f89216fb5ae556f19d3b32818c3b46f561cc932e75fb30aa314245de5a8cf51bf2ede6f10bc6c0a165717337904dca8fe5d38e865491b2ebe4987735879711d929b83afbfef9154954840364bfc88eb7cdee9da3fe618825e2038af73bcaa3c6d6531842d0508a1e8317ff7003b6a07eedfcc014c50778c0997d06795dfb2a3d19eae0d34c2ebabb707b47722b43a9d15e164efda5e19eb20b441275b9fa5c79b3774419f4f7051a0baf8fada50e224baf6219dd2784276cefced07983838c30b31b2215de615c2b1e41dd8a575f0c4587f4addec0c1127775159303403c2e328415494055a38c860c25bb49f5173924a229a37facd6a813b9b271a96f0388a773654e8822471e4846d02571e10070cc9bf1a3aa32c8f92d318ade89688b0d380002bdbc7dff1dd7dd61c547493388e215a51076233b6946cd235b8ad40d0da77adc288332cac6d8f7816d5f1b00782efed00e973710fcac08ee99b0f90e10e7bd55cf02574538947be99f0d4d084a72d00ad1c99237c59155851d90dc62cd82daedfb261354334610d546f9ab1e83370900f6e8054241f6026d47224372dc60e544e0ef81ad94afef1ab86712d0cf524141a38c109500657b1dfdfc4a2b1c424409870b58817bd7f850cdd68948144142ea037cd37b080aa474d5fe2c268f5bfdeb580335c87725a367ecc5610192c88fd42e36aa56ee091ed6305c6c5dfd1848b0a52a2a051d644e706f644880d3df89e265e080a4f8cf3dbf64ea4790f84238ca73581e8ee206fdb6ee8361d44590a76e67d10cafb6cb0807df95b27d7ed8bd79b23ab56ad5c0d5196a45eaa5487d20e59fe3895afc05f8c78be87c40a68022b5c155f4643d51f67a54095370d12e5522deb08b426d900e91c9b408a529017411c6ed3d62f2d26614ea2077e0584f6e761a92d8ef3b56eac0850686d83912d5d60c4bd0bcdbbbd425656419060c4106a0fc145ac74071bcbde85f0a6ba08fe161abf6906a06c6afc1614e06bf952302b9457077dc9c1033e76780266d3f5788b805404277e585588ea20cec846a99c9fb20fb82329dcdee0c57778cd3b3cebee5f407762682c5c867eb9885b4a0ad441eb48043feb3cc1c04bfde32ec0096525306cef688fc37511c1b16a8bd1df78a8da68467913779aa0f8d9ee0452b06dcb62c8d25e7624262f9b40bdbb4c04e6ed5730a526c060b881dca532088dfba3b43aa12216193cb9afd58a964ab646ecee9998342420ff8886d893c02f648560fe6758e57ee6cf9024117d859ba3e9d7766bbdcc4385347ec0d607d3623a15a1d1739454b4469349daa11b993f8f922f12e3b1b70d14f6e0f974896d5a83aa00e5b8cf48eb6b7b3a961ce71768c711558aa0152e7a405925d625b44146582c2615a739a3546fbeb3128b034ace74127901b2eb69f335a9ae21eea5d660e89c105bc43e172c5b4b741178fde63fce44a78004c29e106fba7dee054fcc8d556e3809227e381633928d1ffb12ceee68c4e0aa403618bd2ac25932dd1c9921ddc6dc16211c558560beede0fb900ab122c2bf65067b4a19923858b3e6c32f64f70c402b2c421eb60b5c02a048114b4005dc28278fdf5db38ab2066debd4ffafcfe59cccdd24f9d5d59ef0e17efd7de66afc62c070c2d2aab84df66311f1a01fddd47a27d9b043fd86bba4ab8787ac6d8dca13399c36f36aa8b7f551d9cd752b81e8df5ca42c42c7becc0198dd97f71868859c7b1fd4a908e3f95c43bc24358077cfca76ba724dafb765f8ba350ad872d6bb81f3712d70324b51a92ca7457f9185aabd35d0c9cd0561516972afc7317c34cbe865eb011dd81c002e8aa4bb6701e4e8888c9d4e1b303d03703874f5406fe1f924e8dbf39dc1de98329f8450e1fa552671b9dbb8e216139f4c3502881dcf352eaf38b014f458c8a7dedf05f9e371bc0d9a280863023d8234805e211df73e70faf1faa6aaa081a7783f7a782fb4e8a55cd7f6951f17ea456471a15a934e765896e0d1707d35c84747c094129ee2109c420e2288c90d19052b4090147462bc845219f9e8194f9da2820cc51f6ca9218ea9a2026b2538b0803c16665f48a8c23c55ba8a43178e2f22deacaf6334199caa8f72c83ead47f7bd9c85efb2873db88e1bec855ac3b1dcccb8fddec90091ee8464cda2dc392c352751290fa830b5a033bd6da14dc894227889591bcaca45ffeef989f5657d1b76721a7372328105b9eec537ab5be8a6d11ea66ac8eb20786e3ee34bf530a33e0152662bdeb1264c5b967d8e05117752797f1f1f5a02518d074a53fd726dedd6346bf8a502d8abe64a2c34c752884cf203c3769b136b356e831530923e9f668879b8dc91887fa614ec4eb15f0eb578739a762da68e17a9bd58c663fdad82b5452566a821aca8d4d64f82ddd98cb62a14068558c7e4426eb973d728d8e89300313bd3b57f87eda94bc7ade937c7f8aa1882927f73fc1d4f1edcca1ea3970903c46162114ce772c2ee4f51c81311d8018138869af3313bf3f9defb11dee59d993dfdb4d2c42f029170425ce101a53c9730c98d83bcb37f261b48e836462fde36a6fd40901db6aafed91c9eed1e347294b80e92a19356397cf56417f2065a9451b4d87d5b1eaf0bf33dd36bfa828ea5a8bcf4d8c6fcec7bfdb2e7c2722ba57cb1f536bcf46c9548ee4621886cab0327148ce22336ad7b9389558c47d16b479128687cc1f1449192a516625c2ba2f884a58a296cdb252a24c7acf62665dc22d5b5d2e10f1f76a7fcfb697c7dcd02012d2b526002a1af26fcb972e70e51103719830fa9e6e41832cfc1d3461dd9d7a720dfee77905448d4d0ce45fe70bbaae09334f855e859c7f5c5b07bc75ea2c12ce11c7f8de0c8729e99fb813d0f7aa98402f23921a31f06e8890f03ec13fa6f09f85e53b0076130abf08f5796fc6468f60ec343ea9044c99f023aeed78e1be38d9d8cbd2286dbe6ce7e59e0f6bcea60af2d3888af0ebc5306adad12b868af7208917e1a2110e891a3fa9d80957423f2845440b908d4bf9db3a49b7d60d78092c5bcddd88d3e2ba58cbd1993fc116360c52a6b97d3527c4365e81a7c94adb92680c3fcab470908b951ab76435726cab7c37eab48e72259f3c2b91a77100756af2b57730454f6c704da5f3350503567d3b8f2a17f1c4b45be8499802fbf06e9c2e442efae4bafc000546290705edb09708047504687de1467c0240e64b7bf24a050e775d062a969bae4ae57c3644e1804ddba60d7afa59e16a4d998054f5b55d167d274a66a95f6fac44f09f6502a1d1ec1139489f98ce1b853b4a705c49b4dfdd8a38e485560412bc87c69ec48a47f59651408d96692df9043b6aff030a39e9b3bdb8708a234d80f698afe0d7fda71531311ff32b533b107d84dca8b1181d3348d1af006337cb49fac0786646b51389bdaf8ba2d8dfc4ebca4dcc7546136b907e034c8076060c30d4db4ee6c3fc663507ffebb939f7a3be06bf7da45bd9cc514c87ca13660c9c59edee3101fa6cfeed58208e23069eab1f64654311b786e58116e9fe9c8f5c42698bdc6dfd8d4dac751018b2ec418df31a109338c1c8fd0f7b8efb125c59c42889a8793b0fbc678101f8db89c753a04caf3370b014f2de400237309c542abfa3412ad89035c1c1bbc687d4f22b38fd2daf44d07b469b1d3502818f4919e675bcf501b71120e807c9a9e2f540a486f8140c7cd15a4c68b7524fbaa92c84912a1878e87a32824dec1e9af3e1c8f70df6058629bf10d9a47be50ca3fe588a02c5c84f06a21048c4e23e0415250a0be221b7e23cd2b0635640639b6970b8d2bc02062b040cd3273c8604f37c203745f8ceef81afd24effd90daacf954013350e504f29a66a0831463e28fe684cf17c38501fabdb8df1f0d8548028d0ddfcd2617d1703ac2d73da00ebdc1c843d18ac355b286702ceaa13a795449cef25373bc4770d100951129390a58ff558d12b31e74a7c66ee07ff9545aa5b9be6706489b03e18b337914da1f91b4c570931755dd0be6411878bdbd8fac7357864d6bddac8832d2056ad5b53eed93d0ae048ddd2b664544617ad267f8c04795fbc1ebdb0e3929a8912e53c216445b00884f21d891bd194d2d22251ac7ef11a6d9376607840682f9a3fd9e6c990b78af8fbca90329d6ef999dc8a1d092487701f553ebbbd2b2423c478e11e0879eb26b82a01fb3eb2735a16fad00484fd0aa25b1386309ef3d73cad932890f445740261a2fb65a6bcfdf2b3f12c571726f2e573f5637deb9a2f14a23f0cbeb53c261f54fc6fcbefadce97ceb29095cc08648b4bbcd2578a9a65b692eca395a48a50395d5fa9167eedb48f7d7b31ea4b183e87e1958b8eac9af05347c4c6b67a73303f15956ad07fab6537f98153a2accddce3270d2c6fbf4db2de80661cac088a708bbf80a39b0297d0eccdf920a7d5cf4ac1fed2a894c49dde6a02377e183c382a61010f3cd96307c0c7ab5b6b70850fb07682da3be1f6201f4b223367ec0b6b46a48d2d98cd425c615515c1e8a114d00e96af0225f214f2786b2a524a49767b0bcb5aacef0d1e296b6e90869e5c89dc949e913c7d5058dc971e78d10cd681522a880cec6a41b28574322b9c9e2a714ae20159c0d57ddd8c4c0c74580fea153c2b085dd264da72755d3c33186bcb2bee2af021ee3957a85c23f77f7b862f278c05699757f739c05ecd78d5739b58c37e61b2c915087924a563d352db8f25a5c4c85700565508363e97ec3c25e152693df70d7979a32a2bb09def87bc9406821d8e53893405f24cfcacbd296b60414463213660dbb201314f439c5501acef7c0e72307d08cfbda5388e9ad1c6818169ff2e0bdf1133c2cc59e7c2f112acab35daed1a22f103ff3c4a49b0a1a2b7fa0544983588d9df3518aef363a6e7791b717c69f679c5d7008e6436f0864f9210f78f4155c0308712a41df17498a96a45a64f172189acb840c606a91ac09b51791b617a60df676523f699fd56ba0fdae09273ee6fdd0a21e32b57f2164a2c547f8b9c612fd1314548d143c3516b074b57919c025a037389b0c949ba970e7d6042ca8266b8993df4132abc031cadd2ee6a6f5a11b703d074172581e2ba3b2e72448ac8044e3106dc17b90d134e0995348935c922535307c581012dc7beb8ad0193d640d5211af1a52d19b26fd7b072116a1013b8758e1793566a409dfb7cce9acf0e92065274ee90db7e7499f67226141822a31673eff2803138e357c33ed93a7bbc1959655ccfe3e2914352a993415c6b86ea76ce9650afdf411911ba6b757364c91225f52a75326f29bab8491aaeed06f6d7b2b380981aed75bbf416183c40cb10cdd518f7338fc0094f77f26a515c155949c7a80e8fca0f62db6e328317c02c78f9b87de0d75ac0bd1d6644161613c1014c96f8881d3999a8faad6ac1598a145ecb96cf3bbe125f54c617a3e32971f098bd8309aba2ada623632828435c1b86a745b08ef787daf349c54262b6d0747b5517cbcd962c9d9fb6cebd485eff458807496368f16507e4e714b2bb1d35ee831ff255c99d23c770aa62869ff003517632fa552cec3105ea04a7b0c01919cb73554739e8ec18ee444e6d639c4723b121b42ccdff9118edf520a26c6cffa10e25dc11ba0550302ebad8eff1218df35b3cf1c10d4fa2e45f0840c32949b49654c94b921d36a4159cb1727b68613d0a73eb18cbea3c13d6863c96583943d94386d5221219943ad6ab8a95c846fbc3c2363e0d3fe14101232d236963b54247a8619806a3fbd1b12e5390cf40bb45c32892811a0f88b617ea52c16a445056a21a1d0d1131c01080d09afed6870779a8d152c0ed0629552e4be780f7612b451b05c8177b6534ac99709f541b081168a9a94db448ced9c8e823b03e77410be720683f3ac40ff39920914f12b80341091d41ad53956d9e4b69d39837c11394f66a7fdc65e31bc184d18d06c958259cc5455390c80fde3b9a7bb743c40458556d6db5695ec26b7d351dc1761965c7433113ea5b3b7b1007ad8a341d41bf223e95ada871e28030d8870d83e8a0a8eb3b9e491bfb6bce3c0cdc78a23bd4c7c7138765cc2ff3c00335184fca90568f975d432c0058db419816ee5d6caf4d7f71ccab01aa5f2b5320bef6c66acd525dd0b0a0f9230f755788bad30d77b13bf2871b26535c02a88130323d469b12ea9b7f9fcc3e4a47d03e19bba35078f37c57004fff591bdf86f6d7b990f5dde86d16eaf89380e0fc75fd50cc5ffa140200b42cdb20204e32bd0894653ed5438c2b9db023359f1b3b84227c660e3d12321f74e23c45d0860f9a33352340455ad70354c638197ce0e2b07b9b348ad190e7ef670fb1cf11c2aaaf73b573b180db98e65949e6009f6d944c8e623005d168e4c34d5b00b6cfe48d4840896862e9dda1fff7236fcf9c207936539b9834a0c602a1d19148faa4a42d6d7e7ccd20805ac611803d2b3de0d6ed03176be670f75e88ffcdde348714d803ec1e8d93395f9a3837d18b26cd40cf813e96d9d670c210ed67d617382423f0a60dcf7eb0bd0ff7814527bb25a905c16c4a097d37c01c81fb16ab4e586eb82350217eb9aeb7056102d8755643148e0f7d46a291004c7df1f466f68dc45eafdbcbead8c680c99309be6a380045101ae0c0fe8759454e77cb930b5c3950ae85daa46c0f022c21493740c89b68505b781eee929862d916025a137ecfc8ae438c035aab9f9a84af1de8c3a8f0c55334d156f250b9d3944c62b39b4df81b0c4f7671c7a4149cc512cc9a0972975d936ae5f7f9566a0156661230d80a4e296e1737af851eeb7d495aef218ab755bbf7a41225265b0ce6ed20b4632f391f8e42e1ad0ac93f107426452d9344e0ba8d4970a1d5631aece246e35851027673577818b6284c905ba159507f0a14eb8d3570051fbdf00cb6383214561cef8c928e8582b27dd8b059a750df9e568740cc5a9caa77b249b00a5ef0eeda6134507b1a9f19c6fe2709a5d49c5a5a484e549f1c2e1bf166cca16437112dea3696936f4490c6b6bd9a7d6b1f53b6c1bb6a52328113e2a86681678b5ad640d3452dc4d2232fd10e7d27235e876634d13528817a21cbf84aca3d91634276a31b1aa01c467141ed38562c47f516cdc6bdccfbeea2bd0fc8886911163575ab7a5ea555b8878c9a4c6f91639c0cc94764a3200990cc5614f77d165c09b21150ecf1b0d819b534ec0d25522bed28cb2d5618cf8220887d7ea420a90f906843d1068391eb3c5982666b03a236300dc604ce9618ad774a54ab55d17355d05bb3123c460c261f390b864f8f3ab0f206e8afa40615e5904f0d4719c0e9a628f8cb83fde4690b751e609939a519c17cee0f8c39939305f5e83ac9d220385a9ac4e72ecf9fc50696250d625481218c5f55130769c83d85c3dc83e0ac0b445ee7bb589238696dc2fc2a12f41dac991dc1b0693001ec0250e2a192aba0a93e0d1e77bcde246a915bff1bfbefc05a511fab98d425055073c3b8b337211d83564b8fbb93351ea3dfe77f70d67426070611f470965d9f3c21ba1255de19e07c3b90ff04f34aa5468ed81573eee83ef05b6e45461783df38691a17ad01ea8703050a007b89e350d920bc796702ad234965c6cd3f04e01ef5872a1cb3a070964ebc4f9fd810c80cfe2b1414aa63c21f0ce4dfa5a36a195cbb3497db7ba6cd162463601b170a3a103259114871224fc078f746941ab0b5060d155e9946684a95ccba37d4f9e9a8c8dd3a8ea8f08b4928bfc0ebac520ec199e5193cf524a533b6acfc83b38400af369c815d3831a941f38b8a86480999b97159df94cc4a8e3579a0a3603d78513c919d6df2d059167597a24633a00214a115fad22b16a03cb5780bacbd4023960c431fadd214ad3d63152a76ac98315147ae924775087c7332f85564a2dd6c4a0c9b8e5a4ea04b5f68271634900eed27170e78496eb2d2ccaf22148200de507de429bf94fa9cef36485a11c8f9e33ef447b309447b1d889c5836e06127a688e6575688e47778a5ee38e1664725ac2d243d0d4f2015e2d31b6f2e9c7a442f73f887e9f7ccfc19ffb1b10df047815a791ad1caf6a957cc892a397e63b9f1ec2427167f2370a7b51d877eb3e18b9481a6fa7278c348bd88bc99f5f07303cbcba09d06a8ccfcedb94c23e5632d63d683a9d72e973684828efceb0fc9040fb7568eb1aea4719d93feed0b02b54652efa696ef98d8560135e5c5324cf641da60e06f1b2e29bd04f97bb4810eab6d2a8c2a0d0664ec5e81e6e95000fe4e894d805fccf811503e6097d5169360cd9b3d8f266d77fc04cf7bc35a355534b1c543331c0d9d99704fdbcf8b7c17440a60f7842a5f62a731aca2dd8682d2ebecc492ff74fd040f09261e6c69eaea70a01cde5b53fce31a9bf2a7380e80713be8989b7bd0c69c3089b68218b570b026191948b6e5cba7feffe0707f8e4723542771dd54c2509a1f0ee916f2b43a52e06faa0edc396a17bc7a0981526f5c58e9a03221ace1ae4e302a33c47e33d72658a96e2591d0c63c10ec0879ff0b2545e446ccfc7e460398b672c077f9c60b5e937f3d0eab5ec8b9114a7f740614f40c59089d19b17e400f2ff59120c17c335be6ce36ce6d701142b8786cba3e5745ac796aa167eaa1ac9e855678c9f856a41e440b9b2fdc671c53c382e3edea8afd10bc5d7c4b679c2f0267e47447a60709f26d53eabc2d9c7413b2ac4795d92660f3edc8db2587814ebf653f337621b71d48a438a1a52f16083fa9446351b2445cae8f949085edcd8304d90a628ea2b17372823d75fa57554d68d3737abae054a55f13d79191f6f25973dd4c092d9dfdf6cacf932879804c50a373db106c09138778db4d70455fd3c7fc5a5032d8105cb40b0cb2bdb5cdfb18b36d0a026ed81d5963d5b7e1ce820c6845c128d7862835d123370867ffc444eae70d695ddb3b5db7ba4ae1463868cd922818098401ddfa7c4537c6bc5d3c5aefd8a8c569c85a3eea46548f71723c1efe67f517a007bfd3da97f04e3c04def39cfc20f781d7c8d0305a322c2820b4af80d13047f9af446dc5e6dd4503edd4c76b09a310f6ac3f281aa3f089237603f2bf13265fcb1f9f2a93e1f7ce57782bada895ebb5ab77edabcf047229910fa9460d6a7a3656df94dafe927496a84429b4da25d03a52f733cb16f962c0bf5536257113dba2621f962bb661f23415ec5cf22031d0dd8cc6498853425bcfb1545d3e3b6a7076a15fd4a4495aa94fdd94219f152ad12ab3546b355fd2469535c41547a4c05998892120ade3c5bba7ea2ec26473cc948d0117a372b0f6bc59a58ad8713413b5c7fd86b909551422537f53de655c9941f4fc800e3fd9f9b062ac3f5677758362623b7e2778b83a9e59182f9c23a5473320f638d2bb320ff329b1d1b828897753a8540c035c9bbfc001fc322c6324f98c2792f620e3f0315a20c7c11e58346b810527c706eb6057b38ba4d419ca2473cb42b69f80242f3092c2f84392e9bdba2c017176ad5206ab0a9990a58e0d02c6e5ea50edc02c1994721e626f4e06cd03f8f2db59f3cba2f40e1e95df322aaef720535fbf51362862556d3cf4cc3d0e2690d8892da54e52a37ac5aefb91c76eacfec7b69354d92bbb51249a111ca58dbd1600a0ce5f9fd86efc7e3766ec221a03fa36e2cb6de37ea4d076b225151e36f7a9536553a1b6428d43361591175b572eef8de9eae8d927f806e5465acd0e168898dba18199909a91c96b23613eb79d96c90371be42dd74bb36f06831c53975f8967831ceb1654641d1e293dc49b6c8b0e679dcee7ee52c1b644944e4f087dec8c5c5cd27997dbf37f7643940454c81847b5ad193572166434727c6aceeb3dca2a001898c691f0065774597567ee2b39bb8686fdd2887c627614cb5ce9df2e7f43f1bad50de049bb5d290df9544a956c290769a5ad94ac1ef1db1ee0714bec59c3ad99f8295952e30a61db3508cbe8d2a7292e7186cdeee52c9d2996bea163290dc11614bfa216d58ca3ce6853f1772f378caae8565cc14b7f7e3221808f8316417a1c84010fe113814acaa516651944fddea5221742ba0816eec085d41ad4b1e9fbfd671f83bcc47a9b78a19a9749cc22d7e4bf6e619a0d5e040614fdf752743480ab25a13bee50011ee1e035462a19223ef3c521276323e1efff70a9f37acc69c1ec18e1ba74e63e8ac56f1a2c5f6cc2287add9c11ef4f7e0c35247d46428c3b23b3211fd8df7154a8d1d09bd050bf6e85722c2217e84e9d75940cce86b4d6d62511ae6b2a9af7e752cb04113979bdf2003f6cb575eb9cdcd4d2e6b5c98768cd2aa2321dbb7b508dac3f1a9af362211298e54108ca5dbc7447388cc268a1010d2cbae40640fb937d65557927fcba4ce2388376d95b93ff7d988d34c69531c1ddc969af4227e0187a142b0817851ecb4a9decf7a69b04fcf9f5a7ed40a0e738c2b45a196dc678a60923cc20f444a10f77715632c74373c5c7c0566948802dbad78995ae372bb9909efb615cad2e1ef140f2c1a15afb616a17db3e64ef07f06776cab33b57362f2853102d758c2d25d051bc990470edf97c8869cb2886e860cc73596130e1905e82168088e54f1450e65a125abe5a7afd6489296711c9c3e35b7a0831a23dde5c787e2c101b9e66bc734c71d1551eff6c298f151c91a23ee4c78838e48012ea19c5627ca4adb5ef0b98307f0436677eb1d0ebd96fbd15ec7989144ebdd4d258221d8ebb8edddeac278a62954034386529c8e2f80d752a30c53e1e63d120ef23b079cc519b3e02916a50a37e1292618b47ac7b0e81983a9f200aa7773ac502ef48598e41fd8bb0982a2bf7907c903ad765aa752f2dbbad340c0ed2f2612495586698066b7211b95314dc6adba2f3fe6e48c829d19658a83ed2cca0abfe5881fcb352c2d5a4020b888b4a9e18fbdb449c2f40b32356e6fcd4c92ef744f3bc0f95cfdab2a54e454f63a41100ae67f753b39843252cd8ff221e9980942a75d966946a2b7a268ddf69153abdcd0ae66082bffb5399cb666b7535c67d4c2809530a39b51b1d7a761cefc9ba19200061de2bb429da1b1d7fce6f1b0b4cf2aae421137f3a79791aa41fa93c70f75ec8c327779c394cce6c0493c65590b3ab55ea40b7963006139a8404e3a3c47ec7ea41d274705647d198024fb1c874e650e67e77194f2a537aea28d96d1d5f4eafd7677d6f4ab031380773be4842d550445050784c1d910a8a45ca5e3ec817ea6beedceaa14ca0cfd923370e297114cb1054b2a82352f412c9ad5e8ecc59f846797f5bd6a16dec1eaf39cae3470dfbc371191852396875c2d33b8f143d8ae1778985012fd66973313d08cd319f2f8233029cf4b5dc1b6088d705ecc45f0a0879763108032ca54a99f7e9b6eb56158b924fca7414adf9dd00d91015c789d5c29f35e00d6ead7efa074a74fc0333fcc0c2bf4f3ba3d60afcc0a2b2d755472813dd4af55d5337c417132d75d7616657dca7efa7913f1d89c141f797a4e31300c647acf9a0446864a5f868a67fa87a90f2b73237adccf6f544a7b9308af27960173efadc1df4dc134199bfc7bb359fc37d4397ebae6404d8b272c6af0f9bc9459b5a2b0dae9bc93db1b330d57dcbf421f28402dfa08e0a456c64672f9e713fdfd46905e4faa09877b1863043136626327a5e742cc0b29093919f9159b5a383d2d8c515055b75563bd49b281ce9ac8675ea8a36e07a542903ad1e4239083ce369f778ffe63a0357c455449c397e135025874f6c099aada8d754363af018779f072f9b23b1dda55579e5d16efdceab115f03c054b34e588c6376d53048763f96b21e24c1515c8cb0a72c09637c85ac805b06287881050aea752e527594c75788707907af7a8b9c3925c888a08773c00c832a96df730c69c771420cd54dbc83e7fbb1069ba86ca625e279df695c3ea214f9ae1a8dd8414b8e9e42692df84fb5c3aa4de428c9a60e9f8efc38c27af1cd39e3284c3ac70f07701c66789bad3b075173c3ba994451c83e3761d8d6936f48e7c2aa6f05609a060525ac94bd73158793efbadd086e8e98c0808dffca1422537c70688c84525590021ec60876239673354931f60b5a8eae939821f69b9289c3fca093edcf7fd55b060e57b2b02cdef3e0236d5a2fde2f6cbd104a148c449d292b99cc1afbcb70f77c2524b97ed5a304db10a1eddfe935048e8449fdb2210bf87dd69bf5a63a0eb53d533062bfccfba79dfce0f222b6a1ceffc617fef2880334f1f3241a09223ee3012e32b1f6ffcef1ad568ece0fce3569f6cf9696d1078d01a3bedc4bf7420243b703faeb87528160e5462b17075db83f53bacead30442bd2fb149b77ff816e4fd3e96674c085e5d790f160371aa1be38cab229d7a10822e15e32d2c476e2e8e832507876ba2f4e0436b4bc9e79b5896deace208f21239b7e67dc653ebda0d107ad8f0a3132e0753411e1a073c030da578a1447cc8ec212447c5d8256c405b2f1755d6103c175b6469bbd0bd32d0dd7c7e17c24216cb752c337bd9a13b67ba181009a72d5d20651b121769d457e470e751a572575c4a5297f9d60cad0b4f408e6c1487e2ddc1f31aa24729fd68a7cdfb9ad269d1caf818a6b11023b7adbfe05e225f468d58ee4600c11ea40fa1220818396de33d24bbde5d09a340c8e1c276230a74cde00e218c81335fe25fc6aec38bc0a27a539196226527ae8530be67cfeeb8c365c7f5c2685005ee3a95208e0e25aa6ec15358a4cbc7ec17d337b1a893f30e9c85286eff545e9c40afe815abaa788e4c3fd11dd917fecbd69813b2a00d991ef52883f17f79161e5617f346868a67a9e53a7dc8eb5df303b22d1b149f1af2aee0344228e46628787d2cbaf699499907c5eda0019664a133cd27b9268e41ffb94cabec9e1fea5a3d603f968a6573783fc6564ea4528db127670e01717212443b50da4e37b5de4511acc403ca60282ef5636b816436cb607d4f2dda2688b0f9dc2cebd3521c206936ba8e69e3732151e5d331bbbf75d029f8a9113da7cbff4988ddc29292afbcc3fcd3c733c480bae4b0432aca9923a295df83f14941570ce9d579b083f0c0b6cb98c7a3d0da7e012e9d7cba9d333cd794c82c04716794a43a4ffb11efb93283a85e903cc9a8f6f547313b56922b5e0613b4a480a0e4ef27bf2432844fd058504b424ffea5fa7f4bc10b9ab909d14edbb999981c3b71e854295745979465e068a06af28fe6c21fbf6bc35b5f6473b076e5e203a57b3fd6be2ef0dd22d9697146a4aad422c9f6d6134852ad8464f32331f8db8dc0dce839f93648f6e7621e775064cc7adf394033b78751388d7d1739cc13accb3f87b03a8b15ced82bbd6339485f20a6b8a3eb629ebc32a96341e52643cb456a41308c8691df54e358b41f1becc6b4c1c94d979253b382ac2a32f3529539acdbc950694b01039446228995b9db4d888221ef6847e05714fe892a99595eba13f599fa2bd26fe7709e15cc51f3c5460cb3ea68a01fa4be64cc627f04c520384dcc7f3d489544231e8e1b93ea12d537ef1acd010ed3fa880f6bcd0cba26e5b44ba6d8644a718a48d914a6b5984754a6a4782723cbde442e37f563a7f48ea0e96acba7aa4a880010f01c258488f6faeda1ea47f0cd196d619e2432f1241b82b77b6839b81c6518092e41e1a8ae0e403843d02151c3ba5c80085931a93786704cad33942350b1d0670109ec03bd5551cc9767ecff7dc055716965db6cbfbd0fc10d094241b98680ba2c305271b0a27bc0569dbf733ac98a20d9e7e42835bc4da05603b3aa5dcffdbea0ccf0eadcfd7abf0e0cf42795f5d2f6c2546f0a2c12141fe19775cdb1c8b758d59cb764e011f3d0e365610fef3b3effa7755c34b854905e1b1c6d98389138ea56e2244d779eea56b124030edcebbd197ebdf145a4f4bd819630236cfd5a0b2e7779770a981d2076040329b23291379630683dbda37b4c88df4393ef27dbadd1affdf0ce7ec9a088c49799c3080b200429570430e4cc358bb22b0aa96549e5b37d1fdad1af4b473c673ae30dba5d83da653212bd82c24fae307c5147a15817498b2cbf5ccc8501c329df3728142032c8240687f471ce4f5b0a7652402bcd363c27302c0f0e71e34300cd0d3c3f7c52086cbef27305919cecd3a8e63604bde1683dc8366ae0800a90c9334edf58d44d5fca73aefa22222434d0e54b42322d0ff4b7cb349633fca6bf657f5d447ad8d88e2f69625bfbfcbdadfdd16a9f84bba1fb1f2eeee378bf75f823793ed1524003ec4981571149e14f0002c9540b82315617416d3d3c753ffcbf16d1201c6dd4e2aee044f56de03ad5a1a323a16f98207703b620d7a2e833dc71b2a3e8d85966c69fb00d5c2ea9f85970ee7360bc2f72141d3bc375478deac24f500779006e7e9b68493b2fe7ccc8c1f68503f11c0901a75f0b535282a8924ad306f1029740e205c80f9a061a21d572216702abe1d10105d1704adad3d96b09722182c25952b48a963c6bdb522da53030008409d644607eac373c126a3cc0868500b41d2c5136fb147ee86e9e18504f803b3df5bd74944b527c581c003eaebff36bdb9e029e4b78aeaba9830a486a4c23464f5de075f504aa749444902e62be651a8c8c70ee5d53e0a24181c7b9f8740863d0018c0212a8c034e4e538706be532bf0988013a4390a076ae87662af24a649a94a4099086cba361288bffa6a5196f2dd2150a0f8c15da5cc36cd8a4b68482785cacace7330f1bf310f4e2a5c09daad65e3c9e8a8a07d80702724aa59fdf66583b4546374bd533b714dfa5d325d24b18af6a09516686cf9a24585ba5334c7b0c894290e6b998a55065a701e32eeff77a477c5c39f9d9d18284b3cd7d0431e068006ba39c21faadcb0a6c1979bfb65839d4fc33730e8694259161b9f520d094032204c61766bce3edc00948d5a06c21e6c4d1ce55660dc630f2bf27aee3468404222d9744a9ba8b915b1c16505fe704135e1b661e6b45f4706f68049a798cf6972dc068671b6d68d9a11ee5e6a2b2da6a2d8195710413544c74abab9b2d47ea0db00ed566262cbefecc40bdf40fdf81c874f933c3b5147d088611c8518e97daeb8d5e98cee6e2da9147befcfdb6d5da8696f34e86e2e425ccdf3b25445bc808ae796f34693bdf98ae2fc55dd92c9adb4994785ddf52001d0f781ad170b33fd871a286c261d77eb1f1f5f9eb4ecd80a4d7e6b2621c16e9c1e0d1f888f0ae37be9c15fb8c1f7e25f1b5707119b0c715c50814145cc3f0a5cf85b98d59d79cbc6b3621d7db2735af2d6b7912722aaabe5c5abff19eac601261663d4f1d461d5a09aa3c069e3985e07870de7f13812e885bb062857219d3196b12ead18921612ac9d729da6f3944bc847b82a92e645e4be94c0c73191de9fe0730d835a68487fae920ea71172263ec0f299c5ecc67dc45575c681d871a0c1d6c59ceae77bb0c9812fd33e9060eb7639934a9e3c8be70590c24e853d73a0aaf9cc8cc2cbab38374859f807dd50509b01b0317f75185aa08ca6b86df69e2dfbc46e0a76483698d650ef3c3d2ea2e6c6d69cda49a2e07d84e5e0f3e4828ff5d2d4b3ed42039e554f702649ab0dca9c223d8c35df2b4e89fcf27cc67e6ee598ffee9f2341e99cc07433eee4db3e56a44c639baef00a6a84850ecf0aa783ffce73d0ce7c06c061299f929d02151e9f8d63d26bbf2c7f542165ef19e876e37f0d8d1f167c531c95e5c9285847b5d0b3894d75d6a378859b9f2596139b824ad6d5add27ff539969c92a3d24fdc1481113d7627a90f9c6bd2591703c0ecd1f15ab631e5a53b15848ea0b3d087584e3551a4ea58d0b08eff90df50fa6ca5560762fed23130aea97fea5be9885c00d2e7a1dd34e0ccc882f75d85d8a664556e56269b18365ad5e6091450fd3e43aadcd4c0d8af4e459c01f47badf539a0699777e7ab802e31788bb3b08ab97c8450f05a50f977969a276dc31c63ba0eb91fe3558327225967f0293f05054bc0ab1c4c92669941e372c0d5662697433351ffcdf2d1317476aedc296a72aa496645c5cb08eaf81e05cee8aa3f4df8b1a6cb0023fb35f77b4d9a6cf2e72221585c11b027b27b87a0bcae4ba87337f5a5604d0b4d5cbff6c5a1db325ed3fb143eae6ce194954a64e3c0f33adc2848cc3c4e212031bb95526dfb1422f5257b49c95c5f93cf923aef5e0cf09aab1487f9ce742139f99601efeb696112a7417f301c390cfa82be550aba7727f303a93bab1d73f2341a920fc89721aad8e9fad099ae10afd624ac55141a58d5d8011157b5ba92ad56807a4b93d88c9af9230ecaef20734cfb67214bf2181fdbb2406f46c4f159fe2d6bb1a1912bec2a6f2ddd6858ada309b65ee30ff7757e5459d35862a5ccea086320c1fa80fed0a1ca75f5eb57f299d449bfcd3067f4a9655f25db0f35f10040ca00e73338006f1842ec1c26cd279866f0f64aaadc8f30b3abe01a585e8202ba2c5f0a14b8c410b36c6273026f8429ffe97a53e7ef3c3fda92c42bc698e09089d97d8e35dbb5095883c7ff0cb55bdc83b14e54f40628f9eb06ea94d21d2c8b686a3ac031967c845e4eceedf7fa2fb40a8e4fcf48c98bc40440f239494ccb3859ead4685e6802819812fbc2c99d5e1689d09fe77d08c8c1990b39e1cad52685dabbb5c5aad63d3386cab88fd6b90bb7bac587c4fabb1f6719db715a8776e48d36a58f07041cf2e024384dc3e9e8dc2f8a3c306d955a9897fd7c11e68dfb3d85b823dd074cc627f239cd31e6a17c7c1b74be7eaf265d718e35baf5dd4069d2049083b396828c6cbb830f7167da17be2528b4f45612aae4d55fa1d1107807647a658d4896d6159237d6a4276569509c4ef3b525d03b5e46ccc3b639db21314860f5c7206e37a840f98802284892209ce430ccef53b2c56143172bfaf0b1a68e808908585ea5d53c25c2072e27e1bf64b145cc46bcb4e43a43184bf8dfd98c443f8539c932024da3f704d874d0a872b81cfd70009be24367598a659a33fe58963af77af1b47bbe4e8de703dcab2a8e968c15eacb08d08c2d860d32f3b7174b418062c8a8f6e5ca4fe2367a175f21051733fad91ea7c19b1f324db54b5dec80b3e7b23eb84ab71088177dfc4ecf5730e78f8406c928d0085ffe06e8447cfdd832cd1078f0d19b8f608344c789908fe2c2ad5bb609b0af29b87f8713004bbc07d090f25fa6ba75cdcf490712520dd9ec99f6d7ae79b1a4ab54e69fb61003c8a58dae8ed3366c841e1dd0a08fdfe47423538e1a32c62d4d5f03da59b6a11d7f6dbacf956e9b50792ce6fae8ff9204a26bcab53d87d36fab885031d8df8ebbd8107e4cfa1cc3a4e615bea2a2e6d0ec503c326480620847e10edd83883a4e16b064e2e2dda1d420d37dca596f989fe058e7a9a16c49dfe4ab02c109b2f1f6c36926c178dd728d87a41be66de0e1c0c1095e90aec3e802a0cbdee2d59b0207409493c1a96694ec15d359ac8e2e032859d4319e41553758286368dc06153fc5380f9c95731e9669bee586e0a2a415cd5496ea211593216aaa70d8a0942a968668e08319335cf4512a430e4c75c185cb294787f81088ef350e00b407dbf77415d493b2e1a2ed429a68596523c186152ed276fb92f010b9f4e788c82401954a9040ac74f989172095c3a8836a1d93be7f2f0c367dac2753d47bd1ea63289b2a528e3b8bdc80a277ee4f6d58c4c8a99de4521761e6c97478edb0ae8db06295231b3c37375fb471c565a301f1ca77083a69b4755ce67282fe639aef7db2e7edbf1293a4f2f8578b289c0bf931c37954d826ecc7e1df63fadd8a6f25851739963f120cb28890c0cbc56086285f8368c8b646bdbd4ba4ccd6ffa0d13394c2451f4e04181ba2be68da784bcb2d50a2353001438ca235407d6a9201e1a9887be296d44d26363d70eb7643ed4f7920f956e6950e869401210c2789b9eb3353f4e2f67e1069ce516a2cda111bc9b3ea9b60af809d932c5622103ede20f634ed0dd6db3be47f38856277a74c457da030357313f218e1ee4becb38747b3d1fa4135520280a7e5df2b34d43695179a485820116559b8209c953eaa7d07b9136e597d5ced59be0d83d6afed47eca031c157f220d6febceca633a7973ec322752988fb6db084bf36e0a025f9aef5d24beaeda03cb9954299450f3e7e1d04592f1957f5740ce940ddeeadbf114ec54ff569baabb2d12169fb8a852315c68f0d7f40f983534c623ac3ce0bb9262d40e4ad120f61b122f686e2851c10d59c59a2bd485ff1dd872b172bd736f974861b3e842ea994792b05a3b70240f56efda2e686774f4640a694630ba149a5d8b5daa3eeafe985ed999faa9880315ef5ba15b90880596bd7395b1a9d7f3e1f428f6feef9ff605e9abf69e48d452b1c18a1b73d0b8cf0cc6b2cf267f9fc7fb0d7e4110a6c8f656a68d1b713b40d8606f5057029b6cecf9949df2991e800450a02ee229700fd93adf38ea44c793cd2929247b2f92e2f4d0136f930313d521b6fa3185a6b2e12cdab53d6eda9febde50a1ebe92278b8a0326cf9efaa2047bbbc72e14438c3af0377b2cbd5b36e9da69624e8a146f8add316a467f1079d83a3d44ac0868cfe1375bcb588fa46658c28bd81569173dc46c7e28a9ef1ab6dd00c521e83a029823e779f14ef818d6b45ae6adf3cf04401d5a8c52345fa29cb8b1706d3c14c81598e9db1f2dfc90cd237673a9e02e59a3211150e25b5bad75a1f30b17637f6e38b23de6af1158ee2e3a317c67090cad7f3313c3aa2c1516dfa556573a2e04c64598809ea67bb54050a21ea6440e31c6cd028facd78147a2d7fb01fe05dda560dad74b1128aaacc875b1a9d37e3811e53401459ce997b10888e551c8cb88a1d04919d645d1dc6433a7cd18847bf551ab68679f5542957993bf2ab8bca4313b19d8a4860b54b2b93e68274d79fdebb9d9e32e35bae079eaaafeb05425a5071ad77c47cca4fd9ca4d4c72f0c6ca4f2765d452c930a230e40aa97a42a2acb8492c02226417715209034bb4092dafb1f206502adf63c02f08df51f83083f131befad2138b60469f3ad3510e2864bd5643a2427bc3f783c844ddbacebd73427430c00251b5c9ead75239454626d7db4addbf0e136acb28201aaf3f8731448ad59c262576c82659e8676a5107bab09cf0da6b0a536280387546f6a0526132e0db582286f9a83076322608f4d8bec94546b203fc0581f94379dcdeb42a9384eef8708861c503285024a728b132ecf7b6ae47cd1e866322c42f1e08b037a49c30a8bfc1f7af4ed87aef77ca050825d36c3391d4794dab2179271b3975ce6098c54069c74fa35814246a943e13024e84b1a1b68e1f422b109cab7b29af34b189be4b0be2649052d701ed7440d32a9e59b339eeb8ac2ec4cbfcc1a2564af823d17cc482af8d7097382459cd14678cbc9c2d51fba31d8d57983c6161949d5d66ed439389813a9d6ad1aea06a2ca7d1d637f5db0e22b825324ccc59dece9c5d752e1257a6634ba8ff0de94dc7df0f05be5ec3bf940d458c3ad56dcfa1110fd2d508c651d9db6d45aaaa7662a292258cfb277d40ca46cb44cf93e10a07ee2d66babe552365762b0b419213679ca101a7b0824d9890423878b5f8c94b65a8e3dbf7e755ae092f7e4b74bae28221197a333c937a203856f15c8037d61730f3519d856a339d001dc311d08fdc83a8f0fb170df6e5951c8061b74594ad238d2161b3ccd71df512c19b493c9c71e66d2e1412e55486b6fabd6a5c9577b352851a4f363230e0547e6c4d59597af8167349cd8e05dab48146b3334609c70dd6debaaf53cfa3cd5232de0003dcc53ce31e12a8ea74366d8c16f1326c886ac69664386d1d0868c64561bb2e22be481127e3a14c6569ea92a1f32af52be0217d52f4661b8465f0841cdd16e611b5482f2d6d2f7e4d00caa1b0168a501db551084af4b9f372c10b741f4a2cc7b52a5636fcbf134a6d1fc2984a0881e536fc2cf90bfa576001a398f7037f1c522721b6444c206b4f74e24732b8018ca4982065591046ad21b61738263c837bd4f307e27a82c04f1f9c941c47151ac8267a8023dfc452cc92e8e61f5034b5ccb5c310a402b910bcc16b9515bf0cc423c482ca8985d7d82f582bd192d64c8c3f36c61ec98d1400dd1d8f2004e25f2a56690bb30324445fcd41e03e6d2bded16b5e90476c66df8bcad67945827d89165513ccfe637a2f2f6ec5f6689f39b3d4517459f4b2ea114267dcbaf8e78a622101ae0a88a939f19dadd7a4807d32c3210df383a25bebaa2583e957792a2e4fcda564e86b7ed3979a808f2bb0f28694f478def40346988dbbfaeedf94439305c3e8e9642b2b6bbefc4e63b58805783ad9b580555f6cc5fc87c31c83caa7adc63a79c9253064dae4b2c3264b13be455ba3adc91352f32b2554d4418f94689ab9ffa3397536cc50f284e80833ccc6b0b1329ef2ad0384bf3e7e1fbaf3dfcfddb157f745b4e0a9357803e7ebae1cb932b8c1dedeaae5d460317f03da0a9389fac945ead1d36e691b5e689870d615bc3224e35e601f7abd7a9b34319995bc8a4f1cacb7bf0843bbc395eb751697a96b34478831b45e3ba6c70e747940d397170d4885850371ee779119ebca1f777d66d8acce3da7d9c700c62de872b3dbd11084b6b0fd3f28701d9e85969fa743c2577fc55486793455b8f83b3200cf38bd5f767ab931bcd3f2bf62c9207e214c5fa31ef4f712f53cc057e84d3bcbae733fa635a47cf593e56237fe9843faa980af2c6df976daa3f6c731f761f985203597cee09b7ce86b0ec42a98d2a01d41e935a9469c257e80a318bac2edfeaa1fe314905f4a8030ad10a925820d03a4e070f470cf6441978ce0061291d62cd0b043060d28d7c9ef31c7c60edb7977f581038dbfa6954361b179d4f83602e40bbee081b180254438fac6147c6685a1eec214f2e64bd1385dea390b6f7de5bca2da54c52065a0910091809dafffae7057ba0a3152978d2f17316502c63dc31022cf4fcf9f3044b628440cf3356f204bd5525ccf49c7fc14043cfc74a2c8561869e33ce982043cf3792421217607057de4d2ede82a787ddf18e2f58a5439f3aaae36f1948e185f9fa3e86f94abdc35a2b772eb4ff9eaf70ee7890241208888118d6bfe1b5370cc33338443776905f4869613114f249eed7df5156b5b87fa1eb09e2a4a82df7983059b1f624f940954739af899e2f2593c874fdf6e004c58a08bac061cd125794c01c808828485b867802c10be0d0a2cc60a71e39a5a69a7a45133c441a4429a3b360d8a0fd7f9c56bf6a3af304573569e9862d87a6898cde5166b96842c38d26186c4d5edc702f873b8ca3e35213154d4be81d6a317a01a9eb47262db1addb053205f6af4b38cfba735927d35b6dd56ab5a17eadb022307d49209ac6dd739cc194220345db1813c66a1923c6d620368c024ec88438020a24941003b45b5f860842fbff17233070822a6040c41059408183ac878e4b5ee2f0420649d232d39b9ce9086f67d25ffc15c500f98f6f97e9ed21c192a04ee5cbbcc888c98f1c698c5f29e34a4f30df914f65e62bbafca23133e6f4c4c43446ba7b931b35791193c7664e57c62895c1227f32bda21b311dcd8c64b248e9e94a19a431464d723b9374a632364a17599fd0f6376fbfed87ac967f2938249fb4cc5bfacfdcd9d1522f49f1e5de7ce08e59f4f72ad5c7ef5adf0153f050d3f11beff87d6b4e928d78a8ed683b9280107f77b071f4dc9f9e5fe36bf533e75e0e30e6915739c69d379282bb76b4f634fa483d59b00220acd0f3e9cef71c8031eecc25f827f729d950b4678fa0fe533dce4f90be056f1eb29a67be0a1cb29a6e19a6fe84b81f926b74f733c78fdf446d03de14f84d621607e3a1fc2dc3d4f767f6314356df21abefa76ea064fef609cd9761ea1b99bc286bba8c316dced8620415359841e5061b8517322eb6a0220d1a65d8acb10110a110372842aac19a2f40c052b003154c4ba801476cca86456c08560d811735a67b09b3c38e5b354b6d7704972d0cb6d171c98b1448e0948e4b5e96d01b6b7aad911492ecc0c20b117a877426bbf152f1d5bab2b5c3be674f65bd0c6183a75af2705679b8059ea23916e0abe392971cf4f628d0ed8109f154dea6e3929798de2c59181a23adb5d2e9458f8773b624a5d3526badf5c6b09032a3153f2d2b0fc368697475338bc5fa11b23c2f58c5c298b6c6e86274554dbb744a3136d9762d32ed2ea34ed4893ac9e6ebde1966726ad27e2fbeff6188449d9034a4f9baf70a56d21ec3a2fdb5d87c59ab55a7f9b2b656d97cd93bab48f36535a71516ac64eb953b069759694fd7e93a5da7eb74efdd2ed26f17090929cae2dcf20ef71683ddd88ddd98939393934c2693215d24a4b7b1f9da6e2ca61f48cbfbd26d8b79e8aeb8c95254743e72884c2c10b3e80da58a26318bf66de72091399ff634e7734e9f5e355da766fda6afb69a553b58f5138beda6af05b52119d7acd1feba067937bd5ae5cc9a5fff4ed3a6e7fd646e4f42fbdf2f683e12775342bbfd905489744589ce26a731655c36639251cb53acc86842b1f2fb40cf6ccdfb7bce2f0b2cefbdf7d6392916d98ca922d54b29a573de8f1ede2b2fecde278fcddbe434a68c53199d51264ae9f7b8f75e2a69934d518c59b66b8379acc0df09493861dbaecfa6ddf952bbfe99da6e322975310e4606587e1ae9cdd975f2fb1e77d118a2502f3dfc7ddd36a5f7f1fbd4cbcce4fbef53a8efb70fe565cafaab9970c4ff0f6f63f31f186103b2fe8d00a38bacbd71de6315f7def7cde9cdf73c4f6219f1dce93c6efbb48f0ec69d5c8cbb521f7f686792fe05f4260fdd994ae04c5a496f67aa3680b153805609b44bd8272c162bb35aeccc72f190c943b75fc034d92b6396b0e14a1057b4ffc6244517598f557152eab436d1669cf3c9c74e937ac803db46bf20ef7ba6acf6765e6ae3e2b7501f5f7edfa7c01f1e3aea0b3dec68b4823b9697c5748f9187fb1f8fdcf6940be232f510b4825ffbae604d6a59e5a115fcf383223018fa4e14acace3e107456047b915d345d64639a181b793f1f7320ec69dc464307a3b19ed5f67dacc070e954b65f2d0ebcc43ff50092cdfc9b84b8bbbb4ffa277f53217a987d3e23bfe5c98be34817112f31c9970a6399987fea933b0fccdc990b4bf87345f28997745bba7a4dd9f93cd172a76f1eac3964cfb7bb1f9fa9c9cbc2227cfc8e948fb774ef3f5c9e68eff1da3fda37f27f3bf33cca4fd3ba4f9faee15ac8445fb7bb2d87c795e93c774a4dd48bbd715c91c2543c5260cd66a85e1ff44c5262a365131fa439d9c9c9c6432990c090909e98b7db12ff6c5b47f03de73f29c3ca7e939698f15e584bf4c5adfddbe7f434117356d8d61f71b1187fa328d3c5dc701bdbd0cbb8edbb64c2b783d1f45fe74a4e34f305525c678efbdf78787f12fbdf56af7e66d6d0fd5d5a1de1ad6743aade6394a9f30f22891e608944cd39433d33891a68d1b3520d0e166166046044f2f400204559238401b4a3138c81c2131454d951b354c50c9824b136d5861a3045bce6862cc0c62d006136fa49122a5258d16a8fac3ea572aa59553c705cdd30d4ac8d65041c59738c6a0c2ca137144d902884bc4aafa0045972b96e0a1862fac8040031770c18229045fc2a0a1e2d184d1be54a7a8c01b812d63c2b18ac3871b9b3360c0f183ea0d1bb8c301850d1c59c0218607471a374c9d84c30a4aa281061642e440022baed0208a119b128233669c40093364a05283538d5677d5ea02c6c700a30b1b2b27d419ae32c325470c66b07d2146cc8c0b18333801105078c1218d356f446941980d099bda039a0f785f6e1c2af080ce35d674c1c28a33639af0024a15613851023262d4d00414606e1c62b82a258e373ce96e8da49064f5ab1b1d564ea915442d2d1eba2395193d30219ecaf3424b14676eb089801b656851461955886164c21561a401c6165600610232506cac2a0f0ec576a6053a54cb8f91948e4b5d54f0c4024d62a0f40194d22942162c7fb7f40fd64f6bad55516aa7101ded4b4b3f7e4ab817541d4e357b39cf7aa8b75f90951d71e5e18bfa68a5e88176fc8f8351bf6491cb1377a96268f3f1a34d0c5ad56159e18f568fbf767c7c181ae0ae1c1fff01eebaf9f831b84bf5f19bb80be7e35b400806b1aa090ee8610ba8c0eb3db901a94d0674ea6568833fdae054ea05df417d81bdfb791e0bb0aabeb081307c411608ac4375802f7c3c60d6fc8fe1fd7861b0f7de7d2f0c1ebe065f70c17b4154f9b64537bd68a5e881b88f8feb476b7fbbf6a3be4f9caad081ae915ba95a80e7df7fe215e0148286d90cf407da2d8ac270427ba006060d5a98d14afe2e79bbc26ba01525790609a4e42b6865499ec181943c05adac906798404a66de7e45c74f9241f040d14df0bc7d091d3de6a1db4051c14160818d008eb31dc0c889a46ba703699b9ac6e5ed7f5fe6edef6fb7b9e948026f07e32e035d8b87977b47e32ed7f51d8cbf3a592de3ae222cd4c88bde3e4657544c0b35cce8ed66b45043a6f78c4d1b749d5174dd12c7137552d1f52f3741c9715ccc3ef3b0fa875ef0762ebad61c24fe928bbbb4afef5fbcc95df6ef77f153019c010a90e759fb9eb3f2650f24e1245cdf7bff9ff94402f265b6e2fdcff4c024cb7150f4e6b87750d3f2b79550b483da6f2093a10cd821abad7d3d6dcc5d5ee4477ea5e6fa29f0c61d7f1488e38e073a185d1fa41a0caebfaa1febdffa3a96f044a2375ecaeeb060c85261cf53e968698385458c7f29e512a64b0890c082044c18e0065684f8c01645557801aa24404117346cf980374bcbd8d272e98c10da4d034519377429cd174f5e687f8a552afa29f898277cd0c19a1f288185b84b3e8c15fa8b02fd78a3072bf4d21b66dc484f45b3ca1535cdb981194fc5351d89da498c74e8c990d5fe5286a93d6ffa50a674d2f9778e81c0df122633cf9f40600ac5e50addc7958e50709c519942ebe838a382a4af87573aab4b3f29c170e80250344bfe0f2dc19f1fb549ef04736e8c3feb103a7e747bed3b2731c6af31339179c8e6cdfdcc4372cd548132994f33d5f170d3d7b28e06640a6c9f32a1afcdd79e097d4bb92dcf3c64f5cabaf64ce84b7f979321abe7123af3ede105d8e59c32473ed552c6d471c04117589a80066f8a753cbc3947d5f287f9bf7fb8e58997c5d331c650b2e2f8183b392b65b98bdb3e7aef2d8129dd401ac3aedbba958e6aaee08da5285780b1850e67d020c011465da678230b188c918226b4287a5423cc701d1724f0b84801126ab248810eab6ef52b379a564e9c957ba7b8d14523811b4b493abcc29f8e4b6eb040ef906905115c451e475a451fa7de6a157d9c6eaa95906b51cb2f484aa1f9f32f93f9dacdd1ce396bfd822aadde25338537eba41b26f098b4263cac6af5c0a2745b0d2a38214595347ec892c31917a4a011031dbe8461021a82f88e5855a41e99755c72a3c8cc13140048026f4b291d97be60f15106c7f7745cfab2441c68663ddc60d6c31a65cc7a689acd7ac07265d64395590f51663dd83093626626458d9994a69994d94c8a1533292b9849499ae9c0349372058592728a60524aa92a877ed59bfef198d7744ee43bb1177ba81afa11863aee1a62f1fc8c5c48e1a42b381423cff65ac83337d6f2d659591bedb7d72cddb4fa3f5e87e8365073b2fd93a9b7cca4fed5b4cec7aa7bad0c536b79d73c64b50a5c3efd4ede8f9167ebec094470fa9e408c3c92462da5bce04a65b19cc0508c3c3c9e877ea3b5916f2398538bd095081dbf9aeb0874ad72b504ab08741dc282f59dc87f327590cc43566726f46f7d19661eb2324c33548cfcfdc3d90f487adf4d312b94cd7c50f22be7474d295d22bf66a7fb48d4324c2d9f06aafa61068dcf6babef4ae9cff92ca4ccc0f2672ba506963f5bb0b0f5e1eaf1ea524a351f3bec4969e4ae08cdb80d1ec5dd5d8c3badd3dddd9f05adfdb7247d4787216807c1a97b6de2d3571d88a2e9bb7f6a0d37e33e72c0f23d07899cf16e51722aba0a4a0d8e3c5349042fefe3bf4fef65f5fec7b5098a00059eda7373ce79bf9343f293461b28a95c0f05d8bb964aa3cf04586584b1a4e23b958dcfeb988b6920a5b660ad1ed8184b460b24289346068b0f1309a992294208171a818c9289f2832cc248a88823c76bb42184101157ba355baab0b618d1d2d4a3c197d62081f6a77e2fa5d2094d9750a3e91b71d7d5f45348e2c20b346a4a29a519fb441986472ff4fe1144fb5facc692f65f19a1fddf9764c0a44614eddea2f2dec614cf35a63b6da9717efddafda9d31be3a512cf977c98874e427a3c9c9f52ea49925ecd2adff157c92b6230d148e948430d182be44c97e30b8a859a996a02b1b53c89fdae745c22830a324ce0441759db46e90334b88cbb3a982ffbd3cdb85359e960d58c8baf74669e4f391f470a2c1f4709cbc7c982e577c0fefd0e24d5ef80f6db772004a6ba0321b0ebf864c4745c1aa3cc4bc7a531a2d0b2cc7cc9d92cf2cc2f81091c3d3c42fab0f52367393487e69c0178cfbd0bde734f9fcb3324d1ec02f75d9e81cb39b4fb193cefb9870274bd19674869cea829010c8c6000259604126a38f104155888019a506ee8218d152c29cd5c60051010142c81822cbc60e28b2320960f587bfbd5eb4008ace958020a300b120d2c5f7e3903d07e7b17b4df720efd0854b30bf66fcea13906200b3895f1d87c2f9a2fcbcc974ff32da88135c0f26d94a6774a9dfc8b29fd5062d54d4bc7ef71a655e386610bfe600fe74b16aa22d0cf7d99ec47f6137de22cd3b30496bf7770aaea86ca48e79c6428bd59aad2c05286dad3ac812aacbad93ee59d2fe3ef39b34499663267adb55aa1239dd1eb2229ad9abd1bd7a540d3760eb07d4854da1ed9db513de9474d9b5fd0dc26cd94bafec008efa3c2deab7d484094d761c18407e2c41dfa1d48b55a2bce7c1c3dbf43a5eec65933342502362777330c6400a8676a73540d5229faf8f8f8f8449f0b024e7cdd596d2e09276469daa2e3efc0228fff8f9ba0c455a99aa8886887c520f175dfb33cf21d8f5768bff2e88322bc285f51ee6c498403e44b1ec91dfff87208f99245534a1268bfeed193b07c58962aec872466b99452242f57cf145b9cde3974fc707a7cc9a3994d60016c5aed6103702013a200b105b03c9af248d54453242a0d14a3165ee818c3c8a229ad42d397300d5667d462e4a1124a964a9aa3b848737dacc1dbd34b5d7000400d38fe9547a6981a036c755c1a438935c6954b63bc38cc1abd574f17a76ec7d91b2dff5e57b560647ea85fca4c7bc1d0278d29caf4e2e43b515f2f637c27ea8a6f4be6175f0f7b31a3ad79958c640be619f6c5e8de2dccd1d17df7ed15f405cbdc89fabe7f41374769e37ff50d63642d07b21e7bf7e255d57109cc18bd5fe65191d9195f2ddf99b1e02ecd3b2ddfa7e0d043d984a56d6679d8748591969b9a2b74b820c09e8e4b56a8d1f2b51f30a7e39215663817584183788f80719a3b516b17d4f11df9958ae003f678f1155c68aae3121820f45ed129a4ebf88f1e774530465588f223488bdc888c2eb24ee001ffffff4a156ffdaddbde73e4781c7048ea1c9d0d7a7a4ca22963a69b6378f880f7535dc1f953f7c0721c070c0ae7998e668e929b5ffdeaa6de804e82c21b473dcedf645645e526f9c5c39aa38732bc5f4339d25df45105ded3e8042938e7b5aa71e6ebe7cefc09c2cdaf6e7e957384a8bec931f2e4448df3db8f74ba1b5007549d20027c73138493551ee264549338a6fa6801a6bfa79151cecf9f54dc75f3f3e7d1ea77bc24d20cfd2595e6cec4517ad60d381d8babfea6db015224d46fa9e45f908ef76f2868c70b49bdcae1c1c10b499df33fee47ee8a3bc01f0fe74b247984bb76fc7c79c55d3a7ebe944fb88b839f3c1e498e0a9989c6c1015921073c563b401828a4e6d714c7ab389287f371b21fbd2a6fefc70b2cf047ab0726043492c23db259cb3f3ca4a0d7827da8e32e241d55bac8eaee7cd990443ff5d13506933acc7514d45e769a77bd97e0d4184c427d77352d9f7027bf2393071c787ba2bfafe0f6b65401f554a39f0af62df800b0011fd8c4d3d7fb54a81986fb50f44d1534c72095c8345a03370251300713bede97c0ad0bf5860cdedf8d3c1e0c30ad4a5ef0507ad3eb07bac8da93e620b19a3ed51f084a40039629aaf00014c3f5a3ded6d071f601244d6591bb6addb2280619658646d7298ba4a7699e4a180b8e1ef67848bfe521fdcdb23a917e4825177d7074ccf1ef893e724be4a95fdf845886ae61e85abdd0f5f7102d6791a7fe0d1b78fe963369c35dc21d8ba63f5ff6c46c0aea51fc15231997b359e6883155a8e86a83ae9b34732fb7619aea38e56cce970748b1588c0630ee1a23cdb82b7641a3a4ab129aa9a4d4869c7d485e3421456fe9a4ebc7275d6bfd29e9c4e2ae3d9ba692bb6297345874fdf984bbea11ba96602a514aff88d4d4a38f0e2c9a72a015ef5347e0ddf30077755f1fe62fefeb1bf11e77b9ecd78f61bebe2c8be64e0583ea49f5a4ee45619c8bbaedef5fddb9379bdc1567344cd1f5271877e9d060cef6dd472d8beadf5b6f6880f76cd25506e66c59c8b5742a1e826ee461fd00ac81bfcaeacf59fda9547f62a93f9b6c7d7965be2417dfa9ffe582c1524cf4c13aca592b094c269495d2af4691be53ea4c1759db22598dd6fbf51b0ada3e1fe32ea959ff7263e8cd7a5cf643c9db4f74e2cb956607522ff43aafe3b87c2b4553634ff489a2f9429f3c747f57525262516991b218f18497b89143582d8a7270340b2d5040a1d8e80eab5fc5dc28630bd31630378b2daa10749cc5bad01ce8388b4131b749a54ffc7bc1c8e3946e795e77a7ddbc52834127bd48a54f39371d796830fac8fc91c7dfa9ffff4fea72a23ef2f8ffabd1d6604dc7598c09ef8722f46e69ad068c759cc57a680d71bbeb7998c6872b7be264f08395c936317ad05aa0745b774b6dc15a3db02aaed83551f84085b260d15ad78ad16cc15a3d30596ceec4bb468a104256c4d4bc118450154d6ac218c198c7debd8e6fbcd436af1a2e523c4fa805314f65eda6398f8e4b5918c9a81b343e718526a50bac40410b9a3569b8a89182468a20ff1ae20be2a0d2258e33347d5aa4b51041d3bf35d03446e1c841d3a7946228b2d878b23366b47f3cf384f68f568bcedf63eef2e934bab6ff8dae3dc3d1b54d70a95eab13a2eca36b83208216d64ea801f043fbb7a26bfb3cecb5f4f83cccb57df29e0fcb7bfe9632ff9fe08ff6d87c2df9105ebe477117de2a1494e419e46f1692a3d0c20af9778f2b390a2fdfaf380a2ba050f4402be4192890926c83924ff2217ce843c763d8635abe94492d72e6ae0f5ebee4e22ed6cb974cd269abc0df2b9dcdf2e077f8a3072644c2f032012f5f78e9c2cb974af3c5c223e0f7aa003236808f3dcce7e5b3e0ae204fe4e55bc05d455ec86fd50a85df3a3fbf59fa7708f4fb8791df3d41bf6142bf85e81d65f27bf9362fffdd85f33c5eaeb48e96bf593b7e6899f31ba6e52b01fd8a9b107f09e857e64ef491b73f113d0cf376a50fe70d45e37790c8c2c02020911d02120189ac068b8044360824b2134c401640de45be43923791670d09f233a58714817dd2cc7bfa804416f649fe30e414f2eefe834c748fe44de439050cf9f2f67957807f12accbdb7b4e01dc0f51401724ef21ef09f02e135d2eefee5909f83e894be5ed4d4fc0fc2447e59dc27f09f8a42eef23cf2580fba4cecb1bf533f5eef3309801880cf9203e79077998cf27c104f0453211d6792379229908b33ee9831f92b7f73e9f1424efef612f044440ee2921b7a089bc109bbc857c909ebc4bf820dd82f64979c82709c95b080a20911df24941fe851c80bc733c98892e097917f9ed00fa266f143ec801827cd2901c79dffc7680edf5017210c95b7f1003dcdcede6b01112c400423e29c84dde01f81c06f8a42d6f125e33c0f6499a4dde395e88cd0741e1871029216fd5e74c7483eecd2715d14f0485bc89fc10143e69882aef9ebf09cabb842f923f097c9db7ea51f8242279dffc90ff010b905b5feb7f26ba403e294847de45fe2713793879ff3c91155a79ff03c944b8e60d6485fa492dbdc20f104864f527117917f208ef4126ba3c79ebf89b89aeb64280bbda9137d0132100914fd223e4bdfa4b804fd291f7fd2002ecf8241d45f20e7a222daceebd3a707ef22ef2445af8f92422abbc47781d2d7cd2cd9be76b0bf9061b922a4ede3afe07e78900bd2ef2dfca441748deabebc127ed0802cabbc8eb4ce4017d92febc5bef4126c2abbc81fc8e4c84ff933cf8a0bc570ff44945f2def1fa8d8003c83ebe470f235fa4878fbc7b3ca59fe443c92719c9db88104864833ea9c8b390c3bc55b04b2c0fa12fb2a4880a7987f03613619d14e66dbf83251d7c52cee7ad63798470edcde191893c2399c833f249453e84bcc3cfc9445827d9bc4378ba42bec17e127d0ef2e6e08d7c128fbc797c914f12ca5be8833291cdb93dae8f9c4ce40965224fe89382fe47de3fde4726c23aa947de3ebe834c84b51525f9861e9fd441924ede3a2ff4493979e77cd0ff4c0180007824e0cea7008af04740105e083ce183c0d71b015d5f0434e181c0135e83afff015d4f0434e151004ff821e0eb8580ae0f029af03ee009393e0c7c65573621f78000f812c09d0f0028c2930082f02d10000f04dcf91140119e0704e17f8000f001ee84a0085574fc1040108e747c16d8e33f003bf80cf67810ece01fec91a3871e801de4e8a14e0e073c563b74e0a86e72d86090d32950db214b9933342a5d96ba7cc08ba227a1168accc430ea18433a02a327ea2e2e41f00e5f98b59a60087ff8a72083dcf717800c2237eea5fcdd81d4e1fd46bdbedf5af7f7b7d32f877787dea1dea1f7d5e0d4b2f280eb4b163cf4aa69da6f22dabfd3fe6a6f25775fdeb71c98c443e76e76f25277dae42a275fa3ded59685bf3f3cbcf287879ec4437fed65b7ef6b6ae09b37145bb7965b39d461ab82add043ffc1b90da36b79f8fec2b3fe76ca1381f84f10480cfd7109dadfb7088368ff1179fcf10df0fca8fc6e7a32d721ba0a0ea1a4770fed2f1fcfef6a8d41734eedce39a7f676ce59516474b4e1ab2925053b2977cdd9ee9cd372dd47ede39cd35aab596ba596e766023318072145baf8d849765ff86ccea64841675396a853aaac749c4da9c1b533d6a84c9440e24b2fd16510ff18444cdf97413497415c172007311248d45ded60a503a5e3c7ad59fa9ba678c0daac71c71d47fbeea1a7bf056504e24fc1198178de364620f76304b2fd2b137ffafae631b06727afedd7a1e84776d6f6a99321b9e6c9d54344f4cd32f2d49f9e0b008ac6c04a3f5955d79ebee61e18b5f701cd0ac27116022d9a7eedba6d69c61148fbd24518a6af69339e1087064a55d4a4a649a9792250d23ba5fd13e2416bb0e2b17dc41ac4870442dd453b6c03bce3171d9d32e0ae1d9f6670575542fb8c0a17e9cf8274b564e8ef32dc01d0fef7028940fc7d35821c413b0923e0323886df23686fc00368e024a5fcd6e8226bd3396b8d1295c6044f98018eb32e8c26b5e27d57ad37411c06c7252a9ef47c79efbfa22ee058aca332d289b2d23d9e0398405d3603472d5f9313533aeba4b5fe9cdbb553abb5524a41406da269bb9012b381dddd316766153da62c9d5e2af53f6e41141916ce9fba362814ca5a6b8352a07dff52788d2e05da8e76ddbd369fc7711b8e9d97023119de87b76fc9177e413865e3c57e29ef46c725309474fc82b0f7e1c7e9eef7e1df42858aeefc46c72d3fa8b9d11d8742d95cacc2dc8d8d4d8edf3ec74d0ecff3beaff33c2f8767f3e1bfdb97a3fbc08802b7a731185339529f4aa5501eca4bfdf6a99b9b8e4b7deaefea0b4a712b2f258b1cf0a0f352ada192525ecf5d3dbcc763738fdd3078febef183d03cd4e76d1c65904ef3d9ba8fd65a8bfa716a93427d9cb49112f51d977a0e0cba8f028fc4d57cbdd0d474af7d1428356a0dcebd14eab34b32305f120b96272c4f118c08447b1b508a1143ed259615c6a9df574b7c032cfff36c9a6653939681a6f8a4b5dfbeaf434d1d9798ae78754b8c8abe6fa78e5b6253b4d5374b270f35d90406bf86bd14eab3f9ed6db00d0a65ad27c9d0da63707b4bb6e7de7edfc671dc97fa0b1e89da3e0a04b95fcd170cb6b2f63bce43a1c8489d0265e79ed4b0f99247b7fb302410ed3950dbb204431ec926f9b45acda6c883ddc058e414d1476a2fe5a80fe5752350d25bae991eb481bded6d0fd4db03bfb8e35ee419e3c92034d69a759115252ae57d1eb7a1502914ca7ea7799fdc40d41af3deaef352286f43f2dd0d7aa9516c78183c75f442a98c9677069afb0be67c1f75a7dd975abbdb6bdf922e771f4a0d6c0646e9b8c485167d41d75f775316c44e58ead805162efaa274ec020b15287d7328e43a856decf5eec5db17646d529f427ddef6d806775de779b7ebba1bef82aeefedeefd4e755da740ba6ddb16b47d41db831645c6756797b878d2516f0fe89bdf438d7506ef95f63ad1476aed579ae7d92a4e7a0391dc5b9487fa3c4e4a19676bc71029cf438ad1c0f4e9c471aad1a1a9adad740ecda07354e85e9b60f53934b5cd41625f7b5b6de5b8aeeb3acaf91744238f9c3ee7b4765a6ba7967317f3aaf667fd6cf5d01f23484069e953bd4dcf46fbc71fdfe675ac9adadf638c3400a8f97d3ce2a7020f5d9f1e69929f905b1da998e950c7a529b2e80eeff85b4e9c3446ee77fded2798d371d5b75ca796df91184714a3e3c08e7b50e52e07631463f336ef3bea7160fdaebed77df71d8969f4f673fb2e4ee979526e997a2a0f23f71e146de379673b9bcf334a0c8edfd195ce4a731d5575bffd37d5f6fe1a13cfaa0ec7a35f90e713d6609c9b4212ed138a6740b169c30336646ccac03a389810989667a8dc50d9e0660365f80945329a83f2947b0fe8f8843ce7a850df7ffbf838df92fabec3a3607dbdb7cd52ab81a80d0589ed6a575e79af9420500ecccaa446ad510f274a0dccc1142947528a78e0e22b3d67cf8a872b7abe4e122d3d3dac2a8a2d776d184c88bb260f4557424a2925a329fdc8a261f0fde18f9fd0ae0381f8e0096ce0e841d383e018c1a8a71ca3f38f2c3c06de57e3f8d38a9eb32854f44c62035dd4d75ddb3d28ca67326394f2e76c4212a6db810cd5b4961951b5b2963a69d2d2353bb9ba8933e9ebe1964863a434461a69a431464a694881f183564df3136fe2e5e829f06ebc31c6e8495974851ec6a714ece2c47463e8f07cc54802a8e51849d8914b6a0abe9f63ffeb9c7326dd9c637fd2777777f707010cc8ff8619b8228c8042881054b10512d00c34e3b92329a594524a3ddf101d6b9aa6699aa6cd1d39e79c73c28066be21face84e21ea8ce05d1e9ac9ac4f88a3ab31b9a7440d271a68391de445cabd4eaf810d37136a58c7ddd017c8f323f7c279402fb0dade0faabe979185d7417074a4de508eda3bbefe8f7f4a3f7fba8e739a59e97f7b7a1e82ba3e6985c24ae75f77589cf9737f7f3e9139abe4b6e9683961cbe68fadef77d20121fcdfdedfed24fe83ecd51e1ef7779fbd7edeebb7d7fdeef3a9049131fcd650af868eeb9ec84fb2757c7c833ffdec8b3fddd40f9bb9ee962173d07a96bafcdf9f96f8deaaf8c962147ca7370ea4f064dbb13e9a465f0b4ff7c943f8e69d732502f556cd04329a92516d352c10d640a4c3fe608008af687a29f487d5993e2e0051b61a4133c3e6cb57492e833b57b5e8668424287c524ab34e0bbc84156e9131b0c51460a96e9adc381e401c7990e4a7aaf3c79a5025dd4917a6963a643472f53a2c8a1a31765de50e9b8044695c8d2c1c405a068fa51d3fe21b937fed6c202e88287f203b0464cbe17c9974f01a142a8142dd784414b15aa1901000240015315000020100c0704e270503424cbd2921e14000d789e486c569e89a34910a3280842c418640c01c010000c18333343b40eaca079ea411373a8415f7a3158055e81c354fe32567f3b997988169e0b612d73fb3b113bf5c122e364fe9743ed6869712f133c18b206823d7a961684d70f9af15f6352d16855c7ff404a7f6921179e806cd671a4c4972cac046321dcafc5b6538a0c3c97f03abc9540d84dafee2866aeeffcf2f159b74fbb4e3b47d19e304d68762a2b94a3415013303cd9c4465387e715bcc4e330bd514014ceb02a80c48c35acdced215636be8ac880cb0ef25963253f0d6bd9b95e6386050438a80eeb426d0775acd1fc8a71002360d1be1a1865a9a5d953ae243df2bf537f3dde6a7cd91993c7a2cc203cf68bd0b50cff10492b61a02df9d5e8e3af1ea9ab1a9d57a6a404347ab0b83e8a3f4a6d255817814e8ba8f1716fad58e0d5dce9174a1b0eb6175b4cdc2138b69918ce3db1d40033487861c215547c9ea5721aa4e39f681666abe3b875376b62b73c0e0607dac702b360e2e1f6d992e67906582360714b0209572c0b91a8f64aa5ae7069cbb5f119ec5d31ad498c93477fe80dceabec21893a24e192fda31b53aa5e2808334d983001c97f25b1a0adad898555b4e2fe8b5e53423276ac10ce2e06787324c55ff7533281c67d7f0111b2f3f596fb5ceb4eb1e326e1ee2f4345073800bb1cc63a8450558c1e46417865bc92d9aadc7e453a4f6895380466be0ef71656f611efb69647032cf4fe2d467f002d6824369cebdbb72ae5cd929486d752c73c417d7890d6682518127a38abe43176a3902b5f8849b1e21555c756c8c443e4b28ac7ae042362677e841d459a3de3506a854b3b211b0ea8bc728f22b65b55f44140c252c0d3bb6e9e4f6d97ae2301fdf8ae81646ed40356ef9ae54c6c9f0dd8530b5ad14c6e7a388a31c8e1f2f1ecf1fb68e7bc5e1a1dc67f162af5c5f5dda8629ec4abb37bde1dc43d18608c29b91edee03d195204f88c5b21fae113da21ec3e6423f6313823073cdc4686eb92d542c5730c8d7a8e8da72808200870641f9b706662ca4d0d5bf3649bfd52e8b51c2b669dc96511c66cc25b1535128d730ef694132d47261fcd35f2aa7a8172c2e937c84bed2c6f639235bc673c0193e0f8fc2e6fbb3b5ff9fa5a84c966bc237932abbd5fc10429b51985037c54237189a71cbe77bfb9e4b1a7d3670c96e5666288786f204ad76e2dfdd1aa393ce047f47c40134c479765a9fa66c867c0d3dd62411ad34b521ad6f511a9c6ae84d64260fd78a718f1937fe9d19b184cafecdf9bb30b8f80c52c432f63427fb97fdefe17310953f4f0055321a9229992de80c6445385d31ef7f3012504a8125b2ff83ebe37beca00a25d5a64ccecfd97ce621d05a25a62eab2e92f01bcbb6be972302eb3bfd71b44ff4698e94ba8030b5505735be55a70959bdbb59600c793ba996ca2d7e294fdb426a2ce41dcf7ab36aee388d2dc6857e904c0a0bd2ad313a90daae5a545763e4dcbe4703c996a06285992e712a6b1f2ba0853af30942350705222f5757a8fa19149209832f6c9e7bd23e73a06499404f7e861af9b72f99770d12c30b839a6306a08ddcc1ae6181a039fb3fd4333f768e3a221a2c565a58fd35afe72142b561fd09dfd232f33b7e842b9dba04c534091b742dd95bb2a576bfe55a4665018f8b198ce6f2431dc35ffb8555522c6a84fa3092169671a0a88328a979394302fca1541a5e760e7fd46b839236e59b207d1b6644284a4312171c9e2c2d524ba38d0ad6baacb4939d05b3b6e060b5d17ebd611daba431b0f4377f126fe76fe1c8eea6a9f7db18a805e2985b409538bfe26c94ac7c850f93f90eecfb6b4cfe0fa6b25d31c838a8a75e2c27fc2700a753ddfe57c76c2cff1fff10329d7ac26280443d67fb0adbfbdefe3f40e3f7ebaee1238a21aa60b7e1494e98a3cc6b0f45b8287eda556d2389db39a51fd2d5ddc830954821c88822b7aaf82ff6ce923c9c0367e40ec4e57387f3936f3f888cfe1b778a3e70fef45a3607be1a801a1e361290c15e9e3a90a7a1c5cc4e84e78b7004da6b8cbcdd89fbdb6e3c2179458003fc5ca2c701f387a173ca5edaed9c0402126ab16796d4b7c22f985ddc1aacec113af10a0fcbec5dc0c610f2b66f4517d3bbdc6598a4cb3ef90917d95f124ac5c6e32144a6fee24fad77211eec626af2b32bc83a7d72bad75286be15dfa4bcfead4fc12becd1e51316fc2bc2c5d4a49af69f42d24e1680ee12e0546a01fc22dd4a3c2b6f9ca4721a17783f446a6d71ac68c2204635482ceba36e95e83b3c11693c2af7f499e9be762817c1f9b08dd065cb2c8dc3618a5ff81ea7f7adb4cf7b9ac54917b8d3201b41e3ed181d9457428c9c16cdb61307dca0e34b7388610bf92d5bad65a1827f840350fdf9a391a32d0ff28f69c04e5dc1bde6e1d799c37fef297f2440ee6093c3382b0a9b38d24f83fc8d0162708b712f9593eb9963e142d784e3ee6c397fb5029b2935022dc3bf53ad74881e7881cf357f7648da321325311e4cd52ad7a40b1dff98e0acda01e450040446fc875314c74d7f502c06d6935f616070e4b96b1bb53e67633bbad763a6b950232de14746ca55684c724cfd5b9d1677075645881f5c344b8f1d4101d5e81c830876218c38af6c17c91fc3ce64964ad588a88e158e541e1387306c99fedceb0d4734221b8caa90a19968740db4deb8b6d6853f123a28dddea9c16c434d0477a0b3f789c3b6b1a1eba64fdac4812488ba88ea2730e1b4b0d62f9405618ead415066c188807809fd21cbe55a2c6a46e37595803e2fd5e4db387c04cd8c77d5053569b8bb374380eb9043a633d632f88158d7216c6e9df7165285e4790f6dab0578a8af8d736e42ec354f0a435535252cbd95dff79220a144925ea8a103ee40b0c8bf84f723dc9acb0859770a3763710aba80695fa2a33255433efaa0a02ded7f5153c7c5e24eaa947622fd18901bb819c5506ee9f7200631ddbdc38e0e83dfed239b8143904721892d49cfb104ed392d141977a073c02e53c19e3cd4b83ee32272eca79d9a1a763c925328e05e7d5914c08883e5625eee4607c567bb336ca26953345f3077a86326271226167843b2055f10cfbc7cc71725b9be7752d6851721ad7ed0523ec5af9c2bfbd848b06884c5442147716dc63cf30096ebc1007108449f4c6988452b087db4a60c81aea93efd6d11eaeee81ea2bb94ec0214e46f150f39199a4f5f28c6abf14198defa338e7b36d29578254d603fa3c9fe289c54fe61e0a833f73d322709b7f30e6871246799c31d39d733e4e108dd3a10a2db989f34684aca9ea90fd9caf51da571c4c528aae66241e0129d3acd15e9da4e164bc378b0f6415b091bd4b17064cc6e91a787aea7fb947e83c75a5fa9b3ae1b34f3abb3ff9592714d134d769aef68050a44a88b2b6521691b9ebef47823b29801654208562299d8295134a017b26210ae481627ace698744ca6e664510260c8b0aac63ccf3f85863ce1f3466131e581446b191fddb4a1052fc08f824298deb67f07e768c2bb7e9b2ad1459ba95a646ef1c64e321982eae620b55fec80c46322eb786546cc5d0653a9f32901abd9cd9adb10dae342cf772a0849d73cb475488991ac5736a2bc669edc4dc8c9440e91a86a4ff52e670655af8efffe8b7405180019f2227508f5b188283a21c778f6f757f5738028ae51adb643da9d5cffd94439e07fcedb0a3b385475fef4764eecd820d68932660fdd6cce3a203e7af54e616938e3b0f6c9a9b62a5081146f0b0cf2ffe952adf3330c608398ec1f0e13e8b5ad890e3c265183a58d8b99daf4324692179ff0f1f3117d8c91a62259d5d67ebc34a5badb33659f1960d472733399da66320447b7f7bd200d12e09e05d409418053f5d91d00d8ea8f9f4674d2d4362a8a45a4c40c31798c2d4097220e3c68226062f145c7f16de80748ffbde87fb8cac7b90208f69181be632ec856ab1d77d06ca0fded02f2d3e9a7288d3dc6e3c6ecb2a6e993b972c193892a83c281a951b3940be08e2609df2290f8a227fabebe47de3415b07887cf6a0c16e3bf0048f8795ed14fa534256be747aa6e2b33247564c8b01f7aedd0dfa4b1f76733f25eb5293f72c40978831e93fe15476dcc8157538828c9e63d76b623f3fdff3c19c793ff1fe86806ec662ab907729b03ce48a8bf44187c905ca59737e8f188fe73acb40c3279123dcc7bc3e3417192710ec71f1a0a79a33c2b037d0ae58622397fc398ba539a5a2125d21884ef3ec4373a95bb1241df5ebf89bb85a8e4091a5766ce9a8d0aa2d4295909f58a2fc9e0cfed8feedaea896534f22c430abf0e0d8c83c5d9e58127aa9aa4b803a22c729049ca98f94f84dc0266a4db194976659ea9985cbdcab1e9313f00784bfea99281c41d5e0874c326d76e30f41dc7f11d72983bbb5a5083618cf036137cdf30c4fdbfd1db0c03407b86188407e7c12b62feadf018bb8fc4b186a91309648ee97604f483f528d4900ad31c59751d3caf4e6aa070715eca56cdc5ec5728e405d2f8529c9354c0c3177232d64e174a43ab9d4b9e1045a5fca2baaf4ab535f5a5b0c077cd5c950b20d07ca8d916a98c296274a2c46cc6dc51d93985acae89a24682c5f2858e4c052bf7c9f2c5f6133e3dff6c51e499686f1092859e474345093482d4611b1cce760dfad2e93c2d186563e1ca6b57d06dc7927161918cc86a8942460700daf1319d1585011792b703b125067f598ade0ce686db2a31855612ae02073d891aa313b97ee34e5d842e05b70e545f600691c87fc864b04c8703f5e5d18ed78f25b85399c505a3ff119588e615f63ebb19ca80df2917cd24e1c88ba3b4dfdc4056fc1d995880ef807a9e2f8b1a39f39d5dce2ea46a5868bb8dd88bfb01aa2b41572b30ff05059b367e8cb37172502edf6b42a8d6c650bb0272ddd16e62f17a8f506080c30247c672461e15e710d1919d9a171e692e1ae67416d2ab0af03e2fdbc9e630030164bb3322dfd39adf5e254e69104fc0a88f7bdbc9cfc926659def2f9d65ca2ec3e47a1312ec03f6148d8515d32f22ec7743fc652f77e006a116c2a5d0981226fddc6f82caa94a301fd35349a8b6c4e6254508da5f20d08de3a883fd100bcbd85607e662e8e63311308ee288950d751e091457652d1307432e81d6e843b02197bf72483e27127b019371b344650dc67b30744035bbccaadbfe11a2da1eadc147c8d42d63fa3becfee78e43ba69a8fbca6437acadb90fb15bf09c6f6deebb2926f2162892091a60ed10d05f9853175027db03e234bb6372a421c24a83b4983d27da6559e8a3604ae5e9c92a7b23b76edcac62e65b2829e0981021e35376af9e09a8ff62966576cc49fea9282185747e538b53f069b4f8d2db3a49aecf95818ad4d02083766680c734aa6071b4fc0d1f971ff3f038da21d415919d41bdd4a1d0659bf515846f11099687aba822f52970fc53e407ff333b5e1ede3a5ec99a548138ae028e0d050be137577b97621018a7a53f0122b9c7ea47a045c04c946327fad53a660d416e913c62bf7bc58ec93f6bdaeb0f068f20200f751dc3812ca003afd185ecce5260a64d7b438704f72e25d2cf2f54858a70b4d1e0eada3480944c772cb25bcd449dcc1a941320f4ab1557e7cd47cb60f9016d49f47529fbe06874e9e6b84d8286804f1dceda9ce718539c09cb654009c70ab09352e15e54532081fdbaba52510c7edfd4915bb61f52cad058320734d24c9534024f6da2beb53c7132ab05204f1aea45ca5f1bade3870f5f950d40f26ebb868d88489f4e340aac51be09423e5de01dea2aa4b1fae23ec0d91ba032352fb179112d6530d22edfa1e8b29cfc46721b3956296f489532f626ace3d138c3dba10f9f6aa2efd2d0766b0c6e59a49a285d9c03217edad4f07ca229f43ea38009228e2c5e3340766990e7de0b22b927eacc100b1e6305a2a34035aaeb286001e2b52500a6e9b8bc24a8a9faa1b8f4946c67e1c3342a9eb08d912fdd9dfec9221a744860553eaa661f25759361fec2210878f2c429969357068328fc918eced434e64cb1cd7ec56bf06d753a369340147eb90647ca9aa4498525da14daa649635ac31ac8f883dbc6611b2e99d1176259b1327d4b6f4e2845a31e52caf2eccc0cb82b5b1d8994203ee28a77116d46e5abd585a47e4dc0a45efd7d070f4754e81a16a66fcd84b1c19e6e6720e8474f7e85b4013932bf0d849e67f13415ef28ed4e7b337957cdfdac8d8dc4c70d0e16fc6800e24a7359f47517f06a8811263264c722b4ccff38c0ea58cb6eec2f1a057552655ef9d01574252a48d33e2d8e8173a2868b2a5e9a7dc8cd469478e30652263b27d0570d91a37d21f06ac3ade92f64efca46daad3e26c4e978316bf23727687257bf49732719408ae446f45f738176e3097908b96f37f779da0e54f4c52483e4276ada9abdb965883ea2acb53edb061efdcd1e5b1f35a07bcdb843d5cf5c61e3dc646c2201927bda56492f0db2e4d0d720d1633691f8b0b1acd1e810963fc954a6fba5e98e7c2e7e1839f75434cf25a5ed46b0e6b70797a0b371c2388663b27061fa2fce8c60c0aed457d668d907707d776193483cff2e143cbb4dceccd85b573ef16e1c4af47abd9e84669e1b7a113cee4191198edd3dba1da8a661539c037eead686a051f2e9310a7bde4eb6170c06165b5304c85dba59d75f8da23736c475239f6c9ae4a2859d8b5afd0909f207b732ec62b9878b62732a8c1e2699ed3c016eb65511fb0abd5bfe6b55d3071f30433d1850e101bc5bf37d8acd90421bfa5d5d74e0b80a1603fc0d30770dd1c5e077e206c93d8af83b351ce878ae241c39cb70f2ac25ac70559fd7cb690e093d67c782ab40ab0f02fc4b67aa406871b95d5175f43ca0c1ed827d9eacdffa715c8053607ec6c42d82bac1d23eff30f39ae21f1074001d3620bc1f8951794f3541c308d6b0bfd8ad841427b9385e6d60da97177ec8ba81320bdf463c2e8a8fa43818b913d7a3132a6c2a116574cff87d7363f935e1fd397157a3f38d06c5725bd20f54cd4375743445997132a22271b083af3da3d500110085d92550dfcc7aa5a2f561573baeb49229c4c16f194e4d52a9516f04041eff082af02a077fad4776091490b9864e0c8be244ebb54fd5de61acda4964a1b0a981b430565346a500df23c133c7a3e25f510b22afcca279dd1ea62d2221377a6c0f3a227b877ebd71da10920df4734d1a8022c6ba266f3e34631e5ac8c24ca3338e706f646f24b3614e5113a1c51595182087d2c905d8e70c5f21ccecb649a5b46965e5557fe42dfe5b2dc3f090ece67d5bc63cc2b3d9408ee5e1ebbe2930d196d65e708e333e9ad06dcbdd1c4889a36b8225b4df7f20223393e26a2b7be90d00e26e078f6692478798fed0c0e400e751c32a56d0a602b948162c165f6f63e5f6fc61b19c41225c8ee1829ca954c2158d3e23c69b2f8b0697863bd898f23e336431f2fdead1473fe0c4c64804619b614a4cd447b9ea41611a7a217fae260457ca33822f0973e60853834d300d238ce205aac40d87cc97570a1a25490644c21201384240a4b8fac43f0a21cd930a11b1886616315fb81df6f0f127709c83acbe4266fe30ed0b7ae1d11b9bdca33e634fabaa4fe34491a5583bb72144e05fd06561cd05cdd3223f95bde352b1d8b37519db577536a4a2eb9722c7b305df63f69213e57c19c413f814cac103f94b970c509ce81de1f55a29edb529dd91c14a83c0d57f683acf620ab6820f5c1a450fc387d5c27d47bf5bc066aba5ab2723d9d6cbde1a713deb0778967e48896ca2333ccba1f026a1a69c09d7ff0db5604be753d2375a4e77d0fe5f7bd2cae027d341beccb9439333eb04314d6b4218708ebddb8ffce4e5121a4055716ad0595b0231cbf7f0081fecb53d99a1ceb9e5201134b43ccd4bfc9fbe88230319fa0d8f65bce32961efe8b910f414042220df178cf1ff27144b6736080d513982a774c5b3b644f28e8a4d06a1831b7aac18c5ff06b04f87a4c68181eb83a164cce65b2649867d9619d15deecdf9eba6dbd9e6794fcd7c18ae69f3a1e57738da40379a56d77ec4856c284294cb677e1c55f988a20d236e2de787d5e5a03d05b2003327ca0116314299dc66c798bc4c817d84b13c65cd6a98c4f67966ab97ae1bcaf136de59cbc9f4a8b63607cb268d29df134e2d7891fa94a65521b6095b26adca8a89281d265b83ec51ccdb0d2149b71a868c587121815538f4a16fb4a58856ffb2260bf0b81611f9fe6427cbbca665dfac3eb4031dce115a0297c69b621814758b5ce0d3495b6f5bdeafa8a9cae189d66831b8c2b4d285e176b0bc02f8184f7ebb9280dea8b64dc1a6edfad3e7a0e930fd6634a1eff84264bd47c1e050d0e7c6ab7a145253e29bf9f42878f0f7186d2ac2e9d919403c85c71411c13db3e9c2a03d34190385a1a636c85f5183f31d9a2455a7ce725cd931c7ea2df366194123f09e3f6b445b320582b2925f5f3c77d9ad941aa63dc8defae621d68729ad9f0d3446d70feccf7baeef73972f39f5ee81519eb089915985d08ea60a166f9aa972c5bea2baea722f4468e85c725b3c20631748adcc1b678fd824cc586e9255173476a642664adff449fdde1516f5c0a8691c4f2d27c695fb262e51b7699d9bd38073bb3e54bb3b7b300bfb15cb4d3ef387ca69b9fea6631f0e0bb4823b5897737eb15f9a799976023cb70cc5cc1419396fad7e6f618bad3fd9d216e8e3c8db18fffb2264c4a7404f1d7d0d1fe3e3b315951972825dbda6e97e26900c9910e2d23c5bcd4f22490e8b7d90444bfd73e9d0f470806a123e947d36553b11b7a2963dbbedaafcce3ed019211760553aa3f06b29e25435afa89f5263233b76b019edfa964a041bffa487cfd1438dfbc92daae2ba88e8a3ec7a413d7422b8240d0819bc3f31f69bbd8715baca7629ff8afb1abc24362c5b50cce633d6ac193ba0de3cd649fc1f981a760b1893b135dd756e9ba404c5d179560f004e27c9c2011ae3c7f08370a55028c43a83ba9057a57de5a5348d326f27d9cd67d40904d3e40f85d9923422049e1b114834464a5411427575d94735912e458099f419b945f8cbd6d0bf827b978f4c2d25f31a42334b92a5ab0e544f0787351120361070a3b1077216381a1a3ce5cd3f8357326fa1322773d81b31696f98b3ed700c5df1f72cb4ec094e4522c65e54b5907023455d6615d67c1b106fdf4946d28e926f031c9cbde98db1e17cab70bffdefdf67f56f6295b45942ab9990ea7439df2d9c181051747c03d4ae6481751f7324e2614a0eed3a7225aaf4db4eced89b453c06e6603075774aee161003fd2b361edc64c566f1159079b09cb426c895f3d685d0400c240f40ba8ad7c95287ac3b8bea0743fd6183d8ca087206f1209a204d574182f9281dfd8a78660f14988f23f85c8bc208bc9480ec46105c06fa1eb27bc6331ac7951aa94aef9ba5adab7e5aecc6e02ec01c54a84f8884072867a8c27ca76b52b18df1b3a1e7fe91430c303b29d75ae9fc07395c3c50d879d286bb585151e3d52676039b2ec1ab1cce3f8900fa89b78ad51f99eeb9cd45c1f9ea625886654a167f7d5b57e14b6bb685186f40438b6a1382def289e9fd2e877033ccc6982233c7087f1471c29046dd26a5f8db2e9ee07fd8bd0668346b003f98bbe9b8d0e2d3f3452d060e9ed77d2b22d1e719d36acbc817675f16cbe8afc3a5f617a9314fdbb504ccac592e671b2f72284078753cda99cd560d55846b89952bb48a969d2d614695dc704d9109f56c6aafdd62eda573e269f713eebdd544f0f015b60e07893b7fa634758fa57c088aa34f4224cc408ffb28fb1ede1dcbba7ba88e740ca186a2d541d11f0f69c27a73536c8c1bf404da8dc875a2e0469166bf25971fbe0aa63aa2781aa37bc0ac26eeee0ba7f7aa88efeaf22b533b0fb59025cdefd2f3d94cf87e7061e90542967f594eb455c14d24350062d6a7a720bb353790227b710d9442d9e2f40da77ad47d844b10f7da5cded178569ceedbd6346197c942ca7c3d6f8f3fc71499bd883980af57edf8381e37a876065d278006b4e4016ba821dc012ced5d88904605a2867a51d82bde3683f91df1135a9ab33e536fd6c8b1208cfd7dc2a86da952849a0bc5b1470af143b60f9dd905ec114263e4086fd5be5df3c5acc49e978b40307725d289242ff52410fca6cbaee4b02eb9b90b50909a84fbdb63661a0e057ad8fa5472a7d08082609d47c285d0986efc639601925379525faab53243550c2d6a5c780f10ccf66354062c7988aa07c092eb7528fa9404cf8fa542cab18fcd4800388219006c29679d2c7f202e581e44acefe237e68c2b5b7157cff28a56bec38035457a09c635bf3896030b27ecb66cc4973de2a93113f56ab71e3afb815d12cc095e777fee1d30aba518fe4f5485186d623d128ac1f2d3e50abd9e178d2f233c9648dfba742c674739522ce5c68822e012cf419c7e73ae2e69b0549915cfe5b478849c2e24057f71f11e5b50e56606ee50fc7ea0a40c8c140c9dc3efb250d2b25615057d9dcb4bed7ec33a3a88dbc013d8433e231735103e9adb319826b6a36c943a2773ece080ec2a0de6618c3cae96d0fc80a9a7ec09e6a3a2bae7718a3d7ebce40ae448590763d13464ec5fb63fe95881fe655cfba41f8b6c8d41dd1a8070d068548555167b8cc80062cba75416e7e6bda10d8ce21dad4d4961cf24110266ddb630a4905e4835bd2b0c049031b92d96acdd7b68fd9576d67f662b60b0399e9d28f1abf07e7d6e801aaaf3f86b2ce5c8290ab14a8af5016032b831ffd3a8c40611b51ef3bc1e02dd4e1f4f240104bf94ee2889307a1fb3f30ce6f36dc4ce9a712630d6a012cd9b835b644d8dbab899f48e1b083e124173ebabe2df4258db5a2a70b3c63d439430224a30ee9073cef827b474b0e08aa7b402098e402414110d1e9585c9ae047f9697bafd00f584d6e0fd899167e5a2951e782d1946f94fc6ce6d01f572581161b08d8c53f6d8a6f2716446baec573d3a4871dd2e5f0632189f8ec73988c7617fa2cac9a80b617fa042c4c4c6abb606b5011b43118a36b9f4aa36ec555849027939d15175ab5082ab118edf1e485a1f671f3aa64ac3b695e82d2137936137d844fc1deb58aecb54f55485bd1417e39ac68a518fa610e99ae440f9099806bd0e21990e1f7b5accbafc76920d0684ce16bdd336665060b7662c929734f706b2a7742cc92499056de43c40ae7d2a64fb5a8d086c72ee43ad4b5d16670d92906de02c0aef00be57cb2f1d99622c3adc41e7c5f33c76813093db2e55e04231d4129adac69b36ccfaad26c49764c854e37833eb5304edd7e37545b30c101777c8e93f4ddc00480b563a4f466e6e2ce3170a46d3dad4e916ac80f1b1aac22b58ec1c8e28f3d20c3cdc173aacea127ff085c942e283c7dba50d56175d5e3eb2acc04fb73cadc500a33e85ff510baa5cf6521596f8036d133e9635788b94dca11b398263ab0f348d1f32a9eab8a38f5b894d537d1d1d917377582bdb1102177a5615f2fc4963bd700f80d533179be02a5b691e8888dcc8d37e8e588336a3fc989bfe892492af2a92e901a093402a2092c21bb919de6d103c1ecf6e109ac5c4ac7a8e66b4a3054db091d41b1ecd4119dc9f40f0d7d00343343035e72b44b100c54878d519abf57ca9154bbdfdaa037921e9eb8e7a8f8512482609dd0ae5a99050017652697a77529e53c334a71f040921bf293600375ecbe547a13c29088e4d4bbd5c53731732801b7298036e30ec4ac7211b36c7f36323cf0ba201f6d4ac50c837e6299bbbaa384f17e3b469fbed4e2425ccc4c7dbed85943256f9d30106d6c99389894aacbb87e184ed9ae612a38f24b6fc8574444ad897b3e98718ed54e5245dd2b14dfb49dc772a73a3e4477a74bc15efd4e88c46608cdfea157c318975b08b499a3c2ec4bb2afb6e2acc09e454b5abdbbf3274c3d8e22d3e5a880bca0cc1975965461bdd513e7d179536408197c10b9be6b4c7cb3fb39c6821bef344b31fec7bb42dfe78bde77e36256f2a14cc744809a6875dd8998e6db09510036c362c2c24e277d1acf0ab72d328158a6f34b9bdbb8a500184cd4614deeac719dccf416838a75dbffa29ee45bd05c505569d8d96cb1c74f866c96da4b0f344c2d71f251104c684cf930b7101a6b10ff6776cfacc49bddde43edb65607d971257bb36d00a67e4cbfe756fbc10c08ffc07cbfb51c56132fb0862b94c37cf1fb4282e36453d1d4ee38a0b94cdab63e0bb9a08956b8cf03da543ad9f866a59b590053a53af404ee35a26683a8811792b5d76df945fec8690100aca8d2d0015b618f9e6c17849fae1b13fa2b7dd1ddf101f3ca6127e647c2bfde3d96121dba7936e031c01c70e64b8cb0c2b04fb4503ff0fb0c58cc0f6579fc5129368156a6bc534624c5d07e4eb20a4ac1e15c468c0eafd8d544d55bd20483b36096c8be5bfb62b03c07e1d5f98ae384a29f60af25893ff80b8814c573ad61ea9f6b8f557294713f0fb22143554280ed3a3b34d4f5d84474939b7d2c9f7cf205c4ef228cd34a68768c3b5017dff75560a52b948d85be50d4978db3323269617e53554e369ebac14441a683f059f055744b6e6170171fbdec7755f7705c79fd7ede47f67a9da7d4c6dffad7ec4f64b83192273203479e42b3bb004c91c19df282f5c57944a3a5cd2722699ca258a156c84a58acbf890ac0fec296328a1d65e18f92229a2ded082312eb29d1dbada4af3f07d66e7670f679d2a2d71a45968611b3d2ee4a530c76ed29d3c5bbb42199fc83824d11ed71f89c38a8e699ca745684628aa2f1980d547d20fb4beaadea7fd83ade331aada570d9201cdf8ff4ccbb7b2cb518fff63b69ea76b957d9bcccae01cf6f64fc403ad6fe91e9b8a766ead699a21694f077cab4e231424be8022c6ba1b2ff52fdee1452ddf9cf9a4fb42483895dc8fbefbf6db171bb9bf4eb0270eabc66b1262495209736bcc67be467896dbc27e95712d9f3f209695271cf6166e3c8b03a6a6ec3e84265098769f1b1bc5c23d67a4b3d34d781ec71f60fd599531c520269cdf52401ebb17499cf9d965af15c4636b260ff6c120b0ba951f82e0b25c94a8088fe014418044b8c8992c757bfb20406d43be1f6707e6bea83a7883cddc26628d136989b63922f3cb25916ec701ab671eb1e91f708bc9f28e2806c8085f4c9c82428f8859900fd55e5af851f9a8a12753942f3f13a07d704f4c5bf0da5ba5a0e523d6c046233762632605fceb6a320c9839714d0a1c950dd31f39dcb8f71d1bdc1041a100ec28a38563492f69399c26fe632b03fd381b7aa2830b6c1210b24d0ad34154b22082b82696a025ef2a14a8784b9cb050d62b1c4bb44e7ae09cd029b7822f792449a2cab0ad0eb80a91ccc70245545de9e2ceba97c50102264833de3498694d931e6628ff6edfdc900f89740aa6c919f8bfa439fd21bdbe73165433673a6616a4d6b40b56688d0e3a0c6e0d4f4070a9337c99b6506e1e46242bb5171fdb6f310415a5bf466f480ea6cc8bb7b220308a472c999b829285afaf33e0ce46d073bd9e3ea117c5e07a70ec21ed7611ef58769c298cb6c2df9b23282b427fcb91fc62fe82e97cf3d7846e5abe50f3c30beed49de6a66c45e42c013168e2743b85d99184f982a2677c699f99f8f9d2704b1324c1b2308cc5b288f86672b1b67c8dfd969ac24c64efd82600158c6b50a4fbeba067f29270155aa2c03fff3e8ddbaa72bd5dc9dbdf634ad63a0ac04daf04dba889a2ff327eeff1d4f697b2a86942736522c03b3238aeedef5f42c6f32010d4d412644c36a8257fa3750322729fd01b6c79a25560443d349934bfe7f44da4a0576929464bb5e356f7f16d113001b9b90ffd61574d0a643197a36d7467afd8a20ac223d0db41dcc1e8991d6f0c969207b593ac3749f89ee61f07a7752fad7962a1a26d622d501cfaf6f29db67244294643cdf47a190d4198279aa348a07c07a1683022c5948488e957244752264b46a813ad6daea984d13ff12948dadb173b2cc3a34012a03d0aa321e420cb1cd8f030e4308583411b885dd73b10ba4e03910db10198f94191d2dd1919c5e9128a800cf050fd8d82db0b3d8d7f7911db4445b3654867a3ab0d0bb2126ba3235e5c1d3a73c32794a999d2c90131c2ef344a23e52ff8ebd7165e2c62214a127fff6d28dcd52c214a33934062114ab12cd7d2a7fa2ff983e900cd626e9f9f15f0127307b02205e4614f9bb7c3bba2b2989e452b53277b1d0b86ee62038cd4c83eaf1f6d1c4ced27dd351db6e0c808c8af606b44c54c6368a627ca0263a700a3dedf47b499d2a99b20d88521039e2ee0eed524eceed01d66814b20cd43612cfe6a388fe223af18c0c28d253ab7cbc109e39acd70ae146145863af286137aa820853277cbc056c75bba48b8fcd64f901027d799d0d52c833c66388acb9e65b2dfa8956599119c064fe85fbd9cf651dd0bd3a5827c5d2f88fa54eec05a2b93f2ce6d547b8c21e916fd7f6512c8eb63b907c37fb9c288e13e604df58aca8628f47b1783c1ea85b8a6887a651810130bd8ed65c1b53bd705e9bd6b72ea7d55938e78fc5d215b9a7d1c9b3237876e4a8551953e636c4e8e94e92d39c2834142eb927a186305977217f157c750fbbbb8fe054d3146d99f883e8695874916cc3b41139ef74fe2e11be3ee34cc9ec7eefb1d19ab4c0e6741e3ad4a0d642e12679b48f907de26af3d160f0c925dbcbca36f8c62425f7bd7ddd549d2b7745582eb00e9c60ec2e5c1b6d44457c6a0e340934f4c90a26df0c179933dfacfe0e8c94aa1cdd7e220324d24bc7439e078efb5b1d529cb6c2d48756e52243bf11d1401c782a1b4d3c100872b32088285c751d8e31588a6b0e48dc91b46efb78324418ed83fc543db089616b6a701d2cfb16c8626997c1662f9c745c1816300822183475551921547609e0d07ad1273886d8b34160a031e628426b1b8cdd96a0349baa81b728e80302d985519847901409e47c6f4470509cdecbd93e3a1bb491ae52685bd0a482a26cf441d4546a7203854c74c5af04e9fbdcb81bed3370b1425bfd5d8addc2b72fda93f08b6681540d71b3265715f88c6a588a12ba0f9681de65fa550007715ce561582271248088c25d1b1428908c61ee7c46118e9524a4a5649c38faf27622ab018812940b57de913bb9c88e070cc3ed39cd7dbd873f6a5b8d39edfaea46033d2538947c9307c0270d4ba493d830cd84112d05a38c1dcf2e231b9d0ac427bb27b16dddf0065b48db0079df21f72559bd0a7379cc6224f35510c1129eebca4e5874e2702323a8a1686f304ec843017de5b44fc6413385847f7b9f162473cd17446583333abb9b946b9779aea95c250fa5dd78174af9c3b8fdb4d18412e09ea4fd29959d16e4e8f240d541d2de6df3153d91abb55af8c8251c212ccc882cb8928096b85fbf4a7412a1d8af7cdf9701e677a28a68ad138313453544ae1335fb34cc9e89a0d9bcf800fd62eb49283127be0c9bd059ad64985f337260d54530576d41131565ce9e8db98f666f5e46553c2b2104ed52901194da3866b3019c968d664a0b8ad064e51614a8089e15759bc81541a6a347216e2a36814260fa66bbf731c4f79521af134d15f01a8e45327eedf90f27f8758969f94a573ead6dbfd69e4906c8309248ba802577c5ab5726ddfce1620ef52230f2b5693b54d28d237f9046f57420dadb5f111f37aced30c4b4d52808af318afa7d29d4de2b0784803760659202c8b378b59efaf5385434199b82fa7609248f7873c51b573ddd96f1b87488fa0cc24ebf2e65dc53a3650ece109045aa9edb601f2b0fbec20bdfd2df163834b11030d2f9e91cb4569485f18be27bab2085f17ab70afea8af990b63118a5483b8614986c0e149502ed955fb858e49407f2681caf6291ad107173e18678b668a3bae97f1e52aab8a6919aaf532c6ae88109114338914c083692a0a71561dbd1414a7cbea0a3f17c7e797f7c215197a3e6d6abf5eb240a2e0565eef22256b13b9b5db65eefce834388e7ff9dca30bbde1880e390d533be1a3044a9d74db52ceaff674841a3be82882c48c6ce3b95c7a5181caabef92b3ef482c1d03ecc70b852a550e621b2bfcee9100485701e9df4b901cb8c0114e0a2d50ea52272fbb2c2694be36d59634aae07ec42afa2acb26624787251d315b8d1aeb5c16662a1629bdae25bbac9cb943eeb27f84bad5636f9bca3aadf8401bf97afedb26315632c9640dae2ca2c88ef20839b8bd7c83efa31a749988ea897842c35ba66a1c4d40a551d652dc900ecefdfe749d033ec45727c9fe52d083403140dc507e7ef8482f1fbbe791004f435edb045d627f86de1bc4474ec18a331b7f18c76554e724fa10ff20a47a3495898be773f4bcdbd5ab44e50bcbaa4aeff036a048a3057936e14f96040656221dab8dddc468b4fb1c2a5689a7fed6466e01ed1f273c92b08d9d8c5efd84a11c5f7d51da960e5466d9abe1ec4988962abd9e5140c966574d7030ab8f68f832a18836c5da52589a493dccd0ac38b77fd806ebf0858db00d891640c4ff201da001147d67ab1cbe8d7a7b9ec8f5f8b66ab857bb7e13d4fb758fef4af9ee804255bafdf7a687b582e278c2061f320a17d4abdb89708169bfd9ad1a45c432fcefa0610e8eccfaab288d2c9153530471e7c350eba6a0c0f807d85deb847df09704b000ee855a52bdb09365999cfdd5631e4c7c329324e29b98c0fc7cb2f45b666b1322789f024a0913a4a98f646c5da44740c8e6d7859701f47a2582c77011fc424c2d5a1a615e2887e4f8792452910143a7eb43dea250436e1d533140da7297a291913135db96a81e7544c7c6ef6ae18cf92c301db82f6fdc52cb19ea77128e237ed22365fceaed0a7256c33c6d4389b51c1158b73bce170cd561876319854e170d4b376e9c5b8c4c2def56c1d8753d053d1ede3a8546c58158c8b47b117c7e02dd151322dcf9d5b2825cb20ebc729d2fdd680152f91d451441775da9174bc8e45924237a28a3426547e028ccf6f7abe9a8c674af3a2b60ea89c77f4e5b7046d567e1a2ce19fe09759b6aa2f0bb4737a6cb1af6a478a9206402bb42ae9907a053bca24c340c26a846143968af0a6085048304d63391ab8c38b18eaf60e5c8690713d0e88f7f32822819fe08242609afb159031d0eee7bc61be5354e3a962f44df86ec5c3374eb336cd8427c831db65084792ba95aab226531d0856f2447f54e1db354ce46f168a69c598d797701a45ee476dc55949c372600ee40cb7634ab61da140b010e61743c81ebcb8bef82d4867110d545f43c584de29c19e53c87f477f22ee2c02b10def93b5bfdc76d3f869c2967ff304f1ca7079184fbe1bf765643e6833e4f2c6e04d8fe2c2c59194e2f18543a8c90aaf3f8a0c747e905b79b7a8f70912b905a5a68c1eff23e8f219bd949d81e67bcf0e1582e5a80ecdcf278c6c878127d7b1cf14fc90fb4a3ed817e1c7b45a6ba452b0d2cf3dc9b6919a4ba206027823abe65887bf5606b814d49848e28f4470322844535be84eebec4803c8c92c49d562858ad9c410330d8fcec67df637c75fbe6efc5625022c008275dbe62e3c6552f33c6b05038451486b1989ac2467c4f13b8261b1dde81c36674dbd5220bdadf24cf619f3601bfc3951d869d505dab7006edd41909ac3996ecbccbf1a0248c8da4d140fd1103ab88732624470b0977d6353b2814e09b97c4020054215dc73ab4d90c9fcec30bfee714e0a7a5e365108deeb9792e09ce8d5fe763495ae979d3140e974003d8f26118f9796a42c4e3da94fe9cd7db82b484f640d315dc1fc21013e9bc3ac2715de4a077d689b73b4236fff681b73d05c25cc1aac5b99bcfa0dd5acc5a4188d91a114e6c01d29628528528ba803b148bfda183df75be8fa81a7bed21d6b6bd9bb9576f4e3de1c423acc4f043e0c4adace62689c0624be3c93d40dd3336c7eb799739a46f1205a954d2dc7589b5b8d3b54559cdeec2d55e70a003f6c0cf02a65452a51162a055e08e87d444cda692e2cc26ef29a94f49fd622a690f3a1b0110cacde6383d76280cb00940a942a76ba10bcb53da2696ee7f0bcbf1ace8a03c743725c2ec7e8e7ed34e926514485ffd4248dce08fa9fb8cf3a4e200d1097b20e1d73c5f817042653f00f39eca6b0eaa4bd69ab7804d59ee0e9a9f76598a010adfc910411b05cc9b8196a1b142433bd6b164a91566ecf1b087eeb6ebd0236b6bf57f3f9d250cbd118888e763c276c3368b040fe9f3fb0f60dc178b36a7f624dc0ff00cdaec6a165563b0278d497d508f94fd697a0ae6f35b7388d30de2d2149967427e123a82804d1d78f6172e7abe0756835893b935c6e81943aaac79a3c800731eb22658096b3d8be5bb8bc987deb3cb24b99609a30766ecc524eeeca67c28a5f95767a8062ee660005fad0f973714cd1cb0f261b62ab7b8f08bd93e05cbdfeba2f2f268d9f14a850335fbad7929b80212cc079867286004039b5d64c066bcf1af5909f46b76d05c2bcf21aa14bc2e034c55e096fb36c101228659ee8c656474ed2516393de250ccb55821ec72759eaaee5e50a0d5c459e653118c07c6728e9cecabb9360b5ffbb0b66dc2fc235925656ec6bfab6a87137ccd4ff36d0ef7bc8880171bb935d22959b9de72da8eea9473c6734cbf236734ec9d3dddf204387186fc0c5b816a423676c8b578c248e492045de3a687508d894c8f4421c75677e9337f94766d7bb26063c6bff59890666afdfc8cfb82b58ba241dd15b6e0b685517984a5ce762c439cde5c2327636385b27ec203039b084f5a30ab0f9512a2f0442639d1f5a258b0225bc3937fc34e32bba3338b270b0539c3341213f3b195bf4ea8bf12e45e77882ef16b1e9983b7051231bb4569a06e9f3528a231b46e59b966ed961262030105c5dad3724e6f4afc030d05867399c6448a1c9c7de5abffbb942c9b4ddaddec2e8f341aa1c539baab28e2e960973db409c1275ed80341266c038096e1bd2c34d34d620c0d4e2e9246ac066ace3a29f684d293bb396009cc0700af0b2cd6068705512bf2d4b80d76264b0e514dd388e5c04f726bccff16157ec35364a093297ec7e56e3dc55d86cda3e44cbc54ee9ff3a8b94b20753678f47f2817f9f0f1578d52cae6850387138774ed190c313ca90acf60d260e2f710fcca03c568ea2ee3560d741500c7ba9ba66c68b171ecfb24ebf98b0e6c845cc22eb4c0805445bb1b8a1895f4f7b8c37086a55c34749edadbcf0d472b57a037dcbe0717b2e99c246a4bcaf4bee1eaab70c72109fcbe9cc67bcda582bd1f5d65583c32b3da4751bc1c3f04d6eb278837b3d066f5d80f4d3866172e4d7993f6a45ee15b55d116b034fa83daaeb57352d52a8e1f43776a060d10b6359b70b691137178fd89ee9e7582d9c44c583540aa82832d09cc096e00949f8e1ce35edbdf95331604d64110d61f46dc9f52c841a07b10e33dc67dd9a25faef39c9eeb701c39cae38f9ccd84ec7d2d897794a6e172907e64b287e0b7cef9a57ac4deda862cc215213acd21d0dd7259ee634232869506b0db9bea7345de9eb90b280b53cc23d57cf3eabe0432d5062253c9db53e11d5317187c86f725f4478368e2f41d4dd54c3e72135e86f33914a1ab23cdd57396ed553028350a3950add4bc30019754b47250744c6e6962453d06865cd854cceaa9ca7eb26709dd24a4e2a118f9680da6f1a7fc4c920a348cdbc43a21161f256dda7fa0fbff9e27f56f806403823a8de2bdcd6a77d08e74f3c1843fe11c9d958ca25d9521ac4ad461b3b3be22106973d0d439f0aae4e3800908d279395dc1ad9008b138962dacce90572cdcc41ccdbd96a5b5de3382ddaf951c7720f34d1e3b792d9054ac1d0da4df0158a3e5b3aaa277d4e3de52de7319778d72471d1b379a83e514e5b7ebc01d349d70029955f958a303506605a5d7d6bcdfd0389a6425db9beccafae4ae7eac5e27ff5756d9158d6b72b828081efb41dc7a71477a8cef2454c133ab2bc469a039d47159a941ef1573ebcb7f04666c0f734cd01b21f2ec9d4e4cce8e02c58c1a6e07f608a76dd11dd7803b3fa6bf3ed0c9402f32d8120c3f6646ceb454293b484a51d5deaacf79722f7a7eedb8cf9ee8264d4f97241261ec3ccf4a7e64fa070afee7dd2663b567455084c13d58be4e7cdeceb658ab5eb7e4575e4e5434e83d098afc293fcad89f2cc6a1ba53c441e48f940cb6211e8604915b5e6d869a41462418a7b2869314fb16f2cd2405291d45845f9fa9666070ca79a6c377418d4a36ed8cd23ba5aa5602c7d1fb7e060d8608200ddb1ee1a1d0b4748a9cc684ccb2450dbdf3c50c1946f4286184d8bb99c6b2e6f6df21ca4aaa4369d48fc1cc58cb7a997d1703f29a1e9a3a4c77e9999d84ef63f12eec118427e0ee572489cc7a851af96b540591fa3548b6a64cd2761df07f870bd60c51e3249cf327be22938778df74498fc9ea5ab39d3a997cd78ae13ae3976e52d63aafb04c0b89f556222d8f38f938ca856e0e23aca78ec01fa148cd0bd91702301679634b2a0fb64a64eabe2437fbc4aba08e8c9d2f839f4b10372b911aba1840bab2d7afdc6f80852b450948f234d0f80c0d62876caf69e730dfa8a46b49c94a92db439642f2aa9209bb82194b39a11b57750da38215f2eb48a7598ae9e0d5bf690865d8b692bc109b07e5104c7a98ae8982d5c8a6e887790ab2ba67201175c3524cf500b5a2d906b7d8a4085497773516ab50a0000df7838f81a6c9814dac5859efd087f0c94bd2c8791e7056641caf72eab597a600fb4eb15c3f85a679b8e370227633873ba1f1b96b040aaa3730ae1e3e76cd46ea3415e03b8c23b7c124bed0116f3e6a16364a051d5553b9bede0726b5b352177c71a59b99f7090dff2850a2eb5263d292b7c96683bf0e244231ac42e6c1dc61729c4f4c2be8647f8fd0a455cdf63d6a00276f002434b110d1218bac2f310ebedac12d9a12e6310dc21b2ed4e6ad60104fcc517091274e952c9ea83858fbd48cce056b22450d347da1cb4c80ec50869abf3a892b4a2344c209e374fbfa7e6e217f6ae43cd05c2cc1351751d8bd92a6b43d8975acb7e323d6a791638e6dd32f864d1b46bf5ea48207c6b1c981e5b1e9d2c1ffa9b1d90c21d57af296537ea2fb2aa096da8fd09772982b25d0967abb1feda34d09c504cba510876f50377e12cadb574ba501447b701a0dcf944455612984dc5c26142a439daa2ee43f70528c55e1c3462f428491280e34d7859ff103f3fd43a5110ad5b5c4f6e732c4929500a4e0204e4e387a095bfb506e616be9502eadd3811f9ab3547284a778f9d630d58324cebeb2128a945fab89f5b88203175ad0bf6e193d1827402c0ba48560b24405f42581132a5e499b2411d8dc17a151275520d0a28a61c5d86abd2ceb0eb70377e953c340d616c183cec0e944624a06b3759e86550c6717fb10dc5dbca1188e4689edd35ba6e17c97fe6a6a496ec8b810d186f8cbec7ffeab18f58fa161e62ca4e1ebc5b8c73e611bc625f95c51af0c88ae3bb5a037c907ea0c4160ead7cbb0e56e741637ea934940f46637686e18aa9afeb06c145f608cdfdf164329ad1f3109e0bcf0cda9a8c1565068d2c3a16e6607a6e9120b88a656b3759599a0a267e658d55470315ec2656e9063d554c84248440e751fe3f070a139f433953d9bef24e11f5753c8765d8c2a08ea4677c75dcab8a5bd12554de8f3c6cc1c1efb96d00f5c3bb09816854b4f648ff2192e05ea2c4a2bae4615efcb12ed67b93493d11a21f4ea9db8b287730e1284f8763a61fd8ad34e711e1c7776283ee49acc11049680308b237dd4d54e7267025a34e42aeaeebabe8b3957eb796de2808a9cc37cdcd6846b7aaf2e4d035697da175c28cb3039e5c6c19c86e93996bee421a2a67d0d6a767b90ae1eacf0905d5e6c8e7c7131732425d080aaa5a10a00480b0d75517c6ad1588938c6aa2d229ac377dfb1074b0c596100b59c3195e55e49f9c833518df9a533269f2b2eb4d3d88fec5b36802828088b650ce4a8d4410626b6d2e96b4a3e7e0ccaa1fd11966a975df49d9ccb11be1d695277051c1f54c14dbf7dd2fcdbbb60d26fde9609b78862e1d9dbb577a2d6931bc6a213492f9b4a0130946b4901396a58cdcd633930c9f88ac1cc7855c86ee235ade11bd9c5fbaa05b2cbd12a1d5dd3fed496793b325bf2fa48118f032e98ca7d3548fc90f3544635d5766c4657be37a2bc41d3e6817257f1ecc1823ab8b9e22808756434788cb186c5c3b64abc2fc197211c97460894f3aeec1eef0cc1054290359d98a001637a3f2cdc25cf7ac5f05fae5a11878bf4f4717b3bebdecacd925e95857764de181f95108d52dcf7ae3c8309669020734eb2c372ef21df6ec68eed31db6f8a351ab7f95c84398dc7f8b3626c4f004cb3a1d4e2b254e4a807ef0610ec8b099c8a27545e57146022206291df2210474339ad58a0101532d1757d16a8a7ded9760370a7b2888fce5f70d94a44da477a07d86556568277e01d1c24a458ff563418b6a5faf59d7c9e62f9b245c167beb5a2a8a16626aec453124a09f9e6ce0993ced93d08f7757394198938a00cb7c3299e75c46880820e23351e3395109644e1304c46c5d661ad105e2954cb7462ea00ddc76a9101dd748cbf3590ad4e6aff51545c4b6eea9e6e684cf3021ad42eb265a620fcd593aeab2988614827774b37c89b24ee5f97e5a103029cb7ebd4b94a085c138b20a031e1f08dc6581ccea4db9750d24751d092a00881a5b4caf770c5181c4110fbe4c5240841794c8c0cef2493e4b9bbe4be35d8f64ca4fc9bb839204ee44b7058035eb6584742dc47bf36b9de1625e4cf170147c768ff73ed0e26026865cee0675a9a7b70353000df263df23a08f1273db4b31df8a95e459bdc1481b181930b2c0243aeb0dbab931048f9166b82f4f2c0264b5a40bc6312c5a7fd4ad75aff1cb25568f62bddcb2aea60bcaf42a67856266e7d4725ef9ffa9463cf8578ef9d4baec3c4431d1d9fe82733a580a479068351c4af2966d4066d3d6b03a8cb5350073f96ed1a3f2a16468195018cdfd4b2b8e07cefbcadc6d7c52c9a44f69df2e7b985b423073bb02f051534923a081940b1b3ebc025c3671ac1a5f9227773e4878cf8d20b0d028a94ad0595e42d57235e19af81ef512855fb6d3409502ec25ba0ac302985daee5592dfe953c32da885ae07e0d0ec7efb4329279a4b25a244999085b8eb4409c8ef6fa552211de46f17edf326fef5344b28022a8c2110390bd9519fec17430271df681dc811dd118f48a8134c22bcc6effe49e1965a39465c8641641b2df61966352f2e3e74f883955d078ef65e2a908d350c3a7ebc7d4124fb79deeaf9784dcf27a2276c84a11789724f76a66f956a89239b9017bc71683ca2a593b6028bbab3c37bf2e11cbc5d5b32a084e16e6035ae6739eb74f365d9abaab9b98ddb4ea8c24976ed6df7e635929ded8ea2d82af3f8a36258820771f4592ce10e1e6cb9a44223c06a99cac9a4307ceb9a3cef5806da1fb9c575f5ca751f3dfb30f7aa445710bc3f22abff51e66ce1ac5ba6a981055bb542066af9a3618317dcb2776da3f4911d41bdedde3658d68791fd1d4a9801d04a81f644b8991bdbf0f9955c861f2b6c58b1e9fb39c6e35b318165722436ac9c68be56240b474e26b9ff8cfcdfefa48be864e23c0adb7782916757cd05881ab73f1f650df36018901838073806e07c708420334467f04710eda98ecc16d0eb027ec2ddacb4c1a5477ccb907f0b2c719bcdc6323b180e9eb2e39bbf19d2fef8167a00306800a652a3b01080369c2546d79e06fe028e4b97b45149d3c18153b649d43df9cfc74b4200c4f5ecdce2596e9c25c53885966cf637fbd2c1f19870b22ccc443a1f0efc7188748ec61092a8c8db62779ff70b24277ade38676e8a3a5c30859a293d4a5be2fd9363970b35268a232c3dc6992bd55b7ad5f4390bdde56516e1355ef179fe15da6162b98c4a6a6aedf5ac8c44d0902cf203332c704af1fb3ee41be46820227fe015831c3d22e484fcf6d38bfa9575e36412b84d4d82a8cdc4209f8a1a0f1c401ac47d83a65a1fe6b0bd8752491c61a2726918d8b02ce0dc053cb396b3c7e4dfa8c9b2b99827f0289a7fc0ad44c49045a7910b7b3e03df6e420ecf9544cb034da3a3cbf7008280a65fcdcefd04a632e80b93b4fe35a429e5ad791f5373e43af9beaf011a588175cf409d91be14b369409476dc604df51d2585839eba3832fc98f663929e0100d59edf24c1acec5ad046ec80946fdd1617d768822f2c8a655c678e338a761f85f29dd5ae340793e9f8d003ff9fa2f5cba2072aef710820a7baea8e0a7560030c701e12510982c7cf0590c6380607542953a9b1d4856c26cd7224e4f9c19c0ebd227aefb02ee66db545841b9e46a3607b912229c791b9a41ae17ec073d5c592188fc82af09aae5d7d3e487714a85ccf6ae4daa405aa60301161171ac209521b2aa123a4e59feb3f23abc461fd0ef02a10da412c76b7998e8cec5e8abd08a07071bc44eec0c53c68aae23b7c289c180ac9c697ca9f9135cc5887f0f9ba8893145467d7aec832bbc741fb02c5589014c38a4feebb769d8c5730e5268845242802d77594bb2bb6557ba362b6eef648137d51b40214ed5d5ead733c99c0bf6f0c7b312c02d0d62ce79e88dacb8a8cbd5e64de26c6325dcdb0ca42f71c17bf41d70a7f0cd33267b49ca7a48bc40bff81f6a2985e6587af0b86f9640348fd21d157a7a10f1fb8a6b7542bd03b719c8ecf4f57ba35507065ef9bb1d707729b3b0a46d782d391f47156603d7f08aa3cf3883d09b4e311881fad1e06ce3a150ccfc47227395ff80214378d681bf2c1511b4f7a01a9f5c2fd7389ab1caff10ae424507b75e7e95a83b07b0b4b93fa051e48ce8312507a47d3d62f3ff8612dbaa529682cac115af1874a193533ad22a60f3126ee6c17e4a505d26f07fef7f1acd6815360ab38f4f7a374b95afc09ba80aed58617476b0a535b845c13f298105216edb737d870c6a7f37ff0c9f13701251924c10272663d0283978d00634da9ebbd4acc1d8a20bd1a324ea623ae25afa2d52406833c67e9734910cb0bf3882ecbdfc86c81ce47c0366fc3ede48c88114ba6c76fc439c5485aecae365c9de62d77d61fd40116e0112636e540c90c031822035c47e104613caa34285c90e3d0b14652e390ecd38e1a94af82ddc07d13f4c860a44385953bebe51643806a16ace5d43b3d72e24f6c126fe9031136ccb3017831892067a53e0e88e8c6bdae0da06a06f13c59b4704a85628973a9b16522cf884647100278f678b9d0679fececcd576d61391f04bf78839e6042859271837e2e4455825cf1b9c105ac8d43d3d165bbf239e0107dec7fd6e9ecd20ad1557d3452a85568d2968fa3491a4030f0ef90eb8a34e17c4df69fca9a7060795cffcf5a5cfc5b4617c4bd79514eadff1871aa8474e266953fb53817bcee77682514852facb589019906b8e870bbc62b8c350a4d46ed550614a43625b02c40ebb14066ed30cca9f651fbeac760338821bb7a977b7c54f97a9e32b57d2ad0feac00b707e298fda3e6650149fd65119b33036dc718ceaf23566aff6904c3551d3fc193bbf4082c9314c8429c023ca19e2043867529a1f2e98e9b244e150b8568e1ae45f6cf5b144325b72a6861111ab3903e37879e060f5f67f88b5c4484dd162fc2a05182370ad0d094463fedf3f51702e2cf9a2379cf8f1103357098b3e984e92c42f813a9acb5f2140076c84314c5b383783bc17553417cee2a700456a0b66770c501ab4a63427cb7e99f296c09a8322fd1a7d7cc7fa34df50ff034f549ba5372e6ea76408f542b354eb0f0e2689f24f96bbdeff96d8508244b41d0fa6a62446dd2b7e1ec75a22371a6167ca6b66c3b5890eccbbeb255b4c554660b897b1a98686db84fd271baac2a14ccfefff541c66819a3a4686889cef325221f99c7ea59e7c36b92018716702fe2f909c98617acc3c18e9b8106120c652985e00acc36fa946d8703b0f4aba35ce2caa56709c09257efc925eaed6cc9c283ac3c712369bd338cc58ba08fb328bb46b67e74e0878dfe5ac82cd9e54cc30306c7258925aa7f5237d3d729b303d4afa799d717c22a09d9d1efe2cb78273d276f91d8cfba78d38fcb4ebf8d52c20811188daf8ff1c79a576190da947d736e0d6160e87102db4c8aa016ccff392b0df52ab645a15f6cc210465286bd4a5f9029b50cbb686f79fa5545ea7f3d18e61e594a5aa56203d99cbe86c57edaa20fae69af552d8a67b6fff4accfcf1dad99b0203808677a682406c5331e4ed916862856151023b93acbcc8867cf333e5ce8f2a52b1cb0e380e646b1cff78f5447cd003b0a0f01fc334d0523a82e40b543eae08a1a8a1ac836f9b53a9d3caef151cb6b35dcad4c686cc994bc641c237f09cb04e33d276b79a5c982e3726438c43b6c4b857161afd452f7853556bacaecdbec355f10f570286dcc730876798d59f138cd05920f680b5feed60757d50e25b435edc80ef485836ff6337037d09540a3757af938f12f140e086eb42041331465ac59be6fe5e5b2367d396f692270d0996c193296b87b268ae5623f28f6c79b4045afd9e8d54d5cd3496a529dc8f05f33f1e4858099b2e854e24a4311341cc10f5d190f2149f265a7891a3f2725096d8363504383677a5036ea8d2f31da5952a4dbb29b8923d76cd830c4fad417fd25b4de8ac12c6bc6d85320f1040501a5535eb772706c6dd6d631dc867caac94fbb9343aa1492df7bb237680d9880bdb01d99b128b8e449a73baa4cfc1b45f0ce75517aebdb31358eb0c6e778c94639f9102670878548e6fabafc29932ca5f928455ec5d7bf467dc45d5762464538e1ab27aff825a4ffa07df6716e2c0a320d5e5448d95a35c43b2b5d7ccd1192d8a1835605b8a1e3306e83b2c115a155e3842d23fe74830f928acb1e98b61cefcdcb783a1120553b675050d11750cfadd13bf5b601ea0f71f84a542d7d6b337502acddd7b4a33b05bf6724fec9af92a5ebf56d89291d99622b071394bc05c9d1ea4a0c61eff09441ae2a43ccbf4382dc9f8166529abf7c91d5e756252c541ea699fe1e0bd70b3bb938c9ad2ee86d50256b6effa9e221c75736b8c86772eb0fdc67d48dcddeb8ccd6bfd0d210bc2d9dd7552b8c75b30b201dcf5d60ba4ffe920cd4385087c91f1733df89339ae313f91847123919b36f45b4c1b817f789112940397852096ebcbe45f801a0c7b0bd718413e4fd2e200525658c5bf49b1404530cf3037efdbd43b70343f6585ac80e0d9bf12c26d4250852d21e3d27db342164dab1c90967b7f584d34c464fe9e2e911da123ad11386a4210246e189a4010c46af321488a1bdbc78d8484ab7bc7e03d5849fc726790482df13ba7b7222cba280ce2b5fd2068f2eb4e6933012ee4d6b3902153b874acb0a46def82344c360dfc72a5a1e0fb09b6c252c397353bc08fb6f3ad1ce43f323c9f25f69dfcdf4f00c06a64fbe38e94fe2ad6a32c0166d0830c59e40ac178dd863667c8d593da4c804d9c7e8d37d21126681becbe56de1cc15013a1e502b0c63deb08278cc38daf1dd1bf70078e2d3e59bef461cf21f3fc84a6effd4a1cdfc5fd9b6866bafe0f48afa90a1b09388cc169ca6e5ffdc050f195c812b03780ba101734003c409e992857be0c9cbcbc2ae575480e6d9ad334e847f6641ada5506fdeb9e225e10ee23fcdc572e6864e0161eef8f5248a29a801af8729639813b12f8a6d04785532144c3daac17eae820476c6100e9ea60eea31b373fd5e894f01b80defc24b6c45a37b9b81eb9aa918ac1b0f83266909a21bf6713ab982e6583c8362e2e853dbb5c7d2d8242f48ec6041f84f97614f0173424090fd0b24ba3a1acb49bac01b3627fa6dcc0c30c5e012ad424d8e6e07eed847cb99cb0f23652e350d105f7716a59450668c1893046e847b403f19d98ff5346207d13843ab27bcfa331c5acc6e174f52e960e664067779bbcaa8b47699336bb514d72f048dc04ab132b536bbe181fea7cb7cdc30e8c4c377b17c8baaaa85ffcc9ccb9d7792e7d06e3ddc484a0230dcbb5c4f89bf212b4eb721e694f17b8f6b43c5b81f815b6036e6d36b8487e30232e5e77f580f989d9988b8843ffb9fb8aab71e98829c26d2808b38993ed66802858636f4e13af5615367ea0c7312003a1af03e093780bf5f511e5719df5bb319cb5debee0278272c1460b069c115bf1b7c1412af8c5dd9d02bcecddf5d68c0401282ef71ca056f23d79c9dc354770194ac709a4a3346cdbb5e3dee121c6b95016a5a2ebdaadc7afd0f519b04027133b3ed3a258425cffd3d93b8f965c610b182a89a87efc04a2360f3e8e915d088442bfbd88977db16612eee5400f3ac543c28460813d2b3f98c7ccfd9565f7c11d29f10151916523039766eebcc19f3f59f5be411027183a1aa9431a4e0f88f8054a198355f1becc27b02ad6b599bb6ee66776b81807368edb64e3038f68da68b4ead5cf2e565fda4b13b91003af528f62ac10c34ee57bb803133ce04a3091a02c3c84cc0e0b915d1127207e29f1cf1634bde55452b2088311bca41c306f53eb608b919ca510ac3b1a909dbb8b3fff5745556e51750579b30ce90eabee6497ff402d641d2e40becc2856bd2b9937528f235c275ef147520c670e400d069243d91fd589d732d0405dc9554ead18b49ba7ec944f87629c486e0616c681e028a03efb2ba762a76eef2d4e67d17abf15bbd03d6fa25cd2a9b13bda55fb4cff8d69cd6b32d82067f19da5d3641072bf83c18da031c3cc0778f8e2aee0970a77f2cf7e0ce5721f25a44479db6e820baf11c384a35760fcba5f25d791d49e94073a75a610e431904b88f00f50882fbd8bf06e51277be9873063430890486d48c39f9c1d02de6538908bada4d5ae7e56eca04740b2ae4c84cbfbe2b4b668c1a01341f024a80ed4a5b505a15a50d39c504355366f199948ea23885f50c9668723cbbd251e5cc8584ceabe00a25cf6c362eab2e6e0d5a55b67b608062089c64c6423555970abadf88a838f5ae51c30362b14516510ffd2a43fb4d6493c84d24b2bb7bd30e6c049e04c20436b896f92f68728c8854234452915a0ccd45ce9f9c5dd49ff3ab7ddbe489b49339d11b8a7632a159c96d2feaa28ae8f3c117bee15a1c976ec0cf5bd0b5175b283f396b179a26c827e55ba4bc8e9759f12c344d90fc3a5e46f42a9a46c7cba8c8e2d3eedbac3eed66363c6d7eaca075bd9d411909cb6af8e793b2822261c876dbbaec0e5e37281ff31af06450321264996fcf176915da3d1a9f0c03226fce880d3740173bedcd1d790e7b3080f0b497a14883a31124c1cc2343086f0fa39c7f0fc6f75e7c8f44720d39ab38f8ae6d031b6622cc88bcc5fd36ba698683cb788c4e678cd5cd56774824820ce373e9c13a27df424dff06f431af445f6882dc7711deab6f408f1f8e94f4589e0dc209cdef49096b9554d62a2b29abf516a5d37dcb04441cd0b25e4a6b2ba6d75f5f7dd259ab6a5e4bab29a7b6de927252907503ca488f4593228c7a624c69bdf0521a4bd8b510466c5575ce29e7b4b2d6789abd41c818669713190a49028f5d3976684d2ed4d8477dbd3531c125ecf311872da6af6c060989ac3f27528b01bfc235d02d7392874bd75b78cbac463643939ef6dec4b0f94f7bb4caff7c26a552425861098adeabf4edc99d5aca39a1db1fed6635eb8510c20927fe146c5515d229259d77ce89b17d6bbf82e6db0987c8d9db8cfd5e7e2f4e7043b5ee70777fdbc35a6b2da85a90b515044ac282acb5d6da7fb8e292ad1ea4dd067d6a0581fe56f75a7bef5b9d92b10b5b6b2f080402555012950402a8aa2a0afaeac7a65f6d37841e3e76f5b4c2409fefc56f2fabaaeeb5aa7b2d7661cbaadee4abafac1bd238e0be6f62dd6befc5185fd7c51883beaa2a7a2f06b29f4fce39672266548c70910b95301deefe26183204f58319d8f8c18d0f144693ef1588101922c48f2142a8605b1f29ac87517d777deebdaecf65bd756ce5e7fa5c178cb884c37e0d6ee380df82f8635e65dfd2fe2caeb2dc44f64f72c4de5b21c1c8c6ae52ccc397e2d2fbbe17ab187e9886cfad744e8284276cac3d7fc52e092aecd85512537862576f73a5f6f9bb360c6cadfa80b04a4f2e2e55d775522bb56acd6e7faadb9662fa57576f7d573b3fb6db17cd2eed36e643c56e1dc24614c51345f15f78957e3276fe96dc84def54de87128a4571ecb7ceb184a0565b3a7b5314fce0fc5256bafe352fe7cdec60bf1e76d57e4083451fb36c11f89ddbf8e987cd529d8bbcada6b551ffcf9bb9d10546a63176b0dbb54e7cfa88c69b6db0951a2091b6f25d96e57c40850d8f42d7633fe9cccbb5d11233cb1e9db4b0317c8e482f087d65b41d704c34c40f7deebb2f7de14f7047f7ed614f7edcf473bebdeb729a5d785d116f0b02841bef7b15c2f5c38841551e728cdce519d726d55297598629c5280e9bed2af9afea42e535da5acc17921046fad9faba7150eb8b34ec9f8da6955d7d7bfbe7eb53eae3ead324f76db2971d3c416d1f0767e9a7c8a12f3223600caf5d7d7e7725d55b6e5d835bb9664f75357f7dd475caab47533916b71ef78b6abaa3cadd729753a5aab55bdf5ae9ace55576bb5eadbea2c2bab545e45d8dc05e84cd80b6b856e9f28b203ae6bfcaae357f2e54b2d0add87f960f9928c6449deeecd56522a2584904629212542b33717fb59e83f5dfa7b8ca116d83c9989218490cab7733a3a350f4f7b3e03596e4096f723e937b8014f06673b6024b8015f38e02cef7dd84f04fbbdf42032920db896b7c3147ae4b4d99b13512bfb4e7830ca272c5eecf7db8a9c85eb6eac5bd97c465f4a64b4ec36abea134af8f213e528bfbed4a59861ad22d7f45a92614662df08be40c059de27d9ef371214b6b3c27eff00d7f2fe866b91414672e369ef311fb20d1b5ee460287c3884676f2e8afd1ed2e7ea7b2fc405218ed8f3dfdbbe3f6b0128c90e9758829043ae11216f23a723041222a89f7b95952c060c13b27b98cde9b28799e8e1743038b89cadc3db381c8a1d71d0a16ef939ccfdf684710cbe6f1c2e8a2876cc82c84113e5d304f1d7a1c177ef2285dd1d88cdb1ddcc2c003f3e8f80a5d13192d1f1321ff0286482a4d050778e9d63bb8f6e01d67daef8723055e790811c3b071c34c776b814c56e61e30abb425f46a41a310320c001eec3fa06c8c2e369b092318f3aeac283d3f88ea78968763fcef7de93fe64b6c392bccd4851c004f93e0dba6d460c84fecfb3f8b419a416c4b7e3f178a6bbe10d39ecf05c248cd5e501b7d7a326d63ccdc7a301dfba94d5d65a6bad94c65adf5a6badb556167b3c0d42b13914faf1781a7cf854bf9e07059c793b3e2fc89b4301c57371f16843737e64a763e231edecba9d8e0965ca79808ee96402b29d8ea9663b13101b6fa763a2d98e8047dfb3ec2fa967af5691e83d0743add9082c243f67d91ad430fcc576f0dfcc8c3f25acbf00a4909fc3253f226f2a2a2ba4183566bcb84c10eb48f0c58180663b1d1d40f6cb763a3fa4b6755cb2f15c66c418f1448ffdbe864391f63bc9c5e5580109978385d47e5fe321b17fbf8fe160e0b6f2785e129450a2081326ba5d11267450224e3dae18a37b8c1e9fe83d27d3f7ec629f33c619618c32468ff2212e418ff4cedf28a55f69e51801a3bd8576b2dba34d33774397cf1963ac2a95d1b2ac65552fbb8aa841581d358561a12cdf39d4761cc83231f881d66893a025c0019e4b7e571fe793c1878ee338f46db6917ae83b7d8aeaa13487441a8d34ed5f34034d94866674e6ed4b3f17b6dc1d6bfab6d22d2a8128facef1475cc2d8e7c2f1c82681a0f69c3990657ead398b44ff9a361a45257bfec47e9340e890a7cd0f69aa93536bce22d1bfa68d46dbccd9f37186049ce48817f6491561222c58b2e963222c70c2c634a33bf00ca5b1ae0a9770cdf8ad09f6b9b0090863ec628cf1a4a04bcfc7f446af7e17c6d87d17068152a0a05cdc8299bd552ac09ad24b48ddba4d10c294e505f8ee8b4a26866fa312ecb6c30ec82173a38d430ae35c22c24a90e16f195a5978d6a9b4a8d9ba2aece2dd5b2f819ed2bf35484fa381827c7f239dc87a6b0d3567faf97c3e1ff328a59f9c93cceaa2689761a13225ca5b2b89b522ed322e740bed3029887a234aa16b5c92c5d4a1bd4ba43090f67dc17741185ba26757fd40263530c9e40221210454df0a973e353ef6b9db8c629a5d4e647a820f5d6267577f3056d6bc18e05ae6a35caa53bc057ad0bb5d99bcc9bb6d750a0dcf6dbb628926ec7a23ba4179abe29ec4d18c94894b01ae09d96fee09a1dfbc07ed37ffc0ca6f0e8293dfdc0530fce630d8307ef39bdfdc072e7e7320fce6426eb88ea37678760072c2c9a9f11ddb4d355e53e3364a70526e8627efeccc9e9a9ad90359660d64c93a86cffae1e03c9c87f37620cb7c3d9065c29a9d9db7e35e53536b6a7626dc812c13f64096f9383b383b383b3bbae618b4db5105cea5fe5481d366cddb812f15b553513bf35f0f7ca1a9d4eb49bd9ed4eba9812f1485aa41d5a06a70e00b3d9d704e38279c3d1feec017ba03e1cece9e0f7be0cb4c411f0e26fffc87d333610fecd95906172fe4b6706ec73168dff461475454ce343b81018676216d85a660b8e0452d8626c3c7bcb8610ee593b7d5fc95af2a19429614a9884e422193d7d5044e9b9fe913ecf9a819ecc943d260229f585a8d5826263aa7f8ac2d3d813c6d3e48cfd7b3e669f3353d61d0d3859e2fb40ea2ad3d0cad8368c3f815ad8368af3ca67510edff4ceb20dad9575a07d106d9d8ecd8449b1e9c8bf6f3e78c8361897586c0b9c0f8f973878389e167ac354f209ccbcacf9f2607f3e2e74f153897ece74f1738977f39236d204b8d8381e1e74f1b07a35fb463338b702ea09fd2c1b8f8297920cb7c51ce39def36a6af6ac3adb7b5f126aad24d626b13789c549ec95c4cecb42fba6299f21732e4345fba6945294542a95aaae088542a154dc0b97688b98035f280a9583ca41e5ecf9a719f8424dd206becc13cf89e7c43333434d33534e69939a2f73e0cb44491ef8324f2edac0179a722cf35139a81c54ce16e52c796acd34355f9e5268df2643a87c4a906233b3a2d2024abc8248d36460d1301ca0a05818876f160fe3619cc40063c58aabf236c5e4a668dfa1172ba7d3e904c3052917c6e13be5adcaa5ba9a5668df263064ba9a9ee69ee8b79c0190b9c7830613d955f28ab72c2ed5ff573f0b16208cc337cadb16976ad05b5cb20ffab800b56811c2387c8bdea6b82ab4ef79822f1525caf994d5d3a5ba456da1b315f20c79ab50a4f6fcaac773d9ea129ae7b2553daa9af9d58e0ac55ce22eb504aecd9f9504ae9ac0b5cc6fa1abc9b5f915957f8a72ce6fb38ae6699347a966158a6a860ad9e7bb50c1387cab785be9556be05ae6db4a753da29e50906b8f141ed5948287ad9f900986d94a5d0a8be1b6187571be054948aa413a39c93e781ac9d3886b99a1b72737d7fa1597aaadbf8d422626b5d66ca29e36ff444ff434ff8230df16f4b6630cbba1266aa2266adaf33f5695822ff5345333b5ffd2156bd326a289ed36095ccb49881a2406f534c49e4fb37adaf33fb8f29842de26aaf2d8f3276a1a91a26b73f6561151bd781008c2ba95ad3a79f59bfb0112560001d86e63d1121b55db39293c1dc8421a59d936d2b47fd1c8079741e95b4f25fc410a3bf2401f7c06e9c365bc278d469af6af13757c90d4f2c8035f68cd5487ea501daa4391b817a94375e08b0402a50f9f4122e132de8bb690abb01f75628bb204a2b39f44626fd2875cf2c312f6469558b287e06414c1e9b89619509d132852a9b6a23287b2a45a0ccdb2e40fd7e2b8247fb89657dfe29b1dfd299dd24cda3cedbd0e7ca1447096f74650024dc2e3da396da349ecf7124891fdfe5122b88cf74ee420a149a043844087407564903749757ee0cff5246cf656d12063eeeed5491309d54a77762d32d4bc4aeb0f36ba751d8eea631e0ef6e9c7bcb90b283e303d762def4550679761882cbaa1d0cbd95b4889ec60721332dcae084e137b3e7cd485f115803304c6874b49885b49aeb62b8283da95ac605555959cd7c6c39e598d8ece3985b0ef3d0d8c60c7856f071fb529ff7e942564f7f006fe25172d58a8a4ac4011a9487112320161f973e16badaad229237c37f063de7b306382cd7492557d5b225186d57b3bf8c0a384488f144da4522929638b91f6953e199dbb6c2d52b8ab34e67db6d50de1abf41d8b9307e38a9311b37f1a8c99b6e98721aeac38edff35389d8200072719b3f25eb06b847348355aa5f896045f6cd8802f375c8b83f5524bbf3a5e3de95fdac948eddb7232766aefe1b675f3f9aabdc78e97b91ed3343a5ee6fa07dd4d19d7d43893efa00ec6a5696f4e032b454fca9aa59c9287685da758f92996fc944a4af7397dc619e743e8526aef61ef68c6c8aa2eab0a7eaa164373298358c10b2c106e32597ce5909cbdf9f5b14fcfe07a9f81282050a8f836274b581b2f94a3a2b382723c970dcf657e7cf9bc7b6ae303389628851a7c01fdfbd7b411696343de8b9b4059356272264c4d60b566a953eae44738ce63813b066089377328432861bd55feca57559da2593fda7120cbfb4bbf93dbc059de9b88e040dc06aebdbf2107fb3d911d42d88f07560d4e27223ff6e654a0369e0b8cf6b1f801424a2db450baffa63e4cb6aae857d423a5558a252774a7d42975890d20afe0811c4b3a50d50a4935ab2aca5955b172277820c713f13db0290db54e1e3ab0e97b759f6bcbb1825d1f42f798122b8fd1b2248455156315530ae02fdf2b5adfab62b6d19945602b0c22b2c826db53c69d9c5a2bbf567c7f817b166e06b77119efddbbaf6af98ee7bb4b49a65fbd755195363e83077132de7b90fdbcb20ebe256e63fd2a1dffdec7a513023cfa281ccdc0de5639630650611faf24a90609b3277e43023b6e7d34d243e79452da702859ab472d86267d56afe3651ce7d128ddca55e002f2e9ac247ed737a0bf380a99d2f8d661f9b69dff6cf419a729803fc631cb4d64cb5e0cfb98274b9685a120bfd84e2705355bea7ce488dbf6e4620dd23441b0fcf288c396d7c0b5f8e9942da812f2b17e22311d3f6bc779daa341ae70cc2e2732b5212f596fb1102342767cabe2c4dac16347c65b498e6f3107310cc3b047df618f3a2771894bd563782bc951668ea3c2e9a36076071e52a4c97b98fc3d951ce35f5c8a37e4f0b4f7aeb32caee304f8c78f568cd5db5535010a5c17684efaf46d8a1bebc3ca666fde8308ed73f8de8c260ee445fdb6ad3456af799a0fafa966742097e2527d3a758a4fe94ee9cf38a7fb74777fea3e8f78da734933fff1b49891f8e9693b2fc99bfff01fcf055af7d621a7bd790f54541ccc8b70bb008a8074a5e460e65f98c6d602512f9c0d29df8fa08df73b5ccaa1523484c88f4a3921a4da4f4f7b514e29b5185a554157f1055ccb2b5da05654cae955cd625681a7bd1d3630e960bf1fd83c41b1768fc6e63bb08115f06470e6181037c01737c206ae6dae83192fc2b53c07e244de9c920a5c007fae3c626faec48a8359713070db97f281cae6de19aec7bfc18f8bf51b0cdbc5707f733e00fde68080fde68498fce690fc6f0194d3a8240d5a286a0a158d0400401100e3154000200c0c08c4c170482810865d6f0714800f6d8c4a6c409b0a64c22487811004419031c6180308018018008c4186868a373ceb889ab62e7f4f3c07477f6c2aeeb7cc32c893a3036b6c62352f04bca0129a77ef0cabf71f802d43394a46efbe749a06bc366826e0d686f21a2b406e1d3ccab70c3c151127c916cf3b8d4825ca1bb11fae046b392cf563366a5db455117661bac5b6ac3ddd3dbaa744009e24489406c87c29e2229b1283235c40cdbf00d95df90ed7001157b4011121876bfabc3ad98811cbb04d5bb0065327b485d198a4e5a9b24185871c0f8e930ae5a2097228a321e8c082d6436a0d0bfdfa0e041b1a9bce2e31462c78e425bfe1e8bd545aa1144f1db7159ff8983626d49337a1a090b2813bad3483e8002fcf8ce3b4e833705d26778b037caa71058d0e33118419c4fd922cf84dfa1163cbc9ad25ce4a15f6780033b133f4f598c2067db1f9358004f6a8e88f09b2627092807604c9e7fc7fc67b5d3be0b696a4d9d708ffef83bda27b3df82a9f60fd03c83a7cb24fabea80e999ce1502998adf61969f98fa9459011cc4a9e24c66cd572f4da29975db435cc4a94422e732b3c0b12ae69ee21d98e5e50ecc14082ff08c3328410ca6f2ed42d7c1dcd650dd25c2dc64e40de4605d86681afaa6fa0bed45f1ed026b274ab37a169c80a1a1049e50f189e75dea84ba4487e2f31a21e07bc0e19281957bcb20d71117ab83c644eea086d73e3f4e754a04f037c5c425a20a4158405e43660eb97e3d5c0149f24554e2b379c70a88a4ff0370a9f5b9e4b1529ec921b0551f503a485a0db694e2ac3d20fe91bb6239be4fb544204ed92f204dc0997b80b4e569a689cef3a963931a7f4efd3ea0d9d83a019314f9011081135c9348bfcf6d907a7b05a2b37cfed4074d5ae5ddb3e1f49c4a0ccb2bdff94bf1c40c1a82b6841f53ff7f4eb138b8a07054ae1b9d829f1db0329764bec06c334e1b5f6dfb9a9446877912a220cf18a8ee39eddeab0fbd1c37547dadaf80fe88652ec950e42aa20d7a72c4e70b65295c9e86f8fed0f0a20534203608a21fe93ffbd436e35b150e431ced0ba822272813d595b30dcf3bd3e9f6ed4381c6149421bf37dd148cace07d2c66a5a82cd51eb5ecd07216a4d85187bb23be0c6926cabe8f80caffd7a7af5af062e93b237901e02b60fb756c5addbe3bea6d8c1e2e95d5f1a1e08ef0824fc40e140d13e78c4a7329ac513e017adc30904607ea2dc5ad315f11daa130e4faaa7fee644c59a19ca17151a913a49d9fe7de933822722d90848c38bab2475bb50941c661c08f6d0bbf73831697b0636339951060e22625d483ea343ce33868322d16ce53d9d596e100c661b8a51923d8236aa45f2688d8d4ec98a8b7d8689caaf837f8781e36fa7387c79099991bf66138d5ee4018a73b6ec84280ebb08f8d6a5f17eca4d1b1f08ce44368e829bde845eac8bdc7497bcb20af037bea923a621aedb60d95c19deae399e99cd6c1dd64997d661c0706b43b1433dbc4cd0cdbff3c2173ae084b7b010bc7118aa108b039dd5b61b695779873c0b8e5319b8ed65c36a00637f123246314e5cedff23659eb47dc9684c868164733f1f96e84d211a88a66d6c7d5ac6db0972be4cf9384dc20b43e738a3e769d0764304be9db95861325240ffe5a01e73c0416d8b53580cd977fd010ea93c427776f1a71fe86c7f9db27d6ba38e30b449c376a3814a5cc0a9f72d1d322f8c9a1439cc418b2d34ada2ea969ff29fd3ec6a84556caa597862a43a5b47439d1b15745715baed5a4708aa1dd5f62532ecf8e22f05bbaac09279982720ca2252fd4d3777ae479ce1da694fe75fb8f98c07a8c3528566869df9b9e5f8c6197d42293a3c305b1da24ba1ab842516b480016070d0c2296024bf3c60b52fc377766c088959cf70db764a2bef9cab5ebd663ab646cc73c8d18cfa647029ad8a7bb51439f039f50efbe1db43533f01f9fe09bf60e90fdcb795e7f3e9bb1743c023d47e9f4afe8c8f12a0cbb5a2c556f3f09dba8370d18c83db9eebcd8b881de6acd0c1c6c3453a7cac00c3526b138e9683351f00d87c1f71ec4b967c181686348bc346138dad3f27edb4d1bd2f267748e6acc96514c5a61743e926e1e933a62bc438ff37dec10bd15c15c6f0d92238c3b3ddf412474c4f1042b6b55e6a0e111f58a8ee214bd96ebcd93f191b5b0fb4ab3a2fd0e813e28a1e94ae822131f2dd48ff6b017579a49405d9d2d4309f845e161714b681b1c37b507cb1332bf3113588fa8f71999fa8b903fb3aedaf66dc0d845f27114eada909106ace09a6b1579704ba14f3c326d9f2e33a0277b2c9ed0755db45635fba783c1c9d432356bf11bd80136c0ae7ed67e1f95f0c4530179ab126305c3957b51b16fa70afe4786c066465f59ff707396e508aeb5b30493036b031f7f125ac0f9658b86e0019cf34078e109192a2a43f3bc64e00db846f7f41651f1a582273625c643f6f292d0a70091c0b923f81ffa14cf83d3187e52bc5419cf8922b2fb1fd72363eebb7486aba1f1fd9b2f7a7d3f96ee746df7486f4b73bce5664083b7df7bd396cd44989559293f2a0734cc3d77804613c828180efbac6f0e69b2adf797fe64710043ce58535fba064bd5c980a5f2c7a750b155149322c6eb361d2957486aa1e94b7044d5510898881ad0228519ba8b808057b38f9e2aa09af7e3d82140ff7de5a56f3379c91a62b5c3e53512a1d3ca26e2aabc21dcee7c2b68935e993b2500784ab651afccdc1ef90f31b3a7c400058e5bf36be02d07f250dcf102bc52fa921377338c048420e4416e40a7f83a7373a2f2ec0205bef7d0b663ececdcd9ae78db71f886757c41f482152d0fb1ce383961c435e035101b998782a7fb2b310463894b02315f1dcce191795f026986d08ff9d415d2dea7223dcedfc0a27dbeabdb9310fb8bb11f9788b43b5c187889705c826a34d8be826b99c1f0ad1b05c155fa63d4d853185abfa69f7907f0979954a83d2d589d73f8980379058cc71be7c2ebbc5f6a183eb5565646e0453dd386a6bcb74ccbfa7b052355b9077e1ed2b58f156fb455691b3693923fe31f365b932b2d847449a3d89c0f589a16eb476cc9de8c09311fc40f988ac8c6d7a87aa8319d41734106a6921bb207363fd9f77057f39052e9f0846ba34e5d37a455e836fa964c1894aa3043ca2041b2f71523648b7283c7ad32a1ca1d010630db6d975063bfbafcae09261544cd3bcb0a4314cce609f42060c052c2141e1d6ac7b1da40549fbf893d07ef27a3285b355e2e1c78cfb8cfc1fbf368538e0d73b567a0e9f1323f244178dcfe53c46a906ed029758c18a6bc5343829c7b354af4cdc9c212e76cb19f871a3432a06f4d47e3406ad98299b60a238ccca64829a9aa0a66d0fd834112a00c0bfdd4efab4c10112121832f79cbf614886e9ff5df8435598dfadb3c551ab4122cb80f250ec86b7517b445fc5b4945eae6ba08a64545370a6e25ee7aa4c51c19c68340ab610cfaca404b4f5b4aa0a032e46d641f36a6233eb0df827c1b9d78904b482096cd9c747ea3a03a1e1ec89613b572fb8ef406704971250f932b8a89d32fe8834f89c22a31745a177ff0eab68eb8154f77a23f4d8f492b5194685237f3e8824cdb901ccb0ca719e40d849ab0bca44c9a8aedbea6b0d480fa23e5d0e8101cd7b06cac46c3e47899dcb8c5d48ea10a9716ec876b848b53615aedbb78caac651c5c80713b9597ec14911516a5701741f2f3a541a8e6799e13f931c159a382fcc914fd5b3160f31ff247d4989a20b8517f0ba342744c17cb4f567e68138e736d0462a1979cb8744398e2f5d81b1a28555847e2661a030e4afe5691480f364ff3992abf4bfcc3fde743c11e35a4cb241f721257437ccd0f05d151bc1becffb0e372723d358448a4ab4eddedd598048aa5893143a122b00a28a6deca0de8023bba1ec1184fd846448ade72335bd62e80f4ffd6f28cc1cb3740fb5a199238ddc09ee424d6b10f4fa9a2f5ab923c927f9c3b3b2b32ffc45418c04b41c5733c61e67b3549697bf3591c67a73e03c6361045427f4acb495433e06889880086e4baf9b44f54b6775a574f68b3ab9189091da6ce59843b416c636e15ce52eedc79afa5778723158ab00447b2d9011bab3a4ceb2e156420c85b7cca6a804640b318f8ca5bedc2ea9959de2710bb67f37dd36078e7be747ff41cd143273818c4d9004b6e15a8d8f513e2621a8729177eb58dd03bcfe7eeb346cc3f20c9cf762df8afcc32afcbfd38aeac00d6bac789f9745d7a12b79bc2cd0986cc6e5a2e8db8a9b143b2898fcced2b83e3c5ca4fad55098207553c0b1f6cce25b0d102fb3ab1b1d339062b090b36a46b22aa1082902057474d86f398c9e49cbff79037a39d398b2d290db17b27911bd880e047eeb49c6f3bddce26510e50a76647b4ce67b897082fb8964ad672455198e9e0ff9a147e29fb1aa88c825e88c40d3a5646d49dae200a24f9e1c37523349d592e7ed226dd8cce74b31a4420d410af150471a475ccb1e244b3767e0d28d0b1f5db56ef34847ba9bb1b035cd6b607e518dfac5fc84160369bfab727af3b19d3a2055959f4271b11f464570441f28c09907862ff087556d78e49758c0fa663c008f9707dfb250c00c3c8c47c77fd920885b1b3638a036e6700e4db1320de0f5aab859c5cbf18b4b77d90c7c53c31760b7c142ef9f1c08768f3768c3520cb8659b7c82734881a73d7e2db4ecd6f611e21196d6098fee9584065e8a3dacd81a0a95ba39553f2ba99aa5e111ab7975a30a066d2203a08076863ec77e65792f2dbcb713185a718bde649c107d178d777d3d78230eb6fcdb205a56cc0b4ea91f86d4361790d13ee3ee647cbe113f23f6083c20cbc6df6a2a464a4b868e469f313d1b4793874903ccb86ae5e593cc6744f5f6920b20f71d6834997eb1d9cc2c89c11444bec61de0c7dc710cefe6909369de4a8a0e43d578d08e7b628c84ddeaf99884b682ed9607d6ea5267e92f1c4273af73ebf119c3cc4d4f010de64180962566c1663ef7c322eb567da0f96e1ed12f243110e1f90bddd08c0d8750e45d37613718171b7e7061730f66c10b64798e1055422065e3a33b791e7d624e5432d21601fc81f61791f027bc0fd10a0a4ac6b3a8809d196261188039169cf35eaaab489284d7cd1ecb14cc19806345c308f532022dc237ad8a7b3bc126f06fb25f2b99348e6aec6183a2c97ceefaa6496d971fff5f2b1940939bf46b06a2cc455e255f9c48ecffeaa87c67480d42541db3c4fcb47136e9c179263c5d0980be2283993c928a05a495c44cc6449338592b5741f6f3c9344156ff1c791d55d766c4724d807e591cb6da38d1cb70366dc4733c91231fbe08a134dd97b36b706d204d45e3252930d636f0789a5148a1679f80a8dbc4f08d926c58964c7e5385c0ac95b63c9196ef1b1c65724aa7bf9e983012a64ee8816cd2f4ab27e5926f392bdf145eac6b5f9d1a8751647f927ea7b2bcb79bd3071b71c13347eb1c09ad8693d6c865dd88fe8cee09d6dd88b7ce38ff246f870049b7c5b5af8c8251b62370088fd8f208d15f9e090ed8e2e822fe037087709c320d8003ffabfed9fa68c2cec12302df112af47fa053844034d811add844d2f7c6614cca61e303173b59eb96dadc3db381bd824464569a69398fe99537bb57f4320fcb6e00747c2c752860fc251701398d37b3e9e8b2918f06583f6bb7bf43d9644706bbb794d40c675b1d6e73e6bd347fd4489ff9c844154c8a63748e0db0b177aededf5629e7b7a6b984ddb319eb83f852c1328ff80bba0fbfa40ce2ecd0d10f80c0c3f31484386b08fe0893d1ffe7dfde3440ea44df8caf88f99fc802349caaa7863b7f11031042a930c0cc11f244de108c559033e0c8cfc4ec7a3af8209f305cb2144ab66316f8e8595659002040b2fd6eb629b051d86645666ccac6866f2bebaefd86a096b3edad27012bda6ebc5d62a6afbfd6540ada5e235721510e34825a8f72d67e23836cf36f505c011f3b5747e1ffb4ed4846d230ec82ec6ba274a11e7180ae1ac3f0173efabb17b86105c52f05ae0e2470208b9ccf444e0e952791956e3ee33ebf1032fd13bf7fba73b0cf57a7757f1f84133f004d229bfdc63b81996839f5b302492eda84056a01a8649f81400d0070e618dd062ca6e15e15b425c2ed0f6b7c16a1c35e8f45f529b0b65695c7a781131d86357924f45ad0ba70c89f5bf9c9de118258d112775b87601a33294b007a28dc4d10f217ce233a90230f72ee3661766054eb2b4e891a13f1e211bea653749d67e4e1e916cabbb19f21961c2c8b77aae9172b0df7e2c96e59cbc70579e442cef270b281a34ea4dcc4d7a6e6dfe7f694c447b6c777e8fddae9f45da0ee07068835c4bba751e8dff57e3c399c13d7f7099fb3f1f6c9f49ee71f6df7279381f9c48822e72d8a11e3930fbc05a27e1c2a9aa952853e5ce6cc520bd4bc1071e821274803a3ff7e04823ba2bd4ef97c4119ced7a551522f3cf6ebe918bea12d05f80763e16e18e15b1812f2348637dd3e6cbb5551d8e43ab12507967561afa534d5093263f612ee03c1ca0ccdca97331b45bfa78135669d4f56efb6d6c5d1f0a2b28437888225c2f2e8d3f320aae8f1715cb7d8957cf8a6f0ccbe7accea70b08f4f3b86a23ccbbd29cbb34086fdbabd0b1c5159a515972c3ed1b33f8557e21a89bc15a9cf05f4a86b47892d7ef40316ed426cde968e788caed2171098f8eccd818b7fffff4644ba0005dcecf0c1c0b19eeac201b42283ba00b1b0e11cbc58b1d462b0f82c92098ae6b1c0025bd567c878eb6d627b7c0182002149e173561d0fd346103366ed8d2442f8229a16f9978876537c37588efb28a4f35bc355a5241bdc69c0699caea0a793227b41548c91d697a505cc29cc258fe06e79713483a94b7579e9606607faac010654efa8b2638f65af4a0af25c43d556e61eccb60f4b775d5e6f2836d6c4e23d33919cdb31270d50792c2de48a4e49cd60c376031e6d3214935f1654e2d48bdc3c05a1f19fbe7656cd4538a944a6651c5f03944de7034f76d96046119e5afcc09373ad7bff9c5bea1e7413c26cb86db3113c048f40f3383c695020950a7394d8276c917157e14db269b110bca63b2a53f16d46efc227ea41706b1115b9766058cdc8fcda5907b1ecc03cd85fc15ad95c357d33cd4a6c9ba7da08d37c280e2d73831e9d75b233cff7071e6e17dbb8a6999029f861aae3bad64edc143a553f8a93e2521d547faa2e1a3a4ec0050dbd03129b27e8216e2170f92acab6f40d55e578916230449616379ff48e93ba2097755bb7ecb55168d02df29ead7dc46400c48673598654c4c2ddffc8be8017b83a264cef84a9e36eb874dd59ccd28ccbe4d8382a8840add548c9ed8464c2a78a82d1d8de07fd504282bf02539faf085d487ea7668085aea8e97342809c3c7dc3d974b4d1eff23cccefa5d06d13eed781079a79581273f7d4b7ac3936cf5e6c66cf005586924c86b43f6f25c7e947a13e154625a11051ad6a0df5f87275cc406b502a5a73d7042258c72f1a105136e51c99d9c2d99a2370298263188f1724406d380a6c12dcb1454785cd67cb5804f07d407f0b66e46f99145eaf37ef114600df27abf703f0ddf2249190f1240b81c48bd7bc7f1da8c82368d810d70e3d5ff3778e21b4711ee3fa5403b214235a663cbb43d0d4581f06b8137aa2029433a3a2483101a708d5922c10b7941755fc67073d64c7f0ad49a4fb42af9242d05196651cd0c8020ec54c40a19330400a199bf867665a14e8bf3c903fe1c672920dcd3c08bb512ac50fe6b0174bf0ff0abe4e3201ac707c619f344d652db3104f3206ab99d6f9cb3808b840651e233381ba9915a7e560f09cdbbc2ec153453ecae8ddd478c2f3166db0facfe5c5511a5956445e756046504bad261c07571cc2e221f50660f84c15193000dd4ce367953668d453aa385921966293a14dc63e0d5a7be42fa549df57f7680c1d110ca435c558b48702dbc83ba44096ead39b5c2f2b77df54d29f88e214b1b3eadbe3dad7cff04af8d0ec031ce0e24bee0132f8e31c1c2d3bc86801180d474c45a4acadfd8e828b17ce6ccb95d8590cfc2b5cca6abc290b2b895776ecae31d9f082a440380a8589dbf21c53498c97ca4409cd8a780a1460244aec8d4215a42a8db6242a80af43b9944db18b5074f11ac54da65824a8f4d16a59605e5c90e1e4ce393fec98dc6ee49f214d638c6147c7c181803fe1c4382526bd6582734d264434176f0fbbd67d22f5f76b74300794ee4fbb0b506f0439aa65bf83b4d0abea59f338d22f809658ab12af9587e4a765e34692f79234c64223806e0e95ef42e149eb15de4ba434cef498b8dd3babe925120fb4f1812a27342c9f76d192885a29bfd164230eca0ec6c04b4dbd6d43857d6a0255b5009201abaf38c09e2b6cb05c4c0ad4a87f53587fac32f19a66ef9841e42d195ed08ca0d931c4c563ecfbf5ba0396a35123b4f29f6c6bcf92deb17813b6011dbc21567eccfba2a53c5e378bd42f33149d69dfaaee0384377726aa0bd87f266dd41b5c9322db62842d30780021855e9638255d979579c765efc104254a9bbf04d1a8a2d1249aca311e20aaef558e5dc6ecdf249988e94a8c8a15827f012151d940a2f1723f16fc6394cca2f420fb27c004a10d129c659e82910058b8ca75cf65863df217665e00ee3052af4effed34ce36a3638d7b7d45b1c1c0a8063f0bdd196194589957147fdcaf41e19b704e88bbca560e6c0a2c3c51148c184a49ac0d87a1229be9bf5801bd57aee47289e78751391f40b74689b9b8e7064d2c4bc337d43f316a9069d5ae65d35041f3d4918845a048c4226182d38dbe05d9c0db78a6772e9cfbcc4b946f578acdbcaaeac0c8bf89e8e355f68c9230610be001b5ebb082eb6e1890e350d45d5868c047a52a6bd338bdec1a41b0f30da0f29087730e8dc2b35c17436d4c97660bbb41481f6aaf0845be71b1603a702c1a7fcb2706ec3a5bd2cb7ad85b7eb7eb39f280d2e7fc1ca497e03a0b63cc9f81a6aea6569128bdc2969a99db0d06a5900ef05b5ec459ef5f3b3d9b5395f219c051fe28b09a86ea992341c7e7d0ce58938ab091ee37b2dc331029b5567bc4ad1e9d139ba1b43ee93fa011650a0a0363d2c6cd0a989bb2056f44bb5de4ead30875a6eec662ec85fb93020d82cdc135a00775769fe8e0e6365234a9c7e37a1df9891a7d838802dffb3c4bcef6e6167ce93e4280ae49cc9bef5983d9bffa43037ebca40b072ffa50810a7814e473b2b6f63d151736a9f9b63f856109e74fd254b863361db2b279437b7c9f5be594f3458eeb9bc3308b66b98f8539cc3a801bc88cc54863eee84a847b046dcfb5ddfb04f76c206eac0ab0cf071e01e9d049433fa23f4c5667d2cae9304763d52063eab41df92b04618a48e957b291a72d21e793eb282a32c32f416242c606ff3046d1a3603ab3c5db715fdb138f1172936e7970a240e4562c1ba186ebf677f35b0214b1b96ef5d7a0f940b38efe025b7bce767c89fa45e05f04b80fa594b2817a7c4dc636fb709cf59b1ab8e1b6068264b5019b21dc76a4c34d0d28be8ec949c5d7824e46f7812ea852a9463618b380c4262949c689afd35dbc5d48949a3a6d72dc98d258181e2347a4822d93b2ce23c944c99ce26a8ec2d23ca25590717809ce943fd4d8a164e19d739492782b6f80a31bccd0bbe3f88b22cf108c5922ee1ee087c057c55725088fe3e73fb6fb152d3581100c14f32614554c69a6a47cc326c11c902149ead27c98dbdadf14ee513345a00849b93181c9a7a7bc4178dab5a97607d962f8cbb0b8b848b270e53b84cd3f1ade4f13daf224361464988de08430cbf16bcf48f0428deb12d31fadd5a3a80904c874a910e4a302550e2b22cb4dd8439f7998470a58b07d758b56c6f25122521f32433370c74b5fd402844279ea1149a65aa5e4cfd8c55048a4b91cbbede05e60aad7fb5a2e069def983afc61467b55e15051c237a1e41b207a618eeecb8f26c248449c56fbbcc871811975aaac57554645eea191b82df5991b5441c4c4234ba4e6a4604fb682b127b49ed46228ff78dc8035c3a71ba87c7947947780630dcd5b59641e3ba4a67803d1191463dd7346f518a077a8c290b9c7821b49233f83ec48f5fe1816c31d839c32bd37ca906945c443c0b358647f9abb779a8d0439eadc95f8cf2e1ee772671c814f0714e9c04ddae173fc7326e9797c42c93eb0f7b7603b6688fabad86680770a4ddd154de100f8dd7d005a361f64f590e671e1e1e6c1a5eb06778970c0da71acbae2c32960f4850fc361027a2a1683fd8c0342682aaf7354af709717b97411089268a0224285ad14eb60b3e2575ebaae0e6b39eef47cf0867c2f3bb1f288a417e722c102a6ee69bdc612cc34ae50444546a1feb8d4312feb81f5170067da4c0a6602e0ca1d3a32a91ca9e4247403242a14718e19b9531410a961f52ea04283ef1312f7116ef3769c5622ee205917b74e963dc75ef34db98db726b3d0c292a50388083174ef261c8ad0ce7ce702fa8f9cc6596b810df4c5e7c198c867312ebedbb4c07c22a4e8f565607328c20fc8b00533e2af267e93cc0d8d6de3a639961d2a7d0a0f5201a3dd578378c0985a6dd73228bc2ee09d46a2dca9def2bdfb12d414488deecc65e9c27eab1da3f8254c31c1004091d900ec3057c3153765c1c43590247cebda1c4717b009343e32da4c89c134f8153ab3df8ed10f030acc4d56e961532a8470b55400cf20068bbaaf5632c4114245aca0ce203a9b416e427575c0b6c8183c4209846c486f63d3f7900090443afb6dbfd5355c48764fd07176e7f0d8dce8636f03fa03ab04ac0a054bc26850497c4b601e1d889ad76bbd27630a914a4c43f7742fefc2f0ad5cb1e93caf1cd324d2a17135cfe360b57411036b6f6c9054951680941a90d95c070caa52ea64556e8324bfda4970c5de48604acbd1f3c73b6975002e3fb757847cc4507d8888df3eb24755bd64ca9c755be3dfce99bb8f7ef5c1cd5af786a163ca146be3b154ce807e77db1e43fb09da87653f11fc5dca7974807a819bd7bd6d45f5caf602b84f82a7b233a3b5739040e3d5cfb5090914661db9a96eb4d584c9bf2f570e1098abd7cc142b679d8790be0277d4d2c9b26bcc4f30ed516750e180cb6279b919b75cf56122a74dfc98a6b1de782ec3856baae08452ba7d23cba17937fd58b7d40039346f83927ed802150757c245e5f25ac167f7ea239c06896c7ab5b11121b06c4c4d32803094d4d5ca4ed57a5684c3119e5ee7ffa48c2c4734274cc116344d90edaf5a3c07fd48d808c1a61f9650429121796b049e735e16385375597df28fc4c54726137af58d2ad9bc403669ef0d55bca87952f13821f71f5853b8ea2d984b76b6d9d4610e8571e40a66493daf581e78c7c21c4e6bb1755cfc51bb1f6345b4833c10d127aaa897b8ed7ca349e79821074ba88700ab49ccc59c76d38d4845af4d5d4ca084c58146535846e96ed071d208c8871161ec4089abd1f27ab48fadb2df76683d79b564822a2b04d162b39de19dafef42a12475d43ca72c42821c10712dc788643d73bcee71175191d01eac2551dc0f52b489278ad8de395be3f6b9d78e68ada487e6b14a1ee143528d44edc57eb881b79c2a7691bfaac26f6825630449058b52571b8a599eaa9ac34b1ac412f8d351423856a89f723ade9dab383c1de5bf93a7f2508cd1d9adece7cde64ef179d759ceb4a5301d7e22e06c205ec89f945dbc5d0b9aee8cc48344a43dcbe2386a6ad65fb01d9f6c964ddacde71356fcb745412a58b2c5f2253607fc53bca00727906b17a3771f879cbc6db2e150e08620aa4d02b5723a3dcb213da62c55da46226a1128373ae7b391ade590b2486cc308bbeae73593e6e63d6d6dad535126aaa1d268838b44f2cb2780c4b2f54ed6db7c1c9457d0da34c2059cb2e2729586c1fbeedb34c234eb7559614aa215c2a63cda0fc99bc275d39590dc6e8c2670554e49c861166c9b99361a0d358456569f8efa10ff52a72c229e5ceffd4c51577bd1b30f994c9c3023c2c2fb620389e7ae1264c758cdb0573a7d8200526e37381e016092314a88f6ec188220d380c32577e1ac499f945f8194097212d800c060328194ec6ed66ebf27f910af889ac4d6fe492b6cafe95305c430d85d29c38c1f65f7ee8941673f39981cf6a27455780a811045e7ce44a029f8c93bbd5b2cd26975995df3382ed2717c993ca1c7854a703fd74d937b0b38028740bb54e273690c9f90311147aad506f3b9d182ef3270563139422246ef70daba1d93358ac50f4aca492adc11e09abd0a48be88e249e946b54c3919636be54241229b08e18917a33868f42f405c7c5e10c7fbe00837ea73ce3705f94b0189d9d280f580838c14746e28a0d350210dfda3f7eda8d395099798df9c38b5df9554a5174bbbf3ae036a01c2c892fe5d59f1f72da94f8f5b717b8fd4b3c98c1ab5869421f7a573f2bf145e6ccdff0465770d236ea52e2bf671b6d59f2668231567a037bd425bfe8003fee661efef2a41c247891688a43071be4ca0c44388a8eecd78eacb8eaba49bca04e05dd0f41df8e7393612033588ae338d13e4f80536b0559236b7606db3022e552f5d4afe27f24cd4103a1849f3f3fdc81ea90ee012a218c9ff49d72a3691cc4bcd1f8e1dfae4770b9b0a25eeead38cf3b7261a9af44b89c6f7b11b8d9a5ee08c50c8cc940dce6dca0b56f0091ea60c091a88e8bbe4bbab21221a8f1981f1641ee216cd361e7ddd8f60bd5a2e503a3d0086d583bd76177d0d4a3404b35e6604793b71a2ba924e543782d64e6853455e1be6253ae9caa71490f98e96bc9e8b1bab77460602a3067fa907c182d6d54104881f5c68b203b2f2082301863169bc1b60f88e945a721a255803d4ecd13411af58c45f377c0b7da53e578ee1f9c6a2af820da589d15eeab56ed20f3a4acfb43547ea8f0fb5acfbb01cefdc417e0dfdbe91839786a760b0035065e4a31c730ecf766f455bbf666ec2a083fd8b10c3500856306ad916d64cb365cf8c1dcdf70fcf4e3f887ffdbccb15e6d45b02c22de847ae2b69878c31c7cb8cffcd8f44852bf397bd00859a83e47e8bd440247a72a7484e02fe9f1494fe2cf1ca021c3c4e01f7f1da4e11e014a22bc849194dee1a8bf64f9f41bfba24cd7926be60253096d699f9829c858a1c886b12925e649607b2758d9af60a412083498b4ffb0b3a751228a10c0ff48d3413653751d1eab6e4f51030c4796e404ddbf6c227432359a4f8b58506d239f8f843955429e82ce6d69fe123ffbd7e9996a598c2358e1b503e0051fd024ee86ce78bcdc84f80f0d82b8b96cdf44968662095f7091579d0a99710c10e5e42d1e3d51f031b343504f6e8bab35273c7c2425ae8b596a899238e062fcc1d993508f4ad5a87a6c439ffe836b7bb1bebc797c91a3ffbc06c30e8f5caa221bcf866731f3aa1d6f96ef8b070c358d69e308c6d0b8525f418b7ecc60c36d06396b07d7c205919cb33084cf95931d222ed7aca250a6c768a7cb0324de10b2a0c44908f4d7412d1882b4ed00695b1d36ce56c52b301377f967f29aef7690af7c6be74402d670f96cd37fb526cc9656340007db472f8d8478c388250c5bdf9f7ec3665d23eab78acbe8b9c812d18b4243866ba0286d6012288f1f7885a43791d206874648aaa78189c16ff07148341e12c7fe6a962736835090b849569b1019a0a7d569d978f304a1d0909b2359eb15fb91cf27932d2bc8da820db5da6f374b0c2d349584a3857bb90671a6fd01f0d77f673442493b54651e53f5c0470559cd7764b827dbe8f2c0776356262986c46ce2756a58e646e71e9736ef344803f304d026807d412c583026e4a7cddfa33f6a58dcd527f130502726d2add09f53ec20bfc4afed58f4af89ec685182ce7b581dd6500d36ab8817d066e81ff87e205382c6337a67254aa45efb9a626317144735f8ae110f493446d1353265e8699c821c73bfcbf41a6d2dbcbfb3c5bb9fe9c1ecb745e20be2a9c074159f43f1ff10edf9b98c5ae58abf1bc87b6f9d1e0130774dc484231d68dc8135246e11111e1541da664c9b0e92c2d7095b9a0e6830ce630416792dc87fee6f8e125771dd2b4998fa1c773eed2cc0ffa15798eb0ef59fedd8a51efa85188d22b22ecd9c5503c51dd7913d4424d2bf82d9037ae83962be5a6c588155796366e0f07f085221e57134fd591c6ffd7234c07493adcadb793e5470197c0d167ce0757664040374f65e34298716ec78c71042654260239bb2152562e21e70fe917397db20c65c23944989d8aacc9812a168b457cd40cfe718b7e45fa6984f277ab739e8c241a2c698228a8f1f2b73c1ab111267be65cbb10fa2dcd073594896c96239e26041610e1559d8ea070944073099580d9de4e18ed705928d5a1e49db585f04acac3c75b8540fe93ce46d8065fb4d92562a8cfef54c4652a44f988149e82452351645f245e610758e00664d1856ccf10af5baaae296ee6e68c8ecdcb8a56a2102fc18fa8a5d77144381925084c8065bddf1df12667d5dd8ff157c61c722117179d748cc341228c96b94a85cf280742e398707d34a812cf093171e25900e6d57881cd90b20b080e09161581c35c4bf57f5deaf3d02867f296809a211c76d9142d43dd297eb33012e59741a3386f7dea106162dcc5d8a641534e6ecce5f98ae889d1c4fa5db53883862342f40cb207a3a7701f9956ad16d2490c91ab1fb45024e12de63e9a9b96105d49ee109aa9f6de0aa006fd12909203b8396ca3eab13aaa6416c3d24fa77dee93126ced603220eb08ec83ab9bf5f05b1f4f177084a86085a8fa109f381af96f5d45371ec77d5a113b63b9165c9b123da4309c8565115b5ae002f61ec9e7e1f6698204a8204d74d90ed26c7be4544bd766150f061f816adca1ef95b158ee1ac3ea372c62be6993db0c5a33d104741308c09e3c33c5ba4e958f7878f3790ab435b3016e4f66a64b2f54c2552c05b22e848ec4341e078b4c3c473e6cbd587e28adbd5565cf4bdd57dcb3356f0660c958c61a330baf02a193733afc4c50862bc8ada4cce5dcfc23d8274421006593f8b308ae64323f6a3acb9f8ab229b1ae64dc24c5c0805dd46a8c7eee3534db20e780e7bcd1d00c570399038b0c933c04f0360242bd5f7057b4da878b6913eb417139275e8267a013e1568ea21ccba77f7003de3b6aba80a49b98a63961b2831a81624103ce20b6b985bed2875424abc416c0c9f0ef06c85222bfe478eadd6f1fbc6c4f23a824861108f589b9765b26500e87db1e4fd7137c794d76f86c14201b194da9cc73cfb1ccd2c9775ddfd5299560134a191cc0fb2603a13d1aa350b2c11e90d3c49b6015e40bde0e0cd296efe443bf097efe1204080aef5fc675e89b0447a647f113086d92c368e1763eaebff1a0d26e346f1f5900f25b8425ba3fdadb1c3bbb252bae8694742c014dd4e7bedb09dfb748a6611a1181b3890a1f11ff1524491c928d5c02fa6e9bd17c34c80e1b0043d13d02f869f74956884bebbe4031a7dd362dfe4448a64de96c8c7844961cfae80f1e52b3e1d930da057763a1eb46b3421fb35e4f09d4958fc111ffd368bfa63e10d59761ee94272dd1878075020b017ec52d5b017ec351a303e2a167d15d486348f72c2d1087683e7d7e52402cd8b046a43d0532e7f9f9ae5503daaa70fd9758e6b8b0147d17bebb8014f880f1dd6f41560c422a327bd10636edc096da433247d26117f0599e86b020962d2c35fcac47c374bc5a0ae06300cc610b2db265013d932bf194cf64a0cbde1a7a9653d5f985395d16b96db8f1cb5b3b6cbb3d9f335f5ebfa2170a057c6476903c3953312a8499e65e6bf55e7c2a75e9ded541bdcf19653ce9935a7a9f9972e55f11d3e71eba664cf8d9bc3f768295293f7e7143ef2eb24e6656eaaf53ad2484407fe974a3356d3382b0d68aaddb437b23338573425e3c94dca8b47c242ba9dd402c22f712c08c54674feece5dea7421a498e9ec4937f54d60ac7126efac65b7284bd297549dadd1839123e474c29d4424b1052cad4baaa4cbaa2971fbda19d3d18b5eb6c23cd93a9cfab399d0ab039dae39c3f7f299602a93b25d9230c2eee7aa39d91a76bf80a572e661f3b87be529ded59fb32483ee97c6edccf44918c477ccebd5e31dd72f308f211b6e21685b0a1ea560a1391ed2127b3c4f63583c17c1eddbc3cda3451a48002fa0cb2e32a3f30d58309afd375d298548b30da6801250cdb82bc926c69b6994b50e50f1054191efb1843a54e32df24ce9d7afa2fc4bd6ff015fc671677b4fe77f4113b5a988f870eb6650401050a847bb7efe4330a2ec7e5973aeaa632d21b11474921a2bd4f836a6f474607a3fcdbc20bde9fe6c509d28f8ad21f73b1e0a9ef6dd6643ddc84bdcc0c3017163892f91eaa7d37217a02f040a27e0e594436b541b516cfa434566e1075d988016b958ccacb70adcd6514babcefd5880e4aa20c291dbdf6f603b247995f524b66aae22d467b7793cd504ca1415fd04428d9e3f6d001522b0d9b761815e393fcda1463693999622e8ac9002370f2155d472f617612524b8b3929c0dd21b551c777719f6c7c9fd241ac91ed2906f29f825fa45874a8801b524ee428960d59225b5599a2c725bce4810a8ea28b41fbb66d13eb7a32420648091d41d14f4d62d90da44324973dbeee1e1abebb4f0d00a10d3af309fdd3fe4e4847f68cdb4644ec86e10f7f2dc64a7ee4445856752a1c43d6daac15a7fb130246a827261606381b43c81bf2a7a389bf837839527f9922ef5f39899b6e907618b780a6277d4bee5b3e0e8b1ec62b1761e2cf6814f6385ec53ebc915e34e40f8d5ac4d1a1a58766361fb37220fc24a4f1a1a5c9f75a4de6a39e56925ebd7f3da6a38300d9b313dad5ade83dd2ae6ec02adf835e85483b5224f66b7c25efac203b062d115e2eaa70abb4e2a0f991dbe1dc7a91880c08a243c699eebb47c7fcb8846f00ef031a2c99d0e87b90737675c4ebc9e27560bf3819602f619d06cf693ff24fa92639298ecf537f51032a8053a1611a651e2af074ddd8fab9f0191f64cce9409ae808033414da46da62389fc708bf15f0a066e8390379d2e21786328695587c2899f1858bce7781adcd77940a19091944850474404a1415940f3d8108f8face2ef22b42bbc7b7a9b46415f888e2aac114d4d79fa317a5e6020bb4004944312191279ffd935ff5a86aeae40ef191e91176bae7993fa10e0dc6898585a71024f0c9168f80d9ae940bc54ec89163a5ce02f19491860bbbd8843769a8bde3861190487da85f41f8abf5625bfea049c4207d553ae114a575f97341ba9b7be28658ce7c1351b238588cf82c70b4e1fd1742c3c9d0684130619c81e93ba34f34b42763dcb1957765c3e03369bb8764c2a6ae64ab9f472b6e66636f1240c3307963acf819dc91173cce1c45350ebc21e2e8aec2550edace2102f6f9ba8dc5a4a240538c0badce0514581aa308d6d4aabd4400662f29e3740bf4db90f81559722ec0588ae7b8c7968851df89bcc0569ec6e3e7ada8c1b734929e7fe0467711513636a9fe9567516712ccf17a7c9fe2216d35b2f69ddc879e9ededab83706402c5acd1d190323fa3cd2dff3a889d5b0f02d9b950a801954bb02ea5bc2795820d855693af915f34d0ed387460acb8585a001dc3f6488f7934dae9c26dfb2d230f044011e3590fbe29f0d4030fafaed3adcfefe9b2ea64d4dd702237cf98d548267b313fa7b79befc65eb6fabb68d9a88d052237bef2d03d9075d07ce0739c8da97ca4003b9848a4ca2d2d9ae03dfada440d4095cf9f695d40a0882281408822b9eb59d65016bf66e675592265e5e969bd7dd9ae5077edf497bcd1fb8d28228f9258190d1b80213985045169678e890052074ab7377cb325d71c5115660748422c4d082229aeee04150fe17085281cee65b5d4686cefb420b983a218a2546cbfb4353c7e57d59248da6cecb1be61df3de797feadcf765125307bf67de34ef9af72593a933e32dbe5b6f1aefcb28a6cecd7b86b78d37ce9b863700de97574c9d1ade97594c9d9cf78df765d3d4015f17f2be8bee0079bf9b936e59e8af7b773bffb4629e764f330057e65316008cf25c99438d2743551baecc286b83b6857655b09e2bb3cad663539900aecc294e009b4a1bc09559d50d80c3472bf6862bf38a7743c7a201cbe6736566f97cbc185cbe32c700f3b705d88d57e6d57d38e53482de17274fbb2d1e01aecc2d21014e2edfcf95d905f513d214c17a775732b35470a05250a8f470e5f8ba400f2a29095c390a092281d40beac3b192f96525876a0bedc2a8e8b832c3b0e85861f1b41b9302ba32c7c4006281812286a7dd1d150e57e69d55a7f274eea728e3f293c13244b06a82ccea2c05b832dfa5002d37c6876325f365e5e0821201cbd32e5e055d99f14b106b85c44ccb876325f30c8c0e2fd8091a17035c9969620c0053f3eeae64ae39408c8cd7dd8ef12670e508e49eae902620f315cdf8876325f38cbbe3d7d3ae18c3e3ca2c621e177bda6dc9ec70656ecdec80691c0157661a340898f1b4ebe3423e6868b6e86209b9bb2da45d9bfbe9983901d8e6460a6abceef615125023c3d3eecd4c8f2bf3cd8c1e325a42ccf0b43b038d02aecc33880a98f1d540f4b46ba3660157661bad0588610f5a9e76716430e0ca8c4383012d1723d0f0b44bc38c065c9969a8d1001a6117353ced0240e4e1ca0c001b1e6ad878daada1e5802b730d370eb00187b8f1b49b43e30157e69c191e7073246ed480c095f9860d086c61c3d32e68f3e188c00b8ed76911b0d11444c6f1baaba3b34c37c3c675de079e42944a4ab5c21263d5e2c27a818991f9c53334353266882d1a356c6e6a8037fa26bb173dc81d8fa75d1fb742174ac013f0083cf7145e2091fb83801743e4fe1eb0fa42eecf016117b93f1e5c8c90fb6b40d883dc1f03be1ae4fe16d0ca3d851584c8fd29000443eeaf87ea07b93f04b4c820f7b7c36a88dc1f8f2e8a727f3b322eb690fb439a400b16b9bf036027727f06582191fbd3610a5c8820f7179455c10a790c597e05b83645159a90fb9381c93d45157098c93d45155600c492a2638b2ae48ea50a096c0105520f5b1481a3850c3fde17045045615c0d21b368e083734f4185a31b68b818408c2a04b0f2440f8b1236b854724fd18424773c0178e7f2b0ac73e50821bcebf2af950d99f5accdf96f7cfb8d9c1b356a0c40f36ee822703b43e0767ec0edec80db9987dbb901b733036ee705dcce0ab89d7bdcce09b8330bdd9911703bef703bf3b89d77dcce13b83d1ee07636c0edacc3ed1c743be7703b17e076c6e17606ba9d75dcce396e6709dc1e71dcce3fb733016ee7f176ceb7b3cfed7cc3ed3c80db5900b773cfed6cc3edcc733b07e07696b99d7bb83dbaaecc6dbac9c8d840a41eb45be33b57bb8c8bd4c3757a38906b9424c302af80052a7021d72889a3c08350e0473efef8eb1a256d13f80526f0231f25402383f7462b47ac6106006464140868a8c1a1b1313303beb91905820edb3c8761a82193c330d088c92810b460c497192c242007af8c7bd725039161810adc9e376a5a68563984321303b3dc957cfca2ca3ddc54ee4f4646e6864025774d513121cce905e4380afc38ea045fee9af6709fb9bd07bca2ad6c0212b83d6f70f865e3b1badc3575e172d7b4e553dcf21796c1c6d058b2154c55535465a264e885148b5727fc0282f09593b31c57f3c88c35c9af1b346bed66b5cc23e26122400912452f2bd58b76d50b0e54ab17d54afc0dc29777d58b17365181054d5f2815e5d70da167c3a963431b53582fb4deaa562c031b765d3a220aadd73c950ebc50e5852f3ae69257ad49342dc114e508a52d3425c9af9e82cb86143b905f301d910455e8a9848859bba7228217aabcf02b1d84afbaf254d5326d4ad08e28c2344dd3340da394524a69d530ad0bd6064644d142925a6ba55c300226842b180981054cb5663f59599b82480b986358f3e9ba688b1e3544f812b97e911e779f49e9edb1cb9c615cb515b514cadbaf4e8d522cf4407ff68952ee6cb5dc69d826b1ec5bb5db0776dc96dd6edccd9e5d1a3e9cbea14749114a10048360973a60cfb06f57669be6e91c85239ad82cd3589acd3aace3366b33db988661dfbfef62c7ada4ac5995a0e536cd76588759387c9fd5b4d76aadb4dca65969b59417a7c6acb5d6269124bf4e799b5996d9ce6131e6819c1da0d267dd6d1bc35e2ffaac6a745a6b3bbfb2fe9c147fde8766f75583d4776eb93151fb2a115e47fb90bd36e885fc76e9e757bf5dedf4aba2a8bdfb4c2ff3e6372390b85c3838a2f8af5661a8dd20d434f1db618edefbe321470f9fb69c085f9e0fe53e10254a7e35175e56aa7622801b99de644a6b9aa679b4d3534caf9a224e13423a5f54ab7b206bf827297c7997c915bf7a08769cb2ced9248a1d2c8f86d2240a5580818820340561ec6e5926b216624ba660d282cada3405d315b9d64f8796b38f4767a10927241d4142055c308dddad7a6a73866db5b3cb1457aaa4eba9c3a24d710e62a6a75894d2a60586248aa4248922050539070f294760db462b0e54c4719d865ebd86bd0e7b7debc86efbd617c9b2fb2a92e5acab41341d341ca4e2202c1cb063580cb64e62143c358f3d9d40b07940f0fb9ae7fb3caf793cafeb9aa7eb38ae79386edb9a67dbac6d1e6b9bc7f2685a96354f966158f36058df64afd5d2e6f94e3f9bc7e36e7968df503a9b677a77f64dd63754f60d9df22a52b7cdc33fb464efd672c71e84db2c6abbe5501c26e28561188661185a7b4ff73524d377f70544a638c8066edbb66d28d4c6a15028d4c66dddf5b31f460ac3300cc3303c9d408628140a8542a1c2300ce9e9cd5e43f23deccba1293ecd18473a9a2048d83d9dfebe63180dafd2615372f8ced29cd139b97bde766c37fbef2584e8f61235c9fde59053b2ddba13a91bfea1256f14079b89d46720883df620f6b4ab5d67ffce62229b15a13c4ae5a22ef6cea7a2dc7d13e21786e93bdafdd4bd9bdea78328d7bb64281de661efbacd039966465d862963ea411c69a31044630a376d514a84665957bbe1a039eab977dcbd0c10657a6b33fc438ba559ea767b766b5f94a6408c1482944aa552a9542a952a954aa552a9d48fb8c6d43d90c2216d49954aa552a9543fe21a555b28a4993e29a57c7f409dbb6d5edcbd1751931c4437c83c0b872dd30bd1f20f94285f21dc2ea764fae1e0b2036853a64c09030e1b7e59a4d4e78774f431853dd04c63120b875cb352177090e5ed174b594a89012d6727caf3c301cc19ce302b87ecf4990e3fc85c2f44cb19c59e54992a35e830d94c197c678e3b91ed2f2032f8dd12e9291949e52ff0dc3bf0725b7c180672e7301083dc7610bc2fece07d2886023111fa1d7ac43e1c20f6d309c33cfc7d860f77a07010a80f118d28ec5d9f751241fcda91c1dbd3e927ac9b64300891edafef3fd08cc401d43b733b50a80b4134a2b010a9871813a1f788c829b98a2364d91afe95a8a754f051cb88c221405d88300cc3300cc3108542a15028d48fb846d43d80c2216dcd300cc3300c7fc4358638b422a43b73ce09ce2e041289e769ed042f6864fc256691026d0303da4676159817944c0ceb7d1f3f9ae754f3196fbd3f334a629af66d1b0c14a47b9fa9ddbf139384afe6e2bb2e67ddef3017e9fee5b6ae511258e3628d1ff948e333ae5152872f03ffc8c799c75ca4a38fadd75ca3242b9e46fc918f33b8fc5b44fb75c145b61c8601fc766d9601d6a071d40964fcb7fb76b52c030fa12d998bd47a87676ecf1b1a0632775acffe63eaa09ebd75c3c8ae17b0560b0fa12df10ecd56f6194675c8143d1c4269392194d6d2dc651c076edbcb8ad3ecbd45b40f6584d06a9ff5f1c5c4645f77edeb0f07f6e19039b86d208eee1a9885bb1d467e38640e8231a8cb097a27103caa2b456029a50cb4427bb285c115f95657e64f7e38b695a45e4b91212db7593899571ecc07838552d6aebcc75d560b6bf5ce5d8643e6daed8ce2503131f7993666d3de8591e587343305164f727f4858a3026ac3c28aac21dd18ef322e9c82cab72258ee33b3eeb86ddb4299235a40cffb50dfb61dad3e73e5d81243951833ef420f5f39ce90814ab5e0772a0f2573b7c75c20a6988560d478dc8c4605d4bd72acb940d056769afb0d41c1cab7bddc77a92e86b75d8f25e6cb21738c772aef7489f44df6956f48df646f3921860cfbc409e66e7fb940a8a8e021458c1072b755b619de8605135965bbacb3b05c99592df8cb2133cb3b176fbbe1637c3886ac1471a1f972c8bcf2aeb9cd7620056256b01d42db0532c51f7d937d061684406457195224f5a332a0209617cf637d3beb85e5e23263b90bd2742d33cfdc1ef1ed31465d79c9a21e53f7e565151438593e3bf367571f8e15c86d2b9f0f161f2ef6fb34cb6d9b64610253eedc31645350c343425ca4b5c80ef02133837d608df7bd00497e49137444acc9f384a6138a27b39a651acdc2dbd88783b336b01f13942a9050a4431561a8dde994e258b815efe48228f965a3080b2c8ed00226412d40aa2e40d28442f5e4cd06a0c58ce3388e8322a90465b697524d7616ab9b05b7efd2d971d672d6a2ec59271668cffa6cb769dbf65dfb770b1434c5ec9b0f11aa8042c18fe3388ee3be5d8e66d409fc3ebbc5269bd80b5eeb4e53e84f07cdb53b8137f74d96bd450a952b47d505a2adeca9bb83b6b2cbcf870856e59d4a154d647b69965f6e2a888842d6be1c5d85dca1b66f7ef2035f4419e8cb31732bb178f6524ef45027f00bbdefa35de7626956b93d56edfbe8ecba8f66ca945f3d053be7e6cdcb85942714089e4ea8d3c9cb49a7d76831eb70f5826a9d7ebdf6524e02f8002d41f16e7891587e6239015aa7032d663a4000751d90380062eac82624132368eebe4bb39d3adbbf0fecc0203ad873ff30fae1f8386e0575fa40ee6167b10fc767b5bac2711cd77520e6bccfda6db3a8d307721cc7711cc7711ccb954a662b7b27514b082bf6811225e5776d9779dfb5ef2facb9cb6ab40e0fe2d459c014b3c6b1d76ecdd7bb3577dfd540d409a45d065a478ea0874c1d7934c54c22914846d034a79e758ba967aa67aa7f2b5836e99b4c264141c1ae5c0a3ee4a175241148a60fba2393d0bb724944eb782167cf8600312ff540f0d34e5b58395db9c4143d2c9348254b487d57fbe77da90c4ab90b4a2c1ee1bd0b85f7be87e043fcf0de5f218b87f7ef49dc87c27b58e83b8887bc7f38f4c29c85b0476efc0ebeb2b89fb6ea89c6f0b238ec8350780f0f85b45589c6f7080621a78c491c9e7d63bfb02a6daf3b7035a161895692fb6ac92f54e6b473df7a671edd364f77ae489683cc572be5b09100042979fbdcbefd5524eb70a284f2892872fda69dbc1bbefbf71eb9ee7b8ff01f3662c4e3be83b8694bbe47162739cce2111e7c8ff020369264c4881ee0432c91d0563d884f5bf33d4eaac94f2589701e8576151e1dd117cea703cc128cbea98f59124e3a2f97eba7039dd247383b6835b959d23a8370b9c3ac1cba6bd7d1e12c73f835ff83b69dbbdb278e0d2b3d31451d5a964ffaa67e5e2ccfa3a227e88e1deba5927cd23c5aae97452f5984c4089924d7375d62462122ccf0d014ab58af72040645d20285ec2708e827a8d63a2bad35abb36dc8548cc0cb2d850e5a905fed248a13356caab5d65ae79c73ce39e704aad507a8e27c4ca19de2ccf9c97985d55a252596dc4b544041a909e342a74416842f9a9c14810a3c50a29282706a35cb5eb3ac52ade7a747abb5d65a6bd5324ce585248ac014250b2665f80cabf5263683052a6900235c4d71aae457731576a6396032ad27caf5062884f206a6509e8a393d3d3f3d3e383f3d3f3d343fb37f7a7c7a7c7a7ee8ecf9712109e72715214dd602480b2d1c30757a7a7a8a10444f0fb60295dc4b54206972e28326273e403f3e4073ce39e794724a2a65954a3f800861526aca09cac9f15152b25628bd5a290b29817e82e69c73ce29817e82e8fc09f2c9f911f404c8b5e3c9132054247d3138d24433715c52bae47b6cea33978feb72d219d2d965d7c7d5e3922e9f29a974f9c81cd1f52ce4a4227cb932b5f1c9a2c7e6278b2c286d572af752116890ab93298b706acfcffccfbc41f3af76320f34451af467aff5b3d65a6bad73ce5ae79c13c814e9a30c993aaf76520488a1a9f39258c815e1abda44e16207e5e2c7121542a832c0e9f9f9097202e40afa0972621314f403e404e827a8d29f209f1c573f79b515289df9d556a880b4a1a58d79fa974d7605ed88e2fa71e2a408443809c5905fed249b828d6bc7a762977fd58abdfe27e7f23e1748ca4c66a7545249e5059a22bdac3407995c7d1a87ac3e40b807e3f850fa3175800861529a732afd4c1d20fa201aa5fa748bbe69f7967b890a2872c54f3c9103da447772666be6d44083509e4ec144965b0a2854802101401898f44113ac9837602288237c10050998204a41156068220a4af8c209162cb0718515b658f204282c5002510e6030022bb6d0228825444939618913453041c1020dc626e4a00627d081133c504209511421b0020eb0e8a288055890d244144b2862a2044c4f2021ca8747e048810c4bc0200462a841113c04c1648215dce003433861ce9b01397db0215f64956de81b99cd39b10f35007d2367005a949f5f569fcd895557dfc849a79497a73b338270c4122a5c30061e1c511c84010517bc78d2832d8cf20a5e30297af282112021490eba60833208f1052ea68cf24d23595091ace45e22c20c686e29769082fcca691aa2698818b99786c0045718a5525969cd04c02aad35579c6bc52af5a918f66cc55c3f53aca712fbd0cb79a0a983ad807c7e5aa9522a7d8070cf14a9085be90710215387a9befa7418bec225224021531ca50b2a71a8d8fd61fa6063bec82aeff40d2542a748c9724a2642a74cc912fba0bd88cd37fa66beabf846e38065792bb3ced8fd61ce2abb8239324b5cbb33965f39d9956d5c53942fec14e760d85f39193bc5b0105b6118ee8942f660393d1447ac79f615425347e6746b7ee6d89c55eea51f4891297e85399ad44430bdba6d9d56b55f0b67cb72cfde53a74eb15ed6532d5b4fdb9e5d95eb69bdf6752fdf7a82a4bf421fed54bb210d4d94d21d7a349a97679a477434808115f54d7fce9f66b0408bfa664e1d30b936e99b29a70930d9042b6a1e9a84fcaa4d34911be72ec2da04264b5c69d842286172ee22a4472b7932cd682194af4db0a22f388079016b324469f082cabee18850b4993bae1c2861bd2a87e10d4d84af9c1d9b2932412795147c11e59cbe99a7776699336d9041615ba2598145a7a4c40aadc31fa0a025254b5db8baccbda48449ee722f2949227bb9979444915f22d3096cb05841a701254e29d3d7d08253cafda61b60ca9a64faab206b92fb9f0e702a865f5e2c8e4f11be6cb0204153b6993aaf1a353e5f46104e99676e9af981ae693a53791dfd7274ed0a2dd5688a529ad26c778c5ea94352eddfc524b6344555941ee05295f2a1da272f65633f6a400aeb31074cd15a6b5f856461ca455b99901f407ecc1d397e394420cbff002244c33ea07e3d4bece3c79190a9f3924640a6cee9d987482317ddf9d1adec7605bf6c9872e54c8a1ca01220822753eccc852a53ad6cf7b6abf272164e31cb56b00aa7f0eb2ab7b73b9683fb77f9e9a057b964e5803a3deab4dafb0af3abb978d58c7aaab99a7f4969b3bc968348edf57a59a6ddfa225816ca300944f342f57828a9b1d03cc543f443f3444d3ad6c86acce2518fbdc79c98d546e62b66f57baceff166791c7997fce545daeacfcbd444f8036e099c4eb84196e5b87ab6c98439953042f684252594a0441319cbbda40413295a5c51832dbed0021464e0852e884ee00525902085214409c210c67e03e93134a1a088221d0c118512c6453642092ee8c20790306232f6db02f26d8940c5d048c822f7d848c8f28d3384bb1dbbd9b1eef56ab7692a541802a6a3332625ae2eed18ce9962cdd18e69b856ad6a5a4f4eadaeaa6119566badb5d65a5f6bc52a56979454e045a70412ec5c6677ba2b3f1c56d629626f0d958010486c73e19c29f6c85b4cb3d6f64c11bbbd3918e6c26ca665d87b300cc3300cc3b00ccbb02b744db365d8e9d06c61ef23681909f034fa761d28b6a1bec1ded57045f89a46598ace349a3a47c78832ed1e7ed9305cad7e511c6a1e3063efa617b3249cb9ebaabd8ef983ccda3fe93df319d237d87de88e1db1030d691e2d63b7985d1d2763328cbec1de7d9b4753c430179969cf82641fca241269238a103332c21ec3b095b5525e8904cbb24b4c66364332772496467892608ad85bca6b1681cd226611d28679ec5484466019966559964924ddc28e61198665f8157e6050fa01648a4aabb92486dd5e3f934c2553e784ba977159b530c9e2e5af69c4ed7115b324c41eb324cc668e4fef4386780657aa7224c3905296d09e8862e2207515251ce4fab9a4752492d94cb25192ea473edebcd2bc7e2ed13c2b97f1eabdb2c82635f8e6af79b444ae46349159a8344d0952e90b02f879d76e912cabde498fe6d278cdb5f9cc6d1ddf1a5fb9da279277913066cdcf9c68545da41997317321fc199a63ecc9a8b98c138d98358f4f341e7d9c81c5e30b891f9ab9f88985661c1fe321fc192752a930d28cd7d49c68a4a1719a0bd138cde7696c5e83876a6ef3219ad338d1882f6b7e86138d33ade30bb58e3f8ff150d2c442353e031ec2aff1a199b74e348af7e61a1d7d9c712953946153e3d2b0ad5bbf72b52cde19771611c1642e41d284eec8a6244bd8ac65d5ed2c9bc8f052589240054b23a5d028579a9ad70fa9a19939fecbe69acbd22ed25c96867d10a279cd6bf0d08a0687e63de2bf441aed3dcefcb50a8f67be7fe6c61cdffbfe40eddaa62df95f991b766b3e861ee6764f5ca728956418539422a314dda9648af52e5736512497b36e53ee22c5f87671cb3dfad8f2550b6e7af43106964c4c96b496c1dbf9b3b91b5d6e8f1d43c37309a515516aaa0821fb084152ca9f29ae40993adc549a3a53cbaa161d2d1e01861b597a6cb93dc2dc1eb5517e3ac01cd437558b5912da9cbacb7bb4fce5a9bb9ce526bdfbc42c1c6612963251ee1eb4a35e86512f9beae593fa956bb47a8cabae11eb2c87b946aaaf787289d55d9d7593b6b3dc231f61be7255f7e823cc3b23a638b398629d5ae079c514ebbf7bd781227cc9a62b5a473671a2c5fa9984eea85e2f9fd01dfcfab9d43ce1eb67135a59c0d7cf24a60eea5532d15613ddb9af32af471f557fcd25725d527a22ff749f2cbb1aac085fb2285f36350f1199a9d03c2ab78b64f9243f918e8eb4824f1769e63567b92bef41f315961b89390d7e12f81e2ca7390d36b27296f7588359f3aaf778f47106d35cf51e3457cddc48ea34ef3173d555d848cb67de63374f278c34f3bbf21e317ecc7bdcaf60232bbf8fc1469284567e6f24e6f83dca5cd6bc8cf7f8cb9a98c5e3af790f99cbc0465a2ef31a6c2449a8e5323792fadf23cd3dfa4873d5353af291e6471f67661220cbbd32d8fe366999e6cedc9984b6eaa5134d9ea03bb38964a23b5309df1eefedf1b74799db234a934c4cb99e45e61a88083f2c9960a984be5e1ed19d98d7cba296942cba96b6ea636ed3d45b58f362cc654dec8390ea2b5fc1432b158eea3db6fc25aa70927d8fd62869ca03a13baad7fba03ba9d70fa9d9bee5ca26da7a22a14c236612534c72535746a1adfa953b8b68ab1ea6fee5ce26b455afba4deb596ed316eb32c9f52eb7692bc60d62c80a4f1dadd35d5fa968b16a99bbdde36a64b93daedc1e55b7c76db4782ef54db5d9c7259b5c2aa2d34481a19fd1f6714db16708217cb9b087452af6bd7b07dfc33b887b7c07ff1d9c180747dac01d47dca8fc0e30bfdd8543e422ec2504a129f7129cc8a2ab6f6903c3afd99f4256f22281d8355bf47473d9ccdd9636aafde69a224d0ab567363d33c32e1f17e683613eaebe3dae79978fec76f934c699e2ccc2aee67401c10679d6fb794d5c0b3a7a6bedc67def4b8efba6b5567bc67df3b1c336b17868cf2ea461234915c3421c16b191ba35cdceeb3aef1a0eedf6ec46be6befedd985b667f8bb867fba63443bf7fe777de896dd5e28bb15b5732b1c6c2449de883ddd31629f5dc83ec3120b6dd770485bb3db6edbcb92d80721fb6d685a8b93e47bcca2d4a9858122c91588293e31451c6d73bdfc42f368afefa695604ca529ce287d534f8da658ef33e911a64553ac3a50d0a28cc9a2790446f380b99e8649c8cadfc1cfbf6811dd69307610852aac308621ba1065ac57698194a9c3bdd6cfa34ea42d7910b3b4a10fb3344d231a59f2e189c6efb224e81df4b40b36f8cf7effb076ef4423a761ed43a2878742a229c1ee1bf9cdaeebfe099e8e3a0985ffc20f7be7b010f8fdbb3e68ab1e7577dcd3e9df392ce43dc443a87ba71f8b07087add245614f8f9fe0e5ee83bf8590f0fe1d056fd879bb666f7d39dd3673deafa049872a8a46b1a277b20640ad10082001040005316002018100e068322a1400e4589acce0e1480137f9a4a5e3c9709e3418e433108a230631021801800003006c0d0c8ccd44a002c65dd041ea83b2308c735f364618eb383e89ce1e02d893be5d87992424f33ec1546d066acc7fdc730d63f792b07f19e486d8f8975b7da02038610a81a703bbbb4b4d09a41550ca7b0f45d61668531d8bd72f1185b83291795d18171c4feacb5519f8307d99d8d003b1a63a47f180f481928379017936a5dd81dddca24755933f9f7cc0084083255281776248218ec974ffbbc99f69bd0b24260dc94ae21e62309a1332ac2a8756b0e2d8957cfc7fb4e0b6e3bd4baa95a77ddec4395a552afb66f7b1d6ce6ba3ae6a93e476eefee046ee93b516f4971ef5bb0eed8e4100f3a2a9469f30b0c0711ff8a482586d9192b6b3101cdc50c8ec2920c2ac8fb7eef6f2a5940491e0fefc1cbf2d753ff08516e6a7b81f112b39980a83a5f10481418d5cdcfef5e34ce826fabba8bfdccbbe20e79d3f1c8a8ae0db05b74b69976ddea87349214b4cdf0887f45342d79998b234b2dec0cc8210d9996d4b6d10fa62502a580c8e7148b259afc9f099669ec19d7d506d137e44a987d455af236bf1bbfec23667169b994bb0b254a228f66422b95ed16658e23ddbf65747592ec2b61895e8ddbaa110410459f827995c8950e025c04175d1ec8ad316ee9b164f9006c81924c91834bc99bd554f0fd5a432d8c76e8ee3091ce99ca0348f15586ecf377c4670c01dec36ca0e8cc0d786db1d34243a1fe854239ad8f5a5d3b32ce656ff466aeac9640081e7b2fb22ba06f3492be069cd984f3e501a26db07f156c8630fe8d9366b6b6debc38add52eee4c3f172765eaeeae385a860b92959483c69beef86170b13402f15219df76f6bc8c8326bd1e6d9fb65a82e05f25e97c2a9691da5408bfa53299f4ba1999765e4e2e3cb339679f2f16587d014a1959249ae3e462072b7148f3ea1b6591de41ee8ebdd282c9ead76c0d6af053ae0a314be355ed18314133fd2af0b9bd4a94fb54b2e9dc7939db1ac95b4fb5106db533859c8699ff9e10dae3d199590877f451dc69411bbbed3b957d8e16f0025d54c1c66b6a36ca200c3c8799ee46c7e337a1101f5e007c49ea6b5d4ccef4d2c51c62bf47e40d00f1be94db968259363f1f7ad6def77808f11a64a888a60c288cf18701aefd8d014e69c8752843a5227b154d27ab9a3a1b70733474562dacc8f76af56b9b15d25f05df375a6d01646adb497dc18c55fe5b5c5f4b4825d1bc0a5b461b7d2a2e2e539cd10d277fe32f3cc81c9fb9e9d77a49d870fa666a1a1c11b43ea520475b3b092a37269c1bfef91159d97c9838e50cf38a56489e7035d48104445702eece41d12e30408be05528da907933717341ccca5af76955d67a67f4077ad30d5250bd5e9583b68b46ec106700ddd5190f8106c5631347a001a02500d225d1db5c4a71f1ad35f8ad939f06d4e6080bd9a8d2bfd92bee95b6e6f20a9299f29dae41256df1544835d85fe6a131c85aae022dd5ccb7a25d026dd393d1a89124a92ba51b560346520a29253fb2c0c224258b1d747a0cc741933ef0d02b3624139907ab89b90baadc0b609364b8ca7c55d7ec80f590948cbb4fe8cccbed92a25ad4f74f520e805b50912847bd324dc882610b25fe772e15e293427e967eac6a27cef7f1f62de1ed22499941e072a50900f6d43dfd210e5c1c91f63593e7c37ecbc03b6b7faeee63ff87d39d44c4c61df86fdde6a71fb2b8e36b150ddfd3d31873fc10e3845c6b4a08c606a8c248a08a67bc3b1995c284665793929aa9ac17deb02a071cbaed4996f12856913475b29072856e168c9dd56f20d2bbcfba1441089afc097deda5e16d4f2cb029338872099b77a099daa446909fbab09f61f9ad0555fc987a7424e669810d633f07ebbf3eaedf83dd92b36588b442786176e45a04ecec797739d0e6e0798c1f825a3d56b2983b590e42d31da286e17ee71324427199f4fe41f938236634ebb96b394398001204a998546eb5eefe6f825a4d5828999c1196889542bc9c30bf1cf224bf5f8a1fc4768f7d6214843d189b918c6e0f7840c5866ef3eadae8317c60afa1fcd82afccee472b2747a2dc4adb666ba92e490c2d50a05823feb90d2e2491c12646bd6579c91162582070123a811078c262839a8603285e2f9d0871218175d13d19c108c9168c6613202f2f52e50545ccfa416c8e27f717b087edcd84ddedca25e4a92e451a1b856f72d15bcf1b0e76a4404017b0fcfbbae4d844e77093b0f807803bd9435bb1346b429e761417f9b21dd4bf916ebebe788684a75190d8ded16b1f6b7ba456455fae21dfc1d355be2ef69db9c3101d9b1a5c29979bb9c7f7e8de125fea325c66ce689555ce6f936f04ed3cc699fd32c432939e4209bc3f3347512c1a7ebcd87e3ef5249fbcd8edcac926425e6a845386f5424ac6426d5b047a62945e4a17a72271fb0f7215e43613840c254a73b974ef3c205eee795ff454085907167e711e8a6dda2fbb9a1b0d6ea24748d8ea0e6c987e730288c81c21f511c0977b4ae550db7915bbf252a7b0de300bc602afc7d5c7a2494dbc39c64486a64a412efedcb37c8f703acf3eb848d5ca42bc13feeb302e5029047bc7a2ba426479c1e1a6fc65fcdf90b8deb9cc199cbdbd98f4c95b861fde76b99eedd482ea3b407acb3dac9c4ca027771729c12ff14699ea8f827dd504bf99e592981916c39b10c7755130f0c5dff71c7420e1a0160d39b7da0b90db76d19315640b40945d4ceb0ecfa8733cf2b18a4d81f20df4bda6411f8cec0c5ef891149aff4327f52dd0d2b44c77932119a38482683cbe195db621e75eca548db2315fc8761643819127b238c5e95957471d9f692e715abf7e66ab77346f1de3c2b28a2224a22695911c1ac251f099519c42ecd6e87136d19d9cc377b0c0a38c3c8d736bd6ebd16f509c4c5e1d6fc12a75ff8a1534a0a717425f53a7161b4700651981349cdfb4383e475bc393e9eedf705b2b5608c261ffeecdd70681b91e146cd890e3d55307e4f48f6fe5de0167cdb49bb87f1a4768838a71a6943e79994f3e6b68f9752194e19c0910e2bd74bbc134abb556a90e12b2abcf962db5f9bca26aaee0233858b52363465525eee825da2dcaaf1ae96b39e6f58d3274f351221e966ec2015ae0cce0341e68efe50037385ce872451ced3bf05dcc647121b5abbb982c51886213acbd1ed18cd8a7b5e64f4246c2e2e63ccaa8a2dcb7e096bf540431547dce602887f3b060d762638e968ab5f294a191e847b16403d7f8abe42e22380f205b1f42aa690dac486aef47090c4ea2e34e82751d970115f7c98e420ac404b2cac3809317f79524286acb16ab6882a7ea00dbfc5b757b98661b20ba6a764636221937d16097eb4907178f532254b19b0df7e981aaa2c364975b579182aaf425f418e9c6a3f9fcb00d7b80186ab3238a61b020cb9937e2a68953007d4a5f249a4fac27669c1742d6ab54c6aadd248462109f7cfd2b6c91f47e9c7dfa04fd644cfd00e0f72cf51440106e3838235d017e33210270c58c6727c1ea419cd7b593aafe7fc224b60d92ce6dbefd4467c14b46445606c6d350d03db69f2ecb133e5e0e75e675249ed783c09bf0f7ec7114c36b6d5010418d07b4c61561078403d05d1172354dbcb54709c2ca970bced56a429def50a3579668743ff8a657509d4d2772a3d2dca74a6f2c090869a09769cf34d6cc9b1f42a2bce795fca00070a600b29d711253f362ac9b491b8bb14c3935851914f9276060fdff20ed1bbe6677655c1e8c25df96149df6cbfa427d108a9cbefa1e0650d56d431d1dcea367df3de3a46e688208054645fa264ffbd5ce4f1e93d324147aeb597e3600988115a6fafdefd3041976ff62248e814edc07e61256251f1a59203abd2f47ca9a305b0a6fbddeb062ed1b48f1f2d688c8782cf6da61065dee82f132fa143f0e499d9825468f0e27aa70c08aefec8fb6eb481166e7de376d16a507820d06545dc62655af9fc2db498522f6a07a33e3200bde0eb94d48ac74b582e5c76891241775aa1b80375d3490ae526ac7fe0d03d4428a6c07f4764507ce14b8da1f00f7763afe0b3f61600eec22b9e75c175efc2d7a9a27401b36faa4026a289014819a61dd847531f95f53d8fd856b4a206db52ec134ad8c7a1872a6dbcde2d8d67631b5ab94331d63f036191402274763449b8b4dd5037d142d838d6207aabbf68546bb9b4d9b42e96311e06627ea809343f6790f6bb2afe5544142b149efb0f1821dc546fca108af61ac02f205206813d6adb1265c6270a78ddfa19fcbf55a84875adb7be3ae07874dc49b386b2fb9c859e6420492709346dc90bc161fa1c5e04aefb4410501427cdfe9f1c1cf530af46cfa7c50d4303bf3f60e57c51efc207dda0dd690f71d30533e8299a1f3fa8d2d9c82eef3b8cb4c9ae130fc21a436b0ecbb02355f16bc250ece3f0d8199f5b5ae1226ac71223c2fb7d24edc80d108027757068e4fc5e4e9c62220ecd0d2365feaafd47568bac33d742a161da93749bb3cc0b8e0dbc6a97876c3412f7774469a3d0067cd91a04c5d935f4f63606b738f854a61ce6308e9f6f0ab4cfb91cff06af9062889b12e8481705c4b1309036e88064188a9235571760d3d9100a2e7496290d2de215909a59d915c80a52d37bb6f5ddb3d206e7bb42d07673559ddd5a8e02c5f955bd035e4eea3d6b6e61b8a9376d3db6d6218d4e8a0c9df1498c0a0bfbf26171c4cfa01de43143549f4865b05aa479ca3a2537390dd465d8fe6a4507c57e08f6ec09dda52460097b008d94e0e5604d48f1ad4a8803d4ff81ab2e560efb95d95c3a5e717bed480591c335a4fbc01e68027c25bc1b80cfe2956e3ccbb8053862e647e8eca6e9048799449bcb356d9538f1e3808d0e4a9d7df6e55a2c6d573e7c68e95968b01e4ff93b100b96745b344610a1d3f1a33e0ea402ff2484a8e42ec66f014502343b4ecd7ea91309dce5d36d1cf00954e3b21218884cefb38e165f8792cf589c8c9eacc9eec721e5f4423506a02f99ea9f3382f2c57799cef7d715270e568276a0f968b6b82b1871acd05a4ef5f4a94598811083bb26b1c7766f08530c496e90635dd045d9b46083636e9d714033bae491840638e5a9f814bb82a807d403daf6939c810d350845e2dd7d3dcdac3a8881af1b9b55e6eb3bbfb941be4fef7b02488a4f21c40179eabcdafcb9d60dcb1492385970f03a03cdf2761a94618e81c633188c6d2c33f88ee94087d874d005c41d3f969747767b0d214c05cf96ab141c2f8fa6e6440f1e0b0c1e4652bde956f88bebc699ded1bc98c03ca9e259b5baf92d96a82557880863928e9292b8c564f586296094396c2f1696c92cf317e9a6171bed72d258eb9a447d636ecd532580693ab721513a37e6ef3a13322e32c88166cbddd36623095f85ff2baa6dc22b3028211b112069323a29a011fada08194fb2bd78fa5be631afc50b8ab33df24796d3a778ce1e9ec99651c515ba2714c16d61b79a2d7cecbf7a7fa4b8ddd243fcad7bbec56ef897308ad3054459ab906adaddcf3696746a52851ace3081c3b136cb7ed7e54708b867a1f72d32b87507a70e1010a4039305b3a196b74a5a079a13af8c7fc2fe48f848fc0464a045c982ea50fcd0248b85087419d6f14bcffbe02c5815612fcd2cf1e586312c33681b2f18576e6b7a28015daf6d5acfa8e44775c97464a633c779f28f9e0fc135d0d15ba63bfa65f1b72f526a690c87d9a1ba47c9f905255b6a022c4268a0ff887979aa2279516d6b7d03a30796d2c89b1d9e8df9b914417932b170499566cb98f3353ea723ebe69b8453e94b802980e2ad5dfe543b24b11d8515e441991b28aa02f6c87ebc52d520709e8cde6ac8b5b5dc70f44a9a9b969488f45a8d3459e4aee655c6cd96a5c023453b24a15e73e85455d1681a6d2ebef04149a6e65000592ef8f06c3f0f1b8a3be05f12653348b44a49f925cb44825bc318e3c9076e544347747899eb2aa23ee7a58b191ad73f03a9e3f25f61190d1746c658d59acd44dc6ef32926f4902290589ca18867c15c217df504d750028638aac618fc8e629571908804f7eba38bf53b5ff21f8d5f1743cfae96127a4d8d249c54811827671d0e00121b11d199b328c53c822169b80d2a3b490579063dab849c70b28b50d8a53cb9185ad547828fcf146e27ec1b3e999f39c8134d67287f930b37f976080379d5c88f3c1bf84465b569013472f600d8ffa9c3dd69923d192fcfd1053e59e7b590cf08a3256f01e4e5e9070fdb329f5b6618c53841e4ce87b15120b1cea3eb7c67668f74e5c96a04d44c5b74b9f9edc434b8dc1d714ba6d358e7ff48a950c1332123e5b2e846571a2faa6d42c3a8edd9609897a04e88d4a19640b746c155e77a332996a08888008b06ad988870fca59fc1802247b25c09b20ffc0fdbce4b13fb548a6c14a68a590be0bc606eecaeeb7bd3cf989fe8d38a5d769b40e8b1ce201c23f17f057c01ea6cb747e2c655d2ae7fe891403d71a68124da323785c4a2a321f9db972200dc5890dfc566b4e83455635abe4f13823f71c80e45dd091aad9341dd899e959c74b9f6d3d3263c251ff92827b6ee24c14ebee653331368d961f0af052183b1354910b7d31ffb76d2897569cab6921599fbc54bc980bb3c7f8420fa4541726621b144660611df8b828e8ced6540c487b0275699e37054c52b3f12be37ee2a825b36f5627c0aa99958a63b7073c49d5da1e0572127c3abd97003e8864465a051fdabb8c38254751bed478073192bde038597b32582874d5aa5935831e1e8a2b561586ca61da547e9f1f35194a7414ad90d34bba681d5e671e1c066fa034a8957d40398b99759657fe67a53c2370fe86cd23448c81a98dc1192a7ea06a9483d9681de3f5a43a10e68307a0b77588fc140aef301c59babf091e21708db785fed0d99363ff69dd4aad16e4494d5696a2eab7910ec70546f75e548990bd769f725339b81e2eb408a0b166601a4f302e25e82db5a831070484e8e9b35df61587561439f8949feb5809ada43b0bf5622052d8068be5cdd20fe0e052f08dc2a37f6a25701ee978364547223b95a87594ba341913162ec5682f874153f43ee93bcdfd5dff376323944de596b6c67cb2c01675c53f2cdf89529af70fa52e171f80b34c7b138f210ff262feebed9a356b55bed9f83d5ce8ad2478345ca8b761bb392d02765f82494406d4d2060ed066072c04f55cac673935c500c49c49bb1ae4423fd9425df2f36105474b7a4c862cfad34246cd299987cab93e61767a2510636ba9e4f59d249bc0dac773f37b04fc14f244e0bd4f30cf314ebbf8e5768ed92c1c7b9e2e42288446e3791bdf2c1fc031a0e3e4ed5b3001fb2211c0f02c399087878eb0c4bbc52bf770034684c002c58caaf75af70564a8b7988299cff2eee35607647fe4d1f087dccd82b2b003f3b38c20ebd11f8f4be5691c9282a2e4a762385a3482b33195d35de78f42bd8c9b2851c5f05e67f305053454f762758727de1cb3f610540efda703328e0013139fb55a01d2912b2bac3ec85b9edddebccc5e5c81d1244ca3d0a0f303988efc28d5a045069ada140ef6065fce485c3a57b2a7ef624b91493ce65b77bb83f1df79e6922541ff6931fb8dccc8c52778b73e2c556829caa5ef396a273670ec86ecf0141aa49eb2eba6338cf56ce53bbc59cdc81dccea8d1236d39696bf8cd781484a7e325cb39b60f4fd81734a3680621aec0f3ec25c337bb34a31ed516c7fc437edd92ae9c2d67ae9cf25fc99f251d7450d7c0d283e9828427d0bdfafa64a8d2bf094907253b64132b77a4e9cda3dadf089e70675da35bff0757578f3349b748d6fb8b61b36ee3e662ab98cbd12792d623f444d9a2e04aad858288b8fdb6527b26e55a2483bfe7fbb0b37f62a83699eedf5703dfac6d0821d878878c2efff78ca4f35aa23a3d5f39ef3ba80fffe756d1b784b667e2a2d72312f5f885a1027b45316902844a45dee201dcdf64285658baa847a25751f3bbb465de7c817064369e36629a9e0203d2bf92e937c05487357c07e5de84dfd50140f3c97e1ab891d33016a6d3ab675f30283498ec5be96e3b73d408c25de19d136b95736b565980081f0b94309f0913707e2339f0148be8634f7dfbb4bdeebb3a08dd88adb915bd26eccde393ef53a758f45424fa172656ca40445f4598fa52f22ad76259dc60b84ae6ddeeee3a3a391e588f8fa7977d702b9dc6e84377b38de729c81a52703db177b5233795fe4047c6cbf0e472641f5a3af955a4362c44226fee3a94b34d9865d1a06d68f0962216d4551759bdc2a3727a50451e87e81fb624cc2792ba6adf222f07cad9e327a549fd03986a069aa16b10cb6cf2d635a137259460f17730f1b8d495c9af34dfc0c00841fd1fc12179a8c3788782ef19b2b0a08dd84b673dabc8d887d9dc0bf1f812a9d979884ae836640ebbf5bf286142555d31ef225cbd0f7ee8007575022a707f6d5e509367d62f1ea34d92a65075dbfb3368705d09d34c9063b9519afa331f02c00ebd6ceda9ed1c92ec490988d26508fc13153f3a9084a593c55ca5135032cebed1beabd130572bb286d33538a0d748dc0a44ed023cf5cb8798f33353f670e72dd6f415c830fadedfd91418180ce0fb931996901cfbfc409192ffd888e78ba20e3efdf681e4399bf5d86fc0fd34be9e06a478f7dc4d3afa58e1ad463bccde5603e992ac5e08161679645f060038188514b73419d8893d31265a3ed0d2499fb5328902b6c2406562a43dc552ec020854e3843303c7299fd70c543b9eedf779452bd89ec89f38e9dfe41fc2b47b1e1108e32a002556523f083362491e47324087422c0c0ae3b90e81d2f683e0e08197117ea7dd5ec9e90e2a1504c9771867f8fdfbaf222162d38ba60ee7f282458cdad3f56e8f9c482629167e64bb4113e970a8568fd1122911d4960c3d08d91216420f72a0348942c986a7c4d24b35f053a53457708854bb95cd10348c5a529a2d53df38dd440a08d57b52c2e67de1aef2d231c0d1fe9bc0d0143b88540a3d3251283e59f3298815d2e1588a90335568a50f85cb51e5c95856702a609fbd417aa311db7b5e50b0d8c8387f4828af2f7d7c92670629e808989a1db3ea050626536b4efa83572dc5c21bdf57fd58a509f845b3193fc9a7756b0816c9ca0422cd58d4050eaee09260f66d46923ebaf037433da44d6a5566ab849fb7c225157bd487aabab056c972cdf787b0c6f6707bc74e66d7e60c0140f7f2b164fb3269bd7b798337a1343c533f0231ae3a105e587b65541831456bc95b5710798ba23f069a25ac08ba7a998312262a70ccccdbe0bb3076ca7d6ac58571aa182e6228769102d8aa1bc2814718130a62648c68bf8a1bf308fa8664fc490eca53742cad34fd8b017b8d0920821ffc94cafae3493158046113810c058058d117c8ccd918d0bd180416fb7f3836ab92282de3f9014847bc53c35e08ace2973d45ed5f219cb8297d2922540090593b3f1165365a47a61505a939e88da5e8ede378ad366fc5906ea395fb72edbdb5315c543f820002ec4016d45fbe48dd6e0f954b408ce48d432799041878b9c0cc0b84f2882c2a720d502b0bedb8310b0bbb8c4c5111f93a299cd433c74945232ca5fc6d666146429cd938487cb6f662d037c8fce78d229be7a0b7de41b2c87e69922614934fbe2841e837691d1198cac4be85e47a27f514746f4387087d9be411b32493a1046e876a57db8a9f4ba7bf2a21b321943a07a000eca90d5ad6e4bd905d428690648596499ac91174e24ced6f4e03948a9a0cf20dea612e664e9c6c7300d4cc680951f3af1adf087b1f0badd715c674e33b90cb48d57565a3626aa905992b7de543d1fbc2d700d519f00374cb9f24f9bc465fbc2f125e4a143f1b5462b934ba3b4eb4c71897eb57990bc4348936069f643bb993c495eb4464e9ce4d307d80b43c3544b6863f384adab62b5a0ce23fe7316934b42e39c7028a469bf09cbe4942ebeecc0e70f8783e85b062681dae7656622e8a415530a57edcbc90610cb8ba51f6c00925972e75087362a78243382a90ceb91ac0defb19bcf033f7404d08cde7638d749877c0dc6e8123c8256953c5b93a083ac074664a3aef32cffc780b154f638b3e4522b05c36e5e3894f20e9b4a8f42f1d95640501cc6a6d18b02f88fb422fdcca874792b3e990289b870c9acdc359a6cd835a531ec32e9ca9a07d6ea8244ba30e32c41978fd11709be308d18efbe258290d1bd1bec064569bd43c233e22f3e7c652c4e38adefa9ef6c3462fea67d40aa19d7c381416d7efc6c68810c291143a4ff17f98c2a88bb64fc881921a3aa982f2048b4adf6bf689114680240665c0b44d9cec6ff97c8f2dfff50cede76026ebd3fde72e46dee52ef645fee00bd00aa239bb6586b6641d44376190b6df1d4e8d324f6bb427e4a7d1a07ac90ded3e4f9d5e4656ee8972560f8c3cd59abdc5d089686dc5124ff3eb58119320642bf7eb3858fdb8906fe222f8190f8c0c1a3605f8892c60e454d79624e7bc0dffcda84b20a3fe0ee56936f2deca16e7bcd081bf3c9e8cd35f54ac4b754d3dd2c8d521fe49611340115b42a3665a4e8d246c4d937918cce40298712df09077432fac8a6b747c89798b0e3fea5efc368f46b43d83413b019c62cb8319c8b4f56d7a0bf3ffa7cebd6202b1da2ca6bdc296a1dcd758f841ce58a04d76049362542e4d21b83093823adb341df7c13ea334cb0177c591a81fb0b0219bc108bfcdf3163fb14834f19c597151f1fc749e17dbe2a2ba38232cce656c4dabc50505c6c1ce8ecbc772eaccb8491f80054bce0ec627de084c7c1d8eed2e027d60b715c567ea37a064a1a219d2af8f55fe6a7664cedc11c25ca8c13690f6d4a62593163cc25de10b3b32a5150e0ee0c628b07649a820eab595003a58ba4ec0c1f73aa4278c79fff99839a59e96e7e6d2f6bb9be2ba2d72075693a99a59555b488778777f5855c8268d4f783155b31224054bef0b3f1c0bcedd00a2caeff16995915465b3d22ce318c367e1ec185ea7faca9ca9326a95999fd967a98a53dc60b8f3be27e2128a947abc3fe1b1b29eae227c18f70c6394290678531a26b0e7328e5292dc471906fba4e2bbbad6e9d831efb5e91968084822334e0e28c63cbd007d66846c72cb6b1d70d4d3e9e69ee70acc37cf0829c5f22f08060145b81c811dad918d3ed001eade417ffbc88f3a9695c068736b6425fdfbcce410e4482c3450945ff9923e5af661ddd249cebfc76426d95e2cc22e3453f14d88954172c731a8347db10cf08f077d81a5a0301224c09f060945b223172c61be93a7a8f503c1ebab3085260e37cf7ab574f821b058b03cd90372bdff837e9b016d9040a037ca1a0d3b51c9a4683e09bb28682b2e2acaf865e413c570aa5d70bef9358f7ee455418111cda2bf3ce15f4037420942d6c0fea3ee610149e426a43c421356430d280d190b6fcf101e1af650aa84ce49d108b6e31a7160bf43f680853460904aff046c9712c642646055e85dbc2ee9099f48db546a600e8cfea1d8f95e3f15c35652f41e261aafd41053abe55f96a2ff901aaa2f733be85eff895ac15c8dbe23f08abad1e3d2b1c535c4d9edc06956ba63aff0533d1f6347927738837d70a83c713b82fd9749ff990d0e72dbbb2f0817bf6dd5019a6daea339ab585aa4b666965f4ca29d416d685278d1d653edf9cf38d2be134c4d5eb3692c1caa167c3f3a591084ac4d352f1c602ec2351b6184953b255b9049ce7bc6bdd44355e042ab8952d503896c0011a3f61012a7b83fbfcc2dc597db5c60b5c3702dca0a4f5d52ab6474e559adf0e1cdd6f74cffc4ff4808432b8868f40c7bb0319b6e622da1d67ddcfee8f88a5c250ce6595eb9aa15e46d8af82c0a7d12ccb4961f71683aad2a1ab1aa5a09e6a3710b0a555870acb2c251cd292bd2ecb35b46e10515996d0783fabb82db59ed2fc45a5f69820087e5d9b2c1d39644121735ebc166ebb09ff7719eec1827a6bf518d62930965c4a66274b79c59624b14d54049a2e5a21c07c777ee968c2d298f0f2dabc43657bf0f4125b610d52e3e5e503156f2875789ed8ee4035b832c9203f78681445895853bf7ba3a506f8605081148d4b0fe803d87ffd669f877cff51036da7273d1ad6df22ea8d13a4408bc20098b7615eeeb968688aa7922f3921367d2288a47db71f694666f361ff40023931d40ab835eaefe46fef5180c9ce155ce39e4aada4115ce7ed23591706b159887b040d60228c0ef718be24af9417ab8a91df82a15083196f93f3a0a9da0159abd7e6b7c56479c9ba0bef692465fdce925124da45e67fe5d19a2860b23478b9b476de912089fceb0b5d39f9c68d85c15fb1b36829801be101156eaef7b2eb1f9ec48ed078475cb0ab92852a0e1f70fd2da22959d571ef4094ed29c319a2833aa1101bd03292d827d62ac80288c2777b9ec3341ed1f001f9c0901aed5ade0629834bfa060d2536c1d84c77ec49fb6517925a8aac57e793cd3b30412e3f38715907d5644ca1a7d617e702a5ff7082a6ac3970938d02c5c3b141ac92a2aee7a7abb4197be4264193042ce5c541391223af08adedcd08463d6b5f39b1065b0dd167d24b62128c966f5fb74b01709d647893bf128116c20a2c077da435317a0359d4127a730c1e93e14ebe5cb9076be301c6ab90cdd6c0a91c8124e385868333884c160734a63944a9e6dc64b7fe2eb71fced92dc9c990809bb052756a66af59248c75a61b28c85bc7e90e78457135a53336271188030d150a239e67e74b3be160a901a73dc564d6ad6146459acbc05e6a13bac9a577347e35fbd484ba3d49805b4e4a1e67b2c897159cd484fefaafd1d136d8e4c9d1ef2c5f0178e9e4ba2e54f0f801cef0a8659ed8c4a269ac3180db58b949249cc523340283ab083458cea6a050ff2c8bd7b5a16507e2fc0d8ed868bb0d8417aea05f65899c92881b3f22a8714e9f317d0aafc01f7d0147c76452c6240fb55de87f147997f64d32809edef7a24eb9b5017d941d8f57216c4d7449800672b2f63fd7f6f2d8aaab0edac40e05a3ce7e2bd6bef3d6cf5c12a6c32c067cd20e7457d884bee1fc63615bf7653c12d1387ae02763146d0a953f71c7bc0bee12ff9f308ae1aa101cbb1a36016ac927811c8be7a7a93ae6866a426d0942ae66a99c023db1b806d424866ad91881bfe29f016701f536f3b2955fc35be3dde5a9e2f0fdb3402cdd7795b0fd09bd2e5b13f24c9674173dd77fc86dc233ff0e97de3e603d2192db3dbc577e03363111c1ea3c08b5147ac37da7ab8d33f3401abc72a77bed5cd48f95322290c4038bac2ecf1afa143b918aa294324d9396e2cb89d13df16474cbb40a23b8eeac420f9e1e23ebe9ba4ca083dc3427099b266a77cac8d21497b5b81a0495aedaab8708c0dde96a0b9ca2dd539320ee96d7fedaba23acc805f12db1fad9083906fb8e2cd0a081bed71fa9d285fcb8d599c5e82a9554fd366936f1036042fab798d2bb2decaf863b8d23672d6802b31da34e502796d153a183b40bededf2de388c844ac415236e01100a98608f0cda0aebecfd68b33841716105b120729df3d0109fefd8ef4d26311b1df4f63fb37927bd0dd191494400c4cc56d18d475a1f201a4e1f6a6c80b0c411cc172e3005732305fc460d333d680d1ea43416aa56d8c13c8edd613af0caa9946fdbec410361ca699faca9a1768ab65ed021d905cdd8f284a1dafba0095e32a100946fcba3903699c1f3b1010e327726aa5971af683ee49b089bee4c5a6a0f786ab52bd8a3b29d559e78a82463af18ada2ac1a29d1fe1d670d476d1473c4404e31bf412eab96340730d2be7392c29ac557050d011ae9976b3e17fad18bcbea0bfdaf36062a36af88e56114f5108cebef2ff71b47f0cde528428cd170237b95d52f3649417eda00d198a9ab376ca406bf8e1802ccdd2f6d799bea21a5161cdc4c0fa880d16fa274eaec35593e780396438d62633a909f91396900b16d4a1610fad1cde0ad2794ee9e2b724e933144cb3e746d0be377e3689e15b0cf22a5cd3b1f102b44946483987bf022c60b61858f08dced8887d28f05569caefe1457e673a77685710c75d0a05ed8073933d8808d61fce4dfb609a08b3c9935a8799c746379e352c07481f3e7aacf401a06d5edb84b6f0660b0da68baf5c0e38942ec217da7e46881bad5ba5caae2aac0555f3b17365b21cfa0315a89d858d8f1b426b2bfb8303d7c18b8f97dd20160916114ed8c5fb36af1b19b9b8f50980a1ff270ac8a15e2f5856afe94845a27243a9be93b471c4f4e4aa1eec402c7e26afc7de69328db10cd9d618e2aeee6336ebedb49bee284cb3a4a91fd248f03b4145f8b667ea705c0f0ddaa0d1af8c2c2ced6a2cfcb77b595b675c5f5b1bbeab2dcda0ef69d20bc4e34e30d367bb6cc4b6456ee23b22fb54fb664b49458589c83d730e2af1f9350ec119c04029152aa698953d4abc94e2b3c2c47899aec4d17e77c86f0a3f8089b675dd60a13f963feb0a4e9a946e3e4fedeff365d3e478c9449fdfc5eb72a5dc936ebca4cdb85b5ec6c0217bb9ed4f21ea778933b573a52e8f7ba97805bb205f632677b75ca19c95256b67149a72e113492f533f721eda144ec1b2be49fd97e79aa12c7706ccb4f74ac6c99667088352a5f98350dfc48d623506bacd18367a2ab973d06e586c7d5eabe61540c9091f1c591cb689da4dc723f75db4e8a9207c83d7f8e05c487b02689a1fc867197a0d1d38ea1ec5f277033961f3658962aa51401b3b2790d2be9d117879431097bec3efd6df76cf06928b000834528a6dbe574e532bb80c8eab0db8e04a8cb9ca3f81dde363d7f20613c7983bd5b6e06c105ae6e2f535624a1f89bfce4312ccf1334e4798e15f0aee3752b9a052bb4e72ab5ce629db24b82fb7da0c7f085606936f01aec1c103bcc7c4043ebb606e55c5d874867b32beded14f55b25fd6b6a9057d16d1e5a02f349962ab256499bd09bab584a4037d6fda634c16add62758c95b9db7d851d8aa4d4ade0bd8760bec1c94e017f49e46e5b8a363c7ae71a9a3ccbf30b6f0542cf8029e94566f42817eb3a0bf06db76c7da1a5c62af838ecf67b6fc6232a378f61856d65bf8aa0acbd6750eacc0044d14b85c831b1b4367a05448790b96cf98f4478398782e1fde71837c881a047e0e872c5e57b3b337c5204e42ef3d2cdafca83de825caa66981b1df67c1b7191524fd0b0d5159a0608baaf5cc5c9b938439cdc8e20d3607b3005f677b01d74023e5aa25df19034eb4d914095ee1a468db53e23dcee53b53ee136425c9332c7cfeef3781078d03fed60596cb77664e4cb7c6279a7fd137fab0406887efeccc08d419825620c30d0d1e0d30c58f8ccfd0c42e6712a82ee6d3dc1cd83162b7769f6a3c9e2161e83901df99befcc576aa2a6e0e17c4ef6fde84d5bc27f03e8f0ca905e09937c95cfd21bc6ed7e43af57c93d08371f8f3f402970414ae23e9cd5d33c5598a6104daf9fa3c262225e4a68bbd30c652560d1a4c5255e3ee9cf5f3095005ceb76c9aaa76ca83652bc4adf0bfe1e64804e11626e1ad83e43e6643546c4f9a95a5ea3c05b029c2f8d9585a86b51dccfb66285a28f06acf295191b4da83beaa53b43221ecc30cc60bd1553aece2e8fca800d01844387c9b98853229eb329a175eb2e6076962f058ca597a85a934e941ca824a7aac76c718163e76c86970a6a938956ac028c270c9dea4088b5a6fb2c65ec14651e330797276e760f009dcc0ffd116982130f566470d44996db7b03dae756d4f341c3c12fea3893aa724ba3d7671758540c8e85082d4c00886fe482ad065d42b1b9560f59e1552eb3b2b800a1c211cc8b9d197a8668d398db495807f5b28db4afcafa29c91be82f269e43167cb1d987c93be826a758ef807387f73e4d279d4de01d87002427d7dea254c1574baa7a2841c99d1ba370112c75ecf29be4edf44627de91265d5237abc86c3585328af84b0211d642efc2c6db71db8addcfba4dd665831de3fa975edb36a28bcf4f73b9b6f1951c2845421aac15e779b1f3be5c60d3391e36c8e827efd5d1c6858caeb93b0f1d14db4262934d14068b31250c3ba83379ff38e29f1834bd458f8639dd8fb3f192503a858689b614d824f647b370d7ef1cc54061ff07d850422a4e5c76854c5dfeb0c9dc1a84415f609085af95d25e905ad9a4cfdd435ae6cde60e67bfcda5eca213be2c327a2dea209eda6b6b64ba99ebd9d85b1accdfa2545f88dcc673ee2fe16dd32a32a4c6f534194b8f24f3dc47f74cf29fa6245cd73ca3d6e9962bb889bcff371209f8a1f3068af50ca672e2e2ba354aeb74ec7415739d16d23ec4f9cf7231ea751e0b583a39edf92f447b3fd90cbf2ff6a3fbb1996bfc71968ecc8bda32559406dfaaa3ac03ad425efa67cfd884007a34723d272ae08af7ec4cbcc94de0064eb6737340be22c3af54bdd3dfd5f8affdbbd94c7add21dd89ab90d3d8fb6a054de0fdfaa844adef5917594c3df70ba36b1e1684751fc97e1ea2a4affe2bdba832b09c0eb90db33a1361e58b390f167fc31a79d46e0ca41348b7dfe23c00bfd8c51af14b12b2cbaabd28f6233e7c2d62a0a48470f746ded6875b18b5f74c33517843d964408a6209d9d1f9af302cc01531a963d29b24cffd7b94937a4255084bc740cc58bee5043832e36152ce41b8ced19a4e08312cdeff31b3d1ab088036ef5a1edcb7187cc6c554c04042cc1588cdd43c6aa77d16b285d8e55b86c6c09bf020d1061cb951a479f2758189a2ba1b3ac30f1332dcdf411bd94630af229c03596fcbbbcdca34514474ddd33a68e3dedbe35a58d95f82a24cd0a5e0fd140ea49f56a2b34fdd50face58aae05d8e2d98088a5b3c934bca3edae61aa93856d4962df7467483793d0f3bd517a2084ad383e3e31faa23861dea44d1a8ab4d6cf56f791721e19cce53a5ded0e272d354dc8d0ca6a17b47414a9dfaebe5c57ced0c60a9d27a9c2962ebfc7c958e3adb3a355c843c401df74fd683061d6aa402f7b5db008d917cac217142f588583aff9cd76b957ff322c839154930c471ad0c907357163cc5641033457ea7e08f90bc6e44e5958fc539be9ab1339ff3f381db7d037e224a601c61c1a41325bf04b1ab0099dd15e224de0cc584ac081c611f333353d68af554ebb394c7322a4875977958f779e709e01ba22f675d2a7a7c8fbe1fb9b5398cee09b3e2a19e55052334ec048df70dbcef2e4a3dbb318388ec47e560bad15b8c1871380e12a74fd73d9e4fd687de7061a4ccd181f7477ce2d052196b72d3008afa94e3114115d01331501e715b9f15726cc42071368649e8751c122303da9a2ca7a8f6f262508adda9647d5275b5c0b11e22e16da65f48fd3859e5029706cdffdb7ca110b8f82727afd3e6b7e579ac39a5fab3c9a838ee61ddb206336be51320fa018b2b9d248b5a0d7417b41e43d3bb4e18a5581f9de36891b45e696d897763efc6b6f12f0fc26b9b66cf0cc9a9f9b12b9bcea97bdd920e02362fc7840549b99052ec9367f5b955d578583e37f414edaaa0493b6635b1491ebed388b1dab61aaebb9235d4c5439a23e7cc4d5dd2a4ad02784c50ccff74fee83fced5710f83e5569dfc905cfecada97ea1acd41fb2818252921e43dc751f99a0c8d0d8fa8638be4cdb2108e812eac6362af6f2f0af4b48f9f29c01161a1f96bd9e52168baf475aff4972794e41e0991b8b1bc974575c6e607661c607983f445e3b93b22fc4479ebb0d17c1385b987a80e86b0e1e64e0eb16d8e07db89f34aac4d7a2c122bea1662bbbab82f5333add2fb1847a41b9e944a0669038d1c136d72461d4d8fe02d9e7930170cfa64ccd22d6c3c465fa419649215069da16fc25ce18a78ff47fd2ab8ecb47baebc96122bd7da2a64826f9319037f566955f2b8b586d363312aeb129464fa2d4f729410da20f5cf64fbd68cf54d3458060e3e0f4d5c88446e0d605756b10975d585fa3b8d8c5fa1af9b80d680914a1e86b24c435e8705a59da6d11259fb17742a60aa3c4520b7e65b7d13e52e2fcdcf7bb8288f528e1cdb4f1265fda6d5dae6bb67d6f6a71c36e6e4b725465c4571a725cf082d5a8b9e07952f4c34d43529322faaa623ad76b673d7b23bd78b7de2547d1175c9359fe2f68786ad351a39d1e78807bbd05d1fb82d3d487ccc57548e2a9520f20034a5d0c408afd21f7fc1c3dfce8a393ed11a38129837bad0c99340a24e744ae27deffe76620b4954192605b2a5f218020eebfdae55ad9198a4fe91fe08e7aaf06b74bca749a5528c568966cd13e092ba2dbe1c02d21464d12f4318c17192884ac2277bfaa5db5b91b60c17ceca47af58e1acd01ba9263518f1f78ac7b3de8f6b2033d095dbde378f30ea86571f6b0958453fbabc95d4b941bd66035813bb9107f23853ab7a73a16c64ec85f2e9aa81bf47e4c53c9c8ceeca4458c45aeb9264f46cec4f47ca7a36d07d871c0115a784a2101f4a338d54d4cee20cbd78a07a7cec348f802bd0b05b3b873e0a08e79f55e873cc3ad1ef47b45253e454568b08428338abcac7dcb19a1c2d62f4988426a64bf82f2830ef428b3308c6a13e96361f369b391eaab083e25cb8304af3ee1d039abf49e748f00a582c29e46804a5aad60421da2c8e9ad21b5c5d6a8caa988f9b050096a24241b6d8eacb41c916563ecae0581693a7662016b929e087b8ddf9d067ad05c0361330c424e0bae5625a42335ff5e417f5537d99a3b0db616d23e657fb6bf842896c3731562364c6849891eed795510875a4b08905a333996475d4d35e89539909d1c49402f1c74febac3055183c59c2d1459e98a8c320e82c0488f496d7536237fcc31d913395bc49fdb0718c0fb00c688a777ae222e4deb7b30f60ecabb2ee6ac41e6113cab25205b186ee94d7568c4b2d17480e1b94a7c0ad9d2774df1543306540e6e00134a42f83f711b283e8661da0ced3038fc2cb9297a25b3ff083c0f4ea2a8276ffb5d6a33dba50573d7d2cc9061cd1fddf895c9f7ade25516667099cdeaafce4827b00f81776c68c2d9f9a57c2e38fca382255b78e116f56142778222aae5efc11ad026963aae8380736688c19a98c0d2f80af9a58682649094e6a12b13fdde99ac447df5e2b3851eea35142fece8f192c3fb226f6d0e0b79874eed9c125a002a34cd8bfbe33261284d3ba119cb34f99b0058a4d28bbab4f3b21d85d0687ee8ad65c3348d28c3413b8264e9f0d31106069fd63511c90682cc75e5d3b6b0a43602f2c6c499796e54e6b0e54417a6a5014ba38e848b9c68be11a323efa403b82a1a652222e63dbf37bd0c889ff8384d05476042a4ed217cb0121f1367df956e509cd93dc76f693dec52abb4680e8dd82089ea47cecf3cbf0c2b4e2a9ff2008dd0ebe706074f69d0d0ef7b1b9046a6c059902385931bc62d30f2e1d42657ac4509d8f568a93431520f773103e86d909a4bf109a11f34f45cc335b82bbed95a81d038c916b745dd76c6712bb78a1601ddb8108cee60f7215de7d1a09caaa8c319005cf8b155988b1d68fbeb0d4f3a63b1eda07b63b07c37aefbe58fdce13e933178958d6b54c43ca0e477c5b5f037a0fefa10dfacb8c3b1342defdb04596c86d027bd457ee61395ce9963039ede4633d158796f64dd3e4751d8acfe38e1323ea8f61661b66d84621920afe1b055d0aeae63f6e96d4b49705e986b74a20b1e8d5db0adbcf3103df7a9bba87bd954848eb0317a1bddcf1b87364555e1c5235b7e26c02812feab65b0de35e2586fa2044561b62a9be3c35713bb1647e0c6ab194527460b5986f56d024ea83fc1729ee2eae0b6aa7337e35c74000159b2e73e100ca0d12bdd04a80998b8142e6146179d49cd1054ba0a2a41fa2abbb0aa73f72f6e36225221f81c4a727ff90a173468b2c236d5049493f5bf5d313a63b292a66721d12007ed8b2951cd0322d1425c2aa3aafa3f09ab0c1b68176aea8a92e615e43463275a88d94033c85b07f9c81d5e7dcee5a0f2cf76199be3405d79de8fc316f54c35ffee6868e221989a9268bee91537487b3fed06e04ea66c90858e7660036f5a3d070a60a1b19d62af2647c6e57594d2e42aaee152234528a87ed620cefd225b1e1d8f1a70642b3814609b14c7da4a132803f76532ec57992843fe7a90662259ef7733e5298de50d64e2698292d8a38515ae08cf2f237fc1f520c4ba20630841a2b2a3f0b8319786375eacaeb60723373e007487c2a3fa422e04c472ee2830480cccca2342f5936851cfe7ca4004a4e5c7d154a5232875610611a813c4a98ce9b698cb50bc2721f08680863d6935b8bc45962b2268f0204ce4c058364797b0a70f60b716d011e4abe7ef60d65cd49d49a77724f279715a0530ac621106aa63d425b3f3936462df70ba25b0dc6ebe4f0d0bce762c70cb2dd84a3111ddbafb631422d7898a097d768c5cdd7c6b4235cef0d6d119fae78300df0c0c03aa1d566a5a4058555107f92bb2e84a0782b915db14579374935010c6388b820e7d29bc8b1e7dc1fc761f3ef00c4431ad76d790bdf2e2e276c2b89875c61be0af819a1e80f691472a8342094f5960a4ddbc8e81e83f05c4ee12cab6a54c29a572067c06a206dc8bb8ee392e94a9dda1666ad350559906fd5d9ef29f28e6efd47f9af5d4cf3d330e0fc6611d28540b90cdaaf8db2c0ba8facb5bd5fde577d2b24143b6594583ee8c3211819a3407ca5ceb1656e5c0cdbf16085b28aa9696abd592e26ab95aef72b55a5a2d2d57cbb502ba5a525c525aad95f3e53308dc8ff2dbddddb8bb312e689793bc32899eb147e886b6eba541f798184364603162620c69896132994c31626486c8c4c4888901e3d2fe1ebf6dd4187222454cafbc86c95931434ca621439ae342e736d480969c20c2f6c4e5a0fbbea830febeeb832d0a663f5cdafe4b4b830de3bbff028381c174183f97af058389d99f93d25d5a7de955d83368b4a5a5a05bdff9dadf5f51046d29d181b613a0e5a0e84e2dbaf22f0b07a2697aabe2bf8209aaa2c4051fe0dfd8a8503e770b143fd0094ab7af73be41b05591fd4c83ad8afc46b5b8d096859483e23a3bbd9a1fe7772f12c97775c772683327b64820a2a3b62c7ede0431685ff2c47da717dd7b0f23f4a2af4654f32386fb7dd584befb4edc475f35dc683f57c44783f241fc758e2c07f4cc3719176b594efbc869103f37620162c93932e69e06a5ac5761f7e0a357e16c9d5e85b287ee216753f267e7744e4e08d5eda4e4d2389238a2266ac512946bb9c5a6488874c78e1dce6e726766c93b5625eea8718aaaa257a7c511ab2108474c36a3c9765cfec5a54dcaa66d907d9d1486a0f2675a95f8279ea92695b02105493cb16212abf1651efb917da47f6a1f71f5022aef2ccb2e0ba932cf35792a7ea76c81c2644bf3d967a0c11935e4f09adb7ce6b4fe390379cd83862334f41957e33b2da2f04045dfbdf771f633fbd9d4be16f49913a97148e5a8c043149ea8fe71dd51281a9ef2024dc5f82832e6469ecf96a59d87d3bce6ce233441a0191a85f3c7dd791a8c338f1ffda656a3e3681e9e6ab5bf69c6de3b734610efc8ea9e471ad51eea33678d7e6e08f47da459a3cf797c38bad06f58f13b12ef88748efaadc607452ef492771a8272fd69c1c3594ea3a0190fe751e3f3a80557fdf3d9aac42f91cd6a7c92110b1cb8b62dca3080eaf19964c422ae8a7f17e2b8a148e2e78f77e4c73aecc324c6f589743528254d7e943722456eee3e357a649a9434dab22cb12c8602132142631a6c59ba4ad04bff9808ca0fa884f1a0ef0403fa53ccb3c4600839b3d80bf4d9f811f6b0e117e8611020088fd7081c8063f60a010182f07881be1a93a7e4f4942440101e2f9115441fe829e9001cb3d77a0af4cdf9e23e1cb86e2485372af7c15c5a9ad6c23edd9c0d1c1423df3a15a5ef4459e59d5eadcea98512ea4e51a38bb8801a472e40b75589a85542ad61597353feaa65e15f623764408d38a0079de6697e31df7d367ecc2fa6fbee3bcddf17eddefb4ef39baff835dc28f7205b83b1082ae43e343f0c3de8e35b08c53db7d08386f4c43929e550a8876f0d16693072219028c4b7663188fb984883311609238e4dc5979978a0a8a02fa4dd4fc0fbd653df04683c155ff4ada7dc7d25497e2a14550e28385c8b5ed0dc9d121908dd8fdfc21c3946ffb8c2bcf139b6377fcb323333f3333f3323c153fb0ba9addbbd110b5b75556e830d687cb6f1e2a49371d039e90c9dd3a393f20d8e8e5eede8da9c71d6f4de9b11474c2e88c8956a55be7cdbc7b51fd2a07c122228db7a551b52a476d7296a1cb920d58ead8afc13113454c38ea9962596f8a0cec5b8d39e6e981ffad017e5d79083fe801ec47d1d6b50da3c274583a0dad6400fb26930860271b3592cc3128f2cf154f9618956e597783625a5113b6838423bc75912a5fd4bef3ba42f7d8ca7f932de8b5e66f45d09758a4ff2fb22a14ef14bbfaf0e2506742b85c1419f747a21fad2c3107da9fb1afa9de28bde7bd1c3e89ee4ab217da7f89de6f742f4dec7743ffa47f981aea75887a724dbc8121e505617a8948f8418c0a076f5975308b1038a1e3528420b3e2ff93b82c04a83f24fa6aaa26355368efcd621bf63f2db46be775e53b94fb52af297a0fca5a03428bf240794524df6c805a61fd425865f26c64caffa6bf54ab732a25b95f82a76a08c8a953bd7b274ad020843c7cf7334e87d1cb120b5f4aa8504041a82f4e3d3f48ae4e3db009765324ad68ee3baef74c3e8e5bb18bdfc1bd5462dfd8e986bfa8d7a102a9ca9f45d4e51de93a0485fab41ff462e7655f6e5a845d7ee73ad4a7c46795d41848a40dc216e7e2e0dc6c8450e55a3c1f82f31ca28638c31461028c61863f497a86a30ae14ae58e39517296031d670893246f985747938e60541da5104ad2526df8d57e90ba7fcc239e917523abfd0a46ab025042a9700d686851caba4394da10f26b180830551c45edc772a42b9861e04b648951face45bf7890a55fc025dcaac90d1485f6030307352fa0e7b81890e833981cd6266b0239a409b49d47069319226b1a05b16ada1726576f7f89cfcf8bfacee638c3554b9af16a1f6e5f2d03a13d46b382bb82df7d9fc7cc63d4b191e37e99ca1b3d9ccc51c4bf6a14163c486bfd7323067b3399bf346d58ab139ee5d4efadd8821e86e27ba65556e5295391ff3f81e98a021f360752c168bd55ebe02c955e8bd565beeac49e9f6d6fe876f6aff04e1e02adbd476516fc9dad2d1d272b572b8dadba78bbbd5e2f296ab7734d8396ab77ac8f1d1b5e6c8d114bbbd5b2dd917840879e9fcbb1313942b9f98a0f2c315f282f203253dc9777bb2d2d2b2663cd4fd084557c59f04a5f2947b9f6b554aeb05545d1f0fc00a287044e662b7db6d865236b98dc3c8d4f866c65994dee82d8891ae413a9aa30d3dd024800409c20654567b51b1daf0f3d26354ac23a7e108e59b04d4c681e3acd2f3ccddeb4e4428a9d2a04455002fa0b1a4464195a657d185fc4c0d9e34c834ab52517e404bbe9a1ffb35f449bef4d59cbcc96f831ec9c7d06f9de4db2fe6e49bae2e79216006943678a3556537c15a324985be4451de0bd37f073a8bbebff7f68b684253f7853e17beefdf4fafc196683618c62f3688faedbe55bd8f280cf8632014fa4b0f6542851db811fa1ec5972889fa2868fcd06320f4fb1808c55104422ffa4cfdbd3f2667cd10cd0b28e839978d705fd234d8b1065b7e4bcc643299686cfc48771a8eb9fcc48c308e7d9a6e6f5a901354effd918d9a440774561d74c3363fd0f9b347e94bd4858623d49f7bc0ac651d1855ddab3fab6059bc3729117210aa3303c1a41ab20d9d41f55fce41e94b3e34b9b4cbb2f0fbb35816a360531e0ad57079f843f901adf95163f2251f7fa0353f624a7ff235256ff235a53ff9f827fe18932ff998932ff1f7c2e44b1e86c967e3474cc9977e3d05e3e4537d36a4133f8660137b957c9465f0a308b1d7be7ec4ef04d53f3c40e537c036804bb00af0e792138f6d4a5019002b06e28b9e3f0423103f7ef75da77a8272157df8282eabe27f5a0195b56b66e98d2250802a7ab6f137996217a50bd2f3f3f70dd28700c9f3bb2079fe505685fe8d136c2bbf8badfcd51efaf4037f43f44fd32bd2b7cbe27de0cb387f2f42f5287d87ea51f2efac928f6ddce69d155ffea0cd113a1ff432f4dcc7360d32ceb373df9c94721fe3b00ddf30c736cd628f363978649cc5369bf25ff724865023dbd05909122c159be25f9495f8940a28bd9af1c4c9dda896a5794e934945e55e81292a15bdea979f424f50c0e92050fc628352862726cfe48386b1ca0fbdb9208732a84f0c6bd4b6e19e3b8b8473f2292d138a6aa565c6136b2024e69c3070829260089cf91d776c240f510879ab52bea36057209b0689b45c96cee166c771c88ee4b4143cda888e2e329b47f0a043de70bc5b0e39aa4daf463cecce911c1d38b319ce461c6779453c233a3c297878477270c86e767066de0d6723fb5015e0cac9a7a85a2d4c823373f4b856bbfb85ba0912b93a358ad1fe96fa81aefd1c6dd47ed912f878410982da2f2510bd76ff1ab35bd2ddbf5d99ad064128130d39a0e14a48d3d2d22c128e0b4c8c19b421b722467ca400adb4ba39d9158a2099555992834a1b892375b8e4f12d0836285fa6f4989e9af547a61bd01004439a1a7fc61eb9b32ca0972f8f884e703855ca77217605da6950be04cd3cb5b32c364438902a7b746e3e40b51d9ea3234551e587f2889c1a8e681cce68b62af21935c22162473c75a757a32316942fbfc7878d3680ca7d249f55915f830f6800153473d62847a7e4efa0f550f361ab72a47303d25365ad86a2994f0b192a7f231a9ca022546955b8a4f24b0dd4e69e6ea005f5937bab59d4c7f52223c3a7653c9e6cd644911a6e6d36859f1a2e1123eb53e57beceeee26017be52f4966de211fde56a8cbbed59d9959f2102768e61218507e67b9ebf2fd02a855d877c178b652eeee7ea174b9ccfc5d5cbb1edd05f3964fe5cecece0e5658bb77777bd7963958af4eeccecea327bbc05e6affe7a6065bac8ca0fb735166a7dcf48386a6ea02a8d139dde4041a9a5a856fe566f56459fc5710a15b435ebfcbcecf05dbd9bacc981f9a18e0ef1932994ca650a8bbdd05db8fc647bbbbbbbb27df6c0fdfdc5477cd4ca639eb68d07974f7f6c6f11107473cf58b3ef453f4d1f0947fe87b4ff977dfcf8d39faf930ba0ffd7aaa6d8cbe53524ab9c33bd179c7e78793a34637e8298973526a32fd833ca30e9007ea5bdb9a487fd7fec29adadf44eda6d71f8c111f40117ba9745e21d18f8eed4707068717fa3c29dbf6d9746c3f3a3622fdc3a2e8fdf2ef18eba08819c85e215531c42b345596a5a18bf4384b04d336ae8ee6a3f040bd1f3dff388bf43efd678bb8cbe929ffc93edce3a9fecef3f8c7597b22828ab8f3189b3992fc1d99ec40bb6156c57f6b4788d86eb69b73cec1dc6c446c362237db2d66fbb9f52aec211efa109db6d96a355bcd660335f5318d405dc029321a74d088458d067dae66fdcd0a3dc74967bdb4fc5ca1f73ac57b84ded51ef23ed4de871e86f721cff3be137de7496f5f3b92b4c1d30a68d730451ee008b41f8492316359e6fb5f60571e58d0bf86284423fad48834687c686868d4f0a1518386064d911a5b84c6c616a1e1e3d3e990040f537662fe7accdf17c85b60ecf2b23cad1793c9647a6917d88bcb8b0bacbf5d7878bc976787129c68b3d96c211b0db1ba8f7fe76e53dd2405547e08a771402f23fad1cb784f3a750875ea2f39cdd30c7d353f62e887be86e4bb87117a9337f96ae8877e5f3e24dfbd0cfdd0e9c5e84b1ec6e84bbe9a1f31a1277d4df79dfa472ffad1c3207de9ab097da7fe4ea0efc5e8451fe33de94d5040e553131b2a3f9ca1ef3e641f12aa6b253ca0ac2eb0adabcdff04a6f4ad7b647c9cce1c91acf2ec4484ad3a086aebf490aeb5ad6b2d6b9b732a55dbbad643bac6c5aeb5ad777c48aff8bbb629ffb95deb5a09d75e918eb198c335a609c9a121d316c522a89ce3d150670dbd877c0bb927649f7effa571d6e8fda4f687a1124aed0f0350736ab15aa36fe85ab34d54cf5915ff8e080a1ac5741f23fa913c0141630d3947a693594f8144df0c4f71557e29f0c1f1635a8d99c63187db1a8d8534e8342ed63c76a4358b5946635aaf8008990d01e20364377e4c8b813ac4c4a92e2d8814dd8d1bb87a0d396801ead2788e509b6dc081967d3d55c38d4a29db69ce30b0179a6486c1b08bc3c4f8f4b8bbbbb36034dad2624b9f968b0bb602a39452988b5d2e306f17ac65013ad09056531025ea7e396ab8b3a8c388279034319d2069e247d0fa81081d422411c40f52e038ae9b5684175020842042f4048104422841841140685c7fd692339abedbf4b329fcdf1c2185eeee96b31f44756941d082b3bbbb33373337eb08d90891820e777bb77bbbbb77777785a0b9a0d5faa1882882e082266e20057fb0bd511a8cdf52ada87ca5d551d5f22f05a657fc31d8fd552a55123ea8a40e1e1dac9c7cbf2a7a7bfb8845af9c749f3cf32cf13f7327d0847023052472b013eb55820722ddcedcfbb55cddea4d71b598f7a3b75cdcaadcc2ccdd6af104a1455237884e13356cfd70abeeeedc7152f5cbda9714c91df2bb3fc9eff462f4dd57d38dbe93ac19bdf779bf2f7f1a343333481e0d9a991923148a8c76ef3dcb422c5b16d1fbb30fcb72c94a3fb32afe1e8a63a18f715ccea2c08d09d5c3bddd6891071777cc70ce39e7bcbd8706fd7907d75cbc36c3b7ee26461300803e19484f325a77932fa133944c9f0ca86df0e433416d83255f0050eb43bfd6f444f30b7f7b22003ab444175bb865556aa8614b334bcfd5356234ee7f59a7f925bfafd3fc4e2f48bef430e8977c35254fbff4d5d49454cbb295e34a95633962c195a0685a96854403c507ca95e4c404ed1ab6d4d824184f45ce7b128aa2485071f4a9568537dc2bd4580aad80224a3925b74c10a8063337ca1941dcce28e3d3e855ac7103e351761d6a41c74372afe86d1fe162f2a7c120e87c297fe4112ed6abf8827bc9174ba186a1464dd1c845d77ea9036551d7d9f48abf3003b2a7f2a3e48fa75cbe767403e334c8bff5847f9ef8f32815e87c297d4202901ff7464ee48ffcf1b813e99dc8b0cb413b1d61974347f5ef72fc38cbf3e4cfcf0b86b8a9a1d7f108e5e852525264cccc2877e3e68cb3e6e7f294ff9c9e02e32cd1fbda5c292929393af50175693d72c414ae614a4aaf28b00af0af61aa15581567c908f7c68d5a906afc66ba177d4de8e7d7742f7a29faee6be687be46f4ddcb17f3430f43d4f17c18a19f9f8d1f31f3450fa37bd1fc4c9ef2ef219e108357878279c910eae682b970f97accffd6dd73c1606c333aa0dc4d25839b99714b99e19a3123e3362363c6cc0c77ce91c1393332e072d6cc4d0855b6d7c3a22c890e0557f653b5548bd2f26da9561a6cd54a6b57d5da1a4a8c4c0cd5eeae6aa685ea5f485542c4aa730c9d1e253067fd9c347f1a53eaad8a77f7b2845810589ab79e07b32ca0ca3caa87ace3257d1249a8f4277fe3e5df6a9d4adf6902257ff231262fc3975e86cfc68fd21753f2279f8d9247f46081d95f858fb8d3f965ce8d73e7c690e39c5b7f62094b80c10da0312114052d488b58571881f6efeff3f42008ffe8ecbf82896e71b97477b75a72880d31a04d114488219c0ec02477f765462fc23c1004412fce18a717bd18bd49631231b6125fd0820d39463e3f9630041138b1d88a1e4ab117d47cc115554bc5324a299da5bb3b0341f973fca0e64ff8200733234fe0cc15466294eeae069bf3158e7294a31ce5382eb6cb05165db0789b7116a514891800b1439c02072b92d048ec90851fa2c5e5e2ad96d4814e1226f8cfa13b53392723b3777b777b93c0bdba2b8e70840f32c7bad8da5e9a0df6e0be87fc960699bfe52cee9b9de297dff69c3d9598824cc28de77edc8d2bbe40bd6166f4e28b078220e8c519e3f4a21713e3f4e83ee8ac18410985b8e38821ac2c41fabe226d77c9e8f2f66e978b373b3b3b278393931545281898883cd8590c34ca96f21b2699d991a04be341edaf3fba6005102c8a52b9ae680245a9fefbbfab5d30be7b7b7ba3fcaf1137d58310410d3f881e31c6821ef0ca4aab65a585b6b2b2049e952b4361552d2d57cb39c535e79cddea96b1dbdb536a7fcbd662734def6eef6e1a10d55b5330dbb0039dedc0ae524d5513343e3333333333d3b450bd85f883e00b09896389442231fb832a6701e01d87ee6bccfa120121b1e6e467f81a19def4a697e16b66f893af31bd0c2f4f7e868f91e14d273fc3c338f9190230c3034086377da7f8fb02c00c9fc90b3b702304abc99b7cc7b5a4d4a4a4c4c444e4795f52a2a865e1e15083569ef466bafd4d01abe21f512aab007f0fa542a5ac8abf0ca813948b50e091104c016fb7db8c0a142244c8cced769b959a0485cec77dbf1510743f3ed713ff8dca1f2a2e8b951be2b7cd0b4f58c1ce11729c607bf5cb38cb460c083728f464e1043a2c14559801e147144d38e10baf0310a1044cfc20d18348175efd3cea01fa9aae9002dd6fe96ad92b3098abbbc505737971cd66feed2c64832e4a998cbfcaa1b521dcc845376a21bba1a672a8294341c83c1cf75cbd61a9108be1a080f8354c957fb02ad1b98f7d5830fefce6deb90f87f93566651f5625be73737e2c3b414056ee656519ebd41b3c18212748167258810940dcb81162930228ec00082e94e0e5322346e8600b498ce106af48811ccca004b49b4c0a9c570c55ee452c3b1121fad0cb88bef54f8686a7e2b38e37e964198d31d2e9cde9d149673de2c57884a7c6e723bde2c9f29b1debbac0370901ee438f001cb26bab57cb32bf189f55a0c829ae3927bb38e98a1edd5d2ed13dba3ba703f7a568848d486ea765ad23931cc7011e031b5916ee8965b50f46506c4446431555eea7a96d306779274e7eacfedd87be43c996cd68b21da6394bf4dcd732d1271275229148f4d588befba8f75d37db71236ca4e2c051d658bbed5d8ea4b0a6caae339fd691edc88cecb876643a3299ce8e6c877380f42a74f7ef1e5ad6b296b5ac65251f507b4ef0edb8a5bb68214b70c3c9691e4105b11aee1154507b686863da4a66318f754fdfbac8caef9c65e9387b9822e7711cc86311e4b5ac45a1d08b3eec5bdfda6f7c87e7901e8dbb8b5ab605ba9e8279ca1f45167d34e81e731cd7e1b11fa8cc53fedfed06f2d8b2748ec7fa4336259ceaa1eb60e1ce9138a788e3f098db78ec6693939393e3361e731c1ef358afb8e831b7e969d0df63319bdb380e9bdfd83c16cbc9f1588ec73c36a35168204080d86a436ab521dd92810001c238a827bda2cb22ab7f8d994d35a7f99c9486be292b8f4c76a0dbe08a2a9d71a41c81986ab55a2d728c9102a9ce3f2cc5890a29a460297ac55ea3b150103a9ceaf2ff1fe51fa64e4f52fd632c0b57ff191901d0a1a28e6b44916a8c3146067de7916ef52571088002da35fc9f2316a467d4c6186344ad93808652472879a851e2ac4afcf842bee8cbd10bf922798aeae9550cbd27039a39c59fa7f8c9c4007df731bc4f865ddd6f078a31039299911112e374c136d8806270323336d0cc8c4c0c9b4c8c1999199b4c8c1919cccc32369b8de2d01e243e0820c18e5c7415fdac4b81931a326d131609bbc4748246517d8aea23166984daef0b67b8c8a81ab2762fbb6f8a6ce081b6b4386e398e736f71de52a95c2e31c618497ca6cefb542fa9cbe21d4e79a5e108a9faf36c59222f517d91507d9b50dd3b76733af8f4b8692e7a8c31c69728528d28ae3c63204c00f1e79d15ccc75dc5e77eae37472cb85768fa741c8a6b8fe2fb88050e1df7a7aee39d66710e35e7ea4bcb81109ef5a821f354f76838f8410db986031dfedc533d6423d53b11c71cc7712199180dfebe6c402537838134e891771af4998cd90e90086416b91d9e6540f28e7c199daba8b46d1815b5546a46000000400043150000280c08064302b17044a06b6a520f14800e7c9c40664a99caa3419643398e72c61863080000000000c0080c0dc0021c90f1e8fee07974591ee883225ee799f6579c7b8f4cdd3b26b935214ff30cebdbd31096a56a1aa7349eac75beaee90146392ff22aebaa3fb1d195164bf88860526aa4538d73c3e63873c6d43e7f12288a3237a1deb9106b0751a21bcbd23d8d87a81b3f2094232001ebc36d346e4a4e9c77334c3748a862a4e81d71c3e7981acfe211d620acf10ea9a9eccb93009a9e9b8b494500a128c366fac18cf497e64e1c983eae22553197621edcb45437d14af7c09b8ea869c0f63a0c0fb35f98b9f5d4f994fbd7f1cf54abd8b108e02f6da714b7be8fb7a74c298c3089c295ad24516212ae91811311d2962245d3803855d56de92ca55a9045ca0990953229b98c0b90823959e4e8512709eb0d762edea7fccb36870d4bb8f8bb82227a8900eb859ab02fbac8c39ac52cea57a805e2c1d6f85ac1d579705649a229141d600b8714e056114968937e1b5335855f43373d883e01390c0cad7b67cf49b9eee7e6cf43017253fce404b22fcc4e4714139424a29097d6db32bcd6739b05a14592b58cc53f56f4e8e259c3a8218b6984b39e813e441972c5b2403ba12c58c7001c9d78b55a9f4090bfcfed6fbc11e023b839fd9622fc8b5985ad396b846e71890acff747859f71ebf20f10592bcf81863c04322f76add098960a5d987e4a165afa31727cd0d23ba617f55699cf01af4bd8f72e15de2aed42b8bb3a464295a5ab0a9659e184f2ba07c8a8820093b0e64a55c25da4d59c84b02a6feaf245c5a67c812735ff179ea41c31a1bc8b3dd3f5d2fdff9a8f9c9239b37f3c0bb32401f04071baf142a03cabf31c97c625d79734c0f682a6294bf45c18b2d40dc478b876d452f55b8e1197929dda8323e66c6f6ecd2181a9adb09b5fb4999a7664c4a1be44300ba51d39a12bc0f862bc7e9288edf3f4cf39f5faa56ef6bd1b47de47e707ea0d3a04aad543444862c18beea801fd19befeb571e64ae0a3695e0ebb8f33f5975493fa35e49ed5bb1726f5890c96e5a25b4aee7115d10a832a36a331e1f961a10bfd7260986cf2d65fa96d21478bbb8c20c74979e300950c3d880c4afb9b214b9e1994bbd09934d01ffcb6c86adc53637058d346bfb1322528647d91ebc32088bbc57e53d28a650af6403b19f5cbd8dc93b637da5317dbecbf3b6d0e657f4063f794726826185a13050c95ed3945be82303b39a304380aef8176751172b05197b633ecf06e49490e82185a2e2101e4a3a97911185366c67ea1388147afbe82db0792a7a9d59416f772532a4dff91ee3715001f3343aba8ea618fda22024fd81002941c5f2fcfd350a64e3a703c8ebe5d435414b8ec405826a13baff13b27e630ee1cca1ec243e59a7f0e617370851348b46f88e4c85e0c82812091443a61727794ec719b1dd01485dbcc39a6d63bc33b17af7a3482bd745bcfa890e4328d6140d01d49398c5cbe41e74ec261789f7a913cd1a0f539e0f2668971006e8d06f8a63a132c965e1e12cf5d0b287faec8ff7a018ee6a2f8185cc6c653a19bc4454bd09ecce347c722aaf54b44feb4afabb8eba769d2fb2bcdff49e65d5400929a7b5b9ca2216edb7c04fd1b6218a948378bd47dcbf8ac447a986720a7916bf120438a57a360db1978318b75eb71dbd94439c8246dad54ad19be49e84bacc038617a21a175a86392e42332e1bd98f7da43ce607ac58801e29fcbddefa926041179abb5343271f5dd9bb590db070e870aef63832b971ddcbef8b82ede2dc74c1afc502e78cb043848560d70abd35af4669e00a4d207c0d69555a714be21c0416e63d2e00876c760611846b0b067085da947e7bf4b9cb3e700134611a8c7f95d5cfe8c019ce36f265a23fa4b18162b9ba37c33ecf9215b91432334c1c5879446144a7b6a6860d2738784423e7eec5b340ba7802ef7d52b57f73f6951a3015dc442dee060770840244805a2764bceafd0c3bb8b78a95882d8287b90fcba423192af9612f52b8731e9ebb2653e7829a067bc0bfa6235194936f36c85d565f81a6a4d15889af37e70c1995b74372c57d881ec7188283068f763cebfbb7744cb5eb87c8c22bc6056e310d4d4b39f5f368a42a0dfb4ff983a793cd6b56147c9dada78a235f7e0e773611ae56ed3dda247a8f1c3932e9497fd3cb4b68e41e1a3b070025a214479da89da37e2f9f762762cbcd8904d6a4dc6c994e7d2a362b1bb2270a1d29f5190d9ab67b06d51f45962bb2da5f1e411b70caa7cc727cbd1c74ff7dc079987d20e07552c75c0878d63a0c32336c313df77f70a48c4b7ad30920a196d4731d368ac6732121be1d58860b650ca905a886245f905e71fbe03e58312f31cb48b235be8fa570b4ef1863e094738419b10e660ec7c0ac6dd508f5a6317a475a5a7a082ede93938377b4f6a4f21e559b01c074243dd802ce9eac4c514438d627b78836068f2c7c61f4bfd82e6c89e19636ba7653463ce79e6f9c645947a71ccde1424666a314ef1fd28157fe9a437c58399e514e7643cf5b2cd8b0647d6e5fdb241756d3c75c2de27eef9300d8385eac217b8e0f1a10b76847dc0560af83f53381962a3fa4996a3294c30d43ddb887da330137b940dcb14bcb1d2145e73e771f101620b9d1eaf2982a918727c1444c555bc7c850e0118bcd0496d1d011df771c2bc65592b5277abaef71cb768d1aee8486a538bcc7146e8c1cce9364d13d58c860514eb7e041e9dd1496b3929daedefea8bb950231387d5eda9cf8d38c916751d7d2ff7d608051728ffc0df8b8801ed507edb02304d5b746d032f69fbfb2cf73b18ea8c6f8b21aecd7a341b76c423d88ab25b596d2a47d4749f155b834d07b7533c039608314c79b9e2edabf1f21432945190c1e0d381123485baf7614a5e97363b9da925a408f0109591c7ece4e721c3331b08891c03caa6bfe5aac7b88b684ce7dc010ba56f647a19f6f3acf8ffbc164b9208a0f0550371ad286a08bc5e93c4ce3fc910927a6820851a09993e480596297132493058c56ebd8f0066298e2d545a5cbe9bdd86371ec1f08337f79047f8c46010acc50769268a7c93d2ce158360465a1c026115aed6a939b0caee1c6f33d6cecfbd0d545a1aa23ba10d2329a4f8d7eb32875f2f19458af25eadc548b3cd170d62035ee17ee30bec2b31dec48a8604de49cccd56fc29cd99e20dcc6620361fc08008c957aaeb27bf9a7f957ca8557bf936329dbae16c52b661c0f1321cdb2b3bc4c4d553d26b7e1390908a9be35e7d248de215eb44ff1a1993c1f7af1b638ff320d4877895e8419bd0e516f383297c4a17147d3a641ce89798738c7b1a75ce5f819cb73ae4ce87022a58d2a6e845843c03e4b49d1512cd5faf8db14ea7137c1521989694fee10e76f070fa9a55186093226045e70ec84064e4eaabc1785272c2a220b34bff4d4babef354b4bf23f8ce4ff87f55d9f53e14621f1d5319309a460257d89d680a5625fa9d4de003b74d6353b05b5d3dd869a8a9dce1f129831c98275d32f170a89d7e43d5fb815b492b0984fd92877b231c5d342ecb37a3df31714d63f187e2ba7f0519729c038ede486528e08c4876d0928cc09e9e60a0b08ae23e3a316575aa56e35f6b2e0ba0e242305f222a834416a8bae459f3cb30607cd6da56d3b8d86a4455f14454d7a5306380892756d142feb31bd934ce097a39485bfc1d6ff64d6c9951d9b16e7b9ce38ded2b9c94de697e69c119940410256b00d1caebaab90eb47fa979035e3c151e15f4b00c91e91eb979f8c06563e1ffcd6a5f4b84af9105f092648ffc6fd0e5acba03408826af7ae784659e1b7c288fac7f2fcdeb809882c5b57e9e58a58792bb421d9db27e95d35631a9f0df826922489f27060df65f74ac80dd62f78dd0f7def8943c12a526af1d23e09e6d44745ae618b4467c749c6673c85dd04ce543455e0c193462248350fa9b669ae16314a3b4f21e0988beb86dc787340d9e4fd0c51dc2c0c5522562e735fbd033d5d917f7bfd371804425a8cf789dea45002fd2c21bb6160a4d0cca9f36d5780dbf29b97555f398c6c730a59de9e0aae89c7e805fd939d0a58ce3935c7dc9c9ed763d570d3dfe42fb679c603011be00c5795343e350b554b061a2034c86cb86edf7ba76d400e460037f2f1653325efb4b2d01b8212dade81b1a2acd3241455efd6691375a91f2efafc527ffe7eab659d861e22f3e614bee6f4338550552fadbfd2939f9610c4430667f721bdfb3a91074b13d1bcbde9a53172eb8e24cf155e643ba3dc04491e42cbca31ddaee51e2454f7313e965b3b60d9e40c574651989765f2e480240ccf9d18e28975a75a0b456e54c13ab16d78f67ae97e519551c5d30d23cb13e92031e37a5530289b610ec811ae9748dea94581cf50022d38d501388915bed35a588dad6e424c4346e19c15d655ccc0e5104d9424815aa0191d75ac1c42c3ab415e884991fa750d61fe836f94dd92d4f83294f41e5874faae3a46fa4df4be90930cf9d10c1685bb3a20cefaf575b18a15e20fa73388d1c22317a99fe3db20f7e508160b369fa0f1f70581823ef13a5f84f15991279d6a591033bb586fa06e8365b94ab9d08942d6e454cefe5d2470d3a07a6f2d19a0aa8e495a8d29ebb4d20b0728af596721011c7cb2d94697bd8e2f09de010ab6021b5802a182a7e8b647e7615c0664f5795ada322b56bac7af01717a47a74b62acf5a0dfb1945e3d68a08445fd04b8c0caac26fc32e518d93d65a6a18315120bccc62b965931ab11cdbeca02135a329c08425e4027411ae65960cee98554a53fe5c1541e8dccd47eeab5f902d54960313bf0c99140e76a0ee668616a1534ff9df555246c10762ec1ccf828dc202ddbae41b248e97a028718bd4ed0e72b3cf9356bb4f7899d0916e3470affd5e924d6b346e4fe88fb512631f4545654263d91cce8677d26b2f54f923a5db8f2093a521da1a108fa569f79e173601128c2646576d835395cee8620cda02a4e2019d38f202e7da348350e5481fd3c3ea3d72bfa18fd37851e07d72980e64de8678a715b38ebe9b747bd236e1019ce3e860b3a2a18375137ff17f921067c4b45225606261ba0e6ce37c6f144e3b306886ce5506f0d2074b029aa1601d08e3f66efb240a56e02ac8484f3d7763ee9047a749ab3ceb6c9033226e392bd01574a0c51cb92cfdedb0f205b46df13f5086c29d8eb623482373f497408f9f35522dd72997e2ecf930cbfab184d49adf211fe5c6496e23a8b0bf12974d231e2015a52d9bf038878a8c22bdac75e71d2c302de5f04e141a6b095dc16264261145ea27a07f6975dc197d17e48d2a6386867679600257a83ce1e50c63d572cb8ef8295e21a0046c45991c9ec13e1bde69a89ad0e584778d7c9825fcf25f1f7bf0d1425607903ab9585bb806bec74e41b790057579ef6067177ce910532364978884f9aecd5aba3035fad31ddc6de8a0304c2f814428128a880a4cf8362a3351b4c48935df994f99cdfc0b476203398c09b7e6c765c3b5852b6bd4660f3ae7f460049be6c8835b962d09972813efdef2c9df450851f57889b5f94d1380dab47a2092d7b3609c386451900f28a376fea555e622292d17d1e4f7ee6c909a7a8c5b2452b165fb634602d0d26fea17516b2c19868d3e12f6f6a98e980e49147d67912bc749858d5745440b899794d178103052c92715f65c3e70459523d118df43f1d3560f511f81e25747bbc5ebca841a479f9826de86285ddf1707e058c8ecc63bed6ba30bf9182f9998399abb5c4ea45b3d2ab3417092df78dc93ff9a574a62fc59056cda0164616870ed6afd2bf2b384e390a7e0f222bef784fa2082e1b4751ac9ba5fb1291db08f2c4052b029ee4fe77d300817571cd067e968c81621f8dbabf4c2a0c7a6a99a71cc74ae64673041891b7ca384cb0aed28c4bb34e69e0c109fb34f2509b371569282b1c1a3812e009c2f33ae5c7aabce350381f15adb4e91e18eb786d1f7fe86f2c5bf059c1fc96930f99b8822fd493c37dfff636474f6ee04e1f63c858614a4332dbfb8522761d0106799ba457570983611bb213cfe71f520428f443cbc750838ae8c5af6ccd41f15ef07fda4591feb7a2bb772a335b627fc5ea94cd674cae8afc06d2c420fefaf9ea5b5dc8902f9370c4f62d90442413473e07e792a0ff6639bb292092a5db3dfb4de2f1050bab78865c9899b3ebc38b8f526aa7460d55765287b72cc8139b3c67ee595a004c769f073575c52eb61236b6c9a3df5149348ca97425011c2db014c7fa91be3e588f801a8900edd4c9f1f8b0c903774f86ff6d29c42d7d37c2edad7bf8ce0827b4fc9c154ce43439ddf95f235b220ef500f345a234c158602732aabc611d396b4dce134b731ec90bdb33bbd17de45724998ae91872ca7311be87b9f33839639ca73626f44c86e4c5bd048b03935ea58a6d6d78a83bf5195d888d77e79e1ef9dbf2ccf89d650135defc71799c324aaa9d84d34c87811478ff157ec001e5070c174ca1aeb58b526bc116df0a27772d810348e8f18f080adce23e6c5c624ad4c37a3b8259f112481ae8bdb92a12c344753ff06cc7087d0e859488b19f060df93260e96ef0103ab392510171e77187d1ab450064e262d9482d5619fd003006a5d874545425c2720206a970b92715fc33a13ad33257e5303eb85a89c62adb16da62ce15ef5a7bbbf122eb76be6a81e0c568df064062310a14db2d2872ccf8380d53fa32d3ca11baf15678d9aa2c4d30717a12dfe811437e315d6490b58219a2dd1e9e07367b46757d9992d7d3ae8c00586a8a188e98a366c242bd3673e2fdb75bd7b636622b8e608b77d09f1407782446696b1529a8b5966adee225d26611ce5fd4ee4527adbcc58f79930ce17ac5f68bf5e6d229f8594177f85954eb520dc9a1c2ab23e1eac89af85a1bdd836f1367e78ea065d22d2c246f5b2abc90f00f326c38a642048928840e6651e1ac2d7cfd3bf1a12a616de8ccd24ab632878df21811454f964c0abb3b321b37326c32f3378ee05ce23af6a19a4ef76324c4b26d6c8c59e9e63e6886896a45dbb8346094fb19a21012e7ec7f115ce8f522b32529cc52517e0ef5f1eda8a9f0f8b83aaed64d4c100484756e0a9785ee5cba47d23574ce6dbcfff9f4e78a7b0d8a4cf45222a3c9b4236a057db11930650634f3f7516a2a1b7f7c81985f6c7357032a38dbc19e3778d1c0e42a84831e48e763e7146e1ef7d188fd29fa01043d52003fb14d5e0acee4c1881cc495c5dfdd85bda79d4f993c4e5a662cb352990adb151761c26e76ed1c7117260b4d77dd607d95ad1f0112d6688d07f2417f015afafd6666e3382b4524c464f0dcc3b35d368d0b86f1027b139b7ae6e2182d84d80d15d7e12cec3bbd8ff3569791efb1ee31c366e5886232ae3e3b907e131cfb60d0b6e23470f67140ca406431194c8526cbcf3ca1b8c14d790f26636bc8c16117fa40b17d732c1d0ccc70e5c29214ede0995e43e61eb9579ab034f135c09a62c3219b6d8db0b1893cb7c8428a117e51f839c6f3a1e3b02de240ca387a556754023c6fad64e920acc285989ff92caa73592fce5ff296d9664a29743680de770d46c9d0d6237b7549d329a938986c9ed5c71d1f9126cea5a3908802c69b676863b9fcc64a72f30882adaf35001e7e379b5d3d7293a0df64529eb16a4ec1fdfbb9d5cf07ff0dfb1943903001d4b4232f623d500f7a9bb7e4a4b73d856c3ceb9a17a2acdf78b564062d6b5b8d9531d1bc68c220f3e56c46a2168fb70be437daebaca75109f277f1de69e39fc3ba0bcbe2d3bc9cbeafa88003db8d870144e049ec05b40679382a1fc206d6d6686806464ccb917d219f131bf63008237ba481692c90129a055e925c62bb932e9cb60b7c5a6542e1e62de9d2c4190e9da70bb112edbb737d6a644be00f1ec90476c2b2a239d0dd66dac72dd29fd607154b06039b59f5598cc4b9f7f175d0f34d6af9a58a0dc00e542aece3870c0b72c05e7e144df84839e7f0077a566f6d05b48f39eb63615ff245114d3f980a2590f3dc0810754a92412dfc8d99a2ef59eadc85c6e59d8ad3b3a498dc2c974392f072a4489d5a03c13f4e1f03f17887aec9200974cafe05d91a1cb3f2aa4cc8af4e22b13f9b233eafdb82c31c33fa34971e8ec0b94355197db40ed217bd1c77419c1bdb772e5a104764f4f63ef011c484ac0792f0fb9399dc48efc9f84ec242c290b8a188bbd66aa0c9407967bdf0660e360dcae56fc88a4d835dc21b5f8c548c80a222b66d518a10e9694368e01f8ae65b7d611afb2d4dd0c1b1af0cb9624031146b7d4694564ccee23104aea52c03727a2821ef78ac153e9914330aaa49887b11be2b74c3c80525dfb3292ba8152ca77e933971698b0ab42f118500eb5c9484cd45722c4cb52d32839fab815a9e4c2465b002c8ee76faaa221a838f5e07c88768f80bfa4f00bae766053c43480682ee1835414721ab6c7bb113e3f58f3d7d779ffceac9c52860f0399bee76aa5f373b52487c97caa98153418fdbdfbf29d80db47789c5caf85a1404d91e8b17ac6fdfa754b3594ab693a9d9ffdb735d59aa2a7907cf2c4eced31cc7d35ba27627e58d4a9e69a01dd5c8ad292dd4d6f84aef7922aad97b4d1771d80fe710b806fb2f957fb2b33f7cf02f109550e6729d5048f318991cae3aa1c5e045fd48a1197b780c87d5a0d94e1fcb15604a74fc31011e1c643da09ed356708f44fbbe4d138c31e03e0796c3b13c77e7b3cbb9aac86eff3eab58b2f203ad6ebb405432abe84a6c075a36018ba0b75d58a3ceb41ffbcc99c191dd575525f2195a6f38c95224560898101d7fbea8cd0ebf844d03d19c49139893c6df14419c3c10a4983511b5c12dee3f5abd0e9527fc8d4f45bb526016624c160ac63861b7123b5965d08b2c4143634307d639eb0d23b093875f1284e0f51e8c8636681492d3e11b6598038cfc2da167e4e8afd61b379127772b71b7714b97a78dcd34fe7d6a107ec05efd3f2d8ee531354780ee2a72afbcf1cb0c93872ccc6b160751e43c2ed4c0e110dd2059352b3ee04b7a57f16a4b7ea86676f5211aeddbb387b018d80c60a17d26d9ed067efe108033e7d0fbc3e0a13ee3deaed2fa9be486043a37431d7e2073e2d8e256ee5ea9bcbcf495a5aecb371faa94f40b96beb7f648fc9245fa7dc3aa7d4100960a25b9b040e2c4224c89e08f5883c41130f3a8de52447e1846470db03b1508bb43ce1862e4ef835f17e3aa87aad222aa01a624cc271af1f8e1171d7414ced8afe5be04a40967b6539ebcc2bd9c10b37fd109a57cc44823dd99529a4affdb545e73c6d2f3f423f123e8533d894e52c27c4738f6c0c845cf4c19ecc15b6f9fabb851e7ed5b83f5ee54b06406d926557c721970dfb0146768df6a083fd7f57e152f887eb3941ec873c14cd6536c09209de6a1241d3783c7af9215f05e811f751c50651b7baef491cf6a73d6a5cd870778f945288d467ff8fd2af42ee0da397fcab7a9ae01909e846cb9545b7a89386b90063878a66ad786a5a9838903e03c359fd7139b4fde5393935a11193a379fa08cbd4b06d44aa3348e769e3456758df8ff24a6f07914a734787f3ab8c7abdc4bdf24dddc58925ed72a322573cac38468718faf90e435ef1107b2eb44355dc31bbbb67a75439ba963202e31c88b76a95d47714210b1e0c9281c9a4afb104e584cae58fa9a5417c83fa23ce084311ff2a540938a10d31711e1289182c20e58448dc97f87499c4184b8fd72e16cf95628bab0998cb938c234f1e55c506cb5e966ee897302dc7b7229629a3ead39c540f4fc103d7b45a2b3f5d4634ddc730277ca6404eeb5da7925769d6e3d36c2e8b972257ae5a48d5b32ad027ee7656f11e8632b9d1d1f378faf5d3aa5e236bcb96c25b0ea400f9d12046a95b67b50a5e0e63dc85d2c234e6fdb147a1e3eaf8bfa5427fdcbfdad59303e4b3560768a3639d91a7f7df901ab13a2c9dfeacfbb34ad953bd144a851a9b45b38e54d1c308ca75bc5afd3a31579c4d945598b8635725397d7d92f2f208a566f1d4ba092aa5eff9635041a31184f1084c010498126fa6a66943ce64f24e603e95663684e3b4df87d0772793a6300d10f7672a0d1f0c386243bc495722d9005401c89fda6711f824437c786b345d8149818ee3fe63df89f50dcd943cb750058dd8ac75378f49b6ef76f6f9acfa36263a0bb529f1f2b76d029216e219b0d8328b14acaad2da8daf8664a8eb63796d6191173fb5f06f51670c6a4614b91aca0cc0fce69078cea471da2c4cb0f04140888426834202d56c4c51e57d94170408629e6db1876027804c2f9de2b6114b1970fe84a1a7459624230b077ccc063f188f6d798d7afb9b9f5ca0e37ba54b8d9bdca9e5ca93d21493301daccdde07d1327073f6acab331593dd29353d8301a076a7a7f6515044590455a50686ac28a9b916faa266dffb2f7d326a0c09621cb22cefa13f9b91e051167b847b1d07d6e7753537a02814b995f3dc69c88b3fb1bb0395d7a6930cebdce54af6f310cbe3b4933579354ff0883c32dbcf9e9c174ec9aa907214e8ff7a61f8549886f32f2edc1546ade10c0317a5019e34d98e3ff247c917f67c1d148ccdfb6246370fab64dc677581485a2f9d2bbc53b73b484e865a1c8914eba1a5ae58a0167cf840e809d12bddc610685b453edd83236b4fab33ebc046ae8ca9475b2162a393ab2b15fa271462f2151cd1a65d8c462ed5114832cd10499301b86e138f7e6ff59f7d786224de16537b3ea87c50cbd6a0f74c1890a503bf82fae9d28d905e8a3580070ddc548e973baee6e244b433e40616b38ed93cb2bfefe65e2e354346c502b47640769022633d38ac59e49b7088df7d62d715ad538c6f6ebd0a32cf2903d04a3ca01fca37d77c9325136f0aca385df6e4f043a3ce0b9c5f1158b38b95ba9556e2482f28d76d3b20e908f948eb915b605eb57ccb6a65f311b5144ff400c767c477c761ca876c6398ac51489b177f0e5f5140f732607e55bf832e93dc7474867964dc788d85d3506342ea9a9cc0abf8476042e17754450ed80af37969a7c390b4bc5cb84a629eba4ce661f7d3b07590f34a85d146d363e717e80cf3740bbbf88483eea031a81da28d2384b152a55b3230b8b44b60bb90cf392157cb3552a999fd1c3ce04252639e831ce98a64cece0233f75c7e80e8f5b09f786c2219c3d997cf34713223f808ba1b84fce73f2b37eb396497872bce81c7ce47dc353700cb4f0b8babc3d758485b9bb96aeb0f094c262392550e52d269c18a9c54355864a9c7f39275f9cd37bbe04f3f7c511ac7b08e81b24ac236404468888e799e3d3efaa301798380a21e60a7eb1822082ba0a3d522781cdc39fb6ab0f3c8167b48a4f146bd187d5cf79bc025d09cab4f5732eafbb9bc235664829b6aed467a7608b1345bd600b9553cc2bfc5f6dc057a56fb0bf60540f3f4e5157fc5b269863399de0ab0073c914d24acbdec43e49bbcf829933593c07e7c475d486965defb71198973a46875a414e643de4b47d76d0922748c5c66d71e7a5c390205aef2a9346e5cf3a32db01a3816a462fe35896cc86ba92869a3a4529461410dc0efa8306e9c421029d63d703a565f1fd42a02dc26959961715d2adac1bad478a10445639d92e8e67e778868ea9b931076827bb3f6f984926b439ba695b6180a59d6584d45dc025692f24c0915af498ef213e6295bad86095a72249c2ef3ac8afa8a1c5b4da62f8f3abc1013da360b06e9085578d758251a4032d461ea717b8b27fadf3410fbf5a8b7834c656805cd3d1cab0b0f72fb37176381927cbfb006571323b5afff363437d62fb8f56477ab7942fe5b4284a048c7d8b42faed9f834c20cbc2dfc794dc10026f7e6b5a551578a5ba310eadfc8dce52eca544e7e76c4b2a4f00d21e42ef516efb0d14a3c6ace7ecc52257444390550daeff823058291a9116b3494c2a03065fb32cac431946e8d1e2ff86258c44a5dae9354eb3503ab8b1882d19c50432b6c7faf466850bc23daef631d9e249afec64767a67c556a6918f17271fe01432444d560a65b07446c1af7cae3c4ee23707ec07fa238bb8e4ec46b69c2e8eb1b205077b2c449e4bd5a340ae6a2ba8ba9e44e72f1c64d38b846ef074cea723326b8ed75ff0a09c9882b725cd3e6e0a8ee265e2fe77de86f9ce8e3268869a00b50e021d2701639a24d64d55bbf45d40088e1a5a8138264a4b7cd0abb773c75cf09e26ccd79682535edcb345669391c58a8ccf34bc37054cfd6a27ca15725023efb3c369bd93262dff7e3438b7158a365c68da10f45bde9c929ae4a60a8c25abc4231f5820858406eaa3f75da66fc58bd2802062bc828ac2b6d8e49cc02c65012c7c449e3d505b14136f624bc83e761f0637b7f429dc97622a48cb91b6ae91b6a485179b9633333ed505e4709ef13f9978991cc6b11318eca9813b750a9c2eade76fdb3d9bacca1b0bbf38ce40ed9ed6a32026271d36afbae4d31fd42856e2437d848ffb85e2f2958b311d6f08cfa56c368cd0d37317cadc65a4601053468f80f00c5e574f66394770cc542c6c38ba53e9945ac4f7ff47f0be05dbf2bdfe1e3ba91ed002b2aa6cdeb86d7eab910fd32d891cb3389d2b4ef7a30ba956ab3fc6fc9bf874a1a916d68987c206a31ee626487c8363be5e08f7b53654eae4421a0695dbd8a5740bb028952f6bc37aef7212154f52ef866e2f13a6057a8f8870c3609a00a4c1fe261be988d6e3d3dc8e1d14051c111af9c1f8c4783e87c85d0f45e146a3a81a0d50145ea87cd0be49748b82c5731097ef17eeddd0e900572cee64a2b1e5976583a2ead3814336326052c460f5f1e617e5e3926cded1548b6d76376f226102e4f1befcf860269d3e3217cb7a9cd5d2176bd84b98e0deadefdcab62c58448ae183784b703bb67012691e526cd1f28d2e8b7ac2eec8816872185a735031b5433fe7d93bae4a00132c561f687c60e311bbfac831e9157281b411bb567e78a38db08294b2bcd6b9645a779e06db5fd361d06978f0c8623e56c5de3a9ffab652774134c0ba6e0675478fbf78e482efddee7c9dc5ba02ac4efb0c49735cc0781af6b9343173cf07745dc591a213fd10b3eaf179be30d023b89c1638b5880064b510922e7300dbb947fd6e90802dfd65194dcbef30bd62a90a9e3c95f86ba13509d5858f8fa12145cca8c6c8429c20b502a29690936c34b1b522071a1bde25c6ce7f563799efeb0623705676d31e54989e6396c0f63984f04b548ddbdb6e62c7df17b8c01fab4b51fc330b756bd8bf9e0e2780090df621f0034a5986ba8ae48ff53069c766febc5a2d80c04567e42b2a37f98439286b02e43e4c43b6823d0997fb0f941376af0157e3e659c1bc364bdaa26f38af055cfde83d20aa3653963fe116108e028f983217198f670f832111196c25884cc5cb153de0d4307e354a4aa0c5cd5460e7075e1971193a63e03e92f8e718905fd93a2c557ba7506eaa91b0d50cb0379708c85a944dc910ef3099a600c08f5ec04a3804bf3092cc0a6176a96612d83de621fbf06b8175861fe81121e41b8bd11c81312f3a720ccd17926ee463d8328d8a9bd131cf22c441090cac99aa101770a93403c4a7aee939fce5cbf9580ba3ca11517259367b1b75a675b8b284c15404b5118473551a89de3bd775b34d8748073878bbc70f47fb07d45f5dedb9833dcaa323b34a8b90436c0392b1e83821f6f13265b86b435e495376683be1f1e357772e4c4935471d5fb5539b39ea38129f095307d679ca6d593105c4ffca1cc532381172ad40756202cffc86405079c452b46c75099b01a4b6711e75edfbd2f3004de3b73668e801057b07c58e24ac347c30db4e59b9d2fffcb84c85a2bb6020f9894c9ec6fa450ce401c0247e1de475f8e91208a86f878239ee948c253cb586aaf9a70b15ab8bc503b40c07c887d9cbf4a8b4373f50e7a85433baf4cba34e439e8d57aba48a3062d1a9fab4ad6d583b10049a0efe2614a858c34b23f233b61b21a62f09d91019cde5a0f9b38fda0689afc7144c54c7e2ec683e27e6008fb4631e202f9e3a02e513568c15500e292014a41c3c48107ad6396e80ac9207323142710cece4a57efb103c2431712c352ea5bf26954769eb61d109a0b48a36d7b1179c57845442923d0f53886845545b03692437cb5b1046b5e0c2b782405ca801ab9ac9d3c879ba5c4a28ce072bc7b29ac22f5e470f6f186fc3af4b1144391fd15b29b9564e4026d01dbd66eec5d241d0b512b4b6feadc25a938f1f37d2b0278f30bc2a4b6ba60d21d6e794c553f736e2a292378490e2e344e38dc7849dfedc1fc41a1658053c795d922e22e8b4c267cbb4f68d4da7baf878c3a404162a6188feb1a4c38bbbf3be855e41e28f9f4745e94c9fc6f8f4f3305d745cf9c06bf8eb6a8c796e8fe98c49f6cd3fd7154cd0a83af3a072b0d9731e78f630761cdd921446145a2b2b0952c90930eb80e2a538f7b9519fed2327c829731067878fd11f6a507f0f1310094a1d13cbfc33007b50c4f357e0daf584227fa366c0024d5be72598f1bcec8fa89f4eacede7e6c6d1a8c157065088ca27c72f197be5e5bec5289989c7465088fa634e2a42b814c52cbf019f7a7998ca31347d42e3e308d06fe8cc5cb958b2def8092ad13febc73b4d62e28d338d4320805be494f927b18037c0c488d587cbb259e852e9d880ce01fa3b0f4797c50be65a07378c5f4ab97897b97a5bf47e71b2d467a68c456dbd4c5caee3c2776d7da4968a1e26db8f7bbd4bd1b5622110fc4e32d9d974a12f91a52c373278e5b1dc68a6dfad218a17c23ad922cfb7f157df28924797e439726b8695482195ce211057a9dd966a48b5fb88b785f400233799f48e1097c76ad773f1e6e118708f3663528a0b7304e11bce009021a806d2fd3f11afa2da6dd167c834b55da3136fc83ccb858eb93ec46a5c2a5183ee0770bc02a4a316d18a05d9c1c2a9e00ff6d00937f54f2a6346255eaae9123a8ab33442558606b17d54656a125da03dd539b8e042301d5150ef32b4df0e99d70b781d697469cc3c878500d8192fb07125750928432d121b02ed2409247553492a74ac7c906ebcb971ee4870fcdfe84497e8fe34c16942c7de52f9e890d8c5e8004aaff43a0496b87b29e95f893aea82542f055fa015238c48bdaeba5453c0c18d9da4b34570a17a0dd9f2e9075f90dbf551a8d98b764e86699542e94b4de2580c7edd29d801164138eeea66f5c82c804b4996b0402892b1701c1abd23d207a345fe11c2a431055b4c2f9c3e69dc64745fc00940ec40e68db90d56e2f1447124a907b5cf5e99ea2cd6aa079904962201a6275961601c5fbd22712d265097fd072f216acd4456947cb15e2a2383477a68391e79f3368208ecb9bf1f1dc2d36dc6316a190dc7e4437861f9449f737de6d7c5caa6a68e5e813179564e1d97beaa94cada7de34d595378e5747940c52120e323e5149c1a5310dcb9e19023b5c2e51b9c35667705bdeaf688029d4a9843797d09bd97277bd7e483fca6d2b0002f71f2c114e6c1b7ab8b544bf8f1479e013bfd762f942013e933955a4ff7a6689bd2b07aef097a77724a3a537a1c23e7ddea4942ad47f9b4474682a2a83685ea095b71a552df8b6b899021aa7921e89484687809f434441d6d8ddb3b159f55707e6259dd621fd38b7a3b0321be76970a281e293e39ee8746c1e56e0c393fb6cba15de64c76e97fa77f68ee47a321456deafb4ae25ea6c1344825d6e5aa2b8553707ca32729c02afa0b432263ee72ea3d8c86c6b596cff4d081db8b85d238262d298404a440bcbf296814c072ded228a1dc762853152c1b7bb83c01a83407c2ce122dfa9f6d2916f0f2bcbfdf1ca5eecb9e8565d10ca096f0fd1d2595d8af1d9befef31ccd0567dc1f8a20141fde7b84124a42d6e6bf83e02b53f9556ec3c086231733ee9edc462e0b412dd42b73658ed290721b4910b9a0764b90fc7b4c584e0a3d3e50319d531e0702b1c5ea7ab0bbb6bad806328c9394048b9468461c24c78f6d562453aef6e121a47e0a416b637d966f57fc42ce0c1be6e9aff70ed7661c0b2b8ac5fe846765b81f9289e58c2b6170b09d6675f19d01db87ff1eb0be4b5c6bde49fe118b6dc13f6e766e72466cf9ce94eef3315b46bc6bfcdf4c59bfbe3da455b901ee00879f13428ba34fb5968a7823af38e7fec2a9925c0c09c96cd6532c211dc9eb0ad455474223bcf2e2dfac8817937003a9eddacab5a215b1f457c9b4ce1370d0b6afca5c1a14eb35fe5ccf399af6921819f304bf35f04dbb65e1a5504e42b6ab38e912852fbcfe92d8097a248cdc67e90629456a9563cd342486f1dd48e52be159bde34ce3a623770c19fcebae6027058e3ad610f11cd1ba04bc919b190b2d7ebd2af4bd64d2306faf0715b918766e6d798f74a9650a035fc0bc9fa892f528650d7df0a47c985906a17b773d20bdee9c69288a1e69389f66a93f74ec1ef8e2269e386556a2c7fba7b5e70f78ca2c18f15a709043ab7f418f5193b4ce6676379b2a59b241606cc57e9bd0c49e68156f04af8a80e5fa32162b3c73f6340eec9d7d54b5c54c54722bce84ce4de6fa1375fc5dbbb988dc7cf31beebbe29d7249cf23ee160d4f526c844295119fc053e6943425c956d30f9ab80e916f641fc4ebbaad676ff829fceb0660fe47feaa4c2d0e8b38bbb99134dabc296ce19c5da630b5afe58969f791a87ef38420518fa8e2223ecd18d0d2cf5374a0becf646b899e60f4e49b78366692130cd5cfecc1dc8870c933bd0b37d8ab4ae7fe6cb2c0414a9d44a41cbd9b347d67197c3467bdc8da351ba0ef19c7d315e732197f0e8e78491b53121fb0d6c4f1407b05c7e9b9b6fbc47c2bbe1d8803048de943c9e45d1514131387a847cfe6d915aa1e098c58891e28dff4eff314f7ec516485bc6b7111be681a085a929817299a8f2dc735fdc18eef7de0befd43096aa504f3b919c47180b9158901bf4a2d91ecc87bfb6f42897141570f4d014908c326beaad8f919b192eb72f1f87ec8c7cf0231932c24a1a94b8012521db5adf04eff27269fa19939c6be411dc23e50513b8fae7b7da464e81b8385b52080fec931fee04c010f489a5de4dd1f329c8a1f4a1dbb0ca41fee8d77f95855fd73040e42692f189378ec816595debb0a10986abeb056cadc819d531e72d51397aee59579fc9e3f0df13760e4c073d93d818d1ddac1cb90b769fa9157586bc249cd0935930132a3faf91daabbb2a8d01181f32ef073e732c6fcfc3020933a86f4082b964beab248c7883644b45263fa61b618a57e2775745812715b1fdd15e6932ad02b2c0a90302482ca2c38ebf15f06de22013918b159198bb2c9311bd22930fe6510f2c3a173c35673b0bf1f06d8ecf6a873f05c5b860b85b55069da36b1206e750ef5a7c06b4d399f871ae70be66b7fc2508dab98c631e66ed37582f35e4eed2ab6242cee46203f35a17171ba09817efe88693dc15980f0e38eaa48332bd0b2eea763b3d5349c58835b826ca37c22ef0084e0d7161eba50a1fe19bf87157fb803cb81c7f8bffe53115e40f4fc19daa81ea10ae58d73672f6052f2191881f41e3f82dce1a2ae1871c32f909a6e7c8cf4e53bce22e38ba5b9b123c56d3737b853497799f60eceefec083cca118a27554c04736acc157f8eff18c41345f956e16bb5b07779952a32fcece1ac76cc90def49afef160b026cbcd34b4f57b9914ecafa8c2b9494395861b164dc27dab3e892526f3305f8f9ecae458cc75179dbb7134006c21f1a829f758624d27bdf96d88342e6500306d26b004c2cc9467e29eddaee7804618927037605bffac69cda460690318e1683cfec2e5a44b3158c539fdc79fc64c23f696bb3bc9a81282f76a70d4da94804cb2b623b19630e61f5317a6d975f2cf9429bcb6d3074c68a9f32cb1588aa46181ba56833dd8b5ff792d428e8cada61fd1796ff407b7d7cb870a37b881a4309867f03dcb1f89523b75e5b6a1374d168a042943b74f6438e0d220b0dae13073914002e049b984b70250cf8a2aed9c9432cee6d520038da9e7d9c74a18d8615a8e72dfd8b54c32645a6acb09c2a02f6768b2f56fc175ad0fc6e41d082514acc334f8fad1a3092a22478f780d3fc3cbc9974407c8cfe65554624abaa02dbe23b3e80295154257ebe0efa91090714bd120464c9d52efffa3421192804e510c2373267d7f7338661bfc125adcc77dfd66f09092f82f43010d88d89fb9ebec18c021aa3bf9688ead928ec17c78132256bb88ca3ff7a2547c1964e73af730cb69ee116937e3a211bd72c91f2c57d8b864fa1aaba099a90368a64d92567a5c35cfaf06e4b9b81812c95a4973cff165cd4f2dfce100dc0ad3f3625532aab05cb29899968cccdd5dcb4782d2d8e3b20295abaaab3776336e8c476a54bf4a32534a118bb25c55b26db6b9b08cde401960cb4b28ae9c0b3da2bc75418e95072332096a0f8a94f146db2121132c82d842c3a1290fceb500d8548218e9875cc98864e261a9f1143812302386030a6f8b6ea8487669f455d0dedd3aab153c169d3b35fdc861dee24cb993e6bff13adcec278db4a390717b997d4db6bb2ddfbc33595989c9f44f49013e49eb093c03100000f47e90901ecb1fc64ab2c9e20f812ccea1f6f3c709729a0a67c3ee061d62e27f4a73a0ec6e624ac1f466b851e3c9b049fbb7c13827f036563d4e991362486581e96f03485209a1d4f2611c77be257a4f8a527d278dde663e8aac5889f919a2d8ed342fca86ace62e41f72f3be6196ce18eb7046682fbfb6e50dda64b916ff71f45a60e498cccc4e63945b5a27a429dadd1ddc9b8494ae9822cda57b8c7996a22a2b7d0f7bcfe3c324706597b087023cf705ab9e38fab9e30c6f3c40f802c421d3a5e2a0a995a40bea71704aec7cf485cbab745b426c1d6056c4299acb50ae409275cc6b368273a38e0fd859f6d54f616bdabab70ec60181ed4634c12065c3d234aaf93b20b03fac204f19998de12bdb52cc00b2bba006572c23889e518f7764c3ad8f97c37647c295f77776fba74745571bfaed8f738385b790d2fba634a30c2b8501cb9869288cd072bfc6a042824b72af9fdb0bb5b9e6f8e62fb4607362665c91680815880300b9f6033043ae76427d878cc994699ddf000e433d069366193673d2d029ed6ef2df3248df53865abbaa76d19ff4b0eb05df444d58f79a89f69b288961463f05aa23932c8782682a02677c9811c04d1419fd475ccde64cb120510ce3310ccacdf6e589da10bea368f02709988015f432e489b802845474b4140cfe4c521fda86ba7f55119162ac1cd46909a65bb9a3890f189438a5fbd5690d6f7d02763b5969c2c52f20591d066b216ca16459be1438f2c87d6b4d7c27198105373d7bff656427742374e9555f59bd5e59853e067ce05ebdb503834e2e61ee4d7bfbdd597ec466c343fb4b75791fb2735d5cae446e27d9509e049e2ddb30a04581d6e4fe01602bebce9aea7d0284e58e714dead15396da25d0d042527c0d1a3445b67f8170848046c7adda93846b866670280a24523933014baf83b5d827d03d40189e3c21ec30a8cd02caa84e108cbc1e6aa18ab53f43fc03cf9c20867482652d2be6004d30305adb7c2b66d949830bbbc762f2692254d0bc754fd477c1fd1c41cb3b87985364b8f401d761fd8e2377069468f19861d91b9ba8c19d8513dccb936e84fad23e84fe5efc7ddb5ac517d0d53bf6d0e3d123855dd2221d6ea0192d33e0c9163c012b03dd174dfbdc691100f7e150f548ed892633ce4337e6dcf8a7fb906e7ed1cdc03c96e8004d784cfbb1bedce2ea08f4de9bee27dc56a1353c72d9cfd2ac513a708c93b1e458cad2971c7e4f545b99f6c6dcd38243a14829940d264eabeeb1481b61625e25b087ecd136513aaab326e82c9edc45fc3c70dc670feb69f5b56fd979bebfc4c27ff8da39c0eec7c8c0aea74ce47944abe3d8a3502a7479c448f30ec87e2c954a3fc5ca9abc2da005fd68518019732cf8e6cced8520a5486b0b98db262886d29e2da08d8937594a565b05016f31b66961972b6a73bc82a0a8ff6e45953ee701000421da47fcd4139e39381bc9edb5152d3ad4384d411a7477fb4101f14ef0b9a5485e7c34b9965faca824c99298a04fff132b885660d76d6affb474ba33c9eea8d9a89068fdb29549e2d401994af6e97e1a47f1c66ff2bac848d642597a02b3dd757107091061bdb2562b3ccca0fd5adad56dee5e74587c553fd35432aad4ddadb4cd554f29ab10980f201e4f2133018dcbd72c86c15711e20077ba25d349d233b18bdb0d8cac531eef12dfa851fcae46bfc54124e17833cf3923048e9e385e53c5fde45cf1b8a04b2530676cb62abc745f17e4b10cc3110c8ea049604ead62be6b98b8ef7dc5931ee391e4cc2b14e616d85d9284a5755348bbbf1e68b8899864ef07ef7957a8af1b1573c607e2a957b0a969b89be352d6848042bd33e7409803af668474164b7b7fd46dd8b6e385d1bebd92cf2d537ee9b4f6d322bde67d4e01c9f34fadb3947da22610e2524045ef245a56a3805271f18779f700d6089020c3cbd027a6119f6853b5c95c58ad0d552802f86509598499b328cad70d4422c414e41db30dc49841e8d0012e0def2ad4233471be412845077bcb522592f249056258ee43c147bec5e56424413dc4f5ea133b16c474c8c6b699db1d3c8134adcd24f6e518854689a5138f71c1732a2696c8ffb09e87ba24aec05a4f149d37b0348bf71d377ddcefff8b3170f1c693e2954ea65d875ae1abcf0c415069e6a508ae78b0dc6aefa5c4100724d49f5bea4039b0a98cffc926cba78df361bd19fb95e650393645279a713d89c604513bce14ce24c08b06570a9e98731174dc2bc52e791faed47fcb9b3c529f07d06e8e3d687aff4120dc0f637b8fab4bde341b58e4dfc70c0b8f634cd22f4b600607a199d1ce1e06ad6771208be15810b75a39dc02ce93e9b6ecc9b3ba00eabb2a60a6de8828d0e758a02a02210d56f9957a5ed573cfd246efe1c2d1e868b5838747c33195758590645fb4a1f6ed056db9d1f2be3f3309113eb667cf571365553f243a5812d47a58396356b69c9f2ea8e7058fd1d926a990ff37d9cc486fc1d8fafe2865c6f0e018da7d8677c6fe87d14fa434b1b59f246e0f289641212f6ee0527913828186c00e1582c52438e447c1457fe5ac8b166ceee0070c58d786c1111410213d5b4858afc5a496c78b8e8bb91566a1ac4029c3a2087709c9178df19da41a958cc003334396d527b9d85bd4721e2bf396209353b2fca04ba124b886b0c70f3eef2ae441479ac1c821ab16f30d4f0f3752341d61f196dc2e4b5d94478fe7bf0cc95ed1b7f5d3281518c1088d42aecb4eba2801c80622fac520f4a556c353b107ab2a27a581f1c2194cd9b0f405dc689b55be4d46f79e82e85d5aa812b11f5d09e4e3a215fbb560f6de903da5ed4436c6ca76800194c0340ba0fdaff4eea81c332a093481f9beb338eeef970ce600bedb83ce11f39f9204ac9a9ee9ef3fa926a3d67d32bde059fd9d120308601d405e9eadb5167fc0bc42e4d10f3ce99f5fa84a0463d5412e7f44c57b63c95b08d2149daf056f3953f02969bfc2bc80dad0bb1d3604dabc03fe5c655ca52ef552939f07df4e1f097824aee755bd1f2f08e67565eba22f12b0fd9d71a5c7aa82b2cb671d0ae6c535303e2cfc9d58b5f1aa144789b295c8ee212f1129a6537f84a8e7ce5400a25e221698c2e06ae4d934ea08b3a1a2dccb5e517b8432e25bfc2f5a5b377ad9397f4d91a4250279da3ac19ed6fb26cdbdbcb635144abe11cb6635fbaaff39bff9b0a818d5e1c98584c6343ea5090e49af7a49a730931b9fa644796195bb013ec8d9a99bbf5384784b91b4a6f65355797a27f7b8856eb8e1855f3c1807a4a9528c0f48f49986b1fc31c01f68f5e4ee268234efa30c2bf7191fe49b8cc80c9c936b4aa04f75b654e1d1ba549f63e6874daa948449cb443e4369cf2eb566495448fa52d3da8468eb0a2974fa99b9345d327bc39dec6fd25450dc24efdc1389246410173735ca780829b2fe88ce06ffc04f423ad607fee7870bc303b64ec0fa828b6cf3d1829903c7382c83b5e04878c34d215db34a83ab2b4619bbdad94313fce97bb62a1864324710515ba2f1a792bf06154d68eae99b0ecc66b1ff55f68ab241381580bc19a73ca1cded0354e42220edec584152b12b098c82128a428ee7885e68f6d66ff73c834971523b6793be2b86cd60ff3a66cea0284d8b972b32db9888887ae444fc396a55cbc259c9cc380c37641fad6dcd9f14310d1d265d37d08eb176e36518b5fbadf63960e2abd901cead710ae5e680e253dce0ce0833475eac3bf67ee2c84e07f5c9972e05a4a82d278d3e288362778e9a730120d19c6180136201b5a83eba1ab4566e96f2e6e18a15ab8e7f443ccee43d462e9f1a9ab190ce9668c5f45f70b2543aaaf00f88a9c61aac89d1519fb4d22a4937909e070da6278a24e23c4e36a12aba73ae110f0273a289b6cef5d380762dac269694964488eed71386e7fae4301ded599bb2f45b828ee40a2245c652f2a7c96d51ef93da0aa48b47180236e30b2d4606e7f155345d8a211a62cd4d275188171adeee6c6bcfeccb092cb8a597cfece96a1d4ec07ce12424887804bf1fd56a285a474384caa322a7c1a7a54bff48a7920a8b179d14022dc8f395971920ca2c35b40b65204d83867f7b38c8a0e842dd16b39743dfd2752657bb08b0af965fff00442b120cd81d3f4d5d2e6d9a14cb8b29c97226188d10332bea092a4174ac7bc2e75fabf87b4be1ad22a2fc76608c1c1fe8d7875822930c407fda01e1bbd1e1022e4c9fbc229c0375d238b08e883854bcf3a64e5c868365dd67199852d579d64816144c83cc5a35a9b91c55b1c634fa4d1a05fa826f4e63440d90dbfe733b41922bcbbd892e999076149b73bc1401388671dd5a2b194f12f9b259f4c27913191c3fbf483f26d26cd20bb40e4f10f120dcb0bf1613a29d665242d314fd71d64252be28681d9752545748ba7806f8459bf04445f1259204d7cd7cc724b1f029c5ea135f3b7dd7f7dfa4cc66fe843bb6216b5163534252d3fdb2ef0a290754d545eb68b69a373cc950aac6617845b7c3892c0d7e6bc2bc09192c4ab2a646f3700edc4dff31921e76e74ef58448a2e3d0826d63b8af95db75704664f97f6a54486df5d8a971724757aa3fcaf3a38aaea79e02a6e2ab28288ccab5c7950cc315e396408dbf1cc338c95faa86620394876d0210f06c70a5d7593087632908c4bae40d80e889f20e7584545394223834ae253327aa8b157f39fd403d2271eba3cf1d9869af49ff7c888d638d09af319e07d698d27c6447563a01c5ca55b61b256d1f54f523a2f7d443397de84dcd3e97d678e95787874a682bca9bbbf127d2df4716e892ceff2656201315c3393b7aac4c9580184d542c7f1ae4802503d8d41ed44009c9585b99eedd18a4b5a8050d4bf9f6f19f00e718949bd53105f651e51b6831b40c92319fb2b8283825c3ae215be1bdcb0500424247e0cc65ae34b677eee7d79e2b640fc14bb731936c6dd34f7fcdc6b0d02ddc3cd7f57aedfcccd58ac9201305b9a0a02e3117e7338cd2d4fd63f1089cbe5b364211a9ae5e236f137fa4fbe5562e22c05a41158a98b7bda158c0785a9499de69cb6518e305d1833c8f07d5bf9f2c845d89f2e167a0aa40ce474b5053647516e2c7c353990fc6611d882b4bb4eaec189e8d2a4473d73bcf588054105c59d67f5a61249efc49ac92831c1531cee0b4ba1e957e036a3e24dd5d54b50188ffa8c214f8f093291b89207a24e8ad72421f85e1bd50811a758c4489a29388ed4f136a65f0ec1f9c1a0a6f7f0e9c4974d0575fb3a70a6f5d6254cba74e92e486edd9c7738db622a6975c3fc0ffd48baafe90e814fd622adf7894500344e046cb7fe5806904a7b0632d4e84be99e826e5272be06213c6cd8dd88ac0cb2587275f6c29da42706850190bd29ffba32ceab097768dd72cc3bda0541dd221cee1609b9ea160525cbc189b220ec8d9b22d2b20b2ab745f4692601758efc6f2b30b99d376f47825b3c7f5b1c5fff064222f0856c9d27d29669d70c1d0b706522982a9b42a7532984b6481e02f204e80db79921e72f4728460c7ac79e5acdeaf2f4e9239760d602a299aa3b592aa97615da8b82a59c2c06232dd12dd7b45a7e03f685f22f17cffd2099a0600eca92967d4a0c6bc81404b1118b1f7abacc5794197ed61ff830cb6864a216d313525c1bbf18526d2de58e3c024bbb501b7804198f168be6ec2094ee02325f9b00179725c4c3f3ad4a0e34dc0fa2f417a4060c26553358114e764c95a78c818559e2481693982a9829d7b5891d7992450b41aa6e7a57d05298571b6e812fe4d5d85a3d10a18437e68517015666d399c576ab8563455ebee5b2339009620a5808b6ea290da2b28b437aaf084e0fb8eb2f289eed640690f2b1867d4d3dff2dcfb0d8676e0134d3ef49a4e2e524582db88cb440f53877cdbb36752e2cd3adf0c3126f889e21f50e0ddedba1550d7df95e2ab5ac55ce1389e9fea99fe5176a587e736603a540fc1d4f8d6b9ea582c7917062454a3febf650412a95149db2d5ba10d4bb475041f3c4f4e3ff684b0c14b1cb51c50b2ac459cc08a788afc17325f79e3aeea46839fbc44809c877e3058acc81bf2b831d164b94d3fc3ef00d8ef76af870f3ebe1d14b0fcd5ffb32e4ef370c499827c76082cb174c3033f3734b5605990b1477e1d9f99ee9e7ce2ba9e906f55736a216904860f3fd2025b01b133bc51d835d0042fec47a0e5e89830d20dc1efeac4fc09eb86bb46828ff809e7d4dbdd8d8d809ab2381290dc6b50a6ddb1dffcc43e00b026401e871c801bbb39278d8e457525f88866d5f50e60a05781ee25f09fbb26a8b75e27ff1d37dcf6fe24191d3c780ff2d5f1b7ee8295f9ba1e0aab96f064c1df0967d43c570622f39a092d256613f69ecac4f0cffa453aec8e0964684c5a369cfd0a3495b1389791a81583e9702abf1082d701b242267f4bee335de714c8b7c1ae3f3f29c6fbf29effb4827ff69d92eee3afd207896125f35527073e11bb8e08390b4469b763aefe12f1b7590bd0ea22191d7d51173764fa8f14e6274f58e13506a0741a6dd8d61e49b40a9ba83795615dd95ade32c80d12158df6964c76eb8e37e2ec52f29f178179c333017ce4f69c06d469a728383c7fbe1b6cdf9d4bd40f0956edb7d0e16c4955686bd60f1c0ff77aaec3c725292797f9d37a4eb0047021c5de3593cc64c761f10d56d12d4c7156077d159e837abfe058b14fbc36c5aba46e8685182633da287167aa288a852e2f2768e9e6e6bc06ac01f1cd382d1298451bf2a539d7c4da6a9881c69bf3a99680ae77f31ffde16ddf74f11481465b0bba76c2d43a5f2fdf329f7a81d076e10c2bad04ffd60a72b5958a0d17074c4c5bf31d02b651bae51d14d18aca473019acc3c2650709c51d2017e29d1b6921804d4f73200ded029d99aaa0528da31ab5a116ecff63735ab51f14e7e2404cf1b7bee886100e1e5657ce7a771aeef51009dd6175bdcc6842f321952901ff6166d42884c5ba693023f0217023abdd44ca14cdca31a19a974dc38803a30db888adcca20a807918f2b908f930f08897af820f271a21e3e7efc273ab55a58ab496c69d775dde944a433cdebaf72afebdeb59df777a889f252a8cbaeeb5ee0598245de7bccc8865f5ebea2f905cdeb603167cbf33ccfb34eca53792a9597f2bc94ca53755caa5b711ce779adab89106575f10ee4aebfa2628c11a654abd4aa634dd55c01cd1b1963645d08152c8c55c27583116f3bba68316adacd0d3c7133d0a433a5539ff2a7979aa913cae35428146a5e50bcf5fdf6c897ef9043c518e3f5bd0ae87ac59bab39638cbef226432ec5c2f30e44a53c957752459597f2bc946aefa938cfeb54abcef33ccfb341490806de81a694a7f254aabc949752fdf25410a23cae9b1e8487107a9e0ae1d9614a92eb0679c995abfb5c2eb6596a59ee569b6db6d92ab5ab5aedf52bb5ba7677777777cbd0414d6be32c76dfaf5fa6582cb35a35b071c067242b58d0b0945c1f58f196244934d52b4df09830250a105a6248c2c41dd51d75959d3b0e85ea4e4143184025140ac54a824245d9218466faf4aaaaaabf4eb1b1a9a2c9bd7e696aa31db2dec4f5708021355cb09c6212ed74f289559a38394175ce4583e5c449eb0c6fe179a10a0a2bb851813a20c38e2c5c98b2101e4278588447090b09033e578152c29627a8805103d6b02cf502e42548c88b096904237d695d3a21840233c5e01ce73293fef91624233119770c61324913156cc88dfec45593884586081e2253da9022e6ac84346848af1a9252caa12021a520a1a1a021a032b42025290f9576ca9c4b9860f105163360d76969751d193bc428729465092fb03461247bb264c507c5a19742851a8410424d91ba703c00ad82a67451814704cdfb4278ecc2300c5b6c775b443e7a2c292d0d5999e23b4c0285a5b76fdb77c17495c76cdbb6c9246ddba4847c94979931fbf7ff9b8a09737201611761be635b03651de6270c7629e6f1e9677f2f3722dafaf0f881f23c364618e79c930af82dbcad8327d82345dbad0807827f973812c0ef52877c0ac2672e1f8e04f02b0af2ad0fefa8b4fdfbff1d4614b6ed1c6f69b5a4759c6a75dd932b05205de9c284866ddb1393cee9b86f759dd4af0c834abbbbcb7128e0a0d530b9ecb2275f6c6c3efbb76ddb66ad5116adc8f499ceb06ddbb6fd833f6bf10149cc10b6c4eefbbeafa3d23ef23aeaa35d47e542d8799d4f5ef420e430130cb8a299d6a839618a858b9d3a6e72d885619e1cc4b0bd969b8be2b8a5a9d42d794a4b124a6e9d384d9266f91dbaaeb561b87cfa1de3a22cfb28cb3a2a919094945a2d28509a6813b5c13e2ac43af621b28eca252b29e793923e97cf98fdfbfffd39670c930edaf80186a88bd0d22ac9832716d7994efe15479aca035cb06d779d942c69dbb66dbb859934da08e3c492521321989ca0464a82972f5d3e5f31cb944386ffff7f0d725d23b661415369ae887669a9b66ddb4ba9fecb79f550b344337d96119ed4b66ddb595e13452f086d92a020dd3384dab66ddbb6b568b66ddb3afcaa2aaf57fdf5ff557f40abd55a86c64867315b0f18b7cc86a80dec62615f5aaa693737520e3dd1ea6cb0a839b191524a4ba57fce29e5e9c4713ebc03e7bc96148c3a09c83a40de81495c109050124a28c618858082928082848084bc99529a4049495aa02439290b04f3f9cd09460b13982cea15370f31d2a5af68fef00e3c5d7f35053ea61f6882e2f365adebf56dd5566cedbfd8ffe7acbc6a72d02e69f90dbbe63c02872e74ded8ae90d2b68989a2454e4e01f6b921c03d36f07469f2399931fbf7ff5b8c19018e6834101cb0503e4b018e6834dafa01530e785d7a5d00e048f07d2bb2e0ffeef76bca4113418e6f8bb5a942530552502bd90a18d1f4feedff121efe3fd4abeddfff6f2946b48883c532f8ccc1e7ef230245d8b68d25e90182bb7ffbb67d39ad00297d30810f34b56ddbb60ddd08a086eb0677f9d4cba72d0d2208f2e910a5d0f51337201efcdc5d0eb7c0185a11aa5bdbdb0264681deaf26dfbc64898e94a98292634cd99fa6f33d05acd667fdba2f81d7e0c9694ea936499b668391be857841394491edff5e14c78d28cc777f3ffa7e1216896b7824791d979dd5ad7ebdbaa554005aed0541a2a5c5deb7a7d5b555555f50ac2f47863f6efff373cbce968618f11da25b4aade6a55952a67acf00a151ac2efbf48944e1d37cfddf397cd4ddf1c77ecb76fdb8f21ac5cc9fdfe7dffffbf5c37b9c9cdfff2dfff0398f1edade03963cb299ebeefeeaee5ee97c49a27046c41a4c7098460d8323bf6dbb7ed5ff9d7c63b31eab84c1c3c6da8dda3b80ed519f5c4b3b8ee818f5766dbf67e77776ddb46038123e662befdfbfffd8502456cdbb66df714b160a24863f6effff7ff1fbad02344969a1d6402449653b8de5dddffff7ff9c4b74d45c6ecf874a4a05a7de3990d4766dbf1e9d0f16d0ee71d95d9b1072ba020f855900dd28a05c40a12621d6a3370a60b29a52a4d9216e129ca296d9a07fc1835ade8e601db11812d9e38fa316b66523555c76cc3545555215408a1c20dc156abaaac91a215715fd4bed130a1c33a970c442adf91f8fedf7049b82f53abda6adb9ac6ec9c8607260c07b0470bf88ca4258c4f39cd60d0b8e1ac0cf213e5b30d67b72022be1a359044f30f0e2981f02094c91899c92885646236990d88cc80384affc848b9d98683c9191c6cc3b9204a192994c94c629b5094325266030200122df0e0c60f488408f98932c88f7f62369c5ded4072041e75004fd75ed7d1d5e83a7264747421ff890c5d46f898e9c278845d100321cd214f27296f4e10c26d8756ad6a21ab23064556095555f5590c361345a24a942059a35476ed36a7a6d1e856248b668e8c9cf78967dd68f246cefbf8878544817f667e66d4e8105e5ac96d24b66d2646488c8e1cc960db323933a7490665bcf8cae818b56dc7c82b47030fae817e5b638416b36dd47270449a08e2860376f7d9d8f1d8a05d62d9b11fc9a2688ee3f837d7b0e6544293a499f5d9b66ddb36a1e5845cef7777d70abc20bce4552f6d4971d0b06848608800470ad062dbde42b07df81fc24308e75c4283039519ee2a1a942a55555555b55aefc11f4a10420855c110c19386a7503201e462fbf7ff3b82d1658d36d3c9e97c2a3b2611e7c28952bf1c1def7847e58561d8628bedb5dbe55a923a4f68453335bd0c82e778474a89a4fb56cad3cadded8ced6a6b23e5fe0b29a1eddfff6feb605a2d0acd644b850a55b3394d39280595097b6cdbb66d4b99d921261b9b8e0b079169a8544e1e758a0600488204331808201008825018c90239d133b107140012455a3852422c342a8d04e44069281a4d411c07510c00210060200618a510724caa3d3b743183769bb60ceeb26d0534b614e6ca17022556e12c87d9abb9a859603f2c4621fd23cdda98cf2b80e0061b73904f2263353836308114d1efd6cdda80f3651cd9aebae0b26375be7fdbbdc7f78c105f917fe8209398c5609d4b273cad4b2ced0aa1fc6fa55748813f872f731939ff76850a762ecab0e0a436cffa1925ee152b521347224774edcf18fbfdabb9f2e7bdbde26728a0168329a5d6af17e96337b1294293f39b456b01d4d281e9b3b8cebd03690b3e6eb93f8fa60195aa2707d881f255387860a9799bfc93650945f25c3adee06393046580c56dc46035365336b49d68f37a8d3e7a56b8311367500494a149a925bd1566d8c0bfad1d69d9c950d8d913b9a4e9b77a781f2a99b4ef35d640c7c8af5c002ddad0bce233ba1a67213ba3622c080147a10cc0c28eaa81ac207bc59ece3a8a80806527b6a750075e65dbc37aa67a25e178dc0211ae40a5ea6aebf8445d53c9fbe961318fb601d831953db8a44104a24ddba21b63dcd2f5f54d7f6800168e744511b8d8f8bdbe2403a157ffee18801cee1ddcf578d3850d7fbe5a0fe8979c25a14fca4635289cca689472d2fe4b0a773467f283600e9924f18c49c1734fcc3683ad723279393d133b2ef01b343599048cdf09fc78da121babf6757a202dfcde9185c1e09806a5d2e782ca3463483f12b43913abcdbf4d82f977917886deb650f50732bd2599e0a5094f449d4a08eab119ca5f3af50b43a90a7b0d535b22709bd693a2db2dccf0011b5d37b2fac0ff1ad644d8d0d2a27b45023f8f28898ee5203a514c629aee94a235c48e81b33c09f17501881ac3cf40ba5ab0a83141b33fb4a237d6ac5f21d5076ccab886c68fd144786fe270356f1c36c4a040be477c27554ee5f7b26cca82baae92f204324419b0b1a909dfdab97591b2ec4f269039111b98f5f57009243175c2a311d2168086f70f132428a72ee0c7a141cc727c236771b14557bd211c800475c8454160cecee0e278311bbb42f2b78971c11158ca0496b433660972bd85ba5080b0983c53cc5239662128c83e48d88d40ce6e139ecd943357fa0743114e7e25321b67d2c23875b4dc5df2a1aee952f35297401614154376d9fc8042a62b47dd86460348b40e00aa9fb058a2bf06a31b27accaab32149789a91e77cbbef41a7b11eb8f3eec4321903764133ab2bc782d43182e2eb5773248ce420498bb7ba003d6069bb820e553d93029ac9bae1ccaf4ed218b8eadd0a34308248b85b88b64cd93d55f65faf8d4ed9369d5a7dfdc7ab1b7935701588d6df8d7c63038dbe138a5acc77ac430e041eecc236118bb20abd6de11a466ce36186cb4a352a65fa33a88bcbe056a371e7a0a9a6a284ab28ab0a402d5fdb08670cd17a5c9d94fbea404755db5c4b49fd78d6b554fdb03b4bdbe0cb494aad3f7d29da7e7cca9713d1de2997c499628ba59b6c29fd20dc2a9e53011b9218e30eac35543d811e65866abb37e178af99a8b5e2b650b4f2b9d9dcccdbf20ada11a7084420d4745418b0285d38dab5abf884affc7893e2415a1dd0424d3499b50f32c47e3a3b03f65a9124311cd74d0defc293d36f70f7b93d4032ca8def9539ced1a33d9ae1c608df450c7b781dfeb698fb275e0fbae56af03bb394d791bef25d7d93f15669a06caca4aca109d1ebba42375da71dc41e1d7214b290093bb6cd49de04582c43a8d7df9d8cabd9964dd8d6f74fb32e5e9487e31c1a5f8531576a7a38330980ff4ea9b5dd330982b094655f67c4cb582b79bd3163350983886c072feedec4f1230575588732ae1602a5179c6cf117713a008f3200fa6bfd35e6b2ccd958edb28e02f7ce1868394cf95808b8fc18e85427afa9920c0cfa41330ed4c7e78fda9d8511e772cf72ca96158ae3d3b28dd2a64d0fc10ebffceb4730d969c425ae140b25a467d865eb2b10c99cb6b998fae8f7930227584332ef1dc085d0f64c63e8ae6f34321f9e1006c264fd877fca626be00032f5ecc40f8505e5e8cdf740badebd5117033a075f6bf0b9994ab21024c1e251b37cbaf31da0c8f05cbc46783a70aff1fdbee7f483c24b973acedc9ddbb7681d71c8fa9326085b4855988375114b292d34263ba087e96e22e4c3d994504212c2d50400ae6e9ab6c3edd115d4232255c881722b911ccc422fa1b0416b148415702a1beb3c4a7e7b6a938cfdf2d869420cc91947d847ce3d5656f6c458bfb74cc77ca247fb10174531dc431c81a2ee112f3e7af059b6103e8dbb73ad494c6cc50ae6fc35bd43163ae8e8b7e9efa9d2f4d1597fc22152d87250645d99843589eda17fb60b4ef935e8cf9e0406dbb7cb31198a41234868a7f7b28816d7783d52ecbb30d041032f3451c8d8ec1976c02d08fc3c958e05ef6c5ad4e9206ab15dc81bb8ec76712f69d3e7b25bc7abc9eecd8ff7f2646985cd1d7327119ae6c6a35fac5bc892ad3c0cb1bc1c6f9a11b3ff9f3fb2fe92ca16dd803aa9c477cc8fbef0e04fbab11133cec3bf71500786d7777e04e61ca4335635afe12d3f2611df379e11fb203a930f3466abd27056a88a5e8b442ac3eaf2044e243118d7a7192919a930c4c294522c90c097659ac5e324e05d5a173a02a2347bfa8befa4419aec6780c7919fdff1d255644ca80cc1c0ee4b569595ba56ccf4ee4fcac6dea1c7cc4567ce7c028607ff81b1df21516a7c83adbc30c03c6c941fb4cd598bd9b88c6442f3dfbbe277116476a60eecb5d0d593cf18edf9bedce6fc91a99c42fbe6e4c58c7afeeef01b41addaa2f569ae1b35aa4d110d2ab04688ac9eaa941dd84dac451c122cbeee5c1a4901714e20c40fcacb0fc34bd8601e5d7ab5f061e8a7833a43eb71198c61e759e2d85eea2b35a79e9257046a8cb47dfb4926c985a2451bdbc6d0f574cb79712685fea63d5393cae17e5ef054e1901876fafb1d444fad7071a369c0a3a6008f96556f50c4c35ecb29de3f0b93ed25e36aad52733f20d64266c11b7e278c4dc4b197b7ddf91c9d476ba9c48b74664e8175f9cca64e59e784b661544f9f5f2bcd8244c44c15b9061988b01f01d81f48ef7523ac4a6c2e6081b03aaa6ad3252e6af69c7b50dfc3da48934ff4b3602051b45b84cf0b66c4d07f93f96db354500470a8584a56f6354c9cb02bb9f1bdd0a2486779e60a576723971e8cfa5ba8b2ff0ea51a454210a1bc73173b130e8442a22939d18ef5595bfc3d7676cd6541f7d0e2ab82342153ac428c80230d2ccd83781acacba99954c63a72b517733b014058dc404321abe93c976e8b98be8c175931d65791cab8109dffaed6963ba3c1b751d51caac761cb660396c7c08b0dc6c30df4dbb60b516045c0ac6ad4de50c57e521b0f5157f44e30e6bf9df49161f1670bd3bd415c260176a3b2a2bf72242b9d5ac06fceffddae16ba49b0237155fcf6d8185143252afc50f8d08de8df4e44b770e6e14894631611b899f039fb8c7907584b06527456c1e69160ff517f85d847d61bab35830900f98568db6593e10f2474f060f034a411942a93441b9221e8bb3a3a5f3c5530bc56191816a47a8865b67a2d3caf5ca611d0f2d271e1cb23ed10b760feeef7960f530b83c2995f9ce870c4bbf8ad980190893f3b163efa746dc5f84e7281153f8667db8d881044d609c901d1ac02b1bb353cdbeecfc2bec312a0cd0940f52b4274ff97d83824cc4340dc26ad01200a90a8cb1b74f70c9f5e3febd05da3440b45484b87e9b48fef10504a44d43a441d4e5b7c848ae48966cd7a81d5325e3bd3c4bf0dbe5b64060cb0c4161054b67dab965e0978067479ae7aeae6b7c5dcabdcc6dddb554a158dda0d6de51e7aac45e8cc171e314067183b5b5956da4c6056983ba3d4824c503d52fb304b30de9eee2a1de79883c8e6132a8989318f538968fb6855bec8e1a85c109b087c43d1bc0699ae5760ee8ce7cf9a3356955c3efee02d4412d0b4929044cf09c41eb407b7c878a527afc37baed98cd04815e314439e587656f19b7903ecc7d813892c05f38b8b820030f785d66449a6ead43401d2961a2b13a4252e1858a58f907ed9a6001b6c9c325f4753dfdb966f4e4edf304ca61605993993b83a2652d9d36914fa763a01d11ea53d4d519b74bbc8f50b3034091558b0cf3724f1b5d5188643177ad6667231c4faacff0e2ac54e4591ac6e9df68820fd575d316f72a7e7a2231eea589c0c5db733171f65f0067a68387d42cab69e63750ee62104c4be27c6b8d297921710990d3ca9dee5239ce6e2351f1210d88c6caef9c9b38582422d70c73b342f30c8aeb94d4325c80344789e837ea337811f131e4cd9a0b3880becf6b1a5df2ac188fc29a04934dec44223aa4c8289a5bd7e051f012112009a128f19d7ec48a6e881ba4a65bc95a19ab647cc8a246be503d7b5b0896f4def0140825fcbb792e6c6a3706d8bc173f6a5c7bc901d002313ca9712a901c1f746261ce549594e6292f87231366da1cf29381a6feaa5d30a7d13ce7c06a65ea790511aa82a617646c99bb0e073489ce6dd6331f14e250b03943b4effdd840c867a32d28ac851ff4c997173608d0f0215169a7a902917081a83175b3d55000421db8f40d75e078d0303cca5a7783673e8450693647f6f213d540a741811b7580ff2188e615645d96fd6f20cf315e4035eeaf8e15afe0557dfba0c1275012b3c993b26456e0134def41f02c42af7e63634d7fd0c4022e030b34bd6c2eba47e1910d451c3e00699b794b05ba1c93f46e174d2371b201f9f99a4ac20b79934391a751c577e531d0c40fdb6292b442fd9d90fabba974242479900a4e7c9feb27aee6df095608d70ea286cffa02f7d902eeb3e401381d13f2f5b55be11a6baacf1aed75c1b47e2e94c7454c290bbdcbef35a977f3a299005a2ed6e292d5f7aeea0ff2f79a8abb7ad4d6d13e72abbcec3ad9f0690369cda670bb43a353c847cdae36a494614e4d6c8023f05362365835207fecfb51b53a47464ccdd2aae0b0aa106ecf33c370ff111ca1710f3b3293c33ce83a9dc8d7f38b549334ebefa4877dc97f7cee578092c1b4faca8932338495805f177b4f1d2c40cf61cd4c5e7e3f5e06d4ec444bdfaec351a98a4ca21ac4194695710eebe0fcb6291aaaeae00d1768186be6f34815047c2e3b9abae599194c6621fe48f25bd2c9d7e5366ebe0360d547543fb96c2680c9fa07d3470efc9b6dcfe2c29c2f4cd78cd846615654e6180cbebb1864f1f60113cf934cde3f2e2551da8214fb664d2900e845e28e9d67fa49f98417674b6527b96959d9c4ba5631c471454b21d598686b2d0407d2927590b27ec88beb57e96065133517e2cd6300f63495ab509070d41dcef79d8a97329a469bfc25cdd2aeee30e24ee4dcff53238717309036bfb869c933a1fd93cb49cf4dcf0e1e464db639ef6ba38ffcc157887d1f2beda59896d79b81e86bdb76b86ae7dae3b12a910b875ba10eef53360988110cbaf0319d0fb03ef2e578143d6c29974b797b4605475020033e46abbd89aaa22d232f65aac96240a6aabdc829bcee4e8167ba70207cd7017645580e06b23391c9b12d3917a8996cd020576e013930038a046a155cd7196e981adcb81d9e623224fd850e6a8339494db256a51740f360966f4c4712981827c7b50780ad356d6df0ee1a1a87eb92c601d1e1090aaa82a0b70bc22fefdd92a80175a47cf7310688a1447ca212ebe508496d854a8886a0d3e518dab2ef7331ec191c29873d5ea9bb36afe05df3705c329b9341c8098a186b9d619c0827104a21084d72b9a4126e51d3c3fd273c127c06366e770f47a4a8fdb9b19b38ca4762ebca8970c819d1f8f3437e4adf64774081db8b3c1e9ebc1ef26b60cd48ba1e56c6eb9055ff03e8751a8701bc6a43e7733eac5a2cffe3824dbf37726178496da00c5235fa1ae27201037aac3548552263e73b342f6eb34a709d5e1f6e1c8f3afbd1e84c4acfced9349978029f677704340bd60a6cdfa7053715c5879d0896af55b36f364f7e244be3359e766d13ba5bebfe9b6ffd9cc12f9a0d6d0c42b851ab735170b97f9ddc1f68acde38c6a542b19ee711d7de94aa003ad27cf7d8b3af9644109b8fda4c21dba6f595ff53ef494bb973780481aa12ade54defcdee97e55c094eb0c9d80d526bb52bf2bf06345091d730ee7aeaeeae7e1e543bd6524081466347b08ea98bd7cf9a26b0989358f520be685e2e93df711ee9a75183bd7b596b0ddf85956197efc9c04122fc80374fc9abb8f96f734feb1c9e05c73c1612127646ee8c6fe4e6c799e2a695161353f8195222675d9896c9dd00d09e738da2a085caa856d5aa52cf047dc38f4f0c95dcd721931ec4e56d98b02c6e1940e78d050596f603ab22c0ce19d015c55cf1a6a9b3c7848cf17b63bd8c1f4bfb438af47d15a3f35785acdc0d771c0bc7ee28b1d6df80040962253ffb3e7a4669b63b2b6f2f7c4a26b13a4dfb30fee23dca204449022227fd81099e3bc70a489809301cce27015e6c33a9dc5678a1f393bdf9f2933db396ee68cf38b3d5714cd39c45b37dac783f14dff0f2bc54adcc546d617bb631aba6b787743e1007c561476cc4e9f735d4af50c031edc5078bc498eae92cd40449145158b9eef94d6ff93eb299ebdb35877341f67ba002c458b5b129466b6382691f55c181f927ba57e910707355210e546c01e8fa93510bc523787b34b65ac0a63a406b1b2feeef7880721c5fcecacbcee3574ea1eab81e10a87cfe1639b156cf40c9815cd71eb0abdfe7739151d960d7b398ca821931a582641ef074bbe961cc7ad07da493b57be7619736b2904c8054c44739090e72ee34be5116277e24d00a86087adadae8449394c4d743b459f38de05cebf0c0c9db6d1925c30bbf95a9d09225560d9c31cb8524f014522abdd64ff6b6c226542e597f8767fc2b266a4d13f4965d920b75b7bbe29b23a5f17268e5149a202c8800f1baa96feeaf186d0ab4390e4bbc97e5c6ac3a4fffe587dca6f56aaa6928db30e8675b03e238872693bf3899ba6da8ca1967df35968e0f2373e19c39b6fb8d0c946fa9fbd172db13f4f90ee9d68850fc8797e7a582931ab4c5ec628d285dc06457bdea10318110e88200445eb794d81374fdf79060c97400770468fc283ca4ed7d3b891281015ba2c3a45ce76463c9cd83324367ac70e36a52ef4ed6ec2d7aa14a5e317ca3b00d99dd6914afe0eb956414937f093549f18598f21560a75c23a7178ae6c4ece7954399ace62ff51b22933c10228d9b32da1a2352283953c731577f1d384d53d9f92b3e85229d33356baa62b813e37f509d1127959c605b0dc4eaa121dc243052144151b6e6225abee6c8be9d277546daf3bc8a8dd7ca442fff8ef355e2a6e7a1fb78124b4e4d0e9ea35a5dfc4824a633eaa405bb13044875c912730e6887e647433cc82459f41b03281fcc627b640d73aa04ba5b46e15892fbde12217fbe835df90ff3a32be3355e993207f82c1c114cd0bc978a161529c5043137787d4b7da193ff87b6eba2b55e1e32e31423e936af5519e7f07a5ffd77ad31cc8b10411ce0bf92a54cc2652e9f410a35a18aa299babefc14613a3f107fbca52c6a76c8be54c4e25b9d7069fca4a7bbd2fea6a01d1cb0ed2f8461559d164c5b9b5ad733fc0a7dbe6778d8a2ebac5eee54ab23f7f0db36b614a3adca4372c08e4c68d9a1ec7b5602572558c9b9de9bd96f0552c5bdfdb8103c83cabaa467e433dfccd83d053ce6ff42d818a4eec2cd89bd57fd4913fe9fc83fdd1b6f90ca244f5062a556e3f37da13b6d396edfe28a1a1722127beb7e10b229649b7ae6b6d7e502e86633882709f09e2d4250efbe4fb42a03e765dccd06094ae7003762e9620c4113d8725522a86847254bac28913d397a8f1f03e2572b0a3dce8703a2ef3b5be8beb930c4266070226b2f83fcdda6b0ba5b31b062f8d7178f12140aacf24c297e51d20f4ad8d08b62164c76a96f3b0a2c3089b057d6820769ff68505acf3a6d0514a16ad91bd43e5a11c312c04e1e11ca2a7494ffc5dd3754afeab1035b2809ede17d0fc4c35296ef70377a91283a17371e4c9c308cc9f130236c8fa647085f14ad0a96016a1fb6cc211b3ca3885cb83f791170767c39e48b5a3ee6f308aceb90a1b4b338140e81e258083a098c1a13352361ddb735191a72cc05ce6dd42eec4589e176dd5330fc140e750b4fe1ebc5b5a7b355e91a519b90865d3aad1fbb34db8c410011122195205e92e58858c8670c4bd75cc9865e756c53163ac70d5863b85dc85c6e9a2385714f7635add098d3a80203fa047d0d5b0f360ca89da93a2f42c8a46585c5eca73e145364327649c97f20bb3d5fe40fec7bdb0be5223b535e1284da0794665663027f7f6400a270b9e0e5d52311b02f8aaa941efd44f7d119d9183cdd0231e27a6cc1dd0879facfae89e45ffa70b64615438aaa8085c2e8d2afe9d6f775fa3ea4d5c6c4accbbd326cd038072b15244d8f2b41ffa025306b675a88d473df8c020a2636a490c58590558aa2358fb03cd53afdc9df51ad5c9fb51e39d4d6dbc25dcc4b46e0a67f3beee0816a078db00c20f64c04eb2a88088b83e4a376b9b693a2633297d309b63d230d464bd35f07897a746917d36598c2b8e8de1df4999209ed2a3a9937b38b24ba52d9a24598b248f55e2e5b4d9bb69dc44a704cb6a92ef5e0399e90528c377e45ff6fa5ec0837414ee335437e12f84cdf879a90686feafbbcebda632d85ef11b5a4505fd6e21333f9bcf9dfb55a4a30d5bf3d9540578b569bc7c077737faaaf622990a21c1c5589f8d5e574ac1188705d10c75841b3e9a8beb8227c68f27b454ea4b3385b780699b68a40f445f89a83a228f5161875ea1e709c24087f541894e8f70e5996ec38ad7ba9407b6633a9978042731cfb9bad3b4b3f4d2812a7ef205b74c3556e6d2e5f5ece6916c9de230c5cb5706ddef4de0d7d18c7ce71f198f8d070482e89c77c82ef50a20e0db637f91a2249cd707e18bb4ef7630a61441f4ae05788d773eb7d55099e07000783dcc6663ceaa24a16a4c0ebfd9995702e45d9504d885ff599848a731a91eb1c4728bb824e6f15201d1b21351b2cbdac2eecae29acb5e04b7da20bbc6d6fb0a61112b742452c17846ed0961ecff2d0507b724a0860fc5d11a1866a5c1a2a2c5372304c7c2d161b14bec99cea6cf4ecae8340ca26611439b6e6cd4d340f70b67fdd78b30af2b87dc080faee824f9e3735aca389ddab03238a51693dcb26198a6281a6ef3d8350052ed549509b4cb8ef11fc776fe0cb2c78dc7683c321f233ef5a53c65a54eafae4133c020b181195dafc7b9a790c2cca1b9c6482a0d9d5cababab85c184490c11504b8221f3e4b55f9aaf062b3315a8cc6642983b4898f64b523166dd766e5fa1309a0ba4d5b1ba4b1c259a52bd8c6eb2bf9854ce6937106b3848d8d776bbd60ffb1801d97576c71fdd5901fb5af0f48bc97755052f498d30aa03bc46e0c8e81c582c8c1dc93209cfe067372472af83fd74d42731eed17ceb0e9ae7de0cba8698eea619416b32b44a1dcda5c0f36ae46fec7704027f08532bc4da5fa9ce003ae93867be82fa5b7fe3869b6bee779ad6ec8507f6ac6488926de9010ed72f9329e1573cf42eb720ce2c55502be1ba15c8510d863e2cdf1b95c111002cfaed922424b99b67e1b8f3fa215580b9b6a85724bf6045924af3e7a1ebd18f233439886ce60d44a2732f95f67a1919aa1751b37378eb64485cfbf6214f70374d88480d3ae7ae39d0560f31fd23e0de2512c2c468114b7403077fad700f59f7a9d932b4cd1a3468bd8bf97741ce528f2310a426f9f344ac9dba51132163d4065a29082e68a822241110ec7053eacbed56cc8a85c885efda8e316a0e31cebd767a1150b6bbdcc8ff400750c9bada2066eb1fd9753b61aa3eeaed879b6c1b99627678042146395dfb022c55fc072f7eb27bf607a69acf4d58f3c09eceeab4ce05a9d799f3725b8f3a5b7425a208b4256bdfa64ca3cf16c7c09eea0ab3c7af9db178b1d6ba879dbd624b1a796ceab66f98e632208a80d5decd66f7b7e234ec85b842d496a23285707ebb6cffcd0ab479555e1298b72432aad10d708ff5ad575a9917b0e251ce5dbad4f9b31e43e953911d747e20cea7455a5dff4beb57b8a1a3f63a7256f62fe7b777c34c19a985a25e2837eb3984449e79beb013a41e4aee965223c925e59b6357df5d8dbce34f012dfe75f87fffd8648bda66e01fca9983cd0f38971dd9b79eda3c253732d8b786e5e094c7da47f57e2b72b3cd3c93140877ddbc99e7837c3959d9bdc2595f0b77062802c071c317953a17e293d72fdf925d5cd442592d8cb7412390c428df0bfb3693ad6ae6ce7bcf69c0d56798e20cf8e95df8be95165baea88c73c62811d41f4ea19dbd16f74729a428b465c255ddc56d03e543d5af4923925041222df388bd882139c47fa5ed4736f0eee2b74c5e7986995e809caafd761d7c39302b215024dd66f7ec060a78e4f77ecfad22eddc54c6a16753a37f3550d920c140c2c4ef42d4a5cce8a1889f4ad9d30925d6791731d4f36d87719944981028c6cde5a0876c316b85d3c7f1daa223ee6c0ad5d8dc60f203a7a3dd35ca52cf3efb6c37751db6f37854436aedea3aabbaedf4949aee82b7984d354a5d7f9b0daa37cd62be4f9431cc75be154a1d4a538b780e28a5549a32ffab9eb4ebf008a331c4f917c16f95d7efac6e633e4b993c0b8607888ca43801d6cfacddcb11bbdf33419243011299021426844cdcb4bbe936655dd342e12eb339c0b508053bd875b36fe494a7f09cad5c9183000478d4bf5639c0b0b04c04c1b003903f993be019e86384999c7a7f9f203a6e31db6cadadf4acf80c3a20e400d7fa596cb6dda90447fe8d721405f8adb5ebbe80da39124a137ef10844ac2e488cd1f6f9a1616b10f08c444ab513f6a6f85c9c23e68ef6ce3efe9078d7830e1a3caafe73b54c17e5aa0a6778c420fc9b26ca3aa6106bdf6eadcdb3e7fb53fa2d7c66a6c60b2fa0b93dcabe532620fc137dbf97438f70c68e4923640b5d647244464e613f30bac374e9fa7fd9a996c10849887da6f952f7b4a09d0861265eed0e6646764d1fdddb532151f105b89b1eb160751465ba8e65a920a5393fb91fbcfa3da53c10fb4460e14c9cb0c08da1bb40298c6dda9521572f0e1d1e1c1e2b05e99a4e0425c72624e538553e20c8ec66bf2f06ab84aceb84875f8b7a13020e144fe4c1f95e09c7240a8191551fc17ca49873709760cf8bc18ad6bf613cf2260f14c60f262b917969ad08267ddc0eebab180538e79257d33a79a48746ecad0799c327af213187e4d189779ca117470d2d7a3b7163936bcf6e6c3e8ce6377ed696b017fbb548d8c464f760aceb231afc54fcbbdf77577294e66b1a82e9722942f677c0c39a3c974509925b183752b7f74c824c48d52b6c26ab11e6bac3cf4407086e703fb84efce4d13b26a64c2fe015c664f77845573b7cd91f3d4deec393d224005d56f47b9b428e09deff4fc842a30bf60bf8e2d16d9ccc72791f42576b025f0ff568eed1c40857e8ef4d55a1e669ce8ba0ad7674774c15e59e802e197ce7f1f0a9402838cda76888b6de83cb2ff6aa43354e50a38dea12ae84593e6e28fe388b495eda62d21850902dae53bfe3b666c57d9dd75399fa64ba3e22233c05bd85dccb6cce610f3e52c2cd8826199f00f6e7ea9e6c4dbc13d8d49eb3b0aefecc094c94fcbd2e554ba41f2143efaaf7f2bb33f3cfbaea76ca696312122e46a80d8f2a42c09e89454aeacbdf30cbb1e5ea4d0eac1a8d8a8cd1cc5d71012f7c0b2c0ef974a71cf15b6675bc62302bf8f4e6671ef019e5fbce26a5c73cfff307f40e1a7980cc4abf3de5aec3cc86100252934cca592620a87f3cb2c7531dd2adb42a5c6ca5062d5c8505167baf4bc1194068f8a12c6f0a60c4831fae4208a2c3e8f0c5b847bd6d94196a613d6101cf9502231cd05dbbfab5812185cdc37abd51407c26a766ace8c46dbc43d287ab0f178e208dd3975853bea23223bf742c49388d42cfff2e7177d28e260cf8378cbad06a75c68e9df0ea6479333f35bb397820ac12047e9394382e89644c51433c921b4bf48e4528dc47f175658402bc3b26c0a553a5a615d6f25970af7debf14b717831479e399a25d88280a2bc9db5693cd1ce74332357af2c2237c6ec71557990cf984b3c76971cfa9919beaaece107140e912c54272fb710e9b81c7e37efd27d4099f15d1ac28d3b69325e40cba3d4a3a19ded3fd2e31dee35fa2c87517f118b8f587fbac4f772092c641183dc1e6d2296de8f9a8736af014ff4bddb1527172af22e564eaeb113534302a9b7c0ea3672d8bbf53f12ad4eb8a4153b7e289ca91a66298d10209dbb47dae92718079103eb5cce02eb53e208b4d3902cefc9f2780f5e85cdd00754dadeaf9df18275c8703a602ef68827b521063381087213eb3b63a77906db67ca0fa797376650e9fa1e66f7802d7529a154de8ba28d7100cdc427b01830401640c63176486803b593a7ca2e95d98cd9b8c3a7f50800de9cf10e1303765e971cab953737ee9457766dc8c98e694fdce30bdf0abec527c21813a065e0fe5f2ad4ff4030bb1a6ef485921cfbac8f109ef58b2d284e97c9872e0606c5319e78a0c8eb2f675b19172b604cfe52f70ddf3a3aa323d1f0438b6475ba88559ad0f26db4f83c318728331d2c0d0f095ec078a498d5e082a34a008e7a47ff515d4d7e88f4270dfb66bf45d013ea6019e1f29ada4893d213aba1fb48c863c5be505e1ab19e29a81bfb9eebe281ac778b41d53019964cf0c8f735a6fc634caf8ce4940dd767ac860a14915b4a4ead0a9d5777742bc2588d92c1a4b0cdfb9bd12e1faf9c3068be90fe3ad020233901a1bbc29f952773838560f78c5dcc6eff2d914aca5cdf0d336444ec1cca5656dad7e2833326098041b28becfa9a6b3c9c9e99191630e885b68cef7dc003db52a670831e20f106e8090a6c942eb6b30eaaeb9ad0f2212d2d4c5fb53f05a1df46968303b8acf55a92b4bb33d4cec275d9ded49f53d76e813dde1d13d861372a85316a2c8f5c791a8a0eb2e04e044a4b35265c7a09a7f3266c05813f8d4162490d1d47c55d3a708120d36001572fabd8c2040043de8de891e086787ed11d7e3118432b81248501c611d2f91c63967a0ff48f96d765449f43c41dc70c2eda1e03796c04aa47b1dd7c64905bd036124b73a1a01942f034a2816705a20cec24a079d0e0e5889797419f8857ce0caafe084fe7efef64f02aeb1a0fcb1bbfb9785e5cc2173fd6bea4a6868dc4970b01b3991e4630360a1a68aa26781203857e92328f8b2732fbfc2892e5a9384ecbd09917b6f99524a017606c6069f07301ab087ed0b3d8c46c71c06fb5dd8af9922ab4648fb2c0c464545a689f0b6e73cee7b37f76eebf6411d2deebd754792adf73850476b2bf2afcc3db3bec592d2ffb503ed64dd386e999979b9df4dcc31eb5e72b3e3e4b6bcedca5d76264f8ad7e2b28cf7babbdb84ca7d3310ae1c87f35c50c7bcf541ff481abf5e823a80d0fa7ddff77d6394202b2716bd1e7ca06e105e0fbefe0b9d66d8fc8d38ca7af3deac7d5a149a821eb984b8c7d98ad439e158cbd97e07f79bc838af818cae55192152570dc41bdc01ce03794e4fe388b38ed1b709698b2042c7663c6fa1bc234884116684b379a8283bd6e2eb15b6de157eebfb40d60ec1016bd6aca9df4356a18ec140e77793e3faa863fe43ce718f21a1a1203ed4c3879b99c160b01b1572daa5a66da0db2d116159a8382e95081d5be25f5187c728c57106b50f6f36e2bc7931c88af66e906f06acfe2c8ddf95f002b8f274c1c2dd19e1ee06ea60673292f1bdc10f073fe3c759c1dfe620dc209c35cfab47a4c609c75ac529ea5e46b8cf20ce7b2cea046de57ec7564eac57b5da85a390da79ce6b50ab5d38a4a96a10226d354774258ee3e277137ec76c1e66f36df3b2b109b7a76108641da72b1c259871c768a7fa6f22344f7f10ebe78f3b25c214833a26d475b0eeb8eb1e369bb339e7d2d2d2d24e69d0e0557bad321fe9139c68121284d5faa2edd71be2faeffb8ffce77b90e82988ffb87ec68ed683398b92415d19f7ca674b73893a42e0f731336f9be46dacd55d21495c24240297f6dbdbdbdb3b7e902b9811d1d155ced1ffff1191d11591d111d1118d2b222b23ab23242ba2abffabbfba6a6af567b5becdbdbf90ff74ef2f9d26cf28deebdedeebeeee2ed4834aa8c790d090081d731ad5ddbdddbdfdfd3bce7b73e2511775ea15cda9fcbf8d5f7120a11b55e576524a29e5a6c43a956ce2254c78093731efaee4f52e2ec5853ee552de45caa7a438eaf0e8ca75abbeb436fa39b19f78894f6dbc2ec5719ce4bc4bc7fab940718182e202d53e7e2309da715f4f61bed257bafb4a3ff5d6577ab7aff4e852cea5a7b47371a9daef5cfae98979093bb804a8b31fea2c8b65ebd741e9b3715f7a72cbb1c96df36df3ddb027078e179879977777993f6e4de16f3b96cbd97706008202712c5227974b8c798cfb421dcec7d61bc12ac76df5852e1708be5cf45f0f12515104855cffbd055e50d5ffdbda2190bdfa00ac8e44d508567d3a4febbfb025c63a26c17069b2f691f102b8f77751d631e9524a96df8345dcb7604644232f77e0bd371ac1aa7f91ffe621b77307fedcc1b666cd237f630be6e8a494524a29e54c4a8ee38d67409c434ac9cc2ca54b295d82e1eec8d9aea71bb57778f5df9ddee716c0b5fbdd9ded8dcaeda2cc9dfd061054b2dcb93d3467b3d96ce5dcf9a3632c472661c666aaa4ff8edcf9bb33da34d55e1b26364c5d68b3c48689894df75db7dc87a92b72d5d77eb67af06b34ae13bb8fdb3eb146db7e47095de7e96c986c98fa6d96b44fd77e1b26edc33d94f378d0e07fcfedf7180079691d03deaf8d5e9b250c6645aeea585bcd5f1b26ab662bae623055555673bbadb2b26152c554bbbbd4fee72aae62ae6271a45572da34b18e903110bd632bf752284804111aa0f4b4d980c93eeb9352e729b57989eb00d4d0a11fdcdcdc1d827d399f96fce8ad92b40db776770f394fe380c201f918faf1a3bd7d0ef5d00fdf6d877eac94de54f287aaaaaab68a2e7933786b02ba4b4421b50498244b44b1c493845aaf4381a5b5742cc04bce2354c4799a4a0f5108159d0974db0bd98488cf494bebbed3d9664645384989938894ba93b6efcda527291d2529b54f7f23b50f735292f75c62ee095bff35eb6b75c3d66f61eb39dc9698c35b16b78502b87f76ace7fc5100cd975efed6221dd67ad0628eb5d1d3c2fe30c08789238ea8e35a8d33080630604e3a6f4441f7d9a348d81f44cb85c8d7776eef4a4d79b7b856f388d971bbbbbb1b14192ccb56e8a945fc2c1652d75638bba05c59217011cb4d8787fff63bfc37f14be0ba7d8be5e489b2f6d39eee39668e7997777799d959dd7d315708e7dd7b55dde7362d74dbe64686762fb9d9719213e3ecb22ad589f540cd12c511c963dc0e94fbc989cde3ef5372322b590fc7a26cb63377776eb9979739e6ee2198a8edde1d7925d5e6bc59adefffd13e45435e0ffe102a3d5eaf44e442eb01abbeb8a9d1ec0d2f5147c8f53a3dc0e787f5ae580436570fc76710f6bfd043d6ef58ab9b8f1f2404394fbf2b5c5f5a2bdcba81e1d2380c8184f56cdae250f71c9d1db7df064d7cb0e14c165b48e0e9f06f875f980026ba28740143112c44b658d17ea491210a244e50c1428ab6bbbf3b2b16c946e06dfdf96744421d5f013150231288c410c8fa5550f0a32cca62ef14e6d36538509721e054ff8fe61dc3f232ffa9c1b0c4952f2be06206633cd1e1b483982564b0c882865653a18a2f4fb0e041064fd4508226222f3c3922451854b419e5a7088d245ad338819600261a441762b6e080e50c184cd0988b344c38a104102b64c181c64ff9616728fdb9aa5123e66ddf7ae0aa2da41631ebbdfe9e7edf16bad5f1ab2d2b8f0c02f7db3196c8485db79caed20cfd3acafc67042838810aa8a622a0b8d0fa480bb8d0c10827507ca8422380132f0051e5042c663852c322832d686090064a6a0b5ab7b02db1de262c42c5c56158cf51fd7ddf5b3575233f75cb49df7fdffff8be0fcd4ec16654169b7317e8fbdfef0b53e78ffe048a5dd09738caea4f234bf94f6c7958cf2c66fd93047538d9bcc7415201a66a807a7dfc7ddf074ae0eb3854c16729a6627e96ea1fd7127701c3cf55e0547e36c3cf67180d3fab797ddff77d3bbe020942bfd7a1f4f59ea57f8a482b1ac8742153f9fda97f6066fc0a97f689ea9f22ae27a929aaf62940e57726da67a768a8a2f27b9583e177ab7e7ddff741d19daa21aa82ff1564a9b5c1ef74f3389628283a293ded46e4a9e6e167d5fe1677e1a98eb1c8524bf83d2f64fde7f1671336d1bef06babd562ed0f50982a4f5078028a48175aeb61fb53c3a2e5892b544e38796181d6faddd6cf6db5586a4a3e5556aa1c35fad3d26b8bb73b5c1b88104e87e33677777777afdc26a5949243e81a0a0f067bd9a572a1f8046842c7492985edc872d088f5cca2a4a6e6d756f8b382ca2fa14770c94356094a406ee309bc4ad9dcebbdb1ec96524a29d5c8624b3ce9aa8eb09a43b7d0f1cbc9c9a111eb01fa1ab31c75939aeaf2514f3ab2b31ef4ce7ad073c2601f4257c55d1b1c182d98923aae733f41959dc81b73d93d1776389a50e57bb79d2f27a5d34f203afc41e0da75864edc3327d203284924a49414f6b3a9e3caa9a0fdc736362908b10a44486d1a474971773717326da9b8ddca92e4a8e6cc82facb2072673b5277777372e5dc29a463dd494a3f545463ae6c6826b01e4c0007116e9aedcc646e1b9a202ba7f49d1cc599c9fcdcfd83a0e91fda37b6aae3a4b02db3937c93ce56a2575757bd396feedefdb3997298ba99e655fbdc52904bce5445d5239bc9a44b297b65cbf6ee656e666ea6f22ec6e872d8a0389396dd76767777e666e66626306a7b671f0005f1524aa95ca00f82a40771d36eee6eee4f06e62a66287a7aa89a28a52abb6c25c7706f5fdf755f77f75d1f327777676e666e9641c6d42d5f61dadddd999b999bc5f897deddcccdcccd4a5d0e5b0e1b949c9c28e666e6e628ff6226c70c6856038837de80663ccb0104d4fc838804a3a195ddddcd4ae29b8cf5b43337b73333333373f3f7ccdc67de2ceb61667ee666e666217677767c7e999b999ba19ab9a7999bff6689282c6f000ba827a530d8733f1537594a4a4a3a41842112a42c555e30959939acc011abd0dd7d3b1c6b9595462f9ccecccccc5eb8340a7b1a2f6d99e536039ab5ec6eef5eb940ebfcdcc44fed33c5dddd9bf9caecefe99939b8e1856ebf1c333333333333d32a951b0c0598e1967f179662f1144b318b99ac074d888efce7fb21b8c0b4502a95a5384b49b94230fcc239596a3d70d120436db8c5023d10f4c0f97d727aa0f716a0a2055e22fdef87bcde0543c3521cc4feb013555cc553e4aad70ff99efe10d7bfdee63dc926943af37bbcde254e80d2773d2854c4c81b112a62848a6fe4e5a22b240a127356622e43688151a92e859754ff25d63318a3b19fc53a62f91fb9b39ce52c3f2232ba22323a6239d191134919491d214931d1552c7615bbba32d3d566db9cf18de2a66fc7519ad6eac9c7faae8be2908feead1a5a1bfdcb8469a8aa4989a9a9a9a949a98ababbbbbb2b24a9c8900f1264b1a029dfb068f367f0c6dbc25148dd18673f676b759b7227168bc5aa96ccaaa9e289a2ac6f89e34769b38f2ae67e4355357c0cfda88afd686a6a6afa31e4a36ac8c78fa11fb2aa213a54d5d454d5545515f56406a7e22691f3152ecb1533504657b25c11b50fd7c9f302dafa11666333250ad1150765cc983ce3f5325e49aa06dfde0fec6703193fceea72fd06212c9c394fff109521ca9b1ba9c1cdb66d9bfb2671723c1cd2547342a4ade2c88e754c36a3fbcd689853c7bde2244cc4f302da12c79c3ac258221b9d214222c7eeaecf7aebadb72322a32b22a3a38de808e88ae8a80a8634447475c5af5c5df12baa9c76f5e01dd7c3711c3767cc0705fe31ffe997f5ca8de5ca1613ee9a767b3d90dfb4eeee0470de0e0e30a107c3190830d8149b2abe48b2aecc49be6c1f9fbc62c454af3fde9f3d62a93ff091a4f657c1576ea8e39734039719a254b0d2967d3622b5dddd7f47573faa4872c78aa9fccbe2ec41c5c5759e6f9e5e2c7e36f00517637e50a3c44c0e34116490020c9e9c5c184384d6dd09e12d6884bfe4c26f19946119ea5cf77d044f32b7cfbdb75dd7dd89e37e095cabfe5be8bf4ef3739a879f73243fed580f3925f0f085081b64a0449627de8a0c284c31b28408121affc73aea0af0882da4d3e34046163a7eed35b46d3ca1f259efcded37bcd0af1068e2c80a585600420b18224823a587291da86471c56374023fd1041a95222307a3055392d12691821924d5297ec00324af45ad47f2cacf7a8f7545b9b65aecbd7b21ccdfdfb13f45afde6cfd0c29d2563b9146c76037b2f4cf723a27e784102011f58220d094b1020a9a16a0b4900393941453b4feef8fcd1cbc0d8810657444924febb675635ffefdd83edd87790e9efc1cf187068df6019db675031441c7a7f265fc33fe8fb511bb321668095e8bbc56e76ddb37df6bb55ce1f69ef75f0886e128a4ee17b63644eafaad19ce1008af59b3664d1d6b3b1dc3d1847e182cb268ea210c2d5b90d0d806344d5e70e5e58a16a0a0f1efe46d89fbf847e0d1cbe258a08ec971dc823f591c377fe4388e9b1cab9bb3637120f8afdf401d2f8f2b70a47a0fba7a74ccfb97f7ae1f5f2fef5fe2f8d5f5bcfb7abdc4d1f5e07b2e7e90ff63ef85da07fcef5de02734f48922748cff8c0f24fe39619b6fe1c8bfa20e6ce44aa363fc3ffca7264586a51f5e4015059927b415e3258a20c8a4a08b2d41d0f885865e4c7df076677bfe20fe23dfdb429dfded972643eee55b60fe268a4358defe707025d603a48495a5de238e5279876c3f5f864358dfc9e71e03db4f2a3db69fa2cefe76e110f99ca8b3535362a254198105c90c34580c473811c55496a81a36c949de720b6f777eb2a0bf6458e92888d1a46f01f92e69cfdfefd109a30fdb96a580fe02a1448b105da6f8f2250bad5df01286852d56d8220634b4fe9d1cd2b5c1b28bc7bf3bbbcb01c93d776d34a089d7d33ef29b71fbd7d33e630ed9e21c620c949835582001838d160c41e405342f8471268c8ef1bb4f9ffdb0feed9f34785e2d567999fbf34f4a969b4b87476571bc409d5478511d7b4971cb6ddb36261cd74d281db08d4b8df23c5007ec0375c068c7c23147060d74a4513aa4ead60c10857654ddb1355597353b6e73b9d8b5325c634d87c78c6a535b1c3950abeafeb6ed6fe08e29ab368f95a3a3037774386e97ba3fbdf975c88271abd5dacdb5dcc148ebb2be1b26ca0277b0f65bddddddb52cbcd4f23e0ffcc0d981dc06822028416f061700aeb104d5c558cf00ced0b1a767264ed5fd761850314945ea6a05161fa05861460c1a922e5005981f946c40e108171afff24f0f8a97b5254fb43843268c24aa2fec059429767082a48b134dde4b4b2dcbd392192c6a564822a586e40a27a92d62c084164c30e1f18eae085042796e800a628a181958e9729454a5062952383c01066f1391ed7fe5d8fe6cdc921953a5091d9a7ce142191d4d5990542951418c20ba703acf3eb785b15026b4dc0d03f7961c6cebe742202600e169002eecc50644f0c3f8772af175abbc3efc5ceb6cc8957a3713c6a16652e69f302b74a4d5a351a37d3a07b6f3de0642d0ad11896246490a5f9cc810d1419a224ab64461815314099e92445d7183164c98a868d2e187309ea4989cf4f69649c117464ca1e0490d5d9ea460050baa389284122b767b9c2a5d1d21f960dd2a501b4183126084704a228ca9143ce143154638a912a6055778bb138018c48821c45598316ad4d440eb2d549254493ac207275a3fed87d552f0c518576bb48872a18b23be70a2a4431659ce3cc10fe35ffe6924db38e92648d92c003228a022713765b438524493224ba664d4d3121ec43c4963c57700013f8c7f8d02a0258c142a294d588185c65310d14107196e1023860f788f04172829446145ca1315377021a50b162c5439020a8d7ff927087a7bc5f840d5a62c59e2062d5fbc508184c62f043106922bae4c4186c64f74b1a4872d569044191a077420a287215cd04313332378dd401ff0d48255172546a831c2a40523a42873050e52a468698a8c918598334f10e1c50601c6952d479ac8600505bc827eeed25dc3c59d5814dd8979b7387906cc56fb3ce55cf6596aca3e6799edee9252dddd5d3064ea7e10333533e128fb41fc6769483dba59a7dbe7fb20f863fcf4841a961fbc3c89210517525c416315d668e1c40718be709ab2544b42010a199ac4acc0c8921d226298a1082d509e589841c50853154d46b48c792985c1a40417279eecc74a388a326286c9551229581ce550068a1454584a03f52f3069a18b28b640edd06450a024c91054656e48a28b24351c69c2821ec2c812e64bd31543249d01631f26822f42f0b0f4e504235fca487169b282253088a85014802c505145a001e2c9548d19b84085252e3481839a08745133450ba817c028e322d2650b31495ee02109c9db9d1b52e853d8cecf80b73bdd228d3acf972d49a89c547171a40c8dc348618111399051d3021affc754b03e6441424a150d2ee49006cb155140d952658c9125bb33fd0067c600428c92169840e28126b808838553920d6368cc636dcb115f5459192106aa0c6d9fa47ce143176028a939523bf2c58814667488a2660a087c214673b382b739e79ccf2cba5027ee079c92a8c9e2b6fd722a7fcf4fe37bfffd3c4f6c85e3c60a61a10ef7b272393424751d763bc9fdb6cfedae381a75dceeee6eb76d5be77289305fd1fbc0b592f56cdf77ad70e6748c5920277e40b62b8ecbbd64715dd775ddfc6eeb58531c856a2716ed17c9e7b871c551268ebb2f7138912bbf9617dd73674ef798b3c3fecdf9b27f766e658923eb65f040a728c59f322350fb6c536edb16823feb77f8d7ea9cf2b9ef6ab5b995a253eb5b22ac73b834deb6beca45f337ecde2bda9145832b771d0b74a4b0f6e11c1a53dc7eacd52eecc465fe183fe587455dada0440b2f62e800c50c3440260a891a94c240620cd7b1621caca1deb736f8773d0e8ca0523fb27938f042f74129b21ea8d78614747c56a8d3fdac21ee58b975415f62bb2d38d5c6c1843907b908f44154f7412c96330deee06954ff01721abc80c951fe63d79146e54dfcb5116b1e5e40b81dccdaaa31b9899db8e2071deb9f951381b06c6278b11a3bfe3dd6aa8f22a8cd108a582c166b6eb5eacfb933bb151878e26824abadefede9f75a40b87adf216f6fc7de09fa39727c3ccef13f719be7f33acf6bbdb3def33ccf33a1cef7c271639a0f84eb94eb846a200aa613d24c09838688da0c2c5cb1548507335167683c0417303b80015565cc0f566871a40a19682073048b9d408045d07f193dc810f6638b300f8b7a47fff61ef6cb20374e375228ffd651264324affddb07997256242fea9723b408ebd8263ee730a6b1b34edbc1b1c28e0c2251377421051a158cd927beec30a6ca1a29860043e397cd2467b5edf7e8d80e756cbfc7898ecbc450057969bb3a1368dac837ce00ed07edcbf667564c54a1a1d3cfb57f96a6d3e20d2ff667fbb117a868480fc012f9fec926fb407f7660bccca596048929c67c21c30a338c41e3c00b0c2a38a1050a0c5068fcb2a82bc87891821037d0f809258c40c19234505a20a1f1376f5b3c6e652c507e0eb61b08fcdb6fdcf672ebba35ddfc1dd299dbbe0bb76d73626db2eec4d1e4fb63dd4df41052eb21a4b6925ba2dbcbbaedcbae464ceee060429f99e592c7624fc7589664ec798e2b92dfcf8d30cad2c89652226dd2fbe5f6344bffe1e62bde7f826401f5c316458e58c1131aa350c4911c7870c116595841e3a7b01bbcddd9b6ffba3ecebf6d329c2f9bedff7e2c0787d2bae0440a1469b834c9c2a5823552699cc68c1185b6fffbb16d2d56e07e7580424340419e8321703be35e5c1407f6047d5e8bee7bae3008e883200ed4b11b080205f1ecb69f9fc85a66392b1c69e8a1bf0cb75f50023a3c44252a340414d48de1bdc422718bf8a558b4bd73918b5fc7645b282bf1605668cf2cc707e2a42c67f375b8dfbab1bef55ef87d32de1bb9e6fcfcdac7f594fecdd3df7a238e37efddc8e081be7ec11df4666c7923787f234e2aee8da820d90cc92b9511ee84b1cfc1019148aa5f77cacb14551cb9de6cf0a3f3b0dffee1e05daf136ef3b87e9b07268eb3e2fc06e1368f4bd4e161f32e7194f1fb337e411034b879ef46748523ad2efa74a76335e88f3b35d631c6619c671c9b1f6f5ec6dbfc5617cebb705ec6cf9811da841a843a2180bf0ffe3e0ef8f4bdfe70c21a3838e288e4b21d282f28819b1b1d1e383feebb1ee7b7d2d75397b81dcb11c76fa76bb86edef52008e2e0e0fc0eef71be566938ca4a5f37378f436f429b5f706b756d5c4f5dff0ac7a3eaea1e0ce7b7c29182f040eeb1c211492e272e8e16d0070a92cd26ac41229ec7157122d2c6ed76ee2292ac45dcbb3fc771727fecdf8ab697dbcbe7c4227f1edbff2616f5fbfbfb161b07b3425f06e4bd42da31df699fad3de04bfcb6822028e6746c0321e83873e6e751013e17debcbe7d3c195c28cef7b76470a1e0f7b7fef3e9e6013ece4d48c3d9b1d74b1cc16f89db311b719c558e00bef75e2a17e654cf1b5f620876b45ec73e0dc7a34adfe33e2e348013753d0d912475895bc4a247bfdfc2223a02158b582cd2e1f15b59dc8e7defbd0e4fdcca5578e158abde37a8c3a3ef51512784d6d3dfd17afab50a86a3aca07c815cab1c3215dcc1f76028c3f1a87eac6f85932580ba853b758452951df316d0af32ff993b950db39c6c5d8d36fdc748cd488d266b349d0970df7d0fce5f480ff99b28a4a1bcdf80887e6eb6473989be2c8aca0a4890ea3f9ad055174711d4ba6e72ca6240b777b1c8fff37fcff9b21591eb3372d5f1ef97bf5289929084152f447a28e2c51ada4e91840bcc34e1248c1c54a05dc089195018430542a4608596e5cb093a8c41c60b2824fedcef906d08951edbcb1fd23d063ab131b089e2d2a89a072f3d90a99dfc8d7b3f43b9f27b7b91fceebb0fe1bd7b2e44f2dac91a1d63b9d301276bb8585305c50a62a0c4b0a58c0d2e88c1520cb2c98e86db3fdcf981b6079dbfa8848ef7a31a2a44368380200123150000180c080503029168401c85a2b47d140010818c426c48164aa46116a3414a39030c01048008008800c8400dd20e70b7cac5c7e5b16ac6b9267016a00a732f52813eefd2ef8b07dc574cb4c391fa7652eb888e1dccee86410de60448850f8985175dd12e9b92d863c5d74038a3537bdc79bbdc00175d456b5c962c5c740fc256a98a8c15a78e5a0a6665e438152e18b110b22dfe9f7bdcc36c5e191552ba22a4f8e30abc8ccc2b929aa3a52e93c5221815b61968575457534155ce6b6986c7e24d483580e06dba886dae928b07cb85c73e17c351cb68c6bff58ab1b177fb2da9041292fee536f41b52e9192b80bd4ba93669322afb5f086f60bdc512aa568180445959940cbeac1d75f984b415832cb4a318b1a36a1b8950aa385262d5133d247f0978febc704a15d5e750a876941850159381d1d3efef4ad6a0d9b3aada1e61c42c6262b6a54c00bfd406bced2630a009b344d20ff4d1b76a5d7abd7c66746458c9da96985dc445f7c5705f19f2c8360586ad890bc0dc93caeb6ca77f42a1ac90502452da5d4a38acc5f32f344dabdd573a257235856139fc90c093ff93e04756c587d817c2fbf52ed2e082360f78336c6379cea95c1338d2e152cef68c081ca9a836cc405fd2dfb2eac3698ed46e448ba232c1aeb372fbb0945f2f3d672f768c49f90715b2abc4a69c621321689bfe6e368c200d6ce8aa0155ffa746137b99a6c356064c46b6d27a7bdf077bd86497bfaaca51adbcbca73713174fdaf03ffe8b164966916c5996cc68e5e5de61fc10237467f7276f4ad2aa7712a703253398c8d8bea52beac0a95ff9f6aab53e49b749453681a2b26f4831510b7104d376c1ce986383287d53ce7228877e5b20365516e53c1ddd56d9ee6e1b9c515276befaaad007a4395968d79b4f8b50cf2ad7c5d522cc45296baf521ec46059c7de6e47bc6fa10cc761e4495df9ae38a6ace7ce312455cdbce62abffc65433b4a28bdd87947bed0a59c53dd9851efdd1e1d2a334af18597d06e1359d32cdd11e5a3c2575f21344b824e0b11fc6cfa45f30a4625a79fd92f7afffba66267c2be148448f11ed9bd0d5095aa7d4f7984e6b306e603a7a6f8048a2ca83152e2eb403418384b089d62889bac320a9401efc6be5f7c693db4687f320ebc3eb40d0bcf5c56c0aca02ca19170e760af31d1d7458db45f22cd77d1d362d4fe459cacaa0a574cb71a82d982ef0174cfe9a43b0b8771947ac4614b9b79d41fb74b50a99fe86189269943ba98cc225de0cd912eca26df426ee1983e10f6cd831a22533f28f9f8249ae60e1cdc843f9252fd484ad406555ada5160c010acd2bba7d030dd784755ca7cf23eda3d704b70e438626cbfbad6b0d216fb5b3da91730bcd37b5d5509c6f209857ef1e3c65cb6e89596efa05633fb585646c731607a6ab107eca266df8e41e27fd113756d124f9984c973ce19247b35c204390d149b5f23b5731e5ae0352a8d466934d519ebe5fd2bdda131d8f7372dc352b6d2bd86d8ca154a2e065a63ca08b72c03a90bb83405ecf71d7b39b78a2b42f92741feec1aa467b597985e28fae05aa84ce1da125d0975a6fc941aa8a9edc4db05c9845655d79e5fbb5fb2ad13086d5d4d412d896e92daf3d735032223365175e7d369fef150c72482f1396ed8231eee73b0d1886d50c8ac8374d9c98e260d85268ab2fe0c5c30ad85d60591f44fbe1232f95308eef0e3882bb8b2926073bffafabc1ac482eb9ab5c44df81a1fd5c16fa649150dfb6e25e00c22d026e284aa7e0d847a4f5db78c0140819539403ce8045b472b61f50557cec9746fdda4b4bf67f09fb61b1f6de43955f3fe58217135a06022dea638442694237e270d3c35f2289f34db282f8a020faafb761e9c10e3717956677eb5ebc5c0d2aca1d100257a471d8ea3c3d2a4164433dc20086eabe5b7aaa751a032c0eacd0167555489c6ca510b8626d40a9a2c143f026de9fa1d71371dfb2ee113894558d828173e6e6fa117cde76fc845a887ea0305f9fe523fda27790da90daafaa911b0d43628bf0381963f446b2a09f21cf819c8c62b79784e4ccea26500c73617f3a2c585f3b52af09a28ae9b21ed24614c2c2093a0b31953cf8c06ab51c6d338bb70313e00a61597d9014f837e464f75efbae1a2167a58cf9f6a92eea369d46483d6fff3f547c611154a7efa8fd4c26a036524175692f533ce980a95b28bc6318d81311de5c116d7d590be9e3337ee3cd2715de86f8426c20b3abe31d5fb47935f2c1dd57a47ff197c0c88fb87340193d564997ebf892bde409615084d87bb88114daed9081e124f70bd316ad41782856e0de16a24296570d33fd016bfd23924cc1a31ffbc8c1f0cadd586ed1ae3e1b8cd7ea1b7bdceca7b886cc8f87fd4f8a9b79ea5d8098e6c5e8f8cae319d92c7ef6e5d9372ce86110f3c63e8a744f1059ab6354eb55cf9456aa01ced2e36303872b00eaa6559472f4f2a6412bb98b75561be11da102114990c1c59356de57ebb9966b22bdbd63ec618d816270de5dbc089a66a859ebf6a65fdac6460f70fc1c6dbdb3cebbc74b42eac7462f6b5ac79769db233923471134404189578cd762e53228d37c11f54e3a51eaf9ed584c7d0fab13e8362e60347544ade70ad32410597e6ad4cef6f9b2d6b9495b6bc51c5bc7d16c0755f0ecef11b5e5a83ae20f39a42f2c61457f8b66037b8695c74b1cb1061b454aa5d0c3f71d1e3d24524a06aad67afd4f1011ef831e7152a1a9342c20ce652fbc1d182d1dca6f6d120af82f115fafdaedad776abcc8e9ae7fdb3fe47778f838ff225166aeeb7b5cdece2b383542a4745e7d9985431270123aba27416bf0c68f4b017e5958cc9597f991f914307bae7624339e87d54d5052634743cee9475694a8b8230fca6b2ac5498c75cd07cf6d7a5e54c3ef528c4687c78dfcce05d0d64abeb4e7aa0b9d60e0c5af20c3b3fdd8be7a73d8cfba11259a6e8748d0333764c0fac2a8e1a7135abd16a4a8b652d10e52c52017fbe5727f86ed8c329f76458943dbc5c6fff8e85e008befc058ce8ebbd56774dd1b8368d11eb05b0b5f70ca0495117b9d34467812b92ba20edda4558ce6b06c94af168c816ae2554c426fe1b7aaa53a7b771a687d2da74351f76a2b712ca6a0065d6c6cbb0674b0b53628877da827c23bb3b48339123d715efc8b062262f76fa70d6d4744ddc82b7d50b3d527b4399d6bbe98689ea7133e2857dd6e97e80e6ab9ad27715e6a9f579d7ecbc848a5b4182d7a2f5aaba71bab1a914846c2ff1a831418b21a9a8e786a8d7e81fef410aeafef6769cde4e9b11b89a68c19c09dc25a1c4a98eb57ecae9addcc2313bcfa9f0dcbb5aef84780074ff76ae6e19a2a79eb75294463ade551610897dac7046a4e36905ae49d9f6d27160becafc1a957a2e2969121b5e4db194003dcbacae428ee4f1cea94768c566e2404ccd188e85f7c9037f71ad0590da8fb0839bbc6c385e77e930cbac9f0ecc026b6db8eb0860fd6ee07f18be63b9001f8e884f1448cded68309de0c507a631bdfa4875b305937b77524dce4b59dbaf827146f0f5b826fe07244a3f9df9e468e531b075c81cd95052d602a958911978c45dfb5d44455bbe02cd1507d49bbf280402e1539cd5ab958f3f006c6115a548d2ad9bc07431d2b518829531afa589f2bb05562e261250ac3432ff0b31db06fe40d4a7172b4383d17ab44f096a5bb6c5523ec5901e2af79a441bba5d4d78a3738c6ba447d60954e00c93ccda65199630675c03100f62ef9c3aa4fb75efff123c0d8194712d8e916d4b1b5367655180661b20770017ccb7658d65054fc6ca689663f19b6bb49ff363e0824db998db9407ecbd8280a710e6dc2efdb4d349dce54c7f36b0425f9b2d3e785e881e6b5007ac28ff51285646b1fa8d53beda19f562cb9a831f1ab567c9e683dec90551e0d0d512039705ab70f7951a15a388bcd552dd94c884ed3ac60bfab60231c6db1dca227d67a2d65624f4db647c2d871dcc6aff4c7a1d9bd71da2d48033dd614912f1a045acf97c6e667414ae7284d7ce5ba9e86965ba83cb25895638c8a56cf823c0581bcbaabea49b7ec5996e2ac9815c8e1a0cc7a8c03f554ec9b28c35697a8036cff7e24b874a973c7970fcc7cf2c0380c9f2be9e5c42a0934945eab2f4479d438c8cf2545b165afa1289943c05a2944d30e65100323ff7f2f355e25fdd2415c0b9a2a13a5e43f83d3302b0fde4d2de851d89e04daa38f4e3b8bc45cb486d1093ea4553bb1d1a7a839bb65dcd7490144120126a4f30f9cb3b270c8ec7aef71630a7138f856cfedf19780983ba585a8e813faa331c91e0adca3a68107d09383b8029684102dd96cae36adbe33af974a0872534088418f979bdecfabec46500ce62d10e50b16da148cf0d4d91220e78b77a5b3ba4e33eec261a8f4a009a1719e468bb4ae27b7ae758d8aa18c8eeb64d379191c50141b16aee47d5b6b7073da95ccda5532e2b6ca5c22c150da580b5a552ab2f7192213c531362e1c57ca6830754f95aea5343456e1f0d629360744917462057bf25b13ff1c404867941de5413dc8d1ec74bb6d152037dbeb07f7a3e0c6e1661edf102a8dbbc1fa28eac2c832f2539831485857be5ced2f6b768cb4e35c70a2553f934c084cedcfec1b396a8fa6d616a0e7360360e4bfdf7f814dc3cf99ebec478a180503098b9c2f6c9117bdff0431f29677db0377b13397b765565044f60da13883f59b15c37f856bd166e8bec06112e2fac46f6c81f89a666fe8835ecee5746950eabfff856c1f98b67ae7d76d0325c637c77f4aeb5078505c5be4e9035c725f64997187c3705e17058a9d4cb2b3f2a759d1e2920a1c6f1e15d052d1c40c25dff5b27198ea7948950f14e648634c7b714c26d0c4dd057091caaab282c1329b63f49d92dcd855ef60fdb4f90321feda8fa9969f5e709e1aabcbc1f898593f64334bb04bc712c55093f749d5df0f5028d0513704cb8091d5b70ff676384108decbf64824792299e97a71915438b889bfa0ed85ba558d9f8142f3dcd0b2506486ba83c8a7c288d2e49b63194ef7ee77f35efc44412c4ce451f29ef0f50c94b95ab1f62a2b4fa35a629a29e070d21b2f4812a7f6db8a1465731e62ccb589eb803b3df9b15f29d684e5cedcb48bec4701c320b776036bbcdbc02b22687bad9585995c396327c62c59968127d6d8b6ea01cb690ad9121842c105cb2747d016fb3c8af87369678bafc0411cdd6af9174153078417ca9ea4ca0fc8d59545d41cec6ccdda3a3a74578c63c192423e8543785c845f1184078685f09888889d7ef351ac70688e539f24bd570202d7fc48851b64e87844959f72b533188211ab6c4478b4a83f8e61c60e1d136f6631acd51c8734dccd221eea809bb3dace0aa92621aef8e459b76d2f2956c63719a60490bae9702f5be136b45e7a42e978cbad7d803a50d53ab66f030bf0903700eaf1c58ed2c7ef6912b0d12ff1b426a8a603dadd78518cd6ffed315171f2bcc054c7cd32f991fd1d8b4973ed1dbcb71992048a51d805c3a32415517c1e1f1c74b0ef3c15772850419ad3ed1f47c28cff7b3800d5799ae91468fa8905b4f4324a78f1a588eb182f3256b80cb92bffb8b8cdd3ade8df81dee1704f56096c765f9dad9c4e0bf5bd37524d71e12d3da133a93fee2064813a05429acc4324390eca194725c3a5e9fe16b3a0c4254c50a74b624c82bc6c944d5d2a13731041ab7e35115910c94658820fe6ab31c25973a6503cedda15710cec55506843213fd3e1f28b3342806dc42415401abd064dd01f6641b62473d60a91c846c39f42333d1560d662a84886a8655a34283ecd6018f106b5219590db645e4c682d694d87c5cf941ff6302cba872506715379c5ce4861dba3767ea247bc6d634ef416d65550c6cc0d90378706d7861a9b73829d7b1574665ef7600a757d2172aecaafc51ef78dddad6e5da2071b32b5f40396eba9ece6700e301d0d01641221746e8f334c6f253f8fc8c0b688cd7c5f73279d7cd22e05264ed424e443f0ceb1f4112fc8db91078ca37194b6224cbb849e38081d58bd221340e06d5912df301ebf093e3057b594477ae9751c4c61358bf526e3fa6126b95549f2d757cba9e257ff83fd9452ad0ae5d05ba2674881443d29bc5ded2070c60e6586e6bc2a7dc5ad437bcc191434eee60e93ad4251f5bafe090c3a1178e1f4f6b4b1368f331ec6cec8e7b6519f57c0f0a585f2e5ddb703fff10bc98a460f8853d08d2f8329cb845d8b9ee58e80f075d6009f9a1f7556522b4049878f52b7ebecaa1c74c1e199d46c91cd98c0f2733c2d6d30cc5713830f70017b77ebc3b078b2b1e53e98f1f157402301b9795d06085f7f77c876bc4316180f6a7189f4611669726b008ee84f197b5c71e7837e62e776e0d86e8999d0f8d3f97ecf91b9712d13a74d90a60eb713ea60a60743f600e2aca1172d0b2910e7091aa494e7ade4fdd6e62eea62576882a702be0b7812873381f9a7359d143bc91dc6ef1e95e89941e2356f1ccfc71c7d67a0b8609d9a247cbb4c1173debfe734b331ee66b5e8095f588dcc7494b61e8f5cfa47bf630cf2ecbc12e12cae4b944b25168214dc248912fde1b204b07c1d54cbfe01d303f5aa4c321cfeb98301334d1e5bedf12cb628f2fdcde27a6778d33f2709c66605bd070343ec047fef84018580692fd814b0c6765760e09f230303ee88996cfa8700a5dc61993e84d554272c676648355b946f3e3c6221213f65d54de6580bbe1163633ed82e20d845a8f90de17084bf1025141e4c0361a41ff0c9b7d463c6610738f2a9d8327dbfee74f2517da95309bf30f184b8e96ef7b835a6d9385d5c7176263a8c7a791d024d3817ac53578ece2d99ca449cad90696231d918d23822eb8310004e28d61eb2186168be09122f981ba491ae97536a7990e4a2c68ad9c9569144fbed18e41ff4fd625e298a4450dbbee6f342b6e9629d442c3214560fabb931cdc51e00f3ecd6ec8326b025439597d0ef4fa15f113af074d81496d96295ce9c6edcc251aeca9ed4e2077be0d215e2cf1370783f8c6edaf0652ff0efc9b7dbeb7e1312a780a35323f76478b676b626fa6f3302aba5222adacf41820f7f01c44e98d42a40ee12b52b475106948c14da5db3b3d591316b1963a4f1e75b00f8e28419263d7de38ca248cca1ee95d8b4775b459029589201a1bbe72402ea84ca1728b623732af6fe01fa0711abde6a650f912d5b0a871bb5f9376b74650937897c944bbc5e6b161ebd869c053a0043e81c755a9b317ddf2b9cb608b67aed16dfc508aa4e9d45e9f97d38c881d82e581534e6ddc6468f3220d75e10e7cfd0f428ca5f0a79ccc7229eac404dc3982eace869197e7540be81743bfc37881555c81e6a11591196a83e2c122d7d197dd0779a9775c45d15d79118c921171f27d4e35aa3333845a31149ca0eca5d11f2a22327863d922e53b3c20cd233fd18f558ca8b25304c4aa801728568d582fb511d6002c418878127010516c7eadc3b49d4e984a9b48557966ef8ef2046af07a7c725c431561812e02912cd09595d9eb11f827fcc0000ca1677fade4f04d8e98c3dc380c3cf32a86394cbed4b94618f6397062e9ef05878183046370fc757967dbc93593024095e2f25c933b0bed52be69cad5080bc2b194415dabd1ae60c5acb1878991f43c5b102c778e7ccb11b9bce5027c319f8851b8e5d7475d7c6ac90a29db7aa19c3efc13114296e3681e9d5a7f1f105caf2cd83ab360f0425520b729212f8c87d70d1c319662e3e74029f21671c6ec55794afbd1a7572cd07b1f7475ade1e927bc0cf402b9b3c09e6ad8b67677891a4533e136ed5303cef7c4a2b82ef00504215d66b1eded2b7365cd81a81a4cf3a7664222a7d51124000b781354d2c9c125c6a919c4ffbc6f0886d3e177327fdcaf59a1c8ecc9b6487f3c0612637b1db608552b169e36b171c09637dcf9729bfd1dc5608806d60a5fed581ef53967d759eaf4289e1779b1b2c111c41d2329dffb52ac6edc516f3af40a935c9fdaf121d8e3d283f6408927c6077ead2b261bb86547122ae558caf4be9575e2d28b35c4114bf8ebc3f9b9f90932f629a095a5989c00e65c3982cbeb1a9337802f4c5844e2990579fcee5224f506f7f02e042a9381a197da2a5799b54dc185d8e882c7a99ec919d0fb4a8b0ed999beba5860c2b335ed909b17b8fcea3fa0bc2278a30c1d96a04bda0d447d198e1a2fc10dd80d327f271564a3382a927bffd2ffae149a5a487dcf38ed3801568382db9867ee564d759abd61d774e77dc2bdd0b25599ec6332a52e53514ef62d304bbf7739d1e66d35f7bd62f444266e98ea5d42819b2d1701f32f138a1a8284c0841d7394d13fcfbd09702aac414c3b396935f8390ce1ed84c357f1820e9f3d7038c5ee8ab2f8367546bb5fc72e0574f43166a16237bda7d322e93fdcb76f995421cb90f8be3459849279e417b68b84bcb2ff2cad267f8dc55c53aae47f4fe0129de12b4e7aad63635d1413d4a121e2a73a2b00674a79a98145be392b625473c7aae2035340c6be23c8f2124e4919bc3c089d924e871fc2754a9abb505f982ff5c974e8a40993c0715f8f8393bfded8bd306640af082a495bef6d0a95e547fbe72ec21a09c60b7df5f1e20c19870337df580474c415b1859964a41d7e607f665c3a68f48a30f530aa06f60a0b32134770b7d95a98def19780656b97df90ee93e837455fb8d530e10632d0ec881a0a4ba143268e8161031a48adbede191824e0fc1676c45e3cd89f04d43b90b21594ec23315fce42d459077bcac9410b8b0a87e4f3399e0294d971a4f67102865f78575ead19425d0780d8651325028fdcc4ee812c9215f8b04868a0d79098d6f6bdb8990a7dec3e2d2416f86dd2b187aff013822effa1f577a041996946002895ffdb07eed1004f8ef247135d33e80794cf1763106c160b3e7411e023bd97ba12ae982c703868dea717ed0281ac8fba7a515fa9e8106450f41bda049d04779be995dfc9057425834bd71b8d15f7afcb47151b569fba9d5ead7f41003097b61ad7742590e4edb6a29f7aaa90f59f6bbdadfa4b74a9bcfcf19082eff6b209f8c7d28cd0a6ccaac2a8ac6915a382421365b642b4ccb53cb04838d8a2d8dfc20c573a56d14cdabfef4820515b830a6616cd29fdb65a711db1ee6710ed441b7cfd0987810d68f3760020fe7e009139ff19240b63c1515f84eeed439cdce057e077ec797a6673c4de376a70a61fe144a3188999f17812a803fdc009f544d7d8a43592bf643eddab61f9a586bca94102e146006b79b8f831856a1c46ddce831faa86210228ef717fdcf8e0693802a9c6eb49977018cb46e4b87cd33f7b740caa5811239b2e5087f20cb649ad30a909218b59d5d9b119e03515269f60ecba28fffef959959f40407b6a8d5a39c2e6875b80d00d85969ada0992ec76f459719e29e4f35e8a83d31409bd811fc9ececd13ee0a31e14535c3b2234d0743b3a331561f8d08a36e45ae81a804be4d75930df7373090744d6952f817146b7ba3a070c9f73baefc6c1d2110ef300529d771c9effff0b1b3b9b7390c1fde8c415d958469dd8d691aaa708dab674d960c88242e23ae9a5884449cb474c54d821ffbd8beba00614d9dfc1e05d2e40d3778b358eb05624ce8adc33a2235ce324503dc74d6bda9bc1ae5b0419639de6e69e86d1d076cd97be88c119e6eca22b4194a25b9c9602002a0d51013b4e64807ef2b90b3d80e84936888fdaeb28a07e8430a6fb97af3b10ea27456ab43c2321d5eb4668129ea7633ff827c4afab6b687e83e82cb361df559588fdecba713ba0a928b2806488641f5eaaa10bfc2ba139bdad94be64a837de738c3839ab14b0a906b67c95741a9ca1d9235d674edfe1d82f150ac0c775e38f53559a6ffdd4375865e47f8933a3fafa58b9e5726388507e21a52a85943e93e68c299d28cc484f07949ee2e06f7b38a8f976100ed65b3290825c1cd041415451dcf26178e3b51acc0bc147ad7a03e4b721bb1e2f47e5943a6ae25a5301c29f494d4ee3d691d0f7673db6235f58c85555f42cece7ed95a926e28c93b6e2524b851c515a11e432f1c4e30d223687a3ff3ef64c46222c5eb20f2a51dfcbc654ec7d7e7a24fd20ce8312429cc10e1fb05ad0fc319ef9afc48b63067c09d8974f0f0ac177088fbcf75092dc222370f2fad0f5fa94504eb69701fd91a0cd43ade34118931daa0da13ba5c05de9ae61165af698cae050011cfe0ef6dd31386d02258963d9e05dca44a765d66990b9f4020f1e63cc6e6b198c0c25f41e43bf99d9ec9e8b7e7353bda953b11de734c6938014d8aa9b9b43f581b2fb7508287f73551d0181a70313526b454a483fa5b1c4d89801b58c791821dfc5e61e6a9494f0fa4e5201b5f5dcd4fce114340ef2c4c31c655c3568d5a4d5560765d5c4c734f81d0f69c744683bb22f9043b12a14a7177dfddb4523f5aa189d43840e9ab39662e35eb6231728cc828374cb6506dcc01497347d7c792c4d17d8337b44661541b03054d002f91d35ae90d04cfbd56aacc9090ca19d597b97da773b9c114baf24ae96c8357b1edbe2a9f4b2a2d6fd0e105887ef6e04557a791ee4fc8dbef76de1a21e3f0d4079b195a33c1210734f04dcfb8d0977a4f02bb5fbc117d4f34a5ae03cc9fc6268aae26946ad51d38401a3c2c45c44219feacfacaea3372860968ec46efae4af8018e7b2417c59d79f62e37bdf2f234ba82b36c6ee974844eac9b3fe0a6c33c7294af51856a6e8b7d7589085dbf345714fcc70bff94300b2c90859270f58c6514f4c51bb630843a978aa7f311b4d007873099675fad1fc02d4d936b4fc5b8716e445ed42fddfe1202326e8809dd553d7945f10c26051660128a6b40be6b032efa012fba4b342eb384156ca83166105b17cab6d617965363321672a46593988864ac6a942d68a04e85a2aa71e8f4a0795609842868dfb97e21282d013445a27580df6e4514a419a8503d68cf466b00998d9abef06f6e742555d88eddb624e4dac7ddd15b8f2d7dd2ff20672d7c00c6956789bf07165d5a76981418775a1da5260b1f5c0be3a2da01a1aa942809beac2c06a7696bc10fb4f438002896b11660d2bff4882b92249bc88d9e012b2c726c972346b79374c79be54fb1da94d1f06f62989a2f22b6fd81f33c9e1877c49adc9f81056dbdc5793fb0a902caf055ea01004d3f563a122dedb44cba1de9577023da1d55456e8ca4a109b063739e9e2eb3ae16859f2b5ca95076c957dc356c94d87d82a4960ec07b6456785a55ca0faef5484be05d88a4a2446f4463c019030f1c2b9836bbc91954e1394cf405a423719600e197d62fc17da0732ee978f577257a0279c4be37e4d098a3c6f4f0bda14244935d709d2670aad028939d70c47fbba12ab0616b42b9d065274270fa225d8dcc671fcf08e80bdb0b548e4cda1f245f59df8d07ba5bb6b38e01a5e2b627b0437f0700cdb89d50b20bc2f3390d1b92dcf0c6bd7dbf2607f28840391d2a306b71bd42ea89b779baccfb93810fbfd7f19585722c613abfce35b4e3b557dee7b5f93c98cfbb6826b183cfa44fbd101bf0d8a563896355b652eff81e7aa2a811ee8de30fed9411b44b887f05a3e91633c29e29dc1cb9bf203c1a2372cef8baabbb98903ddc3c1c25a25c44ea1c2e6fe982ea1a324f0f22256200f5272823198f2ea1cf7378513ef16ac5a2f4ea7b28be02736c1820063071bbe8a109d5b98cf9d81b55ca83d4b45e7cfb194c5af2102103d1ac7113cea1fc6fc47906385d168f1abc346dba98c6d77bd12fbb151991c643ff235508abb4be8c74b91d3fc9f8692dddd72c30114d61e8273353ecaed08383a70dde745b14cf48ba29817b029f4e51cc8ca3aafdbe807a20319c4ee61d05805f6e14e09f1a1d765419f13d4a6a75093e7da94e364f124d534502c0893410b5852779c1c8163c1e2488c0529c7b6cdbdccdb490512f23436d1d8577ba1cb81ab47eb22fc46a69dabf3ae795e1fe4ef344c9bbb4fab17d8d730e59fbb31cb70eb2005ad64b79efb703f69d71a67d1cb63583f101d13aa1b4ac20849a44c663595dcd6877841a40e839705b5cb041c65cecf5222f543b9dbedd4568791535a5a6eccf7c245c706b42e7d2a3dc0396a739a45e870443c9ce0c6abaa52a960ce1598254ead37c6493d30abade5d9425ff810738443e9b5e623d3076ed4cde42ebb96f0af75626b87de20af1d8f59dd2176d4a8a5a752d0c5b4c17754bd7c8df0ff14f57a0c956ec3a54a20517e11ebbc6787d8cc00cf0fed904b25400cb35ef52535af4165fcb61d8aac8567ebdb8e26cc0c376bcf7ce9e1de7ddab3009251d966cf886f192dd229c39c8c669d781a41dea7123f93dae416a24d5bde950ac44d79ca171b5166754edbb9775cae3a605cbe5c4c6479b99fccc5dbe265065c94e1356dfc97f96c718dd584bb433b78a4ee5bfd53e072baeedca7a7b7e858739aef7d5eb0a758f0c5351628ae11235c7023cc5e30567f454bfa35390ea3386833d6a6814f05bb4f02259751ae01252eba0b41b7f6f5ddac1266ef6a4c947e73766506d8ceaf34edeff75353800b071f1afe84aa90f2c2328076e763b5199ed6d44c10e5fc03e094995122257f9f5206d08f81e06b0072358b882dfe958b59aed0582ebbc793cd95983843eda693c7fe37e4037acf3d8544f02c9743f36796e97191d86f0f6b2fdc627311bfb85b62922c6ea815e59a14fcc151fe03f4724e96758902f47670703a651885590b8fe616fbd355a5cd306beaf183214f6170255a1921713541eb436b11514531640d1920bfcee682d6fdc1d681a72e83d2d203b787b16c209cc10ef7ed7663af9315536e0859b0816cd0f9be2f0940f2a5d57bacf7d75505316332aae896f826a10646c6eaad36e6af7f70e548d1fd4944dd6fa77d9c618e6396ed23f59de5bb2805120a0f87907335b5e58674e56e50dd7a7d6688160e2177498f2cf189388566b9ddfc2ec31ea84b612a00e24ddb2c3761e8e216ee72657e6525f88cdfd0b284e9f9b05ae832f8fb4532861b486229d84908dfef4664499692a720517f21b2a91f0f6501442f7224849a9603960f0969f7645267056dcd1ce74172a6b60999bda6cb22383e65ab2ab22b804c1833a89147229b879754094f09d7dd3a88581b4e6d26505627f3356391db00b73ab49ea7722fb8800203f497c1fe9e4211eaaaa0bf5ed88943328ea4a4ecb08ffa77c708016407e8f185283d4b2751dade4d08b6b9943786abb2d1e801d4a0fa851d74c0b87719cf6dc3602e20d2b469776a33fabbdb1368c431596bf8a08ad0c4926c1407bb6146d7cbc908f2099dc9d40d009f982f81a04bc781facd793265a92e8bf95313cc39dd438302621b0a2436ca1ee9cab2d4e36bd8520a13bf0fab1698b29ca1fa0dc031274c9ffb3e1f8302668dac477cc59850ae1828d2be1afd13fda4432c353fc6e189d02bec1d948cba98a391025f9523e269c837ab48ae97c356ac809c41e6400615d778918152da96745cde8d81940817918378a7006653c0bca82d948c0218434aee5f9716da8ff8c3e290681473dc6059c1a485b5b3d08a7a87076aba8365d6ed068e29a761d1380a26695a7b8706994e79e20b32e2f5d1a0fcf71fa2a7d29f3a4a7d27f509d47bb63a8e8eb3f57c69e00f4c47941b17d4483accec9c0fbcb9bee1c860cff582af199587c7b6053dea41799a19e82a4beaf00612b09320a66660776a861613d120a7079b3315737c94dd6b99216dd2c8cc42cd7d3008a2a27ecb0bf2c36c6724e4e0b29a89d1d6c228771c132a94b1bc30e8d585533871d3cba38c1b31639969e584455b5e746409b99b251919ff52380f62939a55d272fee34079ee7fa42fe6bf1313b31853dc0d56747a0b35bd2376880f36a710441b9d0ee1f51b119ca78556b1dbd0c3e1c86be2bf464577d0ecb8294405e9fca377eac589c89b874611415a8a97052b1a2dd0caa360cb2f818ed9749b8469c0d3a78e0d963fea781b8462e51f88de4cd79017268a8e1f63b650e6e262c34727a767a036a995b7adbacaafbf671371b7487c6c09904b52541daad10e43c9a973242dd5205120a07dc509d72d254a42728b0a6621e364c22abb1af64711677e9c51a8b999a4cf4a90419c8a0e5381f9b25be886aa7cdd325313006cb28b78b5fcb879119ccefe5ec75ea80da6f20403d17850fbc2c42e1183b008ad7a39a792c7c852d911f88560b254e0b377bf0eff5c2ab29e567fba6ce5bb2430ba68b23bc63879d649c67677fd866939e6812e8fb96a23a6e293a9f070836b7264f6e0fd746326af849fad800067eb378aadb8a0ad800f8224e7267a5043e6d931126a2de27be6421830d06c4fdf70cd6b6dca018f2b8310b5279d2bff58e320827205bf93abadce2544ef0821accec66667cf30b7470ad23f1aa8b6636cac137d67dd08ebf4175ae4bd05bbd688046975391017b89e8a94fc60a061306621f44d564e8b673330d7a5e0855d77d2e09022e02896b50f99229d3a7a35ea381ee38d5378631383c2e9cc8d95409f21ea287d79c4302aa3ae77320267b20b4e089689c9f1696d45a4b679b4109794ad177421e6da072a6d23ff3cdd93516294ad236ea04af1be64ac7f48354e75827d633ca65be5542d5429c99d66f3f734ce123f03d4f9c62d98de0ce4fd46c0b965e2438f741f59b982f76f84343b0b739be82e9a58c06e89041e179918e811585ba8a34fd63a77850bebb1007d8c713bb183322e066bce3d2a2d2ba06712148fe9452bf040b3c8e03af212ad075e78763131410ed85b5f2e76e5c769165207e1ad9fb4781c10074ec2184446b93f49fcced99593f6cc27cf598d538331c9cba4c76a8117079e90469863e01bc2ca667acc313b46dc8b5acce21d1befa5cf91b86d8b5082ca0017e90c491f0da0c9a3a26b8fdd30e6190a5838e15d0c50788a618100157652a4f11ca0ea48089356a7dfe6044d9ed6b241372a13c0686aa74101134c04c7d4414c9c985d5228f5782d4f871b6605633f0d66486496672eb886d88bc521dc27f66551b70ffd77e0b0a531c36fe532a593840e82d0b71418b31aab8841a7a7e17250af9a908c36923e65ecf10b4734852994b2fc71be0f3d42e5d854de57e8c0b9cfc0ccbf53db059b51df6b6a61fb8b7f5e23a9f91c3340ef66e3f51f8584b16fd526796837da741e7799138d573cc52d4c2e8629dc056ec6dee9301e6422b5f20b45c6cd90dc690b7f13f793799e603aea3a8d05d743ee9a510db0740aaf8cf4b93f10a9606199c175ab1352cb5ed258477c541e8b76fc3d8743706960d12ef6a7dad04ab03cd217bfdd3358072a017465c0fbbd3af26a7abef5befe511056d3ad97e99290e9497e919982615a4f7695f4df53cd02e975395a37a2fae0e2a0bea78458904961dab2b52a8dd2e3f3f9bf9b9ba403ef0a1629d1c1758a0e8061411a71e42e0c5725550b07bafbec1e4b0ffd2eea64de54070e3b9f854de9f5c3b51eb1e050327100c84005117c0a2f3eabfb58e35636a89b4a653075273dc967e031d4db9fb6ef81345825e5a3b399928343d061b5a1981b577cc13af025057d81aa79eb1eadbaf58c3c7323caae34c8fdcf8d6c70260aac18c84d31cf99b9700b755ff945e42bf6af31fd61fa0d727a30552c19d0dbcace52172bc01ccb3074bc79d622656ecdc61dd5958fe7dc366bd06ce46e374a959d9370401b524608b7c8b9fe726c03e07102b72cfd1c8e9e4e34cd405dee8a873364131c80d908b9b5df3c31512786cbd922c31d6d56982b1670415e4a20bbbf755452b62e507f822aa41b5fcebc8272563d3df22dcfd54629d8e2c13b9237fde6e785d84d9d2a2bdcf137459aa6f978706892a3eb59fb4769bf7048c6880382d8134a9edf4367cd8024525f64c69302c7c792609521983cc38dba57b4abe3d01e111f80fa641ab2b9ce20a1cd667b7ed00a4ebc1cc2b2c91866d77e38a4631cd8fe3611e28e015865a71a150acb2c2acc17bc2742f146f8b9714e1629a1e7943997211998f00e7a17fd8593ab901bd01707f68e64326abd67a63d263917b4c62f507c470628afbb66e0f1d4a735b6ef5bea2495c12f6590c8e660a351f80223694405036e4508f88e9301f69d524c9acf6a998513d57b470201fe03dfe2f2279525cab36e5522e44d2fc1cf5eeb8147be1924d6b03ab41a2c97e83bc4415cea546253c62579cfaf0961b80b1be285f92ffbc99027e77054eccb291b8a86b4b28be20436b5fe4be7dcee85a2885784ec68379edeebdf11403220454361228241b2ae957f5fa120c1a2e2f51eff88249a27ac72ed712b7fda64aab4080351b1c19bbbdd1e471bbe6b44767625bce519292bd1f4384b6bb31afeed7fa5161f2fdc47457854aaf1c06b2db1343abb0639dea8cabf6a4c97fc6067b8615fc5eeb765102d03242f412ff0f29d79154888050e7622fc234ecefaf1da232d75b1060f94479ecd7d26d2068aa895a027429d904a82f68252619d4d42ff4f5b4c14b5ef414bc13b5aff3870f8caf723af789d44e1a237250efa0c81fbde9b7459ac58004048bc79abfe86c05b95a2aad4f38a56f7babea0fa02592959b15ce1563a9377f5e61e8ee27a889ba13f63d0d115d34ea13f414d5c6bab253bfdff039eae43292ea240cdb08655b30e78fdc59e868de700ba9461a96076074868880afde3762c91d5ebac59c7f9f73df366cbfc7e2ed43b0521e71fd76e488eac76ad3ca2d5b67cd09adc42f298ab91faed878b4536ab9b5b2265e5fb5a1ba04f4aec3108c09086e50e97fe53eb9a4e73830dd930c26e734816ddbb004570e3293d958131421adaf0672182a90af76130849dcbee5ed4819db49883605fae220057953543c3258530fa85ec6ecf3bbf4352c94055837288ba2d3a650aa560fde30385cfc1bc8501e6990f2d0694ff4605b81acd11542f4fa911d0d629d41a8e0883ef46bcde64409ceaf45be9ab9b1767b8f928bb09f16684dbb57e7f30c76f6257209e577b00fd20f4ef08ca76009e9793c8321c4f45ea407bf0949445b8e73442ca1ef9ab4ad70a81a5c5b2d9e29475d9a7a9b8653f98910ffe8e62d2937f948eb34065f4d7bf7c0a2286d22bc219926d86fb9ee7fa88af7286f803bc90136fd1bc99776f550d501be79400816999e1e3f159ebe022f63f4ad8f8066b073c297e4de78f0d1440488dde5d387dfb3b053042f40d5e2f3c603f733d71296c98d793b9bb479ede71f4816d497e3ba75a4e52560ea5d174dd4b2d9e0229d0caecceace270f22a4335a62dcd3fbeb46137952e8af2fa9b801e2024c31332ec61fcba79e88a2919f8a10650fec1066ddc951e15736d3488a500960769361b3a990c50559f75bbf4dfc4c21379dd6df7e6409919c128aab0185230841627ba188175d3a668d4c2d131b5b2688f06f9621bcab650dcc350066b2b12a9c39f9d8a724ccb320959a0ec978c43c303d91924328c031d67cb3800b03bcee78adb2d01fe180f82593830679c7194f77877cb93033a7821cbf098eae16a01afff29fc2cd7e6326216bed6ed8d76d0278f3f5e78d87d091fa320c9e2f5e10d0c3ffa053993351231cb5a05f795d63e998645c219eca142a7b8bcafec5e7372774d5f8192680305fb4e847f07522ba1bed2a5407409008fad1165b8654b562b41d9e9958a49aa9ac393a6ff74fda4ae1a0b2f07ff662283e1814532a7b87654eea9cefb08b0a01a1ffa09c3f2e190eb235583fa3af816b1a43d1ae1323783ee68588e23323faab1a1e374a9620d2886f3c1d2dace6aee833e8c389f102db71a7c01d86f85f2fd478b0b3fa5996580c632940889c2daab7d051bcece605288e0616c9f0e4fad067e7da55874936bfa5c2bf22602980074ee13a4d3827b3809060fb61a838dbd11b92d1864a6a4bac180d42729c83319a38f716a404241c88802818679bccad1ef2ba024e69e0b5e7dfea0227aa2e068446347fa017c000a3047a71b0dac3ae263b9a7aa6f68b240c84e2ba74d8551813e9820c023fcb4fd8469fd3c91467803724b451d621b919e4a9c1673b5b15e243a63bc9954f64bc3157c9eb8e36cf9b6add7bef3b77332bdab69295138ce68c6ec0a277fb0405d5053c608ba8f81d84f3f43c382b4d71dd4966cbeb0bde3fdc5b9f26486c0e287cc15e6a546c9c612fb4a11c511f34a42dd162b14483a5299bedc465969e4cfdeb2fdae3604e181878d8cf19dfcc6bfb5d32a7b83572d630b45a1e3732fc89d8fd4176ad3d0d34e3db4f330afce9a536289af8151aa2ad6e4cfa4efc62d65f3edcbb031856604d753cae2dadb5ff0d8c313510ae4ea2532cd31b0502a03c2f5d430c91dcef8379cd0af46223e50773b28de32cf08eda958577204a517c829b10ca6643f0a07e225aa5ee4774bdbe8a6ccff95eadfb4c3e27e47a39b2ab7e277616b2e4a92ac0ff165bb6d211d3950d94160595ad65b41c15fbc7bda859511eff2edcbe737ee15900510ac3be64d2ef92856f7c5033776ab9109501421ba255d3854309cb95640daae4da8c8f9762ec5f7f0809aa7faabda4e9d4b86cdfe6ddc4e6c94c9d6b1b85d41f6ca208b71c08704a70c2629ad90c2eb3f207859bec92947ff592f8778d711c346441969c294ba477022d6a4ac9d981183bd2e4a8f01166185b410ff70ae1443464c415613bbe70748197798e21dde6d13e549de481630dc0cb50fec79c1a6eb28aa85ac21a8a842ccb3fa204226b28f89d2d8e9b788a91ef9d842062441e78affb52068214278ad4cd4a9c01d5b1f687dd958c7453bc46d3cc49dec2c0b75e403d75a3d0c1bd3413e687ce1d3e4823ea24d62cc94a419fec122c2d2821e103dcfbc94e42add44e1d905003c0281d7b459ad2384657d2d59e34be1fb6568d203d079778a5cd38ece6fe5fea3f8c0072943b37b638f4c203a2a702e67ff80085d604da00769ca6d029e3cca1dfb09370be3f596efae809c83603cabad359b05f9a1217703de523a75f05fa0490e99220037d90150c1aa78037a9f8da89a74ecba363b8b9c77977066eca2d62b30cb63a83dede5af33d0bd21af7b617af21f6db5e04ac545a3d40168ca63fd3ab5c26e9f02f2ed48898b79348341be501f9c317202dc3d2385319e240dabdf9726a99fa501a1a42312d496b89b0c287562eb7f16eb128b11449f6e83a41e3c07f67437aae25d0871502a0be477abbd34651d7ce76ab7089f7591706c5e215230751bf01bcc36294bf899131d55ed94aab32da5ae1fa41c2b3ca2df5babbe227c62ab48ec8aace8255f1a6616d16cf0ca988f8cd2a53b713cdd73177ba693f15253395d64979e8fa91901fb2cd72b7a534e6fabc1e08cb048f3c789a46e2f6578442a5067cdbc85f7d692f7b8e293a6f88773ef44fd267befc30956c686c60382093687e12b2b15e5b408bc5a389ca7be42a775f46003ddc737d1a266410bd8d0c8e9792dff60c2b5e36e6ee2b315a8405a72ec74be332bce234420cb3a3bae8389affba5be1f93ef9b45668acea1cb6bd12a02e99685625a27e60435ac6cfe6a19afd0f473fb5d9b015face7c11e29f6ddfaaecda8e7db92b7c32dd988af0c1f6c2791b094b3ffb4a289f1e84d2acf685af24ad2a0cb123465c180886ecfa1cf00fe330fbf952c28b176dfdd63e0f21c89a4366bd2fbf10208ff0b2b11f4f2afb4092c54b48a083ba1d0999c9e0baf176de4ca06f07910ba08fce73a13eea8ba653f331636993eeef516e1bd2d69f45c201bbc8f46aa70421e1099d7218b09f7aa7fba1c04af17d1aba5a4b6b19a633c3b547edd0b7151b60a886180edda3757b59db336b9c1ef3c50745b53eb454221dbb49612cc2e5c9df8098ad9e559e966f081a0581b5cd30735e6976dacedaea2d42ba7c8b4d4dced584b6b14b7e457aa453edab51472adf693c0310675b4d52106e0283cfa090d3096d63b52d124133a7e1ff80b442ac64745f6a96270d31b15deef859d126e5c5a22091f0104737edcb6b25dc4354c19400d44b7494108dafcde3d743af8875fae8227ce9161fd5d0e3987054be149c69fe648879bb137c157ca4ca180cdd0b641c0e67aae99fb461b530456e2dc64ef81ef95e29d148a7d7f4dceead5ce1c320e7855a152a1452541a80e5c2ac758d1d6a1d6532be6aca5b642fc15e210c79a9aa5f5c238bb514a3d40b0843da12cc728c89b74b5cee1fa41473d430ff09cbeec2d378014ad5f326741f1a3c1698531b0cf04c8757b45a2022dd9d03d72e494aa702e5cc4184c91b49b4e9cec8cab394531a5d45033a5726442882326c8c75da0aaaa061b4dc1e7ecb5d32a011f19dd260d8b34607163343f53e67705893931c4837465efdf48cc195d60a703a45b88798406d1f4c9d8226751f5e7167a262b1b819cc1bbb3e129dab0fae5c21a9a91c39c71aa52b695955fffaf53fad3e5d9f981b8274b7c951be57c6afc2efaf052a9e52051057f9977840fb1c9963f23a207106cff1b6b0bd01fe910d873703d517d0bf7a0df7d321b1fd046750d1bb39861fe1467186f4596119559fa57c651ffc718c6e063b3434857c0f2ed482cc35a5c1108480efe74bceab60e2550d90906cb53c38ba6178dd6383931d61f4caf440c66ba118f6bb8ce6e1e1982bf2ac85e0aefdfd4756d2de89e87946675d4a5e539072a93a0eddd0b4086a75651e4472e994a31e5cb4179e714ed31547e9007c3dcfddc775bb945978c6b16000d261242f46533d2c50a091c3436a84bcffa683037ba10750ad2d9c65b551fb8d093391e27f84d249af23cea278efb55802342f880365d44484d7d9a1fc8261bd2400de81843d8bda241856cd2952b644acc4c064e64132a7a4ade7571029d3dd39513187451d7c6857d784a0f407bff64abe9041ac81b28756c15ad9b4710ccf57760bafbba11910e52544aa763b530376fdac83733393a9c3c9dde4c4d3839166f36a5bcdea627eaa06b4d4029d1cf5f102598ab6165d41336a1e796dc905d18a2175b89768724ed962f8810a38cd8a9ffd4bac092e2053f69f42357438ef04f85a94196c195e461996fde2a9d00b8347adb3cc97efb27feda1ab28d7178119cdf47c78f863946368f9f0b0f221b378b100bd833a6863eec267763eccb79f65b804cc2395e693c0dff4c41908250299d676731cc554b1bffdefd07a93e30aad0e6827339c210a51202348bd0388afea15fbf62c82a7cd9594617d501e5c0b398861b2d8811da950d7b8521570e4afd4287d2071cbdcfb5caa98e1d892c0a12220535a5f61142f9c1ccb71c525e378bd9ad60d68e90c302d69b42baae3a42271866dc990cb3a0a1488f1d76c3cbffd40e67a20b406704bb34ec9413f124d80037906af94ec16992aff9ea68bc8f1a19a878bfa03f511f9b39423d1d898f858277bb0e1c5517da404ce02f28b9088b9f7e6ca525012bee2baedcb3d802e10fc240361856092a1c49ba0e86ec9d06549ed17b26bb81e8b55939c3408aa8bad846542fb2bd1420093541e99f317a405ba5c109da80c3ae22e2e603552b88223a68a6be7e2f290389a78d66b19d57539ac960c5ee4f27d88afa5a5664bde325ebacbdcb32a20e22cbf30f45148f9b08567e8456f9b3b5668bceba53e45fc9d8e17989de90a976e70a7dde904d6951a7107478dcf2870315bc906344b0962e33f971f119b895aecec8673bc3d0e06d9fc0cd2aee106bbe61a62050a87f1bc4b596eb18b2a50dc2b6b0fd038401bc236ab864e250cbf137d4960ac3e8a6064908939f632b916aabac854a3a0fdf44bb390b96ead9c1d9d204d71fbb8279e523297d07c26ee5f5bfe02f4e229b2c5f08fe8035b6bd12b10a9d2b83e3841007d8b8528aa8e95c6844464ca9f482a6ee00438b509bd3b762a3444279dcde278f4c4e30edec3acb28f8e8a70c6524e1f8f8114b3066958b2d3ede32599f01599340d8c38dc7880f0f81795fc46bb241ff11edbc25bd13ff3cf0da4dcd3e9ec0f1b2e9e1c3ddbfd54e48b7dc11c910377230e6d1438d79f1852c840c7d6a546b3b968eed1b24ffea6f235409f34bbe0dd30e9d62fb9e112820898d288d2addf7c66b47b2659b753316744a215384abed31f08b54b4560d6fb4716be4c331f69f81e55521eb3541df8fa1e5344c90f88e1cbc14106d0a0115930aeb97743821a2be361898a02d8a2904cd52349e5ca2762f537582beb4138231e380bd1e0b2886b7e14581fa5bbab094195e1ddfa87d089cbf558da5494e9e6f07f17af2073593a5cd5f7e827842301a90a5b45dd81dcd1302d926b57347eed2169a3105b995e8f47c9b96181e1b1ebc5b612eea9106155c1b64b09517370d2d9c1ff854869f243f59d678194c0e1500e7087690de76117e947acc999fb4bc91d080a1989f20a78a2383e86e8ad3a7ffee8bfc7ad1118d76796aecc96651b90b045c2c312767a3ba681a63e7a8bedc9f7dd6b2fdfe037ad0b56cb8fcad7cad08eab61a5380b6dcbb56905264707949a6ac10db63fce3d7fba9ce85135c19a017138bf7c90744979c36ebbba72cd7a00237005c919e9a2439b7cf38bdcbf06db4e32793d950b30f45d91fbc796f7c5cb13258d60033cf1b93b643a800c551c57e65e4eb8a059a8ec17f96e15dc637510b0ea4af6cb372920c5776639508f319896d644d316f15a1991a07ae33051031e1438eef593e7b32c4e558d269f0355616407b72b30f9e4fa81250a10cf23d57c20880736345f72a357c191cae15ddc88fa05c70254eae07690830b1d9029393fb2d4e91450260cdb9527000d15879f023758a4dcc294db0a4928878f7c062f7d934de64a9ef568c86f5940cf977e61b53b2a38448a690fd41484626b4e3a34d4284f519cfb3200a82908c54b8b36bb13d80cf4d22b2488fe75484828162ac59a51b198fadc3d5894fe10883f06c8304a32e9b4e39511a65a1caa597ddba78c6110f3ca20c697e8d184122e0d983fbf8bfde2c701f6074cf9b18bdc2d8b6481aeea117e19b8a1ca3423e7aceaceb6d007c3bd7d54968ab990cf25c38b74a194c1b833d014b5165d4b524b30051b9698f51dfe014b27913002b0e207c1cefad5b2638456f0a23c0fc5f25147869b4ec6e3012d9b28d995bbca00e555ea82d198cdccf1c30dc2adb413651366ec5da661ed30b48e0aaa7835379523c0645bd96458eedf255b3b703ab85851e8fccad70add31e431b80087047b85de7e982d8bfb00b249d0fffade98b9315e0883d913b234595ae1696426a869406a0589a34ffe525115da3eff13fe1c586e3924a5dbdbf18b8075bc5b775753a8ef79dcf815524547e52e39529b212079dfbb5eb8592bb7174771cfc3ddca07fca9076ef149a7872511bee599f3028eb08bfbd7668b762030ef45fc21ea73a1bbe55cf8578e0085176c987fd99befc4ec42674fdb3b5ec12f12fd553663740d95a7b0099b228e129b56fee2708048b4c6ada085ad3eff5567502877966bc75620b2fb5c27cf60b56add8d9127b1b0b05f6220c3d749f3671a0fc431eb534423189b3530cc43fd1d10843ac925d8e1128d93328b35f60b5e5cca21fe15ce21f98ec4423e4b9081454fb20d897964ec2fdc5df7787412d75d156f130e56af9580a5e6d5a18dba0abde020bcb5a64cf767022ed865162379976e68bff59dd97711383e38e1c197ffacbbd50e5af407bb921628815d654a377388b58e8990b418a52d94e17036a55f6759545ec8677e10c5bcb7d9af8cb1d4481ec5599205ba8b0ed720be0d965bfedbe6be864ad3ce306248bc1e872c938a158b42c2a65ee666f2c1c405abe2709005156dd707d7a9f5d3a1ac319602eb989b9330a8dc7ef8b5b3ce1bd068ae7e850bef3dbd886544e4ef88258a54d2f1926e1dbdfd60fb10df356092c13f47efeae4139f72b4fc48d306f4708d61c695034c3e15d2683c9fac20b12268d699fdc313099819e35c00ce78933923e674018ce26cc4cc50c52cf0909b38069c08a02aa55e30068d1c0af4b63d069e1320f658a9e7d06fa6fc4e9cb3d9f3a6483c726e0de7c9949ca991e0501c528519ac2be422eaeb7767272d5c4f29c9caeeacfa163a5c774bef65d798ec2af9600d33a31271f7d3a9b4e435ce995184da4b4b0c7e9c1d636fbb610f6e3720637cf8d83430a6d9c11becdb9e01bc681ad5219cfa8eacf46dc1d8cec9ba6ad58f7642610117ec5bf62d5ad6ed1240af0380dc09a93ab7078cae8921f86f5fc01bc9ddc6ae48340c3705f556dc414fab792e0dc5d9df7ac614bf01843e8b20bf68f0b88bc5705ab0d8c5bd9925b71730fa9e3aab241232825ed8c1c52aa5ef6ccaa46cd324fb22e788f8fbc732e0d6cc389a82468204cc867ce9e816a8494d26ac329ad77475519c2ea1ba95acea301c107eb4eb0d7f78217e3ae409e27ccfc88551982de028a601989a9b470fe7181fe4223ba6037260f2fc2ed2f34659a2f5a7b39816e2da3b942c08a8f07c14f85c8a251f09daef01290def624ab9e44a3145d824d4df9a451ea6188715d18bc26618eff3f0f7b0e402cb4635023b01a9724ce5592823c250fcd0aa627721105a1b72d1460b9b25105419abe527ab8b18f5cc9642ead1d3d8b47084d5942b0aba48a030b0531ca537b056caa7e8693d5bdd88a4a2338c02522c16f1bf3be07688df98f5a58562c180d8bd66c2cb4b8b06ce96c8fb92c4122390cb158a5928cfe79ff07e49b91b4bb3a24d09485eb4c7c15c06d94d104ba04179ebd13a3b9385e1710eaa4139e95a0d96a978f9acebbb7953ca4290e07ec08d7b3f08956393d6a29776bd7d07ba4e2d0076e517feba13af3ac9440961ccfb515d64cab4a527cba88b668682d468a5ec612e4c8d76f91a8b6f159244d9dc61a9e3260610c107df1b214f178b77f102740ce050f391ecd24252f371bd5167d6ee1f6b8053130c06d6660d1520f52582c8f2f498a35d1259c5fde573b5f2f64107237940b3edd45950683e022fec38bf210c309d2ff2de25bf1c9e4ab9243f383d82c175b1f49dcd9dd381ca36fb1b14ae078b61347c0502f716702fc4f42e2f8a077c38bd6481978fa8e6bcfd41182e08a8936a1766066e21ccf1ff3893156461be608ce85931bd80fdd1b8200895d5c90400f792f5131d3e8116ad4fc3efc77c8e23457190c3dcc6b53293fffb5b7a794f08de6c0608515667bcc08d481704577aae225034912e9f3b10c047f309a43d7bf8d2f218ef92aece286dbcec82d23e3767a959635038d74188ca9416fbe41c46457c88f87633cdf1375c505101e6a78e075cbd40e170e4d958e0a44bd8e579baef1a9da61dfead9059012d6b9da7ceca8baa4e00adeb1448f3e602e76f8e920893443227e2f2edeed5971163ef0a68a7f6e9fa7fb61e1229f32c341ba6213704ae4f67e7e719e4b9042c50d8d9046735f4db92058328206d2d3737f1bd9602aae85a4afc561a404a95789371bd8571579c0948b09db8283de6d368750b1333979dcf6cfbfe1545c338846b6a51c762e7f2d9a5d7a7bb2416045a9449983f1436f69fa4cc85fb19229cd273ebb645682404780b0090630ca1bc0fe976d5eb09f729394401c2282f5650d058e5cbb0fc6fad1ec8cfc5eb0bd26b25e16df12ea4be23ff7007500b63eb1e0272bba354a5a794286e0e97650c7d9577b9233196e61fbdfb27496f89f0e69745fc2addd12003798e0e0b9377ca19f0ed45a371001bb25201a0ba46993e1ef792b1307cac970c8ea0b6fa51fa611855961bd5d11ca1d8743df4b19fd82ec2e886900b4ad639c2e43b8fecdd0916a25781ed387affd998b95e8fd228129137163786e20346f942462cd9174c4ab6500104c73da75199892eecfd1ced5fc8aa195f8f23258d6cfc465042b3ce75ec423a49ad0562fcc86f2f5bc7a96371ab1ac3a77636c72f75acbdc6bb487e9b9c20ed5353b3d41e1d01e6de48c36046eb0efc907e2fedd4416fc7d5b7608da81c80c332c5e95c070a7c73d118b67e4fb8d30b0d555a96b07babb9f5b838d2b5654a834634afea92d278dd029abe8e13b58c16bb7327e07484e4bd969862dfe2a3666287a9e65998b7bf775b47dc2cd7f105dd0eadedc7c4dc8d20e6d358755b5e7aa38c812f56899dee7d8fc18538b44d83b2aeb968d332c40f7928a1233b5eb2152625a6e02f51ae39b9887d2128a6e668ec99888876e51206d7be608762b0d97ddacb59366d085eedccc38eec938ad44b84286dd479e6675c56c34a11133ef11116f23666800ca9bec9514bcf65851054f7c0c32d6e5ce0ab95873cf35f9dba1d1d26de085cc4ae31b6df5fb99ca45e2e4fb3c5c983b6b524572d3fc406d47d2e67b47a7c55bf41c11fddee634cb88df09cf317e26621aa2699108b6c26a55b7584b98bd19f143db1d7900886e303d56cad45a4db04ce459c58d261c88880104b0de021b60c60b6f18dfa554b0b146d866507815e43434614f935402a8129d0f3534dbf5026942f7711417e28ae5b262d66f101e15425f4f5c53848b9dc32e8a7253426b975ef4ca8fcbe37338981babb66d628180240d249e68d512912097c68bc761d820bd6e65a43c6125d08feef85f4186da636b8c5c410b78c3e09d25a18856c8d2e0d65a0c2c4c03ea63de8456200a693a1d6f4f3550a4a3ab45f9ece5db33d8fb680cf6db769deab9587e43b89582bdba62305cb792d97b8e80800355315cf575d7ebb64518ddcf954e52d52ef46ac7ac9af6dd438f80b3b4192242f6de5b4a99a40cfa075008c108404a68332047ae4be2e7856b6d87dfa63f0ec498c822e1f7f97ce799fa3cf8f1155924fc1df0bd1211f9044979c70ce63469e04b6b1210eb9c4b7ce69c4decf26ff9ff1fdcfd547ba45f57c1d69ff36370808d4bd5b1bdce7383d697f2898dffda265fbac09e01d8da7f8f1eb975df61bfce632d92bec612092a67ce315263afc08d4471eef69aeac818a1daab35ead28ca028b3dc9b2275525f5a844c912d7b05de59bb433e6591ecdf0db4ef9be5395045d63acbedacb56b5c01284baffddd1dbed9e36ab41deb0ca0487f4953e97d4cc21edd5d6a5b3b34eebda8ae3ccd5d4fcae3e9f95cb0f03bcfe5a9e39dbd10427ffa9475729e67d927200bb463978f1a013b7c60ed93b04e3e6f9f8412be34b44e16de5e78fbf3f62f9775027afbb74be86d76a96b74a68bbcc725f6e9ba5d0ffe187ebd4d2cd3705bb21adbfecde14c97787dd8bf33ecd3e5e2ba34b67d139cc984b92bd4807dba56566d46b081609f4a5c0f71964a1353133eb26a143c89703db8fb9494de5c0a6e5ba7da6eef9b5010d28dc8a7aee97adf30a8ab03a9f7ed7661a6fb668fdcef5bd7f60078fd5cf85d3822d79410a2b6d0e331e15acd7df6497b4694e0e9a9ab0bd730cf3c9b44686adaa9f7cd22f98dbb700ef4393ff2bb4675611b8be4bffa7d0b32f4f89714950efd2e9c1ff99b9c14fff5b68d37f4487d98b2696312e180b4e1c2e50b08d90e1368b08061cd7952e462a4c7ca2bd57134b45c1e82b3748f8ccf7cd172634d8b355235a0a48cd9f2a1044a728913b12f263a2a700a702c82a6f37d91259b37c497ece931c7a70dd1a7cd0ec6af3967b3cc399fe745f326cd871a568c1b55618abc819a8a92726683cb13241c15d6f38ccb71ed4603231492295eb6a00d1993854bd23e1679e166fbff038a6fe25e7ce108e3fdf08a44f190659da435f210e29606cc8e9514b24829a610922205102f2e2699a4860b4b0b2bcf3819343c7a2ec993c6c60aaf236d7344c25cada1c1a2ce1b0a395d9acc974eb3c1666595538c8c16d3b671e37ffade8761db23112f44902c76f68388b05b8454a892808fa446283f7fced9be098bb34dee8cd9d458990d40d521ab36a07c531dc11111ce377f04e897df007304e79b7604aa0ee1b7c1b2fc11a73a84d5a460d3904da69f0445c34ef1c794141c583918b0e2c71d326d7c78f570a00812fc4df01fc1ff02fe3abbe733b4e747ea8f3e1e7a10be3b512c7faba3d8e59db3cbf2efdb2edbf67a93bb544bf38136ef85d41568af1fa4fad4f5f4f9d2d49e679aaebedde3f36d1f1f1f9fd5b72ffcfc9aee0b172e00010161f8d5b781327c1666611652d7f34c539f0a026bfc197eeb672faed6b85a6372b549a1cf6fbdc26291275b638edafea66fe026f77aa2b8772a899bdc3aad739d6e4898a56ea4fa57cf4210b801caec59ef320fef4a9eee5d0bd43d10f4d6aff597e5bb99bde84b6eaa3953ed326569de20435242cce4451f52bd38f462d89c276c66aec4702483e8092cbad0e824f15223e86fcf6490f78456bab876def668458b0147f25b9ece4748e8278880d004232698608209845c4808cd0ec40074c1f720fc16910cbdef8d3448f0f7af962f7d08fb3e2eb449d7bcefffd6ffdfef01f01dfcab0fc2ffd5df590ba4d64cae6dffdb1f007e83ba9e7bc3ef3c06b27846e68d07795c239eb5759d95a142adda9a7bef0bfddd3ceb3e5608b5426a07be85ee7d14e08a473433163ccf110d7985507bbe596b6dcae3e9f1763a146a73f80a82d0a0a00acea320f3fa380f879eded1dfe1a3dffb1d879fdd1c903a704042e280d48103070e1c3870f8590b44dff68e5410f216528378b8c29edfa5bc2b74e07d134cf852875f9b8456a0b57604873f52d75348eda0aebe8da21cd4f5ace08f844448ba6f79475f41051fa4aebe0dc277a845ff56a0aebe9d1ea96bba5321753d777a3fbdc5bf197e8e5ee879d01fe250c15f355f4a1d38c441edc03707d428140a515c2359dcb8baaea84dddb1a32fa5fb4a16e3be98c983f73954808ef0a5db665fad26cdbe288abe0777a312ec2335888707e1423f2507dea17be0dd212abc52be84fe915210fa41e81ffd1a1414f408403f03412f941474040ca2206882a01141ea7af4f677475608b542473fbb712f8415ca2024a4167bdea26f1f68d728f809ee8607817f6f7b1e00407d0dbfe141f86ec34fc317fdaed12f3b50c3ff7e1950ffdf7b20a8ff7f7b08f8b7ea0ab555f4effefffdecbe3df577ce537f42aaaa4115fadf61de3f083792e0fe86df8aaa25f07ef56aa957c8865fdeeacfee9fdd451a7e7917a943ef0b22fa5d1f434241bf0a0909fd7a8b4241bf110e1452d7df414240424242ea1af4bedf05fdae90df2d16d1a0103ef4d15e01a036fa4c172ddee25def70f7d7c2dfe209a4fedcd3826a1de8f317bf053f291e2415afdd7387bcbdde61cafb0d57f444cf94778bf76fd7150287e44971c62e280ebc503b0a94e88cbaae343e5d972ea2ba2ecc84aabbd497eec6495952bbad52a8ada7b6f9c6b80ddc564d4a97bdcb3c0b56e9aa8b5bc3469116e9be4e48d100ab6f877b1c94696188db0bc18158bafa6ecf034cb448f785db7cec01fda7ea4191967b50948f24f4d07f41d0d775615dd7b985ecebba1c78df2bfdfbabae6bdfd75a982948ab0a9027288c8c4d09ded75d988902c413be6899b2150349f0be2e6a213d46b3b8735c96f93dff32b02bcbcf0050953484b3b44055d2fbfa774d75bd3d03e83fdf96b683852bcbb22cc3c01139f02621e9c083efe9206028fd19e87de95f26ed9c73068640b0bfb38a2185f4960fc27b97a7ae4d4940f4d43f9ecf77cb1b8c73ff83fb494df9843b5d600f39e77cbe2e9fa735739975ce59c629e745d4e59c73be0f04125924ff0e6fe44cee44d6c9cbed70f595c30e15952ee115189752cf304b221543ed8ab8541604cefd02a8b84026ad68ed98cb70650d303034c9cd0e1dad373bb0eed81f7326e5100c418285c894284c989c56605b6911e2188e3164577c80f11549f31bf98ca67e9a84a0648a1531868d619a920658d68fee82230c941b5c6b4eb2c0e1a2829a15ce8c39520566a3a473ac8186a402e72c8e0ee31c0bc816766638d131943344c336e30d1311266cac9c49ad10e639d272bb85eb419e0922c7828a161a2754b1e5d0f85642e9786104489537534bb458b04a579dd6c681833d48b66c1ca3cb80acb4188af18b56523ad2925ed87e2f58a7aba8206ac86094b541a1820ce3d90f54d559933750b89445bd8d7d01dc5049f912d5560687f19d184626161099f3866ac8962f2419117398020c2770626f725b2c60fcf05941ce2b899d2a29607dc56d9fdb0e67915cbf083aa8551327126006b59ae223ada09b434cbc1a02586866cebc99f34ab32595b146cad6a66d47d6989c565b30e79cb34eff8608331e91b3a548f10d2e5f1853407979c1b1250173a638259873ce39c4080ecce0ce0870be8d9f643552ea980f2c3728d61012a74c9c2d54b67421c58c0665642cc2bec2c84df9945ca4364e595c01e478a3ca1014650b2f3b0c6c4549f1c6880c3a39c2e40c5590d1c21246c6d4f1c204a4cea4a474419372270c123165d28827541953b29002669ec61365c22f618ac4e902b3facef4937c6d1183c71b22374e182b574881a2edf18a8c1833516669b29290bd173ac8ceb478ed8071aad83963f0821627ca97953039c19c73ce5a2ce32c29392e2c65b4acac15e0ec7852272ab8fa4a296793627556006ceaeb881a1634ac385d4d440ad507f9d4d934262965aa525fdd22148478895971720c3bc944ed9c7308881ce370c11882f9ea60f437b3b836ed730831b3664a853227a8c16c658a371590226405982e3749d81045a52b6fbfbba56dda783c7f1a4ca9e40b264a17dd522ec7f01327689964d3dac0d952bcaaa2d675264b14517efc0465f05003244e05acb160ce39e70e160945bafef8f6c718bbf06d3037c9554f7e2099cfd96c5a94a80b62d7e7388d9b9d9f001ff812cea73b14be3e76af06c62f5b389eb06989719ef8c57ca149731a2a589aac708c01e5c7cf9259bafedc34e7c981ad06167df3bd3f6bde4dedfbe69a48abbc9ffbeb4fd254bae6bca6f8ed38d0f5fdbb81ee43ed134b99ee3e60bcdf418b4e3fc67fefbf8d526b63adf5d66f55124359b55a5b67dc5875a3d28bb2d65a4973e661ad15e3e160bb8cc7302fcd8efb76f665adcd6fadb5d65a6badb5f8ed3b12eb2954cb5a1369edb51a6e973f5b5cfedde5afc98ff0557213c2cfc6ef4718e824e5b9f5b21db6faef25da5aa8927be56d1f1ab24ef6c879d9813c3fb1b32fd93fa313662deb24bcd822eb581476e9ce092962273a763626cf6f1fabbb4ceac8730a790aedcf44de3aa7140a216fc429ada25a6fe52dda2e649b6a1bbe11cd38d38e16ba96554de499d4feaadde6ac13ce484bd34a4b4b4b4b1bee58efdc852bd27053a0bfef52be24bc76eebdf7de7befbdf7de8be1afd0dfa1bf70d77783ae4fdd0cf7bd8565ba6b336eecdb75bb6ed755bb6af74db8f7357045b820d8a76b753d34318d48ed930897ca8ffccf332d52d794485d7d6bbab7b5d65a6baded49793c3d9f0b3f16848630bcd9f3a0dc434270f7c96104c1395506d5a730784073185e63fb7bd61a5000c0dcca870e74a29a90ed5d6a16dcca874e74185c3e6ee543273a0c21733cb7f2a1131d46dccead7ce8448721a4c96558247feb5416c9834820c17b404bed4bf0f3a17f8f2a752aab55e4e99ac538d5586b3fb2bfe23b474f39d0be7b0abb0be272d63f346efb69ceaa9f70f736605ccb3a69f8f3aa53d6a97cffdce5eebee6eeeeeeeeeeeeeeae93bda1fbfb77d91142cc2a8fd122f95f00577ad1f67f236e777777771f1ab76b959774a0ff0634e9f5ef1996479d316720199135af3950926b82ab6f6725585fc813c298a489135c9376ce397f3e3dfffb5229dcf9cece5f613be74f31d307ce68115e3161b2c5cd003a946051c58093634b30e79cb3968ecb8255ba46045db34e1ab28a8ddfb1ae05142d29921b0f2d6a3ec834c95a018a140cc02c4329722eacde7035c1d293c93c31f2dc4d55e39cf5e75f0927cc07e1a6699aa6a9ad887e6aa4ebcf8f8e91db34f9b241152f852246b92a4970d45081c95c062a6c564c117e0df101c682b7302ba927708831ec2c89db4121890b82e62b07171b50d25762e7245242142e5e459c34f131a44e12373e16cd0d181629fc4042a69836c4180915171d7147ac1c31c674363edb98b7f18fcc56968db82e2c2e8218638cdd5dcac82c5d5dcaa57cca996e5ad0dfdeb40dc2e1fcef9c2f25b19a33f18c97ed8e31a522ae5b900b8aff1d3a930dba1f8d4d76a4b48b01e8107b826507961460a669ea39db04dbe61320471c1972c2315da438d0ad593ecea6697eb0cd026cb33471ceefc062ba85875b6cf5f8d9f84fde65ba46a1504815b43899218896b129727265c839147894503bbe20e162c3cc9db81c2651cc47d69a2c3bd804d7749b3f82699a72b689246b9b3cdbaca282551c92264474c8099aa6699a9f4dd334cd131de85d002521a9deb82c8903765aa83946c1b2c143cb99e9413129b3238a9c1634295246461484a5ab9111f0931e3d1dcc91a16ee31fd4fc715baaeb6983d889e47d3194176f48a215194582237ca0e318316efc04f025a08d8d71d8b498231775054c10630f67a90739e8deb563b32e42bd972cbd578403adba92d0d65a6bad75fdb784eb2a093e5be9ca5383f88978a97067f4f970917db2d6437eff214a9a92ba5b4b74550d2c124682b100887829132fe23cf6fd9584f3d8ee5452f75bc4480c6216e4187fc199f4bec5d62b83135277777777771f3bb7cd42c449db8f2dbc6d16246774db1e8d30f92a66235988689dbe64ed953e4d3478fe2c3efa597c14b4bd10169f28a1dcafdcce62a6e0f96bd2b6492276f957ffdb775f897fa7f9f6546d26c1aa3708854f64bf5ebe4c3da6b9ba341526fa7defa3b275a2208b3b6292c1b1d2494d1a50a9a2c282cb8d0e30a3c3ca8f386eeec4c151a6c0f9bd19c9c0c238891293ca6817a7b95b53c45878a08e822b34b8ac15665c65955f53903e16582553309ec9e195257fdd0c8c74a46a1cd95c542d29a14c2172c15641c1666c455714b0325d599e928307fb1931695832d820d940115611b2bd99b90263bd9e4ca1f1430a1c154db654a85d5160869a28308a7356b2dc84a52726582773bb2eca8d9a12e55da7bb1bff62e72ccb49e4fb51e291ae3cf7eb1050c1432a2e0c132c686ce9e44c2c851bbee1906306a78d7f6045a7ced61a5b10336557ae937e6087962a517260e25411ed0e1aa8a9cfc8635a6c758624e5dca40df1c0480e35566e70518d9d4d983c41a990081946f1aa82834630276b0ce3921c6181268203fd4564a5abcf976c4e3a9b1e3b5f63c125858218323fcc96e438430b4aec8c4959a203cbf04a052bd2353d9bdcca93ec86142fc06ea040a1460d990a3518441764567429b9949cbde8313403a284c5dc1a152c182672ce9044905ca1f142859fd959a37503adadbff7e3d9bdcddb1af62edb7c3de36cf2f0fcac037b28dbd65a0bc832a51508f7b9779ac784df621545666ba9c89923e279fff16ca535076ab6ad937af888f4abc4ad7f552a6efd4a43252b25a22fa1af5f29872ff1be676bcdc3f3dacd81facd817ad7b583b233eec6eeda5e5395a8e640fde80f5dfba16cbd0ef0eea9122053fd44fa3fccf830b44ee73781edf26d58b5a5222ba32bbc5f8d90bbf745595bff6a8462f78c84bb57f4a6b67bab04c8ddb3b1f5af121c776f2801d86ef7feb44f13c8d8bdcf5d1e766faf3c73bb87dcbd07125a270cbbf74052bb0734b57b2f81d13ae5dd7b251a96c9e747faf56e73404c5714892251356d3ede10b7b5966e6deb74c9adfbb56788dcbad719ad13efb8756fadd31008fb96bff624b7aec8d6f96ef4ccd83ab7b6ad7bef85d001097b15087f4844faa96ae2067b1e2aa85fa9a8244469a844fc61eb51874e076afd4ac3fb64e54b44c3ad5f89789f2690b1f507e2d67b6d3a6ebd0a00b937286efd1750a5bf83b6e2f038c30685478aa07ed40d3341fdf082ec827421a60290a07e14a91f5d1b3a8f7d81c6063ef62a802b5b5f70dbfad70fc5adbfc8ca978e8e0e2cb261978ea858305694e52b7a3ba2f2e1e8e84b1f9ac094869a078505631dc828b2d741d146551ee19794f7631a5aa4a28daaf799864d46eb54b4f57310965edefd1bdb6d6b104ea43873f67a74eca068fbee57a4384d468b84fe6ac1d8d6cff3531a3a50bff73c00da1f8616493f075ad21503b81503380ce0ac9305a09d8191832c6906c60d9cc323b44efe46f67a744491bec4f31a888722d7bcb557a5610732faeb4006dab677faacd3cfd6ff59fb2eb8ad1be2b6fe5337b5fd2fd0b0541786ba164e6e6cfde5a35c7b551a22b736cbae554fad4ac3bd811610d5ce73c6e5eb371a0a416ffc431d6057873a006ebcdd5abf99c76e0e5de990d3068ba4d4933b6da492bc316d5b59d5962a38608eac389edec6b3944bb19c764ca1b7948f614015b86171244ece1492305b47263c5ba7878f355165beb8789059a82ea10a51418e5829b3460e8d2340a2e074b12ab58e45761d9888a922b2266e0d051e951b6788a4a0030d94343f822057a8da96c4d88a43e19823ad4d4a95b63847be9cac2240eefc6b36ee4ca444c38f5c956eb8d010831b52ec2a911c59f45040ea8eb0eaec0d5c9731364166499e309d24064b1595112c35407079c44ccd96592bd3a6c59b2e36362323a516e96ab4dd48073deb8cbc70a7081c206bd8cc61193133eb79211246eb8bd7132c2268723cc93a6de0ba8055b515310b9b33a3a1359c7332b5269873ce59e79cdfac4b775dace8cb961d6fc48808f1824b2266545a59c7e49419526ee0c6d2d51aafc294d1b15036c6a7cb6494792983d860a9c271870d6deb1c92d683ba818c11258e8835034d09861aa43532c94245650e07181642cabc746d6186a898525206488d744db974389776e4b61bbedcb183a6cd6c0bae8d75b932204044927857665d5fde905153074e19a42c47dc0b3a5d6441aa98d508e69c73d6528049227e002942260b96266580944da154544d6688c9f106c50c599c0b2ee642cdc71829b22546d27e90ad918a71e58d155c922c453df668c0b8b10109620687e5e38a768b43e64b0a3314925867e7f62223ac9d59612385c6160b7b02d91417725f900c7db85961692c07b5dc7d8a8b12272d880b2662650f32283c0ac08226ca17911658aec26c5085afaa3239d4de72f020db2a8fb4c048a25d09b3c845e0021649c9ea02d6c91dbfc071642b764a3b4a9ccc2ec850a019637301034e74c4a9985206c7c4164d0bc7b314451c452e532ad0d676816c83c0a3e7aa312b122ce5b1b3f2966339c3cd9dbd48cbe103e92467cc56ee188bf253a56247199d3228bc84cad2d58e89f0e1a31ea90deae4bdf86b0c493a3636448fe53063337ce998d027c582d45a6badb5d65a8f59d24f005fd2b0f5a7fa815a6bfde98fe7ece3a566feb384fb19acd0e36addf861a30952c68f3358a70e312f960c052130846b7351327ebea4ab6fbbcf22292149579fbd5a63e04cd152539124498643cc5886a31e73922dc280a9e0f5363f114301488958a241fada92a5460b285574648901412d1006470b878db9b2a9eb2e2686c5d3629e1493b10b8b1b5aca9ae7640b2c4a49173a67658eb77389d78a3637729c41c172b12435276cbda82aa230c6a5c411c6a6d545c441e58c591c32df91710a782dac0c83ff05cc585119434af1888115b6c4e7490daa2c73595d5d5658d2372a4c4b97613b7caed6b0d5597bdb7242bc01c3020f39315d82a851f380d02a0b0f38584e48814b62180ba82859dae6b418d2c5ce132816732ad4e0e6e6cca84a1b701940e021650487d98c23584e5793b1e5316ee75b64ced8c180850917ec2c66c2ff6b5a423406fd47d42688d1cc7c990afaef022541acb6462413f45f063a8226ee8f1f3fea044fa05758fc80044ff464a52f1853c113570d931e557a6382277e849870925194113ce151c8be6804f1fbcf040f9de0090ac004b19a4b9eff4c10ad099ef8911134e1264a284426c3a0891317c6540f34c1acf23c00f74f5caa38301541574f0fc0fd9de9c6095cd07f1ada04af18211b31e8bfa215823b54c7b3426d0f52354418f49f86a9e0097c3decf24e7ba32ccea5d096d9d7665de5302635beeff7718b70630b1b4305dd480e6ab5a5fe213aa0d3e9be84126bf925987bf73ebc75aa75a0ee6dcf003b95c867b1d0af0f08dcab6f63219614fdfb740acb379fe7c0a635e97a85a5ce58602bb658a77c73f8b5ba5bc49f1f381083497f97bf10cad7ea90ddf9022be1c698e908c517210d322b3596e0bf42fc774a6f7d6267f50216c9ff26d1b89dc54cc124f07d9998afb2551ee62b8c71d63ae78c71d0cc4e4ff9aa87fb438c0f535ad649c3872921bbb92677b7edc9ed6ff55197e9316dd46549daa88ffae846b796706fbb636ef26ad9ab75db4eb875c25869af3983c8399b468c01c64918600c02638cf10e449d9d8934d34c34f368a6a5d6c9cda3893491593b5752c220090325254b42e84d0f610d1185dc4e5fb2426e43451cbbd3f7dfdbfd4ae8f3cc1957e1a1273d89ad4e64a8d3cb333b7b9fee937e7b3d64de79a2399f6b09d7e5f5f0bb1efc7af0d7af73ceba2ccbf75ff90e74cf596ea78531c658ebb73dfc74753de8dfd3d3d081ee9f31c6daf594752a9f9e303eb3fb2d51e81e0c5929061ae99aba181fdbc5e4d8febba4dbb6c7e4da5e39d8fe766cdb63d26adf1e08250c1efb3e10b8ff6d06eefbbd1082d0cc28d9f76f8f77be3f30f5954ca9cfbe5b0bdc2edaf6a805b9773d3ec0d4e76aea4b21b5bc6def8429e2240a0531a499e0f561c7c9141a65aec4a811bc9fdef75d773f628c31d65a6b5d426f2bc281f68fb6a4173fc669979d0811f803cca47bfb9f04c26238672281041edc451f552f0946a3f15a0953cbc367a6404abd01487a9f047bd574a0c2203d1c770aa19ca55992529306676906472c7e792d81c2864c16d9714b982a1f69d47ef891ed17b63daa55a949a51e3c79193dadcfe77cde0f03a8b42c932fe1bf976780f37939e79cf308f4ed900f03a8d61c688fee9fab897d9e2a91aadef5c71aa1e4dd110fdc7d5d9766d38a74b5c702e07f9cfa8eeb276d1109c04c66d04f147d133d81deedbb92964322e8a0ee7daf7707d1a9264e0475af9ea5a6080e54cf5237833a55054bd774631e55d759eed881a8d2f084832a1a8a5a6d831c07549ae0e8284b5a30b4359df179d393c5c74d6adf9a52644c197b98d1b22565bcb2e1c5a5c40757591914d50d322e78b419526709932c2b31266a6538b290956338eb09d79db413904a56a880c54acd97569c189b768c830667cec60daeacaf1b295820b760594992460c5f8cd9cc563032040d2d6ecc15a8e1952e3fd08c4c79890bcb6ff28bb335498997fa988c9a34d8a67ddaf729b04a575ed35e49346dfdf87fb670600d3906c16233125c7d48beae92a80d21c32308b671fe71e07d5e586a7753921fdda7a00afbb6650cb514582d6ae33ff1b957f763163adb4826f4b6d7123e4414721bc2d2a1a4a4b48284d62acb9c9f884f564fc3a7ab27e2131187feb2ccb92c4becdc1fff92ae878bc1f570df04100ebc2056a89db399f1fbd26716493e82042260253082037d04205a7b25a1a73e0c3f507d98fa10e3c3f0c3508ad63affce7c74f76b7e9daacb59f72ba1b7f9ba6cb5de69adcd37558dadb495f3f4256d9ad7d4da44511445d1f3bc497ddb4ecdc468ccdb4ae88dfef9fe3aab33cfb73d54ddd9377f596713131da8b369dedb2bf3cae3a545b93939533dd697fc72e9df5a229be6a9b53eb5763704e0cfd9df4dc88eb3cebd9ba3f8b64eabaef6cbf267ad7dd35afba5fa3bb3f56da5abefb1ea81ddf687ece79f6fd560fb6387db3dfee5ab95cb526b5d9ee763476fdb79a2f887cbfcde0b917399b37efd3bacb5ce658b240a58051021c28fd7910a38bbddcef6cac7bff24cce6d73d8f6a8b664e39ebfc5f857969ff5f07ac0183f93cd7f96bd1037ffcdbc6c5ebd0657e2ec3b92ae497b63bf1934c8192c92ff051a11f5d6990c19ac93f564d6d8eade8bad1c57f90f0f3d89abfe6737b659dfbc06eede22f75eab111118a102463bffadbad84a0749d7a4db66bbcf81f9e805dcc5fe2b5409e676b6fd84cddeb69cf36dcbfa8eb91eac4d5e0f778403af6ebb6d59dfb82b5493bf6f48d28e07e4d99196247ef68831f729b76da6af744dda61b6bf068a49d7240ddce23bbbb3b9e12e819d0a94a0fdf43e01f18fefdd77d7813258a48b811ca8d7c1ddd8f38f45ba3e35da64ca46a150e823e8d8c8df9a1fe4ac6dd6596b6db56bad33564b0861687b60b70f9d32ac17c21f3bc63e80c2524bf742941763a7802d5d7d3b235f5a49e88cdb37d09f43d89d69ea8c3ece9c4b2d27765bff24cd63678d560cb7f19de2f986a4aed3e9743a1ed32d9a40eff06aa9e8799ea5d6ba9d4ea7d3e9743e2129516b4be129075e2cb43b30a6c252f85ae5c070e771678d76bab76fc2697928ba966f5ed2b939309fe7799eda546f7247da76dd920ee48993e227e14bfe4e72ce39a7256dfc249248249148e27277f726242e893bdc9ac41d92b1b1b33bcbb3bfacf496655996abd65a6b9df6ca377ff8b3f9e5af03fbe6979f7ff6f50f3f5ecd6ca6088186a32d3681c45adb069d6fa854ae341631e80cb26800000000a3150000180c08068462b150305023350f3f14800b68903c6c502a134863b1480e23218a82180842180618620842c428e51c232b00d2f69bda36e9e97ff6aa83ef1534edbd7ea56fcff4133fbe27404419cf8bf8e5edef787fe7a78feaf14ed4a25be9dfa51044a9279cfe19240b24f5d4dec95babe6980d56cbb18e46f7922846003927f9dd388836ffa46e5f59b22f019b01d801fc8aa65e39b522097b95f318ed3c7d205725e5a351bd15024ddab68ba475d1513044e9a6ebd55dfd86c085ec5a8ee5548515957a97d12be50233930ecd6ad592cea4c37a7027a2408f012599f7704c6b04ce309512a08816f638e3f007fc9118006b48f6104352f5bfc82945a19cbb8f5d1f3de297f7639076785b2053abbf5ba4fbbd5a1d5e5ba185f89f9ba3b873f11b9e2c9f7c34aa3311fb10f6b334bf2fd59447a337f601f20bf16fb045cbfffa6ed80851b1e70797537a616abfe016c3ba2d5c053c0c1fa1411c470de0404515f212415dc275c6847cc1b8b81bb133b25e1cb2940580be013a8e566c23940c5638a7e2307da34ace83e8bc97127f90656bc9ecaf946b856f2ababc75b177bb7e8976412e02845b5790257e4d5de1b732a84e829141e195fc0ca64b9b6f2a6998133e90298cb2a634f62ab2a432c26188ba4962dd0c8b3631b313e01130aa13d66b0618d98447411530f22e242a23880aae1b9249944f26b84d16608284216df64eda96eee26a064c3166ed845cfcedeba69c6fb77383b2e65fd6c87a89e700e0ff658ad8fdec1a9c3d9235d5ac50d539aa103f0afcb160910050d95500b837550820df01fe604673e5cb2ce7e297cb03a445a30113e0cd7831d769207eac47c5b5bf9ad121d4b263efbd241d6998fd3c5a3741cbb177efc0229ed038486102e42e26dbe3946c9dc6a41b815883a5040e100ea8e46a5d90f2d9280aa5de6bab5eb0713c17221709bb9688669faa42347088b97f95c554696055216067157b84757e7103a37d1d1e98a6ef7785272dc7721ac654a6be96979d26c92c42b170551152263f087f82303df4ab6bfe63c16008b20ff2b7251d64f2cc94e277265b5bbe623ffd9ce7cde5db88963398aaab15748769bd3e7daa178899a72a91da03fdc522e1133a905987b62cfc1c53356b35284ff9334ab314f401c2202f02b8e2a606278076760abc2b32efd2d440e6318cd3d52ed858421ce3674542591405d5704b80686786491ecf9a1ea7bd780bb1abde746e3fe6b904ca3e56604f7eb68371a17c05e40349ae700566b22b3326bbf404438a30ff66b4151b44641aa3bb5248893027a447b64294141caa4d1a7e4f99f4187539c275dc1968bc33f49134ccfa325520bc81ce040de9e5150d02fccdc603fb7d26e4b107b980ec2a79e14d69421898db8f69f0c7cc928ae9e958748ab0e59099a6b7695e71fc9805c6ac81224247d3fb5a25cb58ccbc670eb5e15fabbfd5cf8e261868c2141872970c73f5dba57ebd48f884268259d6fbaaa9567e72fa9fa1384be2f7043b5f87ac7e41f688e60e36979a9774a9d90a8236f09ecdca20776886f8df4da5ca1d11a5af9230794a77d7be06c368549f4b4e58e28b7ec94f1820a2da872cb0278887bb1e42ca61363554cf23a69e0c5591ec0c8ad040ab27f0a4026e9d6c7d5cea7c2d508aac5f460a48d370d1d71fc260a330046b0238680baff0321d9787fa832c50b350fb6eb7d35727a6069ea62330209055adc5ee9d4316cc260df81e5c082d6fad794053edf7d04bb532134f4cf389e5e0906b3146e9ecde89d8d071ff258c44bb72087ca74e6317bef249690509f8807c5b40829592d16d8b29778b8d86f7907f6d4b1e317e121b3e8a714261f59dab011958919d88c3a31e1a86c94b339c5dbacfd4081b60d58e5b9d6aa7a9ad937c5759755af9c931067b622abc0bba016e86c8088dae14ee54dd76fd38b57876ab102a502fc87917d2f5e331eec59964c3791dae1a4e8c5b05951b9b5fe6cf393aeb8c0e70dcfb39d6515070ef5d9dd299372538445c558e80dbf27fa172fdb86b0c57c9869cbd22a4bc15f079dd8024e26c90c229bfcb6b3a4f4b82489ad34e8a43417ec714c5d39445bcb43a725fdb0021e7501bc94155aaf177ad490059c1794e17cdaeef798e902feea89100c39f4c977a8333e1c861675b373ecd135c4992168fdbd51bda4e4d17bf03837ba9ba3a26c7385f674e740b602e79fc2e22f3f5c85b8973ebd8d94bbda7f51f552b658b7f7a31fbb68149c77451c127bc3fdf3ca5ccecfc07576c48f105f9116e824ba4e300d39197c8d009c1d9386e85903f6ec2010805ab997c05272748101e7042e923592725c7228609a33bb213bef9163d4c5e0eb64590d1433b09aa8a9073f921b265bf8a53a2112a36a0250f421d10ae80fe7fd714f33829620038b51c2f16b21241f402ae106dd676302978141818f894c81f4239e0e8c0b038ba5e9f8b95908d4386208c0001547279fa39cc7f654dcaadcd21fe2c69aa9fa3a28b299f23d6ced0afd38d70ad699aead0c361bdbabbfefa1371b6fed32ea051b199b0a7f22e4363d0777e58f5c2d8ff5781ee04ae50e486b15870712de8db36e6ce854a1015c461ece0d8508955bd399e6c441ed6a36016b3710a2fa42bc944f4bbc015c0669e54b4f6c1e57c669e5f1f0901ea14a66656923021e3ecb30ceba4eea20ac5f95616c70e9046b9785f97363b6d7546a4ec459ba5a78f2e07c66cef9e6b2e064f084e019bb00adcb7e43b6928fe6213825e413224a1f31deea484de7a0cccc11f98589e66723df2a345084f014175b045795c25bbec6c3d68a76d9f31bd4fdf9e569762a3e1da9c150ae15ef4eefe29354261177a643de3fb761c7dcb60dbc809f66d9f43a4e2e44c4f4589af5291f584a29bd8db276b51f291fe405112881a159746f8e03901c709fea6499c5dc619295b8e96cbaa180f40b06ec06d8c21638724997aa1fd74c9f1571da51771a0e881285979d55f9e952daaf24ad6033c4f8ac6154dffaec4608b0e3b7226af5cc223feb6a34096c6fffe2cd7fa56eae7934637397347ea22452ec83b3098c7c71e1a98085a689d220a6257e652df1ea95bb0304e9c3a6ec8e80b21f70d0d0fd9131afbb552f0ced40eb37e257c5427fa94912596b100a847a58167e6d18b2aac9fd1388ba7d42eee645badb6d9aa09a0dcc5c956008d8a62bbf5543f6ff1599fbfe2d7cc8b03a3c6be9d68578174f72dd8cf4f66ec078cedd1eb99c5d0798fc71921113f50ae0c4434970698bc52c89e493ae516253181f9c23efec9835d450d717b2ac8be48f49a98c8da3ee7ea48c9b518ab93492053b88c273b0611fd59decd7aa961381edee7cc481c4b9cdea78ecf5d4332c8cd2bcf1544be7ce008de97a87b37db6f08928fafcc8f693e0ceccc61ca68f3fac7e0d2436941b9d3e0fc6c3a3607fdf255cb4b55bba38e43e7545051a0a9e8cd2800339bd747a02c23bcb5ea51cf2c0ba7e19dc50bb3998c7e5d9b11df4f30bd884ff0d7ccb3e7e9cde62d44976abee45a3453c4df47e5e3198536b5b98928c48bccccc259c532fc7342959ad3306174c6ac904b444279de4a5a59a99b7595a4d36d7363c41a2ec4feaae4cc3aa2e6a5665ca0d7e3c4ccc0df2fbd74cb61e901281fcbda60d5e326b69565b32af5afcf6c02974574d0d6ee8c15aba6cd5480c7ccba9a36aff3c31d5b2c28a8944001c40f8da464593c9e0dcd29e394def83993db81de0607ac82752b62daf02b8064439d32ee202884b5081b3de35c50fcd72e70d6d9d86daf46b0192c9bc677cb7a1f322e82d4c1a4135bccd2ee4abd7d7acc5587632aa541c9f142f186e91738d3420aa11283409e347dddd671015daf7d2e187c528e1d980fd3a611f2e0f2e503fdae16abde6df9527b440e373de5b2578c1abdac08c8b81bb6280d7bead2514c7d3caa0d598bbd82da1c7e74102bcc09cd69f944527a30f09b3ab52697a5118cb45db67a897f9fc90afd741ae58c97cca1a06a33eb6aa4b0e2bac05dd7cfe103d215dbfb40a83d11e0ac30a64643eaa000b8476eda0c2dacb1340682ef425b64c12ea9c2998cff586940985518b4fbd9899ec1aabf2e6bd966bbe312b43eb3b5eaae0140bad8b4264a324798259e28ac6599bdd6ac84fe30751dafb53143ff924e14f546788650ab90772846497a650f5e4433f98994e6c2be785eb03f409cc7b80efe5cbce3e3e7935d68f98d8efa689f18eb6ef9453e8516dc5667fbcc07c8c4a58249edca72cb6a2b35b4406206853d2cf8f081d3a9f3a04a5be70e36eee75a0cc179e0341ecadc26984f3eaaec908209268d6c01e81684581030b99b649caecf7c8c71ea62362361081f7e6dc424902b40d9df681c1cf6a0de32aa2347b44301b7f9df5dc07d89c5253444f4a60b98cb2c4a701f010295df27b15214ef975dc851861f4b8389e697e3366a1cf8f05517d67741b923db57ef4f45623f359a359a9b4592a4a0422bdd15673c857225ad41190566b1536a57ad4bb21b4d7b287615a04fedfc85a4a70ece7cec8616d76e9b9a185a5cae0c17081e5d24647601533949f6de5e99ede6839db96017ff20b2b1bed0af5bad5d32348a22c03be8a6f561b5e12ca4d200b57fe4a5ffe866561be26d3ca54c983a48823e2fd90539cbf9310bcafb29631843ec9c0fe9226f19e51bc1b6961ff922412f1acf5812e717d301283707d11a4360b983c5fe0faa73c9ada6ef7b4d8d63bb9fecf81558974b75657928612c6b6d6e0d82737cc55475fc66b1a9550e7a384e9c041423b07de743b0ff94304c45f77e6a91b6bc25e6590ddd4e311747505d73dffe9eb131878a5e568928633a03c240cf0f49fdf6e4258505a24337f650f367a9e8d17fae567fd436ebe3afbc893f0a1086c45c4d48f8588380178d060ef4ee8cabf70aee0e1a2830cae8dffe8fbff830a1831287dffe60a68161c394846ccd499806d8ddf79681f527660655027fdbba9cf01cbf18c6b2ade0e4e88070a465130e72d901d279196787c6e5d68a15286a71bf16586fd8ffe1abcf8f37295c484a77d531548aace9f7541200424dbbe50aeb39e56f819f099d53f17f10a0034c849502f0dda532b4d47c974d2684aed50aeaf2906fa45839d8b8e7c19c27227bcd7456ea5aa636956c5306394408b2e83ffed42a1e63f1265064eb6d740f243f5bc5bf988c23ca2e3eef078ddeb7b17580e74f58ff035275278e05de501e55a03dd67c9dc4b2778ded8296fc14445913a8e35232dec0d5dc48ef9b1dbb537630c9ab05cd90f0d569c25ca5faa9d3fff1d36d9a1a1a755255fee582c2c9df0d4000c1ea813489204d5087fa04ba94607faf297a14ab01e0408851046a94dd9cabe1e5ccf0ed56e749aa4b4517cb67e0defd92f8bcfa897c3835ea8891acfa6320c110fd0b773109f851258518aa96023249719ce01ba2ba1e27f30fe4e655897e2f151306eac37a576c776e011b727d6844cbe9a59820cd044c365c3d7d28040639c869cb77a1d8cd1bc1f9f03e60d317591ff1348677c356fcf5b131663bcd1fe9303bbdad57fcfad84460f3836e35635e2f965b8c6353afcda6128857f5d604ad7b17689cdc74800f819e95a3949f9bfa86849035d72fa3a6ae2b31e9996a4ebfb813d795fcdb42eefca08fc9f9489133514f9a9940ccb9b0d336ec8b98481a21f7d6dfaf1ac45d60eb8fc666353f8c7d5e0c11b00c57f3bbe03bf8902b5ff9e5e64643cdc994cf0eade6375cb31df1ea5ff2ec4bd33e0f4c2cf759cb911f75bf601ec968872e4bdc3f0675cf432b66540d841814eec6e47d638dc89156a9c20afeecb74dfde02f1bc0cdc4e277c74e239055faeb4aa59430c4d709371fc07ee09bfb5c65afa97dc1fa48431426efa2a1b648741df92a87f550e2380f671e89030ef2b9212ccb63bb4380416f1a22f449d12c8232035fb4c03d98fdbc77b285beb6d400b1417d4ca6e9754c92f948d00f61f34ed562f38bdacf438a9c9a4bea63e786290e1841cea579991a9a40c146ef7a2e35487afcb8f8159af90128d75399c271ec6e4c01b55a215cff61b6db91e1496ddbd4da786d2b1b1ec11888e929c52241d394927a122bf20832d9933a62a64f057480e77160d882095ebb334c81ac4fc669ebc96080e77d4efed75e83f2bceb26de1aaa08136b5a5ebd36b26b1622a843377e930c25823fcf065a925d5f11606797105657f9ffe906fb08d58daf6843943755b4e5d60bcceb648ed04d2d9b15be30b7312dc0d3d4d433a9328cbb7552cf8b451f7f50ad4b657c71c47fa704b4b5382621fc6fa0611decaa8e88a64a173e65aca640f60b12032a068808dc7c4b83d009dd7bbe8a0dd8360b819e8f39446c215a580ff1ecbdaa4d0179a0f31cc3e16db203e9e33e8a10353e2142929372ac40320d2b284bdf501ee9c6d294c6845a8b0133f83230c30a50c465256aec27187481c5ab8a1166b746b82c413b83f400dcba44c0733cf9c3acd3946e37a6936c9ac1d9ca4985d7ab6b108220587f19ab7519fbcdba85b459aac42ee355aa62f25b7f4f1ed92ca3bfb48176a9ff5b49df9b8c570683d2366bd3021850844eeecd95f1507c6dd58ec6bd37330bad04efb52a7defaefe4a6b0949d534e7090b334e732ec510ed7d9b7f00b8a86153e4a9298bffe6a5e320abd21084eb01222230e86514b1d8ea4a7c93ebab263c483549e0f63992d2a72604be87379769ea9744493136fd23251b1cd81dbf2a0f3ea51700862a5271af583b2935b30b0ede4b2dd442b68d1065594b2f62183218e6436a94abdf4b0f2b4401121468ff3af6e7ed92377f0edbef340432ae11c63fc11ae266551e2f3615a7c7688a13a7b445fa74e79cdf8b31f6725d200b7dc66980a1c445c6823e2b5c2aa5b535919ba916ca10e1e27fb863955eefbf7a7340d2c7bc7262fb811d7f71646eb656684bcc8e3c87fcffd9661e7a887a8f5f9f1b1328ffc36d9f9f8255774663387f4e6902419a4a1ab3e5f50012b007d8cd4be38d6695c2224ceefe73f6b2121a1c1a5518c39de93360b4c0812d553601cef05a89c64c2b4deb24b0d27f96464f7e31e4074302f95b4a5c2b9c0e485c6bda7d018c93a426fb0e36b81d91c21cfc7b51a42c12098e8ebb802279447c02f66faef14ae0caea5293da252e2f287780fa612b8f6698964f89b88015fc264ad5bed91ecaacd579d039b207c35622ea4de467f4049da37118057e05100406ad9a6bc0e24820434edc94301e245f229211faf5db5356588bc310171090a17a9911e1aa5a20e2110467c36abce85f7ec96aa850abe9f0638fe9ea19d5429beaf250154a546b90ee98e1a9e99d6835618ce0e05e16447438817562ecbde555d3fa0509dff55e6baab98e29c9bb8324aa588fb421145cb2c84482f46e893f8b23825f089c9ec2f382d986e1c4ceb10102325c6191e416541b724d3d7f39de4603e0d0f8830490968341dc3b6d065fbb20bea814c8c7cb152517a0c213e78d26ca967a61a6287d53cc67eb8e7cce51f2a5c794ed5a750243a06d1723e3d11ba2ed6093f3b623d4322464a54be29f7255bd7c2052f5bf6b12c9817e6a48b9c254409d95fd8c653f23a69898ed89a4fa0161beb18a6481bee7fd8c9fa121000303d5e30c76a0503bd8593411cc8ed6ed0881ace465bf30af430c9710c35b3dc790c68ba49031a0c6bcc51ba97d7bfa5f3440fe39b2b2fbff8709d798cce4a9e79ad515bcde669e92c90ba2a06621195d520b16d87177044a32ed703d66b11f1b8b37a84b8505026a49365e40b0bc68c5a4cce0e2ae407f51a4de4d28e8f76bb6ef68497d9c621d2558976b004d66f8e4a5f0d2480ce74b71d14719a5133f553e0aa3e29851143f298412251db983e3a8756063594193472595ee2dcf6d0b8c2a55c7184074fdf070c911ce420245c7f98514fc94ed4794a766827375b8a0c43cc798301ccf982780ad17410e1605cd677e52f23576988317ead5f71327ca7da549b99ef61e83ce1d6029135a38b6ebd3f91ef73617e2f2978a9c75e8b0c530e42e519e9d2791ed4622e8adcb80d17ddb6b94cf870cd27aa80458a86acb944cf00a7a84414814912a58f5d485e4cfc1883ea798352267ff639cb3636b2e4aa2be6c8c63663ae4621c7e3d884b312e6dded3755573aac3c397dd40128c3ace7fd8c1658ef67e7825cd0aec802a471d4cd49463127cea865020737e0a5496bd010648c05c29415964869be13b01e0e15fb5516e0b86bb130a31f5a44762833c705d2b3244e9398741252ac9673e9da982307c4ac45bdefeafc6d544ccf7bec4063f886b44e8fa7069253db855bb1d1d935507c625357118a0e73690533073585686b995da2ae8844d30ce14032a3fff2cd09fadb82d07039207d1554e894099d4caa81d0f49eede612b89665d0854dbf21d08c2243e30b0a2acec7a904722c59c19176f97b55c6fbbfee33c34c298d11a56c341e6d99031c00ff826d1f7029968db2beaa0f17279a65d70b57d991e0d28ea9754b2a7cf79b78bd2c817be699636adbc72163cffd17b48a81a5ef65c55150527fc412c6f6ebf3b60d3970810f3e2f49adf626d0dcd985fd6f283ec28659c55738dbd3eb7ed3ada002cc232fad04855bf8fe6595b71421fc5df6917884f4296f083f0e7401e3c6897ee45fa877d383309013378dcb9f41ed1e5e4b792f5b0cbf2734f753e543b52710b406ede855f4a55e8330fd0d3ab562d71b9da4a104f07aff30423dbc4a23a6dc9aee33b97b84e73c2bfa585e3b5ee154e516a20f78a2d1fe64a7b5c95573033c0206065d5298957aa3931c3ec89f65b651296158f95e2a0ae60aab5f2d410f44943312ebd8b75cab82d1aaf961ca670b48bf82907cbccf909f83279c7fa8de25792fde8222cb0f4b2fc306f77939cdc96375217a543a811581a6d87b9f89f0950abc29d84974f70c2f96fc22962d3927e447a4a30e53a25a53a9c74a2aa8b5aeb585d8ae1daacdfd9299d99c30b224111df1a2280a11417319bc27876db2a26a88b0e3e0c52c88ca66143f4db7933dd1d7a63ecfe705f15ad26c8cd936d3d7e5bed5bf88e7756ecaea205347a877cc2e5c8f255a3578f45315f9b74785859ac74f8f6e49ef692b3ecd49f30d790e3edbbbd206207234b1e35d297323119357608d94315a6894f2cc3460c82908412796fb2b0d071201593a96ba01c07a5c7ea21d11510c9c954df28ee8b3409c019cd5e56ed094b79cfd4051cee78a7a90f3518a7e5785391852797e27bc5c358a4e109dc464f9fe3b712d929df990c4c93b8289ca9c27950355428f3706801f3e43a41d2e0787653fbfd5a7d7cf8d88992694802a522d0ca5cfaf99efa405c93748de63723833c6b18e92c83f7eb3eb87c08b60048f1bd959e611ea75ea18cf2941c995c33927efeac4aa08fca284f7bdcee8c0b6b7f25a7baca1909d56eae6a1b5a135793adb1dd11fcb8f9cf728ac3124722d102673e79ed7eeb43871fa14bcefd00d95252e7fcc4b357c781d643efae1e9a655510a1bf26d1f103dbbb28306e82e9b517dbe21d24da95e048801a180d5dccddc4e7fb31ad0525926da69de554b49901f47605066b8beb16bccc7dc83ac3cc75a12bc8de55df017e9993cc309d9268599132c8cb2c8aa7f3b4936edb2b0c873b5655cdb56d2195efca381d5379c596f6c7509f8c6d2786f7787eb86fc64a23cbd78ec14aacaa056ca3af4782dd533b955afde331b36906bec0984b008c121055993b65a31c5ce4972022d67546d21759c2edb20471f5c79f0b0bbbb3a7be0c48fce7a9edb838fad3697fe1a7ff5a8c45917e6c1bfca202030fa6cdd5844d9c1cae2d699b22eb81b71afb3f20db2498a0751fa4d123e6a30f9192041debbffb427c210d9cb90d290b354a71b19e306ad6f1b1d25837db2f55ea714271a14ae420213bb00b20c9ec04a2281856c6926a236b50971df014a6e9823fd183f817dae50578adae19d0cf7ba66f8e5d5728aad8816d79173640140c35bb636ead955106d81f9b7dd8f8239aedf1524205371f4e34a3f7d391ab14e1dfe7c8c03f7d28f1437c749ad8146f9f899f19445c86e458160fe29c57ad32327ca8d77343168ab8e03aea68bacd803056a7cafcdd4296bd8c5d8c329baaf852502ec5d206a1d6d5207af6c54427f907fbc0b12cce82adb00e278e313abcf4092e4c03b06c8ce93a169cf10a753668407c47e0bc7b83949a52b991ea115fedb74a0984a918b96a9712bc9bd124781db705d3c18d9046cb9924cf9258a8464ce9c77346d763f01f36022685dc386d3bd85757433640c88537ba003ea02453a0f1683fbfee47079ff366835f480789584b01378ef9f07bc7f5e382cf107af825fe9452eb18bdf0fc2dc0b027ef00d9b49bc6e5712c60a2ba74b669a917744a894298c8f9d3f79c59929ac297a22f8719e0b32cede5e8b46e5e6d0a803b497fb7e22e2ec5a1ae74370ca7dde14eda18450b5c7d157cdf03fa0688fdaa6750c3d9eef2d048a39cd98fc6b8e8268b510058cd0800b3f0f158c959dcd68e1d0c53bfedfef9e1d2e487550bdad2191ab4bf424a21b551be3ac5b868d899f58360aea70120ba374007e32f680944aa52049c4e65ade61f1c4584673acbc12bd0494f7e7f7709e03414c66da54d7cc3efb529ba7965f6c4da75554918595f03eba481e0b72865ba3d52d72230cb67b5590c0dbf0ea2060dd351c5ad3bd7d431c971434f1df7a132a4e284f1b52e2565eeff67de9faa7d93c56792ac2b69da92311ff9c76238c868e39df5d1ff61c94ca0e5d64e8fd6f19ed1d9a502a5e64865b18feda86791b6093003f07759b81c4ae371554464175f2be47b9a90760a1bf69736f5ad6d5f433380d56e630a9e46e113fb9b1dd1ba651cb41d3ac969f9f167399712be667dc404f296f2ac4843e3efe03bf4627c74f9ebb8bb1b656168c20bfabe5838771a4822272f68cd5b989fccd26af896c2d5aef0e447522ebc63e63f43c2d950ac83246d6bdc50ddd9a9aa06cf6054b4d11d1c9aba49859d5566d57b9eab81cfc6adedad6e19397c1c7fcaf4087e77d320b632d1c1d43af31bad522a0e6accee80ec35b531f2d7664cd48a2210108cb894d80aae626dc063ec40b45df8eb166f490b3f0293557cd94decddda0b44c92a872370c65c9331ef388b54b47403db17ee30a0b6f97681398e76790dfb2d4d1f6d256b34ee4ee7b6f4094c411cbdc70d18c8df25a1cec1fc4372535df2a69d555c43c32cff64dff5dc2d00b6b84922aeccbe979a1bb22661ec88a93facbc237fd35c1d13795cd5d3ebba6a5a8ca8c9d6f8f62b3e5faae76aa4211242f20f424d8eae014a11215263de1bd14e04d46f1e862e5e48ba355c843082f002c7820e6ebd834a0f33cf627872599eb081914b0ec26b666b7dface2ad41f8824ee36328b1002460ecbf6f4d5affe08b849b48307746913c67e058a655a9aa5b848089d3dcb9e9b644acd038dad392fe89acc480379b1bdc6ae154869b3b4ea47ea5648eed70a86355101928f9292478ff34fd06b33762e2a6de651d6794271f142eba5c8c16e6feb411df35e64de23bd251ca009d0c6bcee8e750388a3603d4743c3c998a11891ddfce1b1974c9a8aae280b1b2a96cc98d471c8a53b83e5370095d1c5ec73e456e427d695646e2754ef807834ede1f16921549e2675b43ebe5919c24b3088c0887ba89fe0f19c8ec4e416de2384cf7c57be610edcded406cc6d337070bbd746c7654095bc04ada2d7679940e439bffd9dc0edba590ed68fcf06ee328baaed9852d19820211f9b278422216672204bfcde7539bb9f31698b959a79854adc2737cb553924f900820bedb22c604f71a02193dc821bc4bb8e00b381757d4520a4247fff15944b16c6e2fb5fa100b7e879566423ca6d55dc272c0e218644d78fe443d4be92b8d765275000366949fa5ec6b682052739274f16e19700d3fef394edcd0a2e3dc506761f68e6439cc9176c62eebabfec879f64557561dba00d6c8b4c163971842aa0e7f5003498a8043a26bd29a4e87661525f5318d80f08e97afc6ca239f2d484f3faea2ed10dd744f07c51354082cedfc2c1f99c8480a940bde7f883c9e053d2986962d6c5aae7e8dded4ba0a52aa5926c54356202020d4f97ed7bfbcbadd84606ff46039dcd8781d5da741926e4439bcaf54a5f3d35816affeca86d8645744e573d30b863bbead3ac28f7a927c87a6b5dff7a0d723d601ed37551fadc30db9d27318a51cd1992ce02e26982cb77153181d7029992aab6139a15ffc3eec640a972a24502f07d931311b3589daca8ddaca8ca53ff8150ad99cc80df1de4fe594e0c76921b1c11e543b96ca7d107e2a5061b76fcef96f47c4a726acbe81ff262357078b0a634fc8b6f62802140f90b44f5be0336cf67a1a20e4db9583b9a41bac7071135005f6cb851be4d2ce173b0669d710802f43780939119ff6dfc469296c7dec8a4f827077f12bd724847d2c366f6d50f3583be400fa514a83f35ab4edd5c239565ddfb9a877e87bac002306d5771a2ea9df8d0a5ab4a1bca523185db467641c8c0fd2f4be1b1c0425a2d8c80963f514f17950c6541fcd9b78c0aa4a9955ae701d6ac16fa665f6571f36a98ceb8390da545c8846121cfa0360348e5c4fced1556e501a41c651dc1fbc7090d5e98ed1fe2fb4e74833c1a9d1c10eec9318c133d293fe44f9d83ff7eebdabc8426fa1e23889594aff6ede906046342078f2b07638c382507515e008ff02dd7afc1d3d53434cf9454030308af7ef48d152bd14032a16f5d3f4d2fc2cd3a5d0a16a902b7fe767926ebe97372b1b93c97acaaa10f4de1c9a4fdc47dab741dd740017bc223c9b1168a809369b129720241741d27edb8de20b4bc07f3102d62cee1ffc664a10d29a50fe4b70b80a34a9f5611cfb013e6eab85fd9ce6fe6bd7f39d2cf8f016f121a993e5ed9072fc9ba7dd66395cf720be830587ab4ba63686b3d29241821729c277a8b2345aac068c11ae7f611c9b4c87f21d9508b9cf6ce3fd3879aef59e3eeeba222c1a5594c0b5174b536d144e67c507f3ce978bc8c4ef000494ca69ab72af3541b68310da348bf09e3f3edd60c81978e9d52a91546d6b49c2c58dac7a204456cea9c64d26049e0af81f6eb2448b5b8e90e455efa434ee71056f0394adc8c1e470e677f56cd4959d4d9e9aa84e0d88e15182d744b6f64662ed6c4e4a7cdde0f1392ef5c9ddb7c0f4a69298d69e1c7cde1d4b744d4ef299ab990c2eb1b1a7ff93e16fbb146941012173f03f988d4fe3481d6022a410131f798ac94448f86280c6e284f14cce178afa1dc5d089d739e64f11077125b496128434345bc195a7e64b2ad17621f32c9f397365fdb274d5a33ff56aa51f9fa24eae98074263adc8d9608bf4498f97ab7fb83198fe298cf8e7fc64367c93b51899f30cfa86c2d415ed8b3e9f41a3af31ff649667656f0ba3ba1248f6406866d669a4cc6cf390a8c937eb255a546f37e5a7318ffd36963ee64e7fdaa2fb999ecf0142b3d5975856e54177ad9c9b042208ff0fb9075cc24374d5b732444ecf8e96b3505d8f6301a4237a08f260819d0ac4afdbb97e873d5f42b4e5284dd71758a642792722592d63634c663cbc23c9688cdc37a13a26af9500cc24627dc06c7959a13fd847fdcdb3890d967399061224ea19a3203304b52d16ba0ae932c30183a089ef350fda86733f958b24f3bb4b847126006b70cf1dfd000a0ef743d3bdec348b5d6f92646511b62b0e5068b8739f7d01b278d080b7b421b064e84343f1e67ae23a2c0fd179271740cebde4464ed0f420d664e99c984dcc47f89f1d55e74fc44746da0ec77703ad06dfc08016a92bc7f228892ff87152731fad85200b2bea75cd3d1f5b1dd420bda641c2f305e0dc0be25b1013d2c9e328f9e0b08064dec0215410c6b52db1553a5ad99c330f41ddb2a3e9d09e533ce1c90da1422c636da61c8e77abc7905f51c77cb5101745a052f6a97b7fb5913346ab7245eae4f3242fed9d61735bc26f5318e7b04dab2640c56af74ccbefdc4c2240580a6a959b25e8b1d74a770e6d1ee0ec941efe0d595c3fd26cb61e55dfde2ab9d86ef190e36b5e7dc7476c22a4d0c342891ffe74678cf1b8f3dd808d1acc42a54e76ccc2233a54b2cbd0b6636621dad79360058fe92f593324442301cbd062a46b036769af911e44371f7d8cf8e168d14021699c7fcb68153c18267a0b144cebd5ac0db96281897dd262e0e4d9d40f891d1fcabf1da1a5ece7b9070c224681b3b99c539ca2aca60d1f55ba8d8d2d1528c83a64bed8a592bd51f6b76391367324686b4eddea1661d070f9546cd69d1af8ee764b5fdd58dc5c4dce097d440b70b0b02f6b5591bfc138785b914ab8cc8235229fba7ac292e27db40b03f9c249ea2d5ecf3201d09364b4b6f55549c93dab4edbcf509fd5a9ad4e1592e9972b3448ea88a6945336559566220bb11828a785e982e80b8a61946c39acb91a9d6454dc37925ebb047e53ffe354b34ba6220b3df753b81fa0af558b3587915d993848b0256cf0a90f64e614a8088122fb59497a39002f463da93dcbb769b4b0720df287d7db3e22f2910b3bb29359e62b8df7f93827a6532833bc5e5c859b403df66531422028976299aa4b71a797dd8edb31bcc599a8e369ff530f4ac7769e24d7e452147cd55835f52155d8fd4fb75620baa3e04a3a049011141fa9e75af926ecca48d6913a152a309926f6a3a06c4778a849c9afddb9223f446ffa161718bf0237126a0ba4be80dac1c93b1a25f1c7b88e99517924457e04aa7c0a59386ab53a13f63e1feacb6edcd41e2b22d54b39dd3f584f57e33bb7ba7bc42aaf0017dbc0567315c86ac28ffe6e798c91b0c6bd8ee9820884432d927dfc2acd87ba20c39322aaff8b11aef8054e4b9eb89d5078a0da13e52c271d31b10d077e3c5ae0a2845754d654b4c8ed6f0168649972f119be129e36d22008319d36b8b081c80a3941dfe08cc876a40bb29f2658006ca1bc70734e04db3aedbdfa3b86a12e4bba870e9a3dc4ae8b7caadebb69b442f8e183e9c19fd35b5bd04e77d8a1a0d8a38b3a20ec2162fd530a8811b15abfbe8363d24bbaa31359c5e251d261a0bf0714cfa3c6039f9aa33059506f11d60b7420e3aa0faa5db2bed6ae00bc17934e95e0d2ae08fe2fddb990bc9d2bd687f558027ac5898e74fc2afb2c204ad1b01345d74fa2a7d0a84343b5bc8555668fea312ed57b8cd3f376e06cbb372df601836bd7c2636d2435432390c5b308ee17613fb5784518025506711449e7c69c72c7e2b46ddf2b35505492d4c007f1ebc0730313ddf08da9e5a18bfa936046530f5a701a16ed068a52c4a6ab23695c5b9a1a2f5118515bfa45c7a93c1646695d4970ed04fb0999f1cda7d7d923790c0e2a0702a8f87d39a5eda9eba61a4dce03aacf8f9b16c1eea53a58bcb9c8a6da0d1b0506d938999badc73f04f6104bc8a70e29cb7811d125608b8f867ed264730ac1ffa4a5798075088092348a08ee948ae1a84b68aa66700f7e4be528dad6b5d912dbc2ca33411b23ef921901e640c75fa12ac4093be2fe4acc254736fa7dbbee92ac9244a01e258f127c8a61d92e2abe4032bf9e292ca76b0f0cb854aa52045b756f442253c03547fc9b2908fe205c344b3009a7495777d365544751fd753c6e7967e16bb4e77fbebb22e403a709d6a348f46a7c2227793a15ea648a3f1b15e1623af0911d8d9f093d3694db00e1cd4a573df5933e27d22f9bb450be8dfe5ae209448eea4186b4b15e91e4dca8d5f25c01a991f086bf2c7c393e3283895445487bccb51b42f83a4c65dcc3a01e50258e3084506faf29b75ac5370ce1c7ed114cff5f69f705961d671c1516261931c6c8afd804b594d242ab1ace0d260582926ad954e45ecb9299fdce92b3df8d40f85cc8c46e2dc0a0a7a29324615075cc01e1d479d60721ec50f217f46e62e15066cba26fcccae93209b5328557a3b8de006dbe7f7f75b530437d86f7ca7c46a247879972b624448698931211c6354117c82cc29251c828017e803382955229243f0a6b5659bca27fdee10a9314e96aaa29efd945ca220d7801e245baf26b234b08b90eebfe66db1378cca05f1221564273f03262375499a9107566bb7f3970d2f2a295067910b8168fb0bb6bd382ee92ffed8065a0d25ba4a6218be9b0a1e362fbea3390c9bb301d66dda3ca33bc0f585e3f6ae1ea09c69378774e0cf4625448a2c08805ff13b2543da75237133d28d0dd53d8a15582bae7542a8c2b7717801bbec88fda388521ad87a61f5ccc8e8fd550865eaa0323c5eaeeb63ee7950e70bd541f97b6dd3f7bbf64e33da629bbf9a4fbe0a32fa5048d12ae9336b3a5a7c302e72408c80eed5d26984ab1dbcc5f90f4e474d2e1f284b9302cdcb377ddb1037497e617bcaba838d9ca96e2970286a2a0f67f58e36f638e03c21fb8f93769cd5cad40d7fd41e2b2ecd64f2a3044f74ae41e3ca0f2cbcb2396f64b1c7dc5e76e2e60b9f8e8d891a2f2b1ceb54b83218989d695effb604cb46a85f1e74125fa3f909fb3e428708c508f60a7f6259391dcfba1cb84bf04cf93c4021402df6e9679194476a6206e0c3e115728fba5ff681ba79e7078113b27313802367b01dd40a69fb334e0898183369c110a38ce50610619646d8a66a51936fa09a3b21115ba041214dff0dc7831940e4aa80f0cd71b6fe2703d75d72d314471661d5de5425039d72c194fc6f847824a031616b4464eec74a624526dbb48439e07e68356c4137fe66414f2c767f6a7824bddb5860e0f6299271b35d5d8ad5f005f3d4fa18919fac4b2adb5e682de0365268345304b2b35eded08c8f31643dca6028b200a5290a2bbede788caaae4c8d84e94d6e81ae23263614188b503c3fc6b1d795b332c14b7c63c218c7dd174b35d6ca3abab323b6e69f7c7d0449d0e554ba00b515b8b8f1c557a3f1721b814ea5e2523f7afdf0b31b6d882bf049d6196d3045ba66255f427a79a3c64546df59854b1fe87d88a8481752b70f847db5da9e125c31a2acfe584d5df41e2b3db2cc9e88a8e4dc1b741eccb872d502e6f238ddd3c19da158628e3a92a222bd66e948259408a4f0b548f87c05393b6b6ddf75b7c82e07838862425c52daa026fe5656cc13cfa7f7c5922df6c9e896d3a4c15e9fed1ecbe39e5b3c607f19dc8eb5170bfaa3ed63714b894a39f372660881f1a195e1b3c8e47e8e41b1d4072429313aa0c8d0900539fe830018161e66cdc79eb74eb6d740a52ab230f71cc0fe1a80be1ac6d27de6e214a2554cb5900efd9fc7b2e576801b0df2c32e014d9307940b551cd988f3fb348e309a70d504e4d49d568347bac6e20e15caad55d037b067c8b5e029d587de825ccd8dce8b96ee9e8d82c7a1dc77ba277a75d93c3c551da74dbac62110d3c151d873bdd926299e56a6b5c06622f2390143e2eb28496227f796551edae14e45b7d07755c7f6ae0f9fa735646ead498d424a46bc89c16814f765a3327ccd2416266aea9a305f9d8c9292a8fd26c9e23a6214a373eb82549a4de269e5fdf0fea2b4cc9bd884b57e68c3d655893fe36b5a57125906145ab940428859e1d275acc38ad2982ebbc93ad7ca571473aff5295bb063cf90f120551423dda82a84a2dc0eb0f10f45b1b58754d53769685f14e538a3e8bc50ae8f92f92e4a2c24f485ad5c7250b9a1cd856dbf57c72ccc4ff145d9cb69f8b5a46c4c7549d0b509f69b847a7d6002f1db9985025d13b26d6340550da09c8bf3e9086eb5b87092e9047923f6b0b44b2b3e24a61f81f1ad3084c3d2bf6658bac443c09c37e31102227ed2bb35a14175818ba73fe90886d21efd49d7cbce2e9dc3ad460abe63c3b6863fa1c0f8ac231c65c6b916e886505490bc39cf33836f3c4f6d9120c93c8da2cb30c3c704acb4106f7d14d306a585d449ec32340c6277dbe5f04d08d0032e073568725e210690963b114c7c5f846157d0a4b3e7f7afc6769f34c1cab04bac40b98a941b9cfe8ede51e7712f06026ea38758196a702107cad2d58fb2c5218f7e7bac0cc16807ac817ca1bfaa86845c12656e2899ca9726fee4efde3a3f875a5947943497da40316465046afa8318430e06500c4f6cf830b46b858521324d133d931e29325c4d132f0f8a618774affb9f752986b155ed2296c999869119b73516eabe1a3b91396ef89d50810e3a27c27b9566833e1717ec08ee8c745812c5ed4f42d519c563a9a8f152a00c9581b788ca3897a8048831628255fab1ae079e9525b594d2ad5f3edefeec8fe8a6684751d7e8244d007ec4d9bb69bb48c2b09a19b2ca28cb15524f57598427f83f8147bf547d871a8f3590f8f9bce7e76708729dfad14e03344fccb0ceb694bda3e010ff86a7a5d01f6637944444452ecd9e7029702fd97141cc4af01c648236987f72a3f29bdee8172b0ab8cba548b104aa3f7dde2253df8e0b8e0293300b8cd0f2c0710a0f99e9172f9f6f0065ad8a8c83633bdfc0f0cebe9e4c8a45778a719624131ee3a6994f71f6fa0ee8a0c7671af1c89773a859d008f5bf1c0a19ea30f55351101e60575fb1c3c9a60756f1a7582bbe3fb82a27b0805add050d2e6056978e72ff0a396f20b253f8558aadb0561bac25118de01e09e96ddf68d05b8fbb884ad24e42070da39539e44225209112096d395bd3bc9cba647f30910c2e3150065adbcebb97164dc219fc23e099e4944134e029477469c29d32e85fa2c523fe5d32f9afbffb0c16c13bfe845e8314c94fd5a76a1f7d9985d09774051f2945fb1f47b5848c26a2f416841ad79bdd821166b8ee63a106859741f60b162fdd12722ffcdd7e089ec182fff838d7d6132b7baee8255c847ee79822c7a43b7bc0cd5edde3dd7ae0263a327416162d448712743618f8ebf0b034cd59b213e71d26d01b2fbd5901d3bff513e09b9d003a9f00b180d9086f043ab79d419d5e9eeea753dca1c4640c5112ca7e955c4c3ce0cc9096a9b1c41893922d60e826fd4aac3ba5a7b49b212a8186914136f98e4c0d3fdfad389745d884c4e0d8452a509f2a39254c683da7718a4b31972283fe22571f8c0b7d857b43f050b7da0d96d72658c2245769d48272b4e3b05d199f67bda37daea8d1af79f1e8d27617db01836b6441c28168342ace009a7b2c190219523b15e1b951d6bdc930a8726605a8528793e36ba6ec3b04ac9c068a37b3cea9e465137bbd1c7ff23b07ff92832a64b37ebd6c4ebc87595f3acb9d21ffdee8ac5ec83d4befc042de62cf37d3e9e1215dbefb95bff57175007b4566ebccf0d4b3011fa4578f0ace77143611c857721a84f6e1ac6697c8c97a2162ab142f4478d7c4988e1f24bedf8e4ba4e62c68d7f6814f96768642ffd9aa5465bfcfd890c48d3cdde8dc9ba215fed86e52adf9fd540fc5aa624e998b8f67a09fd8e77247b26c84bc2e31bb613201c13c0b2de9ef55bdce787ad1a42335b08ccc4bef58935ec6d978bde83395014a2b0359225ea3cbe1e7f325e53519d76474c181d2e505c64c8293d38c105c2d08660462c7ba9f4d518188b9ee105d5a602ab68eda64354022d264b8dadd649927c676703309013bc58056282951c700eb3da1f73de6fea824cae9100fe2a059f2d3c912f0a31f8f3068c372bc9b2fe94c1f05cc6bf834769af7622f0dfb8543d3e0b01da2a7393ede3eab65f5dcb1c2d7b5e4de0eb4735869f7029485d8c7c93fe78ba16f080c40e48f81f781c043609ff4448cac8260df5bebec17a5de992570de7d2bb14fbcf07e8bcd4e48bdc66f03cbf8138ec314b04ebe069d950d34154418347b3706bd45f642d290f02aa430635c8e3b91c8e3c200e4a38536d6d6236446b7f51346f27df28ecbb2937e647482f91e07db04fa3735797413e97b732b4e3d69ece834be42a681922ed406c5f67b5950e2e40b3237b09a827b6af0d4ce51dbbaa4671b3d586ab0f1f4635dd4bbb0bd61966d1bdb9eb25e36a9413f7df3990047c81b3736e049cde12e79dcdc9dacc14b38ef6832a2f8cf9a82b3b66b9f9800fcc95fd3b5e047a09979c76a0cb691dfe9c4dd4bb0cc0f6846bf54f9b666252874bce69fcb99ad7d7a1b8018e18757f91b5be7d50986bbf452b938e119a4189b665c1ecc759afe06e46846550b07add9440e698357188857796734a15838c7430123193ac2374707c3b1b7b61992022c333a4de4b3ca0182195a48da7d57a08a4e6f1524a015723c34b8f07ed21c7e18a547d230083fdcffb0d09a054fe441d475331f1d9e068070db0cd5c6b54b20d81c823bb33ce19477b2d19650f30a1782770ff33c5cd448265da07e0a8c8a007bd5a4f2a227188d382ff1b467346d780634cf0c3087ad0c9f5b14627e044071a41c71aa150d82586fd7e62caf30da62058c1dcff576096f890023a3c7d4716b3eddc368f941b30d6c2fed0719f452e3a09a5134ed0c087f6c4222ebddd115ce668847f107c4d42b1b0e3b22ff60bb86e1d3bd3d13b07771b8d3f7a33dc5459dfd4d77293a66ac3a1248e4a87a19872816b36ecc7a5a6e63630b43f2fc1dab3cffa2ea858de67985214f213644b40728007666851882145803ed21defb3126c5c0de5492deccd2b34be44f1a3a0d0fd04f67c6435bb41d33e8622f4439a088331c91bcc456886cf5d1a544b7bfca7cca52927d43c0f72599e41bcccaf7702bdff63102f6085ca12571e658e51b57cc078df03c67fdf03ec67c5609baf4bc7ce5a27542620bfc650d4d9492bc5b485d533d87f70a9dd174127c94f4eedb1ddb3df7ed5ac5cf6f528ebbddda04102628c7d6004163befd5f9211063c5c1813af98549f8cb475ac18e32aa62417862d385735af4bd843f435ee739317e5c0adffad88e5fa787418dd33ca4b545e75b75cfceb30bf11545381504ef651150e606e00ec210fe0227b45fc4669aee42f51f5a011c28602c5208adc5109587bda4966b19b97d64f91a76b08a366b8d357d9bb44a115862ea810ce4bf5282230842fde044d1879550b8ac0cfb5dca4627947b6d2c0415a56d01d6534834ff923fb7a04d949d358d463a5f0cec78c9f44ad870e92293a707619bc43176e4448facbc47a65b54d4c7eceb97319e0574ffcfc79ff811a41db9669bf2d63b2627bd5cdae254ec317409f9773382c3706725bb2a489daac5cf10a00180a661ebc02dd337f85a9810316c0075c173d0d50bf81b6c3d5ff0a1159077c5a56a50a2c1ec88581c1cb7d3b5591fd6ccb4f5455480bc59dd58a5d3e1df557a910934775307b6f9f0c785b062f774659470dd1ce2d059b87337d26d4a78811193b974296ed8b031f05e3a819fd8d0f7836b84a02f1986d2805f918e56a9119df0b6cc0b0c75c1322beee6d0ceb5a15115f080c29ddbbf027b49702d7b35a2971f87d75b4cac10ddb8da0687b5ea9bd68326c30f901264453ce8bd241c7dbf4f8967fd25f58b9d94037e67b5d09bbe6b64367b99d9ce7298d1e532f03b4301f89ba095c452439b24aa8baf0dcfd3478c6a2d30b6cbb3ce6db65db5fc487fb1d47e951db5617506e092abf06734d244f4266a52472adc07f0de2e58581493cfd5f5854c33ffccfda601a1a9ce10b3d8605e0303fb4448715820eeb24d999f2ceb82dbbf5bf0c57be6f2a00f20597e38f715b7762126b630d4a747b2b55d778d6b34e956d4e9dca1252bc3e5cdb17635c67381b7329ee1c22e2f98599a86531f2d0339ddac19cdd024eb63a4c37a5fe403099245bf3473f4167430b4163943f4b93bef6082e4f2a1906b06e778f383a7d4da702b1c1871db52d3e6c389decc373963a53153dd4bdbae5c4bf2f5e87883669840662d10134477ec1ae32c9a45d00cf7c34bd2c258016a1d4b8c647e0024cc4ec018e115d975f95da706149f7ad3d4549fc0f5c275fc9e7afe6ff39bac0489693a1bd4a57ba7e566d557f8496cc895b4efe234261fe1f519a5c8904543f4db6657b6af538295ba6bf761d600dc409fcbfc12f2f7ed5e83ce21a15512228068fb8454539fc10d80956049649b4a4a34ebe39f15c49200556640798bb1725cc355c61a4e19b47880e4080eac53658046b457278c2a50fc844118ec355c3794cb9134ae19aa2846168847707bbc8049f23ec269d79389d62c19356d93790c090e873090d145350b3725f30474298b8e13df8cce75fe736fdd9ff597e525083d5f10e89ff03fc7b0500abfb8ec40e717972385081b869d1f6503f23883c4e4e81b799648349dbb5936093c8e91970269fbef7c25a06a4c65992cc62f0b6f6b37539dfa193d41f069f55d24b959a8171032f11d4e80c524c171f72baf8428116075e8b0ecfdf19941f4968e339a73c51e6bdb5d8a1769753e04fb990bdea69bac48f99dd06b86413b811c89bd9fae304f57bb2524819e38911f20706ebe9609bb5db4903547edda05802816b72adf97052991fd02ee8a52c2af5833bdc90635bf6cbc473016461bcfbd8d23c5ea91f7c845094d2caed964dd81fa84c0365bf45cd1a4fb310d2baf92d7de3fb6ad67b3d0ac76841fc2657e75c2220520672c7fdd7b07c283cd8c6b4ce4efff751ffb616749a5c572bd77b956e0cfc37f38d3ffb8bbe3b845981af0431b5d62aa84f2b156d01912f465c538624fc401d7dea24f4d82538b8f17b6cce1642d8c9a409f81b526080035e0cc5a9a0e633f5610620f30183d80e9bcff9119e003a6954340dffede51cd032d5ee06769832fc4493af0e97d4361b1ff60fe962701d57e3495ed0e57ba453e3a08b2623c7bac66832cf0ad8ce9a56e359b547ca35d74098ac89541219aa447d368b3136a572cb7bb1a425a3d0e245b5319be360cf88bba0db18249f8be1c1e8cb62a523dfb8c49b5e6f883af47b0d72f540d61cfcd8ccc96667ae1f91c474cef8236a389a9d100d48ccc95ee0b823645f0c5c2456a98b34e351da828f7dc51d535695f4c5a8f201ff3c7796e968257806b2307d35c1b0235ca8c52c55ba3de6b0ba58668fef800999484f7516c7e1c41c69644e3acb772445510e96f9a21ad8d593179c5d3cbbb3c779ca5552c29ab3aa510a9fa295135e880749a391ca36c8d9875031f76db684ccb21601ffbeb8fc4b64d94681f912a09d0080ae50c3a8a08cdc99ceda4d5f5ff431a203fb80c3a0742da698bd663a4b9f757622d3eb6d0b66e3487fc0cb3479f12d1932cc62c7c2ed9cac3339cf1e56152b07513241d7207f8562c7d7ae33758f3185cf870b62232c763a93ec7e14d2e8314a611d947c04df369932ccc4869fb341d452dcd1f618e75b4b5251875ac9a70b19b7e31b6459eee263f81651d9c782cee8215268190da4e59b970d89c56205188266e37f099f9b6d427b78cab992c1d50f78c3eaef8566fca228e6c16a7fbbdce2b8e3c12449153b49db843ae5ea8bd45ff5e4eb876f492a0e15f6a0787b49f170c4717cb92988e42bece588e4ac24485f63e0b3e67acab7b7a1bc5ceb863d3267d05d0606430b280179c580ef468cd002d54c08d189a6c3e74019a299b7b30f81df90fc132fe5051bf1cc1704769dd980d4739e0d09243ee576771d7c90b10fbb26d004076a6d80535e90bc7ba484a7564c08acbf0eaabe6b9d85441f8146c0ee927116c33417f03f480c68d9cb500764ed62a1078d44109b59cc43596e1224a3bfe105223214a381a810c6c7bf5ebeb1b8d1ef008dd71dddc84f416a539d3f0f56c26c91598e3ed1d00d47db09cf0dd9ca4f1d2767864b4e72956d357e485cd0a6ea6923d928adad258cb8fca79c4e63415c6942ac2721a6de4811f7eb6c45990820ff7b9a3f4b1d0118f5d30ea73545ad2c7f8e97cd93fcd8e8572ce9c65371472b2d85ed9eb930b59eae0dd5d6ded3daf8909c759b73714bdddec987dcb9a181c354449503c165a8605db25c519a6a07b19c4f4be80fccc9b96fd00b1442d5493b925725d0e406380f5a61f47a4cc33bf77081a8536d635f6ed380827c292b9ef20fb2e486473709eb975f11522920759692bd42b35cd17a08278c076cf5646664de9a01650d225bdd8ac1a44103b40fe1ee82f5ad01c14919694ab60320512ad2a909995282e18486b031539f50e6081655e634be7e5506351396351448389cc8e8b32dec3dd40c8a6f67d2a710fa9b24bbe6e211790a6ffb60e8c41aa1fb8404e520af1d7f40bc2e0e374c6c98d959c1458357f3ff8d4fb7fcc1cf5cbb4bb0299706d1b3205320a1c2a283207b8776a11b900c16535375bc6e28cddb475f89afd25dd3c159ccfce8593b6fdb3989f5615f60a3054d8cbf863fbba8307ca1aabb7f469baff061141a6be60798c764be691b076d33dd6e3f6e2bb26d5373d4be3196f4bf12cb4104edfdd5b7e166c599c30b56c2322fbbb66c21e9161d143353aae68654d5605f87ba886d1ad7d39e9c48564cc98f4fe86854f81bbb232b996a332048e1fa3b6e6aafb4b740396ca46bfa38f675d6cda008b1d9e23f50031ecdf8e9d427887f8e419798931beb3df7a771963a5511c52f6f439e91048cb9345cc3a47cde3959aa837f98f022f78eaa726d1089b8026fcf2e42b267be6246af8d721fb986618693a15fcd0d4270a91b738f8e540f22221d622778bf20a99184cf6ddf264702c19d46fea7ad6225a18ff6c169344046ef932b062459fa9419a70af58ad979565759a6fe59dc63864ddc5d811b9e93b18c2c7f8549dfc0ba8c18a0ffc093386b8589743c223416473cbb3be5d16b90c8a9f170d1848df34b650747e5802227089052a02e11dbee52bcf723999e1ddc2a4ed7762d42321de8e067d3055e836877e1e8b768b58be8d0f1f6113f5fe434c4f12d39989f37b456a1f71fda15e6f6768b128c8ef4e6d548ccdaba6733ff6f97ad3b4677abd77684a0377c6fce86de6f08289dbd8475768ec2ec0e9ff5782f03ee945ae40f71e4f1ff03838f980cc6ea091e13a7905c269e8bdd7341725ad0ad9cdffa57564f235e391610b6f4c0b85cd3042ae39f17a6ddb2c34991461c56f98900db119e474710ddd7e1bd4cd7f4bf51503849f939c203d5c4926a8a49a9b27db98ff0af7cfc08251470c8e1cfca16490ef644cfcf3ac63bb3ba27ebeb2e9adfb48b24b3bcd0846f302762ef3212f33f59afe1dabae57a3925317237fe34b501526e451d5b8838cebd1b98b9919cacf9782288a1c3c9ed9c015237244bc855e9b9acf9d8dc9dcab85aed56dd71d3e15be15f12f3ebfb3878638a75e422411834fa08ca6a66e6aec30bccd0bf8e13bfa25303134b16cdc0c04ad579f8d7420728131efb0ac977aee8a4e8a2a79d68281f7d38dc4d13a37a8e1f60ca03b68cf98bcfa6d2e693b349ee2e735385cc0f57e9c0ed023aa8bdd9b4fc12671dfcb50484e8abef81f8f16d1a8c8b5c22ae6e3de1f84e4fca2299995a8d4df7b1d584745d7c48b6a8e153be6c533add27a3231e30fd33e3e6b9c0d52e07320a3085fd89c1f63c031014fc5394e83a08f3bc708f917d780b2ce929f8863a88d1f3f31118ea734bcb166944b7a5541dda35e256fca538b3869d6812819bd8001c3e7e01b0b79181b3d2afd45ecb6707921a0187e407574b7cf6e4ba8875bfc4d5a70b113b7a2143c3fb1afca6c92a5c8e522fbf389f0d0b4aff2c8c0536ee8481a59dc981e78706a2cd1e0831ab5ea239c109fe1f33800d13819e18d6650b494f503831f2b5c6157cc8d5546199b3e6ce12c31771928b550245f4da6f021e905273a3b5ddda9989ba9ce6cd4a45dc904e2965ee6c153412ec0a8923ecc66c320cd9b545af167ed88970e644222a2b13e185c9d4b3ee8cb1fd7430576ab1e1b85c6bee88fb2383d26e0d98d9a7e11faf90593594553d6e3189c6c2bc2d914f83dfa78254425542c421d622fcbae093f537d92c988a95098d41a99eddb7a1d32c987e208dfe7b00b43a400ab217e25ae8045776e34b7dbce26b514ecaf8f257680ae2198e20c72850ad6c28465204fcb80e257ff57beae6f33634afebb99b17fee3f062c240fe35bdbaca5a69bcf6e2465291becb26f0c14184df1ac6e5a26f8a2933b080eb4ea55b6043c820289803d0d304419944ed030afb369c5920ccc29a0e7ffb4b1139f89f88ec9015ac404149f11fcdc0f3a9f715ffaa9b8ef6436d01283ab8013b9f0ebe3e786f60f8c522375dc0782bf7bbf858388392bfc74db7a4f0cc8e75df010a55711f21d1dade7bcbbda59449caef099e098a09b4030e4c0dba0318f4b86fc7204d98a8a334b88b27e7fcf482cc0e4ca1cebbd187d6f05dd218847ccf351ec63eb6f6b1f9f868d094a9631ea45cbdc2a60f99ba6ac6e143a65ee6eaa9403fc8fca1ca966ad68ab38015db26d7e4e9f5e74d56040b2e93bf9f37190c209a376d7cc8556fa8b09d13e73750d8ded46240c00b543ede3cb57218b67ac828f22550b794bb9fb63744bc17328d9f36376a389a1b3452307982f3116c6c68bf4879aa36b438a4a21b281b420196f4751ea447757c85508f1eec1e2d589bcea34bad0b203841db6d6951e5c4920bcbdb5dd7757325572d8ffbd54b6cc5d2fbda5388e58cff66538e72524010b6a6290eab2ae378c96dc0e943bbf62c6a8ed39991814f47036d3f0f7cd692364893765695ada760adb5d6ca39b6ad300ca997214e5f8e56967f477076d13167fee868e0ab5358ce06bed209bbdc07bc492bb5b76fade40fb93a668dd124d2ab607bc8b4d6a69535eb9480211fa1e6a7cd4d106038a0210e9abc610989c9e64676c3d41413028430d9da4031210089ca471b1b277a0eb1ad8d12ef082826ebfcb4b5a1e16b927b7edad88461858d14900f3651d84e3a8d7c4fccc588b73f6d6c66f8d255cb015b8c2d959a27784a7d2af5a118727e9a0026c89a25585fce34dc12ed6d6c5a784a9d3cc55ef0a4d336abb4bce7b68306f056f676fc6e0d920e7332d03efcdbfadbf3b7f4c148fe7a2643eaafbb94fc752fa38bbf3eb178320054318babedcbd6d73a46ed6bd50b63b86c548c0795fa238f7665d06cb17d0b8531a52521b3ad1d31b46cd1f196030fc2b0f2f689b76994dea6694a93464d1362d02086156fbd67c5c33e65c17911411146121855bedd463e6a920317525096988c589961986c01c3182688a8e185d8ed0825e0e4a1de6330a27ca3f9f2edae158fce4aa4c135ecc4724547105513aa32689cde9e41f3d677563c2cd995cc770fdf13aabbbb69e02b0515938a2acca4c04c1829c0724687b73ecde0f0d65b2b1e96ac5f0c91c30c9a5b33a8135f86ad76fcc59b6fcf65b07c91c4b7ebac78b45f11e389165964b092056725cb96334852b0c316313b395b11523890e5928c512703854c18df9e6382312978ebd67ac64eb4702693c986e0d8b2e782d98107f38a0562b24cb93085c50bd21499314cc68811d3f4d6592b1eb64609c4ccdeba5dad78586c8414182ac539d65ec30b32be5a314874e1b236b76894174abedd6b77f5936fffa0ad10a5c9643222b1f6136e2b1ef5cb568f8f01bed431afbcc5e203f0d6711ef2d6ba2fbd75b28b29de3a500dd306262acc0e6f6d6150f0d63b2a3b801c174e7cbf517261092d573871a22156e6b77506293e80d800362e7a00f3ed35efb8c965a883dedebea54294d0f2611a5b44f10903de72053be7f82a613a763c1a8d60f600ee5806f9b27d051ef782d7762000998e9d84e97805fb1ea04f9da49e5d4d06ac3e7de8ca01ed75ce497dc6daa7ef9852e4a345b2c2a66fa05434ddc774a02128236c5e4d389f31ec835267c188ae4828f1bb44921c1287ba2d206eaafdc0df0e44fd46c5a697f969fb6943c192072910100a967e9ef969cb82c983363ca10af9a830ea18d3fa260461e1040cac40a85f347fa8ef4033ab42139830ea6398d0d0c8784a29a54d27cc1f4a9dce28d35293b32682b00084f38e930ac202f5133030c28cddd188c62875a9202c9c8001eca56ac0467d0a0540aa7d09362ac68d4634f62a811b41e7dcf86a52c50220d57eae8070def5c4d93991f40adb31c5891b4054698a4d2abe42a04d5e40dc8e23f0a377c01d5f408c6c54ccfa516c4abb09d7ed68f4f2185961b6dd84a10aebeef6221ff50a70fa800250d30dfafc7c66db00af1246f0ba4e634674c626ce952a226a8c40e28490d83ce2c1882190a2c02287375562d3295d89784e994ea98b06b63061d387fcf4223f8fcc2a34674cf367beaee3d7f5797b36bd99a67773b3919a68d974ffd07fb82a6c86e26b041ac33ba6642f6a5a2bc7711cc79529b440914e55d8f44fa45415369dce3c912655580aad150935864758552e5b06820d624809ac3cd7897f53687d259bf46972c6fc89ec3f9b4e99a653194d22c1c6a8acc26ca0b22a6892b400c40c653029e36b0853c585162da4886ada4a4a1732493fcbf8d965cc0c25d82a62af12ae57afe30838bfe3ab89f5195b01b9ce8d46afeca2362a3663affe41dd04273750fa41dd04ea453e80c41d53f20fea26502ff2e13293ab0eeef9bdedd44f4deb262826496d1dd4454c0ac58cb2438b132aa7a9258e28812186202d84ccc8281903cd2c877a636fcfdbed8a474b7962d3443ab6d3fc41937d727152a6cc1151415491431762da1cb181091cbe0c0115e52283fd5e7f62339a5061d729926ebaa49d7494bf48bae99276d2519a664c3b4de49d1d32155590da18e74c674da5a672cce415f0bfda8fbec71e69ec3afd32df42456db014a40a512e1376dd8a317fefbd146afedc59bf89a24b155074a1854decf6586209544d4d981faccc98a4907ede7edab450c288c630b043432e291447a3b0f320efc540855ddf39229714ea557d7e57e713329b164d7f6d5a3885321b172c487f6b779380fd8563af1f9e7ba3118de50d947009cc341559b3c6898b270ac870860c97304eb520305085f028b351b157092378b96218ef98e23a4a42cc932fcc243931839879051432a020328312b42f5624812aecfa8e29a405c090d1a1062eca04f14206a4b8b2660b106eb08cb9de891ed41168b9c28b530b5b940123769d4e55a10b2081c35412a726c86013bb4ea1aed3a8eb265cbf6067bbae76d57e3982ca5a6b81582d45e2072d72423b332acaa68326940dc9426571f313ca56e6465125ca9734cd771ceda64d1b165afe3a5dbade4b2e9d3dfa20b9d47a94ec0891a91117905a782cb035b9a783286d89e06a92d28795917bdaada5e0b4755656b533dabb4b9fef3105f24370d6f1fef4a15c378dd642369c5a8b1569eaec8a215fb693d5153d7cd94f56b0f9b2afacbe6cdb2cdb4b5b0ad690ce0e3c405e276f1d36832e1093b47e671566b91a6ab1e99dd84db35a2fd6d25a9aa4750a579ab45a92c84db38dad858aa50bc796adb75fa6be4f79bc4f55c8424d226ab34286b747319bbf022fb2f5a2be6dc919387b6ba57269a55e69a595565a69a595565a6975ab855ccad42fa55e69a595565a69a595565a69f58ed24a2b6d06f40a07700ae54ee2645f8117b93da90a35adad8b09d35afc30f9caaadf79a994f3cedaaf54ad46fd2269a1d934eace28d49dd1a73ba34e4d43482da53ba34b570bb994dbed0fa82a04649d4c4d49494545d96cb5a156aba7c7a7b4b496551895aab0f6a929aa1e6dd9b4a7499c8c13038b824b2dd6e2c441860f34aa588b946a0c07554011156bf1c524e6519e20a24d911809b292186eb1c748ac8a465489101c9c8891c06373b390614d9418663112d0d0218667ac8a46193c6d998a91c04b32b17013aba2514745c1a485180974c2c4f0ecb86bb175fc257d7be50b13c8622d7ab045ec8892a0bb8bd49e8ca4a7636c9cd27cdd690acbec407d5c7af8ea447cd9a3044d0f6dfe54bfa26da9f6d4546f40cd9fea1b5075778756855e691a56fdc5a609c949e9e9eb52edab23b17de5a1417d75fba26ab2f28839f387e32ebd33731bf8bef49b7dcfb0cd9f06a3020cc54d06a52c5fb2f7f326839030640303e9d3cae10c73191db6c2f0e74d29055ffad4aa28ed31cdf20029272a4e4db208c309342e484106111fd0d4f0a60c236a704fd42f5e130886016b191c55d840dcbe2b4074b9941652a4ef6e3a4ba28a6f77137c7b5114df7ec215df4e6561682011ab336abe582b5dae008b7073bb7946cd19ecf597a20f7c24a093784d383f6f4ab3c73f6f4a49989c445dfff486a21d746353510dac5b6f2926511d1b8cf9631d29770e4eda818e0c8c5ce9ad5d27b91bcb29055561d6738ba9c886aa426d73a67a97f5c6cac4db2aea30936d94266dd7d5da75e375ba4f38aa72799d5ac8761095b57e9deeb55da7fb842f188be7bdf7de3be7b5a30dc725f2f40040c973d4d1443b2b8c6c7b249728ad9aceb324bf9e3a493dbb7c641904544f1dbb7a6e4ab2a7e18b004e1f1c45e4e9e0ce955c9b44fd9c774e39f10584c315463bf105a4738fce55ce6cb2c7578fb9a549f72ae19b5ee25f61d52da250c7570844df4ef4ed28dcded2446645a2afe2dcc284e95b0c42f4d33ff1554238820f8baf12b8199b2b1340efc61790cef38e1b4df83ee7c617100e3b178eed5461d45def409f17eb620280a1d650d43b8a7ad7dad652b72d199eaca41de08495d6a4a8065626111d9b8bf9d3de4438b5c93cbd342c357fb6a022e27bccb7535cabb0663d0e37b9bcb41a6ec297869fe60fe7458d6bd8463ba8de8ecb9844504ca1fe62c2aa680775eca9f10302ca20031c385eaf19335a4a079a5cbdc44d4ecb4ddfdeca21e79f5b9c74f91277ad72decef425f9b88673ae71639555d8cf985ce237df493d3acc789d16e01cca9fd36e6badadd576df0f07193b52447571818b1921ded88022250725901051a2862f3b5772d95ffacb24ea7f0101c1f1052474d0c1d18885e347e30b08e82b5f8d462b07a9e388fd34cb25d0c415461d0794acc37154651d62ae30eaa0083341aeea3438c25035550b1540298818d5d30661fe4fe5fbafea56961cf9b902e17e019482f896fab2bf7c91e5fe52c4162e5c94b2343942060b381c0993030d424ca1c5a8030d51c7b1267b1502ea14c0a1a17e2ed34984bd558031babf0f8b5fb93a817aa8cabef66c204223c2649d9e7a8bca909aa4159c9e83989629b48aea87472a6b92264da82160867cf1af2906272f4364ff8d25d03711a92f2d139128bb24871779de862cf9d232292d3df5f996a983e62de9e9a95b241d44b34b5a68f230c9a5556a0310c92aac90dfea307fa8db2378e99394946ed8b2770582e75f5df1e038da752050bcfaa95cbd498c572090abeaa0adee7935002d7bdf58e676abd4413dd2a4a50ec2a3cba7059e2539741f59fe3e1ea41ead819af428b4770e7e636954f51fce5b1e1f726999aad0caa914c839967d478d5063abb1a32a2872582c5d65957aea9f98424df250f4608526670c526f999e3a759ad441b718a29e52cbd441f5732c7e58fc92be41ff7a889f7dce8baa1d833439cb70c6945c1ec98e5e074f0f795aa7b059618079a230c309740803056cbe300181335f348961e2a48b2ebe3863848c10244d4c64a4a727a2928af082456cfa340098a7d09cba21298a2ca40c518a21832a4c58c1c5ac4c952936b22c31051a318c5cd962819b35557811449a2732e601c03c8bc03ca7bbe6f439f1fc1b48a976dc2d960db96c91d513e0f2f1a3d54f4bd00ee6778d88eb9dbbf097ae0a8e650ae4473db716ea49a072d656d6e6385c811ff5f6dcfcd0973eded2eb2288e088162f9adeced7c0d0dbeb24c5648b985a0000055255d4ca43fb841647a0a5ace432dfdbd47a9fecc18b6bb95aa762e7dc01debc61f3d8cb233c7ae03ef5403f1d51b05e6f1f51abf5b45c3d3a38f0dbd372eda885b75cfa1f00e3307fc9dd5e7c147d4081da7d586bb313398aefb00553ca611ba9d0621cb20d2d8e809413b9ccd6f3fb1d2dfe9c86b3a97b8e02d7f5e0466cab1038b368b9cce50af53dfffc3ff7404f0bddb217e4d61329f53ea72b1edf58afed61c7b142014435d8616be50009b035459edf8222b76cd9628c318d1772254dd8e036062a561d08d7d96a5d9129934ca9ab8500798ce41e0f481fa010891b0c696e309479fa27f014c9a525eb0d02bc3836abe7d94e2877ed1dfdae1367ac1b5763b2ab0a85de6a2e746eb55a3908edab951fbd27862bb1ecc250fc1cf4a23efa6e85fe6ff46c9374d5d129ee9e40a431dc41378b2eba9a74b1a0b87868c8399e1dfbe79d6f364cfdbc2d95f902fcbc2d397997e77849821e3ab52b1e20cef812013b8e83801dc78fde134ba3f79c25aefce83d7185fed548b9a01a805e412faaa1689bfcc610fc7193dfe8238d92a953ceace6868033366badac21f2bc5ce77d843dec796e048e1e38aefc288647ccf2a398e7b30ab11c08e8acd168886ffc4620a0b39c351a81e351cc0bc559419086a018760b63aeeb3a0e7b1e65003931b6b8c72649ce894dc019febc5fac6c7e4965162997f9c3495455a05f65654df3ed354dad92512ba36e386861d16582214edd90cec9bf7ede64b75ffdbcc9a87801821c38c9d44bfa2f22ac8a02b069cf6943e7a777dcb5239d44768573c5096b9c6fafaf21eef3a759dff5415bab1a106c9b26fb3439451a0fd24b45f1c17959d5bb667b6bd33b2fcbbe42e8923a68ad9d1546af7bf68eb8c226753599265b5bc7b906042f11b0bbbb5e2f6abb33d65b1fc499f58e19a4e012c9d45d44ea1160ad5583202cc5f124e3789229b66a32755793d4aaa9b5d66aeb9c3f15066bb9ea9db5d6a78e41340082eb30c6def77918880e7bd85b92a92fa11db73a733def068238b4ab5df1e8b0e77d383838383820d8dd79ce89f3d5964c07c0943c6d48c76e1a34582c9c9c73727466b45a3468ececd4a8e1e25c2ed775b97466b45a04e1aad5e4eceeee6edad5ba5c5c721d694c4aa3eb462312b05a3834728dae5123d3c8d9d199c1c35379789a6787c7468d1a2e170f8f0d1baf574f8f8d232cb0c0e5e2e1b161e3f5eae9b971a3027751aca2288a3caf1b53b4312758e3e5ea693ac5320ca758ce3274e29e5508f6f1fcc93c5a20d01b2b117a2ab8114ed102718a2d529167883cdd330f71ec918ee3e458e5118eaf78547babdfee7e6f52145720d01f71b47c702e58f1e021f75831c00083c600038a010e1f9f0b2ec000030000802461301f9ff0020c2806175c70c1aa477ddc2406380058f198244952cb2a8fdeeac8a03320613932d0f113000d6030b771448e1b15e4c86181e7c89143b49123074f8e1c3910f0049c3e6537d563ceb9ea7342614067073e968a85157c024a28556295dc6b6f951f943851a244c90f4abc900b9076b597ebb0f781d97b8ae2643b88d29ca9439fe85393e410d608671582d599c119e1ac58a84262ada84ca6449398e8aa099d5127b46946ebae1084aa4523b4368526fde9538555e004fa54b9d14ff09d59e3031f50d3ca97f4a9898f264510306146d5982eaa0368a84b2ad2a7096b9ff469feb40f4fbf5a611cf6ac70136ff2603594c4655746ee19265f027d5d78c8210c1e96b00d3cb8e041c91e1b1d3288a66bca393f6f3b48755576884a92c19fb71db65c2b72f7f3b683137709679e1da6c8b003c6c9b543132334a26aec704391d6174d3b3b1099c145158d3274b8806a4d19c931f38587193033b21534642f643a5b9470c8d072aacc5864aa32122356535138487e500ac3d458488ec8008ea9ad9008b9e11b330bab62f0cad0c02f64c065aabe2a96ba2fa83c1da248e26878892297c798aa8e08cba38b280e08df74c081a9020d01713024a65661938d0e5e4c7571248c4c8a225349196797fb04c1d4420e37844866f8a0b2fd796b81880e2d94200d1bcf4cc63f6fb2344964ba3799fb799381c9f1f386a4830cdb4c3fd3263698db427de8c81a0f7a66021c17b63ca9820a9a11555ac43e31d4acd12266e9a685ca7220f29ddb0e2200eea6ac055f86f8cb11a44c935062662af3bcad8e99baf8ea9389962718247670e2c5912a605035fd5147af54a635294678ada724565d0e31be9db34864796b2d0dbaf6891b0e4ebedde205d850440f3330863c01e648072e45543de1c54c0b266254cb116f306daa42ae3a96f85d549e522b6463d4863718f99ee27683986f6fa32444603123c614267a8895407f5402284c9c481195248d1431eb449b2a8c42612d0740e4d2f5d4862a1b5ffb9ac210739cb7ac58027d99c2f7e4791e7ec2584a14294f2ad815ec6d9380f943adcb8531e71dc7715d11c7dd3b663cb1d892e8eecef3075b970b634a622c86b8c3d8e5c263d8e4ed2a57dd76d71f4d7626ad65e1337eef3bccd7aa30b71c3d1b10637a2fe62847db67938dc50df2d4a7c8f3445ec1da2d6c6da7d57a75b9aeb52bdcc775cec979d789a11583a3fc3def9bdefc3c07c1e779dff8dee8d7ef987b2fcf13fb1a81c66685e1eb9605f5d15e2194f46fcedff115c2ebfad101b0c8657ef1ad78002c72b64edf73ed909b73dc643ff7b9b5e1fd3e90e33eeea3d6fa5c71debd4e29a597f3aeabb6e370bd9e42ebef1820772fa594de79c5ae78cc2fa7014a4c2cec7db5fe24bb56ad17f54f215a5368bd4bd934e074ea2cccc98685eeb6b68ecd8325cf7176e5fc35028d814e82377ab649908566aab0aeaa304a65733611965c52aa3473a6d0c2d55961e4f6924e551a9e3af54a25f593ce3a2e67720f793afd79abe10bf8c5f54d864cf51c5bafe23ae6d872e7ab3ab2c64cd724eadcce4934bfdd7610eb4bb6dcb59575e7cf12997a6941e0f9cee7aaa8b995083c970148e09c44b98b5c7fde6ab8f2f4f5f356c30f4f6f46da3c9d44f4a7f28d9fb71a863c75d04edb3aac72856f4702169169fcbc19990a9b6e46aef8c2c8383f6f46a0f812e8399b9126b82319ffbc199992c5885308469a3a2336b860ab2a6c3ebe191162e44b54191c6660923ec8e2a98897d9075f6638bb3e29c21872eba7adcb097ca8613039fc69eb12054ceaf203909bccfdb475a1dd3519ffb47561eac2051408ded6a16300b64cb9cbd93b76d3f9a50169577bb9ee76d872433a3de9bd5c7fb5d1cd9a0745385f347f9432f6a2cc793769b3ee5874e924b245f6032957648b662d6872459368aec6507fb092187c00fe08e357f8ac3ffa1b08d6db6edb2da8a48e9f6a32755c0730459e60141014490cbe7ce9f070f90adffb79391a05ed7a391c2ee7e4ac42cf177b393a2c0f8360f819e5f0e4501d5bf18c165edd7beff57eb0d6c85aeb27f88c704ea256888d66a536ccad496367de11a8d67a2779af570faf4210c15bafb61bc91b827d9006a79382aef676d803c3152be7e8cc6871393a198705b6685cf05bb13e70b56285e02a041aa1fd39a708eef8941c08b9b5e08a87b53dfa819e64ea259038497bc103ec775d2520d6c01d74bd0fd049895a1d040484b1cf0e14bf495a67a9f089dc24ade35508f63f0f80dea4cdf2c63b7fac736f43f0d5297939ced2f20d24d5e39f4075a8d6fad28326bd61d469d862f53b6ab8af970dbef4f99b82bf6eef9d1df177a6c4df2234fc2577bc156ae9a00187afd5290ec0522e7d92f516c994eaed09a82b7938d7384245cfd731bed67a9be1881b0d31bc94255fbb7c75d5315febd7f925c6b14bc34a6e35e532db5a6bad53cf29a0b35e8680e9abdb9ea1459e5e5ada385e6ce87f3e055b4c64cfa9635c2f96efa6ac03fcbeeff3a20eaa53dfae03482a5faf07d04f77555c5723dc18e89ef83deebaaeeb3aaeefd48ebf23074dced022d7f9d362604bbb30c41dc518638c31c63e5b52e48e661d878e3d8c31c61893d83db143d2248e558b31c618638c31b621c61863c718638cb167b177d829c68e31c6187b517352185f7c1dfb2d3389e863171edf368fd53c2eaf99c71f0631873bdce10e77b8eb3a6adf7a8e3dec55d0ab18638cdbd2ae2bae5804ef55fde8abe747ef618c1d638cb1cf954e984cbda871a8c30eedbb16027d724e5403912bd3b08ef538d87061a61037ab30309388ce999aef9c93eaa0dcd4e63b8ee93b2f3933ef2d297247eb40e79c3a24524e524e524e52ddec85fde83b9ad821a1617550a4312cd2073ba62ac44d7533927477b9a46295841a03474e6ac6986c43742173b3ce3b9cbbd9779cd4fc996ab2f31639304eb4036e8ba941e75d17f3a7f33a969c11df2935d9cd9aec92e64fc74935d93927726048b831aeaac23a2f6a28b924af540795e1649844d6bb0be6bb3bf5ddf5fb54712ddb2e140876d851a0cc9feea9619d73454c0d3a9fe5517fb5b80a618c39ceb92823e7347f3aaf6048ae5f724edf757b1ffdabe3a4bef3ce39aaceb9aace39a9ceb9a9cea74f37a2b04303afbc2a1892bbe3bcc4f9673786b38c43da5b07977830bd0d95265152380b973a68f244c9ed208da95c825358defa16aa29de7a0956bd05b378eb65287bf0cafcb1427275100467f3c7963d5c5215ba9cac0a716e5df44255a13b5561d6f385d2f2654f395585423a96b88e535c8c1bc3a40ab351d93a277bebe0ac83acdb57ed2a81d30714c9e490c729f7bd4e238020061b5718b5549a9cd6e23c35393d478c4cb3b5384d15268034158c1ab6468ddab4c6a481591df8866a727ad300dc5001ed30e4192297df0c841bcf39c679c2a182d3548540c771faf9cd683fdd46c7686c257a1396b301cfc18ae74f38c93b59c0f61abdb538b349d4792d594d7c75560b4d91af1e8269a19dd56c124975d0ddb129d556484f014a3a4c2d206c058724394043401c0c5555d86ca24d0e4f4d7c5122d54492a9267ad0a1879359132f20e91144546d8a87592d8b921e4c6a352190f47822abd1d003081a1354497a08c1c48417244e4c3cf9e1072626663cf46892b484191f7a34412d21450f2292968092a4c710b52578b0a1c70f511690f1995962081a2c5730b18291a812442dd7f879ab5203b843ce3f6f55844c41050dc84576fdbc51b1020c93777edea89800f6f326a40440736ac80534b33502e420c242c7942f572421e596c419258e7cbb2bd1e5db492a4fbe9d0544c42cc3a7a80ca608e1d1b9bb6d7737162abe6b7c7777dbaeb466f252a85a6bf5a15a5d5f6badf556ebde8a87a5378b071554504e305192445923fb763fc2f6ed24100ddf3ea4c3b7174939f3ed3e64f8f61f48487dbb0948b8795ae2dbf154186043b1e1e7db718662e5db3b9719b0c70818bedb7136e2886f774121f2ed9c47d1f2ddf3dddd5dfb5a2fa8db5a3d3e3a3870eaa20826be3dbb9c041a9a028b299e54f17d23028ad30cdf5e5d59a868c289986f2b86c84f6ea0c20b21664c641922848c7aa6c9962db60083e444ac3bd60e81eee6f22dc5f6ddddddb5db2e4181401d423cd1e0dbf14d882cbedde544866f274cdf3b687c9e76d4291b30ac6095d42485f2d2dde83ab1a1a29c9a6c6d914bdb64422593cba64175108ef338f59ad4412ea75e953aa88653afb30eda71ead5cbf662c3cb7e6aa15e6a18f5eab9a3b0e92f9fbf9c7aee4ad3653aa586cd1b5eda3975dcda3aa82d15ebc546b135abc542d928fb45e7c68d1b376e2c9165707ec397540025b7acca396fd5903ba90a59a60af5d371ecebb88d1cef115f3a3e7f86bfc4dcf3f9aba7e7250446d14269eddbd6506ba27ccfebfbbeefebe1b9a5916e72699b9c74d08d717ce1f87c9673ce8d2f1cb78fe3158c2fec368a6d7212456c21db70f1153afdd03bf115fafc9583363cdc71def9c7b9df70cee7c4d3e7c60ddb5485ba671ccbdcb429af690ce0fcba0df125c24b041bceb90d9f8fbd3cc51d2796aee7388ee344ec9fc80112ccef460ad524f52bb6272aefa449eaf474c90c5a9e5f36ed8e1b2c61aa2dc04c619104161bde1c1d51c4cb9b29aa195c78a1913ac8c668937844faa549eaae1a228da24e43a4524db644ebd4a4689b66e8e4ecb065d13ac16189d649004956a275b24da0689d8469a27e65c8b752d95af5d37150e54c6697a5fa89e3a8025a011617b64048b4806343288268b3c157e7ac0842c9971eb27738b3f8b2d5748287358d01c495af6e5d6148254cadb5d69a66e08c5475f10515628eb450012b7c8061cd0b61242113731f55080aca542b57a11e1c40e8e8a01ec7e2cbf0bbf58316dfed38e9bb4917df9d1820cd62cbb4049972c09f03f97bece100fb0f54beb44e6523f9a70ea25c144fdd3a75d0bcfde0e4a9db281dd4964a8d7350fc5ae5e53c6793789e73ca83a3ff812429688640419b3350130b1750506dda2c29a18109893775906d2591973c5d8239cec5f992a55698bce472e55ca92a8c7ac7d4a4a565c91c12b7b419497269975e7883256c31b57df7dc73cf7de765d33a913e155500c6e4924ecdf879fb41cb736e83eaa967a6550c2f64fca5fdd9654a565d10c3e64beb54855ed46d53157a753e63d9b5815276d22b5515b2454c18f529b5aa0999bd3da5aa423356ab6449d57730e97eeaee26ff2abeb0d36ccddaac937d1a81c63ca72b8ec3188f25779b9aa46ead9397911b49cf3c20cfa9d353b7316fb43658279d2ba0b5d65a2027c5d43acec338bbfcfaf5f943eb12e844d6f97963f284cff8d34685915a657fc84e239ed28692c96436c4a8630ad69e027ce953ea809a57707c39bdd0a83ed3cc3a4bba84842ee1a1ca572a6a48c2c357f72468be3a497bf2d5815af8ea43455cbeba0fa9af372527d4f0d531d0f4b587325f9d851dbe3a952529f93a6f3ea8f9db122d4c96d04aef121d237a906244c89212c862659e630081e6c815538ac8a214e39098c2aab576d84161fe1a5544919cd0da1c05524f5345357f5c9cc861f1871b55108b9cf86af7fc286634e2d167e5381e3f5c3c5fb21df3fca977c63a2bb618eba80a7392a9d7cacd86aa10c9625d299637618d97ea4a35c8e17e7a2ce60ac3ce89779657e227be383f8ad55a85610fc51737fe40727a18f6a318fe516138f43c6cf7da71518561ffbed108a8c2b0371af568e41586cbeae43e63d8df8b1cfbb0c78d27348931506118fb8e25d95faada2a764f64a1c2308b8cfc02e27963afb50e7a9130634898265518f6d7ebc7e724ccd83796f079936fa44c1586bd5ea11dd0c76e67d5a93e592b846c01159b315a0417225c28d354d2a46bab305c9d1e4f6e46bb636381e69c33db19446bd580cabdd67b1b020f54e6cffc1078883261b6b2013b077b462711920e6aaf0e04f4dd532b0890d4b1d3247be20e917c456fd64526ac03c1731d4d768f9dcec4fed50972d9b39ec9963aa60e2a3b29a98356de792b7550e81d8d6a59077d47b1ee7581e0788e5fcf198d86b823909c1c37b28ee347b1ce7d96e49ecd1f1f213247bbf3ea0b4a9e0124432ed341ed9dd3a91cef9c4a51aacebb889129d413369b442c2722dab123478e71b4614347e7fbebe5c7ead9fce97c2536ad6715d67928760e8a9de3889de74ce99cd2a80efa1ce72794bcf3f339b8923d24589783875cd2272135f9ebfc13a95293484d76ae817923237b6f7cb97a5ce0cf263b7f79939d774eeba69e351394fc7d093963d5778ee32504a9b0ce338e7f7e4215cade395dbd46c8711cf7dcc8fa3796de0804c7f368541d673ca1c23a27754c22cfbb185e85fb2adc177b69fe7478ec2f72775032fe699d049a8412336272a0c02f6aadb596b5d64a6b596bf5a1b83b8b2d67efad96abb5eb5cab75d55abd6abf4c8476b59ebd1f8729f6728e934eb69debbaae92ee6eb177bdcf7e6005c3feaa0bc8dded6857acc9fa3e967b0d24c2416afb030a369d2358dbc75a7beff5796e7cae0ba968829f569e3e948f0f7048451c3f3e7d0ad4e4f49256b7966c4781bb0e02ce73ac4c667dfeab8e3f7ea88e14f470e7794f14cfd25a6bdbed74ebd65afba5b5d6da6bedad160710d65a6bf1dbd9852f25ec64a3575e3164ea969614480710a4d31010955acb82bad5bae5c6177f7e0351afada3ac1cc78de4cc2126cf2d4d66efeaa0b98589ecdb7bb6d0927ec67e7c3e1f48cb62603bcec162128e7dee89482f0cc5be117b128e81a3d77d62d250cc7350447a01c73c4f1a8a7d380cc32b965d8ed3cacf267e7e69bd7ef0bdd7711e08769cce0cb1b438de8e5927b43a1e86f2f101d80a3dc79d7b22de0919d07d07709e738b0237e2ce41803ddb6e058476ab971d7fe0b11b872a8cfb5b7d9aac628d708ae57d1e3ccb23a0db3948559490552e8e13254a94fca084d2a2daa8144d96a5412b95b2190000080315003028100c088522814024ce54552c1f14000c7a98407852990b846912c328c818638c318010620c010680d010d94428106a4a255c887fb0cf0ebb545c860ad3a8aa843968fa20f1c07730e5307ae4c04f208fee18cb16180ab9287cbcdf58368678dc43e092447eaed8450afddc60d9ae429f5825d5c02589fcfcb12b209d4f3da258e9fa248c5ca1e8cf12eb6d81965c97448ae4f513eac9fd837b04daf30a2e0974dbc548562469e446e390fab418ce0aa6e4e1553b57c4f6aa696926836b6d05ba2a33eb6c617115c6026c29bb15ff0e979a982d7e90c9f70af49303c2586a564ef49c551cfa9fe68dafc222f1b76181cff814823d4c30516847349e3dae3255344535835ebae7b68af8d41b277808e440ff283af4ef2455d34415bbfbcc453fe8f69d50e21c255577038dd0bef298b7816359a68e2f486a03e8fa97070bdc93e4fabc1fa5ae26cfa9b4605ce446bd51d58d9439484a8029b1a2cdf7a23574d7b9f09a194cd8fd14de73357d9a3abc9bbd46026a184474d88f156467b4b4cbb4d2224259e1388fb1f12b151a14d200aa1caacddec06b719ed16bf8a2f75bf8e0b386a27ae21cb13ceec03365bc6a4a9fab2ebb64e9473c069bca99472ce7057d7631d517e61191c6a3362ae0cf42b32a327f188025f22b5e716d11397b16e2bfa5798db03c2405ae5afabd44a732ed2849e42ead75e5579ff675edfe7abdbc80c8190919972d1b52ab098451968cd5fa6812f19a9596dc2f2c420853140a8b942203eed13bfb58399636335d215c79aa020c2d8efb35596918a2367aeb896ee71f492bf491d5ec67ba1ff0a6758883e41cf7be05ccc2eeb1a7e185b395127d1996c1cbeff998f0a1c0fa5617d9782cf1de44cda76c7e75bc586f650f2638e10ac9aa5a2b026328cd0f7729b0b84e356a644688d01b3ab8fbc3201bacd876aee39cf1c23211bcfd7e06677cd1bd35f038b11ed42144254fed530378b117c14d05a65b070f15a8c0872bdbd1b8d8a0412fb4fcf6d75d855c92b1d51f72110d854e16e426d05a7bfd878dc8ceced32ffd39c4aca5bad1774880213f695bd0aa8a2f2f9ce8e2e0500ded7e1d0580de6d619a8fd25102550876156951909e3c2e40c4f072d3a2842dac57bcb833e36e87d1bd95e2544df25c25b2e0ea02b38abe31fa0933758d2ec5959c0136b658ea36ee29498b7d266976f92e7d0c00636e2835672f36b2bbb190a2fac46be3289d22fcd4b251a5218845eb8f9388e69c9a20c439de733711c3587d194884902e5ad0af330e52132c7df40548fd36e294cece5932a939daebbee47f2ac3d26cc925182afa87de7385813daa1a5047cf070726ab44e009263b42c11cf98bf443e7e418574b65d1c4e77cedfa31fd3bd706149c4d951559aba57b591a3cda9de7e8205e89c31ca4a3b3c4952e844b43a8e0f3f7f8bf1700efb599e150a786cdba8e72ced6d3e7816e5a614536c0a1eec344cfe6d6000a8a313c7beed013a2f8d7209a1d0dd5d1b98f5c9fd8943ed5bf602533cdee82c44408d1e8ec5bc2ea3084ef613e9f743aa6bb2bfbfd1acb3f5493b8b308b22ec721392a83ed725186a06c66f3b451dd3558a8c81016e18275a4405883f432b5726b32d20af3f43e93915f9220c81ba258ddf7c5eaa38a7ba26a549cc643f6034674d7b3323693d265a83a885a6f784b5eb801ebd8db6f4cce00c8281af8f81a5f6f2f0984b15fb695053bd6d8a205e3b02c138fee08db5035f1627302d60962008252daa3274bba62890f0be715705d9da047d9471a3375a005930e7a303425e608bd6557dc41270295a06882fb0eb2a03c68b658ac4a3bda0814c1f54d85e59b84b6e2e08874e126a54ce0cc887405f13da70aa9e4895ab8be435a5d83a39695dde913c5ea226304b591f75d1b00fd1380e3585fc6d201e072e724ea1cd4c1c6435d9c7a86e02b13c0f08ec1141e277b3cb4b4cb50f832c2c439e975f408f33afa9afde3d528ef3ab631859997ca145220de0c3ed0060c4afd6c97ce9f491ffe3adeed84b99fdc4ed02773c55265a36a09536ae808d6f55053211357bc01bd3887bb215617f9dd6eb0cfd96ec8f6e216abdd10308a9664fd54d6d0f29c6bbeb34bc24074f72494a9cdb3620be99d176d073ddf79c78202058b11303a8743573c365ca5af9bd0c85e4ecfe19dab1aca1d11ef8cc7c43bc79de29de5f51406c51b5daf096c26264e7f32a311bcd00cbc6183b25a8c2de26059438ad2d09e0f4399279877525d37d5b6009f66c16b6804c2e2db79c4e8dd2052d48a4b2a4b5646a44ac5179d045f3f7572dd0b7641d7626e18c4ada231762935923b64759287f892aa5895066d6b63045547c531b0b923268f6d9847c78166c4a6cb8f529ea6804ed1cd960207072d850a13424eb0845526573cca80cbb68e18d0175ccbf3ff8cc980f857b4ac754ff9f200e081526538991d42c42adeb26cb71aa8ba76d1de9288412c6b99d48e305ddfce5af619d60a074b19697dfd50dccb86f245032c01257a31ffe4088a84611f2ef6063a5f5a9b4b5720b8910ab7de49a0989f46dd4396c95101db1401175b8ae5658551b9f295a1f8ad298fcaef33f4e63ead7e1c6232baf748be38632bc32379af2393910ed96aef68e7eb62de52f8d67ba086388dbbbabe5c385827604b3b81e9845f396365c28c75aa6bfac805826fae06ee67fd87e356607db2f90e5eb562997fb0c24a63913a6d8b32f2dc1ce135640d024e2a5aad6d96191f1110f9cc3fc6cfa832b2f3a44a206bb8e14dd8a03065e5e444c673c3ba8eeccb9e6a712ed8c0a105690f344077dddc4dc55f7bb09360d13fe63e833c995b588e756e0121099e0703bd1b3038d3e0d7507bdd2bb86541d9bedbf33f773be7a18f12a6030d5a07a2fbd9d923df4ccdfc740e5cc27341f539803a8ed52a93278ca02f98a3420b825adeaaa6e1935c1685690c2c5bbc88076fa66813d970e4512f10f3b7dc4f3f0e76c2dcafc8d5c20de3ec9a3e118dc76192c0350b4a600f1f8fd5116ef14ddc52fd38db8c6b744bf3bcc9533a6f76064497e960c715f1c841edec7b15d82f641e1dc4ea3a0771a1d4023fd016aac9f189a5ca8829d15eb4f2529fb59784b31b8cca083a249ae1e4a304d41570cd47852a375f1e4185d08d9a6f392ba1922fa9a78a330fd44fd2b53b25c0c1918fd85268da0011b74239650694d3e401770bde933349642206bc41ae7ed5501549d6af20887f301b3c9d9bf0f978f0da9bfe4b0329a4f4a6164eaa1ec7d2f340ef50cd5b0c56057f89d1f38092c8c40bb848d3722ca1dc4414bf21932872906824161ef65019a30c2ddbe1236cce7c9541c409508efb9bf1131b065643314212e9595a04c0f720e603c3153e6df4ae8dfbb1c0f7e61edcafdbd7def87547118eb414fb341ceb68ea6572b907c9f8753400454e4bec2a4a89a72dd70825eedc4062f3a990187785189b291c24de61c4a52894268c0a286a166851ea96cf602c6697e72c3a42d0413a459e2bf90d7bfd35a8654fc87c724eb17f5a8331e02c92c45ced17092deb6a757d1b7e172ad71ffb87c62a5f2193099900369c2e78db59c1b870a8f818d16600091a66b0e28d612bc32b2d710a23b8d744df730a8e5038acaa235b9b74678e7ae364d7202c2acc8d2cf7da5f0af7aa498d2bd04c618e621683a3c3a9be0893414e94c9e065326979776fb81f36e0c3af613951e8225c34e2011fd3c411d4c3b4ce9776579b1a9788a24b095a5712548246d7a0c13a722e0a4a80efab9e0d5d23560c43e7c3c1869cc14217c555c10603ba826b026dd8cc66faa70828b5318371213e878b4f49cb291641251a7083f2d855690852c8b8c905ea85dd1514e31bcf12848135c36e69a111dd3f6fd8f776678563ceb71367a8bbfde26685ba1ce83177ea59dc76b535c82a1e93d4e7dd2f576945b5224fa4f22912d79eb94189c628b71cd96169890734507ac7e865eb0392374d2eaff0070dadf123cec2dcef5334c9c16eb9fc161f53f92a2bebe2ff27749c06e27da799aa9a18061ff02ea69e1c0ead2cded3f700467ce2e49894eaf995112668d988ebceb20435101faf5329be16def2516afdbfc3b0f9a1d7cb393b1a1067aec5585b00a070ed91084bda79ec10812d7dba19a924761c08b3d748422dc961d53268f4bd887a17bc6f9fd572836bc2c54b58e4eae4b1b0feb996a0ed1f7691e1a0ebfd5c9139ccaf7f185033d382715b0dd66f5240c3a751da1dcfbe12da78be81c00b86f0b89f73f2f5dc9a04c25f830553eb8e0954e6aada2dc1b8ad7cab2e157d71b46171eb3b664657519c67dd2196aff766caab64fc788e580606b93ebc5832ef29076d78223f9ba48e0b519e4187f3a4ac124b5c4b7631a9238f7731901799e7e56dcf1317e48cd826307ae254b3d9aafce3ec7e6b3b13f75e110e302a43a6ed8b9992ef1844f34e5c42d7df322dd7af62c439fea08592753218b22a2b5173bac46956aacdfa14efea3f14bb8df39bd1a814ceef2d3bf4cd0f5b05b672f39f90212a2780e754eb6cac5eeddbf46f21bdb75f46c1905ebea3c3084c5fe41802dbe1897bbcc17c1113fe4e351be7069b19074c8da9943768530259f8c21e2f31c23fdc3c09a5d380654a7c00a5624976f62309efe2e1903188b2a30cc19f9a8c7803ca4cd2314b89435022f750701bb4dc010d4189645af599b9980a80c87f4a83fe230c98b5d6c4ba02a92ed6dbd51abea17c0f8dba0b78fbb11befc3d0b18b2dff8b995d7ea498cf398e1c002a80d148977b0612e4a0cf76671404a05ff0bbf1dacb2453eebec041662b2671d3dd19d15220633149699a0dc78ad5c78594d3d5638eab996734f358060099eac2890d8daad07e92a96599548da104bade2f92a62efab17c4d802ecec47a50d74f056d3fc7e48ed4b217c878624df6ba54985829ef36ecfe2811296d8c29dc806193b52cdbd6e675d4cc6fcff5f1f62e244dc70767e1fea5559c57ea569b4fc168f051e0ff7856beb4c4dce5ffa8ec33b10312d4e14c1b57120768336719e4d9376e055cba2405dc9909d2c2fede9749bbe4c6cd551c622533cdc47afd68761451cffd612521ae5668e56c7cd326efd367499667899b4202c5e0d48859a9a8d358cdb7bb6140427f1443e4c60beaa5e58ba1e6c67e6546ebd7ea9191710f4c8ed47eadde5f954cebf83a2dd8942d0573823c2a2f8c364741cb848eeb6876d6c787a5ef3fbe849a5d4f1647e8f1de6e5e4359382ccec07d1a98799a6e4aacc8bad91d9ecc60a6f0b543139c74dc8e272495118bffdb6371dd6c256859b092b282609ebbdeb18ae3044e593a9fd2d29b278c8569536999f6f0e8d6c45c46433d906daa315d7d30be1692d0a2f81ae0d18cd8d7937adc8c4d62a35eb32a665564f73f3b99bd803f88ba497ea4e1354194eac2241617b82de3c7d948898e106bfef06b91410db91162806291c080f215c99d4ba5007f5c6d4d9d6ccf2bc16cc465607b51acdd096b8abfe654df22568daf7e29486c8aa80eae8c6e13b809b6df11311f4cfdd282640ad37baea58fcafbd106e20990b2497888892d34f6808382f11b465bc013b025d16f7f6e65942c80bc8e98d744bfe9e547fa996038dc5aced740b0b6c7004550c494f104779c1c116e59688724231acce1d5bb87042847faa62deac005ecaa153e815c263946bf6a22c41c98d4ed0e34b0f731b08557cd315d8950d62f933da82c95a46fb67bd95d43723ed792c21c0fc09b584d05a2f629dc8a54bd279af7057ad5e3bef80d86ce24091431b9a51707d639509632958ec9368dd93ffc562e00dc9a0f30e0246041f85311d28848fd41c162f3b93ec8c1f473b42991c8e117b87cc259725422a7e84eef33bce0f213ded72ee3e8df65723f163f277f52f4afe03c7773149058d73600d2b279c9f0a1b5866a70ae7f1740f363e5567aec7ca74d83f85ac3216cfadd6b73f4e53533354148831dbdf724be86d1bb2c8c49d59d8d4036b7f61c6ff42578220ac589abf7876bd32025d0e2ac0bfd2406c8ec8c5a81a9d13fcc296d7b1d55ccc5b671eaa9f4eff66b0ed6049055c736f5ffed5e0800b1e7728a96fa2d7db19885972a43d8ee17280d6d531308640f2ea35a66e66895494ff719f03b676a5d406ad3017d177c253c576cd16784a475e7f84e74fddd17414758195a1e75e21c0ff0ff0f1c41bb83f1b0ebacc36ddcc1725353a062a1efb093d862ef035a6d56f2f489280f86932dc81dfd4670c35612eb263c97351f1b8a9b50be7b293f8adf07e3c4549b8fcba031d9060b966c52d6ef19f126509e587f808d6bdf208f2444cf0553605097420a70f3def96992806eebf3e4bd063d5c4ff88aa58be2be3598dbb20fb88a4b7650aeec982a6dde9554d08542522989a450c4ae002047d78ceb4ffcdb10b930ad76746b0d105838e44bfc167fcc757285d29b0d41af7b117705c5bc0ac18f79a0cc03081616df43d80ddefbcddca7a29fc0f382c6988cb9f91e28821044f456ddb18755f3b6946a7f5b485ed6e01f4365983c3c8331d3970be5897b52f8c56490c4a3f313013e71338f9b82d56e58246b69dc8a1e76b36d4387769ce01f5bce79c5e3991c4550051dafbc81773cfec5f17a5b10b6a2e467cd51ab72954bffc76194bc896a40449a6dd018d0e7b94ac835233a3f222b9ae0827140e66ccdd723b19b0d0c1a69885549d2543a424e017c63227121fc5fc82bcf42451f0828fb44a59e25fdd4164779b76d41b997ebb4c4f526b84a34b7bf36aaba28be9cf529dde84fc85a6e0c8251830ae74b903579368182263d446a1cab81e33a45c585651b90d6e77c5526679ff4adba319535d53327b667fc272f2d5442100357da7d6ebf2a3623f059b0812abd98b4d3c713085e6bab22759ac683af9789b8cef20dc7d0ae9d457dde0c667b6e093570899c1b58498e8924751074b7002f2c04f8aa6974c427f2af4f2b6c5ef2aaaaf7d2f04cfa1b6cce7f8f834d7a694a6c3be7372171f18fb973778ec37c2673613adec0811a74fdfd78bd683c81148b1728d6e040a6b909921d36a2420a45402d62fe372bc2eda5527a5e661115d93f8f88527fe6f0ca5a2eba062c1d5d1aff6f001cb05493dafbca39ad28ab50f96442645d424afa3e6ca88af0e5ae403351ab36fa1c1d4413810b491479bd2d28d4e5cd31ac3b1ecb9c6269704af944c8e198f26b336d9108b7edd904c26fca24a908f16f068308dd884261835805ddea978e68adb3850b3c66e5cab0fb422ff3035dbb12ffa1b88480aeae302fecb7d2f92847389a90cf1f6b27af76aa09ebe627ed56633273b9feb945ab049c8004214658834c0e6dfbdb15b55242b7822da763083025fe30bf92709873df1139e1d4579206539ac0a9a9b9eb9905688346f18804c57aa5773ca4ebefe8a996e9a0a6bbe84c83d013e4fbd2d1109a30bf9000fcca8a258a707c7ab56c24698fedb5a12e0cea2db19ac57f9af9e3f5eb2e269a5d5a813913b922a3426312cee950bff0b8a0109e7f3656f315c3711581f0bd2723888e55a9ba6a0c599c184bf89af7685270e72b3ab38b8ce5508a85d4f78fca8558c4718ede1e6e797648dbeca36c68f6824d5c0a01430201bbd570dbeade7a3ed7c61f1ce384aa39997369aa1d769338b88e05fdd0fca7f87598b85141eaf38eb76607d9635c79b0432eb45ed969b5042e5c4e325c7543e7ee24ff5498c40a1f8b43a9baa87c9a9c67667c731b8958f606a98dd6c2b687c980f3341a74cb85de1711ae954e2cbf26bacb09b7e6270e0ee1d183107e55c436a689f62f6f5c8987c944d0ae53b7ec722e93c4aeb3ca0c7c504ba7c9947c2ccb3a5a5819983281d0ec5626f3b854bb94fdeee735915a3b6d36cc4d27a78e9e896926e8b29396397d22b78e7726e699a8d38e5a36664daf76076a264c4d21b74e9e894926e8b0d36562d2446aecb0b93037a59c3addb99805d3cd62ed28815ed2c4dce469d1590a5e2922dfa74d9d4805797754679a269157ac82e97af9b9f638332813ebd5adeac45864963a27eca43bfbd99c2674104be95f1bc7b985c1942297171cfd37757b13b30bd846a186fe146e11d96f86689e41731ea129ec05f28ca8fefaf02b422b41c7b63ff212d4e8f035d715d0c067ae18a74584eb641840dc0786553319404d7165b00423f939adc327a2d3a10249237b7c446e45db03cc0b43d486eb4494c908f7114151163655185ba17f446e652e44d21968f5d02b6142ce2b3e0a29a2a3c926cf65d0190123737ca396a22f30e2bfc7e1ba8c8cc4eda0962e6c9550b0219d14d52ce07a6f583d71e72cdf5ac84c37a205ec55d4ec27d62257786844bea5ce5a2a5ae1b94dfba998a9474fe838e547aefcd2098d03437c8ffc9dfdd2f64fda2495cd86a060e9b17fc3ccee8ade3e52e8c0557811eaef249fa9e8e0d8bed2511eacbcdad200e9cd71bf05f195f7514d8cc2114b53f02d570928f841e2592ee460c5280f4631ab7fd689854eebe8c38cc452421e6466ece862671b2d1e6f5119858adb634993f9186239934897845bcd08ecf4030e771c411a9d22a74119a27c032bfbe0fb0158ec5fec85e6ada58fca550f042b4427238728309ce25280e840b2ee27a478b215ff297d30403d9bc3fbc883a5a17342b1eb1439b2f7f45fde105660a77a7a577b6b579d97aace681b06f6538882823022b2e0cf822855ff5aa2d806e3f3342d118e3a8bc96b65728ef655605fdba1428e8638dd63839c9d08940fb4daeee52c2833773aac613c1a9cf1642f663d6898ba258ae45a0764b8aa91db971da8fff79fe80517698cffb11d90b18b00a70de10585f5d604dcca4eb000db4f8d5f06ad0c4545bb099e154d452ebc9f59e9396c2a3b0d074a67f03d8fc18ab21aa4722f58e0dc10d34f3390639cfe0df26cda27acfddf772e6df4fc241386148437efc4d9623767565d93280ec3d946043e4e8807a8dc207a6c913a323780521163117274a0ba22556f213b183f1d71170734d1456425d1521b4c0ed8a447bdbfa82c5eaa98c188c8c07b7886adaea4dedb1d217c3305e5984d2a5c11846d6faedf58094302cc593011ed9d7b9952f57758d5d778dea0b90bef10084bd16c6a363aefbe0b669bade302c24f8e1d1a367a34d13f00fb7f8a0ab1c67891a8ad359470ac3760350eea386d5e7360ca5023f72d703c3329595664e6fbae6ece273bee67e50e2257e691f82b69d71f67366130e9c41a664440cbcb5e444b59e9c553f8fd5c72ad2bb7145a37237cd9a48e576cb589f8e240d61cef0a303562c493ef0b3a3fb1daf1af2b43b5dfbc545b40ac3423a967df43907ac66c59508bcbae8cb199505200becfb88360105fdb449f2d651c0e6a165f6f53bf9b6001aec9e323550b87c9d31beee459e72ccd09c2f134188d90c5cd1bf41bc66fcc721050990818dfade288b62ff14faee854abe3dd997d9e8836f23cf4b79837e42cfa78613ec29d5c19e9dda41bfa8ff609fd3da1bf999bc511cf6e6eaa2c70dc0d20a3c254c7438cc80bba4e81ca45be86e2922f5758704068913c31c9648b9e3d11ba2e78ad06aa9af6478974ce4b83ad3c1e9195c70a16387d7759c39bc6869b9385ca0cdb8aeb0c8ee509f3c71a2996a7911fac45aa5892cb0de5aeb3d937e4b55724ae29cc3b654f163deb9cd6c3724794506e644bd6ff223a0985f1e25427ef586393de000141d5d4b293192b2338d52f23ee2b9c5067eb5de4f2977a078b9d712e6a210625c8809755bf13462bd0a7a69b812d42ebc50913619c22af86a5e94fb5e00a5491a63e8e2183706b30fc68939ddd123caf387ccd53a758300b4de2ec89fc97a91abf44aba456dd7309be74594d5bb6004bc82272f8dc2219c522039e822e4fe54bc1fe89588b4fae7825aeed4dfd790aa73bc2ef0e90562571c6f9b351d8f17784894692c0e812634f4381fd143f800bf71d45570474de61549bda0f2e22e792d8a3779807fe7f1aaad9ec22310ca23805b45dcf62f43ca8f0cbb3d539daca4d8539deefd97e22ca93296dc9d4d9ff268fb43395216192a8eb8716bf82f0a24686561600e5df760f6a967218a9b4129be9a2775896a20a312dc59cb69d9d0b2048939ad3214692990cf41ffb4d0ee0b61d00b71980592403a0cc647201aee8b12a18d96eff421373432a35b9d820555dcd2a60f8ab1ec4ce8039b5e8f5f0c9ee9bb8eced84e260c02f1fedf6920e51431a30ace0f911a09c04e5fd2fb567eaf9014dde998bd4666e6b08fbd406667a7fe852a3b4218ee7524ac5889ae18bc5d8fe219c554f826a117222617fbc5e81c2663643a0381a58510847e75adb7e4b95a2acde6bacb72793af71ec60022b68a68f062fe42a834451c97b5351548088a2b7c8cb9ac40455321977d4a2c1720bddeaa32f05bb07828755acd6f75aca2fce53704a8d12ef6c171d8f9fab2b09fefb2f6c868f3999f199a3dcb55350bb6400a6e2b9f744a944479f8a6783f6bda75553c6d50a104780180e4826bfd1ed3e52abf172dd10bd4b0d90b90771f331f0904c682a41cb06625c721156b9f3746b56ccb01d78bf62a0e92b696ea0f4e0f9344aa8535aeebcb9dc23f9884bbc01e9b9c2a1e01e1ff2cd2628a21f3cdeaae31feec357d78d00127e2b275b74856dfdf22debad18a625d8599aa5fd8578584d4388722f3a16fcbff1f432037acf75600fca25e2df587032ce9246c85cbaf0c976a5605db108463339275ada0be1aa98c8e59c57d513b3e22903a0664b33d58298546353d9ea058b4bdf4a24d8f152986703727fcf4c9e6ff17108c3af1eb4bdd6309f13afc2035331b242d01c22ceecb33c7d323875271b945cb29aa037231aac0c563c162f57685d894c4be16502bcd99605f54c86eb0c20c9c2ff2a3802797f811e38e4baf451c58ba106a1235118f31ea60ccf0c8a2513a0d52596969b5195ddc574dd13b91e88a3883902491c850a1f5121f5b5858c93379563fdcea0fe4826b73ae8bd69a3c37af0029034df87ff1155b5960967d1b4c53ea6c51c9db23b1a70dbd3d18e6910aa80b26867e5328129b0bfc0ef86d9815ce756c0a6f766f6296fb1ec6c730411b6c74076ff6cb7ef416814f49aff67fd956efe8ba4a65f4222dd4d4588e91a6b61ebfc83870b801b5cbb6cb65c57606c8352dfba89865dd82b6a11afce1c1f6353324919766163a90f6137d71521dd6000c28854069c4cd8b6302e438abb0dcfed13d2781e45c2b411c00a5905b939273d291c2b2f3389b9571f0f54ebebb0349e32032c4737a7c9bbf23d5c43e802c272dcca9c1e382396fd682b77916dc2d2c8aa6d9a941e769b60981ecba0a76ae15c6fa56e01abd322e0abe1d894593decef5f23a61cca2d8d80570b18a5dbbdabd663cd726649d9dee089cf52e0b563838e61b588dddce8553b6a473ce1279476fc18f9fa680c583dc4c3407c14ee3bcd27de1ec5c7b4ec093c24b36ed0495e281554f0a2934c3e301f3f7fcb841960949fa88fd5449f228d303831f6d6dcfd9d94ae035adc03ecc726a2cc12b2376696728f50a5cebe99cd15fea6323800a0613b1f186494dee0d1d4dbdb0e464896de94ca58a6e44d6fdf503a3c5b0c83ea67448a80098ce35809b4efe4436bc64c15c5cc1565100610e8750442265dba381b38a29af159bb5f3bd4a2a268c01881a921daa84181796f7cd2531e46b802969534274dbd134ae91a0f13358d43b97a3c3e7a3c59a07dc2f60f6d72bef582dc602f932bed13d5fe00d9d52763550cb9c474336b53fc287517e81aa8d1a10c9f91f5a53dfd947a89bbec837a811eee62ac7c89206a8edc4721ffb4049f5d03469781050372610f1a337709799bd6fdc5f5c015e86ddcc7fc618f2cb222dc7fab5fd4225417b5d797eb2b891f143909870282f2e8613122aab2ed1bd36c0a17742eebf4e0734fab6b09f93f5b06438b8dc74e24b0581cb9a78ab19bb068a8e5c7d4fa7937dde898f586db2bd425e001aa91058c3d5cd49d3db05867df997655d8176e37286b0247eed9855f39d8ebd26a0463f5694afd68ca8f955a409fa22c96f8c3b77184d9b6eb09ed204b6d59eb5762d48bad9dde94b89875983af96cebfb2041f0ccac300c78146ead2d462ceda09c235187c4be385f6bf716f1762d60bbd4e81a625f7611b5e2a7a7abfca0ad36e61c17158ee47d7198201cd49dbebe1419653d21709ec01dda4a69ea78780c56c8ca6c24e10993bd04a0d258e42ecb0a280b83d8b74e315130aba6a4a064cca4dfe373612c15e4befac27472324a2ab2ea59152162182b17f627ceef0a84dd13ce2fa11b8c0996858d50bb048b28156290654eabf39fa2af7eaada34180755914f20c6d5f0fda33909cf19e177fb54ff32803ea1bf6e928181b884f7395ebec20943ef1da1be1824079da31f82ce92109a201b674de763845cce53bd52706ac1bc3b08df0abf7eb2b5ed1c6689b587bc59db0e827cf64fee229afbbbe13600373a424b42f84eb405590f5a009f1ff59eff78347aaa43db7139093bb58329327d29c073f27630a3d32010e558201654dc2be09009286a4f0c1efa46727f9e33bc8e1e298d3873c3fa6bb3d44824dae5b18bce37de0a4e17dfa2767aaf182079712005702470817efd0f8baa75ba5debdc40d940dc0c99dfbae0e8da094e4b02fea6245cd7027140df3ff0c0b40196a2a0f429d27eeb5eb6c5fd00a2a2e28f22fdce21daa63e61f6392a5c2a285c53a2d28c2d1d6ebb89d8330be4b82dcce9f5abacadb320b6c0d18060d39d68a59b12cf74a9c99f62d8034700c91de30dfc5b73f0c526f70d09e259bf705302db20eb9c57e6b9823ca14de5898bcd7d08d77246670cf2860719669243d2e170d411567b9e8e99e60540152fc280eb8488def9733a7da4226ae1f0e74976f8381b47c49c9bda764f3fc077a138bdbb648a1d6785a28c75debb9e5384636ab330babe919b058e0d05eceb707b860bd116954ef7275dca6406935690dc6557e4501b485d3e09aed589cc15c18b8e1d6067e288af2d8c0e230f6431e1d0dd43f544e0de39cd221f0cd8d247c52de9768c266f2fcc8587c7d12beadad04a4fa58298462d85355a12d6c775f1187b88960609789e40da5fb00956cefb3fb3d0de3b720f9de840837184a0248249579eb6d9c0b387ca3772b6544a96e799129a8c0602421707c856439fd3bb15de65cfcaf161b6445059a6323593bec418a15166aa95d74e29930aa9322463a88fe533b524614517ba14b7da9ed89b76f832232d5f189a4d18563eb1f63182f6b463ccbc35f12c01849ff1865d78f3a2f1532f84bea41637e826c4ab223c7a60b9ef4efcce2435899581d17c4f699b85dbe845f10f97c06923ff5d19e5fc7b6d2e1a1e7f60ed35f81b175a351045473a201636f1c2396c534f884d62b33bdbe28c77646d44d6944e894a49cf07bfcca12fc09b2af606c7cc4f095737d0fbfaf3261ec89a6d64954ee0cb4f2fd739514fd4858da06cbd2ea665027e143412702a5799fe4c20b524ceb45a2154c8309b92a719286dd016f3510e8c470a8fef2fceceb615b3b44fac133ece4fa3a5b8e8b13e1b65984c1b0f432d5b456ab05fa13da06814c1654e904d9c3c32da8acbc712d18bbd2852c5e310c8debb7ab8619a117b55665454e50cd7f5a43331ffd10ef317538abe9a54f3bd44287bc550adfda80f368254b7ec50ab9a234103ad1c5f461857ecc04fc4428c18c35fb5306f39f74018391c8ef12230f8ba20926e9d6db8699da12f8d477f00a4e265b1dcc5ad60e8fb8d519bd6345996c3ddb15d4cf8db07f8f7e3c198135a5518b76c58d4d56bc5bc41a0c926505242d51ca75b2f9b102429bd32e0e91d8f886daf9caafcd9121d1d46a141b6d195a13e1830ba027e22851efce464e77e4350e4da9cc7be0e08f5548fd42c58ef566b8c6a352264ee359a53719e98bec0b2397f60c855e676b58a27dd8d44f4060960fa2fc1544d0784ec5447871681b011e530a44f148a312a41964a0981de7794b9eef78d8fe2ebc90676d1309e85e51c14dcc331743be931c955bd9c14e7fd92df93d3b839e623060de8bd056ed1db03e2fdab36b7415443fa70e6909492c6c0ceaa9325df2e464fa9821805761e7652313b2ba748b5550ee03c80e8ae96f0a6989ab7a49271efa6c0e5f7c44b0c9b3154d2447c55aa4114da4bcc4a2ebf1b2be40ecc4c1de5ea22a1504b24beef086661043441443e4244417bd33aef415c22f2914ccb1905d729b4280e1e7e14eeb278f29cddb68d9f094dfec97d1dc1f327dee87a7f9f4c698d5e91def675a7243ee0f33bb79bbb9d637d4ec5d8c1a72588643ea8e469ccbd6f047bde415fd9f1ff63cb473544ece9ad910b97e793a89e1ef1dae04e7de97b72de7cce341d6229875b00dda95b9a5f7ab8131872478f3322137c7393a3cd6f27b4a3c7cd3c1227a36b435b33033b10f45bed505b54686572cd335612394ca863f9107a593b2ad1efe64394af5eed725ae00b50b45da4ce328ca2ff3ff1a1435a7f17e15bb17c59b6c5521153912300214355504456a0f0481671d745cc79ebfbe2ac3553d66444786202db8106d4d1129cb2861d87aef057ddb1758195f3a82d1bdc061e4c9e8cc5c8d0d63201bceb5dd0f151f018d9c8d2daaf20b11be6f27a8ef7e36cce28c1a60723015a65f07eb716b2fadec22589b5fce71c208175cd65b1eee8479418a5265ec33508eb88e85869490fa9e28fee1975ee5274ab61035494f593e246dbcfa4cfb4aa742a1751f8408a487df19b68d5e07971d312d7783539564911fad73ee47a81e0533efd3d23be0e1ba494829757206d1dc5726f4e443c935ee39991b7b144933fe8543a62f201bfec2df0a1816048f16481a409b05a9b1244901ec84e4fd7fddd53ad2b8851b0616212e7343b17d56d9adc4400c8b2b53d2305e28418ee48d79eff3398e7861ddfb245b40ce34f3bf4ed9c619dfa03ddcf2e74819b71c3b47714c7cf371fc3322fe314dbd8811a722b8e51f1150bdbe172c067327485869fef4814fcb5543e0ac46343fd730002f23b2853233a39d417b35dfdec6ff8148f38d5b35adb736f326118021ac351123a171b06c7379618bbe0f23ea02a34b1a1c8041f31d0b759ba2dc659fd7b0cd5103126562fb5c5856174325d2c7b57c192d1b047e5769648e0948bb9420f68c2a8201c1f064ff6875be55238e402ef08a7c808203ab2aa1bb24dcfb53469ea61abebf8738604d0689b1bcccd98ff42fcaae8b773193015b9c305dc9c8d6ae6ebee154a8a2ed593aa803baa41275a28e787c52e842c49331ca0c10331a478d2a849c3e740b3e5663c6c7ce995ab07865c324a123aaa247d1e435e357c5ce702c6cf37a3edde0e1e92088f5f054c926f47b4c5b3c2a29198aead413922196db265787c6ffdafcc359b0d95dd902b4632b5929f93103edb60906c6e5cd782c841e42a20f441328cafd62d41dd483c83549881dde36d96c7eea9b5152d559d52406768e5c2f758ff9a19b8e32fe0de90cee25246917157fd3e2f863b3109221b0550a6b59e30f9e46d3846702f2c359725cf64b5f9c973531abf692134eb7eeff0020c699d6891316d2be60f0d1a44838342eff6e7f7060f54684f2854472247c97a5308cc3e6d416a1083b16214d93894172c6a2b95339791ed30e7b41ad6d33dd40e1b964f6fbc2a2c439a686f986847e771cd09a46feca3de94e1b39ed2d3f535473fa97b97abb2c56fe2f77d27083dc1142d66c9ecb0ea28c80eea9bdf266736393983590fba2e5354e0d2e2f4b540de0c12fb8d2fffa259791e21023c2988726116b4c9748063a204d91958e3d2c33334a477aa2cbf1b7e27c2dd295d551f127e37b8e765cec48a2b615f0952aa99f8ebc859c68bd32aa19640285c3d9e56015b9b36dc1deb484b28e886afd7a40108f75742451e75c862e92ff213501445f19d15d4802f242a4b9de70f048f504f79d0b6df5ca5899b7bdef16d2f1fae8dd2a5e24418e75d7d0e1517e34eba985c2e03e7649da7f38dabd442f9b94ba06093340428e7f02c6d95ee2ecc503fae5bce11f91281e7c1bacfd9f1500b6688a1bcbf918a73bb10b04add32738971ca65d344dc32229677c2d8958e9d9b79cae63f270e607a1a560e8963efcf5a8dd7cc1f3a28a85d7aa3fb1ac4b5f163348abcd3432cf554d1ef65f085911a9b05d2b1498f2ce1a1ac91f11cb513b4fc5f98c3eb353d627682a0a4a5101061fe39f30861df3b1addcb07299afa13b565e598a1da1ba522794895a841038268b645e2e0c2433560fb2d12af7e69be03e7fe5117cb94888a7d269de1bf03afd688bd0fc99c2f03638bd5f548ec671f4ea185614213f121f3c1e30135e6d8a5967c56ad41b67519e3604de5aa10878b8774de3de2a14bf4c51d10112434128c7b68471338895006474ebdcd4b99604977aaf7cd54742bafc32e1ec5269605a149a0d6461d454949ea1b632d44d5446e12417a16c08b2c2a8a42d447c71a1b9b32d2a10892e4e35024f301cca654fe75e6dde06e71eb3b1a32add011da1fb11f576de5d9a5b3f95dcda833e98a72a03f2947acb9568ffa190d429d233be1ad125a13eba89d619d418fc8440a79648ac6fd0cc63b997e4a0d27ef35e72149ddd8e02f8e518f95733081566da0bfffbbcf91ae0d28c611fc3b7e1981a73b9c8f232843240d2e5b665d8bae85e19d95d615ddda8e8a1e5d4bcfe0a625b4dfce24590be7771a9961e3205260c9ee48346d31f6a0353f5c5b984565d9f4fa73d6cf15b9a2e438d1cbe880155dd4ab20281713a972028fbd2cadb37abc3bbdc9ec01aff65991dc8a2d8fd8d49a04632c4be5a50f50a823671232e7008503fb4dc0377813000e8f74695381e54d154da5b891b48d135b3d5b61a0d106605dd0e21fa405a0ff208bf84eae2d6bf4132bf4445473a9473a3091ff86d3c1ba734c4b7890eec7d134c4a83e87f818a457b88b8da374ad110d1ec80236fec0c087d5e9a8a2fbc4221ec8f898314626387ff65837fe2727dd37f1b1f755951c66fda0207600698d467546f4071741e809d67542d3edba8c238911a73f64590f1e1e4e4dc642093cff7568fad0df9128544c2ccb9653ffc64011ced45ed855b0ae2852e3d3181c1c1e2cb58d2cd7af7d4f00a993b7587eff48500be3af179e7844e969e123aab3a32b5799b48f99c0ca6a7510dfce9e0679ebeedfc164bd1a56024564c14f81c81855bd519b42cf04e11255802780cb6258d87248ee3ee5c5f197218cd07b7af7618afcbba080acafadf492c70fad2e682d7f23135fae38ab6ead387d2ac8f7fbf1e5e71ad6b5fbd4f272a2af1e7378e25a99a2f343baf4637ac9333aed06b470b998ba9c8adf7904c6e71745700bcae8031ff18ef0c53c830235927eaa3a6bdf07b86166e8f5c01f8ff2cc7eb88efb50f28d7313b8be0931cfb940a0c5515635b55346882233ddd254bbac7000aee373c3b773ca50fb68c8dc4294f1741fa3f2bfa6e4beaf803f7b4550e5938f17c25538bbca0f21bc885995146a5564ba560d050e7b6bb1bb40d1fbc549328b47016938de00148792d6f48be26d2f8801e53533c338e0ce93be3427c6213a4507bd01bb9203ad6c2d97662e65bdeb76a89f1a0598c4880af365f50d53a651bf2c531fe009ff6f480aad76f4d58abb8f022c1676b5da7825e908136d288fbc0c954197f2cdb268b414a9bc1f34082b7af971b5999291149cd6318be0af50950a9dd35ba7f85c63430e227d0222c84301480be87fdbc57c247f62e3b5ce21e3ccc5f8d5d32e205d46ce81cd275cc9e4f082bd132954f0c94591fa280e26fbd0beb73ef6ff37aae5acad41efa4c643ff790e0b56d05c277011acccfe0839270c015bf9cf80f946863afda32688243a206c4f698e5c88f428afcad7ec9f60ad17ef711f6d61fd048c25eead90fcef1f4789c4bc4863eb97e0bb9833cadd9ea2ffcc5a45a49b760f4803a6a0e0107ac9a7cf23370a0658832db0ddb914f339a1caeb9cd516bcd75462d2d96ecaae431547affdf04dfccf003f6c784e87ae6ee31884ecc99d6ea332fe4488f72659e0db23868ba8e1901ac37f88b10cbb1fb5b51767a402e40950dc387c9f701dadc89d3505ebc70a994ff1fe5c1e7be076f884239b7883235d87c9778655190aed1a4c14e8b939bcd5890ffd44e2ab0ed8c9cc01dca669448f6588eb790696ad3e397ea6426e8aead32d7da32e54ab572531fbd7f39fd48617ada910f1c7122d21f9c952acbb51387c13c2f522b629968261be8497136feed2973feda54b5e1fb9a571378147b824ec7451c999d3f2ac582553e0492d9fcad5a12591bf6c40e40e843023a982d63faaa91a5e5553cc05ef9b517732df5179e7810c10eeba1269fcb2acd55f78c8d703491f5e2342ccc1b58e42a775a7bee40a706423243304b45794eb5ccf550f4cfdf06bdd5e1e41f98e8911f81adbdd68b3569831a30dfdd072851775f0f7031e14f89ed083f8a8334c2c6fb34b17f6f9b7c6c67835a12e5aa890c4e6826993d067428a8f60ef8ad030739b7fd865d023f21415f3a741c8b42cf3ee80670df9b3f00c3b6d83e86f48d0af8f43ef249b38674a024e7a5f74733be4d2c62a6c43204c0ade1ba9a5fa5b3ff3975ab7c4823a74d8c7ad3c2d08bd19391b520316d15c456a76a9285bb3c867a481a0aec898b4735f3b70dc550aee9cca19fa94269c9b898667ec22ba47a850993257b4a94bc5ec3d895dddbb44e2c74a167d6ba707d7af18ffd264c15589bb31751400a2da30d92239001b7b651616324b37ab99c16a4c00060481bc16e290e6f967854712e5c69c28640d7f0d8c5b5184b4a04f9cc2071a9014e9829a9116b63a389888fe582ccbc706f2280119ebe199a0242126bc056ff78c0e6807ebec489b86a5afb8347bd4442ecbe4efedeabdd2766b4d5295796f9bb5799988beab20e8015d3912460d7465a512a812e47effc090efb6a22b09b10d20b2123b256921dcc0a0f9932ace570d138bb5295e583fc35ed817e99f20af681d73d379f56a1a01489e53bcd3b1bcc63d43d152f0b8605448585a63650bdd5a3852a2972b29fda1271fdbe22323b05508bb3f6d5c272c1815385c8e94a0b1a0f2f69aebb44c1e60c854877200de81d079c0527dff955503b51af4c19ade9bc8f006efda7cc5e3ccd7b4b1c6a305ba08db9f0bcadbef3df2cf0506dade03e719cfdf317e5652c05e9e2b4cf78512a557e71f4684a450a21e41078218e081ec618a74a48018f784eaa873935c95a512bde959f22ef4f11e97afec5fcb40c3bd621a503f6918d17095b10ef285411acacaae7284a5a3b69fdd18a77758549f0a1c63a1f2c63372eeb7124868fb4df1922f65ef3d2b43f411bac190518f3b7010cc901dc114ffc94f92995411d731ae758a48e6649a06a8aa6692ad9289bc659715b56dc024a1c613f2f853b20580dd722c07391fc9adb72a7229345b5e754bf2cb03545b654ab908e28ed8b72eaf69d9c9418e99dbac1bcef06c1558536fb92a52cd139578ba4b1b141c8870f5c8cf212a1abb8329090292fba60abbc4cd85b5a5d412556daa84d74090dfdefd26bb056eb3a4084e57c6dbf4dae0610b1be1e0a79831e700be0d58ae96b6c27645b8aab24fe3caab30a03b6af17267c9970b3c2b1fa16a1b3b6d0485467c6e6b75755658dc9805302c4d9c8438a8418d7fd0f18e1c21c51885101cd549f6d61d410368ab68a005db029d3e70159d0b4f4b0f258b083e5d0e0486184f58be182d8832cf145d14fd842b697034e5b2c12709dcd22514faa9b014aca4246557ebfa73c02c92102b67d96bdd3a986bd5df291661487123ed12054f5a2c3c7064a116e2b8c907edfa4981ac4286a1dbae2d504273e51d3c41205baad4ba98217364701e085bdfeb59325ab68bbb5fd6173a6b80b4114ad63d188f04a1069089c12c092c6dea5abd028d266c8ddd9cb59d32679ddb5024de70b10a772a4c32e789013a766af3b8fa7e7b62af719641a3ca52c16872a8372319ae0cfdf01f521b184c0ba1c35f9710531d7b610c27db4bf710c469a5191121236dd4a5e39c4d584abbeb947ec263510cad32808aef67cb904e77eae7652ce5fa65f6c5bd30450677c20c5b7d181e16a044ed7a712f4b82a1c44363ab587a049ac7a6aaddb37b51baa89b5347b7403050fa90f3ef211415157bec92a385209c8a3a5b28ab7331c1266cbe00dc1b24c68df04d4a6d95c2c080ef4ec2a5f24207b6e55e8b4dbbb8b40c61d9d9b63b16603fdf49bdf564e27866340cf30af5b3626369612250c37b51f0037fd72cd12dbd7f9d106e91f16af44df18e767e25b9c8d23aceefc8355a96740abd36c644dfb3faa0983cc5d3ec52bbe629301af5dfd15390514c0e5eff2080daaa22dbb6b04bef24105819eaef5280ca9de7d88488d9f7394e92073f0203a002771268c666735c1956525dc1a12b7c50751167a5ec9cc6a4cf25a5060ca579822ccec1259518a67821ae35ede1ace053427c1302e0cb5f4dd13171561d0296290d91712d857f1902aa84e311ad5070e806245e217c5fd5a1aa95cfa42f58accaba5a48c61440ba3daecf44afb2b15522b41314d82a4a1dc860213d6fa05bb00096808795b9ac55ce7188f8514001f6d0d6431d88160b7daa963fc4a1be434613ad1d6ed1ea484b1a2c6aa38a72b24b0165042d4f12b881577eb91f5a34818f09f8f7fc225902e058e5cf89906f844cb44a84e26dac457d74410210623693c1dc9dd5d6dfae01b41f9789705940b37f27531aac89b7a014bbac4b4e1b48f0af99a2dc513dae6d13549754fdb9334fe10669330fc78669b9597823f04354c4b366c0eb93658292f88d034fbac561b9547f9e8b5915a08c95dfd3edec9d598be98288f6ac92cc2554c3a3059c547a5d095e4792c28e045c8e91da716501e4a28aa1e124ba03439f6af9f31a096a88aa63a7630468f8ba05191ee9aafb5449eb4be19091fbfbf5a5dc42ff62c203fd8b5387caccdea246b2fccaf97fe51c232984013681ec0108f5bd00463e1b21ab052fd9d5dcb1759e44be8b280c283a76811a08ab146ea5561a76f9cec0cc369715ed86598e3da81e772d70d2cae6880428256082d67342e1653eb4a95d352ae2f7240f97738eff9747c2822ef19a40f4f0922118d9d9b8689f6d20d104b2034a968efa0fc9a58a00d0d421b008e0ac3737c4a07c1ad0c138135013030c17fc4390fbb2cffb9b8dd2de25ecdb89c24d5b94c39b2f16164b145e6583aa76616b79b085b6effc249ab7f7126cef4c06f841f982a2113c2e370bb024d39a90587c52e7b9c8bec24ce8c2a3cda14e556c3ed16c9f1219b225a27e45e19ffc098c12142104e38accd84d0273bec6a74ce111777245e35871aafdca1be13941a86b9e45349e0ea1580ccbfdb3f3bbd9e68e7712c063b6a4e79ca7fdff420610e1fc8e854625026d4cfb23f2621bf54bba2219ba31d0fec9ef41712042c39d62bfe42c95e0ce25fefa69ea5ebf4dddcfef837f7bc0e4dc850cbfdaaad3b45c121ca4edf7cb82bc98e056b0d0d1822200d252e88384d11ea307c62b6b30c54d5180cefcf9732775d59ded3dab09f8ec81825002e15416abce455078453d08d7753901c185cdf8eaf6f8d7466d0beaf83424c7a79bd28b78633b458175564715b1126c5af8b2eb6fe99d60067cbb03298b66562ee06e82a8f8798a2ee662a72df7cde0bb94dd408fd90443097321ee49a6f8920be8a884843ac702abb8c690a85ba4a891b80a4a463036e15f50ade8a47be6019f438c083b5e631cd67c150b784580a02bcba9d442569da632db2a1a02176bd2d42102f15243eb57f5ef2dcd4d15641836ca8751f159e5e3f8befa49340cc27e66c7d53053c005d70df3317e5760a0a195f823d4163a984503493b64327300edc29abd3037e63656a9a7e70834c8cc92fabe1b3e0a9f908210181c448e3824cc649043941bdaa3de1c595ab14587f587899fc8d008216df2c10e979759322dd7f5c14220e97d4f2e5bf3c54955ac8517aa80d340acbb8318f82714681d68e17cb51d2e08548638a5c84ed4388d582a196e93a7fe9bfd1d23bc7f9a752407508cc485b1febdfe487c5856e7170f41b36c817f6c922fc7dbc0b5aa03192eba184a01a159acf7fe2affdbbe1c0c183d536ed1485bfeb8d14f1cfd81c139b7a3f6d5821944da9ac9d62664cec9d8486be8d7794480b4def418694d65f0d1a85176eb19ff0cc1b3a5f4695a7b54e34ab8da7e2b3422b35b19d5b074868e601e14b0ced83093a15cd1d1d7290c8bc0d8b8c52360b715592e34f403f5236e9ccc219ef9a85ceb6637e8aa889e024aa60f9f853c963ff396f20475bde40f3eb82d7b9561cc1a899920705903943828a1373131837d2fed5dcab43e26fa89531f8c3fec33d0618769ccd556f027432bdf375e037df1e709ce3fdcadb905434333601d4e77153f19dfa8018f9dc13a28f033b0f938b4cf4cf10b21e5a92d8bca7b1d73aa6aeb8e7919cb7af258a8c0d7a0a9127b4af4c350b2619d79bebf28b0101448d74fc179edbe2c9ea21d318b436e789f4e658c16a03e52a53accf60b7c8913fd8211fdbc3164c4811c80e1677a18784be18ac962dcc79c3aa2db9bea074c243d4c5d7724d4cbc5e44587e7ea772394aa01140a2191be695aa05e0d6cccc15a3ee1def279fe2fd3d5ef7dca774ffd112e4a1abb315e5b3cfedf32073b9c78e63ad400014429064bd274272fd91c675526ae1b46839e5b3425805e3a61921e6c8fa90de46229f03414b8607204f679751bab5a7e944a7aadf0bc5d35f9546daa029af1cc4135e1e60a0149bdad4527a8d0e97524f430f6e287212abb69f952ba15807811db36313ab00e7d28960b6fade2c417ee1fb8022cf381a358057ee010fa205e095a9f06e26dac320e2b83321a2ae228e979f5b72a0c533d352c5ca83daf3ac9a2cf494fe2c602a6dce0bbba40c23e98abc2e7d3ac628b9302877349a129a440bc18754e0517b80bc52208d09c85075dff8c2e34eadf60701b58d7670c793b35db5b26ea3ca0b5d6bc3443ade064571c33f472b48dcba79f634ff2d9a78c937a7f3eece0c9c44418e826b6d4f793485cd79ba51198b886070d7ac7b6f3290251a5912baf62b426d5a4f323b3213969b77bcfe7bda87dfb878f88bc16dea05e7253fa4a4c1e14a759d2680353cbba0e8e50be696e4018e203b998138400b70f909395742af9911c248e309a03149fd932f6c6f0f2d6ae16eca2f23802a45ff429e7e922f0dc4ea3db9f2f73ddd975507334b46670cb02d3eace0cf93542e3afd40f8969867705e681f6968ef314c2d6e389300abd6ff82e0310e1c993dce44ffe5ec3ca1b0b5447fa71853d60e7a56e033f44a150cac479e57b2482fc274b0a05544b582297c2a527a75e42b4543168e75ad96cb6b824d9a19cf22d1468c61b72b049e2df8178bd3e833799974fdae30bbcc9a7d5ea2558d8d5cb815f3b04e4f35e0b6591a889a2c494a1122846ea9692836d0eeacd25a905b0d68afcb7d444eff1cfb81bd7782a8c20611ab7a4e41ce1b9f30d2390cffb21d75eee24e6f8bcee82412e52f61b21fc569b7f3a17dbb97b4c5daa59f3590d34f1597ced42a41c24b90ddcab646dd1ad759c650571225ad89d69d763870dba1307ad75058721a0a871ecb04cddd0105b96abbd4e53440258351871a41cc9254ba79ac81d436b0af77b468038629808a963f5582dab8ef55d1c60c78ad3223646f2be49eae40c196e6e64adca43dfb16a3ffdbb659663d34c4651c51c335990a5a78d1bd9df15d90053ecdd1d8346d1bb00225f3cc531d4181bc8362f0f8be2b2935259fae58dd972665ceeab8dd3ac6153b41e21ad1f2e22a84fafbe3ec9efb593ceaa959b13039acfc33c38438953a67b78647c75824cedd84a346c53734caec92bc81c304d063aa16abd99b47bd1b394a0e5f64b321cdecd663c70b7572f0e0f5dcf3cebbf927ddc4cbb10abbad8033db244e0fa26a36c3e8665181b63361df2c23cb473fdcec0df7e0baeb0c46e426220a2b638b9e4a1633628c0dacfa641172ed80db384751ce3d0aa8064f840d64a4d16cf185066fe07c46e56d992db667272f69ce5a9f253ddcbc51aabf20296247e9d6f7778584de4a94d3d1971d4f0499545bc7d770f5ed6109e3851a74b56551c1cc5e66f4391355a7c46894acd00aed1449d4a44e60b7ce737034e819ea5e3a2d00318340a0f21600e7a0da0800382186e204e311623d81b99c9cf0f67e3fc107c79d758355fbc0f79240f451fb1e3b2c7b89a4ee7106766ce45184dd1f468d81ea69f5742c7ebe69931e99f2f79ea461108df091fd2c5ff942b0efff41177eee511fe9b146b30e4ad64385400a4e8e34f70075fcdb411459fdf2f61f6bda7d88ab057c974febcafdfda88793b14d53f0b7da900d70fa83a58d430580b6d35e8fb9966ee09d2ecc0f4df50bdd55dd406389674c2c8979a17527a70746ae185669ef224cd3aa17adbd576741634f185e695ad4933d6f8019b937bcc00d1126a5148482b646c3be54feef6565b929b8338eb54358027476b643c29236033a00676740b3debbbaa14dcdb40f75267e24dba38cca4650e9522e96cd146388ecec6f0e9cade0ca26abf4e943f0acfe4700ee38c0c292cedac00a84c4d78da0a1cb5da92b9ce09983b9bc83eac518dd7e29f23968e0b2afd924ebfa8774fdce314634fb830692443eee4b2e727474e4e65008e0b12b4d1f307ff135d8f31df277c6796e85f3bc4057dab665588f94d94c01c3d2278ce0fe31c7226c2e06fd5ea4edb008b897938a3b8a70313e16c215de2638857468c76d4804b4e3aadd00b8755f826b5a3aac350a7fbc8138e0673e0e76cde780ee05a4b837a16b4071b0870d83ec197721af033c7007ba2a48f89ed981dadfbda795a6a8d736e2aac4804070a42cf1e6bd6eb303053a5e0f0a8e276d45902252d5cd4dae7c5dbf39e9221249de65ddfa247a4aa1f69c167b4a3f141d6f6fa73fc19b08a3480956bac18790c35cad0e8e92e4fb72a405a8342ebd079eb6a7edd87dd4754f7be06cff00c182aaddd26611f12282be58fab716f759f8eb410bdb88c68edaec07460a58ede0a3aeaca53454c13a6850c938eec2faa02a5704428a00c3a1671e5d7d42d0e4f6b2e67e36b931574988d9e432c908b1861c8c86a79d86eaf5b7cff15c4abe0cf670d30b7272b112cf3f964ad4b07830d8a1dca0aff227d05053412c371b435ba7af31c2126476579a5d141b5f23a79e36a0207f2e5995292da2921433737b74426b1cd1ad37f142de1e48475075049acd98cdc9df8c3dce187d501c0e7fb22d57656cc33c6858538a156dbf24ceda25ae0b6af456bd7d964bccd1dcd9e5b7ad70b0f4adc02e378c2202f435ed3a3f7da6a3c5b12f8245bf6f0ff634fe0f1956cf00941fd94825a9305441168b7d1f1f1d30e0d1e0b76e0d6a7fb400b89138e8aa8304440090f590b63400e2bde94289e8f8e8a5828a1123f8340db955632ef7bdf4c3dbad4a3380096026c897c3b15fc67e58320f307e518bdc70f29371399c6e441c71b65b074257139ce2b6983f0bd1007a9c74545fdae44eb3fc24a41301f75d48eb3912feb3cc9d033f11e2749fcae8e91e3ed05e7fb0d9669fd23a01569ab54b884edc07fb88a03a0ec1580f2712590929eb7789eda91c49b57e64d3e54fbd778c74a371657e38cf4aeffe579c7e32b31b04d4fa7e994a0eed280df53033ef8d21d60b8517d40ba09097afd3057146a9a7108d1d5494f96b387a6a76bc1944b23f2773df55c07916c3f4710892a2a0ebf0ce4719bcc373d31a0e068013552b0f7075b6eff5980bba3ac25d2c5f98d12948bf63be280cf14dc01d58d22885c2b8abc51cae97c064bcf84350b52dbabfd6471048f54307114f2c98d33230446726b8850aff7ce2b0b41447c757d196f20ca0d3a9139fcc2e2d536c8f8c5101226c288dcfe4b5108e8611f06e2165d1b512e02746426ca8d66c87fd2dc44a1d96ddec9c4c4a2d6ac790ea77c1ed6ea2f481c37b70d6d27bd7fa298e0a8e73343183f85a416e0ee44d9675ec6c1283db0447527a9383ca2629a05498ff913899569edfee763ebcc5b2ac8def28665e63a936176cb1876e640e58d66a312aff98b6af460f91cd739eafa53e825c87720814d9c8d0eabeef12feafd29e6f12a28c43f39f5632890790924871da6f0b2603a7ecb6d49e01865a7e6e37a639be29bf4a428f46aea3934bb82f6aa0d2f4524aa8b5d1f5111bd4fc2f6a34dd494e7a19cac0bbb6beada9be9cff25c92036b9c865cc252c72c2c68fe2a340fd0b3bd02408babd7f2e043496c4c1e157bbf1c7bb0f904c5759fe8b1e34bd65a24dd6c53a2c0fe2114dac0a6598195292c0ce49249a108611c052205c417100612a6d418224723222617267cc752288880a406872a7b019009369a20a2959f842008bc6e7701fc5b81365384ac018ee8990918ec208adf14f0430816555437ffb809bc2d337f6d5657e586fabb953603fcd0b507f57c94bd14ea7fde7966994258ed4a84d20a5102ef51a39afcb7bfa0bc2143db8e2f7913b2b21a2b1c985c63522b16786ce2f03651f35d79087349025683f6f4b9eff3a170902994176ea1eee284d124ec7e0a710d51342bdd1c181a56a0cbdd165f9c3eb2572c83425b343f701207b68b883de259c869ccc601d0e73ef56d76f7496ee073410690c23b6ed325694c1eb437e90424af4586a84a87be4910fe0eed07c4794b50b0ed3927d68d74501b2d1162a6483416bcb14f6f85d393647633d0f3c6c8ea1c5f17376cebd1e762076c97bd43d66e1bf9d212705a5149854232202a3d9a38bd1d3952e9e2400be1d96f7cedb2af84b2f2a9e971daaf63a38b96865cfe04a75296ffa7a6a5d8aaebdb0dc550145b93814459964264c83eb58aa3a58b676ecc2e38bb3e30f02c15dce879363fa86d8faf69b52af83ab70a4ae4a31d3abdaadaeb0f9da450121d19fdf3509027f47e01d33a66ea1f970bedea7294113228a907cef206068fa48a6e00f89f795cd1f1879114b1137effb28788799073198b4179ec84db5880870bc5d36da34fd8e7420821ba73da895a8136a017b35235ee5253afe3b1b638819cc67965bab711d7d2e70a5bc0e45bf0d4ba96b6e7d42a99407f2a4215edd164ae38e2358902c6eb0572b69be44d855f168e19d84a56eb7706fc5a1bfd3a6f340dc40c3d00450b36a8e21174343e58252de017884f1ea8406e45ed71c5216a65a5f2393a9615b1529fbab84f8d794cea865d3998a8aeafe06929eaee487ac2ed2f6944f066fbffa186a328cb8a26f146a2fb10144cb7965ad010116d0b09520148c1da454d9119474165715187f467f0832b8443147d52a4ec45b27596cf67a596c79c121760b866ab989a6a873aea307136a3f6dfcc61e0eb120299373711a5e1f9bab6573a4c7c4ef0b39372642ef768b2d8280c52c68ad0a5b6a0c386c86852ec5f749a12c53b516b107b61d69e5551048ac9b921113d10b7200fa1ee3afdaa8fe750639b60ee2b62c37483dd90f0486ff0856c38493c281cc08a28de2ecd58b09f3b30a91e402173bddbc955523a499927e3a73af96d2a20ba95fc53cd8d40ddb060ea055e04319de4200f323339f14127c687d003cfc1747686bfd39452a1ffea23bfe53341ae754e5bd9d8a1828b2ea146377b0952b2b89ac54aeb3b9da4d29bba3f8e6704aa67c365cc1f1339bfad5edf819eccba82cb7bec6ffcc21f695de61f2160d9c0d9b98f44dde66811dcf51b4cd8fc52c7e27a54d3043aa43ddf784dd0cbdeb873fb053518371ef0221a0d7c97501640ade7c0382aa6f9a4c18af7870368be120d719f65adcf6447f06ff04b2bbb167e8402b2cf5666705b2555cb2943a346b72865f32583700fe72057facbd092f6625363e0e4faa0fde8fe7769bbefa8767f59a142973ce1b610ae2f227884cd2f5e289a07d93019d71789d681b175afcff7f2100fc92e6b953a06adc826a9a893dc2c50521fd73c4f0a65a81298918b1287e73e2aa69ced155ab1269f352867465402ea8c36361358598d03011768b6825f32909eb25327b1f542974e28aed5c5699cd00bdf4bf8c1897afc217f335eb9e46deb5a5445dddb645a1f4c05ae338588c693b6ae74094aab9b0dbb1c75fbaff94be9b214164343384ab6246dac508158a906c8768961a6478465134e05708c8bc9353a1599d4c6952314fd011b35f1750a6a3f0eb849754cc133443d478026f8e1708d9a07d64d6aeb2248cd93ba4e21451f8aeb13488e9736593ba074cd11c27060e51959b5dcdbed415a8b28ee08355587b1ee80d7918df41081c62a754b379000dc610d8d79552e4136586e56e6abf6a0e5f8afed73fdfc1d4d57f58073c051a871daeadc140e70a44dab8f7a0278ada4235331b849c229d94573d5d44e521fe6a712c25bca8ef25baaba6271672f51278ee5756aaddc8716b0a3ac8d7577863851356a9c5b5762c077fab9a7705a1d3bf8c5c742c28360be5d1488efe441b04f48cce67cf44bfa556a1cb15da43cb06a54a1fd15ad464446edca21a3eb280845a642493b4e0841406c1725229438ffe89f1e42293047e27709b916dd16b6d4928c2ef2f960bf411074f1cbead8a65023985ff11eb840760848427bca7b12d4f4c2bb9ff57abaa7e901d46899b57ccfc86fc0b7eda3bd2aa253025c276c41007f081e962faa032319e7ff5c1d45af7b1942f0258fa09587c14e41a5bacf8247d93cc2c93f8bd7c36ba89aa080f088e8d8de75fe183ae603603a183841f8e7a3f28901c1911b1a2ea885f140e4afc1957290a38118aa1188faa7733ac22a40b21f89e3e5b8e2fd263af3eef8a605695014effc9001a6f0de07462052a601b920c0272b7414928626a2bffd7bfec1415eca889d820b7f4f882a0d688fa894720a61fbb51daa8f05127eefad29f8cb55edd1abd14f3c1d1e44577e9b5ca149c3908fa81a3331e7e734e2b770b8bfe1b23401695fdaddc1686ee6672d2ebf43e2742ed03af0a280945de2880a13b3307a2f34603dea01fa530000901a6f29dd3d5793f7d9b14118a9422a855cbe972c9b726adc0d754c0f8259c04922cd771c2d0c6d6ffcca65ffc67ff61dcdaef19fd1c519e323e493a586b22838c20d0ade18d66201a1ca1b34f966770b893b113b45a3578f7f037aaa859d65d1528a4a4a44563b1348f5a015220eaa319936f7601ba1750c09d348292cf3ef8448c20acdb25345ec970d3ef3d7caaff6f30b7c522022f4a848019a9fa16375ce5f0996139579cd984bc38fc541e889d70f7a2f7ecc52314e00f40461c4db3e49b9fa34af3e5568ea067df5e80268016a8f7b27e9e11dcdcf629d027b48fa04ea579c2c246f5f5e4801e0d4a8ab87ce45d6a539797fd87c889293cdb6050e1dfa8a8ca66e5ac38bc73af490febba73f392000777485f67afc9fedec3bd94f1353b5b665510de716e19e27c25964c2a938320956d54c4fab34628b7d42f9fbef8a344d7ccb2cd3e35855e8d2d5aeabffd1e1ddaa19d97796816a9d07c655b555e09696161c7adcffa7afb90bd213d793930984fc83ce5f6ddf9b6c2f7345546a42f4e225b0fa9f3b7ba54fa523a9ac7733dea907649310b5b21ffd258dfafef57f30b3a84ab9ec4654ffda0fd5d1a2b92ececa265335863d402b8cb153634d726341d3b31a2dc1db7e5538cce76031da5af8f01244db702084a7ca68777353c9fc47dc1b5680d1de0365e7b2af7fa43caa4cf8d50225da7a2d9288528581327774e4d49633fb1fb9b5d5b543f0d7e154f00c48050ceb7cbccfacdcf617c63a38f5202dfd11d7b7b27f6234e14bdf92e746fecf3bc5ea437db2a4a612216f09854065b11868fa3b82f691c5709de3e8d7c1225c313d7f1847b3c2abbc2768a08b93443619d3ef88f96c54e0dc53d8382bd84899cfd2ebbd32b95a42b434d2af43b0bdb7cf8c5655b5f9658c1535cb62ce6dd061749ca5055a6b24436687b7b04929d85f06f8af70d25b309ba0e3f608883ea538c41079d61fdae854b26c8a167c99b56bae587b22efefe7bf456478c0a90c4deba949bceb38671d8e77d071f64acfddb870842fd9daa043c120d41d7a91a67953584c0eb0a980e3f8a2e0bbe74fe8c5ae1a09a50acc1473c990d4513b9657203c0635a77bad0c91fbee9c07a56d64c4da129c2fa105110c422c75925fc31c66516f023e71df978db5d7db1328a2ef257aa1920b3a676f7f725ca4fcac5d9214276bb767e1c5fd690e907591711e0ee8fbec8e28ac87e8d877c5a72fa57b7403f8c38276c02d1b4a0e6d73b0e9c2ccc4f5712255b601bcdb1a69f5ebd9f9ba01438f1e2658faffd3cf1f1782c256bc207aa236ef07e09669865078534464536f02d932ea2b9f17b35aaa6912348d74e65614b1a6c70f62203d6ff04e6444070592ed5b78fa0a39f4a4a064a26cf8554f6ea585b5f9756d012e4701746aa7d76a01eeea6b8a30cd37783251d5d35f7016acb7bc138ae77f63a1f1e09357fae0e4ecd05f0b14604e84622bde5cf710f425f22caabc29420c2b1b9e0f4fae5aba3211c0bcf04840fb9f1047c1eb8093810809b521cc69daf9f02c1229258aa410e774b038b52ba88962b6e6bc77c1cee02da87268e88c046c664e210e103db4f59d7cac68cd562ab1462a379f4a076961fcd16d1cccfbaddb58165c6be1790dc29b14c414f3466c5b8b2a58cbad63125b838a4319e077493134b931aef34e2ea66f61247a0705be162f342f893d95b9aba95ffa3e2d6ca582b6eb939972f55997c4c946e5617fb46f92a6605272667fa28559343f9ce21d195920421904c138a6c904e006d52372d69ed4c1ba67ac0278cfb4d936412529c76a9802d86099de8824ae6288282178ff6afe37327c06669c71ca0c91cecdf9b5a3931abad1667c6575cc276c04ab4eccea7f7396d63e1fe5b77616329e406ff6863153823eeed606ad9389aeb73143bacef9175a00ce7e39fc2b5d0ad6125fd95f2584a2c74618b3660489e759956e5af7669853dc3ac6a28429a44aee246f2fd2f78b5cd3514fa257ca9d9c9a11fb75e34c56cfc7714707add3f881eb31dee8f22da9b847cbddaf691892bfb6debed9b75962b92d336e0389dd4ecf2325d4fa035adb2a935920d032930ec46212175c0749db10bd930a96f85e5e0f981f3e1f3085191e325ea7b301be97c42f7a4b11cdcd29ef05e07250805073aaee09c74707f04725166ea4a9630aabadd9b733f0bdc4828f24217b6fb2e5de52ca9464380918093a099af676be8f74b396bee526a77255d79df7ffd6ae5ee2341996653b557778a5a5043a744f94be3892a85c90e4a1b103f7c45257c5c82a29a99810626b013706103d682d58b263d490a43e31b54de5409f28d2ce60fae2c8084f9c7018c189a217e030421353ad296bc410839a86143190a82206241b0d628861090c6af00003152650c8000312150f3ae5800ddab728a8f62a3105e629099ba72a620881fd6910c696d717e44a3c2b601c19c17082fdc13072c0feaebf77ac312ab158b2c1ab355f90e7f882687fd144059e0fda24289a2fc8a98f075d7c91039e7fc12c4ee0f9335fd07c777757e207ec17bbbbbbcb7c414e3d9054b224f1620a3cbfe5d44117319c6f747a40b1f284e5ca1357ae60ffc78204f61fbdb801fbe7c48062be206fc2abbcae4ca1f2822faa1c5539a28ba2a62ebe80c11330e8c20a1254a460f50202152578fefd82e616f04a942d9690b2c51b5c7481fd59f74e0dc134ebc10c365450c414614a8724533cb57184946ccea97191c464ce39e7ea0b9ad96bdd603104167160ff9bc515ec0f3a2161ff9701fb8f5a8091c3056c4da9827d8b2b8ab8a20deca04c19292081110b8cce285ae30a2b5af0030b66479c685b90c0eb971e3aa740c1f32fc805cfbf57c6a81629a4b076b8b9d56ad933df5e2b96b082060c4af104fb6f56a42019b17bd114033b850537a8a86aca89a54988a62398aac0f3e7fb20441c6d38c5d186ab10731928e102ec8f80d8e469b562fd2790d0026d80e7d3f96d8568bda2485501c4184711d4c51c6c5cf932545c39fddba9383a4cca2b1f94728ba7d76b528a375677e2ea6fcb7ec70122b8fb0bb22d76df3d2bfcb19df4cfa70609d335a0d5fb73e210eec2ece1ee57abe7bcff1ec887f0170e71ec89eda47570df85d906730f34554a98e2fe5a4927d6838b7d8b60ebfa187365d5da16ad5ba0ef43b876325037a6c8ed8f99e1b6d014e5094b2c58364529829ba8e882a927f3c3b53237dc6f31b930dfff36e3f7df9797b2961debaf749e8f01447ef8d8268c00e710cc6957b259620babb005be42f9c3c7165fe2f4c764b95942750671cb28dc2f37bf30310df2a3051194dc87d274e85c32a2ccb7be250ac93ccd0f7d63c8845aa22b85d6ca06208021a3f9219a1f92c92266fefe26e66043860a7a67c41f0ea30fe4620b39deb82d13ba6644999f81f921592b74a5d0fa988f11855e68c8845a0f233671bdcc884d642f70bc84f6869e1bd73fc70d36995068c7490f32901111e18836a26434df0a853e1f644462cc90d1884da6f57e25668b5731456e67a3c485f998db6af98faff532392f39aefb99504ad8b63d953bacdf582fa1f45126cc09250a2d1c6ecea11a270e716dbb415862ceecb2fede3027f6c3c797d0568dfbedef775ba8ca89e5e8c47ca4f73731b7e02375c1dd7e04e9fee56f98a910defe4504f29ee1b3c255f8859f7d2f1ce278aac22139b11682f88e0cd2c20f1fe98ba0040ad307a24f02fd1cfa31fa31218cd4cabf1674620e36ae8e0cb59fa1d60d998d6b684b706cc5cd07c09a3876b93fc4b18c99baad229934ae7c192657ead0499b4e7a4f50ce2a6bfd82b6eea9b5dddec77c31fb7f407bc588d1c2944ab976deeac43fa0add5faabfe95a63dc5dd071f7ccbcad7b39aae86dc4bdfb1bf7a6a57331fdb68f52bb1ce7cc70a739ab8ac9f79f9f96089d29b0933f5617fc8488cfb7d6b56594f5a4c6eeea49f57eb98aff2e06dc29fdf4fbe23fefc86923efd2f25005eca57f772be9ce06cbdf41d98673db9b9937e8260cf3c6fbe5703be9c5f1697f5abcf2d64baa43a780b7e370c73e3f0c530b35efc97ca46cc8e55ef81981d8b611876966e3e88bbef40cc2000440ec4e9b2a0982f8d98ef8c9841993cbe8879c45dafd8501267b6ac8fbefac24c716e51e918649f61f6c1265a4f5a624a529a89eeadd1491bafb25fa374524f08ed9cce7a3eb4a759081e42a71c1beb9860c51b31c7c41c1f1df790383506885b5f2c817e8b417ceca7172cdf46895ba42826b34f8395152942c3cbead39023d37efb2232741cb226f369b0324b1fe4ee0c3783f4675e200375f305250e7d1be690304a801c62ba23832045c81f60fa302e7bae6212873e9ddfee6474d2a69345dd4248d8acde8bcbedb05455ea0dc5d2d2142b50547081e294e5298a8b149e4f5dab4a4c949e58dc33899b1b57252bd2e78adc017d7442f2bc2b39b93c0b3d923873723fdf97a63b75cb09dbc41f13c672dabccf558c59ba2f6edcece1f94a4b4a3ece239a4495e8114552fafa5d59f07cbf22c7f9ee848449279e263c5d0a3c3f8f78b6e85624cefcdbea25ee8b96c1e1ca97d9e1ca972fd374e577364a5cfa9aadd4ad1297a88bba67d2ed386172c268b8c20c577e1e8f9c8d4eb5b444cef9203871db874eda647a84eb77b27b71b934a86a1486ee092c9ba058c18d8f9c0aa41c5d687ab8f5ddc895d4235c5b02b911d78b7c1cebb7c0b8d98deafcda4748ae247d24ae2d246e6e6922b559e2dadfeaefa0e1b6ec84892e94c072c22d1feb97c072c2fe391356819cc3d2c8c59829de0b1c37b7b62940dcec452c96af1493e5662f52c4bd48c3f21bc9c7fae2722b2d617e2b99583e88ab918f9512d11935a244b48808ce21906d579ae846b81a71b98d9b1ed91fbafe996509db99f334d3914c7a724467505880b32bc1734524c311383b12142457c27342c19309cf77d9d3bfa01c145cd708d282b0e4f6d3f470b3cf90f88e1be1e94b73ce1f2ff8b7d57d34df91e6bbd17c1ab6aab8d9c620dd6c59188ac499dfe10ac700f1bdf4b4a74edae4b62da99b6387bb0a85fa061b2029c958dfc9cfc12c42520b0f5c1cc958437c9c9fff27d32463e46609f5d482ba56f010874dd985e8a3ee6ea9f8018a3f11887d6d041bbbd3f3fcfdf7fd270e117272ed67d9e5051fb9979f099e485dfaf8c3a90d9287d01f3e0e1112e2638c969ba515895558210556b8f2b0e5e32a945792a08892c9ef82596ece4961eab8e8e35d2edac89ce0bebed0fa7ab6fa753ae99cd4ab47676b7775a57dd2aa6d965375dea77dabea75aa158b5615372deb4e6aefcb7c698f839994568e5a6fdb569e67b574926b6bfd4edfa667dddddda7d74a35cf52ec3edddddd77a6e65313e974ebeeeeeeee4da9ba33303a15777de7a3f5eb00f6ca51eb59ab39557195eb2a0296e73bdcd701ecdff5819c0341270295ec5422e5b4d070e56f5fdc1a2c9b5eb0450f97a60596883b33846acb0b8c9278c10c4b6e0c964d53aca1b1e0b6b06c9a020c0a86b533534ca124e649660a27d803fd04d7231fa5704fa9dabafe54a5ea547daa51f5e9bf3e9d418968d1949a539b931597f49086b23f27f623e7ad9626a59473ce6c3f88f6dbcf1226d6826c6f35cdf3a4940aa05f4d682c02b15f29f6f7a762ab05be5661a6ddfba77a0ff36dead68589e5e7ff805c06d99e03930342787b2efc4c105bd60a5f4f5cd932944082d4d7347103f5299d49c1cd8fc719275a746d40943e46f9286160b82a2c664e20b9bce73b79a83fe923c52ad1fac8899e8f9c9855ef59cf7256256eaf0a7d7b0fb9df8238778edbace52cc75465c969f577798b221021c13a45f742b6774a55e106ec7328d4b6a0777da3a1c46d05e7c0b2a98b14f6cf8aade4e3fc4d9c51136a3e31dd77229168be17cd6fa9f93d355bcab6d47cc2f3a5e6d47c9a5194080a44e2fa4bdad54e4a1fc71df73d170ea1d8ebc22c04e74f94cf8540ba211477df710fa4ff13817022105709dd7362277e12e30d6af3feef8770988570f7b6b96e6863220bc155f49744f84b4bdde8a44d9e52d5dd7fbce0d0d10ce2f8414a065548a144e6370d282ea482b881890964fe4e24e54a50293529a59452d6de4c6805501e4cf7f1fb8fee5aecb8f542955d9bd2ad583675394387db62adea5ef076f102e7d1a9e6a0c57cc1104b9a8accc462cb1b559a6801850f6ac4105eb1822850da408242a20c55942c335069571a77c1827d005836155103abb06ceae284655c8a1581657e0289379ce0b04618455099e2e4040aaa1cddf084ec5a6101910a44e2e61bdc3dfebdc82f19f0d0850cca685a03ca0c7c98011bd8f39d2560f0c27ad9dce8a481843d8d26d43082fd4735a0b07f8ed413d85fa28105f677376ea6394e39767ab0cc3dcc30d28519639c3144d3196c7039c2050a9737b07f7b1e5417505c71a5a80434500200368ab0a031c31860ec209bfd3048220616082eb8f9e6c679a8acf5bad1d952e4c5162d5150444d29238832a6b053c704fde123a533236a667736121fe957d105828ee43337a28f29cda11fa3fff447fa8a72bd9ffdbf384d2268d55699484e5799efd835845b58ee7c457945b92dbbbbdbb7551ec23f5eb0bbe8fa04d7b16ca2410db85faea81799b9912d44d85fbabbfb949d83d645b70098e8b8f8e8523e7ad4749a30ff7e8180911b346e9653d469f2b84c5403bbc0e585198be5e48ce3bf9cb24b97c9e98942b184fd9b29c7c8dd7ece1348f0d1bb2ebf0ffaf2971c2999de487cf49ed51cf14d25a55271ef33df719e7eb24444440483f477248efd5d8913f6258ea4e2e609be93b9969a301f4fa8e2cef721a5b50c91b562067fc4aceffae8e81671bdcf3d43e23b8eadd84818b07a6b99f07176b7a53cf6d2b760b859b6de5562b63053cc604b8cb1164614bba7205eca2c608a80133671489d0fe44c6143f1d1bf4e5cf2c27e27145a8a68d66ecceed2535ec48b1a8af7d2e411e2dd4cd2ccd2554105145468e2fa48e166268b9b737a96e323502ce76c6f6f66de92a1c6c8cd2d65edbdaa2589f346124b4eb47092c9e2bae1239154971c3adc5e7298bfb5bdd456248e7f4c979b6f96bc89c0721ddf21ee8d8f73b6a4d4b7d58637f1e6c677a4cae7093c54865fca89bca8a5fc7b2ae6069716f9e84b325b644d0eaec444fbea4ca40f0a2a0091d0627ab97d6b87ab34ad28717ebda25c7fe1d7119542a489f642449ad0efb8ff4ce8d7c49cedaba2cffcc8917ce646349c71723325ea50154ad7744fa17b4f14bab6135d0e90b297d1d0b2eeb39532a19675e20c969b7dd6df81213ca7d84f46ec4e67fed4c89f12f9d3a2a31b5e51eec42c4c581437cb252019125c97c4e210de81e4beff0bfe2cf8fff06f61b98e3bf786f0949e7baf28f735d7fc1e52710fd7147570cc47e741060afe2af80391708132b0bb3f0b12c7bd27275c4c14242959c7c529064ed4b1f62f384f9b21a57d1361ad890c2358d3344dd3261d1aa13d0dc9174fa46476c2b4afc9e1d2d780a6f6c2b460100d489ffada0bf19dd790192a7e08f9d60d6e4bcbeda680422079dec280b56b03d674c0dac710e1305a6e7e61edb5a58d8bb7842bf79d90eabd97ef855d3461f5bbb08926ac3aa1e03bb9a51b2a541b212e6c3496983a92cd4c71fd97206d4abc5b824bfffd0bd23cad3e0d55f0b152147880516d086ee10b0c62490b24990cd1b5b66aaf7958c813973a15c13d90a350dfda9bafdbe41f472bd4371c0d4124abc1a1716e226d6bf958bfbbbbfb0b8249c3668beb9f6dda884ba7fa5de43b8ee485731369978bd2491a0aad5ec8fbee55a1d0f7aaef565fb4ba5c896bb0441c4cb22f943299248c9081724121d57f52f37f93354644297182b868594ef3486b8ad9138a79996f8542332f24b9d0608b1559ebbb99b091de28c34876c47d6d14c786b81dd6f19dd6f7affe763356dcdc6a8d71b5cf2dbc69af7a4dccdec3fcf62d983a13fe3081a348860437bfb6ed7720b91bd0f6246c9fb37d6cfb971b37671a21db3ef6225e31dffb891904652865ad50ca3cba7d67095d263896d886398887e94f1965794ecd10aa595c6144920cd3ed9779e236086454316a25b9937a7ec4c9dd63407de54e67a3d1dd2d65b56b97be9a620c94db3f77e8a44df70611540ba95a4bdcdc4e0e83dce9263912499f9ef47574acbd1704dba999382d4894643169dc4e25e3e4e6d6a40d87544b35412561fa459852da7445a9d6b391f84e23d1aacc39e713283b14c9bc0a289e5892cd64715b4937cb284c9f529129bab98b90b44562c31f326ae6889bdb8936154c7bb410207bb4986e0c113eb4105605988ab993682389433fe68ddc464e64b4b8b935bf454fe9e656abca9d475e0a984870988bd2159ca7951cb52044a88ba0a860e7827313893e352a24c41871f338c6f01643c4ed16746638014dcfaccd6aee558a198b81a0b5e214e3f66f729bdaa4da9c734e5ae79c73cea694ceea5bdb39a737e79c533ecb0d5aaba6695563c15b686f6a4635b491a390c9b37a51f585de883515f0f672d46c56c0dbb79cdbb77d69674b9cfab8d3344dab745220f3a9a67d37e714bd6f55aba7fded392bebcefbe2491551455067df96ae7dd2faa37f489f8e85167e3ce1582c27671cff41f0dac891be90c9d3b3d95401d797237db902eed96cf69a46297dcdb66cf9633e8feae5ff50852d8789d7da1f5e55799ef63fa44f77e98f2d047d6c0551b17eabb9f27e481f57899e83c4b1bc1fd2a7eba4151a214c5df915cb26244ae4e6ee1bb574d649e974ad4ba076d50dd13e69dd6a4f3d9856ac6d7b56b80abfd0a1fc69eea00af30bd3bf79b98d7fe29530afff3d5d7dd6c1540c7f22d1348d0489bdf721b1277a9b2acc8f552afb9caa622b86d99fb4da4435082a7d67d3b4ed73b4dc4c31a5dd77f46fad9ee7bd0f7f4f1cc25ad885b971c7bd6a48c5d5ba512a5dfdaed2705a6bdfc7b4da10d61c8a05283afa43ddfc21bc8551d75f9b3bb40e7fc22e5ba90c373a292a2aaa9fbaa39e3a2a0a0f608fd1240c2b9e8c8c8cdaa8710d949b299d12c7dfb3f961546105165a186d5edfba72f338aa71411f7d6ce3e6f1ce29f5c6c80556822836b01cb180e096d302397a77fae85a4617b83bb52074b979c4de63b4d267250611a61e8552ad87793e61f72e431a6f603e615fc22e85b3d011de404b61959889cc302702a10fa4be96a9985b0abf70c77dd775620ed252b87beac3e654b9ddfbe7a325829e1433fdeaf1d8f99eefd0365a82c0e4563147915bdffb828a3009a97f419ad74ffa583f6db32a8f864c8290248eaaf3be1678bf4f5382673daa46128786f7ce240e7dc1689af612f38d3494f98242a5279386a669e83ba6629600963eca78312d1a4fe6036540106cc5c080e0cb05419005ae3e10044140eabacec5dbed3e370d57d14a9caa537368d5b4ad568d6a967a9bb7b55a177cbad65a0fe9f5023f8a9b46787e279b5ccffa38e95c652078669bc37ade77bf567d109cb817fc9597a3c9ed2ccb86354e1f2f7c5f5e606aad55d3aa56b53ae2189898971bc35a7d5e4c4c4c4c8e9596c401189df42e47910b76d2a54030d43748e1ec7948dcb62e708025176760c1c5194434f160460749d8572f57d0a44b1632221d84162f8290b1fe0b8542b0414664662663d11a5e0fdc6029e5607f2004e85071bf5f7df7de6f3c8e2e3859525abf277754df1dde29d7e952f111c97e419525e5a33fc792c29b164a0915c1128b5e76c51e2e8b2dc5bafec6d747d625f2bf45fe2c297fd6940bf3810469e1296e802a11056e11c8fc8f25c543c9cd2ca90e9236d893cece4b6fe63b948adae7c891e3b53074b97ebeab046d7e0be96aaffe829e030e5e402e33c5d55e7e0b682c86ff7960f372f2f47cfd0f8178f012d3305b243e56a3ea12c3dc58f47ac22aab0973e39aaef2abc9c0954d3820c11cfc374093f5f0f89e509b4dd8cc36df6e7a4b7cec90fabffbb0f35eecbeefa847b3c4471a241f9de2ec587d08ab17c006e3688e244e68599f61660da8322fc71237d794d00f7b98986fb2363bc2b0f7bf09bb29b0b071e7747323764eb08ec98d9a255fe35f33c577fefd6b9ca40fec6f3eb3b08af598e60520e6a7d9687e87982fa6d9baa909f357bd7f23b076ecd8f106f81e3b441464f0f9d8ffbc8ee84a41e77bdee58a00cff7e83c90775393076686d34ddd889985736780b0000f0b6b8a248e3fcc6cfafdccc2196606338b8505789f30f606086b60e10afb8839a262618e028439a69edc5c73348bc2fed5c9cd51c4c74714ea21c2a4d0f3b18f89423f224c8fe842c13542c3de6d584a92799126a66443329d4c3385bd2794fe0e82f7d61cbdbc7c070b1d77edc1c2c63547d3da996b8e60a16714ba604f4436d404263a40ca62cfe363bea35e4fe8d47760a2d613b6cc9b4d9e29f3f78ca40f4ca4b3ce95662471bce7a7ac471422228b89da4c2774c1be0726ba10019e8f7d0408f03d1ffb1dd84b99d0eb892cf63da290abebe9115d1d1589e3dfd323ba601f135b459c00fe3a5238c3d04cc1c4165158e4ca7c8699ade0cebcfc8276cce47cb67846c7cc003e837806fcdc019ef98e8af4c179ff8ec9776edebf9be23c3eefdf2df19d10debf43f21d01bc7f77247d60e367f0c784f97ff0d9f1f752fe7491d6e1ff3d8fb0489b4d9e9e0f01f6a9c0f33f2f3ff9a5b0f33fa2908bc70bbd9ec87e5eca765e7eae9b8fbd503b91c1248b89ae1d381f7b21d81638acc862afc3236c1c0b3b8e2225d94fd84484efda1321dcf13c428963a190a4410f7044c988783390fd884d767cb7230ce1bb96de7305db1116a0c812069a3c950a09ab7f05ae9f23665b05d7d751bfc0f5070085eb838f53df27ac4f1c56ffa6be00c21a425861619d499caac46145faa7ea2075d4f7ca04ae3f8a1964826b5400c4ca03aeff8198dd46cc16d7aeb107626eecc1d39e07f2fa3de2ffebfb630007ffa2fc46e82004f2df18685289c3f0261cc21d841900af13baeac75ee7774257155dd08982451832219d271243828aac09fd9edf791e15dc5c730480af39f29d0c0b0300e1983362c18168f39238268cab7d7e4580e77bdebf0810e063ef5f0a3bdf230ab9154f643bef5f0a3a1f1385a4942620aa90e93cd0ac19c260983b0877c24e0b198d36ebaae43a6b85d9c67830da8cc3d99bd5d8e0cd72855275f0b459ee98e41a2daa910d73d5016798990b75d61cd5244d1e0c4cf1031cb32c69bc5103997f8dd2e4f1c00c2827888cd020e58accbfe668f2c829359488824a0c6e48c30532ff1aa4c913022ccc4041142d5a445de9b490f1ec8452d6b5b73301118ee0424a4600d1ea84525675b8d9c2ba211ede01101d929b5fddc4cd3635adc39559d89094850d47b89bb832e69249778d8e5553c4ed9f41c1cd39d84e3be382dba3cbc9c989494a424ecce783af077b68f5c1d79863336dc6a26beb9ceeb286b044b1ff0a4bb043d12736a4e01980c05932b1c1046749c58a7caa74da60a178be0f8aa78d8d0391901323b20222712518c61582e76b21902114bb4ae8ef9f435cece1a3fc29c67c04c3b8ed53f4f1f29d1c9d988ff2fbe682d22eddc02a018890fa2e1380489ca5cbbfb194924926f948646f8b12d1a22935a7a4947c2792ef4595467171239b60a1dd022b58a059b842b6522bb59366a25b899ed1f992ea2b134afe648653e5488ab835445ceea7b8050c94600160b9c5164cb3b18c16df489e6c49792c1d21752db22045104c829111b37c9907721ff4472a7e17dec984d2c7980bf5f2f761606062c27c710c7ea12f61ebe52787b06cdda7f763c22c84af7d98b0aa24cce71bec3b3916e81f09b3e5b67efe0b7df9243384652865440bb48e97965c82f412c2c0c084ac971f9d491c0f7d899111937b7f267d247e79f91be6217cdfbfa0eb32617ebf8ff92d524a5f6062e4108e09db49eb7861fd0d59ac59e8488e543dc586367f23021137c9958e906060b8eea1bb9f9113fbd1c2105d9ae93c34a2cf1ce63f23d21913e20c16373fce74867d47da16133540e11e2c998a889c70bf277d4a98af79f6a2f9c4c77e2042e6bb4cd0dec5bdc456137303d17e729ef52221dabb4c70201b56f231d682a0e87487d289001fad0541d12758a526664b31085a1bb6ffc8b7d31b0399b2d6d112678a58bebb67c7f27bce39e79c73ce39a5c491cfcad2b54f5a35aa6d53d69e1d58c2b0fc50f2bce4e4f4264ce5152c1f4b1ea07f51cca0682bd7b2fee9077d2e8f10b07cab0245076a1d2ed6a3db6fed573aa95daa73d4f15836f51481802ad0d63749e966a9bd4824295fd2c76f20c23d9b3c2f876dbfbdf04bfaacf0f6364adcd5b366db03396bfbd5f6ad2337e7ccea17e498f36eefe65e12677bd70e5773f17073cfb20b6f9fa554fdcd5240a2d03ff2017247f5db4b40cacf69cb8db374f25ed2879312c6799ef779dee77deddecb0f05570a53b6fa295b89424464abf744ed0502372cf92871cf1a0eec899e7463b05cd242021cd69995382ee9337ffb4eaae1afa5234b9271d588d580bb87cfaaa89254fdf484fb73431571236e3404ee7725aee44f1c4a7626dc6f3baaa5fce8fbbe9735c0dff7fdd58109fe1edc2106fcbdf7057dfe8417262092795ed7c25df7b4eb6634e06e660577393c81bb577d411df705a92e1786ed81b7233ed8c7f40a2b05d0816b353204ae46d6c0550a0e52683002d1e40a22197d2be75d9a6fe7df2ff094420220f0bcc1073c9fa796d1444ad175c25f7b625ca5a533d2e82c314829d2428a0d4460b7d771e8a4cd7ce9ffe9913f614c5a3145112c7ffc2b79a4cc913a72677b26099309a8c149c224c618c8431a52293544592f8f17f4356a9892020a14073636d287c3f25d3bdc89a5cd2871320858fee7c8f1923929756c0f9330faf2833a9fdd540173f30bf2dea98a523afe7c2075f4081cee441b89d3af0ab930c8c8612bca2b30b5314338c5518392144b6660ea62446e6f5540df77efdae5ea67ed67bdab1924c7a974c2167f5ecc819c0837647d36499181084a0a26fc8a4e8a3929a5f4007336a507a8417476d610cfef3929a5b4e7fc0ea4f4f9a4f43a95949c757777dfb44a3d1f65fb4c77efbbfabc8e568d9b2e8ce0788a2cdc2db258da665b5cadf04afac8954fbfc42d7edf57bb764a254ebbb77cbb5a751d35c10dd6a8437cbd841127049d6bf4b8584a0c4ad6c0fed655584a8961079c034b2930b4b144b734c670cb4721a602dc2f2b604491130e35d8125582a6389060d9148794155836c5b104ffa6e1dcc274c98a28a0e0290e71ec0110e717888888f01010b356520bee7c549f3f2c5d706188c52ed4df24ce9ccf85744e4cb710678b359cedcfb5b871b6138b4e3a0f77b91c58c70a86bca6fd37b1316d5336a60d8bcd89ce26ad4b5d70ad4c354a8552976a94caa403954b40404a452fd2c72afa6ce647dc48d1119ff98c09d8a426aa412daeebc8650297514d94cb04aea319d01935a248e88c26a1463fd8238b64912c1176893db24448d81b72681e1df1c8e1318fe6d193a9b4b4e4e35c5a9a50cc275369423197e6925492f23b20b7b4da8e29293961423a51b2ad55d153d433eb31d253d473a46746839fd98fd10f929fd94f921fa39a195cef756345eaa317f12827c3a19c0c8ff228992457a607efde2963aa48cd1997fae876041da8ef63fdb6d977ef569ea554455fdbea043c714c47a5038555685c4e07dbd7ece64da3e82837ea3156abca71ef514adf7eb92bb54f3f1f34a9c7a0e0eb2b0b267c019aabfad9f76c8fe175523ff54f9411ee42cf72e9286aed10ef31fa87b355ab3d46eb481a630aa91f236c7f98b0fd49d2fdb75269bf127357edb9ef7e663f493455948a0b149eb92679dfe51f25f8c708d79f24dcfc9fd90f12a35a7f983077c6b53f460ce8923cfc49d23aea7707a9493f491afbfc49f233fb49f263e4b566c45e4ed4b48751bd7cb6bffa9ef53caaa59f0ffbde77d282af7f118233f7f737204c1f687257cc12ca5d8559276f39d2bf7aa167cdb81d100f1efd935b157e3f4719501f685a1d5c5f93a19336597584e777b1336c7b96b0c548dbc7809e23ada331eb57abbf5f43abbd676f7bcbd5209f26e6ae3d475a07f7b43bb205b9ca4885e4862a25af428267ad1ff734cc3d487a6698fb8d76f37b8a7a8c70dcf72ce12e2ce3aa7a663eaabc086f6f27cfcb7362aef673905a84b9d7eac3843264408739b1e7c8f6b3937a8eb48e7e20ef29ea39d23fb26786fd55476774d226ffcb114ed830b9a0adae148456475896649a6843570a55a8434356c55b995c6ae924c05311566435ecd090790f33e963ceef292c168ba6bd6f5ad544397dba947b31b7d7de7b0b5bd6ed39d1d484c9747871e5e79ec22d61f5053ba5987492e7d6226c71287a2187eeef0f4c7912a40ff79e63ceb3facda5b7f781a0776f9757c0aa970ae8800a61958a7bc9d9489cfa1fe0fa5225e50a585239859ec0df25951aeae4a4554e3a6b9d5aad4995cea426f8a3e1e176104b7a3f55e3ca6f15b488b013899a9c445a984ea9260a854c98908ffdc20e1257be13612087c10bf4d93da597f8cb3b3969ad9ab66dd6725c93de5a85d4759ef77d5f5077f792debabb59fdacfb051519c1dd0261c96d10cbeeaea6852dad5fa65fa667667aa6bee3daad968ccc8cf705753432343434ad18181a9a974b4343c3a2597d343434ad5abaa16b4cabe851f5a9d6ae7508fddbaadc77773767fb35fa1bf02e18888b56f448d0b27b57ac7f9a46bffa2f5c2971f3060501249cb0bdcd54f934a2ab8992473ed28e42e24c6702679f8227d30a6ef628963c0a6bdfbb56777feb4e6741b0fa5dea58fbab246e9e2d1d55d81dfdee7dd0efc421ac0aed7343b8436981266dc772465763a5a629d570a9897299a07f5a7bcd8c6ddb680d174bb3a66926681d2360da5c479aeb680ea1d9fe6931ecf3d0f0b226f55fa5125d266caf7a1fdbab44d93ab2c52afa2acb59516b1db3ffe994ee70743f436b7fd57d278232b8b576b5ab2478d5a39ed735f6669067a4ddbc6c9cc7de1eabaf955559210d2f6be26ddbf67d9fb51dd7bd8a136992d6a139614dabce24795ce3b0145fb0cca1cd6d73296b3dcff37eeec0026541471fcba752a461dcecfeb8bebfa669fddcfbe8e7ea6687301de255874ee98e86b669dd6fe10dce1bcdd9229facd534ed7df86ba2c6fdb069f5becc5fb5aefbdb691ce7cf7157e344326ea678dbb696efac7e7b6a552a158bc57a1ffe2c11ea398e7bfb792ce0fe389b43819848e4a67a95083edd0c62cac2b436a367a8b46d7585450b15a201000000006314002020140c8884229148242293a54df614800c8096407456980a644912a42888318610830c210401008c01404343430400aee422c25c1b409928e20eb26c467c0e4ca6384123f21e09cd806d82881b4866fd25a7fed23b9acb61b290098e018edfb5bb9e21cd89d7ac1df6bd3347ae61c535983411fec740e701ce8e3fb0cfa34e2b99204ac9a302c38dd8a259c5e964b56bdfb10125041e50fabeea92cb5638f112d6e3873caeaba44b0e20b41cd7ef3330bfc28c4fa9cd75cf28fc109b8af91b5cb5907c933d9978380b3b4887e7d2728d18e87772fb6530beab6a59d51a72f8d93591281cb80ce7fc0a04dacf3a727aafc3f0399edb85b204f5c549a310d11a1c9b5dd6e7c60e4d358cad0d4a5f5a3cd33fda48c25def7975aeecebaf42ab3e8d50893749ea7ffe0b6cc64e05019fadf336e93d7cbbcee33491f23c0c47ed758366db341aac0d641b4fb8ba15db828c9412bbda9a1cf476b9ce011151c04ba06f966686a4a6ebe61f2b2940bba816e0b097b35df63cd01b5643b928bf454e46a412eeb093caef3b0b66afcc3c5643cea24a06056b9fcdfa2e200206261a8c55cef1fd4a8083e73ecb08876a1b0e590d302d5a8055cca152aa29dbcea115a317475ebd858c22c0f8e0101d20063efd3b15bf4189c1d696647d9dc16b69e31ee078410370651cdfd79bd7eaba7f00e486eb46568d16c967f040c54f215c588c8b9141876e9b2161733610158167465636dffc128422d80b4d1ad0baf3e46974ab82c18954d0b278e48754ad93f5606e8c3df45fbf7e732995d52053e372620a9fb041067f5b490c2905ed1766eaccc06f07868c18663c104ef83dd33a60e59aa4673b1d18a572c508d0aa2fb983a8db685abb247cbedcac8c08d53bd2187d30fef67432bd233578fc9645ff8651428ac1ef08711adec4267c74c76b42c9a28e40bb44c4ca21145826192e130cbacd09015225b02f4dff4fa4def57f6a3ae14a1498beaf29cd5c58ba9ddda438c7e0a8b18b6e23f43bf8be5fac35a57db64802cdf2cc494353b67b446a2d2af8b9dead45b252671aa86feccff95a8d56a6fd35b1915c9163a8c9851cb712e8b01bff87e93019fe2bcbb3aa243c6195e46bbe92dc8208896d3229ef1bc1a7369c056c73b272cc95544a8d001ccc0ff817a96916e667ebb3b1f5cbdd8e06a90b81c6a022225a07e826f3425aadbd8a36436f78e96077010642e9cf226d2db07f5a48d42c895d4669c2c494603b60f6115fd290434849859b3d1056181cb7778d112c23fc04aef0e956f05ed8f565773d2294992e504c1bc53209c0d928843211838d22a03a85041b11196ed8675977bfd12d56a5e538d96882458d6a4bae466d354830b3b634e47dce4a20d15c55154b21ea646ff767a085cdff7cf92086f4c8e943fe67d4974b10ba6c28d49a3fc88d11aa48dd3ac3654ef6a51b5834629eb151865858997f3074d67b7795c2b78f7fcba31abaf0893225bad87539905d63908c9d79f3520ca655b4cd85a4715ac94542c407c3315295104458f2ba05c4f8d4d08e4429def6b97f83ef2844abf2a67d29744dbce9f04dcd950e150ebfeb325ddb6606dcc98f16203f30687c5fa05936aab142fedd9e42dffcf696505a4a8c76e24652903024fc2ce065ba9d7560f0984a920434378dd8d28e783bf809d85ddf2633d67d914eca9218ed7d2b580f3b714536074b1481e0743c42bfd2dc6741380e01d697c2b5415bf2578114c3bbe1d544b0a7d0911cad4ccf1ab60f2d3892632851816d678f036f7e57967a52b43c4934ded092c80ef12fe14513f0458894230aca858b3c194b35f23fa1ba520523f0a49d6816553c27ccd25537c2586d8cb8eaeb1cd68320f5db5528fd1b055d11e892134d331ca5c985967ad7cbc70b5b5567516d119206b66638cd70be91a4875b7af422ae1add03662c3d9d6c849ece67f94a56b8300a3d882df4f45899ea7566a67a6216a74df40ec019040830582e17cd7275a5668c2871e0936baff0d52fa4e8e69f58d9a75deea2116157237ddf1d7365d682a056db73cd62550d54290b809d1525597a9fb037fbfd4cd1b80f1956a692acd31f89d0ec09e158ca6aa665ecf4c968b47e85221a705932383c4a37869b088b4fea63ae5ad8deb1097823e019b55b9d4daa4beb1e6514c12575db7c674fb4dd2afe1a472dc3c002fa6c2540c0eb92b8d91cf00bfc5869260cadc32373791e8902814afc644cd34ed76df5f8b1b644fee5e142e4d6bfbc0fe5f265a52f3aaf0b7c5fb0dc41775bd0e958503c2f151743dc6f82c4fdc409e6ed5fe69d519c434461d0bf58010665ca1f9dd567c9819cfba2b90e40932dec918212672edbd42d1112db18c64021298cd19a7c92f55a569b3b32478087576e2b630f48311f526cb00b5a91cfa94e7546672a84806c030c3da0e07d1d82dc5c9861ea6f9b1c59caaab286728b20a831034988d6702d03c6f17c8d2870fc0ad1df150dc470232a558bdc887a744a94919be00153ef2d02f02834a7446f198e42e201e921bbb00252fedbe01347ef0b2cb68248b713642484827323a85fe07739d929ecc90094de9b45de055d651e4f97c4caa2e2468dd42da3a803a24e4ff3573aa4f050f6043f551d4265647bd0d8b1e9481375274c1464a1ea1d3fe4b13ec3a574fe9df3b53fb48980cc2ebcc06956fed453d3fb16d743fd4da5082e1afaeb3e817422912ed3bba69834bc1539217d583b874ff4c8d1eff11133568ebddbadc7ad813a9ae5978064bcdf79f4ce3a971666696d907754148d3fd07c6dad2fb831f2f8ce83ae009b00ffe8763fbf180823d755784853e96450dfaa90518b1b6fff2053c4d3e987786e25cfc962a941ecaca1e8ca51e65ee51037cf8b31e3c4514581a3f2065b3d174aa4d9952551d83aa06c220adbbca35ae8039840bfb0044ab0ba205e1f4c15b107343242f34adb20bb7662a1aef18fd68975e9e62310082c51c093c34465412a7f73ead062e09b90f3a6e08a0e8e980cea89a662ab1571400caf84b803b1028eaf2ce6eae6fcac5cfd624cec951b634f8d3d997a2eabefddcd302c7e3995f76fee067faf772534f42f199161e940aadf538cecb8eddfa562feb9d7fcc3ad3b0848943c2414bb7896d9c44d6828c1e07131f229093924dc94785a1e6a6ad4950642c23dd6510e9751ea8703dad3b5a9c9f84b7cf50093acf6cced5a7ae14ecb4d61f2df8ff48003f171d62eddbb3f8dc27de10f5a13388f23ff4880f7b55ecf0ea045b79be4c886a9e070afbc84b2bbcc63d8b821079578561ad2180ada681d20603b1caa2bfc11d4bd68e05b40b363fcb86e5ab7913fcd82d94952c7d6a6892d806ea8ad1bfa2059b55f26521635fa55eeb034a9e2e915c4e64e9f07826570d51d6aebc25f2377ea937a705042fe0565018f7e98624fa6b2c71e958cd3f587a2b74b64056288f8492a2426cd04e093ca272cb7743b7760b71cc17ecb1b7092bdb604278725e47cf74776b05928854b1615cd5586c668acc1aa4bc4b50e3608c6e73768f81f7d9571a9135c18646c2ffc514cc139bbb90f72d73aeae6ef34c252bcca1b1cff21ac1866e7daf216636f489eb34150c73579b6270a8dfdbf5abba30dd237a85bd71aa448d7a0acf0e7d7d398d14d5314f169c6e5062ceb6987180f30883590d8c9741ec84eea12fa4ff6640d791d999a948d6ef5beec0a82415d8689c55e0933f5004c327ab367527dda88912b607c5a15eff1a7bd4b854ecce72f51db5452de780e4b978344dc2b381c44ff774a80454710d161431e74c3d6d7702e850e167c0debb2e45bf9f7fb7d163fbd895dc86771af436641f81b981bfabf82c5d960736d798b9c7983f6e8d910d86ded5d11aa409f503313cb0db36ef6f32925aa9171c5740b9804b53d9eff0ce06571de0c3f4b5b8fdc8c88688daf418731bbf6335183e399d655f4217c994669ad17e52a76f2c586492c12e51baa4b3b3fe6bc4e90963305e3c9a989db7762d0fc0fa47f51e85ee0f752b1e2cc3970b5477aea6e236661567a1dd698c456b4bd78cac06f6fe2b6f32cf2eb1ffa02f420094950fabbc3b4a69383f49fe2172d5287d4031f99a9e38c805c40ee340ae710be2a85634dd7683dbe9c15d82204e46ecf5d9d490c6d1e182ca6377ed318b693798ac8d81d7a1d3bb8a83980e658f059776dc90aee5b725cc80668fda78c249db8a8c0841b3bf12005f9dfa3598bd9dc81ce940459e25187078bdf572154986990022df610ef65daa4c63b967c0f43e0ceaf00d2df3631215830e39a020cea26936834524a697d39a942d8948fd8940cd9b4403d6d7e7c736dd50e4ea9bf357d2e849cfbb77ed13c956aed8ba06a4d32e8ce4e03a14443d0010cf8fb1ed113b29da6bd1f6b5e533692db9d789085ed0f148305232a9831d89899b16fa2af2046f8b03ca4547aff8ebbd528083941383c979986cbadae1776afcf08a15ac6042845f5606dbbb695dbfca71ab2707c0ed69372c87cb3e41a94a1c90dfc8675bbc544c4df9ff119a6499d0b9904f4f42fa8ab957b855d4594cd4e5d0a6ad61bcae75da6926238e1b8ec604b7a7cd2d180830bd0cb19ad4b1512cecb9aad4c572f1353b22cbdd14947be4a5c33a0a8ca9858eab510520fc0dc34d12438bc542bf1acacd5ea413832a1940d3a03a8e6bfecec3c509d5d99caab6f51b4ae2d274bc1371ac6de195dfb49c82a44088f01ef443c060b270f5090c59b1f4010c7c002b89b10818b1a06a6842824797aa02db251def55a77b253fb3e4726d80726ed7f7c731dfd28de177b51a2da2ad053c6bac834b5a0d0a77faf3ace420908064b81473e4dcb245d9ce5cdff85528101d5507c00634b9e16c9bc75378c34e87e4adf8645d93f469a6a23894c6d733b4217db0e9df422e12275acf9ee458f468244af767a94eafad59aba631e4cac2b075c7571ed58d456c4489ec37a9890ae283eb948e1a3b89d5862be3f4e8c862aa99cddef698b82c33c15417ae0a255a1ceb96330b392799802d8a46e7c8b261ee042e3ad724e164788d76040acd0603da03294e2508071c3e530fcb8b58da6753788aec434c12d3419ad3ff8f8c0e170968b1ba7138b5cc1545845839b332e50871575ce10bf160e0f41fdbbc0384eb43928e557d38707c0c13d6b7a6c099905a8acfc2b0e89b642e805554a922460cfba5f068ca9e023d75fd5a85c3388ae01c747417386102a2e7af995c6f57076f9a5f9bb44b4c6cb3e151bd707c867ad32a9fa8402496625b0ed9228d4bd25c12cd1b7b1791139b069858b4af5d9cdd123f08f104372830946c62d6c5a005e66a71c8ca03f4eec93b5490d9a4a1c182a4216024b3b6c727e3ed8dc95811074b93ecfd9b974ccdcf468057b21fd6408aeaba20377614c9b51db9e9f8cc89e9d0f436b332ae5f26db18d9cf42f5159ff5945416a5e2417958d6163b5271a96f80ef40236be2ab7db8e437a2d2ac96ab5ac70bf393edc568d822b927b42486289edc42d159d5fca889949060c3d7efa6e0c400dad4466a2741bd18d90ad59a96f062dc3e79c0a39dfe53ad5d984bb41aabba11bac60942c21f34519942f3398ce1e7aa20283ac9858c0521b0fd663d13819fa3375f57187899b0167b0689ffe8a5c361a55344e0f2e1bc05c3bb22d6af9b8eba2981502fe6699debb8da6cccc85e825ec7402ecd86df099debaaff7fa142046869cf2d1152dd1efdac35e1b001a0518bb88567e1ca99d428e288a57e0b5a6b841fafff2ad2c108fa2fc2523dd871aa26c94c98e16524120fca53badf3e8b00e968a4cb587200bf61283ffadcfa5ff56ee806088458029716b83942e042aad8227ddd662b456cb15b00cf1cbda8ef12a5eb17cc7fa6f9246c4ba2a04bf2fc249c179b025898d31b98011443ecaa253e1cf1a7d0e0d55ff67e3d1ae2227235c541fdc5fb31a46df1b8c46b521cbb95f6f5d0ba830a81b18ab2610a8ee82499512540f17a40b22386f581cbe0bf23e611c72c78aad9f3abf7d85c019d4bb62c868bf2806a99ba86ea292ecfd3c6cfde936a26f9fb950f90f5288764957696109423796ce9963d9ab4e19802bb65d48cdd56152e5f643f380c4894aff50895998446461dd5301e1d7f5e6f58bb334401878284220a76f03daa3171ca1ddf8db8290cbf05ba75b3b3041283382c86471e6c5182c0dc7b9465cce2e561e91999a7c51b72c5304ed27f8a1640d0d5c8d9d9ed983bd7790559c1e42db2b2619e78b9d76a3de1e13296d5de8519f53518902b672424412815e61fd93b6ca60bd698c20016c22df33fdf9c31c3c52e5a662206e13056b9e3a4183fd5d4976946aa3a3cb6657ab094217ea73550b60d192d47ed7cd074fc21b6bd422e3abcfc3962dcc5d3d646dada5dd159813f73574754881af605dbe640ae465338528e8666020eddd7bf68ff618ae46df250c4f3e95614a7b031b61ce2a08821c461a786cdceb411bbc8d04a8f07ec238175fbac1eaa1afd6fabb9a3f1002f44aaf1b124da9732abc350a639f4b99388f98f44e5a2696c7040cf5b7d506c19016c77c52c97c7a3c20fbc95b37f7336ceeb3674255157c051b3b2d8914ec9f6d149f2f6fe733b2b3eff5bbb7ae9d546f4719689d2f878a812a465c02f0141735506285c2157f1be28365e64e16bb71548a903e6da6529df38d3ad94ef406a251b8493df64327cd325aa5726ea516347ec64fb68f216393c283f37c87150fb657197202e92137395a4b09e8cbda36b43bcc692b979879d2e3b8e42c96844299792da3ab1fcfc37bde9c39f6dc171f4a33e65a1983f428c670535d15f77ac26f7fbfe829330826ed5bbcda628a4c19dd179d128e144e91e1bf86748723666f33d06a59ed409f2440f29ed62394d3bd0826cf724f3f411a8e0843387904aac233643eb07e2fcbc5374f7fa3f242a69d1b861e4c4eeef8d3bc11ceb00d62eceb32a20aae06662fc05a56d85926e842b2b0e289b03661725bf5325679685df8e452780458fa1939b48ab338a43fed970976b0366ecdd566c6b7dff6ebbc0209b8e6a8026ade51a46604a35556b0242887b5adec84049ff69675593c3b7a9f9ea57f4543bc50dce5f8eecdc7f8ca263b4f513193111cb95d4eda3e43e63c63a63e018d9dde38d1e0b839aec759e98b6fd0aa665ca5b4e9b31314f3a86f5a4939d6bd237f7c71fc4df9187e7ea9136f81d6349f7e8811ecf9364b1cc32d6d1dce58d580dcffed40912f6e77f6d38edf1966062515fdbc90e90e0d589cae75202c7f71df37eda04a1ebdfa75db33b06730d5f2d15ac19082d50745f0af0e379fad9f45e50de691fe3c97ddf2921897fcecdafdafe0f28376e8e7ac0898abb3b4025896b504a87e758fbba6e94e088e825aeb08569cc191b3c76ff25168f9ce5064c4c7d4b4262a2c25a6dc483a910316781e43d102a9b46c89c3e45570f11fe32cb44bfdccee25e729092819a5db246a6983e2693391236edc243fa36c41f09ac49f17e54779e5e6c59fba3ca25fbaf76deef123278e164c2a2e512181de16ec1e13df15cad237c8050bb325080019f6bf9503fef2c349447b0a219740b9dd0dfd59ec9cc703ebe1766c30e7c5b9c5f698684202a4f810c175c8a82a8315e4b943032488f1c271d4e38b991b26593e4213819ba9b6a8a94fd910191dadbc9909dd208840a8f86748dbc38525a045b34feb36119da90c53867c842a125a75315f7f72cf03caef6a8403a3ac80f7b13435028280989b1b27bcad96a69fc0ac1ad7144e6c933636ee03cd3c2406e18084ba14f35100b8b93f764ced4421dd39b19e8537adb5b92b4bcdc12ec2510a0175414b949dd184ecf8f5a51bea43e01ad83642eca4450700fa2ae5439389dd2087a879e6437e211429cb8d793ba0c7a8343f66271b962ddc50df45a5f4abafb0a4e422bcf343dab330db7cc8956b3339c573108a3dc22084931bd78f30c499bfb4cb83a08b634831b82bf1c289f0a6353516839e5699a11785dcd86432ad2eb5583b1844c1394ae606f037f63962b6fa4fc111bfc2fcc1a4addf1b160143758a482826b368f0a170676b5d6af0e99e9abdee8127156fc8ae5127d4635ce9aad329a073ad3415dd3ad5cfbe3f78ba0fc466a8e65e1e0ced4191f5efe946bdd44690803352a126fe0517bf702fc8fb27be6929ba301b743df3a248dce1ba2a7ecb0e3f28dac4790a9930a856b5088117658161be4be3faf0c3717e5364ab5e985c65360c50b3e0e5faea08977cb9e0ef5edaa9e0e6a66395fed0aa99c1c1282ec66695e26edc6b1ba3e5541c3fe8be6564bd99a2194d8294b9e47c1c8de121e466b93eb01f7e95bed99b92ed747ffb574914d383ac2dd9fdb35baa30c80dfcb109b841855a592e904926d42505f2b32d0bcb2b197ef12be832202f3a252e4ba7a00062c876b0e8a04d248d392c7519cab561646b742a2b4d82a441c59471facef7b7c9646baef74c462645f3f3b9a2a75c0f4c337205baaa817411190715325bc2d487c70721d1cca2ae134521bd37aa4d798bba709594a653b0e520907838ce9b1e92dcf5f46a965fc34d14816fc2b030f2107c41014928710974e5626d9f6750a1e3ca7e187c99018424f2085f012bcf7cc8407146af5b71c924709513a1a39f5db4c52d034386f5b88ebeec20660f507275003791a873f0bc1930c9969a71fec72c5126d315220e185cb8c0a98d4f122f3098b863b3dea7c210735e182ca33c3b904320a831521f490bd039520ba8af33cd7723b1fc87eac7f388f9db5765d446d479611e9ca6fb8071215708a1045cd8da5aa543084f2d151b0fa174aa9227005f32028306a813fce3642c56a29c53cd81a14acd56bfb72a744e471784c7cf6feb345f98c4d7d4c328ddab567f041d92a739be86a59a10c308777d229b4761224579f0f9f07fd64ec6cdef699e7454adcf10c6c75e2073b49404ba2b599b40f45460adc241144876d5009a7a49617acd5e7537852622ce2d245bdfa6a4243f4a69722852c764ea56204b2484c0c0b74dc2eaeac48c848b2271d90ddacbfb335379fbd9cbebe8cde3ecc51f46249a1b4a8f28bb73535d9aed296a4d3f7a56d712f9566d8eef059b3116e2f9a7ff71c81890a776f38769b5241103a93f1738d0b036516bd2d8a9c23b702e4c8765400a516ee70b01b1db4c04eba50ab336d5abef645a6e1a6fb1c402ef812358c3b2ab86c4981b140046337f47b12c51438da2292b7e8e80a22db7528eb425191c9e3f47c1b245d51334962d66a7c1a3d49c9afa955b2f983f00c3f8abb975d8981b85473c7b70ea2cc9bf639176d5a8faa700226f5039a806ba157a71c6a21cd1af0d2fd40c4f03c3a3404f98b1d66b1f7f68dcedae8912ef4961e13a0a596484fc30331e2b48c77d22c5fe401f30c4316d412f6dfed24d31ab1210c6bf62ddbfdafa516c17b51cc8fa9f6949fc53f7a87ada6432210334038243b8a43d5128ef6cf12c84fcf483cd2497ccd6da4551eff76c3e3a5b2980286cf94523d43cc294adce323eaac5b73819125449fda5a315c002b0f528a4f714f0daa2d217d6024654ebde0c37bbeee862e24220cd43e3040fe850614c216a43db89a13daa22bc2daea7e4abfd96568dafdf958568e2bb636ab03157debb5a2ba74820a8ead9736c2b2edcda111922103505063e746963aff20235dc77d513b4422ad97bb8a373cb93dc3b8ad720fb70897bff6a518cc3a05bedbcedd82db38f7fb61e7636f6aa549f4ec7bea03a6ff8e42c862af9cdd34246a9e46bc2ae4cb75f1c6845c4b014358927bafe774add24f5e307b85dc649ddb78d37804abd3f39463bd6b66717e44050fa24cb7d2794deeef228ada03cf70d3c6bfc0d2175550ee119c021fc1d70c79a5fcd675cc19d1a2a9e509809c884099c780a0c354c13b581816727c9f45f2e9f4613f33c62f2e1dd3971f7e30e7cec9a730afed221dfbf73d4b6b02bf6bf40150cb5730ed31541bba4a8bc782c3f567ce0d094882eb2d6b1f7cc62bc71e47b70751e25c01dcb8ab49a0616967bc702b18e31c3bdfea34a9d3a3085b8dfd7bff0f141d7f1bf0160fd6248d94168c7aa45faab5d9108af951b764daab5cfed09719b05e8559dc2b0bd2f915c94fd8de1f9be9daffebd1df301dbb1c67601ed83e2df9b15d33549dd4907d7c86187735b3d20823e787558e14e66f5fd4da8c327155bc181c57227c6a60b3d2169994ce20925e003ee08e2afcdf41285ea8c75a12973093f65d4a9cc62027917bde4b4deb5bcb1363fe016251a4730039ee42302a5416bf3e532d3ac3e3d39bea68a513feabe57f3d61741a45ae02437941b33331ff400646acdf7cc1584fe709a3eaec3761af5d8b9772384f7a5b4f1b24f25b5f60d8a7677f0650a28aaf15ab90387f12e1e12e5c7b44fa5c97bab3224a5320e2c9f2f57f45b3b5527c9710f742e2eb62abc9beac2623227052ee8d459adfd83a6dd2d7c19405359ad6aef4be51335229d7c49b1ad27b5ae751a105451ed0d06f0e74ffe6459907bd29df06a433b86d2f235d4b36c1dbc2ae3f8b8adc1b91e4dba5038106397575f086093f8a06d50ab3b17c563f791e9d8ca79bb3415b5a9ec4cd082ef87735dc5a9681ac20055bb03e6347a1e33ff0116872a83da120114ce9851eff87b038ef558e1bc35cede5c7ae5c48d00bf5a66dece425a0c8229d3296dc57b7adccdcf8672b936a02c07a8e5fdc7ba1e864bb9aebf215cf825a1b5864c8688f0461eb4b412a192c475209ef984f2a9112db1457501d6d78739db2d59464eed9d1c1752963d7d46da2047d243bd7da79906a1d7c9178e6320eecfb4909940ad4f25c54d398b69f004e018dfb95a8a57d34245d9312990da20ba377e4631840280de6e8514c23f5b12d2e0b721a7e6750cd11da8f4a4a1654aa27f7ad5538fdc4d2198d63a8552cd7355e4ba8076fbf4e70d0b865ef3bf86f3c598fa2544dd51a2e390b676dee7eb106cde76634c3e6429411c60ae414c8df480fad4d951808e6a8415119187f4d551a9230c9ef9bf8be08199c6c8d143e0bdeebfe81199966607e7ea44e15632b06857188dfce1b5faa4abaac8962d54db08bca769d49b0b016a9036595ea2127dcfb24abf8b5a2dcdfbd42780a9aed3b8b24dc850427079d493aa4a18a21a7b177c58b41e1592dea920c1f7d94ef5e596ad5229f9f8ef63baae55b8b309d58d00eebc9e33819b990d9cc66a7a05cbb93df6b584952db14489b28300ee6306c633b78313ba23feb4d5efff64f61090ffbea52c957d132bc21b35d0c06b290c7478b3359f5eb30687d2b9f4942bc4c029876ee70e418b5ee639bc2aa1439b28adcc0429b794e851c62a7d7a89deb2dec1d18b07b245544c6f4ef7da660a880120b71c2efcdddf48381b793b2a4cfd757efb0d2505de7812420fed223180aac2eb3a11dbb8b77329f392a78aefa4e462b4207ab417d76d19fa52b8969a2641105139371cc99cbb095776237fae3b5a5bd45ff4e8733dbb350a5ce12d09cce8ce5866e7021e40a1f19ac2c62a18265ab52a4018ad825f0850aa5b419ce3048b1c017fe22b0409557c2908692b49819a56ed92947f0c714a000ed6ce05ed055a54170649f4e89cb8db4f7d40a8be6c9805bc5bc43c0c53462ad3d16ecbba7f8b71334e667eb37b5fc3e425ef157e80d0bffe5adcd0f9a40304e703a1c5322d1b26f78a6c973322d93fdd9f15f4569680ebe64b350ef44065ebf5a5bee72e695f4d666c9409a9f76653fada14c18213b94b43d5126b47d8597b3071f1fb81cadad7339f50556fab0e5e96043417adea35e2c36df8ded1ccde8596ef0c3f2841aa0eee481da7e4f506bd1338790b8bb6b7c8cb63c461804ad72ceea2e753670e6172e96990c8def287183e7ede12f904133ce74389e9cceb8032b31add1c0b1b0c81523d3a4103ba9c551f67877597ea9c72680383a158fe3f46dfbf53c468f1d2ab480e74b685d1a75f725a01c71bdb7b85d5e0935979e5f0aaf37d46aed0d6c60ca92275c7588f2e5f5d85b5c44e291417945fce417d641ab04adb30afb3186d3e39372e56caf2dac77443ec2eee7854ee226ade8c564c9f38b5371d035f4772ed7b6483adabb008afa78cb7b14a27857e2fb2f7deba0c45d36f9063c2ccc83eeb7eb2d3fd9ea678993142b1bae166b457179d99f9526744cd663746aa949975200ff8550c825b3be630c91dcc7aba7b7bc23ddedbe6ba2d8ced831e2f697377e315bd7a1cb20d484a33ae78016196570f51c728e73e5b958d76b2ce32bb1bc6a42c406f71f777ecb03212de2c6fe107f5ab56ec65e1c067331292f29a6bd37013ab47b9c1e08a68bdca526a2f6aa91a88ab4bbed003675564ceb2645bf7122885006760a60ad29efae8b15df6afaff56cc289996b2bcb8916c4874594215b9ff6363332ce1aa7a41dbb08403893d472644d095a0b8c07042b1a985b265a6709727432c9aee8646052d896119356666ae01de1a3fdbfb56dd31bb761b3a496503313fa5349ef7690feb4706a374a706a200aab6aa9b3250b482799f4f61cb30b7a93f969c5581ede95a75fb7c03bdea398e8a1d3d7f158d46fa82a6261188c5ef45ffc86c9aa92699423d72f037168632f21984cd2cabd2cc3b7d73513653e672ec6bfa756a4369db82ae083a1cb0be5338f0d77ef1f9a2fba5b6c5d2daf2c70dd686ab97bb9692c22071944ef011a9c1809869dc625d463d3afcce057a9d81ac53904549a9a0f81e2083b59c79767ec759aa1806729cab141e0f956c90aa31af875e608502ac8d30e1f0a3a2ff5c1ee736e9016557fa52b2de80774c41a6806c33ed42e2206712fc1ab5c5cfc1ec15ece64796cdec08d0a4930ba79f3884b195588a3f6fe5fe9f3832a1b7af239389136f9a4f13b7e4a39ae151e806ecb88d0789a56087b1b57918673c0042867d8e165c14e771525022744272dabbb0b690a54cf75a5866b1b99aff5b9171cee724000267e8fd5641baca9b165be0e0ec89be773148de447e396c457926fecc0d268097017c6309d21fb2d9ba4c51a223871e051d67b5027efbfc1b6072cc49b2aff51bf45ee43790c13d4b3200e4b4c63e567ab068a97f8c2e104e60aad32cc26765e6736c1bcc5dbfa4c7b7d06dd3df1f0b2273a17d1c2ed4efe319af4c1c75b3e9db9fa091f16916adee9dc904b7d098442f04f6903be6f57c0ff02b64f2dc64fde3847867f67b926a49e216b0b8a7f95dd06889afeceafb764ec59893afafebfd29a729bb316342132edda6b82acc900931afd7ca5961a71d8f257fd2146cd008be2cbe058f0eb8c0ed7412d5717129d5ab894f36ce8d88f5ad98d88f38801776ece2f5409b6e6a60080714d758246adac7616fa07442e474759af259b90e6130c8d74173f51b38b7acf4d7304dd4a73b5ceb962ba1c0eeefafd8004d16944b764ebed35a661736bfcf126391696ded0ddc1cbaceee7341b3ac93a92ca0e0389a9133383eba74b48ff92f661efa6009e1ad7f577d85a364ebe7dafb4ace97eb81f40a0b550fae8e7d8bf2f82db0f5718ecaf267d2fdfae7bff409de286136e5984b6ed9bddf1dd90c82bc51b60fc677c4452406cd17c22136c6bbfb988b124f59a8ed28b2afea11fb1019d989a803ba6933ae28b46291e31ed4497c26e75446c536ad57e8010b931056c3db399fe1629bfa70ef5ce9798e41a096dd92266bc322c03024a8e7fe08730ea24731447a8bd6fdaba5860534e1a5a653db0fb267cf727ec22727489c6f0f928cbc293d9eba86f9494a0e75c3513fa3417a2b1e73cc517b4c8795660b849d2affe8c5dd6643bee971f460e06597392ee3d7a3f55cfc0f0bb47549026ff7e7d2d71277f1c37febcc8a970f6bf97e575c59187fa440131fa061922660248c870adfdb904cac8087fc31555c23e0e2b28cb5dda57f664d9bcee46ae9cdbaf4f6720dd332a973e3dc4b4bc24ec00a2dd2a104112f8cdab0c4751bf6db2d04074f3bc172a45bc672769d6734814beb915069308133d3d54e197c0c3beb90d63eecd7f07de539d63c038a12c2fda6d190fe1b366b35c755584ceb151943debdacad43cfb8b7aede5fbd6df0944cc3de024459dc12ab7d8f725d9652d64155ea037b32c516a1150a92ba052c780cae29d00b38a3f14ca4a9d5fe5dc13c8310b7ac7b5d43d6e5922eae8545e663157aba0a7a3967965c4620207d9ec45ec5866bf85c4d5b327692435dd744519b1249d3e6cf478705f009edd59b0725110ff521c35c0a274059e64b3183fe2dbf596a9e08c92404852448920e351a0772a0f9d6ba74d9cf80dd0b3042f2bdb267463afb99b28e48695ef3f6519d63559950b9784cd299c671252ab59af537158baff82d7bd37498d82818d71e20d95e851dc4f639460c85160ac8d2adae230f4dccc3d1ee79e197d0a56cd2216d1b7bb8f0869e02bd2ee6770ef5d4653227795f6291421174e83ee423635ba6f80f4da4cd8f940580688807cfc7c08199ec62af11d52e0743b2bb07aafa493b36c7ce06efc63812abf34ceb58cca7a356fd977895a3701ac29e3456a970b47c133f147d3d24cfbf44082563aa93bb200d61e1d64baa996a5d44f0699a4771962028e1f48ac572ceb8728184eb501e26295c1602e05509b28583913a8595361a165f83d6c30e3f24ea5bd533ac28b9aeeb49443291409b772dfdc9489ae4ebb91be91d7775c2531eda23dd1a2b16c0a3768f692ea8ce0eeca52381266fb0611124e5f995cc1cdd3f6d28c627d4db13e7d4dafdb8cae1c72c18427e317e17fe5f9cc82f8cd2c7639c288344d8cddfd44e5558636f806edbf028b0adef454ce98cad30c6137af05be0b26eea1984ee84547aca7cc72ef5ee810d90ed4fb7f20e5fe439f96b4643d2ddd22f4dc2315e2bbeca7c45273f0b2b88977d8f521814b6af96199f1be19d6f24c55730953202de688361c21a1be0281e358fcc696bda63d5bac35404fac77acfb5ac9caf2a5d4dfd8e17ed5649243177792fdb129061c9bc0bb9ffd63f8cdf76d007f482cefa996b42dcfab15ad84d2fe4ab3048a044948eaaa3c23769982df4596016a9414a30379b3a4721a6963167184573d1c63a629137ed4137d81cfe34666f6e8a0430ce1401e5481a5b1c135ef99dd37a739196c45fae34ac4d52b8065a9d2206543db42ddeaec865650bc8706b1eba88685209b8177241691c9861d87d5fd98fe4222a9212379d247bd6963779b0d76fa983a5cdd26a077fd60ac2e930b8a6b651cd7028fa5e543cece6b7673fc2d26b2bab24381489522f9a5d0871b8226c91a6ea944ea13992e41b1ce7194fcd41b60ed84cc73f0b1028c9ccd41cf7a6198a8eda1a8932b6f86436fee8a1b3302cb29625f1d4733ad61b47422f2110e56ba29396309b73f8b8b57303cd740dbe149178ae6fc773d355de3c96f594f027f93608f751b2e6b9d0b9b4926738b93dbfd9ade89bc4752c02227939a8ed400f8d6a5547dc2adeedc65638689da9ec4c7d474237da31da7f4d3d5215af72e68bd44437a96aa3dca961004bc3c5aa73c6b37cea15f9878e4294442db40a33315cae36aabe4033672fe140dc5606212e01830c69f5f9420c7ce2695673e362fa6d0dfff07082bb13c660f8c89b90f9ff5866ca1cac1e05ddbefd3cdb9a45d24660949156a8ccc11296981325f33081e9dc904b891f9615542430b1d4a8ed5c48c8ace2ecb400f7778d3201093fbdf95c4a0b69e68b5355632c599d14c38def030e9da40e300859f391a2b243a6decff44b7d4f4c5f919d539d9aefb8d99e546e5b5de2f8a3890f36574d8370977a7068bd05559001ec588d2454d9e5ae3313813db28ce4dd862e61d48f6c22592b460111b9dc22d1b2065894e216d2b1a4ad7f9b0218dbefd9e92dc1da75644e2f371822c4366604ad21dbde36d00273c6e822667d3718489974a4b612f731fa42d1b65955e936bb709bb518250ce3bc9e1904c3ff28fbe4ec73c6388645c3ccc9021bbc7625356033a63305d99ff977ecaefef92c7fbc3f8ddf9ce41c79aba760c8ac6c80768705730024491c455de47537910ef656a4f42ee0948424b4d4b85777a46beb431bfb50b884e81743fcda2020d5cec1d8386718eaf2fc6e13bf07b3604d8920250e8f007bf5c0d5cbdd60e37647d110747578bd82ea60debf69acc45e19482d1fc3554d4b28b9d038d49ba255f2adb8311f0960d2afda5a51644442b4e40aa1e41b69e6c7dcc5179b0f95826153a6ca9486bd128aad58b0a336568773eaeb86a2bd692ca20e62cd5e038c39f3c94a3c9801288a1a88dd18834250f6d15c9435c1c79e84edffe718de1f35667d6f2a3ae7f8a4b92d8ea5bd6ab04b8050c9f96beec53e651b8a7b93c6488b9cf54a042da39288c16cd509b0a432ea019b5e86f000f254526f8b0b5cfd81baab0557f1d3e9cd23b66a632f6d7469a468b7b706d54e07b6de02dc7ee18e8bd010581db5fe1f704ef8f096e472ad6eb6ded8ca5cfec652469d5b3ceb6a0cb082f8047fe02c4f07130be996a5ae60ff6c26907e953133483d3add1ff4b225db144c1399a04f92c3f6a898e7c7419d635a49b9ed30360d9e28331780c7bce7d4e144c5514cb0c3d585388c49bab4dd60c004e6c356d189f7e4c050128bc1f68ba4dc7c38cdc448fff26dd1a5fde07a2e944895c691d93ad751cb3791ea7f2a765ed4aa0a80a86cc0ad60ac8f991206527ed17744d3455179be059593a08763bc60d897d52601e8749648c5ccf154c9ce391fd0d471d14dada550208a7a13c7b494c1be566e9ecd80e2712b299b8ec4fbf8f3d9051266fed96ce7daa366b8018ed4a4ba912be0a4a836e97c5331eb903875a6c0769430ee39a64e41f86978df19fd6db13d5d2a4b2315c2760daa13af07352597978e644984326de9a1c9cea04b1ee64723de5f04cc04bc64f9e9c8f68ca2cc0ed0f9fb183bb24f3a52bf287b9fd15abce51e10b41a63044a7a96957b5233689fcf7fd81d134f799272b7721acfa8ce57b4124c2ba32fb6fac6b4ed6e8640cb28c7cb983cb0cf914c6439decdd0089e3f2ac97cf3d8b3031cec86ab8fd2ccf2d88a7cee8c0e4439ff04c46784be4150842405f53208cd8566db055e3414c39707ae11d11eaf7937aa40835bc5440d71826f6d6a8901e122b307452c94525d009aa8e34a5a2d6726b39f1383970d20545b3959638a33cd9898677cc55f51e90ab63da394f67420942aac0c90309e28870d286770927707582295f4328a24ebed40758d469cbf79449524862cd6e882ad193330e91f1fc4d3b55893a67deb7038d2617b389d5d01178946ccc02d0303c2428028150837a573ea31bae26d1b4ccc0f493d427f819ee9a27914fc2af7e1327d90bf8f55fb62784123778c7e217abeb49b5d7c9855013476c801277f1b940192910d03acde165dde32d5566d05d23a27c29bc470cacf6a624a3b053d1376541630ca3d26eb83d69e586e52f1c36e3c77288d503ceed7683d3c03426574e7d6fa6ab93176cb4583ef3fb7ee8b78d2ff003dfe8657e66cca04dd07c47732727c2a8d9e86a0e97d17d96b1d500631462391992257f5a338231d8b53d2cb8b60ac28eec36e09e4d118431d6560d4ff682878cbce4136304b90389c70732078f16ea0f2fd0a5b95f565d6316834f5a804a846233f4e050ca770cfb73c7e2804ad15c882440dca6726d567b0560111d47b16e9a55e56274d0d3d83150ca198263c5eec61b6b0b74632f6594faa551ea6da3d4eb11a88d03289dec191b23a24693e8dc5e001813a1fd839eaa00dbad5f63f6da85c911606eed051a21b09c1f5aa01ca12e3498cc9276842a090e1dbc3658be82093d029cf22849edb709734d7db1c3a335d9d31012b732644a4c9e8be9cc761865f870e2c783b0ce64d81f967b5c81aa742f75cefd9aa1d4f49eec1725f31227178d28d7185ff74c7c68d125d908b50844d1f661bd09f01339c01f6c7c4b7b6777cc4b34e0f3c0c131fb1ba7185807aafbef88e5ca30065b937ff51a12cd70d840401cd6f8cab4b4da2894e2f3c565d83b969a7978fe1ffc340774eff05c8234da9fbaa15d74840f0c5b186d6dafca047f579b72c86541a1e5ea8addbfc87270df54c0f846ae655d1f3374a75f03e32d60390bd61b4b5db276f31ce9cfcdffb989943f9e2c50d896ad37e8e65b47d5cd2c1fa2b8ea33a0e53223f97b93ed240601f243b18245ca9a612ed240e778fd746b1bd5f27122954c880106c68501289f13412c21fbdcaec8b67d46be201949d9e7d5ee716d1fc54e63dc32c40e2f980202ba52c458a0658b8a79244ed32d88738bd652e588b88b71b2189481e45f1bd89b0160872706092373208ecd8dbda5863d6dfbcd8a779c592d94618d6d19b6059d0257c6156301a17b658e1db3f9ec11a7b436d4059e1e7bf6ffa0c4edc58fdaab92da6d1ab2534edad60459f8abe3fb40866c327109cd30ed0c4d96c2e4b89a91cff62a1e6d9d7d95d0b41b205c02552a166d90d5a5f398818388fe0d19f0b49f19c5f1080fb22020de7236d1a7175e7f498aab30bd917af5b797f4c3952fe777153c6eccf15bfea8bb3e61956b18d2c8afd529071aa5948322845506dfd53553c8d8919950bdd8eac5a7c3a6bb82404566825b031d78441980c0eef0456c5d3f94a3876bcbc9b3083c7f4f510fbd9cbc1429ae5e8090b24fc688e022c42630873b17c3a05028c6e651bef0250676619d0f4f215e9aa28171a194e41729de1d980b9c5ba441f6828615728955f1a25b5f68a1f835dd58e65a8c7427aa85361b96b39d9e29d1f2f27fe30a820e59f90ab5827215dc4eb43a3f9686ec064cb73917a807bf656bada45812abb657a124a3f2747305a03ea86ef6fea4878885557de88a12139ad50cac4c021953aa55bc2514b000735dcb1745162a8fa94b4c849ba76728b34ce6a2aa72d5fd5195fa2e62613f03df02d2356068751636617dd0fe2118e32052a6313e821d36b79c0b0dc33bd5048a27a1645e6530f6dfe1c8fb74fa4ed2e8288cd50b02aa518b1895c4be43c415d8e226ebb0d3bbd21614d74df1891cd0c803e3c98330fe3f630202081e58279f139fd9c24bde714f84a7804ce3433894eaa3ca9064aa876f853025672c5836a82756556e143dd921508bd012efaf2c2f7d80d5505e830dd535d8eae2f6314fc961d294395035b9e8c07e095d7a208437a53d919079607900f1471be98a0109a4b4299267ba204de47f1aaa9729dd0b59fa1c28118c7c1d73b6ce368624df781d44435eb681e673690a8c0ec88745403e768c801aeb55a2b5f36790ce318548afc4131c03c8aa78d027060018e3fa7e0857db8342ffd1fe4ce84d01a46923d845dec3888cc1e1f1fa0f41548b637ac6575ae2201d2329baa1ea6a12874116a7f3789b91a5d9fbb33e15ad7e8cc38904ffb936442a4dbc4a787202b1fb2a6e1b5dbaafdc8837687f839089c4a00e1c86b97a3f1efa4c84deed87be85473da9e2b6922f1cdca59a6905088eb492aee2b5246fabe8df73078138640e3433b07bed3ed6fefb616a45355009df14d561dcf25c7797e6dd5a214722523428a54cc0924c766458b4f10b2fe9704d1d01ad4892162d4b190edcce66125e964b062306a451fee02dea0b0b3c84a0dd6a96f632bc7c84482cbc3cef598c62bcc0fbe0a497e5344a45627f177ef6e03f74539d8abd2dde11be08296b5ac9217040b20dc2b5c747b789353b695c5feebc25b351e4c7738cca4612bbfa9b94e8c4839d5d445c6cb210e46f7d447e13335667812add207737e42a93d729f0607884910279696f4e0c1a3e8e72943c1a0a62e8239543a9710892d1b6debad168a91406479bd84613ba414a73f43cb8be1c7b381e75f67404ee2a29eecadd95e8bd1373e8c5ec037f74e413ea16afaa197daca028aa2190f959543091cd346dab85aba379a58c7461aa9926fa2ce062909d48ab1185a5fac3e850811acb981cf6902e278ecb0568a8771a7725658a19bf5185adb46ff2c4941e1397c65ea126502ec45e59449e526eca96586f9dbc5c2f998a40e54cda1584d9f9a47c6d3b023a8adb019ee77298df9e86e8d1f8e19b69e5f4cfd0d662deb057662275fdf147b57d7d66658d2fd2102e3eaf3106ecae7c4acaa93f2a09bd6054e7a42c03f95b37d48be90e571f383553125e4c00525dfc130795d02b1a640e02eae025ed952e3a39883f3f3507499856c13e45c5d73d1a4d7390d7b8ae1ee1b82aecafe446f0a71abddca9f188cad6ca24bf1f6c598a38185f21e63e632a11ea2dd5181c76246d75c68788748f2848115d9220452cdf5b78fa873960586d32b1dbd380b89c0a2361dbac06b46dbf8350f19958dad72db492a0157453c2700a34ba5f71359e880ee34a347c2d3919f7802fde0331850fc87a7c40d7970fb013bf931b788531334d5921cd15dc6a15364da84684dcebbf5f77d3b30aaf460a737aaea3c6a03cfc96c23be01105abea4d8b195a00ca5957e93de26d65006bed80071646dc92399c45f107a701cdd63be1b791420054f18ae27079eab21595ee6fbce7d15a322b7823fa1d49a36a3b8e6a0a8402b614091b24bfd49e595b08169a84197d59a1b4a52f5aa2f4f62e07eafbb0ce727db23ed86335c035e1bf402735534d5159f39ee3048a4065bb3c2d9ad72b01db78a52fed5162244ae10e642cbc8dbae10da7dbf47b49c77781941db7a1569b0e8f2f831cda4c35228080d6cfa588760b9a599632ea579992a3a228ef485c96a5e82252ab38f0205bd526c1af1342d73f491db7d79fe1e8b4609ec7fc61820230b175b01893e04b1456d97d6420261e10bf59c60ddc8bc5b52e61480663592c7b35c66c4ff8c0f84e289a301be70e4938d85891393ba12710d823014c911e134ebba88bc42febe7b01c42d1288354e33e60d29d20bdd45b81f6dcfbe0a15dc57a0736fe4f898219ac5f042a30a9be4001863e79e741360f9408e17373b759b37cd2259b0e90ef23680f069a1fc45fc0b83d100a756d241f444aaa2ce751f8139cc7f96713996aa7a4cd091c16bbf09742725bb78ea190c12b188f0d85a4dd1cd8ea91f07a79e4f412ea2729b0b1e2d3b4cf16b0b95899499eba2333e3f20543b546844d58782e0811bcc62ffd31310afd184dc223b698fe37017b8f9695c14ef710710dfcd948d62cf47ee878508af643ec0d111af5c3fc8fe5de6c2c6d62a9cc55b67bb5a728180fc0b4d45380a480074a27879e5531d2b38e1ad3509bb9acae8e21355f93147ae979281a5b940e41e641b27d79d7c63e5c1a88de36dca4bc1316ea1a52c4139efaa8dd2cd93ee1d33bc84b33a72ddd88384eceef5a154cc445221d509bc0f507cea22a77be90818b2f4ed0c437f2c8972fba1dc56b2e9c2371546b2e453cb17e8336c5a0e9ff5f945646b83aeeac41e527209332c884e94f651b1494c101b827dff1c1961ae2429e045e28a3c3c72e44c3ae2732eb2b6ec8270192b5f48b51b12c8561f37dd2ed3437075302a8865c82903f38ef3dfff9e69db5d43707a5402495147bd43e36f1893c3e904c8f8611a3e6909ae71bbee8b8da57104eae2cdde453e97803d54926982abbd664a8018b4b71541a7b47d33257657e262e1adde9632e1ae2bc02cda831d081fd128b72a2c073e5c34778e2a830cc7d515adceab2331bd440ad5b6e6348fcb64e377c4895ecd1a58a28f435e99caf809002e336f5e91f5ea9bebbade3491a9ebea2161ef9873bc2fc9d9171248003dc832f0cb538c28c5d5e45fcb43a4c566b610a1742b0b558e5545fe61e4da34bc49033876c5d1a0678a47204bd1f1c7df98ace9830252ceae23c8754998c2e921aa80f727dff3651b1914adb4826869230662998ea3ec3886e1e27280128c0b752e214e9abca1f801e694f4aa2bfc447421f04ea965715423291f85a114f3d9e6c54e112be13e84e07181c87259ef427215d18932aa0051fc9fe4e393a5d5c3a7129f42ad73e7a922692e2c408f8d07bcd25e43a498a85c43cb26a8f8c682954638365b1e98257fef9a31d76011c7681d296808667f104379a61938c12a5b4147976ddd721578dec961ff6d13135ffe97941e26b3b934b853127aa46c931f6d16520a2bb8a2ec0a2080c7c2598c154a694f727d3d8da49a44daf78b70b46db05e2089d8b93589c2f8edee8605599f0448c6c58731c243c9db33b52cca9448521be3c3cbe0d1ee736db881b390eb6a0e98403e9a1e2fb86b43e6a9cfe957582662beddb9e8dd3b9957776e632199523a58c4a602da3faad1897be8da9ce4cb346a4e08c5e4c7884c947f0f2ef0ae453d1356d9dd1634812223c6aa0ce04d9be5686b0d0c7f95867489a5e2a7f1c46780ea07b92531db73afe93268658a4a4d83adb71b4936c490242c938dddd25d31927ab8031b85d4db02acfe644e1f1407e5ded7a84d419d3aef2ddada878d43edaa86f35e07266655f9f17c9c92c4f34e44060b5a16ad16c57abf238c944c9939b3fc9004274e33b031ebb8b853230720da5ab7206ef1a966fd1fb26bcda339bca3b193fc419c925a9ab417dea124578343db4dcfd62125552b66ee9212150c956913752ce0b8c442b7edc0ec616fe4ebfb0bf7fec41cd5855d466edfc94d5315287e4f947a64ab3ac42e2cb305a872af516fb32c8150815b4ec0c6237d9d43e129412365732dc86f41020bff4b60a5eda911ba91346e47bf96aad9221f54fa7e92ff467f5756a98e6a87e4dc2504414dc51e55899f0e6b4510e747193fd2a259137a9a5a28d8927c1c92c27d8b723d5cd7bb2bac9afc487b1fc5c1f2a82c79c062a5c0b64ef0fcc36a05be9df004b148f12ab9a1ef65a7e133954a1beaad6c5371ebbf14e5bb6e7f3ffcc783ea1b01d22d3acfcaedd70edef3314794943446a9f0729112306021d01e88aa8c67ce008145f9c9ce22248d79df4f7fd5bbed62c398aca0a93941c241e91434f1f1f26422025dc965b550ce2078011b1e36a113b4e1e2b44cdec0d5af558637cb76086dda1e89e8c8882a7d061b4e562e605dfaf8286643c460dad8fa855d73f91e01d33ae4405c8ae20b993b7d66238abfc5664454988e0fd5f21e3f414494447533dd8a012ece713b3a7cd7c0e3decf35919ee2941912b3df93c92e971e14366649427b7683e21122d31c2797cecb18e39b74a1f29a3572e93c73c625db802b03451f5d52b4debc90b5295eb2a31650a67fbdab8d27d97e13183e201d3a8e141f69309344c66a0dc003c7fbbaa4ec6fd721098edb3e63206f074edc801eb23e1b799e5e6c242c782060660063622ad49b509d089cfbfa923da2df5dd632e465f91539df4e2c5d1f0d5a210d13091312f642790b355b3b7fb1aaa866cda9b9e019f60a30bc9f3b8677a18c103e676bcdda0b5ee2453955aa5120bed97e8fafba11351cccf1999c1810a9cdb91be032e486ec4dba1ec0a60a77ad63d3cd0099302a966a345c6fdd2af3231bbc06f8e44deb7d14c5e9daa2e701a8e2201384570b740377d1e60fa7919f5871de87c850de6a6c5f2ba74f9b3b3662c876fd7600a24878458acaa3cbd53ee9f6a90beef21c0f20095f349ff192c1c9fb54ad566e08648e029354536e68931ac1bd4ecdf6f907a870ffe3d4fd0ce9a8608d06c0481fd63af169df45e6253469ff237c551c7b057e9c16cb05b52de7f2c9267d1126b7b834b086e390e08e9ee2f72311fa86378ad34ef223006093db18efcbd94b445ec0ec0f2ebdffce8d82bf17b3010a89bc1c3607cac5dc831bf99bd409e03cf4615664dd6c7d6f663ce6b21671065d5507ffc6396ca6e78e5cca1a75cafe1d483dd5d78c36ab28413a7fbc97cbec1921f5086a2fe1672d3a8794df6b9ed50031b561bb219e652801f645b2b39a35aac3f0b99a99bb5b8c3830f7799a2ba93c83bcdd2e0584fb8e2c650b78b40e3aa1a478503c044a8fb13ff231a39166591ba09431170f46d058b7b245549427a8049a90a3945817d32f73b26c34a70d25e40b9dd65116317f89549c8e5d0bbc0a078f05d853925aec2523785b328ea93701c3c6e2f7603cc62d0880180c7518a86c0d4459f0ee9d14df19ef1189ac07a430205d9eab7710b799bf6b2ebbfc593e007f9348d1bb2bf496a11bd3bde1053d1f83479c77f599cacd37ee8d06a8b4d9d98a9ff8083c02f6446d50d67854b1bced55ae8517458f17c160e71465ddeaa0bdb3c1c0dbcc4d1187b2786f5ada2f3e1290f120b236fa99d3413e523e07667d9724e503e59decd38e0f0f2208edd2e0a6cb46037ae0f608848fc9e4e026095e80056682a1b4941b70b8fa2e2de689b31aa331af99a02ea6f4a961ddd9d8f4ba04a1c109e353b6e366f7c8206bcf2d2edde14a3b7a553efc74cbdeb4493828c08d860b8c0203d7a5f0ac375d7723b0fbb1b97d4405ce2d1e1a9deb70fa4bc0e4a52b9243f9af69d9b03436f0536997d436a4cc9f8fe04ccbaf3494a8e5836ffabcd35df5983aa9cd0e82a1674751c095fa0b1eadf3fff8972e2f26dfce3779f5f28a8f1d736e26242c0839c87303f89e10c4dca456f4db1c4411aec5d6f77a07013b8c94c50b716b6ee346364d19d42fb2c2fcf0d74db3af0bab81b69c40453bb2bb4346463792e7f8beb0caf2b53e692fb3cc2443e10c45d031fe7bcba3e7b9ab9547a730d4f15fd957f8ffeb2ad49ff2ab787d328e9da40a370ded07245cb9d60d9388b8349527d40a23edb7991d0524cc9bcd95ace7fd91d23055974af3ab98eb98743f3ec23a5b748d6d7434346ea80c2478763d060c3df89043c901162b384fdcc699caa4ad95e82f2e7533cdfa78b1d13be18d42cf4399922ac91d53e4ead67e36218038c6031592a817f568fd13ef0f3f17ebdb933797c79478ae7f75ae371ceadcb9cfdbff8de4b06dcb866f8b8ed2bc5f4324909ef2cbe6883db806eac29ba2c97139ea72591d8bbf83a54e11dd46535785d32c3c2a7fd18086c6db8cb06793d3ae79b5bd79f617c5580847ed3b403ee97c2abd8e1c531ead760651095afb9f633a42521b7170fd4e3153a8a4a289aee06b9b8fad26058845315f5a550aa29843c9af698e084f7f3a2f341b9d05738a15893a87a80bd5702be85749fbc493912e242532740865e6b5e9636c979f66549f4e76e1c48ffec6e2d46ab2a4e7e1f9e11fbf54375f34f4a23f731ca0e950890e5a44e0997e029899f9f7a782ff7d41f075c5f965d1f419830fa3876ba15e9131bde0954ba108490190b5876d78eac45d8a605481f9267592554afc5a42df4c0b823c1d4300c2b38b99045d80d89b455d887fa1c737e10e30e40365521c5a51ea9dc61a222eb7c22e2ce0191458642f0989b5e72761928afc169fae55dafd4a41cbe4463e438b6058ff668c9b76d3fc5bad449faa756af57b817892ef631a29818771b7cc79687a91a19108e00ce916c195386c0862749190ab7808e23093215b640863f79328581180b6f5264a86d02283c922043f508f09c9290616110e81ce03cffb7b5156af6c56d5b03f4cd49eaa2a48956e8d46af19cc7486ccefad04eaf22cdf58550d02c4e7bd5cc856c413f667ebacf5b1e79535480ef0c6537c2474f7a9a8d8ca1f0ce40d9649c0c499a14b23382a5df2e9564073992f73a632fb97c933a761f56b057fa4503bb9146a7a34369bdb8495614f44c0fd8dc075341e10cbced916d530405db3ef8d43499364ea36b1767ab25bfbeb1e6d3eda65b2355e3a4d9e09d3eb9c2ddedd72aa154ef00cb3d5602b3060668a468f30059b01ab1e5a4ba96cf937ec927ec9ea678da72142331f820b3d2d2c01789eaccf9d6b49b0d8fdc29ddf4d6b795fe1c2e05fc710c6378312fb422692a0723b71001314ffccb20f89105755a6ca91e6365dde2ae21186bf0973a2c745e016684859f0cfffd9ea4f0713d456919a658fe0737fcc17ee47b386c5f29da1c0ba94496b5d86f63261bb80d755fdffd19fec7ce550356813aaeb56999f989b74d82a29c257e2a169fdd2014ab53ea4e04c4b3542acf2ce0ed8185d5275dcda4eaf82c91a613570ead10d18e9ec78b078e9501dd011b22b8b528200c57095b2915d80865adbf2ae6dc2482993def0f1d596960e7e06ef535eabf34f0ef2dd18c08eedade7aa5d284c94f9af90b60695e7917acf1a79286baddcd5d396ce35cd8fe52c6a12ba7609ad77f9a4ae5871a74fa4a878becd33586b492af82a09ebb561cf2458c257ac1001ae25379ea8ab0fe7c639ab216040393dcc64efdc04e7a7fbc31db518cce84db20369585d46b1655a95b8f1750a98217417ac2c63ca6bcb84a56f55b58d84536b59e387d2e18c96df18339aa59f65c94b43ef67d9d8b72613a181fd8e096f0506d434679cf2eaac9758297cefb58355db95c484c2c16b8c98192ca39db549bd6f60b7a19848cc1326c34c72de374b43bc034c3dbfdc9e6c5471ebf7668d657aff301395416e326e510c14e8abc6f4a8ac12380a17ca1e0b54aa972fafebdd79ae8337a813630006138e6f57f07693ed179bb1478f61555e80cfa8b82a8cf25c78b89ec5529fa7d1df547b32bc647e4b936c821ad50412adaa015949933cab5224a7c128125050bd2b78afce7756a2908f5a627b5302a25ebad2611c817828f21161c41ad80ca669b6410ef983926e5ef9b7729786169a07327929054122ce05acef4fdf6c1aad90a307c0abbbf45967856987e7ecabf7016129297b10006c245fc2cee18b1c0afbc1af1426218df677bc51aa98e5b514850f4ed0c1a0a2288726c08211dc6169a6ae27f7c65aa10470630a0d44f828282fd1b9da4f80b8df22a664b70036534e0e3c934aca71dde5ac130c7e685fc752775ac05b0eb2b82ce7e1260a4c84cd16f4e26c0ffa15bf093bfd15b9b54d330cba17a78f7d64d89b6fd86df26ea086477bc04326b5e0013b8cf7ea8ec731ebd32056fbbe76d52eb05d4afa9cd8417c9fcd3ab1d1b18d7977128c10155d0d44c4f9ab3f6f7ad732976b363d54355732417d7c1a09b4239a1313756c22b668267e46febb93719125c453c253f2503c525733e45f9f7dbf3c7ec7039541452ae04f1bbc0d5734d8746853dc8eabf7979f0fa0c8c7edc1462ba0ca35e5db90f15073c5e5cbb82a260158a54a7a9dce719bf51d7a900489ee970ab546fbdfecee29a04f645daba667cbacb9e72e1b0b724d2467c900d92453e43a804da9530c6a3398ba3a3f021caffbb21637e5070ed270fad5c3e548c30203f878545be7a638e37c7261c90e790f4c2a657abb11d533e082d63131970636c66ed04efe0f539a4fb53f7663f6ab61f1e9740b7372f56651f749148fcf9dea59c113cc0cfc02147b1463e4442244bebf82267b1a8fbfa79305cd21a9ab40633e261cb6711944880543f82e18878e11a6313232249fc1e84d56110c3e1f8cfeeed4731754e03f73c1d41c4f4034b2c865be2ef21967653aab2d4ef7920cf2301b01b4d43f4dcfa157f6e85915303bae4a8c3ef47bba44e6297440d5cf2d94dcf25ca6190aa1b5c9c9703692d4127397d110bea856bcf3430b6579d21626b0bdba52c1d224570365a22e5846aa8e45549629593c9d27ab91279af1a6c22ba1ab61653366b5c51cefc06784b24b9e922552599a74a5e8bb22a11f89b924f7ea90b27ac3599e42472b62731203b50c539dbd8ce0133d96569ee84d9ff887b56852e6e2ab6b8f682f9cd1ed9cb582b9446f62ee765cb3878f6e86dd5107f225ee0463bed900ae57293365f83f2f09eebbe54a44364c5f1203ef3eab19882fffd8e82ee8a5606a9258c0b82350e350d81d3ec9215a79b920aa7f6a31773aed191cb7d789802cc17db4373e029c2c42c1630f47eefceb6ad5c821420f2b65b47ce6bdef77688cf07b721c4d6a323c0c6f5e86bed55a6521efd25c241e6ea5dc6943703c69998efdbfa06fdb039a08c824d7f0361f874c671003c986c1d374f04bd830ad753d54b3e5a87f502cde3fc2c9e14b9465faa30a74b19413b44cfafa35efd7adc95a7f4ba1edad324984a00ceda21b7e3786219c8e1887e9ca51e1f22b25e687a61028e4930fa5e8d07af39807a68ff9fff246c5e470525ea967bd228a23448ffd94279a7904d07e18c899109a1c3939962fa3a2a2679e82054c5cbf28d19be861179cd3f5d1a8bf33299a6cf1c54a74b53b17ac314e57aa250789f24a7535744a2c156d8743f0a2bd6947d9a64f1fda6b92470a46806eded6a35a7509f4949df79b737c93ddaa199a5d7d1659767fcb8743342aacb8f57fef73de58418be820a4b16861014a438e770de85ae000c14498ab2cc7e0e0282f73f33a36d8d87f73e2b3a9960e628ff5a953e47cc9470f3033b858d2d4688fa83cb0f903a076a99ec46fecdf6b072a3f6e4b81c66adc255c7c5bdaa2ff992abaa9c6ee964d441b7c38639bfc971c2a11b4611ccaa186bfda4772caf9ca60e804b1ea491e7405f62ab1bc25ebd83b462eea1f76a695617f84da648c90f4c6f69dc4427efe1a12b10f1f6e70affdc70aacc1c809c4c8c050af9123b2f6ca3d3b187164384fbb72b2f4d911d3268c74d98c547124207893f54a39f4cb64181133f04bdc185da4d3247ec66bd6d6838b03704ea86d6beb3e7ddd1c43dd6de18bb7e69da7c3209c20e7cbdc9d05dbaa6ce7487b43f4089f32f0a0925b6120f10f4ba818a899c079135476bbf4955350a5dbb33d262491cde7e4e7f2e1b4a6d2af1ff39a1b7584a91fca0deab246afd411da56cf30dc1776622b5d207aee1e8e863d957f11981ef1694625c47294d7c7031d06eaedf4d56c697483c822c00824316a5d631a72491657c9d8e6161555ba53646e99413a2a34d3356fc391207be6b206e02a0fa0989789fe7c3c4caa65b98895e2f70e18a7ef3e92d42e91736465a10279c874ec4e6ce66941629921ffa64f2115312661e4e4c9c24811aa0933ca1570b2670823bbd68c3280b8a7aaf3fa8cc927495e9f9cc07e21058dcf590ff8362bb216a31c212f026083a9aeb61f9fa82b21c34b77a9fd409fe44d4bf134c6e721c5b038c9a5e4c2c1051d38bb5cfe8286a053739c78d98e2a71036441b79aeecc8185382eb79201b3186f05e81ffb5b07d3678cb8d039fe8ee07e01c1bf1e3b4dd6a6154543d6829ae7551142df8b6ad96660294a3259bd8787bc59042798d99ea84bba863590cf635df7416225ee8ebaaec3ab546c074261508817074b90cc64afbf7f58960f723729ab6ccf28df458d9a6ef7fbd41d32a361cd63a45c3e4d3e50267fdf830277308c36801e25ce42fb911f098af53e7b640ea42a0e67d9b36389531ea644ae57071260442027e1ba6fce909b1a7542348acc07240ae31e7f51951e12b410f1fc692fa463694ee1d9d28a0fbc7e849c0915c79cb61dd6a994b1f578e1cfbd72958480ff629ae15cb1846148c29d42000ccbc9331ce58571220f553b4ecf598e218f93bbe9499c50f539eb9a2fd69e14536ebe3ab672a2cd52abdd182a444e31bf00290eb380d632c995b77ce1b9d36953371f34ac2cf6b8e190fdf7c122bc8e4381114fe7508946d408d529a2296293726a90b572771b70ce9d3d5eb715132fe4829807db98e5a4d3bd7b62900f7b0efc56d2de7fcc36281927a182f2df492b66b6c93af8bbfb5275aea97ff9842309369d2f05bb10c8c31f16d02b7defa38d8e4f0b284c5da31f2d020bc8dfcf232528b383a41a6c3c94c88aee81419e1fc87be4dca58b411395a78d95ca9e25311a5cb0ba727bd5361149d058d70044050821b927f41484354aa7f54486596ab417889d948bb278cd5a2f39b2a9f1e876a012c4ce4718eae9ff6d57485a44fabe08c6c8f9293f5a863ffc990ac1ee55854c86cf3911fc4620456e31ec2892ae7fb154b3abcc57c5e7e4631f4f4b4aa801ed8b78cd73e43486556c18e6592b5adbe1cbb939aab698883421d638b2526752aa10ee724a80ae04fb21e1316a03aa3f5c09dc61aae6fc7919b156012081d0951ba23f549c0c092fea4cc52c73d05db53214e3f083c59dc76b2e8d7c9a2f6543dc0c704eb076b26308c66aff75ab799ee2e5910f4d941e5ab638a231927d90df446db478ba68a9f41a005a7bbcdd26699a903e16d8159c870b7f695b5f4f6ebb8ce3e8b3902080ea6c0d6f72b908ca8e60a3aaedbb897eda80b45f8fe7916d3ead00612e46fbf6232eb36814d0445b960f115b627b1640eb42ecaa201360ef60b2c5c0426cf30a5871d1a11ab0b3516fb48e7d97c71e4b549ab361fdc18477c1b2b080580814303f638a2eae917d54530aa5f2c295103ba488ad898e778002318f34426223c99dd65179d6e4b8d43221404c2f11a08ec3c0d4b36fc491e74aa40f93b362a82bb81cdb71bd622a95083c12537cbdbfa972c1e3947ffefa7d0680ce882d44a8811b47c5d8624f472829a25d18a8d3d1adc4aa7047bb2691c3eb6eb0e0b1dd5ead171dbf3f423562888dd0f66be52ec055514e4c745b06d0f37358052e1abef712f4a26bcc7a8b0b895220d14faa8ae7a35042daef35d910fbf74bedfd47c0e51cd76840ea24b9770646865e0e4c3c415cd7541cd123ea765e6f5c98a40997f8a4ada5b36f9a8f705642f71c8518483f43c0fd2052ff5d7036d412b2cdefc02b3b6bd99778cdcd62228f2ec8a746b7ce18dd52d09000bc99cae49b85a9e3515a45a4a04d1d72deea9077b70709d9918885b291091fc4c51cc30e29f63f382d3a1ddc34d7e5c1f11128d1f2c5c8406809d63411e3126175e522f08c3e7465da6579290ed584e8af1f89f6fff8106e70e84847b09fa22a359965846afc0e94df61182e2bb8361b1d22740e8ae4560541a5a6744af97bf8bcd29d24961a8c59af70b5d2cf072c074cc0ff37d43a09163bf28a94cd4ad81d671821d4467cc34ed69742a1e255ee63281cd9b34f11d9a679a82595f8ccdd895d80fad4f538c18d36ee7eba11cbb80f5098a1dec42eb3dd885d6494486920351499e0afc5a1dc2cc6a5b160ed4be1827633d8336244680291c84b182c1824860b00acace00b3455f717bc95b01ce12cb5578fde310717c6b029325eb20cb94e13f5d64991c39fe6ad890248611e52feb74c979a201f202d927b0bbc0defc74e69ee18e950844e312a7a52839430bcdd0891607a1a7c0d3f6d6b9d01c6087f6f6406ddca4122b0c6618e10d552301ab75f3be8490d5ab4787234a66d2042116487cb3e025290405e4e4c994f28b6e082aecdb0eb015862e49d343d45bd7d48d6507a2dc06ad5984093d46410cbdae2923982c2a4bdd489516b23daa8e77c509ae8ffd785f10349bacfcf8ad60d6358f503ad980506fa045334e7e72a5b5124f9804b45952040b562d1471f07c007f7110a1cfa104c2b6fcbf53913376c538884731926f46f8d46319767d3f9110f1e4021790c317166a1f9d8b8ad0524711d210b3f8ff3de3750edca8cfc560c0da978d05e7132483d755ab8792bd9bdc019e194f3061d5e9f77143d2f4ac3aca93f0432958439da2d155937d261ba5e9e8ec85e4a9816ccc15a0181226b5607b00ab8f73f6df0442a66ff98650dd633c88cc2eb935acab12c4b63b7ddfe6cb2d29c73f027b3dda52c8b6155dcead499d4912a56773d1425a781b0725fd2d37148f6292f50fef0be74156a51f0dcc738babc3dc131a46ec33464404386b5c8302c5c62e15e0522dabf4d1c034f13e15803b0a3e6ed083876bf84c35f63898cc7deb988b878394eec03456230abbc66eccc680cc7c3adac8ffd84d61b5279fdea0b7bf9c0ec6d87d87ce496d4c12de7be0948d0ac59aed02af5d03f7a1df9dfaf99587160b7f07d9765f6cfa51905bb0d190cf5e0ccb007ca646fddf3a9945da5b211d9a15d7b7c1987d709a09f5ff02698bcbc81cddf1e8b25bccb0576f4f6c55c1068eac460ae6ff3294635a68d78e78b458fed54049fec6ae5a22e508ad9365f268fc3c518f6e0ee62ba7d5a89ade4eb2872899ac0e61854fc6874b650712a0eeef1c03c07efbc28d37e794c022900edc4e2242683c416dd61bc484eba0e7bd9e4f2990baf692b3042227cc146318d43918df95b75785cda6dc4a400e14969be52a42e72fc39de61f3f985d5ef89f26ca3a2da8e1c2164719ecc3786939901eb74c5dc49c41256a23931f0cda3c286f073e97f36f0acb318fb6c34e23e947115007229472f1828d47982b16c7a5e8cf4a6bdaac8562f17399405ec7bbdcf4a7ff0dcd4f07e6eb3e9b99cd49aadcec877b56c7063f23c36c5dd69f083a9b66bf866b8fa89166e1252bb92707581907e25be8402919becf3463e901c6b97773ab1a08f52c0dc1a0a7efce4c27291889490d8f7d477f808d3d5ef09d374d94569ef0aacf6cf091098e2ae693f99f2b131c5029006ae9ef630827a06071b4716fe2fda213079478b6f2a40f0def79320152d6d86e5aea6b7fed30cac9b3a45d61bc19001aefb92bf63a93a6d7d53426515884ab75ebaea4a37131d744cc17f309309f785a02d4f0f192c0d19f69b80447f840cb5e0e44e515d81c9528187dda1510746f1bcea23ee1f5739fcf4282026c811aabc47612b5b4d646bfc8d715c476eae62b671ff2c58f93fb4c289b04edcce9b1b32352b4cb2bb5ab54afff6be133e2190cc6afbd3ab8e6f77e8c335b57273da05bf64fbb6d0c8b4d2090893773c0ef3c5c034a4cfa765a3016daa80309f7fefdae7bb055ba7f3f47ba44b63af77f502ea15665c62c51694d0500c7624cdb0ac1b20cd867f318e6e75de71b635e8de37676ea238b1a1abdbf43ecfa8f32f77393b9266d1e1f3fc492bdf7de524a296592293d072e079307b9698ccef9cad40aa98550968f6bb48d83352c5883004de0f8ed2629b023dc146337741605881814ab294bec0b2cfb0b11d963ede545d9b75bc69a57f36a88f404df89021799d6a919ff2b1c651b3ac0a4183c35730cca02dbf880c387c1e264044ca5b3001a6981adc8ee57b2bfc362dc14ef699d2f1ae50179aab58eebfb1def5f3ef416fe1bb2372104ee40f9815ff43ba17f0149f1f38f1b2e227a542911b8237a0c9222488a01e65ffe070c0825be0ddee387011bb4e1fb17520cdee3ffe13d065b9e5ec05893bfb291c396dd8e2ba905908d1cc69e924f91b9498ac7dce40e7353ad6d5cfe21898a5f74f11b7013484f70f41e2c701857abd6895fb44d91222b4f8118d9e3ca4a6d476cd2a8d27f185f0dde8b3dd65a6dadd6bd56ffaaf732e5813b42525e9dd16b2f30ce7193914cb7c7c9a078f18bdf1ff546a421b0d7f0c13403ec600d0f81717c00b4604011311e1e6891422523cac474c97e2fc6a3d1bfc9d4b2d7cd8dc9e492e404cbf87996bc7dca24eaca3b6553769f82169c60388a60f85d89f4e3236549755e89f4e3eb2027528848ed7c2029bef7dd0bf9ae486d3f24d5518fe4043748e71cfdd7c30729823178eafbefbd47810baef1138299e54aaee4cd8dc9e4b31196abecb227bbf4f16e8747d39fde0087324bf62c2515e09922703865a329f315fc290b648ed399d404cf1c9a60b2c8248a87057bca3acf1e70caa6b8299cb2d9e338b239a5dbbe1ef33f080c995bb0c421060ea7ac25a32dd994394e96517daeaeb7284b9ebbe9cd792f06b6b85a4432ecb0e367477661070358681c1a77c4b62277e4a65186eced7bc170cbd137ee5e4eca7b6ff732d5b5785c54ca8e1d2a6bc5abc0b0443b69fd5074ef0d6eab02cb422db7dd18c1d073a5338c9e3d87377757999393234fafee99235173da0057598f29397ab7951d726166b084050e73b2b390e3afa319d03834e6d09e1c1de4d44a6d8fa68dc6b9ef1f5d124393e4f8a14fdf2ef7dd9cde9cde9cf37b99fab612e591d236323ac54d31476e45d423d6d608c83c1f86d8f493436a8c46a80fa6b9ab20c9c26ec19ebb0a922baa2099a2b391bb0a122332931c9a66496cf2de2b3d2677cea88289f1daa8e2d1800b4323c87b791e7ee7fd8e53fc24e3014fd0db89aa163089e29312225b10ab2205f34ffce4df4dd9cb3b11987ff918e57bd307c70df7251a2214f92f7307dca997c791b7ef5efceb21fa2159966e104c7f8a80660cca25dc4754da521b18dffbae24839b9c03232cbeb8e06d6ee10c38fc659825262f5f99bcbc7c0179f460c9fe29d4701855dd7be738d11557339b94601cb9be377db2bc91d2fb62fdbe1e3832fdee899b62a9e3138c599e0ce190588ee11024194b23592461d8defef6f631ac076fd6bed7849f37969c9265147d2c6df6ebb16d943e7def43a570061cf9035f00792801875d0381087c012fef5fc38ee38433340d7503cc7d17462fb27fe4894bdce49fc21538ec9f97529cf9498a8f0b8830252895c9cb6fa517304ef1530090e0f046de8c84c03c242af2a41084c3280b5b369b531c87f648e138db7f815ff7fd08fbac1a3392e00d0c67c871589620e9da18c9b264073aec80a787942ba1a2074c088308294029ff28a39982c3f8f28f3d282236d58018e316638c31366d8b607cd920c16194bde4d706d8b8008751166535005ce942d03dc7656e8c2e27ad934a8f76bacb51b4b9ab34c79f2418e20fc9325b2c59273331a74471cc39e73b0e4d0ce59cf34682352e2d9d73ce9177bbbbe577774ff9a416b6900694b2939e3f27a3c805778bd7eda4d5be8ded25f62987934aa74e7b544a1dee31e67829a50cbbbbdbba94f367947286b1c214399cb4941c7e32a9bd75b3b74eaac506ae30e55a5b5f745a8cc3f3bc6ffbbe2f7467ddec7dd559e766afc7754d29a5b36ef6be2e9d777610b173cc69839cf3be6ae7a0df35789b683d41cd723e4c8c9c3535e67dc5cc8f91326e639b6afdf893d6ef795f95caad52a9c536e7bcf3a3bddb9db4ca174752d29dcb49abbd1bf7f5a0cf598fbb37372af4e4708cc3a675bc80a375ece33a71482e832bc4f076f3c2cdcd6667c53836306c2010e3f03cefdbbeef0bdd502824aa691d69abece6c6f7edcdf04a5d69464bc12bf244221c3dea98d7f4fd232cf3795be7d87e4e6badb5965ee9f2fb85d0584159e584818991356c8c171323657cd6b0218e94d2992738e9b437524646867b594dc3f4cbd4efdf5a078e392e0d2c70fc8e1bc1288b6094e54712c8975e6409c6b6d9b69742b27dd96db3fd967b88fde1267f207e8a3a22d039fc8124d0361c049ae0f8dcacd588810ff672574102041798cb5d05c991cb83b7dc5590ac381d7097bb4a0f63541ff097bb4a0f352099942bbb5c151d544cd08c30a2c4c7499197121d5808c20583150b3288f1b062c1355bad726041c92a76f188e6aed2032b871fda625b6e555e77cb84136890c39b1a0427b02c0e628c9105be61fca02509b8cb4d450c2d6ea888f183160071371fb0979b8a1851d822e02d371531967001a6b9a9889184037a5859bb552764725379c20cf2cc5dc5054be47024f33f9856cbfef2c399a0ec4f03032cc3048c672b7f23368224cafb07402dbb0d57f6678013f845830b318da3c90177b13b1402bf091c5618154564b3eb9e87c724ea0349dc0f4985401207fa2082679806f3507e841effce0e941f2ffffd0e941fa2870177448fc11d0c86c09d96a79d0be2d9157d68fabe53f8c351e83b85411ff224f2c94c5e98e1b0ca2c886761956d205d65cbb1726822816d0e2391a7200986fb348850f1f0ee96a69b28489a611ad0cca7abc8e18c1225539fd6a913966305a3cb0341e0012238c4b31ce99478967d36fb3b64f3d010baae096f72dc56b5e3d18d2e787e389a738e7a7ce7dfd7435ab035ba71226326c30a8bc5922f5b9b25518da71437511adfe6b2fc842feb22699d769c52f6bfad248db241f2e42f7360595a9044592d6c2d071b6465a14ca5e0f0b264fea244e0f8a1bf2eebb25a27d2238d1ac593ff4d620aa29bb800dbecb008de234847f065657f5b6f08e004d36f5bef779decf2b8c925e5b22e4bc6aca32263c2137d737e736a11795b6a5990e045169157040e2bcba7b61c456b2e47d1203fbda02bebe5a8aaca12754c9022a11e691cdac5ac2ca0ca9a4059806240b11ec464b13963b1586ce290e7e343639e4763b14ff4bd44b1582cf689704c147a79997ac11f6df1b896bc44b2cf4540885ee7ee34667870a446709a6791fdbbd7dcee064e3ff9cf58cce1a47403d3a685414043a362eb477d43b728f530c6bc8a2a7208620e636c1459ad58eb24e98e41746c921d0c3939e7ac776b9b188bb1dbd3754d68ed767dd536be5ac156b0150cbb0c870e5bf96ad53a455a27be731c0c8cc3425f7994b681b58dbfafb655f6cd9be80be25602123c3b2ce18baf71be0c847fc8fe9e2477f1ebd14dc80e7b997429250c6667db6cb2260ff2f290a7573b0f594c124b3b4aef25c168b210b2c72064ff1e2d7f79ec058b32727f30f80d99febf9c732e99ac8ba5eb9ab073754af244852497fd43996fcc510ac9a863c61cfe977a1ef53c29dac63f447d2896ec33ea88ef60778e90f620fb532b9e494e3085f9e9097db9c96bd039fc99cc5ae992b68982435aa34b821c4567ae7214f5f15318adc37b7f5a6b9d95a328cd4f1e487bd039be681c4aa54dfe6e6b1e487ba664ff484b38e0b0b6eead50b27f786a55576dc9d34b2601cede87312dda2512dc5c1d3bbe33f43d0fa7318ec6fab349016e398efc2a1382f9b1f3484e7004e91237d51a2a79aab66aabb666f2a51fcee4f07a200db14b0e95a04ca053a2da0a9566aaf3d8d467e803f1cb14067784a44460cb53acb4457996d02044952be8c9d4ed5c9e8b6ea032cac47dbd676b7c29df4d2e33c3e1e714ee2a32909269ddeedd6e0b170c672e6d381c42236bc133b44f0e3fe0fdf6a252034a107053fcafe4e3c1d00379c8213b5104ff04db1c7ab9034d3b39b4cf8122f00cc3f3c39fa176d30686d3beac4f30c531060e3fffcbb6264b7aa260ed200bd8c3e383253e8009007bc14484c1226cce396788b16b2df94a543cd291e512c5ec12f5f1e45f5393e329bc81f9e867e3423051701861eeb2b463bf7778efcfc307ca03232b8cec5fbdb73d73560d6781cd8594031c36500c3625186130304c8047a153681cfa08987fbb39bb299b73d2168f0b06c39c7f58d4bce8afb941a174ede6a9deb95cb608ba9212d23db35510a9ef77280f3fa484d0f841eafbfeff4a39be827f4729e5b81554b82815dac65f052df00b3d366470ae953232054e66768d32b4bd731cc7711cc771dcb5b1e785daa57516b1e4b9736f7aad5a1500c50e043c812d9018631c8d9018624a952754b8c4d898d9b0722fc6a3115699b0ea656a1d77acba17e3d1e81fdb97610296a9ba5a2b0909d21038e468d931171c62152692046e49bbe50cd110bb641941d882d9bf09c494fd58ea7217bf0788b8b8c9ed631566e11656e195fdf838c85885575f0c326541ac8a3102abbad648a9b42f53d6b6b00aab6ccc3a2b4259e51e0fa52f37359601008cc3007df24f0096c9883492e048bb06d804b79be4cd121d5881658ada14489acacb8bbbd7788dd7b84ba26a6abce646eb44240820a26212e2c95f47c71c210c0c97c3a825aca9b552afc6889a2d77d4abb9c9ad43f38c11b87d64d4c2c2a1bbdc6ffd584b31b2e4290412208d7a8030d9004846b058ebc8f7f6f1256de3ae9c4929fdeabdee72d70b8dc3d275dda53b55bd3259cb64375f0c9eb29901bead3ec5a7206cb66c1e4082584a2dbd31524aefcbd4a591c7a501951f7bab9cd48a946c7d20255b9006cb258bc03309868fc9160c517053b0b3caa7d6dabf17ac74da79c150d2c85d60097e40beccfd00cfe12de19b6dfe807ce9a62f0c65c73563e0d0da4983185a4c16aee9f2e9ba9e6bce2953c8fef3d53a5ff69f4f1c27e2e8804397655acc966564c6a66bbebcd6413914ecfe04860390437f1201fb71e5268f443c7e192849f6164dce8d2282434e6afbd54d71bd835bc0ea5251c0ca94da3eec1eec9099aed284cd7881a5576bafb5d73e0fb7d66e2f53db666fdbb4785cae181ae7444d4867d9638c52461965680ab8c5ea0267c115060cc95d2b2527f36bef95ee5e655382787155b68bf7b81597b9cc652efb524edb789ffc7ba8134a7da4038b85c5a2755a7e927e94524a297599cb6e9499c9587975ef0d812338e7e380495bf64838e0ce336509124086438ebe7fa8266aa27168cc45b2d6994f9568937f289a92fda913a12fc27a84ba94689cee98e3d0207a5ef96f9b982638318910f51cc90ec604b58d3f03aec0e1f7489704e7ecff5f660646ccc28b2a57b090e477952b61e4ae72254b6e09b610b9fc92a3e8b1f264b665266507332b2f77e18a9eb451376a664d8dd609fde444fa618ecd398ef3f9f89828a35aa5a452d29c99edc96ed3f7ab5b5b6bbd60e9b6cdcca183754444498368175a9327a735896a5af320a29c5a8e44d12ffae44db8550553040ebb5548578e2341079f8211a38e0892e05225346a64b3aa2ac84ec80e8246511a061a95237f64e81db49f1c2d8274abeb5de4442183807e56124569ad5b4590d6b69c9c514eac31568992e147f64fffcce0e8825544b8647f5aa34134b410f3d35ae79ea23589eaeec5b4d6adba55b7ea56d9493ebe1f921292a235afe44cbe4a59485a3c355aeb60212b2e25597e3f6ec0911be4608727331bec9092dff2af942d7bd428c1d29b66d13da303a61fc1766fcd5c2aeb7944c016c4a3d1bfc914defcff9cde9cf6fbf3617978582535b21a265e534e191b05f30d03de1995c8ae6c110ffd382af2b82ab40abaa12cd9b5f06cc9212a8daa301f867cb287ae20c9317263e2f2aa19fce4aa504f9e69cda86656aba8a333c292a80f47a20f3ff4a1e99b51792a2bf0b4aa19b0199544d1947f4131877f9df9c77af06ce4137eb4ecefbd1439f4b4783337793ede8f476b9b2c406e3a228796c7aedac66d913ef957207ba402654fc18056a5b22ab72b1818181870a6070e27e0d68c2abb4a5523c3feb1a08b5ec4185f1e6ff7918d9403ecd9e3129e6ddbb60d6582eda6071c76d0f7f1efbbf44a343e60d2f643f206ce2cd9c01a6a84c09d5b9e24d841b42b3f24c9fe3b2bc0f27321b298601ba0c4cfb3f7a177f06385c06e1fd412b08fd740b38bde73c088c44ffe219efb2d79e2136f90d41c601981ce92637868495202c7fff85d25b0ccfeb124f30dd99ddbb66edbba7bb7ed7edb7697b058b56f8a16ed092c4f004d175642a3057905a179b41fe099438f526a6df7352a034dcb2f281e316ee172c12056e00cf4001e2cb8f003e9756e5f4a29ef9cb369415c56f8006146162870e15c8e638051ad7506408de49022e1428a2453249c8b7b15c1e1e55cb246090e39176d39e7e25c33bce8bae676bc6f77c0be03f6ef1ca50d1538942a1c6b6d0862fc1ead5a27fef6f2a58ffc719cd9d336520a2c59ca0c20933819a0749a517a912a227e922f5552155525180e5d4b8f6bf1da160f7254bbf7384e15a2881343c8f28796fd474ac0db73cf813648c9c30f9004f6211f887c1ef25f903be038630a9649d4a66ad9b24b49c0e1c87de52c378244d25e52d5257b772a55cec35b890621f93e0dd15a6badb5d64e4f4aaedb46dc6f922ee1728320486edb77dbb66d9b94dbec400ea4ad6dce6d4e54c93f927c8051f569d847e5340a95bd398ebee4699b735bd23e4044b2eee4cb0e58e143163700197179c1a50a2b74b08205136eb0722943edb500fb01a3053ab07e6022c8185a544065084e7228522b07ae5c8905a18758159869095ab2588293245d10c1da39db41105114d1042798e4200564f645cf154a68222528e58f47f70e40268513ba50828b275452fe9364892f546005079e6ddb46577e602d01450f530891f2278ac0250c16912955ec90f2c723514886da4d5c177aeffb3ccfe35e4fdc24fbbe28220b0f58557e666eb06ef090fdbb17cd7788c3518679c13460cb1910cbd30cd85de1029645123533ebee9733b30e0c7f66662998230c4c676a3333c72165ff199fa82366ff991fc7a14914fe0a86a61ccecc2418dec870661667b0e0ae71a56d10e08345ff7d38338b3839b0a8c3db81844c92d611a5883978645c32add6b93e0022ce423289aa41f2e4219a44e10fc542b150ac445304d7a090128d82016d0d92600d8a6090fc7a70241e606f147eff0fc5240a83333ae8933f3dd1506c060a39339b91d236fe3546e017588e8fc1298e78e508ce605b52b2bf6dd99628c797128698239ca18368ae250f9c81954439865b8ee3cc14114d334864ff7087911cca2cc9322e191e99961451874c121920a214af1c866a1d92c9937f68e6a11e4f613014932757e53014e3810c7ffc2a305318637066264f0e846766d9dfa59418cfcc666637582187d981c543f692a750e012ba3ea7ecdbcb8c2e658f5f0bd5da3a67a5a54ec592e7990f9610a4e4f0e60891f56f02aa02d452dbfb8c18e0b83d123f37d072811d19b114f71b5805074b72aae040851d5ba9fde569248122f860d1c40b09134a8628f10418b87a8083289a20d25fd3170ab060852a41113688c2e3a2010d944839ac5523e20a26c4c821e57f2351fdc5117c48820b1030c8a1966a40911911ae2574b1c511523eef9cd7c692676b37f0e6c60b9195394319fb8f6496c0b76ef1ebe6e45ea6b8edda8ab1e807114d94050a5c70f804485929bbe56bde3b4ba71bf94ac0f6def82fa25571bd92d9ec1567121589109911f948a46dc2f8722721812b2b5f22ad13494360e786b01f4622443016c73e3815f44efa0c712f53a357cf775b7757f214ed91a8d188f68c68cf88f68c46a3d1d679930399785b4ba646dcacfbe95e2aafcb9128af8b2f7cca893c9073ce7ba7947b848645c343adf5e57526513535b39ad956aba9d26a609589ca8f909bca185872ac3d8e1356268e13565996394e53e132c5715e4f1cc75fd9b1c8a197c32a933132691db73838e0b0ce6473c659673f5635ab3e5187df6057b5d6708ae05aab5b1c67562b97eca0040225904f9de580635eb97003bc8104df60619f93df2a5d90fd7d148151b28b4e02c1e45002d5c82e1a55af0001ddc001bb116de36f0120bd83935a6cc145fbd4993cb98f042b2d827506f3f3e5b086db2ebe75566915a8ceaa0fa5b4ceea8c86f53225465595357aa25010891285704480113ba6571a1e8d5e60800276b4ceb6835433a37574e798604893d4e0deab91c3d1684e17bc73617edf37e7d7719b6c0a8d16648bb2c844500d3e673745333fe09694f825af2b47e6c4992d709863adad350bc63c1188053ac86734f2d8e209a2b3d2597fde6dbb96c75543a7c2e19d9be469ce1a1b26b8ddf42d6bbd773665c24fb775ed096822a703735480e2c3518c3196bcebba8e7b8d5af0327bb1e22c16cbc462fd777172397cfaf5f8deb276e40b6460858b9410a9830d5250480f0073e80e059454e8af96b3bc0533ddbb6854f42fbc0972e5efa1238d22cdb8476992637e2381b1fb91a8b1b75aa7b64ef7fe1ea5513126631a83314fa28968852533b3c1d8f08b5f9ef529e4d0592990ecff90f134ff63f4314fa344f3334a311f49a4df91f91a323ea6347a99d20e941f313f03eecc7cccefc83ccd5f89b201ca8f9827bd0d34a00d507eccf8d1db40e3657c8db72106b461c68f9ef4118c41c6d33c10194f03ee40f941fa98dfa1f1354020a38f0177663c89a644e3634a335e4a1a33420fe490fea824a3d4f244533fa6d4a908248160700a3fc2581481640e90bc21fbdb985cc5f22c8b9b68fee326c7e2ac92cbe4c95fa6e4475288f24da4b39c0504c46a9d2eba811a28da18ad8d79998a017784a4626c4c696b9b96b39cf532e386bc38cd1318c360b0d78c31681e9e39a7b5132651d3f18c47b44e18918a1b342a27f41db287be82ec611c638404bc45bee2fb30ea207b1f462878aac0e1080544721ea74429b0fc548f5a688a602012951331b8816164c5558eaaecdd411f185e0f8ca70e8ce104ef08e6feb5b0453b8329889b5c861ae0308707954a29a54b0a0c560bf96008b4aaa25d62087ac88f4fca8094946ea06db604c90193e88724da5c40d5a12805f4c97fdbc21da4ec240aeef05cba82c3a6d198529e8254156562cb1656dc1cf7e2dc1b1fa068e9c195430ec6480d59c28a105c7001820ac02092f26fffeb7ffb6edbbdf7b64dcb4d3c42749287ea75b2966e24ca036536461965ade3ee9d9451b6e326d8116e72e130d268d82cd1e2389116b3d0dc80b7681d241865f961e422cb5a470a1d518bf844eb4422c4fe6078c9b20363163f398d86123874200f729c30c2f216c701d2e23835c7a130898a341a2cc67680c39b189afb9335f9eb01862ea594b2dba6d2dab57685a13e4d0a702cd1e45a9289304cc0e14d053cb0a53c5520d2684037ad533f47d976d3ddc892c8e291cefe059239449ac768add3c4a572f3956ac170f4b9b0d5ca551b5badad6f3f6b294bb6786834160c96ee87e613937244b758b52d33f40b5dd336b755918bac42860c79b1cbe5baaed7cd8dc9f43f1a614caae159fa1a6621c93c5a078646dd20fae4df24bbc3a84ba26e6e4cd7e532c514059fa0810c9c480941a10860a43e2a9c90922693cb715eadd3a45141e4c9ff46c149646f22fbcb20c1e175455587df86eebd173dfe0a881ef3f0eb6a1bf7ba0f9b865ff440bcef3eaabc5254853e3e06af2bac2a520d4730bc526ecc85e42ba3140c5f4a2925f8811a8a954a4e7292fb80fdd835140eb960289f860aabdfc592addeeeee5d23cc4d6e2b18cb32155712d57de81ddca16050418518aac86acd2ca1520c0eb07f2094f8a94e9ab2602f77048904a149da28779dcb55876c0e0386d7bc10b58dd1466e8b92b3f6f6b5d6dacbc35dca6bbb678c44a3156480c39ee518cdb0f8749ee32687aca78bd147edc5881635a9020d879e0c4f1453136d4829e59c1d3bca392795e2f29c00c382e141fa4ca29aa652a98448fdf8152b683e63838771dffdf65cc94717e5cf7ce62687b9cc7b645813dd64adb5763683d9ac04e1ff5fa23cefbdf76450fa42ce9b22283f49e93f115d177ba56d197ee1ca645890c7152cabd6d6dbc2aa25c42e1dd4411d54430dd2a54b972e5dfe67598344794abaf491474aa9055a0ba01b206de36f0304ee1fe57e82bbfb5b8cf5c438cbd131c127e0484e0a7262ac602016a0bf6d2f2fa4488a209408aa6e5c8135f0701821bc5a4ba5a4f276500daa0ecb9c4d2b2dd305d3afe993ffbd18cb1a5a12705893e5bcdbb710fba3a147f72dc41c7d071c76adbefcb026d36a1ee43407a2d1dce4b5a88a2b10d4403323050e6b5ee07cfc00e2a6201bf00018d64ca95e9c31ce393db045a3cdd90d820d7e7a884421a5462422f48540cf85d67129a594b6a99594058760a8c0918806be3d03ada33b47a4df3ab5678b2b9f28a8a44dd725b5758a4600000248b3140000200c0a8603229158482e9645393d14800c718046745c3816c883490ec4280832c4180089010400408000293335b40100d688641f47bcd21826546ccab075a1a8e40fc70265770515f872359336cdd01c4069ec4512aa6d6c9d8a2fe940a17ecef8b88f24e73888aa5a24f84882a84692489607e5a92705158de306af000358f94eef8037ac760cdab4ea0b9303d82c68f994a4ce9026c3534814d8bcd0632394651a9c15e4773e0e76d863a1f6fa40427bd0feb955288e2f4129ced8f99e55c654e8cea9c3398e9b7175b3f08741a35947f3319cb03ced39d26209ed2a5373b90fb47f46eb79c4f82b89c48813c0534200edbb5ba0e354d505de83213eb90dd4381dfeca8a305a3185f5ae37a595780d4f5976c372c2a5e85c33f717a3e530ed7ef514a9b609c56f270f4cb9c909b6630b6a148c5b17a8e9989a410fd3072bf135e8919a5490a075acb95b41803674ce6c29f1097ea3299df8217baf260d87221483947083f36f59bb5f56072ad780b5ce0286bc067481e51777e485f89d3b9885231b70b51eb28b43e9f1d73460707f2375cb40432d07381b5e500b9004ab20e41c4bbd71c3b5f0948eb01c487d173e0d3590c167b31d09612f3a41ce37bada04dd82a7cf26359fa1b354931b378e347efd7770f0464f03d0f36a14a64951b529c4af6b7dad80d7db2fe51db636beafdb62f23bc9dc58e542ed9601f626f9cab44b23e7004178f7ed87652e4840a779c03b41e4e5862d89de647cace1fc23993553b173047092be24b4b4c3b88072c01923c3c540fa1108566432f9d0b540843de44a893d818027dbe44deb39f69164761e45529b4c327cdb905b3e711aafcd5b6d2298110b73002d6cb15fc5b40a766eb8c3c2a1ec811faf3127fe9d8a4e7e7cda067b28d7f8d28cc78167a5f84ef4b913112abddee2184b99a5cf4cbcff73290ce1206fc2b399af441e77e709dcc439584153b32ea0f24b655b7c579958836853d8ea4bb5728a60842b7a9044de041169f0e11d0c81669841f9302cc31473090855cc9a0a94d149aff24f0dc1be3ce582e1e8bb0c2fb02499bf19a7a48ca794f4195fa1923f36e90f817fe442c45e5cf8b14a4b69618358cb6688c960d0a18f7a9d088c968e059208b570dbb8cc56f4d6d1894a712ad1d54a6f1ba29f99e7aa63d28a2cdb754d180815996955d1add38e291f516c7980c60bba490c015d1e52af1082a356b92f228264128bf33698b00251ded7fa4b78cbfb1bf0007ca1339b82e0812655b7ba5a01c7f14d8033570ac20f25ec59e6bd8f41390d5c918321796590de27a2f72ce0ba2183c06ac310c80a4d2c1363b3c69783c741299b4b2a32e6b3d27f77a7e9879a9aefebe08e445f4b6fd3c326e342f8b4e7436afc39e60a2502416567f3f0d922cd12afbca64fce52e2eedbef851746e24cd2d92367bd2018a3f8eb4177caf23a3685ecca07179b0e2779baa8d05f6a0026a9e19395732ae811b3eae3df3086d3662e90ff19a58c44114850a6f2b7917e91ff5c763244d983af00750dd93c582de5161a933ad14f44cb54c73f8934d3bfab484625573e191d85c2a78a7d3a7cc991ead503853329dc6c60777db4ff2176019f95f01bb1865994cf0ebbc889c5ef2a079db676b1d857e736bb810ef929ad607ba33c48539d9f9b4915b9d5d4e7b424c2549afae460f37938e8245189d8881f4a1b7e3f7ab34efe09f94e403fa02139b6dafdb5a03d3e19535a8d6afa4f588e45b780acf615fde77a73c4e93a9fd2fe6fb802bbec759cca4859609bd035c15556deeb8c60d9e7600b3b9903d0693be27d5356d1a11bc9d1468d559c843fbd53e00c04033c253ea97d2bb6473a50685a3e91a8145347e0e5a6368ac60b1a1abbb278108d6d2453b84496235b07ab788a64bcefd24071189b312019618b18711b93e0a9064c327c2af049ddb845282695ba6344e612744af88e12d2b520fb388e0c44f26066fa81b8a410077849baa3836b7165a248090819069fa37f0eb0df6bf39fc94d311a8fe35c40e9943d108c39b1f8d90e753219ef567662e5c138164d935c5740b81b15a15e8d0f934cfc7bb347b39cd40f4305603d10e143b023009ce32eeb8779a68b7c28795a4422af7c2ade61d02c48777f8908876b6af88d36beef580d523978b34ad114a205846595704d75112cf03cc91267038ba05b0323208fcc83481834bccc8320e69e62d27e6381c5c9b5230c6188f2ca811ca1e262edf937485928ecd556bec2f6e2aa213298efb33ae2b93f64166bf2ca8612882308bcec3a56702292353c471bb9aecd489361f250816446782e3e344a5fdc39b38b58cf54405eb0e40f814714de57c124bfaa5b22c81ebb0110b084469d0f374b8f7c84d3f3c4cc7375c143a98a0ad931278f6b984233b517539d15bf992e21068f8b94488aa924030161355afde2b2f778181ac49652a4a49ce191d188708efb3435d71215a95995e51eaff4ee420071a8ec4b3fff48e95617483f45a921a6718e9a83d5b0084e14a403141f92f86244ae54b064eb2fdfacacacf5a7227c9522446ccf6b13969c0344e4b208d322cdb0d8fbbcb64af2ba80f430f64708a344e342a9bb7b884a81618fcc60dde9b2514943659de373f426c75ec4d337a9b68a1ce57bd3d1381b835774a0ad92d061d12531a4a90f19229f1443bdd01a03e923e85decaccec5bead33dcfd6b8b3a0a09cebd5ade4fb1f5ea80d68916617df67f94ad1a9e6f8fde251208f4e788e3c82c184b88d08a75fd1ed2580708fc4581d7be87e2ff9fc66436be4573a51301a14234c05c6a827f05d010d43b506215e6b8e2f472c35a58792489892602a16782380b268b45fc9f71d4ed213bf295e3e1660f6bbda389614f4d72ddbf1aaf7a3b2ed65b53498e575d2cb17db6d3f04a445e597beb4c5663c3ed2b2ab18173ce831d7f9995f4616239f8b113a61d13cab45b6b6e6f042ba0efdb4dd315f49f072260e0aa6b46717b3984594e181409d48e06ead633a2cba1800ab734c1208a798fb2c853d5266e6d02c621e62f58bebe25470d68feee9b7bbd89a29fd465713042c223061fc736acc6d329886a6e06e4c9f556033f17220821bdf3597ac639c83a6162d5225ab6402e71ecac874221040269c0bce25666786d29801576a52cd3bab5c19006b716d166ce9cf92e30740d82d49b0d8aea731738553b97afaa97ef39fb14ba08824eec8b3d88e9f21b39ad3780c875c3ff654b64d60fbf87431a80db87fff918b60bfa709080cd22c771df7a985d96b2e5025c04699e8959d91d5fdee18241bcc7d548d8699452f74e8314b062ec8ca50fbdc77b6b9c47ec642461587aacc2c912dca872cd4ccd1c7a91cccc5be0c8c9826c9dac57545685b7922e8bc33d590ca145234b45a6522d3f60e369c0295508a84e5e09dfd169cc56dbaad13ce5d09c80628c78ddeeb964111178e9920b8975612ddb44dc8b9bef9e4f7abb357e66ddcf7336c963390c189ab5ccddc86a8612cc97bf1acb91745c3b41976e8268751ad627f33947ba0ac2d1c08c77d65f72a28ec45c82615bd5f9aa339937aad951ce0c0903d4e0e94a0022f3c24536c49041036603e2316f2e80635eaf6edc8d7a5853b8b8a121180cd97acb32ce297425f7a3823a39ffb52c8ec5120a6f8f1bad907491fcabdcac761b99340d167351636888c5967f2ac38235cddee24923e1b8f1b08e4b58102f4dc2dee028c10390c92f6c022fe130d7d78d500dfce71ca001506167a0f48f0b8a21502c3b0038933bac40ac41fe2b90e8ed15944e7ec1adf1e50250368882bec25c835b0ee69675f7837786774ae0790c0f36f08326112fdc5dc4e77e252310d776de7f6f1f7b039b644b9f2e30bb4159cf2bab1418e05800eea487f146611611527d285f0b1bc11585d4c90625bfbc9f85ecbf05fbf50cd069bfd319202bedd47e5fae40abf2b3d8d52eb9e5935e5419fff92b7afa98de79a3b8adf422c05764d4f3682799caa088b820de2457742812656994556fe6131c50b4c7743cc30d0c0ab657314f0aa65e1ce1cb27707cce9e6411860b3a6393bdfcac561736c1e201d300b3c734972e7fc037afde6ce4358b793e91d58782900a258172f22b058cc4b2d0aa4b68688d7449477435b6603e2b57003a210688024c2bd3d85847c5b70b6a7835a6117787c75cfe2d74a4fde455dcccab22c0985f3c63432ca8c5559c975c336512dd2d209683c2707cd0cf16b726306accc60ef6fde709b265806b53435f894e224a8855c970c32b011c97605fbc24a21cab18f0263c6b14de5a0ae5262211021072d4c956e1fcf3745ec577f6a94367c2e51c49a4ba49b5ffc266d1c28f2522602aaa6197ccd41f637c356038f5ab036ce4525107d5bdb5dd39b7851e7ec21a804fe359120f958aec48d8b7bce57f145c33975b7c45471c9a4c3844f6acd9a8aacac254d6367ad6827dd29bc8fce414fe40d193df5171046ce82f8ac06cf62e489c99685410efa245e8cbeeed9021441e6fc322fa77559f567d01b3957f436764c75ca6f5334b151860421c6c5c23ebc1c6ecbe0aedd1c9fcc692c0e3b26107e654c49b983c1dae1c358a83b48d346e22dd9626c44d659da1bb5d30ded39d2f4adff0c4417073c9c2701096302ca5d87a0928caa05fbed61e3770a3ea5f8771b19e09c90d27211ddd494cb89474de065412fb280487665e911c85a014766239b96d104429d9e269cb163ed1ea6a6bf6e049cecf20f0cf3318fa1fdc34136ad1d7edf41f1246ed512c29c476a6bc5b4e57e32a160d13e16191c7455dcae89be16327750939918bb4889c297a71d74202b59ddf4107cc08088898db44471757681c1b811aa9b10d1c31677c5f799681ba26449f77a8b62c9ac04f7234d3e9fd12f341ab7ee46ba2aae34ba28c0888a30016f00870d63c6dd866560d5f2b48f1b99477daa210573e64a16334c7edba8fd4ed8c8acfaf056250e0578f51d049f206909e128fb3bc6d6d64d33711dfea90a717fe79c8d80e1e5fe97802f50e9745c3bf6d04b5252bbcc2bf72672bbec909cf52f8a008003136f07cc273f51fb55a0a870f4be318aa72bb18ede2ef44f68cd4b876f8d63ea0d8baed012c0972396a6862c87b04a9982b7d5e3bf48e10f4dc0a8d6fc07ece1c690a0f66c23b6fcbba495845654bbcee635dc96b41c66028c327c290575de131145b240b4ab7557dd3a54590f3b9343cc3ce84009873188908fa4b43caf240d2f3d204c155fc10021ef72265e613607bf8507b529c13b14dd7fd52f2e5853cf27a314384030bec71985069820b5216355ec061a3aa884a85ca454dfbf55c925d61840bda63e294314910085d677c14f933d922397e999d98c6315224ad8ee47a16ad0cfebff0bd74706299187546e9c4aec563123c5d69e357e7a9671b38d2c654f428b6a6a148b0e93c285759b1dacb88e5972b4d0a9a635bde211de3ebe444eb0a2763e7c8d19ccdbce9a7577a4b53fc1be40433ec23d481da24c6d3369ab34be671ab7f86ffb246b6810abaf6d6872729199b1213f21fdba4854c4fffb38507124851437f82b2d58f7a4d1ad0412621e5377d420ad070d853d823508beef3b1ea9f4730ceff30da57dacdfc3c4c3030fc5a9b9983da21f48890a9cc9b21866a482763fbb0bcdeae7ae3bbba26a5259ca6c08870ebc4f3d71721dba03ee07995f3fc6c6e4e06636de8e79866fb8af308a7f1b445396894354f23c34690878f52ca5c41bcdcddddc81a7f57651f2c161c8964484b37a26de3354ccbc02d0e0960714fdd3064f9626cce14dd8a23cb03f76e9d729cdc2d164c93e4c8631de5b008ea536b96e465e0a721a22e8528daaa2f1f3da0b353425f59f8c779a09781da84539eb642bf446e9fc27043366a73fa9b1f0586ba991283c0d43f36d8510445cef97438fa26c2f606954f231e63d93ecb06648e3eade6108a4834b13c047a1d5b8367f268d7db14381f9ac55aadfa95ef728d4292b7ce17ed3140ffe1132177e59cde7d05f67bc3750ecfcd85bf22509de4fe6fd346ee2d3cfa99d196a2c768e6e9a62f13c225ebe0aefffe26bb3e6f06ab0eade9a1fbbd6688aebfde0cb7f3b48b094431c03a75fdce5f4cd5dc61c76b963dce72fc16ba82cf69659d30302a32705450d7e4c3710a0e756c816bdec780dbb56e747cece6f9ab7bfbf4cde77dba4eca72cd4ab94c2cf278ff05454a900317799f23d0e97dcb2a26f6bc21aee204b23977db649a4d6730a9e720bbe103491126ee72868893262ac452d236c1cd53af46d267faafd5811d2a004a4f51e3e2203d5998921c59badaa7e865dfb6f50e8ff5e613a6f1eb000b06a7b0e282afb0136315fb54284dbe72d4c0091f3e239c49451a9884afc2d7b792480e9478b075bf21f76654f752918c01d9a5b9255bffaee98264f22eb7d15b91e2262e5ceb941bbba6ecc76e8d580a04a1434a95827ad2e00dba321d7829b6b42be123213a4c651e3484b5a701b29d84110cd20512a9de8e0e6516b192f9302f460b6e609d1fed27b90d20ec8c3412a2d1534fcbc41a0c764626472ef9468b8ccee473c11571a3feeb54d43665dff34433e375d6337e605b9762d5200025d4e5afbe76108d361167d5f830320ca325d8c89de0e101e588a4f21dbdf35a61afacaf2c8fe0f020b131f4fb28a88697d52679800c64f34761e5cc3b03c30fe0da15b12379cff15dc7a602a912e1952a1dc154299c53258294a0cb824fcb494be923522db6849990998b220c8832997feb10aa0da6cca0bdf369db6d0c674e8c7bb90a89411cb2217ff8fc6e44c13e31941762d6cb1e58c80e549ccfe3662569e2b729b58235abc658747bd9cdb6cc5cf27e21871ad63f4917f75b7d050265c54904a17cf4b337c06ea40f1767d3168246f131b0dfdd88a79cddfe09cbb1ee7ed428fea281b8d9c7ea2016d988ca008b273e3882a8bafaaa3c8843304f315021a2d423c386bd4144efb823862325774fc60426c10633f78f7aff77b278258838431fe020583a823d13465aef2cfb3aec561e4e2c21364cad9639a316eccfbc75f3d46f8a7b0613d367eede409c9cf4ad06f1d20e5a757f827527db092d255b3811ea240feb85e63abb86264325d34a7786a613cc13335ba40e8b86934e95f78a4f949fbdcdfdae182f225ab3c5787e45f7d1b46c347dc866bf237061d5c105816612e5ea3ed07840ff11368c28ee80b340b17429aef3ca64e647245a97c889cf51f60519449fc617cea311fb92e5cd64a6bff03d70785bb6efca340c6f15d912b93f2a5c960a7a5362cef8464569277bb1134efd42fa67e0e0c4e3e36272f79879e520a7663b03e1758ce4d1938bd17003af7725fe2b21315d242a543fa2d29232b5383ca260e78e5714cc4c43837ddd35e71175c9cecfe38c037d74e4cff607ddc1e4362f879a5069c2ab147e8888c4c8c25318bd76b24d1b5839b484c1a4b446d08ff3290292029e56f114a4a6f00cc5bca94ce4b162e8051bc71d37c8e6f67516b5f19214deac66d24402e59e33619a8cbece4b81651ebf2feda1e2ff9df438d93c0a41945120c536de9bce40b186c9c59af855ea8c7f1860f86f627cf6e8ac5d702ef34653bd30edb2f4017dfb3f0aa5e3983729652b159ba9c406d9cf5a1194047bbf62a795b9ce36bf68d336f005b6c9343c7947c1f31b7bbf3db979b1dac18a2a833e84ed431265fbe4ce7e94894257b5363d90a08afe8237ead1656c7fe28e7756f2812db4f39598f66a5a6842247fe00e14262c72194106f9f4714bb4f0367b9e9a06e99521921866e126c10498ba6a0992be6c42539b5bab5d462273b96aebf0c424d8bd839f8346e677c9597d2f15b5f342e9a3e371d4e4a27b559ba69a1ad12e797c52a8d06a79a89ce3c45ec3218b75679bb16ce1a201478cac04038839d4d9a18fa3996deef98a0eca2f042c9fc6c3eb18ae752aca0c7a57d7a9a849f4528e73d95e0979ee8eede93d6885aa5fca332392df00983d1a3c34281a005bb229246dc776b6d0cf5be9bdca415a16a48b4ff5e32520f4bc08c045e0777ad675f4cabc32b279181dc196330d570f8d534bc2cb242cb9c4ced58947dc957125b93de256f88b15103262fbcf71968aed0b29d7a684090fdb68382c1d4ee37ce8f0fbcf1e46d56c9948f287452477e2744d002522008147643465d08f55f8f0b835ff173d51a73bdbd8fdd9398a4b38151b566ade04a4ad25ad3e407579fd6372cd1d52c6368389c9671aff9ad7b459b8c3c226ceb36a0d313f04eda0e303452fd70667f3c31991fd10f0f0cb139e59c7c33d222209ee5583e920844e0b093177f642cc38c1fc8622f7ccc86d37b41e1ad9c73778f393220cca5371eb690116c6a995bbe65711b0c278f0a20497cfebd34719a903d64947b7edfe717b04b92d88f98fbf97ae58c35760ff88faa918cb922e3d2f64d3db176f9cbfba579fde38df7cf5aa6675c8e039e0b51d01a5f0d508649e2d3c01f7e4fa61ea049f70a053a6891ce88281a5b9ca3c5d0e2aa8d6dae142cdd121dfbfed072dd0ad92354c162c7d95634ea3f24081c9723124dbc9b40278a475117503c88c9297045e76d5b374b4cf3e8d2449c6e5bfb136ccf60723ebaac162c1f60583239e48ce08af76b34fd0979906f3cb4c645a8b042392fb7986003d1dfdc331252ed3f7b8e27bd5944e4c1a0093d7a84b8c8e600c8fb7381d009d06374770a930d55c7fc38b4a7138f9153dc801458c26fe0c30e91ba400839484f73f53ce391401fb44a880e6a8a681d0d225040307da4fd27bcaa72d47d9edbed3bf5e66332e8e411b104df2ca0de895eef674a8c05125e8e51ac6c8c485881a6ec0180a78ed0aa8d16fe1014de8ca714c52d424cba4c0b3b279845e10c0867d14cd742ee89ac125b078ece78c6dc62f3f8fe16688d5ef77a20e33fdc21a5effb6fd181798ffb285d20b19af70091507e23dbbce4bb92339fad8ec89743539576603da2bfc84be05097b18b7517d45b5e9ac027a1e12ddb4bba17639762ecc91998fb088418184fd875752e1dbe33416c73d003fe75723a4b64e069d46d57e9f46b4a81ec7c4c8ed19f017bad320407306f74e78177fee8a78490ca4c66cbe598d28fd75821ac341ef9a0b20413a787d2dc9abcf103370894ad864ca610ec3f3fd312ed91435f6999416430db1f24201416e26c9c1568b62daade78588856e3ce2fe3de78e3a6931539e3a894b91849d3b819f821f230f0a6a72972775adaa36818fa040129549ed502448e3e5fd2b644d8041e7fefa2ef3e769102f5cbe20fe84605d452a970c19fb9f161c349b4caed4db91944308c1eb84e31ed9e59fd9df479b91fb1b100ff6ab71a978ca5597fbe29f41377ec4098b5e6d9fbe753badb0ddadc6251722c4a56c761175ce582a2beb707c14986cb61abd1752f5339dcd3b32be5eb4bd4498f124439a77e333093168c64a26981d7da72ed46ad6c60b3ccd190d9db5f264e315630e2c0f1b11e811f31d442564139b1479e8d7eec48c70902b5784f423d59e03fcd963606549bbb7d2bd065550dadfa28565326bb01bbded3c44db465232c525be3210eec93ae4864dd36ca24e837c89e12bf0441ff828574358dcef536c7bf8f0f77529abc90deced0a46310e1507b80fd22e0d46ae25f8773a66361d036f3a686ef4d1b79f246746306707776e6f30a19151670a206c7b1dd99bc074f55310e4b25ef963a711bfc546ca5c8d949ca93c045cac4eaeb8fb619a8360e91bd5550462dd5621e3af1871af40250f93055aa3b064fe56c9ae25324e4128dbd30d1bd24b4ad1efd2e90bc53ba90dbe0e894e77026af546ed5d7de087f0fcf39710ca9c51ff8990a9567532ecc905622abf75e2a44494b7d788d3614ba0360da9a7313fb06c9202d5f36a2697bb628c1dc280d0a5f90125a9dc6ef7b1dc954b05691e33e020fd643bf8332bbafd4f602eaf68815ec7acb37728627d339c478346cc7bd53d9ad1cc487e27ccf11c24a6ba398219ae5ed3bf7da3c8f68c0040184b46f8ba20b41277e0592c37037075202b37bdaa3ca0886f3688c0c89e7e14c77253bd5c7ba380283a43e51d6184615120196527c9cfaba4b97c5f789bb5f143d19a15ca97e253b98ab70a2f616d7cf84692a73396e8762a3360c291a087f254d6015b48b225973123caeaac90f22161a8f006d43207c03c2b1e8f3361c4d6457004296c1cf89a474d7a271dd856b28beb449b040331aaa8e337ddc922716e7c51ea177015d56bc6d2ae3cac952b025464acc398cb0701ceb4d5e4f1a5a0a0f4ef51686034ed49ced0270b66865c9742f8d30e3154a1817e2f30b6e9266e6f39db00e0955e8e282db33a3ce3681d908f52734a9df924234020fd87faa8ef81789649400e16e82a993e7d983fe4397e4f0e8207f64a3fd4bb12cb11f9451a884b7ac548450ab0c34c6c859a64392c0e4728b48f4c8626fd307e3005c4c28f4d80e518bb17f64f4e4fdce48804299b066a5eb12dd15c959ac93f8983c6bec5d07116d642469edf16d401ada8ad015604ef8520966551edc4108e1f91c3115632edf254213e732c31f992e01b4b2f55d4f3c3f8d92cb1298bef25861038b1a7fd117aad5686df02c88b6a46bf51e23f42bc66d58300bb13dcc934cc04182cb20f505b737c1c2d0fb73df0c795a1d9260bf88739937405d5ed460e051da10ad722a98fb9821f6022c5d8b94f49f46e5eec0c8e82e9ee244e35fdd957d9eba441efa6e978cfaeb7e51f350bf15c4cb1aa57eeddfebb46bb5e156496f681b273312f20e7754bb5bc9e5d1caa74da630515461673a834ae574ce96f7615462651be17e026788d1f9129dc4711dccd849fd107b24835c5d6ca1c67154ea6f7e5137e3a8ce2a7e1deec25e6f82dab9a84970536f2b54fec906eb8d408362f5e0674c3dc2c7b7abd993e032fbcf3d096f9cfbb0e3a2844065aa1ad76071f5d04dcbb7fc983917871ec58e5632e01fcb6b4a3049d2d51d89fec00eccf177841d90b72e9e0fd9efb8dc7147df70419d9fbb0002518714144add4950a9040532ab222fcf903c0e70f2f7e7f91a55d0d6c99f441077561c67dedc5d27c5404cdc439c4da3b4544a042a04c91c145914b2ddba8861c25ac3027639af181edb7a5e96cbdba507392f439134ba936ea1f77173244126aa0586aaa8d6e05ad1551a769c7f9ec09e6f8687eb4a469f6675ead15d8a1df2ce8b44d43b5d4dc6c3abcf061b1c68e1368794b39d396f2e26d731092062a1e01830771e46d4b718a72bcb18aa6bab13689438db2f49fc95f90c1e4c6c63b17c01237b660b9405f241ef2a03dba96318b4e9608b0fd78b2c9955f2cf61b69594739e39e8dc904daa6264453bdbc2864728c3b7cf705fae7aff4eae31be7e2f6a8c52bc25218b533a0ac58f3d175baef3c23fd88acc030a3e20f91f8b2a7f85a1bd620540e40261ab5e2f4337a2e9c30e1a861876cf0c14e1c110b0b5ecddbe4d38552e90800cd65a9eda4c0f3aed860866c6a59dce7753372108d88ee75e99f4c70bcc1a746bd82cddd6d74fe985d78aaea4a01c1824847ec7bd49ae93e89e35b618ffd89371bc3585cc97f3fc90a69a4237efc4c2d44bd5d08c12291a7867374b129e340fa79e6f7a94cabeca2aa98e16a7bdfdaa251b337b9acca3dbb375c2f6a41088288e8b26d56beca5c309bb4ce9e95c8952995f996688f6cbc037535d80249b3b3b73afe245d71351bcbec1360dd0b524ca9941023f82037ce005d1fd098bc4b03a26bdbf4d0bc0a00761d9e220b033bd40023e29656bc2f828e4546d94c105321967479c7b41203cbd07a5fbb67f06c4b160a5a1b4835e0f96c6ee72d8bddf8ba459e630d0eaa3994c035537a35f41ce20b1e099053c1c24ae6480115e5f9397996a3d5f6325c0300c1cfc7f633427a01c1d8f0db0f0d614096c168af85bac6ff6f5aa68cb83009225139c1a199d62fe6fb19a06d016c7b030f3e60e3f0ccf5d947a133d1d731a7c1f63735b22c67085744dfc9223d5e705eac1df42346e2ecc495ee249572c821e3de0bab4f551ca7e92297e7eac6ea4f9e6820a82122d053d7ff068ac6e88254ca4db6f68b088fbe30dc843a45bddd3e5732a4d4288efed41422a347fcf4e8576818ef1c91001cdcd0bc4c03ea47061f7411c39c169b8f239e129457b7a095ab0daef12f791264a8ef44cafe967633b9eb1f6618e0a22fc725fba4addbffe71032bd333ba130e89d19b95a2a2efaba7d5797897f5507f13f0c421843017095829e8407170621dcc85d4927fd5041f69c0e0832896c6f08b41a14b1fcc199b37729115026d41426b2aac2a9045d4eebd3aadb9cee94c86d44ad4466afc881060d9e0d91c02ca953f52564c94b81070c10bb94cc4825a672ed7bf4ce899e850f37d6ed82e03f2645d01c04897ded0e271b2f72426d474b90b5f150c57158d162699c33020146f0e4604514ddef7daa0d28918c80d301889c4d70a979a15c51612283b8de293ef5283bbdc1a311d92f5beadb7b302a4aab1bfdda8e8ac8370337dde7c7ba17cd224cedd7e63107b3777bf704b94974ee710c4701d107bfc503496e0ed125ef8f81440cdc0f16786ed165a7b9baf59f5e3a0295e4403e1cfa620ccb23329bb764cc7efe4578bb0157f568792b876f7080b1a0e792b2b34904807a453c7c61d2bd6f117da1a2c7545bf9ffeddeba528289e1ec21c2c991c9b81def7cdd69130d44c092874022a67614a0774cca98b671b1fe5b6430654c03cf54110ca75efbf08ca75ffabd6831120bbc2dfd46b74e8b0e4276a4d8a12753734bd29c027d038211aa1ca8f96907ab33131da0bee071f8b07b8e68d7f41dabc615ab8362da4b77078c65a3e41386bade378936706a0b0cad2d9560de02030ae6f01a5a715b60b00628de7314a0ec3841c83d5ca4b550aa85bd1eca8011498c0ff4b87871a60872b07e521484bc34335546c23a529e6c8f1c2f274c9a9847bff3a8059271248a39a0cd8a0e6f6fd409b8bee15489dcf02c126bd1622545b1389efca129fef2525f201d3b33e3d86b51513608d08e9d2897ed685296eb71697ce8bd18a4eb1da98f94e03417d4d815f3e0d83f6eb35aa7976aa9a08945cfaa21cca2f20184a434bdd1999405d83a6d9254f915cd6e47be0f587259342678d29987966501b3f3e89951fbcb2d83a90d90cbfd54daf3840b29c791e1833300c6402d5bc44db09620e750bb5eaf64320a768c3701904a1a09eb0a9ca34e8eca3d455314097895a86967e8b3b701a859843b4404f76900ba411bba07f33a2b8798bc15b0340c4dd3086bcef9189abe8891e338c462a1673e940880ba2dddf9daa3851bb85262b4c06efef9aee82198592f24dcd25111f07512b05d27ba4f8822e3ce4d1fffabe84f75fc5de1756e7a0ccd0146f42c824925a47343ff86e8ca65c793725f18adf1d7226852ed156702715bdb6470ace08869a07a9c085a605139af7f98012bb94f2d0d5f27ce0436ba8e3dd3205d711b3140e38434e8649e28f0e8c38831f20813ab5309ebb50a6e1b45b6807a0753697881180c189dd15751974f0b581f631e15e7bf38427305ba7002fb79fe912298e4129203c047d2b7033f8def1158a77b355d87245f8fcea097252cdfe7eeffbb84d58e4785cc4fcbada26ecb44bcc5d51b626a9b0094a37aa4ce32ff2c5f2ad5d56764670cf40894db010360d32b898912a4d541a71c42b6903a8d370b17e7ca12913a3f9a06ff930681d54b718213fde900c5f871071f92e4b96f6a9fe76f9f6630e56c01086e3e0e3d1365f65f9fc99287cb855092a8e061af0719106ca03dc0232e491803a89f2ac1c8d0f40308bfd125e70099754b5f0685b8461987913c4ec9d1844eff61c7c2a96e0aa4143998dcd132d0adb0a3a440e60a1ad40e44efffb01601fbcdeb532cb48d71d66e0706d064820c4b2218567863272a3268dbeb3888143d94ee6ffc5ad648456205bce5aee57ca39dae8fd48003423380a83b2508658281534596e045c08900a7676c42c6a556b08338b8a9511225de887410f61b0b49e3c6d6a987d92ecdeb04160f6a1aff25b62cdf2fd9fe91579d65e36d19b3fcd3b641a907b20e7026c686a0a71776f0e105dc13e927e2396d725422b3a29b6e21147246194befcdabf90dddc51acbfbcc889bf02f53fc434bc0820b8511211fe5c5d8d1b2afc82bae611dc830a09526baccdaa7b0d274cce381ae1f4f245d356b596e74719d7aded4473105a34b9353483be76db5bd2897b091d20d98cc9d9c227fda2b0862fd23d2db863ad6011980e89ce7aaa0395dd4643a7bc600e054db8f9ea98c6529210b9097731cd8843c1166dc4bf4470e625150718b38eba91dd4e335d095658dc13a7480186b8760c98ed78d6037f8383abb8b2c39fde64cb2d2318ffc8c8c8c9257043056cd9865381f8c59594843dcd916021c9740787636e0275c015278044e92e5f3fa4ae2e710d66a382461ccbbb817faadc2e706c3be9117fe2602a7f840723b9f419ca809e71157ef7e0a7136b5f8308a07c4663f59f64bf075fe0f5ba60b861733820aaed563ef935a4d1c3cb473ba3243553c7bc588a6b3cc6a3275186b39a24b1c9fd3723ff9b5a0b20b208e99b915888579cef5eead5e4da33f1b26e826fddd5adcad7128352b1697fe3df7097b3dd5992b4e6552d9a979091fe84b7f2bdb2331db362afdebce4985fa14470ea29f00df639d19f8372dc0d3b298c7512b1677815e2096a5d05d4df9672bb13b96dda81e2033f2a9d14eb8820e88610bda15b2a9e1d1be360939b0747ca10ceb725d46bc83c04c523103ddccbd04d81b9e68829d04d70851a2f83c2f2dac16e04f29b0254d93bfd93bd79be4922075a1c338bb16e2d326353f0fb90915da7adcd8238abff15b9657706b6a110ce66f0b41c41eb140716f279764813bea80c11b56908c8f2d05f274a26b1e5a9a2c16ee130a832a7cfe4d7fb56a522e905a25c18f2c4e46f3d259fd8758d71d8f81c771ca906381a00873fad7126e9fa51e6bebe22b6c6a59f0e040323e3f7858b40e2a587dffbe3b944d50beabde1f77977126c37e42952a3929442941d82dda8050a03541ab980e516c55382556ed0157c462112a74a0d52d184a2f3a3ad21c29ddc2ddf4e1fa088d60a10ea4a912d52065457dd4e9aa3bc0eaee8f9c59b52bb1e75b37f0d16d7b993c0d26a1c4b3198c3d94dbb91a3cfb672f5c830796161422422900103afe34379d159b35c1efc11e6ed54a122b0278bbe532a5a4ed269dfbbd2b8fd489047066417775e521210bb260dd2c2c6fba9f11762ecc0c3e7c0f80f8aa9418b0f1b9bcbbb4e0289b57a606cc10cc23b46c1bf1783513ad73c2d97e809bac4d00e341b296df1405b2a84b9bf09885e0b5277c40e8ecb3f20ab23dd240b60a641b893f298466c8513ca7a7f7e17e4a63096ca28604c55febffe6324473a9788a1475723b0172ff81ab0ad220d4714749ac844e4383e177525156338736881d83fa76a56263ce655dce8408beb78f63d2832f80a1c5c5c2f00db5dd03745ae10604037e5bc3b23586ee8553636599e743d28a33ac8ecc03a071af5cfb35de8aed732134395bfa6264d97a2fd418b15f139a955baa38b42fca0c27ce158b19feb308995d2610d752aa603e582b8d80cd65545eb90e69813694edc5c96c6e0698bd57169fc0508772628e31d1f73451d2112df135e093f8e46439d6bdf5421080c1424e7963353ea1d6dd882ca51179b6a05064b5b51681d5d349bb27eb4571d12aba2257594bd8f0a9d894f08d344b8d2a24a4a69c2a6b716074381d4c715a18969f819b0627f3626d0e330db9165b952e6fd644107a7fd8d422b75f7df9ed67f5035485ca617c482d514fedfe72da520ccce30651851412baf11f83c6670e9935d1f4d2f563a3896a6bac0c5171206dc4a15c66801c8e546fe11f56009cda2d2b4553947c082800af5ca23a7f6c162777511be088a4921c003da18bcc3c5977e44caab915a9a1009351d7b9ad43fa58b6dd17153952ad4d14911d248e9e6a383d2cf2c3cd584d188edd097b8ab5f985709e79864965f7f28e7033354e11e851829fb69c06d460ad2b0618b30cbb2893c1915ac3fc5210ce91ae004f0628f18307559037272453bf4a86b7e698e6a7cabbf2fd47d111253ef061182b5b7a598de0303c6a6a56a750ac56b03558688ef65495a6652fc3839a65139cc71c8c428f279cb5109181f3b888483d76c944ffd18640a5a748cd601e36831344ded045791c6457e5be7b0175f4b94d21e2b93100da21e43c5f9c807e98ca7555d6cecadcd5d7511f0fc30e60b4029fb416f8ce3aa69095ec1ca996ab0f432e8bd6c988c078953fa19c2e9b30d5d942e6518d7779d5e42929bbf4cbb985b923086928fb2577d1ac2aed47834770e4286632edf825c7f1a4995f84abdfec43c1a16c7b2370a62e33871e018a1dfe91c2410bdf28419ad05c8e0cef4a1ec91cc19c53fcc2bedc5e8fc5eb196c5d5a83c14b0f3163553499510150f7c73f0778646f046a6507774c32b70e5c921c448aa24f8188940bc7bbc3111590b9200aa969ffbffb67e81f61c2037e25b4b55ff2927af8e21ff380382ad309881afdf57a02575a240ad3116af3ce7af927f256d51552831356e650f93ffe177f4dfa6790f2ebde9fd60634942c606c78a233696d33fe481ec1e688051d45e6c708ea24ee2a30fdb3a70ff3eb6e7da9ba1110f07b9ad929f22904ba8b6157bf476be0e6012afc6edeccc80f0111b5099d123431a39637be9478300f62f1a3652262d588e610753a9b386d5073114f2c75a03609ef1d77c8c6b428081cd39ddd3385329b358179237d13ab2f2f76a4b4d05a7cd9c5d39774cac0e35e36badd0baac2a011a18e18e473da38c7c21980185e39432ac11d930beda0068fdacb35f06fee7d8c239bff62552c3923c02f2f029cbd682b7e8341f772efe0c12056eefa017fabfecefffd942ad144ccf51f753a99995dbeab1fef220bd34340fd83e6f1f7e696d2166ec24440d9561b18a91f76d4fdc0329aad13e685267c4066b153f3c02255f0d0a5803d3d6133440246a56f092b9a9831b25b213bd426cbe20353616b6a8cb3ec4351cf176613365c29d74fba8ff53129a81113ced1ac7a9e1f2ce08a163837194c70fb4487d8a6f27f22bd2ef43ce7dd56d2316ff719b2ad6c30f928cc1343e53eff34db527a41b1c8e64e99cfedd9e9b56476fd2bc8f924c2bd80fb860cb43d12fc7f961e5058a792aa3eb4be472c23c23cefd8bd8bce633321d9ec9c9dbb3bf151e3d4528da096ddce403ffe32d4c9d71d6b465feef1e2e1d75da70359513f16c95480cb64e3fa15f8f91278fda44e9e60f8c5242a84e4cb13144480955a28c8c69472aa71aef9a502f8f6d8d27ba928fc1ccf7f7bfc0405b233aa337620fc4f6760de018510e5bd58208b59f846c0a6418d05ca47f17e9cd609ff63efc2305065d7bbc4c31e5000aca1c915398b211f2e260adbb80a231184d94508a0e97404bc228f38ba2a5bf6788519912b06eddfe5ee325a800ab2cbffe338f4107d663f5b4c2f02036c6a782c7389f91b199cb5a28ea28dbe121cd022ac2cfb7b2a8dca633220cc7b5964c91f6e25b82373da1431a1091489f6e6f372f200211c86c4c5c5c29d7e2bc017379ea7d2c49170f30b466f7dbef2c7bac77af5f099a518c4eea7b204746c14dfdd7a288e92a7e13b63e2677038470c45de6b3015f725e3eaffbf8e1a0061c59f15b720b180fccc817784f58370dd0d8916359dd9868f8523c9372318a1bc7cc5d1a63a60d1c7108a0933d901ec4a8acffe79a5cd1cf8334846f9f9b2284a815e9be0200ebec58ec0104422810f33a23121e5344a603d87c5012d40c1e59243431d57c6583e39d6e0536ee92c4e3e7c289755ab13c84271efe74fb5358d1cf6202cb1ca6ff206fe0002c8445d9dc1e2b306543776a61a70fc3936d72ecc69ae4310122f94a939b3512f427f1774f5c90445c15aad436e7d5096e99e674418ed6e98b7e0885b4a7318c88523821e5fe8a22348420cc3167f0a7c3689fb7fb889a602eeba42fb19db0e28302cd086389b2052f769e8a76dd417029bd976711097c686cd587982259b9db509a1bcae272c806f7349abc70746934ee5328f25583860948afb098641ab6328d7a63d4bb40508c63af89228c06a69d8018bdc9f00d4b256cd26b06de55ac39ce6a82384fb410bc3a3bb151c82baa607703eba5394b97b82954284df5a3294e9e7e5287dc7096b510a009332f8899001508c3160166ac5e41cffc1a0d10144f24e92beae5178bbcb75e4184c0ae90e0176d544abb14afac751caa5d2588d97719f9b1e694e245957a404321cf18b4c8dc9b66083ab3408b8fa07480c25e75d5e0c5bd4429bf17740978b3bea30100dcff1fdb0e173a1ce5155045699ff08119ff6349c69177c5067b4422aee0932d85b0ae60422bb8ea9e423d5f8245bb304a79648571a5c5e2011a2092f7298e6845e311dc6590377bc562b7b82adb7ee2e4047304f27b7a723af3a0e90fe8d5f039fb2b731ac0f4c3c457f370954e620e994c7f8cbf5262e7eccca5de199ba3817912f4aa7ae1e067981e7c4ad81f2cb3a644e367a43278b09e923106efab35b9af5811697a5eb4799a58e2c064448c6a8435d23fc65e49831f3cb8159431cc55be89201cf51b7459f44cc25a1cca1319ad75786db0caaac92ca2cc9b647fb0f0b3058e946763ed7aa2822f6463f11433ce16b5158940ed1bc65f98dea47dd75b63119d4b2ea7d4df67cc160b304a44d079bd8e45612aef6c435292b32ca15dfaebe06173e67c7b41e4829fe63ac05c11732172fda5bde6960e0d9a3fc9845fcf8d405cb7b1d37a928f0329a7ea1d70333973eda8b5572da2bde8172324c62eb553580b0c75f2341aa83d672831fa3ccad0b2f9b513681cc72ff75f8f5f4d8777590f51f6fc0c76badd80c664e35d0f64fc3f6c461bf0dedc9d802f2eb73513c38dae582bd716872e9d5f2866cdecf628adb30c3e7432ec36be6c70fdb4df2b5c7a954d001e913dfa7382abc451837bbc2680185b6a76920de227f2be8d5ce5ccabdfc57aff50084010655c64a8c6d94ab199bb45b9e13fb33970fe6dbfd2cf34f3da8713cf2663f4b7796e0a02558106f4321a39d5ddfe42c9ac5fceb909ea33f870169700057704e005ea59ee7c3f3987ca74c85dba3ef9f78a6e752df0d9b0c5b26ece3fc2c1303ecf01021a1fedb5c25f9b6e0ee810675c625dfdb5304977deb26d401cdd0a15211235f0946aa8e3ea1fb8296b98a1a1aa62d2460598d96f87a4bbd29707497b0d4a3ce891e6f3ef5b5f5d627c1bf37106c3ba0e4fbef9ac93bd4a1d1263ad37e5e6b341ab92daba0c840741567a1e8aaecb3a30961e2aa6ff24a375f33215190840837d6f1a879a71ccaa187954e6f4965673890e1a49b7b3a5148a36447eebf8dbd302b1f5e54869676ac174af1f17967b4374010347e31fd9a0b33de35f2906ac3e9af21656b3363ed7e07d7589f166e3f7922c9acd47bcc603f9eb6b0f7217d9df23dd59451f49b6de9b18536baa3ecb2cea8eab09e589be833b308390f09d4959445aad5971793aa7b721060cd47f40b2384cef1226ac8b6354f5804a0c77c946c41684199cc05afec6c9b3d6258c0a893cb83863fb7f5e848bae93baa31b2af8af538b25e2a74270e1f1ed9def763ac8b6ceb6702c8f7653e3a8296885f6864ef8b575e7c028cd14eba96146e85fd4523c8dfe8ee3705c3bd858e454b2f9f2a7360b628a0375a094614c4a0871433db1ffca5de7965b16c9af62e0e089891309a664edd81316d815cdc145df9e80457b3ea205cd656c2b244b4e000e45207f8b2c702b33213624862e92ff447df3563b4b8b3e6085a0bc5c1eb461d005583f9adb486e648c155e74ad9bd7d525af5995ea01b9476a0188471c9b59d101aaabeec00ce5ac54c861d5dcaa1cac7f300bdb964f89dfe49846073089fbe91b50c6194a98640406817be8f55261f7654e230dc9d3f4ed626ac32542c7b8316f5d488d3f4f14558df9987e1cf8663b6f2e2ec2180fa1404bc2895f04a10bb43a10808532aee42c45bb885b03ea6b5011d9d766c0891f4059322d50d660b4daa89d49d3f4abc87e6d6712084f2e38bc412d70c1a4bed0bc618d1b667afda510a89e741af9026d2140f852ebc4830fc455331a92f1b728077138007c298c6c9c94af079835f96b1c8ac4118ed597e7e8610c63e59cf01b919d98ce0f60134171221706d1733ec449a24ce58e63cd4604857710415ff19ddf0292d8d635fe2c6f7e3ee51d48939c76cfb79658623a2d56c7682556661d1e411f4d9e16b0e396e79011c5881423fd5c673611344d3e13e2576e765ff0ef8eba1027fa33a63043b2ec6f7c655646d386b27a59201a908fa361644994b2778c56e196b2dc80816dcadaf1f26d1f6cf6a3c2ea9731332e3fda0fb55c47227bbe97d551697c2a8596b9bc15d8df54e3e3393986743d2b64f4426a6eec3bdaff83e5c8e57739d401bf2dedce296c4ba089d4f83034e3fc97a198ae62c1c83724f4cac58b5fe1e57607b218a6d51d8e980dc30d4b06bb94a8ce4a309fd995c423137453016777dda588844c7daec20d600b2f0bb4783f8a58ff37845c0e0da958f53812f5a19431dc80ada2fa244febbb93e0a0317f904b9917d594f16d4832cf1d36ae72edc70a7177e68c8d45be1448fa0aac7d53284da693d9546448fb9fc8d86539a9b43191679b6aa9e3425d5f366a17ae63cf5246e699a15013913174013e657d2bfa64e0194c94371e21e499d0e7a17491513bd255cdae6a4b3aaf9c503aecb099f76e47906128c1ae286539aa1e383f520759fe8b507c69a2817fb803fdc5308fd38d17fde3e4aadd2d02394e54deeb434e981e981708180894af274006efc79baa0f1eb988303623af8b6c7c3529eee506e2f60c34339e29edd83551f78d3f8a94a6f3f6cf7702c4bf7150ca45dc2769e8359f7e54a87e75ff5e7ecfc6937f02b1352912bb3a75b07646089a01cb1ada9bff4a8a7cbce50495365746914938de43ce40df78d6c9a8ea7b6c56cf68ea0f107666d7977d97f58e7b49ea0d8510fb01c53f2e0883a45c7f1bb48b5227233859fc342b562d0c9e017e4171f4f990cb84ae8183ba071b9be6155c540f409c4652d31764896be1fc60173a1506912a16ed55f2053677529761a6552fc3fd2750645ee9f9c1cbc07d1ff2ad47c9d76cb411e52950c8b3e48b5bbcfdd45a4b4c3603c86cbcf4777f092d8456cd24781ee7b76141a7a5f9816c8e471502502766331709ca89453d9d7c647c7c25870b79d86a850a356daa341c95569d7a7829e9d841954b5a2933302f5a1aec5b1e505c735e29deb228a41e7139f80bd9a5a06904a0a2150e411dd8f7b277cc25f26724ab15bb2e1695695f0466760569463856f9b5581dfdc3cac46a1a680c2224bcd9679ab3fc26e41ed5f9a9ec00f1c38a754b6975b58a4671cb17b31cde36469232be39e716d8e516292584415a8169dfe1a139d7c7b443b4c19e953275f71d0808b21da44b14c997c8c26dda8234693139a34237c036c41030abbd380664b9015c23c13052146963c1ec209aaf3df54ccacadbeb536e73bd272ead969ef53c1c0669f8f97b41ddc030d23af660ba9cdf40fba3ff4fee588541dcab63fe4528f3cd9c7cdbf0cb171103ea92516159a11a426f2c35f5ba9e0e6e7b95e7bbf0e80d69833468b062b8696a380cd96fe9e825d1abdbe04adf7aa49d03b6ed4b3134e494d0022a48b205ec3bfbe80e0167d4f28b3a9af1b7ca5fe5daef1343edee89e1419a5a15d6842b0d0e8f5bbe0280e6eb420028bf80bc396012361aa18283882dba30e3d31e0dbc2f3aee7cbc63619657beb2d6f606a1205ff069f5944ee075684ee78e6fa239158ec93e574c00303901efbb89014b66cf755b717dc97304eccbf61fdcf849146750169b326aa342c078c52c5fca30c8cab8642918a453c0b3131f072f57cf030044830e1cb05f3e1754127aec31155be62dba239dd8acfd218eed046b6c7e8b730eff745cd9a91f6f3efd798c9a017a3302819153d394711b740da18950ae6deafe6d5271269e6485e7dcd5ff8b0e9c0bbc6452f868e7bc36d157123c6bc30a92d79a4541190fbb1f2f3a93e936070131e06d78f6f9630a63968809dc0bc0f8a63394438148da2c3cff385f1c3146f13672414d0888d6cd6e78fd384cd366b88233c1ab551917df64a43f9d533d7a7431b7d0e2c6b2ce18a25e7cf9fed4a4db79f4977923832bb222f6261ee4b37b733bef30f18f58d64c2989aeaf32c618baafc0f3fa5e6cf9a69f4676dd5dffb1035a48a34cc824cea29265c89b320025bf5e90dd1f8623497815d48faf5410beef9419856f9b4de99db63748b438294f331d26d7ac4cdd2e70fd5ddbd6b6b77bddc89bd61a7347cb74f8d06205ac7f8a43ade1f7b506cdf095355bf0e0368b83f82182bc2220100737ad1d1748f83df27e35f6c0a5500641b28c0ce953ac0972ed45652a12a7fd4d6577247126a56f1ec00a11874ed580f3c0b43b8b87dfb6a53e94a018765e685e2fe4b95525dbe9c121a006cd1295c063550ae9015383ab0b9e59dfb170b6768f89c4bbcd372ae866cda6646bd66e86fdd0045fb98dba0762eb8c7a687a550ed8167430e8cce6f3c1338e00d841ae449b1e6728372b525c43729750c83c404b6adf61bde2cecf2ecee863d0936ad0a3df61a322c1fd840a5e2761234033f2d8ae01c40b64d6122cdec28a864958e007522326c14c4a96c203485a2bf9ca347ac7386f015a20ffbfb87a7c30114b813e339a6c275cc0a01d7d771c00bcc69ea178754ff90b19522de6574af3d9575134d6baf34e7ac4a4cbbe4b88a9a39a1c90df37c4ad75734fccccd5c865926a87ae2f98a0133a02a716d8be849e741e37d81373fd846d47962468a515af689928cac866d96278ce189aaf40dd95d768d82340477a339d2516445daa8c30de2796bde548cf212ea06cb53abe29ccbb817cd18147e10b99b2e39a489193f2c7096ce7cd6a4c2600b5f6597ed28e4d61328c8478a9ac8a40dc84fd491547dc72f83189b7a9a50d8c88ec172a5a19afc195de790c7846b517fdd99e9c2ef160411b3a27c9b32ea893ff2fc78a53e105e1a7599e8ccb0cd2a4ba7bd1e8429f812f1c7392b8d79431a1f3127f78aebc1daa8951b6f3c9247a9f6023055520b301ded9f8b3dec31bc389451f35032f0ed274ff5543709dda4eb2170c567f6514bd278ef8ce12d1a3fa7b410167184e76f033f3fe118e771de2327570fde39936a28db0b8740bdb1a00d20765ff65c5cba1ce13a410bde982a33aa186d99036fd8af60964c29d81beb4650fb946087b032b6e636c0917f76365dcb7ca92942934da4ad7574468801f0d21c93cdbf78648e6be8bc9347217b78dbb0277192bf9bf88de1a2e6aa6146aed44ec6c1e5b51f65b413e39bcc26be9deb02dfb68538d3b72c615bdd5a1124e5be0d5404bfb790b35532cde77997568e43b434907034dcf67df178ebe672f7fde44c0436fdfc1aa6849466273a1907d269204abb82a7b740d9904434fe39ab255f34322a07a7aceeb7767a5987b7ca812c62b0ca7be231db6d2fc7733b531435da5c40f268f81053226cd18c2c07b500e6573d48682b83b2d231e67db5d8bb8d62c788e63b4c4a86bbfc55b19293852603a4c301a9dc134acb8dc5e848251b894ca7bdcd62a13c548a591a8c7411d26f46ea1ebfbe9d2b13302e66187be23dbbc52b9d9639f216bb3223110d7c8b25a2a769e9a2ad7813e269e19cf82cd69980af979617b9cd9c23e21912903da137f1c7cfbb4524b071efba69ac2e5a5474da937b514bd6c73c130743f751f06081fd67e16d3fadfe25c6479d222edfedbc10c0d727e5ea4128c57c8dabc11fe0efddab0fc1ae3422c33fad0a01cb1a49bab454fd4ec40d00942a34e5f2175b4252ead4c724cb4b5b4f15dbfd17f263ee229fcc6e007dc196af3f101126d512c3387f87541c37ef67b6353c4b319d890ea7e08eec8ba299ad0ad118c21ff772890836514916e006a0cb68eb236bd7222eb89b0f96d5a87d17c19e5483d94dc43abce1f87315256cba2a398df75df6a79c1c54a02c0a7c15dec7122c70cb6733c532e02495f7842aa858898dee72a8aa8f2730b8ad915c6552bec0b189e3d10a2355739eca4d52f0916b96cafad63c2ba29d0d65bc14654a8264f22c9aabe88216fc1cb85826e540a5170dd723e1e58a52cbd8217a7a1fc76f0f09b6b51f384561d142c66cac9729f0678b6657dba4c69286a768ad74bbf46ee6164e6e28df6efd445cb4897a02bec7b71a415007903d799a87cce321cf1df2a4328de371af7b233351c6f64410d170ba38391cf3afd6339b79d55154f7c9a0461a0e5938b60cb75ce8c96c35e0ba677f8a50114c4e3d1b75250e199827d9a7e874420582ec0d07b708f5b9d67483f1d7c3be26371a02c4ce7d52957e1a888d33dabd77692da05f86dd1c6ef1072f96e43ee3683d4240412836a9b1b132c27ec07611ff8edf033f97b9e237b0f7a33d50847ffff02fd2319b58d1cefe511d3b890d56070195cc67b9928520f9619fe6f0ca2ea9ef2b4df61123265741e527ee29f7801196fd7030acaa53ca291e5c1e02ef5a0f3ae6b0f88dc4e89383f8251895f9711160dd19a21e89a7547ccfb0fec334917389ca69c9f716518771ae2e5491ca47c75015c3360012fa8390594e584214a9f81560b070e11ef643a075c14fd77444174dc27f442e2e208a755c9ed85bc43f3dc008d22ab88ed9063e4e6d90448ba513b95858561470455b4892ef31b9a5770e96559685f65c288aa8f2cc7674e064a81c8ca08f0f7198f3d6be0092d8e084471411c85dc3c9c1b21e64bbea575e846230ea321b09e5c7da89e22b48366359d1df800136c9ceabce4f0371ba1b25f1672d1835787762a81212c2f9abf5a7542bf3dd8519a9d905c05edbe77d7a7ac3d4c4fcd74a0c68cc86ff4fce05beb02b918784b23332ef3605adbb6171cd1f0ee005cc0e59ea8098a5badc84837428606df50d994b3e5621b24a19c1dfd21783d74654f4f1bc310d358f1d3e13beadec64e3c22f42ecc8f766defc315a463102186d835021ad20e7a4b376913999d594099575ee1ce9ff33583522ee319f535507d629edb32f4865d5ab397e820c61e4c6cb144a0fa7e88c49d09416193a18dcd07979574559608432237e5ccb0a3cc598509e8277bc414d76a324aea7535042ec64389b6ed1140c2ebe5fac75dd2188e23e8fe8ad90f5fabd0f62de721e602e716f1be5f4696b8d67b1852e505b1a72c4ec58348b6c7817a1c66c61f36b18104768a31344412a3c4fadfb0a6a3ee6e56eef23f2fc799676c57c5fc018bc4caa5fe2502a3b489800d049dbe21b41da7047eba7156c3626d873c08d4318d2d164ba0c80bc81d3243c5c87daa071e2a2abda153462bd4c7c605d8d4966204e26e470783af856c10bb4d02032fc9db8f1ea53f4f8a8c97093318cd7ac864693774926430855344841f604e8e1c54cfa76bb702c06c8c5b1312e1a926e4affb3237a6de238d1c391251be8c4f79cfc89e9872ab213c83314e7ef7131bb707747a663a08bad44690442f495cd14fc307e51ff4a75f60b850032905a55267705fa23c3081d67031f710dde288553655248308d519dc6b4504390dd89b17f073d8041cc529c7965dfdd347ef8f4155e749f9f8210eae7413516a1100a85fdba766011a045aef4a2f1f3875c9c89e09af7acca042a2239f50c0934a42951842f5979fb76e07eab1c201a10eb47275b0843042d9f331a276fd7e085a08450a25f284eb4a4160f6e4852ecddc57785004cd2122767eceaf9f83862f2716934b5861d9d1f8492ba7edb0a05a996e8cf95fb7c06537524f1795cd61c642bfd9d03fc2c4eadbbd7ab136a34b1a7e6dde2913adfbdcc63b5e154def1c694ac40f7ca196cacc22ca23b18eef385ccbd4ee0de28bd1ac78abb450c6a0390fbee387db63746bc178718a4cf60cce4640c706db6173616bcd83c848b226270173e224172284980ab5925f76027cd6682fd266e3d2bcd6a2bb57753572afd7c8c8da92d94662f852ccf7fd667dc23b84197a61b4b087d7f50413ab0323e173297f449e0eb76a0ad406f497b57bd0d6a9af93602ba51910dfbdcf8cf71406ffca6087aa97fcfd4e15875e59095439bd3a02b5fb1fa7a4510515d9f93d4ce3280c72d7420c51d8ff1ac021a29f0af1b75c4061a8ee95b2d090b4ef6bd579d12f9b495335d1c15f42c77f6930cd68f348356560c14ad603f696d1672772ed8fd984b439107bae355f7ac8d9e3b20b80e872393aa088a3ef2d045118a0a2210a07301c12229d76e686434f6c87673632ae931680c8240e5964543f5f7db7586d75a7f78e8a208456c405842ac667be2bd4ae27e7f70904f09edba3d936f311ac4ffbb6ba1b0943a6eb8a46320ae66cd5cc62c627393e59210ac8cb739a4298732f90ee20bd9a9bad00bf14d68c96f565ca62b18832d13d08801ba6d95da52e56d1336bdc39c87e128d84a1df0325b035f086997048b2fec79dd271edce0c07033c17e4059a86f1c054c5e0bc33265026f9b9a2e8d4a6321feea8332e0a8c0455c12b3e4cc21883086ab86db9a311dc2520deca68994482ff12e1faead46569926cd2a9bff1631833dd53c49bb7a0a8cd8ccb81a57fceb2ddb3763b7ba8992247d1795751aa219d200c641b3ab350e03b5f1e5a044816073cc4bbe8b79fddfe3207fdd0acccb24eff3b0c4771a34c480bcdc4d87e3b2baced9b89f59083293918fc14d75c049368486e9e035193c5a3b90b339e8b9a33f87a1c48f7f642bd5934d1c49889e9aa55bd46f09f1540cc68d9981e17f076610cec0dcd1770714271c09bd720454aceda4d51a3ea1042a0fe91cea0851d36ec888b7c33a40e1a7e18d356a4953aa3ab5ae6a23246701a42a41792a01e442bd9c44aa328089d48b02c9230f924ed47d30efb5aa5adebda889234c955895714820b1ebcd5dc29674f58ccc74614fafde12708c0e04bf9919c69413fb4e9062a8e69caac937c09e5c4345e6f53167c4ace8f56d0485c0451a7d9bbc5255f5fdd005ce5bf062fa967ff305dd287ef56cc966055dc840d19eb11046c65b8b5ef9ed8d625933f0d619b38cf5b2791800f26c81b0d9df414691b4bf286e3c7fc8078d598e790f8ede22a35a66966847ba728dc5e1633c340da7f4bb5f76910f1201c39084d01ddca78c1c86415874c675dde890bed30782d811882ff5574a9f2feab062179bbefe0cdc9d562e85086f54d5161ee320e54d82b418a605479e33129cd4efefe8ee3045968a812f6ec30b8e58df3b3aae725d5f6df1bdb47092c56a5bedc83cbd38c5895d824d2bf19696d07d274ad573653077c3d7ad3d62f8331e79f7dfbaafd55af420fb73180cbdcadf898b1e786fad8d87cb67e304ff5c2d6fe549f4656b6c2b5ffb5b6e784592dbbc166260b330c1ebf51b0d6e164838e8b5385c73b54b4d96577123a4b177ff9cc3205223f33f46cc601b18a0ab69d0130647d29745682a9637336ecd9a6eec8d98afea7163ddb0aa4a8e70cf3b949523e0c5bce5a79cdf65898996f3289ef9d299077e8512446c30bb4c698b52037ce2013f6146861473f600b759db576940c9fed516e8fce7abb76a14e2033e91f51792014b2845cc5ec80734a134319b421a9084d2c696a189753270f8503c522c8985267329d2d61505f9343e372ccc7c316f820f446913f423969fd79949da5020f51a7f69311ebcf43b8667dc53b738e6e5e0a2d53512646386a6549c152ef4fc1f0e858645f75823a0428374d7b15a460c8678b2c71ffe92b7878556cc68cff2722d94712515a77cb3e1cf6e41d2e3102d96d7da0937411bc01c4d7798270dfc9eb7aa4077fc6f3f578235a52d0c8ae86ad1ce0457ce600a2cc303ba92c6865a2094aa710e392e36aa27a35b8535dc60d64c5f6d820d5d21de671df986511ae59f7ac0d7a5067d29afe88c290614608c113031003a3037bd7c45014cce4d1d05a1b881705dcda730408e3a3bb32ada5e7a6969932449a44c52065d085008600854242dd16665b2ad7513a5661652b25f51b5bb6f9fb427efeddba7b127f0edd7e079ed4d113dd9d2e2fd96a43fd113752772f53352fdeee04169ad9c2851519b8ad2010b91590d3a43604268c907a5d68cbbff6ecfd3a2bf6d1f8ab3eb09b038a356282b272c4f0ed893254b16d64a898a4938f341e1b880899224fb068c01319132c44db5a9a88ae4f311826d81868d0e58eae995eaa90391d995ee8504175c69e20a911a74641c115256c3902a99874b2b0869541922e4b5692f21331407bbf09032049399928f188d8868005fc8e08b98120ff2e5b6d4ea62c1177002b264c9b2b5bc60b7dfb61a1a8fa00c344b962c59f6762fae1ed511a28871450c1e23d56849cc3bbd983de5e024bf02430e14c6be97c310b5da545c711def69b138e926cc3ebbe3a4bf8ecc8a9baeb869c74d58dca48df6ca2ce6a4d5b9285412ade5e0a614ea0f363e20a84c10badba0a921dcccc1c3f637018b36f38ed7728436b995c9ad3c19191acb69e3260de5a68b24a5ddbc4a1842c7193aef38e9c59c0c439b79c7f476dc54b9959b38272c282d37716310baa3b8dc84e3a61c5c4567fbef6881c65a0ce1b2a76eb43127f9df3163978db9de8b9920ec8e17e5a47b310ae3df838f5d28147659b1e2a48b119af2409b9e59bd98e98a366d2c897631429b7575a34d2f66639eac965ecc8b7da9eddf8d954fc93e42d31d9bb3d6a2bcf3dae8421afafece7699cc49ab59cd967cb8697b2d265ad90db4f63a0fc4b5d1ba8c74d2673b3199b5e2a66d1c957cd8989bb28e9b46756677ae8d9be88e619163712bcec90f5605bef779a5592d9b63613b2e4934b74d7ac5c5085d352d89aedba4572e0865fb6b9a7635ae251aa1efc8b19cdcc270ac295272abef4665a4f43cb1133fd4a87ef846cad4a8d63aee78324bf2ce9b6def5ea0f16296e4f8d50585718c5d6f7ab1f29bd026b7c25eec888ead38969bb61abaee6cd38bf9832f37d519a8b2a7eab224fb3939d69a5eccf462d6a5086ddff462db77c61d68ed5d92e86d9bf4ca101a0b56a0fb2cb44973681879a0fdb91678e0561ca03049c4bc993d89608e1cccc0850221dc10a3f4f776ecc9e4011249d4c0066fe49ca04405a9dba6610de3b18bc554e2cafe278a41055f00c97ef740e9577f38ca5a8cb18dc1f400d521a27d0788501d229a1d3d407576fd3a6e76a3e20d2138098349185112b022c9ffbca2afba57a512498a4479c5b2a306be007ef4d317dc1f48efa5f77aff85f5d3b7de5037485219af244a6ab904a1f1a66068d359a7aa43ed48290c3ed5952539f71ecb4b4b624a2c90a417653673e0bfe580fd7e654f9ec395379a222c75b584369dc9f6af58ee2a673f2d16b1ce2cc98a932b0ab3c41231b6bf5932eb2a25a5a2ea15a229b6bff51759faf4504838d71e1d86a11e434dc564e584e52494d66a157a888d1354272cf1c0ae07664ff77a601e0fcc53a56a9ae6b7b6b86d5e1a1e6a79df7a6214c66d79470f0c0a4d9df4c03cb0ed1e9807a64ab9acd8fe22d35631ef2cd6921369a9f78d96d2ee9fe90e26b47b93fcdb6b9beac0c916b4d65bebbd177bac8054a025b1582c168bc556d66563f6148b51200ea4e45c7534452e8e867014074fcafc464aef7e55ac1450a4ccca2c521c3c291d84211673073f27b5bd75e33197792ba6c568e9263834feeec1372b6c8b022042770f3e11eda44944b4eb681ad915e6e448b44d97ed72a41347d8b31f101a4633e8f77c0540e2efe0419b9f013fc9dc14862158419058127720d1660984459bde02c5f1194798c6a347cf08be094ab38234e168e38d23fccdd0bdf743c0ffbcee034203b763deb2a77a73d3d2f541b1e67c75e63794e4bf737323476d79ccc3f0588cc2b4cad04850771cea36e9ce8d0e14c6653ef318ddd19139e9b11c1dc4b155592676659dd896c766b87a93b97167672708088259b5a38abbcbb57297cb55efe85e979f5238b7a96ea742c6b9dd75c5b2966c1748a54a0db6596137bbee4820054aaa8812f8216632fd8dedef944a1533b6f9bd609bee45add5df98d2022d62b6bf47a4e50d6d56d78fa0365e8711d0535569ffaa1f8e6c2e37c3f5ae1b0ae32a252895d1685d82d62748d87634bb5d2ddeb65a3f25249c596470c2f6df70a80c68fb6f399b147a7256ab0b2b602249a224ff182b5808a9d0e6e6dafe9bcb5979c378c31bc61bc659b39b6b739d98ca28350ac2ebbc5164abe8e5d512e8c99b8292fc8ab6d54b7b658c5d227bc24e70140c45e4bdbc9707ab3fc6f0aab8e97e16fd8ee6de0bd402e18072ea8fedfd415340a91bd56ab3b6ff67c79e40e7f6ffc0ec498b59927f8e69d96776f371d993d7b2a427e80f51fd40f9b43e2c2ac3bd7e6d1741f1a1b67f0b63e8510cf8bf26e7c66fe4a3729286e3a46bfbf65e1e39843635252d7ba2b695a3b15c49ecfaa609dbb59b5dcd123e424f78094a65b8c72ecff8c42beae5003f0c7673235e893e68ef4565bc7013de1e1b69de4b8444952c4e9401a5892ca5bf27b32702dc208a39c65083871b304a7fef654f1bd051b1808d23676c1144e9efc1ec898231440eb8c051c112265a94fe5a8c097aea46acc5f218c3a7bda3d7a2a589cfd39e34978b361104eadac31f8515e82528c9f113dba770e12b5c78a5d266e9b5f25ea96d47efe5bd46a9ec202a6a4d81bedb6ffd5099fbf5397adabe7ea5270795fc63fcdf9fa4d9349086267b1ec61853984a35df8a8899718a443179d476bc30d45ab91b5815312db4d0428774e941e36d7edff28ff17f7fd2771de96b71bebcbcb83bc6be7a797979799142db6dbebcf0a0fed8b8a0a6fbe0c75630eb940d26d12d4d36953dd172856dd2170fe06a8f10b0a15a80a6fef8464a234029404df7a910c08d3fd338b60f411403bd8d2c977fcdf1af2ccf5f5eb48b5fc00f7f0213081f880bb127f0c35104da68b3b2b0766dc743f7eab878154422b718bf9031ce5150a141f1685086d0a608caf6d7726e2872eefa9e28456c7fce3b627b485092b7528213bdecc4d190cec7911e72ca4eec62a3215c17b324501c8d9d6c549f1ba925914c2fe5bd37763ba377763bafb5ec9bdd13daf4581eab0015855d47bbe22fd11fdad70fd153a7e90ffc2e4aa2db013cc8a1245a7b685acb49fe39772ead55df268f2c279d654f5dce2cd6c52107bd420f93b4fdbb9d2bbc14cc743bde89c510e4110df7c2dafeee25164390f7256bc98d2c8fa55f9f163a6df8884224c21b683f4b0184d53def9d1151273920a45a4ac998b2512ef6bd97e3369cdf5a6bdd5aeba23040664e9e965ab07683dd77a43758b0de5a6fce4c7cbc61844e59e44611a5e4bee50640802ce0003309d8f18536e96b48deb6bce16dc31b2712c9cca0329ffd36fd8fca6c4f4d107c33dcf4a73cf1fa27795019cfc4dabeb8a57e0b95a94f3e8f142885a12e50f300228cb3159f886d3ae50936f61547f6bb1dda95f3bab03e58ffb3a28e6b69f97147979616af32d4d1e503756c71320cfdbbe41fe3fffea43f0f50119a8ee2a9b58bb77bb77a6bbd1ecfdbd273f36ca89688b43de5ac75cebf901a3880b74965d66b0e804519acb2a6080a66a0caef8b80c6e8a27c52ed68adc8a8ccddf53c6367ccc6dc05d3ba6e94ed5084d430432dbfcf62deb5e5a63afaf69de77941bc0d77af891dae2a1c2a5371404fb887982aa68aa962aa188509d1409bf5b4e769efbddf4d2c16522da1e23297e9bdf4de5a39ee81389745d287d830d765babd5a6bf54626dd8b860bc3b3c10b7eb0445984e620086e0851e64c5d266cff05bca0838dbd07db5df05aadde915b6a8f053829c449f5c7a63d5c0ad801a4051a012204d41ff7ad365a1127aa3000714dbba93d5c40687004385ce54b3e8f86c2388d7dcd5e3454c6dd9dc69e5e9ce4ef03d484f6cf34987b0f87d4af570a6bbe6d9be7511b549c6f59c4665e38f102c76459d689d96c369bcdce3aabb3599dd559e53ecf03f1ea02035d35f0058c93a3e05cf2e185a1e78521f670e879a1e781337819f2df56f49d31f6bc307c2f0cc3300c4593484bde4adbfbaec64a3ebcf0f3f13cd0b3578f40c49899050861809343f2fd883438a9fa1b9b6a6d33a6be2cc93fcca2e568cf870f7e87e4f37ee34aec8cbe927c61458a1459a881064d430d22a268410517aa98874020d0bd20516b694f087e4e58515c38b399657dbc04d8533959df142c387bd32946a0c1aeff794e4508d736331521a0d8f5fd3d6a8e60dba7db24c1b6634ac7b4192ad54a654fa21b6d52570af507960195a142657638d1fe3554c66eb7410710c862b0d7dd210e7ac17d6f4cc99b41c984464dd55a6b8c0bf4473d6b8f3306ee895dbf9ef5c74bede1ef2ff58701680fff1fe2b751e0aa5478c04979a1b9769881ca939a62042cb6595b3bdcb8595f1566c267e0d8363f55adb5d67ada930f254aaa510cd5099d7da9c95b46b6261ad9140ca26d4d61bcdd4212aaaaaa2bf0c508baaa54b1300c1d35d0da533084a3b5dff096f3b66dfa1a1162859cb033fbb9afb416894852a3c1ee59a94492ffb3d968a66b0c909acac40a30d2286b8a7c33e0a2a4ee826959dbbfa60835e33584f249f745c82da20042f9047fcc5319b7a1ded39e409f6fb4eaaeb03d79fe3e0f213e3f1bedec85e522d96eb35dfbc44c3f7168124b871ef4356cab430d5d1f87c49a2743c2f06b42e158e3f9cfd784afdfb3d566fb9cf785c41ad05803fad038029f9635a11f81348cee587e3548edbe04d554558950a84cb551d0132e8292fc9f3c89228a6dd6949d45d9664df90becccce280c4e4261b0dc53b4334bba36a2dd62a34b60c307a808a8e9ce2a0f5f0c0d0dda7dc1a2fdadb5b310ebf34f6ce5df7fef9f100ae39ab6c2a3a0424cfdeebd77c3410058017062369b9d36cff26c664fd9da3ccb337c3a19d3a94261fc5d2d0a93294c389b85b3cd8513859af90caf50191aee8472d053080bd7406d0f5d307b0aafa024fff015ae2125b65d65495174a8da6e7228fb26870a6754a6e2d3490f83404f7825473de2f9015ba1308ea2302120b419cec2999b4cbc0aaf5cd97193b925f19c6e32316a6371531237edf841fb9f30459bf8bcb2fdb1159c634f6ed01f9e22680fb7273c8633ed2a6c13e7e49c399488436dffea492284c6361466b6fd3114b2550f98708208a2d9ca8c15ae12f3c744e06caf3fa60082e220a8a96a5d88b408d9603b46d9aab5288c47a99a56efbdf86d8965b35900581a07002e005811ae6a78da534b4bd812d6162a1a6fb3a5254412a2ea0f70fb87aa30654f9e0f37d2caf6ffcea03f6a94da43e7937d312aa3d52abe343621e809c72c69436d29963d793625b66f4898db4967a0bff73c9539424ffacded87ed9b101f2a414f7ac4b1cf88654b6c1f71f8c4f611c75169adb46e7f6ffe11156f3bd8240c471bfd3ee4327c0adee0c2ce6134442bc1a7bb0958f70ec5f07d2895e07f926c336425240be984a2d41fa133680f0fa551ab506d33747dc4f007ea82bf16431465c1ff8a618ac2f87bc4906549de8219a6805216cc3008336ced5088551c4acc4224647b2bbd310cb7330e6d86e1199e007071de4db153839b4da7d400056ead860708a592b72ab924f1b5b0fd63c0510712da3e599a694c8c5c232bceeffcbed39ebeef3b3fed3b3f1495f1b6ff87c44df6cf6ff5b176cc49e766dc6c937db4525a29b5df91effcce20741d4dad85face6df69da318c61175d2ef38aafff9ed10fab7f99da9effc509a8895609425712bd8fe38b3fb79617830d30b63fb9bdecc9b7957bc2a1ecc9b79617ce7959db11dff404f363ec494dba372995174266f323759218a30f111a87d5a927f9a4c93691ac61efeeec5e0bd39df798e5c3b4ea587d8a6546cbcf0b129159b253bdbed73d6fa867aa0f1d337c1842f34fecc715c10fc96764fc15a3b77b99e4952bdb5b722b65b8dd9d80791187749e1d5a73cf0ae1b869a65d38f560fa98795c28041ec6e7132a31942eff9212dfff996ffbc595b2940a14522b52900a1452b73f21bc951f588a35afff3f9d058a3e33f5fd3f29e375282c411f8a137526a71043ee88d949e0eb164da9918fa7b4f8708c4923c8523b48e6f79ed39eebbaedb64c0bf7d10fcdb1bd9396f36d7907bcbdd244e7ee31dcda01ff443f483748cfaed3804f4a1b1a665a40fc47a445a7e8638a9bf9146f484362f4cb673abc474ae952b6ecaa3b6372d89938ef136ebc971f6b41df921a6dd1ddb322c8ed42354663b426176a8a76d874af26d88213614541420d1f823428fb4ed4c21058eb233bb130395aa0a29c26d5ed576a2a1abe751b9d43fa3dfb7ea79d38fd8fe266ca716b7d3b39ddb55c5dce426f3c22eec56d9cecd663b2f4c55b771abdbb9a5b69beddc50b04f2da39e5ac60d6549fe177661a18703247ae3a3af0ff4b809609b8ef28c04d8a6a3f6e6449bb555b1686d36a0266c0535692d2a5b0df6444b7a636facdd72ce51ce7307e83c80d05aaf740b9571d75a7b13daec725aa4d0de4265428fdca43dd5721b3d338f8c043934b5a49725e57864e7b99b6c5f456e3bd800fb1e9d6d3b188367b390443f5922693e4216ab392edb930628c93f032a6dd223509c225bf6800504a1325013c6a161e0e0e7b8e79efbba5db507ce02b637622a279bb8573363c32d14a605b7ac1045932db464e2a425c998f6c45f8c311c78d3948056b8f695aa6a4d65fc5e8e033dd1cfddc736d8158a2a83ed6665a23a412d8c067bd29fb51eab2726537bba80159d2a1586abb3aaaaaa8a8a4422914ae5a15e5cac8408c9c9114265424dd384f4a09de82a0e20087dc2a653ac78b22f38032d6d9a684bf27741479396e4a61ec80b5092675b45545fbb6f456d67bc6d993661a8a3452171f22452dad5a6c649234839a033b449abdc7d010c5035dcd070f06d522cdb4fb771d23de5249222f554af1015b1ab0aaa0ff5aa5494844ed583c60b70b2c2baee6b9d614ca3f0a414c7d54a53273f1d317ddfc35fce3953197a02804bbe6fe6aeeb4c980511c3ed6d18e311f4d22d4f34c5a1277a1b412f6d9676c94df72975a92312d18c08f4018d9f7f46ac6d5cfe406b631466db7ea030fe2944a1753e0f4a5281a83f9cb1eb7b4559b161031aa0a3a951b1896480ca743a0c5000f8fe1b7cef41eaf278acb5568711740db516b18dfbbde0e7752e9c1885d191398942b13a2cffef5e7815d721439bffff78db70ce1a0a0f569280e1e40b2c31396b2d12fd97ec6a9bf4e5af4b8373d65a24fa27c91291524c3d82a4885859aa6d90512a69b3e670855e513dbd42721c07d68ab74b0e74eeb6a721d1c2aff94a3126a84057999329b8a9497ec70f3b54a0cdaad2426baf430bade995c62187baf36882c0deb0edfcdeafb0840e81dd9fc7517e70d4c1c93c76633dbdcedb267d79b57a09cd7d850125f9f3e0010000e8d0016e935ed1deacaa92102a43376703079c8c71e3e421692485d11e30f20065e062e046adb29084ac29e30af66cdbb6791e887b94a854211ee6f06d7e9aa67d0350c11cd1d8ba987871914aadf40b95714f79f57b7192b3a5d46690d217d0365f464e7409db7cd9a69f7eba8dcc4a95f9b98329596c2721fb0f9ea03f429077367154a676e7f7b58b2aa55e11abacd153758afc668502bf8be67d2b6e6f5eccbd46b1ec5a6fb0d40b2e07dff91b6065a05ed40ed8d134e2648f23fb1b88a770fec61137e2c6511e5b9e835da2dfd0d40eb4495db782201f50cfdb86f1d675f5a39050b41c6bcc8090b7ad04400a2f9b586375d0022b9a288b6c53881145b97d166b5880a22c52db28b747010b7589d6e612e0d0d4c9928d43bbd050182f4355b4d9f2623d376849b5040186ac973d81a3b39ce4af3deaacd965e202412f0aa84c67841c1116da0650885ea093a0f912b1fd2d1bf5545752a8fd0195c154a6fe0eb60842109da1c5b05d581b7b06819e3c1fbee972bc114a65f8a66779bd6054460c2ab3bdff2d82960495b9277fcd414f3eb363d4938ba0684e5e4c44446820e84ce321a3a1d9a85708db7d664f3567ad45a2fbb2a7ba5abd56afd5cb59f6547372b6ba2b0ac5e19a7fb5d59c6cefb328adb6566b64c4d29ac6c244e46ca995266005b7eca52da1ad3af1e5b3993d77c0034a461a75343f99d7755e8771f714a4f17c6213f03b51634344e5327c8f6853833d612028c95f6b83927c6584178892d044601e5073a08680d2a468532ac95f5b8292fcd1108db1832b4453e43cb1fd6b0ece36afce7d85da7863de6bc4210885002dc38e13b532280c7e2ff4aa9759bcf4864db03d69665052fd3844405803d4a8a0305a159554df594049f5c1106da1651185e8c9ae30d8f5beeeab25e5b94beac5c5cccccccccccccc0cb5e00bde68064ff89ebd335535035a4a2da8c5ac33b7838bc807adc5f790bfe3d42691fa3214e08e772452c7d103a30f275f2801a1cdd2c889d6b1cd990a82b08806a030feb40063c40ce1e1062d8822832653e880fe6007702c59c3060ed715578e0b278b38b459555b09fabd495d9e42c2896e735e213be28cd96c36bb51d50f1f8f2afa518563a5e078df8e260934f6f47a7ddfbd1f08ba5cfe0ac7c042efc52921bf087bdf077eded77dddd77de0e78d4dc04ec9e7b5c03b3327e2c61dedef08c8f75e2cc41731333acf136bb93dd15b9dcbfc9d37f3f35398227cc7ddcb2951fd6337ac68292da5a5b49496eab6a9b13c6a5570a2474a2fa5f7daab8213ad891acba6b4950fda6e0e1f00457af00cd63e27699f0a4fb4de428535b4a9a5546e32bb2d947c122de5a69b6e0beae415b393ee935084be6f764decdb5a810a6d6a292db53da5a5b24eb8ad05b1d8d2a6c8b7a6699aa63d7ee1c065c5799ea73ddd7bdef39ee7e9f7c8bde789a232dff61a73e3e43d535081488894016284dc5c81831cdc98f3bca95a6b5572cf7bba5605f03c2f2e36bd9e08be584b57e2a41669c989b4bcb582ff89dd73defb502ab9ff3c21a80bfe57f46ebc4ffde479f3db38f88743b873c89aa6bd4290b71deb0a79fba7e2deb796e68d7bcfebecf5bacf8513fbcf44b8aabbe4f35a14e61bbdd5f2688bcaf8e76a5a0b4608ddc2acfb590a2ab75aad1cd35bd65a267f556b783c2b6a9f2b71dbffa5e5561d3b6f4e9a77fb9b83efd1e6520057cc939f4de9b7f19a66bbcf6d7c209715dbdf5bcd9c1bde729e3967662c7e8bb9d79e87103a3ff737e78dd69df5eb3689b59fc1172c97b7915a92595755654926d4196c7f1a7b1e41dbf33c41aeeb1b0fa8dfeb59a2497e8e4a153f08430e1808e18bb213429322aa280308296b94fe346bdcbd4b745a5f38f162c6c5c5c5c5c5c5c5c58a0e6dd3c5a58439749d43868f1cdabeaeeb3d1d375a7bfc399f2d2a1d245404dd62459b1a4c83d913d65a0c6b30bc82d1e0d39280d0f84d7cbaa149de2423d1f8bdbb39df9cbb9710219aeb4d727f23104bc2288caa2004b4b27b2fe5a6246ecabfc63649bbbe49c227ca9eb8d17c52f475b316a370b5265e8d55094aaabfc4ae8f4f7c7a6f78d4f370303a1af209fd67d4de48f9f95a6bf54a9bda534be8037afab90b1f6653026c6af6d8a68b052559a0a6eb72524361d3bf5850d346497f0e567f686358ed187230b19620d1875c823e24d6781471cccad0db80bee543e2bdadcbba4e9c5c5d308aedff49b1fdbd4b83227e441584f289593d5067bb03f6efb7885709ea823f48b4f1e14b4a5b302f0cb6bf0fa5925216ccdb64fb6f378a76a7a0a4ff121e7ea25f9eece65c57f664f6c4c138984cc6c1381807f3ed9eccd2ead62e9179324fe626dbfdb64d4f963d99b64d4f86bbaf035fa0bf814cd89df8ed2cd2294b76b60a4f68bbbd973f2b7a61ad32999b4eb0021a0d09e9f888a3219f96ffd899ddb1241de268c88ed7f13b463b1be5d7f13bbe451c0d21e15b9e84d1ee8ca3fc3bc67b634924cfe30c5e821e345e1de34d695468d393ed5c973773934c832f6490e8e575d99397939373bc9ceb12fde3680ffb5e4ea84387d6610ea8e5c3176fd9d9b2cb14a665a49634e360a69f9f7dd232b4bd1639f3db401c82d00d015abe27e250c50fd44c2275b6b52fadcd1d17829fe862907b71ee7551181373d7c571a359c79b735dd765eb174c6ced3d5e170addb2b365170ac10d7567e76077b639770884c1b9f17ea0f28ad97e1fd14b6b4b99cce326ec407b2c0a7b3389ec694bf957e846db374b3125181b6dd988c3ff5ffc7d743a94d0f8fda9a5d494bf86907077ef3a777b6dd8bdf679f77aeeddeb390903cd80c062b1582cd64ae4d68a4a3197654f22114bc412b1442c114bc4e2b2e8e911b878e19435454229382575178a9054b492289f6c229188e5a61695a93432f04dfacadc0602813a90a8811e1c6bc0078d23fcb4ac01fd085f8d96a00d021a6da867122a53043d695fb0e88c45672c3a63d1194bf3e2655dac6c71b6ffc662bd686a7dd5577d5d8c354d0341160be4b94707206badb5d6da5289245dfabaacab5eecca2e9b75028c50a206654d1102a8008e12fc2234e78c1394611ead2b0788b52e97cba5c3b92996dff60a6aa5b0605fd6a5f2549e6afbeecb7f6d8eeae2fbfdfd3e7f90efe66ac355b929af48ceda5099da033d696ab868cc45632e1a73c5b64bd3a18175e5d75e188738f8000ed00cd8ad06ebb22f0bb32e9b03040495b85c2708e511800046308145112cf8c1143908a37437c8d8218a2fd26041a62559cc8cf36a9ad644df3763684c4c4c0c1ad9071a5a2412514ba9a51cd7e56ec32ba83d70129fb77ddef6799f77efbd1709ac6db012444a62e1debb6dee39e7d699f39773ce2f5d8666063dfd095a19f484ed5a1927686550193f81c2f88b5de8aa83d5f97d1f57da5b94162a6ca7f9e7fd847958a2a845bfa9efce72a2a241088bc5c3c9501bfaadd7755ee7759dd76db8736e0665cc801002855c2097f775dac579e33016b712d087dea4302d5cdc35537bb8f77df7da25efba84051a132a635302ff1170dc4e0844030c36ca605f1404f5408320f8e007043f20b6c1281004416f4bd0db9366c54915bc824593e97433f5877606ed9163d3d8f54d04c05ebbbef6ef084f90488922a54a973349fed76a4f5ee62c837d424417595e6cb23d052ba0c7f349fd22b64a1b49cef289f6d788d883ae77db31e4231f103274def6debb713f884422d1b52227a55b6b1511a108a150a94492ffee34c4d0702fd8cec301ed181a58ce99e3a6ac5c1e572ad5d02ca8108306654d11179a6095e017f914e1086518a3c44df786ca68355549fe358b52375553ac1c77c11facd5e524fe2ee7a69ed074d7f1f367c780f74608dab49ed7dd4e86edb90fb2e5a0ed8e7b23f86b755167cddc34c3970423b4379a550b2fbea0271cc54db16e8a7553ac9b62dd544da536b86517a4a196c4715fff820fa8adea0580227553e00cb5aca92488a0a623a8697bd790f017ec54ce9b0db36ddb6eeaa642af100e4e489d10c4e7e379795e1576af73f9b561f9654fb8f4c83c2f0fcc33dbeef545615a7ed0b60530b4e969797fcf03a3329ae78a13676cb7b25de511c3b3b3412d80615bc45a7a60f644c4a4af17f8e1a71e378dea8f2fa61f1c4dd1379a7f3d2f8fadaf577de5df3ea7f6f0dacaa89cca3759955799b5ed9cdb9fc69eb6284ef2c7c95a682f44555e87dcac94b62b2d168571b2da54300ab363495ec5a0f5555b9fb1be3caf0afb7c3e9fd1f38239b5e979bd5eaf94c70a591076b87658b1adea59830e292d89b69df6542a91b18f89b6d39e59b8674216ba060ea4a0a46ab19655a45bac3b85261ab59db58abe6a2aed8a9b049044d7bda14c4755a15e6cd35174e352b5ee10a1038ab6b9aced5f738d983d29a32c12aa42555277e1bee904bac2380c33a1409bdbb99daeed486363f336fa53182257d8b6a136246eaa3b4e7a6d55d2a66ab9b4711bb7d38ef7841a68f3c278ac40d3ed1947f643eff9cf38b263a299a8a46d562641ea10890000000400b314002028100c85c2e180583c269a77353e14800c738a48745a3695c7b32447621c8490318438430080800080cc08cd38000a8b4525eaeb47e8f032129f8262d28602a1b1d6e8d68c5d56aa8de1a39cedd5a79988ee64d8591aeeb0cdc4147ef14ec4a68dc9f8af72a004680f2a2e8aab5aa6772736adee8506497ae966b6703627ad85ce7f5a8d575d1ef8acc33176e7d5d762b2c778f9cc43e03b42fcf6253df08b319c5ab8529b57b97960968d772b173a6b49209c12bcc94e42907b624e295d2fe93941c8e5569d022731f74a106cd57229713a763c73b59ec2da2408aa214b329eb0e0764fa1cba1b1dcee5cbfa06c412c25a273db4ce972030676995368a210d27ba79d6f2aee3258d47d99755c8394cab454a2682da31f2bad7510c11f134b8099612b549918fbcdc4a71173a4e517dc533325580d18722626c6725d7be107e15d9405a711339fdd60d15cb55e41aca131423a6fa7620085ac586feadb908960c50cb6dea0f178a29f9a22013ed6627262d719a941b105f5cd43637efb08d23686c0639b806afb5f80c8cca9d2b397097035f25281c0b50716159c50224a8c775d309db3c63242876474e86ee73f8151048b8221761c8b54558b0476d1622964aa86c5d058b30b23840f86882392a5f06090f8810de482604350746cf22c824d257f7141dcff94190503c01a38156f61067388eb28674a68952da4f1c1c8b33da925a8069010d80acef82baa0e085fb20d53ac17dc03b8c09cf01b56920b477518b687184159a4fa423e22cb393b0ac0d288ab5c55d357bb5c6a30fe2aa37678d0970b3b08548c6aa74efce3f24a4bc42ca64051e96b1e78a6f9972d6dc65deb11e06bc84725333cb3ca717bca6c04f4e2a68be6e07bbd77314b4772d5754c81f0aaa26da5f332b9b2595a590b2275e7c2c004396b2780bc58420545bd1932375ab5f6ae6ea45999e4268e05d55287e1e6c5d00163fc6ebfc3350712979aeeadac5a50f9decfaa4c8df88929bab2001c12cb378c567dbe4b672be54f3bbedc20f357208ca534e8b1fec52debdec085c6d84fbf907b5a26ea2eb6a7108e819547024048dd545e65d7eba73d7d4b00fe30018adb4ea75b48a5585fb1f22953a07955aa709f2d8ff1468c9463a2ff80d728ffcd76cfce577cd4f8c4462eee1ae8e7c2dcdd59ec90014c1c215a3c2d51e91aebb2ae0957fb88dfa2a000804339df7f744d2952bb5d7ed40f9c005cfeb14c3787e9449c8555eb86203de32f12dac1a2d4ce29a026a54ba9d866e484c4257adbd79ddd21c2a9c161e793b40cccb6db3d2fdcbbdefe337ea26a26e4ef6cacde8d63183c12dba0114d64b3b0135f453732aa7d6f2e3aa21e3cb7a69358c0f319f4ed2c6dc0cca99c8fa8b6ad9d8820cffeb4abf0ce824606618c2aaeaa7649b8552501a219718c62bbf41613134659b022f09306eb0cae28dba061dbd09b753828e1166f52c9b27ce060b06a9901116fd9e647c46bbcbdc5787b833397885914a9d10145297f5633cbaf87026f92b664afa5127a191d2c2d2d091a71677801ac6aa301f5c7567c096aa597f1312e83ffc18be44ae3ec0cac0c7e133f4f3eef9f5df07970713222c945c7d43153f130eba49a79d90456b975b66f98d6158bacfc0c8edd3e6383400d2e1eb669104e5552945c93136d4f04cfc9289dba0ee1d949e4a2d49f1950015be8dda18338780c24ce4bd3ebda1c1155630385a454df2ad695bf6301ea14132b10629d911acd42775fff6368a1a0e685207b116a91524e6514b272498d5f43a195b932772d1c02983d2688199ef76de83da4fca5828699f5ce373f983ee57b841c3458ffa7d65fe6b64f2bd2542c8594aebc80f8bc853d0f487f27b48c2b8b8f07b4c081c1920478febf4523a8bfeace61e3ea8e66747e2f82048405702dafa3354dcc7f359bfd8b73cca41c4eb7447880c5cb482456668cadd77c90c8af77fbb4c49f8eaaf354860b71b26bbb67f0918798dae66afcd34d60bfb707b65261251a339e6dea829d1bfbfc86289b0057f59680f5231ac7487d1d9f105892fd4c3ad05ce99541f4f43d859b66c05dbd2288a743a325c072160087eda2419bccc43d97d7484861e95dc03f952a686c086202b8be0db8bb3d706fbeb323e995007bc1eed01e09639f978afd1072e19db8e930e0cb07a2a13e08d4d9e702400cb2b10cf0dc83acec01de2feabab5a0c23725a8785807d28a8dce74a8886f20961c6df241c090787f0af50289698aec7e850d6bc22f7cdb1e045d89ad9f39413b5811a0519e2e165f5afd92b0f5932c6cba1c0cfc708b40ab4e3914c92fa8059db5081381a34e854b1220c14d80067ba7eda8f4264d1cd3efb92c7a020c513976c93fc7c7702f608a7580a9d6596098fd17acfccda529b7e2295ca9b8bed23ac751c588a59e2849ae69e5537ee30ff7a1643ac6f4972492d74da0c178cce36157110a57c065b2c03944fafdf3bbd9bb9e0ae8b0cdde4b1b664e2aca6f0c74049aaffd612cdcfd17121af82fb1151261e99e7bcfa171f4f3bdaaba77cc768055ce9e50f6aa94064a59fc25fbf1388316b9ecd6262281e8da9840cc4a5af8a5b70dc46710a0c4f291d8a157a06181ebc3ec9df61d9bf35600fdf34250f46e33e73924bff6b3c44eb0f47b4bd83133d9fbf8b90ae112e262a4c8cc45fc8179ede1b9f33edf9c8b4d96ade11839992fea9066f9012be3f744d624ce78a3c71a7922f0ad3af6f2369dd4fc5629d06b63a390dc3d11145a543e34fe6e659f58063d93e8b04c0de63b2782800e27825292d517ed9a08acda092c153fd395022b2de8261ef7cfa6818a780ca6543e24945a219741112806de9222052db63be6447fa345b339462ffe8296c5a8d084a0b4fd1ca6cfd3892b72d069d3ede803bb88265a4e360834efd52aa518608b7c51f019b4b04e440ea8d94e8ba7876a9e2041006a97fa51500c58bfa2cdd1e370f0e5dc49cd8870ac2685e61f99220630acd9626737d6f6ae6cccf7880d84f4886b24ac00123c707cc9077bbc4296247cded7fbf4dab0d217ad0a5ce12d5f47a90152090c93f810fc53585c6cf9059f236f5c21074e72e7543b444608a2308b7decf6f54e65f4a47561fff5c0efb58976e113bd7be8aef436871b1f2b8d99beb6b588c01b24218453a2e8eac59ce85d3ab9595c61f099cb2c819a0eecaaaf8785fc05d612a897533c02a6a4fa9a3ae34d313e8d26fefceeea4e52c6f66782d5c1f866e7b4a90bcd98eab6c077479dc789db3aa862077fad4151c72f9230db7bb32413296877940a84d759b45b6c510265b195a5f426da87707c26bfe47214e9faae25e8db70aefd1dfac0eba3d3420d3be62924fd4f00002182b41a2e031e4fe901c66dd93e3c253e03a7460384beae8129ca5c8ffba7e1a87ab48fa71c2bbd61cb1622984b518f72e3331245f9f178216cf77037cbbdd7f47255f2448993bfc03ef50a0d541d49a76ddff7b3591d6ede8f96f7b75cfddd72ffce7f0e3b109e84897c5c6e134dd00524af49e14fca82d32669ff0176c6537bd81ea4df573c1830e7c4861bbd28f41fd89e66d318a2b03dfaf8029989f0d7b0d6bd86fc05db1389eeb1bdec390c686f29be49f764d9a15ee3a2891621dfb03dd29cadbcd81e66638d21333c99a8cf801a8dd33a1a5b07c40811f9cc92edf173d61db2087bc449655bd8647b7c59d59d320b1684a12e02656b29998c97a6f0ea3162e9a001035a12a3f288dc4240fc5777b56af541a8ed969a76f792f089e8408d3d73c1d996c3555cd6fc5847139508f3188df179efbd139e4770dbb3687df87759301d3032b23a589b5d697f76696a4a43b5028491721621a18379b89e37db9fcb62ab4699073558730994c0b994601e664c2f7154028184956bbb09127b8b464c803205f2c4c6ada9095f0c31ffcb79d47cceab82bfa4c44d68ed5a987490a34fd5b94258e0885189b74d73b2a5830dc7e71c709a00f8ff09ae543db9704a735e303c5a50392bc6e1b3314a148a312a94e15f681dd10ded96f7a5310ccf66ddd510b8c19b1ae93ac00504f361fcfa478250ae28e5c7983a8ad38ac8203b28204db16f4078605603cb17d3213cd404f274f1c8fed346d851c6202349e2f496910429c96cafdae5c78655988ba004c2b052003de9ddf40e58419ec0f9674f3474de01c17d27f1c10d4972127f644e130b078961d782f9ba9ba416f1a24e557279a417767ac112a0e65d7b1bc9d38fd12113641bee88d1aa7931be1fb8e4929a69d5083fd347de14ed56064776e5e1dcfb5f44642d90a1bf7c0aa3df60a99ecb943a3d42bc23cf6341d7b695e4953027e47ccd3395b0e88049ae8f16c1506391a59b64f19c28d021be8488d3240992724b752711c45250f480b1b89abf0162904f8418cc439fd63692ccba73ec37ab8bc0427f867b628040afefd705ffc6cc30c17300c6c2bceacc2b972b83fa31ea5554abc238d416fbb7ff672c9aeba59ce04861a1756d4521521d41f4a2a3749a5414a6cefb19495947da748e23e921ddde5f477119297b09b000c3c5d24c72a6da932cb3ac93c64643174a7cb21eaa1a533c1cce791d62d3da741a0ba96c5451dd096bb7700e1ea99f79b335988bcd1ba88fc2b554e805596ea68c8806238370589ef991ee3bdee04697f10788899bd5a36322471433f5111f013bc5a83a056734ff81c6d26628a1e8ae9c4f03d7d2b35391e436d38ba639901f38bc2961d6029a6c1aafa628f8c3975ea647d856c60bf90030e02304158ef4f6da275379c474a0120932c9a1c3a49864c91f885224e7901eb565b877d9ec48bad0dbcab5c8d6c11491c8540fed4f2fa70c6d9f00a20a8a074814edb1cc7426f0edb4847c528ebc953bd2e4e06ca7c5fa9fb5ceef6f00632946d75c86cf4b89575244146e657087535a6c15cd9d1e5d86cc2561f0d021f982d8a74472c3a2ba4949934e4243eef53cfbf3bc2314261f63a94b091f21bd20ba9e2a020e92f63a7a58f5bdfc8835c64dd6d8715714a6561cd884ec6d1dd1aedf81fe819380126456899dcd8578c8a1b5ff7813c8a48ecf4266135caefd255ce95c3abeb59c6e6c5508169646b09747521ce8f24fdff328ffc68f9b56db1c7b818b87a3e3b40ca50a09eebc136f391ba85c939f507079f8da52381494e1f978090560254447ab5408ede163597fa208c4b1fbbc73b14e920b2ecc7df6c11f959948a7b280feacaee5fe7ee8b93e9019b1c875a1effa6a29212a62151b36d924b6b3a923691d55f26903f3f6488470bbeeaa87f5aa928cf355ac116f9de752ac3e28744624fbe2b814faae3460319023465b33016379d63b957196655816ba21775e9ce088d7b589a2ea1f1005180e7ceed609a744a34fa820eee916fbf16573a997d8ca2b2bbec6990296f1ba036e3fa53bff763f31a7d4910f20b8f0b558e78092693193198a9d3d49ca4106d834a3c24a05320254b87ed1e85d3cfd025efd948c4c1a9ff210ff21b83efd8af846afdb8aac168084a05571aa9c156a19cf7005988642c7bd7bcec260fb75ca8be00c41bcbcc4185a928a85e06422b61ef8d153f8783fcfa23112244e1008771dea0198e3b03ad939f4cb0b5c56a85ec8e29a0b0ee1cdbd29e0b35271e7a122a01f840fde62f8fc6a5080b15e8ef6ba2786643bdd99fb8be2878fc35251b017613047b1d2273b0473a453897ac52f964ae8e693485cff825be993c662649851429a982f33f680a9dadd48ca2783e21b10a7ae67b284868702ed75dd1da50c3a6dbb0714bcfd83d3a3e752b100c031701ef0e1e78f2bb24fbebf344676ccbfd4eb2a8b74080f29157cb831c01a498b476dbf2c7d9087da7d2556ed5e9357628271e30b30517a3caf77d6f4da3b2189b05c24dd8704e13f1f84077c42f8de3f446eeb12b469971882ec92da2e386f4512c37b74cd822e6138abc261c809306bc684e7867cbb2ca8cec0706efa1ccef811e3ee5c19c6881336d2c6af1d42611b456d4d5af83d725f03869200b36094cc249e39eae82a30c09df4021a7ac5054100dd6a39940294d54c822f0f6784087bc528d9d89a6f8bbd68cba51a22ace54cb860ac15275bd86e5e3bb83e3c01abd20d0e9bf89534e2925aa5efad3710e320f9f8ba700b133d3b091cb86c34cd80b1b2a2a0088f1153a28d9368d4aa870110667f20fcd04d9871ee0b0ba68676f326b8b656ebf834a0949848a73acff723a2aaf086525dbc21fb9c0ac018d5edda965d332c7e7ab1d6da50541e2095402a99dc94aa321605a79b9a7f56f67557aeac4fe89ddf102d91f9120dcea59565975c32668439f166b66f99a5b137f949198678cb3a8066d0726774793a8d5d336b45e919f91739e7ab66cf802b43e638ccb6c29e0055f2c4b5c04cc82a97b8b9fc7e0abeb53517708ff009803e7f6c3e0f441e68d20afd2d93c198db9c09a9d9ba7302727517bceaa43ad32d24eb0214dfa099ae751bee13f2cedb893382938aaad6529f0d882e672ca8b967d233a1a6964c24720aefe6d4e3e11bc8020bb044e66e45e2adbc0189400558230df19ea983d3557de422e467918a698142439bccc9945a358640c807eec9d7c118c57231e35050c304c6ef74fdfea1b4de5f0ffb11c6f0cdc106acb374d9ce23a3e8d87518d3e51c8f22d1f72fe8d3c6098fbb151cd8dee0816990a57d3eee4b31e93ae7de71ed91d5223ac2cada623454c369fdad3eb87c1a3cf1db7f78a5c18170a656f4042ea5ddb1292366bbfe86d4e55e03ce6bdad59bcab0e6eb346be8315d2829780488ba7b396ab87c0344de50657fb2d01966c32dbf2864f22ded43aab6b75907e7fec0102211e2207f5e1a2abb9aa7eb07d9e73cb173fdc7414c47ebe1bb8f43e88f849b72a18c8f008eeb6fd286dbc56a462a630e3bb91e686151579a8359c55287b68cc6e5c3c388f8f8719db4c38890df3022b444dbecd96930860463357cb1704db5a96df5685b5d06775edd7080fe92dafc0aefdd464244f051d5884433133025ecd16cc49f5f2f15ba3f21df7c0d45df5cd6cb6a957c58f84a29dc7b16e62bffae958d511e39dc13885e5c0c76a92f2e7a943520372495bdbfb4444c380fb0270f879f61cf754d0a0e8405ac72055c8e8683c49c60fd36207e0b7bb262c831f2e678e21c623ec7e0997dcba3826e6f9183521c8a9ecf925fc52a3502e49667ca7e26f883ca22f080f889a5160db9dbef2000f381992f43ebc6a78646ba416f5669c98fb55c4089b586e34c8005ab2fb8dea7006133e5bebe8ab6db1dd23d2cf61f7a61bf0491e3d7dd3a38b7435c2ead79eda483d2e5b63e0e6ecef724f3f18e2b25dd31d1b3348592ac4763e00a628feddef4898004af2f93fd622ac1c2f0b01c6a638d50a391920d7122c42aeb290256b0241fd94755e151cb65af5002041626c2bf205d83ac52e1e1b435de33a63185ac57e151f5e5bb38edeb53cc9f931e7f0a003e49b8f04072b41d365c7f7d4732a332331f6031da484c8053f6f665c133fb7295769a39795508e0f11ea0baa2b7a60a959443c9b3c9a2283ed90a8251b79ee2cd836b7b7ee3740662cd13c0c25c560d0a28693bd8de717f06be8fa333640eac6c438265f3a02f2452945236fac092693b645526c354faf4359dc7a478dd5fd3d27f327e57fb2efae7aff4f83896f3c1261d812e9ae7349794b5835caae21baf0bb5cd53b40a0d2f2da4222467e2e31438c2aed97277ecec529fbb487b5da5d106eecab0ab856d29336b2c1fb1d4b48003cb245c1548c129be12b4a71b689c7a315c9c32a10ff5e6679d0a5b8018dde18b217e72f0475b5135a11062352e8842bbd5d12e0ec66176c7f4ffcc8c6e6c10551a1e1c9d3d3d2d3b3ca7a30cdb0b876da1cf2c924f17a60b6328bbfbf2a543c04046871f87aadc0f540190a9a42f117d4124087812267ea6abe3217a9dc9490ca1c957fdbce3a7c01ed1810db43e00d779c26046e0b43f816045d4d4aef0a8852b22d1323d8022114ae89d0ae51ef461af8aa304b79d56aa45cd77ef72dfbe000886caa001288e4930899d89ec9f83cc88a6869e7e7ca220f19af792ea7104b8690e8c2aea7cf8c860cd2f5acce672e1e208889dc172975cc575a9d3724fc2d92075bbf6337ef14be43ca648f7523da2544a4861776fcd0c4aa715786aaae79c467bd97785080fc817fcc586c7a27482973d54014a93ef3da843470fb0347bc9e8cdede180545ea9671a393006529736a24bad61446e8ff9a1474b65476c04f5947ae94a8d43cf861fbcaa894f9d3ec51f95d6151a1044bc1f8aeb090c593d0b7e57399d4956ac977b019fe077d291b78806d3d4a67df8b7fcdbcf25a4b040b56cff6c65e6ff4acf4cb081e78863ac0573218bff8625b3b4fef5e714fc8e6e7b7700153130e27c6a6a3581744c5de88538bb408b3ebaa2974913d2d4278475b394248179b0ac78831d90ec3792b2139de4d69b3844bb61e3103268ff6e308591d1ee5eeb122e672993a1f3c3d18a639c831b33a3d17ec804bac91589df0b545fde721e04261120ff8e9953845635d38fc6cda562d36dca09f412be04c337f792fd5dc2fbdc90d5e03af88fab2cc325598d4bb80e1099d8be1a507478935268f51b2be2fc8cfea130a72d0cdceacb7db274587d9070606e896fde04263180caa01f4cdcdaf5c5303c8d06f5eb6d525588aff6d8a39acb135f59b79ea8e1c5946e190a5382e4c544dbe066881b5e57cf225be4b9e182f87c34b34b88c535ad483e981f8dfaf98dcd3ddfcd33e20d7c4f8cd78c6b9bf7fb5efb663c88b6a8e25767407eeb56c5859c284de0c67e507022e2f6688c7886bc0649772bdcda1a2953f396d57528c78015ed3c246408947b348ea49ccb8326be6380a8395fa7220ad1f24c9dbcc1708e3d4c3b7ef36c6eff074feec4eb45317adcd0f94db203820aab3402d7bbab4001741e2419d87166b7308016bb05e968c783822e549ea739c0d8bdec0629e8a6180ec50514326b8e1c53872cf034ad11f9136d474c4a231218b88f7fd1ca29a3942558ca859b53b311ba1f60f36ddf0607042d8115819de7509889c85a55636b2e93742b4d6f35e9b58e5ade70ff195c8c86ba4110127627567ca80fdd452a54e2b3ba809e929e9aeadbc1c5cce766fd48b7a04f70b36417e80baf317a1906698975506155d484bca9d2b5b168006fdf53e4fc18f4ba4b073045b25765311a90b84d35d0fd6e7a744937ff7b5d661e754faaa261b98d85811bde5c1c5ee4d3147d6e66b6af4a3074e87c2408c6bfdd89c78a7181832bb5da0762814b2e93a35382692bcd7118d625c955f57a604e20857ae03f3e3fbf3a9b214c825528cf743240023c89820ba7d67bd5d8a44f86bf06d522deccb3bcdcde75ff915bfb5f669436f5c47365b99fd24a106fb1ba6ac4ff6541b1ae0a0f30d22699eaaaacdadb534986b87bf6180502d61b469d6f45b4c93789782e062e0b10528a92874e5915c657955f28d21274cc5e7ee840e75532743d6f2aadd27b795f0e3d22055a53460aa358e8a340389f56c68f5418c147d5ea8612dbe89cbf88a85ab66a88cdc750bc6b4daefc30114e594bb5781ad23aec4bb0c23edef2a7235498ae6dc2434361a1a791cee111c161808b40bba571b791716719b15bdc449373d6f4733221efc0f45dd7f733534146d98c00f5fa1264ec69a349212ec5e37d7fdf4097af98b7b5726b8515f9c466efad9df2a060904e00db2c8975abdcedcc4c3da9014795753615d79b62de1534b448cbd0b98af27d043e619f103b4c22769526d9af2b70e29514eb1eb9a13300961f7bbf7be07e50b0a16d5eeccb7b9dfc5601d8917e63513e07e18b278a1673c07c819a04b886177cb73f9fa76b15eec6de26e8b383044c5dc257972ec1f03a4943d54d2968da7ac10aba300c6fd7c87541152b5fc365abbe4521cb69766639ffa131090f2e1716f65bdfdc1a2cabb38d0df3739f5f34454638562d3a4352173806f055449aa426b4435bdc28dc62ddb0a7da28948944b1ea2f0ada05d94e92f5d868a290a416c397c82ed5315133e764b7cffc5693322630a854a3fac7816150e7993f49b0ad81f27be568f043e2a11c54f04b1194775e8a31d148368f19375ed564ca3e8b5b33e8860ff30bf12d4b575fdfd2cadb0e2acb096ecf50a41814bb0967eb0fe2905c3ffab6223a2aeee537d7339fea1db1ee5e45ff5d2c4f5bcadbe0a0ed5e58da223c5335cb6a113f62c72f60b5503d0a56a418d7e24a6fec4befee67c9ab6364e16808a7dc679d2b862a5c26e86c74482ca18f89c6458355a649bb3a90886e3b0ab79b354c13a2a51684de8559433dff6e53a234d9e0095827eb10049a8125a477cf8fc0c1070eb1491bf3bf8b787881c104bc19030975afca95e9567475498c003c6c09efde7128aeb2985567c9ccc52bccc6ed26425e704deec189ab1185fd52a125dda2f7475a584cfc57186544107715d27fb89b69514a218230fb5a87fd8747538cb0fd4cfc92682d90247bba4faed5ec872c90ef1f8cbaa950047b8b6d53a3e762fad4d75564d464ef0a2e684e43d63e7fdc0309431b6881771fcc032b30438c92a41fe4112be8923ec9080b270fd93ec0483e805137fa5f849111eae65f94d60f68cfc89cf006cd2033213747d0739641229063a4e9cb01ec47b88492f3469f66e11de40da0c2045bc6ff952e4ebfc130a186ec5b539f4e33a00ea4819ca5a9ae2027ec7a734e3ae9823a541750ee7d909a4c48ceff62844f12798c621478bd353fe04ac48a013acf20eeea8bd1b3c3f15ef59ba7563a5150c553652c7bd1e06571f72d8f9639cb1c6465052709aeb8213966dffe83d5fb4e4b978ed8b4d1b3aedb82c1e9db89cf2e8bf8092da318d85d97a7c58270b20fc4a2de71f9982501fc48599db76a52eb92935e392bfdfad1355e018647bb4b41a527a74c52e1895feb704069b61210697806f32fecdef802205a50a79601c9e8232dff0052d2d61ceb6775de81aaaaf015e04ced6ed1c97e8b1ae53cd716835c9d1f424a8dc6e03268f8b026e472b561ad500d02cd0cedc571eaa3ef1f040ff4becc0a554ed464aa283566d6293925303723fbe7b266799f9a2139f6a5f86a39368f3c2e126ed1d19ceee3c9c2f27dca5215a3a5758b5a5417241030f1537502aa426651adfe8d4f00f6867865e41c4c39367e4a242c2a254030bb03ead777eddbbd393472fe972e736761e8f8ae2b891a239359fca35b83302555289aca9a6b59c2544a3dfc896c98438464d7c123e503d50dd13b952badc182a59d085ec2af9c257dd8cbe8725aeab26a0712716989c5fd4ee5aeadc606a192085f263ae14f50bbb83c5c1d5689bf812f2c986e011085016f8ad71cae6a5c57efdbb47398b8a14207da32606979e898e1c96f6fc593760491e4a091019bf576b7ed07bd411ec641e4d3caf259bee758d144644f3e6e9a943da71402e3c6176f5ff7cc0b02974a84d9cbcc645009461f49c35424f115fa125d5e29403ce9be9441dd37343f05c6d8a8f56cbe59fcaedb96f3306e97491fa69291acdd5a80d016220010566a1ac1b59da677af3cbf33362ef681d259694614f842efc15065e6a50d93aaba93c1fb3eaa406c27132327707790070cf8a1405cedd80d5178c325f2f9061f4bd9dc501e42a1f43d92f1ff1d41eebcc18f26885e288a035fb0d8ebebaf32127caa264499f0bd22ba565033068d8654fb0030b28949dd0181be9e05ee28a9efe351ac06ddd854e0fd4a3c63730f99bb234f0a721004a9c443512fbcac416aeb704a96c70648bc54da1ea91e6022255b9a848979e27582844bc96fefc239e1ff72869ccf0adc1979e2797f82a495df90c078b49048fd73af50409f1c94657f36280b6dde3dbf442dcfbaed2749ccf82a624c4bc450405d6fff7e747e1fcffdac69cc3630bb258e9ec3a61574fef4128cfc848c11c7f852221cf91b344736890722d5ac2dd591861c020e2e951ae71b91538a6283e43cf0b0eeff658b4a7c8954b8436dabefdcd2cb6758aa485cc7eb9fb941e6fcb0a6273f23a4ea95b355c0ab035ff5e54230bd35ddbe9d6e074637ce90535871219a8c21062c6fe8827527011c02275794042e7dbc1f31d3e2494877c5f48f2aa6e42044d3272307519ead9acc7957ba030d2da91229d80dbfef18c77eddbe133e4b4fa54883df2167ca20d67d87951be187d96a8979f39d6f8e3b4c82ba1afb3dd308b4a8f75c5944732992908879bb84d98a108058903989b73cdf8ffdfcaad7ef2231cdfb5e46f7f53491c5373339fbd48bff4459f51545b70d1f4f486b5894bb9b8255fe609e2473009d70de4fa3276acb8fa28234bd3ec00e886127d3c9973ae11435d30e1b0bb0451eeca81a28f41333b84614e980af898533249b9aa75534129dc92c6736d5159e9ebfba6e5202e9b15315ddf09822eb4f229fec984d6b4b17aebdd31e789256fe4c7e1d8ad664f390879ba17501f0152863763df641544c7c74c09950c89ac08a02e837f28d69e7b147822f500a3b5d3e0cddc673e039f8754577e62336943aaf49380316923fbd7880837fa5a7fd3a2a41f83f2658e0998061dfca634ac3eef0e839a64df2e5fff05c41b1c43e8d022a5c142e48352e65a3d919d50cde624446043a89d714e2b1b6b472a423e9505e9de0edaa82e002c800c93b618b7fb91be4e9e95839855f0deb34e863f2e3772bcb01b96dbab0609955db9c1bfd9773b891cb154fa338f55316d7c1e4b358f071dc0123678930234fd289c8bcb4b97e2ffa53c1427388ac297025258b756aa53a103ab1dce7344c649c421b90c24693c06f97f224cca6a7007ad7a7241a4f242b766561f05b7112e31cc7b085e35db0135d40a13f1666ab114dd7cf807963c5d0cb3dcda3701208e6c0b4c309fabedc28b458e45d9329e678bfc8910c98b78a699a6a60dcb024743afc1737c8c0742cb9d737ea1a8ac4ba95d972a97bc855f6c95316f77c1be3bff036a50e1408ffc2cff7fc172aac49e13c9cc3e62cdd50330eaad62e72ca63fdd0bdf04956c9762f70b6c4ebe09cb4a036fce190c93844778e0232dde4ba061e97ad60e5d9d48cf14a936a42f5d90a82f44c80e451a60766691034a781d4d86fa0e90501a40c0065a1e793379f876d2575051da6da9c3fafd551309fdaf2bb851ecba63ae0b774c4b0c5079b7be7ae46fd7eae4b3e53a9534aeeb14da95c7b7ed54bc2715d811b3547952a41641c17788c54519519b86a86ab1c8ac8081822b75bdfdc6e99075e33b7e0b799faf2b0a6798324f2c202f69f40862593b66a6eaf6a46c2b9b879b509b4398f12e156bdcf138b2666c5cebd973f21249e5684c974489ce803d56b592babf0f46d031e1ff65ea02b33f10b035959aea39c588774a28743f8410deaab34e799e34b1d380ef43e221ab40513a246d9ef060a2c8a8ee733147f9291288e2a507a03a2767416d37e992ac8730d315b005609ca90395d11a44edf0bfe378001a6932655c7b0cedf47b166f456d462ad46523df05346a098a617c5519fd93ce8a02ac7aee9d2318f72793623d579f6d9f4542e6ff84e674f0c78d1192a784fef960161b7442ffcfb523a7acbb5ee5e9023bddcc8be8d7ac308a96516892cfef267be4fe8675deb5f48e7b0f25cb048088d61cbe7cc2bee32dce5deff28b1bbc52ad481bd4f07314853dad43f6090f53d9f5fcdb355f3a3093c51909cd617aa4558ea67cd2a59e83861892a6b7ddf0ca24cd9f3280ce56d65e509fdb25d7d7892cc423131f18e9f42e79b09d026eb946e34411020a129f3e51836f9dccdf9f15b21636cfb620f2b5422944d24fb589d498377c528b05e88d1f17922c69ff54e3dd1ae8787ddd5fa01fd52d8fcb3827bd529092c58c2c7ed0c28bc56fee8a7e97856dcc65d25ecef8e4881574b5dea26040cfb2490ec1990068882ad608c935c2e1e94bb481830af925c4f99a74880a8762a125f9285be843c4ebf84999513cfe0d9c7491c741e0069f613cfa10a23cf8db69e66f8ae46aee89795cd8b566f4073b2b37f52bca4579e00da3b42d03c71ebb0462e4756608e18d1d38c1d42e67e490c07532b9923f55d33ed87dbc2513421915d5907f18ddef17671c140ddf11a596791ccbd74c96bbd03f9ed597434f728274ef06bed38129e176b4a9825b9bb5c03e14f5176922f58ef8f84a3a6b575ade0a3b67a9de098f9a41bb93b3d4a1cb9088c81a7c811e8f409550bf329e418b5d5cfaa2ff001347e839b3e0bb9ea30c687999e36f3b7cc54e6ec2de021e78a1833d1cfb46619817a5ebe5483058adceb47ecb89d2a30a98fdd4ba5dc47ce290ac3335ee4371f3858a16c02653463c6642ea7752f9cbee4dcd4d1a6381cc957c3b10c5bc53e4506b8e474befd02e514830ef8c4b1975f64c413f514406a98f42d991505e12b567b4401f5d944d434fcc0d1cbe3c53a8d958214667c6104619d330ee8e1c1a8c10379f120d2cb1cab07e060e0361a48c66f5a794c141a3ca92c9afb255eb1d4e301047892fabcb8c60e051f3c240bbde9965bb9fb360078126581e0a9e98d77e5090421bea07b82477a22ba6b30eec3917ea049636e1149eb2223679a5a8a2dbfd7aced3064609b46b37b0db25898b361738f44886c486ec392feb5c6263c32344f6e6e008c3212cb99ea88bb703850f04e02870c00129291e84a37812cd8c0f0311a03b6e2d67230632b7a0db409a20b187c1212b7af95e6f6cc2df0bb64c4e2f8460400ebdd6e461d22c08cadd35378402355a291a8a55c1ab9e67deb50c541ea32348b626f7b29dd89390140b324e39b5d61891326c871688f51456eb677c86736a40e75a442cccd9b70033f224dd43c6162cd217960e350a43cc443f53221e50b4d3e6e5db1326da4f2b9a9e5ef89240fe3b9a1fe2d71249c5ed36bfa5746c4a3677c725533dff358363305ebc45c89682f68bb4ebb38765cb80dcad025daa8073c5a8232e50998de9a87b24b8d0e297bcde9625b3b023cc098b8ac3d7c30505272e1ee9c06db6864dc804dec00b39ea1b65c48dbb76ebcfe64d8be30be11eb5c67d25bddf07fced703ee5fa60f7568b2972b8172d629fb2bbc50d323156e9483f2f55cb2af2965a6403221d45c4c7452c372f437e046069a309593b3ed9de10ccce36ab6bd33d019b77e5d17c9f632bf4390a4db51f043c62ab0cae15bdd7ccf345cc8c6cc4ad4c225a02fe35be338bc8332460909cfbeb0f731d6ca873d04765f51ee11c0f1c6d09d1d166aa1312bd900ae4e58a9acc81f8c3618d1c73e6299887fd1753589f23e2ad6b987ab1e85d0cb5bf9fad4c71efc6f2056552beef494cee7cc8a8391bf35087e1f19a7a318c27508836f4ed57cc144e5ce7c5e1765bc0b5734dbe5b25ea3003308b863df36349445cc07b6d955d0b03db123b597183d8e429c463c2191af5974c2a327a383d59324df32502c0ae674eb489bb0f85ffa27cd03c51d0771f0292662a78c37ba782571c37dede63935bd87357d29a23f72882180f2765cadf7e650ef9ee7462ecf427e5de3578304406c846ea1450a9449e9017a5c2f8881a487fb9f50a741b092c88400d3f909a026b70920bd253d54bd6a13ddb6725c9c0a49c9d0c0eabd2a3bae4d48726dd5f78d2d4f8da4ae343f976a20c57690612579a84bdf244c70ece9605a050869ef88250e96e0d1b651447ed0b05ace5311aa4d9ea16e6051cce3910448aaa176c28b323bc84aeb7ee12d4103ed260713a13d6fe4f099d5d7c75fc8edd33989844f826f0c96cbcbd908cfcf4e50afbb4dc0ffa8965a87bd41ac97bd3370194e871f7c25e61d1cbadbfafc6ea9af8993af84bb11bb07c8c53a904661d759b00b6c2c35e42301a8c9e7266fb6bed8e449d6cf9e96809f7ee0a1d1248a37f7dc5f5a1c22f0292ba9cb5813618d2233ba60edcde041aa5740e9143177e7a80b294f3fb8ce2365b1fba46f7db5e0e0716f175a26834bbab9e65b081c932409fa31b7655adbc59a8761f23fd461b85298b597af60e55c8f8a74c5f6239460e65679959a46458f9a1d0eceafd9217a9059f8d02156621dad1675b5ca6a89334dd0eb00bba5a3a918ed0c99c83dc9eb28642a71406dbf1bd951ff0a5c68493997f705691318e361be28db8ef1760f4495573e046bfdacb177d8bba57080ce71fadbd56fa83a3548f48e369fbf0957f9cfeaefac252150146db31109b3bec386ce0ef85e923b6d0b65fe622b1fbe7888133665cd4f6f745b2d1e7937df6440117cc6bf4c92b59fb7fb186fa2bfe96e0bc08e02b8d553576d1e29740d81321af4ad1d19503cbac5e9a303239e0c96fa0e6d41bb94d86a88006f13a7abbb5b76aad09296c90fd33ca1814c9d50a76c4713656edf25f6a495167cb4e9f0289336cb6b696df2d78677f6f26c91010321efeb0b5e77e73bc6d449667f03a47bbc9b35ba8c190fb2f958f4305967999be859216354a1c47eefc73390c72921a708529514621c0b647381cb090b015b3a6953188a342bec16b22364e1724e4176dc95137ad43717b19cfd161e4b22d0842ae3239dd5232b24ded9fd0d1d84acdced0c7b41d5625552959611e5a930b637f0b1108a52ee1d920a87ddec2fc180d55adfe8146b5a22d9d60a2ec8a9de2fe8c1412e2cef3dd6602cf1da9ec5dd190ebff6efb0c2753bd6260191dde8b04cedb932ace8856c6ce1123da802f424b840953a420c89f71bc37f8f213a1b41f6570ba84ff344565667ab499bde75592c8f377934ff6df4a2c4d3685465475f5d19bbb0bf8c907c2b05a68b3aadf6722794b10844fc6d1a3d9398a04872fbbe9e8a9c2457bedf0793e8b9a6bd6210296676f48e289d88ee88b8a875692088bf8bbd5d20497c0dfdf3577bf93ed6b933293db90ceba7d59da45abcc97319ab5dd53e8d9355746edb5ef391678c900dd62eb77429144cf7ba788d81c98a476428b12273535689448dd8daa6589d04e196da8a60b931b8d2b61efe1a637d884a96ba67b716627fa09bafeae308b5aa700e4eb86a1aeb8b72f07c9035546aa6e5e6a7cd39a67c0a907d02459c2f2d3139f0d606cc41b77b52b51b09e375086a05a2b1fc92219c6d6f22d56193900d4524c96a15eb341b7a7a5f2a8c97a71761a62cdc8197c59a77743fad27e339aff9371dd02afa7497ccdaec03cb9dd2324f3195e0f5b7355d60731b4095efce2a854074b0b6136bcca0fbdd5d8d3afb86c34c402b73981be51f0a522ba9060032869228256e6689a70ded1644079dd165f6d43f516c3d58e20b91acea86af7ed4bc538c154f7875b2ecae03b9db0392119b2c5430d409239d4c130dfc4fa713b2a6ffc0cf33aca05767c062c67768428ee18206d1512f8fc5de4c426130defc0a3fd080be2caae2a9af6c471a0053a40d254abed0ba8c5d64397500a6b4aabc4ce534eea950c09f25ba4668e95f9760a0c3bb402ca5a7aa0b3ed10b7e62f97082722102652b3c2db324519b03c016fb6e6835d29ef813d1e1e19f855b72344b61afe04ed05ebfdc467bba2aadcb9d60cef71575e621fe984517acf85c480471fdd1b55a30be90248aa488c2785ea1ee7fe22a083e24ddff4c80d48341253600375f72f80e966001a3579fef16d33b667abe86547a59df6febfeb5566c7fb950a7db46abd26480c2fbcea41fe30e64a19ea97576684c9411acab0d11dea17be570630179aa4a510338f62d82d8d6d31b881c61fbda0e6ca8414a21b53f905618d47e63131cbf234e2a2a51fbfb3d7cc51baeaf81330a3b67ed6ff86fad2cf3cadb27aada5bfbb3bdb75092bc6eed0f31fea677f236d08319085c7e8d01d332b45c50eb8d8e64b0c3608277e86dc4abb5836025174081ad7c5b1f1b3ba352ff8d09a991defe931adb7b0d6063742c848c80f4bc91611094e268cc7649be95a223b6856edc05e30d3b8389930be65189a22d189191b338a24e4c11ac84a1b6304ed18c6953f8054c2b5e26dd0f68684d062b06ae7e1c5bd00c1b5a2b28066f187bfa0d1b7b2a42fb467d0047c4e889326a846f8e96333a22a6074afe04100ec5dd700c0df2128aa0e4bd7df719241d794a138f6d9cebb7cd959703451488e8e0cd07b02be9e000c4b484f9a29b0b18c7c79fdc6a9c3e0154ee9717344b7a00752f41cc80505d193dcb5d6a61b12b7dedddc3bb4eb7c0a79988f4ae33577da0ad11b8a33db4ad19516d2690beb015b3a0515e336ee552a800b605e0ea451ff382a57ee1c6964f93fe58bb9332b4423f48045cbf6cbd544408465177ea8068caab8014d4e531bbf19235c5a6d6d25c6371db453ca5a4816ed725dec9012b678d37be1b273ea55a5eec141fb4d0453d106a3e8d2767541ad1e6c697c3eb205571f37ceac7e1b90d399a8c9567091dc463dc232f74e752d71e1fe3c9ee22c084beec6c9c0141c07cbd3eef41da0e4981be88c6d230d8e380a450324e20bb052b8801a783a241e34494ecf2fc66a203c7ba4db2aaa15e708511975c9271f994f78e98c86c498548724eb21bd9e601c00a56ba45c51e0c4a554cf47a7c8a19440e07ab89706f9f5c0b8e0d30a4ab4100b80dc1d8e5c04615ed96d582c769a0e1b88c3ff3e7caac4e9d377489c24644e371d5176f6007085acab6f575710fff0dcf09bed0b0bc31546f073d56d102d3345ab7f89cc0f232ebd80a279ce3ef02cc94133d428a2cee016efb30fbafefe0552e7eda8e46f7f0f24c4e387e10ee0fa43d7818e870b600365596798013071bc4a5802e06aa87240ef6c19731edb252f6d812533f81322c08f13bca256ced7c968c6e63f7456a4b4879b642fe6fceb8bbbfde65e0c8358ed70c7ef5f3a3a540b34c75012e8eeedc4cc7b412d8f2424c1815fdf2386ba4013240845b08970ca06e0b61e2de1096375dba9b8e4f0ac8ecc199354fe37cd269d8dc038fb43b737c4712bc930b30505d05a7efc57efe2a3dbebb712eb66a5458413ac2714a7c0f261360bda749ac4a3f305332cb75961c3ee7f5c0cc0e99e9fd42c5470e5959fd9e287db6c95cd2ced1db06ac3de71b5899b7225c506cf17c51403a6652580143e63b08813a1e84ee9cbf590c69226589006528124980a50c4ec2362004d9aad05cfff3bade72004ff900ee1b49c0dd6bc52b90d08798274b0ec144df2d01dfc488772fd701a9ae9011d7fd7ad5f538358c1a2d452b473fcc8172023d3f8ba347c48f90ed2637231b6650dd77514ee031f0943a3c90add59907adcae2182dcbf2518d5f1bbd41818238a864cf9c70d0d63c3ddd86222cf410ac5fc9b3d3a3694ba032f649f8527ac823253c2193928788c21c31a6a3195bf1448eca1c54f7725c04670034117868aed0a87cc1a806803f15dc9b1b0be3a8f21672299b514bf559f8f282c27dda1d5498f3a39823f0ac8b9632bbf163944a4155701d1e2b61013999cac463c0faa74c2360ca9df26ec8a02b1a117bba02e41306c52cae6e90b5a561fe4d7d66c221c94442a2d3117f2a4d73994cb374348edc18d6d66b91b2415f3018175499ba6a2041102158964b5e529c103af0f6a189a7d169c92bbb08b4006c6d86593280df41d893030c1ade3f3511a55f996c00a1478030ea60593cb17bcb417b589d18776f49c660f1ee3cd94dffc2d4c3a8381a272cac82940091e5efb083e4b942b90c430d966cb0f05a746522b5827becf98b724b2b0fecaa72a042af4692ddc1a884b5ec80e1c3fd14c5f34929c98694e3ef3943552907d90e8c47913d89ab0914f9f2c2e5c059c410d40c3a30f170b969e1752bc5c2b6a8646014e45c85806a56c3c09c30f3386069917c69410009c957267f7f498e5cd88e4a5cbd4a2464ca3f8717f4c2db1ea3abc3609b6c4773ba65f0c4c7c77df42b4a35e66179b52fd97a13f5fa01c65f29a317820c6b183a9ec2558021bd7d4d8403ff8239b7791bee6e2c9051454d11fc2c6532cd973cfb0c60cc23c0f1801520aeed6bd94f109a72be6afc9225e656cedbc27492662503c71451c63fe71100eaddb63f4fe69be4e55b2dd661c1c1d7810e1d6a33ef60ca8ed8d10a0bce5ae0e685a6c216b962aac687815128ed6d353b511da6d722dc9bed419ccfeafea861248b46f83dd5fc6e4ffd5d24e1f99f0fdf19ab339d2bed9b9fde07929de34f096c3a8857e95fb14cacaed37b2aa986febf6d964769a3633b37cd661404576cf772639e1c5517ad0da147c5b83c371a1bb129344735feb8fee4a0e48e7246943551aeb21c85fc6237c255eb7928d3e1b282ce77898494bd62caff71c098d08112680fd2f5c41a6e455c541e2436d56f613221b2b1c023a7f88ea7ef335a5507e260b7a4ee1e1debd9f1fadb1fc194fc16360b4b808cd28aa53b5a78b314b53c051c0e9ad92ecdc8bf48ad8f61db13d27bf395c4809d7274b5fd987fada5ede07fa875f63729feb1168cb76caa687c2a3771bda6143af57da4dfe3205b205bd2dd04b977960d03117ae20ac2e6b93dd94a819c6ef19a41f257102bcbde036257d05ee450884f6929a0c8db55621d4513214a4d7f2c19dfec70cfa27fdfd7dbfffbafced8d8a61a25b1ff9314327bbd37afab976d3e7ed9cb908fee2c33f21d21166bf95f39afc7a7a6fbf30b04abcb8065d8f8f5f643d5e80cd0a581b6ff5b3e82e8d4c4b6f7d8a065f81eb23ae69078e4c46c40524c5c12fa1e0c5bb9c01b4806c3d9854898a5fa93067823a088d9813f4de91492826b557d2405f53fe4859963f76864131f3dca2af917215eac07cf82224eec45ff4e03ace03879952d921129521156459230d6d58222570e066aa62929dc3739da080d45be41694ae8522c5e043b365062e5efe3da39d8e0bdbed3108e533e629af25846989dfa0a8b5ae4cd012cdf1c2f8d56ec2bd52603370f146c7a591ff98cca777acb7ceb8d47e0c40645bed63b1f97bfbe7b86d35056b38fa00b0207d4f2849521c3879b7935ec887f5a3d23ecccdd721d95532a3e80f924e40ee36f98bce7f3fd052449cf81f29e6bc2990a5e9c38901d69a456ab45e4a0e0382e6d3ee83ba4188103a33b62cb014560a7be500b347143ba965b670ce60aab16aab3a319ca5e0278927355b224d315238e56b742c5e7b7194733663e298d0798f896d1ac7c15f53df53e47e374ebaa2be94aca9b81ea9b1034db84889310ffde8003f697244a518073d875fc77b4fdedb48cc3654e66f9ca48bc155a52d632d4c94c14b1383ed5a781db47818582e984ee3b725813d5bbc609ad217fe7493b1fc8a0090deb67d9b67da0ffffa6fc031399e2be29035eb721f9298004c4c05efcfc3d04b1f79abb23aaa05bcec24250d03c470c74e20923801e10215deeb93e0cc819c6a698cd04f92a84cb70561457681816ab64b8a0d1b94ee43ada447fa1fad3380565d40f553090be8e130c38530479435d5c21e71623a18fb1f6dfb603c1cee8942bc212c8f155622d4a513380ae526ace371c74bc639599c86e1fb69514056b548c2bfd01472be1b32f8d55145746137ec212cf35b5dd86b733185ed392020e408701db55e259fe459c6cfdb1785dcff245010cc8282b6a95ec61387df5ac4389aa06976aad34e80f46f84d359e5299dea960291d3d2cf5fa8ced9ff6d178d8a1fedd5b3855dcb3d7c76efc88ea2ab503af5cedaf3040ea8f230b97c14496f7fbe5a1336597b154d367ab063028b17ff52b020512e1b920f3041c72d8947006c914633f506f14cd231b60a24428844a420c3e92d233e63d98924b4933a31d253348c3be477d8cb1ddeb35a829e25444c86c5a086135b3e16b8bfb17c6404858f899f1ce1d067634b78e4e12160e8189788a0f9bdedcceb965ab52a88fdcd087634eef8893b910c48daa02b50e655aad6429d34536c6d843b9f43c972880f381916aac7331750558d1371d0978514519a25f5a7e3a9c203ef1ec3f75fcb45bf69ab30f06e6f250c1858769bc0c1c5b7888eeaa69e98a3c742f97d6ad90da4b96832fe3a1c764285fd755f0f73c465b6d489d62b26fd1516c2db65ef292128f85350b70857be437e1d9fc85501f19ddd1a3671a107244672575042f52c34fda088a779a641da7fa9c801a2948d2bcb7f6dabc88063e9f34792c227b6c405403464df0b706091599c20dde2bdbc730c745aad03409486c9df099da4cc11c3176e89f8b880d7fb22244f40e5c24c6763964bc399180b7b6d7c2e419f021fd4cea3930245b9f6773ecf78e647b102efa5c2a6220db6a66b823781a7e4d8f4f6dc56c0161fb3a579c1fce6d9bfd4ef4434ee6cdcd30a3ba097e468f5ac5a7f0102864e31aa8a98d1153c4f892fb39909b55510940c43dcc98828f2bd097caaa7b8f9cbcc70c88917041e64ee753a70b00909346764d88ae5932f9ef41af0a4a91af00ed60a61963c2503feb4b298e33680b7f752fd6b2989fcbb0fe4cd655e8e9a6043e1645cce28598d454d058f6b1719e434755ed730a1f5af865ccec639db24243b5bb0e0cc86338386519a7f2abe5b958004126f903b3cc3adfc18a0c5c326f4c9908d13fdc46e448b1f230aa889e9e54ef7cec56f271b9746b53c96b1ed2258a96db84958986c83ab80f25833113851abfbdd3aa4982f82069a010718dcb7e9c6a02432759e17bb76dd19ade07866e3fe7be251531357950ada085840391731bc7338c3340912cb441ee128c6eba3e2ec444f8499698692e626f5b3ebbaba3a123b8e065806ebc388153a5693fde82a823ba5a9ac802342cbc8c2a38ccfd64749750b0b4f560f4418b0234c8d63ed0ba121085311c0191f88b668f79f63b644323429e7f1b67112e52d1918452b04c41acf1a88973142dd24da4d767275c78551d5c4fdf07e8d10eac582f618b7a15b899cb02debd005df96ce5a379f895b3792b204b9d51dd34121cb0d410263aa3f86d8d0e470c6e9d473a75bad3dd8901d939781b72e7378094e1544572bdc50b7547cbed1b73b4ad10a5dcaa860501a74d5082e019bf78c8be41b8d3ec38dc8b23fb0b5870ff8c7e925e0ac8d10f8a782e5a7ce72fe99c2e2011df1365c51ec1bcad618cab67ccdc72ec6c81cd830a3f8856c7eac5a15be7ed1c1a41b2e89498a5f13a38d108c28c75ee5125670c39f2db485c8f168090e40872319437e09e423d7b2508b38506b5613f2112cff75c2d18e019f297189134853879051291dd96bdcaf29da9eb6791e55b05018e415e03d0cc3da1b83784cac16b75f69fe0d913c37ceea456710d668e23b616e3aea022f4d9359f4bd592ae83de73297116ef4f8f447af911f9ef201010a21a178c1fb956cf9e548b23d6d1e5e1f1482840d0bec8ecdec88f8342b483c566881395a5e8f357664e85a9766f6a1f92dae615d009f0b6bf92d1c584c8dbfbf08fc08db87f2bfdb7798bc2d1722b1e21701154b109f705175f245f52ac467de4d43f59309dd457582f0120f9d1b5c5e65b2cb6dc0e20a52bf9b043e9073c2030adaae3c64ff00ffb5ac16d2ea0332eab40ac9b19ffbe68b2fe816ec9bb6b0a89fb3f93364ee03354f8e6d1ae4acf9e0cc7b2e22d10a8243bae41d3fbcee19b4e7ca87f5a730b1d8f393e158b7cfb3ff6ca28ee70fb8ce0ffdb0d388c60fc9dcb1e8d8a96bf139231e95945f1d2bd94a498eed689894d9c293c88cc5f8044a16c0c7cb334624143beea6f74924eb8664c4bd49769a415564fc4c2cb3849604895099f12fdfea6156264e8fca1bd4fdb8ebb5de7bc990225cd7a269b9dd8ea299cb70abe2c93bc90b355b3c99b60a40364064ba4e6d9383e6780a07ad0a4ba123b01673ace8f4ab4dabdd85ec6caa2977e8087f626b59258edeba40937a00f43280acdb9fe28a2ae53361f41856a01628584e02cad10ac745fce64506398a7b4241035168c6d7918e4883c7a47c8b0f0ea48f0fe6ae1a74ebee8069516f40c66772952e2dee3807c07528b49544a5a0aac4166bbd48257d29b9c6151da45501e852bc0289946bf49b4bc0c5ff15092aa806096539133ed3e05fb763a1968334cb8d52de7de04d17b33c26147860822b033aefa7df99d18d9b1ad61d30b6d2dfd27eab4c20c5cde4c583320d562dc0c37e29a74d6dc2d2143829e5803adf99c410e0202eb38f82831339d6cbee8046c9ad0d4668ffc368f2f417c30db18e2507a937c014024eb930d82f74f8abe096fb84b2724abf59dd9632e4c6ce056790876120af347f03d6dc2ade35dd573e7e6f301e849990f80071abf5ce9e5d0a0d17338be01c581cf37cb758d6cf525b5dfe18382f48ea7fad37825abd0cbb61cef9374901945f48ac2087b13d6fd8b2702a528a3f64e69a9bb83abd9f162d1c2dabcfee73dab21668e8dde52bd2d376a6b8c8083db605d703814033722d3203cc4956250f1b09fd1f7f2dfd3b2627b2ddba7af8c61d6f3f71f7be3abd5e7082127ad300ef1750e382bd8ba25458671cf4314306420a7ff204aca42dffec34cb1e0d9c27cac6168d664ca651bbd68125ccbb19a86ab58c641130cbb967d33888959adc594fb00fb27d1044cb0b0a16477e36892223374ffe480697e50a47311e0888e0a5048b6b65e68788740d3168d7e5600400aceab072058e69f5d318d965cb2dbe84b24d660197ad2d94926dd5053a00908c655031876d5988dcc5b025c40390f2072bfe0d7ccc520290943b23e045c51a2a5201782d46901d1962f0829732b2978c5670d79d1280a7f5cee7756b45fbd7c55ab581f13902e6e2df1f9280b1eab4edbcf7e09ec2fe0476cad96437921374ff352554f8ec6a41f7d63548497cba38d4fdce8c25df524abe8c521203259eb51fc6b5b55356dc4115ebe09aa962fe78a699c005525cf33137b3d4409e85be537f67c13ef82697f1bfabfee76da875b47b3db89cce289cb791f6287f30807b54e4e83f642910d4f67aaa0b188069f7b6d781414ce6529a2fd7144fcb7e43769a7f2e67bb8f5ebea63ffb1413424c9c9e23971b177e6bc74e4260099611809a291aa797fbe2e34d125f5c1d51d934cf1d8f5f9e92bac338abc48181d8ff1983857b3ac2a50fe24d2997c0e096e8244e34a9692393d6d068650ab4ba3bd37a39f6b6c0c215f39353f82c70269202abec1a19164deeb2f03d4f0fa9d10abb01b8921d3e76f5c0a7d7e915fa3b9d8afad555ac0c94d7c7b4c094aa55cd1c633d869b5fdfe0f7cbb40d214d47c881865b4626088d2816fb9e838d60515dc88d09f299d83784735ca8338f1997eef4a0a0db1c081323080f6d3f99baa3564a56b2e701b64a0ee5bf8a7579eaf30a670a11fc79df565025608807f721282440179e282c21d5c40f05a3f89939655c25e387e179f7fcefe94c996c34c1ae5b4d435a6ad59000dfa508291a8a7b6a4e5032ecbd6a391ff5411ec93d09f0b6bedc40e97c4d53c16b682764e6a7aab058ae55cc9f5de1c1188e291abc7b61ce7246b758e4a8b00b0dc94ca1e6e685220b8202e00dc8bd42d995855a4d1a3c9a55e7ecc89aca9994c68a2650caf7fe19d0f50749879b95de07f15a3fd3b4f380f4be2abf5ce8f5e00aaaffbd312b770ac2c0a4445ea7e5bf509c8b70f9eb3778582c769866637c5e64cec57fa4444c06327415560e7356d86c4fba446f5c23b645d3671a5c65e27158c6cd8eaf23e7da6de8af49b0760b0c41540cd271d68c761861beb5f05a022a3e28cdedd6c7166d296b4c9eb224b5c67ad1ef5290f75467bcc62b72f51113b0d74f9ed7eb2270d476faeeb492352b1bafceed3a3820a82e1ab0b6863ab34401b5cc21c69fb8fcf70db0813356042be382b3c41328b0fc3eb23fb4051f9401b0452ffe439dcbecd929058d1e6bd5e74c86f50ac0cf1a6eddf3098fef1d09f95d755abe75e83595c11f18143db2fb265aa4681f4707027c671a04ead6c016cfef1a3a98841b6ff48f4de90383a2aa2b2bb077f95bb300dc08ac725c7b4bccf7045ab535f98884350920cf84ec6d54aaee5005aea38cdef9c268af504549695f9484e65c89931cb47e2dd54fd21f948f4da250ea66e6a45eddaa64b84586467dbb5b2b6dbcd7e5bbf8b30f0fbb308f6c62c5d7ab9672a00e4c84ef292087a83de48ad29048353ada8449e7e3e80b4ba7186737b8e8d379b13944a1ee80fc27147ab509d2e79a455bf7fe6132fae14cff4af994a53a8dc93608a24b608edb8a5561047cef37643486c1d4bdbc495ef58175013146f893cdf94b756446e0a7906aa09c8330a09853f71be04c8cde8f6e715673ad18492222aba28c65a10a4e862b8fc998d37663e9522eb07211d2ee7807ab8f4fd89cc182fa98b0c6fb87e35da6b6af8dc9899c32e9417d332473a85c526a790be20189c2760e76ab79a6bb199a088fb82406415eac19f9bd9cdce712d4eeb6f8e2b0cdf9b44b817672729b4edabbaff34bc020fd03579effd6225b88b6323e43b8b22978cdba79169bf008ba0140a16c3eab599ca5358a678821731053fc5b9d7c45a38bdc6959ae270dd8dc09f2d28299131cbb347d37f38dd3507eaad2d7e8079c4cc89120736f5181d16a1c9066735164db6044b6882de0ff4070486dbcc3f9fdc3ce70fef4551b9f2205036beb8b1dfe3a7031cd94fdda66417410269687303fff3e8ca12ce50ae31bbcfaac92f391c157953471d537a0fab81280c61290e4130184d8e612ee609ea477ecdd055b80c9136d9de5da9e04153b5a5c044969c9610e5ee84bd48f735994f1b51a7366a5d3a649337337f14ef5d6779887e4f4909531673ee038b479832c22b145100b14e8710364bb6a15b5e0f55ba3f13b70fc19b572ccd89328d8f0f7477c327cd4a8dbcb784929be789bf425f8afbc2b89b44982d71301f39151dc7101bde94b13526f439fcfae20709a3d49624e81cc16ed487921fb6ec0228473aae5af9bdf2a997da9d705bb57bb3483f50386123dc809c33b5b5589a5af02f6c53ae3b5f5deec43a1a5385fb9409f26a69f65cecee7c790810b6da4066c9da9a33ed40f1dba7951b1a6bff9cb6bf5bb19227bfb727022f65a0046366385f278c88b30efb514bb6c2d4064b5e7df8124a1de99d8d94951fa4781c377892c7e0cb596e2af1fec729f713e6171970373a0fe8b2a07cc15a95e70fbcfa8a924a05889709be1743dbc89d445997b71af710fef22f122141aaa5c4fc9cdd219f74bd6cab9ed95eee4e68afb19765c67235100fb59cb6faa7e71d1595158b3f06d166dab9167b519f7dcd18c75ff4b123308040a9e71bf128a55a4b6dadaac9bd1765a705e404c0bb25a7ad42df4488adedd9c2102264c9d1fb3e99e54428a89816b90deb51fc42aae52328dfbbb0a3a23232af757f3fa981a43d3de05d0c0d3b367e7476c422979cedb0948143e61327fbdae48baeeddf9817c440231ccf7f94b5113c783a9a6100e120ade1474b286b25233dccac40e96763493e6abc38fd1b199bf21ed191655fae7e881c5d01b96e1439dd2eed9eb44d78d908b4534750840d7e0552a775fd9d3cda3603b1e46e1b863c9c257b3b1cd6491390e5a2bbe9e488e18f83556d01f658e1f359c6849ea1a9b2c21bae829243392fa52e4c355c0d9065a978e49d521e93869efae57d11972c26195798a9f1e96abc7a87ca3482a78d9a9d328bb51ef9fb24004d2844904de246916810db876d3757baea0774be0905a13726235135195461a13af57b7b9ff6b2f85ce18aa9a37eb27a54a20039f931f7c3c4ca928119e5c21efbe0ace3d19216a8706e1d6d180ae169a3c24e4ed1d3fc2236e207aef5bf611cfc79910d482451a83b5c4c74c8ddc8cde3299c37d089ab0cd86ccaa4fa214d15102245b5e81e202044358dc06b2344b7bac05ba3588d14635353e59c6a7c4be1209b282405a62c0dbf36053a4883ad704f2db3ed103782dc4cddc0da565de13c490fa190ecfddf623854fe84e668e9fb757345b448b2db6eec6d337a0689005063dc89754c1c937f88fa3fd2db0f1836efabb297bb66b48bdfb74f59710ab34599e151632fd4d1ef68243c488c27c49b42ecf346f33b7d05f6d79633d3264add091a1ff9cf8e5313581b582353b5737730a2652ee49a83609052d4a36ca30a70f4cd457049dc13a677ec7ceb03fcc93d2a0cd480a247c5967d9b3a22be882ef0a2d2c5efb1b061a51e3850ed127c442bb93e3e9e4baafa2298a70049f41b668b93ff5e711dd21f7f4f9c24d6db84fdf29e6dd22822a3881f68c1dcb00da4b64433183997accf134a66b2c63b04e9e52cf576a8fe9109644d4cab14ed0d60812058503a09953b25773579355e17f03e7a5708f2e0b968c980f033cd3c828987468f84d8a09046a74fe3d6c8e5449837c47917b9d3419bed6de4290841aea7bbdfb70718e6131914e7e62e5ab065f78968c44a06162595321c1ae3692642ef7acb2030b52d6571a7d3f8f0399ac2f13cd4018ac9c780b93b1e8fd24493ed16948847c92c681e34a0bd34ed41baedcd00b35ccad2efe797bb1eb2df05fb3a8a8a746c4a6d38b3209407d1c0a19bed56d1d1d3b93bc8fcb88c6f4a3ecfa43dc7c6686ccac0a585531f42af400feb2542b989bdf276bf27f0efd69e5773385661e6046efeb0e671f581a994ca74a7053b003845990e4dafac24d31ced919b28184b247a4c17f89cf798433596b81b380c9d52fa5cade950909461672d1488a733bf64c1114c65914dd1d60b28ef9536dd78482b9837a31fab3e3a0543897c7632cdf5ba266c70a7859a314e2d76729b33705f9b63bd581531d493c8d9bfe63caa589d5953c1cfb197ef4f648bf228fe70111921330aed6abc7ce0955a0eed505735b3abf2361d3c18905c80a28e8ea256b65e0157d0e35431c312266739b56bf501192c73d54bf3979836562ff2c0d230882996a5b2bc037d4c0b13846b13f68a003a5968491275ac270e048f9de9c614fff66d3b27cbc7b373880cc8dfaaee65d0fcc4e0856460cbd316763e78cb5eb26c48d341d8e66b9cbfac30297690fd1602f61c6d887b0e0d047c0e6558a295dc6217d82d131c9cf100abc7ed6a5f773471e2b0e44886c533d2468d3636c0729745f463735a9674352c01d8610c34c905b1a9bc2377e65c0a7f7379e5559a5227849a82472dabd997aa1799ca10e60dc0a334ced2700e22688456171c92c83def194293ec651eb5ca7fe504b842155cc0a4c96a4701f694c2bf31913e61797058068cd89bfcd92b01c3247f9e6e14c855ac390be838dc13552b2d7ff664e457595cd5c375d0a951d1fbbd56c3aaab317e8b89e8acebec4a047b8e002bebbe514b3b35c99c105b75cef2a1f0cb7ec64327c5321ad8a27e65b116d8482a0f28efc41e0c1184cb24cae00548e4c2b390c8854ec0495665dbdb3165abb1c98ce30e018be0f70bab4efaa590070a17e3116873518eecf0e565fd2543f9c4f7602a038d4484323cac5e2c985b1d2fe0369b228d454b1e48c1402b93cd5276e20449d4930634edc43883aa5418af20cb0bc4c1a9a3021f9a160ca6f95ecb23c95e28ecc962e134a845c7c015d919d2f1be249cf35615943a64c0eb841da8c7bc97456fe125e5383988a3b1613aee4a0c0fecc379ed2ab36bec83d5bf506b42b764c263208c1d190e64cec73dcadcab74363d3e55594546d3c4ce80349e650559a95a4ac872a8ae1d7d4b941cc0bcd8e3911ed3c463aee6e08915914562274850e762d14e839c15a24d0f22584dd7065a471b09fc012a5f88db1a8fc64154fcf6f2c0a5a21e28d336fb94cd4430037fa515522e3ab880208ebf3c28ca5abf1111d674ad3acf741e18dd0155f7b6dd151f20389b6692881bd7f651d6db1e47a91a801e01af2a4bd7e607a3815e19f7d3913c3f13967a7a94f0d8d6771a42fa3927145192111969ea8eb0a08e5cf81acf09d3c748c85201c2423ad4ac5761a885b221d3dc3d3c268548d318012f5062e0c7f2fe9bba66416a6e8b54d89443b2d5b19d8da814a3c317594fe90bc32a90503447d97e2bcdc249b54ff24f3f9c22db59823146098e402ef5e25eee64d7bd7e1ea190515ec222cfa22686160ee37c052d79fb5db7a7c73ceca70ba7c57b9ff9df2f916cdb27326e8b4d830260e4143b3b2464f96aa5697c4c22ce78b685f7eedb6e35d5c61645f993891846192c855baf1f27a17d1654cab6f0cdf5a92c42e94717057d590aadcce33d70adce701b4a85a8855a9ea43d9ab13ac64ac0f02ac2be9d2454ef3e0c0b388a0505eb5bece0340f6b5f99462c20098315c4c4f0b359ce20142dfd0a8f52a4b28d6385f6408bec024fda35c3e6222c1c21119029e689b8b120eaf31cd5db975e214287b1c0d77d6b14d87dcccb2add383ba2ef9c9db10cd1c7e6205c424d183d06e8d0815e708ecee1a0a57a883a2f11c59b2fa46f07006b2eac16c0424cc7ed99259a3f02a49d217e1c2923a3dfdb49974964979427210f63cb5c187742201feec3c552e02f3ba753ac5657eace354f08725688e2cd6fe08a29f9cff35ce91d77b9a6569f4c57ba99178b90e78639e809fa9ffb8468e2dc8781b2ee9783e79b2e90e69fddb1d26041926d9b6bf701230477f00555c85febb3204aebf09154ae221683bdfeca112f270f15f8a446179591f61f37e0ae23b9f6cf0d80d9ae3b30755ffb73e384593215b874570f1bb53fe6fe5de38255ec08aa23aa025a91045e8f0dffc70498e7427882a1b268a2598cc5239322ca469c44008b39cff9dbfe04ea4c05f4071eb34d6acea10c0543f953dceb5ee6b3bd5fa71f4efa256859e3f414f6c98455e43a8ef8f5689096043acd19b0c32aae369fee88a203eaa869d72578a3b26a21c910234493ea5d1f8fa6e90bb374e7b85634201aae0451d462caa17009f1509a057ae60c772601f82ff5d3c02e54da05a93ec09a6b2889bc38f543503ac9e173212121dcf3484d0ad4e40b2d1a5ba290806aff3653e2ad27aa47aa3df12d5432915994349f69bcbb6a9d608f35bbba38fee8af081763bf22ca45d4130c32a8c80aea4405f43f4f59e03437fd2a8770a122ad00e0eb49e31500a71d507e98711475c02216e5e37076acdc216a98746e7ca6eb12d1f19e741124efa4aa501601e8811a94636b1313df1166cae179fd12fe69e62182f80b3c14dd0beb731589ed532341a1cb8a355931aa65ac9c3e13dc9e34111716f19c0e69d2867216d9841b5ead5e1fa742721d437c26cda8aef364e7295e4a9a6123424ee6527fe166a14aa8dca3c9c4f95b3998b3a49b99f66d50109f9b244e9762f2084f4d7bf24ecdef7e1f1b726a72376a3f4ef58c8e745683065e1d0bab5f401ef311b701ec01a40a031adbe9615d3052325207693177d5b624c9ace738100869c0fb925a8154d2415847acecd17903a6bf52e4750042c726cc718e0e2062568b8261b8000431c68c55373ee4daad9f7b800f7ed4ec2bf7c3609355473d1146c41742f6de7b4b29a59449cafe05f305270639a8340885be1cb9408efa1de6a1d0d3061da7ff7d356d40fe6c0dd0ffbe096b4b2a4d5637b6a4e233dbdea21d8fef29e8258cc159c4431ef99d20af98f98b40316f600667de7298b7bcd53295423f5f15dcc077eaac9049ac51c4f6229e9a2a17f3df1d12162d5831dc21ba106e59a5940b9029c7419efc7968c27dbc05f3425c5ebf909787f9d2a6526663082d04ca7c21fa5d5e08ccbf3c0d7d14f4bb3c0a30fff2f3a3a1e003f4bbfc0ffd2e3f41297bfe7c584acc4387e119107d71ceb2f63179eb89a43057744b859dc5dc58582fd4f12d4ad9b843e948473ae66dcbd85bde1a432ed31384a0a0209f1a445395ee9c99c29131a23dc109933645489b69c43cf9a4229b49c4cc946ca0c51974e3c3437762a65288800ca7dfc0add8ae65cf94646248b32664ce1812ff264514c9cb4b398269b144a2697106ed4993277f39693287d2f89aa201d280b4293361d2c67720233003141d8c1993c34c2e63f298c97f3c947968c5431f439efc47a0b8c180627e018334e838bcf3e04da68fbf66103b68266d1c260763489b221c09ac06186cd2640934de7f4a215333a5492bd16a5e2cd1006bc09aa7aa1a30c80baa9aaf090a9ae12226a8608932aa9973ce49452460f9711b6943751ccfbfb3829e3d9f3f481fa794967449843174f568c4a0c5525e0dd99352dc2a958e90499860a92bede05bf1a9b5d5e4db6b80f4b0ce971874ce94f6b844585cc1f223d45732d9f662032d4e99cca9ee2670b1c1d85b66add49bbf6503eddaaee99715912991363d5a9459382031a0017963b388712dd689c5dce3388f721ce5a4cddb23e48df92824643256e71e12188fc3a10b1072f154f5a1a72ecbcd96ed412c164041aa202effc2dc8115245041b1dfd1a8d828151666144392523f1acd6fe887ba8ee675b4afa36dde0e41de8ccdd5fc7d9bb7812190a1697e5343e6e8efe55f5e462f2490028d9ef42f2f1ff3421ad16adf8db450e8be5eb017ecbe3e98480413c144b04ff4e27d7da2cba6e39b97bd50f7dfeb3857f3766f94cfebeeebc2eeebbe6e14bbf9dc683496cc1814887a91e334489b94d7e03c9ef378d6da90f3d8f083edfd5f96b0bd9b209ef28b36f945110f0feb82dea23cb5569a81b00ef4cec98f923fa948801b5b26b19d8b9a1c3af286bffc1979034486feb28815096405bf991f273be9494ba50815bb8b616959db7e721cdbc7221ed38929a259b095048c319e3be7eee3dea3a6997fcb5f75481b7fcf76974eb04706757474cc58066243760059a27df8a7e0afe3df83524aef9c79db728f0bc86783680485eea93d94ba7b16b97f18678c33c6b86464c4f2ffffffffbe49d838303cd053357f7e3031e8698bac6aadf4e3412b0dd5061380f853405dcdd2134eec8964826e02d2a4933aa5b487d548da389e9bcbf71d76ab451ece37685f1f7af21a4de9510a0e03c9300d327565dfd7bf62e000d5f0aac4830c87fb9ee8b58579e9401718f0fa70a0185a89a1950b124c424fbfbb1ec537c4bd8e4f183607ba6c2013176aea76c6b7b6c5509036856af414020ac942317ae2f1a1a99012f2e4a1267ca4f09123121b26045093da2843b2fd03432b7a9a9d7b47843edb98d960428b482ccf33476344d388a2bccc80c91c496ac91cd84c6d460c00403562356435acf80d0b2de4ddbd7f8d5908a3cc018038828550850d5b14d5b8b2fd6b4ca9f103801dfc94ed3fa30879639d48d95a8ad8fe241c644a34c43cf91bc1c316254162915e222144af0124a1c5118cf59a8144dec08c33583227c35c3123c9f6d73265fbcfc4640e7e124be66c30bff9a48c62211313d17726263c5925eabad81649ff3d016a5a9ccf855e8776a610a80217dbde9f20ab888191cf03dde9b7a308cfd6aa24004500a1a5044253239afbb8efb0273289a2f8c9452f0fa3789e120d8a60a2d708266d569a348291449fc44d10915a304e0433c25c216f44302da2d70c3923c90c2472660a894562491b237a1bc144afbf18ac3312abc492363436066762d2867b85469963ed10db9f7b0d795997b471273ee2db2186bcb4b1609d8d308616492c126b3b894562d998b940e16eadb5d65a6badb5b6565babb5dbb66d395b6badcd39676badb536677cb72c3f8ee3b80f4c2114147a19457cf4d07196ed7886b1cbc4d2bf6bce36b6bd9aaec53db8273f7e0a6410e3d975e1d90dc2b3fbf3310ffd6bbd413485310bcf6bba5692e0191e710dcf30cdd6fc660b9ed91abee2788667d6e65c63b3990ccb7ae88bd5f4c939833e6849730d45f5e005cd5bde72ce79c31bde72ce79c3db26b72de76c6dce395bf9edc8afe33a743e3e340da487f55e4cf1f7d01dcfdb199368fadeef009939f22a476e09c81c1fc815b82ffbcf51ec90f2de7b71a514bf9d98524a29a6b6ab9fad4f4da14d29a5f4dea79b10d2851d2072bcae0ecacb0fda7efd5a4b25d4113a983bd06829f8d41468aa565aa58966d0a2a4956416dfb2c2913974023429692e84a1c552a954aab5a6e0f2813bfdd28f74a075400c4e3048109af9ef81414220cdfcecee9de9e26ecb79cb5bce5bee9494b20c3a29e93451fa939a686cf8a0e9cf9f94deeb5e9db3fac81a0aebe3b1acb56ea7bc11ebd3d8979b624b4a62021bec20032a98d04082f1c5e803145b58118413242c5858800297163c3c146822082b341d6a28830995e37c587fa83bfdfa97d27dbf821b53da938db058a49452a2e82ae71c0b513024d0f36bad3c644c676475def44c72d3792fc6b6f3bcd649e7a4f35a2c6995ec2a273ad3e7b6a462c4caa65275719db3ce59e7acf98f48593d8e27a694730420d49c006aa2899f52ad0664e59e47299d3470a05802f2e47fe5ca2569a1c5c7e00f3d830652a3a1f284165b528102884d3f1e19a4a13f69b0e7cf9e26bb61946851d680c899813d79a004902db4f8b424f1bd78ce5903b245f1f1b0562aa33355b69af0bdff8ffbffcf6d195ffba2278997e8235a26874077cd9c755a5c6bad359760022dca9aed3e8072006abe9a1b35d4877ef14057e98eabb43113119820cc273e383825fbc4da27ee3686d0f8f3e328a1c7e8881671688d310e8e748c29258d44a31baae3f0123c87e1ec8b9cff51ee212a0cc3102655f4c90b7b52c671dfbcbe0099e303efc92b3cf4e499a6ea0620aa0852bd20c74802883054a11a542fcc2354a117650c25e5072dcaf1c9cb9524690599aa907ed1a3f0bd07cafb9487ae3cec5ea4ab94c77efb76ccce4433f5bb88fe0514e2bde88790efb54abf54694d4f795cd9508116e90aa44556df7bbf022af2bdb783d29cb5f6189d6daf43c5e9a2b4dd7dde0972502255f3cb201d9d68d193d028574899397ca544741ffaedb073529887f495c47b5253e53f33859e3f1e26113d0905668b9e4efbc5891627d09432611efa4fd0e399401efef9a22f0adbc1007d8d51404aefdda8f7022433e546d1b79463321c59ad562b9aca7995577995b3ae9141d32de69c39849ba919c32aafb81a19b4ad91417b8d0c7a6e31c73ccfcb5e9639730e59e5551e418d3cf9d7e001d4ae0d6b0e19c0165aaca9bfdd1a9489013a53470925acaad062cdf6afa12182cd8b384a983313666a0e2941e1b2c44ace80262f207736566bc5c3597c2fbe5d776ff75dee72db6ab5857ee9208056f019ad4084c673d393e338d26884da416270d0dc8f8ed0a2049a337c45aa62402ecca009346ba56d2249a2082c5c2b9518ce201dd1a2044a85a181ece06278f406fea03d590f99d30179f22f955c5caaab0b5102bd0469b9800d747f6934a0c2f6dcd39cb0bdf71e28c2b0377b4227ebf69886084d1bc081b20049f2d6715cc76d1bc76d1ff729f1d1afd00fa37184c55aeb53adcb65b758ad7dd19a4df34b8a43206389556259608fb050b6ffc8099adfd4df68aa64a97065d0baec68a9a8956e96e6a187e1bfcb25f7065ad748077c5fb268d1ba682a5b57c9ba00b0ab8c8816adcbe5728d5b13742502b5e8c125fa47f4faa74a7c2f77cffde67ddfffbf95ae564f140a856a0d5998140f633f320fadccae3c2e238a6e35827971d1a2900b34350261727ed1daa554d2ff4141a62474a6a75a08f2101a906c19ffbcc1e1e4fcdef7795dd77df7e4e582e7dc0a0e20a5960818395151385bb246852ba8e0a15b93aa9ae60e1f0254754194163d7f8649063ddfa250a82c6ccc22b1f24c44bc1d3676a034da6ab55aad56cb5b396bfd7fbff396b7bce52d1a96c23044914005ac2654415e2081890aac50e97f219c72031c5450b81771b6931ea85e1805db9736d29364b66e243d0c0c284ed20b49e63d1289f4544592f9b67f1d8f3149d5e8c524765b9b58b05fc8e712d1752393548d6246a351cce8a96a341a9146a398a7aa18d2e8c567940079b17d7e120504a50525934152a677576b9d4cbcff613f53d625d383a1e78b25397e53648e1ef3fbf9645f4ce6783f56216d9c03c5cfcaf6ff64dfcf179b39be29f2867f319054681b83630d8ff4540bd568aa93d8d66ea8e6daa21dc7d48de2960a4b454dcd16433520d22603f2e46ffd01aeeac01d3cca9176128ff4e48fc731040a1a6bf85e7c2fa5f776e34802f2010e0e0e0ec5c1c1995bb43d1907c4c1c1b9257baf9d73562ca67071d921f48d3535b3a646e6d0a7518346103aefc83e4fb0f0efb30e74186544013a0f4df9f098c3a8bf324bb7e60b640caac89729da85271e72df6d5b7e3c5af070050fbddbd3c76ff0f8c453dee327ff2ae40f0a753a994c33332e2e40de7a814d29278c8a88d0e21cb7cc1cdc344dd133e3fb359546107aca79637b1d474d9f3ec7d115eac2677eadb556d408a8191e5c8cb3873d5fc6bd1763db79b59248ab4e87871eeb21d61200162af13729072de78dfa9d87f2c675de17023f14ca0bc3ee9f2b9542336b6dd6343308245c40aa09a56502984afc91142d8642339ad2e1a1d9bc6149704287ae8466215a141a7f68160a856837a8a3748b210c1b08045c95411c9add9c730643169c6d175528e59d046bb7e0db037ab7a0f7dcd1c34390011e8e9ac854f140992fc918128320222af93920843d41396fdc9b7368169a91c6ef08574d065b66b09af1e1e383a6729ecd5c32d95e6fe00f3ff9e723f4cc59e684baaebb0f98e5d9f6ed60c17e0b795f1286d09b0f1284d0e25cedd47ef878693082d0fb954e9a25206ff85f5314dbf7a40ffa50428baf80ffdf388e9b5c4f192f2f8f628e6043801bdbbfcb1eb47910e741b57a90932173241d22533b9486ed056bbbb459803cd1641361141e85cc91d34433bd1663801bf1bda048c19d39863cf90fc934202905fd0a2eec00c939db7a6f2b28e8e5e58da0bbb702992ea3a3444f5034db342788667bbe6886c53780131a86189600618c2858f440441720f8c1902a5a7c51a489162a989a174f64f16305184838913501230748acb89841e5ffff8fb10e500a6c9db981961bb43d1ed24ae79ca552ac3561bed033063deb159fd2aa542a95acb52514d8160e8d26a104fa53e3143b3c21810f230d06188801c492297cd0e28a142a7f148ebdd7a25062f4f0e941dd6949da03e0d870c864329963eb1f8f4c832fb6b29752b6006973a54dc807ba6644a98f6de17c6fbef9de7cf185c97a70394c19b1a0668840571b61a5a6528d0fb6cd676e31cc7675b7c94d2838d080a50ab281f885cf07d5f6307034aaa88270a0a4a703d8ed4610ae595a0dd770ed074d770a999eeaf740c1d2ac145d6c167cb3e05bb434ac45da34b145b4959accc12f716d33d9be7aa1453cbbe2ab15b6e226f0bc6a0375e8f4a05fc674b6d123a265f28723b827f327c8d987cea7ae3a0eac5c2d4d12a2e8104ab6a2068083d78a71758cb10b2ff9a188124564560090b30f8ae6075d6529b77aa66ff1937b1637c91c5ec515d2c65f0c61cb79cc4f3f6de5f4f922ca7b9186f7620d13bc973b44f323f41f13d14b9d1ef424c5f60ff1649508f4414fde9ba62a44f3c39305b954ac5851bd808d5041b9efe974208e8f403840c040903973038d596aee592e25428b3e6e1103614b2b3944d9d43d8be8351fa5cd148ddf6ef1b36c1a41e86aaded712919c7ec1225b1d1c2dcf469e6772f55a1ef1e859010d18b40219d88b33d4702e40ce374261a1fded3d0a0d0cd9587413cf42f12c231d1e4ff5eaa3c134d06691ed07de851f8defbc01e29d0938352f5e244fb8b389b6f2c10494a25a52924be58a2882c4a54e0854a0334e0c0e48a2f9e3c91c1bf9bdf8ebc7978244fec8828b60d0f77f8e0e1e111b30f1d7a7aa23dcb9e3225b14c810410141c60314209d5fc924c491d70b14a62072d56662d5091b660420921ca606141453597206309d0163aac7e604435bffebda00ed78239ef3522c3923982673e9b4d9c03eec13dbf6d1b49e650fc6e1a51e137409826731c3f0ab57150e6295d174dd1d0ad7b14b8f74021a010285748fe4daa28e8628416f10ccffce65af17089ce8fbf9b14c457f02c3f7e29dea0ebe2233341d05512d1433acf6f5ee8ec5cb684fe0bfdf75c6811b585f8a3424f33ff07cd045108819fb5b6561e26940bb4f81ffae83c10ec329e93e68df6b8a46c4f6c0ca16b6a027093318e49b72de38dab95e36ae57a5c526a6ae408c67167671c7fe5795e08b5710664ea817c3f93572cfdd6bd9bb77d14e9de7b0fecc0d72147f976d480df76e3b82de79c77b830b64933b7238010420fdaa2076d33d4799f94d7274d3a9073e137f029a2b8d7e26da3dbf6dcf6f4f3ba8d524a73deb82de76d0b6171eda044d39cb52e95fe293de2a3c37f7e3a1d728f9868717e2efb3c57fe14e8c989d84ef2ec61ae6032a1cd15abb5e2b1d6ea68815e3dcd8fa7a120d8fdd318c19224ae95aa03834011a99199aafb0d8c36930e14f2f4e42b6a64a6fadefb509b0b10a5a3d6fa1171ed40bf445fd2cf2394a1631a091f6fe579dea42981b65bf4be19cc1c72de9041e6f830a7915982816ec1f609c45ce91bb6ebb0fd4751e898afec1654c48062a5cad967685d3d1efecb16bd9a37feebadf55a6b75ac9ba14e5a27a594667d8dbcac5c823063b1582c16f3c9f93f0c51a8d116bfc6621e933127aa699fde7b572699f229d29538d9d8cc17fa825336a578e8311c9c982bf682b97c4e1031b1a50344b3fcb2eaa4c0af20b67fe7b3b2d582a33a0a4797c743bf366cffd14c195ab4612cb4313bb3341bb3b219830ec310bf5c70001800a106d50b9309263590b5e98396555849b6e8c92aac21db96558e046d59e5486dcba7ed6fcb2a47aafc9616880168cb2a318c3270065a561902dbe2c3a06595213ebb0a11d6965588acb46c5965050320ee5a04e48563fcc993bffc648d08bbae8c903953c4b4e69c739a6297e6def9f2940c6394948a1878642dcbeb4ab8c5f9c2c137e27ca242165bf40a9044f682d13d9f07dd33a439cb50d6644dd6646d2a8142fb4b050f81bc60356a555630d8aee56e1867bce1edf6b8b4888771dcd919474a69ceab5a79bc2ca14539fa0d0678644eaa8479f2fff112c612e8bcc55a018bef74f79d1b5e41c438d1b685b344d3afb44afbf22bc220e5c00ee1d9eb2c8cc26074aa808a625ffe0270629fd80ca93e2e3117247cf5cea3e716b5afb6fc982bd9aece59572b97d8125b24d1b242460d7ab22c91c2d481426fd2a6053ad393e76da394629dbcc4eaa083cc99ff03319e98610558585554d2891eac50a20452c08acc308974368ba4b5a0c9055ab43dbeabb5b5d6190d80bca03e967a54baf73a0e8344c73e11e8b1ce03fdc74f6ead9452d6ea811ef3f07e3c421ba55ecc43ffe942daf807200b2dce18bed34a173247ee9c3aff5d34b8866c8ea5e6af55885d41912b556babadd552ebe204c7076b2da594d65a5d3838d24847730e496fdeb8b921053e2a6b6dce261c334701e40d7f12a48d7ba82b5a943f285de512d66aad35a554ca8f0e12199abe0ab200c202592fea07a05429a5292b853cf9db2a6a15b43423a2a5ddcf826586b62863b1274cbe33761aa2db4681b6e4bcb9b5ba46cc4e4d4df4533a46107ab8a8aee427313b8cd7e78e4a28d582f22cde0836db081c37e347cfa77969fae208dbb970d5fc66cc32d2dac41863172782137d5db435572ed77585d7e63c8e738bdffc589339d46ef1b045533b1e4d7d9f5de21d293862960848b4dd027e22dc405fcc40b7464f435c9adf88d46fc43bbbb37be5baae92ebc2e2ce78467a1a434b95dde2e11d6750d1a2ddb2459041cfa735a092fed287359eed348875472bf474595ad342591e7aee759d54d117a1061d02290bdce23713b4218186e18e3f6891b6a8de27fcf3c5f2d045a0e175658bb4f6b252fce4ff43afb4a8c83223c88bdc3175ab00ba63132dca51033b37d78e5f70de08dbb6b9ee78c718d74c136b4ba539a70f70e0c08103070e1c38240d0e4fe2ef38644e48e6e030e3c19bd8f0a079c86db3022d4a19c6987e0e981fb3d2d424b3a7c9cb64e8ef04fb230f75573f9a0774e04461d4bff79449996c0a216b72678d3583b3a44d4d269b4a34b15d0a59ce39739bb4f16a10f323701472e93a4a7a21913e7b5e1763a2f15e867bd2c3a0eae676d92f2d65eabee4c95fe79c7fc4bc0c1844e6639e33fd188dbe9321c998687e945ee64b2005a2d95ee64b3ff3a49f0169509d0ea8648e97f5b45433120040100003150000180c088542c17050402698ce7b7714800b62723e74663c950764a1248a711805310c8348c600430030c410a39431aa0e20ebd607bd3235d551718c8aa92791d51b3be54e6dcab6564a94dce821a7fd53f80f076c7b64e10cf5019dd0de5573a176599c504a9dfeb5e62ca62e5f482ce307270933d5a21da101be627c56a7097015b953d3b49e8b140a4b2f20fce815ac2a70b1768bdcc4fc3e2853787c02fc7d0c86095c0e08877db08fe49f514f3aaec8fe9527b0b7fd8039db8c7adc4f075130ba2498ebc974c84c419a375a9fb8dfd9cf810c8dd635acfcba116e4e5737d3dd91b5e0ee93d7f1287e8d0199fee1f4bc3c0dc859b7ea4f7b40a118874aca4affb8b1082405d538f8f8e3118c9c4dc4a8a68564bb1445f0e877fd462829de885fb331b978d4011e56004a6fb6ff83f62814f70f77c5c04b50c5b54b7b2c5022962ab0aab4b2e6436bf7a2c0c250216fe5fa7f6bfb7bec15a934d021c11fe504aff1ca980e2c48208c5f8f88682879ecd26c3c9e28812444950071b1a334f32b9d4af095ed5c48f10131906dfeee4c30263a8ef9c803021367974c2ab3a7c89ac385d0a15182e7f1845ae7b05616251f6c4c1a2c32f2b032bacfaebb303a880e585badb46e0a5e8588211c46e4960a9569266f637fce04de89f95b574408d220c455718753177579f7e7531dd11a32a9f21879d99fb3e883f0c878108375246f11b79282210defef477cd7f68faf62b44f35623175db00766b193962464925bed1b3b671e386fddbf61eb64fcd921c57dfefb3ec213539f080fd8bcf2478841cb2b608035a07c6093b04e3d348330c6a2f6062f70c368621fbf78fc5257b00dc5463dfca2ac217f7708614cc68f671f6fa42cb4fe73057baa550cea9fd025ac4445c2430f623a487584376a99a181bb3b0c0225700a982f82eb30942e048f5c21a33511819add08b0fc284c89de26c4c813a293250888b8cb62f72f79049a85dbbc1136d83a7b26f10ed02d20045702de0228540c7af483db3a66b96b70462d93e94b59d6515444258d55a91b5b68145febf38d648e5388b16bef71fd0087d9f48091ef50cbef7c46cd3b3a275df9d29e52706b03bbf86ef3e88f734918bf5f6e4566bf81ec28fe4e8337f2ccc23b0a6d89052f4fff70f67aaa70d961f3f2e80f4b750160dabff91b840e6fcb0df681f77b37c1c32f8ceaadedde4481f85d3ccf80d54d137ad73935c232d5bef58b9d394d2bc874ec81925b0fdc000b2e1ada860988523eedddc00212c38281f60621662cc65aadaa735ce838b98e5181f5c391b54e3dbc2e562d24b498d428237469aba32eb847636938424a4404bb5b792f6eadfad80caa812710ade98b86019c7383966d8d3e47e2673d28c660aa09176c1acf454e2f38752b98907e3570709f4bb08058eeb56bfcc811f182e8dac7cda147e41330df2971509024ccbcf7f720505757436bca927bf17c5c4c4e89a34b0b052101fc96289fc1919ba1364f29aad3ff318caca9b79bd3137a602136b91d974f5546f728bd28ffbef288ea384ee50368d9e978a32eb651cb45f6504e21454ba75c548c65af592d8e19b1c44535000d52ba2929c344c70701c26410b44c84cb683f9c245cf8a2c58a110e83d2c8f4084d52216f58420b76b915851feab3772352e3aee768a20d199c1ecba30527810f1dc9a6fba7484646b4d553872bc34c39da78550f7d02a4f29b14ec12e52c1c5d147664bd990698cde7300b939ab862c663dee5d280d5b55f7b87912a992e3aa2548394a97a76104af37ab5f79348375d55c6773e3ae4b137b4ab6df723af12231b6f4c12635c4e7116e630be909de6fe7291d1db0c9583ea06275f5909af14200ea3c3d0e50b8b6646967355aeb2c01a491216bb99622d52c6ae1fdfc606043c0aeee245130df87ba135f8a82f3101e77cda6801c39d77325cdd9034ba5d01a5688461700d61631b2047c913539a92b7bcc243997d52c04baa49b70e84f2d85d9bda04879c441e995fef27eada4cfd8ab6dbb18fbb94869e55e621fe0b50134de830b11519c864d028492b785d75c0727373be8a8cc3722cbf4fe11f8a25b69dfdd82c42d9f80a2359ba2725aad1ce8e67805f8e5139efedcd78c3cd3150dcf1f0d9dc020b3a27367002f87569fff25521a7afff2594765716420856e1e4807fc9be1fdb6cb3ba666d1fc6c4240de60dbffe4cf342c6a2e289e0002c45d6abce4e44d01c0e2f621025ba97ec0505e4c9c876056f66254517d32d15f73955d69492ee1b19b893905add9dcc1bdfa72f114d3fe1931f812ef302199099f04dc4ae97b0298f8bb29b94ef8588e29f7dbc424305d1d9ba51e4bd1d3facd03a05d71d02576a463d86f71843bc517e8e4b820ec393ee44c51f5b17f4aa9116ac356180665945f84108fbf7aceeeff3c8ed342041c0995d06418015b83328c8d8b051edaed4d14d9750c02e44bc833ad6f2f307e7545fde814218c97ece6d6d2c6fcbd5a6d29f09db828cbd138128f655db813a3572de2663c6bfaccdcbb506a81899815e8563d2282a4468ec7f7a57d669b527f84bdd08902c60f390c31e671be7202ff5c808bba44f562e011d77bb83799e0c249501ecc54ee11e2897a96351ee994f54da41c51595d081d3f08ec53b962578d3fa355e722a0f233d1f383f9d6f227bc3d29623615fcc95c4d29f0e9aed8fc14dc7e00cc88fe4f63fec7e5d438ef18c77225dc1176f068bc9611a4cc703a1252e79a0b961f80cac8d000a99734c48ade9f4f82ac7b53047ee78da5f4f1a1828b7175dd7f27d7a71866143393c2f594b20ef443d7527378057de297279589a96e7b342e46c74de6a926092a1098cc022321e9f64a902800d66a1d50e19b333ab0df76f80acc828c3ca2a0f641449f959548c08c6aa81d6f4ff4fd28707a3cb8deeeccdb837b957dc9b4a6b73c7eb012ec1073d6220a5c9e829605d79f1e4046d8e58b08cbf2995198657a409202616a824c9d9c7dd900758bbd11e000e615ec3935d26b363b4eb814de83769c9acf8e5759eb75639532055315c73fdd47ccd241a5ccf3a712d350717b52b2a76869621e6f9532955c1e0a3b8ea44cd5a3ccc49b0ed7ce4e36381d92d113653664a86eab7ce2c19d97312dc5e88402f1a64699fde244d076b15512724e9d6e212b903225ba2ab1e06a2b9af1c9f623f4d86fe619ee03c893e3448311f6a601df9ebf3c90de6c663bdeda79e1093df0748162417d416645e20e4782844555e1e222af083478eca10809699b4c62e3226ff1ed8e642efd05af8df5884c34e63471898e2a04de251d2933e74734b9c47a66da294f3c92cb8b38d40367619a891ae8c0c07f1537815af3c0294238f0719f2d1f9eaf40d9e91f1b7122f645b0163826bfe31defc41d55412a3ed99753678560af0903cdf7c573c98caeb8d03d2425bb36b67295a6f359003bc635df091277d086fb123e4cc5da0037af61a95039c8ebc8ab653b3f3f5cb19b02984dc3549590971ffb09cf85a6e6e61144b550375cf74058325fe7492bc161b50932176f9f1aeab5c3c3763ccc2249e86ed3509e1c23ff5d1f1318ddd8e1f951a7acac710e9ae4bc2542833f376560c299a23d686bdc5d46809b1e3d161faeb1dd8170d1497cc4cd790ab63f1c77aa8af94dbc178133760726a7ec12d80ed42aecf0dcba234c878636ada9d910ad00992e98c7de892ef1d9a1a61afedcd4fe1a5ac6813fb86860040e41b809a4a6ac27a1b2375e1b1902a12a9f90396b26ad1c0602f1efb10ca28ef200d5a6cc6a5f1c46abd07a46fa32194ecef2af3ccc4e9c34b6cbd4b6b7caddc52632a40626f9e1eeaa4b6f3566dc60c28d0a51e7ef14d7b842584750a1336835345849845aebb13502bce76e90d255f007375cdcfef003fa4bff59757f89f9381c2d97518dbd440773f53b58d1ae6f08873cac8638a0f35c177cb124dcfa94d28d344dbdbe2d0134bc6da537db839f2220a9110575d734d2c3d2d76f9ee3fd7d13cee580c3164e1ddad4213a8bf746caa350ef31918a7c20a4906076e7221570591d1c5b40ac12d0a34792e61fb6c97c17074317d3b2f67cee3cecb69fa71fe87aca961c96359b00a6e8933cba4c0c42315ac6c857973a3cc79f7720ed68c0b19afcf5012b56b0bac5cfe6d197da2bf26fdfe385412cee4f1439c58da44dda452a757ee88b45aea1347e483864610efc352cd36baa6864f98a857470be1c09d7c8a217ea76aa0d92b351ac0d6c1bb5b22d38177e728543f8d170807b6ad0ebc9a8212f30460179d2fdbea56ba86647a48cf38c18feb5806959c8234611ef6e16b14b03af73659f6ccd02e29818f672d722090cfb944ef65891ca00fe0b2f4adff2ae227471ac727d139895c3622bf89a805a79f2a1ad6c83158ba0ca680d500116c80b32944b658c2c24d1903330e85c2e68a81235a99e83c34f075ddcbdbf262d89ea76dc642442ae62f639006fd86260121efa9628da89a04c9cd77955b259cea8041f5a73097151e82492d425d89362a7ee4a7d520ef2da71283df44faa5bbcd54198f5398f23c33ad461a484734f2910d6fbc1de9e3bc2d496970265770f46232b303abe4950e921789a8108ce67f260643046fee6e7429a9177b8adebc064ecd5cd46c2c3cfb7ad0e24b87da4566980b0ee4e828ba85bc6f7bd0870394a05b12f64d01ebbe3fd8b1e4100d60fb91eab520f829da82506e03d9b25164c910288541581e76c43e017f80163e55f39a6c60a32fbf8053862b5860706c9d6bbb426b34d3fbb9ffa64fe79a5f80da6b84dc707f9d525277e297913170237d5d42de2805b2c65f3a21c4a92b3341811eff7eb0c9f7321a4d5b21e6706c55c7e0407f4f103bcc37a34dc326a2027d6f7b5605765e138365310b00be8781a566aa93e3def246300502b9eb93c5dd9ccd572344c8bc8052d1c00cfa8de02b56e45fce2a10f8f39f12e302fdc93881d6fc766fc342551f737c9ac546ab6dbe9958040854531e165c153b9154d2a7ea827fc0fc33215de9af328069f891173d07173749a30aab5f31e2533a98248f0e0a1b99f5af29edb3eb70bd44186e5f53ea2d78a51fe611dd64e91eb17117439b8360d33f7f5005b8df42ed13097e1aad34adcb02f66c22d199018758cfd447eed3414bbdf68eaa96c0cd5520085a49e525160f98abf81d0edee5299f3dc6ac0a6d492bd9761ff7ba86145179eb869c80004f582d4df9d29ba41bd4d9b7dd3c7dbb098d6c5527faa3ce14621627da5f140b196876b65f6e1c6391866ef62dcdca14f10975bcec823bfa5e9c9c247efd2a22fa5a31b04f569e318b6ce64f7c134eb63fff8eaa4c153e30857c5973e49b21e3c883592c8afaecebd62cb85f065053e16d64c3cf97271bef7a9157038f4c669d7c7d794245f49b8adf82c4da7b21bda4ceeed1189561cf19b3ca6b9a3c60cd84d6560610eec72036120f7adc1b84986bb16a6003a265f9f25813c3af63fe0cc7cb48f29c6168b7e26a0b172a4235593e893879a90a8c567b5676569b414be3d8da9ec1c108228ad50779d0e233704a9e1135a40e563b280906726126b216ec3e8bda48a2b622eb69cbd01db3b742be3b49c05ec6d775a94eb5952488b08539773d44c7985bbc41eeedcef77c9b842a5e6eaa6c8175c8569926cb75b4a03502e82bcdadc387fe8c43d6884f3ead40d218fcaf4fb7bbfc8f5b8db261f327b521d365b6166eb0e2e55d0cdad3681f32a942c2e1bfc0d22e46f19c23783a2bcee008855c94cfa13fe543ccdf21cc0fe10450b20fb3ff079c1214ead10746c73fc1e10b345dd051348e3a2ca5c1507181b7a0c2db5e97d813bd6b6c3a178a6b0a51a9bdcd24b1772366c1f10544bd0da28c15f50bd6d09ce0171b72022cb8bb5af78a3c7e9b1b074135e1bb4e5e2b67fd0f01eb7500d0b9eb4486219e3033d66741319fe0bd4484e54f845a8155c7e8f1c87bda8cfa958c8d39ba4a4de062c3a17f4375c07801b682de69d8286acbc91ac943dd1edefa53466e6050dcbf50a1622de008614707086078b6d7d7927c798892fba63cedf29f27a9801e578433e1da7705295baae73673330d3af02d8bd37f678305bdfecb53747bf545b165165b92b42c5669c3ee3b4301e795c73722aa8f95c2012ec285d32ea34ee1e934fe76bd9a0112b56c36cd8d0a7a08485fa4cc8f6c2dbb495472150b5d154be1882fb25cc32e8adeb96a5c8a39098dab6aa613eb89d839afc9ad739ad6e92e897d5607445362288c2a1af27ef21b87debea04aac61c862ea3a7dfd6867d0669bf4d42b04363bb6313db7548e99f693cd9061e9fa55edbc96115148c57d3331819e2368c0eae571a4c0f82de830f6f60172ee9ffdd8b0b344a1693c5e8da02d755b581e43897598755aba64c48b49eb1984bdca17eaf94ee430236f636ae764811dc3aed210a782b20b3b91f4366d9eb648256c342a205c1e9ffad9e2d1e64cf7dbbfb1e76cf385c2c3fc095919979fb89317ab23d60da4f2468e141a0a1bff7de8a0e1571dcb401ca63a7c7b267c795942b6e8b38c88e37fe10f33c94cc5ac055df7ca5aaaf82f68a80ddc0378c49d12c088847baa8827413a1a245d5ea8d712a4a5258c54a38384441cd230302e3805ad928a9664f4c5bf527426560f2009a6b21ec914daa411e33a86397987a199dd07952e5f283f57726984e0e30e524a38bf4a6b5787835016677a185b673efe12b6c658e6f045409392356b118835450c72bd8729cffd9ac257cbfc5a584f1b44a1565e43bd7df63483da1dd2f2e482834bc38fad800be39ff127048af019812ffb853e5cab853f680d18f5a2833f92df0b4b95217b97c659a2c030b1429acafc793bbb884376c17d22f23409f0f08cf609f0b7bb232aa0466233c16a14fa5aaa8765b8b73188f51bb6a519e87d0cc06822e760c0c21552a95c85e22d8f7ec0bec1f11b93cf2c1e61c6f1a2396761383d8188ef0e8f66a1ac3ab6fb0e4400652e2e56630bc4c0df68df2929c8502dae36492705075f3181611a071dc9b58b37cf1806f0bd0ce7892f7da028c0c8c274b6f969a63bd654e7daa59bd5a1c21dad54262a013941b311ef0823eee6f1fce7f2e2e24a2dda5d7058a7c5ebc6c735c0c6354806329774411617227f683267bbf96741853cf6d4e5112520b30becd88c74c5e1f9420191a7f5f1d99f28f07e58803f0ad2a816fc9c4e4c155bdb74dcc6a93de49d47e7273d83b994720ac55f11cdc1e211118f9645d259dfd9e0ede232492d233ce49710da6d392708e8105a1a53065658a92ab8a21e4468638b5861932054aa35130307e05579eb392b8907e1b9b7c8122598067e61fd96e04964672be3c3bea0dc3e25a8233f757b8b1af88562362fd103b47d77e47824a05469ecf7057b1a68e6ccbc16d1a9563cd419988e4b0a8b4a1e6fe61e82cf6120b13966159b1017e61e19d2f81be5bc9bddfd12fa10078e0412a676356c57252fa0bc4583c458aec0e199a1ccd452cc7d294dea9dcb0c8d50cad4aeea71b7e0757856df4206b2fd80a956e73cb5e45679fad8be5541b16298f9723f16718e8b27473395cf253add944e5401ee3c02af10abf3615399e8674672117b3559e20805e95535ae1ee1ca6b9b45894035352e4f92fd9637afd907b868c4e48fa9ea87c2357cfd1dce2256f348605b41409a4bb2a0c0c744d8e04b18b4fbbc9a973c11d7ebc9c3478b4101459cc5f88f728cd4f4468bb189f5b41a4935248a9b54d96ff7b88c2a63ce119f6e54b6ccfcfc52ea121b5565df062c30a44dab26be53e2bbb89c4cbf67e6341e013b5ac8c268d626a2895bb87af4a45db5d143daf45019e7bb9bab3915ec79af5d48261bc6b2f07154048e51da648108c464b2973c031dd1efa4b17126a11959f65348ae60ffa57aaf9885520cc53ec5cd45bd24a4fcd9559cc7124ebddbae4c4a47ca895569bab687f2ce08e963f76d0a2bb8a290e681a9941b5d95da0546d50a220ac5c58330497fba3e055c92ac5e9ea47ba6fe2588620184a60c64586565f2656df23990cb2aa6905e416d6f03264f53630606c96f843d1be4bc16c70caa95e01f17bd609bd7c1c7134072ae9c9bb98c2f480afdf8704d4287a5578eb83fc54a75e4c9bd02072127df62f7a4abda593dab59a68201c9c62e7ca55c71583c6eac5f387a6798ef9ef4ffe20ed0fdbe9db2969e1238aa73c6572e5a041286db9b76a0840c06e0c9daecf7121ec0a7133564fc03978751ae4395fb536ad7a48a8dcad775c8931b7b514fe6d37b5877b04a2ad9b3bda5c65194b4f550abd733c0f03e7dacb3957702c3f135470ee7bf55398747d31f55ae875b8bcf00c885b23d92f090cc17d7bd65afe77e8a41a6832a824e41233cab1d1119165a00fc5494556d5ed03b80fe9ad0ffbef2ea0b830a430f9f8664c60c995401ae684e18f9851c7444566bc5b88e5b34dd4e581aff5cf93f4a11bcc9fa43ba0a4bbd111bb9624a582373b23cefb1a0507b779a4088afc2a630fbb9361161303c74a75af79b541ac8ec0ea6b88ff14aede1277ec8fdb44b26380b209b42e200da83d7da344ddda3f7388561df297138a0f6714c6f5e13d858f6313bfa7f9ce9ab111eefb31e6a776668f45eca2dfcaaec43df9aa9f003036a6fbf8aa54fa5d6b52d13d75d01d9bb8ea144c29cbacb304392177ec9231a0fddd5c66ea173decd092c6525a486f5ba6a219b7bf79f497d3deaca34c3d20d6c83e050dd829c01a66469f469822efd349d7fcbc4f920bb1683083dd8519d02da3135bd56134f49f07b9ea5f0bd04dbd065955fe9bbb329b971a4008089c523ee7bc5e7c7bbba9ee3c159d90156655ed1f69c8fe3f06430dfab5bac2216e2a9b091be77e89ffad8b7e1274c2eafeb8d78a4e05c75806a5df8918912af742ac66856092a41d398234506afedbfd92cbbd282ee1acc85ae53226c68a8498c894c479e4ec9d010b80124257636cf34caf56a16b5af5bceb3b7c6e189637c24f709847cb5dde39eb26287e590d0cb4a19f6ed4490502654a6179d1f24bf6f30d1c7b1a67d149cddaede626d1876a93b2d43988944615626eb4934181844bde9ea671970fd9f16df6d9d2ec7c4b0ec1e27c6acb830824f2b43bb8aaa416ce43142dce440eae2fe176a2aaf5e49ad2fd948a686471879614ddf4eef62e841d3bd030517d9db15532f0c4bd7257f88a81c18da23c17781d528a8cbbe1a40472195235fe950c8a1a3b65aa1b1ec8229565bacf9504b3ef32c69cfec62bed0712b9085919754c8d65535552a1a002c5eb8f180efcbb5051d855312e40f2eed3cdd68176629bd39aeb823b034f07d08004e8c482316f0be7dea02c5134dfc6779831026a0d324820a360c6b89bb4fd9bc8e2c70d4fe4bc9176a2e9f70508b91a6cbfd018697608c403334e3b8a05bd3cb0bdca30de368c07e79d9501804d9f996e3ecf9c78291980ab3808553c798da3ad71e0697eb0c9d6cbeaf3aa33f7c539ed989fd4a8e02e7229141849ee3015cfaf765961b16ca7ac7d73735dbd171bea3f94a601e375f5c1fd681436a2e76b065eba1fb22d655e484dd145d73337ca35f0fc2540bae22bad92d0dce064b1f9b268c72883819254d16c6ee533af5561d7b133e878d05a6d4ff9427d8d2033a65ab1472da760cb5e2fbf761a56470ca9e491aa955716cc59376947e1d3e177a3b422d1081c66fbfe0a09a2600e33f4d43af7b1e9fdf2174e2a681b374d2b94fbc7731999f06ca9a055bbabf71f5085279ae7e273dd343e3c2fc3979b19f9dbdd6ba5d5b1dc002b97007a7f63255a44afc920787053643bed61c86fc21c3d7ea9a215c23e9407001766204723f17a614137e6ac4c49efac158a9b6937a8b3b8349c96814c7cd3a423faa141127a4959493d9c4ac0afdbf36728d25546256f9ad12a9c86cf57f4cfb5419a699a84677e2d289102eb0eacc75272b47cbf61ff02f7aae149ac02eee6e486b90b2c913f7df049744f36ee9633495168325b0e38d2b14b69205d98dd70016bce1436cc1aacd2fd3a245c508718246d4df4d63223fed6b5c204554442d84282d50e7d3cf5d75bb55a09c73c03581c95b3e036faf30d1116a8693fcda75c77db6f49102e09acf88eb764da48fa67ecf4b3fa2c0aa5bb42da05375f7c3724eb718c330c8373743ccea1a5e27490d90f8b0c98203984e9055cb449c7398d3a4fcd95049413b4812762517e0e7f7a248e9bb62be08a45d4839d98b6429e8e05ed80db08bf80f4cf178b3cd01ec5f385aef04b3cfd8f3a651aa97551a5c68b5f22646cda147cb05491924084490d65aa62a8d40f35356a510258223431035b84639098d08ab7a32d1a64f3d3f52092c72a6bef56f3d77ef9f974a6fe2bbcb9074f7eb85f48a400d2f5f4990c440ac84dbc9d2014ff760de64e7c537d1db240e99dd1e8850eafd7147a3d0228379b92154b4626faa607c7aa83b57d89f2bf39a1b5379a49525b3e3f88f2afe5dd5e52e2fa340302ed00329d58d807262587da641b9d586dae10f1dadb6da2f45c5b29b2377c0f74f3482b1de578deace421fafdc45aea21b0fde70aaa371cb9206406d78316699c549048848a47136d36ef17bd47ba3cd2b7470b1c231d4183d61bb8f5a1fd203e38fa84a152265616809425a54b335495063a809e33284068535af81dc9ceb19afae83359442079cf5bbbcb74ac6680516451b0ed8f891a8dc1724fa5b7f950915592278385d4e5cb828f92920ba0097e7938034a2b3caee57c16e6d6bfcbc1a87209e03967e440fa185ee85fdde4a083354f164c427edd2274279f80e150f9b370401a960478c8381ff13bf157f10bc94f62815ca70c7c0ffd59e39ac7bb7ca572464396e186338ce88e8907f2792320585fd68afd45a8d8fea29aed3b9c81c1ffdecd6339ebdd2e159d4d727f3130fb68ec8bee94c70ecfe53813e60f591a9ae2ac2fee5aff1cb84824ce10778d903cc3de37725f36afcf9eccfba08701334310159ae0442ed416dfd51be8613bec3e8fcfe2912be7bffee29a0942418612d7f50675c2d24f30a14ae9c0eacd62a3911994ef8dd32cbfedd04de9e26b2b733025a4dd937fa2989ac36878bf5b4a72c150998393392390b1502e1a29a8ec8f5ff0c6366805bad9e3c0d97c80064eb2d5b955dee05a956605e0173d094fc591515398c146d42ad0f29f2647ba7873247cb4ba50316339c02a4a30325962e447ad2a512cd0473a367a79de61f4ec0a152c4b50b429a6f4f2aed888b04010330bf2511011fa451a25bd6c731cd2841d801175a5e8de3caa24f50cc43ddc862f83d33fcce8d4008ee055d2c3357562e4e1cf6ab38506d7232c66a293a1f4025f8e9a615856548824c69436bba9d79c14859f96f7d2c2d26b7aeef8efb4db4c55f2fd89ea498fe0aa9c10a61a1282ba54c10ccb46c144a714aeecd69e1f9ebec041e4e18fccce4bf02b4089fc67864fc18ee108231cb855aa524683d04e7c73b069427cf258fe7acd5196c32d2a6f66dd55151c3bd80b0549c0fdd462710b7abc45d141cc910782c10c855f590136ecacf1530fd635a70ae6943376f461a4fc2c786346d8a96f7a4ed1fc49515fb8ad65be388bc81f75d1bc07dfaec0c041d0def06bbce1a22d1f1df40b6680f0dc9c0e064c69b78b8ea2445362b4caabfa4ab12bbca983b8d83ecae9f5b76d5df3b21685b75df3efad88fd29d094daf9e63d237819353e0b2054e86bc1be658df7ab5099f2bbd607e7071e9c328f09ba43c8ff942b352ec013fb82961a465fc43025629e6f0154ea8025a8f9281b5e561dfa9b9873e517cb1153ac49e820eeed498036f71f35380e80162230085e427aecce36614951d6d8d56267acad80d6965d9f82c9932137e88d5cf7f6f67b0e197246172f91f4909a43f136e28fd49d942961ca30009c1a20e8abd753bdad12908454c4bde0efef65b12dc4e368b856e742c4b2979ea021f12d1d2e4cfe44d8822352f9367113ffe25fd6601e8b06b4985bae07bb69ce2c1b49eba02106f26408f1cc4a4164df582fd48a555d5245cf2a7fe5724577b6806bed037dfd6ed2750f06aed9d784e5a62c5390862f8847dd4eaf728f1bddaaf549dc8309b392c4eef8331d0e814642e73d22fc35c117cef534077d2b9477447f11e6ea6f8960f47196d07246f5e478623e3945d48e7853f688570fb016d4bb954094dd0982720c455b174a66303d41afce39ca28d5aba0e3e96d256e9f28baed12d9d16a47cdd9eb8787eeb95cd4c22d7b4fe9a6d3331d645304fc8038034b53585d2216617366d8275fd9aa7279012f45beb92812624430779cda7b7a0f333fa915045c2acf254de1f4906b17932716956ee6c032e47b61125edac4aff728789f439e58c08a2639645382799615d3ce2a66e5cd2a0d157e60d7d5260b6d992a69b3ff3d416f3fcc1a07199013431e092374dac69eaffea68c714137c1f802ae1dfcd2dd8a461b25b4fd409c2c49bad85f15792e5a012822dfe3e97ac41717f19ec810ea44d13195ed3fa393a9598483108a3a9fd1d59d16829ce669aac768ecfbb3e2097a4bb6fc869c5f02045d2b84f746a44cbd6a9180692e5575d0608ae6155e8736fad000a0dedaae147b8322d4ffe60e9e3f101daa7eb53b27fb03c0bd6571e53d06456797821e7e9cf3ee0f74e11d7ea0403fbc5c2a81a24f274f20be08143f356079a5234ec5f3e574785a1f0a1b20bd498e3546dfa2a30fc114cab7f92d1b68182c06f4cb05b7135e1e4d22e65d02c0b7f4413947f9330d5ae711edc7103213599e3fd86b8d9564fe63de4d0e5aa33b83a58806ce247c45ebdc43482435221f4b19e6eb94ef6a75e01a0ead12368b609a79c5da8c5bcd36988c5d461b8c93532888ba705e257d80c72aa8a7346c5a4a3a70eeae2f5144183d35dd6cf1b98560da315c26da50b40b1733aa005df964563af47af1a339fba68b08c2a79c6b3fe72e24ae3701111216b9109bd69602092b26509eb4e11671ee128b2c8d7a110f452303f6f8bed62ed2fbaeeb4702765ad25303f8223ace36fda70f87ec45719ee6fb14ebf6bf9546e4302a044500b24322999f2a1ef94141b1baa50aae07a02d66a4f3eb3bb5d63d771c205ffb6516e46e7380db0eb4ae4936101d538add84d5e71cf47dd097a9b7389cff9fa7302dc8b9637c8948a0c27e02f9dc08e8c3279c2dd5c6772af2e564c3c6359aea30cc4b4f870920d9e8cd0ec82544fef86eef5eda043aa1454c1d95bf5523af4c83c3540a44cde031cba846a7f039a7a568e546dd4a3b765a5eeacbfc2c8825ab437033c0c7224114db24a101180806442094a0a972aaba04b01f5220d154f5e0072222f2f0475fe228b2d6122c516443af8634ba505c9b87882efc79ca4644d7180fa08b78f6d2ea5d1dffd507f3074cefbe7c2b9f1209d436db68ed711a1c228ec4c47865adb8e91d12c85569518bc95db2a93fa548d49ea8aeada5be1ef5db2bf26ee41a9ce020a506c14d4ac54270217389c8150924efa1a621b278712074897e2fbfd427f9e24f9740640dc4591e490117fe0812a38c9c212ab3295d17cb0a22d2b1940c3915049225090e62beb7f0653a6b4c254bc1bdbdbc9e3bcc2c67395f444c72f1134ff75e7820ec5de3383a84822067a9b17428ae30dc2964854b2208e842c68f0bb5f35b88c2420bcd72f5b126fed5e54fb31445c6b4ea2854ca49864fb887cb932ca296a7b828be4a4918093709272e44166027eee670dfa2e24b9dd197f5da311b7ae1e0e44fb0548a19fa98504f53a3040a7526bc2211cc6c99ca4f176105d5e938efac5a561bda53e6132e2fea8bf854d858c54c43c1bfb3c89b3233e123b33a80982f3b1a5d028f868b122675d2ad163c180afdf34a5ace7c870c8c3071aee4271914792fc1798a6b53d4242da40e82e22170a326abe8ea05a4d55085466d052d2f35d0ffc8dc1af14a998ecb8a015dda554c9cfad2a4c821d2a6b888821a7011e9491e56af4e7e7167b1a2df1e016f46439386aae0cc36192b3dbf2ca953c07c99e89b7546f77ffd128f0247775f28f69667a86438e85e438780bfb08512a08c417165641fd2a06602b850518325d00425e5c6216ee448e0c9786d258424a9979ef6119046aa2ff3d2deffe899f616b1112485a5784f595932c4dd4989a327d55f712b2f98dc4ea2da8e3298946baa8356873a22d57e282003fbbfa556a4d96e4c2c46814e1a58833aed0939acffdc9017bf8434e3b1d01055de9845be3c13417fa9e4619c4c96e6b8d1a262756c1a54dd9a43d5e7a46a2064e144e192354939bf50607deae599356c6af7154b619ce06e525c57b7a9f2d21f9d018e300b5b5fba2eb31bfbb04a32114a83a27fe58219ddabd79046903006166090124dc13c7ec4e1e2a69e70f81002b1e03462bbd73f79d231199ebdf3d9dedf3c236494043fa87023c6506f6e42f5a714f7768c5baf6ef2937513871554ea05f19106bc34b0bf4b03c21f3737fa36dc88c1a66df506252fcd4dd61e4d4f182e5e76bd20fa3bfb2ef8e75c206905a8ad874f4b6e4bf40e9fbb41b785572e308193404e20b764f72699032fd9d06930d4fc49d2b6510bbefee9cf056ef290c835bde607910d8c216e11386f67d26314487c22660487355233c6c42e0213c5c45ce6e8679be87a7ea4e6ee0cc343b1603de47ee0b7c24a11e63129bf82d5fc8c30afbc41341002b687cbf854e45135698723626f6a6d8b6c36159e07a90051fca4d8aa3bf7fc4fd79df284c23cc478893b57a89e74aec937b00bad88d9b10525db93edd330152392e1e1fdb1aa83841b9c212b3754e87b38e8b4b8bbdd93200f854011f4e8ce8a2e2acc44009ad4172df784ea0c6cc298f24ad52df0230ee46cf984581cc8b1b365e90709f193b2e5797b0ee67676f3e09c8cc4ce163c5e4a8b0984215236b490d0440e0c140cc72fb652555f7a360ec882f8f0b7687daae36b1fb2f6fc4911e1bee4af5fb291660b640af442342053a1148bc7eba71bd6f0709b7f6db17392f5a0fe6df1f15470b21f761f13394b6484f9ce0fa2b948cd7da4e3b0605a8ab60b388bee517f2899d513d596dfad290a7c20d49cd43149ab14c70ab7fae7b8096d2934919b9a23a073ecb61a074e51332edc3cdb6371c3a0effa9463380ba486e113ccfe40a52fee338b123ce4f4a906bfd041704ff987306da8021479e2ececa9e2a132182f5b269d1cd4103ef1c40375583d2967a5918cf7036fa61cc04035da83327210d6bfdce687e3c020e8842c81287ba0666943404f73955f09fba46032fece186a2b8bea3e09ad5e3bb37ae59f940dd66bf4de5ef7f48aa98b8ec48ea62407ad87be29d45df0af873888fac2821bb47a2cd6d58bf4909a3a3974959af21fe1691a0ec011db276a979e7a0d224358788e559d5be6496596ad2df7efff83ff00b13c973e1b10e150cce6c1075fce00687a66b2923a012e8a550a7bc155b6820466a415dbff6fa964134406045b170ba4651bab35635c1db4777c05ca49b67224446a7046a43190c2347e3d7122544b68299e1caf638d509749d1686614ae6c80b37f8032aef12f6ee584fb8c25bdb3d6da6fec0e86b38c0b4450e57f6e6f9fe7baadd658ea168b78b3c14ad897bd9a2d561a02125f4a6f8b99d9352f4fd39ef6a8ba4e79695cb557e74f9de05c2a02a40489e18c0770ab38e56539be8a3f58cd0eb3e75bf71547661ab7c31d8ab4890d0efa0db58552a183ad3393f375f294134f735cd6f02d4a294a9f9eb8a4dd9ae2e368d689a69aadea891a1061f19370d0e4e34f4c59587e5db33767b46708f9e6359b4f4375f4bfa6830b49754c4833630d98a5d93d2b76f515176584bce76ad3a02bdbfff06e1813d881d7bab54c9ff04783841d480527fca1bb9336e407f4e6c7629406226dc426ada32f2071a6de80e7aa7fd45f926d24512dd930c1f83297324cacbcba139738cc9fb7ad030eabbf1c658298e3bfe3b83c3e1e30a94c3086fb4ecc83f954f0690102670e268489f7b8bb1acf0c04cda7ba025d0bbbcff294f72fbe9ea72b4ec6cc8ca3eed92a9f1eb438de1462758e046d60e79abb3038eac89b919bd20aa3c600d430f03335f8add1fb9ec0fa6a348fde3197c7464a17e8956eb3c647085af686c950d91e3852cda94c30d532a0a1d607e8e2df5e393bfec5203f457d0ed3faf7ac80b150ade4b0d9a071dbbe6e5b4008902112f0ad4f5660562f7cf259af996a984812825f89017d44373ee7e2bc92a614e102b170f5bbf23344b28f7fb1c4b53de845466d74852dca9ca0eb434935682c788916c8d84cf5197fa148b50fecc360089ec9c5b3d799eb0fdf459ad723b4b09b26102986797850fd6e5c5ff134f86a8da02be7024841c1d3e90ad3f9cf57db77375e2660e4888c554bcc287359202b7c092cbd0b7756d0aef29ab35ac0733106b3d9833bbe9d609a177a21e0e919acc2d954277a0b5d610868720a4787dc08808aa389da7818cf3337c629eab05059cf2798c557230bcdb1aee62d3d7787533e4bd30d2816adf984aa5a9ed9ec3676f5231c5ab31cce14a74fbf40fb28e1855cea16096d489c2276bab8af3e41e6589f354d88b1fff617fb4abd2e890516662a56d0e99539be48a3926d3e131ced9e8a5e69ab9b520a0a643e6c89e4bb5c7ea8157f2636637b996d7b128328c880d5964906d8076f1372c86faf3736e67884cc67dfa42ab0cd65ab343229744fe807b3d8ccae5d7b5fee044b4b2acbe613c17dfbf7edc7c2ae6200cb275d2d8786a91cbe3d27e1c9a3704a474bde95d8adcfd8bd22a59c21cc453fea6a7456af6c2cfc7f28574da7b99f81d9a0e259f4d65a147ecdf7e891c0fe282a2581bf4ca909c9740e6704f8921c9f19b4e236384eb7d5ea26e44d70738956c58c11c6042b9b108d25188978b12dcc816fd0d3ec3459e2d846721f226da00085c2508fcd0ebdd38c01a3befc08c261511c0179d47ef70fdf60cf169cde401ad3d6b30ac7d4feddd46aa54d0912683e417e29a9eeab31604264c9708aedfe53964609454e57080eaaf5646f8c0ce31c1815747ea2bf752d2ac1c7353f351d80d1d843dad213eded5a0114163c08ea0fe95826dd69811b02462dab1d37d9b134d8e61a8b4fcb679cb2a65f634459238c71f5b86b401f32ce4ab4f81a372328984cb48b677c380657d3d3a92515d8a2af0b3bb98bb57e8ad9af79fab0055cd98965767ce1d639bb624f89b4c9bc0b62517248df93ff9a782dc31a40aa133618693386aeb84461e5dc2d2361eebdf764ffbf9ce0dfd9bacb81cffc7fed089f96ef323d3a718ae876926052eb9e9cda42cef5451eae41d216a1f1d91bc6391a76928986f711cc3280b68afe1f4392bdd8a1a0db7b33ae3622346e6530739fb2499cb24daad5e4d871ef148df5215706f8709e489b1c1759e100dd2a0c275959e7509b024b0716d6fe5f33fb5d4ea687945f837feee7d7e688c2ab35c10bff7dd9d34ed1e14fad98694c8daf1456213c48ff9f16f5de12d0883478c783159f82128a839279f3c0809b98e12be76a54cb0c96c0d5189adccabd075c14c8d045d43a454fcaf60707703c8d4b7ebe5f84e8ac1029df4a2aa966bcf7112b2253d1316db8322450b352ba3f78e164bf16b94f9fdb598a0b01d5eff52d05d54df53c90bf6c720de73c50455a03d62d65326c62832dfb6e6a1434be9e32aca355b605245837d0a8e5f63781e7b3f75debd8cc5905a90d4f4b59f8a7439bc071b5d5aceaf9bc625797d76aec43fe67fabc95a5e7080d5d58d998317f68ff5800c14b766d3376c2a22520ee727a8ad8143dba789399fc494d1dcaca6f1af047092231ee5095dc6b1d528677cccf0fac6fddcd7e7b09505ca129608b01feb98125bdd7d31136283a76ada0bc6f06bb5f1b8ad1971610b41cc625d0f636138435f399a1f49d75378dfe0ca7b29101443476b872c48181fbc918c632470ef9531781a932a0a28770dd6f4140b3bbe6beef3f35558a6128976d16ad2bc474ec508e26d6976ecc59c1fbf3f45f456e2a1bb7701c8342397c34a9b9da4bfb740eb0bf318b9e57f6a9b5a5ecc059306adf4640de7fc94c237b77bd67a02d47904fe45ded690f99531154a68cb2f13b180e0d134f99ffd2d5a182c16938a4ba0f78f67c937ec722087b52ced58a37c0b803f42a9a9d0f8a922336166ab61096a2f73fdba32d369dd764f6ae798f76bfae663bb06a52ce0cb83c3137e87c1a5b3ea70ed5a4ef804daffe90283ee3622217b965cb0895cb6f8b0d38fedb8004f84a04140f59c3967aa563003f05f7a983f8c860b27a8781e5f19658ec125c6087937bf25e72ef32549a6843828b94f68c7068a084ab2fa8ddcf7792ed25a97ae64f71a1b999f66a8b81b7e6c4e8579e1d9f7a72c066800977a6059a210c684d1e3a1e368e8e83ccf8dc434c70637758c46288c9bed244e09e62531a50b227d7f2637049dbd6b26296d5c88ed5ed86007723c25c11e4b206bf9bbb1978d1dd5807d9acbb698611f66478ff28312f03246e270ec40898a26ef9ddb828c9de127f374a50044880c1b6960eca6c2de6c416b339e329ec63f022c0b5d629e8ba71acf77e7b716cacb6d691c97407934555ed8bc21b4be8f5cb90c9678837a7fff06a458380f1069a877d9aaa800d287c879199c3507274ed694e34aaf803b1d65b22bf43166dc37fa7e021c56b66399f675cd4442eb04af3d551dab581cddb768cec944f0087f94c996b06c2a8d32815389dbf532ccd50a5206a3cce97eb86c8ce8ed2104c4654ab1db3b3b2b8c688e1129594b169d195f0279e38540fe92dd203d5e919268045ebd5301940cdf8a0bb3e3dd9fbc7d45628ef6dfa7b1fb370513ca588cd10f2483e66f33a2f3fa25eae63e8e97b70bce0db2efaa5ded6857841e7965b4fc221dd8ecd2d6b3fe0625ba0cb8ff45119fc8bc7997ebbae51be2fbd61de4d2deaacc4ed868e5d29943afe2cae6ead5aabb3211efcd5261e7336b6f50e5c8ee09f6a5fd312c108429c151da96ebb4d4bcc8f7125e8565709666372c85b26e59a085c87558357a1c80344faa06c4b081631416dc64e1f219ce7dc588fb653c1ae4bb20da2ace4826cd120990058903ae0bd6ca84de534ab96eb2cbab2498fc11bc1cda4d31968a325c9c56e444ba20e171be37d5374b300d17e4b09f9cda8aff3651e43451d9b69e44aaaba50d47f21c225437040fc76988c4b69c3cf051b44678aa5d3300ee2c8084a3b0c47a6fbfdac8ed808f7d7494c55c241d3fbf945e79cdec1c1313b1a69e4c088dafe9540dfcfda9184ec8eedbc892e3b89b2401e3d54008d6887239a9626f886c95f3f8436769e1329ecac033b24e1a1936f28c37f3e7dc538c19268b761e60df6439c6d7a6eebffc0572d992e46e1febb82126149c15416ca1a11904366109102f293e2e65e7f0579de10f9940f0d8a3014e2d5713ad12270d5ee6b9317c6373e561d27eae04deea4bf3654f82dd3725f6764acf42bb7e0ebc30eec7c9007377f970f22d113b14cd58ea92f452603cafaff8e4c69a319137d6fa331ff8b238f9065a10ea35da0ea4bf3037c8372dec0252964dd6029bdc339ceb5805f3d08dd529cd68e5641c203187188f73e14585b9864de54718c3d5a7a3d7bf11e9c7714e463a444bec9d3c37879acbf953fa74162201b4cf128dadbb23e35907cc30b77217af6f2cccf1c5bc61573328cc314a3583dae9d994c23d7e06345572cb86bbacc0e1896f662a108dc19f7eaae4605603df340e01db59418d91a52a9a882b4aa6ba84d50d15cc46363ddd1ec1968818289dd03314b517c65a56efcb906858c2c565176d5a266d09403fde40d7ba8dbc221f0dc8890ca247dd53705e8d6973f580ab4abcbe5407fa5f891a99d05a9fd4480653e9beab2ff5c581f1c76d26115dc7c52699bede9a84f0e6afb897175313ede3c4753a6bff6a21fcd44c7eba37ee9235a7722bad4ef86790fb53a4950386deb399d9bb3b1376a0d94fd40bc2df0c8f8abc446f78bcf2f85655cdd64fa7d4d195572a61db5fbad944c4ecc48b57014e167afd4dd9703d2d0c152d5714e818fbb97e69400d3bb1853515575cf6bb88ea954a903125f41e27b393cd531bb21e76e4cad82744935ee46990c328ea9173e816d5034e32414eca8231cc2cfea3ebdbb01562c982d52265cfdd764dde54884a42817a58ce683f0cacc1410c2523121ca28f20df29477b33aa00556af5d4ebaa4db8a98edf82aac26f7d45fe78f641c25c49c8eae831e22d5cdeee0e8c852351c92dac8453072863a9ae280b005a1020e9b9d547d1077d0d69683868ed8af520499f291f1c9174b7b6ecc69e9ef594b24825e499684b247fad9e1b7a3a7d221bc399da37825c95c41956f7784030ee13db9e1ae02c8b752151504de7906234c74bc184c913e700ba922bbf3d28d8ee234d2455ac1eaa270d14001368e558229916c0e0eea8e41f6adeb81c7af267d63736507f090521dd2565f68542aa86d0f3d84f045a178f83e4a52f11cbbdca8376a43e48ccca8f4a154decf1c425fcb9ce5bb1e16afe09c5871bfe3ce72099e86495143f8abe4e7b333cc191f13cb17675aac42eaa0a9f06b49f056f5f15c3d419b3d57f68b81b53132a9cf4475bcc145e3a403910f1e5d27ee3aa34567c2e86cd3a3fe60fd6a6cdf74bf7b58ac0ca6ea34b53a801fb11a400e3d4539ba7c7ae808e3dbce0a180fa644336e79d262690b404fc537f170eb2742d4291aa9d7cf8d549fa7da8cb0dc9b922570da1f7e3fc6763688810ebb203d675b9cd0cb570d5abc930c4f5299ce294732ef213820666e327349432d8084feeb9cf37541dfe09728b9d641a2de0def843ea87b5be8be64ebb99f75db72b1126f38d452f85898e0e4f79dfa58897891064ad2d4811401482998295c4da114bb95b1b08baa72cca35888e6950c16d8140d13da9c5da8d1158b1005dfd043b6513855371a13a2aeb02bc6ebe50e0ccc2797a3e51c5d227ab135c78753dcfcec24ebfd8a6a0b0f8ab104e3c1f107523b064a2e566704a741874738d5bb2dd292354e208ef20792f71bda3ec05bd6c64de40255aaa89e3644eb85bd2e1b30f035ed1042a3085d25ec2fad5f256e11167a31385b4a70ea1203cc4b5562b8eeafb4cb87dbb0d13574aad2eee5dc8965c29559b38ce53cae58949054502d2384084fdea675e56f73ec6209a993715603866062f5dec4903ceb38c5127633d9aee5d4e6caa0f1e8c7de72583316428fae38592618f2727199a36aaea3c2f3b0139316cb86c64af7ac226600ff63d71b8767f811d2bc86ea498a389a3a41422a0e75550e12c47dff341c3d23431a5c56a188cf3cbb9110411bf4442a04e0619f0cec11d6410b6d13e1b33163422b80e10a651e772688da8af68576f73a9e0ad3e14e537b1e1f0f5dfd84f8c03d9a75aa8932107fefee5a6f8e422a1790627b81b2fb3c03d3e9849c793359e408e09bdd0360fa3f55812f801b0d35fe839de120e0b76576818f5514b4aad745865369e49b3c8d2d212a211ada4ff96f98bc74475d4f408912d412c5906341e4a0111fd7bafa648b3f097ef7dda6d7151deaa0136cd335de7e49183cd283aa330eeb09cd01757ffd28781290c5f92d9132fa73bf42d7ae09ba32b30431a5d00afd85775b4228102c90d5d71d08509e370b37eb879bde7dee30d1863a1df493339c3f41f11a6d0a775afda29bdab2683b39a1c4c4b4fc3cbbbfac7aaf9ed601fd7c408a0d9f018b9e9e5c7b2b6f61e9b0bcf91d5aca4e0df3ac6f869a46a5537743b050c7eecf43c13d6342ebcf2fd69070ddbd0a94a5abb7ae9794850bd7b35ff822c3d9d15a146d66c27b5c996c36b4ab3363f67c43c9850813be3a3c4337fbb7e51c2259830eb14bf758c66bcf81ac2df8ae6dc86165845f6176f782e8c9aef91e1eecb01235f025442210318bbadc05a2b47b8146e012f7753fdcd9f20920f6e86a740c6d2b6bb960107b4301970db1756bee7c36dbc9f90f01d29a88ebcb33f520afd390a0503d2d3c3c92808ff9cef03d3fdeeae84a08a2b94f33564470b3a5e334635692b621ef170b3a1c105656e6fdb128ba70977c699b38e09cda2b7a348737bcb2fdcf733b083da653be2c34802650c647f909638a45654517d7b20ac2e8e914214d438f100828bd34017975721157d9ebffa545e18d474c5b52a33ec758c4d2661a46e99174064522cb242f65682ea9162c4c933cb8faab73ae869ccb2c92bf6882a1698a04245ba59a449fff117831bae4ea280fd39c458ac8f3452dc288ccaecd4a5c04fdf375c4ac0e828460838c7ce416e08741660bdb20773a481170b138e2e3eb1c8c02117cdedc5b96b64d80f77631ab1b5962e5f02cfcf9a4fd72066079a4a0cc6419bf115b1ca3a5a6f674da7ead0eba9a49e22d5ba537bd52090e47e529e2d66318b120d9ab158f3735839be1c58b5eda40a078b8545617fe254172cbbeedb117b5e757738e0e62f2a022e8fa3b97010ea1272782371b9f86fe4791736bb642b55e9d4ddb96fbd16c23a37532acf2af85c6302bec0d72ef8c2433067b6bbeb7bc83112fb4914c194f119780074e568f7048366fab700addb8b72d9364998cd7c735103a540ae543387a791653c81f598b287e302ebe204bf4aaf4dd6d76bd485ab822ac5e46abe2ea8006640284ae648e939fe8aac161fb360524fe827093644de162808d9fd14f72fd522f0ada81f694a798b4c57242de1e4df4c85036815bd78c0f58882faf4041837614faaf270f20971bcca4d652024b6a15586218803d18e15391d921113087e452eb079642214df6992922db3729dbdd5234255e9be0e11a99ea04f66dfb25159a12895ed1549c70d48cc8aa9ea4290ff7dd552049c67b81b0f28ac6df1a375cdfd411c6e834a146cf6279c80af7920cd22e5c3c1bfe55500294b2fe71f275c5732d37fe5b95b2faaccd1b4519b0785338886631bd45c28978175daf953cb8bc6008013f536f330c66524392afabb6438b6cbb1d2ee6bfc84e87a50882c483bec8d0546720f10bf8d0a030a2e9bd53a851b167582b1f2e3e5248f13975300dfa2873402dd56fece6e82746b78bafcc364145c871953510f36bf4a2f250ccf96da2f297dad300637a2687cb929a6bb00c6d7fdee7e9d93725babb9752c38ecc69de9d02722f131314ade9b7ca86b838e4feafcdb052440b61e5a524d636b37511a38b0213d783289835ecc4e1f86d6524e5c893ec0904cc7f59915b2e45670cb29c11f675fd0983f894ecfbee05df59943259f160f2036dc5d10ae4225b896181b110af612bc2463fc2b1c77d9763c56cda92fae19990ff8c6168a8f6d4cb03413a4a286c6518ea34c44e672385f845c3689843e229ee2141e4e62fc69cc084c55fba55a7434e0c01cc163aab7ed0ced3ee1b9882a75fa61faa6b8400b65bea8104300775344c08874b919405598aad29e7a63f8db532402a99e1cbf73f58009303fbcf6c4dc4094be7d8eaa2e45a7385343fcd37d4a16d09605cf4c733730ad1e17be26120149b8780ac058d9ffd452a91737d033029cd17237fd42985edabc89097857e9c1a22daf8b53a7c639c280912e0651f766cb0bfe424026b78fd9631431eb5b2bf142356e7f9af199d512c7372fccb793d7abf747eafb287d2b73c45f8fa5919d5be9f0e8f7437a9f5e7c24a443da67b49c180c3a1bfcd772e15c300281d33dddb252e0ca61ea6362fbdde01158dbcd41c7d2a1f07f0f7a4d1ac42bd83af7c30d16cef0679a847019934a7899a2c3e44081150dfa66cb7829772a51d22e1f0e2895f2b7811d4f6d97a83d60814f7467c09cf20cfe18a5c5ce83626b571c0d501a1145fc1f0c4d587755f424976423df5881f7a840112c1e17e70aca484b4cd3b8140af7b48bf9c088299340b0edf2c5dd2d2d2f891c636c12807b56c5a1868b3869b46684c1f61232549357c471496d09bd809549146fae886287f61039c973862bdaac4b0d3292c585e2a0a267acf757220ec4f069bcc95088a070a74812398b476f99ce514d42fb377391055e2f5f9562513a645e81ea234965cb1549bef3b1c006d815649e0759c8d17268ec20e4760a54c0281259f05a834308425a77726ed5e94bd877ad517121269a0ebddf51b4e4481600f6c4edce636b22dcc1ca201520b5192c26897269b2d35ca837856a93da56f40585fcbe5d147bdc1730ca10b7aea24b7aa42791eefdcd81f4b61c58281d21590ad9347a60836623b784cb13f82838142cee91e630b487912ea717fa84c9012467dc5ac7b9389f7ef467e9c9f5c4d18f60298c3b9a5017523989c3dbed73cb0b74402cd92e98cea67556f52cf4403dedb412a45acaa1159b33a52f38b646b2364112769110eabf2705056ab6d24d2d6eb41584ce73569c83971335b65554178ab4e5f2d2ce1e91901126314312debcec1bc826f7bff39caa18e65af03227217cf69ce01e5941e64db04212712d18fc7cbb8eec7c98905271042d1a50618b1b2cdc44cc581a40c6c2b77a0f6cfbef19a1fe81a75a2ee2a890123240acbe06f527505a3f7003602fd6d77014d8759b2eea6edaeb451772075e0bb7b3704915216a68423fc35b208ba8cade1e54f579bb33182ce357e6cae01dd2ad886794fc8d9ac6321361d62e320468ed70dbc502c3934b4ba06cf7ee8c1227e690ea69922cb32c2d71aec1a13f91c1b6c237307c84dbb3d98ee108c8565a225114ca87e5dd101d7d090991a0eba9fcdc107a9e4a9d89a01d8c8d2c43dab804d02e21f74abc90345a729bf98278b0d2e347eb712129af33907d9fdfa44cdf4063c9c58c96b12e99c37aba1b6fdb016e45062eb40739b8e1f12194e2f3317813481e6ab3bd8eb4d230ecdb22a9ab3a53bdcebeda612c05bebb53d6702879d93ded5cc6fba1b59a0c755cc830d969b8c9abb821ab6f4349e6911deb577670f8a8b063b589746092bddceebc79e94bccc548ad8b8cb4c76b08f1074b1c5ae1f97c9a06be85be71251460ef758cba438c0d01db0467e505e9adfaf7f9d7e18d7123fc96c001011689a8f2c0389c15f573134db0ecc36509e832afc99578148019b872c1568420c77c301846431abac7ca217e009356d79a31383476bd43c53b20e9f9a2cc0640782988470e64073699871401e65233d50c703d7469a7fb0c220cdcc2586ec6a6107b7d127fef1b8bf6a65e4cf225cca96330d712d13950964840bbb5687cf4a2bec9027e04c929bc8e01a19b8e53f4e0c43fc6a761193b42e780467bbc2fa9ca0365a696ec2db3bc41697c722b817075a2a073ca567b503c33d728d2e9a557549b31a2069f98e3027e332573e0a8d0a38aa6d0d0f1d6b3d5435ccdaba2f88cccc5866fcad3396fa85895270aeade9d7c8842d603e1660102ef1c6cfb9690d01b6604c96285ec2ddae5896b0cf10fb9426fc13c8842cbd7c73adb130df7b60294e4af7395b08539bca9b92995043b3905582af7e44d9858757950f1941c1bda5dce6eed838f6c65ee6a16280a95380fcbb726e3eb6141112247b7fec17e45d1b5bceeeb9e843222fede24a209b9aeeba2590beb884220538c06ee61a263ce277a024f2a27f68053f4980ff49ef93e76cc3aaa75ca35983a780a3f5346ac772b606f071d20a4aeb9456e9f1570058a0b430acd1b3796d71ebd6422da3221e15bdf508e2fc20069fcb120ae2511dd44161c5f917961106e76a2e4a48613d80c6c0c45862838388c7c95d224a88a863fc0bfecbe768c98bfa45fabc814ad80a79a92f6de4b51c99c6ca47710f24c05b10bc841b4eee2193a0df2fefcb54559b6cb9e0d44a6c5c7e9e3e9bb82935a1e2a09be458ad04c1fa83473fbbb66ed9a6c832de9cea211b6a0281b45d1ac0d89b67a02624ac83e17f1cc2baef319a36fbe6f82e3147c2ba4678fc503d2c25570ce43cc72d87851f436f33e212f199dafce14f473ffabecd10e549a587d8667cf472644dc421b540c0198268744b88abb06acea4e2815152f407557c79bfc3675584c3c15e70727d069d5191abba359af0438bdca519cee58f9cafeb83497fb2568ea58f1137d0637f68acae3e79a4ccac94924f76834e8c260e54b5836705f328e298c0aebef05c99dff94dfe8d38a318c709365e05a324f5bb7eab9e3efb41787e52c2c536095f32c3592737570ae4538c41f88a4d1a6398e54b6a090f7d88723299d2e5716a54db126b42a97bc6da366dc75d90a5c88097394c01b95c3e013cad048a70c3b05b30d2a29a0e4a3aafa070053e978671bcec4694b50d395beae8fa1cf56dd4990cdf3a2c24b84081e259e5c92cd1f63a5b61a208100c83e8f5999f9a2be1b6bcf2f15a1cac82aac5dff7668165a01a2b624837b2db9adc524a99a40cd90aae0a0e0ba947bdf7305f65ed5969e552aaefbe9c424bc951f955ca21223af9fd2ec55b91b40e7998dec764f2bc0f870eb14a8a4a8aca0a8b8d254c6c7aa231a74f578babc5dbe5367d89ee3dd91dcbd321cbef273fbecb0d971beee297c794d99e7ed91f0fb43a964807d7a60c8737d7799de7811ecba328708858e3bd256289388b0d5f51f114ec28698d7828cfd33befb3463a246289bc69624164459459202024dfaeb23a58c9ea746ca6f8743e73783a36411c3abcc14b293b5d0a11b993722425a8f39c2224738c7cbbd449214a014a198a9f6dac59f59f92620d8bcb0d67b95a5acebde77d5527e6988e83a7facc9d9feec34f9fbe52017ef9c1e1a2004fee02f25fbe2c7f5833bac46eb8ecb8dc68b9787cd68c4a412e976769a4c55b2e108c1de2a58ff5ddf013cb0a5652ca293bb14393cb7c4c6fa6a4245171a292d4a1dbb48f29933fadf2c40393727854967454a0ecacf47ca358983f41acd4e14e87ed799d5b1eab83e30867aba3633b5367f293cabbee744d9ee77376d3519e2d915bb799f633a156e85426533fea2ac557fbbd8ed58832abd3af769d1dbe3d013e3847a5efc1d91259a28e998ed492142df1bc35addb9cb4109ffccd42513265bbf46d13049c2d914dd232aca4b4e47ee7320646b9c933567aac447309037b3e2751c7e209cc79bcd461bb47fb7693ceb7a3527652b0528afaacf1dcf4cdf7fa4d9e0bd157b7691c620db5ee7dd964f2cf334b8a184e221d4e1c306e1d8729fb40ac341d54b2d6b1d2bbd2e3f860fca2c01873786ed3263fb9cdf438afa8152cf803f58264410b58f0dcfd0a461e224b34e46a0040a12ebdfbd1b3f7113712ad37274a9d4f8d8706a7a5a3531a349d269efa09c8b3a5552855a92e75cc76772335714105e24cb63692ed496dcaeaad22d120c6aa0eba5a3d9938ab837a43aa4a9e57e4c32fbba65e7f2b2fbbeaf5d76af9b51ab45e77bb6c10487f0d42cc41bdbb9dc9ebcf7bd99dbcfe545e769dd7dfeae5774249b0f3bcfe4e2f3b94273feabd1453a90a25e6a08e7ad9de21a52da99221e55eca55a99453ea26d870bdcd17f5d477eb90f660f9fdfa57aca96608c0fa906b9e12e1a9e713bede62505ebd9d804e3777a94a393c3f46806c50bd591ddb637d2c506d09d4b1ec3141401ed3b1c64caa9529741e39d3c97ab516c4b2e34c276b2b779b520f4f26ea1700724fdec9fb5631078b2ca1bda797dba15aea9582243c95340dcb7597568fde716e3f12c2e740bc62b938eeb2ac779d1058d7c32b97c778d34d6eafdb56f50ceba4b436e9828cf2953ee92a659ee9ed87faac4ecb57cf058d18a57bacb6564b931fbf7d3ad63fd2635e7d94d99c7e51cfde2a529f3687463b8179753f9a85d90177763ea9b70ae5ab4afdea01674bd38935d56927f4f568be80c0883b4f6d9d0f1dcfd3cec7f3698aa77e1a8a35ed94baa5756c67ca5ad5518e33931e51ee813d529ea7409c99b4491d7b42a58c38f0a2460eb511295dca97920598bf4146f1a47a6b599cd5a5a7965693ba821163758c930433c5010e80de04669a0fddfb2eea1b83baa5d524e9d4724dfe16bdfc56df99acf8ee6484d0cb6fe5bbce935f4b7a091ffb1be61ab49f1e991481e4239322cef8ce83810f0c76505e75f282235fc11b6e3e032c0f247586ca072f3fef3bcce453bccaa4a7d6b2be7ace3b150f052fbfd3772b9eb4de456f1553a976263d50bcfc506f755015f46c4e8749a0dc00d4003506786a004b5bb5c41afb019708660b82a74e5bbea5e5ed1029f687a72d4f693107f5ef088c3ba4a8cfab9656ab9f863a5aad5e3f8fabdee238eb3ab23a3d16c812b1462ccdfad8204a2dd153e76c1dea18a5d48a2193d44fba8757b757b4a87d7b2a45c5a3af3aa60a512cbc48782cbe512c842f83e85bfa993e88ba54441d1e29522de9b01e4155a19390cf49a8fa4c59dda93bd5a7f3ac1ae26c4fc77275e9dc4ef5fe5c77beabd79d8e4df9a61bf37c36a59d0d10b8f314b72b36210f1cfd4c21c59a14c79e1a4a01576c9de72a3463f02a96219fe30eea50ace9cac34b1e6238f13724f4edb20ad529aad037d29b9c76e0e853ee82c69c472aefe4877da6a478c7771102ceaaa18e495751a98c101de9581255916a49c724a8226a954f754465e44bf95449544528d5100d778e7295c953df8f3af49ea3bed6c9e37bf64fa6bb62b93a540da986ba257a4d55b450afb6eb3833ea35c9a5739cc9afdf586ba2f48806ea3ea8f3a03e43f8913a1733042cd63020e6a04edd04ea61147dd182a73978ead9004fbf23b0cc0a700e5f565aacb1f1d4eb51ac894fad447ae9d25bb536eb4629ad4fb7d879ea91d2a35a0fadd55440b500b241a9ce53af0da34e7da663568ca7617cf6621002547dd015599f145927095f3f9395b238318ef2cd9ad3fec41c2288397a091b857de2dbb3cb0fd6a104adcf4b542a8a35479608cbd3615b9f23d40dbf7341035beba3fa30120e3c4474332a7545f808095bcf5d510f58c75a0838c360a816605ec5f202675863a4eaf3e5f927306319442638e902f27357945955461ed6e411d6c4265b12bfcf0f91a06fafd6c7fa589fefa2a2149a6906247c742a533059f96a8f2916d7df8f15083c5dae684270bd81eaa8e85b75b44a00133c3dd7a25b51ac599994620d8bea68be3a76328a61c74e451d76f55621d19391eac84f456006a5eda9fd766b8476d1c5981a59df56ca6ef8b439c1284b6052c6ce472640e0f9027c64424693cf928784efe867faa194c69843b2f0fae94d847317e59b665abf3432050b465982f58c59087f823664008a0682d0c435503ec021502e2e4438bea56e72ebf9c7046042c0d4fb7f9c6a4f1d023470f1ed51666bd12289321e7daa59a3ef04f8e0dcdd5e39ddede790c927e8a3c30efcd161bce990490d885c024a1b21e0e9d9d66252ac59c51a966ff7b1e25ef22861f952e72fe7f30354ab79b435905842b29484c774440dc90f12a24e1a2d4122062f28c1d04c0713183d44b3222d05e00091d16f4779b4ecc433c37ce9373d4839d4a6c5672f55c4185f0491cf118a6ca48ec92cf3d2656ea26e2293de841e4c830f1e33c8eeb6d1d0b23a7e2d81adc3fa255d4a09837d6d9b2b34d2007e80a58c33d912ff8c22c55977a7f0987551cef828a10a0c9bd1d131f983970e4377cb70c6105668b102152831213b61c81746d0e0a1490f473776ace5316e42cf110dd27d48e731038d89b9d203a66dad9c1cc782d13ada298acd66b3c56c5346ad4b152970aed4549dc41aae08ad2463819e6b0f72fdc1d313aad361f3f9e968a61c84f1e2ae876f73dc1d82b3f3521a6b11cca63ed57aa25f159a7306fd00f5e907e3956b0401cce69cf109d00f93aa0408547c9644c6f8510284a094943b3f35982c31c03bf2a7431d9ce50ef501abb1485815ed88aff67b31b6110467b9e3f31d5b790257cf247cbbe5388ebb3e3f384a9cd169f211fec69858628d990e750b20bf9452da4d3dd337bf15ee10154b68575d6f0d4c135df5812e6c00d960628437a974f4e05c6db7da620de7240d0c25de27d27305e3dbab17310509ead0a1c38644b5504fb713948e99bc9f7c52c7b84fbedb4ed53665b556abd96ab65aabb55aabb593ad87785d8f8fcd6603c814d42d431973d898c336c7dd304c43e8cee963ca6e775212f53b512bc80ea0c344fdeaf0919414c618c650ae0485aff00c137cc4b85c93e326c755221f506a4a42a95bad9d8a33834b43e77e80e7fae0c3dd648c4c7e7574faf6b852bac59b924c21f572ca68543e3f06cea9db8d8686c5a29ead592223d4778d52094d393b35c4e41125839c996e9926d3b04eefe4b30b8953d2b971b71ba5b439a536799b4c263095bacd396b85194a0921e4b9e79ef7018ef2c0ce7f788f4281b94fa7d3e974728b3aa94c28e7509ee23a581a18e59ce7d50250600d9cb3ea1723d3e18e8f470fd081b0e7d9236a0157d5aa1e5bd35d9debfac98154571af8fabdf282524806a9e4af3a6672e92c170acc27b78e02f3c94d2e512c9cbce34c40ea731e7f4a2129dd65410954001e240a6704a1054c00b1032a8066b22646104f4c7044e4036acca4571a0fa5d348f77008b747d4b90cc1249081735cf252ca1e40e84f67e2a5c75a8ac0b565c396057fc4b7417e8c4b2fa5b72881b34b107611c2adeaf25d4680bd6574263df4aeccb9e99076820de292a43b5d8c716102b7a6cb5fc9e82cae8a605e8732fc61e58958f30316800b3c2a5796c0b99ffc93d87d9357745d6c8e75432d6769647528047b1dae7c045d10a1c1120d96ac6ee044064d64a05464bbeefa0de738b3ce2425cf743bdd9abc47e726976e026f8a9cc01b13d89227bfe93a3739ce4c7a9d4b9fd347c3d9306573f29853fecca09f92abb5e996675249a9e469198b2da8fe7479e428c94f8f530afd9444b5a29f4ea3e431bdc79c3b60b043261faad71eab8b7c5a3aab6536805e051b85e98835d9d48621c68d14888c8e7a8ce9a49437c004e12b89e2b4f58309c217944af3153d9c2fe972a96531de9cde79c9eae99f9754f6bcf46e201e6c6c48e6ababd0b1a82409edeb92aee598af49743ec3901c7dd681bfc836ee5805c257fad15ba01f25184f29318420a943d80fb85667cd70cabc1944273b55094db0741a1b10ef6dcf73cea9246f20d3f8e9d27f649024e214a434b765cf204738b74c519070517780b98f4a90d46c54d801036661efa31224463e8747b196050b7e08c30749ca98e286880f33a8e248075fec24e13da162c9906992c4104b98008c309c08019116216041953be4f01b86848a1d284172826fbfdd352548964022240d7a4513eacd273fdd156be277372bc678a334416cfd80e9929e07d22f7ba82fbd9652d6a674d68f764879f8d59c93fb8cf3d187599b7e656573deaa633dbbfbfa9c1c67e76571d65eea93ae565efcecbd9c35be355f0ae2bc4703e9cde913eceb9efca427636c59eff76a8b036f68a15da05fc11bb20e3fddbe7c9bc61d84ce75c41c52a6f8e0b06530fdd20ea78f00059e9ebd5ca9b55e1b08cbaa76ce39adcb0e25a53d813081971e3f182470fce17a69abad3f5c2f5d9ad1b9e43c82b7434c690bcd571cfae898a3b70e6d4926a48f3eaddf28bb6ec1cc7195e3bc82b5f98a7ebf883bc68193bb9cc33edf8f5a3c077b7a068e9e579646a3d1a0cce6e461e950a5e851d63ef3159d7ab4699d2eba949c4b2b4d2e4fd28f7ca6b50e5d46e02c6b3fa3e9569fb6466c03ce9336693f387a9e343ab1e822a55e673a8c968215d661750ec4b5ead03d47b0f32c4de35187f32cb1632d60a62d2d3c3a64b180f9c70d971bd2da8fc20c81ab5327a1086759c653bfc1c2625b5afce62526bd75f716b0078cbff80b78d3d26225ce9d3277e9d23bff70662fdfcbe75f44add04213b2ee0d25087e20ece7bbf6fc8bb397d802667cc3596eb41783e2a42e4117afac2fcba1fca3fa912518347172c5128a6281f3956561b9e12c2c6e33652c0e63c3c55b2d073dcedcb3bf74b5c016035efc7319dc4130071877ffc01c8af48071f71c70f88bc7d90bcc06f87d36f365dd3fd87c5987f960f3c5e22f9fcd34cfc272d9e22c2d2c2c5f75d697f15b1bd6e2fc44b1bc637d15b5028b7fcb8bcb0d67913e2abee2feb5acea06d8b2200bb2860458e53430fe3975697b71ea92baa4ee381cf40c2b02bf148f287a3bb4200eebd65f3e0df4dff068d3281650dee22c5f8bdff8f2cddf68f9327d16972cf076c8d2b5907216ab05cc3842dfe2d6fa6571e944be931e8bb758dc1d67f6e22e37401e39381cc65b2c608b012feedee3c51dbc2972c36f70802d16c799b9dc001dbc81015b2c208f1c1f29345fd45f1c67f602b280354e60d03f8f71bf29d2c31d87df14e9f1e2ee37457a8ce02f1ee70b06bc29d203c663c09b191c077853a4070e87016f7c80fe02deec982fea2380493e9e6391e798e4710603b21c84cd17cbe3ec05f4f962798e4a0c88b31cf09338cff296ef47447ac9627dd5593e93df387917512c60be7916d84b7ff1ee45eacc17c5fe63601c0ee31fceec8a23dfb587e3c399c17c3833ffe44ce28001e37cbd7c7136adc959bece575f966f035cfdca97a593a7aef26579047ff9beea4b7de075d497bf7cf31d088255de5afa4608bcf77a6b7762a13a975364d6e84aa572aaf26ef5f97ce51f342f3da216703b44b9c43dd8555454babbdf44c34befef935256b06337e1942f7baf026d7ae5b90af4d487571d6801993f813554e7bc5e535f6f99cf3d668316907909d670fd8231a1d721f51715587af5ead9955961c7ae530ad20e61b8ed52173980a3122b6edf450fe0a8e4086d4aafa78c5e0fec2a0caa1c3b066f30ca4b812d06ace4e08132e4a002a6c4190573b43dcecbd3a922c905705126e726ca5ae1f00c5cc1fc23223d0563f37054d3278240512b620c23762006921a0b8488a090628c2044927cb0417c760c9d9a24694815cb5062051353ca4725562079eea3122b8ec498574cf1e9311d4b016193d216645e767e0259f759a1b7773bebbbf1b17c36beae3f5687d46146707bc6f45b39ce2c656515fec953c07c7dbe4ebed211e9309c8e0202ceb14806cd39a3f4f1b13d75980c4be995929eae6ce0305fb52d640af229751bdfea8b71e58bb1e82f0e53c606159f0e43cb6c388baf348b8d6fc77cadc0d9a8dcb5cfd451ed1295f24ea6a4a4a4a4b84bea285739c6790aa4be0aac5bc81250b00e512850a6c31dd3947fc0e2bd5f8e4b56ff24ff9091999147b84f5af44cf4c053679a51a27cc7b227bf5fa743478752a660bd7a94329bf9fa017ef52f70f53c43b3820559334a94990ab4a1c6098c72cf559ee245522957798f94abc09b22359592c27196721c25ca2cce543278ae027dbeaedb7494286f3365edf182d34fdf0fd8d3eb204c103d20790ab3d65ab799d77fc0de9a6aa8ef9e3ce538b3ee3a0a6c9dc0937be04d911378e3f9cd7594e3cc6ca689fa9df4bd057447f8bdd54375ddf5529ddfebb09087b37080be73d529eb70fbce55dc8d1cba26b0e5c2f56e8795d6e460eade7d19766d66077bceef674da7fbc1886886bebb3a7f5df575b7f3ccfadb5dbf9d5f577d9df4fbfdc904847e5fec44bf778a6fed9b3c4720e31c799b71927819c4e4363d5b2e608f0b3ca344f9bc9ace72750cc7f465f04dfe030472ddf465a9f3f7ad75f2368bb72613f51a6f98547ef747547bfd808c93d21863a4534a4a9974d25afbc5a65ec3c0d461c079ea281728e84d193b25ab6c1b1839324a628424a9ecce6e856225c1322a3e5809911e3ec77c4b29654c8e897987b5561a5aa6b2f90032697a7e2a2d154d1a6966502c2aa9edfca48931464943236d38bf2e43bb047390de7ec11c8af490de397026d86c314a601edc0c53d68aa0758ecbc15e8fb3f899be70bee6b44de73e9bf99a289a0ea7bb9c6d991881912d8ef454c943a3d186cca4db948eeb7285e901abf88adb9830aa2fd7c3712b475c0071aa5896b92ac0304fdfc10459b98acbb0721550061b2e69f3c52347c5573ca25a0c507116efa1e22c2ebf1c722822411a549c058cf375af09ccd7e4281083f3a640f91d98f1d753d2143a20928216d8f85a66ab2fce246a458527d6d868da292dd36d994016fa4d2d4bb9f9f811652932c706cf9baebcdfbeeafe887215602ee5ab5f754a6faaf66a43df9ec360de173ecdca601c06f47fbde752c0c0803c260a15ac8f1e92e7753e915a269b36259a53f4d4e3ce533a979e52da534a799ebaf7c520e4e78bc18726b658cc0ae1e9bdf70ad10ba81cc87d15ef8074ce9deebdf7769e5fceb3a1431c688ecb08dc49419eec3c4f305a4021cf6508ee514ff5d631937b2ea174ccbae752492e75ac730fcc55a84506034e21d90bd8492da25e72d5725c8a9eb680473d1348082ab88af07ce8339e4d4ef79ba19364803de73c1baeeb9c3ca53db83a4d6cd7790bf4bbeb9d5fcfa977ded7b25133709e4815fc1a3cb0c579e79e9fc01607be209168b4e79c02381ae940f9eb9d0467134ae5d0199509dc7975ef400dc8cfa7ebf5e321b94e5df7bace73ae7a9e9fbcebbaaeeb3cce4f9e73d7797438c30268a0e1ebf1eb0f1f8d7a68f2f49172b475f2a9910f3f4fa7f79ee7790bf4bd4eea58eb85ce3df7c01aae77e00c1d52a72e98fcbac96fe702dee490d40324662e37375a60940417b31b188f28195afed27d5d44f568f1229ddfd60b26effc012d7fe9fcf479eefa8a74ce7d8d62e17ad749940b2617ae5f9728173cbfde59d40c32b4b8cb7bb4fcc523ea012dee026f5c5c873e22891fcc5c6ed31a9857becb7773038b1344b1cd60401d547a20c6cce52fdf8de7c5ec46070ac5cc05163179903a2b62bde56b6d81a99b3e1c3aa4ce83074f651329bea84f1d44598bd309460bd849f3824927209473bcd2e1afeca4be9df4f42710096be00944f3e48733719d73ef3d367127ce4fa7dad42f28511ef6ebdd07d6c0f975aeebc0ec79fe21f327e764f7755dc511face6dfa640199af60eef11d5883e779eef1553a9865debb1763164be8c20081f3443add7b6ff49ccbf4f344ca15fc21f3d7397002c94e80b314ea72bc75d7e5b506ce13a86329a73e835ae6e2b163f4652d38c7c55b52a7947b2bf92b4f29d279cb17c467455cac16bfacaee5b258ce9970be39ee5ef73aaff703527f82730893dbcc667db1c31b5e4d36dd62c32578dd66def8327d16b06dac3ce52e5f4ecb0ab480ccaf8035a43cc555be0b48e7fc54bd937b9e075a40e62f58c3c92f386dd349ca1773027c3de5294a533865f2940ab79623709e48b349a5913c53c60304ff497ee79ebb2cc19de78994c3894487b8e06f488b9b3e2924691dcb710163dfe897c267805842cc413df5d9744869a66c36e997ac05012da014ea17f53c9f3c75126ef807751a26d0b119e4a3337941dde9c45170da93df7befbd5647cb728a9c3c88cf8adc1308cb323dbe73981d1c3b8c1dde6f8252e8fb21f326500ee500f3e8d1086871ea3340405605f69cf389d4b15c63f074024da12e70cb37937a3ae9907a4369f1ebf422a0059c4dfa756ba589d42195b4db24620375202a7f28094a387bd46792938ee51f348f349b746c4787b68e5d50053a919e529a89481a0ac1d23b1ccff33c10ccd7399726fb6d397b64a30de003893fbaadd6d276b52c0040ae6387170317ca054b62f4123a6590185d8cc934d65b6fa5392693775de7b17a2e23701775b87c1dd42fcee56739eab64a9a8d0af7729ecb75e1bc3b9d6ebdf5ba4d535f5529e5aa5beee22d3758408f20487324389528cd05b8813af68269e8af73de412d9b368f071687711e6ef80bcbdd7968711c1e7970f1cf7968b9cb6ddae6298e111c67e6eea0f77007bd3a88c347006f46701c7e03ba3e07bd87cb47f0cf417ff95ad5631c6706f3b52ad862008cbf78f597178f016f5ad5f17c7137ad0a5ea0478c03c01b10673977be38071d00e0cd0d001c00609c2fce637066308e33f3381b610430ce4010e6fb70e4971d88fdfbe1c0b83e9c59445dced621e73041e00972be023ba8438ef3950fd5403044601e4aa3391d3b798a7776e53a5df9fc32f8179c6e3357a0ca57befc037cea534505cfd5caa2565899b3da58d958f95cb9cd5c7d9eaf7c32afe22a608adbcc94cfe4f8537da9af7bdcd41db8f35c873994d621e77408b879a68cd2fac571d26509a6ceb9fcfa5e8ea643e5ad3ba77552ae23707c5973faa97ea7438efbba04cee1739c7cd221572fa551de94963ae4501ffdbad29479fda2ceb94ca2ce717ea5b73e59fbe27cb548677d71be6ec4f9aa511e8ca36a98d8f506297b5a0bdee830b30ce0661664f9c8c3e7ab8f563d40797dcbb02da41f8d820031a9439f65be55464176f09926465b8c75298d65d8e4fc7e4cd007904859328c83db205301ce3288170d67162ba4e12648dd06e1e900a4a8c227670925487082d904f20117459624497a810aa6df3827d0bdb54f0b49f07b80dbe767e26b2a0dd18e084da529ebbc9daabc33a5519e0bd0cf4d448dfc6d4e97608641f5797cc517f55c46e017268c07eac31eab566ee8bb87aa12587ae686bcd6d9edf2766d361c1943a0c962e218d143133288a01c1931c2250a2fd41041101143a4600b5b0bbc2dc8f8c286859204044584706504d199a66e4293c59dd1c6c51c91623ccae1f936ca39a26d321f8d7670f2f8a3d10e4c4e48c418639c9f0a88a6a3e8624b5a777cf5fe32cd3715c0d3d753991c19f6349fa7d34f664ae9f4894365379192b375d2eaddb04c1853065e75d878842666123aa2d319bff8735a1db1a676281db0199a8e4dc7f42508336101a9cfe3eb3aeaa33cbcee641a62f2f90d617957e095734dad388221a1e2080ec91430484d284e78d105120b7ec862073857404146115ca421c60f0a2c1a2968d064714d9e3d230741ac21c50c867e08426896c3ef3098a0608b275bc8008bda2cc3525002ef68071beb63582e67b9fc8ca218c4c00659202d1d8133451557b4a00a1aeca084892e38272a4a021c2b5a4002237888b400028d9803244c20460dcac841171f9022050130a3730c4d11809ee5218a882eac8d745a6a4bb2965e8ed28e72d5a957b0063acfc0713a994e2f7732791df8c1626867dec2f0d4bb90c2789c3e1c5fd64d9fa5818bb2a6c4a475175d17e3ed58a6f68bd3ed9c94eaf00dce213d95064433c22089153915091485a2bb78a28b28beddf359d3647177c0e0003282e8e0054d82708312cc322ec210f6f6383b22e0e2a70647d4d01941f75149117ae09ab83e2a591ae306934ed2faa86449682ef9ac3e2a59ca8952088e4ad480825d3e2a51030731560009e9ac9689d66be708ed31363bb84f850ee5910fd366470b2a803b7080ef47256a143d974590182e402c7688e182aad031f9ed4ad4b8a259cefaa8440d24be7e54a246cf67d810643e59fda22bb0564234705efd8a83df2bb1267678fde4b565d775de42fcce71fe661aec69fae9c3f93987689b373fd0c926702bfae9bd6f45301a0d01848f46434001422aba011314ca38ba01cd064d1050a7cbea3c3aac0e4b034f9735481fa2e333138f1d2d43e01d33d0e8e8b07ef261e041c3043ad696da7458dd4e6be91d1aa3c7d239e79c6ed3611938a6baab63acbfad7b7dec00526badb5c6a5cb755b90857609c2c22f308d8e5a1d8535b0053390969ebde7e1a6441a9a6930a12195451c1cc174ec50428439eb8d084284aa2333a4f81c6b6940f91c97bcfc53a9923fcbf81cd34294527e0330f2d3e104ea704eda7c4db7e9962103e7f0e76c3a2c8c350178f93dc0942ef958b323e6901e3387a680a9a48e0e27cd844da129243bcedb8412639c13a8c3391304eb700255a1ca537d826093086c0acd29f4d32bcc66078cc68bdb4f289634f13322a163466fd84c944921e20b96bd0e36fdde0c06d147253d203d013e2a01c3873fd5ae7e35e9667d9c15939e34a5599faa549f5428a99a948b96fca44af549bf66d25caa499446693589b37149dc118734974c9fecf9e9b0c3e971926765099c6b524df2e9d7f4599bacd993474e6f5510ae8e7b5aa60a7da8c3698dfcb4c99e7ecd68ab493c1dcee93cd487d2a80e0d733e913c2630df3b39b02681b70e674a0c3f0c4dafd33deea6e2a28b31ae2c3fe5285ff954be942f461a1e0566ce81d44f79ea93284e86850cb46740c328b0f0e8db65666831eac30638df7bef2da3eb1cafa4e74170f67a3c2f3e7f38778ee4bc3d7bbd63c50fe792a7773aecde894ce0ecac1896eb26050b36c35a812b26cec88aa201a689208c089c59b22a7d8521d5d5af66c160713543e7172b108a018c144243580c0d19112262a466029ce950fb0011e908e1949f9a1115d46e4e88906e3c984ce087116699719329c03419bdac33b014c2354a816793a443082cc1b504f8032788418307273f78d7c1c232e1bd3cdf2ea58c5f7c0cc84781089cab9252c7a257ef9b93b9259f29cba94a0860e9ec54a5ba6473ac4bd40aab0e33ab2ef5ab9598c0b977a8ce4c5a1ad569409c55a5dc3ba6bc81f88a77f60ecfeaf258185c14f8d0e2550367576d892a88c4099b2a174081b317c4c8112f42ed04459c07f159115a2d06ef8d36f37af29b325c342b3a3ae10520c039d68608d2b14d800a24b963028f0c22610832fff0de358f626e8a0886e80d5c3e4d199946c70e2a7ebe1d062654d25813c1160ba7975508e7583491fa863bb8bd291891073de21449df4ebd98b05d32ea50c107dc43b08ed6118600e799191a5b0f4c31ae298c7cbb87924746596b489d2613765c77099c5d352764aecc50d1b7c368661a8576f0079c2f0a9d23beface64628e367dfb094e603f41099cef1f0581d2cb92c2c9b7bb622e653965d14b592e168bb2288ba2006796ecc6970c7d862583635e3706527c670a4483a29114404d443e81330592350f4b66864787881013c59295cc142708c1f9fa60bd8893389d9bdc178f628cfac4a83a5b15bc21877a82162166d19e6449f483c8d2b7dba0647b1652bfa20267b984a846d4592e398a4e56b23370f63c6c23c24be2612772e4db63642cf6dcf33cc6555ae0ec55e0ec1e23d333adc389e45cca2a82b337f3d325c1988a83cc5bbf710bdc4e82109cbd34702865b49ee74d5f0a62021f1b7ed4925427408002cdcc10387b302238c312009b2981916fc72e5c0185126cc707305b1138944c749e71549ab488c4809882fc8925b4c7964b7c7b1e002ac4f7b27e82a211143a42df493f917c963f9289280be38bba07663984464af14d53f08dc50038798398cff30c311ffd2378c3cd4f2965fc9aba7c3abfaead0e8464e88d36d84c9d78b2e89d537ae52ad04fcf61e8670e4664edf9ca594b3d2c02675a80251cd64ed3ee616d92000fb38634f976574c0d7b2cf7564ac062b1d27019020a2d2f6859633504e8db5949c8d0fb44135939ea7845595ae08ca98f004528e38401e725e8910067fc981a3d2134e373b5c0656419c44b9a5d5996872d0dcc9394dbc1f9c690e78b95134491a3dde4a75d2265a7bac90e9b300bfc1252b3699af6eea2cf0620383af522d7237d6b28414b2c670b3bc42bea784531ad74d222e04cbf1e9135947eb57bde6ae572c5c4c8c8cccca024d8b71b9e353a0b5252eb2cc89f3d478ae2b7ea7009dc9e2967bb5f9490afb70ad2f97696cf89427b01b4c0f9c29800e79594a00e749080c9f4e9e191cd070db66f9fc0132c057084a5872c1a6030c9ea155626f0e049a027a2784810180110be74061a78c099c20ce119a6cc756b2166c966a542134eb0276792c0d98399024f1a73543a832682ac4f223fbdc6395f681c2292862d880267fa8e032023dc9cb45a9f93ba9521120c530467fa3e91c8143351f4ed2b97fd300b09ec853c18b284ad56c677c76a4b1049b284b33799991829ab65cdcab2699a59ebb06807b708e16c8b2612f1d5dec41114738aef8cbfe9d349f345002f70bef86f32a0de97906342eff6ed98156b30fc52d2d60baab70113e14ac00c8d2bacc90b002a70d846ac2819af5822a07dbb2b064700fc803d8cf1259d7a2fc1d5e71b9a102a8456e9a7e8db63649a26bd355b131c6225bef3355ff3058022a0ff4ca2cba99eec69147e80c0d9ab4138378fd4699f9e1e1e267e787a7a7e7a7c8048003484aed24829250aed0420024f100a3cc20f9e09a70cf30c0db67dfbca05055ef5abbd5d982584f3cc0ccd6caa4484a2845011ea417c763dc6b4941cc7711cc7494981dc340aedaa17e04c5b9ec099d282e87282f8f46914801a8576500767dc42023c654a5dc189a78f0d9a40d3e767067d7b370023b89b76eba48cfbd63730b7d24f1a2d4f9f7acb41039c6d9067877c304a42e7db2f0ee2b3fa794d6780fb46a3d1809821e142e2474aefca992370be66dca4cf2c560a4cb0f418eae8d09c7cb74ea3d05ed3853423851a900067499b4d04080e73c618638c52c6e9d52b0884b68c00e70825d208453a5919f9d064ad94dacc3a25edc3e1064887ede4caa4ebc99b139d9cc598962670963a4b9fbdef20bebd958c8e903d1e6b0498e65f4b3a50173b80a3d1113b7149343222c9cb1585c9486983427b4c0ecef7852286fa1589708d55e4472152bfe20b45d8fa65d3310801ea982925861014755d0c427e6627bd6e62fbf831f860eb5864a253f4f1533108f9e958eb049576b28a25a210824c167d860e1a2c98d18c28702002ea4dda1a2a1032a39f4c16b3ae224089a423b3ce62f18310b38ef3748461c60766ddf56000e5895977bd8864872b9a9855fac57c114f0760c10e7698d12fe68bee16a3a763ab550096c0392669cf9e0a71464727835934d650d54393911039dfb567b231ab558738dfc7a11d0ad1c92670fc485d2c21381a8500cae75514e2a18b1e6324907ca263364fc7f264e2a54b9f3d1db343f014ec0a677c66088afc30c41b8500e8b30c8ce6a58e8f73f6fda5a629c51cb26df3755fca6e9df98a2efdc61adb3cedf39108dd05daabd3be3fcf9359daf7d7f2bc3fb6775dd7755dcd3f56363352aebbf7defc63c5c5d8f909753dc618633cf94549153570eea321232400e12c87961c69590c02110e863c61021fb2f86216cb30d2c58e114a5cf1248c5996495ec6d8349942e7d2bbd6495a26a12c894b1a045226a9902fe9a7938a8a8b0b080a4000279cf0b969349fe5d0cba6c9215982fc8670efb42ce5d24320706e9d3e7dadf3c53645bf3f5aeec42c7d7222573ffad9d0210e1dde504bc49eb3e5a3cb185b4e2f210a2ca7aca293fe2f65a2c0511aa06354d801c38e29f34eb1430fbc37a4a1f387fd6cf8804cd9bd76de6779057d9c7005962a47e01c06499de9324a389cf14edb958707bd1763162b4687d944f7648d26647928e951865e155846d9612a05eebc7569c5cfa75c48b11c67967a800d67f11e379c750394600f1b2bb761897c44ad2017703d45b5e22ac718a752296f217eca71dea6a4f8ca8a0ace4b1595a7a8dc66e28f76684aa5be4fc211b23f22129e27cf4d5726a52f149d44920406d2e8071e263b3821f2d173c0e42308a45f7a0c832841104c9c3e1a055144103b4ba827b5c9e9c81a01510382880342e802210253ca472320764e42968c8408e1a57b9d173f2321647842bc403579e9de54a283b1819025498c7cbe443e1a09f9f9ecbd91909eef3e1a09f1618ac07bce2808a28f46412479e971842efa8d1b481b59f42a8a39026a44f53e1a0df1c34bef6cf7d14808ce4808345eae7c3412c2f6d23b939110472d174e1c781e3a181960e9d1730918ede43cf7d18888a18f4644007d74fbd18888249ee5a3111139df804e3681551f8d840892f1a95d5773c6cc09baab89f0f4e4e8a86081775a366f4bb126526ff1b95125990e512b5039e78c3748fa03c443959672d80053a73add4b5289e65328d6dca66c3ae9179d3ed8a713aad321dde9900798ea7c431141ac699d2993ddb5f7722e1aa5d11e22ce4ed9bce9dc564c80a353aaf3d17053afca9f2d43e02c956a8d712551edb6656d75aa4379e80f1532723bf2947a54fa4c89d0214a446b4fddd656ea589e4e6ed427143a6f2dc8ef08e5b3cc71d2b1a8c40c1e5e004f3d4bda53181138cfc8cac0d9f5140535a4924ec71a6ca1d5de390dc6eed941210ddc394a4b1dabf488a58c941876843a8cff7af9b33567af78628cf107dac718638c31cece2e57ec24a531d1a78b312779a21d06a88aa8444d3576492c95a281000000000314002020100a064442c1703c20d3335df80114000b8aa64e78549809a4248831858c2180103040000040000004b37103ee0050510152ab06c334aa23d61a64546111202742d4ca06e3cfaac7a90344a8f04212d80820e20f4ee00126ae7d959e5b2c0de2c4a99fcfc2af6d2bc199a74a112ceba66362a4c6692c2b464700285e1b5d2c5caa73e1fc2b447c31b8025c30e11d78ce88e77b68876188c5100625c7b37dc2f8ef21c7b3d7efe63ce4144600e2c0b128f45960a10407781735813125f7025d69533fd841f2141cdcf403707a14ecaa26f3673b7ca4a6f1738fdce599ff8b605585e5d5bbf431e98375945d3a542a263c214840501aa76284d45218498c0bbc25d9db88a4c4e42e7370c88cb609ab9e6425353864c51d250e9f711dd3909008baae98d7747ad8a04073f0770f6d39c05b8359b9e6c009b0808199b5a985fe988c654613e662fab8053de07659379d31e6c20a8f5995c9da06e6ce0449decb1e5cb54d17c5c6a5be6da08cd6f42a841a772ac762bd011b71b5f2c0603d4bf2489691e9613efe665c634c2afc9c7f3e1fbdff9471c6d2947208ec35e9bf1823b90e219e0dd02c9a9d4832958a43d9be00395ef5fd04966a95bf49ea63fad357b79f70bf321723e288f375997f529275131e00e5641c4a8a9de59b9c1a758231767b99146eae5daa0980e58b3e391cb6800a733d64413222feee04385e70245bae7cf54816d1faa02de8dd4d5896f9403a9f37b3dfcaa95402b7035ee707782a509db6e11c7ee08d83174bb352bab9a11683b6bbb8aebe31e80aab5367a98126c254ae02a270cf934ca401ec686f36048802fdae075a3ccf348506364c44b653ff0f5f4546796b62006f312f2d7ee830e8721bea310344b6652d41ca221d55ea873cdfcacb83c81d3d064d6c4ddb0101414105aacb80321737ed9033c41d1f1fe8cf78cd50e3c0ec886d0d7861c992a081d7e6e44dfad88d61f5c350675e09d56695a11ba3730ee49567a11fc720c6af0273dd7f3d67cea5397c254e1dc4eeb130906ee318b18320f86497313056909acec7cbec1a65d69c9e5e184db9108108281efa1b2d7a2d2ee12b9e56ceaf387a72b0d45d2df7a8b08c01f9cb92f5668101ca2852ba657ad9c2adad6e93601f029592caa243d8823776602c36c391773654c78148246ccd12f73f9bda6a597cf2780602082520f7b5b7ac401aa68714b0c69862d6f16fd67a92610eee9520c9829aa9f69e94ec0c1563c849e6d68d42530a068e62fb8a6326406183055f5dded58f34f077e81171fad04315da01065b5c7ce11ae9988b11d760593cef453239f68651b203ff84ce05062cee38463a0438ce4b93c6752aba5b9c0c023e42cce57014ced8c187d6d670de8edde4a00ae52ca037d4a8edb868a01b26bcc6fcd7c8306db2e9036e938ce735c7327bb934c1ce4b8595c441ede18bf79cb7881dcb074ff53b8319538201accefed1ab546aa3073084d3c7a227da1a396297438cc3365cc338e3bf5213699c109569d419ff32fc462ea1c311fd4bd645d45e4a5f3973e447f242c0767439b8c4684132471bd6cd64cb5696d4e590b356d8e2a08c6449362b68d4441fdf3da16c093cfc225f724b13d4158d570980de17060bbf7cad3f8c67437b47ccc0e72802ccaf54326c048a442092f5628b768933c6d18605b1f6d273e112ff9a9c73be1de17e188fe293965a0a245568b9a01b4b76c0c0fa5427591ab9526e5dc1d62f2cf9c0ca205359f1b1768092db1eb9d3588c76d1080b46064721661790c5d09428a0eca93b977b7b145fe4889eaf4031117ac0b453f97a8114a5da362f1025fb04d1cd3503c491d1c6be2baa44617d60c729dee4cfed16f131d669f5dcf5bbc4d00c652961e3db9a8ceba2b399869fd52f159ae6a4a1047338cc02b153feb0904d14a73571ac440580d03097c2702982a04028420bc91037b26891d1084cb7539653767994e457bcae6e0ea63a00c65acc52628557b223384a6c4b2034c3bb17878f65e0d187df755e2b6460ce0ccc2e00cccecd938911a8516e994e8c3b0920bb24c7e2ffca4c6075ffc904db334e92f3482902010bbd6201fd48503c558ac4bb12d0e9d2538534124655ecb5b6e8a72c7df1bd7f87fbe98873035415235cc78805fb255c6d28fbca8f0f5b40080f1e9a127c855b34f9aa6fc46b2a6e697988bdf0ce7428d7a6bb9966df413cce8facea4a444000f7696c23e694213f082544587069820387238f2c894804beb80b7e908713bd85bdcd89aa5e91202e167b8eb94adc07c1eea8910e16051ca767e823c44eedf40eabafab2cf84b137ccf5af3538a3958ecd5463e4ee1417ee285ff7175cdb4532cc83625c734bffd7bb3be61e3f285efab380eaac44d0f49a331d0641bcd72bb3e87dc444717de83c2109a5af02c712bf80abc1a2086ad3418a9dd0979098163102caf714fadf2711b271cab8f375368715fcedc1a9d079934f2007d2fa51de76e577ee5b8cf05a8be1f325856dd0dd339d471e32f7472eec9cd84eb2d52ccde5f7cc7b2e033bec4a3ae5c96dde8cee2eef8090ed2e24b3f71e45d2908e3a1056d92d6329bb354cca141eb09c1796a336246b7c0e73fb1f29328267246dd18b2c5f75011d25e5ed878d847b7b3305cc593cdf880c6fb49dc17013c1b36890e9c0d94ba0e80d1c2a92ea9f6603bac5f690ca49eb9e58473c0e76f8d06ca4d8d25b311e3b6ff5ab519a796058ee7571795f7d8e1a54130fb45b72b3cd18bc1562b56d2814ad3af199a129a4e4dd90a337c3f341ad1041f60220acc8c89e17ca2863d2f6c39c4183883a8335881b0308b09fdab82fcf72190173b211eeeb19091f2c45c5a6ac3c68e7593ebf2b54dffd25c4d30a38d31466eb081417f577e31d4586e7f51c5d09a5c76d9c7516b95a077ea4642e113a68935ee7e033dd886609219db905d7ac9cecaef18260ad6acb097e18c89833c4c1250d6262bd868240ee9187afbefc3d0040210c233181857fd9095989b0405472839ab7b8cc19c55615a7f43167b1f8c4ec31957964f958ba4e1a1eb520d891e1875f408f45e551b148a3d580ab017be918a9d6d17250de757c37613ca89d487aa5d1b9b766d6b15e776caae3fd9f997a67532ef9fa13db9782450388d4f83d609c72f2d30c4ed8da171dd920b66b44a1998c7e2d2970c2e3706e447e1dfd20b2017ae68dfa0e55a52f8e857322258e918cc08df4465f61c36e439bfb974f9ba97018a9f10aa0b28475524b6f23e4a293579df6cb49294863ee02f480aca2e94c19caec88c582db19d02f1530bb042659a4c55094496527cee65650e01b35838aab7f9661220c06ca8eb47c7b442e53cc74b79ebbdcecc23a39128f46485365d984bb5b5c3787cf5f850be7255aff7eeeac9f8f486618ea1161394aa4cc05d65f4203c0fc4a96f69e29270a612ee863c4cb5e9311e975433fe6323c87001d15d960caf02f091a49f3e92ae46ea07761e501acf07abd378431fcbb1d59a1557ed3a8d5bba8b12bc973a466871a4f276b889577f64198d924c48db0d8cc9228727cfbccd64067035c66b98af946cf6f70157bbca51038b0b3a1bac9a08cc4e28e791420ecdec0c1f9eecb1f6d838addc70a46c50c9d776bcab2003254338e31cc43a71ff4f0ef3ab47c64560829bff6561ca4ba26764eb1134ae41aa8cae0d43098522c22d8aa26daa3de11546bce548cece909984ae6091cbea58a942207a6c1115093e023e15f9a7b751844c08c63ea5c156235161b9981b3f269864441002772b2c0aee031803484531f8730ab97a9e0208e4464b7df5a719a8a494da4797af23092b30aad71b47b0113ec2d5e259cc66bcd3df2d0478db57d4325c85aace7bb6c7eec74a2f3c0813efcc425e04460b2f18a20e44d2f3512b2159c750364463763335648ffd7151a2cdbcb203ac46a7b3037fdbe2dc6d47cf62a83fc0fa83eb0804d0a05f2e15467ff1a7d509004b78825e573106ef4bfb3af903b1965bb0f1f596898d22217e2465893ac3be1c1bcdae629fcdf952750368a32dcdeabda2675a3f4c4a8502464b33514cffe2ac59ddc1e97cada82f4ee2da428b51390916be4ea29aceafc2940626e9b7e4955a0deec73ed1db44e36d4fbce1fc4b69c99355e79a9a18f9e8f058db6498f84193e9617dfb1f552b2e78c75256000eb1c4c678e3d8848eb658483a652eb1c76a0f73554ba2d6ac637023d56b3dfadae89204bfb5b52945b5d4571e0c08e06db55700cbe9e8f2e8d175d8e915c821e56d2252411583cc4830491e6955733804abb6514739529b653dc673916416f2d4c468d31831e1236b78d53c5c69fa2c52809784892984983ef5e864fb0f3c09359a8380d80bb7b881efe345a42b6a0896cc84c1ce435ab9da8aea5c67eb78bbd3fb19884c10011cfe723fa460b342c13e9a588a43d7fb4858cb45be62253bb128d773bc1da5a379bc701258f54998781b3aec931e989b0dc7ad654f0e65c179d560928a845f8678134d7b5180c90a2a977bf49e7bd5f4380bfe294d177ccc8bc1c737bb2a81571b9da00fb5f239f4738b9cf21cd7df2664a89c17e933905784afe36d9d2f118266dd3594ecd272917a1850fab9f98bdaca79a58889a4907dd26f854b036bbb6e9e390bd091778b398a46de5e56cf23c1f432c0c7302fb9f8350b1afe567fc755ac097649b63695be4692298252f80b5066ea769c4b4dc1b1bf44527fca7181206b89a64239fc1ec9d61d3d9f921c1e63c8e5c14d77ead88d5e692d8403edb2794c836017e9cbda4b58678c7462451392072e63adeb2f0f62ac3c5d7f8ec695299871e1eabb6157d5d2c784260332d2e43a25333a309ef325e83e58ca0b887dd38e7c99056f20afb85a88d2a3c44c225fe14ed11f3984caf237a2b6438131715e4605454345426984b1a973da1e067c807fcb0289715af2c2216d9b9e954017a5c44318a518e9fa1ab14ae7eb4b850ecf55ed0bfed1ad3011222340e6335c22459e1c275bc3d7ba9d481b23920cc854812872c176b3c4e802884c8787ac493eeac6b13ac65770cf3b3dce24e20bbc1cc9465daaf5662a61420f5ceb9aa552bad3f5c5ecfa1b90f1ae163a043532f09577a1b9dfa26301a225382b0fdf62ba372c30fd94396e072b0d8658e66859cb1c11ef884a6ebdbc8b252e9b2d8a93582b52e5c3a0cc42cfb1a27f3971d257750b955793f3fb1dc4183fd789b8b98f2b3db5806dc3738cfec46e1a60a7d046aab4ee6d18089213a3ac84b7b38073d490d44e9e50bb16da1db4801e9f86de6700eecee467a40e69d5977ab238a4c5e02c643d5ef99821d3059e4fef732e78ff704f0b78ac2ee9b8e91e7d01c3e7278f0788366b82e479cab3444c365053937605e15a1a3a8fe424ce16466d1de658630229131f91ffc2418691c636071ac3be53bc5ed47a26578b313c5c45b9e0ca4a2ed4069dc0b6791041cd9e33ad45cfb400dcb8a8daaa32952a7eb9781b75f8d5f3b7b23274ffc1b040d77f469aadcd4a3122ab14554e2f97cee01aa3f057e23d65b92a96135e9a86e2430e8d25236de6b62cd50530d472c983735ed2423bafa68b5e93ade1e940fe34e149c9a3163201f5203a696192a9dd5c02864e8e446099c1f80a77020c29eb971be91c6ead19cb56c4b820f8ddb653418531df01d473b52e81141600e820702fe04e775daa18eed528e96aa7ce3ccff2c8869d33d9a6d5e946bfb90a1054bc738e247a987b74e6edde584a314e4fd3e53a8b781c1b530f70c954b668647c45dca929783dde731169104f2b27652d050a09ece1c355bff97d541a14492bb318c4498d0a8398e2dcf0590dff460b9dd1c99952bcabbab0b6f472f045bbf578b599552af5d0c981a72f5d0eb76c640ae5f1f6b9920377c0705d66e629dbc95deb6fcecc10df296f8c0bf807ed6370c403dc18bcb9bc7def68c02d7b9bd45ce79cd250b5a52c782a58238dd8b6ebc502bf6fe30cad61e0c53f8a9625ff34dab8def1f4f73e0f4db2affdb8e201901df9201a174a9ec27282c6702ed58477d88036d0b13dc4f482e7708f7e1ddc47527ee1757de3966291e5fde9d8e5600ffc825d8b40e9e6a8873b4cb3a24214be02edf12dc2b5a7fd8f7a096f99ac2e75b09604fb4c79714efaa28e2c4755883caaa182353154626f11528ddddcf1e948e643a754c8a7b24ef3fa3c95497e9fe4130009c3f50e8214a554656647747b93855879e7472d4c1b220af5d4b1babea26b2db3819f7fa5fe5843bb6796f75b3b854d5021e737b5da6a9125908836a8cf9e48987cb502d47230cf9385ca6f2a53eb13f8081024c605a0482c7f324bd9842ebbfd58d2d1c3595e393caa1673dc72a801392a43751f8494c3b5f0608bc61e209afb6c2d5430cbf37e0558c2789ed2b5daa481f02ea09403facaab28255dc5177bde700d5b061aa18e5cdb3db53938742b531a933f187b366cc0779b100d8a88b31b92b48bacf02c33fef02af021829eccca2512b8a4eee502943a6c9f8f1e2bd3ce0c22d24b3b1a03e957072c109e8f4fae7ae602e1408454f159256e0ffca1734d3c381c01c149742b59505f221234ee667d0d7032f8612370e02a019ba30e7c05666425e1053dab3a442dbbef54797f44855968db2cfec550bb78f656ec342f0965f04f43a889457424d50c3209fbc491851837a8070648b4999c7e7b47677d10c37ed2c5a368fe2fea7deb7aebe712b3b3a7b2eb4ce23cba1d28c9e5e0a35892bd05455bb63e0cd0ac3863dc3625bb944460ddcf6cff6312af02ba738e9d234ee32256ed904b3372dd1be6814cc9880cbe24bb06ae6f3923f86097688557e8b8ec44f371275abea94b8a24fc353f243a402ad6219f29784f9b5e73063e441579143941fb28940cdf34df8b65f656a1b5d5a4b19350b1685b9897595f6a44116e617beb2fb8ed51af594508bdda9bc5c0b396073460124bfc01837ec7d3f992439b8202caf4741ec692fb1b48361300b8d8878b49effeee0e5841162ac3978c71af18ec29690751da2c81ac0c359e28c6c47101cbe743d95fd735e332e9cebb849c5f0fca6c8a5b2febc401e4972f23ae3bcc94b489e562f7d7da62711d240c80d0594bdb77c13570386e329c03731c4c633f9a7a5758dfe49350b3b4cb5a930250f49700d470a36db27a0900f745b126c73c445e8bb82eb88dfd89f4ca959718138096c04494304601d28807fbc47c9930d6bd0143a541f1161312a8c70338272dc20523011bbc6df74d3f9448f0134fca516ebc466076322c3c48ad9f1763f0a729e52f1e9a4dcf02a6e0da28de962193168bb5a2da89d9daebb4fc6f2bd590008b34685f2b79c1fa2112680f6079b92c0d81bda8f136d4d68f0346cf594c4fa916e2077cd63c6b43ae37d3fc7715028340896535ec42ffed9c6e7ee02765e6f48ec3a55250564df0194cb089e6cc49ffa38735618bc5d219cc07be041b3493d95f0af0a8f860cc3360538861a5f04ba46ea1cacb8c14f5c9af6036c4458bf58a6701f3b59e04911996b81e49f71d37a27b8cf00316ff9a47458cb2bc45e133871a15aa91a0e61cd3214d650ef4c39614f48d72d2e479f08b3ceb4756920d54103490b09b57650c680db320009961528ac23b9043da40bb283c2d110bda4f9c0e85abcf6abae02e1872036616055d511273b3710174af3bafae5144787c642583b506c1f5c171484e02cdd2e23779274e770ae4cace91ec3f0468cde38676ce1d8f94a1982bedb5f9afd02415bbf0efa5f1daae01ed8b4436de4a5a2479f7a7c63d171b9075bcfa241877882383879d07d58cafdae8f3193e4b45ce0e7dcd098f0cb46950ca25d6d7b959a312b66e1010e895d1e43d7380951a96dc866aff51f03958ede9795a42d3b672491c91107c6bf38b65301913911042be013c89018b498d2b8008b53a81b1dab98ce75cde7ba199072defe5fbf8dc0035524d6121888cb54d8ac4aeb9fbc7a23a45da08fe1870cf284d60382cbc3f85ed8d3cd4bc5e8da013611fa3b06624eea6e9a4b472e012b6f5f7e045b0e4319ab1d3ba17d497bf1111622c49a5e6e1a511b0604b83981d1efca746df8df15a39d67f32fda5d0b9f17a4f4a933d793ae81f42c2137c7893831b02f3993e2f54c94db7ec75842606a9aa289e1dacc8809dbe40b4379ccc5109f895251fdaa7f8e64baba8265dcf9090710ef063d6883024f8e8c597af5dd2ad58dbef63c84dfdb54aabacf77f52129b90c98a6be76b7bb76607c18f38c29952c9e5b6ae2e6f3b59c7265103ad299ef7d280ab3b116db06078bfa3b4fc83088c155113f220abd8278ab24a0b6a412809d48d9d80bcea6c1f4e16a66f98b6ff0cf056d99bd63f66fbb41e524e4f92e22dbf96cc17185333027c728046c5748f40da6a6e64c8fdb8df1234ce8658c28cd6e2cc0a5ba4bbd836e292a8eff93e834d79e1b9855b3d764f292f7c54ee80f4e3eabe06359eda7370398e5155d0050c71ecf27049aa36715b30c1b7a43d0175c7b6421724b2b083435e189a3127e92b5882b71339a7ef047947e287b6c3058083365ab9f0620a053b77604051f825f80669b3baa2b3218ba59208702583bea93f18a790287ddca2e7fbe82d086281700abd6914e4df5796f38bbd5a1216fb789dd94a55e9412280583ced63f477f4f7709ce4019e9dad6868aceb02a1601459e93f656b15178756cda9d782a6eeb379fdcbbd4b31eb1314c839a051a6f8179acad58feb33c3488a60da715b7263479f46a14254616cc2732ee28f926e4c5f561928d9817e49f834a71577d21601b0e2263178ff4b067c1df21ceeb28d60bb24ca61f9defb9081000c8acafbd0ecc7300e32dbf7e8c52662639e486f3c4854c04ece8cb4a0ef26fb97b8c53215de44f63f8360e61ec23450fb099870d098bf9bf177d225aa82b42182adabb53d2f880c9b03a21498c56c2af0ecc964d3468fc5f14d4356793c3c44dd43a83429e58ea51e5b62674b4486525a0e2cddef739483e5159c9220efa9b0749a13892105d895ae709c026727a828b0eaee1f6b66f182908024270406000c7bb9840c0396e1852576418cbbe3e40161d29a541804301b29ff444a858d9c3168c9d320629e166c20b5ad50365c45200f03103ac12d62f884817084c2995f136d6bdba131417aab20e4a68ae8314ae72b61108d89a3e821f14c15941cbbcd939c7a53646c7bfaab4ad6cefcfe8da4efefffec02b52c2385cad634f8b11608cdca510c2e47d737fa785ee927cf8f07750dd325219fb4411002fb082e8760bd4879489a3a2d8135fb7686ab0b8a96a633d29d7951a6015810123a82115f061c0010e504e46f99435b809a55534582aa019773519dda85db9843151f9bce7631b94662e433d726bbae06c6e1f60bb7f3c436a3fa43811a5da0a925ffca6487ce748d4402a8b42aedab7877f40d5fd45cc00abb18db97ea372acd307545cca183ecbe7a9297e765c29bc119749a0499f9c3a5dade010dbc06e3b4892ec8ffa2761be6c8074fb804da63de3f9e9914feebfbb06ba629c87a193a6df4beda7097d23f379f5be6dade792b79e61a5f4fc5004df95c07c2cdca3fed2f7f26bad6dec8051fa5e499aa69947fcb02e90f23b0ebbeeed329713a3dffd4725e7b540375b031c2f2839d05bde442a004ed7cac8d93d89c160f2035c3d06af0567b2158e5fa0df20b4ea5b1ec196443ac6ecf852512f8665c311009c3f428ba520a2b16a18bf5a1076f49bc8b3604b9e7debee2b1697936b0ae0142824f8475c8e99b062c9ef3e1d6351b738444966b4840f8fe78c03f94442e4f24494ce0eb6d8c49c2f56b53d4ac82c734a2d5eb3a325216feef5b5c9f4c44b0d168b32f0d691d8a82bb2d98f5313df9619ecad8238eedfe7aa206256fa36b952cdaaed548bece4c0a7d6fff029c5b165c4074d0486aa739336b6583cd0ba62c20917e19ef7d118936195bca71bd37c32ca12ec861a4626a31e8bf86c87a40857697f4778ef4855dec802f44414f9019ffbbdc18733d4999f0ae561f26f5debcaa14ac5211b5c661f1f233c29aae603e0df3862fc5af0cd30991593f4ec39416f4b09083ca0745c07064c9acb924cb716bcbdd31aeb1714d1839b42c37693f830f09bb23e0d415ac2fd796dacaa276b4272bd7cd52c15de93563046c0b02a39e982d03d74065d17de7f2dfa7bee4d6da88b032ae958369a12595bcbc8a5aa3ddb93de9209f1bb60dc0bdbddaab98ea6610d6c05c891ad5582e9b94dcdb3552f031b0ae69fc48c4c574715ffe6e890a8d623e1222d45b2ac03240f98fdde005e25a38f43c99fe21140facfe2ba817b42777eeb51295c1a8eec5dc16d070f61b62b58ca2a4904152deb76e9937465d596232a2948a9ee36b919571125e4520a16274e11c5f2d5947593eb52804c3b5c801d6c698b85beb33f24e0f1c5c201723d0c7415c8c0f3c98a0d89711f089e6c6377dd7e3f90bc101078a46565d46d1e394cafae32ad1b20275a44aa0e7225ef7574f0f2ae4004eb5d89217b7ec7b17414febf6e4748ae328324d77a5488973592e538fa62067d8586df9d487dedbfc781ac65ff5952134cd730946d7183901a26bf21a828be2384e2b0c1dc8565b6a30a1cec0abda730c0a3c26bbc037560c786772d7bbf17941e15e67fb31fa9290be891f8677f6411bd6b224bd57061263ef083856c9cbc1d310ca43458daf4ed2a85d807ac4003e55ed4f49d6d0136c985132e8da9a099398bd51c860db1b9d06357c16f577efa798f00426d81bbabeef053988721568a9eaa95afb31acad7a8de06c5f10d90697ee1e364293639243447c669f9be4f4b2a83be33b1620ad1a551e34c7baf85b0cff3107c77b6a8d6239171dfa8fce0a878bd139a1419d5705f7160b18733bd8c49a015e827dbb531140fcaa12a94cca75009693007edfb9d1c2b152449c0dc8529bca6421e58b2e31e7064453cdd7de8e7d959c701406c0cd03f8a9dccc21e5e5e39f5d9c06ad90240a44b2d9ff30749c829c20d9cd8d20999333fe2cb4620f8664a4c5fe1007df659d3787752778103dbe45e812fc2939266a8f70a63fbe188307ec79b2ac9fe8373054a4098229249597cda0cd5f31044fe176d25b575a1948990ff6c21b6204f520fd7d504083c39ddc319f60a6d40c09eb18257418271107998925120e988b395a036f42f8b7e729661b8cfdf0fff811903cdfe118aa73af7a2a219c1d1ec131c041ceefd93dc82be0eb230311cc70032e71bdaebb5375cb463b35c1f0bf29e72aadbb829223d50e103c07392c1d10d3c607fbd0db7e95472abc8e03a5dc9956861ca3237c3dd75fa3ecc644a6865652f63224915fbee0e08aa8eb09dabe0eb3cdc5768127fd2f2a15924e7767bd5f7b2aa822a6f59bbb07547fe728fe9e94cbce232b18685e1789df02fcd1d7107be82f6f5e7f12ef17a74e058f1f00aed4e3cb7ec68354ea579200859831b8dbd269a56246804cf9d6fecbb6b611e8660bb2d58331abe646fa4b10fa7b89f1dc5c5951c77f9a7b4a058e146e63e29f47a63d92f69da1c773ed518f297cf6e95fd000ff73481e74e5fd3dc55562beff884cff13705ccb825b77cf748c6958b3e75d00c3336ab4dacedd0244372e50c0c454d38a94f9491b615b89205632f78ef76fe212aed33ba4c692aed1f980fc57b2ef7fca402e1cc0ef75a49cd9df92c3af916865d31dd7051696c94f7292293ca65ca73f9a6a1f14e5664f8e9f44e829c879709880f74f268f19d9276e36fac9a2d823aca9ca62d259704cac128172856fb23886681fb460812c457e388596020114e66aee282f0dbcc6d25fbdc6838253ee8ca3cb54b9d36628f3d41eb6af9629f5ed27dcb513b2d22dc0b52b00c254c3d39c19aedb5b14586bbc54ea825b035c5923069cbf059aae93563779e4bed2ba0ddce3a2452b075cfd99b441ffaf83f46b7841369d99439c711aec3efd64a0181b30fb88486982104b13846525fc87132cd201f4e4948f3e5f86c2982f0312d1ed7c99b71c12af5da2be0bd614f347d1f28662c20e5948388bed461378ad1602a88fca31469175bea8b608dfa3b31b6110c6576188c8751f9600f72073f8c40716390bc14d0be344b8ac1971b7e1f698155a21e48afcf5f817608e74143471987a4a3b3a9f45cb59545214e2bcfcc56a8fc89ba02f8b8c009beb8a04ba392340c8d1734db982fef3b3f887c3b85fb85b848c33e16127fbf015a897225198bd01b744d59a9598837f90e0447f103e1b83f62b7a2c95fa9a7379fc29ff94c2aca436cb796cc038b490aedadbd6e4a7a003e817819708cb378e7913b1533f5744ab22796a6f95c6864a49dc12c260dc1956014335f51ea84024296d80217ad083789170877e04e2071b12ff2c5e13605041acfba96253c463e6b427df16eda6fe2bcb161af2ed99c72909e6437153a4a633304583f10f9609e62669a7f2c8f84abf164f1f97234b526299453dccd1930f6e532ab3f636ec48e1d75163ed1b16a89ff83a8e112fe9c7e64019cc8279aaeb0cc496558b1cb95d5b4b74c5b767338cc58c76e537c7fb607be9d27d73086290843ed4751caf00162a08c342c327fabc44448cf7a81e20ed6b08292baceed0d728165c6a299e01caba5ed54a3963a49990a0e0950d0fafac2e10a4085615dc07108220c75eb60cf001fc00285ed75d804415f50f20439f0c2dfdd6dcecdea95d0a8a8618d802562f616a48e82f761ef0e96a7042cace0f08fdc6f9a27c4ac58d7678fa537ea60060839a6af0c45e57c1c41339a89e19f63ab52b15eea97d4a7a15f2edd37001bf8feff3449b662849d4441897882855b2764734483196990d9ef5e3ef7589e6a94e00a8811871d90b1b784d5bca59663cd0477486476b8ead193501c5062b761c4bb57079d16756bc8866ac1ae1b6c1c358d885bb80f3aa84672eb43a68aec5e1b003ed7925cd2d201cf3acc1501ac099245df859d3de19ece73de2bf6c38e09e4fdf6aec516134919012c575e88a3cb5cd1f47d59d0b33802b2f4769de57dc5424a8120807ac76cf625759dc0a83485994724bb81c1e4f0d92043cc4fd803752975cbf14cd70133e08996741d5757b3ba99f9bed4d77ea58e91da5c28aed608c60358024c465a9ad04046e27199c22e402494ee13658873d350fb23956422d5d812f04dcd98f3e9b8d2bc4c69cdf2112ca9cdcc95d5eac7bcb240c975d8a5a650fc1b0480314b5471495429b68728fa1bd71fa2ab9ddc65c53ee81a34914952878167eaed24f455c81730d4f41ebef9b3614f19b160c9b1bfb95ab6bb00cf461d786ac24e31153d4da49715d814e66eab10035ad257701704314b305f745ac4725a086efca6cbc14c08d25de4084228109ce68e402d5c9a896a708b98839e5a0d12561c1e1603e068f54deadbd6082d179437a22824f458ed212a5ca93714d21a763b537cce97130eff27b89174d9ef18b9284c795a9cb8b33d0840cbfcd92cd34a370ba967089acda6f2b2656e3a6dd4e8ef91ce8f62fdaa58a108f62d7abf4a7aee4b7f04b6f5d6ba9da347ec125066f19d20d3b42dc11e1bf549bc5ef6b363bcc573e91c4fd0582b0a181b7e4dd4fde85d716765592a66deb055d4a8e05608f36e67a1f1acf64e2034dc07a9f7c0a146c0768c421d47d1ed69a3210929e7ec61b990d770bda57af71b1ae98f8dcebdabe235096476014263d05b5aa113069e784097b4d5031c828f39840fc38f0d7a69b51109e0f8c441c7e33ac675aabd62c7e23a662cf55c15bec234356ef6bdaf64a854e75393e97b08fd6ad8f9ba57f79282396a229a1ec68fa906f0b5a6f49c182a94f081d02392cccc1ec755a4d103342caff80fa1898ec62a0171c0790e84ef5f39af825a0db528bdf97d4b2540a5eab0cc9c67002830db4f8c18456d1d79823a56a93f988b9ee943eb3941c889551e63888f4c264a9af31194f72e579b4e66b7cce12f0137b81be33e5b16bafcab0d1f635bda31e4867192aec1dccf6f17dbc2dcf282054e145cfeb5e93949dda5a98222a849dc0563328c3f6ca36a9801094b8e88633dc1eb7527f8178fe08b1c08de287bcf16c8a56906f40c13cb2a73248ade48879ee77c3099823db9a8ad4030ffe9612463b1e9e0a8e53e9b8d905d2b3c8be8ab321aea62e327a7310e24491e6773c66aa92262a940b2fa1bb2c626be2b05346a15d73a32c8947fc1e71c5870bc7a48364b99417b5594641727e5eca9880eb3c568ae4d9c437d1e36fb90b0e4cbb44035b8a602240eca9223661df00508dec3212e0e9f0a529b70cc1041c454d5252e1893edf46af65d7a647baf089ef73e3b6244e1cde6c9eb156086c26de767b123e75b40ceebabc1ba81d287782027c69e5a807e7840c0d692200d236b72061be52ccf89838fbf2eb5dcd7082ca0a130765d9d114727950346c1e0bf198d290b5db1d5132fcb9dc596891bbabdeb0ba45528a529dbcb4f66909179b11742e9feb6cc03208a35a767f02711cb5a02ef1bff0366223d155a65b9a03da55d9dd92b5e56dd242a4e9346c4158a98dcbe55ae41a524177e241ecb402e226d9447b36320ebc1072660f90932f0536e0e75c11bec8340b59c16e6f68a9265a41ac018d0f75b896cc45b883257bfebb5661ac85ee4db40a5aa1258e209540bf4d24bf68a9d80bb64d0d9a6f5a15235f81196e38c11cbc0d90fb3e8053a13a90b3438285eee6bbd741271ca1b733215e941b1d46b9e9cb9b308f1d867a254ac35e6e84cee3cb8d12404c12bbab5de6ceb924c3967ca420b31818ff29539b0c6181818037cb7557844758895337e5da12aab8f21b690c352a9de50e2fbccf5be993b4c05a3a700655926e33139ba042f06003c981c189a56325bb76af9324b469bcb309db3539b5c37f67e7aabe3644bd152f0137199967fdd7c2bc2285b0e60a3913a923e530e267e142c2f6724b4336b7baf2a9217f4417d588296fbe981a565fc9d591cf85fa728cc4d0fecc9c537bc3d5d8799548be41718feb39e28f21aecf3063b7e3dd562bf4aeaf5336651da86a7b02ed4b760c6033fae903045dd6bb7621d3963f3843d6584c24a4c6afac14454362949a3a05d137f91129e3d12cbb6d61dd3e491486c2234b2d8e9d0ffb99d9420fe88a8344fb6ac71df9e8660e0ae8fe3efb9c4ec3d1076b988bd9cd57bf03ec6973dfe987b0e21a1ef1433c00d17c6b1dbaffb1213ed87e49b2ee04e6d9aa9e55b8ff12b09d24ada6168b550cc38641829bee8f0da276688e82a91742af49d39123b65c08d7d29206b0c907d41d8557cb06fc5056f7a2e149ada448818e29e95a69be5a79753d3e1c310c700b69e95f4f9e0f107d4f742e742b69a8a3b7bf3cc5611646ef8cd74ea514a30ce08d980c88747609bc8bdd5663e1f6992444daf2ce3a435a5476955352ebcc843f8b677510cd9f8fe7c86b2bbe5daea3fe845b5b5ca0fc80e0e857559f9b4a7acf740bad3f73c0c19def9a165793fd44898e040406a800a58cab0d09469452e655b417759b3c746abb48461384ac95b41973c41a034620bc004dc4ddc8bb60278baf7e0374cb893a2deb86c1479674ffc41e33b8d2775fb637ca6bdaf22a807a33b9a0084a45bb631494c8ccb3e9b9d641812f35e1c1411623b02f639f4dc94cc3adb094a99f7175fac687d1a8f2b1c54f27a46ca8fcef8a88b997a84253bea8144c5552b7a43eb4905b15650f06d4ed12a8ab8fa2264c9ec840e1c4a8481b24de699da72e160ae9157cecc5fbb5e8f6ae6d17ae8488649bf6fa8114f0ce9604bff4dcd5d8b33d984d1d87dba02b09396a561177c278061f9092e857789a2b00282b8265c105cc463bfa67d2fe7cec0a5867bc6bf18dfe99a64aeb0cd41f784a96497244cb3339960a61d0f5065f8632b90b7dae69bae6268cc299d4fa3e3414150c5d39a9e9b8b0087a8af49801beae2e92f69b4504b339bc25850cc521bc2f8700fbba9d7935c6a515f8ef27d9f6d6028a55f08bf1b736c4c40610bb9b149b63533c27ab8cf2d821c6dd33bad3d0460458ad6ca024e2b06b458cc23e5cf041e46c4dcf9954caf885f1b9e7111f94b9a8873318837c53321d54fa5395e0f8d4e8fbd11a5701e370e486cec7477c69f68148ea40aec6aa1e09aa3083b09fdac2967129f02f92f582ba2696a958c42ee394caf0139945dfc083d4ca900ab58442095bc30dd483b926c9337192e1c09bd0e8e386389e896e803b5df5c64f662a4a43d251ac83d578b92c1a863b5b3d23e2f6b705b8bcf05de701e9f1c6f9e021211965f654226fcd5cadcbb393a28edfae34252c74ca4e4be46181116e2f9f53b4ff77f1cc108c0d6919fda26743573b0f82f1671a2ca0fb960ccd64ddc15c152b8232527f6b60311afe55cc130b01c31b85f30b585f69410c9b17e77c08ac005f16873cf3ae6d00706da08da07525eba672e8b6860e58488860148ffdca0112cdd9519db09f83a3935044d8216cc55c3d1603bed2f14735413e5a43438937e9ecfe1833bf28eb4d20979308826593f12eca48ad6a0271a821bd2dc21735330daf9a9be4a5a57606413755f0d1f8e9b11e9b7fe47ef0c252f83d5ad0c7f05434c582ff5d90ef192d8148632e437bece15a40546829b4b11aad6de0a2ea67b61405a2d88242c357bad8ca2cc388ce18acdb974ef3b4bdc17f3e9e76d55b2095661f13c2b94387663c0af76e8f45e79451d865e6dc8ec8ef0a3ce8441a46bad96628d2b60d614cb5523bc2fed4d111ab1a1d41ac7fe45d3412591458733a3c7d23b65cbd1fedcd0bb40d6b4a02ba891c71a147143d50028fabb05bf1d906bb5980daccc401eadb35915221660647c3ae8fa23928d7758b7ec530aed51462ee49bb8ee672dc25e78ee2a08474bd8621cf28d022abd4ba9fdc137d0fb14d867c9eae2f2fbb554eeccc9685dae37b5e93d73ff667b14f09b4b435b2aa294162a3078c8d7097d4153bb1dc17cfa65e575af652b341f11e2d6fd954d03745937c35a7f363e650990a447a15f39619f257a5ccb9a19160edb73540f58f4b06461bf96ea3e28d49c38549adfb74682d60c1fdcde7c05e363bc0d6a5458c96ec62b4e90ef8460483f33725c047c35eaadb0849461880238bd6bb12587d0fab39ee58e51eb0eeff26342354afe03079a6091de7b3896e8e0f42bb10798af7a2d388d581a98a5bc42c35fe986d971da53ef0be7a81128a97c9615d0b1b99403a6109b1c0b12fb356bdcaac5cc30152ad4ff1739e56d8c508171abc20eae9c17dbf36d72bda3c945439beded8c631beee7193077006c6d339e35d09c407619d796daec5cea3b1d1af56174befa69a123af057550a1f488c0c9bae4dce3726ab727e83a174cfc5fdc0b3456cc06f3eebdeba42526676a14aeeb1807be8f25e91b906157d7d01dda5be09f893dc066a554f865cbdb16bf37f420bfccbb6db6274a82383c6cc0c2663bd200108c7344862f4690e92d7c8f00aecd31d8c46172a1e64af0e72fe9f3185a57a71e814ad5f0f0d33f7db151018ff3cf7144c6ca1b5654757449ea57d9c165b0386105717498d620839c39f85b1d01228153bbf43bfe1b51ba9718f0108fe1c0a09aa23f9c3d83326a65d280bc6843c6dc4a3aff32e86443923dee6e21340fee839a99425694bf86d3f27490e877f87981767acb3c407200097ac2108093e6069b0c65fc1c8a4622d8f3553ab77213a68b8a65a53b2ddccd69111dfba6c35ad64f6bccc50c664f65cf77bb85edaee120162497022348d864873679d7c6991f3ae7d445e467dbd9dcb45927c7dbe358b5c31449ecfe0d217f7913e83497fe781e4d22554577eb1ad0b4162bbb27f8a32cc61b50d4822e493bb0749448100c30102a10e50ad2c2b443654187f34322280292a444e6a4f5e38a8809d0f470cf721e29b46be30e59018c863b9e33826395679098ac5285882fcd6b6e90d0e3b1cf3b47cab42aaf44111c25885dcf068e4311efc18606a885415c9befd0ce3144f427825a8937a257d529819a237434fd7b7593e567778962b9a195e0b489f86417d63e2987306850dc0b81511acb5b605d5831861dd6685b79b09fcd3286e7a4124989648dec074f41cdefc3b6e6ba2037b3956ba12766682f2663696e53680b2ad68ef66a182d721e95d4055372b9b6f0cb20a5e0a93a9fdc03e8ea9d90c36e5c1de148378cc8441a175f7fa2b132c8739abd90976904982db0164cbb92ad3d2a8311ef7d7a02df5096383aa043cfdadfa0decbefd8b1aa7be45cb49a9b43228dd31f45018d17bdbaa7baee1d7fb6a403536d288a72aa4a277ccc6c24cc44ec1ee699e7ed54bf465bcbf458b6b5abdcf988adbbe7e7c0781b7e277908ff99487d74ddad48ad6b0f1fa8b4084ae851ef522b40ddff9c43f01b1d2a7247ef8706f58e397a444afa382ffd05cfa4a6c3d3d3e089d9e9430b8666ea02c5e458deb0c974441e73008e08f45f678334fde926d4bfa5c3e981e392949b415e67eeed162ec6e9c23a1767f33f74b7518a1868f7988f142417575a151096074d80a48b25014be6e60344fac207ef408a087a7f76c08de33b718128de5a81cdd11a3428eec14926c49d82c32a9198c5d237e62ef6ab5ff73d6e746cb6e5dd22873f7e6cfdd19a9c3175975da1abd0f50319c20b78fc1134084460c4aea6e687913fe590d1af85329a8a8c48aecfbe909287b1c46efe93b820c2da46d2d77c6c39ef309a2248c219771cf8a138e448ec2a5efcb89f01044d6bf12da439636671931b1cd53eab02d753ce8604850a5999f4bd05547d5cb57e1081290865be4854ad50098b2c8214c04a39b7ef77d64fd9c83ceca301058494a1722bda91dbcb1ef063588686c82c4de671fb2e2b093e40ec616f5e640423f96bd3fab2b15f9dbee2000294b473e099de8447d0eb5309ea2af755c6023379bf91c3151593bfecd2c0cb34a8a97754f398b8b0a4bbd231c0bf30bbffa1b0c908dcf5a4696a517d7f144fd8ef82ec784225466c9b15f57c69449cb13652fe15378ac979f895e06751ab406b440662ef70db2132facc6ffbe80542c9059bbac35650ebd7b222d98effb024a8f0eaa81f52dbe2a46282a76159e1c2bcf1a6cdf3511bf8967aabab2e6ceba80b5cf16aae7f813c02d7b6890bd403533c24ab3841425c05bd644f4372934c403d37ce0cabc570eebd8c4db011860c4212206ba48589d8dcb418827efa7f311d2076566114f665f5cbc00fa1085af326100154a905e6fc322015ebb4d4e0529c7a703834e7eb6485dbb687dbe2249e701a27bcf42b49d7e92ec7e7cac3c53d4f82e89ddd5273f96d4ae5264923e4c91c049e46d16dde1ff21466b22012f1359b3d69000d99dab16ba700c752888dd6d8db2304ea5aa4994a52aaed08e5a6682f390e6154ad1bcba83d5688e90f8d41da8a872d9c077a97247a435b358773246143daa68098731c5d8137714b22e2454a9e8c27bf21a4680e65f1474134a99c1242c5b66e81dcfd3d2f451213f6b0897d09ee24f6b4d5bb0913467002d682a11170fb622f36b00406181636404ef7748afbfed6e0e3433125871840ab13386f79c6f3080600cd35bb9468eceddc7d8862506245c511ec4951a96193b4714357307cd78b18c99d4663fb0747c57cf23cff60c8149f56544503002668dbc16f59f2d7d01928626f95b92a35ad016c0a075cba16a5ef86e24ca79f634d3a9e41159c39747a101be661771895b37f7bb58b171488000035e427f5b24bbf7dfbb69d13685029e18a0ba5222d2994a44521865221ca64cc482e3911c8f2fb71184964c22cb39d80e638253fee90ecc7a0ba82215e32f395ed11b2dd140f393e53040ceac2a926feb8311a00f26777ec2df32f3670e486c421167a83381934a6d17848171a72f3feff6c20b339bf3764e2cbe20d2a801b3da4aae68e4994523288bd17f29113b1f26ea448002e71e267b94b2739583a05d7fc32e4c33d1121d2e10d2dd344af1e97602dd85f7215cc3132602c5540eb16d8738bf8b3bc80ebe629f16a887ffab31b03d06a7d0c05d876aed78e7a344c7058f51034e099ee11ad5c3ac1fba0e2300978701e420143426046c26309d6905509ccd0eb99257c728ab8aa077ec3656ac00b6707252557dd9fb5b4684d6cffe08fd1c3c7f5df976125d71fef7918826dc7f94daac9dac60841e078217407afaed550acf9acd21a8621087b5686134d04bffb6ee1a3979dd1fd0080b2c0c4d84af73d03f23d1538c82d064627e329d4b3b33c1763b2a8cc4bd944d4ae0921cdf0245382bd5d3b1c3b18bac82cb3c12fb9980eab3b4c4c928597dd39ad744586c2330d7daa3a51eece85c80a38db0c4d47f71d1d24474b33909a6d13d33944ee01303536e3d3e0580077c71d72ee432b3170355bd10808b4ede9999bd2871f99e38bb5c818a2a2959442d12cd031984288b41aa1474d06ea129a55a5dace3b6319195f370d31d9a3099e123e2be5b4ba7e123863f99615a26b9b128f7511dc4f8591c8db1142bf5bbc325848201de112bfadd85365c70ce7d2c96ecd8334c2c6efd6e3543fd153434e9815a138c1243d61432069b95d1372611802edee333960c0ad5e301285d1a02c19cf4255aa48f20ccbf0b7386f0221761e3463f442ce99a6d9ea3ded47bb8e9d246b5bf0a86eb161b233ebbe35414cc6cc56f6f912b47027e02caef7cc296df0dd66c0c3c83ba075149a27840610100fbb6e45273e6b6fef9a5f5158bca3a796b7c2d1ca67d021db0d13f13f5e07825aa682520db76db087efdf9ffb36f05686f3da6cf9ad6fd4689fcabe50ca238777b19f973219e5870eaad83824cbd7ef103ce2f584341e7f7838402d5d572cef013f2a6af1b4b52cca8d062d4d87509d2dec2857ce2653b5847a3eab69aa0d0daa24783982f44934cd93c1d56a2746f95859f493ca11f0e3f2cfa36e72315c7f1cfb46d40bd5ed9075b87814f1ba4da58936c95be06dcb2f1c3d547431da185f6d9615057215424b1b562642d47248563259222613ff2bf6da4d1e1dd2073dd0fd4834c4d6eba97da2f30115dbf022107afece16ca59efeded5fc8e981159c98c4f4ca87c1b04358e4c50d9469b2ebf56e15d2d2fc31c34213dfc4e2c26b516c3daa0a4f9ad8e5a5c8b4a9e951e35d3ed9c93cbe743c8ab1a773c80e5ce7142a20a88a3fcb4789d6ef10bce4071263b815777f61adca04903c39c886cdd3cf7c536c81ba01b9e39e2eea62d6c85ad44233fe821c5d9839a321bdbb0c6da9b40308e7dbb65ad02d9a64c29df75d5e9dd2c75615da99d7f6a41564d1c41d4a6ee973c68dfb255659b500f4c6b31961e60c4be5903cfedfaf316045eea71061fb05685456e8edaf4ae6bdce5e2bfd276d6096229136e53f3d003c89aa71150557b39b1d0607851f268a42e83a700117b927966166688129284d107f9a8c54911232e573ede366ad571171ba30952a23cc2c6aa86fa167c8c7917cd6e9441a50b3efce0c3badf71bf17460bf019b4e658efd9da783b58b0fa85213adb7f294795bf6fe87614a6e59656c061ab81525528b223f063c15866c1639126c0ce60424401591fa2718e3bbd620b8ec0c1a3506cdcd800a017dd9f5631cca001103f42a98ded3ff7b635544983da1cc032b8b2ff8aeae8f950aed424472c6922a141b004033ae6a66e80d3a560f3b25ca02c4395f739ee76b65d5f5dc1bd76f449fd6d31a71cd8d27500fe35496e7c90d543d1641a5bac190cea8933429f83d10d86c8b297ee817a4f625667ad0a4df32ae5f7d7e42f0fc388ac1c83a7a55ab5377a34e74335305145308f017baa3f01e0d7da9f2a3c4c645194612a7939ffc06d4e6b633204dfece4b7feff7a3302d7067d57f0dc2f1c92d22f7371f21387146649d900e79430e61201ea26f16190e7b23a084cda3ef38710568716e1828c30bc6ab5497a0fed01fc18f9673bca9c423ec9d12662062c835eb1d295a61b86b0699bb7696158a55077e55edba4606bbad29cb3dad7d61ac94c7b4b8d68218c25766c0162021720a8711dad58e3137ec5c787e71e39824a626e6b5bc45b44767752935bfaffb5ff2041c77d7350daaea85dc0d5b3e559a1f595be77cf275035c57050cd282c2289ac3ecd780e13c9634237d14452ff5980f1c8cd59129ec947b7bcfc14c833a69404a4fefb810c3c90d49cf4d7a20fb057912857511917c0076d9b114921823166dcb73cbdc6a9793162531fe61d22b95a7f51d7bcf4c16ce15c57c0c080974d1273551ea4b3a20f32627fb02630eb71ad75c0caa82a952eadfb7432025c3e1eaa235baf75936ab341448a3639a22e1d7478307b7609befc96bff395b134ed46e84c444311e7e59b21b858e73c6a189187eb0c587732c1dfd1424b07a64825a2e849ec95f052602e40d3db65a74bac04d965d9dbe1a7d69b9a713596d0b9109589d303cfd13734c518cb136cf0b745780824c063abe94da2030f8318648862b5e8ed633947c9c413f6494473566420ebc0b2851f8ca80d4849867d36ab36921bca6577421e43f5bcbfe9426a4584baee3e862df16efddc897c74923d583534587178b592c1d5808c9a340fa8f6455a0de05d79901244ba71234e5a8c54bb55978e16760702e67090975c35c281c1f91af2226f13ac16c8551672e342c68841dc1ad687073233d4c43c57706b0b21375371cc4d1c070d0564babe6b5fca49ff301fc9e834b0aada02c5e56244e30ce6bb97d0f999036ab8cae735cba4b7cfbfe695c454ca258ce2168121d214fd00a51e7c2ea987c6b50d8337f9505710b001a12c7af0da7537d692e74e93f984b364b26771cd2c5f586a43b03951c7a3c074a9b113b38f3b1c09cf367a9f0945eb4e641a8c1a7c3d91d2bbaa0a3088a6badf5b3f71e4c768408a3073dc809c123e01d1c325669c57ee0d35485e395ee628e60c60b5a4549c7729c7e7ffde6cd19dff46669b3c3e99be0282ab2b1126c352a98c262e608190926434e8ee7fedaa0507d6e72bc2314c5e5743591693ce3f4c128c19887e0ad31fb8b653771b2b54abd47e03d135baf6db7feecce315f493cce2f0c2364b90612c2e1123230b26caf1a1e76a20bf05b775b001329be18ebf5341db6e1fec7ded1911594c16711c6edc8822b9927e9cfeb10e16b64bf250e255e82404010108c5e79c0e9208a22c85886b9eb653cb14a3db395401e0be09ed8e63051b761c0127d8f741379f0add898ebc84370fd77c1ecf153a20a1055f3c353f558116e9d464869e05398a5362741780eea0a2e25330a2c97836a46adede1015a60a3450d62a5493db240d0e9074ceb3d61a08017981db12c3268eed50dd489e3ed72b49cd2ff8915689f1a4c43c5a12544eb17b03681696a7280c39f19b4f67d111000fd343fc8c63c290b694f3c1fbe9b54aaccc1043dd86910a603464d4573ceb4b1f3ce15146e0c2b3baa9cd910b42f56204286cd931b834d2b43373a29b6fa5eb80d092b32f53983ea42e744c3adec58303a2e79b29954c1ea11c17be2c3c2b4577fca347e2e3ae94860b77d092767a0d7ac56a40d88552ac658d19ed00f31bc1c1b9905530746242587a3a9fd8015f48312294e9494d88fa27620a22f81bc294197384804db688b3c1bff37854eabb9110808715006ad7a9c8e4aae3cbb66f10dc454800692265c7f449d6312be4222b5e3e2628b6deb2f68131b3145b81c6b95434d698715eb1226459cac362b2af7445f630f2a93ec480cc3b81bfa24bc6f177c2e60174f4a74d8c445e5151b4499a03d40171277243d06dbc5d1d064c4e327d158cec2c5cc2880d3e4389849ac5663b94ca976b991d68fb600651e62534aee4244a8044d87015611e28ae08211b144fa8662ecc0ae7d05e42302492884c645b76bacc07d3f141b56d9782b6d0d47ce7865cdd603c305bbbea7fcafcec2efbc4c0a8a8145cc0a2aea91a8717ca74b0e789c3e6347100126175a3b3962cca3ab08c7d3e13c051ed3f77bc39e0eb6781b7c0468c020274f56052787cad6b00b6309838122e651aa6082fa78f5f468ad81c27cc1fba672b8b5e51da18de77271fd3f276a31a2735d61b50d978684df9b33ab023e83b36c35223761199c003113ea1e456369640814952ea99c279c9373721cb49491741a612bdd113225c66c05fad8d01e00902bb56690da46344ced576d81e5322509537fea6c36048a7a0c2447ef63679f23ba7b8233bb02e00489150a6f3b3dbecba976c05479ea8b949d4865a1910f978bf82e3da0c2486a14a3aa69d8d86188783e7bcfb26c621f07f35cf1480e540cf0f63a1a2c56db2fff45bd8511588b4aece27319d97b0e429e5aa5d3ee7fe13d5c2ff69d54289805a1612a30c35e6ac093c1237e25bb5627296d052acb2c9e1ceb04c2562dbbdb544dc79ccb13249ea9dd6652117e67bc88c530e0241a293e0577cf91975c0cd3159366eea876346c3c730482448f43c9c085ba5ee3e4487a0e3481ef8acef9ecf26c21074c2669619c975dac97033d0e8f41156e2dc136c7111a653b210f7aaec3a00eb8d4f768e595c087163366704bf9da2d901c2e59d011d7247362edba989a0c0fee103ee00a9a7979d5de433565c2977d641ef2b53c8679bfa79ad2f7e93910137945c7dacb1691d3a504ebe826d6568cd18dbd4b09a4393aa5eef59da91aa777518664094a302d7def6d91eae00068861a6a4e0dadb30cccc2b6921121fc8c4af60febc7dd2c6e435ec19c446a6deef9c5000a2464c6ce96c0ee46dc9c7cdb05464e2ce575a19496753ecd83987b3c93f51919962b3195e33585c8c4df5389ce16b26a0c210fb9cc004569f456689c09d28daba2bf045168269b2d9da4cbe6f6a47573b14130adac730623ea4d19b05080c5f665e8173a1a310cdcba25fc66e7b84c7082611a2848bde9a8285162b82033fa96ccc8dadf3413feb59a44d235a4594eb0d26675684592f6f2028c9f2ba5e66810aad6c25ec8408cd7a2a981e215d525938d5aeb6b5b3b390e2faa109d16935e9cc44e818494830eda4f2aadc7819cc94b2afc2745ca9b3e105e4e8ac29e8ff1aaa16be53bbbc1e94d0ce4b68c388b88adba45ebcddf65d30ab90a7d89151d400772300446a21523aac9cf318f7ad6553d49cc61e494ffbaa46bdc42a249386ced8b53d2fc537222340333fb5e16b23defe96b0aa20110602acfb6b42e1886d89c33e8d33818c7028f41ed034d356dbe8f77db12c2ba6d55b6f2fb0ec2ad868e61e1a9abea62e7e9ed55923a5420baecbee8be368087c1cc8714b93e1124c5666d63952dca5f4657f249baddc6af4f5b8e740979505c15a236815524c0e973b553146ce727bcdfe149d499459e8869021ecaa96c09d0767cc2142792e8ef683885b39139424cee3205fe62bc6f0aa2c4c73a0ec3fe6b6df201a4b743af57ddfe377fd59268a14b1f7799f126adfc03095638fefe06716c10b5258e67bef3d268070d14916d1d7c66e7eed9cd7d7a64edbec588494aac36b1eab42e2c3bcfaa6e09174e4f87307b38e9db98fbecabb42db94bf635f1832de016132fec5c5f40fef4e56d4bea65ccb7c04ebc47404c6cd995ef6a54adb43e4af6793c798513c10c490cfbe88c68e0c4f127e9263cd1a92ccf2693313a061c908ed68b503527c96c0d94bbc689fc60f12a529f3f672616891b5dcc6f489033a571b8e88f589c6383f546adca452bbfd3d3527a4fdf14fed1c175169559964f8ac27aa2257fa5644f32e72175cde91fd69fc6132aeb8a14b831ba2da7deaf159442509f34ac8b84422a2c122176238c235549e07103d30537197c5bd55d928f52ca147aac94c7eec846cf6985239310c6a5c17200d2422f6b724858ad113c50adfacb1c6709d05229ca8ae630c4a585729919ff50c7362ad0620e94e1996f04ea2713a6761fef95c83d4b7cbf7c4d26a4721e10715c8423366befc4f01a2349da7a1fec9215640023e1519a57b988c60fe4c11dce5e99f12922385b5743ad71d14123b469f7409e0fe8f957942412ab48e4a9c1d6f381861083afc932b710ff069cff1e470a96abc4d2271a9b23ff22a585c4abf20a824574d2eedfb5fa1c3a56e3cc826fd7cf0f9f9094a74a083ebeda3b95641e78b72428a89fc7785043afddc3421a690066d27452ff9aeff9e4ca57d56509acd34a9160ac70c1156a2682b30e6904100ac1365e107bed84b6c0d7feb747822ca2fcf3efcc48f43972ae5c2261d01a24e62301b37069e3afa387c0384643eef2fe0b9e239b4ab44c68869e30ed057bf7859c08b8b9ff420a0a6d6b2f1996b18ac003da9d0cf18acdd44a5e6f08c2579a124a1fef977fb2efbf435ca65fbf069abf4691649eeb72f02d7c12976a1daeaf00f0b30d0c5dc084fb4553d8b28056db895b51dce5194d1d676c7dc46566b4152ad6d5c513ccf8fe19277da874d71e58cae2a3fe25a3218e478744bdb2fd7cbd4334fe8f29667ff9a61eec9456eb24b0fc25d808b22e7f6d6849d9adacc4d6c8fbc89dbaf02c06a61f783e8eadb1ea39eba30e5040dac0ec555e13ed8dfe590c008c0745a83b7b32d9a46f9773bdbe2a95fb96a8d5d2edea94015512393708f7b99f04ac04c31c4c2a4f51aa51ac3844930d3766cd8079ad56d7de2fcf61a2b1c84594b6b91c58bd37380d2e4abbfd10c82cfc6731811eb93e253d26d86db58fb9eec2ff3675e951321b7ac64d428f5985d6421b6d3618d159e379893543bd88946de334823e3af6f525c4972dd56f1f4b658c04ca5b7b3108eb379742d2c52a342362124968efb18e627671b6114e9de5c89a3584190a9a547612c8bb2ef7a8424757d1abd2bb3fb70a537d44b1cb1e666475e93f6b443677fe669351e8830fc56622092e0460e9c7b0345e45513abed7763655d44dbe0da934233a353b438eb70aa291739753fec79b17b7af67a5b2e978f6d42aaaab0d794bdf8338c6dd82bd2440a4a07b9a7e5cd4657c34130149c428664607c8eac8560b2faf9ae910c8aec63a623d93d9266a7dafb11d5067c0f40f2976a8582afa64924fb6e3b5e38baf2b80c496f4e3e9f7d8258fd1fa4d817ac9910835181b7b31afc0af2233d1db89a80b13cf28be3c6db99f65e7469e3fa7a5c451682f6fb7e74e5a0f7a4e8e2a63b477bf9d7f9c1a8eece86fed094c97a443a418d8b93ce92db44a6ddb71101a9effafd61f1e4a5ecb6b76b76388cb58d782c268256737396cd41c7f5981938282ba7eba85888307134284465c8dd257a9294e188e36a635c7bf9d08c10d26355f368084edb0111d6337755943ac840ae3a1f64b465b69e87891ce9c340ca183960fac0f3fd697e5ae11f28746c60f5f96622bad9f2547491087b6ea2186f75d66070d519ab8fc92f30ce1560fa3ce69c77d32f20ddffbc1121dffa66506037f688edf92431ab869689610a99239491bfcee6822f1bdb50be68d3a92d94b62683f371069700c9339a9f243c28c41e70e6a2d2bbb9cc2f96b52e889429189086eca5539f072669870c7c7f1831217df0105c59d558aa8c805e216bd97a978f67fd225931e7af767f4d922edb2e2ff0a651ab8eb2028675473cb13be984f8908f35511717c9e8d1e0bfb5861afbf94ffb06c94ae3e179a87ac2c56b6cb248d7045dcaf1fef53908051193d597c25d72fca44255029c166a51a2d3e772f6d5cd0e08225c3fe6569d01ef7c00c93fb9867e21f7d5341501a297247a44517fcffc8ef3ec27fff0cbd1423dcaadbe8d80549712271e7d668cfa11f694184bd0dfea86834a37fc0247b37a07f83982e884baa6627d2535068b5798b49fcc2462bed110590b26a4ca37e8a6a5438c8b6b0694b6e49b564778af8402aeedc72f554282223cd98ad21ea5261d33f78a20ef408a9310e6500ed6116c0ed32c8aa558becc934466061589791203e17651d9c0d0556e948b98b95664149306ee82e3662a5758bc79a6948f8ad90d0bdb843cd2f1f211cd426147478ef968b628cfeca24c483b9baec9069261d2aa5fe35443d67318af3d4135ad6781d2f94558eb5ed60ed21e0c52ad871871301f1daa6c4968b00b5d3ce97002287de9a1d10f9104a20a0f82f0c54f6268c70a0dc0716f73fbc75b5c9162671dc2a4052099ed2278fc9b147837089afc35f2efa973321b712f973494c1d6629995a8cd475c42f3b4034a57432c1b21a372b83a58602fb132c3edc154df331e580972a88923dcb73604123331855d4b669569739b6726609ed87e666f48f5e171359e60b8531621f6f76ef349023bfbe57b96b2a0a334c5af08469bb750bbf56424ba53e9fa006b2a212c0cb58b4f3abcb9c5c345ddfafd92f1a9d4242d3ed849eb0347fd64b2ea68b13bbb3e7bd98eaf03e0f539b2a5cd2aff144a53d39beb3004bfd54dd92a4ef71edd02e1f92e496f21435b9afe2406b058f79fd95626c16a9d483edfe2030233767ba2911fb73bdd535995af3f65088f73967d3896c7f23d31d518a292a2a0918a24fea0260d455aa5108ccb8ce48f28d7198d255eb33ac5be87cede16f3f1fc0aaaecb7dfc14ca53cb8a1826e0bf5d2dcd9c397e98cdf8711a8b78155a09995fdfd909248b779fa92874b15bad5824eaf650535afa1f72c127bb87489958834a4111bde5548004fb2b2c907a89858db4fbdf5504474baf96b3f81cb1da6facfd2673e74ac735cce461215dfd358372661f306d89f90a6018fad487662ac08a48cbd52ce3e726804092bab24accfce86e0065cddff1789c532cdfc535ee8b486ef845dfd8598e68c08086125888189334e60b64c5acdf117abcefb7f48626eb797faa96194221d98886b8a2948308d0ae6e4fc6926791a32194335d7e99f782595088c3fd2ac255d7ba820fa7f97361b63736c6ec9092e58ec815c756ccd4ad9cdf271213ef314fe2139b8c2ab8ab301a88f83d649fd6d5317d48f0fd6c13833ec0063b9a3d2122c1c0c73927e4e9b82e616ea41cd275ef6edc513ac495034c6453a9136b2a64167fa7e1208c5b79f085405698d84b31eaa2e9f35f2ae700ac2fe0c60d866eeec321ec709636fbfac26e11faa83c830fca5f8516938b7a198afa14dcc4cb1320f27a97cd2864c494241942d35ae298a5070b12094e51db52088fd06df52138b691f4125d7696189f306778d5f69eb378d888f76c76378c0ba211c98816826732584b4e36ccd712b54948a2c9d0a6923e4a3dd6d939bfdd15a29d576028e002ea5b2f5da4718a2a1b6c936871bede6f97c01f6f882aa959b00b322c9be72b4119f283043a31d11682af482eba698d382b92dda710bfddb41d3e5a0a5a6110d58ea595f03c46f604985645c7fb00c7a0e268cedb855e2a83c44bcc1de0445a82888d5fa07ca27cdc529b8a522e5d0869edb4f8f0f0bc5bc66b18e785c9b805085ac4866579c3d353ef3aef1c493b17d194c4c93c11971091f84eb2cf5e12b5edc3933738321043cdad85e25e559c628d18c884f015a4e31e83371aec50d68a52e82d8f7ffd5a30597805ed201fd2a268d231af0360cfe7ee77b8ebc801e8f3d9069088cc620740d39a9ec66c3d55de44ba3311f0c0c3d997f836e650adaeaad4c0d636222d9af3ac383b39841043044ae7a6ebc21ac4727fc58806776d48ea6115462ffcc47aa27d9f7615923ffbfbf266bd7e348454859bd16abe15f360d8f1baa9954447b9f72d3a342b2bdcf052044ae1e5ca403c011a1bb2164a1115e02afc985ed3d48596723fb5a905fc7394864f02b88341d5980da87865c7f415407dd24cead9fdb014799b763653b404e2b4719ad164426e7523473deaae54481c7183c25ca6852fe34897033d11afeda232f86d8dfce04cc22b0803b64fac10ae0cc2d49fa13651dc972101d11a52f732375a7c4d73ff8cd88e7e85546fc9720819ab37bf0379bdb37eeb433b8b5962f6e73d8a355b766944d2b7d1c9c4b444b17f3f6d80001949d5dda926244af2a41de1930a02375476c37954211ff04a3f91dcb362ba78f5d001cead8ed8f75e7666b723d91cf90d8cd470ca123fd776b80410c4f309f6c110df84ee160ecba8dad3b7557e9edb303475af673d0275df206ce474e7823abafde1540a16655fc0cd0211728ecc972ab0d242fb0717763d291d58b647fb5aad98d9f9a95037c128954f54eea2bdf81ae066f8538216edd0d78d2c218e924dfc631cce150f3ce0d9aa4634abb68c2d4be2554e80025f300fa03d9581e6b0df005bd6d5d8e010981f4ebde5e8053f3ef0c326278c777a9c3f5dcfbe3edf76c8bd7a6bb05d9f2ae10f46eb7e2311100135927db154942055d90b8739a5df17314956243afa91112a01d7283a2942cc394db810973806efadbb63d6b9003e91ccad622ee6d41a91ad659445fc3f44bba9b5f48646ec48782b14936d02f02cbb3397f70ee2d9dc0bdc23be46bbdcee4ec0f3c064fbc5940b197315e7b11376e9fbf5922c1d6b927afa24e61e6e4b59d5868644612bfd231a8d673089050996e1839aa9c7a1ca9f0f01295c7dec2cab7654ff4243bd6575d22aacf0517ca09c5748c85273a99db50232e370f8a3163508e267ab5866ad6452f85a8487c235c08aeb7e5c72d92d57b70ada96d249046a14634a1ff27e1741a1c96a7a932890b544f115fd355527dc7caf3111dfa478bff6630637a73790ac382596002ceb8fa0c6188f4f011527be1d880410b0751c94bb00f577c16eeff0f5738939610c7ed38fa77078e879480d2a8f6715212161cca47675deaae401c75132766f1edd2709fa7fcb8be1284e40a4996ff4d13d9eba4fe3b3a4fde1b48f5477c4f0124617a835e53f9ff27e646039029ff77afd80fcd81851c97d4561a06a0e021775943338c7766847598f329a6a0f45c42c6ef99621c5af1e96ffe70d40f3a0b80a5e083faf7e04fd4f0b08f568acebde7b0572b891635e0cd1ee98b53ba15f24c5edf152aaab9700eae722896f5703b20e011a4f2738ccf969d4f5694d762b925a8b93a1d57a8a91c41419bd23c62d9a28c48b3ff13746079354f17d6815fec59bd07099116240335a79d0ba74f6f7c1998326b2225188c849f3af89ade934f763ee2e9ca6bbddc81c3a1510840df3b24d1624d6354ed10318418e4c1d12420a91c76c68bdf46baf1ee459618524ab4de9a41296e791e49915248a4bc9c2454f8223be9a11743c36276b25cf4faac3d74d2171f63e4dcae9d48098e24c9904ce446b64b4339225f523537526700f85b66e391e04a8756333586cf419be957ac7e5ec6e16669427189ca21ca34fcf70cdc7c2a8f31c94a6e05b60673f0ca6395cad71185936e064dfa746a037a7c567407ce27128d35a87c36acdf996373ce02a04fe71b19e7d45e88d1f4450b8d25d98021029ecf0dfc41dc352dd5377ce488ea2721b4a66cf1ec55189d50a972667f0ee4cb3504a7711a0cb5d4c4908780bb341dfb767b002e6ec7ac289e10dde285c59a054e82916229d798134f058808f5f9c6116e895a676c30d5c41731874bf0c93c1201af554aee52231471e887cfdc18f317dfb908fd2cade1cc5e81cacaa0a457fdd8968a42b30b9d934434bcc61db27c386fe8bc7c00ea36c56965b9f96c0dee97879a67ea3e73a216b2f568cc8ac7732b03141376fb6cea78e03eba834939cc38aa3a0c84bffe6739716b79589e0f6122284b96baeb02452b5b76c8ffe4200943a10297755e8595a68facb63959a281d9f44d16f4cbfcbfbb70218544205d49c29e0df3e302621b9fdd8efcb1a741fd46d30dc6de233d602577b616b49b709ecdb3954cdf9032a59346b0239320d58ffa20d2e013d6b0ef4f8a41264e6af851ee7f46fe5b62ec9f2df684edc0555d8cc01113896231748e61541992158f735af641ef7296d6979229444e4c0815d5358a94826281944f0659a688264da578b18003f7ca2ddcf9f47c4a89e61f117146545901ee419aa9e1c78427b9fc35c5dccf93b28def3d268f609dae10fc4ea57ff91a81c0ce6480fdc2e612e4109d7977ee33d763a7767f937f2c79d80cc00ddf2f3df077315c876af8a29e6f103ab791a18914d2cf60970c2968c184d38a998ab1dc9c091ec95c5a71ff89884efc42f85f6c8558e5bd3b67d008f4cb3fde01953b2652fe16b682205d700d249e6859655e742b620354631aa6ea5c9d88d6f6728a55a41e8ebbb997b9d6b622dcacf0a7665c285978107fbece7af277881b73e82b0e90beb2a28c445b789ae742181a06aef6051e28f4cfe5d05c79a88e6d310cc019ef3d227b126bd8f6765e7de0de30da94f91dfdac3917a2e3fa2a19d13b6a9da74a7e9dcee3ed4b7daa794e0eb91f126ee9433081430ccc898d31067a4080f0ca7fcb6f598514d6a94718318fa46577eaa0f45a605f14231173840a3919e4e1d3f7cc6812d6d6596b702738f76d75bab6084a2faeb1ed8630d41071ccc705dac06150d7c262a6705ebdf71e5a5b8abc76ea2d53330d345220e19994da782c2cef5444a08a409236ad95e14a08b39ff1333b9a26feca38d76f953e480e87f7f7bc2c93323863dd2ea6169109824cbb3b009128f2df133940beea3c061a6648b2944d9f30a6cb5a81bb212260aeb59435aac706f3ff96dae0ebeb125a0261b0a123e412a44897c469b840a55ac51b4603147315ec1957e3563c679073d6edab1cb98de8fc254c9204c8dc18e618eab0ad37c4faba786296acf91e4babbda2df8cf3bc8d1ec547b0ebbacd1e49584630683391c714466ff7574a4900f5f9d51b4f8006347733de1596b7b6df8ac885ba64858e8d9412699abd7487cec8a41d83b2df2e8e81e40f1fd436625baaeeb50cbd8f1fa265e87e3c489cc0b66b8216cf38128eade0a9e00bf7c68bfff3b712bf832085420bd5c122a1fc175a06253948f72171221aa2dffcc2b58f28a50df2e55840441b211e50abee33ffed238a682328a7f6cd4012a51ea050f5b242591a466d70974762f0fc101747cd0987949848e30ea59d93570f3221491084c127682d18cf98c4b8e3f110eb1f51057505728ceae23ab5040abab6ad51eb68a14c4dc2326a1c5a575459f436baa1265a90d9c00a58d322b99c519359b764f3db6358fa8c8a9b310bcb2bc8ff8f959fa6e3748a931e6dd7294ec5db657528ab0a999503855e1e20b98302a654261e0bc1dd2407a9695b278c19234a3cba31fe60ec8c4474cdfd0a0707e3a95d0ad1d128157cfc1c1ffbea222f52cd0f34b4fde233a175a3cd82aac86083cc140510fb1e1c8f01bb21cb57c01e18ac8f00530eb871f52b55ae7649d64e5fff0f88926e740d0c993d1540a2bfb4e8c9758b4ef6cdf7567811970b4e94faaef192000200b49888c862fc9d65bad7c6c0f8d87be27f50b4be119042ed4784a4317845436190388670b22a93c645fc0657d2f350ea1c239a2a90443f74ef3550904e785cb362855850c9969bc34c858224bebc1bffe5242f04ec11ebfd534bc5f88c316c591004f1875f2bc596889ef0942c06d852537a9570ead758f490ca779c5988463902df32a49454cc655ea44d586b321a1251b42e1a02816808b58edc664ced8187b5876a73217108fa93c4357a00f689542be9bfe050e5ddb10e5e40669b90f7b5c8c86a0ef56f0cadd6374040906d7048b6012145b3bc6419a02f30ea8ece23e602c03b1daa205fec288fcbd07e88dbb8be62293ada3189e2a807cc3ebe94e2ec9d3818a8d4976016738815d960e783a10d00ff426b815b541ce0b2b34400c4c501471cdc8eeea03662ac4a7b9f5a6a32ba6a21580c258e1c5b76778970a2c897b767e31073b9fb804a268e9f18a3f23d1a8c91fc606991c664b14206c74acc62c7cbc5375d9a0c59fb9e42f1c4455fca840e2f653f0cfa45ae86931b4e3fcbb387e74e2548143033ee232f28717167a03ceaaec66557faf5eb19205770738e286a51f2b76a90aedbbbef373c06b09cb3a6f7689af6661a824153ee5a8ce3b067d6bde74de6a9d5e9474ef6ef39adf409ea131dd2681a7abbc493a400ca1c41530ced1e398ea860cd337ccdfc357ab9fa53f29f0bf1abbaf02e6158d9cddf7e211dcc4179e5f1ef000567bad7fed739d7c074384173f3d69dfd14be459d8f00ee81d1009d568f10e0702eb1009faccebabd0def3077dffd13ffc61af309aa88734d869767b867632668e8a14cf8c9acba869bacf9a37b5c822b685df296d8cd49f16f252f3eb06a758f882ef5d599e84d2d23e8025367afc4dd6075e6f59dbd1120defa08088f618051ce1756100ddd5e71622b27b3aac1789dc1bd4963b3b54596cef50f64795346f39448c5a47bbf8bfbe0c01c33b31ca57aa8bdf3b98505f5eaead16c0927f23bf99b983a3d84212da3d3e8571967849b95636df66103e9f0a7c6056def0d952c2d53a302f41ab2ce398176e8f0837a3d3351f8c3f218e7da70db13b34611077651bdaa666f426f767413d67f64cf675950af654987ae977f8198c131c67b56ac155c0e34d24818464092c39eeb9356a0b6a5f1864fe07582d3d0f46972f9a0ec46cfff0f11db38cb3f3ea594fdc50ba944ffdb0daee7477414e7588490be668d7f229fcb6fd50ece42fe3733e3f1f7f59c2e7e5101f3f60f8e2a750da42efb978b083f1551321e91877adddd203004f4397c8c3c5f4e97935f40e8fd9c63b5364d589d3cbff9c97ebad6b8af2f19de8d46978f817fa3860dc069805e1ad075f56274db8817641c0d6f3c045a877bcd037a0b9ff61f593c6fa2214e97c2dcf5ec292b215b9faef226a0962e4d4ae7e9bd026de1e034786dfee8b444773c74c94fcf4955561355472ee184871bb0d42dc7e962384375b913b6a8655c41397ff87e46f49b1a4c518d739749ab5d3f641085cfd85a2515073cc30c7ee354a980b7010f04acf742226d45cbcbf52cd785fb69f199e9c5bf243e151efc081b3dc57d58d9dc2722940c771586f0640cb3ef9e20ec5ffadcdd9fb7700a99787c5a08e00de42de32a821562a733dc6fa8bafb8021ad91030fa5bcabcc6b526fbcd50bb9641e0ce6b5aa15cd5c0a9a1424903e7dbed9ea411769a1a338981c2c6f7784dafc972acd76e3a1170bb058b989cca2ca66d9d2a074c606ea56522771e84070438bdba07749a4559cc04bd3b6a9262167a6ea67eb3e61a855c61c4a66d76814ba91747b24cd87199770b8a027c08f777df95c432ed4a556b7e99ed9101c287df42651e99371968a58eda98b75853af3d2970f0c31c0ace6eff6890a5433b5c928744b0adb1feb2bd0246fcb330f26727112c63cb88494a83622835a6f0921a087bc7c163df72b7c270a86f5b059bb43c8ef3f391744c64131e2d3cde0fa4b95c89cf8d91114c117801cfb835c2b9b066ceb7b3efff04943f17d17f7a0055991ebfcc6cb4960451adc70cd6d8199b4dce6c5d2d4c00921c4ef7f56def575acd0ae18627423ed4d2ee8711767ac17159a05c010dc32a429ffa67665aeb3592e63e1d519239471dc678af4ef3b926c30489b3bcfb7df57d061cd75c6ee72399fdca263404ff1feefd9ecad79521ef88397f7dcc2810a2ecedb1d6daad80614c53a80aee3aa9251027e7690dac000b9b8af8705823bbe5cc754c6df5e93dee6f3a0f4934c99be72e64eecc623d8b4a38b5812896e521e6076a59b0ec755a16ecb4b47371c2b247e5160e37afedc2d5450df0a649d8fd76205c45bec967ebdd4df13e3fa89600e6d16bd503e44eca8a1aab90e2981bd846d4a684a5b21a92d4f0fbd2e22bd9a63c336f9148f26568b77d71db85115255be86688ed72fc074d7eff109f0e8fb46132b916ac0aa2da24e372a959676dc6393b5dcac6f12dc0933c637eb223af65b6bb1393f149a78f904396477a76007bb43a16eb655194a48ef810e5961edec68978f5524fdf79367679bde5607fd4090c365fda7a64526fbdaf9ecdb3816f793b871edcf2cc656c72c2b76f7c1e05dbab30071b2dd2f2c9827239625cc4da1ce4e32c474b3ce900e1a4ad99fbde4e1266f0650cac1dffb0f81d83cbb4c7c997232a489089e2d81aa9de5ef42b7d5b04526e9f33d1a242d663714bab14464a8457756144c2d7e4f94ae0c7c2ecdf41a2ba949d756fad1710b0b341497f924133a6a75abf19bcb09430c38df327968b4a96617c2c88aef61b06d4342d1d4088f1a931644fa1e3da6ad3529e5fd332684c8ebc8093c7ac4a88d04666418bc03fd305a54a15fce8eb2bfab80b24c840453a409e419a2dec1b808a82c74d701e155229792a7d3cdae09f7fa766b63b140403f3c674a0bf84c8de726ac6613b4453e53159ecce2e7bdde49ae9b2a441954320364a252da4e8b87a1b1c7c1b3f886fa94dcf119fad71f4ba1af2cdd85fd68adcc9eab6bc3e12689383749ed611ecf2ba2821ed58657eb7b76d85ebd84b3aeaeaaddd31eb59f28d06d86662b8cacf759693f7ffc3eb36721a6fcc3d02e4f301b2a12c6f85f205b57e1e6d80aa5e2c9471157d5d4864b70057c1b134f301fd300fa1ab09f7e8e2056f240564a72276e08c8aad82068c3c670d97aaa626cf16ac1296efa217423580200eb643f972df16d382d217ef0452428823a965e2ab22653faffa73c9c25a5671ed8da07d4c3f7b1d69608c946a17d0049ba97af303da6b82d581a8b0ca62a8157287eededd1e63829209499d20959da9d9d0072926d0e42c3fa41d4250db4ed50241323bbe78d15b20460b998f136e07ad676c8f9b48b76c924c48f199ffbfdc836a1248418c49a38158940a49523ed52b9d02cca6110a42663f1ab9877e54b25c9e0145a0be81c7e65010489501de75b8ff76454ac3daecaa2176662e3023678bc47916db0c6b8a6d510223543e77246a87fb67f6645d9f625435039eedf9352ec56187cee28fb37ad07590de40a67616201d82da5a24dbffd31d051e9e2a960c44b6a406a0cb753718b412f0dee75fb6a3ff8d09ca56fc2c0095726eddff1c610265cf8058d20ae7f517495a0190302a27280b1192d96c133cc064bb797ea5eaec7fe9ceeb3f861e87610a0e0d9030662423d2359e5aa8fa3340808392961ce28f922d3dce0212066619665d462461a885fc6a04b2575a905cdc45a55f8a3cd31957229eb152bcab7675867d4eafd2fce0f1c6ff7e8a3c20c9db430362c0f8c788b7cf93f0d890a608013f4588e55ad39a3dfe07e75f3830f71dcaa4012bfa2d19fc1388dc008b47766718a5c17a8681a02cf52a918706190cd7fb0f5af7db3644021dfd0d74d8f2eddd6f21f250f375969b97e2e93a4530d22c82519aaa3860e914b0571b22cf35ff6622a506565a1a7991f64311724d6971652f92d4a570a90bb4db8011825b77d441984829ddbb6c9e378b4aa26808de7c0f7e2265d7b334ac7b30371a0d7bc7e0c72b94cc9c491f264f2675b38c59010d36a2ca7125a99e6e9ef31cc682900e4ebcaae3172a8119cba582e2962dc58b9b2cd9afa2af651284ef3803be0a0ee45f36cec000016ea3ff19e43c4a0ef8045f20f54abd40905b5d24400ae7f18fb3c2d5e3fd4557394d12f68b1379aeca5faffab70e12ee103c99c71dd40bee6deea798c9d7ddbddb5bc7835dfe3ce56a12415bdcdb43d500412b053b4acf23901cc264cfe3a0e5a569c7744666600de1632c4060b5a8015439b3cc42f87f683846025ce26d3d3b4c9ee597affb28705bd8c34ef0fd3893a65f255d807afcfc1efb14794072dfd3d111b1d3fda6638220f56763cb3b39d6139deee05b6e4b7190a730cc500ac365bc749ffe48abd7cdbb6b0f3c03208f5a37d33d29ca0facdbf5070c7307055e7bfc804152eb8622d286d2fe49de4e73f48ba5f5c6d6b5279d52e5c459cc934c2bc3445682bf5ca03c9bc0a7a85634d801798acb4708cf747d7b5bbe8f660e8fcafa4d10ac723f52993a0b060a9a5aaa1d168dce390e7fe54812ef87d7ce451be865ccaed774db9f48b26ae3e30d10b255f9cc2c10b2f979e12f6a0882682e1260d91044245df4c91ccdf2341d19c84bb73768a2130eef084520af779906ab9aa9594088f2ebda13f63ed0f4ee6fb1166174877d1f94c8b5f30af25ad8849c676d584789b04625cd272056bc63021a9429555f3010baa20e1bdf5bd0abfcfdc9e5f1d65cc0ab06e8d24e259fe54a60cdec343aa26c349795f33733b74af14506910f850b5481b8a66339000c4041c16a0a616b74e8a2b27b34a853b7fb166b06584b07d79b01e95c40ac6cb2f79652262965720529051e0516e7ba524b3b6773605ca99db549e9681cb1c954527f9e4ab229f313a1a705c73f7e62b80b2e420f0c2777cfd19d161d734ca33bd40797dd452ba54b9d2d1dac7f0bae7a9be74b80c0f0984f45df2686c3c4b84258022486c370fa3630ae106a0a250001eb8971c1e8b0dfeaec68ed1097db5698d2d9564a67716aad3029add3bad44eedbd374c8b05af61d740edb2f2f175cb3f0b989e92cd81d131ba63399167b66e49775842becf0689805d51a3c25c2490d6eb685b4ed22941523a6af3295dca45aa7aea466c939e9952f24c8b43a3c400a83ff7743647ebdee6b9f54ccbf50a078c60c6613a8d920315ad7badd3f5afe1223b60ebe4e51738d9ba6591c3827feb5a1bbb772e96425a43ea59b73c1461d03221ba734d24d62a25254d99727b525732583188bfc99153535333c526738d29c90cb7d81d52012db9204158d8995b9ef14cc95784afd4d4541d39ba73317e614805b49841821cd964ae79220b3e5611f62f073daf47aef9a0483c746bd3f1745eb0c95c3be9cecde11d6d56d2ca4ed25cb7d53a96e9590f7b050c75f2513adbe407cf2b8b266479461bbdc1c64938879794bc2742d8cf0a0a4c88a802556b8748550666b4d30a9140ce42aa58832944f7406aadf507cbca0f9abb41b8c6c355aada26738d56cb65aed56a5e4d68e32c8e577b9b5aade6d562b55afbca9ae7aab11a116cf2abb18fe80bcd150dffb192d8648619599ce7469fb95fb06f8a4d662253890eef6c7933ec4587f4f8de845d170f8b872dcb309b9e4264cdc4686dc226318ee48f69a213427615a56c3a31755284fe09f1a2ef85625f9fcb5b97a9da702252c02e08a4190e46a5e8a73ce0091055bcf0c410342c3521c9ba6b84082dcc408512a830c20635f8e921c7229ed84a1f624448e992a728123ea938d8103631ab34e9410552f4b0d4a5e99a1e0b3718498189932351bae02db80b1d62064744984cb8e0882894f4c04005382891c31250a030816152bc2596e8a40e144c90b083104d1c2142861d1c9078c10443284c51225344114438a460490d2d5c129c4a47546981141a8c48c2a566fc5e30faa5e2192ad8b0bf53245d50276b7a0d7423e83563cdff9bcfc58a0b66b05539f221871e3a050c2314d9d1a0430f50ff7fce4fe89fbb8e84feba5d84fa029a60e2031334784283ea84962a8a308102292b30a9095f3802c0f90c742e549609ac0ac6eafb966c12e3c220d8e700d1afd97abdbfb272c5183c5ee57436cb60c9d3dfb777385a5e471cce8673f1b7d161e9d3599ccf1fab08c431ed2cce9ded5052f5d2f19cc481ab3ade85837660790084c8e1d6f6d416c9b9f8c426314e67730a53a40831174c419bc98aae57239b2259c975f2ebd40a52af3158d9a157fe8030a4362affd5bfa5316badb5d65a6badb5d25af9f68e74525b6b6d487728afb5566b5b70eb72eb72eb72eb72e372e372e372e372e372e372db02c56dcbd26d8b79db82bb6d39a2b5460d9b4363def020208868d6a04f286e4ad2d788dc5341fcea1725bcff3c3b9e7e3d2e1b921146e28d594681c156399511d6a27ac38af06749bd5cb4a335b25f8036f9cab9dcf21e8ceeebf5a95422e5a107a01723d8ce6c122bb331d885edfbf3b940d62dd731dffdea79615fccfe5c58ecc2ec8fa517ef44509363afaae5964677be070fa1729d55e520e6403e8e39e80a2184cf2542cfb7df854f3c85e7c23bdc73eade02f5b3a9491275fd497f3669816ea7aeabfbf34f12eb4ebca46199a809ad3e1d690f5b67754b3c46bb6ef98edb9ea5a6d82b20f8c76af523f306d09eeca26f93b90cd965cfb7b11c48d5517b58abb3b9b779bdcd48b4496ae3d941ebcf6e11b31e888c6a2fd7d67fd8307e36f9321c846318089736548e774a36f9b2981d650cc8b6207ef6349bc3721c289bfc3a0c23f6cb5840b338e4cb5e6866042352d280efb97125fc8be1b269a73de18ca15a2dbfa8da4772ec987fdfded46b71140fcc33e7791e8b2f30a27c9eb7a8ebf320861dd3e90d28d6c9efe365486b485bb2a8a0573a79eacf635cd8a756ab85d49f9f401afa73f0ab46faf3cfd3d29f7b9922f5e7f9d2e8cf4fd4c6f31828bb721bb64862d7a5bae31dbb7c4e2717596d2d2415b2802eb2ce9e8021092b648535a18285daae8b87ff77ef585da23f87c9a12ef5e736f6dcf27e5de40773b2654a8a1420ce4ea5f070eb2f3a95c24351165a9699c692744f8b4391a834f5caef0ecb945ef965aae00da04d3b7d71b2b9d73aa19e9f38863d06fabbabfc9e9587281c448c426c7a5b629e6e903061d3db9227e02703884d6f4b683d7b34a4c06d7a5b1294b3aa06fb9ea3941dcf1cef98666cb06d4ed8f4a6644acf3c5fc08e90b50d099be4000e435ab99755fcc4c1d6ebab9f06ed50adcb744f3b569ee5ec14298bae77d02952965abfb9cfb9b7c9ecf547d7abe77d9b92dc26e91fa72df2846ad5ee22afd722c19feec14c70aeb033a2f38a98576c598e9cc05d2aba0f1cca28a57b44e850cfd3f15a96d3d62984fef42fcae739b52b1c60a45ca253242d40bda24eae6b2368d74eab903649a73c946991c24ef5bb63416593b6bc3b6aa3f2992b9bb452dc9d15297ae516f7d5969fa3a94de5dfb77725ef0e85a2deb7679feea3140429583b9d28a794f290d2bb7bad354fa552f4ee765cb7486ac26664b55513d6c9bbeb95674d6d49fa7ba9fa8249486b564e564d487021c90c36fc5e01f3516ab4554b4c0b383fb0f13cb9a1600537a8c416f0e0461b1a5408952aab603a9c1d66b23818e7175a482d0e06ec08dd02b4a656cb4aab330babb5d64a820e5973b823db4977544763802ecc453510e28804c1e1ceddf943a4b2497cda78aa082cab0413e37bf189a9c06295d80f9cea9ee789f179be4e7ce2338a4d628c0b67a82239639c63f948f6e1d3196532c7f090cfa1b4c8e8c9ad9a407e3407c45110219fe3e178541dd846bf87c5662c168bd55806bed8901576ed53e2e1b0a8c7b0cc3e89c562b1582c9663b15cc32673ac88a8eb320ce80a19de624884563e6e2743d031c72e3ca5571ee25e5ec8b99e508d54181122d4062b86cac566c5a6cff9478e0133a072c49379a88d950d4cfcc4da9ca735ea571cb2d96a3897cbe55cee737ad88688359009199db5cf76e4e172a66ec79497708f8725032446f8c9c73aa2a481349c44a51e3c974311891f1aeaccc972b30a3b4f199115139bccb973979ba572b95ccee572b95c2e97cbb9ece26962933977c6cef33c754c9dcc39521b754b918e40d22dcf495969a756405e7a323f7da007bbb0ed15835168b338a40e9f581c9273bdeaa281cca3dd77c2807ae5f9c7e6506b12e5b250467214d4adc89a313799694a46b6239cd92b3782b1ca4d661a3fa21d99baddc538080d0245ac00d7a3c7d2a675ab6328135657beb27e50c158edef3b619fc07b307f2ce36b8f1f0ebbea783cbec6ef5eb18a4d62d3b4384a56e35c3b5851857854c524c81933e8cef36b574ae85e64cdc468bd128248378ee37831d6c13a01e8c8d2ed8847289bc43a98d6e1b03c45b1724227e9ceaab802fb442c7c5c7e38540f8bf3c2294740d5ade094d75d65b2322b544ffac136d0a7da5c35f2d7a8b35fff03bdcd73f235f2076d0de7421750f8fc3ddac945aa5c24d71ae752b8960c2cacfd1e592751b5fecf5f5aa8540b55a475a8965ed2bbb779eed13e479f6ff39cf67291e38be4a38a6feda2f5d28ea8229c1d7f8a1d13d0c240e51b068375ba6593295d4a6771327f174a2995b3e39f6c4415e5f1d60c26db5a2e030c7fd1c286e11bb7a70432a81e39740e94cf9723e3e41f39cf22c6276eca3f41281eab9e5d1996c122b06647ef63a07cfe2606eaf59ac95806e583513a3a38364754e5e8082046072cb262074bb0ac5a499bda1400e6b43bb165faad7688ea34c58eb957d77f533f8ffad730dfa19330287f5ceda93d65273d18ce45074fa5533905ace1dbbf630a306691bffaaf027157871520add6dabb81765169e9cef31cf0a79c95b37256ceca59390361a50e2c7113dba73f7defbdf7f7977be9342bb136345a75e5a25b24fb7439086deb9745f433ac628da49362a5e5940771600cb481486c8e260271d906e2b20dc4651b88cb3610d72dc72e3d0371bb04631a3742dddd52faffff2a3bdab0d26b4d54df58976578c9e6e026a69fa64e6946d22da533bc9bd158e7a1ea78a7fb21e4236cdd29cd3627ff7c397e397e498e5f8e5f7e795d19f6e5e3168f21bf11f063ecb8453baa4c0869cde3df3f18732f63ee65cc69cf183fb5d60948433ec20eeaa488f9d3f2135493ad3dba93790e9894a4a4b4b4c4946dd67381b19a512e7a5a51b7fc69f949b6c5d8926cd00625fca7d6fc18ddc99c72ab649b96fe8769895a269207754a69b0e49c33de9f8ace70bd26a85fce9452ea1540ec98bfde9fa379a79c522e5a1c4f87b815a39f5a958e1783e0513e70ffd7cd073c3becb8ead895e306b17f9eab870d3b07b136965b202fd83549b695de9ba2ab4e5b23e7e6b512d21a129c89ab992ebb72f19be1b22ba72f3c17dea775a03c04f5cc96939e690af54c155acf5081d23353a4f4ccf9a267a4d87a268a152674529567609d478b8e77345842183d03458cd8e2bbb4859e6172a1679e78a1679c50e99926360c3db3db756557a2d812ede5d7f5339ad92cc711bb72f2599ad21db1531eb2c4950c0cd50b172d626058acd8628a521bcf2938fb70105933315ab3b4e85393c521efc5b62a0a59960baa8e673db9e21098063967f34a1699844cd3cca6699aa6699a665e05b1496c9ee697b379258b409bc4e6cce25c9bc979e7bb5049b758e9eb64085a3859a5c0cca970fbe86d9fd212535365e1feebc3aa8efa24fc09369961b60cb31df11cbe2e534461b7dbed7641769fa3f3dabd7638bc7bbdcd2a072bc43ba1f37aad7ed824debd8262d7f372edb26280c522f988c7d35fa0f37add609378477edf6ee784d2c621f98b8ff8089733754736982658fc21c5e757bc59ee42c1c6744377563caa8e14ccb66e3a1d9ff3ca420fe5b935e46dbed6a0d1fed8f18378d80f54835052361913532980830bb7247070e186444f76ad7e642e424fb5b5b440b1af6da4366a6d61776d376c435acaf212435a8205a4259ccc45401239feb038de0afd6f192022e43fa6ff8c6edb1fe98ef55184a21e707bca6f16bec7f377f9ffff7ffdfcb5b063389975dc23e0c1135bc810db29af595d7e826d5f5f9551059511b4e003132756e811e248175914508860d0a16e8087edcf0ff0fd43d0dfb5e291559dc7f258fed2e1232c8865c325da5527c3324de74f6059513c8b0526a3cb5201b398c82c2426231cca3e27c3322cc332cccbb1ac425e0128c37086e936a983ffc378a7460daed961933a3849f67919834d211623599651213c5996cb321d3bb2926c32cb4a8b437edfb6ba23db2ff90b03169b38cd1d66c22109fac14ddd28d7c864cc78418c89e961935936eac870d6c1185794f1f560b884b486c4ac1dea0b4216e3978d0e6a442c46b16f181fbd8468331c5e22db6cd4464d3a64457b7ed6f33c89101942e4737ad8a88d9a94e7864dd6d0c1dff759242a8c554460aca8f83efc19d9243d797037cf42a11b10aeef1bd051af5c87383b299d7c85327042338b92a24801063424e087235424a15284922d25d071934373769c68276fc6aac5a8082615826628390052c10d8caab060090a27546179484615156f6e743ee041da0181b423ea2f9d22ed76e8df29d2ae68dfa4f0b33833313ae5d4feaaab72dc2076caf5b8756e5e7093e4b338abcfe2cce0b7f5de2b850b2ed010d26a3f876c579e6388fa2b1f7702fd9ff2da439cbd4f25034ff62b3d7da85dd8955f8dbaa997fafff4d24b2fbdf4d2a717638c6fb5ffa997d326c16e01ca575c16f79f5e7ae9a5975efad4d6fd36947280c4a6515200d4a310d5be2833a04e2dace7546b0bece25f581586a1532f2b605abcb0aa2a63573a869e71e96f9199467f8bbc35fa5be403c0dae84bfe0d2dc698999999998921ae2effa72ddaa22ddaa22dcae94dbec9f181cc6539470e3de39f8e74a4231de948675096b8a23c090e38a04183060d1a1c88ab1a5ac7c68d1b5a001dbcf4a5aaaddae64befe0f0806ad5566dd38300c8c0e02aaed2dde8db0a73bc8faa0ac9cbc97cffb6f0df6e53a405fac5f833c7b8ba5ef4ebca759aa36f8bccd1d1d1d1d1c981a1a2345a40d03c18e34e29a5547f18db3e001040000104100620ae64bade81f2e9d104d028eea369b4eccaff2ff0a5edf81f7fb8437bad15edf15c403af6f5e3e55e0bfcd0473fe7b1600b68f7787c87cb03df65f880e7711914900b83c140a95040a8adc7737d6f737bf4f0e1c30049ecca6f6800940fe596e2fed4007c8792165af87fddbdf7debff765c2ae9c7699fef8628c29e5f7f2fbf6de7b2f79efbdf75e3e81beb3a2b406194a378cefaaee0b4a73c62ebc0f645e829cff3d92524a294d0df56d3362d8b457fe351c4a7c303435e09c5984a7153ad47736eb1ba553a8fdfdff63dad354a95496752aeb14078aa60699de9dd264a121a52c4098db9f6686a7fce9cdf705a7aa8b69b2eccafffefdf25ecdc2ae3435e8dfa10c0cbb9221454e7eb4fe8b29970dc22afa8a6e9158218b04088b647fdf6ccb0d3720212252e19c5b1b7fb6e70a114458885ab0028b93224360c6e284c910967b2f2e3274f50cc4c50c612901cf86b00441a404516c6868686868e865c51a203ed5db10d157912125980cc540098fd39c2f93a159f6fef38727f0cb1e11d8a274bcf7fab85d86907f210fc3560f8f874cc7ae1f2f1232ad56e67aad1b1d3bbe2ccf074c3e183ab54622bc033f82311157e19fc93f131ee32970127014781037c247c04f508203fd0f711378095c04fc8717c1f8bf0ac6ff55fe1fe3ff2a355adab1c88245600d2caf8659fbf7e2ff8b71be65b65f065129d1850a860c2b869e9131736f93dbbd8dce8e3a1e5adc913de2bca5b24facade5a2716154abd1d4506c6da929dd89910116c9006bdd721932c012cc8149604ed300106a7c82252db4b3590f8f2d5df4979cd2aebcd542f96825170d0dca472bd5cc60019616c8c26268982ef54f529292d2d212cbca5822cac668c6154de7298a2b1936bb32ed762b0d5bc9d8d8704083460d0eea924e2733d2c0a7064bdb64cf5ccde1c7377bdad39ef6b4273eb26755b2e357f3a50c69686dd240f968a51adab46103e5a395b44e9b375eca1adafc94bea58fa94ec1e153f51dd5c0a70d7cea56add5f23bfaceef667392929494969698b4895d2fe5d7a317a86a0b6ddcc027ac8b86dde8e0050ac96444b3aa84f6c2812486437be07da5492acc8300e4c83122dda19d4b40480686ac2ab56143d03dd07c841b7c3fd4264841203f5e72f44fa9cd529ba5364b6d96da2c35ac5ca17cb2ebdaa687d9539ba6c5f91cb0082c230096416ef40dcae7e21cf87eb76fca97844f7ce2f3fc8ef295414097cea8344dd9e62c64a30120200843160000200c0a850443c1589ae689e0e20314000d5c7a3c7254401c4783f14810e32808832088218418600030c61043185286b200bcf080c3a348d7876db866f6a26794e6ef248cea1d83a763c637ec943c36d68f0b39ebea55b918891650f9c3225906efab33c0e64f440dc7426f6e9d7126712937f6a1bf3f450f7d390acb105af172d3ad4e87d9b9a2388069995cd65978cdd5f0038ec7a6a88fb9aa379639c482a6c9f84db5bb991e417416776e16f0656da0fe626d0726153959a14816423bc979f8c5f060f21d0b4e1e397dd7c4383e6d686126fbeae6952489d050f8846f4e9e2d1261060b9ceb362b6a3ec027e47ec777d6db6b9b127f642a4c63b06175d2f782681322effa4a8a8a6f6044f133b85384a78be12ad50702fda2244670dedfa227d847c62e2c7b1afa0fde99a92df50feca93714c85edfd76acd7f34383b5c417fd087835b36e3c8e965e8550b3993e04461353a015f086a19a495f909ab742875b119d0c4a2fbda75b70ab607c0ad8c6e5fb8392e5f0ebdc005de02ed24ff6fcd20c997b8f6c6d7db1e430a5779f863d0c28e35a8f4cfda14ee368769053a2b5825a55b2db2d098237c808c0deed3326138fc21a9cef8aa72ad5f0ab446863fcdc2e2d35bd34f48075a2b45865145eaf84e9a21f15193e5755b24b519d2fbffa95e51a80019c946fc84d272c1482d221fe40663b2205feb86ab6ca6f1438bd2a6042181d17a806b13e27a9dbcbe9ee9a3e1aff829fe5fc6ce48973ee00700d57068d41e84c160fd46fc05168306816561adc4452673c011093fe32acdfa243db0e4272d120c1b4b3f83504df40825e786eec4f13dd0be0d5ecda3e5e233d1eb3318f07ba4a8022b42f315c3d2a6d0667215d52927eb4d770932b3912142194a6e3a3fe5325eff06575a673157633491f2d49a737288c49c1c205792ee1a24a1dcba011429682ef18e2ac93f8d6a445ee0b01f10f58c825dd6ca0387bf4748208b49e8210a353e1e63f30478d9b47b3085f6d50135cb902c22b5acb91d62e1cee1d8e698b2c6194a453976ff23b31c6cffefe04b7316a6eac62672fcc05590aa246f98f5ce98085956b3b02abbcd8fd26f818da0f33eb5e0c26b4d739ce0cf4714c2e17b816e7a6c5352da7126c9fae82b21043e2702f1f3448116b0a2264f595320db095ff032e72bb884a0265f375ddb5194c09e2bedf78fe98611ef60c5943c71ee658406540c315271e2d4c60f1652386a69cb9678cbcb227831c8c7c6eb30fdad87e477e5192392f90a078f73bc7cc4aa23798e5c9911240e01b995ba0a749f7d0984a9463209a6a9c8a3c63fc516638baa5fc221bd194ca915e86dc1bad2fc2a7891d22e6ed90e84903f595501586914bc7df38a91224b44888b404889bb49f2ea0a6bed066f725c968254acc2d97812b670acff0a1545d25121250fb2105020f84a3793996a62691a200d1df95bdece1cc764fc20ab3b2c5c4a716886e3e4300b86d628b4151a0013944c99c2b36a4ee63e08112e51a3904f132fd3b7e3a54cca77c168a297c6e9435e9e1d6871497179086592fa15cabdbadf60e62ca2ebe7d6c2e7fd9b56d407e71dc0aaf5d0455f3a31406b0584a63c3758cd0f354cb4ca58d7530bf3a28a9b52567f03e61e1b8984e89cbea6722e61b8de3d94d646684a442839a4dbab3c753d41e18f8e0facdc3a140b528eb648931c481d8980bd7a5a7b11046265370814837210353736fc46ac950747a3ff2d987aaf97fed71b791800fd82a04e6dccd5f12a1921367b3cf07496cabe7fa3b0d3e880d5077123fc6850c5482cfb922937e33175b72236fc3f1225555057e5f961344692f637e867b8f6ddf723a3e03472cf475d518eb58d46395b80f8cc62e1d61cd0da3ab79782fcb1edc0cf4db20db6bafc205cc8db0b13ac87360b9b61d0bf684151d9bd67de3ccf595306b2cc012ccdd444e169e191d3c3f9582a8bb17a0a68e171a3e3a414113bcab73c90039d36853e97b7fc9dac6faaff01fab3af7aa6d5989d34b4b6e2f8dcba433a11ee55170343d8817ba51d659e17cad5e1fef210495d559eaa64b2b651763759cfa6694705b817ab987185cb6e0cf024b229140c71dac1d7505efdf30a26aae4bc76eaca5da74e95a83c2de77032179d7697e54581e2a4c8810e566f07ee876be73237f32780efa1d0295bf16bc037a53ba0c7c853d5e85856027efec56927c659d8e2914a34f5f524985f2fdf49b4223439fca239facc0c81e0cda34ed2cb8695a7ab855f2460b68665d1163b259beddf852a4caeeb3808bfe8a7242f0c3ac6809c2a196182e6e377a7324230ab932f5553f1a0d3fed1c88688bcd156a0415ce8c8823b4a2f28b9411ba8d147f71430c1115bcf5845cba6156d88c9460e58f8b70b0806233e29a6c934c3047d5af46065055fce000d83033d4a7913c08bd6192c2064ce92de9675052dd4555a4828f236867597a9a888afecfe02a2e4560b696a2a74a947f5990cca3ad239bcd8384f6799cf80eb96b2c63cd1b372c6f1d17e633b6ae4778698bd040ad9e92a70ee08a0ea58209ccc39d9d9cede3037f1e63a58c9ff2914f33c5f14ce79bcb83dd90bbc0e5358757c1a0808078b9dddf23724bf39f877983ea03b95a57081d3e8751374de01eedbb87b072627070bd329931af602355e62b2f68a5514a1dd8d653e52ea713cdcc31d372a9a91f088b8f01314af0d6642343f8a9d05ac479d81bf27c14f1deb5ba9a9c99fa2a5f2ec7dfdaadafdb17a614934280e7c821a9169e5a60674062b443123b556ebbc7639f49bda8182409060a97101fd43e60f5e64877641a562f7883d322b809e2040025f91f1c999b45b9f2bd1258cf6156bf60b1f690f14533f96a9340c2c2c3ac30c3cb7ad602cfe012a428f4ea0993ff6682c3a2f3ab8cf36ee559b90f63a2c675baa47eb8d83ea691d4bbfc63d31ab67a46f385a46b5a0923197614e0ed0b6b6b92d64ae4f4843346767e61958ba0ad38c3611ffaa6f4ed21496ffa968d3ea1e4c6fe4a2ad98edfe3c5f84b6926e9bfb3cdc5fdb75a8da3a20c2d3182b647ce204e185ce291a7a08c28308d9de83f5f643e854b0f624da1993bb89472bcb84e1915620fdfab79266c70670daed2208386be883848a1cbe7e54ee585331d25aec45106a60c4add2ea3ecdf9252d4ad1ec5a61f42206f14f13ce6cbce5e370ac132b90e4757cbd9ed617db8b797158d1a0b5e476c694813fb4897d0f44a91a992e22c94d0fb97332b3002b7f4b249d48d6bfe1fd529d26ee25daad2c97a31d84cc822514a8a013b29e81dd3e36c4991cf21777d2ef38d426a178b654b849e4712930354d1dd12c0b3ca78d49c346bd09a7659528ae399eaf3537e0de931019d1647b0f12ed2c6307fc8390852c48cb1cd1e5efef4c40534b41448bca1ae5bf4cde71ce6803cfc02605548d6656410e5a182e1af9b955c35018fb4fbc115d7e5fa19620a21eb4d596e043b3ba7ac346b1acdd211c0c059b86d6ef80ef11559c0d1b3dd983af460dc9a3214ed45d2084551fd0dcd2c4efcc3912c0c6b3cb3658cbc1fce893a3e5625a8925c4658ffe46570e9618a95efea9fd47b76462415c04c1c3ebea66d163a1b89c508b02bee2aff6945c17cf7a9b6f3ceeb0ac277754fffe7c3b73994e19cb537168486fe3e5adfe3b2d3c212a70a4783da36c23c15068765d9e6846302be811e2bb8fb11600e45c54dd5a14e8e42b9a220a1b0d386cdc7a0b60d3ca1deef8eb32012f00bbf09bdff825606b1da6e995f43fb9cfa439b9a86f29c9be8fd50c6692f899082418d4e952bb4cd717a5c2bd9051e48674cb04c6814497468a9cfe568d3430c6781cda719d720da97d5c5211b48288bee2ff63caf7465eaf16780eb42ad96d70d5f5ee568352bab429baa2f7c6e89d6d9dec2ea726edd0952e7adab1b09d39b9f1e213e79a46cb6974523af05a116fb413d98acb1b3bdd583011ca6944e61718962ea982d7de624ab114eae4e3b13584f38f3a4636ee13de1bf898751837bb2a6e958b0eb4383369e99bf1c15c5371dfd90ca549f4fdd6cdae19d53099fb9b11cf532e0f62d2a6a1641319250695712dd124d9ca9618c672fbff0a60168d0bac4d915a9343dea37b632c90ecfc60ed55af7fa9be33f3c17ab562410e9deab7aea4fda0674080f3177155584f4af7842f9b98e4f7c815a2c8b75017109f08525f71221d1b03a79f37a96547483cc2f1c8b999cb5f4053c708181c194a3fd5c009495c3b16c5c65cfbcf8be71ec55b18a0df2833ee28d40f01b9ca4ca06fbf6fb95f68ea17b22b09891af7fb09ffc4bf0d4e5d8e817e5ee8666d8ed0207b2dfd83e3dce647c3a8447a07ddef6137e8c4a58f5505b02a7146bad60f9ae35e4727935271527d88c4a69acaf1fa9d6d96328c7072993e6d51fe052a0d2b91c31228f26f8c4926fdfd5814d5e2571b7a88f30bc5291b2a5443f4acdd325b8e8fdaebae0bc10eaae791606e6762e691f7c89c5ead19077e163dbf251b4f97894c842a97cc11168dfa6826cde37e89978763a841817c97a89d104fba6613f6057fa94928c58fc0ad60292c425061ccbfaed88e92ff7db1588612918c3a0fe6e3f672331f6506128b358c5225e8c97c34c3457bc4bc68500e0f56b367802ab40b5daa5e4674eef0a689df0c609ff6da39b4c53e9e54a628c046c338016ea22c38b62b3d953ee3138afd1c2b0220024512d1e45fc4c634580dc0bb960ce3c6fcea1c9a39ca97a1280402902f9d231c46036a79c4e60dde8385b0e75151f75d13132e38e975b9cd86367e30021d2910ba589198128e59018f88b024c19c010ca660dd3280d54358c718c05217d60d0358ad1069a1645f40f809e8940ba86599e2ef3ca8d4ef7507dcff8a9e1acd5827cafa1c1a826973a91dde5d8ca69be2e6724d55b0880e869d80374d601f98c0d745b1e10931d527d1cc6424f0cf74c5891f010c7e62fc38461b2cd372efb790f51007b0fd8021b52b41f1c023579af7b651eb67c899ad6f183840dc8216df717d896982102aeda7be0baed70d848324ce63bd92abca2ef024b67951df39e117026d4a8a9e887131b02e2e83ee0a64ef14f288bb063e3efde72c49f2ad6ae3d28c1d4c0649eca88ee686ce56380c24b809690a573f8b0882396677653081bf2214e2771d5b31ca10f09869d84e36ee7b519859cdf4adb5f860292c78dce3e45da269b4209480b1e945569978b566ca861b7d3fb9b574a1562cd00669ef1467076e3f8bc344da1407ccdd570d8d8fe5c9e00d4c582e1b50485df4b08b165025b7b54e3db41f7d3d62b3e248f2820117db23bf97a6d45ea2fd9bf736f9dbfc28a0c1c25c5db3dd9cbb9df965d75ee912d03468b049ae9cd8f5dcd3d422a36792ccd3099285312b5fcadd3a246a69d91232ac6a12572bbe7fcdc465bbcc5d3545436ea9e8b8002b7aad3316d5871d2f291ec80be0a67e5e4a681443714a3e14cd5076a59018468e48072a6c84165614919ab651addedc4b946035004b24871fc0b62b0d930d02b789856f42325d5855681c2efd568ed1cb21fe02f55f4379f78e49e02656a43d0ec9aed01486af0b460b7b02b805f77c4980fa58d27185507627c771a687ba137d18a4617bc8fdeb5ed501a3662baa64203dcd785e68a4894686f34ec754cbc869024a96734af951ba0715db1281a93872ad39e2393b08dd96fcc1408d07c9880c11a6c6dca5514fa585efa84c13a8e04e272c9c5932cbaea0018304e8d5e15dbb136bb85df35a41110186f303d78cc780a48499f981ce5c5aa13fbcb0c381c3a6d86953af47c555aefbef33bf85016cc9b09f07976f2ae4200472ac360d4acb7c565cfa91d180be99358b86ca51035573de782b9e810a84ac541d475705a0d68ec677d14c8e2120392069195971460f4ed1fd438cdc74d8a02499b3b035c59818062e85d690315bc0d9c304f48a8ffa2871952f628ecde5d1222be8c05fa9ac735a62d6319c6b716927864343c42d1fdce1b687ff1bd08f5f5f4edf150c05fe82953f8491607dae024aa8af6b1567d95eee63168b6b1e0e89f7427195788dfd90c8ea2d29aa31a249b7ef461da7290b657e73b33e416edb17b2fe7bddff9e13272140a1f7ca5510e224c3f94547567ec66f41ebe0df198ad23a2decaa7d1ae52923d05504d05cd985a7abab18fe8d75db8fdf64a55c9a68f367af7844e121f33c08c97807cae070723bcab10ce3539971dcb62201c0af114d6fe22e722640227b393b88cd469a51d9daa3f1b63b465e4dda1d1cf81a4327b97a9c3a114a18897a4afb466fe3f7680445f4cea7eb465845cc0c848c1f3d1b690b4cfdd42031585c5e976b2fba7b93d63eb34369c44b764131efa3412628d25601f052c3e5f084cd287fe6a52d0d16186a9b81f58b92cc02b88d0d73372897e15894781e36a9320ae27651adcd7d6beec5cc257f5109be5fba8dec9bcdae340802d45c01cf2f0c6d3098cd03848b270b826d0583bcf7730e7c622eba1a663f9f783c053d7f5f49a51b5e3ea185f2cac929f0f1d499011180520fe6982f96ddd443a0b4d5fc3d118eb36217866955b3e42a625349167e8db8b20a84615f27fc1d008030ce9eda68375810c4db3dcd0c1add10e48d1971841bf2414d2071fa743b31940cc34caedc32be528e533f6eaf151454812f5a398312d08f425209000fc23117a6717409d93461c6f69f9d90cc2ad43ad6beece31ca6236f2608e0db45ec388c19b343689bccc8fd32a6ebdfc9fa9c83e0bf6117178fe3351442865d4fe92594c3c1ebb60bf490c3508608a551bda22cac694c245e77d2ea1d8da8595f3d8884883dab45fdc0a50bf0893605310bf4872610dcd88d21e1f1717b3dc7005da1e939182e50fdfc874f21df0f5cc184c02496ecca431481010c164aeaac62b652eaf3c02a28ee640e3acdeaa16b6c6ee6c65595ea15a5aa3f02b1adb4478060684c365ddd861533d0d527bb3144365890dc3695235236049dd47d43a394b9a762bb2af0a19c249f50a75a42e551601573f0b96eb3f131c472f3024e2c4c917426af892c08882c82550022e73a0dd0b256c8af8401ea6f129b0086f8c38a1191817c8980e7ff314a4dc3775b2da7f168a18484d9d6708d5314b7431733f989085183a7e2b8c9d778b8c2eed8143295161b182258f976277476abac09c35770983683fa576267277a7dcc1990bdb86055e3b26ded5ab95b50c5f582e9f32d803d781f2079af5ff9be5adc6fbb6717c55562ea8e6e9cdb6b10f30f51e320afbd3bb3ae2e8988af3cfc2ba10a989817320e8dd0158e5898ac782f3f9640fdbf6e0454fa4efaa1d884650068bb01c002f943112301a575a1a91088e897989a069ae7a3066401cec0e89d835b40bff34931dd9aa5dc73dff33ed0d46e90e2923586a23844302a3dea333911854535cbb8fc8794be1d6838d171ef24fde35ca2baa1e710c476faa9e425033b3b357da12c7d451388ee46fcdb80c4414f26c24b70ff77f1f052aa6868bf97b503e5c364db2881dca2292caea2bc1e638de6f890b4926187dce4ce293f67087dd8232d1b8d522375146e3f5c25e4a8315ecdcc04d8fbd952fc5740aa1249033e89b7bc5dc15318993dee5a32e42a6532c1c6feeaaa642fb36e1d139aadc8073f5ac7ff2da11fe166dec95e2c5751def14dd1641464736d52c828fd137abbeeea155e43f534ffbea46bbf211564c8d70a5a87b4972040683e838efe101959dda41519253e1326f743e03afd56181e2198573025717685a290403ae800060d30b7b4e97021d6e7b5f66e77b7b4facd27be27dfb094f6aaa28074a7acac22d9aa5ef5651c818d797a41eaf47e545432011ae42131ec7b308a520d46f0622c53386abd2c515176729a61b722f7e6657de0798b00cf28d27fc2ac0583a0747cdb1e4efb2ee341aba3cc3a6e0e71870c9e1ca7535251cb99015df6871059f684435041a47045cfe8f6b699989d734e71175695c3a4048543174483e16a83b41b434c4e0262bd0579eba24a6fbeea3d0ab490b797b7c6e4e545379ebaf4ee621b578cad064b590aabb79ce22d2b68e8c2f75feef32a773fc5a220fe66478d3aa5deeb59716281de5390a39e7dea169bc91f296e934bc2624e1bc3bacf4bddadfb11544f41dc5eed26b61d7e5ff2d1714fc4af81c1a7b20065cfd81926ef1479719711669ad92d0f810c07dcd1c6709708a659d915965cf6c91c43d9a0618c9d63c05fd172ca8afb53eddf14d754d5c3e186e8c8e58a72d49d9a5aa4566435848261f4f2acef5ced9fa185668250fd31321cbdad7d45081f7ada37d6f1a2d2e9a8150afba07c5ba569819ec1e4419359eb9db10737ed6bdacf1e6618c4bee8e107a2ca0aa7d990942d2d207177112c4597616648c4f1291b6b5709d65bbc0bd922f4f0162fadc1f8ddf830214c255d6849a00f00dbb9ca3f82759dc77efae4e90dd040d75ab095a8eda050a07c98c0f3775428d686c83047578b2cbf94e4534f946e629eb87c5f749e41767409a5bd99d4e6eacd68d020c7a980b97bab13535fa8d2416fe6879a445f0baaa10ae95990e816509fd4fbe22c988af92ea5e2637cd19b7a19314e0a31e41307c4d028b33a27d1abd6442539e6843f6bc88ee5fb50fe3333d5066fa08068817093c7229f4dd12326234f92dcb6bc17eef79da276ceaa6d72ed1acac3dcb5f45faf6e2c713e893dd1ef87537bc19945bc22ca8f5525295e5e3fd04463fe0bd4cf13bc12cb7839a26b74c07d814c14bbc84eab315c09651a9607379a732818034c80ceffb3fd8e2e8be4eb3e6a3136aa0b1a889865faf2ed089c6c4f49ea302f4cc7f96b4fbfbde3dbc2963eb48eb1790670555f404fc9c290ae7aebc0fa01214754ac1db8e7caca7e6e510e8ce73a03beb95e689a548f12dff351238610eafccf355c091b07c929d082b5fb57ff49c2be674c34d2fd9d72ab0caf0c0055a023e6613082056e84c0dcab0dfdfa25719b499e15e4ebf747938c286aee8c5d4ffbbbfc0ab1c7b5541075545a368f289197481f086b00b40bcb20c2b2e398b14157c9b65652c31c3f85af9baba4f6b54410615c5c95142318a8736e01342c095e2be0b997fa2ca674842ccc013371d45403b09657ed14bc45e17e74cf25aa16a66b838564798391efc42cf29c1b72ea88d2b3b4d5c280a30ba8250e86de255b7b29c8996ab67c56e9c0066de216a5e086206533b3df17ef16ee0432d0fbabd48c5609a6b761b18a27ae4ec061367a370ceae5dff11b159a6cffe83efae41f1b0e4a8b3226a69d35b208866ec564f0105d9186743278c74178424e57e435cbc0931fddf70f00d47ec67c9150cb3046ee2fb15cba64d575d09fe71551f9a540f13c3cd0ca5fa8978faf650ba5e7ad2ea23320c6739da8687a6919a7331732e199e8bae0c932a4dc6b9d0036620c0e83fcd9c373c209f7e9ab3fb65f5cb66a0aba028100fe28f70a3300eacc7de46821ecc03da9b5889b179e5a01f885887bb4cce1d2bffd125fc70f0de79b2a3e9431f693b4977d394be415536c4eec417804f3ea40245e7d4d1ead55309c7803dc1820680f4e1b0e44736caa2d08b5f240ab84be2ded11f6aef8a53c9ed5992513b851e3ea2817043ac02a2aabb62a40541e126e1b2558151189c63f46ff9e735766c89442299daefebbc0c4f388f24550498a370ad14ed2ebe9d5af5594c6563ad40dcd5c92a5f806da52265d59a2279dc7b43393e756c0d472c108f9cf775edfce70dcec2b9a39bf98e69e4b066cd54e0edc35fc60c2703093b271e894b2882281faeae34112a3040ab5dc5c815cd17f4eb3de17f57f1c04b3e980f9482408dd5c6478685c8fac22514dac70ce58afc3bd27d7f18882eeed6f15c1c7b8519630468bc35f8ac3ecbff587db5048e42717bea2124340d4043845b5d85c03c2241117ded9a54cea2415a9f3a04330a8f3b61d1bdfa6c70c04a533ce4bf444914ce8618cfbe13fe05ec9ed13de4725b2892a9b672a1dc19d5d48fb9c1402675b1fd740b25e2dc19f147e1b93291253d6e36d9dd63018eaf62df462cc168ab2142ae1db8155e8761a1b6fa827b854e40af44efd52342047d74cdb48a3d1f4b52b983107806ae25f533282f4ea83cc22d0c34cb9575fa97ca73e29e758779c195ab3458ced87829e8bd1cb0ab1254900988fe6fe1c21dc03d393f3ff615a2baa0a53e83b15d8f54f97a10ba9589366c53bcad4a0152d62bf3895c0a42b022a01c71cbe83c6436c086c1a0a080605f5d87c71b40c4c817e064d96dc7339ee302d7e50640a9129806b6037657523c18351cb040d1267644feab24b8aa4e9c91b0057ea248103aebfb6f195d928f963eaaae2587362b6905c00b95d7b398e7f564c46651c023feaa6d7bffa9ad29c260cc2ae3ba97162ea5ffcee3c92ba3dedc087309a98f4964591ecc4c9b00e709b165f50f887846dddcb9d77dbacd610f11f40b800df282d746b46f48f2f61fba194cc4226c8166e0ae23d391b942038ad420a808b8d83a83544af89907cf381c6853b7e569832dfd048b6f2799c5a927a548a297afb363131daa53e9c7340ef43951f9fe9cacc1e4c2d56a8538bb81bbb3ccb383a3b9a1a787d9d8ace31af5e26e70783453546ead4be58bde577e472ee5f342076487a1f924df20f76dc3baa13b8fdfcf3187dc76841d2f9e88e3525503de569ebaf4dba27c060026aa4c2d85fe90d01d4679c07a02e10e045a4fdf883c592ae094f08bb8e95f26f7052be60a3fe15b5a492f03feebeff3edfcbc676288bc17cc049aec25611d9925b92a479f54c21dcb96a728ee436c6f052e2022fa78f4deb310a340986e90be3d1f0a6400ab14bdc131be914e2f90dbbb5408b2ec28eee610dcaac02255bb4f55c5df372e109d8e1720322593c45998b2166a76624706b3e8febca634d50f041c99d2234deb8be3a175169c732c6c063e99a0cf420e11a7df152e7d8fa31b3eda9d484b9a83184efba7553e092475afd771905ddafce6f43d2c21636358018c437d2d6106b646f7603a8477c1f44c77d1121637d41b5ffff13c4951e84d1d37a22500218986a17bf2cb5792871d42fe25af593063546e3546ac573de0ba1b7932eb14a521bbc81cc4e50ebd3269aaaa8d037659862d08c6523d8c208a153de1c44d30481b0505694c8e793e37101c9dc19f54cc4f5f4e9891cb113ac3045b99b5231b28a973729d2e80357467991b02622989ed63f3eeae89b2fa6d7a5eb47e679a7198cc8a28d5f4e921bc6b95e3ee58e1648201812c50a0802558f183ae7729cbdd4a0d5d60018786f3b935ac1a647213a3704345a539cc1487a7a6f4a3bea06531e171d7285c1c8003b3b68f26722e686e7e42df2668367b7500a705027c07e36b6d599e4a5b0b4f3dd54587cd40541031d25dc098b362cddbc8f9916e69646af2b22c2286eaa09fcdac4a6879b76f30be8e43e34ed444ae3664e606d7179acdb23f12d8fd20d77acb623f3f046126358b2bbf051119693b4a95e21dc8cb4d9fcc31368c519088f0a1e77ae89418ccf9f848f01dc6dd4285e0fb1050fa607da20802294cb54dfbcc70f2b5e448315591bb2fee855d5269195e941870765a106817ff325edfb3f483ced20bfec8926427d56805d7c93c5dc212de9c6b75304519520610c9b0ecc8a3c7ba7dbd003f6933626c3b9a2408da7b5c608c645dee3575043529d33d0fbba04eb7b41aef96e0da0b84d4cf6a18c3574581b46e4141aa462599d8c3c08ba8cfd38061ab68d57c84669e5c2923f08874e94c49a468c0170606695ccfcf47b27aebf1131d2eaa60685478e1a9a65957685bfb10f271569f3fa7a3cd584a7a1892ad6705a786f59dcf3a2f755c0a0986b2f29da81413677b51c5b68e127b5f86f51bafe4570890301e994c4cfe197ec5988d21208a75658c5f4c881b0a326310deaadd2efeb4acf3a64266903c054e2eb49dfe81fd9fcc95a6aa6ede5e4bf79a35c7220c78bc50158b96251ff46439315a280df215b5562d8c3c625726e6b507cfd26cf7b4180824758516e7f7ba3ebebf41aeaf0fa78304ab9831efef809f284ca2b2f4ce62e9125332198cb834b21e7f554608f530f3b539f555b37523a9fa7e3fd58f9577c0da3b847864f906d4d7affd3eb09d36482093bb78692d107a34ab364a372815532017208e549dcf82bdca812e405dc817c3e65558131c6f5b2ac68a6923c57be2ceb1877c270b0ed3a93bfec1c2afc569adb86034d9d2d98e364442640dfacd03e8cb0afd310af177d77614db45ed073658ea3a3ba19de4bbb4009baa8f61df86fd8d38e8b1b8fabfdc80d2a1a08d9cdef185ca35b6f5375fd07593357621b54010d0d0e54c0465b3e5018bd133172d9ca97e09cf3b3c2f42f9b494a4fdef461fbfe653068aa44d312b1ea0f26998e1e29d4e4ff1b1e30a814f0a2a15fd3e377c10f317bbc316cdcd41c028053a08d9f786a8a77315637ab0cbf54aac9241e488b7fa2951505258426860e64259401082636db4b6cda76bc23fb281a45b56d21b6a817626b0e6689ae1e9280752403ef9375dae2e39d04189ca24b78e2fca09caa474123ddc334ce045fbee6b2b05e19af7d25f70676fb22fce14e9fe754790ed1483c4e6a3240826ba23e206d32206340600946aef7c1071109ccabfa549b7431721db42f7e4532acc22dbc230d9c1b26240c7f6da57354141628edb1089a339b287954cd1f280caf0c5aacfb57cfd667ae6110cb8a623e07781f32cbb26c6b4007444830621ebbec4a950a2f2fae1ea418250c68614ec56526979a81bc80189e615d0aacaca2cb9fd5d74439b4a0210ba05cbc8726568b31d2eac008ece7634cbea298c69f5d6f042257b6ec6b8d018eed9876cf22e923fda3eccc313a7bfda08c82a06261377667dc2452914a04b37246a3cf1405a20c936109597886d6b03a7ccf723580a06217dc8093cb194e5e2ad5cf3e97f964021ae3c84fd1b7e911b224b04cdf4c0dfd2e41bc403f37949ff9757732e016ce7bb58ecc1ac992fa24606b4c5e10b475f495aeaceb8f7fcb7ccd01b2095df7b31e4690a3955a5a116e634b407dff34228732b070af1eb3acc53de94300031af1bbecfdaa84348d3402465bc6e7fe5ea3753cb8b23efd30fb849a9b0309fe1800816210a0bbb9c161da0d04dd6300e2e9a4080ba3700d84b4d0964aa1627addc007ade4b1f826fd1dc2c0528da0be062a26f3cb0e04fac27b2051d712dbcf22ebf0bf78006398d7cde5e3973533e6fa5c43d20b69f6f0d42b268c703ae535e407d71967eb6e929e7be04e72d831fcd436a2ce97ddb9299b9ca9975faa96747f8a772aa0973625d68fc91ed68ca165c4895bdd0f00afd118d9632dc57fb3550006444c20f86ea2135c45c92fd0b52c7c3311bf4b11f2eb6beee378919ada384eeff0dfed63b966b091735643244f45488074b2a9eed8be7d0f6658c8d158f2ee010da8b9f97dd6fd69dc2e82838df10ee2d72f449bf5d58f2f6c670444ab4fc08207f6338bc6fe23a30fea1c4871209161206473b008b84c256df44d6baea0823eb5b313ca80d279dbab5d91b652a0b2abe56019aa2cbc8f836b0f2d73baacd6d37eb2074ae9f1fe33a6bae7cd5ef0e4aad58f8670dba3a621b4b913376b7ac68f7e8b430e7149002d29ef521002bd6dc193cd00ecde3125d4b2365c763067b7c4c4dad30050ababcb7f3668fd2d2968fc069aa0071d29a888ab92ab2f1269526f60c1d7daca4ed2b705383022505220d65bd570b156eec26a1380f5b84c1e7e168864438229f0ab3ad5da0ecfffe72e274b6c4937417dbdd7820558404cea8de4ea6f1ba08867584d0c924a9722c73829eb406328858e56ad7d3ca2488f8452df88d7b80aea22a52f6f9e607ca9ac500125aa3acbe0487c6ff988a58943272ee31026b9bec8307a986f176139eadb8e449d1c0ee231d4ec9d239ff5ed192fabc4e36095a6f5b4267aee36ce98f8e02ac4ffe963b93241d8c3d52f00715809c4421a992ca2076e87462b5a2bd03f3062c2ad3674f79555aeb16633e6954d647e2db5668835125702b4a0ec7987c8541a512ded1e13566bbe1b29e4a01cbe6b83bd68572588ba22a8cf5a656a1679168ec01d694b6db18014d292a95806020234137f4e00f4ca3b06a7f75fd905dae5b9be25279f0a89c32a3c5c4a2e5b9199174692eefc10ab5231041363c17f83aa9aae8fcef7a87673025722294ed4310e72bab51fb7f8547597c9eb65ab9d68bdfff4b8899f226efb753b80c262715c18ad34b1a5d6a77aaec1ab9c523d15b96659f4ef108ad860435d80ec11c57381d8178f3b8443d9b55c1b10af7dba12be9eb21f32e54a60a2e81d0970c3e27bd23d4489872141da7cd068a80a5061272a58f94e066ae0b5895e9a1d7cda616025ce00e1f89b6a19451b6750332af182a7d04128dba1189aa7e95f338ac94d0802a201abd17b7412d6fb1aaa8d21459f53da8d41be488c764f39a1395ae03580c0ef03a54bd276fcf0fcb8cce9d2f99bbee1b46de60e04957252fdff54e1dcf71bb7052d797b7dce4eb75aa0c0fd067019a06308222333bdbb88d547339b7922636ea236e6d5a375415742c33a3ab58400d06c15d3fedc75ef7946672b0b8288c4fcca8edc00ee4bde260fba186bf1d34efb6bb1eccf17c80664f3cf38f4bde0e1cb9300583cc1aa9880c79fae2ea5ebbb6f73cba464c9b62acf385e1da80f8b49eef19c6a7b4807533a94a47c6fbd2924dd6ebd1a7736a98b8cbd209a662e0124da9c07777e0379ef8421cf10aa70ed9ad54fcf8f8f6f202453ca53fc30429089372fe56560a502d85f8b762550027c2512e8b024e35f682ae62db5ca47c9fb38653369bd9adb756667273cb63183c1681e5ef5d8ad88d0091d2e6bcf2a2ef5c6a2b00d623970e769bdf147d7fb3b4db51271df1baf2bbfb093b10d878b139deca873aba98fe19c88499b140ddb9d8e70d49c41b1f198a1f5f772930a32e7dc93376b1c2b4891e02faa0cda10aa561dfcf56fecc06ba2ae5085b7588e3945179707c66e9082605024e68bf9fef1c0431b18be6b65a53a636464f62318ee1fce256b545e374c4bc71ddb1d07066ffd3f501b934ea07686f1dd707d24d0d71f07363ec8bcde2e5214d8b3c2a7cbb2f14dfc98d82f7df30baf8e935ab7f1adcafa25aaf726923ba2ab78262b3dd0d34adf7844975e3d89f3f634e0c66497adb27906dafbec61371ba0211cc184655083c10b3e2722b2e2b268d30f1165fc7a31fd9f5de6feed7c06e7bea0703f95a903a2dea63daab366e6c70d649f14f36755022f033af95c70c01d947cd305147d0785cc8552a17d35a750cf872f5be86a5554af0390f50f31e99eac3bfa8d2abd7ab94556d221ccd2ec95d568d6fd20197a309bb32123eaed30910a56eedd5b83034ddbef2b02cec1bcb8a8e914c22012e3626eca5b472822e5949cd16791220b07897a48a7997b07dee474938011fe2c4575a8c5c6dc6634eaa9333a381d24c1ed34f688913380e7a6efdfcb226caa2664ba3c90f20cffcb2943d5a2bf40d42a49151eac1747b8d08274a58f93ef4d1097abce380d1072e455b31e96c827664d62221e3f6f5d825c83c9dcf491e60b1d78c519770bc7a43b20ce74baacb9ef70b576878b8bfe4407e075f1a041a03cc82fa114fd11b56873776c3d685bc961e9ed03ba4d4399696ad9251f95815162f42bb50f9c31017094d38c520cd78ebc10c051935380f7217e43508f968c5e0faae871ff75439b385455de3e6ce212d89964c77797895570ca790941f8d22041ba6d54894140737f2c2e3296cdb14815232840233e509cce401fca0ff78440da93dcd9374284430a504c65cd7ed8e64827c2661820c9103f0ab021f67e1bcd305401f62d0fd55d44c4886365f86a0e5fad49794ec4e9a08d8b61c12787cd2de3ddab6b8483b0cc537eb1ae05d5b7e044764053d6505d5e6eee82446fd3c161e1f15772ffceba092e241a0f7a93cfd0412a91751422b08f2ea198cc645146884ba2804d3e5941aabc82ba9b879831178c8640913491d2c0251ddd5a3fed3daffa6778328a98cee0d55133cf9cca66f2a53638f23da16f7c8f330cd499b2821bc377f20ff73c45693f364b0e215ba46d8d85280acb767db73b12a793449bf38be994003428a7286d9b91e40b84c9fe83274c66413e2c8ed3cb2fe826fc8731c68ada09c217fd61a49b962d54292c246fc11ebe7c821e46c764ffa9b53bff79e7ad1b3d20e3bf1d447e5b7024985ab7557771b47c8e518512fe86a28e671b8bb7d2312d54adf0c8213a6d2f6d3e1ca6099a5100bd610c2ce93f5bcf4884e3216026a428f8787acfedfb0c9f4f401acda72df8ccf64d088bb4df4413dd365619a107fed82df0b4ab7efb502ed5a3296452bfb9f2f6fb153766ed8cf42b15e741925c01441721b6a3e9d875738f58bb68013b47a7bb614c80860311fed3e58efd02a0362ab0e938676db6aad819f78338d2130f8d7012e8b5c5d9a53e843c7179c20d7b796a02aee8c448c93832583c55318b00487e7e2dd52c108eb5ca88722450b4360ba58de5bc369c11833aa22ecac51c3b21ec942387ea008ec02eed9b2c945b078262bb741b43471e8e6578b0b81a87a20ca1c9a520ecbbf9e77a9adf5bde8a123910fd80608890c301b7d4aa9e5b0a6120437e3e9e3024ba6a92bfb67451f6969578e639b8df8239a533af34e4cf5f7963412f8651507c231f46ec15a619aec92bd7063892ad9f2f902d34f0e93f8af976660d65ee0f5eb40ce94804bc7cb23b061e6df10a6e872034e33e3db4c4f5c60948aa2f248d388df7096ee98b82f2b12d8e2be1d7ecbe8e8ee5b8c899b29df04dcdc6042241388bd75427cba62de0e45808f58ca858a50d8fb623c2e4d53d93e8b932e2acb2d96ba10a632c5e85387d4d6b3f3ce16bc69a84e5fb11e26bc27581d379c534f9f260118ef9c41b73372ffb342cfadc6e65ea6041249a8835fe086b6cf0b0626ad710f437477f1a98623e81c1b6d54dfe3d78a3f954f1e350b38037b65c31ea13491666765b9748c0d7c402eca5ab4bf807af0f21533f5b8ffbfb3cebc4283f7ff63e943b91238f5d104e68af485ac2b237cd20fd092660f4912f795588fa561f7fa12936aaea07c810615088259321f542dc3e2846e211eafd7e141950703868689165323fe512de69ffcbd56804836b7cd706a0d6930e4d2b046c430a934618ec8b83b387363e241102b6c2cdb42707ed6a9a05d1d2ea544b540d89981774fd38591945c28b5afbe896d0e027d307bf6c67c5a97a260b7550a7b431a04e43c12f056df9d37b655b52352c93d0f88b6950936e9d89dbcca6a6628599942e3cdbdd2e31634e42772b9904b9c3c1902133f63556ca40869e07ea6cc34d5aa0c70973266190efbb702861660242523599aaa819b50aa820af018557f62092ff08b2e41244df95694fcefa67a8e4272c52a8936f067523ae14d72b88ba7710980a1f819f9a90b3426663f10d830eb6b5ccc60537d6d47350cfb6a3f5e1d20a843645fabbb033b39117e591f0cb5013f7092ac3336bd78fd3d72f72476811a4374834451561d62132b04e9137ee33222bbba93b238f399c4f064101cecc20ba21da38f5d8e4302d16421d2e574019ab61f4a22cad43c44d9e977d39f0f1c6af59aeb0e98d10962bc10c0d6d8caaf2745a43e7b4e41d938cbfba3e94f4e444eadb0758ae6acbc3f73148f8c9f37b44c42dd089368b326e5d375872e2e75291c1271d2cda4231e62220feb1187cd2a05154f027ce082bb19a734f22d161ec6b6f34be8deb83cbac3b41f4c8b6f5cee37c98b22503cf2f1908cc9b9f3565a9742fc32ac98e44d3087f6c7f729dbf19c9f96aa116111df2836b7663211743487d270129e17f4723ea2ba3972e006ec5b5010299855433fd8a8990cf9ef01ae8b3991ae32b357471ebf6b6bc142e548222bbaceb532a9116018467fda32e4c04f7fe75f536ccd634d8bd0250687da97eca9ebc8d44359dcb299e367d5901cbe25e9d3ef81b7a1c9c130feb324e34ed9c5ca328e3458be6aa6443c70accbbc85b7ad19356e71269df1ec94ea8fb0b401271feb29f217c7c98f63a012819427046b0fbd3255a30843e8cc9f3eddd9da5e9966b6c4c594070e49c2e9ba685abab044c61866e1513b42b677812964433631556e3a63e00cf037104009e6e68219ff10abe0678f6a65134be557a605b381be83d4367d280e00b579a2a0982286bb2e2cd32950d2376ee90e2fb793cb1f2cc541b2f8ba2f4eb3b225eefe27f4f378e76688132248fca6db21f50a4f3c6b22d43886e090828f77be192ed7e77ba2871b284d3e843fc9761ea5347fd79805362ddd592d186a4bf84d27dd0732789f421cc9e7da8bf3ec6a61b1c27d0404e4d205e241b177b85349f7e7e70d55c05e621b92daf98aa6b11dde1139c3dc01636266a5d317e1c07ede9216be2401d53d6ed70e015ede263187c6975c7f32e96615370ab382b64114993078bf5163a45bca6a0edc095278346ddc067255751ec2435b052ed190d01912698bae45721098a72d64db830b4567eef158bedb4aaddcf9b411628daa40166f033bf600628d9926e8b7b59c1c63d27ec2b99c11b7d097ba7c6a2cba050ab403e987b474105f5ffb7ca734bc90e2fb871b0fc73f60a722cd9a05c162922281375146c4ed864ae8b3ff9a896892c3cbcd06f99919e9440691be191df467d3ae89c7f686537961ba101a6cb5017e0bb1e8e3d36c089bfae85f85f26cceb7ad01bd8f5e48c5d6f0b6e3abc5eb3fd2fcffb9d6504f62f97ce326b93ec51a5b0d1014c11eb0980cf965d0431d6f70cd8e669d39d885b56ea31f223a95ce721d2b7e6d089f457b31142bf811c99bb7b3b7d3585a12ceda1f62ff19fe6894d26d4044cee443217fea3923d1951e330101eef901fd346d0f94363630b86d57821a243abe293b8954821361bf805c1be4138fbfe295d4712c11777386c3a2d47450c4419c88dd34a74990cbc6590d24763d4ada8bfe25c44856ccad9e96d7680bea043151d935b1c2b2e30579d69c6026e43cc067aaf6aea5d72008650cccf68b101a0ab12301c50b2d9df7d9b6cfb4d521a3295eccf1794e8bd7dce5c269d457976fa87c02ae6a9c3eecc851c88ab4bc75978937683e9a1735917e0b8c5b6ae1e463f94ec3266350b2b57c9b228aa2206f58b12f11371d11e067561695776ea951b54b467e3bb55e12b72c092abc36467197ee0b640d4ebbc873bb2c7004820935914176913b82ac0a18d892a0105dfe0196de2749b52f63e7643b1d38af662b49979b9bbb9f33d6874d987bf083bc3e8740b974334e70502b4c88350074f6dc6a883a6d7e8638b2582636beae4adf7f2b601fde96aa02ddc875807406456ec33874ad3b2a5d66250d05bcfb172ffbc015f49c2973035794fb5679c6ca8ca86b7344e2e1065085a9ab18e00ff26830998d4f84bb447c0c63581cdd838af510a7b90a0522af6231469f670295d5f3b80f03cae2d5db9b8e65154e4910584ca0e6fea84f5b945acaaae242183d2d9d794690333828c30bb056ded4a5afe43192174158dba27df9aaca985878285579220d4a6ed25d1094d81d45a66d0128b3d31749391f55d923640ad893fe99d67708b94f2e8c46fbab3d54d0a109d25017e961d73e078ee61213e3d291dec5ca8b3bf0e8bc2bda0ae9f69fe2f9e1128856a7f60b89e321b1a5efb324d524880cf68c8b1f77989f7a5e747f7a67542cd67a2d6460bcb2641148a2b07265684046632829d7ce05a750d1802f6929b6b1c94f703ae48e0c53a81a1644c6f5eaa9629c10af02d19db01ae1199047133012ebf03cc6a02caab89585f40902a5207bb9a143c715b05450c86029288cf7a9644eb1a04a66f7d169cc0a8188849c07bb10fcc71187f8f2427d8fa9e9c2e0da8bd437f80e68755db626b25a0a3ea214a1a812feb6378157b43365bc01e3023908ff62e217b4b299394324c055f059a05318fc90f7aad4e5752ce0b6c772169eb85a42d10873641602fcb2abd6c4c7eba6d82e0d855ddd72688cbae6e36dd517a361575d80471d1151b9d304a2f9b2038d6f4a244890265dbd226084d8ee2a83bafbc0c8ce2f052a912b266fe4cc43eab8d8499ed250db22b52798e68db56d2dcaa1a902ad315af44fa12905de5b154926077c9ab21db89114122b3abf087223b7f69665777e72fd12cebb6f297481e8dceae4e19980cccae4612521be4a136f27f4f777e1a2776e5c5b0f3d3ecec2afcfc3461b8ec4a8473e36557e0e7bfa163579e0972b8252b59c20a75ab902934ba9d5f2457b8fb24dd56c893c4b3493f3bf72021c933d24f9025f13869e6acaf957f65e72cda9209ed1c23d176cea4d7cef943d8cee7e923cf994db2e55fa1ad3861326493786de715243bff89a4add9ce7f82e513cfceb19d4f3f3bbf77bfdaf2fc5c485b8e12a81beba80dccc502704b06e631d94612f95b9ee57b58339f32b09d1fe370ce59f8f3e31a8fc98f496ff4bcd2cbb25e5c25189e9d25204b5bb2cf507409c9a0945e3b0bc96cfb2c11d9b924db799fa5d9ce25daceef559b6719c8ae3c1878663b9b609f5968671ececa1ff5986c005900b2a000cdfb8fccdfe71288f93140f45e09e44d2045a0ab88a4ad4f8511cd694bdb1504fce950eb9eae8b74d65afb23d8b4d01536268403c50ae1dc2c68edf5ea9560db6f6443ca7f2086610ea04a0aad417b9fdffffbfa34057cf1bf3fd955f8dfab3c154fc09f227a91bce4175af3fb14925e7be369d032be1202afe4747e27d4cbc8630fd1d3edc3ba5aa30d81d7d712bd47e2bc50d31295f95f5f6b547adf88c479e16b79ffaa6989de71f6c24f34f2bf1863f0ba7f6158ad5f9c4d1f4a34f20a789fbff7c8fc39fc921238e1a7b78400cedf5b20d3af6671a4658f5cd2fd89264aa9a63793e37bb97cd5d81937ef67f2035342cffbf28bf93df2f3f2e75c9e3ce65e8cb1c99edece5b534a7510b73aa59452bfa15e3c638816ed1943f4b7670cd1de9e3144e71943349e3144df3d6388f67dc38c21da6e00c0a0ebcf18a2ebae1fa54e3ddfdb81ece25b2fb571b1c954325dfddd7b6fa6949ef4efbd97d2ef746fadb5decfabbdd52fad18e31b28a5743c80689f40b6972c2e0025b0836e1b449fab7bd88578425c8827c48578423c21fed62fcede271a858e4742ea50a5e2c84b8bb357eb90f7d570298eea8dc07bef176a930aa6163d1a81380fc118e7d11088b1077afaddcb5f73595fd6ac2049f4215dab5b7a6f0a2e2bb58173285651a403bba2c79e7ff98a3ed20128a8e0fb237df4703b83dd1f39428e1278849e083533d4b807e69c73ce39b3108119745844d6d72d2b8e129cba5bc022af388eb3c35182231a8d4853f4fff3b7d6118a522fd75385eda65dfdfa7ba27c5d449eb46feb3aa0a8e386b9eef04fe6679db2e22851b9657ebf8f7d86141f5114ef0a3a6c00df3f879f77f7251bf023e6fb9225f0a8f9e8f1895033420e9266e6e2944ff46d6fe78d3788434c62d237f88598b4db2355105388e92ada209922eaf0544629f8da156857a308380b2cabcbc6d8ff9cb5e987e483a7d3575dd4461d8d3c0fb53f93e9f595678581e089fe176a134843188a2be8f0deefe3117df347e5595fa2f2acadafbca4579cfa1275e0b2d6c0b9c45bd66f57979812d3f54529d5f5ae1a13a7f06c00e64021588860cc4b9a3c81d377d3234d9878a109124274c045d4a4c90ee1abc99026250862fa8a34e9c0e7850ea1d0b4ae810809ed1205165a3412852ef99049a0431cb2145dc43ea02e4670a48b970746a73fa1fea54937f896d0a52b3e1bf48b11ac85fe363dc245114db85801e882901c06173b5074cba6477450f647854e8bfde1a0c54d8fe892e41881470901214e1ca7484185402565831e73ff7925b50112aa033477cf95683a93ae8b910b7d66ddcb74b29a2d7544a843715c1b2d630efeb34bce395759aef5a6f3accb355799c7a03c701a71c098a67381115dd45995555911facc3a994ec88e0d7b6ce8f303916d6b3498d0e61647106d2a99c83a840b3fb656893401d1023d2cbd89e505dc2a7d0bf78696e9594820e5e925e9ebdfec95bfd9fa6fb6cadfec94bfd9e2dfecf06ffe668bfec6fb9b9dff66e3bfd9f76fb6e9310ab4bf890ced8dfa2452d7106de088147d3a3c25bd2fc52c2c267246164ff0b44a246df9cd8ac52f8c52d4140d76fc8146035d9da7bcd8dd9a9a1af48977b0f3ffee304a097de2ddd368205bedc632c633bb000ce089f9f84724fac4bbefb1ab539f3435bb9a99ccd31755bf8e38b7300e737fb9a78a5dfc692e613616f4afecf324a0d7aa63d6741ddae94a599d6c7fd516c96811d446fd15188a29a21f8fa9225a05a13efd2aea9b356b925d3f87d5e44c0aeeadefd50bb3ab4b82b55ba5c79af5b5f6d1a528a6528a78ac198a6af56bedbe6e485e976f415d09f52ba8db1c89df3cc98fb3dc0634a6082b76fdfa225a0dc17115841a457fb1ebcfae656562cb9befabb269118f8867fb5fd87650969ffc8faed6fd7ffeb4a9bbbb5b7777ffb16b3468dc682cf7d2ff34fd197a493d06054be3fef7699de36dd0a60d5fe33317d340038d6babdf9e19947ee0c13e29a594babbbbdf0e709949ef3f9528c62805a2c251844979513969979516d67d8f712f994c251652cb8a8b3ea9bca4c08863880253a31822d5f71e994bdcc195e11ed80f424a71544a679829d69a6460d619f603f7e0cad0da636830e9a0dc94a4aa510c3015a2c4310546e5459f565c482d25966f9f9f5d99362db5905c564efa4505266544852930868a3e8965f807a639e3030f64745092af8a9132533e6ac37eb45a6c00d9ce0f520f6aad0e83dbc1a714c3b77acd1683210bcdb0cf8c440626032bc19ad9bda463cd5c82edfcb2e60ecf56edf4a85ed654e9b8ab5ed6cc2ad88669626fc4f0b1d6c66a8feb2a19238c1b3b3160559fbfe9ab6c255b2a9156ba1bb1124906a6b28d400695cdaa6cb6c4534bb19d75b88f4b5ddea504f2d1c8415b1252343aaf2eb99d1f248d24128dceb2686834bb1b383760377a78b8e143a3bb7163e706cfce3fb34f1add8d9f9d9fe45599b3f48ad9d5f9f292d9b12b0f0527d867484f199f18b0157c768ec1b3f378020b0662d43c263fcbd31626c7135a3060a32d01c4a0f19f1e3c91a3fdfb2edcb45e1e93a37d9777e1a6857fcbc046191e67e187791ff861de3ecccb8f2590fb2f2f8fffa675f298fc9646975f060a346db9d076fe1b63b6f33fd167e915c6f69967cfa384fc20c9854b92eb66f4e152aeec6e5aa498c7644c92784840ee244b92824824216b8e2c4922d148d28c0444a259d37e064195d24be5a965916e1e93ffd36fc9d2ca4eb7b223b99c45da952497c7e4bf6965d2cd9af97528981d90b825dd76fe1e92ce59e3e727ed9c05f3f94b2ebb327d7ed2cdaeaaeac763f28b0f43853e55403bbf25551ea9aa59333f38961e864667cdfcaa9f14abfad93918da4abc90ec1c38d92bb67aced66a67744e98d4ea3647c3c4ae3c1976feeb2c9aefa3d191606e1a9bb96f404bfa79b7b5d6ad4d90975dbd563b3641767cd0fef489203a9b8a3b6c82c06c82ec9c34b9cfbeae68bfd034b69d3f35a3d1edd09735e9b97536150fe045896213c46513c4b54198dfd804d1b126dd364176484fde40832339fa18ef8f7fd38221471f308f1f97405c1ee66f5af4e57139e33ef0df1288cbe3d2f498fc3470d0e6ce7f240a111d977c794cbaf8b8ff520229f1bc8b3ef0bb94404ab0f797c7e42745a05b5866c79a2d1a9d5d4de0667b29d363cdec42caf0784cfe17522645461778ea871ba56666067564c685737337e47abcdc9254ce057d804ee08fb32cf6da6ca63693ab999931c1ccc5714b230d31129263ffa811bcc7aca9c6e26224bc3755833e71edfee09a9b585ceec5429fb876bebfbfbfbfffae6123a924fac4b5215cf3b1313586793c66a41b05e1ed704fadb5e66aeb3163daac69333de605dfa7f5e9f46f9a33333516f7e5b46e67ee1a3366c2602316faf445e1b8053e398a5deefe7848f8d4984dc89026786019466d74a1cdccc426daf8bf16b26bd7f75c2c3b23809254940dac12a19750acc75155d080846841b53beed083ff3fffcca6599661afd7e797c78020e7ac027dfe2bf67abd6640fe45ec13c38073b89c3f671960affcd2d1e70701d568766591d8f32df5fb4276154413b5fc302ea9387dd2da08b656ab793c78d46a351eb51a8a96637233be3f0e25d77397e0940c326a0b1fefa37ddb8bf93eef83813e692d6804cfe3418d7cdf11faa4b53b941bc162962a888c60bc8cd3cce1f7beefa32daf9ea38650ddb63c154358635b7b63a0dda162ddbab8c3affb1577dc7bb1b803678c31cee28e9c73ce3bbced0faa943bfac36dea3087599a4e5763e58e1611e08970f6be941d5ede78cd2e8c62fb81d094d225f4d27bebad746b213e10fabe6317b5714b039080521b4e7180dbcbd5463cdfa5511c2cf6c3987535ca140202f3e058088208629f1f048ea5ad62b8c73e8d8964506339e7c172b91acb2da9af4cab9f041352cc20071e8478bd6ed8e1000c5d2e5701203c15a82e6b533ce8b3c692a4e0af14d8f249953ca047f55c2e9773393793c5908213abe0f2d4180c32d414c05eaffada395763390c8315af2530dc050f56a1e2fabda61949c07be2a07b468b918a9aba613c138001fcbf119aa6a686efdf98ada6b3167853a111ec6ca5cf72b1f1f001b4ebd32bc301937d86479e80a01ec14192aa6bc5f72b0edaf5f384d8f6474275195e68fb57c5b61540758e9b31bd725c006dbdc7d43fddb4469b9b96f737ad176acb1bbfd3aedea22daf1c7d78fffd570249a144c163eadfb4acad7e81cbe518c14b3a3fe20593333ced697d5eea5f1ebb3aa9931db3abfa2cd8d55823428f0636cf754fc163eae7b0b6f2f01eb565eb9f34b7ab1db32d52bf5ad64a8ce25cdc0976a52c9c94d80d8cb03e76458fdc00c7ae5e767d0b24b333cbf256fdecb68651c71ed6ac66ae6e2f04d6656196c7baeccb5a6b6dceaa405f955144571ea0975d7999ffb3af2534c5f1cfba5e2519b4f73c5eadabda95bfb76f79aeecfa03840de8933ad1a9cf420528a5a7ae6e6d0a28388b5a1b69088a89592c168bc97eb0a0053fb118b53103bb05e83f62b916a3c55037e893defe76fb31f3e376a3b7194522f7d4101c671c179c8134b006da7e4c3142a14f7aabfd7cb313ed67326ea507903e7d5d43a040680ce102acd582080912d544cb49205704300c99b55a2071d12269eb490f41b096254718f80baab061d6b2248d0f2d30b09801d7b2648c1cb4ca293290c4ad654954182df0da4a3d51ca79b33b90d500cbb52c995ad26ac1d62a7ea0a684be2f8f3a14f92e0a8618ad07a3a498b95e19658587ca803e33ae07087b23112700620a21b66d82076a24075a040d4350b12b18553481628b25f015476c1c9d9d9e30463d4c70a29623c728440b75db7eb8dbf645d70f14743bd125be2c2bfc4fc481e310383ea11714c715751ee2ec9424e26b5b7176d2db496f27bdbd6eb7db8d07a6824a6228e3e4990fedfa4c684e6a383bba22447c7a362cc3340e87cbb88cc3651cca8995271f29550b7bf2eb76f9052b618cb30223a1cf8cc3617c2fce8aef7be1dbfd408105639c15d8a5779fc6b58830d18d5b964fea8a540f339c450d5161155663a0eb0401010e1020a91ac0ecea0c8bec844784b56dabacce9c55c4b2446f3f04b2acd1db0f8fa021d42c0b7c1b92208c488f9662028f59fcb8e5f1090b7e664e7a957d403e5f65a254074632d417f6e947353d81281ad8023df4e0a27d18638cf10c139b1863ec79175fb3868065bc140efa3431be33a69b9fa69940470411395c0e87bbd574301ad0608783cd66475447f4a967dfd027c383199f0c0f66a04ca6b166fa3413263bdd4ea7cbd9643fc40ff113fb89c578f24b16628c31c6175f4cc3a1e75d7c710d8f883e290d9fae084a1659ece8171bf26837e79c2bc618df1a3c88904b021880a6468d5413354835a69a278c99ffc44972e05a0eda6da99e6bd7b74f6a4ce879817ba007bad96e365b4df6397c0e3bdd4ea7cbdde8379473ce39e79cddfdf33f9d4ea71c7f729d5caeaf3ca13ea0cfec028914b9d7dc97c83ea92de7d9ddb183a211514491c3e570b81bedd34b7e87df61a7dbe974b99b6b89256eb69bcd569be99a682287cbe170b71afd74432a9c0aa7da42b5854e25a412cae17238dc8da6b37d101f448d56a3d166315b1135e5c44ae129125c54101e7739e7d3cba8bffca180f868417ca82b44b6911370a44198d289231329291f95510b9df3e757e2bfafb682720129e56572d3a74eecf35e5cc3355c136dd03456c11283962f5c521938217941ed00a36464821a9ba4503f317c50a55e8f620199828295634ad40f1d8c41326cf00095830fc63066a09e30472f6250379951063484a811e69c615e83868c8d041cf919fc0c9450e28978225c5860714522914854452291e8ea1a149c75b21a2cb5c7a490645708bed5c1e0277a146a08a292ec805a71d220695bae65da7edfbb8b441fcda140715e28f3981b1a893da17a429f7a171b1afaf4129be7ec9e73ce3e9373ce39bb995d007f3a4da1cf995a0d77775c33e333265b123415121592996c2693fdc068b697bd2cd7322dd3f22cc73e6d5be2841337dbcd66abc9622fc40b9179322cc3f24b175341a1826297832951b2d3ed74badc8d0926b00ddb6a33fa61dc900a062a18d00f36a4830ea2bb3bc63639368c437777cfe5eeb94e3ea72cdb27b5d1bab3dddd3def5e9cafe7b94773824459e801d7f96d93aa06fa3c611dd69d26d3a75d4b32146ddf26272827284768834ede6bbb51176d7284ec2a476875b3c9b1d9e4dceed327726c9b8a3b6c72909434ac95a66b699323941354ebdbe404d955cd09cab1e520b126ddb5dae4d8ac996393834428a7669353cb09ca09caa165974d4ecd9a7557499b9c206bd2bd332c0fe1cc202424c660c40813426a35951d74dfafa10dad3f8eedd6fe576aadb5d69af6a54e6da595524a29b5b4de276192195ef0022d72405f30fb012816e78d7fe301a2ec5c9ed94687898d0e135a2dcda58d0e136bd2ad33e4fe363a4376e53a435b47a7e3c49a74bb7b9edbe8d8e8ec3cb4d171c24427e7363a399d219d219c356d7472d6f4d24667c89a74c772908b31d6a5185ab37e186a8f3cf9a0bd7ab266d51f0e3d6c84b64f2bb61897a0f751c73557ba6badda0bd8fe3648c5fc3d68057e9397d5e57939cbeccb7e00c3b647fab0a63f0f6be2bf240b16cb9c35defc74e5497f42cbb33ce9692b7b8f3f87fb398f3019ae9424ff1cce1a61d1dfcdd236b7619c688cf18f5ef477f4e5b5a6e8a9a8c3a4365c54020f6bfaa7e8a047f565a6bc1705687b8f4fa6fc609541b7388abff237a637a1e557de478bf8404adf22963e564e16eeae2f970f26faa4484c2f4f5a0bff86b37d9ffa5b9ccd22b747201580f4fe22d802f8d7d802b0bc7b25c5af678dedfa555421fdca9fc0f22da45f61f9962d56fd54dc71b32f0b77ebd2665141a8a1187e0e2bc3aec227a1e06c90821e5e16d2449248ffb72cda727114c51acb2ae94af8e1001c26ae735541c43e298ee6b68bf99e262ae4dad934b6631fb1870bd463806cef47f8475f4713fe845f006de1b860021260c080822739fc30d422b900820f458021144507224ad0cafabc3ffa50c462693f504118bd479e9508088e6ec213ca8e98c34bcb1bcfbbac1a1be35fc5efc50b6b6992323206975da8e4acd92b52c9cc8c0000000053160020200c0a878442a124c8d2409bdb03140010648442624c361ac782912489511004510cc0300060000380310019439132c407151766a0bd1a507a78ba24b1ef75afd4550f328e8ea21b544ada45587c1a8df7afba5a1ade1ae76c9adaee32c2354ef53cbe6494cc4f6290bfc0c3b8e3f445ef1093793757f4f87dd7d626cc980706064007f5befae2a5e18451721af138a19076b86a17a48f57e0d9c40173aba6b7aa8b81b3ce9bea96724772734a7561de30f6ad2a285d3ca1e1deebe01b74d7c47a6000fa02068f318927899d8a7f4a33a7d7800c88a7a9278442a4d2cb8f52df6a441bbf4504ee7353ac0b48dd278268fb0fd3acd823d8ba3552e959eb3f08a03df349aa0b7ba3a4ecaa0b01461d1beb92a52fc764f2788013a59c5e6ea9c45d653160a86b73eefa270d626eb04bc304a196cc763b82e28dc8da6043611930de438f4aab3255582e372f0afcac40e71718f974b147a89404c35457005d7c41ca8856c478d68aa67caa1f4023e8e9b339adec689cb7ebbf75e94bffe046b703ec53cb411363b9f047fbe8f1ceed31739010aa05b38f2e1d617b5031f7e90897d0a01350a7fa33b1922d2d39800e3b3769b3b1d801754cff9852d7fe5d3303986ef3d4cf4b7bb9997adf449409c08eb0568f51f374b93e63ecc8c6e01968df87950eaa239fc7736d91b02f14f76090a14c0bb9a65cf2e106c954d6ee2521d9cd76af6c0c34757b5d1a15057532a0886deec76c5d7e12f4ab88b9319e653d5ae9f1a13da886e8d17c839822e631497533454aa6eb455dc0737c4eb3f0033a2761d46c149ad7259410a6fa703058bd896e9291d49a5552faf105bde2f4aaf80d834c5e846146cfd797af3ea21386cec7981657a521c3544db810ae6754eb2901097c3449492fb64ae4d0bd63e0b8ecc3435f768710d31c77e4ee5f89a56fa2c60b5894271d71f1c2f35e73a7070974490c4bc9151a530b55c9518002c0cb0fe4b48437eea66a1d208cfba57cc069e7464bee8af0a182e5e9c4bbd932686df89054aa0000dac7c839c690e17d2c72022e338b7aaf430ac00d8cb3a69654de904bbe70a02cda3b6aa5c46189553daf6aa771c8b8371901380fa5e635925eeee1f1ec52f45e4ad4708cca4187735467d5c6ba9584fb1ed264c20173ab1076d585c0a1ee0d74a84e7a27b10ad3071b7dd5f554fa1ba74cbda4b9e77adcdfe635e9d697b76a8dbde9a7e5f4da377b6fab079628d15ec5aa1d8f8abb71c8c86be3c12111d41c5e1a95709cca7138b36693eea3501c088a53530d4ad3acc135b44d8b3934403ab286c268d60457acf47369d830ed3bc9c24e98bae6f0a4e401c44ce054b136f4f36341fcbbd48dbd08ccdee11a63c3b8c0bcb107429bcf0e6c888d360dae5168b67487268445d154b86e8dcf1517ed438b2a1174e0042c4633d5630f1766a80543535f6332cd0da666f327684686936de1539910c5f224a17e0dea0c928746262e71f888965a013a4811d5dad8a5eca2b222196084412306f1c79bb889c1ca74122cecd5ebd8f581ab6e6bb928c9d120244abb1db722ac382b2ab12d2368cd1326b13794acb7f17b004d31d736729db2a6d57a9b1047362a5d8f26d7d2d4b4badb08e1889aa00461b150827cf5826b3c1db886d8fe230635473194c6c5ef34667bb439b52b341bdeabf1e3609ae2564b93e3b4355add5d136ad14d562a1766f40e0ea643d23e92f03f7024bede7804412c5b89fa63a52f380e6cb0ed93f1fc78af51e75b7bb0987a6722a9ecafa1d4fa2d7d6b058bf4adb7bd7b97527afd895f1b253d415b4b18a1670de3b1d7139c0a7324e4e58d881a5d873d1b5b9951853d506a4a9038f1f7109b36e638ebe54901583fb3e4fc63eaf4d0340090c90919e795b768c7c47cf1c8988436e65904d171065a20196fa74b0e71b6018f8c3298e319268b2c9e376217774520f725d9f92bd63407ea9cb287a7a6cc14ae0691ec4d7694d20fbf83b6da1ae90574d274668c6c1f167f6f3fd4aea762fc13b1e219f53df5eaa7e1883807985726d32d80248bba211eaa758c5fc06d0dd5e5320b8a56e237706d7889e3f26cdcbc4c139e9b5fcd762dd560cd101a7e4f917ef0359497477690e4890a79ea0eaebbcb66a72c9009e44f620774fee5e0b2e2af3f6d326f424f2855517f94e7554f20ec854a2653376c1c7cad67a3633ad3705e88a094cb0ebe11597819da7fe0e6d58b6fc834cf429063bab198c6f23eaa26ce1039553a442bbdff4135beaad75bac9df39be694ed20c6e2bbe802337282c5713b5115efaa8a1dc0eedf8536a7ef8bf666ba0a7a39d0a169c57bb0e0172498301bc6aedeb05d5e9361d2796492e0574d25620f134e32a95b7f5dea1ad3f928d4d42e624c3ef42cdac9f0254e82ce0fe1dc52ed340305bd97523500a7721dceacdcacbbaf6f85d10a25fa8b18a0f9f60e4ab5412ec16afb4da3a5427b4797689ca735a73ab06e29f4ae722d60d66133dd421ada99e6ed60cda3387cbd0523518f96541ffc93aca6cfc683bc5af61af4f1f4b4de36d30d2ddc451db3a903eb964aedaad702469d37d3457ad721d1c4767fae4c695825400ee831479767fd2ac00f89d5cda0a7356ca180a14f8f5f00ba2e12d48ff9290d058169ec6d715abd86f0f2ed8082e6c2ad8979711ceb00163050655f791237f4685e38dda60fa84de87a8b40b6348199ea83cc304568eb11b1023d30f78543696182e3c7cdeb21554cf7e80133f03d6ed597a0f054c0afab8d34cfba362c75ef604bac4a36b7c836c7936eea087ce5d71cb67814e97ef72ac1e968910eff91515b83c77cf88727c9a5e034c9a9beaa39ad249400cb7ca4955beb792359330292dc9da27f36f4a4425317d3a2576624db503cefae55ad129f7300fcc4067424a1bf7954cf5f78ed39685c6627aa129bbf25fbd4bc297bfc20f1df146e8f415a998090deefe43afef7b18d54c156e9888d5b335d9a3495d3a6f13284493291c9c341cca1f34fcaad318a1a0cc0337f324fc1e88286295040eae7d0a17cd6d81bbfd7b968c24d104049e6a0c8b233b7a92d685db3e31dc311d5da41c81a01688cdf31067377075df45fe955563162dcb8a30e1c021d20585b1f3ae875ec4f65215c2dba68988397b7cb5fe51e60e9442501d677ca3c41d8f6d2485e09f726473b48db83a5c5fd991050a6f96807931706436137ba810fbb137882947627e172b0550af3dc057221a4ad8ba65db9a688af68509954131f392d852d8607534cc0e4d23bd8f8f9c7d5ec8a8a1c36661dd11093307ae90cd788d89209d22b021d06b38e35430cca42085d4546cde9e610d304a93688dd14a42393b817eff06f49c9bd6014daf255c4047008964a161530a43b8ddf142bf34ca735e08d7eb1d0cbd5c44e03f75240bc1594b665a1bb6ba9aeffe53b1f3ee28a9085b9e26b13dd8199eac284a32bfeeab5e4f3361ea3f67865d13d1473bf771a84e6dadfc3dca4f32d6c1cabb917c3a0eefc11781898754463c44826b8aa0484dd5400fc8d385079f5afbd9c6c1b9c9e302a1077434744ca98fa6670eee238e136ae64ffc007feba28263c47e95e535697a4f9343600c06e526c43c0926deda280c6b3bc0078bedd7a9215bf30ff0120c998f7d4cfa0899353e0496c1da6e3335963ebc660f23217234568752f2089d16420b485e525af88915d18075835ea017cc4b3357a04432bb6f131486d15571a46989ea28ee4bc802c946b3f0e09d937d342391dc1777375139e4d5819b487507df694d19ebc12565c7d07b914b14cf7afb99b5988a7dd0b4a0ce13b0319f48cdbfae55b31f47fd18a324e84d29e142e2c904e5dfb89127ab48332d59f50a6650eddc27dfa028aab5aaa1f3abd968b7b622dec6dc1811dc05074556f9017783ee8f6d1082941a07e9b1cdea1b7fde178d420f90cda12cc599f33e01996c36b2e41486207666b802328f424004d9e2712ea0da7f8a3d4c5ad31fd2d85756a7cc7d19add1234834580240814dcc419b4e871d169001800a8f0e2442610cc8c309eb215f51f2ff090c09c44c75cc955947c4f864704da90935432e0a6808044d3c9e9440f0f54bf4a5a71b3ebc9b091fb256c7c402eb6363385559935599c250ec62081530fb71f8e203a96fbe6503d887b701e7d3f2d1cb630cc0448719cd3cfa4abb5875c033720d5dc7e9e40833eae3978b227d838c1278b4725038f422f3c246b9e7bc8a402aae697bc2b0418f6a528c8c8a3a8eae38dca8124cce99910bc6b12122e3c4c05b4ba1e506d05698e3318ad661fbbad2fd489a4894e4393e097d913dbcdc044086dd51978acf63230286a213583fcb1002cbe7800d845029ab20dc9d7d707e17fdf3a10a337a98edf2830e9ea608119223967ff6a71919da3452130b5c2ae46258152a2e28b8fa61640fa7b6d3b04fd943e4705d2c7ba092d310791ce04fcc303b23551e106f2ae360faca308369f4ad56348869e4cb58b23f6c9ad723ce77efc6a1f4bc5a7b2c5d663d87ad367c5e513411e67c61a9165e612accca7b3895b6ddc37f49221ec4d73573284b82f7c386bd737030590f94098b3a35acf39f730f43e21e0defcd0d7895c2c81de9dd2e96cc4890e5eb3728553813b11f6cf4a6d25b59c43d1a2fae33a23ad6076b2029ad9f02e2f58d0c477481abdbfbf60a2bdb73ac2aac3920d624899a7b5214fd3c940969b54f46583342240a51fa908c76114c537040cf340201572367357cda10f7cbf178b850687bf23c2b2508acc0a4739aa07fe93c4edcf3ab136b7d1fb9f0583bb69c353c4fd57fbe2ca80a9a33e8a8976a9022b79e08dcd8239fd089826388d80d2e542a35bdba874e8618819b558ec2a83be682454cc795a2806d8c010738106c192924ccf352623798b0eda9115a0c33736c5d5655a30adc7f9fddc452c56ed576f0e727b8fd84ec2aeb482b07c0479c4bb89c32a8e42b9f63db211a8acf5bfcbe25efc07963be0f2e01f085bfeedfa2e8fba1c89e7ee590a7f4a778c884a73ac05d05e42515742e084ea1e270aaa2a1fb4a3b8b0094a5a46604ed863166411bbb3ce08e909dc6bec72411d2e1540130b74fad735d2c1f7b76a30b7c026aa17fc993d550a0e75cd14688d325d3bdb16456ae49b6cfdfa5781929b0d6ebfa7787c7f4eb659894ef5a3711857a27bc19ead01d7604e74b2ba82057253d8c6bbd33efd9154b42f8431fffabade9891342e8b8e85c2a3adb1df83eecd46215e99aece6a48f7cec2b0547c76520cca666974177d09ca54083144e0747af5db462f4785f71b9d45e4db5b57a350ea2beaf6db199735f3751a73c246f6e137565953c468a16a638d1a49207a0c6fd3246cdd1657bc8546b8e19e4c0dd2f152ffc78ccc3846a5a303a76925ffccd09ff143796f46577a68a89c15e433133e9dae2e6906c54a621aa178a235492247bc0bce38413f309a7480223f36023a23ac6ab8c345333fa904ec1caa3648f4720524db3a2e993fff49129cacd2f5694b2b0775c9da4d4b04c32d500a379828b280b90d6a302bf5e70ad0c96f9858a9bb0d3accfe295d6d721da54d319a6b89942ce7a1bad609ad92df50c0a8544bf9bd0b265bb859e6627a096f1cd347f036102a650866c581e843e9982f998af9ecc72769a1917e8f882feea796e142bda35623b4c24fd6fe4f40f38826b938fd4951cd4aedf89520ba214d4ee6293e5d688c40b52756e7d95eb670d15cfe4a7886b84af11f3e489ea7e6b7abae8c9bb10a967dcbbf91b631407a5353880d41888851d94f24537439ae4facf3b8ff11ca961e4376a92511b0553d55cfb52459822123815d9fefce80c8f4ece0d7e7dd4d0954a006e7ba95a7118a3c4cdae1e9fab9904bd8f16ed2795d063145eddee521626f210749e3f89f3cae85033d54c09507afa0b8e7c23b274bd98fd5fd9b92dfe6a21eac761a4f1f65b7f44164aae6112613564164337b958e59e5bf6c2a4e21c0682d025ee20892cf9140560e25c8ab226c6c5a60cb3c155abc4ad745e01827e4e7b7e66daeef0e0f9de4c9ec529f73fac67e077cc35c0da0c477d1b9ae3068608e09c2caecfe809ee7dcff248551a77dbcf041e4b32c2cf34388a5a6ae075b4326f9706b44658c9dedc4d50db5dd45f70b77dee5d7682940c0ffec054e56f74a9d1d48c3eedcecfe1ed4e55209a4cfef61486522abe798fbc96c7844c8dbd95e52b45a5ef8dd8d8de525893f1042e72f970a95895b5ab0fcae0a4198a2ad02f0dd2dd7a046064c60992109ae215cdccb1b45893523c90061597990f0c584682953a19b03fa59835f086a88d6322b669625841ce2729625fc091fae3cc5519bf55d87cc49164cb9240a2a87606a649c2bf4a95241ced6e160ebb939227ae25915798c3de46f7c61c0c59126fc3890518d5d58dd4a7b4303627227cbfa61d92dd232f13121ce968555fc8e0ec3ea53ab8ae5c718abfbd7e1f444c10c38e1632cbfa3484f7ab8d1bac840cd659301201b4a9ae82acc3e9848492b1092e606a98f910a94d10d7017bf12a84851eb3a4bb58a5f726275d2aba6547bfc9dbc4ebc92082f9c4432940d56ffb5b8f8c6873a7b4aed19b895a4c687245712d010aa5ee4d6a948409c000d1c5bfac1b83f5e4b80cc44287ca9abcc1ceda603fd4a02ae61212b2af64473ac3d522f7b628c7bec8b12fba44e40ef04d5f32881d62f13c76038c951cd2983ffa8908e54305674f35b05f077b8dcbf91cafbeffd7bf6bd2e3719b6bf43d142c0c3eb3a9098b369b0cb0f7911d49b163c32f344d9384bc8cd3518507fbf548dee7f590678b06e297e9d494ec61b9f0caa5831a57d0c473178207a186612efb34ba880704e82c156fc90f5d50800dc58ff40e8c83f3b4855f221d2fd606574ea082df31d135de8372f49281491f7f41cfd6db577cb9964680483309637a8985f6f77c798e2796d435d2dfb7de1a3d1abfc1dd9f6a456660c48a86018c84132873f67c0087ee43003080a74da97c6f1cf8f29307daa10594c7607e18f890cd1b51cad24b3fd87240b78f998b33a238b4a1be6d9301e2cf3cc6eb5757bc16af1a1a57b9d755e51e29d7ff09d743b951f427f8c3b2efb4bc61f18bc04ee1a83a818027515a092e92879680a83292d9cfe8ed956b26c0b596d824034703e687f02adf76d79712bdd2044e1c91d466a543bdb2041ff6359fc3246424d6f7f00a78bcc7fd15066ec202f140d20cf4a744a5dc57c8db1251bad43e44a1f3c0bdb64969ece4c7c085f7d2b4fc472136a1d305e1591e0033d4e2edf442fca8365e90f9e5f11e1e6bbe54780ba17bc5e171bb501040addc459b4eb9ec5f21509f9d00c1f1ade7e86ca2e2f0411ca25e8db0c42ccdd4f16aa47c4225943c9f0fa2cce07a1e2f8a4823abeb2e533b74bfea0bf0bc4b8589260c79062bd4d6966dc3bc054b126e96fd0b59947b6217d811bda0c4f4bc8a527f2e8fe8168bd63e913847d0cd9eb81a5fb8ddb833dba77f133cd32d92038486cbbfff9e4993ac61c8bc30d60b45067c3ac7ded4c37f72254ee69c07803394f219b9bc0577b573a77bb71d8158a3a34dcdd62168dc1ea5fca809ba9a8f0bfb3a02f0f539e572efc995a0cedfb554a16d5d4ca13cc4b86a3d1a8d1cce234ca6c6ef54935ee20b6d0f5adcbc79e16c60594f23c2283df098acf7ff5f1ada25660fc316f7166a0347e8abcbcc2810f2c65452132104555140b3e3c80ab5850b6f5d5bc059d636a0b5c8aa1939421f5eaceea7943658c807a0dae66d85553af2ac61f55b91efdd09b779c80956eb8719c101975ce3e7263e086bd11741da27894bc2252039e50939dc842d35920bbf92fcb75ceada9650591302abfe4543b93e984d5541786954b03ee67c033016c0149080f80403289b3ecfcf7f1f47670d84a7c01cc40d97b6725cd885d32735cbafa9a68b32ba7418bd9105e1cd586b4570b3c99709e339ac862c7358904ec6cb6463dbc227c654e66936d1927f9282598088c632463d88ae1a723e6bdd506284081b5455cb199e1c556caaf0520391c2ab456a0ef6c3622d31aa299a7a68dc996137608a4e10107a83dd929b8d2036720abb120c79e007cac666a99917f7c9bc7175e77b411e77597ee1f8f8433ec979c402888a4a955b17fbd2a619a2db5a55d6308ac5d3d5b9db28e1c525cba61b7ebd27a09c4aae0d559d6d5c26fafc0d505bef202fce81bacf21939c9c4dc70742a687ca305def397eaa90e7c26ce017e2bbcc30f249e5cda855e3945a339619f503250347b9a420c244f8c6eddb865d445f47ab16a31b669bc8d342029d0f524d4f6776854cfb3094ce7ac0439c11ff89ed96cee71894ff71e9fa7a2ead17e68c11379ff8f81369afaef9d8caf268128ff92777d21832822ccb3e68ebb47a2527b956d9ef8ee837e78cf70c359397b257c7973e1f95327ce7cab2d0e7fa9361895ea8c22453490b3c76c3ef58f93eac1c34af3b1fce73f6091f90fd30ae63c6d1fcc087c4ab3d93b2801e673a369624671587295a6382268312ad1ec8ad46a79e1cd20f7e231096232b6a1fa5ef5749995e470087792b2d2e4c3ce8a896f6c299b5e955b4f1e7e2a8d1793b5ba12a4b70f1bc0cf0263e3549581bff44e1d465ce724e26c0cf985c05ec56f34797bac586e1572e2d3f971b51e09ad46c3f6c81cfd70f28a667ab2b1dce12e036d9ba5502686fc061c70c5d55a3fde15f6b2007cc386884742df27697d4027ccdbd8b5dc26962803aaacebb5bf1786a93674c864c0a802be7b580e3c99dbb83412b74003be39ce9655570b7d34d5ae0943d9c9135c9c27a8859e80a7bff6d58567a75f1194d7c29622b6d7897bdff72da9758965b7ae95af74e3b9171d76a14c223ff29a05f7ea821f6466bd98391e9a7303a3b2dfbb42b06f5630804ff4a4df61054e1d8bcce2eab23eeb501474739bd0c983554010dbb8b0c8253a732fb17b7b7bddbb0c7a248ac92ffe7b6bbf69c701dd696e27d9c4b9c7190cf13b69ffe57f1394bf2aa918bbe0081e2fde566d7941d20419a9750abe42de7f8f9975e62aa4055bed98a24321085849586becbacb4a08f2f38c409269ef307e7ac97d99cee43aa1692b5e5217ad122ca15bbc0f8179bb6b28b0a1c36b843f6a110fa4b6cca5f21d449ec4744bbebf543a4aa91a1684815e629db98fc140075590b65454e06f6a83317d14f0a6380b3be392887e4af815f68ab348d9493237ed54166230c3aacb4d5073afffa620cc2cc65712b429b8ae9588062c7cb3e946fe5c13793443163c1e1cd8007a0141bc0e112786164bc4a599632461f3dfa972d6befe36aae8ff40023b0608d05a92aeb1a2fd145bd0366c1d403cede68559aa86fc0e8c32afe8cc9a9a1af7860be6eea2aacdfbe6c36356eac3e13bdd2a8f6ad38e67d1e579b0d03e8a4e54781c5f4ab8dd9ad7af6753b08f7a30a7ab53f364dc51824853ff2cae44a3cfaee0990a5aa8adfd6bcb8edc50520ca901cbc4d359fddf5eefcf93b7b32a68767c550fdc7c8992e86d1723c3a42b34f1710dac4953362bd07d6f3d5f0965c55b0bae53ed2f9ffdc2747368519d90145c457436a0b50c42fad71c103c13a1afcec81d0151ae0a582e3d11eb803e6def3ec07a6000d6c6afea786a2530b7490af757d8f19b8dcb0a56beb1a708812253e4983a1bda9b83461493eabf845e56e3373ea10a57ddae5d75e9529a8f57fa658b568158ffac501d2a67cb0f53d1b605312b91c986afed84b5d150a2440fdfbac91fcd60781b9e0a9b3476a50584983e5c958e2a6299c5301f04bb57f9fa48dd3cb6001d2efe452ffbdf47c9011a4c5c77811f5bfec4acd15db404dab6279cf9443b82e47ad32de31c7d324d2228e0ca43405a5ccb8a1fcdc3011f0e3f20ade5e8fbfb0ce0d8c4d62ed9446aa16513ba14bcf2db6165aaf919d4d0054b9eb4c5c82d049ae1c738bc3d38beb63baca3927e25319f883a2d77faa6451bcec1868251b1b60019d0a6b253c02338a49016fed9df05b0b8043fd707a59733db7f890c69e68fa439039447d4648c80e67c4dd5d8e97672750142a4f3e2c0846dc2f4baba20b0ffb4272e04770b1ad7a24c35fd1db3366abe5b9fa3197057a86bea278a531c1732b324d5047c7cdc8a47f517a0b8b48d9d57da702137c5fa358332232800bd4b5abad435a7fec438fc36d08a71d173bf9576935b53f4a3ec7e194d3aa88a1a06a0bc915fc894d76300b09f00065068bcb54d62472352d991b9294109b8d59bd966b338b34be412d2b80d93b1d062db7a856d6b725b05b2452e1e1ae643a1135b298806f04269fc4ca26bda9c87c203a9e775eb5d7ddd3a0ad487ee30b42993511ac4bd32cb7edf62051cf65e95f45bfb24644225d66e908f23c27e32fcb84c8c70db58280270ac22622d6b39f993935ae33b9dd8a9f21ee765293149b816d78ab56e11323f593b94a6464a05b25b7da80e9f609f223904857abb2d74c1956088780a5c7b6ebd0423b1ffc5cc3bf472b382c03fae767795c283be78d807f7ca777b70fd9e5333f7b5ff39ef83e2480856be53d2530d3931e5c4d86b246c7e45dd76bb212613a5c3012279dfbbda691fc50d9acf4b9e0d48bd7f65be63b5a6724c46124e2c7eddaed0ab6b9a5199d714d32168f3020ccdfb59aeb449bec696788c7681b3621ca3817486c9b80150b1c6d2c2e26ce51a98f17338df26c64178124a7fbd08d1218d68d65b9c846916a0bb11ea4b8a9efa102fe40c966f745d44a89dd690bf72b58e7cd4f91bca81555338dd463678c89d31dbeac0db0508f872e671709b89d98fce5816195a8198b5077236f50e21b925bb96832189a1ce3ad5699d475bb73dc1386157251478809870d340c14d3e45febe1490aecc2d71526e5c2bf168f34d44367285d18974d54b3ad46cd6a1d2790f8ea0166012bc9687f990578a1b5f16532d73821281746c4c0a0c06628bb12851fc70d74b7ff737fe4906b3679a64ec44b7f30078b5be78d849e883c8b7f404086e31f81bf98200c9bbcc762cf7474b0f2be93f1eff10d11aa02e94031c3287c9e6acc1ca389b1f3085123a6473f40ff185905e51e6391b4970d21e8111b28695d623a0a3522d0ff3088a2d8debe5150cfa7a995322695203b1f2ac018a210716650e1c8a6b64f2305480e39c06ee2657f9e7020d424249a0227480c07bdb7027d1241d04832a0fd53bd8e1fbe06f84445c4f6be13ce564ec4bde41fbd9cccfb108c0cdddfbfbaea0a224e3ad2b25b5a1417ba0bf275af16abd3e218b72f1145ed558f02291f3282ea2e41d2c53e0853ef7094879edea105d17b63dbcb76f1aab0406ce285b93d4b11dbd4493dc37ebaa59c87ccc30f3a7733d86d929a5fa058cbb38b8c25bedb2a80ade9f20376990e274c0ef5411208bbca6810e923f677d1c68520792d444ecaac95df7b8952b33285bc859b8de1039400404db644e043c86f90c19479d8c6161e782dd1739460d4b76f624685a3670d0891dbf6f8bd3a656e4f52400f7b01b147a8536433f9faffee935c33e919b05d17e1128ef37607d9acae33f9d8524145eda3a0d59ae5a20bb85a6cdbfd8f10bec9da7f14d84776f974a1be30e2c52d0b4cd4ee538846e2f22143b0ab820b3de22f4f6ccc7691a5a729d67a41f6b3b005513c65f5b83f166e8d81a7250666ee781209536d6f1c43cbda864afe098070a84ae56288a6a29e30f436b5a24d9f3c6e2ef9d1d0103eab371b365877226953073f7943cae8ef76aa0d2de8522634159d6aa4de2238b29cbb4baf913f9f2b0f0237012aabccc72f98c9c68c043cf58f338393af406e683456ea2dcc3738126aaa05f6fb8c2334825c9e350be024d6fd6f7ad271e4c89d5652384b6df5191bb3fbd91e681f788c0d304840d20ef0be2c7e17390f6feb34d730785542507f722fffdda367b0a6b303ddd7d73592aa6b6aaf14e1d2eedc654b06ed992280254ade84df76b553708fd27bdca700639d16b87bf4ff7a54063a7322b1dd919cf528802b61438b771298e9035137dc59380f8e828d68652298d75822e76b375028d6971611b627c3a8332d90601f7c7bc4107fa0747251365a62f6aa099eba421b636bc6de2eceb926c2a9bb29ae8e1f334db2f6d0a1adbd8195e82cfb177176119ef43df257e743467dc6a431f12a12f2e6461b9120d34dd1acb273c59a6903a6f1471ff5c7efdabaa324762f655b5ca91ea259e865afda97028fbdc0109fd25d9576ccd7357472dd58ae275eef01b306b8a1eafa0b01c958de9ee06f44e8d0096c7703677b90b672610e54a5d1dc085265aa06a9a86010b34dca3ef925420521c10443cc4443b82ab598439c2ba714bf808d3eb3cb6370089d4edeec0a8ee042e9dfb8a5677291bb9d430753b386c1297c6cc16c1674a90bf7b77dd41fa49237554a523442286e5df89955c39a733e11cf6add6310ad5d11b536fd38826317f8d1147e7d761ae7ad634b82f6478a4eaec042b718304175fefe118b8f7e61ecc1277eda64030be00ce20b8abc360da007cc6a7b993da71ede9262c5f49461e464b1117cd17d6aa3e88f7b0c86c27705c0c396af60ed3f938342005cddf0033c12d7612350e06bacdf307b527567d5b6cc46bdc533b0e19b8d2c44147f50fcfde8806ebdda4376fe52c353634946ba08a522f7248095800b5d621663f986828094e696c2f46f8a936c62f925a1145f68048708dc582cbe712af887d79683f946e345191ab746ca49b761fc894c9b52e74801b333eb7b4e115969618181ebd20fe8a355d2bcd804735e6fb107c050cd2b4b5a3123798094693839a6241ae80369a6b5c7d65c0593905eb075a315ee44117439ded624937283cf5afd8caad20cd61df2f9bc5473b7e70e089d0960d1818950495273c9cd888f3227cc22a50e16127b0eed5a1c74fe18453fd0351e1b880d9bef34b8ae9f0385e369083ad83bfc2ce7b0d212d2c37bfa00122c6dcbd83b4e7a3a8d872f8beb748cfe9c69aeb8d6c381d0925117adcf16d39c247bd7e43892d78af980fd4821d65a2fdf7e65ce2397a8c331cc575bd58eed1d14c9c914086d460be161079b6e194562a6b7b9f168a7f1c4ff083d991909ccea248d8e0520e7fa09d7cbee24858a55bc33c760a44f5010d8fc3d00ca7627cb110fd43679962c7e48e5fc7642a91c79894ce50eea1a7a6c529a94195e3f2b8afad2acc935dde1ad8a337ec2f7f668522520e05d4a432a10c837d0db98493c3414058761e0b2b696fd7265f01d96384361fc1731d43e608559a9b578c555da003a6f367f8d804eb8d982020e9f3986b7fa267135a5dfb72110646f1aef6a9e2cb51fb9cd1f4a9a852c435143efe89f4acaaf2f68987b43cd8b062eab665696aef9360cea1036bed788d56a337f1a7582dd34b9737c00033a636ee016e8496aedc139ab763c70418bcc8a97d3f6d0e9e43923f782cf169603c8b4036418a5b0ec03da6dc7455b0c74d2525e1b3cb038b73b7e1142182823256edb3dfe1eec52d750958b2381f116ec95d93eded692b31f764bfb3f729e09ea554269dd418225dd0edcc67675e8a431ae73109b6b010f07a9116436907769b4bd769605486c095c43c32f18b3a48b5b4a15071be2b0e5b8cd04702c9f5f2a541c3cd508bbe6022f5a0a058299867241b007c8059afd1dc8873f81ae1a7b9534b886bb1a3a8c1f62bb4c8b96d6744d5ee8c835d8f35a949e22e44a8b8a728a69948a28f32662611e28308b8813ae74c205085c594bd3a4c44fb90147c3a96b19c2dda1b43d3224b243e4e22fbc0aaf0055438eccc5fcf0279b8509a2033a0d9e664411d984dabc2a017c711219b26821737342f8be46b3b77f2fdaa75df14856d753be6e0b95c0ea928da1a868ab791bba9f6ffd5a32f8638f23f4eb4e1c2c54a6cbc993ac96eab4bf4ccf66cbdf1c2051395dee8769540f29764664999b3f166c51f587cbf70201c5f7ae4b03ece704acbb938bf5da4418283348bcaa6bdb67b5e373a41e1224a36de9e2a79172b4b7accf6bc9ef1c28289966c746355f2dc5796fa3cfafed6bd9622a79cc8177896e6f46927eb3c8ed473c76382507d1943ecbf475e3869018bee4465281cc533a2429547053a04ab82bfe9c9508007dd8d6149b67d0f287ce0cc48dfac771535a82c5ee22a0c0422140443c671541447c5715414c71e617129b7120b6471ce1242f6ce3f79b77026d980691cafa0bfd9168b6dbdde97bf61f0e96e90c3247e449c102c069901803b13b8ef3f0ada4f06ab9deac0a792017ef7cdc27cb1ab707e0e2d7283eceb08f2f67c6f082787ab500a0a8c5da05ab62cfca06c2ea0e4f06f913db33f3111488e676cdfe8c71c3aa0b3efe37e78394bf1b6918b8bfe9d7a35d09adceee3b3d613e004706b5609b9069f1ddfa240e9db8163c7d1bdb9a0a313bf2bed0dc99f1bb5f3df37d15abdc806f37f259097d989c064c37236c829f40feb0eb8d71d00cae5f6ca7240cc48a709d80f8d1146ac899251b89602d8df06050e566292950d415bd47f31e431e8741854dfb9db95d3be9f31849978263b2733125028beb38d1f2a8cc5b89f398bb9ed7a14045ead8d1b8ce36c497a5d3067708f2caef9b8b51f2a3993026aa104d46408bfcc0cfd9b41e4806072b7c8db23aaf006e22fc9e87a98649c53470df6de4864f41cf62f5d399899ad6f7480a489fcfb1f1a2f0468b8d43363d9464ae5a0a2e8dd41f4eee1864aeee5fad99469d898c4d562a13b5c1c0fa96afe267b66e60444800cb58d4ec581e5637f8cec7b8ef92340d5bbef65f6786e6586652d81d2a84bfc57ae02fa28d73fb213b9802862e1e24a6e43032085aa061a0118c3c89570693634d59a5d81bc8eae533b3f3523b35a6ff2a827180f97c7e0f48020c8eca925c6c3ddadea689e21d7d5391a15aa4355374c9444914d4f3e6843f109437d79d58d86e5c1916b90734c5ebf39d711fe1ab915d16da418976b828bb6f41f81f594798e3b895c28ac96fe6f8a44579cb14684bbef1eb978518e0c237ca6dabd2f97d93f4edc2744be33ce3aa3c2f88043d5368688facc82660109ea7a938b0b29f8982c03b1559e7143517f1d5114ed1a08dca3f8dd7a985f8c405d30312de416fa136ca21a9a7a1e6f45e2412c88e831c4e586ca126bd734e2b342c413eecfb6107504df82b243db86b03154b26a9fa93a30025c3807ad1d169eafeed6a2ba3927651dbe8de72253e9e3780e650613d0bca56c2eaab8d55d45065d8d74668dca2bbff28f469dde16b46510b570a7c32b5741520c351c9a917cc1fc025e4d1b36ae1ac90823107f666f43127ee399db4740ec8b01afe58e44b965caa190bf3c2b58d17fe9fd475e8848aa51bf56200b260702e7533687c6cb43ed477d0aaf8c59014bf5df6e0378d4aa31b36343c5aa7489bce9ab8f65232893543829ec51bb9cb0978e8c91698e468e97d550ed226efb2be4c8c5512df6a380fc50b1d14c796785d03840ed887b7fb5acc6366967c3eaab901c49fb98c616a4958deb658786f43e795ed6d9e7c23879990fa51d48ef72a8f8e125f340de2e0a80155109280973a54d15abc6603515ea702dc5be5893f63b15edd644c1ac160e64954dd29ca9e8b4886b061d8a581d694cfea916298aa18e9b369fe9e0e21e1b147131368fa817bcf307d5b30c8a65ce1df244fad50fd1e07a2f7c444a2758686bba1b4743bdebe436eb4255e5089f7a832cb98a60370dd58ccf5fc4885501185c4c00a50262df5169b7d47a241fe5f6c6add3dd54ea3d5ff40c8fb060b6950c3a1a071fb8b9801aec3e8ceb23b097b6b4bda01589b7623f4095db591f374eb92a9fa7e5e0a218065aceb39ab6ab5d065460c5318c5d3529e9f9daea6a84aea8e1a3bd6468ea842383932720f5d37914d08b5e80fd366af677f8fcc69ee522f0e768f9ad0864cd3d0b8a9ec66ed66d01efdcb1d695743101e0dd3bb1e8d15e0d11353e95070b8c0d2d36a93b99fea38cedc4c65ab888435c69b8e0a74d1decc5950f2b76101a42179b6a47794fb50d1675ee6d83523be606d41a47ad37d3699198cd415de7e5e359e86ca55648a47689375b3323ec31969d57cefd7bfd06c4bd70ad6e06fbd475abd222aef32b3fbea0577ac420a9f1c2cde1c97594b4d13492e84c911d573287d1f0885accded3b4967a7b4da5b78cb75430e39cd36010d519d0ceee7923356f3edb1cd3e8d95362a110e4f2cabe2d84a0b054d8188b4d080ab718905fbc1eb4d37f19accfcf375b654ef83b2581952ec86d9df5d5eaf7dd30efb5550da32e44e981de29f83139966e91101e4c1e19210a5539491148369982c3b24b63f996a92453a978e6e3cbc22c95b80c45fb625f5dae5305cae8b93e044f74622ee72e6ce3b1358d6d135686a96b993dcd5d762ef498ce608358c0a6220d9e0b8b496fb4c87485afe6105e75b172712ec2580334083da918ddf14d4777019d6a1c73e18724f7d042c477bfec1b98e6a3631b81c98c01a39418ae7c87856dd44076acbdbe04867cd981d1ad3525bbde49e72b2e1dca07cf95f3a5979c6198e7c91040ec60e3c7db219625c1540cf112cd3976e7c332780a8d590577a92c4c33ae84e50986f50ce115e3413902499a18e41195738e1f6ebc8aa7b68a6f53dcb78e9591ffeb90b86d8e502c90b0b0a7c69a1c51b211851a4296e5e1bc0699ff452f7ed2ff5872474d4a241cc97adfcdb4810f1ff0fdd088c0484780c549a08dd131e7560dc715aaa0c8d364cab31f04bc1f0352efd9667cffe101eeabf8755e63dbe1ac240abd5bf447d96a17ecce8ed48357d3b2e69af7794fbb284061bbfc00e6037b134821b93cda26d9e53bab59375e28e3cc9058aead2b62777333a56ab2233cd6cf99da16a215dc89a446af23d128a0bc5ce07e5dd2e5c99063a40d955ff0224577e240a949ba73fcf6854e887f46a5f5ca6757ffd826c6ff3a8734551298febb0adfa7886426d1389d83b2b4bb38aba7c79382f3a6977cd2d4af3c15e8550d64723902281ee7e8bf0335c29518bffad54064330ee24b3c5f17f1b38ba95fb043254e8ece2270f5a14e6d98aa9ef428c4e153ed402b1f7e26eb70eced661f8ea406c729c41367de0c05600206c095d3f6cbfbf72aac050bf1c1a0a7de220955ceb6fa4a59c7d0f1e664a2f024625e256aa88f338905793dfef6b34bf99c1f1106d9d9b759f23c7e863b70471f64b16a963c912b83a4d759a863b2cbd3e5506ae34e82c1524508115e17bd9c25270b621912e039a2a1c6af21341f1a1372ec7495572f01b84d34147e3b809ec0e9485ed692893989461a093cf49c7876eefc10fe159fd50ae8b96a7e21d0318758a9dd2cb3ba305444cf493936747f890c5f043f502ab964788c122e61ba5a510562319177b87310513902b1ffa4b3e356a5319c5727cc02c3e610fdff5d87f35ac29ede364021a3cb0718345033dbe405e6570fcf4ac1ea785b48b8bf1eee78821c85dbd1b035a5bfef19b53dae894775e40ea6d322acb368e91be6d49a0a8362e7c766258b455872d41318ab979212d07b2a617043ebb8c27003344947e1f7c3690ee123550822e94c284941acdc87a40e0201590ad5c59f150ce7e4d346113513a882197f4ec058a07e2ac97dc47b62ed27a79bc10c5fece222efc858eedf7a6e894361fba6627fcb2273715ae4fdd260ef7e9f02f2c7402519422813ade3c764bd25a522d93df478b4037434d388c53b2228a6c5a56b4f23978f55a71b0d37b79083f9be8f6edc6a7bd0eb1400551150459c172804d03409d629dd0096e9405a4e18fc6d81d2f5249bdc55f72d51443a38872b27e0678dff67d509289b03be668e42182043435c60c4d89948e1d4006642332670192a8886b91c91913c5b5206b69169a17e8d02863c422d5cfe29a950bb424a5d2558937c0464f25735300f2482cfb776af8d9c0e3e701de5018197d2ad70a1bed091cb73bd84a543ef764b3e494f5696a84af8cd0fed7bdb16abc56f1cea401f2ab0b0f82ff82041826bc8640a19d5c13b35218227642ab02cce25bfbe40bbe8dbbfbabfa865a6f39bae7d833b5d266b27004427cdea9b59fc6c37397ee2907facf64f7d5e8cfde026b57aad66356ee2bc5003e9661258be3074ea63666515023d8916e199a3bdbb3aeeaa7d8ae021b312e31f20a6bf133105eb30f98e265e16519482bbea319c8adfb1a41b795914d83c007b0c252a9d7a6e0c67d8bf128042568f46def4a199e58077f0462af84f0b462882f71308695e24476681dca1428e46e5e44faea6c3b03ea0838aae3c39116d16374c8a297649f2ac8b75647f626cae2bafac8be2730c3135cc795ec72a500c14864fd999b4a6ff08e537be2ac8c6250df8a69c7f1713e1bd45967abe42147299ca514540bd3b13561df26cac3f8e0bf7ed07f1b29d23f2ea500d3aafbfe6996c08bec7d6a1353497be43e13358a35d780cb0bd10a5eca74dfe29627ea0fa8213626f217e102a451df549225910c0d463967beef760e1b9d657cddf02c265774fd7441913c616bb84a7ddb751f9daa2ec531581c453e4160cd626de136de02f6e9792ec950863ef2ebf75c7c5189738f870490b16c672251c819edcbaf3811709878d4029182d30ad94ef7ffae71058332689b9d2435805ecc532d60860fb4f45b5b301f784d9f8f761bd644b2e7b289cd37753828cf200cb19d6a02e867fd4871f3bd2501d3fa62730b190cf66a9fc9fc8c84d847f64b135827ee02d989b0ab301f058d954b65717fb44ba337b43f8e6c827a2b74667bc54e739f5dc40bb90d26e195591aaee6456d9c523357dc0224f4752e9f021f5084602a00e1a4dc56f5b6d07a3e46cab6fd213954100b4371cf019df217fc8c2ff3858f5b646e0271a8c3bfcc7174b97dd346b63e47ec276487f4ceaad1e0e22581643da00ca3f45842d1f773b35ccce2a8bb8fe337a7710685cb2e87dac9302f2e20d3f6b3e8c0104bfc65f12595940a88c0e9c34a8d93361bc39edb91ee62da1b8dd5a32cc32245c847a8d19681422a0cae410d6f9d930f6c77a54cc1265763a6752f90b2fea7964eea19ed557f3ac25c83bcea5c8582abe05236fa0dd1fc359f976937b2b8970eaab08236282d30414508d0fad6580a0e45806a0a259403bb6afc1206dc4b04d40a2d86d24a54f17a179924c9fd03d3bf3ca09946b79d3b8a0193748d26b97454204aae9b556f104052600259b21a8141b08dc76748be1e695b1d99f4be90298fb39aa934f033c2d894dcf2f05f095fa84c7c58f6cfd135accc172ea010a7923dc4502cadf65f019ed39e03970c957e50b2e6efb627bbb5724ef86321eb25d0d6de7dc138c94882e3fe3bc060b5fde221532c6cf4679ce55c9ad7085785efb17e07c7b30a07caccacddae073755d0255361da690196753e13bc4f5bf4a11a2446c85405b75380d350ec66ad1893d4fcf001e57571da8594d66e6f5b2e0896d397f9e44c2a81442cd7a5b0be046801cdb3c13517441a267f86cde7a2387fae6ade2303c47fc9f810df23c5481975ab267ac3d1eb42e1eb762962d51bc28d424c8a691319c7862874d19ef0fd0b8fe8775e160cf80ef23015bece2503431a10dad9df89897facef26b29821f55170bd6feb804e08fe56130f83852371d2e89cfb69e8e6365ddf42ce9d69ea15aa06124e0d0f039b714226b1d526df07aa8826fdf9b3dd24a5462094c092c81e4fe0a501afae3061c8b24421dda61d03f386851cc6f068d6fecc3e513d8161f7d3407cf3510071f4b6f2f91ab733616ecc1b52b8c8558e2ceeb1109f47a3c7a2579b34533b8f9f957aaf472b69eee61bc7c45f983b66102311b6c0b5fa537264648b10ae43f57ea5d37d823dbe246dc5361efcaa7666a51aed1f159c918c44704ba29e7a659200eb39a0e9503864496ce0781081397a373e5081f626bb48b486970138a5cb96c1f63b32061d04ae55502e38aaf28700e3ea2bb58f8bf5e46225c181c73a808d409b8d5ccce8ebd74442385a7cc32db765b937b4b29934c01a10a0c0a280a14648fd209b2d88a24129226cd8a24994eb5f26e56aba094af564be84f7087f7ad7c6e63befda70d95fdc9f2853e4fa100a278a7b37029a42286e880343313a479234d3d4d2d25234d2da51afb1355c12b3a4f3f26214a424b32e4fa89fab979f97669f92cdf437440d817986d893bfa3cf93c81f1816a1737bb9f2c3e3eceadf2f179fa49d2496a25f1ce17306154610729aa9c4e5290229b5510e72a0a4a70ca9de0cc87a0cb365b5d6b625a2272597115b98c5c472a2c903c1bd5539b2ddb6cf53cf580e909e3f3949412737315b98c7a6a638709c729f41335f6d47ec9c7501d6f8fafc72ae8f31e419ee37c1688033597c4847d986d9502af0c0100ed068019cc067b8262413d7df9b1fd64f951fad1f2b3d462ff84f931e387a95bed62a6cf1312da10d0076afa3ccd964f94cfcd670c122155f893d4d99a45cd537da07ba0abc9b5e4d2e252720db9a6b8885c565a045d4edfae2d2e23571617524fadc7d6f3a5078cab480051dc4183a09da017068aa9c9a9e605cc17a25b9219adc54e02658a2afca52457dc91b724cdb6240911b20a52f90ae454cae8b2034d063bcacfb993dbf543f0a1a266eb8977dae6a57684949445a9c52020cd653fbe17835fcb8ae927ea47cc981f3db59e5a8f971edb2f7d14c7acb73f53bf5c463db5fe02064c989e5a4fcd0b5d45aadbcc0df60566e37a535f06aba0ea6210d7c1877a30ffa4a485a9a9c577fa32e4c526190a7f6e49662d761221285ff84b5780d428950f987e0169177733c19902af841e04fc899aad0e7fc624110af236fcd1e18eb5168240403b5b504f35fe09363741c9cda0fc945cc97f0bca9f01e55f50fe7cca3f412e0794bc2383f8b3666b82dce3a55bdd539382abdece37419cf78c7c13f4f115bc127a2a0c7f8077b62688c157f00a10a7a19dad09f6782f4810204080ac827a883071b9ea3db616bba716e4f3c43bed44be5c1797e2b894d7f34db0e6bd23df04797c0abc32c48508f10a5e11d2f10cfc074873d910129c609104a5f679eaa991b0345bbdf4b67f1a02fec0c1adf620e04f1ddc6ad7c192420a4d6e13d64f7f41946149a1c97d1c6f623fc749589a2f126addaa83633ebcfd870e8eb15ec0310c38d6c3db7fe6e0d88db7ffc8c1311edefe1307c76a3866e3ed3f70706c87b7ffbcc1311c373896238663f4870d8ed5584a0680e642a18f495ef8f624b3fe09bdddcb00ac1624fa0f466692f2ed243059f976a6222dbc6400529b27df5e13c3b7f390e1db6fa07c7b8f28df8ec10cdfcea2e1db7d0c65004e252ef04e7b0ea8e405de69c70195c0c044cb408913de694f814a580095b4a04488773200a5cc07c8bc83017885c623039d055ea1c164a0f7b8096dc00ed8dfe1356007eeef701e600758bf23bc02864a6842cc740333e5f0ed4aa4f007cdc9d0780620cb3cf90d0195e8802ccb00ec644168422533986dbe1eea8928dbd7bee9999ee8ad7cd11b75e01f91e0043fe18504a5763d163e4ff3f5484f68f179e227b2f83cfd44f5d45644dc91998e848055a93f900e04649a55f08a8e539d9084da6c7d19b7a17e84dd848030a8d96a0702c2a266ab3d047f40f0076ab660361bd48f833f35f0c709fc69fa296ab17d06fc31fa39fa419a837fbe7c7bff70c162cfd74f961fa6ef1f2d473e4f41409f271fa8a5f9f209d3adf611f3ed372b1058df853f29209e24899e9aea67cc4f1b1c83e2d7601f12967ea248f0d22f20de4e42ad5dd6078355900d7d9e5a6cf725eef8e3f3f4ed3f51edb2defe23e6e7d6ae94b7fb1cf9d838b6f2761fa47e3dd34f14ccf61305b3fd44c16c3f5130db4f14ccf61365fb769b1508363f6d683e68ac5508fdd5395045390a5e1bda11d1a7b2b2a44395259b5590759bd512faa92536ef85bf74c51def4fd4b7ab409b59cd2a84fe94736097aa6e67b31f6b4feddb53602522a156a5bc74a9456d8229d83741eb01e09b60f71cf8f9784574848460a53d6e7c66cb199b1a1e3b6864727ea8b478c2e909c0c0f365bb5085ce55e1e55c15dad99a1a1471a55757819ca7c0ce2938aa964a4879374b5039375d05d6003451502d51ef40967195d9d9ba5236f30e8fd205ec7ca5aedce0697704e8a909ed62a716ac3c759e35a40d9eae969c5ad8f223333da59752ea5c97d32e4adde919d6ca6fd072deeddd2aa8475801056b69980329470bfcb47969431a16650875dc3162e0678729d80ef45bf7b8e77c1b5ede913e6660a4611e35f073862c29c350f5f1d6280e8dd910abbdc5f9bab3d5c4a45f3b861cd004ea26290c08494b29a5ad1cc29d7df551e7439cea36b4ddec39ea6fc6bdb3e7a7b36a0357bb6a6bed38db2db99043f22ecb6d4f6f97ccfc35c82d82cc3e7d82dd056d174bda5d1a86e05f736f0f4c2b651e9a84e7c9cbc3239da77926cfeb088f163a5f4891a5f369789c07c64d3c3c1ce31a55a2411669060db05c85c04f6fce59dd73c9852fc40790fb66b5926ed18388940b6b518e28e83c92233c9cc0ab62891f794965c4e59e9d5840e2c74bad122623743f3c9301048d898da7a727bec81ed006185c6c4e78314518320afc00450b1f6420a3045ff4a492f410d022c61a4a4059411b2ff067271686be7b7662e1c98fe20cdde1153d13abdc0e4739e6ad3bb9cce1061ede6ab10438ab9e773cfb78762163aeb422776089c57583f8294df0b3a68a2b9d73e9234b127936988ccf954fa9346d187a1e2861f335a594cd5a8b537a11f4b09942d7de84f552069456baa50373508577a653a973c3fd42155632a19d53be0a949e02e5cb70b7cc9519995012cd965c9a26ccc9ea887898718958dc9a6eedbd4dd64843e8d9ccc94b8b4369786b511eeb80b42bdde39d1c1edc835d36265f5e0f9befd6a4bc67a7fdf3f90b56e621a1b1649e8bd22715c224075d43259283f69828f340968935d2e7c88dca84235ec864a66a98e3c5952f884334615680e50b6b4ca625dc0a04349ec6927dee8126cc1613d9923e27480ec698e241e01679b5c4b6a4a9548a53a9a992a1de01fb743a0abce3c5956398f00b20c0ae06b06b8628d4114401f6e8156fc69a2f2fd4408b4d81d9e2396748c55ce929323cd6e9d909b325bd136652ce66b33eeaa429ad04a58f5a4b85323485e8861ca6bc74066aafd3da13a4b35872850029b3ee715fc5a91d27a594525629a33a8e69ed925366527a9d93d10fae0f5eb64ba66e0dc13ef209e640baf42e8263320ade91e1f81d7528977847bace0d37e59e972517663399aaa12cb10c4b75e93ab20868ca9ec9312dde5a42cdd6944db3257d494a6f6943b954335bfa25991e3c3129f9fc63e60f97b6d82dfb6f34ea8e130a8abb4dcfd249935ba60b5520814cde66cb8c5b38ca97344c4d16ae71050d74fe5e5cee398bf96ad9ddc2c2820b16e339801af989ef313700d29b99b7f8b6d1e25697365fae742efc40130d00756ee7eba1381043e4a20b61b016bc20c4c212627630da420a07a0c0ca0db53a8ec6c4c0a3163a5469c289349a6048c24b5c9801650e315ce8a2040c08e30b972da20883082004f004d2196e08c1041c5bc8180c2a9ce078411d373c49b1c21139ac11154417562441e1288028820d26a12f9ab4ec50c336431162aee0c18827187218fa820a1a35c470f905eb22071f7c6062a826a403061b54dce0a40553f420632627d0486ac110548870412ec941460f4852d6a821c98d052968019824232f6250410d31e270828b172f7eb8ec47547901c905221664982531724245e54c32f18d0517be9dfa0bdf0e0483130bb49f3991672727603ccdb393932edf84020232a1cdb25af2853309f4de4b7d1ea87a5e7193b50df5d677c07047d85b13768029c8b76e82756bbfd0ba97e29fb7f992dcaad55a3a649578c77245ddb26e6d5bdb379a903b0ab9a216ada7a81b47ed4ab9f5281573ad12b7ac5b96f599242e57649d33e290a44fbb457aeb32be0239a316adcf80f6572157c43be013775ab74af60b473b5e2506f3aa2055e82248f93d8084f1587e98dba4be05b8d1ffb2152918f3d439a74e9de3b82dce1f475c0982f4ce53a00553ee71e028bbe7952d807c1b3ed41d61855705d9b13a0752bfe2b5151f2e3b7d76dae18ae77914d88187236a3bbc9094b4830c518eb85911930312332b5050926a569ea0b03cbe99d4fcbe5bc3e2811d69918b185862904644592bc408e2c7efab4981a24ecdfdbeaf26070a9da55a4532b3770e926df058879360da55571ce5264b35be7d5cc934641a73ce5a7f31a3985b8e215f57b6da79877cf5ccc53e824c306026981fdb49cf7468d95c447a2d1349744054a9e327143fdd3b4115db4f223f5db50a9adfa7c1176e28d581858d2cc0908d37044384b102441114242064edeaee6e2dbe8d18e37bc777777777ce4f9d4bc5879fce8afa5925053f9da938113fea8da81ea86041152a327085051eacb05121860e5d1048889914f6e32787d561cbb773af263ec890d4850f34081149244c3065453f6a3fd9b282080ba216be4f8b14493f6a3f1705924319dfdedf37e714e304d19c73d2f9394c11844a9917fc90e3d2679ba32b5b00527145c2406b286ec3823b368d48d3ba879e7eec1826d84f7887c6e38d3b761dce744aa4dd7eb338c499449a9cda4bdbf8d52c1a8cf64f336a467547d1a1ea8565117ed9b0a774177ad0463f7d8cfdfc21c7ed1d59b414dee92063d8ef871cb73ed33c95df5e5a9c9663f425269975b697a62d2549fbd03a4c30eeb4f65e7ea2468063d8c230a3c5761f735cefa9e5530c4fdd75e785a7f9fac6ef8d3bb27870aaf36f5043b13dc8326b97b328260b823f5aa6d6b27274eca555f7985f945bd5adbdf4eb933bea7c757183c93f9d4a59571c8d0262b0f9f850d72d077e191c37c20a3ccd1cc771b23d204925ed7898f5ad2e0b36348a2b6b79e41a3f9de5d06c49a516672893b2c8a4db62538b1d0fcfd090fd7924c303b45333b5387de469a5a3d99aee8198db473f7d839b5c835b330e25274bfda4e96714eff0fc9176cdba0ae228c77194b955d09139eef8edc8709dd6666bba8caad566cba89651dd93731982485c6eb1bae4e418a19ffedce5094bce233626271e4d8020a73399d361d3e91465d73337172e7bf7ec84831c9f110e6ad8271ccaf094b8ab67271c6c38d47040b2b6c3018827146989c381488659c451b53c36b4008aa8511c64a0491e18cf1118d26db6d8e230439acd165b24d515b686cb3d7379d29252c19531a223e38908389e7ef872eb3397a71d903c6ef728576b77734d290d2b9dd6721ccf2ac49c7336cbc54adde7a44e27dbebeeee4178b236538e0eafbbbb69f79cdc4e99b982312b576dc7a52c08d652163bda558ed53f2b3787a8568a4799d6ae4c7987e3ac4bced659b969b9d592fee93a39cf75a65c322b15eaf40fe6a0c79cef20394757b2ad5c5ddaa2c1ecb27bcf4e37e8308230430bca5f22feec9c1bed779cb596c50a298b5043ca230ae257e1cdaef96a3d79caccb086637c6fea861670e0a02c8f3da3f2c0788ec084a23acba305b5d77e97e3e1b14e304c010c71545310a5a3681250e415a32b48f6da94d3942319581c8e164cb758004761bac53fda3bc294227b59a32fadb8505dc1250c2394b839cf5cc2a8c10530ea18c186288eb3cd6c6f9eb99481c3d367271b86f891b544a97896bbbbbbbb656e4080f8ee3680fc906249e160011c2c984f4c3d2069ede9a38c2bdde352c0632db5541eb10b2f9db64be665d3ca0a211b6e640b4fa3942e59cefec79a1f73bed3f96e83efb6f8ce69e7b6f30bc47752d4f8ae0626beb3e1858ee748c6d93a6403ed41431a4f6bf6227df7f5d8f2d5e46061c3467e642719de80e2f4d32f0b0a0b7eba4759e2a78b33c4f0d379dac54e3378f1d36145fc74a0e944c3d2d79698e393b3d96c469332dac10abe6590228d3b93b87455a78a6fa713cb0baa9fce6404fe6abe5b13931cc450e5dbbb004870b1861b5d68d9a10b91981d84a26c41e3020936d272b4d239426b1774f0dd2570810a1b5892a0e2c60a3e9ce1060d528af062892519ab03a209a7fad57cb766a68927537c3b6d97cef757b342f2a40ff72bc8ac1621b58b296a0906da8fd5680906a31f6bd20bb71fab969f75a9368dd5a9d67e7a95b222c162a5b2122102d2d96c55af44b5878f2c236905e469c2ca125ad4a2d10cd31d2b51256ad7386fb568be8a78fd562991887bbe0128ce16750d6ea18cf37c892191301c2dad4e89e68b978a263de2d8ad5decf4c293af3ec7b48bc757a7b3f95a415665acf00329b73a5057a26e55af4dfbead5a85d335eab8b33549f017b1271d9447229031f65d3286ba3b4d5f8289f78ec70f970d9a3b4228d747c9448afbe319830427c6431a18f3c06f4510abd741f2594191fb9a902f111f653babc2f6de27c892d97f3368784a3cd201c6f0fbf0947964d387a4d388ae1c8b3231c61932af56dbe2ad16c4ddfe134e16869aeeb84369970b45d385e2e1c5942c2d1c37014c170e4f170844d6a2be2d3e96dbe8a8441c29175812815f11fe1c8d2c073c2f13a4e386d1b5cab01eb160979b66e3fdd479649a963104e5a7bea3dc29145fd261c9dba4d388ad46bc291873a8f7084fd386f3bc2d1d2844a371c59d35ba008ce78b14d284f5d261c614223cf18518c8779eaaa4a94aa443624eac29105a3b69f4e0494b7d9a2b3a9d3352e704d450961d878879f5d2584e185457ee71ac7c1c40e462821c30d60bcc826bf604d3516e74aae56b4c5d45d2de1c17d42a6f3789ea4d96c5684ac84304ec02dfec9c43fbd57d3ab061abca41cbd4053dcf17e09612cc122fb94108613cc01ffa521f05227bd84b1c49219eaf6298784d7eecd20c09b097aa8eb09b01304ca94524a5b5a99e9ec314f2ee4e9d1fb5ecd7003a6830d29a1b448e4873b72348e46c7b773503828ddeaa1a7c1684a9fce983bc290b48b9d5c80fa76a0179210a6c31d391a8d630c73a4bb5ae23df34e055334dc9273a664a8cf4f328701cda79ea5b473051271ac470efc944f6b58674336cf9339ab208fada5b4560ea49ded3e09526b6d4a824841aa2395e77ddf8a995982942733b304d967d867d8bd994f829786e7e4e979343bc41a25769b55d0cd8dbce15153632399886a8d31bc196f86ca9a642d9e70b8d23d29657fedcd49295d055df76aadaba019f738ae53492965ea4b7deea93e99b30af27815b472ef0b026fb82b1999947b333333771574efcc95595d1a9a7befbdf2bd1428dfeb40f99e07caf72c28dfbba07c4fe69b596dc04bc1531ddf845dbecc4a04d673d3b3cfa3f96a28a5f912e2ec937d12cda2f9029d7b8e29cf3ea5b0ab6f43b30ed3af399bb3293469f3e59eb3b7adfb4bbb661a4c434d225ba9f3062f8425e52fb8ec47cd710ee27ddd3703cab7df0cc81c97e2b7b9093a52a5f240b62647c3ada9a2ded404452ce601086280015b1a5e15087e717d74406977a7522e59902f9611989ef2ea408a5854660c3f398e9fbcc64f36e353e8388eabd2bb18c3051501f22be726f4ab278a85a6f3e43193a3d3bfe9f748cb4f4ba9b5264c13240064c723e52aa803de9975f4e0a77354fc984a8527d8ac71533eb2eda74400eff0f0cec7ee9ae18e6c9b73958094ab5c054a2a9eae20f378250268011ae284385d58423b145794bec97cea1d904d5f41d9f4d4674bba5c69f1dae9e3b0704739a58adbb927bf1a35eec87a8e712e9de5120810168b4e6f9a02174a33bc93a3dcf2d2050f32142f9d6513ef7c71473945690a0e3bff24b252245d5298992b90b22cd6bd4ab3d54a526e792999146935f84ae38eb0974ef305fb40312ac031e935582af787970dc4052fa5523fe11d295df2fc240b068d72ba12e68d3c3b5d41819319a7aa902f29e980628d71bba04350225a348f381607738c3aeb89cb44188ef326c3d4bb66a04038d550a9dc078eb1209dfc205f9308aac3d720690c1e78108bcde66d36cedb10bcd3de93b6c65585923667f247861a19aa729d074452078e51a7c06c4924a424423e31995466b85b3826fba88fe6d11117a655708c7a3b758174cd30c6b85e502de6bccdd9c48277daa78f73d63e87f8764642124d209d7caa61d3e64b9cad76d6e570bc14e018131c6b4276d1c51863b8c0053f3214474581f3c63b7dc43bed524ade60a95b32731f716c7efb16de69f7e6adce1b53226a34671469dee810b5428be811ad724e5abbe614ea39e513c7e606641d4e57a67c1701c3b8d27b65c20e0e977d07872b7d9500955b9f340bdb051de39b4251225a345bb7f9a243f08c835bed4fb09840e2dbc378f2edc4824089666b8b4dd465a751377380d2f28ef520c62dafb7704c8aa258857cd9d97281744936a4d8ce1a238bef37def851deb0c022eaba66b852cee4ec1663d6963b02e0e5ad83d88dcefbe215cc664d3443eaa72937272188f8b187da9ba5931050bee56c7291673b5bbcc31e95eac2b957c205ea2baa2b296f96e0a5dcf3156474e52a57f90a32ea6c53a0c8aa3215c879389af0b7650dca7721ae8fb0ba346bd37ca99cf35aab5e6cf385453ae7558963501cbb796e62b132ceab05dcd92a61e532a10a2a5f852578fe852aa46c8b1cd06c715c7fdc079cf3ea009c33e75e0a14c262bba65bdcad1c9690d522c7d525dee160cfd52518927659e71c4849579738c6cf711c076b91f334eead4f5c944acaed9e9d82d8d225881f2c0cb73e3b05c1a4061514bc605b020625420c1561b4f4c3d151105468576c414489124452104ea05c19329ae305a3a81e6ab400cc161d1177c7331730513cc1054c12528031ea7cb8ab672e6072e8a146f7ec70054e760f2ce5e4f913876e907a5c738a06033955950c97ecb5a6267310034d0e6c529f2795744a2a29d7ab12c3a3935a2b25183e50ca75573baea31da574d290da5a194cd341e7ec593fd936dc6aafdea1cee4a96f44352164d9b8e317ebe18618ac68c1ad4989159c10e2045778684389282e5ca1a2ca9d615a108061228b142ea670c30cd9c8d3b2ad81444443125120c9a833992f6aa75321a6902215c494499f462bf86aa24ce0313347c32d91b572dc9492f3c9f1ea00aa1e2e916c59259a2f1e6dfe3d0ec6d44bd0e6fb4e2c15b416a4b21a5ade9134b4aa90676bcab8e6bcd464713fd040136ce14ad92465825809c7fae79d0e34ed741b2dae75e9365fae741da22b67eaf8f9ec40ed294b737b82fc629fac4b33bdb854f69c32573cefd5025ae6b90a94b314a8c20756200542e8c1c5049a338e87540a2ecdb39391146b839391134e0988353a2c8060c1b5f6bb355c445951399aa982864f872499256cf074b8ad801862065595a38f071952569e3c9aed61a60202075ab743510a88166ce07838b269dc5095ba1fbed440955819e2782c172544514d485152c556040d4a76b0fd50654809955a0f5b0f13743c2dd7dd759dc70417328cceb8f7990b195356400614a5316e3d6cde9c73cec9712e274542e98485f408a5b48636d353a84ac3492533f39c734e50ceb9011a27d99356aeb32995b72395b2dec71213c601fc922c2f486a729674300045168b2539c62c16cb729572b5e32aed581468e9e3f1baac940428d0aeceef91d7c161f55c0d847c5b2725fc92338eabd4b94abb4a674b4b4b2b1e32337276c26cb5d3b05cce582c564f168b3579b058ac1b38bc310523cfa16ca794d2eef64e811bf2324c01a79bd4a73d52f7ba1b47fa946008d2670ef72934e9f9a540bf497dfb1e9dc3fb5acc69c7f1163548a31dfcd6cb265574aed3ebc6595741ed0c8eb4bb676a154453df9c93520a9b1ffdba950d9adee0d85f8363fd76ef7e0d8e9caa9b2a494929a5947295e3bc725cc7d916f9c894e29c737a900fb4b8d23b184fc74472c09f1023725a64ff408bdb1bb871a5f39c94ce1f57f8192269917d25474faeb32aef93a157a552a928e77529c9a24da5c2f1039d55a9c0a4869fcecadd93a1f12c47ebb74a7568a83c4ee5ad40f95dea6dcaf3bed5a74ae5b058f672dc0e8ed62ea5f2d0b8415ce8438c2bdd5a9756655daa38975c2a64ab84abe180ce11fc0c61fe746fc78e5510c763d20904c4834e24ba674faeb32aafce6cf0f5f38ed4a7a98e997e9ececa5de52213e9c33c4760488094f088e25c75ea047f95ca4bd91cbb62b19a04dd2a840669973a92f99ac9d940fa4ce7efac4a9c016540200dcef05495c554ca69751653de7929a7e12882b72c5b4615a642262d56da4df3d57fca83c72a88035a52d262af94b848dac575920c92a5accb738bac786af820851a3cb3d9ac851fa2c8481fb2781f06f33fd67cdde2eb1de354748545c4a5e8824b3abfc1153ffdf210f5b387a49f3d8cd9218e96dd2a68bb9cbd82dcc1947b9f9d76607ae9d2c5cbf2c1ab4e57225880ebf8d0c726f5bb5db6a4e2b1ced823eaada72aafe812feeb2b8f3d1fbd53d639b672f60dfac57146ddb240f08ee57c600eac733bfb136f7d6cd9a6b74c70cb7eee813466cab20234642a9060660575cc0b66deba7d01f30d1c85532e7cc1760b961b178d323ecfce96f5e96fc5bc0599ee68dfbe75eb06fbf05b0b470d6b759d246e17725ec314f102d1ccba7449c4a5682663590bb38e3a64a98fc3bc751b10a704ee832ab21bb7be82ac03714ab071ceb950059c1a767e13569b500576c30b3a8e642a90404608d51649322c2a5f41e6cd8fe7ab55f0d9c26549a602093e346458689c041d1541c8b0a83ea8221b5942c6dcb79e2a4a19b54bc6b9653d055fb6786bbbbc4dcd88e6b54f162aeaed0d081eb922462e09ce89b7be43cb1dadd2a5b3ab55520501b56b8dcbc3c709456fc832b9ba82b3c339b72e64ccd562c5b44bc6addb28abd4aef0addb13f08b2b9a2deb52fc114eb51491bdcd54d2dbd451d1dbd4d07b36357b6b9fde32d45b1aef58e78ae68b7bc22deb473c27e5adef0811d0322bf355cb1d2bd45b9b83cd816392885fb0a27bc41496f4d6ef54f2289440daea4737a173bbb45a00e75669b6ecbc793f8eb8fdab760fa4ddd12a19c0f30d50dfe1293fd2a2f50637b0849fa745eb21782118c5954ec3a8b73ea1783ecfeefdcc550278b65a7395801c9f0f75a973394b68ed2a2bd75aebcc9101ea2b39615d22ce24495e409c7352c02f2061cf8f1ea8b188524e0f54912b7e15a402d362f74085350ca1716ce6db716a75be3c9b746bbda1587c755ae318f5ea3a5fed7c01f1ea77be82fcf0ea3e84e61579b3cff1f1fb21b4f9fa111619422b3284c2888a28cd9711a87b7f3cbd48247d7f4246a03cc9ab03d070c79ba69b9a8f1bc76e3278f2ed19ac96fcf81afe788fd6ae9d6ff7a0f42bc7bdd9951ce75509e20ef7365f39fec4d79c1cffe12cf403f472c08f365b35f46e2dfad072475518d5d3dffc294cbbfc4b8b62da5543b7b578c40db224aaa0bee78b93b17fec017d40df33c71d69929e7867da7020f8495470fd29039a37a65bc18f548c21be897828f792e73f9c2fb20fa756ab0f362ee73edcb8952669cca541a2396ad7749aa490a349928902f06e4bee8d772aaf44a51ea86eb55f1f6c5ccf7db87155292b65eac6a95bed375e6ebe7838b5f0a609881036145605a78311f9708f769432c1a007aac8d2574469ae96885f1dc7a6f4e571c2343d0e98a51a10a776e5725efd87371716db6d9ce72bc775d3d462a5fe03cc096b5a6c362ecb7db8714723505f71bcfec871db0d979ba61ed3c70cefadb101c7f95d9882fcd1bb598a23716eb39c2938b5b0068e35cd178c882689c8d01d87c088be1d66054634644abb461452b42150860c8ddead5697fcf26eeccdc12faf28c6407dd3e4b90dead6ee63dad53d81f1a85a8b62bcb4d86196f0571f4128a0956f50c84790f6059c6213e23c8144e00c1cf26e351c6b8edd7c6d7ab71a9c1acb47ef46abdf38adfe23c76d55882a8b89db03474c8b5dab210ba756dd71c071be8f300589410fd48823e6db3befd6ae1a2fb676d1b88b87b7e33cb5ab265cc20fa65d50eda2f1769c30ede2111a0913d5ae1d210e4d6804ca4854e38869d7c5a9e18cf191e7c325fc2b1f738472683950bec33bf41de2ac42236272a67c8f98b007ca5385630f948e27b98c0f36eee86e5c7ad3d4adf6be69a249ba695aad085044c90854bbc6224adf6e04ea8d44d16431025544895be47aa086d0e20871bef4cb6db3d53860bedd471a5786a337e5a7fb50e3d670f46843681c0379a7076a723d50df411fdfa3179fbd0339ae378a1e084b24131902911f4088100942848848c44551048988a1105127031c5114451f434451148910c969c96c40d6f13821ecbc7d198e2378ea46a08c44b58babfd58e346c4340742b6d1081418ef667b2366b0cb8b838d8461973786c5761a7a372877bc69aa7d7b919b26907744f87ed40115a65f3add8289f9f611564134599cdcd1278d12013430e24effe1409cfae8dd727c86238fdbe6b4d526db1f2dfd00e7abd6aced29071447e8c0030300b97147ef46fbe94062eee8365bbba83fada47fb0128103716a38359c5abb3819baa8019e18ca6d0d8015019ac8ff885a9c374d2d22f1eca404f5f56992da35de34d1247d3b8d52bbc68fe89594bebfce089aa49b261c9b37145b4dc7a9cd970e8e4d0649007e9200bd6ce6d2084049d00e1078d42c6112c20044188100363705e8c15a61f0e5fc00c223e3bcd3ce79378ef36efd0a4011137d46616cdfde6d09313f7e454749dfce55db97767558be554b0a88426b578d3203dfb89200aaa7ae8028b3283350fc0a8ef2a908aaa7449e168556c15aa340793ae78c0225ca942843d2a308458145f9682934f3665876d0a495ebb06049a554df4a4666862fcd8e8f87d8b36bbee661f3754d8d8d8db4e1513363736373737353c363c7cd0dcdbdb9b999b99159dddcdc7c461e7b17274753ba3819fa274f4f6ccf5d9e34757982825f3d77798244019a7dbc48f7a95de3b5c2f7cb45ea17379445a95f4274888b6fbf4b4cfd12929925218753bb6aad766ded62a72496befd82b17cadb4cba85da34ae916b5ababf2edf7a85d1dd2b7f37ccd4041cd40cd40d131aa94ea139512c7d8bbe7237e944f78a77a07a6206bd2cfda69124ca5a4aaa994987a5429a99c545e5830f472f58175484ab1c1362e7f77e158937cb431a7cf94acb476d10a65a85dde142bb588d6292dca0a4555692d8c40b3ab491b00810708f2a98f95f64a1cb379e92a1ac77815c2fcf103444fe98c77643855432ae8e2444c172750cf5d9cd89edd3e777162c573cf5d9c34bd2480c7591f6d50eab4eb3aa9722e65bf7e798aaa4e2d7a21c7d4620a6c5f4156fd4e6f2f617a872a60a1ae42fb2ce15361fa175ebe1c5ae99686e3f71fb7d42227c71dc55fe29c278fc831ee39aece9ee35c268edb50965b9a2dce71700e303d012c9b21cfd6f42b33e46ab3c5491ff99c7ce6668b736bb3b6dafa95539f6a987ae3848ca87150661219b6e7388ee3869e73dbd5cb39d7e5f0d479582a42c73967cdd7e4a22c1c4c38a958548aa7dc534aa9c400cb98cb85725de71cd7759c4f9f1ebf3af7b0ebbace612eaa244b9972550a044885380890322f88c3e15c3e174aa32c3c3017797cb664eb2629114f5880e2ad03b5edb8ae03a773e088c2a350f35586ec4115301753291a094aab454de658226e109ae2a7bbae60b9e08e36057a53c41d91bc64630b14272fb9fc0c470a64873b5a7be70b0bbb6c9ab4b40e716c4a25aa4a554bbb3c975e97daf5b9f4ca54cb6065b9d54a5729ec8344722045edf2d2eb162fbd7ef132fc326e1d4240955134a46cd933a83219010918d8171e01f04e3b058ae1727cbb1d68b258e057d9799213038593189c6dd511b145194534c051c5172a3c4852fae189c8a90d27b87041860b1b329853f4c0c4048682a1b4b4832915452d8b3a90905c08c34516968b2ebe33e804c38a55470493e08517b72b6a6624e144c654544b32b261718615d9c8f36d83125e48b1e1080d29b215a84ca1a38d3027b0994007d9c8a3a4c921a4a112d83004d214a41e9c9090be8b583eb2eeb313d2ec53cf4e45c0f14f5fd3c7d3698b9f5c627f2e59f14e4797dc25f327c771cc71542533fde39d06f2e4f6eb34922b31fbecbd89437af9b1868e6fa75d04102c21225420dadb3bcc88469edc1106932f1f432648a0e8db67444c01fb6a5c58c0c38f5c234269e427869222cf06a2943a60d043dd9adab1fe6bcfa15b5d86287c3f9d82f4756c0d9eaca9e12693529ff6520a345bde45ba9c4de94664b8302623f4ab88db7e8408d41de52c47882571a8d3a7614d7bb07400e926480792ce04470496523aa5945740bc233d0842c7ca1de56ce90026003151a3aa916ae266674e3ce9288878f8582cd6111ecf6159254c4660b9489f9d8600038833664c501162020b1e7208e1054d5db4b810454d8c265a40a3a0d55033a33ad611181229bff86a72e6b3d3105d7c583c7ea69edc52451674522a93fa254651228e92609264d3104d3fea48dbcb465935f081cb426ad25e8d386a881fa5d0d147492b2b34b1a5f6c20f6fe8c055c4811486972e63c6b041d60c70c20b31509c1145136264cd2f58811b4f5cd0a20e3590640d85d251bb52b20bf91a806c75acbe5adc6a19f3000431c0e0479954c310425126d524c79c74eef99049a91038c62c9578a7bb6e4e0bcc1087f35982f4e91d903f65d3cf1d605cbef325bd5d0c4fda38c6b4d5d79ef2ee880be9a2e82cd69115c38c708d9792c62e59d24e982f29876c4997cd824d85360c895ed2c1592080775c33dc13641c1cab2e9b8a74495a4fa7520ec9420c61d7f0f20466676797b4763515294a97341c9b0709e5280ede911df05cd999e171a52fa8d44d9476412c151509008020006314000030100c8784428148241c8d6479f80114800a779a4e7e609d0ac42488511432c61843083000180020002040333302008b518c381fb575648b30703b5ee744a59546db74d9d1680bf733f87f1e3601945cdb4176ee8fc3c1864378a8caab7e439351cd30e563e42dc5d7bc721c30c2e5d886c7497f712f49edd65e27620c715b961c7804cc881349cabc486d51bdaf249f885d7455360a1a15d24fc665a2a620cae0dcbad7ff05b14376fc9305e27f8c20536ab8f5f0763351106c2bef84155da180b3275d54432032003c97dc740085d3442b41d4fa79d7741c8ac104efca4f3f75288badf45322d3c37166d91e0eb0ed6099814a2d7f29b181ce2f0deb1e28bf3fb4fbfcbea345497ef50cc43ab4629ec02d9a1034100f8d23258b796aef7b8db7c49364ef9d23385ae0eaeaabb8330da8650ecb996038b202c2b09c80dfa2f4daecb695bc483b1f9a7e70bb00ffe87ea278cbf085ce807fca3bfbe28d9eeda4ba126029a659d9a83a4a10a6ca33062e2ea31132cf1f420659498932488a3ae3c7680ce447139240437fa8b0952025524b8df2a28565eb3d2fd6a79d4c9fe0d06211796624b54b3e27eb67cb1acee8d247ed87404919d320a9b37666aa0d5411a7d52c408e6a1721314a1d5b7e9c7c120356f48c2dd307547f13b80c65c73428eaa1b2fbc36d70707c803fe4c1471bd9bcd6d46327b314bc34d5012c7af524d755789b82c40ebe2c43cf65a699a82be7491b3284bb190e30205dd890b39631aa5c64245648fea1070d753de74d3e6c60c072b71e813259dff4676b05a50db9d510bffccead67337ffa3f973994edcf03497af8f10fa36147441c313f2fdd9dd0189c5be3874bd9fc4f8058ff468c0424d33c681622bbf9a624ffdd28526e7a97150178087f2e6a3ae17e2fec2c13752e0e18cd903ff0d8b674fc33b51eb90e4820e3b12299ca22428238187bf7f018d929b635c7168d76be516da95d045b94a7a0fbd8bb65f1011a318e8a42561960226dd76a307476cab967ea18d8b832f0f3eb0bf55d2d28680f88c5c8e66cf20ac78b10f042cff1abd4add7cc7de0f80ec48eceb222c4f68aea21b9043303400a421fdf27a6993728edff5e5a2d0ddc144350787878f49817ccc8cb089f60b34a9f75e82781d69b3088033578f09ac3b0e9a86ee99d2bf5d312591549afbdb78a6ddabdea1fc3673cb1dcedc753896b92b7e31c2a07f04c4ad06754af0d4997173e57bbd1884cb64849bc892b91dad602e3d8e69fa630de71222e9095bd8139eccc84edb0691ba2a8598f9a5701b5ddfc0164c1e869a33a6d62edb4cfeb4f5bdea05f1c8343bb95381fb4171dccc61134a32a5a6d3378d0cc7c8f520815ddf6b8ef9580c90f11eb0c0d41ec0af7f22564d55dc88a7841ea70202ee44ab9f36ecc3a71fc98e1ba4e7b36353a04cd03baa13c74edc977ee33b6545ffa903112be92018d3f8f6a84bc59cc238241f297d1600deff980f65902ff87b23f128240e20f09338918c82a0d138136443d12472ea1c06b831015f7ab0830bb082948709d9c972acdba99888b73546fc48c3b8d7b4c7be3d0520efdc74fd5512076777e40010512c797a362f2772612a077e7b7a0b21873c59c32ffcb09a6ab5df8e3751889178dc47b6aefb98a20023e861f4cc52095797a67104310a2ead57bbac1f66c217620a8b0f924ae8f3b4eb2a8b798015e67a5bd0bf020427638113eaafb85e64805e8146765503f12ef0813714ed1feac8c97cc4a1602c41e8c9a296d8b32bb5ab738302dd1c6d96a3999701c76b8e508f042d0be3206a00283e924d3bcf29d7518811961aadf2143d400478159783fa6d7ecc721aa341b4ddebbcc91d02d98b3d68085f7e26d1a316053ad4a722d51d02ab360df4eff4905a38aedf6645bb427efa48a3afb8d93640c59967d8c103d9ba4733087c83287e1fabceaa0a1813f3feff3fb11042dc2aa1978b3e3dc6f6827fa1c1814b9a9eff829f9eeaad94c471c58427130b39d47e50c93e5f30edb68fa9c64058ad1076c079dcb9dc3568f946c3a06ffa50cc7942e394f91b316106f9b5b1fd89668a4312897b96d3016aa906fffcc68d37deaa321a2d090e5b4913b924b0b1d2b87c2c7380f299d4ea7b1efd85398dfad9a5e68e8daea39a22cf1838742fa55dccdca22d613d8f07b2e11e9a16cab5089da8c8a6650f33e3df1316659350cd836464a89d4acf6f4a090302ae1bcfe0a07b1cd75241d77e0e0ba29bc05987d0b4f7b1bc38f857722e1151d5cc601f99a9b98b976e8cbf37e88a7ba933d14eff275faea39984cedb248691f10a30cc08086435f306fb013a07902514a48cd42e2cc4a8f5ea4c9a6fc26a224500c0ff4a7aa0687659b3121e0d52ad403cc7e07d44f4a1c9bd3967d64da8d49d0d48c814ceb42c9ee902ba614e4c7dacad87fbc033388aea1ba93e81e543adfd55689d8493db581b6e42c7fcab4af7d512e940dd74bbf31f49ccfe89bb430f39c918867be391871f7c0d5e8198cdd1156207c40038f0d918547ff130820a2d30df0807cc193b40a9b5301bb6e3dd01a66c0532e383c2f108092e113667414f1c861b0fe490c7f8c1b4d888961dadd61c961190974e65bdc609071d042741045b4d5a40fd9fa3cb3ffca31f77822b4cef9d748fcf6e39f01c7c44069d14d7d29140d3811dba7250c7ecbfdb1e40c96849867093412c35120e6f706e2551b92ade4efb6d7b56558fbca57aebe7954542178793951d8634222c39684cb75a765caf4f7bf358a4ae676177565705b23c1e3dbf975ab208dbaaaee2827d79af1803572e3f095e52a701f82eca6a8d2ebf9a15c641e353280b217bcb2e6a182300e8d61e276c5a984f25fac986652576ca6d1b76d0b47f525737474baa3bad06fd40dd0db8b4190c76a7eeaf9d9012d299e35923d8635f57ffe46513df484b70797b44e04b191908432b4bc3ae6b1a9f670350965ba230a85080b5ccc8132d0c2205cd1c719238d9c724fdffbd9993883b2a98257d2f6057ff44fecb1f5184159fd28276f6365c0ede7bcfecf14f7f21d7d9b669f6a3ed3d02115a234e847cfbf5668f77dbf061df4d31788e6cc7855acd4218ecbdc3ea7451c27aa8450c6311041f4ee8a9996aa600d5fc9b268273953458fd24a78d63d845bd5b4fed17663aea245554a7cf2b70f0f5009e561ffda93e8356d4337e2fadfc74ca1733c587f8052a77b88c1879a915a8ac8ed394aa8337c9c5499f622906f7a243eead027c01f3397d436c1f7e09fc84419fa04f803db49aae79db8722a2a1e8044321bcc86441d24a6b135dc271229e37a2ce57e823ed331d9180530765c547e0bb005be0a1d524410eb3b5201ff638fdf74ae59f458ebfe0cc6032148294befef8310e53e2f65508ae2ecad1ad9aa2efcd0acd9b94065c704408847a6d9d7968c94703b56d01a8d80b97404cc5b01872032af06846e6e1dc00bc59c45060e2f3a62826ddb64edd1046ed46acd91a8d527a6541e8b04d00ed315da39e9fdebc4c3b721190168b0dfd95f669a78b9e6d863a4d5311d2c8944399fd968605f66f670a732c471309e0d57c697818e7b499b086257a2b736859f8a170a9540d632ab5bfe4fb2e081667d8213bafc2048decf45ff073d157b0905179b700d7ba80d47cc91e938b4ecc1b44c1f8473cd5057e6be8bc401ecd28f50cc3037cbf02c697a82b9da0a3a41b9c8afcd657b88863499dab8e032cfca1b687d1cbe31d3693bb669a90920f0f8a5280f34e25a38141b493e9821e421406a531a45126ce79a8721f1d64b348d1843e3e44ebe25bdaa3e7674aed49d9b6edb77cd3bd233fff2768a878770f1685e406264d865e4183db5d6f356485df6c6a4b8e67e91653dc0d614f76b6a5cd7eab0b3cf32ae6629f406e40ba179a4e0610845becca99385e1b02c55ac1ee93edd17a4a2eec2ee89b0f2c89e6c30191e82ae6a34edc5b82029902688bb6eac2743111d6ac4d9989148ac8160709c13b0deffea8146094ccdac916f2982b3cb46e8b6f23402f8924b69287e96a1ff62a4bf8ed959413130f5fc82d61966372b1218cd2ff048fec3074cab143bfa63d4c7c39e624979c21a3fe029fd5401f6cdee3bc08c0791ccbc0eb555cab49921f68d635efbc208a50a2588a4e58d553671f80f49bdeda49c006f34f06f5cd7aca013e5dd9a65daa84bdf6ae631c1ca5f212f8dedd6cf5a55ae5043ff57f613d1de01515331aa3e4a120e4efcfc13eb2cc4aef5daa5d8145b22d257c204351aa6deacc6fa743fd7bac597320f84238371cc46b3394c405fafaa13d9d6998d9fbf143c24406a8e7ba6ab8e4791f8b3188951fc4428bae2bbddf31ff7845bbd9cf0fa387e8e5f2e84482ce1dd105315571e1957a0aa2f971d064939053d8521c7cc99034006052c4b1b612ce330b6d6b5a794bd367fe147575403eaaed52dc3043deadba8bb9e3050faa93297f1d7194f65d6e1e70e03f7276e6e236b232743fff06670aa4cd42384f0830160e56b14d08583f09e8cc4a3b3bce508c005c0729809246becf504c45edd9d8ffc631b8ab76fcc2430b7c582661fd3431bf8fa4aeff2088d8c781da06acd79683418012813b873b8f84af120fae40da5ce65de42c7bf55750feb9062c119a0503cebe79273be5d027bce0f774099343d200b31de35b3dfa732802d91dbca4710747911288003f4db093e0956c556633b32eb16c5d4fe55a8551cd80a2e3af64a72a17394b2a05f61e02be9a5e1b2a29e303dbcd3b36a550674c1aceb18a193257a610235a547f292e13510491029855f343d79713cd3f34e756ce49984860fdff86bf8d47082da31cd30bee9442482ee689ff1ec39c7fa0adc12a5a3a21454a994825a4aa520c5d2dae3a5e2e6fe90e1d2b39168cc9a53e042962304f903af9515678058985f91baa35198429543693495a53eec5bbb102cd3647b1e2da1cf13ca4de52b6392dad2634c59a616b204f8fe4a7198e01cd4ea6b7eeb32af60e1905556e9aed64680f94dcd62f876b721e5beef7544c8cc6ca4223c6f8239ff319108110a2e3e37adcdea025f7f18292d553a62caa96fbd132e0981c7213b630288528fb316167d1dfff83c3d46aa14029458cbaf8dc5873a159fdc8e5af95e358af66b376689549b7c1363bc3357eecced98bb3cf6214bcc610379ec7850728a640e898348060906c4086623b6d066e09d27d78680d366d0b98e10a2a3a97ab9de36c9b8b6de5f409ef0820fe4b5cd117c915fffdced54912e87eba972c58ac39ed79568854cc93b40200e1ec204b9fb46fe2451d904ac03155ece641d0f94eb99f93700ced0c12e5d20e349e3136c2e6e7f00e2f2996d28eca52dbb2b9308a3b483ee7b0b26a744083de9896c64460dd2feaca3c3af0c620409730d2727412113724036c7629493b04b8987d1208efad90669879a6161a5e2e09be0b8e3664f4ca899679ea8e814f7e335db756eff0ec5813fa3971a83062f2567918afbf43d2b19755dc1d02832649a84678ffd9eb6b1433a77b1d62fd0fa55b360d64c9f55aa990021468884723b55e66b39f83e6cb7575ca88e41108addfbc1f55f5daae97d3ed267d7649d61e3a75d152c18ad152781a39a1acaaf7d02bda7b950f7bf2856650fd9ff5e180f5552496984650ace359010c982a163bfed4a8914badada2efe7d7cdf652dfcca1c1e1d41d35a96df65b3afa80ba3877d0bf4a1375117ca9220e63ee003c8ada11d06e823d0a34b089a6c64b5a7e609502b2af0c05b97597d2b6354c3eb0d26b24253f20963269ce41d5ebde401ff2898520158bf403228881dc1bb54d5e8f95e7b2332486b9a137a8e3d2d83a80217a1c495ec36718aa68ab8a657b928e254f7937aa6ffe95452ca59e4d40ded5023bb19c1709f804fd2a0305580faa4aafae769e2d090156bbfcbec546a1b306b3739d5f175ce3eaa13deb1c8620a6c27d2858f7122e778ab6ea01ed4438a2b22090ec64c53f769539c98fa5d11411aaee7e18f3f1829e722534c16410c6fb7ae74e7de1b1e58422c0780f803446b150570e4eb107ff8320194523ada88eca58df744a0b9780ab8c24582cfca2479ad06118de95a0d6dfbb92a9fadc649dce95df7cd0f13b097f9db0267160efe0eb5e6cc5a38dc6ccea865549b3969a3f6ad987243fe14f47363d09be341bad273ec32f2453128642d8561a5f958c4b9a9d32c1e4c6825395127f7eb209e593669765c6e335e0da1503b9c8114cead60dd90fa0a652539dbf8ee8d5aacd24b0e77c6c5e9daef4eab470f954665576fad550c0e6b560658719f80d5ecb462dcbc2a92ca68be4df11324187eafc09d35b2d10ece461e613482b8f7064ec22de224d5bc1933741f6b76bfac3bd9b3c27cf7f325a4d1a4e8e3118edc34724a8eb0420505ed289fc5b4890791b42d50e4cfc39323c8f1d736271e2eafe555c63f538ec4995fd59c6cb1ebb5f4ab9f09ae0fd0ecd7ade199d0cae90190428dddda1bbf62dfbdb41d63cfcc5916d98eb18fc59ce571395b69f76fc42859bb5c020ad89cdcac7acb3b9f05a9fa72564f26d500d8db411cef1a91c5f4db81b8f2469ef4c177a55cdc25b912d5b54bab8755d59c2b11cc5d82791a022c6503cfa493821e41cd4c234f6c25609ed8ece51cd9bdbcf89ac5b14763a971299654f1bc773ab05363cadc5a33b8050f17535988456f87e40b5e23b39dedf3c7338a1e803830fb00a59a992a1dbfebfc77bf6cd07eb1472bfd0b3ba59839cdaac31030ffb254c3ac9b2190cd841259c335a3a2d7e1a0475d37f51feb634cf783d8d3be463c6e83d6b564438227959c1740bcb80ecabd6a4c56d4fc2f3be7be16d4889a9792f8793e7f6e758385a253b1a04da51204fc7dc22feb5853de589cc6c76345218418ba6f66900f173facc88673e2ff196e8bbec1269c1e216e5ee25a64c9ecb8588bd6a7f8b7b1d8ae17f33ed2f9d92379517cbd523a7c8d23d87a689f7543bd6f467eb0435071a4c4e33a48520cd82da8aa1a3d7f837982bc4a5479bacf90980b75d1b88cf5d0c4f4956264c9869f2b7d0d3c35f04c561dcea846f56dae809a5c82185fbcdb33c40204a222613e7e59bccc1b992a73e7e327d524c00f43824fe704bb9e99ada040b00ec1b5f30d0ae1cf5d5a75349ecd79ee02c6425045dcad1ec999470422152b8b9d99cde31300e7514172ab45752b2a81ef0e16259ea7cd56282e11dc7e5487c9f14d37c4c776a00fd0097afcaf7af67bb184e6f18dc9a2ed25541ebfee4d79a4e2d7252dafe153cd9754637ccda7e565c7c30fd41bf4847bb43ccc858a9a98c0f78f4fdbaa9c5adc4700217c7465119c039b85f1185f58b434d072667c13a63843b8d2d9aa20044dba5d7cfd6f2e0fe5f51c7c8830763333fc6673e069b38d55a45b62d5162e2a1f04ad1012759ff3b0d8067d4f0feee6ac478171f9addc89995902aea1105b26f8cde8dfa1d1ac8074e01c5c9a44b1efc89144a005b0b2751473b75584202b6ee1ec15dcfd1664fbfed5ca77e2373200811fe9b04361f8931bbd1d8627a6f69f7ef92aea74d6642c8cf6c9b25aaca935aaff6ef55a26d849f6cffed046224cfae279cdc9cb7f9e350a30e65160c1ec58f720e6b412e6521533bca98f25b9884c038705879d274d3a6adbdffe8f244764c356b5650a2afa37257ef448c686568ed15a1d69c726a95894eb7a3369df32176102d06f3c419ac6635e7becddcf0f98c6b614483cd505ecdd225907a781374469b0a8b463510f5226ae5538de21fa2e09874a22084509f6994bd920dc51d4015d903f37c1663cee521c021204741f09b7ccc41c3225100465f7590a73c9d0a53ec527b366097c1afa20c511fbc99189b5d8f95eb65fc7a93658a098a5d984b3f5a460437219d65632b1d59aea4968945c0a52ceec277fb7f96398dc700efd9adad510f48d5434011308fd39fab81bae86130c874b56b09f95a98f65accc344441e9b06db7782f5658d0e40fe9bafbdee7d7537dca463734fd2c89e91d59f33b69ac4248450882562b9a21dece4d4be001c12e6b981e1cccd36d23d1023d9c090c65d9557c1d3d4ca618ee390caae0c6adfa737dd02691b1654369895bb13719c10a473ed2144b1ef8094e0b7e012a895754246e61d48721e38035e38ffaf33d2faab470d961c2a8469a89817d2417e7cedf6d37f32f078fb89c4f02bdf621952cef3a0a160ba8579d8cb6d48dd6f703411ad0f398141c5578f1f6e31b51a37486b9040357aa69366a2c0401d527e4e3a704d825129ffa7dc1e5ed35d7cd4965d79672605202da169eb538279185a42b7e77c322fbd558abf5a5e15af4dc602ce605063165643d1af191c97d5fd1cb55c8c0c71f34030d92df76c0a1f065388396a9628675ab8671e6aa7af8f9079cd5d34b5bca18bd514ceba8304c31112ca021da5a74a2d8a33815f54c6b16960a27bb288cbce20072be0b2aa1caf32d3c9ba139734baf1d8a16b89399af1f1bc27ade37581d19dda85e4d1d03c144a35420e6adf0fe0a524d8ae74b65b3e9818c3be37d780e11e78c11bffb93ed29bd56de3f22eb2d916ce39c54a5d1c15a2d0eb18c36966248a559dea227a5d13530b836a887729d3ed77628203303562088a0f38f08b103cdf5b32f6de0dd188f3455e2ccd02fd446199e46edbadf56bdb94c22f052cdafc8426b406afc09832f4b0da9990adc5249ae3961129f1339c583940e11c38e46d70a34fd74d6996b30ff541d240b01efaf2520fec7410409dc53cca0ef8519eccc7ad71d62af948ae96676b215576e242ee753fc0037f7ab69056edc60e08b255a0775275c6fef5fd3ac9edb4145cb19417d265d7887e3361bb3f70e9c938bfc4f752e09be832ef5da349742f90cfd8a6fabf66ab4ff9808a143c57baa2bc1164044015903142eb427f0b61ce29e489fc5ca0583b3f77f184954b8160d5e3af6ed867f1ee8e8ff7d9c2e09eb61884c21a95b5b9009908a4ee8b43a99fd5fd099124d434ed189563ccd14cedf91542f3000d31f4057905daf5c7cb67e8d6db9b76b83e02eb09023e706bc96071232d16fa9f99867df2810cd6e79c7acbaccb7f39a5f2b984947d751a6607a8f606420500026470794da57d035622ed5fa6bb5df52b082451da24947a9cf2f1ae61f875c149854d77c60449542093d4f45cd3e1901a6269046f29b8c20233024f5fd368424a0b1d1f47d103cfe136cc08f0e765961a6ca79efb1c713b905c4b62fc2f6bd9969e432c75d33544e70b29b5b3e5b1be2a88b19bf55645a930c426f6b3c8af60e876fb3a4eca64067090ebbef8e8a2d76d511a0f20163ebde43f5ff80a5111442fd7a2fad3979c062ac8e88e33936cdafcdf6b972abf9e37233c3b425e2f58590cff84e12d68bfa923278026e3c872fe345fb63c3527f58ca43508b8a58da0302a0ad2a9b544af999cb4cb7e832d450fc227341df53b52df19d81dbb6db6c3e40d9134a99012ba0d7c0248c43761e8bf2117e8bde4050e6cc8686493698546b9b4f0dff7bec57a0e078b69b6de87318cc45c3f0994c75a7e93e336944f1283e5bf01059a4d5a013cf9beee9af4570deec3caded706e836289d0a6135262593ffed843c629831acfdedd2843d87baeb183297ab14c281f91cc2826d4ddb0aa6c536beaca7b8f03a9fe41889644778e866a471c3fb6598ae6e5ba3b9ec49920989fea34e79e414d4f4bbe2c6717b280fe67ec7515b037a5fe4058e2a8ca658a71bb3990c577496f77d74ae3a3c32d5c28c2b6de4a66cbf1e000afdb65b5fbf162626c5d0745611d7852762ab70adfb1994b64c3f463c3b09c2cbe9a5f6310c0e5ed9b3856b1bd6944ae860417a5dbd6c32402dbc2ede1f800e81728dd2e54f167b57f8f8dcc42448f2798e39528c1e13431680a733704ba5e12b21fc8e5699abf863054ce46c19c0ef6b2066f54ece4fad39f4ef07fa8a5ef2900fff2483a5e5a869469881679bc46781bfe0bc7473a0ee7bd3b0c6d8c8a9f279f1a387396cae5715a2c0b9bf2327f3eb4f88a5b95cf077109c25fcb3360cb18be5870abaf2404a3610bbfdc99cba86ffb3a1bf8e790d0edf98c4261614fdc035c1c7292692dc26c1b690d874f4fd07d7395a8598481b5019ccc3b4e67e95ce8a61fdbbb710ea6f559f3f61810b61a8fa1578bcb5568a0f6c6dd4879208452afd222e9a15b78ddb334ee552d1acff70596f6de43508199e9b0dbcfb8f39b1ad056279aa8e24ece7730039b391702bc877ae05d531e621bf9d5975bc9f3de0a679f72984046691be6e87c713f227baf7ea7ba3c50c312d7980d62028b878426610a077dc16155dbc808715d5b95fff773231fd1ed3427865c99b2708a4a75d89914ae17a714cf84dc4250cfad303068741d2b023d38a36bb6f478a91b9d568675321119f984d913607aa1d5c8be3efa6e4b52635c222f93167e9750f7cff6c83879da80755de54cd5234e78967371559ed37fefcf55fd2e27c63fe7cbef4fe00949e48b275ceb293e0673113e3f666703727afda784cc641bc9b201eb3dee5ec32fe7ccf51fa32d5cbb0089c47341f9a61ece4167ff0b3e6708ab357fdd0ef990821cf71fb5db3916f945b29311de050d740df004e02d8f2a344320bda11ec1b2bbbd4c9554b6463b2bb687d212decf1d1b4a1f5ae9f6abd1b5543451cd4d3db9e7141ff80765025050a9d69d93f75f0468502b00ae9217620628e80ec5f15b4bb0fd61e27f47c10e28c878dbfe7ac1bf16ed4eba8d203233ba14ce744261be1b143d3489386bc4869346dfa06404baa7de5e1d1a5fd26cf45dec6e72534a3582c061ff9b56c8aa31bbb76e7452efe5a6c3874a2d24f9d103adb259dede370ebc2cbcb9fff9a67086184d88a1cb98bc08cedb19144d5fa6110101e605022e1939557ad4059f03665471b3c02d36837162a6c7a94e128037a3a60cda490b47f92f8eb5953c616c11357475d2c505d1610637f5a9f95413de165d8bd3bca2ac8d5db03274e9da1417b89c674be7d5e68c4ac52a0c2e5ff16dc08ebeba8847be84e29578451af9128a7220a80a37b4ef950d7e45b7234a465470232d3252d94d5499110a6e365f2712459fa84a2b3a4a4dcfc62ff853b1b64a8eef8aea9a815854a358204b74cb641884ffe5350315752e23ae0331006279c76b6277178908d4834bd64a31643d77238a4acd72917023bd96156c15be8439594c7855c5cca958c324417356134cdd43bc2b03e766800e0dee2a17fc40654778fb2fab0de10cdcb56f3c733b8eb4d8b59b338dac4971c8648ef0efb3277331539ccfce9c35a8fc546e20816a8dc7aa35a4ab3596cf371c80dc5c5ccc817f51183d43e22908c1fec301e62e01e6a93dcfca6a52b2426599e61b3c035e00c70d147220500a2a3b9f4ed359d622561160d30cf22c060bfb519be2b1f73ae62685d26f0ddd927ff1074fe2278d44b70239da95b569d085b20a5ec6baddc4efe39eb73c98952fa842927aa53a61a5c590bacfd248de306ffd67df6d4a64aa853c8a262b5707d8e21f2e0a021c5894cf6c46fdf3a93341447376e21e05a45509d34ff3fecca8b23832c3c7202bf7f7a4910fd7ee561ec3933f1ca07a86966a12f207547c0a8b48e2ffd49b00a6926e0432f25f26e0820d14ebdd66a779b310e51ce4f8356af93b7f279deb3b10bfd904435d724c6a8360b0375b0ce4c8337fe7892eeb6977d979929b535cbfe099490c9631cd16d13cf4d72d42380aa404ceaed6f19e995ac1186265d45c350513c8c98bfb79d016b119178d95a5751b0abd87f2aa2a6b47b7c560350695eb5bc998f5cc16259b2b76c49754ea164ea3350628d7ab053aa15634de1d5852aad60209bf9ff1452da49f6231453c8d567b7256a71f52ac28e225bbd4bb5aebcbf0fd6a2191f1b1914fd24e2d888f1e385f5122c3b40554fd565759be3d356ca67b252404c673e3786dd2c403b88f75e1cf6900ccc23d66cd30361ffe8f70521fe93569b64c710896aa6ef22ca3158e9d08c7928c33846741b869c6f30d087110bdb873ba59776aa4cba60c1198bf8da3a272aed5aa4763d4f683d3b54cb7141f38afce25e696f119e5dd15d9ea1cc8741c544203ca02a041fe33444a64d53cf6ebcacd253a9851859c2465488bc180a700acfb82ba821b5700a9c0e4f794a00948f39c17a239ba7d3f2fbc26954fa1b26047625e867c83e5a5f0e95dd0bd0837a544618dc348d77499c23696e08a1cdd02c8a240104bbc0c25589a93809d9a1125687f8a04c615c1c0a1c3ebf5b6a61313aa116d52e466ce6cc1170b5fc3bcda137c3246d2e393b85817f81e2aef085040d30912f3a548eac31a979ad6e108ffef54e2882669ac71638d9c045e7870d976729c3ab0b0790926f15679a19d26bb8c121f1f911cc900543e6c1851d4b4aeb63047ad8c86b09c51945db01269e5e3d8c1a13093b2ea8afecdf9e6722eb64f81457f67dbd4170330280d9aa1a0a1f37e500b4555b88ed83b3c13ecabed3f48120e35a3ef3244e23fd4cc2a31cd51d1f15dd4dfd41d38941ab80335dbe2798ab1e4d24762e7ad383c9464a5a674d6dfecf6b8c390eb4b92f1a85409dee788d4c72c1152d3c0bc8f8328aacd9aaa6d6ddfd201c283004366a0f2df7799419a1ae4732df08ec6329fa63b5a021ba2fb5c682099e0258a88e4e40b2e4563515ae10546e94c2502335575f1324068c5fdcf97f2aa6184451ca2a053b2fc60cef117e6d8fce906db061cedca027f024e1c815d7ac07d44fb125a28a735700dd4b5abe1985b1475c821b64ea0cc4755e3446373a21ad1d23c2eb202baa7dc2241fc23c3610514322c8f6a5186d227622725323f0008a5dd699849295f4be6484fc9be7e7834d9649be5e9560a344cec6912def95be64299aaa85eb1c4ffdd4b4d4f1f6af021335afd6129ad5e5bd35da1be8c74d3935e857dbe09cfdeb7b15725aaa6be55f56ace7a8bc7eac44a5006784600d68d8a34c14e04561a1739818a68d86b4444081a71d869588708964d95a17f0b6daccc08a08460bd311521781103dbc64498a013001b8d230482dee2c4eb7f1a95b311eceb44bce3e1d9140e6e599d9756422aba21f553da12fae86e4a2a964a6bd9a194053eef89f964d12022aea9e902ea08e9df13638649c749c5d9828fa64b9b56f3fd08ffaf386bb82e95f092aab42ab333d28c205a3040498ca6be240743e6a0aba4e514bc6b1c98a71ca5df880a1e68b500138c6df8983b1cee74d85c5f045897aa54bcba23bb47c97337ea301440e1feba9f351bef845fd184d3a1bb6db19dfd82bfaeca220225be5e80d129174cfa30aad0eb3be76b9f86de448403ccd50a369dc2f872fd75435bac3c7e67e35981f5a59406c94fafc2087fa44fd8ff0f02a2b78be44a699d08e7671bd19fbaa6edcf344fe41a17462334c2c71c1c150caad9566398fa3bc0d807dd51995ac21ae81d0e410445e0ee588e008f59e3dc7cea095b3fcf2c515df224db5b454d755f4dffd09ecb954adf120acfdd1103cf741c0efc7820c6d67d60c5bcb36f108c5e34b6c7d4a650d57c7d1f9570ef8cc302ab91a037333ef05e7b34193f60d443672c3c14d223d2fad42f646520700451430dc803aaba04c53bc199200b58840765ec4e38e6f19e9e179f67e1f2512d603a3329a6ddc391633b5510f61d36c8a440825dd9110458d50e0ca12192ef24b099dcaedacb90ae5cf30701157e781a1df0240b9acb74f922017d0d9e818664bcafd88761aed9a853bee41c03fca0508080ad895ade5b01ceb27caba8aab3ccfed95d2cf525c0d241c73f8192ec02d2e3fb474ea35e0b3f3e45d47885e58f92af559c779c70f90c77bc3a3652e2419537ec854b8f6515d447af0ad6be9fe5d344e82d1ab23b551dff7cb20cc013331d1b10aaf736e6970a18ca62e291979f7a40d7e04e777d1424f1f4c2068864103aa141f709438ca9c58e57f130e00bb97dcc12e72bab3c64e48723d2605c839b089b8fd5b330a38c9fd9016ee0f9280512bb2b8c19113334199f927f26962fe52bc39e1bed518f785adf0cce1e3587db15d32363dd281125db9b507756be3f67ccd0e95133e3e362dd52cc7961b2ce69de0a415876a23cdceda53583518852eba74958e9a6a3d14a4b12068f85bc619f27f32ca9c5d17fd9e6f0006357c430ec559a81deb1e177a16601e3efe9e8473cf0fb5688f868412275f4bd99c0fd927ff639780ebac27f75b04dbffa731892f6db2e0d905cee153c9178ecfb2ebf7154ed0380ed1b4580e6c424dd1d34eb2c5dd19e4d1bdd65b228376d08ea35e43f9152c840003b46c02848301ed9df2e340a8185a2400436c8e2e226a6a0e5cf128404f51cc141fe59b2938530d415c8cbec91e151b7020705b6a7e6029ec15b328ec62160eb2008ce202a7f1dc1a6e2bc05b4786cc461e959722ee86a9f07113c2dc109e128deaa69eada03b7f077ea028c59bc4533e8e43ddb1a1d6213d2384c62c26b253b351038764e5afecfdbcfc90c961ceeda12cefe2524f8d1a46aca15e4d5016aae6ab2eb4eab74b1266dbb95b791728c65b97cb794f2cf1fb8af53eabe027431813370c8617e0e7bdec37b5d6aad66ed02eb1f10572910561561252a85df1bdfc259d23d46e09fee0635d7b6ecd1d8111169cc126734e042cee72353f9b782b6d4695e2226d43d3ad1ab630b6aa73aa1a7d03d2c2ee7ca3e3f3a86c971f436cb3655dda71738a1a10b350d6778bc8dcf4662f3906f7ae8a7c7074465dc70797b09d74ac479a7a2e812ef2bb029adfc370473d31388a55e7d9b1a23297a5c2714c47c00497bf08c564f60e633ebba7143ba2f1071f2215bc0b8ff67da776443d6324203e50b9ccb87d683b0afb06da05be1f23994d531d3f1110bbf635809e7b5ffe2e46633d7708f0338dda6e40be80979c1d3d713c2f21ebfa0f8dbea85111476407bc13172338690be177d16a03b04d97433a3674d2d784140046352b11056cba60def56fba7bab5aa7d41fad2f1c6ebb4c3fdab040b920dbb15427bf779e2b5e85f2f2fab036d41a6117bcd258a9e7be6ebf29bfdf064f39404cf2117883234cb8dec315dc53fdb801f1309b7889725d2734514b72301970cd9a663c158f79a9a2ba2b9e0d13feeb7ca25982c1f0d768845cce4d71768e67b6f2b0a77c24e0fbbf4706b94bdaf020ee1173277ee5184a430aa9237d7b4b905677a8fe86edb77a1c40be06e8145fa2191df7609d060d0960c886ea97510beec072c321e6629b2c77bdfe80ecfce0d2aa2edc6bd66a6f1b794c4634aca61e3dcfdc7ab8bcd76d3b00fd0102b9604ec045b96bd81575b491056aaf2368d80e1797f60e8ed4be81cb0ced8e5b32f2302f5b6939e02e83099a6536510336c3b8c6f0248824972b8335322741e8642c7c9b1c245c7813afdf517e081d73802d5660f5c35c2073a1318a6800d19d65c222b544fe1a3acb06a21c2462372ca9c1f14d6627d690a81167b167770766f0cead1b2814b71cef3a0b555f391f611d8db3a72d80b03c75dc5a9e912f0067395f88cf39f7672dbf6f02ec125846274e674d15f5171edb0a1dbeb224422b55ad0297fbffdb453408cf3eb058a04a85d6e64bbf9114b1b5f027931d063e3c049f214770d9a42fbb9211651f98f5dccf06aba7f4a31c93ee92c5ecfe9988b203896ada622fc5e4680fa4b4537cd99da23cc0a837da0431c4e809aa9e4c1c22ef301a3a32258f62018eb6249d5ba1052c89500eec777472d8fcd90148001d3b40985ce3ec3d43712aacf6b1ea1a458a5553d1f1ebdc1f76c6a80c87b00b766ecd25593f8a8f10dfcfd0688874efccb4ab83738e25ba8f7aa769c1b700365341c70b0ee067ac22d4cb58cb3dde6ab0b670db88567cd765b7a1cac309cd3341f8d97d10df3b07503058704fa2b050c11a2edd0eeb71cd187b0bea5cc00015e3f870497906d49bf4b114054b546e08c5b782360119d30f68fad369d18072c2747d597426aa20efc1495259121c312a2134cb22386146a0249e37ce94bcffd2b3fa1b89a32872a450c6deff2b284eb15e789d6e5568df3a5937858a6a5df30ed6edb774f2faadc77dc321f499c76b7e80a056b914fefb64fdd419adf8949057eacd4a54b2e4ea7a7c2f44a480bb04415cdf10d7943e446fb873f598404d0b2ed35c88b1b95ccbd1b7e9c20eab4321a5c958884989359675f5bbd9ae0e6f71e6d9d9a4507ae0ab24e8aa450346e0522ac5e1516c742f25c066ae83229479731f8133b814258d935f2dfb57c7f95a8b644c1000bf372adc559530437c868aa721d50431ad03923ce10db9a09bb2f92ccbdbd0e47cf18aa7c6fc933defb97ec69e273258c314c56dfb1de01be3a41f16b2710a5a717f10fb4bbcb9fdffda3241b3ec6fee00fc125f6f96204ab52a7073a48748111e6c12447dfe790af89ed0fa5b6c458d9a187d56fb1ef72fa5a2cd425efe7ee771e3763d4d7681b4144ab0bff10b970d900eed35df413a9e182552f778561f1654a55c2562ee11132c471f588c26172fdef763ff6d1e25953f3c132e8dc0551af6fc3cf452dc62fc2eec3a49538c9eb4f4a304c1eccf7917164598ffde51bc1a227a64a4e43d5464be455a32173a0431aeff0064646ed02c5abb6a5fffbe024d71f3840909ad6bc26a4e8c120cf267882315804bf52b322b88925d0b4dbc9c20af6c17e90cddccdb4a99449ba08888ad1b74a8504582566984a7e9172b322c6e5e11a1e0fe9ffcdddd34a8313e7d55d608909355a5059b423747809a837ffb9688e950cc4935922c0c37a95d4eda52e998d7ff1f651a1c40fa66f10061fd730847f2fbcc85e70722a07ca26d25577c28c48c9154f52c78b49c4911b4f650218e08f6f5f67627270e103d4c7d41b1098b4d0b8d2456d05177a54b00c48537392163c313242f659e1612032b8d8d4649785b19bc301eff18632327a6ab83a34f452f3782d2286eeb88e95e4a14e452c6a404716a3c1001e3bfc2d7d6d7e8c86fcbced271f617f813e266ac4c4d2fe2200af4088b2ff2aa712e4fa58ca0092a37ef9363414563be783c60250f59a06876ce22d4e48b5aa4562d55ecd697089bdbbe292fc2ea9a02cc5b20bfceda679172e06fe7f6dc5dba4c48435cf36411ae48c8514d25870bd847d1a105142ac6747f5f4af371d80960cb6017318ecf0428723e717e1c37f3abba461d510a8aa28b6beeccc2be818b039236990eb7032a6e06aa238f1c9085cf19a5732534acc7a0d6f5917a898be430120b1371b7a1980f7eff251b29401d8fdcaed811965d2fe4080235638fcde074405616150762d79504b8628e4bb14e813de9a29d2291749b9c88c5ea71b47aabdfa53f112d4111278a88b25291975c389fe0a1f3e15d53a2171ae12086e25487a3e20f23e35f2f73711720f523141328580f675b00959643f1c007f0e1fbabd415d6ee16a329e5bc66b8878111445dae6b03e18cbf9de750929738ee065c1e57c582f6d58f29819e18648479b5bc63bc1c5697ad31ef7823a30f3c8caf716f7d431a59086bc174aefaf6ae92841f97f4ca01864174ec3a4e9916241a761c04ef06090fdea1d24b193a2bcd3dc1fad5d3d567fb944a66b40f5175930c591c4665c8c2851543cee6eebcdc0f298b67ecf15d965ac709f376e3cd866b203a2b8d3bcffa505a54384ae1d25b4cac916b8083739b3f67bb39269e431064b003c2f00295cfff35171a7e37a5426a9a623ac4cbeda97a0dc83572a6de8cc2a8e702b4fc07d0c6f71266260035be97e8bc52c51bd25e180afdb2be4b6a2845347c8529627338587be76a07d71573ae689c396c70120d290148a7e2133edb133fdeb69ddd94e7aed71dc7d1014081a7fd597b2e24770b62f178e4c17b624d222863335c8677d95e99a7753a17599880e778797c0a918867319705a7a55391871f04f8fcdc6896e19a5d504ed06e21e496daa8273c80cfb64b3b97f3400f6117ff92931d0989f3d245f47d7317f9c1596121ccb66d068d3f3bbd68056ed2684f2369f705806453c58aca2bbeeff0cb01d5672739e0884d03332f14628650b33d9baba59ceea93de55d09c44082a96622e52865bab581f761cd06ef79d9b07f7f1ac88f3d6922fff02b8f7acabdcae6863c39b18bb26fd4bd76f6dd2e2b8d3c6f076fc3cab5d0eeaefad4ca34a10c9eda4d04865b7a24a46567093f93b914087b68acdbdb0d7d4bf0923267dc8d90fff83a0f0de507888a077acb371c964d6070e8d6a72f78026b5531dcf2d61752da83596f683042e898f98d3e8d10c8d7b14c41b3656ff90e5fc88f0c560a9d2a21c290839a0bc5c0c0c76f0fb429b5f945474a1a4cc93cb90e29cdeb68b05b29ec09f695976af2ffdc9a5789fcdbc32d34f41db47557f6028279af185e44c8540e71e8a554e1cdf7e2f1d7046993e4f9940b6d106049e97ae68ad832b186dfcde54e0f183ecf0dff2409851674b3a78c4c583985f911382442f209c58df0e8717d541fcc58341772ad8c9ca46fc7ca58c407d217f2646bb7a340f4c62763387eb6853eea19ca865b4cc23e52ea1d3db602971129247f1c9f6b11b0fd4962caf30c78209142ce1b4baed82d38161b75ddd99b1da093dee5a2a057f145ab4f53198ead5912676dc86a1d049536e85e11bec0d635da4a90d9b376a722cfb08a5d89e6fd094377526838d6761b8a548007b7eff8d80dd2e476965091f970afcfe6b013edd983a7c4559320d8f4c202d721adeeacd9c8d30b8bc5d890c68e059a8cb08900695563f1ad9b2be836c28a2776f31dd1e41f12559e2853fd431a9791216533662db178c83a97761e3e43676bc0ebd0085935fddcd0d2d040f6eae94ff54fb2237466a6cca6831f48eb2ec4e301b4004691b0378a043c5d317356675afdea72fc118fb935c96ad3628890edf39a0abca831a6d5c2bc608626cc33fe93b6b9eb41d074d4c5e58da5fb7884e091f0ebdee4919a28192ff7b791f8e12ede62771f46cb43fb1fdba9be67d6136c539c4576c17703432969334ae42ece264d054a52000e8a856a63029be45750a83b25b56a800cc3414552a34bd4c251835bae6f8bc52825c4066f7c56e7f63a67cb5f908de97bf7615f0d0f202795f1fc474b43be08868c154ca2d283a5d16eec70cdd4f26b796b0514db3c30a6d81013e62ab456da1c14404034213a25bd53f41b8bcef94c958962f18ac1b11f8d3db4f63e45de81b1cfb50fb296753098cd5c1ec97c923d407cdc300e7ce0f8c0ae00582b7c3e84ae979c31ba1bc308c014e23b633ead6e2d09ac7ef294257d247a6d53791a2146311f44244401fe217115d517a72695ff0a970ec62cce029ebc9898190ee04f777f6874e1d623522153e3b8e5778aec72b55ea5dcb22afcf3d08e164e8c6b69eb0101e4e73d2a8d14d238ce65f03d0088ef9bb59e28afbae5f144ae231fe3a81f833fa70e252ef9c79ddd22bb41ce073e4b72b10004cdab0f4af623988c9a616e0827c25233b00bfb113ac468efbdbb0216b1c3c63996f76061fd5d5d47ba2448875f033fbfd255a2ed43cc50ee9c66ce51a42d3e1a1c19ba0d780f5ef581f214d7f4112e98cae546d6478690a625fcdebdf0501945a6b2cb9591dbd46869b9ea93f8d04699fe8eb9c8e98b0aaac832722ff1e50628b813707176e3171cd54306213a469433071bc500e8d2a4d0e1db813186a8a0fe505b91031cbd04fb10e47cf1259f096a341614aa8dcaeaeb6b2ef901c19a9179e48b2329c84d00bf37d8cf9f3cc5c09c9074314b3a5373d846a095e26c8d6d707a826626442997d3ae7e4db10995517c7ccff02019ad9e772763306157cc55b34701bde2b3aa62b9a4503cf26576c8376eb5d1da0a10f9c3fd9f9ef955fbf8abe46a02e6c25d1eb38b2814a57345cb8193a30378ce3f7191156b163edcb9669f887ad270a4518e909a774e51b8dbea046c439ff2b94077deed438335340ff22e94dbece15a216d39167a2cc508f2be081c00167426341c2bd43f8f3abd8276ec6479ce1d60865f048b6cc46e58bf466454d48a6cfe02e1998c683aa069f520a9db44c3bee54baa2c38537e253209e5a31869230cd9905b59fef48674bee95b16506f856ba4fc38dd23898e0b9384f6d25c54af5b05babc9665e7e0efc05e4227496d3367e9134da3ecffeb400bfa469230bf8d49afcdfd5329a7c7824ec19cec22b8a642dbc12a425c92d2c395f5036a3df9e4154f8261a02f5f70de4932a27c8823562195921c97bf0e31fcba2d00694e92545b6ac7c3c166ccd6c80b6e5b1ee47b7fe0241f70c625c9872f79aaf8687adf3a1b46489d3c1c0cd1e8841a54a8133dcdd03a600165d6ef53e9ab66855c2ef3171c1c1bb3e1f127d3f082247a7adff52c9f11ec93ffa7745c6c7137677860a82cf2468fe0a1bcda4a7a5ac4b69b28a85597038f8ac6b70eab1c8b01179e9eab1e0f65e838124dfba2f4ce421f65821e2aaf2105aed22f37c17c4c231bfaa57b857ac9918d48cd7619213052ae5446a0c30ec40418a02672d228d1248c7f9d44f08e6a863e9388f811d6a6c4eb34f7b9a32d65e608e135fd43ea13a51404d838a5c544bae9713ac9d2c0f65de2b924a1ff5d9a0ca548629c8a6c2266f9bcb6a0660d8aff8a75e96f11ea6045ce21f6be7f37865e00b94a422f21f3493aefc485e187c3d463d68e4c18675008a9edaa04120234b857c92d62e872fae61704ae4c3f3bc6a977a638e903173e1bc81cb9ac36f3ff70d5f8d3021470a6f8177960b1a53e4122f274c34647635f22d0a38efb9ea25fed7b81389dfe5b8868a0b90eadcdaf307d049613eb52b0e70bf03a27752b9a2fca3a3cc24c580d389cbf314ccc29558188f15bcd0e3f869da86693741535363a94c029373a8d2600c1740d5017cd0698d3c56ecfb4ae0aaf18e9c57fa0ddc30eafbe51a9bae206f495010b4aeac0082bb582c0f2513e66e3003c13dfb6e306691960d9c3b374395df6f4c52ed7951f70eab39ddf89618e9065480004500ac0d1171087cafc438c57d752298c0510c9ead219f85fbff7b3a874e0967b73346299926008dcfb3ccdd366a263f8daeaaeb252a358767397465f5891a28d6f29315590753375e669da4b7b3ed37dd4aad83e982c17b017e1f02643c01c1e054175512f0a500297fbb87fb135ab93b15500e43e9e85e3b29e3afbf463287ead63cbfe0f3e2d1e00f3750287e7d296b0681a51e6e1fa739b8f1797c141ddfe0505067d193084a4f326b7edf1a0384f90ee8af420cbecad1b3ce01f59ba381970166ff37d14a605bcfa68041ef04259f6ba8bc2129e093f7f165e66e1a1160ecd0b949b8cdea54c41cc100176ef5ea0321a3898010c54806787be889d545f89b8eaa3c040413f04e32ea3478061eecda786a65e55af79d613d2b59eb88f0044abf279ddb91161ce6f289f9948b2ce8772bb89c97bb1effa559eb82895777ca26f5f097d6caff039c317a2357592f469210a999d229d63f7eae16e233b2737ed100725ea58dae03cf8a4a54d6879c2af78a98f757a8eea8e464b46a2f7662aee33438509235fcbef9ecacb44fb9f77a2003d785539d7ddbc6edb2f07062d1115ccf470f9ce5ebf6250ebc9e06a327eb875ecbbf2cba3ff9c4464f655b451acdfd7dd706834dd61e7aad2576294d4be9cb89f6a34942b2cc6a01cc326fb159c44de5db37680b1664a152c3d2187ee17641806a9e6aed01cd1d70094354511cb8608bf25c3db5a3e971081cf95392195f49c7a0d19e7d5737a062c015de57c7eea22b2de46e79ea9a3857b6949449ffc851b50fcfaa9265e26ac89a61f0c16197e7fcd0f48d7e62af70e0f5e98907acce959e8e7030f5955e9abe495b3fdff77dc579cace5d65350df78a8d48d9782ccc959c92c4eecbea38a3776f2b806efb1106372a51bf49dfb88754a51212b99f5aa41cc798f7a1954afedf53176950e0702cfa08c8d786ed7d59db6508731b3e04e8b040a52926736857ffd4d1749565c39388f9ec534a3b677c4176aabff5cb7ab1bc4cb4fc7b94a90b11bccef63125d4734d48d846dbcbe91265bf749dafae9413fbd355f0c7460545fdf4f703e867252cc924633df9387a378dffc635c995d6c2d1307390a627d3427d76fb4ae1d4fe5b650fe3a1bd1b6c104ddb5316048d837e1094ccb507054a278f81b050d6bc39433443dd7644e36f3a47bbc3d9c898db1f2ddc7e4638ee982eadc90f2fe695c0a6c72f3a409d15c0c6155cee4995f6505ec1b196f0f981e721c5c79b75e3ffc6568f6eecff7639d860c3d4a494645a52848688549747cea90e80fc9324fc0bcbd077ab101151043b63163020848a1c562deeab235cde257ac2fa7912ad78e6cad8ac395413c9a6defe22ab802b1b738269b4186dac3eea9af1b0b45efe34f4d4a7ea18295f330df5975146761169af332d19ecec237929ab539a3a9507364021a307d884e266963b47a3e9cba5ce203dc616debdba5c032b9903cd61bd40a3f3f0bc477ee30a8ce09644381c4f0ce393c3407034144e5898b4563bbe9a2c0f3da73165776f1a1c9965bcc9c937ef3b5edc9a41c9240dded42e9904ea551a367d995de82caeff834b4e37be69dd2609ef05f6a17aa114a8c61702285f711c61cb3ce209307fdaae621ae429de4f5b53801048fb783a1a6a66d7b69de9bb5b3a6379bd5b19349571a5407f2dcc50dbb0734446f401c19af29e04b1c6eebc4cdf436a0b48ca4fc15c19a1e69fb2dfb783955e39ebcd06dfc178d97a8cd06613baa89330062bcfcfeb4e9786d9297fe14b23bdce39e3d60614ac2462e9ff4c4b90777a9f7286df16ad7b3677a5b01b26b1f07897a4e69f98899407bf7edc5685f353749797a0f88ce71c6f3aa0549db74950d77c6c4468cde5b0e9752e06ebd8ce7fd14541b4dfe5da0a9464554aa902e01dbb59cfb7780685a79ada3f59c6af7b267f77c393119361254ff49f37005f9d698887f52dda5a5e09b812848e57e4519d4a92393a73116b8e9bd2e3add004a30c17cd2d20baf24ebb5587f056f37a32d8825a9d5c40f44e3cf83adece53b04e134b00b51ce4665f41ad832de85cf37c5b560d2748d0d7d60c7e54f0fc2e918da1cafef4cd93a0601ecdd30390f9a598870144a524fd3c8e4c72b0d1734e2ff603635879a9c24aff68575f401f2993d89a75b94f77a948d835ab73c89b3ff8a7dc022c888a8da34dd1b0db6958c43ea6cd810c2d71d610f6250a13fc125f09b3b7f410ef80670235611555c8a1a61b62bce732573a20f8a54d7e63714451cdcb973fd4fe2fd994b0f10506588c98ed9dd3d0e5bafe1b5ff04114f9cef3e79bb4516513076e25ab780245344c1236030714bfed5e619c9e9890bf1c49e45e6972aecc285db6505d75eb7188d0fd50727acbf42e4d64c6c5969c1e2637f782c37d365780d8590ef73baed92192b887aff27e13c91cc30106fbd5fe46a1d285e1429645ed77e369f0027ead80f8ebe28e0369dd89360e49b4788d3f9488d973ea33a37ece84226ca61b72b73440f8f0e3a3072e32ec4bfacd76a9604b4e827a4020c2d5170303e8fec3f4e467ebb9f5a0862ebc240044cda85bfc20975a5dbbe2c7809a966186912d05ef1a6036c8c8ab3c373e39aaf6c76c76eb3e0dcb1897c625e8a305e5718c18d40461cc51f98ed9f1f929c3e358842b4b951b50396baf710c128959afe77b2f4215a231504bad5c17577ac59213847acb075ab7ec046824f9f4f080f0545621df8bc252d9e11c870ce15847bf1ae4a69aed9da89d7eedf472397365a778f5fdc2b03a87ab5faaf5c117bde0bd7501502631ed1d268aa81822aa9f1ea6bfdba6788329279d6be06b03b704a1c4ab73077149db4643c85391f3bf153b40a49003942aa98e37483b960bcbdbde3c49a0cb1cf9678c68eadcd71176331f83a03d48eea90752ffc7139ab2d9b0579fc67d158d2a680c68a5c4877ce7cf759e949f1e248c2fb755222117c682a33ca6304db30b91c1cd8abb91d9159df83705e22db6ab1186f7bc2f70832daecaf6910ca5a5958f4dcae4da5c672e0d35c8e7cc95d3d7446cb86c8a941b266710671aed0aa5cd00e5412ffaee559ba32b5cde89e8a7a95f32867b9e533dd04cfcbff4d56c21c277669ff9de73fd0b41c144f3f8bbe4a097d838634c4e6bc321f74cb2079ed48df74a2c0f598ead37b2389f4673404dc9e8fcb5965053bec58ed4d23e0171e577699ba5ed7254eba8d129c6734923e7ef46db96509164b348243058b6fcf490d86836092bad6da5647066185c16f77c28d5234205b76ff9e4c44829202991c6381eba973db24d03d45a26748395fe0852c63071d283912ea79647674b1e9add586900a865838495ec735e4210b29d4609b63c13d65632eb1f6417f728fd6f712f9a82c977731d25f992680a861db4a0a0b8bd9542e1adb906126612598d0ae736fe79e6889a7d8754a87088d2af2df5dcd356561ae114e0a974e657fcc69449ced3d4577964c50b50f9510a25e1b26142875d937c48768647f4ca5d0e899876f47981377ae451f8fff17fba3e817524a9c58233c70f7bd8f19a60afca05633cc9c176819d6a91324eebaeef93be8b0fb4ec7456bb2f0f2fd3bd96de054876f7182d8b98c40b97d3c13605c2fb68db7d468d42dfb5876c8183e61dc59fb44efe9e01c147abbd67843da6568f5030128b28c39c68e45174751c3d438f62e078667656d749699adaf1760e1fd670e1207d51a298508398e2161ee1023fb8b4dd12001fde3a217da2758416f1674012f1aab8affd7c7742a128771190df8c045fde00e9ae270adcd91408b299447dd01f9a92fe5d47da24daddd859c0ce2faf24fa10af842edf854bbc91b2b2d733f663bfb037492b9ec2c6e229cc8d734513bad64d5bc45c91dc17966de21d73245d9389b18ce9f1f0c06f3bf02ca4d2317d259ba16fcb474091f092e297f074f6ea0bcf9370e70713f0c5709522e83d6feea4f02c98315eeefbf8c91017ac5e790e6cf6c9ba89e518630c2fd8ac3a2b5a67106f267b21c7f7b0b5efd6dda7432c10fba9c71484308e8054ce1894e125897b1bb3f82166104405fca7d313172f92332f242887e023fcf9209adbee5bf7d47425825e4fb4792de6ca5bf227887ce331cdd8432d83d5f74e9b7ee1fd9eff8aa2f1a6c8ed657d827688675cf1eaa58618784ac438fa8d819b271865539d5cca37a4bc42b66d8b1e2810d270c0b9b4c6d02bbdf6f1ff0804216da50cdf5b7747fcb61308db3bef45b8794db62063124cf1468075697d79df7b3fe7d4cc63d4943280c17b7e092648f67565bfe264267aeb04841501ff612b32fb2d17bfa97ca05f6a70a4207c9a3237a6ccd223b5a27ea3688484a80bcd15491127f40f64fb899a8e8ae2caa31ccfe70f110dae72f30ac851ada9b53169be19432dad8f2c4d7ac43b9b2455fa1b6f51604b0fb03317e95321a8bc0248837756ff4a6741af7eab7c18332ddc33cebdda78629f818f0a9a57916f01a4fead34352ba9849c7c2c8cfc4b5902a17b7d69c8bd060951f8791a4fac223b9dc8f892c9895afd65ae0e14857deeb2e97161acb30aa5e5a5f4dd6564c95525477c426c99350b7bbd0c7122744063cfd042858e645065b0f65bc3e66e82e9121ab8f1012a13184400e1513bd028a08a96a4ad5790232452dc2fc2dddef73139f35e7ebdcbebee799274da9e98826c2d7c18cc8a94f0455fd090a014e3750f29f34a99cc3c96a9d38b4901ce5a9b0befa216a89e1736fb101fa1fbd28a18a68e07e4ad362c8161a405e7c764a2056fb6577664422caa9266441ac66d35083a0c358113e8568b417eb27fcdcffb174705a2fa7531cb3586f9aa218e31ccde59c9fa547034de7d8a195a0fcfd7b26c5c78049444d13ef1bea4f9d9d02c28d133857081864ef7e7385b9d4e527be93217f82f2b4702b9f7101d1d4e9d6311ad8eb0c3275217e126d138e33d145beb5dff8d7e36afc0b27e967e1ab36162e25e885533e3ea024fc648b89e21a230b62991399f7fdd1b388c86145b406be8e0d5c654a2db42ff3c5b7ad38e9610720667890297f3ccc8a9af8516734629c90a5642bfe94194be048e9408f487ea1b12865bec082a02e3cebd5627e4c6e2a1da1571f653e04805f2ff7959b6231b4177c35797ab4dcd14e9d27c8f8540bbfd31193725e56ad0cf36d71b7d52f63af17e95f331d6aee734723a9ca4d846df093537de4bb08e6fbf67ee8bc6e4090f595c8ac11c795a7190dc04d6aa88b281fa7da78fe254f682232d33d5f6bb002a5badfa76b8ccacb26cfd25ebf325c4134b1a213a94147c70f1f770cb697d75578a5f61eedcfca91285ce79775463964497a02a623a499ac0a58bdb9e1f69d93b1d03a230a1f9080f6cd5a1d19a768b43088b9681efdfe5d117078a233157ba54146c046d73226f89260c635f2e9290ae431154c914fe74f833ea4145f3f1fbbf9b512ee387bd41d086eaabfef892250a9a9876a4542c144e27d87d4d7e2fb859c08d3e9790765f9c11df0a5df63f2a0463d8a8e435a6600a329baeaab9dad680c6cedabcde889b1a21ee8f8e1848bf74e52e01bd0872574d9967bf1274ee175febd389184557fb1b537a9818e2a3005f630fd4b84cd9d0bdfa1c04a945d5bffaa0d6109cac9bb3823ae369d863291694e92e4f49c871d833e7194734a71f3d9ad3f27baa85aca9e4823b5a9e6dd6608a7be77effbf05c148e7b5b010c290e96d83a508b428240c25c95e598c31f78606d091e17584b28b80a290382cf5846cf131f3229ffee2d7c56ec8ecb9c360566dbac1d6d51b113634c3035aaac64e6e3c4908e7a8166739a8c72c36562dd4a69a1754208c74c9f4d2f2e58c868433104d80973dff93124944502b5d88b89a8a2383536744f506dc39734325f062d623849f0509c08995ca24be3dfb8da5a9b20bedb97187fd3687fe2c7e047805ba4a07574e3f16b1023417d048f1748b8af5f227b21ae50dc83a178b5bd14d4b89c937f38a601880ab6bfa8985efe2dffa1c6db3129642876050a65deea0ea565b931ea02a226db02b535ba087a381557298dcabae61eec6184235e765a06c6d09e4afdc0dac69be58e0beacb637b0b5f505b061b0d50cba8b1fe2b0bc38649effe16f575efc55534a4470d405f41fe84e93bc808d8bc5e787a5723d6b0e6a587a6a204cbb46fcad7291485a1786dbdbf9c10612a0aa7fca1cd221f210faf4d921129e5b56b2474675b9e6e083f4ec6ac6e6c15cbd70689a047ac58c289933381f74dba862453b7e87126465a8d8e15563505e26166eeabf9c8621d4900efb96943753521c8947e97e389c65d6f2f5a398e710bbd030403f0a4887c805ac2b599476d332a33cf1ba1c15aca6b45b269087a85a9e479faad8fb04ab48c703cf7810db853005af30502ab3e1817bf140acda5067cadfc3f8eb66041f774eab31959d06c3e9507a05caa0e9fed4f0c08823e5afcc1175ede85aab90f3c3d7c8ec78d885d717c59677cace1bca655714287cbc7edd6ca8cf564d14bcc47fd1cb50e1924ad4e197db515c3de42226bd0931c4def10d1003fcb226c41e8338dd124be28736e500fc510d2d70184ead50f122f4d3abece29ea3726de9ae50d5889d4f4f06cbc10dd4e30b38693528677ad16b185159c2c7b682490211136c1fd0b36671268e18caf2803e0f6f91a8155e96100b57feaa816b78d427b4815765441d0af7152227bf2348ded07f744a8921e1268343c790c49f31707f098a8416d5ec5bc8ac1fb0b742f1a3db0263757456879e23aedbf88d7bf50d41a3839a829af1b7c01c989bd898ba4b1bba05309f3e9e2c40df701712bd6ccbd4df9672f1d088b88f306b1777fd3344b22366e2c4023ae20fc5a351f925d4e988c9d0a35fc9f2000dacb064a6e917aabb8bc15a285eaba2279295059dbf7f518f1f6d59008a2c09eed1751eafcc8e67f11190b01b8b26e852e2287feef8fc5f826bae828b8a0696207e56410c78f7a7d981712296113edeb03d44226467d98f18277f4650963df60681b72b064e200bf99bc526da604b94bf86dedbce8a1a556e8622469a2d00950f17f2b2c652d872ed5aed2981eefcf2941147bdfd078feab8f70f8922a7d376a424ee3b5e7aa9efa94d74791cdf6d98f3a8d45aa3c6c2e3a88429358aa3ece1cdb3c5a113c7a5486308cdcd07258dafb00ae835a7ace6f902f7ba71637d2ca5d0be8c1d6b5f3bf928eccf9ea7ce0df4b27004033a1578a3a98146a55773a438ce7e35ff638ebe6fd55c986012b84d295043fe0f3cfc3a6f80db9a2dd9440109fe09e0e29e7a63461c2ffeec7ff4de6c8eae5a9b1336ddc1fd4495015966aa47e904a03e032778fbe13cd478a901d5b2267e480741c7453e5b37b2e9ac234ccc93c0d5f5c85c266747328e61e06d14250a0fdf9e1014031e8a22782d0581ed4a5d52c487366e6bddbd6d8004d040c9d66f52787b4894c3e804ef658949bfe9838203cbd137319703fc8f16ef74958a525a586c78f438fa36e5ecdb802d64ba186503b59dbdeffd5ca2b2430f4f87c1100488e5811fa0f86c31d7b40a5ae476235ca74a6c518532c0903a1f4a8840347dfef721c4bdb3f7307aee0df66b1c895796a0a533fca1abfe289dd500b7176af94b6ff826e46770de9ae967fed5b6a059936f2f52211c11e50bba834370e7f7105715357a86254b75d5a253a92ee55fede016c9f817d8d001e78d6594cac5f6cee303aa8c8cbbf2f4320f59318b6ee78b71603465a03d9dc9e95897940482496f63777c8e4c19a9c34bc416e41f8df00ffe374504545c15c2aa0df20c78d918d0e6feeb4cdcddc1e5d851dea0fd28ca9cc8b35fa16ef0ab36e2c100d5075b505602488bec048c9baaef2d0c79862a1fe8beff0586eb2ba9796825839a877667a12cc065a6512fe8764599b7816cf024228dfa82beaf07b21520eab1fe3aa3b7aed69bc728f972572a6af4aa42bfddcab243a24045f99a6468d5395d4415b85fb08731c1bc24111fd3a82c66ec0d36541a154e22bb69e87f72a5463dfe2d9975af030162520b0528acb0bd68047a20cd30f5f0a0ad6ba2b760755234c16b44fc9e1124fe029a69008a1c76243e20ec04fa70278dc50fcc6f19323462af2f9301f49cc57fe21ee48747983c73bc8608b2906ff9bd1ade4d7c340b572be512744939f0ac6ed71af2ba26e7e41a1cca2bb253816943dbca1eef436d6035454108d62fa41e2649f24bda9fa77cf939ea63de88ac44ed14b1935d8c4122cb12713ac53e1c22a48b5c86e60c526dad177067be6ba6a6251e7c36f39dc0b4be8fce1e6f6ce884eaeb1fd75b6a2a472164d0714e1d685aac03ad264db767856511728fd519543fd3bfce2e7345f489488a155b0609df03f2d6b6d279eb590423b4d6129897bcc3e7a69b925df95816cbcf2e309ffc73736d4a0500ef1355fdfe1f17cb20ffca8dc5614dd46a079ada661e087b9e7e057b6b7843daae14dc94cd029bd0e8f79f3819338bf78bb848324071e7f0c14aedb33a47d17ec905572474456a83de1c4ba8b08d4ee62a15a19e2704bc5fd1270235286f10881f1ac596e6340376e47998c481187860a9f1c2136cb62a4ee819dd538736ff63b7707d689d847080289f13cc94db86d9146247e40d8c2718c769097d0d1ea5c2597222c49d5b5d635ae872f5ecce559cb3a95fe350080e8b15ac73224114b327cfea6206d203d3cf1fce8b38afb81a966636de92e5dac4644f8f80152784b0196457be93c3695e371789d55fbef341918ce95b17c2c32cace05da6b5fae1d2b21278411e392253870c1612617b88f79086c7f29da4d55ad678fe8aacbf9cf3cc9ef68643d901be0339085a44ce808198415a8666f2ae9de242761ffc1bb08684cf0a7346ed74bb575fc309f2ef548bb822c2f92c0672515b80faeba8472c8b0ef2b213b6da1a13180caf34fa52b6552562e53cd2da016467f059bcc9012fb640a32f72c6affbef380fe78e51cc3a630ce5c6dd188886951b198862822653346795bbc22baa9e1f961765cf21879eed082ea85834bd91cdc0f114ff061a5f292e8e95ffe33b46f9f84bd92c2442e36807bad35d17cf40b18678faf867ff63319b7259efa8f35e16a313fcef963aff8f91aae8587394c63547cc433c51fa7334a0b359e170ce13071b2bce6e9aee4d7d657f73b458b0d14f349e4d2104cf20346883b614acdd80e7f203303c61b06f910405fe7b8d51401bb325c2f5dedabb31901e3c9f7f1cf3a866d11f55a10f76459177ae751b6feebe3e2dbba6158ce43d885e62eb85ab9cb2230c6b62d78b7ebeda5612c5b35099a307db7444f1629446210ed8c9bfee46bde04842f845b707799962fa4d4ccd024e56d3024ae2ec5cc43c256b4d695de3a5186eea953d8e9b2488f9f292cf21794831d7bb2e9c4542a7b70f1eb11dc16f3e1b27b5de74b0eb5a1d249df21f6c560a60e900b92884c47863cb0af07ee640d5b6fd85e69e23d0b64f2230686c3d03dabaaab2721eb39c300c2636bbeb0c7eee01ed1aa06394e358c410c6dd5a176165182c804e87f20c7393a8d653bddf7de529b66c85c16de74cab905a013d2282c2ff801edfe01d4dc64600af587ac32c92b38b8c07f6f6f65f3e0de1a1bf1abdf42841a0a07288ecf1a13a74b2da6e71585cb7388a337effb1d87f6b81cf310b7cba9aa85434096247db94a63128f6dcb35758079136c6fda1c44a8401a6cd35b4c821104126b504ea351d10e215ee7dc8df8a300cef9e0e401fef306a815148d8b61286407f48db7e89b53b3340b5f89974f392a446a5323df58c8305887e4b9ebfd19e026cd51a69a2eac6ab15913d19e71032c7d6dc2ead3e648b302f388a104bdde9ba22384c2794bacc534469a3191fc244c1306c87368d8dee453cbf798916b84d490207cd761073f447da5dacf9e22e24c98215b49e7a5a8e9932460be451ced725b8205ea662f1b690903c67f21d6c8faff97ea2e0180e113968e3b1216042512a271437dc4f2882de49643cf149be2bc759305899968862979d4b3336461c185f9bddffb765d3a9a82eb4aae07d4549d2383a3418d288757a587afdbb7c268aa914b91337553896c944ea0a2af3e6ed483ec66bd6d74a37868bbee605cd4a678412a40fb2487d04c452f95002c12c2a0d0563334655e4acba32e61d619538652cc92b7f91c46eddfc2911a3242b77d408af90407a94896b7de3d594b57b465c194f58ff49429a9309d5229cba6184ae95cdb28cc268d173222a64f2dcb3be88d42e241ebded9f885a89d066e6eb84b6f30007d0e312949a5ce24afb08810a1a687722c58e247c6d0789bc896941ae648be9f1f8f05d116f18d4a909036e0d90a448621e99ef2a527caf4b129cdccc883fae651a6f0a9a75c2c513426425215b191297a5e27f6b95367b5fb027c27be96fee784490c640b810e41219c80551ff93978e902dfd4d1be43236e4627c57fca38420bd8a4cb4138cb509b114641a8a81d085c1da6199a5ae4b88eb14649c9d402c2d12a3242b58404b400be1f5f5f59603fce1590dc53ff6535a10eca8509eddfcd04bd3cbb556d07cb143ad3afed916852db13b51c7c38d53929da7156331100f6f18a283c61b66d70945c995077d792d858eaf74d1f9c549676a64ba956799c83777dd5ea04d1be42edb4fc1891e33384fd1a7148cd159b0b9e369dce4c3aacf020bfd5e5fb5d4ea34541220bc5eda3d2a2112f69756e6f84cbbcb7678bfa55b5bc9e77d1b5a739375b3cf01a486f3d76e31fc143e605462dcf61345635406e7f21449cf4d38e0c2018803432181286dc34fe0f3e28380529a9f6b08a9532bbcdf61aee5b9a78e9908100a6981d2132d4927e90063d1e718537bd638ab864562c8c800b426df9f68104846df033e8dcc0c2380d70450065f7a3f2bcb8c9d2e489061ba34999dcbb44bcd993082519fef9d83ee3988fe53a8a2e489069195de37095d19abc7498ac379f561273c865cc773d81e9181d49318d07003fb4a4234ab807c1a11d6174b3588c0651216aa0d4e5ae69b405160b2260630b4958c55dbdd48bea813e79c24c4b1002a0820c58b674844e22f911ce7005bf586466dd70c3544b76620d528927552fd99d94b23ba3bc86c5c03d69c2ba902df9edd76f495304891a1d161cd2f001eecc4de919ce68683894552423cfab90f112873ea3d4590b708732c62bacb10468a54bb20fb43493a6dd229bdb2829cd1a17a1e146493104599c1367bdc301e58b0267922d474fd2c471f566b28c7c37e3191b17f6c6d46ba376cb48c4daab96aa2cffd552eb7435b78dc6a710e70afed632959f5c38f5f970b1612421bdc73f57e1457db186cbfaf36d060ca7b066ebcda5db06ea550b6affdef73edadf1eeca7e1706e8010815e3163c81880cc9d4d822962d67a295f539608c50e8ee900a2781596ac2a241d9bfced15c8803c0c01839360ca82854a78eef62f6b02c2d4d668ec25ced2558ac9e098a669d4f74b389eed8c51205ea13a83a947d77314d13e2d967acd710c489ad6518ad65ef286c797b6fb056b7e804116f1c1fb604f86f01132ac24846d304ba8a192a127c2f1685e288568ee3d89af90c51b176ca7a59be4605f245029b2173876c1fe03cfa260650d2d7f55bb8320d0df0697c778ecb66572e3e6a823b236f5050239f41e04369acc03f6f97eb1fb9b32f0e72814167c109bd95cc6fe5f6d3b3cd30a83fbc2bb16976ec526e5c56a9f7c2d148feac11d4d5d144abb1fe45c6db5249329809961618f4c030fd453593e0f9aaae8c9cf7e9824f39698891c2a78179aa8777c102ce7cad13d35ee2a2ae14bc066ddf5ca6c0db7ab02d69e4bda61ab9ca750a8232e3e8b6deb936d153587101251df99f3daf26a88c1a0b373b7355400c59761375b5224cd2fb983f38cf5805e6c732f85875c33be88c1e1a335762b4a1a066cc7c98b857a6b9a810b7849bb41834e1cd0644f1ea47558b066f8cf141e5bb7abd518941420d9d47ea821f7d960552586ab13ec64c0f2b4c760fdd6eaca17959049e8868b5af29d7b30001b039f2aa3309f60af28b2649cf78e04d6802756106783049b31b962f6129a9b81f4e66985401c93ac92a0e5a3a2035e532cebfa5beb057a563b821fc4e84041551bc9520ffa326af11e2385eeb8015020d3dd76384f426defed15084455795b822cee4733c7a88a217087cf42829dba38bb6d1b1dcf7947dd4d9dd2860362041d4a35ed7f53786094886dc7814b3c7a10d4770e2531c79986006490eb5299ba99aa90530a92d6fe7eeba4f7a129d3c7ef546a08260e1e7aba282d4fe0a7285efb7f54b965ce168cc62f398cef8f638e147eb1fe329fec986102d0eb32ce414c6f78b1c13f9435d7ec72eea79ca9854d0f47f5e5c199c69a9daeb1d1ba052556233732d486a050aa047a6e9d0454f424df48957f3719fea6a77c4277a5ec8fd9aa6b6dde678a34d7dd86d42e3e82994c37b298783abf8da15eca2350c80b63ec3614801389d1e17f8480f63906ff8a4ec091f92f715e24e54d1b2df793e29dd7d5609f794ef4f897d7e1eaec50b469d02bf50246c09c077a91f4b4c16fb9cc417a9cd8e4eeddffe40095c11b0b8b3a92f87d657bad5c9e8ddfbaf11490cf0eea2ef251629551abc752217dcd20fbd3c8b88d7682f9a2b0feef04fc9798ce23596542e39872819fe0f8277073c47db9b682625b5c3ecb2cd350f82b317ee756481e0191e107a7b155fd0fd767811547ee2482f3e27767a5f3237670e61c884111052a1ae74a460ea8e9f7406fa9b9194bbb3c8e261d3cb0d87ae1ec1e6bb025efaf4df6ec027a5b6da24bd35ba3e1541a0f7cd592601a4d109cb6d32423537e632008a73b08f2e9c25d6ad282976c15e896318ac59a0923d28daf1217588854ed86882c7835e2178d8423b8499b85be95f38bf5cfbbfdac3e345880d4c14b47e808680188d72d9933c4cf5a236f0b285d6f694c51ac6a0540158828280637b60259691f3028005e9dba410701fb9af08e222240b44e80a39813410316094f437802ae9ff9e41d418c1b8f86d8c0386b17668f8bbbac866565cae278eb10bbd07e61ff88a51f0464ca113af95123b3ce90fff8951cfb429578d3eb727d2c30a919d1b7acf27a98109d81264c9e00aedff9e275d009fba6ea4a756b7aba5d90ab4b2202c801e57f48c6403e007ed5bb269ca23741f16803d23980edd92c343773e47b6de2348e2b0fa79d23c2179862ff338ff57ebf109496134d12fce1d0260b2d129d52da40f55f21b96510a5fdfee264bae0190be6fd34ccfcccb357caf04ba9897ba5a20d2aa9a0eb1f0b0566d2d5601cf9f3ff79f1720583e2c8f8662124bf063e69916b5ce71d016b5202793ccd4a68b47e7cc85308540000749d758d36d00b6d1080e2d7a982046e5cf7d1e366d5d60da505bb2bb6db9b794322519bc0b5b0ba90b40dd923fda2b250840c4a42c09b164a349b102889a14287e76a6c8a43401ba4949e267678b996ce78a26294a86d8c942465b03881d2c966ecca0bb9d3485d1c48de9c2dbe1da2d6493153dd41d2937eb99e07e4527155c0a851b41930a3e2a9a84ac0b9a96749dc735cecb296a1481a684bd9289c6048d8c972af2469342054b7bf064baa562898a15dc1c40a060c9ac99be7b2a4f34a857f144eda5ed2bdff22eaaa2a2089b82cb3e4a5394e05bca143df876150c60e0b529648fc35eda840fb3252c1cad3184c403176f5f22f1900510252b50620225414a643f82df4a707876d087332ad759cf07a6298e363c0ab4e75c82cd9aa89dd9df897e6205ba5724e2561f5b8c9ef3ce8d5a6afdba4374529f74526a9d8e364fa97f4e9d06e9ef649fe3a290f2dc588184d4b80d1c9e039a2f954fb738e76e057ace7ae2119fe7dc863662f286f30e5b6c41dccec7165ba384e47820ee18b6d848582a21247aaec5136ef2861b0095dbf94843f49c8f25143de734445207e639a729923afd9cfb92d491e1688eefc251f51485ee0c21b459383893bd39cad5c059520bc8c9a1b3721874472b64c8a94f6f694a0817f1d9618721a1bc610fe58df5504384801635845d288f3ddfa186dcbb004fc58013f5a87f60832008822c6d0b450db1a2957c3ab554e744296ee07b2a733a38c9f97d3e33847b1dc7d99bd7716847699a456d58cda2a816f796d0678b3a2a54cdd6add1e1563f39f7853370a770c513b533071074a9ff927b61548ed3ae1c20d2f6940ba95b7943290585561c77fbc53c30a96c70a80389f2d4a5d1d3b1c75318d7cd5a7b0a0ad1aa51bbba163cf52a025a133f562adf11fd589586d420c4861076296ea5f665903755488ee7f8642341f5cf4e708254526e3a69d7926afa0a3a3be956f54a3f75e54df5b14e13dcd183f2d551ee41f18ada057a752f4abb3ecebde9abd3eaf40a17d121cfab53a27659af4ea1b4ab739c5bd152114e11abe6b4d453910e89455cea4c6514e82b0dfa8a866c55af59beeaf4f0d56f38872059d553e10c8264556fa9aee21ff3c629cc3150e14caa0e56ffc259a559d5695dd4518aa6cafaadcce4432cafba0db989b1348bc9a659b59b6335abba337d759755f740f688f07116b51c78ca51087c907c88bd4492317dbf449201415685529513744e14286f98a538723f03d883295d4adc769e05013d77cb9e3695cbce602c711ce7c5650e75801eefa9b82242fd472aae888c948a3380dff354521619cd1c002c3064dc3b3b0552a727ed44d099b2b3145741bac10099f96748e50d3768821294a20ed033d61f574474ac881c992292f933806f6708260a5edc9132d8f4a9b3d4a9fdab9590ae279250d291a758be1e3ef4f0c1d2396ba6b83c5d822e3bab6688cbd58334a57409b0668a39e7945d4c950bb5a1387b38404fe5953d421f09f7ab22d655f85929a59f9cd5f3449e24302bce2e6a15a96d166bb6a8733ed28f4efa53047db6a4f770025229ab78e4feb8a21ebe94f2e107e905c81be9349436737613e193f255e9a5dee24db1a0c5651c1d2c9b66499fde2ce949baa77b62a1e374e972ba54c01465900218018569170555dc3072a499dd50661075808109225d061a707e2c3203ce0a2f6538aaf0b2c74bc93544c2fd9c775c59162a6a67f653a7744e59a4f315be9ffaac4f9bfaf81c579d210b4fc3713aa5655cebdd89697c2979d3a9027c15e5b659d27b98e915ebd1130deb7b34b4f993f57e40c398b79e5865ab7ad5400cfd8f84f95f09fd9f09a0174a58cb84d92c59ac162a527953bd76cc226d82e5d3b9f4be095a13fe9b25fc4749789bf7420e05322e03e0bf4efccf86ff79a711fefb6afe0373fc87a2f9af2535f3dfc5f19f8beabf171b32ffc174a10e34d80ec4b08c8dff6ebcfca772f90fc7fd6f26f5df8a06f55f0ef0bf9aefbf1140fb7968ff13bbff00c0fd6753ff23a104d086126602d8ffb558ac962972b5c57ea2bc74d44ba49f273f27b84838c490624d2f916237e94a2f9162472f9d7b8914bbe24f2f91622fa8434688b845c4b5d391ac143cc106c5129f98d8e03abf9932ee78818ed01f6f4cfe49a84f4137d628215f1033ee780a623f059d8498d854b6a4f95ab9c0237e49432fa7e880c9f35f990de8ded4ad5d724a0e62df9eb2d2ae3953b724ee5d4269ca365fa7d96cb507a592886a41f8f6d451bb02f0ed21d3eddcfa780aa2af7b7f96b8ea0924aba9734d48579d35ab9d3a47945a82521f321f41f8007a095d95ba35ab845b54fbf114e5443bd59a053796baf1b3fbc82967cbf301f4239206bd513b608bd7706c098328ddea9f7be3079a9ea25ca268cfd370862a7bd489e84fee85230d7ffa79f6ef939d824e3329c794946f61fa14edbb4508b63f41d6134871bcf9f625be478ef9b878cabf5478639ce7793540443f29db89c9cce714f431579aa2d2ae8e09176fbfd75f78f19b7a118b9efd857b43caef4774830dff662b175efcfa8b5f9733e562435cb9e0e22977f1948fa7a0d3900d678084d9b0e14d6c881768b69a7ff0f37cc9beb1efe51b0a53b714530e22268aee29ca89369e8268a5b19bac5d63aa768388ee0502ef12267ebc42361cbfd9b3a76e29a6540de7afa73c15aab853d029a85f269c664eda254f4646a7a3ef53d0f7e9e809a51f4f51c613ed543bd9be9dab74fcd8a79d6572e425e367bbe2ca45bc21e9d9af084b89ab1752377cb6d9624f891fed12ad78d083d17c39e5f6d30393670b20f1f0040f27e8ee25120f4293879f9797483b1081da00a3b6247131e876a8c222ed1085b7031327ee25d20e4b7c3b240122ed008442f2c182e423860e2e172e545cb1364027605080e46304924f0f374035542721e0f06e33322f9174e862a5c314cf21920e2bc8a18350cdd11ab69897483af430022a0d4fbd44ca810c31a6060000b7b0c1f112298726542f91720841094839fc98605f22e5e0f3ec9d10394c8ec59534f8c1f29f5cd956549a15a671a78faa5ab3648e384f6a1846a100c5ad8eb3e3e64a3b6ecd6a195bcc4b47418a3b6b3a5b13b2703a108528ee748b7229ee17b33365dc2044a09e27f368dcd1937ce9dbe9e71f6aa7b24f54156d747c206a07c65708a881b3bc0df75d1c85c3c5651cf495834e6ff88c735ebf180fd2b3863031de282197551f96af8989d0062704c2d271c369eddae1aa44dc91feac72b6a452d75e171eb716794c1b343034df42f00096dc71c70d86479033cdd7d7245d3bc8903790ae1db766b5d7f9ca01c67690d1b4e3c689636de2a938d65a259237341750a8e5850a62fcf421849fed63bd818489711819991b39dcb881daa98e03b5e339825c99b4284abb5649cd725bb3a8ec70c7afc957b6fae50043236e4dcdc73b4430945d11b523532b6a5647a1d5788d8fe0352e6134a1d3388dc8b37a81c673780ef18655159bb8d3485828f6c0ea374208c6400fbfa60673842e44b3458463ab1638f6557429eaaf51e256e7719bade67173168bc7cd431e4ccd42fb083c9a7ac478dc5a67dc1d37149adc91845b0ea711c1188dd7885fd38e5b4d6dfa11e69bfee542d4ad76a1b9147912e85323ded86ef51a722cc56212d5028ea73ef6ecd45042a35aa8fd3d44c01f799e8a2b1752b01a3ffdc8dfa446e4f1006c07d36c354a015e0772a89d1a988c223c12eafc1caa85160b762805d41f6f78ce3f0fb42805f48f1d78ea5ecf5311f45043bcd3773a9d4e1fd73226798e08f76392df61a559206a88cb0a3b82b04a5ad976a0b1b2edc8b2b23511499dd395a9f1e8b10690cb0fe52cd08fde836381e31a9fa0974c6db6642e4b9e631b1678dc503b3cac34abdd85887dc68c9be367cab82e505ca2b818cd947147f0c7952d478d1f990b5050514e4e8e0f283e5043e8bb10c99bf61d396e163b7618c1e3b6b2edb89d7830b5eb84df71e37165655bb251af3247cdea55154ae323a3d4ac4a65a834ab65929a15448dda8ca74cedd3a132351e4d3c9878dca608c69ad51ec48ceb52e4f3faf99a98ee88f3399cc6c76fb6b2ad92bea69a99322ef51933ee077e90a62b7f0049dcd19364a8c8d496ea4da726e92cdda64f2c265bbafdf8f12387cff9354da09f0efefca414fc59f2354dda57237eb4d99a353e828f20f2c8d91abfa69f5e23f6c0a8387eb59f9e23046353e640503bb53ef1a466f992a32029004384e4b843f2260001f65e95ca9dc5c2c1e99c6f2579237de502093c49180b2f5e007be26e8293e03d309b70e5828db39c25f29420d2e0f28f766667583ebde5322e4ff0187fa1e0302edddae64b874bb74956a95f372edd5669d78b4bb7b7f9dae1d2c5a5db2bfd4ac1a55b2cedba2edd8bcd178e4bf764de4fbf5470e9de9276b5b8742f68be5670e9decc63d22f1e2edd73e211cd570f97ee157951fac5824bf78cbc9a67f3a8f4ebe5d23da576590f0120860000404813e38e012086d2bb8a0c4371d5027fe843f843e91e7a288e2eae88cc5126c67b1ec67bde86f7fc4bec47687542eb23cc09656c0471b435e278a55d89e39d1147150e717416cecb84154bb362424e16724b426ed62ce92f21e7a459d25d42ae28e48c42ce16724a21770bb92b61173b859d17764161c7a459d25f6127d42de9aeb0039a2de92c849d4fb7a4f708b9a6d992ce23e4ac744bfa0a21b7a442c851e996749c90abcd96f414422e4ab7a4ef0839a2d9927e13724cba255d47c805cd96741442eea75bd24f08b9b05ee9967456586fb325a78f76f6d25269d7d84b6f67fde241148bc57070d22f9f2a7be9164abb8afae593a20101ca4bb7346b24ddd6da75d42e79f403a6976e6d36a95f1326ddb373a967ed5ab1ac59524a6f57b7c44b6fa6765d6957f704cbe424226a96749aa03bda9e9f52ba9dd958d968835e3adb9909218f8d2031966cb02437d2a80246829710f28035180f0f15f664c52e9f04f1c98ac57aab569ad52dbdf4e6a10367b162205ee22c346326edce4eda05a55f122699a6c212069a61650aeb2dac569a259d870fd77fb4b397d22d91745b24ddcee6d08d259b6605f149f768c055ec154dc59c2f9194ec80d24ec2461435e093365e3800132cd9c428b77dfec75fd0b66072616e835e38002d884882d9f06b827d62948b1a3279cebab4d455be5d76cfca33f014e10269e58182623218c429ae18457cc165d490c9a114c048208089f0113f2611e339141146e239ef5008609f3570961a384b92af5e032794d060365c8500c6853270c7b158bfe40e6c5cb50862c2434cc45cd52193ba22a038f1a3a4f2b12420d74a45a3020a8ac9aab812c27df52aba0d8f243c2613572db08b37465c765b4b13df2a9c33e1d25de187a525f0eb51e5caa327464f8c4ede67a3c675273894b823d398496b882b8f9c14fd74db9170c5d010576fc6b8f2e8c9cf931f4ac6a52e8f9c30fd7494d3e9d2579f4bd84c010e500b8bc0608ba9208c0cee8c339398a2cb932409b60ac39533ca013c045bcdd74a5c5167d88cc8c3b0199f0955f3fe5c9610112ef59199f053f99f0c282353652a088220f8e1f4c091ec24c504bf937ecd783b177d0ce555322ad50d99be4d5dab6ec8342d7d83f1ed174bcbc8c8c88c48b805d0813ce8f2290e521098dc7e7a60010ef206409401032d7c482376052440b36c49b4dab3ed0b79a8594ea8cbead2002528d78b4f717cf1396d0b659acca7bc59ea5c87b161c36128c501c625bb4aa57215fbe4c9939d3ffef863ff18649041b07265675a930c93cc4d46e6c68d1bb48e795185a34bb9f4238f3cf26ce947a6c18833340e6f836dd8105fc20ef0342ba88c3bb2cfc8414640ccdeb5783b07499d21f2f98756bc0294e95f480392197e9e77c86eca53620c237be74e85985ae2c4e10c8dc39fc2b17178b6f6de3943e3f01fe8331cad4f2c89a622987eb8713a2ce540535223c24645908483fbc01a82b9fb6ae0f9d3e9e421a97ff2503e3b69d65019d79fc98e1e6e0c566e0d5768d2d3840438b0810850b04609964820044c5c590ac20c8638818c01102fb5cb0a12bc8444d183444b55fcc84943cd44273369d7500ced5a19a1802d8956b372d957a184cd8412a66a1594fcb237b79892e28e94b2f5da619123d4bd3a5b9b163d8ba422740214d8a0a90a170c414889357c92d8210536d0e2b3d96ec0d8041288fc3c36e7b6ab7f54f211ea421595e611faa3b4b1ec9622a3fd51da8ab80043bb58cc91556c9ac51d8e2ccf47b72ea7ca7a4d5939cd92dec3e78b36dba7f747a72b604121a0a48c2742a0240c2b4c4029c20a7eb81d3103202b174805ec9f6490ad348b995c76f93d3f4ad740cf374761669e4bf366639f494c1dc43f658d160588090b17fcc84253d4c0e1471e3ac222e84786c2453f696c549bd987f4f38fea2cebe3a7cfd1a2e0833b32104399aaa31ee2c8d2d1b0e946e6f4186808228fae70f2f2e88a297e3a015cdec64f2fc064a6729374d919887f54ef17fb3011fc82716bfae9f4f23233238a279c2069413885397dc642eda23e819e82764e16a5cd1212df11e9eda18dc55e86aba719dd24dd768ef10f9a51bf90c823f6d3e9e5656646144f3881711807878611046ad7a438cc62db17b4564ad33db83c71980892564ea4e92aca6e8d9686a600a27422f24705640aedd3e58f34536a3fd250a680bc6977a571e7d1335f7b8511480419ad1124248b1a8e35ba19317172707ae4684113a245ed1a515952a3194929424890901a13c8195d9a9753b0b0c086e36cbf5e4ec1b245930d0375c30546b3d016c10a2c576c3da44e1b0151bde42b5b278e1512b9278feb6c273b9690fe4edeb4b3e0c4651fbb97ac5aa7d34bc34f9f20929fb47680290f6511f41af7c80a2b3f761063e986b822b4867cf16d3216a9c3de8cc6cf0edffedde66c46e3db3f21d3a588e38c4bbdb2d84143b8541c9174f755491b13e2556fbda3cc313ccff06c257731587e4fc480ea5994a173e698c5917d9c41f59e739e385a6bad373a11d58f453c1103aa1f63782acac0eef918c37be20c2ad0db31026d1f559e739c2855b26fd660430d32cb4b97547e48f7229ff048daf9670bf5bb45fb4cc327bb99c526d24f4d272c39dc4ee5cdf495d2ad3ed299ffe25620b073fe1b5503bfe735fc3e47ead4e93ee4ab8a215bd359ac30c4e1e27190bc996e0308b77dac5b481d1beed7f847f5e9758ad439ea17e873ce4ae5a7abe60b146bad265eefbcd66a35d5f472e6abdeeaadde6e95e9a74b7913ae8a9c722609cfdc1f9d5d7b3b38cb19246682aef41134c027bf94e79d3c3f799f943afc7521ac0b6d4fd44e0d9ce5bb29694b9de069a5740489af8a4cef812581754ec386d9d006fb5dd88921c33ad1c2aad864e5c284519f302af224814db1a74bd23dadc8a46be4d2d8b4e04e8761beacbd37c9936412eb8bc028b9238d7d0983bc19e2b2772f25772d630f0cecb7ab7cd2667cb1bde7dfc46996c79a2dcf69e8b3e57d2ba5dbf9c73368be6e609ecf99ece9a47d9c50a2bce73345dc2ad42e947ba07b3e99b4eb73cf49bb4eeef924923af23d8771e28ed25664bea464cf6998afe99eb5f7769e37ddc56fa07efd86e92ecece0569cfa5f30c92375e8bdf709dfa0d2e3e9da9bb70fdc5a9b7882eb8d8f0c9b6667954dee379e2c28bdb10795ec43b5b9e7b4f5c78e17902fa8bf8e4b4d42ccf41efc2fa12d5022b35cbf313ea25ea34839ae535d37b1ef37cca3c6f26cfbbc9732e4485e017b2986790d2055fde50c25c42099b45b3e5f90d574af7e4fcb3f67dd0f4dcda7b552a77d60c7a8f8be6db00c2ad2e6d3c518617dbc908a5db399c0fd96a02b4c762b12730ce83b4abfa91a4c2398c1397f3ca39ce7c4df738ce47d67339f286a3e2aa7309ebc42673a574fb2508b7a698be4a27372b9db3e76cc9296be9a49c19dc934e4b6b4f59294739dac9abea2aa54b7cd3b2a4b49bb3ab9474ce39e7b474ce39e7eccead7c714ec520b3259db356ce39e714294dfaf8f45e27b99f21ad9ccefb78b9bea3dd7e7aafa3dc77684f56367b4450caf381dc92a2f44ae6b88a83d3230785c3f3a1bc3450ea469ce3ea1057873c1411fa1e191ff7a495f3c09377929fbdac0a820fec644b6d49d1d4ad41e6cbba6c97afcb72d93838383d725038382a481665a1859fa16c51ef401411aac25305dce7fc9e5c5c503bd55fc091a6734927e75d930b13aa28a59e16358cdbbd3caaa20aa46b5f1e5521c507c5055f1e55c1021754c1e45e6bc10b230225282d665a0ca56e1543f8006251d452050f3f7cb5194a0a16252759b7e45b0f768a5bdc597b044eafcda1d6fab55d510349e79cf40b07874be26c1d5027fbcec9b7774cae7c940ecab777b376d574419dcfb777b11260c9c12d714735317e8cbeddc9b4cd9a2cd6b4e89b367d5326a2a1afb7bac4cdb820ce6756a3fab344850a4da66f9f55661137c4011581fbf9a661aa4a494c3ed6a3ef995af4ed7506060e558d7d5bb98561821b3e52255bbb646adf3e522861b4d3a076c18c1408cbb7cf26267c9c56be7d2eb5ebc567d2a47db1868b8f138ad20fdf36394f0091b67f40956f1a5af07d45b684856661dcf8919d7c3ba91d35956f4e62c2553e1fb079a046aa9ba8a85da836b24dd15498fa4a63910d7dfb387f7e851fe79535d93483292668da41e90627e802f62384ada93603201df45027c971027d8f0a9238030c28b418a3960556e334a89d1a9ac357a89d1c545a4e8ac59ec667503b34145c5159395ddd72f8d5ea46c4afc270c1af1c076a67e51ed1cfb80ab53383a3e971f80dd40e0e95cba0765437a8f81b1e83dab951d36882c9c8380c6a47e68a1f0306101fe336503b313030187f41edc05c2cdec61750bc0d7741edd8b02f7e513b2f38dd72b1810b172e2e24bc8b8b5f1f9cf12eaeaa82f42eee5f08bd8b4b19bc8ba7503b2eac1d4bee28b1b89706f706e002f9b1c75f974afe3a6d978fbf77c98abf5e04fdf542087f8f7ac082bf3ec0e1afb7a0766e4eca51a89d548bcb167c8b83a89d16947fa81d9405611e1c691e74daae9b07c11dace04157f140870775508407fd84da019dfee7a753167fda39dd9a2a66ef7987daf128b53a58f256cadb5b513b9d52d053cf01197cc4cf49bb2bfa1aaea181e7e0a870708a7c98b9740926a2c4a04e72c78f344f9d52b74e3cf59b832970a0b443fd061183303f7ea4b1d1d123a9881c4944375072031c90e0dbbf9c2c35b51f75d020043938a2c1951a1071540320d860ca370e13321c0c148bc57ca09452974775f0230ccd833fdae8c081ac41007e944634198cf1edaa2eb2f8769fc1ecdb593370f2ed3954a828c940055dbb4209941a6c01c60e52469083e88927b448220d2564a8e405a3a8e9f610e28e2e039f123a5577510f74f2093fc23ce5f194fac581ad491a36e0020a8dad553268dc91ba0d4c0c90beb9e042e85b65801b1223b035894959e28812475c2102880ba618ac5994ad700289ee6ea9d3473180c1534b290b822ae59fe04a070a476a7cbbcaf6ed8e4486eddb250e4c199ffcc0656f95ac4c8e6adf055042a68410d7780bf812a89f1ae9ef10e6de7e9e1c63c078927031d8f5242ac09ea09c874e61410d6eb02430473b803d697724dcd7d8388e6327a1f5c47efa749e47f94c350a154a9844a18c748b7da9fe6783194fc162413b81548b73ff004243b3d8a768648618422c965a88d641940ab0a4a221800b682a20fc43023205f609c81be66eefa779760ab48b3d15caa316287d0ced72ff8fc1499baf6062662766283133731b69177b100a4cc19ad387cc9f2821fc3d9a85d32c66d903a40e09cfce321fd83bf9178487903f1ec00c45ea8c5cc4b784ec2806e21f19c7e40dbf78493f807f300eec44263113697b1de40dff27a4ca1ba681bd03ec4662105f706932694091f2c60647e56a77d7e6222662286c9b2d9ac553a649b642beacbff094a7e2a4cd1675eacddd9304a0a269ebc9362baa95052795698bf2e3ac629999278d326a487d8e226fa88b34b8cd3463b59acd96943459dce2b2e3a03e6df3b500d9a24e5b9c494ffdabab5adb8688526aa5a9e929a594ce504abdf69c3419d0a4b56b751f867d28c79ef2929b44ab519f73ce22f3e5943abb8a663281617c3c69ed2c75aea2fcba962cee031c5318538ec254aa2954f7ba4c8562cb09bf420250e10b38234640b6aa9f4e44ee1379f9596154e4e24ee77ae58fd09f35512e6a67825fedd0f824c78923128ee3388eab5cd36e66912709ac26e16e223a9de9d2b6fc90a2b5f7aa544e6752ae3caf63ea5738b33e16c80a11c18893592656f6bce439e899879eddab9393b56bf49a80da15d4aef1e4f33edccf13324ee899e98ad8c3aded9adf577d7c0ee83374819e9d135667b2b17bd1d86c55f983fe48396d36896f93c97ff8870e8eb5f8f38cd33af84777a28ee79367c38ea98f54918b3b764c74a85b4c4b204f206f78564104a00e4bbf28d06ca16186fc41853805a6765de99a96dab542397f3d859e9f1c155e3a9b2d8e8ab752e95757a444ab52b362bbf2dc25b17b430f86de9257a559ddd26c7167a58a9c387312472bebc2aea9bb226f3a2cddb2a2d75979066a21fec1f9700aecdc5c399f672a94fa19a6beb95addd66abdbbd231713e2d22162bfc638a9d193205761f34e40dfbc8f120764c5b5ccfc7934fd3b39f7cda253bfd784dedc2d2ae239d23b1a718d31c4172555812f3420e089902bb0d39a090fbe19670419c50b338213859b3788526aeb3db9895754c5dd3e9c6111ffb578015d092246576427465b674615e702990460c3e8c481d1b462420a518529490f1fc35536e170145f1526a944ab79416202bdda464eb66a0a96a6aa2b3900ed16894679a486794ce26ed59088e9f744667740929e9ac9d0e499d2e92375152229dd15913a944462d40a4820757e6f43175ab461c6ac8e7f3a5381ef93ec2cf40f3957220e940b439345f29d148f751ea471e62252c4052cc39a7d4e9170f4d289ec643f3454bb0042582e2d91b2504c7b74867f2865dac420da59f6217358b3de512f50285a53a8cf98e42722d5207e5ec7dd42f3ab32707dd480a355f1d4557514d254a44e5d93b514a299f28e58eb5d6aea37655a319561acc4b548b358a91f9eaa2ae89b46b4402ec6c44eaac7458b9239de1f8fbcd4db17b552a77d6d746c8a533a018b9de84e35b6ca29a2ceec8b416e794b3b352bffaa85bf39512bb688aa34a1c6f0f1d3a88ae55dd1651a4e28e4094465035fab1a32c1d9d51063731db19bb317879840653d14c1ea971f4dcdf519ebdbb66cae5b8a276a4caa5013f444d4c673ce3389e4c9a25b53083e965f8f2144544fa48a51667e4f032accf280448d690cdcba334869e51280548ef161fd02cf61a86f4b713a1dfedb24318e40d3ba594555087508536ad543450544444fd92621419b54bcaa3294bf8979e6fcf2e67cfda3532ed87dac52b960ecaa48be2479045ab111535cd574bc320755a5c09e1dc864712dec55db5f3113ff2113f7d9512795868066b11613d709a4544ab1109cd60ec41dac5473c6f01e5a5adda7808e1b3fda29667d8e36d288fa630f9ea759ded746a5eeac09158c0d0220a18e860c8033a4aa45d77332a4c428fb8c1500e86497298c104067a906631019ac50ee40342443f4cc1848a2647c098032418ea410553a668620918337b8d15770442009c2646fb643a183ee9fcb361ce27830148ce1066418058b1484d15362c1dedea2923826b5d2689eba9429a5311a68f4058456e9e73115dd18fe07b27ffc2cebd93b86a61bee743e67beed95015bbd3e57f4fbc3c3a22fafed17f0402839132849e9f1d880bcc323edce9591fd26f1130550790a8163ca2b722b30e34ae8cd175184a781b4a1a17b4b7e298e4adcf39e79c6ebb2566e28bef4456b3d88688570c16da4bc2d8e9f41b87a1c50a07d2acae11bae395f5b832a9c38ec330489dfa752584eb6fa78053b73a42989b8491183e697bf1132218e4cf6fe71142510f1f7a74f4236df226afc8a6d8947c34ea18af6ca5a269560e1b89a1080c0768d7ca6d8cc4500406a903a793c1d24b9731ba3712dcc6a57f9452fe611342acde40696b2fadeda54d7ae9947b1231c588dab5b2d58a84e247f02b163b3323a275912b4abb5ab44c8824936649918b7b032218dc6024780fec7a4d9a2de9d683f48fb0d650f2e4724279d0bfa176d12174c60677fa0ca687cbceb59670ac4b2f1d158ef5080d8fd01f12db89d84335585c96f7248e57e589edb2b24a1366c8beaf41464d917dc86835188d0f301bef819970040e110efde1b2ebab678e98a0b46727131b4f76d168eda241586242e5a5cbd1b2357ae9d966d2ae713a79e97205c303ba226452d36f1f42bf390b138cb846664bba0d1177d5fec37b60ab16570ed0711fee428eff10799eb4e7788b2ee8b80ff721f2e8780f6cc987fff0b163b37691f0d2adec588c65612cca04ddd96c49b7012cf3b28a27641006a770a04073c987443501aa8904a1a06812c98322098a2fb80a28cce8bc18cff8803a01b5445c5469f60aa48e0a97032fc6281282b44ae40b114ca893289c60298c5050a0381dbdd480edad638a020d49636c7da86cd992ce895554c5bc94c10c963c8be3fddbcb2aa430e247ff8e5508820090621004e3b1518c8660497c28018410409d1558b104d3220b1741302e8a74b8c1b0c4e08c2558873850609ddcc1113cb8c13aa4f121059f942e4a67ff6879849f4ae9b3a5944e45ca3c7bb096ebb84ae7b4e14cdb4958e79d8475a15fd6b7e7d65ff06ce793569f4ece16e75205f74a67c7b36b77f7cea50e4efde193364faa4bffbe1a3ee9bc864788d0efba9025ab82a0fe3c72f2ea1f47c4fbc9b2c579e51ab5b35a00e89fbfe02f9c3e8c5b836cf25cdebe07d6036bb7a7d0e7e437f4f95cced603e1d6209b1ec9942a74f30b25ec14da70a25ae0f1b6a59413d5e28936f4a92dc771734ecb71f3642dd755af539e4c7fc23ed932e57c56e7421f4e85f62961954e2adad033cb9c9653686f94b5764e3b7520ca233e395f4fe84743fe279cd3f0c8c78544ead3d005962d8f03deb7c3207b5243cecb8064fe74d6f7c0ac531491cec591abdbd0c73a0f4f6ac879245305aea74349c331c9886ac146d79629dad0dff9cc92a5a3b47b427b9a0e4169486560a73f82dd0c7d4e521b5a03f3d95be8ef5644e6773ebf73ce2702384e61649681bdabe2103fc24f19cb5319aab338d66f7188d409d168018bf4ebe9f38f58a9431b011ca7d0f4a3201fe11f394eead01ff29b2915abbc69afb55d934e2ab264d5dace36b44ca136536a4353dad350502a44459f22c29a2805f0c8fa3324422d8b473ac911a1dff927398a2ba9100dfdf41b26aa85ea53a4cca184f44cef50be9ded9c28a902aa4f47c0c81d4f1c6495a75fadb82a18fed1b19f16f54501267d40bf80746b3aab5b4c439c664d2041d806a72888055924e1822eaea896b8a3cd4ff9853c4de36c51851faa28510ce8207386297b18fec1ff5f7cd2e653b5cbb905e1b35f15123fb6162da039fa9635544f69c3a838ce30653f6b70e5d7265205202ebf2c6c2eb1a045c62465cfa21cef8bf3e0b0272e3ee27c4c4ce7323eaa3ec63f86f5313a3e06c6677cccf918496b8939fa989898182b8fe3468c4bfe91f218717459f94bd864756bb2729aa6679f59c1303d4b988d2acffe727b76172b77291544d1b3b7c49e1de5f3ec60d0b37f42cf7e9a3dbbc764e8d971c884b8e1356c526b72c355611049cf2ec39ded654209e36a4741d09ebd659fa4eb89692e069fe41ffc83e573884482d823616e011c4ad8a40e1b22ebaa487b0f2c090cf64db0869c68e50deca373d2d9c28956c2a8d864fa84cd9e49ba1b053c38725082192c092705f183046c7a873cdd0e60496056009b229308b034c1b62841900cc6c3570c61060c6049629ec064b33082ecc410c6a0c13a5c553182713a1bb290048c474a51c389125892ef0651c06cb3f06ebd1379748e502308968453c304b04e0a11866ab0245d0dce8075a26c167a602b172c0b49c0ac68c5d50b9d7bded9d50bb6734fb49ea46259c35efb206a87a3576e15693a950d67175a912767c91342b0249d14b0ce7b60cd6a16a67b9d22d8839b8e2b450ff35dbb82f1c92124256cede291f5c1a884516e211f8c0be56c75e0dbb977a60c48e6afa648a45d039f0c8d647e8b2b22dea20df36590cd923839b776b2a351a96c5bcf9eacb5765a18ef5e0fa4e049ea506fce3b799ee78122b537fd4f4fa75927451199222dc1c9632b032a69542aae61eef591ce7f9dbcbbd5e0b4943a379f7e953ad2ab92ce9652b2d7c3c82fdbf648fabd6ffbf46f7a336cf68f63b17fb66493171ac6a29cadf6e25b29f1ee6e969205194813a8eeb4b32574db3b1858df8939dd6acfc9c949e24497d09c3ddb324d27509245106c50de345869f8a53ccff321b2869d0c4723d6b9e93535f9258a6df0cd2ad39bdef4e6c9e769ce53cf13cac7fba7132af47a69fae9743a8d343fbd0045fa4503e87382e275024c7082d46bade2e7ec39ed3cb7968a2050bd22e8819eaa747047d5d34061980e8a2390a43bde977d7bd0de1bf652bf823aa791edc2abe5255bc44b0095f4500690cf89e07b3d3bd07bde32178e3e72de8527ff3c48f7fca96ddf7990693b09d4c52673489ef32f65802f253df7fc74623eb1683d4983e63c9d4e3e4486dc29b461e7941ec12950e7c2b1959e36aa793e2133fa1194e2adac05cf7e816fd29e7378cb56056121d0c9cb88d2284789a588ac49dae3348e9e69c931e268659e6d88a3eaf9451cfdd9451c59cf37258e393d6be19a7655cefa5c8a4b333667f3e5a2ad228d18fa4a1ced8c385ec7218aae0a672eaaa4f352cfa4df10472b8e37461c55d261c4d16d8823eb451c715caef494385bc4594dd834fe79e9a038e6f88c38585857dc8aa3aa6b5a4d75e5cc1172d36c49544f1a4d83b3a08ff3393b9fdcaa76d1cc4e1ce90ccdb5767d4a89007183643606ca745ba2485de55cb670584d0401c9624544433c4bb2d568f2559d631a2eacc9d9d3cd459f7cd938fcf41936c3be992b57baecbe507655cddd1305a203d4826c966a30f831e7698badca8fd2a8369354a452d3b02c70e551164a3f9d8a2312fa7532285a2bf3823bead061d3604c135a66edbd23d39666cc331396507fbbb345fed1849f53ca9453024d2a9fb481d1e2b6ab6fca7e608b901180b1f47dc3afa82153861863e9142269b0599ea7c2d15b2cdf68419a6f53769bcd21293e889283a774064e868a8882868664440c54d4358e0d2db58c16d404c4746b4a62baddf85603b205258d3da3599beac4b75bbbdaaf53e71b4a295750f9c254d8e21f056f88029da2860c6104607871274a8810037043d8a10a18dffe41662a1c99360486a30c4f2192f644292b118a3f293eb6c22806394c390a41d87405165c6451cb814970fbe5d11a3e9c452d070120c57e62b12c66bc952299dd91b403075618c54009e88ef46733c126f8388b5a0e3b6e00341365b22865a1f2f2288bd18ff4b3c0e0b99747598a5e8b2dba60fe2173f2124926241b42f6d34396670727f07113179481aa0633f0c9ea02360be63b8232460bd2cf0fd20f6820fde0031b4cf9810aa41fa020fdc004e90724907ef0415272e5680d19d2cfede5142f925efef4e0655e22fd1cc5b8b86c6b6a77c539fbc8ec3c7e82a6d3e4cc17ab5b2b3431e784992c9bf3e7688da0771962bc2f7b90bd44e2a1e9a5df78c8c173043e6953b9ce7aa70f44b5a4ae0b3b8cc388e38bb3b82202e3ec2c8e361cc6639c07f462c6884fda25b530a14b78433642b19f3cdb711cc5a5271adf8a572c828e12794011e529e7f944d05bbc07f6f9f51e9864b2b33583e5d2349a6012f664ecf1956b0969e0d8fc5afc890ba827ab057c0efa93aefbc41cd6e7a3ea1347d6d7451040a0c560125680d9a2ae23bb9daf3c97309e2772b64ee2ca138bf8d0305b54882c5960a0c8f3891c9b2d1d145c0993556012d6a3c407b5a51a173315962431e7035315ea2ca34e03f50e28c142d281322ecf382bbeafe605352f98f4c5d59bb2b325bd86d37954fd9c5f3384edeed6690780bc912c6f6c144b1cc74d8e72955bd55afb25cf49a728847fcef95f0d226fda69a5d5b39fe385416ccfeab35269d9aa58f3053a4e90db5f18e45a00481df6d5db7839654b1d2a049574f9e5b36f07710bebc4d172a2e46ea16290ae05fa53e4a48e1764896bd4093a5bab156557abcfc9d54a75d8d89871696c542450b528c005c4515bd44f2175e1d93329d8ac5b73c4ad36055ec775371a3f68d2831fccec123f08c2c1f98192205a5a6aad38e99684d22d6b254ab7e48f770c2b44b059dc96974756c8e83a8f03c28a0e829059e9e287242b4641dcac3c116465760491151f9010e2031b19690821048c2232c210e2c58d8c192c899131c5114464b04008213da8916144088454591a238d248ac6581281902f646324755d87746dbc3c12630d31d0f0acdc1c2f8fc4c04197c65dbd3c12838acf8b9b7a792406918e9753ac8cc1716af6491b9ca9f2a99ab2ade470323333b3b5ac21b822d53f0b82ffc56526aed5a60da90aa894add4954d2c15a21101000000009314002028140e878442a1502c1e0983a67b14000d849e487e56190b942488510a194300018000200400460006464c1300888517a3e66db21ec41b12d1b522b31ccc48973e666ae4411df104f1540d4a45ddd62aadaaad099a605449556d95a32af669d2512d70a04ac7de8ecd48275668daf4ea404931aab268587520bed8cbba162b292f95ad772c633d495951b4b54755ecc91cacb84f938e6a08a76a8aa76a532ecab610b5c140946bb75273d24b7c231d18e5647e94c281aae228798fa8642d187628a23e2ddfaa698f1436b6ca4d4ae9d88c7b2ab9011c9ab7c746d2842165a564eb0ecb784f88836a9a9252a9523bae514fe0b08c7e823e60a605cb0d723304880e2f1aecfb409402b8763d793349f5187ddbf390151054b17f57a647baf31003f89e9720bcc8a162fcc53ca44c0bb8b050fccc9dc0ef666fe11ed00f2a051200deb32994f73bbe9455380dad85af97d3e09f00fbd6aee9e3d0ea0848684c99ab71a7598513f395dfbe2f73b288d0362f4855579eb965e710b86cb744be0a1e88d631de9c78d92521907c2739bc3cc9b0d197707e2cdd6c68953579590a816825230ad587f7158243e14db61d4ff132cac32476e734b78621c6862dbf8b0c2262ab718766c4e23ec9f1293c520069d9576226bb92b24500c3e8ac6582b445caa26139df6998286d102c2a7264357dc5df9130c3d0d982780b2cb89de192be91c5df18c65bd39d0e6c8af160fb000eb2e7371289cf161f864ea8977037058063acbfa2f624f641ac7cd5e599203660a449a3d0358fc21526a768a31402bb384dc51090ccdfc77db5bac80902d68a7d8f05414c207a027d5b1ff0dcd4a57e4550c3617c9996b5639a3ab414ea0c0910054a6e6373a7b77afb9745921dcd784790401ff8c841be48a58b136bb2a41c6956b40a258b6628cd8c30bc701ed45baf74267e7e515ca5d67b28e7604d147da84b7dafe3976f06065f98b242cc6a29a53836b4e763753b6783269ffbe9dcbee847b36a009b02a676990dcf93876a4c99cfebba9f6c71598810f1a648cbc483c48c442dc4d6427b8c6d112a831a9ac1bb90f1d66f2a842d8f0996aa24798af4318fbe35857d39b1694bc65662d828a23f29e9b40e1e67d48b869f5082267542cb55b014c7786894cca042f9600b5d9d8fe5a7ddf9b89abd72d480aecef6fb9d19e9cbe2f7adffd261e9143cf600f137117bccefef1f8545f28d19130f01a056cbee1428b3bf86b82412a8e0a50d339fa302ad8c846df9a3910ae21e9ed46ddb20242f060e23257c355d860dfa926007d187da0647f65a7b446016344203c352b20848dd165711aeabc78470c8bc3874d56912b001cf6d166271237768ce49f59d5a1394069388cb191d2d1f6cead1d9e8e49c951aaa5e68eab198d19970ce5dde9036a80102dc7f1226735bba63cee01a1acd84099c87b58d19fc04d9e98de96af2b5f405b82f2b4e49fc9b05351e9c72fa95e6ff6d45d7bf0a3e582ff60aa4a25709c8ebca78b760a21c28ce72192bc3a26461a52d1f112de3ead163fca7a1b8eae4b8062456b40f32cb7fdbcbc9300fd80746a4ac30e39f3f57fa2d7318195e5bec37daf2f1cb8c9a3036fd5183766b231f4103c2b0efa20ed0b8f7e91687982ca4fffddadc2abc5a012897673f229a4d2fe3635df3b9930dc81791d79a6353481619f245e0c5d87fcc19d6b49b56ca65d9c3f793554bc7e3d39aaba8baf708fc7083cb74be4a1feaa74ed14fe604d3d975dd9b8528f892b3514798e54a0d15878c4a0a4f98840ca649131a77c415976232d0ed6939fd342dddb83ce940467d32d1bae117f9d032371adaaf5fe3136ad41de9a7ef69c4cf40839e961a9a1c20b7ec80bb7265bef11bbb4246d725c1ea27d4ab9e6cc2ccf8219d2a380bd7205808393f1ecde0b7b69e4531e91c3ac74871d236a45b658fb942ea6bcc2b144b46a62c8c04cf07fa16595695ef997c314ad8165539f00235930fd4eac972e8d9111f65d96654b649a4ea9d3a80cc8ccac07447339e85d0368b8239020939361b67dbaa8b8b8945a0d8300d8dec0848c5277593e09ba733638e16dd8e9fe1c648dd980a323788895b6358091929e45fa6b4a091b27dfe98639dd201308ded299ff83cacc45ca32c2f40fb0864df653867e730f6913901edb30d979228885eaa174fad6f6ae785993606acf7008d5e9840e2b63fdeed90b6bc6244f206c3bd5b8dc6a219616a23ba5ba86bfb96b5f92687c6404add9ed413885cedba61a1c2292e6397ba582ea393d88b42449c3092dacf7293180a8d8cdc35619e45f18741d8bd40d76e215417e24f532b6c7517ef2cb944d2c297836a4bedf5c7297254207dd560aafc07486a33d864941da2a228462b05efe0251da0439ba712a3cbdb91f217213dc19f461f04ed2843ea41f0ea7f6e41688eeb528343f1ace2db11d094dff3e08861b22ca8b88843d79af0f9870e6230727d92a451546fd97599166ca560b77a0e8c0c7d05a1de3004d8053770b9efc3904ab606005e07610f7d0c3f27343f4b71baa7a6b860592515ee85d7ea262960d0ec568890a0ca4094f54ced73ea73386475d2dfab8c60d37d257c54505ab3c89b0068283eae1b2248c401684b2fb931cec5ad90528754c1d51079d1538954b9128c56490a35ff7d3094ad88c0a0d1eed21f25e911740baefe18ee0f245a185aabff10d5a39ca49cf91bbad27dc4f054204f4ad8cb87de799fef1553f997456670172f2c2b1ec72092509b930b91c3b5097c75ef44851831f434a4ca6d0c10b48fc178282ee30faa5e765b13e073cf191f9542909433401365c6ec3ef996b2749fb7bac5a61a0828d15f020e22f266b860e015630ce0000c0448ec83b756135c305b81901fa9d64eb16ac927b3af19d3a554fe4e0ddbc862e40ff739b8a44ddcb6cd3b2744ad2572bbdd5e5d6987281ea64bbc0b1334500af3e6037880e7ceeccd6267d1206394314d224e4290b3eeafbf2fad7c578e827b72d9be48743c2ddb72b33ea2eb686ea369200b57d84ad53369098de484e3b5a6ca18d6d60ab7d8b97077c45728d816c211bdb1936ed19bb8b96bbfedb9670c9fc6902c026dc61790a280b7d145134f30ad90be2129a9e365f6636358d7793ca1f0105a3f136920adb9fbc6fd09a95795d19a7b083aabeacbd5812ea5a98baf110a90fc94425ecacbe4ffe18dcc2f044fb01bd02feb8036e52910e0fbfe5fc82bcbd72babd90284936b4687b2aca12dcb8a02bfbcc2a24b056c5ab8c65b4f3103dd85c2b7c89ba53e13d713e832099b5e8dc78dea6fdbd57508ef8d32874fb7b4848d6e83ad496159e33143bfd09df877b48cc8e97e389760f3d53e50b74b1004f18a190b691186351c1cdfcb40568e1f0ad05671e9fbb632761cff1a3df281d5b057fd822de56a80abf6c9b4ab2fc2d8600a9a5fc7f7e406581f13fe401e14eb4f80e6086dd703d62ad68bd3b41603acf3beaee98f2f7de55972a65d5be1dce18aa53b04b7d2a0a7c0e8bacc5d68be11955d12e6c1a4123706b370fa8ff659192ad7c817253034b99db8ac123129e17f5ff8af652b7e180ee53a532cab5d6547f84c928c2efc8c16afe9a10b3605de247603f81a06486e21e359fc29b8179f6243a237c42f1ba8d6c3ccbf1fbdd92c0db4a065e639b5fdeb19ae56ed0fe66ba7b4900b97336a767936a8d880f6366cd3645bd3e572bfeb2c861ec4b1c94fde4da41888be0e3e17b70c4c0ddf50298c4744bc9fb0f2de4091c060e1018501c4470afb7a027a6c96012d9c2da20a989fe9839e7b1e831711d00b4bdbd5fedac2239bba70d6027d66a1fc264a14228ef4e3646093434aa91e1b812f0e492b195d8c410d428bc81db328cc1d8f971e2838406dc33cf9aed5a03652cd66284728b66dfc5c0cf6c5e59d660d00228fc1fc5c6ecd4d0396540ca0f0cf4ec57f44554274b89873418485d01a1cbe605de1039d28d01caffc43c575a5d556ab5143fce22d1b526a272800daeed621df2fe76725b73eb8c5c3135b045526bf84cab024fc8bffccdd51193b5bf0dd0a1fdeb1f9df53e7204d7c72abfb44079fd0d8bda0b2d3fea91f41939fdf19f0ab15d3cd416c0c7d756a68ab01afeb5b0bb7840ea4aabaec99aabc444bab0a65750676229a19bba05188accbbce6923ce372d421909902a7542339354aa8fdd104a880b2a60963460aa6771e9f4931fb6aa128e9e295de8aecbf0f359d0d5dba0790e377cac700236299ee396bef6b280a95dc2378842b099c180834237b823ae50eed35eeffb52f206a50ce9ebd62478c72c7e904b7e1a6123991c1c4d9cc07b580924774e958768767bb131cc02827bca6ae60d1d578d6d4c9c5d27b7cc3c8aa0190de5939d145b82e6fdb65a013494d6b5da9ce3af4c15932a141623ab7cb1a6ce846d852730d8b307bb3d9116c22df16d3006345880d8d249d823dae98aae5c20fda7f19830510163c18a30ef56c5f5101fb9f097022004024e624f598b50e48b500dc09484918cc44dc21f84e367d96d0d87632edf7490c221680cbff0db74f1283fed42cca94a8375d940c227261085429aff708a04b59247095fe91ded7ad5b601ead6cf3c151e7b96bbeddeed96e1be4b114dd4a1b5324c35b940ca267992d1aa8b2fadefa714e4f5f2d5b28227d8bc10215e60d59dc8e5ade6f2b1ddfe5f5609c7684f979c6aaca2ed1cbf4f01ec29cd3600509c97ebf5269ba05c6404188cb3e07deb9cbe574ab782a9201acf306dd68463d2fcc6aa2758d72ba9c29d39845b9ddb4569c4b804b2a0881a7947b6a0adcf425ce244ab08e41d53a9ed47f68ff61e806c0391fd35d15872f0574fef71030f40c2b312c6161f451a1420a11e42d8433906a4da6a02356c75de7e6296095c519cf317b89b99bdaf99d734971e12e18725c9266cab5c86fd05be0954aa8a38d247d03161954e31f81d645b85a9e94f527d34c43b0665e7bbe9f5cf2173a81f2d0628e429f080a96c9210a6700ec548aa9f4547c31f59bec4aa30afa4decbb856ad1839a29440f67809fa2c1160f0a780b37ee17144ebfb2fc5fd5cfb5a0e64e90551f5a7036b8426872d34d089c521ff84c7284276ee01b1dc0d4f306c2c65fe020c11af1a67a372828c98d375cca15c2373480aa59288f11c099816a1c8b94738370982c6c47a6ef30a2f1179fe0369a48c35c227d97b12b61225e74396a4945c60cf9f55bf241d1c0d4ae965e0974bf68c0044634ec220cd79e0fc1a8052ee00a0361f3babcbfef0b420a15d408d9606a8bcd37adb6db1742ff0cdcbf09441b8aff167a9c0570211ad7a6001f12fe8aba55772bb89962c0403cea22ca928a0f3253a45ae78160854d59df5b4d35cad9ffe6ef1894040f6a1900b583a9e82afcc34738c70349bba2ac2372ac61e0f7574c947548c7c39cdc6818d03badf6cc7bc961766eaef1addba5b0f360892166c9787d3c453f0f22549e35d96a5572a0baf046fa31229f0acbae46f5b27bc60157fc889f5fecb13a6a36e258af987ff01651b5bc245b76bd3800dc7fc5af21dbd1e8034651edeee084d15158cff786f715153c0d04a5c3f2b291254c1d40254557742f06bc3ebe57edb90d1c34d5e238580c55521e7ef7775b7b90c15dcb741b30d40c519e10583cc7aab1415ab10b11842e0b0f5cea1dae18ec130a144198f1f333f652e5b7d1843f74d469ecea158f972dd7bea4265ff1eedb57b43cf42b166f6171293a2c350d8bd684ceee1d36540c441cb00fdf606086667460e00b00c01f7a5ab332f0e1d0fc0e2e48d509dafa3995b6f5f39d95ad9f05b06ffd5c89cd656cf7bcd2f2db65523aa8dced179f938d6fbee0c57b1c77936805032db863231ea62261e1b3280866ba8db3fe16632ce783a86788cb96eaaefcc35c5dee4b25886732f839876990700c279ce0384b7385bfa287187a8b572c90290a8083e12d741738b0baa42e0b05eea64d1a7fbb88f58497179bab9c2b034500a7bd2c03fdd0cb8a57141b3339fafee71a32c21c4d2b1c4e72fbcb9c0bf9fdcc6f4ffd55264b717f26c0206478a1e99f2be997c9e5058e6097d89152d4a0552725d941cbfc9b1d6804287de0069a2e603f624bf18ab24c332324754d0dc71e4ab0c36d8f5c884d060fb79b4050952525e8160347c43008da15812975ac4108f4a72c6f0bd109aadd5071541230e4515584e40fb0ada325106bdae71e97fbd1161badedc6c6251b720503ff8bd0469fdc00a2c1570336becb4e762205f40c040c77d894fa83ac9bcd7ab292cf75ab08ad7223baf2ee69069d06c00cd932d7a43d63eab42ccdb58517913de44991c5258a9ee6f6af360087d521d62f4fb7a2b2ed7081c04b538c86153a3a5e56b711fd7f223bd12c1b34f845828d6f83957706d61314765faf1e6bc891b22483cf74def2281ca4fdd442d04722e721d3ca3c967bbd5b351ec7c837c9ea29323dc208a127d5180db016623fca41801cd8a25363abe954b2ff9d3a9261f23a664acfcfb60ac1e57fd1f59702c0c0b797fa6ed6d4742b245cc2c52924432b42f6960caeb74da1b5494e6def334fbead4dcd2ea996bd0c3896fa39d4e29c7cb9431058c337cb6ea72cb63963edc14e05f275f61dad01e31d79175efb82e9f75e03814013adf85ea508b03b41663e41604f57890732a63f487fa26648a5015b97e6606628aa17467f4c487c75357ee39dc423bf5d1d373217c590832c900cd250f2f89e15390e391813ad124789acba20f938f29938cb061f9c1eaa665cdae754d4cb7d049d0367e62291b0635f41451d7564140fb550b5fdfdcac4ca576f6892984c61b7ef47d0b81c07f2c96ce02d574de790919834f332a981cf3efed305652c6fb37066b2fb24bef9d8393d4b7a5d87a9b1d15090c587319dfb5d736b5665c60e389c1c57da02c0682f599bf67734eb27cea41ec22c2a6a7f1ca9ee0a21d201688b3b8bfd4144393ca866ea5260a8d5f43f759a5b9e6063218b0bf287e1a6ddf92213fce3264e25e87913a18a0b302c5c9f98b26a8944b4578d24942592d60d56a784a70d29868bf98fd46c07c3020f8372128372fde49483af402c1ccdf1de3643ead44661915171ea340602a1206976a2402c70fd930467110815274899215ea54081d368b884ccfdcb7dc09f0241fa7206c5eed39f067789ddd88a9044bf0d8956268c2558bec64cd60544ac46016a8c337a1de4239f9b0dc322a4c7d16333dca6774efe96549b01844230908f7f2dda7b8eb2980fd5cc10f00ee1227442a6b39193d2ffa906459b8a7c31b8aa546e307b15261308ac7ee46b545b42f632507519d4216eaad7c76c9c2cb47b55a9266d12c184d6311128c7f9812ee3420f07d86f57d50fa2b50d918030afcd9a1092c0faa6d89f63e1341c2c60cd553806be9c9929ff436ecf00365a9e46e9546afc375b58bdd34130c4d8fd7bfea6b2ed17be4e9d9209c5bbb2451e80153551edfb118247477833c18b821195962d883a76a737a0a292514bd786af41a17f6c4a35b0008c81999fb9f19a7c934686fbab7a432fc5c54474d783f06b1235cd4e24a8f81b707807d117867dd638dbf816809afb9b02890b5bc202d0d1a900c4c2633b30caa7e2e673dce091e0819358b4e0194903187984bb379d7bc0083eb6673b1caa99470a1120c146579304e7d17822ac84aeda8a17f46bfb950a1e713c39c056f201113bd8ac3ef0ac0f04cb119f8206b0e18ee5ed7daf2bfffffc0375aca9d29dd781e3e314eafe3fe4af0324f3c1e9377204e83949eefe2dd790c8304b8617066a08b84bcb703611412e9e828e32034ed593471411e25eae904a70f0857a16a8ed8be04320354b11aed154fa96bf4178e9ba1bb00110dafa27a6820df1351a4110e001e6d624334447e00527461ee56d80260517d1ba67fdfb83345a0b3f83e343a69a0b4b459a9a89ae65fa73670a6d21b0c9240440b587794b9ee8f146f2ae299aa8a81b4cdb61e102e4dda834f18880eea3fd1958010a027a7367d99d5b8978da9f1f93d400be2453998e02d78bd11d284fe35e78fede45bf95263c59706bc12c1d8acdde9f5ae8e537b3e550e74c1986b0607437e33c58308adf98452f19936088241b2da1f414ace17f502eda427b63e526f76c95d8652948416c900cb637d14b8f0fa34216576bbda3a5914b7178c8db41cbbfc78f14e7fbc24466fffbeb1dd082706034ccd5a764722d3188fa390f21f9a036e8a33a18d70ff89df4ae92a1546633a41095706be76ecbb14a245542b9569fd311f6b28e28da10fe586d984769c2aa6241ae4d1e108c8d9e51d611b636704995e833ac14b0508af0ad0e04e3ba3b42e13aed6ce968a066d991b212cd43295620becb94849e425bf451fd0d042a72dd1b3999292c65d166f48c5246250e5253a9cf4d471d968e6c356b0e7a3a4986ecfd99cab3eb9702a37b8d4ebdcb98e96a48270987cffae022b2cbc15ce8e4806382d979288df70227399a4b75e3867bc065414575a801c04c53815a1c8de1aa5848ae3a11a35d2f1e59c0597a72ccf7426779b4b13a9c60a715e092420f12c0cf153a0dd38d059cc6782aee46010229cc75cbb42f39111498d56f55a343e425971de9f0be4151c935541f29238a6e45af38a2580e76e30d6a2af33191b1e6e0314dd78f1d64da036860e0f7b25871d041afa9442195bfa0118b374db946865814b46ea2805dc5585587e0008641a351ad5c2be528827ca242f07e70b4314d206f68b8cb22e5c9cdba8a6d945e9537d9ddbaad811608dcc4c079050a4a243402255e4a8cb93cedce066634211086d3f0891eb1e5c92cc0a3109b4b7881dc1178fd484b7611be78d71fb38dcfb60bb46fa8858e6501299c5af399d595dfa9b8f451b52797bb23dbfa01b5f89c3c2f594fa6a8333a8ef31303baf77e7cdfb147f3f35b371e8e31fcb9a944c793908e4aa428bb52f636d72ecb6cec3e308a829215d427ae9678529688042fb619411a86d9b9852d1abec15363b533f2f3f15e9e67a12a06dd1a3f779ddab6167064834edb20b14b152dd050494ac17349377c5fe96f6358752f24652673265b009be0dc059635195834bdf412e102fb5db7d87721082350a76ba2e648ce80e31213789eab5fa6eef9dd7117133e9cbeb7fb591560dc604d1cae8248e5b3ca4b0a4b23c080cb342233a7cf40bc7cd828fc3137c471fc8419d07d14a052acad07a3fc5dd9dd394843847680c461f26614a4749d50ecd3c715ebde4afe039b04241b02b5181d8844f647ee7e58b2a9aaaf775972012f295f619df3db7d6664454d099392b3692cab5bfc9c0064080836e6f33984080cf5df470dfc0defb62eceeb54e97117405d918aa8975390d24811254c19c467bea6b79b01e560a5be067b8a41ba2bc2c1e367ccae68c0e2cdd9751ac284258d3227e016ea2d37aee07a3dba031c473ac4375608b4843f88ca8c447b2330b5b4c277a8d5f7432468b447420951860f496b76b4834b3debaa44eb7ef15ec2a850b49d54771c13d465e3812d1b15c531e6a218eb6745c4f83d54a2fd51bd503a62a10b5a87883ab09ba240ba8617c13cc9cd6fa164c3dbc82b5c031fba4bdc8e10306504563dd438a233829a395c57a8ef185b4f90ff1cc9cf5d76c7e079a9457786f8fccc6c70c5cdecf19fc470369246e3906439a1a5568958be75774cbe05684bdb9663c4554cd1402788c6c499c05241e0ac53267c0f529c3ee879a8d038c9066fcfca39d79b8be2d1054b07dd20e2491213181890a8a978343a04a7179b840a73c438d03fc407b472e6aeaca2bbf117c210c6e69d986134d8661f91861f0b03bf6aa4bc42d4a3be7506fc592ce5449e189410b0cb8bbed792a123fee2ae564c9177cb43a31cb1e4d6b7efe00b1834acb934106c8bb8c726c324ac9d5b19e0fb2105d035054872c375bfee6416330e833e421625be409f2d2077846307d2ea6c341088f03dfa6d2cb9226ef2566d8bcfe8e86054ef801da316b5fc985ee2d419027a906eb6a707717522ba7ad19046c3e7ebbfadb94a1d9d7f442fe9d419023d085f27f7dffcb0ac78240e37aa0fb1a867107f6f9995e17e3774240363fd209851d5e1fb4e5709a8939baf08d915a71754777a00d51f03b58014141c7146830fdd4f453fcc44820c2660c7afe3fb2037f6778c237087611b297a7da48562bcda60fa26f8b4e73604ae4e5a62f023336679f390c2b24d82adade5592ba2c09ae9edd36070131de1e9d83302fc4cbd252a9a4a656d406ff7a0d0a410d3116bef93d96ec19cc10f6677fc6e6333555d755067b52ad88c9441e52989c7777ce3cae6ad476f3f874ab8c972d3fca5f04da2e3fd093ddab0d2416ca601452100b2fab147e7a8ca0504231310e906aa76b5faa15567fdd070ac89739d5035188bc31cccb99e40c36e7093596879dd2743d302cdd30ac6254dab8119d733291ad260d94e90cc584eb3c4e448eef0d1ba8308b1e0650b474bab78d82a35b569450da5b840c7649ab15ae46969d7f0b8fdc2b101270642548d12d14ba38a97eca4f6c626c94882ba535893382fc227894b9c3460959267c8c93d0f5380093f3f2682dbdf8fc78ae9d1f4a9e899c8d74251238a3aeba8a31422eb17cdf62bcbf15b4c1a97fb1a2fc1ce806908fdf2af665a06e92f3d03ca39d06dd7618f1c04eb9672cc66a82abf92f06652f5e4eadedfeb077eb2e01e602a847d14f6eb1089bb221d3e7e323beb308696e05b24f339087c1499bbb1b1325098e0e691328ad7e223c6af25f89048f98b1d037da05f8456b6151f002f22527b3bdd89777c914e92cb23a80b06f18586ebfc2546228625ab19757133c034b8ea4d38be00c40fc1a95bc861d373e8c5f582a1f42aff06c021e1f910c92015f735d35f4a0012e7a0586da9479a634e50bad026c9ccf3a55adc28ed1d6f4dbdc7ea038f5122cec152bffb921f0ed8498af31b60ae385bf9cd2ab615e2f9e65a5797a7f5593a0fcb31ffd9a315f5f0a9c6968213a189b2748fcb9893e663cad5e6db633bdc2db566ff1e47d6d9673a4cbd1145c3725a66561c8b0c24258af92422e62e96b51088258fe0afb46c9e8e3a1089028bec11e8997f7f1b5ddea01ee8d537b5b46f718110203494d42b38a6e4a226f013483a0b886b628f516dd43e307b1e156bf0dc9788c78226fec67b5c3a1684ee639908efeaaae5d4a8586ab3cabc7f84e6b3e261294dce739327a723a20e0fe4b97eef28a7d46f5b7e8c0e97e9b45b8d9b51611f2146e251b7e2c3bba652e7538724c048838670f6a88123cf4f0812982b36525d8630fccd62fdbc189eb4c405941b652f769c012daf38c8c917920db4f527b0d16069aee1232e3c486660fe6f2fc82a558d63830da08da6a0aa194848840e3a1ad99416f6a9108a1c6ab55e1c1aebe63b5d7d8acc9a65119fed6d17676650b46c8b85ee09d18c67440dd4a5db38405e861918fb4801fd140e313234c47ad0f94c0130f1f2083b0264ff4a692fa37cc78269a6c723692e3a8eb0890fc76e70efc230334d935fec8494cd1a3ef246f80abc0b242ea80c6aab0422102263337bf3867bbfc3f11584628096f4ae02fefc7fd93210e6d41db38700679a1d73744cf1302d719653bb38185fb397f95d4104d860ebd7175b4051a7c6ce30674e23040f22c4d8368734e053aa6692e1d2c482676a58447d6e7c305d3e9d6fc00fb8931450dd1a66541e082d5e8e69e85a65e02aef1b7c60119be4672b9b192cdc38ee0b6b94d59a6116017706ca236fe8fab8522741d0e993e816ba850b92735451d27fc7cc007bdd1a3f0440b87ab75314f248cfa754d37603e1ff4c408852696cfc7a6eb834f8c42e4deaad3f50e6cd6d796ac640df5cd64f341153b3c54ca0d7de309f895f15ef5f8f762b9f11802bdca2d2b4744bb6a480a0bb2cbc1e178a50c6e7978d83f85587daba99609946d5f8bf4b0a0c4c39cef70b699035c28ff390eecf89a3442dc9a35a83d91deef9193b8b10cd385694b18f31b4c0a261473d741d83c2b9341927facbfbc8c36503de0f0f79e00b77764ff497e498438b71521096ba2931bd1c3e559ff6c6ef809f0901446dc5223317f3f703134f2c43ee9e0feae99b020f17e9074bf2b7da823ec42696bad8ecf04df413456a48a02a8190dd0272e81e3583501279ed5f14192b543b3396c44fe8957bde111dc0b651e425d3e9b52b0789bc13ea02a50e4f2342de4079e1a019c27b3a12f0ce538dec61e303b4602bb8386e4cbb590060e55ed059c2e1d68ddc19c9d86d62d2c1d002f13444672177e95cecaa496cd617bbd87ca8ff46773d80ce4e8a2bfa8d252bba051c3eab99bb26e78ce88776282a6173fe3fa8a6d74df3350fc1ffc06430a2fbc900e4851027c1a248bcc09ebb61bcf6938e26b533a75a9abb32110b09f3e984c42d5c5e3cb67ef4b0aae60e670bb30270b039f6f22b6c714dd0e223910895a8713662f2a07e1e7f213fbd7f49100e33e0793d9e283568ed88a245cc3912c2e1318ab90d2daec3843d7f71593003bc96641f7f9b29ef122dfcc51659d3bdf267349b1e4e285ff604c26e250b56de5d5be481bbc04d35d5be3516711ae6139ed61b88c204cc90695590dd04cb8c4b806df3ce24bdd08ac345ae1d11490e60c234bc27e23349fb42123bc849260a279333c53b9ae6ed4b7f06249a4010edd1437028aa2794f36af787a48d969a9a9bacd7ac8d75e8130a81811c183504f14aca65a08717e9d516779a523cda9b34d99bd75c153c5cf1ca14a918fd699d55ec4fc2e566a4df8c2449f113f53ba1f55747bf1866732d375a903d82564230cb0aac0ca99d7da6ac3aa094f5969062a712393fa8d3ec51d1133992905aeacc447eca6cc8819c7c0939022cab076679cfc2db66efe0fc865a43350f61e9f8c2d28fec9e59eb9d1b00c9774b7e03608f45e5de9890e5749590144f482ff5af6871bc516a810033841c1b85f938e4cb70a9ceb66105fa2a247f250fce5d53f1652c60bebeae4e6b7c202d88764ad2d9dad4d072015e82b4ad3ea90d28b9b0e327f97fd1f133853a075ae2f93801b5d6e2431e81a7d524a2ed09c94bd31f51c8467070d268c2a090f3a067806d4bf2d0a9a5cca65b7a52da9d2c1005ad9cb857a2f3557a1d03467ce2c0adc0ab4d3145beb5fb302055724ac2e5ab5cee9e326624ad7383c127e1aef1bda4a2e70af8cb3b97bc6a3049b274e4989214169b115269c598dee13ca44c460faebf69b63adafb644cbf33ac42256af3cfe3f95f3a24950c770399ae411dac24f9d3b49a592b4b7e120df7e6e4c6ec434d36a2de53b92ab2df48af7c3396f3e987a8a933b4ccd846aa05024f3f1a5a101deef61d135e97a4895d88edea0cde5e19669a02c98cb33e2dcd33784638b5fc3e23de1bdda2c340fc149ec7aa906473e7ed729027673ee5eb03acae8f9be3f6c1cbd9bb5fd3289e33b2fed69f358421b7b90194234654a2d291e628c3664860908493d829c08c1694190bd25df66d4597989d776dad0a1d90b4bd4f771a2dc965b74a7981966306dab42a7a00a73bf0d23e20ada99fcedaa54502189056b72d9574206650295ad7ea22d3adf8217468c99dc54818a0b0f546d8185a2c1a45c561addfca143c4db91dab623623903d8688c68a9448cd13ebc236b72681332fd50e1a4b38ae3341fd06e72281e58a968fc71278f4d237f715049a1887198b6b308abd62879c170469426b4d8f76ca204114189e7a08e3fda4df8a501c017358c937a1c156dc22c56ad41ced06397818f3e84e1777b8f8a589154535c639617ab3672ee936ec46a1fcd5020df466c95654c46ee491a454384c37eb3db8167cb229223090b95ac726d24d722cbf37122fbc38f902c7592d1081cabc099a5aa8e283d3b7cc37f2cda7444af66bcf709d16c83981e62bc63105ae35275082b2002019980b8d50381d002c42ecad38dba01b812faa2ec31cf3ec4799502d0d163d0710e163da30342ad86a436063b1f306f35777e3210f65f55a829786668450b3488be945d79bc5d520b2432b710e21798b8a833d24c76bc4d20b96562ba5aff4c64a411202bb736ad760a04aeee7a32af02fdb9dfb77a2e365db308646070a3e6424ae8520f20a376e1e89a4712a882f8be27e0aee02cfd1b0f77a1054e5f2cb25f5cc4526a12c48c55bdaa85d35125ad74896ab9a33898e559c4fe6d74c6e796e9dcb91cc4595dcbc9ef99fec445aff59462210e9762f479aff3a75e69a59d9430a4c389cbd59d503cf05be9cecae19643ca0aeeff2d688a8c0865710196f3c78031ff49fa927e65ec4db4520dbf5ef35995c993f76e09cb27ca02527262de86eed76a0cdbced5a49e3ad0ab79913c74455602bc3aa120b664d21c9a6f1d3e8420edaaedb0ff5fe9887b580a0759d2102dd493baba07b00bc3b2a7e1020b96b8b56e607d8ecd7d3c7a1a1fe7277a4378e74d237e9947e6a3aad8a5b0ebf16cd654443e9b02402c2de539e8f02205723ebf935f9f39d3494cee7bbb562be7b27a1c0e8b2d9a48ee819a03ba307a98be93207cc262b0f99593606c058adb819b675fa6b32fb00948904703da94158bcc6ac3850bf45db51a77a7842949221dd83854ea07efb91afdb18ca5d74694cc7e32da6ce5498b8cba295a4e06d3350b0b1214d9bdc3aa244486782375855fbe6ea4c7bbf583003fcb7444f39ee95cfb6db7ae793daee383542074c720c6ae7b421edc076718b03b48811c1f5ae65640ac5a171fac34778472213462e7ca2a2873aa5d621a0d0c835bf69481d2fdc0ac72e898d78b607c19882fd4a7d91632c2c9c7e0d3586a9e26f9ea63d9fee2a8342f09562d9863793853d93eab0bf734aef65d98b2e67d004e530cacb5740a9daed3d098620fb4f00076af249f500e042e6c26c5b0be5ec7c52800b0994ac1171cc02092a57a66a27949c729300c33e08f70b384274bb5dee00718610ecef8b49adc871e469e491cf1da0494881bc5f02dfed1f97ed21ee460b2a73639bdfd9840b2a7cac693dc21645a4be4149db17b97f4ef2aea10965beb6f896925536c0e4a22b050aaaab1085ec502d3331eca72d5d37592480c20c369af86fcd2c79374fc48407028fdff8376dfa426d43336227e101d731582344e2e3d182d01b57eb215c94923223e23226b4644b2d4aa6daf632cfc045b01a72397766dee1d4f4a81d37486f87ee67c24b76735df0fc772c81a7f005ca2f766f8ca2d4f01d46f73f5da05323032f4391448bf4f666d2e6fcef96fe694c910fcd826ee7b8eed24c86b5b49df3fedc74f113a2870b80d9f66cd6edbe1a073777e030ca94fcbafb9b32562c851aee4d80c32bd1e46f5493430d8f5e45994a517c120e354b54c742e35e5b00a5a56b96458155250921551b5f21124cf84a35920c702288043a276cce5962d0c8f12f672ef6696cf6baafbdee75c57c104a5208ba36cda031a104e1f6e9c427da06d270bb3257c8f8523b2bcaa85e789d15b5bcdbd464cf2ae02773c2513f9c5025bb918e82e9cb70375841ef67821e3d0824d2f5639e6c155ab433d5f40359c8de59ca9be8f60ef68857418a2690411b654565520ef75a6813aa98222ad05335a6fa6f19c8e1510e3cde81a47e2846b92e01ebc81688007c519b98c15c9c40953ad3557cb8f64d0c173f06e20fea6e2a72fa9f84c25e5cacff66ad51713388e2c4624485a7b01b20c6f336ee4e7ad30604fc252a018a71720e7ad6dfd16a831a9941541301f1ed4414eb26272facc8b335a99b0a96742330281e5662c85620e0b0df719a3c3945ec96423170dc473727f7dffbd2ad005e5a54bc81718e5a7b909b6063c22f6dce54b25bb3893c58c29c4f9b05152274c0b42b426a4255d1f5b8b3e821b0c55796ba0ba50303d390c6eb3bf0c175560af43321e6fb767c764217507423a619fb4af33884c7a363460893c36b5c47b0c1ac6ffa99892158c198018640ae4dc960231dffd42888acba5ce7174d3fdda9e663bfd8b667f2798386a6b8af8bec937d29f6c85cce48b719c278ff48ee2b1dba232f307b53ea116b4620cd934d3e6807042f0b04ecc9396f5336fded6e7759c757ca84c8d360281723ebd15c64a79c8f656a56c85792d75213cad1f2bc9c13bccdc8e065bd2d762241f3252f8b56f126a94bf395a3a7c4226f756b6a4ecec291a3f08474ddfcb1385750be617b06d572c4c59052a96f5a117fb3f52470aca6edc7d1c8510fd0b022f1458c21c04a125bcf619c1e0b1daebe5d7295992741b5ec080e2b9add449d72684d5f411c558a96d92fd18c403f22878905c20677d1c41723da8df53a5c71a558964519937f1d053c903a4143d112dc7f5732da330d957d7bbcc2bd293c2a293ffbe5cac05cebef82fa6ac0597b0d36e16022fbb918bcd2ffed4607156d09ed04000ebf9460025bffd50a97db7da978a34783a3d8ae5fa2ed1490b190216eb1ed2498efb26295ae4cc83f6d63374c3358062a16ad1fc33c3ca3bd5a40ac7ba9ddd55a654b30f64583ca42c364af005be5ae3bd8b04e928aefa10709b62fa2076b7abb47c48094a2d8f7be6889f46a857c79b44a489aeb6ba7fb142e37b08637ac907b3280aee05d6c25c4e780dc5b40a9c4c1f2b944b21e58ec0cfff2090acb6c679d6684e1713a14463b366c23c9818c633d1fe51d196a8f4810f10884b9d653c77042ba5cf9c6f595eccaac5d33826b558f308bacd0851837b9f71ee0691f0e5677b26d833b5eba10a8f6bcf559a7fdcb2bfb6313bd00c8cfe8c2656eb7ccf7d5a0c4c6e9f1aa89ab3a33070a048dc90778a4b2521132b77a112d4f87971f7c40fce8126bc76b70382a1ef67221a4574f1ddad2b793bb5ffce2ddfade910c9dc47ed66f029c1253eb47aef2f113914da6b19fb901d431ce9fed465be3648991857e76cf090d4907302cd10749bda8486f0464dfd33f99ba35121d73c6e4408b57441fbe1b602b4a81a6fbefe2c057a609bf42e5d2ef2d43b64cef1dd21dcbedc0732c93ada3aef2e4af8e342c5bb4a6d4aaee59772c31c9388aa5963eed2170a53dbc2737d1ad0b38e178159488e82350801082424a2638a1e250920906363b4da4269a7ec4128cd237c58fd79c413b301f3fde8385da3589a82bdc488f7bdf2f0263fe8041df7ad1a03feee4779180282d8013a3225eefc26b377c4188d85e63420a7c4c4ace67ef6ec0445449325704fdcda06d20239371f6033a103a3c014bdcc49773d291411789adc58c4033ae258071f185f4e75b5daee81c0d125dc6ac2364eb77ccd17ea23bbb71c0338729d6a75d02b5e60d53db4063b0eca65e8957adc991612cc6756221e3cc42dd12bfa6872a6708b7ea90e30034bc5c89b209b40c83d3421a49607c49506ac4d544c5f86b02c628d082e66c694c6a59f8610b7b82c68e7efa2a1fea6a5edf84ce827ddfccafc092c4944b4b06759675b05c60661425e2ef429b155d1fcc0a5fb1429654436a225948e906ecff1c0d1355595ddb2d0d43aa134c04021bdd82e8a88efa2921cac91fe94672df20415e0914277024b40d066df069134f261ede1987eb0b5f1a83e9cd0b60da3c163ec00d1ed476519186df5814042b0a3a12e9e00ec67e816380b56966a8125989959c6e83c971534859eb825f2a8cb23d9b3b0e21f6f66c68e892557c39fa8257d64f2865ae8d06e8f93969fc452c014a1d83060e41013258b0b4c4c86a9c8225dc2dd38150bf99988545ed0d551cb1b695a5a5eaa36d8d9759ea5a47d178574d5e81f775a247c4b20df1be6801421a59059a89303631965a7ce33212faa904d8d5712a9efb2bbbf401a4ea6c32724df0c12684e66efecd6762aa430f5cb6ccd00d348f3119fe6ebf2c97f9b7d6ff697bb895499903cd20b1e428bc05f2ff363c98fc076f5b49e55e0a7d04f3e946b308092c1abf5ebc597b62e2058140b0496101cff2a2e69a185b24101f0f6a203b64af517bbab6ca0dadb72283758e696b3f0431780ad37d848e5ec427206e57b803953ee12d451f3e4c93f2b3cb4cecdd6a09b5023f972be84191d20940ca70a0053aca81de7019ded1fc8dad376ebb08a5f010320a9c898cd461f9a275b7f9a49e85ec800a192e2f74695e0428673115a65fa5d951167dc3e5800cf760c938b17f486dd4fe3a88bb055c8b57cfc51f384056d3d490ab284e39d3272b8f8637290d91455a3bebf6f4f3393535313b1c65c01f2f6ecde6e0b60c4f14459f2e1e4831df14027e30facccfb32ea769d7ebbb58b59d814df3809423bf302ca992a70ef63c591ee6c3f3a1776cc57e5f0faaf01b250f1cc76c38f2561ccd211a490c4ef4af2b0920a624454aedddebc5525e3ade80a02e2c20bc670ec93c7f15159ac3e620ed208f594be6b78d0679cdf55310e1a28b6d0be19684d2a4c2a86fe717abdfbf877fe231cb05f011f010f282a90f540edce257a803965c2b1bc9852bbe49999f4e127aa1eec7776ae9528285b0483d2c1a90606ac02dfdfe05efad27542fd432495078e5d2adc1275fdf74c53fd1ced6c8457f3bfff77af026d5136389c9d36c0ef5e4c0936b30bba4997bf1f0d489a2de9b8fd13672a1c36e2d042578fb8d37a888ff0cb5a143717851b632e41623d4afae28f7bc5f8d7adb1e6bb2f53ce596592ebcedf55981fc50811d28ab7c3fb9aed84983a103fa657b7d3bc6e3641649b8b55178350e603092b81b4da44a8c9421a89f8fcc2987a9a09ab312852e30af136749ab6fac2da7293a0be3fbdd4dc2b8b99290471526b6d5620d31fe3e4d0d3df4b8f71b18704cf2c849d573f1d1acfd1fc0ebdea8784f4b3e830d6e46d46f7bacb46ba51c9e93b0e6c1b789a05b9b8affd4ad96d907a5fd5481e31ae950d8b7e05e2504f3e5125e701a22dfc2f795bbac83fba7db93434f5c9508f6405cd4a250910d532cc5a3039173feae3c47ad8d87aebc186387aa096b4694a3ca337e57be1bee6d0a383096d50fb2501288fa454512c126866588ae341dcadb421af8c47cacf2b8cd1f09dcca94aab27615b586509f3ecc562949c163de07309d72423b58b4e85719039ca949947ef28db32e67e848dd6061d04abb86ed9a8f60bed69e2e9c209b8a386bcbdf1973b103aebf868b6318503dec4ef6b3b05d369a3ce94a0938fe3605e809f56f5ab37625821aa189e0125604d05247310db3d407afc36eff936fc6f440f54bea23f4625e2da5a127c98ff492e09c00131071d24be5e2e1d1bd9ded495bd8650126932055b33cf45e21888a74c3789a565f91664cbab6af344510c1875f816ad9f11f6414b8fecad6c534e1acafd7d40a249b686aff933fe9e6d7c7ba705f2638567c023825bdddf277f3b52c3cd2f2dd79a82faa504eb09d6640578078dea329725855bd49bac4873ac65be2dff8a865381a20959909ef158918225bc37933828cd11b75342aa058d3d193fbb0649ec3b80ef9a06c279cedcb09e323abab68eebfeeb484cbfd9714f96020c6839b9d7de028bd90aa2b6557b5cadfb250c54f9ab44a799286ec82cf371051ac2c6aaca0d9f82d4fa778532418827f895527be2ed3a271952b2bc3cda45c4253d1e5e987e0e989331579e15517c91a1d430d4a8084bf24a6fd0d7193cb48692f919893d51f74e27ca86bb1d148ddf80151a745a4d1df077d626671ff5a26c08433b910110098484df5b4ca36f23c81f5a762c35d9e726a848c8421252ae31c18cd4ddcbbff70920a79d594f4caf806aa8717c69403afad9ad3a40c395e086bc2d46c3a59ae2cc2830901ca75db62cfc5049fd48807e1c7ed8d18d920263941bf9971bbf1bc5b20948e1c55f175d38cdcf14c4f04d4eee8e093fc8f984ce00cf53ca1e596c7d8fe80dfbf1d38d105c0c1043c987d6ac4d46d44a4af0488278702023e72547c2b1625c448c5adc4ac395697715fdd1f5bfc145135afe8f1c17d2a319b2f8052d563e4100d169c5651083bb2e4439eabd3e5185149a85fabe370afcdbfcb38c289e84a8ea0e37c43bdf00a775ec10a77e3ea2a6e3a95e7c14b7e924ba2c1f6bd5b7d8c13c4543a2dd9e58168b9ef0f10669d778e3be2ed48e0933a3a0f9f0202b3361b3ef7dc5d10301bca670190ad3e16d09c78efefc884a42ea1d99b32656e271ed50122ede7ac1c00202da01a51544c7809966e32c6e147859c9be82080ca9d0a00277ca6ad78c7a31d84435f34623725fbbab9e3b95002c48e891dcae1a9f582714b23b46aa704078a7e6d1c3f94a03465bbd198f96c9a536ef6c8930cbb2c9bddc4da4027bd918d0c471367f615f9912513b5981a4a0617869091c2cfe635e76e18ad0c3e8f6f2546b2a26be637b9402a953786985f008d70e359fd977c2e0c88d950fba85e37a1926e458d40b6f7e4e4856aaf1ca4f4cd3fba2972dc7918197afbb9ef01db2446cc8e957bd8ca61bc63caa95056b542982e012987cabde8b6d7ad01304272946c2a768a96c440b39ac00d7a6f20d3958f3e6c9f91b03633b6f3489b2bef9751939af7367446017b0e7ab278ae6c94df5e763af4a3776f1fbdf3e52134d54606567fa054dbe5459ac84820f55f9703f64980daca11a1d697f09f69fff790d215d2e624a1d460f465a27fce65cd1c4319dc1a2a82ab1226a0cff3e61fff88415550fd3827f8d9338309d1783ec4cea0266d9be8b21736568289bf4f90be914d0502dcaf0214a403c4cfd159055120ceb8b37a2ab33c0e8abee4d4897518990d5637b1675c18c21ac9bb57c561e5eb32dbf16667a1036cba855308e3ae53ec4dafbc63aa93de44000708f728ce42e8e769e11ad1d28104f30939f97fe628c33fbc00ad626f5301403b0eadaa3be5ae8c2db0e500752d5fbdd80cd2c26dc983d7b92bb5681d3fdce474a3d48abb98e2fc6a7a07532f704905402b73e24643f68fbd95557fc127cf68f5f3d281736302a3f7a3579b41fe52eda066f05daa1d06420182cd7b64e454472e7df90b786060cb1e504e98f0f36d6e1a01b5f9a78b92ed2ce0610fcc0dbd8d0dda1a4b6bdd32594a18288d6a9f41ce7ad1e44de19d32636f38fc5fcf0320a0c15eb004e105ba8faa25a4735ea29ba23ca05cd8d856dcbc84153cee318c8b4800e9f9a6b39ccd3aa6e1ae6c08948c4af9a410910685c6f24889c3f18ab96a03b418f93a4fe4cab3087c27260a7ca779fdf33ca5583a017d4eb85eb8089e512dce1440eb38cbe5df2c8bc4546d98864fcf4ce3da92e65331723bfb036a08623f037ddb0e485ace2c46abe7eb4964091d2350c23a3a7a370f2bbfd8d67f8910c5175bcabeaf05103dd7d14b97bdfdbc863331e0ed5a9bca5d28ada8f62163cd3a4807613d89cc27c934b6708f9b6683f6454bb8954ef6459771c9638461dbc6746fc3dca5cce18d8e48e77ac1bcb164a9911cb649cd5fb19e101b5a8e09bbd6ac3f08fd97c3e513c4a36686abbff4fc8d81a7a084042067b88055fa00f85cf34003d5744563b96c9ec367744afffd57edd032da8eebd47b029610038408c078ec1a7f4047209b47584f8d68d99613f0ed6ea9ba455e804e83873560456b45b9709dbe1e1c9e1620e96c75845da3d622787f87fc3948ccbe224d937ddaad216c15d778d73c2f87c0a97c07e05089fc1f81941fe0d70664ce465cba8e705222a5b1dd41af0ce44bfabc793559e14ba47b638a21ede9585ad8269a003bf7d5496e040f36ea8165267a5cef36686e8bca9318a6d28f468edc45b4cb8f00be37a5749cac14758926a289f54bedbe12321e2017add6dca76e44f1805c0e5d7ba2284e53d6ac771126d3ac8cff4f79a63027200d88e6ac1c0d6ad3de2b1e287b91d667127bbefcb891aee97b0e0ae07b3d8e4f700fea72673f1029de7700d9815a57dc09795a38f85c840a2ec0848817406c66f143a88436d9455ab3baf296a0d2f1f7c66a0be153beda2000dfcfaa5801408f8573a6edf971faabda66bca9adc70441acc7d4331f51292cf9e124f52470ce3f90546e2090c119f5ab39350522679bd148a646019f9a1af6c74eec41e0ce45f5caf505612c5217360f7fe330fea411c39f79068b206da524c69c8c240bda24d79a4e812927c6db00b4777e0ff956f746ac816ada50420943ead5d1792c4ee4d0f56ced0dd80b025dd39296f6902d51f4258f0ea8f3dfdb82d7bd3a3f73caa536a0db2fd931bdbc4d42b2f4a16b3801efa3c6fb11b04ff2477633428ddd407b69097d931a6565468d32dc6ed6017f8511956330c748ee5af14469c6fb5ca298f4224e88b9f46470b696735b7ae90ead5ee3c2b968756faa9a9daf59d35fba14f6d4cbeed8a8934572d137e7dd90b13504a8a5d37373080b814b6e961adf0e88fb235af26335fd40b0f293480eeb87e86868f8dd28c7dc35038e3cfa3ebd2fc672c919781782272018465c70ea8501f82efe316a80961e088c81a5c786af218b31f34e53efdccfa3933c1a11f92c66d9f9ab4f56c29e8c4e287450f8b34bcfa9cbe00c218d58b8eac4fe5b69cac1d951e3a7e1a7b8f39e1f0dd37b9721969f11deadbb9db7e366af43aba223062ff6f4e0e4deafd3d023c565e621f81edfbe4fbe4afe32df17767ad0a73519748fedfb5e3d287fef5b640340838060e404dbfb8731bd3a813be976976fb97de4d6a8f406ef0373012d44e8079af112a1bbad98abc5e9ad276459e6cf63e631442acecccf7ce457eaa09f6116d02195d2ba271d11478cb7411ccedcdbd9917320c0375d49b9b2dd80c75c9a8c5b369e3b8dde6b536d109b2dd0a4afb980d567673c33be1d33db4b96e74496fd41b0c09c117bb428a53b363e45bfa0cf951e5b8a72eb18334a79b986b7105260dc56a6bde6e16d103980af9a2ce625a82ce9dc7455f0d5031a7a1cf75a281131748746be22892c444d504630e6012f4139c29f07a578fc367cb507a6a48e5c9fb9d221d83a8962690b137881dd01fe6fd3237cfca919df6bc256e46dad066e69885f9f6e50fa906d4fc10536cd89fdecb7a8d299cdf7294104d18603bf984b0b847201e2e077994b2cf0b02332276cd09746193efa1aa0bcbbed985b184866d8c09b11e558df43c6483c72ac0e046b3b1c4952f823e9dc3150ef0e3740e9c5127f4282a82c577d38029a282af680f89cc98119200119a11ac5317ebafcd82ef579f7a73974f42f92060dc4099ac8d862c3cfe45a8bdfa867ac49ab7c30645031d995007783ed9e05b41778ce5954395a01bec72a4039d018fef619725b7085d9ba3f2d7971eff2f9d79c8da6be5fb9fce1f258f71ffbb3fe88b7da546aff675ead04e50e227f3130a4cb79b039a4a4abeb65f0949e2cfc7ce44c28194c1e81504481f00b0be0ba11b8c1affe06716123d4fe547f448f749425e9df80a98d83d5a93f33c501dbcf7f5a57dde1afb9d3305e3f442ef33ecb5391c8eb075f1b5c229a951b119e62786f58ea828df7fc74d6444d6d14a733b2aba1b27cfc1999ae54b5d26776ae2010b39dac00fdd90ed2b0089fb3da687f3b43061bda79386e648dfb5ed4e9e19cafe3a6ac3b339e80a20004a38ad34a1d8856f6fa1c9e1a3c2aec1b64827630c949bbf3b58202e673cd76e7c6b73be345d42f4faa48046431e2bfb399d59dcfa2b11c131f951eda8846571cd622802b60c54ada49654e4cb098ed72f1903bfe04486e2616bbfe96bc6adb05dbec54e61489f748ee6509f0e500b0b9c100ce8ed3c1f6e0f9c08c387983aaddcd65b480f4dc8a61bfa7079dd09ceccd68dbdf80cfe74dc3f4c49533a120781d6f50700832e0f20289b5e536b564f991c78e04c6fba920b5402c4b782913975b945212e88f67265827a44fa34d5e4b1a31046fadda5161b2ae6d1166c81fc5c4f7305b4c54d42267e36bcf392f50a4866d631974899221e0d15f0f0da3bb4b67bf396b2c0d335773c34260dcd0582f60f25cdd8f612b2d4014191b2c46e871f0a2511fc7bb54e3ae236b07dba9bea249a6fa848f33adc147ebfaca03aa208162fad2f7445fe1bbcec61638107aef4b909b80cffea4f1fc2fed3df13f36cb285e5207daf93c18262df658aedc19b8a1541f7b06d0c02e67e1c935ee3c3b38fbb310d770b77387fb845fcdbc15999b99afcb6cced866322f90e1443158a90e2014312f1bc3d76b2ae6ca69d40e575a76e6a3b8a34d19ff6d0daf4220e38e251a9d1efa0c2ee9f98a6cf853d02e2cfd20988e0693d1fcae65aa162ac7ed3c8fd20ec9ec41df5b0a3f5d11f2963bd563f284eefd50fb6fb6ef77313eb03cc8ad4242e4ba805a83d6712c266fbb55b37a63a9b6e6042fb423659c6a1b2fca03cceed44867ac958ac013ce5156cf02e2f7b479548b0a2656a668d8d2e7b5639d722a0b9c918391123bf777dce8a3630218fd4852905e83c40e51d511f534ffe6877756096e506a7e58eef718b41b43ba8928ed3aca4531f7e19db8a5512fcadaa573e0a86c7b2587245b7bfbd684447d2425693656a8ec02ed3fa040a73d84d07fcdfef78334d62053c3bd4bf7c068df9fb4840d72b20e8875012f0c8d7e1aa8759bfdafbcef27a1ba9ee5e84e0926922eafe31e4465699f1dbc8ad3db34e026dc345aed708d99793a873d43c4c641f924c5e01510143efbc10448e3394e7b53b194a8d7ba10c3342f6aeca1566662e392e4deaadc760dd7ff7aa2f821354cbbec8887bbe5ea4f80178413f24aecfcae532dd851a0f5d18c5be586089eb851cd866797b9a950b156d403a92a7cebaa266f27a1cb83dc7a5ee9207b9a6bbc4cb0fa3f08299993c7e6b8210f49e9a9dadcffb2c6e798072bc7bcd431cef280faa25101b2ae7452aa8d5b321fc043d22a1c24e45ed55730cc61171941f0686e56686cb3048259bfb214d2b0065c497e555f4b70289192275334fb07f665020d72df0315187025103149f59fa3e693cf310a40575437a47a2b1be8e1807ff30fa6ec034ece84b37042838ec7e01702ac42a191ab45d6c8bae238ccb65cbeac0ff81073aed7eb65daebb60f31b90fc19e3ff7ab03aef8204835b3f89b2781b7a7e56e10c55e8f40b04071d7e825882f19827f1cec72e3fa145b1d55591d608ace3687d7f9a0ff14f03c210d1e23bd1e7b475c1a0da74baa6774c67a46ccd6576972e6638bd6df17508dfd5dee54fcff26d20c2ee402cc4edac2c00d61d5fe255a1444f398c2428908d386a0309207e788757b88a0cb1f9a967980f8d0a770743aaf99875e4136830292c454deba4bede22360b3e33088249a3a9214a0f00a513bcf3d92b42e367de85da578fea53026aef2da181b17abf4fd014805dd99a3598339994f974382c621f1efd3cc1052d4a29ae1677ca41de1fb7427718a9e1faa2734c9a128fca39730ded316b5919be13d30eef11e0ad1945716b2d12ebe240efe85a1d21284c3f268250ca8290a6f86d8d8258d9d49c0fe73985cf3533a49fdae2073cee9aaebe5524e5359a0a8b108ef06be12437a6e351f2f0adf953e26e308872c136de58337543cfadcfafed3ea27682b1e8d81d7e1bbcc240e3b303f1967eece32a097f2ef8be1fa25c81b9ab52368930f003809a0ff87d5d13748deac501937e5a3cfbf0023a43b0221ca4213a0fce302dde1dfbbec63554a2fb5f8c7c134effe875a6d2ef74d76831d2d5f3e06cedf9141fa6bda867c64bae24e7cda7642bbfbde96244e6068807c581395ba0d8b5173900f9bbe1541eb5769f1c005c73cf1bf5704e4595943b629662b52b138bceeb17ac2b680e9617eb427d0943d5dd739e7113f34e57ac0d8edfcc30fb08b982681239d64581b8bd3fec88ee0b1e8916de43a0091d0d8a263434b3f2f5a5d66163d144516db906de01f0b2f30b2e08d75971adcf85cf4f14cb4e8b2a6ba064b43acd1bd252e9e082ad45fde6ad3b52269945c370f76c9b41ca1ae862c030c54640a141857c3733c45bc71bc5d311535efbea29d0deb556b48e7c9ac3232ec7aee209269becbbd44906842319ea1c7a3cb5d077aa6b997aaf4648f1a7e2ab60d6f6497ba728b24cc2fe17ea2bfac8b1c256b09f95957b82301f4ddbffc10c903233edf5e3f1bdc7d97f1d8c834b4ce8fa1a5ebe96da5a5daa0320a0b8c8dad5a4a67701f12582f58373c42a87c24a430f7f1b6dce0420e5a059617495a11eea1178aa2b3061d392b1c3bd61461d0ed564271379a054789a01e7df97b794b159d5d77183363740b7e8884bfcac70cf0dab04c00111ebc04490b1560bbeb0769361008f566ea81ba03c7642d2700cc5fc63210eb1143e0b0c0b9cea37a25cfd7cd7aa35a61b9f76241d44e9f2a54c38ee7804d0d69014c3caeb123b0a53f1a12120bc34f674c82646703f08540fa3dc44017e319816de8bc242b03a3e433273ffbbcc9473542fbe793f789e9ccddb173e4d7e9f14adee199100b310014996d1f3dfb14915bc2a6e64a60b29be9d07b602d50d6807f02ffe8598aa216931f9fba2a685c92e8ff296558edb07ae48e1aa563c1a305815fd30014c3deeba825e44bb5bfc3ee8f4fe3ca7a70008461388f847f3d1fe4e7f18a5d3af9f94383c9bae07073698c2755e0acaa13f6b7ffb1b12b3fe59bf87848b1251f9e0e1f7bac863c615c9c2cef147c4972b1a658a4d4bb8bb1c843317928862b4576aea7de2f8dee9846dc16d08c19829c249e88810ca4a5fd8f1926008ff5fbfb609bd3f8358ec510976cea954d71d3ead794291632fce19f029761812e43c27ac8c99681d777d51e2874b9c5f428858d37155cd14aacc5875b475317a0f8c3d9dc3c5edccd26b48398587c1e292d191b18d193afd0912feab205597cdb553b58d1ce6e04620d74d62962869325c1a8f0bb35946dc692758b0f5fbeff84a10841e071bfe2f1aed3c5cc183404fdd78346496b97ae11502eae63c48dff6890688f2eec9f89c2b209296c8bf8ff282d6ba71a0290c58b427ff6f201ad90879b8055446366adb94384e4098fa12ec8ecdb795c509395ca701ac85a685600c1b6e8c7f2cc484afebb6efc0f354ed5126ff6db6f0954ee15e0b7c03188ea4313e07f5aeb8c9892ef3f1304512288872c0969a7c4bc5703240e472e8861cc1d2cd8e6399804dfc9ff7dc98f88e199e20b709771a803cd4338b1480c2a573f2092bcf65c8b993c2d98600d80f155616ea0e6be1a010572ad2e39a2c971d72fb326dbf7cfbdc60fe64fa3ff01f8da1e0270131be924363cf1cd1f22d8e26ce98f2300a6b440b74f5cd3edc5b5ab40eb52a5c9e1183a02cbd27dcbbd8436d6db18c4536144b7fefe45644f1837dcc6ac9ba5916117386d07be0f21c4fbb96afc99d8bc4419cad98811d9f916169ac39db16d635cc9866ded4d5c41d8df193251cc03f99e268c9f2adc354fb07002c4b76595e8a3c5586709331fa9eb5a1c5b910697f57741c0d255af2914c0e2430a47225071bc7c549bb4f536e0641f4e29d61b3c1e34c86929f7d7ac10b5973b8e00af1472288504e572effa8f6b9c415a7cecbf4695a1d6a416297c7043ae770ddeb3338fd5f13a25c538ca67f9c6e5aa34511b553ab9098a11474118ce7a6c984dec83b24ee98c62e38750f56879b0ece76fc0a9b75af982f492424a9bddee20e006a266257fe3629caccdd0d120e5222b2e9fe2da715f42a5edf0370e1d657087d4f8a127dccf32b867c124f208120563f0dd09514062b6f3d87f2188e74e9b670e4f158bcdace9c39e08edf9bb7aead1c55658ccdb1093fd3df4ad1da635af6b47caae356bdf6980ccfb0420f5b862ec4aecd91c530ed08b02bd6c7ff07f9e9eb91308ff357aceb9ddf56170e3fc196322dd326fd21ff41865678214a177288dc5c91dda6c083a7270f389aa7fe8d571d5d99c483146e5f4580015524aa9eb4f547fd414aabc077bbf6fead77fda191c5483ad2d3469612e713e3e175149c205384b3f5498b4f73a7c529aa061791514294a153cacf59ee3d1e8c0baba839eb080d556c7ba90d6e0dbebdfd65ca78eced8d65bd092055d44d1ba07ee1c59d512e9bb597293723bcf884ec2b703cffab5461231be0aa455f1f98b8523814827edd379437ae8049130e036ef6f80fbbf0ddb3320bb1428fd1c5949293e86286e2f8734d7f7a64ea4f91bce2d9d5191e29e3b26190c63e59541cddbd630552387d6bbe5c7daacb46136eb0c97c20023d5491a8fcb93ac198e326960c555c869895f03d5d2fd6b1d22d8cefdfc6a64bc1c52e5d9b970596979a47954436a580855dcf0f576489ca36bb90ebef30ee97d0c9240fafe8196741c2399c663e88d62135c8a5477e45ceea14837d3d77e68a9a124386bb0585242c692301cae40f01adc2c2a84068647178a3298536b93c8b38e4b3d47752e5a66b4c0d3dda75fe997a279c74eff449134b382b47a3f3bd0e709abc6121cb0f75369f938100187d36cc60f3385d7a70ddbec011a3533d9f2146fe2def40cb5ae675a88fd67dab40628871b36229d3356576b664666fa0892437d6450c988e99e70b1aacb5c7e92aa2945743e9f8e032d6a6c8fea8c2a823e0fcfa83c3b3fad3fc610a2b81cc6342002dd7aa6aa7c6e255caa37c065a55cef9009052650eb0d5649bd9b6b15b5bcfd5fe8115e09ac28580934a0c0570a0570b2f1082ce46af4ac0418c7ed74183ce2fb3a0cac9c0d3e8cf8cc74618c59a8a30596376d8771bf2ddcc0a093e29e973ef3b37a7568fdb355a44fd329eb12729888819f52e9a6af62cbb25a76e11de4379d1857e6ad6878df538b121220582361969f4c64485817bb583c524d5fa70a9487a2fe8db58dbcc9a1593ebd6ff99848759c79c343009d95dc69573b58635862e839492590a4c222df1f8cd22bc854cc1cb3b66598bf636c16e83b7547c19892881c140c05146af28eeee4e79d45511ff9c56dd509243944bcdb2cb3e7a83c14921d3a28a9fbb8c8acc0f500ad7ad35e4121afebf7939a0778169268de0ad3bbfe75335bc36b1d9d684e30dfd26b10f41589c18c3d0805c9ecf77e8a66520672d28ac62dc0cc2b2b8b6f09c690e62d0b91e2107137fbc8ffb8115d813c4ec337dd568ac9baccde9efa7ce3b6cc749fdd2f24a80daafcc2827bd04077bc2da04787c02e6e8e662d38217ef345e056269d8f17aba22166c61f5133431708c3728c79c9d898f874e03c5246926419cc0a5245f9c3203b041ab5dfc4381ca369e7d04fbe310081a3d280ba028f7301190b1f044cbc3eb83157aebd88d9b43f00f51cec55ab46a73482a8f14dce80ed39af80b38d8f06ff60ec6bca4f02f8521e759246c20048742a2ec6032f8a13286e5dc469c0e7360e1a133dc3272c79d8783e2356df2b8bbba0664a94b6d2fb5d501deefecb181d4251d9515041bf564657f857df4ca2714babf30917b223fca1dbcf3ce933f3858662777677147b1369970968e698d24243847110f6732a9002340244ea0b96cb7e11e8270478d8b8322f17082d6d3e92b7ebeafb20333fce77da822c67ad7f707fb0d0092c6090e7671df12089ab4cea7e57c735fbd170eb1390f45958e98da02e55d93f62edb00f2e19a1dd1c48ceef44f330330856099cdfd44a869d18fc1412768a7d2c79ecfefa02c0660f1f3c104e40e6df3bdccd7a830a09e11b1d7cc621a09874a6e9a12103e20c5af88467bd408c510c32b4a813de8dd2cb08c5f7205b9ec90fe0e37e212cc43eab7298d7f828170d300fd448df92e3c86d471221095612b0e8942be580c23889781fda641390d32ab7829f65f3107af6971b5a064a7adc58cf42be9266ee21ff009c85ef15ce07b1496542e2b49b0236a740b091082f21c29645e5bf2616d983b033b2b76114f54dd0aa920c9d68dadd0dac336900f95569a8b064069cc5f4b25c4204cc5afbd9b1fab7269d346e415170a69a5721216e5dfc8b0656c6bfae9d18047f4790b72de1b3f91e4b99353c08d9a90674457729d3c3c83bc6bdea64dbd8d023569fe30b7970af04e5613b9004b6b1592f5d7b6fdee7244d1648ad60e1cade6182cdcae3a7b2a0dfc5ae9d815a61e75f6cb69723061c0f519e8bc065288bd9aa27e065266cc9e98b930906a022e24b14fa35ae5ebf22254acb4faf4e795d02e39b51c0017bfab684abb33c719409112277d10f522e31174dfd5b06c97aea490212667c8f39407508988b0b78fe6accbe2a2f055eee893e182f40b3f7d525914652342948331f2e53a0bcbad8b77f89528ff8c1119a22df98699819ed1c7ddedd04ac2c2e95a7502625a0f31b8405b58ae690b8f2a752ae149e32f00c34ebac6a3df2c0f96409c39d6e47c641c8e942b288708f7ac4c516c69a96af2c5d4e650f8dcf1fdf060b2bb0ef1295128d5a6eb5494dbf78096058d147086386c6a81bc275d9f286032576e5c312d151af62fd8e69b1fb4bc76aa699b5e14142eff64c2fb3f9e3decd86eaf4eb9593bc651c37c7f678b2033dbe1efffbbe430cbfc21f089b946c66aa0e5cce9d1b4f2c4eaf94685418d8577ad37c2dbf9d85aa855d077de7f94fe573f82f0cc2651b2971e342cce9a178b3b4fdbed3c6e42ddda70908688115d4f9ea70253e03d1e239ba7fe49273fc3edeba73972327dc01705576b1a3d3b8c9edaef97146d9118d196e408a96f934965e4266cc2805b4f77557576567946ac12ec0ce5debff9889ac8f1d6d90bfb80a15f9fb1fbab9eb302cec9d96a2ac566b1a46ad57f9c465cc498898b6ebb259089e7ad1a14aaf422f388fa0e6d4a6db3c27b0aebfbffd87ee75291d768bb32b20708c9b5f019e4f8d27170027c7e48325a05110b312ca9274b664c84b1a343e7ff8c83003ac3f8437ed3f0b515958efdbf02e54b8ac3844d41dd44fae1bfcc186a84589271cf91c707dd8fadcec6531e0f5d75ee69d63c324ff0342117d5bb10d0595250412b175cc0618999dfa86ce31b401ea184c064c67c66832058e186cec39c253e3e686889fe9bf0a863e131fbf6529e08869cb7abdbd8999c9df98b0616b8afe3fd8e714afc8fcf2bd941f6e7a1b82afeae204f6364e68bb8ffb13299e218e2e8ad6b18c64ad0c9a9799c870006cf757a4240ca4568c71d1ae9ad5415e21deef6c3504e8e8aaa9dc68d744471a789d939a5eb8a3bc0d8d3dc3ca087b0d30309772caf87b29233a60f24e9bccea5b9eff34367f14514fc0b3f78fba98f3c8a3b13725cb8b05ef8074d9a7e557153d8885e3fbc26f402c71ceaa4dd42b54790ba983f4d8478f784628191bcb12ecf45c391065c53959e6da1159a2457065c101e3071e1df8453c63c639c4c0edcb116889f249c2156c9179091b9bc26a5dcb1c71cf3946f15f175048fd41d7a756c85122a912cc7594636c1fd7b9adeb0b94009f3520e9a6142ebeb1160825e85112c82e210d4a834826b7b4db25fa26cda3dcd79c5163bcbfc1efc044f1fc8b6b40a313fbcf45200bd25013e1a654cf764aeceba1d9a2c01a79a6de5af84c2e55370eb2e15a87a392a17e0ba983ebd0faff136a77d99b723ecb935b4efb787e66ac65fc0b2beaba2368df891e4c3a4b7c2fe8f7ec6a608ca638f089f95c26d6f60561e1a3b245453be3a58761e85114ed8e725c18d0c8ed535c6e5c1af26008892248d0ccb7b0c7806ad6b0478486ef8a996072650b9647fd466ccdd725a714a447874ffa57b338e72f49ff8be1a3a004d9fcea039cb6ac3130b0562f36bab64c7847a664319ff9ab6e89f70e31deebd887af11d40cd31553ccb3e1a4173137f9230e50ce873f6c9c2edf71c145814b71d6e60659ac0ff5da601015e5eb838d8893289d1b7516e559187b12d580d13ebe8066d047a21553cd95c73cc8e8df004ef43e0f6db1eaf2ca7cb0ad2d03d38fe7783f09874ce2beb5de7a425bc4a2c23cc334f5562fa8c009b0e2808051e43f76af0451458b199c2d43441023f9f8cd1a2d337c184719162e5a80ee1e469e14f06e2f86b242c76c64f199f61a4b407be136a436d4330fc13abf363d92f98fa86a4cb28b16fcde6ee35b5c38911b45565f8cfa0981dd3b2b3d7821b739f49a96e52c1daa4b63639b1eff5fd4a4b6ac70f0e8219e43fce7c005fe3254c77d509963f9f2886209135710f192595ff03445c95d1f4f634ff80536d286098e55ebdec72692337d8078ca536db91b9cc0f5761c17e2530b5a46b4b612fd89ce25400f0c6c509f72b09678193a879e8b9d8c58c3e7f3b83fb911562486c6753ad828eb740342a5fddcd92f49ace9874c800ea72bd7f66c9dfb826eb120bdba72c9fead5fa0adec9b33fd5298eff041d208b94c5ed40645f1546f02d594ec3a7ce4c6495f85f180fe5eb8cf6a023c8384d2a358aafd126e6fd84d14a89bda0d228177df42fcd0c2dd01e1edd2b280b2aa243d9dbc48d543a436d487e34a53e3790e7fac9882e7e15f77435485efa65f35807b8260cb5a8f733a233d2d70aedb4ed05c23a19e265a492ec2d06612be05209b761cb0d30bfef4b8c31e1cbada752039f9c361baf751cb817e51020288c198841ee4922f0c1e57802fd7fec2e0813b64ee5096e92e06f6f21a250c687020b4d9b215a6f337a23a29705d2e0e9787bf20ec44feec3527aa9f69de989b454b51069da8391ff4deff6c1fdf6634a57d1148a3a7a9778adeac3c4a5fb036b9a4dbf507f45ec7ff40ae0380e848dd7b11e07ddcdc0bdcd6cd9dd67336e78332b75f0067802bf03dc10889221b025cb33186b6feacf88ea9e6f4e732d4661499994909fd8b2a591edd6424c077d894dac721917c81c6683bef68929c09787622b9323073d2127217d5a47c22a6c6b02d45e12512af6c195defd6d440397f6e4ed3fbad7af57dee253d330039c2f2c7d124d2838a39f3a9e5d5265b4f77ca61c969a2b144df534d5512e15411b3e15eb8ef0b32ddea1dc4914ab2ea3ad8e9e299b9b700a8f3bd422da95fd130bf5d7cb3141c042ab601b8a448d22bf96265564a25443a996da06221a2af6bb20c3bce71615c9f1cd6373ca12a2249c7da59cba2e6bf453e6c0083f6231f41c06b9bcb0c3a08c9285b898b2801ae6b90854dfe9be302768f520153e75f881833a8c4fd5fd627d5a46308d37634da261fc639ed6d34825a039988d6ca3eb5028471e346b5cf1daea53dd0a235f8600f88f11dc5f73e406b7811ec23b2fdbe52b8197ea05831f73b7d6b2b3a26668e25084ced3603497c2dd835ceb88b4b30e84ee6d3e0bad096ec0587523b002f9e8f18fc9341fb4b32a7a40f81262b54ded7d0d52c25227928c4579ae2d92edb470ecaabe94cd0e4e76933ad8cd817392c646c9ab45edd24d96fadec1c883727746a9098ef420336131712f579536b5c6ba76d2ca0ae4d2c60a936e99705f2d1e90403f0f8a23c653e0cb3835c6460f036bc028bec530e6d8f2808e3e01a8f2ec0d4296b65bd9c98b5246dfe9a2d74b990e9a49fc47e3c31553e809512f2c3d5e1a9decbc377338c71494793eb6d4cecce6c54d162dd9a00f2edee6a02149965724b3a11c2b5ece31b1e91b10047ab03e1cf16ff005ecb2278a05ed7464d07234f22ab7baec21349188eadc92888816fc6ef1206c10819d192faace854c0a59dde79e7481d2723955c5909b2924038f24ed1b55bfd2d6ddb6e256ffad58ddff825949506f9935316108b221d6ebd457d8a91842055f30909396cfa1844f921e15d2aa7c8c1e0a658e1a667d6d3f23a6f2b74643e93b48ceb65160511703e9773e4fdc8751650bbfdb6aea7433dd89979aaed059ad78e0701612433d78eb2bfda370a5580f731f883a4a9a8994dd5b7cccb81ca6bd19f3e01ac851949c58a1b36bc4399892c7b9d8ce1b818f93f00840e05a11e02df15e8f7e0f6be6ba9eddb5c286a70d66773762dc65a32c1812a2e263e7282b3770105704022494973bd562b2594e8902edca5b424cdd79aeb1d49f447c057f3f2743d5a646493b1e5ba20a3255ef6016173e0e0c502519a562045b24ab535f6ba81f25496c45857f8c182b1e3714c718bb5f605ad24d21da803b09fa38d610c9d85d40470fb6d6dcd1601d190d830c6db9cbddc656aa221c66c1b4680a29c9eac8c23c98cc84211078c3e9a035c8a752681ae4534a87d3ce2c1139a1d514026950e9cf3f2c93212f463c5348afd51811c2098042c4cab49b8c039a8be850381692806ed7eeaa71f12efa0d0c743ac95ed43fc1ba21ba58538d1be5a69b55a33b90e2b0ef273eec0db0cb5523833c9ea3bde3ac495ea8dfefb842075048b65a4a27f815c3c7e61a984556e2c981d394724702f5210ce51e716c55d8dd5cb2c1e4838f4385cd1c62c1e7abe9f96cde42b562c7d13fa635575778a47e73784d1c98284695d5dcd908ee7256f7baeff26d8a1383f482afab04d46d7bbec479aac53b8c479a82cf617ce856653b4080dbe118fdc03da6e1eb6089943e8bc80b145b1e7f06fc56436266bd6e9802098b51e155138aacdba834b24d104c46dd1964f7b11b73ba51a3b7b6087c01dfc677ff3d2052f9cdaec41929347519a7db8d2590f800fd2354c0db458958e81521cceae5539d8c02d189e226e9718020c04eb25bead0b8fa4cb4bcc2b3b4852c3545a34bea388ad347159c3f38beccd4912313ebbeaecd8e27cbfeefaa3a012e4196161cc33e646d78bff0ee66147322f118719e888e234b0092bfb5e18c8a9e8f2d8f33eb44d08337b51c33ce9cceac0ed6664d0452be07cdecc846d38f5fb95c2106d5dbb41439959b1b0604e6c8b65f700ef2ec29ad8237a76b3004ce0bc064e40e71cf7bb62b4636099f556380e61051d9a7971e5b075a68d1b41f7b84721d78ae6ec462fe7896b3fe7d1caea38450fddc568d4b81a142e565fa409dce678fde3ceb13e4bf91654746e250d4c619cfd64e77b78c94c1a1bfebf29111cefb43056c991d7b3a62bca56b3a9cad42f48184f961b6b30c24cb50f5f821877687e09167e193b41262853c31419890ac53cab3cc43258ad8b8b624508efcec98b1a90f7b2edf53600b75d1741df381286c02ac66e71c37bcc75bd4c521b1e707a1232e1191ed4eacfb354b2dcba9bff6a67c7bfdb211715493819577b9fb34d77671dab4aba43290987a22951134ad9f0583ecd760498bc562110a5310ae83c977bdd0a50c8fe2e36c7be290fc3db2ed2700955b56574010248ee32bfea6b43209f6ec684f0b9cab24cde060bc70740ae610335dd29ff06aae0a9fd98b9eddc89f2482190d47c637906e6f7237414f7106f4be4476a6e707c0c1875963e71a087554deffb12357141904ee97c4f0886eb1f872012e5668bc11fd515a2ccaddf0b402c74a8d372b9cbadc1c6b220f14e80e7149e985773bab2824d6111e8e65873c8cbc961916b6004a574388557ef48b6604ac67d72ba9628acc5530a726d75d6293b913fe7fb0238da293dbfd241081cea28e937b04d237071307bf19ee33ec1bf5e91ad1c3dd68d5d5e83e1088f4199e296f69453325a2d88c3b023e11636346b627ab02fb3a014e6dee0a9c9401ec289f10170ed995930912b553e7ce99262578953a23383e174bde227f63ae9ec2973de5883a230a4886c89b2fd32b8327a5a9f764b442ab50951c9f48867a4d3bac6100a85096c80b080403e2df351a6c656dc88d9315522d10f5cb8f22ef865f6534b114172e9560e2f8888b8e6bb81295cd686f8fd55c41299873ea825a6ef7e491825b1e58a8f356e87dc10a6d4046a8d0d7f1a304950198d45109ac199201e9a5be78ac3651f132870304d52960c0b5c349cc1438d4e234c40bcf830956e731e8c5b3bbd3cee5456010949bb103e3030dffa55b5c8009fb8878f2b0d6803305fb899b7b644343e23026cbeefe63f440ad3640f3b9439dfc5141a3dbfc0913e917828421779bd9c58a59920c400de019725af3cc8bc91339e79bf376cfb04cc31a4bb5bd51476fc0c921caf6f35dc5115a4a31a4e047a921c730122e14cc85905948491f6673301897baaf52f36e21a9b6cb9b71f505a792db74930fa51226a465af3b708cd12482c9eb163721c63909fe97c0d2dd56a684a4a390f5282f52d630c6aed1723294ea45e30bc866beea4acce1a9f9277a45070106c43934cb4f5243e8051c89e4eed61353f0f9a0c04bc8caf4c78058b04d1f700d81ad8de1764167f608494c0c18978e4e0cd9c05ba2d8709d80a9ba3645a7e4720688cb7928063fb5e2c0d692a0e54d8850398262c4357b625fede9d63732dfdebe9867e4ba097de97af15f49544065177b1dfa682a71a387675baf505fb2fc1ce94275d2b14dfbdedbd849e065f9c02ca1832376a8ed2f42c06789f3d6f6ba868db29703b15a9db5534184b0484119fd390b6bf95af105dfe87f69f70a1e8bf072a6683bb755bb934bfd81f8cbbea1dab971f50224200388f8dc402e22eacb625cc05f5bd8e635022e0a092899d7844b4bb4b21a026932113001c6492d812470aef2c6d5d7a547b020538d2b69147e1319a527ba26ce8d80e40e71317ca5b830ee0b9202fb90ec8537bb5581561b3c9650ca347da253e793ac66e0c9b150f43a2f149201cf85a3bd681f43cee746db3df7da8dc2edbcb3f9327ff62d6f1bb6d3e1a90e5b8c6236b0a603961d8a2016292a0caf1fca81740f2b7f75452f30a0a81b8dca9cc0ae44add3ec14cd998ade906b16b77f38b63d3a67835744c919ddbe20f42cf605a9e817c9dca01391d4ab187c56e848f97b4939593038aa784863984bd2c777c33b173247dfe5467ee2f2a95fb87f5f44ccad546d065f020c89cbaca5d5e4b333f1571fc5633cd8f52bee1722422c7544253b818b6cc074551c900370fc19f43cf585327f6be536a641262eb75fec04a17b0c58047c313e5dc08d939cd83b4b6399c6eb8dad15b057079c7a06775906d949f91687c2b575b7d6f5f218abc1663ff1a51ccbab6de95c4187dd2938ec22cfe7d8225a15a7403990d66a269a6af507d472ce03e9e6b18a54431448de3d04cc71c14bd8cd9409fbf510ff78790cb03e9f533f50dbfe1dcabe4b4c483c8cf132b44778cf49f26b664158dca9c568aa7e2292256982fa69414fc420beacacc292a95591db1c9d5435dde4b7dc96ff7fcb5d7f22a50d8f46a378389734016461e61ece058534d2222e5b489b2c28ec80d7b7e18b3582990e82884258001a136b1d22e091a4f0ee7a9d15569c207fd51e6e20e3907a62b47efcf8e3b4cffbfb1832ec485fcf44a16e559163e1d23617cbbeb10a45e5edc48ae4f543d9090b1834c34abd5228fad07ab9fff2d116fd7c17d9046a1a60a0cd1bfde28c936990372f08212e781b49d9039f9174be1f973a32c4e120691e795f168b92e4b7e272cc602ea38327a5a304c61b53989c58f799d0c0e0faf22e45190a5b49dc6a1d625e0652686cb5c0c7d9c03b5d82330b2e32d4030be6a6cafa44d152c14180847054e84820065cda496c8d3230d60753513a37db5cb35d182d7dfa3df429b4899a40c96070f082e0766880f619a20b83b44081d82ec521bbf08538488a2f0ad4942ba2d094edbfaba451419f1095fc48fbff0e7496e44647433baf1a410e41dfe72e009c2fded10ff6311ada828c4873fbf5d28264f4a3d09ca932c192457ba2158f619766d2ce6362673c4b74fd16963f149d49da29438b5f117850041100443585b33c3aeda9be1cf6d22d3c66f9ae8c60fe24a59c7934e10ae2fcb93424fb28fe25bce958f638fdf9f1cca932678db3fe1237cbb608fc9c7753a3cf6b94992097978fc7789277df8228cf1d0e3d9e357806ba2ff128febd82c7b759473f836e6f213be8db69c26513b3505f96944ed9ce1718733d6cca876cecaa2da59d676daac9dbafcda59ce529c6f5fd3ec97a6b6d257ba3781a9d3e4f04deb75e3d7524cad6a0ea69e721bfe20534b7530b54e4399fac96df87f4ced24337593dbf00b99da83a999dc86ff832966b94ddcc247f8c52a3fc2e88c4bfc3d5de9341bbf9b8d7f668aab29528130452233dce336fc3433e4721bfe12a638858ff01f99f853e05bd8254af9a0de69d6c46437cdb41b84a9f79069f7ccb707d36e21bb3b98770799777330ef2e4ddf31d33750d626cd708f26d09119e8fe31ed0c3fb4d0fd322d99749730c71ccee270b9a7a727371b5b8cab7439863fb761dfa009fe19fe46aed1376e85e69835fac62d15cac72fa2f826569111230e96982d3438ac22091b1a8ac03065061a70f8c35fc8e5014a09224939c3b7f0e747f8b59e85bf1b54096e4b6648917d863f99275912a5c0476859c5b00273c52ac67ae604ac7dda954ad799137a57db68f420449b3b3cdea8a0048512c294b0e629ea4dca02f8d65a8b8ba094a7bdea00df4e24d064aa593fb29f575b3b4120da5e3b95ce99056b2278086ea32a5b74a0828507ac328983044af889d055f3c0c19a076ebb698bfb1ddc57719fc5fd1a95d27e05534afb368c806fe0a38052d2f011cd6b1848954342ca1a08ee0d1b8323e56310a41c8a535a54cb8034237a235a0bfd7673e028ee35fe8ce66b7c6dfe9821bc5e1f804db3b516afdace75eead91816cff01e850144d8750d2c8f64f4163d684a96cffdbd0d00d70ddfe493d14457164a7d7d5f617801351107285ed8f82545114a58104cff60f0094d7151ab63f062f1445d11c16cdb4fd2f88d1056cdafe48562f1cdbdf026dc6836efb57f09ba365fb9ff0a128aa036666fb9be8a128dae3452c6bfb0320cd5868d8fe2574288ada70c234b6ff518aa2288f1ea338046cb2fd49fc5014753a02d3b2fd29f0a128ea430a7966fb8fe8a128eab4c2e86c7fa31545511cbc91ea86ed5fa4a228fa84054bb77f0d47d62ab34c6d7f131cad6cffffa128daa344511e706259aeb6bf883c435f59e26cff1079455154aa041059f46cff09f28c084c4b8fed4f9467aa5eb2fd693e14456f0cedb4162cdb1f04eea128da34b4825ac46cffa11b435ed66cff998ea7b5fd3f0ca511b5e8d9fe1e7056217cb1fd857e288aa6705e33b6bfcc87a2e88efb82d863fb77f01e9ed792ed1fe42b8aa24fe516aaedcfc15514456fcc68e82d69b67ff92347d09638db3f964a6da961fb035dd584ed0fb3114504b2fdc91445d11c577e906cfff1a2b32a8d65fbffd810c56cff178eab1facedaff39aa0d585ed2fded8d230b67f68e327e6d8fe20d2ac069aaf0e45d11b434c1acbf6f71444d34bccf6bf6509c24c4e79774dbbed46e2fc659e34b4fd6d88429bed240566b89600eef726617c44bf264b19d66f6f4ee38ee83ff18b38bfccf0c50e88e03bebefb02d8c838ca2fa55782dff00438c2f2d3ff8e287262d83b55c0a47c2b6fc38f0459b9be1c01f33688622f8187c9cd338f0fd5a180776b598e906a54548ab33bb295da34e061a4b9fa830fe9ec040a5098b3e277252244ba8dc00a34eb842c5e995b4a2a9933e548290413add939dd1e703a582e4e521d501b16243840a94d72f0bdd32870a16ad75590b10181a5d40f287d26083ba67a562f5c2ab88b2598afdd85c31e3c10234fc758999033b01f6bea440eb972c54f6c0c254468e181a4646972a2f622156305d020a0343499514d603d11e9e3a799caa38e110652306e8c7a64f951ea3aaf3526508a851a63bbd3031821c014ac330515d6290428af8f9c884c91293638da960aaf4783981678035d461e191b2a30a160cd4812a0c3d4daa6895413d7506fa65489518c65bf5c34be2c0a670488113933d71c10efab260d2b5ce0b258088fd7abd5f183a3b22b00fbadfae6b6d72b5534bf487b5b6c0b4db6912650a63c390307cb0c2d8d074ebac59e784d97979a1546dc870f991e152c50bfa998172c5646a97a6c34ffd81e942060c971760baec762a843d1878903d3959705ededb89a99923315e3d334676bd3aebee0591c36ae60a941a6787e7f5e343bb4cf5ace8d8f5293fac5ab0d61f3d1a3aab6c563e3982449c5042af471a29fde3f106caca92133d2d2e5144d4ce0d98cfce932b3fa1ee0894962a71ede1325aeec07465806429f38425a54aeea57360f8e64059b9fa218166dd9a1c6ba4585913d4e325a93164caca16a8fa96a82c5cb1f21383502b335396cc287132e3a467650698cf55335050335e5e693b49ae63b2b8fc3746ebce3a264e94315a28939ea94e18b542d342cfaaf7646506aa297bce78286521b5afaf5c7844d6ec13c5be4496ecd3ae1ef669abb0cb66f7cbbb44b54ee9426f58272a419038144b05cb073eecc33eec3369341ad1041384082142c49bd934b15f33e8a6faa9d4cda65eddb6bbaeebbaaee99aa6699a5eabdec5f26dadebbaae6b9aa6698a732ae24db3562b2a321a91478cc07e4770f000df40dd96fd71e5df6fbda9cd36cbf7e94e5d755dd775cd6b51adc8c868c4080a282061cb361bf66b2b91748a729d597d2fff3cb0d9fe67b39fde2a7f33cb75739f7f6208e65fce3f9c7f4646d79f02290a966c7f125324c86bdac86b1ea925728912d86f090d44d3e0e562e31a18dbb60d8a1aafb807f6c6daa94bb007ea6cfb04c1de098e00da165b6c61af2b298091def324a197068e40c94159da20b6e53dd97a6266df10dbf29e4411b12def89136d5b9eca07948a6dcb535fd822b6e5a96372a862d944dbf25421e26c5b9e3ac3890b591719da96e7a4b72dcfc9bacfcc73126417008e7e916af610d54f93243bc4b6bc264d3c263c2677b69a4c32f942db96c74409886d794c7000c1c8f1270644d30068e307dab8769620850bdad1da27ea80ad956ec3f82db6165b5992f537d6262d21b36dbc1f3f285da2d07064007d602ce53022d5e6cc963a3aa440d9b1945b53aae0e68d53112d310c19b5eeff083d7c68fdb8a1c48ace004d49f6fdec379c91d48f2ccec893dbecf6d7a5079a40c98a22841783066e8332328ce1e211430e8b4cca2e75b9bd0c31339526c90e1a5e7025520b303860efb80fbc616a4e0a679ec849b284c8951b76e840b1a460858a0f900d6e6aecf4204923058b9b13b25ee843278f962724b9861ba844e9d284478e9d3e67c8e0e8aa91a686902b3edea5810e35bc3d2c1ce1d28252931974f6f4518247891e2e180d5461a0cc4026059e8e061a1e18363488e4bcf4e1f3eab3cb13030d4c685670f244043b17ec3411f2232523f2b9a5a00aa131a6851c5242392d36ec18b32463863c2417942a43ba84474756983725b0a0ba51edd8a0c347cf807d31745c6c6c39b9c1e65962ead36381c7025428833ef2940a89015da304e1012506a82d60b4cc8c31480088d49a1c8e1856cec4e498e0a3890d1e43f4cc10dba324830d9023768abcd0d5b4802168b46e5465edd070613d575db2b4682c6561010912f5898d3d4650d0a3fbc00b797649d85ce9a304e7d9412faec4a981c99e364d38fbd603229e385578c0ac2908794203777e0aa51c1553d7993a582618c1dd47ba7c2c990dd8c1eabe5954d0d3654b1b2653948a34ad3193828e1a5dcae0eecfac2c98771b8c2c210c43ca8f4b6c4832b325204c7240c048532e8981c5d07234c64081ba602921974c0012c375471767eb49d52f0344563729d488e3630d53950f5551258c784986790c8d557dfaccc6a52cb07149499078e7c58e25ad5a172d3bc4bb44063a9ba185c38baa9810a1d19ba431724688151bd8cc888acd5081f295185113ccd05304036d46ee45130fe29d18363a7479628278474618a318738648fc82f1ab41aba969852b15d8c127090b6564a063e6051ad997177382dc05183366a38c26b4ab3563ce496d4619a31a1f988608c978f2f005069f204ca62a0618302e6876d89249c145f3f2dc3096d896cc102c9bc3b6648624d9e7cc470014f4c2438ce825470d286a48de14144819d1876d7978aaf478219d947ac4b1618a173a63d4e0107f2a5a90f1650f9b3e3c2021d663df7240bcb34fdb46c0551e1b51b4a8f8ace0ecec2ba74a579e1e2dd0b0410b97012976d8a07af8b8f025012fbc98b1848f9116e47c09abc008d9f24d5941862e4c706729c2b04d6429c3030cd31c1b7170f6ed06c0f007b0558e17b6e2c84be92b94767f3ef252fab6bc24b91daec8be45b8fb8619add119bbe2873510b5197400e8efde5a25fe51b5277e1e016cca717c0b5b8180144ad8933013015825d0f823698e3f5ed8eb0d833d90693788da0c647b7c306733f03dfe6bac6dadd2f6c087991ef60802a9f604f817f4294f10dd3fe8388ed864cdda13632dfc1faeadfff51ae86dddf6faf031ad01fac3308cc1c1375c06b14170806ded090b7b80c55d742c350fc9d6ceb6766a18075a07d65a80293eca6f410ddf6cddb6e6842a4cb67047a6d695002f9cb0bc8821f3bb34e8aca0832125630ae7e6afc18da1a8496c7a972d79b85e24360b30038c16eefe6ea02137926e4ed003874d17564f0d56a6702494088223496cda352a6851716e165de14618894d17fe864f0a707024fc8841a1a9e80a4742072c1cae8930d851c31523b1f9fa71152609ce4dcba50d6e04140e9b2e2e9c150a8a23012351c281c46628f5dbe1c38d412436c315507831851b33f60bb31d3c842a0d45509c9bd60b131c097e71960bc2b8d0c3e5cf79c482c385cb4a2f255c4c09d7e1957042af84fb806b340ef087f89570fa95704ab8f2957041af8493bd12cec32be19470f63f98764e69ceca2d5907f3a1a4406a52c64c141db4c047fe25d694ef7fd50f40e4287fcc1142d895b95b8194f2d6aa004086f2bc4f4c3b250c6536af0e1f4d3129ef9320a4741dac61b44627896efc2fdd7e49ed44aa3abf8d715676e3b62eec42884e695fa84d695f05b6a63f688ae0b529a5ecca909c1265cab0967d19cb6d2088944ee519feb83c4936c33f757eb036fee9e199d5deb3f1e752944bcafbb21f5fce9344b81498cbe1dbd1e307d3b02abc0ad3846196dfdc9da96b8f8a90ca6fb7cecdba6ea4fc76d384507ebb577e84577c0b618fdf0060e2f183597e3bf1f841377eabe0f1835d218a6f163c7ef009df901e3bf9ed82c71f36f90d83c70faaf8168047f1f82d9843da27982b013e9529ac50982df011fe00981ee023fc189897ca8ff05f60de2abf3bd302f3aaf8087f05e66df223fc274c00c0bc527e84bf8429e2adca153fddddee3aed2e14baf167aeac991bcf585ffb1f58c093ec078000dbbbbccd003f03ec9e71b0274216af84bb9f9ed6fa364d8b612d9f22601aae41c07160cd621d762dc368afe374dbc74e595d51aeb015f9b10529bd76ca664430d8858140340dc2edefdb6b2705f68e6adbddb6b595244992ec6d24bd750fe73420a841321cc3525fadb50581f4b5800213caf363ba768290413795d4ed4a52b65f10942f52afc86e1bb53886e09847ec770cc10f0d11bd1a4a0f53e5198bf576ecb7af88ab7d5fc49527f9fbdc16cbaaa1b4e7dd9ab600bc633e7cbbb1ad55c676185429ef054eb15f8996b9d82fc625a2978994f8c8aeb877bf3db2af758994e50d12d2c66a810f9a3133c8a0d2c0d91e94122e19603c695205c93e0b6c1fc97e0a2eb41b25be37042b2eed46e93f922190019a946ca0df5b25b82d17291f9b167e7e70db17ef25c7b7e2b5f80133a258ac4614012520ea0b3d3cbe3051c302cefa51f9319343ed24776c8ba675b169fa479b1108e4c6f80510559e331c9e220099d9dac211b49ee11951074898b9b54af2c77f3df976bffc453ef9fa4752fc2b661c92b56b6d200edfc5d79f10dfc3c79a7cbd6a44e1e3d7abf0d9ebb0d681fbafad55deabc13547e09704e0b53617efe90245affbe3d349d8e2e7fb27f467d88ad75f2dbb1be420811a2452ecfed820be8b567ccf2fae00b75b0c14be0adf59b4f662a0b06641705b23fc63b4462af0b3904929ef9f4adbbacf6a4b1a3f0b1327520d9f642c4989c465e3478154c40763fc4829fc5ef0c568952eb616dbd8bdf7c6624018871cfc31ce3309d77d862b26e87838a979b3a3078e17aa00b9a2068f1a3d53422c613ee244cac53a25a6284d2b9ae7776587528c2c53388a3c95c9c2b2810268e30ba8d199bf915a612a47560a2500915a75dbff81ac329c92e099928294295a098ffc630c677431a1cf6882e64226460cb75104ec62230968b43d9cb1596802478bcc13115e0bb813694a1130c976725bde14de141b7540f0158afaf57abdb4183ab8ae29af2dc59081c245668aefba0840149e1f8e840f3edc385ae1481871638d4978b7d5faf5faf9f9f1e7e7e7e7e70441b65f9fb7ce4fc334fc79e35a1653fe3ecbf7b7b9bb97315f4b34bbb2f28ef75ebff6defc17ffbdf7cb59c6eac881df6c15282b94ddbe9f813abc2853971745b7efadb32fad85c54779c4663647f3f15108024f79e67d5b6ca4a5f2e98310cd7f963821aad2be85dda92025a57d1042374afbf649739c990cf04f7a51826f2ff9f7de8bdf92a1f92020ed35d42e6a2ec6276b2ec87fd54e25dd6eb1c3578141e062fb5bd21d04a41dd69099466b74ea1819e310d44126948584b05f21215208f47d00b366e0d610b867fb83007fb44ca361bf34d0973e39413da552ba300dadc2aaf02ab40ad7304dd8739b876bc815ee09bb42aef027328968f813a7442971893825ea4429a22aea442c318de846c4127b6296e8137b8e3348dec72f6cd2cbda7aa8cd208d1ba47bed3a82ea0e5cadc01e964ea7d3e97461aaa538e8f3f97c2995ae2aafb6a77103dbb9a696333083a1b8aeebbaea344dd3f405fa7ca00ff4891849180c0828162b39640e1cb05f0eb20da2600e4c9f401d38a5b14adf6ceb7f36ae704d41354dd334dd812b6805f6402c1206145bd7755dcb344dd3f4833ac86442421e3c7c98e5d90cfb9d75e8652cdfd68f4ba7d3e974baf0b782e8baaeeb0ae6c0147c0275e05407994ea7d3e9843cacebbaaefee66c0804081a8d88688210394408ec3744368376d64d657567cb563f2e54d485bfdcfbfd32d6d68f6b08844ea7d3e968e12ffc4d104284887fd3ac15e5a222ecb788c3fe61ae9ccb4f62afd7eb893d1d3e72dbcf74659eca6adee5355b8510a1d3e9743ab3565464643462040524320912d82f09525b95bd1996d8c33f9bed7f362b4b8db94a74ef59eed3fca4355ad3aa188a3d50ec6523239dd34cba49e734aa9d74aa51b7f9c7364e718a6f1a4db1d5c63d8c857d784ba3f8a6cb99aa51add56c026d15f886d3355dd3355d29c0a9104c42bf80607b029cda13fe384db5ef4472bda7343e91f2befdd8bd37ebc61fa2b77dfb620866fbd87f484f54adb5d65a6badb5d65a6badb5d65a6badb5d65a6badb5d65a6ba3a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2ac8d8a8a8a8ab2362a2a2acadaa8a8286ba3a2a2301e329a6e23b7b5a0ad9d2ef6bd42466b445e9cc150cca288fd8a98c46028ea577ebdb0df574886faf533929924b15ff287fc216140b1329725f65b92402587a00eb22c9361bfb21fd79e2eae1fc804a2bf0e289387dc87593a948786b0df217427856aa756ad2adec259b80edec27bf00ffbd22727a8a7544a979a21c8b7caafb63fb6ca39a7d9fe60ee85390cb1df30af455be5e81a28c4388ee38feb7cca555fddeab75af5b07c5845bd87a2288a3a966fcb7fcef552555555551445511415c18103070e23643f7db94a7496fb74b5ea61f9d6755dd7354dd3344db14f555555557d4af5ddea561afb54555555f5853c146d95233aacd7eaf62e966f6b5dd7754dd3344dd39f8fcb51cf79fa24a6699aa629f6611f0eaf5f0987ff03fffb1cf8d75c30b1350eeeeb9a8bd75f17f7dd5f0987bf45072a5858539b17f8cac7dfa203152c1c88665f84bb69e073a0efa6d92f0193fc25f0d75f0226618d03f1ef9740bfffcba4d91a0dac41c05f3f07febac6c17df14b20d690b0518e12098c1ac58b3fe79c7588712d877fe69c33066dedfc804490d25a9c33061d6b51e3238c31b6d662077d3c328ef6832d82ef0e5a533441986dfbe0db1a0e9f06eeec38fc138777abc0e40ef39f38e70f901bfcf1c424789e25185ed80a2b92d83cc18db17e91d83c1d481bc139875a7b2e8086adc09fdf5e117f075e04c31063ac01aea1a82121bd604e4a133631a5d1ff98452210c439bf2c2c35bedd1ce23084ad087f4212d4b157eefdd0b0550548f1396fe036ff0ca240ca6058a53461b38121884269f41f8a9948a6f508aef7558002aaf68f167764b739ae01e08492c7679f796b9b010d1b5b4055de325a8333f0f0fc542961dbf278592393f2675b1eaf0d8f5726eb04f4882a63dbf278eb0b8aa7f2a644f1155a5df2784cfb9cd1d1b3b2e46a0275e8448de4c20d1d5c6b74f0c85909e239d2e4709323ab9c09f9e194e554877795ded8b1dbb1fa91dda72e1d7095e38d9183020d63d4ec13e98718a41a25b92d6f8c96a63151e68c81a252ea6d79639cfa8c9191a60cb7e58d411d20864bb62d8f08179e1835cf78de7dfd4ffc77e6e669c9ec7a5b84fb72335b7c947f0caf9933de2376775cc65a6b6f17987736d31a63c7a05b6bed4df251de17d98461a85f76367474c100b67d33e39cc18c6f6a45f2c60bb54730eccd83d9db8e4a1ddbf5adb17d035cdb6003249b4d458a221bf895bdf22d00686f308a64381ba2dd9d6b17bdfaf151b88b8ae88ba2afaed1bd76e66d6fe6701dcc203b0e63f0b567a6bb2fc9190451d81321ae2181b593dc20e8a0e313049206bee79208348d4edbe70fc19d419d1466ed201886b59901bac85194e90fdf1fc4d63ac9b7b5d9ab70d1eab3745b58b30e82423bd794b6d661dbb7f49efddbe5b7991fdd77a6ed7eba6e5391beb3a7ab3ffe64647bd3c672742edf26f00b5028f2d07a867e6d11fd8cab3282acc0656948956ac59560b0c0864d0d17ee4ce9e36ecd9cc101e7e7c2963d5170e7552d60420d3eca700913478753b262260d8fce12a7a52ddc79b74e34318149d695b58522b8f3fef689ad9f1b28415680410ccebbb459b22225eac75b42669f469b7cfb65934f5afd361946cb26c5d0b011a08413f9cdab8c36cfea84fda3994acbc548ba4faf029366bffe46428e9a279c7e6b57e8f20b1e9df428f8854adba48ca2e88b1f8ae2b657f9d1fdeba50bc5c67f4d283d1dc7e8f2de5ed661a9512a3b802c0db6225f2f6d367e109a0993d95010f6628567e39fc1566099ccfd3ec1d225743fa0a93a61e3f720a24a4d1fae283c1d6694a4b4ac676a7052a78707a763a867dc662074d57409b3f1cb602bf06ce3244f55b45c69e3a34a8a2b6d159123544c9cb4783cd160c1b431c618638c3bc05660cf77441a3303b0575b9cb6f3b6acb0fdcbd9bab4fd7f5db3fd6d281cd9fe489687828fc785ca765e971256b84c5605cdcf4d2ab316391b7f0cb602739527791f0c8a7d121921609f28b6535929a9e06cffd9142f8b9bed5a8e6c4f8162a9a1002bdc430c58e0ac702b51e14d1a33172c423050860e93a7262a3876b8d27a890105831e1c3a750ec842631e6094c058e0db0cac152129cf99c5ea604694f36bd88a7c7b1be317a98878579250b0fd43bd77494a524696b2db6bb3f16799ec0784c79b3736943182e294d29c992954a913346170fe98053ebaaf616caf5264fbb8dddd3d694c79ce66332bbb8db14c76c54cc6a48c2c65b7828dadd0d06bca939c11f176bd0c9ec8686faeb4bcddba2d6fa7ee73bcb3ef9bd896b763f2cfe36fdfd956e9d3b292e8076bdfa7599126da6f616f63ce1e5dd2de7eb0b4146b91b4aa776ebbafd533e579811b365edab8460b7b3f5dfb7631fd98798f7674f27c57d5201925fea98140eefcdbf36a55b5fe60e19bb6e24361df0ff3db170bdf2cceb7b57f7e5ab5273028a2c729bfdd26eaa852a5f124cbab02a533dae738b5efd81bb148dc39fa9aa652d569e763fd6105a477b13ce97436fbfe3d41a67d825bf6fd7b8a7bb693ed44bfb8ba2b85cae80ac53eafce4dd65d3ab1cfdbb5cb2fffc5f5836a156bdf17b9342a72895c2297c8a5519dd3a9c8a5755777d5bbbbba3b056e41425281b4923f9ea1bac31db85a6d90c9934ef009cc813930772d2e7dd2812a9b23b087d55ad0292d0ef6167b607be304603fd6682d7016d60256a3f9cf6d176bdfb43c1d4befccd3755b876f7a372bd5b7e9f0cde2a6d4ddaa557c74417005ad808420c2ef87cde003bee29536820bcbe5e3033fda45996cd676d3666dd429d7941b3ad2464612de0e15a6ec9d2a223ea87435e9d9e169ead4e449b4fbe436a87b5f6badeff8fb37fab7d28b247266c48931c38b2c383b7543093e186cf4aec01870f7ed335e30564b7c42f01fc1df830f3cf0a45ba359b779f62fea2a3df8c06680b10e4d6aa2eabe28f998c0b3dd843d724f8005f6f63704d88cc5d8ddd4b4dd84d35da7f870e75181f2983bb6265e6cdf12c2081e0499a8a8946c76672d0c91b211000000002317002028100c0744921c85712892d6f814000a58923e64583695c8a3d15010c2280aa3200a611884100300320629a58c328901af7673563030c2f6b076330d324136a376ba9b9304684af80ce0f103a650f70f95e22564701e2664850f830cb688415634633fd57b2eee3515ec04789af8ccfdd3804ec1b0d4cf0d6ab81bb4d058930027f2c593c422857224cd21e9b7f9b3ea989b2ded11b102e6893169e9cc544da87b485ecaa1513937be55046e12ab36a1acca56ba782d4c4cb8e1655b630711a43308ff1c84fab41bb597163235b29eefca09c712028961555003151cf3ca4c90bc591b6ee9c40b4a3824f61d61c921fc85ec5b45a42c3547d36ad9de822bd57af288e2d62273da847b2bcfc455c4e7e4cd5e4b0c4dcca61ddd2c081e3bec9a328928f1119a0d339bf8000d960a58889eca166b360242c18532e263d0acddc801b433a0c6b238d9dcbf35850e16280e0bafa2d34bba69552560d10412e4d1dafa1049c80631c751615c21bd10d0cb08e6e8bc1095326abe0df23431c94f8a87e45faef0a33a7d9cd519975d3ffccaf666a8113f249e889dfd3c36bafd3ea16abac94bc79dd0576062206190edfa2a404a58cf3ca9a601bc0102b250076983d23dc4a34508ae39f6e38c63c3651ebe1f205c9c7581e8ffb142a39712a7d826a06120d25116be90fcdb22d69da1a4f6eb1d5c966b74f24350867059aa168d1d2cfb5d91b1872a926107a3fa258df44b17e71c035b8cfa05f837c774a1707a835c3ac7b1445866e8d4a594ffb83f341f611630171e50b2cc01dd686cba916514678c5e6560eab089590fda0903b96c8436c9a004c0856646650a935e3a477186803f155cbb052f2a827d9cd337d3ad58d2611736325d151b9fb188156c2ea49ddb027afb69c9ff283c4e6fd168607c385e36a5bb79b919e612573b6418b450f7540f90efb0b2aaddf444c562f00c2cfc0843f68c905603fdef5a8ec062f3cdb2457dc0fa6807dc06de588f986dc0573bf943c53c3e4686ad62fc8b06b857f05f2754df1d211d8384cf25e13a5c279343f583ed275946c8570feed57c789c2ca2484e306642c5749541e0edce16799d1a6b4c8581573dfa98d0a8961a9d57e6e6e1387fad4a81ed1848ac4a3c105e31f686f03adae7a3dac2ad2298aab7823fa073806be845bb93c9e4ec0257c0beb96dc5d54036922cd5bb9fafa0f70a40ee6b4bfb61f94a699ead97e783c8a4a62ee09a932c7410fc5ad880ca902949260bd9bd800855d04bb632499393b35d12b03f15d0418dd5326287abd2dd238c763dda5d714fe19984ca996284a5691065abee69940f504c4d119ba3433aad9ddd2cc887f54c3ed17525d3403c46b8b1e79d991dc38e80ad1586aaab48351102fec2bac620424638cd3ceb30bec919651a6f2d10c86cba92994f0ced44fa71d5c9a1130b642e8136733b604819614e7372f8b8a3ead549bfbee38f83ede79757e3d15805f08228117ad3953f18d71dd6bd68e4c0e14be6b483d1043a1bd49c31c07c33fb1f2f225f083fbf154bd8f4d7ba60452042ff6bf00a62c4944c341c122c4d4d4388b6619b4a5e1c3f04f30ec82a9dcb63194eca31255c563022988b42174109316d07a6e68f219caafd07e56b1ed11ddba1f234d3a29b31bae08f9c371e013cfd2dce73e41a7fc79b552703f17790ba1cfc8f3c67890ca4914fce5bee283c66e73ebe14e5bbe879470c0a0ccccf77e8ed0586ae41b97b487d009c4437ccb80da946f5cc879f1e80625233f39fe1724b5df828b606864df9c6334220bcac5bbf931df973409d026dc05ae24fac144cb5c342c114768603a4d85b566bc796f36927ccdd846f3544dd050142c098c1ab40b1d6eba265b9890458d9ef40975253870d6c0300f8b8355a05e448b0ff79bb1958b099e982b50a4ba1e5e910956fa9015e882497abf2e43eac1ec588efe2c6d64c915eb132899086cb0339619e8ad0e821bae267e79a284eefc3e70b7aff3b41f07d16bc8149f1340cd72da77ce93952e35f4665003e97c08682f87b42536e729e28b7af1d7b70c9e05d583dd82cd4b02a6407f8f4b0ca22e2dc18fc42799c189e7e52f912e12fa9d0aea620e8023c900a833186250a6fa82615252bf0e24cea1c7345b4da26f863c269fd174bf3f95c1185ab0182e87b26ef6d8d7cef79f043f1c9047aee35ec41208361db52b709e696ad768f90a7112286563121d007f01278d18b88502011373c66f4537aea02077576ebdab3f11039f099343c2f7ff764df96bced34937675e7a713f640464654464e077ed3d91b3bce01f0b309fea23bb04dad7d3c3297aba80c12c5f30329ab8d4d152122413a7ba70087a88d890fd286f298f8a00060cb27ae859448bce52aa0681435e2abd5329d508c11ed075537744d2b21d527f310e43e40cf8794701eeac7d94467eabb3e7ff7009ab418571852d60a54aac8460791c96d94d98126a9a44457751a883d305c00cffcfc44443e4f2a9b7b5e85c827be0b5cb69dc11e4535a1dd6242166c5f290b63e6846320951bca5a270e9bc9d7b2e6b918bcd3945b3651cfe6f7c802b78e8e74bcb984f11314d31d56b2a00395510b880df99fd51a7d986218ef16ccb8033d7ad6301582f822c74b92492e990ade9ee78209d619e2a140948464f3c82a1e1774004b1ce11a20f83fb14663c7ae70e66ba7749a02d8a424956f3a5d99094d770ec41801fc113690f21eb03ab6a04898b87c517d5c08fbb6fc9acc145274ff4ac530b2f4d3c2aace493c87ab860ae1a0458f8a2f3ec562ce83114970f6212c08da54976f018e62b28107410bb312f3e2b48b444e32bcd591246708fea89cb5fdfb4d6a76ee7fd58dd3047a4021da8e40d1a27d86ce5f8096a3d49033ccfcb627efb896106c2249879e6375bf051d0f264f9bd3f5239eea72641a928f2aea770bc6a574e7155c30510dfd9129b2ff174e330fdda1b193117bd5366dfbcb600b8c664e810bbd2e58cdac90d63389c5af93f3d6e452dde42af0167b19f82316e3a5a7bffeeb724de2cdd3ff2341ae45c7f57e35edd2e695fd5b735ae8a19ad9aee1c06567b2320f926b0b463e4cc953ba1e2c0f23592080e66a387254e499e750a32c0200a84f354c33dcf777b114ae8a35de93eed8e378aba20c535d5fe4507ea73339169074f84c4270c7eae51d3ac8f42371aeeb4ac66e4022514520d1937770b21fa63bb01306504793936ee50441d8afd0f572dfd1a6bf5c95fd8fad8c7b19304e37dda57f3e8c0716207f3ee548e0ab714cfe6dec63c35f013d15672f93b5d94aaaf389dd7605e958eb09c76dcd4fc0fee8679c4fe35eef478fcdeb0003cd5f03339fcf7b69daab971da7aaf3da894058077d4922a6f9246d4efea9879bcfee9084075e60bb59a761900043b65187cc9bc561f8120c00437d4afc882598895a2c0835ac29ae007c51a5b79bf2cbdcb316052db5fef39e179ece3f6533298f8ba41fa5981b5fa4e986c5419443181ad7c2c3362043210f29877c74efdf571b86c5a17c97cf6c62195bb6687cf0098a9b3d66333f7403c0ce3f71e8c3c7c537dc54f3280c586b1b4151c875261bea7a46db9bcd8eedcd5037ec140a327d79926afb8819125117f0fbd011745fb9a1d719b800bcff3bd52ed4d9155c668ec132a12f3613ec843a6d19de06c64d55570fc68764640df1323b4337186063f46c4d91aa8a4295f5b73af841e66ee5d585555400f78076e76cf3c0a3f57aecb93aef4a5f27c4b2522ddae410725e0dadbfb01f8c362b50a809816f5d7084f0f1e0363aeeaa0cbf423e9ec3a8d2a34bfd07a9ce289f9e948719a04e8131aca29f61e9bbe75852a1ffe8515cb569f06971af2942d4682dcfd90481a4ecb5d51ef55d4a8338364cf8a53b9820d848da0da9498b6888dd270e7f6dcd16c8a601d3110b198e82e1a08527241e2289bf706c21d6ff693b9d0542960c6a85a3ea2deda488c44ea0b2a0620acdceb3ee0529dbbfcd5ba8e74e6ae139e9ee27ca9ec99d317aef6330ab33fd3d2bb9cbd1b354bd41dd3f593d09534fb1be5ff9987fe37c78946f8520d00f5c0fe87fdcbb6d11c6a751c4f75a8f9ea824fbdd6b69d6024ab19dd889911fe4be2a7d8e361ca8655140b01cfddfcdedae423fcd6c843086b61b020f2f0f662127f40d1526c3b39c8cc17ae9002466e1e13766bb029f1560abddd7f92575d697d85ab91ecb34c64ed6a09d987017d66827484c52c619e2b62674f67a511d80c1ab9179faa0d9dcb1cbaebe3127c4aee7e1562a5915c1e8189855adfaed7ce4f93649cf0e4a7a2e92cb942289c4b4481ea04751ca9a21848b15267dcacec11a9bf960afd30c53d808e3039d7e114807b5803fb36c059562362f614fefc6a97ddd87522d87198c20cd3c0ab98df8b69291de94e8c7b8d8f164fa0d5ae5d27ed12e530fde7517f319b4ec7344496f4edac324f63cc4e5b88f689c038cbe3622938d6fc1c6875824fac87b51d961f1a0e2162b01e98c1671b4af027e4cf09b82d6c412087e681acc5e20c42279191e39a024126c1a32cfabf82d58b3dcc3726fca5864dbe2ce05b9c57f2b14ac192ae22ab47f240abb6297dd02c34486e4f1ae3f18ba6194359ed925b316684806e6f4a4c89c5d5bafe2618251650eaeaa74d3d9ba6d5dd95461691dea287b33ff75f2953150061281e514374823b40fdfbb9efb019915bc011f98ccd4b00b1ab34610bf07f8b67ae38b92671d0fe7705d3e1244e4030f5d97b379a5600f4d6d5966c53752cd51f83b0633cb508fe9595afa33070244dba4e656c1624bd57430b0c07ff281c484bf2f544d25583d40b0f065a78158228c8e5c63c8b89e91f3311e62b9e796abffa9a8c5aa0dd2485570ab4852941d3b301fa312ec400a20a3a0a1c6ca86be27afaec883e4c620f47c9a9b667e1d839776790ebef81b8226687f4b81d10c84bc44ba941e839c30c8752f65f948468c2263897c5f716ef60d31aea0694cb152b518f1f38d9e363eb4370c54cec1bfef3abdc29cf8f5dc1daa30a3e1783879cc4b9dd39c58e6a2a788868dfb829220a1e1699fd5bcb1fe10b43fbedcbdd2a2ef9adedf498300392bd354c6ef1b587aacd4501808e308dfd9b0e50487f92537aa1269f056d4370f4181c8cfa5f98bd0ff3b1bc56b3eaa0543201dd4d03d630a5aa02f7fa6121268f8296d326a34c330e841c65fea35a0f1d49c27950e78453c13cbb563afb8ac287d2dc5978c4a8b471143f9f2fc99eb60eb39f220542f1a2b4b3b0a807893d86ab35276efecfd96df727375239909272e1d352c15416ba8c1b4a143192fb57104d2bd4fb05b311971b9cbbf3cf9d50e1106628e5b007f3832b7ba300891d9de5ca1968b9c7f9db39bd4ff2b51d054436cf4b89e5d2b1f4aed7ce2f10998c4cab03c51b42a3d716521230f1100f0d914b42014ef796669b73c486a04d98247cca0817ac5dae5b64c93172f6c2b9c2ef6de962fab4873e2b641a714d4a7ee7bfa0558eee87718d5f27bf794559957304022c0992940d84a7aba99b898f023aae30ab0b1538a4d95d2a2dedf1ecc621ffd8ab90be424fc2d121da63cea8a74c0ac927a5df4d36a38e054381095a0f10bdeb95a4b36a267ccd2e06b184dbcfffd2b2611e085ab33167089175ddac06f37c1d871cd460ed6b9683869efdd1482a95cb2bb6668304052c64ff9bf7ba5d102cb6ff09ba82df828120bbd28221089d0137b582e3771f62e8b8cc978f7dfc54368c15d661475530ded50008d1456ea26317b93f0b49aa653a6e5d58c282bd9ce0dc16a596d02966c5856149f8a65de45f381a0172fc13c1959fcb532934c5625463e4e457f9ee4a9faa6f5046c3a802dac71b2fb550ab665547bd9549fce3a498d324f232d1a76564700c97deff80fc669b165c1a00526ef5b593b970ed661c0f687ceb93a9a683421ea1cff828d004cbffb457aab8583e71022a19256011298cce5323430024391c0e415465fbfb13110612880f895327b611c6bf6bc06997e88aefe730e8152086bc0ced2045ee9f78ddaafba496977e2837a1394f126ae162248c3580e6fdfa6ca24968f319df4c111cb5f0c3a01cff0ae8928e6b7dee4a500a1f66fdc8b2d196eda6e3e6f310bbcecd142ad019100ea14abda0cac0fb4acec566026d77beb77c61b20875974540cd112d87e1a034cc69f4a1f4ba8ba6f5ccebb53579daeaa6438968fe82418a15ca20d527516600d77eca800faa6aeeb72e09aeb44407a3f969297e7a9117c8bea70e75655cb49fb77b3295cefbb124c62184e1d2e109c0013d2112877d4c9a5c376a9344fa2a0f83562018830e1c2a3404eb3b4604afa8c6493898d0d96a812b198304072368e89378198ac4d3ef7d2f31a157b6a04039e34f8009cc19f2dc9ffc04493774a83e10b3c1ff8a26a86b02f419f4fb3e0003cced74475d6064db2904a196000b044e118f8a6c07b5a273e51918f375c54920498e5282598e3a7189cf4b4807c46e407110535d8a54398d62bca35cc1cc66930a1eaaa6883bcb27b0511f65d757bc73b50fe9344624ef1bd0e7419beee6f08951e6d82b52407d74a38cad30db912bfd7c5942f5cc697e04edec337b86def3ec42b22bac75e2c1e4557a1cac08b2001d40e40404daa3a7b30f153f7dd0bec58e01ae5a7851f2894bb4845280cff70c77cb52009cff5aba04375160e1811838267de297f934f819ac4442585fe1ee9a4e16f4a62d99ca2fda924048e662bb7023a67bcdefb03d038c64c5f918e2e3f9e2bed73224142d4a8623dbdd1f2c38ea9a8341e4a227702d3ffc818277c8a3aa91f12c1c5197d8204886fe557402303adc0c70460cb2a0178fc9e31230d54e8251cad2398529f683b999a5ca8bee1ccfc4a1ce2c10ae65ebc39cf1d913ef1011ac3222815da8a055dab5688467d1b9c50ccc57a8ebabe2f8d45b644e6befda3356a2a324dd68d052640a840a425d32c5981e143923cd03429faebdbcc399e1ffd7d329e81508715786ac21213364dfd4a44aff97cfc11dd69689609ac8d52a92ba13c143cfe7b51bcfad78a48efbeabf5f94316fb9df37a326ad38ee155a048bad30b880bc1519abdbccfcab72ea6cc6e4d1f0d75b4d8572abe7bb4da8cd8378530774bae6c6bb5c30c9158caf56feee6772e9ed5223aaed4a0372782a4353e5780c32ce5e29cbfff652a4402e0ce88060f0815b8628161c04303c3f2046e4d9f1d30079178dce7f46cbf710e12ed3f39cfd4cfb45143bb5121390d1483b5546edb5200248a0295d0c243750c68e9bd4dd52a86a833d30013ae1c20338c452d3a990228824c1f4d288bdb8f0fb403ee493a2502d2ac749e1997355e6c670bd89fc4f66a3c5b033687e3ff0511965d4e27c0695d4d710487b9e586af0a6ee35c6f689e4ac01457a1fb59dba8c293ad7d953d1456be27d5704dd73e84ddd2620c655cefffd2cab87d106952fe9362fae2788842fad2c9c7c9f31e4bec230635ebe355de17963306bbd7fd810a7c343f89972e00586912c8c4efb5175ffeb2a48c4e677e9b84d9a73efbab812a23d1c4ba7c7c036ffe48a4140f22554bb52cf8959669c1f0c6c1c01ff10c77c6028e2f0e0eac58865842ca6f89c12342d934b626067c39ed828f689dfa6d6e5b8723a66b312d695d35c4803ceafcd8dcf6100de6f61523085aaae9c325694aa26a431d2bbc6943beca5eb819df0746fc10d40e514352e020e0477b6811304a2fa6b530b8a7206f1896bed0bf6013528a4c684a9ae63064a2c0d6ea8c9f2d90fbe311fa738a05ee280417e826856a5d5a846372d90ad1deb2c408413d7016ff341fdc4f0bdfc07f3dff6cb5fe11d146aeefabab18a57f464f92120ee0625f0fb6d5008c7c413efd1ff30fcad20e42c8a191c2dfcfa77e82876bac4a973c2edccbaaa99a9da6feb97935b4fe7d8a37fad1d19ba1505bc73fefcf6940ebc97f17535ec4cd7811e6131010dcfd905b18795389856451dd46c02ef80ed0e603ac612c59a6103161c69b1af31165ef717358f280b9bfcba5953923230f466bfcf265a2f28728ec515d547bc0c0676d23423623e119a24ba561c20927320bd0c780913754e772af2c51f63b575bd4d92c3c935a930e195bedc4d2d182e7e178ad2a8fbf4698c71e0c593d8a6d97f7540439fb2ddb9374fddfd677a3abd47c2bfc3b9788c01ed046e9990cde562c2c2c320331858054ca04f9406c1083819783bba9dac78e1d9903b62abcb3bfcb79be2da018c0240ad5871dc3943877025bbc80b01ebb25c5eccb29c8bedc5b6e2966dd9c513f25c72ced22c4f7a5e5fa803a5a8a956782665c13882217cbf6f453012ce4c5bc74a81d4371716267dcb8c7741d421816794109f7ca45e7ff0f20e2a1246fe7f14dd1b62cf9c138afe5440e79da1e06023c87f4c090f17d436d9c4059722cb0be64969d820fdbe9ba9bc26af21f4da3cae9fa4adf00704f0a439d5985d83b33400eac2cd77a6b0726a13e34daa58180e127a76c5b315702408d76b4cb2c469be91d4fe83a705d627003163422810e205c213a40ae22cb9e7382d29153a74bd8bd5eeaf01f0d0b7a1aaef274f85b95b46e6e20fc85993b6d29e689fd34815253e9d9fcbfaf37c3880f12139fc408f68765703c595788ba2cc72a2c6a112dfbb819f2060dd2e419de3b681fbe6c78e622cd9e8f1581309b7e4bda2806ac10558ddf6e1966cd6e6c201ea0940ccd9781981030fabbc3c0db137f83b78aab2274827db274fbc26a944bd2e427bb88d476af9541e1bb0ad0c71dbd4b9af7057bce609df0bbae1b30d040674115f713aeb02fa01b286f075909dc3d0b1992e8b884fa0cf1814164ad593ee6dd03f58141f65e658fee0b973518440da9efc3f7a55d23128993b9fe081c3c9a8d6160270c66bc4df56876669e301953e253eb9f86d8e5c7974c2d60b7e2b0e2fdccda253d1858f942ce06c079225a828c11058751ff0a9d158b0a786c996264884e702b11ec56ff67bcfd4607af19684f3ce3cda6c69ebaf94f1403a5cb61b00dd508b9152bdf3d4f830efc2d02b6500106caee61eb580bef25a64420e5c82f52f42de075a4bd9d2d2cfd8065c4fc058199791ebd85323cb1b0d1a3fbd2fc7b902b1ab449c788063f25fa3dfa1dece2aadb517e61f00c3c444e675591456e992abef43593be8342d6f6166b6e84ba2b57af398c6fe3d5cbe353e5cbd7e4d1227a3c085d96832a4c9dc01159106553282aa3998a2aacaf425ecc4363fd56269850f1e55891e94caefc71582fe869fa5e78ad19266f1257a8368f6505296f52f9aa120d2ad51d41145778d0f880612988cca37f75f2014197104750ea8f352e1af45ea11b686b20d788fd55e1fb63332f00d8cf8dfe031eaff5e825aa94a5796d744e8d221ca8e62801340c7da12073bbcd0e94a1c4f3876799e73ee3e01e5c05374046a9e72f1e645f1dc6b93d03fb907ef83ee99307cfd96f5d336e5f57f5648cb2f361424808e80043ef26ac06323fb459f25001b0d96e1c4ebcb12171a0127ea4171a96b375e0d1e13a17f1a41cda2bf78197c59d1a2e8d951a7998a579db9221b1e88fa80d467a3a3fe0fc85fb90a3a784f5b53ce0e09fbb91e1693799ee8ce72d2707ee30c9ecd33e57951ee3d41cd9ca7e84d77ecee58e4b0372062ab7d99f3cfddb6ef196548e067c082bd408940201ff47a89d4438411f21aa1a2e8aef2b519a0c2a8bac3a66d02289399d62a7d2ca6090090be58a4f6cf4c32c29c25e63cd917b188cd5c720780c889def9fd2c1527eda0540b6393c75feb68929285248f10afbc16b62cd0ccf68a907e6e4eb18c089e5ccd91afa7224d4d4f15e63ca4baa20c2da07483b50d867a6116809a347201043ed76ba111beebd4311509131ceddc41dcbec5132d32b1a5deda77eea81182697efe7bc4cc5ae8bb9e23ace1cc750b5b31a4feda7265ba5ce6cb354f64d29cf05457de7ab3066cee831914838d27f59cb5382c10db495a1fbe3bd628e61ce5090efe5418d9208ff587feda431c68c76fc7c94518d172d60e182ff3a8008f472171695c405f081e9e89ee56d993ac6010f4d83bad0a0b18a13eb891040a29cee8007e0e147ce3082f96637f1b8bcca0a2845b92a805047bc7d6154f87ba16a067794dc0339773506c060f566ae79a3a21c867e320ddd109a8e6e88d2d82e24ed7e194c0741fcb568d13009e569b7fe0ace5d7600a14d936bb0c99fe09fdadab7b8a2046e58504ba728d50f7ad0e098255d95fa57881f84d3ed697de94b82014cbf603c4dfd1cf4ff00d74ebd9a17606639389f526b42a91551a0a80ab71f7f5d6392941900650a68c7f145dc05499efd9c9e269a40d3bb34998b03240040185ef1961224fe3e68e448cd41030ddc1e9372af9b1f79fb86161ed1cf5c7e8b1e59ee33a028a91f64d0e0f125850321dcb22472e4010c3586e554a4bc0a22b33cc11d8fc3bd18012dc95d3a10b4a2ec4818cf29c12f80347b3036605af69f692bd5e02ca3c5b73858850aa45b116731d199fed789bf61cc4f6cf3084f6e93d438cd36bbbb83ed56dfedcd46280dd297dfc9e68dd9430791d03d1e7e13052639d1527dd10a9ce0551c9125a0f39855546ac7ec38ec1e9835d2b8d99ddb3cf3baeeddc1467cc796241051002a314bbb5d6c436b56a13a521a9f9081a9b6e74aa5095c12599509d24b40a00486d21edf1cb6850ba6db8aa68a7a1c76010e5b54a77fbe7da47a54b48f394bea256ba18619d665d3805c1abd6dfba9e9cd574b506f47193b064727469970519c2ba947fd8a5e5725005e3917e9bf0ffc53282af5071830088f154503edae76122defffb4954ca7ed10302335a5aac1ab423aaf6d1d143f56c7987b50dae589c18246a012345ee9769ba7477c0c623588a96aeb3f85b239bbc8af6b7a2f5e9751a826a74b480b11337bf47107b3e0a4e6a87710ef21d0153064c954f3f09eb408cbc490fb158050cfd9ca08a3c1e28ec310fe399c67abf4e67a27dad57b38f2d48995d241e0060112313e8213126d6ecd36980568d59a6870c7bfcc43a3781e164ee6d8b0628401dfa942aca5601aa179c55a761665b9b728c2817827e114bd239136a4573d666cf3292821449be2598c1e352dc3bc1dedffc7d2deebf2291dfb24ce0c199fc97831d99acbc3105de8644045870fdd5c1ae88362b3213c646a701bf83a193d47e5a73ee3c9ccd76b4f3b25981c7f475049b1c1a388a7ddf3a8f32f1a48007baeaa0d8eab14a7db0ed75144dbecca7d4c154931bb9552758c79657f355507d70d9d46a30e57b5ba7e5a322547b137b159e0f555a329fb00caaf994fc860ddfda1ff3927ad62734ec19853fdaf54d1a67c274689f03c5d293172573a7578af717c7748dd1699879471b73470664e47f65970d1fc929de22c2a1a7fb81e284b5035d9346dd1ca9b611f6a816ca440dc052450d32cfc8194aa2b365767c0408ed765bcc97994147bca2fea7ffbb5097cd7b7b8de5fdfa4c328d680fd583482a76103b81b241b2ede57cf652ea4010ca34452fdac7cf39d66ed37b70c2f9174b191eca4b87c584e352086d21f012d4238c9ac51ab6a2c7695609e93054b603b388b18278bf01e7f827b8e9a77d3b3734796f86d052b587a43b919fa32cdd36806c40bd6589adad364401a4aab394d147c9e918bc69e684e13019933e26a82ea6505958b09baaf26a85c4fd0bd9ca07b558792cb0c2dd7097a2e3394b84e507add03f6547a534b74bcca1029572dd1d838e39da1a2fbab5634aeca8a94da1a9e6a5fa51189ad3322255f633476675e052dd2af9aa2712a53afc37b8fa5af6e45e2938c5ca771bf0221d2cb138b66eac6b21e5c37409a8305f5b3927a3727e3e7d0347713aac4e037eb24f4744c64cf49bf2b25561bbf939c291d316a1d75ddc42214b2db6dc70723948ecd1e24ad75fb7a56e3005888447d3734b355ab6c245e3a22453c744e9ef33404c4f580b9772b6dc955610810e901b8db355ce13f58840a811e20ebdd821d98fb2556851e152a04bac0ef77eba0692e9fe930e4e21c4241443fb8906e22a89fafb7edb76d7797e4fd2fa5da8929f6105be93afe9e72e92d3759a3c8858d5532072e577aeedcec684ff8c8992245e1fd147875df2c39b1038e3a91d1c09a2690b5b1d11542daadd141ad00aa30aa45c772db4f2926fcceb51926f57da9a96e442246780e94df8acc58c472418b81830497bc146e26aa4e238ff34f63b7a65087045d79ebb7ae51dd241d71688794fbdf7a5e29050c86c247a26407ac3455d05923d6b28392e2f6013df021f3f7c4539fb212818490c87f1abf586f8c17bae4856156ff8b7a331c50e379f91f9e91ad7e0203fe990ea008b1f7a880d5ae632424e4a0eef815c8fda7c34bde802f388da249ef85a93acd604a313e0c273b5efd812d4ea4a0052fb17c8a51a38c8c31feaee1de217e543ccd1bd29438f51430c797480bfd11fca5a69a2c485675422d3ce91428820a680176bafcc811478f948e9800a1048809bd0f96043e8d2f5b000d585b6875284f6d5947c0715d4116640ffb6d39a8aeb371bbe3d823e73702059f0cf7c345c89bfc41cc2aee52395fa9462191c92b55487ccbb9bafaa22ff3f35843043abacfc5e2c4468c32c2c6245782e55d5f134365227eb6f3966363569ae4f56abaf75ee43a486706788935676ca364ecbd19d2c4bca38eeab95f19222015b65c947217028412833169ed7e4e316c02aef6b2bbbc3c06d00461d1dd1eab5865be7f7eafcc555204e62b53f09ccdc8d6311c4b7fd8c78e20b4c4dbd2828c405e47ee1874a32676ef91a2762b0477079c6ed19e71f4fa657d39329273581a6ced37c29d623d696d6b22df092a0604dc06c740f1f94f44c664fea7c7a6d4bb102094644033ee4f5513af3dbfd5308f52104445ac480e54e807567111857eb903deb178d2d8334a7cd3088d235f95d1c401911e568ffacc42d6394fa368ddb8b11ee656ce69c8f1a4667c5efe8b32e4d334359c128d022eec02afa6a86b0eb84a0ae941da6735c03dff562daeae2cbf13f58e32a7bbcf7ea885d2581c25d32c2fe620c45d093c1a06d839303fc96b8cfecafb391cddf049518e9e72ade8b8dae4258295bdfcab04f7b6e4ef8bc5cdd51834d08c5121ae4135195aeb7bef916a8fa6114685001c6711b0b3517d3a8781879c3283d1aa7c2a63796d4290fc8fd597b11aef808ced42b1d5d32df872a64e1b6f236bed8f8f21980b932180d413bf83db6de4c888f8e2a27b12fd61994d5c9072799de8f94433293f4f39c30e73ddb00970cb0e81d26885c9d3218026ea42a1de2a199646936c801ac384e9d07c479a80264be6320f192d054e5ed40a24f93fbdc393609fba626b7d4415c62b8110dfc84bf48faae20f12743593cd54c85be78684d72fa307193491b06d356b22f839e2207089931f87edeb7eb8b8fcc7f9ae5ae001aa05ec84a166b62b662e04be89b9c52632ce593ae69f70c2109e0f84e77cab5f8302290db7a1ce809f0c3f12a323c27afb46ad158c74d26436034c8e829af52c378d4b5630f2b23062152a582f3e898c841d8e3b381d3dc7e4fda8f6fe60f154228c58734c033206130ba61bf18e70a1f61e7e96f0e62eb460528955d8764d8c5ab5f9dd1e8d1ac603b1d8f470caf88ac75fe24de98a37e538271cdd6ffdf131ef75bb8029b61795c94dd64334b7c0b08cf4dbd7158011e06cd91401e7be9b9d965a31dc618533ec13b064d13a254bb374ff9883f07a2e4b3300949d532bc4fb5a81149c70a5a557c2387d754e9f2c13ea088b4f8bf333c11011da1876681f55719f083eada573b8a4bd7dc739530e35d87fa764a2541b77a2cd847190a8981e258ce704249490088c19b3d02024c26e6f75c38f08dd2af2f8e00089a6e773386e77a34cac3c26fd117399fa23781b2585dfa3bcaa490807995c44e2710ce33dc89bf2b0fe52d070a2b23b3c92a81b91568da9b41bbd981b75ad8162d7f95c06070ca090da316204088550740b623d8f500d15bb251d7b50dfb3b96c71338199c1034a831a850d3f960c0cbbdf64b476d7354dda7b0313b22f91884d8783a08fd112c400bed11a3fb1cda4243ce15ac2b53a5e8e369766dbf01746dd2c6e71c0fe0e69b66b887775ac1673bb3799dbcbb2b3ad75d64b41bb12e916151c578398316ae62c83c61f950ea8af429b10eabbdda51f7701b63a9bda236a1a92a5f9024d703238fec44945c570d0a4c2256b69e7f56cd677de42c83ef80957087c14b2c1aa79ab6097493525312a36784f798d35cd952bd40368e00de1d638371a434e13dca8e7f7ecc07c74448d1278877114e20c9cb256ce4cd13bc6a51e7760dba88b383d01bcc3b80a71dae50175cf981304b7345f708a1d6f7538258385bb5985693979461411f854e02f47f3ad1025e00de3d638572bf6c82428555c4facc9698548632114d3b63f489bd10f6e4816de5375433ce9cf1a2b5006edd76b5719431e5a0db600a8e81f2f21cd1acf9ffda8e830c4be512de9808f07431fb311318a124b62b4df1e088e7356424235e1850b1d26d2f7309f78c487bb16ed8bca196fac3a5c8c348d4dbde31715aee0e14d2cbf9077dca22f1d219333bb2034b6a1b28861102134abbed21c907e806be77f3a81f57b0811f393665affb5e3477cb1f0a10e161a4bf5d209fb1768cfc4f6febcb81f848d4ac21666de8f6fc044d6982a7db008b7f984a94c9bf120175132e5f04d0048605ae58f4d4b587a4b8cd866638481217ca9153cdec5238dbc81e23d7891d7a7c886abed97798cbfbbbae9c83831a699447fa4c91a693180d7e93ed27afe47ef48152c1f1233a23ec8c39e654868b0d76e5e7519b9955a4a8e1493bd4d6da81211e67de8956024e8e00f7653a5a00add733b92990fc6b5d32749a8738bb574c079b406d12b7918d8747b06a1d83c4eec982b86f1cdfb4457a06bad03aa862fb412a8b79eb42fcf41236d10aa4ad192097b4d28d8e470621782f62c2115dffd1d6338f0235b1b308cc00a22c5d613a61772878f2bc1869286248ba8df22b0ba63a05de07a15c58e669c05327ddc9b9867bf285e566b892903cf2ad17a3bfe5e5406b70a29e0fd71ffd2e0634a199321a6430fab5cb75920145de877c844f98121d611888505b42429814062fde62fd38d78ed42a7dd1a94c0acefdaf1c61b36ba175d3a4719e4cff36a45b967c2948cf317c9986b07ff593e1c8627654407261ec1c0e513459af8bf472c5982397b6138a384bb48d35a6b79a5c9149423a9eaf295af9b9dcdae64a125cecf58613fabf4d87239a494cb062d5c6753b74e8d80aea527f4c67f2fe5f23f632a72cc1d8b2bc4002dd260c704454fa843539b90d01b635303e10753d8747b38a8c32a06a24313a1a9ac6c03f065ff5bc13ad2d1a6cf553dfe33c4351d1555f8ce65a933c50aeb881644d0e402e62f37345839afd1d3d4f97afa2d6f61ff7e490affe2581655e91db5195f8aefd3dfffe6612596ca9d9a11dfa383ca86351984759cda113744a0be47974e43943288f113df55a6c13ffc7549543373ecc54fa9e297685431f5bb608da3652ed86944fdbe8ddf43af646b87590335a535ff46aceb5460920ff197b572e91cb715b76103fcafa11961a79f562ca282050c9ec6ee3c801163308432bf1b1d8a5159ec3f341b8d3f41b582fa36d0d839201550f2219f2f6943e74486571051894e6454bf69938699d1da53500f59ea79f66eefe6162d99a1e8a7285eb36f44de423c959a2b717104a8238641dc0cfd06e55f5f8a6912129d40b0d774a63370f9a1827c1d146245b5a45d2b35d7a238c4a7636d492c71252102338b9508e3ad036aea28a61f9860a02eee51424567372eea4698da23a6c5b29c76688c6339cabf8843b4abe73ff7a1ad4d51880ef263d1bb5d5ac0c0fff78dd3961c5043d11163190aea13c68b98df2ca127707c374e3fef59d7ac36b74359146a68326f55d4017b9e82f9b105ea11479089450c8d94a99efb10733ff5ade1f62b3ca2c7336b4171db68e55cdf8115714df69ea6c6b9da505959734b51af822b2b2a8680d11480899280c4db13b290dc08fa9818c2a7df854096a0bb23acd0b7599ec9acfab0c5bf19b851d4b291c58776cd1aab3d2e4b652c71c47e30254c85b43e72f214307743c3b7337d9ad2c1ba6c17219c00d4d50e564c2c7b31c7eed6b58ede1f4b691ec27a2d63f998ac83f54aca1b9381a7e35a709a5c601213736e5ed4242664140d03d21252c066c862979751091f54be60563fb87c50261bb02b41ae5ca937f2b71904bac695e11ccf149231a66eeed7afd56bee1304c2c4c0868db8e08435aace174bd95d68ba6d6b961dd61a042d74fe604002dbd601eb874ea1ada0efc9a71f0bbdce6673f4d0d479325cf725f695d173cdb3175908821d46c95d69721241416219ea45f479c9a079a10ef7caaafce6b0e5550c367cc369b05084d27c40c585f85fcad256784aef4674a95f2ae65eeacc780ca88d5c59b93a1b9007c040a407e621e1f03326f54d87dd6c94e7936b93d6c83497a22b64921635917ff09b38d666a58db4b4fc0125de676a86c190992fd0472ba28a1c40c04c167ee33a723cc49d288b5a1e73a4c9accc11b7b49604e65b2b1ea7974899225134c5271662bc588f5041cca2e81605d4e3f68ba4d85822cd8b68468875d71c4c432ae674db8305cb3c448b487f7225f5c105ad8d41938852f09d45dae89fafe235c41af68d94440be6bd52baa3dad7baf4f5af48cd65dbd1091d03591a322adbe6534284107a01850c1b2290cb9b2c979a518e55bb9cbc0bb5815cc62db729e84244e8d23574dd85e8d245d1352e6bb142476054e8382a2e48c5341c6bc51799019cb8dc080094e6784bc53a4c05d1541ca31e4204890e6b30cf706c0bade5c96bfbd616082550a493f1f94598cf5545c68caa3652680782a716b4189782d66ec9a5287e35c76c8caa460cee9c82cbfb0865e34313c6d2f937220dd57e6312876842a3ad17187460b8390a2752853a92fe262414cf677a7324ce63d7b983d7e847eca33a720b8512edd6f20b5fdc196aa01ab049e7fa6673a8bdedd0732c2d754f1a9d2bcd4271068dff5f0c9497c25531bbf3b5e758f9db509bbdfd0874e376e1e8f60e21c9c6d4d4397d2e2001a2fb84d59915591cca9be99b7e7920ba5ff9fc9c3201c8f0a775cd91040452fbb8d92bf74ef469b9ab361e00197427b35ef8e6035641b8bea77f5abc77649469598e4deb3458537a28876c9c6dd369fb81878cae2436771f8dfdecc7f7e23ebeb2a360692f860dfbd17f1466c3d14fa99879537d334aaf622b6a7a82daf0c37aef36bdeca4ff0a5335d53883baa45f2be7d342a373eb61a0b3d84b9297a9cac643884c398bd0c7ea645ce097de589057a88c0be8c08f49bf5c1c7554a43f5189d60ed49c12030fb7e4a3563621d453c2791ed3137add191c6a72b091c1323ff3d8d899f09ec5d9fb15bc2964c7e8f76de93fcd7eabfe71fc9fb85f81ef25ed534faf06a78d609569ee0f026cfe5fc7208238b6e3cd197ba217c4da3ed2f5407af1923d172292c456c640b10819a3e3286e923cafbd2b8d1072bef183e4b8cc42781c1ae12ffe83f87f2d7ac636db6e51412136caae4563ea5eb47261f55b6b1c58cef7b1744718c699d1acc0be61ecda18e47298b988495b785ffefdcaacdaad207b6833ef67e18bc28c32b5b3767295e2827bc2ef713fd8bdced73e4ba29881770054ae909fb993db56b63af88ebf520b085b2507aa4dd4c87c5b9f26f0ee281317dba6ad4ffad83aa2b345b1a3057b16be3bdecacecff0c396358c4c96bd240c08bd77aec748bcf33decd8b3ff675f5ced2b7fda4996bb4079774781a4ca0cb75b3353786e2dec9fb4b2a10e2448d9f16263ff32be0acdb18a7dc0206ebbd0a7a2fbbca4d21dbe05acbdc9299436639faf57ad728b566159643df0e4b8886831e33833f1bca9437c2a2e82950a1fee0eb38040ee5c832a26af03b3da1433c02453688cfa0f977e3c599ae2c674258e4da33755bebf83d693188acd1b863798906ea159702166217000661ae0d336b1842a0522ba08ca7e8532c5b598b511b2b6ccba89a88cb405dd9e4f0e550e7e17aee3839643397861635a91a5cd22ee3584f041887921605fdeca9501cd513381603b2846d5114e93c3d550f85b50bb36e6161933c34b73f5c65aed297a7bc5208dcb016597961ce99a54fcfac136ae81644990eb764435bb5dfe8a76bbc831cf2d9863b5dd2eaa7d364cda888c22b20be3c90c17a3d08b2790f12802b7e0b7a25c3ce8450a4c254597d0061176728bb3822b39faeb0c4799116f7bce0c090ec195549a7777154aed2b4df3415158d9b54cb6bbfea441c9b900b0675385d177d2aae6e49e597189400a94a07ce6c4a9ef54bec2d0a4ade5b07db344e28f61937bd3eb44417f27532e24b0fdb41a519a7e1c5eb1681b99f065bd2dae9edbc8c7d71d6e6f11521b0ec3e10f9b35b1adfd70c5149ddd5fa37abc412f91225fe50c61ffcaa857cd105351962c14fae245b9942fc512f1c4c1cec3805dffea236f4e3c81d0e5bcfb4b5e848bc52450b5099a6478837fbe09a0ca8d274570b930fe44177404e9357b22804017dc7e1a60ef0cf3a418cb4fc04f3850d0fdf546e87454be49e46dcacd043147f0af891fb59813d3bab327f448967213ffc8191c37f826125fe890889c106772c88cc4b71b42676f64f83776e26509e5048bf99ee0438334e504bd3313134ce8d14d034422ea2ae5a6c18885481db6eef8f36308281284bf1a43276f9c1f16914fb249f4d2e51363a1f78b049b10f02ec1df4668ea0341f74c851b114cce8db46f392418c405e0913d7c05269e20e54bb1e381001293012f06fc6b04a0ccb2e9066909620edc3f719f32a8823ff45184ce14eadadb47222572c246e1a5203dd1bda51374cf00917a4f3a03ff8143445faef439a57c0dc25e82092d86f7dd827b90ad010c303aa4bb0428572c843807c7eb7f5b3084984328be651519135620cbaf1054587c3bde8539d82feb9f045707f17eaf062c23097ac437e4334237b43456ddf19268a8de0e9596ebe6e71f06e818c87fd5e6944caf8891ad4aefa1d6fc0fa8991c4c8471accbbce8fed271a4e3103a5bf355f694216708d55b5a4a1af0a2a605f34dbe1cc0a29f862f3c98223c7a5ea4db5d9358f2ebfb0327fd53a0d06693a7fcd3b1d1a78ff18f60dc4e26f2b0f8199ac6482039bbbe4f2c8598a4fea455fa94faf3689c72f8a634ec4c3e435e6a8d8b1f98d8eaf514b5c8cf0b159e4daf401a238812034d644786aa54199d770a0b7d4f355d318b516a0a7336b03a2f5e0d8f4b3b3d20a287da98bca3add289f9b0635c657d01a9866f6ae6414470e1a92bc247bfa6964d38d0bb5d60858e55347c67a76cfb7e3f5c02b3b87d3ba427592ac51c85b5240dbd0f92b2cf4273ab6c8ff1edf3cd0d23ceafb9ebc1307186977eef8b31b4649f284e0d51b53863d145c0d1d020abf49cef4f49b43ec8620c51da0c0452c00b31987861ef32f41c4e8d6287246fe2f5b4d2f57f3e51ea6724b6f89d7c7329792c0755b8a1980951219472ab4d8fcf12f140905f39250aba0ef101c6714054bf5510cceb9cae00fbdb5f24168eea8c2667e16739ceb0fd996aa88ac2f17aad8152e6b402d699b8162250fc4c0838bc612ce609daa01247629081c1326357f1713cd2d9e45b3c92a293d5d0ab740251fdad5a173f837bb7eb435e44ea7213ecacff8d14513d08f37aa8afd6009aaae0c85da92f6ace9f641b94294a4d0bc6b1aa46c0f373126474bd2d03d8e7b9b7fd601380c87e351d368fd4882146fd06489d2dd18cfa663d28886f7f49141dbd55f9ecef64a05488d7cfe1c899ce44d42fad4ccb2e12ebbf2f526d109d1e77f2fef74339ffb261d36729396df661b25cf44304a7bfc81e9892c224e189c069da45365c9966abe8b00228699aebe74446aeeff77e81105723887940de3990a23f383c58e2784d68f8871c90d43a2e03f77030083e9a6e0f0470c4186c103a31cd427be5b80a8316386c59d8001b88e40a69fd3b6bdd1e639481512ec1a10e3f2289fce648ca26e210689f1f48420887cd99fd0cdd022bfd0f9e4419dc1a8590357d80a444c832e099b3e2b3d10e20bba8d9324847b34c80d50478675354dabe433ba8b298c31ffe8059f25c6aac6acdea9e11f54371d73d21817f6c699afd3b4fa0f473476c30648434e39d8159b1518fc8ce9dc3572c2aa1651f786e4e8efe81eba7f44077fb113b9cf9bacb9c4dc0620f745b9c10069cfe00f9b7feba58fc806dae02c819243e58f9f165a4865248708318b6fb0103225c806b1088aada03eca72ec04d4a55ff8d08bc2360dbcc1f367860572d72ea3fc682a546acab578bffc0b031cbef15b7beea751062806a1b0007b078369dc95dfbb0d5632cfe0386c9588ae160fafc9200397f8801577d50e8f17d54087110dfbfce3522e5733fa53ef96f29821a7fb81f6ca0e8a8cdfe61fd1cd7071cea0af841d3a326526bc6399cce161111007a1c346c0eb006676300b00dff8e7fc004977038de93392aeb31ba25c2e132898fa5028d7a8bf183272a2dd670a69a7f05e987269077c0919b640b730c7f464485db111b1ad2a2c4f9f4834174b5ec61717f88ca2613ab6bd0c546d390a7c1657dc493c05816eac8abdea7d3b600fb0c44d5db23f652557673c706805744a7d6ec4f63161e279c3772bf24153f8f8e3b0e5b8674bc56bb9f1f1ca31c127c4695c5160245180fb810e4691b82a1e2452c7249d03c3ffca4740557730c10bf7af8d0811e9088c19531175c77fcf331b56ce0136ad9f2e93828711433b375bad54a1aa2d36aba2ece0c1942b50bf62133716b2557b88f8580f93ef6dbcac187906179df65a28be3964d175a5c6a038a0c5f975a309a514d8b016d064300769c1dd6eadad48fc022cc4eec8d78213a8913a35d076a8e55e231bb025954413456dd7f3bf55500240c7d4b1b1f6985a519b0f6a8567f2348ced5268e942c486970a89999dd84104288442eadecde01fd080609950937abeb665f9fa94bcb7c20d389828621ece18b165c418229e47441480ac21914808113831a2a5ac082245213f8118330b4d045133e80410a1e4278f8e2155199f6d73eedbab22b8c2d8fa8fa55cdf6da2e7efdcb09da90bbbe74e407721f5d0ea19dfb10a18f38fdd991feacb6a16bd742fadfdcb557bd7292dce5a95efbe823fad1ad56699a5ec5711c37bf5d24da718118615adc43d7a6847176cf5afe302c147a0cc73dc4697a4489e07070d76442d7f40af7c170a1430ec3b44a7b48cbcc6b3b0405969ae430113b2342b2c81a2a596ec56eb324626b58b6d7225781ee9a9e495500ffbbdc55da39efdaaf568564400f7d2615b91de4de81e30215463b17d2acf9cd6eec1aa6bf1ca36b8f195d0b9d2562690f1da6aead693be4a91ec705e4a9fe831189b48f42fa13953f2bcada478f099da459a2873ed2ac1c9548afe89789aa995d79c95de5aea2e7f469d76ffa7657ed2a7a4d755378a2bee2f29357449bb9645783784dbb3e5355b3aedb5ffd51ab3f96a6afdbc764d959f6fa933de41d13158fe5fa883d568d699878135590c056b372e659f6d7af66dd67d7aaab3f69afc2f4278fe97aec31f51876d6f6fa18ecdc39cdd28e65d7b46dab988d3d7695d5dfbcfd754cabaefd7595bd0e53f5577ff3baaeecfaa40e221569604abb88c427c8537cb4d189369225b4e3e30db4916d18e3b1cf6cf92426325bec4bb6240950c40627da44abe14449bd8a37d166a2e205b1192ab925685045a3924552ba65f9935bfea4fe72d0cfc768c7340bbbf6a95939ac797a98d2585ab8fece96ed75cb6a55410253483fc4f6c1503d4fe79c496521282495a88a9232de50efe352510166e55c4cbb7cc5aea2ffecb1d363bf5a35f5777d1e3bbd4afb7cad1a16b55a230e95880d3756d22e935dd378a22a961d729ab65a856959e9e7a1cfe505940a68fdc0a9f9966dfd5849c9d7e0d48944d156cd4a6afe074ec9d38f8ca01126f417a9e1f084a00d28eaf121e2e168df481e74fc6efac4225ce018215d66d3b95c725026f9964d8e73e9a19cc383e89ff7511689dedd13fdf344e700a4413b107f08b1e9352de2e0049182a78a9f27e0ec08e9f12162eb11223f5efcd45a2b91d9128144204422102211480452b3208ed87f372e1175608033834d230e4eed519f3de2206b76e4ec23f75d0de3895e334cabc57dbe057a2acb3c8448d907d375a39b324c59cd84bea475b4489d26d13a84b4cb489f4e5a26a75e2674a965e443d4feca9312b08c38dc1daa67cd77efae9aef5eb54a3ef4171939ec9b64f121fb753a7335ed03107467af5fc59d459b7db0877b6babb8edcbf4e17adc32b3e4499f9995a392fac348fabb971f9df561fab357a9beab3fab73cc931e233ffa3cc99e04479bc808a21c431994234ff49928daed10d978e64a90135483b025e7fa8f9b9aad1a97942ca5e42925634beb874b0abfe6a6beaf2e05d4dc14fe8adb107f05ba51e392c25f89a884b087135f84a1c1a1b1a174d6d3c79aedf431c86c29991e6d4c1e79aaa0e901cdcbf92e4b8e9b9cf4bec1140576540072016661d35873044e143e52d0dc34114467e72222595678c7e7093e12efcc961f248a9ede9d4d7f8034e8b53ab22b8220479b284444d1cbdcfaf1148c065875f100ab38824d69686e8f7b4d671a664e790dccec0b679856cbe4de5ba56fd7220db4d17197b93b96e3771df89ffeeebfc3940ed0b97f8fe1fe7567cd738fe9fefdd32c994b6eca2437c9a497b2e89a6749177df42d7b87a37bf683e1b8ee5b86292d9a324c5d386a8926d12e240d676b0427aa25d2a7892a751a94bfebde610ae7eef831dc3d8d7577783f1f0e883bf6c8133d8e28449ee853d8e35221286870912b3d2968970f791f40dc5d0f44695b784578c3759b27a4b16d780fbb1cba2d5554708f5dc73d3693d2813dd39fa557ddd3f922352c85ddeb2a410ee64ed4055590c0ac1c7b16bdb2dd90c371ab55f39ad5222344bb23477fafa2bffab3aaf9cfeaecf72cedd863eeb76f9a956959feaec35486294cc389baf2d7a1caa57d803ed7116c7655c03cac5f611589d2b1669e66ac59998f40ea6b6c429eead4b5d6479c18049f7bccbcd42cf9794eb37254f2933523876f34127d2291d9c2d2c2587f59dcdf5fa406e791ce9ebc3e56d26bc9eb65cd6c31798d45768d3fbbcaadca24e449de7c3025391e70eece65d363e4605a43cce30f21cffd84e4a46b23fee07104b1250221a26a68afe214a13845a69182c49802c35b2302d81299107d6a7c208deae3e37a0e3d2e7a411ff75fe603d36a954ef256c9498f3fb13e16992df2f59108b47177add527e5079e112736016d68af8f31802df10710555f4f845deb6bad4ff981657dfcaea3fba7e3915dafc3f4f83351f52128f00783b943eecbb466e56467cd63cd92e772cce3abe6f133ad92e7bee551e825d9bb468285ee65d049b93b04bdfb07833177528629b86f869b84c38e349c2891ded10a6938eb5b200d270aebfa96a775b43aadc344d5737a038166aac44f6857db3ea35d855dfb752dfba66564667efae356cf430b02fbf6988c95a3d29e6d6765c752d8cd3075e5ad1eab3dd4efa887a9d7512f7b15f6f95d67dd5ffab33ac73c76d53cf6ebac9c4babe6b15ffdc2c2f4ac31a57204969146caeb0acde4a5c36b3ce467e655dde7a596297dea2fca98bcbb7816d1a18f3df451873eeed06b7085e1102c7e36bc62c321589c606b736369c54e7ff79f0a665e83a68f9284d8893da3d34723b345741a7d480f414167cee101a65adf4d9719a634b975f9bb964d8f1c8e2fc74caa3b0f33a94ecbcca4647254a677ffaeaac0157c764090eab44c05aee0b34393325de698d262c9490eb9ef7ea6470ebbdfbd42240b4cc2155358416dc43ff4d80bc97235f1c363b6c424289549248135805e6483e3e3bf4b0a8263a809389ef3813d871ed87380f1293f30dd3e28f5f15d0df3995e8f6598568bf492b74627b9f665949bf2c94df27c294b9d4d1f7d429b3eeec85f22b1c8aad41de5aaee285a26e75e66befbd52aed275a467eb9bb296b37c93055ca30a5559822c93045ca3035ca3025fa606c49f64e92b79332fe2873cf72e8a20cbacd3cc054ab85efbdc57d7bcd8fa901a706460823a5c1b45a43689856cba3ef748bd32f1345dfdaf4ca278a86a030a9c800c7797910cd68a64a4f06f650fe3e26de6a16f6f8ab59392a162cfd830157f6c89ed922e3f5d24716992dfaf5f267b6a8bc7ed2cc16001ce52b4964258dec5a67cdaef30879aad306e5a6cbd84e4e4c47315d468ea9efb329329ef218fd4fb3bceba7e8b3f0656c875c4797d08181a4c10c340d07d2a8d247f64e7f5cccf20892883cd5cf2c911051f554366157d90369d4879a60add6fec58bb0e7c1b3546e80f1bdc7d74beeba66b798a3143db27f9c8641390f3085f2981e30ad1aaef24d7f39f0655c8777fd3b5bbedb707bcd725f0e1008140ad97038be1ca57f5795fe69991ced32f8a56b5a25ba0d5ac6bb08e732c9f900c87f0d39c655f2c9351919a65262fc24a75ce7eff0fb60504c00c83055438629950c5332324ce90c53598e1bbb595f4b9a181a4e542b45c3598fa2eb5b273afe7c3a1699a87a938e3eb67e2779abd502bd74d25badd0452f39c824479cd9227a15e5d344d5fa924c92759448a7513eed2aed419fc7d93bbd0aa43f7b91a73f2bc2077d166b49e4b3a2c7e08b342b7450484b9096462e3e79ba864c6630693204af4b75dd76d063bc779ad5ddf3406779df36d0268a911781360e04d29f060281fefd45721f7602da4a26d1c80473c7720e96f7790d7fa2832287237be4342b0706f434a4646652a09fe498fa3236cadc478fd91ed2aceedb479a956198adc7f4a78940f71f76eec3be5dbeea1e302d93979ee9ef5ec73c771df2dbb1fc5d9d83fb54618d0b715db77d3022502c21218d44a10e84618acbf35b96ef30137ca0afc78f22bdfac0161de615e4599d562b2b971d22799ee7d1733c88b20ff0d5835b48f415de21d157a51d0a1d8a34097a791577bd0633a53948159322a61883401844f1e1af5fbf9aa6359aeb218410c2cf4dcaa393e4f992bc45af99de835c8ed13d910733be97f143f82310a69ec484e4601feae9b50f6cf87b5aadec95cbbe5663d7b497d53ef000b30fd7a98ddbbd3ed4fb70d9bc8a0d8874be4c0cee4b8aa4606214fa459a357a8c8b468f7196e89f3005125d3f6674199a158395a38af1d159bfe831e6173d26c6473a87e87fcce831628c51089b2a048918c43ef2c17544bc39890a1cf202c3386769c3e86b73cec79b29e393e413e5b3e4337f9666ca344dd284134e2dc334525121b9ca4b2a24979172141d392cc6a8cd39e79c73460d9b734e0cc3b039e79c7062775e64a391c009678c3a07b8af0634fd22454f796b7494431e515ed12ea3910cad72191f9d54b40cfd6997815da43f6d0504dd7487b9b91831d15f2696b76da351affe6197f1d145595ff418191aced1b5168948f9e4397f7f363d462eb9969261ca848792946c72942c32b9e82f72d7fcc1944a24393bd19fd661a2e65b2d936e99e8926e956897899af324ba3451f32f920427bca8051856ac560d0d34387b8278a210a861f6574a0e07f6afd668235b486ca6988773ce3967d5b01ec932a7c0c49e3fc15560cf416e8cdbc1005bfebb6a8fd006be76096d80b6afe6d64ea18dd0b9afaeadd5ad7d6545a14c210deca02cb187bdc3b06fb3046960a37cb3a801f537cb470dc4b525bc9be678a8324333589acca05d2a39d83bc8fb256febbeba6b1b777ca857405cdb3be89a97b79521e0d0577487becdad37706d1f40f77e857e890eb5e61d5e5f9d6c0f6fef269085cad36c29ddf37e674bc9bd6b35e7303aad59ee92fcd5cb979c247f557f39e6491e235ff27992d1719e7b947bc430369ed464c31ca49732498ea5f922bd0c3acca08be0412765d87d77ce6ebf0eca387f5f8fb829dc5e865b24058eef329725a491b3bae131bbe1ef05319617156aad2cc0dfdd46f0e30f776de3324cf5609fecdc63b46f9a6371cff417214e109b1b2db3c10962730306fe2c366ff2187993666597379167699fa7263726719fd87bb79a8ecd8de93b3c3d263615e53423299de2f85861432446ded3ac2d661edfe61cf3589ec57d5ecb79ccf6ec383e4ccb26cf7470d7e251724c45eec3748bf491cd4d133a5314116213448a1d9e1e6ba4a708164566cf6c9101a3078c9e4d2f65c0b87587111f1fa6ad8d0dd6a3fe9a9c0798328169b5483eba297ff7a6c39449d66ef298ec26cdda9edd44b372549bfeee4d2e9f9dc5e9edf32a13fd61ff6e76f94d7f98a6f4dfd55ff6188dd33e3bd049b287334c55d0b68d3e182dee5286a97a897428b964bad4e5124c69f25bebb6a2cd44a128c80a8f7a9efe2e8c4b3ca251c76d9a9761f1070c9d2339602af41c1ef0475e06bdcbd8f3401efee8d2f82a9b9668e6674bc4f13cd975f9629e1e9d1d1bd10690063d8d3788a14cea48eeb3dd357a9d461b40143dc57468747462122df2d4de808e0fb9cf6a180f26a45bd9b97961cfdedace25117190355a26e7baccbc87b58c7cf717a9cdd05cc3be65e75632cc44f5305134af600e67e7d863ad831b7428e7419af57d7e2c944b5dc4880f11e953c4880f91b8bda6b391b2d332292797b288111f223fc9fbbc88119f4ffb268948fd6171c738287ff629ffdee5cf6a904e1f9bbfd3133139a59735206aa294a39452508c83a6fc4d37c1a68c71311f0cf32182c50f18201bd9f231e2c5114983d908aa01d9808e00d9c418639c628a1a3ac51437480c52ff61d2c7c77e3925b3bacba36456ca517e925927ffbee59879d0b59c631ef42cc7c877a792fb300d33e535bd557293a76494cc9a07fd24e7a8bacb7f9905f221026dcc4d2935792f65d14b323e974927c923d143aff98301812e12fd48ef10b57cb0d6a1830be702c219cd60126406dbc1d7cfc7d44ffd89b27f911603da046652f432c0e80177f080363af8058c50043ba6e2796438f04894c2888e91a8c92812318e943008c66922e2c0523c845f41985affc56079eee021875801bd88345408b26fa684251f6c29afdf4c07315171478e35f147023045b5119d3b33e50583fe7a4c3cd42cf8c8822ff8e637f597831e5e75a86572a656c547fd4d9978aabf39939a977799f29fd205945215235cf4743f48f5b7838fd8c4a61a088a8550610246c78b0e25253081b357a5bdb2e3e9e5293899b0d9f1271127b5823f7b477a47b0a308f66adb2dd719a0c303246a6ea95fe429dee50a8c37e462110f48b7230db7638b3f681b7210b8178880dc5403816dc839609eea68c5954158a80302914715855029361975e4099e07dabcaeab5e578d39ee79884d786dce3b3fe7fcea538bf19a578c33ce38e3cc74aed0a0ce8e9f74ce9803bcba70f68503bfba6ee484775e37b3e54ac5396178a4d261811e240b961d7ec70f3c240b7778208290912ca143d1e1e89074485272f81d3ede489693c347987218e3f0318864f9613ed4878f52481693437a883a0cc0a1000e1fe163159285c6e1000e6f385c397cb442b2d8704880c3ebf00018c952faa9060314e0abef03d470992d2d2c04c82af074ba0df92a1658c927efe1865c3ab9c000f2a8b48346c63fcc38d970e2b16bb84004e064c32908d4c986930d353c1e0099d6a0a2a10c93be509c4c261d4cf24a8d07e83c630526e7133ccd50b5e4124499ce924f3af0f5089e4ca61d9b3e7231348627d3e88794bc611e28f96e409c646a0ae2cb109e4c26872613bd92d9f9a414802470fc6a740178ba8ceceb8624f7004fd7435824912d004fd74145704659073c5dc756347180ac430d8fdb8112096280ec0251d70b90214475b0676647946b70dc0ed84587505ed96a3c009467682b30389fb2192a2fab60271d7b1e53b100974fee7bd872c99e5c60544b3bb28c2f6c458696b0d64a51852ea0903101df212930828604c6806087c075e706f8ea5c1ce01be4fe604c090d0b5c57a0832b0aaa15be00e40c5f686161c0160d591270688b6d092cb4600ad91070b6042e8ca00101df0d8778810acd0a6c371ce2851d2fe8542f6c5ea02902e38211cd0b20b727db8209ac163e18154850bb7073b918820a2e2347ac0e4a9045901364f1c3040ab4b8292205467686705144178e4c14bc5b1c49c32644109a2c30de7088133f603881856cc7092858c10921645738214555021e6d38c4099c5aaface172037e0b9f1990200c4d9b2351688224969eecb84d96b44c62d74af939b50e3e5ad64bd2295de68c134a49ea02f0850655a29c74442fd145e75543d582ecc517f3eccb44e11e2c832fd067432299c669dbb6711ad7659d8779f85e746290bde80485aaf480e088e9bc42a2eba25334a223d2bce8249148d8035b3ee14b97aefaa293845412afbdf6bae8bce82c2195e0b5d7e27fb6bcfc90075e23752f90467c2942630c5abcb6c41ffccc867a15773cbd284c8d13a695ce73801e44696864961b523df509cb1929af09ee95a718e5ac9f7a35e79c53df8982aff994ce4b860e8ebf6106d0fa402a2785d75e10b5d7bee6a6327d2bbcc7728d4bea3ecbad1a9714762dd3260685b66cb45dcb7138e6b96e4e128610c28b864a23ecce39e9a4934e92c92ca1d742223013057fd5a02748634e3a29a574d249a1d64a5b10fbb6fe66dbc3b499a6ade780ad56577d228934afaeebc22bbda7a95e96d4c4a5975e6aeb15845e5baf2794d0346dbbe8b5f57ae2463ae98df2ce39e913975e6aeb15845e5baf27ea652fad970d72d57ad927e8add713975e6aeb15845e5baf27c42027a5d5621896d9da838e0c07378a1ac096ec52f3883bd892c7f683553f9aa66d17de188f8d3dda6f5c3cc5b1d45a7ac3715c375f5c5c5cee553d09035f43b6449b169b1b425602d83f25bb2f8a4304126f90f53c62cde9bf805c561eb1e6d291e727d6781e87e3dee372907b1e6fdae1caa58d3617c48147bc411ecac0cab82351118798036f90efa901a421af3d758c02d290bf2148147883d0c6b5f7466cce2b455bb81b0830dc828a0ca312d5cab997ff8153d967f61f38857d1e4b96280a1dce6c66fa93d1e42f32fb9cf35a2c71205209ee4846318acee59049cec9b073397b29478ee38e71190e1ff59f3c4c652088d59c57bc2e79c928638c71ce39a7bdee9cf49fcce47c9cc7e6bc337297d4305867f395354992b95fa9fa2269a690c3e171c7dd41879c0ee1eca2839661c43f9c0f280f96371007a1c883ab842bb63428dc215be4205342e489316a71c5d64eb5671c0eedeeec188723c3b430c1c67e391c98e5705c3a846db308c2b6af1c0e7b69cb5e6dfb4ac0beb210c20811f6758a894441c65ecd8037f6dd82cf9e5c90c19e5c48c39e5d78c29eb30b65d802cd9e375b8b581898e796e167d3d3df2ba0b029bdbd4418a2852836a5af578b2d0b3918c0a643b2a005ec046d9934315399117fec558d1b14422c36a547c426aab057310a241cd9f4f417977e5a41c3a67779d101e60a23d8f43a7ae8c1a6dfc143c8a60fe20a26d02ca1e60a21b0f98173052e8214e1d16981648143b0b0854d630f8cc058075b5e62dc050faec0a92ea6130056d86c27c06fe5645a87b78bff03a7bad3d36e643a363936390bdf14510ea96853fc93c77447d12c93773f31797796e998461a69a4a6e3c798bcc3373da6bbc9480c380b1caf792f7925a0efa1d2c80a1b222739076594f141b94b49f19ef2508a7794929c8120705e756408c3a6d7b4b861dba66d1a26310cc32266354fcbd10848831e3b4167c3824d1f69a4596643210fbff456f7924c5b41f989cbb5a71c45c35a49cbf20a880d4b39b778c4339cbf0cafeec6220dce464e7e50b09fe86f7bca51dea5a0e86f3bcabb9f60c7fadbf497e3e4f83128dd4ff05f6606c6c65d04e6c6f42a6e4cf758007673455270a49b40d74a19a644201c0a792f49959090462210f6608aa39824e1d0eb7d037703a51db513ad1f5e1e49143d2e51c9d2c2f16ee2bed9b9c1e1787a7c4c37f1e4db4b27bde4418860715324e397f2e8337dcb9ce771f76ef2b89f944c3d687cc0346c0acdb06996591e3f2b08c2821b186cfa78739359537d96615a2d929bbc457ae9dadc628e43401a47fc6815b1e95b90c6a5a67fd761d2ac1cecac79ef9f8613a583d32cf9ed7167a2e86f963b04058ef46eee26577137e17eb56af49296911ffd457ae7f27693ccbd9447f3de55f3de31ad92df3eb7a685ae711dc7719eb77dc48d442110f6f4cb44ad6cfada7dace44c20e5a73cebfbbc82e8ecd0d868343435104339e950ae14ce2bd901451d9e2a687a24e904a650cee5ee11638cbba7e498f232cb74d2419995a3329d74d67792ef924eb26bb2d68a558c8b1d2e767ee022b358479365d7300d8382a281995d7bc0b44a2f39c975c893aea57c2685923facbb0abf3bf64ecbe4605ac53d45cb98cefde433294dc3342d33e9ec44205147cb30bc438fa7902c571318673fd1329ffeb0cf9370efb48c497f98feaece314f72953ce9f2a473afb65e23510854c25ec7d14c54ab8888cefa151e49543d9e2d5407314bb5255b5e2f235be8e7a314b2656a1b5f4f73ebc74a8abe06d36af3ddd7e69d1e3f66ded378c23044d9845877bd6402b471335bbc974680a7106608ed95ec8959d062d7fa8ca58541959326524a1819524594524252d2a4919452824026071d0564722d6e3a839e9243976172955246b9289b5ce5cb6c441b7420b6c41be8c0233af088b558a6a30ea4512fb2c1f241401bf7f51c802df208d8912b7dc07cc71ee201a664fccb2dfd94cb4b181414130d532a99e4883351f528d96a5ddf2a794abd8cdc4ab949343d25b74807dd24b74a1e9246648ff4813688d45a034370c20a32a4eca77dc81e54a279459eec71765999e1054ec14c94fd953faa754859d8631f77ec238e7d0c02533557bf7d88ebdca5d7bcdcc344d977358c601e6716d91a0a4e9482c73e566167cdb6d65a6bed9c35f66a62db4e479eec5f643c62db93bac0f341cc964e7ff4dd61ca9ec76cf1b6778fd9de7167d56f8fe1debdd3acebdc11b225e2d847ab57775b7bcdc405ceac5691277aef6e233ed8f173da5c5283c2a7833bd58ba43fcc820d7ec0e026270c653822d4853078010d477040e40b8ab91da64ade45fef2272f34eedffdb43494fe9e52ba7df7f0d65a5930640a57f448c13383548d3636d188fa0f0a6c836111ecfa036ddcc363950551f55206d2a83f1102ee997508ac02da98bbd62dec5aaf80c2aebf7250bfa8bf185e59236eac25ab63bca054bcf79b96c9b95ab5ddd332dcb7cb74f11ad7e5bd05f7ee2bc8e59954976752f0de7f52eac896183e71270aa94e08419023110b2af66ae39cd0a2c25ec59d5aabccaea5912c2b08463d2259a0135a6048967b825d2f97bf7b972e7f57fb5071ef7cf000539fa8fa1e3cc094f64ecbc8946652f32b977998d2beb980616a3b4c5119c9029d20441176ed3257df8a417010e004b6893bb385c7d2d89a7ac43b7e9195eb323d97bdfc4581b35ac190a7fa2c4b9c6311590369d4d723d006ac5fc096eed58260d7ac1ed9b5d31ad3abbb8a3d31c3590fb7d4b12ac520c01698aab7de4caf30a657a57aefb5bfd75a9c4b8a6ea0419528f0a783bb0f4695a5f616b0decab4764c944419c1ab4805153c910a385de00eb06a8a21a59452d0246d18ab30bb30efc518c693665202bc2a9524cb6afb499cf341cc9b6b66dec893bcae1eab6fa378a7fcbcd1202cf263c5968fd0c6b58dfcf4ecc8e1d8467e4ab023b441b7911f20ec086dcc6de42767c78be3018a41072df0c21842800521782105212a421b711bf9b19795d65a68e9b471eb62165f6c47a21045036881092360b085125841848a9e22499c000462c0f9a204dacd486621026708021a7630c4901c1021899d1f1c0143128828030e8e50911d81849ac184084bd0e2094610210934e820878b18bce00948804113864ec8111a6e1ee164c3215d80610b9f96991364f153861a1b248290020610f9c20812d00081e78713231fd8706d90b0090311459860051262d0050c74963085163610528622b432aca0bb26a0c2dd465b174a48c3cb90051c4f6ad470b9f1824b9864c3215d54015f44e8204fb5c6084738a20233f84021f3e20c341883144ac800c81448ba88718bd00b88c20a5fc8a2082668c10512941082186460c50c7c308531e888c630045309565fb8c119b6c00152869d511521a9051b9418e20a42dc5ce1838417359e172ab8740464a0c29409e17384204f20020d3b2a3facf8c11658104184119061089010322081ba403e800384128461070a5afc80573043088cc88289224ce1092facb079a185c925c11524631043954e10e2851226362226386e1303184a861083266217432200361cd285135d2441e2026b74cefb22471b0ee9a266afee6e02c38b361cf28531ecd5bd9bc462db34d21e854038c6df792d5efb15ddf2c6d8295b9b1b9651b646372c9fec6f6b75c3b2696b76c3b2c9d6ee86e5d2d6b00dcb255bcb362c936c4ddbb04cdadab66179b4356ec372686bdd8665d0d6bc0dcb786b78c3b2b735d086e56e6ba10dcbdcd6441b96b7ad8d362c6b5b236d58ceb646b26119db5ac986e5bbb5d28665bb35930dcb756ba60dcbd7d6be0dcb746b271b96e7d650362ccbada56c31505262fcfa686f79bfaa7be420daf497dee19b7a2052134c196f9a1197b6937a096f9853671b62d1ca11d553b443d8db67e2965ed775ab1f6315ae1b5c8bf72a07bc7bf0d8d7f7b5784f4a5f5536d53fa86c284f33b20630ea8ce58942781523e0d5b6e9489e288d7a244ff487f873422fba7fa0515401d2882ca0f252fa604f39e79c73ce39a7ea003e38fe00463840153038825774d3fb65d8e3ceabefae3efbb8b1bddadf75926d63bfc82cb2007e0179e44987ac29e9e015dd13428d336c9bf717b660bf7a456f75cd2b950db7bb577425936113b25c17a5f033218841b3e54ebcc7235bbc88061c39af4706f8e260f8d5f57a0eb0bd4b0a18deeba15e8f64815b4eaabd1e48c3ebd9f2d0eb8136600c1a1a650b54281658dea0248b70c365e29c489f15214ef20b2f3766e0526322b1dd2033547e521a9d8e8cb09ca2c68c93ca4f4678bb7402b92ff84969843715225081d2cb524aaf8b527b5da5aff858122cc184baddadd6aa4411945e96527a5d94daebc2a393252a17b28cd62ccb28cdb24ae94f2e45a4a818638cb1e7799ee779b5eb3a25b6c8325ab32ca334cb2aa5b874aa46b28cd62ccb28cdb24ae96985c716e1397969fbe874c2275c3af1d42d507a594ae975516aafeb86102a8accd82bdbe844c5c505bb6017979f5c6c50bf0a75b7ab5ded6ad7711cc7711c57b7ad564b2bdd6ab5b4564b6ba5d4da4a2ba5d6da4aa9666b96654af020cb68cdb28cd22cab94964e5494e0398247e5625c2a9dd2cb524aaf8b527b5d2a2a2ab874a2b2048f1155dbb8ce2b618c31c69ee7799ee7d9aeeb3c23945e96527a5d94daebbaca8c257a3063c68c3be3ce285d6586fd4196d19a6519a55956293dcda861b930da7075b3af32edab6dfbaae356a1aeebbaaee3388ee338ce6edbb60417371d6419ad5996519a659552979e2b0297192f3c3c3c3c3ca7151e7b4584424affe9b4b2e2c2002157c81572855c2157c88a10971b50c81502a597a5945e17a5f6ba566adc58e202f1d1630281adb5945a4bb39be95aaba5b5d65a2dadb4da4aa9b5b6526a6dadf88a820655e0def0c6defa81b3b77e3c158219c68f95544e8cb4d6bac57be966376bed76e9adb6daedd6de4b6fb576d3348dd2aabd564a2fb51aa555cbacbd97de6aadb5d9a5d766b53ed65a6bacb5566b312a638d1b4a194b5c8c042aa76d748267cbca0a5ec12b5f99b6881bb854fa4fa79515972ca335cb324ab3ac527ae3c68d7be3deb8374e2b7b7563a5c60d1394b68f4e272b2a3368d421a2e47b760f863d11f6ac6c17d843f3e3e4625cca325ab32ca334cb2aa52727f7045f57b5af7a757d758265b4522ca3b5625846abb5b6d26aadb595521b6b1671c6af6a5c8c4ba5c7c802e5e94e54bc945e9cbd8fafb15a38e5ad1c8e1a11257f2ffe5ed588a7d5699fb81c66ecaa571487fb95dcf630e280ddea55fdaac6bdd9a5f7b2d7cd7eefbdf45ed6de0c421af7d16e40ee206936d53d6618616c7af9817d3dfac01ca08511c65ec9507a2a33af28e1bc34ce17f922a1d5022c62059127c8934f153d4278e02f94c22548133849404a730068703c0582de06488d3cb5e4a9ae946864e0e705048f1f765ca0070bd0a9439ee0495800218410420821dc21c61b643c7184943622102c179d3ee40642ca7803c481521a81905b4a4a6984f106f8c905ed4a16083d88e52f4ae927d451473d2509a494524a29a594524a29a5bc4e3a5401c0e1039f16a8042b5bc98a542aa5660600000008006316003020100c074402b12ccbb33453dc0314801277944c6a549c4aa324495214648c01c61040080100000308102846201b0050b7b852d72d16177ccbcfa856c15a7ebe85802eb1b02341cf1e049cf7f3672e4be7c9b0bd6964c41612f4b2287008832d7b10a111cfd06f9ea0f52d3a4a881fd4141bbcbfacdd972747f6cb88a5b6c94312fe119987fac4954f087dc82213fe4f5ab7745c5cface1b1ca0b5859f8c8a006c5cbb0cee25c59a71c35f1e43ed0cadce7cadc3a5ccd398718b857cd21e717c73ea1a88ff4a8622bea4b4cb1ab99e5497d2467eb9f219b7c091b9610d788749fd63b9b8a2e717a9b1396e25612c80968fbed8dab93d3c333233dae7e65d223a888d30edc2e86ed380d319cc1e512e82221b70bdb08b343d380a3758d10ac63da7852b0c8c63828ee864416e96fe8b1cfd1e0d0029858f2795107b54f4574bbd70df3bd6e1ecf6865555495b3d3dc4694a04920b0da3443239046790a4c6d5f6fbbb256a5c2c9a8714dca363dbb343326116196daa5711eaab1adae2fe2f4e8baeb3d949ae14b520e58e1514cfa0c256b7a45144c6df748c099e54c8fd3f1b2c2d8be5e9d36dba4f39ec1af2ce261e38bccf6dfa71ad3145b4a1db464bb36a8a9ce2dae10f3da954adab68fac30478a2aab7eaec988edfb7717e901459f70fd64a331447fb6d5085f325b821ed7bd4dc9d2ddfec0b0f9752e9e5ed7d1f995e99639c6769f3513270d8df9275be234634a068736063fed4d514d86abed2715991cfbee53268ef6715c7ad7081ee33c652370becbbe7cb257ab21dbffd50a4900cc757839fb608f8db99d54eb9c62d8a4ebea53fc283489adc1ec857176d13cfd87a10618abac8797dccd5cce09124bf5459ccb3874840747139152298637adacac766de6b374a1b6ad6e31086ea7040254e84dbf8bc65b4f43c1ed17434c8f036bbe928e4be9450406ffa74d965841b56519296d3be92b0c300d6395170eadafb3038d3c834a29b787f46a7be16750ff002502642c09db0fb019710820056f3be0806dd70c76b0d5f69a8624e25a96097f5370e7dcb4a3b6f32e829c38737d3524d6cd374650f5523c0ca06a0f1a6465be77e65f8dd2513f1db100b7a2384e1db683f234d48948057533d2b70e1e43900c52660781d6cfa4ac2f730b030bbd35fc457ca312fe4d71b7a6df2083d4fad4e4b4e40e355f74b0fe8e6cf911d18446430a543202f1506f9d745585ce61b9dd8b0d3826dd4b8482d438353b2c51d700d49104d099f1c79c96c026cc71482d75e5694a5d55d6f8656f10c8f9523a1d75196617ef8e3fd3b36ceb3cbc88bbd3d7853db93e80d1d8e4273ceae154f6994a73dcab374aeb1e4083ee8094e64a252d95ab77183b9a07d1013c269abdbe1c559dc58febd61858e1797d1611d79e1aa5c2e3cce1f88936ae906ca5ee7ee219dcd3b81cee22ede8a56cca33c84aa3acdf25bebb049a4ae80c1e02ee7d108cc0ee125dcdd2338a4d2a6acdbc43fc460b2bfe5fe695452edc56b8d0abb9cf2fd61aa8029c5cbd36fd2612f663e45f742862f1034b7703a8e30c856f362d5332f0865d837a9b15054e61ccd4d83a4b5fc481b0167ecfdf5565e8ed3458b5038824a643d10c8136d2e9b04f019b7be0dad3904aa91df9a2771f36d79c2c80720df310fd8a3d644e4f149a5a040f882c782001de590cea0cdfbd966c24aa7e52494278fc8b474571ed2c612101ea3355e70ad3c1c8fe43f4498f69cd9d021f29c2abd1bb503f55b79c53f62704496b7b58e31b5bcdf15df302eec6ab2ce30a7ed5d39692200790cb068da0dce889855f168796e469662456d512dd326d3cf528fa850955828717904ee467ec8df6f8d5ac5b80bc8aa472bc9851740bc67ae7f1826fb8314a0cbe952b93eee394d095bf2b7e87f60d472a10880eacdc91655719b8f724e89b6149edc772e1d2624e040f8f6b5bbee5195a9911b2811d17d8b51fa21e6bf17b44190eaadf2a4a6033d8243e2669a0401ce2bc80ce6ea55de4dc0e07cd3e3e0823cd6d25b58b63ea1eefafc7945d335fb424ab283591d0cfe735604162bc9d211a7a39079af1296043ac1bdf9cc4c4752dc14203bc496a55b92114d00c7e39d2c5e440989667fb7205c3dfbf2963780d589947a7156983151973014ab66abd25569ce83f8206aa4f385626611fa4174470ae6a434a650cbd8c555c680be0fe160f0d7e1dfb64098c406bb130c9ede8c95c9e02ecbffc2715e56206d5c305046c2a43adaa5b258002c5906d3a97a380f61d2b631d0c59b4f70152e506e636daece96079386beb66a588b70daa24bb6952fc41e88e02315a198265d62040f392e6a1023a98cf396b2cbb09fe0bb51615cf4c5043a6a9827d3d6d10e347411a2810b44f8dd7fb4b372362216af60cca3d149d476d969015372f6822eb7cc4b260a59f392d95fe8a9a0c523cfac8cd5028dbc6bfc4d2c28d84b62f2e1c52f59e2936e9c503f497694dcbd04ffaf9d6850cc2b34ab286a5e691f233a24f6c4097eab88123d11ab904c101c9cda5372cad2d2587510dc30dec82f1045814780b70a2e3993cb9e9426c86ead45d740ec1e505188947a695054bc5227c8e9c88db6d40932617c906126f66c74b26152a8f414e0ba13df14af5122c5499964e88cbbc37e6478c10799e6d48f4d40f1ad9faebe170704bcdba79ec0e0268c83fc5b9cb86212eae97aa14005c808a11260c817358089cfdc63d7032a5b87cbfdc2325111ac31b5bc6fe41bfa478b3c2993c9c7e71f51a5a8c878422f85a58b4482a07811b2d7bfa0f26fd9949719e85313d23548e5a2806dd4b12aebc00be1bbdddfdf0f9eda963f97d0cd4035036c15816dec3e77fe8bd679af4e020eee550cae59325509205247ddecf70226ce1c146efecd700f354f996aeff0701f11005259a1ef83ec38a8ad069da0ccf4eb0209911f694977101c8d08bb883ccd5f4f44e1efc83eee81bbd53af1b718d0d450ffee29bbcbfb7a34be6d9c850e52be61e1ebf002e422fd85d840fb6163c8e1ec1e4ff0ce5c14a08e16363e0e0d9ccd5131ef3490a8f7587ba978824fb0fd0f7d9151f99b23496155bcd65860ce7dd7dcfe62283879b5cd585abf65d0849964e90874f02853ef295c7a30c7c2314a06aa591f49899da98b190b71474355d53c33fce1cd83e5f595ef928f4b8ff204f3ef6eba78b17e23024d984465ef2481980183f04ddaa73c105537a2f3ba39e5506532141b7d5bc025bee691cc45a9b87f469fba82543354c895dcbb372eb91b3a4d0f83a886b1605b61293621fa7d19291a255806b6ebbc24ba681f5ff9d28120411621791ef2350a36ccc8e013ebe6b9f31e872b605e8e4e03ba1e21fc76b8373764bd4829fe60071beff0282006116bfcf5daa6bc8d0106db4ff38944d924c9cf93b2100b21ceaf2023c7724397a36bc8a41affdbb802b94ece0668c412eef9c183daa15aa4c67657c19814c0e00c5bd622d2563a195188b09410421c95459488cc86430a2f46d451241ae6f69deac8b64ea811182d4900504b9cdea7c9f49cc601d396452274648b19433de94eb3bf04a52437b25458608930397b8fa6c94cea80dfb0941987ab4060cb2a9d5bc8505556943e2a51680bab128f0d8d2a2ad2be8a50aefe7b657f86c95566530abe8c37640decedb79c4263e53abb2fb9a614c3df6892148ff6ac84135a684b1b63184746894c1a1f215ea0474b187e4c296a61b706739733fc80ac093b2cca1f5aa4e9104791988a7cc6e993370eae80ba85af50b732434f55eedee8e4e0c0bc9fd4833238cc4cf01d92bea433aff78cf20e03379516cd1cca4472cd79b9ce0cd64a43231128cf69809ac06d3a85a10c5364d0df063909c5c056504f67b8edc23d45a44484cf08235363af02a201cdb66df592c5b248a5b3b391aa0c103f862c04671a434c230a36748d15e4ee333aab7ee8fd1dd4095fdc1a9fe698c3b548a788f5e7998e475afc90dab515ff6dc43a7ade910292d23cbeb931ba134fa90b64ecb4f7da6d5d969946f4be1cbfa79f2690cfdc4ecbad2a0e63753d9d0116511a9a36fe21eb04b7745e3e1a365d2afd7df4abda62012a3adce91ddd2454b51b32b233174f6b2fef3496e4fd60937ada2a6321951ed7a93fd1073e8d1b2f36f0c32ec6ea2de80807f2d23e1624160f612b2db7c823f3733ebe1f4d30dbd4e53d9fa9338f6d306eed71981556a5d31a41a3af9ba4edc25b1a52a00a8c63e3f58a4ad3c835decbd7c05b4bc13b012d13808f6f843d4df99a0150e82f6bd54c1761058d91a8697e37a61e70ea2e4d46e1e6282d04fe09dcaa94b1e7e5d65467e6a761a50374b8fa00f70714755e5082e132a906ef117b62389c1afaca726878b25a855d7af1effaaa7d0de5d1ea324b9cc7b0b97446735c43a5a94d534a406b90d534cfd71968e0d8bf7fbe0da013be04049df76e1ff61c330871b1d2452e83caafab43f1d04a4fca113a0b17ff1495ae2502e08950009e91a5e1089ca2a75f6e68987c569a811ed3144ca4639f177c74c38c618e570c8802208d4eae27cbdf4d4bd95207850e5b10ed579fb27214a6f62edf353b0e52e9b277f2fbb3c6b6d7bc1dfa78e127076e18269ec2002e6c52b637c662de88f79b73aafaa0984fd5314fd81a5b65f3a7b032f4775646ff6e2b830fe21d50c4fb81e32966664ab0d73512c940b5abaca0addd3edba0b4601c5304710bb881f63f69c741a83c464ca074713bae89218807952ee712ca9fdc6315b73a997829421c276b0a0d6628206c1aa0a12871b880e2a60aa7c9771c80301ac7cdbb377b46b6cebc39c1a378d27f39c702d18dfe317b2ea76ab033b60806f39367de12004aacba460ff7faed70dc96e7d0b03fa8020dbec7655639407c7460b661c6e92c482df2474f1f6f1074c11fbdfa1893d56aeaeae5b7af1a5eb20941910f9d026a30fff075ee6c429181697d40ac0a7cd1e3f0bdf561cf0606100354b2808b67fe72ed156d5b9917cf683686767220ee324b0ed305f81db51403e153d66fe6b484c3caaa87d7eb792f9c7bb0c8f8986b39f8386a677392abcd7525e103d3ebf121a0987c1c81311f4da4b85ee11c100d9415f47ad0fa9c3850cca2c4807cd889ee83b9abd8900b2c6c58a4d6e4681259834e93d5ff08674bf9291bf94a96a1ec6e7c7e43ae0139c918c4aa6a411989801b7198c0a0f3fef6c19e73061013f45213ca08123637455787dcf189fa91de7a0176317fd66e7bf4bbcdb0dfb736aecad21cd07814fde5624d81f7a79d6602ae8b2947138897ed048b04dfc108dc5919126ff72da714e5a1c4b4d3b05bf1fbd0635b57025ba7cdd9fdb0b2356218f43a60e7a4310be511237885f04e1de503f95ffc97573ae19ab1421348565c4da4cd9d63db1c689d8cc18a74fab59a0cc5a8ce0afa6262f771df288d294920fc74c1b6c5cceb5808040206bff9ab42d656c3945ef735e1880745dfc65ca3baf552b7730468005e37227c881a4b9f94b1c9ca709e536f58d654ecff336dc011cd89b5b94d07ad8f83edb9c6beeea9ba2410034374094925c67310812f0f2bc02370c1247b57e6dc2b7edd2b2b67b957729273861f487c7d001d164967f07eb93132abfe7ae6fe2ec16341c2adf3d27f0a045228962c5f4364192203b79b245c91da88b01a76c873d2bb43d10d1a7eeeabd86f4e28aacad56ae22419288870955c05025384c2585a99d10a5dcf24247a416ebd4d08e32abf19409113238563aac693f44b7b0d114430b31d1a495ac1b33d336ce60dc702045ed277c38d637089879886b7e2d10f5d5a564d2ff3f0c8d5105e3cdc23118a44d538fe32274a9c0586a0c82c81ea5e7ad76e766ed03ee1a53c56795f9aca30d43542462ed4620f951a165dfa11266ea93a3d96cd1818017ee69ef44ddb9e959c7b0705de269d5abfada1dd324effa2ab1b923d51ac9f75eae2a6a3d24b0b0bbffe3d012e82ed36e14cb2d12d0f92fad567038bf3e213189a4b6064322b21007eba61d632c76b06202cf823ba8d07c280345d0ed8b47b0444279c2c32e0ac40df5dad54e1fb0b546f9ac17d76637a73066b494e80b9eb89e3353a03cd8767b4bdcd1e370f3214d214ea8822aea093857dcb50e39c1b3f55807aee18820ba897d4696e0500519f7f4563a3b9e71e10eea54aaa23fab48faf22d5643ca1c9f58a3deaf31beb33af26acc45a1d3daae05abbaf8d1b289ec445fb27bc2371f123f7b6269441263c9b10003f1d106399e33403a66089faa79b4d43b1dce4fbbfdce34238db88c963be6707f71cd98b8ac373320770150fa91e6226863c00c972026650cf8310f4c526257cb7e0ce3f10a4dc7b6cdd6921c5ac5e0ba35d5aadbfef3c001346d8329658f9d086277afb18398846276069d1455a1a971a25634700da92b9f53cb99e0fafb84822e0fa2280fdc7c6d306febe80552a853d947e50ddd678306ea68e23ea754e235ef129b714a8ac8fd3451976085eac15a1ccd364286156be90ac86aa7623c56641404ce4b512d78dae2337b25dac83c9f7146957a7b5ea72f60e6ec8a13dbc7c57fc03dd94dbb901b38353339c33fe15d1e9d0be03e4988681eee433471797e3842cbd3c3c972392e90cccadf9b96e0d013a8227754ecef510f9ff77850e8826b5c4162c25f6b73f3e381914b185a63db7bc1314e53f27e7894e4e19c0f89936b0cd778b1ed5234c8e8827c6321bf35489c5fa7bf4c861e83f0d0b7f10e067d7ded8d922a5461fbb8f0eda43a8a1865a34a150924c478201d513d5b0588ba15f8f85539b3df889231f42c72bc24082669938080ad221fc51cc59a681881fe694f8c07be2dbbbf4f1d50c5eccfb1ef9ee4cd4f8abe862c07340ad49f3dab86c04e301426919ea8eccf78519355a183e46f8dff68a0b1d42d2533878877c4d3077643238617c8a6c836290ce36c4949b03fa4e5889d3d05373565afdf77b9394af52386e3d024546a7b14c85f48a14865e0462923ea509d183d6a06fe52b4d0e40e57ed33f07836862dbfe738eafbb625597e923d034c11a9395a0c8047163430ec44be8c87a77af9f7a42fcdb893d730a58ff6605ab1d449894d13762bfbd1c74bdb1f72feb34d3b477147010e0dda67a6ec75ffc5c20f76286e553addafd7d8c0f73994b9fcff0a16453f056e6c1ca5c659a626db5078420dbed190c92684985d0b174a80a553efe92a181273071cc06709c23dddfcddaac2721adaaa3fe221944470064c7ee6d37ca4abf19108b6ed3dcee7805226ba3cc7ed8b74abd6371ddd466d2843924d80d4364b575233c12731a4472afbe3b0675a32c13d7a97ab832fc5184db35c9597c3d9ad255215ff493dc0723692632bfbf78aba2c96b15c1859ba587a27e9c54409338a2436bba9f131594054f0963b88e98a28ea889320110c4d7398d44a6618dc93b1bda8b48ab35cdfe014d4eab9bd4559456575420bb97609eca4b88347848fab34a161a27bc3c031e7a0f75a05b381e1d7a2d8fe8ff67a0a3cf20c32bb307e26dd4881de0912ef24c39d05028dccfd09c3c0319909c415aebcf1bc64aa415fe6911cdaa409f5e1dfe9268e3f9e1a3c6db9db661d298ec3ff258fcda44bb751a90e5690723e83a8274888d424d7e9fe66b6e6ef7558f1553bbc4a2e1d25086465f6d2ce9a17b09d47342ce5c06b8f5b11b0d405adcba565ae5f8be0ddd0f25499e9c06fba34eebd3a7f40f72812011391814aefa023053a2fcb0c1b1545743b1ee85a61195da35429b949d72590b2b4a817e53a3408f667d966cfce1047785e61bed858788e2287cdc1ed8be1f934ac2af88c52bf4a332915fe4e87f62f456ce84c6620308283e22fda0c7a54db219c00b33128bc288cf8f476ab6acaafc2598321389ad6bd9345ad13209ea9c1ca60fc47eaa46d8bea5e773fd248008ce5e0e8023fea4555379515ea4441de46b970600a8a2053fa2e54fbe188e9e198e938ba359f9284a3c1892c514b078f886b72537fc6a08b066b412880dcb13271c80e8a99bcd334e3d912a737198394ab662e98e1c85ee6e725a0e80d5dbfb5a07c58c08fd2b2fb93251b824424295eb621d63a7517416b41739aaa0338718d7c348d3a7f444f226f121e0e510c48e8265c7516ae18be42518d0789d87251caa2b885e00bbc9235c719f778cbe806b20bf61be44353fe1b0c840d440d4deeda23966910e236ec0dd4b8ed5f9f559844a6bb0a0be492aac6901fa27a9d2b416a45f1154a61a16d467095ee92d1a1644d8339e8110f8c5087648c6ab8fb748fb1c2385c39b84fdeb144703a5ff984b71dafa3ad012b80f26893621b6384ce4368b9a101aa38b2e4e6c16878377eeea41e7fcc824b559340aaf238e0e2e03412319b93a66963a57242a9cee5d8fa8428ad89d657ee9353c01d79098dd7a84283c58105573498a85feb194a5121975f2357be6c88bbb2c9738d487008d67fc387b39b378cc058944e1d7503090e18349f027e60fe8b5b1b9997b018e6cc1f18a8f5602f1d4f4a9c02c8bff57fede1d2720dba9d1c3fd8d3b5c1cdaae47ffa7fbc707088a5e22a748aa05c64a82995080fe7d16d90f90719d880e7781f9fc57378cbb0eb74e75541caea003f78fdd7102d25e1fc8cfcf78bbc39672556eaff0a059cb12c86213a3d12f7ee8b937e0b2c328d8705fb3be73f5e0a690a29857b00c467630dafefd6f8b7bbb8d9472ef3e9911cd2bdca0c6fca3f33ec46b0da293623b06b43f2411708f1afbc8885eab26389d6807037a1363cfb154902b9d9503b758a36810599ad81e329592d9757292d1b09ce6140499ee208d070357fb8c8a1ded74d9796118681e490d288627065a8724039acd5303dd73c94e0e282c86186fd7239cf65e1ba34383861b255d8b4d5be0d5b2a27fa5407be942c9ac50a9fa2a2411ed749502da1f0c146e415e8d86f89795320ef24a350a3adf83e017259c35a260316ab8792218683e9774ba9fc2c688e9767af0de90c5dc63c11dc4060aa7eb050dd1b13c5a61b2280aec65cc941354c5565080bc71c75b1d3f5225573c76195e8778dd8485e7af210c612c18a8696d350d844fb81f0eed8978f4b04124b18d8596c4954e9dd994f490f2c86846cd2d6ef1b04d55bb17f9576401de5c1ac68ced9b197eacf88cc77a709cdc014a39064c370304199ae3c026f63aa2a5416f9a23b4517407c1850ad9a2242cec0ea8cdd4b32179cecc60526677689ac72be21d9095a1888d7359d2899a98029da5f25abed78d370dca24a1c32b2fa30b4dd37a5b25c28eb4386e26126b65e76a8c28b54363cae90e703878d2c8d134980cb8d8511f82020714a7ca4bb8c3f4680fbb2054f46b9302253f50848450b97fab682db48dc60571cc1978eab65b18a6c642d45f21252ea9c7f96d06c2db32cceb31621fd41d2a32ca0f5a33a48157c963501dba54eb331a67df940a15be7b4f283be5812a60a47e43c3211c4d91232343e125caea5136f80eacb30abbe899382b96a1c06a9a7988774b4b2af892c458f111310fef1a88a4c2ddddd583de6795f665826fbf77c20a74277d14ba90bdeb450742a76ffb04adf837a43b70ba376f4e167f63226b48538b68a9cb4d7ba799ca44ca33283e3d0a28f6cbd8ea691ba7d630d62d03657c0d286d47dbb8cb0241167af49d89762c78712d0668f96a51a43a46828c9bec1eb6faee4ec250e1136884ec85d3ddea12c25524290c94a222af68ef1d29dee19954147c62937b13911b67c5844c25e7dde4a81473ec9c424ca3ac24849d3c2a09001930a5e38838b54b363ae2e85f2175a73a618fec399104a81cb2ce43212808fcaa66c3352fa971a73d18bc458d02c784b48399c0c706b875285091369b7cb72b2dd34b29379ac7df70c069628e042fe5427ec4a69ce248e88d00537d17a22313bf8281b52b42d33d76fa5918da989367b06082169b1a0515e890cf7d95e5e6df1cdbce7e6810997218ea75ebd22e121c40b12e3314f5b8c9b2cf603099e5a7f4d2dd303b6228fe76b1f39cb866081b4c008829fb6464d314e49cc3f9e0dc82b7bb71e5982e7103f6797cc99457087941abe703fd597a8d28de0beb28d63fa5a39001800d0c1e0382df853734a658c2a48d02177e82f10f93c47f2aeb41338075d529f93d7eea5420d7b00215bed716a9cb242c90e7167fcd7ce0890ad46dc37d0ad8fdac14a2d5941d3fd9f5f49f194efb005d390f2d98f93095c42e71e1c6f78186c48a02e660b617b4de049f0bef68ec58de91f567b86c2749d07a438e776c46e07364ba2ef7b86d4568860900db054defc3e78a37d4f87b20ff8690144fd5f3e1d91d2aee2a1f5802dca4eaa067af74f7eeea8211be87d6d5e0f3542df45e961c21880347963322b4178bb0963dc7120a2a6985705ddfc473b248ca17e43c7d19c7308d77fcb4d07e41ce934fdf9058fa4809d908725f1c2f3487565a291acceabcedd91003d93d3e5f28a6047a0a11922dbfd0900a8a2fa1129209f571197e8e24570029df4a01fa764f8ba01b01f5f152a29025b90fae0295c2e736b5efa5fc6d680b979818ea948407ec26be939cfc8edd596ca2df7c5c8e5648bb9b8e606f21655fb95a5f73d4924fccd54fde6e9fc82a3a7892e5b613462247d27514a1b0adf2e9ae7903265d88659707a9c44a788af13afa90c8af8229214e5a846a1560d208739725cbe61975620e23e29dbcaaa8393ff4f5ed4a6fcbfe2c555b9d26a6e14e6b7f49058532a8212548237805f464a71227a7b246532b49b5cddc4b384b6081954f6ddbb3c4a6ce21a6d7b9b45696919104dc20cefa9ea303275aebe6fe4280916f177b34197499a06bea35c194e11b0d44e5b9a39b06a710fcd9b3ed9d8ce4ce8a7556cc29786f5a34e8c10f0ea9b0b645b0204916c5fe0214d3dbaf500e6dc3027e92a99d90775dd92d644551294f56d203eb720f79eb559e16aa152f228133506c4b117c8dd749018ff8c60b90e0017f33aa436401e88f37c327e99f18f23da94f4b5ff952eadaf9317fd109367b2b4a0839c18c78018b20091b6cda5a92749e8a95c457b7e7d2916b161c9fb1b1b615dda027a621e054137d34a967a4599bf0b0724cc4be1634e7d84c9e12a202336462db2b28ea3936d694d6263c63322add833e0c0af5493e33030d14f177f3606b5f9516a20d6ee81e514cb2fe167d26d41112a3c9c066ee24c941062abd3433dee00dea29df0fe7a1802ad618656c1bd620d846206b5c39fbb416a009ebfe5cc1c0827106bb8bd84bbf9361ece1be6646d5e6d611af53c5ead1c36ab39294b21e7c6fa997f90a61178540200cd6e8d90b8a0bc12bdf1b6a836d2f88310c90bc2f7020c952f9280d0823a6652791241b81b80d44b289b8732fd348ff8e7802f41d40a61fb54ccb0477a469905fb4a7b648fb7d34164e99e3a99a97758a68a6ffab18e2f035c6a8673c509e443c5a936cb69367503cbbee25a40440b6328fc3e59e6225a8573568b4d5c887c59b421e8490eabc94b296af4a57ae49255a113ab9c8a3862c8c1b8099d0494bead9243b6e68f73c01563a42053d8bd156b79b64b10c0c99803c224d5dd3dc44111312d2b0ce7d7b02d6536b4a2a754b13f85ea60092c49f77cf61dbf575c6d249207b16c40653b4c9356a82e5c83f280c25a6a94db17fd58a0ddeab41c3dd9d3acd0e6b0d12efea746f428548c363fc5c1350b377e0b3beb2356b71260dc09d510d67d7f3d8cb4780dddcaad5024a3813e3ba064d4db33ae9cc44e87d64d72cebe0595753f0afb50f95647fe89a6b1c188e2ffe55ed6752322482062735217f1a89a8f63775c14495225b6793078b689ca4c1eb8fdf774510fff6ae73b0b5d015477b2a3d3117b09d8a1065d34ba2f29a80c28a901e945e0e0200c4d2c1a8e77adc1b01fa30ad0511b0c9dcb9a8be73b7d6d48c29d92ffeb37861a33f21a0a918f30753cb4b345b1ed6973959dc221a62ef1351cdd614b341927b156123ee3592bd97307d210b43b3705819435656d50b05cb0775eae1811466d5969c45456a746d108906f6d284302d5f0545fdb4d2db695f9ec36869f460df2e5a16d71a3424539a1c0ad05c723bec9e79077876878fd7772cc71b39e4cfa88ed33aa1cd4fe4f4fc2aeebd61c0bc8a0ed08c7eeeeb3add9c29ab60cab2a082da1e03514d66c91fc552f8d3e3a6435f859dee669e05c493cb606b442b77d0789d7f017f6ccb4028a1a5399cf9b364075df598517db7c00aae86cce9ebea1b98c6e22785cc05cf3ba0a9f173d90be48aaab52ba39fb0c2e99c4875bb8e3de09a6e4de7750cbbcb4882f25b333cb30ce2eb77971f920c2dd5ce287cfb0d87ed24aeff2f939b21a391080a0b8bac2be0097a38f88f644c1e8c8336ea6856ee682c7e91cd0aa37b1d497834aa5f08fcb13ded80ba92aac9c2908b37c28e6854446b80201b7f2d345ba02cae439fc1299889fbbc36007ce4a5197da56e31b231dd83a018d17de98b376bad8c4fc11b03fd0b1d46042449d4c300f25a7025a1f16f57f8e8eabf9a2cfe45dadb4d01ea02922be7255e81aa43d841f2cf78a98c6640069fb277ba7356a7a0484826f8f06c203983f441c72f1b2266cdb23f0b8ae1bafc17822f6f8d8b49d6d3c79173a4666f81b6795cf08c0dcf5c2cbf86dc0c35418e1d89d28bab89570387015951c980f75e1dbc7ecd9bc3bcfd5d5a8b6829bd40d0c56662ede50176a1008f207aa6d5e635073193aa5e3f711807986c079769157ce4f9b414bc372d3a94f8ecdb905e1d7fc4d6cf0087f39870304157e500b45a10c2c558af2c1ac24db5b0c4a38aa6cf4687cafe8dc00c7ea27ee2f9b51bd04605612234cff7521d68a3b4aea721a6075ca3c527998218e04414ca1338d810498836054d712d542ca80e803887828de80da8871fa41ce4e88da259229a68a5916986b242d7f0d8a22822b3d744b42a8c19b68c1528f1054517b9552b42f5fd4fc0bee98144a7c2af66cde7979acd6339285cddcfa44ec52de3d60a39bedc2f983b0466f6f7df732b38943c9ac966a1e3f5eb332eca2a3a3e1725158826fb5f2bb1f10c7beec06b02aa2aa41eede949828535ab8feafed71b48342e9b8765564b41b96b7f2682df90cbe60fb7e572361102834892fb6ffd1d32308137c8361ae67a37d562c193942e1bc66dc6496940a62739c76138656a13344aab3ebc3b7725868f0bd2fa4f86d3bfb6cc08d47ed39f6af9b804454f79f72fb1960eceeb032767113b77ccc4400a2bd1acbfbedb7c9eced1c564a5ccc5ea24f649690f0656cb0a63a8f81ca2618335acd7cd8fa20ea11b49dcc5350fab6e201ffda2343e11e82a4bc085aa30f4df112b962963fef6cde1bf71c7cebd6d487c84f23d15854db0017ac4e4eedc43c50d8313e5b150021fd10df19d14c2bd1199a0486f7c8057499139438dd905d40cd73d85787c591db77159c45dac3175e21de763183de2016ac0aab4498596b0b06131f81b47a3613f0cd9488731df9f8c313a6a5e37fd76bc7d13e0bd0ac93df335432be0bc6e70e19781a082ff5be3c22a5a6625594cbcb9ac65fda84afbec1d8fde25968446b6ecf6b86010cda390d2919c053edf82e594477bbe79547911082e6b6f85821fd1421ad0986dc7738d8656fc0376860d1a9c42b4ddf7d232f2dbe96dbf515ba971f7d41a538fba46e24dda489e0fcea5338f73d61bb07ca8bbadae77ed2687e672852c6245f6ed771fe78dd8382eee84fa9717fb6444bd6a7852658e62a84d327976173c0c9f8782da56121ace03b6e3f5039bb0b56cb1759af688ac0c8aff1982abfe31ac403c1fefa0789c2991fd81d3de958936f2885652063c282791a1dd7cdc367a611de5dab895ed17736510c2d9da22b6d408bf1b57f12ee33c35da73ed341b3562aa9635a699438558e33d24aa3ae2138ad05252c5a434250f1f3a25f2bb93804e621202b0f443d38ba7edcd4ee523aad4300768bc44e81299802f0b9bf6eaad0d50a84900352e604b4f131178663ea7dc06873b9159d8708277c4b71feb9e9b7c4af1886a8beaf42191c799b2df4c155a16f259220369e56c79423816887c5b3cd070ccb4eef9e4f5a67a04c833436012195c830665f14cc626c3eaa5c6b9229e34e04cea8613c9dc8f075a97fa70d5c8f02f3bc333edca3fc10c7c5c6ea57c0961cce55868010c7ec03cdff29950af9243c47b6cc34a3a0ff2d295f4dd251d101f6dcb7497860e4404767e62e97cbb2426449ace2f0b2d33bd4a7fb7c0aaa615c7bb8561baed4ce10f8c382951db1ea75066c23a2c32b2e23c1b8cba0773eb029e0164f04dc306dfd605514879db322bbd1701156dfae9b10936ed01b59f236485fd932c4772db79de0e8ad10923bae9b704fcba9555d30a7812151a61adc8a9114cd26df665db09adcd4f7dc73edae10ff70015f6e27685fe60b6f13b5b2a6963757b83530140791c93b81b41f593633d2d608af5dc449f27692d3276192a9c652b252116b4fded9a2f4b79739aa96176a0069f22195066560a8d6d4cd55a93012373c8f7855c94f1acc057b952e03906960a876a3025b0154ae460de9c1bcd6c4e096cf86f6e32b0aaa146113fe10680bd7c070e2fa5031294a6b82a93c4db2fb53b7cd58bdb1b5d547115bc827d0647155ebd4ed4d1aa6916cb0121241f5b65122e36cd260b97f947a4a9a615bac3fc11ab88e122cebda67715d69cf3f8ba81b7ff3a800c96392692d310f91a322f908fa17f499e21ed23012ac0684c1b487b595a5d9e230daa49255cbdcc1da23e4cdd1e6df4bb57db00e99a24e28024a0c56c252d221010f2572d01ed9024b706c20544a9f58a0176a10a92a2fe179d3b5a6a0bb3f7e587ee420ec7c7c47b4df448aac1ec50ed7d54ecf341f1d52a4611312130a5da7d8c73ee028f2b0c9ffc2671877f7bd053f84201648c33b8ec85044fdcbeec08b47528072547065297a10c854176c4be04c70c6015ce82d55c9f66e880cdac5f50a4c2fcfb5666bf020c0c6ae59232c2562c05427465af3dc0927c05e0f107b9568a73db521accb012ae8e6d75be02763b361f42c5187eba614a70e364d8977267efd50a48642249021fe208b4df35dcf3a93a4550df09001a801f3f1dea62ce78083b9fc9f185f10ba6cfbdf2c9f9505680413eb5ef4ce63314b9c7a9735004a842603575920bf681303f2cc17b717cd766f7bd90726fda5d8752b50760f26b5b7530bdda43372f0d88eda9009af635800dddcf22b1578dc92b61ba8f80dac1b6edc337d125c0b813617dd856f30f31cd0840f299c490248bc0cf6b5bc0382d5881dec6928a41014b2d133b06c6638cc9a2d6eda4204ada02b63e0e5daddb70fe6ab4e5ac7d4a5cdb88e0b6f526e2c605aa7a09a784a992a90465c8fc8f2895b2b6e75840e2a1f1e19241cf4933442abc96f1ae6549c8a920d25682ced4a2f5f3f52f8614562a0485881203ea0fa428037dfcec2cc9ca5b861adf7853d8daa279d2329547f9d60c66bcd02aff3fa559705c6ee1daefa3582e5a0120151d3f75e4c0b4c5b9835c8a8031abc1a6de4e7975dc4c5903bc27297e739a64b25d4b5fe2eb126d18421dd8c4e301d18349f4ef6b8ff59806985079219176f185713c146ee0323af22ec506a0ac23880ea55c5519b495701e6481ae8c0ecd9ae7ad1a9b219cc61594556a406939a26e4a0cbce6df87d51b7d7df434d9cd6d023785705c7059c9cf84df60686a3e2b57f542b53c8349e382350b31f209b16cac9db278b1222d4b45b9f2ed9444483c90c461561783d9e480f95bf14b243e858572d02c13e9b8124832628a4e74350de0e1d88ea1da1e159358119e21aabab0ada80eecd4e6d850353267ab736caa8243551a580e5536550494a588c2d9e5e22215c148cab5f77bcef7f07ca23c3306d353c6784f094a6e28be1d4a495181d766347348c5052b92dc54c824095e1d89372c27ba1b185acc4d13973a9b0b37c81070ff7132598f40dadf6a80b679de6221a6f34a891bf395220c7d6b19e83a8927bc6f7cc51a28f02676b7b774d645384c4cf1d805000d9907cb1ceb02e843433707a86698f1d0430f8a1089ca82693b9b130d134f0cd778fb8b614ec634d281a66ad44b26e6d7b0f4af362828daa2daa43183a92070b49f18c48be047e53268ec851c7819904f30f2941340e59e67bf191a53c25cbdcdca56867d3c8d3acdebebd2940dcd6588b7273689019c696065c43567d90fc4fcb4c7172a8c50989074238e2ca7a6eb41610e29f0e0e49101cf39798dd89050315760b5e9b3872c1f48162f5bcf224f26eb978a5d23f9c07bc5a331308d1312b7fbc2434ac27cb3da76d1a3121626e7cd5a89fd4aaf6028cecb1aac29ea88c1e6fb00e1166551e3e537e160da039dea8d59bd4ec5847f5898176d28189811d289ae154fd655f1e1a2d3199bf9f2338cdafa8b9117abe48a3b7aa2fb9c2b4411ef334e2904085d30c67cb3d4a91b226d27566fb70761eeb67bcb3e9093a787ec9340d1ff88d0b48d1e8fa773923e623c2329ff4353d342d806a6779c722d933309b7af8f39f12c20ef0ca5c99edc7828777d031d511284eb63db00878a5b44f830a9fdbf377daa85fb369bed4e04de7455755d16a9eab2ab09e9ec8a85e6c214ea72359581b459103c16b77106e29febcf36317ea55ddc419572e62c4eddae1d537764adf8ecddbae0d72748614496e599f5022a71c12185014a461ca2ef0bf1613d4c8a484f9021e5d65a4bb1d2ad925c8e2b79adae5d30b6d810b51030d4dbaf1879e2bfe0e994ee2a4634eb7ba7cf8a917960863b9546ca2d292e8e3dc55afad1d1a8d6e9c644dd2149ba4f5f4ce772b28be474b23cd679312f99075f1175b4449bfed0fcd316bdd2a46ae7175357c422ecdfbbf28eb3fc24355e8251df72c725ae1574a3005c558dcb8d4aef1c84e9bcca9a2459122644e5951254adc68c63401563546ccf0d57e1b7bd17ade4f0a762b1484340055d48a2897b0d7241206d4e36aab645bbefdaa2c749b1076ba8b999a5600b86dad35ca209f33c5fa056058c40b1e3e2ef92a3a5b3286e845161452f45e9958a1282c4b86504fdaa08e5afa2b9126b9ae228995cc9b34f1f5ac5242e6a93f708931627531b3f3b99f63aec31a297d633660cbaaaa9d8c52746b25cb5a59009a96dd05d57811094d010fa78d72bc756735d189de8949bb7aa92902cd10427c03694838048aa6d95194a6488d85c05c0ffa01d0cf415956a6b91d6be4f341a4b81cf4dc31408c96f39e8bc3030f366096b61c0c092a4cc64026793c10a8ad33de854a2e08e0c49ec6d406a8441b69016d257a55dab12c951447e97db10dccdaf15c2ecc5e4b3a3ff058209822de356c91e287ea140fdca172419cbfe1a62bdb7d76c71ed00f6c5d46ef6e9775452752e847c1e74c697803d1c657cbb5a3ef9d61ce357707b91a4367eeca369dad96cba23370c4020a47c1b31837d117080aa1a7f7982d1e4ded0d2fac318dd9964b663c045bba76bfcd3d3a30436e1860193330a3689711ad8b118fd6b05d19162ce233fb307b5f0eb532ac480963e7046e2fdbeb721b0f59b3dfefb6ab4976bc06aa842f05762cd0994aac83438c98b2705ba4a437184a05935c0abb7a87de8dda06afcc7777fbc8f149c2f8a22f0e304a3bd73152c68f57de1af080757be4ec8a537d259879fb62d5145e65baafb0f1456c4880f5ac2812ed04164e09ead69b21f417e2be057ae91f1a1209ccfec2d0605a61db35131c580d9f8aa67f20b63b8531730d649934d65071bc58a1f682f1181c133c18cdffe758a17121e04da159f00603082a54249302930b8398cc693f06a067ef58adaba4334601d0d604e072586fc3313217bcb1bd32cf67fa07f622a135c5b1dc3b77506d10730001c2a7050bb28c38534173ccd310fbff1ecb963937fcca6ec5108cdc0e041ce76b4c0637d363eea7bd51ccf2449359598962bec8a422366aadeca0d9d0c15de42baff5e218de2de89a3ae3ab492f06a00b2b2b5e79fbe0c97ecf1d9ed7d05bd47669c82ccf8640327a82da323f596b48c7a02936c149a6b28140f95fa872d2bb7b847ba3c6eaea96ecc1f1b3afeefed9b67bd03379eaeef62338e032d55b00001b79b276fef90a5422bfe74d41915618d29a9f2e7ebc38c6aa79852a4d1e9e22b5ac1dbeb536b84cd0a7af9174714120bb7dcb4c51fe8b9893e3f50438eaf72043ec4da1e9fea120c15e5674206aad0d0668fe6dd5ff05473f06f4d1b36163bc2b56eed10429179903a7bdb81a5a7a3b5e80d6ed31a8fbce6b1bf778e2a0f9b98536a20990f4bbe9a4cb266de4c668a0f15e375431511f0b017cc151e440b039a77ae09c9c9c07741c78821b14404c06f12ec1016322b4b9b2b89f74297a614954608a3812032f95f179bf7ab0a08bbe1f4a23d885b6e7ca6471a8bd5bd381107a16650b4292c0c5d3a75f8db5f16da411843c2297f5b4318d0479baecf2d46fe9eeb6bfe7a35fd078fcc8c4550fe2e0e6487e9d5337bc5b8ed98c6b70ae596ea7d825e3fc3255bcbf26f7eeab742a66586b9c98c631d1be17e7599ba3d4557be9d1f1082f543632320c25ce93f4d6f0cf45da113488f1695416d9da844a64183bbc92827d88f45e5fb3d8f2b0070114be92278fb1464d6dc6e4112c0aca78c1e644115390415e717ef5826b5b6bed04e031753b98341d31d90113d2c8845309192208d34f61d98d883cd0be120f9e1617a611bf59b7440e0fdd628649469486c6d6dd92ea4f359e058413abe22ddb786632bb0ce6c64b2d8cb6dabf41c90831f820e90d173a000e6613b29b87573be08c1b7106b1e606558a308f3058c26d4604841f424c19b12f28031fe9b9572578e9951f5824ca5f209b13ccc425b537949e288cc556e7e0867009bca2d4fe41099d9b84f2f0fb72acbf934ba43965e48d11a6be396b313cd623802cb3c063062902e78188a88f1a826cf88458ebf2366f14fce55e29f6c65c33957e4b0b1d61df7af63f961ddcb6f3c03b06c428e2cb3bd3d0c07bd9314428edf3b9b00c91a64907dea7fd55028597ad1fc29d689a8f850d77e1471f0467e40bbdde529e9658f799147da6e7cb1d9e2e64263c57f4c1388d05068cea2a02316e776ecbbb02ece56f8b4539a45a0258bc9150e80d7e278b3bcb997ca2d8eff8f3852e2ab35462fe893ca4485dcb6e009d7edeca2ed0dd4655ebf496311f14be011988404e220f584b8cf88a493ea0e86a88c9b4dc636d67ef0f0df6e018d33fea8138c330f2ecf5a76a1a8daad65f654a04d62763071ad23766dac24ce70c46cb5d37f40a773045653b073b191b746f039555b2a91482a7d4bf44074cd051533a84a350921908fd61668f14e54d51838e6f8feee8ca560646c47e5c44fb408d0489aafaafbc06826ff1d37bc2f0d1a15f0cdbf2636b946c43f5d1a7826e756e46dd608f4b8714c223a94d0f305de34809bd3df540bf4eedc08720b97565ab2f4d41ca60cb19a1b21049db4578659f782802e0296995e609cf7fa347bf4118e368e9d85d9eb78acc5ec018b8057b1bc458544f5ecfb1adcd2432bcff35fad4e281cd6b4e5136b8a2178f88ee3a08389e3e07e7eda314dfcd1c1ec0016d332ecdf32eee6bce52efbe5078988441e40c0e148d00071e9f1fcb1f69ec1f185ec88e9158c38e49d67824b73834f820de70522901a2da668b9a51b3797a5c6a957eb78eccead487513f0581061923c2344af9eb78cd0930b898dcb6dfc2e6c22b19852f91678ee43bacda41daa0f72843bc3dfd448ae60185320055ab45511fb200373608ad970579689b34dc521f87ef664abe0242d8a9928c7a1dded451d110819ffb3d0a562bb14fbcfbf81f3df763a27caa87cbc4ab2aa007def6c023983219ef5169fdbd3fab9bcffdf0379b9ee4bb3029a9195454a18095d6049a071cea4fad3436209d59f524bc1cba881673535f00e55034fbf1a98eb27bd9916d0d5ff3d072993437de463c94a05b9f8d791a2df807210fd9e8f0c62a2a9528d4b6196c59052dd53cd89685a601caa5c5718e27741a0b63e2185ae93fb978ecfac0d70b5b27831c66269011f9d0889000810d5fffc30f90c219d0aee31e50c1d71706f7c801f7a1640903762299b6750cc00f44f53dcce7b55bcfae793ad18e758cb2c851a57b6b4d47bb433b935658de90d8ec4a5b4c88a4c9064e825356e64d82281d08045f6982448ba94d9c5be9d48a1a264642e0390da4c220605737f3ea9c71923a5c5eef13ef71baea0d742748267d40e95adc8f1ca65485713e59b2f12597a26e45591636ec7a32099f7c3687cd2844d5ede44f4e0a9809e16c6bc9c74f6fdb960655916491a900e7feb87716b4aa5c7a86723bc3f4f35a9fe8624cd9514b9ec3b63abb354e4068b368383c1febe80ea1c50d069aaabd3b7b935ef569542e14054db77baf3eff82da02af6041167fe3029b6f8a8ff22846d2b472a9c545e317304d65c2632ac66345b3dbfeff0a86ef8049ab4caced584a6010747904a6c09ce37cbef590187f5d941c9e0673ce4251fd58556109dc386cd528ceead6276acf025c148acfd69807cd991cd07f2b9b3dc28b6e6194a7b0bf00b2756d5445f8a9324fe31394334a2c8dbee834a7faca54c5c68e9df4668a97b326f4309ff79e9a646cf6405983cda08108d00c10056084ce11602bd4e45c7511a43a0a363b2af34f44e6b3199028a62bb1f061da705ce4c8ace6e302f2b58f02c7a1e5888b91dd4668af5a1bac79030980b3fd38f933ffbea14a5f48dfd48a28745a763295a0c8eb67dce8acd28791576522609ed80c1073340d4db19c862e0ea2433c484188dede6242cab41ac63d596d25150c9383c0198cf16e8050f7a6bfe4353bb8c6c1d48464cbfa3963aa9ec46686024ae661c03855bda041e14d1aeefa624da4c917d650a64a9c094a3ac18038efc2acb71a0c6f3ebddcaf66b16a64ab121e322e412185de21ec3b2bc94b73167d6912f02fbc5ccd1d6c0692a9ed119b1cb1640887d0e16c85a18daa7cf7ba197fd201ce738aea4ea07bce80d44542092d154c6e6b2a1b972fc81950a62653e4f978b03f48a41814e59955f13c05e523fc50a0a9f9aec5120f99d88f7e1152e9dfda32c0663d5db7602c0035e7500554904d76885c18d35094dd2e56d7fc8d218e8b4a533e87e6a0e5c3c0ccf7044862e263ef03fca0180da65a531052e0e6687c61b050f3c7ac60c3e423e48a836cdbcbf33122421f9ec3522801ee33c3db8ed81632c1589497ae2cc8826346489d0b616a67197cb8bc8e72911b815643939d983aab88263ea71add156f58a1bdc7b2cdae7583535f22fe9c1a32aefdf5c6bd4d13c66843d5e2657b54ab22ae83684f49ddccdb73730b194de1a792018d1110ea1463d6ff31e15f4be92f5dec9887e27df76964e26f4212b476409644ee42ee7b5ca1c816e64d2042963afe941d37d01f38ad32d793b40da07c2194d64f722e10232695cac3618c0ab93499aa70b9b806f89d7cf694a1b0e240c962804c7d2a43ada48c0fc32303a3d5027d465178fd883896f60721ea2aa53b85550ceec32596557ca5586098a68e6cceca82d2cc0025d5d3ae556dcf78bc7771898ff37484eace81fecade578bd3f97479ce9e247d855bd21cada939705258babaca90ec1ab6db44c818352826ba70a1d2a0a791456aa552cd0e0636c35e38251b8cdf27d1b2951b6aa14a500c5ab2def521283bdfa184a25024b2379248ee087ad96617da9cbcecccf46956670981589bfbe912e6d412625f30e51247410a25f50370a6e83a0859a21fbd555b2aed5fce5cb76dcbdafa7272152be07c927a6c20dfab9cad2e3b69cd4856285d2269ca4c58ae719801cda64a6ecf55c9d430de08f2481d72b079294cbc9f360c912be3cbcb41c2d1e18c857c3da10ecc5bc897575e421bfbdf1b26eb68e06f0696f1cc980446a4b48f2f9769e3223619822431abe91d69fa5d9dd4453598c64aaf9f7a1ab89f0dc3fc8dd915f25968dc7a1d9943ae81a48044ac91d65118b25d040e32d8ee3f36ba1a4ccb483a3d2e94d49451deed197e895dfeb57c6806ba309225601b2eb7cb7186ab9536bfe1c6fa21c4824fcf21165a90779681cb9fb9c35a33cc868c4c4dbd138017d2f01a75182440cd96d23b138b2df98358b2da14dda1166c16f6fb5256d6d67f58eb27cbae19782236fdabd2e17a05da4152b66f873345537c9a0853c0a3295c49e7bbb9ef482845a0e540e65322f01e22179823125ec9653d02c0566009466f8721137910ec8a30b65f1276eb88d724a14f7d9f2fdeede0e6ddf5bfc5f105046ba8129139ab6dc6d39f15bb7aecf5dca63e2451d2a9e43a804921f984d95057a98c0428888dce06b97db6a30db2ef2ab2378a46b92c33e0f383840318298182ad131ee607a375254451efcaaf6e62d78753ed608b17f0196ad6cc77c2b0277f6bec4736a61589be6bdd0ecddb30bb5e3a3343c0a51c27035bb4c7c76443960dad1e2bfbaa7b1a3b12455e2afebed921ae7eb98e84f8975a82eb9c71cda61b268757f1d0a97e98e4af67554ab7e1fb7c6e0485e965c0d2cb8557675a71b4dc8ec496486e223ee20404a0918a84f84f02af5e0aa9bc8e5d6b2826432361a455d3295dc94faaa01b224e5321d56db3dcb0a69934911a693426daf0aa0e110224592c6303d6c6ca6105d84a81bae16dad5e9f3f6efdf10501686f5dabea414ab2e6329901971374f785a370a85086433d0658d3a9be1b98ed7027b9354bf59a2fe4f0746023b4d8a5d8604a6c4576f64cc504519b59d8671ac9b0303e19b7f01fb955946b2a4f36ed0e19e6dcb07310a0e0127a93f3fa56f1967239efa2ebb5b29bb97fc38e29827f3ba9a2b43834868377f84a06261271349b441d8b226ac06fc5a34b809f66ee87a61c80a9a2030d2bfd21a8604b3b38e518cd1503b2e67b5581840be9f4d732a907291a069133d436e3e7d318444a4a858dc3306e5ef6737ec00eddf75e2b9ab4bc4b0409011f04a9bcbd78d81ee8a38bbc6447fe6be96cf8b83519e550f7309f0b11351fde20d89835a6e0ee4a8cf335cb9006a7a3409a2e419e66da1ba3b1fd2114429926682eef8f93bd9fc261b57f9f10311b067c6c227d7e4c34e96d57de0693dca3e3b9e9b5d8dc91c9f65c628794f32dd8a525f624fc87672d3690f76b5b67b601bc47e37e1bdb609e7c6f292383c613d0aa06160e4aab9415e01f00500680660cf0370e4e30e8222393938d37733f78a3af139eac64131bd14227218f6c0602018ef0946ca43d8cd940cd0040f53c7c3c1f585b15929ec7437c6d3540bb3abd98fc081d15fb1f3c953fa3f4da0cc422f8bc6a670c28f7da3a89241e9eab9fc6121f674e9a5509c7557239a556d77d1282580b8941fe13d5ee4dc031e19fca686d6b70a372303c6f52be0f34ad422b3baf680c499ab541a0be6efb9e58a3aa32a7411e23a1704ed660603baffdf23911658f3540efc86ef5626c2d96824acb403822da22b98ca25ecc945f338820c4c7a1d7782aeadb0542a6241c65ae4973905b9fa314cdd0e8b61ca9465d7c850c97bdd8b0d6f0b95bb125ccb6a9b18494ed928e394472f122f6840c68d999f5a3f9a91afdeac3912a5a9d0340f9d7b71e32b84fabe9ff061ba48c37b3eed9da06942636a93879dc4707b7a11cc2b01393565498db5b76c4be95dc766074112e321825b8887729d6c5079fd44cb98d641f559fc690659a106a04d6ae2330914023f7b1a964d85254597d94ef3dd8ed34a9a6e0e8c16667845eb676ea1ea1a48348d0c04dac6905048d9e78ff2c6d268a02751fcec5c044d193078d9ad8fa92008d59e94375a0096f7eac56768fac893d33f2e67e229addf7cd623f585f4dfce1fe3453e3c82e338c9519d09fafa7b0b5f6bd2b3a812f1796ae64c1fe3217668fed517806feb024fc236eff7be4e1fb5989709d48692ec9f4b87208dc281e42a259814cf4ac165ebbb0e5fc2502bfb2e7c5b1d1fc1d322f177cc7e35c03c64abe17c3fefe001cdb2d3ce6d3663816c1989e261fd80d7ec228a4f5d58e8500207804432af6ea5cef9b51865ec10a6a1c9450ed3c0695ce3b898f4dda269b045a648f70da7b5d131bea52ba56e9fdbcc1ca08aa597bb8be007a829dca37534e2ea8a6f05ffccc4aa5f085339cce19ca84c83044c31cf9b4f937c0affbbc43435fdf249255a0521f825b6e254518651853bdf7e533a2853fb8aac56446d2020ae53d74a0397e353e385b20b4b5b88f80f7559c978a9fdcd2fcffb20ed9ba2262a165598406448b4c3c9cae9b9dfa998ae39effd010c8a9b938e93d02ea060c9148def39178d6f4b5bb57c8a49d578199d7252d12b49f810b4cded8446d3a7e04feece6df158b85e235bd6701de546eecb0f977cc3235422aa323580772b726fd152e9821689acebe36d674f5eb9b3e3d4e55946b88a656bda7c3e9b00a1ff5136d2b7c58ce718e37774f6676b2aeadbe7435adfddb6ab245e2a354b72202df042f42dbc6062d4b485c8ffe442705bcba0fc4f356dcd9262bec35521e3f8a786c02a2d4b4d2ed080a6d544dc9c11a5ed624d0c5ad429cf7663b208103648be80a8d6cc57d6ac49a47da571e9659db3663251f553502edd8d3febbbc16ca136e9b522236af76480c69e825e0e478a508f8a4678f4a714c3db5ef659f5527dde35264d4672e1bd4980e83e00ba90fc4431029981a900f26fec3a858fa51c3c0845b41c75e898a7d93b807d32b33cd6c43afe8896aed9fcba580f369001c5fd18edb6996c24fc046fcaba41fee550ebe138b9714dfca582df4429a16f1823b610472aa0e3b9f1a6e267eaff4829415bc64a44a8851f4f94229370d91541e2459181438d282cae8bc05c673391da5f65383129373c3e0a740909e01ce06deb1ef60575ca5c56b1e65eb87d2224fbbc2bbb0fcef23db256e41349cbb76cec109319f3730f84979f0cf56640ede63318189f7bee37f86f5c8117d2c6770c2fe3e307a4e297028e61537b9c461a1e69d988999d4609d3d2c112969c4a080b51821f70693c4c2dae1efbba4ca75c2f262a2388a539d935f428c140271fcce8b91e3b65fdb95223a88fbc19f0d8ba132036355b84e8606151e6d6db8283cf660638d27c717c47d91a6e89853d7a64c034b4d9b7a105fa1d2b76dfb5f105b5d5d187f1c0108f535311b63234fc1773441fd2302de80e3d26897f32bfcdf475ef3721d9cb84bdaf69e3036c454f69a5039b5f60dff1509801eee1d79e7e65e902b51d4af929b1a8226a65268b2bed89d3f15d67b8077534c8bae525eef1b0603e7826c4d410d36e2dd1786535a011e39646301d225badc608b664849e4a0b90529d8b3e7d0649a2041a04404ba05eda44c4d65c5794e9a325ce1abe4976e252943b07222cabeed2e89b0d1d7ec61eb81d6742d8f27243d94ac68194678fbbf19596378f1bb20ad709615310c5f832920f18c5baed66005370eb9db5e78ef1a05ae0d63867b41e32785ed06eb70968c71edb502d67382fba37d0c94c65eae00defa5e058c18ffc09723ff8a0d820ed748633ba775cfacb2767343feb2667ab10af87352fc7adcf9cdfd8324b0bac725f378d09a76cad319bc796a7efd6b9d7609f95170c6c872934456f5b9754c5775d9996dd8d29d60705e33c089dd4e23d884ae4691ffc60fe02d10c1b064726434982ca0543926b53fbfe9aec864cb7e20c8b684dd01d01a44a03ca73fe805d30d2a14907796c6ca63bbc8cd8787e73623b39bb8a55e76cd01aec6d8a0df55b5e6defe2463fa2bd11730f1960047e37cf0004c00554310c5064f9f892bac47d9b50083e8c139a712c946b9c824e7e23846c49c8de7b6fb9a594494a19f1079a07bb07474fdcdd1d0c9a46bc1553352a8063c79c73ce59a9271d211db9bb1760ce2f0004340d3aceaf41795cc74ad814a0da00b286ab48a6652525d804a652a593f22065fa3c41327d9e1f3fe5943e27206752e693ce294b51e080a34d1e16326d36497d7f7fda70d97d8c73be9efde9512c3176dfa146257b24a9dab787533008d458fc6e8b7dbb7db7bf0f765d28312d53ed2b51284979ca72b77d7f729954743681aecbfb3909ca639348993d89c562518c75cc84d5e337c0eaf1e7a03d51c885da7f4c1172979dbf13693776fe1ff79e257e5fc595684529bee8a8331defc39c64daecb1efcf1e469ab4c44ff44429c5b9ff1e214da5fbb9a4492e367cd67377a8765c765d35c8dbcb9820d3de868ef7612e1b64f963aefa282885480c37c03e25701013e4895801629c1045051ca0aca006578228e1a143e988172931c032a44b1021ab2033f4e0a40d6c1912e5064868e02109246c82f0c85b3e2582c88087205dae131ac82e5b72a85ac205253d4e20ad1ce1430d3cbcd8b0c49624b8c9a64e58888f2b04bc547aa660ee450f0c9b233eb82adc75d9c2ec8089212fc05eb26f09c5440cfba3504cfcd871f382faedbce88131a39860c18b11e785f95eecf4c0f85e9f0e9070ca39e7dc0383f274424334e610322f47fa3b7404a7ce3153f8b265532a8a31fd31e71212c6249760d397935222314f9b605c4fa33ac2a751116c4a7df81129a31fa369f8a569d8a569b9a56939d434983ef2c595a48cfe126ecad48f1c813dad554a597d31235629b32f234a29936f2b90292823ef5add1f8f9b25ae3c2b47cb7160fbf701ebd9043817249074ec4e4f39f7e57cf4d9c4788e7b36f986b3ed0336d6538ef6a5fd80f51705b578b0a63c6b86b9ad13cc0eb6b06acb11dc5497904a10255ccf14fc13e3841a7042fc00999ed038890109292160f06283130f07555b74106181123e9c785244c0319c608b110f4a5f9408220739708152132f0801922088201d711e904ac0c2416ee0c2911ed4a6a850e5052924c10088244b4ac4900548121b10265454171420c609b01f97c0a6701121f0a065881f3f8069824101498e68a28b951198e0079620b88a820b84e181071e4e6a27c8c107238c40c245cad4122f39d8283318e9f3b17201d0602acb0d9270c10da8108009090ba4e880840492231d0d2006d23305ff1420c609ac2da174d003f703f93418423ebf6ffbf92fd8d6021e98051d40a91f4c074e28b725940e9636edc6aad0b402257def3b4fe697ddb37ec6f759b37411d310f8df17adbe7b099403082432423222a96a3d8e9294786878cca9f5de7b318e8d1b385c56e5538caf4fa38e366ee018777cd67dfd9e3a7add7fbfca9d88aba55689cf7e67b9b7cf81df6922efc127fa62f7fd0e71dffdfd4e13315d3dd4bd6b22fadd13b97dcf1377361299fbeebdffdef3c41c409f9803c83332dab3de5a8dfa12a872eaf3c4d8fd7759bd3a0343de7f19a8ab4f1311e51c40f469bff2aff7ce1a0fce27fec4705915725935a25fbddab8c17d27b463e5ef89f43b31c3a6d4ad12e2df7ec67dab8becdfdfee176d967e900484b6b7d6be7dacf15b31e662ccf1cfb08f39bce99dab7f28b54f0160ddff0325cf7c5781377176f6597eeec39fe17d7eeec3e762f5b9ab87f07b9a88fba1ef39d67f5ff550077e27bd9dd773baae9ed33b2e931e8c734d348f7c66c8fef4bd773dd3508bc9563dc4bd4b135909c47d7deead048a558efba297b62d4dc4445bb2fad5b7dea577ec6aafc41a085c5ff4e3d24cf55bbf7ada8e11ad9516b2402bcfcbcf7d9137a328ebcc7a3dc41181fa2736893e3df510d7e9d735720061f186cb2c4e90bcca41e9a6c45fc83939936a528d37377494374eb178f2e6a7cdfd1c40d67efd21fbf5af26aaf3c7730ee5f1df3beeee4495bced7136f6591113fe22faae97f35b2fdffb2a7db6d29b1e7abd83de0c73c270f5397426ad54bdf83981c6125472f6bd2f8ddc7b3f5c6d36f7fffe8dd2be7713a2814126e037d19b54d9bbdfd6390872dcfff80465fc97fffb1abe01ec879f63af445addab07455adee0cebf89a128a904b71f9ac51c7b1351a09ba5670da608df93fd3d28d26eecef7ffc13b9f7c44e4b7d4347faae1fa2efd2580fcd6fdddc8fde1fbc980c1ddbf4e938c28f9f740ec1b0cff3dfa9fd03ccd8b6d9122c2187fdfa06b03af61ae1470d7f1bfe4234fc7ecc044c81edb18ec16c360090a46ad810a2116bca28b67caf21b125d4125cf6dc34288f0c48dbbf004b48d9fe423db6bb749a73c230c104147b88f2b88e9940816ddf00f5adceb1251854a5acda7eb0a476854179e68ed51f336c45983cb6d8f561d2c7dbf56dfea6ce03f85b19fef67328cf68b36553ae49807f0e1d47d0047ffb06f0b73a9663ffc85febe7fab0ca92f2c18b35e5903a91276f62d3a757f43d278166e75337fc71f8d7f0b7119bef719eee34909c52d29a269f53d2398bbae7de01de63a621eff17f6211f53af9f3cba80343a635a4ce74ff26539c4d35772852c7959852a24ace60ee79d318701a9612cf39ebcf598f3aa3aefb191cf79d2e6292b1263906a54938e85fb9227da49d57e4e5c418f952fd24e79c73d6153c79930388137300c59ae418be7d0ce3184210b081c2c59b14e5994fd3cad3fd182eabe1b2fb3494e49d012c8921e433fbf7696ca9a0d00ea11df4a7fdfa463de8782f0ea5797f569133efef9544ecfb31ee3760dbb66d566d4c9ebca1f9d1dede93a1d9f2ab8325cc3d44c7f9fd0a20f761fd0a9640f72cf242d0903a730e2175e6f6585306b7b4bf7a07d85f79598c09d930fc986b8975acda9f9175ccad8ed519adcf3a07b34f4ea449027e2969c0d744c2400974d77b45b9b92a69545cb1a6c06baa15a56a7be6dea9e7df38fdc66e75eba9411b7e6efbb97d2bc2e47147fab0b6ff0bb7e04847d745444c45dbd3c69810feaa67fcd0aa3d16151ddd63254179ac7dbfd7be674509b2a82c8b95041d9dd565fbd3152adea1e3887d0018688eac2d05d23bfab41d310710b54ed6ceff893154a302b5ce4be544a954eaf439cc510e73ee948a26713f2a5225972d51284dd4e927861095eadeb3a0d00efcdc7b9ed889b126f947ead4cfc0acedb037be5c3d93a44ea54ed489b2a0d22abb4eeab4ab10bbfe8f02aabc57ee1b8a3f95568aa7287d92fdeb7f18851a95657dfcd51c3c79233f943349c3a7e24d19720aa86cf9513a50d952d33ee0e37a159dd7a8173a3ae569b1fd3d49faacb6d3f7977ee452aecf11f3fe9ee44a32dee4ee44f343f969fe3e4df8e113d5d03ceb67c8bcf734cff2275a4547aff9d8d35a56709a5a565a507236659032ff96152732d8de02627b8d8ee9d8acf9a1ef6b50fcf7530f8135138c2960e6697e68e669e6cc5f3d047b194d44f343aea7c9ef0a61dffdd0eabbd54fed4a2ef37ffdf49921c7bcccd3bccd330dc5be733d24f5c774f79d8ecdefdebb9f41f39deebe088526621ab2f99af79a9a9a8fbd8ddef19897f91ab106029b2fea6c3453ec6b9eb663444cd7682197f96f246834cdd7fc0c9aafd1aca799d1794fc3e9a18ea8d3314cf343ddd3b81eeba1ee699e461375ba3535234a97e104c9f43771d6fc47f891fd5dc997fcc8938c4ca397e82e0f45ffec4bdb5dc99ffca9e830481dff9695fa2d2b74a6d3d4ca32d54aa2f5c55db5ed2d2bdb5b5db6b7aa5a5e5a615c3bb6ffacd461a055d4cb0c36edabb5568741faf891eb06cf3e11736a8aa07b230c642461784fe5637b1018b42964fbd114fdc85d893ecd8fb6bfeb68a379064fded0ead4a6f948ac317d8fcba8cb153e91f6a8261a3511511e33cca3f588b1f9dc8cd573daa58bba5a8dce6a8c90949a504fb2e44d5096241035b2e99c45dcafba075d1fbe03b85fcd2f4c439ca6ab07c52297962e0bdf863f047ee8499b3eb8d2447ee432d7e7ef9e69c80b67a83b4d1443dbd0397b1f7e1111d3f79f2ef2bc9a7341024983e0fba2904aaa4d69d3e8d34c3119fedbc7be4ba259c7e6e7cfba88a9e8cb61f719b33ee7ec7dd64baffc2fcd6d1fb7c20992a1d01fe147764fa2ef353772895e73a426ea44a5445af5894b474b2e19b25ec2d1e904cbf3cb486915751a22d7a98dae9278f286866b5c90b997358ce73c3c326d9bda3be82c87ca6a393c21c8952a25d1d17bb63b9efa82c324d3a8528ff7542b349c653b978dbb6c7fdab8bd26b17d3bdafef54bd5ae606cfd52b535a2e317a9e3f868cb155e3c79c3c323d797952704d99fa7853ca76eea44d2b4ed7b9ea71428b9ca67b2c5b63fbfccd5db9f50c25ffdfcfc96ea90330964e7b3de67b11b7ed6e3b334d1eab37ed6d350d39acbaccf0cae0fff0bf3d067ffd3a1265a816068c11b8a39bb3c5ab383f2c8236ac45a6ab42d45da96266d4b95b6b5dbb53fb3d45853ee36adce952816b9be157e7e07ac9ef53fd425320dad74fe965814eafc141c5addcad244b426abaa56aecf9a88e9e66b3fb7b4cd4f934ef7e6fcaf7fe9a256eb5b1a04af2f9a3597bee1324b9353df7a5d0effbdef6ae98d44a8635dacd3454c45d2c31939873fb14e872151a787f2eba9e4323b8fb67d0a0aed583deb718264b7cf59fb23fcc8b4669f1ad99f55f6e717fb2e4e9628c59528fd864d1bcd603ccf16b14d6c13fb84675a2376ca36b154ac94cd62b9d82e3609e5a1d922d68811775b44fa7894c2b8d3be1106ba6f9fc6d9a781f669ac2d616c3aa9bcea4bcdc8a7f674dd90ad6cda0b864381225216a48e43a1339d2677b2b2c5bb20d9b44f861da873d9d4a79cca9df2d0280b9bbe4d8287d029cac213c5f85223e6aca34fa7e814f73fc0301e6c99e6e0b2d83418966ad360381497d126506c553725a6c605f96f8dbb35796b4bb7766b94a785d124a107e5994d746cf299d7ee5dda57e6ddc377194de4efd2b78613822c5ea3f088faf47b74771805e97bbfca23cf2de4b746c7fb384c32cd971c8acf60e1d3fc0cd7c33e7c9aa7b9536cb27ed343f95d9ae8f5e10fbd3e9cf9d74f3dd48ac9b1f9357f41999f2fb3fa1a4d24f32bed44361ffa54d8046aa27be4d767860cfeea5d1f7ba6a19a0f639a08df3084ed3b653efc221b4dc434147b99bf355fa38b646464bee663ba4702d1c6d5cb883510c4be28464c33c5646c3f7fd331efbb9fbae6659ed663448d962e93d1345ce6d2b1f9322f8142ed7a999fe17a195dc43404fbf08b687c46114c3b94ef8966bc2a363f3d14c668a70adff543e1bb5e3ad4614bfb962ce210a7d13dba7f93eedfda35ba8fefafc4e934a5a4cffcfbdaf3c8ef53c1aa7e4c5adad7c35c1d4e9bbe1787864c9f766bfbaef028068a362d874b4aa6ff43639c369aa3e6f31c651e21794ed1b1c59ef36f86645a569a3743f2ec52038304e689ca229c7af0e58bd3dc2169b86cbe0d97dd10c972c7eadf9740dcd5454c43f7b72fc2f72ad1717e4c08e37b5f4ed170598c6271fb6e7b4edb70d9fccd35100da9339588e041123d7842938c24a1e3c4e1b2599b4d52677e7eca4fb98a9c8d3eec08d143c49eef49ed200b0f92a6a453475f94dca967a5bc44792494172b7b7e6ea23c126a070135b02055430a45b24b89148e5862b2e5fe6032659b92ef96504ca43069ea51719010251c95bb2da19828e9b8e4ba251493126c1b779b14e1b4f9c0f33265ad28a59452f073cf3b4e6ff92f9ad0f0a61ba594527aa985e13c564a29a5947e86ed381d29754a69c594d270f57352aff6e6bbb136bcc21cf8551b18ac72dd07001ea1e7c9aa9c61a30d4a4727ae7ad9ca0fe4b86a2357812b9a9c02f3c90170b1e5eb1f624bf90490331bd286d49992a58c3ed6b42f810a604a9e3efbd1ef4edacbefda4637a58f5cb1b2b4f137c33a56be6e022775e84b5df31c7e362ae59161abd671276f69852ec73d5bcaf5a23039fbf9eaaf3066ee6c1b9e43f9e3326a838e756683ca0695a492f9e47be1cac6db903ef2288595fa6d8c65fbf7dc31a131d78d005247b41b476fd1e645fb32102b61ee3ac61430817eb8eef3be29660067f99a8b504fce0be300dddd5ff84829cdb4522d646fb84cfeea9b624cc6fc1cfb35bf29e2ede5af565bc36f8a31a11d6eaff54d9102b67e07ecc7e0dd02ef6ed9bc3d57abe572ea19113325add35b02b052c33967ad355fc99a7867ac2b2cc1ee0ba364ef5ba1a54e1825cfa751097cdde77d22a8e03f10f6ca9f96fa4347f940ec50f73cafddf7b9bbfb5c7d12b4b6d65aab05c120f912afa472f097cdfd138189151198dc8c6de82d10883cbf05922c678cbbbb0a2492d6ea3ccc49296dccddfc695b30d79d2075e4bf18f3adf327c745c8ddadb59616336bad55dc16b7aab5f6f3eca5f96745cff58aa9e162385bd271daa0a029c214e00224d0acb5d65c5f14f50a02481d281b05bab5d491df64a340f7943a52f46ee894beb27929d151226d14e88f6734d251caa7719bbc7bc69be9b6cb8032668d8d4dcc0b478affac48b3f7edb52f30665d60cc6a21ac6f586bed4b29e5cbdab9715ac4bcf066ad7d9adb6a6d753a41f84000a58b4f82d66200b6ed7b399fcca92fada640dd64b68fc13a323b365caaad76bbd8f592b11cb8ad06b66fdc9d23c70101ace055ebb53596e5bcf5d6ed5b1bed02dbda6dab77c9ba63ae6eada7f75e8fc0b6e2b6d5a7bbbbb86f0440192217545938c0ca804131785b711d68ad15e7b6d25e0a767373d75eaf75a5a99d522665e10576adb745af7e4f0556c67b297652e77a607b90e670b01fd82eae76e96edbc54bb66e7749c97671b5dbc54b77db2e5eb275bb4b4aaac55bb5d756bcdd25161fa63c568e96db960372b41fa8d5568bb7abc456bcdda5566b5b0b6ca73e95881004ae3fabbd1be636ee0359396cb95e3232311f95feb2b5562cf1588966ad152669a472863d7d1a0590c3eb9bb57e9667a18be16e85a294355f2ccf582c66c3b2190a9d2c6c5aebac3febbcb5566cbb34c9d8a09873a2909a00301246582167730977b905ab29809cd357aeef5c5a5a5abaf7deeb0fbb3418e31923a327a327fa846bccc0a69cfe56060cc2313e6b7df8c79f9d183e8ba1db7b5086eb9538f79c7352e9be5a69297556bf5aad366edbb66ddbb66db3735f6badb5d65a5ba51c2b51adda25d20914f37251a059f30d9f92ba0452f11e93cb54b19352674ad18793a2b3f9349fc61a6654a8008356af825b81714060888602e40f5bbe90f4e166535a11b67c1d49c2ace519ad41c462b1582b70c7b7d4e919cede59333292a9411423b465498c4f8341f6f576b3dd905f969696e4548d29027da31d783e71793a81cee67c923af62ed59824cc2a4b4baf2dcb8e49c2aca2b9ece859b2e332fa37373738f786d69f46528e1c37ab3c4d282d16b5b20083eab36851710df376ed52283e85e199a54a974d7f5be2b2e95f4d9b4d30703dc9f746d997734b9c53469e40b5569974b1a796a188a50b9919991184680195e796504c58d8928e43b2eba9db2164f292e5e3195c24919126c63d08d1a2e24493541608abc2e66cfb625bdbc2da97349965d324976db1d817866cfb420eb6b530b8b02d0c466c1b751465dbff41daf663d8281f51b67d1a944746fd7061aadbd5a35ca061bbe31c76da1d1ec36033cf3c4716961e47b400c4cea6d9b4c0346ba14b8f146cfa319ff37ec203af38e32f7bad2f5900b3ebbbc0a08a43c0420d5a78470f22c0e2021692f26c05fa191d09b3699ea940a38c5608a27866946978bf78b020f3f001869998706dfa314ec0197f99f60a010ebb7e0ec10f561862d7ff603ae020c67321b582931ddd13aa151702961d275081885d1f671b98c038e32f6f610ca254904a8107bbfecd394401ab6ab51a0f2b847ea143470ca27484d9512968d954884dbfeaf004a594524a5bec1a55bb61d71aa54b9e998b969b153fc8e1891f4f50fd00c8a62f696c784d6d0cfa9275da6793e0f7dc5a6b659032cc3de73248196e01bbd32481eaa0f85784b14a94a7c5c66f97b6ff34cd3ad9a78d9fa747de9e664f60956af611594a6db97944609d2c15ab6481ac1525c78ee3243be84a74c4f8719ab2d59e44c795689794ac121df1e3f0c8da2a491dfc38469936a12855cd2f3b680f07227da03c3d7242b1489fb9f17b12e5d91e67fc94093983399b492efb210693c73e7eaa65f2740f6bc155d8f8a5f4c14662e3977366c4c64f80d8f8a90ae40c87cb70903c29903cf5f1d31b260913698a801f3ff5217be061e327780886511a5a5cf274dd8f79225ff1c348987e4c0864b140cdca1208a66317fc192bd6832b6fa563f7257e8bdf8e74c49fc51d97e1678916bfc56f95f0db25fc57fc89e132fca08873bc649a55daf867d27d72ef4cc2ef4d5be988c3035f94a696b278a9d8da1b303589c740e48dfe0f9deab29d0682a42de356f9573babf6a6734c6e9a63030049a6430635203c5c098243b7430a96502902073fa87074f9410a3a38e2070a5498f4dd35cd5e77f729ca5d2b75da76566a05450a59be4743edc9a64654260fcdbdec1ef43dbaa46a29ccf479546b13e5a1b3c9c4a956abe9482265c9964d2995a1d569d34aa54ef74279becc1a5292582b58826fabe993f5293a52eb3de848add740aa6f267100dc858ed47ae1b6044d985fb573c1f4cb26b7d0915a9ac56e093a95ea5b82de14802559095682f7c820cf2f49f64caacd5a6dcf1db856db4432e89e5ee848e791bc61c2e402cb40ad474874c6fdac7beacdbe19385b3ded5b759959a6154ea42245ca93274d9a24b1498c3cd53074c6cdba99677758fa95be3da23cf72d129d65283e0b775e2098daf5e52d31a4329628a90cf430d4dfeb222995d1a497ed55d3f0acaa47b24705a8e692d24c7a7aeae58826d19ad7a88c3e1d22d3af4bf4eb514da26f7343ce40dd28543cf3f6ae87374ab729372641f245bc2537a5bb6f2b69b7577bb74d63ceb75a7d7a1cd7514fa4812b560e5baef015c6c8ccd0d4c46c50a450f152a4e915f50687458b51e602841c1d1bc28ed38b39020d8003a0ee58116eb8a8a150b7fceb13c2aeb8f2e8b8bbbb7b0e0742e7c26bf1e180372bcd12f387eeeeee9ec285e265131393a19981c16668646a62622f1b178a560a968ad5832f44a0bd15dc0dc6d958dc1676ac327741dddd3d47e680e0424707c8d4f11caf2054eba212d5bb8dd9bd489563adb256d97937deb7e20335b81257ac67651595a8e630450b4525aa2d974dbe91af9437dfc8af981a199a19d80c6c06462343531353137bc56c5c36285a28528429546415cf7a71e538380e37de0d4e87c38263d102b718b75176652eac0b102a08399ea34375429828a24c9d493dc72b08d5bab0f36e637881f0fed537d48511c982eb70e6f46ebc6fc5076a7025ae586f3f505959450e53842d14f603b5e5b291b17d69794a990d2f905f31353132343233b019d80c8c4686a626a626f68ad9b86c50b450a40853a8c82a9ef5e24a831fd62b3efc5501d4b0e2c6bbc1e97058702c5ae016e336caaecc857501420521c77374a84e0833049d10724070a1a3a375c4d7d1d1d1d111c00ab602a41c55c406df2b3f01c3f79560c4e97b7d2f9b9bba03244138b999128412132d4dd8a06506b74a0b0bb8232d357446b424f5a0a5e604105d361be49b2da18070da840061025c25b3d8120a08a39b822c534064714ba82c2bc060728b2da1b22449f901ccd6e3072e4c7e9872e4871ab6177ef8d1d5208f5b4261c1c15582e54a0eb0dc50856508a743ae79a24322db14d11d5db944e4145b42f9e064073e8ce03ae1430fef87ac43031ca0a648452992635b424929112165e445c928b684ba828409ae5cd97145074fc7952558aef8087245077e22aa6a47541047d9664ba8a825b28a2da1a28cec04604ba82d4b705d2a062b0a6090a9fe55fc4d9d5d5d0996199ad8ee79089117dcb0c4892d2500a2e52d6fc0820f2e406a3b38550172774cc4061f5655cbb74545121d49824852c40c5190d46053da23e3834cabf36d28cf44d214802d8522525c5653b26cf93026f233112b32aa482d5751d9f2c122643a4869428407134d43866849591a82c4854c9b4986e8900f3b22dc526522253d119259331c6df9f257d8407eac071a27a39022375dc26cf93430f8917513545bfe8d969915c430e19c5cc093b5cab014856ddb36154a90b4b32554103df44c4f055810e08b2359b428319141870c2fc840457ba234d53a5f3637392f6e2aa546b26c3a82116c4a47d0834d49f0c3a6479a8cf4b029b82b6ec8b4d7deef33fc7afbf3ef532be299e911191764daceb62f187476636fc87bc7be858d42e4faf6472132fdf9c2fbb3d65afb3d443c99bd39a50f9dd2c74ee973a7f4e1b69cd2a79b734a1f3da50fce9620ecea62d7975253fa8c5b4ee9a3624eb0be578b4cd9f33d19d9963f7f53d996514474d8f33d9a164cf67cfa15a9c56e6c58142192b78c2252b5a7b7a2ddd834c7566cf94ea408d0e69bd2e7b7149becf972b565141112d012644478ec09db322ac80af674265e60d0a68a01057b4a1f9b297d5040d920b5ab28f7107b4a9f9a297d629b6a48d49ee00e926202267bbe87438384c5101dafb78c0ad2c4cc117bbe8a39a54f8c4cb86554d2961d6efadeacb2278a155b4609b1818b6f4ed696514933ccb9616050d2933d7f0cc224a78562cba824a33dbf7a9595c6ac6818d854276ff92e213db0886d19154308ac2d7f3ad9730518b4a96280c19e3151428cf67cdff9a68c902221c86c19150469cff700f04de9f36df933e0a6caf465540c5df6fc9c9b2da38268d9d3b3d57a1733ef8b82d65a6b676856341436fd9b6f4a1f39df00e0a60fa6d31186884c530497428e89c23b64153660a50cdb320a49881726c76c19859402c725bf72f0bd90bd226e11416c5319ece1db91bf1d381e3287438725734d3c221927e1808c6048be5b4601110244deb68c027284002046f7626a84331e71167fb0030615478cde892580a468f2a4c2892e2ea0504ae184102dd898400985132d8821a684cac6892620354aa0c49cf841021a25463561c00c81d920e53438cc10249899c10916a605493248aa66c2341112c3f44586865961c9ebcb25588aa1e283309bb673839609b6bcb004099948b9f00e0b7c649cf197912cb57c708217584e8c42bc5383d10a67fc651248e51d9c8407b8d3b3f3a2c7090c419ab640f940851e3524f1c0054a2995810acb5085731338e81174640bc63b426c8cffa3330984f1c330c68f337e1afeb0ce34d4a84c1ae1a3241a947edcc14f3eb620a6250e053e6e90d216bc836978c1eef4ecbce849e2254998ed684865d283091295c94dc3b989da519093263039f81154822f60b8fc08b2a10646aa475053ad5291012dd4e8e8b453c54a93289bb6637f906b68a2898f2dca13dd0a79b5444724b768606d905f30e076e41c6505d9e6e00dc1a46baae1085e227f5b42d50064299ec5a874ac18ab8ad6292a0000001000b315002028140c0844029150108789aeba07148010719e3e705e99c9a34190a2288a6118638c2104100400318610470cdd46026df88771fd61ac7e604c7f18a31f8cbdfe09bbb12cb252aabc2150e1559cbeeabd05b0e33f7d2f4da79f8bc01796e461c5c52a51db29c0da3316f8732f43b7be04fb8d302868e8fa0d9397c1013e2277108e27d0945c3e0fa13f79dec76bd3bc672850015ec5e011016dbfda3725527b8a3ac97ee738a368def429800caded0d271bca861d5780a3860be1ffce07d2d525778274b95ca57b0eb5c0936ff06ad6446d5fd2e71564e2135d6fb2cf36cd000b84882f851c0043debcbf52b1afd3917eb937b43257f11d1684e9ca9544184a71e8e2d880f1014c1e905f4ca1c350aa02436249c88f116319257bbbab7baf949a97fddee402f4700c62ca2e38e7d847c2fb0d336246c1132fe0d4f340d80d8b892c6b92c5b6696e611a88bdfb4f718c0732ce528cf213995957c2a9b9219448ae8100767a821fc7f816e8517e5701ba80b87f60bc132f63aa389b0b0d47395e8cd0245a26a852f5d128270535a71cbd1c271b525d6c794d74a659274a56a8d85cf82d7b38d8a475b33dc95578c42072e8936475d75608839eeb71db6b4d1522a67ed5467682116746286723393815ab5470afc850e2b101bf9a16333a8aed6af3dde058656386afd44fc222c489ed330f1c24c46d868bc978f1b3dd4b6c03e327ca303d2f3b8933b88883bf9f639d97f04eba16eb9e1d982cdca4cb4a32ee11ab1be31eeeb9c6b43a1efd40c5a593726dc85157b91ac0a1ff7318eb25dbca0c0ae82677da3165a0d803e939a0ba9f06cda1c53aefd88e20e6afd03f2b686ff2cf5e83b6eea78bb7acf565b178feb3eba9817c1692397555caeccd3781b54a405a8e0308ad94635a79d14716372b54962d0958fa976833a4e426ef247f0ac97a5420d60919f9cee5ce3b98acae3b660868a0c386dcfc00c5ba3a5b1446dd287f4b0006a29746ae2aa591be2a694427771d31055be7326d22d4f8e20fd1d156b63b2b79aa31eb016834c10e021aa4f66c34c13873c12dc6e4f9f35af1333d1bc9281f41e2b0873740b62554652d90543a9dc98506896157e70a79b2ba39dc446041e5505115b140835d82a39e57b2e3d7ad886985bff3b29f114c80f3fda8d5b00f749111333a97be208aa4c7f63a4646e123daa3a6b071d0a0ca527fc0147d544d496e9da19b375f55b5a3ce060cf49d933b1ce3ed44c5fcfa7639fa18a3b33b2b387411edbc0a133c033d576521442f73c748ae035a420b66457ffaad8345ecaf5c1cb95914fee88e4ae5ef025d92eee970a1b26e8819e9b5ccdbedb0bf418dc3076d964ec19be258a7ce413c64bbd649c16b28bfcb3fcba3a6ed641033c971a461389a28d65386844ee7d0c487e489fad850342b5414a816d12009f3b7bc54d27d98cfac434b8c8d0fd65a624d9e8ed40a651fb5b7bc14de5905e3a48b81014b02f42e4a6aca4299dee96aa057a893ef2d1de7f8d2ac70abed835f1459a484ebfb8a35b41a655957cd367dd2126d5cee32a41a243bdb774f7beca9378f447f7cb952909a12c2df1458c97c001ec6dd174416f2bee6e58ea9c420ae0a78a2a2ff6fb6c6f15ea6c2ea88ed951f52babf2cb490816079a459be08df0f5a8c8933278d6f4c70e0585e4e7c37987248550a5cbb1cb8bba47057a970af520d47df688aaf04ccb284d7bf49ab2554871c5ed4f9073d24051b2925bc1c4e382c289558cf091c60a1107a0cc2070e5e832658d8a8a35e6dbf8294bd0e01253b7cfe990d234e106153999475c5594b82bb9482732905c7520ace52129ca5149c4b398fbba2c96a7a68a725073db10194131363966d5eb30dd9b3d744debdf380f99ae102deda26aef585f22a4b11742d17d7522acead1cdcad3c385b2938b772706fa5e06c25c1d94ac1b995837b5b194fe88ea9c7c903aa9434004842b62438176dd5a98ca08be30bbd2c7b66584b86b0978cb02e19615932c25a3284b5648475d9ccf60af434fb9af5d31e9c15b71c20010e28d0035b029effdb0dc24ac735e08fb3a54edc9ab04e7a4999df33dbfdc705090d04609f89f3187e07c65a6edfe65f4e9d21e1bff02558bb35f5f9035c104ae89d0d529364f2ffc37441950e6f8454eaed53363371d69536781f99e39364e6766bd7f2a95a129c6647701e0a2ad24ae7c4955f4eab7fe378e11fc84b3d9025309a231f25e449ed4ec492de8d0fb0e02886f6d295ff709cf6a330ed8f20691f87d37a0c6f9a0b0e2d848cef9b614cf1af2ce0b4e45d69b1a2651e83a702306c1149091a81f1ea5b4a8539454cca549bbac1c0c8f68d53314fde369a2ce702d95f01f09a614cb95f7c720697b6e7fb19ceff639cbcc7737e17e7fc1d26e7fb784eeff139dd89737e1fcbf97e0c3b19ec879f202122603a83bc8182c1d905b37329a7724dbaf8112cada310da8fa0691d09d17a044aeb6898f64750a3e54d0aa1d6db9ee2f8d41adbc912e58882bd6699c67159d34048c488f8fb847315c65ba6c1c989a4268c81c8d95f21672ec4fbb256844b6e7a5139d6c832f66c2b462f217ab806d6f0e979f6ddcd89dcc1b6452179b140e8859507d85a1e59fac7e760a62d012b2d30056c27e00c6e5ad65ed976cda83f685d6ee73e7a947a314bb9c571d7b002cdc8953247aaec6c136023a0e950e68becb849cea106c555dbc4ce61bfbfec0fb330de5168b0317e16be952e79d2d182215ab6f923b00151fa8bf6410d09e1484151d96da4f6ba6c580e097f1f3e68f2995475370c340fe2240c62b76836c71345abe7d19b1fb28d1ed26cc84abc784944f14248d105a8d29570a50b908a0ba16ad740151784942e81ab5d0829daa58557a044321d1e5cc442301672cf7c49a263bfa6bda2ebb10cc57f950c8797ac91fb2afc90ed40282e802a5c01515d0052b804a27201ace00244e90298c25ef1238aba543870811d0f051d5863edede2311388eec9418ac738d665f9fd2ad06fe9641c3f0e200947cb53b7ec5da82b15dc3a068b3b1a5ae115d599c3010d2de98759a19f21394a2c3106345093074a40282672232e7883c15dfc145bfbf1c56125134c620b91c2161c964ad4010d962103c012ac80d74d27c5738b8443952ec61578ff25619e38c7a8bc25a6ff9e2f1c958b8031bfbef08cc1b0081ef88d405bd316e719a475260153f8f4cbabf5bbf4166ebd5772523901dfb9c3f4e14ee5912ea5420f5c3c0c999647bd2039f9247685c202dec2424546085d3c94b7c22dbf4c712adbe7d498b9a7147b198f84d2b55402ff74489b94d08f6356582541c0b0d042e8f24f2b56a40eb2a025eab9b0829cff9cce40c242db26a1a51114646641454b3c88263cfc4d14a284a3dd7263321622f31e5edca1c0d14005cc6230b405dd8b06f9cef525bfb300012cbe7ce7477eb0dff5e4b51c8ce11a1395e4f03fb4044af91fe1b6871bdaae4c750db0151a5f451a2f035198c2b8ced243a5049b400fc9fe4d28667f126ba19326080936d1a8ed7cd777121a32457cc3d393c1beb2b9b1840e4ed208d6e561639054016974eddab1f0142f366a5887bea6e0c0aa4b125dc113abbc4fce9e11617b58fbf69cf8fac3d8f37df2c58ccf1589b410fab00d29df9948f228bd78e19e7ce205b47e73636d9178a4e949984c541b41d54e2a5a3d77ce648957091832654514027896c351d3575ba2b44dd77d88698625f8b3a5d5b6cdb812ec62a95e59c64dd64afad6bd63859b5ed5d0695863f9a52d559939ce6a942b4946ee9b940a093bb9f61aa683847cfdc859568f04ec6c013edb0c28e8dfccfb52da18deb9f4ba85d79849b607890c337f7dfecdfc60ece4637d6843631740bf6aa98d496ea6d291cc7cff8615743319cc59d3fd67886377dca2322c9dff8bfa8fc8b093bedf6740045a8eca13d2b4d8a0c8faae9262de56b311a2a65790c6e80d9de7a0a3e336cc32ed78c5ec8fa3c23f29f4064dce2180510c29e2113f364cfc322414716b3e80c8fc96f1cd5b9b18b2933bbf0d38c180c63f884b1037298ac107168acffa9dda73a56e39c06d0fd3c4af576592a5fa1eb8555b98b42baa739efd3c0638afadf08e3dd43b429afccd89794503b33089b037b2947122d966b30575b84fb481cf4290155d63540a9db5fd052a56d6c4aad41df0209e940dc949d91b2a81a43e2f6ef2f1614bbd578250ea2a566f1f9081bd6211c438a031c6a5c412ada0b166b013f37f6cb0afad3ea8f75fd8a040180ae1465cf1bb808c41284af3b83f6048bf6b3114d3c332369bd4736053b52500cfecb6b3bb035684409375bd842d2bdd140d1bc4269d384f7659cf522be606c3df5b9eeafb459e47dcdc24eb514771ffcc7aa21b1baf8df5c5489b0824bbaf1542482d11c8f2de3e22121f0121583e4a1643938995c17ded1d09667bbf09407d01345425a2c0b526d69247dc7527e6fa2ab84836af7639762cc8f769312f6b8187573d6e2749019312c3dcdc97f980b3a9a1ead348076d7050a07431a51880a65fcafb9025b64243db061d355b246a299c3cf5804b8e421370bb7f68efae0b0dea1353b695eab51cba0ad13c30a8af46ca68b462ebed2e5b57b6981404c103043b669badeabde968392411b20d431bf7107b7aeed99bb66235b48b02aa9312048826ccc57bd02233ade4b59e8863095e18a949839af0e26a99b5bbe7590dcb6372bd70013942ea73675720eba019e79f34a43d4017d2d75f6bf05fcbbefbad7c6227fe555865afbecafd3825746ead7e57803abfbc05d8d8233e2c6254bcaf3783c8f91e724e5e63c8699cfa46b1353e9552b9a19a8abad68451635c7429e36ae37fc0bab548bf042734db86274afe57b451e4e9fc7253066902f326b7b33bdd4fafea46dd521df14b14cd3926fa5f258eb552f57b61bec2dfca18084bb5ea7d893c50e3e95341358618177d4ef9809a96f101b02263e87146134cff2d6169d61cf623311fd84e39516de29dfab9f7b8c868f4c429d8cd7c920888cde890b1fcb633a959d131b39ef3841feeae88dcbd8b477d9a20be87393646a454ff037ce7355223cdf933ce5892f2241a8ac15f0e56b4f7ec472e03d8f0e104855d01bdc17bc775dc69ecc5dadb7ea4df8af7041d5343212a4010893034bc307864acaebdbb3ade2e34874fcf0e7b1a84c8f2e959ea4a5d012de92f88d978e96e14d5e7be78e1be7f9f5a92c48d7b4b8020105ef82a4e7742c31a250df8532b8943b30bfdfcb6f462e36a3247fc0feeddee1a25b38cdc41fb8cb98fdd8ea6f417d78c5b5112ed2265764b7469c4a260aae450a8da1758153815454d05a52a4785a86d8154c519116a5830551dd13e524557e33452e337e6db8ef322ac561c356e363a9bedc3754084da0b4255ce09512b8880ce6d1fd586af33490ef5a7e02030d030fbf2e93a651b762c8a5a83a98263217cad5b22f2a4cc85a3747c0f131745e210e66ccf01d1566b0d44fc491a84c929dc06242c8ac4fc155328df60c3325d87aaf916b399f26ae985b70445f74f0183952bd8cc87a6cff81fdbc154523421c2bd58b3f0ca991583614e0b308cc2cf983be05d4bfcf21be15327850e79504226847df2f40340ed44cead255616991f39857de1415fefe76bfd0d5d62154517646cffc5a24dafc1b7259e5bb3ff0b7d69189e02f331d8f2afd6bf9d93927a2d06878ee891320c9fd1f31d4e485c1e6253c0c9d797648aa98fb339accf0d921cb723ae9278495bb4227923adb062ce22dd69aea9121af03f7b722b1bdbeda912ceaa1251d14de2d1637d93f9872ec99300009e54422ede668a201bc72315be25317a56f7666bef150bdfba5a660b90970d305f9de40af0497f29b28d4ad3bf308c77cd4028a2730c49386180c1d4fa0b439b02403e2cfa0b4385b08a96dac080bcf4c32707e6e9d776841fa591777dcf0671e09a07b7656c0c7093d3d71123cb4bded2b86050764291cf10d08a2b5ad13c829099b039603ae7861c0df47d1ef36558a65631dd94e405ae14d79e709e216eca51d604fd5823475823739a4bf492b96c0d899da86670bf6b032372662c54fb1c64becf98281b500044c839bfe684a253f741a19d3f34cdf95febdc11d5608485217817c8e6ff49a3bf9f7da122ac797ec66d64b03ef0d1ae298941ddada80c9159b2f75972b28d6f0a78ebc2b23cdcb43ae9431a173ebb54d377d2cf61011d518763f5df8413574ac07b9b5c3e946bcd8f7dc20d841985063bd3497309d744a781367a0238b68cc3cfcd386a20c98aeacf0168066f5352851108310552de8936fe1458c49409d706f378253920c72d05ef48a4f08c1856852520ecb11733a01c90cb045258756ea449335d5184077ae11b3c457737b1c5146c631c8508d2c799d4b12bd011c3d565779dead622aee0abec64aafe786c79b4b8e1a973e455edc12b6201ac101be75655d7b86404a2c523e4b1844073e05d21266caa3fa413b4ad60926be891ad2828612154ca891117355ce130ffc83b475df58b5de0f0b460224301fde38a4b2ca5e2ac8addef0704c12fe0fe55fec272d042e95dac413cd28860dcb860b982d4b67e1372a01b65be33f814a6cb14ac3102ee0c6e7a510c4e059ca04867ed04d448f5e1c602ab127575ee246051295c2c69c502164235db02c8824da54cc2f15623091675d134a62a9a41a7fe7150941aa196892986caf4d1a37719ce3ad69532ec04f7a4337c81f77d1e60315a0b3f446e3fb4ef9941d508828bdd1ad053785c9655e08dc269ffce3eb09913e18b6d8048c66d02ed61611bdcd2a8be4654c6e6e8e5f45fa8e0a15d08ed8712feff7184068224ba5d32f723c2275ff072428eebcfeaf7fe9cd936ea1105bbbbe5d83e0f8f948cdc84a8a2282d6215dcb2720a5113404e024b94571a7cb4cce0485afdfc2ccdca000b36f2fd1ba29fb4407fe44b6365cf4c092f292ab9385a06add3fef9d86985851adff20a6da815f40098a1740b805f54305b9a482b4dc48966bd496e39de51198d0c37be5546ae2914ae33f6cf3c0e18e8b0f82051d4f1c979a259e82c49b3548d39bb1b29da993ec062a7082025a27bcf2150251872bd5ac3db38747b66ca6710d5134249fc795a68554e24aab4f2647782b27eb954b8cf8cef0618840817c09aa3a3010c2854ca9769a922d6eafa7df67fb8b64d26d98d4d2464aece2ffa5b6c9d138df5a1644c2114ccc8173b18c7959db44278a4d49cfbcec06a5e1ca991e83a5cf03874c5e9898574edd507f3aa5c28410186bf8a64749c740f46a1cf4df2486f316179267c1dcdbaa9b8dd3ac0aebde226f4740cd4e29e9b7705218ccc3ff8467db45403de8ce6d2339823c2909a2e849fb50ffa4802c96a5d4ae609961146e89d18641fc62327637c4853073a6745a6f566af9714623e5a699f799affc947ea3dc8558cbd72b678419c6a08e58390df6e1202616c4af12679d6f02cef39001434b6813e1153b6a39bb1005bae9ebcc95eb730b4fc9512255df9fd077bb155ae041662ad6261cea5cf2729b935ef45d209587f6d8eb2991159468293c3c76d494ef18a61e6a7805789b2525286f30b48499df75377bc609fa986b5cbce2a70d7f7e775e5c67fc16cbb480719120abb55e2442ec6f48ad0b31060902ce6e3784b96d1f7404293ee961c9a045be6ae3461c1136a16b5a192c797a7dc51b2ccb6c0a7f0912511099ae29943c6f4af77441c79d30612f680e9e7eb17f4b3b0d605943099015dde5f29765c22a8db5c04a0c4764e055cdbe3afde7fadb380e930677bfd9fffaf28701ed459e4fd3da2c78fb5b87786041167822eb0584952c3d37578d0d34896292b17982899f974cecfe469ba931b28f81962272ff05b2f54e932f7d65026ec3dc5ed4ddea8f8d9844fe91d8d85c0b1c025dda6802a6d345ebe3abd96a3e9b50ad9b3893ef603d9a86f41152b8c870addd544d85f84f5b464fce4050d385d1980371ee9f2e3ef63d46b12484a82b2e03e17d9fd2f2a8abf77904480a21e78141812f8bdf7bce2a6cdbf90251d77b60420809c4ad058d1258ad6fc1ea0083f69a25698320004dde378f8207f34524d1c61d65f61781f6069edb599c9830b45bf15a2d288d1b8c325af0c3d6b4abc8d13e95eeadb3478e1e318cd94b1a6a91629f6986cca2e3e77c6bc1ae722d51c28d23fc2b0635675f01f11c0960e6c3f4b10c85fd11a9d33d22c8e01cea8758319dc49813ab7d3e632fd2f10e168383295e13fe1a62e0da4e0ddbe3d0538488e1f148cf73a42eaf681c64e52c1b53024f93c080682ee26b8d4adf623bfc2568f9d7d5af2d2d4b9d84a9e566647832bd2d0e1cd16c96313680bc410c5c09f82a708ba55b1d5c7b34b9e37f212033faa2c6a8c5ffddb87256927bab1495c8433c234c7ce58a19dd5b44447222dd3e7190779ec217f24121f70ea60f4e4f1f5c6bc71cc2813c9f6c9debe9c94af0cc2dc8f153508f9bac1c9e8365a7902c5e1c72ee542de1354ad52f29b1b0134ac8e45a41e86c1d7e30c3a1f19abfc0f34b8f7ab5be311bcc3b55ffcb0586f1cdf4b3afbcfa7fd2bc56a5a99410380f919f421d7a86aff1bd1bcddcc312bda4e557f3dd4d7e97f710fc28b382848bd33e47007f16b1ac1b1d316ca866c43fdfc70a386b6f1d34f0733d5ce9ccb8eae7da26c7e6f4833c40d059c9c727db0bde4a3b3ba6ddd3e45c0aa75d983ea3b050aef3501bc90651b4fff32708b42e29eb5a70e842ac53e3350947f0d69d709cee0a6bd49c875de2f64ab6512126b9f7c764516394504d189566da312d6a6580d563816faf874f69616596954b7cd392355e33a5d6bdd3f12a423853953de1c68a3533af3ab154447b71de53e5801dc5ab4cbe4ffd9dbe19175f941dd5965fce6a77dfbb61619611bfa81df2a0d1e0272306f644668356c80b0c853493a6d2ffbed526a4395e328fc0b93afa7122a3377356688507600a4ebcd107023a01409747d342d70cb60d0609cacf9de288390bc913bd4cc183bbc02ef310cc12d26043c34e85bce529498fbd26452ada6b096f68900f921eae6c30837cd526b1450b9fce84ee4c1ff43051f742bea1e499be3d231129c87a8f67158f0e1fdbe7be401123cbffef94c7daee296099489f3ed21aabbf9f760b538bdcd48a795fe61924bfa5dd71a34f1d88fdca33b63e4af7ed7b5d9cd6095dded2b7e873133433333f8d8bc3ec13c10e1f361f56d88b52d7a0de6e9681b4d0a873daf85fb6875915215f24c5c3fbe84cd87ab6bea1d0fae7f5318c210eef4ff656d869a1d22185f7078b185465cd2c026add78de0e474c5432a0cbb4409aa0202c9bb03ffa03c7082927267eb5c71a38b71421b2dbf54d0cb956fa65df890e82d52bc4f41f43ad136f76e12ec85274915889d0da1138ee6f7eeecfa4c4295e5161431d9d6f82bae75c2715f23f195ddf79242ba46a0c50e889a913855cd5c9153e90246ce6e2fc1f5114f215261750f24543241899aa948657839e149e16e42d3d435e2137eee17225a2089a72a695b1ab709d4a4593e93cd278297e51940787dfc7fbcd580a6d746ce2eeeac4f8885925eae3fe03a6889dce585991300b1fe63b1e4f7f17db2ad97bd10d545a10cb70a5e22239ad6d4b818dc21c5d830cf7623502b1ef500bcaee606b256931af849c7a6ee4d40a38d0942ee72305c41ee61f01bbf24ac0cfb35ec3655d8d6c2be26bd0b703820c0eab42c11bd31f30c31bfe2f2ddf6d5785c7c0f94e39585f2f5752a4ba03b62229aff68b3ace0019be2bb4188ab8249fdd0be080efe10e4266a4ab5923f2e92ece497e02eca228c922f44d4661f363fca9104985045e3832251a3b21dfd2702b97223a3eae2ff55cb31f02f738d63828736fb23138923ef1675b2c488b8ba5914aa04dde4e1abae93d28f1f66170743170f88238ab11ebc0cc0448868e9a0ab391c2f97cc6d997ef4e83e99312e5e7ac5e43634384df8ac2bbae24b987207c1d4fff8083ed30c4a1adac46d40717a7c4e1704671b719a31bdeb6ea6a98c3f9c8f719d3668da11ae8b3eae88010bd2225cfb6360fd4725bd84d780cb678cd9f8b9cc0b361c1758a546bc3613de34617f500b0f93ddc75b59813b126ab1780558c2c443af116a54a651d8d0c157c10df318ec2485f6544dc1a1ee9ced48214fe293351e79e789274d4471b26b40c80cc69c2e1b2c09c33ed7ca6bc78db5ef391a76a547772c0f3e0ae8d575089e2559e24b17c34bdf08ed35092ac4b483b176c60cd64e7a3a92b8df9e00f0b76f0baeda0519f5e3ab6398d403befbb3d2e0129222d1d456c3ffecfcd54bef23b770e82c5b7639a3813dc2fcd6f800c51e7894cae39e5da87b62d16ad8bdb91873ed3eea0b0465f239906ab6abf7477324051272c611e666e7f669c7a689975010d5f431222c874b7bdc905930b4448cfbc40707cf33c83b912ff1cb4144a778b431c270c19f3dacb193ad71e960c26c20180441b3302fbacaa8a18725d23b28b42cb09506981a2aacd53c6d7d092004c1e12ebbf9ed96906494cd5f19f0a811394f7215ce9f7f1e2a7198c4d8ce3a20c3278f2fdf3a7158c0fef771bf601ec38c26196de6686999e0477a4cab49b87cd4ae1444febee2af3250369f177b22efb02724617315d81ce104f36a6206f3bb9c64e8714b04ea0061fd94c452c8a6c031c8453f93a09d4cc91b9202c12d0f88f04d276ef45a107aa6e8e5a6d880b1778ae69cfa2eca31179c1be84dc8f65171edfe2d5172e6ada67b76ca56f56a5a5a764bbb418455a6c266f151b13a52f38bf72b31102697814b7a3fe18dce388934930dd74861c73c210f25f890b40854b34dbde4b74675375af1c20c42918197144226d9c8e39b1348048cbd5822007b25f1b90b2af1421dd4264abfbe90ebbe58d6b77252446bd609b27a5d2c918ba5742a68320020f496f2b666ad49e384d04eecb6d92c220720d73d1e0fa8ca1a18be4cc221db4b0f38fe3b4c1dd100459a378ad5b23011ad94c19063184ff085e7547800d1c6a74b611e0aae8b3dcf0b2d80da503124f954e5fbc2bc27e4240002e1c42f760711c42094cb0083dfb05286960ede5fe071a72dcf71d64d1138bae6126c2858e7e449c4d13c6090a7e6ffb402747473630823798364788a2575682b660d942bff8e8613bd532a1fb0820b3399059eac423e40b847c18aeb0b858ebd07595a9149cc62a3249b97585b646175c603d906f40f1f424d167574aa6b6c2fffa84b35a4081711d8823bb1388b7c3c815f60d1455ce80d91307e88c8d69a9e1da55ff15a0a31979591ecd8225883f3eadcded9895d6123f899a55529abba553d5325caf0fbdeadb02982d29e219217e13d9dace60f1e65f0fa451866b16df3780c3e5159a2b095935cce1c9d18b25f21aea83638b7beee78a0eebf13a76b546c4dac83dd5276f7759b3089bf3b0ac37b8a9ede129e0e508b9612628a2483f4902e3aef27a4e8f21d586c1be009f0854e0100dbecd704ed9b9c2a447c1bbeedaf4a7c2ba84a4459d39f2228b0a022b688de7709dc1ea5c17f91b25a6d220442348198c5d779208efc0138695143f93589deea370e57790b06824ee954276ca676abfab2d547909de81149321becb213e3cd4e9dd8b4a0903e50c4e8ee1997af48c02789ef8b16e2b55525d6962f95b206a15e03c91f0d8c57aa9cc1426121eee97b69004098988174ba1af6dab07a903a41d22af3944fe55cd72f2028939f162c4546280725e559e91e003e362c3659b97d91dc72508b06146cd930f5d2328daaf3d616544d350350bc82ff574e00b7b667af248702e4a668dce413ca64a5dfd74b4d056f609609c73b5bee156641624316f0c923c0928bd027bb3f0a1b7ba101675b5f1cabaaa462037ef9f4a68a0cc06b70baad6afec034af021061862e0f0d920baffefed9ee60379f34128021e811460a7a5fe5f02ec744bfda93f21c613958c237ea387aebd9f52a52e0459c11cbad2d512ca8e2d58854a96cf22d76600d5775deb5aa550a16d79c6dbc1b25f96c5238869c0a09a444eb7833ec182d94730babf742da93dacbc34f638a38263c279e05bd9c65c0e87bf665ab47b3b3e852544db661fd3b0005e5fcb0869936d1cc7827c7ea8605f93100944c544baef0f14e6db637543208e292034bf34e4929799c44e3c443806c2b0ec1c73b506af764c9129fee94010102458f9300e3f1a157f0a6fc01658e1467fe407917b9d8938c162a653fdd8d6d4d170bf01551f363eeef7be1cde6f7374a2a40deda5bede6b50227a25e4dee27f0c206419b17a2aa26f3ca880185203dc652898707db2d57f5b33400133d1a691cac16d24f73999500072077e5e23cd9f7a20c308685b872b4f579205bb3e65b53b710c6ad7b32d4e587d40aca4bf7b99c4228c003eee6e0695be3a6f728e3f06c3cfcda10034be0573081d14076fe8ce22d5931f45792095effce4080a26753446fc7626e33617a053a8f9746b05d08a628677e7140357c1d67eb9ef25f26674a5c47e320130eb6b091c7f61f527d28cd36aae9f0e6dd559457a15d5bb9de86abaf770795c4b79af052c820e11880a00c44d40c4d29f1a9ac2b8af48ad9705d9f44c7ac03d72983573b327c4ada67f534e8dc7b9d652816294413d6597978823aae03fad16b23275e919817da92a4b5494b52557c41a78e47d1c716c8fae02c8f6b39d382667a563a5cf195f58a6964ca8407ce3e0634d70bb0c1a348d77f3fe178c8cb09c54eade6b3c2e71a9686e85557f8dfcc28706e802b8a32cafb39429ab5f7452aa9d4b3dec02dced931e00f2f453c71a27cfd88d2fda413cc32ddfee79a97fbea48e8de559b6baef3c47ae2ca6eea68ae5b4411e070c24f10c875f86c0fe0cdd36bc5933610de558953ca25365281b74f07a2bf321086b1cd0d45f1e9019be01b7671e34f3d40a820d70f4ad70216dd3cec6c1796262d00199c4ce449f71acfc8c52f950e1760c1ebc2f51e71211b004d31f77c7d76ced806c5b763cd3b7516603cfa7b60639c174cf2811316084a2ea7311bf3113d0c819741e8eed154a54a0d32c1485a1c98ea172147ac59d426c68e87f829327ec231ce1c3a11a12c080d34500f530764f33602f71d4b8ac734a4e1c0365207dfaa17f1a41cc5d7ce81b700f43e2afbe761d2439c99daf624e32770892b07c6503ab9c868b79c8e8e9ddd997c895005591d41a7c28aba2c493494d6866d4ee2041667febc9a4fbb532e4d957a14bc246d34e22ebfc354c6ddbd1e3e61e6114772cec872573c938c661caf49272fc96992a291e46c7a032c8f0d5600a8d8a798a531b466380b1ce7a9c4510d9d0bdfe40c73cac73cdf2cbe9cb65de87d569a7a82b971bef6ef031eb45d129f0018d1480641b4e91ddc5da99e30e420a4a018963600b8ae2f849e7e2247bafcb04a41aad1d23b627d8ffe29848446905f76c9f118757ba9a907f16c26088f3c7a41b5d3f6393ed37cbc43bee52bcb3717592e6ec4f4eb199c8ab1439e3654e49d240909f6ae5700fbc8c81d03e28a8c749e11c8a41e291fdec562549942d8d531c902a4cf1e116efa6c3ad6b86643046cd890c6679a05faf5517a934843a1f43d72c4a23815ae6cff4182a4247452fbd29b0e17da5009b6606086b593b084e60e1e07621c3d828d27a311f9202ebe69eeb06ea90da4d372a216cd60b041d8cd4ed438903c05042192ec809444fcc3d2d09ba411a18f35eee0b4f22fa985bd98f63a9e16d43318fd78c6bb7d88553696316f5a28226186a8b864d14e9e3c9a4198b2cfb11e80c241cc7a15835f13d2ae7e3d3dfd29ac887fe3945e57c3c8c2d46be4cf45bf6c41f6eef18f19963ce5661142bb0d982d0bc57c808bc61ac42f7892cc47a4504df4034277191381f8fd47824218bd97b49de4c44bc221ba900bf1f4b8f90b958b442b3b62c83bcbb77addcf84876f71025d989918d4242e37f5a6d0473fe7fed92bb62b28dc11a741e43f4413665da01d0cb4d9fc51bbe3223eab33dfe9254f9e7efa564ce6aca7eb44a5a9610ce8efbc82871c64982889434be3530dd6d84d5fd3bd37648f61f795c232cbc1ed0338abf4be12e17d878c555f1b3114783b2b0c148b1658dbb7ef2623cd8023f0544827f3e84be4d69621c0acdf87e06d27620dba0c7866a03233e0db6aa5a38860931e03a442246a98f4893bc0ce8c8a93bcea5d0e7994d1b9081dd695ffc4b4b4bbfefa324595cee0215d19480338c2bc02286a92eded390cd4df76b1caca405351525dbfcad4c8866fe7b9b9cc79ef585d74765acf4fa83bdc332adcd1d8db53f011ecf6e3a5863dccba6ec0c6d1032a49e3f65afc35fb867c15efad46397b309c0de591856f86e1f812c3bb9b61bce2ebe7f178ee9f83310e97bc84783b186e49e616447b6518874d2b6008c3109e84d20294572ffc92baf0fea87e17d5c45b1ba8d4bb44e1412c55a5daac2f23c4e60eb88aaf1d4881edbd4bd23dc36bef69b92d3706b8fffb1864b3a0eb01d4f826efbf7783a5974b2c80f3cf2c06667808bdfbd4382fe34d1d215728840c3fe843f19a9a10e4b59bd42ed0e6c86694403734e1ac8209856a2c7124c59f06909d659ee309fee37c1d64a1bc2404325df63fe507d872770a3482164a29c5941202b89d3e4eb15dd0c2e5f886909710903e7278aae89bbe39c988051420417439e6ef9d9b29cf721ac3abce4b005ca2a7cd3f129e9b17de5cc9191fcffb60165d6f1e81c82ac9d69044a3fe5f4ae2d15e0a74c3935f0f289de8d940bb9439b8350534f2d4b06382b2b01a1d118571eac4ceb883874db316141213f157973be466bfa0ad709d00ec9e0210a2bc01754e93434eca855f3b8b5ee661b33e256f837e8815016211423b0cd080b22f2f7a6c170c14ed47d85a58fa5bb365d0cab255abd8e2eae31881e0f0d6a9eae2409da22865e2357b957da8d0274cf59a35b984e821a9a3636b601cec1a43d267837644c5b97eb2b036a9df9036d2698b494c6cef6494fc30006337c30e61d8423fa40eacb01c10eafe872df6bc17fdc66244698c90598930d11d4a42017710865125e3e62fecb0f02929149f31a982ec6f4425656b6cff89a4eb0228505bec77c5a866bf100786dd8b6c0e4e3851771ef59d45b8990fbb5c0e5a80c1e9caf0aa1375aa3bcb648217ec36f01b2612f4fdcb06b74e8ccba2004217d582a997ad2749d367514085cc12e2f2a98fd14c49652a275c355b5db1ed77f6ec848c1270380ed0bd1e547793078841b408063bd1ddf450e32d4413d23bfad47eb1e0e3629603bb570f600ac60bc84a882709be053781f0f918b08f6925e0d3bc4d578c0daf619c3c4d2b19e46afddf088a808b4017aa7be2800fa8a5775334eeaccbf09440e0b7eef82e4b160cfe1add551d0d48b8f1186a11b11791cf0343ee67b79f0ca01514003ad3b1c9187c4a20afc8515978afce26e731fe3b7b646ffc92b987f30bfa19d3d80132b13a409b900e00c554d0891043768b20bab5095b07166010621a9f8ad088fc28e66e152ffadbc7f3b41448bd8d5ee6ddc6bbb1af7e0b38c4d570c23583792f96312d59631fa008a947a6296bdbb43f2364487cda71578aa420ab19ee3681208d5a9448f02d531f5d6548ec65cb08e08fc549d1dafc7badf96b66fe08fa3c08516b7a597fa4c21d35dbc5aa5ebae44293c5dc97c93cd51d4894818728872d3faf07b8b5028765506aed73965857de83703f3733779aac41af9d540b8a5ec399eedb370a3fada9ac21232915f60ec600ebf181177ed9ba0e9bb2f63785b29f894dd13022aa58fe6af2470ffe6d10afd80742936ba8ceb69025481eccbe25810cab301011da2ed095d104e3e8256bd3769c3f33daa04c1eae7e881fd049585223d2a04948aa896cd0fe9198b42d934ba2a33c6a677632a7b76dae85cde84d0904e85cfe293e7bc048e23657b6d10b2cc3e4c7e5e51f20835d081f1a280ae86e220ca9f48d42b297bba456c423981150f1d0bf12732b1968d2191a9cb2b81af03032e3cc50a6c8c055b27e4d8233293aef733a98d0bd7f15ab6bac6cc106f17ef9f8c0166f4392b484b76b590a8192e6870b28d975ca441bff050183219717015a547232825fd7723cef8b33f069955d28a92043ea8b22301a2429c81d91c442a01764b0306b92e43f546439fd4c2979cbdc2e5ac76afb0c75b18be57b321bc1c9c5ef763be258057784ef80f170eff9fdb84b70add0573633eb877b1999a052b4a377bc4a1b061eb6b1d4ae48fd8833c387a4994237c79b9124cf135fa85fad28c4429c201ff75ef2ddc5163c6d2bdde14552f2db0d08a8aecf7049f2ee3fdf04806e4ca6a1dc6f2dcd128f234c1c0194a7437fa640291498dc45a687d3ceb5206a9df39b91f9f1ad85cf29faeae669bcb0fe19623b3043229792f469d31b96798c467e32be76db2b60600f7e737a60c658a24455924db0a845f2aa448dda116bd2dbb3018e7632f3d9024dc51f126225ea9ed079e9bc0a74d51f1709052084d81608695b1bd401c43e7300c8d03e256336534749d5a08e981aab841a88ee39fc35ddbd8bcc8c2a4ca2e594de81dc168bd2a6db2eddd018808e5a37d8463b0b4047a1698e25cb558503ad2cf3e6f344c95ae19fa1d615709164453d7100c39fd3e64058940fe414816fa9a3389968ac16d244a67740bd32219993a2e4c0cd9221f43748ef5d6af3afcea8add791e382bf5834659e67f0d4ae89e3418ea270727b4df5fabc9d85b5c58bdc7fee0801c33caed5949dbdbc469e0b6d90a191bed22fd4a4f8c76eed69becf91ef53c828f58d5db22d69b82403ffd0130d097cd0e93ebc4c89668fc73f3c9d45bcb6968a66e1d400004588bf39e2b2b79b9613d67d89380a3773edc4ed1a5431ba7e4ff994d3b5f186ecbc73834749025a3c084f9a81291bc6ac89671e5ca374b09a8b2e987ba2c92b09bc8e32ccdd6d575df9471bfe18aef822ace9d57c1aa45b8603dc3a6b6a19963e8001faace675109f97ef29fab7e831396586098cd194b32fa56fa0de927a0ca8e2a51c8aa1e80bba3e391a0a516738c18d050cf9cc63e26f4b03ddc8e6165f903a3ba43fec22e3cb71b66e7ebdc75045c663133a3f4f0d85d05bbabd87d68dcbb62897121e6431faf747d2bbc341a98732f9fca8cf4abae1c8ad3863e27828b9daf4003a13d704d07a5c4803d34b48b078530de502f16e50c65a979fa5d1ae38bc2d2f7b07885409afd302aa185ef98202e9fab102a258ec1ebcf8a6db3dea579ca2ab5214e7803af7af64c7bf89332ef8041a2c9f973cdcdda215df3521a5d17e69b64661ea805fe2f12e3be5ca970c1a7cdc30f5b2f063601667c5c8ee343bc0e0ff683675881c6154bd0190ecc61f99c2ff23c5669b4bb2246f7a1372bd6f848b0aec2044180b9a57955ea3cc619f423544c80a32c3e3477e0712d9cc163c3296818ebe447da0280d65a706b327dec589031b396c58c312d9320b753054839ce6a375ba6e3fe31fc79f1e7c31583cc1fb32ad5c28f43de328af321131868861da1307f395d7ade9b9688e79a835f2e58c42525f42e1dd861f222e92189529bb946c575d888d369b1222d8674fe74242461e7ae36db492330e03e08610fd9d4129744842f7c4844ccc8773dbe414decb178fbe43b2bd7190931befddd3cb69d95edc889b2d593f501cc55bd97fe542727c1812461c873adb21b1c706eb9a7b5f2f0a69cb6eec50490d1d368edc8bb6ba2d7586fcca4f5a6a1eb3abb18775b9fe9d4de2e63db7aea2b63b86d95446f77be0b9934d7325d6f88e516bb48a9b8cd4250ea63f8c3af8d315453fdb7eefed59b4f1bde267fd216ca5ad18db6ffe5b0342b20aea568fe55ad098e822933817c52d5917a9876a1e600a4619503988ec47b5ce1abc575d4ebec3762a4a9c1b335cf24831935313a9b02cc1dcb3421e48360ce06c46c666c2f9c1a7d03744e4d24e4dcbba35bb9f9beeba61c5a9412da4e7699144c5f4200e35244cf70a2b1441cb2070b965b031bbc04572fe85524c38a5b723cd43e39a93b87fbdd57561a2f3591be6adefe1e11a4ce0a21517e646d51286ae128f5cb2fab8bbd2572a8a97dfba8fdee241fd889bde1e32a6bc9b887c57b41b0cae7f9e5303e0d1c25e36cd669b5cce6aae4d5001235d1b80dc631a5cdb0649573fb842950b42bc8e113677b94059ed169aa99bd82d86c6719af285d71dad110a4003697b0c876cb36b499228a12ea66abb5d7cdc506dc7eff1476a425c3c806a8dc5ba68532ea8038219747600eb2a816d0ee0f37ad9f4ecf27085e8250c0a5cfdbb8613b71215b1f9c36ca949d3526d398e57b20ded2e77bca9b58fa21897c5b9186378b9a7daf90275bed0028b17427c9e84bddb684091743094add181b7e1d37958b0efd40edbae350a66b23d78dbab1e8bba7b9048eb79999f9d7d03b332fd3811cedfbfe2b4af95a3f4b6e997fc403e65d5d524e403eeb7f422b15c5d2f9c9bbeef1153a076eafdf2800f6157fba54b4bbe568c9e1900cdb128d74e993fe2a65ae5e311426083815233d25b1eb4af21f3d40d16576bc2782ca545306b820dec7d6109c8e73f5867f4be31f38226250d5242de88ad54824299971341efb5790a083d56c04c23bd8738649f1abceaac563ef09e1ea64d780c9cd782abd4f95d2184dd2ff159735f96a27f26c15d089ec4f07f38611eeec5cc922c434dc888e6573942aa221382fd2080ca6e89afe1a2090e00c17dbf69c40673619db38cd20c6bc7c9b6f9d4e96f9f3fd8247fc74ceffb5b180867f667173f5e2859b3a830072fb3430fb06e1800dacb9d98790cb81abe8536ae3a10b3bdbfec1d5f8d7149095a9572f90f2fa7aedae02d9231ae0ee40a649192f190261016f386b8f4c878136bc6d5f6d631f4924c88cc3f1543c3c4ab9bc3f6b646fff4a803b4e2ba04265a12cf6745288fde4441a2c8f740d715efb775039d9ff5b7465708bf1d39a2b24d0bb0cf021ab78ef6f00eae1f635bbef5d4013074d1a8a1af632e7e24db923d8bfdcdcd579e6665b08ace019241c9c06cd6f4dc4466ed6d124a88eb440c923139953a4f9adc3ea4347bafe7c181f7df3d696d81e99ebc873c949c48a922aa4e359ee092b84d82a4b1848fe019c13ac630a79725027fa1f4eeaefedde826e3b6fedd9b7fbe8beed1f7e560fe4486d7c4bb19669e0dca7d31117a1b2a1f1b428c0daaccc84aa16b8f19754a7bac74dc0df9eaf7a9763ef6dea9d86093c627166f2b4fd2939fde81f51342b7b3990b5a1666d58dee542aadae4e5baf12874a4e4499f5475efae89164ab73775cd133560bb9718700a1973bad5704856ec3a1bfe41cd218e90345e68020fa2a561a1c23b7905a00c7dcc1d471da9a3cd360aad7b12f465dcdcef4ee8512873b3e7b68688487737b02c3368be84a6a8e2643dc0503051142f980273a19dad9c9f940a2734887db7d74384a182db8924c125e7fce19e6197d9803b724aed1e99154c7776b6cf95ba571d20fc5e670c2d7ce6c0cc4742ac8e25e6b2fa89664c72aafcfa6a2810b2dddbaa4d83d119cd9fd53f5e5851eccc78eed86dc52aca0072a615077d393d6c89f147758885f62de071f476872f3da343a5bfd5a772e4c29eed726285b00ffdf19a310f23016b6e0c5922fc7c4ceeaf579072946af901cdd41ea3d8df4af3689dae90f0660a224e5e46503dbe8d02c3953bc0456977d20e7769c656be321472090431d4a67cad40f0c2a1a17b68436cb407b5c58ca94c4c35f3de5a9037685be801c6e4b82aea79c12f2d401f94c3b4eb8ae9ec447315307b6aac08909aaf1d243a55117ac1ac8b6da80d5174a317bb272155177709c6460b086f5c9e3d5a5468b410c423aca339d4037481382d8518fd6ed50b7e4f44b11ddd9df716e7d1583a3c1781ba372cad7bce9f94994960af770836452d2b92dc7ebca87cd679f9f3a05f81a62fcce4d908bf01a95d0e0e5e7a397b72c70f4c904a37bae3ebc140e8c0666057a53e88e52e584c800f29e4cff349e3f2c2bd38baefccc788c4dc28b0f8179155d70f1a78bd268d979f120ed660102b42981e9d7832fe5b7039d13c7b7f1d43040135837249c4b7637918eb2e9154d0f6b7bc40483cfb90f99b14a3357d63994de7d8e223ff6386247d8738c6ff4e39ae760285867820016cf5faf778eaad2f6cb81d1f34769824c6b26fee2620bd3e4af145f1080f6d642ae201c7ab6d4cd3222aa48f61210594b0e4a42d759a9abab4f290708416bc62e2d40748e73bf40b48f2af8d15a6a7116c8b50c3b349abc94f76f71d6db5d1e43c912af8cba16f9957ab581b055adec250652454d9c5e710e53110964582958df19adff42b63250b354e80741ca0a85bbf15e648aa130aeebfafdbea76d3c431c7bbaf82bd4d341e76e9ea1fdb32664b7c017c5c14fdbf53d50f10f3a61527ec4f1bbcbfcd674e667bdf386c6f7c29ba436584c186187ca7f6c79ce1fa5fdce207123892fb99972b4c2cbe2020d501b6a1f4de73a542b87a25933d3d2a39d8216e63dbae2dc99311121c198456e8b8b904a4d38d072c73e631ab326e510ceaa3748e7f286380412d9be74978f822b35e5f38255543f0d620f82a1759f97c6a6927e4e43da9dd81417c1337dfbfb0a4b266cbe8c5ea0b43efd63b476d20abf141f5b604f6ef27d353b2cbc8e909a7df2f185bf993392cf785f93cb4d1662214dc7c668f952bdf1a1494be9540e2c767209936fdde5975f58d85606aca68950431a6f7d85f272ee7e508ea35cd2a474348fa0457e199cbc972b2e381d315e3ef7efd8b41a3055f9f46ce0abaf0b3c108b17b1a8fca50b9a131e6fcf5bffc9da113f1d5658d3eee0baa7013ee0be477c7ce9a51d124ba176541127fd8c27121c6dd357b8f0c61cdee1594d22dcae3d789e8c35298edcb615b4232169848cf9ce8c040d5fcd810c9df34cf1bbdfed497353840ef7ce43c128acf9a08b1fbd9bd4679b01eb16ae5bf931f4b9b9a53f37dbb96da1f2411f0dd4f13b4b370f3b650514b15850930de0c206329488c888879809709cbb67d3da86030ecca41a8fc3abeb6fdbc49bd37f8475e49885ad530eeb0c24b2404408696bccb11d05045c7b6ac36a08ae42f6a613c54837bf092fb8cbcbbeae85ec4abbbbddfd40021d5bbe99217bfa9770d2e93ba5e8996298cf6d843274dbf9428fd72feaffa3b20dded6ec92bd8e59f80adc1646cf5146033865f4eb85792d6a91c1b35d3e3e2b1f7ba96ff6c53884359b6236d566420f73a6e6f1f2c6e04c2f5c4916df95ed51d77479859d8809160a5016e43892933c4ba2545819d84a802d0aa220f498b496b600e83a9244663e3b382e9e1d8360240cba91b1dad464a04bfff04b1563f47a891aae3e5db1721358ba22b97d81e1482b3b423f1792b65b83440e472e9a246d48fdeb7b56705cb90f6a20a0cb5eccce4b872ab8452bba6a80ca514201deed30c10e9f4efed9a5bf735e9e6f771ec3ed220cc994d4e494a9347a8661ccc8900acf3f10cd6a1ca26b3304a544b7c7285379fe0d9b0077320a20bea8f21642eafa4fe5559ba62cea54c4a247734209aee7b8b41a6582a237cc30158df83c5486ca82fc881a644b110f0f04a4038b7184e951146efd3d0223fa306e526de35c9284236bf3231bbd229ac512c850ed995f7de7cc8241aff537b846d448e84941d0bd0c796a65a64bf20b4392b279ed74ce9af8bdef26c8194347732e470073f011a27f32e429fbe00ea237c41b85f89b2b839df12b3d575fd45c1501ce68452be791dfd481a40a976f8a05052c108e1e8ed2fc1489b993ca0e4b633304961c3b84d0f4a2223ecf68785d5f789eb8c532a0c52f6df0b651b96e3528c29b469a245bc4c0be280910a562487e63562afe344c5809dc3660b7d5e34767d185cfb16a53b9eb63f9d8229fe73bdcc6a3929161167aaf89e58fc2e5702b45bad99cd7e88a1d755bbac79cffb3f063520c577dc9a1fed3c201ca767d66a196cf31e4fe4fc33ce04d9a32224dff0c3f5afc732c5417e54c796b4126db25a4d5356d68a939d9ff9e37f446e98e638c147bf9c2fa3d859697ecbc29e1ee600355a3ef6dda8e809e8f94fd07717216a4063def1802192e6d36ffeb523ee155cede0932f5c833b5b82064a0eaeb828fb48c3ba6916f6d23e68b441819b8f4dbcd40df0e346cd0076c1b9a2ffdb930454759905babf1f751f6cf9575deb87e01e515754ffae70601ea631573fb0a468c5e93b94b7ff7669e326e65ab25e357f22c2962696d25731cf9ab7c594733d917fff69ebf921656062f936a38f8883061077732936e916c26423473df05cb0684c87ec86b3edb42b27cfd877c4a409f34949bb7b7cba110f8d02b9c16ba2e5e47fd2c88bca29f7a5757510496810f746df0fec32734ea13f33a170cea6254a51159b05381b46a46678d0bd0910d84a2242f72600122c5c24a9f6e7430a95bd20b060b2e62cc287d47bb4e7772808eacc084e069140fc5e83d2a837ee30755830cf2e8ed0f1cdfe212b17cf705df210f046d7e1e1a54b8e9b14e5e4e05266a1d4564916d6641a49c540cc275c98358f2e2e6ab41f41b66abce76188f91c62cbacb1584236d82642c6bc07a85409a8f16b006af7aa8e06534322b618e2ac364c671cc5b779e3292ae6ea33f045706c361b440914e0f57e7c52aa6fafcae330d27a4511e2b4656cc282b003f0e33af05aca2f97374361bc121bc702f2acc530bb8e8e67fd1f50ed595eb273c2606fc46613f930b6047d7250eab41f17a36b30f2c3e8c67af2ae731d4fe623b3215161203a3afb03dcb86111fcf56bb2d659d1be0b567ebd06f45837f2542537ccd6f4cf7c4a67cae921c4a98335b641e8ff9016e2edf18b57298a294ddeeda4f1bfd8802102c90c54374c9f0d264272e6073551a71b9cc00216199bf29785a812558a6e6c269884be63faef05c04fd03949053e361d6c4c2ff40d36c544f2402fe5497585c8edeef4906969d61dd18a350523ca6eb96fa9916fff58449c0e8c53e20d46279d7c01c16f04fc806d89c9a67c14cf7a7d45874daf751c985047dc59b9b1dd9e0e7c1dd8a6bcb9ca2eeb940f86c9b78334911075e88c979c9d813d0f692d73eed0df839271a4954de6b5cebd83c150979fb1adbe15320003be166bdd6a02adb12849bce088bd7da5c775bbf5a66c062a0271fe7de56dace701578542390b393667f45e904d6bb1eaf241aef406557b6cb8bfac573b8efeba817265b67a0dc8d284ecd0693c56dc683380243296fdc041b41949185a1426f2949e674e482098135a2cd508d3c722ee25c8193dde180c1b8a8d5af962a1c7cbb08862de930632f028fd02e3c0d20ddf204779d6d2574dd5d8d15e23760b1a89bf276137b8827b5728b51d72fa40c6ed81f2bc9640b916a5e6a85457d4829a95e1517bae6b856936260d77c4d53309fb0c75439d37aa4dcbef85440b5d16f922043a7d9b8227f8762acbbed62c0d8df79a313571bb5c900458b9adf39ea455aea26fcd704af5242a243e45e17578c0b455f168d53bd3ac47ba33b3adf08f6eee7a69166316596d999a6959cc2d7d00ed080916a6458c943947edc8d839e323d7f2ed49c2473147db8840fa0b806a26c8d00751361edb4579f9e5a0924b978b37276d1e16109d5ce5890758063fc3c557b69f695eb7d432af97383fa5238d8a28294a0dfdc48a52aa01a4a6c483562641ed4d4a0813ec9355ce2e86113afd9a0443548e9599ca9d82bfc44019ae9d0e9118990fc6ac9a3ff0a8a77856c867b00f2f5499cb60c1f79c4f6bb4cdf59a396490baf0838cac36ed4b657de97bc69363bc064a9458512c5a563446ef82100958a3f29243a7a183f3ef74b25e6831ed51d3ccda91d881e17cd6a11076554eb5271d98b0a4a211eb13ce67d3f0a7e82f148c1d68be812021608cecb1b21c1622c74fdf54dd9560cbacd4254f0842beacbccdcaa9ca5d4bf4944d0b0f829da84e438a06096f19d10bc985e4fd79e2f82afaf05b2850d902cedeb8587e94cabef3408eb816bc29330b810ad200d73419fbd34b890393ac34e8a5b8169d34c251ff9b176e09002757b847c061e35ee2bf3644cf3e235c0da0f20068c644c9cf218c76e563ef3da6eab0bc5b37b417f95b6611f877b21072dc9cb51d26c836287195095d659492c0b87a01013b3762ce768764191c7de3ba43e84695833566ee7c1ea4b2854cd9477c3eb0abdcd6f55f8ec6bb844d228672ecdc5f36476e00621a168fc6ffa6296368ec4a46e934d69ba19d8428f162d9cccf977d00baed34921c318e5e4f4f3fceccf879ae0bc026b8520ad12476569e60bdd4806dcc68f47b61e89dccdffc5f6c1c782f729fdaf08565f7618b3a3dc2123eaf8f07d011e14aa6fee3e91e9af56091319fd4a7785d9c1a345011a7545b0491cc8af3588b7fa16c4c4193fd1f14116aab208a395784655d9a522a58f622f9cc2aa89221672660428409593a6215b305d641d9118506f94e516b6b267ea13c6f4dee2fb2186b3c8586a2704e429a35a950097f2856074ac0ea46bf85b9effe982b976203433d74405787d541d8360209c9f205bd7d015f00537fd3413a7b4a4f50b012b4166a2c6491a03c04c4c660d49faa9218abd1ac2c56770c67c8c682f64ab4404f8cc1295f6ee2aff2374e69e3696458dbf99f96aa875c3dbe4955ff55a1db25c2f27f1bfc3a312bb5e286b941c32c22e7558d333dc914da107cdb074d84c1be861dcae173c37d18d668fcc46f70aaf7ad0438859893798f35a5553dd9098aa1b66577583475a75131723e3733d9617366e33659aad3c65990427234a9c542381f7c947168b0e8c455fc470cd37ee3f90caa3ad7b4597f7114780c369d2e3989bb0a8b582cf10af6b572d16df405637c91316c1064b8b35002f42bb8bf9363c3b7ddfc6ee64693b9bdaf24f89fb98a4e8321fd906e0c970771af922bdfc9958065da479d7c221f9bdbd3a66c4e9ce6be55d5ad9567c4eef2e12a6cc22d9162cc6409bbaa559c8e56a2b6ae3bc2165eb243b5a66e235db286e2af9c5ba4cafdece48d46c1b8a0c1612017c4c04ec9481a61a60a4e589918f14317d4d83def2c2903cd8e1491d7f091468970210872bdfa0927467f6970dd84537144363fb5922709cb95de0b613110e9573e4aa5b119d308e36720356c605b8abec27ccd87045f5540208489d95984b2104d7d84d28accc5a74bb0ce62d1a017f7eb77ef2f4efe3b8e51a66325fcef5c1a75baecc618761b11a32ad41c63714f23712258187a607efd529801a7014b97024d57a015f3a8501deb017b929411b419af2f8605196c1d48556db2f66f79ea6f455b7a24551f83660621d50feddab72653c4805c29b6881ba9186df1be52099d59914b3a2511d828afd53bf4b83f1f837574bbcbcbb236396460531c7dbfa80607dd6446e75c560db6838d97f33b8ec92c01c981faf6b109b38ee38e2977a70473ae3b85ff370d0b9bb19f388906725e8ccb4b96c8f8ba7cd42998d96c0173dac32fb5780cfc2cdd602c5d452d80d630afb57a6ede7121eef080a4d234321d2e3def2a8a83b9075b9802ed6392c443b923829517c8054d342744fff3532726f4ed349a111059021e081bb01079f4e74695592b7047b23035d6c86da5f093c7a8e615b1bfff089ee4b3b68ca1d39a6ee540f87f0f443dc4cd372dded616360bd6c4a091713a4fd1f3acda800f0475abe2c034a1191bdfee56e7639cf2e19edf252473fdf86bc5a597de0b081c125eeeaa11def2839452d8112811e3db2dd33154a6ad1f966e9d3755aa9d8d1cf2d225526f4ff708cb2f88b45747c618be60780c51980236db887f4ebe6af21f3672ef98f6c817c7a2688284ec79e76032212806e0f4f40721800edafee1bc63687ece56be3e4b9d647380124bc2d56c2b67580f96dd14a951900f44f019e3aaaf5fb58f16417945b316bfb5441ffb11b3c9493607f17d3561ea5ca665a1f471b5a6e23bea17e5e9f89e19d3b4a74fcffaf3d89f6b091e36a0b09998706601215009ee89da70dd486f785fd07d37340a4c997d072f0196793fe4bf85942ace5dbb5f06a47b7de18bd6a9304d1aeaa092bd0db722558d678f7141b75126a70ccc68afc0640f4fb922ffa59c5f761c42312552f334500b3855740a91e420fe22e22fa4ebbe9813e8a45be37246e099e62891de04f9286d274722c993ae899bb85fd2ba593dc0dba65420b3be21071f53742b9bd26126374b437511f655e05276bc03ddf07f0f5e67ba3bbce5b61bebaf22baa65f9d298386f3ad40b0093851456b8dc303ae9e17443056a7527389cb8bbfbf4e973cee93fe79cee5fddeb0da89e6e9072c3d10d3b54a0dc8082932e35a324376cb9e1614ea8dc70c3c98f4f315245796e48e2c9941d484d6e207292d4748070a890ba0391c60fcd1051751260c01890c3188421b86108108481087e84608720621002b61fbe60187baa276eaaf52b54c817e2a07e918a50188b8e321844858da70c7a83d9254052ba14a3e29379b03c93cee96f607c57e5eaf421c4a6af1322f54400e221f64402d7458f2d61bd5a1b31f01c6ae0de424369a5d69d6ab45dfa5f6655a7a6237ebf524731ac1792d5a5a9208c89bef1fd7a2aa223a81a5fa0a9e8630d0654c8854055700452911b9fabf90aa56216e7c156a8b071076b2a0663c3181833f9c6f8e5a9d8a353e157a3627bb18d91d21250bf928a138963e7eb46851ee760820a6b2f8eae98ecc7417c4985a0c278a98206ca15be948a60fceee257a508b31d5e007f24cdc50ec0d7a9008c35182b386c3007153696c19c8ac0d85fe22e1ddcba03daceea9656204a6a940e3d7545ea3345046f03ff95efa2b7a6a78d9cd363897591e115ea33a7a83e9e407958e0b870fc97dea2146d5b31aa5bc60c47faad9c23eedb924763dd01459cbc8a236942e19784ecbdf7967b4b29539201d608530b80086dbb0946d8b690e9ff6bdb51af3e9da255f56d1deda724c5a56f2b28a349d99d6dd1bead7db932c6d390e91f84c6c0fbfa129037baaf3f019984bfce7eb44a14d85ff1589c9266df13a9689f02d1fe4cb4df89f933edc6efbdee616fffdb380b000a7038c66f25a65dd77500fb0e17e9b7dfd47f394f7ceb5bdc2a268a9e0800d1df38ad3e05a2c7716bedb72776feac1414264ce8149d6292ebd3294fc2af34fbfaf48a27b9b0a257b48a6ea161289a5c1fd3295a855275b8c3f11804ec2f42b3fd21b06c718b7f8b8b74ee4bf40dd5514c46984af4691e5591cb034f6a3c7a5fd7243e91cef83d9cd9dc913ebd11451a85450ad581552a9df2a3fa32945cee8d1e4647a57aaa725f6b9dd5a87e66739bfaef37d128a7d527d2994239adcaaeb9be11ef67a25ff951adca2c7e743b2d55bf133bea49ac63e7093c3c82d3ea7f8c7ff1453f82114f924931be7e43d95082c7e12fd22a94ca6995863d427d7b670c4ca79c56dfe861fc48a790d81fc1935cd4b003d9dbdfc21eb21fc1935c7c7d23fd246ff490bdedbe48e70e8f43a2cc138832c3108d8a5e88d2692e6422751afd162296d94b208e771347caa27e4c1c41227194d55f218ac00d895724d2198639705a7d105e78b435ac607d1e536986a51fd1afd2a577bdeb7b4d3ecd8ae114fcf06d214ca5160f7e2dc49647f32510e7b310e9d0755afdfb444fb9dfb29c4bf45836f4c9a167eecb58b77193793d27f6bfc41ddcb78ef935e420d4416793f1a419fef68e64fbd86bdb9ec8ed7d75218766f3b6b12823a9994fe5edab9ddf526d25528c8888e8efcf0ec227c2453ac7f0c87dd3c771f48f54b6d6dbc4b45610c1361cfb421194348f0267d733c82c170de9cc7d119afb87c072ff1676107ee3229db99794d3362098fbedbfaed3e18eb470fbda54ea2b3fdafe65b2bb3519a76d2f83caad39edebd3d19fae905162f1db7b14134f82e2553c298e2771b236d7d16c3fda98da92b72a0fa80cc525499b4fc74ab6a18a53854371c969369c36bdece68ef48ba03079fb4683f5658b49defefbc0c9417914ae396d620ac8ae74baeca7b9f148c2f42779e38a27cd0f01847d30d8b7d8b8e6b4c61458218e6d416e68e82596973c996edbb68570652b7e7b1c338685c5c344113a8ffe94b77f89443a8758034e0b6103b7f1667981a9c40253a013a907f33d0be613dcf9fe935f83dff85906f12499bf1f6183ef7df86af9fbecf77250fe0871e0945be4b0bcc4c9f24f96585db4f2d7a1a54ea3d469cd8d36723f0d992cb631dbabacf669b6587effbde48662585dbeaf1978d2787178d26be049fedff390b2a944e5513f68639fd1e7b2fcbdcbfeb66fbd1fe51b1ef2c6ccdf73e049f3bfafa332eebfefe5ecc34dfd84c5054d7e91251617aa5c65ffd6c1e7be324cb8d469dd2d8f1c4b0d5da6a47089f34d302b9665943543b2832e252483faca24cba8ec4fff78d654eab83aaeacacacac8e9007c56342c783b2d311f29e8c6476e8c8b29cd6548ba2b9b4e39a47feded3bdb22ad5714d25aae547fefd4e3b2ea71d97d3aee3a27d28213a88fed9f179f6d98a8979884bb1f4fef926cfab3cbe8c2577fc3cb58ec8dc91765cd993bc4dd6d240de7079c3e50daf72256f78d496ac41f2864fc91b2e6f7896dae02857324ef399d36853b5bb943573daec0600240d51d6f0972fa3854be733f8f74a06a94a5529a32a15ab5255ca8f7ce64a5266f0d8bf863bbe842a59d62981491e3b2e245ae156678c87bcb9873b52293a5d767d51115509cafe5528cd93bdca8b6cc4ad50f268f3b4711af5a48dce3a736cb416679b7087cd14cf2ba7f9cb70e1da3eb67a9ef75be4395e79345fd2a6eca69f69d350d056e59b2f3b7b63e02fbf31f0fc0014fa740d3963c07865b9b91316217c3c40286f3f1639e3eededdeddeee2e80d7e854d5b5d121e3ccc9d28d20f9068b8b54b61fea904df8c9dbd350873c024dde9e082b7aa838e28cccb345de915865a49c39f2ce08f44cb18098193d0520a2004bb8d7b8810e3148395835b0684de4ed319f1834d09878a1046bc8851822601a227178429289788f58763c76800eb7711bb771b5d718c29aa11692f4e48d863bbe3f3a6c1079fb4f6e9bf71a3d90c515a1638bb2a34ed131c9e40d4ade1460ebe4ad863be6156b396b2d6739ce5a8ee3acb59c6dacd7981530c728007695b7b7e10637f2f64db353a9ca23ff3086a4216bc81a8e474eca1ad6bf36cdb2c5487aae63113e735f75589087c8ae2af2f6be63c49913a1c896ed13f12108a0519f730538650fc83211d9068e2928db3c25c933a62bb16aa093e9d7d9c83dfdfa2fb29fcb39c517fbcbdcd986753e2916f590f9ab60a55ca593fa9c734ab1a93f4ed1f673dbbebbbf226b41a425d996dba8addbb66dfef43ff0a71e3642dfbfc3462693af63b82f2d74b0b4c041a3c58b16aa2c57626991ca02857f1ba02c7d32105859e8c8e142e8fb24d6f149b720864ffa273bce9baa2b504f5a79d0909982324850569c2d5551507db4aed05499e21a4427ab86f4c7bf3b64ca8ab3a58a42f5d1ba4233ab700da29365b5c59978d4569f36574dd5550871d19191c2f59aa44193217f763339b67124c3c995f555b4010930299f94948a5621c465874e18ab293599fcd97ad3e68a53f913a13c76c88469282d2528888cc363f6c948e1caae673ea9544709549675a0aa2ac8b24e12429e345dcc9e4620d71583b29003a70e6bb28a6334261d4b2ac3277df4a143a84deeba6957599336af647f6448b979f2d85aaea524c5059de636bbc85d736bd5ae161dda1ad282b29434c6f6933be89e6a7912f7be256fc81eddd3b7df51b14867cb613b0595f96444ddae95ba981aa44e232448be8cbe912715d19f4eb7a66236e276c834dbb387f3377144ca5da7fee4fe427794511953ee48f352924b9ba9df1b3f1e9768f2c690ceb4269b19c9e742a66e3aabb7dce8d34cf148820addc9367325561734b9fbcf1fccfee8a2db721eb6edb211b77b1b32711dd740e40dcf96035269490a4abe62225b6bed8f8d6473b1450d38cd620ad021d069f6abfda5d18ed6b970c7e7aefb4ffa10e8342edb0fe249f3392ce0db8fb9b54ff31ab646d9e259b648d97e536d855c64f983145502ed8981caa097e1caab26dae4ab27b676d05c5ef808f7dd4fb148e2a21017c9cff1e10fecd33f427191c435a779bf348fbc59965bf43df771103832c75af6b8f770935c427e7d08484a6553371e5010bae5536c44d237d2fdf29d72f4055afe3cfc6b4b548a4351c8b2960e4296822c312164c972561422daef82885f57abb8d695ba1322660e37d12e5289d428ac2d52b92964969bc0c9bda5dfd5b82ef75fdf7650a473632a649637dc44bf6230856f04837857d95fba5883e20af1ae32c54d1337392e01479c29f3f92e93320d7c8238684cff7e8a63adbd5726fba7d16ab53ccaf2d2129305490770438386a4617f8a967adf874799ccc3b56239b936639829a64e03714f9047e6b9000b0bc329c80d8292467f96b78453c53ca95f0cbaddf24d9825ea5435c22c4d3a5999e60fe6a38dec7decfbeeeeeed9753b7f9fd8d9136d6419ea186532bfe085cae1d6e2f15e99ec7fd63a2b874c3488a4e15f834b06d5052544147a610d1e297eb404c240171af04891f3c211503ff4fc98f2834515c70d181fac004d61ed6025490b3b5c3d01998008ae8620f3860956abe9b1c40b5661a43841288c0b7aae7ed872441a3e7fc84c6d519102072a5f8014e0ce0d50a41043460f15253e1813f582941b1bacfcf131850d9f32649ee03a639320420a90150b770a5155a9a3449ead14903ccdb17e2aa045cc9c255c02714539616b4a1b1fa65a18a26a2b4a146eea84e91a225015201c9441a3c218282c2a6c4122b6040e9f3f48e24481460615424ff0305941891b7b44075896606305c9172778f081844b8e9f207a78810918ac1147599e206307871562c06206aa091efce031e289e610a5844a203d73921402b2ad3026cb843550e030031e1dfa386df141abcc1d364a06d10162066acf1327a04972854c1148fa30890283952692fc6843c49c21968062cd98273e4f9e7670c3041aae27c6b0405327cf160e53434cd9b334f524a84ba11d8c00e4a30f57151c2e3f044103212d164b04f1441515345f7cf8138750117c00ede08225424e0b5b2c389146cb0c0e40aa2042cc953957dc2cd1a3c78b172d37c839c3268b1240560ca2028a9a2f4c2ca96104554870c0c18b0c54dcf9b18547892a4e7208040550e3304412384ac8704159d90324a985386a9edce0820e29e471ead2044e116b9c9c60e5e40509da03c4923d46b0c1c3831049aab2689132e5cd943d2ce0d08298292e280cc1a70c0c4294f1b2041c1a2f6cb9ba93c3132af2dc9162cc15ac24453821052109a2ace2e83102100d4bec3c290305104c5460a2901c0000daa1891333fc7043109d46831eb0a8a92384151c02ddb983e50a950d43684d9955fec8c044ea0f15415c7400b227062dae30625ef0418819a63081a1d00d83d450d143cd0b280cd252c84f1b3b630476ea58c10288871f7c10926242171a2850a460a18e9d2d40d080a7093d44c00122076581e2091f700044678d07d1c2891b2c535c05d1054e92209e88400452505ca0e80e40b2a2283923454f145498002167073e7ff698e943e7481a2e4ad0407581d367db0148122552cee880670a2a0a081f777e70c1872b774a68f3ea61047874a022850f95fd4109354738b9926213c6078d1c4a7052051a289e18e383d6962e1eace080e40a9f0ba4a801cc1a2d506cfa64bdb1128513564a602551c6043349f460f1c305500e76ce076f0a29496347092b5e7e5459196444971050484cc18240932d490ca2420c201b7e6c4d00e9401329516c4913050629e4dcb062068e1070e068b1b1e1470f422c7992650910535871a4e628c1e70d1933492401e41aa1254f9a3a4d34f1c56d0f42b6207142541329292cf848428a4025cc0067061efcf49a21366ce2f82113c70c0cb3850ee84c61a7cb0c43ac00050f439e50014686334f30a9c2879e4048fc00c40a55bcf0050eb843154dc4f8c12225a7490f63da6831c20a0a9437960a8a0f431471821e263a2b3f74c69099a1ca9e1d02253922051d6840814b9516664013c889a0428508593745c41046100c6b4e789203a4cc1155d21402d3650a2f3ac0d8a2849d412c8871610bd5f2044316159b364ab46101072758b85089e903050a1c252be4d0458d09960d0382e81267890e697af0f2c3c91a3f82d0c08082191c68144f688591218624f2e09903e40a134ff6fc8064892d390052c3870b9541223882eac70b80a892dc50c54bd50a388cf98245cbcf191124e902f269217184931bb268b1e10a8322e6b079f264cb8d161f51459450e8496b054153d644000917b8d2ccd9b3e7ce0f0a5600c24e9c1e8478b262d578e0843e80888052e64f1d1f0e3813a689541518ca98a12b845a604c382206139ad840039a142143a127c0b059429dd0c04cd50c3518f18402950f1ac270818288264db26cb06924d7115dfc747121cf1428a7335855ccc961071bf6e84193c60f9e126a28a14fa142406aa012870a0d48f830a162cf18604d0d3524c9d2c29c273f68dc9902a6cd99398578307381416500b500c49a1bc0f8c8f3c3698998285200c2cf923c56fa4a0bd4551b3c264c8d800a2e13cecc41a38296327d6c19273356528298d2d503143976ae5069814fd50e56b42c19a63c764ae8634505191f477698e233821f96ecd065c7d8c822c41077a874f1f285859f1952981233a544d4f6c30f1ab034f1439504cf9d1b762cc18a228b55550a537cbc680250559799276e5010e3264e1829fc7839b325cc8fd89a2853534831a1cd9b30370a2d6ed858d990c64e04deb890248e134468e962c140c0c99715906811420a8f949baa4150f89026ca1e6b8304a8f0738508395fe6c0e045f8d032c5091263fc6c71a933bb80fc58820c0a35d4d9f342962f5ac63cf1b0c21a255b757e64c00426a25062c21159aab0da9202a50741583f3889f263e4a2439620608072c58b17a727aa29e4acd9720288259c6698e2ce141b84887a628dedd26304666488028d151425ace429b4f507082583f070696a33e50ed6184037f4f9c1c19695142290507206cd96a4a8ad13c6f499a2cb071f47523cb53015a609992c5b039e4154628c10c286207c98539c528062a50d9f13b0743863b5404049951e3e4d9e6c699343befc81e404892f3bac7026cd106eb35cd0b5060c1059c2d0b0c5876f71fa656ea8e8e2421362a202b1a1c2b7640f4de40153f5b4c3133d406c95d3131ffa305104d70b56ae36212678226a08404af8e86141f609428d9c3b5151a0a8e227853c2a10c1248a931228979312aa3c5370bdb0e5294b833a348c9181d09219465084152e7bcaa8d1e3678dc592a1a8e20915549c0064056ad0d31077e444c9c14f12a9278824415cd97235680559e8cc9592262290418a13c69ce9210c943242acc9d1364b382de47e695db6992d4c4b0355972b3d4be450c64a8ed62346047ce658b9d2849a6944e62587257290f0cac1a36ae0ca418200a4a8012207fd291a9173729020dde4a0984b51bf53eea9a40527545630d22cfc119483045a0c5b5410270a513f60d1ca61444ea1872b07095486b6d24a3c2f381194638a9f9c1c2e7626c19ddafde93671471b18dc515e81c083029e64b16c1894fd35a875d26d9a77ddd0f8ca0e9347fe9211e5f270da0b870634d4d0266fef7fc5026c5d19321de970631b0f77ac65cfc09324560d7464db8ff2a7e859bed12c6ff8869e7146df7fdbb60d8f14bf0ccd7d7943047995e50d118ad85c9fc8963d6f737ee7ad070272c543645757a698058ee3c4a128977baf2092ecd8f5d497b9fef6453a6f75f44cc2551374b20c37702aca76c2a359b9cebe9948c29dfd27c3c91d25d74ce4e23979df851c3865af65683f99e7dccf822378df775354dcd1df510ec7a453553e501f09a5547e549f92c9f5311e65b25ba95ccfe3b4fa6ee7b79fafa4d4f2087feda0f0e34e1cc188f81f905f7f842ad5df22b928e47a6b1545d840cc1ea6390d3f8bffa4d8795847dbc7df33a7e1ff2608b683f85bf4c4a7118c38adbe8c17eef7db8f6e0763698740a77ddb7f2cecd0751a935cc5173196d9b3103b53265276acbd5726fba7d166f893bd95bd7d1add6637d9b66d2eeb2b7baf0cc41fad86fb39ec4f32dc51728d30dfdad943de4dd1dd4703413c09c46367f061433f247ab50cfef7df276ac089db19fc51f631c2e583f0afb4b6f3bc877df88effbef07bf89d66556d632b50070ed700909f4aafd7ebf52f4cc2fd2338702d8479e4ff7d3e02f6e18ff20a73e98761398f42ecc13cca4a64317d2f311443a85eaba059f1386bfc1c062bfedc2ab99abdf0d8f9d5c25a5ad18f4bd9b2b0af812bb5d1e3f0a4ee6dec8b6077e85b88721ead780944398f88a4f0eb6bbda084dbf9f5e32c87cf0213e18b61586a8976d8793f7a955b7baf4cf6e1b49d9db848d2272d2dadd748a92c265ea7c9385bad7529d7d720897b1cf5ca936ad3ab2688973e3c2ed53c3cd6bc8a96477975559543fe17725829864b9d8b4b4acab9a4bca5de69be62ccdd7c8bac430f581265855744b9dc5bf1e98e5e953917bfb5f8f1661758666d0b2ce53b97ffc98e8d301609661260e94731874571a5f4bdf7d25dbae7d5b297818747ae467b5991ad73d7f2494fda6a8e7ecb7d34547afd18cb9fd1fd7136f42392d28a1f6de42f83fc7d78e47e5b213a4c0c45ee277d4e9419734e9e3b0edfacfed1f92e0e2161ecdcb27da0dddba1cd8238e610eddafde779d498db3df7f641df823df8a1383ae5f05e5cc443e6fb3b64beef943f11f69e385e207b7f45ef61a253f6442235bfb01fd13540eab45aa1b8dd8f1e15259365f728a7f9138d9a822697e8110d713b1c935a49a5ba15e6a43fbdef6fafe3da58ea3fe706b247d77425a7edaebd886f0ce28426d7a72edb6cb24da6956ea2cc467c3fe7f46f9a0990591baddfd71f96326b8eedec7fb3d60fc4d26916c7ecec0c31b7fe273ff949a9f5a2dfe1f75f7b0ffb1ddec3de29879b08cb135ba06b50ee3fb17b4fb493291e83f820e9b457531aac6c22e26067ad37fbf60dbfe58c85db5b0fbb5d5bfbb57d4917c716148a94d26fa23fa78ccaeedefb3bd554ea3744efed5155a34779149158bbda55eea859e0b9dedba9147b222ef644ff418cc3bdf55ab9ca1c3888e45c0ff7687b0e5dd92eee83f2f6e10c3177fbe9715bd8893f6788b9549499464119ee702a7663101f94e7dbfadf7b6253fdefbf2a8ede831e2edaa07bef7774ef61e9343cd62fd2d97b6efbba754c15834d937cd6939a5e6423ee18c4a92ad39fdc48390e8f41a49d3c5f8a4df367c576b287dc4fa810f2749a7b11df900b967bdb74d28dce6d36413729f1b83d7761d67250b54d4a9aacb9180cdcbb6bbcf5a48ddbbecae72cd78944680fa23fdaaf23ed05d05aab04fb096bb9e7383ccaaf1fa3d25c868fb31cf7dbe3704fb498c3544a79fd846f48caedb73df108e6cddd3d46c473f7ac3f7deb2d0898299eee4bc85a291ec14c93c0918a31799d366b4c56514e2b8edbd7ca49aea5c441c05cf13c615239a94884663ae79cd8029a01e683dda66ea574972e5dba9475932de54bd952ca96f26798913230dcacca38eda56c7987a46c39f4c427fd82317baf3af08233acee0c3030f290eea2595f1a779fd3a7cf9196b53edb0d360ddf27284bdfcae334a995256d466452fa37469b7e4f4ac14b9b522e5fcff8723998f145c6986294b39df7812153f80a776cd96d1efb8f7d8174522b61b02be78cc562b198b7bd4cb11d5cb69286bb5f29e58c1aee18d9bde1bafb0bcb6df5850712b57b4fca244a4a12d93e0422b10dcb68ed8e69b46634b56a36e810239fc9ee1962ae3f8ee96db3b2570a32ed9891ad04125c26990b17769632b021ed30151519196d3060c0a830e8f48621c1d768c46bf1c95cd0240df92e42a64f83fa2ed62eb7c8bb48d29a837b272174f12206337223a396f5c5bd4543e2782798604e30814fd0b66826338ad918f455b4019dd9c808068c092688c5b8ffa2286bb3d9f4ee60c098608225a618e18ece36fcfe6bc0c4c369f2c57087630c0b99624ef311b2f7e7d1b243064d9886d252820605c9e28134eb7697349a50c7422699d364c8983264c890e12d5f1fc07270efe5b133160e1bf9400e3b8fc25c163124f816226e21c347b215250dbca371d8a373110066a20c97d1322a0514c898e1337ac60cb9fd873a628831dac769f265844c33684737007646431a6715cc0a2aa8c02ba8a02b9043af1104b490e9e8280001a8a0021b4c483468582047a77c0406a02b90f3359230c3861b8000843a8eb60a645e2e8d96fe1a9db245a21132596081054d41705ee01774b52064aa218350998bf3ab388484ecedddb2be400003b041801a3566d87025375fa3532eda60667f9ac7ceded808466d8218b5da8bb55a0d17d56a2f6ab51a9dde4847722b408aeadedd534afa0a12cbd4b19b4f89195f261e6fb7cfd872251e29c83467b8c19625b692067d49652dd7bad1cd52902ad3e7406e86196b2d68ab64732ad39f616606183a030c9df1e54a496978c3d86695e5cf2873afec6780b9163683d1661916ee30cad269f70e0d4929a59492564a444444b45517af20db4f11af48f2f99cd35f86b47b8823e5c9a90589e05d6579572010c76a459569906ad55ea674aa75dbb80ff43e2969bea1bde19ceeeeee33884fca1b2da534c097b7e7f0e7e1a9b5d62af308d6bf75abb18a4167b3b9d7ae5db70737dfb6bf314fdaf0b87ddbb96d1b6d4a2f2ccfbf9dc3c6c44e7272939bdc52add8c869dd9c5740dbac55722ff1489b626cfb7944a7b518c49c384a0a802cd7a862ebb4d8fc2b42cd4168b93ec573cd000071db8f1cc771b4e380b5d6da740174e62ddb721c96b567edaedd74d6f02f74526ae7ec3ae70653fa56b7ca5469a594c6e04e48cefb9967485f0e5a5ae96cfa331441f1135dd29034ea775cfd8db3b3865aeb956fe973a2e5ba9bebc6d4ebd30e9ed68ac109e713c19fb2f4fe93a2cc9efd0fbab7cf6123f32df746ac94de739e671b49dca5a974a4fbf9ded7784ca5cee171f9a0fbf947b8b70fe222f9f5a7878ba4fd0feacf9776b2f79ff745df5b205389fbf910e8bac9bdccf1793fbd0bb4aee7799ef733f4807b39bd67f8afef6cbf3fd23df7470281c6a80984c13bb4e23524def0b65488fff5fe17d6ed75d716c360d8c8d8dfa3bbba7253102ce41b07e9c77204c7ebfe8b4bff7dbd1e067b7577e3ae013a17c553eda8ccc521bb669687915cf1388d02197d83604198b563998a4cfda3ec925b1c0702070292052946a2d1cadcf9a3eca2b9db3263c68c41da9aebf0e8ddcdd5b7d636c889e06675c1a7a3a55d966a366cd4963af728351a1252ad7347e24f5b85618b24fbf5f145fef3baf78f84e05ed84b1cbbec1d95c1efc1b1d9234872c5e60cdf7c328a6222ab946a2833da549d1fa36faae96f9f62aaacb65ada7c0bcab77ccbb7b67c6b4269280ee5491c877fd2be97f2538e5a9af3e9eceeeea53cf258ca8d9be8b71d97b2834b1b763b78eed856dbb416d3a6e7c99e27bbe75bde37a73dc97ee53aecc9c0db792d0a0173f77352da793d12c9b47a1d2d75ae644a339d42c04c71d7530d7dc29c53e6f078c1d3edbce9a03f369cce556c24998a1a4cc9c39c933e8d0dc782df95dfc0c9fec6cc9c33b3e812341b4b195011a99b76d259e5e1bd91d24a593f7737991ad4ace4300f8e7be2f1e6cd1b9f4feba45f6ba5df37d6613b9147fe2e582bd91f4bf6ef2692c6976be4a549f6b7de569e0e7bf640098ac5b051104792b9a756b12962b2179b27b955532cecc47db3656565490f43df78527d2b83ca8e846249da96623971c70dcbda7baf40bb657992bde3cd82b612b8b2cdb448cdf5a5e5b619ea902512922339924bae3877b4ff3dec250c8fd65e0a3e8ed93d288e5d9199ebc76c0adf864e0e75d03cd626ecf5c223cd0d1365f8f77bcb819df79fb755599f8432585aca9f67032983cdc973cfd29eb78228367495723f012406069035fcbb7b297b1f3e8b18d10a518622c80478717cb097372260eb6bc330fc9a27751fbe0d79c37ef853e97e18b61628d6e651dbad3bb971db36c58371b6e22d391b71e7963cc68e68b8e3f6dfab7aaf508c195d71b4d9e796ccf5903103135979a35dc57986595221b5dc44bfda5aaed5e616a2915824ca7954f495963b7bd1bdc057240e793f369104ef50ae3cef5bcb95e41b2ba90435ad547025a8f0494dd584e262911d2b8d569e4a33873f91f80015aa880f40218f96278d4d25b5b22c13565076bb0414ef77ccec1579dfe2650ef7701103642df09116dfe25dbcf8232e5e868bbc9739642f73782f645a2da8b97aab85f8a29c33ab6bf445ff493989621288a3f744efa10eef593c0b31482d7ba3d4d29a47ae75a575e55744af721a11762aa7798d1beed8542bdcdca1d7b1e287acd3bc1fc22d65f4fe9e7881a9f4e28bdeef0b8fb2915684632abdc072bac0e157cb1edebee977e275da53ccc2432821b5dc248e4bb97ef49b8577e8c7ae336c68e815fe0c757886d9cefb9738fe0c0f72f582ccf2d6030475b4d491ca5448ede57388eedef3de726fffb3816e67ee476abb18d7d65aeea837bcc4bd5547ff6c8364e5d5a0f0ca5c219b559a3b7a595e96bc61b4595de0add9ac1a172109baa38ca2ab2ce3c9287b5992869755748564d5b5d92c735f414f0ac11f3d69e8c71192ee8f46727b20371e3d7b9b82dceffdb0a5dcff9a91dbdf54f967c3ed794e50f2168a433a7b58c82c8f4e64f2e6a18eed5f864cf763fa682352fef018e6f1de0a32b5529643a21c7e32c9fbf03999d48fd435fcc3f00994480e233b9245c0ac3bafed4b5b67526cdc4864cbe15379956161f8afefee70488c225b86e111476e02c31f41f0e977e2d8e328af8e5cb8fe1f2c0cdd7dc2f0083ecd2fd1fb501c6d64975979fbdb63032325ce55ae3677a2cc5d64cb153bbd9a1a8134a3d1903c772454464652eae200bf8a46806e67faa31155dae6cf0e294f3103f9602cd759375c6ba502d249143714a791d99a525b524ef3a33537d66bc66e2e50ec7dc665a5bb7b924b510aebea7a5db18154b3519d3cf72816b8b1c04d4b650a86f6b39ead59db515b0b6b5fade907824fa53c8b47bad11e8da5751a47ab924f86e04aac3468f207b39e54c473d3fc6d6bb2d66e155baeababab6bc3dbf7c4e086edbcd845db4ee893b3914645a98bab6cf3f6f8fbba0ba06e67cf7b1c4e9b933abaecdf752ec621242fc85c21de556e3acae18edb95bc51cbee5ded80917bf392ed8f43486a35ca8d5b58894fee08a3855586a1a5a396b72b4963dcae44e83cb6b0cafe34aaaea8ec5a366c8c4e55b9e9fba6eeb7aa5cffcb60c58f76e85b29f6df18d821d94a17c0f9f5e17fa168a386848da50b785a9d966cfcf0d83d4cb420e85dd083bd67adb417f42a1ebfefec7f1d1ea51d1b9e14beff52cb0eff1b83efc397ad14865138baeffbbe8f1385483b6ec741f17b1a32d9eedc4f53a9a9ac1d32bbbaf287b10cbd0c8b2030bbba720ce19f477ee3caedbce2873ef6443fca8a18b00202434f8471cca3ba627675e5a69aff345aad46c569bd6468ab4cfb8ad2d7ebfb1c8f9dc3b7ddb5d735a41c3ef81f28d2246ee7d06b53c903afab5df928d8e10e91c34df5e1db98ea8ad3bcb7b8d7618278efdf523dd5fd9c084277673d68b13e8e19fadb59068d32083a083e7525d883a0d554f2e05eafbfeeafc5979e074eeb5e864c1feef0571d5588d4aa4af4ab61e3de124256cfc073c75a761b4b41a41dd954f287892f82f081d3ea8730edb493f3c0697d153a18686a55a96e3c725f6156065efba240b619260ee9fcc242c03c02c9163771df545f0f9b5f9f93b5ca727777e57e138774575757151b80792422372c04ec460e8fa015bd0b907c30f05f8413f67a187ee191935c3914472af55c7b5a79cb6343a9228fce82c5e1538a052a95dd6914ec875ba32a133f40d4e7b8987a6739710473a555eae5168a4f2e5d0b82b6f1c7d9ef3b710802babaaac8dd2c8f14e066b97153a8e37b6fab56ac6598b882e8c7ae5fca1b314c64ed0a7c63c4c8234d1c67f99347dffbe7638cec9ff7768737241a51e2940304437f2404436f42e718c246ec5bf05b0c431cf660a1a58e9610c4451bf477df58c82c377d58d664b175da9d9b0cb49fcd84d0a853e70dc81d04bb8e28c6428216b215405cb890892d44094416626c840eec80f4d50a7c85af5e922be4e2e292325c97eaec3d6c7b6de1066edfe66d019ff2a8e46d15353d0a15c34800008000b314002020100a8705239150349ae49046fb14000e898e407250198963498e032908a48c21841004082100008088682410085491f700f761f90214093768167e13d7818a9dce5728a1d0eea4d33d539e5af3f86fe2ab72ea3ea375bcc69718044e9cb57d12c6d6e9f74e5e5244c01cfdcbeafa4d056ee2042f659d394784a1b9eb1dfcc436901199a54d0bafe1d64c75e3c4d27e61ed97e44933596a8e2f68d7e304435c2c6ccad7c9895eb97c39f1d334ee21e86c89fb21058dc40e21673627c65201fcbc1a804dbb430e914ebd8ee3a057f78b78eda648f4037e988bfb933885e94511b1a1ed9f0e54835767bbfd7a9a8e66eba1f873d9aaa5c001d23eb2be19073e2a9ead1559020c939937f440dee58016153a9cb62e027552f645a2185cd1172ca1e2d6f77e1f5b3525211fee1ca97e10bf96df8494565a65c7e255367bbaec84623cd04c93d97a8d034d3e7267dbd89fb8dd96f1bedbe70334d50c560dce1077ca6291c647eb6c9f676577ed75420dc5efa1e68f51d3e951535add249b0406d2198d62bbda087e933ec7f0a8040f9c3fd62dbfe875e04792dad429505b4b0c66c1b1910f6275f58dbd520e1b34e7f93d0bcd6292b53a63312795a2c1b511deed9a6cdf91667d258fa661d3f75589d3681c0e568f89ac07f20afa2568835c4e0d20deab2eccad939953a08646eff54435c7360fd627de3cbe411fb889ad59e02cdf0841176a847f5b122f6f1b10cc8f800b049dcf5235c78614cc0c96515410fc10eaac550f7b5506d936720a308d018f76ef56a83b8b01f293f723ec5e8b28250c7a7cf4a680fd028136540f934ca25d817b36aaeef023386b5a8c06d1c2848068e6e4462e5294c41123e1f1bb94c92ff0eb208efa8e230dfb2fde398061907f4f9c3dbbdabedaaed0eeff8c2b4ee8b4e5f296a882528587eab9e262573ebb39932564bb0622385a96b7b8727bf9182bc70be69f2b95250e02be993bd26f21d5818d175b8fcc2d4c37b9cde1a9088f9437093766c7a7b0fd65a19410533b8cd637564870767d7fd210d6e67e4ee7042ef2fd27e069f2b0cbe4c35ce2e087c8807811c717fed1907ee3c9f5fdc73fa2368c3a8b7a12c4310abed7c7b5248eb7a3b1aa2a99d6815201ca2a9dc5d0f2d5ffb03fb152ab64469200c32bb292d3ef23603d42d005b0e97c24b6e214f622bee59839d21dd1ba216c33d7112d6eaa1fdf0e250457b89cf6d69825d452f76f90df22f00ebf353e9ba39b83cf4df4dccad8d0b9fb133512f00f306758c6f2e21d627b75ac7b79a484d088643794f9e19e70b796574b81de1d37c63578a2bb1cc5fd3de87a369e6c4b39c9dabce7132398d3f1d95a78b6d4b42abf33c46482971931eb27472d40312d7e182c991e30e79ef29eb5af6b7dc6a7a0588e2694ab3682aaa6f4d6eae1c5fc4901737313cc31e681d7980c6829b7d2068807ac1f759c7c4e06317afe21c83db0ed9b950975671236b4b19b0b279dc57da8a4d802d2de57a64c3f0e896d6a2bde56080a466c917546812097bd82c8e5fee073c010066790a50781d7fa511b503e2c483b91a5b17b084eac487450dc4a98eff57fd8079ac07c9a706dc1c6b85039fce975c632755c4915f66607b9a1cb8de64c937f3b0f920f3b80806aacc63c1affd5384e452a0024cc35fddc5aa6894767aaa192c9ec063466a8083fe8a0b2bd9abe2f8460d33b3b828205337f1bf32f0c14c7fddffb1a85ad0e01a514fcd7f660f1387826a86276dd8e82685ec7705c5414dee0d3ad18d8b0c0dd98cadea144c4810b5285566b156c9896eb5089317bee137fb480896dc325bd2c8438335a087d1d961e8bfd6822bba8ab53b33a70dc2e216346db75d27522c85017d92d55ec21575954f0249a98a9f60bbd347233a74976ae6ad7bb1d5123363e4a292558f4b3f4b0260318d2c1e49006af73dced302fe9443ec8704b6597cdddc8e622bbeed3c17fe7f5a41105e01c5c1caa018ea4c81ab2323ad58e56e50c576559800ee394f56cec5162461d519d9ffbc5304ed942b4aca55d624f98cfe9864ac3598ea8ffea72b9e3e40784dd09f1501c0ef86e17b9c222a3cf2b69805d6966dcbe7eddffdb321e2ff3f6272dfdf99076ee571c60f12f4eba0fc9776ffe1ef94f6ef43ba11755f89a8739f01e04ca7fc1873a5d4340f5ca448821a267f229b9801fe11a1896e4f05684371c31884fdc111768f03f1766f29b2560309f2bc6d03c05535de86e16a035017886f3094c493cc3b39446087cfd13515da6283021d1cf52e4a6d56c283d7b7a34ad90cf42f16aec102403a0bb4329179541a3431de3849cd505eef0ce4fd95d1fc037b5655bee76460d19add5567a050746906efb399c48d86e605db91c4d6b7ad90d3bef8a8af32e0ff9314074c705f9ecfe12e15c3101a63514dd694d4f393fad5e3774b1fe40f7b5c4b8410b2d706448df69448475afc979e7629573c62165f83761e1a28a70820d9a7a250ad91f7e7a6905280d3969a49f32358e5dacc8848073d4bd9cb96431d2d9e6ed9fa492525a17c6782558c8caafce5ea37242e75a56aa98ed3c64442742f269a67c7a233f70393cbce01678cd31cd4e1aa9ce12669a083073025e40d05b0f7f1bf08047d2581f877000cf70e6b51da920ab287f30ff836611bcf651a05ba1c9622c9775371c617347b4e18591fedadb1874e4fca5c0020780d595465767625ea4b3325c5c7066a6b63a802ce0e64dc3cb9692e0f0a380ed1ec76d05f407e074f55fff3b21dddcf3642ba0480feb6542a84a3f0cdef047705fe4ad4ba3c584bfe2afe358baa8bfaccfb3b5ee12c93990e7d17a703dbcdd7ea6f4327e58789aafccc7b866ecb560efff93d1a35398e44c70fdc19f0258f08fa953f34beaa3fd7800ed522a998dc5cad3e38925b24f8c4d5902a32bdf372634b2a0b4e884bd1b501decbd0602c0053243410224790fcfc68477cfd59b4149630bc5ca81544dd2580cf9f61a24a4bd929691acade8f06a59535760a8305238a22a4bbb61a5d8570cb6d1af46608c4c0a00b898aab8f4a0f633b538bb47a6576a99ee7fbc77f898f27b3c80e0aee6ac93e3f2e8335bdfb3cf0142a7c02f19d654d8043bb8718b6e1f6ad926ad8d893af93afb6856a33359dee20a7b65459fb2b6f1e12beb0dc76b437a09a23d0004944e8a00147bb14b3704606477e80a1fb50e80fc416e24a58023ef3ca0347741aee562bb22d268ed6fc01ad1bb61b0af07cc487d551bbf0d069006080e1f47881a379308978b7be4afe51dcdf5874ea15417fcb60a94f15c8ee0144f60041f42c77a34f91819bfa9505ad3f936785d7382a090aeda2154fe2b4197ff4f1384ce0f577d625032ee4c7f48d0016a86ba67af1be268e2e3864c36c7051abee1e225df0684afd3aa09e211a3ca05c7d5a755f4d43a226d80a5705fb565675657ee802ab524d3b7a476caa1f9183e1d0ca90c2722ae673e4d9d809055f21ab01017528e1fefe519a375abe522d25be294043b7ed2c6add163bf29c6261701fceef8f9ad5baa3ff13ce0aea3447422937c04c416ed68db7f6cc7811aa6f8560e070ac44a6fea506c612197db0e4f8f561d498e330665bfa23ec649ba810e494d38a6287e814cf9dcffd1575a440516c78528fd0d5fd28a6de3501db3b2daefac84d0147f1dd0f39166631bc3d177a682f06a35acc9aed7b0da55c72a0dd7700b9c8c1e96b3814a65f284812c3178937f4cbb781f93c4e2b9879ab1e2970be648f063cedb2961d2be34d4ff89d2e5a77049e00417123cde92f0cf26cde02857def5534e69f32cbd4f7428d44982bf2404740172d6bfc1cf997914569a1d9a3040ebe24ff2cac31b38e82be1e704151532ab15e913b0e8e5fa18724237f0b0f5762d7f62af081c2b189c0c073b9197e29448eb0b3d953e04fa456b8a5308369a6a833c3d83a72ef260d457bddae69a25275ed5c3070b01a5547a61f215028ed2981ac97c975e45dff23e8d9091380fa1bdae333949fe1b51dfcd909b6ac8730033646c32f05df8e8dd65a7243c5e689b0e9b7b02e6d206dda03921c6034c2f07d4155b996bfdb8355064738cb41607b69216e76bb4e5727c1af2c97f1b29297d1d104466678c5560c6ad0d523d2042a7450287e8fcabebe6cd10993600a545cd08f2a9ae3376f39113706ffbd4aaf510786415da0211d196f140333da3fe9a767e3ff4f04f6587a67908e6887a6fadc461eb82aded5174db3ea510418cb1876b28fbac36b497365a3723b1483bd9cd670d2c452d37553bb3cd90b5bdbe0a7b6a0d2e89de948829c15a1cb6838f9e0fd5a0517d4102d0b0baafa86aec5903b5fe6f94d68aa28a549cb48debfff13102a57379c90e84bc8b6697ebc81dcc762a9bf343839071900e9be8cc8358ffb6212b315a8f878d0e573064afd99b613ae8e2aa7b2d1e84abb72b92770504529fca68a903d664fc9f09d05b34d78374b1080df9e5d837f3d97c932d50edf759b1d8fdc331a444d4dc00d7e2c122079a604424ef8832a748663f113d5e3a3f10e2365956e11024c04d8efa89ab4709dbff258121b48cce784c3546f664611d62441acc8d287afb0047c7f189260b574ccf7c10c62a3dd564d111083feb094d47bf5433a09ae04dab51471a65846f59a18c590792f6dd7bd23efa20b5e5da47e872752f8770c851e215ce04db9713573d65a2af1335f4acd03e2548c2877c4ce371a1a7d9a1cb306212179c5b8f08a03d88585550d31f1355ebb1a688e6d33207a3b0de5e25224055cf27916aef30fe8b8e4227298e5ea91b90a42b0faef525656a4f9a04cb089678e413151a306d663297b6c72fc811fff594267fb22fd5558c0d53438f29c0ebd8e1e1c87d932deebab111b3fdc6f25d9629f4025dac5df29d3c6b195e0d94508256dc030059d110367ca1ae6fb306f5d17709eda5aacf31a7299ae5749f1baae8b8c26c8f9659d0ffab876ae685759451257ed64300d5c3ceb6519f3d66476d9e606483b0e32d5afe8ec35cbe68084d8c4509abeb7267441555797c7abe464a33b6f0114bd181e292e02d84df8b29c53a74a0baa12ce017c56b529bbd02dec998cca69d72fb69302395c5f56937dc109f0ea83243a2f110e661a9c4ff4890a9f215a8f34095ae8ccf38858b050587fe7aa152d9ccde1df032b0e22df410afe2b8698ccbf77c6f70190117b1e08abb7206667ef6ebc4a9c3d3d3618873ac098085d78cbb530f62645c0233a27d869abd5d51c2f189e5999c7615aa50acbf3d257526e9ddc59c16a4206cafe831e8aedc7abbc194966c9ada9b21b26e6360835e82dfa04f2ce444382fd22a51121c3fa73749a28488ed32229d8cf9c488578a3c63b24a108848c8da66899fb489d334d9ca52e48a5ff2a03837a59a600a21e4919b82e9d42244eb998d21ff952d47042e1817eb56527558f07eae6e6e29bf2afdc4caef9cf20995333f1775c8e544ef0080f640f4cc231b134a3828d0918d782ad714a3c94a388c242980a61a928f5c63a37d61b966fa9ade68b8252b9d15413b61adc35012f620e7cd7f01ea120809a1eac411bfbfeafea6cc95f373bc65bc67e8699906dd61fac5ee6663f6a39a73111326ade8dfea851fd1cee18ae0da7124687ad19a6864bacee40b0f2a407c646838ab4a7e13bcea756ff622e15971989120b0fa58a08cf1e22c3db7f2aa5ef531ad75ead1fb3030600a7ea44de0a986094b20b1d52e26943f9f6b9e3058efde50c6cdf21474025cdb0546a0d461f7438c23f93a81df08dd5a26ef67c73032218e6a62314bb8aa07e68497021ea00d471562ae3403e2a9b6ff14227e0b9f670a4cf5e7c5cef89b1c26c65686afbf97a81142343cdb688f880b748a516d4dfb214a1be9ae189d4b630cfa262d991b2a4b2a88aa5e36a2572711014ee66d0b511ea8f2f7602042fdf6c9244e89c9ea184dbc3ab6409d44af6ef338d65662cb5d5a85789f36f63d0c89708bddf035372dff0fed3c6b4af07815407b940a963005b7bf91e1dd2b94acdde3586407f2f5b37cf25da46fdd0ccb09adc516175cd1a788a7cd1ffe21a4837618cff70062d4ef2a6901c8a1bc0396c32543f4bacb7d840c8c863152573d8c2a81e9ffef116f2c4e7eac2159f6df32dfbec26df446a6423c321ed99e312c216f6734223a6173ba87306810d4b8bc4255cde6b4c9fcf79460fd439082f26243d4650b850504db98b88ecea56b6537b8a9c59eb4045d2587e594505c3ceb7cddf9f0ab2953b7b2123e1ef95f063b17c20c17258df2480b9d45ca9e11effc90328cb6060966a009e821544c6fca709ec799cf4a4fedaf1697ef0133bdb63ca9d2ef66abc1f2ca6f581ce2eb37e26632d0a7c68edef824b95527b87d7dd2513ba9ee7b8d93b0885ffa42620fe3d2888db85c59837b3861ca49c8173b03ba74a6064b5d70dda7b09bb8872ed11e0b9cb089bdece9c35bc5fa409fdcbe09c2bb029d652791b3b70eb45d1d354554f8afee7564f79f582b0084593682385a7cc423ec74a985a1bc9a9bd61be9f40eccc8d906de825288e374b64e79889432fbe4b50792939d9b4bc57114463483d6c983d80549ad38567263bfda8ebb83cfb310278bf762864c5b42c43e172c9f7227a6a07a60656be4a43aec7da5f56876a4d82c81a4e0cc3a3b74abae5f9b265288ab263fba603d3cc8cac23d198f58dd3ed162627c5b402d2e48a61602f23644f2ba62407ff02854008769e876efab4637fb0b5af4a64553b65c21cccafa32256b741e75a1c5045fda71c919299ef25d7c3d48ff5d69b9b76ad658b6e717907b8619bf8bd5bc881e71ea94216161730651fd4c4ffb842ffa18411b80952a2a1115541c372e1968028b94eb6e95b11269c6b03f9fc9df1e5423bde64769a0d45974fc08c373e59529e8ccf4c1c762def1cbd770623ede0e099e963709d563779254230895190a2a2639e00332090d8ab65e3a80d3618d159eb499e6ea0e07d88d13b01d9aca73054ab70975ebef54ef74eca5e918845bbe4be1dcca54d86a3aca2e748eb4c5eb9d5e6d93176f66f188308e41d94832c686604dd02c5e77cd295bb09567f132e486f62496ef2e9e299801a34ddaeaf9f159e800e6fcb707c3532f04c28cc99cdfa95578547ae5923086e8040b2cc103987256583f2b4c33eae8d1a166db842282e9f2f3b6514edb0a520bad9c1d6a9824a091e946d8ae4547b8c4d0f6e1a6eecff43acd47f8053349c396f1e8da336cb9df7e80649499d495729163f92760786816d064cc36bcbec36a3b80aeaed13312166e1a06c52335102cf26b17c114d1b15075da72b7b40cd87edbe62040e4ad16318c999f36584d363456989754aa8db5a09f2c2f0ff98c75f8c9f89789b662f000e00efc554569557fc0a354f0d97c9c1518ea4b51f718d40b177b3e28fc22969246297acbae5e52ec00780ad57343399ed9d30cac5ee9486010c93366e9625c18e5063a6c94ebd5e1e7ff3a8cc7c085f010505f6e1d31c184b26967c0a6ffdbfd634bd7b2301d7a089e26fa4049f0a6571c9174dade29a7e8a515c5ca06e2b96a61c5fc186c7b7218d907db8a37af7162e44808c06af56289c1c6d81ae8b4d7aa26644f0e59647ce709a8ab06b185354b1f477ec4bf6edafff109be2bbd29b3262b52e68cd03440c37a8fb3b89eee9344ed59d88013cac98ed45517ee42f75f911a4467c29285e5d70049efd5c9e831cae33dda29d9cbe508c5e559e16d156589523d3c23bf04aae72db7967541a42b921471fed7b55d6b97febfcf09a024885f771523f7e494e6a0ed677e8b976e92dda987b9f016c44b543e93f5ea9f57770a0f9badad6e2345e6ba89a68a3b14e6ecda5499a60d0c8ad95c92481b552c3a835177e99fc5f32c33174420be706453096333fe4f410148f5cf0f93471612f987240789a3804fdb89e19d072df2ca3e6673909dab79f46837aa2b9ef32d4fb5008f1a9f71738f4bfd0ca01cf11ed2984629c64d2b8400fb48e06c13c3814faf471988b85f5ad0679c35415527d5f9947374b413bd4ef8c1ecf89359e2f8f33a8f070ef06efd284b82423e185fd86cf41d34f2d1353fba6470dd437a129b6286d9fd6770e2ab96e81f17c2afac05d1334253a919b5c017cbce7ae2ff89584bd2d06c3c5ce497090fca027a540148e8ca3ba672c407455ebe69e4f87824b9d64b6b87086bf1dd120d0828d261ba8dfc3159550180c9bc3101dee34f6c4ebdd61647fc9fedcacde1c1d4087488470845fd5f2988407ee119e2e0f2a72d681c91e4671c0367c62bc250e8d756fe3c5d08eb591ac0f2cd0a199d8dbd278d136b18b6b9ec38a34c64a848c9ecfc7a89ab33bb51533d36b1672b5b1cbcdee282bd979b7f854800e94364e3957f6b26626490c9c78086ef827ef70efa71ed00ac779a9e909799d3a8d52e41c8c8151ec311265395dbc01c10f9095ca47b00f4788f9664911b1a0402f02866afc8aadd3f53c63108a6574e840d03e8b779865501b307f941aeec64834382f2256810e6b30ee27e6ab8d31e89420e0447f002fa3c38531e0e4fa3f3c37e4a20046d8d71ac7988fee083360e8369188193ffa2d84b521bb872f942d2052b2437e7fa2bae000b9c52a2b5b3a7d867ef0eb38b15b0afc4391adfbc11885604d12e768c687d3585ea0e82dcf5eb691536d1408250fcd9766b98b1ecef1808b4263d9e4034af70a7ea5197220020c87c7c283bf209572dc768e424b957ae78e3ecfe47b6f21129c0d15e440b3f9938ff9590705a8c5d0ee0a8278f63cd0c6e4650e88eddeeef984358df0d891a882b08cbc5c6fba1556b416d2b7aaa365ed59478bc815d7a3baf244291e2a6222e28fa98a5c7e2ad2c2b9cbced97170384750ae3376c9c2168dce6fe9f169f59da91e2bee3eb3ccc1d9c9a678572bef7461ea48f3ab404d44a3de90217490a7cbf645ef31da0205fd6d81ec11d9b9809bf009280d4a05ba4e6f761109a8396eb0af5e2118e581eecf22bd8d9bd9e828cd5e3cd309458478f6c01760e22176282a140b8de08dacb7f1fee6e15603cd58d64309441f6956ff0ac23b5802701427700d50336f5c26f020ab6028a80c081c7af9f67816162775cdcce6be27e939d452da3d2b08eff76a0e276c54c52d55a3c002ca8e9fa7cc0f8414880d763302b650848ea980296c759d26b72161e7376ed41e24c71be16dbe939781e32276e8a6e6ad4e38605986733bc06fd614bcdae384bcc8560861c2f65cebc746ad0ee289e87d6b097f4929f080dc8c2ec4fd9954c8fe6fd7a3e9715d04539b812629b762f1c6c30e734672671801d2c900e85a7b013bd30df6d47dbed424fd2a5942a12003e60d6d20c34ed5af7d34f6a7ed1488d14edff0e822a0ef48dd6638115cb2d18efe3e19857af7136cd50dca3763c1d5afd6dc283ecee67bf290f7580a64bbbda94afe5a59be9c8f847abb39a50963d2e3b128ac72b9edb90602ea0af22c579cc86b84ebbe19107932d8267b4c41f8c9a38a8ac59525e4ff406e31f55b86f791c0ffdb29817f695970d7d25cf749b190bcc0760479ac4b502aeac97649529bbfdd8d1843715080ed6158433fe94f9fea7e7cd7f50968d32e8eeaede9a42c53c63f55818446c7cc68899dd6e9db53b3c7118c39c493500a758decc3831b6a93ef72ad8cbd1183b79e4478c3349295fcfca42aef5ab4f606196790089325b605d2191b4b819a7641dde6b4ab483025c15f91c5f7436c3036dc30ecde2968f47b905a5f62f7f18115f4c795835510b6caf16eedd8eb672e2264f4bb5c31f15648fe31f8146b811488be9599090083bcd08d4d54b88b34e169cc82c8706078c62b42b166c556a9c6d90c89f316d22ad501fba7f97c7456aa3f7451b83790b2dbcc09bc7054b06aec00f720f96fcc87d61f51a3a65e04315d07471e0df43379412c291caf5aa42e50fc3b71e5e8ebc24cb00a009b29714621293383d54822ee9438186eb8024d56d54195dfe3a3daa81678f4bf9cbd71c523e2cb303c24c25aee6f7626a275ee1897b099ac9e35fd2626efbd493b00c23ff73ec7188acbca8dfbb96809a5ff182abe1e0dfdff91422091acbafaa7c9a164d28c3696741c0d67ea06176e66a35b920a7f001b5f984c8c893a44a22479e8d279bb40eb6e432b30d050425d8494eef3327499824cfee3d204c6ce6603cfc99bbdc2578d79bdc66a38c7f076c77e1bd9dee578077ad433d2a54d49d80784b3bc7293cb1303154a0a90de16b331930d866094ed1c9944cc14ca0d82a7ac9dd4bbab962d8f07c499bc75764a6a5c46f8319c2f5920e60dea7daf427614d5cf330bcfd0e3c235bcfaa537252646675c4f5087e7a722b58f8fbe12c8a8fe97083e83762fdadc9f4d72fb976aa5850f0151fec19e2cb0454ca83cd5cd51be218517478c39364301879aa1f8c811e4d5cddbf1d5ee5af1dafd24dac2fb11465d54c53e4bc524f0cff7e82368d154ff9d6f4a56a25794b5be543a1906732bf3f4b7aec544e1f203fa064ce626768ac71af7cda1da859530021cf81386d5532a871e84caea62dc222d93a39102f0f281018a3b3f8c1918884129d2f2c12ba747a4c98f96502bfa1c65a6d68f9afa61afb2aa7aebc9a2afcc6c5e2e5f563cb22748693044d5390c521a4cf25f7fa48f595e3c7b7a715d73c5a9ff9de56581c9ec3e5988a5680b8adb1b5a0d54c506c0a50c8a282ad3bc3d6f7ce2c11781030650a629ba8f631587f4d4845a0f59e6db227989d0dab4a210311e93e75223df5d2b898cb38b55800953f357a79912fb107b55f08051a38dfbcf52f04b7c4645d3ef76af2e9d06bc45127559354fc40b9b074c1be53bab35dc6f4df4e6b6641aab0f46cfc2cb747df329728c487c5c65027aa8ddc95bf3512059177030b941ffb4b1a211efcbc4de8ec10d04b5ef959fac8204e01c7b39dd559505b7967439e2d5fae2f8b31566809315a1db10b37b7a7e51abbfc524336d0b98330386425a8b8322933d8868e1a1526a50fb56ec67899cc8be0d5a19405d613199437ec3ea70287f592615b4e4b101c12afb4c99801fd3a0cd52f9e96f7d7f278c4b5c66d9c12bf6db33c1b270ccd93b650bf22d010a18b587d4419c28861348ef7ba825a369bd3157dd0e2dad35858cf16a735741f39b4fed40422d7d8add44c09b02d9c32eba184905bfa0ce646c24ce2515d933550b162f332d77a05033c5715934141fdf158f82195510252929ba421625faaa788c797c0fab1247bc732b8edbb2d7cc407629b81a11ba37f4bcbe34ccbf230fd614000b5d4f5203f8f1fedb214417f14b3ff83b5d9201caf8f3ace516b27e5762473b7ae0c1a9beb8c027bf217fa94fb118053ba840ca63950e69f4b1153410f636367f33a7f04bcde80ff075b1999f2c301d325eb4600a566540d4a4a8852a23605cd6a7972cb085cc35be069ec54bdced3b991231e988b23945b40c7d91c0da7f50110d8828a2d07669b3e63dcb256b508534dc1d5fab67fc0010215f820e8924f4e0f9e4ace6e5b75a8f21d6bd9dce41693900fcc0727e672718f5b024e5a136a4151bb272e2aea66010495690858ba9941806c99b8a216ebf1f5c81db9e240e4ca6284c4947fbe839ab0414f7dbdc8ede15b1cb45cc7015d812aac631e8676e4a018319c071f74453e2077c5c67ccd292d612f85254a2b639b5f6507210a335fb289575ecf57b6071b1d3f00d4bc60354be0d1983a8629a440577ad036752f1a53e10e7e6ccad4e6291c0138a59105b92ab8188e056c65b84870cee00e96a7ce005b11999181d7533536ccbce4b42526d9243dc49f1abc9c16b78ad45219e2a070088d3f0d219538dab5d448b2053e123ed29a676a2f5c3b9843e556782764a4c491766b57061e3e0dc05aed42c893582cda50e472463b9b519cf56e6bfb6ee9ffa8febb1a72c28840adea8bd100b902fe89bcc4608d25276eb836438013b2d485a181d2cbd1f6a11a3d46caecb6b6cbc9f59bc01f5931cf27807d6795cb360b72a7b4d50e9fcfe1374b48d2542b9d75da3c23f922412c3cc18993ef464c6a1672296f6e3adc54cbf8dc93d28d9c0873b6c252950d2989c54b2c02ee67b4de7c2a730dabde33a63ffbeba0813585ba65c7fac9346cae59e05c6ccf8b7cbdf3949434cf2d982fcce3c7546d464b2a79eeb3f0a2c76efbe67b7ba50d616aa19eafb1e25285a802f16f8162df1849ce78f8499437f29ebbfaa7d06a74d615d691fe5f0b888c22334715be2dfc8781ad934284c63ab1e472d94ac547bb397e0417c661cc0986cb63861313f8f4aa80bf8403548689aa07bee6c93b2e199d984380e3633b6a2d5d1b5c1a6ebcfecb567ae67c746c3a50d8c357ff7dc03bca9561c34a5aec0a4f16346f0f39beda949d1ff2a418b7b9ad8cc14078d44802c0e6f943c5834a6a981d34c231bc443b6e8a5141a299c576a15a3a9cce5819f2281aa3822c8d222029b7a0689be2212a9e526563df318d316a7deb884f7e6a5775262fa718045533091d087abea6120c13e149290e635b70fb972622bb5993514d7eded16f9ca3c578f6b445d55c5c82ebd2126ad8e525a7ce5e099c77a907089ac79ef9996e44366bb6802c7ac6fb556e2cb4724cefa0b91530fe08f24b6f038905a3e5fc4b4f265557bfbdfa600930f1ca00fbc1307671dc8dfb609f903b480ec969411d47dbc521bd701e421646fe85f8eec16d5893262cc87d3f66b0e61b0eb2884e58a7975934753f055c035e81c9a954f17f1b85e624c65f7130dbf894d7955adb39e35ce08888a71120436a9cfb1a7226c7df5c5f26048dd8d4eb324eb2efbb0dce30cad2da6bac9d28751552d919d3907c2bd47aa98356e938ce8310102a115f3e3ce37095a187afd09af84a332535e4202e64d69c0bee6a9a5577d508b2d1d467754dcbcbdfc6eeae2ae996931a211394afff6b2ec607a40d44ded114cc1f96e1b97c649493d6a7ddc29f4046193332733d0285bab0fd5a5439e170f0ee51730460685e452a147915474e64ef8fa069cd78b58d43f5c22d076a62f23e62ba0fa67c43d2c1f567f2207fcee48ec0a485feedbeeeedbdf0fe3624ef06cb7f148e89e400b48e526b1cb56b49e5c32e26af394c0692b4941d82dafda91de2bd19743c65beecf53d223c9d37a26ac61f03b79f9dc853fca55fc75d8080d1bce884b36c6143291147626973678f3a746f32fa7cfe6537180a842046af96f920acff2876f3b386e99405b5389f140c0429441e0085c771de2deb727f5730c764643beae9b1d7a6256089ec96c1cf2f915d68c9c5d624c6657315050c609497d17240e5b25280f5e85c06feeb25a9d665a5c0d33f69006337c9717fe9e5d875f0b96dac989b5d0a4274a28bbdad37c613b97565562faada5c32ee9cdc55a841d332369eccd096bc856095f537961cf65a998937b5285ca109ff624bcb6c19c700d7a4ef2fd6818f3d9350ac1d402a1d929084ebe6c122546f6358bfdad958bf07ae2dafaf57a4d291b148b6fcf5ffc112a0a86a3681e53a01d44fbd7702c98ebeaa646618bf02a6dd1979a3155962cb152c56970888b296d7f895319c65838afe8a3596b0f13c31f6823242e24ac58dfa65dab72a162c0c3223d6b9261bb35cdab4e5ef8db69fec8af91c44f17e36a98575f39692e18c19d0d2f50c8d53c78e43e27b4f802bdb0638f1fd500323e2c7193a7c939a506327839c8571bccf6b8fa495b68534e524e95d2273e323cdc2c373a7aa563b307b545dde933f109414708f518dc97d74e4585b788bdd925b22105efc44a671306f5babfc6c8d5a806b871f70c37b7e90ea91fd92ffd2dea308be57eeea689a417064e9b332c37b502da8b890e453a3c3abf533c4211cc4c7492c756d42082cb2f051808a7e3299b6b4907648e62bfed19b66c95733af37956be3b7c86238062c51c300b7691c144e45e00c1a20164483f9221191ce06c490da3a3aa329ce8d91293d591f34af02560391d7179d8857e936ebb479b7b80ab635754800a09545e739a20e47857e8d06deeb162fa9e64ad6748e14db8846730a6390af0ef0267e3001c1e8d1995efc85cafb011d37d363bdec1f404cca8d3a1cb9d5ffc7a702a0124ce4f4cd68af25dc31025cfa11d59c789f2a790c5712a9c7335a45d1ef3ac59ba0b2888c6dfedf6106b477b444d02c002658418e12b9883a500e898ba5b12b055e799c5cb07930c60350572e47231b5aed39c757c7ff7696ed7e42790b72663540aeed29a0e44428321b5691bc78c84a25adfa1f724d4625326d36135cbe7a97e4257b9ecf51ad3878060313900506e6b7a4a74e2fe9a0086082c32ce73089a7d15fcffbccadfd7608bfeef0f1a0d36a7bf6d777da13b90027fb6d267794318786b44b2648128d50bc802f40d9c1a20d372cf4169fb3ba0999abce971ff0006487a33d764365f203d7c1f1e16e4bbfdef6de58569237e2cd55369d0c65146057963f060c2b9dc98061550b635462baeec6ee049d8fa131cd3a41c3258750dc1ab90b4f7f98bf6ae3ea435a3bd90faf71caa33980402b1a6e3095160a8da776fa27c8f6751935fcaf65adfdad94b60cd550fdc4c64af2ef64f1458ee2cf843961101768215dd06e5bbf8bc68b5cf67b6b3c4bf315875e9ceb3bfaa327e73bf01801dc1a09e9ee29776d914e558d0167a8a24ac0e82d36dff92689b18b532c2fb7f647adea2eb071eb9cdab9dcf42ee1f8f4f113f2a77692c6ba104ae36508fec7776ee1b5d4e1d978c4113718f302c54b654274595f3a761cb942f616160d3ad4512958062168ef5da7dd2599ecec0f113479d1bdefec2daf72737214933037cca3d2b709727b4d9e82d10a5db066b152340dc367f94f188955976e243cf913792d46823ef43629152be0793446bba58eb29871a6c06710d6eabceec43eed628fdba0dacf2787382711847c1ff0358fbb220eb7af6bba75d88e1c926507a3435623968178867064a7e53e5a43012771d80913e89dcfe28367c294685b9184156f201b143de9f7ae76fdfe061d9cd33cb195535e5ed2a1c9ad7643256b92391cb8d3a9ab26d5d7024b1843917011be53bb0627feee642228b8c3e8b04906da7b5f5d8b040cd570dc9494a8401f10e469ab7914bb08ecd2f6e46c10116021fd2751e74d178c32f141c6d70c8278fd2ef1f97efb464ea219008eae4d9dd40b0d311d2c47e8c2a05ffc503c1fad9661f468ce826c94ecec9d17d9240c80b0582471e1ea020dd54757c025fe32a934b92651411e8d8af5d69c07aaace65b031655e06ff1ba57e7a0f4e58448e67051ebe298091adf1c3bd01da657649c407b6a91f692d05eaa00d5f3cac5b759b75303def943898c18c8dd1877928ab1a90cd9222bdb4310072bb08f27157e05bd19ada79dc41940755ac93af66239442680d275b0378dd8d410243d9d2274d618933ed2f973648850d53ba5d79c584072b62b6c27d382a6d855a0cc5d385ae0cacf387ae7ae682abe3fe49c0e05000853c866b7e716687ed0b0e48fc5d1ecbc1dd3547aa590418317ef079de6e68c03e4d70e4a069f068ad0ff585b31cc38913505519f0dfd4ee16a17e7dbdf0cf01b43cecfa8c883cb34bad37c29bcb4893619474600027822f4ff7d4ffe45039c059850bb7b72add58493a3be0fcb81002c83b28c9cdf9c03a54d9630ab534d443ec1108dd5e3543dad8f86db82837c4b7a5d2db331065468147ecfe8a0c5da88462d5ceaabd78a921f600d7a954e9c263274de8b157264eb5d383933bc1844045e86fc6bdb6ff6113eea6b43e04026546fab68f335ea60191baff11fa89bc7da90c490ce24ee9a4a9164f3a6af0b2705c0b19be6274f1d3e6ecd06fcdebdb09c8cd68e305dd21d89946ee88ac1c8e14a37c27ba9fb3ec03c2fdfef7938f3d2c3832e72adf8855a3ea42a33df4e9941d35eb5131af12bb81311f265eeff13ee02919dd10eb8110249da88f509b9373b77055dc06fccf17e2951126b773f78f3e26f4015ffc76970ff015078c265a56bb06aa775f0c9f0b755dad3d9218b0220b1894dfea970b1d2b828be79acf1263a3afd40e0b5a813b0cba1a8551161740d2161bacbe060023426c830215c5f2e6a8af60553b4d9c20050d7a64178ba7e50bf01dcb569615119ce7476eb44880f97947c92a4c9df9a32281f83398801fcec38413e366b30f28fa18a822845df53fb26bc94b1e737891032eab80be396e28aa3020e955920a346230a828eb998a269c724da8f01f5e8fede998294b79e40b7634cbb50ee8f2c5acca67942096ac1ed9a952282339832df40380b82b209a0365e9029a8d8aa19502eea67c0fe9f68bd49abd989cf68f827d32e97f6f6ca99e53d9727c3285a0aa91bc1e7f6b384afbd761131e88c45ac229c4507f06117f6c9f32f8122d1ac3d413356bb337e0e1e7f07e03acb26666601f7a4fad84acf80a61c94988052d83ea476dabb2aa9ba1c3605389d8a1c8a2a6c94694f6cc90a95d05a066a69e806566490a947666bd408205e75691135dc34fb5224c1ac62152483d9cc73881e3d8288c9c2cbe4549a6eda812926fb14cfca3302b6ef1e6a590bb62b76618aec3f1d464e1cfac3d874b839035cdbcebe295655d6d558b8506d30cc7c42868729524401ebf72e6c076a818f7996ec128bf49292c9ecec836da684355aa391579d52ee0319e25b52263807d29e4d4cb16e9f5a589c4a014128955af57861163531004b7db5f1cadc17023c5e18e2cec35287b338a5374767079124f01c62ae1e8b9c06e1efc8455269d698404292ebe3beee2b3cc4b3411fc15230c42775483118ec079635b511b180ffe2c40b352dbf3bc278ed4b28609960d7ad5b0e9769321a08545705e9dbec0fa1dfccb844beab512da1211a6bf2d1e8c650b2be80d47d3453abc1e27715fa89a94b146bfa0305040ebab0362c24d2dab13089b42913614b90e64126809bcfbe12841231cd99ecba8ded0c1fd530a066828c1e23db058e61d84c104890795116089ae61b325351fa722022076a82a0ee28aa2648c045bfae8ec90558102021c34e5330ef928c024868336bd33652da7f0ebb531a804bf31aca043c6e23e5b8487d2feade901e44f56f5b18e7a641f32e17372bc243e06e2f6d2fd6a2444853ecb6cdb9f5d72b7135219f12e1732580670a9626563c10b8194f49868b92f1256dab3221a251ccd28104c053ffabb4669eba230d687debabf39cd67b79a6b5a69c4706cc513b7d4bbfa6e4a0e1bfb8fb67aa56c2cfa62ba24d565c01097eaa3133cdec3cefa7706d0adb173d0eb9523c2b81d35ebabb6d7b2d71b92fe40c980a249fe26a427e512747da3f59a610d3e9181ab113b9d8e24751ed81b00ae2db8a2156030dda4835468f04ad16f635da57fb3687e9f1e9518e5ed5bcfea78daa1b46889f74d593c49c69b92284c4d09a939f8c88b62f556f457257cfdbde1cd78608d13f9a3cd1c59f5d9b62b41b6bff4fb3230184ac40a84f4901ddb78d3dd378ba6940b39bbbfba7013027dfa126ea0a6d28c124ce7cc268deb82557c38948469e19e4a1fb00cb41c35215e4d8907e0f54588f61bc6f01b208347d84ee1e54f0c77ba0ce2a32c12b25a5ba91f693a05edbd8b2de0e62b38d81fefa1d09ca590981eb2714489b035c05c5a6468e8d036b6410a74882ab75fb71cb337137968c58c396a90a51a8690b661e33d3088bfa4a49b120b2c55ef8c8d2386c0d241230ee250bdcce8446b04049de18e4eb47b3b88f7cda48733d9f19c92b2b0a07a5512a83430d0340a389298ce6ccb07b6d27ac413cc4cf0e412f311241db342896532ada2c9b6bf43c86c75e891b45bdb5bbcf1433382a73a82fd89f91e1824339ac3e7eb39e0dc053bdabd6cc1c56f46cae3bbb9d197feb88e10ace164dafbd736e73a4137069bf34e27e28dfcd9b0507975b7a76339a110f11365393611740eb879990b5823ca52576c70b459548a2ba21debb02f7e781bf70853983db0d8ae3f5f8ca050f61b08c0d335ecf807e09178ee5306d13f7f355bbdab4656aa8edfce0a232b0f1d8507ae27438e79f02d2d532fc318667257409e15101cc3141ee3409ac9795646bb7ca1ab62c30160344260cc9469664ad163aa8f8f0b0b1c3926c6d3a6caf482f9b2f46292ce56558c0d1dc1a7dd012c25e460df25edeb868a9fca193173441328613fca8667a579fa607f4622fa43f1cf5ba489992f3b0788ae01259098b1df06a97c8371079e0578f2c12b3ec1297ef63f6376a844074b3ec5b0520df743a85a8239d82f9a72ed6388a7b869c87f210478f4daca50939e2d463732fbc58d36dac4ba5e371f5c7941a6f925961f56a2b3c3a0c5d3c6d7d7964573435b5d3b15fb5805aac2f508e598ffdb33bc7d09cd8bf291dc52c217c82ea969036a517c723ed8182cea8c902cd7ffb8b3d7611c9ae500224c7e7cba10ceea11aed55e3641493c4598282eb96a0e00c3a4c9c90262b0a6e1b1f02250e04ea34a69bfcb65bdf49aa3fb4f58196f330a099731e30d01d32f62441651b019c0894a2157db531b86e2dc512eb3af1c4d97590e944326c9326722364a60e3ea9fd41724843782e2a861b06b927bd5f81257adfc576cd1b18c3ff05a26b35c85e83028cf92d0c38b30b23ce04e37c666a1cf9d93763b1649bedb8a7e5b1b3235536a19c51ffec5f7fbbe26d080334ee076a68f591664f108800cfde21ed3c76708ebbdb7f8c76300a2c3bb6bd7f3f94f36a1856c5ccd4fdb1d6ade76750a15b5246d2aaa8d5c20f828fa75c49db11c64fa90230909d640211c1d4a028e67b9bc12bb9be765114abcea1999f1348a50eded358df3866ec187d380ce8a395cee20300a12585d40c33126c5a1099414f2948b03557545002d4953144801b04d72f49e8186dd5af27e72b71d85014cb7400a28846f17f4dd7e1b516cc69b450342f8425b49b4b659d89762e637fdcd40352a36159886d28e920dff4bf9c84646afb1213fc7f7c78d7ce5ce9789157ef251d52b66958c90029f165abe30903106652bccfb8a3298a74fd81b567ec120469acbf6226eb0e3874891115302a0d946449cad8de9ec4714c97f23fc493586cd489a9780b7bc3637777ceedb5e83977bd7b32ee83028b4e96063b353f5e7690aa6843edfaa5221cd970b27cdca50cd535bbca7b367a1ab196ebd432804b058f83d4be357fb57f403023ff8d2dc7ca8766166b44bcec418d7a91e5134bf351de6110a43d4abbf0ccd9c59b84dc51532defef252b87c3b9e34c90b85f05ab34233123704aad1c442c40692e67e014fc41ec637813d2556c574a1b6d798af94d84511ce1630f6f680c31e3c37737f15cc1f2959097f169aa63ef04a110cf689b8746c6abce0aaefffaf83378ce6700931108d5c620cca16064cc81480641895e14d054a0076a855430f676affe0815453ed688b83a52744a1fd2e158f964f4cdc12e056a11d2aab52e0e5010a3d60b1924898f08bedd80121d2190494ff61008c44f7630c0a6acab3e1f23ba2eb14315c3b803d6fe02ecd609ab568b5e6bb9a887728dfe85e4a4f44ee32b4f8e74df3ee74f4e740ce41553f1be02c46d401d74603787a4c877ba460705ac98044f0b6bb1e46c9f6ff2c04d285867de31c3a86c0a3e80be12a228a0f5389b2396ae679b0154742f558f6c477505de9f4b4f52153c219942c076b8533b218c882f16c7b0e49c23e1700e6c2a5daea865ccd0b0e051642d49148831c1c2475257f8970db1f55776cfd9dc95cb0d925e327773dfb0ea0fdc61cd3e62304c8b4768814bb08ea63e52ae2d3ef97648dd224f01356b522a0296d8ec075bf7f6504cf2879c2d464af2a893843be09baa746db35982e60cf06dea25d30e6c7f2c2f645609899235e899a6029f87148232aba441fbadc1902beac337e88a659c4ca5c1d841f79221c5d8a2493b42a7c667876faf6bd4d551f2c06275d262db1ac9941c57ddda795932830eb6a58d8c54878bb16d4f35b07908c9944dff3593c310d01aa4261a054474f8ec75f33d504ada1d939bb6ae21c2476fc80c458dd2ea8743b7a72ecdf3a3214b12997431e17ef23096fd1a983e0175189c48f61eb335b104d80635352e5cae800af523c8250d4f846c26e04186c31dc1e052cda859a1c7137c3c3fbdd2ffc261ac526168fe373b1576fa7c0ceb5fe2a820f2d86a55c03671cd8ac9e1ce390c5612bff898e738f40456a850f93e5b9bbe0e9ec33cb0522a186a2468a6a23c4911659563c02ad6a8b59fb9ae618042920aa25a9f14166c02196b5fb8811b144b275b77683b2cf12b9d338a4f1c247f1b12f16496a9804ec182220a5a911e29257fb08894c4a65e12ee00db94f4be780208b64aa20416dd1d37f456651d3ce494a38e3e8e5e7f1e5bfd4874dc8e2705cb26cd20def0c13798013ac94056e604d781b2487a8786e13f1222100fed94a0506eabeea0ce080a484fcf370fb4b0a812db87e836ec0ec00ee36841630f10a81b8fb383d1a7588a5c93318335f9ada3057b66b035e11f36b4ffb3add14227db11e1458eb6b4d17955228c2df836a99c684644354754736a3b4bb2df092b95cc594687e7439ab5260a95f8aceb899c3441a1622a1e9eee609b5fc10a4932471b7ccb1b64c841c2324bb44c2bd802f6a8aacabd012f3fe91d0d32a02ded28c46a14c5a73a2118b828b25db5cbfe38d72d07c0653f33c54ab880ab26747bba3b8d98a02518542f2741785fb1a37327c33d1425054a295a86a4f93fd4c8b76180d0fc63668bfe8c34c52f3e4f232a25d0642be3cf62ad9edc12040fd0ffa904a7dccaccfef349e31ffc1f038383e3ffbe42b2175879907bed15ad76c8f662feb88a663b8894c3adc5cc2bf794e68ebfd0692eb5ee479f877d97cb0dd8f3520381170859a946f7535da5eaef45e286b17cd279bd23ff664f041da320c26100b25fa0eafdcfabdf38830884f29dfc41767f887bbcb4b14ad5a4165f29c06a28b810c650af2887d4c957dc766dab6ebb0890c68ad2686c666f691769d0c1d882baddadb14fa380c7c928f6d34084c3dc865954d1c8d134f40ba82c22160cb60bc37487e31ad9264dd00209844fc017ded4435e231024ef721acefa2353a69774ca5de6d8ba7e602342bf308f9c85ad97324423bae282c42a5f8286aa658a8cc1daf07ff63103cb11186e39c8e3392403b5022955d91e7b37f34bfe0a3f838253433760a13a2f38ac6d2a944d6f6fbd7c6f044dc4aef63a05138745cc712b07db79da40ce669067a9cdfedc47f1f8c09c29d6e5948445b25b0057eea8b01e8a6ad76b2991396fd0fac9c1ca5e904d883b361d0519286ba5f92009684f1c7e8a44fa98229609e02ee450f667a2f76489c25145237171d0f0bdaf78a1738385685f408a403fd37c8af086ddb08e1332490e2c06bb338c6d5516b4e13515cc787058ac70589dccd3cbfbcf57e761563c94f90dc7b8b1986995b8cf9ad07bf2457487dbbb55cc58cf5d72d3581e3277c860a7d27d3e61b1e7a3a5028d68ddbe951d062ccd8f5f57568b3d2f73b1dd903489e96aa7bdca1de6d9049a416bea60743f1fb12b7eb9125e6fdfd871f7e1f2ea85811dc523a8f5c6f50a13f8bea7481bda00734068f67a7375c5160e245600072b051a5b7cafd0e6a6b2462de1b1842bc890cd1f9bc8080ea0f8a6ed25c07b2808e3c71101c2cf57c8c903203c9b5ed03b572674793f61122a9872a250707d12954cbb0966438a7684ac789ba2e99ca4b58521574d90190815ec9f36e1901633b6992e175bd9505b1a98e513924a8e4cf2e5dd1ddbc89d5edc1673840f49e19f4053b440849c3e075c13c3cf608acb3cd3e3fc0efd5e66b274b6e0c55b9da1c998488906a4db2c8a1030e7af75ccaa557fb2de9c2453b43346621960fddfc11acdc5fd85835b8238db37eea2c0d6c7ce95df772e0c1d1a01caa4a26802fe2bbf91647f8830cc069a1d1483ea01e2f6f83540f168ca78bb1836fdc94d96269a0135dc748ea89f3c4a8232b2d498a0025e58d378bd2b8575cd7ca830a9d958d3991b4079a14ad93faaec8828c787a2fefbbdbb16c925e0bf17ac8152302af94bf711c34bf483fd88fe87873e9f5fb09ab25704807566c8ae80b187d8119ca42d02b0a946884534bbca8897b1d54358cdd301ebd1beae3c1a452d334e72086bef051e0433a0c85d6504c3dae0e031a918ee0ac10dffd6dab3f903ab7100cf70f41997c7b9ac03670f0d8c327f6172b7290b43569eff185090d35f926b1893d9b8b294f341e589c4d985af0884fc0782d4c82558d5dc3bfeeaba352f24eee7edda4a1717eccf396857672f154df328819b501c28faf33e342ee4859760fbf16c2c9b298b9f63c7e2b6b335310c38d974072f31a0504d372b9ffc1e672ceffeb49cdbde72eb455cad35383842d5e78190c6064eee1a7b22105b078a0431f64f2d1ae75724b32da7ae762f4c2fb172f86c3a511f85d427847f928c178e06f176dadeb3ec33bf25c3a498065249a70cd060f2e885e9ba1dc27d3ac1af197dad3ab279edbe2b46a39f4297a694cad66db4c6911baaf406ec3b3588dcf2ee2bbe8c2f84eea89b0a659c46a2594bdca58aabea1969e29882bb7c4b2b401de32f5e047b9c9bb0ddeb4e4ebc95b342569ca6790ed0f9a688a5471c46c7513b24a951ef6fe01ca8784d967a01acea5f79d4f2d56035cba70ba2656fe3c75cea1132569f3ccb04bac0e7ef48c195c6002914da7efe3a65db98b9b1941d9253b3263f234eb199d77415d2fc44f5007009b781fa1058cb882fa8294f423cab658a805b459023eae196acd49dcab43c1d96d68e45f224499ddc1daa2cb303eeb786da4cc6e804d0c1aa8aadd11da881b41da00fe9f750c2dc2a8c96c072394459d9afb9fe2db5b09cd1594ad6ae008abf13fd662927642be29771aa801c82ef654d62c00afbbd5de967e6ca9ee419c825a461270e5807a4c12b31b80af5bc9d7d4b9412c108c6a6fa18286d8ddbdf6b8a91c1fa662c8f5387452bade18b4bcd162915c295f8c0bba6af163066d9384bfa8c65025165d5cef60f51f5f7730e90f1a46407da5ea39fcf78ff67b6bc8386716445a69a15c7608070c7187f57e945622e636cecf6a4d1916f0eac7aed16e7caa1e6a98f08e90ad7bb4776a2ed25d1593f566a2190fc2658262a0b815453d7649aa7d8b34a0c884ed693bddd946148173ebcd66be6442671adbd456c2c1b68bbb0ee3d5d620be5d38ab3d2fac6928a930275ed1b60314d0420a526711bcb3848a846ca4d744bcbe7bad3dc5ae1a7df4539779058905e3158c3ac6906f4f62599b979932741851b1c68f387e096e541f99a8bf18aef7a85683cfc7b83acf5a798a2daa4b0c400e579c2bbcf569ac453f8ecca0ffc88c7c8bd3a723e4e98fc25fb8d7a5fe10be4c1224dede725d44ec13c993fa96b34a9605f6cbecc5653dc8143f7d3fcc03c1a83242ca71ccce5de83e463a7c51a2280402bf410a92389b0ec48332ab244ea38656648a6b1bd43424e1b820150299574166b8ae53ea58212362105d8e1528047909d4d9680d011048d0251040e759b87d7d5ec2f073afe2fc82037cadec538bd50efc127597d3f3ac43dfeade0256630c7bd612382eeb702306acff4ffa25cbb072062113414c2f4c9ef5626fb7068af1032d02afd007d1ee01d59d6fe1c4a7f4022ab466f5b84d172b30f94b3ff47ff2669efe5583573c1ab59afbfc1000d94337b9163e5d5908c8b14b943aaf7d8c505dfafdc1b93152f6059c012ecec83837b47bea694870f8ffad767f8ee3989222378be82f0218f3876bbe0ae836fe2cc4091dee109391acfaea46a61c05d96535935e5bc35beca27a5788a5f588b522ec952d4e072293273fe171e1d9150a5a8ea8ed5aa4504f08a75f265d90c8812d5b721ae9aa7a597902b496909ab3c9dc3cd27db55adc269717cab23e2bc610bba8011b59ca3ed8a99c94117dc8dbecd3d28953eee33a5efc06bbd419ccd53fe90d0ee09ab0051e7beae39096815dbc45d72c4fd216a2928b0a49158c461ce47278da81e011571d85db24fc25f155b45b384318982913ddcccd0218c39d54a1eef171183b50fb0c477962e72a0adeaeed186f4530fdb2fe22160db0079d802b4d835111463ac3957ff16a8943985876fe036058661227a9fad69440e5f11fd47bff44dc80a7f132201adee560bf923fb86f13736d144f3d2d3dd5e9915520a0dfd453da2c51ff0d13132624f03a743526554bd0bdedd48258f29d904a262b66275141a0ff03ca3c5674dd90477a5b291796e953e9448815b7b40f122b3323932db73e908b2ff0ef2679655b85fc43e5cd69c0551b8ae29f851a8450e86fa42b7ec4ec9783cc91f850d15cf18d5b5421899d12699dfa7be6156adf6b1769738ac3b6a8bd6b4f7100a6ec9280462290b48472cba3e6189136d7d62afc15e92f5a9ffdea41578f7724e80eb891863a4a45cb1a37b53aeb518c6017cda9b546bc585dad01d34dd0b931d90bfecdbf5001dd276ae1afbe6d1bf519e1195f28088e25c7d37dcbfef778050154ee2cd3c5d828e9803fc4d6bc0e7fae79231141796f43b25c86e0b027cec4952844faf0b009d77428c34bc40c683c443428421bff4fb0a349293e4b8375c418ec42daa850ff11e3c5b8fab05583c9edd53dfa2a7087651bfcf675f4a2dfc422b23870fba6c694509f3d6baef5b7e7d2ee1f18fb2417494da50fb34e5ce329e340b391588004488259ea5ae6f89c07b9279d281348ff8c4ca112c608165043aa1e18f0a7b932be77668f7ebb922634f242950221845a90e1d5f690046887b717b62ea43f5d1008052917888007e68739f4ab47e2671e2003e7d90f1587d7987a6f9c064475044fafbae7965119e7131767bc59988b709052b0f62fd4ad4ff76a7b5c2e1041b789afb9c116f7033cb36f9257ced4ce4e2181f9ac48eadaa694b5a5f6e8c2e3a05a7370bfc644a65d4c49138cd8c9492b0c0a067d516c79773410faa7354bc15d24acf1a18f4e59f07730ced5bfa8b1f58715e29fdac20b341af796a5f64d08ed527ccb640084af3e397d49011448cff960dd5be91910c12dee1f6493607827a69dbcc206d4c9d9297e633b813c6ba032349e99d84948b32fec41ccf20be0d5c0be56c7bdff859c252803027f4f18db81c52b60a0f1693fbe9e23efcf0dbdddcefb8cc405ce7b2880695e905302f726d8e91e94b711e2eddefad0605a9f146620e46a20d52285161f307829c5390146f04bd3572228b33a01b9f2b3879176eed2d9c58d5c470704e8e4864a3b08fc7a8f60e1348414140549123c3133e3467df0d558bcf5a5b884b16ee71e6f693bf60425e726d4819764deff9b628a63d05b0341e7fbc22a64d82ee98db6ecbd085302a8b1d63443a2c290246938eea2cd54dae5f219eb614901043f7db806e87eaf26c102e0c3d90ef73ab192edeef6b14dd0705bff5fa8ddc577321f816450c9a07aac3b2675b81af878e640bd4968817e8f82b25d8486c671feceeaced885322550de0dfa801fcc727cceac73d296dec602ddfab1ac15ff5a75687408fe710286e88ed27f82ebc90bb9fc0fd2b0b3e992f11b1a6665e4d05497a6e539e25b3ab670ac5ec317b0e2da203124120f960c434ffa87321fff19a2d24e76ea75a5ed2e4de819f450d5d3a481897be35d492b1f0549b55128a237814a29cf3c851c0630562d111e424b65f6a6982825665d147a91ce45531aa11e49b77c3a0c579b27da9fc7ff0ddd9620cbef56028eed380e5250a1864f89bbb07376590a2e0bd9e6453ce00b6d42b7ac2e66e115bafbb5cfbb0511374aa1a9a127ff23039ed60d89195cb05eaa44695e19de40378f97d5383bb9920cac9b1ce0f181ce5ef5d49d14024aeb8c56c54db593f3ba0b86751b56dab1784d83eea7bc660a2f0c939f6bd4733b1bb86b8c7f3cc836437e5424f01cd370416255c88cb2ed46f5de8f44747e04d94f2a077be2a321d0388d1a7da44c957f45d35862de7c48f1569e8358ff313b0b42b27fd7f62a9cd09d92603cc924f740c58518fb3f4f9aefc8ee1bd83019ebd4d46429dae9474b528c2c94aecd8943ada6fe5342a98eeab23a0d459c0a47c3181b905be8973a445c77c2b386028a42131d2002b2457999278ec182482a52b72b4e9658a31e7b82274872f4c238afa2a4c66c6528389c0077878dc396e10c9c5e61c835dbd7e739c0090e5c9274bff7d7f5260fe27c53b3986552d64868bfd96a5af039c5378186d0d4ae86553101225b9c38e630d53ba30ac6b5215d5ef8e459a0b53723c3cedc8d290719f4b1ae10b7c8b9dac72472cb1b129702a0d1418e31cb103241177e11438ab9e6d061078db1abcc045f4cd51c0d1040ad3533fb7899edf6ae20afc160e8254188221c937b6166ed94f1e796f3620801e6bde8abac57516efaaa0495c4440bfcc81b05e4040e5158ea95bcbeb90dacca9b4c9b2ca7899fb40d67f09750acb8b39c7ae2ecc0daa3a78e89fac4fff9d779ee538a3a6f03da04193153e904a41e838c03cd60299d3d9a297fe1baa03dccc4ea5d6c3a9f6c395be653056623183ede22e3755a1c3a706c9966e3b3ea596246c6c3fd4f35f0f343a2480697aa3f6f0b79ae605370754ae28a850dccb359c36970cea0d8ef2fccff5d29986c6f8095fc68d055c3e8fcc517a4d6c0a46962e8b0a9d47525ea951e4b10a4ad7d269a5b22c0af7fc037a1d968448b71c5b77671e32872317606618f380b3a7a3f8c2cfb3ee7848e354a09750adee11a23703c138567fce766a74879a716cc520302532c4e60882d04a02bc3336c03868c97dcccf6a9c915859894b6b5083b8d1465625b074a92d27a89c8c9a5e4cc0d4fdfd23f8c6a6b2be8fc08c6148711db919d7bd0d20294214f4f93f826e7f06bf5ec209ba134afa25e0a8fc5067bba35f31b3e31057a2dabf0c47d43b1157d6a13339d40059df9bbfba48c61be010674183918d6433f7a7389cef21984aef684a90724791b0c4d9a4f0d428fc3a753920971adc5188885113c689388be4d315fc4c55182407cecd3446264a5499efc17e542e18526091cc9e792497f932cb8f6f664ee3bf81ae2b0c6d44d58201d0d099db14ee2506207fe0c4900dce8a01323b29877cf862e92b408cbc1b3d91430fd28470c26c70e59309c1e9f90d5ce5aba7c061db49b208440e6a02b7b1edb523d573cf6175c039b85964db9ea2e0eebd74bbd9089c9d926a5b1538c31fb998c4ef318147d4b7c4ef482bfa97c1e46c5bd7e4a41d866719a7e10ddfd0defe6f14bbfa62cc69e0f001e008e952cb00aaef3a87f3ab2526a135dad3e8b583b606c800e4ee6b63c5e0c1e616cbf834a86331259dab09a589d23c7438f4762e4b2d2045d087443cfa8a84038a9afbd80550f2fcce72a8d446a4e77101854284ba997411675440c623daa1ce27e9f04fda0eaf0fcd28c724685bf7cda67ad8ededa7fb3ae6c5d610a1e7cd488f8d06f06786d2d5dbd44a48f95b75f9d8472035f0d94b00f5f2674720eaf1719f406ae0638f80eae1ef0e81d4e1d3be02938169ee0bc01f411d3b4d3e950388b97f3c40c23902f057b880659d4c625481d5cb07928cc7e3d1ac713b608f404046e405e805b5bbc0f5f0b18fc024c36681a30376083432d50c71318755bd2521678cf60f4d04c21bf4a90c78e4772c2bf469b4e7965f3b2278e3a5f1f2729ba5d6124e69ecd94b512bfd8428463774d4e21b8e19002283ce5db0e79abce1ba8c07204e4a3c8f04092f759f89897e2bdf8622d95ea993137d0c0fbae868761edcc4d546ab7b48b32104da4a50db0c6b5bbc7107a1b616d256c30065bca850d8b608b16de93507c2ee1e82a180d38fee36606cf68b93ea0ffee6cb542ab0de5d5608363bcbc6857ec7ac09a40ed2db34b1b4752cd33afa1535e80862266afdf26a2da00096f3fc2099d2bb570e80b3e79e05f7d9970c1836d8526a18b42ee62744dc9fa6f3af91c8400f156018302f669d851cc1ff5f6adae0178a2d60882c4fe1989e2052a640df69820ef6cf9c7be0f8eef67409d9f31c8e262b4defa187394ee99095681594e95b04e823d208f85cbe3d6ca5e887a3e14a4cb7ad7ca4a70a5c972e6e0f8bf7630a76c41fca7c7bd0f57a8fe8d08016b16a06538229bb8fd7b4d33911761e2a1624454297d5cf2b8f6ab617f06c12b98f67b8a045f338a9f419b08b0045a52ff426b2c4edf32a2359397d5e1a99e53b48f84272132d93ff30785c457a850a480b6bd0d32fc3cb085746533f27d9b2c49d8689a6e624ed7b7d115f3dfbb444da13ebad3770024d1e0816d2bd0d3d0b18b76676b940bd95a8e3aec1c8f752c59b53efc317cc41394e0ebbb3126d5ecadacb4eb6e308841669485d988ec8c5a357ad8eaaff722a0e5af468b911568f0dc982f0540b34464778472998a09c12a80b4318261a445f66e0ea23a16dceac3fac37efed2919f91aae0d5f07f664085f5f635a875e115140daa1a6191c7c8b35eb88ced2cc3e717d1865831dc93b3fe796d55686cc2cd1ade82f8281269cbc0d1254146fe2e14160de452d7c155de910a1c9d96026fe0060ef3b4dba77520ab59b0422eabfc3ed1fe740647e87e6e0417321c303fb1886d664a4405d1c260ff29255b26824a51003610d68e00ea96670982aa22e00ffc45b76f39d390f2a800802c21caa1b36c52202bed826b3e23c7be8c8ff042557140fb73d82a6bedf06f54531c08a38e804e88e45cf01237a45c3f10ae991318880ea458fc2cccae5fc669b0f3c3dfed5e79c8878a14efffce582afb2c488828db70c3c2729930a11e5f93b0e4d459b7f7bb07cf16cb93830e0df89776b803973253597ea3058f2a56443bfbb15dcd50807004acd4a1579a372e459f91efde0c4d1b482bed8f29874aab0289ff84590a295851c2a18adc25e3e0743d2b6ae59f640313f4b9e59f618fc59e30f50cf8f00dc20ecbf04a0eb929c1f88cd82005e440bd43d058174c501f100c9261b294016dc51c78b14fefd421663559b772b10db32762866b9a0143eec5e055197299e22310cb45269f68c360b22b368d2733ed1a173b4f17e8fd02d7b15565462219f90a4dba08a399631fb60bb60af58415122877ed199e8511803095f79f3a8433d33b917d2e981628530ef90e96ca2e0c893a6a07776a7a163bb6e652e8c6a42cdce43cdbb5c70b813b9891e8ae315c35d2895388af0fdfb222a3c6359eaa513faa2aac7d5b29f356bcef85288d5181db0a79addd81ba8f96da9d6af59f8c5b33fa2d9f3232f72ac7084f27b09919ddab3332cecfdebd5d662deb4a03d8aa8f4a60073b453365b597516d3bdc10319516bf27d32db215aa3024fa403e1169035fc447372ec1b57ba4687c096ea7954675c95d404d840802f371f2476f02f408373ed6374087c3b047afa36945930d81da5034547c684f9f8c9a995816ad70acc8e3535e10ce19418ca874817958fe5439a81c23941b0bac81edc3c41004378ace987a3c882ab29d84854f50f7cc10e8b21ff926be2d0e1ac91922f09d97bef2da59452a62403fd08bf083e0942f5796b4aa9a3a0aa619cdb6730817dcdd5e8cd04d819655f69b1cc50d3d12e999999995f9741e95146869e9a42faa6b3724ee965c846ce912adec78f240f1d48dfd087453f4c810ffd0253425884a4e8a19f8a8038f2b0050fbd7828a5941a0ff8c5cb47242525451c78c1b3c3238c686490007ba82c16d2c4e7b86eeef9a1f3cc7ec824b0d1a2b25818c58a3be83f41df057d0ff4ea19a53473be42acf4c1db0149cb298d157b7c0456282dac3adca8d77e53de6a7bcb4ba51b9d7fa9f4b260532517fa1296b85aad56ab8db48aee249fed872d4f94565e481fc373e1421763b55aad562bba4455926535bc86892712a9e42698cd0af952c6c5904c8b9d56cb2bd25243ddf1e18668f169e88e4269d1526bd09a36611b9dbfe590643592935657b029920b3d09d28cce6975e0e54f372c10ce3aebac33e6a1d74a9da7c79f37355de8833407fd358cbcf6f4702410840b8daec651103e98670326de23730a4a62d45149b132bb1d9df3b2badb7f6e44a2bcb656081f8e4fabda6b68553bcde9bdac7b44a8ee11559de65452a4172cb33cbe1b514bac75fa841b65e9cc506af17072ec484426554a58aeb93e410821bc9913327b5914831e8439e3789f37309438a27b6064b6566be7ed9c571e04e204b1aabd7dca66261be01a4a58e6a199042a44577490e5dd892327b07cd7400c8b9d11e958dd2c17fa09bd6640e817407d66272fba8c7998a3841a4f046abe3ce88dff3e6b9cb8c3be447dbfdcdab28ef17616152c3f8c31529e71a2feda7ae20dd067dde253598e6d96cf5bce7e693d4a5f2bd37917106fb4f103597c744c76b7a7a6437f0b98b72b111f7d0742df5070f9f7ef79a45e7331361120eaefd91499de1eb505f4023aa122f1dfb349554fd50b7fe8d71f7a43aa07f7313e1b762ec22e30ea554afa66f49fd24ba93d3365962d2bb367feac140f6f920252faf285741f54617e6d9957f80566bc617c7fb8b32d7ee5c16e6caeb7023cb1506a8c6dffca50d5d210a5946e693c11be94f5651871ea34d478a263de96f3d6454a2fcd2d8f9dcd1a1fe348f1805fbe5c995f9bb6fdd02f5fbe78817fb9757fe0e49fdad64f3dbb71ab0580627fe0972f3236fbe53af0a20ec4d5ba66166bd77f718dcbd975e0253de82394fd71da59840f1b45d8b071d448a03c196ffc2ae34d1173bca91fd11f144c856e7fdb11b69b237c45df7dab15b1ba65d552146c97653f4f9cbddb3ec51827f4d9ed32468ed10a4692e82c573a4b67814882f09d9a29b7131664c53fefad834fbebdd403eb039f30a31e73845d7c1ff8e4dfadcd3d8ecd59645d2041940489d8d11f12578c20e20829da0f47645220a1354142fb0012d916249080c40db6c876a05119ca62a0313982e3e4c1326a57c8a6d09ac8a2683e1cf194f090d0c11e4fb1ef0a9196a75e136f268f866d7d60a3f74ca7de4d7fb0a3b76ba75edf6aa75e2f4fe7d9dd2abf60422fc617e1f50163eeee6e5ec1ca0111a8077befbd07018c1b729378a8ba75701f9f0d8c35efd6486e12741db0b3c4a07fcfa66f4a47fd1795603f9a7b523e8a153cfd5bbc0ebb9d4fcd476fc8fdded6cecc5770ef31f30f00706e61f3f8298f2f6bcc3d799cd1d237345ca4bc1d1ec9fa0675234386c77077bfde420bbe05c06bdcdbb91258196f2dcdc978c959c64f2edc4ee85d70669f310306ef0c1083773370dea954de6d3278274300dec1bcf4ce7ae91dff0ca7719b8d9f8a9dc6f69e4a00db7b2a1936d5c6ce6dec31ccf0ec3018e01900ae035dd85298c6430380ebf3a0f85467291de9c0874fdd2c5e66e83b3954b3ad9a93f117361bcdc9f8dd5e0bdb824be7165af0a7f1b470659c06d59c8c6301d890c0e041f80e0c170afb0ce9db866d3436796b666c9dfd19b505efb294bb70bb191ec3e5d6d997a9540b72866fee33626c1728bebbbb8ceb340d8d4be9820b00f016dc85db4947f98c198e518da785ac851900d85e73333ce53a906693e11a0f2a757db297e1dbc523e3d6e6645ca7515bfc185b7c1927aa452fd3462fb3e4655cc6498df2327208e2e43c958c6fc931c1c8b8354215591997b1642c4bc62d193faa32323e232323e358142743d99297f14c46e6c9c8b8e63297fd24a19bb64e1a75b2e8dbedd675cd25a7a57373a95a8f3e7a0244ac475e689b04a753830da7676424436626064a062ac68c4cd12926276b0213292875ec226dc75f2bdd24fcda32a3dbfbf9b219f615f57a171191471f8016db5d445c89a8544964f99cd5512d90439767ded5e85209c4215de9644a4b27d809c7e475757a5ad0474679c844ff5e805ab087634f1e5fbb9dd06b4ea36f601c2563462ae6c6e4a692474f6d59abaccf38bd7519d651d63ae969799277f1491e838467cf8640a97876ec49412f67b76c9ebd3e95939c743be9321ee3c667c3aed327d781339bc9652779624ed7e7697993f5a8f5b0b868328337c5986e6dce3a8de6acbdd24b1bc9bb9ca78e6d1df7d4afad433dedfcc84c4b1f38dbd367cf167b5c37d796b3bf9bd7c23a0f6b3e843ee3d2f69ae3b62eabb177e3c2489abdb28ddf92f835ec2a61d7bb61bd1b98979ce45956d27cdc7f6c7bcfe67a36efd9c4674d07f509afcf496a3d0a90022b4d88b34ab527c8d90e2bb71f1a1c6763390dfca97936b239f8ae3871f472fbc1696ba3d9fcd9407fda47a6415198e9964ba7cede4deaf2889746fcd3a22ce225933a37b982972af8a7d149c47220f83cd6fda1df63b9757ba4d78faed3ed95d61def7fe84f2f027fde4ede1f5a047e6c82bbbbb9f987e415c25ed9c8e91bcde496c7daadbe544f3233ceb72b79e631b6994d663b6db0e424d78176d3bc94ad5e8b9a966382d9607da059faf2e54ba963153472cfbda4f9abe6af9babb3d985ddae66a3691553bfdcb228cd5e0b8b39f5ebc23094f4d82e7db86fce1a36e98e35c3312f1bb90650fc8e09f8f2e50b13ee1bd8d95f379e7db4a21579607703e1fc9039c63527395b1ebd6e1206c6544dd5544d25af1acc46728d47bb40f249ce91f86324bbccf9aef107ecd5607276cd01a9b4deb368d8c0b8c9352f79392eec866a95086c6cee543fb38f68c8b32ce368798c7d332fd9cd39abdff74fb0d3dfd3f8f159a33df8cb972ff302750ff8e5cb972fcfcd0ea37840c910d40794f8a08682704218713f561e88e2b3d279444740530315d83c40e4b3054521b6349010ffc011200cd8e0890fedc5c4352cd73082651c3c836bc0d40f8de21a46404d417483005abdb6016660a3773927ea1dd7a0d2a4fa93b789e53911858238f54604548fb709757a1f070c30039885d481935ccc497eeec06e6daed6e99c246b6d3a8661da8dccbb6a7186553ae5914a2754c2b5e5638c2d5cbe9f8d31468731cbf30a0b35834a1a4b63e9eeee2eea1b2b7d63d438995fde58fa86faf5ae6b4b27ad601b79c09f91a8b9588ae2e3163f8629f6cae2d27271d11797e6daa378e99db4a232517d5d52dba5588e617435e54227ad74cb4adbed12ab3f2efa65593ca365bd28aabb3fce728b5df459425cfe001e0d65590362f4ccfee8f272abe918391eead2de84cd9aeb25b161107238dc5e15ba44ef72ecd0379d8def14bc3afa618ec611400d7d0324160db5f0ed43da7da08c3672a2ef881f69340e8d74d286044af4207c8794016dfca48da6699036648cb78b3c7c65fa1a6f426a0f0f63760305b8c6c62e3709708de850e341011e846035cbfcd4374dac6b1ead6b9dd2d19f3966a9d7e68624ea762bd5a8dd505f3a16372112dbf8ad90846a18f6f8415275afe16ce4b48a63246daf6d5c1bcd71ffe56273bc0d2c7b737d03c4cf239dfdf22262d0217307d498e6c5c60f352d73ebaa1702750f186f84551ae53b7c04fad804f38e878f414de2ed284a0a281ace628c357fa1681090c45fdfd44600e6966571adea586fcd127bb2343621e396f117efe596e672905e6fb7c390197e805b8a077773c617f6f2a7a530a9c925720bf64586a5bebc7609167b798729b15867bf3b3b041fbb9d4d812cfacbda28133e2c318f9befc656885392291eb083ce4fbe5cb26428c9f717167a433b0455ed244a0a1ed796c9b74f991faf5df26cb058e81da6a4d6c01955b04c842921cadaaaa9234427666666ceb6e474998590e89fc6d3a1ee95d2fde5a539723e2ca58ed41d9a6b471dc9257c80e46bfe5d99228c6fe9c3bf16f6c15ee2d9408f81c2769d648987de496a65e9bdc9e0a1d3d9f27d213ae2e8231791514983514925cbcca45aabf5c62eeb9636d24629bd8f560a19661a51b6590821845c7b4a1a548f1cb7ea1bcbe2da391addd9b081f1f06ef40ff169ae25d09c909ad5e785394873ed4127eb9de5c17a598a9e9de32cab524a8f2ff49c03e55637941335a09afbc1421bd8cec6f79c2ef472c3a4dc80faad4b00ae31bd4a1b7d13bde1edb8671d44efba28bc3c879f1ccfa6739aeb326d6ace1e69645b0e3f369e4daf9e8d2635b9a53429a5a65dce51c6dbfd50abfa8bdcc52cc777e63a9dc373e817ec2e07e8977643fc1ff831db72b04723879ff76cbad55f573a7bc749785d324a282fbeaa3b945e044222115e69dd538c1003414683136cc77134563672fab2e617970eabee4e2f662754664fb5ae5eeab0fa1e78aa1008588cb7db210ef9c8458c11c63829d163357314c42979ada7a7b29cb4595ae6f3b45ab5af9642440b63a42fce5a835ea4300b139bd745ba48f572d29d53d2984d76926b7cb9d571ab9945d1780d95934e3a9fe4d3147c3adcb28661587ee622f6895407b2ffb846e75c699a9b7ef96535e328629f083b907dc6c1d6b906ece7bb6ac2428ff4665a5e673f70e2e8b108618c50b0fcb3a5e487e506fa03aa007b8e392677488d873a73c7eeb37a1d56dfc377c673617d564fbdf359753e2b4d87e5d5a7c643a3ebd093f90aae36193016e6312698cdedc6d7f61e3b7a391ddbaa55371d56f7915a7680e8eb4b4b6ba55ffc98ab269675638c3027ae886a0d1b581f70562259524622c1c06cf10ab17ac966505e1ba5902b8c85c9604830303a6d49b262985f8eb1b5d67748b72ef45989b475414ff24cf3a791849e4400ae8179b675f1a95f9be575eb3ca32d68a287b05a3c58165d3d8107585f16dab59487ee99a50ea471503fe66c2972c651eddb519a838e4a8165ef38890e6c1fb0d2ab610e8a5dd0f700f5cf1ba2cfdb6540e83d6a3c56fc193b20cafe9e2d8c728a87e51763f4b230aaf1483adff4d9d5140fa7737af5e9357ae481291e74def9d99cb2aaf9abdaa08fb7bbba60714ac09a2ebc352deeb3cca2b62a6994452de7e8c2d72b73102950432f62d574489f5a4d73d375203bb3ad692e42d85c3efa23428d291f6c67b35aad45a12037e31776d5c51a57cf393f3a6badb5f04a1963ca879a835ac2dba21f2bbd2eed3eafcb84475d6d2d93b7c4eaedf2c7852f5fbc3cec8480f8db75785dbe87bd99c05e0dd6d1896dd4314d5a3e2d9fcd1abcbaad63886d9977d4b11ff83d1cd92fbf2a46338a39bd1d86f9d3608feb7b4ccba7c7ad56fab3359ecac3833a9d92533d64cf7b8c66ac65f4098fdba9037a085752c86c0c29b0d43b145bb57a76c5eb29b02ba82443c9c076281d1416a7ead9d78ac262e660e66b838f1a749a6b14caddb2965b164a06965d566ef6a47848ff796b220d16b6a390c56ad4d9a30ae1500c22389252a2a1a9a1f1c2b22a952bb8e87611a1943a466f4ff5fa985b971781179bae557f5fb942cb67bddd35a9452dafd5b24818e64fab96e5438858d78665d1c8216d397a6658d1e0bc5a955e6e6d296a5d56b5e8e5f5a957cbbadd4569dcf2ecf2eaecd4a5771c766d29ac5e7cd58d48add5af7a5d8af9758bc0bf3cd60c0a4b3bcb7f28e74560e4a744b07b5d3e9d2757873e6fac570eecd76a6fc76feb5bd73a56ae103206b759d9eb57be3fb408dc615da7df6b1bc786710853852cc72684d077c820933f8d859e09c035aa471d685d9d2615f9a1cf45a4ffd0677fda02a417818f751a80d9ed32874e37223ff4996fc72387b0438716eca90f7d08913ef2f2fec05bd31ca4e17ab667d33ee4c7699a6be8ae79878a3225194e1821116676c9b7677a7d49dd23f422f0e1ede6fda14f5dde22d0c6275d4b31ca73bd4ec3dad28a168451b243787facb7a6eb34dc76bc2f12ef0ffd2943126c874211f9e1e17b80a006e0d7dbfdd08fceac82c2c270b6040a9d32d56175fc984fcdf3750cdb7aaa63ce5b4f75ed1549766deb01e2d7e13d633e25bf0e352f6f4ff41a312d11db3a9882febe487f0f8d57cdeacd63ac49c75c46b7960ad6cd914ac5606b3c50c6ac9f7f78b6cfd36fd2e1b3f979cf46e2bc1dced8e1f6b408c563855a58fe1adbcc9b21fab59db84674de6c735cddba19cf9b3517a1e0d8f524630486710c4f2c5fe6582a4d1aaa45c6596336743a1d597a3a1dd59a552734345a3219b0b09dd5faaa2858f6ec3ddb6d512e0316258e2d4c9b981942860c19be7eec3a6884209fba48e24a144faca755cde9d6fe4ad0b148b7ce8544b8c1941c6e422f61aefb2209487299571baa5dee9e5a547a0c94783896df9a459f37c557a7b9e8d0239016ec3302d23fba1a9ad38dd7baab8f37d6396b626c08022927a8b951e2db08aa623be11a918bef4e158993f8432bf13136e6c403b1f33fad0765243df0c6479e4df40144b1535ad15ede0d69d437d487b82ce142096791650a22fc1d1fe13e0271da49aba2d76a6d971e4e965def6278e78277317cacf111e76302a6f8a85deb4646ecd788eb6285a33f8e11883e5dc0bc4d8c641e04f320287cb3ec0e7976acfaa07e5eac5a61606fa7877c797b8816c1b3893e274e012ccd47b7e1e4638e5682e4bb2cbb4214dff947205c61ca2a674a16c192bee93a09117d53b97cfce2bb2cf24e9dbf23be14c1bb31ffc80094b0fcb41d306681ddd0a303fc540fe8d429e7f0f39e8df5e2d6e510270f6c1af434d2ed073e9d597339fcbc3ab7947c9b54c1a9b90729ece853ca22f0630a30fed9b996b90d82ed5e91aa06d6068853d32ae815c29aa21ae883005aec8f6b4373d04d4358e87d83c16bba35776077ce1b9dad6da30f422b9e7cb9334ca619f674727b5f73333144a03cc665646464c89021c385de64f299ad8b3fe328940c136a8b11e3a84de86d8c189f89711d28b3c5e64c7edaec6b6e46fc8e864c4b1860af26c6c75df1317a8fa78a0edd06888301208ea870faee6db18e8187935d56c2aae8288d54a9a0d987858ff7b10a888f9f3961fdb508d1816f0392cf2b7838ab167c9c45eaa3e0b112c681793cc147e712bc1bd2a30fe3c02ebf1ad3651c009ee28d3b4459e9ab8f9bfe6a3f479102f66afcd17808a5b4621882ec7c6ade3a8c4b0f027164b8742110e7edc0780c970ed437302e3dc6b6b221c3b4cdb8c9636262502894ef788f72a18fb175fe31fcb475f54f3eb375fc336eb74e480cb76636197f9a157abb01c997b9f009ae61f2d3d6359637b90e8cd96273f6bee6ecd56919dbdbb15ef2d738a4cc3accad34dedee94cdab4ad43bd3f76d5534b20b05713a4566b51287fafe39e049a73769415de3b95005caac02008597ad004086014edb4e7401ca10e1c018a2caa18b184125eb0d3ee5c4d3341cac69ca9a0d8e75837cce08b3188216c62a5c84912488e1c65a1326509115cb6185979e22409922c8e88a83059d2858b156f4583bbeb1b5979e22422c9e288880a5cd2858b1546519ef4105ab2888268c84b978745f5c4f2553d813658c2082324ad9ecd738ce7834d250907d8f4e773e36f4c05c54ec7981bc298e2218336cce7567bc29f30e218c235e6543db130559c2089b75f7dda308471d4700d681fc7d6308e1ab84687aaff1836a9ebe1edf5296d3b3407bb06c6f15e8dcba1a5dd78bbdaf50760898dfe44f87d523dec53b77fa9c01ee3b01e4ef5e79771487fa8ad4215df788da7e2b877a39f0d7be737f0318ee6faa6e34fbf2ffd710dea5c4347cf6a88150d1a1cb75ac9a39a2c3b9d6868dc6b6a7080bd392dbe18e38c352671892be7782f8ad98d04f66aba6af4d1bd183d01fe5df152c4b7f6c3a3b90e7ed2d37e78aaebe0bf5ca7a193beb1cef5cd29c65f6518933fbf00c5f2ac3764f3706aa5c11ec08914ffea141f291688538fb42a7aad16552996228853ab51c5528fa2d728760a4704a3d76a2d0ae5ce71ab15e7c42410c706a88a5e95402dd1eb96e8b00846471d25c1f29c043a81388cea121d2681385c0455d1ab12bba46e19d2d19f6345ada56ffaa37751e358446dc4c5ca4730a210c330e2bb3e02c38aef2d1fbb4441f45d7b39f2d1ea97bea35f46242c8c631e9d37a2d89b9c424552692e66692c6d853dfeb415cfa68d78fbd9da4a7346b4ad741185b1dcaf8efa84263649c93065c2e466391129a5cb48192aed2c738bc0afaed35b173981384d459d420b14129c7cec217ca4599a8b1abc140b018840b17c74194c626e5b793671c84ad3963d9b1943567a578fc8279b4ca23929abac9249cca25531c6245a153d72918b9c951863f42755ca472a1f9d93409c88c409c48159c0285a159d098a888f71082f282e960b2756aa1545593e72d15bd9daa8ad889e6d9da58f9a8b1049ab3a8b5645a7322465c993249c098a080b87d0f2ed0505a3c31bbb28c608dbc9291f637c37ea7b471d2dcbf21dd2ad2bf4fc1d14e4b9b72af4f052806bd098f7c56ae21957d0a8e1381a3466f3518ea7313bd1d4d0b091936323478ed99da469688a48203967cc4e994663b5aaa139d9b0218566333c32990b58f9638cb05d73692e9ad55d9a6b7fffbcbd34d7f53617194c6c577ba64b49855f97ec2dcbe22e976318b317e612c5bef72e759f2c760eb05743dda6188079e611b85c738c31ecc23c73202ed75c28c58092678e038c6b9e6240c9330702e39abf177aa8ede02f37956200c9330762720d0892670e84a9244b37c538986e4a9248971b29992eace418c92f17da79da0f24a51b040548c949de8067c49226e9bea6c172cd332d03e2cd3be940b1dba1b9e740d1da7ab85573cf6b4b2add5c8402a47a57ac6e1d05aa6275d25c8c31d6682533338cd397b783891e63ecd8b18da090c39d9333856433179aa727a9038d0f8d90645662ce9a1a771d381f2e0ac9662bd89c6c5d580e49cbb0ab557d3beaf31699dff39c1d687ef7408564b710446e04f3624ece0981aa76e729cd71ed766327f6fd3fc83c44801c58a672594a732614d88ea57cc79864eef57945884d037c36cfe60d400a22fc3f300b475e7a10be4343f5f7b67ae9111dfca91edfc39107aa4220a92d07e87b457d0262ed2a454f5b8a5e8f71ea3137080a8de1311e3483c16c296a32b98c0331b98c5397b94150e80502e3a81b14c3613c6806e3cc870c4551193486d34b46a373f35183146bc3db92a22eb433b3a5e8250264c6631069c0dbf9297903de8e8cc7b841414f68670758a9bf1dd47d3b311ccedcd48f189e2add06bc1dde99f1140ebc33e3bc3373573b32423b257fcdfd8037d6d037959a766ae89bfad06d80ee0336b1b72f23cc245bc74af8518b52f7a9378bdb12eaab91313ad6ddb7ebad5b75abd748248be29e0455a4db699e79cc666acd310dbbbaafcbaa4daf0e94f2631bbdc70ed47a650ffe534b1abad8eef4d1461aba58769d3e62c1a3a149fdc035dae376718d769411023530300c352714f3ed1ef702db57078421861862e048ea843ed290a1656049ea8462e0349ec88cca2c43b8951e13db570601d0b0190053ce33199890a25101a00595ca0557a954db0c954a860a156346a56a620bc78f31ca88a37144c95b68a68a82854f37aec90b494c8e9571c87fde44ec4209fce7278bc92b440a734bec1efa1907f36b028e10b600e34c9f976fd8bbb7c5f7ed1a9ab08ce341a38b05d873ac998b8c119eb032587a4a73dcc34fa2ce57b4bbbb6f0f907cc83dcf6146fdcd1bdb653fa87adf545a8a14db7114b62b884ad2423c1c16e2a9d895a084273c610a5388b2e224cf86ad7d37780630cf07cffeee0e9ebddb9e71c0bc847d4c3484b5bf1a1fa727d8e7f4dde09ecdc361176678ceeffd8c12214c89e1d9b0c75461bb181e7c0d638c8e9e61dbc0ee83fd07109c3c07a9918175e13d08c47126aea0e2045700a1e58b1df6defa87281818bb8fe6deeba8b6b0a729a72eac9ba0609f5779cecfddebd2bd29d827b043e0e1d4a76a97374ee1be2276c263f9eec524c176f5ebbb5161647c63d1a1b8e8d98485c7b3692560f1dd41b0a10afbde632b3e30c45bfee1988ef08084955c098214a3243a030215df71122044f96628a46fbad2bb62a4e5db815c11c291ef9a85ef5e16a526d65710c7e67811a4c2446fcbe39824d81f46b0df6bce798becc24a51152060520508963c7b169f5f10ecd574f0e8290c2fb0a59b9a5ebad64b8e83f5d235624473eb38c090ae4395a6f90aaa34d7dc86bee9c9fc72cdeb90cf1edfe95bcff4cb2fc7665f28ede775350b92dce438941c5e23d04b6eba46a01889912102fb9abbdc74991c8776ef8b83c9dbfb1a816e4a5ddea61b04e5ea1b044d759a4ca67bc11be34048de315ef2989bba4cd331b8913c662bb9a92174230e7f3ca326ac1c5e1d931b3102af1093778f68cb0eef080a7d4df76d6914c790097402a560130e01e79cf3baafb946d29ce6d956da529897fced903648721cba9dd46e24c6a1bf9d9ea26d1da53929cdd1f7efed5492e36072375d12e93acf982d35a7974e6eba41253f79500ce6abe827d28db9316ee26ba4745333c681408fb9a9e9262f797b8cc94b0e24c6491bf498ad9db4ad4c393728084a03de0e12235080c47869c68dc45c3e0255d44b1ec34f97a34015f5287ef218ef384a13625c5672040a33b7747908aa2895b9ed04aaa81b31b991d26522ef78a80931978da08ad29c151bfd203592e6a893b6ae152a699c47c55164f2d45f07a3e0a32a4c6816850a2db40a2bdfd54c79fa1d249ad42b363b7894440b932d48ba4b9423433049dfa4f8a839ead4ab172c34162fdf3517617cd75cc0f8aee6aff01d44f2d46720c23a7538049d40257447fc0995b48a3aa5d49b7a3bc148dbdb814afac622a23ac704da1d45df644eab536f2ba48d77da8ae72d5045bd359e1f0f522dcd51bf91847d4ff252c75a9e7adfd404d25ebaa9497220252791bc7481984c770555acedc06ec773c34a5bea72d3752f2fdd2028d7055272d30d7a410faa48294b731845df748de5a953cb824ae01226d46112d049e34491421d4ee91bfad4211548d437458dc33bd42ded6a2c3289ebbaae1e9857cf1c7bd8cc9e765da9f1f464fe7e6e5de635cb5cf339273631ec769957efb2b75cdb7a7e82befafb8c479c3fd0aa1a76bb218fe2cf7c504ff3d3aaec50c5cdc4a95378441b004c8c705605783835580f4786caec69652327c6082da4d002091158384204494a5083226c9162092d17135e78ed92440a09305b0a83060d9d2123c18327654778045389a9e8fd587d365d359e212b0326b480354a1624bd02db92194d2937a081155d5890840a2e44c0326484225cb10112531031f18212133580410eb164890d86380211484084f7c587151461480840107951c21639aa1598c062664e481a0c2173828923488d09d70f55ae1d500182c833c8d981fd2113c177ce0eae900a42b085102c400108888ae88007bc6c39c1921bd8e0053440010f6860844d16ae585902f6ef8a9522501b6cf16d79fd89478e94e081a8f347ad478c6875fc28f8dd0f3bc24c8317a6c8b213bd1b30cabe797d43ca62239d3246a24ae50dd2899452ca558c11461821841042b9411f51588e34c618e323f2e1c307f4e1c3c70f207d6379ce3f95b455ead46083456dc49793a3b9b6913dd1d5e58f87f6c97823d12aca7bf739e74f080cba0bb0594a1125acdfdd92e4ef867cb1f931b324b57ca1c83c832c4868232787e9df952a5b261845931e31c2d24246ce0e888034cb12bcd00162bd1b2baa3cc740047b0d8ac651342e84022bd4e08a111578f0e50920bc280a628a2278c0050ae60c8a1040ad021111306707308011c4142054590108a26084072b28c2962eaa1802141ecc2089a44e74cde774dcaaca15f5df952a4258a2e31ee8e30518342abe17a2aca2b8bb0041800579373a08f420417c04f115c4d1fc91fc51b7a8755f9554def89a90fc052448db9056b56746b0d0b9873fbc5973a8cc36b1ab261c0a052dac2d395083a269ae0a2411e5a89f54a852f41007e54f78a0668a1b00c1355334111341d44c11af545182f4ef4a1526553ef0ddcaa84b74b7cfe6bd9b39638c312a018b2f2cf1c2121542086137e423d80ec489d05647a17ae7419c3725a9468d1adc8c45014e4c7064850455bc0021c4c4045592108526d0c005514ca008242680f283228880821d2d8ea67084267ae0c5162c9064e1094ce072041f5061e7496185284d0851c40a64f0c3ce5352050a9c34a7e52d298a9e7b4cf3fabcf9aff0adedb8527c79ac7d780cfef058ccdef6aef40088c76626b76ebef4018a2db2fcf328df0dccdf9d2f3df66445e2678e6d5bfc4fe933c7668685c71e3361df1529b0c08657bcae4b5ed7bcae8bafebbaae3a83d40925f198bfed5d91228cbf36a1ef1ec93bcb9b44ea213def2c2f691d75cd4924cd061dac94b1a6c372eb06ed76cf2db7341eec09610930b0afd88c175d7aec919de53d96438f9a0f211dfc7b343a6d019643f8fc6aef60065a3e8fefbd87f144028f0f5982b8c10da06072831d54a5c2151848e1c3151e28c150173bcf1f8fe028c2e8532808de20283870007a5012de81d7480fd07be02e6af083233bd73d025dbad00e756b7be189659415db59b97150c56e5385edbc8ba08ad9a592ceb1b19ac962bb9609c376abe7c6e2d9990a2644cfcf9e03c933511f75c327300c63be9d94c2dddd5b47f3b14a3927a5d5b22ede302ccb348dc45b29898c376b3798cc741125c1638a394da122e53433c333b29f6ff70019999999878a81c4cef75d1ec0b0ba7543ea86c5a7d55aaf85ce1bec79cfa68379e8437ea06cda74f6969a2d7b76774ba7321a61afa66218a682c2529fee987cb0d66ad9886158ac447ee837f7eddccae88d37ae621058a43506e13b9933ea5a7e51778dc70c3d561fa55b1a8fac959f7f66adf5587dd578668c31de0cd1b1a629a8d46df6843dcb189a1101000000f313002020100a07c4218150402899ac99ee0314000d8ca844805617c95110a41442c620620c008001000010082401434069a07181ddaa605845e6819cea16a03192feedd8da33a2f85ec096ff4eb857c6335b853511c8881d44a9f6851cd81795e48cb89f421c878c4cafe034aaeef8f7de8c04e14b8a67e566390bd17bbd82d1dbf2aa7c8593c280c3e9a25e7539973103fd8e73b4259d19ac375be65b643b624a4dcdf3958a3291a2890e98f3184e864c76aedc107d9498f117f87c694b97527417f443403909acafebb6bf9870f95641fba05fa0aade626eddb4121ad3052bde5b6987bc7338f5364bac6674c1c3ef0cc05fcbba71e391ed99ef642d013f486bb04b732b1e1524b76efdb57f6699f22499076a13117db52c0da8e996962ef3eedd1043220579ff3249926c05d602eb836a389f0c56ced3fdfa25860f1423d1399d8f2777551ebd5c741e975bf080335b7661d8d34dba54b38e1716afbac2043c5d204c350093a1e9a33ab1b508bc36398e6688329d1a2d0834625b6ba9022295a5751b4ca0533bcc82600ae73989cefeb9a9c0c1a2fdb840853a45d385bacf9b9b03d4b74caac1b4a24a5a3ce71d338a11824fd9718c0a947ad323f5c6aa468683a2cf561da32adda36ba77bfccf4a7b9e83e3759c95eff81c8a79f50afdca2e3ffa9d9593cae85b4b467b5bd3d9ab6ebb393eb515aeb62a9fb0c0a9e85f0c77e8aabe740db5eba83c6fb28119d7a2153870565baa88207a7c40d1879bae6115e73053b9da083ee9b9fbb64d63523c0f816858e9f0edc9fcd16c7983b79b7219495eedc709404c0bb935026254a8c97e87612eb3af8e8e38b0e28171c65aefcd02d609bad27c9ef07ceacb715d078d1f6a549cd34c8fb7cfe2c8f886effab97f3115a4efa7301775e80b4911b95092b065e06b4f83be008e85bd0c9ba0fa4203d8c8c4f658f54b4f9443f2ce731bb8ed98a1326366067d61330dfea54719617f59eccf17be275207e0d50bfeb8967cdb0113375b10a282bd48c65ee252e8cf9710ec64b4f37ed96191598d513b06bd67feb991d7526ac46bd27891344d78b6fa162466e2c2da7f607bf8aca9d27bc7e1f9b38b751858928e56f323f38cdc5cd64ac9838d6619606f03557e9e25e7818387e422188fdd427f1710cf0e4f481c6b6a65efc94045b43f97e4e06c90c3312fd3f81e1afc5db3c42c360f8ea029705482bd4c05358b8511dff7cbae267dfc02c35fdb2b2e00aaa711a6940e83bfdf4f014d8cb5f9d2b76eb2f87f23ed98726ac126976853135cfaa52a9fa67562c7acb61b08821c0ec668ed49002d7e1bd1d941ad07fcd0f32485647d15bfde6b8422d7880c562691123ed1a711ccc571b13e3837cfbd61ef4c17d68188a599e0c474faea0c8cff9c4440538a0653b36e4fc3905130303e0290342318f11e44d39112efad0d936dc29da78c305e16403cf11d34ab9e182f101737b2c336abe1a25214b25bbf886cb8813e1f96066f341dd59e58cf5b4359729d49ff18acaf32ef14b1ff5b3b45150c9532a2e82a61c0aedaacd78a4c3ba9c393658aea6043af0350f4db50f560acc0e37b7cee01ae7a556965b72ea4cab58f0b003ff8810acef7f8403a0e3d0ac46e6a2fc376e523b684e63cc9020f59654562dc46144498d1297d974e6ae1336bcbdf7f92a4b31ee76e3db836e9212ba531df1af2efbb441872e7a25e0c486ad7ff0ef5a06ea0c9e35c19c1a88016c15a0c4943ba0fa06a65eecc179de5418e90e49ad5d80ca0a04929e460eb7a4454b2b75cc1cc6a21f4ba59afe5fc862645e8708dcde1f663901f0239527775be0f995754234852caa94b4504329cf932c67ae1bba032e0973782bac183a0dea6524ce31b6ed4819c6854bcefdb691e0d585bef9da158abb568d0ef0773f9b63d1c8267636fa018105fe51927b2c0b9defe48b2c20e94486b61bce54606924c4a2ab50fbd4f24f4d4dbed9c89c0319f857fb360af91379962c3fdb9e480f499cf031a5ee73a367b0362249bfb9869c496f2ef7d1fd84186bcf385c9ee1bbef43cc6f53843cca0023488ad320725b6110f5f07ed4e373a2a67c34a6b464dd80d06ae6487e040a3ef1950b77926386c1438239aa2154d9206056fe19828f5d3d4ba6ec8e2a838cc172587282f86b1ea407e8392c8cf952087c4df00d3bba500837273b7947d5e5db1f5feb0a738378de4e02a85a1e929d9d17d8b9f24a90c6b90d378ce0a7b2ad5479d9725f2ad76f26d059486c7f6414e7647b2f9cf4ab36f532b6efd69975bf6a203ee0fa388c2ec5b817838b5fc87e5b17cbfb93f41cf338876a9d3e9b4d61ed736aa41a7d1752886b11efb4e816dce009dae67c89cca46127171d8890586b8092873f2a49a280ba480e429633bb68041f3d7ed105e05287df723b7d03e14682bde148273e15e920d71a4c36c37db19094eea3501e8c29dcca9b6c256b0578a9a40bd3a9522330d6e02dce6d68a4ca152281831b140c9a0b2902d80318a52933cf925402a1251e56cb27e00458190ed324d01ec1868f89f8cae4ba9c59ec1b550b45bdb84df031ee2e65d1048c498401bf35e2f32fd0ae489e145ae1d8259400bc293df405e30bcfd713e447f4057c31c95e03c267d1274fd158e19f36a6d08aeb4ed6256aaf08a62c447489b9f4430705f3fb042254b219333338ee540087fc67d463dd0c7428c1c49b66285c2e815746040dac727eb246d978a0382bc1f7595cb015cb889a4c72bd94694ba86d87707b22c63018040c6c6b9a2912a4407e410ac263d2559b3fb375cddff5aa5ff805096ee46af0da1f9332921468a78543935bb2d9272b7fe0afc345de616f6a889d2a34d1c212df0c83e38df4f545990add338f876d9f7138dcc5372d9b7d12d58de0fc83c204928f1d0fbfdce7a694a573a0b369dd474dd2c9575e449b0768fa116551139333bd4e70c5c5af481884d69942a0a7765786fb5b20f4ab67da89576c2a0dae6f15ec976661754f00c8f007b59b533b5393f83b6ed68119f73ef88a38ff955b8bec61b898da2bfff5785d3b22eae4bb9dd77694be9d5cd8dd822675ef0485d53e356874451bbc687cfb41a19727445bd6a34d79f3c62490b399aa942ee176d400969e006b5f40b043d35157dbd3f015c37878b51bc067a0b019642f5460d4137c180afd7f11520363cd8864a338456be197881fdc05fdb91e7bd10aa40bcbb940734f974a482030c33a27b614811a0b0ed99ec3e9305d834f2bf3fdf3308d0f435b4c958ab67cd144c6e63f7cfed7e5bdb531268376bd72f24f932f86df28aecb0e11bc49a84e17702ae65fe89964edc4f9ffca3f56680ddf07c7bee34b36198c75cc91ae0602b8bb3f66ae68d3a6e248f5eafaff4becd12dc26e683426fb52008df86bd395e89aa673b27d2e08c7df8dd068a9126051dffe19eef7c9f135329a012fc69d13cdf57b04b3c1b0b44173b01f78f80ca4b8b502401e3be6dca0eb19b1428b22204feaae01efd2326d6c66c1ff3ff1e2c550eb81a17cb9f57388a819912cc56f592dc12c16d493286fe48006e7085a58a0256a517a9456a7402dd5eac6ee88cf94bc352f5830ae7f9e2ec54ae76587a47aa0c4683f74d51dd2114c484ea3bc349e1cab3eb10f237208a527912e90fa46696d32b6f7c99ed8fe83a71ce2559bf7e497cd21c74bd0a69cad30a00c453e7da529857f734cbe95f8807247383d8f79de41ca22b90872a3a138a6cd8d5d9d5351e47b6ecf114553757e798e9caba95a676a1c3f0e17d63ebeddf0616bdaf8b59cff7be3d30fd6c5a69e4d296de302f6e320717168d49ce7c24d3e0517d62856f6be0c6f03d945685604d97c1efc24ced30188f9c1c6a1ff5cb5372804a9758681c248080107cf02850c1406baa10df50baa401fd4317c0ddc012fc6d407cc639e003e2c49bcc98a79cf21e8a16ac3ba75352c79e246a0f231991c7fce15d516b6f0190e1021a47be18b9597ec1240643a909191d35bc29251bcb3412004bdb48f64464a1edd90bda20d4f8e49d6ded39f1002ff7d19557b1a985c0b255c5409101ec06b5eb171ded7b7eb32c445fcd5033bf9cd671f062eb77634ff2f273f71e9dd1b0eaa00fb15ce0c4e1a50c9216d510acde21f998fc5320047195f973d3fefcbb938e37b4ec137b346b9a17262965b4357fba9796c1ae18941f04baf7309d22fa408f7eaec37c0de569c093ae120d0da707265dc318efb2a21e773e88c4a0640932ea12f1210182cc8e1f892a5800781af1ccc47d025d8fef0c79683dfc517a42bd4dc5158c017e696b41cfea6a8cfb22807f8402eb4d2746a26fad9bcab37c4d22bacb94a55eab4f73e9dfe3a3d714acbc633ff7deb794b8ab087cda76bcd1994e72370d28b47e6fab8b1c09298f2aece6320895c2be8df0846fd5869812ba80a1fb5fa57b218561ac2d99024e5001623a2197a9245bfe0ab1d9225cec7f5a3f3fd99dcc828feda8ccc7d4cfbddd328983e85aeb9e2bb50049fbedd6748776fef3f97afe4cf567db6f495b1c2af5f32b551148dc1b8375a09487e363e955666aee3a24ee7c6fa4a8e79744a5bf5270c1ffb93dd8321c5effc1b1dd42830932293df7a62b78dde1323e33c2005ba4317a745c46ec8ed2b16329fda6fad6a9282fd05762bfba899b4bdf20d9e7eefd52eccecf338b04d0105e70c817f2b0bc19780176507b380ad50c957e40144469a9c3c677eb3299a47b32c15a5a7505c2327dff359de8120ac8a839ef503a2fa8d3aa2376335e9c864446bb0206354866294d8648d262b65d1e2a0349f0c5dbb94827ae55c1e4170174a3d68300ad070d11bdd6b97b2d68bacc92ac3acd4bff68aa579b633202f535a40b3e47015fa9cdd89fb073daa558045d6c863140184992abd8ee0075b8bd59c256b4fe987a74e8566d4bbc287a5fade9f016ae8e749ecc52ce328a5209b3985a31bbe7a5ad90dee945890a19197928e73f22c661416d6d7504ee452d834efd58392566e49afc654a4c9d90d5864e8d6b3ccaea8316b92779a8d9b2dd0a490347914a695e1c2ae6bca1b3cc040f136ab88435b9eb5c655d49bf5aee5e522e8adb078b5b73611d0904d5318845d5e7ca68eb1d041faf5cf32995f85c34b7afec63cd0f6e9667ff57c266df458edb797a65925f39ba04c90399e3cd7882c258e02e6e3cefe26660df0e871d83809f58f31e7316846a6ea290a26729a359bbc8471b8a28eb618a5e78c23fd5343e6ccb12fb2ed9f12edd37f2b3a41f8942e68db6d266a2bc47be0972fdad3025d688c9503fd731c238c301a4d568ec3564504a08bf3eba6ba144ec1832c906f05f1ecf3c50e95676edf58292048ac6b999dab5f57ca9485203c099cb3e306cd76e6e36ee68f269a0679f069f6f2b11e324e95baa97fb27d4219876ce4f91e8c78349ff10347b4df906fc54e8915385a83b94266464a49d355f49359f4236fbb839d7733243816e0d520c3ce98f6f869e2c48a070df2a9fd0c2bc1ee9e55f714629f841b2a5bd8f9154f1d0edf37ca240e3206bfcf13bfb21b0bdf421709379424ce28248a99440ab5113d07bc5d68f130c0bae1c28702b6b8cfb8a1db1be63b5060c915a00415370100f27853fe3b40759a2e3815bb1555c4f16f797f601954cdc9b5a23a6249e09436b8015278ea18844b3180356e3965364ac78c02ff1aef5a934225549bf9e480336018c65d2ebf11eba1c272e44d6c292d293f54c21ac26f4ac0694445bcea8dc82b66971bbdfb876fd17818c16aeb9108900661d92db56b1261b714f4e87135052dbe634500a9b081dea546f4b87459ee3192aae9d883358732c7bd1d7dce6a30ff75760a032f1ce19381833321fabd03b790150af646a63b58998bc977382ee785fcc37f54724ef35464725686e28fd6292ae03c16878d6dbe59970709893a87037a629e8d48d87521d2cdd05427568668b47963d0c81b61b16134ca97cd33c1af3094289f27ca165328cc52bd1b62f51b79489321251b749c80ae25f9ef2a37122030e80e615c5be49aef16d634148c70cd21b0af801999b5f730adf45de4d99e74790f780d4d573547a341573e1ecdf5034fa1bf42433dc579a1a2f4f96f9f9f2bcc85dd0f9e2bf8928ea1fad4cb28c2548ba8d6bc933673c8760c671528a0b4fc8631e316226a35884f90981739c9c3ad155665975e60f5bce89ba7f99a925fe174175969ab9ab405787e7a8c1a3a3ae4f8138ded8b59733f5f24c5097d5f65a0c583655e0053835d74e3f6d11bc9f5b076a1c917c8932617a82975776b00f12653b266e09ea4e33d1c3bc8fca9d98197a39d8f76a539d1a6690ec2a96332648ccaa4e087e8f83d398516bf1632c4a95e9f88a883d26a0146e87dbdb73986cc270b7cc095ab6f3a5970c1b1c9a768425d256bd986fdace1d1468d04bfa1f76584e8add83aae5706419c8d972bea479b5c048defeedb8beef8c4c509d5dd19d69c58a7a4feaaa367d81213faf4c6dd51ab56e3defa2b8a7b8c6653a1758d2eb75855f9449677e2dbf792146e28529ce71d971f86f182dc55aa8f3f0be101fb096e395f131e8c3433e39fb2afa0dadb76ac00ab69b52ca8f48dbe266f42ab810f0c912522606e950dcce720bd4474fb4a86fc67a51718b71b8bd013a3de30fcab54343dcda2c3ff654ed91b1d71786cdd134ea462847d1973e38cf1011525615f0e1188f6a29787ec72e4c53aa2bd4525ba65157d5b7ce502f31506bf87eebd76d1e0daeb18601c6fdf07503a89429e20392421fbe41b5ff4d5c0219297f19efc02735db80a33bb40acc809fc5a7e2c111c5c4f6f87ba9c9acdb37e19e9aeb4774b10e2a868e42f698904820e04b3faadf60d50475afa953074ddac83158012cdbc32d619e43abbd65bdcdb855817e0f6666847850eff53c1cf3002a1888a47dedfec62ae8449fe427fb82cf71ecb4c253eb7efe640c6f550728fc08dfe43cdeea2822d5443818f8052a928f1e9b32c89416305d46c555fa0cf9314934810992d107b92a3e838323fba778cc35c258c8b725643ace13684fd600d97815ac0528dadc2227e028c5d3044ee21867963a01d54a2b0be3bb79588c47f73a02a3036f20490cf69ee0dc070c9e48739b6466a29c7912819a3d525845755d11f452239eb286ca2dbbe34a60941f612161b9f4c14d4b1b8e999bf3be8246dd67b63bbd8236e42444bd0a755fb534eafe3bf294334591ddbc05f2a30bca7f176ee28710b4b50161837d8fb8fef56fc98ce0f40b447e3abf6a412b7b06e19f518472ab680bac55235048150dbd5b9a1d2f4285670fafd4b1cb10358d8c2cf7543e47c824bc38bce8ecf75e3f34ee71a7e98611cd857afd84e1e5fd7d50ab93e58e845dd6952c45ec22f08a81b32d983b0f77810cc97508b0f3d71e8b6516dab849050561f8bb17f8b0b38754b87f88731f9ec6cc7571cf0a8a226da242112dd6ecc3b73f90417274d3bce7733ee5c75d14f417823860ba541b73a2c9312d77c6bb8fa9c62d9f95ceb632b80fae69554d013d92c87b77415ec017418f96be4ce2630316c98d785682f110189cd8043212ebccde76f8ae15f2ec4fe50010a122204bbe5592b0173ce33d148374f652ef1685cb9169e38a8428acf1bec29a413a022dcadd3143506482ec711596891c3e121c2189101725e24b678c7c5ef590639b9728cc842c3313ca2059b281025b91e35be373ba5671d756e41ab6c1097edefd1c74d114cd0219642618ebfecfacedec080f24ad006a252a22c7e874a714cbfec831486026654bc2d2a90576bfb892b445e591ec2e012d9d2e607a56728c70b0039521540d97495f78b43452cf9ebb5c56116490354f2ed4ca6ccb91b353d6c7001c728c6d3cce1ebfac2b9fad34f159422bbe61ac502c5cc35d17dea923be059f4154ade5f6d232651c0fcbb875a8145aa3c9e4c7b916e93b91c8b535ae22fbe338ff2e79691e497e00152c62ab018ab1193b257ba55a344d7526cdc7e6a1ad15ecd44f534f18bc6e0b404a5f573b78458b7a3ad5a3bb8c043c4a40d4eb16ccf0fe6838f4849eedff30d36c85d3c3813c0edd3cbe780483f53bdd8c18ddfc76729aeb95a5f803b670dfdb4590d2b448197c78ba484e0983791b622eb5b43d439c13d0f9ef19972c684240f08b78c8c4969ec0f2b79eed5912d3272051090e3801b68ad3598e185a9fa077dfcb5f26a17809ef31708c23d40bdf1f8ffd6f8bd24c8b2d2fd420678b53c82c91513df4bbfe241fdccafee49c18b2fc84fd0716c4fe63e54a12dee29fe063cf6303bc3be6f4e057f0b577c1ba1e547a32a39390a43d3e05c9c63d3b68c983f145a0974c41f6a0bffcbd7fb2e44863a152c77c780624042d3fc1d0a336bf764c203e841ff442e52de2b70b9b16fd77f73719c8fd5884ba46912eefbaa113edfe61c41ca63b47e9fbe2249c689dd10a9f62fedf7d92692dcd8f738e498e001aa96a953d5baf3e6d1a8a5ec097ec3b299a2b7be4d3f3d478751fc106ea7c8db9490b76bb41625204846d88fc3edafe10b1c00b356c81c206a91a7344bf917f0e782f233afa808a3d2eb87660321b663efe500ae365fa0623c793ea2a0ea458405ceb58eb30334fcab5dee4701373295e54335c3b5611e3598b6492d0af2f362c37ddca4214fee8c71f6081e5538b7cdaffd3131e30a69a1937491584c95924289af962128447f1c7cb4540ef4df062c2f145209f70e42eed257e79eb23d481629fc2c75d2440072628bcc471e3bbf2f4c3e26d2eec492db6000c26ffe29d22c60ef8022a4c97254047738e850780f7c2d2059fe61195f4bf64b4a8325d4f87a9e9ba1d5731a2ed2d7e5fa67e93fa30342f063685e582c6f3ca04b0679db90b392b5491a98483de1a303458ece0a99f437ecf9f8de3bb9b52599e41b77e7612814ad918031ec417fe79007f9fd0c3a9fb32bc1a9fc0de61d50f89eb84b8393ee0b5319713b4961238fdc771b197c0eb0ddf71420375451f1a33a3164a846c869d3a91ff5b3f35a44f2428b6306e430de39896193f1b5ed77cf3d35a7d7bafac435d91f4400c6b9e9dae36424cb31a987391da5bc032986f14b241145db44adfe12f23ad4ddd58b7a7e4f5ee6135b66eb87d15b584fe560b4cb3e14ba756cf3c7e8482bb95bb6a199905211f153f9ec4778030d1cb5d98443a84e32455a7e6a9ec8b96c5c41120ec85434ec43237bab5e396565659799ab9d2c9d75d2506c5c42264c244258f63e663cc51418d1decfe7673c51957aa4dcb5062f0bbc9785109bb6e9689d6f70f6efe43d22b5da8a552b000043d7be2266cfd7b9d87b4adaeae6e914ec24d72b8606e1c0da2093b8bc691d4a199a1655108a35c74107ba5ae8eb635da1bbac7c7fbc73ce1dfe6b4224327e6e9d1babcd5645f93eaebe2409bf1cc24c9d93142443a9238672c7fdd983e0b99478b8309b1486834400c627ac8ab1b9e798264bbab6d35908dbc94ce3e9050e54d1fd34be9df3b90af803b8b63fc8481df7e52ecae23e57ba99e15e16297a76a53d16db29c14c828be8efad653486576b25d03a225d51944689514eb89e08ce850d1247e2a6341095608818eb07c85e854d67df01f8a3abb85189ca1a6c03d631339dadc4e77cfa7fee3025c129bc177b86c62862a7ecb0061f2390fdf6decb12a0ef5c9f88f885bffc311ffcd8a2ce736d32b103670ebd4d9b2458fc93907443259ab56f1151ab1b3c4bb8fa08613c261787aa350f76f4212fc5aa62a70735258758fce7281d99cac02ba274f8854bf4ee3374c564a72cb76adfc604014047d72a431f2eb8eb0ceef180e6023f7035e22077ceb4f17ce90615c2fda6e0b97c583016aeb496aa1324e5c22ca8d4c4a5d7e898b9fec50945239dd06c4ffa49576d5aa0fc05bd389b9cb052e67178234e81bb6cdc1e24b7f5090b93f59927fb21c2af8d3ece9a2c24757d3152568f2480b330014f3d9db562dd0cd6776bb17c673732583f5a296db2a6b02f37a6b9815c56da514086f8fe07375e666469ce58d8daf3573c0492552dd12169b96d11c0a59f633356e410e32b58c8d468897075082f3e1fb0c38d5d164b0927682bc3ea58c627a4e739d2d1c34388913fa7948a371e7661b1d5e043e2c79a2bb3eec0bdc284fc0df1380b039f6c974d0ab6863a0abd5b7197fc4d63126f26fb12b30c81ade249cc639120e85b41e0f90dbf59d94d1b52019986d010dd0e17a1ec7ce2f1602201463838887d0b2792c33a42b073d158a23418b205becf6aeba74a39eb59a49ef0181ad2800af3890c5a37d9a196ccbc13544e8a6be0b71212a1208338879a440c967d0deab59b60ca65686847da49f1bfdba5fd26cb79d368517f80a86a130750f3718c2a5e89dc321e05ad551ca1aae983e7ab69890bc6ea53eeaf701065bd856079e69deedd565a70ca517e210edd06ca0fe3ef8089f728d849d81791e29c6d134534751a5dacf39b3059b56537426b841907c6d0f5cd9c6de66ead80b90d10107dd8ac92ee758e0cfb955b8906af89ce145e44f13382a63d24093cc55a28c9b5df16530df551e7be8b1503c3f57e9c9a9677c0be683ed6782b100e89907e27804adf6e1581ce4565a48d58acafe300390a4e962d296f67a3e48a750430fe99b11af3ab13dab5f493e087b25d63a9b9bd97cf813c50e4ca590ce1af616f0a8917edaa8565021b12a23763de3ef88e8e8ededdef64aa4cb261b255c8341bb302dfc6740ea301cd50988c456ac6c42741663ed99364579ff0712966c7ac76e3f4d360a2013c757423f8e5bae00ecf67f32d2fa2f8a0e8e9e0b08501c8021d22c66acf2f4e7358163e937dbbe482c1cfb8f0efa68f41445ceb436c54522025900f4ad8f8885eac18a6c104802de686731053676595b1d030f1a42b93d097b5e74b598069c25a55cb1db2c1cac8bb9574182bf85d8454402a14a79dba2e3b7202a654057de04b46b5de30247ff10ab9ba3eb7f7f29d0f8c5e4405a07285ff55d5a05429cb7e76e0ceae49a851b0b2741644f0623a04ec8fcaec192bd8d393c67ead04ef4882af26aca111275c6ed0ca68147431fb5733ec01d940c0e240b13503c15a98550e65417880e9f69531100f999dd852d3845a61672316ee7cef8e734835b75b2e7a4a59f3d9e7f333d85b730563a5f39a1182f6ffaee1f4f5c20d912528023d65a03ff2273ff8308ddfa2dae32b41311f7f3df9109dbdfa9886c67f177dc5caa40815aff77bbdeea6c62da66432bcce4405e862b7ed393502aaa1e956f33acd4a9c509c6886378a94e248f2bf6076b360a25f11037c8d3fc133e151f2c916c408bff552a82c1876f6472e7007398895043eaf6375ad3f9e54240a3006482868375b2d4e8ad8f4c43b8c25b484ae3cc2d859dd542c11ed136d6c3bc41c57a61ee2dd81733564f1147203e013763bdaa5c3606ce110a0a459013f5242ca49cf92199a863904cab66c459647b531211e3e7eee6ff6393ee3dcc9477274de0cf2e7e1e616cf8ebb0650556dc5f8afb5b117f2bee2fc5fdad88bf15f7b7e2fe56dc5f8af85b717f2be2fe1aea0862099977355c2481da55608958fe1270570dcf4c20c5c92dda22986a2622a2c85f3409cde49c4f23d6afc4fa957969e6ceed9422fe56cc5f8af85be405b96682d225044edcaf68e836a98ccb6676cd654440594546539aa3fa7b40ea633d58e3a7f4489ece0ce2836fa615fc1bcf8412166441359a18e09bd910a0a1be1a96b7504a8f2e6cc3ca2d65b381e79b53d5aedaac6e337191438eb9949af361a39cd1077fd41680d5a9c5e31eb9f6cbd4d481c7edcd77ec44fec13861c3acc4d1d411abf63fa99a1dd5aed4fc624f5c7c95c8e80dbb3ad6a19a8a3bec45c7284d0d1eb8db20fb60e1882660c3967f9ecc75d15be044e379fb70dcd9cac5323f6da112e8f3e95b72d1fe3cf709fb9b4cfecbfc4e9bb9f153b08988fe99f452d7bd797ac1ff43b5178550fa9468befce9edf156d6c8ad273db04afe272a441ecce10f639dfe2cebec8553849d821d745d91d416d057d1733483bea0ccd9299006b9afe1a99ef99abcbef94b911dd7b3292b6814ce70ecdd09df7d5d4481fe55c8a330970abaf29140822628819a84cd28ea32b1c3a6fd042ffbb6ce090575f78ee2069977fe2cd097164487eb904ad0da1ce603f1d0806d7e2e6f2f0fa82f5290b3a47c989f696672ef1ae2b06b4f0d70959680691497263ba81c5e5052305cc5d4951f24a69e029ef15de80ce17cb0c928ca9359a17b65de31bb6ac54ac46cb937454ba5c0ac11ac0499d3b5cda97637e28c342872ab0eb56802c40bec20629ef9515559964463615d2901ad9b51dfc65b6fb6f406039fb52025217031199b7113330facb5e9556c4f1c71413bf71033faa5553981a10f04541aa48e027e69d019aec3b889b94675fe8bd27585dfddad2fad3766ff936f7710b6adf60319321a0bb73d344c039549a175a97df554fd9a949eb4316e8b94b10eefa53dbdd3a5010f2d0f88ac0591799390e41a5fc303aaacc81dfcdb687fffacc6e7318449d5b21c9d5a9e2a2864eed1d7dfab1b6a4d8e753284025a4c4a7575db4d4bd9781d00dadb3c00956c76eaa9eea42051dbfbb22c5c30fd710118020854ec07b9e7cb0b1379209973d444371f9599c61789992e83aa71daf5b46e0a3cfeb32103d043c235786385adc23d46514eb8c871ca05a65c125d142c58037cf6dc3f49be7919393b2032bdc4f6835572932543895f6d6b650915d70cf564d8114626a09590c1529398af190170ecac465b5f64368ccc9a304b35ffe72579ebe339824675acd89e5948625429c98e322dd66f920312c7af25f92f3bb7af78aeee55814cbfd066d8187082bd3ff2751357a78959a8460f2e54ac5d7ffc16db23ca0c4e3509511191e5e38474b45885e882cbc4019324e7855db185cd920c6e34558f29fb54b0f80aa81499fadd0ce92c330b949d8cdd601c590131f30d731c18df8fb3a3a18f0162f360f4c7991fbc3e7bd08f228bb037354ded3e8fedd4ea07df07e07d1a2c5390e0746d089a016c0477c2f31679b656c5cc2e236b15dc94ee15b4e3afb15d93f7b5125eb0545afc985745556283ea0d375ddc0d544f49387851a2bf2785bdc207094452a511ac6d6275c7f5f178c122a282487296ef62b51dbaf5b549e4c70c778bbcfd4442f7e12e96a0076787360defcd2f9cd7df92fde035c1007b1b5e82832bd045a009f29bdbd3bb244d7aaa4dee06e95f607e3fd9294e01122f44c987efdc80ab93af42c97992ebf70727ef0944424292177df336e72501545d81122280fafa2c07361a823d6dd19f30767f2dbd7b29444af7449cbf0172850a3a435b701102b68ce360d00aa93aa322fcbd807672ce993c76c9cb7af6cb537c2cec5af0456ac5f3294d3d1b74aa4d37efd01a537ae4a2cc140c2437caf33efc55db29e2ec17da8e937e9540b30ca94f19efc571bcc16394118ff5eef1b699198f9551aef55d040a3982ff78cf66a2b2e83ec57b03a38b8bac9c7887104e1cfb6b671ab9adaed7eb18f5a2aa38acaa462cf740508371cc03cbd2666edff59ec87643948d98e1787a79a2714db1f0377ed690be8ad76c47b3b93030c1177046af53d5ca9b0b9e964f5424b7b6209cc2b9acb9b1bdea117abe50798dd564f2e4747849a1c8a22fc6e55386c92737dd4f5151d93222d0e72ce16743e486424e5eb002e17df25344ee5a55c8ad153cbd131f4341a6ecada8156a9f85d01d6956dbbba76c14560c994f000bfd61297827d93a07ada88c05c5093bc582ec894c2af52fb772463c8a13a1d1cb60abcd604bbe89e00a2b57c275448cdf0d754e532e95ca13032f2667cb2b8489e5ab994a71670b5de3e16cf85f8ee62221f648fbf74e637a320dca9c32eb3b2f738a09d49c0c80c1e76c8ee17844d00d953d3c8d32b5a8a2b5500c847db50468c2c666cdcffee8ac621d3c81d1a1cceda7d003ef5e97815c4475af988452084413afea70fa634fdead5500c2b77b160491d928d871fdb334f5e75f61983a6c71a6c4e16b56c06c9dbc00e22373d0441f3322b05c6853348d8234bfb73781b262959a16172dfdc3682b1d0867882aca92834d6d74bc81040469249aecb634cb941b639c2e7ef4c32d971b14936482a2f0e3070201ab8990207b2eba5b00574420e874f45ab01636188d219ec7467d7b137b3d2b77af386e28039de2dbe54a4f0b076329c23f28bf8d3a6eafa2c53650cd628fb3c710b725034c4537f8d3c7798b18cad633f8018f5dbd664e7539629ffcfa456791816b36a4a89ab471d3258e89f93e4a02fd8a8afc3631db5da18ad17ff945d03c35d80827cf887a29c34200399382acc08a4b223d824a20a2b668c3ea63e02ea526608d4462a4c9195bcbfc8ac21c46959f0d64a8327b4cc56fe15b15bc8202968f98a8c950f79b7e7af6ad6bb789721affcb9d44e29b0d76766b9d5c94452e411ce8c4e56a480d482b0451e096ec0fd28102da1913d9bb6fb4b6ea1e5318e761d25f6b51dac39db1e1500f413d5819bbbf7788a8e6ce4bc8788472b4cc83f6906f4f786e511a345e6231be4bbdb303f5a84a3b719cf81d500ae2065cce97198da734337132dbf128196c9e35e10537eab3592094446b234f5d628ab4bd2ad2d20b04e9c2b93221b8fa83ef363509912396d45d21881ce993458d1f505949919e19465d2720d1cc3887a55a2968a74391e778c27be1956b144633a9c95313accdd19b51247cd307b856ae402235881d67e9f2a7d1a0d358a31be18b83452f85efa00d227d4c9d9490d1c7f5e72bb42af6c4af31dda32fdab35fd81914973c44aef79be587a232d825e4ac84c7b1e7ccfd9a69ff1dc59542cb56d140522d23aec67ac0c1a8d331ecf83a4c11c76fe89df5b52001f0e119173fa8a48aa6ebea40f0ef10585fce1782b1ae4bafeff09075a3893d17a69417b4b7be8de7ffca0208200fe899493f7fa066a6c19d968eb292e56130779313e2903fddeeee6e50de6ddb44c4059f190a6f6ea637d84becae73d5b2d7b769a0151cf429c66ba7163823b3e342ba613e048fbb25d3d575e3c8cbc0d19d41e3e4f42e44cb5c35bd20fd612ce310ccf6c3981a33a75ad870d2aa62246535f03c3ce7c9579432e997e99c25cf62774e9e25ec6163d9251a52726f04d9a0d9f3e59acba6d1d32b53d197a0c681d73971965df83ddc047c94002f9d7b1cb60e095eaa2d2a35aebdced370d993bd616af2999f0c659a4ec524f1ac4319c2c122665ecceeb00802d7d90555ed94aa14b3fb31f73410675032cb84d5156cf7ca08464c8fa81c9b19075ca49681961e12f760fc37c1ae1237ae0da9473c2af43672ca640e47ea4675f726a72177d4eb387bcd478eb6a0b35c7bc39ac20a8da32c579c7b149ceaffd0dc1c99c24a4468a5fdebed76b48481d1da16571cd81935d63a967ff0f5df366e83f85580e6e3af8f6af2c5fa162b012753a07260e66edcc249ff037cca1a45e90e890cf3ba91e23e8db5361375961b136e0c15b2de41005772b62beee0728c8d76eed5fc986ded5fd1a6b0aabbd55674813acbc9740056e9a77302ae3857e7b013d026bedb9651401f685407ac44373e79f041e7959e8a051f50811b1c074765671bf76a5354a62f4cb04f92d3cac180ecf32b938fed08b838284c242d524e45c550ac8276b1c9926d383ee122ee426234c5cdd3d988a0d2e268c0ea04d44139d9b5dafc8dc5787e6d8d0be60e0f272d14c9f49b579acaa26c647114412d0137c5d76048e27cce00e94e9177f5e711253af4175e4bc9fcda2819e571af9dfba370b940c1b547791468053391f8ae48d11f6d8dd6c3fafa56a05c5a5ba07676035e3e8ce09134d38a234b35f2309fb8c72f3b5203f1bcc5653b93ebd1695df260fc50d0c708b56d957f14daab4b501abcf93226962da1c37f999e8f4246bbab50d430ceb7880973164905a34e5cfdf9b97cbc9e8800ee905319d4e6aa9be3bf95e99711a917874eaaf5b8141a54ddb5f2d54f1422303b29590b20b8f2bc679c1fcc13cfd71d447356dc21956ffa555d5b20bf2d66fa3285c48c521193d3d3e342c06569c2e30c2abd080291d603a4919b58512122144230a32d059750893464d46d5db913be9a39789184a3857d7b3577ba60bce2d396eb599ec6c6188ad1e230b733e6b364ccb874249c7ff28e38b5f2b9bf78d17c41f389395068b1970a4faa0e457e18bf204639455ef5b723c29584f3ce1404d0ae79cbac6294005a15e7799a337f56ec91ced62c5a7ca8233675691b24f2d25bbebbb5a09f3d4a7f3ad0084c7e7a063db46c378a08615ca5a6bcb752bf801f177f51dbac2a9a8bf92c79228933dfe600a04747cc7790ddeb76191f4a74494fa9f599d97d47f2c78d96bab8f8d91d4176cee70bb63c3733ee01be93d9b0ffb07e65c604b8c1ae06a659a83957b46c8324b640750ac07b2287ff476adb0407bec6fec116b341164d2c6b5dc3a2a4c3d68e2ed98bab648d407e7a57550b7a8c6f7ded1f91a47e239d2a0ed0609816272e9a7708599918828b001fb06ad873135c5de9b1dd749046323b8ac3cbb5c03968445a07972fdcacc603dd43a4da3608e211374b10615b30f0bf8b8df63118dc69318ef005a34573c18f0841dc26b7d6b3e916f6ead42c6ab2bbf472a652f9c553d6cf9f72ead892340d43a8fd162f01627ebe9947613a9836a9ee7e71b232916240ff0ea3ef049000d2581af708a0fe64cd783ab7a8279e76273c0819608102c2ba8f99e1a677aacc8a29cd01f6e0e7ec11c61a2a63f9de6f80549f8b31171e6d44958777579f6b47cce09344cd0d05926ff1fde4eae6f7c86e9d9562c59177e056c7641404c473feec2e73f6770b8a483e51deb703f06bb267825c0799e71c0cf464a0648f12db8810350ce27ff2b07ae829f9c227dab0d2a72592966a9274a37ec5f74cbdb88fb448bee7cf8ad2a2b83b46bcd96f54131e8fd626da3177b5a12d8f714e65cae5340cd66f9151c7b657c75d98267554111746009b5c6853c050003f69a6f83bba63f9a399eede38499348631c92a5482525c331cda39471f55f593d310e07876b0bd369d39c19481284d0c86f6776a5be5e4123a9c1da709f73070a0365f2bde2db4b63c2420eb565d903f7640a8923abd9107c520e82d2997ef4b20157fadfc9e80003add0913ad738c5d36a4dae1d3de822cc46af8da451f8e9277440dd116d2b695b0ab20f2811f17a2e5d971790836beb8795e24bdb484e4dbfb408c1b1e19b0c4c744e5b64e6acf531466f6a25659c5b19c753b197ba69eeea6392038e052a2aad2a69a44715b5732b43364e192779d172b5d2040184288dd1d0afd254f638a484be3ff022496f6bd6d5eecb1331c8c17d43cbce265956f8776da21726a42d1f210d5f077f5562d5be969783272d5323506f48172cfd4d2390f551c5b9cafb7d50a49aa6a1707f5433adbb8cce5a4be66a1724e8312038dc8c3d01119197581b3fb768814028e895d102ddb382fcef18a12fbcab34689a88bdffab67da449eb6839757906867d7b881fff1fb59f262d18f2db9993b2dac916984513450a5dff02e712f05a810521445ce7abd242c46f58f3c6b60d6aa40cb467fe4a0f72c43523f853c5e90ed6b80833d735a163697d5aa57b7b8e9086c69a1fb9e356d56aeaec9f5acd98fe9406a94a704509b7fbe92ccda2f1457cf5abe120204f74904446b5edc52d86e43d34bc48a00ef340ee9d6042e27be0e9fb5bea00ce180af7888c7477e01c281bb9a2df2f3f5141d740d754f191a351a5a714aec2dc8015a2b841181535ba69c681549a96517778a51085900785348231c655a86eac2f26445b12ac7e584c63345aaa445785c7c9dfc2c1582a109965abd38a8a7a76dad2015c5c1d6a7708f1df96af59dc0034a4a5801613b9b117946b15d87da38c75973e0f5995fc90c88983223f857d7e95554b66495d13ca66beb3a9a120cb5f729207384abda08c059fcf62b9e110b3f3067a23ac720ec1e25041d9362060c6f85bba2c2dba7ddc3ced398a9cea48ae46e9441b76c7cbd3f50da0b8f5e8ad47295de128c370530e9fa4716bdf02a6fba741f0465615ca3f612c81657b30f56ddcb9d232887b6552d63406ab8a24f830314188b2e1182802e34cf10302b56167252822327243573b36c1ff714c254476ae51709bd2124dde64a6a2dfde9836e89e89eca2e365f94c671afb783f888e27ca0370a403f0ee33a6a713909d72047a39134eb381059f0f522d55e07aaa77f40f95ee598981c63da9d1679f2ab717442e3318554f2ae463244ec98dbfd7639bb04f9d9ad9ff8d85e7ffa20b1739b3b1ee5b3d1babe67ec616eac20edba1721058cd7f7c6b5f818e105bc3ae8f67397a3765095850722fa5f299fe324041a4ae842a4c9c0cd9e36e72bd69894e4ebb3e9f0e97c1f3116e93e36d6412cc7fe98c3750a19ed1e8f68a921df628792be91eb866ea1744990f6c90a22987e3e7d25611916638875f06d6f8bf29e43b799c298a2bae19d79975c8440cae8d56ddd52ab9a882043eb18de30017d9902e30faabfb93cd7b3392f3952ae32cc713a00f6ae0e214151c15003f5ceb7e41c7216f9bf77d3f66f18cdb69603061c8aa707dd8018ae438d7589c0819c958ae29f0e159490ba77315a3dc8f7c23e5833a7dcf24a9d27a9f5db8dfadbca814a527fc3a706c97ce745a3f052550b57e29ab57e2cbc6e5b0d81cc7af2dc47492605c7abdd4093ca44f6e0c80d1f6a18312893c41f318626356856690fb4bea2409ea811f3f1d77af16211847219461334155442d55d2fe0ab55d0514803af265728f18e1a1a22e9a790116d4f65b0290a77da953f058beaacccabd232cab919383e3ad4d31392fa0048b96d7575a9adb9b597759fb2148483c2efcca137ac6e19c0a6d4621316c82db7417b9d194118e00b856a88d5685628baac24eeedbecb6cbcc7be33dc8296c34f7d1d52cdef645b8cb54b949c04adf130d34416c02a0171a07065eeeb100f8bb697f6d735b0db5646e738c927b9e531a36fea6366d00043489b64c1f766b69ff1106e21f6b4266aed356670052bb379552ac9df692675012ec8caa94eaa2351b7b787ea4b9ab0954ea38696f2c2c3d94881e13764522f54422dc69e07a50b5a50ba8ba215dfd3c86ba1328eb3066519f2b8e822b3b5e083efd1888ab1c7f81f6ad2bcb0478857aa1fac5717b27887cc4c60ea525e0561dbab2885b36f7e78fd5e41511c69be2984bf3e4eb9222660d61bbee913297a7f4161f5949b144045482d18dbcb29d042e347e5b148c7a2ef8501bffb3fd31f83a4aa70a44c5640c31a3e6e7098ceb1aa06c453252ef9e6b6f7ace636503c4707eef13d200c2f24faf6735d1cc4f9090acfe46770e64af5fc7a3c3b628a2afb7f58de178f766e73046347aa765537ad5d23328ce2ec69651a8a7688cf85c80f51f2f623677a760a69e7f51b3d22f1def11eb20e157a8e165844576db6386001c5e568049f3d8aff8895c872344b043d2f6bd4093913ca5839b96350eb4c759250e2d002a20aa5b69db0227c8080611ff936bd05335ee80a2397c6c580b6f4f7e8c3c1cb744c2e8e13ce9a767f28c88bd3d24c502268243b17c750d99b9e8b5b8c12265ed8446460bca794cb94243db9d9b071e8a40ca481426b2d73b2c2380ce1e38202eed1cfc94e1000bcbcf5b12629438cad40bd647988fb29c5188ec5a052683064a9f0c8baf0db93278b9622778a57b9095a96b8aaa5480a3fda01ab28997fa4bb96b1a839f70ddbc91ee8a5ee7fb927318339e9265703beb05a30c8d161806f6f1d7ae854fa3fea92bd508e784ac378742503668a8ba348ae8e4864784eba21872abd3479329962ac928451b37c876170bd1ba73104ab4799e0a0ae692bbd4f5cb793ee522c0b23b4f1c27bfa7ab5c04f2402ca53a3226d38e4e9139f2067b0b96576d443a6c5ab3ed6721893f53ca40b09a6f5313c7b86c3ad494994289d800836e4e4684d85189271a63395a7154a16ce3266983c29a7a6310e4a669de184939ace1e68544499d384c206634f3ae0418b26307c4380e30cb907c536862c4eb911c1d7560890f7216c7af62825aa41928af1dda9248eec93f147f71f5970a92e44a56d6610ad02407ee09d52f7c46b8680b8abcd31b7b14f30eb89940ff5df211ac8aca75319ff286366cdeab4707c43b3edab2df8d0015930b54739d43f762678f96f450a344e05765acba2d2f8fcfc7ebdc548e3d9cd234dccc3be3b2ec6eb8f9281d4886b21161a67afee9826144b2204914b67b99d66a24927a86815fac22c42ba966904718867730cdab0a8467d2eb773a073b1ea14f24e0e502ccfb91922cdd2d246a8224739d015552e0b674de8bc5925116723150a2c79904e5ccc242b4ccdea5a5f707f93b0cca59d650ec6ea847c872e6b86319281b1ff6790b15140d87825cfd5f05e7bece02c90a895130e9acd6a42f141d35173a8c1d083fd04cf4098a4dd5275a9b8965939ce201341ce40b4c92576bace0a794e9ba1a2f2ac727cb12c6139f53ab722fa54f8a978c655eaf05d2ba65ac9a3a07928311811d7e043a293252b75ca6ecfa7c3b40fb9158ebbe85d5d42213a90ac9a108d786e3e6ca4f1353744835c582317a692d4d488351a7dfeaf784459d6f1f1d8eadb7235db1ce0e26c31ab6c753f0ac1959de8b773e6ed5e92c8fe56fdbb974f9cb293d6b8f538314e11a22cb73f4e05637f1ef6bfb870fb1e718721cdaded75c0f60e3e879bce79ac02081299315c51563f3688813cff3fadaed753af7f5623f3c28691aa73035abed7ae5b65bd78dd91eb799495167e73b986e0e308d01d5a101ebb26f354f594e6ad5be5c5935a8697c82a10d9ec397610932df99f1c36707c2f0e720d07a1b0986c50e3f2eac5307da0b25e41301f57b77d87d38f9096a3f11a5e565ca5416cc8352d1665c1dbd60f602d8e7cdff2211c0867271433fd2d81385d4bd26a7c36770f7f21dd8d7740bdf0b1d8a66fe5ab462776a38aee1bce8143f1fd1b833599b68041421868ddee8a7eafa9dc9873466ebff2ff4ff86a695668e85d38813a1526c022e0e30558ee37d2782490677e1f809013a9f08270ee7a967cef0f40fc6df73116daa4cfd5d0f98e883ccce202dc030a22fa8b6ffe03708bf9c5d4f93221a21c58e5946000abd3fe19be044024037002187d03403a57a845df7b11f5a7c631eb2345d00035b10ab8ec5dc7a25e761da7c206cdad4eb0751a264efc595418a2f231cd05f66c28c1ff8eb13de2355ee73cf84a2c245589b67de53417bd97d02ec23efdd3f3d9dfbff79def4d59ba0c1be89eaa52b8573a5d2248b2ee48f96d941fcf1b69ba2c7c410f5879ad92f53ae8a4b4ac0e840c9d3d7b7fc2647350873c929bfde7d3e0d416652d0cd290ec051537a487e71ec5381b8cb0e71d9ebee5f24c91942603311f3b083e3f6ac9e599b08e7235b17f9b202ceae8fd1991981920aeb60170230d0c82542c7aa851bd6d5f6e4de0f0c00f8ecbfc9fc033fd016cbf873bc713dcd41e726be6d988732a520f6c7e87fb2620e8c1b979a4f6a0ff908e5ac3d7ac2467aeac5d291cba0080e20336b8b3d6040f350c8dc7a0c2ed975cd828eb5f8d70266bf55b0ba68cfd361a11548f40bcc23a076e45d55a4d8257c582c9d9e2e68d953d1209c3efd34a13c792d29b076b9e1bbc8c382658831c7106476fea6e4b47f5cfb8086475c000c99b0a24dd118632742da840c6f09a90281d095bbd4c11ad17d0fba02dd9a6063c9264d8104ab3415ce164f3d129b56d8e9151c4a16877f97a80c0e12c474451d49c94e2c0d25cf2a1427229409b62955d3c6c2cfc6161bccab71c4cb3b004eadfb270e232a89fc1bd50509f80cad6a864dd461cde7d87375c57f9020efdfbca65d597fe3010db5eded724d223d5ccdb09d5f319d7407c2f1ad601aa847fff5656cb651b9450c0990fa7520ac24f6b9d6ff3c70e49bf8ddf43043d1c4d0f4836ef7a457d5359d71c1b29f6e73ad1094c6e156a2bb2329ffa7fc621033fefe857ff5f3a6d07c5ed60ec9825a2a3bcb0f97fb0242a97b357394374685e848286d98983c51ab4e2387c06f101745d06edec828b93b293f91deccd76770a95bd6f796ac81473d4d201d90e2ef1805e3dec993fa3c8b5efabf3e583b26a16f4ad3d0e0599b052fe561fe44ac65d76315db9555581ede8d85d4e3625056da1a726e6d170d727800dd8741cb3c7e846a1285724d6106c27e5567e16ca50afb09024fcc60a06e1f032b2ff830926cc36a02e16bef1bab3c80e21fff01d62c7d44961073a1d9c5b3e7ba0bf2b8f87ec2385578662441177e26b23237b209330a91ee09d3e36f4fa3cd370e4d006235c67ee7a5a5847949d720b33057e6bfcaea86687702dfb837992d6decbfbcb85a18ff4a6d5eaa9000d497ec89a2901e1973761cedd1ed731a503132fc4df696b6cc8d967227cdbc957cc2a8ca6698473d6eb036ca7c1c44458590eafe3e6d8a9e1bb417a0422079d43185c7eeff34a4575ea8800aaed5ac341eda7360fabec8eea63ba02a17128f057ae638e2a232fd08bf0687ab3fc7c18f5ede8d353334dcff48e54b2847fa94e2e4fb0ea72c03b62da4ad2c36fadc38c9ee422c7a1ef2c3d1f8f7a410fa5973b4f53098416f7c827342a469c61a232900315632695c6236ab25690f7895fb010644d1de9853328bab20133aa7e3656b745951b0f27e8bbf0aceb2609fd259eae66a137f39e4ee13c200a03a18d8f309fab0c96a530b2640659c87b7c62eb7ed6544c8c8971b128609713cfbecf37439971b0f51529335791b4a74a6d8ba706550a6d1b83ed9d20c0456f3befc31041c0ac8bedcf043f639f20f1a2af9ed6ba79c5afcf2454e09d41aaf102225e62265be3335ce5e122521033d97caee8d9c9be02fb1ebac1e27490d1868914acbef607fb318e5dd61ab18e4d9588772dd2c875ffa5542a3b1655bf891e674382a53c5fa1b912974e2481f51609914046b518c847a4fbf3e07df4e9d7af09908ea0edd29486fa910c160e2dee194f4afecd5822cccb8ac33879876ca20bf6972d19d691191577efcc4e83e2230257eb890b2d88a378a05386342aa192210517f81aa6141b2516a2d9b2722277244b95c6a5fef0a5365a4c5e71a1165a29a676fc9ed6e9f590d48ca9e622772be0117bb87bc3a7c9b46d60edbcbdde242abd321caa78d622172be4612d90f90690c30e29513c9f5cd3b8b1662a1a62fb2b721868887ad1ad0b7672143bb97890ef6052a0283f1939ee56680c919505d54d64794ed7b6acdd239df17b1dbbf075e53656bdf4e71a8ed04cead879adb1b110388b149013becab5ac919e0cbf84809e327dcb46e5142fbad4181732939232c4fe2d0920ab23204e3450b34d4febe5739940f069446349fcf6605d1016d006e89d1eb63c4bc060b26a0dee18f6b0c8dc2017731fb5766bbf6a5525def300412d182a965f3f136112389781eef335cbbe6536bd0a3f8017a82d7b352f668e9e15fa9d08ad44854e4d5c658e3bffa56ed922fcce83512206846ffe2e81aba0f0dad5ea7302666b69c622d4c0f2298ac03cc171726b2129d4da8b08c9a00d9149e4c398386043301c4d9a1327d8f066dd059ab21cc6885de68ba7661474473051b70002c83cc820420662eaa667a422e08f070afae8eee8ef244eff26a9b582f8d60b952b5ab50e3ebff6988c17a2ded6a10492f6dc0c381061b139ab09884f338878a1007ed01a19925502a259270bc33ee389e568507dd29f06348d471002443c25ecbc38481a3f13b8fc87db468c3209fb4166e753e9259c62c86fd8f4821e0c3ef8c9fbda9590757a01a1208e736a6715789a96c77a4b8caaa3cb6c0274a756e6c9da47154dea06a4171df4effa9f7d7108427658e3f47e310a6051dc1301e2a3ddd99f209310e954185dafed7a86474cb86b42d95cb16123dbc4cc81d151c1cb576962d6b0ed5c0f51c84d256dc22dd4950dec3b4057312a4c12cba40893419e20642163fbe4fce7e81ccf2410185eb8645bbf60204e199e4db7e3d023514056362ed7a155007e9c6d36dd678d16d7b3f063a403538ac1e8e51377d45e2acb4280c6f60b957f234e03c9c76d9b77442fb05dd56ce785a6082c4a061823ccfd75cc4cb433fc8928b6f4bd125ae3673958eb24f72950227080669d4d9f7d9886e1a61360e9344e438f60c9a879977d000c59b625341b817335fbabaf5f086b173f53f7195fe8b00fc4d929ec6da16d5d36db3a05ff7061e38396d32147a7a30c729511780e6d969d1fcd100f7b76c25a82c14a8d0cbf2829c80142ca585d121aee8117c8570970a515dfe368d62630fcb1ba816050ba06e3c00a2adef949865da7d77239bd193f3f548609d6d6aaa31402a1a437a2cdf4cbefc79dec828c9110d17791130454f5108d6e24abae5360285066f3261cedb3eb42a3a82e10541e80950ab4143936a311519008ace6f998ed38a409b18643c8c26591a7068f4499d450653055084dcdaaa6fe7fa696ed76229f699eafcd679f313b44b925d2183d337554e847960e702d3b2c805f581851e4beddf805d911fbd7d000e9673e9f4d1b8f3205e5aefd965dd03185d9ed41dfd6f0589036cf86ea29fd74e81c1f93b82add3a382eb00e4c42c40861546ef42d1a2444d2d39e0dbab93775362d3d264834be72f8590597cc8f1e9d099edbe78c7ec7beac0be2f136ea56773a17668169f42304469a9142494f54d48f9757c532e156a0946063beef78c6a8bc63d748620b6571729729fbb7e977887bf699931b0bb969f8b8a68867d3113c76fddd399203f9282380bb8bbbc56b16e3744e06449aa8d85a936dbbdad1d5bc052bd7e26f99604937e8e14667c3054b96407373c34dd72f88e7a657356ed8960d1a9a2d99083883fe9828a5409ff31734f8967f87b44b43d09aadf09252718d254baba039010894d5b132005e75e71015e911fe9327d47bfabfe437fb456182d6c4738e03125b71352a4b4dec662e16d73e31fba812bb32874d3de46a4978d796534379c427842da77162c00d4144952c56a5bb055405896352d1b2adf58c03c90e933696253efeef0017eeda9a1ce8b0ff90c4b7d3fa0650ebbbe6adc2d2f5397ab0307409f5e4b362268d05d8ce064e2a992e65dab88fa2f6af3ac155ca767f540e5e1c8bc09cd4c2ba0ca0fef1c5fc850c5b7c433571417cd23442fefce8189eb2b6edd922fde5987ec8b2ab2ab353a05d7560d1eb70d5254279f20b01d35fe24eac42d7b3d0cd6564a049dcb5f41b6edfe176b0373919a839369dd784c0cb39c4330071a437edf84ad1ccb28e54a8aa1ea2e5067cefc8368ba475178e21d0799bc5da1634652013aeb597d0ec91bb5c11e2585dc8ec4bdd158a12b80b831c745e7c203b7ee6df24d438ea9472f53e90a6aa6e652439f163116f60515c7cb3df698d4f55d8da9a3b9b4965dd4d611f2d03ced09046f5090c09b5e6d91840722ca85e81c43a73f00aa69d2ced5e077d306255013564cbea0151fc2591546db68e43c62e83206b249a4fdf0e1c9165c62d5c0f8ddd0264208e0fed6f874ffe6af83c4a121ae5f8a61eff0f761101805b6ee27c4efa8b062635d5a654ca73b51bf7da782c2fd918f3a70ddc52002155928ddb525ff152aa61263422e9c8018d9c0673922edf037aed683d2f345f8810ba07254235e713dcf946806e7cecd4e9e905e9f0235aafcb829b849870b2d22a11b336322296af43d431c707bc199bb256961864dc71f2dd84e42684f114e7edfba5d949cd44d44b5a85a1434d69343bb78078e138f2fc7bf545568ab03224671365c7e2c912f062190c7d5fcd0d678e7354eadda1a8072544b114d0ec1f0d866fa0b77cad2e7d700d4dded135d82358933b78a30d6d26c93790fcd43220c13e24a2162210071975b1c6ff7b08e1e3657b2f9f3de4e98a0cea398bfcd5c95d3edf63e9227e55036335fc94f80c6427025b4817486ba98ec4e7ae223446442db2aa2d009a56af5082ee63e223bc2f80b8489c9e8231e113118a6ed51e83b8d8bd8dadddb0fd48bfa516985120fa82603402644aab0c861c317d7d66ae926d394126c2cb0623a2d78f5eac70d25eae9608625567999949533b91ceec59ec6de03531a0a039244b4b521d642792160dad23c8ab4b0c26a806b8b5d3e63d4bf84ea8c06db0033819aecad90088f408a44e10f107821de8ebc3a5591d8b8759792baeced1f2da4a4be3a76a839530533001e657dc0202c40815308f8959b734d15ef5bcfffb3b31277f43fda6304b8257f6ae05e56b0901114397e2c70e5164441475288529865e74cb622b117608f262ef40e89c88e7060a13c35fd0c4806a8b0e217bf6bd7c73925ba697787e2a258c16c9ed5c4d1c98ef3fc8bcb2eb1f908e57b223bc0d0b893a4997de3ea65fc5ddbfbeeea29a3a05ca6f9797ca45118e9b196f080a5cf2f4d6e34a70e53b5c5150f9e0a6d3588c3a8d20d4000adf65b6214e7fd7b8c45aaad26d4462390dbe57ff584516568129758003c7893074f02d3e860314a3ebef3fd48607f5442d42534cdd0d2976699463985349d15eee99a30cbaefa80a7b33bcc241f9d0afb717ce895c0c3d85a66518214c97bb60c8618f366dbdd1e87f91314390d96c3ed9f192e27e59cd5511c1712fc5011b170c1a7cbca4cf3c73de0f1048d535ecd0900d8da2b1b3162d28a8950a5d60144ccc41f9784a89f17615edeb15ee3e86b8bca3a34186d982fa93e6a1351e61668f64ebb4dd3fa03ef89bc5888272782a4a6eccd55c1f55a014664cd4dd6080b3ccbf8f408efc0d38d7e5a9bbb9ca80c91ffb4adde1990e46504237e5e2855f46ecca656b75b369f5331e4f696b5fc3c307040151ba1956068ecea8b48c1b1fcc310aa77f63176b894446a67a3024ac98f2ac136939196d465b064b854bd417cd62e6b64c870cbc72ace961deff82ae2a5f4a9c87de526c1be1b8540df3215d596d4c4a699019fa9e4e08115168cbcf60a78bc6b6d9535458cc6ce83a52e0c44d7e4bdb1c18654bf3977734d8f10a998122a748705029c3b1c04e51b162085b74ca99ed34c70a8ca09c8dbb38cb57e53b830d916c03c81a7100fcd72f1476e912ff9a297b8f1eb90aeff4956bc20e6cd69a49d084c126c10b53bc2bbd1d007caa94e54fae13c0bca1f539268a7101b0a62ea4aec3369dc0f5d2d884390daace39c6eb902dd63cf9d4af0453396d07c9745a2b56825e815543e0bdc16bd6ccb15e262c75bfd28132fc55db18aca7a213456037234a6c2fe0bab181f79f7dcc59edbbf9a046a0836f046174e81ebe370d43419c5f4e5b5a75dca10a313628d0c4cf1b652433151960ad261bdbaf6123af55994001047a6ad2c57ea692e3121a8f2fb4dc5a3800224be6911c3fa47515bdab7ac56d52624147daf230b5aae07b1ce36dab8c42b279f5ce83cebb45ad02b7e549324efe0a3856e31a3c50df6e52f1229f70fb8e76f72379d752228c04d6f2b4ea56f3e6a250acb829029b7055adaf8a321f61c99767771e4bd3e28249665d975d323e5171d7f1f0fe0e11874c4d6484112c21a5403299e61cd50f2524834af9cf1d97eb349d3865b648bb6d0b00bb370dd1e3d7993afe4dfdac6cb87af9bf484db333bf38f21a2b89addb251d21fa5108bde52eb2dd55e9c0878e088cbb07cb41840a0ec46447bb2c439ada44b923cc5390f240d41a9cc087c5cc2654e2280a58eec074c725fc78615dbac3b0cab585d6126132ac71d06ab48a15f88fcd3471c8a23b73ef807f588303011c35a5e3572bcee60a0f2b6d28cd6f99a2164fc57e4c6e488936593718ecfaae7d1ca323aa2aed62762026ef4e2345faab9dbb0cc21018ccfaa776dbfab8e2024b07da9363d4b4a6ae76f05a1ffa1eee839126054579e335c7938ad1a32459ac24c9c269980bace727c3480d583ef25b49b5796a74230ef98744297c6ca23c9a7b77956405b9ab10e77caf4e40ba634ddfca6375584b47b5a6f23be5be7a52234a0cca5b55c243936c4615b9b12db1447d5c93730d497fbc0b73005e9f439073932a47b9a2037a2de8ef0c5a58953274e9c4701a6cb6394d758b41713c2cfbf249dba39d94ed39787934b4442d70a0585f646c6fc294a10d16f31309cfcd9bf9a5e0d5664fb7f36ed61f50538700063fb1f129141cdbf1d77d250b99945935bfff34c41a8c7a6d3e2b3e699c635f0521873ea65a90e4b4fd932f4f37f6d7c60d131f9bafde8ae2dbdc1bb82457fb685fd1a1932328e7be02de5460e72bc6f51f8c2c0b440cafd76211329b8ff637f0e9791f680bc5996544e127b94f2be100143b2997bd1a54665c0916959b15269c6b199a2d70356bf338e50489a6d6a29f3093e69273febb56c1b475e853c906246718348ddd9bd7c200a1faeb546277ab6094e6da350b446581ebb840fbde4b06439f9110c4facf3cac35cf0915fa838f3f6744baaee1198767b2b791b1440d55b50ee21446541dc8d8dc7a979f5950949e65ed3553abad3c4227fcd54100d5d55e19acfbad05e373db54ccccd08ac34c7e50245613789d21a5b7ef0d61740016c701bd361f04769e444b4e76347201f0aa15d3580f4d3fbaa632c81e23b84049276b2e2b7e9d9640f599cfd2a508615349f2f9b3afde360b44094136eddc3b6b853604251de5b79bb4ca4862c21ec9e7ae701ca93208b091344a2946157ffd5bf279ea289c017d8ed7797e12871d793ecf11506346266e082817e52244734f12be0e10ad887efc68038598c6c3c8e72e9ccc70118460f5109857cfc354e7de7b4c06a1d8bfaf229a026cc035725d6345f20a0994f15040b0b9eee6295f247cf63cb4bd723349f01badd063870eec38da176be8bc5d634b5426550ecbd24802f640a22990c622b153fa91339b32d53323b41d83c4a138cb2015d1b2b89690051ee1b75d18794d5642c6e19db73d7cd9005b909af5851c1d3d386bd62da5664067f4bd3cdeea1d5a7d74bcdb7a7829647935066ea950d9d61f54baec474725a35863e62cf5fd28ded7284e2d2f13cf20e64024920837817fbf6f4c6c42d9b8ff6a38eed8ef8c6f0cbdfe0cb725cf65610985008756b51c4be24931033b3c72399f36880d7a180e71f863f5cb0b1f79a4ca1a1afb64bd82a06fab42e74279959c556615a397214ec9d8eac66640cc83ebc977d5bd4d5eec903cd832ec4e41159c313eaed9924f3194ab6be50bca36150cc6ace527f3fa1bfe4a71c1c15bd6f672adc1500885422678b6c0ad2ed3131c54c1a750fbf2a98315529d6e419c43e3f726ef25a0b1f7294f4ac68692240a194160ebfc4e30ebd8bd8475226f5312d36b6745076403718efb0e5acdac21ea5c56fb00d66e2db36ecb6a51d52ac1dd9ae0f8b9899211c30201c6e39ffcedce860699efac4b847603959d03b0cf00929d8038aeae90b60c0ddd096417edf4452da88734be0dc63207f88a6d3eaabfb17d6c074baa55bc601bf344c6399c35f8c3227eb11dbc1211f88e724caed10282d0593138d344c8be9dc34254175c162f4efd57a02c17d2029d1663d0d595e70071f1fd3f64cffac46477e085b7875ae3eecc11092df572735b41c1d58d00abd93222f46c906cae4690e095bd07590b39e9ef38facbc30ba698ebcb6c21718c5f4415dbf951ec04876dfee80624906976f580b1ff8b55b924ca9807e0126a7b3a0692cfa3c9f38dabb847028e1a1b00b9232090ace239f336f76ae06885102965afb3e05e12c3c73ecc47dbdf07cadc782a263c7d00daf4dfa1b8dc07aad9d7972143257354c0575e8394fa12f59d0161e7b5b616cd4e58a800561c040f77ef55824104cb66455727850e989e7209c796aa9b428425d1b8881c49edfc2a454e592e7166d391e618c9b034f0d1ba689b5128fe97ca064336d3fed300fa8085a38cb651d79031565e361c1bcd2c4db56c50eb7768e070978ea06db971888c3d9e2d379bc0ae7d212161d490d66bb6a5f813494bfcd8c3330ef187721a70651e4fba80e965310ffd16c30e7ea637f1e0a279fc64499ef324bcfb793ab02091091662844e3b347c87893d0d51ed1cb7256d0c2761f8ea8cd4dc04472f72d6633f5f466e84b473bcdd1c549b39825c65745a0027ba189746adb02b9eaae1a295963b2133ce02cfd6275d128d5f6d44179bc14d793c5ee13592cfd474f4b023db431189e9e1e104b5f2dd458a5668932f9641edb03967f5e5812d9fe38db315e10a463426a0f7af12432dc9151d3bfd0e8cd2916a3aa0587cb8b08c45ae3ea89f844372b9b2b83821ef59d4323a6004264549ae507271a975ff4de5a5fd38e09d7186e772ff02a77eefb78e5782f386467d726b4a79ca811636c1bf9b428827f3468a42fdd2e1be18e7054e913283937e5ee6969e962fb8eaf16ce6461acc0c2ba168ea03fabc523c7c74cd5be2dadb73833efe454f1da2788c7565f3d144b7fcdf2992f05660daf65a83c630235af927c694872d2af699dcd0a12eddadadbe56607d9c5f0d5a04e44a46fc62f16772ec63d6b042c3a29223ccfe6a6591271744f9ba66e6f576fa858d1d54168b068469bcbe0dc95d64a866c633ea6ee326dac00eefc13a21050575835e1c5d9a2964c96f700048c49e5766370f8b2e278d47045822689e9c28615d5194e45f51162e4ea9c00d278eac5ff0c152e121459e13e7983e257af138230058c846bb25bef4efb02924e923bb2a63d1e2545dc663c30f840450bf564887530c7fed372d63bd3d8be9c50cf23a3bcd28b6b53491573f65562d91007006a608644794f106fe2a2d54eb3ec1eba7ad5c7e9cbe486a3e03c529093bbe075121544424ae9e49268bd98fd0db63cc2126070e7465d7104da4c3320587b66d0d85fdcde8695443ac4edae06069e3b84f3d50d9dcdb7305e19cf6eb66efbeb53b34db7aae7fc913bafc702b86be443286a86251754cadffe666d63e60e44cd06a24a2e43ecb214e4f64aca87ef9a547c7ab2533a9db8261b44520e5d7ca50f3c780e60918ef16d34fd255acb90ffb0c4df3e9bc4613857ff99f80e3d4df534ace8ba985350e6790c8b910deb6865aea1fee37c2fad45836223e204abaafc49c1537ab184ad7966f356ec603f3a1c56e23acaf34361bbde8da688ade465ef436a2a263a3accf46b9f585f48a07761a9b34361b5dd193c6a61b0fe9905b9f89ca9f7d246736d777c54462f0607dbe1e65d00162c2fb01010e81661c5c9766ca0025e9a5601007e44a78e99924f0c4cd2cf6b1d8c162870d84c033cfc287adfdf422dc12c59aa702c1fc8c7229a8fd7040b143a19fd3f3489b0dd5ae37c150e1327dc69c71e15b090c6be5870fb3efdeb2e366aa8ed487aee386e22c22568f928617809ef6962e33178331d362c84d70127fa1a67dbc706af2e86a325c9c7993bb1bd4c8bb724e7b1812a4347ef03ca9fda55a1af37b25052a55ea909a06e65c793404ba7461e0694d70532ad6c0b34bd12e2b37dcfbeebb1808643437bf1f5cc5de779edc6f90c03a60a0abc449fa0ed57b01debaaec35f3d1fd9c5547a52c9a93756383db200b6720b6b584a7d9bc98572d07cc28ef0f134b247429dc37a08928c7a0cb7440c56bf7fc18e6955791bd06d63d10e32e4d3a927164f80d42e835bc025a69db13fd639a58893bf31f10ffa50de49539ce71279950e40d9f0240c65e70bf9e218bce3f928ab839a995b633174930bb2bfb2448692d2d154b43ad628681e9164c49d3363b7bdecd6cf2c40f288c443a9073b957de9323bc81a0ad74d8c6f91d341b3d1326a92b3f80c17de671426a323f36516f96b977e4ceb24fb959a0669309c3e48ce1c15f9c14be1b2641f38e01268a34bb3d02e3c9efb1af10afd5a040596c9901e78cf71b3df29a318cf79bf17a8ee5d6b20898bdfdedf04b6e46a0c321816e56c409ba6e95e1e1e98973558fd8dd0fda9a826181662903c8f62895c72de69545389a83c22f4af29a13d5ee5263c9e78ded08897f8c6667fbba87810c726b165f3015ea696979f915d2af3fc7316de3d063a547ac6de935a40245de1c74793ba55efd508c589282aa241f5285b0477ca420f00d13b4a23e2371c4c56bbfd9a86249cb041607551224d6a5cfd6002829c649ba431c063630ec76ecf3b754022bc4a6793f3b34b50aec39310b9cff2a73c92e3a6899dd07af72cbf8e5fd4c62a8334e9a0ceaca8e20c8cda0b0379b90b34735a71bd1a85cc6c177cbdb8a9dde59209d2753f34998672b7ad0a7d03e5cbaf6e9002ab81211bc0d1555d187c5dfa5ba532bbf44e7301d5219473fa698aaeaf4e62f8611e51d4574b30fa3cbc7e9babde67ffa7c9c5e3a3b2d1da3f6e513ecba795e3e845c5bed4f6928b7000ad82879e89e9386bb182d84475fff1ed65140a5bf6798bb19684167cd1d431a7233cff02092429e964f28b9cd3a552c88d822595208e066e4b19e28d31ec173976806e9ee00888626840383ba224b459386842a498c52768516da67f351584df0974804daa3dbf53493f6cb94abe05ba3fa8462c21ee74c73feec4fcc4e8848363b149485a52df8434829082efa1c2600bd5eaea58db02d5329931555a7d61cd3cbfd9176f523f6a4caa748e20813409f749a679f12bc4e8262f9cf25a0b697e16d5a652e39c44b66bc99905e12f2f5dfe2a1223db2bdb92929a28bca8f4ddfa8d6e0af6f7591f0f4417e95c6dbbad13305a9f3ac76648552db3ec22c65b8950e6ad9add4b152523f347b910fb06079c98eff457823b0273a9c7eb41dd42a446e138ceafefa49c6993a011afd14dc4d838de178d360db38775b995cbf6e0985d84801a61d4368b3f7ce54d938bf8f4a03d056f5fc159fec0be370ca3f91b58a08862f1b43e4756977629ec299bba6a6c424a315204751878200d40d59aaedd3675c2a5d563971112a10507d5055808f8217a519fa985b8a389e3a6eb504495649d47442203b4042dcc8b597a3cadcc5c38b633f811614cfaf36c00a5e3b50e716375d076d0a226016d9c7f4bf4012a878b51aa63fda7ca6eef3fa65de9d11b24a090709876893a11edca16e369630c5d31669aaac6a75e3b07a9aae7d1a4ebc6817cdddcbdd07232297ec412017d69772718ee3b5d48dc984c27b59c0b45aeb6853257a6701266ea7d1e0f36d1d071383250eac584b1b8900ce50ab547350153d46e46e16e6fe4bb8dbd9e28a50e816513d097ef926402e5f4ee5ec25b474ba3c3710cc3a2a0cb8aa14bdf3ab4b8e0f7542ebe96f02cb83acd1416de14563ce51e0c6ed28aa7d010d89aae2f38fbec26ec1911df0bcb831b3b348bcdb22799c0e433c10721455ce9adf971086418e7b8cf545da25bb42bd029068c8e18382f37f4e02c77d6911f3106c1d2f4d4e7c97869a73989da34c1a65aed18e3b2dd9a302073971bf1f4fb5c4b91f5d84bfdc0b3ca6971319f482a7c7c7814473a0097ee27325bbfc8e4faac60b6a69d603e5f91b7683b107e1be1e7c7196f3fac07236527415e3bfb680fdb54f8a5be7e881f52548f0add84a9069e75c2b6d1e42b8897d3ce162188ada17fa884bb849504e76904101fb434254c110293f29502798f19b45f5a4591ff3fdf66bf29817bf22691dc9c8c73cc697d007a143935d096a110170b3e1916b11fe31ab99021cd4df5cd88cafcb127621bb8cfc08127d37c2b2668e31e53637a6ec517068f58016ecdcaa4c909838f0e86362c97ddcc01553c4fa8bfa9a4a1239ded5e4d483eb7f8107570be9f74702543cd2b79ac888e991555688b0dd93f07af3e2559bc59c3913955cb4ff5172cbf93cfa7c442410aa3818f8ea6fc4d7a7978466c310155995a58290735e572db6475eed3c24ccd2e9ad1f432020ec90f36cc5c3a729fd8844b492a40a43e4ee3f3fa583dce56a5424bda587112dec749aa069bfffa6a077d62972a42446dc034e808dd6481cabfe210862b71fc5de39e2c3de21123b9ddbc6307b51cf681e6cc230b82527653ad68dc5a5d09d55f8a17720766085dad6dff830285161f71140e3abd433d98980a29aa7617ee057f539be4593059b29d770a19ab07ba375b35fd3bddbfe90272cc52a69ab1b22e80bb899b06b11eab5ee56a45ecb9236abf6a7b0afefdb06cb882b33222c61604ac702c1c0e64df040b23d13d3c8ff4227e9abdbe92a9b07171982162b64d8c3983dfbb5221dd4b5766e424ed0da96baf28e494dc09cc5624d5e8518d2c413a83e2fca64b1fddf00011c407cc1bc2b950aa2f2fbe72dbe17b6726f1ccd903f090d04e20baa978dff5821c7a561cc0badccf6da66bb2d6c8e0b161d2f93d61736e4849e1818e57be3b3de124a8216d103076e238e180195a626d27c41839c87da86adc84670e5d0c3321c42bdd258f8002aa0f8e4298f16d009677c3584f7971d4ae1f28f40eaa7576f31508aeafd2c5afd74e686c9c1d241c99ee6b5d2b79de978407b7306140fb4f44522c5c328bae271fc31519f2efa2f8052892fbc6854e3e40154c092cbc9ee5fb2812e08876c00533b1c7b0e46f6997336de4b499947fb34af16c0270fed447b9a24ed03d438160f3cd58769afdd353177fe723f093992ec514f5e3a4d8cd9647894aa126c8f083dce19ec1420caefbcbce14527a498958b1f68f19f4e6fdf9a9c632c55e64c26cb88328a73fb4338bda042a00520c6f7aec4ff39bd5491960463a3a885024216702fa46cc895c3300b8061cc307fc37d8ed60fa048d9b94610211d8badf380d4cb3dcc259fefd306532627a2a42a2c8cea3cf22a3b6b535ca07a0ce639af211e65fe75f028d3e8b642628d1c79797e9566741900d71676077cb373edf92f08f0c863f2cfc8a6a3edc60baa9588e0eee0d0731fc6d9bd8c198b397a776a85e4b91993cbddda15972d0ab8b0350f438079a4ccfa76a5cf493e116daa6a9cba013749d3db109a7b65a2ce18a90bf1818df25a869ef893f40bbf1c0cf2d18be156b3e69df276a4eb4ae73213a87d9baa20baf19dba9b958c15da84a83f827df2a8a59a1effb9cee57c0ef4a0e1d0c516b4c75105569905d663596313aed57f63cf3220fc3316c9acf13f38e049e1eea07ed2f606a029a7047f9cd640b0f646c58a8b4a3b38b513539c6c8f6a2dd318f3f1e3ea64f0ea8c5347f93bd73877a611025c8fe65939c0459d5168a732e7dca2824e18a54febc419ce4afa5f26ae793107a10e62c3a5ff3308113c9c16cc63b3e3ceb5b1756eaa1407d5d228e4d26e33690cd295974b2568bdfa65877f2787e82e05c633df129b9e9ff2fbd27e0b04efbb63337e8487d7638fff6477761b3206c298fd0ca9b667e32efd3e946e5354f989921fdf3ce8272135da42b3aaad197a8310e9c9c466ea559574131a52fda2bbaa2893862d3b85d6288a786f60f61411efdfec4f9ddf54a11d27319225d27c4d842f48646b164b7040afac3c95930585d493a61c140804d3138be1beb16e846ac54baf978fc0a516b808c69bda81d1c8b445c2e39d8ec44402ce401c23cf401e2a3b32cc296ce64ce89a3df6db8f39f13eeedd9eb3abf24b2a136d1eed608218d1042f6de72ef3e0c740cab0c388f2eee759d4ae549248ce657c518bb35b3c9ee7ee6ca4c49b9992b2333f3644ade342eeb78eebb8b2fcf56e2ba8b1f3baf48a7a3ab79a92b5ddc75ff5e53f2be5f99f7ea5d1ddfbdebf43dc6debc38eb72f4c829eecc4b311edf186fee0d5bb237bdb737f3eeb1d311dfc9609dee6e98f11803565decbf34176544945948f96828b3cefa11904fb67928b377b484a46c739bcbbc75988b09d5a1b80d5562c9605d66168bc5756b75eef1765dd4e97ee978e4ef9db9774693f16e32ef8e6793ddcccccc67666632950a635d0eeff8aa2b55bb1cde6dde5dd575a6eacec03c64b6b9b4e1d1ba0dd769991bdeab61717ec02cb38f39f3e7fbbad8e9c8790dd7e92680f2d051522e3d3611d4844f2e3d76394ac78e2ff66339a4080000b03500000000000c2982b5bfb83d3964ae710068bf347ccfc371adf3e2adc7031b238c7fd724bb17bfab1cde6feee231dfcbdc388eebf426795ae417b90d1bd8078e673ce486e3f8109ddf78919dad391c7765e33b8f3b37eeca065e0de0c6f37bc0f11d1cc40dc7f18c8338c2c70dc7f120747ee37127762d6870e0ae5375f7f1660dcacc3ce4b28cf7e2f6f0d43800708e1a8e3f73c396fcab6ed892b3d3dc1e9971f6090353fcd2f1e3ff63f318cf16b747661b7058e335dcc595195f6d75961456eb8a701c57648619669081c362c9a041838dcd8cc78ec7e63a5d53a554eaba9aadbb1ef95fa783329d92638eb9eb72943e73efce2c41c2241bc9a5c733e149de2a1731c6b85eddb5e9dc1bbfe1e2780dd77b8d2bf3afcc5368fec8dcfbfb1bd7b90f37f07dc081e364a97ec3b7d8753de2ddfe5d5517e3f1caf0798455d01916c92befa57b973eb73b1ea6901d0fa547bcda9173ef31cfe03813b3066bfe1bb3ce2db273c32db293c3842a15b0318a12aae4cd857be9becbb83468d0f84bf7d1380d7cbb4ea552e16fdfe77933f7aeee714ec365eeea9e86e3a03a1ecf9bc1abfb1997815757a787e4996f9391b98ce73d7632325ed6a0c4df1702918374eefedd30cbf8b1935cb7be47cf53a91e3bcf535da58a99ea111fff3a8defea621e36675dc667e0d50e9bb36e73d6b71357e381a120e418a509a22cbb1296569e58f1b079eb2dfca3749baf78b07e94ce7acc72c6675c863264dc9a0fc9aaee864372f7ad737cf7dbe44ad7fb6e8c3759b766fefd5e99ef614b8edfcc37f33893e3ebfeab8ebb986b6e2873cf64d9fc371c9267bcbb413adb5c758374661ddf704896c1d2d123a7f86678a441e3dd0cff6e4ba6f1b025cf40e358c7c31434667836c3639783069ee13368b0e13ec39d477752c1b9136956c962570f6757f3cd72abaffe7dabebf46af58efb66b9effb3edbf1445c246b90bb69f5d54b2f973ee96964d463ce78a9f5aafe3263380e77472bfe8719beab1b7128b3f7cdbb211d9a47556c388fb29d3f4239cb429b43efc7da7fddbbc76883eafb3e1bf9fb8c98a3f3ef53f11bae0a15bfa1e2aa1be3cd0c1200327ff97b773c5f50eeee9c54701aa9916ccc69a468bb67e479d4ad903e99544e979f55bae572f9696566c6f358b0f0a9b93273aabb5cd54f1cf7991b16c9338f1dcf4cc7e3dd90662f66e55dee2b8efb514c4c4cccb79a1bbd19a4baf7d50d8be4d5b7c9d5acce9380fc4940c66ec5f7c51bced0e96fa5558880fc3d765dd7c99b801cdfddefa96fcda9aecc635724c7fbc3cd32780619c3fb77431ad9bbcef42ef7d59dc1b4a841499f3428df23da20b35c711c667905c6a1cd2b1ea3e971c51b29cc601eda9c7a8c39a19753dbb6b56c87d96e7e1df51b54ea8632afb8a18c99472155c1e2862d39c665b83fd8e43eddb6c78e07b58a97592853d961c186d2a7918e8ab66ddb3a100c71c21a45b3284b9f98d3442fb11ae5588f6ee0b8e1a19777021080bb7de7c6c8ca374696ce8d9175c3c5716fdc2ca80809009909cd5ca71b694a5924a1748be632e621183eb43d72e6d1449a2c30738fc121c8ddc3e15598fb27b134d284a26c73174d68926bfe3dd33c9309b1f8cc55dcb04856f1ad85e33a1dbfcca71c6d1b77f9af5b31ab7026548a98f2cc25c41b798e3331b1e15c4296f2f449b7662e4f8bbaa5e2dee5671384908eba15a3342128cb4f2a55b23cd7e9888f7951b9a84e2a79d565c7b322f5e190e6ef31971d0ffd3df5b1b84eebf4bd134a8392c77743ba02e788f87b4ceacea2209d59e069f40206eb20f87d9dcee34e4cc4ab01dcf80def01c77570103ac7f11b701047f8d0398e0771c36f3ceeb49846d3c8c52c9a46b3684299460dca9ab3b8e137dec30db8450f3a18077e8f1cf6c83fe0e41a16352c58b8f8cd63b7838bdb3cfb77db0508de17bfb161bd78ec7860dc17b799b05a9c050e6966f12dded0a68b2bf0761c2fb2133fbc1ac08de3b88f1bc781871cf1ddf071e3388e030f69a4c992bf818bec7c1f0e7be44f763ca9c72faef8e5e2b1dbe17bcdfbf1669f4711af7674fe706c90c5556771c1bbb8ed73fba741f916177cec7822ebb611b7858aba2569ff889ff9fbbeef47bcd09090114321912cb33871f23171c2a4890464fede4343310f830835d8430f5b28472981993fdc23b3387112db4983f2cd446661e244a873282806db47ba153652962c9320e9a06e8511292be925b1adcc9c223b12dfc55bdcd7b0481d67deb88c49b1a871815b605cc302dfc7893b7c84f31b2b1eb19cb2e2dbec78e4950663bec52e85c31e5962e9560c7e68f3f7d0cb371e82f9fb670e8e7fcf374ed60d5fcc577c8bb972c595494c6ccc439994e59506e563aed3386edc2e5b118af9fe25756bc5e5e595cee99d159d8ec6924a83926501292fadfc40d12d7959a55b973885439bfc3de686357c64ecf1d6efdf538f37c4b951c6efc61c5b682e8bcb4ec537169fcc5fea31379439e6db7775c4fc7d9b1c8b1bf3d80920e60f7befbeef3a62feb087c3f89987f3287ec553d78bf16e91bce206b9320b9c152163cc5c75c31a9467ae33b306676664643e8f66cefc992c19432fa6c3d1fbc54253663138b4d6939f3fff7e1ef18f87432f5b99ab7098651f0e6d96b138f43c999b40100747c66629333b1ed5e9575ce6aa8889f1baa5c2a1ccaacb7810c49935e6d16405b9b2eaab6faaeb5d8b0305ab7a6855d7e979e45d76de67f09177ce7b0a875e779d197365fe5d15f72ecc63c703ea2bf08af01966f55dde53753cab2b7f1daf109923fe0175191c16c9a8af767446a9705824abfeddf0f97bbc317edf75e6e71de6d1e3515da73d1cd2ec3de6df278425284926b12281909088ac147df17b188f70f2f77d0f71722caa9165d686def7ddd4e385b9d73324a38eba4e7b3766d5ed991975d9f1c04454eac6065b1e51e741e1acc196eb7413b5fc058759cb5d5aecaf9fc27337b4399c471995b5cc47bef00f36f409942f0c36a48d336a64a3e51048db5952c41e4159ca1043590957f216699db3ce06a794739e25852d92512d5952d84e87b6d11b0ec9d2c69b39bfdd962c270fd81453605a4651f4f2c02a9632a8066526969138b071daec0a5b8c36cc8794524a67cdb09a654a334c02d1c8a0380a66c7b22ca3f49396609b31c618e99c9d83c5cad32cb322bbe9176477db491d1001a4ee146ffa396038d5c8a2144f535884d239a5300528421305a51ca340b940672b509064f9688324400443124880a2841328f18421ecc4c892a61088dcaf4179be3ab135499d81edd7201adbaa03218da6dadddddd33c6ee4635d8ddbd0292a9132fb25f66d8d55863e67491d54fc9e4eecbd9d194b917bacaad619a66b5aa5934f164e2b81507acfcac2f19c7451b229542128c8e04a00945024842519424283902087288832921091a9832450c4c98c205a02954d050606b8e51a6204d39ca6884c9310a109810658a1046f37336bd62e9159be122f9862658c9c92cdf2c573b62c4f48aa577f62401f5426d49bd509160e5279ddd00a09f2d634439cfcd5f456c1b8c2c58f9ee4c061772f743292428ca413af75f3071634abb76c0ca7cd50e58f9964957a44f74e5b04cbbae16d41668a52ab3715401f126e99a39f5331b40dda9580158a85cad62580127936657ab1856604a9aad21b145d993d60bcb32cd6432994ca5d20b28a050dd9cf3a217bde69cf3a217bde6c49d694e596bad4d3f71283829ce8ca6b181ac5372a793b52d2e2f2f28542a0503a3ba542a5555a95a5c381bfb52eb8b28a45aa6ba1713ea04d3303027944db5b878def4bcf6525e0c0c8c4ae5793131dfb75a4d61c50a95caf36262be6fb59291513133f3cffff73e998ea75dd0c0769531df4a4666252323a34266858a994e47e7ec05142ceabf7de5bdf19ab13dd3e598f95674c88b693a9e14d8c6b3a6a6a66b6a640d66c18286a6a6a6450b172e40904517720556e62825043957ac141064c92d93bbb5e2117f451c64660e2877dff3c9fd8cc60e03134c28caddcf7d908926a0648e663bc9471a204282ac763c638f19c33fb0902cd32c2fb1531c0e0112e30dc541b2897b66beae5b233715d283dde4b6c960d35c73352595979452ca1916c9530a114e72d32bcc78e7e5dd700f964be71ea30dabedf2ab1e3945eec13d14902792fb40280e22b1cc7dfbdca5a1c41e730b99b94762c9252da4f8eac1f036459e3e3e447cf2fc0b27b6e7450dec8b1a5820ed937bb0e99335398b364984a20b808008fc40ff0d2ac92de50347729feb8cd21df294f2205f83cc3cdf749e8796d3025bf69ec8d15c26cb1e3b6b356b356b6ffab437951e3b1e6da2e6a433d3ac04c928827226857296655926a7e4ec54cb613faf5da958f11c32affe72f0326f9466f24a1214244e243d913bd9259d4892b40be4ba4d9bd257bc7eae601c759752a9b4852edea2d6efca4cc395400d66420d14b58084254b1be99f46d2495a49502fc9de4292caee2cfc211a81383db033cb9e4925272c32bf1e825289cc0a15cf6ae4189c1c7363700c8b189a989a98ec31df302882c0b0246734c8ac5940eac8b040040494334c763bb06e071a2e03d42d9967078f955e94ceb3e2e6dbeb0caf97312e7f7373195ed4c002093233ce65bc9ee2cc8043191887de7c7b0f9663e050869bedcf1b163227bd2b5e6fe9f2ca34985d022b9ebdc706f370d7e9174958eef52b5efa84e1cd0b7318577599f402e3a62e935e5e5e5c892593490d66331b9246c4a04c0ac51b4aa3ec0029d3db1335999d5eb924de648f9d94d9b116fa791707bfda28285d9cde95a42e28485bb878965bb0f08e2cafb84ecfeba2046625b004d20b71817bb0bce22d5ae643a924675f49a3a43995744ebcc25076b9442863d239339ed59c5d1265ab9cc52858ace4ec724ae7f44e764967c6e5ec598b679757341f1d35174088a02e470b2c64e6159fcf321a1c5a1638f4e6310e0f1e87387166c5a52a642e77bb1937e686366bd75bb57c359f82b9ab89736429ee2b1e3f5a9ee5f996a3f0aae51505799543e697f91617bc6ac13d58e65e4f90ab923c3b1eedf6763f8133f33c6bb3bf18b2f3a18c0e0e53949745a326b269d612b6b984986f3177554add95e603e6283c4475986bd7077d0a0ff14eef42091905232632878ddeb8d3ddcb0514dbd7a147b7eaba52152005fcd02d9aaf2f1c71f9baba9216897e699a761d346b3a38e4b095baeda79b7e92394caf3dcc7bf80483573e52471dc5bd763c6c3f61accb61525defa90bf398abc2be4dae5e2c3361d6b6609f7dca81dde5da75b11153ee3aeda2b9e8ccabcb81a9ae77ed9a324dd3b41ee81130261b326bda36396dc7f62ca439b06b12f730efa94e7f51ddb8839dbe9dece92db72da757da727b3823c7d09cdaaed3ef1cba731dc4ae61d8638751c9d88b1958ec3ab33bcd9a764b3037a5699aa6ddd26d685a942b5672f6aec484128cc8ddb51d25989b3abda8fbf0711d4a170707b6d4e9e8d143cc5178e5831e75141e62a3695ca73030366c742bd2ac7d4bd13458c25d8a763c64ef5e38edead023670af64703b43fc7ac611f0d5ed7c1e5e2d0e0f58de6d0d2a2c35e7bcb29cc8d3bf606e19d7ede20549fdf5a6e77b5a7ee90223ba9c76eb9bcd4727b971bb6a078e8aebd0085891c618fb0f5a9200d28bd845f903aa27bec7674ee30d8e0d56049fb751f3ca50e07e9ac3d769a06ac0dcef52de3ae6b0d43f32f1fde559f07ab604354be7ee82b3943f9409fc22b1f1e2a763dccc7e0950fd590d4552fb27344f7d3e949b61a6e79f71e4c7bcb4bda5d5eba0b0e32730b1632b3761d74e6a6dd86ddb5d3dc59c3749e2e77d376ee5b77bbad89f276d525a2a5a0085b28da3962eb2b3e503a348debf484d5609e7a911d1dba057387702f20820896d82102f301265cd9894d23ec2a59bb4ec35cf9020bec400aa11d9d89ba71a7843d75e34edc416538036271831825edce5100452f14d5212f3c91c3787442ea8295285e30ca61ccd2a74e4ae97574a602b88225b2a24ff61359318302f0025064c5ac43bcd921b2fa54c87d27f47350609f63942b587218a10019d9220d48051bdab0a1c30136abd3ad28edb36c593c43de88432fecf21e5e8e605dfef2ed2691f345b2bde1b37d774ff67293a636cadb752687d360966919ce7ab80ca0e78f34d260287d6cd7286c59b762c419d6d69b74ce392f4a29ed6efc991027b7ea254f19a534d6cac4267b66184ecc8951bbcfee7fc5ee3ffe2ddbf43fd9b6d8ad963debec5a6be51a9c75ce06637d1673329b6bed2c5e57fd55af5ab10b67995e27d8e29c73ceee8e15cc3544703efe316762178d08d6a0239bc726e5917bd249eba4ddb30bdba4349ebc1a22486f04204f1a11ac4187766b228d4c79e47979c5b0c600589d3cc030ac2485bd728cd2852308d185201cc95eb813e5388bf2ba90031e2304715d1002010f94240e05d2a02cc7a164688ec030ecfa801248701c5042051e5002c97565dd22c7284af4809a80522e38214a1750b04929b96085460e178aa0d3085bf581d73234336cdce430429912a954b99293c398e5892cb94fbba1f8416e2c94203716a690851d3cc98215723f071fe47e8f273e68018adc5740920392e47e04a26c410bb9698e5dff091b7da4719162439c7c8536dd0a6942ce66385cbf6eb303bcaeeb3ad773b88e73bdc6d5446cf2f2c63cb7b9c38ebe7cf46c8312ff8897a778c5a37f48bce28121109570c227d7671ad878d07a3ad872d05eba2b8cbb76eeaeb07398e4aea4dbb31b77b80de7907fa891af4b79571277560f4e567de905d94b3df44e86b3171ad84f23f9c413199f18ca4e4ca13ec1822c1f9f40929ff0b9b890e5312792206ba57546cc1402c962e858b0821831aa597d54868a42769128b63a2fbbefaab3cc3d728ace4472bf6f678d02536b79a234d6dc197655ac361d03152fb7137d39415b657bc3b696255a94b05db13cb33773c0c96a19a25e8d491b6d883457772c60bfc7705864932d866b42a1f5c26ac8828d4430c2951c8b48502587efb0794d542cbd4cf3a52ec795279e5d0b0f4ab49401278a28112c0a872e1c59b1dd0eb41fcbe518c5092472c8fdc009a18c8dc1663946712228879c1349ae905497907959c659941486a85ab08265384bf00015baa27060e2a08524956888c6c211ad81105940ca8a10223bd2ac88a459191694342be6d07a9d59ef5c0b4a32ebb672051564f9900687880e146951aee04344c4383c8125661856ba7a956394216ce022428c33c6f9f8897fc4497b62d7e5c939e79c3473ce396966ad95ce39a120d54a75885ab1469d00e02ce3c9b825d82ab10bbb2a16b5d8d2f32647554dccc932abd2d191afc7389d206cdd4884d862b768a457ad2d7f409afb190a17d0810e4e40033198a0bfcdcf994323099ca143db291bf81058f0241645a328c3ccea9032e38010054cdea65b33e3ac70d4449e566890e7dbe6d4042151e4b3d33b7dd9f1b42d326527d93821e4171a897e38146751d3089366ce390395431b2ca8d082242451aa80852856781225e702a0cd8c32ab5c20cf39ab2491270ad560144452e0c1142958c107619821075f4022620a2433c8c0cec4f1f1f1c1c073c8a6d801123a95b073ce6850822db02198e5147e70a6e064c357bd628c317e668a29c690e723bd902b772b467942508e1d5d1cf9e48adb49fddc845c2041660f96eb55e9b34cb7cc0206b40a5ba49142b2bea19039af76f91e2c632f9cd81735b04066909935bcda01247baebf9c5bcff57a7136be5d61585fda34ad1eab3d43f2f5a8d3b567e6eb52883092c3f8841e49968d6e9cf62dbea8828d52446085661cba15a584004aa6f43a748bbe47677846831a96b91e4e83407aea7b62bcc16990be470245c2ac620f4335486d1aa4b51fda54acde15566bad33622dd8b53f4465fa0dcb4ad85d95340ccb304dd3e4f50cc3640f962560bb75619c25450c24489c371432739c7fd1010b24e21e2cc7639fc77090992fbcca72c542668ea72c471aae76643e3e3e3962dae0125b73f2c26a95b4db5157d05960e20828c8ccf1094039468e519cf0842c7f75b783a4b807882cf10b7e54ec64585e180f92caeb959a80e3240e71b2a474ca7bdb95d2d7d739e79cde7561f26a27c8a31ccf3a8a4759c6232ad84a71a4619c93c69b496ba49961b84299ebf55ae34dc5932a60524ae99c3348ad18889683d44c29131327c71969a491abb3ce7adf609c6731f479d5ab567ce1648aeb29a55efc8f967a61af5776ea056cce593feb7f4c2a29957d1643f2726213af76fce0655ae4a22d95567abbd6f82183d2e4d8f990f3e21cbb15c53d349ce1dffc9ac416a30dd8452f3a29a53407cb326cb2e88c94ceda190822e06383d02c29a5320a9bfc1785bdc1a1cc37dfb6d8dfd732ee30ad56ab9b388efb3e190130705824c3f87543991f306f1fc3e290ce3bfbc2a17d8c1b18f7013d5f91cd8df9013d5f51bcf99ec4c0306c0d0c1b03c65dc5b8604c18f6d78df1ebba7ef3633ecb3730e66d8c0b9939060e61fc060b99190656f20535485fb2ec7858edd08ebf250dd24cbd60bf250dd6fc5312146df89ec49b998733af98f98a8fe84b819581510dda15d85066d665e0b81733b0e147943fa2a417512c51ccd2e930e5893fa278438f73657c850d2c9781ec90e132eee23a8d7365c0b1c19b8b74731b1b9b18df62e0150f188f711d301e03c70663bc48bee67c8c1bfa902f19ac0c180132c6cdcd75e6cd5ddde67e8771873448dfe28632b7f88b9a215ba3414a8f1aac39fdd6b2db7457df9306e9817c4fe20d7d0f119fccbac581ad798bcb8725a299e3c30cbdd0e6290389c7097146504a29a5945ef72f4cb0f33ebad5e2f4b3e63e803535c7b1e6f771d6fcd7992eaecc2d369a1be2b0b82198c3ef86debda1fd9db9615d71c39ac34f49a657f10d657a991bf6931c7e5fcc0d239177c388a4baa1f481b9a10c4a851f51289172f87d44a76fd121871e323670e816fea18d328fa9812349723dcd269ab94bf366a373e80e3d0ea5e3cc9c1251b3e8299d354a44333cc13e6601052cd80007449065c90ae8b71f2ea841fa1135484b4499be64445f3aa22f11d1978a32ec82bdc206b69443bac385339c7d4499fe33fa8e3ea2afe8850f8dc6e10af23c6d7bf783037cdca27c68102b61258c45e1838f1e3a481c1a04830d2793c9a45bcd7dbbb68b9e103969c24467163d2172329b34d893c9f653ef9ecc279406fbda9c73762daf23d2dbcd1b2a00e3e6f6ee16c993db5eba59d52e0e741ae58e2787b64103eae0c819d485e0f7884eb6e51b0e69de7862eec9dca264300c2b69736e316655e3b46bc808244982d05b14920695fc1c69b0e72c619396eef5c3228bd57ee6946ecdbf747779ac5184451de6d74f3fb376fe20987a38bbd269c00671e6cf9d327722b933c99d4131777a771a31871a049a4a1aecbf44d19eb7bd4f87b99ee47e777f6a84cfe1240ab3bc1d9d2814a3069be88926e744711c2ae4b245991e4dd774aafd684b1aec87d757490db606d460bf7435245a124d8916d4606b471a4cc28693e8277347ddd28ce4fe247ad29f54a20d31f79c134ab768ccd9e9c11226387842054e60c1ceace20211444185221021053bd30a4d7c604082241ca052829d0268e1064da284a0094b886267ce1d4f46ba082151edd22f2e477d661d4f0aa561d74a2d9737f438abbd05eb91b9054b83d7ccf279c0c6cbd276cc6259ba457dba558d748bfbc98e5ce7384e6251d8982d58cb228b85c10ef7d3afcf6062b93be9561864e6d3bbae0a7578498397d00957234025d8f0072eb78475491f2db1a7f711908d79d523ac49f2f53e6ab012d5a23a549bd4245549b7ba5faf41dd32a152ad253607b1150a991975975faf3c8836f460198543d485ccfcf28229936eb9e0f83a24ade43ad4e0757d125d9f45d7e7d0f5d9e47acbcd4e17c7746d401a4fcb38d4d54443358ab0f2d85037c1809264f99fa20632ea241d64a585927a084b1d4a9a39b1e5cc892d9f64a522211d1dd5a25889f205745464254936c1e4afa12617d0ac4946498a8088e4cf1016a1a4202b40473f46a8a4131579f9646924cbc70b28cbeb08965b54967caf64f9ad4291236e1a797a095bab542a413327b6063473e64fb37ce4717040f0f73c6baf20a02c359f2c97e47036994838a02c8fcc1f23b2a3b021972514f92f60b0f29c1624844d66734e2a7b0a94ee29e96d2872ce196b956d9424528c095ba409abec492bcd686696690dc5680a2683759e77695a495e286b6bfdc64169a39ed247218d8cf4daf04c4cd339b11c0d8b204b1b8a1314b65bd4444343136d887508cb0116020b93a3940cf0a0f40323b4246c4b8e5232700227ec29472919383203cf6699b55936b38513c86436e32c50b36292a0151e4e66240a402b9c1a38336a4031020a1315d6485109be220cc918b18108628e60b4328202af89a1cfc80f11aaa3a1180c5809829912e461208a0952484052618007a8258c603080c4102f46495218502202972849280c7800042d472f194e184060339b7136095894e0e36271322a10713ad2ac98b3236956cc56091f301935b14040d2259d2e9004101785c874011588609b52d44d11543a0210f704128d094d362424c996482ae9a0045813479a0552a0e492629449b1c010403998e0230508721861c80a1139a2fc08a10539980892e2a38222722c618a2c2dc87240c162696eb92ccbac274395dfc400bbfabab0e650323254a11102511765072aa12986b8c9aa188cc106b9bb1b8a4d9679fa10f3751a5b2b1e357b7d5cf1a031b6e28d88acc8243a894f2201b040893699de1fea7ce2f3a0f5b2eb34ebbe94bfae1a4640c958ef73268532cb0980e548644524fda324b22201b02c89ac9824868d524a29a594d258b596b7e07002d995b9bb1dfa19cd4188d6f216bcc25eb36f8aed6ff5b2b3e55b4bcb75f45b5e246b59a665d90dd2f984679031ba6bd24783f240b86f3d1c0ed283e5ed326f38ec1dfa4266865718de517124aa3c8809c10ff70b884090b880066d481c4cc547b3644e0eed23dad02381b0864dce01680eb080032c600a413372321b4eb0612cf241be63951e94436115c3ae08052024b9a3151391143fc861bc2285929a069248721fbb2a074e6143cf53004fadb556f00936a4a1e91c54b3644fe7f99ece14bfd881959f3702f1462a01ac11822157c3c6f6516d738344f28c51de186fe47764652492eb55eb95dd1e0a10c9170e27407798bf502d50028b11b980cea93159f4a62db43103c72602d186fa781a4aa573e89cac59f4110b367b89d3bebd70a617d33993c9f462baab1793e9e5c505e3c1b0969b830eddea1e6e386c39dc1e90467adda25ecf1bec745aa6b39d7dc761b7d793e9ec662faa41ba9ddb4c9dc9dace5e20d6da6316ffe89e65ccdeee3874eb74fa1c74a0a7ed6432e1b08b9da7031ba250ddda4eefc99ca65b1ba5b7e95669466c1067f7c590c5ae173bb0567230d8e26317f16a473c761d11d3d8dd550e31c7eb8839e2fa2259763a7668728a2cbb495d322e3668d360c46162cecf1973ce3967cff5fe85641d6d106267b44188ce94b1af902cf72b15b2daf18a7f64b92fe583f46039622159ee39255024774f908ac106e7cce48a4a4a299d4479d2ccfa64b5a374ee4068967feadb816479c3ab1d250ca473e925cc436208ccbce241b5d8f5f0cc98182c06c3b81486a5b0542ab55da9d495baaeabb73fa0473e3ea01472376d2fddd9a621a5ad67e68d26730fe8919ee63d763d3c2e3037c53cf552eaa77ba5de73faf61e0a702792b70339e1201c7799b7d24bdf52a7eb8adbeaf4d55337e62d9e1ebb2d65c270e93962cefd3acc0db197beba3d5886f9f60dbb42a69099630e7353e76e0fd683e5d333d536b90b03491de33090f8186cc27a80c8272029dc83e513bebefd450d2c573a67c29ccb9c2edf68fde9a2bc7832954e26d4556f51a1502ad45f5e50cff28b0bea9c45c94ed5a95287c142664ee110857bb0ecf2172c6466175b2a6d0f4bb2547a8f0d088652a65b320dca1e9a06b9edf66c3f99bac71b79baa1cd59ee30b7bdf4ea65dc76575c69bbd5041748a9542a699acc3a62ce1a5c4919234da31fe2ac7c6459731b765dd875d18b5ef49a76551c66329b4788a60e7b97cd1c8a573eb8d3391744b021a5382b1fa6eef55af76c296ddfd834764c257c8f98df2e3cb5d2e77b30f9d25be220339770b8e5faad4e297163bfe44eecb0cf89619f189e7d65e5838b4da39eab2b1f9de9dd8becc46e451377e34e87f545832dd268f598b63ddb7049d3b29776681afe91ddc5e55b76439cacb95cc35b368fbaf4db8c6e81e06f6d96956e53ba38546ce9a18d0e1c3c238c545a5eebb9aef1d8f9a078e5033564b2265e4d3c64fee54576b2c9aa9969935b8d398f28fdd25e63e670cdd2e29434a59b5ddae07c0933ae46ae49426d46b7360dcbee75d48d3b98cb0d7fc0c1b9cd8c97b4af4aa52d4a0124839a1455b924d72a99e45a9fe4fad2d60abd05d42ba05b1503b9d66d5a79a459f51ea069d4bbe8c101ae2b52c97e806e69da6d5193a37669977669b4e3d1367c7d3b926e95300470f28febdbebb54bbba10d8ef6a8653768379c91717258242873dcc31e39c3a51be26499b59ef787914ace019a550f6073602395bc71af59e6d262e591d25d6e68432f67b7377c08e64c1e89d9248ffc8093b1efc82312a85bdd2b86facbcb2b96479a467dbd8b97bb427544b0a573dbebc6ca608e2d4a3539e668a83b44e30015110c6187088c0b4c30851dd4bbe3d97e63d328e130cbaed71b993ab5c4162f650824eea8a50c51246508a22c31308104e9c1725fe6186fb267558a086628a05b61b492e7fc0f0ee8960c0114791e87393190432ef3b021647a4d6c36b3cc5a6fc8264d245240004596c9510a088cf2768abf12885e899443da23b39049e32fa744c2caf5db49e66d93d995d755b1796c9b3ce8fb3ae87bc88be498c9ab336b8cf47587d9780a6d52892598308a81141218c921953282244e72394ac97a04537248a58ce04996a7b808182960620c475c72fc01125c809123136350a2e39079840e78a068c84c939dd3e910d390d35b7488d0f0012492b0636fba44a215b61085a01dd35b2e9117a21d8b8fe87eba445244ec98300e4da3bf6d4db4fc25b1b32f6c66d78165b2746de0c0712fc99bb26c52ca1f092c165d8c2e966593f9ecfe909f3ab4e3158fecd875641a0ee5851c7b91dc3dbbdd65c4a530880d1a52d8bbaaa7b9bebb2b1f3eccd885a31c330e0de2a0434a20a40f4d12368823e68368b9bd0947eca3c5e21729b0a1fc09bd9923270e2f71086614176c182f7d6a6489c322f353fe34f8ad84430b044e3dc166df6892b071b2ba1e40b4bc4e0381617740831d46287e40c286b1c88a2644d66101d18698b3ccf3e617c0d08126b2f8e00b4d50d991f7624e4d165c1085941d0ca1842576525058c288139e7c20044eecf0d0440e68b0a404265802113b5202c91f3903917d0e659398a026b965c87d49347ffc303104e429ee98c0b0c51ca911528810924244122944203131408a0786a40801254729423889528448225f394a11c288cc0528534a8dfc9860ee907922337660aeba2b1faab70a06cb2b4d836ef5c626628e248a8d94a9340203021bb6510e108da5ca8421c2c6bc4d1f8b448e51ac58c932171d4922f9c488a8d65a91aee04c37cacdaedea75b61fd3220b860ebb1631f72faa9e5662a683748f35091573bea312c7d1a945d766b14845a3946810296dc46ddea6efa9565195604a429946658d0697c249577adb50675eb6ac91736b978c2862d44b96d481fe6e22338eea58a8f4e31a785228bfe25d5d2423459f42d8fb1856ad49566d1a3b46c0893a6a49094e9a74fb7e6dca1d732a1a1505ee99f2c8b7624530f64724e30d3f7118dd734d2ade94323e9c8ca154a3f7f3aa777e833ec1afaa16f239a09bdaeebfae9568c22052699ce649a8485b9eaa12492c1ac6050742b6c28999e5e2dd442d18698691bbd14d9b07f905238cc70683b09730cab2e8c8962a5a36e3873d842dd44479129f7925462c3270a579a4acb55d7aaba2a60c003a19d4791c2921ca34421490e658e51a460244ba24d0841487d654e23f2488314b4911dc8a19c02d6eb9247ba555b6e3abd34d2ad96d3cb9f6ed9d3b56fa69bdd140ec9406858bbf46990b65cbb2d3fb5f4514b9006690b6e237b7b0a141b4aa04c2550f71f44329a4d78fb11a473f62a33767fd41cb575323d763c4ea65f1a100dd2eb576759bdb14120563cba05e4ee51fa642b9c190de278a18d3a27120dd1aed2499de508a55060928d523587d3a7ee84f327d3635745924fe8aa860dcd474ec954e3400e25954cb51f49645403c98ad151056288f4a934f7257204f7abe3293dee6c573e9145128a34da326ebbecb8cf8e87cd1c9645a52b89e493243ba55bd745afb0ab64ba812b0a2d9cc003576ee0e4270c3b7509222758200831084306bcb0531f637d164bb4c59055d7c5912320d170824f61c336eac1019345bfea41f5be0a0f491dd921a2a2073baa37cd103b44a40ca6b0d327326347f5d8f5a080c9a21fb2aa573deeac7a88f97c0c1e12b790022b0ced106924a61051c48eea130f2152820210a610851d153e02bb87874c131479a1c9ce10227d22b109507081949dc6475cd769f9446a57429139ac76e8d02095443290c4221a4620897af868d0060c5615a45b15af7c68903ee60334127d5ba1ef233a5f862094b4d3d76917979e410a5bac618da0143d2172228da0143de19ca066602f269896d4adce39710848da11957aad8a66a573625eaf5da92eb95ecbd2ad2885033fb9bee45332525ffa69eca253e46e1b9b06ab4ca61ccce90f34a04d0c2258fa9006db3458b92946a69b4cd75f2c614fdc9406c32b49339a399c9366d50b5f4d5a5e4f8fdd9392066be9dcd5a459f515875966ade71dbcaea45c9b3458eb53536c7831c9f59452ad4abca91a5283f5e53495a28749a94eb1c3a8522ff7013d1a957853b376146fb429301826f5eba1069352c1dc950a86c2dc6a02d5cb0b4c2aa43030982362d22dcce51b8e95503392a7d350ae34444e661326b90e2d6910ca131b0dd68ad360a562bdc78e076649b79afb3215ac6634851aac9f46f45c82e792066bc839c1d9b6ebc270fdf52f8824991ebb5710487252c670180450a6475d67c6a06ed18aaf250dd65ff80a6af04ad25db84683b573cc45dd900ae57aef8617e5b06042b9bee5869ce98632f974c33994ebe7922b89926e69afbf82ae25dd2a3d7b3d0df8e3fac464e7eb9a4c97c974994ce74e4de73800944b4ffd0a22610e834321de7bb00c73154e83301cbd30b4e3a1f4d4378ceb4e0777d3e9351d15041ba2509eccbb75c2ae140ccc5b85dd0bc334f51ca8bfdca26e68ff1262426676394eb7b80629b546f4267ae1ac3e877a9cfa1af5a5ab1db536e56a460dd6b35660431c27b91ea75b339c742b3c21c111714f8cb429da51b72e4c4af9d3508c14b61c5ca633b01de3157ce63ba849b79e583902254f2a450340c8612fc9b387343094c376926736caf395c63e328128e5b2c49dc436b1b1c119914662c992932449526ff692f950a321996e282966d4c0e260c34683335e7ce0053bafd3b373dbe09c86cb6a60c3d3d8e0681ac8f3366a6402074484408a1e1c710128458a78c2101640220461400210a5494c1c3ac10669124626ed393f73981184dea26a34382f4aeb2f2cf3ae13c954dad0c418b2b3da99813c2f536badd56405300c31032d0055c1c80e2d020e9c24d18223357882ca0ea5f471027548d824b745066c91267ce193e9af5c1ba55ce7d888a759a956ee3afd31c18614090464f28f79ee1b55d2ad9658c32e291575ab5b92bef4844a0132ca510a10510e4b394a013a924b4f3ac7c81131324e5f9a19f71a54cf21f32b3684198109614a821a64810d4b3f51d8f0236a9229d6a45946305043cce95504758be6f42a96a810ead6fd0aabf21d750b9f7a9e858939d893c8a287f9d5ed90af15af78c8908183cc1c53639ec30eef2f3e3b9e1738ec9171efb4eb91483e3e3e5906fe96c45cb00936fc8cc8b8f7fa987f9311f342c65dbdf064c8b8d504de9501c4f3bc4b4faaea63645cc8cc3270a8ba0abfa086977e660e256a167d9659eb792ffd645ac2aa64fad3176c48899e647a1659eca9490e4b44ac1dfaee48b73050b72e926ea992744a54aa7b5ef530456a909e1e3548dffd74abcef01a455818b7301e66d9c27868b385f1d0cbb6e63162c488f18f68d6a8818303827f871fd10adfdcdcfcc6c6c6c6e6f562491aa4ac16ac16ac875966bd45e865196478b90c29542a43a58e3ad62463493025ddfa4e8f05614bbac5e2f49810660436d4ad99531a704e4f8b649cae4e4fe9e951b7644e4fa974ebc55d4e4fab742be6f4d44ab7569cbe868bef455def769506b76f1ad772b78de399f9e6e2c5757a8b8991b192616f5155c6558f9d4e579587735df61e0ccf7a55e64aafe46dfe98fbfc7617b7911adc2eb76bb7a16870fbcceda406b7eda806b76fc7b9b4c1ed322ed7e0b65de67a0d6e7f71651adcee72dfe0f6984bd3e0f615176c70bb6e5863c695c9e147147e59323d0db73659f9d4a34c2fc30d5741999e75c38a25af88323d78c32b49a6b7b9e10a29d32699fee686323e99bee686d751a68f714399a04c0f43862883392c11adb0d7cfdb6d930675ab052f11a24674ab3b3d1da24ca893d93f844166b63fc5e86c0fe3d79d57f7794fb744b2e9b1d3e918b7479e82cc6cba89e6d2d5c1d4e11c388e520a234610434130c9d3de1e22154986711be3f6c86c0fe3da4d07196b73f0d9b26ce1416fc088ee96bfb88c8bf39afbe22e6ecc47827af468b05b540619677dfa348bcae4f91c7afcc0ead0e3c2c1e88736caf33670a862e7431b3a387c466464be615cdc899f114aba157e4d3e27dd5271faaf49b764ee0c5cc933394ac90012f269de36ee5322d3875d8e9f51a6df0f228bfa5414e42845035632cde14784a45b619cf215752ba44872928fa85b518a0684724b7e5032fd76cd3927eb2175c921cd252ec619e33168f88c83378c3fc860d6ed30efe21f936eb938fd37d42d23ba35bf23ad8737683ca491e74d9e3579aac833d5e5f91a73668dcfd36843ce270e8d348833c5ce879f914c7ff077a4c68d0dc6c0618ce7dc186fc0631d0fdf924f23f0e05b38ac019e060e71c09f7008822fe1f0e04d20485fea72cc70f0dbc671b2d361732b3b1d37bf3eeff51837a439c661dc506618353d58b63536c60dd219c675e60c183766179786196ef843fc418671f0373787cd2d789b4a833587716b3eafcdb5b8a168b0a66b5ef3979a979a979ac7ae795026841a42fd23aa39575373164737f28a2c50aa7f52ed936bde354f3d76cd91b29aae99d7c8ab6955cd55355e8d57e3d5dc036340107ccc3f23dfcf916ec55894e7d7f1302969b2853caf797d53e20dbdf06764f319a828a844cc36b54dcd32856844000100008314003028140c874462b158309e69d2543e14800d91a248704a1989a32488610819438c210018002300200003341306051442324d2529f5a03d4141d6bfd085c24feb17205815f2f86d88b218d8a7f87d6eeaa810bb0b1cf62256b06f8e7534a14f9651345c80221daba6628bae4d2f4c7e177d161227903856dc0a6e8fb6c724ea61f9e45ed960380ee090734fd2761ba4cb08049ac8167c2fa9e85eebc52e0b8fdc1f42d6e666a4d578f6b045c259292ba4afd95a860ba4962c49a9386a11ab059fe0e1a386d8441bb20995dbb219c4c58444998caea7bf8ff5f4f1d6266ee152e68280b42d10085483e70b99cefc4863ba1fa04bb67e6faff2e9542feb242b9031d8040a0a0cac5771d37fa44641db6e35791d8ea1b750da77ee5a1fdb6ffb1071d45b4dc5e0c0a5ae390aad21be9f82bcefd726b298ce9bcacbec478b4630f63312ea68d0eeea914e0ae743b571a788cc6c4d329a2fbd955ef7ce26a1098d0903a95bcf0b78ae82998d0aefaeece040cdc5eeb1d0979db9f831bfb47cb0b82bec77101c5c117d4e1818a8611d640f44b1db59b09522da5b61d128f15417ca33a7a622f0a58cfebf8688d202550eee0e7c05325b7395bf2bababa87a5a755ddf51e5f43904e738e12252ec9236980fd4131afe635e6e2f8b0cb07c3ea5b409bb3d4cccf3cb4b50c09e9e40db524da6018f0fe36bec5c2c6e96cc23ae3f06d661fa1b581716f14d7db95d40092f90bae277759789cad0b7c61b5c4effff3c5fe8e6190fc606cdf4821e727145c41c727201a872bada08e42ae7df22786d3ff0117bbe0197068f1ed71009d02d85eae0cb75ce53e50a3f02b29e6a176e54a7dc82d89c40fa1bb66a01f481ade033847e70b2c7d6ec18b14a1fcec61d062a9e81ab4e9afcc16b695dbd7518acc0ffedffccd77b5ab466592761b8984749299fd38e1c5d57ea7086d846765f2b8cf785fbce061b9f212b879874b66ff11ccec484f019362a0cf0eb21eb8488cdff5af8cc8a2cc3c0cf1f9e59bfc8cbf5ebfea59bb37cc22a10519e142b269fe917d1a3a302cdbb353568866a29d73dcc46e42059b2dc99ab4b54dfa5ad483d4df98472baa2dc094956605801701ebfa6a87e8cd0f75b298ce4b0a6823104ab27da3b866573f41759444a10d073db9e3492443245b9710f9986f63623f9e4a43b1b29966de2160f848448004ab95bf7abc6261215bb6f63b4fcaca52887132b09ab4d7161751b38425d54a044b8c6e484d527b6f1bc48807c0737740b981ae48c974e780214c267e6c301440a1d0a54dbdb839c28ffdfa7d6965060450c4bccd1e16ecd4396143c5ccc8981b2ed78b3b059b4de3bbf6151f608f3e072378604fcf137db8c92134c880a4af91d17afef3b46654d1c5deebbf7f79c8058743a29f112101c5fd756c55c1f1198a8d1483579c9c118b59310b16d387f0f2b8f2715b0b1ba99d1f0374d44f9331e52cdf155dcfa7ec08064eb544b4ef65d8b03037230c1f1184e3a56c0c1909983bbfbe24619afd8e0d796bb521d80ac70aab170de6dc245b95e8135e2aa2d0f5c83e08c2104413cc844a5ce2a1112c9883251c1b24b4f692bdd88809519f194d74a15b7a88146b02c83a63e38e78fad02e26779a1973da7a2925001c6026229db7f793d14b13039e49500d9b0f2681bc22951444be28520c93bfa668d9d39b081e8cb5e3edf7d7d488331953d40f059158095581542c3ebc940f4fbe56c5183016e1eaedc83fcf0aa752e44179e3051827de2c5268f8319f430b85a5f495a87c797e52c87ef8936d14cbd259e41575cff905b9f2b1d1c336382ff0c701bd06cd309de0edd243187ad0c12759e327f8c92b1d840b5726caf13e24e174dc15f140d8893cca7dc3dc5977154bd128d25066b2ad5d12993047e195bb6fc34ae6125d9b878529c7a49e137641745d4c34a66f11309d9bed703e348c777619cc2716ba73eb43152c24d82b8f613e6ea450e6fcbaedf27ba3e9d6ab05ad6772786e5620b981aae3c8f20a0a091a78892da34f5a2868bea3a4139a74dc17846c048ed067968c470641c482be8313eda016fbbd92f273c21ac3a1c8fdbc1e2db5fcb0403d6bfed45f57a561ac687eb92d4be748ce4745572b2b775257f49691d840e0378091118f60bfb8ac398902fcf6129ab453dd725655559d55cb7c426e4f76eb41f41e718bdebc89664ba2a68e778ae9d280c7f12f375e1bdbfee0f8cbe5b2573cf98f6d886bf3b823d5741e52800f495b86f16b021ababf39e58b245e1a71ecd937e9fd5cc7ec59f3f6b33b38c31636c15a7ddbd27f40cc960a7a0954441616f52e2449d3c663e64080e560d54b2d6cc76c7c081363977e84fb977059573d661f4c01a8168f73e2793728b63d81c637941bdde0603aa1d1083039223d71cf3820c49e294712463feecf5233dc3c8433cb0a5b7dfa4b5e58dc7b753c267256e6260660383bae545f5bf77a470fa8ed589be5c1fe4a7cfc0c3c962925be1ba79e46a59989f15978e4bb04604096081e51f3c4caacd98f368adbb7e02cccc736d65d5b08abca2288d8b0901b98cfd400056f193d28c35068ccbfd17644137727453e4842015914b4132f6812d21b25108168928fe0c4e9c830ded22db6bf43ff9758ede9fff3f28928d658256d9bd864eced434bbd77a35fe76e6562b67836f9f16df6bbb881dc55eeb9f06d1129c1d98ae1d5054e9e436e6e4566b51f12d5e86fa051a6db7bf98ce859d042d39083c31afe807b8ec4c429887541f5ad329a9c29dac059d06e3e673986c47001da3574da40cb6ae618994eedff8217cea5b7313778b709c54d4281daed036fa04ec48a7914b3cdee0658e5f3809b28bf433c0e1584003df4e46143e21c21f1352d0119976755a026ff4b7ba1c1be2c9693a14a13063cee3b3f30979fa05082d12de61424242e5c94ae3acabd67c1c6708e40ccc0604e1cbe372584d3d56e469c26d27945d05eb3ee617e88b31c05d1b47b7c84caa8a687de0a54f9a6e5dc3000358f506ea2e9571cf0141ace6d44c627b03245aa3d68445520b3b99ebbc7666bce7bd6b48d4f34c6bf3c5483dbe76d4d16b5b64500ff809355a5720d2b189378b21e32fe9fe511d7b6e29ce57882786956d4292e8cd79d54a54a3f78b6b291ff68b1c617d6040244626220b60a54df3e9b74c70a734ea7fe8c5917ef34afbd0687dbd3dcc5c514d798c4d2e5e9e611b0ffe6d2cc621bc244fe5d2c0f240a153cb1a5cd12940b6a5dd5ff91e4329b4a18552645ae83a9782a815c5ca69c9ac2868e74c6534386e916b3135aaf1dd453b25fa0cf7a9c4fb0d2f067fee8c24186b9e5e34b157a3fd4f64cbfc44fc5a305c9c120a14f189e46c7098b68c54ab08e9aef7f3ae39c689628a4c4217bca2b400914845c116e4107f9c6cd008903b695b62f8a5e2351eddf92c7718bd95481b40688cb8d20be12ee6ff008431d52ef3b3d4e627aa2b44296412be98889c3d6ceae9be866c54d500ce3be628977a88b1b0b553a56bc521cb0dbba8b866aff2a954224f4270222e631ebc3535f440b0f8d48b61ab3cad14fd5f2f745e3514d9b8212b9187bfd239a4986878af75d33e22a87a2e45944f7d08814da294eb74c9e940660564cd987c3678f20fc5260a8c0784720c91425364ca5f8978b9e59be3a7c3a2f6b319a778580c97a330e4c7eb92987e9ceedc92c892611bd0984fb8074a8ad32ab7b1781d2c50698c9eeefbd505274ab2fa98de0ab7c77c92e56ca84ded12f88770bc3b485603a76ddf11a5585e55f5f6bbf1bd4749165ca9af03a8de4413e6121827aa9c02e14cdb245b8bb2d2c1a6792fdd5a6bd1815635b3e7b8c11df46ab230814e98f4486895b192a4ac4c67ed31901a11e34a0f1acd88022e04274bcd8039f711265e469bdf6920abc8641a83504aff20124709b1a9b91b9a71edb10648c433181159c808ccc8e3db81311b69ad5bc3bbb9d5fb766f56b4a3de663536bd32dd05264cb84947ac017df3764bd942c9a5980e5eeb4c19601b98f1a19d4e200442c2c43e09912316a326e2985c956314660e925263a874057828532ffecae2399a06c328b02529a9e3cd86dc70755adc8e5c0c94ff385f3d62d7496f1d7f6ee19350082d88f4ae64f69e15d1572d5038276430e5531e4ca274fb8d64164fdf0638ac2e3b2228e70624f1474dd5b1ea046a5f604892744e5b5c81c222be5abee25d206487f4b5c86d26f2401bee494189e7ea5ca5c1a69cda0401606db481e62829e6d7ea6fcb1810391bb3b64564fbb6b47cfe36bbf327da2d78309fff4ecaec67abb99516142c825b9672d93229bf8a42660f6b029631fdb23aaf0e688d00145822074424adb40a5802e5fa95f3daebaf609a656838a56686c66d2df317331b4dd2c2496d75a5a79ed49c12ccff0e50b95b9382a89c9cd8d791c74cc115a967f4a252294daefdfd8fbf22deb57ab1fc609bbe307e9731a338bf595dbb9ce00420798f30fb277c463adb968b69941c07ddafa179edec3dc3740ebe9576a46a2b9c6262e5cd8548292dc66b9ea1f92f3d82195ccef3ca78002c3bc878fc6724cd0011724a1cb9035bee7c878badfdf235b7a6b68db832b201c36082c78457d2c3d7c4804ee5bc50d1029bc9313c0149d85cb685849ab3513fa2d98c861fe9c1fb290053add6e44efa002b31e2602faa5aec44b53f916fd9fb6aeb2fa9f199368b681ce3874666ad2bf1ee5007c1aef4a4d7af34c7d246d3555b9937cdf4207eff95ffa9a537e1b1daf557f2cf354a0e487cbee9c651ec5080459f2a2908496ac6b2779b83d65c9d49cd814c2df54040c72cdc9398d1e981dc2fc6a1de6956bf3353637befa80f5a56f48d7add5bb54ab6343a691c5e52f9490ad78a42b4330303ce6492848b42a4418c6e4ac4a10bad2d61c5af11369b482d6d305a541e6df8deb82ff2b6fc95fc7cf86b73c87103eca27df1b145db7aeef917b13a0c1e9b3bcf9be4577613fda3a96992e74de45a415bd5aecdfc38f836bbf975fa1bc49a01482bfa4b7bf78fdc056b094d6575d3f6d608fc51af88be5dc24a123377d5a6ad71fb71cc055819581db2ab37702b8008de6711a13e13a37a843ff5e14bbbb213deeeae090191c2e179198e65b03075041474f14f73ff3b939185019a28de657f40f2a2df9d5f1d918dd077ef865117513f07c37a220c5d9441ba008b51237b868ec0351b49078219b2222d452eeaf1697b6ef46232667592ed5255441e137e719dfcf32cd0d107cadf49948ebec58473290d163db267fa6d8ae19ba334751edcfdf62a96c9447bbd371edb15f7df5567b6eb0ad3e6093408d30b7a42293aa9a8588e3b7f6841be5603e324f298177cb1d9872d5b4dd9abf38d5004ffab4a45d0004ab11502125a97065f7aabec7ca8d2686197770370d459297bf28b53d4ecfe4a7d0b049f3ab5553b9c0798d7c4d21476b166aefb22337fc75393391f009b1078f415f0d7d85acd9c1ac8a0042f8a0b4b79cab3313d6f95babf684173c5314422b4adfb17607b044373d9397c0e4f178f0389578f3c3b1782a840ca5de7d2e5f05b6a245c4c80766cf4a9eecf332cc3adb8e3560a1d33cad477edc60ef27a58c1eb6d02bb0c43dce7b700c2af48be4915e481b3ad61b42add8af9cf1c46fa8325829d112050d6dbb61e0804688a9938072db33c15014edbb9f14788d1c9277cc0811c28c90d0687b77fe90c65044e823d0406d0e72bbb6a8fe04d5a1be4779d443c1e7cc6df0cbeaaae75162c12a2ea7a1c53a192c83f8c5217c631f51d5d25afe05f3206d36fb139eac943a29554468ac6dce920b03d27e69a3f0c07f7fd68faf669c5c1abc522421e29946511ac7763571666ef2305732045658ad4fcca0337b3745890a8c66a3feacb399414776883e48f7024f3f98b04055666df5e25ab68f8799603f2f9d8448b70073ee942b1901da82a1cca2f203461aa40fe6227b2ed4463f885009e4ef90758fa70e8a2a430078630039e6185553b8c509ea8c13150e9a08e586c4c30b24c60a43db32378dd9915eead39034100c0d1b15e7986110ce3d96aaf2f1761e257f490a9d65073be79ee72b5f678a40f980435d557a8614846c2924d47268084452eef28e76984fe72572f36f46f118fce5d5affba092952c563206f1b921c9f0b93ee68cdc73943914d6c408c3d01791c02e4137c1a00e586d63f28c434e526525c21a175c1bcd295301429d3e7ab7571f83c37a86c792010a1050f6084f00e07c1f31eaf3de435a47cad19bf8f89210949b3d01f57e3bdf9370f03d47bc1057574168ad043e727e9cc9c36bd7672a8d931d4ec2c06f84f7a5d90fce59f3c641a3d28e351534afefb74b2b24b31619534677784ee9bab47cf31e28cc538c6ec434ebabf3718f9776346ddf50dbbb31c1801adc872111f9ad1c58cb20f4a03b5066a95cd132487a132f49086f1a7f61e2ed9099809e30b77a1d84d6295a9b5ebef13a5b6f67e651e5f006b14612c3760d82af3e4903c821d42e340d9e8b751869885c598a82e03b1edc0bbfdf027e9ae074fb5b53e560747c3d6221bed4e07b4ace374bf2643cd0c15b50ec7a1785d22d6a442137b8be17e2ec5969c210bd6b76fb2ebb490f3c4ba21789cd2a58ef6ded3d808826806e05bf44ef7167093f07ca361bcd090184cf01ea964bac1222ff956d2a071544692259d2200ba8c37d74be9825c061c2f40c0f7016d85a3cdf41ecc46df249708921388aa76dc4ad673486aabb5f98a3fa94648902650cfa0805b3cb56eace43464adc299e49f311704b3842680885710244b39188a467480c69d2ec85075d449128ac7b2a8470dffe13580689be15a81be067aeb140d77765f506458ea23980d79c4e1263ba59954bb42735965f223944b8ddb0d01933bd97e41ab6336ba012d75cbbab16d07497d4aeb2c1924d42880c906e74a3540ee5f4df74acf60011a3160f74799064eac6ea7d9e6b086ef96f33a50975904d2824ec90bf7115d4fda1d7b2186ccbf35103ef4b5156f796712f0b1eea9197d1c23aea7477839b24b4df434e04462ecd4701faf2e1162ece7b4e096715543f27e66c2d09293e465d3062cb0d703696e55ef240e68c5165be38c874bbef8777d7c7080961d9ff6eef19d23d1399c58aeb412761aa72a6b357d8aa915e2b68dff9ffe5b0c9a6edffecd3097f15d35632f2881970116415debb464c6aa4663d5bff3fcc42d89e5feb8ce1268911b46322198e1a92e946141c646141d882d0e7d01fa48b07087fac86c9725c3f37cfd3cf93beba502c432d6d2a48b3070cc79bf5e3385bc0d5c49e9d96764990e112f256ebc4ec41f83ddd919bc1e494b164ee600e371971418c1791d81e071dd84d60bf80f2b0d52c990ddb4e52218f408a3a551257efa6c80632674612b643d2d2ec3215901c06e38bbb0092215aa1f02f84704900b5714cc54982f4a4a5c58016e2429a5cbc47727460e25434aeb24872f43fbcf1804181fe4616fd5ba8c7c6cf006d11ad28e2f4f0d43930cd8c95629933000386a64ba78baab6d5e37bbe79e1e872c414e0ae62327447430dc9c69a2505474a5c4105833ae35cddf3f48bc9e9598974f1ea2a4a7d79f2b0a344739dffafb3dd055cc929dad6f77ed567c0bfe629177519414df031935990f68d8c114202d6fc4ddc089cbc293ea2e77f13224a300adb6d1a6a719a0af81e192edac2b5a7ae0d49d0082cfc7db4daf688d35ec4cfe82bdc2065267ec46ee6aa554e3d9479aeee4d7e14ee837143835186adec45b21c1dc67313b69cb593ce101ef8f4ee5844fc180187dc6d6e3804348f46cc05bdc010e91dc3996ef62a96f5ab29d14ab1faf66f7478446bddccfb7f8314aca3498e3f42455cd2a2548011554895dcc67c585d33d7e6abf6a5958e94324a2f51762567c8174feec5f086534754b8c8e052f217f0eafb91354e62280e9c8ee68709cfd5b4eab54642e18ad4ef3214668df318a717aba74f79ca6c124dcda35d1902e52aa06f75aacf6544a4bb025d2768ee6f13f0423565383f480769da6da34dc6e0d49f85224e48fe44bbaf12d2693e86d3836676521ae98bb82e1a390a375f9a0b67765a120ec2fa5104675950aa516b86355bb60fc2e2ca7024f1f761462790d0426d391c3eb54263e4ba2abac71cf881a16414636ee4cf065c8db2b74e41a12faea783063d8a6315635be7bcaef91dcb8ffb9ba1066f30b4b99e38e25c1e93ef2f0a31a012d70d845c1c476fd9a8e2cb2c0155d2252c7e8317490719086997218c318f2cbc93144ca6fe562e0a80c60fcc9542433ca92d0490c300f0aca5ae0123c2c5e54c912d8065d7a29b0575be79a88db48661bc21559014f8d4fb7afe5c36bb700b7ffed900099c05ef433b1d2bc59520ac227feb31a5b1b94ac68abd59c8ee6b3c396a4ae4dbdd1a8d505b0d81216d90832b1c9f06d490e8931bbce4aeadb0ee3dc55f35ac3258bd4873b4db3185ce94b1e6be166373f9f9609c111f9282d7bc34f2118c67087fef11a4c057db783ad70d8071d8b6a1400bcf84d92f78ea3686ce9b89a47f84452e19a92d24be2efaf70fffcb7f3ff98c96276acc6738f5452e1b2572214be7366722338117d8c7e4ebda5660e68c94f25d751b893dc11c128570db2fb0c2538773e7328b23258bf1bbea35c48acb2aea1892fad2d7f965c08bbd1bf5403996bfc45cac5700b1514d2a07616753f80ac751b018462e77604d2fbede8cd692ada860ff8046ef4660255a5b0ddfccab48d6056110a264aef6afb1b20c66cd8492f5c64d9a414dcce7212a67ed3932a45b07b0c0428bd718e5b12bdbecc2c58f42d8b8e80fcfb02ebd8ef01e14bd0353d1c724c04d1de49eaed2c30cd466529b427ee0d60ab4b9e9bfa83ff4176c1ec8bee55390dd23e9991a8607b159cc4eb3909f2bb6bcd4811d1cfd6413f91e2a714416b4544ffa28f2984ceba456e51c188342421d9b2918bc3d9b8236141c70922f6c8fd93bb7befe3e68f70a2d2e6fdddabbefffd434c553941333b9078ec1a46f4c0aec2fea547ff2016d66483fbdf0f280cc92e20d2c58ee8861e3acb674193f98af162aab28d7d64c91aa57286e07bcab666c449378957aa4be7ab351cf3aedfa527d2ff3afff7831696ef46a158933ab6a31208717129c9b428a7a8b991586bb399cfbbbcd30146fe9102e09aeaa85afad8e719bb7836c970513854028377216ef8fd3da54114457842d779d7007eb60fe2389e87811bbdf3a459c2be52e922123adff4aad6f6c183da2bc280c2dc020ae186414600b9c1721861aae1abe2dae14cd8b662cc6e38345c3d08ae5d26e0e182a79b556c6446fb451fc2aa3d018390a79606651f05c88015c027631119da87d25cd8a7501964ee4d8f822535f4718f8ee5ba224ca74c5073dd796b970df9e7a6419a1cd0ac8a4d0e5ff9ead7064775e2611174cd792eac626bfac01d04c9bf09c3cf32cf6578a4980f50675c244840fa192183018732785df09e51d5027e77dae6c5b8ce1d87a19e05e400ecb537fd2d99f16b3d8209d29aacc85342c6b87b49bc78f059d23d7cea8df64869fd56ff94483ca0bcb3690ab9f03dfba151cdd931f4d025f4cb4c75b69e153bc4a04964da3244eae6b55d061e360bfd325330d428a7fb7d42f48830c59426a2ee701f272e372acc59b37f612bbdf0efc76d642d2b6d9c38a8f4ae13fed5f4169bfdae1313955ee3b9ec67e4c94ecd27d50b97331fcf0b5ea965154ca727c946682a211711f26939f4759800da59a5fac6e8c83f1c44d4d2688983f857a0b1f10512a60e3476ee2e81ab3f7d0c7d9638af79f077fc00aba966c074634ee0ae48e596c1293b1c12d8c9b95594672a553e44c1448e0c21bff1faa90f33fb6f951da96913a39c54d292129664f3dc8cfbaa36ab013fc534466c3ad2ec581b01f7f62581a991ed2bf198c0cdcc67190a1d4dc2446ee272901541d8712c23f760a102762b19d19847f79b9a49abd3a1068eb1171c132d6c3d30eecb83c1e99cb8cf989e576161bafae44f89ee4b61dc8a1456248dc29c395118a045d5239dbb0d1a885f1259154fdc20e96a016305f697cee40103854035179b1a14fdc7c28d55a5630bc7a636d6e8beb1e3eee001cbe020691b1b8ed99875d51a53c056634de439e4622d2027acb3ff60db00e2cbe286258c78853547be5063011df575bd62a8218cfab92848bbf83a52f619caa18c299f468c6c078b474ff02a435591bc54c26fe8e9d91151c304ec69d2c2c0af270edd533fe507ccfa52d7ab385f1731dcb5b42668b861ab3accafc7499c6266b5cbb7f88219d83de0681628e26ba2ca4b9a03ce28efadf7973e5ac8d0ad4e96e2d1a81700e0e46279eb730274986db55d3bc4a4e76a6cdbbc69b0405567270c80047326e1ffd3ffa9f59c3de7e7e5de0f0f79dfdaeb622b727d82baa3299bdd861233ea113977336363808ebda5e39cf475049f6177c0e08f1efccfab85951e4e9283acccf1f1940991cf7e39b885a3957480a9bd01ce33695ae5ae381a4a8661e754b8c8a3e84e465b16f3a007e966193eb8981128f4267554dc7bb8ed17bffd8cb745f115e623d002985c007568af4562bbb5f52e27f47e9ce990600e0ef8026995fc01c54f533d7e3db317d4f9dec83aa20da6d2700298bdc5c5bc4d34d0b44809d143df053496dafce0101b964ac99feed07600dcab099d49e4fe345e73cc1f293bc456cf69e80ac804f22b2e3fe428bc9cf48aa651569722a50a8ee5821dc51418661378a29dc8cab95cdf8c44cdb5a41e0bed9fd9a396b37e0f4d20ffa820d72a04e2401ff642369d6303a009c966a2f9348e0b1a5fbbe5369843af82282556183a96f07c9ecbb81a6cc42f5aa79742dac030b0004fc75f1fe1ac2c48b2f14d839d57e174fd5f892faffe90b8b4e3d3d192dc8d86a8e2ae29100f6e53466dbb971fb21e084b69dd28c7aa4c6d23c79278ca0df80958800094c534cccd45817b95012b81a5216ad821c825dfd0b89bf1ff090a01a8f9b5c09a1daae620bfa858f3ef441dbb9fad2ea8c381fa9f68552110f491833063f69db4d7e7f7f24bb69e407b21a354edbe4ce0dbba939570f380f8515852552c9ebe959511c98ec6d97a6c664cda46052f505deba4039a55f03b53d23d4ce81338024d2cca916164c39f3d9cc52288eb9bba4f8c931b9832e9d37a8f6875368679c6a62d2d713f44af0dc2294b17e5d1254ea99e0800ed6771007daaeef169015366ffabb9bfb3197d19e2e4b2cf561a471207e81d1264c1517325be5435f390fbd22d4e9ac9519868c2c9347534a3ec433118d704746866014cb09f3bbaaba976afb8f7174bed405f5734d81d773ef1baabc1e6267c2802d7e92e3b3c016d6ba4bbddd9c48a4a23c5f54e2640570dea6ef22752e59ae2b69389d5158d74d79d4f802e35a839d96902511f9b70d95016df4b2ec6ceb91b4c0a81175ff524bd4dd1654e8805fc940371ddeea7b94d2fdb718b37a23c7d1e7b4bb5814edd35f2ce3b3b615534ba5c767802a2ad9176bff38995358dc6612713a61b0dbd738727a28b1a9d9b9d2642f43518d73b4eb4ee35a6baedccc449030d6f2dbf8b1c896f6271af001098708394f71288800b3709382f81084cb871037d30096e78fec95dbb390004a2d12219790108fe2b7a521d19c491212a1c4226e6059463ad4b0d96c5d9114d408702a2a1f087db8b250477a77a8291f824a001af6cffd2fa5719984ae2c4e7617c8ef7c74d39f24369c2fcc10c7005c8ab92e7716d15bf5471eb38fc0ddfeef777c35f2e59f399377677c71247a87586e009a566ad1a530bea8d462aae20c474f89282e01f3e9a59023276484495f983cf8f487dbd26010245b6fad0832eb6c299a222ca8efdc4211dd913d5aebd1f2caa2254c0a0dbb6581c506895833269756ed542d9b105666f4ac77a243d26f90a5b28c993cb15b702f048f35db95112a41b057782ad53bcc77f25e8bc699a4ef17ee6ae39e81825f8f5374a017a737546954c93604ca6b9674865f2136379e4321c1ca09ec080623b67f7219b77b1bddd31490031acd0c93c07d4bde86d4a5af3fd299d84c49e34db09d0902b30575fabacfb20e8cd142c511104e7969cc2201ae4f3b6c9ebcc549e23f4b5d00801bfb4d2a22c74141c13219a3bdb5246663c331b268ab6109579124aeab7dbf7ab8dad204517778e9082cb29a6d246fe951a4fb2090d3d2656f01bb5a21c64b6e74b75397b39b6124ad1bb2e1fe60700990c20665eeadef11f9fe18a8680183c8a4e4cb621f808d7f7bda68e8ee52601bc4445b8897a22baab32eb6c0200004b43f361863139f3f5a2c0460085f8220899ef4c19d82aa85dedf27c5653b5ab394000e6142cc406b3f2793b803f9dbb5dde00260c247252a5e18b7ea6b33c1340d6a33cce748a98130c1e10cc15af1b9a16ce664b2ab46c3bd745560d91a9233378acbc2e82b548e5e2f11fe103d382d4c2b568fe1cd20b9c8fffa06a6abf85d6ad98053c66bf9c3c956311087a1336407de85bce77e9bbc26e8643a4c65b72f4327ae438fa483045b22bdebacf3780b2ccf2d40763808b883a5817c1d625d90effc0383cc206d5331d3684df8c67708cfad403ae6f170195bb86e4509c2e336595aefe713c0a9391bbdbf3c6ebd670c70e3dcc2fbdc1a9e507bc083873d584efecbdd91bb3ee6a603e572255d9d657eb78f10848c1b2ca39c923c7f179c309a92e3e1fc8c3bdcc1e1ccb6bd9614a2f4014b48270008719aeb754b8ba8c4fd50c77751ddc2a80d8b7a8852132cc71339e87544fe4605e86b8912c13f7cb772298fef9815bf38f1596a3c50c9bf4da0cc6e06efa1735d165a3a14d1f10588f717ce9230cfe1161bdcaad9fe7668251800b3dd575e9380ee1c2cb1212090ceeccb51fd5ea9af1218918705a92e09cca6a47a6d89454492067e411607f5463402a7856a3df6af0d34695d681b9ef3f6a16961f6453270273997221e98f8e97d1c8a44942800b7e4108f76c6834246d19b0f2af7d4c0e0c4bd85b148c3f9b21f51dc5a19842bc5c79e38cf9283937616063a0bc5d925c12846ac4b2740ff762619c5388ed8a4b69b20998fdd83449531c7d95b0e4df5f34240d178c258909cd23fb2895e9f3013705aacc8014fa441086e197860705ea90a8ef6a587cc8f5828107480f766be0eed0d40a600fbbd02b8e041cf6b5858a4ac00c1cdee971383921d01308c762431556deec2ab437bc8cb10b95ce0e7a76967004f213d79f6cfa186cd277eda1cc3b961022ec82c15454c1bcc5d0d56b545da8492dc045f4f38ac620fcf0f79671974f49c2c9717fe4cc11f736f6229641fa2d0536d3014f82747e10d227a1c07ebb56b87ea1638d35150243333263bc2f74f19e127926f2b149f1c73808cf6fb62ae82b1511cd6e35c4f144f98cbd777b14eace01368048d5b36e83d245ee44270c8218bb143cb004031d9aadf6a0fc060c63aca5ad3477a8cad9da3580488af1634deeb8b137bf11a4c351432a37327e08ebd1b5719bd19539fbed201ea029b304418f4b1b71f0b2f779ee8cf5663c16361f98e7e92941d2dfc3b185eb74f12427ee8229ff427b6288f6049f76962289237ec8fe00ac55dd214b5c0ab353b9a484f743a298008492da90b008bcd2fddffd90c7f320ee9ac531273b2ee76438ecf349061404f98c353f837995887e12706c42e11dcc4596dbdf997249038527a4038cd230693cc700c215d39e847fc13d0530d10dc6e56b4b21ca3e920229c651f2b30347fdf9733c948fddacdefb268dd262dae275204dce7bae537a097b6b97e86fceaa0349b577cb3013d27697c692051ae09d9056401f5651003a77f0ee6e55de4e67dd2dce33df4e7858ed27ec08fd9963e7a06bb59b30a31866738bd7380371a5ef966eebad42e118c5311b8469dd97a20ce31a62dcbc2f85dd0bb3c065e19ac6b0f08fa13df7a0c3aaac64eaa5e721cb2951b3e20233e33b92ed0b9edb90caaf0b3eab43093c9976cfd9f17bcd0e0625124eee0b1fea577a610e8a5455d41be91c4cd52a7d52fb8f08e4003611522bc9ffec50e9214eaaff8fb0cb7e79a8bf8ac1e79d9e3edc8f480d57105ada8e50071fdbefc2b137270d1ce0d17f33e09338db73dca8839215365eeb7103f0139c3ae6688043de478de22e468020f96921f376c66dcc0ff53c35a627072853758761d274418384b438d8fd9e544fa9935172b40e6b22c4b0f1be05eb269dea79ac488be65ed9547b21d97b55c9dddd26dbcce7dbe4aa08863b74e6974b1802a954fddbd1f1f31f595140d233e952a4ca4db22f2fa255d17f6c41bf3a2851857bb1e3c3beec798026a5e24bec1454ca538f7adfcc0855738edf3a03e579840d8419df83bc4aa53961c604e453289e309dbea0952073beb191638fcf7a73b16c0130b002933e77c20c4d77f8e02e6bc656a36128ffc79a774723701b00fb4ba211f8678bec8ee495cf3f01926606163de01a02342f98ebdf3bef0a2663d3df3ff41af7fbf6f0229f5feea40c8957f9b0033b0a849fc8658c99c9264a14d43b81191cff2f81f6d0b38780438a6e2e3fa048a1009659b619ba2ba04ea23a647bf8a68aeb9c868807e1c3b68be58828c74bfb76d65c4df94727e465dcb75d844781969d7d804edc8a26e3b94cd7ff507f52ba3b155caff81e8a57462d5a6b35e9b1927ba1fec716d6281168e055ea19631d9ddabbee4e7ec9b350e1860882b3b2c75ccb74aa34883c2a255330553e65c3135496e0f305649b3b3ccded8907f95734bd6d1d19a28a02b3cb9f6162f1147ba3802623a2fcdbef11020eb2b33bc0e2529a2178f9ad1852f9999b457b9864a11cd2040893337092647536b926032599aaad978c18b407a14f8af2b8a2bfa09796bf92bfc84bd6998e230130139da2ce27d248bd65dec2520d7987f68f9cf12bbcd6b178a36fd712cee178247b2271216faabc932283234bf22fe7714fa96e807140df5280c3d2422812b63ce758c2c57fe014beac059d9a69bc59ea3f79f101d44eee9f7200f870dc9575aeb1994367d3b1a9cfefa46318cfae897e5a7f681b370e0b2752c47d5ac62fea96d31e49ed371414e59249c86baef0f0ab2bb6bf78b7aece22d26a55c869e22cc88ef966b0bdca418bcd262d22af5ea19fdd81bda200f6005a3c2d6192c6e6ec4e2b51843639ff5fcc66e5726228caaa6662b0a00360b121b8f3f9f6131e8b350e879d1bd88efea14f78dcf9f94992f9b42b7200e20427128f3e2e4c313214c62250a4588877ae2dd8ecc1a9f3e7970d02807fae7b48cb7325cfe6ce15b8a13651ce9246d823893de86d9f6fe8f3d66dbba876090e61df35052bdcb8165e5e01a23921affdb95f833ef76e1593585ff14d30168fa0ec26be48b1b8169cf74be2d0e638435fb75ab2a8fb9a01429c252cd29edaa9eff01a7bf92a85ee3b35cc45d8200cdc895c1d67d51abf197f9b629820deda5e3d6a85436639ff7c69b9a83d0e37b455e8afe95486efb456a3162e076eb575732369667e293ab8db37a59abe186a1ac0899c8a61ff7093ecbe15503b0f359bf99f0f06598521fb808b14a277a1e418235744148c8919a6f49b5ea815582958080d3a8be58dc4d73718a380586dfbe52a01bec9e303094aa90b1f42e4363de5d3037bdc2e374db2e3ae6672bae7606ba420687556263937cc250bc9e2350cfdef426d022a3d9fb8bbe431370852dd2a05e3152c6b23825c2db10ca2aa3e17e7eeb1cc965607fdbce9c0d5047392bd8fc430ccea47ea422d3e1824ade0d4408487544513e4a64c16a30a7d22ddf7602d99e830bc9c1df223d28cfdc3fe11e43e9d4d5043db58693b447be4bcb2fa86fd081029e4ac03cf433d29994148a34dbbbe30f5a9836bd945907686e466f41f416a8d60ae7b9b2c5549ee147045a27f1743a1ca770900a8624fbacbf69b8217c01eac04cc8e2a7ee250d874be5bb34cb99aa80e84dae046ab5db8311332b87a64f3f49aeffcf1db53d007772b29fd251c45206b700138d0f8abf7c1e784887a09374ac80d821a829efe5e6198b78ea3df1aac62fbf7918cf597b99e97a3dfb0555376b76806ee2ee8e59dc295957c05b72de3abe036ede9d9799e4d47833c6b9daeeb5e09e867b4fe6c8d4144d228a2673ab317263a8292e0479f02179152cf31f58854ca0ee1c4a9dab4744f07079217d5486e5b108c5cf40d340de47754bc646dcd1c762bbd84425d171d58e92483134f7649dd749c202595e3efc6e8b2574b34ff12a6f2a9204f6e7f4dd0c2781d74051f7b3badab8526858e344ba074f970b3dc1474e3c82d7f4a7eecfce0935b459307b59ed4860a575dedfd8906e07845ce43e49ab454b2d9d2cf52cdc3189f1e301aec90a841322f7b671dcc7d52a55d138033a5bc06796940df12fd316a8700676906e27dd28ab9d558211e9448ffe4a099cd97c44fd49ab176a0d170077c4fdb0091b2f1e7c5491b48ef4a731c0808825edf1cd46c74a86f48d5c428e48a7c82adeb37143f431d8c6d335ee3d71c2c88b9c52dd240e96f94b700f302847b4d2728e209f2366a4afb494bac16d2a64a8fb64ad44d390cdb9e380d3366217852c8849c931ef4de8e581b0577ff2e2c9d651d37b242f0d65937f6c03317a56b356a75fc681c618b0007fc624176d61a3c5845c272399d76d6d6b82c11990e78f3cfe2a66906465601e67f32e177f542b85ca2c8f80562467eab17b43f90ee1b87c0b977b0695680272c487ed272c548bcaed58caa5c1589db6dc08fa5cc96694d541af6dd91cf6f0235bc79eb7eb0e9912e4e2acabba8a54b9f1792940af21dfb636dd8b107bfd441b4f9cd2e6b9b50bb1467b5edc565d4f0c1200a40bbf4765301693c4a5a3e2c23fde6984be1336e3c2ebf9f91adb38520deb89998a00c851e2e6f82a28c8bb30d0558b940dffbae29159cfb3503fae021af0ef6f3007dee02dabcc229b6e080d24572325850488bb2db15126cbe8cebdd1c64e78be3dcbb7896915da5a2ce9e622561d33c810a5da0df9c541be9b5fc180f07efd2be91f0cf1d7a0334eb658ba92ce85b9a9a78d9e179121019ed66aa43ad14d49da3fe8a27714a9a1d65c84245272d275dab5cf9e66cace5d9e1c3bf568d120e0d876caa813a9c1f86cefcf2ecb2d30d930435040e1dcb525dd2b3faee1a838a1770eb13103c4bea1685a926a21bbe9efc1be640c7f8c3537fd87d312a9663e8be4fca1535d6895e7ef857f5923b48e0c52680c932f033f7c77e2f418cd61dd535392c3ff236734ca26c6d957d9e8a5129a1424eed061bef446c0858635b26a06d862a821489d78a972b628fe348aa38548b00d2794ce7fe69f3900439e1f80bbd45342ed23769d77c7685b56408e37f46b739a8610d746df9f40e1d09eb3501efd4548dbbd7a22dbff38beaf0091394c3c3f5de4c30c3c1b1863d219b055d1aa6459d94a05dfdbecfd33952d2ae3e5b3b3f2feb22e1d9aacd626c10c0c1278acd8a1a7abe7903414b2ce648a251352322e29cbd9c185ccaa90e422b57c46455efd8964db7ca0be000cd7f703dd2de37c00cfac9db3e72c33227b6f628d2595ba56c71704f07d1e5e7b2281b0c76a072723c2c933ac27fc700478231ac3454f4d8ae0f580e01c72165a9284daf0c907e40170443c45b2c518921e3c736cdf4800ec390967553abf9f105bdaf5f6ab48c298f63e77d06edf26e6d768af04473cb37f8d28a1aa7a511683bdb059867280bac063f288f011efdec39e453246dcca27590043484f87d161566f43ce9c1ec12521d46b63b027c14c4ef6dde139130cd1c2c6d08d228319c40235569e7c53525b086982626ba8fb50ce30e9b022f3ea4a133c1207cb397f4dfe660dc53ef4658e6467938eb02a6fa7ba65331cbf7668f0177d62510027d668e25b4154c078b99b565d6f21d94248c1177216d6fff8833529fda106b0f275041164eefe1a7f9d88125ca6506908f4832adde7382561548118f8304d0f510ff2a9b676653f540f49587b8b5a0b641bebf876a36124d247d30253c2598440013844f2582aa12c871b595d8004300d5e5cb3d461bd9408b8910d5c22815f4f5a12593f2fa2179fee57ae43f616ccff3e619754dfa32d734fce9cc301a083f9c0a81edc050a9bb5fbc9b59399275603b2f2aabe114b2a76feba2bd6f7b8cc89554fac89fcaf88e85e96f618fdd9c138833cf908e57cf90964325c761fd3fef8fa131195a9e27895585ab1e13e6906b2af28dc4bffe5160f883d3091fd8b924119ee0708a5b852f8586b19377a3296853079e7f84754bf03552fb9549363bdd055533f0383e635b113cf95a238813d82c1ec886fc422c973b5666c2b950acb3381dafd8af4f6f62649035314149b01be5b3694bdb2439fbe6c0845ed4b61b47873c7133253d1f447a9ebf1a762c18b0c16f7c7b2f4ba1caf653a49e9c181dda0c2804496df2784bb39020b2372cf0445b60ab7488d6c62880f34121b5e682330d7cf50dbd78244f8f3837706911ee7291225b00f875908a1fa43478e943f198354da73c1f477f69c264ba2860026a980c693fc617e424481acd443d1f935d57b15b7b78f7f70262f450ea75febb85b1e0343cac564cebe3c8245998da5a1f4751f5600dbbaf438ae8ef44c3a62dc71255c2bff0a9206301f9524e4a9037ce3ff6e3e9acbf4fe248bef13ded14a57417ae857101bcb7ceda00301312ed2a1c40b25deb25adaf9c982c1ca043ce2e669beb3e2c40fe91e01d75c3ab6e2aacf782b1935d71e7b5c3d54e7b93b477c50d7eeee1f58f4c2338b24fb894ce4faa653b3bb0aa68d3b34e78844f85df13cef7238b9317eb97a61fa1f617306109450d834a974ec640222f923cb01f3fc2ad00da6e7575ca04677756d32e6f5fc2969dabce614c76b6c0c6657e0b4d3ae2ebcfa33c17a0a0bc7ed7dd865e8c1e53d787006559f1d5b6db263fd9454fe2f05c10e34ab8ae7ddc6fc5fb6b7c4c333c31be7a6da80bb8827d119854daadfd068f6b452963e487935e6ecd58d040286225e8b0be93a7cf386bef4f80a743957354be1e748829ed8d60a677e36ee5e87334dca6a11c3fc79e0139613d53a74f9307be1bfc911fe8637bec4ca70721258df23a9c7f9e0995336360ed46fa90809e5b3541d67c22759eb2f108c5cc96b934fb8fa9c62421c4a2068673a22bead43f1c3b8055547d220e2c113f8ae997417418773e9468ce33d93a0cf1e18273e9e12fa0fec57ad1018d9b20fa91cba29f050990dfc73e2637e4b0dd566af37356dbf37368d0fcbfe931e3de0046656e0de3a057da7d0d4789444a2844437269f299788abcd803a028a71caf3f37b9c7b90572fbf8664e9b5a5569eaf946ecf37995099ac63107303adebe88f99753c07444d748870b5d62bf0d5986b878634d73297aff9b3fc58f11623c3899cfaef155f8ac37efbbd9fecb95687bb9bd9cf5ec99498291d5444594782a59c88804d3f6171b3589f7b6aed6faa999b4cfef651a086016a7f13039306cf835b97515a878702fcd709c2521e10cb2683be57545e9e96338eefd50f5604466bde092d88a0a9c40d712c10d05b42b7803e1b940a4623b15531e10c3a89804ce62bb058a42a4f52fa146f7fba890fc770772dedb20123dd57c506b40c3da31314808d0eed7ab286fb8a794dfe8eb27237b0006c711dd28231b5b2dc3d3e2e37814ca176e1daad93bdba6b8f56b3ac9837a3b999f141568dbbb7284855ec5a0767ac37cbbd8009cac93167a82e11c560a5ebb8ea7000924dcd1a3c12c1c4cd6e4b257303030525db66918c34ec60603ca07ace2938ec5d21c66e19b91ff158271096fcaeeda426f055d8e4c47c5e3a0b7a69dd1c81b7fa1af2dda0ca444415d96163312cda1cb2d9e30c912852937bab603166a28f000beceac39a5ec3776166979fce19cc20a2c323ad038856ff5293bba9297486a4f8ef619f78626074068b0ae92d83f050c620d9f134619088278d0beab6652f94b674480c23327c77378409aa083086f246ac69e87e1b26e393a1a5cc2d0e50db2eb79a9955c653ddea8cc5791318f4f719f724053b9360c59359ac4809ad174a2385f56fd8979cb11c4d3f9222d09e7b62fb84cedfdcb10b640adff2584543cbd9186db9925f583a0e3e4156eb482563dd6274cea553f3162a6a107c4c5ba77b4e0f8574e997e051bbc9499882d01ffd191ac4e8e00fa5cdc66e9881ce45ae85706aba25cedfbbd467caec7f6cd445c5d0243473f61ba33a759a57a9f8d44fb28a5412046c8d663c89f6e57455b6d51bb1a32b49a469898a3b0f6a64b19b9373372eeb5b9ba31e03f6e6dd0ea7c1c74bb0572f003773799d7aad470180595d9352d468cd1bacb54d8eec094532a84d7abffc4844b40f95e01de65f20ad6cde53072419dfa403c16d8038c4bfc40c8deb74c2b8c23be9801e2f59d373b5ed0c12167c8168694e7d7c8471388ca746710e485e213e7200417b74d30656c9d4715b9745ed29b5816543f4a3847b735e4c2adc1a0560a695f2bac1d1a75f42064597949221aad09b516e10ed1326cefb9a33e591ab5f618926f91c3cf03014be5250b81bee3425d57409ceb6d3f8787471383c5bfa375b78f0a964eeb94c6e1c01cce5945f6699b5f7298f015abe516e83ff7dd3f5817d5124095938520f6f6790704090e038832e5e78307622d6317afe1a588604b6a6f14f00bf37ebbc2f562852239672b06754c988bed2fe5f4d38fd9ffd9154cd590e554c77756035d94b6828de6081096c06040b120187461b90b0bcc9084e331b088a939ac93b518f73537b033eb9a238a0c74c0c621d9ff0e427661861e664cb060208d81777e0643a53a2d4a23924698cd473c53fc1c8124a0c32f99e0e852f59f33a184732cf93fab0e1926dbbcf4688552c56c58372c3ce9e01d68f4c0734c05f862b5212147de08964f1c58733fde2e1af78e529c6ddb94e7459b7813d16f93ebb2c41baee86d9ffda597995822f5f1ac338b4e814e391138ef9c9361a6d93f70d2e78ce22234a49a20e60a149ffe86d8bf07111595f8b300036cc28ff782f88218e373773d5c0a73f3b626cd1ca6513fcdaba4d6cd71633ba318266a2004e4ce8e6fa2557fa6530b51b7cd4c5d569e63262b8a4c7697593179883f78ea3afaff98c42c7d0c52dbc7e4a9091e6cd74b893a56f13606caacd644b6b5796d2ef91a170fb283e656838f2d18ff8ad5aeeecba709d5b6e5fc19abc6e32ab3870fe0a85a8ce0445ac6b3aa76287790765665e1c2b2bc4d6da7c0f6c74464f12a82a8256f2cb3487c80c78e999d139b26630991821c7f518c66ba0200248a7c72dc86c0861540ffb4e31f4a31b800779ec2d7f7e1ef035f7e808ad4b9401ba6cd540025fb4f9fa50bd337364771b40ae883ed739285d9e0cba86685d9075d4dfbb4b1509d9853b76012c472192cb6e63fe702efa3a12aaa9c00adfc7c2c054eaad50c5262b6b96ac5a979a30d7f74be29430f755525dceb25a6cf47b345ed1b89c6a414675263a59bc8ebe0878674c5cf720d72f5663381c365649b8910724203986fc7ef7027d92bb923580583b3fb9294c8778fe3ea7b6dfc7da576c2ff6f9efaf476c6b7ff3bec27ae0b0d182f8f4f53b3b3a857da0f293772179f1415f1edb5e24ef126695380a9c91fb6cb0ca12c988411390e0777bb6bc8668a75635c435c83414413c886d549d6494f9e2782f89d1373ee3a87a8c44dbcdb8639f987e7080fe2660fe0b3a560b26e4d9e75bf1856361889142201b568bceb788df81dd8dac8608055a4e0336b89b77cf2778e9da6aea985ea99d8065a7904e889d50789f50e0097aba0bc6a33eed76773179b9fbdcb6e711ea48c906741d0cc2df2745b780b927a86319f2c9a7282d35c2d828b82e0e5030c5bff7f4a00a5c06fbda0c63019d0c87100b1eb8258eab93c5272de9e19efae0aba610dd6e6c22a59cbe3f96a4917a02ff9ed0f4cc3fc2c5d5a9b3040efc9b5fb0eb956cbb196cda53f3546276f2451f01650f6b979f1a966fbfed5937efd15c1d5ef103243eb2f4ed929c0f9216c334e73daef536e83f80a977f0368aed3e01a51a9ed0de8bff9aa3d211158cd93613fda59ac148f30ecbd65bd42a085ee4356688adf8889a4bfa0b8e30f31e0dd7ccc11336dabdf6ef4b0cc1f0b7d975f594655a282e3ca098ec8a82584a8a6046d2a0880c54a300ee8c900e18343e6e95e8877800c8373cf44daf9c979342f70026984521a405001d52f7de61461857240ebecb5cc6e47715d45df200638d520c4951e0b36c88c91de5a96253475ee45b099b4b4584a22450c6c7161630cbee6f19bd4cd9afc38d1c423fdd556eb5634a26899fd991140a2bc893a44350bfc7011965ab02e71511e3d2896d14a779e84dd5d6829b3eab9d6f1c900bc234a88bd3c4069a12ee72ec66e749c9e2e6a60df76d0001e107bbece2c63b13aa138ef0d2506ef2021f39a68cb1af35bf4279bd3c8a9ffcb629fe6921f77fd07e5eafb8f1ee6392bcdc64b957a5cb4d0ca04491dc1b63f4f14e0dd8d63b1f46afca0646d2b818411463f8be991c3574ac048d3aa363b07767bfb230a3b380ac91c0878da489cea6f3a73a5da57358d1f64c5acc47863d0201cedacaaa298e3221360b6f9191b6dde3888733a0b07b35c57be1053b16529eef755512c18ad30b16351fda17432ebee6536d8933b21e2003a1e74a9cf067208e4da6b15901fb9429f17016a13b9d4f638a76dc8cd6c7cd6ac676786f880c210e4b67d9a063c2ebb0e0efe6a3217d1f3eab6492cc798286ba0f6c761785edc45bc6862e0f912def1beb18a6e0cd539759e784e8be20fee2607990aed3f546624af0a29e12aa4befe6887f1c1db0455d36e140a141c91213d3865a302e0952b97ffe342043cf01d52cd1ea230d16c409cc2bbdf1a5758822b8ee9a5b4c3215517008989349889568b54bffb54a0ee929563ac6b35f30823c73ef77860039de054d1d20e40f72894590e04b6733848b82365044f91dd0d923131f3f2b447e2af58dc308312ddcebfa9ab03ad26826d810138726e064e428fd87503262116d5d49db3209e0243b721473f9756df94502c7ed9c6363d3000b3f209459f31901da7538b8bcc4431963c193b636689fd8e9f4186303affbad642a6d8c58f9c8f41f2b772fb312966713b335e9e12f042fc951c2d7ec8c3781876e781251472ddef134a41c0e260bbe827f2b4d54f968872ee60b6c7b2c2673603791bf95c155b007871a205b83cb33936fbe54a313fb6776863bb66f78ea4bb2a518ca3c1c88a1cf8b0860dfca14d939d1982bc954d7d8a7e82000099184ce5d48a56be36bc3abc1f28f2face1fadd364fcfeb378da49c034f58e838ebfe7229075303ef9fcdbef890dacb9f3ee7371003e0f5cdbc3822f2b1b6a23f225236cb392494805f67ba79006a3c3680bda2a4c1d74ff6cf159e06429438e0702fe98242f041ec2e9c79b02bb3b6930f04a4da525db860fa26feac44e4f9a488b8e306a8643b1bb45d0a6295b5aa6ab85a809bd9d2c1dddea990b377e2226ab45477e8af830f4b368a1df356ef5a50ba0fa79c99e48c46df343b4c89d0d36c347808f79f017e0e0f87201b00b39aa060e85d778d8671607ab9ded3d0fe2601a9bd3076fdee2882934570bf2725d90993f13a7b7a4ced83c5c8909f8d9c43e2cc7bb7111654b4fbd12ea5d4c1b2296344f5a82c0481095c7fc0c6d15070c8d11ce76540243acafd524f4d47c91d0d6b8e5406777a4cc844350e51f01aaf7bd5e144d2520951fc99c7c6a5f87bbc03a7dd6f088c8ab7d2d9ae2334a709eb86c49e3ac1b9401f6ca434e13a0dc036721bde22b13f09dd050d6f0b2d74c4d043811e6390182ca090b8037ec3b0cc0ea313af5956e405f109dbcee3fbbb717bbdb87a569e07dc7cc9b65fd5a2a9ed37c18e65af5f0bce7d704f797e823cf1056eee162aa0f1f09da08aa227c996103bbec61c9a4d2043410a6a1e350766d58b4ddc8f086a464e936cb92eb40677f5055e6dfd56233c18efd16be52d5c5e00ad56358e8c09fa7c4ec54fd6351236655cadce96b2880b9e613d6e7a8f6af15aaaa23fdacb30d2a59fbabb642d4f81154350f9cf202b249dfcdf7226f39df72922a70a91db2089b691f10be00377b1938fe69b2e5adba632e573dea8af0600caa6929bc519806bb9b084036ec1741de742f3e6b90416d90e09af23941eecd6bba66c30ca93674b1496cb60a6b4d69aa2b9ff878c2c924f36340a0c119bf75c775ce4c703a0708dc4ed75ab60d9cfb37e1abab89cac4e129df590889829fd2f79466cafb26dcb6875cb0815a6a5a0df625a6b08b6b5085eb891a77e9a93d6c9b116f891ea40b3ff1fbb8b94e0cf95ebe259967fb5ef3092b37b012589ece19cee303411bbf5eedd35b1f46d081a28be77b9a5e9a536f3161931c1fa7bce744cbff34764c296e828959c065c7616cfd1854d2e2fd2ecd98f9ee6b38a5f78605cc2ab94f754cd8f356b49a9a814782750c2c2f7e3657cbf49af5f9c68cf70378c916ddce3b38ecadf144c8bdc7855a75fee791601f770df157530cf1861bc7ef3f13c247a4c28063e48a859df10b2c00aa0e2234b4003a26a772f3dc9faa001eca026cdaf51f30a7ed392ffdd35d5237a1704844bf731c3a0f0ba44406fc6eeb792df4649ca01884610a91ce2d6ac09b7abd65a025e88924ccad86d3b9c26ff37dc14fb7c8d4ef3222dc582a84a50743d2b3a6a3cfb8a77b253d8492e64199b93f732599848a14d48d341bc66678d4307ebc68fade0438dde9344e259850db8cf65b6cf554efeb5108e87e0b4b910fe8822c47be4039573d2e60f5c4a1e691f08c0d9b2a2f59f3b007df12bf6386eed65bc5c1391b076c5856e5e04292cd3374e06320beb19cb6147405edebdbb129db08c4a41969f34c807c9c40ce5b39f446b842d015fd1307429e1c9ba3d3f829cf60a1160fed866560c09cf33eea83764111290299f0c7a2f3a71a79fc335f421ddb8e1f7b8efb7e45abb6aee533190c6a69c69e81395481ae43c3978c8a1f14c14c1e67c8fef7105f3d0c7e4568933a76613dfaf6dafe0c04f5f11c8a212174766e7888f86e22d8564a2850faf99b781f18fd4da409ed4a2b428e1f5024f59c969ccda821f7bb03922b6ee5cda87d6b8143bf438fcdbd73a1f784cac27f07cc695bfd4a4e495b247117ca6a7c5425664a09afe5aa6d77566df5d991f4b2536bbeae9635d8c154aca0f4fb6231831fc203ecb5c60c96185ae694bfd0db30f077c7b29888cfb3facd451985c813b6550380d800bdc568fd9f2e5b5c4bb7b4e4bee831008665a42fac5d009f6952a85892990c1699f45a53569937792faa3e175c45dfb42cfb89a9e166f43d0bf4dc9f95c6d430592b6611abe6ca1e5db6538cf659cea6d94d39fc131bfd2bdc3d8ea93f08f17a34e0391b73893df6d991e52eaa2ee738d5d94760720d81087534d4b4930f24457bde192dbf048cc7df4babceeb14e826d83daf117ffb06583eefa1e11c0b90eeb583d89502b66ea06e110ff10a15920820ff2b2feaafbbe8b2b757b732c8734c27368cee3135fb10690cba96d4ee15dc718c108b06051fb218f860e81dbd50e2f00b10ac7a37becbccab92d6b63e74d85bdfba8b93dc8f301c8777c9e7122fd77a1c940bf2fd9e69f079a68b4518dd9ec452240e032f4d8e5536b7bad8bd92e83e86db268a983a3e67ddc202b11513753fe5a6fe2ded651faa5a4d943eef99aba91a75c5d34911b592ba9a8ba6fd338455770dc8a431178c186615786e0e825815750dcfb9767a499f0fcb8ac3899f90b7114b7bfec8325e5a130beba009388108daad020a56851849f2811adb35c26811b92ca019228edda996748865fca1273880029d449c4d7695f9b5a979dd55a26e96f5d1e1b93638003ab86f066e2b1b9992e0f7d611fe66fb08a30f6e9fe43d6410ae730a08c4471e0b44a4788aa1f31f0cb2a7eddd3bf9764a16854683c0ee8192b8100ad18155268089dca576474f403d1462b7a14bf750794c84b507b76670cc7d890cfd98d61edc8671147fb1239a8880c2a49e42ed8f970965a17db8d0d3d4477fab538444820870817b7220493d1cad0595122c886b4bf604ac4834639e71d4d2af5fa35288010efd620ef0606ac5900525094ea157e2d4e0ac7511fe41febc50fe68dce738b8614333863a035c71152b06707b7dfaa8478f32d8013e24bb875ed32e7d306865da8fabe4bee9f6552ab65a5a2b032cee5c6eb1300961ab5424b4ce7dcddd7ea6962b813490a5c867c3d056f642d06c0682244ced72fb53a4593190e0da6e4a8872cade285da70a8dff0c85b9288246b9ef60e76a834fdd4db27979a941ce898aeb601b8e1bb635c81d6df9c6a2110c581a5ecc3d5da2aa7fde9dcc9dd49cd2cda52865904720830d05eaf9621abdd0c0a8cd03bb723188b17fb92bc7e71f1a9711ff91472307cf65480fbf176f00c5b8b09c914a1b207b452ad191a1c3fe964a6674119982b0984c316eec9a9390418523a084958790a001cd9f8fc23c67c5db780efd78f0956a6d0b9631325ff4e1f495745e8ccb33f896544664f4e18da0895d9cc677beb821bee697b222e06d18314e08199f17fcbac44ea387d8aa4e759d6e9be4184d2ff4ecc41350d4a8e6c681f4640c52fdeb77e797b6718f0ca96709808449488ce8c421cb8990b24a433c090577fa68faa4afbb01e612e84768bfbaac5a20949d70720c9bd6f218f74755cca480c06b43bcb3c00efc2c5041d6079753da747eb601c8f1cd5be210c089e1d07f36b07f886a01700905aee7f70cf6de5387ed8ec06f9ddcc89b37a7c2eb0e611bdf7575822aa31faaa45c63d210017377d24c657fd330d0a8e8a4a3f19396bcc85b1f4126c3b03b63995a35e5c7cfe0fc46de53b88319557e729ce4d85d328b830473930f1281daf336e129bf843dccc54b0a2e5818ab4f096ff95a3c496f90a600f168153e06da41664b46f781dd4f4af6255fa5f6eea3b7d27cf15e2e214edec1ee61e791d7f936e8031fa10cad257f6b2916af619d8f53ac731ea70072a32a36e459c8bbc5d90173369233b7e0a6ab70180f08350fc3c78b93f03351b1fd5eac254d819545e3418139ecc7da9bc02205d08ba83453e0b3a9be081ddbeb7917a554f3ec80ccf7430f4949b16065e094d8f7edb4ed70e9f3273ec9b9f7ed90cf30c92410924690da4f5e500ea35238a1ad6c2eb67716986285533269c3f0dacba6858b3952da70715fc16f1e606139db28e5ab4c2ce8fb0fbe6b72a25a7395da8a9cc71c8dbeace952ac7fe3dc944ba9329fedec0366d0e2a6217a0f9e553220d7b878c50245c9a49d27bd5c52634b51dcc8dd45b4808d09ba0066f58ec779390a51a0040a250e786f5594e0c4ed9b1b256bd481e984bef6d06c330d142050e17ddf578de318511a7d1425e098187a2ed621758b052e8e176cdc40c46254a640490b52085832ba20e93f94e8024d508476bddf21a520f17dc1b01b98f020806b66015864cd858fa9372c6e2eb168313aaa52549cdf75fc8c151d3e5b5fba9426069e25856b45422d6fadd2a47acce4cb54f1319060b434c866d3e156a3e745218dbdd506508e6dea225eda0921319760132946a66e134227a87af88832f496ae53e5d30bb29c49e6be1f90a61040ef96c4b5067f3ccc8700847361e033c46c27104ffa87a87178bb265f29258c8d4d0e33979b7d82d607adb1f8c074623b7a9102ecc2e1f9253c3edf4eb4f0fc26dd0de5c9e05c6ae7aae8e1d74cda8d98535080c03a8313ca2acac438509c48a491564c0e1fb1ed896dec85ef7a39b8dcb3c0ac717c5a574255c02aa630dbdb3823afedb5fba03c7bb2f1301e46735de3d6741ad505035c5bae209bcfc6323099d57324705d7a8c34ee489e534640c35bc6a74b879ee5b0bb8dd754f171a7d8a44b37cd90d68bc41e2daf15f55ddb64a17566fd00ce697b4db33d86208976829b3e1f5a7416fd601a290010d323d3434954d93240b28073ffedc7f2b5f476f167bb233632f46a1a6d57a1424afdb0523cad12ff1ed84dfcff152bb6779b30a87661af3e9ad7fb2eede7911eba42d8ae0b3a4922f2c72586453a0903650a8519166838207c7e29c3969ff13a7510dcaf6e7fb6c2b548b49460e18012baef2640890c7d765f653850a98345aef7961d74364543d8aa69700cba09c95034319a7808a8cfe089e9c956d47cac62002c9eb1512e0d74bc8fc74bac22381a98142a690601f86a1a9d0f5c0937dfd851ce08c88be6e43d8fdc8bae35e07fb117fee7dfdd7947e29a0b55342762cdf8159d319e769ead88f9382b463cabf363df0670d7a57271494d8d2cebf1c6283f27485c05151e4b122244ffafd02c638fbb649bf153a866be4239af62f0c8fc4e77693d955ca92fbbb10924a373c3a78ee4c661e1ef97ea11b0d4f51817344d67ff2ac42ee6461c003432af9855a5f76d4daf015727d5087255605939bd34b12451b36ff1db5ad38dc1035047c221be5706886cac3d501648a329b2411e37be97a9a476fc8dd11013ba9a1ae93c02dfccbde868009346905d6b6880432c563f99dd22dfb132e4233c69e39163f8032cf66bd6e465a89be80e4a133c65b39b75d509fb05287e27da7d7285863e3f718c08bfd0a9e5c06890c033c7108b553e436f836a7f5613aa3d7fbe2aaea5d6f5e59fc6962a87c43f734072accebc95013a31e81a50c8f6f2d39832030f25eb07a3b04b8e0304d272f2dc9b47310febd8ced9ab4a655ea31a7691b6023ff12861d76baf6e918c29aaffb05b465624a89ecf744707e6e220e0ae232a1e8c551096cc798985b3194d07333e6bff5dd4829489e49c1209f7b6d2cb30f978bce64ea9b3a514eb020fb3bc6dd5cb65e8d14e833bf021be4561c39df4e9cc1790befaeec343dab7a63b6d4dc8c0a8cc3772b6f938b25e2a47f45d3a063adec573e04fa2b41aacc76bcafee0f2ab456f388583681dd8160ed31f5979e7dbf2c37affe648f6305afea669af1717ea1a819048f26ce28ccd529d3dfab373faa04591b04d031120367913dca965a4a0ab5c6c0832efd89e764974764b168f6c16b3d9b124cb9843f906f4f1a973ae137756158fceeca78b5e2fb43520a6aa41a07f0509c3dc1057b6b05db2016dac4ddd3d44aae9e11580058c0c45252fdc62fc7eeaa412cf92a3610f6d8b9c098aab0c4da270e8eed78ec81342f0696ea18a56125e3fa58bb6bf2e05fda17b92d7ff84a61b069885e3e2c8a17f3d4c93fba969632035108e96daf19c79eb521d4119d63aa2b6d9785009d4fb529dd4eba3484b45f2aca575dc62ab44877c0392f2636d703bd28822f8a1b6d747492be6e5318f225e454ad4115bc930ca147e2aea02782bdeb052789cdf0e2cc670459724114910d8f83112db217258d4bfe7b469c2fa200c6eb4b5aa9628aceb95502881d0f3ac8c1636157bc9481f0bd47f55987d50099c93b0254738d76692e00bbc5bb9ec0d53583fab86c6b1e87cc69889ce2166a2b523d900d449a4c5b5588ab53faa3746101609a94d39a0265f01b9768456ab700084f0b2942ba9891513ef35f793398e607f17e3ea46f356e429a06a03f91c1870fec3d1bad8ee1804755273326342522939752583b2fb3e0656668142f1879610530c4d576c15ac2739bdc6c43b51d00c1199b58442cde7dd02c4bae538d89c3a6d312e4c34404a4672aad4dc04f7b56fdcb6aef4353d554360b3a7ac18a71c39396fa62b743e3d0b008ce25c278fe925e3380090bcf660b042491d72eaff0847d5bc944a4f686dc8f38dc3aacdecfc5693e59bd66155894849f0f8261ea0ddeebda1d747489f70d193bbe8427eeab35a9562d1e052c379614341f867e707f4ca2ea893bd053a69c3b9c97d147b2c5ee2b4b3bcd1fce779d9b2a3ac52000a65443737f616f9a9e32e71f763e03dbe80880e552eb9f5fb72b8e9b17333daafeb47cbb7410588373140b4e77d0f3f93e248d80271aba536271445c214394e60b7ee14d3ac9c69aa2d673c088f097790dcf61d186b066f01dfdc8b206e6f97e8785738db5c38518c98321d31e490f18f82564691de082b51ea9fe89525d4b5623d24e57458edd1a479d23f278a43ec5b12610f3bf1c8a6cd6ddc66461e0d458adcf37616b4b1571bb7ffcc4ed3cf7b75d31cf4d58f96e1e0b1821e6037026069f56fd183c655e90aa20d07f8beaa23ced84129c32028e2d71a54470a21608e30f65c4ab1dcfc3a48bd88efd30c1d3dd112033ef59bdfba60ccfa263e6acee3be5e2ec7bcc14b63b47c2b07154e9f2188b670684890647fa2bc9696c915be52674a70b2c7075a7153024c9a8fa7050a63e63c24c3ed8918241da5fadfa5a1113ea0ef39c81dec1f71cf39b873bf893f22c10b37301dcb9d47d037f3035b31d1233f595d26be61d8941561e897251804cb52358f05a5526a25c8f2b8ebc75175ef74f271f95642730801e9f7f60ab143fa5e67ab97f21fa19f7de4384791109d7dbc79021cacad82ecacae773a034832cde04ffbd3058c46f8700686a47d0b8601121d031cd0defd98fc98b3b3ea7aa53ee629e5d986e79c31de7dc073917a198bcfa4fd213aef21923ee9681667df752800d91749f5180e776fbfb67e569fa4f80577c17dafd108476e9da0ffb33179227f4d0982ea98987b47d0a57350740ed0c7977a1964943c0e09ed5426f34a9510d84bc5a0436431734c68c8e8dd91d883539dcfdca55ca86040d78d83457d8084b4f1e35d218002f8fe22a4737df71b4715c4353e9256a42ed49808561b0214b5e2470589154dd215554b1969d883a0eb348f87e143eafa40df5322ea3351092e85710d90b3ed5d2ef0d627303885c01913c3d594f0b9178d7e0e717a8964887bd2af44c048c77337db1f1f4ba9d2fa096a202a89bbfa8b8bf1bc760d3b84335dc62437777d378c9649326031c3d7dc9384fbe4208f9f51e8dda1a48adef0491c16c3e0171480c36be122641f880d3b058c86199334e45dd49bcd30c6cc731de352a32f227288ed0c4aaa7b409c1c519a062644e12cd11f0a8d38feab8244ad032dd907bed4ffb07d2e6dd68003f1eb739cc03bce18c31238a918f17c889f27047d603672c2f4edb2ea224216ace1bfc863ec1090fa9c47c2fec402a01de34edb21a1e652b6865774b4193b826ba8d82d4b57c80ad1c4e049a174deb209be1b19ef756c6ddf69e9466ac05f857aa9e85a7b16ae8f0e97c98c5134066b472a9f1ea7ba83e9f32b84a9cf806ee0db79c38c31ce611a8d129ac928999ddbbea18ee87b08d653fae943e1950a8ada04a6118e43f98f310c28e29862cedd1fcd1703543290f5a4193ee2de0a2803944d7a0eab7151f2ca61dd325236147f3d525b9f654f802d17141efe2dc3e8ed1f2cbe06d76cce8370f00e95f71105ff7e6da7445f70cb6af7b3ccba7017b86410941438a7e620fb1c5b94ee5dbd6b35b6ea9670aa15137d462baed576c9a65217044ef94112b2dda9cbcd100d8aa518b904f5b0e002569f0fa19f87f47b78cf0ef9210d1a891317d703443911892e23e9125ae2c4636a0c262ce4e2304156aaf89b1c1625644d865da1228bd8cd37f44e4d900264e5a28f11ec33b6b3191077f5376df0200ade31d9e8c751b52fef6a9caf91023eb19423038a5e07d16068952599e51616ba175c74eeea2c6efe68942747f10d7b9fe402580280a34703973600f46cfe728ac7ff38dd22da778266fa5b2345ad57befbdd5693237bf5ae1b5cacd6126ce5b24494c6d7241d53b7d655088a8ebd5dd8989708e83f6b5ae48b393704acf937977a7a1cb4de08fa07c49bcafb10b01d943512a012719ae2615f423edc2d1fe611386339660cd297c28904504d1ae002c07cda01f8ded57d3cbfb4778d07462697b1c8bf7c9efaca93b5d2391b3ee2c09206e5b7e223e5760e41a6e76daa5e59a74e6e7e191ecbd4e6fed8d14966654fce19f251ee4c1f2df62023da152163dee32c199cf14b2cf9d41e362a2b77600ad9562731e6b5732a59033e00c9fd62dc2b329c47d783459504979dfafad2b0314a2ef94f77ecb791274648443d4e3e3238b1d3331812497dd087b9ab8cbe727080d3a2f7746e9fc44471ae48a19ebb8ce60457e19bcbabb745ef84436c3bb4b38a6337dbd1ecec3db2a8869a29f1dd49ad8c48914b4f19743891632a196b78bdabd0387bc8aad04cd7a1ed3a4970ed7d9e20302885b58f54ed3331ca784182d4e13911481ff931558002e7acea8abfc2df92b62daa0f61ba9db684e65a9a577eb6697e570590e5df385906e3c9b6d6b464631cc46ed81e80b723393ebdbe9951cc88ac74ffece1c82ce8e8a1a2542412666ff4e1e6f6697fb461143d20792a7c78330811106e87b71a052640ed28e7896995877e3ca97d791d6ee9c5a9a34f81cdf4c81c03b64b477d5066267a1bc838dff90719b7df7382d875ead54d30e98e68414cda9fa14ab826f93b9feb5bb90f21ed369ce50b4450a1dcc0409863cbe73ed3acd02d1f62b71528e1480cf03750ff4f6791271054aa0969d1eb289b68edb225063f4a12920a2d21f13a732e157610450d82ce8883910c28a23087dc097ee0805345adbe92e23935751b3a4d35a4e052ec0323de5e29d06b492040b900998589d9f9fb75a2a74b287b4ded08c23b0f77f6ac85cd2fbccc087ff5cf59c31e84201f567c32561707e35336487aee85699b2860f977669a2c9b7576b212e14ceed4080f4e33e59ee068c14a19772ecf9d16ed358d57495691bd6ea843f2a381dd2ab53164cc8df05010917e8e24a0a27f1ec658b039ec3febf54d4ef5a38b596165cd0f6ec71baeb9c9ee4c889055324bbe1c0d433c85129f4522bd6ea7befdc0133bba7cc767e30519251aec80f03e5fc6b3681e3b1856226273e329341e60fd59e3ca42c11a55816e6ea0b56a8cca5215ad6b11df3fc86c94ae10aa87ec2cc5d610e722ec912df82ca0e332340fdd80eff795f7c9bae61c233fbe9c9c5b87ce2f91a0616f602f8af2b8203c03b46b083f11afc97cc725ed368a7605c862443a8fef4f88bb37cd1aac76af22910be5a08f4ac4aba389cbb78936c1cf7f3a3c85084301299c08413ef92f8a842ff174981224f1dafaed98a3b450db176b50cb941a0def3fb52d1f2bb88881ab00ad87a9e14a7b8562585f903df48151894aa98159bb9d77e2f85b884c02c6f23cbec79c7c13de70e337815de75a1b3f60e0d7fc07e513a75f45d93b9b4e90109642f32c18d137d84dbd401be6e55dfab30714a360e26384dcca5715c5d9dfd571efa6a82afb9208092f5107a5f6db601e0733369b745805ad42d487dc5fa0f976b878c669af7455f24c80962650689461f027ea483403ca45542edd7ba11afb30b1e9a65576b424febcc88fa06a921573e3c8a1e37d593e62fc22047e9c6b5e69002ca54ed97d567827426c4cfb261ba446dac913138fb4d0ae8347a671995e5996f70e5d9f71ce0d01e5dc6f372809c8831cd18c94b91e54250322c9500adfa24c28f24e2662dae451d9051e7b6dac755c33099b56f8e60329d63534a5d89c12653bd95159a76daefb9e98848aa5195e56e5689b8e7cb21424c6aeb9c30e33afb337d0e7728e949a3b5f3bcc422bca96387b4ec038178c2ec42d38c32680989c02ab8b2a6d49b5e955b8253cb7433342f21a2dd35f1594c118a329d3fc914bb49c2408fe5471163e42eda207e6560a9aa10029b34c3bfa3812ac87e5b120b073483d78d079a0f132470996d689717874420441254e21a49f9387f04e1f4be77d0884e8dee1997f913248d4cc48fe00c922de8d79b4f455c1ebc106659ea9d22129c25b5b5ee9217c0b754553cc371eb9aece1090412e3929cb2b862acec8397f45daf0aeb5485b6875be2c500faf6185827495e0ca620b3e47639cab7cb253c629e03d087907a421efde377e8b109d1281c8e9d8852d13bd7e8ba0344c75b61c2cb528cd5fb6f53a137264fb45e89c8c302028fa9a6177ff5f939e1fbbbeb0cb30df1de5d62330b1395196046a47fe328413870b3390006338c1bc1e8534cdbd29421de49d6afa2aefa193fbe8951b688334805b6dcd9d9e4447516d3cc808b99bd0a75a789f0c8d21b5c7ec1082160a04b63f3c233834f96c6aae9936cbb4a814899e3d05f0f4511d83d85cb3fdf53348dec87d00d0fa2ab4dd0d74a0ab12bfcdf0ecfde43f421731484e3d5ad050a7512d98f7915563c4f17a5d4761e57514d43d1f2daf4b7f462c72f5c543af7e272ce1fb997e2ee353be693d03b37dbd2c4e376e92727525b71d878375b4741d592ed83594ca58af86d206e335337d41a6a2e3badb150415a4e95680e252ade9f249ba3c7be3ea394ffbc6242632ac746f970a538ef787749ca8713b4e446585f7137e2e56ab06bc75992c5f17c82dace8fff4f5243421d6d4172059fa87f9f4c8b5716f10ab2ff6af843f45ac5534599ed880653e87d9b6add9a6d2ed9434608721e2e9013b9e837e5d58c0e62da4df8d2fb06839e8bb982e44fe47c22d5b4b587d85afbe8b01102210dc728f703e6577a96f4264f0adc1800d4706e5aa511de0bc7bc12e63a1097f24a90cc79488c20b26ee2b4968fbaa12221dd7a209431f2742a941f2e0f94884377665e8c5724913d828dbdd9a6d09c97451be6df7cb962c14ce945771af84c4ae2b3fb12b5d25e14dcc645728b8d94875501f6f0827a07722a9d55386c819c0164ec449ab126696cece6709ca4030d879818700bd24c37273cccf185dd36cb647593436505029c4c6aa36d16a73b87df397615ec91dce7da8e3a78e67e4209b6693c35b734b3aff1f65a02845cec47d297a39cab3ca96775e8ab874272880975f391c56dd524003d2567f07a5ca8736b341aaeb4cefec2f67f8cc207aaec8f1fc26a9549d6736479878e66f2233b80dd68c111d087dd1f51a874512b8de38aa3bb96331bbeaf605c3420817be8b90f8c42e5c2361d3f1f53cf93308dd670c3c6d2d40ca0c322ec0c3ccd491619845ba9d84f7a92fe6d7c08502343727949f63f12c82a48e6b52437fbe7d0641f1a61cdf234b5ff309c6904a157bc4a187876e9c4fd3a5e38c84423ca0af24465e6ed0ec6f815c0e120d3235cdf07f6798428cfb85653330481378ea3454e403890482b628ccabf1b4bc34503c693d067f8b20c25000322ba35c2a56620b632376c6350f12aa5b91c024c1b10a20de0d664dc35fa1801f3985701c0fd0c0a3648b8732970646a630579b419e7919e88e96781b6a5ac343bb720b2582410142ef9d5dc609e1bffff12ed527f7701baf0033d15006e7df70341138e501e6fedb04cde03890e24d40fc4d6b8b7300e60597cc340e6c56afcc552f6fd52fb74839705790e50905726e553d450bc83d078ecbc2ad7159a64d4cc8e9a95a76a2a09c36ba4e6d31850bf5652d0ef0efd8c07604083ce33df963051837f70bc6ef43e4990537cdb8e49ed4c9460e709c21aec37785039f5a15e19c51a8637750ff66a00f7601ff8fc20680719f62894803cd5918491950af73fb22904c5b92f4927d3390f30c6c492f01b7fb6b04499895df0cf50c944540c29aeb8c120c4c6ad4a1799de5d55a000d8cafd7768130f41ae454518c683f033f53b2343fd438181f227d5724b012bfc07736535d7bbc3ed25b7f729aa142be9d8119c734393a8ae1840db523212c5ea181843534990d5aa5ffb5cca568e01603f83bfa622e5ffc82c5cd44629a478a0612be855830f86ba9b387eb9dfeb9e37304fbac707e43235d37d7f7e452d43962249bffa3d13f98fec1f81fac7fa93b84b67ca60b61eda0feb325b5b1a388a2ba7948bce1f2d9974d7fea08c07f68914ddd7f4bf1150882b1657959a159f1e3bc73b93f142146eb0ca434b1cedc339f93ff8772dc011ccc4edbea5680dd636cbd0ac65b71bf4fba8cf621482f7880c6fd5a2bc90fa973a4c3f1194815f52cae441cfb020451909bf52d6dba04ad82e9a73b7819e0a03991edc20d2f38fe6f4e6d01d9df772ac7054cd8326c4cdc72a0e9eac003bbb4ad67ba8f25505c9c1a6d60202af1898061076e37cade617d8112e9cd0275f2ee7aedff7537fd77caef09eb3aae3a7c92969b468b77d8b0e18c9f5c22d9feefc6ff68f54fa16d87f53fc1281467dea1240104c6026a3c0e755b3092324e07c9094408564903e0632b121cf75845d3e438bf29391b75cd28cf4755343a4a003b8ac9becc3b00443a86c1eac3fb7f37b3abe402808c78ea30ad4fd4db1241dae85308ee251ef8073686faa51bd97b6fb9b79449ca14120736073d07749a20fdc61317e830459c1fff2007b1cbe1f5d72a88d28391383f862208b1d391c35a1d33a65189d4820b1547e2fc783811934c49c7e8bafee40e4c62622753a00691d8cd32904469c30e49a254410c49ecb41dbcf8a155701912bbad065c7401123beb831831b1dbbcfe640aa480891db7044cecb833e990c58f778a9111542af5f4e723e8852476d79b1f0d16627f1209316410248168e0237637bcf9d10489fdb1b0100249ec5e6ee0212676379af0113b1c5e7f1207a024714a51c64bec60bcfe642b0c22b18b79c1608390d8c930a1612243c3344c8868880190d8cd2851a3c44c0dd728010510af98d8d138b1a18162c3362d2b593871343f1a09b258c344ecb8bb39c1075db46a4a3d1978c337b202f577820fba68899d8d37bf1a25c4fea413b02e80c4aec6eb4fca200c23b1b3f1fa9337bce02576375e7f548c247ec48e3b709a60052e787908dc2507245c3b457c2178f3a36122f6576ac20621b1e38ec7093020a4104410418b71ba1e9e64a1e9fc685898486a473f1acd5170fd24894ac4fad1689adbd78cbce6354c442522973c20db784d89eba512917e4a44b1c72af4b4d493818cd32304f0ebd1a3478f1e59a53b4a66123a619c748cb359e99fad15a5431062c82fac48a1b57b60246435ad7a9ab79500430c2fd1824ac43ae552bbf564ae691cf8ccab3c12f3ed5bbb12b1b31f381e89d97ab49d8f86056bb72f86865d89a8444ca1edc7a2fc686f9aad536e8da1f6a59764d0d55a6badb5d65a11303da3318053f944567aa1be549fe0073ca07d976cc96ea5acb9cd6a9996717da19e396756360f3ae629e504a7fc40c72f058b2d5c4efccc3c459a68c22afe91ae8a34f1c3957651a71262ccb22cebeeac332deb6e26e109ae75f3ced2cc3c74fe40eee0ab779d3dcc1ebefaacdd5d73602267d6923a13b2e034e1a172897977be2b33333333336b5f83ddddddddb4bbbbe9910a048bca75d6b955e95ea094e085ce12b7b2516bad9a6b55f39a39f74634a763966559d69d65dc9e65d676a0b96fee79bcd69ad5aa84b42e418d0d4dd3b46dd336d7506f6463cab4a39db44468527c5883d963a37da4716da76414b02b9ea3805d79f62c3c261cd6984941c17d1d373bd08763ea751fc7b99dab0de4616d0d4dd358d36c359d91e5b42e1634ab9a4f97a71fba99182e7521ecf314579a50afb57e33743c6cf051c16923c85b6f1f645cf63cec94f50ec78f04f18ce85ea2b830e82cf102c5a15cc0a1c890202649660697faed66b61cc771eddc1be96e66e6beacdb3aad6efb03d483b2639b998ef42d731cc71cc731534b43f711f1687f65724e9eb27f5ce03b73179eb3eeacdb82a392259ebb7f4c961411f09c7577b792a13fc2af51d2f0197da6a2cb0e4fbda6a0b8da33155d6e78d9c3aacc997e3bf7c80387555965fbc558af0645fd699031c809fe63bc9f65c926253271d1b5772d6b77edd6ba767777d7ee9d233bcd3c5fa06468c869c16ee62db899ef62ec3af6ce39d0083bf7463a8ebbe71cbbe79765d3f9cb7c76cba9c96c826377c6bd9dabaebb3b88e7a51fde67dd07199773eb3173c565e1388e39aebb53200078825717724f78ba73b71a5852a4555071f2d4bdfbbaa8b73eee3ce58f67e881b60cebaa7438436c50ba06a59429659e2ee8545ca877f4a3e00b944b9d524a29adb5ce1bbaef8766e6cf05695df823df7f2f5170cba0e32d6ccd57ef0a76169f2506af934b5dfe903a4b5cead3b3505ab32c3a118266be8b4c8789cc0875d41b6190f26c1f29cfee91c131c9738351b476f969deccd56957aa3538326ba8cf28a595d2aeb373d0b16fc1b566599665dd19675996f9dca2997da471bd535396187c8172ab4f2f0b777737b3ad37bb6287bba8ce2a70ac8499c70a8e49be3a73917d0878f65ac7249fb99ca091233c05d014402392b7cf53003d3bf7bccab818228c1efcc8ce9f0e131a48a77777777f5c7f3a7ec6e92a7bc7956ba53eb8dc76d373d1500c3c9a655996655996d5aa79966959562b9d5d7400c0e1054a084397ba3da2a37981cdb395143079ea3f9382e27acf566e60e3a95346ea64c4609ccc27133dde48e5e700f3bcb0f35138dff991c17025499058b71cb8814b6450899bffe010ad8f7654f29aeffc887afaa11ec76b9b5b9e91561f3503705fbd561fa902988baf6014e635deebf7001d2c4eb4214a234778cbf83272d10960ff01f91ad801def21ee836daf80c8c3282243c0590c8a08fbf742e4980a700122588843da653a8f78113245c80842b66b78f45fbf95029353c21810f311097c8a012a5ffe01079890c53b4fe83c20f0aa24512040bd291b480240816b60d94167cbd380d13588942060e60b0832a4225395c89010f3c386144041a621016dcc74794564bc7ef838c6bbbbbdb6af2d5f128621e66aecc332928ee74a7cc336be65d05ed0c2b6515954274d2ced5163df287fcec78817f8172d99bb3bc0e13b6e574429932a59486b4bb69b33103d009889820b15c72a9b7fd5a9d716a00ba9a14193c670d4140183b2bdcc87a751dddb80d14d215887938d77c23621ee99a7336f08a6bcd108879368e051c6a3ed6251588cabf207fac407f02c78213ae70adb93ac10a879a6b1bebc57ab14a05c46b3e7241af8d33ae3089559a045542acd27cc816374c7acdb78fe7c52acd790347216abce6e3f69a058524b14af39c185ce923ebf51c850f0e2e95b28d11c20a71571b9d95660ef35ccab8c43ec100fa4c6a37edc9cff45de6555a7b565935d3e6f23bbdcd59e25ea0851906695653cf322f40085d2ee7acce333f09318fce6761f7edcc54e62dcc1590cffc021be0c091c98a99a99ad1fb3143d40c337729776423ef336f8102d6ed6d56bb75eb14c63c366fbd0acd55bffdf19648bbc00c33d7c0166698b1d1053242f68d155ce9fd2365a1639c7126c8884b643ea5dcd14fe78e38249921e6e9f1d361a85cc9c12ef7e260339cde71af667142957bbd8eb89a8fdccb0b6ad606de98d17e0c17f41dd2c6c199e12cf5fc98592633f6f90c8e10a0b4bbbb6bf50674d425056d3f8e276682341854404fbd9bd743cdccbb8c049f20ece3adb020cdb21d648a8b2aa2ee69200e2a6e8c776dcc539bd896a7d6765dd77536b119d2d1e6e8a98d161280309d9d8631871c5debe3c9274a093cf974be59ef34e4caf5b1364645ee33aba47d4df21c3d7b4754e7d6fa4f2b38b481cdd0f3ea419a75c1930fb58159c1ab8e43eab4f3d1e6e4d3f9c9e7a997c0d1bab6655ba6cd520e2191ee6ead3ffe0ec69a760a3a3da13743a727374c9c82e6ea26091b30341f6f8826911e493243da573344419b230d94199a2f56f504915895420aee887211b9f99818ab3a2804ca1ebe422bbc4209cdb05152386c1fc32bdf23897934ef1b22949493936f6f4709cdd569073659a13dd4707d8f3744dfde3d9258d55c08af6fa75fa9c5aad640d38b55eda7a0ef916b7d7b47254f53954fe557905985e38910a649d19d3a3ee5b8ae1c7a067a26f290e2d4ccb007678635b5ca5adbe7373842c06b8ad43c4f530c39ae11aa18a18a1cd70f1f218b4e72f76c8fbb995249794091ee4827cd91e25a3b8d50bab18a66d9fc4eb27400254fc1b1f39e4b610aaedb4e4b4442ef5fa07fa4babecbb2cce767e00881afddf7a54e3a5b33bbae595e4d4c87df7e5131233cbb279b3a47dbb4819ee74dd5b3874077f45efef07c3ca5596bdb578f54d757d7aadb47d9b94a7d959c55a22e46f062042f46f062042f46f00285d85be7aecb716d476f3d85b9d3e30122363946dcadeb5a4a29b98ed68c5a2bad3de514716fb34e6e5d87a859d5adebbc9a95b9751d989116e0c4993c5a2d424e954bfdf4d1c828d5afbf7817c2cdd17783d4291d9defadd7efe6689a60fd0529e9ed8e585de2ee88354b8aae07647ef22e3da0fa0575843a65fdf4e9b83a65bd4eb9a38c110c953b7d24f5f8486295f51c22eeb8c335de1d443b8698a7e4d67724c13c9bef70ed80ed307ae699bf922e451b437584746039985c98ce94c992319a29ebf68aff9431d2119a32463a4253c64846cb64e12475cabaf52e6ac4a9f99c213c87ca2de2a3e563075eed70cdd0eea8e2c3c998b2f2d6532fe6e19c47ab04a11d554a98b2c33557250071c324f6324693036f7e74843e00087120094239ae8b23090558b36e629db27e83821109473e92748602f0ea3e9befb4aa0312c020e188796c7894a1c2d21f75b1aadbbbac9443e5561f56754ffb8d16bcba89cdd0726e9d7975c30587d6c71b2d6fdd47d25b1f6f98bcf59b1fe6e99cfb6460acb27ec385cc156fddfa4d6cae64a8601918381f79b448d0e2ad8f3e92668782e98075a08c0f078e3b28d80d8dbd75afe423e7add7a190b31ef76da51e8b9a5d273b083c57828f262fd01f758474a6f068bde5d19aabd6119aa175f9e9b86668fd0693dbdfa1b4dc51474847480a9930fce9e57aeba7d75bef3a1e2510e550b9d27d5825fd268549c4e66f7e58e5a38cd1cd0ff398dcfa8d11f350b745a38cd15ba7200946acb23e648b3bea08958858659d4b456cde84c42a9ba2e0c8e908bd75012431cf8eb73a436f5d4768ae80bc751d57b3a65b0f7c216495f5223f9e03a39cdc82d6e278e2868f426c26d631cea81267d09052ce09d699346ab5d93257b582748659b53102f2d47f08314f78e505fafa9189aa51b33c05ead3c78ae4638dc100ddd1c6a859ce29ea5682e3bdd349f881d3f10e69dd913e0e77b4316af2d46d8ce66a6a896d399aab0916e11fc306c9868b4d924d171ba3253f4f7dbc69f237404f7dbcc1e1a6f574de3879fabd90812aa0ec8ace366b7698c4838f7462055492c4f9d11c2176538d197e4842c2810e40e2fc1849cc0f5f68212629c168074fe8d0426cb05223a02a5eb082a40c8624a264528e7cb02421ce8fd55081166267bdf9d1273988fd21a13da821c68398a467b0028bbbd1e00617574d80c31a2610938444b4cee83c242926446d8849180685d85f4e152818ca31cad23279fd856b9c1113e7c73968d922e97afd310d88a6387ac922c88a23717e3b476277a37da4e4e00731490723e30c1c56764003212434a6a50826c424a16b680b929d235186293618d5e7e9d58588cbd018aeaff524f4d5c7a9e52bc8b5ba2d0933a8fc6899c0ec0faba6679ff6e23224d4e036c4aae94090346af3a7a066695a666afa16a1315c5c867e6a5d4e44f5a74504e633503302e38755d5eb0864c66d1a95bc6455c7798e0a428961c21473ce392533334f1a60378c5bd5b0565009e34726daae5cedb9880a1744d4c64cafb9099837e6c67351ab07df3d1751b9c18f214c8a986baf6f540e41021869622a413fbd54ea99568719421c0579ea5e0c424ce9969032060e3070a5c04a1555134008030b58194b601125dda0c480047f25ce0ca553a142c4f0f3a7cdc1456a414d09428b20640882074f7d8b8999417a4f8ba44c79ea944eb9312510e329b56d14c180ca536a6915219e9a9e52ea51ebc9e718103f3f2f0f38bc45143fd63c7dcd3c757bb73c2d1272c275dc00a70a8cb525a8c284676d380d51c39d3e2369b80cc3d2e447effbb9c809a137400d0bc6bd671850db3253ecd124f5e078a65d7b5dea3979f3d186f452937ed658a726f5767cb8a3774fa6eb230dd267259f12d3c093252273be36c66469ad4ec59aa5bd9c10e130d4c4b5e4a726f4538bb5b8bca54162158e1b431789792ad1cbebe5ca5ce1f0e92f309a1fe60140112fd077e2850666fcf4ef8c3b7aad24785567e070081c2b0d4cbc0d60fcf47bc43cd5e7d0e6c40b9a2b944f4a3d1d319e140e3da119b6fdbbb9d76a560ca8c574685eeba77b4273e5795278e565319757c547ebe580e91b59a77da8ad435194066b160d9206e3707c5b972d29d6accda853d363f628b6c5b6d7b75dd960db15b22534c3d96a9686a4c53c6c85413f9d06a959da96999a4d83f416d4b22594724450b29fcc678633f319359feece1b9a2cb9844774c5339a2bca452fe0f2d3bd3164500f54fce879b0284b7ef4b4fc3cfa99d1d85c8d5aeb8fe66acc5ada96b9cac0f8b969311b4cf0a337f4d43b8ee8db4903b49e0c72a85c2eea21f6d2e6e757f3327354d19a68f9dac6b3c2244e693e724e7ce56093bbe2ab730dd74895c00c18a09fb565adb552afdfe93b0b43e566d508c85cd1d551a7f904f2d353754a11d528a84b25aa4150aa50bd52afc0687a644c12778cb1304058748c33ee082262d5742aa59412a5e58ef5555f52887caa9d62a72318a00983c364599f7ee3629e9d9fa7d829763a9aabea5c26ab4299525b4b7efa1caaadeac4a5dc53ecb4c56fb3581c6beba7d3ac60dd8248a4a851204d62cd9219c2073d7ca185891e48204e3f25354bc90f59603880cd3003365e202a890284276670050a5e33e020530333acc0c245121a6d88d3b974da428f4eb1194ebf81823bde1b94613183d104bd0601d1cf1f585c396757ca11fd9ccd45c738230c6c655a83c30a03af4c49d587a57311667145cfa8a29f3eea3ca35e210cd14f1298c54398f5821abaf102d384fc60dec53c36cf9276d36eda9436a528a15310ab4e41a522a8a01ae5c5a39c4e413de3a98759a4fb053cb5c02855ee786a31e11bfee2d3e910f3589f5e7f98a74ee7b136791598b5c118cb4f17c2439885c3a7176116caa7fb18b27efac6dd519bc02d8672cd9005bc4255e170facb04d61e607eba48219e4f3751c12c98960b460929c4038f7e76a0d419ef0e18a6a5c573a0eb278c123fbd43b9e68af34155e1155702ee0735c419c1fc34cb44c5cf4f931696a569073f615a39de943457b53543d31abcaa2ca83d6cb0a1666db18669420ad9ba489de93aeedd5043bf75e94caf8e35cb94d42f98b57734258d5beca7941958959c60609856b32e08d3c41d4f36fc8469c294f4d3616ec0424c5ba4cef469daf213a6899f5e2a72faa6284b0d60df3ed41494d00c834a8082e23357a81e389c3e7150f183a3633f9e38a39f6e1a6ad6e90b4e4d2fc33474d201a7a6e3f84e58f8640587d35fbed38def24d4a9e9fd9da0bc9a751a326d91424e3db0cef4792ad281c9f4fa797af2d3479317ad669d7cfa298879a84f14fcb8bd3cb55e3e2b368e3fdd0f4912f154c51378aa49b46a9552848195668e1944e1f39ad3c87035d6dd41f4f661daa391e16615ca0c35e6202e2734438df5d29c488b796c5ea3ef50eec9af9ffcfa3803c47a358b0bca69e2f20c25183403c482754af313cb6805d6cb7fb8231704459b697dad30405f8b582f4e695e9d650366cd2c9923cc92af303f5f9d239242a694af2fd599ad786d07111a7ce525d2c9ca9f602f4f574820bce6a3498dd194f4b2b362e5a5d7a14af4523a47c43ca54e3e8e97d5a51cd2ba9a8749619794cf5c7942fc0bf34b5fa806ab346f304cc2e18e303eaf79ac5933ae4e5de115f784adf08a0b9aa1c63ca6665d1f5947afb18c5e2bf9c8427acdef674f1ff793daac984e55d79c0b9a2b6d66e84f35fc0a8e47aa7b2821e6b1ae398c0ff3a05e73981fe699afb98ce61b10e329e9b5173c20dbf82827ff80fd28d76964b876be07fe58f1e4bad367d7ddb454c4e6ad775b0f65aeb5d6ba39539a7df2bbcca391e172cfde6525e99de69dbeb0cb4c6961d2f49266187699a1e61af205cb68aec61917eb8ab91a8fb4eba3fcb878727965a2707ab160332ee6e1d79c439a68f08a6301174d29579b7677333383b43e8343b25cfbf485fad28fd0d0ebfaea729ae94a7e0e817933b4331ce58f476878869cb99e237a094a507e12a9a4a7d79a4058b064e153ca5abb76eddab56bd39eb4d65a2bfd9105b7776bb6bb4cb3dbb51c5732993c206a5cc9dc7276adddddddadd91723ec3770a06038981c3a62626e8c66a90c9da13494524aa9a6699aa4b5d65aa936e5466b5ab321f080c951734371e837664fbd4b792a6fc7f348e0b90aaa409d9a5f8207e48c6982b7fa7e0609008f67cd001262863ca1d4f3817e06004820000f0032581c117af4e8d1a38708e09742edda33abb5a6727efcf8f1e3470ef8691a9033ee3852effed98903f05c1280cef06b63002522e11380da5022448a1421619ab05aad562b137a88c0eae6201c848370100ec22ce68113c24580a700052c8052ba8066ee05782a78af202a910aa515ea50a7cc18f2a2288ae2cf01780c20404f8fd70022458a7805288001d43880c7020212e0a5f8b6a4033c20670051e34aa9008faab0c20a2bacb0820a9afb484d9f10f0809cd18217815aab04989941afebfa74367d8047bfb185084420021188400b12f02a30010aa8809c01e48c1054336ab7052ce0820b2eb8e082054650510c60200319e83400c48c2b9d6a806a40670495bb8005cbd9776b5ab3cc6e9652a64c993265cacd53b2e98d506f396ed9c9d3368ee3386ed3b2eb7557a2266aa2266aa2265a2a11d1b26a5f4a2bc4740aa419ed2ca355dec0819a2b6aad73be8916fc0932773aa46e3feefb2746b4dee5f0b68db30e639dfe58d1fa662dc5c211494a5b94528d524abf0a663a6817826a469513497bd1ae792d734e161cd14c47d3dda51ef6cacc943fb0c5b8d241da0d96c1cec9d94dbb67d8dd1dd34dad6dcdab9f51205caa0fab2868e90bd2954edbdac9f285cb957e3d2b39efa58c2bdd32b775a651c997acd45a6badb5d65a6b7796bb3a6074d0d4780822f4a03bc227db139b9a191a1990524a694aab94db3aee9362f764a336630ead4c4c8e940feb837934ee9c1f947e93c39a7d0d41f643552bf51c480e53eac9ba36737377edda2370dc93fbc574ea094c49470db7db874ea370bcdcb82a4a29a53b955270460757faa9baf452a9a79abc1d2036dceaa59eaa03882bf5349054c775315026a5946627fba2bde4a0f1fae7ed77373b3ad93a9c2b40a752e814510b2b68198c4c0e8799f166719e143dc9c9d2ce0e8b72a333d4321c352889e3bbf1f272abfc4a1b8707ad5466ded5db478e35c8c3b3f90cac40b3d6be51eaa1b49b230a82f66d56e74c3fcbdc177345b8e106d8a32fce4b8fcba3863f841e9dabcea4a9d453c1192e6e0f4a5dfe74a129f44aa51e1d385cea92eaa0e1b677fd4180a55deaebb8ad33d5584d968e71c6eaf3cc221daa3f4c5d6348d107b65d31e4ea82302464cfb831cf4543405a0b6e0e20d8c08b8ec9353d172161a459416206760748c040878b7a2e4242051c106d807161c2d8620b258e80b98e4862872380c8c0384287ccc9c5f15c74c4924e8c7bb95432ae7d2e32628cce05b7f45c64840e342af7c673911137c8811156b0184164c4901136643db0f7de1c28239ac480030b239822237c9ac4d29801898b148838786169226ad1bac10c444e34c91273d93054840f3a9c004b4cc472748ba061862d0ba1ae081f1aac518c438306cdb555e9a2864c8c21d92ab118aa988323adcaab45c52cb22a47dcd0e2164755889f69aff5aea88356536b9f6819430b975ba575029798c55e15aa00e1f8f5acbd3145447cf1a3fb0b381ddcfb5c4404161e8820b269dc1dcf4544f4e099e0fa731111307044dc1b2eb836ae8c14414324b163c310446871753c170dc182ad074334e9ceb8f4b968881f1586f0b19495986c8b5c47fc18e38396dd5b4f197de6849e3d68862f69f02422050214000819e4e08b2cd080e1480b9e365cd0440d39b842863462d8a6a8a184ed872b5903907c389ab28216b011849c2eac9802450d28d600c2a77e91a381f044f6c4142fca6510a00009f05cad1b92882f72c1e0678cc7cc3c175109c206836e1cf2baa3fdf9cc76d2c8ef97208d01e4d84a5ec97743b2dc21b03bbd93cdd3346ae01b92e54a1f02bbd2896e76338700c495d3c648f6660bcf3f70103ebba4dded99a0c595ce3304b06720687877775b1eba2e478a2b5d0577f29c73fa4b1a5752da26dce04a6ffb7c93c69573ce59ade8184747c64c293fa6593b3b26fca01b9cad622f88be41d4a51ed74a6be83b9d9a1ed312fc827065f873e5e379c80e778c89a999ac12666abaf48aee0e2a9b2b9dac66b0271de38ca8a09fb5bd93ddcc154afd82b652cfe438c9314fdbc93ffce33f404ceb4fc900520c7a5de923d77232c3597fb85ca9488d2ca9405f72ad4ecd66b110d70adaf1dc0aaeb492a7694c32e7e6d51a264fad419e5a41567ebae9c53cd54f66ecf0d3bd3126eb25a84b2de669fac281a8c9506989abcbcf17218fcb0bac9bb361681f56bdc61812aa15a4aee999cdbf04356b5e3153d3b5086d718d31bdcb4b46c109ab5a8eebda52119b37bd58557d4a219bb353aec595c36655e65b8fe0a964959669e0c8b588ecf86d8855d54d68a27aad2733bed6f6fad2307cf579c5649d82ba7d98877a98e2a8e44cb7353d0c19aa190120002000a315002028181209c52281280ba34cd56a0f1400116d86487654341947a21c866114c4400c820c21c0180280310620a454d1d80093af87d57008e107d0f382eae4915aff97e6c010ff19c4bca31e926f67c14a71aa581f0fdec3c384c0a429db9435c7e0eea58c0612b544439cac7356348e7d685eeb58813a6dc52eab77e3168d28f46b2a33a886b6d8c369c6d8cd12a41f546baefea52768f8167673d449d7143c3c8dd076354a33ef0ccf465dd5ad3d965f9f214e97c9e9dada26562ed6b237a60a33853167900c8a94e3a141d803c2c08b9528c6dcf56cb870432db74c442cdb9652d13de599880b539508fef38f34ed9bfacf37f5d27d2fbc81d59bd89784a8eaef3706cc1fc63fe90719ff582931f9f663bf21873710bd3a855cfbb93ad0bcd0e1cb5f4bcaeaff1d52ead31cba5e41d6709eb0865c05a848147e96e962c5e89bd67c2d3c07e416c9d7907396ecc37fcf9230f82112393b9a53363e4b608113ef2ef61f0551a7e167d4505da9edf1e5a684989ec797b2725ea3b54454e64911996dd8fddb78edbb2941fd2b9740d5b3374dee34f1c53c55b7575621bd9d9bc44138a4d7f695e11ce30c3cb073a169b9a4aa2da0d0ae844c81d281ad5982aaa508f815424e91c55b217a4d4fa8dbe5004bed959a3752efe50a5f41b38fbba57491fc2af4701f3a05d08914f3a8da5ea9cae9111f353ab850b0530f2c2f0c1b0354bddcac308cfb7d38178c5bbdb3c4a54b7271091620719333a1241d33170adbc45eca1058b6d1b7e9e89df4eee2cab85d4653a9b052f82a3caa2afd3f283a30ad6f651bc87f75b0ad2025f4a252dde964573d08629ed56bd4ffce29a0c7eb2a0e8c798184daa538ac1e4a020a19e3905091a00870132078f4f78e8d1396984968950ae4349e2ec0cad9e2623f58de8e705a84a04ec11ed69181b30ca0dfda17211cdf0480b176423f38b9bc5b71589c3294a89ea21b157a27ce450c8fd78366d95f6cc83fcc975dca8a99012b70becc1119a3d7186b7ade561604251dadf57aae54e633109dec715da3fc89afb81b4db292851c403a85cc85e59e68d41d5f4c13e13e5fefbc9d1f9139262bff219cf5df41c134b0bb7f8a25989bea18420e19e801cbdd483a747f9d5de180459c8988248c69d1b86a37611376dd2fd5a82766a5f3a2a2496892b6412ce7c9e437843c132ef3e7ba8d827c03bc54fe366448d37f8a9a6a3c178e5fb41e8bfad9841d76ca5213e128150c9fe7829c3f5d018b22f4eda8f19dcde6ba443c878b739fb9c636330594e765658efa24974a0bd812842e8cc387a2b84f98d5eea8e80565e8a2a848088bddfbb9e1ba7e248fcdef89f1d8f43ff913cb258ac247087244065c053125a4acd62c0f66511fb38c48a348d16f6fac7a4425bb5f57e05c9f9dcdd4c19890e0e45f88e09bea42046b705e27b1d3ed108ab697d6824452385cac3164b121638ac187566dd6d963e5775bc022bec77f442b376d6ba0d7ce5d447e439853320957734dfcd3e3b617fa12d759eff61675c562014e48a3ae0584f5ffbfffffa3800f03683455428c27ce68f6f74cb2a26a1e78d021b9eddff676442ad1bf58573567ce920248a863a9fbac1decd72cd0e19f96ee91ff63ee3e9fbb6a31dcbea6582fda9b0e74d608577d28162998567733c1e8f05abf1f7b4397f7f0dd78d8de3e251bb38ffb45c041b35f1c17042714e3e58d3e3f5057e475679eb9db52d312bb8517c661c349fbdbf875bed931ac4f3e13d45f1861a7f51c82acb4d790fb8b086417c95f08724c26e1f9c8c0900505ac1d6053d9483ec5266a5d08bf5b5e31abe97473ed65dc7f5e544d64caecbf324b328e004022cfae956db54c9d4cc9c4bb88e508d9fc08798667c2cf81173582465b85c9eecd3dd78d88694dab70191c243c688955a14559cc0bc0a98980150496796e5034984b4dbf27d70da916810652d2b4d5773308f1ffafd12ba2f702f0c08579aab66ae5fb9bbe2411484f5c889f542205d7034a442d10a80bdc45cd9827ecc90d2666b645c5522f7a5e6ffb1185bffd98c26f4fa47254e5b3f6e73c8791828db59edbafe948b62d96e047365eff035c38aceb228c44c03f08c14b289d3c4bf0f3870d744f2e0fe5929c94119143b2f00d91d96f7024bebbc4706fa8f776f4b0e4e0a3439211bcc0bf0f5ee0dba3784a02ad56e9b63b234bc95ef293ad38f0b4be0d5557ab92bfcda7584424cdfb3fb744ab5a32a68c3c8123d903fbf5ff1ea750bd147043741d1fcd8a47c821c6707650392b0fcd35a84df178cc7b20bbe906ea65f076748afa2bf181f8cf82c06dc4fa1f49050cd715d25f1a4892a222609fa81a44237f8a5f2b4a25dc33325452e39766b82e3ae49a8eace19608e1bac4a3cf33e996a277d553e2f6136549182aeb566a4b74a4d2fe85b87b54bc1ab07e9515b437696c63f30f0ce82e198eb91655a3f7277ddcf04ae9ab07926dca85097e4a7aa0fe1756f55ad8985681080a05e79d887c4c5bb609e58367968037b0a8cd9abb4cf118785c35a2b6221749ab1e5e4db9c173fbf86d457f1ea0a93071fac4245603e6d247ee45efe738e8681718d05c409f774d73cf4cb3cecb94b4d45c0cbc0561a2b9c8cb07852e6c0ca97617539d3e6a022ef0b5f26b50d0f1b0e4b7a7a257f25e035e8161b555ec837e9614b37a90d6f917de20d336dbada1941d6cfc77963970395e7eb58397afc2b17dddc72f806d46ea3a63f853f441294c9f51a2bab0f0fddafd486b2a7efd50c729ca254b72b9287a7cbedda89461754223ab9483d44aed23a55402cbacc6aeb72e47008c2a4af8f2a89b9eb2ba38b32d90d32ef2950aba337a90d59ed995316b732c0152d80c2e62fdeffc84213115b157b3cd2e477fc1e6f1e4ed1ad8a78f9c50e50ad00d334beb77d3634df39fc58153ba26d106a972e60b4c99cdeaa75ff5c15f69db2e2c6c4c248bec2906d9110c914d61ca3db0003e66c47693ab7ce01a2cd304200038695ef495ca0316ea2f7c6916944d961c7863c5b7c342ad5c8089b5a6b472039b0298e3ca3e181820ff43885a31b5636a93fb35ab62b91efb4deb14aad3229750e1c4c4cb1a106056fdafaabb9624b707e596cf82f2e79f50972757258a3c6f6c18793ef332b2195cf4a3a394fec721dd709782516283a25c29a1001e36349d99593205e557589ea1fab0cd896c078e3a55e46aaca94f5e5accab943fe0faed6fd5e0d29aff3cc6a2dafb23dad48e724ccb4ca404436733d3fcb4d3c2c8dbea786615eaa6937ab03e31345ff4355cb46061415196eb1c0b93035632baf9e0bf49fae8547636f6b3e14d71ef55992819b03de9478d5f872a0c91e37b1931fc4fe756a0558394e8f2a5ba3167e6aa0ee872bd97c6a720db711a1e302b136577778c20bdfed633ca331a97360d7da986b3df3242d44e077e72608e55c6a5b251310f8e99d5bf667eb285f9c10c496db2bc1cb81e5a818f6b8b31feefe30ab7effb78443b6a5b5709fe4e940b8eb4e7b3466e9b42b7b207d17302fb42fc754ca3be3e709b5ef5945ca1b3c5c5e9f5ed8a30e567003dd518b5bf3ea8bee48fd9995956e6f500eddbe61ed0442442d3bc11e14d8c4bbd0ac071afd93d7267b9b41ed8fbc4cd3fcb5a9fb178e1548f03b2c221930fff2bb6503eb05a38446e6b3c968d49ac8f056da7624be82c8a013ba0bbe0eed0aef462e5080705637b51b8abe91a7691bd960d718622401948b9a300728ae56c4fbd92b36bf025725afc0be098b5c20ea89b1cd810fe5d8ab96df77723b4b26c533c65b0cb227068a01806e6fde1e3ca4f75d99a3341809ee3a956f219a1c07da907cbbfdcfb22d56e253acd1d79641e0bd642c1910feab51016da748f9df89f75ab1d6245db7b24271860015b3381a10c26c896e1c4a4ede7157de275194bab03785216f177b7c1ee651545358a4d8199025eae1a65a9c0d9b0f25cd5ad5c2ff5d1479c7008a901770e17833ed58a8d929d5372ca73aab2de538a5c0eab97e71f9ab3536ee35f4b440da85cd85f44bd5690a16d2b930a11d0888f8ce5344f51cbac912696bee2e563e3ca5d15f1f49ce45ffeaeaccf6d0360bcadc0b8e7f68e4d48105f6d9042f97c4cd9cd18db009557e80795ac18da3804a01331aa408f560113e38c0bc7da84ff7459e0fe50764b4a949c698c1b19bbc9d4e43887d367eeb51922345663abebcdfcc16a697c9e1498bbe1f6d6bce3bbe7b9f4354114f3bdcbab827f413078bfad1b9eec1ef26e64d170e7212cdb53e6b51fd47a52558ece7d785c1625e07bd5aa23865f86d793e1bb5ed69d51a770c560c5c03f6860b485b587d2c4b6def9275c9b03f8d3f99241a5bf5e947db8d10bf1a87229f2f60f5b2fec79709b433912b52d41df36667e75d0916261de4ce0cb7f1bad8fc793c8ed7829990e0bb0aa0bcf82e2c4c482355aea434c8e50b124981c595a2baa803a81041731b7ca92f423d45e7eee63c70adc163d0bda203e8e4aa0f2bc0e0abab805bb5a4eadf4fed43434cb7656aa6a2244cd671d25fc0b690947b64b51262d0318f48b0fd7157d5b05d0ea575fae153ef8fea5702cc65cccf5e5e603cbc443121ce795201693c5ab7ac2fa7af989469b30034888970a6ed36d250dc4e7c60d6bd8c23961c679c808bfb6a28a97d06919ddcae5f2e52c675baedcf2661996556d2e2e719c652c2d572c3927657507d7cb0f2bc84bcf254b9683e5f7d29f7764157251f9cf68856cf0e1e315af9e816b3cd9d1ec93a85dcb89ab031051ff211c74173f147750d9a93c42536a8ac35ed0cfac68fc6bc957d0b27ec8acf2591e7025fe23bdea21b964ede69fa67a75cf7bcf74acfce48fe1fd5c9ddaaaa31e2f9473eefe3451df6c4427b4c47c44ddb1974639ccad26c54b5e44fc119fae1f04dd3ebb018a67a13d99ad03466ab5af82100de747da4de1ca8ed86e92d656f01118bcb3b64eab3fa5882786985c5312052348b0719c29a908cf50cb6bc084359eda5246733dc7ff34bcb80ccaf2ede8a3a501423301f85253d96ed290b514c32da8e95e763f6f8f4596e26ba08e133da19f468b934cd38bba0ecd178f9d57328b75fe6899d7478f4a1b1ef12dd639ee8da5970cdd3d5b9a3db26fcd0a618f964baac90f876ad838915d21dc4a8b7e2187f93b6f7ee756cbbba6e65c0a773b17a5d05a1a0eb0627e32254d29f6bcc2137bc8171f9aba6bf0c14c252552bbf169d52aa29b1452d801c2fbc2737ef7a0c6eea75c73edbbc76025b7c2e5b173d55cf8a4417d3a9485adb282a77bf9c8657f7f42c8e9f73d3f1fe20da6816feb48feb290b9df8b728d4a10d454c8ebf50d647a640ba3d614d2bdfb4fec046f6ec623a93ed849e635362d23514d184a7042b5ae45e9de1c39c5f50f2b5f7e25e8743f1892b2126e28afaac9f6d265c4db114c9c8d6c04aed9ff2709034fd2815f0ecb1abb84a41d19bc93fdf1950379242a7cd6b32ab257e905210dad65fa89fb9508e3a51345856a794faad129447f9e738915f4b3508876e08957c7a0c56c2c92d22b45b928ff5f341fb353d967ae34bc010f8771f2e897ae13d447a82139b05e16049d1a50387e47204f40864c469f5033b1c9b8f4f81f2968830f58baa951c75570e430796d53713a8932b554291a3a9ad64425e25ca1f8a3d59298a840481533b4f46154812ec033082cd6b2b4bd2d05db61829d22ed983eb1ed18739b25929be7f820cccab4288f7ac046bc41dacd5944a03be4a60c08e2b500dab500ac085dd440e37d92c67044c715947ed2144ce6844358a4578732bcceb83a89b4581848b5e584c6a7de3c6946595e5835b310cbf2d1147d1d622e8e37a479297c6822702f8964949bf103d1abc2b347c78aba0616a0731fbbd44d6343766a8ba9bd20ee53e07c9987a9069e37367c45d68f726a3aae0ff94d13ad89154eb43c63137062249b74e98ddb1587b8021e5d8b18083845ac80eb6afa7d3419055caecfedfd4f96cc2b9ffc23330dab1270546a58090044f4e63a1450d82d81688965654d6c296f0db1f3272bfadc75b36a055efe0469fc99d852602df8042c0b1816e8afd64c2c09e82612075f0b8e9c2ac39d391e1a099c548696650ca3e465208e45b38ac3aa79d166193780ea3ea9a90c7b256996d81d827c400ebf05cb56bdb1f7b7ea5ad4a2a61979ca407c76eb012493bf104157f5e6ce125583c66e4cca58caa7a9bc084aeaaf417d8775c7110509bf469a4891cc7177a3669c692c90ae716c77e6473a5b16a7fe8485db3cffc4f45f2031a03b7a723330f7d56fdf760a75d8f8507dd954254ebf14aaab364ab5caa1ba4a300294a58cfb48b6e488dec4b295f10e622669be43cdd89bfaec4a30424262f5de21e40d5c73d5d3d3755335e26078612253bc59f7d5e9d8738bcb23c349aeaf52d1efc5602968c26e4b181c0e15fb66203d7b966496c182794e76d181169b0fb740621c2bcc7b34b32d9d38c642938420891de4fa02314bc9f50e68ed05fc51992d2598df12cc0326cffea6f054192d9b923c03812758f54a258fbfd913580442d51979ecca682ff66cde115f6af5cccaafaad16e60140e4a5aba538962064a0806d4be62a2efa6fb5e78815374bfe131a98d81c0376bc67a52f58f37274672d6f03e858ed766af871e6a5ce3d6991d036aca7e2edc38ea8b2d84d807c8bddc048c0ada0b20802ffb3bd3f7d9da93d736e879b8e9b1ee34a065987d6736c76c1c5e63a4351857c337edac5d9861cda44222be6a1ee827baaa102293cbc24ed65bab420101f144949671b9cbfabc79c9a732cdf9f7238a3b8c413e292b01996e802f86bcf2a2fe870b4f5d59ed865f9fde89549196ca71f7ad1101340e9db7e7bab16ee97916f49d68024eaa5e0f43af918d8a744c6aead0154704482b458f12f7374eef7a2e822f12992a55217455ec502b11fb67c8738fba50a5bc8590b1bd12aa0062edaf8ae823a56ab95345450528e2fe8dcb147669c98ca29b663bb857827737f000f7bf5b4e516644627fbfba5a13a2c30c3a509a005ce46de317c9c92027f7be5e05eaa3e3671c2d9f21183828492223fe0c08215f571c1af54d33d4f1a51b424a8c5a96ba0c384687605736b2dcca7e8bd6b79fd1761c1e6e42f9a0bee9370eb44304266ddad72412e86916cd08a2aca8ce49f00b6523acd653e36fe482dcd325ce1fd5f8ea916d8a5ee8de2fe7328599eeeffc443c8c83f653c81c59561779cca6403c03f092dedf6e6805a44a0eb1715fea52097ef096f00897447a1e68382c0208ba429691e252a87c99754c4879f15834fc614b23a3d12847102f3e6429fc3ef642c923962d3441eb08c9d770e5811fdb0705e2e409fbbca37ae35ace3efbda3bcaa8761b5d31c06c8c24fcd49e177797d2442f06efd8e77fc521d2356bd545f49b2bc8a561ec7d2ccb6a161c2c21b5a5409a647c23327fbbe7124a4278f316df0a5907cd350a3b91066f4b0d11bfa585f973c26b94fa36739c40033381161bb5f475ec0cd64c43a45f57cefd478a46d7e44b558f12228ebd6a0623a48bb8fc61a5dbd4610c9f816277f2110a1a7d8dd0456dee588680cb024595e9fd0fd7da1879f15bae4ec48fa0f32da853998e5a6c88a2e09077709a3e71c6539e804c57a69391ed2de97b480c86f6234039711b3dbb269191aa312be1370b148758cb52473c69e586ec27fb1aff74fb539fceaee9e18ccde909075b6429aab126bf9839a4acf7b143f58372e90e744f1bf8b313f87b9c4d4944ff07174a30afa84145a7b5cf50014fd1a982dda77c4227f0b788ade3f9ff955f1e92d98d2dac36941347b335fb711bdbcefbe22f91d7a499ae5a7502d533c3d3af0c25cd73ac21abd21bcf6d216ba630c5705432b70724cc43c588faadfe5dec5d8e35d035181cac395dd4d286f2c365f4270724ac63578ee8ed50c8d4ffa3c9ac993958d2d14e115bef45570cca231e4ed2c5c6c044b7b32181d18847dba60486f5bb5c8f6051cb4701c3d0b04c5238bbf2f065ede9612c60900af14c2c8d1058d0ba40cf92accf1271295f964a0c9a9b88be24ab25f42bcc72cbfc6191c25e0cfef73e544ea21efa5b3819c5456409ca6b911101b30f5246a87e3a1a02cd4d6f50b9276503e756b1330709828c635da8662b38e1fa3bbab7a2b220b7fd116b6d45700b0ed704cd61b455246d4b855bf43fe4782620bc85a4581bc6bb2ce8c54112adc067b04519e3b4d0940ea99c532b216f0f7e33ba95dd6806cc1a9160c951b8de42d064172cb8563be3bd4e815a5809c508e2c01f3440594f74dc6fb99f1143691365ffae2b4e22b641c1253064abcb7191fc65ace105699db7a616bd101a986fd71e5c345064dbb83e1213f95c01c21d48dd21f39ce70215e3cb02f1040f5d47d9354ad84dddf665394b9ea478e20ed9051e428fe0aac5ada34b27a5114266267dae7f8595e7b234690998317919050037a42540b52bc3e057b24dc9eac6b5531915d536c85bd478d61606c9119e660a6a01e982231d8e70e6997939d33ee33fb26e1db1688aa7f6399dda43d72064f0dc368e0b0069186ab479fbb1727b7109a355decfdbc5f34dea8fab9f8cfd79431b20f05fde0672fb1d1a1a55ad0d5fa991e3ac145afc5d7717668424713b577fbc288e97e382769ab6ea0aa738b5f3ce971023c005d96d988e869e8733b0ab6014b419aeec4ea40484e32e4d9f95c94bdc9a53d38ddc4acb8aaf4cd9f25efc4f66444fc296d82649df3967b21692ee2b3f4dcfba6ac864348d8068d65bb8a1656f96e065fae246de75c536e76fd25ffa80e794b15a94905a54d63efd71372d5fb554d5f75130025c169c2475f24909a37206bb72b6ee9809a3561020783c894749e4602bf163fd98c5a8e1599dc2fed9c27117cf0ce7d5ea7cafd3167e93d3b90f3b2ed6a875c9e6e0c6abe7d42f4398fea3e808c3b7174033a238c83965a581557319767eb5ff6898d3c6da8090192cbbcb2b13783ea16422d64db54c18d75610b65d3b62fa32d81277d4cdfffced6303224e50422cc0613c6ad73e39c1e13890278897a9fc662488a9962ffebba368b2f6c3d46958bcb63a6c2d89e5d8ddb85a6c98666f9a092396f1ad16543cce5e90d0c69a8bd517c95adebf7a7119a3c0d468ca28e254baa104634cf2f9ff63c64078a740ad38ccb0ddce88cd530faa262b7727499eb1fa00a2b2d54f1840c8d13b31a0efcb302c12c426a1d63d151fbdf32fc81f577ded8f534bf8af537ebc2bbdc824c3ad0b54bfca6ea53edc1a41b08ac8a7ab3417d5ae64757d3198f065d7236006caf6b477f48dc18455abcaaf39bcb2a217ec0c0b322a178e09741a07bdf5e94a3cb0fed4c557cc3ae4c8d457d258182371d0528558d42ecd45bce68aadaf8636e38db64b2d4262995e12c1f91189301f94d7c02c5da82d0e3aee2199916bac3cec3920524ded2eacaf045511c74034ba5724f93f57d00ef78d384fc08cf8e60c9cbc78b4d6a781f5dcb51620420cbe220991257664b029181c003eb9d89a88eb24c458b5d53542ab180176c69a2cec81fc0b1aa3577e9b67d461113d7190c6ea8ba6d44799cd741eb46b43a8a21b38d8395ec154e9277ed1fb49c36f5b61cefd8365840866a21f30bbe8cd703c41ffa31418981dd4a9aab220703d8b5de65290ce091b8a492c6c1d29c68552b58a15df58b37fe7a27648146c45d10e276c9cad63f5d22d98cb352c470e8efcb858db881be27154be0e4dd033c638d1cc49541deb6b90e5d878de62c58fada187452029f7bf314b3cc7aa8997aee0a326e60cf05c4489d40475d154c403c2f3924b2a85fb9306fe0917b0cfdc1aae13763671197dbdaae78bf335aea8643549df88114b2e2a9c64c2f0e58c92b77eb52d399562977615c4823fe17c33dbe9d09f62bd2f3faae9ddad315e104c5e6312d07bcffe792d866e2b5cc9bd7773b849776fb5e79df2f102a48c4579a0b64420f42aa61024782873cd1087b5f927c301fb06cd9d844b44dfde456667534d2e7a9b1893eb9d020ea34ec99d2ae9c4253e02ed221ccc084159635011ff1e9549ed5662163e43a9e15ebadb0b38fa2161a7ec29fb12568e763a0ad11abc0a8c6c3f41761bf2523513114b0390f8c17a4379c26bc66cf1afdfade28c5e47ae53e36871a57998278771fe257f86643107b93090834ff516af5ec7b49c2b2ef391e0906ff0c8567f4c8eb082d741a3e9f4dade60c97e25c14d17e24ab234d046217af976dd85ae0c801db0c79ae2bd879ea91ba10bce8b456a6c15f38dbe2b4bcb500bd0b5360a4cae179a71fe6aac4b67410dae6b2d65240f4fb5aafdb43888162d5e99ad03e84344b11c4e6b3e4cc20c12810128bbfa01b1304a67e8fd97937f4b6a246c190c9e2ddfc036756b91c91ddb02ce3f04b4045281dad8c70474a220d41a6b30dbc5628564e7497d6dd6b1eb67be7582a3c494a5a26369a6fd1ef05fa0b4b0208567e0eab5203551bf26b4da7daaf62e64f41bed47ead3f59441698f23d23cb67f0deb3c2ee0498fc242adb4dfd3509f0cc4a31484c239c724ff416194a5372a1b0014a96443476c623f0acf8cf7a1d5d7cb8f4e39433d85000a4ea46e9125bc8fd8b01ef1dec581680c36c0e3e867503847626372e8f465febb14b92357b4f8a0e2c71ec372305464dc80318c7e91422e95923182c9aaf70a85db149dfa605184de1d14a1cd5ae171eabd8f3204c5c29e5645701b5683e5615186aabcfa838894c4688898cd2207a88888349ba2e5315fb679ec933461c60fede983cc09a877ede71ad5f54353257b9a1bece7b568be2b2d9adddc2ab2bd1645912c7b6d15e7acaa3d0e762f21abb72ad02c2f02c9141ec32fde3f0ab813e68ebc1424254860c3226d0b88e8c959b8d73202da45f5903981fa758a6e51f70aee60314ec5453ffa682042ee229c88196a3bce40f90fa43ef301c3d9334b319e84a95122d109647b273c6bd3e235e305c400e497b8cc7635a779a2109300e478d3aeef1b45aac2e8901458494728276c1de93b440fe65bfa7cdb3a28a0e2a6b8d7481b5ab3a1745a8db60cdb224395be565738d500660e74a3872f7f0f9b1dd3092339d581cd92118dc0a55b9ac117cedc0d2006c0c44aaacb7e684587df5797192b3598a0b36cc0142469a4f0f70564e3c75155fb885fcddb09202283bca17e72a019f9f2b1b1ac4a2ceab20901b3764afeeef4f1ac6c8ce0af7c97c01548a64ccf3aa1bb0c903ce8ebb44d9a8dd30cef6c79782a82c98478c730828cdb3fe92ad701948899b925cf83b4c4cb381ca30e3819a93bb492241c1384915572fa07e24eef8d65d5a8d5314d415523d219c664c52cdc31f6720f1c48515916e0b2c9239ad3b3c27bec5a3b6fdbffe3c8dc0da90705860854a3e2b59dc5ad3621217054e5d236c726a785e73cd9179d63fd0c47327772164f0cf80f60363c816898f23f281b279059e663aa152a16ab51a5a429a621205b0a7f90aa3c4e2dff1b054fcd93af4b8e249a609de1c5176a785b12d101370615af57a58d742b1d49efc6b09e1ee535252db619cc049ed2adbd9211f379bb06d52cfdc40f4764d139f53c5b65d6436d13d73b481569838e3bd1b44bcb8002864fbe7e1c11db33347afc142d3373bb741d31b6be36e82767afe8585459e618f49a31be56d119939b349020f47c747fc23821e651dfce5e7c9d2b0fba382f9b273a6474249d316b835cea4bd8084f6c2890f2346693326cd5aeffb02485c964d561b07df870c731f18a7f8cc53de964f334b2ebf2d8558a0114d0932c1b06d02f216fd2998dd154c2ac4654e26c0ac7116906ce3b5c5e53aeb3a56a465e500fa852b5ad7065084903fefcff76dec3b670e6df6c8fd273f8c3b8b33606fe52ab7ce0928f7b4d20297d2cde01a6463baff446ec22899386293809d16423231a78ab20dc5c34fd39eacea7c80f3bd66fcfc4f951914966fe3e787fcb2470d05a9b0d50dff8bb98c238f48efb417c47fdd33694429a92b721d2f9466975d14927c1f57f74431dd6ecb2de10db5c2db6756d731ecb4d53a710e095ad630f1106dc2aa109f6aa146bb4286ff1dd3df10aaae9103191a8616f39fc25e8bca8dc3a6060eeef8775c86342fc496e18be385e93a0dbabd9d6eea04f8704c682f204629c8eaf84bba02c6f845bd789c2ceb307c4cef93f18b52c053ccfe0f91a580d1862a9fd07ff5691a63220e8da4d8606bc6717ca9e9db46ec3e067fa342f5d6bea8d1fa70ee09af5e344ae82e743af0feb55060fb58c14175c2fb92ac3e5672d354c270da1a1c179c816bd1b9f1369308f5550419e1086f8e85251081a530153117cf094364e74d26321a9a35505c060b7ccadef3be13a10680c78945b97db88626b5039df99aeea0b19e9e73fb8970e2cf7dbf3d6516f18fe2e783c20f5390b9ae00683926c639c41be4d3a0ae23cb2bf026433639a400413ffbd128c2d2ae4881bbb83679dd935f09f95d2ca387f8369812dd100c839ea189fa6b0acc711cf57029ad7914cba159fa8d426d646cd86d6aebd8f63a4f9fbffb1291f73b55c3dbfeddcde8e669349d9fa884cd11cea5ba24122ea0efebf119fcd8e60fa5104cc03ba2204a73e3dfa0cdc1e75ae158f5a1a1f1222ae3f8d753b3c82c8902d7a31eea7d665cd300582237895836231d39c50681366aed62e1bf656662d715cf5ede9a9912ac1c70d6e048dc41bbc647736028d784e303c62d008ec8870ac588b865843a2ec83b430a2e13e16bedad4c8d7cfeef7f6111366d6c3b086223b782c8347adc1f5851a24b2346ba1e6e98cf8918d437f196d780d02fa26b4b9ae7ccaae7d607cce4733427f89b7a0adc271957924690293090595b9c0011b8270bfa65e14f6c386cb58f04f35f81c2098151dac6c384c65dab68e4a444306559e99d72756b236d7903378c8bd92b7e24046186ec47a336dd5abfe99207daac89827782530be56522034405a06ae06234be6be05bb4ffa7cc921b916d39f06703579af9e78b0a07a5e112572e075694abeb3fd330fa810ded3514f6f1f9f0d59132a0bd03b3750d14172434b3905e67415eacd2ffa6cff6db74a381f737066738a3884c8aaf0100a6d38272e7367c8335723d23a61bd9414ab2699fdfd495b72d90bfdabe8661971f1b1c2bf1633f5170a195ed97a8066e2505405d50e2385245a1aa2cd34ebe9516da4bf134dcaaa41e17886584e8768fc7e3125ed62324602ef989eec3454811c886802d2eb1948d406c6fb47235b9bf03418a48ad073d368302b87a2bb6929a795d9aaf400751f9d190d86acc35ab72e68bed12087d4f1d472f995299139061400924bfdb21142c059f76070764a7fe312c13d98dda8a32e5bf4148bdd4d9d2bbcfd731a6764b17b881ee87be5b7f6275eeaa1cdef5d01557416f6585b87522958b5c1c063b009cba5f0608382d2276262d735785d0d1831dc6f290311e30a6ccd8b921fd8a7001f4606610077030dd8c5f6aa23f89aad5c055e47df0077edca3847fbf5c6e79fc48956431481098dea626348e703da8c4cbb45b9cc41b6057ad3522b1ea43f74a7bf3ff47b9fb0a752b4690b046b7889728487ca631c930c4296e90412163d8540d92e3078db65f59195045d36527a553f3d7aa7b3e70945c0e5bada8036f50eb490ff6782cb3df6ca0b3410443a50bcc3a4e733daab956102fa0d7fdd2053ed44c16f0fcfd84228ea6bd5bd6b5765e00659f5f75211582779ad3498649a7af18b0a49a83386af756a764948451c0ddaee01a3af87535985290d90540f35fd6a4c261b437c48588ce0a12691fef668b4cd186a61ad4310bec962542446647e622bce9895a98c93388e51514fbd8d77dce51892a181e08172507703c356f075c70fe8cef8e0cd768a53acef6c5ceb0d7700cedb52be9ede9e6407ee0484a2dddbb7ff7955c763363f0cb63682f68e039d926d93d61cc4c3a142bb032445e3bed8045846ac4313c476663c90a92d2d7304732b8054c9d74d93f9b4fd31ea18a5b0f3c7ede5f999fd41d863b3beded17ac151d28e9b42e48acbc3f7fc36e2e595bce762bc69481bfa3c63240fc1ac8ae2a79e2bc0e6c1a6a8efe9a97c3986aff71f91bdc824a8dfec9e4acbacb00cc40136bd7f88a484f845d2d0c8173636a697b1011a95827dd57a10b0d4cdef2b85cbe80a3540ebccaf2b133c2660fbab6256b4d5d936e84bbce24e9808246866ba906394eb84151a8a183257747a9cb084a36a557c4e88fb8c70adff7dd24190f50f1235625d8b456ba8bd131a561bca53f22d22b494816ad59a26db4b7cd1228b6381317b3c7c596766887eb1c3c2c6e5b943dd1d6251916275b3a935514de466a2bb65d33b8f9994e025b58aebba8984be1b00a0fa9e2974ab241edb3e935c35c3adda2094577248f2d77ae330c50dd58301a3008b0fee658e4583ab48320cfc70e0061476abd18c8540fb448bd3642165b8980c0308101c4cc642f6f5e5f946cf214c32bd421901a5bb8482a12588ccf1b6e3d58022b666b355fec1192d51943e6bd843431f3f491665e54fd72acafcfbcb21bc721eb15a0ecfc792e0016990b98ec4ea114390b6d656131f15face5c24490a60ba2bf8be2e3c8af07c0e36693cc2f97a6f3982d3a12206c00c717470189cc3e0a9e4a011e52361f0ce3f03aed4a3398163e706bd645963eea34b6c91987b58b1d6a06ace56657c4ee5787b69d1afdf7a7aad610fcfa20462f96e30756c86f76473d42b458853b35fc85e3d34962df299d6518fe7f5cea110bc97e5835794594904253f4eab1924699937c86a210d8b7f0746aa378bd1ef096af5c7061beada14da9b1ebc9df7f3a11dffbae9724db84276ae3c1d1e6db258bed793667573e653bebb56b8a1ddd696adf40dcbc410c9890da4768fee44b6f2e16745a3f5f5e538959c3825f948135c26f488d6b54fd57ba29610b6d7ab2f0297a8e5118da34037ab7e6fe8472e5568428a4d02dba5ad4ec467602e39bdd3dd30d693b51b0da02584db6023870ecb3cc185f6dfa83b59c0182681ea799b27819e042a02ce32ca7637b61819e6bf7413bdea73b00afab62d3c1a02805b5a30a203bdb982544ffc2268befd24b2b1b8f824d3d596c5089111f474975b92497df396feea8836c9a819aafd68a0ef43a12086fba3f7e868e54d8d5552f29111d716bb21c233cf2e1a484ac5213ed57b3000ff7ac5a69a0d4a8f99d46e7cf11ba345d08d89867595c0da29ebfb0118f6f019945d7ac9d8df165442878ef9de099f0dea52f4cfc0e46fdda88b51d643b529700b9fe9960e6244742e11fe8dc7b1f0fad97273efde342c4c370672070e5c945673985dc98d62215ed378c481c94753fa81f23390ed15bc2c3d573071884ea329a6d18f76596826344e8158adcb23e27c27294c8a44e945614721a554325ca4cdecf32e272b0e881daacd94617c696144bf959826bfd57ae432e07ff7f701b81815f165ebcfd624b824346e8c5110d8d3ba2d2bff44309ce6e4630dd0490aa8c40460a5d19b40a1189e0ac50518b330fb72f8eb9fddfe04278fb674f7e25c3a1f5053f8d810c3e2696378e69ac62a4e89ebf71bec9cd092d5cf9a549e78d99b4b9055d0375e4d648493ec7b851d4d2f9ecd5c9a5c56ea6f9db47af58921541f2f05eb6c9b6a881368aafc60b8153334329bf2cbb4ff4ef5e3dec2f7d7ed192ee740f65e2567b118fbf24b1cb49fa7c5d490fc8335e7124595cbbc43a15b49842de84151c8c802d62963021573b44c1671ee8691dc22acb7ced1ad7599aef55360623bfa23682fd75cfa69124fa8c37b832a8bbd8e8c69d64c0d89dca1371947d0b9d637043c4d2a6ad36181a13321447d995e6007a224228e6d7da6eb9e2070739df1b0180a8c3399415c8afa06ee0098db8fb0c51d6f119a666c6a608d7b951f7f345f7c5400f71013500a0d0f1f88e7768e120085a04749b52817666fc3108f3ca01f139dd60ccf00ebb6271d67e5de2c8c8f7cb0dc9e0ab6fb0be913984034df4948553543ee325d5d39ff1298131512c5331fbcc0f50bb8d608f7d37acf27da3ff7f9ead18bd0320a9958a4001903f1630bcb1b753f315a25c3bfb9c5e269557ab4b6be74fa4b8e3c825db0b8e5af71463ea35e97d911fce31b7b27251afe6c44cb7a07e25aab4eaa298c79a021b542fadcf96499f981c98a60e81a4668cdef4684a8021324c6968e4fbfc67b6e454e0ff92f2d661f3ae0468037139696d2c3260214094cc4790a6611b58e5cfdf8f4fbf487033e1cfedf760567fe32d9f2d3d00722fd17971428c86477b389b4f3b4cc0faabfee32600419d965462241fbd5b4ec8bfa87fe678db8a450c92a7492e3eac5a78d9d851dae3e7186ec310d9315c7816b76f0fa55237aa5f983891e2051dc4464324d0c4ffbb38f03aff92b4095027c5dd9c7213fc44295c4a5f2c7b88bfd93a052c51e0bfb9afd1109099af560c6465c1e1f97eb5ce7607d916851e68f5833645b42bdfdced0f8feaf8a600068db51360910804f09cf4b6dbdfe8d198a336b0684e3a3903d22bac6affc04f3c8ad44b724e4ce63436e06a74e3fbbb562be033d25945f4bdccc417fb8a370c73a607c57fa44b7be637bbc111c8686753deb43d09f132b1dbadc9e7fb994c089709422f5ec0967c9631fd7d1fb660a554662bf4f65b107e91b862284ca34d3524daa9a752f8a24f8c3bdfb07c9902053c417f61b40cff4569d3bebcdd6000cd9c2f257d89f5873afc4a62383431fa98e3932bd164fc8f09aeae1219a49a960f5e7e028e6c6333d58351f46a34d8569996501b42d2a09a4512defef8996abf5199b625fe43254353a09b4bd8df0e0477b1e64daf53849b807fc41ece5dffee6f521ed601db64f52c1d2ec28bc4c09965ee4a80bf03fd45c4c5dc82f7653e2bd78744b7b7804aff023704a7338a5ac58ceb7d63bcb10dd0f6b421cc195b0e09001537a4b8921b40ee84c931197c5ae11974431bf8917d02ba743822226ce49f216898819c7da86dfc722f6eb9c6b9cdc2ad78785a0a1e83deda7467aac284b0bd02e9d8b3cb4cdb81b0583ff383e40e1b341351b1b1372c973b7be49b2a754f867536e4421c23a574064a32730643201821848c642f1dd28b870dbec0e706df6e692fb52feb559376e777d301e3a90f0f690e17ba79866f8ec3cfab86112bf63cb12051ee5981a4f8489544be0e7d413b5d2d89e2f751d2d271f3d9cd9b3dd3cbb8accc3beb9633b6dd39348a47f893795b9b4a87d10ccdab75f527d7c5cf6f93828b4f58ccaea34dda1362d549abaa6125969de3e50002c887aa0aae129ee8161182802d560fd190bf121203e5526fa35e2b300d864303233588c3083a0967bbaa611427df830e2eb3644635ee11a37ed24f26e81a88e9a31f021b64d57fa9d32023af223cd130a61d4c7f4518426c826697b75deb911297c8cd17827d491d4e465800f094365726674f198c8310774d8cb31a8e5fcfc66955760059b994166212691688a5d9c563b71e278621ebc145f99dc8543f2e2de0d07f8914490e157b877e538911707feee0dae1ff91d310e1691a079a2f26299f2ab0cfdb9ce34b0013600f6870d4d1c9b23811001f0166a27cb1c5d1883aa314861a78045ae05c7780377c47b359801c176b357224ad9e8a69abd94a362746a59a1e03a8ebfeb09db0f70128a6cf3f7956435d37b6b70222b7103f3758c48f59d5deefbb85f3993d0505b60be22fa816f7f3ea8e08361b5b72f10e47c1d73b682b9990a183b02cb0544628dec51d7f6adec81f2f3c0f59fd770028cbfa699ad7cb6f05a2792f850553396a9562a87c035e3d447c728a29fff2f467d9fc2960e389270f15d08d334610015e67c4ecece854ddbb03323220530a0302abfec30ea7b20d23b11575ad7ead54df87799a83e7223173ab60c2bd017e48168e2c732d479a18bd7a41fab8930e54826321f78b33913ef3549b1ff22d4192307a1a0e88415d815d13b71ccc500d7cecc8b0149db39a2539b4fabd7178380e3471b830b9cbad3118d911ba03d540025c4443031404cb3339068a2e1603b930599dad1041fb24e5a8b6644bca39c92020fea715045ede099fc5ff34f1315cb54c730a54f9a3875afe469e4e46e07880b4e7e832041036e075656081d950d1ce4e6dd81d22e1b4a664fffe1625a7949b1d7f535331be51dce44c5e94cdb530bb189e51013e17caf5382dc4377254f69a94ea5f9a335e77255243096bd6519ace89263cd680f0d3f81fddf44b1f47782b94eba96ba335faef18134ce08d3056d453d1ea03f42a635d385258d225e4c3a0a78291130eddb0dc1bb8ae2c2d9bd50c47f5dd1b218a626651dae9eabe42658a061153d2b7fc3350b72bfa740b3a81faf6bf62b695d0a06862fa36853809d8090baa4a2832c7a6cbf569ac7bb63587cec07e1b6520a0305a7ae668dbe5565e786b1a1c33e3dd1a5624d798058d66b06ee8fd6db8a95d09d37895163b1623cde2b68d7236ea0bd24c65848e39df74b27c54cdbd90f372d26d79b7b31a969bc6661989c37f1236293a5e3c6728694217e20db1dbf1864827cb13fccd6a15a2cd48354fe8005be9cf97c3dd6b6290bfb2061a356758b806958511f74c58155eea3a4338104a1e5e685c6a2a88ce1e7398b6e8f1af80f32d18d1a09eee8d8f55424cb0b611926bf9e9b174a8ecbcc5c34370e52d11b0e89f3eb09b89aecc7a486f70340ce342db047bae151dd56fe111e15f95ad14251f97ce7d7e5e9ea433cc31e0a003aab19748b8549254ddbc10bb6dea49867ec706eaaf00fd577932fd5bae29ddafdd756d92f7a8d2858641f567bfeb374c86c114ea41eda0b9cc89ebd46053acf577ce912af981f121625f505652e2f2ef9959d1a81f59da7abc08a839bfb8fd959f3d1b48c792f167fe57b4f32e5703974d9860e6f058982fa7f43ffdf072354f433b3e5d7091ee56e9fbfa78fd68eb4faf8ca544dc5e007cb4c9220ba71db2b743b69fa75a067b2ba1e61a0a5a000ef699248e16d49412fc0a7c56236688cb07ab79465f2de3110e6b2cce8a617678d1b5fc65edb08eaba03478138fb006384e7a414bebf6f3541ca012da3c3cafc6841382cf3e24a5413cad21cc2262864f68924760bce6b0fdac55bec867d378620647bb1580264a3c9ac1fa43a73ce0c55268a3bc51749877234f0b8d1c84e16aa11f427cac321ab64da8be7a46924d8ab82f0815e73aa6080a981a3e307d2a42a99681b25e28376ef01ca109c27d76fa06a0aaa7abf7ca29e82da2f4631c164872b294bd7a5a1378df40e2038d6a59b5cfa4825659482959fd64a90507a9aca996f8ea2b1b3aecdfcc7c8cf34dfd2fbdb2f80b6925807aac6f19a61268f3f8f9866bfa17c13d1f6062e31627730c9a60be93498bc6dd897584142a47d601e2799f373cb5c99281b248525d41e0bca6bb2edd92c31a74cfd12a223d328a0b3c63677c8dcfec880fa6338ab3b629563acbe7b365ace71394f44f7e553749bcef8953a21ae74684e555a0e01a90e3049454f3956a0cfb3859faf0b2a088036f0edb4f4116aeea0d14279319ee429d62278608076d178717fd334468d0bb4304b4a2d58f1e29650146a0ac2135a7b403488bf606c783dc63ee184bb0c22a32594fe908d68bc36aa4a20a6740b6c8b3a1003a3cf70b5a2ceff603b1d50ed2567c47bbd51d7bf589746d52548ea8fcb0c4e7ce02925a0d90a72e23dc921fd8cf76fe797db519c841790ce6f5b250ed7a468e82491e1c7730596aa98db4fbce61e117387ba427494357d9bf6340b120deeda6fd1637aec046e96233d6384f6234c26ddcc5be6ad9acbd7e8530bbfd98a1fc209abac28556ab0066b8bdc144d96f63d562d94999a8c4db1dba442e117e3a8da4977c529d2b4e8ed1cf668d7d9841cdfd9e770102bd3fbfacd70aed70bcc5d66a2af97bf933aab4d5b25150a3cb23d9872bec84fa15f6927b327d8b99c5994329260f8be080d34f1c08a31b7f57c0212a348d5456e9379d0646ba9fddc40ed217be3ef95c1be8cb201602c501658757cd1ac3774b9ec83e9b2f53793952e67d88198696f2be13e0481447b0e549868aa9d626e79dbf10eb7bd588ca6d83b8c84a1c7a826524cf875f6361d69e2ffa284b4fe5a59f746e041bc2a507dd35d109dfea09284c998ec9b8db4798d3f67497eff6547683e77636506baa80a64c38a7dcd1e04c6c85a59fbf2eef8867b68d56a63b3b97a05513b7856b479f8f9cc19b9df82b450df9a7ead1120d0489b8c4efec776873df53cee14fd346211c7faba70b1d916753dd539a39f28564c0f81db3df005e7d7f7aa75bdde2c5ef950320821decb7e559af1f3d493d455427b7a2663ea231db8496d882e4514e834f147bd0abf90f88c455326546b63ae53f46a70528231762afe0982437a03d55cfa7d7942b92bb065ca9596786dad59667e41c648bd11845db607ed34446af52d5b904c7648e3651efa44632643bed3cdabac261751086441bc1056d9beb7049265142fa67f1bfcd7f53a9a96402261de918abff4ecab4e1f892aaca60abff64602b9a36a5c3db1bbd56f7d19dacf413b7ba6d3a34f14b8794a2000f076a9d14e76b07dc4e935cb476b39ab1971b9551708d6e105594975075622a7f9e8419cad9e949d198529733409554f9a417a57dbc997f687c02875812927a63ac7ba20cb01ab62d5ff7a07a63f1865f351b1a96c04b879fba0e0e5b8dd0eb416720e22522c87dc24c5a81acc0f049bef6fc9042fb0879cfb18990dce6021f5f0c388c9f47e9ca2bc620f8733d79d9f22e78b3e10d8999b7dea091271c2173ba4127ee2cfe8a3d822201cded60fe80348d1da39bc3ace6e7a06fe3f4d59bf74305680fcd2a7ac996d0ad8db0c9f80c7daba3a30fd23f365b89630cae3859f9ebf456c5e6eec80d8a15dfdfafc2397f845452458542b29fc398531596022131c453a1a9d01e3ae648137221bcd58827488cde7c2aac286b9a6da4e1a0b76875218fbb1cb0ab7dd1ca0a39eccee6482da315e09d9ef62ba06f8a7211600e08c1e8f2b5e58e5ae05497aa3f94ef1cf2aa04236e3da08387f87b392fad20ce264e849ca9131ec36bf1bbc267fe257e8d221f9e0abc3664a44302c1cc1e8aaedd3d944f3c4cf71475b0556b1e2e2db163f6775820e67bb2ddae8a5e022aebee51aa881864a2d7e79a0bd993e6c391f8e6cbacc3d7754422e30f9c794f96cb5fc738578f64d52f5e5cadc0ea82babca310ceb2650450b0ecfafd68f44624568d5a832ff0b20e09b267a40743647510713869119a569bf42f48aba5befe6e7fa5d1d8ee8ede73d767be88945c1cf3d96853c8eb63c4885df9fba83dc2e66301ff28a340d81ec72dde02974ff5b7d2ee8a7d581c44ea1c1ce3ed1bdfaa3ffc876341e03da44b67a5f30103ae21c8973935fc0aab331d93c4574915b608d76da0168727b24bfb5d039f16254fad44fe99cfc8bad2bfcaaa0d407fb9eb9a2a04203c121d5678dd8e266041818155cfd33d52efae1fd632fffa0a5ed6ba15fd04f4b4b9b4829a594014a077c07e10732bb83be64f45d23b7f66bbf8cfd8f9e7270c0f880f0c13fc1f8e2eff0c1df4f8ee0870f7e7862f1b4f706169129a810ae1dc778e0dfd37b0bb2a74d14dcfe35bf8e42969569a83f4dbd5d6559bdf9ce94d5d390d57178cfd4243eaba724a829095f8fb91da1e4de7ba4db27b8285df720fc1a08c7ec93238a3abe444627d8b0c62b8f4eb0b9d5d38d2290579509631ecface6168e80cd11d835c837c3dccab2f0471b3bf735d0de4058061394b34f66c0a3e35413e998a40e71839e6adc10403dd54eb4aa753dd553f0b5d65a7bc3d38e4c08d3bc768cf58f6abc52b9b51fabd9966fe9ed75fc62f821aee35cc7e3c9ad2bab59a683807429feaa46753b5e0f28b730005c98d9242bf061891326924882c80e7e6ddb359ededbf5c1a875bde0e2dc6cb4f07bd36bb7353c8b0f3a6b627fd65a6bad15f7cfc036cbbe9df146e2c70f204076b2be3b353e176b80b3c0730bff6d81b4acf4cb5a0be1b85bbcf3b995f100523330f0d4f6be1a8ea556ad9165f8f55bb586036cce7d8cc7d1aabdd4aa25b02e4d02ebd229abeda7669d0ce726f80d6dac5c1c029510dcd3cf248d9a05320aa6cd2d6d7bb75f5bb72efcf8af12291a5823fe4d2bbbb6755f144b258cb30d64be9dbcdfacdb47472c64c73e6a736e7ad3edb76cac65d1cc4753862ceb930214d0a2023601a3149001d7275000a3f9532e46f0578c9dfc35b2cce24eb06a955ccf2fe355828fda9cab439a75fbd8e68cf84d3b962090c38651bb79171f7f69635f6cbff8a18de917dfdad80c6eaf4e38eb56e7577d7ffb77da3e8294195906c306179ef011850a86f0ece42f21cb2c153da22696cc5a40450f3b12e80187157a047124070e36781c31050f37808245490d0eb04f73c6d397eb09aef1ac083205fb21ceb5fad32f621cfe0786df8ba999c726aba3d665b303f1e627747a0c19b83fac09d0ef0b1e3ce53c05e2183164903083a71e846e9f0c51c4c80f3d45552058bbd8113c4de527a1e38fa159b6b553ac9ea6b449ebf1c4a7b5fbb476ef1dd3cfeaf9593b8d03b45b1bb26e64c0f1a7ac7ed39bf0d49432859f5f5846986526dcca1f5a1c9ac29e9ace6c5712df7bef88c51c66fda1d5187fdf067598453c5e1df690a8d6a166cd6054e79cb32682b4ba6e538b1be1bebd1fde4fdd7fe5a2c87b7f5576466a466c34291fae4240eefb330bff4d89d15796d91082480c423920424baaec1440870f328841880a831876f27f7e34ff49099e7ecfff58768ba8a136b67bfe05f8f4fc40327a84d8dcb7ef06c2b174464866e587c183a38fd1fc2f2f7cdf39a8d9ac7fabf2dbe8f903af39a3076eff9ea96ec71dd477bf272fcb6b869d1c91ca6b9262bf27016cc06da469d61b63cc736befbdf7c390f65fb3ec64572120bd5ddc18b557773297d77e1e1900bd1fe99e58b4c14b79cdeff6ecf7fc6e61ca6bce18c2ed93d664d226fca58ec78e826b43e33205244ccacd7671ac1501bbaccdf9465b9b1dc297a5d602b3d4d030cb8b51d4720384115c7041b27a4d4d9019d0e620a7d6e1fbb64eb5d63a6f334683173f38ee311a94ecc394680193b28279a131c1cca8ac8da9d141a6a7d65a6b513a954259cb42e6a47aab32594bb385722b4b0803a3d76255fa1636fed7ba347739cd52e79cf3b6914e1a8cdea8a6fcbe128616d285b5e20b6badb53a07d9597f9a73fefbd9d810523ce79cb78db5d66aad61526c8cc89614c1857144b82f1cfbca594b5a783efdaec5649386d941b77ff95c6ca3ad97405ac8adb5d696a4081f88dfdfb7dcd27bdc34abf588cc2204a336a6f306c2684996b550ebf04cc31cb46da3118d4cda910493c26f1882b56e5f873cb460e90b5be86f98520cadcb7ea86d18829f5b5926d270eaf21b5e7bcf348753b4160ad2fbd6edfd187454a9e733c5807d1196c0a538ca5129509e6528ca512950d4ba6ed023d032bc85fa535cf38cfef0fb298a61f8af46ad0ba33728daafec062d423f128af1d7637571d6fb03437124cb11c985975e604c3127544a86856a8666d5e201b0a2f96f844dc3b28f4643639a270c9a9999f3ac79cda8543535231a9b25046714c3510c37a862c18265bfbf2c462199f0ba00c1954a8150da047110460778711396a27891b339d9e67c5956dae498c8ac1fed7f502874cf6821f47b7e348cea8f8642b5cad68806f821e4efef6e0901df86af9a647461eac9330dbfd0fc6ab01c7c347d636242b0413b79cbb26b522f4f8807754c0275ac9ad42cfc9a5499994935a9fae6fb5dd377beb871816063625c63cd8538d4ed8bb8551f85ac0b061463328980c3fa000a6b0948d0c379d55cc0023b0e6c80f78251a6b28cbf1db99439f9ecf6b999e2e8bf8c17106c3aa0863a8113608c508a9f79ed480abf78040094ff61c8535fcd6689d417a3dc349bf37d8b6e52b550697eb4d048c7ffa546a18f96226394314634c0ef83955ab539379b138463fbef8f4446a155bf67d701d7eabda1a1747b55939a6532aa49d56599ddc1e12933e5336576231afb94d121e1e987a3063976fdc38163e9b742ff56408d0c40d3ad58d19e90d19d6474323a9b6361341feda3d9f40fc26fac24e56c0e89227db48f465bed46c0810901b6eed2ed93211cba88b58e2433d62e39df28c1efa357f0fb1bcbc6a6f2e621373588228a284643bc4c9c87ef2dc3b4e29573ce5878f487c42946090e6a759cb25919f61172f3c13e9687e1a752362041032860288e245814a2607fe6dd2147512884167aa549118c1ff0f0f0f0f0e00c8a63f8edd147f4097dbea2bd41739f56098f0f1ed3e5c1390a1f1f9f549326fb037d3e1f7d6586297c7c7c709438f84d110404431004c10f0bcf14599a4c11a4087c1a53cce0e3e35314040f0f0f0f0fcffeca253c9fcff6c12fe8fd65bdc1265f91a813a3682c3c4c680de6ffbe6f6b2c3c7868c44b2ea492248bca717c10144752db28f9701f17d24d9491cfb63da9e2a6cb94f4dffcfa6cee0c8e70d2c4081c4030c9edbd7711fbfbf60782dfe62187bd73a6b277ce5496eced43849224488670430811c411208a6490338f11a1223ff8b077ce54f6ce994ace79ef9ca9c0d0e014c3e463d91cdb77437ae0e1034371fcd66b5d19efcfa4e9fb0ccdbba34d2deee41e4268a150ccb0423143aa64b2b2519d513bb642681853804579c44a18d52caba1aabd06139efe33c184bad53d43f16305d8588d45f15bf4d6c8566d759d4aa0e76bc5ae4720f6fca16de9afc935b28cdbc7af5f9b39e39c73ced78ea4cfe7b3fa03bf1d6a9d4d62288661a8b7fe6f84007dce9cbae7dbfbdbfb64f5f4a0ba85516b508fa4b833f963fc21fe10d7dc01fddf5e808d4d424f6602efefefe79d73d618875aebdf5ae33c4280ce796433be367fee99861f3f7ea49ef41c29a208bdbf9def7fd81d285420c58f1f3fae2871297c40f0e31186df073ee991e20a13297cc4ef9322abe0c78f1fab504f4f4f4f4fcf2e439b43cb81f7dd6779eacff99503bdf5c744d489519ef42ca1f5b75713653de93952ba70d2881cc51d298ae05f91a65f1b1cfce1f28334ca953ff68e1d647e8bab5b2b53badf5bd37672bf3e1b1d721082430c647e852040a80cc8027f4019191999b7b23004653a46c5100422f33100593b90b5830108fe00e2f3e3053d379e1b6cf021f33735c8fc7ae3829e9b1e37b69b16dcd070c30290b50359bb9799b1321064edf60c26a896f56f30049c9da622be0c51e9f80547aa916a349d5403ef7749b51d528d5483a9651684d04261d42cbee0e21a6a975bb86a9cc6699cb86a27b48a63d7f1cd5cb42d9cb3a6dcaee5d09677d098cb85e3143b05c7d2d10636b039dd2b21e7544ee5544ee5d4d84b1861c677fa0689f38886f8fb1c41f19a9ccb2021460aa3f8598f8bc81736f316b5cee6807648893e5ad1a22816dcadadb88ddbb88ddb4a766ee36e3270390789532653a865294ce39e267d75cfdd645d2693cdb1575259e71a20ef42ea14d34df9f139937a243c254147c7e6587b71e0425996752ecbf62ed2d396ddd9260fcdbfa3546a6777763b9b63f76ee7c48ee32ebe57ec5bce0b4fd57aba8382c621b266c7215267aba5c4b5cb17861ba6dbadb3735c1c5ce3b16d181d7d461f1cfb5eb679e0d6ae7dff9ddafa086d3c725c9dad63870c35175c78ad95b9008d41c01f7bdcc7c76dd350430fabb379b80065d9b6d95c803ade36972340b800213219836cdbd8137336bb7df66dfbd83caeceeeb16bd8346c9b0b4ef78099e9ab8bf4f492542de4a3dbdf3c6c42ece8f6b70eab231eb938b836c282533b1ead381c0e273a11ca29397275c4a124d6853f1585e8f8ad888311050e6676c5cdd94026399ba3419bca2dfe566f9c83f82568533796de6f65314647f6d5379f3162d81c8b592949bd593d84459da8e2167e511595a462929e847403bf25cd54d5e6d82e46119574fc4ac41c968951445554b525a9f9c97e5d6a9c8632d45f7debba36c7b2308a9af2b3bee86f58077cb7d65ff999fba55ff83502ca32326f215c968d6f7fdfb46a73c0a7d2f1a730aeb80bda4136c7ee20eba2e941a35b9a296eeea07d04a704a3f84773e74606c0e9d966097e5f0cda2ccc5e373bf8cd22cc40a3c1b022bfec7fead157c72f9b9c7bb302b0bcd1c1efdfd4f8fd9b19f8fd1b1948175254abc6f48d1b810516a98654dec450dee4e0ff82dfc050b225b1859581e0b971b985fffbb4454f531de745188620e727aed5770ea330232f30ab1968b415108c89c61473a30254c8730b48aabc7981df47ddd0f8fd1b17666e5ae0f76f58e0f76f70f0fb372bf0fb3729e0f76f6ef0fb3733eea2fcb9dd469acd152e5e20b830b6c0add605e309106c7e805a1b2bf87d9b2dfcbe4d15fcbe8d0f5ca50d155c041c8cf3ea2d52aa719765dfb971351bb7eb1807cb01bfff7abd48a9d44ce3172a5421a26e55a128ae6e55219fce4daa111f29d5088f8e5d6243ba0176063afa7d128fca11a4f0ef8fe2e7f8534fe8171cbf37e4a91b781a83e7d6bd5fc2fdd77d1959960029aab06108072d4dfcb07331c6a619980a328572d6f35b56ced97ebb7beffd18b5eff7badc6bf1bd17638cf75ffd771481cd2d16ea37b5bb7eb975d930e34c84d52967ddfe0bcbc89b8c02d4a08013b5e79952d7f3ee6a7c83638fcd7d4f6e5d65ca537946fe12f2bf6460dc6ca691206f11b914a849cc8620bb55ab10e956ade2d3ed7fddaa556ae8bc5bb50a0cb85bd6791b9a3d8ea52995ed1aa35bfcd9bf81fd354ef854df5703cb4cdc0919c031bbfb7e13dcfa4ee1e87b7f78c3404df14f59f56739e6cfcac491030abce28a2b7672484105dec9cfac12af74a5b4beec605bf7ef0bd08bd00b1016bd7f656eeac6dcd11defbd2fb87eef29cac5b97fc57bea5c98a428580461df243077c549e7e1188c894531acd62bad5906d3f1b2038cf6029465b01b2f406c7911c2b11854e0707a5a5a4b6b4c691d95d6d2daa3b4a65e705db7233a45b93a2f1d58e9f8c553948eff9a3e5d4f61d0741845e20565f6eaad45bcdd14fc8a8251d4f952096043089a3da0d549b5eb1835aab1c2ea51a303e8fe7d36477d347f584f9a3f2e5e74814f4417e7ce5cb052508177fd200c493d992555b5537b0aa3f6a26271f0d79830683066b9d5d382d1d57cf15e44af9d75bd74af28553afe13d1d5794141e244f49d2fd5069e92d4924db5abf5342c4bb05c6e615da48b827e6e3a5ee0a916a66972d27c6ec26c268c665d26ac87ad75d80b1676c3e2e8b99f21231df340fb9ebe54ddca7cb5e01559d7cb098bf382620998970a33a2f163b26031a2f16366739be69774d1d511a75c9c15c7c45d161b13ab5834e6532cf272ab88958d3f76bce5d61884d19dc4c6c62138e8cbebde2824eaae0ec9c9d575fc3434c873c5c328143c7ddd7065c250264c090c7732614253ae0e6cc8e2885560477638063362510c4bd2f1c7885362ac660c919765b01b3fbd8e3f0616db8ad18445f16358104e10b4a77f8f948e8edfe54c39ec858eff8557eb69d8d397da5f2a46a338b93aaf1abca49c4e3ae6276c665d78c53379d64532cd1569ba33a54d104fd17093a6e7d37ca9e66b8af97af3c5cb2dfca69101707a78be743ff095d962c66c7196ab4ef66c7e23f39a3cb72eab66049e2b9e0b5527416861ead96c347f564faef88b72359a3f2d5e6c71ae5634df6ea13ab95ad1d0d068bd5a318a57bc1974f6dd983ae912452857a0a971ca15d8c1f1748ad9df067fdfdfe01713631ad150ed543bbdf5a7dad91c4b237d1b06e6e5e5a5b4e261745534a2412280159ebe545ec7ffdae1981ae5a57b4dc1b1d403aa8681df7ed11985af9d21c5662a5c811e99f69ca7f779fe9bcf0edc33a56b82943a75730e311a05c77f9f8ce1c0f1eb57e5e0f853cca3dfc78901c77f7164acebb41d4ceb33705682bc6f4384cf7ad6856f0902396e9ce069981fe75a6ee1b7ad37dc03ca41b434f37a1ae65a96e15e38e3b454cef986f9dcc057cb5594a85270aa9420558a90dbc4498f1078dc3e294249ef451cf972aa1cdaf8e1082974bb2655849c000222c5500fa6a06d79819b306a87883c01a20b4243112a86ece0062ff841071eb0603b55298c5e1c235c9fb51e09884c606dcaed132644dd6ae9f6496eed79c40031a8b3304a66408505a8ef706c24e2e1d84d55f8732c2d4e860060dda62e30c69d7c6b8e9fc52cbe1ed1184f0fb0baa87df872e083319610d96ec4ad7fea9dc9de87cdc9fd7e0670cc3e3182d6ef7f4e368063a29028fd7e53fac5a4d4465f00466f0debba3f83847fb62f87b70fdce6dc7e3f4d8567f89d319ee476b4198ed19b403ad3d00419b319111c4bbf5cbf332cb347e0c83b21a0b061198ed1ad8620faddfd3ec9f9e8f72f108ef17eed9322b6f42b94b1b5442a8ea531744e9cdcffa2e0d806a2dfffa6e0988843bfff11e19818833ea35d6bea5f408cfbe53c60770bc0a80541124b84a82571838524ac134a8ed8b0a336450a6298b560831a6e5576b060633171c10f237c7801908e2148660054050eb0e06007315c71e586a11e52fc0879d9247ec8a1dea0c3f2821319a002a4a74991a22d30183de0054f6cd13193c10724d60a229d1245acdca0cb61019e65a4bfa3bf390032c4071d761002fa5962272489238c40421ae119f8d6b22c01525e9061880c497c9802045400192227831c9ae0653303d66583f0476f6decc10f0b84c0010c4cacd8a00187102baa0cdde003111b4108294143922d3bb4200614c0a8fd2ff7e55c39887c96c0b0c4c78e0bf0d4e08829a2d8e1086f079b256621e57b7d9e40ff3e817df4f1836f63e7fecd65997e13be3f4d90033e4dd8faf7a9c2fbbf9def6decf07cd7fb28dc27c10c1610d7ff00bba34f9b5b19851a61ca04b7dbfb5418f1f1c44f4f103d5877ca9ef17785bcdfce7bef9c73ce4b78ec0c74943b1af406f3cd39df7befd55be7d74e0000081878c839e7167aeef776e7bdf5a986d5dc1414a7e68af0932088608c2ffead738963a9a9ef3a4780f99d8f67761a6718744d4426a8ce61ac6c86bd314bf6947fe20cdc050a144bc025475cfb063c2452b2809341441b1ff95897c850c592158288f08116229c109b108103229aec60157153111dbcc461af37181091e39381881b4078198538c4491e84347091ca9315a8625032c4b7e3badb274a8028c2471e7e54800252e2630525319c4a663198461a2fb5f0f8c8cae7c3b91471058ec2559164c86622c94ddc8197dd3e49c2636fe164b74f92bc80c4969e5a1cc7fc09122c234fe114c14d34fec24438030ee324fce13243f60e90e030b680a4053db5b8100912157c40f8c88aef063f590179433400553eeaf6c910115afcb6ce1637a300252c6048063d45558e031e1e1e1e1e1efce9707c6e22432b9a3fe4d7dcbeef9cc1e8cff835b7940cdceaa1c36b5938765febbdb3288a6118eafddf08015b01afbec1effbb4fead8057d73b6a82b0ba0da2331e92a2e9e853f1d3f153b2bce51d91483f22dddb4bb12c5f2ccf7134f10786e183e13923a3ddeabc031b3f5964b821c9ae071625ec9614a440c8ae8917dcc0126489110467f03da7b0e24a0f3ad478286200961b20b10148a887243040711281b8ed291fc11f74008a180a33b08bad869e6eca619241c7cab6f2b1aad99cf2c791066773f6f76478c8d8646e594687d571e10182abdacab6f281d1bcb5de5affcaf6633cd3158f8e1faf7458143f3e539aa131080dceba7078a632403237195b96e1c1e3eac8e8b038672ab3c38506999acdc932b48e3f93cc7047a6461a8d4e199a0c6db422710c1124b72168f941922a2b604114183420050b152b3f331c78e0b26ee1321eff7e968e54967d8f651400cbb04e72b6d765c541a4d65f96398fa4fd11ebbff78eaf31fa367575f089c23d53b0aefd038081a716b7de1e36f6286459b8ffe2c031f2f75f5ab97f0336e7fefe19cf019b65a433f569f8e94dcf9c73977393cebb89e076bd3c2e6d64dedacd7171987796652888677ab37b5874ffdefb67e0d80ff8299b7d7863d6f593b70c43fe7addf58c59c1530c946a5b8a7620fddf1af21490cd21757d7bb9a59f877cbd6b6e696ddb423c05ad0a24be7e0b6419896619060aca2d9b133e8afea774ea754884a7d676712bd11141d8c3303c6dd6f0eae40f3f1dbbfd8bbb3af9d4b68b83c4e684a776811894652884a656734bff686699b6e5967efd658881469c97a914f98fa617279e3a975b5b787efcfab54d3f0a28fa9fc333fd7e6f2d8f331257d34f3ccd6ad482ab5c4c30b71ee9a5647b72fcf25bf81d16e28c4aa552a9742ad54a8b4abfa032b9d97898bd98ab75d1565a74ebba7e69fefc6f13d6b3ae588e182d36cbad2d18c545bcdd4a9a3f38542daaa082c5ff687e0baf1d16dfa209222a576ad6858dd8762c5aa8ced72e684513a42b49f3c76c61e268c1aaf9f3082e49996bb9d09ad57664ee92035b36f3a5030b002b1606150b6b71be76b523681214571e69b5722ee7924373209ad3b996cd9c71c9654daea6498dca9a814563d95835a450a7189164dd6a9ad4e46a54d60c2c1aab06962d55a3a26ad4538d1a53a38a352a59a3b26e63b9db99782e65399e7aa72a5033d4102821540ed50407fd1447a93ad074aae2d443cd5043a084504d503919d42c859aa150b3136a16839aa16628b5f34c269752b7d3f174b6955785a6569eafddcec49b11599839e827cd9f55e9f22111ef8a0e0ade9aa5cc23ce572bd10ec6cb2da29d75c1a89cae4c39f1700ca644958e7fbcd5483a151425499749ba918eeb483a92ae8a755121c2e86ee7627231f14af3c77cd2fc397f347f54268e1c4ce5e76761ae597a458270494e3122d97bc9ada7499ab27be9b24ce918c7604a5814c36e305a2fcb603d456c415906d3910496038763b0177a31a5de50a9d7e3a117a4c75f727de6e584d5743b1d4f67db55a8d468b3d7961e46f1ca894ce76bb7eece196fe59954a5f9738e2cce75e5b3d3bc4149c7d3dd562c16c706a306830603078c167cb5ae17ef459465bd3a2f2a55d69d6ec7e3e9ca53173d519a59a9564f326140d665b3ae55905b0f1d16e5d17550980c19e161c75399afdd4ce984d576ab1569feac7e74996141c4bb22ae3b00090141fe886361aeb4e0165ead375499604422514482a8cf4ae2388e23298e6216c5555c5d566debe96b8783d5d6ddaa5bb5acba5545d3f368a5315fbd51f52c6678aa9919b345cd3902552e6648f347f5a58a85c9734b2573d2acb4a878bb75e5ed8878453c9d8a8666665d753b225e916e464b0ebd95a47bb1aeba1d11af48a7ba2955e4e82a552ad00ccb199569774ad2fc99f971265dad445e3bebd265d9086aafa7afddef667dd7f18b3366985bab16de6e5d793b225e114fb76ae1edd695b723e215f174ab16dd6e5d753b225e916ed5a2dbadab6e47c42bd295568caeb49074bb75d5ed887845ba10fc368b5a0a9f50e4c666ba4867b17ac528ae79a12c33c3f3ed6f1f1c7bc1517a8b3abdfddd6375f4a7fbc7fee95161c36275133d2a330dc5ca746f17b12dfb7ac8ca7650127da4dbd7466c8cbfe9ed6ba19d1bc5b7ba17a40bab23ea2ece082cedbd186bad75df241a3b8c39ad8a70eb67f56116d88d2d54e08cd852b41ea9ae032ba66f258e780486bce4650d4c27cd9f9adf268c675db02db01e6c851561144fd1a9e60f8ed5b710ee9c573a7e58131607d7a458dfc26b87e64f25a240b141c72c9a5307eeac68e0a9eb968572ebfe0775d7ed060afef2229e268ef35f7c0baf1d10de052a040d428788a8103a05bab666ad15c89befcb2db5682e1f9af7525f98af1a5800e007c17c49b130f0bb305f502c0c7f68bed6dcc2e7f9522d0cfc2b1e0915820e41834454082a844e81ae5916034b6b85a2184da0421915ea7954a8840a81a8508be6f2a15d3e7806e2b945fa805e5e4a3d8b4fd6e06a92d4e4582eb066ac1a6b878a854c2a66c4b2a1402388aa495283abc9b15c60cdb20c7683b5630bab866331a8c0e1184179f820a91e3eaac9b16c28d08802c1984c5924330c0c39be785a4f594e3d541154100a874a62d1fb339fe2a09fe2a89c6acac882a85396d37aeaa18aa082504950b899534f75eab138f5644ebdd499f21ea71e2ad7f1b3545346aa29600c48ded1014691d437d388868e69b17fe4d269cc1cf48fe68f499a29ec5721ec29a8c0fbcb974ebad39413132349555951ed4e44272b3828e72bdea9288c825bf8a562b405fceaa2a8d675d25d1d18148bc3c4690a0c898e7fd4755c9b9154959593951391485249929a49aa0b4925a9241509eb826271f0eba2b0689f2fd5ba30017cf094f7ab634634f6c78c0ea03b0afcd2d59ad449f387f5a3f9e3e2c59dd8a8542c996c7a1422a20100124316000020100a064462b15818a49924980f14800d68885068523c1788435110a42088a128c618420031c0108490518688681c001ba6d72f52f88b090a94543125810405fb52094e054d4357382d0538373683e841c56a94d50560d69300a3a709262ff8372dd49e6594ca567882766aa6c7f468b830df84b9e9380e931653e5c7eeed71169d92159dc254112b408904af70bb82893e9d8495780f751fbe45fb462c664c2c8f8e2864c460fb2c79f129da7bbcd45ae2103ccb695acfe2e46d975fb7d80f0c6ee065428a0c7472935d78f529b5a70946de0a4b91124695440bbdcc9171cb7e38052af586156b88037597af0733909ecc23cfb64ffce5e3e98ad5fdeac2a781a8951694fb8429aae072e878ed66ce7f9e76db9914943d67cf10a18ccefabe86a884829671a3f210046e715f77a9d803972b36b8b8364e3e4f639b910b7f2e1e276449a7bafaf3ce5d57ed81c3efe3b31bbf567fda4d30c7fe6f558ba15d95a410a5c45028895cd4783d988b99483275015a3007f5056a6fc4b54996b25b09a32d809927a8005fd5b2c4edfb04dac4e5994e0d7018d739808069a10294153842b8854ed93d11a8d52a0d1d90673110e33f7707f1885278cc25213a47306ca4b92452d0432cffa868d9fa99c492bf197c642ae529fbeba5c7cba4ae582ae4b68f4e2342e44a902d8dfc3615c3a075f3aef16d01dd1138567d43c558d2d2c41bc80b9f9c0d376621b36574158d444ad25c4bc2d2a6585389eecdbfee9296d5aa7b85f07bb60c6f71b7091ce8097914eaf2f6163ad60f62cf3ae436567e62f26ed1b028cc459dae074448580498d1245335bd17913ee2386a340b118efba2e82c66281ac8cbc2fec3e2170ab03ff5820ca2c5c2f48feb47e6068ace0eeffeb2172f57f36cec4338840fb4c547d9f45ab0d74ea94b67e83436fe5feb1a6758882005179407a274e72822a43385bf50f42312189ff56ea16a16473733496c3ee8829a3852e4f2934acb608a5db2d1f9cd97e9a798c980dda537e791a9c1c88fc26221b239c070e9dbb0429613d15db973ddb9842252b5e26939dd772c642b8744456a7de20eb511a7ea395cb20f465bd343d8d7589355bb457898afebfbc82df47906bc5622b28f29ac1831cf36e8776eb37c6511552f11729ac68579396d30c39f9e4da50fe75feb5fa0d942565f720219ad2876c4b7dd5db42d50342d78dc37accc10362626c275c6d110e1622399bd7e5b64426ad34fa8e6cffef4314df8bc9bdd75b64fbcd75be28167a6ae7f158151342dca87c54ae18a6c93d3c6f1623d67cae73f3a5fb608c920b9bee3e43562f20b62ab3212ad75e3f4b6f977e10cd6942c9889c55a0c5f94330a423e815a13778e235afd5971c15d2b63757efa7764e25c01e0c0b8be40c60764dfd45b5308902212e604999cb845b7aca449ae1efcd92c0d5d5d02ffaf827581f0567e334884038c65f9ef77a062961f9d0250756bf213f024a4b42cd0a4a5cc2acd7cd87538c74851d707e6458195bba501b6d798c0b447096d34ee420859c1593ab56c4b7b4e828ddee1de4a5f4ba6b6bf76d5b426752bcd0e4120b5ed2b3824d46a891525847e4c259ff870e19bb0c84af5201ec01a28a46e5ec4c610011ec5dc28aa5832a0dbf03af5e9a7855eb5fb9a2c4f14c38500ccd66a49791278a495988c3f4b2bfd017e41a328dede253360c7c65970e4c400d4ed45c39dd1dcc554b635fe140f8cbf5bb19b1fa4b191d96c9b3f543fcf7403f413b4e6b4ac084476c5fac65b56ec6cb60deb1a73e6bd6f551d64a59d942fd82185a64652ec1fdd43da542f6e55e2ca8ff2656ae107f08da591878a2d7b3f838fd400d19db70474032aa492d9c9cedba3841367e8e65d091de59a6ee81111a011154e3978998dcedb24db7856e234f9b9091c6ed16993bf6f848071e3578bbfc3b3c6e61a12224ee092a815763b62a88e511229456e8f48b06d742781633e34bae34265cba9d654122d089c3d08046eb392c799c02546cc056520b59512cb099cbbd1fa446c3c550406e260814d2ef08ddbfc326c95ad4cd407d53af922fd78c61a04f5681302a4ed154f8566d49eac957fbd3561adb65bc5a5b7e1c626f24006d1e1e5a713c931692af91a6c307bbb230244b6c23f74551c048d21bacb49f6209f0ab2749683a067782aead546c562955c8a15d2b17d60766b9ea0f9a46e84ab50f3ddcbb75431b91a1466f7df5b3d638b736b6371344309a66dc12e8f54236801299c738ae733d716f6ae5b518285d76e20de3f1e5d1b5a15edb0db91c66b11aef931ecaf409712728e007f03b744c1e6e9976b6bfd9ea9a286f542f4b5ebf521cb4b143ebe8d0a4d7f8fe573412fd14953bc76635b9b815f97509f28653b26e82440db791bbddb06c09c47eaa51df4ae2aee508d2f750e43db15598f8b7a07230648f99853f4afbf2cf069dd54b0f43507041a2fd2bb4165e326bd4b0c505964061dfdf1b696cb7939ac32a8dfe81d83bf30669f6e2d20f105345a9f3b7983fefb47c018b29cb3b5646d26a1c22088ef862fc6c9c9fb5f381da2376600159f2bbf5997854e8d912fb25a6eba88daf5698d91556c6f20857cee155b19258ab2b21f52cab5c3b283d949f452dba29723c42fb3d4f3ac1f67f40b4df49ab6547b55c21986d3f12473eb8285ba7bcd60af277958dfe48fbb97ce86cda3745fe548554a8f2d8a19321126675326c0c71433a54cffee6d2f81d1d617f34f67ac1d9be6eed90fc4afc63c42449a0e11727e04fade7657a0be7e4757a0280529dc09e73b85aa16f5b1c1be774dfc949cd9fa792b9b339e082c5e37e4eb1a4b56cefbdf680ce8b7a5762a6a011fa12e80fa5ecdb7607c789dce050692342d916ac066d1a230b0e9475bd8498032a7415a2e484c24bcf830d48edc89ef670b56c4b7f8754c9381ef7bc5dfbf5fa5fb491421677e95ef80d19cdb55c32b0677e10ce48fdd576177737be3afe036f74268803f092a329e1e4afc31b9d583a645683bbc01b2c5ead3f69c6efc418b333e14e47fafe26548652cbe282edb494dd28d462a4c9ef2e3cb9c8b7f18ac0fc99add0b73eaba12ea5d6865089a395f165c73f90de6603f2b7e5dae8c788c0af63a2a6454e0c5f724248ccf1e6cfa14535df0667f76fa2ab686577741700bd0ab1f05b618c5dae97d1736128b7ac3d0562d937e8b77c146346b70986676ce9e29cd6bb94238e1e62fcec109b3de93551c0011a061d14847482a88a484da2885c9251bffd24611df2249a71c943f2698114e78903424569ecfa622a013ebed5cb498389d98410b38274c69bc6d2059bd3a4745303fa8d3790140833584499c3273c2a00a4a110e55094df1410906052242aee1a89a304db611ad674e17c237857e9c9af85f3c93ff81292b74e952f508c21c2df922fd931d5a8c698d056de271a926f80590283d5bbdcdaf3aaad5566d095d5afa4b9457e51bb25dc0e08857601675756c8efa1b0f0304e44c44d160005a3c07d07ca9c2236d9698d3b90684636e7495bb282406f8a1b33a37a79f884f1d1302bcdba4ed868419cffa980086ecb08962ac7d3731834ef4ac63974ff604015b768880b03779ef47a83e6b29fb6e8a6b703de19a5ed6d7e68b81e28aa1fe21f3ca7b0b04195a665103ac2be723beeb355b3c7954b4e03ae8261c578661a3107281c1941952c994ec6052216949ea9596d5c2be2942b2263dc4af4887a91248cf6b4ada2e2560388f456b0d58f70534de7cb75b45c18ed7cce3b434cdbf575e06920206e8e0899ccb0f937f3e4fd3288100e294baae00118b15eb2623547433cce47ef5c09c02c6e3fd8c78cfc642cafea800e00dc607edd9422886a726d78454c06cafa5959c1f048e0b989b5de7f66da2223da2d394df0c5eef25dfbb526cffee7db38def6139484b68eb32021179ebd848305e180d4786e66ffc636e3ecc73df113f9ba698ce4e399dee10345b862411aa5a791d126a8f23538a6748235d38b8ee4442dfc6bfd9600766156f567c48b6cb6f30aa52bc3fb4c64069abc01f1039a2d3f98ab198afdf45a45c610c4ef5743a424510dbbfad05cc1687d057932f4adf2cd50cade351367af07b5b25d3ecaae432a16b464f04c90a7dd1e8c00e4d3f43eef9bdda2845e3ce94db571dd83b79ba5e12a6d641b9e7f3a0e2fe6f55ec87a08489b1daae41865a4d1c93fb238792d0aa53111a233c5f9305dcc10f74ec7a33a375d9d0294ab9cc20e0127caa4b19e586d35061c724f55f18e932e5c6a1b4a6cdc7fea1e568e9db56dd4b2446f45a755df968303984cd5ee2b8455cb5b0219f9a8dbff585d879eeac32a869123eb10c8436fdaae130b1ea7f367376e54cc104365d5d8d27de9552ddbb55f5ae845b7b4915b2b1dda5f1e445dd08e83a64e73a7e90f10726bb22f109bca4d09e25a2df470cc1100f342758ea906220823c04844bf7aac834d24415f3d52e1c6177615e3241119065c25207160df525ce040f10ee445a4a6872b507e04a48c220ce2aa426e4aaec34ee30e405b35c3d829bab5f0c48efb55845db938e7c95804c6064858e8b864d4d6079e26727205759b20927722376cc0dc280561ea315fcc5919efb00b15a0c28277ba19b997385507b2efc07566edc3ac6e3892bdfb585f241f02e1ebfa039fe196ebf00f30c763ce42ecd588a3df50246ea7c9f92d3e874a72bb7a4ddf85ff1fa33e918039f5ea7b7a090051098c3c036088207016e0058037efce04f30c000e7d79ac9f12637aac5a82555fb148cc0a4dd8041b1c66a83c742df3d8bf21f39ee991102f00b5ab376c78c837c7c1e6af50afa2ed9ab372bbc4e216ef9f46864a8e2a9e8ae86479c3f3d939269b24175e4a0fdf4107d2e5b253c8de6822f4a0e07cad4133ffef5530633f96f2657fa7374240e75c1f1042c0418c86a91f0173decc4e88232bbb2eaa8946c9ec23bb229d273ba6849a28178f72b6d3bf7ef4e6366a5aaa245322b7ae4f89f6fc236b7e57153d0b07994388fc7811eed96965237cd852bec77d6f55f5dfee111041695a62cf66045557fd918e38761933a7ce61cc47f40802e3fd8fa6014e7ffd1d40604b9fd0576e0d1c01b82c03412f1339148fd978d1a05ba2960be466d861fd31acd2ca5fbcd49b24a56e64665a91131589dc345219ef546b69c2ed2bdc820e12fa8a9807a16881d1197588fdbb836946146bcb93ab87b13810bda31ccc4f533a599fd57bff035b55273caac2b3e32d92b2cebcad148364f64d60d7c2cfcdd2368750bbbeed63d7896fc5f16894658d0556899034cf54592a8dfec70b57ba878b7b75f285be1f9d21c1e32f4524c03e8a05646808a90429fe533e9fc9e2584f1bd9ca6ec1f6edf8452af7aa32c63f8959562487c0a8be654e048ef957b23738abb5145af52fc2622e46fb79fc281a4c113b20c91c87c03be49768cc8d510aff2723893530d7ae8ba5b37dd4540c2b517af017348b6b9a98ebc24e3580b751ef4b983ee574dba8da748be2144ba5f5878aa000ff8c0e09bbafca89e2561a2e84320a399a62ea474b482452286e6ff168154f6c4cc0f09c00a09a56b7b7aed7d804960cd3e7c3815f853074271ae8a2acb5ac016d36046db5afe04f698713caa93952e680465d45444f78cef22fdc858e2d9ccb03752a31d22266246a01012059ec37cc0570f0ff0e047655ec61cbf797899ef254648de1461821146ee6e897fbb42685a1a0723fc3210fc779cc8625ba88d86890f70bfe2119817ac0897a16b1cb647d4604316edab552f0c06661779f5c158e34041e061f1dbd09965c8b684d229321375f106bd0907fa9ef3aa7ff0decee6465fb3d5984f920903ed4b6fca65f71e0fc70ba454e1871709d59f3aa805cec1d4767aa06f19d41aa3615428d9d3e7205ae0e22b8791d6f7c18853ada0d4f72d8e2725c1d05cdc71eb53ff16d2ebfc7965129f18e81dd5f1cfe3137a0e78a7ae3fa2186d7dce4faa3a55b31199c65192ba63dde093816334df6ef3cefac687ea71093636935cd073aee68fe4a28dc635a32227ab2b5d01c655bc0df937322feafd5eb449fda506d626f529d164eb60bf11f171f444f8c6fa84de56d44526d1f8d08fcbe38a472f4e356833bc8dc11ca3e609f4ecc98cefccb344ea266993654960401b603c2754622075e69e944ecb7343d4bd161481da1a3a8c27e9f57f7810782e1b164ae46715bedf3987c987923e2abe7ef6d58357a7ee0366118b3d6ace45a7c2ed13664f5e385cdcc62e55b9f9bda29ecd3c607b4a0df92d065a202ae0e7c3936c16cfd0d3599d12b43fa81aee918d2e6f8d9ec8ba53663ce80b9806626f7d01934446097df1b410a624670737e79f2fa5076d5d2a183ba9f5aa45a4bc63d12200580b4ec50c0b63d34d0de9448d1c81f831956706d6d3242c612732756ad5ec60613d0b5597812cc5e2af9f049317c46d665850cfe0b39ca34ea4108a8d1a3b42cb8f1768f030aa2676759b4de3d3e869cd644888045d13c3c927252fa904f4dc94be05de02b2a373361c3568193bae3546d44f19eabdf5dad149535adc22a24d1a1feccb838dc73f57bc628182d42a2838477f862870f5ca05f5f99aa8aa813acd2d767eb2c860dc1821e20059728b204fe0897e0efb2074d9eea861da313c7a2fce3412d60248f1211cc12d275ca2aff33880ed144074fb55ec5dd4c5bb8e045c849d43e41f19040f902777b47cd5bd66e96ced565252035a3f864eafa761f6abf1c15805eaf258d679e48061a0b8bd91b22ea4d97ca0c6992fde352f4e860061ce649fdc1e9f8ef210fdda3cd0f893fd6e9b8a2ecee0384c4dea2cc7e3b4803902d90a07a697d6c537d8088dcf6d15e75a872403d3b2e85fc1be02e823cd6cbc09531b9fe967389ca99734d4de7a98a705e3063efe49cbb10eb561ebb14607b625bede0626e2de85930a1c4c4d1f33d60a835183bc4c06f38c1ec8452c284e9fad7972566b65fd2cc91c419c42a00b0cfb6aaf5b6b7881b7aec6894b58dee19b42fa164d90e0590e7d52492e04df7b0ab11649595b8e7824b0303cab159be89380c3aea99aa9b8a3191d26727654013e5ca83e54a012901f2f0b6090f0f375a81212fe22cb56113dd26fc96a24165ac9381a238e97295457f4d291a959037b222f2453763ddd6e9695b1909e4c2294a06336e0b7a047b8b74832ea327e2dabd122bd49f1543ed0313c600ece2c465cd58a7fedc4ca92c8c910743363fc694465cd806020c77ccf13bd211fea15d9dafe27e90414cef3b328109b65409e361635e98b2053a09030fbc0a6a07ef25c334ce8a962ed2ccaf51b52fec1e9838714f97649e687e019f7abd08a811a6971d5d7449b8000a40f34c975584e466ccdb79571bb898229102bdbeffd636bb7e5e839650238a3c9ce716e0ce47c8b0082dd1a9eae5b03cd921a91d3fe5c4de468c5325cbc2de9f0fb140ea143a246424f14de1e46dcf24b59150ee1514434454da9952f83a2de7c366680aaef8f202747614e835e7a635180dcf51622719e5d1ef803a6b3e531149f73f4b860d388a00f8d45b12c78924064dd03a13920962b172524f53f09bd916d4996c073724d1e80967e9b7e6b21141f61bf2d6583d577ac5510008e9ae1c1d5befd0168a198da8f1bc25602a57c3b3c0ca3a7fd5cc7fd9606440bab9423909dd97e0ace2303a6198ed044056340efa3396260d08f96b2180040d61f4c9b6b343068d76823b168d0bae21e7a19cd82d36528cc4f8773d04d0052d1aca134e857c2f0a54de577347dd332c69eef581b3a2199b42715b24657b7cd83baf9c4dc1e6324bb202c1677a9b949721dc63ff17b18c1e2d891401b2363d1c8a6597d85376f9fdc2a149feb937fc9c689f53d52d96b0471bb15caa8fb9c470a15b0126dd32a52570f7c27741fe4a1b5b1c1cfe24b5c967390a95c193a85eaaa97012e56413afbde3ce9775fcfed4030e69ff1c4d66ec301e096b074738e7708204a204d988798d60d8d9552071c6022042831ad15e9e5e568ebc778fe27e46c2cbae9e75b775bb074f94812307f1c4e362af797a85ee4362cfb84c0d160058dfbed6eca1b604ccfa04244583cc5d13ef49cbd4795da20deac657db4ba32945d3aad93e2a9b20b53dc92f4a4887bfdec75fd6bbf75d054eb4024e4a8162d01c061d03dd28181a21bf9abeb3dd8208f0243a314e4a7f13c4ab436d887924c782824b2376c297ad7a54bb15375c7209745b1835f369c73243f778155866390aab42bb8dded6196536d7ff388845a51b89e4277e98041c814a3dd7867e60b4abd14f8853df8f9b5d95b64c86d4c89b4ebddf39bf70bdeba1e85d8740d39c1f2013343d19523b8d97d2e2517dc4a7ec4446c3d4a2ee0cc3ed4c12daf7bb2b084cb3c5e031787b3918990b069451c0469e95413befebd3193cdef04453952f866e503855378ff6ec9a88e7a026f46ea4a8c7a37bc951b84d6be3e3eb539d2eaba148096a9b3aa2d244ea69317f4d9881090b5c764302461c11647abd3b6d711b35352961c4b7c9fe86fecec4d1c744bc61ba24f26b4f2766104489ef5aca9d22b2d2e965e740acaaae47fc7e61d5ce4d68c9ba296746cf2209504a19e801c3f9812d143367c56c67e6423085d3c9f019c6c04280be1c6935b79623faea0271c06b655f4fe48a28fd28262d0ea94349db52790ff2f2802215f18aca55a057a220c80cea40869a53aad95eebd2879132417086738baca77bc736064cdb5075782f8b19d1e9e8aedc1540f2aaab1ad89662e8413611b669499f43c9669d599630cb78119cd0e84e64d1035141372d0c1ce3fc71c5321638127a150ef23ff31e7047f061983e8bf3806d54f5e434f97ef02f25c7f9cb2c0ded4b693113c220cdf66403e55aa82f0cc032110f41a6cfdcaf31a73e6198f4a9465c8ee3f774cc60aa54d68f81df04234995b0928a9067145102d4fc3325164716a4cb130d270d135a4baa08d002b5fdb3b8a39ea7902dfeaf3a3c8f9d517cb56679cb391b752c6b9cb76a9258db2b047ce40892db394766d2a5703fca0e1bade5b3eda5551a0e8eb42e6ea31186575c1fc3150690bb217e3c325d8d10ac93a9530544dc874489f3d128b7a36270b9861e1bb25829c7da5678ef6c02090cba32c9fc40a5e66027476d3f8dd0aacb8803610bdc118c674056c7ae8f32b45d519a533e1a7c182a4473ddb3fd56940009979883d6384405cca36a930fa99916b63dbf4fb18531ff9985184c5efa67c1b2a82fe33216fea0b65ef8efadd078c3ce8fc3ba4f327324b0e1b79146ea3f3f654562d68e7e5cd8408a08af01928f7ab3a205101ea324fdcd843f18131b31fd1f56b9d4fdcaabfbf371d926e3c7760166b417d662d3b9fcde33c26596ad216fb7c86d8c459bae562e5506d4e17d023b164cf4d6021387d73e59b5a7325c65c652d9debfd309ec6c19100e31756229a2bd6844d245c2e775d6a13806c07c54b8f0a38f0cb7747bd3cf940a5138b52823bfdaf6fc89dc640814767b9b83a95117e0c7497153610a0bfca4fedb3614f2390a76c2dde410f4531f467f2792f06e8fd37f4b5d72da79a598f6f28a10e7a6f9ba17788b75f9c00bd774b02bf9140efef108514a545010ebc3089e03888361b32e493498beb07ecc62fec5b488a809c330870ef201c1d9a9162e3218c475104aeeb60031bf5d82c8d588a4d8ea314bde4f93f9fe2fbc351c583ab39d9586c8d32d29fda8009688aeff56bc0d8f87780e48af0ba3df200a7b1464a9089305f37d2b0081b07155f6e12589ad672c00f5d99727a824d2b76024d4ab677c684ca85100e9003ee0239300295ba71917dee7229f3bf61e33a19125bc8f227d746c54c96d92e4af5ab66a46429d0d1a57719adbfabd33eb97272888ad7d70a50e250e45fe2f5bc4c342132e9a21e527a881f07aa8ded011bdd1e28f1d33d2f20774553c511ead3131a126be8d0b92d0a0ef49704b99ed70a8fb0434e41184b4642013094308631968df20a390109174f27dab2e9a7b7c4ebbfe6e1f01cc9a926625916ebd020ac0a0a5c01c177261472b460f0bbda4ba89384b3693fd86a165d36238e9b25c8f05da49ff06cea8516a47bf4261721eb943b784a174a72d69188b09b13b05caa5600306524043b695bde271d02d9cafec9885591754d411e5c7839220b4453a396164cd89e36cfc1340d9cf0b1b945d6bfe60308087cf1adb57ff2511773233f3201fafeddc023f8f3d636b808b41e10c16a1bb447d87b1989460910ff6865f530535ecdf312c02a0f96e8daff5d3c0e2f69f785b2c417bb9ac1178a18ea58fca750d41e977bf2f6327cc113bca6a846fb7dd1719082e52a452ad7796cf613acb02e4f7fd9e437dc2c456368474b81a53d1aa7c9f70f5ef99c2ae707eccd73522e499b5e75c026fd716b353d844a4a205cffbc0b2cdc269878fdf3d6dbe7b1f09a561b2e5bbcf6ad4deada631ccc5f34cda80145f3907212bbd9946aab973ecd8efe053e817500374b7736a40f7b6d66c9ea87556f15e21e6bc8b13c161422db56dad915a4eda49cc484d19a8c6bf3a4d76cfc231a2a1e1a89f5486c3da1196f2f1314933d48f33e4a451de2a98cdc3aa097fa6082ee6f6ce170e66e0e26d3e7ade8c7e83221acffecf61c1c575107742b0c4635c2a6bc743dc64ef058a9f3fd132736c0bdfff847f624b6962824b81e88a202103c2b25cab3f654f7954bfae17b2d8e60e1cc42c31252e2f9b7e951c07ce30816365e81cc707f2c2ba16818db6098ee42ec4de8461ecff34c95d36f65e81a94f80af75ade8935ec11bd57ee297433a21550e957221e7872a8e8117566152378ad627cbae64b76397f34c6b776e2011302dcdefb7b343b51afd034e2b22f1623d9053dcb4aa78c80fbdb967fec5967e35c6f9f299c854c80aef7e91351e6837625b9db29357e8507d2d48f196bb9eef4c5389afb00890c8a3e1ab836961a82845eb44409edd5fccb3eb678a7d4ed9ab31bb5139922e5bdf691bad4698841ebdf560c7cbb727298e9b2778ca4e20a9f4313023be974f907f14e8f7f483b49573247b41a70ad35524deeac5a9551cfc3efb37598e4440854b3f69a195479ebfd8d5454ee86c26d46691665349296ae13c836d7ece8660d1a5c5929c7af63f269e8148fa8553c6b27fe38da500311d808f54a3d04c3dc83f4018b4f70cb8a94b50dc62c88229e844c784fb2ba3ffb6ac0f022caca988207b62e3803898552543e1a20bd01510e1fc82bb4fcf1b6794cad94bbe77eb2751d239ca1dcbd7f0528d2cdeead735451a4e9f10a1f61466021b5cddd87f885eae0ca1bd0e89be616128750cf44511900743f4bdf6fa33b41aad228c797cde430810f69bcfff4d40e5572dace36fbeb6ee9d3313f468c7a8f2273daa29ff2939e373978d41befc544e63755ead1e8cd9b5ea6723a99f6d4f0bf468afadf02771aa39e216cfcbe05ad7b9d763b7ce8f0b1ca74babdd7f115fddefe03d64d39282b4d98d294d0e67a37b058389b51351a91d4c090772e62bf0d2765357a7bd2f3dddacddc2c638a204f20cb9c9f811e0db1c2bb4160ed7958c983909dab21c011e896f250d682d18c462435fc5b9bf94b1cd44853f0ac34d8ab01f67850884d4a2173ea3bc4772a8fcfafaae6635eef0d43b79a8baa06e2641500398aab8949629310c9c4ed4faba16a88d6ca95a471dd4d47874df31d5cc146344d970fec86901e63f8e10bc38eb4b454a4fd50b687e486ad3f9cd26642af019f3db3dc118570df58d67f1196f7263fa4b73cfacf528876e325e72737ef4f57fe2bb5c8dc9f7943ab736ec68460ede1ba290a4ea4b309b600794c6263f970ab8d947ad49efe5b17e3747c72905a705f58980a743e00c85ee42166fa3a37fae38d4afa3c7c5c47f5809d9009a69962f1e2c9fa75b8b6037f791e080caeb4d2adf91c251fff561b9342c357b6a2f8fbeb32c11d697778f354fce7f5af9f1590af78eeea3310c9bb7cad8b9abb5f6cf1f5145654cbcbe0581c3e651bade0074d4191428dba1a2713dfe3426a8c426714ef6723609a59471e96a8ef0fb5ae8a4f948314da6168db88a800fb7f23201e7c7a0f3fe4185a03a2e11ea198479c32b4ffe841dbe51b110e49a852d879aaf49786cb984ee8bc7820e8a3ef269f3079bfd4030a75d0c3826a3d202d7e7d42fd10d3c2b45e8580038910cb71cd73a7cec5bf2ff6891865f13149a24520a905bb70def5586b9649ba090de5dc0a6f66b77bf5911ab8b80edb89f34dafc004d321a98631f1329d722c2255cfa533a6daf926510568200be69b6f51a2f12e3208d72b61e4991e51ed0e79d328e710e4dd029bc881f1055cd449994ef7e227335b0c4c268cabf9d17a824e9c78b5719a4c273e48e38be4b43426b67cd2d87c80a248afdda7a41fa80e68d825b817ace3c08126d5bbcad080355eadc7e419fd6b275903c0ab2e34339205264b196eee440621042f2eed99c95406894b68bd58e214f5de541acb023d20dadedd8a0e83250737a2159a0a23b5021a8fe23ba99d80222c1e689940c46050fbbed8f0ad69c0b5b0548824ab97d81b5daaac31cd22097188debd97c3dbfb91cf33ba0ec6aa0101238b462699f3725ee7ea46c0d8b09e8630ad5be55a4fb4e1061ac4610519f942f14e5fbee506165e0b58f8e26ce03394f3f3460b867457dc0c3d3d470c6269dd08aea301ec07866df174c75cf9f97f0c30b813c777f4e0960acf43eae22064246b6ad387308067b67afe0f669cba5c6689d8ebfb5129584b77ef889564773b13295cf781ca5dfa4c5f2d114db2d64d021a13d7d5125a3351a68090128f423323aa66175e2ff8be72e417e9c1cd0f3b5329b12c47df458d0e10b594b0b88e7e4dbcc6b3316a8b9d3f41a06c3338c6bb8d4592cd4d0fb9921273c64860039dc16d7f5b4a6a163223b99302f4f4ad16c5bed6662efa412462d291ca4a8fd3046a24416da9f49fd5172c9270b283d0f7802138087d999505153fba2cc42fda9bce1509cdf96b168d145a447b83e2bd13c97125451639ae580d8d4299708642fdfe6c11864f63daae9d0cab717e08468b6cb6012f72a251293775138a8c3e3bdc70a2445058a75cc801b81fb15319847d3fed917750c6e97de9f825838f7a704d4c487eb3fca6bc46f715d504696675d74d44c3b85404f0bbbfc07bcb7f02c2e07290e12e11ea4979cc874cb4c14f429cd1894d754e483f6afd40e2bc314bc77ddd81152f1de04a94ee4bcdccca2892849ad2674fc988cae657fe90764d632ef3c6b8ce1f6f795a920601e41501f97b4849fbd9bb00a9a296038583f145e60b4dcf3b659e37338e38c7df2701326e4c490ce02be0fa7bfa618cb80d04af40ebbc3f5a9746721308d42b10e8999820377aa50e7c962e0ca1c06f591ec44b30733a3816949d440d2e9d28f1fe14794f7558249420924ea08a0810f6cbd5a26452858d6fa80d4c97c29926e30257be9168860e5ba62a93215c0262674a070d54e296c7c7f05e22101460515e933c89c4d99caca7521cb07929341e2a4832e31a0122e9efe8a04cc038ce0dc9de0fb345ea7978b685ff21efa8c6f0ac18f5c67f20639864d405547197b046399b1166e2d8f7dc78335f28e58a4e045d2128b00bce9041001c95897eb1b4ce70dbae2dd74479e071979258a834d2176b3859f3a14b954841bccc1c016acdb1a2785253b777a938ca725218024eb428d2b7d4cf18299561ecada4fc4f3957d377b606914b95197102fa94ea9b53fd6eea90940a92f25bf5887a33378e5e935eafcada1ab832dc14b30e8da01592d68caf864cf06e3c13f26afad5e731f789a13c5e1b566df84c9d3eefd7ac67c4f17267e30054b4bca011c2da5ea95c8bab2749a561cf64b88eccd85d3f21f68cfa9945eaa7e6d649231a48593bb28cb5e4bcde79db1df4c246d9a72641034354e926a650ab9b353a9a3b58c89f0a398722250c8224e3fe865a2889fae2f2a8c9082611b44078e3366451176cc999a241e11d48631fa13d00c762e8a4b5a8b5d0e0d2c6808137ce109d3abdae87815c60d8cd04d414f177efbbf46bc7b1df02d7af8e1b5e4e084cffac6c17acdafef39a9284b147c02494c00870a2892c6b4bfcce02297732ec6a98bf3d36208a30adda3930f529a6c7ff2c50596ce7336747206ce57b826f254d77b3cb6e2ab57827a17082feba258ba306033e80b409530cef3eb0f5c68c9c959beafb7440a8516ecae0c1b16c0354dfc618454666b55611e1eb2d63e9b8a535a919ca23787d4a7335d91cace77b4a2f4b23f79e470c75e053c955f56dac5c1cf3d2565cc21d396346cc72f4beceb28d4f43e72ac9c651f9b83b308d025a2180f7acc0579592ebc1de853e9769d235a6d26fcfdf07ef366bcca2e8f6a6ddcbaeb47f7db2c521f0b0e318f0e5659dffb172dc2f0e2c0f13fbbc06b7cbb3ec625ec933ef9d54860b8839c92949cf26369238880b51a2fd11786f82075acc93de1842721a841129fde503432f0217f9c7005b53a5818077135679e80133f936d88742e1e16987063b631a44dbb13e1845d72222ca59193ac38a622b2a59ee8250ea2ce83a7f21cc7f979407d5072c61ca93499f2170decab63edb5e7eb387fab79790d648809db3bef891856adcf120e3e3836a2678ce940414cb942dec3bb43926e696aecef3d53ddbc1836b93f5414623728c50b8bfa7ac7dc9d6a21c1543afaeae95acf49be8540d42937983e579188e1025b87a40af4ef4227f1402fa7143f08e757ca6a4070f7bbb1bc3ded971d9589a2e6a7f7df5dfc10ec91efe77a6dfe898b87974dff839b348d3f34c3905c30c9f095f1179a0998e11871d3d224e65ebda3452217c9a849251dc864acc237794241d23f35d70d83a5acfa9f71781cda5d4f900e07c977acee4069d739e0348b9f5d69fd461f30855078f8e03adb575578e5bce8855f87fc650eb56b7d5abdbe1eb93eaaf573359b75cda0e94e53c6629c7eb018e6239fb94a6b9133eba1902f431e95e2f6dd76304f09c418560b68012492dbcce88c50ada4c5101f8ecb38d7d3f94590940999bb569adbbdfd9374abdd35194a57cc905d9d760886be933b4c69170096fd6ded354bcd7acc3abeb4aeb1fd3c241d62810f3b21c05645de08102363dc40619d5bd54c3c56d6e9f51aec37d0d16952fb107b99dde3a118f17d73f48798924b9b80c93081379ba20835ca75ba0347751a1fc9ce807850384bf72330e85e4ca49e17e78c20d3122d6bd8325003234c4f99c3636564db1954a63e7654c709700fe5b29a948678641e9264ac4288ca7c6d84c2ce43637c6302986d8d141c94eae01741be8f6ae95d328464a1a7b09e589bf8b6edd86965e971ed4fb6b5517613df1420fcf9a7824bf05785fb3598495601ebc4f38786f0b957bdfc2caa44acbe64d30a825da55ac9c5f4dda5837568d39ce4999a924e9a00a50e5759a46598e8c586024116d4dfcaddfa1481f26b7a7024be93f87506bd6ed61a2fc10c2260a3caab0a5601f4a10180ba70b1baf43a497b7af4984ee40f169fa306cd4da8674ec94fb7d25bb91700ce9f291cb66a56b0d481414bdc9804216615cb011877de231722df443de35b0ef89c65fe0c69df4c92676b709920825d10bf361f551a9a0853270e084358ce884c74b7eacde5d4269122487963669678648d1f51f19160f6e686572b5a4e036ddda22f55f6087c0a8745e1e7bdd4d9b5ab61f775170ca2084705e6e4bbba312814c84a5496c4a70db3432be323a8d58130b6b02a2a4cba601b2146c1528c5eff2bb8c8ae56c945827e2c4057453d4f57f27cfc6fb7492f8e98a8fe5b6da88480137dd423a28a924b52415d5da0de5149d4bfed665827c53287e3db9adc085565abb007853a879685d91af2635880c03a854dd706f471a09986f114eb99f73639692d0ef979adbb47883fb4edfc12a1eb92e3c887c3aca481c7a9c1bc17ec6364ccd6d86bc159dfad9b9380c6b753d454413e5fbeb5fe375119ae4980f725c79d184578076287027efa6a72a6839547a6fd1e5ca3f11413bf121a2e2832b7002cdc84d1bf584e1a7b4297c58494faa6bd64f305063ab7b87bacbb7e1a66f9f712f68994695df2611fdb662ed6f439f7ffb8c83e13e7928f726cabae74c03a2e781884a288f9bad844cd5451e022b59699d33e9844bfaac92723712b0d6a12b46964e451aabc127fb91b52e13a725e9d004955f890cd101d55a6013e6d63460b8184219a89202e57a2b103ff88202661122b4d6ff81a3ce78326069f800c1240373daa8572309a46d00fb0de1ba9f1541eb5caaf5d61d0abfd4b2bdf5feaef8dcdf53767f5f66fda7856797c25449f23f27668f958aa7e782d0d1186e67c7dfeddd67219ec29a574dff67b6a83955537fc8051fda24c5eaf615031e7e414c3c5bc6c15a5dce2179e7258c16d382f3e38b9714d01240a8ab23c549833034fedbae18b20f3de2c989cf8c43808acc8ddc52171ef6feb11ef1d9e3de8cdb48ac2715075f32b827fa7da09bb7efb2fe82ad98149ea821c71c16bf66bbb8a36762417f0371b0e47fc006465f4507a96ee81d6658a1a5b394a5f10a301711584b9ca671341808bb44e6579412bf89d3f4740a64b18e30873d0508efe8d249d8320f29e9bce0bc70b48df5ee2acd4eb1fda4671896c93655326c021e9c48f70d9848207e1a43c870aa0e5d8cca0a3222c3f8ce69d1fe3c448da2c044da311f1bd6ac0db6d857baaaca16922924c76760b61dc26ce97faad813945669f77e134b05db2c28385e5afd8a693f82e4dc16e8d251f9c64a39d57f8154cd10056d7f669d90fd33a44b5e23f948a4cd17a980a1f679158eb17d68be7123c6e707deae747fb7df585f6ec6aaca780cebc2d012fd2f8b64ebabd6ca50c2dbf53c26231c0b72a9bf674d589b7a4ce703b6cfb65c5c925faa4ddaf4e83cdd1a31399f5efdff287da35a3c6bf501b0074b06797e5a026119c0f8066cc26fc6e37d67447199923a3b4bf9e3b1d8803b9b3f7c7419dcd93b39593703c1948140a974625dd2d48b1e707277cd89e721a313f1bfe70ec607cbdd6fbee846fe996b1bcd899b4d0cc5a64612c05de8801ca6eba7567888787b982c45249660f425afa807477905f855cbf4ada20aabfe32e515f7d42753515a20993523006c2e4cfe07978497082b406133376ee3136f17d2c51df809237bab6dcda43bf298e9caa2213f57755889ff366498f8d001d869f5ea5fe9b785a0b98ef5d2b99bb39f3c009030f294e67e2650f60d80c8b0d5edebb410f81269d71c00808c0138897f1b47197b64eb80a3afae0153f5784c1eed78d15dcec1481265c97c15a0a9979408a0c11a017ce2886156b7c85fce4a6885e52517a7ddbaa00c157058cb65dc54cd82c16b037a433bd15b6b9db58644637ab2384cb6a0bd560cd13c83aa8d7a652ed7444a3fbcbc0e3f82e0ba567aecc5761eeb7e6c36c80ea36f9442526eb9bfe4fc2a070c44c379df3135233a7349e55eb4a6a315aa4eb9257972b2f3ce327536a0862ced5ad64c42b90dc2b883f4346555764020c3ed3a4d82fd886e0eb1b84374d913d70e48b11ac5e492b9f272b36451d6a439a5bdf95c3bc6c68998a3be6772b7fae3b2e03005127b1738ade6d40b8df4f48059904bba92a00ea38674a04cd0fd00e81d5b00fde124bee0f8d92ba555a55a2b873491287ad45eae51ab166244e3ea991b3989f98f475e5cbd22fc045de39b98f77bda523155ddbc80228eb18c6a7e8583e968fd9e98cd8131bf84ad3a33f523070da76cfa2eb244c229ef79f85fae68b080b485fa012d84deced39b55e8a0c62757abca4a10ab68fb99f8132fe19d5f8be3403b79d6d4619e3509e759839eda842479c3d8a38806f4a55f10a03a89372b9578c49d7aba5612ca6333d3ea1e0d2f59490248ce7c5dcc5473384b6d66b647518564fdd26e4b07e7d88d6d43a0c4348ff2128c267bef7aa728fe83138064a005edc85ef40208b66b0a1932f371086855b59cc0913944f2c1019beb6ded8be0bb29ef17dcec85fe26398569982a36fabfc9b29083ef85e95f8a8f1fc3aba42cd7e983d841ded7d00770af4c3ad29decca04b355ab15c456d785fc80b56b621ade44368a3cafc989578c0c672cf90577e4d8e953af40fa46abebf130f69b9c8eb811d407b5a37668b78c4f54d0f405a0d31b370187c32dc22723cbd663c7ed90c6cd2d365d35356b4dc5c7e79013c9483ba2730e79e77653b39dd7e5db8f4042a270daf7410a1a7f8e15d30e1c3baadecfd655fbbde20f5af90ee94346e4657e6157e1166740acc6da7eacdac1aacdf8cb78d3429469087cbd036f863aa156b5ce4feb7ef0d25dd7f8779633a7ff803ab2d0f375f1720746062bb72802c9aab8c3615779e06c4cade60231e0fafd92712ed027f7d9fc07abb24b8912f6e41fb99c354eb2eeba293f8d14768cd6e10e784abf9341ee6afa89990861df54264fbfcc4e8383187062e88d0ea30dfb1add0a8a8e95118a5a9cda1014e912498e017d4fb6e57abaa500fa75a610aa9bb3405477e81f866db6e3c04b7c2a97a13fcd95a21b111685557e70c2fdc095dd7ed540036b6b5ef40e4175a154e95cf2cc14876aa071a681e8319920a7a05107524f28d9c7f56e01329d270607cf4fe1487c32d86c9d2b531c285a9cc08fe94000b20f2a01ad535688d81b1234a1e79d925724a0b702b0a812f667d8c87e08003188361ead9c1895a140562d602d4a05848c60526cf88d5a6fe1081ab8b5a0132a496b45cfdfecdf44628b4584748465fd151e0a8b9599f935f729dea0b32fec20a4a1aa8e256ccac580520fe7579421ada85f6f32493299c80a453507839ee7ce6e14248ce12398af6081d57d1867ac3105c5d03f08757e8ecbf5acf3a5564baeeb9a4893a23d03207a559fb15ef4f7535d1072a6c64298c2e0a6cc07aba935c72a29bf8fb71cb7e7aa0199bb8408ca1569b08eab1f9ed85f1e616e36a4943286b636795ad720933a38dab3942c54813af707881c67d0e7859526d55857230ca708773298e5b63b04af93302630fc199c7294e7bc15736a08a8636b2da13990dc6e36657a0f1027ce3175aea4c7f9cb819ae8a596a8de03e3941707396bf53f6ded2245c2718ce684c874e026bc807975a4c359aebf1f8fba6fa7b64bd12c17976b6e3f25095a63a1d7b2ba8327ec94421622cefb7cf035e90290689ab628812cb7442c32773c57686156062db141a3f3b88b4094e72384faf327f60460edf6b1c6c272225b0e1537cb4023c092d19a729d7b60bc1cbd8634b49a66c8939714480b2bb9b2f5ede70c75959914d0742b8a7f15ce517df306026d0329099d46bddca172f5059fefd4f005e4f36640840e148415712cf29a58d93cb3ad727298199e29628d2579fa2e4576176aef7da05393a27808106af4bdc6f10ebb5c95b9b4c549523bd89a4f47c3ea9fbc0b5bcec2ca0b40f8a3eea20eeb3476fc3106ee4ae8924ef4fcc11a24ef92d57624d6a6d88e64b8fc7205c9a3459168c6f2a73c27a238455809c5704ee35330b67b08f5723fc778ae06ec5fc5e739f34b23f88f47784330de6f0489648337f002e7b206446e27853a3f29b96bf603db206ab49a32cfc863dfa277c27c7239efb7f055ea2460f3ada5a2287e0e05123906960477049526e3f53bfdb536cad0186acfa8465d74d4d31f81aaa984cec1f69942c594bfb2265721b5d0e79fa8bba97a54486b514cf65af8213d329a1d8c491935a7912a07fe82ef14e1946ac253a2e537cf19aa0754b70348c4179dcb216f27fe9a4b3397b81171202747e760d9b68bfcea7495731283b8fb0ed0c2324fba509ff70234dfc351ea95044c36be6f32021638eb3b871f20d29053fc93764b69480626eff29f133147ac6842c889aa1f49992db5524d06588eb400517a57cc11f110c515ab3b561345c2583b03f4250fa38e304981ead19a42c9a0f7b89e242dd15202aee55c7aa4684cd17216f98b1ba410475808d784e83eac52454b0f082155be2a88431181fe058ad9be4edddf014705b9e29ee63179ef54702bc7263d1c357b13066a686815f768a2942e5c765402dfa821f6c0c001a3ab32c327e1e3f9cc0f1c15529fbea1db314efdbec583a92ff924955b27e17c80a30f2c13c40051dc19d2c922a78867a44606433c623b1a2f120619bdb1752b8f2884a04752a04be3bab1f55d0d2f82434c98fd76fa7bf5304aa0ba1f29abb9722ea7fc843e26e76988851913194e1ba81970a74a4c88248a31b14dc0b6be71ab799a3a38e9e5426531dc77698a94b1fef82fd60607c234801387df0678201a3ada2437c9f24eb228334f465ef2e394e90af4723f7973d552680fb29f7d8f6bb7a3526e3a3ef1125e7c88146570d99aafef3235ba452a8849dfb03898fd976e7ae18d4a056b810ec2e9f8061f1250e673def1ea198019464259c88451d07ad3e0b05cf4e606bd6db3499a9b62543591e2414c74adef5ee79ff0bcfd144fdf26f83022591b4681c28561ec243888578d291adac2f3b87141547837fadfc3e98eb50e2aff306c982eb240ed18a64c95e3376e8b7807fb26e9388861a962d16a7b532a36e3136a147d1250497137187ea6da7c26d1cd620a02260003c3e91f37b6e990862f7155fe74b8e3d1a393a03cd625e98ea124761e56a32a926dafef13ff8c64790a7e731af4bde73c51270b1a427c5cfadedcf34b3c90a325aa4dc20e72542ae754be8d44dd3cace8bf71acbb79d4632de81e4f896019190839d14cdf5b2dc901d4fd7f5069160e3b5cebec88a6008de6e8c8fcd00338749bc7b23d4edd106e4228f609e544dd2e1c603f51a100d44502c3eab449c350ab87e3b1b2109f9d7863b33a4e0ae52fc3a28dafbc4214588d367124401e3df880b72b94da04b1e64bc9dc15efd3f295f841cc09e0402f432ebca9f96cc78563c7709cf392167c8a4756d7e5bfb7f2f4c110f6f45b55d6efc09703e868a2df39960391b868e23b440b897c1944c7d98e4fcd48ad6e04e515160d3d02489d2205dd7ed068ce367d1b5aa4b30660210e3ae299483048937c7141dce48557f9167cc61a51c3700dc529e4829547f3b61194860ef1802b2c1b577ecad9003ce93fa936b80db0eede296545dbc594441484da0afd3bb8c962fb8ee9d293e435acecf5e250af419254ef81b30b76ee40927c4802320091708d8fd21420dfafb6a76f913d81caa00e42ea18ab3c9354818260d30ded891bf02de8fdd63947158604297d559e0aacc9885bceff45db6c836e603ae2488032bb4e6ad8df112f9b95540d385bb81eb747480c757ab6b397da25c2e0db341126b9dcd5b21890d3c7c17c8bdc10735bb6214a123f92ab67c2475df7f68f9b447e3b0ccf8bc30b4388628c47bfe07073f2d77e39d1d86920174796074a03fa59a194ccbae1baa6929b337b1bca2bcfaaa813418999e4b2fb768655a8000e32a66b00af5a2ae41a403414c3145e31a6e9c736f265031398929f80d2b88f04e6324002fa1662e7ec6a1cb2e1389830febf5db6a2cf75d52349f5f4c3df54178f830e42baa6b08b0af0b92a067859d0b2b472d6e6aee12dffa09d57ed185be52970220e239bb0520848962aca0a1b606bb1bdcc19c102748207af694542baa5c2a73495287aba0a5486961fb6a973e76ea1ca9c8718e3864f1228057868b09993966bba466865f6bd136880374fd7f2a849b3ef983d1dd359986234731b76367ba476b3c50d149451edac9c6c2744d25fb04159f0051981c1ec0a0d5c5f6d1d642e8e2bb67dc1522e8fa4949d4ca3dced1311cffec000839bbff62194051f7871962b74d20ede2cce1cb058418f98d0d9b88716843f7a7e7436f5df943e63e0847f39644a60878dc7eb2b9c62656e3118374021f9f2e18499ca9919d20e2817e0e3c17578d1a099dd749aba3271810020606b4f535d4cab69b1e3d85e3a8adf29f485974d5a51deac0b4fc79cc4c65e2688e4eb275861561ce549dd75980486f8fe78d25c44139fe2e79853c7c0f7ce7ec2154f67a3030a00b54f1b79a4aca673cc585868b3c83f062363a9b55430b5f63c2b5d2a9e0ed7b7abc2a35642db7ec4780542b181df494ccef8fbd479506d7e62f4ecea78133012f969104975eab8b6551bf01189ed2e4a5974cade921c095391f5d85607ec8879bfae071783c897ca6952c778ccceb1b8cfeb36c760a3b1ef24533885e0218fdc3df64041379d8af6a74db7d83965a7f2ac8cac759ba23400027b0a31917ee6d555b4621b9ee5b979786f7932b4f967570988c9de2dca7678987fa2db28be205884f6db26a9d9c4cc96ef9d326404f0862900f4705f52362196ff6e7cdf5a8d9d3bc07f498640a6c523d7732713d1e07da59f4e4d71356318223dc1ff3d4e2fab0d8dc0e8b57cfef703ed5cbb2bfcfbc5d2a626be4c188ea248b5b89cee19cf3420c7afdc6f446fa8be78f5e9ab69ccc8593e73c072d5d8865df11b4633732e04b930ce966698901387450e2d03ae880fadf3a809d11df3bbead6a74ff475181914487bf3b07c14694bbb08100ee7a7c5fa5d0a7925e692ae16e9d2a5d971c2a212804fe05d4b6d4320ec4cd2a7366586809e3d252d80a701f294b02b5b5ccf0af58cbdd8ed20d5d43e12b658b090032dbf4ef48ef6932d382a1594edf2539985d1c59febbefebe06871468b807d66523674bb6c282b32bb1dd4397202834593b63e7d81c5edb46a1fa8520138dc93496a649fa251844ca1a96ca529de9a3927ce03eb9857becf42b4a6af6748ac7df9af261373a1b1e12ab0e9c1f0024de6348696279930cc2c9aa4d06c5c5620bc9e43ed099b0d2ee88c352c849a1d3cec46e71c791f251991b12346c1d38b39fc6c318c4392ca3ac2f6be1f284c0fb0d63c0ba5f836868897b1d8b6c361de789648500a5bcee6f0de32a80b9a6dc0945739b72ee8209bcfdf08f4c40fcbe2c645e25ccf9951ce0951cdad7fa4ce4e8e8ad71fa59c83c13551092086b9b43ed2d2a89714b6f4b03ae90556f35548b5b9a683302c5298bba874dca7e5b1678ee9817e4ac6b9298a09a2b6e1eebea1948c576a38973675497650a82304c3985597ed11692ce2711653e1219dec6804a34878bd09ca2d0109923e00154af9eae1364b0a394a38535d11562dcd81bfb8199097e2afafc958f1cb17bff8ef6b63822e77c65d5b63070e035cd49d40a965456b77759b50e6a7bf1c398d3088b68b9723e2c86d5ba667485fb3f6e15f5d49e1057dc8304f8b0b9b25ac291259f890dbf568544de159b9bdfd52e6790283679f49646bfe4b6d8c1d7e9fad4ba699e3e207394c039aaa54930c2793e814c5185308c6a0b1614d1ffd8769a996a23783961e5cdd9bfcb435b226b2c494dabedd1e138aa69df5c059596477c5e4b6a54849dae5e49a9e5719fb7959896947d38cf41a5e5c41ebd14842abb50b271114c15242f6dd1285b8b768a1a58854c8b7178df693956f23967a8c1b8ab04a5bccb436194c4e45f11e995fb63f54f74088d08bcf3feabeeb9e851fe35b22f1384bc2cf7d6421c56fdb0eb8adc78dabf088fccb403cd3764e10b6c049aa23b99888a7e0b4068b41f2f72e89cb496fc60f6f6150117c3960ef5920c680bc1ab05243e6bcc2d58125c62d712c4767823e189e930109700ca4ea9fd0e8877d2b2f4b544d443a1a249cd5c4e895761c056dc1ce53508366f646522b4d870cdd7d46ee4e5505dd1fdc040b9b6cc3ef4f5fd62fd19f22e43bffb4ef9c82b62421cdf9dc848047fd4093313078cf1a5098831aadade0f6e0c64d9edd32285c8d945125cc24eb44e8529c74053ae81ae887cc1e7291ee3efd7a0f9a4a2df0942348887088f56d2248e42dcdec2807215128df8aa9fb731cce2798a465d0ea432590d34f066c83336180fb9abcc2526a30f41cecc60509a3a0e2ffc7d31109d8975bc7c08259f9a585231def61305e4209dd868fd7d5d25fe906970f8e80de85e6f0855a218344457270bd5ce412e31e6267def85a42a41887ca1514e032e3f50d266bc50275357966295d5945b0d0d5f541a4f65fede598d8b18f465dee2dd592673937e6b9cd09976cc9621076438e9bcf7724773cd181c5a52b348a1b0fa209fa8d577a1e5afcb7d3d48d149f99daf53f040f91b42a2047bc3e69d8f1183e2495b4d91666bfc5cb7ff14e7c778033ba027d61e35042f942d982099796c8ba28116168107748f988f54843f91a91387260d9ed844d870bc52f15c434d16114a6b0cf0837f376c55127904abc47e50aa9dfb936a69a94e325cebb5337a89e2a57fea8ec431f0841279153f50664e2c781e30ce88e05cb735f39f1604d2b112c3f03387002b682c30a064dd27dd48bb572a3156b5d953972e2231edba5cb623249bbb4735a61811b825bc2d8462ae841006cff8b2299d36d16427c89f5afbe8e09ef04b82b4f313b14e2e9a8ec7cc31ba68890a94cef2aed005550f07a48075b1fbcb3ef67c9a67af0b1b88fe49ddcc480a04f31f62b30a4ecf41d5a520059f6b805396b74a4f31baa25cb2f72e95936e46013286f9637c4a2adda682954146e8c5f52ab9552d28bd8f3eeb6c45f274c5593f002d1efc8130b72d484a3dafe870866f476fe89a3178c88c7e2960c16083546b9c3bcb0073b02fdaa565378d1b21d65a76d837e6bdddeec6cf9c0b3296eae82f0a0b18b04edf4dacec1ac79b5ca432dfa05b7e27a1a26b6638f5119cb394c34268cd27db5a9e7747b462a5fc293789a178a08d8960a8927db5ab7394928dba9ec6f290269ad161615629840cbacf005bcb606a56c5a2f7945b2c72e1abe5eefc487732c91908ec67a2fb68fe6d6381dba5ebd03aea9f5f83b070439038047f041aa7a7bd5b2052b2da1c96cf20bade6378cfae106d42cb94593a15ddf45fd34cd09cf7789d02fd35ae933457d24cb0f1495dd5d2bb0a06e801502148211ea6942ad760e514f2a8a6f83d025ee8d1c9c9188d58d5566d32ddddddddbd654a5206880b610bf60b3ffcfa8a180890558c0c8e4a916ad0aa3c593132d7899ef7615830304131356855aaca93c5656b47fdeb0aa87fe9f8b2e586a1b8f270e451d5a097ead92575bdf592f21ac5e9e5e57aa5710e9884943011dfa75396866035c6fe92bad7a976b5b0a380e406096df7de8b225fbc866cf5a8f119aff11917c2afd6759fbf65caf9fef586cdf875935f2bbf8e835f2a87f1eb94f21752e40932b8a91f250c6cb28e17ff527e5dae4bfd14d9d281f2ebb73c5b3b0e70c619673c8cb7745c4f79aa3c4d1894fbfc756a56797ae579cbbb44de1a7995d8e4cb04c5e541db27c67a312e8db778d0d4d88cb7225063335e6333a5e93468bce5214c8d4d5662932b151a64add184837bde5a8dead41e443f653e14fdbc1f8635e83a05e59871aedd2269c8181a3653bef0796b90ec767ed620ce2786a23f9267756276d02387d41ad2a74b228af29d4ba0d680eaf4771d9581124fdf4d8ebe775808bf28107ed1d88c734e9bb438ae4543eef0507bce6fdb56b674b4f360b30605a58264b866a9b3dc936e5d2f5104d5b195c2505e82a1d75a8001dc541327f5f5fb5abf52ce65a0ecd5b93c0ff075b473cbdc7ebecc6c44f46623da88daf3ee25026b5c112dda3dcd5fe2b25736d97c364d17bd61666f4aab5ccbc985552084a82e8fc1b74731f45d9b7ca53a1ca8e48b95dbcead215c4ee8052a2f50c0fbce999e81deb4b7571abebd5939b40fdfdd3ea443c8220a48a89bd42f755607b88de300e0848516cf71ed86a3755536383b3729a0dbe6ecba11e2d2a77e9382cbae83fbd68eea9b6f5da95dc16e6500aab0afa753ae007afbc4adf12ace0e0b38391c94f650c5c43d1908a8614782902861f2ed3dc2d8e0b676549b90fb3c64d8d32956043d9338707ecab82a21dcae9dd6f4edb4db9fcc9b1baef91d96455d57dbf3eeadfc799669cf32a02796393d3539310dd188908e966aadd5f34a7ebef57c27437f43b6ef2a536daa57da5e55a5ae24f7ac4dd4ca9a84de5e816a7b6d6abbb1f885124942d7cd0eb73e3b61b3cd157e388207673839a3092dd617b062840a7e40c40e643011eb6e0f85869cda133d926b035193c964330c293939ab51d77e6423cd064bfeac4267655267b69afc6a76f2eddd4dcc1ad45e85aaac0285cc1e7374ab6cd6715c2811bf241076c1606463c93dab118abc2e9ed128363122d246f58836ab6f7bdea8232c37af230c6c6e0e24478e6ea10523aa65a35a8e644344fc6217baaccac4097fdbb6b515775cecda99f316f8e593835f3e39d8a43fa44948cdb0a4cc532b2a890b03901f3e727658e0ca93d66c36ce87639028dc3ca4483eec33860f32c43e3b75df461edeb6a6b6395286fa9c37b9c382f78538be3a772187f31cc7b1f7772b3499011c8fe339e7cab3d6fa793d7bbc101cef79fe3948da53088e1e9cb3c02fca029b1fb9e383f37ac673258f1a441fbd0c224375fa21f59b84407451149d236d797ae4e923fb6a9d8eb56d6d22b20debc8655522bbb61ed93cef471e67733beb91cdeb11d1057f2b96945d95acdcc873840b7ffc882186115270cfaa7456a0edac4075a932e12849fcfabc6387722bd26fb687c92aab53f4f0f39dc7c02f9f18d8dcb6f007bf7c7e738e52f9c1e65681f895636b72ab127ef19092dfbce70586d1981086d55847654b0d9afeac32988d6dce420bdbc604b383905ac00855833431426bb1a2b33ee85ef7d764578ee4f7f94ef7475a6b81bcc02658fe6093d25e72bb3c99099b9593965cdfe4a3fca6be1d45ba90230980da3dab937360e94284b058e5e7f5eceb52356c7eee954ca5642536dbcf9e356c27cb10bbe8ef642162933e0f36dba9123dfbca4f33e5c82e1167a9f0cbd2dea341ba99915d82ea845ec3d03bf214cbb0b4a00bd67a48d20fb2e148fe1475a844c990d216a3efbcbb989db6d605125ac301966aa97c15fa76af5685c80a59246c56df8282c0d0a35ed72e65dc5ab34aecaa0e8029b72672fd36c8f6119b55885f1fd5a902ba08ce9aa9419fe95c9b8cde4abdc42faf6163399bcd6666dc2096099b7588cd66fa28f7b44a94a46270698d8ba6b7355bb335281e15a5eb198d3a5cdf54d8aced61931bb0b5affcb0597368b8a725faea413e1f52bf63a5af41da3baf9ea54275b800491950efa07be4c995676995b8d0797b48ebd1a54a5b987ce74ddf5a256cd6263d40340b9ba9d2f7c8b64cec907f931be03f9ba94a5ba9305b6b57f5ea6787e183af4e6b0ba10abda935cc16415dd56b4f2cd3d7daf4d5c5d112d19bea0040baedf44fab447ca2d32a2dd9a7666a9d3d6b75b9c3fcf63e62627ff8057af51ac65e50577531bc316e19acae81e9abb751cf9aca69f367cf584937cad950be2af16ba9be8df2d59b885f2733792795c626947ac466ad3d5057f5cfebd415e14f4eaa4efcaaff535cfb953bccff9c69df9e2387e7791e4d81cd1c5c5ccfadf78352da44a953d32eda019074db3df74617baddf3960ecec12f5be0d70ed31e7c0adf40f0e8195feb08be6a80baaa77a50f36bb1437aedbf675be8d3c31b02906d19b0af3d515e079df6e6f97e790ce6cff4aea2db410a4a5e3f3ce3fa7df9567477e6402d8a4ce12e29e94f6955d990403bf8474ef81feb3bebff003c8f79bd7339e370f83d8ac5fca864dd143ef19bf5aa09f35c86887f9a0836545c2e613aa539fe82391ec41f2609332937a4275ce6b5057af50a80ee89e772b57af7a4eed79f732a92ad42091997cf5cfcfebe23c5c44fe2b7b7c62238f3cd6690da3f7f8c4c69352f19fd329ff3998f45f79facc3e8807fa9b846074facd632c47ffc8cf4520ebd8bd1a7c64b4a120a01f1a6690c56cf089754f7cddc8175ed86422e3b821a4b53287e06604d4e6ec8696983c7e72a279debd2c96bb4984c35fd75aab8f91b541ff6db67e6ec9cf435204f2ac2f42255f368e0a9b3c2a4025827e83c3e56afd6c18866158b7da9f3eb3efadcc4090cfbb262c6cde005dae894d2a9efecd086eadb5d62ecf1ecb35bb58e7b823aa63b7926be268fce2d8c64f960d18d24ffe95538689f1d59517dcb343d229e990f0ebec823e885f4c63936b7e2b4ffb9bad7fc32dc9ba515236dddddd92324ebdec80d8b457a88ef59243c226dbd4ae334e96277f4c9df118afe30af66dc91d29ba27bdc2b42b47b8267e91cece61e19793340634507a27e98b2479491245922e24395acb529ead25c994bbb50be0a6e8210ca6b725a566599eb4e645ed37df61d27fa76d13bf9c5f9b8fe0cc62dd4b53e3341eabe5274bb144f4868788f82582b3f31097e5e9d170b23caf2d4f9675cfbb97c572374d9c1a39357c2313c002f378b9230249bf0679d2a8544e1bf696259a21375059e4694f9b982be2afc80dd43fb923fb27777474dafcc91dd9119cad8396c2527a04fe274b01c953fc48ce1b06219c44af40e1d710aa539180087ab63126830e81daf05c7778763a1465c6e4cf7a34a5064922a50287d99facee6ec886656ca8b214fa87ce7e107fe6340a3a057c9acf38cf5e6ce183a7225690258929621e2002081b2425391923089f1da0347194056d09299e62375bd0e0450d7810c41065c44eea54031e9e9fd97dc704536a90826796fd654171cda7536a5fd494b828c23086426213a48128e070cf0dbcac076c31cf27c69134b6913e313a823410044110044154cd6e514385c4665d7a982c278cd3338ab625714f70081ca20184a2a15047edaab6568ba235cc6bd751c3b618db7a595e55360baa061e358c4675a85747a1923c1085e480aef4fb731bf24023366fed3112dbbcca79c7384a6e442438dbca6d48e82948fb0ad2c023f008a48147e01178041ea16a2fd83ade8456a84c29a51d94e487e64890c8015b6c136a57f52797fab9b14865a8673033d39bba79d003b6d836446faa6f496a0ca1c64039a99a6638176b42936b4293bb09b1c9358466827a26e88a3582c411e54dc699a03bd343aace04d5ae3340ed7299e9817a57c5724bdb9a50d7767a295aa3872641de933f678090109a0102955415667a386780c014a882d8645509923cfbe7cdfca09cf8b50df118f4b5216167aa0aa0125009e9bd59bb59fb801a73295541aa12a892a89a9e7de667e6069410ea04a8252827d5912b93c9680820974f5e24b02d8edbbabb9bdb6c77b7b5d65a6fdbdddd5b3a8917d0dd6c49636666666666de6c3333777777495ab9373f785ebf006156ddc6966b529dfbd55d54a772486faa73a55c0c359d920593af4e2bad51ae35b522213a4e8e9bdd4c5718e9544b2e9d4265cb532a589e4eb981122e9e4ed9e2e85dc62d889e4ed94228cad32937507aa631d320880ba6cd6e6c14c42434139b206125ef19b1ac0d9bed9b7b54383515a56ea646b5ccd99fe2c948deec1fcf5e6d949fcb484cfbe1569b02bd691c276ef54aba3893433615d355f9aaab418fe46b189e5c6be521f53350871ef44a1a61fa0cd0da83e5e93373d14f9fd98ba7e82bb2555564abfaca7d62436c36934ab61ca0f295f750f5c4b8cab7a31268b80c855f78b8ddce4330dece44ec845fd7db99dad5cefa1559b4c91e76c53d59c69da919be967589cdae9155a95261b37d169695c9534c3d562e5365c81e195f7909605c7e01e2d619e875d6e50dbb9976e694ddea04c9b32a7d3b8f3bbed9a398c651d86c7721b9a7580aa1b5ee236b5d4d71abafb2b8d5575ddceaab226ee5380c9730ad2ccf5bfeb0ec65881715dc23fef32bfe2b2b906ac93debcf77653247cda93f9b8ed60e9bedf55b3bea730276180524345bc2911a6f48e710eeadb38cc678b4abbd5b5cc9426c090526242689f488f0e43eedf866dfecaa92c64d546ec91e86a9bc9d888aa4ec0a372319cc9c58c63206fa0103ff7c2d601993519d757b6bc96a0b0d4663ed5c63166d6cb94ce397eadb1989ea80df1e32cd5a189d8113925263e1179d828359338d97f84af7d3b75b7e750b48b7738d9798c6482d6b589dc956a8f1b58c32e445666211d625f74aad9603a3a7e510fe0eb0fe242293c97e080b8590da9cedfae252af074a19c8a4ae2601a84968122ed5d99e47c824b5f1e1b6330bcd3d58af8b788a380f818018764316c4affa748a2d646f9d9e0ce52d3b79cb333ef2ba8d870f7e9dcd82f516b82e2ca5526b13d5d9dc6e3c9c371093b727bcf58d748571b9a0bea1b3f7349086b1f5d17bda413f7388346c2c7bd8a688eb2c0c519d25145691a8cb7a116f2b126f2912756d6c9f9afc51bb9888818090745018e3405dd66b358af47da914456a261c300ef4268a256f8348f9f0d6cfcf02d11beb30532e1814563f8ea4d46e5ce9e64202bdb1fec53d4978eb8c03a53ab42b4fefbba9ad9ce9d92825a43627fdfa072034d73909e8eeeeeee65ea70cb5dd325dfd25746b758971ab6d39b9a96fb721157338f498e7ecd511973d87a3bd5ae25667176ad86c56f5b07a51bc50957471509ddab09e76b1ecca1a36ab75d17b50dece436e9d8748221e3f5df614f568b7ceead26bd7d65e4474ebdd0e76d0d9c112eca16591d1dbbbd2d9acd75dfcf44c562a75bd08ca5329bf39f7deebb734e2a35d658e79737e0797c6dafae61cd430b18e3c3c7e9a7e730b5463d66d59848858026997e84040ed12a3d57504da6d59a4a8878b5b2f82f2b61e015bc4c5adb5a5cc96468a54a2766dde3eba5856a1d859817e1b4b9307505d74eb6715fa422ceb513d6ad7b6f98b71c4e3c706d1addb307a8b6e3d02a33707356c2c2b52bb841a26963cd43097b22eb56bf3a0df1ce68acbf9e6b569eb6ad36f5dd7f57ce81df97ddef93ce7213984ffeb389e8146782a2a2efbea887b7a9c9bfce2dcc5a35424771a245b3b3a48e89eb7d3a7a30b4140df9c2b5d2c83781e7ab78774b441a887e48ecec1d68ecebb7e47da901b39844ffb38e80df51a720711521b92aabeba539df02b0a5f5d5f5f3f5cfa02844b3de46a83c91340937a26042b876dae535009faeaa20f1dd56127bbb8d477f825745fb65cea48869e43f1b8a8be7e185a1cae8e9affdc8774ce2d137ed570ce2d5137b34642ed6a9809ce99ceb14af0d3fc9c3f9be9f39605b9962d57e0ffbc9918566733994c360316ce5b4b3f716e65f687bbcfb9bd62cb736e83f8b53de75688615b8c033f3ee217c79d15cb73fe3a1be991a07c2c4852622a9c27a280c4e33ef0f3d1c1f2fc56f8dc9bf1afdb7e66b433dd4c49d9e4dcbb34425a54cf7937519d7ecf1359f4d004929ddac57909a48bec29ea31829b658f0d1fa1e49e119c76c358ac1a6403b1c9b90db283dac5f908244d79f2781a2fdb9bd5350d03dd1b66e3a0109cef9c2cfb874d2eecc83ec226e73846b7e3808e903dd4ae7635d3c72acfebe5c902bd74cec3ae24dddd4ffbee241904f4b2ebc052756d988286be1ab3b0670d6b2476712e829f1e8dd9ac61f5a99b81b3cfebd391b2913eef1cf46e6a1bef69b953cea6ec6979d9c4e53466e336ea13cbd8ec5ca40ff207d902fd86d31809640b2c5b0eb071123c0236fc4659e486db7012ca22453d6eb80d2fd253d4830497dd288d987ec349287b8a7ad8b88db2a7e8465924a75d9cdf709b92d52ece632830dd6e7ad9e17e1ee367338dc032ddc66df8697e6153726ea364418c1be557c4f28f2c491a5208ce7f8e33c6fd9cfed93f23bc93f4c920211b248d31147e45e1d78c73ce48fcf2dc9d73aeb112d50199d63f0cf3629cf7117e513e7a3ea23a0aa00fd2074936a2379cefb00e3ae72109d6380de9347e5ab2860c621df490244b5bba0f613306e7fc26886bc36ff84cc94c98899d9ef3d113a1ac519eded328af052dc833266293731b654f510f1b96c26edcb8e124b80d079dd2d7e7a0d7910754bd259ba9996e92dc1825ee599fea13d551397723747b030aa0bf63c641d21ea1379cb793536371ce5b4b6b08bffd569019ff3cb446b73e8daf9a7cc6bf7287c11a1fcb8fb43c32c073fb05f9661c245b35344e4706783e5353b6538b6c1ab2b16ce1d7d9432fe3d7d9b319b2b5b0c979335920fb638f501dfaab95878dd4b0fac42ece3da486f111bb38ff1ce9395751719d39ca475f795e18a4cb79cf8e869a88ebb88355b6787437b1c93114366b97692f39dc7619b7b141471e3f3614295200e5dc862245607936b151da701b364e6395a85ddc0d526664042f5281dac5b90d27c16ff85989482869737ea3ac4847a6238d50167d7ec36dfca44f5fdc286dca2ad4aee69c9d9e989a9c95f873ce43fc62c22fafac4e6c12b1ca8ae5c5396723aab36d621d75a43ca4a3b564fb0f947f248cb796215c7da765848e984ed59fcdb402c39043b66fb9bc902914d972f1fa2e013072e2d7e79c57272f4f2244be72487feb73fa4c2b5b9fdbd657f2114361937301f01043030d091fe0e0890461d01b60f144182c38030752a8542a6c72ee21d9da71c2f05f59b1d0b12e7d7ed6a5e7be9291d8e49c3b6a17e73b1c002d7c5499ea15a6e7bc9d38ef27ce9b89f36e82f97c68b00933842d1eed2c7bcf7a8b964d36afb1160f6b6bacdb6bac4b56bbaa77ceb55b4a8b5293c85a63b3b6ab76248d714b94b64375ea0c9f84e543aa5217f5ef4ba5e80db5248ecc0c1292315b26c25613b03462976245ec3e5fcbd68e209e531f9fa71f843fffca20adaefced3fffca0054f1381ee9362c1e5ceae213b7d54e5597c91a36ab3b4ef59cea6ed2ba8acc5b21a5abe30eea8129f7481c6ca6b075dbe6512daf7ea6536e0045e8d937af5b7a7ea5c0a68f1888fc00d2755d1713e59e39393f1ad6436d504315403123621037688ac1f4b498881981598ac194459dff00427550cf2e4487e82ece9129f7c8b39ed585143a679df7b91fedc2c1660a526ee7278ece51a5cb4b99c2cb967be68c3a52de2d1d5d47b674b447cf38e33def0ef09eef70d7f97cce76cb46952ee5c9fa416f38357ae8dc5949914dd0457208c9aa11e2e2e097e7ec383cde904d84dad2e1f9e69e6f658b73af6c39fd189a9d48b3ff00e20d855b043d3b4ed1ed5e60170f865a0b2daf28cf6cf47c5469b6eb534ac6af93369d140b0c31f0eb2775c46b588db3dfa786d198cf09b24801c58a124c641102d582c5097a800311586e880286283df5072994a400c57a8cb8a424012236e34604e0c48a306234ce3d2d319062465a3c88f5d094407800ec33a5101e003bbbe7f1dc4beaf07cf4ce1b5dd81c0636f9522c41b59b3d77a764d7e9092df7895f748a164e9efd6e614f054f68b05d791283aefb38daf8825b1bd52e4eadb5d68ed613bbb71a726047d6cf63791fab03adb52ccb514a291547b15d588ca21d67adb5a5adb7e3ba6d7777776b8bcca6b6eb82fd5afaa0375c370e65b9ce65c987677e29910bef136dfb58f2c1e4c37ee197aa94c9090cc5facd78ae5f22c0532729cc870fda5bdbadad387aa34b67b7b65bbba038bbb5dd7a4ba57ca4522f3935364f5dac4b3e2ce50da77170967c6c4bbdb4f4928261cf4f93e23c5dba386eb78649a958a0b5f6937c3af3a9afa4b0eb951080a73a4faf8f259c5f1a57d85c36f0e15df796522bea3181a48f762df9b09732f960d3fae0175da55ce8920faa4365344358ff90551ba8f4863da7edb66d9b8dfd21fc944d4faca4cd875f1886a228565288cd8b95448d3aaa4c86baf7de94981a5bb4e4615f5a2bf4d7ca952bc96f3b847949c1801f0c8cd771301b8ced17ce8cb067eac6e25aabb76d9b4c5bd6c6a94e7801db1c36c72bcccd6e9bca83e9b6176f0bd2f47a9dba60b96d1bca5a4ae9b6f150a7edd23d8e620dbbc1223cd715b776ab174e30c2c66937a537368ab03686cab0575d57d898d128a2be58ce82638b07e8f443bfed9cb5561c2deab625c317d192e14adc624819d656555798081d79cb9539b21fc2dfce664943d334b7e6c565bc4143a41cf85fc7d510e1067519d60b2dab0dd146a4fce2d708247881e587f0d35ac20be1eadcb8df9a3c6b73a5bcb970a4109be73c2c61e4e1bce438ce398ebc7143424dcb14e94829256500801896d0b40cd22d9aeb71268874e438196ec21b19babf4fc7dab23866bbe809332c191a991d8c170cb9cefbac88724959dea80dcb4a6fac8365f53cbbb1c76d22786e548aacd4b5a53490faf6e1e158cc65b496bb04991b6205937369c3dce33ad2f3cd7696b3bed9b256254ecdcd63d1adb78eab3720420ad3b830c336f350baae5623276aedba4a44134f8ebaaed6256a2d2bbdd9bcd625b52eb1a2eb6a35aab58b5abbae12516bd755225c407f1359d0b0d045e63bf7bcedc7390d1b61a85107971f37b5edf295dfe7dfe802cdc17bdc959439925273dbb62d44d5b73db64b9263216a246b0ce5d296698fcd20189294ba2edf6f0699f3f1b863b282f117954a9c42e5516adad96577b6bcb1fff00fe2154b48d9c4699a36759c37af95c8e3a4a1ca342ecc34a5d65a6bc59b256ee5626e8c543c905840ba51e256f126895b9dde2071eb883a6214459d7a53610276287d0173e4bc502fbe31caa881ac809217ab98302a402d40619bf356d61fe6c1b3b36984477564a83829b87020432dfddade2e166b46a45487368cda20a2116f66b7d2b8d42151086137154f9678caa6581b7a9222ba42f7696d080805f7696d68863b069309ee49af3cf5a51cae1053d0d5d39a104cd09a104465b40f5338859c1c55cbe7f46323c57a3939f83544b7a5268410429ca08a2ab1c67b4f6b4294e04f1b32dc3d5b8b42ac826932990c491697235412125427494a33380b31c3d7ea7cc450ead0c9485fdd3b798889be8a3f8ea3cd8f3852f831c78fe3383a5df2a3dbd1bd1358f9d12f931f47f7247e745389d38f8e33fbd1735090e547df51e2c71468f9d1c59167f4173d1c79c450290cc3d06f171fd68250e2c35a92251f86b26f067faafeb3dfe77704ff09495103428ab7ba33ba9ae76ccd6f4eafe0547fd6c4c08437c053a58ed22a74fd79fd598fd0a09b044c7cb77b351268f11d5482efa02bbeddece1876fc7e92106df9ed383956f67c187137c3b0f1fb4f8761f3f72f8ae95a08aef762238c8905401e4c3b75713207dd77ed8812abdf5192b6a0ca47b59de124e15f2cbf28c5cd0c9ac3c716409932c3f48fd1ce9800332baa0a20b338a965ca800469eae2a251e7ee001cb0e3278f6008c3cccba3f580031c6134e3440611f22662e289a010b8030fb418c2dacf2a7c413339899198591872d68ade0c2e54f1a050712dc0007306a388c51cb818a226a3a94513bb254dbc1e8ade38c3cf64913ab13469e56e900293182203c3b00461e66c93c01c00d5ba68c608ab77e7365ae68f1d63a8e11a86e98c18491c77aac1b54353620b121076fbd84ebfd245105e81a79ac559d10c58f12cfcefac9410d613cbb39f27091aa56c313128eb08019e1aaf0a768060d4f9efdc67dd204a6be6c2c010cf0ec1e0d32193cbb0d960f0f5e4c01d262c6165c24f149e2075282aca0a1a665885863812204af96234f579ea188873d2154a2ec08156ab22fdeba1fa9ce7081096fdd3bc3ca5b17e176a14232430666f4e0add760cd00c65b771a6619752693c974c00226a50039a2d024aa24842d4628638632b2d8c2c3962bde3a4ece107c78eb3b2cf0a81979ecd296124e1c4f62d408020e41a822041ddee2c868b139feac01820e4940c8e2a9056f9dc63d6005c82888329ea494e153021d6a2801132c9e90328498adf44bc205b32f0522ee793956fd54d590a1f47a76ef07393c3beb074ccf3e03650990eab0aaaa4646cb1664186989f2ec323ee321668ca767580e3c93c9642588d59ab7366fa9fc9983662d156bb56c01005b916059c205163390bc75df8195b76e16bd751c1ed4e0ade7f4c088b7be73c3db294e55de3a0f1f5996bcf51f5982f0d68128bdf518a6f8a00753c690e2ad57a01a2454059617aad3558c1d88b1e419864318b51412360c200860593750e9fc59d3d4821a802103838bb74e6d30c5104f3650d1420556387172c5e8e27faabc294d24b8e2d947561247bc885174d0c3b3873d8017e98b289efdebc19329d78ad613bd8bf4c50ccfde39ddd3aa52c8c10eb41c50c16359d656b3b518118d66c3ae8d2272586b8353e5c5132cae90e0d9ef152bcf6e594c78b1ea1a18ecc40ba65891c133ffce95140d9d8a5c1fbdbd3a05755f1fbd48e8a21309392074d123707d246f2889bd903d1589110d50c48c30162362455c4515494faba062e9cf7ae5db29154faba02287af57f8057ede6ddd5627afc7c813b260a98ead3508dfe7f6f2e2a997b2889d56a7135cf6d31b15d0e2e1c293d330145005eaa3f61678784e9e93c762dd7b549d9c4717b81932c07a5b0601dd7a18d6f2c431436b6d8be36ec8bd743a58cf796841bffcb20e5eb2150b49514c9545421ffd863e7a91ebe28ecd6d792f098220ebb9f204f25d298407f8912db0d93dd875d4dd971c1d45e6380155a7fa3492a628c4759bb7107d0afda4594a2130beb95a9daa579de80d5215aab6d26a53b3a7368c783e1e5f2c2e4f6b56908efe146b569cb015253f3ead5939f2d5bd960efe13041f025a8384b6506b6d535a9424252a5e91524a696530865c468ad33017ef8b83f3629a2977d4bda10b49632d27b7728f912a0514264c1073f19e4e81163123345e1073298b3c3f592498e0a6fc76946f47fde9270f9ce756e72fee134b91a3773edeeb3eb18d895faa176f90e338ae565a5fc6171f9db6eb73191ffd85bda8f355d83519798ce5e6d4aefea1edd259c1757194bf788c17f580f1b1e580d15fbcc7e82f654f51e73d234e8fd163ca9edbaef67163baa39f4e632f7ee2bc8b8f650450eee228d1bd933b22c1e0721082230eb1c9e49b6e2deba1e68ebe7d0383cba1d22cdf3408dfdc0cdf5c9e97c36188930be2db69e57ce85437a5481abb51727b8a7a8cfee23d30cef21897298bc8f88b8f65cfe829b7b1e5b2c814b9d3ae76197263da9aa88ef8ed1b167eb16f47db518d298b4e80c17541951dd4aef695abfca4b42f56a5aafc416b458ac08c3e8e63291b4b2345aaecc553650ced6aa697b2d67800ed29ea940a0a6a971875e6291fcb3a6474abd75265113bca475aa5b5abbdd2682c64b209cae938818b2a6545d68d14b1f3cc9f2ee3249e4e7901ed9b49b6d44b50987cfb76a537a65e626696f16b631d7143a7e77d8f472e694913c53db7a37353f22d54048771694e96bd3071cfed684b10f6cf2ddd619be4835b9376501bfce7211d77701076eb21775cd9dac1f9e60ae03c509f73cf37f7f91dfe9c23bfba85cdfeca209c77de1e1af1bc3248b99141d8bbb3721fe7ecde67d93b67ee9cd9634e62b359263b9271953d6b416116892a60d02cf4a997962c1214669f1c2c7be92b7be97ae549c1f8b39768953f7b89b7a3ef8d69cbe27ba9c69aa9bd9bda5b4e2ebf7cd11b93e7ddcb1dd19bb64ff689ea6c55821004960f52619cf66963ea247db29696584bdfee42d2f336a94b3053dcb36ef96e1f19c0eee3e4ad0e765b562d6cd61f10d5f024d629d022d67272c53fdd89cdf68d6973da9e36a6ad8957430110d041c626fddb37d49af6a9ea22450e324a80f1d63d277200459578559d7515d158a5258b13903183135940e1a307258868ca811858c8a8aced8813326c14d7dab08a7bdab06036564443135d84a24abc2a7b733881e299e99ea2e9a4c95b2f892ba3a812afca758419154422a4364d5b7c7a19a8f554e6639eae9ea6609ceabc38f5737ceaa7cb53d4533fefc394ce238f3b5992366ce80dfb48de188104d3550269020ef28604c009d7bdc5b0d4f2fb2481c48f0bca70e28c2fb4c0000d89891cb494c08825aed71f94e726cf516cf11cf3ccccbcb1056d786b398c6f29be9ddcd37ead7123849ead78662f503c5cd824dd9cf20bbc9f589e6149d904cbae9e53aeacbed396745208cd895b53aae1a00b4316f7c6883726b4f7eacca81c81620c1baee8205605892d78f0c5145758c9410c756d16f65e1ab7f67aed92611515d0eda798be9d7a4865401034f22b99faabd263939d45f237a9e13b0c82200882e00ccc0813c157dfce476d74b244289928e6c6c494675d1111b11a9401794027a01d529f27c74787f1d1673c04c9d3c2385d952ceb8957c53a6b1e7410c657247dd638cad0fde83df2c080650c99c258b2667c875b98d949400d5208bbda6748206c1a1d39999595888d98c8c908765aa04daa90438719dd7e0f7eb5ab6456342bd68a895631de420cd923c6513c62ca1e4cd4b0bac5a3a1445b9868c6db790bbf447f892c96c7c4c8ac6456327eb2623c6685181f6378665e6688b6b093b312b111c3e8184970c14316355061c595582b61573b0f8c6ec003133a20f14513b194cbb45c86b55aadca5346094d19c36a577bcc503b2be1578ce7c4d0a00cf311e30de41211ad2a5183de60790a81f11e796462627c1543d25fb1e8cbb0566510180fbdc715603c743ac6c4f80ec3c4b88f186f071213e334966a4ada6a8a719ab229c667ca1867d1a61897a14d31258cafca2695e72f50beb1d02430244f215e796b00dd93f57dd914995acc02c2b34849968e2a6badb5d68ea0caf6c9b2b79e0f9583aef2d1da18079d635cb49e78552c18b71e43d217552b95c334a1015a558c0a54f90ed3a8298dd4788d873535a5acc8c2c09442fa552fa85a761cc7d668ad0eec4be7759ef779ca4150f45e543031302b18186bad6f3666a58a09436f57a954d64787294feb312e866e63c41b136ab18db2de8c8b8be55832312b154c790a49a9ac751807411004c1158c6a05530649f9e7765c2165cb9d94b5768663c9c4ac54b64c39cc4be737dc72562843b60f4bef234f219df53ace6edb5963759083c62d0dd9e24186554fa036a7ec52b3f56c427e8be137a577f1d5eab7ae3740dcfa3fd8e495bbd8189972f48d3cdd7ae255b1ce9a576d64e8323210d1e1fdca77384645b62240c39bd4f09127e45f39499f8a21696bd0288dd0701a1ed220c33af6a051ca8a3695ab4a21fd2b1abaa8c41a3207e73cf5a05470ab8c089bb5a9cd1dd8f856c278e881fe327a7df1884d282ddaf0eb29f56a5359c3a68d94bbb9dbb0d9d4b08a445dedde8d29cfbb2a4fd6ab8890f116fd257a6fe44a4537777155796e2ee3755c618b2145df4899d1c7948cf834be9441c2d03d6bd36f4e550bc3689624aa98f283122690c24aacc16842c809136568610519b14b637a3d2272596ee23c8976b323cf6adb5c455f15a3f2558caa0cf2e2a0db718597addc61733bcd8625805d9bb7e7d098db4ccb94a7c362cad35ce56ce58bab72beff85f43c458a7e49289ee7a0e8593673b0b0d9ed350cab311b22018872ab536d62b35f84ae144700e17372f04b14bfe5dbb60520c9653f6d6a88c5aa2a613dc3011c1b3db42618ddea4475da366cf45ad24bbb65546a1de3a9d72c54858aa4b563f3eab50cb2c35ca33a9df306aaa555cfbb9586a4aac04ace8a8474e121ae551538a99ea0e4995d9aa07c23e2a18631126b3b7a1ea2f2a7e51a928d62694955056bbba467c7c121465bf0f90eb07e08eb63f48cefd29633af869a164d352b3f4f6b55b4d4aaece0c7a7b52a4c5f1b30bb42bb11529b7386f6ede116a3ae9a314cdc84986c4448b6289b8cc8055b101351173522267f6e46dfdbd146b3955144fc3a3b941327eea99aa96665c855d514442bfd5c4e236fcf0ebc2d5547aca66f20d58cea54d54c3563d88c4c75a48aa2aaa9a84021535d51cd54482a25d5928a49d584220a4125334824f9f6139cf22111a96643ed5535db92706de272de9533337ad3a48a2355462c267ae3a2833b93c2e4a203171d501df60e0a32ba28a086a188dad5ce62dd8b02fa0fe99b55258aef19110b45d4309726ea6a77faeea7a36f94ecdb754002e1a2836fa724d8027ad3bea188b60d45c4b06d083543414121a194f8456b52fc7ca3a87c5b26285044df2e3528921a8aa03f5149dfa81a6a09652b38e3d7a99a1df1eb045b001af1eb73e2bb0970f65d49ae600b3aaa33437ba98173259a60d92a0da09872058b01d4568f1e14a200a3c6de4255a17beaaaee79f764251955f1da05848b0a6a9264fbc9933f737cb52d6b85b4c0b094acc70f222bd8f2d56c2268121130f8935e2182883fa9d3d7994ab7d8ae51dd865fa8af8ea3aee0e82b114cc4efe873c19f348a93db0a5c8daa02970158726b5087d4011a48ab81b40fd4b050aa6181f4b486c511162c78ee690d0b228f0161e7b4c2282d5126eac4b1d09b550165a355d103d4d094135441058609d18c7604c912f7e49a984b4e89cdae327d07c65b36619e07bda1955d4e9f2b36b515085da9352155076cb14e688bd960e29e5c1387c46607abb1ce392dfcaa9f147275ef2b735170384da9194541aa5da9512a52526de90ac73511f9d0366c134bcea95d1dd7d4aece89c0b8c039932748034370c4e47981eaa8a3f93917fab95ae6bad56870f4d55989ab759d10c33ca6aeeb3a2647baaeebbaaeabcc3df1ebe4ae7c57030aeab8a72348be73ee0a09811d866adde484c431e1d7598538227e79e75c10f6d951c342efbeb22209c90ad4aece2dc991447470c90d953d6c769d900d17dc931baa4243dff9c93d7de7dc13bf780bbf6af73384480f9b1c735c5dc96a3410e22a532d15c910223d5556812a123af298c0c46dade0bd3763b3fbbce923392c6cba66b522d83fb26ee416f31a56c4c54797b293955e8fd0c51ac93db50bf440f0db86a648f1047e1e37e39ab827aee6919c87e4e6dc8c6b7aea645cad878f177e0089a1f38d64b5abf32645d773e47333cfa59eabd4f38df41cc7537ae395a710d0678771b0d9792569d879e75c8be36a3aaf434eb6efbc46e117ad3149face69e7674dfa6e057f8add1432e8a610fab342f9aeeb2a0bf1eb1487f8755e227e75278e4e49f731d1092df167e7e43ba33f3ba3ef70b01a66bd736fd8e65dd7754c365a6a965adbd96062b61da5b44675680f9b9cec398e13e221aac3cfb94763a4eebcd57d4356398eebb8e69af3b6dd13bf9c38af5a38fe79aeebba6e46753aaf3527cf11c015c6c56959079dc646073d02a383a21709bd2b232016015d2c693be83beca3fbc4b66ef41ea28f622982e4b531823a574b6f5795bb397b751ca08a0385d5d913ce73b424cfd5dac373d4f57d2cc424780e87b213bde17c36a33a9c84de208104cb88d410cff9f971f486f35aa33a35f8be548a52ee86a66a96452994524a3d6badb5d65a6b6570f9d5a0e739dd51cf38c32bbbcda3e6e622f588547b7f7ce02d09a1436287ae073515aca0633dada96087079fd6545083d1c7cc520c51061884db7a5a1b82e98821a0c872534f6b432c61c510446014432ca90d71c40460eda9cd18e206ef89fb0da10302196096cb3dad2de901d79654e161c3c9c14921670a120f7169a48c71c726b61f28c13d71bda7b525478024b8ddd3da12262ccf528f06f77a1eab65c5053ab08668ac340992799af1707e88f1ae27de29b624fdb0ae151b7a5811cd642e1941aa284131587080a142b6c2010f2f34151640a9284d30b41f2eede9e50813a0a2704a5541010f2e50c86e151d4621145396204404d0825c70bc2e7c0871727052c8691a3d1b1c01a310a1d8e18b0151c8d484270512c8644450370325eca24cd8e5cdc009b39892f470c4a4030f485d9c7104a80b1fec80001accbac8c10e084002ea820b200448699ad2456d07042411b58b7a24ccc0f33ada9fc7ac05ca0e7fe268b93463744d9c686272e20a6f06276a00323921e506276290c40925827022054ee480e44261e23c15dcf1e9942686108326b0d026bad8614440134e5e1356ec2042016a9797a489273e1634b1821e9af0a1891f1ebc256abd8327653cf9810d1cf5ac87002768de0faec7838e76bd2fc27872c50c2ef774ca9329df1301a6c4a8246c56964dcd3a552310000000d314002028100a87c482b150240c14495b7b14800d87a44a6a5298caa32889510a196380318000000400cc008cccd0360097f32720e36e7a6172fdfd6f24e2fe10e76aa9f7c1b6a5611c7cded1797201744c2cd6bed49592bb54bbe5bf706fea3d1a41281260ce527ac0109b5ed61822337625082c462907eed847cb30f308b2e3df8b92a0d129b4fc7b8005052fa4226dce556375ae6516cccd400e6f94691131cebd80dbbe814d54b3de953644e61e7a9d80598c26b904ebffea588500478978cae7f177c59f5ecef27b5772750672045fb7dd3f47d52bbffd1aa57ea080a0f64fd6837f26b61c83209d54436e960048664b6128a6d53a4f9d3619b2e62e35b298c520d978335dce1710077b49680cd11e614517dfad336ffa4cebc73e5aa0f58d6ed39fb13e272dd2c7c102048410cab19495f4843a81ffe6871386c61d4891fb185c850d89c05ec0f60223e2b0007003ca7e49ab443207e016aec621c31818076e8088f54a93d29e082f34541b1d0bda2bffb4d000733ee353ead73a5c6abcd6101504ab31ec81096dba2686ab7dc24ce6f44d46fd1435fccc4e8d48226153a309c5866d856b205a90c873cd6e9f25d18660c7098d211dcd3e7cef9749d0272f5e609554cee8bb21a264f4489d995c8b91d5739deabbfe16319d6d804da3e40fdc031efc63ed0826db742e6698828c58eb681e2d878e820c9e917280cacbe340e490a38bbd7a61fe24466c93783e11dafbed0d91323911ed57a719c32ac674dcf3c3800da83a40ac56c4331f7ba944a92ce70c16372b20c72c69a09d26e64c98ac01f844ce6430ce09c98d84d0fd034bc8958a50e19d1d0a41afd76f6a2a50d07fb48092163af35ae74b6852045f145c892c43d4d4fa760367c311691415050c4fa0f010cab5bee15ea74a489209a1f4b58c67ee90d54d2947c9ee42ff4fb4fe428642a65ad53da591181485b7a38357e86d6e336b03fbc0b114f1b002d3ba82c961cd26624d32c281511c6863d797fabfcbaa4dfbed5cb908321f07c0ce4aa20250638ef199b23d7f1d2c3e487b3bbea0e978f09bfedc1ed4418c9bc34cbe1981becce2f2f6ddf88f76d94869d79f1fae808ae801aa8cf3a48839264e21ad283f822a5eb32a2d96c4af00746ef3f719340b7a7659340bccfa9e85ab2fb9439ac830ea59c0123befa35edfb50fa09503bd2fe8cd0ef04667963512d66fa9d6e3a7477501c48dd945532f84dd4414d70cfa3b29974c05cec37a15cbe08ab48cdee7e80bb896dcaaf1da44ec2cf60337ca6cd540f1ca8481ff63aaedbad5d45d4519ca409e775e609b7d3a022e14c5e88cca8719b8743b29d4babd3e62e47faae9b86c33b424cc47c126681d929e1afa7198143e32c8dabc9504c38a3e9da3c51184ec80211de7b27b122cc28bb29701f266e335756c02ac32043b541b73a005e01cb4978e14e7b919d4804213a156239aae558ef4f1480c2ed8bf2af8444812c369777f660239274ce5bc2904bae95bec6e3f79ff806f6e26defca84d6a563490e4d370082f14a7ef75daff388d6626aa12ca9e937d1567b8d2012386c330702b05adf051a02ca2655a25beeb9d02279cb136f7ebfd3ac7d26a36b147f6a367ca5814d02b59820a87be55aa91a0989b9f241eeb31881215d645898930c6ae8200a5b57de27a99e309561169ea7d72be4a5002d5a74360610cb38826b711cc8aaa0bb0eff10ee75871f5dfe0ca57c0e9aef0da74b1c3e63de12af7f25b5c14de136969167b1a56395cbd22bc703f7cae71034344d6b69f4e567e92bafa08a4c308c570df80af584201819ca652bc3c8fd813bf94d4d5545ddb854a5ff94fc4978916131ee9ff44061a04ca923750fe52d53f9409f1df7bf44154aecefc8937049e736d95826f4d21f7ce92b8280e46d9e2eb1c7b8e7e62da55cbc00da4ffc99b438fffd03b21575972e0637ef8b6814669a1768f00356c54ca794f35144f0d00945a75a9b5f990d0b4011d08c6129c2ccb8da5e5d6bcc87139db86c979f4989f3bdf1a88db028065287404995e86646a187d4840972044047c084466ea09dcdf0ff0ed021bfc559caa1aa9a742b788cab643925b9d84bc0a1815e40362216fa26f98b80b725b83de442f45f55de27ab67e51bfe51eea806a014454e092c0634d253b06b8b5a4b8eab82bcb366671e107af79517cb0599a9d22cb3c116260801a3f77ba182f1d52a038675807b1dacda1b93698f21673d8519daa0fac0d7a2ad220dc4709911cdd884129838e8a72605a19e2641141b4ee780dd5c6d41bb4526a359003bd6a328e402ec2ec7bebec1036afd8233571a29fb024a2aa06a41309d64e0468641acfc7cf4f26238923c5a3c5bccdd1bc942aef0d771ed89c360021dde9bf9646b0bbae635713a79ae6aa2d2dcf004628c71de9cd29317b42d2a7062f369f2f78a110476c28a792213b4f52344d30efb6b811272cf1045ffd954d353f801f18bc69d74a313ead3bb4164a0b026e5ac24b90dbdeeffa3efd9c713ed7619354c75a92544287f2f17ec3f742fd9d21adcde9b2958256feba321ef284a55a8670daf76bb5f0e428de5dd86454f95d7906128c605944dcfdec3bf7df2689e39c5eb527705cbbdca88aaaa0c38902244c3d0f279a1d617a4e46071bee1c2db46dd355a2815617bfaa249907d0938c883832797b2b166b127792ff8558785c5b5dc2e11b7e5ef096cf53ca332ff41285112bb5542c5110f6e9cfafd058f3768eb49cd2adaa48af00ce94a6e60e83a825610469e7d32c700020819273be9e4bb67c1ff6f10fe74df895c5cac317b633b1fa7db34c89ca20dfb94d896b4b67c8c8c50c1409b6de95d461632c017b0883b628c2bf7060f5fe1db9585332be19ddda8e6e2bd982a6d8d3805bdb588ab7a8579f8160dc97550237ab5e6290d2ba669a2c8533500beac93473fd69f014b07850db3ba28f60a60d633e836a980f1e3e4620ed0744217c45955877591d74c7d01774b463ebd376185f428db325c6ab98e068a02a588d6c9dcdabf825c111e6c4e74bef201fa945c4e6121320f06edb2f9b89eaee32e2a84cfdb1adb2ae31ed174670863541c9abb3769d647b150673194a318ef9a98e1fb5ff3b722bc600aa9b0af1c9cd3ba11acfbe877e0e319828cc57c4df0c5e7a1244e6cf2a8abdf1b7403e1708d653f15c05aeabfdbc0054b150a3d8592fd28a71fd747dd54801a99865203b37def102a066fa054e6dfd7f27573ca5c69471e4e38d328a462c04adf9bc05eed4af96ee62831efb6d151f3131e1467228127229e53126b868edcdc1ac57b49be96cc15b89e38b6578087d5c6c8c2c683a5903b73c24ece7f7ff3c9eeb1bb42839ff61fc8c507e061fcaaf5d3e6733bb6fe1ccf1c617749b2566bb707466c4a0f193a62401cba6c53b955a9609cf849488ed7cceb97401b00d65e87ab5862f5af32079f458b256db9ca24d574c813948d5ee48a73e0cea24f26b848020d4c947944223acf797cd1cc88e864bc45fbb7c265e0a0e11435ac887bf7d37d77aeeb84a6507562cd89f8d8632f16318a380c6da6902ab903c662bc57259aef10294caf707e9d568d029fdc4beca267324f4790ef95744e005fb6efd62ff145df34dc5e0a78cd01a797a36f6e80398dd5be66481a6e49f0681cd43f526d183aa30690740355bc9356d2a17f0b2de0175090d8800957058a13cf027b8ff016bdc3df76ba19a64619e9c0388504d578f370f10afd8e8a2689db29f6525608d475c79982dcaffd96349bac8183c4d3ecb169023876e928594db08995ca6b5853729e3cbf7e13393852085d4a8ccf4b33f64ab51569b3184451316339dfcf60b1953bdb4cfc12c9ed8163e0a9da3d40751c07cf4ace5f3a19f6e60afb3127daa5b0dbfe64d24d2668756121f8191eed60a8c1b136f7f52e63aaea5edbcfab394126fce530cd87b5fa56fa42d35bffa3556bf91eaf041bbf38d7c5ad31153ba6ec2d92aca8bb781e9c94ff6d5b3b234aea5210d4d8225f4211741a0824adf574857c620d9c28a949d5e94cd79f92d72ddf455b2ae0630cccdf7630f7e9f4f350954323c3d2722d27487b807c0abbfb8ab6baee129b1585f9de68e88b9b808968f92b871d1e9237e3a8701ac7d8d5cdc695cf7352236763df4449cb9a39aa467559ffe1070269dde01d7252e771e821f7d8283e7d1ad332aa2f9abc29ae813a313c3c804ecf9ec0014a557194632148f4de2644458c3abd0e37c97c3b11ab2a2a3257ee30a71d0c0e555477aa08e78157acb2e9ef2ca309351e543fe06807db71abdcff0329c2245f749dce29901b582c7df6438f1c24fa66f524182ae96b8de7ef128fba55f1a71f41f3772dff136857254d07d0aa52385a8f84c3bb5655c47f79da1a0a3e1db208bafc3b97ca16d0fbf54d17e3d3555f96a5208191d83584a09f37c7a4a56bc15d1d5fa9305a50989d5d901c3d721e7f3cfcf24cb64102d31a318b1aadcc0436ffc98da10da32eb46474d8a2bb941f0adce0d7abde2ac8d138d422385352163621a49c9047d2299b1c69b3faa0bf61450e199a0d670741704041c9e2e8942746e2396135d0c2013865ca60aac6006839a9561ec12cea979a5a307811a51cd217e1f95f93729e1cb32cf2eabf1639cde6f58f8fe76ce372fb49fe62eb322faf5cf9e3fc8c84bff502d1faef9e228b9799671721d05e71e54d4db659455d5d58f24675631caedf8597a15a2e45bb559df6ec7a2e28b6d13738f4249883adbff6fafdc1c0e82c474f2b2347eac8e5bc13d85b0a46f18350fcdef6e96f1a66e30215b16c1b706073da62d4bcf6066f7982e3573f04ca0d76827a3cab2a874fa77ba0da88465b55e4dd9ddbb0e2c521ec60a18c7dbf4d8bc8d58c36807098fcc058dcf56f6439ccb70c26a5e33f1d84608e03239459753d9a5fd980c8dc6f6b47c4887dc50520509dc0acbaa603a3195be497a79b43a5e2a549e6c59ad26c9010e0e69f0ba5d9e6b0328cdc9b392850c28569ad8746f067c6f757a1baa038b08e2cdc2fa8c5ca4402677fc5c4a5c10d4e85175951a9bf7e94b5cbe9c5f446c12b6fa4066dec3ad340dba5b73d5db2f04e6312dd379b99277066be7262bc8f4d5889a09374d4d3c775d843ea8b3ae4012e620e72751737d10d72d46126c9a90becff6146a447d2cd3b72e46a289aaa81e9ed61ac3d60f4988ea157f97c8535102359daad76507051514c72e989a023d12c4f746d2881cf18485d7ef26e4243fa8d095a887f8e8c18522fc48256b6c2e0856526c8a03a63ebc6fae8f2e638c93aeae786755976b1348566e9273a4bad672c5d8d6b3230a2c244e0cb6864440fed3ab89f66d37187141bf4d9916816511f867728532199eefeb090a7f56a0604979da9eb6eb11f5eda00fd76919370caee86655d8752b1ee96f654d9449eb86f66ac50fa6a4b86721f35c86228c3d90a77ab4c619efcf011f053cebf757f28ea5eae1b7414eb17592ec018890d85ee2da6fd133b1dc4aa095b023673cbaf1ddf940d2df100272209a32c33b1cc21949a316da9e63154db7174533fdce79cb7aa141bfcdf016134161af240930ee5c1d98ad16995d38fd04aec670528be3179dc72a770074d794a8669fcecccf232b95576f7b9374581f8730c29f90698947f28686cb24c15c3619a8a9c1b30e4e9e9b2d31548841e8e5964afec7bffe05366290b2cd94bf1386bc06d85327eecfbe70754bc97e061e070e49a960355047f340f1ed090a29c137e520ce1642a5f1b94eea082deef5b491c8cc86f4b205500fc33a912f1ce873f82354274d8e69f37c560403cf0dcbbb3232995362fd418eaa25b1bc5915fcffe4a924939e182901418f52b0cee40165a1e97d7e64fa51329699ea5f75aeefb766425829cbb6f386b0a5978d26f5177474a949fb4be41c5c4e5b2776e220f5cc4d8b0ce23967aaf95d74bbc3e74abcc0b40bda78e7cf59c590532a0a38cacab2836c9362b9791679fbbb666549fe2c156687516eeef3c6c465316ec2eb76e206deac2c3c299d1568943d6ee9973cf234d93f6b4b5dc1743c869ea0c45dcad6657fd295864a773a1a8a09b9db61d2d04f9e7a09c5d579f1d1789bea4620d844c77f66f49c2536b89f247c204ad4fe4c90d4e49f436612d1c455538577e86b2743ec032ba5898aecc70bd8461e34c8caa6b43f2831879ee70fec55d674b1a4f58180cd73dc82db0a0fc16cdd85405515c0a1c0bcfb0c44eebed38b3fc8f1c657a6de16aa7258e58b670841494ed47a3b9c55e37964a0a6e02b41fe26ea38ae3877989a50ad83c44631c50fd3934272630da357aafc3c0775fa55e62c4f5652320ee9adb435881ce52b09dd1b7efc2311f73c3812c575070c26a6cb0dc8c93d806e90fa58d53d4274a408b19f3db6038b05c82683410eb0e8bf06c02050131e226c86fe89f93def15ebb4a3a4d6b27b968517560ab22a1915798d482bd485bf8dd0016dfb2cc0db54e45396ef81e7cc5fea341a83a609ce9cc36642220765b6bb34c111e8a153ce70e89b67576e029b1d8a1c422ad24031210f432505588a117cca017ca8aedd7ec7e596e557203369e2001489256c0f23a5702909fa3c1f0242203ffa8df1710ba426c857babc9d0b44def7aa64aa2b3ae8c8192c22c2ec8860e2367d3092b1d573c35dc9eff49dcbf81ba28edfff8e5753c342e76f054290b1285add577b9c31d9d1bac32b5153d26b85245bcb0ce39b2df9ea931c25240d3c45a1f740033291119d9d743fef667d0e364829503dea2a20be61164e2b5dc13332c480642d3cfebf2c6d4576cdf102fad3d194659874c6ba652297d038e6b56528150eb868d44a981adfc3bcdfc402e13eb623e1a8aab5c0f1c4a222cc25fcfa5beb2432f5d170aa7283f89c2ec26ab678cbac5a19a3e635506cdb89c176c5e242739ffa3adc30b04f2466b15e45457f812d789ec214557dad9ecb4c784bb879264e8c983308a53425c63c84b20e8411779fd37a717e38c925aeebf9139980b8fb25e9b03900945b00eb9ce8c484c732fe3fa8ba45df6c0a1e585c6af643c4f5ed2eb7c8fa87d102e30486476fb729cf7669b0c4840b70de13a74ef7a96ec26accc22d71fc37b26a5f0a8b38a902cd133a1a7dd2922077bc695897c387fc39f72a7477a75464f15a0e6ea264b8fcc14adbdb45d1d55b05459c55ebef11ce2692faa1c6bea487b474509d69bc61192e5743945e10247c40f5411b3c436d341d5f4a0399c721a9cc48c4eac8cb6d4301a1e6f554986b7d34d94045bbd01b8ee63049ca2e3867e079530179b68605a069f5399530f13160513b549f938d47c970a258f82aa5ec73678dfacfc2ca0ff2651229e2d2c4ba7e861d36d8cd45ee1d268902bf08ccdc8260c6d58022112a37caa6e8c3961404a077266fd4a09871e81407a2304c144c0dfd7634d90eb24856b644aebf2f5e2800f17cebfe3a5fbf5f6f36972319b409f59766b1ff9fddc7deca32e4b58652cd410f859c415b8686ac0caecb4fa0a1eccdab11dc92a3cb74669decf2591077a11487448a5f4a69c138329a430b9d85c03406257b7338849fd5623e0caf7bc4f3870ac3f4a80a7b20219fcba3ac3cf5809841ea4a8a617336d0739b99ab3a0c57dd07d8f5971bd722c69080cb39c2ae43c8ea2e00031e74e1d6a20a85fe941f2250bb13ae4b63eabfa9e5e6879ff96e2f99b44209715fd6d1293e88c4ddf7117aae4a0448e341761d8b810aef722f9b490571bf15347699efe2da466f8bde82d6bd7c20ca5f871e439847642145d5c275b91909fdd94f554ccb5d47d7887613c42e14871b8511f8c726ea9c3ee6cc88b1552535ff7fc0b6c068f33bb86ca15a185350f4269d178ed6796f0a330fd52f5922a35189df15407f828a99c05a7b2e47fadbf690d31ce8a97277050620884a52c8030b5300d1f507174bad5eb038e225f779834096ed0174f4dfe90786a1d57990069c8af54f8f22c240cdc8f8d7f06c89effd09db78861a91b13f78494272bd30bed0a809bd8177032102d0d8df69054e26e8fddb6902990974e673ea815041e8f6edf481922034f3e11481d219f4d6cf69074247d0ae1fc2266eab0074fadfa9033992410beec2feeab208a93c54aa95fdd707e4685cc87a9067e01d81241ba6138aacc0d73134d6479c98c84037a6d72e1080e1abb12a450be9123b624a6e0363faa6649bf10ef4dfac99248a4684f46d96cca50a47a15c5e449a44bc581c5b54e9c80aeed1cb2339b845fde8948c9289948c668482c2fecf04a5cd75279a2ee5fd2b0eebdd0385e16d23ff1ffb0b7a06c4b6b22a3c93cdce7db044eae9f716c1632cb9a322104ce625a38033422e4c7418051eb75b4c5c48d0e30ca7489d9088a1220a088f30191a50a12870a704e0982b4e893d82474f506c215f355840e913b2fea74260ac22ba4282a0be159b99fc3a3946c0ab8b230aec5c7a1c425890b3597e48b3055960fc645b7b85cff875cc175f663945852265e008cac12a8185dc845924b37928f0a7bb281d008107fb705bff21e32430c1cca91380fd74f76f437892bf045e1707a13657de12879d708f5cd4a9163ffb23a0d1e796107cc180a0d9120ce99c8531d50c246c00e379a32d453c8d3bf7df833e4613204193abb602b64bfdbde935049702d541d3dfae5924777b9818d8ce55229212ef57903e7db33ecc3c32b9566abb86b6504149428936bc7464c9ea87a79300f48d1efd0f74483d0609e65183a3072539156ec8dc483f426fe426873213fa60a9901b1d4826347d4b81dfe8403cf1020f45e428f9ec991d872da231c3210ee120e417e9c0a422a78336a168a3804aa6887cef5fbce1f4a07c0db294c2561ff6e00a2875593299414a8bcfbc08808de01ad2eb25985dc5d438ad1834a81549546a994c6cae82f1dcc5146064c8987dbdf4b31cd3a0472ed82a1d0eaff8f66f6316a5490d82ef69e5f7a0d11d049044ca0ba5a61d38fe36382b7e7393abf9448e3ede1a0fb66f26aab2f8d2844f8eda63cee7c2f173c0d98603c168e4b9fbfdd905c5189c0b1478c9a0916d82b348f2d87111e4030a28547e1976c7c95a349272f53c061c968bc7d051a58dccdd0f958b747852888d758158aef88cabec45f1fa316d7b91adcd0e01b68f20c0a7ecca04e420f2c56a8044b225b3ba464df7467f4113d50118f6425aeb993e911be8fe0caac35a872907104c1ab9a05326f43842bbf4e5603c92b2a9118e19f01e85da549d7f08a742e1a3d6ab61b8fcde5592af3802561fb36dfc40d0c02a777392318422f804028d604b75649359a35bfb6702000e2ca82839db31dd1a0a9043b6e6b76d1c8403d0be39af5ce5fe3e735a14b036aae20f43d4d53e5cd592f243af0686bf139df098c1532250a7ad260cd20ed0c851357e0ab99361980f8648f1a3707eff8f5b3a30f81c103f9011224e438c3e1fce7603fcd31eeda568959db6937f2766f2366ed40b2e3efa2087f043341e20cba458c8fec0c8703c442314aa81c576717413337e4675ae70d7a97648b5ea60dce81cde2aac32e3ee85550dfc46c97c36e328779566ffd55fd49c0e97692ef33a559f1d47fac5baf193f37aa72b4b84ea74cdd59fddb062a070a8bea0d5770e8d67c8c4a8aa765155ed4bbe55a496bede2e1d572e693312b725aa7e4716c0db71fb048de676e4db1f2986d3f0229e26eb744aa1f80c93312e6243a1921b70815087545ecfdb551ae98ff45f266fd81e47b746c67bfbf05c94dc5d1e63090885d48e3d77e2850c35f79bf0947e56da0945ce6292ad97271ff537a74da630e8e507f76fe2d43bf2a1485482ba2769d27f9f802b9ec4d94fc98f795fc06655857475a36ada9861b876b7924c469f5760abb5f802ffec96455c86c67f642d7f09042f2ef869d4096e07ab81d8b3f1a0fb2c17596eee0c10411f9a2018c86e6cb60ba31f4c7256680c86db8ad85be2773444910879fcacb9c4deb4f5d6b90d5644663c5781f8b76b52a466f93dbfcb3d4ad5a99ceb109578240fda013a17ef4547f12e28a51af9e8f06423e96c1e5c542b0ac3b3aff4bdb65b0f9e36d3c0edb4e585cc3cce838bb46f3711ae3f669b9dd01e0d102b443219d2e4f805477bbd7c9d3c911abfb4eeee002a3526a6a6c2f3c8e1996c91858cc553f3783c1274ba9f5c6c0b1f7e6efa1816db278cedc981932b2cc34aedda18656a3699e0dd8f06901fae1d52aad8e84524e8db022ef03486c7de043f88bbcaeca541dff2b9bdb6a4f5061740a5a2004724618f723fe6b7656850debc01b6867654344730a907e3dd7379f71db34c788be54f72b66a003be127c39585ddce695fe07e2c9606df97e0eac37be11a9b417e2b58d38df3ff0c9b6e30d4f7329554a3cf3ffcd9eaa6fce8ab2088d12d7ac8ee4360801d04897166f91c18230e58f2b87005d27a97d0a16c27681cfb3546ac7f0baad39af0255cbee32ebd18af13a61ade223339639c5efbadc02729818eed49bc4c2405a53f119f45c9c4467dd09111e7338051c1ada00a901da7f367d3ffda227ea6f690fbd554cb818c337c15cc4c786af9c96392da1127d2f624002b560840b1f9a32b04fef6d3e5874a7659532116700faf867479a5e277027171d496e791043c7fb07752d9f29fbd65b5de4ae75bec535b6bdc78e6e0d097fcdad81d86b5867e8e9f24bf2aa228ded4c713358d4c1a96337dcb60ea6d32f48dffd08e782c43725c7772413d8dde737096cfa3c2865993ca6bb1bfc811154f46fcac932cbfb70725402023da363d1bb4b9aaf60157a8df6d32e88e2c0a8b46c3db8b3b918388d5f1e7155e317ece219d4f224510a3b548fead2a7990bf4150280bedf8496d652224234b953b3c460869d6212c24f50b33512ebb679934ed9e0492efdea5f62e63113d28a14f4973662af998eb833c59d678c2b6e1c965dba920ab19cfcbf2d893c388d531bfb0c5206027b3e8551c698e317c188d61b8c019c824bba3b969c91203e51d8c4a3d30d6ec5a4eb336cad003fabb555d5cfa4bbad85fcd6e35d30705768e69b775d1d5e75bb34add73167178bfaf0b01c050b2998036c3caad4f060992da2d624fc7e68fbf4aa3a3dcba15d4353228b5538425da164bfb8a2b0db4a741b9826bf8f8b3a08665b8b44c74bc9355244f3067258bb325b0c7104e172c610f53d11f577d20f31499adafe2c0e19c2e0a073a51910045bfd7296307d45975ef922db3ede32d169ea271da7a97dc4fc602a65d44759e6babff0c70164f722c916c56a560cdce0fc22c966df51c2b22810bf095ca6e8e20fcd043cfe4111c3123686dbaeb630a7306a32bb237975bc0bfc973d821fd191686a50c10f29e4bb02f6acc0d1b0361beac24724e3361f476139c05a8859d695ba242efb993ede216871679bd44cfd703f5b0fe1fe0e1da6bb159b107e68c36d257dc2f7e7fe6e5544e7364bd3298fb01cb016eb9dcb82e4e1749c0bce0203be7a4509996f51c137a301cc2890c689e52046483413366788585bd4e80fdc1e451d529cf6ffaf4b20e531feb894bc5153f13a0b909d95aa149d3e5b9726307abc631b2fd3c542e89760b09777c4304816fda9fcba501a99def94bbfcd2f17869f6735f2a188477d4543cde582f36832f6468277843f56ecb265ddfa9979e716dca1a4974292c8ed0acf71211027c34589875ac227979e76b80b7567c88c81b0538b246dfa2eb5cc7d780aa55634dfdb212c2870efec504199d46fd566c3881887ec01bfc180831918e8fbbd00f2c7695e810dc32f2b1db46f8a6d5117461ec2a1e9386e6046b2cc2d3a988279b3444316a0d561582309cb0b5596e69814b1c4ad5f1d7b2ae8f6c65bb092dff0a1f480c4ec266c87326e50567c116cab44a9e3f1c3fc934222df8e10cc3e52e19772d3d9ff18513086db3ee49bbba6bd5cc01164c2d07ee91101d8d611d7ffa8bb3fadf9675953143127bda477d2e4ac3fde92c8b232fc77d457ed0ddf4496acaca5ca6e825227c9e18714dde6d5de40da5ed8d16066fba17a522c3e4cddb25e5002bc37e91d7221811b727381180fdec061f67377cd785bf75a49700e62b6678f1557f92496f08aec1bd11730e08aad041cd757756f496381c0b4fceaecdf0b6fe63d8f8bb8935a8ac86e82f7feed88d71ebd6013ba34090c6148cecb193417003cd07de1b84dbabd33e5f95568f0394cb2623e74744b7ed63befb5fd7550bb09f49827119928117d1c877912ebc04f90c0fe48fe5e67568a96455d4b301a8b87023b14ab681150bb6d94415a5b58847f912a87a10d05dcf42ffb5a4612651b50dfa881ca3d583f8c7014fc4bb4e265c18f602e691d01a3d824a1d882995daa32b52bf288416199eb36e447ea8cf1a8a6ea47454bcf0e8ebb53c3952ebddf1d11af42aa8abb4e0de45ce52d7bd79f9a3490661289abb69943c3098478564bb25bd7bba459f0edc0f704cf980d0d67456c391ebc1f3db4da540cb8bd6abe48e3a8e7d66663ca525c33acad09b6125eb55e78db515fdd36397792fe8f1520472c80513656a276f5122f2468535a0c00d39527981643281e4ad9fc649a6183c0ab69a8e5e976f3354dfc390587c36502fd72386b48c79d02120de69df2d1de294d421c67bb500bd588fc82b23a0e8923bab5b7216974045a450675ce9ab029fd3ca93cae6e59257cfbb1408b5105ab43ca772b3fb715e9a0b3b6bd887e4df391e2161d2eca470fb89637d0446ddfa8e477839a9605ad8d3ab6500be81dfe491b720289688011dc9b047f54a01115433acaea18dc0e3165b4c9eaaeb485702d79817215a8fd3079527819e8f8f3101ea996409e26fba70d87304024d698a20c129920351160355fb244266da46bf8f32a3889d33ed8f8e88ba3467ba27ae7129edf6b659a2c7a8d7d191ae564cf0c4f1012215aa9bc06f1b7a498a999d5cd85ad0586a4de20214fa3517826ecef0e23810b6d4d93a887d30fbb9402f6d120112e89fcaf05a4a233171ae30b42086de134d38a5522f8265c883904bbe7a3c38cc67cbfed88e8c07b6ed4d714a28fcdf3ef5249a4b1ce40fc4d05e8f04ce18106ad4b3aebd255c9ba1918aa5a6471bfb3dbeaa12110d29472a3a9880c3f7a433692ad7d93babf67c604d5a073d4907c85140a7058399d2393553d389b478198a70771d6dd220b7ecfb6d0f7cfcc9cf8d2b3f3e4453d064634c38dd2bd04c2fccc998c378e0b6fc067463d03d1980bb50e3b0e91ee9f7f7d632c027d2bc9505a5e134f02c86a523e82cdead2de2f400e38eb27e0c4346bf6e61ac1b47277a7543302b6974a640edb7668e09335263b626eae3838e6b7cfcf93c0b1bb93934731826f591c9da3cd66f3e12107601e9f84e1421ca6bbf1789a6bc5126544ff5111a19f0b671795b83012550df7a6e81e8cf0211a51790f2cadc0af8f6e17030cc413a2dfc88f4115b01513cfea5890992605e0b559bbfa01d3a00d72ec07bb2b6d7cd13993187081c002891ef086307f102e8001e812d84381bf8483cfdc0c31c11ba2a7b80494deea08081e5c73962ba3e6d2552eddddc230b65fea57789252fb03c8ebc4ef4f554b0fb1371f835b36268c18aa5eaf6325f7cb995bc40db67dad16d9217e8665ec1b154494ea0cfe27486311b58514ad6987696ccd4add07490c1047bfaa824c32ccb8f92246783c1ef82db1955685b6b91b1f431b19d84343d3b3f04406eb7687c3b5237f0851ea73d5ae1b23a34998484cb90958be7758b8cf820e354b28b2fd31f580501a9e56b909371f902aa3ece5bab348dd4b8d5db7126b80478c33b6e357281530508128c42c737c1744ab7b565834c252aefd58a7021e1131710e609408fd68805335541b7e62970e2bcbc1366c3f7cc843ad6b911d3003e3bec9b59cd7256cad1e6d9c4f6cbb976dd5823eaf4761d3ab40c1611f732392a60618e8929f040b3cec13ad2ca5d1f7f49c164c8c182d25728ebcebbda42bf368c82a2b5677054b7fff7abca1d5f474364bf223d29b846eba729db18b211a5e9abe12be0edb35bfb4c50d9e1b0b41a0ba9b1304b661f98e21c02ca5f617ccccd4ff089aea70f80e5adfa9e4267d0f55129cbf98ec9a36ede54a6a7cfb02690e6e7721d6535e6438ad300a3453419f34ca11bab4330d2cb1b5523c109c2ac7fb4cd701321a972d6d16e15a377ef2de2fa3506bdad1aa4e788c41a370e2631df91349b56685b1c00fb43e2f77a66871fe1260785acd394d5523e2101163b49d95ad546a7fde5ecad364448d323995c6d2f8d50381638426587fb675e4a5034181b143f98ac4ce81be6880b60417085d90981f0d336f26aedf8df4c76297803dbfd605aa825fe0e193b3d208ac05e92b9ec890c45216531445579e07db2d5b085b71cdba1f8835eb8e31990c5c2759fb04583c736d1e8fdff28fa2ae43bb486f96cebe5266db8269e95b68ed4d35564fa4dfc29521b1cd1f4803a13550aaee7f36652eb5169d2400cd23bc1bc577c275065aa0e1492302c4d677707b50c6cf977a992eab4e7d190c1e9b087fcebbf87f7bc0b225e20c5b54fb41bb6971a4a21bd6b80f756a9ffe0404be35422a70659956b48d10c2ddd2c9148845af7f7488d03300aadc4e5841c06698c7e35469b4862bebde8b7c6bc71d7e8cdfa4d32635e88f1e799dc820a033941e2fd3fc6138dbb217f57a023bfe328ff3469b8ad648e832d59199d3120e1da4b23e36c2685e16cb073e6dcc77e5088f3173ff790471f7da000fd8659f57e8112664df5ad1df1ff1c0480647313b889cc08929f76043ef97831574f5c46aa98861fb6bc24918ae4bc341d74ca66b63858a383992a9434a4ad48e53c8b1f8d4a67f78c5989c23105cd2636538128086d5b00b7bd8675c99812f7f899ff9128e36f76d7f29fb85f52e0b9e407d1ced0421c3593b2400361e61ffb8a80a53e4fb85a293eb911612c8b9e44a356eee9910c915c716544f2d41d9e97980cb52eca94a9ff0068797889cc89bd4d5a91b03293789697a0a4667324ef4c081cafe1ea8557189c799d538e0c0a93fc69f117d76d5dfa18f9906a0cea0a9f1bd35a5ae95801dd95f8abdec913132156f4e842d315f45aa23d4b636f558ab594ff43a8d38c7594174ba74ca8e4a1644b5ea9e687f2ce78ffb85539216d53b36e788126cf4fc74af42fc5aef6a9a33e47ac12d5a494f8b1d0b92a11ada6bfe2ec5c9c0eacb09b517ca46533f7902bc139c8b843ca485429f084348885ca486cf0b9db968f223cad6cdd6b3698cf3ede3c72bec068d9990771a28c936e9365cf788e0d6e2d629d469f257895aa9f23576e58643ce6f97179084cf44205e916221489cf57944f99e63500ea72c8e53f03177ad775583e862803e0701b62a5c56acb2ae34d28e947166be7233f450b5bc555b5867f594c8052db6e94d8d46c2da3c1bf7da6c9080830fa5d2cc6bd652dad7881183db4a76922243f90c13f3beb28e10ea7e9d5806c937113fe5d18fa9258f45c1a12a1a7bfb1109a3b0938a7f38fdd91388295b71408229b4725e07dec481dfc2c7d9aafcb7efb98a353d0e5bdf2cd8a53256efbe682492cdf92721858ebf42adfcc17617241db700793a4c783b70655e68d33b9b7a89f17823cfa30f03b2c48baa93fee2994a3ee85d098b20a35319a5d215ea7ecdb7408fbbedf0c37a0ed227a9181bb8b3cf78db355e988831d084ef7eecd9d0e6afb2935b20e42d1f5218f0e9a7ef76ebcad48ec09ad30bc9cae7034a15f59e78d8ca5c88f211c77edb39c6e9d6deb66dd164317a7c39fa76eea44c333cc91455c8fae3ddf83a0c5dacf30b14ba5150213655347deb05c290681d7a18efc9399ea47ed7506e52e6bbce3bdbc94a110e40091c51aa641598eb2a4c6eaeae9597d08860ed754adca74077ba0fb80170e6e07068aee1607b294a86178faa91ad32e3e1d7c7f97f36c8f7ef7dc0c1a31935cbbf0f518f05b5a8070cea244c64ed71803b3af4e30842191d3d66c74be4cf6af66565cb2a6946b23f82b2ada7b0a46bbb75f9fb294ace030cdc80a1865eab26650b101fddaa944802c75560b40d7d06377205a45098f34098fd4cc177106c29fa68ccbb4d9c65b258d4b02d37a5161aaaf3fed3b02ec3fd34edf59df480c5ad54690d0b85c61add9734f57a5bc02ce2888d333cc7cfc1b3cb180d9f31d295af135f4a22dfa826b8c03c541c9a541da7a7272404a06ba257cb425161a9cf10ac7ab887d070cc8177ab796552a9cd115ae4dfad52491189f5cfad25afd02e9045e68924d0c6919c7298f02131d54e6a1e747f4c77d1904f72d27e1e4c217275aa3a210542c918cac7663cd33a971cadb0ce13a943f47b8019a4081a9f70e6599eb3942b6abdf57feab84bf75782c22de1581969c42329b476dbcbc05fe95ea44ea15a9adf15d9baa2d1a82f9845c26b58f6402d4041f3c90d39ee8a8d7cde1a3ea38eab5907ab1542e8c20fd55540c15e00546244f58b14afcd995a225716154709da95db5060e8f344c4dcd4ea9e78bd271490d917dbeee9d52cc7cd48bd74a68e6ab6b83547d9e898ea1c0ea61b5882b491ca60495ffc5765a0fe0c16d296b3949383637e020b43f881ddab980f5daf346f59cc88508ed4c4d22c9f6b8537d91641ddbe36dccd7843022fc37b4a234f8be5f7b2da84e21424d40b91a815a429a538442402dbeffa5964323b7bb4debb3fcb528136a0c27dfa039e0d020e079bad1184e53f8e9092897b302e19469f87431bf775f8b0470b9ef55deb81b764cbada25dc0c51b0c78366fad9e0b72fb3f0186bbf12771b755c24c06d914d3b51f63b10643dc7390ec88a157fae7c101e434a58e1c78dee454e59b49d6c85bd667adaaeaa9d9960567803ffc8af515c36995bdb6f4d9ef9404212df076d67f939d0e7045ecfdcf953e02aa82b909d1a3789145ab96a68e12194c651073a191d981b55b106bac3294076221b780c197d03c1c71ae1cb92f4aa4a27127d4a7332f76516c403069ed0a8e91c202cea7728b39c5d7918f9606fc401fb8be7c6bcb8977273ea288ffc8a560d874f4c782a199da01a8debba4fdd2b7638b7cd2ef0f0d8bcccfeeafb8f9d42abeac75557cf21c7ca8b9267b296a00615aefd87592ec465154c3ee04cf649bb33582f3484670daeb2282f1c5064fcdfa89a7641cfce127bfeca48211200fbea2ce05fb762da48efe24e48f89789f328cbef3765f0c2bb9c67d7a48785f1d98cdbdfa94ce8229f2c8ae7fa24fb8c508cdbc167df2df618cf279fa3e883a8684f2f404e16131909bf1bc831568c22a965a320d637640d24d98cecbb4ed9b1d0931e8260220ecaee98c82b9bfc0b9c2f1b28e1d9ef8959787b10dbf4dbd640888a0708d854544afd7dbdafe328bddde23878c64dffb1c876765b45919c204e19c8b5bec3d87aa40a43ff2c1928b183655e2ecb4877feba0252ac3ef2b68a4f20a159303e27baf291d6d78e8750c004ba6fb95bdcb9e416455ae07424a377995488a7ac4054ef007e5b8288e726ede4189c643c6e4a19696fe4210212d742106cca9c3387d312869c2bf3bb2671be4a7ece8a61e14cbdad0d271b86cda649025b143aecaa0a0d5720104b884cf6efe5fa988a783a8b4d17025ec124a2877ddc6dfcfe0c9831b396aa9e77c1623f9958c11ec6b33db46e8f8825a60d839bc27ded4afa114073fc62833cf6a00501785017315b7bfbf47202754150f1ab4275783ec129d9430d45e6882d1e1d5e10e49bc0248208ccef36a6de5ec201fba78f3704c990f378ca03ef9159d444c872bac51681f955c9a45471c70c48388d2f1e8e6f2125a8c21e91e6b4382fabadbfb7fac89d1a3cb15450d4708bcd3f55795d52243ea37c0df189c3e12ca371aa430e3ec865d3c3c0b810ff331aa1d2ae555bb57d462c4c55d6abd6e3021420919673d03150ebe7ece55b97cf8eea1364c7c7e10e2f5014bf5fddf420cdceb77c1acf843e11d275368ac9101efbb2ae1f4097186f5b433b0872d3b1441dc8e29b538c461f32df766f4052afa47efd22c846e99e12a6365bc9371832eb5962128de997e9b822fe89180ade23c7ffa5847fdcd2f7d4449dd7dce7a4d79f7f7e1099f274de86186c47d4219d5fb7ca3dbfc784b36830e805843f61035ca0f86d7cc6d8ab214f239469c75654f93a5f912417f9a770dfdc8943da33c86278b20e52a2072ec4e4fb2e568ce2d86bc4c095bfa7a974b85bd2288437bc05d6e20a430b57f55af644737d33669adf8b6c3b075feb412dd7a30074b6ff6e9485f833bdfa4de3b6137e9cea1dcc6d1b3e40b53fd399fd4848e0aab34f442f2a117dd391409aad8d89aae2e4f3abbaa7c003ea3d2a9347c38386d32402f08bf92518910d92c179f9f92376f3ae60eb54e3930c9cd423c2c510d0de1da187df2b29ec6b998185dcc9aa88c6e95ef35741020b505a616e5c166003cd7017c2c4921389530f2eced242f9cabc1efc2394292ddef93fe106dee087af538c779bc209722027adad0dc6f66a0239df26ec3fbd56101844333af6919fde9710e7f83d50291768ff0b9949744f49c54d5ca92c82128eea0a618986da47015b0cd5a425c23909863ec9829336ef44e0941d918d1319c48fe6ebb5ee8f1370337485a6e8a6e4ed499a263223686cc0d9406d99d0ac5e46490a8dd2da1799ad32774d1b1a6f5bedbf1210d424b260fe8215116e25e364ad8079be564d14638a512a586f5eb91b61225b791051993a30081a30d014ba9d024a7a0aecb7b6cca4c10b026539c8d0c7960515dec52fd5d3c3ba9a0f8184141bd51fce13de2c85e945ad0df71ad49079f6708fc13c9c4116f98846f9289d8707e227455c7084c502f834c5050c0ffd704b366d409468bf2ee9f4818a25ffb5a6400aad4e96da016cd199a2efb145e1878f9aed01e53f79131c912d3a1a9bd81270c6b70acca62007c822c2d93373fbcdf4cf92cd7fc08f1c317e1d3ecf811410a2223e731af1a173121f0296f810dfa63d367f885630dd61521ee7154a907903cb329899980e924ca1284b0cd5ec1148c9d82c097c0be6cb5a621b19a294b88bfebef424a5400599b05c498e11ec40ed20a66055bf08c223ac1287f5a15cca138a37f62451d1444c40708040097620335057f62414c5090205da0e9e070aefa9e78b1f302aaeca279b7fad49472a93af251990333d58a6c1f071310e61837f0b75d438d2a77c1ee5ab6c217e50ef2fb8846a148dda441e1cde3d54faefb436585d2eb4585804b83a42f5830d78236f35ad3b493565f203dd2f977b228c26f3f1302d8769346181b31fc8898961d481fee259cbdc4148315319d383329934a64e579f5e12b8e50e95da333fe89cb12f48d08d558c78068dbc2762379539131e03488e1c8926ca4e86ac9948847584de883f84b2226ed2722925e71ea39867d16fcc5c7e6fd0da34ae9e496d146d20cb8fbca2e4fa5d69649aec827931cb281678f132d338ac0e1cc400f1bfea636066551a6ba334c9205f8acfd10f60a0e90298197d9adc8c8ecfb0d9bb4357fe529dd7b70572bf2dcd35c9487c18e38f426765775c71b59b85737d04c5993dbc763955f27013154483a5128aceb882b749f9e58d5f35203607fdd19aa0f616c0a6fea88c2731881ccbacdf976d862d26c69b132f24ffb5a2817a946f6a319e4c4b5f21418e255b55a38c6263dbb33b14431532ef3542f028c52ce039cad31e6e7e3a8f02b0b6ac1e098cbb01ce5765d45ce7a3ad9a8bd68e50eb8e4aa3b2e0f6add65e0dbbb74f4d25605bc358f807a5bf3a16dbd69d2b770764a013c88141f088ae3be9fb6f542c078fca6d17e44d0f084241f0ba9315fce847fd313d3a9bb1b1ff00c31683866a17893b423af691f5d9c2d7b6894e33c3ca372d18cfbdbf66ae3f68fed900cc5115248c827fd5a4bcf16edb95236a9b66659f6b9f989d148d584a6a45c85d5cd4cafc55c69da9349d83ea6111a33b1f0017277c0a7fad79dd112ba065225b1d128e60fcf78588e604f072af1b046fa184dd994874d3ce96a00dc4d03ea95411d2b8a6d12ac60be2988527ac10351165678e0fd644c25014ef43a4d2ef5cb5813006e92081b85c7aef0a824cd652907ca6b6575c4380409bb61cd363e86523405c354e114313685897e38063ab30d0d0d1ede82af028b718adc5ac08b948c787308052a9b21a77ed6bbb8694dfe2c42208ecc285751bfa643870ba4dd5a6e1a58ad516848d685d841d892484826a5e54d4515f70b539fe00e63bf9ac05dac05d8e10b3dcb29244c1be4a88d526c3b50496fad3ae7c29f85e64c19bc4426b63dbe37445e33c3cd404290b3b449cd51ee2313479a5d5a17700f44084278a8324b8b08e96a3124a42a820fc8afc06a2fb08f9d6003cb8cbe709b0408c81dd3fdb502d3aeb8245d46ace98eefa89e784053a505edae3ccc7607947bbb43523ce0156d1e30ed4dec329e8d8fb9d66ed77d15e8ae3a0906b60894d9d8d6bd8051c7fe838cd81c286f614eb191d5bde825d8428a6a5d929d6083170a86e56cc9d52aec7ea3e85ee504b2cabaad56fbbb4d686810f210efb646c0ad35a535cd6843f3c53a9644d6c8a3c8fa19e1c25d9d805393a7c34d4ec5592918bffc4cec332735dff9e92c7b329e7a4148eaf0768b86fe8731b159e370787790c8b6820f906450459ae58413b7263c6824b9325ad7b29564ce72c2a034341cfde284c44c987ef680827f95c46a6f1e1e4a4a8fec02c40ae81a032986051a411c8331c44d29d8f20e77ab0de5d2f6f244ff5b624f2568f01455f0c9120a53a699335951892a9c7e4a578be54c2c109f3218dcee37250ab55bbaf9932e2a1fceca2dcb2e48142cf65fe01ce281e2ae43b72da33d46edee8d903a78049fbf21a4f20808986e2ed83684e2063cf0838fa18a446ce93e118e4d818662a2db4e14a8eb071567ae607d2e3106932a4e2de96fe5e6af6088cf9b575d881eaf4b8c420419aeccf2ce3da7b0851427ad58cee20d0c89c271c309b72609d0f348d87ed494541bfea3d5313548525f3e322c796bf5765edd0a24e0711f74fb4e17c7b3a56d63162d5f34889086ba8e4d906c7a2b7a9b0fee6fb8bc4ea1c0217e4ece5fa15edb7e2ef4cd21316ed38cf1eaf67d47577b6dccf9d07a9e6b89522704da0f46c335ac17fc0ed2db35b5aa2069449323b194888d9c3b76dbaadc7440db31a3a5ee1fa6f1e329d2b8dfa6788503d1cc6111a0b94e47dc2df48ecb69fea62f19880f79b8b720d7152ca329cbc420321076977dc9c6573c2b0f977c6fad268702075be1b81fce4dadf5d0c9144cb4211a5429c5b81ea9a676a6c84a7d80d4b07e501b93848d61f7b61a591a86ed71cb9690c9b8045485da2a45e8e009d43155257083237bc9153a390809664cb9a37d7f24b410528e0a4c942149323f621060cef00fa36ed9170191236400cc03d4c598e52e1b0dce250c63d28af8c948555b678aad551ea320ad938318825787feaa542022892da5f867b58d7c5107f2f8567c3441435dde57ea73b67345c06b68b57d1f8d18dbf66130961101ed85f64948d2dac3459ff92c8378136d4943400d7a933f6985065dc0165eb643bd8e94aee6d43c46a9cac8909709fad89887f68496742e1ec97d166102849d8a04d749722103ad1e831f09f4332ed04a01da6ee6703402c81890842c74a842abfff615d5bfce003cca0f6091c4cb27deb7347aceb6ba5f3ccffba680565b1623b1eddb72db2ff2ae0a2a29cd7cab4f5580374d0a8d6b39c12a4f1c61fdb48936a05422a8b65eb4f03cad8f4340d13c98a0d9e86234513b4352abf167e270214c127717753e6f073b9e69bf8b2fd4e05b83d4e1000b839282c9db91266f2fd5c9a314e7fd4346d70569600070732522c58ee074c3a46eb66e032b2482ceb8906c7d45fec95b7a29f7816897d13fdd21be52227df222db0824c5b242e0fb47925c4edf86f3b7ebbea21e948d7a3bab696f698c4b90ffb8bcaa5ca6acafe1799f1e86a5a3d584268db7cfdbc9692d8a8d512643fc24dea5e2ff77405c98b91c6f5543517c3f4de47632e7bcc6e2ae4e36e66939e67d08039f77ae68d1ba7c3620e3680e97421ec0f95524b3d2b2556b2ee966778bcd3a5421208343d97fe38f7c954832a298ab623af884e05960724d192a862ddf0f851b0975fe117111c77328bf93962c9d2af05929fb8950b28ed22679796940c9220125ede1d846563e28e4b7e01d960d10583dcbb4ae6c4dc5af1b5f5d45edbca2efe38aa96df4aa164c6c70434e9e33d0c4a0e64bb16cf2bd7ebd0dd73ed6289a420f9e46b5145a9f63e8dffb9af89f862fff25f0f327c531f3513d9ca424a8690c411cde461e78b164680691bbafc4151324571ec7cf0e659547674162ed44921a56891a4629539517010fe2f1decaea9474b2706f856899afec3736655d77086b47b021d14c1675e0f370d44e2e638271346ffe0f251953d16dd1cd3c92480c1f62574782bdf3b19a7c13de8b38a800f6df44388983be32d6655bd6f08ebbe670b69a77b329ec0a249160a49b65522692199f07b4a50deaf34b747bacfdc7f45b15723cb7389c09dc442389730ef3b242cc7c795196ff50862561be4a5e42f3911b793fa49297edd11cc668eaf5d7cd2e3d8794544c883ab04c116e824b4ebae6c8e1e07021b98590cd1437f8b52912cddfd60ad7192e5bfcf4593166e71b93b3fab53dfcf028b3f8cd42c9daaf8114eb3a8e582e6c8d57cbc7eab1fd553129d2311dc83cf247e44a3ca5df62db4f25c6c497fa193b7355a4caf53308115f6a7f686b980ef60f79368570ae577d7a017d8d15ed005d95d9821d4409e45956c933a32f0254ab18d192bdd45bb68afa239590e0804ea30b3298b89c4a7d7dbea11bb83aa827589d0ab1303f210ed2cf876995968500a45fb34d86c8bd4230cadd345b88e5a171a0637a9058530fbb69b8e55ecbdaa2c15cdd380444005e7e633582847f94faefa49647114c0972e17f5dd7de7c08f1764e5f75eac3c5a8619e8b5c7dd43b78efd8a087051d3b846e853b266a0ce9dd61467d0c5753d16006c13735f58c0a9878e1a3d60be0a8154db1610332eb684e4917a40340d35683d0a9cfd37c62bbb1973d11611f2ad304cd5c031503c9d9f5187c0e6a6f3189b3a4cf190a52935cff9aa469001528e2910c10c21feb833335ea61ab5c4b4b1e9d9edd80644662e5d8826ef173a1b17be10f77444e2961b5024f7e0fce9e73a0631578b3c3d0115089d8220c200b147f97b492b2650943037e87afc1fdb51b5d3dd75f9c90a5fc79e6e3099da25d621242ba8f3b73831e84f48d644255d82b7bc58b713aac7f5d44e011bc4b2106792ddee70958697737bf95524c0a0ff407c1e6b0be0e25ce8e67094585a2b08ed35f28cc2ccb80978c8de63e16c50f20d9de140e01f7a070c0de6dab07f00fda3b960c2810dd25117aea9b7cdc0e76f711febe7c2dc52a5c650860caf8d4c4e06c7e950d8af29a6005ddf501e7fc3fd2576f1e1843d31883b67a9e0337d5ed5119fa8ea88127416ecd50da32cdeb9e228cd64f784e5d6505f4fa255b05a65c69b59bf178983905444d2facf856bbfbf7d1f937dcf8fe8f060ad20e042e501f9390c05030d439aa9dae4ace874076f2e9f038c9757a3bea1782834dd6d6c1d3e4ea955867fe802b75b758f3a93f8dc675fd92a63a1cfbf573ed763f9c9eec2ea4a9a624821cf9c7945cf0e465148235709ba03b1b9384ac6b5f7b2084e289477d2b2f22108103b4002a62ae538d4dde78a6e58aad2f04d5aac7269d05f7515dd95c72ab56710839c72473a308ed1fcfb9dcd217e075eb8465649ef74be13dcbbb06be57b4f50f85f3dc8bff37ce9076eb9b53fb12a7d149ded86f5cda69d2de30f90321600626fdd3f248a05c4ac479325824b20309a39a7319a1a8ef6c0060cf3ebabc54a9c6f28d51a890acfb449c383b388c35daa1ba42e3ff9589abaca85d76d105585f4715b3a073b4405a5235103041d2588a4cbdece0f8c243a1f00acce22eaf9f2b22c89ca119f19c96664733510a35981a492f49951236e55f3851a82afe4f07a896a9826b505e0d55c81383e875b5eb2c9b1888a547c79449bc6869538051bb6af12679e3b2a86813f24fb7d15019254962d6556de4b431b064051b355bf7d0bf77e5c28b9ef188ef7fe729a5d86fd040caf43c7909a6bfd5e22231d0dcf78c2eb876fb076dcfd5cca83efccdbd58e46aa014098a5566d54a1948f37e79c4f58f2058a8eb07da2d0b93859a17f2200eb6c41eb0edeeffa14d53868a961678a301634a5691613104fa9644d5b49217ba7b67a0e21ccc37e7b52ff0c6a3300ac508502789793c8fc68d1994f3a738403589ada8f4c738fc1e83380f1ad53852a74c94060982075f4f53a1eed52286170c7a7a000c719456efbe02ab8f3ca3de73665d854298e3d67df5e461ff38c0fd64e016b7f95ce1a5a612ec2f038f9fef91ea3d39311b8a4252e9b1bbd570003d238ac6b5c30bf368234d88fbb415b28a15ad4a3a2a001799b9554988dd81f8557357538e03b5f1654acf5072a9e11cc67846466343e08c70699d5a48569b0097d54d385e96f08f40d10aef800a135c3fe869c20eaf2e26a191f30d4a93529b324358ae2f7bca1bfa3938453f9558228e3ed8404bd4e2840a76bd70252b78c4006057a8e803d1f36c6602964584fe12f0df32be838e2929653ebfe06771351716243d6c673e911205ec3963d3604aa9e470ff36e0022abb987c63daca10d74275382b177f5b37df847ec7ff00bd314ba045f271a0d66dd6109ace768cc82dc74e51ef7917529cebf283f4f2268c5e827eba2f2462e0915bd168ea2b83049ede1ec16a01d2455d35f3841c952146e93864fdac4e13bd59d1fcb0a89f2dce414ce5fcd51797f93f0c4ef377e4fbbf7026053244fe6a4166c811c39a1abf7e83ca528d82e7786ff00b06ce7307c342fbb07259edf39ce2ddee03259e8edae98b2b51e6dff1f5eb5c4a6b1d37b940d1b9342c2f8e7a426661ae82949055b90a417914eeb95d8a2161c1f9b672b7b2bba7a0e8c4b20f270eed8a1bb056311c541857b70d0dc1d0c9aaeff785e939ec306a95ffbca6a066d70ff888585d7ad1236fc3973909c286106938f3dce9aeadc8b13dcafbbe48685c09424ef352db483e233fc391ad00f5ec820e4d9e0d1674551aafd6bdee59d25f7b9d393863b0f612aafab979754d9aabb5d1b009cdbfa6f8e7fe984e8e1fc695800d1d105765b253035f93eba6bee8f4f9fcfc6786168e607d6425eb751cde3c635d8c52dbd3a4cd8b9d54328e0d0ec1b309fc5c2b9e05fa6904b4faf9bac72189a7bf3e17a9815d63ce8e1425d70d3ccbea47b7d7961325e536488985d297ae4adf84552468e812b866252d58f455bb2b142a048ae7962cfd8a464742b036bbd040bb9d8b3d6c653d3182cc268d07470989f6d5e36fbf06d13686b83accf3222761959c36b1461564c18ff7859322fec2faf69923feafe973ee3dcca8d797896d1f872e734e9133b003025ca09f77ab16225f7630af111a24af7e20c2862580982b4f2e37a4ce387d71abc3a488e02864b18f047c11a46d8e30ee983323585807cb79795c8c16e6ca7c580fe4eca1ea73b684e4c3e18991d91a59f41073eb2622064344082e102a6de49e1fcb71c7f52961c16ac2f57d02157bc1801bb859c038ab3561992e8936978747c77a8569b1a626fa55ac084db28864881ad4c67b8232285e2368357d055342158ff45840a1cb3705be06fc266652b974ed401237d34883f6aa1f6489f6eae917bf5e22693094b80770aa58a786b2243cfba3ca1cfe20de0d7762338c88d1f2201a9c21b7ef1dcff607292ac9d2702ace966ba9db05da2614531b33a1520e831f00afc957d36b9600b816acb57b73d5f27eaadef3a11f515d89ebc27d6e33a3d744d0b73ea0d21f006e0931df70fec35eb6fa2a95957e27f1faee1f6bb26019a89870da7b52c974b0838817049f77b47d2aa88fdafa65362f74c2ade4cf4f7ac7e85389cb9654810be3d7eeeea765c2fd95ec75d3f0d2c43c93b970225f0fc7dd6fff5976282ffaff7e598f540d3257fde4e1c77288061d3cff68cd86b097913960bbf19943ff77bfeb83f19d0d93cc286b1798bc2703bfad55dd1827f301c7c211d750368f710f326c11fdbd36c413be0247f21715eaf85f0ccd8ab68c85c701229cb02d776ac768f7371aad0b8049b42841d3822add91b98a46673f41f43146fe01f996309871c528da3b3e6fc21b52f7bcd10fca3a26c8ceb917e04a19fbc76431a93ef4f916995f0d70c13af35784078386848aba3dc338c5d8f5dffd66960184687b8d1f995b15c256c88f09c4392181f02e072a10be4f43151d75fcd3318d6dd060583a26a8b2fb50c76708184642add16695894b8d321646c36168ab4965402b73bd794853d6817c76f5a1491b609b8a4f5efb8f75bcb8ea540a4b92aef6061db23f818d1e24bf866eb49eadaaa6dc7b41ea0f6038ace19e6817024d093456dfbb9a4bdb06edf62ebd7ff955a58838e53b7acfa7ba82000f2b2166cea6721a3b3c3d6884de63788712b3b50658acfefca8ebf444557cc15552de8e174693c71828140500987009403165a1cf970e52f7c42b8888506a9d36afb4b815e4a2ef784ccb7553e801bd7fc184102bb7937138ccac9e56baf9200192f72c2cc80bd4da10422de51fd56d4489a1c80dcc2e39c9e3a0acca627064c1638afd6b730ea1020c17a3f3b55e6a48f2c021d59caeb4fddb02cffed3119c8336a409a631bf6531870428ad55f99d131e3b872138c32bf9283516a8e705551526154df6384dd0f18e105be7c379b8a58441e0061513fd794b9bc0304d03d5a923ff7337f716e8aadfdcd3977f44eeb366d49cadbdafa0bd09637290019e0e37d50a021c4075c83f69309f29a9cf579ac555a7ba8c5e99d46715e5f81f7db1ff783cb234b595c22a873c0bb79375f3c1393be090e0ef11ba14d8a09d7f29ff32254e1c15ec77515cd06184f7444c543bc6cdb5b883749bafa2c8ab96e53ad119d41a53238f2025c736029636051f80918dd753508c6a9b18562d1f05352f6252b09ae979b512fa5e7c7ff76f2d468a6d89b973cc192ef6e261ecee8da3423160a341d6ab450940732e51250fd8a86bdf58914a880a59d0b28e0f145b043bc62aa5ee5c05fe8db5af64488ce1b024e110cd88fe820e4b54f9e0490f4a8af7d44d5a763b0ed2bb2d77eff363f786aecf55747590a8e82f8794495503203fa7d68ca90012861677652cb358f4ff6e9eb82afefe598354c8765a9f6eabec6fa9d0cda42258981fb67f20bbf9de5c0c9c7666904d3934f88a5283f0aa8db2e5a9c6df55ff6bfad8ba8017e1c0f4bae59f20156eff9096e9385fcd11a18e5caa1564e0ca7be1e183651cb2ea63567e433f53f0d688d4fa1208a82c6d625ed651bdd39361537ef3fc170634b71cecb657b0193d09bab1370dd53d1a5b32d606e8102f7cfc7347a223040609571fcffcc28243c37aa46ddee11c95137fd21084bddc41077dea0a5d17440a4ffe55912ec57dbf92773d8bd407d903c64c7a263592b70d1e0b5337d304c75f1e3dc98533ef78ba9d18be2a6709df42f9c229d15b57a9d47055995bfd68f7163a4d4562256bdb9947f89623e5f8ab430a502a54b7b0180afde9f11a45c1b143fbef0b178336dd1f16fbc2d53a92a5c4385f39174e6ef021eb866a729f4086f07a4a118f0af584f05474b3c07e3af3c9f6293c4a37657e4785d36d30b2e414defefe6838306b96484998686cb206fc610d7022a90753738b741e58b4775ee5cb62d11d8fa37d0b313e7c3938d757191098d7ff5a914283fef2032f64ef7867a24dd340a4dc1504a59b91ed37a241ca788247c3abb50d082e25c0920d7742dac2ccd51ad59dc5b4006ada0fb1d8cf80b9f4d53884006f828dc413a9316a3f0c56b85e81bee2dcfc4795454cb027dc4f02e652b28332a82dbafcfe3dd06f6bd31fb5094b0eaac602232aa44acfe8f78c74c9a34f1f3bea058bd39424da1529afe48b8a406b9497ffef2352b55cb6fef1cac29abe5aa5d0c2a34424e56ac608cd3d64499021413ea7bead593f1ae6356071fb510a3f36e383018f7255041d8456f941ebab96e6ad8515b15fd31a8863fd066ebaf2deac7a62d404a790c1f3fa552af24884f75912ecf00b83922eef7e9d6bcf6d3640907e2a3f5be42e6885768200e745d484f6380a7eca8004f5f4e1ca5f21d959ad53b7479dcb8b30fe4dc544f2cf679372b6145aa43afc43f745fc1fb51f06f76b6cfe1f387de1dfdba9833fb2fedf615f3f1c81a841b7853cf7c1f4dd8fd76cfbb6db2ab9c98e2f488c775a2e9a2a1f71454ada626af50107a588f9631a0f4b0fb4905b98b311d3c6aa68c96229a1b7d2bf178eaec6747a6474b402c23c4fa1bf6f4369e1a0cb3ddc7bcd359dd8c97858192f0c232c5101e2402284d84c9fb43172c00160e45140a5914586112baffd00c6041a0d8c0d965f15e22c2af9288fd3604dd75b31691ecc89af2728ffa758d568b43a34abeeea661971586d58b800daeb64de45c01deca1ad9dccbd80ff5beaccf646b3b287660eca50199ab978447e070f45afe401c091068c0f48cd00372584576ad3c7ac8dca81f84af545ad0e43a3ed8ad8f3a265cdcad06d2a8b41e13bb81d5b97b209f844975933c35d17f28fe78f4f9a57a01697a314bf797f07232fa0a1dd39a93ea3f37e8980d5415785c41dfaf525f066f9547e22a2ef77d82145d1d753df0df8c96cc5be124d5a1ceac0b46ccebb96f4586833f6da56cae5b95429e60f58ffb99d807a99baf29f8930de59d8823b0becbd570023c070ca1b87721fd8f0dec9696c610ffc95dfa016bbc8636fb024df06469b1261d4b0d736d59b7fb0261551dd648ea84a83173e531c3c01ce5652cc3cd3a3b5f9359eb5f441ed038edb8cc5da1728db42242a37d9bb3703a472f42c0134d201115376fff801e9eea1f0851ddb8513c04454f781b1b5cb9751ce03c97a7c7ec698788d2d093ee1994763fe5b876ceab8533d71ccf77a5bf6f022803d4e54719555e19e1ac2cd3f074564df363b7a19b99296ad8d68a37ba8709ec59679e516e24361535eb304f42c065f1c684cb6e3d598687532a17f687a8356bc7a935d637a97299c7088e1492f526763a16be3b934648fcd83057263048d734f4e734f8d70d6218a8d17d9c9bfa423303f50db7377d5585b3e4b0c3dca8e289d11167ed15ea6cc5341f498d09e66fae4b5cb9f51fa1064042405ddcae9055dc85761798b1ebd55cfb61602bf5073a58159de59f4bcee5d2d180d5b7d710b52d88938d95bfdcb0ce33d30266e18fb282cadc3ed3806e8560b8cc660d882a52449ec4c1f922b401a02bd2faeda7e435a2cf97d403994acbc945d77789d0fe507d97f5279938112cfca242f371196696119a3efe05c9d1ec473980b931472fc60f440612e2c834130c0109317d995ac5d32426d2028967ed1620b4b5cf72cae86e27e1ccfea8b951ae37c591ec2710fbed68180ee19cb183b8ea2e089c0b641d6eda598431fdb24f34258a78d48075ca32c9d2cc19b5662d73647ca6e8ac4edb20bfb29e1652eb03ca207566d688c36cf608468477a70df1cbd7210eb245d2c9ff2e0b3ee269b7fd91e125bc94e816e7ade02e845987d4b655588d691574d111ccae888f8c173eed6a9fe1961ec7a9917dc9378f93be2f28f5567f023e4c92f23a09b6872a0162c2de579a6f37272b72fcc6104ea62aa3d3b303b9e0418e0330cd3131a6d5fe51d45bd8b68fc6f4f9ca2c878798fb8be51ecf19929bb88a3b53e41ce3d8736450f9e9fe33e7a00024fe489408547500d7eabb6111c4f25cd37392de8a7b28607ea8997bcb9088fce3b9274de2e24c558abad82ddaaad6d5168c9b568ef16cf3931a55f8e8c13f50dcc505d6257e89f980e3d12b2b3ddc765a284bc5ba4993eb247e18c43bc8e3c6bc9258302b701bbbde3c70eaa2298cc4d4909626b24f847d393c843fbd435e52b1bdfd3e2a1a8bcbb4c8e097803d06644e5841464a88116fda5a345450dd67b295714df5a4ae0b74fe81374008098a4b8da50cc0a55b4bb6101f91e50ef2877598de71d38888f03699db410d26de4ce8ad481dc480ca5e36c3175e89386e9818ab5299a7c93d7c91360b03e21af938b031de8243e74484ab108bbadb132cc0cd4800dc8b6b3a169c9d14166ea2a6ca512436f27a0f4f3893e9ec24819c2058e7a8651b98f6c0800a0942fa08d8748446b4cd6956cd25100c1bbf89d89bedc66ae24591c6eec784257a20a92d22ede8a4c0f0cba6dd160b7471a7982c9631a2c64aa30c4c0b0b31fdfb3005c490d2a58752ce41aa119d8e1dac2027470f484b1ad9ed4b1406fa8180840e394267f4aa14c5eec152666b621c47fa2ab6f45fb527f7a654fd97a005a5c2e49f4aa22737c659dd2cda5aed7232f5b95f376b9d43d4404d274d4dc3dc2c221bc95c63498057c21cb9d9bfcccb3868d2fdb4bbfc7f764a2a747c6f599deab90e53acd82cd9eb7b3939cad2fac87969c5169b6d5d28531a00e8ef1d490e14b1b30bd0578243068a6b8875cffaf209f4b5f8e1c0fe507c802b4a322e24d47af489995993a0a5177bf41b84cf1babd516b749dba3d71a08e8984b8c25e1d06aa000d3b045e918f90c232a2b7752ec9c4c6f1bd76ba55f2f8df3c46e7d4a87d3c6d5ecf4c1998cdf51a8860068a2076a689d2828aadb4fc896d38f235812a4374cb2b60ddd10a0e1d3fc597747349923c305d006da300f2ed1c8bb5d18d9382768ece3de1a26cf1f261b89f605d9e04e61bcf44dc7c43165497c866d2d19b9d00d1a44ebea7322aaae6959ca8921e767d3bfc1b692ca5dfdcedd6de2ae4eab1ed75918c08ef84d6c45d6f850b5f48c65f1486b0391874c220175311130e7a41824bc7880318957969554e3ce14a39b0d65564430ac12027c1ccb96f22e705c6a588e32a43115ed02af079514aad8342f77b600a0c5b5d3b98ece0e677046d02529078d9e37e51a291174a4e86d2fb8f8f6da6b820aeffe3ec6879652d5b955f54ee5cbe284df84ff534a4f2d5cc10e679915d15a7ed8431339e10bfdd38349e90b0182184f0c89053dd57bce63ede097c0525f15a53a11b5c63f00df1c7226553bfdbb5c36d7f68f7c41b623558aa9aa91f6930feda8a0005198cf888a2b31be77f52004800177e0a3c30dbe8d29282e3768b8908a52979d0bcf4c51ebfa4de342f0d8e678f1ab20f3df585b897a9dba7385207e01ad5c2423de4bbccc796a9db719e87092f2cb2c18d4de456a0fbc6c3fce32961a8e7f217bcd6e9887e876d80cba1dfba923984a615d38095238ce1f384bd2ca10c6f34ad5a9b69df25cb89a63193be925027dd2775e6403178f5f152dae8e8fcb587e800f1611d9d1fbef67ef7c8709e119c1fbe2517a5afd2bb2a836036f3d81ef5970f6df62436c1e2fd4157b56166f3a4d0acc4e738467ec56afaf9b5b29aa151e5b7021d7460e86c700d0d248e76d0ef69f35e12e6e6e55338a4bd6b0290bb211712a7b1c1e74f7962fbbeddec2d6cc92cfb1f7f04616543d8f527016cb073fa717e732c0710d4547959e091e8c658a9f2c8aa48ed9c89c986874bfa0fc3ef87a3deebf669bc2f644b341e925b4f72d8d83817584fc7c736de12a68dd25a2261f179b0039bebf3b5c061d973b327f72531fd6e005d88d6c1e78a3a949918702efdea8fe0d459c94f73e758dd333593454ceeb980e754c23389b5e4e60bece41713af37f7f4044e07c7903a248f8b1d8cfb7066a474ddc52e074b1be9d46e1f569e4bdf9296039343142bed2cf3f4fec7bd6f59d6526b16504fed65b30f6431ed16e624d880de8d951f904021ba4891514463fdc557369e3bd00c67e2fc0ab7ce0569dce84e5a41e148963b925541d6964ff8954497997d28701e6260bd4dd99e10cce432b31ea34db9420f0713ddd7babc91b3a2c5614a0519da2270739fbf955724633d038d0b9b452c9387feecd72c4323f2ce16394df91e0d466874e261b928b64e3cf22959cdef7ac6c67e3634cc8f2944fba34c47db84d7dc2bd7648e80fda5d2f9e7f18d9212f5a528c8654295b2ae74edbf457d6942beec5e2049c30b65be1c470da965f9b326d1c6facbe59dcba2012310be5ad562c56834882f3b20dff8fd730166ba462d1d38705659624408bf24948d8e5c565e0c1037a92ed672b49084f4ff26cc4c40d1ec67181aa2785a6005afb3e2802fbe27277117968529fe31650c4228de1b1cf361d5d5d19eaa1a9fd9c27e142153458a575388e2c5970c2435c7b39019c0cf2dabf91aca5eea146eb69fb99adc144240ad1f4c299a4979170ad9f399e1d814fcf27dd1ee23a9484834227419640ee438e4eff9fa74a5bc14180a9c3ff17ae43e5b54f922e96f29ed4683b5edd7918701c4753b1eb5d59ccaf6009546d131da84099d6b1a80ebfa0a213c1524d5cb2fc8f90c96fb6a03c7293d5cfb6fdadf60c819c379fc23de0b1e2c79ed40c916ff5e5a1418562da68bb839c9e28372bae4c1cdfc6d4d40025b5d94fabbf12936a31f584253c6f217252e709b18014cda517ed7f3a660895ba53ae4ac50df543122c4bb2bb183f11b9ecc5ff41dd3d92d9845c70cdb8e80704d72be2cd1eb8c940afa537bcaf323b6b5b226379a80bbc1066b9a1532f0b6be26335c203358061598fff38e1f649f4e77aeef87f4911c6d9818f420229da2b06a3fa08f9b95d18062e6faea3edf2641d8d35f473d2873911d030554484889eb81f7c7a20ef3931c5df86f321348ecf296b33ea11a0d9cb84614e340348d2c04d1b16f875c3893326548d37f0bceba34c73ca9c94882574f82ff807532b5fdfb2dd31c97a0f0c8fe314b4453e1e4e773cf4439735072e037082b4bba80f4b26d1b70f4b468556bc873087c0bc9fe87ccda14d5191a59e687f100268813c76649b6bb0ad48583d25a88fb539fd8b9bb7848206c7c1a160f388446345d9c32b083192f2efeb37cdbfd5815ae30fafdfc2f60b253422460a907da1d7715f48cbebf8be56b5539e8bf7c2733826f28d8ddaaa72ae30150be1a6debb3b5333d1c291ae6fe135ef674b410240bde6cf54f3075348622e0d4e8059b9ac58238329719ac154fc3b000ced433dc01edc52b60aa467d58bd9b16ece3663c837c2be63389ef02eafa17586a12c74e50f779c6118256b899d1e95e70bfa0798fb11412f5bef40d0ce042e7457545411e5c6826ecce962797cf644c0836cab223528a3505486b349a4bf4aa66af21eb81c1c76561490a99b05ee96112dccda8888e217caf5b715c3f5ecf0910630c49377e8f94e713820d085f283017dbfc981b90ca9d0938cb3afaf07a06824f400b423f4fe4f049d43c3441c8b26e5e233842716450714cb168d0009e5faf015c213cbc61a12a553f1826c107adb56ddc22265407446349e12d2b43cc99b2f06ccb20160bd6506bfb396397d394f4b3a5452e06f21860bae7a31a2e777339997e696e586f12526119a6c654fb59df07d145f5a55186b76473ae92abf178d03733b2d52e2457bb36a071dad4632f413e4b3b4f8293b701b83c198a981846566b2a95c04ad885c80a93dd61c0250c548c2d19fcb094140e9e53b5ff89270d10a7ec9523e9549953fe698040a8f2db0989c8050ef47b2ad4755805ef71ad42eddf40fab733e36c0b8418d69a954d325ba78c4c172d97002a06045a829f8dcb76fc01b8929cb1dedd51d577fa49dfaba1870e52d95ab0ee360d15be370571ddca3891b0c2f2f799a52b0e2a7b78efeb470b013a2bd63e8379d5f902a62b35c1fb526490a1291cecda570a8219fe2c714e7435957d7963e3214a9f36395cf87a5c5d0894237c7a893819318abb43e71f7b3a877f425086e3744f093c3cbfd1016d3d5a462f0f612c851e806781bee0ddeceadd34381be8e7fe950b27a8f4a4f691c466df170a72e2da5518814ad1a42b54960f12c32e4915575639d802efd4c3bbc44135d7f2491e4852cc9266caa4581c520a55ff197cea635a9201554ebaca6ed1689690cc60c869bbd2403985d3b1f95e51f4aa209f7f399d2c8dc32b708bd5f8abe2c460f7f5eea64851ed4da4ca826988c09644f3640d2663dc3aeafb24f35dfaff7f1a4e2a5da347cd50f6d526ff0d717a9974b4cbfbc27528f753e7951a70deccb4ca54d4241b0a0f112288b328fa2da6d14a8bce4b28658638e96febdfa0e1275a31633b3dde218ec0820dc641c30a0221fc362a1f96966eacd8ffbbccaa44e2fdffc568d3c11e4c832dbbdf9860eaa5e781e80898f2520dfe9f870d724d38370272b1f0bf5b82e01980f551d3757a90fcc07472a62c3d913913e468e255a6e0ad3f9ea09440eadbc7507383dfa98caf57892638f50b0086be2c2cce2a38fcdb190a71c300273068296f4dd112bcfe5c121d6ac597e23f765e59855306781d9bec5738883d502059dbc2640efcf53d129596120e084980017c0ce202889909104845ecd645d6022c746889d5da2ac4c615121495b7d226ebbd6681bf9a0849f67548627011a1021eeab423677f0ff43edefedcec75739bb77745019c55d97efbbb7a13687c6dadce037daec19fc309100b18c856d9ebf7dc2830fc5df202f38409c61b6d7c56d538ea8efbe5fa42fec3f96ecc5b43e869da65fe09c1328d045b1ecba5b1d93346190839fbeb81b414ce0227fbdab1710d02b647d5c1c052e4f44ef0d571050c968d30108af3ba8e50c678d3d48cf5c89bc6dfd3577d3bc56267cb811a52e8aac83d57b7e6741cb07a69c4f169c34f06df8724a03d9043ef85f0531879d3fa91fbfd6b6c1341ee1df38063fbac9a88990bda5dc01040ec70da60d34cdd2b24c9472695dc2ab95f6a0a2525abb190c19196658abb46a1b0cd538957c78d267d2ac2657b325902a32942bcb6447e9c864a1ce91eeb687573bf38fb406e61b349756714b42bd2ba3693131d951c84587bf845e50ac73fbf5994851a8306c1fb26ddb3693c9047e9e49eb93ddb66dcbb20c44927d03b76799c8b027404c1f9e00d1e4ec2ccbeabd937dd263ff78222cc7b159a753923b65472873e15033699aa66dda2626c93e395bb7539f98e8ded7b2db3dc99268622786656ce13a544dd3aee338ee1509b76974d26b62177547baaeebba4929ea66d929ac0f6d17725df78eb5f29ab689b5d69ad55a6bad477855c239e79c3da137bf9092279a1e4faf076d08c6ec7e61f6cc204584930d174f01c31d9a55dfd7818766f18f5010862a6176a9d801566224552fe5d6b9a39c64c8e2223c1b3dc8cd5ac167d993cb81cfbc135f9e27ae9c49e7a107c303daece0ec3abbceae53d548efbacf3375e74e3fd27ca46350288e6366247c0d447262f17bf965af128ab555f5a76b07adf68925e7896568124b542796efd1b866814a8c6c1d8869b0071e67a3034bf8bd1196dc0cf284328cf9b523c4d0933b672c89937aed34d8fa2e47465c56df38a6e64f97d24acdd3997cf3504effc4285798c83ce651660e7e8a4c4299c75c4aebb35168fefd64a35c6142f3ef5172fc741d148439c414a511c39fce04c7bfe3f877b233ffaccc71d82354d5c55e2384b375657e464cf5c17f9711532da67288f9e9313ffdf47d3fbd6c57d82e7e38e7e4a6455110499590aaf8324e08c1c7bc0c3ff124c65846a22a3e683b885148af9a3dac6e73cc28a4624ac904eefcbc25235d3ecf9605a2476e4a7e9fffec12aa126fe8711e79b61c6fc9af928bbe5976953dcca33b9f89506ad74ae711526d8388d24a1b88459e925ac24cc4784a121a1184e55c0ae3838e1a841da414c59706f3a4593797ef43b3741885fc1ea6196a64b90c0e607ebe451d9af4c84fe5d02d7e5115f35d00c303c9404a588ab874e9f2ead241445b8c6247af6695cda91d24f0f31a22eaa016e2c1eb1c67fc60465117622c1d21082e984b49b820092da86ce9819176b5d3eba020acd7be9d63310ccfd7f9558eaaf8955fad0e2e666b8248964ce15eb9f36968106adfdee7a57398ed5ccf625d717682304a7d6a09942b4c4cd72ea5a58950a204b125b5c453153f3553535cd2e4dd5b408af160718411366f49add9da44d796d4d2c414103dbaa88a9fd9d96ae1c70527c2ca4434fcf0abe45ba572c8cc41414a4b94952865258696f8cd049818330775cf18d151b34a66e212719798ab5facc44b4cb08264687b48dbb641f1e509364c696ce1b2e58b238660b4a50a9810926a9ed0b9c2999a78c1185014b1a5899a273c7ba7381e0d5d8e0876b919558db2a03b3f6de079dd59ed1d306156b3da4d87e04d9d92863b6bd44718ed69a3519808a34694a42d130c06ab2af078cadc29a66c98539cf6728fe135575ae9a454bcd9b3670c60b7bb6adbd711d18ea86e5c57ca514a2badb423ea0e964d71a29df5f481bbcfddf493041de5a408bd3b635a96b4b85102e6e999a1c8a867a0052923ba01125f0c6909a3886f862f621fcda843137edffd686ebea2a16ddb52b004161d335a40842a8d30c6cc5c2715caab1d9a2297e634df0f683eda535457ab8391c2d32697db03c38a6704729dac4e1cdc5ac56d708ef55d066e77e0bb5b3da0d5ee13d862ed31c8a36fe6cab5f64f385fef8c69a9526b15e39c96155c7ee5686e905bde1411010630a4b8f428308a70520a97052785a52f5e20a1075f2c21c588257290841438f0c10c8ad0c0e04c5b0f0c47d80b23286e87a8d0c78db9333686d28d654e30b7c32f8b2157b10c7b6c9a27d9a5dd2d721d46c81d45811a417f5f28a1488bdbaf218a88fe428adbaf7dda030d8828010fce1003c6829e00193f0002147200840417ad46157561a57e345f4813c40d9e811b3c5da411533b1a1d1af40add73cbecc28516ae0b226e3fec2205b7bb58e37616a1db599070bbbd00baed85106ecfc08adbdb178f9fd082859e5a1ae69dd1222c5bbb1a9d49229ccfc437b5f33728114bf85bfef2390c57c475b2e665aa6597052c214d9a41b41aa32a8d8f10d61825bb059e71cb99544e235cedde96dab6690652bb7e803a0a57d82e2eaeb8335f6c055deef7c945d005637ab6ea0310ae1e9ad555f968beb8e54d98bafc85372c61d2a459d9b57376071d485e6a1514a68f1096b88804788876ed0e9824cdb5b227462cc7d578cbef7ee217851c2f7b8836a291b8dacb5ee26a6f2870bcc5725523f2207e87880a73e010cb20b7e4221ee8d7809275e022fc8439248858b695318aab3d462c0f8a6533715173a90c456ffb364bef0ca2dd003fb03ab9f94d1a765fb759be9e56dfe0b51325c3f11225796895c65903fc0c4d56bd124eac73dce61c372897e3441f7ad478e8f187a8c759ce241327b6ab1379a9de549826e990cbe55aa2a55999aa8965aae65db24596a99a97b5648b30e6386fb9e3064142c8efcb35ab66ae9316da693e959d6fd6a50a286e972a56707b6a32f7bcd6344dd334bed65d05a5699aa669da4c0e5a4124da719c3f7329b57cc269b67ce5be900655dee078d5001077bba594ab81ede260ca41d8a12e5cad9a7b3535a2eb0aa75d137ba0b7e46f40cad5c001304a642a8d01d3e53ecea5cb438f7346641897d9e58e5dc43c50d53cc741e9713ee9713ef43eefab9b58c69c3f588f934a8f5042194e7bd2e36a8cb0d2008408a5c7d9415335cf8573d24c41619402c53a681e218427c8600744e82d6bfc08018b2c6082d03a693acefd661855cd4feee3aac66aed6b9aa6699acc35ad65440cb4e8647b29656887a8699f548788c221c246988c58aeb4932dbbcb9def18f012e871feb31e0f946498e671ac55f34f9ae4d60c1373614bd8466217f53803343fc9b0b2021853999aa644d8aa29a6fa6fd22c6e8a31498ea9c1674cb28b5a353fd7b8f3a3126139f608244cb865faf09df333421c373345383f6f0a756fc28bfad1252c79eefcb67dbe675eee0243b33631a59daf26726c0617b05821c2cc728c8f7a9ca796bbb8a006c7e6fb68be8be6dbe83ad635e342758d169f3fd2b3ca18a008a21d66f6d1843d521afb24fb687aa43deb10680d6284f048f61a687acc326d45ea80f5ccd0378b19b101c3cdb22dcbb8332dc0b819106e769dacbbfb668c8559b94a696f2bb76c2b7723fb7586121733c808a38856f61a28b9c30a159431c50d17175c5ad957d97bb26ff673057953a73cd52ab2185b9a41413488aa681025e98b55f41c17244455942953716982750961495f3410a2435c44837da714e6f2e207062d9a0213d590c0e2d26b302ec26929983e5c1166107afa351aa58684c98b51d26484c915c1644ae221f4b4f48ee00d813245e1d27b311c97a39cc7844b0f0661921e0c3cc2a520132e05a57069cc082e8d3922268932a6894befc12819e3c136b1447d65a28f11a2bf492c7bc07731429ad06968aae8cb18a14b27c81561fa247191d3d01c424f7f2a62fab078c5a5a755c484094b135215979e863a91a3a7a2247a32ba287a1c5b84f39627a48a6442aaf44a979e2231490e33552f2ec26ecc21464c7a82c9ca4e994eb9fc12c72de9ebd22514c10296903fb908dff9378d692a34b89a6530a7989f2f5a6071cb151142700acf8cb0bae083220cef8c699102930bc2993b635ab838248427379c10825e3c20841b0f3c2e687c4284592cfb819149085980616a41165b78485958f1042e3c719ec993c2bb020666a184a98aa12f0b1318d161f1f2a600e3a8789956dc128cd8563d2b9e1e2a8a3a6e35841f8d0bb92fbcc288c3810a3221ba713340a25a11d3569c900ae8aa67c5d333b46586212e59c8ad807a862a8e6a4c063f3f542c71589498004018222e5c8225e9e1c7ed38a209c315793c68e20dcd4af82d41c3126a47e84a1066494b3af098d0441926686206d90e9aa8a2a34108de6946132ed034ae797a60e08b71bb771c3de165d73b81979b3dbbc6725c165336748b4777b669c89e725cef44e47a2799eb75dcb6715a5629a5cd9393d2dc409e3741fa7537f52acf4a659ad01dee80e950e7362dabb4bbbb51b4bb3babddcc62d9e1a976777777777777770e2770d39a691bd781b533795f8cc77da08985a1100469c0b9a8a31924a6fb84389e3442b7ffc51899804cb0cb13068db909283c859ba9aba18c263393cde0a8210e5a2bad343942d47c9b864c40e15773e8084d413a7600551350b3e68e98534c8c09c8046402aa193a25c106e66e54284a697ba935b24628d6eea6b56bad599669611d79d334a4c951ca5b4f8d87086e68074cc8cf6a46bbc70bea1018d4ed06ded4e1a655ab3932ed9e4635dbd7dbbee9996c395feb14b9bfb89627763f42bbe6c01899191cdfb465e699be0a52ca4d540b4a9843394e3232dc56afe940a13a2ef5181e789c75266e337d4c88c4a01bc20e6095261d911ae554dae252f10621ec88c02438b78a26a11d257c6076430d604ceda9b25ac59c808c4f8ca79075fec4439925d70be6830f424a218a9ba2f35c48785367c22e7733ade3b8af366bea342ba3df6ea84106365e42fe669b2c89356bc70dcee465de57571b58651c3f90bef60d2ae6f46d5f8109d33f640ffd8290df554e5f67ea1a3654511c2daa228bce8b212a389230f4041cdd0c1ae672b9506005159e1552a89d17578cc16937e8181643e82eadd4603a4c495d976358b6b84c7f989b43e8019015344c10668b19b4cab9e42596440dc4d8a2854aab64170f31d18c7d5145052ea02fd850a35572121522c8000d33ae60011659a48ce00654a89146d0154b6db4501f3512855d0a84c512aecc651e8248646caa70ddf0271049783ae3f47a3a6141e59eae30e39e1e032239a1bcdc98832092980a7e5e210467c51665c06a67c5cfedce81483a2ec78fab0e5529bbaba140cb16410872b534991c54a185ab754ba5e79470e927154d04260cac6ec7996c776efa6c17b9198451afb14d7aac47bdb3e592cb620fab9e8bba87b24c7aacb1d929e889dc0c8242bdb3618f28d477a0e44dab50af7fc245ba3904f57a1d742e6a8221004a64d2638d6151871e4737423e27e484cf99381b364e85973dac6a142d54299fe36cb9e4762a30efc8614bf1e2388d2d51178788447343fb039f6c49531f63cbefa03dd263fd6761e8b1be866671aff54bb88e4de20c3dd6d79b80d047f78de338eec74b4e8597e1a832ada01a55e025d72496debb528d7aeeacb2bfb8f53f8a1096406e5d5d20f51be7c364eb5d5dd38f1f3f7efc38abf0430553c789a20f3ba94a2713bbc876cf0dbc27dbcc122201a2137b5d993b636680b91ea73ec398644aa45d6e68cc060008672c076c5c4e8895b09c31ee92c392e9c39d521c4c1515db8c4bdf9c9029c22333d4f064bbdd761d9a1eb7772fc32394bc3955599d566d73f6b81a0ae71ddf9dfb669d74e7442038f0ed3e6ff684dcb998efb8b76d2012f0f559b27022f77aeef356a221cea29e084b3a24522ccd0ac0f98df89c73eb48cf4b29d1bc5e152988842996223a63ec15d5da65c68a6a172ef2c42e97debbf1ecedbdd46f0e36b949a56ebc7e52aff7ade63737160a8fa74ca292ec1b3072b94391d2ca79941c317bb7b8c5e351bac5e313cc01e71cf71a911235cb139da46cd89e7d1329961e29518f599ac59408757a8aa5c6f432bc1c6751af34ac7a501fc332bc28eec63b6751a7f4721ed500bf81aa377bcdbd6ebb0d1200e773aa3c9cf3cd80741167e2a13a67116a8587d06f3adbf5380b84a34cadb049646ac5d22e2b4adeb48ae6220de57273fa1a7434c3a3231da7347351b2e364c2234a66465c98191d6546a9531e2f399c97e195295157e699924ca624f3393325191e2187234eaa1233ee37dc2bc7cd7033dccc0c8783c3c1e1e07070c7c1551a9b3e7de9372555ac12e5e6387513696c06e9d223bd10188438e75ed2d801700ee50a7773c3c3e58e73a6a70984b38c2fbedceca594cb65379d7b0dbd26d4b76fe20493d41cc5dd2cec91eb00bdec4d908692cb5e5f72f7668de54c36ecd10b972e5b27f5db0e4ebe84890e3678622965820ad88ef32d7b8cb24191b8ec66962b81b8559c3b6cc95d4edcd17d311a8b2333da6e99b96a1497fe547ee27ba437a826b95602429b97a86ddb72c8c452fb137ab9df0071b76f1bdf520adf8d0c42e8a402f5bfb313024c62e472dbcdcdcdcdcd39b14a08a2a46e4428dc4a69df9e5db3e5137aeb33ae5586774e556633678cd376f44867d64b4a95bff4489bbdecd084bd6419b779453810d2b25ab9ad074ab3ca7934825bce255a6bad272e212b39c1a29776a73d454a0d84a2aa940db54a8a49e724b5e47b951413eff35691f64ba9b3a72a5a35256d4729a447283d6b294dcb3a244a63b1309752971350a09f52500aa8135ea80e4a29a5d73256892aff843e13c1a534b8e547b7dcd3e5cb40564d72113dcf220370c2893964de0138f1c40c326f39c97eadf7c5ad8e5228bcd444e8bb2720ecc428a6770e267104465aa6734d84deb32155d1aeebbaee554c6208a2f483684d70492742e156ff277c8f2a357011a106425c1102c70b0f7edc5842690a305af404c6891d1491618323845a3476822658e186120990d268f55d6012ea57812a8c424163707b92a6ae22314993c83fdd12b74f69104d9f06d12aa608cbb97481a06485358cd60ac4402c0406e16cf54b7e6d5d2f51b213695285552a348992340a6a856910134218d0eba75995a9d0a057f78f8998cc4693bd4455cdb1faeac46d14dc060a435fe197a641b74f29a534a99b26354d6a9a44936895499a6ea255dca65adca65fd031a819b7a91ab7e907f360a6daf1170eb6c1345806ab3f754a18305dd78993aa626010b69e60ee9c5e42264d86506a58d22cae7b39b7c0c00344bb09fae8eb455faf1e4ad6255ed50633298c89d4c5b1b81d831e286e3fabaffa3a5522a6aa8f0221256e3f71bbbe66909ead9e91e121263923f2125346f4ba642e3a7d38064cdc66a0a96a206617bdb443f2845e5e624e86e20d0e422f8b4094214fd2871e81c812d22722103db6e9a556b5ac3ecb7ec2b2be5e1998a429cd4e5fd3e719974f361f7aec03f1d59a9932cafcbe3e9032d78228292332100dbafdeab17f188892f5a755fd2a8af52585b0cc82b034abac42e5137ab72c8a1eb99f8050e62ffa027a8d715f976f16446586fa1c1786a849cebc5f5f949c11b9ac8adb9916332fb32f6e67639831d5b89db54113722f4ec688fef4ac46aeafdb5694a24862e23695dbd4eb0175b959b363aac8c86cb01c5bd1a5f71a465d2f7c5e8bc2245f10299556d1fb88f4e536c4a5f73cfe5eb0455eed576972badb2e1a381725b59ccce5ba34c7cb4ac5a4e3ad2d652285b511a67c3c95a42f8f9714e6e3f44c5578ff4c9f9dd323e7396de2d2ad8939847efb3bc84555ab71fc51a8304cb5514a05b1e47808fd8e973e2c91b70d67107a1e96c6a5449f33fef427c8cb55399647f1785f8577a6c4fd1851aa15ae01d10711cbd5ea43c4721c7221627921072202f9788b9950ac85d51021216989885a98accc6e47afc5a8e791cfb4a5175e6a4ba4cfa78f98015118c785210cfc5a587d1ff249857c52209f2c04b9c7b244c4251311cb8a5132136a153d0b2f39202f43212f51434e4dda92b6a42dc5f002cf919d98989898181c1c70c42a517cfec2fb5993170ee54afbf8bcf0eeebc385e3b8f0024db3789c52574d0eff4c9fcb60af02fd397dce22f4670ea13fada014aa94c25129fca1142a65402d88e56ab512cb711c2296bf10b144a180886518b220a23e9bcc84503ec42f3c84de268858f2b03d8e636b8f1910253324aaa25a8caa78000179c9b1f01594542faf2d6d59cad58f97e37dbc44e564424259f6e55220628c85d80a624c252e515203ca9028d9415b162ea27119c57235fe10cbf12a88e58150404b261e62b665b9f45e0fab730d88926da40169402854a86399ca1ce9dbf2a549dcc8cc9ccacc340c8797d0e73dacd81c1786461a5010172ed2b0d56a1c7f144ae625a771b954b40c83f5e951329f0dbbb48d28a901756b4046ad0119b50664a401519f933e2267e432fc12358eab9591908b0115fa88d6ce1e65b0b7e0a4574225d1d074ce678f38e48855a2c4d04d7c0ee54a16430ce2a42a1e62c9c3edfbfc08ed0175fbf2b0e593edf671c42a5160b80f1318441f114a9193e08a068cdcfa208af47cbee78dda1276531825b90d18b9fd235dc442e1d60b2390d2f239b7a09020ca077c6ea425a5e553e5033e6fb14a08a2bcf028ad092ef111a174eb85176ccf6f6c99dd9458d2d8d81fb8c696343bec0f3a280ce8d2f01456d0c2cacfa42dd1dc522b19564e29dc27dbcdc42f4b386f8fa5ffb622221d8405ded409f2e235f869c42441b1a36855bfc53e2772258da2eb57b6ca1266e72f577b495fa6bbdd13cbd32dfb75bb83c29ff0357db2ec35abe7b2773133ba5c7a67cc8cd8f566104f2c9f6c37bb499c3f30c7af1ff8961d4423a56fad30536742fca9b3e2a112681d6035e4b6581941fc656a99d7b19d2d02cc16bffb9848d398a8c90f56c485b95c3af485bab65c0ac6b87cb95cbaa092b2a14e8c4bef99b22ccb4024a925f30498ad291e80450e0219c8c70561c94445cdcabc8ef28f0c42284d9e4aa06f60d1a9b489f76b19e6d440241910f3331049166611962b9f1684e58f6455ccc41401666b4a7f0a77d3bb67a16522366a1bbb746a69430759585902136ad09a52d8c28a1b5eb888b95cad49b42a57ff5a06195e6f75d8a4092599e8f43e4b84f5d2da5c9352aa5ce172b99220822360d1aa356422e3831e4c3185292e177ffea4850d966e9ffb1a97d7d5ce278fbfaaa44170b34beb0c52c59269f31b0527ed61b352366499184e6ee338e678dbb66dcb4cd9b671db9d6c5cb79d13e746b7d3eb64eb998925376fb2b355a20dd9b39492ea7239b9d90f328eef4db332ba514a29a594524a29dd324a699665599d95bb76aa0dc912f6b37e1982dadf349bdd5a6b92e7a19a95b2a1b3b798b281d2be94dbe29cc0e42dc219b341d2dd5e7fc3f0fbe6afa6a49580a0ccf8de4f70fb91d6b46c8add4cc86896d511d6454030328e2ab53640628fbf9b267b260c357cb12e6e82ccf0220d2dab311f1cddfebcae953268437509a1443b15e71cebb6d56b96ed149d707c83d2accc1b54adb5d6ea856b4b174454314480029006818c32ce826a03308c224e407908234a701d1161841011620c8da145511194ca902209a450c9765bb6044521d3d21d512ddd1a9996fefc5265054a323082073840020c3008b797e8028d9f2354f0c2a2d51195a1041a4cc14204430c2184328478a1e24a9614bc206603d711aacb8d1fd50740f5e6c8162ec8c8b6177858626a90184230515747713a33d470034786954ac6d06dd4513477c6c800baf5ce1819546e8942f2be78939182b830bfeb2d84b63b2908745f5a2c48888a0329036f52c8df2801a60fb64081953496a8410f84d0e20dbc49e1c6514ecbb89e1cc7715c4f31e5076edf05b5d63a4190832aa2104619563c610d16d010428d2b50c0a203257a441078de38e3892e6c60861b520ce00446444105558af0d2258c2d5e43f8010a9ea0c6115fbc8855a0d182130c210d27e8400b077919cd6acdde53ac9496a0b99ba39476b58da8502ceaabeff76bdbcf499f037284908fd0ee81be6e770dc3ca7df445b3a8a156b57a352265845fbd755e6d66cd9aa6ddda5d4696bd72999024c25abf6665f4bb1ca5dfbd34ade2673857758f34b5375464b3d24a51fc8c99451a8db2117e2814a529337186b5e7f6602aa22205aa3a7e90cdca4760a106b5395ab50a223162d455bb26969a66cbbe9e966959adb566307a844cd3c4fea493ce1b5416d2d05b7e618f773ee40eeff32851d201eff32c51b201ef1371519201ef1379515287f789c028b980f78900515201ef1309a26402de272244c926ef1319a22402de274244c903bc4fa4889206789f88112599bc4f2446c902bc4fe4889204789f08122573789f48122597bc4f44899203789fc8122505f03ecb45491cde67bd2879c3fb2c182595bccf02a264002869c3fb2c214ad6f03e6b889234bccf22a26492f759459444f23ecb889233bccf8a511200efb38e28d97a9f8544c9fb3e2b899247de672951d2c8fbac254acaf03ee9a2640cef932f4ac2f03e09a36491f749204afabc4f0651f285f74921728892e4fb24112559ef93459424f23e6944499ef7cefbe411255d78b7f03e9944c9d5fba4122587bc4f2e5152082573c42943f01bad2be049c0b574deef795132c8fb3d304a0279bf0788922cbcdf1344c915deef11a2a4eafd9e214a8eeff71051f2c7fb3d459454e1fd1e234afa78bf274649fbbe8d159b217ae9b91ea7e229a5b453e04fcfc2106899d8fc2294179e2083a396cda965927a8e086526f1a095bac71bb03bb19da31da49da41da59d251e17cf8b07c603c413c423c433c443c453c463c413e339e241e249e251e25922e222f222022302442488881091212244448a881811891139228244248988129125968bf562c15840ac2096106b8845c42a6219b162ac2316122b89a5c45a225de48b849140641029440e914464116944c6c82312894c2295c8a59e570fac07a827a847a867a887a8a7a8c7a8275625e73af6c5b572c41e1755f571aed7df06ac0dd10fd6a64803d6c6c8076b13cb80b539c280b541ba80b549eac1da2839b1364ba54db92c60532f1e6c0a56019b02a2804d054dc0a6842460534311b0292208d854d1036cca68079b8a39c0a68e1a6053480cb0a9241d6c4a690136b5a4007be34a80bd7935b1373004d81ba003d89b2003d81b2126f666a800f6868800f6a628077b63b4c4dec406606f8e04606f9070b0374937d81b2525f666290016c76583c579d560716034581ca02416270889c5119ac1e20c01c0e210b52c4ed1b53846472c4ecc88c53992c1e220c560719260b038452c8e8fe5f182e5d16379909607cbf2206279f0581e3b96071155f55db03c8aa8aadf82e5614455fd95e511a3aafe10cbe388aafa422c8f20960710cb83059be35ac1e6a86c0e8caafaa3cdf9617382a8aaaf82cdf1617386a6e47c88205c2d7b1d3be78e7712ac5a73b6f09d0711261150e491b4138bcd161a87159b3ee0fb3daee98373fb46b484a5ce0bb43f5e33488f3640d646b43630aab209cae17adde6918492c71176bc942f4cb97dce962fc06e6b79a25ca15ce1e7f66b8688c25295a3da7955435aea5ace735236c524f59ce7a472725236e7399f200d649091654f80c14ba88b30f5f2b4745a3229f51c51954949b44f99623ba6582a464638554394dc41a1b81d364ad5d00e1b335b42da1f8bf6fd03eb517cc9d194689fe21f578f3da5c7061580f39c77a00278dc464c31b19942139688b56c2ea59563534c72a04c34a268e55c4acb9be122a49447d20c4246486f398b887a8e7adc89d9f4b886581196395c3b2e4afe392fb9540e570ed7bdb813cb1167efc47a2726ee7c99310ae7a5cfe1615da616912497a935a9aa24a2747b27766f2caa552d863dce968d0b30d889ed205152650591185680b0842ab8b4fa3b4994f4c145050ca4d872c50e9cd0eaefc4768ec280c140ca8e6e82048f6b40460e28fd8b83497983838cf0eabd18cb48c0f0479aefe926b1e4aec643b4eb2354fbe7c5d591bee1a1a9aae7b855d29d465a862e27de988ef3238df315256b666870bc136b2c942b486ade36a9c76ad4e3bc5f7a1ce94bfacae8abc91d481446a59e32d1ac206aa5eab8d50c27b810157119556a56d947b7be6622c8b6dc4a297dd117bd95b6926d30bdb4e395fe181196ade4453b8bc27aa42fad959ae4567d2f75c85154ca768b660b7d5172b50ab7ced263159b88be72bc6c221bcbe313cc81c79b5bde677958ef293b5b5f9594cd3dfe78589b56ea3bac0e4d5bcd5c070f553bc3564c55fd1628306a0dead00c52c90b507185172c9cb8c1088a68d5d750bfeaa9c7b13796652c17f11623e6c231e097f4e5d6d7224228fd2bd9fb8f12829a93805b3562aa859f7a36aae7a1aabd76a9ae1b6af214e472b984d872eb998da25b3f2b1bc58c6add34fad3ac6e8cdb6d1bc78561bd768f873a6eeb590dddbadab8edd218caa57931ff4c26935239c66204986c1cdd324b7a985b9f19018cc988308bf4fd6c3847d363ec3747d341cbcdd174cfd6399ade4b26d3cb3635534f08a87e26cb5f0571e0fb8961b74d563659df64795cc83ebc2fdb8838d3d2f461139b1e36eb27539925cd19a413cb275b786a6a7f60ce474cad1e05ed753e11080ceccbabd6cec8185c96443ba56c89d6ba44c9e6b83044a1b2244c92664ec8deb8552b8176825bb515dcaa3971ebe7ac722ba723fa106fa4eb30b556fa732b9df289e557a3892e315d1a7bac1cb3a597cb7adccbac8ffbf8045751669186cd21f59d77ca74c6930a1e53c9a8649ee9cbac567b9a2e6549354bca924ca24e57247b123ba9eae4c19023cbb21c346f1f76fab0d961b03c6506e127b14ba88a5fc436e991bbd3c783f1929a642f41993e309c5fc324939cbf64b28a9c67510b975597bd2822eb1255a900c67c45ddd9f4f7b8ca129a5e5e67ecb15aef9d1744455c84a9f0905a04837de145accf935824ef9652b52eb51746c41d70bccca1a1a1c1798e1c38383aa724735cc83d3db716f1d26a1c8baa495c026bf62553cac0b46b823e5e46cee757b34e343e5ed2ab23e487ea0ca6eb29613adbaf76b5202c394cbbc47ec970232294189ee21b39b7685ed6a56cc966607aac176233251d9b7d01c3e395c77d8865739624d346d84658d2a525ba347d3ad00e798c5dfdb32d1c8935721fdbf3172cc943b4c4b52e7db9270af928c4c76b76afb37c3b4e26acf9a7e9b77d3d4b2f0591047905337dbad7a556d5735c18d6fa5a44c923afaf46cdf22839c36b4fcf6a7573c6f1e6fce6e4bc0cef4beee67c527206919b2ad3730010722d714ed315e73479a61f3185b92613ca8432994c47cd499a5e8677079b4024a667a69bc024f47a15cc815d542544c8c74389c1c8a31809f2236de4743262c48811235162789456b762c84186c77030d3877c3d2da2a491d753a366f5b05ef6adf9e121f535445e9ee7256ac7059837e4f5744ab356af2d4c1f9d8bdbeff6e3652bf1907a9b1bb1355015bfc79216ca0cc28fc19e2cbfde3f5c240a935631eb878808e311613b30362edf857a1ddb820d3fcbd529cd12227aefc4767962a5e9560a225eb440c4f22c88256a05b10c5b2536510f0cbb9dd8534691c3fc68a5ec1f88c4c792ab599d0f91ba7a9ca2524148976898aeec81f98b52b338ccd2ecc41e18764d3fd22b20a092cd044c105dd3bded53c1eadc87cdde43491d5ac5af610e06d583a2d1b1df0e5456e35140988a0c404c224f8ff50421bf04b2d4994ea74e86eedeabf7fa0c4cb6d475412c5d4f861e3d7e84f6b0e1455baeac2dc7fadb1f98e3617fe07b634b9a942d399b259afa1a5b5226dc7a545dfad54197eaa54962c2ad9f09652caac7eb8cdd263ed96eb89b80308697345dd79dd8721cbf2ef72f88a5fb8965f71ef8754d0f62696bd8ed4e56037c8bc2a466955a123cf09f8fe960966412b919640339068f5f468c183162c4880c4664e0570c4f364de98546024617ddda3d83c03e7f91dca4307bedb169f896a88c4483ba2a318b70161e52ab0e0d3755cc379c25b37d1946c906e29810fd185629a51d7df71eebd86335d9668261d513c771bc29439ac94a01c143ea7bac291cf540a0c21307a1bcf0882ccb32304910d7e32617039a9464cadd27156bc47f6c96f75ae6dcb28180b2a07058936d1a71bba67b1cb7713dd62ee3328ebd9e26d3ec91d2a09d5bd22c167f142ae41aa8559dd840d3875fcf794a749d8c4c4dcd988290a6c9ced64083ba69963dbd3bf87a9dd99a4fb0c966ea616711ce3287d467282e6532994c99dd8eb2dd5357c7ee3081f9cd393e495d9bed59c67d99d5ee35e9318ab0bbcd996b6ca99344c7a27a449d7b29e5b278be1ef88120921e0741ef4b9a559b984c5f73f1fc90671146e221f55c438f75498f751addb0a4c76a7a8ded711d6bbf59beddc424273055f57507242ef28487d4d72a7e133d0a22e9c419f0062957bce8ed404920a8aaf20f0fe11f99c3a8701c67534aba9a7703e85ec3a58e3a679d706716534a6a4427dcf9ddcbee9ce824256e9bc8404c056519d689369eedcbd6f36cf7b01d245adb429e8e8fc11ab1684b162f49cd48cc04133a352fbddb79a9e39c897848e53eaf492c4d672098c93213a820a622321338b6856c47d163f528c84db0890aff21fed86c0735132f99d733d10c4aac11cbae9f0d3483644192410a4b66246f96e18c99517459b833664612d7d3be1e96c7459b736b7f207e98d6f32559388e157c14d9ae8305166c3755a621a5ea9aeec39abe82355d654d6f919b414c62d9c38a819a653ab79541dc1a9b7b1c8e6caab2e3f8bcece50b676f1042d3391049f61bbecf64e9d5a6f76f822653786f6eb22925a8eca8cf9b030e00f58c99b974d2c3ea96ddbddf9cb39c98529289a897a8b3e8c413734024a8f36dd0245670ce20d96d2c0826d19edd64e9f5b61e56d749ca864f28e3537c28525a3f1ee5c7b9f5c376ef165b25dd3760e4f28f1f3f7e44191fa5d5adf1600e2a7c3c1b713d67993ede2bce4b2ef5b26f1844677df81c4bc3c386a39d1e50b336d14977ae7e7210256f9ab1f02baae2882cf28dc8b01eeb538c054c82ba771b5b83baf78a7aad793d03799e656f9a02f4d3963d77da506fe95d1e71824926067aae93ef31f76a287bee3c17f6b8dd747aed4ba66ae2c0b9f3333eeebccc7c789a67f17bdbef386cc95dcff31eda932d7f5c4ffc816f8c4863513df45c2abe860c881eb3d99fd39ac452e7ced93bdcb912224658b22b0b09dea2795632161a3b9b48c95d8ecb9e95402e77af5686d22c76b52a3bc7856179d3e73b65a22fd9c56239da1a747ce0ac78c0492ea1aaec939bf334ab2fc2f9920625def498f11429b3a5619ececa73be4757b3a6347883943be9d94bf5a7c9946a51c978fbadb384923bb26c87a883e372cc6cc2c0c343b973afd59661a53cb5d6c432884bebbfacd6ee8686e3388ee332283dcecf581b45f74b329a1ee7bfb059f445325556d9b337c9ae43ac075f786e76eff4f698ed6fdbb26769ba3c73d9e63255652f790669910a310ab303d159352bcb7e43b3fad997641955c22b7db84e7808ed5bb706454a4bbbe7696f9b89fd5a338daf6513e501b9d9119055102d256b6a0577b73855384138efd139e79c993735ee180a26a197e79c2514ba036f3217e1348305a81a0669f8a5f554670df3d21aced92c5adf9beb361012d09d5aee8cb5d1e57a415e2127f5c8a9b0023eba652d398945f6d223f984d0b58577ea9d7aa7db3d26847cba7d9e76de52600a14958cf7fd6fdfb679db46edd863edb1b357d3b75f67e34a150ef45e8a3b7fda40ef89294e54325eee9c38721cd771dd970c9d6de3ca026f52e00b1bf7eb32052e4c086b8fdc953277d6dc3b46985dc812c2f2574bc59cdf3d15e3fd94e334147bd77e9db1331007fe97f2de9f36f03f31e5894ac6ebdd1347af037c3d11488f2d9aec122bce4b46985d47ab5e7853a764d75774092567bd1622cd24f0aa2a42fa1525e79c7345275ddd1b84dee45457051496fcc3494c9fc97cab6d20d796b579d6ecf566975f94a49452dadc10eae332cee5154f9059a40938c91eaa629feeb9fcc9db575f84fc6dfb2d236c6275e8b19fcd5aafb16e9072797636555f72cc71b5be56e69eb0e4ae766eed0d228181e76aa7da3dea65b369c699c6af97ff6b1496f5cbd5bc5ab9ceae9ad8650a56aecf9d5da4a0743dfe78787aecff305fa6b89e5954325e3e8bab1ed9e3415872a9f9724ccd8f577b4d4d51c9783571d5637fbcf596dc7d527fa8f7729517b764087ea3656211488fdca455fd9edc3cfa69046199da3e3fde793eba3dda717e461e87b1a58c950bfa63172c45b3fcb815102e349ec068285d66c097183698cb19453db40951a033f8053950ca6239f872f9256043075174f1e6d308c3697cb97cee8934bc5ce697384f809fb0ef09d100070d446990a50209d1004b65a308ef05191b534026b4ec8d18136cda1338ce8dec8b1850e892c235d858a3cb11bc35b67c62d800e4b4b8fcd81a587c6b0871376b7409ca96e0876b007589e2562882c233be54993380c4106286c351049a9a63e6f2d71081eb8b1d5cbdd38c2d5decd0c284262b6a4c556c6a8a8d2df574a7195b8eb8d9e2bad9c1971d2011ed20c6e582c1f9b42de017dc1078846ae4107d07423b086226760014da8a86c8ede005d3d101e74307496018cf0d15be2e8daf8d99367e7c5d1afc8f8c2fa6032eb833867480850d2c3a68c175e9b833a6831777e47d612e062bb0010612158dd3ac80850fc823c388a32d574b1140be232c47568e9848c1ed1b11ce581a5d382842500a42740c61c8eacbc1d26521be31c313e245f84de13a7add194b83e896e19d47ae3b636a28dd12a54610d4e872f95f04626820c5d038ba338686d12db3d79dcf72670c0d2b77a211050bae388128c219fb8117208ce007602eff33e2cd2aa1d6a5080d5809030ce13f1d201f1aae5bfea68bd277c6d02d7b38073477c6c4309a398c1105255a00852b5b7869e96022ac8192a92550aed07afa1639aaa224b7b88aae2da945c514ea54c52dfc14f55015936e4191d21aa98abfa4c9911ab8590a9dc586d8c842c199410bfc67a1b011c048b145ebbbf7f197d2ea148d898981124365ec89eba049c69db11860b9554e628f17a38344386f5f24ee09624ca375fa67a1788f79eda1dbffa18290e638ce48f3fb448612fe93c249b683261761d94141321d14ead0220ced6cc91c0ca22478997714f0df1b1453f5dfc37f8f2223a6aa98ca01bccc997c0f0f9607e0a125a825020c4c2fb74a2846d981aa7a0955f56719b05678999733260419d107a418a614b540d1888da6d26c4d90db98412c94efe0bd1b6031420b14afe88805c15398b1822fad4fbca2c30aa3366ebfdb983e93db2ae529a6687b629b449137511333b16c2cb7a90f397e5c9f9d2d2f8825d444df633e732950aed00f4a8c14d78baa38458fe333457f80f038c428e0c3cf88e16c71100321e92c119ec4548d11537404a098aa220fb598484c5131f5fd00e063c42857be833fc0f798c77c9fad232dc508227620948497a1376ad06a1c63bc8009274cd1041743b47ce86005615021c410a020a2d552b05842164b683c81684b125afdcfcec4202c5989955a296b2b596e63992daad35deb98325b86a3e0ee20223128afca33397091dd5a75469729a59467a55d2a63e79db132a72012993748c316e408e1e9f331e7afb8d5aa3f066908dfdd649d50f1267152ee9106df163cf5819235473d8758723b4e232a1d87b8849235228ae36677844e3049f86ec63493dd0b3b4ed1cf6bfac9a61ea39dfc222cf98bcb0745203ed187272d63809fa9c464890b6acc585867a6846588ba41f1e7d156ead6ee43932c20a6644a318e42a35c25bb063822e8db70d0ee030f4b134111dc7a293e4c1903fc7480ef01745c8718848eeb780c538aae57ad9218a614dd18a61451b18a2b862945ad20748857fa572abd0e7ba55f7f19b4413b02c4617e2ab9f83ef081e0e3b022c21bb745263d2e4125219cef640cf0d3ac79ced1313fded4296718b03b3f73b872e478f51846f89ba39f634ab3aad4bc9fa33ff0d452af0bc2cd728080c419413958f8222c7762497a7adaf4fa89354336441687e808ad56d412044ab7ecde4306bb608e6da10644889137086bde7d27d6acf2b4746bac4d9656f5391ba22ec2df9aa11b4cc1851056b690f1002028788006195698800a4f8714a1ce4be74707a643a5599e9d399c03766d4e07da2a37a7b64a0e98a51e7b24f5d83dbe782d822a9a009ac2e9039fa3e3ad6931aa21158e7ba045fdb33baec3b290e3a590580e175581df61bf9f4ea7d3ccede9ce3cc7dae8b0aaebba650ed74948172147a290588f39b1a39da4f75543a14cc8331f28048b102c4288c09c83e2417b100441f0ab54248296222d94cc39907bfdd9d8f986124c589a685401ee74d93902c59d980ac682b0cce1da89d1406f95dfc615c61cfb25bd262145ad7acdd0f401bf82ebb33d42c298544851f7696c88b80b6950dc111263c56690064518254531270c29ac4752f748da12762f77625df6baa5cd0a412bfc582184e584c4aa15b7cce1ca84b8650ed78e979da5dbd73cdb5755a41aeab1b1f4d8f4deabc87d5684f352d516559639390c2592306ad95c4aeb48f708130e89a295ba94d64e6ce7a859f42052b37088ac85bf602fb80bde82b5601930166c0557c1573806fc02aec2523014fc043bc14df012ac04af8093602418057c023e828d6022b8043c021e8285901225041ff000077a3ce9001020801204bb58043c8549c02f2e827fd8040ce3143015560103310b98096e0107b10b380a9e828518066c85a9e021be82b170164cc45cbcdf734449cef27e0f12257906eff72451928bdeef51a22483f17ecfd20bae56d0f491790b89ddfef60ec60929a2aa267b24ddc371bac71f0ff07ad94763633e634fd4c65c6fa35bf336b72d263c0e4b73d0ce9cb5d81fce60587bd16ee05c647d9cbfb01a38cfc0aa70f6c2fa70ce627f9cbbb019387361c7f31616036722ab3a6b612f70cec2ae709681ede18cc5b270c6c23a395f61819cadb0e579c8063957612d70a6c2e69caf581ece56ac90730c6c05ce30b043ce2fb014380bd9d5b98a9dc0790adbc2590a2b817314d685331436026717d89df3131602e720cb7376c23ee0dc024be4dc84dde1cc84659d97b00e38b3c09267256c03ce40b6e7bc02cb80b30aec0be724ac0e672ad6e78c845dc03905b6c819055601679885e17c029b80b3096c0ce7236c93f38f95e16c8445c0b9086be44c843dc0f9658f9c4b600d702681bde7115826e729b6751ec216e02c020b80b310960067979de1526c0e0fc2227914bbe4506c9287c00ee020b034fc03560007c2d6700f581cde016bc339606ff8131b80f7b04a2e6359b8d49ee8476df85b7bd662377006c3fa38175915ce5fd81fce33b03fce5e580d9cb3d8f1dc85f5e1cc85559db7b0193813d915ce5a580c9cb3b02c9c65602f70c662819cb1b03d9cafb041ce565827e7219b73aec296672aac90f3156b81b3153be41c03cbc3190676757e81adc059c8b670ae6229709ec2ba7096c24ee01c85dd39436125707681e5393f6123700eb244ce4e58089c5b6059e726ec03ce4c58f2bc84dde1cc02db7356c23ae00c645f38afc036e0ac02eb734ec232e04cc5163923617538a7c0c27046815dc0196663389fc02ae06c022bc3f9089b80f38f357236c2363917618f9c89b00838bfec3d97c01ee04c02db3a8fc01ae03cc502e03c84657216819de12c842dc0d965915c8a25c083b0491ec5e67028968687c02e39086c0dff801dc081b036dc035600ef800dc0396071f813abe43dec0d97b1aaaba2d245a8021255650fa3db9f41222c7762a50a76755e2b00b5aa2fa428a987f87e0fa41e4794fc4b2145b747d2eda01e7b05d70a535678d95871dd0dfc876be0efef28513203efef2c511203eff3b8287981f7795e94ece17d1e18259dbccf0344c9f27d9e204a5ae07d1e214af2f03ecf10252bf03e0f112529f03e4f112527f03e8f112525f03e4f8c9211789fe7889210789f0789920f789f278906ab21a8a40cb586594c95a9111100000008008314002028140c0784a2b1502820a9b2643b14800d8ab250705499085a9263ca186208000200000000000404a34103ad9cab2ab24c6020ea6d7a2f35c769b9ec2bc8072869d2ce1431415c92a27a98ad2ec8c34a73988b66580cae8f803ce74ab577e5ae22b344b802a0759a07f4806106592a83a393ebb617650da8cfca3705aa6c3dba4d93333430d94697d6d9177c728e8e3200ae391d38323e2305396ca4e24250a6a1431b6c3cd93e800020694cbe2b7d995ce1283ef79e29aee52a7aa41f4b6d2ba7110f7d5713a741fabe6c0996340bcee56dd760d6806d7d50a1695ba39458b9eee50e04e5c0cdc10058237c51d7f4738721c650f65c202eb2a1ddaf79d3930f8e2df964d290867748664ba6e61aabe6c1f5bb5bfa14899283fc198ed29717d35c4707a27d861efdc4360c5f7599b1906254323d7892c3b3bed4a0f5a220d4ab571060d4e322c815688c1d712cfe416023d5ee8769ec0bc1393b1749b913ab1c38fd897bdd859cc167a4ae56ce703e04b660f0162d60b7d862ec72d52d0b44b348d5b7507ef9d3c5869cfc7b2d07cbf19e67dde622777a5888074a2eca9b8282209a47af7f8d892c7e2f727906c58a7d8e842662d3a310b9acc06289516759dc406692c7afbb4d29b9018f1c2624952b5fd7b13664a5f424d1e01eca98e5eb6ff4743bf3f5c1128f61a256645d9a563469207ca5566531bce65fee7ba3468f8f8bbfbb65dfbba47255cda462cb6222f731dc69f2ba430a240c9b12f0d4d6b68a2b95839da36de1940c9bef3c786e1712fedf7360f8eab243d80851cb60609d932a552815bc6763049dea0ac3997f243e006cea759075a053ced5df299e2383620b67e488dd154c35108dd95de2f81d7b738a9be72e3c667caa369c09506de88d4fdbc719bc0033c4e52058cbaee1acafd2b614236e3ebb141741c14d0152200ab0ef770e736518f4b09bc30f301d859b947fb04f028f54634c0c79541e28ded132b8c6f18ab0ea5649f26ca7f1c886e48b8a8a051f3fb22398ace18e989e26e8eda86013d8331640c8acbfb2804c9ea7a438b8b55a4fbbbffae24a6632f56072a8976b4b6302b69b69f101f1ca7dcb7fc0acb04647b5d50c648398fc14e1e1c2887de739ec33ebe3c6a269e143b3a689615d669e35916641f33fdc9680c0613bc6991eb80cf841aa141a437388b0d51c6689204667c20df7720cb0657e4ca9e65015b4af5bc1e0150d5df7a444cc7a2b55b9bb378d345609fdb8ed831ecd83b9031c1c53f7a65dfe6a50ef392eea0a955fe74d6bfa94ddbc49a191301b13c02c7d7360620210c4ab034ccc395d788cc60b35a150beb8511056c91d8bb31166c177d3feb926bef567ce114a61dcbb02e392bdf0020c8f0cf3523c768c6722d965aebb8a6a6efad42a9820c43e19608a97e46ff38aa4a4c64447c4ea3e668d5e7d84194277173ed386650e670d81a8ca3df352bc469414a4a919362bc37d602904ba1580e5618ca159fc7ae53e951588daa10a1473836136feeed46c67eb50a1e09a25a1a6e0fb3be4b876790b8a838e6bd5eb48b422149f4621d539f3cdb57019ff65c5ef50bf23d37e17ccf9347bdf4b826b7e0dbebe09c3505a3bdbde70dba9a588dc7089e556614d81a3021bf159527036f1395ddcc539641b4541183304d52ede412e29d3029b8f17365e9bd401fa03f4042f994eb11089ef1d1d6f25e92b0389ddc59c9f91f0c97ace373cf572f2bf2d62473c3955fc80cf27b8a2fc0b4d79904321f50a364e609b0d1e33dc2e4fb3fa1416fc4c66c3b262c3c0697c80c5ab66b45849276add0ac6b3d4242fe3437a014d3048c25ca8ad61f8c8ae7bb2369f9f0a22f988749b4deb688596532a489253e16be23d88d77b915c5bc31c1f490ee98897a4704abbb78905a2e83926bf9a2053eee97de9dc4897b5b8b6001e44262830d8c9838bb008d55db85d0e3e35ad163c16a7d9f67da5cc7e4fc8793a6de0a8b6e8cf6325090a64b09074eec143e9d58212747c21030234e963ae1a62081c8d7bb239ad32fde8fbd5536f94ba9ebe74fa1cc958de137701387ad2a423afa47be0d30f5e7d66a856cfe8daee3de11c4a132179b777a53b7634bc2061a0ba92fd3d352b52487aea663473a491527fb15af13b47dc936ad552119fff1e30b9dc158870d1651292ece9849f3579da6b89f8f3b86e4d5fa1c51056ab1314310ec47ce04978da46a2e2e55fa767b3fd499b19afad6ae74d8dd0c0161f7972e4379c13a0d715206f407e5f94d995df0999c564510bad4f228a7f62f2892636085e9b96c9d277839a2eafcd2b8edafd13de22bff2696b2b210c74b0c43f4ab42e4bf68ed51a99782b688f1e08f8d698c85f2a9abd2a6700cb956953ff2316708cd730a80b4372d213bdbb45456ec92d8cf3c1639bf64dcc49a76512b3089f10baa456b22039676383a91386bddea8221d12d90bb8c64a050dacf7e29bd18731b5b45ce4c2a2d876b2a9bc4c218617061e956cbda015e8acc4d7626d021af2f7c3110d5c43f9863f390821e7a5a068ea5a7a757ab7de0e8ab9f4378b2c095f1eda3c1bafd3a0f46fa4961401bd50bf891395801d6e43c310cde64183a2388db67beafcbfc00fc4279fb3af8db56c12a3443ceb393f65621dae00b41f32c87fcfbc7c725479a56d3b8b37d231a9bbe85590be12951c1aaf55a9a00e2b345f7f94292dba16ee547602aef63a0e1fe800b40912a45ddc8891b751f637a4d4bb57d0354677127e32e8825b271dde90083c98eaa435667218f003ba889dccb5485cf08d6a7390c9a5ef0af5d27e5e73a0771f55201611ee3132649d8aa081a4fc0cc9a2351d641001e779159d129495806b133beddeb75b9b72f44788191c743449c5b2ee98d6bad088427940409f1e04a5fcad8697272fcd5bf4c0f5e09e51de80e159a953905dae7d4966faabc1e85f043bd55029166c20de0497247105ceb9f70864a6f0a425a4bdd32494b2083450f7be969ea6007bd4bfe543d0b7d7a2b03ab7b1def861c6c6ce1bfffc51d13f2402b230233b5635897c6989d1af86e09461fe7189607da75904ed5657b71afaee777a7f516727a029ca4249239cea847c883ea0191b2ee69141036f8d60ea16a88b69825b7fe48b64e82f63c623bfa7c92146093050b4e3fcd0b0fc74f2d5ab17849de54717921435482b38e72f5deb07a9d8fb03e3ad312082a2946db08cea02ce2b587274e91874fc22b0274b3fc62c20949e4417ea0dfffb3f1189763f732b3a5ddce8bb043ee76437dd088c5b63e43b84907599b4d764ee7a66ad4b4681eddd62f370a7c8cf08d30b338331c70bc4452dba8849072345ce466f61fb751e5a17518fe8a5ac4152be18e8136542954e5f3517ebba8a106b38924270f07dca77d77ef344b47145a7363b2456cf14e0e88e4aca036005d0dbc9284fc3ffa2cd5605597950a2710a602dc57428fda53feeebdf0bf75742f7228fdb269efcf8ee666b7bea6561571a2461f46fdfe5b421008d52031c7f87e4ded41a067a7c79b4a1d1d11128097658b7dcbd6a7964d02d01e409c4ae43281aac09809a44b0228dcfa2309e843e8d46d554478e9d901ffd134cbe47023a1b186f47f886ff975c8cd32a60b4062c84466a3af89faff4dc1ad1d03a77a089c1a3fb49e767700d028c4af719651cd83e4376baf50c0301cecadbd5aea660bdad6cee8c417d75b9c9f20c0d73ab6b0b2d58ababa426539885c0752dc7b08a01c8582ad80652e29a65004e7cdeac2c0d7fb3a3bce93f8edf12662ddd031dcf68ad4127245675a73b61b3d23117f4f37e3aa1f853f6f29d1f5f897b3408fa0e8f4c2832e64b81b95e8086850d2b8b2feb37133c49afa9fc6ca2a25133505bc01401639e7dfb134975e59df1acadc6142233387a6c6db3f3728a001e878b37299f64f07a55455e86a3eb77b772353bbf3877fe5d5a86c373aa0a3ec432d40819e7f4a6edb973c40cd6cdf42981540dafdc70fe80c0f64af76d2207d08a7b544962996d77fa5b65a0d6746bd93acfd1c8395376a73ea94fa64beb377e32c8ea3a23668b304f6de2067680323c2a0400310f29015c3dbef93d7e41dba67c5ad67eb254bebbbdd426965d47cb521921d65f819d69e304c47e556363c3263a774007d8ef31c1e508c73d970221c7393047b2374e130fb8b59e148dd171eb07972cdf34c1eb8df548cce9a28c51003ebd265aa6e8bf72f601987b9bb9c5ba7121917a4f269310f4c4002c85025066c2ea1ba58e35d203b03493c88bf8234b591d50187e4db4524c314c33ab689ab4060cc169d8891bc419f75f00a8b319e9998a3b812d24f353570a8c52c6b39ce2654b8612884b34b6fb4c5318bba707e2dd7a1ecf60893ba3028cf70b78a4ae07c7847e6c25a72f1808418ee569b5727fc62b03f595529a592556153a33809e2ceb8872c145ab15ea1df1b05c0cf1fd2cf1d55670bae450d1e8576c89a93bcba238a598923f876ca1ff781199c9b1804b165a64bf2221e1085cdcc48282f1f48fb9a87f58cdd0b92c5b1465b8163df3f9aad8ac5945c037968653ed0667913c9bfada04b5946c75b4fb1e52a99a90c044781c0b6fe900e46657e4be16f3e8e315d5912f4d2785481e082ee6c68563e787218aa291358183aa4d372a63af7f2a99b3c4e2c0dd4ec35528b951968347a30c58b60168008cad523ea8ed2fd324df4f1b0a9d2eda0b43ea4f8f2aa89c6ca90236f5990240c0e0434fb61550a7e2ce4dfc9c41b631d1819511b9e9fa380b285c2919da9cc9d4f1beddecbe3ca30ebec672b367a1a68b1dfa75a67d2af3a96246ca794651003a104c392f0f34ee12d69ce54731bd8c446c030965d2cfa3baaee371e7d6250233023aeffa702aad704c02dc93a94addf52cc517e3048dbd0b4fd91186782726b1505ceb436a227b1abf062844f7908723cdbe38a340036c7014fe04f8551fd864f7dbc85f9d5057059d181ea4052d69008e2ed829bd9b4aacb1bd96fa8d5a5e6fff2bfd257016a4f5e00879c9e692f8353a3524e220550e31bee1326c6e0addb17525b527fef8915ae83a75dc70da00a09e1422e93367a325f509cd4d81d555f8cf402c7cb35f39a1e2f8ac2000389227fb676945e020acfa90e5ee6aefd6aaafde309f630ab925768f1280bae8d0fcc06eaa4e995c3871095d43ce321fc3be25c24408937a2a28741a275a41070a34e8f76fccb74fd5464dd473ea393d3f68540ddc095bf438e7bebb4a91cc6de086cbfb043a263f505040248c624cea1dcaba5e809868da138b57b8485a82a48b24aa09798b50448a4aa9adde069d0721148c01dd469aa318fa221c316fa898669a56e3543d482da607b7a1b16718e737a031b4688beb1a26bb7156593cdd5d271632031404b29b8c6a45ebc5b032aee22a1e95f21eaf380159b206b42b12084091f7660951fb201810e06cf2164d044f002c20fc9a8e75d72c47743de4681af52582c1830698d10af56e0118110a54b8cb535c0ed0b545e419b4d00568412020a1aa770c302b5bc0e514f1d2baa7f9b3656beac7b20b3dfdc1ff4fa18cd47616262e6f063151a157550c7aa4efd2b3c1c63ec7aaeaf2e2098db416f0393c9668872dc73500a992b91801467799ba95f2bff78e47c011d88659b17d61da611c7082a4d08378c08b1ededcfc870b540d32ae30e0bd9289dd65020000c4e82afb54b1b4707749d9856b4638e17bf04d6c7e00bac080ea9d27ed9a35d8cc50e4e8169420acff7ddab3b7303c67342c745f66a8eecf6873aa3efc6fe92079864dd5ade19750223414308db7736fac61b9d6f50e574a08309c450db436b22d9c00e2b61878f77f655cb219c2a7fa7995af41c4fe44d7f12a8f7637780dc5e66d50febbd218bc18082982667dae442910ad020934a3ecbd6c8a61ac8cf2be07f2e1ca3ae0617a4f4c980c9caa13084c87bc3fe8120ffe938a0b0eecb66b9f65ad2e4d5684bc8016ce7ec4609fb37410f014ffd50eb59752fc9d0e0585cff396437d9641833730bb57070a8cb9f13fd471fb327360acce5a580843915a5f401ca44dbb9e9a499dc29a9f45329ffaf391a82c9569c00311411e85e94bc9c9109b3890dd0e0a0d36111f640dd6dd5deefc77df184541aa60b3784551b3c03d0b8d7c42e9988186763c467b910198f7fdcfc64dd373557ebca2d3258bb44a0bb2082f16967dd9af5435c2b2715035cc0cae863d58318a45766c7f34fb9066e4a1d3d62872c9431b033dd6ed262b4111d9afac7dce646cb7c8fab48ec0e3bf8de01deb55d19e13234b2e9bac38de84de2ecb957e6be386440f27654cd8d433f263304088e4c0c6d50bb85b6903ec528064db8a3cb637d40404aba81e32916a83429ac0f39c376330f1e6a48fdb98ecc23e570aed64317cbdb6282dcf2588cee2ce1db1623af306201ee98dbb1fed2019f73797bedd550200f0a819986376ace3a71f1a197237f1a34baef1a99bd8f53122bf01e475d44e0b469d2b7504372aa357fd7ac3335508214cc2e49f7aa9da0c606e54f42b711fadcff7b981303f9620b1e040fdac1b891af09dbfa38138a1dd9336c322525b7aa7735a0b6212dc5a5e112447402c43989bdea3ddda0e56e6751974413d3293fe1353cc73adb87d19621ad237cdd0b32d4c127c7b7a0561587b078fd96201c0adde6b26d6c4bb1240de95e113f3aafc9f58a639d7b8321f977be2f64ba4ca6c0e501e831b75c28380275239e843d5668cb980d1fbf9223886f1ec6dc3d14e8cffcc1f57a9051e7c66e59b495efa4887bc82cf79e9120ee18ca9ea6a54451fef68fd79c682a0babf029ccb40860a601c62251062bfb2fbc9b7d971821a34f0b9a213d9ee50f151c11e5f9af6337f482a4067f85fbf15ece96ab200b8ae88d4a786f89b867ce4be1d86604bce29baebde31482ee51a322ca3604f847a70a5c89c0ade2f8a649ead34d751c278384ababeac1980acffa32d688c2f499d40ffd8c52c09d096a2835cb12d61274ff331ef7ec82959c82819beed01dfb8bbae539ffe19de38e32da8e181591d46c061abe902a2f16e047801a03f093abfe8140672b10e33ca3dde731bb17e6008bbdcf79543ac5c7c49acdd176713a70690b70b3fa5963c165979cb2350216b4b2a00b31741efe3cd1cfb85f7c9280ceeb0142ebb8cd03f76574b36b4d6f2c86029c8dd12789c1cf6d32d6427f6928f58cfee5aaf3af55116feac5e6385a53c465f9147187fb8cb8a9b7a2121ba6e3b720d4906583fc50c3e33045234041a1e7dd283e458453733435d8eadd6184d231ca9999e5864ea8485aa1c0a351058ec24472bf99abd597b8741bf01b2de72c74f10315a1cc76ad2ac343303779945f198ed0c66ae7819c2bb4c955a462b96ddc3caa2b8ca76963257a00ce14fa64a26a355c9ee8164517c643b13992b4286f02053a58fd1ca63f7d0b128ceb19d6dcc151a43f88ca912c66875b17bb05814afd8ce286685a9506ee4077554bb7d15d37462db4bcca1470ce920a6c5c3e8dd6157a86171c4b02d16e6d015867409d30261f47eb02b64b0382ad8160473e803433a816911307a07d81562581c2d6c0b8539f484211dc2b43818bd1bec0a152c8e08b605b7813958f8b13cfa272b4b48efa1bbcb1087197701b23a548a7bcc563c69eb0956dc05a53e5be68fd317b2b8155f1da334920b47d73a9b65fb257a17aef6f7b7447b36723af833ca10e2371ef4ae1345fa4d9121565a2526baefd101183b78a5d1ecc3870972b7c1eed4c5bfd63d9ede14b9c5132622aca740f8da8b60be58d70b6045b6184bf154dae6c4ca767f45d387f359c71f4ecc48c629d44840ae9bf110c33b0d0d9fd8fa25034530c784311f917d9207fa03833e7ea34bfd8d142e35e52fad4d97a9c1d068295b568c64f6201de63419e6c64f6f97c3d2da099a70907a15cd50590d7ab25308576f4d56ab16ca1f1294fe3bab44bb3d1d3e5d9c8f5f7387075053cb542519fa5d71b3ee9d42a103dc807f6f0ef79c39746bcc03dfe632ff6d534047a2fc51df0ce396227dda0ac51fe6e5befde2c847c4f06f53167a8b1ff5da1400de20e77e7df3d05764e1c1fa531d434e6fb1bf82fb9141754d671701882dc30f8baf2b5434a27ddd3e587ca980a211e1fbf661fd75051585085fdb03eb2f2aac28a27ddf5e587d51812210edcbf6c3fa75851589285fb6078baf2ba068449d7d3bf63af830c06f1f072d54195b37e28b844fc7cbe4ada92107b174a304ee3ba08bf4a8b0bcc78d3fa693ceac7ed2f179d4b669697cc33dfe4f97e6596f154c32e88bd2572a28beea0c3ae81952b1e8ba057f0cd9470dff19a24fcb21bb40d3b3f7fe35cdfe874944fc5758cdec57af0519e7249e258c0e9d96c872f2e2cf978ae275fd0b399778b4a1883907e8c7de9665cba5ce020f29ee1cc1ec4aa5d35b4c5c7bc4d2a117f925dc2cac5d9649f5aa94361e073e9d05520e3dd010f7af308964fc50c9013f6d00a798104a3d791187a929833d9d83cded6e33e73089ff7b3cf7e8acaed1c046ef786e1dd910c888d93b942ffdee307f68e380042bba79d5008078e22e3ff6c052d74bbc929f9e71fa5250f404fcbe726ad51fbdcc2ecbb197824c866a7da9a0656cdf75b6965642995d575eb76212ff4eff71fbd5390447ef541af50c15d28e69501a620f403c31adf3099ad6d790fdb9fd711793baf6c7e0ffac6ce3c6e8b52327f5e77667d993196c914df5eafae234bd1afab0c0ccbf46c6fab8e7a46b609c47d92af10eb04988de901734b186177f9c0b598288612625e0d740bba8c32f9b1271e56d3c00402cbfab368682e5ce33a23bb1b1223eb03a53e7f0f7b893848b877fc7de4f1c2b59a789e3e3e71d42825d1519dadc35846e62af310233546870a0c695963ae7c28312526dbb9994a51126ccf7d24f06689b39f540f24028f390102b8fae12470210f2d1b9659eb18043bd49ad8d9bdee05513a208c1066dd7cb2b53b3af515568025dc5537f3d470c2101c2a64e773fac3bc17ec11f3df2e649f078c4063480e5e223970aeccf231a923a40e692c90f778b52316643d8fda2b502f86a6b9408b526d6a6a1327434e80e016ba99fa4d94f0565b8650f9f9ac75ec0a30f1eedd2bfaac3188066e54384b88eb0675939bb9da31beb502f852017a2c8e111dad0429bb252aca025f91a943111be97a2d45b66c3a5c61e2840a48dcd0be04041fc7b0f2f8aae0f93af9c2d70867c660d03bfbd64b7a4db54de1b1a755acca6c7141f6f1a62cd2a5509b642c79f764c6c1e3e2a203ae042c1dc3dc1e2765d5dcbc82f318d57800e0aba9c3c1ba60814b7cdc5fb271ced25bd6f6a71a13cada7cf8fb60096399e9150d61acae5e27d46784066d802982dbe372190706693a4af01c15210f253ffbeccc2c1a8e8228863c599cc486dd30576f83780f1c5d346f48518e9f4f9dcf2268399c8febf9f993c810e15aa9bdf0974df6e3b8264d036a93ee1a0cd541d678e617bbb9f5a839a86f2bd2411b571346b8512187a388c8b69d2a1791d3224c5031a6da12cfec7e620348930b0193d5f1874616ab99583b43ed99b48aeeb61ff4ca48d7322d8d82a1f106186b7301073eeb15f58f9b58fd0fbea06c4fe9b8f08613c0c334e3e869ff9e14f08dacda82455232b11f8b6a876500fe4f7f4ee76cf4c99d5d52474e4957c0f2a267ead9fb4ad2667f1cc7533a8b9c53acc212b7ea6ccc1819c95b120f836d7ef92e19b3f2659157929d9ce399ca00139e42335f855724b38f4054d2e36ae9055e4084bb548c4e959cbc5901f7535546fea88c61863c688be424f5e9e307e243c3a62a42a4b215952419c83f09a26cdcf80a88af1a11c31a7ad1a9e00704b314d2379c0dffb630d0fc54eadbeeb2835910cc7e473d9a3e8e99ceb572f46e02719cc6b363c8c1a6dfad397b574e4f00beab831d706341fc6c68185a01812249139adf1aa9515eda5a49a143f928970b7d7264327b2e8b2d4332369248080b3f922c145bff03971afdab66c82ab807664e8e4aaab9c9df97a7d9b8661a9b26d27186179743d074cdaf69d76f422845a744e9d7b15fd945a20a1c2cd01e5d0e88542bcace9802473d0421517bc6633e9f9d30ee8b18fbb88eff878f7dd669cf8d6793088f8102a05407115f8fc8261d1b10bfc778206059f29b3fa2605c1924ca4e6022a882e48a8cfcb5c4223838a1315359c8324ce92865c1c14e1e22193d3879d82bc47e44a0ca4f7855f31d83965a2d716fd05484178f48114c36149d62eaf296193bf8ef05ac5608df560f2c5f4af31881311b380e1582435a6140b083fd4d030b0651c93fe7d8fc659f33a54e14b68ce8703700538bfff6347096aab9456f903964d020eeea1ec6f9690f3092e0a192367cc9be1806432eea7641f415d6dfafceaeb06d15033688e20baa30c93af04b5a4956d8dc163a788130d94415eae6db083e4b0af50f06f02402655340e3a000127654f5f6fc55e6123da137f8b203114e11ccc928cd42d6a5403a60f3b20e29f381f298bfacd01c00fe67922dc896776b82b8c676200558d37ade26c50bfcfee23a80b8625c311dc00b0465c9e5863effa4f601f81b65bc5f666647a27612fcdb5eb9de4a9d101bf9314485b2c6def34efb5c52c57572ae3b586ee694c5b0207444ca70274fccb2ead251b1712ce63c72b977889dc9be222b8f10041ad0302790f75cb24856bc7d6d158167db142f8577ddea3ce677d06d8d1d109927a51ce741176bf6d14dc4d7017a7a66e0a8e5e6e9c5316c5d710522a44395e489570545b2c2e1edc21aaa755944868ee15061e363e71837c72149af44e3691b66c83312a247d0ace90a1b53812887550e37930692725814b0acd6cd6b4c6088f1fe0f281b9c443bcd14c769b23a03295e24d1fb7944c29dbe866a4c512e475a01c862220a5647c5e82e0e3787258d8620d5f61f0f34c48ca854865aef7378accb5b43a516455f0d52fcae8e1aebe56130442072ce63a04800498b1e6aa747a60964f8c7a39216709b6d86bfc759d42eca469f67a081cd2b7562c2cd17d423d8e1c93188a30b659e556dabffb93748de98f70a2dbb98e8141fc0fa238147ef0346c7d605288e126b215dd6804465fe2034648a097e017da85aaf88238c419cc2339c091c0e44a84e66eb63eac9b41054b0124adcd00fe74dc22dbca2d1ab32fb0d8d561a10288b93e2a58e5e7ee34ef15a99b83975a109c99da6075aed66cb84bc013348aca7e3a20b9c93682cf7a11f0046166b04032437f9433376ef415e5be98dce2a4fd0429ee371f9d5cccea3a631d9ae48403bb025c1ac2c32c844b5487992f2a7dd39d770a55d2ad5ee33b487be36cd9e32e858298e64c9ae2ee2e66326ab06e1faa55997970a7c1a6e2060fd3a0522bcddfa1bc3298e49a679ee75fbd8a6f0d8da9719fac76328f7834238384e9ad7019091c99bf777107ab796c7229328d06795e90b9cd53a123b003b95d24929edd93515751cddd12fdc7c6a30389bb86c90ee66b49115f8a7ed2478f55a988df864f1d04e991e85350426224ed945213b561b47bfdbdf7997e5e08dc01148d9fda81883f6d9b96a32cd8df3c014c206267005dd4f889613239963db2124b8620c2e6297c8fc8e5e1fef2048da52c70a8ad4b27d959734d21a7f3efb831932868fc28093ed67fcc0ce1c9a9797303f596794e3988c2a37c8f5049960fdc5cd98733f1ccc81c0a4af6c0e5f228993ed2e035be382a8e7e8e5ebc3b53809dfb22d702a68dbe490ec407201be949839e85fa0043601d9cd5336e44fef241747eae2fae301aaed33c17bdd233a5d9ab665ec3cd8640193f68e185d3ae922d268079051914458bfe2fe86e59a5a08053bf9182101cd5a4de37065cbb9ae5e58cc7721ff3b74d25016ec711d676f04513d2022a09f8383d62b130baf91ee0f99145546e40e9cf3d86fdec2ef98d7c3b7e4f20785a40e5f3970b220dce08d13066ce0d380b84e4ca841cf01176d86a9cae8b9a5f2f0748953685eb9e297707c6882cc282dce3a6789a247700e24009c0e4351743dd2a9849780b834c00683dcbcfb2bedd5c087c1b869009341d78120f5633a2a2097c34041fb78102862a18e5cd6f9068cfd1507f4a8983401322f1436249ffea01a6ccd542ef2e0357c1d9a935282a0d980851b64aaa8f649609dc5f01d193e29c0b29924118cf07423a7a1bdc181f595fd0dd5a6310aaf7a1af4fb70c5057529408a5a6457259a60a09592aa959d731fc1ca9662afc975584e01bc2b3f3b829834d00811678ac2c4c0ef0eb4078a443c09fae4bb7044c5405de41ee1c062ec1271e26673f1c6458ebf714c187c08d43f543fcde3299be0401c500caa1c71415e2c936745816264cedbedafe5b0a32290af7ace5d8a2f8bcda6b40c13629900d183cf75231b5a9281f7de9ad3d607457b9f817cb9d4900a66ff105a8705eb56a44394b1d1f2fccc45aa1ea429e58bb5d5d588ab561a05c5430f721582ef98428509f7b542cfa3bba6a7386daa99fa5118d5331d69a44ab46910d18036bf7e46c8865059e44adddb53a5ebac2292585a448c508ab28c3ef710c0bff592306a9519457bac8395cbc4e283fb49f3bc203854eb70f430b513d4adcf328679444be0f052723eae4b21d62227ff2b2b70637c3a1631bb5efe225389450e83615e80b30768fb2f7af69c9df8e4ff82619df4e0551874f1d831fff75d65b34849a45a8066f2c70e65e5fd686d0d1e0fb24f7e1f46e52afd6cf4fe5388796916d8596908bff708eea8d5b5cc38ad7b8b938849fa8cdf80c399b4e2e8a92fb9d37127d7c894ba7c1b8acfadbd3eebb3359ee770cad81860f8c80fe12dce2ffdcf6a74e19fa8814f6445b7d484cbf9fd6c99206cd73ab7847b32bb445e868fce6690d82d6faa67bb4248096095c606be2e97834bf81dded680c679087a09f2440bdd1b6871038c5d11cb1f576c8cca4cd8f1056d2c6a75d53663e831ad3f0fd56e19785a02c4b6c9c5a2c7e47f63f5dd8b9e27a2efd1577911e1eb593be7cd00cdf6f66b86c62f3b0af73e1626873f7a196555f8ffe7b579e28e102ab7a2b7a01f4ccc8fa17c2ae2c2032e9977707a82c3fa770202fa51cbb1cdd6a61bb460234eccc6564c97f8b9c99a297a0cb11c2e0cf992581cbc3ca367de1d989bd9b0581c24dccd8273c4ab4d17b98279158315c5b98c4dc46505c1b7636272e5b511cec700804cab5856970dd082d88505a96040b3b9e2b5604af08a24f396b346a4373b79534386adb6849918c849c93759c2f0baedc536c424bbb73fb0213b7aabdf0ef5daee664fb128f464cb1a3070407529c9ada5db600602da1f3e4463024e5d9f4dd8b230d17836f396f9d284e7fd7b62d6c4f15d120d0c432136975bfbb3d725ff73332b6c025232f91138263128c449b80bb93688b03000adc4cb7c49ef9c83887f935e7aad69a865be661bc8014c677668de22ddc11e118ea208087288506ea4cdb79ac81adad0dc5e90a9712702ee21b644921b993482290a18394d4a68b121c80d67c8265aaa207c405a84321903ce04c0185a461818cdf0d545c342e262f000e310db372cefc91ca81c544a6dfe97e6e330115404cc15c8c5a79d20fcb92082f54b41248b03dace430adaa5db4a63afd137e96fa36a708d3a25c4278108feb12149aae4e1d6d3b83c9bc8520a674e28e9466245e96a8e978c20e6b70ea131a2d9bc72cd0624167f6e327c07088e6f970600353942d04e5e900e68188e22c87826ca90a004cdd11cfe77aaade78f0437a2581e5ce06ada8f1f856cc641260da932297a897d227a45e2df197cbf36736069a123daf0ada390147ec3e05d0450e18f60a25135ecc0e0762229ada44783011f631c70a314954d649dfb43078935990353f46a7c4b1a292ca66091e472559d40900b400fcbba936103d45ed127e5a4b0e4a86e439ce946a322fd60039f53f112a2aa237d0dbce6f520303cdc2deece9af680cef6ae833d51e746431d4112a5862c70d2ecc6538585b4fdd5710482cf064eba2d851fb33524799c630ad65bc2a58fe34501a1cc0b1f3ce4acc1d2350b83cdd37fed7388e9856bc51eff38b184a63a7a86912f03c1f469ca6b3686d7c859a4711b26c53732178d4bd33c1b0af00b6cae44c512a379de78f9bedf5ccdf6f7de13bd4cd410a223b17fc60c2b493584bb60dc5256ec0db29f35a67cedf7a8b5dbdbc20ea8e1feb00343445cceeff1e3de74511d297e254c721d6db15ea9b559f073703716bedfac4c0ff0bd4b489503ead95f5fcb38f32bf3123c2eb8c1ca66c3a1d0273fce540c5aa55ccd56d3924b7507b6272c53c738a7cb8d07b2e5b416f438cf33dc52d28a28b7f4b4491597ef08f0a6452f633562ac3f2566ce1b3cb30cc7c30b49b51cb311874e3ec4d014810900e59f2505adf1a74845b12448d55ce244ad90dde23af8010de4d380f631c5c0a12ee6bdc040e541ebd3a7302e328443206a68e8ff890e9748d765d918150dc9b80720a3d5d5181c6c9813a32d729a94fe23da705476721c82bf6137d411239a1e45bac56b2913729fd11d889425f0e8fc0349e316d9af8e27c8063e56bd9355cab1a967e7d35ed164d20815e160f4e06737a9426c9c65180036179cb3bbf9dcbc0a5bd1551bf0e70489c17f75b836a5ce8185810432fc3d20018588e9c4152fd92fb52badd36731dc5e4421409a868fd1ba78b4652fa698d0178eb9620d808a1166bd163861a7bc21b3518ced71090ac78a66fe83a3fb1ea028b8873c8ac88324b0c0e7d014bbf1ffa76a07973f2b436d32e5c02fa68ca41bc5737205039a08a9b82a185534db2a7e0713e0ac391bc60fccd8037b0455e42b09f1c0cc24b81cd2851ebe1ffa2e9585580018536973bd0904939b84d8be4633ec55ea91d6c300f8e88d5c43a9b3406616ee5142a7ad6eeb6327d0bd0e990924691154cf4f41115e2b290285d1c2c87ea03067bcf85da40c43b361614e0bf658a77a2d6d6f76b3c35ab403de32625f7158a56fd2bd999e5a6d348afe0e708c2dff4853160989cbc2e2e6e71a7146627489c0bbd8ba5a49a04714d475c57dab4b75639fef47d3fb3793b31731b556d55631825a9676354d7229bf8b0956d4302be892981a3c49ea9cd2358c336ec1914cebe9d8aaf7b0a313278a0c119af29fb8c6b1b13e48c9247cf9f8e33a72af8937e4002dc1e0fc8bda1686c9ef0df4c98d48561a16fc594c0fe96a1632a83e3990353565cb493fe244b97733383578ec29c6140a5a29d90ea298d76465a35d665a0edf86575e1d4fbc7cd81b3eb8a3276de2c74cab79e77caa2a67ac96a1c657299c0ad474ed8bd97e2166fabea63da8d7216e0418facedc31b00d4e1c12f03f19fbb64a5a47d68e7c9a36793033e2d5658567621923cdeda8e82a96d338d80df12a21c044037835df3e89829eaa62b1e299963b7a8b32d5756c0fe81822248a98ee2b6ff00ee37c2049182923bc11ee8099c2f4084c369944f02761276017c4c8bfcbdc00e41cf29bb2d4314701778f11dc501a4174849008642ec828021f21064e20a060201542aa4d199b018cffb1162d0fd9d7df57664ac4ce993dc4a5a632f2c382b54d742d551fc523bdc4942eac3ee11d5cbeec4e62bc9ea19fa8b3deaffc6f45a0524b5804c0cef3572e6cdb3b6b272876f908254a91d807dfd6de402fe3652bdf05f167a56d239eddec4103e96cdb3f0ff58f410d98bd54994761b00a65366027dcbfa82354ca68d7b3155d84f03850b518d228281d809b3d0fdc888a9e01e542351812c87a1ddb3d3c30ceb4aea3fc68f16ae177f96e2355dd6a90e63bbf3c7cc4c71f928e79cbaece482c7b1a3dba088c6447136e6cd0094a486d0c7995f97798713731ff8e533a95c59f8dbf30e9511143acc24c321f102db62972812ebd0e3d4e169803d58ec928356949371264ba5cf930a1c0654fd434cdc3b08ccd32401dad42e8be3f2d25e29afe6db0a7b4758d0f8db04cc2d9d2902b53493d3f4420a9968020799d9c4f365ce068674be976a40cb5495d3491bff6b5d63cae048612730b647b1cda157b5b918bb386f7eee8e0147c9212994d3ff5fe0bbb27fc47f60d2dfb1806c5f7d848dd2de04f3aa258dad904adf14e7c5243f95d99e0e71fec037d3c3ce93e42e019df0d11fec36099024bb5e6e99a58bba78a2cb3875e67f9dfd5a584642427fb7f8bad3c6e04c60812d3c33370cda202d1f8387492c0364d9711dd7f9b48e35c11cecd566ab075e16977c61a59932f5dde659f0e936174f8f168b11a4c49c05266db760077742c48d2090053e3f62f66dbde4f4630306e2f3f7aaf1ff80e488c0cd59f4b765618f6f716386befa2fed59e544b051ff41ad051ce735ddc388d976d63c75262857c309c1ae7de5b38990acbac671797f9acf9dc5c0402ed152d0868ce6258e47ecdcf48613201a43239dbd7577a5a1c922e70733f19a0774ed660c2f240b308d49d5bf3130224b045f0b9b15b76f50de02b7f293710149413ef06842cba063e11b819fd98b8a2633b68a98929bc4b14042bbd7297d5b5b4f0dd91599fb7191ae34368d48dcdee8c5a0fd070e5b2fe62e503d6af982fccab204dd55303399ba18279033dd3b42ae94da9c652eb1ea2c02a08f5795ecd664720863673b9b2d826b3999b1a62bfeb7fb8dd887fecb80947b81eaf3dee7cc8fae18e52e435e7a4414ab37ea6d2224dfebc9e021f3474c1260ab5e5684882fb4579702ec3b6c21722093fc9d5fd25d5ab9b19f3afdca76bff22bdc5e10dba1d5baf0f5ffb3e5f6f933b79e6d7247a48d424f475c4741cbb4a2ffe6dc63d2ff621c4745bd7bedf582916b1926c1ad718d7abddfa6f430745c2e14b30c84e544624639fd895c089357c1207259bb29216767fd1c8159ba800e7804271e7ddd73d1820f9d2006743cd5d7004d9e134f02dd795aaaba8c644652adf8034e992e2492f21674c0bcbf42808ec39316f15d8192c329009aa5cb0fa714d7facb269ba14b48d6097ac090ba5a42b4edc8e98a8946f52d3efc383ed6f3f1f99444e17f3f0e9fc14f10b7c3e159612eef4e26e1c1ae43f604a3d8a56db7ee6d825df827736234b8f58bc1efda0c223fad4f2f4b6e7e17454f5ec29ea5c2f82360ae9a90b8a84ca52d2784f901402e39efdb16592cc5d3bc1210a67a766b9e90a35dd9ce4fdd9672c37311cb11ad93720bee52f8ed2ee0e75a5a4cb79415949db800af8cf12eacd93745e488d97ab7e73632f4ac496b6333037f2af5dcf4230048e9335352b3899af4e043c3cf7a6ce6fd42487c4b28542e52e3745cd889b4ee469e8fff742e4a95d095d32e1a2c3dec0842a2170ebecd3ee1857e939dfbf060aee844996614bbbe797e69724380fef4a88d7db33bce6313687b0a4afebdd99632cb272fbb8fa2f7dc4789dddc931feec52d3905acc327ee1ebd923ec42c9b993570a296d745fc57a2847e798122bf7571fa8f93e55feaaa2c2feaa03e1c0eb0f4638346cc4ba6d54586bcc1507432b1ae5b6ef2af465ae67a818a579b0696bf5587b68425e3fe2e2aa79571e13230f7aae22e5f9788cdec566238b8a1d34bd0eb944d19a5c27798db4323a205b95f7c5d4b30a88a80dae9c41faa73dc8ed00cab213a19714b357e46a5e1a8a68212c571c1f06c7b67abb408b1a27a218b222fa0394aec1dfea9a46ac9c1da620d9279e987a8034f016597feb33a488ea3740bf742a360362cf48e3a4a7099abff2f823fd5f47ac2ffa2beb4652a74d4474765fd54c250687ad8af27fb25c5802aa1a4a476b5dec1672f1fec2e848ce6fa4168a8ad6c7eb5dda0c660fb89a2aea3fe4eb2f96ef733b4462a4702725bea99aead2c12b5506abd2087ada8b8011d95338ef70e442aa591a2df0cdd8c9791ed967d9e11ced114a09881015c296a3687f105158268a4efbece2606531d94a8dbb570c5916fb843bc900760b9ac89358a5f880719b6c9ca0e173848e0160b478b3416e32101861b496347db1a0a83efe4cb82b18d43de044a2b754e855c08aa32ad4172d4a2fbb61eaf1139ffcf22927375929ff872501c29fdeba94ab19df9f6c724152d9ad827d5c5b7c31bc8cc8ffb637a31829931870bccf96b693a4f77a782355429ed794553ab6593fe7c90d6c3d374ad9529796d90688391002fbc2ebd0e3c71ddd9b46aa60a41031e62a0e0b0472841e720f2470913dafb47b2d3ea801eb9ce37b424916e76b66d310b9e3ebed5b3cd6829a8d8f2ba6b01130bb9380b0ad6cc24c69764f7a0236a5a29061363f7a0f80f6e735ab6e2cb808554575ec75a399c5a5af304ac9dcbd766d102aec67c0c91aa71886a6fec28fea584a85eaccfa74c5163bae12317e5c3917dab300388d317a62f19344a68271cff1eb9dea473522b242f57ad9801dac894487130a4e42e8d7ac71daee543b32128c2a3ab15d8a910d2206f212d243e046087fdecf4fad8464241209ade57324da84cd4736b4404f5f633e6d6f64f17ff08d571c41fdd2c5d507af7d14b4cfce35671f06a946e79391c8c657c323a4ba87f3526d86045c9104973d1f68bdad04c55d72eb145b5d6a2ca6331776231730edf789aba01dce00e1c7d9a0efe8d70df73d3ed1722fa084167fec9f2519ed984f9824f218282f4ab8f3a56bc644b838c4f8daad5b1dc9e9bddd2df38f0cf9ae323128b37726c9d756ecac7fb2202a9fa005ed3585214ce1e0f81c34a3c5d798e128cdcf18b5a855890003983b1a28b202cf1ea6085ef644f32014763ba785504e3934b206d89874f0241d2c7816609733f6a7d1fa3a3e31e603efc0e0d4d6042015b5b9b187c9c4c9f0088145f44391b4ebfb8938069ef7a941888a0eca8b7e88384fcce02285034c60482f19f1cb83cb0329d0d7878f46fa4e2e503bb8c8a068e827c30eb075519bb351c7efd82aced6445b7c2721e10129f6c5c9cfd08b49b3c079c3b3850d4f857acec3b2a36529e290fa430f83a81b81faf8098c7ad1994d9ad4148684eaad2e7f4c5ba4a797161aa00d8c6ec636602a523d22575bd889e14bbaa7ee054c1d24e5d120fd74c654dca2af2f0a7a0b7cff930cbebedd7ce15b73b2b04fa22a0aca05f99939cd6ac2692988f1ee6cb55c57248f25863c03c91aafe9c901fde1ac77fa04037132f50a4e6b5576575b60c3d79c0b1525925139e10ad2e765fca00b86cf60d7d18dac9a32eee07c0120a18d7cc11fc4303a35619c445f3e071569aaf19abbe72efd06d62679d9662075100986421c400f5ab07ba19cb84d2c6fa8c4390d4eeae966f92301fdf4796f3b92a367ae4f552c39eb3253908109f1a719d521cd7d86a36d3a17bbca9783314b7e9153d17f56a963037e4bc4df8134a174ca23b656927ec35365732cd224bef20d6be81210b670f01d64e4f4be861586132ce318c827c36a8352fbc2557290269c9b59ba8c775d210517d2b01bf4e000d5e34522434359e70437b0f4cbbcf245d1fcf8cdfbc483766e2f628d36c3f1b7a4eb5f0a9cf56e819da11b6d078f5ada3e521caf4008cd2f57b3ee5ed2fc67ba0bd7f4a8367e63541ff47fb787c91b2b7c4d3a170fa5a3e06a2c09fa5f7a8afe40e0d6faaf1ddffbed5a01c8cfa7fca63e9c87fc9762d888aaf14119849f8b50a83bc4329251e0bcfae5513e959e331c7f0859f8db9d19ab77ab5876bdc3df415e0d0e8ced5662c0b934d561f0028b8171c354bf080028e1dbb520c59088f5ca6692d4a772e7b11f6f734a5dcae3b849b88c3faf14b45d4dfea00ec0076760a54f62e08cf4501f861e1aaa5a3f3f51cd1d26bc649fa367b110d962de054ad075efa4596a005c3c73c81c8600ac45e2b2db01e94eae0ae009e8d34f0492b6ef76e6c69ae4543a880896956e16f7f8486ddb0773ab9f76c4a23a23749987367373d2aad8736c8b7f16a5a987d0704fd042c4c363b2783e7294af5df9ca4de4a194538a4f8869bfad94d75ca9585364faf46a4c7d5c8d57b6d62df1bac60c68bac31dad82842475a3fda53b92394df24f320b7897575cc644cab8374150a41e33389be97eb63a8f9f068a04195e00cc0e3569e29c4cc300784456017154f0018b4708118c375119d569b97bed293941190e3a7779520791861c1e76354fe917ed3da0756701274dccca6084d7b1cb992fc3804afa691e9c7575af3989e9670221b102ee01428fb7c56c3db1e0c5789e05292a76fa31211517a7cae275391224a7c1407a16a6c3fb7dd7160145059e077172f647bf9d638af80b0105e6861b339b49d67b390bf02f62a8e227f8fc43a252cc30ac653b8f06c4c8c30f377a82624d40646a035d8e0762706a974b52502e2453348b9b1e9b14c47e806eefc92eb1f17a449ca26c47536852a0ffe7802e6f4260d448b19f2042875d7b740430c8d18e13102f5742c94af460fe3e569ebaf61a796128ad10dc8be6771413574144ff375e61e100268e5b56a0451b2c2d0c6d97567463fead046f8f33f73a7a5a6e5a6e7c417f3a95ba714bf107b44394f7f2286cf2fee2108d03569750e8908bc1c2463dc93041aff845dafa15c6704415a957c09f144f4a42b9a92132ec1bbb1bd56c9af2309ddb88392aaa58676f1e82d7b1c6edf76d34f9f3baa885212e64630e684866205c4742f32080d67404c21e8db212613d0e105958201d26eaa1f39a636406fa3d7d576e21af2d911a7eadd30782828c02f96582c17f7673d327e15540c2d12fd7f8a343d6270d69ebf6e725048f3b3922f70fe04fff7bb5fd30ee557dba173c294a8c6660846dec786d09083d43dff4b03988a90394482ec14da2d3d5fd4dcc4ca5ee5e97c079894f0794c5fb6e71d03109dddad7ea9d3b011e019aee97927bc4df490d096451423c3cf0968138946a9746eaab93fe36fc59c1d7445271c1af017ceed24b3c751cab88f0cee7d6423861a41b5f42313e10635648a05738022d34962cd094237c67da2033a33117cafa7136a7c992e897302db14acd4b40246f444e1b2605f091288581fda4ee85648c5959b59fffe4bbb4bff3862b376cafd2c2671ebd6ae607581ac800c12f5b6b19991dc8d00aee5f06fc141c37273d7cca7e0855b6086c435072b7f785bcdf20ee494e34df7a5c89e32e4fe930844cadad37c22726774ca3d12dc6afa70659425f4969ce95681c1bc633bb7136b4af7ea4702b7c80dd021b6d2450bff45c141064baabd4057464bb67004a65ff6927615eab43218b4acee8b5333a3c85c79e67a3c22c21a028ffae7a3e0e836e10425fb72aca4693dbe6e5d70e71d48a89e341a4748c64d81e3fb1d6d3c22ce1e5fec452806fa3876294d9011e2e4b3801375914e715b1015d0aed6094d6cb945a8bde1d71df0e9823ea1b78539da3f068a68044540c2168badd325cb21a7ffd67985054ed39b0f5b9ba418656dcb5123f9eff744947f274040e951838e2d0a147bb90fb7f07059949e6f1a5ad18b4fd98243ab07d3cfb3f0a4c08a43ebaf4be1b90abb464b530b1158c9884e9e1033977812fc3f0e39bd71644d1f8cf3fea1001f688f3e051dfe6988ddc8561fca07d09e84ca4b8cf863c9147041554d31682d13df034cf97246a10efbf13960cc7935a902e7c6ddb377b8ee7bd0ce74ee50f19c169facf28271c710374051d4b88d194b57280967a820c4ff651d00e775838a3020f9b45f3b54a14727eb0e74c590617665c9371a60ebcd5f3ce98f35a2c9632e2d0ea29a49f76795520f9cdf25d70764c69ac966d9c2abf85beffc6a8368069f0b10c2c8fa417eecfd06a1fd87d98f74952da8010efdc84f47dceb714410d420185903d71d4bbc8d361d540419e1968e091266b01aa104d842355068cbac81c30aced3d19b63f29367377c1d696ca8f7a41c30479f943a42a7e62284764991518ec7552c8271b3c3d042b4e7736337c864453f90e1170d29ef3e64203fa0448f68b991729d106ee50058730a32d4630a8a8798d74dc09a04275c84092de27bd1b2c64115771f198f159d4e41fdd9b9382804e5ca9b2878313325197be9cd8a84c41fc15b0e708378a2ce9081e3c0b9ce5619340c9e4051b23b862706ac845e82d9f3b3da4810a1b33288d56e2aa29cb3ce1a231240d33cd9e320e6ec04dc73d8d8f954caafd0a92b322ec212ce1b2b5fd9fb2e023f22b18375ed320ea93bacc624ea093970a15cca40e45a4b8bd35cf6abb0302fb882816f0d3ce550e52c75d4b197e6e17b47ec41a1b180d79d35dd2de02ed4a13d4cc69659adb45c4f208eb580cb00d5d85119779020700212ca921e9648ce8178e3a63eb2e678a34012358a994fc93aa2cb22de36552294ce89a88caac6215baec4fa059105c812800288f32d5441012ceda786560c3180cf32e65ec5ec2534b09b71991523670b14fb889ed489593f7bb52972a51b7fac39224011f03ee9436a944cf959c6c53b13dea8d1d1dcce834005f95bde898f5f22da7e11b0537214f4ed634f5bf31f1d3ed4164d277f8793a0e05b463edd63f582ee1f1436986719424ee35ffba6e30e161058765cc6d7fd442bc7ca6fa8a8b2fc008e473e8984c7bc2bb219aca23ced85710b038aa26f3922d7f8988b707b513d811976cc2bfa2f0ee4149f6a36a16385820b33cabb5c1133a6813f3eccd75b533c6060532cf5a09c27117107f5627e53ac55e2daad72945acd15be5804fcf24676844b08e690226eb8000ca226540c78a2c40169962d3417d81c98e0fbc8225abdf67b2ec2a255c37688fed611d7fcaae580ce0ea58c7cb228144ae510b6da068603162584edaee754f7de143f38fbe6c9ab759b320f1bb8c41a270cd0338e55fe8d0df327398004a363584206628d476d5b836a751a097120419649dffc4ab5cb506d35757d96835950ad74ce5201cfb1c6e9cf74c4a41e914d94db015394c9cb98e4dcae721a7ae8e6505612bab0317c2436315ab4bceede57d9042e8daffc82f7125660c461fb4241a36434da5de35618b0176ae0d6f8ac7ad3728157eac9eedb7128a95ca7a7652e5dfa1740c9ef180c82417db3b0f783d0996103327fd2b977318606aea870dc54695d0538e51a825a65c04b68f10ccd82356d48688053caa8e55a2c0593b650e07736e30ef8ca2e749380b22e5160d10b5abac45f99fdb30e74b0322bf63d4cc4ddcc37e2aee84dccb236a4176d4c6039dfd00c0c10b55d49d786e7eb617865d82d89e1c058f73fe488e77e633c2cdc2abd4e5e1e1e70e02cc2017883455ff999491b1abc6360aa51ff154a6b5a943294fa413da37401aa695077296115454f32b03360ee3f2ee80ee2f641e6771b748cec8b13c023597b2651f0782b6854f3cfd181167bdc34e111d1b099dc18ed8ccc2f2bccb75da9e781bc2b802f88175fe518233de0c938f126481dc33906724f7820e66bf87f1d4812cdae07ae41c7257211fe235b74c140d1813fff1121827e349e4fdaece5f5289cc80a8db2f3e49ddea4c2052f95c387737d598879219a6b85a1af17a66a8656db018c081c863cff50d996391746ee929ed5a72b145932f70b2a99fce1caa07afaf57d691fa0333da1c751dc74549613a1585981603d93658a82707667e5f0518210c89a95e47a9e9d272615f4412f7e3d9d4c68e005cfc6ff7c5ba3d51b0d5cc15e51db1bcbd3cad370690aab91deb3572554fea9e336e65a8112872babeb9a3de62df0a69287cf9ffbe063d339893cc584aa84b7c839b6ca17456e47d5538f4364f0a731f9a1efb3690699bb00a9adb25a3e5eac4de6505561c106158545608ebd88a9f9186eaa2380b2950d4dd8c03617098033ef6fc3c8410b7f64ada09cb59edb448a0930c690ac081c24fc057214834121a35b0722264f7a2a1c5f4453b46f4838a37f5442cd9876d8182d69c3db2842cb83911641539348f50d943086a1304eb4858316b67ab6310660d660f06acd071b1fd6ddde3ec8c9f1da29fd8c9107748d5c0eb2f7301b12ad70b68f452982db7112a069977942512b47400005703cb807c02921ada532bbaa254c82d5a755c89b0d50fea94428b1e751bf820640871213d8addd33428add0c08c254a33a60db57ea6113b2af936f5b881e0ef721f45528207df2e443e3638931c1939843917870bc3a786e514b571343fadfcc0686ed211a245db849c4758cbab2a11e3a060e0e6860f203ffef2836a35f897c50a13e4a074c64111810cd02e097d79ac33115a25ba63b9868434c421abeaee37da5e96feef23e9e1950f47c1a8c15e6c6417bc80651b6ea0272867817fa27434485c1c02c5b476abb61fbc5b834cfd61fe9c8c55a3f430174be51f26ce448fc5ac53e54cf919722c4b83efc07766e906a319e8b44eba5ceb4d2f451bfdd28b25076d271ce066576853c0a9c06138d1cbdf6487ad9852ecb6ef665be9684bed157c64e70233b11f8136c449faf419c2d01a4b22dd94463d7ff7f6909d7cbaffca5ef27809b2cfd1c12358c807b908387d0ab7743e5663aaa83295f34fa0bde3b114c1dbdcdce1acafd0a5afb01cb2706f0672b259ca2b5ce731e8483c13f9d511c587264ebbbe95e716b2cf570a1af43f8df86a8ee041a4c3a94074a13244ab028b414b87a8d7d682cbfedfb2b62de4f74f2b979dde5cea17724e1408dd770bbddf8ee637a0861ba280414b705d34387f81c80d347034b0263b568aea0f1fc072421c49ae2c76667daa7f6765a57ff4b8216f61fae5b30628715b75249df9384a11dfac34fafe88451192969030e22c839e27b103c96039ab371e4060f18e544969dea55c100604fbc57c7b56865e1f5c694b1579ea0709656740b66e142af80348c1a826839636509ce7acf97747e54343279a1395301be24bc98eaa01af4a5c76e03d1eb04b470b09b884405780010d5773982655732989a86f32ba130199c60038df1600544b21553d3359a1374f486a30698f7992bb459f70dca0d1052582907452ebccebc827b93f7fa6a9abed8338ab3da843bc2a4a0f5a1b906af6446f387b2d8f6b3572d3aa52ffded5a41530608a37b40a029d355ca58e727d3831e25eed86dbabf998b8088e2daee7c704d7f9241516f3c52ac0ac960cbc92b9537d9395757bb6520beb8a14b84615127bea95d1d846171c02b8537e86ac42df6eeb49d2ee56a6428f16f7435ea864d855ba9efb15f5119686222095e24928e048335da478206972e57e3cfc717bb0814a7a80211f01f830e5fae1dc40364e91c50ebc3df8eb1a0dd4bdd521986f753f7c71cc00e03cfb03a4c13a617fd2dd3e1f9ca85ca6aac844977af506aa49c5c86c13f47036b752f428f1aed0db0a175ec09acc90df7b57c974e79042f81aeb884a42554b6e205bf568319546c6241f1349adbd85172214a5a52b8ed5e4a8ec6cbaeb42f5950768809ed2070c526bd50b9cce91f524ca700c70a9893679711b55eba3f25504ae8e2df6d6102d8e8059a69dee8a50df408a958070d3c60115009576b07510cfe7eaa8c3f2db6a308301854de8753433a63c4b6804aedb119ebba9ad40017eb63c3545eaa045301b0d96bd29600024931d20ecde301265860c83bfaf6ebd8fc94f9cc6eaa9d30f8a2aa455121788e13408280d815a30721e2a941cf40fdaf68a81f3811e4afd22012307f180359f1abcd2a137f088c597d4c36458ae6d56340b6ff8f4f1ec6ccd55a64e1098284e5b3cf96e0a1a941764b44290d580dde8f46717a5e12d30408aae804d8a7dd3d21fb5d56c7d869b03a3c66a881fb5f94649415749dd2066164ddafefc0487c69041e9af42af8db0dd48aa488ed642a7d8a3a18efe9e40b6195f2625df4897016ddab8c7d1810d53ea19f3ebc3ebdd1683e40c647e2244a4bf6c754c190af5787b1bd8f10e209837d4bfa70fb493d73d50f976b6d4e994e6908303dd128f763d3cd6b2f978c4c7588369400394e62d086d506921c978d6070da0aeefab82adfc56cb42020444ef792570555800adedf8034629f6d1cc0b292bac4d395fdd86ac7d18d672def11e64f90c61414ba3ffa0dd85f0f682216f51826ccef1d7a23b33b90d70494ca9171f63a671f91d06b053847d313be3acee57256ac1989ca28a9c24876dfb5d03dd89d61f50d19e760906be138c0244404dd2d0c743943a892057da56480522626d536e8e747e17d74b74239bd2ef06d7ec9ed9cf453120cc856add7fddbf526ba5b92ebcbbb518e3810c440c3cb4808114b202e751ee69e4a9d36111c740600060e9dbbd4101730795359c06eaf4104a2f14dedc80dbbbefe5e8ffc55fb6aaa2a10905a1a4a47318230fccc5776c98dc678611a3febfa70dbfa97542c8853212248ff9cd226a8cdd2f566efc0987787ce4f6332ba3993bebc28502a1929fd63d8e3043e75ad78ed6f87a6115390b73507a3db74f6e12233f449db09d36275e9f94161bebb4714ae2326604f2d306a571eed2716596ccb3cbb22a6977583eb3f840934595ffc28b043ea617ad75e507b41d63b49dfc86c3aeafe746463bf3c9d8d0daca3e3361face57a610f8db0338c5618d6bb318c4921012090752e75eb778e78bf2978d49b23bb5c1f3acdf66d6d8f0452f9cbf3ab5db735a016a1112c7e24c08c261215dc8f982e636eeb907d87eafc02762a4375e824a1551cc6750077669a7594865e407be6532f5704dc44078b2e1166fa1d938a7ce671ac47d84d62c76b40e81f27e4098e5cdb757f6c40b88d63fab52815bc0c36dfed807ac516731df84287be6994be860fd5857340c61687b2cf699effbbc5390b549dc61b02f89d3a149abf6e41275f5446884057e42dc9906d2b720bb4e29e15616c6f96a1734650db832ba7d32e2442e31c227a2b44cbd3c5b4584ec905328ba8131b94d434bdbce317b519b40c2adf2adb8505e4ee184654988b04af4f9d1f5c497a648918d1b116415eba165e644ac32861e351f3f83cecbf11e2089602ea5081ae6d2f08c12e523752785107c86d9833cd9fb36d54eb1eac4ebbe7b168b8fce595bce67c0b5f2cc6917766bd0029e7f00c6a3c70db05c0091cc32bba1efcf3c62112905cf8aa16e5d42be08900f2b25bb436bc3e8b50173ab95d25fdfa0a5f71cd0fa8b3f1108b27114b2dd07d08a6ff871f71f2c17046323ba82a03e5fb17282c735924cc872d2fb0e601a164be3278b7afb262edff903a76018ae2845648016cafeb86db051cfa695ea5b5800dfaeb44081f38cff86a746a9b1aa80160a638e1dcedb9b2de9f226da8c24586b81a080ed9607a513b87ae79a9654aea54803058e72632180d54583a0e2aa1b0d89f9b042bf8e955d94307dad7582df39382f6842e29949085d9ddf6a4f24bffdbf9880d1635024f0d563647c20edfd58f82c92564723fbad8b4c1722598f677ce27a8b0633d1e176ca890d822574700b1797130cb0c42396f1641124d88d176c45f7f0d0aa1b0d116814fc9627aed5a9b35bb15575b10c3b3891f7d964060f8290f822b28ffb8c06bc5429e1bdb4a65be95fb12169709120049fcd533deebb12056dec2c65cfc2c80118440412cd19b34e6977401bebdfb3bc383ee68875a0125998153d903d4df5239a16a2b587bf75cf5dc6a35fd01cb804059f684290f752c2dcd23b8328098393223aa24e9b7380d24a9a3f0a879539e2b03dd3d843b5fb89b84ace681ed8232c96b116ddbbf10a212c55058fc535d95a71d9a6288cb1fa36eb08f82f2e67aecdcd43b84d2edf2b0c21cc347476c07585f54b355f0ccc369084f0a8cfe9f7c4d8132dd4f074150834cb5ac8e10d8cba4834eac89e59faf5150d41127f7f3da37dc4bb7500ab0fd38170e28eec8e04bd362e0872118571e25d15dc50fc819caae8c07d924e2d97697d31bd88d982e36405966b556f28afbf35a634e34746270b49f9b42e2e2bf0239d794da4e2acaa9b3f5b6df923588cc693ad176d697faab650df59814318c22ea355d085c7d80d2996d0c7ac8c697e6a8fc0e0a6115a58992180f92b294795ba9463e91bb8aec050f95649800290b6715f45ee7bdd5219093ef7c70d1c2d1f3172e54478d690aca5fbe38379235ee0422e2875dff6b3508ac1e2861227a6656d79377d0b2e04d78adfeacb6db92a5055de27975495ec76d18cdc74629c1eb68c0f7d73e1a9f1d65366c32323d1107a058ec54674ebac2208387d49284a8c28df0dce5d9d02a2e68bdb54beac72bbe7d734b38181af23d9baf923def6fd221ae8c7bd90cc023535fd2826281b83818ca820ed207f59efaac027f69b89a23fc9e59ed8bfbac35cce63366c627aacdcf1d585a651cbff32702a1d7baed804d469de068884071536b4c8a226a447552f90892b5f5c0b0d02bedaf6981508d10b863ed2671de523d0d43f626c5099f22f99488b243b17596306ec5e176a994dec97035550567bacec5cad2e476ceaf61c875632883f96e84d54c141f784d4ea3bd92648b8d872d8ff0df4f30642bb1263c5799b2aa2b94edb9161c22dcb23218a78d4b9403408c90e2f826344a0bf4119c035ffb9620e225ca096f4bbf69913f8a020ae9097463d3ee490197ac9235eb36b37062860f9f1c6696c4585475bafefd2a361ed608651f8cb1a518b80ddedfb9fcf38e80067077986bac05c65a22c0c91c27c6665bddf2626e0f2262e939797a6c5f0ce16b44b87c5381a29d4d8299bdfc53a80eb8899d7fe566a02e28bd04c326a058d50812dd9be4502b2c38705ac63d5186899a1aa4a7da75f59b5666e99b979cf05c393b3b34bb231b9316cc543351bb03d7ef8fa967be9bdf2ec72459a59ccaede60347def1f368649abf50e31cdec0e201e3f585783e4d92154a260506dbbd13655ba6efefb2b04388306ba2a83450cd54386f9a3ebad69e1998aef9e9288622d6bfe5359349c84b56293072cd82d0cf13349d4bd026bf7310b48dc4eace20dec3526d75929ef345d47b02d3c100e255a283fe99114ab7fd548ea5cf29944b5235b2db49e66165f7339daff8435001a37b3a74a5a32c75157b3941f422ebc7ad5571613388811cc2fb73b0c73fff362f7af6694b3c6ab493452f6a6fc41ca75403d1e9ad0c868f9ff5df4d336ad5c022e516532641349574a5d901d1c1c579209a730433e34c7f30c6b20b49430ad0576aa54dd3c8f6d2f19aebe7313ca1e2980df0400ddb036b0bf56b0929d116cb784fb1dff610363086f5b3dc93516013fc0e4fe3ee008e88e2806620045f97d635e8097c15f3dcddfb3fb7a4373380b3dd01d426cce51e97d0aee0481bea5d44a3957cd7a056004f2435ffe35477287ec72788d519087cca9b27ab7fc1b2a0a2f75ea56ee1c93ede0390a4a3d2250ce97856b71e4c636e21ab03784065fbc70d342ae25ae38676cda860acf5f6772e6900e88159f365c4c4eb9fd04820c1ebe2c40b7068b6c784b32026958b29f7717112f93be5fa7ed5791e53c1820bc4228110e8c72d4e102115c2460a993eab2eec994e0c6b986f858cef0399130a2d0c2e960d3dc855ebf4a57e4e673fc351a86e4f95e24a021a57b74e3d6836fb55dceaf40e8509a593fdf7e84e828d51769cb294ae7895e3a86e982a1a6ac5f46804a9290dffdcd9081f7c7e71e6b9a4580544e1d07964c0e29ba110c2748a0dbc861ec8531748ea0399ae9689d96bf57e853effc0d798c3e037e160ca816bfc251b2394da3300d54083ed58b57269ef6c7ae6224c26dc0bf0c5c56902d8ef8eb066ef2eb603bd219ee97f5586c872922595fe77d2dcb9510b84131a3400044057444e51898053a1bd84a854f09c42e7701174dfb5612ff1967385b55cf9e0682781d12452fe075b04cd1413dced7c52b60e597bb53c9071d149f7f198b3fac95970a106a5933f8cbd6416f6afde1aaf09fdf37d2e1de30d7332b3283d7e7d5ef2010c611c463e78738699355a98792f0a66fe3f3033aa73b9428fd4b9c9d2207acb8c4f4f5ae04bf768b00e7cf65b4f1b29b9cc53f8839747db9cfdb48fa9526d38d57f10f4589e05f832076ba5e941c03bafa431e94a33d05281cc9626444723a1933ec87a3582a984499e1c01a79745d7adcf61cea84a45eedee0cac958300f361cfc83ffb939b92e63b7020f1babacf2e1399c4436c46fd1059e59aad7b458ba4f89f6b9213fd38db6cb81ee9b2ce5bcca898ddb9a5e2f20027fcc3bdfc073af86223bf641c9afbb3f85cf9bc5d7416df2e92c9f39481b8a62b35e0253bda1186836ff162b58621d934836ad1ee9deba36857e1a83f41ef010a109ab5c9851fb316e8d15fb795600b946e9bb4fe5cb0446e9dbac277f2292e883a446fb4b393a11b019c1ae1ac9fb4789f61b18b15ed27d8873364c4ee8553286261344da980d2295b7a8bbf4db7b89238e2631c333324ac37d5b2f1d831a96a7f141ae3bbba84bb32d337b31a6f98566492cb12e84cac3810651e80725a7a5484b46fbc074255f6110ec6e349a0222556761f6291d1913a175e80b76c8be6c55918ba6ba9f67b466c6e0ce98644fc645f6da538a6230cdfc1975778c46a1488adc089821e5f9bac427225663e33fbde91032607355976876375ca4a98f56d1d9ef977619b18e45aba296b9ad9d431eea856071a3874933aabb39baa53ecb6507c4a6d87e5ae4b05ad33d983b15ad95a2d38db1f5036c2c0c1a786fe15ea6dd02bcf69caf65b9385355f72f73823e710334f47db116665fee051937ad19b836b36b843f5e44e4c4350c0eb6618627f20da3c1066be231c18618147e32ec139ed04765fe14efd99f9d519a11fb61c83a1a5d4a2a105176201eb10a1dea7826837c42df0df059a973778b694ecef96ff10e4918f0428ecd81e109f0099230ba0671b25d8caa1dffad38115790d167e64c1849bbb2c6c5556230af1acfcd5d3ede0ca90d3d0ccf33ac5d65b2d59f137962c189cc7ebe511f50c938f536273cd40b816ec22f639bf02ed9f1bf419b2250875966463998f86bf8546f2e096fe50b744da19bbcf1a5ae371c4ce889f2650a740e53bbaf1fa9296804927b93c70f1d182a8ecd4f9665287ae87b5945ffa5e62e52ad7812feaa9c29046a856203c429b1e4eb51ed53fb03d82e311209426d194593b68c3adf0bc535ad59ec3991fa33b00d6d4fd7c151e68ef40aeccb78fd9fd122c39124bde40e94b2028e16eb2ed3e44ab17670741bc5541316ed264f847cf221103607b2f1678d6d0227f747e4e8668f8ba34500cecc66337571cedb40c1324ab4951fe15b71ce7356bd3911022741e2446ec3037ab0630e97288e1561e2f71705c8fda167cccb044f4eab61afe1c6acf700d657bccc7017543837f4516343e9e71a5e862bebdadda9a2edb13ac572c3894bd3d75ee565829f9baa76aa7891aaf1a40b7163a97e07bd302209f98f95b5628a2f45113c1dfb781b4769be61dc0582c8d09e4e446dce2bfce992404923bcda111c42e64c21a20f856fe8200f93782f6aff18183dcc1a0dc1cf16b7180ce1504e8b72cb68d90f0d4ee3b6b9bb99f0cf92b7f9ecda7e0e94c6845ba7f08e5c328f91ae7614076b8bd6d9da48ef16f9a29d5c34a0b4f2a82d2d92e8907dcc0ffc97a19456e2e2413e794a53a0100bcd11cca2087c32236746fb3716f0a9c62b33796416720064833a0cb62fe92d62ca463fd5ec128234b37e9e518a6a3c9fa3b96d0d88fd3015be877ae4168871932f558c52c932a610cc03b6683c95d49605d2ebf2d75d4289d0e88955133c34b505ef7294bf293a0c171f8cd5f5930c0051bfb62284557d06f04e4364f368d189b1bf6aeb04f00ea599791389e3332daf6a701a358d2422f9ea68468068b0476085094f98464bc305f0ae6f44f3d2adf0f4b4a8912ed59932b10ccc8cff76c7d11049a6fd1ccc0e28f76f5b861fae068041dc0fc8f16a14e7f02e63b5cfe61c622ad2a7092de1fb57295056ddd9e5c0991d0629c9894bdd30c1ab1a0e12b2e661d25ed5d981498cb37eb2768394f39a492c4ba41434ae1f660e9e20005dab853310707622b0c019ffd0a4e28201b8769117f95cb0acb209514d7ff9bdc2477fcfd1b8ee140b908982c6936b0bc49835d177b24e6f80aa40946cc69b85cb61c1fab107776a2825b8d3a2b47a91ecf32d51e2f2c247cbc852b681af9cebe6e3ddbacf4ae40fd80794a810f8361399b81a1d8be9b5a615196930ebbfaf09d16b91dac2baa8ad96564fb305cc434d966545a4bc6e8782253cddccfde64bec9b503320539905d555b30e09bed0576dec47bd8a54e0a9d63acd2556adbe217eb1d7efd03a615decac709bbc4bd5e4bccb6b3ed5e8a42d9d08844c3c647f95bdd75dc7370e7c4806dc4864588a7b446b456dfac8d92511b1082553e8f2c3457030aea4424429e5686ad1606f6e119884ddd684ccd05fa913602224155d2bd2642e51caf24bfe2c2254bab7bf56c324f835adf74ba4c7715e1b3e88a949db7b28e335961a76402fcddad420538d538415f50eed8251ab0a7f0a884b535605452be2cca302c6042a24950f7433f69553d2a860757aae2eb178865dbde4ddb1dd11e757cb2c39c81ac1d76b2c94c7004768786a8c5c94ec273e4d51ffd226c659a967c2a05da5d01214079feb612673062507ee4ca0a6577ad24c98252850d9c024ec17264601305ceae759132f9c7eaca1c172806379adcee3e8a3e3313126eded019564711c9e7c84f27f853d506964992f96a3e5a817831a8dae5e15f6d52b7747ab574376f2bb2e0acd8fe01fe2e1c2ffe7c08c1d677552a1fd96b2cdb111f3d0dce3465938d25079de769c39c642c0ee805eaea7306fe96423d02fa9566e3fd4090a6e5a4a054a1bf400bf7543cc5c001f5a7e6017c64d90d112afe7b26e5ef7625cbbfa5b8269da9f6ab20044cf771709e11d5c2603329380de4d5b5009af874573cb3dec4d00bb34264881e1404240190b17c84ad5d67c6e4081426270beadfc6a80ac8e0e25d49c5c7b11c14d4f8d8aeb1c4e9ec29a1d8f68591c716af9cb803bb5bffed4615bb1b306ad3fa31db16f7da7da8444a70409203c92168270fd23c018f1a40877ac1b44744c8370a116406a02571919b8faed40100d628c19c55661d5f4869c7a24ca0d87e2a7ac55cc52c4fc7c40ec9b1ba40137b9d71589479dac73dbac12a04d29fb1e1960a37937c2871502491079ee4ee98a375b6ec9740ff6f3ee9257060ccaf5ede7bb1fbadc6a34634caf92331bc895ea24b069074aeb8b94642fb9979db6ada8f76198668d43ea5828008cc59fa8f30eb37bba08b922556ab9c2c024359c2dc6ec19678b643a5a8c4ff4700562a18b15a1553b63a40c7014ebf125341100a453ea14685cfd218df9d4791de3fb8ece79fd78a362c529104088e8a5951ae1fba028ef7295696f20aca994c5514b90f3f94c9414dc42a36d1bfd028394d2545d80fcb540d99a1fef7fa349eb516fcb2d96dc25f21e1c16bc424beb1245d33d0229db7ee814939a6a4065ded5fa483e913ecfec27c14474b88813d1cf5b06a486a49dff2f41052f1f5903b2eb406c6615985cd659d2b3b3abfbe0442f7dd3c33c0b903f3cfe6839d9a9076886ce568cf089696d301baf18c17a65509e72758047fc4eeb7cc1e4db1f10538e362b4f5a25ad9ee2e25780a438ffebcc33d54186190a0d039135013f30c9a8e6a943f4842d7f0fe101103a68fb8906f6f9ee26504849ef3a60ab7bdc7efd3f9dbf63fa0a8043dc03603165bbf3a227136a48c8f4f7a978a6c05b5e6a890ac0564d43055e22d5eb132a00986a76f83e9928578f072f6bb3aba3a7905f2eb9cd5bfc725ec114e69e475d5127d22f73b619a3880906de89cb87451dd7272025e4250582bc079b97ef02989e06d973b6ac7b8eff4f3d8f765ea5e317260e6d5b12946ee326e1dbf6b2a2d0de9a4dde0f390a35f198302d5d963a7127b83d532233ee021aded82ae303fefd871b146ad45eb63945a80805b555154e7c4088eb545ba5aca314514eb9f3cf384fa85acc8cf27dd7bf87f337e6ec2d70d3a5d976586828e40de7f614db195d4a29dbd536f38d548121715f4c1d6b75e49b45b912d96606240b0922ca63e80ddb1d599718c46fd7e6df5d9a3c7382e722bc3b046a316b6d14a314818eb2288f32dc50e1a1179791afb50f2437d6d9a4bf932e2911d6f3ddb0a7e024b000968c44c8738f8eaf37ad7f9bff93886ff317b6828e2c1c81288f8f4ec0b986c34c8b63071403c7f72a2f56aebfb27a0c4492d6107e91185c3037812e72fa776b2d296fe619b06488e3eb880d2f574a7799c1aa7186a1398ce4c518f0c2a000b37eb3122e4c6d220d61adf2badbee3669359daefc311313a9c8925339db6b62335b80fcc53c01871159099e11578562548b38e1e4cf75cbf874f64af01e9f5e60c0b4fe5602701b289a5ef8a518fb71167c28de281fce9ebe7d200b8bca7a0dbcea9138380e550a7fd40132c329351c733c3c6f21066ed43d19dc3fc2ab8ee6e986cfdc2d5c6bb234d81cde22f1ca6f674c32cab2b72a232aa05ece2419f4c6009f04c533b6d74f7a3bf60e2d4ae802b935edabeca00b5c453c0054815470ea1f69a5b7b224aa40d27ef88dc575856d175f96e5306e6fb5ccf3eb953ac1fbbe994ff4ecce3ce7448fc29980749691f8006eadbf80c115e4f3524011f3e88deb867d1b33381980f8af90f551e21b8758addd274dbb4ce4c0724dde52fbb86460f927501b3ab11db79f5e7362ebb0d896ff9a1ca423c6ede30a61408cf93021c289363220c090716780f704b03778443cb2f69d55acdf17ef998b6f849693713cd2d66f51592e230bf246d06565745c46cc58802dd3583d3128487c25b3fdbd221a25d01438fa89648955106366bec4c254e7402cd9ccb19a19b1a70a3b5813c795c1abfd5efab3f759af6d2ea2cdc3255b0019376f99c1903a0d6c94ce6f652a31c061cbe638fcca6b1aaba07d1ebef760970fbadfb6504a30b62689fc5802747e3b7c677b455eb50901599c5592d584268358cb31e019f8e28ff6f247b1fdb4a18d5112f76401b3158022cab1494cb79fc3bc89147191dec29955785a68ada6026821507328e4e38ae85a1355141cd79e118d1713fd9686ac1e67ba3173176b4c70878bdd4d62883f48e0d4c7442dca3a3f4c5f453b8f8615df3b99ebe285892a4909242f25da0b1a968ea134df08ce5255b70db6ea1aea001140ea6e28a59d53a5a6122f539744d361456417dbd74b6686dd93f1546bca8e16f691d34506b802115bc3b22c4d71b4bdaae629aad25561e7746c3cd11d8938d9ccc29accccda95120338026598919ec4487eb6d5ee3521fa419478dea4ff62025f2389faed52c0b7bb46cc09a4e6cf480b6ac1fa7a10c46b744aab6508ba7cc8c1a60701125060252e8b5ee602b6b8e156d506321442ec2ae029b57f881a6388561a9ebc064f1fcb6b0acabab4e6df5572c7243bed6727c093d36442fd69c07fb9fc8348975e8eed7a48c29e56333ec05a7f86e067df175922ec4bb365971ef362233f981721fdcb1880f3dad821671bd5aba306d8d33378a77eede2fbf6015a01172430e16e3633acc9cf0decde5e430454d6161a24235f1cf42f0857aba0aba4f363a9af85c3dcdeb067d88716562b03ec4d77bb16872307fbfa12f37585492262a0188751dc6b8930373184a03f6a5e39602f8538c7bc0464f6928a47bd69608475ed8a802c62edc70ea50f6bda90543903c5f5ca389a5fe91451a010dd45e7d11c873f86c4b94fbe5af2414c95eff960c09d1ba3ce4c1edf1ada8ccd8d500ad91c617758d3f85474b3bdeb9ac2a780d0ccacf7099e84b26618760a7f122ddf5883b0e106c9a05f136833d9fc12e6dc3201d206107b09c254fa7a4f7b8d55a48b288ff8150034a3f63e2095f9465b939d803ec66a44f938d4b56abda57f5bab7f07fd653f56c1bf0cda4cdc2cf6bdaf12e508fc33d920c317ea860857a3a08f364f94fce0e007bac44942383d97ef219c92596013e7ea857f35674db1e6b124f5f1d5cd2a399217a4b37d3e93d4e56b318e10bd14a0d9435797d25331b180be34e5003ca666d1c892d119dc8b00c2394b8470ff79b04f1c36ce2db3b975fdc880c7d9095d810e9880260e58225e443ecdef7e11d93ff1f265de55717c82920cca981ab0e55fa2434b46031d7df7f2b5db934a7ee3d847074bdd6f59b111ccb8970e0de8ddd82859a29df511d12107feee38763bcc25931f669d91e16d02eb4a7e61f4222a85a21b8cbf3764be7a55e6dff78da96fe692489a3180191c5f27f54ece1f5c3f998fef1c5ef9cdf499755ad7d972f11518b421498a892d3d0f02a4fd645764f32caa501898dd26f09c90dff2217cbca54572b41e9f422dde1ef6a2eccacdaefb7decc4e2bd3f4697de3ccde2488299b250be9662c6d7c0baf8eecdc01453ef1ce916f5218b7abbfa400ad1e38b1b34ba54d8659f100d62ea368fc5f92cf5b4128c432b50504d406d760105ff483d7e1f7a06d01430e5b552a98f464e60d4d133edfbf5a981c52bf565163ff81b10207c3ee85cc6d3afcfcfb71878cc1c4c203843744a146cd937f882ff79d6fd9ddc8464a5605b03590fa51deab21749d9decce17cc20600d85b9d02a0e5b0004389b96905b3f2597a1bba506a91936d57b474168a8080fccfd24f145fec3f1ff221ebcda7d5fe38eaea33794f95b265cf7d26d365dd95a7b2dd272c1ea7ab3149a6a0f068f771f5ad845339fdd78ace24f6da42a60afa12865883a7918f93b5b695beef9900b83d03f2a0460f50ef397b3294706190770f8cd840c61d8a89742d58d1cd1879c96821cadc6a065e7ee5cc45e32c9de62181e4737bc99dabceed8e052994c66d9b08f974e6193e9d08d8babcfa040c74a4d58a817f86ea11f3f9288fa91be3c8cfd847b42f74d2e5cb2908b072682404812cd622ec6dc8c1dc5befdd404ede25d1eff0df141870e471401b56f06964da8bcb5c25ff00a8290fd64c9f3aa4250d6dc430b47770c673f6ddfc1b4ec52847b088870222947568bbe9fdf49c99214c1847a0840897df9853593da95a6e859195e743c251b83873d5fb860a7c5a9830b54010513b8a47c83d18755fa02d13883ab14b60b5c5576c2d9dc751b3bd3f4670fd2123983c624e2b97cb850c4b56c85c68379edc2776efdb682a3e50574765b45d5165e8a7090289afb772d48771a1d35a60df739ed4e4871b99ffe95e22bc3fb271ef831a8d183fed3f9398d8ab926798c48876308d878ff704f4b2daf08392bfd99a3938723cfe78f05e8ee3ed694992c539bd24f826766eaf15ae1f72f3545e7eea45767a64a506bde436f536337754389336d91f8003fceec451870824211631577fdfab7239f5221f4f959e95ca8db3bea0031bcfb2b9b69bb0acf89adb5ae3e85efa84f5caa7e84a5af22f49850582b621e8954042524623f61af2c20662dadae729398fe710487fc586d2a2ca1e3151b1a233df3841a90f69b133f7c1529957774fdf505ca804f202582613b1cb3341dfda9c3ea3eec5b067cf1329f4834592a217a779eb28a4a9c773c71716ecd8917a76fa0d760bd4a838fa62dd0b2876a2757f447622848c18871bd94d6b0eb7d0c4fef3b7a452f8b1b46516248be8ed619e67c87f1166ffd8ca8f40c179808b2a86fd628877b4a8e4f41cd05d9e0b0d35c4659b21cc7560dc12511c507ab4589900b07d7b5e3f6e27d428773bd44a21d400b1170391b552900dc4ef76ca0b21a470eca1188438cffb6794b638675b3021099dda521538030a4a4647315f82c1c901ef6ea60a897d6ecdd144fefe0c959a8e41f578305eaf2aae00211dfc4ea1e8700484c71f6a25cce80ab3a841a9ff4c5dfc334e1cce5cf35709107252a4990c2367b654fb89612989684c5902066819f49585a9148b052116c43e9ad76e268a98c8de63ee9a714d8f3a256a4d426e620abc4e03f86f934f7d82e59a1947754685bf18be0d43ccdfc6a5f5d28d82c6f65be024a66107d6054ff1bde0246a1562ba3c94eb9987c86c894c0c02a45361216f810e1a3b7c98cb163ed352c44c439b7950f53759bd33e492e609895ae025d214d141b3a2230a78623ec1b023ad7b77bc62bb86fb9dbbe02448710dd0f746515cb6be570be8f2996f64db26d6992da5796fe8894ace0b3410b8bfe80479269f7240bb9b788d6441c08628b7c7887ba9def329eb24a090784b89cf4b0b706e126a699bbea6fca52d0522e0f7814c886882783636fc8085372407700e3658d64c0412b7697688c2a0e73c8991847d9aa08c8e68644e4880137e8027dd3b8a1e1eff41cc77c1f3a813aba7f0277b639c6f5fd278b1f58c1615792db173c17c1428e6f132d8c34c59efa520235ca3f9788254ba977a0d19582a9d6535a4a8356d711e1c3ea004f68ca72adfee186d70daa8e6ca144753b52acce2f1f270010e99539f1523fea8793c7e83c4aeb1c187ed5cacaa0ef3139d975fce5c94b85dcd16e5ac641ff0d8ff28475db2c3253b47053eaf0c1d4d03cd96ec4496301dccbf99ec338da2fc81b17f40571c304df64510ea8de0644f04291420acba3250ce93a35ffc2c21c519c3c0ee0d4b01ae80d2d5ad3e39e509710775b26c2b41e5c248381fbb05a1573a0b2be999a52a5d5ad2e6f33f0e387fdd894172ce846deec97bf6ba2ed6eb8244f6229f7b96004effdb412fad5b91d6fd87fda4cb82444fe260d58f98d3357495ed8cdd090c7ccaf04f63dc73d38e38323efc5474d2213b7a0a44497da5800946d58d6da3e2803ba048aa73e93760c262c33a8b23a4224a9ec11288efb1b01e07dc32d7a0d73365e90141b86eaeaecb9be083eb45e648e003026c5ad3d54bae96b01851aaf565a370b6a0b69e5aaf7424d7d6206d36abbb22ee40430ae08a1c9e33e0ca599709b6a3b7cc1aa4898c3bca704f012c01046a3dc3a7582018564d07f173b09be9d6c02f57728dc798bc69fb187b6732d3649d861e3542dfc7bb257b4f67d770ff80015c20969817efd16fe5a43159eb9bb12cf5126f7252b3c16bcf5ec447f58a4f1d4d76db7bef2de59632252903360a650ad909a76b326191cadceefefea04eba747447a61acb8ca1dfe1bc728677be8b9a37a190e95759339fcc183a9f4e9bfbbf9b79badf7f45995b0b95f829e5f264d68432863e9530f4c7ce557c1f61601f676aa67cd2d4a4dfb9673afdc53777378b0947d67ec41a4ba6ad7df77744c9b7a43d89ac1744793aad9abd1bd779df08a44199e68e54c34649e5060ed34a0e1d2c2d3b7874a14769a84f991e27af430de04d4d562dd368b3746f5559e34333a63a6cc6780b366bbc1fd89d1e2b47852361ea733a43c818efc75341aeeffd589885d9278dea0183f703083d1fafc74bf54b4de120d65d02a34020001e046178b083c16030d0e5c16e36035f78b06bb55a20283ed80d0d81e183dd0a0441f01fec8080401e0f72b3d96c06ee78b0dbd9015b1ee46030180c6479902b2a02753cc8b55aad1698e3416e08e486c0950739d920089a1ee48080401c0f6eb3d96c06de7890dbd901551edc6030180c2c3db8151581361edc5aad560bacf1e0363463ea10487a705b812b109c0f821b1078613018ac08bc45207ef079e899edc1df41d274ad560b7c245d87c02f226beed00a5c812f7b05de15f83de80f0281337006ce40f0b90b048276068277070461f8868000f0523018b0804117d80c0683bd3012bbd650d7ea5a5d6b28d7fff0fb6ed50175ab6ed501e5fa3c78783b66ddce6c36eb7672fd1d2d1d0bac08068315e5fa2d3ab81c5c6b886bb1ac6c266ec501712b6ec5ad38a05c5f078e7b639b713be036e3b6d98cdbc9f573a8d812ac6883711b0c5694ebafd8d06a6cadadb5b5b6d63694eb9b4858c0358fb6c9b6da80b6d5b6da561b50067f9a40101447192404560483c18a727d1c76bfe1e8ba4e1c7ffc680db55aada1cedf0dd35d5da0bbbaabbbba40b9beab509bbd656133a67e90c7f27c3c9587e30539cacbb1309e57de715927e4fa3eb4c0e39dddd9944609e0a94fa32c8c2ea14001f89132c9a3d38f9e2e216b6c91cbe8298fa479e1474f538db22c1655b1a80e8baea6f4cc9b216baccb75461e894f1a655550a214c17a26e442d6581f9f260c491a1ead4669b15850cc3562f9d17b14b2c6e2b80ff2e8fd47d2ecf8d1fb4ea33497cb795ceeb3248f5a7ef4ce0259a34181e22ec8a3f71c49a343d6288dc59ab13cc57255949e315941d668424261c4244d8e268dd254434f462b57c81acdc7070b21498383d5a81a8bfdc45aa36f9f9e29fde8bb0959a3e1cc983afa1e7de334aaba5c9de3ea9d910a1ab2a6428192c614496383a85195c58ab164acd9939ea9d185aca942424f80491a12934655954aa8c908fcd1cf1fc89aea3363aa4f10f2e82790a4c13f8ac5664f8c35e26090473f8f903515c787465197bfd4774d8122258f1e04b28642993a92a6fbd1f3d033f347bf83a4f118261a3d92465196bfd417d2228fbe88aca14233a6be14c24154a3efd128aa3ad233de8f9e88a4b93ffa53cfd81f8d01c8a3c7389e619035d4c745d2d01ffd6d94c7fca5fe68843363ea8f7ef438be21a3a06c61b62800a2850140b43018440b73118b72fd177c8881c1b72c9765bd6559962bd7b7218e42abb23e56f5566555d627d7afc1e36389599c184b2c6671727dd20eafc505c5c5e27241c9f5b18ecea4b1843496496369acfa600e6e4553693e9acaa4a93495e693eb8f706ca59886132bc5be58fdefc655714119b94aaecf0525d7f76cd81a95558546228bc512caf53b920656954f15ab8ac395a3b18a23d2188dd1188ee74e0c4cf3689b50171497cb0525d79f9b38fec8f5074b88c562d5f71bfa7bd7fda4f2a12a9f5cff86f46dca5696007801f88abc70a1961b07b13469e512e613b18f28d8f327a9542a05a44fa3b014545fc60b7231c89f389143b1b3bb63677666677767c54ea19e71354a00b864f2c249d4a7fa3dc209a55fea77eed9f798a3eecc29ceace9a6cc986ac238966b3725d7c7c9f56948df862c1ececc519eaa5fa6cc1a2f081953bff6e43abb33efce721542c2d41fbb2ee4fa9c978a82e97b41f74ae9fdfce49aaf6dd23323b643f6e5212e35eae56bfd77e9acc785357b6b68d678413366e5282fe52ff5316ef95076cf57eef96a95eb8f5ebe7379d2be432b4fda634775f245fbfa5ed0ac2db96ada8f9d472f28d7e73e1b3e772873bfe67938d7495f7e53a433e0fe996b0f20fcd1327dc2383f018f4ebcfcfdeef67479ebc89f9b437daa2f8070c2faa57e0f592934f5cbbbc8649ae73765b2977254c974fa9acad545fff6885cba87223ad9012c877e5a597b1d46b4af341cef6f0bd07e1b671af9a6f1ddd4bf2198ade860a6620f609e528c6459238013ecdf239d2eeaea93f6429a004bc0a37d656d356be66bbfcd60b4af790409e31ab720fba2740b72d4d6b305699f235301cf9ecfe5dd208f5d0a88f2e79a50c0e3e7cada6f3dbe6d3d77ebd97af24846451794a7dcdee427ffcd337500e8497b11c0f63da976addb2cbd1d5d89b9755549b86403c70d1cd6237aa5ea743baa8aa56978807f533d5bdc415bf39b8707d694a37acb3bbe1ab4bc8957c2c8882f48397b64f91d0cde9434036800541d7f99bf5ab1f26cc1f07279410022f7f77ffbfa0db9dbc6fdb6f1d0b6991d5f6fdba1bda6f5f09ce6b37c7a7a011e2f4c0b0fd1070b8f1762643c3c3f47570093180003fcb81183abcc94502dd6134b24677a6249eb67c913ad1f5f5259354212ee8090b403601af0e768e6a3f17e8b570d118405bd7a068c6d2167c03040582c8c9718effccd3c22a534efb351d2445ce3d146d55455e51eb15649f09c90c0234d8287d5c39304ab876715e41beb113b2b55e89db79d23f2ec59d111a7ed646e3ecd1d02bc3bbd4e066f06211eed93477b86f6a9b3f12e8bd4fe7e27f30db9281c5e4f8027254db55f32bde7fde8e58e0bca1a1794c79a7afb3e6278d49efbb1a6aebfcc37c45e2ec44028ede873a1d7791488e7d1d06179ef6f9ba6699ae6afd5ab699aa6bda689e3f696da986f48a5dd677b80aeeb86f82b571c28eee3973f15284b39d6a0dc35617effcb4688fdc5891a8f432178a8f15d8db0b2c2569ecf8560585355f5023cd6968f2c3f2d84d1d1c21ef9ceb7e194ed779aa78502c81ed67a92011e2b509e9676aee228811c4a1b2d7cc9a4f0d6d03536cc2044bc1fbd6dfbc9daa74835c030c01806b5f707618eaa214a9278fbc158cf804161c819f024c120d00a0cd297f986387d04500f6fee640c00607079c1074c8f0188e1f3d8d1c22280975300aa92af9168d136b8e8030c1f60f8002377a09412664e70488ee17e1be86ce9f3d5cdc9836d98b023271374f28cc0f6e33a79fe9cb36e2a7f991f8bc96479ce394516a5de5377eaaaead419758de53d55dc52fe02b3051e7d8795fd7da767da79b61f2f42275d464f969dd2299330b4f31f57c1dc8b207294bf9ac834894c8fc83496a92cd3173b716bbd1cb579ea67b2cd6379d4883422c7af1165ff6ea84fb03ef9bf248cb7b2df7caea236b469446ee3c16c81476d28fb8f5baca936a4f9f464750a52d3acd5ac464b5d4740b328c7a0b4565a297d2728a52f3cc162a294564a29a5b9d64a2ba54a9ede80a788973195e0b1a38545478e15138e1b160b1b3548181c65f99f279fdb68183a78a4d96add2ee8640f00a8bb33f0e875b36708e827bf93a10d326f01edb5cd5880ff57eb7711ff4fd4514523d56b098988af44b54cbed0efefcf91ad807598e3fc29b64f27477fe2531c266182c023f5d1a1df871d07aa333a4cbac3437b24cdf77404fe68f45e38822391aa66e6be9b6dfb29b3aa4f74be90ee90ead01cff01ea17d5cf193cf251f829cc9ff48bf4b0737f363855e5f4cc266eed9e69741869aeb6efe9047edff155cf542cb6ac653ab0e88e539f964df166ceb383af57f41579c9ced3273a9ff489cee953fa44611286eae0efc3ccfdb4c5c4872069bcf07bcffb1a8e9fe889d4a74f1457569fe8bb48978c814767f964faf4a9cf48bb88d53372d634d5338e6a1dc817fa3eb842c06d85a9b5c8f451b26778329d53bce6e9991e097e43a637c9b4e44be8744da11994847cf9b96275d6575de43b6f92346781477f98a4b94fdfbb9034db53fffed189e6fd6efa67ff6f46fa7dd4e1a291535ed1a653d2ea3c3dc3893dfae42887f50bfd7b3136997efcbb7d7fdd46875d879daa58ea13b5b84fd444f34cfd302da07f7efbd73f42439fe69b98a0a59ef1a7d4ebef4127a5cb2ccd2642fb0e002ec023ce8f2969be7d53901589224280ac693fbec82019cb1fd8a14f9afc1ad297a10df5299dd53fb003119309e3232f29d794524aa9e72a8e40d06f0827eb3784137fd0e99ad4b8a79913257df92262e551c6b2f6f635bc83c9519a7b51d65ee3b80164c9451044f9fefcb64df4b49f01d39f79bc59a35226044a29a594babb53a71b2501f1cf071698524a29a5148949a518feddd04a3dfaf252d95ffc30fcff6f697916965f597993e95554be547a12e9f1f7bde7fdb6fdbd4fe9d7b7e149e9e25ebadb15fcd50565df5a6eb159c3e9e86cb1d98136e4cbd49127c5f11db9d2f4022b7568c7b5389d562b04a50d79c2215fe8e872031ef43ba224e7e941a1a8a7675ad99f63e2dfadfc3b9e9e999d8f3743cff4a3519690a8f993e4477a834ca1a03f68c08f94496886444d18921f69109916418f5880e542a23a75e447f7223b155c8c223f7a514b1412d52c223fba14d9a9f02c86fce8af47f58b861f3d06d997f01be41f7dc98a1524aa67427eec31729be1412080e50a89f29e203f36127273d15e1ce0c786a2827217901ffb89dc51b4143198d0902897f510b959d03120c08fcd4342d1717e91a715e61819a624e7d044c2bc620e21f7cf1f48140d82e1c7f9339f984de4990490cb8f3347fc710ef1c28f120db985dc0f821bff456ed9058f1fa51354ddbcc78180dc31e486c94d02619097bb173be0a7013f4860370c58c0841d31925240aa488a45846503ab06d610d68b8657025e36af97906d350b52d343d373801e171017ca35e38ac1f5c300052080cb6462563e5630ab20568fa001040920e825e85e8c4dac988b8ef8028f1c3a6ed4168f1a443688461714c78bb1a6e291c76ed56ac2cb15e4b29287096bd4278761e7ae85d3e1018bebe1563495639c0ab8d44c1686e2e84f3eecdc1276ee5682a2007bb95a2cdb6a0bc2f6b3b1b69e961671f49ddc7925ecdca9c836176caa2d359399ae0b0c22d86b65451cbb499e9d55c2ce1de9f614a1f5c36295661789ab735537a5a2228e8d936767d24b4a8c0846842dcb6261836ccbfe9048e23899e4d9f9b329cb845d591dab9aab0c2b431623fac4511675dec2ce5dfd51822ba8b5bd7c85dd4ae5a82e89aee544143d4fac9ac8fea326c3fd63b7ea21619afaf8063490817eda2393438bdf4f5312356118f891aa2ef023d5b1c08f74ca0f1cfa894475aa023f3a140afce85126d02ddf406ee81d2d896a96047ef4a008fce82e08740749d2fdbe2351fd7ac08fcee3801fdda701bdf22d0449e7904954cf6e7eec19037ef4d402ba6938d24d24ca7b8cfcd8430af8b19f1469956f22447e6c2c8424cd0d9644b9cb861ffba7861fbb35a44bdf47686894cb12f063e7d8fcd83bb949df4884740d2289a2ab197e9c31197e9c3204fc389f2409d24c248a06d5fc3885687e9c4d0ed0dff70d33c681f44f204933fafeb992281a43f564c5f0a371f041a22a017ee26403c8fc0802599303f8fd3cec2069b8981f654c12c13c12d9a3bf88ace1c04b901fb9bf874471ad233d73bf9fc8e9c700bc7b86a1df45d2685db3c38cf97ed337a47f36a0819f0cc8cc9ab9240799cce96060c22e306116104793ff8f59335938885bac02290aa42620029935d3e70620128840b32020069935b32749906df50071bc0e1047ecdf0021b366f22011c7f62bbb11c7cb00710134cc9ab93a225e97911e05f4141147933f9159337788b85c8eba3d36b86a700d993553870671b4b304b8ccc665d965d91fc9ac993942c4b1edcb5f6658c9b04280e89f64fa0719ca6e5933e6289b4acd18ff9a209aa0030401815d9438de1971c431883fc4d13598bfcc1a20668cbff6336b4a3063fc0da053001d02e8c88863c7882d1fe288fda78738b6a6fac0acf1a1db61d6f03063fc5bfe2fe2a967882a91e8224659326b6acb5b4bc2300cc330ecf0e58d18862e2fbe8b18861f86e14b0c670e5f43b5858428509e28610a1797269c0e8bd3e174381dd60bffffff1f8661f839be9bf0ff850fff85501c67feff2533ff929f275c412daa8330a4ac17c2ce62cc27168bf9ec68696969696969f9ffff6f59f96ebea525fcfff0c571e616b1a5a565e616aaa2397408ea4355f04f71b6a09ea0a0a01e1e2c2c2c2c2c2c2c2d2d2ddfd2c2f2f2a68585e5bfe5bf451c676661616181c2239c99054aec8b3c3f35934da1a5858847d879c78a8727c7cacacacacaca0a0b0bcbb3b0ace0f86e5856565a9ee55b58c471e695959595a099573cc8857c084f869a781158589c896c2593c9563a4c2693c96432adacacfcca8ae9c677b36232b1fccab3ac8826d3cc26e7f11e4fc25bfee32c57626545ec9ce3ba76aeebbaae6be7868a8a8a8a8a8a8ac9647a9349e5e58d494565e54dbf6212c799555454546637c299556653b6e0398e5386c954747b746ecfedb93d3a384aa552a9542aa9a8a8bc8a4aa9f4dda8944aa65779934aa9f4a55269a8340473228b116da1a2f2c21176be31cb99cd663935482412894422954aa52f95482f6f4a2492ca975ea5248e3393441289f453239c9914365043d1a4859a49f3a054ea252fd5eb655f536503638c31c6241289846b7c37248c4b4ffa12491c67c618631badd345346bd546904862e71a2c1c168b357146dff77ddff7618c1fe3efe50dfe3ed2e327e1effbeffb62337f33caa442e3cc29b3688281f1846253336553363553a0e7799ee779dff7fdf779f8bbf93c0ffff7f8f3bcf73c4f080c67f6a6906b5241047b4d2bbe6f068161e7110c08180c3685dbb66ddbb6cdf3bcf7bc0dfc6ebc6dfbdefbcf13c76d9b3d7389c96402cd259309cf9b3cda4f09b41fed47fb9975f7de7befddb6edb7ed8ebe9bed5eefb7f7b67ba7dc2966ccd5d4519d213b732a1f8a28a594527aeffd7be9f7dd5c4a29a534e4a2280a94265c2961881cd5adfc65ba49da5a6badb5523ad22c6f68ad5494b5fea83ffcd5f5643780949130b33b1d9e6c54b7f26ec9859b4206c8bbbc866b354a4e2fa690c76ed5df7d37b369ae2649d42991fd7d48c1fdddca51b26b9eeff293bd63657f69a7a099088fa7cce299dc6bbe9ebd40705096ddca9faefac56be4697e0d6790a7f95ccb5109902ff5fd7545d622cfafcfc39b5d33111ea97ba92c5f50928139674085ebe5052ce3dcb84f7e2f969e27615c7642bc6cc8e8410b5c361eea80f22d440f9e35924750be9e77bfefde3902c10f7b974442c30731100af8054804ea00e527794e4e0875b9171d7d43660d1b9e8da694eb1139569fba37284a98d95cb12a691b2ab1f91b60ae87f301e5ce98e3883c670e9e3c3f874e9eaf42459e2b41798e2a3af6a7cda882a392e332d89ff355529286c4e3862f447cf1a3b25d0cde7bad05ef1ddd7052a10b4b10d9d8b0a5089b860115b270d9742bde0da712b3590eef863d8a78f2b2b1a1b4e9747836d491e49a6065d3b178d7bbb6b3716f8d16cf864a6cbaee7380b411c22ab1e9386e2561fa418e27f77349c82d8b49474e4619a3e2e8e5c54ac2b872dc95a4a9332561547986765e81ebe1baee381f0e8081c7cab1dc65b81cf090de7ea17535430c6bef7408c578c7b6a39b4484e184958d0d75706103f6b810c99736ba5692caf59514c1e98f4048aeaf44874a5f864c9ffa8edf91fb77cc4047b97f047894fb473cb2929946ee704441109dcadf907e19f630d3a03ae8302243ee1f810cca52d4514486dc2f834c2377d4a3d35ea1d3a175b4be7fa7ddf00a78fefd6e738e078f7cc51e78642969be1a70ee61caf2e71e26912767cdec203aef3ef7dda7d551a50b08b7e7421b661a99db3e9f21cbcf48b561867cc51e66c8f73bec4dae9d8e48d0f9072d5f2bded4d74423b88b39674b8d7adac4384818ed863e69efa30c3c7a79d37e94441367aa66ce0650da732003b226c98cd15ed39e084877434981382a898c497bcd469e3f4a2664ede9b649a2bb7db76db4feac2f69bc4aa1932e3d276d97f72e07e90b2c67cd9d31fea71b1c75c589f3dabaefeee530de4c233804ae3f4e1c2b8e27faf55e531e3b4f2a678f8474157fa814f7ceddddddddddddddddddddbf47d249dab9201c9851ecb3b2fd66d19163c5f438666ebcca97dec6d7203d067f740449cf548a12df9bfedd4c27b2e35b7e8748436e1147d0f2fe2fec4e7ff2782fdc9e863b34edbff0fe28fc1e0c478f43f04921fe1a35be54fa1ba1cae3c0f12ba1a925ec0105a97bb18925e4f13a4296cf11eaf89530c777e1cc628803c58e27e26dc4cf41fa02ff6c1f054379f23f364ff8632f916d947eb1efe1cd189b4c1d653ce54e1ce7d85156c4f1945b42993df1bbef8187fadd7846bcf7f75a5ab2378fb08b665376842ee4ea17fb9203f2e52569a86cfb6a095b6eeeb0652c61eb087b16f64ae8a93ed937851eba2a7495d075fa6477fab4ea93f3380eddc747a12ff11f206f05f5c9be18ba50bf34991d652e69a09ef11f7fd09b439ffabb092025cc8f3c29a5007041eda6eddd9fe11ca2de4dedaefdd3adeea0ee281d45d2d4b7dfb22873480c59339dc8182992666e2161e64bc2d8f711061e7fbcdc7fdcf4c3fdf6f345d4deab656d9fdba4e06ebee66b164d2752ce2eacb5f62baddff5bbae90e4869a2f7fb13fbf50655a5f44b36cbf21b65ff66f1545dbb6d4278ba44ff3652599fa34bb1bd645aef5bb76bfba8a5da5c9fda5a35bcee8a4cba8016994c95fec5b6b6d9074a1f90197ac3f376bbc97fd72f4dde8a354d3b41c498b7aa63fecfefe40f3f73d80f9eb80745df7b7237a98ebe27bef03b9aebafdc5ed2f6e7f71fb8bfb55a2fa0bf962ffdedb7d37a3ae7bf0470f8ec46e76b7a148943d798ee34cb9b6a364fbdb8fa3dfb0389ebedfc41eea7ee4df4d27368c7beb11e934adeb36d70bb6e47e357426c3759c8907791ea5b3fee4b323eb12caf6ddfee9ffda6bbbbbbbbbbbbbbb35d7e8133791133b6e1bea53f7dcdbaf48ffbd186bdefbdff74423a7a98594e77a91cbbca16cdfc70c8f9a4ad3d18ec8f6b59caaa95ad24823dcfbf541856649d92fa2581640962f2226b92391784a5e54e2e993f5fe7a7fbdbf61fd2fa4afd9bc692f77d1a9cba5114fbc2fbf1f66f63495cb5c2661ac96a3d33395fa46df39ae5ff3ee3b00652873dfdc77f7f7bbeffa937adf7ddb7fadecfd3d0348c6a321f833a4dfc911977335cd83f449d6b2464d59cbfce8fe2b6be4d839cb77d3621077b9819b7fdbb778573e230e8a23f8da9bbe1bffad338001be222f99fa7082bb49bfba5b4ec3d68184b1df613f2163ecd7b081fa641f0cfb27ec1dcc182824cc926649185b69ed1c9f112a4ed514674e9f386ea5a34ac95cc6b1701ce73297712bdce8b99c29eb17fb404064764cb25c05e6feb3e18aee3fd0ecdf0398fd47df7d9fbcfe8ee861a617764d1dd4d40973cffe5e7b1ddf4d8b9af6deecd68c90a819e42ff65d307829019b44a3d168341a8d46a3d168341a99be21a389e3e254713f7382a6cee9df64c29815742fc653a73b6de2dcf88cb4278ea0f87da7813e66dfa51ee60f37d3f7c21ff013bb0dddf86eb8ef963446b8ef1f7520bd0f33d7787b310647de9742d78284b16f23f431648cfd1ae124853327bc8ec5f15e50f4fab91fb7e7bc59e333d2bf893fccfc7dd7853ea880592e9b35327b91cf7aa6be7dfb74d55df568a39ae52ff67fbc56c9a26cbfe4672a9c364e0fd13892866b9cc6691cfbcd7577c4f1dd78a2278edce3af48f79c0ed876a20e9f3873260e4ecfe8e81f01a54d8ab27d97bcd8f427ea72b9ba0278d38be84e9fac94a2cb0ae0321fc3b3e0453ea33a7487aefa648938caa7748ec5c9f6afbbffe644311851b6f6ddb3ff953532fb7b7286cef4903272a676e0f4795f73d7bceedd73239d26de18686ce65e6a3ce8f130985ab0caa7a9e48b7df99a1152ae7cf03a30d9002b316a30a0b2a987656440a2a6cc41d2dc5f592191e40f34f7f700fadfefa6fb7e1d5f0d57c45e9fa85792e1e179a8693a39aa9d7eb10f0464c98927dba794524a27a595d25c05bedf52595ab65f97344a767df54c0f336fdfc42484995420fb238f95656b94aeacb14ef1ba4f1cb51fef3bf187993771bcdf7df71e176a4cb49606f4136a3a12c6fe166a474818fb5ea8bd60c6d8a7a1b6d3a7559fac8b41441ca5f1f48b7dd77d61189116cbf6351ffb3bbe1a3a93a1923436dba733da44d2787694a6a2ae1963bf5db28e1f68f6be07307b7f8304f9207d9a9b2cdb8fbd4c2e2c8364ec370d7231b56095dc236d22db1fbfdc5f258a36215fec739246e3be9bed1bfdf72399bf2373f4ed63852c6739fbd4f5efda3eb0599f91ed3ff187495dd6a452b5d50114fb67137b890b911da6ce04ea1ea18ee5fc0cf9acf3bdf79b75e3fd157f98b97bf1aba1fbed3bd1f350cb5d38a4ffe6f4c9fea7d32ff6ff4d18bf6b3fd936eb3352c55e325fcb9130b60cacfdbd7d721b74e87efbfbe3c3cc9ed84b6ec8e2584b284fb6ef84cadbef9f96e1c65b98fe4f3c752aab5e2ede0b5f0d2deae089fda44ff67d98b9131bd627db43433da3e3fe268e807a91cbfac4eaf76e09b398decaf44bbf7dd941d8657a3dcc7ef7c3c39ab9d0e4284dd52ff6edc5a6f13953b6f3fb39ed3362dfc51f66be22ee93fd7cfbfd6dd664a3260114bef7effdeb0010ed5e691f4d708af60baa04fd42bd59e4c5088f96343ea58f171e5bd6efaf7befcf70a869e76c657a3abf452fa77ef909b9364a1bc76d2c264a2a37be26ba1b1efe86e0c8c138b66d7b628a0904ddb6ca0b3a53ffe81ccbbdf5e6d09e7bfa429aeb6176751b524a6bbda1274ff56ffdeedab90380d58166221ae242ee1f6bb27c1aea6b2fff0040240d779d56eb28151bf9dde6a8928dfcca715c67a3fb86d0efa4a36ad858ad0433a6fd47909ddc3cb97b34e1aa4844a4cd3c92cd94af0b359beef3bab0da7423af0ba94d077a5de8361df63a92d785d3c6db487913418daf0829dbef6cd4b0232961b6b7f970542598352790314ea344c2f48f4d431cee7783a3409b8e4660a661d38952bef84dd2a79b5da4485ea0a34636f27bf886499fcce974a94dcd353a1bf9262fc4d2519c8dfcaee4a8cd46e2e07e2f0d4c6fc8ff701881fdbd7b6e78d2515d78c3c6da4c9932050820625878bea36ed8c8efc0919430bf750908638cb9e0444a3983e5a1e103522a954ae9744105a334706063c937f6c541a39c651eaf34a4c8dfd3ef2f0b4a4068f7170b5d8801e6a8156808ddfbf61b72bbb0b68b6ca7b020db2955c8f60ca06c5ffb865853183830182365a369d58bdc533c6106291bfa57e218b8c093dd51350b5c70c105ace49bdd1232b64571a20732067b6c52420a4288c213b12410296193a41b7773a9dc3f42c85dc30665cc6cb004278a286c64a64d3d7959d91ffb9bcc5842f6975c64ff29e46b62c1e25206918f590b72bfe9fb04e49101042b232777e329c8e4b1b40526ae97942764e06421ad5dc1851661698d01c5e54615f0f4bf22c6a08d09c253f3a1b6a0a3d74a7771a45f35777f17a9d36009da84b775010aabf244892df030818c317e803822ccb0a53182d9cf124be4e06431844f7a5d98b9a2c8a7093297145334142772a010c18503278abcb882e7a4e6076a9b01db6b7f0452328218697c22ee13be4e5243981b1a374b2738f8a1b176779f4dbff60e40b2bfe722357cb280c10e40bc271388a4165de45cf1f3844eac2705292d0544e0f02b62984256851674c0851498b0620b65b895d256ac90b0557421cad64f3827daec86c678faf122630a4b9012032d9c6183c2b1051ac8aa30a50b4300b219e54bc81172ff252aea21ba4ce83a29693429a5942de594d26a95d2a64d74f5ab13485c14f2429fe606f8ed43914403020a1d0d982f3fc97c39c524f3ad0884145f9c3f62fff911e89732e868e8a49ce9a7528a774e1b3ae9327ef69f5f0d2548a55241648f07782ce552cfc899f9fe038f4c0225b7451d46da87d93f5f8b4ee691c630c1af0375a7b3e9ec71cea6b4d6eac42766355ac5716699041dc9659f9ed3323d039a4c57fee8a7a16defbb43e74ea54832c6df0753f69fd6dbb7b6fe976eefc3cd52c2d8c612c6df8623291c79c85489a3a0db8fd06189523245162f226a4046124ee0828d3c82194ba230848429528081fc2be5cbaca5642b0a2b26f4a415d4e405238222fb4983b50488f523616acb7aab32a9ad566d492d75a7c018632c63c2fe0283bd6081312e618c710fa71272633c73e5c3cc41cd14f00084ce4ecf766d0e3ce000913e0589957a5cccf227991f40847c60870fc43e2063456853cf34c6ddb3bbbbbbbbbbbbe76c1c9c4f7d52b50abb2c81310d3d33b68ae50736b99c6480041142c4aa724a7d6a156e55ab4aa612c6fd82c2a5675abac81f9e8bbc25d39f7ac800b17e030e37f40d12462f95f709138b0bc5f4524a2fa5940e75336ff98e2f7195eb388ff738cb7f1cc8835c093deb298e33deec39ae7295abfca54595dd5b59f5498555a026f5a7679854577dd5a16b7b7a66ac5272d3eaa393694bc2dc1ba4d4e362963fc9fcb04e592c0f7bf75e25e8206182c891249ee779dee801f13ccfc39e07f33c1c72c0017603ac47e874bae1c791934c1021449024c9414a31b1b8f4bdf79e4e38f4cc68fa71e4241344081124496ec8c1c462e24c26530f991ea7d349ca2e152e1863fc18e39ed9e475f52003635cc218e32ae8c8489ace445cdb05b26d2548097101902034504a29a53f240c25e2a24976208204871c3ec0830f2548d17b8488a32875517a04c9111711974e0e3a7943a7b9ddaedd369b82d7762db5d6da27f9fedf1e82e4fa8ba94f5307fbf747fbde154bddedd30d7dea7f2dcc54c0aed9eb9e22b2eeaeb9e804f742dadee03dc49da35c88837b0e386c5274b2935eb55ab5b6fe542da1c324f74f1dab3191a467b6a2596bad633491de2e810071e9d3d4a1bea98ab74a4a828011aa26511d393d334a17e50010a8a9440e3bf07023cfc8d7183ab967464d9b7eadd22a7429a5f42461e6d5e993dc9e7e89b2c8e06c4fc4db6c2214f573d0effc1b42bb7e9f4c9246e6df421c6a0e375812048c58cd17df94502ad998eed3dbdddfa794d47d66774da7b44369d676afb46b155dae0b13b47a2ba439a76bd59b4a413acdb2fed44125bb3badfe92869a289f3af5222e7ada905b351ad6dc39ed69651d51517a969f8b94ee000717acbc158137262c908c278ff8162143620cdc59be64313049eccd1ee0dca38c2cb5f5135911b9ff62133665f99212cb1e0ec2f7b17fcf9442208380cc97970c2c1c0c30f27c79041b4481440e589046105cd0c2e5c42a0a2a308295453f992fe7dff9a62944ba9068f7852382b6f681c6b2894faca07a4f11d4bec92251848bc5e2b50516aca02d16e2f7e9095b20228f32a8280d15b84c2bc660419bc337b27c15415144461e6536247cc18331ba2005eb052d702df9c014ba88c24e4a070b424638bd9014ea419e2fe7dff92697cdd2094e1a535c8e58b2450f9808ad863001109e2042166958a1e3c415f278ca634cf1811358e0d3841ee098920417e4c0065534a9e28af9f2ce37cd287c68c2881f2734e1029c554f61bebc623bc3c70c962c410b515c2d10832eb181143f5809d10420aecba30cda19ba2eb3ee8aa63e5951c9cf176130d103a122a6b0620b2f0a75e38247548534583190c22c0a94920cee0502a85571c5a80a1fed5e22b095b26d5b1539f0aad8a2e5f75e1cf8008c1f8891451652acc819825a2184b799b185ab0b2229448002194b4c97a381c8112d8f2eaf222bac94820419b9ff9ade84234b2748300109314c44a093190d443022093e2990220768b816f21c23e552c118682c91624a010734b88288a808520c010b6ebb5b149f1537f09149b0bf8932d312218bdc0d85dc7f72998ea902755b3cb994b0274d43c8c0c91048e41e8a829422a1269491852a7825ef25e549c6593a198288bc65e96488557e5d612ba3002940c2136c908430a4a0c2868c3c97e00206668c5145103f688931d184217041074d563baca2684203293d4b1c6104ad0547c6c829821742403182ac896ca4c862064100010a5430f1910333b290f3041386f0ba02b50415568802c6853070b06de1068c2c70c044e6050c8ce8c069be69de2c8d603385b8d2031d1d22cb4772801fe0796713b866e92415cbf3e56896b0002359fa472c119746e1345110180b7e70be1e31b03033676ec89718aeb6696a65147277d1cc5307faf647fa1eb5a522641eeedaa7c93244eb93f83d7a79f60a5658e857416cc7d54c102a6ad9742885a26063849d27f408610526301b34b45002cca6ab5e873240361e02d1413016156c50609760233b86116bd28e2419674451d9a0a0e7bc4127dd096b967df0aca34d905d24cc945d64c1e6009d74195d2777cfc6ea5e79f7ddf4262069eabc17e371cab253279a369dd8711e21f7cbeedf3bef8f3b9cd4600519f66ad87ff2c23a9d489ad67e1e6109390b49a3bd13962005275c410ab9a79ddfee44b356fcae7342fa8bca18f8fbb157267f6927b0bf34c9fb09481a1fe52c8b09489ace6d051519ee7eec559ec0cce25e8ce78eec3feec89d7492bdf7c44ece565b1e5f2e218fbd925d6427b84ed75b0fa808849ce580090f6c50f07961535f898d873aa0d415e0b02ec153a45747120a451258e8d8a0e0c3810d7d25364000d1a2850d556243461201a572a8b4abd8ec7a1c2aa20100000000e315000028100e870362b17814a7a1a2db0314800d749c4c625e389509a318077290310829040c3200000004466464c6093a8da9f6ad05b91ccb04988a9131ab67c2e0b991b1977d0988a9d0e7f7d5bc433d8b339da42fc8d552e7d31281609cb0b24750079c8130ed05250b2058a388eb2cce857d4e709ace3cdca279f7eb810ee218d9a121ef0270b5d3e00f9e07a11e74a5b97e716845e431833eadd0da4a3818981611a375120ead845548cb9863d0e98e76cbd16537085a4243fa02a40c2a705469f0f92ae35c71219e0c89ca1db60c4a68f1df754be56a819d942143ac2b64709eff954c71acb142c9bab1401b31169e05914cb42b35142f8f889d6651ed7f6c47129c2363ddf9791877078c38f068f55704f8de769fa04762bc925224c6b97f93d6c30a6d9a473b31fa34b6f779aa1d1eba2939c8caa98becb88dc071db3622ed9285e8ea764e4a2aa9cb371d791be6c35d83035d14f56b1dadf2bea59906a70708074d837a8552da3490be379bb71d14b90cf9b224e4a9b45b5bacb908a811d8f869e9bd423ba33a08285d3dbf95ed2fcbd7f1d0d485b9f6eb68aa7e09f20070c3d7cfb9f16e1d98adfcafcaec0eaffc58f209d0a902df81cab0d03cc9b0fd5e9fa341fb7a3180dbc75debcc2a71c38489d25177ccd06acd7beb702099d2c863e62229ead4a964d01854c3fc73accbd1dcd23f7bc16f274be2b25ba95852e280e08a1a617100c026c6db2af3a7f674230f50b9c102a2b8464ffb7635ecd49d2c8fa315d4bed746898cec9354274555bdf35a5ffaa0be8b1c04d358c395f678c7c2bd60eb3742445d8e06c41774981f748e3fecc89d9a869dc75cf1aaeb68003fea8260b5a0a41327d9791229b831f99dbd4b5f90357cda0e36ff5126acc106b341c1d9c0cde103ff38f579121ac6dae904b73ba26c15a45e757699ed806a97226a822461fcb7f94b3c8774389d5e90120f83708c9b02cbf9d9d24d180c344f7db58cef61adae56d1a21b44d35c6f4a9e9e8983fc54027a912c17ebbec5758be0c946e6b3c7bf79331eaad4029d72d51bf04e4751af87a5b7168cecde1f78e52a0f08fc5d0ab192fcd2fc02ba182c7c8eb1156e05be1811e4fbe943fdaa1e023ff96c9fdb57633aff762a5649d9227a9471b3f1fd77972e801a0274e6963ca41ffd71958530a09ad1773587cc8b998a909c99166ab88f4ff83e9a808cd055ac0951da458bb43c71693b59548d4028d49f65f62deb0a130880377ed4afe80175e1a075a62cff804f8fe899dd758b6f3ae158fb8fc9b94be8856532477a6f453d5c8e844827d4377fd0e9a5b6d842fe33fa24a7f8e7a2e2a89f8c6f2a75c6b0de2af344d352b1bd3257434ff58bad95ff85b7b4e9c537831b3824c637993c0b0a700edf1e279c7ab0125d236bfbf79b1d2ab55e5d7d28535fc3a49eefbf63460b87aef458a6fe9d6d392ffdd2d68ee6b96013e2b047cba1c1a77f289745e926faec7cb14488b8bb90b1310ddf2c8653ffdfa055619b2701eae7c8c75edbe68863bb0d316f30c90940a5a2d910d66ae19ce3fdd8b0e633a0120b45f14dcf2f09f852d139c2de4f7c2d4d4c38c25d673474e3299b34be43dbda0b96b0203e3f89f32aeda4da858a5dd244cde9862adb59d3e3599e5320f918d0dec7e76df6d6cb055a84967f4079fcc0f3e1dc05d79247834147d254c72debe58f5f3500c83f6e10d391d79de47d158b295af0ba12b2051cf0dcb6e1c08dfa8c27ba9c1e1ab3f376f33ff60ab4a6686acc9f122f6e22a40ec7246d94a90c711d8355413ec31fec89aea07ba272c10586368ce030fe1fe79207d097b365d58de66a6801c1a5f0858e5a614256b6848cbc7356433e5566d29f73be01662b5f8dd4a47c89aa08f1a68170ce3e777588d31505bc6c11317309dac01ed41bc73a99deea7f1705ec704da387c375d72f6c39509dd1b369ab634a5009c9c3b04dbd048cc2bdc8b540d12e448d903e29ca1b42a7fba2aae46532f742f7b23271af66b961d82083fd584172d9415e002a09709b55b36e12e582776f76c3a4b05590c6e8db3af0689b20ae2b884fefe1a61b3973e27fc6490ec8d5c6fe0f8b023a726fc83cbc5bb16e03ca1ba49d71602e22a36fc4af9f5ce7cc1a5550d408e8509c20a19fc4b968e058cead90b0279d38dfc6425ea126263d3d34b61c2db0e0b0288f8a6ee038ad40b4fc8060139c6e1ae394afe794ce999b6616104650390e135df06c616a91885d57fe566c44051661e42cc2db9e1533e5b4d2a572aaa68d3849196311886852c21e212a7e65b6cfead987fe3a3e5580f048dd389f661a4dbae51274d8d70b0e433a0440ad97576d4379ea50eec0be184e9ba56fa7dd5e26f8105b52de06bd416f3d3f7c85c6bd57ece78b634538bde54969dc4ef3300ae2023a49ac8d4b79208db332d939239bcda7af783b760d86d08387551a8702bd515bf5f778c233f379a8f1a06fd15ea8b446c8b6ee74986d748da9d59252474824f5e528b2b17ba5879120d462e605294328de5c98534bebf3478194065c1973beea4b30058bcbb19a618ebf39d3309206fb59bf2784ec265d1448dbcba98a4c5865d720e7b240e836aa50c4f042f89dcdf8f1073d1341cf67fda842fdbd1fac4b83ee70843fb64bf6fef4a6678457d36eac6b96fff73ec57c1637ac76f0ec6bb2a888efb379f89c69f6849fb0c1a8725adb12dd8d3a6e7f5af6d990f78e535d9fa8b901cbfba336404d2997f457a1fcbfc1bba11221b0ba07fa23da392ebccf6e2f4b18f67d9ebbc0df42b9a387a61f256a77b881abdf7b087b388a1f426ca176019c3fc6e036c117626250c1dcaa95a2677578ffc263cf475c9271a279ae9de2eedf481a85f702d38f4faad37a4851a0064a9fde4c1a02b4086117cdf455af1099b0e4200b980e357e001cd6999a017a1234ca6aa3f4aea7741ddd144171178e6f3ae27372ecbbc8094255f23bd477965df76543a47a1bea8a4fa1f5a6c322ce017f2fb5d3b583bc37530606addb181f9517bb99951a19989a1ee4c63595a95a4431a62de1f470321f027baa07b929146d973ac1c5b63da001b20ade3b14d526d83dda276d72fb12238b79faf83ed531609a6f543f2f67d52af6a43c66873b51c419294d3be94a4843c745fb9f7d56bdf25066103762d3082aa350dcfef1a076d35b9486395d666f925b1acbfe82381d4504cd97a43304886c5b9e0dd58033481548815bafe8e98de9c9cac6ae9db311a9f1dbe53ea8a9e9eb749e7d0982b3838aa6fb74bd9a20a9c688aeeecb87898bd3557b188fe895e6f1885ee53ff8a29747ca2676ecdbfdeb26c71d55003cb7eec750c7843ce0590abf6b37bc8034e00d048b7c667954bd7ca4900d4b45282d419ca2bec8597ccd90fd268a70afae2d45cf4ee3d12f37d6a9016efbd656b6c34769cafddd668edf622580af0ced03d4637b54b76b3820742675af35961968e87e53d8be6a05111c831c1b040363fb8afe75b14f5806ac54d40759b8e62c65b8bc0ca5ba474cf350750c3641eb4d0d88c695a05a82b7897f4c0ace25e48a6082d9f15beeac220df4ca9babfbc4d35b0bb06947e03f1ef062d61c5df47a2ef67fb13b40b7da8931c6719a567f4f74a9761cbf16ee5427f911e60a8ba0b0e4feb899754bd400c68d3b31aeff1176ce34f0785274f74c4550d2914d7ce4d81c74f050e43d892f07b25713af8514ff31e5d8b2e6e7c3284470a6b1c77ae370c3c2411ee7931d7c5589018246c8566c460e1d2e59931027ddf0bcafddfe3df131bc34c095482c8b61df8a9ef03bca54499a3a4e6e12fae68373f70a6d1a1efc5956130e4cf9e0396953a74ff4f8f9b2dcb86cb4a011e329a1ce4f4da65b99386be3819d306f48889e08049dda80bee42eaae079fe523cebdf139fc95ebfb0285dfaab7e788509bdb1dea5648375b5f4be08fa8190c39fc7ada8236ae5067b36da2fa61a530f0aeed36fe159ffbdbfa62a480de32b27bfca31179be180738658eaac37351e432c8a420d85aa562c87f8e48eacc425dadf72a04de3ba538e214c5b7cb07256646b53eafebc42a1e20a76bec600bae05d19a9be31822421cfb21e9224f5f6e761e984b54768971263894f892c0d023c67c699e9fb7e39d67a98fa9ab054b743512120ac832b606df39099fe1f64450c36d96049eb118065377a5f37112fe2f02562bdb2450596c2af13886655a27892cff1b5501df2a97cbbc812a699751b9f1035701d0a688ca7d77fefad7b91cc746be61847295399d6fdce389b804e3c0b9f0670cd1062456a64cf7136cd1dc94cb71750a19b96ca5844b9bd48e0464333fb30b674efa2c07f7fef3d1b80373b93ab4f9c0539c5d98fc5662ae3bd2ac558073ccffbd744def436235ebb57ed2a502162e91eaeeda65daf419b5c04c0b8bca4ddc8e47310a74e6e665e50730c98f0c0a5ceb466e3154a847869052eb27c78c890e61f0877f9a8f8a064d0ad60de59e04c1f0d3f78cf64f0f2b1a2fe6488db1c6ced04e07f320a9356db841b582e2fe94f13df4e5e65d0a0eb281f18531ab0ed37cce97daabfcef3939c481fe088b60c7d9103e57df1b5c61bc132ca48d4457cda01920c9b496415efda67d47a90a92f847e176f087f93d2223a2b8f145eeb1866a6817ebc554f0f85cc7f5ef153f52c6a1bf58500d32b2e59de8c2c014f74b61f88cdedd352acf4421bb3a769e3ccfe75f2221349f618fea2dc0ed6ad1cfb5c17dc473ec473ba4c3ef43877f64375171881ac0b4063be27513a0d63163176a7bd9dbf487f34d159bc9bc5fb15952f17ab4f4755bfc2cc8db2dd1b2c9260bc500c87dc6fc067097badd6e8eef82628e56db0c1d31911779a93c603806ed6806687c87b4450804c2f467c92d6994f44fed965964f8c5476534e3ad29afd7b966b5f76ad0dc95b5de83461ee814183bafb4d26e55880cb90a1fa70a44a91077ffc385392e919707ea145bee886c273389da6c5d9a66ca5dad2d45be0a1a55bbce40656a43bca474050eae6b11a2e425717fd18c4419f6bc688d6d73855aef0768cb1b1c9dc5c9cfe2e96500a3d62ae032c9cd4dc23130373e30fc74c3ed87f320d6f009113843dfa36537f672cca95ee6c9a6795431884f897a488e0807f1808210444935e8094697984da22c68057b4e9c3a32755c2fee8acc18aae8c160b4b48553abe9ee0ef0fee8e4d65120aaee022a8bfe253ae12b343911a238d12dc2d85fb86654948c68d4df1186aba98dd48f2d78854afc5fd97c7040162a9d08008e60eaf453059a769cd915877d4fe923943bccf748a88f4103890d4b963402fac82e8e4114ec0147b90a47a5318627231d17948779b620bb1d84b96caa8e0e01a4db3e5748415c208134a574689985eff8daf0719b5ead8e0df3c37d91c261587d1c4568436add23aa5b438519530bf379e3f2411f2b38a099f0839243101bb6248bbbecad4c136b3e9df10a80bf243b3aaa686f2f9484ba71e4a7eb9d6589a67449249a0b279e5430186e94613737ebf282e411e828400c5b8ead904aa1e2947f989ac782c858a6c046fc613709904a35af3c4e07d7900d45b9536a16dead1a3c7853027cefc6c2c34aa70f9ccaa364121184dba9dd220a164005521b0cc02fb354ab65d1029ec903bf60e9b5842712c02e08a55708ae4efc18ef5b920811a18d207db42c87e7b8e1304ffff351a149e9bc24c1344a23cbcf55309397e410b5bde5723c081653f3e0825956caae259c8548720743f666d92d0884b39244446f4ff049882fa8112cc8f1e00bf35ac4ce229329057099eaf3571734bb8b6d25c8373bf7e855c3f09b06a7f7e4bcda395ed8a0b249b1dacac9b42819a3690c400b3ab76dbc9f3d433b95ca9f05aae8c4b83319a81bedca062676407150121fb77a8902fc66e52814136a53130793a4e91daeae458fc2a024b8ebddbba1ea7e051a6f08de2c75d2378fee3ba7550d37bc1db8112a21ab9839865ec7a9b665dc221c6bf1834c6b08c006f40e6b4689b0909a69d0f1b7981f1097efb9e6b15a11695f644cbdb69f3a75d4fc1efb19e40b8db83d178344cfbb58d63121d1cc981bb82a2da982487ad53a050d0df684d584aef3a3816938651ac2ffd4cfc2a7e747098ed32c0117c27015a2e7bdd5ace95b1e9371678a965e1f1aaf89d0713f88d6f393ff989945e63adef2679e7e7898272f02a7460b87c8b2477d419f3ea526d71473bada923bc83274c6e9c67488d83ce28f86756c1738b3346cbababf17c9b4cbe5c7e1894868c0f4ec9ba049868d2f8a4338c129564bf5dded27a182f7fd78c55de27dc586b90d159755657619e3553750590db45af0c7375b5d17fa8c4496b94248735f6ec08b729ff411fabc2b3fa328afc9866e35da067e41def2bcd53318e0de70e86642e2154c4d9aa77ce6c6cfa28bca8096f30d1b00512318e5d07a18f2b87f6bc385d9999593e440c1545c149832cc71bdf976110d324553c89577a995fc12e4d6d44e26e43f28c3ff3b9db0dd74ce079ff787028e4e2a95d1b121b77e492cda06a0c89d9165097a58e77c0815029aacaa0cb0149a8095f1d42b5db2c19f58502c5a70672cd986857d1f642f8a16f16b33a04a01f233635e8fb310449922117c38054ff501a87496c2a9a588db5884f04089ebc0d7408749f4395b34882acd09de0342aa963d8602bb1ba0190ac3cfd6e40543a603db0572a2094892b425844d1ec059f0d9d847c9264a35bbd6fa170707d7454dbe0b7023b16670548ec2ff3811e24d57b0c7f114b9f603a7d0186e6aa64862e639b6e1b132fab15bb3259ae2c4027e5d9c41356695a222e9c46476713965c03fd4ad403c3c2f8dfeec97971086569af872e6b3ac31ea230d2124bbfc8f9a0801fe68d7f552ce9c7d1049e5975b70015c308c99050e810deb70d101abdaa26d227a157b340634427506f77083e80efedf04cbb33d84b402deaf2db10a4b7178c5cd06a786659e25216accc5a4e5a7e53dd6301fec212bdb6b522fed489b26fe2a03737b892382040ecae225cc62bc4944824393c19968e3112e2e7345cdc391187bcb16acedc9432621239a2e7a753a8488a732d747232f658a0b206059bb18f32c5f9f279bd256ffe590b402c1ae2e6decb119031eadc77fd2d4d202c3650ec59e9e496c3f16c4744b93fb681c80f9181ce4bff606c203eec83c9df76402151256ff620d071f0671470b606674178b01b66be135d92efa2110c3706f02f0a931b27683888399fcb9c8bd29f5fd9ba9323636de34f3674cb44142931ba9571e11476dc21e06bd1e5b194ce5e3d504704cda92bacc0636dd403c95980686ec63a7da12687032ef48b12c4720e6abedb5924782465952ee9851549e031fc1ce08c3f787e4e0fdea749fd5326a7dbe0cc7bcfc9e024cac0f24ab802b4ad4ba80ab63472036bba04b982b117710e1066012597e914214db93b0fa67d730496e0be7be2abf8ac055bd4f90bcc0610067b2735526b01f8322ae2136f20b5b1c0549b5a7aac280bfd12e4c809b1ce15fe37a510347ad53543b54bcc5a5415e368e428b75f810c07ed5c13f4c220725325387b06eaa1b07332df569150c4a3ed22be6f952b612b1c36a571874b6b6078072c055bf4155ff7039e6892621274d6e8e904de7fa89bd5045a72b146e0e7d6d75116aaedc4d207e079d7d57a0c3a63194b4745c05c160396af62d226791fb9842f9ce90887507cc0ad15641532b6df78ee291f5be1ed911af9dd80f683fb1abcfda6a96d4aa6294bc539778ae5f63031e4008adb38caedb343e2aa799e05f0bef535de39a1b21362fd4b7e594e98ee6892b354813ad4df666a4789dbd294c626f67a3355b6cf7e55fa8e844c7b2dc18f3748e68547bcfa6c8dd4d5fc23316df916e3f91cf6175e024bd103ca4c70eb11a41c072e5da6104ba8c3c19aade8d8d65983be644805e140baa198cb6ab0ccad2c8c19cd1320e8cd08e728fd4cde46bd108be8d217d865f18a9fb5651547fd805340487f5a363c94b87a432e65471fe3b4b82c79312945ea4bc2b8c95f997990aa07653b991ad82b600469a3899dd3273bee028e0c8be326f695570d79d7a67d4d2ca3c7725155c7fad08ccc8ac90f22b06453126b16cbb0e171774521ddb2329e0beca9cfbe8e8100b370a90557d8f5c5518864813bbcc37b8166d029ab3ac6ca2a8d288724d7dbf1833be94a90f960f2256be370abc4562e6235088f5995a9ba62c84b33b988b43ba22da25c96b116a250d9c094a75d84c74a07e54a623eda2e2876d206cf754e96123ae7d448418933bfe40cf14e200aca329cb31977e6179e247c7a9afc038a4de00beafb59f1c60fd935050b5aab00379a46eb390c0004a2db0205f6bb2a2106b7f5ff045046f04ff117c98993b4d922a5f0f333cd31c3f3110c2c21f7012ceb471cd73192cc6905b97244cec9cbfe3b61832c1207cec436a072a76fe1fd2e546d09c46890c4d17b174f21484d00a3f725e4bccf9ac707219cf43f23c5c4c8137061d790517d51d73989c5c81711b6cacdbd28fe623d5abf9318c72d52875b864e076baf01e990816c4c4230820204a88455177f57641458ba9c4aa4f6cf182ffa8c53ee3d4d4a1c686a983d83dad02066222cb266ad6d68ecca93d80a1a3b58687e7a6818dccead0310c13e418a2cbecab0dd52d57c0897adcf10ab711a34795cb05add6f8d391c265126d2dbb90cf4bdc80ad019d8b5445e71b939bce0b335628414eee849ad10345d24dd59a3964526492f924c6f4f182d8e19b8aa686f53282a2a8f28b81c3da7220ab93bbd43a441c00f492f64d2d26f009877087bbb1b93cc3f485f9a505188a0af3d993e7ae1ff0e9546a694195e310384a9bfc2c1d9f5e724c0aa984d3ef55af96086194490d5b62f99a227b8777f85981414cea5b2680038442363e89be6c6b6e87b7f1994ca23cf8822ae7ab3efcfbd0458dcf4c28412b50733e2e585dd638c4aa6076c76e9722426198690f6f98982e5bd26708a96ae53b9d6c70a1d994b4f3f307afef40767e62b612670903e49162cbbafd944d19b84692c8e7beb0b5e491824ddd55ac6076a1f8568bee3b505a838381b6bc06461085226788ad48291d877c968ae0ef14cf192cc21f4c2492ff8b301346d1475ee907a0d6efe072bdc085ddf90337eeaff039fed1740a6451b4a3af409915d24e8b2d8e5ef1112217a676edc07ebb8e19017317a12bdfb86ff4033b7d5a4ea454c7c6483870ac52ef0889f5074c4796f63f7824b28f10680ac3f4c3a335eb6f2410c567afeb1193f0cb2feadf3fc5afaf9a107754bacf1f2abf001bd7079b179a98b4eea5f8643d3c0659da5b88eaa6266d1061cdafcb5ae90deb084ccc4d1beadbe8cd30bb35b90414d80119dbeb80bcefc7991cb15c8f13afcc07f024eb8e2aeac80b0f712d1a21181e88deefdb1aac00b96f1ff86a2f36b1a1cdd1a21bf87f5526f7280ceea63d1e3c7a72aafd17805aed7e87f8b457543ed30cc0d31defb848bc96d3ec2a18eba42451605a3cae5356453fd2f18ea5e1deae756942ce135592c764b9f9bbb56f6dea4158cd7b107b8b688882e464d409a5eba53ebb4d2abc6822f0f090b50f99120998f58088df305a1d74d09f79609d243de29245ede611190bc3c6347481b05e42c230090bf35bb06a6fb9e897f81f81c313f260ce68ce84a1fa3d5a5a48485e45fab2daff8e4d399b701594d1f6c715d544f03c40e9beb38f5bc0b193a86dc9512b3253b042b8dfb75e907b7ab7741725dec67e1c133ab2b5d1c91894909e4400020a878900b2884d23267779ee78f5362dcbcb4d32e8d3a3a7d374672197455fdd1eb70cae61a8525d73d6c5368054e7cdfb03718b3e1146a85117afe9a7dd9f98be5dccf3cdc75ab52792bddd9257c9ecfc93b2808dae7c8fc158fae7aab5a0b3b75eb56e01897a5edfee8ffc5c1aa68f9976ea86892fa5f3caaa3420978e524fd3131bbe38c69cbf0f267f4590ead3894ece3114899f99ed506b7e62d12004b4fe9a9e4d31e85b211f26a9d5c734224bde658470b4d1a4115fbe59a7aaa83c54cab5712e1030bba7d36d0275250d49f675b9c08ae7ac8f59586212eed4f46f59075b777912a5979ae32967d7f220091c7c60853c218bc45e7f942814cb9dae5008040a84098b2d08d82b39174f6d2a69da87d757aa9ce90e11aaca16b6db5f2ad9547bbfc224dfafbcfcaac20994730de58da8cc155b18fa226d6e9e40ad8758c959bda3e425955802d8107e189169e4ee8ea694312eec0f87e2d4f5a2a2f0d2cb97777515df8ecfb9121f843b648a10e3139ea1ef02423ed366764ef7ecc19c54ea7c76a5d10fa2dd33775cdb98ede619fb1262f4133eaa795fb395d64207b665db3e7499640ec397a428a5d42612893f69e527aeba301e6ea437453baf29b74e8a548017626930815031ee6372b93e9266c251630ba6e4ab8f8ecda9fa29934263fbd0d13834fe7c71527010f64d33a43791c2f9af940ece21e43c1480c614cf26c92b6d21090e9aab49de99c7f46f5be67d88908fd4268ef15839311bca140ec8d62d354a9df11a567d291d8abd3de7a537950a317b049f05dbf2ad7be8807cd8e7a3f76d061215e3a02a34d62796c0e7aed05c07d7da91d22c814e7f3b7ab5ae612cba1efe3290172a953d7a5cc2655d0f84eb58a12d90eb615d88e06aa158380f7374e2c30b97a8f7257daed87fabf072fdf10d873edc64d2952aaea1503efcac48c8d1e7c5cd546b42e3e6931307d3d3a818666f3618b0c2dfd74037bc809f7af80cc0a10def3224cbc10a78bca77315be4b1204841bd379a7ccb7d47b0c02f91dad3f8eb51127b7f2cabd66a7dee00662987de2185e1fb721065eade08a78e9c112113e302773ba976ef7f244c3dbef45f7ee1c5a42198d21dccb0e5cb72f30923a346b8652619508c5babf5c297588323650cad16f3789d91302d22cab54f1a03dc449e74190570043f6543ea4c5bb12f20535c549ecec81b02c094298ab1d69d4fe1b4b0b71c45cb5e6f84d155ccd058e825fc087f761ef0c95df11be05bf58af00105e94cf2e3ab4ccc0ff5f73b4c4122a2559c15391c680822253e43932711d98df6ff1940ae564e386ab9b43cab741195a9d63d3be8bd80737e108d3a44047f288ecc69906a36068e8f6f795ec23a483dee6de464f7fdd85fd64ce1667a0b0937f831359062e206e5ebb6913128ff28c6acb3f3f1ca4b8a1eebf81c518ff25681914a4f0e1db7d29549e8a18cbfd70abfe857facc36206d3442ab0fd34ca788c01a0fadff3d28343600a4235521c5d28c3296dacd1c630bd017ac936a40048be280f37af8dbcef34c046807933cc7bc146f9c892533228e3238d30d2e027f1a8fb51f1288ec45c09affcdc53ff61a1e0c815af26e1ef1ac440600aa924308cc663056cb8a04259e8c7605736108b40dc93915d8ac2af4590b68352cb28cde3a16bfcd06940faa70f0c1a2a33a75e191385a5dfc8e05bf8af0bff677aba120ea3c07131c602005771f3f8500cbea4d8a619b130cfcc5fc9de280fa178a6b639ee2888fed84047492c17c992d9deeda5661e27c85aa879b41d3c7a557fa6062e7abd9f2272809719c6ccb336b8abdadf9987c88738cdf31fa504bf1cfefa442faa08c17c123052fe3c9536ca4d762274fefa47026999526fac55698d522e8862ced8734b4ad8bb23896de8e1167d880abab1f84d4b15bfc30963496bb2cfa277957ce33a6df31849809a70ae12b30be5f8946913246fccb0b31c0e73f9a0941ccdad943354c549c8d297ad57b38ead07bea701d3445a6be21e8e5eea95c5ba4d511549126f81e0f565c55142420753c68a9b913280a2bd272eac1d110f9a4f3861db3ee5e259e8143c325cc3436ada11d623865b4521bada6323a7ba75e705caecc7c2c278233a23f89dead1c84e08364427c008577fced0f22ddb818768f1efbfa7d14ae67ae26414056657bc9e9400d7212b86a30f72f28672eeedb438cf99342a0637829bf500837765bf53bb2fd64c87c47518a9fa14f24c6f9c93685ffc5e845a729c8db101277366ec9ef42434d67ed99049a6ca1ee056940be8dd984552b194dfba524163285e69ec729a5d973d03817387c1f15083ad01e00d7a5b392c618a8540ec8820ae22492499150b549aaee81f29810752b40885c66827b7998a12fa0d5fbf243deec9575678917cf9f3733a881ada58758c4a7548390dce034b95362968ca8e34642ca8f15d04cdf093c34b98a58ab53ee33e3312e8c1765246b01ed9961f4f814ceb79631651b9a59d92c28fce92e5325e6bdeb3491b0f953fca84e94a69b92f55646eec768688915192b3be1d5931369c7b4e753969bfac1472669ce39cf332a93de0768ed324549da11762c9272b2499ae267e39f36a02919a3472b9ab951bd1ea964a2d49866cab85369b15bafa469a838b6d193729b9c797abaaf4b5617e1de70a3b8bf2516ae467a25d0fc94dba37fc51f4a032aa9b64b36c01a12584580426d532859aaf14ddc304ef10507c93a0089b9a2e2cee7e7e0885d0ce2c9034133caf73366b3440d3986bd119f90fdd403243dcb702c401ea165640751652fa4c5c6f105e5913b3de3b30d0311b49e6ce71282e8a5fdb567a100ff63238b4bd068bd9195eec69b6583612b91b3bc1729784a011f78336955f823be5560c6771eb1b0003982ac16b2736b68afb020afad084175f7cb2d2ec6d1eff79f5e2af9a4f9e995ce4a65acfca8d0947ca155ab236511bad1defa27081dca29420b6440f803ae5fcf405d65c9e9ac132353eb27f47fa9d82685c140d1f2d534751594dedbc26b53f13b8eae0d85fe3f9764ca85130639ca9925b5d6486e77242229b4df7b2e484465f3263a3d8e8a5d302c4153fcfb8d1f566f4a8d312c807d4ee0b683b328cc33dd3c939bc3101fde61c6519926ff848c84c6d0e18bae13b5750a68ec55e562860433354527cef4de9e389e91b6b634a0f7e6d0ab637427a77c87f63e31ffd1c281b1782f9f8f3c1592883145d2523bb3b929a73c53f4d64048f29149622d085007bbabc9c7a0f32f7842c786ae58248d15413f7a7c86aa1bb74cc767d495b0945ece260e6189054db7a46e93a96e9fb2f255a9e7fbedaa09433ddb0aec85883acf3a6a9580fbdbb4d8b42e4618c00060668f690bbda51112e08d074d858c8374c74ee80d664974f1ae0955e174f918a60e54eb22c8034eab1968d166e8edac0eeccd337387f5a0b61ae71d6428858cbccbf0ac0d137f78453da341944328db27249cf5e9e745da681af297f40317582cdc2ea3b7d71199930230e00bdee87fa43e95bd033147928e22077129f3c5a7e0f26815c6cea73a094e7458852455212ec8de562a976808ec0f3695dbd70e0329e7d44c832c64a5867c2b6299861e5794a823538cdef737dcff7f8484ff7a7d31e93be9dcaa480d39a843559d878638223b74948b6aea805232d79ecb48c4e62eee074328ed0e68f79429e0dc026ac6454cd77208d9ff3469542bf86102b1a0b6caa83a0c7c93310182858ec390d395db865d98ea5603be6be665e80a938ed64597afb15db10a92e354c3fd718b40a8d588aa42018a6eccfd35fabbbbed52c2301812dc722a913df0eae6f0708fb76fd8b5e837a2c0f56f00cc6de60fd5e914a1ed9e3f10dc8708b12cbbaf10c9b1c7a55934add6265256a5373e54aed42dc0d81eacaaeef96d78bccf157e7460d399a653b2bd6901cdda503e2200ca9abaa0684f9ea428f8082de67de51bc1e8c844be0fc818b2053357e745196e4f2c71d16da3b579dc39330902eb17b026fff073757286cc54c223075802a492b10f563ba64dc17827c148bc07c790b869d2ff4284c4c428779570fe35a69792050097a8fe6154fe37db4977272a7c986964bac982159b9a30dd322f529838485c654d9e8c6fa2fa050f122d908a2abd2cdc4b29a674ce27d429583a153168946b6d0fae7213590df70b1c498ef31bfa88b04a7a7229817e695b8a9540515843b62eedaa2907a005f39521a58334dfc2dfe7a3942ae0a37bdadd63a4291378c0d770fd82bdcae0d0d8f611db5783569b263d6c023b49dbca901b1fadc9cf65201d05287de5d5c7788cb24b00f3f889ff734619c27485f7620454158950eafd3c9825cb383cda6f425e79ad7b973eabaf24275b962749b1525a2cacc0021069682d70a4372e2b56503a52f99096681f5c2245699c92e0376986e02c388a89d37884239b01490972f1381e93be27c813b4100fff910219558d5d06761d9621fd75f48861963d8a67d4422caf30366aeb86ef7efffab8d50dd6b3ce92f194169d3197f68727d4b66b07906e9b8bd30266540a6caaebd896369ceeef263acd1c0fb370a27d5462597fb989d7ee97e7f310511cde2f7182085e214d81a3ed718b6d4f53839d76b6f68f57cc9ecd3f5a48b08d9bec21c6feccb8daaa9846b94d345230285df8efbac0d24f017242709106cfa8ce2a4d90f8303f129ee6cf591262c805c94ca94aec594ca103d8949f1e07a3e11b7d622fb939e723c7f2491307f47f14179a1908244fde9ea32a3e9b8c189dcce5e61ae22261d5acd04cc636f763dc0be1ba1aae230872862a807dc15c9961ef8e020045c1d99145012e62f3309c6152ff7d488cd853eaa61566d5c1a3c5f0b4a16798555434b13343eb4c53dc93cdc5715a40587237dfdac8a35b225286ce3953886e6c639773aebd66e60b16df2867c2d8a7829ccf2002de5f3484d031bd47ed048424e6d1289b17dc1754fd9b16e700fb386970a4ba52ab768fc90dfb6118811cfeef5f63da7ac9d17bd996a1fcf3480373ec5804fd93a0fa8fc555aa4764d39d5c317d293d36b0bf00ba2b4e1c748f3186835bc5e026305b9cd581bf743d0e115559c82c6699e5c801df3bd3b5ed8e5642197ae6a18211e169ede542c2c87cbb5d684de7776da49e04e1c95e4add8aa9131ed83ce51b0e5839ad413f3c9efe81c3ba474357604cf708620b8ab695693edb70747c34c311e9e3b4eaa080be5559f5967563c582204d6f7a535c91982019476e397a372ec4eab8e7b81ae21147153c77b41a36101bd33fba3b33bb189d124184953a548cf70c2a23e3986c4aec300540662534cc176e01a5802f4193b0680ab0085d7fb8593e583821c61b3ec8f08df9442b276269dfbadde2d2fa8a3c6f4c73263ac44d10c9840343ebe2f846685ed81b5ddf8b4bde61a2c7d32c8f8844d3fd775b30f40a2c96c55270895fa937c6c2ef968c6c6f82b036348873fa94ecee16673384a955aa0d0fb52819b0b670c15dc872753f1fbfd2a0ef7dbd9aa06e53cc42776dc0d54982b2aab81b9b9a8fc72935c2e644feb0de707de186c4010bbb51017559640d083cc181148f42a9a6cb6671e6e60f48257f4fbf93ad5bab95007e2a4c762f9cf6fe03e88217b01ab695916bce3d09804080910840a669f76d8272e15f9cdfe16e996e5bc618af225d1fef25c4e3737ab942a61cef08574e2488c773ccbe026489000f87d0a5e33544db847009740a4a98414bf5aa5321331756169a85ac66f604b0c621de48e296fbf0db441377af1401a1f3797e06550f180d09368b769c27c4b2ab287dec2aba5cce942b3d5448399903944db1bc34ad23aba570c2a2850351290ce8e6caa6dabf380dec59da12244e2f4b8da3c6785da877b8e86e4a5e630a661de67040088a58e1aadb2d9644ca3d59826f48117b39ac0f528a94dab06c786eb1202539379adc469ad6654cb385f2d7ec04d11fc57e4cabdd7619042dda31abf38917cad4f7d448349ffa9ec9112f12d39d73cdd1d00c5e6889337e057334701200437607e2ccdbf8a4b794afea80d5e3c8132e895de711963fc7972cd8ab79afb3108ef5eeeece52c49d4581e2d71ebd882748bd8c1b546b1560c9645a1c509761db733f32956bbbfe9c9689599a05b6f8fb453a3f5bbc7a02f8fae5571357d62d02a1d1db1a6c6564d36e8ab0122916606fbe511d5890700d53ba3d6df72778ec5d3d547e5a5fb1aae6ab778e8267d4475f6aa98b86c1f72a5161d0ab636bbd83210478915fd2fcfeea902f1b1af6d17ef35ce2c6aa547b02868d1aee5a860a13c254102a003009386f998ed1436d10347102885836117530739188979c81fd77ca3274201fb724e0cf7dee307a7a7295e251a507979336216c93a9a162f0c8e38a54b8dc0eb0b6fd6064581475a3bdff177b08e369368ab6364108466ee0780c44fa8d244857cf611af68482f0437f5b025e0104a9751ace979c653285039625f2f265d9f39fed662d92efc5361a87785b23f0b362744a8b6949eeeb8b495e197a5f95906fe57da6d7844de2e37328840271e9d4d10541227a36735e4bdfe42af6ad23b3c8143b82fb12f1208ec50ce2e30df351527d081fa47564fcd7e96db375f4af98cc6722556107d9832fe7495e1ec8294d611e51a740c302bac4cbc0ae80a0dc46315b6a0af42385b5dc2086825b06b4ef50bcbe9daadc12579282512dfd616f9f43f5f780256ae027ad7afebb6109139d287e10776d906fdf7bf3eafba204f89120c2943e9785b6b82f2c0c5082e58a9f12382840b9f652eedc8382c51942b1267d019b7245183b489214243e41ab5acf4e65b405393562cac63f265f615a9ef97158e0aff1bbb4722ee7b15345c669b3c6a7d60e5539bea0afea71ce20fcc2ecfd1128a33dbdda9b5a5ec866d22a0f64f35b94464088e0683bea137d5ec4442a1676638a3b4c7482d646b65db326a9024757504ac97a96e6c98d1fe54be95fb8cd422e8794ccad972ac61ae66e93a45e625af9466c6cb1132d91034ae00d24d5bd345d3e2cab6c75ab01c52085751bcb8117666a982ba0f2cf3f9867367d44357874988d4a72e7cc1252436167c3991f474b4547f42d8675659a21cc997afdb55032a683880c0408b8b66c5439c99f9d3d578a29b2b0659cc3e8bb90d5e8814984c60f180890cbd8bb6b0cc5d71281a87441c06705165dd6253160ba381044700f0a616cf311890941c9d082cd1c234f7c71a5f97362417e22a218803bddc51efd41091d6915387780a43d278dbb800bb724f1a6ae8882877c1e4ca11551e2bd687b937bd638e352a1e2074d27aa8b8669d66da9bc614481302e9b4e570684a680716cc288c2d7b9466e8a15109a1fe7b2b2e30b378b71a6544449c843e68a39a8955d7946e6424cbd413a7c44dae255cd57bc4dd26332dc791dc1642939ba4594464fd6272f86271873b78d52d6f9d6fd6338e6a2aa8e29ce7303dfdd3f1ebfaed3472e7569af82d552108d0660cc23cfa3857b7906f515a1769e2836c958b0a87e3ba6bf14d97dfc8491109bdcaf6ae775ac32ead0d0ecab1eb03161d33ce922ba70c3f6f65f33d5c8d373c1503f0c90bdb150104a424305da5ba55fccf256850871f64937f34a42cbd92a5924a7d1496d8c30967f1557e57f3c4219444c8e57dd17916a37144d7796619a0db7f51025366f8fd794e27ea36cb2eaca3fef607cf4466941f6b333f0a909277d28b60829ae8dd52b05fd77c06af38be8ee12b2cc5173e706275f2026f9828e2268585e21d538483918a645d817a0d77951e473f8cc4e8498e19412ac42ee4cb6b7fcc5c000482d2d512f60d58e7fd0de413400f195a0a6c5ca922d3a42b9cc290c8ccb0542c611d028bf477e0999264cfc25456ab4884592baeecc7fc9014c80a73ee630903d247bedf1ff77a39e0b042c9dab7dcaa4fde049dd6768d49e54b3c00d1ab8425090ee3e805c0e7fec6c173612f0ed3452ace1078f3bf89f817426c1a754ca14a17edc6e94643f3aac513e057e88b4082f164c43508ca04cd15996153f2a71bc9abf95f49e71342da557c7e4e8b85313a6c229ea874cf02c3947819813bb89321ae6330b141e8de3ff3062c9892a268a10c371cb2df13b4a0d88f043a0aa8145b87fdd64020f7af87005c043bf8c16c3694ab703b1789256ea1704dfffb432a940f52436bfafca62586975b23720c392d1d39a663f10e7880668a5767316d62717a58ee1817605ee5896dd61a24aede3e12bf6bc00c7ac4d7d5d9ea2c4d563ff0c10c12f2cd0936439f1f3440a05958e7f87cbfd28eef54b634c317a48221fa7ca51a529e95ff3e6403986097142fc6520f9e42ee29f1d41cca3ca171959afb87a8d32d72ed640fb1ed9e98eb34eacc6e2ac3fdc240d7245d4200e572a7317d5b356ef98fc95efc5a2dbe32c980d53430bc5f2181c63031e91897d44d77a8a791975b742ff0a77c204ce0b11912fe386c10fa0a02e91c14288718b552ea7586209c303d4b6be37650f7a2b0197ba66dcbdf20ff9e7170b1e647d39f765046f67aece8771789efaff1d87e5927fd98a6722573b2f69a28b6e1178d555c8e2691120ba976d0ee435799ab23d0e3227ca020132ccde585dc1dcad9b6f0442c8e29c4139278ed1b1ce22fc605848b7972f718b664e3902550e5cfef85d5c3669a26dc90b94e030cdce647f8db5b8db1b132bb5fb4cfd5f50279895e6de3f3b2a7bc3a7eb147885aa98c5e93b99c1d27cb0d4ff336bc6c48bb9b77d6d5c0f4b417fd1bdc88327d2010d76a9837ca3501e1627c46e307950aabf28053db1f4d685c5f23115c24248181d3f9d017895b1df8685d4b3879e992e10f34886a61819b7536bff3642e8178fca4d8e68130132c31151371c7f6e1a2e08deccf816130ee61a349bd5081b552ca26dcead9afa709425c9122e585ce1874c412a6ba9551fb2b7522d05a7dfa447a70d6be39cb485a26ecd61e0b38fe989580ab919fa3a7c5a05b54f12f1893cd09ec83ae9a25bdb1df0619ffe50f6249408d4a61cfcc498634fbc3a5333a054f4e37f4f1733d25c4da273963d604b79039c13a89393421295c6aa6777406c5e4cacab0421eca4902c69c4000e31387f918c2a65969325a01b052577e5546c01e915719615a62979751fd83bb6753765b22a9b8a69a562ff39b6dc77978214b14e07224454056cc4b4b5b10b71514b010c6b3b11e2a6a154cd471b3d6b8f1ae00009013edca416f8393d605e7dadb1c975fd5431783094861833cd35ede77b941272256e3338f8953a1a207ef085cf9754dd9b8978260dcab672949eea2468c5c711cf514d0858027fb012d0c25d75da6cb887f4d64cd6a4e3d90d8768aa2ef018cf12d312f878b02cd19e12499bd5c3f93072cb16f5bcf422918df17efac710e6e2fb6182227bd75502eaa81fbf17ecbbecade7192149a830213f6cd2b561f942f0f96347120716621d7a366ee1ed980c5a3503e0af5becf35b95048c4e08d4c3869971364672c50901c1b2d82172d2b61b6b1ba6412366bf44acec6c0721d94de55fe3a233166f746a8ef8680f76c46f76d202a5571fd9530b128cfd75027d99ac06d6bd2e58e428cd21b5f0e06561618c792af21ce8bc84d8a0c66662a9224e513b1e744fbeea11ca5fda748ae56b8952f2b14b8b971deb4ea510a50089b4e60dafc09118ccdf695888648d220e6b2bb5c3422e4465bcc57aa3839605eaf8cd054331e3261878ae160ae0efcd5f94b2e106dd2d2916531f4fdcfda9a9158536702e44b22f6d4715d37c4395ddc574a55d8be97c837c478eee04804a3a7fa67fb7fb4caa9747204dbb77f188203f9b6a6d4736a9a0e0ff69a4af7b599871122e567c83764e3f6cc46a4ae532a64487c5f0cb38bcb1886ec73f4fe4923bfddf56deed4e2acac59da657655d5a742b0688c6493ebdfabe7cb27f305649f39b9f1e41f9743741491f2ca4dd5f0425ea60f14d664b6b1e714df2a1e639567679a893767da8f31d4430391e142c6854b1a4c5e853510e15bacd1c4a0a000526cd56f67dda0e7922e9bcf1768d970e8c369e90ee957550e3b90a5f6c5fcb019958726bf16849b1aa41e4fc2b90995440b5d617526be5c24931ed9b281fab80e8ad1a23c57df4a9342755fbb14066349423d787e2ea51bb09797339bb2d4ee7bcc2dde06839aaaad1a9b6a79480a963503b019596645daefa74ab6b8f4f7934bb15c34ab3ac99ec05d0d8427d7cfd97c2aba8f80f39dd61c7dfae1a284dc261064c4001f0b33af4faa5fce083255b03ac34433e201493fb7769062aafea6b0c2615b658b8cf416ba1716198bdb79f0d7aa3bb0f5c064086cc07f8d6a0c83fdbef10d031fa8d5fba34f0b1a19878b3180d30a56fbd09ad36896cdb4bf9c5dd79ee16f80c030d091be0f30c26d825cbb2851f118231bcfd0a2037d8f540613214c8e4c0ff3124e12c487fa9741f7018f440ed477483dab9b00952dba10e8465000737c7a56115407c2588eaa47af8eb677a60c189f46fec511d39fc2091705ef8df0912ed1da1da038d73b239638bc4a78480a437d7ebbc15c5d1405fd7e0ef4b68cad09463463222ec901e8c9106bb5a0d1a8de073b558ec7fc2576bd22965d68828ff4aa33922e9150c085004271403c7e52fa81fc58bddf93380a758f1a65b4ae33781a610e928fe1698376835d1714ec401035d55bba86183cf0e4e2df2ce91ab68d90ef07fa21c05e782da074d1424f2fec1f0295e90f08985725a7569601700ee672f0d4ceca053184189881b0647f8fde7132057e09b4813ec9a8456131df7f242ccac8a1d1e142be1cd29ac03d16a4268881dac9cb01732fd4698e80000e1a170fac5ea23fa82ceac6029e4106b8be432c32ef377647719dea2d7dc7e717e10ae72ab8cee3a9540b98a932a0dc33f5808f1ccef5293d66dee7db2704884038ca4417b827b3d8e2d4a9c98373cbdc7324aa072c1a7c6c5e41cfc0513b55c52bdd027e3abb746e8398ecf8108df69b854dd012fa0b72c7a9ea312578abc15d0073e11e3608cb16011363920aa2a64b62d9da90ec5dc3b1939ce9d5964180dfbb8514e0c8b51e4e5a73e32588ca4b320f363763a60d36ffb392141394c728371c67be3036f40d07d159d5ce42466902c931d3170a29285517277483d10e1c178823630fbdaa445aadb569c283c532d06825e618e593ede3ec594350ddce4314382ed89448365a89329668a24b5792bff3795a8c4f2a6cb88f43ce6f13f803cecafc58e0788054d35d8dd365cbfc8755ff07724d0926d8666004737c6dc1182a2367413a395d6013f2ba5e5e4c96cb43815fa3f31041a5300ae6ad566a3574dd055e943d940130e1ba3e048850cc5517039acf31a5acfd43f232765ea7f4dedf26e196cf43bee984140f8308d2b1d33dbe551208cb2a96ddb85a0d61bf0d224c4ba0a48edf1e47ac05d2261e1336edac6455fa84dda915afb66d63b9b5dda0d001e2775478bd18cc61028a6f1c24637dc83565c65f4aa632d340ada64856f093a09ca3c60f9e3b4f25b71e0d43f40f00c61be945adb9a6b7ca86fca1764f8be843d74529b93290dbc6ee71ad4392a54f7be2649071f1da4ad0b439dad9ad52fdbbabfb5f67ded7bd0d0859f29a670749e97289f0cae51a3bd49bf1326679ad5a1a6742998e8e224243a7cb508c57f662bed3460bac7fb2a894fc814075e3a537f8ccf33acd84c018ea3c7f82b28bdd0508f7bc5ea48d301c20212d961c35602a6ef1438b2c3b22281014581aae3a7a98cc02b07849c0abcbb380ff67994b48ef3f4a16a080416204441469b7b21437aa0bdc08741b1d5bc01699968533d4c398bc5c9c0751e2db1c00c45f5a6694f8a187ffeece67791f60608518a09b0267386c8a3c2fd1e250e4fc2a174b1681d860dbcadbd1e3752401fdff1eb7802c79d3df0226657130aef6ac45de02252e41336f39adfde8687d010d3c334d8751e0e8d515bfb316cd8d59c3aeaf933d629fd41a472ccf81d0c4a36d2a5f78aab617008184933beadea99c7b7793950cd626c98815522caae3fb15b36006af3b7ee7378884349afcf944759d49e3f13219927849a4724eaee7c2390b93bd40912f1bbb98681e1c17af53e81a20e6455f5a90da6602e100ca86802beee0b736b70986802d8257773ae2350d54203fa1038c017e88f961f40af5f9d50b586a7f070afd5cc6cd22e43e0353851d7773d0d8546aca57d1936ee66a61cf5fe39eaf484d07c16d94e73844a5f0e582eee138c092fe33015b9d8096512c22a830864fd072ae7e78d04d810df5158d418b57d61b8e3718300ee4a2118a2ff070f72df7c88540f316ebd25feef94d6d02907fab3c5d3aef1f14309748aff49c2f718d51dc8c241f16addbd8781382d913fdd7ffe93681e11e166559b309f9585cec9fc79519932a6b9010df30e69bc8b74184a214bcdf130b09bf38f0fc16723410e2fe791641f4864a18d8f411a287c10c6eb348d4abbc413e30ce825bf3deba43ed1215ca3636acb196959efafc3005e6fc63e1b32a083edd87534534e49c3a8015132ea5ece8968e5403afdcc34af1a5e0ff8c5e188498369d79135db0ea96a8d312d7366cec0838182027a5068f86057219077946c35f7c3e10ecf3fbfa93ec101f23c999dd2f64e8e98d91fb60202ea1863bee271d80b7fc196485c0cc195c848000182b7ec3321386bc151b4779cc625fac0e30d04dc922ac79f775e930a0e080134d3c496ab8b8bb58c1b1a0b58278e765c10aa873c4ce32ea7a15098b7b46fc347ddcfa4cfde3f039d8607613dd0d8ae6d0892cf2e5817af3d7f13b22e6d773aa085af133004a85867867fcdd5be822251e2d5f789f18a440c08387792cfbe478e4d1204eb122bd070cdbdb5d867a76f0f316491a2f7b1fbee69b7c25331b19e876b8a3185afd225723bbf29f6ea5e54041d7f40a7816b9a20bb7d1dcbda12a11e96615630e895863b1a3508e4ae5cbff2fef957a9edd1df149a925a4c4ce9c7fcb466ca25fb17992b85f550c2c72f602065cc1b43a02254bd57904c14696f0d6226b713da394601304569e72dc9c3412e562f2c3a37a0e88e4ba23e95c66b30c14f83dfb7b8703044781d507c4d6fe63a1d6f57ef19dc81e806e07617393232930e399a0debd7a4670d88fe95745a24b627c847d2d4362ff5a606f357f2452514c1608304d60712ab9617ac2dd2d9af68e1840491480a81df64f25439e6dd2a32fd29688507143af75a45d371105ad8e8b515e78b5de7b22a7825eede83a7868b97bc2cbc294b606883e1a3170e549bc78a9b48703e0140100b250c6e7dea4aee917c7cd64af9b8a7710da522c2a190e483fcdd216695c778683508c18856a8f215f82062535fed0a2ad4eaed5769fbe50f05cda5320cdcf2032b3be3183c65074612c8c7c30cbe29ada03d3eb7a07b73d48df4f6be6fbec2f7d82c3438a678764eb209cca0a3108ea0602e8672e82c8cca1301775be296a757e8b217eebedbac44403e8d319767073df2a27543f56a49f62bc20ac4922fef850f3ef92f58a40ab5ba4532d57b0563b805c30281ed1ec241b950ce52372e675afe7eb3450795e00bffe901d84b7f14a3cd5309a985b98994441d481982746cf0c6cdb6d817aaab0c41bfff7262e71535d5f19aae32387212c67a90ab6b83f8b1dfa0dc0c86a5c425b59df1c5d9723e372b9dc7be9f6d0872bdbae24d51eef0dafffda71c0e9f52babaeb5882b895d2ddd38cfb033ebb3d248b94e6513caf915d200d3e657c476a3e21e9efeb6984d68ba7ae59ccea4656d6455ea2912903b0cf126a6535108d5a616b189a35d7b0bf474ae910a4f31a907bb3b66af22aec037610077aef6de38f51d85e55585cafd5e0d5c430d3b8941f0b07fe4bac02bfca1f44eefd42bbac60997d257fbb377b119d0ab617361a4ec2073e62ad8840f61e942452d0d31d44fba5b41fe509e7406febffdc760bd26f341ed63706038917e5ea1ccc0eff802cdea838f4921bc3b9701f4cf1c57cc72ff135cc96c729f81030483c4a6c41fdc9798697db41c176a17e22414c4ef6d1616e906868cdfb700038342c883c9c19279efedf764d9cf19d0def1474475b363596d02e3830ffd105e2dbba68d22b8b8a866acdc89c43d395f4206a1ce0e7b7bafab4d5419c5359dc491d621927a15a87a6ca826a8e9dbf07d6e7ccc3cc27cc90ef1143999c272c55b3761e9c8fddcdf3e8b46bcdb1b8335aeeef5ce1d78d64828039a2f0b3ab16864821d8dae73009630f901992034766b62dd15aca856c4e8c16de796c28fe0d0cab82c923effc8df439c492c7b33bf33b150683bf80bcc994465ae9d24b23fd34694e93e6b4693f2d35cee77f1d79ba74a5492b9db4d34b3f7d9a69583aebf403e9bc4a50501d6f412960d03da481caa38cb5044d81ed8461734ee9f741e5082d1cd8aa39661aff463ca9d193362999a49777309895efe6ba8c933c78001c7bee52aa57a4c9bd6227730463a93f245e39140d2a61417304fbaf993e34060d97f0f97cf40a5705e478a9d31e15e712def92221fd77946d1c2db7445de1e161a07f188da563d158e9e2fecde6353aa59031fbcf6235e0a5aec69be5e29afd5834353af6fcab94eaacda8ff19f51fd85e673ff383946cb52067c5f4fb6e71476c36093172dc6d54c0760ce45e0347a7083666c1f0dd5b50daa51b0f2d866f553e4dfcccb4fbe860496ad3c2a188679f1b6127ed92595f8ea3f68b624b32f052a9b8a306a139cd609b0bbb11e995a89f2e40a5620e915111a896c5f20957858b9943b430c4194b10292db3beca2c6c883a950b75442463b2c5545155bfdf594fbe5f9fdb1db2b16d5ecff53c26e45755ffe25c0fe49254cfcd9dbb645751fff4174701fee660567d57e02888beafed6d79793975c517d9cffd5266c51adc36f60d6ff37cbff0fdaaca8eede875a4fad1d601515a7f9d32ef797e8fbc7b4472c2aadffa30bb715d5bcffc24e296a02fd9f31fadfec5577c2c0ba68517141e39042a4b4e86c7318ff2a8800b0d3a0a862f06fff5c5554f3f03f8dd5ffcdf2ff433758547719a1628fa3c2b07f51c534bf3ce5bf38bf7e74fbdaa29afd7f82dd6151ddd7bf06587f043cff9c2fa845b524b3021f207a28bcc7b1a27290f60b09c8835cb213647dfb1b32fca97476c1788a38e2c5dd98ee8c986c507d4428872b2a8edeb2bed0f6c880ad4d45f5994abef42a40d92e2a5ea7de68ab6ce30751bf2d3c4535bf75c1d8ed960586fda009afa8568ddaa4a2a2f9c99bfffe8dbfc5d8fa6d64b5e36c9f5b992aaea5a82e35b32308a7d453b3e5363f384dd26e57057a50cd4320ac562aeab92653c987b43dba9b8cd9c24ff10d98848739aaf23d43c70df3f8df75f794bd0e626aa4e0ef35f137fddedbd4eb3d901803078247b9bba47723235627cd0ee19d97783d6989a272244bc4491afbb8a8dfa602d0936e10c73751539e31758858d0a859b027ca38a4fe7b83ffaa3d30cc8fa3fbe5edeff4614ff3aa85176dec8a19c217143aaae1eb6575c5e7ca9cacd7c3a3d04689d98d4fed36714b20996d67331f49110234ff75831a0fd3629b8c0869a223b1a0e187a45e110228ffba641a37217d6021bd69ac80aa8426f4da8e8d183d644a8912d66fa86e4dc4c8b54420c2433e172c81b08fa4224442260715956d294c537a67592a0351545d3458251eb1cb1ec440a1b0f075d54fd57a49672783721e055bdb543a24ac2768447f8d24cc7b7cee55eb42b1149af1ab9a4cc0ab422f9bd49367d0f1972999e785ac1557d1cce87c5bfd802f81e470ac61614b6b129d2f6166ff89e60e3934eebd554a70016f431153226c916805407d91f9662247071c219aa770a72462f9bfbd00a5a80e83fc2b04e47408cc8cf264053901607bb20c084058d229e472246c81529f8c90c4c2f844b1cf121b4184672168485403dc3729d5543fea32a8a91b43919ed35632f0cad877ce36dae87f7b1442e1276ab076ce8d0b21ad0bf0d551d702b0c0f018ab7d2458700d3add9015d0599250fee2cfbb225d51abbf5fc8c32b63c7edc5681d401985cc78f2b3f2839ef4a7889d075f9fd48c53895947d640f62a8c3e862d5527f05291a3e59046ae4112463394a8de6bf192c80b84d7708ecd5a9c844e05ba581a8993fbe018e4c8bd710ab6da81b84fec4b2ea97542c0b6713c0d0da9344c8996137434ea9d9af14b87655a9c3777c3a574348809b38d58ad1c303f0d73081817f9e9bba40548bab8d25bcd4436d6d6dc9a046a2bf631fa2a2a25e3297b3928bbcb555d01c60bfc332b621562e254961d93b72434f6471b1942722f0e2796375bf699f0239cb3675a52c66fef6caf6f844901ec491ab4dde11a988e24457c88335a3f110958c6f9f7cdb2e135a7eec44ef2b3c0985909b29d88e21efc9d690c84bf951c264b7ef7d6dc4ce75562506c683ff82c3b9806799a7336a9e1e354e24ef0c8f35bf57dd815a2454f8868d55e90b09fd5a2cc8011f3a0b92ce274207e1e936082f233961332eeecb64a6a6a19aab53d826466d4e873a0174ad6aa266d013fb32171e29bb8b26e54be894d15148b897e80ce744df7a0cd4a62ff75290d49c969b9a6215b8a1d1f1377b062fbfbd7bd0681227a0a291c404bbf246a921d6176fe29549434fc3a1f46e5e1f1132a231a902b3fb51de61213a88ec876e935703b2025297db184ed2b49bd2e075f3fb4b4315e13fed5a9121ed18fe84d9d4802f17d17e0098274295091ce52cb6d5d4f5f2787b2790b7680e40a22494bafcfe40ccacfccf595735d1f977112d70de8327e6de1eca5c2eddace3d15ce83706c04c834b6d9172c32964f8247d3052e38de2ab59f90143ac46620bd53e8098fc5d8724526c26d18eb75c4d0c82cd5f74d93d41f81de3a20d580310ef8c18b1ee1e84b0e427951a4dc01364bdc46d68dc701820e965899f3e7c029922b763e40f29d09a16fb028210393555dbdd5e5f7ed7b3d5f26946e37964c631a0c6a54fde72bb2e1c7f8da2a42a5b50e54df6e0b559dd3bddeb39105ce2783c127f3cc3542078e4367694aa7221ec703998870260d4788ca671aea15cc26f8983fa44dd5433beb9df66c29ae083b6834487e32cf1b3fc7b4ecc2540906419397e8c069f51842cc5111a6fcd7cebe65ea800b000a094b2522eee1fe50318d0fa760cdee11640e99b8c8e9875382d71f2803333ea50d48e848b3d16077ac5d04222f989bfa7f47ea54714bfc85ced1b5056cf3f62571e63e8774c0bdabb499ecfef652be7b8185f88dd0e66643149b002955c137bb0f22679e88206faf369e7fc546dfa34063e6b957c888b16e3d761d794c79c46441627c8c1d831f43dfc17fc337ce242294e7af979be42a89a2c184bd741125163f8300f95a5904453d82ff2c8cff32580f7db840a02b148d01f2d3a6ae525a34392d444fcf2b14f765f630af9767d393d8219784ad9700f2d481a991d5dfa893bb0b8483d91cedfb1f3697ef21dfd87cb758b7e9f0b910f210819043a6df48ead066510205312cf5a95664b4a08e163c4d705cca994b9abd86172093fa400aa217a1fa73fb5e34f9336cf6cfa09f224421f41949d5756815831f44d3ab1f09dfc36c3af2b6aa459b0790117cbbe6b8be147c546791b25ac2609a4726300472eb6901f8e0a98c60049cc8e64f3273c68c075a69d33f45e2cfe2574d477cd369e81bcaeefedb034421e71c702ff97825cca817a239ee6545360dfaee78f257a8ff460f3f4c953bc2848c4277ba99fb12079c1a5da4349934c784a2ccffa6a8656b8e76cb9d5422525df4857fa32b073209ac26d443fb5b351c9b84c0b44b9fdb53231f0abbddc0034d18edcde2cf513d0ff1df51c03212feebea1560f388db90f544c11eb4f071184146b5e59880598ab35dcb976dcb87b6fda2131befa0556efd886d05d2b105d47b45b128a5bb826169879f2f9bb01e7676c7984a0eab686e509c57e4cf99c785e18f3bbaf30f2e6741e831a84e1ab17664056b025e6a83de3c374cc51686efe8938b582b1be175281b3d8414e4698459209a2379cd3508c8ce2efe48442b2012a38328363a57be62bfde636d7b321c7036ea5554df60df8d677dedac2c3509041bc46b5ce7b41395eb4a71a946c9d5a4483abee42e8855cdef50229fe11219806f48a027f57b476ac533bc516cb054b812e795127f71a32923f916d483628e867308e5842257a998379d86e49bb8ef2cb49c851f678e91b0c4cf422edf616e539bb4c6e2262059a554b0756fe17a82148784e256091093d590cbce88fc80087a2339657cf768c215d448c785c866f682291215f9c1df95872b780ff4570f9f4be8dc32c2e4e744373b7907048fd7c627b37a6bd4c30e8727a3f0181695628a4fecafed3fe6e5409122be10dd8ef9e6136bec14afd60838e1ce0b07fffb7ee83d8af4e29553321d0127220fd91a14335f19fd4cd81b9f78e1ebb1a37a1a80b38abdae97d1cfcacae820675a3567bd3973352485787bee03f6707e5c40f14713785d83731097493576b1e7c3be8f362f71584a0503f4e6b1ce6b3d3f41acc29843ae10c297ace0fd6531ea573aedaf9feae83a9eb101b64ba2d7fa0ce7ff528b2d17211902dc215e5e4e5175d57d1423a38adc494508581389d4a46f2bf297279913b633f272d0c3eccd460f3171985ebad1ccddef8f69cd41e81b75383e58aa39834a4a29c5d45863cf8f454c430e20c3bd8846054f0f471a66e37cee1d402f8f0cbc6d1c421bc37b13e6a4b01eaffd4912b27e02afaf2b489ad3d1f79672a50b62b404ac3d6673495785e9407f04f46cca600f457de60cd0ebed5d12851b7f238ce9176154fc83b941ab19f60f913823fbdf2e72728af98a50da58e5e09fc911765bd8395221e56e6e78103a950372812242cb545e1c69b6c110f4c17598bc1984ea80a8f76ed63e580dcdd1027984b38602b8e00f9ab481e4bb60f1645f8c8c253ba2205b64001c034a0841a24e1900973da2817947c52a9320282283904e084d946f7f3e433e08c8b3c70be42de3ea148415039017cdcf15bc897ae08da84c1e999058ccc685ea80399ecb1b972c90822f20dd7704f7d5ddc90676607e37ab1fb8651c06e1691ab00b493593fb1535ab65e4cd514b03c0bd5195326abfab7a7fd706f49dd98672cac4edd7604a9f0e661d7b5879cde1a08780c3f9d3f2b44bf31b4ee2535be8822627f540dfd8f4cfe0f12d083fdf091a235a8cdce1cd591d83c660f7a8f2ecaa73e723947f734b3b305e8b28636cc7b234d51086b14626af4ba1a2798b73d147c6b1b9c00634e011055841ceb586542adb300732fd528073831c53a6e74cf4e0d472d2bbf60f3593f5f50860f994ce7a0e457c85127ec9344afeb0c29cbf9a981db518f11dcc547803ef7c11ab9c4de5dc6581abd565f56fb463dc845ee6df3f01e248e50c8df0fe7c7db5020e3ded1ca8a94fab77ad2f684ca382e01c42f3e10cc3f56d238c78774cecc2ddb5ff2299c5a227d9a1ab251f091c1c73db6e952405fea0a92770dfabb07109e5938bd6a6c17318a2b078e6dbab8dab137df88267f8d527d5cdf992ab3664ea538ac1d8b09f983f708cc6299c8cadf602b5fdcd5006255ad6e2178ef1e494020c37e87d28ac208c52050d71a868ae31f7a144936fb1b330b617a93f21463dd4d907e1a8ddeecf2266e6bc187e0b8ffa009fcbf76ce3f5f6329682d7a5f6390bac3a32f43f7cace8e0089f3442dca0880f02cfc61f82a957bd1fa4e4c8725f8d1ae1497d06150d02786a56942a3e7f3b7c55f14b1a068ec75fb8d5c4937805b201b57ac2d03911f76dd4c10c5951f6eb7117f5fe10132d9a5e2673af7e564861726f468ec93dea1e7f0b755e166653f9e0dc24a9ec3516a57eb58f6017bf3005f5c6930cd2c2181777b001b7e726176f8d01bb821dbbb91dc3242b3721904ea591003b95119463ba9200179f877801982e9ac1eb5b4ba9730d90f579402503ad36f9bf0d90818645c999eed0eb43e9efb4ef4800623a5fcc0e189f0f6f0dcfb700c300a85de99f9e270f8b8999c544017a0be97bf7ee12452e3c9b298a19e107d6e143bf90f94a3ee460042dc8a83ee9112905f0962a967bbab4dcb73a0e30e2627377dc1191c1085b2c748e91d0d57fdad9ba1d4b8bd0d6b66fa49257b61ddfdc7bfc0277658d19c801821cc89e6fb50d997639e38b4525406a23a468c4b6f8b10520196c2d5a3021223c3a1db9d3bfbf5e6d2baa861b763372da666c9c9a480da4b25cc26269452c51a8f4ef3b31633d8ba495f7b62e98a9cbef94d4e3cc903a14534ef147a0ec0a89641bb68ff94b8e22f3e201d14b6219c38b1b9b8aebfc0bf3938f2e8c20042cdbab89e0e939ad5cc45021976c18447e19f067b4312c55722338403756f8eb99da62e91988961d722f7400a5d1977329ebce1599427e6fd0c42fe028f8c111507ed746ba2176bcb05410ba8084fa2c39780e1fb6a2a984bef187d6e6e7f5ff05b1f9221556cbe87cdbb5423910e53a386129e566f9f9cb5677831905395f39881a0299551896f7066ef6f93fd27335d7eb46634edd9b003734b307047d36b205edfabd1408c10d546d30f994325f20083cfe6225225ef500ee2401306d6f127a0c4561d4babed6c8d921b8f15cb29b1d602d8971b6e20a7d35dea18c000d3229c3ecc09a90d54a41f25e9e42570438e02b06dbc5c9fda16e45a000b852df830e3f6288bb3f629f9657ed539f453988bc42a9eba316128521f7cd5053513117b09c23848e381a304b3a56d229ef24108ce714cef21662078d27fb305159d698d804d0a0c8745588f8620c5de5ac369aae5936d301d21c36a4c01fc494035dc1f9a72fe518eb17b78ce3f330ca66216c98dcceedb30fa35e5c9958e3f02309be5804c6fe6a958282c88345a83977aea0f2ce8d12504016001305c7a51e5178c0195b86dfc22d5bab7ac4f3739be1dc41a98ba1df9853eb7b3ef61498aff704dea7bd3d1018583c21b25171af7630b6a2eec061e63b7cde3f90f6995afbde0fdfc2a3ab517638162cd01a7433b8419b9ec2ee510404016b3010907c2f71a2521aa97f696898994d52b5c1cdae5f80f6b4e8a75b47afefffe8cfdc509fd8da7ad1095fdaedfbfaf0feddedacb7394a019d85a153e40ff275b6d557b0dc0a008cf5e992df994d0ff59b4576bdaeac0d4dbb88cf5fc21db8a2f7dca84caa9db32efaf306840c03da2396725820ce61950e03c936e082c9d319154add78949efa902ef5ac0d26c2a152d00c2d693aaab055a12ef9ef297a551270400170c2e5ed33b4a43f39426adcbab7f85d242f968a4e8bf7f2b343b463edc8277bef2db7943225290301070007f8065745b64b8ae3385a68224f1b103bc023b63b424cdd01424955679aa44dee89bdb0ccf0cd99c4e18b4bbf3dd2304fccdddb13868c1c5487ed0aa55bf661cfb87723fcfdff3fe9d7c07c25a5948274b657eb4dedb43fd3adbdf3f35a7dacb4c37c9f099fb37fce39c1e66827f17d2ba884dddddddddd2114812baedcb5532ae6ae9d32658a67cd1ac775d16cc139917db0652958b070e1a208734438034a3455f47bbd4444454444444444444445ee6ebb6ce55aa713dd9294f198967c7129e3d5c39e316148d105337bee0c39f3e308b0cc960172599482858becd30c9b387a321d93018de267dcb3c6d0ef4e76aa273bedc3d44fd9bf9b44c9de560e7ad696b7992058fc8092fdf66388ecff3964ffd9ad894ff61b1033d9ff0595ec1f4386d310d97f04128864ff11bcc9fe356e040182f64443530f2821b7282a215e55574290c06aa4791bb2430d8a169134940bca4af6a75d5e5058d99f7e3dd18a60354141193113758215aaa5aa233c5c6129d18292fd86844ff6a75b196626a45ab914cab495be732146ebda769c2646d48c10e112220d591e4d6fe94b1cec011d8acc20049c292643c8b6d6da2a61f94217647f1c4ec9ee032abb2ce9477be971e5c9a4b165ff0fcf169efd8a921ecae60068952771eff7718dfa4fa7579441696ee4ffa245ae16f6fd33a0019a44eb5023ff356bdebca953a7a45126501368b64ee998a051611d12822a5c5f2d3459e35485479563849590163cc1bad26788ae3b733bcc790f61acb0f818d1c5cc991b2c99ebedb8e0ca8e2a314a5c38c1696a015101c321a2797ce10174cc71b4db438960c00d54766a6576e0c164da9034e56125f7ad070b3ab0903192258922649ef28079de7aa0c0f57595e763e15aa895e79c73cef9e5512e95321d6bd6dabf9cbd77ec19753f829bd028f489c260d8598f7255bab396ef02f28cfb9c576e9cf356579a46f3ada51867d05f621d3607edaec8373d89a45a8ee0266194925ab919cc269c7164f34ed7d127ac84396badb5d6da5ba9157895c396c3cc776dbddf5d5bedb5d5cef21d2157cb5d5beb48491d5d8eeebb8452ab3c6914dae408d592a74de9e98832cdfabc1ed99d382fdc2849464515b692d751d78cebb764b6508bd6bc7240512b2a7a95c31652ab1c663eaa4e49e9e86836fbbfb3469f720e3d628c39b394cafb65a1d7b464bf4f6bb556c3ca7eed08a04831e5029ba6cf29ba4fa59ecd9761afd5aa8c754e0ace1d83e603b9f65c30ed49a153c1931f27543dfd1082862346744b1a641e59446ec883c4e685c7173d03c157e8642f23e2b82038cc711c47454b4a0e51aa04914201c9958a24cb098f538127599878c9c982e3c475574ae3ba9e1d4d1b539bef5fcc1b539ddc8f652f8be57963b23169795440bc90cb236f89294a5518e679633a7263f2c1b4630ed72414caf3b624c4750a83f2bc2d717530843f79de96ca74566e4b60bc2ce197e76d098b024b57b8ce89c3a520b9941d11eabc6e8824402cbcf1c95662cb4928042ac8d6140b5203bac1c74f90ae70cb1098d355ac4a117008d7cf13211f102d188f22423c2790478fa7cec9f60d01859f9abc3943b8aa6e8bc805d28575b05c5c96531552bb3238b9902fdb42530781aa549a280843a2fcb623ca8893577f8b3ba06cd79017feaaf7948e9ca61f0c82e152cd3d5ae8b101137a65b8841c0e9d5308e372b3844056ac11a107c50e8124c34067c88d13fee469a343c359215010476d44bfcbcd9023a523164a20f8c03184384f5b979a5ce2a510ccd3d69543eee684b03c6d5db59c44011ad7871b87b63b6872cdf3468b21979fbdc62c7c5fe732ac945dc6f5b5b862f76bafadb5d6d1dd6977777777779b50f2d1f66a3b7bb1ad7e394e4986655e937d7dd1fe1cbe2f6a234ddcd9ceabb6daea9e87ef46e28b9ed5cf03dbdd56b715f460f4939294c27fef9779cdd660de0b37d2b2793f2f6ab3c5e44261c2d6a6f6daa697bb4db9210a50b23ecd40798e4a1cb8373491c54c53f4acda6967e759adc74a1a332bec2613998e26d44c636a65a63c47b10c634dc39f9fa6f3c7da8a6df866df7bff855f117f27362991f73d91c90726ef372991dddbcb35ee3e10f613fb3ef004b556a8ba588e16c37e622150d0cfec6e53a0b28dced94729a55869ae4a1c98330c4d008941f54bafb596a042a289143f41611038832efe3bc71976e4b80f276c68e2f738ec46553c016ef1af3bc269b39a9e98334fc82e00cbfad32706e0d098bd8e77ac6d82cb0fac1bc47347d8ff79dc58ebf469c7fb2b94bac9260963cce18fe3525c0daeaac36aa1065342fa0d82ded8ddc1155442faeeee1ec3efe592662978c491829f28d88a75dc72393a6b955dae5e1077de27644be06b391d2cbe1c9e02c2f0b59c0e165f0e4f81fdf4e9c44b7e3f60275af28b819d5849273f20b0139bfc82c04ea4a4277e6258a3042c84300b95c03fc9fa3f30187872778aeda66261d7513c15024df1a680826047b3d90c840ee57d3c0a85f74bf07ae2cdfe60235d136ab62eb21d6dd89a0afd1e9eddff79ed469d57bb11acd53d094aebfb083ca96dd1083c09bce149dfd3266dcaf3cba9359647992b8afd50980660ff8d39863040c9ef29f98d4d2009fba64a327def03937472d03d2852b26122541236fa588a91df37792f0c19df382707ddf592bbffc2257321cc2fb46328291d1dcd669fbba9a5e525e32e0e0b617af1c65b54d435e7c3fcb66e7f9c515b880f37d205321427aa09a112414061ec07067e5e87b96bab379dd6dd73501ddeb0a8157942fa2bf2b8d79dae38f56778fdc0bf295d617f9445f9eb59cdfd29c016fc79f19296ace4e720283af955f0c244ef67fe623796e97ba1e5862050e754811fec465cff8e10a8993e5773d3aff7bd762ad55e7bcbfb9dfd7bbbb1fe8745ce8ea58e6c692e812641455badb57786b59eaf5880b9c1d460cefab127ad9844f4839f2bfa33e8cf449d2bf7994e3804810cb8ff0f0fe0a7049a44b67fdf67d08a6967e7c38d8401f8617041966514d7829c9d463013e416ca257250febcef0341d0c558fe7e404e9ce44f0c7411cc5f08baf8e50f0874d1cb5f0990c399cbd7e60f05e862cd9f0c74d1f377014874c110063f3ed615581cb99bba0f76c20bf2bc2da1bd094fe47993aa4325c5c3124e2a4cc52188e37449613902474a2aea872b292722706c51449c10070b873894618fca4b851be469b35324974742c20bf2b4d5f9ca13a2c8d356c74d0c7576002289064342fa5ae1556a1aca1ebbbb4b1912a1c9fe267bc4c1829b83f66d431b83fc433882cb6c8e7118ca64ffb31b1a080947e8ffba31bfe697adb6ba25c939e7cf4979a843505c6badf55ace626bf1c85d5937f50ee8021ce4b34e21fd2a809f1dc9e605303c4db7d79f2abcda5ecc610e0871ceaa00ca0db4b5d676e5c07a31b6360e14e85fb5757c3b39fbaf74c5d0621c42adb5d6103e37a6b5a12e0e358e28bb09354fdbd1d16cf62f9351a8282577a740931e5a17422b7129a46fa285b0eca626da04e47b269125e4fc79e29b9e444e4fc2f48d98196a705ec8c2a25ce0a0e1a25fb07ae8f2b696ce6a2de922bdbac18a560ea794c8e7e549145513440c5c648b96c812f26b1e526ade022e5768d5ab8621660bb4a8f075a1587969a251a2ee50611bc45461755a32b840f36e73a03ed0c5c9a7ce538d6c91003f901fd8e48b0d06ba38f140e1c345b6d8386c21bf9ff0e795b8a240912d8e58c81c4d9b4badb55619f5b798c31d5aef1e2f05bd56af3de38854191e649b8764bc70a3696d19c6c1508fb72b7b4332fc39c834d31101998e3af2d7f64e9ea58e6cb9a68af99ee9cfa942c98deacf3ae2c841fab8c3f7615bbd3d3033adad3586e24748e75b9bfd5a8d982ae6cb8860e5f91eac09e97c0fccf8f7d7318cddab3c9fe338cedadb94adadae076371da313d9bd8da115bad9ecd178784f403fbb8d6faf78baea8b556112cd93f7bc491c3e6e8fef800d1f66ab93157cffda21ff8cfbf46cc16e0cfbf5557b55c86e18cebb7f2f4b2796979d5b03c29f4e2f2eaeaa4900be33094c9aeae6454611414549e2194ec32e59897ed63f5e4190b87c0c9f3ad9bf941f864e3d8ae46e29a2deccff9d6d69c67edf53ed07e1fe87520ac7aded761d88f779d87b99fd88dc733e895a6965fdf7aae175b42fa1e972785e0582919240e601ad92f21da0f4ba407841916823855d87fd13018f5ed0a2e47cefa6198035a0b280e358066f03bd35c024d6262aff0cbcbcbcb2bb74c089727795c6dd4fd1e8009af3cc9eb72a3fe10cbc297795cff41e5feab12a3075b82c4a269f43d508afc7d08e5495e184285503fff4520e3307bef71810fc6c632fc193f0e64fc74f6793f6bfe7064fcf43b11ac73084a9717c7cb93bc3b1d3ed10f3c371f53531f5af6f4c0099f72bfc73555f48b4e1e577b5c1e579e2b2e47f53d5088014918255d6d6a681206890db344f47ca040d3a6c70a4880a1c10a12fc2507219562c9b261c458e7a1490ac90f4e8ae4599226eb059cc525005e8f16b2c028a1e1d683114976e63cd9d266abc987100c110dfc4b094ec00245c6cc52162d1ac832670839533600e921ab2b28cb8821365490609119e2081582e0833b1c6686eeead04d6982e1cd983234a8253534753514116aa3c30a0c6762c05244eb871f6cb09beb04c651c9a262b3b2ae781e0fcb5e1635c744ad69a18725b0bd93ab439c8724bc79dea2dcd85113e41665fb7e68dd89aae11a6e513184b869308e4aaeb99c3ee4727e51261a1585875c522c4a63b9a475f264c1092ff050e4842a208a90e5cc023cf0f045c64627cb0eb29c5dd38b36e5a65026b8ea618d5498206c90204b5aa504e64c0e61725092041eb2a457d496fb27f58a2ae279a2a2fa298d4a85dc4f6b5154723fa685b2306a299733a6a32f970bc25928b9e0fa0431e951075eb5d73fb8a08c8ee7254f892c2f71ec4f9e37255a50b24230cf9b922db93ce2b4429ce74d89162b205558f3bc290977aa68343286704e0afe583b5e114f15d45a285805461c39c81eaf4c24f6107943bac8020c4997947025a921ca0f1b7850dda082b8044b114aac1047182173c12a7a5043d611f2e3c02a22255952457e18aca2076dae92905fc7e60a49140face2c423c6c9870face2afa121c1058255c4f16ec28c4142e6e8400a9337647d1771d02a7bc81c424ec83a5671b699227303e9e23cc387ecbaca6d93c366863fd6d24f1ac20409d245a12f9ec2378b4c784ae9acc0378b64619d481356717c30bcf2bbbbbb5bfc7ec2400b83d5469af393cdffa2598afe81894f2416cd8e58b878e11ffb212c414aa97ff8b63db7d7b8bbf79af995958291dc5f6b38ccf596bb7b9f71776793e97b7f95c9929bcd9adb3668a6b59baa7177ef347da6c8ddddf61aec3277f7dabde6a8d5f4dd127277afb567b3aa2685bb7bafa9ad66acdd5beeeeed6a6ceee349aa6d50dc902631406d8d1d420088fcc81ad1502eca55c51851e14cd75592a5aead7b77d8b103891db433b5d1d446238a192c7975d9410f97958fd6e3577d45cb097ee52fc69b5a872b4bde44bd6a0a4580502fad9f2658424c2d281be630416d592e5eba64fa5bf78a52d9a6dc2b17404d595068b840536bb5f6d6f432bdc4b8baf038d328501a8d8287c9327306fb96579b6ec0fcf06a3ad8afd486f0341a6d87d90563e468997179936b0b3b1afb362bf603cc9bac2da2223146542012ea406acc1ca1da686ca09c2c4b6c5b4e69341acd86a7e1308d46b3c1a1a1c1a2c4960e7068b000cf503953054c4323058a14f45ca191024d37ad891ac9469db59a66ebbbc91095e9d6168d231354ce54399211e00c15343464366e48a3d16c5c4ae909b037c579c2e8f3f89ec26034edea3e615dc708e8f0517105c19e799d6e6bad3ee703aab3c59216518f6d8f326ec6e4fedaa006627996716366aa825f6e51b6b2509e37286432fe69e48da58d9b61de738f394f9c81df01337f9c58ce5aee0adf13cb17991361ef8936ee0cf0699e30ef71f93d6c2c218324924822cfe0667ca38d9bb9b77173799ffb8f76e20cefbd710637ce180ac1bee7bde84e4747fd062cd8a7a4678c952d3b33b0214296321ac2dc1a68c0e184d7e4c1973759a4aa7e90f3dda0e050b10679dea054650cf2bc411942e79b4562e8d8c8696248481f02971e2141043d739cab38690dd55126a842da54473412ed17ed6e6d7094f67ddc57d6b35a024a581211856135f2cdf76c82294c1aead74176ef7fc393867a94c134dda8c674a34efcbeeb1e7c11ba07471c56baeb5184eebfce1bbbef460ae74a9d15962cd5a0d1c82337f2cf72482b27f072fd164f40738b267684e5f4aae149267a84e5e4ba4302976588d033b7d1a61a3720c03d09e687341a2dcf11808e08cb39a96c9587e18863322824c9fdb5311e5a14801629b207b964f1c48c93dc2ff392fb7faa4dee9f49e5a672a3f446f6848a05c6a187f99c429ce7ed49d47d2ae2f9f0c449c8931e2c58272d38d2446a4eb6a46040d59c80410283c8573f97430d6278844130805161900a638240f243103f383378be38356198a70d4f1700f2b47989f1e19b5e6b7577ff5ac770d6fecf80ced93da1edf572cee1ee67f9fb92b6e28e72453ebbeacd5a6bbd6dedd0eeee76f739e79cb367cf9e4a476ee4ee2ef3ae2fab5cc7e3526b6badb55a7707359812d23ae79c47d36badb5d65a5ff86691f7bc6f6bad0e54e79cd77ed9596be79c9f091026fb89812168ad6da439a7b576cee9c5c039a7d2911bcd5a6badb53ad80e8bddaf97bb2f7323ea312853535353754a9d9a9a9a9a9aaab656d529766aca4ad514a787b6577bb98e3b0205d5242aaaf32e65a2d126cf121a43642605dd42b7d4f0c2f1f58155045c344680a90c1b074680f9d14cd6b0f901c502c16f059a456b3d6bad36c2a21f501a6855ee2e14cb663bd22d20a01081185a93fecca25bda684603dd92fbc10f73b07fee5aaeeb2e08ecd5824ca9158a38746add9c38652b00aa2b5aa10db72654f01686024391a64eb6b53c867e56b6d9bec5d6d645c98e14a6ccf0d5c47e8c8aedbffd91ad182bd9da0f2d8c277ddef440a74a9e1a485b6bad56c2f2bf47f6be3199cafdd5719422fb73866cbf36528a6c97ccc9f61b06c3566b2d9633d93e088d1466fb31ec47a0adb5d6eb2f6102666886b0735965a0a010fd233ace82ae42daa7962d6dcab628dba750f4482345090d11d6a71f444358e2fc9884b75fd6ce223bce0899640ad6304e58d64a4713b08d9bc12c3a9618a45f3872fdd4d7d41372c212cc7e1fcf24fc378c6151e456d442a4b296762884fbdc73633914255f2a3b9a209465cea6bb6bb750cf6c9d301b9ddba5b27e16cd2ea83c8dfcfdd53cecc554e1bf35a7077481205d3d9b59b93efdc4dc61176bd4652dd47d7d163349368b665299028b9c78c531ec9950cfe6d79a95ddfbe2a918dbda359deedeffa2a56cb5f6defbd55a6bab15e2388ebb1978f7782679df8d0151fe58ca7361c5097bd2e8c06449149b0e26a0101182c4ca8e94145b0bd9412273ea64b913654c9025283e6dea7c41e1863e3308b1e4137380012039c245cfad6a4a4b14e72427851a6a538228f3e4858f06515ae043844a1d3c559e95075c886386ce55d50d743c480a676a75c0703112857be8e084291f6c52b093664d5d81050b34ac19b21404535554b74586ec8fa36e0f069059a2a40f973c607c4c07040a47682c5c69e2c5737292fdb1147744922f4b8931437a2011030f5a5ab54d100e44a4e0d4c34a1e1fa2ee157f2c051a996988c07326c994141a6e3d47470a39ac81a384cf0a397459d259b5487244952c5053a2a4c123812878d23819b161091fcb030664981421a4c89a1b93630972d282aa3e5235da90280f4f0786d0010995a53a5288a8674020074d9f21564a86ac89fa9efcb1d40e2b40e552d641a63bac402bcab4d68e5c64eec7dc0d8a08713bb076e4f18fc84e0365b29e296d60242c65d45fc78f3368b0981903430d07b20c61e893fd6b11d98508224b192f6a92c8f142c240000ee1cd7b32b54bc6b80993a429062c575e90220fe8700493275b98a2be6aa62f3c79f8a55f50f3421f186cc8fdfe5a987e423138c50b564e1cf182927ca2ca903f2b33ecd39f2dacb8c154d14f6bb93f057d23b21630c3df4729f7ed58933ab0c51081c651b7db0d94584071df60b6987c961290fb8e4398e4e0a92663841731aae83246e87fd11f03ca53c1feec5a7bce19a5b368b6a0426349c3bebbbbfb84bd7d9818f6accabe3a5bfcdc0a838d313e3055d4e8a40350dd606a526bad55b9c2bacd084450b970fe2e581bc9849fb78133a780264c96f8125f9a28815d94b8458d04f4f36729c21731f61a35054c04df45a06f31f60e830164c3661028a6e40d83011b87204033ec1d4033ec03313c29451bf96c5609cbe955a391beeebb231573c5cfbd3f2309464e3868975cbdffbe7e0d124cb051c2fe036163d919f63fdf6219863d74902a087a16ac20e87d5072ba51f7f7b01272340056020cc6e77d6fc373f7d89358b08212ef839225be8e4332823e68c441c9a0d09330598f54cc15f5b915b9a6982a6af5b21df154b115de68a412d7b0d1c2cb3548bce146f54b982a6a4c151c2009c5a15a6b2dbcc1a757afee7d7d6aea3ebffa9c1f9b3972ec69ec5ff48c7d1563e3f7ac9d163ac9f3668455aeb99b684de91214d9cb542c813a80cb3317738e1ed5b3d88cc56ccc4e2b2d51575697524a4570f7d8777737adbbbb5b29971db394d6148bc5622258b5c9ad94e7f42a9ee44dfe3455b437b1109694468b817798d026f48ea9a28946699dd4016d6aaba658564d5aa2aeac6a6d6a8f6a03e47eaf3255b45b59b7eaa4035069a935d21cb3d51e95bb3d2bb79bc9ed6c727b9cdc6f27f5a8462abd4aee261dc57995d9a2c9932853f7534a9b2ada00533628222ca7191270f7fd1c10818dc671efd723a5167a6a1f167b2a964d9b352a558402d991296d168a33ec3215124b8873ceefa9088b4d3cc5ef673a97dd7249e010038ddf3f2367ee0913c1ca101e75e4f0276c041c3ac8f03978eafea6f57bfd340679402ab45a664a57a6fff589329e956999295a7289cb4c999281f22c33252a9799e264ffc6ed7b2b6dbab5bf40cfa9bbfb8650834b328a4ed11d5ad1b3dfe1dafda52f44d065738f24f4cc5170fbde7a6bdf68a4721291b9707840720966a763f7df776729eafcdbddb34512a60affd93467520736282d55d995b6341413c85544562e295511585758f42a7195f30beb81a2542b09371a69de5cc092fd715014cc16d666123c49461bf98b305578368095d0bfa44a409a660b8a8b50a94c5100913e5064c10abef741c9efbffb13fbb1ecbc5abbbb69d75a6b77d7172e76b436fe86756ddbf6da0db6c2068952d0282a896acfe8ec19ee1242542b0e4d30516fb0c849a6880c55e4478fc0d1a257ba507991a16c4f5886637c18a165412b521580b8b922eb05adb8002275b8c82a8e58c88f03ed0a22c2be61d1ca65512e5ddcaa3ce5fed95137bd9fa110702e73647f4a99e4c1d244d617947648f122ef5cc143233b8d9a2d4d138c0b2dd4f6f488dad3a60e549257932bf2e3c0168980902ee2a05d6a4f4ec81c778bbb787674d808b9e2f261e07befbfd1fbf9569aac44755df73a32c61dc6dc1791589ce4bdd77a4d04b54adba12b9720cccb4c532ea76d87ad30a9c96babdbc95e279760ad2416e73492c2f50c8f325a9c6f080338689d2bd2fbee6dd0ac8121fa28b0481c28b0c8efbba71c3c859f272067cb072f5547ba4ce9980109255439c06083172672b6c04e9218fa3051f2c38b040188ed0ad51e3a3fd821fbadb6f22ccf9b150bf966f595e7cdaaeb66b52387b305ed6cb952c77f781c8a31337e1d798a252ec16ccb1bb92bbc5529225ff7e7441d998a363cdf91bea12ba657b1ba93cfabedee765c9c22b06b43d51a273007219f97270f0b486725087602c555399d70ab684e564fed7a721bd410e9baaeeba4d832c7711c77b99b94accc3d911cc771dcb5a15e2b1e55d18b62c87e86803c6f527ae49be74d0a975c1ed9c21df3840f5896e8d01a0a539e1b6a53cb4d13216c34d2b1dcaef4089cb5a864edf814b564664c0400000208f3150000200c0a8703e2803016a792aaba0714800d6e883a72543298c8825190e2208a611808629021c000409031c010e5d4dc0d706260ff91457b5f01353193402f72bab5eb96235f5f397a294e112b7ac4b82985396245f84e0c24aa7e109a93b73c63d6b489fee112f7931643ce8c30a31377d1d37cda4748603df18c3b6247653ab958487a9173ecffd586fea4b6d412a877390f3a96d40f7a847cede324f69557ece127f5f96d9301d9fba4a83a3749dc7338c596ee5f2ce49e5262a6c093b33f7dc3ce808f4efb0889bda4c53f792f12f83143de4b10a4ed154e9c88fdd7cad33f4e42f691a3ffb800206326a15f9500b2080274cfeec312a9f7ebcca958bd8fe7695eddc725f44667b1f4e882207f3f707622f65f234ffb3889dcbf9c3811eb4f945fffa084fd49c7058dd28c276ed6025530e5e9fbf4a7f2096798ba161bddf88fc4557ab614f294b2f2b2f3ef4c3c15eaefde607116ea5501357f2f7aae2846669c96c345c185a29a5e3961214689ff5c35e13631ff2fbb8514458965bdf1d8b2f3b8308c1f38276f0d7b8b05cf9722c0ea8b5102681fe1169a704abb0104bbad057c6483658634b5b6be47b280f48685a2282ca179c57d2cb6d215b34469264b6ba87b0de6a7ba830e33ee2ca624ce9886e5d27d553df0c415eb92304d9b5bc62f4c444f07967e752a884ff55013221a454f4eff02da4aa9ba7c84370a4f996112868f3eda4671c004dd4fb7f69f272d25c214ce3d254001611877a5d9eeea29191994f42805f3c1eaca5d991e392105d2555e6479ecafaf302535071130ce619a59049bf1b6e4f6aef6f6da6a5942468acfa81e30b37052d5955966906e46504ecc2de1a0b1a0749db70ee129a645203ede094b64ef7e5a2321b3496cddc657b5221ebb1e49808a15c43c0312bc214799920bbb27aa906231adae80686041dd6e85cb8c0a04d39872fa33e6f8e8e9a691acfca024e1f9a78223e0eb119870a8ac3b5d7566e6e42bf7286871696b852a230b4d3b7b5663951de0a2283f79bb875139b8fce6919189c02523a9de9235dd02a39269afc5a58a1eb46f02dbd55ae30ebb3367bf5c78dcc217c98b8781963a8b59895fa556b79bbb8e734f48ab2bf5e12fb6ebf34d3de28d3fa53ffbd4089253ad94eb20d25e350887cb8e08c2c7785cd5fada830a2de069bdfde38cffbc7fff618bff057ffc5fa46afa3a9ae6bf198295d5cb0c63683410168ac14287d894195e8106468ddf256181092206e6e017e951178ff5691e9191633e31e6a18161172af2423cdf315a1d4b7c6922d331332079c2c04cd0154cb14943f3ee18988b50604869a570f987d469e92e8be3afe175d6f241df5d37694037a8b9ca764199567cf50ba0fcb55c2f7041586c1b41c0c218a4c2f0a7d276111a6070358eded57b22f90a43c5749ae44d6c508b9be3b011262207a5b039e1de50ada9b8ed35d8c39790db7206e4920fe9214c2c04603efe1ec5c6ba3b54dc7c3ca4d5d87d4d7053515a701d16dec6abcef9556812bc73de79c349883b04e66b01e7a16080b41ae985598c39e3f053fbd6dd30283d77f54ccf9910246215a3631ccb97199a1bdab1be00e8493ff491f6711c633acb037693873ab10708911fe71135dd1472542d2590eb7257bc5dfaa1d4c9a1cc447d525912a06c08f24392d90d648ea8b0dea3f424303278d842d5a8d2e734e1a4610f2c267a0a4257080d297db59f4b9f2cfc44f70138df5f3dd57010498f86cfc9b92eb4f398cb161e11333047502329648e4441636173301411498c9d31633d87fbef2e095e0ccde53b9b91641861502688d790116f5e656c483a859bbb6e8fe5c0099540b4bdd1499b71cc5a82147be4c9379300aec1b336a988800cae1da75f411c226cebebd9b5ab400be7ec19112e22fd4b47c7e91e4f932bacfedb775eeeaea29cf80a8e74a7567adfb2ee552165eda125b5058cb59091ad4c324f6035c6de88c1de8fa94d72080a41629319739e334e6d2d6ebbcfa8d5058bf727c0b9da34c24c30f0230c0b0d8eaab344b3892606778977e5feb0ffd6b4c500e8578c3ddbbb0eb1b6d3c881087b93103a7bf6772a5a66e96a920deddb0ab5a5fa0aa15184dd09dc4b7632ea029cb928a765c737a9b9d3d4b22151a896bd15283c28161039e3720aaeec1308f06b602b390f98532a3c18675545e0f7a95681bd0d2eb3088f8f4420730e5dbc0534b14dce2db93bc648f4dae2cc34ded484d230ab1666ec813264995cb802c24ddda0e081651158e5c6ee28492286508dbddc4e7dd9b7b0f5efefcf113995be1ab8ed9f89ed3ca03775a2211190624b15e3b08ec7d407a54b8695d6c9f8940d4a1c90c0aee91248aa53b14d6c8fe5d7bfc781ab359b29693a40689c71f565f602d5cc60a472bf099559c458bdfe4f7d223641471aae71030e2047c3d00ecb139162fdb66c9abfe19d4bf28f974e6cb841908abdfb42d4a1fd110ad2364411ce60529037fc6c18771b25d4d2e6e354b8561a25f55450964b587232b2128db198119ea2095159ac520a4c14f7212b14b3a1ea1c2262fb18fa5880d9f9971585543d9e1688dac03e4eb66687ce09f397a049426c7f844682ebb3096021e6542541a47ec3999473c463c5a6f2d92cdfcd04c87171e692808504fa1a5fc1b0f89674318a97e13e5bddae94ba3ed93db1651da17b7cecc691c6c1a9128411533e6aaecf69f93a820fa29a7270103145c128a114809765c8ffeda6b2bef4c1453d0ef9b7c0d4548a621013a87797c5676426a0f71c9f0db3e2540d4c730b8abbd97dc03dd2a02930a52a199f40ffff8470048013b64245e629b50b80018878e6effe673ea745c68336e7e202157c7826075b0080bd3874a24c61bec107f218e630743960773a53d676cae0dd7aad12d574c592883492618466180a6afd54045759f386bfb1ac802f8fd2d943478bee47568cace032656645299227b482d91561364095a124f4a83cc0bfae7bd60655768ca744d09fe8f9a9604ea9aa266757e3351c5ba1a1b655559ce7e34aadec251a4ba2c0476b9d4410c986a0f44100ff5b5eca05245afcc5f74cc3dfb28309fe2f164ce35c8d2fea4b497f098f83cc6bec0b459581be27db0a297516a498f6a82d3ce52633beaf8a5f739c9489fc8f733529a8c90fcc042d7bb2c38aff73f6439b5299d4ddc07d9ff94dea18b100095447ce46cbc1ba6c0084f2f09eac00fc807a81bc133ebbb96ab42f79107cc77fbff474d0104fd8564704cc6deb311d351bfb6232564028b8737997fbfb56449d0e984207b58d9347fab5daeac6dd87dc0e9d00057afe654990dcd482646609139915492230dbe39d6de53096f2a6118347633d85d3f26d79daeaa5d78ad596997d5bde0a25e918316799914ff6796ce01fe6f0a275f004edd4a241dc80af1ed34fc4c2561bfe867ac8ab8f4654ca9171c97dbaad7ea293ac4be6893b3ff25eab397956ec1627c07f0266051c74402b6b8e77977d680db5c6d371c9414d3ca47692f002ab27533fd4f210f601a38c0334bd1a803b615767bda68b36523fb2dd1d322285202360b99f6ffc2ffbaa79f403cc06c34a8a8fe22b5b03dbaaef150237026a1abb2aa6e12fd619d76636d5a5c982a5b0d4846059b8bde93c63a399d91eaac6b142f7de254233a886d46d1942bec80142b3a74851a366e40d0afd1524e4f8d2e8d8b7f247f22bb34d771b1f548be48e5baf06d8233895cd3757298a8c19d15fcdfe11cf996fd31eaf325c4c0c539c0a4a595bc941439923fca75991ccd77c0f7f012247d36962c55f5145a53fac608dd88397d51176d92ad534467f4285a13c0ef927eca7b2cd63c1e1f83eb2dabb2308efbd6fc2021b2c2a326fa4bbf7b5ec6d7f1db6430162d7cff8d5d076572f9d5a5d19e53e257540657d985efab09535477f9979870d2a4c6a3b2238c5fc3975bea87ec92808f02eac3e97f3965b3675c50a80684e9421377b1f13d20e555c403900d9d23fa9f980b4e80a96386d21b3c4c8761eaac75913acce754afa2036e9b309a1822ba3e814219229fada09d2cddca00f8116c2abd3a4eb71d60df75c16bbe2ad0ce24ca1420da8020b3ef8bdaca7a6208944c0de4878fea36375cc8b3b091775778f6bb9552e41bc2d33950059bf7a6d3955684262af3b59ca482bcc373718c0b0ff4794b67071f58ea784c207749aa69969a92dfe67061ae67e70d41f193ea35036c6a819e7bac0b1d497de70ec538b4b951be18c2097b169a46e2f68646bd55af3020445321ad404297115bdc8687cd1b48312234ddee4644c43ceb5676cf218b7775ce820042eb6738cdc0092127c9573d12021c5b239ebf423a4369cb37ce538a26d8e97e30a1d57136736a2c1ca3c988e90305ab881baa9fa11e1a3310e1ef92b8a81f3fb3b9023ceafdeefcaa6076e9b0019589638d0c00b9ccb6c6f037f0788ff3808044f1aedea9dd52e5d36c1eed304e59308d2c92c9c0e71a24081f23fd49e452afd583f73f4252447f4cd4d270b5983f5347c4113a35e8e25935031780a05a04bbc897b92f99047aeaf846565bce821137e6e9843267f189704a2ebe197f74c13856b80babe4456e3eb0bfe32b789b80eec042ee18ad9af05c10d0a51d31dc5a825812465952c457bf4bfea39972162261836c588f773815d8649cd1a4ee61b8011c5f2a258a997a1637b1ffff10c8f97c15645b8fa3383999edd4aaa9762afeac55e2d7aca666794deb1f96da447089d3a22069dcc4d286239755b2e97773400934f887c04c54e062c2c030b21045ddab9ab5a836272a6d032952865eeb07a4e61e84ad88f93213d7aacd2841e2c548aa0bd453b5018bff23caf2ba531505dbc4389de4dacc0a2a503fc152d4c5decf8d4a3294fb6b074dce12585d14b4b4474646c48db0e571e5600a233e7977765aa7adc8c9380d3b491911f1cd4d2b88c417d34f02cdb9d7c2b7eb1068f91c56dc51e56e0bf13c5dda27db00207903f9f4a7035bf6c08eb150a9c9c7e419678efbdeef0c79e1e0c536600c5f7fc1c426cd011cff77d199ce9aee8e0fcb8cf22393c98811ff284e07ddf41c36ef582f8303314bdd3c1ea91f08e06a005b48a23498a68b01537cf2771d51459d15cfccc7edf08e3a4e6a31957ea51ba1717fd3dffe3a28b2c11529cf386bed7aa2581ccbb5f155900f9fab6dd4c83b3bca7d0c30e21ed08c2ecd1309194ff02a0afb872371aed068a9178ac0633fa0bcb82145677b56203d425208f250776404a6f1c7b0b13ebd14c3ea5427e8bd3d9a6138c7152a19bc21fe6deee087c84fb7b9d962d8d3e467cd8897aeaa85380f4dc9a274efb50ef97f2f6a6be56a25b4cbfb17e61bcd7bd5ed8bce7e172b0cd0373881041a1119d5c9774ec4ceb4f2783e494ee2b4c89ee29794bca175dd603a1410d811b0cdad5715264c87a0fab6fd15c5a404deb9560c5bfc16eaf7ff0aedc2489d4ce11da09bd98e080517ed66b5d61a741b621e539a0977706fae7ca22f46b5782043eec65b9e05f01114111721865721e817e303a4bc7ac942ac72f2e384e582f8dfb3100630b35f435b06fdb1f4ae58491a4c8f99c58f3f4d5f6b93ee538d93671b3c1befc824f943fbdf056b13465b39fc1f032d2880bd6bc9dc708018b181211732a9a5c62ad70fe1628db9c9d7a7a3962f831605d2311ef627a801ba54cbfb288a396f30abd0dcdbe313ae52d45d8db49450c0cc0b9081ae93a11608962dfb1a0f05525e9628937eb0ddee1701cbb49ea6d0b1ab08fd9a9822e835b34af400d504c9e928c86c68da3066fe5584732f0412055d1cf256a63f14ea3be339c621876f7c80b10be7a078d26b2d6ebe5ad83f7df04e1cc8e2921b02583c2767620b55c66c98b7163ecde3a8adb874f77ef101341b4e3117623de8166aeeb81a2551988b5a20e206bbbb253dc55ddaa1349aeafe38e4e12d305d7aa8ac8102e621b2acf717669091d04d95e2e2687b6f1f6724b4b175460bf608bc5e18efe5e2c1a46eabaa5993d69444b42f11ae0702b0d0cfb5cca75cff19feafa13d426bcc614392d2244691af5526a0572b173911403937a15adc1e802aff7231859947050e48ab06bcd8dc88370ce78f43bb1cc1a8bfd8d66ac220544ea29f50d935d2e2f13a523130ddbdd20c9cd2457d50411a594333ab6f171b6fd1a6da081b1a1022ca590107d3d71f02ec1f128f7c6c80e6e4219363ef0340c1c01f1781138eb342899aa4a0a7bc79bc4179524a19b5910fdfc0e97f82340fc1449290664247a63a41b877fe80b9ad748d15d2ee0d68969b69ee7cbcfb989e96473c2b38f33b92a497f8373600c729e0f46f00945fd2e89ba1531a4963db7f3629dcc7f3abfef5fd9a6d4ffd4fd4e06f8ab1740f8cfab4d390e3fccf8efea50fea9d5095e8097e2f066beebf13d6fe2eef3521ead22fc487605109ad594956e4f7ac29ea8649644a24b56a4594bb8958bd68b19e320fc1f2332f33c544bf30b791998b412547500c1322062a5b7b85755ee23996b9d1cb64df4690e2b27fcda198758d64a9691c3d41d88f4c4b29412a2c79eaaea92dbbb19b88aab40670e176cf15f4430611286f66e00a399f694a965d43297121009e46b951bbb8884334af756771b775702b1c6db2567eaba538ad84decac4e4021953b3771eb32ed6e1fb888b492af55b8aac480f44f94028aa2246d09b77af9dd25f7ba58722d8b71a02c92b9fcc845d1fb5096edc932416d4ce73fe38e5ab1df440bd291e7f8e1da84b627922eabe4b4aa8540a995bf202fd2577764338abc89f522548b0b3d55b0bd8675c62194896225e3160504f1def1701954f67fb2dcd7ba4defb9b1e706b7cfa5267f546a62cb3c3c02216d1d3e7a63b4c604bd85c8b285698f643eb3f312f7f7796e6d0b185bc336ddae5aa45d0a3d66b2b9840b7d34c840f0a32c7bf733da87f0304adbf78445c61d476699f4a8f4165a0b0acbb6ad3970622528de8364a4e5b7c48c41eb452470bf72aba91de15ffad2b8e444dcc07594e94d90d55ba4c95a8c9db74eef8e8a5b764da7ebb8a910cc5955b93bb29a7ec2c7b34bc0d951b8f2475f8a33c6406b54db773e32774c1d2b7d2d4271c1581ba57c74f6d9f4d14899f1267884ada9c662e5195b8051c9a3a00505d09981d4947b892da7d42a9351c3de283e64d455956ed8fec1de09737293e790f9ac85846fd674be46d0560bf069359336283ab31494b922e58030ad4d2aa0fc751fde9c1c5afb91c2477145d44595ae1503cec8f6e2130816ee626ca53a5827fe4c49ce089e07f2c2d26d7d254ed6748c377c70169506ae8e6030bd04060f6201f307619290c67c71056d84a4ab7b07f80942c5ca85c43beb94a7f51dd03a4d13d24772c00868bb3b90c75b4daa61112a182aecc2ae4f63150074baf3b7c9aafc3507d845111644f0700718220a1028f708d4d947ffda1af51dc12a0b497359d95fc33d5b213fd623049973be0d3dc02256eaefe5fc4c946597417a0403e5017e54294342f0ad210c711c4097e15aa59a99fd56e26dd130945340ebe397ade5f1171ed7f10e86e734f2c60cf9fdf7de45e1b0c65b3ea8bb2e53ce8508546f2c32538065a7dc68851ae68e2ea2b20668adc945a403ad1d6a21ab2aba6ba8980e76a86b250b531db5fb4b6a40dae8cd585ca9eb2b88fdd95296e2b02ff5fee79f1f558aee4050aed2830e5588a1628e5fabae61e9097e6de01a211e911ee6f01d8acb6e1f9d30c65bab127cc3609c25d7ca25474de1ce796d9734e221a564aed581a8c5f37e9b3608afc6608053a077ba96a59bb5d0021aabac3a2457a741a88d9e0e5ac9af6b297c3e90ad1031a17bf44eea3a040548359b230c4067364969e88e0c284d60d470810a422290279008237a2d337ef74d99d098fce2ef3c04c2e589c056fd6abfbeda44242399835e8cbf0b4d3742337c542f289ddf4f93c4e6b6b9f25fc59be0f9d2c5ac6ed7aca79ffa9f5f04d3fde83b72807b63700fa7f17bbe835078edec3724df0e3c2998b6a3ee8c9323529b4cfabc9b47c288bc1585933152cc3196273747b9ce6408f43ce3e91352ddaca186e7955d2ed0afa0c443e15a888c3d032d627e6b8078aac7777ccdd55248452b9c9f50b5b03bbccc3cd02cc2deacf20929b235e11c27e6562d4b9d8393140e837a06916caf876c464a44c6a43f3a506b5e18ded26995dc95483d60ac94a87c1196d7644e3079dfe3d927a3512ca3fd70a5b2d292a70552cc5b8d4111dada812e9c205fc13467e0e9961084e10bbb16328113e2e519c68dc9c3e5bd3c45d5e4da7a80f6ad432be1486ca5af16522e4876483b65b57a4cf7a93320d9fcc512015c5d89386018a4f66e6328c17918e09ade1be41b10b47eef91759db823609a6e92ccd37e7b95591215b4b17101546cb63cabdbff11e7786d3210c763c2efb80145b0765463f46807bc1612d8a99a8755b4fb54b26bc70323631570cbfc9aec314fed8f55f4263db481f3ab79349b8a94068b821e27f2c762a8e61a693f1b101b417726ea68bb218e66eb6c2c106d382e58c7e78f30167e96e5029388232956815d44797f19eb690bb07932721751a41ea49e9391561f0f2368742964d7d0d5144b3a6b3a7efce558865ec294b57e1f8009c4b0c9e27847bce12f763300c60ee428ebba9727921edd9958c2edfcb54c51d010b25779ec3226c352267ea47c460636ffcd8d62ce21b08eca8603d179b50c6d3b021f28934497f8cdc6a9734a2bb1771e99ffa270d499738f4794ae1b301d680f669eb4dc7b18d9db3987e7b6b2d24838aa84db0b0ef488f724249d2c1f2087c1eff68b69349909ae74a1f0ac010b0b002dfcd5550dca050873620c2faf1193a8983d4151bc08886a1b776f3bd4d18e451b6e8863847d95cce003f3ba8df3d933fb9743fe02a69e0f2d171d530c0404f0c9ca3d44646708255cbcad64e0ab3c1d822121735b2a87ffa17e29d18b37cc3a226af691bee67235d981802e536077c87c573f1db45e0509140e9d1f62dcadc364f01798e484f555f86abda2c29704072943e9c212f7d0929462bacfbd4b2cc2ee37508c0615490ef8f408e705f3de00d2206c7b7aa815edd6c58ac5c2e564063049c1f82fd9a9553a07c7be444c030f445fc701c33e5b594408b7ee3e7da152baac3d04f13a3f9026dbaac3576541b185998c67a7e8f594f7d39ae0e94bcd6dd0f7721f88f3ccfc5083409b058c92c3984b5be2b408801574322666288a34ae269e104e3f8cf555ec08271b1bd5b35a27019b13c4cf8d4f361063989c1934c07e5d9a70de5393c6e408e62a9e0b0225eaba0ad49149b3e9a50668b408f7156568e4446994cac90fbdcce2b0c35759709644eec8526f3f0d2d0351f4c640b319379a5dbca78ecda153ad7f2047b3ac1f3cd9d8985fc71e1433839462fd7fee7ba34f04c3ad35ef71207bfe3396c67bf28a876980441a7b906980a6cf29eb0ed23041d0b64ff51dc543d44ba34c5ee73c858792315c542d8a55887234c594d35e341a21c85e5d34d6a629528852c3e2e50b05008dbb44f39394898b161dc72a6dd5ef020817cb9ecf811d1e743ee521f9cdaab7c8ac822eeff5df003e19e302744b79fa3d7d4f3fc11a186c2b6e79c1de282249b28f259e0f8481457836d8e3770625fabfcf4cf394f8ead59d01d7042faf3c80a840fbabf65f7dc81350fa9d8fa3ddc517c5bf8c0caf98054a54a7b85da70a14e4c10f7103834a19d9694963d9427e004788b1b344f0142dc54b95ffc7dbd304eb0184386cd80d5a468bf27c8b2d846ae5e7eb2d9f5802b94586cba55dc40e00266430c55435b8ad150464c5e0878f059b5d7919bc1e94354b62d4c5acaf5f36cbbf49064846e19c1161aa2b88d10374db65dde4e0da061f14eac6b1a6eeb3aaee45cdf9404f21e29d84bc55ac26d86115f37173ecf0534a26bcd89b5862f4882fcd12b4e2f21b0cf59b1b8237645ef8684163f8971d5ea20402629cd2b55488619ae541b9ef401106e1146d9076af9e00baf4a503319acb542d660a49d99631e58486845bc66fa585e5046f81713130b63dfadce514364abc255a71e9362402ff8b73ea0af2b2af4591d245fd77583939b2e094957108108a1e47c8d314043c0d68aff62e50d578141942d6a089b566eccbff7a36083651c792bf7d6b5e10533b9dd64e83aef1e24021944c2a4b4379dd6960695c3f2fa0025564d243b611024615a2069d68d3bb6239650debe0773597002508f7e3e69358832f4784b99ad67699768ff32c3461216f8c11e13c28104903791967cd7c41cd36a4b307388135f19ecd68630b7ae5fc1a048897ca885fe1a313fe4de14f3a67050a6b6c213dd236ea401b67279f2edbb509a106a018e4d610a0015c8ce9b10a7b87bd88fb0fd8c9ce1b6edcdbf7779c13b6332758f7f62c0e8b8645ca84e0e4779cf11b47c90ecd8c1864669e35a8b4951a87f8088c14d46d0a8a61a736b676bc7d9ff39691168fbf4bdb2d76ed900d66b6f085583a9db7eaffa83f9a858ef53897a4e98fb0274f107a1151a3c36910002dd324ea9c0929542f1af2f16779c9d1b957164db25e0163ce2c6008cd3ffb1c39a60eac7812caeccd2262f5a01af84674eb246c05356587c51e0c917b6fda2378c57a38366fe34acd711c9484090e3dc4e62b02d2c506a86c1ea371e5059431684849245a634663d7e2916d5cb18c196be35620fef886ce8aba3a8c5bc68136668216d4236dbe9d357cea77e1412e1bdc069003127afb2436908c96cad7f64b02a435b32b9c5092666942b3a190f4ed623599f30646169d219b1c0ba3303311a99ec740991b359c29bbe4ced9da9611d6be4335418e597c0f460d0ebb688e1cd80eaca8e19d05485308b5403b4f01f2e14894e444c558842deac5d014cf2f363e28d18fd82b1fd19081634e7ce84332ad0a650624812ab776968d3f2eafa0c74ba55a82cdc105294b994ea55029604f9d6a7c7835ecb650a9be61cd184bf97a051c894295aaf0e96074f7733ae4bca8b11b6a3f95beb5f8f4aa40a3c356acb66fe38f8f9d50e411656f1dd8ca9bd8da8043ef486cf31ae1ce6fd092c0f5161e2446b84773a07902575ddcb2f58b0e509cc7ecdef102d52bc3d1cf0035c626ec9bfd17d50f653e22509aa0edb5ccb7382140f624d0b98481cffab2bdd8b38c37bed88c54d91fcd63607944d9762e303df4ccab23765ade1930abbbdb911c1c6fed43cb22a541a7e2bb7c27f30ef96e440548880278398c9fd11c2a24ad2301309fc4d15e2c699b67f9ae75a834c371ad7abc88adea2e2b3929326e34f46a72f8bc34a72eef20db44b0a37ad8f4f41396be483cfb7c91d80a1feec66d11b878a4e98b90e8846f30d43f384e1df10190947d3cf57c66c00f613cd303f20c6968a4ce8ad4edd159b8b544477da2117ccc0ce2c16686404491a1c0ce065e00e27c0e43424b32c3e4c2e128ab69b53b309f4e72cc4616bbd76da5a3f78ea99e0811e0447b4b228dcbfbea3ee47e78be9fa2d958845c8da27cba46b67f94d6e2763759ea54ac94c06ba27b16ab6d24be11583a8a9efa0a4a0343a2d3b307a713460791db00827c6874107153271c42f5e05938636b4814ac0c7d008a304ca11a7fb6108f4f37e3863fb69b3a90e39e2679fe6f009a49ffe19617ec4457675b27d11a2f1bc071cb0ad81a14bd3130164a89a063fb818f2fcf218a66f2a1390f7ed5d05f275391213076274bf8b273ae67f1b47f72675c4fc57ac04cde9b6fe06ba5b5651bbccd5628eda10f262dac0e8345fe143bbfc557c4c7c03e6ef4a8875481bc6587b4d99943b0b65ebc9c222a18e809e17ca7785f67122b2b28774057308bd1eaa8052acdc4a954a9d389d488dec20f29fc5459901087a507b015d3ba534aa69551a96ca675cccfe2f95e4714dcdd864b676e41939beaa826c5338dfd55999184a52f7b3d48d10f546b72657c61b660448077e92ee72646f3a33f2aaa5b07ca8b80ef8ee6f6cc630f58cd420c38aa721f83973d19130a01d65d796ea8844ee45482e96804b10ab2049a83065fa8545e9f60a0a120c494b6d0d9829595ab1b0d5b6355c8a534f3333a40a81c48c33439279a830684dc2ccebdd80381d57d35907515735d13c4025b9d807eadec8170fdcc12407a58a14102e6babb6da44527a4f83d6a2c60a2dcced62254b80fec2200b48e6b136edca9102bcb75782b72f750d100179facc9d89ff869bb4616876c5d02c12c0798050c821665d23a6094266a1310411072b90ed2a9c74dfad18d44db88fec2b81859c2698e6d8ff0ae08a2703494ee48a672862b2af3e2c5a9a478c8978aa5746fffee24e3b495edd86f49fbee27e190e32eaebfb9fa20914d5963448dfb0ed75e5954039cdfda3f2d777f14face466d2a52bda32238862e830e00726e46f9a922e09c47ed18c9ac42db1ac1917ce5000886f53da6a09b9b49212f050543da6e73814213f53207b3a8a2f827e67b9d841fe64f7878f2d4b84cde1a7aae5b83612605bec0b9a9a5d7b4c258a560337a7e2b6c66b64b3b8fd997cff4b7c585c3dd114554479171838b87ebc2a0c2abdb5fb99b9ec720c27198a26dffcee1cb3212b63763332ed2d8bd485333138a36e27570c7a0d4c247e1ea8ffe0f72696d00bff2c9a9799781a9c060c22753c1ced45d4970bbfcf93fb36771e5f67bc557c0aed8151015b64904189d5132361f84387f6b9fe3f11b8758e4cd19f0182fe352f91af0ecc955cf727d71e3d5c1233c742634be5a756b0db1361735a815640a8d34872914511d28660514a19fd226aa727dae1ccc36a4e632a337d123455d2242ddfc9ce4272c9aa5b26a16652558855558685665912c8445586b5665d5ac9555b0082b3959c9f6f3a0e891083a50fd3058cf94756b55b9eeb858fd8088183b337a020620fc80b6bf1617fb59462bfcae40120d66f48ffbd7db68794af9005306874c041f556de61a31133cd4a2edd5a2e369f2e70b283d92780b523cbb476ac28301c31e4dad30a706452369c70ca455bcee55cd9cab3709d969c8e4d4947f2a7d4f9c37918afdd3ee9abd2dea98268ba0a2d164a1432a4f1b1523937cedbd6ca26a414db7e857da819cab69d849d349676227350b9730d51bce649e55add7e7531e08f087fa59a39415f32e8a680e7e05aea4bbf55969d0dfb5d80e2b95e28668cc84a522c523ac81632a1680898168ef664a1150c7e3e3a07a5d1310e0a62a4d95fd781a67079794facc8377fab8a1057f5ed7e8033255388a595df426ac8f0d20ec1960340b98a3fe1fe4e9bdf999194f0320d82a82f93e52a689cddceac55b0464526d47c199cf1290802177eeff399323fe3660a507b8c110818635a162115bdb3f0750f1b04b74877b57b25b76902f05d6b44b13790b718b3e02839709b014341b14faa859c1e2a68073cf0ac772e24c385c2c846468d4e9ea9e78cd74028f3c5470c415004d1614069d8546eb56db0c549b5d1b8cd8e2bd3137c6cc82c8e748b4e942aa5f4dea2d93fb507601e7ba29605040da08a4bd2c7f7f1d99d230d18e375aa1bc8dc014029826f01f11f8971eab3d2b43c468ee67fbbe4634601348e813357ded76c3edd87da05c8400d63424d83dd190e0a085300cb9fd856812d2e33ba30f9d8ad06c40115ab22259cec048904f0b125988e574a0c6de06cda6595e864bc0c68836a3aa81bc4220c3c9d2bce17b64a9da6e3231b81e9e069f4741e304e6010bf4210c00d74adffdb43dc0c5e3a04d49a8000dc8a1d12db83a25423c27cdaf74920b57946ba092e931d1683ca2609fb5ffb641ec17a6a353dceaa78549a1d8058fc56e383b8068dddd4d20a6a351b3fe072288bf12566bcc86976e1e3519a9496e29a526a3bfeecf3c84821244600ec8d76f04f06329d62489948f20722494dec29a1bd4aeeeb34550d91717fc2014fb1804222e95f7892d7e3b36c1da9c3c95841460d0e0319bf9f8d8dc737724e8e241d848dcca03fda06f84135539f33928490aa7efcd4ba2a3d456c314c039a759c38c019c739cfdf17b31f4f3f901712a871cda2229ef2406d7ee6569bdabc1a7edf4f80e88c138e6b9f34f08afda467bd780ab8f00a95cb42dcb54c6993b08cfdc956d0dcc0f46e426773042c45fbc0f222a89aaeb9f729f360b2d8f5a7f00a15b31d2ecc6167c3bf2710032e2c486bd516bd6fdf66d8e175f8255dc29ebceef1e2f0b4f6f5d63b3ebcda02596be5260e31ded6a6ec2c1d288a74250b12fb90fd3fb137c779484eb7268af1afe045bc6a7f0c529eb505182786a2e44a7c608099513b5418364e9418bc87ddd4d7cf4c225c119b14210d9baa5bae677848136941be63a9c7021478a0a0d7b427745717262a922c60124a6ae045262b0d9570c96e46c62a04b9736c865621a1773ed5b43101a3c1ff00974630268524d185116e52248702969dfe20579c4a5f6300c6e4f74e247b7cd9e241815585a05653c10fda5465ab362c59ab9e26fd5e2a00b3a20abce27f41b2994894e69cf0931bc8cf5cb35f55bd189b211d6d5bcd9c7c1e57c0ed6968e36ee1b36ca4179abeac3d2a30c2407302592e472bdda290bb6074b39ac6ec0253e460ce9e3e939041ba1572c71a7487b699720efb0bae8b945a86327dea1dc8ce912735b71ea6aed1f18d5c50711e464fd17ac92ec738c969d87ae6a8a2ec46ca7961e000c855b34584e81e5463af3f4ecb6328e9617b08502839d8b92c080d87b6ce602b0994aacb5f5b11691dfaab00226dcba927132ae824429fd95c34ed013da54f4c6b42642db3e446ec946f8d1b12d2e6c00ea460a650f8e5a124fddbe54a415af7b77d66b01720f15d332546cd58bca89999359e95f31b28e14633cdd4305f5a565dd513363695726aeb59fb6d8c1b65dd94958df032db9f52f1a93fdc0bb28dae400298d27b398885ad9a51b5d629b4344508e05ae24a0b84ceeef2c90ad5550e59b00d3ddb9372dd2b8bce06cb056f62d283b3f9867faa0ccd56b1dc93bfa13f68d630201b9e2f7c740a2985b8b4fbc85caf6f99b00cef2f51b43685c5b4f5f7981b809f627f84b2cd5292de93a40be40f077505e0036c13d353e1dbb42bd042bf9985db89552f6644e724c6ee692c37375f4a24168d46ae71432a9eacd5f09a2d3b873af465e316c2341adf5a862a5da4a31133010971ab1efd5520fa7e1a0017e7cbcbb41a206436fcd3f789e3628d96c72dcb0246fffb65e3d8c8817538d403f84fee7871a6bc2f9b0f0d164f60e97d3da993654e2882ed35b76d7b1da6384d36b1f0a685ca9e69bb7d32e287aa6df96a7058fa846a1ad293c8a5db204bd76566ea358260a9d9627203e0c625701b75ff4f15422e2254c7da2fc6e94247a3bc7b05660f41dfe23a39468cb513bd83d4b31ef9da9d6c51f4d25d9a67b5f4cdb82f7493feb6bd10c540df3eb119304bdc5b16ddf6fd49d165cd2f945557ee93f4bd4231407a71d7c94f41d1bcf02dc371478b5ffa0b878a43834cf1d7fe148b783b4b0b06baac24b873af98d9747921fe0e944900f3e5060cb8b1ffd0d126aad74bd19601995f73012b0a8fd6c095190d21eb99f22e05cf396a6169af5faf5f503613a1191a90cde5a1d5eb31d74938b3cadb2c598d9d62098d9037af00319f3aaa5d724c8494c980def30a1b03b34030f13a818b87c3080f9366e98eeae094c475fb58cfdc7b5b05d3998e69ad369f9a3be1f9948431299d590d9802e50e52ea3f39074da5cabf27c87a473e7fc41cfc0a0658c059dc033b4f7c5147518325b1160b6013b710cd0195c0cb7024e082b882d812d409f538d9a826d24c5123c36528afbe35b5a4b7291caaf97886d60d7309bab5060bce3b18211c1414a2fc5343f4b24024ba545b1c05b15b72df389d98fc6e3b311002546ca9ff49bd534dc74ba3b07dc73187beeb8f34a49ef0a86c984e67ad53a0805bb89f9355c6cf0633ac7e44e4504dbf2a2be1a715eadbbf5db2511a28cb34d347095e23f85302c36f1ffa3dfa17e428ff49f6c6b9a9d2fe5eef7ce23697930e21939f58613128efce3fff14775c78d14e599901365df12e866e580d5966933d9042d4023870c66aa6439a71364f870889d1cedfa0fb435787d40a0b42c59ce70dc487de167feda34ebf795d6e28099f1caa5a4d46ac735a46f2a40e720386cdc64dde45c508fb06075867f3f443cb0a34e05a97b92805bd5d216e4cfbe9f877437d6c3cc83fbaa0f39a4b42776da9f2c1197c323a30d56e9efb0f4a651a90dc773a6e0b68a87b31ad347ce64e1adda2d54564de07955b8dac56bdbec7d2c00e69e01808699eb37e20bdff9374a433f72c6310bc906628a7f55a15281c79e92858610547bae175b4edfa5bec9e0e9496fd639dfa55a8bcdd3b31edb734e17b46b2b1019308cf11f7210c0d6a057ad2502c4bbf84979ecc3676a8796006e5e2226792613ad16c4198f8e490e7db63cd715775f470f32f4c3fdcee4d7e1483916048a489af240802fca246197076069886c3007e86ea18a684d60078939631148a483b29ff60bee085cdf1f837dd7607f54b3a7b6bcfd945b27231831f078f55167b83c05dc50532a0518c598d8c074f5407086a7a5296f292291555eae7f944fe816d4180db56f3c640cf901890735e81be51f6af43e1ea725089b1953049fc4860d970197b4a5968120aa5ede49b432e9e782e9220972fb13caba22a0efa66e4e2fb92a537fe4c1d20b5067b868377cc4a3ffb1a739e67aa4c5c7e5846e4610f4de5cc703b425813cb706ca16789115473b2b3f418a116f5b3e089accd8ed7bb80609378dff2866983f887d9662c8aed5cc359b4d53d5e0cdbd475453d02a1430bc71dce10926368498b136b7d3eed49ff1a9307ba1b34a552c17faca45fd6ce3e8245e023cd4d9e44c789be7895ee88ac38a196c0deb35b24f16e75ea46785f4137d3a49a69f83ece72f0458b1a322e86342bd6ec13328ad9854ed11d1189c6d3537c638db48047bdc6b49e3915b41d9e4b0f417c35bd6061acb3191cb07b96d9a3a4175ac2d367463b755cb69588194a45f10110e8a28d1dc1acb4590daa651df53ee7fd94c5f744684800e29160c8a15c712897d473fdf3868aea719c4334387d60da3624cb2b0000be220cc9b921af1a398d8087fe89c500ea4310d94dab04132dd11044e91180042aa98c8ef666c58bb8e30612301ef14424b00d0243a4a1b3af5755eb51c77731f0e0eeea3a29962777f4e14535f7a1a7db917883773b769d12a67dc7f5a082968d6ec8c3ccabf3e1e5e6c72d6d6de95383c643f3b03fe3f3d1b3fdff1e507f24fc53928f73984d3c64176a6fed794534cda6a2477a4953daad7a03b0bd388fccedd554708716091e22b625cfd358511f79c734047ffb3c5d85409301536617427d2c9fe284de94525a8e214ff0e09c9c42853ff38eebce5ca6d660c7f59e4282cfe507084b7f165a8ee96937fe139c13896c1f207bdd8e981d6b10ac191ee37fe26bccf5b9601894a24f1fcfdf851ab670bbf690540c3c483710897bfa16f1974de8c624bb650dbc443164de8e333d62afd001550a2edca75dc50c1095f7109dfac5612618b06422d39b5b37f71e8bf67af784f6154221b4b389857292214ce13c68888c42427a06559328018d7ba726ccb6a1ea3e8692bf164559d77423e78e12a311e5f6c2e2542fa9e45bf04c9670125964681b741791e881aeb16c2d4644d2c65c105ed2e4c5128d455841de464fd072134c7bdcc91beb0a9c9f1e48133712117d6b3ab02a63340c01fb14a47401a8a15a8aa0a286527a34eb9d52880296385114da50c5116994021a80176b023686943fa827325d177ab001383fe8d99801f278acd5f022ca48157fb6e4c2376c0bf7a7c91282cbcf62247029dd9d742cf3937193ab474e65d13fac34bd6fee7dd5322840f00e6b0f18e7f889807668aa78e68bfc2e776cd2e6ded48510d88128a9502fe2020f677164058214d30908634db3b07adeed1b0004c3d9ddeea1e05c98dae9a272f8450960ac2cd6600cd226d63744d2032aee2c8fed717ba313be245405d5b1bffce4bfb8d2998a0c3529c368933f0af1bc9a8abf6a9e350c3994621591e34383ceae760502151e5c4a6eed8e04f5c3a67d7ac7d2c1d703db137867a7ce908f795ae810ae7e55b79f289db12cfe5119853a5427e2156a07163c582505cfa024879ea0866e388cda5a0b2ed22229dc419cf0675bd3c8716b761f57c45c90665d6e5163a3da771ea99a0464337e649caf0a89b060dd866033f0e84370ce1ce307b0ffe811a7263b0da653264a6d87a8de247a1782e8dad6eafe8261beb112257dac393970d0a2a97c5dfab939e2c43f0776bdf6e43bad90ff7cd188f42571ce4f54e04321def431c1631bd77ec3e31061083179d750321ef0221468a6df6ad20e2587bfdf8c7ea2f13e82065c30e2131cd32a1f98773f0cd06f6d28e1f27e3b37b924115e86696066425402d2383dfbdf110274360cebcd6bd804e107dd54ba9dbdfce209637eba6c0ff0b47f68c48906baaaf1cea9efa819b0a5f4caa1eb2e4ab3fdfb6a5e945fb9b5bd852de0d305495c8a2eacfee5981d1a589891cab2865a3961811ed9331165c579e26c1ac2edf1464b63ee34fca824fc44659423482f2eb454293bfeb270dd5bd0054eb27e8fb6257879421174947ebae70426d9d4d7f16906216bff4ed5d69045f40c0ac059d35714c57a6847c4505c020499d7e99b2af48b60b4bbbbb7f68518fa631b01632392e079964ff95c59f2b52eff8478c073e9fd8ff542344172fb9c4a7338b2c4bf0a4543f6c0683f6e71a3bd1751c51069eb301f8a7be5f8c4c498344b9683e3f04b9145f285a180287fd1e9a7717b671cebb2dcd547f3c4e5c47151a6b2f9c540cdbbba991c0890027aa96270c82fcf901a66a33b76e131fdd9c37cbe35d8cd8a97f16a059f8cffd68851edc82661673d951f26150970d71f6bafc6dbf5134bddc4974d5055432435d494ce93f9783be480e7fcef2ed455eb2daf491489a54da84ed55227cf43c512062fa6b8d94bd41557f053c6b5c2c2cbc77c8850ed691f103019793d97ae2374c4230af2d19b80412c3cdbc19f3c1de91f254cce6fd881580d715352824949a91cc6264410a5145da6b738e0863b6d04838668b425b72e11382a207281acc75d0130ca7c04158e5df41bd42cc42f318a87033a9ce491f40926fba1c98b3ffebb564a10acb14ac6cf8ed0502b627fd4e5f3204a0f1678543dad9d70378ef98591dccb0a420b6d798c99d1acca4d7f77101533c5052858aee07c77d33582cd193401b15cc8aead73f90cf9863b2715fc292a134372f38906deb69bea2d588af36c13e2bd5594d18ed78c87fbb4f94f1af3e832d5342bb4eb584308dbbe412eef14921deb821acda3d9d7a03324118583b0b0dab45a0b1d214473c1684a9e5fcb2ce57701f4af09cce560b6499c94af4c614f8541ff50309081f575c4404a2444bd4b1881ff46a09b805f2b145821a227c10fe75dbd9db94112d70cb3e14d6c854d261499e18908477d99b7af1a55da726ef8951f9090cc5947c989c80a31a231840226cc0827f2996ab29aa22f59fc73ceea11eed2cf1101f8782b56c4d013b408c41eebcdd7ec81601a8d951d63fe2bbf59cda994004144cc23a984d28b8cef7cfed3c7751ce32d6ca48b95ce9f1196feaeacc19b915ab5f8b960c45ecf6dd0e58837b80263d78a6ab2aa00bef5cbc809e1fb4278a13894764d4a2dc8ac8459d259baff7e8403d01355b9d4f616afc9ce3813fe3ea9391a288e9752b8dfe92215118cae223dbfa6e935cd4ca6e836628eecd5ea9c24706fb082399becb88409d7c172ede8e5074e5cfa78ab9fa7c6707f7db6c69d8e7815573805ac21bd0a8743dd0f007bde6e7fab7f8a4685a7caba5f603dab0db13b4035344aa340e914091c185f500779c22efed705cb93202fe5cca5605e68d16ee750bfe8777c7ff098f9b778270ce008467fb7058d520c7a433afac95f739d1e307c110a7fdf19d1a0ba8ac9420edbebc9fdf4060e5d18125f57158d912f9a0d6e914642f044bb8299868be9de3df04d14430416d307041bf24b5072252f08fc8d0f45dd7010a7ae09f8f23f3e2affe39f3c44332914dbf1e8bea7d4a4d6dbcc792e3b220a17fdf39aedd750b71383aae5856c52a9018432cd15559a880d93e12903436b69cd1af00a7ed57e0f3f19522cb6f5636775fee4a1680a32632e1a750bfe9543275dbbfdbbae0568e42f448e030375c740af046ea408f7bcb82852ee77c21ad914edd38e729bd013ce1c3a4773f4b8af016ec37753ec253f9936d59eb28a900739e9a639425c8b011bb0ce0c9a0199a6845e014ebfdef6dcac4852c920f3a7f3b6a20aea23fa1d29aa53bcf9a69d475f79f08a115898badd78a224efc19183f792f60e75ac0ff7961ea7f6aba874719b555c6054ec381279be809147cef8839da7684fbc065a9f61607b20cad8ce14587608fec75d5e0b82b6fa131f4c861bf896ba900dc55c8a137985cc229d8f199a9be3a725197de1bcd1158f8b0fc4ec03b551ac902cf8ae3e4e25063abedc2a9cf863922e45586d9c3d6658d1b296e186b74e76eaf3a85dab982e870f266c23f7a3f22c2aabc49e3f3bf1fd33c2bebf10db76f3ecca3552d4b3e77a9720bffdeeed4928fe3e7cf8f9f7f9f90a46f17c2b391ce3e34b11fa1ceec4e781a62f1c3b093bf96b18e911ae083c2715d915c16d329375ab44f4d3778e6c24d0edf87daa1f20ca1becd01fceb7ac91fc09af4cbfc076f8e0ce7b42898c515031716e8a5d35670408b740dc29654f3446ee0bf197dde4a9303d6a78ba3b783eb8a0e87d10487a8ac379baaeaeb194f26636c4ea70ea37686aa376c1b0918b581682382b39b26082a329020c0c6635e1d2c0d7c80c057b400fa9b6dc86ad127b5277f26da39651a25096427f572ffa5bb1ff3f52d3016378d916ef935ea52a98453b53d9972d2051d5c04988cb08b42c3e649c1cd7d1c10f7f5e79efcb4f6b69ec02cf8a21fc7f8bfdc3c9910f96ea41442091056f5c5ac1f4951bc0b2ad2fc80565f14d262916a1c58d79087d55abf61b9ac9b0435965695f20995efbf450317d042859bf21b840e9e522a20035dca400b5abbc90c59064a8e688b54469affa062899d7ab67c68154ff8f406b38622c33312a1ffe0d77d99009db6240469d5164b7e65956dc22564e89fb88cf4cb1cd282a05f13f3523fa35b06ee879b6b898c4284f9144e862ce238eb9162ac26124c133dbf1a8fb22b97566d758f3e214299c6e2d7dd4a38d3c311f06bf2333d31b61be386dbcb3c03f3e524ad76e7bfb22be1bf56f19d77cb0e5a0d79f37bb460329ad4e66fcaf8bec80b973eb28c3d569cc518594c6bf7c2d272801bc72bf1d1208b02145313c64970a019cd27d999fca967c7aa7711e1c71f6530642cacaa06085982e919a06fb1af2bbc335b25262db643c595384a87c4ee2cef5e5b8d04fde0dd3262b347f63eec0ba4c00ffe75558a01bd1eafb40eaa8fb5e76f1bbb682bdcde41f581df5079b073aed5be5cec3166503ca682c4b29174111aab6c0b7e4a7ade59315cbce7a83881466f7adb76a1b2e8dc3755442287b9082e555b2e267595e56830990e4bf41a657d074b5918faa805ddbdb7108424eda1631d2dddf337f041fd65261170c3aea291e72c0c9583f4775ac233e2342ba893f5ba4315e03876a0b360f35da77545ddfc0eaf5ba9ddfb08b2f71b16aa6dd8f4185b73e8bb82946ccb7512e0202d4fc8380c065fea9da78907ba4abf92beef83987735d3a6b9b4f38f19c831c1a134c054aa57d350ec2e6a799d8e82144e386c898db017cb2caf7bbdbdf6015ed00ad80b8e665180cd50efa5b1932c8334d76284c63079a4082179bb40053628ef211be8a28ba003bb5955a0942c9eaabe127b1bcdb2b014aa313cc4a8d11ccba1025157789af29f744bd96b209265ca034df9aa6e1abf7fba4024413a9d8c0b4ab2a4d2c8b820254dca1a19094ef0a4ae9921c1049dd4fa191688404813ed0c0589540b70fd5981649e54741910a44c49572723c19924757d06085210d2d788a0a31aa1ebcf0520f3a4a3c9d0094cca7e438a4c82806633a5f50de215029823d82f71576712901f16e0f46c662ce85fb06cbf3f50f45a7d6957c58af170410102746f9fcc0df0d981dca0bbd75ac8c5f15ccdd578408d248729dc8540a6da6aff5d7d069b41c6dad7749e0f4ee013f5357021985782bab1374b46c692643ea77516b4debe46a7b4261f66534e663800d4d07a1d8be001733b2c00d6d7e33d619a8814aafd26c7a8155e5b668dcc1b9abcda37fac0007e43be17a7798b28ffeecd78f81fd4574fa153e633a97b2be3384f8d44402f3cc8d4784ceef1eb7b8ff771dc6818a088444e10ca150a00d779101abec79602c4f378241f7c544c6549121975afa583140340b87e2b5dab2049b9caa8c5a6416e73bc4fe519ce4a9788b685a39fcb124745cfbdf74cabc41f776c63a4b7ca2fc81ab7a1adc6e6d199792b8413ca339f4043fc9f1accb597b90d485440472a3ce035af456f0dd8e25514e48fb78f738486aaca74251147d6193b834fa46fcc48da746e5fcb50ae9bebb848b71243547094d694ad94b6de293e37488ccb1647a899ce6eec15fda3ad152d38a3ac7e137b80d8ca748580addd78d7d17b0f9849103e3fda63192e7b3f8b2c07bcd34c4f860a0418993ba1af811940750a94554b9840937a39adbb742ebe036618cf873439eee490f383b838279a6a9c3be0ec6d853916e3141e0256f414c5984e844ea9ae23eb1f05bef84de1adde0a3c0aa4388c2c10a0837436afd56201b497c9661e344110d019e5fe96d19f4163d78e36b532335f82197b3b14df347e0427013223c8164205551d9696a2e6d105b372f250235285a4227d9cc0136b1b30801ed4e0a94b4166de14ff59c5df4f5d13544496705566105a48477ab1a931962ebbd69fd2c1fda14cb523a817ee8d9002b447158f834de0caa7218ca841ba1f0d27891d431964e090e96f7cd195577bc571f3ca4c3b2996ec30e33fa707a6768115f41af0cb8106c2d899d75db120be8579e514199a1b40e57d67f58093cdfe070cc14cb6cb28703fd2492918b454e308b1637980307175e527160cc9c92752e1e3d712ec7218df11723b2646931f7c313e13c305d1caeec7bb86172071bcb55f3e805bc5987a9fd0edeea1029ac4f40d851de0c80f1cd8191d141980110fa1aa130a14ceb8d9c0754190a1de6536c6968e4f7a32833af9342cd0ea99180ebeceb01505d8facf61d69b005518a1f2fe771aa72b8b747d0d80d0088119707d43bc0fa33b6263c83f636e46580ffd1be6627b00f7ebca80aa4652fd1f5409005c6e913a52d7647307378fd74a4cbd51ddf7fff6106dc743765d01788bec067da8169b1d3136c45212380f8e1136e30093266899631331aed50c05517fe7104d03302fb24ad272ff2c769cc13cf6e800be182787d446c7768341d3ce03a77665c6ce87552eb7ea581b2c638fc66b4a22091e4aa384dd690f0d074e0431cec99ef74ac531f6e4b0052ce6e0ce05c13fcd6a91c7c96e2e0d803455814bebf234945f0220587b1053a0017a9406cb593a81a886befce4a8b4d26c79120420a26744e98e0c9c8ef7d63d158488177cff5e43d30abe5d1bc95cf21e9f8a4cbc1d634e93c58584055e429d7104de26f5c4b55265dd0b1f12bcbf8423c343026135aabb78814a96b0e0a4950ddefc9119124b74e05a89e3505ab612b4b8c02f100be90b41139c38333c7b4b213ab7e2e65853069dd9c7009231be949db8b69a462123a76a21294a7936118f8d3a735769f39e3bb7b159f787806d65b528c433be3ceb31c9a275e97363e21b96d3ac0d9d4d9f6483850f6712c5b43e994b9ea4276e7b4dcee822047f910075dd950d64af902d4716b621cfe82b6dffdde22453f3d4c075016c2c5916d0c43aa5d18cdf04284a7e2aa75da4cfbdedc09f61ab9d1dfe62429c2fe74e950d0b9038a9f7c39226c2f612c88fcb753bf43d33ec64011553e634e4e37d8ae7fb81165b069a608ce01a8ed5bc68d0798d5a24c38190492bf12759983b617e7b011e69f0164f1b1882e24ff2a28bfe34cf638452d56acdd4cb9461c9ed11e0ea400963c8157ba608be653b52499067def0b3d5d305546767258497463d5386f2632ab6b343a36c5f982cf9a2f561a67b759ec4662a7079ff6968f8755cb1fb7bcb09c437bdaa17a33c516e686e8e637f7143684fc1763facb72007876365d1107063141558c918f5481283a747e5e734b1a6271c09a6a139a703a0a982f3854981750caf3b428d2d0c45b240d79cd44162bb3addcb97ecce1c7c6af2c3c3ac8dc1f020970c84e54bd19f86a4dc3a63fd742795c11b47d7c61758c2f79fbf3734b54f408e32692b563c1156a832b310ee40f965d81b262272f12ac9b97914b706905f448499c041fb5c00131915088475f00fa42f3c1694ab52b996d6273a0d7e19cd8d97219cc579f04a9e0a2a5ac7968256228b21b4385f9e628104bec6accf83bbc87fbf1b30ba970fb815fe1eef2e3ccb11af72d54799d26926310e7765bc39419d30a7042fe04731e26d4667d2b95571a5e212cf12833a71b6c813ddba707a334965c31677004edf5c9c75a7f41bfc8469a0f806b2b8c5f359352c16960663a080550633405f81849351a14948c86ed62032bc370189aa0db417282c9426fff71801bce088297e387b163f949095fa9f818d07d8b4659e215246070514ed023a26e2705a300e524e07d8ca3b0870767acff7f7a8833a2d0804ee9bfc33be7cebdd75bed5e8d21817223ce77a20fcec8ca2f3b206ba49000a40a463aa30ca2375e6c1d104b41ee13b0a6d5462a6bbb80166d788b884c8de7bcb2da54c49a6ae07b8069d06afcae28124ee93bee7d80f157d0c750ffa00c52232d6bdf746623eb8fffaa75b0280566b95b7be94b374ebf3165f5a7a7347f0562ba62a576b4bcad4afd1956efdca4e566ca1e250f8e0ef6857ea17974112e2d6772cfdda80be8c7132f0ad11f077fe53b164e173cf2a1fa1f8f383fbf039d18fb89731eec727d66e099e853e08be159d260119b32f63f6a951f8f912f8dfce4b207c503c01fcf077c413b2fc003fdcf913c2ff62df738c846ed5df6181e0b3012593323a9215d50759b27adfad5ee7fb7fa40ef8f253b1409654c95781e28ffcfe07f87daf128bb0d7ff2a08d629ee70d07c4f143999d76483507c436497be649960af106ece15b2dbfd6a71e98b000287794fbbb760c84383d2faad865930e4a171698b355a08c1573df7f6c7c51ff72ff2e3933207a2927ff8756e3ffc3afcfd0fefbfe7ffbed7118b7822fd7838107d3461087c87f870903f57d6cf0ff0bf0745162debe787154721ff08748c0b65f508f75fc75a666d18f6bb9e5fe8b3a10f0d2721df1f1f43fdf277aebcdd8b3ff4ff138bec7020eebb3712f358423f54fcf9e18945b2d04e2ce28946621e8b631d8b63ccc14013861c447f8783be3edb647bd45763fca18fb394ad2b155aeea76d73b57ef56aadf5b9fe8e6eb126eceafeae21f24bb0d73584bb2558ee7f9e9dbaa0b9eca403951bc24f7df9c3955f2e2756516c512564045800dc39c6b8f3c702dc397f14c09d1c34bfc59ac9412cae7cc305898b932e4eee18ca2e4aae94978b19015c76e28285c70c61bdde7fafe588312d501913c4143e2f84fdefdecb77bdbc4f841cfbf1e1893f9cbc15b06216f187137f20f0bdf712f8de134fc8f2a37bef4fb0ffbd04bceebde71855fd40c0fef72374effd54f918fa443186b0ad8b8e6110219761b7641870994241114dac1c2dc5e4941ee03c6d6993e4268598f4c0d052182590302344125e78403a82e80a146a90f836d9acfc795c08f976de277d6f4511e15ff9ac14c2d1872515c2be97efe33019c3d1405e594158b7c5ce8543a8460ac220acfb1a004202eb3a334f71f4e75e3a54d106c914619a6652aeb018292aa8991295c4890566620a2422396a6e28686244871886646083256a082a2f1d5c38e812daedc7e1ea96122870082b3636538694c44083234b9c6141d41a3929c4e4032141d6a8e080e6b2130e62ee68802bffc565271cb6fc57c9affa41157f7a9ca4a008293ea049fa01ce1b282b44ac59628632b19e2492b0a1055a134545b10a38cd20e6298a0a569089c967958d33e168af946ecaf0f054a687220ef2b9ed63b6f25eaa7af4b5bf26ec97de7defe309d4615c32bb8e7d17759c0839a8bbe5ec96eba0e9ff7efe94dc85ab3e7ccccfdd3240171607b0269c9f839d79329ff1979dcd03a9b0551f00f920e64a3001a8e2089353181796b439c18b0b46dca02043449698971a8800b9582fc6e532485baecf6527a62d476c70b94c92a4cbe2b213530b688caada943525c27136391172d3e5f9f4484ecda67136155d2ab3618cab262c9a4d2e2b721827e540133cf26e77ec9ac023079a522e76bbbb8b63c718652d8970943589261c5d56f3de9b82e293c1f98ae278b7cf48ca619fc80e54a9544b7152e1d835dd39bfb3798c13423ed51867a68126948c714730d06cfa7e7e27e5b099cf89158131efe7734d0efb44906bbaf31d49c835a23bce231bfafc046b176c026d777e5377b9cc14a4ebaa5a97c4edce6fba521ce9957c59fe9436240ee3588ba3756993e2285da8979d985470e7fb91f0ce77222625f28634c31ad04a1458a2406116450b51b000c5134456a61c6162894d0a285f1718dec44009273f70c1e1852b96056fb8289620c1643bc2a88d1b229a00a146cb5214238ef8e00414cb248513982a6aa0ac143104118c241bb47c992384910d28f0152b484991a60729da509141044aa0492a220a8b0a6dbc5b1419241b908ce9a2849c5944451a3303261a720843a5635ae17a0b5c549aa3ca449f711ab484798aea418632489870374c9eb4f8c0a6065b9222281f1304d4707822c5c311433039a20a143031050f508e9ca9e289b7c4df1e1dc172fd499c14702102881f9882986ae28b8c3669567881490533332e8913c0ac80051eb8244d716596860830444ca89052c3157505217890e18d1134bc898383db82e488812229ce104c8879e2e560850986208e70811447d31685654a92336590a8a9012492c0d40c3098c1172664cacc27cab429d384144c7a788ae2099804156506b22f71aec0a0246ff8ae60a1a6464a0b5156f0e42be2c611344069f2c30d0931334d08e44049c185284e71c01c713508c006333c48f14414342d734889cb0c51ca1c19211953a3a0708517255b91154ea6f0222aa0054c941a96f8e1caec0997c5a3748001ca0b4a4889f2022d4a2697d1cb13922676f072a4548f9620b3c495219c90419b2727c2480e2eb08149152d8012050468d4c4133640a94972e6065913c14f2a00620ed1152f284144e702232c6072244c1423a331637ace0252f0a202941992102df1c4891f61e0b8d1e28219393a28b11138a809330312253c9ce95af0b7506c1b3e02063bd480488192992b576480a28217185c9166081da0c400c4d410513944e126081b50e0d1e40564a82c99c2091b0fcc0e4f69e2a4204aaa369d607001d410493001020e1328f64c2b8d1b1848b5293ad364be80820c599c88c10ba6a8c0c421f12a08a066082c5566e0431c18aa97de94db1a5c7aa3b7799b81013ae5466f9db8a2cd229c5f3a3d38f476a3701ae6c1f16ede6d75f37208697416d124fc6200b7fa99c728b94e9226a74bd5072e57ada207424277470f1e1cd4cf4d2c0e5a2d8fabb833ef0742e40de71565a16c27cfe936eda369702bcd611fadfe47fb681f6de5449d6e7f342aae6c1cd4ef6304eb4559285b329d3a2e7e34a7fc24acb45aa5615f958f96837e1f8d161e7d37908cdddd8d84ab747aaf6e20911c17d93e997efd0de49c36e084f27dce392755bab3abe1bb712494fcfcfcfc378e84f2651743e77d9deae3aacabffa137765369bcd66b3d96c369bcd66b3d96c369bcd66b3d96c369bcd66b3d96c369bcdbc67889bd503c1f7b8073fd0fbc0eebba3fed22ba294baa594ce6b411004ad70a2ecc4b12fad17fcbc592bf55b6db7dd01414444444444444444444444444444444444444444444444444444444444444444444444d4f1bca1d3b9ae7b8e7e673bce764d3889dbd583f2a4bc270fbd2787716c5acfd6add9755d9744c57a3bcbc9e9c99f5078360eea6fcfc639d8b3d96c6197836c9fb472b6f33e50a5b30a7758b4e0e971f1c207468c1f191a40d1647349c64f0c183e2f5c006003196e44a33628173d3c2d58d00dfea76b3437da09573aaa67c530ea9a0afc3c9608c388abddbcaedf8a337ce48b46b7bf25cd1acd78712dd4ed966ef7732a107a6e77636889868b7bd5843c9738478fd7e9f424f18ece3397bd9ac7e43575abdf0bc3e4b095cd6bead70aca0bc3af559afebefb568550bf5fd91cb6925a41f56b35b54ac3af559c9648e44aca61aed554bfe42a0ebfe48c5b52d2895c41075e1332904da4ccb379365bcba49439ece3a695b27e59ce727482dff7b209c3beef9748beca799deb86cad2e04a994c265ba1e092bd62e3d96e3fe550e639cdc9f2220ee2ff269db18629fd7771fde9533ae7db6822943fe70ce1c575faa4bebbbbbbbbbbbbbbd7ea2e29cd42c56f6a0614ece23ac7b9fb0d52b88a8f698ce092cd8bda4ca38962d370a4f8d686a18fcfbf1447cae6a86da409473f728e63d3b04a5382b35499ea50ad5525b5a93aa9b68a74549f1cd62935507fa7a444f32125254b4e9890aa8058aaed9b62d32935077d9267eb480ea22eee6c5bbf5e54340d549fbad59f001ac2b15352ea179686395203b51f815e42d08f6cfdf2b94cc1255b44fddf8086e16abab59c83b65f925bfc94e59c732e31333315f99b734e6fad09e54fa5ebadcb9e8d85b5b685b5d55a3bdd2dd881737a9e4e052dc7feb6b26c7deb51afd6ae2f39ebe274cd78a267ca2ad1b8462bc735a8279e2692ca9a4d9e1ce64d53f604bfe6ace96922f186bc216f68c91be29c187507ec4d4de6dc262fbb5c5191c3ea140deb94ac5a59bfeaad5b93fbd984614818d6e25c9ff45572ac221baba24d0ae58fd6fda1b0486db975f1a92f3d77ca1c566fb729ab3755975087104da8498c1928a95b0767aa4e6f536ff5566f1ecd23ea6e73769ead916112d3794c62c830552aeaadbe6158350365a6c6319383198b8481fa398e6b128662062e7d59a7dc3d70696d0672132e6d6e3967adb556a628393959dcb55ed75bfc5661f62d6b7620c6acb5abe398f2458c1934516ce4d45b9d3527ea2d883695dcb4bb7d4ebe8f9fcca0798a82b2c9f6492b67a7b5ded256ce766c3beff33e50a5337574bca50e832a5eb94096cea783e5f2af942eb3c270cbe5df59623159b0f0962c9ad62dfe293872a6e0f450cb6e4d5fc4347d3163abc923e94422c923e9445691461dd56c380ace0d48e3b83a70f01757b7f865835652d9ee73525a27ad95e3acedbce979ded2e36cd779def781aaa952794b95fc4009aaa4ce2a9c61e82d43955cad4019eeec8092458bd9a285b76cc1d3e3e285cff4f1f1963e3b56de110c41b27a5421c8dbf2862fe68b17def285d5f9e9d16375c6105cf93d578a6deb167f01a47c4c63fc6ca40947a1eba2ed1fb1b14ec8fb559398975f154db7389653c13e876df4d726af35097eb953c12161a019c36a5403fdedd62814dc6e6589eae401c639747b9c476eff947507cdb520a576fb7d8e4fdd641efe957e93a1df1cd6592255d5c3de4456f598778a9dcf61a7a2e5d319992eba928679cd9938877f93131b92436171a92d7eebb93299949ac33a330dd48fa629cac6e676706ee7522327bb81d073a7d8d9bad53fa38950fec8c9e66cd5072eb975f88be10b39870942b83973a6aebcfc3dd8a4ae144bf0cbdd92391660bbae4397538605682e8ccb4e57d06eedd61f1f20cf6e95326ed5ff99af9a73fecc6f7d5f44f5dd4780635fc4c781eaabea0b4d714804381676e2e8a3f3a3108d716cf5a3fda13f8203552a0e8900c77c88457838507d23b107df48fdf9a1faef55e28f8ff07f7ed857bd0d2ec4e7c871809c7385784f90523a4a1c466ebff74b8a2d26711f7e684123147c4c63ec9e2c6191133cc5bc67d50fa9c40343e8fd58bea00d2736f4095b1ae816f57e2bda282c42ded85cfaac1442c9862515f24d626998f7453af63d7da9e4350940e8bb88211ca5924b9f5669a32b2a1842e15230f45f649c708ea3af7269b79452f657dbb5ea8320accbfdeca603ab38f08b340c24d22f96ecd2405432d12eb266e4a45f478dc443dcd12dfa543239cc138bc8d827fe74b3de8692873d11fe6d1afd56a2df46f4251309401ce6638439670737a9c9b611e6fff4a84b96d07638cce540f4297d188ea53eaa72293b81d9c2f4e5525903f3e58e20058d60c072c756ba74cbd5a15dbb947e95afd155eb17ad4b68d75372a964ba544a291d200ab5ca84ae86dac9f2310d66daab6100b8b5d2967e8981e32adcb1b1a8683e54b963337d9173c7fed24d6d1bdb4c3f5dffd9dddde57adfc02def692d8b2ad11cc652523162bae5b54aadd241c01675e110ce1fe997eb4d54cce8b3b2d52ad7bf69b7db8cabf5b7451a48a322034db13e65a235dae4d49dbe2cd9b991241ced6c2c4cb89ed3dd29f5c07252ba74e9d2a5db77ee5df248e9d25b4dc207f4fdbaf43d31a45f76e57fccb2324a2955526597af511157aebbbbdb4f70796ef5596d6658c4094709256bd078f40b94cffd9adfa0bfe431d33039d440f2c54816242c2681e47b1e0b16316288e2000670e38690dc210d20593584f2613ecdfc2307a0517f55f4df4812d2e4371696df6212362d46cbee481b278d527983079425299364125a7229b56854fea4cd2d1e78c0e4301f212197abf5df6a128e96766557da10dd6cb7d34abe35a884ddad4125b4b7069590bb35a884f5d6a012d25b834a386f0d2a2137f2d4a012f655f530ee742107f1db39997dce39a79439589579823c3c2d845cfa0c19be1b73ce39d9f62834a7651442764a67c0b07262006a421ef342d1e5315598ee687d643c8d2a2bc7c22b57b9dfe11cc7713ee9f428a5a0ffa49482205be66e9d7eebfd5a72bb0e3de15231e42022b12a4405ce5a2d5775782aebc7bfbe15418855b148a85dde9a5f59f672914facfeb702395b5fa7fe647da7b22a2107e2ff6ea46039889f5308e5f30e337b57889c33c55104aa291204c1972a9d5518ae7454e00d99dbcad1e9f3729256a1fc722c117834e958c00e5aadb270b8682ecb011244d974da4d425151425109e55fa92c22c2412d41950a4c5ae520c2419273708f8e108fd7d10976202bb4b2db81c122f2442c57e9bc21eb24139144bc769144b64fea6a013dcb0746b843848d30ccf34417a5942b5b904d24121d514ad1e713e515219d6eb94a9faf955248b02da5dbba141e529a740849119a2c226d027eb95842b7dcdd722285b1333968b6fe959ea5cfc91384a7b35ca57442f98496ab74fa9c73b6583076e6cb25a825a825a825a825a82587918081fa51b89da4b642d3139a11b7df2372c5d4d7e9f4ac5ccaaac7fb5e2091edb367ca7593925a5e2c22529504022a505050500390403310f54ce8b4c0761868a93320ce13cc9eca396c0f23a0ca2954ce9e429ba543887a0d07a51ccb8434fc72310809ddea6f6ed15a82ebf33fae25b7a7633916b6a7637e16e7a8cf9283c4ebdf795ff89e8f8ff7f1d7035a17100b46c713840704baaedb59cbd5e9aed26972b558977bc96152d6b55c922dd5b8a394d5b84a3050bf13456e8c1a852e4abafd9d0a04ef4e5142cd8162e9ddb63a20f7ac5cc4a07680dfbf27adb5d64aa7ca556e3bef932010ebe70c233333db1932d449e96466fedf209cd2ddddddddddddb99b33c255eb0bfe1fbefdbc5072ecc3309c2b701c154a29e5b88ea0bbce52789df52667794e96b5f29b0245c8f2c0cd9d1aa11a48ff252a1bf2ff3eafab3d7b5e4a91e334f07274d9a907241b979d7890bade13e7f8dee573cfbd0fced13d77e31cfddc77cd8d3847cf73ef509cc33ef743a45b568fd2f5a71f15d75f0582b9fe3a2ab8feaba8eb1feeb0f84fb2ecab7efc9464e8fcf851b1fa11041323fc51a502183b3faaa27c58fca8a3e5fabf68f1e32a85ebcf8192e5e2ae9cb84a27f8f682e07b5eb3ea4f567f0f6bfe0edfd13cac21f2b660c11ad9e972bfc31ae594cbb9b9dcaf5863f370b9d7618dbec2e594b81c287a451ce49f8021c2917a453748d23888fbca92b71a07713f596ec441dc5b9643711047c375ee8effd3a3031c274a2a4ed6530bf951f16eeed6cbdce038238a125037b45ffa0b3360f03927cf39e79cf3a34f29a54577cee95f02fa86ce7997f8b45c75771b526aa5f874f9734ac94d5fd1ea644adddddd0d7f5326e7753686062cbe4d0f434add6381768a9d53a67b9f540991736e77b7a4ff49eed6e9be53e67062d0ae49e99c734e6bc3b09563826063ce6983836cdc763d03c906c1ed962ecee1d7e8b9d55fe44a3b655696d861d25a29a594721c154b68ae47759f735a3b6b926db6ecd2b28b24736bb24b77f70814607f259470c209376e78aa452ee220a031e128b74c91861c8173b46daea9f96034531c47a4615e935591c232258d249254e2ea949a73ced97d458874cb7f64a859eb039973d6073239ae3e107f0dcc7620406658b1ada49f612504f243033b6ab6dfa1a386c4062d1cd574ce2938311c27c20f204188e890323151373872381d0be8d7d8daa163ce39715ca6ff57f4d112c1871007eb78ee3f2e00dc029ac00326c771e2102e006c0059e3ca6f8d2080b1027cbd399146002c70593c7c81db9381e45b56109e96509117b296b9314ce7a494520ac26021e4310209fd9abfe38ad02fbe95bed71715750871930e9808476efac14384269c8341ce8aa4c1f25bbb56596573d0eaee96dc9a2f550d30c11d4d2027bb8e149983e607d4ef1ceaa5466aa4ee6ea47047b702c082706c27eda49764ad95561a3208e11502822b439e3216e89c94524ae9534ae911aeb4d65927a59452d7fc5aaa74086903782efd8fb24ce81e26b8aa1e54d500bff404cee018e943a3d572e9e0f183d1b46a626c4f5045fa25a5e496b7ae8fad968b35610944ac8f9d456108001ea48474525a699d3a84e69c13d63d77f3c651f5bfcaea31653213ba5b5c9e20b2c70eb7fa5df27dce1d0eea77c977be7307c707ae7c6e105cf9de922b194a27f3e0204dc82868b55c3a78fc702434ad9a18a71369f4199ce648a10b5ad7a528e388f3252b6edf6f05d210ce9f2f61b586424d8645a6428c3e28615e2d859aac8b8c498c3e8f8485b521994c8e2c4a8cbe0c8900f1d267f9a200b893d239bb5d563632fad55dd7d9ce72d0b2b4724288dce9b18656dc81fc231febe10e3600e34a9e0eb4e020f95205020f082d6ebf0e07c951487722c8412118559727b74051489116933ce9c9e8575fa65073b4b7d2dace6d3427a573ce39ddef27851c2682991b318453643941a33694522ababa95c4e1a0605348e9b3ec76d0e84a9d754e3a69adb5d686d5afcf77d65a9f16b9b5db0457deaea2e456f7a075ec135cf9ae72809c33a47e09f6d6d1c895d6c74e99924f7e7777777777777737fff04b293d89fb1dede3d3f7656074dde5125a808f0bace4845ee95cc9e9d76887fa35864d42d94a0e96705cc1b9be82b39a32720e5a73ce3976dddc4c6076523ae79c3389fb16a1817c1e09a709b31f2036b76a09ea03e690d9fd3ea72843a74f4e093f03347fa13f948ed030af010942a45f43cc4ca71c9f9f5f045ec3524ad900d92c1ddde2177258ab81f8b9f2df111888dfda6e7ebafc92c50e48da992f64981114cc4881c5091d90d4bc4026898a1a1610918233320879043558a1018946850a1756b374749b01891daa40c2cf3bbe9061b01dde08714354151764d081244f92d2bcc18285a8670d192068b0c2484d10311642ce0bb7355164718ec4f83901dc041827b429bc202561c6c89417d85aa8a28508222e120a8824815f8a27882764f921ff04fe399f278d15427e1b0cd4ef813710532e161461ab8ab763013c5c2cbeebc2db755d278ef543960e8b9b415c77aa589e3c4167c4b607f17ddddddd3df52a22e46e6f2d5ff5a177360fbdb3e9fc6ffc38ced2670f80778a6309d78a41c0db0fa7df4c41857477974147712bbfb955bafd16e99ce3fcc9713f3971fadde1963596607facdf71b7766f59b3f3cb737cf4db3eabea03fa75a460658df576b3dae3966ee5ce124b667777972ea940c2dddda54b6677777777e9920a24a0b84fdaecee4c5ddaeab482a005634085d23bf2f95b015e762a23c51ded1dc00cc2cb4e65d67454b5160c798a70e247656a2b984959a523a980a15b19a3a34e54c0eca84c9167431f27a83b7eed09d7822b5dc884322e3b5da17160c216979dae2c717a621bcec0841393316b84c832e524040e45977b1f32662ef71fe572b6275c30a914ab4f551f543b668ada39c686be4ab72af1b1dd79adabc9651e4fa18627d0ddbd4a18c09cc42c8d51e1f6739819dc7e0af238dd51c6c8018e1e67313fc8b9fed39b6cd79bd600c18549104884c972fd77b053981ed85666c50302c2eb6ec37577d7e0872a468c7618723374c58997322e44cb0b76a801081a192262eeeeeeee31b96e039cebdf7577f757103f14c900793e309f9412f6e53251a44220af3492539c184967a37e8d2ee576bfbc25b7a795f9ed32556eb775fc6bbffc21f8e597460de53c9da300346ecbf01dedb4197c4c0347b78492b8e7587d1cd49faf8c59e5b774e0100abf15faa879f9d5261e3e2e4042094272b8098acd6d4a46ad6c429f5823028fa590aae67f93357f8a43e80f71f5bb28b9454d70fb039ba6a8f4ec98252d75866c00008080022316000020140a87830191509a848134ca0714000d7292466a4e3c154823398cc3200862180842880062002104408248a1013a036aa556f216c4c9e53075ba782eb0d1d5d130ebb8a96f9de584576a48171f5536d9d1137a0ea5c3bad00986dab1d100646bcd9d751f7275324b90c9712ec4404b833799f33342dd33bec056ebdeb9fb4f0a4ef4b5b4d2dd82c6942cf346c9df98f750fdcde0d78992cf65e40ddfad351ba7928e23eab141abd2aaf21874a421f6e6047167334a9d56cc544dcc23b2f8f154ae7ff9bab2563c1f532fad781ffa5d9286dd43cb248e05981c627f411034fb6d959edfc742c0c6dd7a33f630859bb746485049349f5530ef4f91fc3daaa4bde1f8307a872099541e2177bc70f25c40cbf75da827d905eadd5bd817bb389246a74ce8f63c8664b1afb32f12c547bac8eca8eff51e3dbcbfa394af3ee98b7d0d925d524191a83bb1afa32cb0b07538ab08f4fe7a042186019401b8d91d4fbcac1ef43eeadc19c0320b9f90fbd09656e684b3cb1226c5692b671839a38a982cd01a51c4cdd34d50d2516df2a6c8964d67f88fe3500c7c5420ba0cea263da8579f96e2206320d5983db0c76264827d552182bc4284b462ea63d7321df62ee9658d49040f37537d3ed9716c6fec42192634e0eed962204a6197c8ae3ff88ae6d6e22ce4133127f016eb8338ac734cdd07770bde600b9ddf6d88f6e23127e57e9d838e643a83e9044048d76a403c2b5c214afd44ab15018e708309696b9b01ea309424d6b1a68979311f9bc265589b2fd631d2e06c0287c9d2456cd684f986aa7db8a98065e56e56b8318f1a586f4c5afe156eef89a62d7e8ef55664805aff02396c45ac1a189f8373e685f8c11d8095b43a5e37fe296e43a31eb4606251bfc2f2c81b7f559684baac937c11289d9b7a197ba85ad27d3b3784e0ea7a4b14f6e7e4ae3323273a66e1716cd53a1b7c4f105642770102d206d6a156fcbcb42ca82a8bce4eef09e7d2f841f2a570bb52fb1489bc40907acd74ef019642567c413fee446da9ac25804b782d16171116b2c20d568460b69284e080c9d8407355b540ba36e26fd767ab7f22a51594f27cb9e3736a4342b54f86adf201b23f6e1b52d1facf95d025d8d99e3af4f4d1270862d65153766619377d4683a246b3f844a8da89cc41095a3f1aa82a7374e8c9c7ecef8ff16c30326fb118309ddf2be4aaf09d0aa8bc98709d8e0237a3fa5ec9da45aa706e8bbda9daaf75a9ca798322e9c2fee628247801df20078fad8dd7ff2cc8324ad1bc8cd80acefe78684649f6ae8ed3fd50ef51e36804e2e57fbe6e926596226b623360d99d2a70faf36af2ff2f790b4a8149d9df2702945049ba81ca1d6df6af2aefeacb0c541a3bc6e11c4dd9c2fda2ed258a4112d7587b0fd36df0e260bd196b28443359b1c3dc294d29dffb4042cdbc04203b3b09e3132603982ea146d04e9451ddba2dc9658d3aae3790dccdb7544e91aa881eb1b44652ac128efeb135fb4ba59504c5b9429e2590528af58e972f3ee276b1d7cfc0a3edf9d01af4e42b8049048149838544425c99b6b0a75bd675cd22e84d496999b30d40f707c97ada4ccd59b369762e40889e9c897df57bef717f0ce94cbf2676e3ae5b0208359cfc51634b5d5c2cc9e91cd91d1fa05f1ac1b5d5700236eefc9b90c2f585be632a519174528a35f0b0c21a82f9b34286a3adb842e51444188336798e1eb748be75033ea3f0d096c32813b39eb67930122e5648d2f637b59e868ddbf8f9975a2c05aeef3191b568b2018feef6880e80045b3c5cad4a249dfd3b3a0d98c6587835f060408ddac0cd75fc81b321939a13effda04813d894ad25b660e2dc2528fb8d16fb0264fe83f6e308293a254459be18a737efc015b7aa1689cf824f53cf32199f2d4f358e3980ea6021c22d446fcf5f1d7ed538ea3155069235e9c5d9ab2f716cdac44b0ec6522fc0641f444c0596a6219bc553db1993b142d9ec076beac72e9175e993f239e8d69387b07627df4d905d40169444bc749328153225391f11dceb5946542a4953b01f1854ba9fa384fa56f121f2eafe71715e8f536e405a3ebd6f0b9c4fcef8c7570025849a41b8c1f9ce6320ac57f740a68d6c381f9af595f40812f3d39fce70a4d369a0221d586de6a2cc058b06b28579bf30610704b06a978ddbb76d5dfe27f88712aef86d820e68feb7643be98f03cbda4903a3b8b03061e14ae72f870310b174107803dc4388650f574d8304f7e2726834fc48dae4bac9c5b95b51c2e9f16e26f2ae5318c33dc328ea0f1af2534cde4885f11fbec4c330f374eece28b77f4c4c0f048d672919258fd8065a00af53940104455fabff732673ec878d3b114503948c9666add5b01113594a8f463b8c2787e47410054e0972778058650eda2f2219c20ced9db6dd452a90775d3c1e7e1d3c18146bb0e42606f49900ec9091a6274e4ff7f30efe8aa3acf210f0d88237814cfd8732956c952d9880d0a3676c88b2151234811993a66db99279a42043c52ff3a71d8aa04369c8f6611066350274315d64d8a9a89da45f7de58381e432056830441e7963947b9b93e8b7d71cd29aef303bcbf4f07519844d57ac45b184152718cba676f898b69a258428a8e61181dce6eda9bf6094c93e503d0d8927eccd0f789bab435d96f4b121ae0d7a33df84460b064108eb891e1512e530bc06da251548e241173878fdf39668c0c5fe85f088073f5c14fd0a8b9de2065bd9f1f4ddb1fe589aa64fdd441870e665209ebc5248922bd2d1e2650ce2f31dbe1e2121c7c7c2fc3ac27b63c06592dfee9d986771148de38b77841db863d89a15ad1a149b17031f8268fc04ac68258ac67736712c8c5a05fff0aefd137f69b48b13c5c059321f3c3d9b221262c0c43e21f392d1ec657f6c4bad8341cec76e9cfd22a2dfca3064449900c9925dee022c604aa9aec9060c78eb802d56140c6be131960ed2c9813ac83df08cf8f34dfc867900e149e838abc80d983d96309e87d07988a4bfee88ef6300e65a91d299e1827b85ebb44d24f958b03b7d7e4816c389109122df113f7a5efd93c13b798e7e2cb08e1f46e929ff25d55d248796b0a0d88f50195f979a8be08f0b87aba7e1c1c93c207050fed61ead15480803686376cb69bd81bf2d50707feb628cc432772688f23941e062ff953d72d5e6249813c6b63b85b6da58bda26f04190c77f7f54c7083f87bebb902ff10ca71439837cb7346524b1639dd0823781c413908a0df79fe41c0786886a65674c827bb7a215a5a5a62cf06662ccde91747c626df98656c89cbb6b6a76fb568fb6617c1aacf1ee48eb4827ef0580e92124b63cf666c28936e94ef94da913b39eb8dc4d5475c9e1f449d352717652043b95bd99e64eef79c80a0d78365a94935f9e280929bb1784fe19dd2e7b51dc8f237ea539958c3722be3f2716c8e82c3ba417401dc8d01086b0100dba81356c272523447b520e06db0efbb9c06c4bd0d3ee0590e0dcdaf7b439a77519c42c3257e289eb93cf15b950ef0b687d7129e8316917b64a895d0fdf908e17db611f1a793f31dc9c284b56f96fe13641135c734c7999b3337f70044eef404ecb4da9b3db7c3187c9d0091aec382c33ce7d426cdf57f9a0ab67826d311186fb6a90e969a4da7bc7205c4e2ca91aeffbc12d749698a353ff3c8fc68a86e271263ccf66f35c39b18e9170225e3c6ec21806893704950096f5ef01468cc993f144d57c0527bbcd62900d996614dcdb75a93209bf5cd9156d874418305e30bd2572b087c927fc49cbb6128a3419b10083c88712519542ed31946d609de71fd04aeb0d8e5916f7a2f20898b708b8170544461d811a306c162205558a11b4cb92f10c4858b422b065821c0935f2bc1394e8195ae813d3dd600854481d6d90138d72f2f815887919698f99ada7e1a818531c904b188d8bf4889fc183900c9189b45f8632088b013fcbeed75988e9f079f451458e441301ea5b5ece99733917e46702ae5be5ccf24380f48b9bf89bb0e62123dec8bd04a418139aafc2dc705701981c055fab1870dacf4ba5d23dc1601d3ff168e950acb961a1558a927c2d22b82ff797cc8f8458f5c437d3e43b43eef344f9f611a1042332146260712dddd7ba56e27175851906fb734759778da3633f100770b413440b8bc4a7311b03ec77b48d64fa4bb16b65eb866b77c3b1c85b9e7e465e4e89dc185c4fab5af6eb96b79c21d7617c94d93e543c1ca69725b1bd1f915fb2a917bfd2c11e88532ae24f87685f17e741310638ef48999fff6ffe2d0dd021f9e3b8b287ca17ca22f610379c11da88a221128169761c10268497674e28ac5a2f631e5b9d67d2582b99544c2c9c2d48963e84edc318fbba3d682fca2a1e5319a495d3dd7cdd5dd24a5185f9012a26b1b284b8c60b63584db33b493a456a04418050f1019fde1332367ff508f483985cea2bea4b14143460d144186edaf667c1ac45f247a2e91bc14dca476fdcc6ade5d1354fccc95d6d5520ac3558c02f283a9e4793be280f03d12062119cbd0969aac77eb03e21ca9f100a18b2a2a309fae4c04a412c6e301f9e5d663a334e24eb448915920e4f300a2b22e5b06d543a6f139375597d8d84595dcc9fbda415db6bf028e69f89f437dc4c39a3be9a046e016485299bf6a2c57c8c9f54013f75135af124403643e844c28547873926b3b375918e10445dda37d2d286f2bcce3252df6bfc0430275fbad46754aef68791a0d3e7f2343faa23ee845f6b65d2ddd02f425e37470b2f678221e9d9799fcfafc3d321456c002b80eecf40d357067f8ee446a79b335f246a5f053843fecf3922d9ed18696ab45345ea1b089a30a8958d9efb315960a2f9a932c5e60fd3defd6caf578d116f874de0e433a0f7652c1203e29d7eb2eed60269247c864b2f2487b7fe51c463b1bac682822276d3ffd94084d036f8f33038f009b5f6b44a4dd7a74b1b71fe13a0795b777935c8123ad086232220b4bf3727628f3891a4b9c2f33dfd983cf7942bd08a25197e05a9e0bef01855a78ed49ceecf87110f59f0bb602104a4430690237edc0479e482f21ea2d2c85124a2c347c8db4587d19c63dc9d83a1d43025e6b5d45d9668cc9f43e17b0706c56563f367ad2af59d1f4a28c22b96a34765d7aa1ce5d97be0700dc84c62e16cdd8722fabf491aec4fe9c5529f051981756b756e2c08366bb00a59205fa7f28a483a304dac4aa582058224c06c7ca96dcbf898ce2cab643c83902bc127d22b76ade95cb4f425a371b7f051e0245656391acf873d08a471c2627dbf6e55e89f85cd663d4ac71f8ab693aa00825bc06ecaf9e3a9b107f909cc4fb258229a28862fddb556829005ea0df3cc6f95f2646abd960a9dcce0651bfcb5fe6d16393ceb6012c7142eb58a823f2dfcb06f5bc48074fb81f840847394fcfd6057122f0b61662e50b0303615b0f8c88a425f5027c8b62abbc90d7e833868f94cc1fefa5280849e3a648599546ba049c4a2d6656cea69c79d2ff91e29bc7901104e5c501dfce287097fdbc4908560262776261ba7f418b397c7009a37da578dac676d10114fd138ff6ed07b5820a1fdcc807d10da9595ef8e73500d165afa6a0d6cce335f6d40a22a964e5ad12508dd501fe78a76532eaf10e1fa4dd493b73fb0f29763b7adb2dccb74d5a7d4cd20daa62399b29063e59c7a0679ef2c454b21c40a00efb09076419fc6ec2d949b049c74d243c18a6f53479362472f47d19652dce2904fac146b81f7c53251797b6b20f616fb678e0a2fe2de25e059c7034f1be9d1239b678b2d4f827b828b319b549c37e467b33fb260ea7299d2f969bdd2137614297eb86126bb8f001f162ae4602c8046ed9b03e27a282a0b5bd2bf42093867d96c03c88902763ee2ff8903100c294d1043a983c3d308f27fc201c55b1d46a203cf8432c56894bda802b322eeb22ace54fbd72514295821d2eb8703d410488d6093ac0dfe64ad802bf391be33eeae26747dad35313c6e9616103ac00fc809f5085458f7c2c819719052c477418ac57d91cbe015cd24a4f97f2e001e61acefdcfe0910a8cc553c062cf77df057627554c87d683cdf949af06afc91a1cd93ff4ead84c37c04a70637facc0e080be22b4363799404305a9338b71f07f1f2ae55b9e1382db9d64871d8afd80798888edf3995778393642c51bf8816cc47ea4014da3623bbf32c8c2f9e2879580e79cbd8359d3736d0a93e57dfe2428646031f6dbc1739e713e828ed4a2582fa14b495f445ad0c31d78261d88f6a0cdfb82c2de0d94dcefd2af9579aa997bb18d5bf2eebe3adb373dca05c4f842b346d1e085400dd20d2ae1c4010085052109c1a75abb40befbe800ca8e2f05dcece4c41a5df386722154aed44e1c77a4df5b8b0e8ebfa7dad47c1b7316a08fcc9cb7421a59e7a960f708dc347c39990e77ef8a9296f6cf6469ec2f11852bbf1d28e11cc6f9b85dea18319e35c712a80dd2152307f79baf41e5dfd2934544a059880a228b00ac27a8c896249fd523ab7f056b20be270aa5935fa1c75e5cc6b68a741965607e631559573c056bde25e37f48b00e79d7691ab29a46f84d5873a7871a3fdebc2af4ec31fe7f72642591cf82330724f03875ffec741e39a8ca110d4adace4cfb929730cb4cd2bfc15d96b7f560af62dde0565175a7db7124ecfe39e3bf5cd39ee14ffe281f257f06afa1495c0be71e1a2a768fe2a6a4e08830ccadc965460b44e0f3487761072b71faed4266762bd9134211cb529810467995c3a8d7b38500d541b1a987a7730920f1920e2363abbc1a85c47035b5ce963dc379a5ef74c46d1b7bf259b673a46b876b90daff7b594eb80bc52848cf7c12fd3608b7427b7b7153898a48614475940944b900495837a3a6851a4c28209a8529a223410355bab766cb70249524ba88e5645ebbe070d8d55168bccb0cb29ba1ee89d15b8733549a455303d24224ba2c1c63d3d7c30231e57c7a16d386c1bd5e36f7b6e9f5ddc000bdaa962768ea5112264ea2331c2763dbb331fbc1f58d71910a5ed7e036e74ec0da2452846f370dea1f60323cb2b02cb3e00e205b0cea04d77fb8f2c0f7f4891e2f412820427257535386fa3b9bef4a8ae49aeceaaf69592447e8d4d9b13ddaa1205c32dda2ebed8c57c439e94e45c97bd0b0eaac37e25993584cba2f37804c3ea26cdff23b1fb27d7b80e13863a05a92edcfa4ad34957d6a35952e11c788bb7817c059ee526ce5dfc2877cbde26ad7f87a2b0c88c204698d52020e95fbac0ce5be65937c38f63f7aa57a889edb1b4f87aae5abf7beba73d7ef1b561abc0c7f398269ff0c5fc6877dd4d9d49419248e94913ede5d3ac2baed901263e9226c19128c395ce75c2323be581f5aa555fd8da4a143ce68c73489aa99d46a6426f212211fb3f7eebbe29d1500cd1e6fed370c79b6caf93efc7804410f3bc75ef3d9d908d756ed3a656784930e59ed7c1e033f48c8224917c2a0c12ef33eadac2027a73c2af78b211072aed4abf6bfaf194e7cfb0bebc2b9854d51f0f2c4e065ccf35619b6bb8b04088a5ab7a0f26a6c1e36c3bc9737d22209e5e17261727e7e738fd9366dc76084696a245464f63b9676f2342f42f067a7c1a39a8cb12ec16ec4018e5c36ff87b63510927d0a22ebf25b59e01c9afc4694fb47e712ee33d348cf9944329599ad985ca072b85db0ca1d4ec2ff582937b52f6e507faa79c640a5372fa035c455c5db18af4de3ac8f0bfdc89e0adf6673e1c0922b9e53be64ae61d6c86719c41ec156fa8da4483805a331a3cf1870adea90f44bf1dd90ed17a84be3284ca32fb3197d09c32d04cabb2f9db64fb404430efc5d39faf35b9ac975a22fb74f135efad9af6954ff2f83e85c32b9c2f6b29330976116c8876ca5cb306968d48c389a2e2224d985b450bfe3cb508640a1256215aad8e9962186b9160838c1706cf91143b5a6682ba595f133820501e19581886991b55936d06f0b4afe11072d03cd7127a1ab92a75d38ee607352b8d6e30d888d4cc94f79a355521f866f059f4ff51791b785a5b4b0e0742c808113213b79a8e4a2b560c36d35f28ef7f70bfed2a8b1463209ada2c36db004489e88214e685fd18edd3c58dda9db1a24887b8cd38409bfe73be89da7fc0cb7e5b87de1d95ac5f362bd644fb8101f46d2a6d05505d9f50caa3aeb58fba675ba167488a9b8d8ecafdd7819d62c0d34edef4c939c0b0328a1f2f2aa11222abf9f5f85b11cae4e64a557b98e1f252e9cfbd1b8dadf2ac4831aea87b8de707c08f69f4eca6c262ba2d45e05e1bfc1615391ad1b1d1f34d2c2398d0033b12124b39ba96a40b653d9c4c7774994af8cb46786b935122df494b75f4b194a45bb1bbcad6e1d8544016336e274abdbcc9c9b4926334fb1fd8ec9df13ca8a7fde3909197e5d21145ef504f5c9a29469604190206f00d77c539c2dbac6c26d0b429ab16b5ebe41bc3ea6a56c0d4a8ff9c1742c1f3b505be7b61a86b7ce4def2ac939e589a42d7de47f17f226a72249ba0998ef75eb64dd0cd74f19767e3305b5a7d5c3e1d353731a08e045c061a64014dd1b5b5fab414cd8c5906e978c8667af8ee2595b927abf7055f831c5008445122e3d56df6d1a1cf0a8ef8d35d7a7526f891f32aa5b4b9a620662634e76dab338b7cfd0b8ec72d179a2537df1b119357f21d6d2cb4b0748837c17cc6009d9d01cb11d50cfc5a60cc702f588ccf8d6df667f6fd979511c879993c4a75420b6840d628caf9ca372d563690a94646579e0c5b8e9118edc680666259f5eaa0a13f5d00255be324281faa76c54e73edfe17d1bfefb40e5e18784f1a9cafc758f004da379a0c3b1747ce2d3b0e90e33494612f30f6159be257b158f86c68391c01d27b12eb19402d3bbea839f089a4dc7baadc08073bba5a11fa77c7e4f428bcbdd410f9dd331e783c7ac21643f6def65cf289844423887b0378450fdd5dedfa793f8daa9239729520219fd545cc03eee18219813dacf7e6ac8c0e1b6db0ef4c3013169e789f6f81cdb463b26e266931e225811b2de1d8bc4dd5558a926b3c937528bcf60854191503768647dccdceb0fc108e09335ea7a2781f984153417052bfc8f1ebf1498f59a828b96b03602584886d17747b253392a179c40d5f9ebb94f0e307c3bf2ebcd555c8e687dbd16fd44e51ecfe518d299cc8752e39a7e35742071d84ca44ef3978da9987a58e54facfe12214db7d62ae7c8598df8da86dde2fc934b6df311b30b03f97dad3f796ec3e4411ec9f7878182463d2791cb8d11bb95e63a5f8961731b7bedb7c429f2ebbb2b9f130f0eea007dcc170011529cb23ef7666aaeb8d52cbd5f8d50233b9782b3d6e8f9ebe0d698ae4625336d2219d13b836570d8bdd9eb17dfeb2e6e04f59c063164b3cd08ffe449bd489162f0aedef4c32bd754a5e02c804719f503c517ac736e20d80d46973ae175c43bfa8be5d4273c3f220177ebc4c42d361d1ce14c03af8db99b04c82d2aaafc48939d2b4853abc9964b4e739122d7ae11f6524de0a5a1091edd71b9d0511b54efd84e810402aeee4507ba99d736a7526549bc4ce7bfcd18efea4ee2f0c0eae650070dada7ce2dcd0548433d0f8ddc409fca79d7046458504cc770261d1b5dc5ed31fa2002ac0a47a4f1d240a318649e310d1be2d85aa87d8a162b25ed8372c08a382c641d3d73ab65b055af578d1862a173af2f89fc72b35ed2de9500ff10f242e7c4869935582b1f28a3a1393d6c9542c44b66191e5691e668d050303b8ec1a6fb02eec751fac163ee8920873cf2a50239dbaab679345f98e1a57a7c4121d2858fa634a64b01b417d4db7bb2923dcc6fc04ad1a4a7c7394b844240daae6e99407ee2dccf72e47fcfe9b0b4376b9c1f2f32b7f928a34aebbdc2be197e24974146fc86f148a482487c7ce31d7e5cf1c6f38ebc6a6c849df9b7fb7306d82db680b79fdbfd82e352deac044175ee246724b85876a3d7c68fffb342b2e265a443d9f345edfd593d36508110303c0f4d15c352cc13e26f288233fb057d87aa837419cedcb5c2f17cab754acbeacc326587b1946d3c30fb1c39bce08177dbeb7b83e0e9eb8d85893f2a10d4501ece892ba34b96ca41bfc0635c7585cf28ee2d47a503eefbccc8354c1ef84c1d2a62d7ca79be7d8771590df686de7b485ae355d4f75144905a12be611567f56cd34bb34dc3b1d3a28ba6995804e1171acf83d494f9af3c15c73d20ba0ccdc4c6faad2ae1c0822605577c82c1de41384ac581fad3b828f5ac322785bd5f7959e199ec31f5a8b27a8c30de18eb006f77e361857f3d7b1afd16b263347a4c9f4bb6633c0a2dae831f638627dbb94ae76c9b7479ec6da3a4a9fe283f4a2a7876ce4b2a78913055260c67ccc8ceab15522b896b3a3ad0ce3690e678ab3ca995df37e67957defb4e6c5f5f40bd63e3bf330018a6ee6693aa0df099b238c6526729e3c70a0bddf299e80ed19ba733e730c23c771448e4fc1354ba1c223926df9d6a06bedc7368a5e6d3b6e593b634a8182b9470ef54e934b93149c4f85277ea56584d8be090a004baf0490271ee465f9266e5abae7d1c94694cd6da2ded1ae1b42ec569267d6017efef78917698d289b06d9bbf1a74952c517bcc680068e9637b4960b30207d38e987d1756bbb10ecee1aa8f02718217c7780b0c8dc9e1eb3d0f0035507dde1368efe356320e562bb2a1961c37fecab16dd53479d0e48d6bd5d569fde6c4386d45ef73918811817e228125b647a80928e9529702f536bcb2c8739a91c5bede15c8d62e8a5f4a9bcc201bb34409fbca09efc9a736b51add8ae8d19dc623c448734bec3ea5bca99192dfcda9569464004dae50f4fd7bb7ddca984645f7b64b3e6b3a5c6b8d27ccd994a350ea92bbced803dd9bc0043bd1d1d12abf3e256bcd27ef63060a268777fa9b3bca24087ea11f40a29e93f738124a44831f480081c21a2b53d0388a8d096548d8a198a9d5d95c62b964893087bb21c6cf3449572fd186ab2bc941dfb4b0092cf32a27f43babaf618712d78511b98618023f251aa604d0112c3dcc8a510a4e9340368742370823cd78213976a2ad4d8e1a9d84b3d0dd342c31cb28ce76ce7f5d33e1c38f8b2261bce6a74106d7483d63c3f88fc0d80624f8b3942ac5ec72ba9428950c7482744057446eb45f1e1cd1b3e7a436d6ab68a080e8096820d8fd9cfe0ae6c871cbd57c144893fe2e892013ad957884a454cf1d9655036f38a5bb512431e8ed7c34c61c784f86577450b557cff6691508cd9794558b898823fe3737d56e517154ef2fc5ed95be58d10a6e745faef16022436aee6233fb7d60b68239459baf748009ecaac530ad5410f85577bad3227dfd502bb1ce008e961c8060c3cbc518349e0bc50fbed814c8c5e4b0b1c68bed0c31ea5966b00c7c9f38b0de022afc01568eb612d6b6a6a51fa7fc6512d312c5ab968b6f66b9dc09ea9026221e3d8612405e8471eaf3bd033c457725f541b29870386860031077221cbf5c13b48f7374ff4ef83be322ea49841630ed1cb1b055d68c44536d46706ce570167d09725683e209304ff1efe09414a5a5f5260c3e8f2d7db009906e3e727a9306a8d7d7a7e5660c20ce2fcd01a39d3bc8b0925c2146ff35e1cc6c233f38a53270fa91ac6624065c343919e058f387adf81caccc9552d030b0396d650e193a1f6e803e917c171defd6984aa4a8094f14093729f697a6a793492b0ea485ec70acc570d94276f78a7b2903572d3e9178c7347da900934aaea4e41774f4eddf6a9acec799f923c1bf5bd9b3a57bc1d64b63b62af9524c7f37f224163a881119a0e908f414ee36f90425f22e2d0e78560763b5b822b2d47da38e2bc163fcb40274e833019ba4ba7c7305b2c085f4b7d5609e15d7fbdefc7aef9a8f0a02b7699d603c3414a8bc11f9e8a4b28dc0a14005f389294d003ed9c2a3180077c08a8e06d281322b162a5ec1d79bd3f957a9112d54c6117f849ac49be8ed55f6590160e7437417cc27d94e198eb9b7ba807106fb195618929a03a11c2dfbd9d6ce27e19bf363c885b0d4ad473e382145a7ba3159072c9703d6d5498ea34fa14eda0d50a79fed5062d5acdeac0a2420ac44464e0ed9410af515cf46b924fe2368fe1ac53883502376de37e1e8acd4947f1d18a15f9b83a726cdc58c2f5873480b384d14d3c84aaad74341babe1dace7c2662c60dbd6e4e27b3e41484a346750805dc564fa4bdc35d269e5e05103901887111ac6e122ead54721299ac23ab2ea3ef654510e8489fc1eeb5767375641c1914992d21a94176d60b732f31827356c832d403b29b9206920d78face0638e4c3fbea721d45a59e86332069d447d8f1489bc15f55918ee837d837c16c9e65ee1cd6b5d4d794dc0697bff94ea3dc2791b1647886c9030392297c498954865c6cefbdd0788ea7555730ae826ec52564981ff0222b04a6d5f91a32fa01462e80a1e37d1a1bc237b64db9c4bbdcd2264fc61d67475023731e2f4aecb4e4d31527070c83b12f1355a7ab60eb35bad37879982994e211406035eed7cddf7fb3fa18625a94e6d9f066141e7a7589920cee1a4ea96a4685d5fc05707d03b6d6e96d799742ee10c75fb97cd48e2bd14879406656ad5322dfd993ee154cc289a653ccd4b80c25eb66c3252257c80b15e20ab651ae4d55cedf41af565a07b402b6cd825ae065765c9344f5878055a22210fcbe548918fb3bf6c8b7d99f61db9d3219aa8fbc949fbbd0f6ad2d2566e2002a5977c04ba49a62eb9542d9c1e615418275bbffd856f37b549223b6016fd82edb86a0db4d69bd461d289f16237b11a3f2415c8b5a4a8555b4b01990b352b0205411b65ef2058bbd498e864a8cf03a57aa45c15323f301db16adcbf70498438d9e1dbfb31d26500656585f8246957b7e1f2707bec7b28994aa4393f81c4d10e412bd8b69efc7f1369a1cbadc6297437c2ce4d70ef25c4ef6da26b2d6eb55e9bb3dda11b7152a038c0b1b4e12579e9247f83c8a8528d20b4e5322ae1d99bd5ad847081089bf97bdf46fc4d41b7e7f20232f48272b3de5809809fdbe7eca7098675552c5eff02f4aba9acba941c2f0092cacedd2e6725ec4808222621a70d2d86eca0e3244e1532572464dc61f91856be389b124c3e3fdeb3c4f85d27bd143e56be51ba988b9b109f1d06f13fdd28260550009bb170487ab053fa31c8e61a3db54c015f6dddbb43f529106b4ffbd454ba69632c0e73c217650983b31e3cdb50ff1737ad192cf526c521505a331e91dc550a05a79edbe16cbe347455e7ebdda65a6f14a6f6f6eb905c7aa21688ff6fd47681b78aad246f12d2834867ebba6805d2ebcf5813d82e555a565a704962f226b5c866652708738ac267cbe10c8c4df881419c815b28630c0951528e29fe608615170f854a33d41567257b114f89522907f6329da7755897378f04faaca548296abe7c7d509d0bd7c14137e62155dbcf8f260459c02d74ba98b8c908907e920e5135caef74b1ee93ca54df87756a68be4c8a8725a769ff8126f44934b24b6ebf3062e7549021716893fe6e535d6b67eec3083cc142cceaf01bea4e09ad7fa0b0056b5475ac2d4e7fd3193b2ad55174a1c6cee18407572890f93429ba23936795c0883db8709be653d28f0da03ba2ac9d343a99e43227d245ea49ddaeed787c33b30b1973751862f7aeb44ac75b6404725f21a2ee8e9b13f5176cdf9494527347e18354a98c83f8271db1c83ab03eaed965e6770815a9912b59ba20b3e4ed1c64baa28205859602761a2ddfe53857c35bb46a881c6baa18936e2c31145c44281b7c705ff417ea94bfe8ca448627257fed3207429a54de9be0eae64e864ade2c28738d12dfb8ee8ee4091cc9abeb7088c409e5aa932c299a010c67cd61c521a607fb6dc170750ed0683567c51894d10157b5e17390a34de85ddb9464dc831c7c8bbefb07a49bf8e4d55442a3a9e135463f5a66e41d659442c2bd2d369c0adf14649d90d27ee504dda10fa404372c6a07158fc1e60c1b0eae4da4640fb1a515a3bc3b024bff4e0e0df4b604ef5fcfd7e3f33590c202f90df1bccb690dc4d00335e525ee901292f07cd99af027f09486bf1d508e560bc373212d816098a8b691dabaddb86ecb2d0f380f5520fcbf1d97b2331f83befbc19454581a84d898808be30bdc7f654084900d1f9adfccf28f97073ac641d70760d5d9dc9cbe8fcbfdbc091c30301b0a06edf42c80a82c202f1b3d3b59ea3d3d1c20af6d52caa66deb8e0a5700275787eac313e346cf63df4eb91156bcad3ec4ed048a9fb3665a5cbd8441cd8573ad114c1b9c2d72b23e5550f0e2afab6c5ed9e330dda498082a0baaf6cceec1bd75520863c64f5b0e50a4e04757450f09621c958aad3b75ae767a2007849f99483344dbb63f3231e1b93939f7dc0dda6612e824095c87e263512a7dd4f7a4229b3dd493f75a72170d7587afa257364c25e1c27f3029ee6929728baca368e16e581b6c0b320a9c2b2dcd660fc99c16f6bd9ebcbf243a58562864fa5d0c9211101256c7afc6c036da2b1f26b897f3d3a7d96e5dd440b07fefb483cceceee3a5762debcee8e95ecb7467631f689bd2f1a8e9ae33ba3752faab98cc394d777d5313b7f4af0bf8361de743752c44db761a94b83e133236cffb4aa594d85ff2d27299e831d446fcab59a313adf57d11d30caa7ca96926fa91653c2a334f40683df55681dc32a3bd5d65f577668fd9aab861373ce75aafefd5157fc65ea35d10afcff77306373ddad5d768fb82ac9f8ee741a3dd5d4dce3aea870bac68d99800fb28ba5cce1179d3a19756584b154fef5e086edac9a7a9493c275da0f60eac58e6f2f72c1cda9635917c0a6307efbf178fda23d793ab70dac3ca025f42db233db457f00c18b1e0d7d111e05a3fbdce3caebba17e8a862c611348fd6f757d547ad736ddb1b10cdaa6e93c6e7ad79b3f95a71924e6773ace80b6695d8d4f9bb17cdc74d79ad68d9556e48ba944dfcdb7f5799786bd38e90487d69043fb3e0168af4899af8839eec01d4a8bfec7c0b6951c1e1f683adb94631c8db9420ff8963d6a7637d7c90b71187d9107914a42dc55affb84e92e20c3fec67a459d6c276abdc3549325b985a0e7f747c34522e5cb5cc169575e8ab1d2f6aceb5efe2addc269a97dff02c102efdc057744e3ec89ff5638cd10a69ccdfa9b0ab19c0d0015b7b6ff36b22b1b30cf9e13923f63a86a72c6ea736a06267395f93781c1f7e66ebd3ef8ece3ead7a94dde93a7a9866413235c808f28ad1be6c18a461434c0fe7c5f8d54a4036fa7ab426b92a1d7d9572115a9c0f1d81f68a81ac9cedcb325cd06245223f6d7db385eaa2e93e5a05d9940364d671cc736edcc6348b6b77a13e85ccefff4785518452836eeea8f4e995ee564e2ce64b7250da878897f9e696ececb440ea6969ff664834c4d82e922c3c8b7f655cd25be29ffb92b3ddd6bf394f72c7805ed958520493411a51068efe29dc4bd323ed7e44a9b1bdc791bcd44376b3e400ab5affc235c3151f49f4e09e691e1a0a0c7975b750a3f41ce0e2370ae3686ab520fbf6a50a3655b58d2ed3e35b7aec02a02d841c90263e08d0036a5ac419d9325310a6b53cdc00de1da6ae52873e6db704033168e94b81631e41a50166c1ee95e71d925fb33d500237b1006e3d3685e18bbc6e6ec485812590b4eb9725c1c690f853e81c352a5505aeddbe3bcb41d67129be061cd9d9036839f8c1c111b3bb15693ba448af104d669031e61483d8b6bb1eaea46245bb11babb936dcd721d64f1cd0cca0562634cf7e4dccdda217ce4c95a2f915145bc29b1c83a0115428c945bd1d087f4e08a1081a39766a60a9f860b093117d2a654c2cc5182880931ad5f136423342bc69db47ec04a15c4102b76678aea5a8a889ac4775596e68f7b1e906147183f15db84e984d95ebba136ff45340a45ebc3118c80c5ddca396c91b0112a41c3dbcae110b52850e9ca603dac4ca981adf496d035ab2023826dc88d2ae2069261803ff34da3478d4439ad6fc53cef98c77718198b4ce237e68d14d6e18ac42a1416ecf9d40d9698a1cb48ddb57a0fca2cff475d3841ade192fb9f27a507da9d90988af1c1f32341e32c0e2c05e7da06519bc160fd0a20b94693d889b00b3040741010ad39d0f74e074c48e1cccc3664547e34ff39caabdf79bf3c5277216e3d4ef07a8313510df07661e72334165af5cc26956aea36a76b0b15d380ba68d0daa9b8aa95ea218a64f0dfadf9e62a3710c8f8cf520475644e868c5afc99d5f533e8a7162bdff50afa1f56c5a978ee9bf4a0da4369ffe737efb4037fcb53324002b9b7073468f9c9352a7364d168a5afd6bf0194d097b4561fd2ff81574cc8676643f6c7e91f702c85f4a029dc304afdc62a4ec68e3dc2a12bc2f0593fa5d7db44b216b45877a4a2d0d7b11c48c6235f363c2ce0f21a11886c4344dedb6561415ed08eb4395c24d56ea68534f59c018552c069c706a1203a647504815b3c0ee945729b78f3d678868eeb77c4490ead99a3722455b7576e65961dcd23043c252ceee5e0169625ac5808053b112e20b0e2d15cf6b55213d8ab903a0d504e722ee5d3a1a7bc4d491bf1499cd5f5eb171a8146462898432b63c17fa648c8bae26bd13e8481c01b84d3032ec567573da398dfd491420f8ad89c476ea0b0e04bbe050f32078d8c06cae99b0d65e9c93ec2b7ea1fb8b767f5d312de7dd3d6bf3a8458d4fb380e3d4558f8a2d5b9948d529632863ff3e7dcc8ea28c1939b9f4509e471ee1a0a85a07e496a9ad43e4ded6785dc43d36471eaa085dd9feb2ff5194176d502af96e054d46e564702731b2a82f387a1f51553b0a64492ad26aef1fd07b22252877740331f026cb67c503b7edc53cb5b319b160328394cb53217de0c9ec378b70b7392fa5f48084384fbe415911a49a463cd17d0bc9c7e3f0fcb832e7a65cca4f8cf2c1cbbba7d2eadf0deaa157518127c1957a97a3f54d7cba1439945b81a403da2232763a3e6f44a10311bb2afca59c3ba3c6f8145271da22a0d84025f8777eeafc5f98e36fd0c1a62f8fdbe2b1ec3839af7470be84ead429c1aad7be9b3aa40a454727e1d8f36d098409bd2212d9b7b70ae258edbc9da595bd91f57e4a4f73211c574a81a79980d68ab354b7506c37c70515ccc647d0275d917a2c99ad264273e780868605563ac2520de5bbb7e83f998bdc82642f0fd0c81e8f6f8354fc30a526c77c9bc033f648c9f51b4ee8572b4c2a6059d3bea96c6ec8fbbef943e33a8b8393596a48dc2f3574f2b84fbc735d51cee8c7380fe0235b2fd9bcf18225096e7f391b43a705a61f1cd23cf8dc30c08119b5102c14a525fe835539e4c91c1694fb13f85532fcc4c26ba70f3681f2b0047c378aa29906bea029e33700b4f75d0c2d57dd0308131aed3958b3f1b04566685822947e31a1c0c521f20ff473f6b4b41acd5ce3e2ced0e4388e7c3a3fca49b227d24315034f851a23b19c2702d95ba574b7bfa6b6f7e2a387e43ab4b4b735b03d7061a0083047c9ccb51d4974c37b17568123343e9cb3f78038476a32ff1d2929e8ca57bf0679d57e359cf43bd4ebf22541bf8474e904465204a4af6723ab53df393ff0626ee240dedead2fc64f2346b7cbc8511de14e2dc7e9339944b98f82b710b9585133688588e63e88921d6825f04a00e07e931c4c610de5dc42a68c87e15c46847ae4e832dd4f487fe3eb0bba9d203ec6d70ee8c09a49d15b5b09b74481d924a09c55552e605d591fd530afc70ad80098b1f73be4e2c1ec2ac84378e6ae29fb011c686fbb683e669bf3313b375d74f4d9c334b2931ea89b79e69c1bcb1e59a3243ac99b6ce0e9f3bc7f51574b0a2336c0e1bd5b7c38133b641b2faea0a17972c613e308f60c60f1ebf037db9a3f87ae0349b43f463312d59442bc5b15832f457292a72a0095cda79dd13590c60b9747fe400beb1cb1422c12d1bc2c1ec30e9388ad220948074708568b47996c4a3f6fe18c168f35e1877bda4caf9f9ebb1ad6f39a93e8af9cc652202d35cdcc7f4d738252901661639ec3cc07c31b1cd417c03c6a9f1df933dbb68cb34da6e10cdc68480b7a23ef02bf4d1c60dfe14a5ec9a18c124c07723b7ccf1aa698d52e4dfd625a29310156dc5cc2c76e55a9973e6c029f5963294c858aec6fb8f7c1249a9b5fdcf3ff2b68a8b008491b5e2baefaec2c048eb339f733aa4c9aa8b0e9a229ff163699d4f2a5315f2f04d9cfa090190f6088201927f4b3283899d40e02889e829f3e0c4c25bf27b8b985d59d333da67a7b710bcb92bcdc08c43e228943bfb54a5d04244e0aaeb98fa126fa1eb8db2356e5050d40166bf558fc5a5dd7bad7a757cd56f88b821a0b6f2878031c032182f2b9d558398fca602a41e200c626071d70bffc45b9e6cca51010004304a0aa504edee7b1ba2af055c38b0f0ddf12b0f99748267a9aea415d6296af4c16d61bbe9f881583dd328fe9a3253c67f65d084bc41738010c6df26815464722a9518084daad44115ead00c7c7090ea552248678e015a06a748e560a2e3fb2ab8814a15b3c1cb680f322bbca546382183bad519e46045ba41a9b2a510f0c4d0a8099fe3908565c80f4a4327841cb084b6fa2f3892282ee7b5ba44f2475f486215b4d9aaaa172ecb026b630978c13139e90649175cce4bd01798aa80d591e4e2e39150e52f4dff2daa941a78f075a0ce5623ed3f79605a6ce5454f0033b334b117dfabdf554871061f59514ebee049abad06ecfd4e08aa715f29a83b44062349c7048abe1bffedae15c974f408b94b6ba7879e4e713fdfa182f13d0237ee2465ea7077ed903002d38d0763a50b3bbe3e1738f2551e619675b59d9be2df2590a96f71e6e30ab547fbc496fb8d41b1bf7f82249d436431240d9ea48e76e24de09f804e35bf7bd1e5a94cc4ad35c5c2c6ca074552671e69c1cdedb278b770047b3959dc29ca091699ecfa61594340fdef3690588a2a5c1ea5b81d982ef24cd1ce317adccd859914f2f935002e82325721b223c4a60ee04680f45b9de2391930e24ecdc21054f7363fdf43e7cf5d3fce74be188b9b656238015755dc7f46a522659e2e4a385981fcdef9d971cf197399e8e4c89f26c8ac364478e5c606a4cee478d8e6097654986acd1dc8ccc50b43fa7c1855de47e6a1c697e4e8beb5d17cb4a066f3e116b489df8d7c442a0b2b818727121fa7517d1509567737f3e5a486b7210c8c239d30be00fe17a09efb66297b1dc6eb620f6965096794cf0854a14f5797a56c08c6130fddfba155ff0fdfbced8ea119d66b9a6acbd3ece6415334daf99280998af37e74e21d4f92e5d84b9f98d2903880055f5fea2b285a6e915ac8c5dc7e52f0b249e5d6195fa8d029382b3dfba3f81ca7ed08ea9a7cae3282abbbb30901bbe26de459d51146316f763290652a8a5681b4199ffc1de357caef374d535ca3d3c7fdaa4ff149afc4deabdebcab051cc9edd56eeedfe975e8cf28c397648fb4bd5f1d6142888764fee33693fb8061a5c26bac75d72d4ee1c0d700dba6d13c9946e2be873bc9ca0976edf8b3576a90eb43b1ccf6483aadcfe3f33aaf5abcfed50cbf62402bdae47ae2fb6e83f070c89d0117bc9964a53badf25ce9e531a53e03ba09062584c50f8e74f4b9f3afd26838a0bafcb13cfcccc8cc0b6bad8fd90a12d6194c94c49836ee13b0953d28c43d581b6e546de9760c02363a0f191e257fc106e934a937f57acb0c87e7a78f55efcde2263f9ff41f9a0aa871f2d781eb396924c4b2e2923c4a779382c9316eac7cca31817f1e801ff423e6ea97654289732447c52202f2a646129cf9c436d8da74cc3ba3ff4dadcc5a466fe71d36736091e943be5c025c8444ee496b9d015186184960b2da4529001b2290b86b3a039fb18dfbefff9e8472709aceeb1130c09baf48be881c984c1c1435f0ed9e63085804947fb07768b8ef55a66bac4df6d28940f037cf63f5248582268ed164c0976bfc12295cf13e2ad10f186279551308fea900c8760e7f90877a0a170fea09402e3f66aa37abe8522f54038da520499ad0f59128504bffe5030d4049973cdcd07a127ae5523d6ff0400a220a5f4712b75234c2f5ad40a7f3598e61f19453bbb8f795a2636869b2d7e4c03254b8260879e4431299970f73d9069fd0f86b541809c78382a9d462fd237e57d175631caed1b4b479b4409a74dc5148ad57efad8f052b867ffb347a96bd694bb8ebc03933a5aefa8f1758b65c24c4822de363776e268a6eb38bb2bf40a1edd459760669c26a231886b8df9dca3c11cc2f1c16830da04c16c00eaad2b24f33adda369fb911ad352d597285da1a5e5aa20695d9fdb6d3a2b72852e1e823210e28ad60d6aa313aeb9ed5531d20491868820b3395aba57ad3d676311a1787fa6f5c1681229bf4c881e85f213274bf8633146df8a734abbec719215f36f48a800f7776ba10577ddb0a8b7931d89124de071f6bb51e541a5ee8101bf2bcf8b3efac10ca2a18c5f2458dcf0bafd43d1406e488ccac7b3d44a0bc7c771b45892b408536b881c8e85db5ab2b1377dcbc9a1a87beb8ceee2df332c2f299c1cd15d84481cde222ed80ec0ac19e938cc178ed6e2b6a31b11e832900e7b378f6ae5308a92d9bd4e4ba44ff5759d3b66edf4af3836bacc4f7f40ed7a4a1c6eaa365e8c855af0b50112e7b84e22964f94bbe48955899ae2f076dde57ab5f24364fd44b003ea661909756d4e6e4f5bae9f4ff50e3e54f198a11e57b50039f9913b16e65132f69cd87731eb897a5df46d3c0e99ba431c7374f1888bbf723e4242471d9890cf7bf8b8af051ee9243949f9cdd70c07651513c4d5109c87019a226e3b71a5f039aeb27633195b3f7ceffbb6a0e9a08f9105d9ce32728fe9c3cb440b6e275bad11ef5e653eacf376774a576affeea98e7f320bdfb149d1b7c0d56f436f3c0ef280c53e1e9e803a1d9939956397d5cea3f73f716075bea52fe50780dfc237baba01d050b2e6eb0e9d896b4e90e06d2317bbe08a7cafc4a39daaaa421b1df71ed9a74db41aae9c6af0c6c1ee12ea63887aa60defa82c591e991c61cdc8753d47dd09287de0d1df24b9e3960bd70bc3c36155229c9494a2fa338d489d32a34e02a9a2d679b72097678f9d0c9c6ae53abf87657eedd0fe9a956d27594e0c8fec1fda4b77bd701db54bcce94db13b7b2bd77fbc516e06d305fc73c2bc5b691676bb64ee757043593d06e9ad8a907f88cc96bd858ec0a8d49faec91277afafbaca2e35e6067052e93dabc5bf2f36f74748970bba5cc63de808cf04d7360dc382f79742ae5ad81cab9970394f9ce7525dc3dbd54a603f47821459215b1331d4e7227d775287f9baeb6ee79d6b1da4663705fd0eb156ea6d9b15596899a8f19d5c8047d15368b7bc674de40a6193b3daeef44d0821c9e2330e961d046b9121a1b040de22d8aae2ffa247028858f9022dc9614e419845e961c880d632ff5a02cae336014503012da8bead62e574809cda7001c9cde1e69e31403f80b2d7be052a2983d87724dfcc3e477e83259e275c4ba1f07d498c6b0601bf36559df1bd7188543fd8c1917afad596c1f20c9a0c7bf4b5c64234d90cf223f9d08602012c3c1c64399a42498bd5c91c58e48fd760051ce14ee9f5fd2252600fbce4f3e0803c00303a0fca21ac74d1fd46de1ad442a3883cbffb2d272b5e5fb1e6073788f1f9b1bcb93655a2a05b1da50ab9a26f1904a0d0c84e85c5ae9dd66ad741ff4d183cdb5eb8fabd686f2db866c1b404a85ddd50444ac33dbb944418a29564da730558a1769be7b8d2f967b55c42b08ba02eed8249ee5743b7f41f49cead0d8c94ea15d8b2d7ec994933f602e254db65927ef6e8d63a3eaffcd603db8ad3c7b32a8d7128094f750a07a222ae1d3398b9f6021385dafeae8033af5dd20cb0ded8bc16d16068546291cc01dbec1a4125f2d9f0baf6b22341d039dc5d83455985f25489b2b4d7176e85a1bce6fd195e10981294b5066cb39c2944955e8fb49ca003b6cc47946e77e6f60e959f9dc34802313e5b6b0bbddc4158e43a81764300d30f047aa9d5dfeaf8111e6e30e896870f854a486be804e4b420807c44962ac480a7e83add53b1c2b940a47ab3c6fd88481fabc580d68d52c056bf1daf20419dc066b5a0706fafc0c99e0adede24ad0b9b587781428bd34b43b648e7a9bda3c7143af77103478e447004e139147d724b09e6316c3fed4e847a4e3b2ecd5d768f9aceeeb54708900fcbc9493dcc9936a5dc053fd044478376737a08acbacf141177320c10340f67b42eab2e6185b4bb04935c970be2d5a41d308e3fbb4028a78703327307447073be2d237e6c42e79dbd3611d00a288d23606034db9b76986459ca179f079d55b7467fd56e0896d6edeb6dfa4d49f13cc97cd34b63350b395e085b44e9f534f6d882695fbcdec75917c21dc5ee616255ca1b89d58954338c8de937781e0c7d5448e6f5a311b564f323825b3257f0567cfbb2acb98aa85812041aff47fe7bd4910e6f9b688ffc3676fe5614e1c1e08dbe091a4f83703706f14e8bf9786b71a521a16811b33aa78f20dbf8079ef71eae7b57396e25d80b0fd1ff09b6da83ed69dae704aa9855475497e2b40709452c50a2580ec27797f35f7d947812f551925418f6186812047bf0ef012dc505c4c56336c4e44db1c4a9a34e14eca06ecb131951fd700820f838e3adcb9456ec426f15c07a074f32ca56e39ee3d3591d76301fb6c6b29822fd6f3c01f60f55a5ec7c8becf66d2e7947d73cc167275f744ae055df1409aa33f79a3346c67559ad131dae6dcecff332f5fa1808682c22a4a635de0dc1516e256011e678f48f8fd460ef2713428f52a7fb145fd111eacb0ce0c0da3348df8f4f862e765e46d7702711ef4a4f7459c4612dccb9ae93e890330673a1e87ce789b8ba933d42b5577b90b9ef3cb32931c54aba3b4ae7aac45bfabcd4deea89e9c8bdb573b14881839e13643dfdfcd931a904647de520d2231b27dc54b6b341b2e1c79621094b4b964d44ad6993fdace4a7363eea1948a0f44a4f8166938d3db81bf4d1165900916e4ab7b8f918ba70f52d6c0c340890c194c870539e6f5a32b4872ac34ab354624cead4dda695f40fea2d931831ca4eee969d2e1b9e580379a6274fe517a3714da01ba642bf40d23563d0f4ccdfebcccb9a65c262bfe778d8fd88b5d3f221dd40a725feb36ec8b57f3ca92f4647d35ee74e22de8dc5d06a97a7c7c62228df1d1f41ea9e76e6b4d89a09226d261248fb9fae2cbaef719bc65509e7963a3b2ddd1b9893411aeb258c18e3f4d41d1e8270e23b243df059cc768f9c6ed3b82ae186d45219d013004610079ac99b6562acfad44d18b4f52a0b793f3d8bc505d736a418f1ec5e30b5d290f6044e62bd46c4497b0df7c4fbe354faad4d1b32f6980d45f12993246d7aa44b2632f1a4675e22bac209fd62814ea2345c27ccfd3eeb4e29fd30a7a701a98f64216343d369863212eb4363a98498d4c97d01c867c8fd4a2a1eae15a1054265216f9f89d3491b48b925140764e7028a18e26a5c4090b24a07adf8df33112e31a78274c0f56c902e491953524573f29b067e58011ae4a369d0a80f0497eb645fd80e747c0d73c5d6ff2c6a0ff8822920e6a8208599e02f666c9c3fa124ca2563e000d58edf24217befbda59452ca946495065c06e506f657b0d65a0c65c55030ec457360b5e25f9bba9ff29ee5b558ad489dd27e090d3179d20e6574773742838bfbb514a6891700044929ba2007e407028e280e2fe7e25c3e2fc3bb389729378cb89f6bd1c204c63674034829a53e5a524ab98d90da21c618638c9d9b368d4bd45a8d86780e6cd204071e9e34597aa5b0dcaf972c6132c4c885fbac0d7a36e5b54618e22e3fd0f21c5865adb34ee9a325a5942d1faea365f02ea53a1f2d10a057800354295f051dbd937d20c04180383d42b02d1044a81148f654ca763c8ca42e86b56c954d8726525dc81fa2703eb4773353a7b469bbbb3bf4a8378d9bc786535a9aa51494d2999259b97cddc049c13962db72514e38f17ed24f9aa8a5f45157c1d24f7a4a5369a44ea2d39d7421ea7ed274bf66125dcda4993449a2ae44a92bb94e3c5ae2d21495442157f22e3e467cc5a038e45370f0dc045e94210c727c9764c0223b6390418e41f9abc99f2bb912539463ec70bfd924c79f4d8c5c0a0eb087e7f9643219813dac9108c09ca6017af1b930e16602717498b05646600f7b2473a8b2565aa9bcf1b8a0935249e5f4d19a924a4a29b5967eb4cf8292e12e37cb7c1b62e2724ed9ad7ea1c0021326433d14d4d4f4b5a0ed970951a79f401b7f4c44d453fa9553f8917b29cba32c51c8ed55beaa9427b007a594ce18638c3176d090934fd97c1f641861077514006d22c526409cf83aaadc8ff553ba377d52055704abc85fe78fc5823893096bb509c17e397d49ae1ce2a57d07d4f3583e80f464c9e21d5549525acae2395f7b91636769283407cafd1a0b1625da5d5eb854524aa59452ba7764a2944e3a870089363923c896625625abe23958b2a4ac4a16024f0030b85f4625a39221c56c698b774b10059c52ce1b8fce3a67f5583b84ceb3569e39dd638c5718a55644600f974c521a49e213b404a909d34b6888099d9f3702d29c736a2c2225400bc5b502c2d752480c9153a90f2cb491f62190a863244626a4d4e70023dd7c4ba711262626a01764ffd96f8489493ec46907741f0a596744600f9746968c2860a0935249e59c73cecd5aec356cbe95944a39df4a2a27b5f2b169316abbafeb9cb56659b5c18d17db9b0b8249f9a273524a297dbd86b8e06a6031d56dc88bd9ddd3a77c49306e28a5934e29a5cc52199030ee855eb76f496eed6cf48fac2cdb865649397efdefc67b45d4be225a1979ceb792c14a871591bb3b248a2c182277652f4df98331ca3a18a2682302cc2b4bfcc1a3f61551b4f7a63618a21c5d58d7410f84ac88a2cef6764594631320d3d7226cb7dd07142b5e4d0ce566f7ef5d25d12c986ee69c74521f2de8d528e27eada3ae690775788eecab05e4c60df8ce015977b1d4a3d05568ab0fa137a59c73ce99794081e2ce778e84e830ba409bd0c6b12c2b741a7cc01e934a4a279dd247cb8701f207910c106d84104224165201e04ebf007548dc4a20ce8d231fb0c7dc86e60e4d16b6c750eb6b4e31438dc310582c88e359bee417f6a6de83fed0e6c777ab7c492d3548ada0e7b17c00e9c9e21d5549525ad2925590f9f3bc55119e33e146d0432ea76713bdce0ee0f6804464f801803a40667d2f5a1b530ec85d9448d45a0b7bf85075e2db565393815c715dba6043424a79838d8a76d8304c29e79c736e2d8872ced930787737a538d88a0670e3710f4d883a27b874539915b178ea86401b87ad2316f42c0b26653924b7c42924794db34e8190c10e4d4ae99c73ce2dab107a18b598c56d60cea969b469523ae79cd35f99ca6e9f4f70313ce1017bb8e7b17c00e911cae21d5549525a125ae26448484a29251625f2e72991a111466458008f00508701d026beb70088838beed74a3c25413c600fcff2c995a1591f565aabac92fa68514a69aa88522b21004770afd65abf521eeea574c0b00df6702eb474ad9556eab8b3581cdddcf0f83182093a2cdd5049c292458bd4c173a4bcc0480729a5bcc93728a5fbdd3411770316595049e9a453de78524a691fd6409bf9a99c020b3239059f2c25a494b6ffc43f33d0904a4a279d128b49b9155b2d5d76993d279db46fbcee6ed8ee274ce97f2d1f9e1367f794b3fb3c723cfd5a9431ce1ab496a528abc82a58a848aad2425905c9724f67e87e4da5a934522f49211243f849f9ea00a4944e3a7db466ad78042028f0b621a9c4ec39e594eddedddd5028a4325af1a0e7bf7d2be4f6b1f22555703b2c4bfcf292ddfbc21e313fa949b5065183a8543ce7ab32a8473508da44a4eae872bf5a6b559a73ea404a29a59419b2503a686702f6942fc039679db5e668bfc9879fdaba865ef6acccbe8621c4c99e35047b37555c96f360719ccf27bcbdf3ecdd1e51c71f8a70ca157b10c77f470ff7abf1b8aee65de76687d195b2bee72d17cb24561d63e9d0e1698e45a1d59861b4e91104dac81d3cdc772f2249f92b115cc823c229530c04e2c80f5293e58b18f7b33ba0cee60900ea8039dedee7792e63a0ce667ba75f8339f4e5a360ce7c9a944c4c4739dd8610976788920cc337aa86580c738d192e05bdc04ed9c04e8bf55bc8599611b1d85e6bf19115e6d72560dd11faf36bf77516b3986547ea63f85b2185ce47e86b7812793bf1fd1829177a51e7468e7f59b115dda2280d1a5c69338ab8322cb89f7c18c44676c9024b67f81267e25e7c9752caf92a49f3a92f414564f5335f047f0dfc53e3f1cfe0d44f0afb580c5d33762695e3f1cf55f7f37fe53931aff992232efdaec330da00893634af1a42438355b35d3333dfae99136a7c0aff14f5d4f8d4cf60d57cd5abf04f0d5c2483554264beaa84c0bc7c98979f9a799a2f92fa1a9ffa1a0f5d2bac9a5ff3402e8c555ff33daaafc13e45dafba8b257a1be468555f555f3551aeec9f1ab5f611f558655e8e91ec797005d3fa24dfcd5d77c91d5d7e0ffc1817d3aac54047ff71dfea9c126e01c5855b10a3d359fe34b80ffaa2ff2afc23f453daabff13f39b08f57e4c6d77c0dfe516123d0055d40ae0f22e5f8af55f3d0a5ea1eba70fce7e587ae0e17c1bc7ca8f916d3bdbc4c07f3393a1cdf75367ed5fde3eec637a71a32f3453cf8d44f3c84e64df00017c9af01800772cdcccc78f000c03e33ef012e9249a57e66e6f1ffc068b3fa9f19cc02fed47bf0190b0f308c36a91c5ff3abc7ff75d0ea73fc09f86bb06a488e1cdfaeaefb7675ffc36b74aaf91e3c908ba6534dac1a4243837d8a26eea9790fb00fcdd7e02298af21b51a1d0da6f91bfff3ff4383fbc6d7f89acf585c1caf226a2226385ef5ff37e23f8e3fe1c6abb06a080e1cdf2e1b36be5d36fe8777bb66d7414c712f7e4fc9711cb1a4a324a4a4a3d94b30f7520e9918dcd597ff1d8eee57eecdbfd1d9e82e122f4bc0cb47b0cf7e7bc79f07d4cde8805c34ba1e1a3ff3a89fc13e4528dc33e369b08f0af5340f5d33de4785c22a22a99ff922359e06ffd47c8d9fc13f453d355fe37f549f7ae8a2f1402e1b755259f62bcf397d96fd8d3a342a22aa4fbd0935b86b3ce454e8a97915f669a66813bf0697005d3d33f3d0a5faaf9b7214a2fdfd8b8fa05e9bf9caa1ba77cf3d98ea663a18b30e7b9f9dc452e541ee09b9171f7b1a1d74cda0ffc3dd688a3fb176d2496d482e087d0c0304e3335ad4d76a77d58610d74ff63110a04ddd2cc7a365d8a92720acbfdae1b672fd96e7dcc8f5fdedd265aa35beb7ea8b70ca16b7204efd1fbea387fbddb4807430dadcb05cc747cbe87e9feb7ffd540da58f61998d3663f67f78b56fed5bfc2171efba579f75c4b5ffd9ed85a8b27d1b755a6e53bfbaea5fcf69b957b5bad910e2ce0c7f56d9940c9ba9ec6b7ffaad5359ac22b27df63f3ec330397c9e0a7b0dc32a2259f6a7c7b0f7d94e9d0a7b14767a14fe41fde939fc53d483c227fc83fa0cc3a8420ff728ec634b80ae9b4157c6e242976a48967dbb4ea76fd709bab82295100a3374d91fd17aeef9bb37b988792071ad4b22a4b7dcfcab7d6a1fb318ee5bb3c9d0c75288ddbd79769d23ee67ad05cab6d6c6b0748fc752acb9d76c77a4fea7bd7dac5309a947b423da57ccf56f9df158cb53f187f15889615d2bfeb4e7f0c4a8049c84f8f575accc23dc671bfe80f26623d67d2bf886c45fb3f893d96258c6fedb62eabb9fcd54da6d762701ff0c1fb14fb12a48fda75825a47efc2a83d4b7f883eed9af365307ca5a6342d2feface257b37a7edcf3eec29a534fbc6aafdd9a500339d15dccf5a1f20d7a6f900b9b4ffac06b9211b90aac8fdfa147b6deb7eb4f7e17efbd845fcc33191e5877bed9bebe1b0fab33b01f5a7ce461bfb154b1354b8211bf601726d4334ecd32e1b6d2a093e647baaf906b98a3fa09cc4ffeb1eb7c2c418d99f3621250320432b4d08e5e64eb8af611fee2fb6d1666212fc29ea4f4f5fa813e26baf43e5fa5bd4d6fd6c7f7a8d4e99bb6f8598eb37d602eab9d7b48a3ff97d3e4ab560ac5f67f5c9fe01654f2166bb82ccfeb95f285ce47fc23f1c110eab7ab48fafbdbfcd569ad092e16b5ab77ded7c2cfd862ebf14a8bab674525d1ab8b3b58ef872eb1d0a401dd1c22a720141770866792991eddeb7c95c8957b84eee07b1503c21c7f26e9ea4406ad2a56cd97ee3b9bb639d7dfaf3a5acd6ce5f2195bb4e3b2db5f66b27a9c52a041d84d12615574617b7e0b78d8eaf1175898376ba11e54aa79f7d115a24bb7883146612c35675fd22d9d7fa3f12abf85db221ec1d0bd3e43e8b156fbc51de88726386b0b920ae0ae22fff4a114679be3f50fe60c97b37553b9f800830f334c4910e71e43b179d7260a61042e7293b08c6a01833b071c9f1e7c604714e33c0884f431027fe29e8b481de39bd4e429ef37136680713f73b0de5d350ef788e7f5ae239fd724f42ef386517f2e74357cbf9f57fe8630d1bfbfa45b0aff8a7e807eb223f1643f74884361fae6692e78470caf3e14f2c9ea3147bb89fb7943f882576305cd8e3e69863b7c53dd118ddf928c84e294b8673628133c93d38bbe04083ab6f860c96fb9dbed3508e5f63c795abda4e43a72727a2d3d08909a48d5544e6d3ef994fe94f9ff91503b938a41cdf421591faf67bea5b0ef7d4b76fb14fc5b0f1c731714a393eed5ef9bb75a88422d235b14f0baef93f7ce2cb748724907b748175228ba0d592fb82032517c5648bee098acc887baa92b900871eb6b85c8656b0c021072c3c808485126bc5961bcc22ece5b66811433606d3b685892518194dda962a560747d99617c450c52012c308bb5b52b001aa8325bb258ad02423a86ea9410649061165d92d1c188aac168b476b074fa20d2c43e800622c8131c69016278e628a50fa4106afbb1551c30aa0fc90c3e6e48711e47e8c8c1f62a03bf8b0032fba4c2e7cb0424b1333195a99328696412c5a58299cee32fa94b16543ed840aa33dca496b36abc52c662996d54ca3da363f2fe51877ba297b42394abbf745d3324c3b41c7be70ef6e778f52ca392795f15a6bdb6f6f6fa736d0628cb6abd318638c114208619c91ca18638c32768c115a13d02d468cd2182385106adb0cee4465507d638c14c29376b988594a658c11f5b2d19739310b632b9d18c7a5c8498c4e627412c5498c4e62744214c5498c4e8a88b02615b3488c30556b218082c51ad2252dd4422dd44242b12665da1c01089244c08f0dfb4dcb56aee524d1c6adf7df4b7ac83dff2451a799b88df74ec7d042b0a903b3856cab5157c813422863282c042979edcbc7a6a1d7eba50129c878f1620a2d292a42007325554510563879b1a28a0a60bc8853b4141193bf48450926e6bfc82576e929cdd45dfc8913b95264923b22e59894636472cc1548392626e6ef155be49887e1786252fd7a65987fe17860a4527e9942871344bc5cf75ab1c2c89ede428ee339dd2b997b588512dbb6bdc6f16c2f57b6c8bea14e0f11244174f472652f4b1c91318c0a2f32b62484152aa2fc0d229e64fb95e3b1aa5c1f4e318695410caf4c651353c85095bca428a229c7f465ea7ef9fd4724be329b4ebb68d7d8ba0dac9546fd035296524a29979052044d0b461246585ef061c9881a6c6ec8c19206a818820c205c122e21ab30620618236416a69fc24be24696ef3232b20524c8524a29a5dc64b62bc3ca22029bc32b4f4d05043de5c8b30a11d7d64692f9e2da4721057b402dbe656a229aa994e7a8b03e8238f3573fdc0cfb14f964f8ea7082083feaa4a803e4420e865042031a5e00e30ad73c72c592104c6440890e96b8e6f751d489465c5e10050c23ca28816b3ee00436bc80b46414c6906b7a18454491f472c5ffe12a20e837a702e2c60c391e17a05c4d7ce4e535a10c5df835432b5960c092b837432b51dc207fac24ee29432b5130b1a258a2d43ab4378a1408ddfa0404f2004b48d44a14414ce201a6409a6568c0ab602259168a2d40d0ac168b478b8a2e6e03b3a5a2c96d60feec856269035520118142e9680acfa96da9bb6b5784c884ee8c0cadec40b48d60071abab859865676e840fe5816efc00125f0005204415b6b46696468c5872a4730d06a0771e2928cf33d56eed4c73ba352d67ae5cec33df755eeee9693caaf052a342cf78ce6e14929e5b7fa683484f062a721e77f11c60c319d4adc3d4a1d28883937dc767747e940c185702a812d63b451a2c8d81f65ac324a1425a436310be4085f4a3a6192211b0a5107f54cf079b8ce471beca1a7b504e0352b1bb8d36a1dfef5219535a8ee421b4dcbb4cc6a5aa665d64eacd52eaba4b0062a59fcc1a49a5a3911dcbd66f840ec5bf97dbaeedc85566e1d84b5e123e0877b40760a00754437c0cc115b8c0aac02b164f1e1239b9eb97683ec02c592172fac40618225b8d4c81e4f4091e3ed9265471be08d6d42ce0d3722f1f256d33f33122f773b097a0a962a8302a51a86a6b862c50ad777b3c481162da83c610510485764432b60416f32db958955dc9f904129b54409a6e072650751b030c275e5962b7290821976b081861db8a494d246d98123a2c8f211e03975870a7862b6a2c4022634b8d2a00db4f1b721c46d1deeb9eec66dfcbbf3d760eb6294e3c93e809d1d043804f46f3ba7dce426b70dbeb5f7ceaf256098b5dbc3a8b369f5b1fa18911a23e5b67723fbb35adc9fbc1125e74dddb77fe2362d6611b3b15238531d68b9cb18a3bbadb6a672ecbc75b8bbbba34edc764fb075c0af71447b9493568b65dac69d50f705f5027be7346944c1c4703346669399a1cda091a168cc60a899944dd16cb0776aa6a9416bf4ce94aa4dc5f1cc57d548fa591ccb0f1f3f76b2943725c38fa823833944d26068cdb561e386dfc031b9edc8c6ebf6be7dc1f1de3bd25a88d371e0c56def407b61efdc93b5b6c6031acd1a6a660d15b386f2775510eff7efce531542679bbbac41c75058dddd64f85b8803f18c73763178f6a0bc823b8c36315641691e25f5186374e9dddb6873a48c75c7bd5b079d324287944aa751ca4e06967bb6b3e3de7cd0e0ea9b31cb5e90582c8c05809f78421cf934cb0b480cd4ccdaf8532396d14c9bda26372e4a8ee378b0e750d9cdcaafc56eb2b62df7dcc74def7cc0f2e80e8d153f9b7144a64bc32c0c051427191a5c754f99cd8c6234479e4add2b3b62191fcb62acb67a0bd52d46b16c669ad4b69849b9713cd96fac1b8b653babd62121ebc6665505b08a597642b20b6d28c334c0a5ee65c282df63b8bb3b0d9e64f72db0242e648761d425f6bf6ee25f80203be78dd4555ae90b285acb0ceeeeeebe832db6f020a509134f1021d1c516618c200cd7d75d746edcbeb8216b2f3da795b5d7381e6dd51cfe808232f75af7b160b8fdda731d12d8a47d37b9bf9bfb8ce3396115a4f6cf8d0094b51c355c27b2879f4ccebcf040ce322fb4c8d9df2e47397bcbf164298e079320e46fcb96896cbb40caf6210dc0c8f629c763ef06e5c55341c8d40a0d7ac8f425c743ed945c6690a58cd799e4536b2f4cf902d3a2372c6fb6301a628b2fb2fccb4511597eeab9d892e57b5c88c8f227cb06292dcaf820cb2a240e296bb26441964e64a9c550965af0f03ba4988470eee5410bca5ebbdd2a591cd94b91d0e0ea9b464ed3c395f15e661a4d4083ab8fd2f4703fd825ab584802818e17e27412d8e356f89fb5afa0fe24fd2cd05712462fd84385f9d963db6338eeb87231ac67922ac8cba3fe83f2822a9af62756cdc79e621df7b33e9d8f59cfa63c2d2274ae2ec01e73ba6687ca8e52489fe46198bb7342fab5d7660724134453d4e9246f8a34b9b3562d0bf5d53b355cc8f02b8d0ff7835d0c90bfa69265134d2929a9b16ce07e6dd4585c87c6f5d3be7da04c3b6ab7fcc3a7b80ecc810a9828d1440e4a6051854b7e6711822cbfa5780e96e5f751ed5a3edceb5e62eaa456722f56994bf1bfa62899b019a4a94cca94e964713b1f999f1965140d0f37665c72e4a14c73db3a2d675d670a515d74cdee9421fc319462f24f3c22230f5265f9feea1d2ccb779bba9ff2763c716953ebe82488236d937c9b6526d96deb66ce01c3b37892b7ad53f90be2c8afd9e6d9a9bac93df940b9773871e9b74c0ef7eb6c764079eb62ae31e3865bdf5f5147fa5331301ce3825ba708e99f581504fbf9534a10d803e56dd3c9e27e1300cad9678d23613ef69513321fc31a17c20c329ffbada3f9b1eceb37470277fac84d6b55445e1ef54560fe7e09d0a5e485178cfa176052b7e35e047ffb5ac661f83392b139bbfa590a58872495b9ce19875b29c93df9314bb7fed749744aa7a1b66ccb937b5590f9d99f18286b954b0045f950f6a06e8a79987f79992f2a42e11ed4cb601f144621dac8bf494d591ea1ee0f51128355f55f1ec805835515c7af18857de8946813eb4b1b6ef61c0d296e96d96fa128c32a217d8476712f4a39ca165e91f2a2536667e7788664540c88135febbe0dca2b639886e15e7ccae4de07affcb0942d46029b4840e5f942e691f9d86b939641332c42ebf8e0951f943212d8942bd099621d2adb2e85584619b9c6a71d2acf0ebe18698e61c08e80724fa03347b934855f0910e65ffe8302835f2d141d4152241f09862520312c9d5cec33d94927777b6d83f2f282fafb309f7af917ec53040383e19e974f611f8bbd546a02b92e56612f188665a70a121f024079e6def140efd825da6f49583ce7f413e6e73751d4b93f533fbf9590803bada475cc9fdf04e784210679bea6759e372dd8d738fdb6c5ce5ad7f9a475306f5a723fc6d46fa44b56f2cd2a723f7dcd79050c79ce258803637f4cd73027807b69c3e5a0c4c47450b499329ffa992feaa1f1311f13f3a9ef89f9d4fc180ef7c4fcccfc184c03b75e7e0656711ff3402e19ace230f73ea87f790ef7c07cccc7609ffb300fe4c27e83e9e894fe8b4493a40d57c32afa3067f87b1a525c8b6953ebe829b99f7628b82733a0cc371018a97a27e66e7550d4a9dfacdcdf2ffaab192ef6d99bd0ad29e9252db4059b4da8148db92439e910cd4800001000c315002020100a05c30171402ca0e8a1367714800e72923874543494889218c8611443310c04116000308020428841062a1a3a0324039395ae1164b40b9cdf92d84fd776aedef2cf8ac5364ffe8616c29a01ca4fd4d81fda65e852b6768406f6315546c0375096021121a6f18918b083d224b8a295fc3476b22700c84af806d66f573e0a1409e316a2f6eabc588ca254e6936cbca9d16df08e9bacdb48aacf175cda3d05a0293c26dcb4dfa84e526425f2178b07ca9e99f962ecf52b1d0e654a21216ca31a475de7c8194a1cdb5bfb96ca59b03491739d8754503ab60cb83ec6c1528cc4432747ca6e552d2f538d8bcd6f4c73902543877ee0927abbdb0e97093d82ad624ce32855a0be24c2b2e6c98e6e786e431e36593263fbb7f9a924846428faca268906b7891d4f8c732d1afed53646e2273d4f0296da96157466b34395b954d4d9bc97b087c2fcc73e73411c5043906a1dff2f872420d9c412485caca0c131d32c52a1198e23ccdf2c815078eaf508c570aa2f29230eaac0e02d7ff95611532732518ce49287084343731aa0779dbea5ca433705bdac2db4775c84f5f379c082a3d3911b02152f499549a07aaa9373f0f8dc80900cfad49fcfd26c780743ae37e75abea52b352c4c9e33236135d3635551cc63c8aaecf17c4cb7f206ffa257f482d1cf938f6e0ff8823eb72e4839c94f9ac26aa2cfbaaf9c4682b04f208e5ed387599e072d2f96b09fc5b08b907a62851f96ea5225ca92633f9e5980af0989fb6be3ae8758c71375442deb0739e3d8003692089bec00f5c7e0133ccd44bfa48a889334f6cca893c65871042d8e7e586a8bdeb94bbf9980daa80ab8b399e5948c453795b0c0f9e433c8712802f681fc2fd440f5cf32ef6dd73796bc0220702a7574a42d79bed87d42654541c87422146dd07292e864f9f0460c7cc6c3611f717af8645857423d6faba1b7c52fc15debc6528546b2ec868762cd94f6aaf91cf4ba54c6a21a0978ccb8648b348751a96c0ab483a268091c0beb3ba430d2ce83bf3e905c34869065fa6753e2d514a20919874ebad156c15927303aed5a59404217dc3e47d78fc4fc75357177c6e337751a7913b3637703371992ad3b6ec88083fecaaa2130bd2af795e1da2988336f2af1f3ad8130ddd1c5b4390361af02e59f1f5629c40f2adc742bbe38382bc728d50fd65970f00c0b9d697b13c97cfd74ec2276183042132ad2f323304af0154544ec4bd19a0754c1615d3bf9cc8ed2c4cf50f6a89aa4426a9e300f9a2209b9a276ac48900400db195fd286a5a11982e9cc1e56330897d5cde5b619f709b49833ff50d157854f06c1d96913d2a22617d029d578404bde1713c05149a8b742e9e18d83542a8cbea23a16a5d3101725769123931b5731be32f104a989d6ff64622f64e3a9346c7938f9ad5b0c7d0d9f9f7b948e2f7a1c3bc882c301650d0a4953902dbe4ce367328508ac7e9d457b17ac8a7a19a25547c48520a84795d7c82544a084fec6c397d7d33d09b958f4aa3ebaad335612f997ca526d3d1023f56056e11f10f208bc25c76b2dc79937b0f90de9a71684605d164472218ce6d208f821736e6307a097759b15513656c47d84cef3b540edb53ba61d95603a4f80d907f42e3c2c0df09a3a4371ddfcd5443cb4d1d9efae445eb2c31bf6b8ae10a65380ba5ccd1983f5e4f51fa09fb098ab88e704a3830911b9e8a5e35753c537295b37ecca9b7ed90b8db1a05d4d26cacb2cb87607c4a5d8c6424d1fc927646592e92fca2a8b30f504b25ac924c504bd51d13920fa8ad5908c9713222b66886131ae645c2720906f379d80ca521d3d44f68cbb6982d1a9542ae3cfd3cc743e763d6c85dbfc743362771ea4dbcec853235b6e4bfe9d032861b4f6fde5dbfb3a28d8bfb902915dfcfe3fba44dce473a55f7da2c359eb482c09a7a13484def53d524a241c5ce9a483369de0c05e279d83a62ab750c6061705f1b09e4fe78403b5e4380d43edb16969d0dd74c3352a62b4a462b268b14dd0d9dedee94a611e870bc268d7e5f28317a98b478bf8eb1f46bf024c8fdf66c620100979539cf3f746e32d4362128840fc429448eb14ed4a1cc6209c05ac60ada7076bb0a2a966ba0a660e519fc298d53275ac8472dc509f48fb1bf22505505e40cd956639ee12066518601ed6becbb3e9d022244138f45a310143cfb0b8abbd33c991d4b56ac19d974b878edd72cea908d13aed787789b362a799eaddf61029ce599d159ada719a7b3c6bb44cfac4221aa0d65d33538338cff546da4ef59a5c4b40e1c72832d069a45799043d9152af09bfe5d801956d07544a867bc0bb934f83c922560f9d6573d582ff7ac0203a82c789b1ce38080a8f79ece6c91fd13a6d6477f0312c8b30f28568ab29071d47ada3237ccf8c2403daa58ce953be71bad30c18e6e5f403cd2d8563a0460f00ca460945ab796e5ff267a0c12778648f7894228ec114ae149a1625bd94dda7521fdd5b9676fff7109f9698c240e5af5538d9ab342ecc03bf676287fe1ca0427f7d9f27f450bbe018a4d3fefeb9f32f7321371bdf082a92a8848f88c55851ab4d63061750547b5990c229f98d88c6225740b5863d72e4edd1c69be141a75b734039d2573ebc2b140410ccc3dd3b745c576adf3191d1a52afb86fe232b569838275a35aea2547ffd395eb71cb91c4b1802f91f8569204bb14a34515a2f89ee9a8da91a50ecaf0eca43207bac8b89e905fce9c8fdc1d0108d4255f41e33d90af6387dea087d070d824759bee695a7b2f79c9ea2d3c43f14b970bc9a9832f1d2aef8050949cbd05e4a39d455cb98a863d04e092ee5af66dec3c13cdf22d98792523b677abba7456d74837e3bb1290f183f1eefef8cdf11dd7b9346284669f85c3bb6a07dc6c59dc9457ba6840cd0ed355625fa58b26a143300550b569269763056d01b360a8507cec4be789ccbd70a0ba8446bd4e968b21e38611371476f28c40aa946f243cf9af053fba8493ce81511254f02e11373690b1372b382c7f021d00450f8cd0ec20be8b45a4d7ec73f65a1b0a0ac4aed028ef8525903a2230802574111180c095c0d19059f04442fb56ceb4b94481c29981e8ed66e950ddff73e3cc98cfcc9ea995489d818ccb1809c8889e2104d9a2caa274f786cbccc87a4f935090c0423bdc027ec101df4e65c0603365ef87131d21bac0555d08a5c4896b6a2f4146ef5f994e3555c3ae1a27772c18813a39a2ca317ad4607cdb0d13b39c1a043e0f59a5a019ff81f875da0c4ee2206b607f73af12598111fdb32c81f019ae1beb4ecb4cb9440acc4ebf83855919c0a6c273e5e152375d65d3f0b6eafafdd6c85c27f98b61675cab783c10d8e24b91b4dc4b995126d2b3ebd7dd7fddbc6c5669ddfe27c81cf84d374274c90626d2a44ed9a7c62863d38904913d562aaa8bddd1153a360253af6c479875580dc4319240d09795b0f57e48856f332981301d40f86db49602856543ced1044c209e5d0ae06f3675bb396682e58423b5e717a29255a20194a06118926401f23e85e880a5ce453fac4930db925e1afcb73b79f5f5f5d00483c60e22fc9f1593a0065920e70add1017cd71f1a84c83c7611617e4a5b7666bcda85b889ae18cc6270e1182053d0223bab18bac7a78abc9ffbca0b8382fb4f8bb13c09fddb4d485656bb3d6e678029912671f43f447cf9c2ebb5c14f876594b87698458c20566e9167546d646495466b3ae08d44387b99cba80aecb2350a831008591cd0410d0902dfaff8843fe0c8d9ac1f0650e4fcfcc827a0671c39e15e4e5f4eb399bd9f28f67513a95aeb5e7448667540703290bece59e9c6ac3346a4969769c5f6d2265a4692b76964d1faa6c162ae3df10ea13fcf5fbae7a0eb239327db1f2de357084afedf8f65fa8ce7eb80965afb4de533bc7b662c8f2df9b88d3d9d76c683716779c8443d74c61c534162a7c8d4ea8a90c35349b3bdd725255467f168c447525b6dca6ed99921238c8136f7aa8adcf4972c85389bfaf928a59a81f26f85cc8674080fe89e19a0faff35cceb78af9d265e978df4cc75ac06249f12a9838fe3f4b59427ffc7f87b790e0eec5e03ad41c009891c254afcd95e0cc727ee13189cc458a073f11f7dc51e4388ef4be00469b5b51feaed70becc70bb245df3e52943ae6279c967670e0568617e3f13000512f19de5b5f138b251c56af9483edd41f9538504de82f8937b1b44e4afcf2a77cf8cf66fff30cadd1ee862d89111fb69c5546116a9a16603ea57c2a40a72913bc1e51accba6c147160f256fef859bdb42f794f55e5529374ad2cb909e1df2410edd57b023786cd9a1c3e24719d9116bec17881de531845733a0ac779e8c1c66c6ffbbfc59b716c5ebd8ef7b537068f91f263a3ba9a7072c95e658d8442d0d304c2349094e45a823b4a82de61164814fd4d15dcc54c664673a7fe956be4167f82740b7a45dc46a0e76cb4bb091f56d748b14433e97256027c9dc205975e975cde78971b72821baea71d6ebde0e523a44c945e32be7a07ab764057bb13d1e77cc91555560027bd136ebc9cf0e0699ae74f19b2fc475ed9866ca758ac350f66b02764cb47e4b8118ac97ebce7e9cb774bb57b7ad6defec1f393e6f9ac5eb8725d6db82c133bf418a697aa95e8d5e910f9603ccb28491171a4c9223fa3d878c73850432a5dcf783e7e6ed9790c81ca9c8318b2a9e18acda2ef9f9755c0facc0741a1d4388dea422770886ed13d70f2845c58bc97672ef68e0be6a2a09e228e92ba157b4d7625356705c637b4b69d0e2f229268481bc8b5439003c05f7a85e129abf8ec524a75510278b9d2251012e6692845164f85b36bd0851bfad7f5c2f241e60d92c4ad11c857edd772dca8b5b637f5d2bb0e12a079cfd1a81c369a548450b60d0d44566cf9022101a35e9af9caa0183927b907d77daa631e4ff7ad08277bc4a2efee05c049ab6e64b2ee57ce82ae01ce71df8d303fdc7c6440398e2c7b5d11e026abcf645d04f6824349fd020dd80df1e256a92890a169cd56a5a85186b0b3bed2d0aa0211df01f44c401f0aa7cc54b06b5280259320bab0d7dd68e2871db7f290871539c0dd91ef1faf3b4d49857d3d7ab42e20a569ded80ccfea5d53ba8a3a0ad9e496894daebb4fdd6d14129bc644ef55b6444733df160d22acf63fd427cf73088396df6cbe01d16fc30051cf131d265fb6e7d9c108033a0ed2d2683b416ef671712460a5d4ce3898e00c58b962bfb74919d06f019b4f0867b442677c924afac4201dc10010a2285dc2462be84f7832ab31042233c0b90b1b2446d529516240b5fda677ef3a9bbed75d5a4d810b1c16cf0f1a1a87d900383840d587c0813bd1705e62c47f050e5d156536216f9df43c6b62044a0ee04f9e3e11c9c572f8aae358d06cfd638d9871d1bbf1c749cf05d6a64214af337a12caea3a8649070efe59501c29b0dda634278b6dcab3fe83186c5fca89138d54196aab2d36e2297ea8b47f67f53ce577873aa391585321e4769aef57276479f1404cec9d4e297486e7478744a9ab6489ac54d1ef23ca482ed45799098bd03684e6e39be035e9acd296a368d66908d6bb10e569e66bb620a1d414b3438212ab15c520d8d64511c2c801871142be625ef70c0638d2a10c9c5310887744d27b009d8e60ca6622053afc6cca07ca7825cc20587649e61cdc087f2fe4592c078507e4590d0685f84bdaa0f68e2cfbcffac4e9b19fcfb3c9bcf63a6e5f76518d7dd7ba1801899772ab900523b4869d07af5450310dea5525bcea76d0782a87245254e0b91030b9f08f531e8ac882fb1f4770ed4c027807a9f60667c0562878ce56aec85d1a03d45a2a16747cb49a6f7623aa139903b024f4305e6015a29008196844204148b8c1ea8fb7d56b79e5282bee986eeffb91c9f3250bbedb9d57be4e42bbb44359f4fde64939abfc16573223321f9ef6d9d5b7be3ce80c465c0cb842b5739ad8240dccf104ef8e7f6793f27d5d1921da879730c27d472237edd4497e74dfc39d171e34103957a6c8f5815108f9c2fbe64b28282b9843dcc794580d3206f60bd07c9a6df9d5db9e1082817ef29eb9df5aecf649c38986989fb3820c30648892e7f4543718bfc7cf939bcabb2965f9210734f14dc7b251d1c27095a9b806b460c6da44457d4d7783c4cf0065c4e8a2a5c03bbaef663b7c1918359ec7d1efc4234f764ac61f24031c012887f4318093725fc23e96d8aac44f80f4279e720c7ff3bfc1b92e127497f50fae6722eb0a9354e1d7486d81b0ac0fc3d018394627ac49eb9955ce6983153c00626668d5ec09b7d423f314d306eec73d054fa930aa4be78a9d31bd07bab0df6d351e37093a8fb41b01ca0abb4809e94bc42289d4457d7a983d902ca6340334d4074c58b1afd5fdfbf1c5f305a7c61ad5d491ed09b80269b26c625b8dccd9036872a24b93fe9be5dc8eaa171f4471e591eecf747d2f713abfdff3055015ab3cb3e2b9447cf498cad075c01607af482640b68e4258143712ef422d49eb04600c1b65633e7abbd2115df1c04cfade84b881f8099747b42a6f07873592fad8614298c1d6586c503472de19c08f12a51c4b0fbe08ef61c00c97350cdc7a5a62c84331ccf45e40f21790197d8f575582b40ed4a05da4b13939e2094624a61001b79fe7a810f37a0fb07924c2a4b207745e8acdd46c20bc8bb955dfcc2d0588995f2f9027ec38f16b4e8c8b2638ef94a6498d5cf9e9aee62eaf6c053e2c39258504c05dd4807cd07e0f155e3d7119114dba0b03175053e6f601ba08c5a0be42ec239647c88c95954237f630a841733c230d3f18395648a8fb399e828e400f9b4276ff076c726526fa85f40c746ce1b5f017011c9e562d826c07e0021a4e1db789af0896987c586cfc76b1bbd9eb8730d29cb6dcde2a6d23e0243cff3ebf19bb63b52762d171c5586eb698606862cfd22b9917cb44101e634a8e2ceb81bcdf08cf0dbab94a1eec9db843262c2c8ae200e68312c3a4214d623862af842675c1b2637a81a71563986fb8903c52e73abb71ac7b9a21cf7f8148006af02deacc82b591caf503342b882731fff7aae833b6b17aa0f81c98575a61937e91a56408540b2330da83e13c650c7a194d6020b452b9f094dfcf84a4c5a81decf9c4d5e0cc6419fc6901207d18aaf9860b04cbdba03838a159e6a03531633a2d40ac6296640a6b8f8efd94fd6596b91ddd7a08d63f4fc5f0eaf8066fcc31d7407247d27e2e814e0ce441e2c48a97b69c8955ccb86d1c6a6fb23c8cc4fe8dd56b005486750e4a187a443ddb21dd03fa7320f8c03f5da3c3f135768b2d55b66399eb49881fcf95b6928461c4a67f9ddba2652adfad4b47f6f64b8cf2ca4f82252974ba2ba88f977b6599da48fbe8a40fe92989e1500a43b75e46ac56637e24fc5349805e4b8cbcf3489f39d4de3a8784f5ac992627b9eb1e01561a2c543414c818ef396244ed38541144271780d2e4448d84410ff7baddbc100077033ce4562d6a6fddb15ea05f0852b3c0c398e6a0295bfa2d9c90c14ecdd29c937a21274c7daec6c84b96cf3140b3d673fa640766f079528cfe4002188b808d9113d49f124675dcdeb48b9b56b99f62c27753f2998762f8bbc3cfaab06265c2c9b0449418633456d761f4996230fd485db3ccfd3150915e68ca62e8f0340a025e549ce67b78f23caaf0cf6eb4d662e8966c96812d701ed394e5b3348bdd6e4a88b0fe1ad3e06591c6f547176388a764d30c16215310c3e86220787be2ea31a16b37a3e35b0bbd36c8eff5c88a7f64b1f9ec61df1c402e399915176306113c9f96bac1411d41c3c57492941628fcad6f163f0cefc4a02f75312d7cdf805f65107f5312f166c531988b69baa14d774aa5df42c6412c26196166c716d4378657d94152fa278b49029156d73673797fbc9a542c0487286310c99111ffbf5c6985de20975323815007410262b0e0d0e3bf32f6a265e5bc073ab9474921675eda294eb39caf4f94212b33fdd6b206117da192bd5ab999c20e7e18122ad551d0d48f1f7e160291da91440a473a3e79ee7bbb5ae65742a745843266d804199fa79f1d1927fbe277e598925f3326a8502aecaa92ea5d3215d2cb95898f3f13a85f793715a54f489e7e40c1693e85ec143c87a9caa041a135815d504651414691e87941c15ecad6c7f87adb76624c91ff9501f40f2a7aa59e2947a13b8f9110aa3c23d37b14b21a3a3e975097186e454522fbf407bbe02c91c1c9ece72dc141f1e99962926ac636ededff9db2187e208d9b04df44f9c34316d217d9e1bccce77f2ac23a139b5582f1c18fe2fae14fd92bbca23302a44406d8c6f5db67126f94c858c549a1bed0e30b61d2d1526fcde447db6bd03d1e45c5a7a5531ab6596ff15babc2e3bd5bbb18524d002daf030b5673630c149c60ce10b9674a0f3af231caa2dda0619121f5b5ba6e96648da212b4e5fade50d29428a4b7233279bc464e910118658ec606dd313f5cb0b5b640970734c767bb62ac5b50ab25bb21c5fe8814f2cc1ce403b1b4aca4677de904a473088a4ec1457a8a4428c45c3a22c046d64d38ad032d923047957c0a689079a5d645137e90b3263d5cc321d2f2af01e98c4b020b1f0f1ffc450bb6e31f650c9560c9cbafc5eb71f16ab4a2d0d23502781734a1450b39d4af4440ab2ea165797f1305a0f365930a685406187bff7ee6dc52b586d566ad416f3cc7a47f1e95d301c12092cd25b280a00dfa36c47d0f7e72fd1b41cbd2655fe6cade36d0723e7ac32f7dfad522b498fb94a5e026530c1e0a38521294df79735f4cc85b4111e9d0c8b8d4dbe16abd5458eeab230a628c16e7df65f0724d9b5d5afa565ff539bbd43358d88bf36a35c8eb8bc069d50e9ebf13bda73ddff91e961fce57d910544289f182b779e747dbf10565c4e778e7eb8028ea9a980433c4b4fbd694eed95f41f50c1fbd24a9d9da3c5d590eea74ed9eea3dd8899168a027f96008522f138310c6f3fee5e4136904336c90080a2e88fe2439744ea98b4965c19e44d6e64ea9583870da71953be00a118b7a2888cc4d192817d13708858fcbcde4a2f2aebacb4dca5009e99ba6c23a381d6a9ab4bf68509c9b3c6b050df92053142affb6d20d25a11555becfa24712ed947ce00071c7f7dc3f2ff0474353e92d515259ec8826833851d6475bc2cd9c2efee0a16a13674502268347dea2be41d3b11a64b0d0633c8b8de9489f7fbd99b380978dcf4248ae5520cf3f905e8e22348e6d79746fc196f3103f5f1c852e19225dbc77fe93172891f2aed11fefdbab2272eaff910a94fe082862faae5282d8383579b5d8f15399627b988e62994b257ec365f2512a0551cd1527c4b8e0e5003c493cf9ce38dc59b1213acb908b7d47a2dd2e72fce53b82eb6fa2e04218537086a8e1d54d99715f2616996f19d57a7688310fd0c5092a7ce1a5758cf788fb5d0971b662e7262edc0c81871ef5d0b65f0a8efab07c0dadbce309b162ed544377ed3f59108ff96f8971f88b444f09de7611c023b2f528c945d8f52e05b6b42a40d852b7119c44ce3f5c8cb624c8b8402a35602e60685b71001d20c8235bb5cae0d1b0ed596433ce91448d46e05f465204a3025ac365f5d8051753633db7704d82dc5ea852c722277e24740318e770fd95162df90e9ca9c81eb0390b00a3f37f51fa494e9ca6d7859d0676e4d9512d6e4f49e22bd3e061e8964f83888e88c99536ca31e2bc0d15979007a5eb4a6248b845a039ada456e9541066e9ac46fb817114227288e692670577ceefe54814f4c3aa7208ed60c14e71c1e331ad180e6a6dce1d523b5a70a2a7940aab8d5954f030ba7ccc7a82079920e593aa9d37b6fbac9b76ae17ba5f7243b763a796be087c43fba20aa8a7384034228e9156105fcea086e476f6a0f5a53f346cbdf49060bcc445dea28082660a14968d79417da7bdd819c79abe125db981624bc0558ea74f906081a85bc5a6a5e67526ab62a814c0819e64d7404d2e14de13d35ccaaa1b8251376b8781c643314a5cc0600f8edb5122fc77a0ccf8c1a81b1e7bb3d54945503aa2a0829770d88cee1a39a5f079886a747f176d0aca3c234af29d4559b3cc579ee94193dd6bb1c2025234d65a75615b802f1da32e31e8d5fb1b70952a921a2ac996637e473e7526aa048259ff0c20f7712ac99cc6d6f63a5077980797e232cd030c5d6ca9a82fc6090f7b13575e3686c760fc2bde582aa44d10bdd96160831df199cc1daea2d957ef97b5843f6d7782191380b6b362f0a939da3fc68f784f1b45f59d89661caac69342222b3056b3af21a630d4c6a6133301c4b3c5632abdb56f88458282f191d6125f2a24426678b7f963ad5a13ea184e903822eb0434d80bcbb61372846385677b33cf6b0116c2e04c4c2b178c8e8fa344fe0637f2e9c5c4cfb576b8eecc3648c5cc98404a868f82812356d4ac055e06a6f4f9a07238a251fb974911e9c33b8c8279f40d716cceaae330d608ba66a4fb89cc6a29a7b922a8853a68e32b3464e2b182e353995a1c7d6cb04c79db743767bcf659b052729baf783a45145855cf2860b063fba20f55a8e0120e0cff13b92ce4a27f4299222bb3268866a7bd513a0dbd7f9e97cdd13c414f223470bf0ebcf6085c201ac6ac2d03d31e584b9f27d5b72aeeae5e979d6ccb48cbaac101e7fe66d95d851b376a8030d47080d039876e7a51d47da79e8e0bb972e4bf1780163ff6a6f83935496e32fc8acb039124b5199e9175cd313300131f59c3797ad80ac58ba17579ad73efc98f31ec93810cbdf65de2a53002c0590db69edeaa170e69020cf4a20002b4bb7903928fcac1e549c2915eccf48f60aad08370aa9017f52558a298d6c099d0285ee71d29f19dd6c08452eb1ad8a0733385ee2ff33010fa2531389426b5b4e54ede7b747705a24a7bb2fb0955c68c4165ae45170bfcb7cef375772d72f0f6c3f0edf870737595c2e1a4eaac0335c5957db05b112a04ef236e0b5c07e03c7073c20e0e794e5482d3889ba0316cc108f82f0e5651a657e3e8f4c88e071bda860c2a441660a04d8abf9f4edb97e8b7333ad28cf8e3471d1b1672859ba313a785436f50fec4f6070b7564de8d4837549e757bc980b8370cd88341e33047cf7f7bfd91161b4c3e5819028119fc55cc6f63ff7a94498a4f2146da03786ab4990b8b56033e3634a7ad98671ba24d7676cf0064cc193c72fc4c967152666a860fc867bfd47cb60ef0b28ca29a22a1b6bb1cd86d40cd5786f797c8a2ab113a7abbde8fd08b80ee8ec78c5a69426d06c1c8a9a69b55a9d76d697ab6e780ea15aa29e6629a530379ce0d27f6b12252a1b3fc18bcbb88ebf3b55ceacbfaa0828ab185567d37777bd2d0e38806a0b395915d018b8e120cd9b82f3f95fc5b95c5d29ab041829209e0926a8f2306f4aff07b1250b5a935250afd33830ac6665f13b7692a6034529446bce7137a0aed25f4b3330b62fc75cf6482c0c59e96ca2aa847ad46392f79d96ab9250d13463ffa932f2eceb94f51bf76f9c19cb1d1a85fa72dd253c984b3e712ecec5d531ca03a2738f495d918bc55570c21035624358e40a68114ef338a403ba41618eabc1032f8805e1ec92354bf93ab7135f4a484f35b094929874d460099ab4da504bc22a2904a35cdceaa702bff7afc1a0fe52217c48a62cdfe6bca8ca16081086dd39288d616171acd4da2e24923a7c6332ace2e2d516a8d3f69f4521de6c177e56dab2ab195c1c3ed99d21ebbd3d0b32f84f060ec0ff7f223bace58770b8a0484648eca97604f6fab5e295644ee2f6de1d13e4e2c48e68f3f439a84666f4a83d74a151709983ff08586476f52837c17c79c77800c44a776d5dae895807266d6186713fb07320c9b894b040aea8cc16258555da897c19f8bb629381a3807dc0826112b21c232ff6f339619845c80a2682573441665cf211d059c435009aee5078b326b908407a472d3a4b575b64214a1aec036d6fb4b00ba91023ccc97f73910d3296645653007f8a0ae20dfb26c3102b53fc482472aea7de76137bdf1adf1ce0c03f832d37e1dd9123a9ece3daa140cde4b5ac97dca833f5711e3fb58c57dba799f3628f2ec756e2537b5116a956fa915d294e3daba8b1c7f6ef1d3982394cbc127775308ca32b4df9583d470f8e568d776b28ed7f45bd41436086801eb1f192ca6fd03452d1241e9494660b1d9b81128faa5a5c6498ceffefc83b92344464089b207b0363b4fb714b11530393b2e3f001fcc2c5eab7522bfd2cb9bfed5872c1d5c9c35cbe886eacb90f02e2fbcfb779784a94265f8ed526e495b3b6c128032e4fb7408a266fbe1e2ea65b1c12a113964b75ccfc64c02de1bbc86aa7c20e87467c9427b8c8a305c84fb398570b35027ee5e9d48fa40335e850c7fa244265d67f87cead8a02ace84e14b77db9d1bab7c4f504aac790ed7312b7534d352276737302c3e48ac9e11477683b993a27cc3eebe418ac0615edff517e338454b84a5f3e6342ee73af366c03bb40ea27b17afdb8ed4f71d00722cbb2f0097465831099518dde2c00b7b9409d805a4c625e7979ec8f39e8cc7d29e97f7b76450d0ee718333e2ebb86fef77eb587e5ed5e9583ef9f8856e5cb8fc3350961fe8fd32800555ef84fe7cfa355f7639152f669eefb79fd56c70da67a91592e89acf2dbc2eb868c0189a5de7abf16a8a474defd3bacbfa213c50b095210a6c07ba1a8df6b0c204bdfd39c666bd154d662a19601b653e17b371eedd01edab607ca808a40d9130dc07eeb095041ee232ec8af7fec875046a85239b71a50c4f482424f2665d62e27cd4e325d84bbc57265f86e7e81fe6f256c7fa7a92dc3edc34fa101994225ce50218e4e2ed741fde17f6ee99a21d8eefe22b86086428fc3dedd8167e14c92cc4f82b2544ed0583bd3169881ff6143b366a647af41de23d0f8a8526cea7301295b48fbf28fedd7690b23cf294731dea89086d7f035987f804d606ac69572486d1e2f56925103082c416165c1e557b029044b2504f3b0fca8ed1de85b0e7a0dd1ba08df520b69c0deb32f043c2a621c64b538f5ec98f9294b25c7c5b8febd4242f791b3d033439cd3e620efaba7a9989919e511b08472813094ac3b011e4cb13404c8367e2086ca1c217994dac6da74d0331ad72d2e7575c6c41c1a7683a6b8f38101e8270490c5c59cc2113a8b9821b8d33b1c9473831efff0f40af77b702edea010c2a4626e9df10b4effe873856db52455448d7d61a94fd20e4749b0959c7e63b8b4340d3801d6f91c149a6443cf89f0eedff5faff49e618910f1f887e4e8c77decc324bea02225ad41da9b42f1fc405762175974907c36ceb95746d2ea666790d3af3ea4f74e889880cc8fd3e60fdbe15028ef6847aa13eb32a4f15480a86118136c7160d571805bc248dc099e703f748e2eee883a442c043c3ad231d86a96addcbb8259995733b4f5907a1ca936d82b6433511944a07a87757256c46f0019184f0198867fc45623db219d5414d7978dbd088d5669039d43abacdaa0cc86671b46a5766cd88144d442517b57fd657102f4a2453d6c14e5c457ea214cc388c332329ea3b466ae318c9b1195ba812f3d1522e6db70423980f8f9d52c03b650759d8b25c596e87773237890a4cadae79c5dd6646dcf21c794d13ed8e9728d8f591bd68be01609d61228618a3e05049e454a38ad5c3310431856288557cad19df6c13ebc876eefe25330ea276d3a34f37d23def7ced8139d026ed98f65fde722034ffa0c05f1a5f26cc0d53eac8d31dc92c88672c5d8684556f9dd9093c51e3516fd47830c45c3f059f634b51f982c51bf2bae0c2eb892e518565a9519457cf97fe27afcba555b0491f1bac354de849baa349b0c10eeec72632472af614d449f524d22b1bb0236b521639fca5c0c19f0bac4d98e5b20c8019c1e58cf8b724fbd27da766364e4ae7a3731075e9614a518ff8528e31e442c98469159a34c322e1ad1aa59e5e3d3d7d2709f6cda1b4e4ccbde02cc350e64ef3bdf553fbc6db0f06a4dd5b733a4569bbb59d06d9f636c5751ebfdc329477d9d7c0a4e94e00bec1609fb8a821b552626eafab9efda71f94daa14542cbe00f5c727cfdd6bb1f3f453b9f899def1609b7264da844e47986dcb0ed47ad958fb3e4030766121d4054da643005e73497ffc36a4301799b51391bfee5191d89740d48adf3f7e0c2ab26d088a41453ee73d7c540a07727c5efb1687985c4f7acc28e0d90f9d9739d3517b3c983f49c2cded6d7f590e2d86c28a728960bee7faf701515bbc8ac572913ddae2283ba29679b9bbddbc02870e9c1d7ed2ee452ca33f3f19b5a92eeb2648bb5b102324cc0ae8df6dc76ef2f5320c544eb0a0aba4603ff40adefd1bf479bd7dcab8c1733bb082f233d4704ce532a3b07c8890a4b4fd1a574aacfd3b4a90eafe01c58601423a6309c8998de210695b14d40221b66a8b83163e820ba0aab59d5aa993188c08a857c5a60939ea83fda448065329c7418ef09a2022cd9c2e734d81dece84d7ab3da3f2b17e63d435c117efe54847363d624bcd2ce9ef5be39ab8511b68b555c1126697aa4816fdd2513e6226111304cd89849fa8c21cdeec1baa0e85bc5e0b91004c6e1974c9026da792db7f79d98c83dc53e7f2725961dac8aa243a6f854e68d95bfaac628a49889d9c521634ace21bef42a4f6ccc7c3bb76210ba047287760292ea5846bb657607afa94d2f9b40bf154a271d892664e9bb4fbec61dad1d11b351918ead6738fcf3cde70386d6abb527242a39174e29e73b881d4b36d27ec4c955fa4fcbc215030e67e033a68b6b5808e0992169ed1fbd4bd137f0257035e14a6d653e9a9fb925f6576a193dc6282f7c29a6f82e02dde9a1107875e38ec0b275f6239f4327ac841f09053fbd4b958c894cd6aeb15bc914ae631a220cccd3b0d35fba357ed034b00de1cb3560dc41da13f2e782672a169801bc46f49d86ee03dd7fe55dae79c775610f09660989575e853992693df3458d0f0a2c0f5b974e5c0ab7122e6c7e97188f44d2b80ebc2965caf5b11dda1bf705ffa4e8fc1200166a72f8ba6ba77b54601e8bf70a652fb335615e7ad60d6c0df411968aed0168e448eda5198f780886c0814323c616d42b42d84eed03fb7aa9ce1584437c7d10fd2ffabfbbc603c810e89bac01f29275feec499c643eb77c121912c354f8d1777a4cb1dccec39c2328ee2eecc8ba6ae8c725aae18f21d81585ad2890fbe5c8bcd1a6b9f6ea72566090f20baf3984178f41c9251a82222b1e70343b500c55c70098b9ab5d0dfe08d4b43cef23630261606a14662e304873ee9a8d5f8d9014b2dd8f7af83b8a8dfa57a64eaaa6b9b125817852ddb70c216548afe0dc7092b26d1cb2dca29326ff28e81162ae03bbf112bc0750f740c68d323352ca95f92d5cd2c7b872965b2b4c7fc295d62f11407b61ba03783f920e408d5fd0dadcbab286b55b061b855d12d841f5e8caa60ee03362db1b6d2c1ff1cfa02d6e82c35c57d5beb2b0866595d7440c72e058f98a9418f86abdde71b352d1531fba52035b42dbda41b5b2de98f3cb76346a35ab3f2006c2875c9f977d531ceabf5b28adde219f8908431717f33dcfea93b02526b0edbf7bb3b36f0218389a74e29e8bf5d783d3ab83065a38ef63ad4889832151b6bde9bab6e4b008d2ce03996d35795e99d0bf4a3f03484564fe26badcf091650def45e40ea75cc430e498c9c70ec1839274bc20417f90d776a1a52e370df9d17314b8e5b205b182503251f1c245f26175342169db628df3535cadfb11cfa9204063b44b853addba3add57c1552fe91cd7fdab98dd81faa1fed9b8e2a32d65fda3b0b6cd7890ddfe1e54f3b7a7ed3c48e2979113f2eca4e5b3075c7404f717212d1c4ffe1d8d0a442845bf355bbe7fe180ec8b33ace3f708a883f866c0c2373ba8ee8bfaf423a113b227e1f88045023515412652b318cbf0517cb6b3e4a588e5a73859d26c117c0ac3f77a59a4554955485821c01df0a078a8b6543231e4455ab9456244bc39192470420489e7982ffc90ff3e8a203b23e2862654a47af8bfd307e6368e3a9a69b27c84d134c1e0371b66c6078aa009d1e53d9773ade5d64b2534697f7946b2999f76862a5aff297845ba2c847652068e43830927ce58656f035dd13757a9bc55a92fad47e7dc5ca8bc42dfa60856cb82473d6dce270d0b65171449255c04d206465570f79780ebd2907a216f6112aa96856adb666e4afd02cd943a249c0ce948d2e91192fd18e298f18a7862c9472f290e9d9254210e823545f605310e19acbba0c9c235e6105c86ac70a0c204b945d33bf9cf45df376b02bebc790b18cb3d422d12a9918dc01c611edd7db0d5dcd9db8ddcf761e2f6aec5ca7151677b9ccfe9cd25c53e588e4e95de8389adf0f020cc5fdd08da836c33cc4503790105054517c2b61e290b1818c6be015bbbde6b6dc2d9273e54e1488ad659b220673f01489d8787264733a37a53295a8ed7e881a11259f976b0f79d51bb965e4e38c6ce0e729bad5dd9f898ae5ec812d2e8e5622aad87a1222afb9543d30da37628d099e0899c459f131e8112cc3287084e7cd2ec269db488d404a34440be0ef505a290d6e4c5941695148c3839b443f5d48a96c63eb01ed46bbd60e9b57e414c2860e05eb62041290f9e7e794f371faf842ad2c79d32789c70ebe1197851816cde405f772f117b3c0f9fc17930a3ce8c328c1d31b4e48cde913d6431d8a5b87b1e4e9fecfd1c4b3d4fc62191ad4c2e049331e5d75a652f2420cb53040acf70cbde66d51e719f7a3b809cdef7c9d7c8f3b10b48c9db2cde1d0827b5aee59415081fe44741be81c2421ab4c04d89f56f76de64a5ef0359421300ec013edd52db215cf5f0b1ccbbf0c4c47075f3916d47f90970d15cddb0fbb65e91167ab478effe40d20fa8cec587a77f588fbd8eb4c18bd13086172391927d0a06e9d36238e2003f92acfefd64f09d1c59b18b706be370455fe66d6f5ab9ddb85f48d64b4aa0f8ef478982dada015d086b7e6f5083c2df88fb53a64057dea6a9c570a5e42a707497653036756e95b5d84f8a8e0baba9ccca6e01f5976f7c5a7925bf06553a0262ac52c3b8b2031cda6e8464921f6603a30e454be13c47ac5b114332fc6fee7c7a98b33853eb03f288dad95996dfcaaee55a8d37190b470a24c9071640266b96e66561590692dbe9c2466fc72fad780a9eb816457b3eb03befc8e65fb083a595b5ed67f88047af5fc8d04f9091776a10b5e428b4e54a2e5ae27ee870bd5535eee39bc255c745e9c2cd3f9b850847d7e706dba8ac5a351b30c4b53e598e97e5c88620a6bae1ec3be9323c7ccca40ab85b37447d11beae646886d8fa2b46735a81eaa7b4df7ee08f02ecc35f9289b44dad66bc94c617a8f0c49ef31d0347ed706a006699f1ffe21c1523d7d4061d2955da07d58bf9936a73927bc249d5dfef46b43d037332aca67b4f4a1ad398c220f89e5d25749607dda57c108a7843c63eb46b48f60899b7930f6b0160ddd9b61c38f7ae412a0a050189ba3fe000fb479b2b34f6e15abf2f168dd589db7afb0ec51b1a745d85686c0946cf4242d3783e81d6366c35dbc0f6e12d06e09bc7003272bbec95dc6826c9d8636c94743ac98b47d4d7c432cf6a92cba316bba740799f1db652031ca4cb2b302e5ca0311c844c4cc76e0b6614e854641693b94bbd1962c1335eeab76dc5121fe7544ed875f4c1b6ae827e5f307d769be673d9b5e36d5c2c93d73a7a370b3c56d91c2bc7173360aaec79c5a46ca9b6e227909faf6cfc5632a58c7c3af4764e24172c22198a2aca608cf3e7d972ea8af9c18b8c149b9f3191bbe19a43b6edb472ed02dc1f3d0bc2287bdd0b9afd13a0d2e4d247dc6ddec8e53b6a768fc124a4437044a58ba986b47186939b09cc8e4bd09a62940c6c8df8de40470031594105670904a41977d9f20c532027809f10606a15e13ab03b2273a9888941e88f0dc15754e7cd05afccd49ce46c209598785d1659b46e111bb2c77d2af4a4353a7b45622d040b18e1cdc2a968a96754ef1d148775dd65d93922eb60336c59971ae4733db2c334814ac757594ac82993a48c49e1a5292c01bea3770ecdc55603312825a7284f0e63e49d253a253b567d148e2143a82023e1f079b3ff014e9ce60085a443cf7ba9ce723bb3fcbcb408747edd6b73f5cb87e706246bce7bf2761cdec151832b324afcab3fe8ff15504a23408f712ff54b0593ae70af2359b11f0216d2d20594b15eaf38f618ee813c6e9f09d3e33716f3e3e8e9564e510522097d81d567ca2516cdd206bc27e71237607c9de71f5f50228211a139240fe43b029d20f9c4ffa2e0ea803cb1bea7387c193d09918969f839465423250f31d148be02bdf3b87f935b934c653d3005afc167acc632587123c26611915213613ce4bf64a2460fb9d264356fb233cc76043bb4316e98eed8ffe0cd1daba0f7608097c6e5f0a88f4df216d4aa6c3c9ed6d3fb056ee6d885a07175cffe5fd8ec728552b2cc617451597aae0da2374cec5eb5978b8953993dfca38de2bfb439a218c846f00294f2aac1d7f7d4be860e1c53e952bb0b37b72a9f68ec7625ed21fa6838fd491d30e0efc82b60f31e52eb3140f888ba0d747f90dbc0caf7256f89a117f269a10c4f82a177af75e4bd57a81aaa8e75c630ad3f37946594e829ebe5d53621f9059258a898ee600180e8041167151d7ba65e95b629a0f0be2c094d7a752853f0b4d5394d920252b096e993c7390951ee49264049b4acf320574d402894fc86ea03a27ec2b337b938e7b2fd9af8abf04192d2e9549e084f5833b839960b57e0a28fe83ac6887f2165c4105cf59003e60fc74d4126cc62b184d67b1448bdab78fa6901efcca2a97b789a5a7986da95a68765bee96298122b9ca50d03e07e76faac3dc6488146520a175197511a2602c295034c60025990c80481dbbc757659e3f4473ee1aef59e9d14e20e3ce072cd5ed770ee673e3289ad49bd23cec1777c4af60978e6ab25d555ce5c2e3a70757e696a0a2c43fb1b3d6dc89162d83914918019c08cad0c93baa46b64dbdb81eda630bb0a1901a8d7dc158e53a02b1fcc0286cfbc4bb65daab1fe95b9f2ee029ef1f6ccc8505dc7265c1988816403dc33a5e8bb4305d2a6e7f792ebc55e14c44a45467c91c1bc379ee2dfa5373ba505384768c9237c5f5dc7f18148be09b6a02122a1743f2da301081adc1344b748157c36ef04bdfbc8d17670d410009a36f4e8712c8459755cf187b941608e51f892a758a51abba5689a669c80eb7caa9c7255839107aae2234be9cb6fa1924559d92822a959e0501e156b94c1bd3b2950cd3a461e4d29dbaed062808a85edcabd133560158a9ec0fdbfa36b50fbcdd95c2dc22ec92a486d05ff5a94a3731eb586dfb09ed1c1c384aa104444bbf551406f5f8bdc10a49c09611334b83440c56a20d9c6e0ea42c9b4485b08d2fb3d2489674d20ec0b6af0e50cffa548b0f892d535756824c7bba8160094d478bc5b6e10e152705a5a9d9d329c58be80a912670b7d4ff758a1967b6b480fb521bb18a48b2e802abfac95caee15b221d6b9dd72768595584c5d7b0e24a8d6d6dcf498a9f262b7934380ebde5907da4dcb280691f5fbb672651bf18c3b93690e5d188aa147fc92cef1abc3791bde43df2105904527f987f176559e295ff9850790dc71bdcc60a1d716843e8535f2dca2707041a9592b0c2d287d5824bf74fa68368dc07a2c6d541e0b4117c4186abd814aef8cf00467628bbe967273c36c5f126e905b3fa7b65575f6e636bafff7d7c9d0fe371fdfa942398e63c94404ecd2320e7f892bdec5c959c6720a64dd0090630865fd1541b3e063c6ff082ef50ba212aa5eb0628bd135a56da81c83544949df002a012394738cbd39dfba21aa7784ab98bcb8145ed5902e4218613ba62d0637073437236e3a02a7f0a563cca9b3a9fca031cb180551fbc06d8316a86f1284f3ffe84021317beed54cffe815526cea9b8a162b01bae96c114a5ce55147d500a20d5201611652b534c274e1d4a26220c08a146de942b1454b7cf377560b4dd24aa4c114b24850f40521b56d4d19e60a9fa634406fa0fe7a25d46e14d8eb0d30aa56997d3b1fa4eb55a740d9e107dd1ab9707ad4868e8b5a89d16605911846c8e74ed420ba5f86a6c545b0142ce366f877e939f336fce276e4313a02409f906bb024e0f8ac7d5a1737437b2473234ec151b6f412a89ad1533a569e94d2d44f84976a038479410ba8e61fa04d39c626d6a042059d2c6b917a375cf6c97db1a7fdc873a5204795ce9293986ffc2d4dbfa0e494daf1d63dafa2a26f0ee97cb1a961d78d49bc0d99e493b2e566d43b34531ae761d8b9a0df17b18d5da8e6a433aa5fb231a92c246671b1c5836063df4583882a64edc7202f6d3dbc96df487254770585871d0d3eaf47e08f431b44d27b73be881e480f62f1d469080b89ca4c2a5f1d4930a172ec3089792a570ad338456ad57a3e500f1fb924af9bdf2d89de4dc5015e8ee764caa34816fa3861b77b3cb050cf29058bf643944211592831d6ee9b7ade0289c058026ee947d2d4db1424c774bacf5426868fc94c6c9cd12f5bc9469e207a85df49172acc92e03118df9c8fc6e5fad69adc342bb4eadf143a387a6cab1d1da0a1400e4222d4c945ed5afbc2f3a342680e09908cbab2f674f79d9cf27c0ecd7d57bee0be9345223403e10533e3f60dc0e665e8dcdd03f6afae734beb77a56ba02e1e46ddf28dbbeaad342b7f1fa5cf582f3114712eb278231aa91913c6bd2706a0da6a18851bf1fcb1a1b3d89ee50f4ee650b2fab209730de2559875d97c61a0a4efeea0b6a86e9a72dab2d2df54d0bff2c584e7df9462a8864ac41704ffac85733e7f1f667c628a177224b6698dc94203a8db7faef7e7d7b05687b15831f4b14f30eaf737ade0ac8e310a39cf76e340dc65e036611029cc51e2971660dbbc98fbe1885a4587cb58e6d2aece7b8c76daf205ea0edf9821dd9f2de3b3b5b634bdd4f42134f2cdf9b9d8c52dcd911dbeb2cd82d6e2961a6d7620e87013a84c6a0f7d0a7118205e24da5a598a11d242ee2378c8bb0b81e69385283863037eed40550fab0305875f059c04245a42efeefd62a67709a6896a11d50d7da084d75ed6d0005a03568c3119d15d5264c9f98ee0b5f9accc813d8309c5c8bcc1c75d0ddd01a669061987042f057a8a0e0071a7833448e0a1940d437877232d001e2c9b5e8ad8321ee1dd02a67e4b3287b203707456c7366530d18991198c25ce8034e4b36df61cbd4a873c8f56bcdc1afbf3623c016765dac1116d58ea98c610498548c45280342486471aae59829761fbbb6a202358e200d3ff0d11dd196c51764a9e4efe12a967c4f07e04fd593b20e406c023303e2c6f4d94d9e014ac8b4aaa1f90d25788eb5d22d74cbc270564891909d2f635927644253aeb6fa2ee0a0a7f818bbaf40e00c8974c478ba45b9f1082aa24a14b0a95be5b858c2ead63ccd033ee3b1eae140ef4a55c3e69bf67b4771b57e4efe92454f7b1d9a2ffb18e0dd284226e79dab7896899ba1790c8e0da6320f6eec4740884076211dc035e1f25c5d667f772be8e37890a87e1c4cf70a00e660e33bc5b9203a08dd2a7cd8748192ef443644c71010812946106232ffe7b59fc70a5da065e46cbb922e25493b17858806e026e9003ded4621c6ea31d37d5cab5741311a936d740780d90f12787d885233396271db389d3f07d175193018e44aaed5b0cb31a8cef981a1bc5a159ef25321dce765f2811b7a1966768a504f2ccb20dc405d913fe11e4fb2c5f323656b8ae6956da2085860246b30e6e5e0c135ad40703afc2daaef0128221b8ec984d130ca0d7cac76a0e836f080a4a4da1e9c1c795848262ba92387cb4e0b8a1d4f29055d749fb6934346e61cf1c2b95f8b86b478bad7bfcae81dff6ff4c4e1fad98e33454babec921126dd17a8a72f887a32c21f5e73b84ac6379c706d6b78d2ad0cb4850638d5053103b0ff42762d3cc41f9721d9cc3cd73fe456e58c2ab9cce588af394a14bcf3683bf611c51ef2cd49ab8aaf4e67a5bd0c3de4059e891a643b68c74623c9168322f22d7818170add4cfd20ea94bf68f3a03f7cabc4e9a256d6f9d8c5c875384ef80e1ee588ea40f9635a94316d712d28a09c20bf3b6364fe01efddb04fbb372ab864b20068fc2fdca68fa8e66cb521216e8b4d0791ba23e63bb62b67376c84cd0c364f5e90aa8e472f02a5831c4c8f1edcc1a849a44529542f0b6de1f335a78e39c2a30ca2810aabe9271ac3d31ecb5fb470a693676a68a368219f61d4474bc2ece8f977caa040cf7a0e2f99e7116e13060763f1bb645de99779d4f275f1c50f60b13c677d41a3c86481226dd51600891388d8b158d191bcaa89c9a9a98738eba3986949508841166b2b4a60a36f2a5dc28e72e88dc320d2f8c97e3e7ed2d259e4c5a528974dda497948191bbec2e642dac4409ef4158a0eb409ceede90e318137bfa48768a2bff4acbea99f221d44bed931a6144b6f188085e4ec991e41537d588c51bd6d2c635442fc3c9e60195c4666af05724e3494cd5d0af26a61bf38ccc98d2ff80e22825ddde8d777f44e7ca78206c7747ea0e968282105488f64e2a168cea86ff523223622488819c5f0a9a6b9a7fd80759817f33ad9ea0ccac59d4b8646414e5bf84552f110bc8e83c4d8026ddc1b19bfc5002697f5bc03a9f54cbf21d9f4b40d65ed14e7753074ff50123e2d9e28092f0a6757aede6b3d73b8928cfc6b96b2934c2aa48eb88cc5336269ffe37cdd8440d9481576e0a8d634f34a2b0155f48a7e98665efb088d9957fb394b4d1512f371b2e7f0103105961e5d24a6478aaaf4cd4413de3336b08996db0526797fc153892bf53af6cc0d2dd7c5dac41a75d92d6c438b76eac325b2abc01f8194d0b916be682bce8658c6bf5243ab436e84eb5340e82ee206de118406fdbed6cd17cbaacc693572a83349a045d913ccb02e1a5db2510b9aa2696b1406140323f228e7bd8d971054cabde0db581f678ff14a07a58c12b0d44617118b1b468c2409ebc3f5c54affefca9f09135c042f11abe6b0a06c8a6697e0c46e37dfc7568c4c9319825f328c15e8934571b383a0de356e547085405120b8d31c6556ca66694dc78c9ae76fd4209b78e0ae96f229633724a0dcdc53499f1472a41282512e99256760d4c0b550cff7c41585e30c9ea4654d1a092d99e22a97c898a4af29de0d88e100361e11625877999c6b32860e3494c7513ae95545af5d6507faff50116e9bb46858c451739d4b1ec161bbd9b1fd0c4828949a80b5a4ae461a6be41462cd882a75357c4419a1efe763d6de05c64857c461a4e266f227c80d10b6798af4e077efa5c70c426355c28f5846cf193d4b0b87f7dab9b7a8713fc9a46864ac656e10724572c78613c159a31300f42ca50f9bc4cd7de006ef0c983f700f4aedd792b31472fd8f2c4df4b7692f9816d4353584ba81aeb00321c5b321a57512f669ea56951c6eb1a8274463bfde7e926775400727fc330e87fa45bec1cf7de337dceca0e0968ac43afb0ac59e9879db764c2fea3d1ccf1b03db3f241b80782a980820d8aba2657621952ca190888f10d99071c59454fe3265fff141a2d264d051190ba3af48ecdd2e76198a98dab86562a040af6f6345cd2d57f584dbb50e6b5962726a3b4f8e6442835f0180bd89eacc3c4e503b508d70ade50e1380f7221fbda018e2b452fc92fcbc68c2023a7ed80c7f5da7b7ed8fed0d8f0a7154ed79b13ada2d1473bd7454232fdd474bf2b367dcc2c80ce4035acdaa935920ce424e074d0b92bb3c0228dc10b203c6ef98e173df70d33396dc690fd53d2b55714ec47df9b43305af9d2f1386cb7950001ca172d26eaaec16f601985f92ba529b4fa61a21c1fb4eeab4b20679c14676b72df796322529032b09040907099cfb10c077b2761310d08114d7b66a8ddb3e89807eb20e8af2e4e049b49eb86a203d3ed8950076160a1405fb9edbf7c4164610bce7f23d9185826905ea2651e5892b76f5085d0844ee68074313388476aebd009247fbe81e1ea4a2dc0cb6b8f375a0b8384994c9275b1d4871a75010bbbe29ca0f7090e3cf771f5059827522abf31fd7cfcf20339de77563cc3cdb81c08761d54a9269adb5f36d0f61177b8e042225c764185a98887d1685e131475c2781b015699b7d7976131856ab48c909093204b4f2832fe407425ce99c0bb1f65efedcdc2964c519c4ae5494eb89e30f1004b00b08d85f5bcfe713863d01a2eae2b2907eb1dbd1d6646de5892310164ca215ad759722489865815d720c659f42cc429dc4154bc8945d1d282e5745908257ccc7fde439a544d383803743d2ccf71a6dfc089e6846a4d17d6d4a6e2b6d1c556966779630e9ccbd0cc15309d2a9004870fd47e7e9d88f0e686400428c284a5c61236bf7d1b19f2d47552c39a3022a88e822fbc992431ada1251dc944124eb31a22881860b2654ce3881ac7d6787cbbe33c3e5a4305e84915aa061f2ed9c11c3a4165e40f9766e0cc32667e6db3f9c1c9be3ec4340663f893e3e3f1b105224a9e7266b4370fc741dc7a938c467c755492c0a86286794c8a2ec4758f43a4fbf1a077572949ffc8a3ed755228ee8e33e12ec2b4389387e7222383baef223d7719c88ca4f7e128fecb8caa5ec0401949f421655853a8e13a6e61cc2315b893e33883614349bb41b3aa9a99a8d93862368e518f88fec029f43d32f8eab70fc86e8336f57dc117d66ad5d85a3738b6e6d67e24c1607862c4e64a5f0393b911cdb39ebd68516a5338252be65488e7ffe7d0efa90cf41f1f394e8c39ff8f9c8b38f1674c37b9693a3734bdd107d6e38088a3e3744ce99ddc41aa62cc549185cb00a71dcaec8e2fc47767de4a41d97b29d9c948f3d5b39fb8efb6c1982c33ff7013a80ec8683e24af459f996213b0e8a3e2b9177441f1e126b98b21b6291caa54ce5230fa9441687e3528623b23851481223ee88717cc7b70c516de1dc676808e83ba24fd3c41e92fd1a39a354c85d11f4b169a07864cb101c07838ee088ac21a813ca4f2c21a02f40ca40915beaa10c2080309acd645dd4af761f2096e1780c22cac71efaaed58a1acc0d489021a306473c120328ce4416154fe85bb358421c0b8e4867fd6a07fdf3b16b5476c9486326c836c4197552df5022eb7394c8a2de2c225306fa94814ea3b36f500867d4af76ae261b29eddb0760c3f51f3b5a7b07a59b754060378b8a94885d4d833ea85f4376f5e3ca9532938c06bdea87f2aa0acc4c68bdf060c3a38dec5700aa40c0cfb3fac76eca468d31bc1501b8e24e20709a7822bbf8ac5dad7c0396816ab9239dde430bab59d4e7872fb963ba953ba65200b03009fdf4cef9a61a7c8b9e51470103c33a61869f32bc4cf3dc6340eee81668f003ec8d7061d81867bb7e4d9ba558ee481f845d16521df55c0a7c63cdeae76c5577572a522bea9c73560084b91cd775950b5279be451596d621c5a5ea910473777b0737706f7a12b88b06535876493074f4e9a0ca2fbb54466af5d6a18a136a7d41f56ce59aa0799c7901888f2f33746b413b57d56df82a4a9bcd665464ecdddde1d7307cea72c77434f4022edd4d69534a45d60954649d30cecf792a763d4017b71ea056fb690afa59f4507ebab80236ddcdcecc4a6ce03b9819a15dee486bc5b91c275e9cd9fa1685b0c08c17e88f2cf0b0c035275e64585819b5117e4a294fbf40a02d2ad25741ee0042044838802a940ae5ca4fa6b3ce4ef4167bca40a9ed39a7af90a89547ee5968bd651728774ca1ad25cf76a3f723abfa7c1c2fc2fbe0e6a77761a882dc319d8ba4a41c64b95cd925f5fa34c815acd26264f960d714523df65d87b018a69b1d24b877e88c57d609236dd108bf65170ba08fdb457c10c4ea523a914ceee0061a64dc5ebf917c963616dd4309008aee485734b494a7484756fbfcfa02786fabb9565800bd380882f714c51dc136427fce203c034e94913eb8853f6042e98d1c1c213c86beaeb06d7a2395ef4c41f3ec6e6e6ee6c9719e42f2f37b588b1ba4923ba478b999628c74010df602a8ac36ce7f9327a3b0704e64ca2a99d516f567b78f1cf9aceafd9af3a924d919fa524a2d0e195d9bca35cffab1be114a9f05f02dbb7e827412ca5d74ad4150ba2395b5ceeadec3204f5156e978802e6efbec3072949a52565f9c8f86d6379873006e58f0a17a813e0b3e7ed2347625e58e743a084a2048a9486d334bb28b167d327653330e0ce24ecacd96343593354dcdd8085457faf35f6ee8a58e7a794aa1659ccf137c1304250982d27520a0ef9e1dc5642b2e056b2b1e80d25589b30a8e47e41179441e11f5e91e910968ce5991cc0cbed63ab65add2b6bedb9a33e6bd775d4274729ea8867c760861a32cd66507c3a454f87e40fe9ed75e6119980e40fea6d7af6b122f9a6b117458b19bc89d6b1d54a4ae9995832c7712936a8a25492f41155a453f4c54ae9ae9100c7563e2608518161ed5c3cfb20c0eb0c1ffd2a52b9cec8e4f1453a268d4c11549307fbd8271f1d0301bfd857ab7b977e640c04f9aaeee313adf8eae306afc333016c48216c8074558741aa60e5aafe00f9aa9d38d6af6354df2175c857f50eab02be6380eb4718bef3611703a9a608211061503d08345812d4a9f9a48fb155319ab62a44fcd256c54b063cc7144d84a85a78140bfb8ad198c2f0e60c56bc6298018611430d94c989649737d90d0fcf4ebf5879cecb326e922cb5b1ba756964b5e2785f76a29439c66a6b15c515eab58dd49ed86ab17141b620f060cc55dd295eecd1ed97658e386a391232f412ad95f669ca5eb05b4a902f4ff24465cd1f98b2cdff9c40d676e4c119497070c61934b4a0c1c6b7bb964ac08383c8f6e4346eef12688c971eb1049047416ac12d18d6025a0bc030c1b33348e9172b9a524aad52170a5627dc9252951f796c12f77b5946090a18f7823638282ee7c62be27a491e1287e5da1b38bbf6c81e71bd2c2c0e17150567f3025e6181153558d0c3186ddae8a10d196fdaa4e17eb016a70c0d0c421929f9c61c9da05062bae2067a61e28959fab22cb164924c42d8d0d5fa25db8ce086116a426d96e0300216416d664b8cd8bc4932021921364a405904b12163c90863a0b0b92d19218b24be5165872f6754375fbcf8927cb9e2e3e14b13dc08be28e1c39723a6b8385e96f9e2c3165f9270435ed858bd2cc384142a28042f7dce6fd93d7934ed168179f2e4d14cb9daed9a3f44a03e76c3b6506efcf1b270d57ad78980abb672421cd759963caad3c931d0ae95a395a34d2827542b07d3428563627253ceb9cea5e7f8e2d9c7ef7b2a2781c9839d4747bdca1f52ba354d11382e06eef758726d8f3906369d82706e7279a164e7d5ed9100b53127b74a008d953c289fc00faedcc5137b4225a5e010324441238a282ba05bae0d03e853a3e8d4c50da634c0313a786f88be3040f68d49091cba204b50bc21383568360a0ed5cd907543746d51809a045943c88d0e41d0406212e4cd1214364041d2305a12448d5b193057b494c0149d000c13d604d7f4b20c9821286084bc20c058712136ee2350f27342b9e5909148f54c1d4193afadaf7504487c859283ef50d49de3bbbb8724df3d9ce1c1c8a9989bc6bdb2eae27b0264822728e0c1895fad92803b247976ca3ba4b197bde0f03c8f6fef198107c67122abfb79da968ab5dd84f6040459b520ad2063f639d8b53af90080aef7b49bd0ced3ee2305df945e7422e1919ab6d0dcf5efda5ce56a3757575ce5aaeb9b273333e32031b96b8e72575d3c3e2fadb42bed8e725d3bce769de5f161f2dc6de8a2bbfb5db9bb7be7ce2eea0c935ee70ed6c6e9cc715c9d7704bbbbb590524aa69372949b2796acf5d65adbceaf5cc739915266e9eeaeb6bbbbd9084d993265ca9429455faf40ae564a8552319a5275bb9b40c2c90e5aeef7d2e60488499333ca68b2268c6b5fda9aa8f958704f2f6d4db8f8c2b8a897b626567ce12d419b6d395a6a526509174d9c34390a6a82a4091745b4a4265c00d14ed024c851cd2f68eda98932539420872d6a694ca1c59b6c98c2e8471054010155395e2fcb4ca1a655548da074de9000bb804ffc44cdc93d9162c5461b33b54ca339669af939e79c734e4b5bcf71b4aabe02f95afdae61d3218a155d01ed52743362ba524149344127929a9a2d892f4e0891e60c255c60b154460e63eee5c1092e64e098acf1ec9471d8e239072ccf5e576650904995a74e9998712d3319cf5cc23cfb08947b9631c38501966059b274c318256380a0134e509382d482b049395052452a48cb275b63acf6b69546be26506b0dc39861d4adb79418569da3b56e2b1599db1f13ea97f5945ba04bfb5107942e5747bcab7e592cb7863ba66e6f7566a95bea96baa56e3d6c778c8d79ebad961a86598f8d61588e5b8f09752c06d42febd60a0901752ce5d6a5c4f1934be9deb527715cc580bc18d05b77318cddf39cd0c52ecf3dcfd3416bdd18c6e3adb79018c63b6e5dc7ac632ab7507404bd75d93a84deae7ed401f4d6555d6eca553ec24a40bd496cdde40eeb2d2f57473cb225c78fe878ca77a6eb78ca87e888ac934b594acc1187ec88ac93e892a944964924d2a59cf3233a3dac737461b78e498fcdacc511c77b5122ecf6d653614fbfaceb841d0471a7332b85ce530e81ce53a26c08702e5b88ec97774acd5e3ecb52b77ed9d42c45c31d7ffee35390af75eb97a5e17e3eb63410ba9c0642b77ea7f1823ff93c29a07f84e1c71b259cfcebc05338a6fef4e3913f85e3e94f4e4f0ae07e8c013c8563f727af270574ff811a08ddee4fa1f89f05c193c94f21076f0a49e8fee49f374f8c32f9290cdf148e22f8937fa6293d8b5ac1e4d4bdd99fc2154c27989c7af5ee9480daa106ef85d2a644c9cb5307536e0d5b50bdd7a5e83d718506c514124bfe6c2f1cc22eeb35eba630a52648eac62e9bba394b057659972f017659efe1511ebdf556525b6f2db5f5d6adadb790acd0ed97d20c27bad0c11bf17cbef75eaa76c7d6ed5b3786b15b8fd5524d56604125b6a0fae95814fdec52f4535ca17d3a1d00d0f5677735fb6df6557341e32acdb935a9b78e9968d6d29a54ced25051e4d0e40d5544a39968261a8dc25a714d2f6d4064fcc853b3011d99d25cefa50d280bae897b5fda80a0c8315b799135017db9a113e2971c225a4981c259d08ab78635fc924afc9235bce197b421c92a083bd012275509ad034a52030de294681dc4865a2d430907a1e1885a306a98419220358f096ef81204080cbfe48ff6e264d1c4cb1a8bc6f55e96f192821c2fcb3031337dc0e3f2284fea3c2f4f0178791a325f2f4fd6f57d5a4003e061601380b6bbbb270fbbda031703913ba4f3f04bcc9d5e29ad3e68ad22b52b4a296d2a59435a665dc2706262cea494a64fde385953ea596baded3ea42baf8ba76340e48f59a45f7c3aba5c178035773ac7d9dbcd5a6b2de88361ed2b9e9e7e719d58a4bb5b917ebdac28c22e5a6416a9b4e9ed76b33239bf313e90032eb6d6d9dddd6375aed6ae768b5c0db5b3b68c76516f8efa844ce79c9373c9892086ca7155544356e6da3fe9aa382e849d7455efaf035cd873ced97d1da05d08be7d1e913baa53ce8bcbfa8a0abd5dc924334ba6db582ce4931f6705d8f8c18b353b28516289cc4b510d4a5280c6133cc8c639c3a0eb727ce7328def9c766ec57ce7b70635dfd950e53b578fd9e3a75b91032e77ecf1d36d904e1cad77ee516bea4c26ef3a21ab2ac43dc08faae75c023de794b32539c173347859d9af250843a90e3619c0b0cd00e669d153d7ecbb59a2c0d69200024ce3ba3cb0210942f452e59393c7cc8c67674f0634556431869929d4fcf870830d6850b1e40c275c6683b1831368801f34b9a3cbe5e3a76b821980fcf279496f3999f589349318c6abb627153af738e7e997f50986633efcb26ec1ab5ae5f096cb83373de617a5b728077d044d3ee6e07c6c7930f6f851be79eb3d1d439d563cdd7549eba0b59f68ad7c592ba5ac282ca073f0e64e24f0b344389915c0db2ab3d2ab5b6baf3d7a5b431eb9c33a0782a2ab5fd6d15c2bddfa24923f3e5368fb555b565ce12675417cb2f5fdc009328754a74e85f48b1b72afa8c278bd03292e5de38ef6392f6440c1cd19c642c173eb567476712ea568334309886435a43f3421e3380f0abb38294f66c778f8c5b9b5975b01b9d3ab78abcf8fac8ab65fdc0755aef59107749cb07ba628d609fd9ef77ba0d84389fb533379bb38ee8bc8b81ef2c787e35f487f9e70c417146002bb38b75e02bbe7f4ab27ae244802cee9049a405a827c4991f029c80ad371dc0b2deb84e99e7b3f7d3a618a52ba3cc739f907cee9394e38c230d6f7e4a348a03fbfbdb00b797ac81f464290b10ee4c8b1b373faf1f423cf733dcc4d5108bb38a7cf71415e11196c7179ce0cb608123623663f824b2f6d43bcb17161f3a797362e6ad8258998b171a9fdb47129b271217afa52ee90a264570b5ad0a046eaa51923ba4c2a6ab041fbe9524ae93279396b5d95e33ab7473ae73877715e27d74964dd73229c57f14875ce3df1c816161f6197853d3e2652ed68725e7d9691afe9f3cccf99e6e71ce3674dee98b3a6420ba9cef957f35a4dae75cf87e694768d1a66de0006b8862c76764ef4d9c2e290cf39f7f1becff3562cfb26f8797dc43ae7353cb265881559d43de79cf32326914545560ad6ab0f9941fd9aee4a23a94c0bd25429430a19e756b4ee3109b8a041072e4b824023ab528dcc137d6650f59a4cca38efb8b0565f49590d53b6454875e93934caa8253ed91a75043de308a5cca7e3083b2ad2e420f3f9baf8b046cb4d764302203c9145543efefaca594747474788dcc1def2723b08bad4db41ff26fdfceb36f9c7759676e8f967fac0130aecd0fa877373523a2ab0c31dff76ec7f37baff70ac2e003bacce02abe7f897137639604e0e9813f67f15ccc9116be874030d32e81c2c0c2ee0158e1b3baa294f1c742d548ef78b3d45ef2ac4d1fa1cb187dc31bd754b5171ba4e38caa4e77a271c47550b0dbbb8a50a5b0058c11d75cccc3cbb0e1ac3c6548d09c3c6e9ed73a60368e80bd3f8499252cdccd017da133ae71499885d3cc4899fff74bfd7a9df9b721ca12a54f9ce0eede80e5585f2144447f62be5a3fdeb392e39a6e37acebddec33a661d6bdd3825ea4876e978ebc62e769ea39bf2b1754b39bb8e787b306eca755ca54ad9942a25b28b95c205be72221788b2dd87080ed16725de7eb1e41046699bc2e83b70e3c71eea294f794a7472f4d2e6c4e85d2f6d4e825ec78c61ec3a9230cc7b76f149e838f8af2765d42882f03f0ad6d309fd384e43947f15e44e24d03f390d41ff38b03b9d50ff731a9afceb407b3a817bcf6968fdb33edebf38a870bce0393f852e746db4d1c69b1bcff9178e47c6540ccf75cfe1f071b59aa16f19e7e3f095cb538738c2c9f90b516103b4a1da4ca2f150c7a64ccae41214a2a3b904858956b55a905091d16d22cd808284d8e8d9d724b56e2d3542badc51c74c88907e69b963ebd66ad6b4925a4b0ce3d43c7beb8dfc31ad3d411750246df1e2044c58219bbe9231a9823266524c19634c2d09d97429a75b39a7a76a1dc3e1ec3265edbd3a66dea364c975cc5235f9626f71b436a563d6fd14c78b34a652475296b384439ccec19b3ba66a0ce3f1eca9238671cf9e42c330167599ba316c8a2da87e034f8c6698aab12b95149372c1973627483fa66a2d35ec62efd2427a6edd5ab750042d6c00c95454dc31e5291db59a8e19bb526eeea823d4a9422849a663c6b016ba40f1fd4df0863c0949d552b71452aa963ad211a4620e8cd0095d21c7a720b50329ae901309ed39cee5845db54ead1744ada54868d6a3415684da80a2a5034f56d67a78b9ed1b70310beeb160845d0c8104785e849374e5190d494768d42025292dbd61a04abb688629c3869a5a6516a90007e12418a855c400bbb8c6ae8f86df3f5f335367506dc68449c872a1e76c54edf6ea1f04ddea2a1cd982e32951051691d48f2c250a91b751de8fba620f25aeca77704494cf277ef20fa6dc1e157c40008414542192a54457d7efe95388000e9a0505cda03673346b3368ce39e90f4dc86ec89721d440c34ca623ba12e08945523a447af84424e57c1a72c375441f290605b21b224f0fd1c982c8089a4c4774f5abbbbd9d258cf670110c0851619c4a73cd0c120009ee0da976a4e33788dc707922e2e386e8c32a92a5449e7ea55c47f439c0ccc9d297f239b2e40b1e8a642957853e2260a38a4cc7d52ff63944a32d24e979a7bbfb44a4224123d3690115328a6429efe194b3bb64914a87a52c154a990cba7ca3049f6ccd196860d06431888045972299e7d22573dccad9854192144e22bb871b8875b3059124e8882ebea4235430276d21d43b4ba9d71aba1043d7c3d43b351269ded8d5222779218b88c93d37893098dcf36e6bef6da076d38d22ae1a210ccbe28eb3c631949f49f30dd43194386ba71a58bb35a05a5b3bce1ad798b08bd640ecc219baa33c02328526f4ab811aa8694c80fa99933ac637be8945dc5ac77c084941fea8ce2f94913bd86d903bd81ba881382680a02f0da6813aa8b5f4501355da363cfbc83756e224eeeeb6c14c0d69d63e10ba23cf6d312680a02335b39664d626d2549a4b33a6cd492a0c614ee2611763b9f28f78220c9ed730659eb3178a71bd89d4ecb3368f6a18a0a0c9b5012951c17d70bbce3edd26c58a4d8a14db0f6b0ef0d3ef4bdb0f5d3cfb27bb5b7a95f414a4abcf1e9e50d8a08d1e000dd35dd3eff455101e664e759e9e345ca6d460022219c6fc7841c20443b53358c83469b5789a7673332d2389524a3da0de39d8558b604048c74268d38228a6e4f0459720592d2243873545d4b420514356f955bd4a9672dea0f1cb9a119aaf124dcdc2892fb5cee4641318266d3ec8f0758caf3e42656656bd6cb8ec758ca2a76f9ed6aeab0c0ea18a5046a8211411bf79ea7c9a3d755e923b6803215fb4459494d40f7744ed3c31a2a43c75d410c3465511c3c69d27be306c3cd59e3a7514110accce135304146df2a04e5750e494dcfd5c4047bd53c1aac0aad687706e51449c0faa4844fdc83c944bf4f991b1aa73fe23ebc2aee3441feb9efb70def98f4cc53b45dc1a28da73dfcba03be2b812bbb8257625c91d9cd3b0039a3c389fa71478bcac2bee4c81089575a24f0cb2ce3bb1a3b5e3c81fd5696a34c872bb97de7a00b407fcd231011993b2001283ef1c88fc21572d50c1776050d1b9945bb8d8d5b55253eee8c34707eb1c480a9c571fc2791d521d04a938047413fad53928fae857e73fb254111a64b9200ad4d9bd7005fa7d9ec83ac1e49e976072cf08750fccf7dce2bc09e7e58cd5222441b32476c6ba2224b7d997191399f53b63384533dc6666664f64d657133693cc82deda2cd77bd95304f6ce716ec7aa3b4e524d01ed442939cb59ce7296939c5c413a95d65a2b3b713422dd2b95cd49137a8cb8ac19934a4a788145186ae0d02649c626d1eef0703d58f9e827aef4dac457ebace133f3ec259576a5ede580e0ee923695e1fbb89f73cefadd7fcc3a3fe7bc737461b2f931e78dd0e92d03774354b16847969d3ca4f3d3557f5c77cef7ea99e5e5b135f6b5f246b8d2963c299beeeeeeeee6c96334054720c35a58fd0ad3fb9a5111d19050d0a4f10401c336d0de320d2754ec2045098c131a3b0d5e9327581029f190c615322a16e9d71ce54dbe098a1f5d4ffc288b9cf8511e81f9512635f1e30462e2c719b4c413fd386b396c947441f3e2062a92908d8e011cc2d092054b126b9ec8461f29f420460d31679410a28bacc551d66688e28b9624cc7c098209198b3f382ca105094992a21e8e64e82288376668d105e9896c9c502cc0a508206e6803041915c8a498334038d952060e54cec894f82650a2a8628da3268c6413cb17639a5033059a36b259ab3549c117628e001384ac0a2db47c21852dcb1244c87e9828e3d686872baa1822e9740619b530698868b20217c638438ca51ebab091219bb53068501a6a728234a8904d9f421ddbc00a1a56aa78c1856d8c6cfe6061020d2882b6d860858d6c1e756db89d028ba12cb02862088b2a3f5e6ae7db48c004b3062f6d58d030268d1f5d3532348925444c812508871fda28fa198117b623bef8210d2c537ea418b16143942664b6582201597e3883450b9e902193841543b5c40a14ac4132060d3053a41926243e3457b471628c27a6a0954903690731ce10f14045042b905893c5cd1a2a4ec8c6d5144f8839b3c51a2c3c98be58a2da1493971fa11290208a19324e50c60e3f4d88ae28138615316a70d14a3e80f4f0b45d61c3b3dbbbb251b1f4fed226460c315e50367e463004501343dcd086062d64a3db0db268a3444909953072005b2af0ae622d098027770457ed9c87b7de6e53976f77758ccaa48fab5a5151c4826ffb236598b45141f476f699fcebdc32ac9b230f8fc5f1cf714294fcc08fc8490447fb56ec425557913d86fae3314dd343c5ae28775479d02b7709608a20bfc78790c66d676b5d67dc66661fbe30372a806cd7751ca594524a29a59452efb84addd66ab14c97d58c3ee9b215cb2068369b2199ded1662c6b82d8b84aa58a72471b5ba95454a6104b4c39c011776cb55c1ccbb1a23c33ca17de365784eb816904cfdee2f9c9c495b6a1db73ae7adbd053afa7205d279f4a505531878a5d54bceca2ddd57881cc903c7b4e0f17c84bdb9095e7f8670c4fa178961ecc9934f452f2f0805d2e39c6d483cd085a0841362d526c5ab4740f25d6855a4a9b98eff3fe933ca75ce1a5f7b0141985efcc77777bcfa215b7e79473167d50a4536b67a3f13177cb1d23bfac4c2965cacccca4e9a5b2bb8a10aea8ced5ea5ce717945b755f6634aaabd26903457ee0930ceb58921a5cc679174237d7ca3dd53c21a1308c7656ca7ea712cda4dc4884de042941594353f39381a6b3198ef1ac5fb3ea9387fe88679f46fc6891d85927b4060a5012974167865fec6880d4d0d6744a1cd4bd61a13ae3a1aec67da465a3c69fd760830d381bba7cb263b25aeb0b0405b83a16ca17e5ba679a1c4e87eafcf4aa527de7aaef9c272be4970ca320c843b048e0fe4f4a296773f37015c68939b88abd5a61b921d0d58a79bab185a9d997e2941e50ff703c29a5284d1c572b1a9f64d84a5631cd44f24986810cf34e1ca8b476d7398d843e8e5eb07a1cf606275f8d7ae17482fd1aaafee3c02ee73f0fa4e17d9cff40d49f1efc0f05d2f0fb0f07a4a1e9bf1c1a7affe580295005aac01df00688035c7d2c0c5054ac7247bb089e43c080e53cd4da6bd43e297ffcce0a3b407cb2633217c342aefaf4d50534a4c0579f2fce3be4380d7ccd794ef6d33134cf362d44bb4d55f249867195d4e7f649f98327ff0f9d738b0673d22324bba419f090fca1c1ac4246318513728a298514cf3d21a550e2abdeac736ef95e74cce10ad9b8d3c5af669eccf38acea5f47ee56a0e9e9b0007537c5a39ca5336e7957b0e690e2d295f72ec45e682a36a3e086c5b906c5ab47861b7f8e9431790555659abacb236edf64b16ed328b762794efa06ec9a17c4a250d57ec6a3377a4406f18467d4ea64dca946972473b05a2348671480ce3359d1935246ac58d46714497a8d1238c6896222a4714cd37bd11d12825b011d7fa68615cdcf17617f292dcd1ec46be7ac98c2c3c545c51be89ba492b4142c4aeb1938c929a67492d7619b5f7188eb919179a6feff1aeb196c6341ad39867340967874fba15335160b843a2ed16fa0951a3fcb442a3d656b9bd57058d0e56be01f7a54d88273f8550c26f7e523183ca8d4aed572f6d5494f8c95ca85cb13d3fa9b8eccc9629b311ee67cfdb273d842dee0c73b8533a187287f4108cc24c157cdfe753fb094218979be7dce19b5f72ac1893d7f8ea3d6cd1acc8e0aa48b971d2538b3946773aad274a29d87d953b5068ee489f762014773a25a1ab0fdfe4ab022f8692e40a3e06278e1ee626cfd46dce394720f3ce3979fa6466669ea9da9c734e19f3b3c83645cd2cb205cda66d8a9979e79c939b99bd847ee639e79c73823f39073377501a340337b77b4f5a666badcdc0cde5327073b90cdcdccabf838b3b3691f5b7d68a2f4c9e2e5772477b9fa81423f9c3321a7496e40689cd6d8ca334b5336528936f2b5c4880e79ccf130aa08a75c85c9f1f19083493f4142da1c126690ca4337cd456be8518d6795be79270cc72cf66bb64261a5cb944463d18e8d8495e71f455cb96ede10aeeb8fa9e4b3ceb382623cf33358571a5b3cf5e8652862c29e5bd52cacb3e7dd638ec993ce69c8543d7d5afa57e49778e59cb021ad488f193e7a7ebf2acee40658a0f44d89c28bd9cc224f5d21604193f994829a5742aa5149a5688b191c04886314553ca1d2da889c0074213f04b8a89999385af587969bbf2e447faf24a93b72f6d579458e95edaacac61b3b2f4d3b18471c0975984954e0a07f1a6879f0e22d98aa05559b2b5081b2ae5669f0bdf27dd02fd741364983174687635fcf41e1f2d0f7a0091616e5c2e9725c9abd857ceb01cad1e36a1354deb2d492f65e022aa25cb2ca916c10647842c238594976f7efaed84d6088df1d3afb50981f1464a1018e24a9297362e423fce97bcc4c5073ab9d07ebae532fb91dafad2b6458dee97b62d4b3ffd9394cd373f3153088a9fe1b4a2c41bd1592857a5765238eea54da8879f938a500e3fa7509297362c4a3fdab76109e3b997362cb79fe1ccc2c5339380c816268ccb8a0d8bd1c442f4e5a50d8b152c51b0341626dc4bdb10670cb166d221d090f9a95434b9a1d602beb40d11d40d41ab2f6d43008d16f5d276250d21befc083e4bdb15a42bb7ff5edaae6cf1d3b332b35d19f3b303f4cad7c3cda47259d2ed7fcf92a2943ba48d08a29736228a7ebae4e0328088a52a495c6fd9050121ca1021990c01228488b0f2d246c4932b4b6f7a692362898d08a4ff5eda8840e3e3ca9501a2d1a8c4cdb555392915a2190100000000f314002020100a86842281502898ca8a2e7d14000d7794407a52194c846910a3300a32c418628801c0006008218648114d1500999781fff6363125a6cf805e0e05eb46da04f7082f61ea02130906dd1f342e4d324f63692564c2a0f49824f08f1ce2f529e28d78cf2d677aa9cd473b50c2026c33facf9d626b830623a289ed9c275aa174112f9245af42e4766f6386da9c63507bd6935951f5e2765185431ce021eee31f777fbc9e675256325b2093d75ed5b497f55dff9c9e51909653cf96418989acffeb9ec73233f9b5959c2c6f120f65e247efbf9a4aff5631d19f9ad2e92bd861d2ed1443d0516918f43eafc9c06f0f66dd2cad77afd954992fa2eb1d6582a1997548f63b54c747077829246202fc94f22859faff35f3a30fa27cb94a83e4ec61c9d7c7443aa217c0069490cd9fed335128f6fdcc3fb4a2e7c893e22748531702a9dcd310fb6ae5e88d2a2bb4f495b13d44111bdbd1366c2c5b33d0185c5bbfbb2fbaecfaea6782130bc3835079ead2e4f1155f0d74cdb7669b7d75d4fa82195d7dc4c49e9fd58914fd7086feb8eb72e4a7dcfa5170d75d647b2ba9457ba35ff444a80c9c58ecf473f91e6e74ebfee7b814d4c240fe8663c3212e66b128d782bf925ae9c84c3d6fdabf5eb9809f5e45ad587848cfefa379c422d7fc68515e388c25971eb8329b2cca8db5dce286bdbbd4635daec806b84865c3a95083282bd59a02d13e11ed4b4a1a1f902de8214abbd70c8a1a03f1d0959c222259e3af76afb9d2d03b06980e66ecaf62d6cc19ac602399065fb2ef490808bb2b0133737b845d93210d7def844da1d066454c91f4d6031d5f53840b4339100dc7c3e5a012f98a56b0f097ee8350404b98d0537761b33a43b4f44c6b524fddc1a5e3e107abcd53041a9619933916012735360630cb8552a5251230b3ad8882246effc9d634c33242fdc529493289a9e82605a18831923559d766e9cbc481b08ee559ce1200a38aea62c9d95483c24d82422587804ab9e45669a1d89056f5efb18936731317e2df753aa6d486b92972abdc770f65d37906d3605b8e545fe61e2a02672823bd06d0192dad65e1bf2a4ca240bdaf86435490e020c720a3393600f16b92d97ee2180b945570dad2befd1a9c354a293fc412d057edd63d1da33d195aabba2ca253f36d05d6b802b203048b9129fd8a4a4fd2df4285cbcca087378533fd0e6aa1a4a5d9aad8b3b23f10d5e3c06cb98c13007abac2a73c8375ae5ba7135302ef6f7e223576af1b48ff6685f4279861f7e3a93c260b1e9213944024574359c104c5029690c7ef6a74bfd804eb7a33be11e86335390a7474db65ac72452d1b95ecf9c02fbe4c2bbf84c537e9fb1071f118b2560085de4a307075b8aca598b6ab057a8aa6e26aeaa1d969a304b0b056eea120384d0595b7844881520dc7332c49165c20d6609fd246b0c512f81361cf2d167a4c83b5d38db1f5164856e470fff35271e29d1fb7c5ab6fd56b7418d8bc9b80f27b7d37c3ff46b67bf56e87eb1755a2d0000aaebad269dd58cc4b9493b030e3266449a1bc7b533ebcba9626f44048379622ddc4a7bb58367ede7183d5d8cc281ec334c65a6529b5fd253f7f79a9d8575128ea232b8b93d6b0227f73474aa3d4f8732266bee7bf27e8722be90c19fcd40987d4d01feac7ae450889d6d45e0e38951e46a6100c4dc24ef18e1730a7e7966b9b1b69867b362aa21104fb005d94202219eba3ddf95a0c21b6393adafaa2d6e1a41f2299691a6cfc501f84eb20c45dbb3566dd89242538e5bbfbae044a879ac05057b236f263a94633cdf9508acd0417589d0c357139a67a9a51e51b1aae51dd223e86b9b3558796366ca7ba87df979e0dc9fa9aa7c1b112f888825e4659a814b6a1352c433fa8663729f2704bc3ec549c483ea079950f08669c5baddf35f6a06f2845140aea958c67eb3a8b1562f28cb7a64747a65777739f28c14a4f5685d6b1bfebfad69e78c3aa6b0ece8d7ae35dd6e9c4c92b16964b2ee36966d5d4e3bd7e88f88596dea313f7b9d2aaa3b538ed2f5aeef5ef9cf603c6dbe546c78f41a0bd7a68048cec6e579e9101e4bd37a8c7a5afb1028f130f1e2df0088a55290cf302c367771a2bb58fa9ab09740462438c524f187a5506ebfc55358d5789a0d3889aeda79bcbf959e9eb8fa10a6f30ce2721f0d2a941e55e5f336bba7821dc725983e2486ebbc4ce8d6caa2ec7d29261aa1ce6d5b43eac36251058229afe4aff14ccfc17545e6f6b49436daa1a5180a0abfcb321baea9eff2400b5847944b0f0592864218e512e8818370eecd4ee6d4124472397ef9fe9eee25634c2329d48921188e2aa8b43cf645f450638678d77954f48f479773bf0caa6840d86e180756c37f21d4a7a8b991de923b8a61580c255f145cdefef7548efd748b803eda5506d569ee80e0157f86c58532ca53f60423856509974270b45b04b31e8844cf8b63d54ddbc7628b6796bc97358886d44e572bae4398ce8d6ffd194c00fd2a2e5639d16847e51202ce6e99e1f2ada9967e6063face75b742cf5fd25698652db811a0ac661226722b48722f50c7612062894e632a22a50548e2a7c975b55f1ad723d24a1d64422798349175005495ce5aa9b921241f7edf287e8e23138cd8d828c03ef8323d4255dd55e022600de2962d8ef38017041818450d5cbd739bdd0c4563f4351ee7540a3e729ab0eb8387d0c9ce74e24fdf947519d23ac0e2c08b3ee1c6680dd5de930c4171dfcd23870ba0a4aca702ed4c5940230ae720f736530cf775195b81d36ed1f7e6021a9aaba772308b71c19a352e57f701ae31425eb7d76990df4482b3a445d76b93a4c143774b961a85b13c2019194a96ec9c8abe5a6756092faf14e9298c4449fb4201b8780f7e3af9128a87559a543f9a0f564998bd043a2dd746f1e564a6d86ef46405972f99f7c1d840172718b0ccd00a534c5cc1562d7bf03bf5b076d17ad9af8c5d2ea596f87f28febe059957fd02cbf677beb08006c35c27a18c7508d03bde4ff1dd70ec920bcb41eb58cfa6388ab184d24e0e9e679ced0bbb826c65af0b4594936fc9cc50f21c2aecf2ef3bac3d4941e73eac5fa724bfc5bc22607b57ccbf362a853320afc4c89b550cda5746192eadae91820b901402c4f680d594408dfe65d84eec9c095242748b1cee17bd07c1931d763e70106695bd9d13cd044d06ff051d52f7133eb5165771c588063c60fd041024f1add45693a23d915088bb69f01069deacfd8c20f05c3b4736f9af716040ad16ca39aacc1741847da22cfa3cc0de04b6e4490ff5c140f0141037678e8634feaee2945877e5263bf408003059672c87a151bf7e8cf81b38c5d28a84304dfccada89f38aa5ed9aeb4882f1a100711e1e22ec9c822474b962c4e834fa21ef2bd85b613b927ca15da266d29a84054729c3b43c58a984c43e6366a0e17aeec7af0d96e460ebd76a53175aa1812542f343183fc5812e701d9acf59f1dc44417cb9cdbe0d9e8dcae7032a52dcc549977b60ae082c30ba20cfeed6f7e020b360cc12748bbd1a2abf23d5c31be61acb142f33193bb93a0afcca25bf061f50037740a06e0d0504d6cc84aa78c8e89bac29f90628684ea51ef2ccd20026ffefea14a133e444c39b2a98761e8785b2e068483dfbd0a1e72e0d4abc010cdc85e29e94d404e437dc4cdd2e0702b0f6f8f0306897324c8d921d49e6eff040c1ed73ecc6b47260ac902681a18b2b6c338f951fb7599ba9d3ebeae9ba6414da5328a558fb3f67a883fe991f7a7b0cf7ccb8dac09b5d67ddf0d3755950efeb33d288f09b480ea90d0878cfdbd0c87ba7b848341b7cd658e244fc743440d13e6a8e06593e698e884b84a89e176f1f512fa82985260d9a26080ab0000c468b596c43a2f28a98ddc31b3fd4266f8dfda766988627ea80eaab925b3ecaba6d3525b88cf790278d570f4706de42bcb10ecfae944e0404795071e0b747cbffc13788df8746b23b2238ae5de88e5a5ce119ffdbd854c2a44f014435c2d42e8704103e140f67809edee09226a844aba11e5b22c94de778e4c85842e413c0d9d10848d1679e3f5504b60b87ba8bedbe832920b42e9250df83dcfc1e74dd4fa1950ffacf3f3621315cef02de0521e0ef77a188d6839f18304d680ab135d855ba3f13f3908033dc824d8a5368c37700868ba0e4a4dede7d43e1f7d980c2cef7e1f23a672b1628b51be83ea355adc8a29ae8ac39273dcd582c7121b4d2d48511cca7ad78237f1db7781f3b0097125e4d14d6020eb0cd1c7549292577cd2dc3e2140c453ea1399231d0cacccf6db1e849224d47becd5b4f7957068be40d8d4bb6436a43efc40a8b950b7c85c84d99cd271144816ce35e79c3397b60f08c3e45b3fca67900b15ca98616966b910a211f228812c4186d659803f97609dbb0177c40ef49f29cecd091e83aab9985513dbb2258670c6578a76b0993dfa6daaae3fbaee58e60ab1dac8d23ed12d327d27280b1c006772db9c4c5fb4b20567c2385546f07e28ffc31ec7b93385a958a101edfc4c6b8cda0841ea54191923924ece4819837d2ec2b81f6a3eedaed4ab6d4489b1891b7bd0a0e8a64d34db0cc555dcc703ba783421fcd78ea278963aabc176d1d13238e8a032362a7a305e190157a1eafd31ca078328cff87454f9244540a8d9864211271523fa351104defb4c253087df0c5f8a5f16e9213c67966f958657d9874ff50f91cc3770f2e16813d438bf19448076a1a7c996e89757b642f1fcbcf878023db2598518161e85569c3ee68c46a0e00173be66bce115a6aa2ec2c0c36379617f67a3b1958d214dd573058f9057760a60b34f6f9538c5229098da0374b8a22036d86b7bcb71ff014ec27801f16ce29dc43a110f6c00218f43068579b33509502d164bcac4d5d9547cae3b898b01bf4fbc0b4f24e10fe7990abbbd9d05203814d353796dc51301fd1b66b02fce6fc46b4305685b7ea91901e472fca76ad607d5cdb76a8d2287f2fd25e3d93e400a8f31dccbffc9be7d7294afe1c66e0669ff2933db99f40bd3499ed4d9752e8be57f893b9e353cb79abcd897066cb55c9470c88ea12b6746e762b316363f5f594c298d41d441dc3b98037dabf6932564dec306d9750d00c743758b7c85836b5f8b02a07b8fc8e5774327190bcbc23f4a6a070ac5b1c884382852c10d5f0b156d8be34c49def92da2600ee63d053f6842fb4470252e21f7b971342a6f7c25ad41dc1b521783143e63fdc872ed087c156b0d5a0a1cb46e8fdb056256f9f6c3a9a406b02fce18cbf572527875e57dda93c39efe6b490d74c6c2ab836b2d2bc41fc1e352c923fe091422793d784b19d27a5acc8f1d01c8dd549c2e1e44021dd2b32591b0d75e720a0ec9b7c8631a045fe65a33fbe2b2fd3846063554f47aab51d71aba5f350d96a1aaedaa7f9f0b16c47b26a41c22546283edd8700685250314044cf62e1174b30bc2b269ed0f1a64c7c931f1d61ab1fc1960520cdecd93ffad9323212c3811adac07646313afb2e6da3ef687c5fb919b7ec2dca190dda055e6ae1558190463bdb028ad98b250ac80f930475de29b8632da8e642b330c0c41bccd0d629f35686e7a333fc0e6b862936c964bf4e0db5918b06e9cea86d9b63b22fc26bf8e415088bdd57671b4c58b6c91ba71a9751c6bd1c16a01827319326e17f886c23b2fec70b650035c3a98af57f22c24ffd0125381fc46559248212bf6cbd2eecd21518950737ef46983ce248d58807bb8519a19d066b656e9fb3a9047f770c7207ce52c7dff33a96f0e6ce0c45698e71af11a5fa842a7f6b5be6ae5059697a15338c2d869f43c011543ace6042e5f295e79946946e62597991c5c4150d67b62ba4c792526330f7b32162129f3e34af06056c48081fcb92c437aa89dafd930887ef732dfa5fac344920ce0d13ece18fb04a2dfa1c61b9b48fc0399716808854196b6a4d14065d58cb670a51b4e3c323884339d47364b2f708b81dd640fc3d9245c5ba3528eb01f5e81f5803b7819bd05d0fd54b0af3fa1e1eb356905bed5427b85b524f235273714d540bc36f4fbaf264f8f2e8a664992c496a9e680a01c5c4e1401a4f72ad29c65932d148119fddd1550f9da517ce38c44ca8e186f9d7f2094c5c1abcf6fea7621680f01e730d481bcc1e97c8196ccee756233b7a99157292b4c361eea50c4855bc298734069d58da4f140b6cf885369c9c0779cc24725062ef4712b45381f933c2641669568351f298364883ba4dea871426359f5440b72802a3367b96347758ea7494d1f9db3741572c28090bc258994b4a0bf64f1f0edaa060bd1b5d6388713011b52085581e77e7dc4fae80686165a7b7e88bbcba284583e5d1f05718e4c0960104c1478fd1f4ccab0ce0bfc765b5c6631e2e95cded4d50f8f570e6911600e8f61976b4c9d3e877079c905a6a3d7870f74072ed2946a404ffaf2c86148590e9c00ad4c303c4232751c8da3acbdaf53449ac9308221d2108a4c3bf8433494f27dbdff5e048b3640f40fd6c78fbc8edb3d97086faa0ac13b7d08c6782ffcbbccb1f1ac93f13396cfb87ff79f9efaea2ffdc3f69bda8bc07c8f59e3f8c06cb764768f0e73f9e69bbaf545b0bf7805fc7f16a3db5d802dfeae443a256b1fb0aa50fa7a60a023a2170166f14a6d266f77b495076bd47c5efc73820e3cdf2033037b64f7ad382f7f3dc93b4d8dcda2e8ce0c2b37e3a684b0759cd5e55b15ce950c106dfc753e715cd8c6e6c27a28dac0ca99e8b0ab872326ac358f2b4bfe15e854afcc04239b50c84f0cc37d419ab7564328696733d49f7727eb5f2ce30c870c0db998f76e3c12835346e452596599afb527bb3de9e6c01a776cdab88230cb2eed0c02b66826b77f32c188e578059e852944f0b7b07c1233302985662d3c382906226d1036685ba361fee474054c9370090bc5cfd133112516727192704317978005e8eff7bd2945ef6c107d91804fea1bb94aabb6265b6f9b602b83834639fdba1f1a66ff00ab58e415de65a9b70971aa6da7811c1fdd60c8385da0703e800914b43902edd866af543fce1f71d02ddc36cec590c3fa30adc80837a670946b930654c6990776c230432f10fea54e314bfcac5782335fc326abcc4027dd528694a94c6fce75a22a1ed1c4cd43bfeb5b17f6bf0b66253b36b7a91415750c187eea6bc8449ec923788b5eb3ddbd1cecc8cad6050b9e4a76d894c009c9609256a29e49fa460a62b8127b6bab33b3008f12f66cf4c21446dbe427d75333c80778b8b9ce954da32b0333644a958350babafdbabf7a2200c22f530d3dc891795c523a9c95bd48cf934ebcee89508d2f9d0eb26ba2087847f1d9b220feef04d29a1bdfad65261dbdcc38cdef44d85390e5e1d7adf260e6f8c5c63b07cf0eb3b6532d18c2a608bbdf33173b114eb609e0e8502d464a29d8cc01098f19aaa33d43ce10fc53df8d0239d225d433703efc258007bbb9450bf49dfafe22edfc479d28993a1df6ed29a545ccde108a632da823e016133b557dcc84e6a726687514e9b017b58bb0f8490084b94f43995125dd21c45b54a6f4286b275ba41dfeaaac150a728108c5690aea622807a21ae7932268a71552b35b5b563d72b0248580afc823a3810bf8eb2d268ae1536085db0c409822c257092027f200a72f61cf655b89385da30f5c8cb109e68983e452a84db013a606f736584bae2322427cb9eb33fb3829396ac4cc6f6f31a204eb2c9b68f15a2a07f34a228c80332b0906d675e88354c2919aef8c5f107ef83c40b4bed843eeea9d4349f9a9cbf4b6b699633c046dc9c3183f4abc447add74c5922fd2f8354ff5385792c687ce366b1740b6536640d2b84c4176e72232658033b1638c0bfca1f3a67f6c0a393c44fd93ddd4ae80553f12b25f3fbb126994776243016da910b4bdbd6f5ce5197031e287324585599b642103af14cdb0c1d66ad2c14ad17b138a8afc9a8492743f6a49a611a7100079bc06cb7642cfe2c8e24f572c172ce410f1261ad151e9523ee367290d5714b5c6618a1cab6c09ced64a0a7981a26b0ea181f0d2703046031c4c4029524af659d462a7ae4dfc1388b0d8248a24c3532a8a1486d416cb9949ea6f5e043b7f66703f2aeb9d85dda03fdc48329232f05bdc710392de64e82e0370480004b89a07fe523756f5d1ea180773123c92250ea2548b1c9c8f3e9bc01aea7575bed02a8d1990630f0fd5688876f6fc4231120ab9064ad0c263a1b366238e9a27989389ed087a653ececdda4e70e4d0878f12e280c11e29a4acb691b82bffe14df19fef18bb702f7abdddb237bf42ab670071bbf39d313bdf39c101e955079ef603f6654fe2043de76fb4c5023cd4388c41c45ba41162ba9a45e23550d29a2ff8809d98fdbfcb6bc23b8b4bfe0d944c13c51735756ae3a933164709348be8714c712c6d807b028ed4b48312ae91b98e386a7fa0dd8b5795a216cdc6e98f95c8d113c8cfc71ad4d653ae278177c39910187eb8139d9153c1cd56c38dc913715caa21ecf6dffb26504df10745299b6a5ab46a55d8c0cd5554eb4ee3a0e4bb494a68b407dbb23ae7a23c681f2fa71b002cae0251eb7549f7f84dd7903507abe77cae8351dfffb5a7092db274ae573c8b8092fca9eebb48935ec0a1a152fcc716afb23483a7af1e4fec1131bf420ac693e341d236e001a4c19342b10e3a0a2812e75d575dd6d92f4163940c953ecd6b8b9a918e7485e17366ab015ca65eceb4bcb5612b7682be44c620801c894db5b333cb12658ca75c721919fded5b9c1de2fb758e901956cb29201c901f7241551d87d53a6a6004c94966899f3f028d170fda5b4c001990ba26c814207972481b50d9144612dfa4f2ddae8b1d4db950e80caecd06373ad75d9ce0b9733d7cf81e6f8f2c4dad2f5adea9b98d30c99ddb8977b5a05ba9c9a71c13a17c088189473edc9011e73c6f130b14267f617e458a71c7a02d214bee65a173e5dacf700bde0d7456ececc79c6be847114b076286243b37afb283dde53a6ce9897158229f8047f6627a2bec2d0a2277bdb87c7272e731e9ab12a9aaaf2219a7546d1ba9811b2aefed336dd34de274070f5951898a4f0dd769b96ef177848703a8695359da0830cd8fc19381a880fb1fdb135fd4101ea0e1296c38c52db427f96405c9b1818e4a59cb217b247bed9cc40578f281262238e40b37930d1663dd51c7ac86eefc9e12ad6277b8512d952fea7ee450d92ae339eec48081e743a184c638b6601878212a07942c0ce0895344af91f36b5dd4c8a8d36967d0a09df6ef3602014e7f301fbe84396243227bf7188aa2a9c26306d75d8b641ada1a39d070735f6c8732b53a6dced0a4794f1c808df1554b786196ce792bc60e8b6fc2544c5237551adc60e0056da5c356fac62684d8ea3158dcf78e26b82fb425498bfda6b509abea485994050664e7059dcd04ce5976d0db28839e82896d99419e60926ec730aebcd1222f27407ceb49bcf692be4ae25e711d5459bd22729440a301d70450d7d80b2aa92a2a922d50c2911532a8ad85167073bbf3ee7d887b0f809433e876483436972fc32e0c91ed5e775811a67c733c0d95e288f9d2fad0b4425961a642fd42354b5df11436182a4636a47fa52c42c838155b26bf78240f43c43e128682ecbd4dcb42259a5a2b0a322ee0666602d34c246d8f900dcd9cbe880fa7c2781f769b1ba76e8de16b3fd2a69cfa704582e03aca8f7104b918ef29bd5b0d52de34ca83d2b18c9cc95cbafedda48024c41e1c9c432b89d14bee451711d516a9892a7343478764ed64a281ad5718330b5f31bfdf015e11ce84fc70c04cca0611a078bc2aeae3e62455835735c886539ca1f51bde2bb1b0c0746be8b5b9beea72b57df228a2fa52b8a381936968c040e5f1370c9c712f52020525b49b3f0ff8b62e5f19a1dc1f11a32d3d2221ad5eb490387dae7825a3f90dbd701d6a347b34dc3d85eb02204b5bc27f88387dfd4f79e86e7d8208115dd3de9b94727be2a619b1cd248296561d82f8a5463bafc1c9a4a366004b985b2d1cac1ec09e7345d93b0808203c18948473e54065c6b56d2b41278f801c3f1e176e942654986be4d29c9502305e847a15c7218d1ea7416833088b5c5dcfb91ef237f610a254e3eb576809ec515cfd7cd40cbfe04b21e43e523e096d4daa4cac6673591c11188152ce82405184e0a4ab26d89cd88b1f9c16ef207fe2cb8037185b5747d1c61b2893bc9fd9af746247a8450e3c3e57e1977329f4c648d0c8dcc988d3e978424d804423d298f591e5e11cb3688c96edcf07f79700e3d4f2b9ba1f2a3e714a09eb38af5a69e18e31de20c5c8579b5c33d1d7207c2957e9cc0d9eac8028898a4c0a7cd5318a1687b6633751943f7be648b41b7e9755ff2adb4e1b06035c78128fba018d5ae94f1294f1f2ac364886b4aad77a7001153f68359953cf9b78d58220e20a76648f6da1455f71aa53178ab97aae4eb3e8df24180553dad93ccee3bc4a7541fb1dc57f23424f2e804d59ba6fd8c2724e85d21d9a87b0974115f5192b7ec0d905de6bd50c83e2476fc8cfebb43d0e5d4402b9070ff2237ffc3f86a038fbf9c242f46cb61fd8050d3fcaec622afeac2c38e66cdcb39f80563ab51f67c380b6e355c86aaebac0172160c4f00f31d1e0f01add7017477ac78d5eba9075cbe6a98b4a19f03aae0955be6f0aeb21339584346d17b4f98c04ce6003cce100bdd6eb1336c1aaba7ea25b9f048e4fe5ef0fe13ef0f4443143eb1c6f873cb32c5429572b4f5e5b4f24756a4eeae51f82a2b2c0195896ecee68d54d0005e62f0869c24b3751a2fac18e4eac5f7ae69eff207c04f30793012184536070c9acbf498bb4617035f68abb7153a99170af5aeab7184d14b461f807407d9d8d93e36c80d866437ff4ac723669c41cbff9c9f2ffd63c4ea036167509b79f50d316dd62f0c08920175e3df1c86009eae810156d4577f24475eb730cbf43e68282c856cf89000d084d9c14217a46f114e9e36f4ad4ee48e1bbdaa0c04343450a830083a636ddcffe30c91831f05a9198fa5d8582401ac1f46f8489ecd1c64ac06f54b5cf7ec19121f0682fd7f09380f071294fd12af06d8b187d864949332afbcec609f103498cf5c505de0fcd6342bc5121063359d1236b5f5a7857bb228e21131199f02a303453e7f438e0e7408168403c34340816077d713cc608b00ddc908707e2b0d74c2883dc694b8a8a3dc8739f5e532b211970b8f19b85e740f0034142b03a5a80652290362f6ee91719230e6f812847acd3291f03dfc309e609931df0baf754546ffc4826fced50f22ba8c49f6a2a411fb36f01e10d3d097627c12c4a355eaf598da6cdbcacc71442e111c8e91d07c64c506af11078a576ac808f2b28ef21db216fee52dbb0f75cffa3f08d53fb347cb809c37699813b6f395b555bc19c0f99ea0c50a653672c98e30a0f5f28b3ac27de04121b6b8ce2183d4454f4d0631a95f1f0484c1baeddc6320f400f95410aa12d36c302010b75129516b96b8473533e8d2b157e0d28d1c04a13e2e984d22be5406921dcbab782ed286f18f4118fe8ffb5d186b1c5afbf99f05ff75811ea7e6f2592e882dbab6024eb182e143fe406d7cc0c78818872806aeeb40ff6cd97636eb1d421f4785f5642b33c1e32c86024f556c3bbde9c8648a7fcc77a55c3b440c10db2f929bc1342c5457e0ab7408302292f0ef60e85d541ad3f9c18e4de440200df44069610e8fc04436deb94c8277d2164135721223020f278a3e383700053d8d1b788d917c2663fab57848370fd95460dbaa626bd393185dcc7fbbd84a2a239d8b90891d5977b825ba0c21ef9978219c6bf67a4c7279090262a27ec9f7338c66578369db009959947d69e6316c0fe2bfd107c79379762ba3bdfca653f64b52c4fc5c2fa3efdf9bce9c090cfd02f24af3f5641626adf6341f51678197d4afd578d339eb41f04dfb20915fd62258757ca367e957caeec23863b960609c0499a67fe76f651e8c990a8179c7b4ec30e86e6d7b5c40882c3fab28fc6a480518d17797de4bd1be050aa63e115fc404a9425960ffc74c82dcfb38de69271778d8463b471ea68d6551de791354d9c703014cc9eac0f7c84596ad856c380f4dc53ba58b6680c2d001fb2f6b7be2d9fd30edf8c1d1720b02b062de9896c3295e082d7348f050d51bedc14b96401c258ae235370efdd520a29c4dcb3a4ba4a408419e3d5d0239f6be64b0c2fbea09cec02af9b87665d3eb3e5a11b09b7e2b731608a88ba510eac3b4553ccc1eb85de6d2bbcfcc444f00428178d6ec8aecc39cbfa22caf43320d8d8a2864a13ada09c38c1fe627e00bd3a1e80b02b04691946cd05fdb4d07815f46e6008113c00383aeca5fe5358bd2b10b950b6f2c14e26b22c9d780f7c58a3b035651c23c10eae0849210ab72495910799d900d9e78e7efc31287ef04d3007a4bb53a0840bdde2279d4ca961a064086f251d3fefb747677db81343de0bef0e465899a22aa68d1a5e648a2d43d8a5bb95a38f0b6a5ae99c80bb91dacb96237955ca0255c8e075314af2c2eb38e9dba6fe644ec819c14c7a9d373942e3cd7234fef6eb62ac7110d22e1c2a57f14f5c377821e859d2a6c8323b38a87a8ba5dd166777ef9d192fbc950c749b1d1a5be263a05ee8fb0b0caecfd4a3856108dfdd0d788074006f244e8a2ea2e19c51405fca6b7b3daf00c6bcb904ba589e39d0d5ca2a7a40926f0d5eadad7c289b012ca0977ee07d6b51ae603dbb047b6534a193c349b3d2a497143a685e45affe201e16977f91a2fa62dce471653dc1894966cb6245ac32dd171217d9918f72a9282c097e0e545c452e387501c1ce77614c9f0f63855ba8d7206658d5a0968b6dd312e5d80ee09b4fd5f673e792b566e6b98da939a56244d76d4cf98b028f3db3ce1210e4af1f4688afab4407651e19ef75fdd4bd2e8eefc4d5635fa1dd3f8aee6d608502db1e63b7499d9dd14b9730fdea08b565f4d9781bc7ab8c1b50d08fd6088d705a5d8261d72eff540fe6a675751cc9272055171186003c629a9921ccaa7dd0de7e092a2da4bc741b84412833c90ff149bdd44338d9172e1a5d6e1853622bc6fc5072936d66140343dff850f54391885c98cfe464122d3b20dff3aa130ee12265f5360a1aaaa9704de1d276074153a643a9f03161c062d9af66c64f8d2696429e5e14fad23fdf8c116a7dc183cba400626c1b9e089b980fc02208351e60b95981b677bb203c9be0fa2128b5b260b5e7905bfba1221990904d7432d6913a22bfc861899a515dacb8b3e6327c9f89eea2ba2efff70aa47e9e62644b4247484955c05369b3ed395248bae8aca13555efa148b24e35af0058542386bb2d76eada065970e01c49f932f1ec4e2ac61459e8f2f8a4f715380dff02658e807a647ce1875b2b5e0b6d8453b3e7fc828b3d2f9cc9582e2ba288eb5f7e6a72d225c30a46bc72461cc440f33ba4afe69c130141087389a4d8c263461e4b2a5995f5b5993d6362e431f09d7e3b315ad6951098b0c8454f8aca82120497ad786605208a68c86fc1c40b89aea6b54d98168686ebbddae8ea27fc00c099f22b0c44748d6ac7ccb58f43811621e6a0a85b0aa2374226607961453687952c88d8b70a9163515a0bc2e213b72def7a94cd152b6170db16dc5b6b5948d151763af4ba4acb4dbe84da5cbe71b37cdf7bdcf371048e42ef4b07a72083e06e3924d0835c16cd717632f13f92db485b6443892fe598c9b8dbe1ddde4cd82364d9f35ed9dade2b99407677a42fd8231a6fa35e1e447a31c04aae501e3ca37415ba441541168859b9ace0c5811571eb439443186ab684341e0bcf8ad4333ab9900a43c972b20f4da6de1f3af86de17075f676e65ac0528ae9dfff4bbf8e10e50b2d6e1276508cdaad49cdb8d1281f0c0c1f4f396fb714d3f5f547649e516fe6ab86853781ce2e7ae05d2a4100f76054dc1c22f814063e786ccd7d910ce3bf203458ead67bb99e2c4ee7ae14c8ec2b9bc45865f8a08c3de253ebf02e709cf852be00c7a4074346de7063b7dc60ed09c0082fa7eb6c0e2884addaacde7b9582340f1cf815e2646f8f6745bfb4070a82973bedbc4834f37c51fa2b8381a3b401057433bdf4019840962a96a1d77b3721b02c900dbe572f0e83ef60ba5dd5ee461b3256ad719b0b9790ac8fdb64253d47c11bb893f7698386baf440674c060fc11f870c048c5c16c7c2f28624f6f27e2b3d4c00507d536f079c9d6572726f3064378fe89100d51fa779cc28db7b3ee8c6cfc0192fe0716c888b46637992920be8ba9ffa259866d27de3fb9f8f237866a6f03545474ace6fae82ce727ace2bbd219ffa5cbbdcd44d9380675a26e8a9ff1ef993dcc3bf5e19e0c5c53e64514caa7f396a2efa84b3710a9febf611b14cdd41bf63eb79ea3121b2bc6c3633a8eff82c4f7da1b4d6a020c5af387a9d2f00541afd11e652ac432b59409f45b8c2b38e466e0a33f644111b64235b661d109941d8fc9017d565c0f3bd80ba722969441b9bb218dbf6ba37364605ae5b8438f11e49de68a2cfae6c83c1364ce12b8ffe1e47f4453eb1d4533938ba72a9e8e0183bf0785efbf748eb2aaefb343119cbf6fb5c27f32fbf592a31ae67dd2205e6d926e30911bfa1bba6cb22c44aff642d9ed1d636959b87f8ab6bf10e12b2f6eb45b015775aba84eec7c56e3d7deb2eb689f51cfce2f6c8ee77c4a1298ef8eb653f4dfa778c6cf7f50d51fbc92aa84658b97e7218f4977508a100fcfaee4834d46bc03b61f1e08df544418df31ed10fd5cbd621af76fef119d7a8887a1640b0825de028c295c24ce57a890cfb1f233d0ff9afef1958bf7253c830e9378921d911b76ee0f34bc6b7eae6c437a228a4c95fc513d83fc8b343c607f79d75ec73fdf30fb091c2baee1bebce0a6efc6354d2f4436a7c7492fd5504350fba0e3a52a0ae529f0fde1710786ba5730b565f5fa302dc35c578add5291c3b9ac91789731f26b0525aa3a752b845babcbcafc98cb9da6139009e572aaa06720e0728530be8996fa1880eec58b3c405f3aa97e8d54640e37dd036c999d42d7d4d5e76888b195b431086379f9763138e02501557722edb0501327805ed71c2c4df2cf229ccc12d9aba860d79cbf14210c18063967443257d3badfcaae2ce5aaf2f944b822fb28e5a949d66e1cede5d99bb461875c847c928b8bb488f74b2d517f2283a595017b10eaf1272460c27af9e7f4d4d05ae057d84028a7f22115df635ed374fff6d56f5bd08ebb7df676fd920511721258e657dc366e76887141cd0c974674d97a85866de529c12dd7daf8a5b9773c4f7003f98ca88e8810cc2b55155062c0342b7e7afdeb3faa968df8b98a130e82b30b647251ce5af79a05acef2d46f807a2da070d06372e535c329172f1d4d90cee2f825e97bde04852247938488bfb3d6726b58072b76efea2ed8aac45bf617f520b7a3086f947a9771ea910fdecc92b8874a6539227e0a2a3df1317b919b02880815cf4663b47d5c5840a84ee92c7cfde56d3524529a8dbe392bbc5e855f31e107a117918f9412ab8de8d337af180bd6a4bfa82c38f58d8eb46553b202c035fa841dc94c4e7762f9bfb011f7fe2003cb2cc7bfbcce14182b1cfb3ac393f9fba5d5ac27e6d5f80e96f4bfd73899fe17045dfcba447c04de369969462bb4a56acaef3bfe3ff7d4e1f7feb223d6a940912b84f010c08000282dcf20b5f5a99c3c00e938d4146c1da8c35120488db8201ce5ab949437fb46e4049ec774f9a5c08b8b76bc87c087ee04374cb6ff76a1b00fb3e3468b41c4a3e3792a7e5d3133e0fc599fb6030e465f54e7098c371cef82b1a9529394412988b0fc96826f614a1e95e7967e26982c310523d4f2f122a027c24715db5423659d67f692710866f6a4953e2dd90a63925e075f79ef10c277961695b0db64c2098ac397d7c45f83840268e98d00af2c3971b5e98662ad3c525e5d784bfd9ddccfdbb3c2faae25e77a727089fe37f2d5380f3df0cdded4f8b6f182dc8855b39bd20da32737f0fd4085ca6d7c6ff8428eb9cba943cbe801b32953832993ea19ccd97b34a6da33181ca69b2edb606febd118dd914c6f858e69138a37781a17188aaf52631d6c567d77484a9aa8cc284006a7e32ad1694ba9d8902742682da80e97b78262b2a0940e77f7bdd2d5582c95c5b1a8b6d540b11029e071669319eb7e377a8badd8a93e29f032d4a1450a8f8331d97770975c589617141bb00b64ae36f50aed6574d7efcd9f6ea18c0eb22d4101510c962a7406f3a743cf9dc3b28a8a409b2394658a6a8ce087aaa6d2135a711f1f5f906f99f8a59b9491dd3ebf41ada652e9eda9dc8ae0b7a790f473cd92ccfa1bc0a2593bca6f5e9d82cb77aa026b8bd0e7fdecfe6e7a8362a9bcc6481e7c7c06dd2b1b979fb2e688edfa2d669adaf2694b345d1c0420f63efe39a14f760bad0835f7628c36677ba6973e4a3d8ec4b6d113995e9a51c62d1e80a15cb451cdcc39b19da32cd86090b45fda6164280d7d8fb2c0af89f21e654789c5e78e53fab7ae8c53b30f6a7dcd602b9161c1a12dd45b613978ed600b5dd792338962d8cd88e450c0e87c0330473da7cd227436fa3f9143a7f6d8dae3949daa004aa34ab6788ad11e05beb5566cf4167e4c094c380998861a7d664bc448022c6120e30d600950bf328e8d717ffe885410932d0c73b537baea0969699d27a88c412c7a0565fbc2dbe56b21d1e9988a044cb631375646bfeb1a29a60a6dd3f3c0d4a5970aed62bea6efc993e26ed854398e75d7e7e44d6518f556258fd1ac76a44481162245dbe53c759392edc86dccd4445e68b122aa487e316cec0ac23dcbb85fc12986d49368fe67385ab00958088ae122df96591d7ca6eeda8defb262bc446a08167d552c430b1a007c7cee3632dfe7e6c6d223379b03aca3a4eda4630635e13ebf85576200a6cc0778a6cbb4b17921ff8a88209d3ec4a106268715f463dedb313ee0c04d078a807a07478559b7778e35b57ad1af35db95f87b1f45b61eb5e0ef3d16b9b8a815ad42fc652fe0de463cb7a4a5cc43c6d2c0784550c138d5e3970fda12c966dff9c7f3bc9469d7b9e102ad52db75b2664f376ffe2e9da7127befc91ce78e31d0553e81fe5bc4aff6ea82d83e173b3c8c92e41b4ecf468098a50c8aac7bbef8a1f50c728e82d96a03edae0c1cfc77e9df7986a3494c7297b352d415955548c4f214afe114bdd931758318a3478291276102688c6582244d531cb06126239d20c137b2d90ab1a440241fab6a690400a8a6ea80113b2489e68dd0f547b324a05bdcbf8a192dcd57722b71da40867ce4f8834579f0ce8a870f6a6b4a74fe5c227e1ca42b3ae220577098344321a59ff0b1c6bb80f9992d6555c9480be681dd0bfee3e942932bc71f1de77ef65917de1da89b84299c53a2f07c40cb61527cbc1f42d34565d08dca3a75d50a9ee215e0502ed2dc20c7c54fac1821ae3a8d6f959cd74f260266d05f43b77da84d41b6ba5841810ea97829386e8011825130aa6075a5c97910ed9bc9c11cdc46d821a51ee0bfea86d8317d9df110553a0b822e2d78f056e293ee63ae779d9bd4b0d6c210073a473fb7d1800feeceb3553c8f24bfa9fd96562dfc34f7f9bb27644ffdb51cd2ae8d92a5408ecbf0eb6af4661b351d0a764bf11da75886e49c2f21958da5143b1df7fa13077434ae545a0fc8822fc07f75d403a21083b84bdf2817b5582f8f13cc7d14f853878cdada202487c6bc5869e722cb5e37591a3201e96fa4337d28e0cd0289c2409b387e1ed92347d09085cd9bbab97ab650cd9c0270a1b6b3efcf306d41089d853b8aea0003111cf72e9a7a7e9d95d7a8138517d6730e740d9644d5f7c7ec25488d71709f99d3305a316cfa69c831704af9e81fd1330588f53fff3dd32e566e47abab17b0a86bffaf6f4ce3a6e2a953efa89dc6c02d5850637aa9ae8225f3723b8bbdcec05b2966d4ff5c5162951b4da24454663489d253f9682254926581703139c84845225172672abe99f8e654f91118eea1065a5ebd86c1eeaa777948dfb387a99af16d789501d4c9f4f0b3857d4ef75f8e5b78c485500a01f73bc9e88f4b96bb25a108fb8424a49ad2e810f2eecef8683ab1f0a8873abdf2d242afac87598931daa75d3d7fe709ac056110a053d057af375714322c5dfd8099a0e9e79f20deb5c00a1fc22f7048089929563cb1d4ff555507249da7e9c303bd312d0e121cdab4db63a5359b2586649ff13196b3b23257b7a6411f58fcb562688c698391ed25649b43963d0863108a2cbab54f57a1f79b88616df9ea35aadf0bdaaad50dbe66383595e9999b20c898ea9aaab5127309bf1e7e96c7a97cd05d35285a49132ce66e8280407381b47141064c69c4fd1b083ae18381d361275533a103446dde681717b5ebbd5c150c833321ee8b2199a926cdc4209ab945ac0b922ffd8de3bfaddda5f2969af2d3f90354a5720664319d32e7b6a35ad6926bde4ae1528528e9f0f599160b0e4ca89f96e6a840beec7dcb11e57b3fd5d906659e7370ff860aad6ba1c4a6d690b6ba836cc744d0ade3bdd7059a12576f6b8ace74c0407104a353a9be98a8b8a48e9836b19de4a07c75758a0c73b03046921b55ad532a6df5b8f3041c16ed7f4a5f70fad5aab558d8f3f7af43617873703cf9d9854ff297259a9836a846be54b40d5f8c187d1074d0a7855c347d18b0655b27949330284c9c6ef984041b029cdd0eb91ed1855276272d953672f9cb8f17424c401377c622a4cace652ceba36d2ee81a6414e3927456fa84151ffd5f026f7137b92f886c458d79d4f3f72b7ccff155c15347e795859117c22cd44e705d20b128d85ce83648c38098433c45be2de2e4eaf644d4b5b067838fe57ff69dfce51dbf4360c19e90e5ceec6c044e38db0c0dc8e9b01ce4f0bfc5c9a3addf5f1047d2fd0b4495f1126c6990b865e759937643a35b5161216ef9d45f5533a4565c3212548948692fae0c827d175d7a488042a9921865f1f494224eaea5fa69e949a9ac23ddb743e230e93d61768d6ef062f5a6158ed9775336ac3ad2c6333aa21073f6446ed38b0599685200fb0db663666753402adbf057c570daad8c8550f9673eaae104b0306625d2782409cad601f7b74e0a8f9cb964829022c781a1bee49317483c8e2acb6fff67bf21d0b32612707c2cf4898035a94e8a14fba5c52fae18ea91386058ef7ad20513ec7061feebc49f9f2387cc45d9afbe320ab896fac66bf63b06d09e087ce6c59a2bb8bec9458f13405dd8c936d36bd7c774470e93441b1771e459c0d1a9eecfebe320f82c7c1bd65744ba9143c0c5a47c29e0cd9eca2ebe19372a323303a23c8b3b79305a34e4c1a0b5a40f3f8009eb16ba734a70131d1c5f6f4a06946d4a22c81b93799dea41a21afa47db29f30d7c430894b63cb3f8da20d2ad5f31287fdbc88cec245f7325796f520a09bd249277e5e276638c9eaaa1611876a7c30656618077a728a8b8a52c959bb5c363184078072bc1d17a8f592cc4046ea1a3fb2eba9564cd3928f76122d5b9534ef26e82f4e549f5560093daea4eb89b9d04f668f038563500ced419b3957d3ca5b24aacda8a0e7c57abbf11be2b22b5f39845824715b014e388ce9f6f2cd3eb75fa73fc5d4d3649f28122d6565ea21a1ccb272e1d72345c3a0f155697df4bc310e9c43c60d1742f13d6fbc1af0f0d6e438efd1b3b12a196068de9f27f849a395c75d838d75a26ff5eb4f1e09871da8164d3ec3dbe05f77843e8a1c03be4409e0e0b7af31b2a88576a3f16851c5ad18ffa381563249c18ee0a800a2d90ab15e1b9ba02d071f2cdeee6b4d67f3e877705f4057ac983dd3a40eb21040475e721295eb4021fe755617e1b2be9cd18898dc6f64cda94a0f75481e8d2792434a0fd10d1ea5c35341a4dd5d7a0dbb0a71bbbad7aceb2ff42778ca616f6c112f5ba83f4714e75393c2862233ee5a0ca4c2f8f06a5a429108db35a8230a952e451e358a238ce1aae9af258c4f50e2c1f1cf48a98472cd241d29ef248c16653372f1347104d7ea4c46ebc191a4e53606fbdce714275b76d890efd978b0b5ccc03de7fb7acd6fe1e11fa60a6060c936fa1ceb54ecfda0a975782807cc199c8a99b7985e5e50c165a61738cd7dcb8ccff3085ceff16a84ac4e41fd3c89fd1c58e65d078cb9b32f8aa8e48cda0d77068b9ebd150b7b657ff3297c06d8a7a2dddbd17e420cd82282da3386e9b6adc9018de5d7c68cb5696b1275d440986904a30a4928ccc0dfa11d88725cee739a127019e81f98cc81e76f602c551a0d6e8cf63918948a878659f8ede22ca38ce8c393011f558533df3412cf575cd7cf07bb8acc0d07160c21ed9df6926ced0ee0d334ce3dc29c130bf676f5205a08f970262d3804a8da5374301d53aa53b9a328208e5ddaf7e4c73a588a73e796783bb3ac618e4523d1821288ae2a28b4482d87dfeb1d7f0735424930763c3cf8f7276d80978209f39e9d6f3a649695ccad95a309d466ac5d13ed801e9ee12ff85ce570885928a29bfff2ea47633b933c16ed7aec3edcaae34af8916b18c2b38381647e06a74872d526bcc5bc85b5333beac7522c20de7dd8d666cdcb53bca2bde7d151a8a13dc2ea6cbf75b9ba7b1ae2235875a84717da79d90e35d485e3815762bfa93d1a996a10e4bead328551b41cf5daf7691a2fa6030e9beddff877d2613c09a095b003847555bd6b62bf7ddaea07b64444013e272befdd730ee9cf2183a9f99e060ee551cc71cb3b578b2f38e2d0169dd8ebacb3a4bbeb4ca40275bc23ae8e86423fae3999d37f08ad16581858e6c6e2ba6be850d7202cb25731cdb19fd370a5b087e5d800e7e43d07878ffc7fad8627ce3680bbdb49aca6b6974703d39cda41883fc5e2da08667563a9f1fbf3e9264257dbdfc80edab56037c1d0eab9b4b4955f3b8a53b4dce991e0ad6ed4e00e744b871aa25db60b6bb0a5079cb335a2ad810164996a9f94ea8728c1c01082d479dacf541a5f1af70672ddd157a6cb870ceb34b3e43748145bef3a48e4180c0659b3d73d81194ab751309dc3580e94027dd9e6a875632781d24a5e083c8335c0ec479e18401bf817caa9fbc22348aa4cbfa35fa3b03eebf23a5db02d4e2db1f9859c7e500a12f7d3eb0ec301577e52f03882ab153320610b3edd0bbf05908a10ca47d388aee06f4f3d0abaa723a13b989e3310ab12ec40710d2e80045412338665d881e055c66067a8b4cf4ae9ad0998a5e830b9e6cb212713fef5ffb340d3c39dce240f3c4c9bd33fa6b0e2d8e90ff3ed12db9d1c27143be8a9598b33f15426df27ec99f09a5bafdaac3c961aa16281e3571869e052e08d805b304f59aad9f07db75c93e6cbc6b697f332b604c22df4385267cfa49ba2a4c610e35a598e60c2dc9b905c89f528d0e83166d7cd03108c914232ab810a54d5adf2b39c41f922c7a2635baa613e424efd0bacd21227e0d47201d1b8b7a24c0a38d42f5f63be1ad9651674e6adb9d140932906e9667ada46b2931a6f3edafa7b92b25b598db046f131c3ada426bc474989d9eab98b9a00252add8aa8adbd841d27f1c716ccf71120bcc687b14b50f1b279517e31675d4648389ea1896775d870b62c10ef3a41bfd1176c2838d046fb82a72027cf59f1c364a043fa13a79a1256910052682828923cab1013a447363fd7a1a47e4540210f9712ed49b51057da3372aa12173648b23321b35e4ae8f06b1f0570dda9a1365407c46ca73e40cadd33dcc900d79ae3969a769c11f0abbd334a527833c02a29007bc92624ac2a6afa440d24cb22697273cf681915c5e1e1301e6654532ddc6ac00c8f8c5aae063388b07c78a4b2c8d7a386095066f361fa5a027bc10111cce752495c6076d7787987b2908d722e1c9f1ceb5c36eced18fc31e2ce65630acb8aca84d0aa759e79113431b850312a58f1cdf480aa75151381fddbf8c24d11accec1e06e1a7fd463b216d8d861146c658011f61018e06665a704a06529592742288e37b645a4266d50755359ab4ff9b9ee40675e9c7aaefc84d4454904d7462ca29889e685aeefcbd2d91b5927cc9811a8548f1c28eaa1fd52fec07028273540073a987a47b65e2342fd936bb7c012e26cbe49246e953c92fa91c2931895c5713b9e5a293ff93452c062e6960bf93319f49c71edfef334d115078e66b38b772d49f8b7338598c69db99fd7f620cf1057d2d2dbae8a92a167312d8f84f6353ff8629631d5b00ab98274342458bb3f06e3bbc52a76f59710e437f301868276c23136c1faf8d185a19368e22f084ebca23a40f3850165e8623724e2c7068522aae95fed3a8c4f652cb3c043d98e2aa8ea0d564d4457d4b532f9118a8c26fe02ec8316984955050332cfc7474df770671210e2b4a641efab66b5182142b49eeb594274139022537d0d093a24fcf5c550810daea6c78f3cea0d7c578f9f4f6753e4968325ddac3be3009a268605571153b727571d54303c9c1acb4d6a8b339d670ecd81b4961c7e10f05a207bf97f27a6a35e7179adc88ed40879bb4ab618fdab7b9d691313b81857438fb6dbe228aaca12e000f46ef0e3a9e909b347b1e51d4bf984620cec3fb425b2cce371651068bf59a2ee67075db271ba371dd374988e82ae8bac3b6c3ed5fb5f68e760d70442b6a2804fc7104953ae694a677ed580f8a2c81894b7c5a64def312bee92e6c20981401fdd6052dd487b70a3dab2186e576428d3de5396eecea1e95145e45ce6d2f9cd06e0000f6ef351383ffd480d3c73a38a9589ed7cf64b2f79c462f47f0cf88aacd877c5a91039e4ab0bd9ef335006a0a45f5c74ce3b8a370911baf5b2c5793e7cc9237ca4f4694da4c5715fa3e01ea7169fd69dec76e68b8e8c6e26eda2934d6bda30981bdaea30699d491a09454fffd5fdb366695846f350bc974300c5732fdd4170888b90bac847c5d581932935368964493a5e13f749a3566094d33ecc0e920cb730c0c0fcf3910e0c6bc84e9f28d712b2b586d4150795ebdceaecb17e435a87c3df2a98f93dcd56d351fcc1c18c19711d103f001e70c99ba81d2e82ab16b1dcbb3a76c02713b5cc52843c3d98d5e6a0939f5a414a7932caa97718db08285a9b0c449b2e7cacd77ac3163a6eecd9ecc8be1e9a6c2a8a6e8d6590ecd65d5723dd95b9292ed0b7e5da86d787a9a6f115cedb269f95c35abc2d9e3d3f5da209548cdd04ce4f5d4308ef1be33f78c7301793f88f45d250b188cd3ce1e06f607a6f4c728952db48b13e0c0dbd7962ab4c95d83ab0e99fd6aad327aeccaae2adf8928fbdaede78ac51230e1dbf8cd4dee8d72380cec273d36d0dd4b7cda225e72b6d9e098975afdf20c2eb7ce4077f55b8e4299af6f9112828f372d558674a60f3618926f09be24581081908bf8d7e02878922d4836bd2794148660d3428209522b86383bec4cae035c38f164ecbc83c0dd267c3341cc8966dca7301890f38158c92c197b6cab1096b745426e92e45dd7814b096c4743e794bff3b48acc912a568dc1efd6e6534e3ef76fc07625ddb6d623217b8a3bc29df8c968126164ba27fb9f89efed6b5932889b907ca5e003e8a612dc811fe2206803ed461c7fbb81b0dea4709f0f2963238a59052565e60dce8ca0c20e3f020b575476cd9cb033083e07239cf1276be988330ab9693cbb08b13545c6ea7bcd6cc31f3a18e71339a5ff266a4437fcab53a713e9e67b55a7dc06c59911f1d3a8f6559f8ed2e033fabaf4fca00c41464caa32aa7e8fc2ae347beb41d1f52b3e811e7787e7330766384d49755c8af9e3042a546dc8524776a5e67c82edd02ae5b0a00f97a089bf612df56b8ff5eb5c5d1ced596ce95100367e037b2c3c9a91220317f6f30a8d09e2dfb43ca7aabd2b1118d000afed11505968ada62bb895a350d14aff94b90f028e378c3b875c9d55b7e16643e7861b910c4dce27e1ea3836242f0609206791f6a61c40d719ef25c96988840c5afbef9c0f465ca4fb9bd98100f9204b08001e84dc0006051acf1620176748100596ee0601ef70420ef38fd032edb1d078e98a36d8becf0aaac4c56129296ded04f9ee5a362b2781fecdcac299912ba9fc310be03f51fcd4ca6c4417bbdf2e71efd56fa9303e559e7c59d5d1ee8604650dfaf0b944246141af9d673dec6a19ec4168638ab8fcf29396f12393a2a3ad1bc66dabc5bb927e98e7d8923e8eef128a0786b41acfadac4a0b829591dffa6e84d496f6ce71ee7d86b4f8608e5434f6f6cbe6e45916ac50b4346b912ffb8918a80c7a14965c3f580228004d75b3306ee2ff4af1821a835f06df922742af8219f2079703b48c871499182ca5789f3b1321c79f809b17db3c420ab46c260ce9df542a3e64348f84e0824e621e158489646c67d560035ed3f9ab8edf4fe0853f2064e4eefa0266e2575945db387783074c22a0d4bf6c2a537d8c3215ec23549937773b4cdfe784ff4f3250fa5cc81a6a9c725a8bbdabc253778e7149ce005975ba233315c5fa52001d10ab7bd3f08519d5b8a4091330615c96e285203c5104cb0494ddc96faf649217158e71c1f579ad1a2acd7ed3819bc7d6294b150f9fc0bab9ac653e8fd856e9749bc6e316c12d682a1ee73a7e16b2fb181b5108858b209b9e092cd3fc6d2edcec7ef0ca145f2239f882096aa7394d9435c05fb1df8f8f39ad4e45e7c15bd33b116d14bb29d652bf4f28ddf19cd8dac881d452ee16b225179591cad0a78c847d2a472c666cee1bec59509c5279b353c8e98968b8919af60d941a0c11c03d4d6b76fba1347c85cb4fbb90bc4f4497b7e2d494e2d30c05a8e5fd135b37556a3e372f1c41d9fbf055670747d13b0a592be968f0b492a287aece4c23da6e0ea6eb6aedfef4545017e3e46ee1c93b841edf9dc38088127941809a0484669a558d6310f529ea18023ccb4fe8f976c764b23ba50cba85b8781754ba52aad9a3844a2ab7895e258c776c97128ec5074c029f9ace1a820d6b0af5f2ea74cb06b8107c949e578ea9f07fea17d192e938d4a7a2f3adc56a5f5eb4030a8f444c5e76ca378a18fdf8d0befe35f65ca206d72c65c948a1a73f21867abe0f2df8bfdea4094b39bc61dc7571bea21031b88997b09a0c36cdc0214814ce17ce5be8e8112136c74e1c15bfdc85ab2df94bd4c214b07538cf21791e1a00b7b57be9f41a118c4aa348b86cc8be9b793b8103aa30e46e4c7ad533339b761b80df657e51d0fbe54c379a3acb973af1a2ed47bf71c63be6cc12db6200bff75ab440a2c6f7c1915777f937d3104f2e5beda8d37baac62b96b84fcca6906cde63b42bd71c8d2c3e8bda925bc8553d878362ddb1298f1348f86eaff21bc98f744685b548718b150703207112559c60618cd9d6270b692926e90a207310447a35fa828572de92a88f14ffce723aef9e7efee03332a52a2419581d5d42b15a3f41b548020b2296ec9687b7e19117ad9f835c8d111a495de68888945fa2a77a6ff7d4e47256ee3448c1e335879253efb7a62eb167d913b95dbf3480753df5173003ab6b2c7f51644945d0cbc6eb2a023617f36b57d00bcfc607c1f6fc7cd29b8644d12053f80b48bd427411248812314b9b2c8b18004d4cd2f719d61440604441707840fbe97f4aa4ba4a61d06c1c88a6c5fdd808c3e22f62fef30b5870b5eb9bf781525de773dbbde60ed24f1195a6e92b5e7a5dcf4f73964ebf034624e5199e8012867b675243a3779ea041eb9a9c0fcaf265f71d003c80ff782f058c8f77df5ba05dd30b0affee295930ffa6059bd3d72751e068927457f43e5f1a6b08b296950dc8088c370dae3f31aa48b91f906097ce3b01c2f14a164102fa6483c5130b8c04d60a4fccfcf73a798e6205dbdde4f8ba89e054167f5903525195063ff64e6f351e5a020f038bb856031226150331fddf1f9cc9a6cd862077244bf38a01f343d0022ba7fbd94920486303c91ae2a51de3788201b9111a3723ab77e17f3f9cdc18b28ad7ba1629ede814efe0a8121fce02c1c0485c3c3f1db5d0533515427c87ac023a6e526b564800f01026d986e7ba3a3e2a29d55580be2ef86fe79d7cdf09a6699423d4366333c407e623a45dc70ca9271683788909248f2c1494518da0a74dacb98d93b65551396facdc6b16be2c07dace04d014934f1018243dbf68ce830a0c0b42b3f5442654312bd462c2206aae97a989ac74d7d12dc86ce6760c352bbc43edbb63b66007dcd7a89e3f7090fe6ddb011b0bb748f070bf544567d4fa138a9bdf7a731892c251170497763c1c00b4721d093d3914ca4f25a53d7238b5a103e747903eda6a7b7d00979259dc28fa5188aee7749c79c220cf7c360fbb1d3902e36db40c33efdb39b067c9093862f3644d7d7f1a5d4ff55c3aeff4c132e0a921d9464c205a799f04785581afb6c51f016b7d557e2b00f83f98efebe56ba61b201e409175922fd430bb475d65ff8a800a597909194d1bf94b89254f9da9572b294fcb65ed527e390d86e105200317b5a38fc78fbe09503d1655c8d9d39c95cceaa3718fb2931508e9d41a52e4b1a42f13adafee5da3eb5c373dc290398f823e1826bb0ab6c3443f42411ffbd2a29cf4587e005a49422914ab57f8ba92d2a4f0ffca5ae1ba131c888fe0671abe03944a672cff7d70f76d409c9dc4bb67873d93a5e4c25c75d0a27f12689141a28c4589d015340c540a7934bf243e91048a0f19df95819485b838a9f3ce11cc7926c98ae6c131362cf26440b8f3572a138e5eab45884334e9ab4074d24d1f545f8ec05a620152f5abaa9dc7bf71ca3da2d074ccc78b43df0a75a4c15a9d80f066ac055b26d4d8ea430560ac402c15c9f745e62a8ee9bb862f564099fa0eeaf9e9eeb14a533a60312960e117ea5386578005e48a002c56496500b4c2bb36f36a667b84a3b191603442893d3a9983e01b41bde60897cdc6ff73e844a6f18af02fbeb398bf9426f765803bc053702793840d00b9bf1003cf24659383f9c3d6e1deac23a1a958442af39438606589139bd926b653e17d736a6496bebce95ac8bfbaaa9c7d26efb091e102dbdd7f78e97d2111af0eb9a4a6e4e8194498129034e8b526e49c4c3c8465255616757621b47ed4c98948633a9d5324c9f6ff3a0b9cf1ad28d42b460ab63c00624bec26987da2012f6dd2e1b16805cf45f6ed4e13e309c0ad44e88947acc3541df1205757501507f11f66a0d732ed0366f192fd5542996dee2bc95079db3a035252672e686cccb7b28c64afacab0d458bc3246c9fde8cf48ad491f08411ba408b6add5ab4b2f80f3969898064d8c37b460c694a2b727881fe5ac515a06c54c682fd9d18ab16384c77ebd61c68311c9a50413d6b5051d54e159a61d3a60a5036c535b9fa6b4429b73900ec084fdaba8b468c316e005aa5f29a059d0372e059288f9ca17f38c250123b56a3c91032bdfb481e64cfb639ff7fb8fd345435572e2add48ce2e180bddc4b8dcf430b0ee85f74f5d8cb991eb88bba12ea6d79c8ee4ffc501816ebd96c86e659aea483cea45be6edd0210d790e24f8650b965e1e39a1136138fb0ca045370d67326ab1d7be65f0f2b6fe7814807ea17fe0198f1127c1a0a9ff8cfab3c35815624fecc63938feda3254d318bd0a2cc277466974d6d3748560b994eab18de90618e453b35507c6343e1f378109f0e26edfa1337b2caa38727feea2cb014084187668d0c44256c0b67579d17be37c2d0053f5ccbfa6c1efc6af8d985680dc636e0b4d5dc524a473d6a5a499e5687ff91866382a9c04aaa524bb0fb48ed21c83575efc0f8a8a80b953cf4c2dc49ec3581e18e55a6f8024b88bd5426905eab6ef96d940d0fd2618af49c00095a57a7007a7900ad2ddf87118716bd2f6e0242d7cc4e08383a5554cb5adf52269713dc91cc44078e7d82daed1a09fd644800a5720467cec40ba99d7a0c7a479b528b440d64ba0357934d12e55d14c67003a2a5af585f5769552023920b06f345541a8df92f295a37e61b92574f6e36ec21d411f4dc98021df950e09735f420cbd5472a9e88183b3bb353b2d79df1a2b402fae67457e404ca2af61b3e00a3647d4f42e1acdf2d6da3f94e657075cec4d8d9055894bf321073f8296ae89eb5c782881d69e44c670f027ea1964679d0f0b8099dbc176a86f663fdd51e7579444b4d498355560b23b2c9aafd6615f852c78ab64ad4c810312c691cc631c4d3bad1c4e02576cb03c862c14b3e8f3d5b445f88af4a1fd2fe97443853e1f904c0d3747b058168e80f12edc383cdba76330fcf3e8f5c05a8acd11ceb24fcf804e86dfdb80f03fcaa7ef8ffec20f0411fd7da2b38eae7cc2bcf91612ec11f8c65bafbfcfba142bad03e45ef96aba001618eb0a426343ff8bb4c290f71d43da02ca28dbdf4a28a65196f0c5eb54301f409dcf58d770c4ec1ee2d6997c5b5a66a53e32a68dffc4fb89721568d70bed68416e29c92732ffd5da4c8541b27a0c51d4e373ca90fc726db4daa099b53ae5e618c99a16362ea98cc600977c78a9787402eb05b97b9196f0aa9da5aaa3bc91841b42e1ea8cfe8c4e283260cb6afc283bce209d6c81dde8d9cab05615cd7acea9a7ec880bcb0d0e7b74b97dd94b0c91007da703b07c38caa63adc7f9d57e67ff20a6904e08e9c119d9683387fe4015c0242aba057a911e9e70c6e5ed9afe73dd2b3dfb5ae29d4b06976ba005064fa379ca8a1a11eb3de1342bbd7d5aa32419e885b4d244748117b42bce39f83092dfecdbe2b755df8c09976ec5d25b98c2ac053682d7e41f0b85981eda679699e1fb588b4e49107132aeaf538fe9e7e5231d12471107e8839d7d8f170c67ee63c69e8d33d46edefdaa93b1f8f1b4c4a6463c0bc428a235e7a822ecf471e2172c2c04e570801e38a5152a1839c8e50f2201302b01527a64f523feb1ef901243765fea6a5ad639bf8d27738956e8480e61e0c607abddc01ef320bc0148e053c405535f38b9619b9a2ff05e5e061308cb1da54d585bd244c9c95af894b714a14e7c58ce9d5340df0108e4d888f6df3fb1b58fc0fd67e734b40e1dcb770521b5103a96a23108c8cbbdcf308730e7044ffa3efa2010f5010205870a5f9b4ca3655aeb2dce46bd4b922f352b6c934489a40ad9567a022fea884c963a7716e660eda171ba5d6c8bed49aa37ac353a26da0d48b385f1b71c68b1b5d84b1f93fd22941f8c1b6be92a30017a286d4f0e5c566959de19b8c37883822db147d7a881efca2c596b6315a2407eb938d82d2c4558e93156dbfc8bd432b8703f37a47b6036151627a42d5d75b072551696aa85a1d202c245da9640f9a19616c429e338177b23a4e00868db1ba8627aab4d52b80ff37f4c6fbe0593bf66f4e2d8af4fa1bcbd87365a546e6cd7cd3b44cd61b173f09eb419eccbea79fa5914caad46288325085b267597374be920af940dcd06105f2681ee5f90b53e6416e3551cf39d803a8fe4eded6a325941bd1db425b114386aab4ef782a491b94735e15302ffc5f98e148b9e6e3583828ccbafa0b4ffc380852fc879554674e6caf8c75f79e260a41961408e1951ee083cbc1487ec298f69db8a15bbaddee517ebccfc42fe8375d4af9ee07e3a1e8639113d20dd2de8e8fecedee5a5dcb54e345c797b5f86d1aff1875cd076b1e8f0e45f19581aa86d9a40e4180fa97e2ace6eac9a0449949b54fd198e1411b62487210cb80c58ac50852fac410a53f61103206559b968c9afaf60350d55add5e3f61aa5ed2b048eb1bca44eb2ed44b8bed1e8d5c8ae6b67f52505261ccc1ffc2c68dc06397fb15670eda9556095f4d5e2dad7e93be3f4c6cabd75856cdc7b45ed5eea832dbe47bed9e384a5a94bfaf14ddd834fdd8018f872005a7f2e20c2d64b747bd7d8d5be6b891d0ccb30ed73d867929447a3e3f81c727eb5098a38c081e8cb6dc36864e7af47a762615ab8428195d348ca7dfb505be0c402e0e1300bdf41d48e78c6e12f096e794915fe5dc0109a27dcafd29b11a46b42fac0b02de72675d2783f535cd16d28d8027ba9bc85b6f6ac2152e13545ef1d03210204601ca70596139c35fd2c80f7709f48d85ac42e4c70da65ed030d3012d3089db2a9a6b407b3b4c58a45db66c0c50f4a5b4e1cde16abe0b8e0858109513d54edbee7b9d9c30d27021bd7361099909e66a5ee21732f4d61d7ab4dead5353453ac3f0db10f9d0d4007c14ef31bb042361a8f05ccf3836aff34d00ac532b95981a6ffc88109fabe19664511dce40237e475a0f9bc41f59e7e227c17fc1321af1c1c361531160142527f22ac4005862820d3da037ddd8cc5506b1b0d8f3752ea5c700432407b01aad334a9dab534048136b0af16304d0b2613042fed603c42c9c1a6d03cda570135905932fb6eaf334bb66c0b7d22a260f1471c763ce718bb25a212fa6f19822dd6419fe09bb2bfd12538531bd2d5f9e3100784496b37675c750ed9ec4a7d671f978b624859b97706cbf90ecedae6334c08742eb8471c03478d2151394cad0e1e4e28e18622f5e17b3cb01cad31a42ca5cc09a1dc2dd4d519b0a924db51a06605c9c5165d8bcf1baad636198cf629d757add24caa53c897a70bb3ced23a19926ca4df8addc1bc983f319b56971714cf5555b4a93a32cc8c72df886d14f2286663594f5fac8831081612176e56237f1fe7aa41ee7f9dc25104ae9059caafdc625c7f96b332b2265c0535b538525fada061816349c0fbcd2d47db1fe6b6679235f7dd948ca3a4be46da24fd27f6d3e8e741aa791068d19de9e6468d44701dd8ce91dc25da7520ca655c4300599abe96c52e7c08eeeb7e215fcecdf405637f93258a74c2c221d29d1ebed13a493924967c64723f88272b7c844d37a59af6b3cf7e1d729a51a640a9fc3a61308e51ffcbaa59f153daf2a598afcd8f67ae37a3c6999ebeab230fe99a2a0e5edb183230f6015c1c344b72e295539e5e6392d1a28aabb684ce5efc6b29b47fbb4b54c09619e5cf3c248c7ea6da52bc357e30785445f8c840bfc529cddf9ac8ceb5c1519aab5bff40bded48c8d6ec61ae42e4ebcd85cb863f3a14f838cf815c4d02324a726693512cb8ad68697a7f0d08d6134d3525882290003442fbf17e2d2b1d83f7803fac7aa6af35002ba3cc524d23ceda762f4401591184dd30f1865fcc4607fa0d555ed03c6a1e8a7c5c75af28315b2810d7e55dc8812b5df9e0bc7572d4fed371631ede503fd44a50b06ff655095bdefa96eb0d455761039d8d789bb38e46db7e26720b7d61bf64a1d164847781ce3501ca5ceff69489f11492e68407eb0d2ce333bc074e64e235983119e32037ecd9f1b59b6b67556822b98358d39ec724db1c3eab9226ea38a8357b70e3ba2d5b3cae4d42d1422c299989b66369644e346adf6d510af172fea164444e34ac8c57ca47ffe7212ca98562f6b84cec1bbb8e61825a8975ca2a15e93576f2924e151160786954acb27d1168924a7eec93c7f2c2fbc3f96392087444603e6c8aec9f78281e3338058d9d04db2cf26b7ef6d54b8af0ebac77adca7e02bea1b179020060894c218927704724437f1145f800d80e149a03cae94e975930ce3a6ac68acf33641a797a4bd2307c8325f089262e0604aef1090e60e713dbb06140c791e2bf78e4f629d733367c52c72a0882c86e4cc501a2ee8b76ab5f6b8e2edd178b5c2ed4a3fdd6f65beb46424b5676776f29a594329e08280a740973ae91c7ae9b698cc8f4b35629d6bffe559f596e54356b98a147e0949a4c5fab94df1acc5bffaacff52c5451a5d2748032c62c91031b574441638f41634c1c4fbc8c21060e1dd6a801e5431729c08cf1050a1120192e763822a9082a5ac6ac818394524a39ed992cdf43a7a4a17f9571c30ad9c51026e4c0040834d878e114061a65c091a608316d9cd6a4c132679436640d5cf27357b9c197266b6cc1e24b0d485cf0c413356820997104860f35830c9211409ce1e20a377c040085923069aef090c51aa824f96b6099731fe0f26012ed79b9ada40752e95f99d6aa0ecd2814544aa1cce9f2992f52795cb29eea12d057faaa5db2de6ae923b26e593b3f3b40b4ac3a4c28c073cbca7325c63651dbe8f576ec1a762a6a5507c3bc4d8825e79e1e776bb5f10379ed526ff75ebeaf9af7fbee754f2ff5c8e230fa2a76c7c4f1c81eed85587bdbd8b953d17b27d66fe258021750ae7a146281730bb1b64c888577d0e4b9b34b997d7a22781b5051569d6ddbb677a25675b64cda2f76f61eea81fc02c3300e1339aede3b11faaede5342df7d84b9b5dbec5ad62529c398bbb6baea86d5fa49fb772dbc27829af616f85dd3ee799e87d20e2002afdd7b4a1cf3e56d8ed244cde63d54fbeebd86a391ad8159cb5ad6723e883af80f95c18f46f6f7efda987f359b7fe2f83dd49b4cfeb4cd351d6473940e6a5d1bba9f1ebadb467badcb9f585aeb66757b4d8f98c502c1d56a05ae6ea77d57fb5657fbb2c7711ce7799ae7d97bdf344fdbae2581ba3bd5ae7910ccb2cf6759e665d9b950a3c4f11bf52c8e4676f63c3deed89e0e1d3972e0e0b85c3737ad168bb55ad9d8a854a9140a753a8561ce20f87d9ed7751873dcb6d95cca20a954b6bddf5cca20a98f7783377ac4b677d65ba2943e582a70a5479bf22ee58fd43d3d9e447cd4b3787f12c7a11b8a23ccfddd6699f6bcfc0a3eebf11ba41b14477cecddc76f0eeba1bb399d5d3ecb1b69cd1413d386ec567a827c9f516aa9a516d3466b456aa9a5464c4c484d496694e86bc7524ac5ec1803ee15a1eeeb0109d6ac59a3b4ade8819d6da5521753206d026cb93485119612c3e43fbfaf951a77f5a871f5627a34b287eed8b347f9a14bff9168d3571d68530d29260ac6cc40ee268b7f14650f26dede55d7eade5b374771cf98134f07c5596fa61e45f81ee1669f86e473dc4171fc0641104c690710ed13f7097257896378fbd5539cc8adde433307fe9e9ecf899827040cc38f7973a176398068879fa9cf671010ed940ec18e1dead1c8cecfe7de5339710c9fad9e4f7ae8ded5391db47a4a07dd84e2d0dddce7ddae8337b747b5ea8d8b75cc6bb5e6b1c962b1260bcbc06c3e1f6461cf66a8476c825d778c76e7c46e7618c3303ef71f45d9e5c1ce9f3aa8fbf6efd303eabe696e77415d9e9e90dae12c562cf1eda477d223d13e3d258edfa987e268648720a8c71d1bfcbc6aea71870e1d3972e0e0b85c3737ad168bb55ad9d8a854a9140a753a8561ce20f87d9ed7751873dcb6ad567ad43678d56d44cde663b6c1bb2e6510d5c7bb5767b9f4886df0addf8852fa68d9882c6d63a355e0a5fca13a08ea11a5d2a3f7947d28664789e3d03d8923cc9d6f3d20baf3a7e741fdf64d8fddf3b3084ecf01443987afde8fdca11ebf27dd531cbd6ba7f947eedd94bf3f500775a3a787eeeef4769bf7f8d1c8b697690fd95da3b899362da8b5d65a9f437f60afaf4aa948353a767bdbb88f76d31a868d4037f580eaa079faaa54edddb6e3d5b951dbadb7bab38ebac9e7701655ff4490e39eaab5d65a6bad5575303cc83de77f5fa881f0f79e9a457c95387a97ef1e661173e2988ff3bf5bd5b967712461e763e1393dba8678c7dc413dba420d84c17bc7b8abf42693390d0ee98e7550f75007a5ce81e298f510dd9dfe5297bf4171a71e504a5bfa6ae95f140afc054fb739dde66403da70a24dfe876bddf9dfc9e6d7e61cf88cf5786db883dcca46af7e577a9c9b03410e3cc8fd1ebcc6811c075e779fdfe73f3d721b07e16fe036e283def7fc79efc06d3b4efdfb9eb3ea3636dfc3ab424fd21fe1f34351d257eeb238624f9d4ea81308be0337f09b1ef14150f47a28087affc4f0591cedceaf1ed0f750cb9ac5eca077f0eb3c1d843f3f6e9772e79d61d7d6267064fa1f30d040839cccc2b9061800d1acd5ba29b2983025f02891e79e42e69e4b6a30ed1e5b2e8599b2c39809f302b69df43c9873df6c32f250dd230888466db3cefaeaa7b782c06f07a9eced28284b4b4cf6a8654993c5cca6298c75d2034afdd3df316fc876103cf74e4bfa02bf7bdc53e2d85dde01f8b90345eed283c0dcf8e039bdc964f0de2be609497d3b28629e10efae3ca43bb7fdd3a32b6ba0ee3ba73709fb7bf7cbfd7a3f736f4fe94d266ffac3e774107ed641a86f9f38827a886eac3dd4e55be268f7e9d5f36002a1b4a52f961e57dad2d7e913f269d5a52724bceaa1389a60ab8ea7873d5175ac759ba8faf4848ce03d239bab754f4fc8f81dbca7eb0ef55882adbabde609a15bf54dc87750ebd17ea86ed568e96bfb67a347a2add236d503a2dbe69b68f3efdff67d93c943f57b260e7d43766fe75122bb3c98fbfbdcdf3d1dc45d03e2ae6917d0bcf7794f8fdcd6b8fd5d7a43e6350e7f6207beeb88bc83a2a4d4db4004babf63c9012c6712592e2d2dd9dab90e3a3dd2dd1de51d1447241b4c5da5d2a3dddef35323086af8d33df059f4448c1245c8c2538f83b9c377414374877a84b93f20babf7fd7f4c8fdfbc46e7a43e8a7c7b9bf77f746bbc1570fc87bd63d153c463f91d217bea72d7d61ba3b1dc47d725abb7c4fcd1b13e5d00452edc99a9e964cabb55604b891b3d7e39b4d46c6ec087407d56fbfb11b0b0dd6667dd346a072a7f680a5e71ddb69e9d741a6a5b701a7594ae4abe5a6475b6fc59168639f19772c3d0ee6e6b87770cf9d6893b06ba611ed6a9f59961259729366d1640a2b69957bee794b37a05572fdd5f51edca06b96d5476be4953824c9d662f77e16156d2a7448a10a29ac58010a57a290a10a16695c71e20a208c50e10c4d4a06802c61aeb860cb252d362c65b13203344029f2a2054d18294924e0c61193161c5d81858b294e6abcf14213439c51c10f5a4833a024b16245881cdeb0e268a806278430b302124e18016685344360d182136414855123c316484b51c0a8d20519444ea83069a2a10d2b340cd1a47ba30d292d1081c310653610d325852c94e0724398a532638cca90e28215701cd57064420f48308c11c31665ae203501854a0f428c6142146c0cdbc29a37ce6839010c5d6a98400f5f9069e184259e50816512c3d146260916294e00c517250748a38d24379c24c9a10429704812430949525881441247a3174a8aa080f2c2165a94b42a69c008428c2064c8820525ac6086268688b2c6cc1133c4e0c40c4fa0c1841b47f01005104dcaf810c61b5a8e66a0c20b15518c9244a942c31218279a50e00823cadc00e585294451a22851810a343a4c41e10b1638e43086cc9a1b56f0054a0e4c1ba881c4850b4634090207ce8bcd12295eb62053c60e2ad0c410ad208935c2a4a0c21938be5c51834c0e493b1c6186970cf410470a3f146146891928507801072c5da4004c9625341f8e06a0051a2a6b804063698b11f440460d4e8e5288e28486b9410254c2e8c1092f98d820730128253405f1031531dee832e50608a459c3c60a297841628168052f6a683912430b242d1c97189c3061060b66e080438d962635062c472dc052c60f59a08172a6cc067c48420412461c39414492c605102645668280630b993272b40851c507348868e249064a589e2c41e2a805516c112283265820c4971478d06187151955349949028949135ab66842e945a0c7d72ab5554a29e54c62ebbaee1dd1e6c40d2a007cec89803da702bc9c6ed4c6177d4ded45297d278e09107b6cdd83bee65fde953ce6f0e821ffe4bc7a50aa5d401fb05b0fd9ad7943b4739c1e4fb138e68d3fbdddb4f12d7d51dd7d7a1dc87901be9c1774d9b1889dd334aca8eac85f9dda4d59dc56d76da6a35b09723299452f6c2bbb7e22eda03a26606b5afec56aadb5ca7b57f2c472a002d340cc1a475268e9a1c915306596784183154e967cee113a0bfdc40088065daaeb6244a7642593b5ce7be909f90eba348926b4d8c46861e3ae502b3d940885163051210a9931c244a15b5888038837aed0c082182c7872e2b0d06965e3aeec518a195f9b6e7126862a927ed042298c0e9ca09482162fbe6c11c267944a5d9e6060baf8d0250a539719ca9875043c3b07c8a0637539b58301102fc2a03b40763028da32c41055a2e092041192cb19388861060635c0d0d0c406274692fc44f7ca49e54e764d588c51030b4f98f142195d56985636ed521d17355cccec249a9cc84d517cdd18442dacd0041352709022862a3470822a698290e28928599ab4c8b0347d917156b87cd181619dc5450b172698b6b855bbdf31f79c41aacdf6976a5ab661d8bdf7de8b8942e24c7519bba3b8ab66e570ef9d94d232a6bdb5a6ecb679dad75b5f5b05565a6b338c8809f004955e6bafad934ec1929e52ede3f6f17ec4ae69af6ddb5e75eec5302c579db96fad785a6cb196568a7bce39e714122dbdd65eeb85a495ce5a29b5d2c7a4e38d0a75dab505acd11f52ea11c31e839dd36a6d36597befbd76d27b6dad5a504a2bbd92a7b5bfb752ec5e5b27a5c1ccea0423a3246baf9df75e2d63429ee0a6b690c4b2add6a814365f2b25cb886b8572b616cf6e76313d626063f729714b2b6da6c3c8e2961fbb2029337985c46db54d81dd007d19a12f5b29a554fe524a8bd017b556530a84526dad0b853c6fed116be9776857eeb5768ad226eda4e8bdb3d65a3b0c7b7dc6302cab7383b79a56cc8af96e18ff00225f6c6343d8aebf40e88f6cdb8cddab5d1c64dbea23d2c7bc04637f20017b08db551b15f991c3eb55add50103905aeb2ce35a3b0226e39dc1d65a6fd3e71979a5fc78efbd265c8f8bb4f75a6badb537b379639732556b927b654a4a25f2c87a8ed51dc8dd630703fae3de256bd5c06217bb17bbd584df31db6b7ac4aad4a94dbb7a2c02a22063538f294ba98058cb3c82c8db47ee23f631fb78b76d7b711cf7aa23e7de304ccb32ccdadbddeeaef161d8077eb8f3363336e6c278cec70440d16ac786b6fdc4be8b61187631ecbbda7e3a34e92886e5cacf39e79c76d62be5e67836edb5a37d04623f26c08ad5b4ad592d39f15a6d3b56ef66a5e6c9a0e14073464a8fb64799d890f1baed7273da7be87d507dde72cbbcb5e7ade9d1ead0e7a55cb51ca4d02d184bc9a36519942f6b595547526a2fa59a35a5add65a4b3f3094ed0ee49ed287b451b0ce4e018688746b8918d05a2206ac269fd96a2ba5e0b696ca11b22d83b880b25d9fed7a45906b36466b25bad4f2c0430aab870f0cd9cd4391ab02d3e77efa5cbda4f3b9cf55471e08dcf5e0e6610457d75a6bcd6a9a50f2552ec02a66fe040b8725e6064fcc0f1d982a6d58c1609282d89b0e9b127cefbdf7526b2bd19d94068cb30ca395565a6fcd320ccb30ec5a5befbdf65ead5dcb627d47add44e7aefad9c4ce86da6738911bd9452249352acdebb894728a6bf036781b51f415279ba8f49e5c9973f924753ca62a4c6445f3bacd36cc6a61febab52a126f275fffac9304c072c669331bb7e26b9923776fdb47403f275446866408b98eabda73bc9be6b76ad15fb346d44fab8c7618b1f489d7b90e9e8137ba4cebd275e299db8832552cfa5cefdf602ba41d28c4694d10d0dd30f7d112df1e48c166390b16445cb91325d80484118356851c50decca1a45391c52cdc23281d919353b6388382e9a33b42d076f3d4cacb370e8c66c19d694e4c21e25521743520a7bcc181b198e8c0d1368666dc9a97cc69299b32587b1448f42393bdbdce3c54ae5cccae0964b5bc46cf1b2c797521b67b2cac9b893e2911349d5993dd2e49d790d3e1b724f037e1ef0810c8284844929053267117d4d17fddc54232181bee60d30e583223d3f395316fd2021a167be0193524ae9ce3c06f407067b1e15461e73d63a4d278916452bc812050c46704d24c103162fcab8d0e433df53798896285591823248a88082227ce67f8ca6b0cee4f13ae4548fdd1191d0173d5275d4e891268f3b94e708d5a13d6cc8638f4d5f65107a4488cafa8b10027d5197fc7449a1293df43ff43bf4405845995eee89c6964b43a4d97387209b8e08edd0262aa59460aa6c0c363d2a8c4c2f17cd56393509e64a7fb3bd5424b226a094a260c3a28a0f7fb1e52b5828e16c8b15d659385b2e6db961cb0a3693a6039e52da2ba594f2269846db520a3a91e7a97ee95791472ba9dcac8efea0daa553069892bf056065861eb8dcf046124bea94344a9c1146d31266f8cc7ffe352fab0b584a09d65a99a4d0b9c4cc0e02a4c8f392fe0c2c93dfa94eb4d7abce779cecfcf0d053758a7ca034e94443a99541ea07f405db9bfa021944de0ba40fea7301939cdfb177a6585d6a0b0b299ae1b0e5842d4ae8921635b44b75db964b5ad2d863ce455366db02e72769604fc430809643295d6db9a4258b9db75cd2e2c50a3943e9c3daac1de1c59c2737d47421c5b081850b54a280728518128a8c60d2a2e98c14ac10871b5be69c73fe354f65d468991395a4cc1c93a6ca5ce3461573ce34d29431e70c430d5691913bfa9a735279a202bc306754c7d025cbaf2f59b01151907630064034e852dd1726c8c81eec02cab29d01aeb5d65a6bad1c0897dfc00bbc265fd909ac9924b7b1e5992daf75431d3822836856beb20c09bee601d9bd9180f1ac90678ed4c99e7bec2cc32e5fd9af0794fd136dcd2ad68935ef2c849daa693bb8d65af17fa50a8f698b48314f34b1314d8b1731603f8b38ca355de1be6c60cce03155745d60304e644813851118428c592d91060c4ec2e8410dd2166a844a72705a94512b065305ab544761a50c154b5841c5081756aa20b38310268cc941cb32c607945dc166bf48d364c6889733bc84714202e369ed15ebd57246597117cbec8629e1858b3d666c94b72d97bc88d9bc8451a271196756d65b2e7919c24b933dbe9c6c444ed68c81610a1156d678c228090d432cd9f0461651b0133a2e8b0c862c8b951ab29f0720655e58902981c43aebb5e5121468405146ca1071e4608112518e825023b5040faa3042bc81ea1284092726464451f510c40fad26d05a4b05866d55db5a2b6fadb5d65a4ba594326751fa41cc910b2fece043c4fe070b2d2d6c5aa060210b52d11b453ed65a0c8cf298e9b5495292d9f20da03fc02dfff300c993a5bc804b96b7526b76005038b122a2931ae1574a299da7cfb5869c3db7ddd76863c795898aa15724c975c9cc606a8b342f50810c42b57d42fac02cd3c6fe4516f4854d61c55825fac2b4ac72217d60cfc4dac5bc003bb65dd1c66e4b50435f98556363f64efb996663338321ed760b40218fd6881ebb35b2495031d6c81a59236b44c5689666d1a34ac9de1d7bb542feb062c81776acd3f62cacc71e3df658a56c4cfb32e661afda36491fd80b30060a15b3b15328540aa542916852e5913eb30334d93e13b13dbdca247d601f801af9dea649b384fed85230a22f5026153b3ddab65ffe188936f636c872386f834dfb764b792c525151d1131fee973fb4675996651b70dda66f26d67dafd592a6529218a626339d48c2f7129ca0fba75d15903e2474ffb4f741a7b5aa03844b562633354d65aa4d4c26132229549064d3911090541e2b8100e9f9f9a0889105a080b4b16b99f517962ada48499587c8077b2712f958a5ca637db05b3195472231d92619645e231b14e4b66ddbb66d18639cc3898a86a5a03285954476045602cb61b8252611f417898f096b035765d3ef68f4af3d7c4d505c45b16af9b5a50915e877e8bf0105a25f3863dd697b26cf2db7a64756766dd5e3cb8aedf0b4b1465b69db4fe185beec311629f5288451795fb1a46d8f445f560a912ecd0b98986a533553d3142d9141662daa45754935aa4cea5185428fe8118522850a52920c32003499be8ad8961e55aa3763260d2da24ba81165a28494a42486a9691a4d2326f36842914cdbc8911090541e8954349750a51d203d3f1f1459000ad97eac52acb5d65a1f4be4635f912a8ff5b1af4995472255a52a460699d608097f4084b966db63216448b673af80f64c9720bbe69225d0be6997943e52d472d5b90560dab90772fffbd77d26caaa4def83ecb3005b7c5079a8cfc5303d8033f9526a51c08ee7d4d3685e801dfb4906a17aba30050d53d08034461e659a0f365abb02609143a8489066120f774c4f23d6983f4df372ee582cfc4d4fa4aa83bd005a6499c1089aa6076026df3fc94a7b16d11fe3c4553bd6b4d35df7f438c8aecd14e80bfb5c72fa21d34b1fadeacc6934a14c238c0ba9643a2bc59cc897963fb4db2d87beea35ed47fac8aca669ade6caaab2566ab5add7a67d827f6410fa9c1f1964cbdd77b6c4a23639d86acd913e00804949a5adf5950c6cefcd979c894c76764a3dcff348d8f81ea65d873b916863b1ba4094cdb966c889a22ed4ac91a1053b5825512c01070d60b098e20a0c0bd110362831650d18274a459061faac9002052bc400260a1042a081c10517d860610d2c658cf8382b34e8619a62a0a832a16822b37200b65c82420628967c415fdaddc192ef954ab0567950c7581bdbc180fef08edde6d85f79402cc79f9de5cc62617c4ceca99708782957a5b25172d26e733f3d6a4a4e5a12196dede189f6cfd6f498891b6c7ac71331a02ffab2f7db6ed946945507e3ab442192be26c6c7383f7525e04ff9a913c94f6922e04f5a7af8f4d489d85c755262a3d2b9ea58ac5d444e0f531aa565d5d9b0877f6d2cbfea583d0a0901318146d4d1ac851f68e6aeb7377b565bd7543fa57e739bd55dff8e3d31fc27caba9a73ce39e79c33bcd4c7bc21ddbd0e3cedd33eedd33eedfbb42b83dabba6ede81dfa924472681cfdaae35d13e71a162b6bd74a721cc713b587e2089e7aa9672f75cffb77dbfd7c979a36e6ad799ae7791f775ce03b3dba3ae82ef5e802350773cdf6f4fed99e775707a0bca7bbcb4df45f498ee37c7ae09f4f248706e79a2bc95164cbe3e822bbf3721c47490efdb325a8c79fdd81c752efc4d1f374ea9a0e4a3deba0d53521209e1602b253dfeaf42e1b6da5fabda6c71b2de9cbe696be6cf43854b71422f538b7eaa74b4f88eaa78f26d827f993269ebc7fdde99abcf74f75fa3d5d93f73a3dded377f9b54ebaf5dbba26b6beeffbbeef071aef737b97557a97b5ab2390fd5d8ae3cf9697abdba42e2bcfe9b2f264d7b5caf3dfb06c522e3dee6c79a35b7aa5c76ca3557a6469941eafc7d7fe1eeaf195f5b833ee7cbf28abce872fc5510848e779d57ba647ce133b21dff1a779e05c9f488ef3d8218afa57a26387d681c343cc712de254cfd3e3c411f573883c7e51bc0e7187f53cd8401fe74a783cc7ade78a803ece89f0788eebf84f0400cfd1a1af65d55192a38bb6f769972b02bf78223abee3bfa8659557a2e33b340f2d7a407577f73c0f76e80b1f73408473f14a727c07cec513c1b9a8f189e4f80efdaa83bfe3e289f0b8dea1651535be121e3a571d7cadb1f89fc88eeb10b5acc757b243ebd040aa0ece818f23ca8a5f8580d0f7d49f4d5f8580ec11a6962eda728265e501c78cf5387778aff388f614b153713b7d28565dbbaeebf0b3e3530f886ece041fe063c713eb6eb3acdd43f1d5753afc15f36936697d28da67b1041b6862b7181fe35f5113626d74344138b13989b24fd4aa4ea6b3797aec19360ab1d0e4b931cc520c338125d2688603be3e920d79069ec7f71ecb9d251827eca53b6de4196ec986ccc2822ac6e862830b4aaed8c0135e7421238c2154908598093c39b3022e96929c11e589329ae802081ad4d0018ca32359460f4d25a40003952c4848e00d16604041195eb8a0b156bee0e0040b4b907200838a214a88418625a614f1644a0bb01c0961a50c1b5f8c943843456ec1a2868c384ec0658d9a2aec1629b46861c5145058b1660a294db08023891933a02843c51425a8028412264a0882cb1701a823c2305ce212656389b730bcea74f2c2a39ef2bc5085ba867a28ca9d42e10c1b92611587e26877f8ce03cafff4e9f7f60454c1673d412dbd21197d7d5a236135330bd822d919ea18f7542a8ed9e9e73c0888363da63614a39ec963f1c39835be36c677db36ef5c786939ee2008de8ddb384e3b287affc431d4423db6b7c18deb193e2a75ca2d3d6a298dd236aa6dfbf52ce0a238dbb12beb50ddb30c9e0efefb5c5f2aa55d3f72a7de81dca913ed9398654fa1ce9d32f027916867e033783023b2b773e2d8ed4d8f423da4dd55deae68a7644ac6c9f1d4ff1dd771497f881fedd6813128d2af4455d71d14555fbd87a2502814ca6501fc951e5d546e227b75941e896cd4b1065715fc3ed0c8c63fb3a3f4221426b5d6ba1255c7787a40a8af5a5f8116e8a12a71eca152a954dad5d244785cab8ef546bd0df2c32ddc36cc23fbc2f09ec7c3ebc22edcee8979753c3b1e1b15a54f4fcdbc07b87e7350a4cfbc1f7ad56df70c8b63eb9dde64724bafa80e72fd460789287114eab112c79616eab15d5ad2d7afd2a3508f2d5e0289dad2d7f577e8d041698e1c4f3d47ebb895e3e62d16fdcd5b396e58add3160e0e0e0e7dabd56a712d6e4aceeef26087a794869803eb11a95d6aae567a05825d0a5c9202ca6e618e258e3d36eb37e24864dfb45aa73f513dbe72725a3838bb8542e9d34fabd6e94aab8e52b57e6a5d521e7dd525e569e931ffe6a76bb1a7b244f91b117b16bbdb84dfc25feb0185dfc3e959409fc7310f8c87ebdeb1beab955e81e06a14eab1c37b77f5d4f07b0f0dbbccf380883e8ff750cc83f2f8491cbbed1d6bf155677a435a5aa32fd4a94a7c61ab1e8ab8763abc39d16e89e377eb3654bc69fd445554a5ba4acc0fc594468940b6773c3bfa3dcc5ad257d683488f1d549ff02cc5619c737610f0cd345607c2be39206c39112d8ff59b77a9efc79fa83a2886299b87aa87df10d44fff0e822008822a0d84d227f03df51bbfcbb37efac42d6f600ebfeffb50cf27105c280df481b0f3e5066187dfb18da5627dd341ac9f7450ea5b98b359ae2ee5e19bae5be1aff00aaf56ab70f52dc4abd5b75578306cad74abd5021f8661188644a0f448b451a77fe20842a8411004433004c383c701c130c409f598fa77d571403d763fbda79e44f94fc49e1247a19c9ddf1d750ac3d34371ccd9e1290c73e84b26b5e817c7abd65a8becfbaab5c84bca4b8acd53aa7b5fb1c0d33b16ea955f5d98f39637d5435557646f5fce397fe12bcc458a64d54ba57aa8835859147abdb6eab559ab8d65736fb5ea3a1b1b9bce267707ffd9e40e638c3b295df7f9ae03354dd3b2fec4f15564775deb2c1bd6eeba9f342d6716eb147e77791904c1fcda75af5791d71e61ba5171a687dcfaccd6aa734488754488e52488cd736d2dad4b81a88379c8e9e173d7a134d029c4db7644d3f276646f478e1c4109b13621d6de8458db25c4da36cff33ccff33ccfebba94a753a95410ac231bbcac3c398e3ae931e7c8bbd3423d6a422c168b455fac9d23ac3dc2bc6744cedb6a96e26cdbee901076f66f3a847d3f644318b299f6b01305f52de5faea36adeef9db7116f13711ecbab76aadb582b8b39b7872610db4792ed77b68b7e177216c073fed3abdeb4208c175dce921eb7275767776bb6cd7a552a9542a95fa964a7d4b811b2aa5512854144dd3344dd3342d049e1c3c38a75027d4a0a43a9aa6816298c18799beecc65acbf22198d943b5453b366a09da4db88f45b2eda80da9c7a8b608b0cf4420a4f4614318aa657cd852e7b0f7d56d5a1dea5d0b757048f8eff9d3dd779438869ff7d3e77d1d0a4977d075da484e1a2894d20792f0f350de3f1de4fda4835ab56bad3056e1eeb853617c7c3b4ec4ddf78b3b15c61fe65258a7525dd7751d8f0fa0778af1fcf6897116bf4f8f44fb7bd79d8e42853f89767720f86ea87e394f6fc8f7bd13470d28ec1e8a22cc351becb2f401eaa1bab1de644e21b936cd1ea2b523b393b3eda8610d847d2f76b18b3d47e3badb69cad2d9274a0a82500e1115a19c9d9a46b5170ac6d8fb865abd75dc850771289e9ebb6f841dfb043eccd979cb39e72dfcf7afa786e2261f8adb087e039f6f314f48fea7693987e197ba500e08fbfb08c2060f7e7b4fddb00d3c69a11cbb09e508e5ec55d6a350ceeef0d6a1ee373db630cebf395f9b5f1bd6ddf2c1f0f3bc5fcffbb68ddbbe6d83927510a65afe7c0ec2d7404dd3349c03c20e553a5f9571706cbecaf4f58da99d59396795f85d521ed7a7ba4b945427ebb1930f45ec287114ca398956d3beef7bce393bbfa78222dd591cbb679ff731677b5fa7857236d6da2527e63de680b0e56dce1ea1b2e8a7064b8a6dadb5ca3a270aa8941f299364924cd292b4242d494b82425f55288421fa4ad292b4244dd358fb47a23c497a3179b22469c98bd2177dbda418e19e9e06fc3ce008d6a494af63edc5e51dcdfa8015670ad368be405f1aab6a1bc8922a797a9958e8abfe24431e279609a5ead41e69f24fa7a5723d552a2391c8a0c00ad98a148a54c872690b35f33956ec58a1d4a9d41aa17a070806776a0c300052e915e5ae4f80156f670a26112c39e20c105bc07186924fcdd28592121c70bcd084059f7a23475a70bd88186ed0018b3698b0410c9f8f853558dae0a14c1c4f7cea334b534af57b2a4f284a9fa42c7dd4ba268a302d80c20b2f6a7c3868e28912121a323b3ce153df5379aec516483bb001868c1ad694004493262ab40087167cea2f60227f53db050ba60017144a3043852c767803c9d1529927258c4901cd1a50dc283c09c515139ec0ce300090bd030609d4964b609ef0c02491724055c9d618a135a0e7e701acb3c0306131798166531ada6052d3821b4e468072040f3b58f9c18738b2c49126cb1a2539382e4436365746113b4764100db39f395207ab59b6e5e50b3b6284fec0ee7b3ed8a202b282b12d0bb2e4c912902f2160153ef8481d7b2c76b14bdb06b1ab01b620db5aecea02481fd600db4260d78c0dd9f5d69a1d57cf033007846db3d4c1ce894634ed3e6755cdae3c9a587b69f6c49176b1cc666832e746cea2c8f7087f916696d064a68aa3ccca5fc2d8e34b498a00bac0c2461059a42891c17921862e3a1c51a1430f2fdc197838a62dcdcbca972abe8cc9b65cfa12c509195851caa2091ac29cf0041c417811461138a4f1c28c2af7891ddc981e59ae28ca218a174a3e4835ac58a30217b2483ae3040d2e70163452dc1699a68694316648434b5218274dbcf0418829493829218d222e4b1a2ae02a1c29808105a0e3a8840c596873d22106491000002316002020100c87c3e1a0501245c222e70e140010759c44624e980904c22847411cc420639041c618430000919119a2a103d53cd2f32a64f9ddcd9eb4e7ac9e6430a891382849f415451df91b8fe4cf8538c3bd2bdfb4b6778df5ba72fcce6f119e5f16e1899001c9c598f3330fecf7adf39e9632896afc12c6ae5ba8888fe40aa9a7deaa7b64cec9fdf4906cb419365543d84c44b12e35f27b4b4eaf44dca39037071bd9f6d4bf60f8b7c92c0a749fcbc28bf8f6c03e154b1278ab3ac05ba1037aeca2e67bc8894a8e913c1ec93a2e89ed97f4652b61150cd48235ad01424f866932b947fa7ff42e994a5781a96103337d338766f5d8ad85f4742989570086a426b0091b8be5652acb88ee4b38f70dfa080c22bda06e446e3816a7d216f199837b2f504f4f3c883338bcd0eac0512389d3a745befe564c845e2153eed5b4cceee00e0fdae29a5dc89c5bf342bb5b5c6d20ce2bdfc961e44685afb5236588fd6c75b9cdfbf9470cb00f07c3cb031c7c415de8e2751589266a4736b61c12dc47006ce9b06e8a1044fcf5e0f0cc4044231df29081890ce20f7fb83f350b4a1ac4fb8f07b78ebb47414fa34af5a7cc622046901dd3edb1736ea24baca6a43a4d11916b7788e9e3dd8e8ffc6ae91207f6892e8b858693f8123b6f197a9452ede015db810a69c6f5ddb588c3011d3a378b38dc45274afdc7d37ce6d7dc4691f04abc657031fe1ad95b226c98b4facb36995c96493f67549b1d51fa8188d1ab584dc453647e313c6ca93ee4a55bf657acc40acff8f08d8f94529f31ae88bca547a4b7897082d542e83cec4878122aab06b92fcc44e22ab4aee62eaec7ccd2c2515a2d24dd620b8c4fd533ff91c33f2f9997fd9a85591861005fed15e18c089a51cae810ae19d4de54319def3c6fefc6bcf321a04a17197fcbca8480980991d150816d05143a210a392508e39616068a6ef2c55c29bfaf50c880183ccb23813b8b37471511dc4eeb731c4fad0822768cab50131d5930e90587ec8b5d10d11e7e4ab853851063a418564f6eb031994deb900bcc5541b4e03fef6c8c9585abe3213c5a970fdd12b313dbef2ed98462ff39aad3de099318f3c1977eebceb93e49c7e967d358c84fb649e38addba7948e4557cb3321678f9a5a3f1faa2ee557f5e5589100982fd4c400990628852ab9940192b0e23196edc12a0805a5dfd6edb03cf32066619a43710199f56e52114b7e17c4008df5a6caf13d8b74264e414f825c64e056cd0d04e44a3125eee9cccc7c04e8c187190922dfb7f4aa20aa2b0d3f8de069d0dff78b429d879ab648b68438c6292674ab43de38046ac916ef1105742bec5961597a7a31d04f8e77da303dba9a3caf272bed54e094becaf1021957b52d7368f2ea066cfae6a7846dd83d009e5f94473d47296e8d31f54e152fc42d60d9817959f75a7ba71ea1cc0d2d730aa2c034745a3a512eefc31255a9bd7928e45ff99a3131c182df8ceb2cb061398ed3d6be1338ec28d23ec504de8432453f9b8e4201302ed4fbacece54017c5675ea6d01feb4ac457ed31cac39e997a74078ad3d2988c3d105434e3f3f3ffbf29dfdbfc45f73a63eaa122ffc50858addc59964c564776144773308fe740721bd9ff2e8279cd7fc5d887853d78644d7bac8fcde2a0b5e30d69ad7d20af6d18629dbc0dbb3fe474496217c234edeba3a02e84f5bae7510ac1b6ff26c958dc3629dec2697d5ed85a041573aa31a68ea2d2cb4c7f143bb69a0acfbc3841e50a1e46b0131d47799ec71ba999f26bd21620472db62e8ec1530f9b9a9e44a055717eb412288beef5f50613613edb38392615d2e2821b88d1b8aacac5a176e8b43b70acbcccf4e6df6d9e3d703979b29422153a1059a14355055ac0d26ac652e84015e01c65c4834e3bcc790b438882484ea82aa55678fee87ba388c9caed566a2c296f5fbe692cc4df103d8269c09acda9c82926a253d72931fdbfb0b42f416a39eba5a1a83a8c851c8dda4959cd64d8a19b554b4148e1143ee1188274b2dfc5143390aa2088505382df54743c7c305c9c7f5c4fdf12cee2b834f6f45b1b07904d4593f9c86206427702a56f7deee69ef0d5f3f3cd6c0a64b8e80f618a2928234a3169ddc5f4c891d1f8142f942fcf608481dc0e46ac43e42f81128037baf5476f1f456ac2545e57f040a447c611c9a927da1c36323bc62b328b053e9e40810417c0621e56faed65bd7c9de42b825e151cb30b243414740f259dc6038d3ad1fb4d95c9302c4b7935edcbe2370d8e27dae84a54079f2b37a6b98281aeebebef5ce5a5c04c237d9a07a0cabd5578aa7205b415a01d6c3e90a40d2447358a16fffc14a4156aea8dabf7295305095ab025a1329ff43eecc0c7641df5957b5c05f318db0a545e6474d024ea0c058665e706603299a140aa6220ea52410010f10e7dd913ee81a78d915bfcf07d3278122f5e0c9ae3659f41f7df3967e005279c3bc8b06f2dc73458ed045dfb57e0a7c295a013df4bfa782a0d1f40fa3461d91643070ef7f6f06e584dffc5cf58b15f8441dc54ce7e7b7b8844a6465c51ffd37460a2e8a578c952ee4163484e3d060d3167ac657e98117d3132268aaddc0c8982b3f214d265e1870fcaa11b0af0113903bedd7f8848171275c7d32aeef5cfe631b3f0ceeeca8f19e83e1839109a96a5fedb307d5be1497d7a62b92e14b1ffbd8875015b3102fb83abbae86de9f647b08812e8a1e2b1e2cebc91b1318d574a39b101ea17d3deac48dd5fd0b5c022b9f13ece802795d74769a6da88fe7f174473f99e8bb0ec269470a88a69007559f529994cade9505c2631e351a99341dd9f1d1575871e43da545ecc767da0f272f359ca59222c5ba4945ce2bf1c57897cf67d649c14df0181feba6ed45cee117811812ffcac37231723abe6fc4d71e082886afdee3f06bad35efe73fb5cbf6be631f210416b45ae7163a03e4574c1dc368035c1380cb84f3a0adec401c6b5411e73af4c5465f05464fae05bf3ddf4fb1cdfe1d918ca053788648d30628dd071a6996080fce364c1fc53074c7d77b15ee0aaf50340a85c048a3b57c5ba07471c389db58ddde4858baa69ce229f31de121608e5e2b19af9f0059001c4b290d6c0be9cde7966882598cc5615d4b1974ca9d77f3dba3ccec9481d962c9522678a527e430ba7b850f6a399d3711a561e16f756e24f502af47d537a7aab56b2929e2588fcdc68cff9e740400593c9cabbbcee707ccd5b673821d410758e24b2c8fead9f213f3f66647547d230d4b0d46b00f1826b57c14dae220a0b0383cb09702e6f0421b44b800ce4cb99d52bf08abaf1d2b90feea8be01cb8d57d6143627b0122db4e4453810dfb0768605a35927d01cbd269cec09450cd54382374519f60131862aae38161b480afa4098941fe06352059eb2fad7d7f92472f5209407f29967762f8a7398b662f2a07308362448ac6ecccf7fed231670038ec9e1caa29f78fa60a37fda56d05fca97b02c782572b651b9d945cb9fed2bbcdbd6a6b27db5f8a0e4e5e246d10d405d04e76c28af32ba53beea7307e9d799fb35ffaea224b11c9bacec44f6cd676a62ca96e5b62aa947f4f84bcfbd7e29d35821da6e92aab73d4dbff8591c9d5987ec7906dc0be0ee7984a56f9b1cea86a3561ea307d49700bc76bb9feea0cf0ed24d54e2dbed5994ebed0aacbd43573c674bea0654ebbf4ec4cbcd8811620d6cc23025be89f965c48fa794cea5d6b4017ac718c821b5f77ef88c623bc90cd788115529a2aea3915257ad6e9f61bb69a1e272460aab6ba432664889e06a079c69df0fb7682082c329405534e088bd9003a4325d41df2f469dadddf54236ecf2446697901394823861322ae3c22fa838957a468d150303510a0d920fb5a756b904de073992942a6169a787a71d6079e761ed1c0207d42e8af2291ed38192159faab763662337225eff40bead88629f25de7f122917b660562776ab8188235446d40ede6c2591c55fa62cdd9bc5a5f8c42e501388948ef342e999a948824f7eca96c9bfa62761a4844be8f44c21de0676dd451f16c4e1d167926b6212a0d23685d6509442ebb1d45dcf177074ad32010293c91670ac894247da7af957c432072b4eb4db1995627b068d299e974dce8ce2f57100291dd39d4726202915a55c199e80ca443205221d79b4a3887049995a151e9f9dab3a98535e9ac9f602038bcb93d6fba2e433d51fbf8132cf8b158acc91619142f92ce33b3df431486a45359d7592e09198b6060294a5474a6b8e3f428b024887c1205ecbc60a9f0cc0a17aa7cb96bcaeb04d85c23b7e03c19b3b870c83ae7a2f1c15c0033f8346531423ba378592785bd5940ec93d75d4e712b0950e7fcfe7ece14efb90781e07c9244b2269188c527691de70452731204786ece486f4edc5b0346185914f8d1229cb31615a0233ed940c9191ed61052f7e29cb4aa54facf1b5ee264524d612925cde0cdf41bbb4fac69cad4424f100baf5127178c2dee431d01d1417602cf28804e7ad30edb3ba6046a18cf60058d12f2bda9a3dc1dee61734d7528669506f9cc68527652c75425ad17c7824e9ad6d39949e9de2590bd5fac725f42dda7888ad81fa81b5b554ba807b773f6f5a2b46cb311b01797b742d39942dfabdfad5d0540a1d31cc032e768b46276d27e955621704ba87c2a63660c9c6a566a1696fb7cd5cd00b3b3450f038bd45832981001013c2de49309ed6902346d7638f6881f5cdea954a092210ef5e519839b0b52dbc3b019d4dcb8ba08afa65b909dff738c991170544eff093a51a3c7c165207a1c5ba0f22ad922082857d54c282eab8b2240a4d982de1705d7e21d983ea8932021ce540f3bb84392dfd83180f60a9fce347f8380c27c501b64552a42ec8364dc85259954a048d02da6ef7a830cc2d76d870282e5bee2d09754732e0daa1ab44230bb390f68a486a0e079f72c13c099a8614602a04ae8d022d4d9a252fc732767cacf42bd835f73305e74c6e52e4171775c03d83dc37cde9ed537c331d816f81f4bba25dbe44c102640d6db1c554787187c76e55efb98ef3f75525955eba8eae2e1fcb456133e0be5b9cdce0e9721d6052f2c9bc715b7b216501708f3d9359ff2892bdf5b90a2b827363d19808c8a162b0509c0c860e5e37b739ddf2c8483bc1d3b057071bfe7f083db4595d8ef0175727e236173a21af9629874e020122b4a50ea3c656eeba9c7925e04c295decc43f2e1dec46933df1e33d2a71345906f8874c35aefbc58ef2b1c511598b9fcaede30f43284ec5f3a9749dee5ff483ade21b0d28ad91f20a6ed543b2cf394978a4206f48a7413438a16333fbc55d3287831c14e1091bd5558529c093eb49f2cce1c18e273d412095e8f3684bcef29ed8a3c6153c7ce0c2c8eab5708caa4dfed30b7fe0d323d0d8203f38753af28f8672972ac1b3038f7402a46af22c038aa0f9887d10ee60cb33b8bd445c442f1c52a50672a6d1d6737747962881fe3296684744ff1790143ea4452e54514c231194222a476741018342d603d4b6a9f72370e984d951c7e98d53ff515f633402da4fbb41b084241840657775a650154b5a11c0c08cfad58d2c690770402c9f3d90fe1a30c80d48658017def77c43d27a2961313e9a6447402ff8bace77af2ca43596f1218b75a5b86c63bee1b1f29fe4936097dc5a4de16e29253c612858a3e8a7eee2ceb9f5ae0013ba9988f14e5cac068950c6a22bae9963687b707ad0d4e6776acd7c67a9be9c9994e85ccfdb4460f7866b0663919125ce2e59c5da57555b4bff04374f4ca0c2b30f4b08a89ce8ba88b8ba63e85eb113746e2ca46fe0747208dd20a74a07831a1ad94924c13f3d070929beb2b41f3991cb19fd2a728855010055399322b5a403aa3b0c0ac1174a96ae89aed96cb41ffc31b9ef5c8a0915bb17e2dad03951155ec9e557935c8ea043db8c5c9931ab7eb656c9583041994d071025efc9db9cf327b3219ac07f51b4098a13c8dfae340fc52c6a0a7d02adcf848b46004df48b3566c99ca8637f01d9dea726d1d1440e73adf38890ac62e71984e4559ce4b475b0eb509cfc172059ed5d41e0466e3946b0d61d38a582ca36fa150192ba27ebf014cdd2eac6005ab0f294a683206080104a90938b3e427da6d6b4c5dd83248e1289734631e3d2606393c1a450957175b86c4186eee4a2e74bebb4f4d4d8124eb18e8b3bfd8d288ca34239fdcfcde1a45daf8054db866c8546a0ebeb598c076d881dcff194559a8485eed59946046765b8ca2374fa69acf6143e3746544627c4fa9ca60b6a9e1e03428bd1892c4e156df3e2de64031be57926e890147412978550ab54216b12aed0fce3f8284978ee0da8295cfefb133accf91e1061d9887775da6c0e2fc9770a418a93ad2bcb92b19787b76d9bce806c61bb3364087e3c493fae3647ba74e9c29c163ab7a41f4a6f0e69d6e84feeb60c577b01fd462252860fad9855131b6566baac3ce118bbb98add7f7840bb3094187cdb15170187b47ae5f1e2bf6f533923dde62bd852f707b513c60452bcb060c854a0fe7877e7a583a875521a1282e4df448b241a5c511cb6a4cc5137e1789f95a88d4fd46151fa8d0c6a35d29cad1721019e5d490f7389891722de6c4c725e0935f2b007048da88a5778caf0a60f393b77db243af30a53a0409dff9213489b7d340b8daef868d8c7b6540ca3674abdfa706cd82a0c55547280be6de0ba21fd5eea1510e054fec626e2097e4f08e00891d4d1b69c57f5d47c8adbdc97ef24712a2e5c38e958f6453006f3967e724e307062107f6b96ad0766e9d4e2d9c626d0a4138ca26e9b05902b5f66aad737d96e1178763b4c149d29c28e91d43801244f1ea6de48d764c4644ca8ad80ff0ad5a36f5bf3cbd04e3df981a43953bac60fb7302c8754acb34c4d24d24a39718c8835a0b92d23f4eb207eff06f4457c9005d1f6985c1bc4b23f1ad43af0b0921d9a2996770da3e966fe65d8815521e27a70b7b38acdc58676e23f220cb538ff2cd04e8412931609d7bb085a2a08f9dbdaefa87c1e314dc220a8e3affc9e3892384882a0c5b77439f87496b4ef222015f905bd8077612a7d8c83bec933801cbbd35a9816bceaaa522d5fb553735255b3a2f5faf542aeb8a184c38a143bc5de9957de4f92a5ab9c097061bd3ae3cada2692915478866e90831597821fdafca7e314a162abab7db911cc8c659afc547f2813ecf448880b91dc1f56ebc5b2a26a46c5e15037df484118582f9d0df163857e26d30417e6f67eb965eba5528d6154eafe3f355a2a849f89c3d70cefd3140573cc686a65f6a79576642b10b21746f929a60ab6062ca15818f5248557b91d3b24e6c7ad97890c7f031b19307e4ef64135e85b19c308e1566e01d098831f222401590ce088bedb83ad2a72eaa7d463451f616c08a5a45265984c8f44e84bcc330b71bf0b66e7dad0d7c1e6807056bd0d555ff8b148535ed0549dcac0b413c13738a6eaefa3610cd4b7c6f788395a4e079badbf2dd24444c06336927da4218c3cdde85bf51628f12de1e6f3ef8296562521d33e2061c59e187a31fdb450114b9c0f80e420e060c4dbf20601f0cd8a2b34f41c6831dfce5aa690f0eb068554ae4b4408f4d851b1b9213fdf026bd9002da984b9d8753d911e41b7819c0dd1ece2730d7565333c8a4dbce18ab77e590f101e8d3aee9cb871d1c54f8e810b8d947d02dabc59c5eb0616d7163f711047ee5f9f8db53865ad96e82cf5dc4b4fd4a3e2c6ca42393c1feca0c7869aa6a19f1a195fb6247a17829dd70a03f066c869582c0015cc53622e3ed53ef104516ec6b8bbe2c63afdb19fab149a7c5beadd8601adc865b38f96143771ef56d385ee1f062ecdb9cf8d7756c126ec491ee38d33024a80473c439e1bca9be47ad5cdc7294568f77071ac7686129724de9e847024bcce9edda35baec8eb97b97ea3935091f036944fe8988d6979f5eefd849d646572df8139b1bc71c8ddc748201b9fe403c4899ce3f95df8aee872e6e219cd62bb096183fce4abd3aa4292c70c371a3b2f44431a16cbc29940dc7b31660aff478e27d79d43b75b0bca74bddddb87a6b4f87e07ab22a27716bc40172f1d1041bb5474bcdbf7f985c6c7ee93413cae1d52fc893f4263cb93dd1757bf083307d3960202e74e604553aebe3887ab2abeda776537b18e6cf9e1da0ee90c9c119b08ad888571dd0518cc04a5fdbe3f13070013f09949b9cd8b503b3e9d4425465a1c0394bf5014abea625e80d8e7ff51c284f6e91d8a09191eaf8afe265ee3cd26ca4001b749902f882873ebe726c973d8691fe43cd52560ecf1381b62e1f946d689dac2f7d55a5273a4e168da8f107163ab5b49e1eeeccec46ed812acb70d1c37ce224896078a7a1fb3f7a831ea503dcd6915462c11588241bc62047441a0234200b0a5f8a87c1e09c2f21829f13ee6c8183cf164418cecbc2e7aee6715b6995645bf9bf920ebd567ec1f0b57eefb4d0ef95d0a1a2211a5484ed278ebc19b6f511e1859b645e0cf1b3fd0810f6fb8f3ebdcb925ea3fbf7eebdb02ce48f2cb80a8659f550f0cb7b5ce422ae650e274dba1dac3fced9854a957cc51f8cfe152da58048b99091d9f5539bd81b68e82de29aad8bd85260ce7b76586c573adedc77c4dc9c639f9a6a81e520f8c33772857d13cd1fbb0f782708a76b5ae7ea3a02d1c607836640cb8457545ceb4a9fac745057a4ee12556329816b3fc97c9c8176caedfb01be52eebcff14b4ea6aeb36a5c665b064d1c5302e2b76657f32ae0f31008e45ccbc09c4931e060de24c6ce30651e45598660e405dd9760fd9b5c9d1cd8f2b09e8f4f26bc2078ce27a46a4f278ad9a94c5e76290369f07f843130b19ec2b32011d8302b90c6a6588b3b60cf8ff694381a0b472d19e57130641191f0047d3dfd0d00c9a4dddcb9532d76d22d59a18d74d65fd21820f1c883c06d6654f3dac198a9875a5d42fddc2a4072bfc98181a00bba5d9574fa6a37618191d5884c14d5ff1e999e54f6759b8d1b01c0fb23239da356fb587448449fc90ed0284220f4b58900b6ee2a7c1b4caeaff980ccb334871ad0e9110b4de23233aa24a0f071215985105af4a431563fbce53817fa6a4dd39b1749a97de50550529e30cc713a52e84834604c217f00f23b4973ab9206deb16469974435183c3026b8ec9861bb5d0c9ac304a97f4f4d96e84192d30d4c01409d1f81e6013134fc45f077348e32e5fa792e64123b63b4f4932408f415d743b12c4bfd1b1ef61f97fa10c310a7595c9f30afaf1aae2480b4e83cfd57762c0222ec878f935490d6d797d1e3549068f5f78abce74fcab81b8f6378976e2815adebed20a07c4e6e97551f81f891dc8f4a3681beea06d3807ae92677370547314bdf9b1a27960ef07063ed101f5e6ec8b6e1edf49bf79f57860ed1fd1244a097158c9f735fe33511c3708479f89246f7307023a8f221fca5d70ce41fdb934e5ac6240e82940a63429d6c674b4ba48ac57449f9391f80ea6a1e646bb86526dcdf007c7c739e9a9641b610b3d8077e124112ec2abbd76b2df4e4af820bfa70899ce1cd62331afc629727eb4457826173982a2666cb756600265034140fa3240ccbc6b90fe6e92db9f8c3e26644d0269fab16507521a3e9e5491319cbe7df68c1c1c1f65585c4181306a3cbdceb582f7ae6c9643124bff93e225187386a33081456994197358093bf4725d68e8657b4c64d3d1f42b4aaf4dc02ab19a8b79506ba96094ec4e5edf03324f1c43d9a6a69f32c9e94074afcec8964c2c8c3dd89184d15d627075bc29c703f68967536267bb9285275b9d5906798545091b5a1946363685c3e5470fb788ba1c1afc852d1080ed3d0dff93aeb38b4da4e40c990b10643d921fda60e40173a631388c591e9e3eaf7e11d109278b1da36496609c44c75d1fe5b51073b984e17c252cb6aef322a2500e0c588110827772baf26d2a42b0e6ff6a477d3bcbee330ef0e0fe16f8fdaeaf35ec81a8072eb3e12cac3c9805bd651fabed757c74c5feb0bb894998fa00b1562555c957ecbee4dac4bfd8d044f4ac9071c51f8befae34d1ef66eb8e268c206a406e3e73416d98c6df4d885f3b96ec827b96a3198608647f6dac0bc4a50654375b5d9033920109587a565024174110c63dfd70e6b5323ab8560e38cc1d34d588dd74868101067e578cbb61c09687172d314cebb8b8646dedf2c94fcfb51e7cec72cc08f9b98c5cbefdcb2719b27f8a2bf088e0c787f685a418fd7e9c8bd180458be39ee23af45f93e18aa65f674af0ab8509f18aba9a8737df32595501bff3534c3215ded5980347ea005d9970a9bd3f74025fdcd59692ec92a9b722e5bd920bb24eae813cc29ec73d0a85757a35a143b2625163a5321b6772f985e590cc0dfe14d5e779b80f0021497cc0e5e3603487f488b9bc82bca719aba94763b51933ec9a63803b9d78d1f48b43bee1572e0119de927056cf61a9dc4b79569d356152839ccd70b6a07d347dc856820a4f3ac13a16401ca1005b3c10b860e73ee15efdafd062f2bca07286e33ee26d04ba7594b55316d78bbb21dfbfdf2b5ab630c96040fbdfc337a41c94d7e63e7cd23b68bc536abf38cdc404908f58a14197083352160943ccd9dd92e79c0df9ec909fc83fb2e410f61fdfcd5663807328f19680c600a559a9484be8a43f8cfeee5c00cc045d38615c0d33ffdd52c862fa517ad8527af79bc99b64e8e27a9c0b87facf608537ee683286f10ba21a7d3c95762ca0203ef50b0bac7408f15d4988787ed498afef79f8d9231700922c1d541ec4e908b32bddc65a13cb8d9c6871a5a7e601a2037330814bf83bddfb2b02b0433596cb1888307d479ffd3999dba558ecb400acecc4ccd169715b984701811ba53a5ce6b4f102db471ff0633df561f3b2072ca028c2ad0e19d6e35dc25b54b433aad418909a8d3c2e166830454105e50097dadb75735d36228b32aba7ba2b1026cbcf074c5d2d993a533f4a3a6e15704e6cd7cec5c5403e88a64ed0d5a828aa61abca2cc4b1d81ad6613fb199f1ba22c8de744244383865a429ad418701b976646c527b6e17b539765608382597f003abcaca35c00b646220314c48ec6d6e4afa5f9a1e295eb456eba3a6d42483d5528b3df802eb07d540a8a2c085d85e74c61eaecec3831a5d2cbe84800713d8107141bf49548e82ca99683f10ea77889e1dd34eff027097ac7469d825c8e773e0025897ab49c6eba8cb1e3b82c8c2d48e70bc45a91b89eece59289692511fb39af80c4207caa64d39b5cb78b700e0026d79a0ee295123e76b42c15d2009f7d9cf7297caa557bf4cd36d3479ae64cbce879e97d8159ecb5fb3d954e4654595f0a5b889c035a8ec7ec514cdc91121b7322e9776bb6e522a40ae74e8acaa85d36a48363c77bb66360808559a226fb103553b44cc8a188aa45ec51d3e8ea3ca9808f9ded722f336826db0c5eaca9275f73787daac109dcbd80238f19000d26d0fd617381d5f5815af2877fcbdfd3212bb33a08be94f4ac59911143ca621454fbc98da9189caf506971c86fb5c9defc5e1c1f1297a08a85d14526685c19bf879e320a874f36f8430bac7cea69b777a08f97b19ba33697d9583b7900a35f5a9a5a2edc678bc2802d24591383531de2395e73d8e2771a17892f2be908467a171be2905d96e21a0963a53c34f02449b19d6a8957f2b7d842327c0b1700b6c81acee7cd3b8c297904f9913a2f5b3b77fcace3508101dabfccaebef5bd5616b1fbbb84180bd97a3fba3a867921cf67e3dcc3a05ffe1fe244159c0ae43d02478d905389c7f580a1e434ae7bb8bc69997b107bd9ca51a7f6931d25c5ba4eef84563ef3e0a1cdd9b2b3893a69fb31bab83df498fab119db758e77945d40dc9e48c187b994f222aeeafcbd4fde7c2738eebcb0bbe4e24bbe2f18decc53f773d0f0cba015175e5773270e2cf1ec6f001199168fab0224dc9e1d9cdda67ff9828e1ff0be21d7820bf01c4df023709fafb06849d32b1382eac47c6a4f64bcdda56c07ac257d2066d535489a4c7fc2f38c7fb2216b672472474b7ab63b2c16eb58623ebf44e03edf105fdd877a09df7ff0b329521903807fee5bf300d2c09e8b39b3c42104ca5ead0b752cd3c5573871a9abf844f4d704441fe1d9147bf3a29d3e9f4260e3bc43c9e0d48122ca80d13c6c5eec40e4a4b56b11bd8fe1f1ac717911f1941496fe8a631a45a39dab2b83451967a96e59ada704835dd91091a51a446ac6aaaf6c7d2cdac2fa8254f7d1aba331fe5b40f2cd948bc1f0f1bb2345e9f13ec80187bef04b01ce6db68b0fd06f2f9259645d40686fc98237b1f8ead2c0dc2f38a9d22424eb61c5fe43d6790f96b0bc3ecd07f93e11a203d90b3c81e0eba7fc90e2792740cf750402d16a3a2b5c098184113efd0a870653d461e993060181f88f8ef60d93c04f01f66150b90d5df368db187a2c8182cc63d1fda6744e30ae6011a6b569969262367d43d4b8f19ecfabfceba0d93ddce0924f978f8fd45abe26d0b64e1d5af97527ae7f13e30c81eee8e868f134cd76f1f66806cd67cea61bc30cac2d3ba1bc33ba224f5f1a82df1460cf92877795015503c7f9a5f313404cc7e8912b3bfd9b98307eb14566eed05a3a38b9cf4853f8177a736ff72cfd22ece5e54b9174dec4a0b056c6e56213d5ce8f1e7eb8b44228eb1a8626458140711b0f5f9575dae22b21968b4e27693855818735cbe91cc9a4c215f98d22dbc6b0986eab9d61a4569a1df5d1ee8bd303e9df43d297b3937dfd6a55f3f7a545c111f209c1e06db2efab9b9ceb7b764a845bf72ef31e06d5a4a774362bc43eee6071ec9c879483ee867b996943203f555eb284052ba94d979d2d01ca7821ea6f29b6187db752ad66b19815c380dceab1827b74e3bed401384fe6799129537fc5193dfcee405b6453ed64c4b21a84864e8ec1a95596ef21ad25f772c4b5a9efcb9fd64a91f924737e2203e721e966933968b73337a99c91ef43908a123ba2964abffb66b18d9dd489010faac0251abbb5477c3862b07f87c8b9b792dede837388bd20e11cfdf1c9ea74e2c5016411f9e5721a0fa6cb11e208a79500d40b2dd269fa45264671d4030e0c0ff536cdcc7ac7db60145213538ec10aa3740f17deb392acae8e37030add0150c5a08464e69c244144561cf9811996e8cde52c4f38de6432f7a2641996998b8627487065d80d286e8c072808bd7dbbc6eeaee6b64ff3235fa7c2056e0df1fa11f797fff3c66b40c49f7c14d104572731f4c7046840f8a6237cf62af6c2f1b72a27639e0cc24c749c85035876e7db01e6f3dd1b1ba341a77e531ffb75c37c6ad51a71da626704869d5a51da6e5ac24ba3baef4eb0ba7e34ce95b350fd38e76880b37b3e396111d2d5d2f1b97ea91dab01cb4f0a7501b7a9134632ede9ea664e34e9d86352c175066fac335671627cd2b4b9572a6575ea96f501e5c3bb5b4e6a6965e937aa5ecdaab47c7034ab74a6b5e4a5daf9b8da3f45a5748be1483ae8b68dc8a6a168a9beff7ad66dce922ed1a1cc73a8a9e3ebb0e0f85bf4377f9b56bbd9d69f4cd8c23e57a5007268e94d2529fc7e03e7a989372bd2c1501169c7af2a7970d7ea0a4061f6c306417baa25be74c8d30168ed1b19961b9214bc75174e1c52cf428188eecd370eae5c4865f0e5c535a4562c3b439b8cae98d722e7dda741c297d49fcc25e4277d4a518fcc25a2e58dde648bd752e360dce94be8098302d1407d261c2ecbb50763bffe9b5c8f24fe74ae6bab8f477651f37913dd7b2a089e1468fe9d1bf52233873e2e92d9708968f99a9b4e68fa85272daeb95df8d5c3fe72e18bee02a1973fa5df7cd38db15a260b4d7066b1b4577e4e02c175dcc4f471b05e167e348b9da1d2bdc29704a69758d15a6edacf8b95f917b6b8c33e5c29728852806ec9684d93b52e63ebfeb7d046602fa905c092ce635e1a0ef161600bba63db52fdfc415ded605e5845e54fdae635971a3b476458375022014fc3812c595919a5752b2745c29f75e74c2da03ca94860b9d30d87f8168550a201eee03040d03ac7ca2bdadb32efb1df74dd5c1360d8eb99b60f04b7229a52df50806ef058794862e7941415e2eee969a02c310ede0f7b98301934928b832674d490ee5d52a2eb1734cc2a9f8e5a81685e19e2a442f58066699eac3dda7f3938b4035ab2e38d3ae67fa6d3cda4dc767029970867dc6276865c8149947da1369a1fdce17497a951269dccb53ce501c67c765deb67830f06a249235c6dd1f73c612fba7eb35d02c8d9f90ac655e86eac26ca48df56243a53fb580526e273de4892ec431f298413af3f64a8405c0c357842f10bcae621472a932602b2f83941e27683d53eefc1492d98136b11ec16cd5ee46a96bc83bee5128da27744ad3c5c87d78a21150ec48074be1b1fe45c9435405058f1212344a9ce257a3cefab7c10a5a95b35e0ecb13cdc2dabeba7ccef4e57b4a28e35b9b1c59fb884fd4b7344b8c207553d2c823c8b8581212ff239c274dc82cbd5342009ac7729e1411df8ea7381f3d9b56c6d137c94fd229b2b89904ad37dd70d6a2cb4f61476c1e1f20663bf946ddd870e74c6c7185222d9a8878f06ff5ac824f8df1920b86bf1acd1ca1645dabaf1ca564e4ac382bd01ce59a97b376c1ab32ab6005a0b53dfbff26850e1d356065ec0d25e1b9ed39206edd76e06f6f0ef24b3a0271ae478a323573416a08a9ba9786417b182afd5fd32eacc5e5e5f55656814166fab1eb5ea9776bc446aa4c5ad950f78d59f9e72fbc961e8cf9e833c0c1e946712943fb8d6332d4bba9f08ce60ad8674ea3e2f7a8c5b232d4a3f0da5746a93cf82ba5c1867a5ca4f30599adc02c4b0e75c0602aed6cb5963cc57e794eb57d3b7c02afcba56190854eea8912c1ea55f14f70d8f6d956593634c6bc77978183252e4c8995e5bb36f0c37102db6455cd5801c79fee8fe02c0d427bcb42977dfd05727e19f480c30f27fc338c0efa07c7b4687229ed14b5dfe192e3b127bfadf3a7e6b31fcde2e606cc4437b6be1ff9a7491e6121c91f6079d2e5a276e13f507e8db0d292bc16d84758527ea81eec8016f8da288aa2e9d7b81af03a7401195c9d4a84288e23342e468ae27e00f1f233e83c17f94aa3b50ab0b82110742ecb3f94f7d1a6a89dd6aac217ae584831e373ff9b97cf010a4a1c48cdf41c2b2c389b8260c73d3a7635561b0767b1e31f5f0846b463c57a494aee9573816af2de6b00990d10625d5387e3f11a3a064e7e68b871c17871d57a5d037d4b6d18afd1209afd426c83cac9367383d6b149eebed5ac474ba079670ffa8a4e55cad8d4ed1823d0cc4cc6d99cddf5a7659a17fdb2505dc6096fa8c9e2d9fd910e705e2c06bf73e21cc9ff658ed6b00ffdf32b8bf25d7098761017aa8ba828434ca9c60e375bc7526744d84b8f014d1b9cd0de762527828106d9a343d2bafd38724da34421e3e197a9a079375eef1b175be45c7cda14b7cff6fe81a72eb603e3735681cacd76f16ac457e42db550617b6213a5a3494573f850dacf02581f847dbc6a719e8bbfba18716b1b1d772d645c68afd88974a25422277a897b143e420ca6c80b051ab2adc5d47bba5047d56b9942bc050952239a18151f874a024143ad536dd108f350225f6406376e61bfd465c50f0ac2c8d78e8afca6f480993e38521b5cdb7875c0eb72ffaf1dd9028d8382722a9cd1b2689891af624681ab76d66e754334c60971b948af008af7c08f1bd948264cfc2fd9677c444e37e18938bdf0e4a64be92c17a5ee8d4811bfc25d58af867388670d9d6b9e029c0a7a84d0efc7843e4fbf212906477bfecf2338d359cc307bdb87ae0908414b345b8ca543a66f2bc4acad3f93d92728b05d0a04f9da48f231c82d23297fe6b14c1f80e36f8c0bbd224192f9e3e0d1708c6008599c17427219a7a79f3ffe14ab5c008cd60ffa390313e0c8a3bdf5beb32ae8116076dd4f5821b3484010394eb9840438d0e0f43be9d54d6250f234beb94def3c40570ad28f321e0c3d661e0bef41f1fd072a09ddd4e9240e3bb4cc4ef64f32cc291800b849ff47c7e014aaa74a964ed1576045aa6efea77087c1a6556ef1cfd5e209e44878864926a727a9357b564cf263ec8679a9dc9364450d6c975b314474095e320cb65cc6e50b0618086d3c21b670f3747ab72b03c721806ab0058fe4e1c17a1f6da57ef3c9a4736a016e814f70c1a24b9dde97a342b4d11d7b25e238ccff7bed65cc6bab42f575364463e776c6cdf87538818ae9d1868849dbb1d603072e435233ba66bb8b434a92e3f8e1150cdfa3ae7f0bc29e36d15ada20eec357c32c5cd048e25055d748d6fd10157c3658f41e23d4d771a66cc50313eb1ff82abcdc1282c645a7eb2894f4c9797f9868395fe56e485f85fe4d228cf82114677252701f398a720070c48b9edc37ff8fbda1c178bd67f5464bcf9801dc40cc305ad1b6b37d747b2c5c18d1c87ded2f9750043e3e1bfba796595c1e9bd4e342bb3b0a79794d8c07820b629d68c58bba85a7c98f4e3ab08d52ae016f8703fe924a8e668404f0007ed8996bcd601f27380b7a3d4d4988dadaebdc136eee3bc68dc6db5c39f950456fc6f508b62e9a36197447ecfd707a97bed86a4efcacfcbe54c4cba09ed9157c77fbb2e6993c6533f83f3d2104e85c786b6f75b63404625c84996ee301c1194d5145c1a0f1ca8e00a17582c315d89ff6b4b227005f441360059cd8bb62517e7a2851e7c15131448d808e0867ec60613ea738e5927e51e4901edb05f7d57acbe1a2c44bac297b1cee91077ae1db5b84cf1e125392d6ede32ebbf6fb6fd7aca761ee79d97e65762d5a224901b3441759004b873d9547270efff35e218318e7426b4f7802941365e43d5ca68d0b053aab3c2450b96a86cb3cacae0baf9de2dd7b97324e69848cf648b772c2e772be6359816ae55058b5f1818d48967f704505928c1c58c2949b9a3ab020a84b78dcfe05432e1b75ef5fa93242047ddd376fcd8d6247d5845e66a72a3fa284e6d972efa573123263ea70c091c8541603d11e22bb46f6596f898ee3e4fa94e135e3ae226e0324861ede129e6f40e047c852b1ec609021ee6bbfcb9a843c772b6894d24613d550907fb36f93dceec5a58444e49024c428cae37494774cfbec49b937191d025c16e7d1d85c2f88677e6a64c993522b1591df46631eac8278d9aa31ef170db4ef970883eed55f0ae50bea40362e6dfb8179eebbbe2fcc2ca2443e33f32038fde735454defb168342029f03e6d0c285f799a7dc5c610c471e784ed40763858dd6922a879bfdc48761aa7562e5ff07449435e4d9b234cf20bbd57c4742a96cd44de29b124ed1d4ee1f4c38d94177bd95476ea7286057b7fbde36958c0c3f89a3d6cf46202acd21a6bad1c9f123674bbf3ab8e857dc692461f4e5532691244f4dc1d2fe7a3f1b184d634c5bc409377413ed4397d27dd73efb6a42e9a821ab802900d1e7988d3533b2ba563ad3e4a5f9cecb5d8f8f8f273cbc9bc122a8036b3a61f2daf6ff48a8ff3d9cc59ec6ff171c34e81d4cc3c0ae3d4f137c1df007a79f32baa2322857d682d67134e0897fcb5b6dd98076c285c1be5c069ad831a994b9803c614e42ebe06cdbdc0fd55fd47f668e5eea90007b08721af47f9a5099cc261534e0fb9736879c027b96c7f04caf720fb603e6a043cd5270d5cce123fc419db24242545c5c1be416a5c304767405fe36df84440a3a4bfb28548a6b60fd6a46740ed5e497939b421e67fd0c63e204dace01a74368c55cb370d2d426b129b60ff134b77257104acdceb7edf8376d753b9c1b0964f0cd41a7cf28bd297e9d386f779d9548d81856c2201fbd07d1a45c5e2be42c9a640c046c765f754fc31bb2a38ddc9a590105f754dfd98ca1ee76fbc64c7a32398930b54fa5f7dca1a0944366a81932972b2f7fee7b7cba6759a9ba7ea050d32c8102fe83909ae496aa38dd54002b743981c3eabd05261c6673c80e1fe53c14b8cb448f3d8eabc789f2adbc869ed5b84ae870bf16b0ba491b145b5c391a6c98d2463d7278b3d12f93fb9422fd185006e66b213f535083f79c4fe187af011a20b0dbf7cc1be94a0213ab71be70c15e9e86343928002ca332aef4ee6974ccbb8092d75f770f4796d7f5b712c24a6292a24635e6530c2d35e764f0370b2c23d1b88763d9f2a3584cd869240be08999b02cf4f039a34148961e37c1f56e853964fc3cbcd34d94fec6c8d094e15444ef524c45eb449a3ae20c7fc6f71b0192b9f50bce122df6fd03d2a764903a93f203c7a94389829cf09e1d842cdd49f4fd44003e841375dbdd4d9b74f69bfc85207fbbe29a8d1457ae34ab75b33e786b381d9f80c482de0a4bc642dad4a6709f67ac99245d5fc1759d787491d9bcee2c0558e5c7666266764565492e165f07cfd6a80b829ba381ae4263e101ddf798433510123951ed27df3f6581a61303f3d9eaf13c15def610d73408e36d0666d6aee9500dc2d88a949c82ae5874b76d03e923c6263ea8e4773cc62d0299f81e429f04ddbc179f4f6d575ace2bc5d3bc3d99b0cc8e58691dc5af3e0cab0525a4bd420fef85d73387be448ee3fbb8739ba98517fe8caa84a84116744c0987b4ef9c972440f8cb4f05cba995b38402d9afb93325e0ef7f235918be618418daebbfe6372bfddde723440b84b4508e9802636e62d3172076b6b5deab5419ea6b38c0958879ed3f39774f31cd5c92e47b1f8c6dcb93e8ae66a8b40bad12a3a2d5638f99d3b5d18ed240a284d19d020d0950e33795263d43ebaa93d8dc33a1f6acfc9fd2ef6b306a8699f55c1155493eaa17c06d7bfd272f4966eea01b2f2b60efd8780129a40453395ecc8d92eef2d82a96d77b96bcb524f87c888c75b11f319073ded2637dd6581a6e7bc81f441872085ab29f96d61390eb789c00c948f70c97285f615e2ccdb481ba39a13ea74d1bd6bd336bf1aab18557f77209dde1303cb023f128a648259e59d39cc5e897734b8f4571844cd72507b4e3b269a14d122464677bbed591443800b7460ffc9ae9bedc9153fa596f73398bd6178b3529b658b942d3f5c780b115a502fdd330f2c16fa83b74a87f214fb1e1fe13a8cadbd592af88cae66f303a732366945cdceac29698481250be7dec1f8c4dd94cd9e6703f2a04fca6a5c891a6e2329b8eb870d5d52b982db191556921341fd304313816343fe194b38360d7a53d5670a7701fd9d52c54292f2b2361cab5eaa36ebe824aa488550522f1890b01367c4ad00d8cbea49e0a29362ebb030f5569fd1437c263a4d89feadc6323fcd452c298b14cf74fcc681e1e0ee852c63e286805ce27803d30629143dcc5c572101f7417a7f4a4e23dc0804230bce293fe01f1a4af65611f468c1206432196382e4cb65df6c14f6c7e9ccec81a8138ae52f7103e77fff7844c84cf7fce6947effd913e06ac89defe00cb08e2b015cfe0a9b9594dd9e15afce6aa27e370099a26f8421979df63c64cc2c07dcfd41a3554a66d8be7a909767403d4abe3f35a164d3b1770c80139653c16859bd38f673c5a66a97590c6e1ed83625eca66d46f16d10eb2521b9e8cfa138043237d632b32f13f93d2258da4cd928bb8b495d84097e646948ea95086659f4547273ac6276e5ee3760f53ff09a2903618de900aafd6138e4d12d2a09a72856e145459314a7bdcf9ff1217dc2c1d31f7b4cbf5d3e5253b9fbab9c791c9235567ac58255556fe10a95959ffa6c8b80c1d1b70c7040c5d00471fd1a002a50849b2864d8b2442dc75a899054ba28aeb3fec0d95f6be6292add779c422407d660b67bbf2d55b9c3524e1d63e53df41d03efb12507d0846ab99598e52fdc7697dd435bc3049bb2b91665749358ea1ec1a8ab6e69259cde24ef0e52f27e312b245a528edd8085366ce6a5cf9d7012c1a996b42e35f7701048354da10d194533cbd4e897234041aedf6865583aa7bac5eac4c687cc3c223528a942a40d78a93f98747fd784036b86c8a28e4a3f6e866201d8ca5e2cd59fd2e943527d8557f33ec1c201d3582a2cd51135ee0bb3e6819364942ccaa4e2403950d990382eb46d43003ed524a6881e2939e703a810021fc32631de6fd21ea0025514b1a8a25f30ba0684290104c0c881a28a193de873cb7a3a416d03de14ea9dcf951040fb5f8cd55ca18bb197a70996236cc2fe2700193e24ad0a232c700dfcc46fa4498263d023a6b45c1c10bba1d0b0cb54b82a53a14c98d79c9f8a4ab7e738e9908208e1c6b130bed6044631fa508f31d6f74d2d42b21183b568a91464511942531d200459323074b200e327f1a5b0e61fbebf35dff8ece0a88fb5d1d299b49f30ad8755fee9834999d92dbc36fbe62b9529460f440a4fab4364d77992e8b4e97fb0c486e78c53e59aa3d226aa53d1263e33e0918e3cc3ff730292740a6c7078ac81bd8a8574d4c169d029b16a418d6ca8a3bb04d6d8e27beb4d3aef092a53541511e74e30f9ff37208f982dd1026849095afb6ff09680768750e8357bc5dfd7b237c5328ceb6b10ccd3371751bab30ffbf1d33893f992e138fc5c0986e29001a4ffe0dfb1f2c7d784b37a6a081ec03a9b26eb7f6bb131d90b3ab65b82d913fe1c3fa34a3d99cd5a59320d922ab8fe32e41893d2896feac8114076b83384cb83c90a2e5fe67ccfd80177a0b6e8befc1026e90c028813e8378f863b29953a3f9c88d11611d2b93d350b029180127673136c89c17a1c5d0606d43309d46d4f0107a247346bd90d20fa8431ea8935309d0f63f5be4a4ec50534468575474acbc79cb4c80e6211fbbd3587f5ac6e66b402012432bc7c7cff7cd18b7c7678cafdf64fd36a9fc0735e4c599f9cd49e18a05432c5c9c4e302465f11db7946d259d9d4015f7b675bb566ff37e2c916e9d35f50a12c90d88cd3e9596c235653ff509e53dffe2936a30b3a15c53901ad4d18d8c607a2792c54c19ed3439aa44f3292e5ffa4473061d3d578e6079ab4b08f1ea82ec5ff17f378325b01839cfd644611afe8fb7eecc3e78edf985101a17317a198b45d21481ee029365c1daf416f776b71630207053d582abab22a154b83454beb1ed8219598364c787db6923ab99af0637b8d60b7501b67eedc16c0301392980e67711e6df3c160ebdffcb69e53753ae12bc97f74451b5836a1ee12b5a326b9bd3ffcbc22025988769510bd26355c3266eb8e57a3aeb7de252427679031f26416432006b249a96940fa2380cc598321dd32da9cae6dff543d6ce41f96ced671c68dfb3e2101631c9825857687b1e5a71c8c6fccd3b6852ad3023be705049085366d002fc1d8b0cf379dd27486e36f88b42d19d4f6029e4c9294885a04fe9b7106853504999c85444be18f6b2eaf03fd06166f9feb67a1db8c8fc594bd822fff579871f58af5cc0c168d48ac51ee6fa9ad7f44081d7638642ed1d2ce6cfe8dbecc3c739ba001d0d2bf6d330ce6a6938e14a7b644e8335a3cbdf80240026465754aa30c2d3bc63c9a85a8dfe6a0848542412c1ef2193e3baf1ec925d1855cc63e11a4a8606e184f70a4021cf01ba920be54df98652e9c15a7b40816d37f98739e91b4021f8a64ce8ff72d319764a04bf2814466a9644f563fac00942caadf46e251e6352c7bf2dfb09bac59306d0409f52428555b203d5361b9891130095c02c0ec527ea2330f8b0f51524843c463a0277b80ba882611d03500f4d485c3b482d04b06ddb0c878ebc39777e39eb9309f5fe666058d5143c554e58af5ec717e96cea4752f33055bbd981afecf09757903aff86b60e777ebcb473e3ef404452dab8e4778569df1f988f7e6fe9fd554d27a0b146cc0aead03f8461a38ffc634542ba2e7815f1a377f88b836682090a8aeb60d4acf2211bfc3e74ad67aa8ccdbe2b7a7c28f8513ac263d53b9b231385392040f257884135d61361d9d8bd6b6c19a5208c7b234d031565019178c268db3c02a27f1b14d660049d21a2418f4cd3715b014564ae63da4ccc96a5561ba35b217068c1ca03641d555640fb339f2ddb39a2b711a1130b4a87eb19bd3638a10b7edb9c8a0d76bc822a63bb086ee98df7de442b283cecde175801479dcff714689932b9bf2f553e664476a406c020eff85f72c6675f2931748a56a8634babd1778c8039f290ebdaa735bc340dcd22590787926d96f8a9df3d0ce7dd03b8833deb85ba13f52ca0d6cdc806b881de51207fb82ff5200df20c1219d02b89f22ec76bdf6594a2221f7118a464ccbf8971bceb739e54accb31bd0f73b529fbbee248eab0788eaa60af5c3b31f40ff42a16e275a44280bcbc605c279fb122236d6f6e8e94e6d2918f22c7b898d6f609a5f4ff3f9131b7273ab5fa8e1032836fadb61c325f36d7b1ead5088bc398d6ac4cde1eff0fffb49b85f8a13830489c7781ed4790741f7fef6c8264f2172161b456a9657c5a732a0a34bf2e8669b34286db6d8f042ae7086dada33e467badc8dd45d009784f888f1fe2d7b8b3839909d4e1921617bd72b74d22a52d00fd21ebcf1ca25c59f13edb2dcbd4ba90d8f9b5c203172167e0b3f94c4cc7c132c3080d2ec4909219e3711d97988d531f1007b73cd92eb8f1f7d1648417624404a88f4fe1564daebac7f1eac852ef89dd2f6456ab1cc81e2f0fee7015b3081df09a9de2432cb18280ead7f1e460b13fcbd92209407b69183f7fe41ead005e4c371db84bfcb0fb276248e7f3eb6df90ad32c536ddd0ab25e3516f153c882a405fab79f8e0b5576a96cc910f7c619654f249f60d44f97e52b2ddb1874c1d6a02916303c4e9aff8a14cfb62a71ce6f4a56ce18a127241c8eb377133b2b35a6e459a0ebbdc2e5f177fde76b586c3624cff57b54eb4625f686cce16249d58133d5b55743ce63b4c775975eaeef95c635124141b64255ff8c60fe23245a51364d918239438cbd7dc346b9dcb0bfc51388c221430a42dbe4c84f3d277f7b2bf83f0a20634bad0c1b8f5a45eb1db4009a5ee4c1f712cb84e39c052d5bd4541a412edb1816d11b314dcf4e332f7c72ac0c4d007b5cd243f06ab66c677098d0c2af87267e372718b8b3e1775a54e53d6fe626eecd6cf0fb77282096090cfac5e77df6f4b885c7d99ad5b81f838f116e0bde05c18b1a9d6933f74402e4cbcff9125630dafc958af3c9133ddb4524cac935fd3a42cd2574a37226d917cbdd7e079ffb43f08935bb869b4a180fe30587d1cc395fc1d56006ec454b3d27990ec28812a2da5236fe9c142ddbba7fa9c7c48bb468dd9b36a6610bb5c9133f90dc46cc40915678f12915b93fed8dcaedcd4dc9a916fd3982c569a4db08d433c32739ee5e58612d828c51de3bf83c995a3a3b3dca4eeed18937b17d01cec5e08aa45134cad1bc545f7ec0edef70d862041e8fbdfdd4f93e7961851a7302257b2000a55204d7c8a936d5d2fdc4c85eb2cd8146fe7d95d304e2db41cf6e96e6a6aded7a174c00ea5cc1f9466392745d13cc36104bcc042752c2f958df8073849ff16eb1315716288f99fd375c8dc6d8b82b56c1a5980a7fb54e99f24ad19e569714c0d89b9f994d2adbe0ef8fdf5acd1130e606f8bb618b9cce12fdc86cadc1d1aab4479278e5f07d8592ab8054e37329c3623516d228492ba9f914cdef6e484792ef31a2b7747c883329086a4bb36bf522d2d9346caffd6bf9919cc91e89564654f0da7846c57337a258c7479efe4894765ca8f1480a29586dc5c95b18688a9ce38fb9be0cca2d714f27255710fa184e6c28cda21b1b4a98354d8dc42404b6dcf50248cca03994cf0451ec4f2aec82c68193b971826805f4521e1481d84b0b90ae0619bf2258102b7888c9a32e4981ddc9e712457db9d942895c7d2f296f0ab602be9edf8f2e8abda2275e6f0d750f923981cee8a6a4fccc3f03fcc3d5e10c5e431f0f7ffb9208610a639a98f47ff3feab3c90d1e65c425f5898ca6d0bdf7c322f33610724ac803f9f85c372e4479e2302e0baf75739e295e02cdcd5ce905d08f69f0ebd10ad609bd2d182b98c6e0eb6f2ac7ce03a1584ebbc43578fc83c08a889f5355ce730d0e2e41aa65412050ac2b4ca450d3a979afb2705faf90971e3d0c7e577f41974c0baacf635ef5fee5606083827bf0ef7539bfd5b883f7def07c645728fdeabd9498c5c41c4563ab839d21e3afee2ec388a7c45177e40225c8c24e8e7605c5d34d8e59da157aa72bc597ecc98158057dbb52aae38dcdf04899d72393e4e4938edd8f8d134687a36565005d5993229b90078f2ca6f6ff74c5fda0f0e2fc4059d12fcfa2624914de0beefe320d895ecf8fb8f439cabbd73b6dbb9250aa0d55411336eb09a46d50179a60bb9640d22655816936eb04a46da9149a62b34a50d2867a81291beb9486f252ff6d78a2c01d49dd9d24599ede74f9b3a4912ed52324dddd0f29fc0302ec18461ec373445c390b7f282b9404c5cde320e6eeef3b6632daef2a4106064e62c926ac0f2596169ecd132d6ca0027f34a684bb1604670357b56e4fed21ce6a20e8a75a7fccf4ab1035abed887269a6e4ffe0fda6279440643cb9663eac53fe032d19fdfd2f8e4495597e09512e0172a7a53ae537bf5be4f8bd4720231d366ef2561879f61e4a57944550efa25b50fa8bd0cfa857e77ca134f5959b16100ef5d8472cef2f3229422a89bcc483d2108fa028f569f52256c026e7e9f002d64095022b19cd5c957175c9fca41b36b44b050c8a3904b1c912afb74f102923de654f14c314486c78126d23f6ea140ec1532397e0a192814cb7992e53f47155fb409d24aab50d6fe5a48c7d768a1b539801c75fb18f305399eed6e1bb816afb55ef23dce16ab1dbd30e0cbdff95737042ffdf04ee33c32d262600a9b57070207d5bad2f7d3fe96b313e4077f17bfc2053336945d5e43f796d7e51fd1bfad0c8cfe41711318ce01a49824d62517e64a24dd9d1c8b2e7587463430b4e6785ea7c2464883de7063fb571b584a20fc47e234bcf2bda07f9d84d28af1dab43ad37585ec08b9ea87229d7ef6de3ac7efb18c74405a1b8615214fb6860c4c1662b6f440a2a52644386e8a6ed167bd71d5de3fab3bdba8d3744a871901294da7a7e6deec1273e715f4e1fbf06ac1725233943d83783aa62f2e9107bdde40eab60dc35ea57ecaeeb3b8b5c6278e7635969190f8f22aa4940b6643290b7c8603ac1e801ba1369c3a4abe14b7468769d242db21effc2b2147828a612bd1552e71b1cff82745ec5794ff1aab721ab28b4577c6faf1379259b9a9af5f6e785e71530291cee01d7ca2db743dddd8bdfb6f8b8b02570fba2ab707515499665d9b45eea137a45c5d204155fb09036588b54185784d1f2224e28b5b4e5fbe3a2583ead82d16fc79dc5136e517bcc22f8e28c203145b47c9349653c70469c981f9f5e7674c22d3f6dd3e5dffb15d0b168346d20fdcc9f50617f3b204170ee8dabb13ebe795390646590a15813cf12fb1d7480285cccf1e44cb992b6d40b4db1592520694badc094ad7502c936d40b4dd95a25946a435dc894cd6a02e9b6d4854cd8ae25909656912e13a4107b201677b91bfbe6d29369ad3f875ba077bfdffddc5b465f26a61979277c01139eeecae103a79dbaf8f3b61afef4946cfa03962e344114d6cb8529a6fe22a4a1f80f58e9ff8a2ab299cce714c8f7e49fd552db664f891372d0170ae19368480c923b874c85ea40b6709bc3650726d19b275dad1f279f9a45591bad46c0c515b43c4fb35eb53a291dcf1bae51d3b6a1f4fc61dda4a457e425199392b0ff839a1e9518b6a1c1b329e888aa9027992ba203346b4d8adc1e93ab181d8fcaca24441c965d4da6129c3e096034bb0b45c6652df72ca391fd8bcc37d20e049e74d91e271865e71bf48a52365b7ee21f07f5e016829b0cb9897e8b04b398231441d5a8b2741db0c86a2c1061b1e6603d2cd26eb2bd6b7295c26858ae0ffdfd02ed2a59cbdea490aa2847022534f9e8d361dd4d898734b55f1a6ebe366531964e5dd0856ebd03be0bec65d279715577d8baa694dd35a75ed7781d911432d5ac22249375e9541a553610b4fbec72306cfa6b8cf8aedd463eac513abb7546f6900ef918a9bc57986882849c208d4d00237d4776fc2fe71d7506ac3eb43d8f5beccd01349f076da25ed2b1e10c67503a81afd1416cd19b57ac4215150f4348a71ad40e63c34f9a1787744a388a9eca6dde327bd38d400d8169aa2a0ce97807f818b65048b2051db2421ba41d9221150871edb49adcd1340990a44b3a4117cbcc66793a08c44a87a4f763f6dda4235d17578a087d13996871ec80d1dbb2432d297152908ea8f046366cedc9d329239693068e839c0eb670e96c1f3e198aa83a24b456919ddd87844e0d992578cd433af2342cdba8a462a1026c94a8c648c3758494d279f83e7024a6b6ad81eb4e0f1971d7444098806ae93c3d233d5b3698e26b3cc8dd7f9b36ccffb240afc03ea5b34b79001dc26e52991c2817d57e9b44f34d9cd366c3bd582c984b5720ff488b5de0daa4152e4ae316cd54903168aa44e750b7271f35ae80f87e96468ceea93f4d43943e523f23c49b9176c9d4e819d7ef5a13eaaebc42e363f6fadeb93ae030fe77e1d6f4358d04905ae293cd57d6df7c0a9da0d08bf634cabeff0979b0252ef532a7ab3d3886efc312f0d0a90cd2be06cd083aed5dc46508811885d9fbd98e00cdd800c4aec7c4db8a226e4c81cc70dbff8db9fa7fc8c61fe3d2d298fd6a00deb0774d21f21077f862f65da8b574faa835a8140f1515dab481647ae09ee1b204cc14e896e3f4ad1970f4458baad4dc8b200b74ddbb9a88130678f0c9d7b9242eed0fc1116a234b9281c3934846855b6d80001851f9ffcb1e3ef663aa77aa09751350cf3a0c4589fb455779d726fd40fad630ef143e742dcbf3fb39503d94a2212039334ea8968a409b4c6981926dcad33505ed4bb85b2cfb31de8f31df7e18efa6c084c2a0d56577be420d17f984bbf3ed3e1786def8fbad20b1cc840b401b0aedabe8590965dec3da307a3011ecf52218707f1b073035d4f2a191db63ae31bf8f691214e047d414410b41210d39489023e6a6169b402bd197b6d8eb2451badfcb0da9126b1bc46bd9ed792925564928b289c4432b5baad8e7ab88cbaf356e205476f45365a4edfe4a7b9e1e77d129e9d9eb7e8dc55d7d0fd3bcc850b1b2cfa82a666091f0b9111077efdb46323009018aad4f8afe9e086133321b5646d4e93a4dd04258491f584570a133f6c9e29b6f622bed41819c04b5e889ff0e26a19f067720500541e5f743d0b2a0f9b0d603912cc8fa54eb0e7967e08071de92b11bc3a7c400722c48ddeaf6c81b6202d33d87904fbad6878e888bfcf3a3a2bacc61f558d09f048e29e700ccba1641ade38fe78ca4359aa7bfa3c1d266b965440859883880660ffad0243cdb6545d344526fa6097a3ad20ed7fc1775e6698af76fd1453738c8596a7657938c65a6cb74192c248e0aa2d3b1009dae2dca5aa8b4216156b53591769c2c22691f52f624950377ef96c6df43fcf6c90450c03b6aad7a52887ce87fba5db75f35056ec0fc24c05dc30fe90ca1b6bcf5b6e77db27f12a06c8e4e0ff52ba0dc6dcfdd0cb801abf8ed99be7fcbc3623a21629fa9b9aee28b30ea8275456cbec2318938f9a6d4ad1bff03b06504ca78bb3999401121120423b0d501dee16f3a13d52d804280ed966e9c37e738c290913d1d1f9dc41dab882505c065bbe57c858ec337121889ae559f5beba40847b8e6bd9be7d0175cdcb3022a01921294be079e8964f968fbed0a1c422b68992eec3dd9e6c885e0962c5dcef2e26117e4f87a4039c93dd88ada817adabd373b2e12b12c81046f95ace565ec680787d12ac94ca2c40abfe5103f078fd4cc159518a3f21bc90b6c88033abf768c592012b3491b5eb22dbd7135b7399dc8c4a54485ece46d86a00021e6fd7ee399dff7238727d9f7ce7823fc383b44bc00a89000001057e41f377500ce2a005aa39a52a905c30c9644c36c37eb6f1b694d2421929288d0caeeee1d6c0820080a09369e43357b402e4454aaad07aeb22ccb5a225fad2fe546dcf23e95e57c5a2c7bf55a37e65cbb116eeb6dc4553f50542f6910579c504e83f575419a47ae6d286e733799b4be77b4511c05766c1dfb72d268d39a482ae56e326d1487dadc888de770233b5c87760db5ed08d8780ea7804d0e0aecd8475e731d4788bcc6699549a55261d4e9743a5da122f239a34ca7195337d38d329c3d7854d188111bdf91c3d3e136de0e152a02395c87532087eba0808de78c8a800ecfe114d0916367363b021151d548cd85247a7a554b7221e54d766b3bc6d2b157f28861250fd2b49207b1635cc81e98532f8fb995659c469aa4699a0bd95cf39f1f91489af719f951c9616691bc9fb74aa3ccb7cdf12491366a4876920bc94efaf915dec86bf9dcbe8008bf39cec4d8beaa1cc55b4315fabab01cdf0eb771947ff4519a74cc33995c733c6136049f503a24971f7c143879ccf3fe50e0e433a6b5a63d930e2072b0186325c75c6f1d924bfc5fb40cf325a7a1a1e93add759dc94483d5cc013bbce4da935eb314a45b597b26af1904e2ef70cdfb486edaff459336b6c3e5ded9e1a5bda3c3a5cb8fb4796498dfb1a14ce570bc75e8c871b241a1a43c9d4e24c7a453c949dba9b4915c926a6a6a6a4824128944aa425b8e1af29dcb2c3bdc7919cd68e433331ee6e5feb27b6993dc3d287b9036e9334ef2cd933e729c39f2f20c4dd7759ec54ca7f36ed2d0d0984c341a789307711ccdc837d3ee3ccb971d8ecca1f3be9fefe468b45143667ce442667cb47fbee46ddbc8fb8c7c8966a3d917883e38e7b8192f0f6509fa99874353a4f1238f0bc7718ee78ce3998d1ab2f98c0bd97ce6e749de47a5f7adf01979525792dfed0b441f2327799f083fd29ccb19054e64981c12358355ad156218439929e3305d61857b87343d4275b3bff511797cafd62693bb75650df89159b6513999772e24dbf4846d6642b29ccc473eb3cd6156b2bc8fc85f994f92c3b9edef6788bfdcf2cc017fed5207857048fbbbd4479e0933d906a7dedfddb6b63f6d1ddbd6efb63dacfd11791e55f5a8c7a322499b45961a1d9ee7709b1dee9d96935de3743ad73d5175afd626d3e75f4a736ee7704ed3a5005f49c94d2eb7518c1fb3cd31e566dce47df9cbaf3f5de2469e0832a57dc633d17836a60c7b689ce69b0832a539a73dc7da731ca933bfbc4d6bdfe13c4448390f117e0ed9eabd5a9b4cee5f8a73ac336d47db3df193fcecf4c4d73b477b76f89aa779e769c7334b7d42c931cdd3b5d725f979ed9d6f7a8f60c78c93848c1cfbcc7246258799c9e1c867f6a499196dfb23f29a9bbc3bda81264d3db34578bd3f22df39cee4acf5bcab998ee77aef788ef7ce0e1ed56bd754efe950bd8d7699e5ecd89ec3c6e601283fa14ea8d3e974429d4ea79ad3aea9a9c9a222228208a9140f9a92cf94f6de5b25649baad79a0047e8cc3f954a454425b44396d208aa4ee48de575cf4ce7ab4faefd9980e86b75225335a8baad23e0f21f749efa04872930df360dc4f40b69d6d8f5b655bd711bdeb66d43610c6b1310bde6b453a6b9c67bc784b9ae4f78ea13adf596f568a4b5d67a8aebbaaeebbaae6bcbd9677da2d1089f58397c7db2016102a2faa43e198a72dd3abe2e6b09c15ef7111c695df86ecbabcfc461d28ac5864b1ad5609d65d6e1ee635e762e07ca94d69cc669ae3d6ee330a7dbe6262072c03c63e7bc6deff8cc4f121feff4e464474173ceb38eb6b96ce793737bc794b16dcb7934721cd98d72371a8db0ad1be9d146229148144baeb9663938e79c7d7354e69983726299e940a9478e67960333219b73dfcdd93c472d44fb96a3371af00050e08c54431a719605051551aa37f120169509583297cc2c4d904e9929e3b0874fce9d320ee35376726def9c4e2513cd4ca9442275a48e4422913a1289446a62435dd7bdf7661d5c54853b1d8558a10af4d20c50324c74344e33e3a51ace2f2f9b462a5cdccdd7c8a1733ad3dc91acb56b9ae7fde5253fd2f4b567bd77b291e7435ff34cff3239f49a124d37532a651289446222e713e727cdb57bf52995bd70975ca76e7974c95c3223174b8c48333ef3d578c9bb0dc3e69c73ce39e7dcf6d7735f89cd636d37e0e7f1e61ad73857c335e0e7352cc9cfe33d821dafed6dc9638ee11aaea6c6b9bd43836bf2fedcd4d1cc904a5d47229148a4d16834b2ac254e270fca1ed775afbe326579fa69640e02b6ae58ad5f7eadaa020b62befac58298180414df5082cb4a9d935c739c3decda4ccebbc8696be8387bda945d67d7b09c3d945601e52787bf15419d5810c38298dffcabd126ac7dd37bc7e478efccd4789bb6671c3acd4ca9239146a3d148d39836c234cd711cb76ddbb66d4a5cd7755dd7755d396b41afc5a0bfae4b859387f2ec7d31a8c8c9511bce1e396fa718249fb0202606bd92189f0cf90d50be7cf3ebd227adafcb354dd3b4cbb56bbfae8b46d3d775e98efb32c0d1f8d4bfaeebd2a0936a4ea85c536332994c264dc318634dd35c6bad694d6b5ad39ad6b4a635ad694d6b5ad39ad6b4a635ad694d6b5ad39ad6b4a635ad69ad354dd3b4ebcca7da4aa75f2d79bedeabf5edeebd5ac3af6ec48990b832cefca4e1cd1bf9e5694df34c6f1bc76dae392f795fc78d38bc39b7f1fca675e7ddc7f3da3bb71c1e69a7dcdec13eda3b996b8e233b8fa7fb369c39f41349cbb4fd9948a49c73ced7454343438384ee9ce3f4fe74c9d3af75b7bbddedba8ea7cb7ea0f1bd2ecdc3c3d3f1f0744fb895ab739ca1aecbdb38ce4f5bc937aed397369af1be517612c7f1709c6f9b6b3ccf397c9e91c6791fc76d9eee356def6427ed9d93733cdd73be759fbb3f655c756e7fa62cebbaaec3dd755d34343434563a9ed74afbd325aeebba4ea63a9eee95c46c094a9744612b9df8de2347aa8c444ee5e68e8a473af345ddce6bea587e2df4912b48d94311a492e66d8e8d304ef38b47dec7611986650f18611997ed1c8e738c2dce5ed728e348a512c9671c660f20f98c930240d7177baf0af6987eaf8c3b526e94bf955e556ff78a04d59d3e5d84f95957ad646a5aeb24ace48dddf3b3fcaa5424a85696a7923f62102837bdb3d680218f1f30c31be994fa74826774a2fd1467d059047d743dc5fc0785c27c741c08a4c7fab9a91767d070688b977f38b4a58b4f41de548f3488fea5620f3a5ed52a05c5577780bc217df5610b105feb1627be561f6af5e13f13bee6e751c9c0b1072940201711f9435341ad8a3f6827685135dda4f3fef4364dcc2df58bed14201079edbcb9080064a0231014ed729172c75709618c32ba8c50a6c9346574195dc6785f002499c81f4c346fe241b41d25064527f1090c7342b4d06210c33019cb98fec1305874ecd9b37c2d8bda6b518a61f1f46368afd909d9013f39ee1db9c8d49cdfbc22b7f8ddaeeaf44a29a594515e6bd3b83f7ae50a1592a9e99a47a5cc1e5664ea2607fa8b5cb8442f514a6e0186de83feaefe542b5510e92938000289580c51c6101653e4b5c9e1f2e6f27bd9a9d90a1f3b741282e01cf3f5e2579faf594ebdec3357e99a471d664394d0b7f6bd7f616e3d73cb4756f791da86d90999e3ea61bcc2ce8e71adfe935dcb1501d187e596952fb73c1264caf2ea7d33bbe5e11eeb73c61b6ef09a73851de7e59d60fd7a28bb11107d58b7d6bb3f24c8d44f0fcdf152b1b2fc8d41329592365ee8cf86e888dcdf7da29f9e5ba239452cc1097903ad2c0f5d36f1dff55fbc3e07ee18544a43df09bb2c5306d18b53998219181dfd337da954943fb434c91e533c4a8960c412e2432f2f7f988e235dfe8041e6dc500a492987d2801642cb72086b85a65b6bad96ad134238e70a20adb0c231b56a3a06da0a1dd25aab8f84f3068c558710fae538c24dcb6ee7b5be6bbbbce87dd3a35fd7370d470f6762d2332f7b77ef40873c1e781ed3cb4bce2c52ca29a594d567ce225dbc28798779a9e4dde61973e959fff105c3304fc9acd999717b1d6f9bc95a3779181631e831c6c8420ee69a29678f39b3f098dd9b9bb08d691ac963e6344dd360842360cdc3de671dcb91d43e73b43fd73cfa87e408d06396c6eb8916839e790647d0dc5ac7ecded13c2fd93230af2cb261f65a6b478e799f9ba696980a359e731c719c674fdbd42da7711ab795d0b78e7123c7dc3a67b19192f976e7e8a087339d47e734e80dc1bce4321b52f2ce94f767f9e733b387cac14cdb292b52e33bcf9cf32d6282d9837f4d6ee1ecd1d54c851a87b387bdde79f06b3ccc5361ce1e5d60a39a9cf591c7b46dfb92c4a2a2a2386abcc683b347867a3435cdb33967d9b669286d17a9e9dc7ad671e791fce499308fe49d87918a9c6adca43dd4e61a3bc91bf9c933913c3c2a7272937fdb2e5273f24c359ec9adb7b9f6ac9fbc1a8759919acde433b9088376b2262862c881275f9d027df559abdd3e1e9d96dd994e753aaddd9f8c143a8d39d43a9c5f0e94294aa5c3b97de24b2536ce2f3075fce30b48e3252ba47c761aa1b7a80e8d97bc7a3ad9b563cc7f74d1f35effd125522513956377a25b1eef577225f2774c8eb9751de30ba146370d6628ec6c0e1f633943c7300f6edfcd2ce4688f58f62d3bc45878bd64273bfc243f1ff10afff3d9617698f5e488617642e7307b74884261dbb91cfe8c7f3e12471c231ca106931ce4f6873976ede68baff787215902f43e12eb899f25f979bd35cf7c0695b37776a2e715b66d85ccf1e64d2ab79cedd22ecd370f5fbeed2f023d759c516c7ff4b1ece5792592088160d4b19e159e44829ebdb8a9631efccceb994fca9b3acc48d931d7a8cc511cc92f0f95f90fd06b24395b4ef6a844763be732796cef40d7dcb4a193bc08947f8b40afd138741a97d9101a2fe958d7188db739cc7268f647e359fef9c8cd43e5642f79f6921550de8a54341caa82cb47b78eb19563a653fab8772cfee2ebccc39b5b4fc3b46318e6d6fb68cee63e50a67e3e6a1dc22c1f3d734c73c9cb25aa631dca1456f2e067effbc1ac37331dcb33bf1e0675e20937fbc14547eb9777824df2f3996b87f286c32c8c7a7ff2f55df2d846b73cca1eceb4f0310fe2486d23e6360763282e3b1e79d6356fcb3ceb232f734dfba77976cc43e99d33e328cdb5738ed2768e8698671e4af30c45f2915bc7345ec967bcce73c6309fd9dfcf43cfdea7ed9c92a3f2975df3cc43e59da367509b8f3c3be63cec33dd6bdef98c87bdb4bf9fce91c4c73b8773d4e6dbced19ee5919739e76dae79f137b75ee623cf3ae7e96dc3cfd990037c749fc8137f7efa8f2d7474587f78d1d1a175b7bce8383302cdc49a26f4e1bd3959a622d5991b6eda04a5d7ab9c965a4b2d4a3f6ae54c30bed0d4faa4544a14a8c7a716d5b1fed19c9973c98031a45e75e8d1ad639c2eb74948741955985bc6276cadf387a582b56db5f69228c5ac02e8a3eb6cd69fd21873b6282d9f994ef4cc424b4e896ba65bd2aa63bd9ce8b26628c8fbf337be10b474e83fbcd0d3a5943a3ad1a7941185e9d57f7efaa10a2844effb41217a74ead7bb7c7ad42b72fddad0cb50989f2e72f7953a08b8668070ceeb734a33a8161ff006a3d3482392f8724eb7ee93459fbd83ca895ebdc7da4a3af0f37627a9ee53bfee24d595705f7792e83ed947ba7b2c49862ac5c3a67bebe66c5996913cb19b1949a5a61a2a2df089e49b97af6bce39e79c73ce4cf29c4afdc6eddccd38374332a28d7cd98891cf33a49919e7f64e4dea2fcfa99fa9c134259a52a9944b99a6542ae59c9576966539e79cb316f7de7befbd77db369b6ddb463425d2e449a5b89c53329582598ca4c8a85297fd5256a7dca4f565d54d4544259f6cb9481ccd88dbb43699dc5329aee3eed5da3d95da54c8e1364572d810195d9abb5cbbf64e37ea4ca8191a53e93433532a954aa4524d4d4dcd161b1b958de7b0f172a80218cc978b1581c981094c1324ac0c3682c4454aa9e3c0cac0339890428403185c6e28e38449171714717145882e5b4c2b3a0e035280433d8082840c9c10e205276fecd004881fc63c6186126082c0c8bc94524ba188848a888a13551122c2c1961cf42582077d1f0e11d980de1668d19de9870730425cd83083184dae884b6881c50c845cc0c486214c0c2e4a18a34d5674a7a3f0f2465e59d1354c04610855b080091dca58454429a3063c54710319a02f30685f5a90cd2752d0262702d26a04a11e0ea1f1050d2b9eccbd92a91b747e3884c613bfc2010d237efec868101154f370088d175420eaa5c9a6ac3bdd99542b12da8821aa562a125469c0602b9d52eb42cb60685534d994756759161731641e9dce265fe5cee60c28fee32134e1c05970e4ad17004c3c6c2c1ed636b90502136972cbb24804f138c27487ce2822c874994c9e3a03ca7faa38ea25e594d55eeba5a0458a2955a200820cdac08204414d86c2047104110e5670db186170e0a460fdd09665390c7acb0a23cc5b965d59b9b6d229b3165481c9703d1c3a03888b981590418417559a0019a9b2c30d40b812041161c2b06207f6c6a7bb3266e03dbe46dae33f2a29cd0180379ee369e9bdc21f97d3bdb15d73ed08bd071014944f8da872c30f9ef6781c8923f524a3d22d2a998ab5d69a85fef2ca88af6e61fe59966555ea5654ab56b776cd4ff7dc57ac585c4e25ae3fe74faf2fbdd63cedb5f3cd55864bd249aba59fa67e23d4a69482716c149665ad6280460d2b1dd05001bd6794f92f95c5e72f578f89792983276880410a315e0044100f00f5a0458c2e5a48828820d24d2a29630bf06782fe68a33dbaa94b156070f91516fd412107e030c0b22ccbb22c4b5f6c05853603086650f91d6444424b87d2af7493ec1231371e3a9115d4c10c2b550445e9a2052782a06045105a507141961b74594111c3181f3420c443c6c789225e1c6be3e7101c40fc845eee8dd0fbae7b3738c2f42b7a487c668ff5d6a79164e734c723bfde03e10897922b2110257a42204a4c7ff905ff6e8ef97529b97fe3b6619812548e7fdcb9aece03d6f3f196c8d4edb99b078e30dd676fd6a3e61ff4826473ecd9f3999f1d5b6c643dd4c85e16cbde4ef6ad73bb772ebf18265dbbc71a793b56c73f057923e52712253dd6633d970f2ac79fe4f0497ba747c9fd6b1ff9cb731dc7fdadf083c4e7fe759c89238e2439d6b3c447498ff520e0f100b635205313f3e8f7835e50d6fd472452c42ea6468eff682b991e9218f3f5fbf913029fd3fbbb7973ff6d2b997fb3e821b18e1df75c6e824cf1902938bff8c59bb37bb1df8d33ef44e55c8f7eb7089d1950fe835e86ccc881e8f21e12eeb56dae49a6b0e399a3f74c57c111a6f724f9f9b84dbbb3b8cbaf5b8f8eb1f1589887197679286cdf3530a2879955e36116adeb77ef58bf8f8a8ea9f12814ee63693c46f4d5e1c7bdd9dd63fdd3ad647ef40d02813f575668392116204d431c7d91d662c00b1988d4b8428b1d6810824b0e788822054b932862e05083a171839f1d8010e20561644902076c5cc08b1b63e06042081aac882105859d317f88641451c1c40fde00a383a124b4208206656ce1820e785069908174c0172c80610639d0c00b193f33c8e2c50d4353f0408b1e80c161f4254a2f570011751737b4fc415b6badb6b1d65a7ba9b5366b09848da3852b3de80086052ec0f123a5063f209185162a9c6871c50c20e07863276d78ac8ed837d75abde4e06bf52b53da8a71850c443b80011a446704f94c8f8215384059011c64b67811a43a1cf242c4d75ac6d7ea2abb5756340c423b2656c063d92aa5e3482caefdf1ac542b12a853aaa7432a7e4ec9856e4b8271c50525de5a99041460f8601404183108c1eae11756b83c01860d164646dd3cab7ff20596eff170e80b32fe3e1cfaa24b14580141e86b1583944db084d60dc2e5891074f8212e4cbcb5eef2467af1d653d62d4fdbfdf1acbeee6e15d4c3f470884b94cf1e0e718192554ea8628c51084e1e000514757aad95ee54a792ce4969e751d9bd431e74c6d10412d4a5748c8bf7b75ef787391c42f795a92128c0910792eb13dfb27c4ebb3349f80f96f1d5ab8ef7d671e6bd5ac36f07cdcfcdbfeda74f78637d6aedd3ad0d7a62d4cba7ce5098d50de004095fbd66afee0108247ef50f4020d4eba88ef690d48f7cb44590a9cc39af6e82bca9ce7999fd76bcdd78e6792714ca396f2a5358522977249594521f5634dd57a66af50f0ad54aa5bc91d2536dd198576c5f99aa96656508643eacd7b2e0fc81937a424737c0189d6309f1eb55af65d94d944981e106ae4f2c5344b1f2a787534481622d0482fdca21d7a7c7e96139e398fbe381a4fac497ee40be1d1fb78ff02633c12df8c3347bd87bafbf7513dc6a3b5b45bbbff9d363f4eba7ff72e9f5a28123f3c7e87278dd8458c20afab06ead9be68fd1c6993dac733b3369d81ed1b2bd61de1ad0f18f9b47a6ac1fb1961540133dad47ea5adedc7bafcecef57cfa2fb57a3eac68e9b56e2d53f6be3d226f6ee48e1e9d114eed4a7923f7a7daa2b1c55bcb94f54b712090f9b0ca16e211d9c37a0a0a1ddd0063344e2c21be7506c81be9d68ff8c89bebf6baf495c4979a105e58a194d22ec8fc473f9b0ff350fa10b18b20c905981985a84cd1ec96132e6c9091ca2db6bc94130a9e8ee97f165a7afc71f97424d531e6d353f226fbccbc1f36bf367f5aad0bf1cfbcfa4765b6e9b40295b83685fea710962d5e26d1241364039421a85cc9c285bc91ff73f39844c9ea06a467ee850e9f397e80f5babffdd8a9cdae4ccd3b915c2e24caafd0c787613604058f339f9eed4f0eb1407f2bce3cec391b32a9c8542753d3b33dad681ea61579837dbacc86d43da9c89492f85fa45efc2122f4c2c94bbf598e8e2efd3ab67be2bcbca9041c613a9e114638ab56ef878279650ac111a61b000efdcd29532615f840b706f14d339552a956abcbafe3eb5e97d3a98273b552b99b4c73ca6bc7ea5dcbda57a662ddd029ce8cf507f29aa0033002e451422afa90fe790400804aa656b38704e613893ea41b51027a160f739029558402bf08657b0920f1d2a595e82345005da74b8f4234ff45a1b8041c61c61ce44ddc02a6a4cb784528fa9051083a68c9c1cb88e5077004e95f44e28574f49ee82fa451f0f8710b1d85a2df1b97cc1f4edc994557ff68bc054011aa4f0f0350840ab9fc40a915caee10484c0115cb45883983945a6badb5ce90af961884be56d7b5d65add30c909a440ccec01ffbaacd51224c55bcb456ea1801d14a0030f3f2ec0e28b1e9068a207576af8e9610a358aa8c24416451405d1a0e9a005530b563bada773a7819e52153ca5b40d6b7ba8a5890a2415364e2aeb74e329a59452a7944eaa0506a2a79452ea06b52ff8f03b1e6a81818acf1e6a81e1ca7f3c66955a73b0af8e44f575f76cbfa7b52b36b445e57c108ba78e44f5742ba133479f28a97843cc5442046178dc79c52a0c192d2d1069012253c6b2ac1591960fb5bc30037ac9e878a8e585175c28e3081ca74422a61b419429025383a11ab058008b98184c79020a1b64c041111a3b69a33a7cf2558b0b39ccc42a6d6ca1174d55196084570b59f46f8a2053d133ad93526ad93a551044a662f637c27b6badd6bad4b275472804e1cd1b4b8c6c70ad11c5c233d0489941bd82c043145b94f9810e52e87c2173441718080141086130a161040500a740ebc10a013cd402248516a026ea65467e034724b6f0a18b21aa2ce1831a43245001032fb230c38d2aa87ca942bf1c41c2327060c8072b5f2c61460c6e30821139885963882d6d30f105caf525088d83f2432d40375c286fe44aa7d40fb50035c1a2080e27454429a874ca55ee6cac1405e1490f878aac0ce0e150510d454ea2148ca54b9fb00d1b967cac8ee14f8f45298c3ab188e8037a9c22a5c8548c9e742a32f5d363410f3af52035638341b2e7bdaaa2bffba6ec356f7993737623f307cdb57a900d66f90f474cc62ccb5c08fc6ca334dfc97c7ab6a76bd9fbee7dac79d9bdace39fbf6c154343e6d1656de20179e4ac3b13166d0209ab6bfd0031861551ae58411b29a0f2b3831a889e18834a1138c08063b022e79c73cea214fc9cb368869f452e14b930c6972c7c3066074474d1c4ca082c9a5083075a407181172d46b8c9c552d0268f238c50b6d65a1604b156eebefcba6b81d6e2a8a10c910d1a067a07bdad5ca0b55799f22a773663a69471a28c0f9ce0c764b8d8f8ccab2e1a351d0e9501fae93892cc1314181b4aada539e79cb3db7cce64b8cc596baed633efe7b1e9e14c4a664ba482318d2a9091f2d971a496d06fad28d4574791794226c8c6e6abdb809164828a34b182cc1ea8ec70680c97cf18e6d8c3b02b4b965d598673e699e30c3b8ed77565d975b18b79e659c79eb597c8941c1ae3c4679f3241988e99b23dae37744f2db71bafc0d03108f75cb03242702fb3d0e899dbeee150991b5414c0292a2a8a23c80a3f491415151505d9b09b5760e8cdb5ff6098ead1cfbce9dd8f9ef6d8f61f0cb3248638fe234151d1df15183aca75ede1509920f9df098a8afebaa671dc57e784c8b22ca3de860c95874364b83ca6f2d871ce39e78dc27c277b742c7bf49cf9cf4fef5ba239cceafcf9aa61c79937bacda33ef3507147388275383406ccc321324f1ee3aefbea5d991bb03b7b6058962b01d7b56d5f7d1b33e55e1e9429ccbb373b01d78d4a017e752199ef54d73edb0f46a372b4afae650e87ca04fdcfc7e97d4b7e7a963d7c79f67e1e5f8e33311f8f423882f5cf8746384466cbfb64d2e60621289272861b53ccb8e2839429b240624a0f72d8011b4b8c6c70c5e1658791171ab64aa7d4f170e80d1e6881a3935dbc9066a5538a69e34757586cd269ef755d1cdc48a2862db2604283252f0083862741b8618a1a8258561853dedade8a3578cbb22e26c6cb1b59bca18507537653dc614201c044dd5751ac5e302446085bcc392d6b255324c894c9c67988d1a2d2f0d3af982a6c151f8fb0d838a1052e9a54a9a2840e55827c291d60086f289db2040991c48f3ef2463a8d3ee1fe60065dee19c3556badd7c216b6b085e78578ef78979aae6eca4bdeeb4e39a5636a37f5697918f66f7e955f1fef8ffae53893524ff2f3138b96869fffa2cbcba43a9328d19ba482bc108b7c0751162310f85ed8437b77a653192b80af0e4ce50f18048a71f2d0f5096bf98349944f7a74264d54d49b78901762519028944a00c3287504321dba06815c9f1eeba727f9799f1ef83f316e6055855ec99bec32bab4309f38af92d0d7e15fffbadfc93c3b99ec77e6bbbf8cb397f9f572b267fbcb3b9663d9837f2d87d9f572f676e2b53cf32c8f274ccfbc09339a4db6ba21db106a834a3dc156cbebb5baeeaf3ab6722cb7fbdbb15e77ac67cbdba95eadc3ace69de939da35562ba17b576ff70e0d010f1e1e2b24280d010f25f5727cbd7c7974a5047d2af38d15ce20240413a12b5b34c9a18b3156b061051358bcf0430c300c3f4e8ac0ecb0450c9330c8c0ca782022c1819804b7c41258c6a082c5081e803e2844001eb6bcb065891db06012e4d30f31131f60885e70c118685cd1220874c8019fba8a62e5031e3ee0e183f959af5e3d5eea365ea7318ec1e4fde1901a4eac11e6550f87d658e2d5a09286105c7cfe925b60feb2e1c327e0e15098327e288c9530367c182c8f3f7aa442ad37729cb1e7ef8b54682cb7f6e783f717b54c277a9609d1dc8af0b1859dca14ae518a9c734a6f2783dc9cd8a5c43df3776e11b184e938723a9973fb938f638cfb9b59c9bfe8252caf67fecded33bf98e18dcaacfdc57f80e5717f399647b73c4ef9f1f3d17226a4e4115bd3ade5df8c97fc835bac6f46ceb9bf394bfb835b8458be2375f25bbebf24174cfdcc836f3f2b4194f18b5bffcf0a16de5fbcf23b9ab3f0d1fbe65b2f31fd38259660f9dcf1f3d93df3bfa865b7a48f741f392595b718bbc49a7ff2c373eb681e3d468f994efde8993625fab0dcca8468d13b2f3bf5689c6479167e9432425d878f39ffa293fccb9c34e2a28ffcbb2e1f6dd475ceadc7226209965bcdb34fdbd6a332a5f7b7b9751ab84548f41d4d277f8cfb4bf2f396679e3d4af158442c017ea672d5fb95e02fc733c72262095f7ccbad7f7067ffb05fffa2dffdc12d65e89dcb2dfff0f6995fdc3e33ee3ba5f69de0f299e5d4bff6f5e85ffcd68e45441f9693a31ba4d143501a3188210d19888888c004115df125cbf645081a5dc34b1959268307326a30925dc8b0c19201031a75c03101033298b8910d418c209878701a020e66111b51a460862ed628e385034ca1c50c8088630b2c57aca187f042015eb03588e942c61562bca0050d64418318c634594306431843cb0606e78213555401c2105f4451458d21d8a0650b2cb6cc80658c318618c3881adc821817ca983266075288a10524830c942d5f829822ca0ac08cc1c680610018c8823143cb60b408a0c7a894ec58697b54a22992008000b315000028100c0704e2a048345104618d0f14000d86ac465c4496c8434992a3280e8220838c318610000030c68011a29aaa00039f1823b94d2ac8e3268fb87b5704f3a4a81cbe53726bf858d72aea26473eb1ac9cc035a4a344a3fcaddcce27437683475e62053f2c189b16336d4f9e4c8a7e447a15aa3e5f8c3905fb8d1a45fbc2a12e3e1a5c03f4861b5928650aa20d2ea9d1dc7d4646ce8f1931fe1cd2be5387d46e3be50f33ccc229fa8d33d5710f3850110e5e9130d003a55185ca9ab1395564a381110c0d934808078c409ac9a509de6940ac06ff877bd58966e2f602187c15774ec2234ac9da36fd9a53ce34b481352bfdcab857770de765402b2d1d2346da004edf7138dea768d9da0dbb2da005a1b2d1a74e87f83c64dba90e819e9094f5313d90443818ed25a4cfe492fd72ed02f7fc263bfa71e07157e53cefe0ced3afc2e82ddb3bd7529be7be3e7f7336d37b9d8a70c06ce5b1c4cd2e569945407473e7d1fb37f09625b94c085856478f9626929da91383b912483cdb85b46862977a987422d9947cf46f7d670e033479b6b6a1d2472a61842c052ace20246338a47ada4cae22b804fe95aa89876f93ca6d29d546377b4fb72fad513738f95c92de277ab5afbb453e923c73e8ed287592e3cd046b18d9ab950d7dec7ed8b31f8789d0e60d09dd6b1167b734c9d938dcf66664b189c82f06c0b726a5e79e6168d9a4a15cca1449ceaf98694dbd97895d1bb2b82896b674a3c0ff23ff94e7b800f7b0f586f545f83f53c002941133b604a104fd82804e7a31ffe9721fc7647fa38912aae06ad6df3cee9dce004469918c70d2c5c6548afffdbc755def2d11d07d0e9c3dab29536b13e70785c8df501b56c3fc4ebd193ed9733d9cf5c63a7407f1b0c04b193ff9417817b4f5b0e2071b8a99ae7e1ae244b9dedecad8bdd6465064399b70320190f26c3024b4333e539b1be799c68b285b97394ef6bcce8a62c8bf08e3e40443f174448d44aca8e1c209d4509f5736f043385689fbb11a5dec624e1856f113d4f5a435e54438eb6d0884e4c84c341a18cc6cb0db72a1da719dcb9a187a4024a841aeab3153d1b449197c0cbcbcb7694ea62eaadb2be94cb43692b4989f5e3020ae7200ce451124fd4877877155c5447aad2bbb229224728c184e6515e846a1b7ad33657ce549a50efdd0f8d237f5dbf3818d055c8c51f9f66f7e2585a9206cc71145f662c9c998fae43ac8471b901518b31fdade91da2e45c7117c67d525ea4320bfbdf830a2dda29f18331364c782b216fba7f1400ed49d77ba9151aa23429f4a863c02b174dcb380a1740be81c8e2ae4b98cfb7dcd48dc8513203a19e416a887185e89b60cdc2b9c748bc1fe719e195bf9236d04dc83b6fb5da12b709d3a505e45f8acc43561e83a9e764b6ef44216eb5d8edfc479f6adbce59015b7588cba5a5fc18545385ecdb33375a56c921a56084e06fa147ab255c4e5f0d13adb54f02dcdc3336c356f6e976f11ad87ed693cbc405437b718137394332778ac56447d5aa6fc70de531b5d6813a8720b69e68f9636518bdc5a08b40fd52abd8ba3ca6409a94b477f83f750cf4f2ac519eaffb84146c07ab812728352ec4acc34d58c7436e73c787a70c7a5467bbec17067bf9d0ef9db0fe33e146e6870145b2451fa820a0cb5467fe5fb3e337093856f82965792a4f5396b9b437e3801780a665826717f1a11d3ffe7b03f3cf107efe1011c4177e3bf3eeec122d9fba653e2679307fbbc4e7e86385c0a2a65c5534ea0fefd010c9f6a89346509bceb365e7aa0fe79191c61bc3246c6fdc2bf7ee247fcb0bba5c9f0a3c2db71485e6cad63c7ac97ae7f839002b11979bc99e0348d1c27e10ce499e76b709a478d2e0e31f9ba91954eae28946c67b9b4d255f818d0690119c54c01031ebd003b722a5e1e693c058bf0dfe7850c532d929de91bae65c27a265eea9eb39e9de98075f740e73017444794beeca0fcdb485bd25f6c2661265907d1b4a9727932ef457232cba6ce00d8a5fb17bf28ae4dc143959d2a8a1f8261ff40f3c044e490e33fd0c4410863ee52039900f99a14da88e49bbebb57ad6006bcbf59c5403f3eed29c0bf28c12bdeb00a401c7e96d630c952abf2873892bed1f6160b818c47f6952b2c5351a118ec10ea45f6de4b9ebe787449c238d86418fe86a123a3166c9e93331d56a4347602280866dcfae88eda446cd41f880b3ef525e9c2046c681d4d0eae7685efd808ef29553b4dc2c06077827b5f9f8e2727d178bf77e05aa71d663241db0017ac03357ac52f8ad9e0a2bc53d28f9638a5bc2dc031c0b4acee8e20e6d13e06363931d9e4c034b44522d90f59042e126161f306bf3063fb3bdffba539c78bad5f3e6fa53c44a86e88e1cf00386b3342b6204fadcb0103271e61bcc32ee3c38314830afe5e9b40d521afd279e8aa4f45624282be107fb515526898e06d38f78a6e2174dec5d8bde1375b0aa9e93473de9e0d922fe10c2a610167e94c3491642718575a54a3f93a8b1296cbfcd0e87db0fbabf47073e1f2b3055bc514c1546305c04077e13ee421ab01b8ac005ac8b2b7d3d8ba5c3979490f9cc91b73933f27403a7857d4ec315caeaf418e9d22db18f9b4016099a9555c56839bdcebd0210ad45988c2717db3541cde2751697840ae7e0006492cf11c85cc3a4551aaff5d2974c503ca7636f21cb18853f1bef98a4bfec681136eb82273cb902a7ec7b923beb96b9ea03afa1fc1351347e89d3b7dd58d635e50202b7e07ebea7494ab2b8e4d89d893311b079d856e694cb8ec0203ca7214ad44e4aa7453653ced2314f611ba930825f973b147f2310675270f7018eaa2c0a2e0289c88efb305defcfd9a544219858f17897e68528d516f21c623e36ffbc6dbc228c99d51ea0ae4b55726a792f60a85a0348f51cf438d861c98338bc11c28ec8166f1f7a0661b54166ebc45eff49ccbe98994ec50b2806dd119eda149490456eb4224f20c18b3ebad9d9ce7ba0df72b2e060e66b9e9ec699792ef190d79d9e0f96c1456bc5255bf9c9ec81eec4bc950c156f19bbe3d4fd446a1e2cadad6e972e9ac7ca005e762ecd673f15e89cb376ba09a5f6a7f501cfb31d8ccdb8789a97bd674e7063c0a1b72baac6ad5f1e0bd54afa2e6f304b63295e1252f0008a61a804471eaeeb928b72fde07a1ae7c2983085de0946cd5c21d2f45b7868a6bb9baa4f0c53ab68dfb65ab807d37dc9b1cba02564677c5db85ceab9e8c1d88c83ee417079918b624b91f8462a90b78b4c56e1344fa7e67ec4cedc72497988d071ab572187bcbdbd0fa021f7874ac1d145d9aec3be5696c3c393e56859d4987c22028f88822996dcba3db134586fd6e5223b5fe697944ca6d88f99f2f788076aa4b4da52f622ea0ff83cb5293239ed283996b04efb73026d7843f245a7ba5f3b627987cb16b446ce6855712b7a42e631268a31e68f526e2872ad274469cf99a749dc0e7cf165e0941b8eba1151e7f37979621999cbda0e0b2a742809bf0d725528e2d14c82a3931ac2f2b2c2223ad53f33e83b65d16319d2636357b3310f2429c84654967aa70ff8e4a5ed200840af76b3bf2915ee11fe3c97d1083d529dc10792bf9c5a97e2887a99bd1e1c40af9515cf7abc2e0d915155a87a2bd99366216c1066191d86c809160a3facbc4f7822a98bc7d58b918c2b80308e13592fe825121cc641b44884c18963e905d63b2d730a81ce1afa93dde99bb35e6d30c93ffb1b910569e0bd7f0661602232491836202130a909142265b534b967d68514d8a37a95606f82a89acd01d416aaeca47cd62f5a6ac1ffb9d615b950b36823a6d1138d837dcf21414fd2f1e3410a8d848a0748f9b1de5f5203b11b47c4a1049bbed1ba7a6c11db24da4fdc0a7b0f758f71da20cd82da50ca01ab8d27dac46a937dba07b00f1f42a2c8c4acba53f82f6e94b0220ef780131f0c1451627037a0783171cadb8b213f2ff31a2572c75324504df087237aab7938c87a39d94b2c86d482474c0d3f19ea6ddfbd15cead65d4a048ca69b2f63518a04398a8426825edb61211fed8ae39b6f18bf0c59370211e4f61fde23401b2fbf47b69ee94e8b871c6b3b3af4db3a91fb37ce23b1848292c8dd7000cca8ca00c994957ed230e52fbce54d1ff64545105824354e5b6681765fd11dc5ec23c1fc85f29bb85a722a05b0a6e2fe7a561f7196ed10a5e1847572f41450fa6a514dfb129f4ea036d3208e3bf9f40fa484b4c195de4795979a82a9b4c67a8b2c7ac82061ee2fbe68ffcf76f4211cfc579c7b7dda817384094b52186ce5ca42285d9f3647e51be712ea36b5b110fa11adddfaa43b4782d61818212c3e41c27e006128f80cf563bcea0d6b854035890d223746086434211ca147b03ca7fc09625cbd675fc63b5721bcc084fd703d1282df77408e1b65755957c7f9b83c2565615ab89ec422211e90b315ee468dc2aa176cb60e9603a7e805f6048c83f2c4a667c114307350bdc35da112f3eef64d6e0c9b574688a0e431c17c872a453d798ef3ccf34103ebb8894d8cd80bf84ddaf9d906ba85cad68edd501f894c41f3c075738db4936df7f692a71b2fe6b960dba4437f2ac1b3835fb96fdee833b882379cdc3f9f2cc119d052129771feb57a3699ed97e9069e06187206c39825fa7ca874d582523d0e382bd59f842736840e53936de1e9a3ad7543d0b7e540695834faba561319a9895d5f1c7c15aef1777c945132d0c2a7a58f06d75892f4a2a9f4801459367559b8b1ea99c2b174968f897c63a9f2ddf6af978894ceee69105b43d04628ff2764c1e68e7a08082b5fcde876acd93ed90113bdfb7f5a566012de31d56036d438f6ea49778ae8a41fa48d913c3ff3fa0006c5a93eabac45c9473c7bb9be5a3853ed69330e5444ebc2e1a4d1ad2aac5d9cc9aa58513e84f6512fbb2a1fb718a559b9ce7637714d550855a13b03277d279395d1fb080ee6eead4158ec8a8d92ae07aa944d043d4f8d5c1333c877dd4a8435e6700319fbda60489b87ae7f2c2cd033325c90e52109313553e0618ceab8201e000ea25a3f98294fd73a48790337ab1dfa05544da19781eb9cca02734e5ba693a5b39a26e6f2ff2dac1e6ea710ab659793c134f0acfc814becdd13297a9bc22476cb6ff839838e32d72907b0ea7ab0b1d6f5a6d9c3398916e8b4b2083e6ca60a3fb83b0f95c96da977c723ee6d7b4281952bcd0a0e6826bea356c055af4b2ebd10354142a33021a566ba6aa746a3fa628b798287cc21879179e362e0b2680d2fc36cf901c1756c2565277891d548ec358e6c53631b9cb4f182dd7f41e3d14c42299c50b8895414c7642a05c0bef0e381cc7794246023ccd833447fb1fd53207f806ea244e19e244918c8a459635b0a83f4621996e47c4249f1ccd1a62f0126d0dcb82597f5fd4a5632391d8a4a911af5243fa78e3f579bb608553466b353837a25ecfd88fc00f4ae6a167c1f41362f86a6a70f39ce55f656fd8bcd017f3024e2ffd9ed5d729684bbdf99e8027a9a8bb92931d6118a8d1556ca44a7a0605d8fe22925741e225916f338861e3afe718d334a7a45541c0537768f284672c4359cd7846d166fb1c7315e1b73c6223c90689bedb1896c0f974b5f05a5b40209bfef47630454d670b6691c666b623ae22079fc6a4ecf5cac71e7806c83d4211ea373b0ecab653bdfb5bdb80c6b7bec12d4481dd40b006a908e766c4310dc6edbc2d01a8370af3c354e16a8efb44d710937fbd17e7ab96818340cd9e7d9664382bca187a864b7c74b7744e0d4c5422d26278c86ca893bdca530292b758207ccd688b839a0d1d54754acfa498a93e541fae72220640beba3a8db0b4cc12721164477b644c86aa925bd5c79a0eb329bcd981f49e9ee692b499ff19cd7e541de2b34934f0c358260a9b178adec37566c85164c57d91b3af6c00f60f7e060420448338d38c61e4b58aef30224f930391fecb7d01393418217eff003e66c3bb5ced0ede21f42201f7f49adaced743adf156abc5cb7c465adceb10c2e87d50c644860e5cdf8c9e67a2b330e32ef0e41f047928ebc76acbeef17f7800651fc22a49c22b72885b105951b7e3d7cd79e375c01890817c30450ee5ea420fde9e5d7d14152c423fa63e3d9bdfecef3f02015a06a1f0f5edb978bdf72b365222fadbc4c4681c66d2230f910ccc370965543a75e51448eb7955372bba3d8c94e1f176efa7597db98f4122bff76fcb13c2e7f6eefcb1a8611074ad15da4599ebaf496e226b58a9be7f688312bba5045c30411ed3918b6bf064df64ed379b753f0b3f4900c189e9cb2101a0478eaa0605d84cd75c61754a9c9868923e5884c3611437b605c0d01d04bc4ae18c4005d97b0ea5cce17cc7048ee22aeea0f8ea3f69229caa84930fc0d36aa3d9d172f6df2818a68032b1632a31bfdf3c5f3c0a157dc7f23eaac98ff36ae340960b79bc65509fc6396421b8e0be0e67c057c2b5f76642260b5958b3736866f6fdee9baa1957b088a74545be7c35122131aaf9c474c380758a176592198424c17a2c0b7d7b14d77132eb10104da8e876cfe646ca195d4a406a9d89659f345733c4ed215c4f5e493f2ae99e119e96b0f78831669fe98111f26fcd25cb48b4e4d2420162db1c963bf62a6a27c6cf469f39fdc596cfa8a78287efc14533bd03c5d3ee246773f44053867f4540b9fee347c2272ce8df9b89571c2af07c7e11363f80c03bd4eaf96398cf3659df65b12532b4b2c0ee30c56da1c807bf85290eabb7a2879de636deee178c9b402640d1eae576f2b2f5dbe68a7783050e4880d6572c0a755d55fb75aa1ff9a35a23f2c007d9df33e3752f196c4d4fb6f37a7b1e05b2408d5fce6abd37affa99f23ec0bd8f80a129f5a21acd23bda9c025352441eef41dee22464765bb23e9fec3c7b1fed0a9cb29ee8414e69f51bfdf09f4283d8e84b8020c0ffcae4549319a6609d0e2aa8fd14004c74ac2d304bcd131cf7accbd8310213292041106a26bcc17cc2c8040127e07cd01f73da0441cb4449184c2fc166b027db817d9d685c34326da02cd96725b3c84bc7088c475f4c3920729cf04d4f52b2ff8d176ae262e5fcf761c30f8a534ab1fbcbb35ee86f59d47e03a9e31e8a2c0cdc42283c89d20494e6debd65f0f27ba8edf30b974fea8e3824113491c02dacd467592aeab635e2d8ef468c9489221b0f2071d6aa72abb8bd7ae30cb26075d696ddd90b6b6613151221da8ea4e743dc19c3022b3999a016a1d2bc2b272756e50dc5bd2404f6644eeb9b2acfc12acb76090ba18e51d4f609878261e0539eb4f83b71f03f07ac6e3c5ac0234c5fdede76c757e24f8f9b83918416bcef3a34485c869036290d1e4fb9361dac39bf2ecc2d62549cfff66ab974183b7437a6001a181dc6abbf85000d4d5d3050fb645b6c3028f4969664b060d88649eada547d47af2b4aa9cf108b672bece53a0b3916e9db10b464f815c16af87aebf10614868855b02de5ceaa972a6827c92ae8d24346ac02bb60716eef7b9cbfad0a14d44f659b1cde26592c61244109361a9087a8e56d8d235b59e0a6fa2215e3cc31434223f545706aa4d33e5715b089bfec261a74c174c6126acd404eb0f120ad440f19801a244620de22b9157de6770799e2d14d7d6689b350cda2d2e68dc18abd55cda50ac1083032f63d4c6bde2a739d78b76f154b77b408ca11438bf530768e8634800da7c1cf4af1092315c830d9b927aaff7e8af2909a9f3c878a4feb301af84a7b3636e1d66b1cee486af54167e4e28fd4232d40367e5b5dec1deb6875c3b8c4036fb30389a550522d19ad1f7f39f2ab9323a3c5a9014e4946d000e30c001a88d51804dfc0ea1080fca7a294cf1b211ce5580b03ed6dcb495d13ace3762aaa624e4562ee9870a0cae20fea4eff320fe4a1ec31a10f1e1fd1e5efa767bf04f09edbf8876a819a5bd959021c7bcb32cb50951175107585e3aa8da01f4f5a1f13d4c1bb001789dd0904ed8db84e342fc96e928a6f7b68d2eb8698bed248183c4b7343f4e75c62161478ce76d00ed448fc2173480e9868234e25ee0f550ff56eef54b9b88723e096b540b140deee623f7478468ccbbb6e2d6708256c2e86b87537728ebfea361dec0fae36785e1985aec39aa15ea606e8b529200bd11a3ff82b45d27bdcab7e8681d128c31393160bcb6e05ef29886313d8bb4cec42598c61ac94e7772c9cfef41952ace35db1b595f8ac97cead2f35f55046bec90714284de484a7d61e6bf2d219556f0d6f4a9c9baf76ac535333c9945415ae2b99cd62d54d8367d5541ddb8e19b8dc988a18d4fbd08b71048333bbf05e3837b89ffd788afe89d5b56e9aa3902bce89daa8b52ab9692e47d51c3e6aa328c2b6ca110e5d6905f01d8cdb8685c30677a33502a3863ecefaa028f9b5926529bd77c75463598023b404ae79f0db08f53a7552d1227f2611653cf7b8c1dc0a9414aedd100b9b52b7a709b00e6f9b3230ce399c1b7128e15de49aceaa16aa1b11ee5fe11116418c91a786993b05e1de9ace5177cb029dba0a51014e045cf98ceebe242b57d116cb28d9bba35e541f8429c15975b317ab6a2be68e4a53dbf86cdd369862fdc73de35f5bfb1b82c4f41f5f3196ef1024c41acd27fc111866cf2fd0876ea3ce9f6e7c8e7cf05b9acbf6133bb9c3f11ecaec6e0181b22e634177cb0b9db9c049fd4f98fe0ed52ee4356e1659cf54daf5d9424cd7590b153f073436104932cd44c35fc2f8a35343e7441e6f7427a2273dd0c174493c22540f60414d730403c242b00c7b22f7d951a7faf161d8ce8cc7de9ba529b30233ab94c83e94d7c3cd207051fc40d815be964b42447d15614e9b9cb1a6939e7640de8589c543c2a341075ab170baf7ec84f0703e85248649c10d9a3412f26119b67eaa750d4af7bf0ab59808ec6e5a814d6dfdbe84d621993d81838231ed53998ac150c3deee04e25bbba7560c570013bc73742869b8ca9b3c6cda654f1aa415ba3fd95dfa98bb88a4bae07d27312a44874835d4861f0c7c8cd94df4af0c30037fc8215dde890a4480ec5153b7278b5a33efef47690e3c0d6c1417a0b96e4a22bea87f86be2860c8f8fe60d0b19f31fa2b88ed8909b81879f75ba7953e11d4c740d7199ae2f5bf9321b858a1a412fbf35bdca0d061b92b91eaf7f87442b2bfb89f49746f373d239d1407a3cfd2efc730be6efde274ec6c1a56f04666a196496393e1c45fc8e4d0101aa1d3944b55630e5a06cf1c0d87e41ad9a654af63aeac63b24e514ad6071e4ae70150ff82ad96fb9d94172736a84c1c9652501e789a16546439dc8daa8b6bb328f63318523ed4ef0cc9e9d22f1d809321c92eef9b1768c894e7a2ac47336b3c7b5e91755cf149ad095f888998de30b089f94e23e8057036ede34a5826a22d631458bbfed52da1211876850c9bdcc15a9fcb31c4f54a8e3624861708c4c2654495af97c8ed6cd42e2bb4d8b8eca261bfc8e3ed9373bf24507b54d37b9cc2c50e697d6e96434d5f998375a577038a52f6e65cdf1da17c057918190ec38530bd320c0cf24b52608ad6ba6ded30adec8a7f29fe73e5fb3be9460b6158b119c3af2cc8e4b8a77b1749f715ea7b9752f57bf8c768d96239283e7ecfb232c6b65a8502ba5687e581fb2079a25b812c197667e5f5dfe55a1d93645ae978f7a3543cee8a1b49723827115692d46e6c326a482bf436f13dd362a19824dc02a5c3edd58d42ce09a25638cb3cc82c0b52c02a3e9915f0f6f93138d6826ce6e82fc33ef5d774b5de121eb40b0c9c8b50def79bc9aa22571eecb1c3c9b7f17e8de82817929acc48cdeb1594f463068018e6271f6fdf29da154b7b06e6f32790dc26e9bf956567d1085fab6cb94b04fe29479ab8706fba8cc3526a64214bbf6a45049d7e4f14734709ee4f646606abcf264799c51a18f9606371228692bd96e775c1d75a044006b1002a82f996a0d59d9e124c838f3178e5d64247056736b685ef655c6d05a9a490e596a8a2f07c31d1ff7bfe42acc004bdb838ebbe80e782f2b814932d3dc55370a2a7754b50f45455a261b4e27236d27971347a395a1eb73c568e240964085704ece9fa0817763860df65903144b098220d9673b09677589cc5d9040b6d0d61e23d89b046a10e4905858713a34ff5c38802ba2de40593f56fa7c94c94b061eb84261aa67b2b5e1120e78d2046edef9575d32c520556f66f5e63f7a27b722ac384d77055e302e472804f03deb4b2f523d4c7ef352cdb3a0322c11fa2b1a1ef2819753f69aca06ecc3d3d3b4fb47a50fa8cff79fa194107ff1a5dcd15d15b6d41eef5748892a6d7393428bb3a0b1f9df8d06e096eb93adf14bdd64c44cb09236aae021ce6ab97014d16f80d5b1038f56cc30dfea65cdcb622ec9996dbd00aa994b7f0f66dccc41bf920769860a0fb9676e9de9c1ad0d77ea86ff7fb20ea03850f79cf61a7f1d9fb8da4bdaf2089026ba8c1a86c628a3afed53a224f8e6631016a2511d6e69f03bfd6ae2a6881bb8c4f8b0dc47edd464bdf3316990b809d875172bdab65f1e5047131709299d0c20c7fb1ebdc310c7006af14ec07f1e3147eebfb01c6618945bb4d89896b4d01ec1e6599b83f49fc6da1e2b64bdd1c0cd8cb3fc50280f1c91c7e22fddaa01f709aa36c809e993399063396b8a7de4a179bd847154bcedfeab1443a3eb0302622a7ff334170dd917e45c8c17063962909efce3342083aad680436a602d678128724f5b3902eca383843ff15b7bd270a1c97d7639f50ade783fdfa40ffddc2ff759e29c38c214cfdc7cab8147ea132355ef9547c816d33e3c6df4c4edb871b0a42cbed5f1ea911e3663cd150698fae3feca591d5e04e69dd62ba1393b47a622721b2ad61f6d86031d5d2c90782f4b75fc1517d2e0469368fd480b0e49499b83f4d5ba6d4c8bd2c65ebabfd8ea4c6356fccee4bb45fc9769fd3b4383382e00c82842e273f01f38a199d715922d4ef2c463228450b09a713380ad469fcb51817f4c217143ff348e687d4a4ef7e5cc25e20dd20fac68bccfb21af5151edd72fc4a5e78a11090e67cd72428740d2dd94749e18a5041dfa3db8a14ccf3971082826b2998c1ed19320cfbea8e6ad29ed830d1885ed51eca376e37e47dec735439430f879e107bae814f5547bfaf38ea58bba57bb5c96e027adc0e5dde5167858f0a9759431783f80668f38f42126ee580fa4b197746e93dee3b64e22c4a025b5fcf07507ef25c53b68da96207b543d9ad93c7041ebc5f3e71f3394c2172eba6d9e481ed3a07e4cdc65a3c6a804174e7cb1d309f7b7125707ed83048aa49670a396ae3d16c346a20d534f8e5d573f48b67b957c8aa101fe26d3ad70ce17c71d6d4bc44c9bfecff88000db5bb3cc71798965dfd899dd3974ceb469b894c9667b2b16eec7bce93282bdb5f3fde85a55f14164fdd7f57e1cf265b10481c10cbe7c6058fe42a754a3b024f7be58a41c39a25e54b6ade466e6724c7f50309518cbb14477d79d6a34dc6bc655af6565acf296aa4f52b02dc792c81d537f6ca056ed77d7134b1c57688e9f0c42e1e56f286b40c1728f1995fb1f7601d90e8af785c4ffb389d118c5e34e7b66882782d7557cbb53a01eea8b73e62f33bbd7009f8d7203ef964de3186130d0b78158e6e284a8e074fd4f9748c4c689406e7416f8f5a9107552ee1c2321aae286e7dcd26562bb5357cf2432501075af989dead5a520a10e4a12d19eb6ae84b02076eec3bbf14a67e494e88bd1970e8bfa64486c61a4c7ac3330b0321a2948bd088850cb0a74963060f048119f171efc0e5aa5dd4cce94e651702de9e82b49da578cfc3c0339f31840dc538d7c7d6ce254cceda2f07e71cba71debe72dea0c412cabc7fb2e748e0113ca52b4bceddee84cabc021d789961deb9b292ce53b178fcecebf0bb960f2e423ee3d9c4375cc955bf3d6290a0b9d1b8359c2e5e807e6a894e090ba8a4aad017e5a0a67926e39b41ccb246ee1d59dd25645ec4c1b12318c00a4b5dbee30b76b7f54fc80fce5c3c88599096fe2ef6a50fa49fd96dda76bc068f119dcee54987e75002a21e987ae2ea8b4eb06e213d237537ea429a87b4a2c58f92c9038dc5f65da661d0cc0ca5555a784c8aad7e365f9f97e79563434843a6543444840e31fb3cd34e7017c910440661bc81ad0ef10b9d8c1e1701f891dc11d3146c188525680e990f7c902e36508d3c7491bf476bdc1480fb0fa984e0b5a31c6c861c82e01feb40c8ddc1cb54a0d2c6b35241b5410dbdea79b2b9cb103ebd9135dc9cd93619291bae9350038f2deba387c42995fad10bcd1510b3c0544187635e95a10bd75caab5c3e351ecb31a51a69a1afeba62ea5abd5575f6a05f9490e53f2db65e53108771ff5d9accba1634d84dd9ff34821c11b7d8d93a4fc744e854043280a9223b6dae6088ae33b5dde70373d8010653e71962a70ddee07c74bf948c3d33a5a17061869a6c77dbcd698a7a842dab3149c477f409da42bab03aa9897b0f4f0624c9419d506f7dd0e7ced0426c92e97b3e0b02d032a39d5a870f2ed7ad735979b7108578d262462fb0911cbc8854c26296ee524d6f85e00da929541e782f947dc4131994ac306cd0911cddedcdcdedb117e0bcaa06cbaa4a736ae0555bbbb3e28df8f60f7be47775eb14e994be878a441ff892a3bcbb01dc258f6b6e7b86b153a12e4ba616f3ec16353597277c04a40db87e87e4330a975cbf932b97639e4d51b7da1bb5c50d45f9f0f0aa701258598af19a07287faaa7c7989382c6f6726cd67c526e74a0c72558e82af227634e103718d7a42cb17b38595301fdd967eb9429968f98bdad12760e66304cc2858562f32d56e587bcf88d26bd591c742d6a56a313816e90b42f1dc5747f58cd54912004f6ac59741af86a959532698e812112c49024e9fe6434a0455306352a3b5b8d81262e5fb869e0caa08d63061100fb1318921c6a56c4ff61281d86565cc5ac63edecd11803aad4abbd72cf2839938315ea38bd8ad52066880a8a5a08717162a260ba7596ffad46d82839a24c802e21b19e54bc745410963ef69bb2bcdf4a0003ae3c4094de23027da195efe49295430551e41d5688657e00c0a8bb9c18d86e04c675729a208ece20e2a5b87a189b0d5b5a19e93cb3d62de6dc6ba5b1246fd01bb4353a629759439d54ce1b2342049526f144dbfdbbc36bd00078335cd760c94546845485eb26e22fb100b7980b5813d505813d5128cc9ba18609db23dd639680447e98d773e5be0e0c13e9a589319702886bb2a50751cd0daf5028dd76dd14d02975c53b002f4c636187b0d470df5b23d1d5c057cd189b076842fd2c1a564effc64a964ae575f39a4a609e210c8be4e92f8ae2348810fd1a04dabc0236e3543501a83afff2d6919b5ce4067b330142294e329ca41236212dd2ff32e3808a998c057ef4210ce5114606b6cae62b9ceaeb2e00cd144ad62a46698e9352af64c0d4b83412bd49124928fb4b10bdb6e47852eab0cb23874bd12b75bf249a3f4e56605d1ef864cde00d30cac4e77c181e774ff252055d093bfe9ba713b13a26a201bdc4301de32a7a6436f77e577c22f51d28aff816f55e01f9de51421e79a19dd4c720e20d0ace259df63a4d96334c44522648f6e2b849f779bae0a7d320583a0935d498e68c249d589538d10915522a18e34550f77b6c3d65735a8b5ae86417d244e8193ae674562f6e0553278a0d0f472da5967b5ba50fbfae0ae8cda87c985b6667b5f2e77816996120975752dfbc6c2e24cc19f6f42dc6ad0551fe1c8d08068349c9d2af3931312baadcfaaa3c1d6c9e47201579654f62534e89b3f180d1f220a5ae2a16fa652359b71bc7831e4397506c37605c4426ebe5174992129080225468d863937912146808b613865702027697ad00bb0ba3519a3812790412bc8e36a0386f060dc4d76838015dc25c5fe0c080bed2ac646cddf0e952e261c4ddc269153b72b1728b52d82a75e81882e0545e2a52110d7b729595a888d9454569a4b5998b4b90f4b943d583ce73d6372c1bc109943c4fe05b7e3851acea9873f66d523e64365685cebdece42b39241ff0209e87121342282f300d4b6cdc8e8c3792642ca5e7bdd2616d8ffd4849eee9942bf916dd1d2fbabf3a8882443d7e87b2ac9d1f339daeb22831381d7ed942ea4b96e154ebeb1e2dfbe6d19b0d409196d13d7b894202cc539de8fc04835e946be4c4ddb9151e6bc295d4a10ac31afb4b9b2d1568821d79ad67383447b748b22840f5a9b2e111ff3d0ace8c9c374df49597a91966eecc5277caf3e0bb6774cd9f8da94951e871658d005316f22267c2481a2f343bd9209643c9688358bf749bdd3bffd6a3278a6469b28123568819d7c532852aa9e56bae2e7e32e1c5342561b1ccfaf6db1c797c346ba4e1cd53d29257e607f7400654d7f6e3c3358c05e0d6883f8f8d00b17cf120c36cd04cc27a1962c40485e365051b1d01cf21a5d46754888c57a52227547b1f326a2df4652712af31945c55473b5f19187a70ce2b6adc1be7cd2c0d0f5fa4c140aa505703f953c627b48ccde9840a46b2e8745646d426a7dfa20224e20068390b3abe4ee39acb6a6ab3886f86a6a064fdbe099dc7d0fd8c4de747617e480bad5865d720c81a3c9f31927bf8d1903c0c0c8cfb7f18db19b255ce4a5a328e1cf9a480d8255e42931d6c7da4825c8852750851493ce541d8cf518bea08a679d2b0a6edb38c51500c880b4118744983e3d96b02b8bb3012d372d557d43b7f7f3a135c0171c750f1116c0f62d988d79ace63b489b654eafa2b459b2898d89b4a535723182265ea2f23cedc1de0ab6bd3b5abca379a1e48da48cf232a50b4e16cdfaacee9fd8d47a5cac0e043f5c8738f0b4d9c10bd556222be15b9a8707ebd1c0fe5806015c9e2d103532fb71cfb8038b3a1aef3304d297ce36aa6c9d46525da6a37e95b64cbaceb57b95cfdceefe4a8877fc761d907152b68cd2c916510040d5cea0278642355a00bd0f27da4fe105610ddb72a408565db5261d2e50e76aad6d95fa7baae2038a43305a2bb54250144678a34a38aed40a2663c17e0d9ddab0f50487e51ace7d9a1fc215daf67a52c5554dedbda7c6fc4318e79b163fc3d1e409206115f67d69dd0251980ef373512621077ee73a3850a5ef58c828e249fdd93ff043c0424c0bf7e898a46382b9856aa89c8e44b10542d659ad030b0021087a5afeeba5e1de85ed536f2b54ba8ece3da03c0b2c655c9e65821aae91b58f0351ca9b0655d623714e692f5f745d6394cd460f6d0a1e0046d60c1b5a8fee02df72c2454327ea0e0b2084e0c17ed6db9642868735739dbc928d0768f9b14af09712b191dea92190ff61fe3c07129ffb175207b758c6b91178b1ac35bd41ac1dd585d2c6a9d2e202ceb2275e40edb6c553a1f68d7b645d8393e3ab347c786a084dd22f78871130d7f33b9fda671b79de6bf51fcf22fcdf6d7971e6da1e00bce1c821246fb92b930ebe7a6e849bda0768f06d8a0a882097f2f6348fe82e2b9ad27a0ca0090a2e51021ee4027b0c5e2928a379d8a36cd714f7290021b2fcd61cc54f1c926c609419a9d204cb66dc88e30653a207ca8b74595cc82f2f7d8eb68d74c6c158702ed1a6c24624cb3f897da21bb0fd482940c6bc560829282ff6977a891b62d346e6400a8b543b282ff6925534456f4850016199247914de8d54ca1ce890fa76232d96ce25d1f4b197a2f4c5e3ea56a3e153090906bb14df533165fffcedd97e5bb7939a59676cc4cce831e90b0c7bbb55f928f85da162e67bb587de32f0d6a429acb5a3fdd9cacacc9f7171399c10b321e8f8a60927f23e67608ada6cf725ff674c710e44e709fc1bc530ef7d0569fb12cfdd87d7f1334cfacf83497635ae0dd3781d92a51a849af6b47d85666c0072d9241d0c24833e3ad18806f0c6e2712e0cb06c00dca151ce9792493ed453760629790066245f17df01203158a60dda52ab8da1e21bce43263d7b9d25ce2c288b3a8224d93396e6aa77a9b4ca2d9aab28d838b45a63cb74ef7e0e8e9e4a0e645ec30998091c06183f24d132262f03a4aba7092669816089a5796368153748264b4374db1b410381bebde8376c723b39abd0a14779082f9ec5df5466aec92a14a61a9928487959399cb2409d6027425fa6fedc10898ae935794ec4d44681f1c730e4077f2afe59232cb0b28eefb4d9c861a105c9560b8b7182ac417acff345fcc76c3d50e5e5ebb25dd2c2ca625ba03fc33ee6790ee9bebe35f7306d23abe12439e24a6795104530db7ea958b389c1928be48f4b03d4c8532f604929f188dbe22afe853e75a7903b426346682b068946fda9a58d4adb2d1cd0909ba234bdc15d9020cb9f88102debfbb2596e2773e797d55404f00ac75d9ede4ef675a375cc8bc33a9702d65871417fd43dcfd561ab01d693579b6f3f208a549d19c49e44d5dab2df0fc45931e77ce8dc6e126636cc232c1ccaddf7a845545bf8ed59ace5f3089a942a9e89a9dd030c65243307552869e1a48ba76ca839beab4c22d93bb6c05f86e924678080e12619244e0ed92ae67fb14ace537a3165911655d5424279e241567da10bb6ca592a6c0a69fdf526672db1f2c5c282f070c88e756a52fec1919d870e9c815c8ef408f53f32bf7aa57510f10e6726bb3caa3afaa182456b27bf8de5180819f1b85e78a779e0ab21e5f5f71a01ed4a4f06e26d3f34c8506087b3d440bbec263bb4f53838b3c248c4eacc8a580c13aafae462372c3803cc876411c36f0a7c5d3f267ae0d40ea9730a5b229d7f19338360a860bf2aa0a10d1dc339b7926ad0ebd417ed18778f86a4b87b5c508a965e27031c34bf1308ce8c5da7ec95c1271a04671e614804b98c06a894e6276a2104c7b2bb9284c9e1fceac0f46f87ae3e8119d5aec66c488538875ad46174ce321feb30b535b784fb56eb544ac0b98687dcd2e2bf6ea176ea739ace974b33e094df00c3d3e1cc3ff362126587372e465c84b306035438cbe4477ca1a3f64c136771582b0f9cf1036a8d74ec05d13c0116ac6ac812ce62d1000566c29b5cc27604c06beb627b5b3863907fb3837a05d369015270c6d77f267703908031c381f3488fd5c1536b9700f12b5b38337615a14ecf12062f7b3db6cef65d7c3843baafd34843b33c88a81d911bf3ce5af0703602c2e3e81c0e7992938b0bf32292e05c375e9a94b27cf911f1c3c2f609e02a825cd90ecee3072960236e725b8c578d18f4187d3823c2f20b52b706a002012a3ffa659c7016dc7d3722239c5fd42f68bcdb6e76882a03ce723e51b9e6f9a20b8d80b23e81c4fb3bb414443240df343f810a926587f30bfc339e6c4162cdc0d18556090a980109ce2c161bb6a1ccf100ad2b7cc80c863398f29bf35ec6a076d2566f7db5b5220c12488cbae92c1a111d5a827064946c9802cee4b5dadd52b22330381bbeecd1bf1e7b9d9607ea6097b0e2186b3f31f002e77a4be87b4b106c39a3f5f5b5d409a743fcb31d49c1d7b2006708da91f7ae2cc5b540850297292fe9384e02e7d78633284c01ce7e1ea1856d2da70e86dbc7a8b594c179a4934600e04209ceac2b2841b812d579de4b7d94be42c955952ec775383f9c6b8a00c7a647eabd706736c20a1acea96f3819d2dc17819d0d6781ee392db817d170757c918171c164c0f9813fa22d04e709d5984d6362052238fb3d6938773964da66109317d88aa6380a2b7fd63d321213e16c1d3fb611c22454429a758075aed1bd0062712ec6b36c0313ba1b360fbd4708441e94347b0ee01c611b9cd7847270677e6320bbe08801b098724ec267119403abf579bc05cf19e99f6ac737354fe7eef3883c9b5cae130eff0a351ec5f85190f2d6f5dd079eeb411539ff22e7cb1092c63d4b4844076273a1921464d8c66084a62a3d7a60d8b76e2593bc485196b8e0c7507d0a3449b9ca92b8dc321110294ddc82a47e296e2c432c4cade6192affcd41219dd6af25d33c9f400e25cd8da7da941b23e4484dc02fa07aa9c642c139f81dec81b72a346b5d6e594805426adb5f54d77d2ed7bf7806240ca92b6fc0f7db05ec22cec12fc107be7aa00b0b72a202d772b49e6d8682ea5827189476e37de8e050ba9a8215f53fb0fe9d4b51c024738606d1c6c196be9a8ddfa2cfd8ba6b1a199515ec0321e24859830faadbae219376d4bc5ffa26f2e1abb01a31fc20a2d56a14e4849aa5b5087639a6f2c99894b0ead992750f0f0818ff5443ffe864fd53cac4c99cc6697283e6ba4d6dd005954c60973f218c8a0b9bc5f6e8d24b29d8c39491884c61815416cade9076cf74b43918e46bb5aab5780280feb1c0efb2dfdc636421324b5ca841464eaf0061fb17908a70e0adda28e76ab4b7000202a49bb55ae335161e8359797204c7a7e2967413bd2fe017ec01bc4670df1de238678a7fde2b67018102962a7c0e8cf3fb0e924b3ded000537e7ff56f7e4502025703603752301381e3ccf9e7b5cf66eb8d71c9956f5df0292a2a689527ff51d67ebacb54d00540d35d56e3e5ebfc73cd6daf8a55b79a771bbbdf9037b4c3dfc16bc5c8c33ff548b3d019c0bb7e9a31d07160453d2fd5dfcde47072eb4be0cebd0036c14439f28547aee38c61cadec777499eebeeb481e0596a0fc54d39b7b069f7dc132002b458d3ccdac05243590a90b94fadee65580ea3ce900239d1e7ca3b316734d395017225542998f783449b9eba167a60044588e8ffff7eb7048d7c97ac701917f7ea156356d1e8a62172b40e9d23af9cbc14e4d066701bd8d166f3f3090a4fdd568c5941097ffdda1a7346000498d85447c5914578d6a35d8c1cf0b4414907a798d608db14c5c9790b23c7de588472990de1504972b2e7504352aaa9cc95809519a3274947f9250d5f483d9fbe4270998949d70845822bff187da1c2ef06bf58ed8cd464d1b61a4d2c6d2a21dad53b8299d22456db46301a0f31d3a6d25c815e76ae708f50edc615f1a8cdf7cabb65bdd11d4ffb035afbaeab5e846c9b29903bec53cc491d3c34c20bca34f02910df894180b1fe88b2829b6fc77b842b5e18a521834858b36917e892c80ea622078e71cbc88fd2f4a9f3e2a9c616b1da6791cea20a119785c79c24519af6d349966426c493f0535538689fd4c96008006fe581007fd04063ad3209410e538bc4afd804a6a322cd6217fb1876ecb37e28964f01f15bbe300cc25b085130a3c14da6c8778d07ab8fe0673d0d934d82316dc492b50a21a28600e490e4951e8352ad795e5a115e5e50a0cd0757e69796707558226971101bdb6d1fac961fabe8dbe68d77d1127017a9a6c31b61c2e2ca165087d65882ed3c851186841c012c69bfea93f2006cd82d4e77246224ddf2828fa496284d2bae5b844bd6f517220668bf5219102d32c7b7912ec7d41c4fadf1280219122ac7210a4b44d89f2605463554242f18265599adeb2665c14792c43fed804dbdd34caaa1214752ce8acd0e96aa53ad523151a76d07036aa61a0e86b7c7546067c6e3cf565ee7332acb1c7b0cf677133ad795008fea3d8ad0151cc782140d1cf43614d7e09ab287271f31f13267dd65f38543475e5b20b467463068ca2eb0e7073d8d7da450e2bc401f7e376743f23e2bfdb089415e111457738bf0c06c5deea9a26ad6f53ccf3acbb208a715fb76a0df68467248ee2856d90f846bad3dda49fe0a7ea05359a4b025e6f825f1ec1e4ef18a626cb299c28cf3e0a6e3a907752d3c29a1b1fe1ccc6206292b13699d56d14a0063715e86cd4de5560fe03d9cec888e3f281c3556e8bcff5bdaa4d1d0fd7dca742c5e0f00017a45cd6cd8d6c3ac337372a6841215639a791d5003945aebe9d42d0ad8a96f934097dfd0bf1c7ffe2894a4ab81c4b3c963273c67f3dfab76ad437f483f333b04f28c99b2f3f2766e11bcd3a63f4e64091f16672a0a9c0b0035a50f578640753e4455ec323a19b6790c7a4556fe3db29f45e53ffb6d017216a28f79d2f94a03616038b53a875605a15298016a2e403103eaace529108d2bdf392c3a9858dca6b93cdc62b13e5d2f3c3620ed530963a9d80caeb12a99ac2ca0c97100aa2376d16434412064d32217e409a58e52b2dc0dd8c25a993f4056bfefb3f1dc6be520f0d1bd70330d0a58cbbe38b51e80849c01b90c0008c1dda0cee27c5ae1f83d39af9e1275048032cf30c946164c4993f2453ba09c35f3fa5d8b35501b9968732d80d71edb0e18b2eddfae4544cd27c583868ac1fae11f7e9b9281b402e556f379f2868ca731d461113a23f44b00f82d5e16f192775c5aab0ba43056e1c7bbf0abd588435b3465429d627b11be2551f38aeacf3e7ef9b847b524356e27f26d72c44c54832e6c9dc606892e19f1e72a2b7c7f3c3ceff691fccda7b643d7fc5bc9b5c99aa094eb3ad5f310db88c17ce6db2d9e997b4dccea1d77cb8d04121da4b3ac551d5309608fc4cf0f8f08f6578031f02e3af1d4c7610d6bf455ae274c4c390872625c80737bbd088da042c5597fb7b607ba69eaf95f69861451e266bf50ae1b01f104f10746e41de989b848e3c4c7b57f33547c81f959f9110bd220fadeeccd81fe3086399a29c7975999f8e7cf8cc8391731f6bac0019f23026e7fc6883753d8fcd8c89a4e9b5997845201e82e359220779b8e3d9852663812ccc74aff5c951a9351c8e10faddc4b0a8724aeedfafe1a26383c35808c169d408d59a4de4a1f77bfed094c288c00d0a9698fce3d71882188c558d83198023c013622f90a0873a4d7b58f6f7ecac156f75bc691c9dd813e792da9cc0d8aec7fefaf7ab0a6f4db8dc5003c828aa5638ed2ca274d79715853b7eca4311fd8a7c0b208d7721d5969d7cb86029ced34a42664bc8f602934a93faa19fa51f4eae180fcb0899bf558c867150472d474f56bb777b294eedfc0e0b4a65967961c142630d3ea6c534f78ca6f5f01467af8b50166f48d29c485ce83e98114ad67fa6aa96d06472418e09ddd69c26b42c7bce7d600cab8eb299eda2343e66ac5ee73ce337c778a2cd178d062e60aa739ea87fa3c362fe468dbcedbfb6650923e4b6a24d49e9ef9706b3be8df2683409a5af2181b2db0683e690ce46c6ee8887878ed778ed56e16a4e71bbaeddf42dd2839f37702020412982030340f363083844442a01bd21059e872071938e78f5d522ddd96e73ecc68ea6c1238aed0809aa7daa19021966c44568a14f326a12b4f7df1ed33285b6160aa1fe9f8b093e169622a3ab8fad0bcba02cb31f8dfcc53b1cd168d5d480a6c22a8f52b61843390860d7ddb36f25aa8e89618f5e19ac7cac8d637c9168543e2b7378d0e2b141cec8b5e5c90b575c5c82abdc4420dd5996809f30ef87bb4c5498fa9fb5a8ce1db703a67d8196a6ba9ae9bc78d3761ff0913241d2037ab38f3efb482da658ac3ec26b6604091ddf8e160859a0cbe805ea34079b56203977d5a967c9b9b60eeac148a8617c05f69c5bac12d182e51b85a589c128afcb13f4cdb46b07b4240c129fc7bccd898c820a0aa75a5957aa2d5ca910621f8a902fefeb80783d923e7c9f4662eb3a995be13023ea696343cf5ff8e7d300c15b6cd3f499d1b5f77377c1b1c0ed4c3fc0b43c3127732712158792696b650927b8385f90cd1bb4f2dc78c0bf3932969921a544cdc4ca551e19f22b94ac8872ca9101833c9b94a8899d7221191dbb566d1871d24d5e976cc0cc93287ac98081a95702263bbc3cbd7298cc4007dd95c664b53c327aa14a361881c5f9a0e484ccbd53be965c87b1e25491479f5cfd9be177fbb93956aed825c5ce19ec12ca115513f82a57679f71701c3e4db4a283ab73dc5e7cd9e8375f46bf874fa2ff512cd198047ac7b4158805d71ca8219e71f5e5c7361178075457775296134489fadfcd9163166a772a44f21cc2679d0dfc2156897199fc42a18363588f3d62c1560747cc49b7c854d73f68c1c0d43669d447fc714aa9d470a0cbc8d1d6e58e37004a84a7f442b51f85345ff04c76ba007988d2e92c00e97695a7b46c7ea15a6422654c76048169a8263587a8e72d356c3290247383c343e1217687d054273d4492d687488cfb10112044c4304f31dbbf33d2a27ee0ef2710694b67d57b5d006b176ead0719301e3584e648220b9e432406cfc02323adc71d70d321b712b500be0c4ddf535e94f4bac8f83c990b25d2fa1a487a138ec75915e2f4c81f1976aec5e1160e6847caaa66d8af7657214fe1b006b01b2a35351c51c9bb23babd4edb5ad32b53f480144d003025d5445daea67300e277f90e7808cb23b2c31c7e7eb419f8db18a5150d21001172a8c9010e2b427d54afc25600a0f6d45c9fa338c95c82244a294d0bf06964cf24d4003b92047a1abc5b121254584695ddc77c9ce4328c2664aefa30e8fab3da99582791dcab10d89cc5a5548a769d4410f900f19e3e3e0cd5659d04ebf36bac490f224ca87caaf460627512611aa9e64b08f15247050d70fb232c760ab158f11f30759db2d6e4b759d552031850379c910c887c84ddf87c0f398ccf4ac976fb3672fbd164d08339680cc25886a4f33d7e3ad914749a7f5caf1d68fdcbfc781836ad026aca9a685428cc0dccca4ac8adfd2360514922df078021601758f768bf43ba112abc9b92abe7151262762bba94375593d49e0430fc9a375fe1463601e92b71557f8b4aaa6d5afd0f2d6ef33bce09d024f102132516da8a24b1e55d807c0d7851acfa3e86e1592965ff008ead66e9abc4daf2d8bf716eead26cd9c702ddef9f029fea69050927c2f8bd1c858c129d55a3445d3211f5ea109b471701eca9eed414ccc24646093ed4c79c14eeaf92d379580792f8bec10cfd6cb7399af3c8c1b70547b2d8f683ce22dbd12ee7b341f6617f57b5a27137636c5ddf87b2cdaef8def6c5e5a43f1c1800640092dcb7f596c38ad0cfe6e8b05b2de85fbd44b78194918f02a8948d4157e3f1ee2db2fb16758ede76ca21b389b52827e083566338a044a482396af9fb246b5cec366ef1a7ab79418ea5003b4b29ac855035dc62827238a93e6b7088bf164f340673e2e58580123821c03e222c07bd48698994b6f1a9fd895b002848824100c96378d38d2f2bfcd12dde0eeac52b92594e7448f1652ef060a98e38222aaf8c8fa3d9f642b5afea67eb909a5399d8596bb20cd6f90662ba1b4a45e851503e5029d34945355b64448835818b70927b0016265c98699a13fdcc37c896ad1b480b8c9d3b3014d55c71d24b4669eb1a5c94736e6c25df42963641c86e0c0a93bacf2aaede10beb878025773512e83c46a12eceb5c6f223b32cf258af6006d427b8ddf94670f4d63ecb472912fcc138db5bc09449fb63b17f8c1a31bdb5a61f5dfcade59b6640b98b795b267c1a8caa5cf2259ae2d5cd315adf1062f62afc82d00f02868527409aa6379b42bc5f0065e13946481e9a4584b7fb66a48e8fdc94f27de0db7440229300ae09498c042082ef00e18bb76fc231f0c222e42d48c651b5d3ff1885812a2ad91bfbd5529cbd142d3b88299d9cd0ffff937345fa09ae72aa05bf2fb886c222cc208d8cc40577ea0e2c0bab1a2a61a95320207409fbb861ab6b496272b215f91f37fdda6fefd239e832eaabb62cb159435f8d6a828cb897798a4daa83aa6671ca829435ea44fd97183121e4d320895c915dfb0a7522ca9e51bfd33b7da46b38265d4cada0ac099256ed274683bfc77e8b7dddb6a3623a5520c48722f428c25b280f2bf95e751788cc543400c23ffb57b9c8427cfde2a6fd74f103f85632ec423784900a98071e8058f352bae0bdd1303aa10fd2ae380a2525c45d630cb3ed0cd8bbf5effdc15ce82c9c41154483a272b4f92af26c50831717b0918eafb780a6bee1018d265e71b6f7f54f537db82af09c411d4ba81208a314718a80ad6bbe317fb0c137d3984075250076245449275cca1cc85aa5452668194ce6ed7476951d7e44bfc85c34d4e3ee621320b1a3262cf6d538f3b960722186b08f5c863aaa5f1735a2900a0cdfd4afb63c89a8784cb0313e1e450eafe46c4b15ae41af28ca3ecf31edf5cea9912bf58caac2f75a6358cc78ea3849cf2a645e8c2e4a138c5ebf7cb7aa3bbb345b0adbc9542da440f7d1b8a8b73d22976b52266526ddd4d88d05bdb2b1d96d4f27ad073b83d34e022fd6f432ffef38fc2f4bf87b7cb44557c28ac6a215c8933116fce96b74c16621d6c32cd3028adce70ae3d65448f4a9d76273630be06b77fe17f2be84794a3ae239d51636124b47c01d2004a06ac1cb4bf9b43a2be93bafaddbe6803ae577f84685f5f72b0f7cb26ecb8f92bb1f00986fffc379dbee5445bca05428209449f42a8ee963f07e5181da1de67de91ccc054ab19c1fc19841598f8e717000209e22ad61971ff4638f143097072f7a613cadf014f48a69364dd157f8af52be745443daa6464b26740a7cd06bb0935249ec2e56d2458f685bc4d57e78e9d0b5860889e139256b8de77d9e5052a42c495dd2d6699839bfed9904b15b2679cbcadf52563d8bdb3c8dd861905b996e01f05d03f871468fdb8a821e6f33060e1068e42cbff00e954f7f4e5dce616859a0ac42847a0813c077036f33f68978b3333d9c4372109e541bf35b2234c13666868d4dee38d9c38cd1879ff0b4721aa0c6a532e3889a4424666f0b21d0d904d3043e00be6a9f47318969c685fb018ed650c131a1a02d52cacba130e11dd44ca14ba74502e35d57b0a3cf536058be82c0c5aa33217041c51ffd0da0c112278418da1542b4405d7c203add0f38af48f2001abda7edcf9d69da6b1c00f97c511027695f9715d8777a0595ee03dd1f51291125712998730bc70c79826ece3c6292a0853506a014a8a479cc6edf94fd8ca177dc2e72e81eabd3fa98dc6a979842d829e66fe2483e6ff83ccefec70809b5ef6fa65b4ee1fca10d0a2564a34ee13ac7bf0c6e806a2def00f8141351d4d16d0d20b617608bdf482eb03e311de80d7daa5641eac5734eb4d380410d4df118d723c2f1709b3fb40029897c01b9aa84bc2f1dc624658dfee2b943f3fd11985ada6e0c928ab133f96370d93fbe32422ef7a9833b2d7679bb77a3c1939c618050f42efae4469b84b2b640282b7e6102668ea8f45962e838eca65bae2d1424beaa1a3f7d25504e44d26a8eeb2727a8a3f2446eba5e959a6fe239e247c2fc1a483cf887b10e8f4111914e9ffa870aeaec6b365bda9ec1a940172597e06d76fe90d569598fa91a62f838c655d2b127df93ae5f608927e40ea2ba27b811c12793f913ff1d4e3e6315d89929e422471b85cb8104fa1ffd841a05fda8c22f5a3d939ba38ceaaaf8f928891c656872a9c368af98e54078a98a566afeb6797846094175aba4e94d4d25c125e170947b6a00e6a7cd3b19befb5b37f44c24ce1eba1a752d081cb7a075c1c209f67b0bd128b2acd01eab3405d9a4f521ef73054c223e78434a983b15667826072d8b5066e100ff97e3b3049d4200f7d441f5f46d7163b265d12b07454a6e0d355a56a2e1d0d955fe836b8880412faf0c67c8466149a6a96379063391d3bca243bba20e454edae457c4765fd48b8a69f4beab27775ce7d20ee41952ae30e5b50a298d9ee97008c29b4cd05ce8c80b612b308fcb61a906d9770c79c4d872bafbc232eb80768797a0ecb030640423335f9053280f80b28009aca90468bc9a8b307b094abff2a7af19afe78335088e4520a034a9a0e889ba977ba66b0ce19a3104df54e5b6fc450e8a15f3360006fac25dcdb355255e6b71c2a0b91bed1757827f2d590997a6d38a4e0fd87468fe0e3d6c4e063014f72585918f5a5db9a3c6869b3485d13da4067a1713b40d4786d109b112886ba469c2fe8685a660b52229ec38128b4e65ec273fc8bc2ea16d494753d82a3bebb75401dbd0e5e5ddc2ab342e791708e8fd1360bfe3bd395423db6f66dbc1850ea372a30e2662a2831b30b92cfc600023aa337e605318ad40da3d47b887ed00afeeae0782d8e7b07fbadeab6d4af43a57e59cf91bd4140ed01391b17e43caca98438028c7a64e0ac48fda0651322921a5d4c9269041743421e1414a1ae50b6d384e3f1fea7ae4f6d8ed0f353342b5217f31735f7b65567750ff481fa69fe1133ac284ff886ac6c2eceaab3c869ca31c79ce9835e035f863fd10ed0797b9a68546a563d113b8df3d4b6340fc0f395529c1b37a5c197796d8b2271e3bbf416206d775491d815eb136048c059871664961ce6a06a8f1ec35e59772eb29b793728cd89cfaa80c1261de61e8187a1fe1c6de0eb4a770f1cbcb47f04110d8b3247fbd9d12cf35629c3e2e83213503dca790e208df97bc4493c9a53430420c1f98193323462a254f1d9e88fbb27fb01174a852abe2e01076d0184ef39b622a9fbb91a65383b98f3ab87c24529cad098ad2d7e639112d0276244d6ed53059e8ee7145006381f6c6a8e268ae6476dad419944954f066a0e6c8aabca916f23e763f3f44dec4e865b215535d0282af4845ec6d60a46cd020b1d8d43dab4f22df5a672a960dae07041b3b9f032b3dffc82429041b02af5667275b1692d149e148308a5734e953663a538063f727b3626e1c8d9f4729a136398b0c5466e5e45cde21ba4797646fe21c9a193fd0a6aa99be6dbd70c4db72a87e221f2e39a371c6ba2867d49a4ecc378ecb5d0f97786aaccf7bc19005d4d2dac005af4b8a4efcdc082a13a1a3c304e6ea037033a1480d5c5b084c6c16ab027e69b0102a07b881cd59d581d0bfdd5747cf0f0f7cd80a3727b914aef76c5a295371660a9364075cc9b81a8c9612eef9b8134eb43135cddf49f64300785455f09b84bbdead443fb36031407995c7a63b3e5c8c1d9a4452a15ac0b2aa8601865430b8934582ea9518769cc360d5252605da2460db3315bda48a48171490d354ce36c69919602cb81af1c4c13b03c13d324a09b27ce804dd64c94942f6162680c33493384485a9229c565c741f2979f3f5bf6e8bfdb4bfeeae780658d9bf44fe1358f00648d710cbe57e90a797bbef8e54f20ea129732bf56fa6a70ddd2675a61ad7c0366030ca0b6cac8c5294db440a7889b0460e2926f767420928d66ab91c79e1180961a0200d054ebcf7a0db149a24b5e02553cebcb9e981f3ac36a8c27e42144227d5aff51732bacbffee934d4e7e6147d7981a7265bbd0afeccbff55f09ecef54e9441a42cc71ccaf75bccc603e4ba4933789944a0c0b6881a8402d9b4dc09a7845725050e4948275d44b4e0db11bc1d32d801467b2950d245cbf205b6705eab896bf46f73088239daacf1af522545a8ee8c74c9465eb40cbf911f7552dd5fe9c8c02024e7c19a6f2d43fdd2d80f10046e1048f44cf8489d35ea43da39ee14159b9f2299c646a71fb1b74647a12f70a70315879773ea862129cfff0e1ce8dc3be5940600aa8c002f615a428a9014bd78ff80f887f39feebe0ea3b26feed69867f772efe396f1321774f1ccedd4c3ac5c0f6cd9a5acdf71922574ae3fd9fba59934d8581f705ea8fe25c34c0c0220a929f66f9d4b526cc4a827b5385cfca23f088b88c230519de11656fdc63b22c391034a296c6c06c2e9391d12114cb0528de0c6df8e2a0044ff035c24ae27cea02fb2f0904713bdcefc0998c069919f3ac1869661e54b3b35b418d91a4db21ce31d2e6e8cab63b642b2252464f4ba9a3979ed651833e8c052e25efcb0d722e3bf8c30268d21ff604f440672136a8214fb7d5c9db4ca2f69b6dd8e3e79e700517d56bac75cea716f08742b180865364a5f953d8b10d86e865f545a200fa2c42e143b2a6bf4eaef1314bb373130a5284f8dd6119570299bd035f92ece5e097041d9701065e995fde364e1c134c212553d795853bfeeeaa5c9ee0b9eca1a4ca7469dc497e39ba3a41c1650b93cba04842ff95041aad826db330387bce64691b0807ed0ebaf1367004986ded71d0fd4193725142b2a9806363713f6b5e52a04f55e3dc4676b83f08fedaeecb32d3a8c214b549ed2c03c36c0b81f7c8183f7f9bdbd768841b7efe02e929f71c7f94e8d47abe6f37800cc36cb3fb6acf8d5bc37b9ee579ed18e3c041f647a77b370e994909a40d046a361fa65920923a4a8b01a9f14edf7f4ee0356cbc57aef3163142b01a7ec74563d1785d2c9ddd6905be5ffedc1f52f5ea7d43b550850250042082a87c98010e72501f4fc185ef7e6fb0fddf3e7451fde8bfe8db6e84882422894476f70e450ad909cd09a7fb79bfb1b06927c2760bdb89b0222b6cfb1f79ed37ad87d60159fa06fcd063538bd04128c2e7edf81d113aaa83c80d4334aa91ddcb6607734fbf1c678a6072e8f8f6059fd2ed0bddb68c7f6fa6f1366ac110b353a22f92d91f91846167f99b7bf336baeda3970864bb9d198a7a7ac8b3d17bf7ccd2e84f6eef11cc8e47e9539a3d8b5946f590f7eed9b32e7ed3aaeef4d8e966adcd317abc596ce9e397cf0645334b6944e92f56b1f40bd5f1cb17cff3e8b6452f1b99216cb7cd0b0db365f498f76dc3ce6d56cb9dc558053f520febf8c50b8eafc99ccc393eb30e9ce186fbb475f11463a74f5fe84724b76f745b3df44844fb49ab6cfcd2fd8b5536d69b0cfc11511d3947a6a61cab6cec19f6e5cb970a66a3dcb67d760f3811c5b42c7ec1b2460830fb1bbe8298f2a4cbded9f0f504ca0ec209104b9436b7e39f6cda02a45dc2862f21b66c219e3c29b385a0b2eff6be546bb2fb0cfbe8e973ce392709544cec3a21a84f0cce25ae03c23aa0a8e94d3e1dcbde6f46f1cc1ff026a5c201e110fae071d905b9fa4b45fd7dea6fb531fd8da0dd7bef90843beed5feb8430f69622290fba85dfec342f88e10e8120ffd8de00504fdadb6c0d1dfb3c078300cd3181631ed2919ff5d6bd58e6767c11e773c6e3a9c367f8e0f99c78e61d9c5309c7bd951f1d87cccaebf1142d0df8a87fe0e825655a9b17b515ef5e168a2a93fba497dba16670e1b538755da46ec272fcbea13ad627b47865bc3300cd31f356a618f337e451b7bd4d4ccfebc13c921d461d858a6747bcf4ec34420f31925b33f2f7e72a33e3fbab43f2fbbf77bfdd1a5ed5dfb8e4ebe39c5dfc7693591dc570f614769c8835d638d354ad1b363fd76b07bf1d8519f39e64fd3976e2d63d877a0bc87e984a07eefe5f99f79934f4f659aebc8d95123ec2f4659ed2f46e97294093f9be2f97876c5ff46d81f0fb7d53c7642eca9be6684d5ea4f79fa4b613cf56777e576c6a8899e1eda3eba63d488648d56d96731cad4a9238cb05afda954947aed981112b6f7cf0809dfcece3ea2477dca108a105f3b21de87b0ee4ebb22dcf61ea3ccbaa3c5ae316a1815138178faeb34151347c04ec5d025b8356ddba8181eac949a7246fd1921c10809247c4648d0befbb83722896d9b46c5449cf8352ef401c2f503977d632724eb410267af1fb2740e308a6243d8e3db6eb767871d91edd97f24cc302c9bdf32067d5a20a25b3b1c72efe550d027ee785786cd7967add9b51d90ed88c84ab1990df98c8cd8f6f266595c31e0985dcc4ed811c12284f671ffc86df537826d37fd056dfb19c4c6f69178667f46516cab2114613e434111a4dde2475e582a654b2756b68cd4b5a78635b8901e814b2ed726a2d9d82725e236f6bab4690b474ed8128a204f846dd90206c6a60fe1c8093b42111c0085500d7570a30c40d0f3829dcc87303d94f1c18cbd4c7aa6ac7258b0a4872636ddf0d503191cdcf9103e1e3b0c072de6e0ac477cd34a040ba6919191110b17d50bb15a18a65b55cb2e745fb1d30be163df94b6773a2e6dba456d76a1eef4b57ebb10cdeb2f159bdf6b3a7a993a530875ec583bfe09eb1666752bd3add6764a7f2f949dbe7b727a774fc72dde69740b3bcd6d74a4b2535fa35b34bae5e956b7a5fb76ab57682509d9df67ba95ddfb49c7272d7a936e799b6eb5b6a05692903da75b57b77e34d62c7c4697a6e39225a525a91d2f54a20bdb2d597c52abb6d8ea94974ce32d872c4c5ba5aa5994c6284a2b83d1b6b849ca7a811f8ff4327566cc474988a61749646eba6fb20c27b06007745fe66609ccfc818414c2552a1d97e2d28d5eeae8ee4eb946db5d4b86c84a92a7b932a3a46e41e8c7b9d0007e7388731e03d06f511db71c833b7ab7b987f29ee3de7348d510efa87b47fd9356a04e1d76403abe9a7f310fd5e70fdfe424cae342ff4d520b42aadffc9a87a6bae846b76eaec2a9591e3a72c299333fd8aa2136df6ef3edfb4648dc717b8e6fcfa1bfd3f16df29158b3da3f5276993fbc6c59410b0b53670add1ce75269fec0d1adb8242e993af3d04bce3fb8f445174b00ffe2923de36f32ce6316ba398e6ee5df7c476e19b1765c76aa14707e731570f42d109fa8f4cf54e5a5a24865eacce32829452af937c7d9517f3074a06ea31dbb21d502996647366241fd79d7749cdd4f58bf30f7b7da437208b6bb0b20c72d53673e0039e66400e47c9d3f2c7f43514b4d34979a34692297787ce27ceef8bc44924be68f9bcf7b1742564bf524211c4e9d88935b384f12c2f377e4d68e2709e1bfc94837d7dfdc15e9664746bab92a23dde824aa8f9cb0e9af3f49f5d03d54daf3d662dce5217bf92bc3092c9cf338fc8e674838ba088443d6cd55dfb09b0d5f3db8f68d9cdc327f2409e1389fbf93838710f6a0652b4dd9f3128bccc27dfe2882383c0e79363cc4d178eacc7feacc0ff3d03b3f38ff76ca80f346074d9d1d2f8261c7af5d3b7ef39bf35065f8d9a500593bba21341f3961df879065388105c2a56e41eefa24207c87def4c73d0908bfd190d32f60fb6a2820e812dc5c5ab153d3df0bd8de52a1a89476ec824029019c3a124a0976bc46259ce3e8d4d471296d552e812a9760c76fec827668db4100b276683c759436ec80826e9e6f744abaf63419e590374274f8aedbb9e557b2cb8efbeef00977b6842f162cd9f2d583971db702b6a41b67cef06281ebd564cb183d43707935a1f26a72f46aa2f45a0199d70aa2bc56d06405482f159469f252c1929e215e2a0083553a3187a2f4f0862d9b9e526a002c66d005958207276ac073c3170f5578b8814919fa23c5809e1830ddf0c5648d1d0f9988d9b5d65a691a2f263c802f263cd8338e1c9e9e1ea44bda2c6253c21e248cb55082310d68c0262b47989b8204731bbe983c9101a3367c3151d233830f768f0d3b80c9d9c1cb9c29026cf8da81c9ae1bbe76c0617fa98984933ad2984e894b03a348af0de90b7c7558f160dbe0a026212971b2c2e322536348a909d214314082019627e060c29584431134280184452a82bb392031d9906cd0c2c053e615717877c3970e34b86430e0a70171783c4e660fb829f38a30f094c9e3845ae171b1298558363da574062466b0b229cd1bbe742862e7d8f0a5c3922d9a938c041e05f424c1da86af2558f4581560c3570e5f72f0627f2b1fe4c0450c396821c3b6e12b871b5058719e84f684bd4b789c3031b9c09381c789d403080209183134f9628b0a525862cc0f57c470041b41b0e8a16b531a94d01a789cd81ca2ec2df5882dd83e85930313ec0c0f150d26b4cb0ef3a701130b1a64ea5f32831a7e1a40975ca921954a91b063f586af252c58a2647f3b5b6c9425486658e2eac6cce02489141cd248820318243774d901d8f085830c70a8527b98c0c0ad33f284c13a48f1448a5d8f8a51723c50f0b713d441abe1d3cebc66f1ce4401099b470cfe764a38057a2002c9b52bbcc1aeb87e0bd875cbc636266365034208eb0f862f1c86d8f119a6b55be90382d9da3f23104cec1e9061bf9f5193fd6dda0804b3636b6b1aa6c9ad05c93418b63d1277a68bf4b8007fa63d29bd01968230292003692803030f47e4d0431563ba2803bb403a628d28beb8614c1032d82e0e2fa84a969494c1b5d65aeb0d4a52fe88c00d5aa40edc9fc52970d18841936001fbeaac662677cef9a855438c6c9448591cedf97ff5726655ddf1fb304d07d9545607d9b62ad341b6adc274906dcfbd7f663d32a324323535b251ead0d3464f1bb8470c9697b587663b0bd08a46711a610173c58b0d4f44381ebeae64b9b09e38b942ddd5a50f58a1bc9e707d5c98797c83808117a80da90daa2cc98ed1731ace0eb7a528d590b8e5e9c572dc477bde66886d23abec9aebf8bcb4b2b3d3289b3b86b4b9e3259aecec2a22fa33bd3e7b82ccaee25ae2061b7585c99cb9de8a3b22f319eadf69dbc75f8e3bc52e48087484606fef88d45cc74d5d8c02d37fddbbc8799d90ae8b5d903984eb88d8bcbb4962d9d0e9f3f1c342f06b0d50cddceee5a17ab851a710eca1fc9d2070277c384207624041c513d6ed86d89ddd6bea82cc9bf24fda26dfa86152db9ff6f9d90919c1906d047ba3c79dfeb45d4fe750fd08f6cd5fbda4dbbb5f9b9c3acd39dee5a11cdae958c6ba20f4f8b50b426fab8a88e93a6c478152a743d8874cef6ef3477f6f57243bbdfcea103d3c0da65529ad1a6273d36d6ee2bafc61e73c791dd986fee635637a887b7dcd4df5524e470a90b5c348869b2781f0005ffd7d64fdcc9b1c36b9260f71bf9a46e3ac22c2dd74ee26ad7111060718196daf43c1280a585bbb6843ed34c3b0b3d1deb67b228c3b11b68f64dbdec4156d7b2484ad1d5e18b6ddb408529b28b5b57aafc36285cb9edaea943cd9009f7bd2c09b0c3c25100ce14b092b5bd21d281165c3571256ec1f1bbe9260b2af097ef58281932d81f8913af23d66e00f5ab182f421f42d6f04fa4c2a66f607c7d8f1890be5ef0ffb65054caac796ef3183b3820567c39795275652e0c4999c0d5f4e74d163c397134890b0e1ab09389ae081091bbe9a30a2091c6acc88f1bc705ca8f0ac1051a30313496ed2d8f1526df8aa62e555e5c98e1e3238fea330a523870daa86e6c69b4e5cc8a136ddb083281f17ee6d21b765191c3f87a6965b69bf80753e6e2ced23d97e81a633ddd9bd806de8d342f4b25fe03ce8d34274ed2327ec78972bc62f6e5402c7dbd7125aea8f404a72b2afe434952d3fee3ad994257f40d6115e7c1645af0f4734a147d1ee882d3b27cee94dbd4375b851087cdab13189893433c7a056542bd894ec899db2442bb38d71392953b670b7072db1ab52a8782c7801931e3b0b60ba4d708d81ccc93af192d205d268483756c91104e77b98c0df8e14242398e4f45081bb0d5f529c4869b2bf1c586bd502633aa34b1886d51a065231b5d2a59a651c605a50060c982f5ebe8001732557370b35d4f0fbad95d4cbaa8bc4be836171d39c4d51d45622f2dc85c873da68dbdffbaafd66a38d11c9adb576c5ea95bbea61b167d9b45693b64a39b3634455e93910e7b01edda8c4916f79046fa971209028648c388272c6bea64af7b7b33f23246cfa09b32cdbb6d6ccce7b739838829c9a8a8923dc9a21092a5d922b496b95dc670487521eb7590c4906a074a9c78e006db7473470249e39fc8276fdcc99fe22a5ff901d3be66d1008860b469b522dbb5e4564d6287bfbb4c943db6d4e03c5caaeb71957736ab46fa0081c97bff9d122759e1a4d94d1b4d9afcdd9613724a397c676413852fe489c2c83ea49224beb84d8947dea36dfd0ed37c37d9f09e98ad0edf636fb7df633e18eabb48e3bc4ae12624f5379c8e67073b985d473dce4cf3b7d2a17a9b7fac3eff4b715c1a7bafbcf1cb2bde639b210b8b7abb24d1eea5ea33b9efc190d79b2d3926655bc9452ce5ecafdd2ffc86b2fcd2d5c8ebbb6877521daab711b1421bba68f120a981daf33b9fa995f2b08fcfe91b53b4282a31850e0da10ae20acf99ba7a7540fc14f7da48585764af74682f481998e3baf5e6b338ed3e4b79fb63c5fe79472a3fb9457f79a7286edae6e9c2314616eefae7540dd33dd9b26924462fddea637e5ee32952b538e562c67f22c0cf026334d769a6ca58ed6719799fcd6b8d38ec809797bec80b48d6eba51bab10c313486c0f055849657114a452051c4930b5cf8e39a20953e22bd7c5cade68fa7567bd61d2d1721bdf66a24d8447367df3290a66d9e9b4a13b8c343bb2da79f9259f03f408115b2dd3d4de4643d4ee00d506085254ccc96d4ce523859965dc15f2a85b342b6810f44207167678188045974255d1891307c11a1b4e16b082b3602367c0dd1c3ae96daaea70a8c7d6251733d587090f42144810824eefa1536f001e943be3e6219a2c9a69f7772a1bcf630876ec9adb05d0b23bc29c37de4cedb016d50aeea36bd9333cf394ddd3dd39198a5cb0a902b4aa35010bba7e6e9823ffaa57e44a4253d5a30fcc7f36fb54d9de99aa2c9f4abf564c15fd42e71b65267a6e4ead69b32f72d5722bae9f5916be39cb05ced9e18e07938b5d01298a749942d1f9b48a8a589953eece7d4b21f0634008520e9c303e3c90e68bb5aa54a01bfe62a9c4ef31a8de4741a6db4af67e2de19751a95ad699ae6e40ac2a93fabd42d7161ce15f2e5ec6b71a40fcfd6d7bcc709fcf5d8f5da7b481f34a7d3bc1ae1a957004d8622d46428754c5ee66cfeeee72da723dc35d35cf5a45403031a23d3e6128f02e23de4d99fd1923daf41c0b3bf06eca987b80f65b7f4e3f4c763f7e9f8ff50a7dc651eb9f20e734f167cbf7d47fae8608f0daf694f7f764f08a1fe38ce6af9eb11c4ea0c66da491a060f955bf440d1030511854a9462557a40fdcd8865945c7d3bd80b85152756d90207a70ab6d7926a1c25ac8aae782457979288ae7a7056833962c96799e460dd6030fdfcacc76615fcd9207272a44ee4d9f43d628c31c62a050e9aff9993677719255790cbb7b3b3b3b3b3336f2dc69afe5229ab75ddd914903a3576f4105efea0b6c70618e7cbe992eae19202836118771a77ad899ab24729e65029b992af5b46292f4d71ea60a9e974d33dede5f0e35338873ea947fd19c9c1357f39315bceda63961e3b14a1d66f4c6d8dcd0dd5df337dd601a52cd12402ed4d863b95e9d69173649b9cca359926c79bbc63a0ce74d34d9aa86eef98f71fa965fb9f698de44c3a33ddb4238263a507626c69948a558d6aea99a2878c153b73e68c965d4fb74e0601cfae7a886a2b5d20c8d943f4d8e1edb52db5fd47ae76d45c771fb3b8efb96ce56adbf4672407ee0c043990cb9c9501e6e46abaa0278a2cfbfc4f967fe839e8e3c28e212bec39753687e8650e92ab287d649ccc43f341a6fe61805cd51fb9aa158a5087401f0ffac45d663f433dfbd5b89c2e88d136511c303bfb7db9a0cbd64ebd7bab695e6d0764bd6ff17613614365eff6de965107f28a04c910599693ba08cd5e900c91b50dd14ebd6b47e59afc799fd103bc6bbf262eeb808ec43334fb7ccee937cefc759ff698ed8a64b7fa9b45b47745e8aff72be4a3dfce7545b2a36e334aab88dc7b50fb90ecdfd43471bee636595724fbc7fdd33e77848204e1013e7bec36379b5e933f1afd196da238e43d6e9c87ba6b8f365ede38ad71dc10487b9e72d0c7857871e700a3283a2173c36e08766dfb2ccb20f601268d8d367722792484edfde6a1ee70a78070e48afe87cde15119db7c31b3e186fb6ebaa37cec509a16df497c7b934d0774baebe83fd2c9136abd0f779f49bbf01b6da42694a76445aee86384cfa13e4ef0179d58d9f49ba67544628ce264d3c728914a9c12ab401fb829cc72a0d85cbb943972456b5724bed35f77d3bf4ebb60746317ff12c3c9fe12e58bd28edd6d277d74efba22f8567ff2f85c57c4f4abbf1c79930b465b62db154169dd909a1c95d0d3e4c8e407fc45177d0d67d95c1eb359a48f4e4bb4a2eb7e63361deb803a9389c644137197e9f66182e96d58f8a85c5122e943ea9cb7a04ff733757876f8088151a01f4f8ada15e88f2218725cc76d4e7568d75192b36c9ee3f4ab1c19ca126c88e43649bd92b23375fa3b3d6a2a7d9c7476ca61fc4efae84e8ff38bd3e54d0636fd6e1d1036619309c7cef4aeeb5272457f3b7fa020579c90f4f1753b64366514e48ade0707dc59b1298e198520d3efed804c8f510f759758aee817956c72496472b90ec8747d80c01fb4028520ae03925d9646e44dbfb0c3eff20b717797d98824327777533662baea48dcdda7c9f3b407a05c6171dfeb7540dce5ee95d2d4016d546af6715b3d542f619437754072cb49ee4063be625f2e82c15e9ab06997bda68fa02c413ec959dab3af56964c52111922927b62b5aa88442b89b816a33f61b31ef3bc8c712753907a6e484584dec33f5de621ac6b1ef20e379134416902cd3f2249bf797cec3419e92c1ad9328146b7a02ca1be457318a02ce174284bf05ea529cfd364c8bab003b2e7301ca43bd6dcabf79f69ca435eeeb28a083d777aee3f13ca95dc32cd6635abf5a3265977b81af6cce61a2569b7b9cdefe4501ba5e1136475993b96f4deae7b87fd4eac0886716b6b45b0b83b7cc21a56843a649d4e5966833d43e5c8ba9065938b50d771d809a1ae4317e568e1a21c6fd9bc26474ebab7c949daefbd272d6eed9e32779cb76730cbb20cc3eab525617676cc64b398b558d8dd5b45f6b75efdb900c396cfbad3d3696edbe974aa9a76a2dccddc49522835fa8b5b229d5563b46f77284da8d1ad24fc56d2e935efb05f4cf34b93e3c62649c3bd8bfbca6fdc6fde5e93214b9e48b6bed6feec89a4cc708316a3188cbb62698f5e622831d159f3472425848f463bca0eca15755d08a90415c1308fcdcf2e6563d8589876cdd7cb18843616fdccae8da58b603885b183227e70c41303d4ae79250abd972c5b9e040584d164cb1e32029f71f0d7833b0bdbc63408e06b1cb28160db33f26c193232391e30b258fa25c9b5a1865376388c9a4186c393bb658a3068e080d8a224611630b27859dad9862f2f66705fbcd8411730aa7c51e68b25139731fdb9a03f236be1b3ae48bca6bf4ddbffcc2cbb60f4000c8503d60ef7c76d99eda965b303c224d0503ddd34cb126b5fa83e37f8a4a076915bf0f8d490c3e353434e86e50b2edc95deefe37d0be9041677a95b4942f29e6e799742f152b73c8d75a7934416a7e5e335624597cab230756866fa0a5387feada4eedc3d6df2ae694fb782a60eed38dddad9e092b6a31db2b643566441d60bd827646d39cb5f1cf2c0fc9fd03576a60e2ec5d1e9a3c38ed538b93aa2892562d8d0e5072a8ec82d00030e36962811062b7b950103237696653e4a50ab1c14e652e73814cecb0b257bc786af2fa26cbbe1eb8b271cfd0f7f5937e6a22e059961744102909569cf640701c84232c309ac0cb2b42331ca461230627541479a6e250565d79ee9566465bfb10b3a8adf5441f12aa852481212c2744b86c8c27e35526461dfa8a45efdd4a1f45ac690851dc2ecf4b58b0064d95700b2e8ad0064d95f3a25964558a9f52a9258941d49a667388155841d09a6673881251f244fa5a42a7891a1e435060b7c7288e30636c2d0e06383cf0e5d80d1c5161e9c6d3270f6786b2db4b2a5ccdc2f0b3865b3ac1d835e76baf0c095e936bbc7a096ed311f991b04a96df5f7816d24b56536a74f0cf71e619c8b92824ec726134d515290e934ba65c4f2345481de5365d79eddfe9e72d144bdc8f45692d0e928ddaaf9e92d9ae3ebc8aa781d872c2faba256a560ba7715e675680d5951b67c565453a4e3de63a74a81e6a60bd1dca42327452d54f3a96d2ea2b9496bc7b204ca76ea6cdfe4932e966c49bba023ac8b92ec299b74cb8875bacd4127cf3379a6a0234fb792824c67c5a023fcd36f96599029d09b6e011d9fa679abb9d0b2e5b32e5c5c74d9b10352a5e07934f7302d64fad4ad9a9bb435229fa9826c0eb7508ea3ae23d3bc371af41348752f446fbad0bc771f17fe78b613762d3a1d759c8b741cff52fd6d3a7212779c8bf06db42c8bd9b3bc619ad0e9a82dfb96ed29a7a64ecdb491d426400ea4e4604b1abdd190b7d1454942f8285d847f0a3a4252a3559646ab322458abac56dd0b099db42ad3aaab53309d5e056fbe0b2a1baab46fb737e12d0b997eba965330fda45b49560b79c7bae5bd959d9541169689e8964ad748931807326099e223c36b8b2aaf2d8eaeddac766f013875b22d9571bfb700a7371d6424358d3229b934f14101521732db7689f2d2c20b8d8bd7acd8da6fb06831450756bc749085a339a73a69d8c31ed68478683841d05cf753f7014ea5c2b7008f83603a87750aaae35c4885a38578700741b3b04d1cd6346c24b5bbd48d8e7befbdf7de7b511a854271f73ccff33c1f14586bedabcb18af2e56acb5f1f6a585936d394ec5fd74958793b200ce41b080ea3c5499474a08e72008a9ce03e74220681c954ef17c20e575e1b227a5b1d639eb9c531e995bcecb493919f7e46c1c211ec639e5d428945055a9a4945209b1b8e53c47cfd139299c94424a2985b0d67c64ee2a2b9119446f79e9436aa9b53cd545e20522c618634764ce30d0460921841042082184328b0b254723a591c623ad39e5189b5e4620f08b27a2fbc3fec1cb38b5df89d529b726ede186bd5afdc98cd95b3db461adb3d29d1d5369f52a5bafc22a9db25eca4d215ca8c8674db260b2b70dc3b20ccbb22cc33221f5f4928b5896654374845ec811a6a55cddb0eedb3e4435cd0dac5d7ee8da2a3f14a5946e944df6791d594e79d764da448cb0e070667f46585caeedc2a4e2da5b0b5a5c9b9e68dbe2c2a83dcbb83ea8e4da54e788234c541c611eb2b1331b28c23cec503d3f9828e8b37d1ed3a068074464eb89037fa88d4128024ab341e5d8b2dc281becdadb5114cbaab861d9a75d7575904da56d57d50dc322c568b63d7bc6e5c98bcc8e5d11232c4b5cdb05a328a8b8824c2bae4da9b836d5476619d7deb4174798efb838c23483e310341ccd704f94064f9c56657318cbb0c5186b78c3185fdc610e7b42de9781fd597963a2946e1ba5df367ab7ac03425dc1dba15ccd0dd3300cc3aad60161da6691258551bae5b8eb770f6fb665f0f67b39746976b8b367c7bedde62faab0f833b37c6462fb46d55569aa6aaf8a966e475a9b7247e6a69cded78b7dbf9de66c3b7c654126f1b0039a5613001f2549084f25c698d2c128dc150481524a29a594529ce7ac7a481f33c6380029c30d12373c96058061cfb24502cf7f340537005848dc39186637cb6af780f9ec586623942bb85029db908bebc98e1bc813985e315c5c4da20bf131ce09af09088e875c5c4d763492315e0180cec74749548780546badb5d65a719eb3ea51b12979e01da40b02a5f413d64b2d177200fb3cfd2811ecf3b51b426b0794d10c03a1018e73e34f6ac6851cc83850e53122f304bb3ecb5f1daa9f32d64f2146588c5c9ce3383ca58f29511cae34e2a8727618e0c65a9812b252eb30c0cd8121bd36f82849cea72e9426c847a95138bee7d660482f86514eaeb063b9c24e33102af8e3388c6194520d25fb8f9c74669a06d73f86fb7118e772052409fce1ec89f39c558fd38ffcc1055203c63848dc267c94043d0c695639144e65205850291c2c43a51990a04c4cea0e1f25d96fd816e883dee2a95513ab675c0e7bf82829ca12e48f92a08fadd65aeb85e4aa1e881218852021e96352995b8891463ab5e845a20048126cf1c77103c8acc5dff7b7edb9419d1e5b0fb99adf01b203fe7a6c7bbec70e093c0ac09494f0b2e777e785224c14e46a1e880ef8bb7b1e85a05a730b71cbcb98a1d20c4c62ee28a6ab97346e90b8299e36a989e5d05a28f15112274b989f874090c0f29f154432a0f30d739e527aa3cdd373009dd386317eeea82b912046320895228b932d3f891845b1e96796dd10a8542fb114371ee69c1962c3d70f86d89f69c393b0e12b8e34368c3a62f87321a63f4a8af233e2e2d201e620b0dc908b6b0917976bc3d799a5fd9d7046695f138e5c499ae186af3355b69d3f762435037fa91e15ab874a33206da834031355d52dc43dafa1c4cb571c60e48539df8f92e6939c95140f29c4590887cd03a9418c7174d9f065c68bfd85b0e50db0e1cbcc946dad0c78fe43e517a89c2f425d2ed4bc9cd8d42d4428c227531388ce8a923ea0c4cb0805e9acf81f3969007254eb67e58020c1d93f6af14c7d574ab10c8bb2ea17eaa67ace2980a0604bc46695b6be0738903061e58921b810038c124a948c81a30833708c81c17186d4628b4bb3c8018d4958334db20a47131f0ca1848b1254d040c5982d57e4a8e249920d57c278c30c8bc211655338a604a006282e732931e3f2c2ae7a6014ce8f7aaa13c33ce1620b24315ea0b8010b882a4e4891411667b8ae964d290512c30e1c3f98ff7cc1d18685a38d1d93a001151328a3c9105f24f172030b48460c6ab0821a7041030d64c08a4fb1608c9923c26461a64c18770659b4a08d2d4be4f00414707ca00d9e367cdaf0010f6f94f101928d09816d6fe890450bf3c442e1460e0a73a98fe1301b1beb224436260419bc1126880c2461c10c6810d3a40a1a5078a2054080a1a10c1348bc3e45971dbcd185a34193e695d4996fe0607f3956dee82193c28d3259dea8e20d28a814cf4a724a323b5f1655f46006597050061915307385103850e2e5022ea85426ec557283936f08f106142d0aabb921c50d2038322de8a10b1a50b992258d1ffc7003209cd0011957980c6145160337786801b6ed7063ca5471230a3265b25828dc1843c68d246dc0c129e130c6c61a775c2e974b89151fb7cc1ff4098ffe56557fc734d526ed69b8eab07f9f5ee60fc9c3b3b3239750993a4f616cc492d30c3c0463973d5b49516f8993bab674c55674b12651b631ea22ca36a68780a43e02cf6cf917b22df56734c36600862cc8aaf34774b1e61b3b7ed996f08d06481f1168830c5c411f1168c30db882fb8355ecf9452ddb0c0cdfd8707f108b3dcf387ac38a333cb8a18316d6bcb2041a5bba1421e58a2bace90416314890792dbd806544049438a01051864c1a3d60653103132c7ca0460f48b2604d1f62e0228729b678a34b10acf99df9230429da60220a2e92f8000dd6ec62690917e4e0439929de60cdffd42736894f1e529f31e69c5e5caa34ab6c430b1b5c5e6d88a95c1738eab4e1451b5df64777940b73a0e422c6281fe39ca20b1b646e906121a382ade30c0ea017587040230757e07086873194e8c10f505c3a10c28c2b3457c6b4c18613325274d428238e1d70c1e40a33a00d96680192325c3c89620936a6989ed802b5ca19a365cc1763b458838dcc099a0d5f63981803c4162936036616b7601c4a35ea0352a4f172b951a586309edca0032d908eca04c1450fccf0b830a822d56335468635cc44913c3c5658cb634319505001041a4dc29061e50a296090d4304612343ee0c4fe56fbf136b113a0032741f8b0461664d260ed60f224cb146492084385159fa2c2063c3620c0185f584982092faec0810c7c9930411623a494e104184d8658c30b1bbc7a10e6b5e4030d4a113bb821840f3f2cf15a038bee5631aad2450639240d71c6120f3e55cc1e98590389358cf08162a90cb5a8319492f0c1b2d4657fd827064b36d83e51e06cc3d7920ca85d7ae20c9f2b5f9688c0c6d82cdd80598b8dc0648c154489620824de48415218417481e2d2e14b1a56ba3466c0dd25d2a042d35062f2c166c7862f35c8a831461bf2908c684403174cccc0060c76d8c207020053c5152b5a4011c6952cb012320440c88084cb11165850813531e60a34c4785283307424116badb5d65a6badf5938bf9f3822c6304f102e3c889510e5364d1024b1431989941199b4bc5470a16ebc46a8cb1d2491f6bac31d6a901d8a3ea13608ffa08b5d02106941ebe78598249131da6208388306630230a247648a20615981a56e4c06a30458d18d8334a90c4c00a2ea650c1c115451736f84026ca15336a54d9d2a842e70d6a1871eb86af303198d1820c09bba18106c6387534ac2481860d3ebce00c313fbce075c617253e2fe0367c9da183aac9299588c2891a6c4083154060d1c403dab8020e2096b828c344938e08ee884c8d1b36359a2479717930803be50c0e7c6882c9173d80e1a58b1a40e921075b6c60034b0ae20ddb7dc1164e8a5277839d65383338a30a06f30a63e61566061f255e6292c8321f29a91eab140ae3e42c8171ea3c307306106734c178fa2cf1adb68c58b64c03892352c0440e515ce08505c5f070851466dcd0e20665244d39e24ac1801426b0a821494c191e8c30c2881c23a0f0d08c075e9461c68b076136a53e51541bbecab862631bbecad092d1df38ef968b725192d076ef4532b79284ee762abf5dd342dda76e45a9319e3ad93d99e33a8edf4a12b2798c512895d241ba952494e351b776a64ef61cd7a173e8d68fce8e752bcb6ea3e1d4d93e73772e5ffaed42f49b6e25696fddd36b5a68becba2bebac5c2d4c936a95bd1b52446dd5a61ea64bfe7244d763a64c58c46663559cd212b6614b24c99de6b2505d5e85664e5a2fbeda75c942474757cf2a25d06a64265ea64d9371a182b6a254100b2eab143d6a68bea21eb8b5476f62d435697218bcb9075cb5052c6937da184d283a20ac2ae4264d5ff4896d294d912d71ede28752b2948b7228b625a85ae1e29b26afda68f929cc0c28e1459f5da678eac2b23ac927a2c9a83f20af631dbfff810b14dfa79facd7eead8473d75ab65ff4125294fed216bb2b057ab87e0529413cc9d87396130c6ddef9178e75e3b550addef853aad853cad27c60161b9923c7225646a68b40f4feb10f66fc810bd861deb86c463df7eb71ccfececdbd4b402648c18165175b5ba5d770f4f632a7a1c373d4efa0081bfd56ac5791e778853f3070952479efaf8803f12a036c16482c904a4b37036e533fb5ce769249cc61a4f1d78a9492d8b3b7f6c77cbb07504e366b6560c33bbc2b02709702b49fba63f75e45bdb5bf8aed8b7185cf5113af3914dfbb0dbc3eec8a49bfd892a2592f617b3af74283bddb31b929d66b5d3e80eb0ec6ac5865eec0b4b80e14b8c29fb9a606bfbdcb0ae08942bac65c4da1ea56e418523284b983a73bb0aa64d5b093f2857a88a2b942ba9a518a6cf68c7f86bba9ac6d5173ccbe9a1225da7b1cc2d10d9bf80dda4ed6d574416311d07a2fba864edb495450d32c666240000006314002028140a888442a150309c6a9b281f14000b9ab24464481408a32086511064103104194308010000630c88d0d4900375cca1d5a4d723ce37062ed9346c430fdaa20302e9c162470da16d8d4df4049342b18300ee09a0694e91046d6c61790453b8e0d7c5ecf0aaf9a74af07cc8a3684dc86052d0dca3d2572421fa9b826feefbf1a6c5cec608898130d811f8e7d9452d7351c83fceda5653ddbfc07476a6bf62e95fa82bf19321990a78af02f7e7cb5a320cfd459d22ebac62ab5ce8768f79c71864a10548404b77bb6f0527e5573d0dd40f2335db85011e851eab4f493631016d5d41149817d69dc1b6069b57f359a719608154b751badd8d2d86d0191324e2a053ade5b3b7eb85a05eefcc5aee10c6b0c2e51a2d5f0fc3317756e0858d8cb28e72c2321cab02636cdcecb946e4d5e046d74053ef53efbb979e20cbfda4d23b2ab782f7112a4e285097ddd8c0d7dcf28cd9f916c7c2e2c5568329ed7a1209eda95d1f6f4180ccf5fc270fadbaa11ad4600e7be6f3973f1991c41a18ffc525a91f86f9c508ed7d007a425db014063ccaad2699455cfe3d698dbb4976f82ad92fbac844a027f44092903d6ad03f4ee382a79071730171d6940392aa4d684dbb999247f10f7bc874d64b883b37ec6a9c06abc364b4c2370a6e9a49353fc50371954adba91b1aef2031e14b77d1053e9d2003750f9a4c697af3d830e342d74a1c784d7359481e3788445dc5ac73e5a15cce14ac5b49f44de4838159fd87fcb5254f0720a26dce18351cc9739fea569490f379e2cf108493a87c34911d36ec1cc0026c1fed950ed963870ad3c241632d36f2f400ea34dc0389fb6f425a45bcdfe9d350aaba40d7f5ad6b6ec1ff52a9a73f9feae33017da9d03898a0d90dbdd038501f4c072cfe9985ff38e4822f696e85c24a69d986956da0d78c59eb83693148f571581f8763498503b0325027439d1254b96c6a099cb200c6b927d80359cb036ee47692d2a18b51e22478dd3b30c825b7e5e97e01c3b34458ae1e4828807af34d7e46c32fa8eefaf74082910845d557fff5c0a5f2b8328ff031326f1c1019f65acce05428e67ddaf484bf853e32fc61e509c74329b20cd65ded6ca0dd02ff154e8566411e6d2affe00216bede025ff8379190e0c75616725e6ea48a0b28157ea97716fa471425de1ac1694c106bc0798073078ce01c607fabfc7438e94735cc07610e831d15b6d902520b6180a982b7187ead6351210a7b84cf9be18dea677020cb0df4338d642d7a3178c347a67ef83f69d2a4ccc89b1db9712a3f25d004def3ab4b73a38ded25008e5870613a223204e2a8fa9a7a968ba81f1af8420de6920b8152d9402ae1a325ddea1e987b841e8fa0a2d3e742d5040601c18eeb9c954aab181d56a1420a134593b6f0f0f3700a970a7c0900b97486fd012c7f312ec4ee589a2f104c84f3fcb3f1ad5c55441cae65d24460a102afe71a102e783b74080c20c1a649cb04e2814cf463357328b07b97b7278d556e240620f7e8f5f14199124485192cdc693fd839e9982e7cec52fb7a96f564b05cc858c4cb4f3d8c6451c016c829b5d508f22f57c6b27020e17b43cb2a39d9f59b7b44aac601ff970c9735a541da42fa5f492282a197fc19b677b990186e7d99d0075724f3d177ef2fc5886a0c0292b6ba29a55b62b63efba2f8b37964e8d059db649a4a017bd995a1b7ff8e8b2cd9948bca23a1ac53d449f350533cf4528b1c22f44e78488f4ad77f9e41c82cee21234ef3913c1962a0c5184f1b918b18295f5703890774ccfae07603a5cdd647538810be93f6a938c6b7307c54a138be373d86c6c87257e82862132f7d33ad69bb600738aaf74954a384432239b0c1bcceb68d3307915cdce8b7bd2330ed59b49312baaf85897d20022284157cfd16605d03572d2f085711248464a965f01038a5148769b22f1434c18a9daa6f21d646b35d833804547acaac9ae0b3c8d9d782cc092e5af51f836aaab8686de4e793b671bfecd3447a20730f3da0ecadd60729ebd0f90cddb5c683bc877afe8875b4bf9c1cd2026f2292639fce437264842489c388db189f7149bf2f3430409fea07e4fd6d2e750aeebf5c0dc9d25e0c0ae70fcd52a070ad3509b0e9a320253f0a82ea2f40454e52ec05e85e8b5c4b05031dd6576b24b290fbfe1ba443b3af4c469eae307b13730366359226454465f4fc30e6c95da383b4d2c6858d36f9a1ded6b28f3257be1ed3d297d6f50e3c4d4b1ba8981a05778552261b547628bd7c05191a7d6a1277a00288faf7ceb106a97fe6ebaf2c24aaeb6549dd823b8379bf2110da970f4ecbb72463106e358617f2c892064d711efd333871081e7828a6299bedb4c72c4b2377365af4fc971b9f25aa5874ea4a6934ad1f76d6eca5f3d586d23f9ea506a04ddc13fb216479f5d30737227132693896daea0a42d00aab4932f06610af722180686492481047001f1b5b91481e84a02c19fdcb853fc4bfff0d60c2747686797340fb31157d2e3d757c0f3295ecc416ae54a8d9c11188f366f0d3cea941a66e87b868448ed6f382f444a0bda0da5647129e3f7bb938c31cbcb832c31eb28e958f4afc95e8957cd04dd24669151e25749840882ec18d220b75285132e6ee8804cea6203fb7b322aa122ece02a278ff7022f09e7d6acbead7ce1e2b8262e08a7a4638c361951b370e10a3feba1c9ffa3ff4fcd744e3e74631b8cfffa33701f635be1317469395c265013ac76219fc797b7d626d395a0ec2484444d78eaaaf92bc82c29478ea4e9f13316aebb3a4bed6a5a542b3841862e09abdc4b71d82b632e9a9f171945ccd2b27850ea290ee4778c2e5bd4d2738e8f6893c92e2b255a6f328baa8ed9b639d09d953613cd078744f755081f568eccc26e795fec6f2f18a87405312b6cd64a866dccc0959c2d4e7d0ab13668706df6b095971ca0fc83729b863d701c5c3ef575c2482f4f0debee90b3cfa62e309724d13fcebab7d9aff519d9eec474c156058a23d675de58c1d5b0b72b238e5c464c08a229c85626d09fcb4ec466db18310536be245a13be0c7c5728158e7bb57c0d511132f879187f56fc3208165193f2c85ed5abc06f105ec8e780f4110a6d997c0d3e15079fd4a3c6988718002cf3d8a3268dd61333c9cb33b898a693e22f90341682f127820b0891d9c9b8e60c154f43035d502f29eba1dda473c64d2165571774f3c681d24a9faa498df999af5ca31d806678b0a4f8d63898530e54bb8feebbb8a3a9b6c4649a71bce208cef368798f3d9e29a9696401a5e5ed8e322af089a5e115087a58eee94a06bbe10e45bff371f7f66391a3069ef4cfbf6a627596621691c97230e2426ccc3ebf393391295046668a343ae56abd17507643d11b10fbb35e3b0c040d9bc5f6a5d53e0c93a3c642914677c3f4229a3037880724a07408eaa1c8cfa4642828ac084268063d48cea700955be4bcb5a15426307a1e4898c92206ff9462f2b6aca1f61cfd67951575dd088bbcfac1b4e0fb37a75092d821339b5f0ca3dfddd06649d9f8f5dbc283227699cd253a65510c84046b5c71e8824d2448eaea6642ada3846ac6374449e57de714675ba50277fe50928725fd963739a2e63585682742ac2366cc4fa0ec6cc1ada4c9f9fccd6bd828276284b74ad4fc54f7fb8ba4ca6033028493062da2ff825b35925c67cb75f3718dff2265c43a7b2b45fd1633135ce61dc994c58d7a6595c930d542d3bb1ff73d62f70fb88e43d9a2e47d888daa3b5fa6c3f6a9f1ad31b13f40c67bf52e5807b2652758896a69619b5759de0c099da76909c5e9bc0319cb6fc0465402d44054c3f3032d8bf517cec179a1bdb4627e621804b6a444d7d050cbf9e8ccda074dec88fd87c57f38256340c00b1a5f1e01c19ab76d3109e53af0cf272f766235c37e01bdf3487f53316f01a9736c6b9e4a5e5991f4e22bee6d6b24e72184911d4e9c7955e9ee17c0cde353ef226e6cb589570efb3e01c40db2ca5998c1e247d5e2b8c0a90ef80274ccc0f28c129bc2f7f54ae0d37a02966c3a84fe56358c4a232c981639961bd92400a9a8cd6c879c2531c4476dcd7ae8cfa67a1cd5d5e640248715f894e4059113831d21026058d92027f452863997071c54d99df8d26a0d260c0db532d87281858d2fc317245528085604b246a885f64e466ca69fcce9bb158446b954e681c493b4b2b8873539894eb70786487f375dd5f5dd96fdf9e443b8796a92a28a819caba11f6b75eb6b862b7fcfe3c1e6c473a488eb5fd3c9d5a6d6e0034744608866d8add11d0675c665b6ac20ea55fb661816c006500c48bff14b6bd4e050b0015b1724616030d4624599ae6326e6fd90022021e166d4a84e685194c9d52c4137485c47eb5724bc7072b1e90efaae45d05866caea9537fccde205eaa69f3e88e1900ad3430e156ff8ff30e717222a56baddeceb188135790734b99a181cf2d369e2617098797d424e7522dd0cb96ef3d6278f9f189182f8294b3158cf587f032d5122779a0904ce024e5a1f8a6d6e06e7162dcab3c5f55f01028f0a7e13812857dc87141b2ead0a66ea829f9839248640a273daf00dcf807e711682d90981a8511df71502906c33fbe04f2498735b6cad9b04bac891f3b1324f5e9bcd0731fc78481bbe86839bdf7c5c5dd7ce2b5301101aea334105c4180648b74b454571daed62a93c2f0caeec1531012d9fdc2e20c94540d654f278fb59c1b8bd125a815cec5e5ae85f2e27b9f7f2df15727b37ee4d381ac3ea886b60496300b65c30bc5c5dd0851342d43a85b50802ffbeea7f74f04bfa6f66becb9099769d15f35de04563ef841efc4a2a2815d246dffd377a5c9e1a5466d5c271567eebd2f305a2b5322e78acffae9410411988bdb8a4b040779005be80fc4d9d785853c4a6fd71536d3849936caf90f7ee90494029be1a4c258eddcd2ba8bdab5d46f0be9273055c1325bd47c446c0054a1873798cece702767d625b81afb48cfbd07f40e07cc96796e46b956a2850bdfb8a0f58f0dc82afb1db289a8d094d88e0f79eb899ee8a440703b04c449e604294e5c6688f1ea5384a604aadbd9f6406f537307eb4fb82f48530fac954ee217939bd675b749e6a1d1aaa16d2a1e3170a7400d141473d2de62496941f0777bea68f3b1b1ffb293d224a26f6b924a856677713046299ecaa2f41e93a5002214bc8dcec7175176b6cb6362850e403766101f0dd15bdf573d688610c162e60aa0e79438ea58616524cc5aaa4d060ab21f40b4d2a0837183e4a212bab5fb3120d37d58bdcfc113ff0d3c24d98eecaafa8a7bfbc8b821dc33f79ca6cf063e6e1ae8d27833e0c6d5184ceae55e6938d9a7ddbf7d81abbece6f1b62a5045b44e2d73f4add0ee7de36bfb9405f669c4c1bc1b2c6a0cb83f9f85079484033a5d61934a5cd8aaca2571a386a2270683cf5240682a4df7a7b172691e1c3a00dc0426cfb5399921e2f5ee9c0814ed6bdfb58f6100c9ddecce8770f0bb2eeec4801f66e179d11960e884b981b1854e8c05ebf5eb85930cac10b50222c2e1d4c783aad6ac904948f832ff3ff13dd26ddfb73601643319c995630c05effa8b561d847259099c88a7000bb9c8c8fd18a8a306f49062b93cc5454037e013d6a5b82b2ffa12325b0287d33f6614def781d56887007a04f4e4f7a09bb9c831cbc1558a0ca56487f12669871da0bac13be4fa25e25024a7adba77be103900e5e6161c0acdb62171b20a695967e2d0d0e3d2cab135e83481bb3e1741773dad9345e7e5643468ad3bc6e222ac7ad32f4027f58e462d308fd283c71db63a54c84adcf87471020ff5a1000bcd17c6db68256ab24f2a2b6e81a6e50bc9b2e051b76df4b38a4b2c65661b9f83b0adb1e1a2c85b2a50b1af683bd57f36146eb0b22d49db107a40219950ac06d935143e7b1baf31a229cc7cff218557e6e18d73005e0d1100c7f323a5d78939bc35dc5680b4cf41a596e7c04705e10b03c1613a31ee107371a81661af5e454118726259e928475b357b3dc9b8fdff6e3255f44109496d940942869069766a1de5d21bb89f96b529702f473ae830ec74fd01fa52d2bd7cfa5411957f199e7f2ca702efa6ca53ae25bb661cbdfb8d92715869378b2fc6a5bdf1085a701720b2a52055da3c509a3105bbfcd165aa44a638b6cc51ff0525cb1cc13a7a13d3649e677a126cb41055c6442b1cec2100db75706ffb75228f67f8d5fa09841f79cd5ecea8229d0cf8787ae6898f2ce08662c35cfb732950f6b2c0d95c9459122dd6e8d6d9d5a3da598ec47e3fbab14b8f988a3a55eae6e09fd6d87764e1861e31f166ac09ea49387ade84f0c33008371ed7ad3c6191a30269c66c751d99e2920374d50c5b5ee44cec0a9d9169f90433136859e69e09e18d524a5f4ce6d58025b8154398948c1be4783db935f2ac5a248ce29f7bdc425102f4308f19746e550e910cd8cba6aa11785f93e8fda6cba32268dcc6e68aff85850481c6bf11d2afc0d8b812b2c1380c42a8b01a03ce8806b66491eb159a64a2b01d5712c909a6230743e00f86bb380dc7b332b06bf410b434aa111096f749c6195659ad1c1e738d5fac658dd05094af228deaefa87f03e623e3e88d593cf9cfa8c04383d472a61797c4718a524662c4934daf37072663a1c17fa040353830fdacb1dae4974326e20893cf6468dc1fc0d977daab0c318917b221d35d0c01bbd4228483efc804c82c020c2ae54aab227e6d882a91b420783ccb1954a0dce21f2b00e947414ac2eba79fda86aa939e58780c8253cd8168760b224663c07a90dcd67177223ee8dd6f30609115e8f164591b314178729747e56340328b50a00bc900980c7bba9439811889a86a953e48473c9c47e3bebe9e9372f251d9bbbaecc8d80c0169f8c392e6e91b429186b2d6eae30b9985abc97e093d4b11f322f548927de6a32f1c03ad1dfe273c4e56042cc96c395041110046bacc813f195ad87a9cd90ae11206f56271c93c97fafbd001642d1b18f516ccb916b2ab601f46f12702dcac13d817efd79f3cebf5d2c7ce4a67bf7966ed6c3b7c4bb6d5795254099a230c926bde7803c506837526822debfb541422025d5c1c02a5810a3bd23495752897383b92c02e24549d7b2210b0c0ef5fb4f4b7009afaaa82def092675fc0f6332eb41e77f410a4e5be715b3d823b8f55b29aefbedef43152bbb185b024886029f9861b900b9b9083cdd364241c4c1151c2a99205182b095518356fbc64f4bef8872ebb9e7d0c00ce476cb3570f0ea0342035dada8af2024aa96564260b7762f293d28b16e186750b009d3a4cb1004ad45b8d9fe697a05ae8a24452a1260c2024ad23d31d48af58bb65f172861604e5bd24232cf74cf3a8ec4e17b6c0f59f791ddd62120d94a70dccc6314138a4fede758b1a622c785ffe61f1995fc0ff348b6f4cc2011f29980d6dfd6c9511b84c960271d80a754993e9b0739535300e0f3d995cf1aed410105a294d48dd54db35fbc6c87768134f5890addd6f7abd01dbc476432bd023d7220614f277fd0654335d9fcc376240d690bd18a754c20e598fe99a41b5fa628aab025edc7095e3ae41c622abbd09e61f56e04f6f441e62af6b81f6aff82c4756b4587191006665a3d83c103a67e8a2c28d253ed59602770a6908fe96d0d9ab50e43bb0ac32039de831515f097f5e4b9a717bb40ccde2dfe702abe46f97ba333c1887436157ddbd3120377599afd200b749d60d82028b38fb121fa53c2cd122412a5075fe3503817e2969f2576721c8932970b41b6762d000f647d142a9fb508d2ceb213cc98634b5e987d114b2cbc306f153c735f35f121e64f3d9a513576651971329ad5a8107ca5daed6f5cef0777c656ce5e76efcaf03d3eb8a07da2079ea798678fa19c284c2df23c759dbd3416e336bdafe4d31c22010ca41345705fc5120b5d5783e543577cf91eeea98b6fdca501c3b3811f582974db336558fc0c8d0b30d83cabf22bf45f55daddfebfbc421bb429f8986db1ecbc20130ba27e801d1f1003f8d2324ffac2d70ce19952b4a22bc9c5b23cdb0231b959ade517f8e16598a63416b620857bc9fd1190116c529c0e16bf63fb0890c562995e4753652ebd926073df1003d39081562aa19e41a7e02f1a4e78fb0747c8eac26a64288ff32e03a8aa5338b02cfa945a6b3bff7cd886323daeb47616542ef850729548d8270fa1b25740405b0d46c2003f87c04990f66c382c4ff6dfe77d07116aa9332720e3456270acc3450c29e1f4b2f80ff9b70552919321d45e890fa1d06a2d5ce105d85095c7e67c789a1e3047d10a6ddcd33c716c078414fc444b1e8891434f5f9096d0ce7c6efc63e1bbfcc2ae1c4750ad5ac217c3904af7c55d8747de1d70be7aa1e7291311feef4db04fdce0d40c43d7a1cd7927e11ba6bae1ed8f1b86726d06c84cc4ae77ece3325898a78780020c8806bbd8ec690d0ff4db84497a24416a8b619d62e53c7d26d6d31b4e0a485159869126bde4adefd4bf836ff553e411bac580fa246e342531fee8b57260c6cfb50d2b0049cf0227b25fcae7915df6d9626c86c370a533e5335f08ca17eae088e5a3c1c9512f72772329a8897e1815b303581e3a5d6bc10d3e34a240c606f5a20533e47d9853db244a0c641d810b9d346db675537c7f5b4c812d8f890fc0ed15431d80bf23909f29025578c0c97790c849a668a2a2c81192cfabcb7259514175d3b43f2fcaa04fa1c3d00ba57543823604d4b22a68116aca40fd7f2f59ed2772e224a311061810150aa7af9b89e50fe3d49d40cfa87577c09712c670cfee67bf0c5508f4b589b90c7087c1cf8cbab99259f5d5ebe4a25fe2e0431c4b6b99cca78f1a432061f5e10ce8a58094fc442af5e91b69a473ed69b9c6ffacb092e8cbae453ebc53630d40d57509b5171af2e593e367da0f2f02c521fcfcdc0d088511a9ccca8ff46fc3e7f6e2ea4ce021e63133d2ec45f1b9d708d198f65b2d24c5646c649ee5a2e2719dd029a8848c003f7d6e11bc6720946a29f584fdf75fe62d60eae5942d4008e0fb8523a8131b14ec9955e7485ad9df0b354db3c1749980f3974c4784a0eeba8eb9701717f89c872a645c4b1f6e2a8c752617aa4d220306174724bb3786de6872b75d782d5dac18bddc184adef52e4d3937102fc55d970821e6744f7f1eb6e4a0953b07f7102f8fb9ad35c9259b5efc7fcfb9235870c6a631479278aaa788cc75198e14fb02caae2c3029cc451bd15bd6d9794d8d79e323be17b0da039dae9d00ce462e0b71653254b006a2a416e95cebdfa45958cf3f36ba300b8235de6dcdebb768223ad39f7921420c87cdaa99779e10d25fbe58f99f018a7385ed724f889fdc852acf6c3fd2b5339a094965adbc4bb619cb5684a2b81728f41452e8e85a9a32c533f0cd1094a791af6e91c584b71beeed55099066592cbade189b72ba7fb68e662d7d9b8da7a927b1c2bbd3d8090f6d7de7308eeefdb92f649bc4cf6ea96b839b30506cb7105183b2c3a0f5183a71efe89772b58a6f37280853fc9d5a847ef73ad6c04f79ac46eefa4e1ded511da3c68e84b13954d8b2061ed1d70b156de7bd6b5616de911e689cc276cb05cc34887daad156b2bbfbd6bd689325180fddb99cab17e29589da0fdf3ba587d5cf4ed201f8711107e39accc80db9e8d0c0c2d1cfdd362070182c778316229f0b8b39092ec4ebc2c64afa58bab0d367e364f9966adc4fd9a0b7b00d0d9bde643b717213c8b055f4690ad7c2bed69377052bd223c157042604ac51a1e4c70ba4ff2d33aec089d498f112b4b41ba04511628016ff342b7ea4d8b9bd0243e546f026740d8f895cf39f618ee5e6c7007c15dc4db073f7b56f79bd31b39deea881f5264a36458266dc201c1c56bccf5b72d26d769d75dc62131e68e6cc9d6196e9f2e314e32cc22aeab1fcb62ded1e819dd1e9cbc5ec1376137484b83a552f01faec0e07d7b84cd79a0c7d27dfd6560b3126bc626266d3dde686510410696875a193e7f5833f8fe6774f604edaef39ce9c8e2fee29dc868828ae6f344d45c805b7bc3017cb11d9a3a7398b97ffe94ea1eed630502bc24470fdd02186e847dcfb946d0969484c1cf77213cdaaa8ecfdfa98b1195f5ee0870b3e164991436c1c4f05f89f6584721107863791bd6b918c799f3ad8225413db5b909798cc56d21b9285a66693318ed3861071ee7710403ec0ff7efee9a144049ba7d14a230c14102fa1de8d56240a08bd549b301f532ec24d48fcc10807635106a17e53a918011eb695bd848fda0ff490c804da7db58fff19e51e39dfdf47214625d64fea1c973ddb3007d5c33fd01664d9bc9b04123e826671a2a7e25e83e28055b61ad73794a85de04356e60cfe307e14086755bc84ce6ac73384ef0d9bf7d1ecaa66deadd57d36c10d1f74538d1af710c084557948c187ee883f6329c99b40292b866bf79155f598064f89e61d2ccac48ac613827c97e128ce18766e7114a6570e7d3db8799227549ba5b34078d74efe910cd394924f27755d2713a07b1c19349e336151291372df3f6fe56a1d57218102f822e9cd7a3387d82c8188bb931774636da73bdfd4a8582e5143a65c1e9f7becc5ef619dcd5556b4995a09000b8844c1e221c3d8f64c2f6ae34c20733c975fb00db5cd3d3563ccbcf191da754621d100c7a915b7d3b1e078ef2d7cecc07bb536b28c9c865eea8a552b96217caf5a92e7288acb180451e67ef1059465ef67b7622dd2ebd3daeb89d4062399b02183b8e2116d005b6e866563e1b1de58139381cac69fa574b3ca12839f1eb46891110c649323592e231f155d900548b658ee51a9af10b6f2d7860108740823eba52783c551b6e06947df791261d372e799ce4eebcac667f38572e61a42070d5421645202ffb9348d59fe2999333b3fac6e8f2700502581fd31f46477e45840dba4bb46e2395f95b7790ba8e69831cd9756d15b4e36cefa507f08464cb0ccf5bbfc9ac7aabf7e284610b164bb8d5b92b11d9743908825c53b3fe178002f0d68079c4f88f4c35cbbb90db1e26a7fabcb458952b8b4f9523d16d00fc37796472dba68fa007fb9918c67f8a98ba815f86daada277eff315a139930ead8bdc16042c913f7d905454398384c4a5da115fb0217ac67fb3c6c0392b52261899e8ac5e373f235af9454e0741137f300b6209cf3f54c60aedb94842f7065caa919cb1a7d19f7492d3c1118968678f39a130679426a8a2935b5e5be30a7e2a6a88fa6c4aec976c0e0df82b54de8fe4a7a2e5ea39c7eec1a69c6985c95aafa2f25ba8bb310d1926551bc582875d9b5d8dcc2508c00f71e0130f896de1c49857c948d7483a92b4f1012254e47083be50832812aaadb9fe2c2a47f1f856d5f44882999a97ddba037dc40a88b6a434d50dbb4b9c139aa7d07a1ed013aff079467d9e7384b910f25528266cd8c2afddce7fe4cb3ddfbbfc816d5e6296cc424c6c3b07317b1aea13bf9d00729377a749070fa8995e08e8b9b3a12a1db6913e5449fe8c8dc5aeca277443357075e0f590821207c780369446ea701ede0efa2b769918e5e66514ae6ac1fb4ae7c69ed0ad7053703bab8b863e3a936a14cdca2ca2169b50d05f7cbdef977853731df999b4442f83f3a8661c948296cc3f5014b5d1e1a973a920ed3aeffd5ab702ed519ef20002a398e72788ad2a0567fbf80aac395f28a8f3b993123310cf897e5476ce92a7a17504cec30fc21ecdd677ad287319a21df3e5b804fce3527262978974214f530d1d4dd240a678ffe3f94277573d4ab6df4a25db68271cae801a0d220799f7d64aae020930ef51e2c75a8b92552aba3ade5fb73e72408ea87284576e9b44c6c4ed4ee19fcade7987b39fbd5b9e9cb0f575084176068246901660587b611ec9b5c6db454a9f89628a35ae8041fa6ab5a4f4356b2c7b98ec5fcdce43dc61127859537dc88a50b3b3a17ababe213cea8230855a924485d933b1bae292b835ea7aa96951a32dbe4a6168ae38886c5bd199ce85a37030c90aa44e2272e24fc70351eda802c2c0c79439a45c15a31b3b351459f0342e562d9611d3ae9ecb34bf9ae0c5d0f81e067e4a972abf1aa2f822058eab122bc687f29343a74c32d5c96c590da92987d1ecd5882df743cbff9fe9a515a1f3efd595880b50102d6ce1555747bb196b9be029e4ad788a22d8ef74367af2aa3076cbc2bacf46676bc5f76dc6c25d035ee6d121ecd2c320dfaca27d28befaf1c35e05b14f64e4ebec53bcbacfcc5251da32553ca5cca3d9360f62a7108fec90e80642d261853262cb6aba91feef50dc3e920e169cbdb7ff773f8e8de046ca755c2af1dd6c14006ed84088c01f15c1ebadbb5906bec9e4559196af6ebfc4c12c4a7ce76b2171588c00f53eb4283e717db5f5675d108ac56e6915f1834ad390b3b03dd351717ea6b17b5024bcd03af387690ed57f575017efb129992144f1772d1311d8f087433b1f3bfef8fb26d93f97fad8d0dcdc45fa67aab64504a1814fbc09353ac456cbebda00b5698b8ea13dc15b039867bac64469a5dad31b3254a3b20442e0413481ddabdff3b47e8b65a342297d68b46ed65e3f4008b5553a3a22d2ba247f9571842d65f64cb1e5cd1378b656dc391cd96ac65e901e2c0bbff37347af4998f519667df1ec5b41c77c3590d977b8c4594f43713b3687cc93cfc4767a2cb65417fca2aee4dbb88d2475df71f7f920e267765e5f225ddc74fc1109dd63e2c27d0694cc5c53d2a04f74ed324817b19ff38b5144cc77531df0cbb745aee55808aeccd9de9e8ca2d89d271d1bc61b5433e02625debe08acc917fb7ca1383ada5eb967458e016799ae4018fc813206091e11c32ad2789e9b60f53d9452e26f1b1f7a81b1a989b1556439f613bdae70f94c884746f0d11c39bcbe1eb17c6656a861a2b7afb6cc1af563e7e1688848ab30ef00046665aeb2d61506f1c738c086304f54e5f3013ce3185f7cd8cc298e213500279653ff118ae7573e9153729a6e714e7ea8a853604afb34bc3eb07d2a63643566bf10762619b4d2f514026388d23d8b534b1ab94948f15bfe0ae1e5e83decd52e23a18422fa2576ce84c7b987f15c8fde0e1aa14fbfd3a2e5a983d448f658a58cd065f04c11fccc0960e4b646de68c10952b09df051a730aae420e792acf8e8bef3a979cf5fac658644281d45bc9a51ec3ed58fbdc056e96c0642173133078bd1c49a4ab97da68f7ec06bf601504cae8c7701df7ff7c47ac7c1788218311010e9ab4436c4b531bd7b9629c4f401e8a685b292e1af6fafc954892930cc4e3daa0c968012eeff5b4a1986202d5d78585265e363a8bff5aea69be86778237afdb6240c0be82ecc6326ca2d5502005f42a0ed67b4957699fd1b84292ae33e78e109c20d3de9b219b9c4a23eeee1fdbefb801ff21f0eae0be8499cb0ff2af3805f1e6649db684ff13eb4cc626558c8af52fc8f99564448571cf04b9377694e81950d6f9989a5756d014798f3d0fbb1bba786a011525bc6fba7e2c52a4c17363628a4c3e1848b980db121ed94e580ce0c939956c12157bb6f5b8523f0654939c0232e0450a7516824c4c978852834b43e32a8d25306bf8c20f5a0024b2fc617ac1554faefd02dd4b6334f4fe41c70263775a68f59e354ee52f4d931d6b00c2f4a7afdf3ecc864fa41a98821126f54c0b820e73e6756e115f7623ff380380477a82ea69b489674d213c1535009176532e496fd83a192d93c33b7937bb4fdcebca835f0d138128f0cf2f94493209eb7b5f76034a30f8f97b9a3b13cb6ad9b2e6b734b53019042600848c46fc9f4636d256cf72ac74493d1aa722a61b0d6769cc1b4bc50f8000755fb4f119986af3f7f9153ee67da77a0cb0fc5215dc81b1e74d75ea9e73bc1a053c225ac96f612d1610e7959109931b6372b37cd6b932337810141a37672e6020a0f3f0a69fddddf9c0e042b2af207c93f7e5524b384ba23c714d42148775b7ce23a227f43ff0730dff821ee140a0b5cff6981ed33711d2e0a8616c831f98cc8b6ca804d7f5e07eba49d38e22cea98d299b9e88087ff08691861a951e79457db24054e483b2eadb9d3f746ebd5efd2531586ecb0bcc8e2847fc6e0c9535471b3b5eaaa0a3d9b1a1d925a405c76acd5216ebf9e6766f32aecd060280d846f182a8195a904fef37a0605b1e86ce83e9e6da11ec25f13e389571759166d09059c7c95c505d2e9ba676ec2203cc2277204019d518a4c08757c4b0bbf8000e3be1e971500e1bd32511d8bac287b5104d192fcc76a21dce528cd8370dd012c13e32902435431750dc9f5ffdb9bb0618e4f5346821353321c65833b0ba695017997852db47c718480c30e97007b98d518fb3d4d27be1efc14979affed6f8098224ae84c9d6b481f945852827442aeefee7c8dfd0ccdc1b005cb835d064c58d335ad8e474bc8a9ac656e59c5af7184ba514347ba143dec8df241b9aa7bbc0b9839ecdcb16c0a52203c372d9ce80ed47147bd47ddf4ad69e6d6d72536fa63da27bcff39c50fec180dfc612370dfafba3be709a008ae4346003e28f992cfbfe936b3f79a394e14c1d09beb3c32e0a0cdbd67ac85b6863cfdcc9f13a062977fa768c3bb905467f4b8b5d15a888316cdc9702268282ea2671333d7c8693ed41bf080fed4c4db39606493e16de827b6d94ff6db6756aba5a9e19d1b3929945fc131efb31b21a20ee5b84f0feabd4f14ec03e26e9b075b2c8977e37404c15d66c93a08bf217da316b3c0548bfdf884794f334f330020d5fc3545f62eba20e95c4c761401ac87f0824326a4d413931ec664eca3199befd3a6f7dda6f866537cdf34bee726e7491e894a87b8758e749365cb0ebaa30c9293385bb414acd212dcd2e57a0a8a5ad3095881f65ffd13b7880182cf16ab085c4ff8bf8bf0ec4bb12545dd97449da01cd2e1737bdc7fdcc4004972ecb55494aae2f0d608943cc327a25559f653e77327a94f3fdb8c2afdaa6e36e252e1f05cbcf6ca9608e6e249a41c429593c5acba6df2be2f8c6891d594fea051a9506bffb913ee0e0b89a517a5a09024a70a78df66becbeb2ac8695a2b4580162360c11e9ab986110b528e3cf7d56338c70ba7427a25db33518b08121daf1a8d9ef4fc9e4e0ce9dd5d6498b0d38ac458c9df96c1a42ffa44ddae1a5f3cf0dc2d06eeb941f23b826af7f4b237fa2411ddbd61c5296930abcfe6ffd91101eeae075859e94d16d7748aa1595b471c08bbba3b0278b66f6e5e9ae248f6e61e16273f5bc0c01e4bb5637029a20902c90b68e46eb7add754f6f90f751f473c0decb9589778a85e60d2b303999c3a2f03bc0ed72d31567045622be0fa391f989b1e82677b750a085f8304c2aecbc73e14832541e669eab294a828ad6b911f6f05d9ad48111fafc228988282e7097940204458d9ad624528ddeb42fa793385eeb5c90417c067fe3d408db38fac67a9610c4b07a38cb6ff294b2944178ee026c1d806dab3cdce6b4dd40fe52e355c4e50f8d77215bb54ddabc9c7cc20f09bc253fde1bcccdbf03511cf7d4092f3822338e45b2a78602db0e8d7151f3a4db14dac4e042d4b72613af4911baef8e4632a509dc3bf4223416d76fa6d54faf9ad9150da7d2d7679ec093cc02ab0772ddc8bcc4632203a3f9e7d098a7010ebb494c2dc1ee2c13c3b46e8262d27b4c28a25dd9270b1bd6dd7b449bd61c2d28f38f8acbf878be81af420f83124a0d4447ac1befa127bbf112f6d8b7e5dcb86e51d8c82b7c959921371835184aa26d535626332557291d377279c8193d0e06c2255371f6b028acddffcb5ed6a39b7c3756aec449d91ff560124c78c657c6cac26238cc8c27143d8be3f6bfad0cb16373bb653c56e27128478a8fa171cac4d9c347560b98c133a97272d282c5fdd37a3098d2bf2c6333b96809f46089265b95b96b0a05cd3ffaace3ae0fd59eccb2843c5d6868be717797864b352dca0381a66e0a364f6754bef6f4bc6a9358c8c14db743e37a8540e90993ad590ee447dee0af45d51208b70a52799bad355e92d4e6c7ca8d9cf2fd65d5158839228a165c963a4574bd6afddf10de527cb170965d122813980fe7717d5275d2caa7ea137ba008c5578bc84fd6fd30849df64fbda79704dacbeb610a55a9d0140ac9b24f49e15328e51dc27641edbd2a87c167b667071c5d3750a62042d0a50af263a8cf6f3c19894b040d22219b6c74c654d0145239c174cf0983decef273884adfd1f50b4b4d23e2e99ee534399af07e825e6636df8274bb43b6748cc4215045a20d9d29f91496aba3321ed9cd6abb2997c455a6a32b90622afd5d42ec2b55e174fd37540cd15d19c881ccae574ea1c6326ffd5adbd46d8e228541fdde8c6f8e131428f0c785d6e05e5b494d61077c1e37ceb2a1f629325360624486b71e162cc125c2cc09d98797706046ba921a553d7e700029cdfc39e5bf3c2bb3cd308e36e059a928e7043a3e4102214e03534e59044712b2ff40c2d9e3317f5ccfcd85fdc3302fa87017d8378eb58a7b7f01516cbc007fcb0ceb698170817bc1c71bdd79e463063bf09914e4a6015b5f1d3794659e0db611694bebd405a7c37114687e97ffcf12a31c28ea60078552504051052a3aebd6815edbc52a4c2752332bc6eced9a9c602598b33f00a1c089dddb14f593911d4811485fe90e50b03d304be82bb063ef9f0b1caaef472120440948a0b0e5e17780fe829bee4612fb6ba1fa874e45661e285f11f2f95e00ba9e074fe897b24ffa56fae96a761d009cdcdaa95f4c01acf50b8eb4570e3fbeeba20f24ee103aabb3a4099bc9fe348840c91c322510c11323d2e988525b0c7223bd3144d873960cf6300f25738faa8ad27e663cd6cb776cfbf764a591846693e80db0044bb4f17e299a1843f2ca242d7cf76a200cf38270d4604522da029fba014d3a277361803167203bfb3e4d44c207e611222181e1efe1a4224060e4962d30ff986a72e02c8342d839c0b6717fa8585a34868639c333a0c711d51c7e86553156af978dad204979772ac01b4d7a3e7c05d1ee5f8dcc89bb54eb0cac272dee0a765787400360a8c39e5d2df0366c35108291064b5444a3c74717c650ecbb5d7f729c3811d79027fae00e24b560f9392c473d639c48ee0fde68b4c2a3904989d512299f21564ac1e4b4a929bc4ba47f646412a2cb1adeebe19e91175da4e7bb1108d0e8406d266a050a739cf5d9f09f3504309aba699f721033f986ab49e9cec7b843f73acdb4d36995889eabb565e86c651a3500aad5bcf9113f45710cb5600d5c69952de46c1f7d42c114d128a033395ab6aeea3d834473dc5f5e6ba19bf322544e9f71b7c63b82e6e87db764cefb916385480c200dffac7bbd27c4d4301f0c1c2ec5a450361ce580d9cf19e8b2f3487b857ea13e78adbbff87eebcc48953d8e89e61fa60976e0b1c3f3ee87966c1ffb9d7cd80b1e292411967375a2055c4ec6d29e4c450c3240f4baa209bb3b1f0fc663306e6115ad3d6b2afdce796f9e9dc53827836fb19f35ef8ee04c4fe4cd8eb9d00a7249ce1a03b39ae7ac22085990d9c36f7e1ba3c72eff776315c556eef67f297da44f94176d65340a7711e2dcdf411db34846670109d9a65e185fcc4433dca42658e1d852308b4a867e2a5e00bed36feaab7fa4ca8356b343f034cf8dc4f03193a47e61740b477d893cc4f5162433f7008a7bbb6c3b06b3190dfac3117ba3d471a8a5b91d7d36f9880a2570acbcfe3b047316749cdcd26185e77aa9f85ca70f7ab1b29016ef4c85155a5f14508827ed15c6f6da4579a26abaa72c087f3cb49d14b83f1649cf5a45d81d89833321e95239b5ea5438d708b529d4136226f25e2a1cb3ed8386a86328a0f3bff19e6dc52d472bad98f632bd2b982d56a8dcf4e6cdcba2f5778ab5e3054a94ea1310406d811cf8bff765e67801ff105bdc2cae7d2fe74d14ecf0f4d2d92abd996ea316a315e316a98094d0379a16baa25be64d3d9da804f9219037c6454627d3c5c14ec4862c9b99e326c9305f433e56aa316b5109fb30eb9daad680516242a0a5311fa5059f49031fa785cfa71d9fa4051f63a24049339ff3b45ee72f7d49b774af4e3e12883ea7c8660c4e8cc22eb8dddb2d2bcd585e27698a2def63bf06cfd45ed84e5b3fcc1b9ad75d8e5bab1893121c1e1fe4eb524d3b7c5e0e3cd982b7bd83adc705ba996dac54a74b8fac2682cf3d31e71a7b096b4a614e47e71defbc243c94e4ad856a1d5ddc058e80628de75fa5bb026d36f2b0d1a81424ef94357c02c3335232954149809a346c7ce9b3f65a076c52880256d9ba2ba54d7ff1ce867d1bf9375bd7225ba61ec260181408d8f06c9d2af17b1031a3df020b5cdffeb5fc55a5aa70c4a1668c4240d4d8e80328904f265d1556b0d666a27d3098b5f6a6a445eaa0ba3e5d0859eb22f6aa3584f9c989a4464c2635f70d144f3684aa241873b4afec239f7d57639592de37ffe00386959f764029e6e871bfb77274d7688d18ec993dda6de7a49ee3f999287a218c78d5ddb4af6af45383b3744623f7cefbcc25ebe3de1d5c0db6eae20906ee812330fed9f673e99f0bcf79145eb8ad15173acfd715335dd63bc95ade462f8c399bf3666ec594a2d712f6794d4ffdbd8d5ad1185a6ee26064a2243f428862879b5a5def6e1a3b52963d91670da864b4f4d8ab2b402c3ce2d4979ef371fbc9ddafa3655eb55e0c44cfb38ff00e57e474f8887dc2cd0e523adefa35d1f671392781d54f4416cca02c8a2fcea9f74b5d412c8ab205b871a9ad8209403ce07e017cd0ddcf1bb2b39415f1504161d351f981fafbef8dc9943f584625da43923a05b0d5f9cf5988b59a883134770f71e9fa33aa2af07241740c7a65c163cb0e8039df50a8faa2eaba8fae018334b94ead87a294a2c9b216616ce2aae249f5d3cd38430b2d901025b20e8512efb9c6844a02c21ca76263c3500751cb8181b97e260c59670c9b0fc874485d8e0538ad0f802986662cf25d1e980675c366bb601e8c72d5a6b5814cbce4300d44624b539eb87169686032b59fe8c95acbcc26d93ff0257ff8c4c06a598dc47daa6a3201044a9eb1446e96cb9f27c9548bb5ae9150eb4db8f436e316ee5ab206879216099992940cb2a442414d57e2a95ef1f4e3a0f9075f52e138cce977752e4b5f3b71d471d66a896060c77a29fe792c95c243b8821b2c82c1286abee51052cf019f15c9e6149b3bb73d1728a4cbf3bcfa2f07c37dba23fe9cc8e5418fe88d459455c29806ed4c2996c2543a349d54d84f7fa414c913aaec4b6060f3a1bdce3e585d5b2d9652f6526ba9db9506b10bbd698e546e1a69f209412c84c6ea76f2cda2439bd5c69b25a336515b2bba2c0c54e5467ad2aa51d223ea91b5652d0c4002fb7169d5571e77faba43672ba0c7cd112b4754707f16628dac3fd20eb019c58e99d0238ce5fd155a3c853fca50dbec164fdbda9c29f73a63f3ff75169769bb0d8f519ab28e86b65d0d49335aacf50625af2df198512961969b6347a5c6d677e7f57dcc374c08329508ad8b664988e76b9e515a39cc4a10e98dba3f21ddc2ee494b077818704dbd1dbcd7bb06d1d1daf2d27f7b124afc74d6147d74864d6115c453c693bd1d3760a922306e37391777ee80335335f0d18d74dfb6d727267c02067194ab3372d2eab3c89cc45377ca6357d5ede6775e7285de0340c5272abe7e413b4c4a1074f1a6e086eb2eaa94d4b293a8886197105d8b7893b27ef33922a8f229503a9c5bf0c62147756e194ca5395db271cd0453ee59088d3b1faf822cb49d9b8e7f42c2776b7b1517d348336c6e17d6e87f21ee98a676935b684963a2a93f590dc0a93db97e0f175464040e04ca9c3533beb26a5389577419c7a74b8408ede494cedff0d38ddce98ecc9cda070b9e3ce14a1c40ff8d659a8081f87404cd0362673add444f949cddae44f2f5b784ee746a8b75b9b1c290c6dde1f7604c7cbe7a6a5cfb963eb32d34bab6b10a74249c0955ba120498271f2d5099ba6074bb5dfd90f8a8ff07cd5c679f9ddf928932d8bc532217bae830c575b1959b75c652e3802e4695022be5fa02541f9a58ebeb61598d1fbe068b4731f44a6d74e552eb7d84e3e37b6870cf7dbcb848feed28cc4411f9a4ecd75fdcaa6cf30540c7c0c8da6e403b342b06f157c762c1755e2f580db540b2932a9430601da490f79cd42c00f4780cbc69c7600a1462011a6782843a03925cd33ca9c72672318ea9bc791742befa29e458a90ccb6cd36031b35a2302090ab735cccb9591f5573c420961f70c38dd4d000064800fd60a1eecd40529ecb9dfb6b7d12d16f53d7dca858642c679d4513c5054afe0675cc45046623e02e999be6b84a28a82682af957c2e412be575e8df8a7020c92e10e62010c4f8c398b7694f3e9b725d8d8780a5883b3f3ca700aee1ea544b04e79be44b51f6b3c4e758245864c624e073fd1d3577e2eee1941aafc01f199e3d3cf3e1125155616d915afe497465e2c652cf4554024e9a0346823a2500670a8f4d4dc911a4391655fffb0d17928e99c15a69ae4837dd19f7b2be03157770c0f74627cccfcd296f08ce0bc77351abe5b9e21760a69b2433e59d992fce56a49b19a99a75039b078388f6d5d909468496b09bce286817dfaeb6c2c421778bb8bce7c22f526727ccaaa753c71f16038c3f1d8fd32bc7f375730ac5f17ef7887984cfe2d320ccc197f8e52565e291ad789e6c38321f8246671c66c2989988c77567da27dd85e911eb322f6e5ff8bcc328cb0ed80c1c866a7be31a43c7c64739e0606ec9cb3809d12f245b3aa52b8c2d9bdc7449983120e8af7f38d3e891e030b499d37adcc08f5f05a6cd6157dd41d95e5bad95e116ab448b2e2a37ac835ef5903152393ed4ae96b02c3e3f4f56defc775a38bc57679421e90b9f2b4a31e2ec9ecd0152c1f0a0713422c4e7aa276b59cc92900ae3b5602dc853d384b6667a45a92b083351506b95b483a7416a30f503b7cd11d704c00c91f74b822680fed52814e65ece3806ef3141328115f6f2aab0ee96ce12c566f11377e4281d0a33272cf9fcf9cb7f6b242c1210624cdd7e4552a2954bad03d8069e820c4df0499bdc07d5d08fb4a4e098404dc414b602b098d01e3c09dae967875d13314dbbd885d993ce8b8e043d315e943df62b1710ea80cfdc04b74b1eaff80bc8ebd2f93c2adeb734fe873b52861d7e9361686ea30aa7ac4618000feb3623e1b000662239739589fe65b8970a14a862bf12b9bd4aa7aa168aad02c48746507537070aa5d70490c02280589fa6943c14990de0725661488f640846ead27bd09b18138210276dfd985a6c84db69e28ecdf362ab8603df3ab452db4bdfa07d423adda16273fbc7019d45d26e76c1c0cea6992d826cdadb59d1162d361bd5f9f6b30c825b38364bcf8fe3aaeb6a0239753b2556f121d98f562f6cbd42380c8db7b947d545e2aaf43e1e0164dd8ff7a7996a8aa468f42598e70d5872bf533e747af5b8f27c89ea8550eeb16d95ae20928f902c5c7b1ca59b8ca20caf562de0fb5302a7c62e8dc446e9482ac100d40b74ccc94e7746f27f2cd8f3bf26376e68c12a6d7a634b6f42c2d5fd6ae51d9f71b228a490f1062fd49a54d048b408c2b111db1ba01f3900e82950c862ca8c009d846fccd99dc36aca2e5a8c596d6feb1ad3927baace933373dd6dfec8fd67d38ea921bcb4bf3adf97131c339498bdac87f33a1820868fd262cd25511008517650fef9a4ccae9adcd7e9aad44bc98c27b596f6154a0d8cbf1f98095dffee337c4847dd3718d4209d91295c7174e86b5a0027c19742bdc556e681f0313034b36e9cea6606dce0ea3c47fdc5b86f2663e9f6176ea1988f064afa6c064811c569aed4ab988fd6decf104f8b07a564bb88f56559bbd05e5e8860c2c502e769a3b9b70b1d6864a79b3ae47e05d3c18acc16153862352b4cd7180aae51b98318c6de8a22957005603305de95e439759b2a4fb493f008d22b0b5ef8298a15f5bd3fb5d81b94f79628c3e6e963d9abdd41c71f01ba51bb5200f548d5dab8ae15520fc3018bc026a8258d766c4db456be73faa1e487a6c4754fb20ba13aaf74befd8791690180a032081f8ab91075b8e1569ce84906161e0262a2b12e82bfc92a500b7b46d4661a94698dd4b66895f90aa165fced05ca1759825166b7ecf05e7b6320a4325149df1e1519f480773f46f3d66cd54c73a46e797ae608e684a2fa94f5df47a6fe0cd99b2a528d7f8b261abeb96e0e251b9706b24f4aa9f20eeacef240a88e95ef7b543b89e19a999a8ded281dcaa7e38ec540b523dabd869c576a1fd0e1cbaa326734662fcdedecc855fd6e08fd14bbca2760e540d0f8353a721599d88b5c965d375202f5cf49a309039b976e5ee37961134587102d7a47ae3ce3eb4e3ef684c1a1a659f083b6319f29489ea9ca087674ed23aa7e7677b08657c48bc44f4a40f63ff42d476733a8a060e905936be916c679cd5206a9982d7814b8b80a7af8b7f2a4f0b334e2e347c04dd22b928771973f1173f5592cb05e1f322f1a152c7cb07af8640da0fe0be43b39398b6e0d13052520cab054930841b08eb600d401d623074f0af4d6718ba3848a7f8df3ee6a3611e7c8a0497f7de07462f0615ccdec66fbde29e3b5fa96ba31f077165adf3a97ce979e912838f5191f979d6a5526c01445e22601a26b30c4e16b5e3283374c292856d27f46454e2b80a924b12252c699e2f70a216fb9f1650481dd2c7b1b04ff3e9f05ad02ec7c46025794502210c730c3129425dc646a221353de04bc4ee28901f5e60ab7151ed30797e59696412486cd6fe6637277176ea65c47f16c46db7fe6283683811a34e3a0b1dcafa91e99286aa0a1ebc2c423cbbc8108e62e03c28ec95e442de0275de932ddee8134ddc6bca195544d2ece401737c6e357e677f2c6daa82267a13c90d29fd43338e4c5481d0a9153aa6064e99976392131e6a2bbd186d15da1b935897e3118a2a139fa660fe1ed7b42716d4f6c3aec2e49a5ea9fe1d13a42a9cfa9afa24cc2dbb9907dace8914280f501d7819044d6085e8823042943ac97519dd1ceb7637828daaaee34309520f5922c72d2e822d01c199be9699cf70365e9aeb556f8dc9c7544e957d7a6866e6cf497b9e64b2bf0d5a77885b5a1c6eb24d8ea0cfc94f8cc12254d82645bd44fe095071ef83976c7035f4496c06c463141afaec39df1cc848495b0c18b75471a072a46b375a49bf9251cd6bc3c3843943f68427bdd33057f794a7b835d7971db5b1499d2a51a577b08b6704223fda4b82752ad7f4fedc4d81921ef17ac64b50ea1078a42ebe24427a911376815b84bd0e1fcd960f3f98a0e64e5e597b005b1bd6bcc92b46e52e1f55940f12bcba317d2fbeb2109e10e85a539c71109c5fa4d75aeb469c909a209bd1362fb5ce8c38eb9c854afc2791ac6e35466044b1241cdab8b7567bd1bc962a9c055aff33828f4f7484e109132d41cd49a59ccc1108871a2db6855714094e679cb73c56aff6f709110e0e98f7f2731ab8b8a8b6104c4efe1481d926bbd59c39b2579e20a0e9b6cd4d26af93393ccc97060a236d8cd3474de061aefaf8791755cda8046de5a79487a08e308b553ed26718dbf3a87aed1920e7ef8a24b017223a69935ddb783c62e6c9a0b5f95c5a87e88615694589518da2833f18ccfb2ac8e333c7deee42e1c27601579bb91a2c0f5794635b375432cddc3c830b1293a46797f0844a970b4db9cacef04f2d3027acecfc0cf62d18dade32c903f6570e4aeb0b8d858f036b32525fd6b3370dde336559684f3b93e0962113472946e041694fcca04d5275c4abb6c1931b23e705417f839a9c0d3a6db8b7715ff73446ea23daaed913d11886fd74133e6fa88a56753410ef3f0f780aa1d8863a3bcde15935b82df4a90f5bd1cfd2ffaa7bee84732c7137d1ec168b55a8bb00a1522eeab70d7f6c0a2d6c345097d53a26e2093d8da31de1c8e8c68269a93d646db6d6b536c05aeb276fb9bbbfc56243edb3ed3d853593b8d8d423008ee306d637dd55f829b3567c6c36ca3e6dabe2c56876639163ea03d9494002d3870ac8530999703a7a4a09400de5343eb3da240a90f4f532a1cfd2158d4d92033e284ce33387272c3dc9cc0b431f83a44dbc00897555cf31a329ec022ae649d2a4ad79e47b5ac65ea4fe58867359ac00d63707de44e35bc4f8e7c33481ab64047a3e3c694bc8ce97aff20cf101c6bfa2c6809ec3d33dce29788ece5a68e1564dbc109039cbab296581a57944d055a5956d512fc8d60fb536745c55391ff8dce3860b6f0b0f58d3b16ce6d53a8cbfa1e3e53327abe355d4a602bc3929f18ae1503106e0937e0fbdaeeeae1d65c023e552953bf46088c54b6690cc9ee7d12eb22f2540ffdb018d7b47776aefe9fdcdcdfd55b1c4dfae7762999784b69d75585b8cac2468e9341e9b1d7b0883b95de483d2af4898676adadd788a6cfe7b8268cf0316db551b28d7174fbeb2df8de4d91cdb4a0948b9554b1e92f225b7a06cb899fbc30f92d66b44b7ec8bd7c3b31bf37ad096c7aa726e1f598a04cc13db04adc153caca042591eecd067454ff7cc3c74092d83450be09a3de07913602815977d46e0553591d3cd9092999d7118114da2f4882656613c99b048525929580b08795990d3d01061590f8dc29c2fdc48a96757a61dd3b793e276bf524161363b6b717a58e9e4c1904107ca73d31051bbe28e4fbcf89663a7b63db638d5e8b945956d46816ccc9679b2cbd228ae5948d40856a0685b3aa7430b04d33131eea6336cd0f092e39b6457fdbe76fcdd0e0feb50cad5ea8d41e5aaea4f72df87f1c92410d9fbc13ddff8e71eecc756c9248bcccdfc1c3e6971ab7eab31a782f3bf17db4a9650865de61dcd74e85611ca6d7fcc2c1c23d6fb6ee7fa04f800f6e48d15070b1567d3404df10c2040996489055cd1a5cc0df517458ae71b6cfeef8fabbae6f44f1c2ba48b796d31ae2eaf15cb2edf34691887062864786db213bc110da5f82b2f2a9a2bb31320461ac21525aeada9b6337a8a8a3911155373df94cb8f942857eb471d358b8dff34d9c188a0744245a2d275118102c7c6e4dad370c0b0b83f167de09c0d1e38ccee5acb367f52646459d85718a2c80ec36583290cc7a9799b27f90c0d634ab84422b61e725227d70f64ed01334ceea9e8ff2d49a50190f77e47df84a645db80575bdb5243393178ff28e824dc1e3feabd7a2e384104d62bf832855cca4476a151905584d0326887b48ea403f07c40cc44079b3c994954c3b152287653634605e03ea791aa7e818f1eeec49827abefaa9fad025767404fb26227bba4b19f69c95c311fea170d2b4ba3bbafa65f98f5d1f23d6221aff3b406da2e55031a3c59fa75aa2daf73b005a2e5357151aac1f95412406cbe90bf8e2f88f64d7054139f65eb76ec1974556d127c9d9ec1758bd9c5e13dcb7bd44ce564c5431b2cc894524184f860f257d69f1e93ddc0c40698ff385240c973dcf15ae3b27a2fd876b54a4789690b633a87fad9539682f696a3f75c9d3ce3e99efdbd8f879302a13acc6816cddbc6a9665973b38b52bddc9ff0d15c605be245b07925ac499275106d46c38598a85d122ccd8365572f6682efda1872ee6b1231bdb2fcd5474c3508d6d158cc733cae1c4ce9f3de4d9e0775ad742de2ebb8cd12cc74cab976326a1f62b237af621bcfc04d638967fb63c189a63a6432fb2a86155d49d3a5ac479498adee1913711eec8b1814b985efe17dd7f0d146c2fb233bd4ed724bc55f5efd4bf4b23248ff9027e2d3f4c33aa11aeab8835a3813eaf3711491f9ce4411c33caf3699f85212559c1aac469206440eb3b3d0562c311cd6f018abb2f0edc03050cc3e8628c1e161abb22f2bcf10757d001dd03279411af44a3ebea96fcad71319758166458af597a224c1a3e2350b63bb570dd2bec8c413885d8e3dc95775f9e66142f7442ca7a4dc95c217325cad61faecb37098c9b89640bd3c9d13e81d0e4a684e2abb0120d930c9a673491a097e34481745dc1561b203b1c1162e93a1bd372c2ee2786e42e83f50149cd4eec12c605f772c9b2c7735fac722287dc0b71f948bb655db28b1cf4f6b58e5536b8b5c1f0d8e0e266cd21111f8a0c0d9f334b6914c13b27e065de19b88d7c592c766b6d21871a4cbf2e262be9c2944bef24407b6624e1112bce3e1f96e46a5dd2cf11d48575f942c6d7fe1b9fbd02125e21c407cf6b1b695ee50ddde20dd99227aaf51d37b8e56906b56f1656b3de60c8b1a0edd57a94a51f90df58391cb46d45f86378056dfd954df73eb798f5f6a4ef11c37787c726da9a49daa6dec933aa75a0179de0bab5f259d3e54a2ca4ffbcb95e3bb50387168457de4f236b97fa93539f465b56cba9238e53648cc51fc2361c2e8577200fd53f68ec9850e00c5122e26714ff43e3c564cad9e2abb389721a9522a2443e4bc59900915910a9c6179acef2c229abf69d7adb6daeaafbd0b7c299e4a8c3c124530feda8cb78762bb4e216ef815906ad7a364215395b78ca8392cb059586ef191c29dfe1ae8a01e0946a49dfac8d6317e6b47a2c16f0c9a25bf3cf4f4704a47e9d0e4f694f229439027897f5f2e0e43fe1654ad44f0c462a539ac627e42008a9425a26899fc982258a91b2da13b64240a922a58ad820a4498554ec3da20261196c38612fe4d4bc6a518aea5fb6fd3d3534878a94b1919636f51a8ca903aa7e8681354d2d7d5841664f14935e5849859212bbad9d883b50d6734ed3f004e480bcca5ab7c4959e6562b7d340188f6c7ceb8b3bad596d8667f86c5868a0bc8a88f58f2f990b6266ab555d0860a8b73caedef9cc71bbcd53c99e677cdaeebb1e2634b73e07fb43fe1265b1739dc6e1b36f341e5df2bf03eb4e9b75932a558bdbe35f4c0a8b9ef989cb697c0e88c6d66a1402210a3cd63a1802a08fd007fc1e4f16f73d2f4fe8b4ace7ebf6402d9a24f50b5443238c2360cd59baf9abb2d046a859deb54bd883c9c8db9680dd7524e79b0bad1ade5001e1cc9435a14285108199c05047935b3582973333e98d5ef71982ec4819a0981b24359d82048a593cce761ad64869ff420b4fd4c658cce944c4776f8eb96be5e973d4a00455fb0de93a10bfca339b982356fa415ab9f17cbfb58aa866359ff763e6e9f7bcea6d99ecfa3ccf81aa0c766d75569fde1c4a6fdd16c43c026cf543dc31ae19850e4013e86c22a445026ec14c50d41d0d7d67f94b3f67d4abfbddecc019f6ee97e7d018bfb4a0a8def6f980b16e711261bc8a4392cbbec30e7f47e8f5a27dfa0c1177c33caedc9b953b7b040f9704817b49b2c24077e759cb73ab9aa7f88ea7302d3a40d8b7e55ea55a4d46c6d152291446289f866eeb6669bf8c13a8cf91f9c03d4fbc1b9dc8407876d940209b860c809bb1128a4dc6033aa8ce3f30c7d9d43a18961e24291d098aa3ca5b85ea594dc885bf915f5bb212fdd650300ce038766347947f1cc69d44caa12962bb28b3f95b30f21c99fd64cf9064e0497752915a84b481a8a089cd47ecc312183e4869c1a441c6c21675ad66c21eefc0d8890456f6b3a6e6299ae792b56f034100cd532822a4ea9a92c263af5260f94b63394663d92b7a7472cdc80a7056b2ed27e173b10eaa9fb8a302278773800a549485b5c6da6394275db5b984fc475b3f0594f8edd1c71341820837493c51c231a9a1b7b39718ae6196ee79e3ca55bcdaf59c837d3e420b0032407035484046dfbc251e1711410627060e8c16b25ca529240fbe2dc8a9fca2654ec9b012faf315d98a876780f9300694bef6cfe484aa626e117abfebdb59f9fe3befc0b3175e1116cd4a73402f11314045af5ed61f102e681204c5372d47295f4c4841725a090593bb27990032b1744d4db0306b777b51ba30a2f811042b815ffc35497f601ad2c3b5b8753b805eb4d47c8430d56b9436f348aa61fa10fa934c99e6af083357012d6636d858bcb1d0676ac1e7b8e89a085a88d521640b8150350f34f1bc53388bb4256beda77f718b8432f0044ca8b0420d2f47b8f32d94ff0c2019ba96015f97f30764fcd3f0ef04154365d1e6dbb21261cc71ff78c347c62f13b92b5d46a14c8df63bf8adfe93516e3274d73887a0befda964e4225f9dbd1a927c3f7ae22a882a4c0a60ca25e2842edd528ef4a1c3a25f43ad0faeb11c9e30470c23f030746cb4bce175defcb8f0e480c96f475e02af8aeffa6ac2df9548a30e55f8b488fb586dddb7040a63149b6f6dcc51a8da83338ca191856e707cdc810127a67a2c0127510509c2ba4b0759738bb224223c54ebc04db9372126155303f2fad620d2d7a0f3af9492ab58c393c028a757150089183c5c9cb8068dab86b700bd8faf01192f281cf3ddcbcc7f0bcc8a8709dbe538f9f15c9b7683d262e8987573aec0b33e26b4b5ce7d10ebb0f65a1b21af805508d018c875be4b2dfe97619743920b2f27256c180bc2d848d1fbf0ce434e5dfd38e56de281e56111e74b8b863daf7c4ba44e5ce3c0051d34cc61cb00722e89c472e9aa2710c1606e6dd34a23667fc2e20f2a026c367e329d4fdf0f3b53bd9941eeb0f04d9fdc7b2ae1e37a161c0eb07d1081ce4a6e9c8e12a2395a14176fd62d37aa671e05e74abf86d339d59fde4a1ed3e38ebb1a471d6142962f2351d771e85dc8438af1072382ec06ae39313d356446f2a91f2f82c52df4aab805c1ece0520724c9a08d8d4d31863d98aa233a6abc53c863110fc967f233daa8d793828422aebc2318dfb623db287a7aac05a5adc21f934077ef69bc58f64e2ad8190522b282220c8e23cbe8e32bacb268b12bcafb2dce4d6e945a400867046c9c3c5ad29395288bbfa7beafbfdb3785877ba056113727806c8c41b54adced024ccc45a5fc535d39deac049ea332866d0f22e9ca011bf454f5405db78682d09145bf2db15fe473494a451dfd06b7a2e07e21d5159442a7e300631c8051a731a373ca984c1ea7680463ea18487d68f8dc2b81659eddf9362ac3203d0852d31c45459abb88584a279c6728b842e7fc4dfa6bcee4c6861a92759b6f869f092ea4e2b1042302a509b0d48820ffef1c8e068379e3d8184b1b04ee407bc10fe2af4b5a21706174d80f9ab6d2512cf836c50689fb1037badb4966f62be8cd05046e1e6ed8e39e3704ad39ac1afaf52a37888c4256725dffd31c99d035adfed75ac0ffd2638be471c8ac91a884b64d00cad35f595669f8b757049ef80c7f1719c512cc940922aa10804eac33023a781bbc6c4d7b44fde4ff05dfabc0e5dbdd8f41414ddd0c1645bd36497beb7d6a9328be2d7cc4ae2a527c2fa43cd6b5b687ffe9c1ba46816c2dbb6c7d8553ea086d97803dd5d63cdee4bc706e699b8b7a30b1718bed7e1b1c27469f996058c7a45f6e1575e9a9773b81ba0192e4a2fb3d96b992f7796856679a4e58bc85e371862abed4045894aac869b8abdcd731518af0342757f8d9b19c09b3e5d7262d2a1a25affdac99540771c3681aee7b7b5875b5d426ada3857293a07eba429d68886b1cf0a35b748b44f9e931742d4a855907b1c20f4758e014e6e4e5da391b78955c1c0935b3db41f45ab0a586fabceeb0bce9bbda725909dbf96a27410d93fa9147b682589f24258597dead650599a2ac2145d7e18dea5d6d46d944692fc2e9a148074d3efb3553a02240ae0b09a34b13e26b1d92a6f0e17431d60266f3f626741c80deca0076bf14909d0b63e4ad025ba18c987ccde493efd24b09e1860b5ace34e16a2583a710e1ffe4803b138c5a649d988c4f52895a28750f3e099119c674053a648940974a3fd615ced2ab27f35795e584deda150f642053b86157d436ab3b8376b45baceaee94706c0f04bc1cc7399e6ee7531cc864224375878dc86b25a1f2d996b533b6fedc703b867ea3f1180e53ffa5f301ebbd84631c4badbbcf240aa53f22210509e60bbdf5bf85d0b5d87d8f8fa65233cdae68ff93b1966814143478f384fd5f7f78c092b1ebde8e0b58431be67a5d43a0e82fa22c116f485b3584b12a02437c2d5d6cb4d5125e492665a944e9b64d00984aadf292d566a700c9c0cbf19754b1344d89386964b344a994d81feda592e3ad4c574b0daf9c906d287ac015996d523f3ccfa053edf3361822b5321794a89353ae98215733158460d77a982904680f4e577167461ca1d0ceac90a9f2643ff9d748645da43f035d5b267901a49d79d81e1beb9ec0fcc05913f846417a618ed7cdd227951653246f6619b4022880ead95c7ed32f1078963a6d930d3b43278988b61fa78f396d67ced519769945f6f5c42793db6bdeb68de0eb36e9430d98a0e53ac7e284d1a6298768a676b18d7d8fa42937cf674259f0a9f6888ebd95f5dfc32ffb22e491098b994ab511e75817ec348f64d1c5cd163a4a9e7b96da4dcb54f67ae3bfd090a234529eeeb0739d7ae200bea2040a554c4fec3838d4931e29eaa36529a377d724eba325e0e2987923845c9b57442f4083997036ad4f099dd9a30417e671904b8b155204794030447e325776f5d5af9d21c2f6a0f0f1857da2382581a05ce217d26abc505829c311416c46e46ac6b7a66b0bfbe8a8e99f8dbc9a442e51fb796ab1efc3913c280e8f8a5481decd3c117a2debb84c10265088214aaa87d48238380f03ee8799e8d5ddeb23aa5ead64806541ba31aecd3075a4ce75a11a615069612dca921cfa2885ef372d8428914833f6aac51f115da95199086f50e3922acc601720e38f5cddfdc60d9447a1c135811d280accfcb8de9dd1aa6cf5e6c05d0613664d9ce238e6b0d0840ba1678b9d7216fb613dc49810f8ac9c647a42a43bebe46c56a6c2ba439532d459417e7b04eb7fc2493a24f13103afe39927c553c8e37117e0ad9abda0f216ed9d5649516ec002bf2d6565eb8f9a0aa9ffd6d161cb7b10b0591552050ca7321d95e0b00cab4da702044ee9cdb3d083d60eda1cd21edc568bc65145c89e71ed6722394140760286c639f1a3f2a573e32c429042b7c47523930b3237f3b9975f0b1a43da94b723c782cdcb7702722ee03cca58551f0543adb28e3755563639c3c43cd0cf83a39e45b5469bef0a13bd39051e3681feff09fabf9f55f986685e83e2b0ff9c8a9d47fb13170da29fcaaa420abf94bd21c2de6d191654236f172953bdcf4253dee3e46c0494b06072829cf7c29ea0df881857a9846ef3ac42a551870e0650131a45f9be959304160a2c0e313c036fa41e8871558865b29ebab6029c153aa6682712cf9f02b6d21e825d1b5a53630d889f906422cde9875336bca4fc6f0e10f0713c97b178dc03ed50fefb2555a4060e94deda8ff262252b0b138d7b9ca46b7d2c91ebf86d50ad8a2143464a7a9c608c3d7d43c0aa65a472d114ccd02655e1e2347e783b8adb8bdde862c6b5460666ed168316f70c22cc18c8a18b156dfd7463410c4e773162191b76b573dcb6fc307d023cf7b82143af76b8455257889e326e4fed50f6f524c81229a02474bfa83f786fc3a74b5b04f5b965c06fa016b8661a394d4f4052e2aa9ad80fa69273a653d27513f5e395ac36a1a90a06aaa00f680ef40b47747a277254e06bfef07914497e07cf3ead005a52d107aad592b2a30beb14c457412ca03076bdbe332024b9f02123b2324ba030c47af19528d6a9b17035a1cf586157889ddfa27bc6eae194cfd84a188208036ac13d02f8e3f36daa2f0b6e0075a1d5e1cd694a7db37bf2e285283b9569a164d94b1b513a442eb5ba530a7fa11f9eb3553c99981b75f1018465010a09d13b5a400a21d60654698c0e02254511095bb742ce4a46881e453687d225ef6503a24698402928dd97807b073afa09f4ccc23b867acf01b525dd05ee951be539424b36d4565476647e7e0d4c98fa294497c95771242511c9953ba594026403a703bd0303f0aec6d25e436d0df9e74f21c502cffd967389aeff2deb0c95e9e77dbe131f67116ea4bca182e75e63711615cfbd26e32c44cf31b8a047cc5aee1ef2def52deeaee91fb4a03dfd3242ff1eba082058cfd49aad6102cf3d3a81f0e59fded45acdd45263699199eb73fd2233c1d0358722f47f0e7b1ab420e46001107a40e107fd5221020a427d427f6da2f613847acd77f2531112852b5c457b0c84170833308014a105423dd45e0001a80085e96baccf4f3ef77b686b306fca6410f9bc6badb5263709b5e729f028dedd5a2cfe85ad21f5dcefb6bcc1d7fdf61b6d6be89eef1c9ffb0ebb7b2d74cfdefd4a4375f5105084feb59c76fb09359c7e0181fa41cbe40cdaf784fa47d7e92415085184ba4697de347bdfbbefbdf7debbf761ded73aef6b0db792a95b87f037574158d81350b4b57dc81be02eb055b4ef800df4e42c3226bae973e4f83953a00367e9c055b4ff4d285b3864e044ff54480a55ae829e08895c45fb2e34d396a5136f0a87bf9243067206edb7f621e020d0bdcfd0b5af2f1f0879c3879cc125b65c207bcf592ef8ecd19ff0f45d353d7437a341a07bb7c33f39b1e0f30efa934205093c0082c1a18bf24f0b4337e59f01105620cc5c458208f226a6e4c9304d871e6ce205a10f5220cc5c257394adb257b1be89db77ed4ded3b60619b37509ed73259ce39bb2bdf834d24c932e79c73ce390fc92cf749be7989731fbbb9de50d1722d535d7dd4c7ada197f75d52ff1e508640fab6f0839c240220e02ac1f3f2cbf36bdf087d1f779907922449923c4f21f7686fc1b059287832e85388a6b9554e0cfff43f2119dcc4d3a3c2944d3c4f8f92284afa3cea899b78fa867e13cf9ecf61d987a7900f53be6384d2e7eba1272a745b3eea3fa028ea37b1d71bbabe114a19ff5195ab6c5fefad63aacfaf9cf8bd89a83f87e78930dd44d4ff50d4a33e3d3d079ef2d36417ea63b4b22c490f64b7efe1cc6e42b72c7d4eb2d6507dfe6cfb2ef951dff37ae896fef4e63e87e91ae72949b21b40ddfe02393c8741be1a7ba0baa8a613b827f5af839fbd4a41f9eba083ed3d94431504d77b84e94d10fb347d2f4bd397a6ef807c7959bf54f2bbe99640aa0fb04ba1feeb97babf9ba67acd3f6fc81b4eeff64e3283e939bf42336050b3cf265a0035939a83fc4b9f537e10d8bf2c85fb9bead6e049e066c91a941fd04dbed63e48fa10864b6739761ffd39ce81fb2e3104dad3db73903f1165b3640af4fce94f101a649f92d25152525050be5683a6ff20fde92fbd1a4ca2ee106c10e5e63b68e639f20c61fd1d1fdbb6d71e84d621a079a33925850211d4b8c64dfb7db3b6b7cf295b5ba1fa6712cd5b1bc916afbd6b95a43459895c4dd508351eabac340406726f594d5d763e582e2272a4b4751fa4c094b68e0027efef0583ab281481b7b26000bc719de9c28b8492d3925668c0da18053720e369124b39e06186b7468e75b40e1d22bfc8734b7834ad80957410397815beaf268148d6012b8193089961d254e56b9aa67992a6699ae6533613c08b02d66836c660682648716242b474d4cd48b5e8b12256b3e185a522b569f2af9757e6d102c6a06dca3238016f06ef0bbfc1c1972c06fc06df20be1948db7b059fc1c17aa788ce7b595e5d938d3009ca6bd94dc32b046b11697001de24305a0a78b30dfdd5d32f7217acd9de9e991a181a132fbab49868004789d0510c369545b394d63c693cad020ece38f2101fb0161cd7f29e80654cc014bc46f4500e9b82b58c0ab9ee8257b3106206f9a6f924c17b046e5f1a40ba4d2cabc53130d90dd844f24d9389460d6e92997485b9b1c1ec0b84c74c0fd1527946005ebdb503fe01eb1c9717073c8020f084177db3dd0c38059cf37a9853d4161cd5dd99d4d70c90a21391a7301a9d6fa6c626f53dc2e66b04a5ed32dd0f3403bcda45e6c25ac399d33f62194ccea4faa60955c1db84ec01e71ca68e9ed294652946219df13cc69d8f23f0beb17453ac834b58c1c00830205f181a892ec107ce3d90c0333003b860df04af05ef0254887a208e665541648ee28c762e7829faf1d62404c3586395caa4af699ab1b1eb9b5a8969c41258c7789201cfe47d936943caabe4cc6455765f3248a01be104028c1f1c466e633e479a9f6fa6314cdac9c2ab8ff21d91175df455b60301674c0778730d4d97c760de22c1000b3b1e24657734d63ec8600a418303049515d3c4a0294c7bc49b9d973b2686f1714541059ae59047f5f8ba2623e293b10c4c92eb1a50a6f87f3fc73175df55bd5c4c1b8f9652931d369831a2d7e27842f1f4229ca09c1c234d0cf3624ccb9349833bae692b67f9735ca4faee0a8a1417b1d2b83814bf2cc545a89e1657b51e17e3a2daaff0735cfc6a59719c69adb5d65a77adb5d65a6badfbf04c790c1445c9b22cb52e75699a5a9bda2c4b7284fe3d6cbf85a730dd423790334972ce39e79c73d2d47524d4bc893ebf498ffaddeb0df50bd71f6484d91794fbda73bf8764164f5310368eea6aa8cf7d053e6cd5d2cd8ab70453773726b7ba0551db2166a365136b816cad732b581253ac15d35a046e8b245a26a51c164649862d82d7eaccb52284acadb14c37d89cb11c5d2b8b2e2a264e6d8e113be387bd4ada698392685a1b4bb8ea58a73716c887190e1364ed08af76ad841b5621a0d8b923b5a0d60689e707a9668d6bc2964012135997b4b12bd45a1d356080ad46b4da17572da26e92848658213d2c8aa3106547451292c888130284880eaeb8150a3b82c1265171e2b8a4f5168de8c2814bc490e1b176742cce5bcbc376422d8659bb15c6c25b3ab2da362af6ee893d7154426815d2436374d39e19c5b459782b10ba15eead4d626b7ba8ad6d666061ecd216912c2554acd2d34ae4684aa845ea8129ba614d14c5c0e159d1d5786b6bd8da1d6a5b66ac8f3096c6560b96b526a1626d9ed8baa39684d04e0f2b03df34c131ad11cf896ec85beb836d0da2c64a99a185456db537597454314fadd1910821d6ade7c57bb3dabd31ec0c1e0ebaafb7968aad5da1c67e99b14761ed8fad3648162b47c5d23c291dad7442ed909e36a21b128862d821783d746d9137168b8d75a1d6ce99b546c25eb6d812d4338b35aa27552b03d5c648629bbc297c5a1c599e211b9f2198ef66b217efb75e42755b45fb5308ee734f72ceb95fcb10856a6d32656d096ea25ed93c88ea6f200df6de7befbd77cb422da35a2895fc390e72fa466aefe738c8e8b36f90cf4f2135002ffc1c03e501cd7d37c8e9d03393e72e39a9b5d64057035d3ddc2c5a830ef566ecedc839c78e7debc66c4153024de1904049381c08080728e767c93118f444baefae90a5453874d8c40d36f187ce8f4387ded36e52b21068d0cba6f7ded9a2fafb39fe59b11e517d3fc73f27be1b6455fc3c9d424733e84ff3e778d37befbd37f9bdf7de7befbdaf6c3e77a78fdcef6d383c663a043d9104dc77577e5e2f3e68c6d8470ca72505a2f8ac605223e2770b7eef765267ad0b16ed870f1211b3f7ce06f9c06b931f1629f6e171818979b4beefe7d8c7f84f7e8e49dc91310f930b53cebff464c24ff386adf59317070764960cc28abc54925281aad1a6671401e4c6a21a0452a4428a73442569c24e1ab34f922d474ef5e7f898f44fae2351cdf167e6c8633cbe7c7745860c08b49059363879c92500cea2780e2d6dd5dd6797a8fde77867ee0351309cc19fe39db4ef06bf0bf4912f90e47ac7c14bddc9c2513110f34ed3778951db7479213949f2221bdf4e4e4f6fa78873fad64d357f8e75f0be9bb5823a43787470f0e894d5e888cde8c4a0d17161d4c992f13fc73a423a36df5db9f9e2e40c8b2f97a21a2485188811fc1c077a89482f71008f874d13ba9d266e45c0c094f47821b232922d3c399602484f959a748a9e334d62324f7285d592699ae6499a2609df348bd44dc54d92e4fe34eea1921795584065e9b95ad672519471c2520b2222a2c91312115d1a99119822356d175255563c463c9c4ee850d99da1d1c518218365044c8f9a544cddc854f590bac9f17089972e256f0da92b3294cfe047bf4ca174a625e49a84de56dc186303f2a064044a46d09b8e9606658ae22fb1941871346d44c58b381b5c36e6def062e24a94f5a8c0da29c9a1b2c4b23113e0f9165392ae33b01c533e8e60726cc3c248b5a4882cee2ae6c7c7a0b669c5a4a8a99b26d6dc37cd1445df4ce12934a7f4de7bef0d90537b07aa4192244d4faa64b6cb215602450c1edd8fb21b24688c4c436024c558c5f4fdbdf706cca95925cb5c52689d39831561cb266aaa384ed442929ca72b44929a97da90b589095dd51109230baa364e6456157d097e8eab767c134dcb88ba5aeb93ab70eeb7560c9abd90a855c27cc02c37558c620da8e45ead1af1b927a9e03ee79c7397ab949892a9f2aa68522d262699c9a74ea028fba1d8b1b9ca0d86f9ab840a3ebc21722f3e323b710b24437c2cd911f9805191573d1d5a4a85523ec65514460a287ef81813922ca7dc7e3965e497cfce3eb5638a2c889650067f2a040cba4421c9605d8981295969e0aa53348458e2194642b4c8845cf09fe329311e4f897117132d1ec86369d0928b1a417668b852a09bb4bcb999a9253596b82c45319948a1648294cd49549b2faa489afeb8244595f528b474cc2529caeb4ff8398ec22ae282e4e3529c11d6c346c887169c873bb6172432e2aa9d36d26d424ae2f4993fc7264ea84b28706b20d3a0d65a6bad49cf94872e44aaabaa1b78ba28fc03b7061e2cf3e624d9f7f9e3a0e4c2fee38093bd729ba8eff780efa6727f6ee226f6dca350819b13393611f4f90f023a13b5d79998bdefc73d8a729fa5d6c83c984066d980f3a18be16735320f2cc07e3d6cc9643c68810ba0003308fe1c9b80f9fce718aac97783df0612600f9196acadfd51cbabb1220123d26a435c5145ed24b16c433e3deb0fa8104d50c5b8246c521c7b04480ba463958b9584b54b30c254b0404e942db561efd80876ea0987c7534cfba264c8085be4c63ef1a071b6becd6863aeb4ac3314384d308ab07c581c4e3aed90d34c7b95c7e6a063c586b4377ab44f686c1a8d1e31da142d5854ed78626b9460df80e49a8eed4c93b145c164cd3b620657c3c67aa51dcbda982f242ed8a8143a26a490d82042ed9b887606930d8bc7f40265d7121561b37eb02372c499b525c86855bc80c362e9a46428b53c88582324048dbda8144bdbd34986666c0080022318000018088301499223318ee492ec0e1400074fd46080603c483c1444e26030100883612806a01880011000a118868118042321b2e801f0fa88d9c4266ef25b3125ceb6f377b9624ae864b5607252a5fba5bac39c02852af3722b8b2ae1aa1209d184514d6f540391c6a953e4cca42f79ef94cba5aa34f97d827eba08e1019936051d5809416dfe80b90099a29ae5ff55772bc1632108f6043fa6da858003c0d1c9e84ed90f2f3c7d9ce1b4772bea188f4556742a1e122c8932f8ba25502497de4beaecc1e190d2de1c10fc715f08f76623052e0331a17611df5c69d7f2a8bc12f843144ca773017c472710ae1fab222dfa47b1a6e58775ecb7a27f6778d4158ef78231820058d5af95acd97c6492ded38b2e7bdc8d3906c9f4ea16fa1cc25bb6473756fe8f40a90dcc11e7a4b6d0dcefaddb02c70c1889083408aca6bb366de698709e82f4374ba21996db058f39a7a74faa4e60b88d6ec8e9d3c683f47afc777ef8a31691ccf5219242b4c08f0c31b8e204f489253d203eda0aba4147912fbae21e83868022e7d244e37d5d5f22606bdafe154750591aeb8fe90dc6e9f5f8712155e822887061163093a42ed359452d3a2cb14f21607b6c64e7b85c5b082bccdc10357c68678999f201b880f4c2219b16b0332de8885905c458f726529155fb06bc1e13b4172d3b2e79b3ea6f8bd2e12e7029ebc154efa1a7e3474abdbd7afd59481b854b0b873c18a47fb39a24dceca73a05f8cd34abea649f1cd167825503e935bf13cceab597d1124f1c020415c4a50b4c1282b03a698280cd866ff1ee6cf782cdb8dc434c1d606d2e53c5b7c0d6e1b4cc11a1a5c4ae3c91ace35009a57b9f3514a87fcf95eff129dd55d1eeaf5820c9d936714cca80e35c3ef868be166be6f4c3927d975bee1259787a7c39fb450e55b75fcb0676377d3450e901eef571de19e2467376227a9208788231b7d4c8a2581a453ee48aa56d5c2f577569e0ac2057a57db3c214791cfb687fce4dabde9008db3dc55ac73a86115a04d56cdcf684517112395e315fa2a1278606fd710904c11b8e53154895eea440bc3c3c579c7ac0a921e191a9e520cb31ebc4c2a39be88b3b7078d165f70dc7ef4bef11133723882e53380fafdcb8bd4b34b1503cf72d560a14c022b56c7290d470eac17b1034b65816a571d43eaf77f59404d4a9bce7b1f03f000caed32988fa97b35ccc1505cd90a5c242471b825e79dea381066259e004fc996a6a6e3e2e2d5e985699a6a9ccae457cc41cd3f7089528fed33dacbe5829f6623e1e1ffd2041d3c6691107f119e9231f8bec9eda74d0de4d6d0b4c2e39530b1d72340f2cd6b642960ece433be3c53cf129ed450fabe4d245869c6839a7b71273a425b83cad0e9be2461b280eba84e2541bd0d1fab702e96497394b4496228db914d11ce792c51d4e8fa1642fe0bf392ad4b3e6bbd50fc907690462fe3661f95a6803c90a74926534ce7afe661612485435918ec4763e367247f23188f0e3a6b3da7a4fb6e4f90e8397fecad14bd124d49f91d0a41946dbed32d9665dbe8afaf3b354b1df41c59027a8fa08a9930256c0db0e29a28fc3b438e625e002c748482f7f19d4350b8d653cf8e6db3e184465cec367f325461917d01253556a802739c7502ffc52a7c8c756c114d57542cc5f91fe4709cc5e365d0b80c1debb4709ae3e5e21366143ee0cc7130a02a0b42cc4947cd86afe59ac96d3e48b07518cd1aa21262636d41703399c906a0d3179418340e676e25724aa92b0f1095105d80221663ee77a2cb41404c98251b987e76fb2888442a804ae05df0d46ca3e997af14869fc1ccab1cceed6d9b45835ee4f84d1732e8e704320023e4871e19af3f6385dbc787b2b755d79b78a285bc24e3edbf4bfd0c14b41bdd677447bdef9b4bcf04e60ff808b13de5e509965450e83c91f8cbe636a0ea5a32e4b7597d480ac627bba3b1dc0e4895c52aa3c124564568ac7f8c7838cdb9ad823f7fff6e5a2124613a3b1e42a21c8387528a1a33566e97456f59f49c925fc683b5bf74d1afc7c1f49765b64ee2a91975ae7a8218ca81d1ca1e31a5795b4320c8c014dcfdfb6fb62101553bd9c50fd4dc696e4e494cc00d07404dd474b1d72d15131cd04ba29480a8db3e17e77da1aec072e12ab63c515e18b2030e9828d397a35854fcc592c4a80dcf98375fa548a0c83c295d5da1b5239ac60b5731be5e17de846b8f04736c25c47399b0f9b74aa46184da7de35eab7d966544bcacb6ea78fe2ba191531c13690e4b8a1062b12531d470d1bb83ba7092a05dcb591cf01858d3f6e11bbd5e02b95531311a8ce06c685cd651bdafc0726689813206bf112ae379c815d0a82a624177411d706916e98acaf7c71cd4d26c8cc06da488a751055b4608f541d39b66044cb22977a4c53640843d03c445d1d5dd740718329d3c63060b64b9c230ad0f378c3867788197734aa4ca072e6d24936c7fa5c2924a91179b7caf5d1a6446946e572088ae6155589e67b698f39514be85844e1d914e9540c518e175c9b076678430fc828ff0c19e212b8609f11b10ea35100f7b98603d0b5f6e957f8a784b78a5c501a861ddbf72d4d1ced170338da5c8c9d942ab4d05d0e07447fd533d2d5b599fbd4071f2d98e1182d4ed72b4a4de642e6d253d61145dcc3b7b0c1aca01fc97ae4032d6913d40afd5db9e69aed66e4039e1ea6a14d08c226a62fe41a989e0d58d7b4ac76b284abfed231b287bdae97d690ddc3ef4b64ca75a543a7dad8063e4d1ac3c62581f7815ae3115341ad533a7cb4f26835681cda84302a05f84935e28c50d9d231d686f574eb79b6b46021b1c151eed1d860e6d01703c6d3c3ac3ed6ee14f434eb13e71f6d9cc7b214a004785823cf501e0761abe3861049907205cc39ec00ddfd2a2590f83e3d6963e3146d045c833314d1ec56bc94562b55dc3d8fc1227f152cc12ade6380f8cbeb5ca069f02ae2cc179bba82ecfadb598c9b1f5a089e0ee2b3229f6cafc35d89a2a184d796ed1d41a8232a957574e5eeb588d7cc62ed2aa360ad8680460d3949daf09f5fc1a3e18ec3bd57f02a34ce9d50693ede928c3d4b53b94d95ced1650158489605e162d792daa9642af2b997168c534a413d4d94274694ef2545d1ab995b9364f438686e4f8dc5dc28af82565ffeca8c522b1b03c81f58636083e23921f6c0718fc058bea333fc7e933e422662e989c3dcb4d12b07c135329c1b548ca85dfec146359b503b6cebb9b1a5eee7c4cdf0cd3fb65b04522454fdc6298b1f8e4f43a2eec1ff283abd454e5f4e184f5f180b23107f784c530629f1b229cc08cb2b00efdcc8c372f0614fcf6c1e287ab915e37f836ea23ce0170736f94bc8a2d6ea3e134289901b4dcc0afeace20a512c23d675a3a408e116f665aef220ceee4f950fa2ff9938c10ac390a09a0f18556033c0582704ae35ebf306c712cf6b69ad7c80c202acb889aa9816326e272104f9b0ba4744c230a4ec2ee8d05dfc317b057bff65b8d3e1c8ad1ae3cd4b49a56de3478a9f3e1cf61921228fd28c6eafb46d5e6935fea1f61ec16f32f8e442ead2ce70749baff2fe056c4d33a2b9d7042b34949dd5bc3b274c30c1148e0cfaea5f8e81c02e6e829e8138b3e6022d06bc96a320fea810bc866471597657c3b35da96984ed7a7f18c38c71f20dd8916e6568b7a2de3d63dc899e77191d142466a61d1186cc03cac48f94e9883e768253e303948ed639e23ba1376002609956fed56c1c18d8ff4667d36d406946fc0574b3c181030f37e369ad9e7405dfae499227083cf76e60d40d02d9ea9d7854e3c5e4d4b88f057f285519cedff96cf58c150eaa1ddb6a3d15d447713da77b66ef839ed936ee57db1298935b5df4df6b18f890402e66466bd25dccd64a63e77a994924a9aa3d5d7a1cc88de48dc34c17cbc848af60c6bf49d55bda413a064459548ccc140c141b58c98c29eafa6d7bbf8b9df28aced0e870e2c241c78c5e6410e3299eded3a84e92ae4c76f0a8d1a8feeef24acb1e56be7365f223712bd95dd9a6eca3e99a7a1715a53a8fd9bc22c2a600122643f46a278b02e497a868e283355af3a8a07bf893ebd5265d2e51c9a0a25f954a54bf0ff38962095642b372c4e6994443ae163722566ead12f08ccdc7e4f65244b8c236e3770322f5436dbf2fda073cd2b81d7af6430fcce4d54e2d268de57eac5565624729b256831176cef09ac3b80cde1ad6ab45f3b6c09b69004ae5aca169cc9efd40f744fdb34046a36f5370db0b73c804dfe094a27918cda7b877762317b532a6ce8660b2333800fbdaf61b3bba73d9e1e2bddfadf5033fb56137f81f98fde42e87c965fd5f694d6f15e5da33cea95f9c0436d860bafd5f4495d3fe52b268bcfe455d31cb8b69874b920d2b1fe6aa094d104263915737924a0dd4b00fd659070bd4cf54a8521769d22ece09bea62d9c5fd8075bd7d64b6baf2064ef6ba22079b918399136c537ad7f2b541ae36e88042aeb63eda74b22bc53ecc55dfc424fa23d02c371936f11ec4f1ecf99d6f89d82f36dff29e5e8bcaf7dfca65cf737d99d1c3ffd7f79534868cbae0fb6c024ca4eea87032e422b3e90bdbd899add83f28322902171447b2a75563979de5ba2a3805c0b17dabb5f54de48f14642201e445ba16605b7a73def458561b0b5545f6dddd33d7afdfa0a6d81de10fbe3bcf86fcce92d706dbfe9d07086f80c4e88e2fb137441c51ce2cd6027b343e48261539e397e466ad9708b8ee0250dcf590817dc766d8f006b5980e3602d261be5935bc7cbd97e62376e29b4da3b7c79d0313894cb39034fe518c05b09916e732675d1e987ea7616aa83abfd6cb7aacbab57655b6589a5355d2813b27a681804a59b4d8b2ae1f81bc84a72d25a127cf52f997d4f223acea6b0400d5539ce223e5bece1a591d96346b6eb5e4fe6272af5aee777a243206bd7e463579264f1256ebd276b0fb406935df592b15bca41de8009bea53b88b33122950a980478f1f5461cb27432c675a5b1594f24fb6d8a31551c21dc3808a1c13447086010a091ab425845c7065f45536270ffdf0f013b1e6e5ab9948153097bd59ae8bc0e7468d3542e901e93c5bc71eb62570e742c3281c8bcce54ab3b35d15d6dc93baf1fd499023a79c43f0c8b1c07a2848c9911c88f912fa0ed61bb0b14db601149a04421a12290df3a1fb912c7489cb64042244f1ba59c16481b9795a3ae0e1945d13c855f1d73acd34c8a8c60695b1972ec870c10a4eb231969d3bccbcd51af4923988e8b23221d86286978043d1d65db691b19c0f1e140769ca8e3580e4d2508cc31e2a635a59623d4a1c75180838f038923dab176083bb8d951e44cab97158e453bcc17d10008ce01948e21afb46e4a8dbb423b21fc8e36c714b959c39cb78aff731a79d13b3ae62160e0c280b64b95e3324af4b2b1ae6227d37539683204481c7161b40d2ae803a979cd777d1fe3a500bd3dab325188eb1c6573b4b80a899f0680e03baa1d4e47ca01d0e45a2e1aba60a1c081fcebbb98515d32924f5b0ad8e1c49174a46837f8dd0c49bc73301c6fde15db01b7903dd3064746be348d90b248daae852498a6e3a2b4250d68646480562ea17790e0687d29657fb440c98c834895369a2c3bd6eea8b34468e751ccde6969c95007fa7c1a33a176c03966d721cc24d2604aca62d0b44428c7b70359bbca4f0e1e8ebd7018f2a721bf909c68b964bf1de8b769a89391415aa96c6b8d42770c88e3d82d0d9180e7e8ab31a486032c87de5194a3fa8e8e07453b14ea858cecc688785cb8c63b5933939c59879878e478b6e39013ad3659e178b46369621a014b593cda522ec841c44ddb462942a51de5fa1d6535689b9291304d5ab239ae3810d241b2a0e1900f4733079a721071d2fac8d951f310bc84053643937c7d6be4cc27e91fba0991192dca8b211a9a3464844a33175ec70607a1a38303e9d068471151bad1ff1c4e71bce36d252d8a41e6a5a806ede4629d330fa4fae62e32dfd1463f8d2f861cb28ea6c3b4e3dc8ef4f534c6c888172d52928eab1ab96c72e072c0734497e3b40bad1c89ad8324475bab98e64b032488e12884426351315641d312147690fdd1862323c1e0b2b3f33487488b43531104ec2071d18629905469e7a4c7511bc3fa3832e9af919ce5f638a74d8ac8f5f49f1051d0402f860869989c8c6c696d511d203936388a6a928277cccd513692f645ee396a1ddc8ea423d2a1ca31ec60e280d31a09bda0bab665b8691110380b529eb622f023cacff2a20d9a562223765a5a421cd1eb6a8092b22d16ed1bb1aba5045c93253cbb7a2ffd9c682dd159701933830f388bf4cd31fd7133980f4e73a12758051f982f9a6da2e904bd967e07ec1df650489310ccb0066cb62fa16fa23cdbf985be4542b315b328960ea67714e9d1dad27447b1e034373139081cc0e11841d3ccc29b638783d8d17c67b6602292a675703f4733bb10297f875878631199e978918fc61330390699a145c925c7ce263d42d45624ec1c6ac7908355ccbdf54e5bddb100af9a3469dd94b7452d2addd45636730e64db3abcbac3e114c03a3c5b4d13258a0eab43a31173f49eed4b46129045e36bfa528ee42729a337234e728c409ce32bfcb90bcf399ca00f3b13960e961ed9709c9347d750e6995e3f02a4db1c6597b44cf285a3e93077bc716c1df2b568413a2c38be0eb443c71c6539682b1294a35e384802dd11b698f5655e41a86f96474918846fc062149350cf301a593d1dc5f24ae56b03d31989fdcc0742df68b1d8b5f98e9e426c462962625a1fcfe8932da2f7f144de8357ca65d2c8a30c306069917525325e202362337b159e42cc5d838141323b1a53521b44843582a660a747865a5243251dffb1c67e36b07b549a30b9c1e8a8eaba6afb0683c063b8b7ec4a479a4776c0ad401fb33b5490d702d89c6b8381c3f8422518f0da00a191a15620cc9f6545133b80e48588b3111760587259dcc1f4dd691b3914b3e4f21e49bbb5f94802c789a97e286e2a226bff3d884ef4023639d13e5a0bcda23e98162f11af665cdc0f1f282614a79991ae925d8b7579a4da2de9ca2d8a2b64c34b65ed02333ec1cdc43a4c821e80858c8419940aedc46ee8488b0a4570fd7e987c70e96b0453baba909907e31da86ce6f03829b20ccf1f07e96157c7daa25ed4f82dc00f9c18584c99bad6585a6d37c2565a1ea4f2c0d0820ae41f537dec3547d04d3bee90ac6d1d9d6df03610a044ca4a0fc4981169bd44cd1e72ea576c9ef0c72ae5b2a27a50f37b9468dbf3aba5e08991f59dcf907f86b46930f9e7a904ffe60c15801f3ca77574ba740b7a99834f73bd8c671b7231d7db35fd2d6e09f2b35fd7559ee3c05a593691b4a5d0d4138e03e3874cad46da2b26cce149d5d70ea3f522f6bdf686f70ae0715290bf16872850f6448d12778d8ea21957a8fedff0fecb96df21c771a6f86d6358d4a89236ca83ed368cada272d0d66d94bee420516ccd6327173b65e5de00b1e4f926a0a8854f7b47cb08859662333fa9b51257c4a4a5ddec6bb4c763760c46943f8d9eb6037ad39ff0b933101f90a926a0a6f871fff3f62ef35e62b31f290f9589caa36e9a7ffe2df8f6ccb334cde89a3517fc160942e65668ce57b5e14c744fc699b6878d25c24d69ad0297a6cdce8419162d2c7b90822bacd2b78f6a2a610445ec0f183b7ff054ee3429d43916091a6645529cfad4531810ea9e48eaae559b2de832eeec2520caf276cbcc6c07d9a359112f79c574929d5872928d9db298bbaec8c8a6c017c6ef9409d7ea94a73902e1e56ff167eed2a38fe32aca9c31ea4676d39b44220e59d62a589d3230a2931c37e4ce23c125bb72422f28a2602804755bedede7519aef4c222ccd255c7765a5b5fe8e599d70a565ac55000d5e6eaff9b05dc8b53adf9580291b04a27bb81cce7658148bda2cc7fb33bc194e043157fe07308a5b7ea413d5c3622620c7994e5464357a98db8a1a1a2838858a198c33af95026e1bdbdb3dcc6c9daa24f7ac629b568347956dc3962d40581bcdab175930078ce8242b8f52a6de942cc7fd093728d65c117728dc18e031b979dcde7718367c34107880132b6f350b4f01c247a63a2fd68f64c73959f3ecd65416a1a58e2058ff6ac5e174b5e5046b6171dc41cf0577d4072c5ae0376d99cf99ae8826f271cfb1d8c4c12242090311a0848472756dcd09ba16ed45953726059c2c4ea1325823911f68f9294f9f0b36b16f422ef1be8ea62280bef6cdd2ec8812a3eeb3c04773c56902e253b07e011a308c87cc42a49e4cd6c011d4f95bbeac1e80c282eae4380f08a552525958958d655c5512694b4a596907dd159fb26809809b5e1f1e2a0489abf84203f0981e1a1ea7a6021fae92096914dc487d9c42555c0d4eb180dac842258586bee2251dbf4fdede971e444f581781b10b3585a9e2445f1c16e6cffcdcbf4226db6f50a6ec9c96c1eda2ab5674887336b4e881b7fe249f65c43895e1fe4e2ff823e8091b405db30bc958c0b3aa0e7c561a2c975daa660672294e96b9120470eb85afd288897af039444cd38177c807422868de667ce602fce60374f412d9c8b0ef2f3ab341a96d8c7175c128918185c785b0b70fb51ea462ca3126fa1d1de0c169abad7814d1ea41d0de1a2534e9d0180540215fb1fc3227caebffc977732aefc7654725422d1548ea10e8b7efa09973ffd3fe75494e791441f3648b6a3ae093dcb9a282bb1f7a35dbdccb321c3700f41c500a406814e6f6ecf806d6eac948a85e4b0c33435c279f5731a8d148c168cd482fbfbd16df1b89a899646121b61312843c08dadd0aff701c4c23edf367c9d70352041abc23c00e449910df1cb903381c8342a4c4ed21d60ce1466ecafe686ca2c1f0cfbcf89e7871e1954fbf67e6baaab3826afe835f19ce03546ed4e32be4ab7e819823deb3f3910332057d5963d8e8ff768dc03969cf036ba1801b5dcc017bfb9aa9de70d5fa490ced695e29900ec339673488917ae9223d6617fa48bd92d2f6955f14aae00029311a628cddfda993676735ee22f8ec430d5f2cf39b3596b984fc5c399388dae81fed3d7c384214baf8e6e53178d2c8c86e2060bbc23372cc0033900a446150ef2bab12b606c6ca281393d3312436aeb26189a171a8c0997161b3d57786899d16b9141cbd140218c152e0099faec92fa7eebe9073a8c0df8c18d240ce3375472190f9379800faef5e0224b6fa41c0dd126f8c46639cedaa94903ea03af43a15b31ddc090f221293bea3593abd58d4662ad339a9b3b783bebc4eef3edf0863f541d41b6fe47b5e5a354a86a61773c2d091905dd84397a91e2fd11c9a91045ed31a3ae98bd8eb0639e59974f7fde0b169fc17da925fdd0507eda23ae56ce20a8dc7169387a13c3de87bd13b96ca6f37f7d3ba36efd8e9bdee06532943f7f17f3359b4b539046231b2a492fc6a2b66423b55792b986400e5ab4b83496da4eacd7c8bfff2ec2c164f8df5b871c035273ab61a3617a4a8cee46661c1b339387f1f0a7436b23bf14f00f273bcbe0f81dac72507e90fe94ffb0f66e75bf37f304182b63ebfac405686a0983abb03fd431db371ffbad540d293550202dd0fc4254aa2aaa023f9b708fcae47cc470d9a9b0ebe2b82c9a75050d7513a5b3ec2498f6f25b6e412dba596a369d87a302de615692d34f104d36efc075b8a15ac7f771a39307843a4b1426a1e5b2f45b6d0a00a5014eaa1df925df2382dd839762c6e2c19453f99be3f00621296f2095a1a0445d2402d01be483049ef0d48cc7b2b8d5265830381b7efb8f83a7cd432332b290e77a8011f8428d50c42090531334043de05380282639ce9f41228f8f1106de23be5e0424dda708add13229cfeaac24badc282593114b61f8614e5c73672c9a43bef94694b82770c9393ea09fb41691aca079a9377dff2422a063fad508fe8b1fc1db164fea72cc1d9d4c716e4949b169af68608999494b2851796aa73cc665a21a394516a957548204c7905c507467c9cab076a3aa4e2cca65e2c2bba6647fd859479e7687199815a0bdeb90337cedbeed15b13f76be5cb63eb6625e70674058c29c91e321107b1c0a12ff76ac71fe542d3a30e0a9e36de4e833a5f74f7d287a0e225d9edca2ba4824594575f543cc1260a1ed440af351b19799183db8de351cc1675b49c855ef5abe4ae8b6a76f1d83d231ebcd576e97fce39b04f67ccc3b9a435b336b458dcbe7d88a0b2a211082de9abfc903e63f129a201a89cf9de123356ce1a9bd8b078d61d0ab4f908880672862c854916916d64bbaf48172d28d8cbe272d7706477f569447058c81580e20a8d2ef693ee6704402cb7523965c44690ca9959bd33d9cbfaf1780a26a754c2905b8fd94fbe3d5e21e4756dcbbe3e893d47c3e757df270cb41f9d720789ce9b345c88b1431c25e7389249e7b49fe4361e1f7145ee33f620c63673f065b049886e9006df39f4ae374846e31b52e1425f594145c9f83abd2823576c9b277ce6ab5a9a0f51041f083177992d4ae45622e57a5a76ea55943af2cd936f742caaf6955a6fabe2b7a761da890be11cbd77d94f66a8c0ff894c46385cf0e52338b3d33969c2435a771c123d6ff51545b85687ffc6c8f450bac9a4415ccc827e4d55dd3420742dbbe4e6b2379498a43510d484028aefd9655f40503a4e0755203e33911545b74d2323f8a564ced74e659d4d3cf31537309cc312a730786e85e75c15045f91c44db1651ca8b8e2585ccc07dc93114bfd38c10aa05823c815c8e806d0b886d88bbd9827242222b4a4edbdf7965b4a99929401a406fe0522063ecbf62b0e6dd243b632199662a51f259d124fb7ba8b2146ec5a9834fda51fd3a65b61967862e860e85ee878743bba15742e743a5d0b251def58e874743926ce0a9d0a5d0a130736716c49c707d9cd90fbbb58d7587dbf17c67c29e64da79857dd4f89289104ac7cc72231a3c532693c4f62b61acb6cf5ca72c96da3c8fd96a841e8b7b05125daa159d39f12ad12b3a61f25da25664dff49b44c88368b6da2245a2748a2d552add0275a1988f6caace9bfa2c5326b2c6dd6f477a23dc22221da24eedd4831a2c53269fa57a2d532697a1ba7d532c3214bf31b3a2d8c56c518d9d2fca6eb6c673bbbfd7db2dbb6af395b9e62dec6168c34a34fbf244bb5f7c42bd9a8b33ab34129a510d872c9899ca86d34f8da3c16b351abb95f5babd56a79fea5322ab3b66e979c349a0dec92711d8923f7fbabc79785cd1afa76825e673931728f757697d459160186f015c35f8417ec3b5991b8eb703fb3a6be4b28b43ab976311fafdf2b4dff66b11a6fcd71fe8d67cdac99ef955c388464cdded4469b727c0c67cdac015fa8eeafef0ddea8a32836f832e1df5e47f71cfeed4bc05b37626ec40ebec217bd41473a762995c9105e24127009780ca149fc02b7afc51778838e1bf8f266dec09c54eea64183035d3184b4452efb4871b75d5b7d7647aa20a0616e8c760c93555071d8dea0f0eabf6cf69f33cc24a5af9afde7c47356af60055fd4bdf43a480f3e05c75208be08fd7addec3937fb4feabd66be77cc455d6f6fbfbbbbbb5519bfe755a7eae4f9eeeeee157c6dd57ffc27cfafb5d6fabab628536bad7dd94be7df7b5f75a341f3b7ede5d97bd74e48cea32310d030b98eae9d107c75d7624c22efc5ef8d3338df9bf3bd77e3ebc9b372a25742212746c69f1323d75184be31b63a94e77b604eaba0e2f0fa5b0106ab4fc72ac6c813f01b0b9b735a18cdff459e223cc1ff336d02a6ca4deb16fdee22cfcc563f5955ac6eadc49b49d3af125d93a61f378d99698380d9f2f7ea8336bc8a37dfb8d9df5563e290be9f0113a7f4fd0b9838e1f72b60e298be1f67e29cbe3f011307f5fd214c9cd4f7dfd880f0c1c4f9be1f01079838f7fb0d3071b6ef7f1a1307ff7cca009d075a800e8d11544f4e21b2ea73492ca2436384d593c4223a218cb00a4dab4f718f124f220958991b8bac46ec34a609027d8fdaac225599c680409a1a675497e99fbcb02492c0d0b3ade9389ca948670dfd4db4f5da8de4bf1255e2749a0dd5980aafbe574512eedb9f5b1852908412ee8847ec346132055f349748da60635269a2f0eab2ffabcb5da261f2045f5deeb203b9f75e5c6f1023456c5f2f1b11ef4e077a8022d65afbe12fb31b686103173e3f302180142d44a9291105134c96a84ee026385ce0a30658ac0852e54a14363b4cf1f282225e869eb4d0fd98502862300401d921080b42b628aad2450b9638a10312a46f89113a82265d62455820841519904a2d36042111cb410913a49fb089fcb032c7c124a4de1ef04890878122528468a155d1b2138609213c3c1105480f318c604b4ab880e1a103b642173c545041c4972840b32b868a18c15abb05b104f6ef7698551f17f8b66ddbb6f5b06ddbb66d61ade2de7b71bdb7c80b3f4636285122872f2d58c10f3bb11e2f465d980021555875b2c327cb0d52aa748165470f1d6278c2880c31406284bb448b000061a4c2e8e10a0e5c6e60c2420e270893a48995245b5828024c72b7e766a03f45dd4f96cf86778b98db4304b7e026f99e9ecdb91bb87b97f4d8d161c98e1b040fb40898ed873a9d0042872d46e030c40b1419190fa513584c5982431046d8871e97f9e4ecb0010b1c8274f019428a142b80445136914393262e94827af0067270820635f0a146a5070986604228880a5b808a2c519d40820a33459229acd012248be944902542558e9882851e3d3a08a13bbb3b321092a4052f4796b811c2c4cfcf112c5c808192214aa494be1e5ac90d384890d4f5c729d01e216018a26746c591142d1a7882fcd082213c7238950414a1658523454811051648d08c0021030f4a867ef878f0cb640a135d62adb5b64a0a66a0820e46b4cc404393273e3b4d68c1c38e244962e0b7438fded1c124e45d090f064c864cf60631ab9f4f91273c6badb5d67eb847ef601d86fa8795390e24d8212684a4882341c050c03264040b57f00064b405a1c31d79c7e2566c2ee80e8c14b1ac2a397069b2d3c54a0f076a447686e8896283229624d1c167a48847200b248ed0a2944aae98618608b9520ac1e30a254cac7cae448f0da4f0d1430d4396b8228a00cc00564397253160f992e47b8020dd7bab77689b60d245a907ace2c9151668d8f28317205ee082082aa4d430250993f2f3a30e3a2e6e3726f3ee7b25171021592f8e4ceff5f0f5cdb83797ed7badb366fec5d93ea5a909fadf0658ebd5ab65b1eebdd45e4ba9b781beb9df97fd7b4b12b0ce518e54bf46e08e3334f7905767ea9f30e6a2f073da5ead47af8e1248e0e76ddbb66ddbdb39e79c33e319fb27e0bf6fc75c14cedc68756b7650077577bb8fbb7b2da245b556fb437facbd5487eadc8d9c433e61fdfb5e876fbd173f8742bedf3dd7a932fe1c55beaaacba621f6ddbe4facbc1d65679feecd9f35ba86fa63b6ce2d03cc8aa7c7f3cc1ff7d246dd4afb4bddabb61aef33e90540a4d27544ab58a61c9bc206dd87166d6d07f1767ec0863d6d0181ccc1a1916a869faad60a1300b97ee92fbc916503fe941d7ba6524f6518e2ad3d1964684f46d6dbb327f866ddb5c3a9ee8e04ae1c90d4f5ec0188309bf3c859ea4c024dc020a275e9c60b182932732d9baf2c1ed9cc0e0e3871552c0818b1d9eec54b1c3151d5694f8f0045f095d5c54f01243163428b1640a2c02e0a506a12a5b5850e3a188f739b95ef0e56cf5766205cbcc10217ee2520188ad8a93d80e273a3a217c29184e886cdbe64418b381131d2f4f21273faed019208a92d0c035038c710da125999c658d299af870c527d7086a422493618d2a9a08e170139e8c31c6b8736d0943d6d33c859ad0f24c9e424dac684294c9965dc115c415c415a4fe9c14e32f35c6ddaf1bb5ce1e326790ab4b375ab58e2b17fe552ec0a01b2363d10406f98de9045653adfe67d254e36add32ea56a5771b72a14c1f57a2ae769d37ed68b7bbe3cad9ee7ab6bbdef66170fb30c891ba1247ea4a5ef899bcf0338127122a5553296f9afac4d3109f4c1fd5f34dfaa9f09bf455b5d23f32027364d4391a560b02b2120424442b298f0f2099bef3501f74088dd149e9a4745213269dd43fc8b44ea04cf3ac230dda5e6db5d69bdaf66aafbdd79bdeafdabb7d77c31ce6386fca7d1be6b8cefbbceff3a69ff775def781a412a954f2a625d2078239a452f895c09cd074329d4edef41403be502c19f0a57a31b39a99f1a6339f09cc711105be689ea90f05e6d06c55e08be670a55aadbce90a93666e70769c329844a290eb93f55eea24f2845cc7a6750bb40206752ba85ba09520137832d58c4ca61ae4f6b35ece76c30545e8f37d82af188e33ba21e63a7247abcf0406996a4eb38d2b1957ab7db559d3f5cb0fa86f5aa869e8e7f01c60c0181975e9c2854b67c99249ae46abf5583db6aa81100354cdd69f89737f4e4b1be2b8e8826c8cdc05e94c5b5142b8e8c924e98854739afe8a92cd9a7e52cd5d67d6d055eeac344d7f17d42d5305567014d4916a41b9bf046b1bd2d272d78c4847243016d7dac51392358b198ad07fe6b34c7a3337e6db7fcd1bfef65f4e69b77f9fdba60ee6d4e94d6bb5cf72e738fb9e6d6badb5746252637ce365492023dbf797875ec1577d5bed28ce9a69c1d79da1c0f6f7757023bee0cbe2c81bf8aa7362aeeb3a8fe3ba12b6bf4fc236861082d3709df5582caf84edda8fe3ac7ddb8137faad676badb6473c6be89c5e07f6bbe86df40bc30f2461fbfb81256c23769a06c106cc6cdf6bad954e4caa2f42bf4040c3f80dfb15cce9723a14ba5cbb6cc7fa9d8b3337e8cf7f65effb3098c3657062d08e23c8b5c7dae10ecf2b7977035f348c8b05e1369276e6356066fcdc774fd6a1231a3431f75329a5947a91ff147557cc53e4ee750baab5daa3dc6fed256fcf88c1576fa2cb86103f47bf0d7cc096bff75edf7beffd6eb7ef74723f37947b24af9d43b98e9334012d77c0ce408f720088e5de70f6fcfba83d42a9eda1945e7b848eaa1db3d52a9d95c8fa1851e64b62b6689545ab2b8bb0be6aa9a6d3365d50ab76bc4741d6af5e87ccc77c09fcbe0492204389494303be6428315bfd2f8ccc1689239f4e3fef8c7d968d79d68802998f7914b07ef5384678c1c91076af7a7a7aef650cbd0c22bf91393de9f9fbf9bde89938f63be61be799d3f4933c977e96c8173da86e28f7cb8878d2ccec5d12a791acb96d9a945194fb6b9849552c04947cd1d3cae48b9e2c4389dcef89a48c5a6e5807ec2c8ba49de5fbce934956eeef5e4067eb7e7f8c8827cdfd9578afab4b48022086dc8f29b6b307502852a00020966aef67d67649114d739ad8f77ddff74d1293616651af33cf149648a07b9caa042acbb24cc57cc462b118ca894edd6c369bc160391ce6308739ec7af0891c9850c6beeffbbe8f068d54a6418386e7445c89047a8a730f5502955e7a65798ab5cd7dd03d0e9bbed9cc93cc66b3d9ac2600334454a6b1582c162b3dcff33ccf0412939e0c892611e7315c22819f9b30179640655972a517f3118bc5623127722e4ee4444ee444041800cd29d3b22ccb92e3388ee362b1fe582c86bbdcc0cf4b5bad61ae042acbb22c633e62b1582c56801a53a6b516c618635c6badb5d2d2bf2743f7ca72abdd0747f2fb52291830668ca407997471ed4aa0b22ccb92c65780cf158350867118f6586badb5d25a986b462425e9a5b27e3bc4caaccccaaccc82b5568dbc5ae36a0dd7da566bb7d6ac01541f150f30e4003eb91f013d1f7c08f03ef8a848da24b91f84d9b401c1c6c69bdad04ab969adff6e1919fecb72c0dc8d9616822a0210df974ac180316386071ecc26e5a6f98dcd325403739403663b5a1a10b48d238179cee8905ea0e6b54f9aa24d290e52c0408a0d6d436fee17ce1a6765774ae32f4295f06bdc6ed539bfbbdbdab66d45f016eb9c4da34a21626295a790941ca9396d3c9bc2b4b9a6ec9348a777cc96bfa7306dbc27bb2c7bcc69bc761923db1f96c716d9225b648b6c918d75cb6dec0e0f39774c9b6d67b6bc6db658b77ce3711a7f8cc390c57a72e3c9fe4162c9ee94626d53221101ca409eaf88277b4f264f3db6e824134db56de73424c7dae62464b678b6d2c7f6b3cd7af22643d1668dbfab896b47907e453f4020d91fac617e5d7cc4401e608e0fcc6754e43726a3a6f13781a9e5b0473c60d94f5727fb0948690bcafe3d9a6addf2771911925d4996fdab58e29935def1b8a084f42df8f294ec03aa8144d845ac0c954f4c2129b32c82b67956926611662189b3c3702a86c056eab356d2cc8dec23a981dc31d41042284a91283f518c4409a2e2aad2eeb59bd66ab5da6e6befad52a50ad6010404d45eddd65a96d65a7befbdb70cc9eeb2562bcb320421b061d2cb26f168b454cb64a85369a2b11c4e22a2922b4ad8b4b6019b0a49a1157f79d2bad5a6e977551192a97bc7b05b5e67297dfb369cd2896f525d71882bf96556ad5caab2fe5b21b5deb5e1dddf1caf1573241c84852839d48812e547941d61a2b0f0419415a07cf181d204ca0f50a2c0a1c4c99427a4dc40861d7c3049b2440d5480c187280a1426840881628a215c7c6ca161e39144132d38590114503628472cb10594263f4011820a28436a348102048a0fc6b88616473c29227c42e5c993274a9ef8f0c4c8132e5052786244c3a43940483056cea13371aefde0a88f8ec8a6e11f1cf90d2804cba2c325d68527834632104c4f6e2f470706b95c40da5aee1a9337b103735425246dad036373d43674acddaa24989037d3007ffb2f774fa57a7a771d433a437ffa9d359bfb66c310638ec5721a7cedd7efc01bd662f730b46fc5d7ccfef6fdab7df5d7f7c01bfd39d4ff357d037330686b77c49b33eedd36cfdbbc6d768b6cbdcf3c076d78ae1dc2553e127a23e9b3bcfd06ce70de73dee391286fef6d9ef75ef7df515051d1cf51deb6a794524a3b286fdb7777b75b9ebcbdbb7b2daad5fee46d7b6befe68d2e1f5c3e9070064712850c921e67d248a2f02a3de91dbc511a87f2f6a471f3c091eca3bc7d4fde7ce8a280963be0335a45c741a25eec6f30ad129261aea3076ef9d31f0ccee13cdc077620d37d68ad7be4f2dc1ec7c1699834fdf7c8b4f19dd9ea9eb6f158b770f0207ec3c421f90fb7c16b701ea761e2f0f8cd9df90c2e83fbf01d6781f7f0d8c4397d5f1e1fe24472bfcbbac6ca149654a8cbe1adf348e0b7bab33bcb6d0a4b5995425d0e6f9d4702bf93292ca952a87b3275e7b0443309ec38bcad2ea9fe9663aae5d234fd5d8c2c98cf7179b46e081ecbabeca32572b920245b7dcb4e0aafdfcb21c3d0fbfbbc440116ab7e9fa7523865fb555fb59672ea0472e8f04a36c6afe44ac281b928ac5f5f93f6c64d8eb6577b378e64391474ab3ab946427a42ae3cbae5321292ae93ab1dead67db269354a2985c01664a356547677374f1795eeeea08d5a2b8d594b7588f2bde41c72175d3c84f8e97b98cb9941216fcf8d240ad9e29fe08b8e38c727e8b88f7254d9bece2adbb169ddaa638622f4ae2f3366b8b4a875868b0656091645508666f8520be23048a2a33385063d9c7c6006430061d245861eb4a82a38608a18aca0072e41642cb860c5ac7683293208c1a2bf52005c78a122054c901f2332b4dc1ff56adddeadac137ca9f2cf7a37ccd93be9db0d739d573dcf9b7a1715db6a459513e47ee33aef9b614ae9a434d35929bd97e3603ab9dfcbc123f77f3a301fb99f14eb56d76ef693c4c9cf0ca89cbd54d96e5bd1894b9753113d11cd93d1a97622a2311e1f407862436431ee6d7065109095a0b2a28450b46e35aa441da18c50605047a85a0e18aa0656daed5eabc7d5906e9c17f381b9fdfd893cbd9f4f8ff4c8b3fbf9b40b2979724d441679621e21793e9549318189737f06c14212b325666705a4faa22292c2f22498fb37af4fcac0e8c84292fb6fcc96dc6fbb9ac7ecd08c579dea8bab88e4fec6292c34538cc390c5aab4d96c369bcd6030180c060b4da7130a95dade4ba936185f9ddd8fa3194646923bdc12ee9480485f4844faadd7321392704bb893fb6f09a8495f48445ad633fb2983cab22ccb3236fb39cd4eb3d3ec343bcd4e33d43755ab1903be62bec992a93232de54e67ae2cc190ba8f32df1a8f07e7435104bee775027f7f7b78466eb51e1fda81d35ac75623ce5ece74474223a119d884e44b9df5b792f381b703c602db48bdccfd1b2b392fb43ce06b9bfc4f190fb29d65206d186888a663fb1582c168be5fe18df8d6d52ae972602d318699392fb65b6eb25d318e5a1b29ed94fad2ccbb22cf30c8c183138e040868c17ab287a5391956f0eb985e836896e0ed70a99e034f48b6a47b0948ceaa06a7e430393a81aaa46a26aa8181e073db95fc6109fdcffa99eff684af6a25424534972ff989a75503be8c09b7630c7544cd6e1525c92461ead8e94cc6f68b8ac9c05fd94b98372bf27e35b85806652065683b0a30c6cd6c8c072abb20ccd02445c2e5091e10b959d1950e9e1e241258618507981082a3bb45071a18611545aa0b202959efc224f212a52a8fcd419256a8f7997b566a9ecfa84e4a4f9f86cb1c4124b648fe220f25897352a2b793166793e0cf001a918332f9a4496808317322c27912690c18a59a92a893cc15b128902d1149648e07749640ac68d44aa207b1d8c9844bf3ef1e60cb2ce72bf07a3cee84cbf7099cab231798e198ab0aef21ce7d7d9cd02cbfede7d96a8ca30643a66a54aa19e5ef15b64a932e63aef033d18ef5df1c55b51e6618833a5272d4db4df228b48768a0abfc0c8a40928fb77ca0434e33d79dac9feaeda79f17d5d9db6c8806f7f46245148585986374c8af138c7b00f4324ed2acf88a4278bc9b04c7f861d6dd6983ad8ac716109494f56a24d9ced5fb06256aa9413911589bf2914c9ee88ec5f22819fe73df0fd1102b7a66033943b52e5e91e510dc9c499595845424454ab599b020963ceb4f8a245192abb5f8bac49f38ff95a5ce58aa4496a619d911a6ce23cc6789c4f25501f04340c9eb9f5b72269366b9c5682b964109229982a45cb4e9b38a7ec2a992b89903ea992654fc168d9555b89d6c1545675a9b3c09b33c2a7a5a7a4a74f6b13077cfa5d4e9cefa9f7f49d68e2744f4d469c7e4e2cb9df89e4fe4abfe47edb7f77f04944bd4984d1bd499cc1de9bc417f87b9328834f22f82691854f22e94d624cc627b1f4267195b19094887d927eb94f36d08e6fc9ddf824865cea714ea14651954da22a8762499cc0aca14f12a96cd6d007455a9b35f43fb14b8fcd1a279a4790544816994ac9b447f6272c0c0b8131bec194a32bb4a06244032f4ad47eaee0d2c505c3142aa6449183cb53684a17502c3743c2151f8ec851db82ca8f1bccaae841e28a10cf941a3ee2aa10255334d0949fcc419e425382a6002169b46b5e561ab39368e6068eecdd4f0425218e2c829270d2b18b07a35dbdda6a6db7d76a6dbd16d72323b282a94758246d0e0babd5d6bbd98a2bc789640d02b212c4896415a26d1bae5c67abe779ef79225979aa0f2095c713c93aa4ca3cefab20c9d65211972e4546b55859cb61759ddc6fcac1e34551e08b92ee23f7a73ca6aa2a953755799f98c449eeef9f6e750ecd5d2dbbd5dd3b51d7cb7960e9945ac9cc8829536d75162e5d86f40d0d1aed93243ba10144c34a9edf326ad43726108121ea1ccda37d34905adb70407d4363312b31a1589618972e793e2da98fc640c2212c9f3c9de4f919e81b8abb84462c3039328d99d036f7b3bc10cb8a073f8305e3e683be6999771f9907a884cdd6f6b074a84e000028282317000028140e0a44a224caf128c6357714000c687e48625a341249c3b12c4a911c83310c23040063080004006080614ea14101bfe371b10e8dd0ffa59458055686ed94acc295e451385fefefea8058a5be4e56e0f31ff98eb44e957310b845e5fc57c1a40e4f6b069322dcc4e8027b2f1c88815a765d509458c94d9d07e8d452888f601620a56ce63f9beae0a640453de94ae0516eb369fbfd9b71bd54fe85b2324227af68fcab1e004fd117fcfcca84b46ce8e7aa1d02de9393d1565648e45613605f011686f02f4379838b1f5b474ec926e628a4f89da8ae633ab9e87c96ca7a753855a0a0c8490e54dbb5c3c32dd8ce447784676a512f67c48032a09b474ac9a6e69841a40b88b59544823d6929fe9c00e95e8b6343809b3b141479c882b4f93506df623bf7a8adb448dd93b47f2af5a3c2321faa1a116d6bbab13e30750f51ea84d350fc574b1c7ee377a8051aa5f3799b6fde56437a71a19e7ae296420ed05f3c286089a3b4924a30e2962e1a12fc43fda2b6220a5ece7057040f13d018a3d33f76e98737d816b29932b83432a330abf5f84003395e3703d835d0a3bd1f8bb34a645d46e37a8db3c18fc8ae71e4b433ae306b03d45dd4844e7d742e87aa9b73ee2315194094191cc4174a1437429cd3ecb590b3ce8fbd5909be2e713ec748344659a8ea3211a3fe41e8f4cf0031d3dd50ff8c55c422ff1f4abfbdf4c01dfff934f50aa8e9cf04a71a0a7e629cc85dfa1de1a3019024f4b26986d3564a831c92209a66b3a9f2caf4434c5481d6f6b5d28eee68df1258de5100bdb25c451f3e2d0f303d4f6cf63d26048a659a5a2a74c803824a862c39cbd0cb678e60fb3408f6caa8afcbc10f5ad921bfe8d6902794bc06b3cd4daaa6c4b506787fa979553a9fcb50ad9f5bd519687a2a52de51c16788895bb086acbfb6a73334466bc0a52a54a9848368c368d028c9e12ddfaaf44a06f11014e97ab330450ef845687752a9f2f62dde0f9c29b21135cc63099c7652e20b8fd2670c4390f8eb15c5b9c86349c096ba6fc8c2589bbe65df869f53df51faed4a01d7dbe346d18e6266cf2324048ad99186bd2e3876906bea73f216b6d28e53de462c6cc628da49c26b57dc402106aede0849e7a6c4ca4ec2b7d02883090a6d0a26a828d9c05b6000da0a27c90732f6416a496423f3eb5ac997b6c5822f9dbded3bb26dace7fdf2e22a342ae60c87203f0f2113e926571f2035a6d2dc4b9eafd49e3bf9270c13a469a2bf6f6a22a78e9301d54121590976fc0bf9dc0814d90f3f5e4b43c4051c50a45121cd28d389365f0dcf8dc37c5c69c6131c93329a210d834eb8de6c592c734d54c2a336fda0031ec27eb994bad3bc030c7728338cc2189debec1131ed898d72b20e1f4593892c8af19fc316362765b56dc3bece02530da724f8fce030f4689f2606ba22629f8bd0c5db3243ad9f3427353dfec5968d4f110e048493950be3f9f874cd8dd322dcbc06d1a7ed6f7be56944dc6dada76870f5d3369fc142ee37033eed6fa6e34a0aba1ff40a72351d6076b4855a6e1b53b585b4a3a3b4e873b86770e69a896b952439bd703d3b41071e86fd72d3dd736ee335aaf5ea85e996e9d71cc81976bb142da43f56cd9a8d26b1a74310a5f5bef3a88735c64646910e48f1684efc27ee5f3b9e6eb2846d554b32eecc39e774c332839c471f0cd39cb3f05694707a89097fb9801e0b25aeb4522efae9ff149c32a869a018865671b803227864993b2cbc097726dc8e2487f931fadd4aef54c679f81e19177d0a26a8548082f7e2007fe1fd5977ef69a23d4c8cafe7f1b698e8345ef43abd67af9df8836102aca0645289fa35e43546a4513fe04f7e25ff61172e112ade72cba20d7543201ce60cbb8a52cfeec318c2a6403b705b661f18da9cc26aa252a09945057fe14071df0d7e64a961dff908293667c880e70088f937d4cc168f29c720b6dabf5a54f79272f5ed10b7de00f797977bf4f80195195f8525a27595819f9cc7dd04feb72a608b723185ea9b22e19593529d72d7d035dd991efa61cf6f272039bcc3b962be736e56b88bf78dc51e9a311b58e066a673941468a1262ecf24fe4659a8837a8b18ef4f448345ea45b6c384007722d56d801ddc27af1cf0deb74c6b910940ad419fab64e5a43984aedb945e8ff5386840972b365da0fa3a1c6c1609ae3e46373abce969c8465bfa064544e6543bd5f83ad1d1cf4aa446875ec15bc3ee6ba5cf862e3329d7e1448bbcd93ccbe43771d065c42abfbf529433f41b604f7d8a0dc1bfca40b1b81022f7a197ea2d66da5064e28f8ee2670cfb9b3709b42e0656b855a705ebbd515b3f57189f792a47009e388316fa10072b117f5f1105182183b59358c69d9f1fe13ff0f5bc6e0ef266c416ebf9dc5dc153efb3a800603957da5600a9aa64306e27a580fe02e33d31ea0309c00664d3984ae4d3b9f5a6bf99213a0d77e7b4118d4eab0cc37a1edb721123baae0920402a4479303e85334b1dd066e4627bc3e95ebf2a10133f9fb74120602281b6b3303355a5bda3cd6555bd35cb6b799d8c367a00cdfbc1c4a48a9a299d93a4b38ceddf3481bfe7a2717451fe6aeebba930f4a99493a9cb3aa69771f268bc55f8ce150e283125950e50555babba2c5599a9a3bb0c62b15547b0bfa4b545ea4acaea1f249b499a1fe5377a121bac9fed9a1b5e76b94e5c91ce718cf359550cfca3272fa11b835a26be4512cbc74569088ba978584c426b098a284ea23de9c6f35ad865b86b49a3a7c5b8e40cfcbcf17e34f4d38f0785ab5712839491cb620c767b1e5e52830c96b3876fefd90a8b7c6f773d5ca6ff84b1a0dc11aab4630f352d23ce00aa6513528fc31fa5e63e6d84bdddb56543b798f6ec46cd51e1d48b695fd1fce5721239f1c4be3192b65e9b5f2df18017050e37d8af54169d4279d83b188811ba060318f5d025ac99ef525f7abfc038bd60f19212d8c46c4b51ad006d88d68a74b8b09d8f4b3e1f85581d4a2e3105b66c628c91e4a820f0cf4da10f92046b8934d15f34d7e96c72983599451106c616b4ea6fab9533418383ad9ab7b9109068f180f7b0d8ae280f80fdf50d0b7717ec8d0858f430f6061eb183226900a58a4ec36c2283094911aa055383914ca3fc960378916086616265cfde7d4b3209c73d6228c243cfbf0a4becbf74ec0a99350c2f3ff40cfee9ad1c74a394142c1cea99de19fa9d28fa3eaa65d9a19ea617a603561c16abd1551dd872076c5e0f77a344b5ad8b0a970202725609462104a5d9c817d1714af2954457eb4226f3d6223d0ee26ab6f2e3394b3b2a9f89cb9fdabe7458c78685dbe06b2ded27d71ef5b549a85308d5eab30addecfdd96123013b66a6439f45f459063b60b897b58e792b40808e836d3db03e22af4c099a50119b4d931071e12c334b03f8895f1eecbcc9e54d2821027eb951f3c68a74180562879620a9ac27beb5fb80024bec066c886392f19a766ec88fbf106bc80f03e3090a8b76803a0e38dd4d26f98f403b1ffebd4360c5774f81077217879e128dc6f4a06db1bdee6c102058ac32675e3428fc10bca2485b4143e79fd7783fbda1299a8c598233d8f03107c5592936c09a8a6f8d2d41f2524fb41c0b2aa2706cec2c5e14ff01197068b763bb53f32314c3671f6023f376943ac3cc73ede0d9980d699efa91a3063ac061601eb2f160d83ee43e2c0777abe855324934cec3954f17d1e52bc01290f27ee7aaa231ea053e9cf00da6147dec57fd2d0e2892d68f25bc20c2913b26d0acd132bc130ab586dfe217112a0b29bed2361a9a57e01fefbf3f045ace954769a4b80d5f72bd48c1e584fd4ba2debdc44f7b2442a182afe675c3229bf00713d5262480d6a0a124094212bfb3e2eec98bf2213a2a44cf9af761688daae04b19c43d9fc56c2956a582392cfb280b0ad62d28adf7beeac7b5ce5415909044ff480cdbb96fc5dfc3090fbfd91f8839a7c7d767507ae41373fdc98318aea746b389131b598f2a44c6d439356dcb6596a3272343dd93b6d238d6d20241e91b49609b6964a98463afb1dff51c04a9d100aff0de507d29b3d9d19b0ab9d0017d869b7867b9852607358c9217cd69c0d13d52f4ee5f537b423112e93eb97e0ff9f9f0c4bc72af2eafc44585f8531505af2ccaad910c3e997c42a0b8c880b4d66c9a51ec26d0a20ea3a5102ad5d4ce08e031cd55d800291b48e0b7a5d30d12b79802c3eba42296c610f80fa7f69d48c53b8edecaae8a89d9229d81c03e933a01f0655688edea465e41d997930ed53728bf323f317a979c0506aacb557103585720afe8483103328b18a19827475b4295cdb331748f1331db8046e2fa251bcb5767dd6b4206032ee63454bdcdf5ed2734a9c024fda3fce8a118a1755defad0a40e37bc7e259e821439518d6a0bad751cd48e8a6376210c6fad5e1d2e5dbbfe1589176670f34ad113ba77b791f280e4580ad121f1e3dda37501863df06c6f5e836f3a3432aabc7faaf012a2301d879895b3dc5b19cf4f212f3d7784c7a98b43ed610dab852d1249eadb9fb822b322de24f1e0925c2d9c7dc84142e6f431d3613e8c6337e9bd70dc750cd1b1cad136e5b1d49fee2a50be9eaa979518ff38d1f110197c9c9548a213e14a3bd7eb1349f479062b5bc8358eb7c837f448fa7122d54cb3cc75aad0203e0a4e88359681d76bf121113a17345debc3de68505741cf0378ce4a642576aa3a460d1cdd5769991c4cfd8d1d2c5dc8e88040c76b3f172d5a76be7b2be026825f606f3117ad814099b130a0e38dfc6e219069cbfc3f426fa25bfa0dd10896ca833c7374861031b1c4d070f75355827696517cb87062126ac91be562403ed5934a8255ed34943d980b17c1f53c16a03c9b4e8013cba0c5232d2d1a0a5b3cfe53300b84f2769c5e55f90c69514f3eb66fe7c1467cce06586584953fccd4972c3453f839018e5e8752c22bfe4aeee9d051ee359303e8f838f4346d1852f425e7dd1f951b6e3af02f07cf5fec6be94800922cf26a73e4bdf57871cc5136391af4169ba5983c07f7f0d7086a221fc0c61074b1e1be678841edbcac9d8982c9499bd68b49ccdc91c169e763faa82a4e7ac12a815ca61fab12327a440ca60e369617e13a2233a17b994f30acf02514d6bce9294388dda850600202003d860293a6a78909468f3ad6a205467ec1ce53f8dc81e8cc31cc60124c6b07c8625d8b0f765618c03b32eff85871db6df5c98a607bac9c9916f04cead6855087a500a65adf740137f12637b2b352ce34fe6df043f778db99eef74d3556ff8a3737c06ebd4d4733d2417f69bcab2d784d44ee5ef76a1449a782f9bd38adff597407cbf8afe5411f748271a0b5a5bf795873749bfd54a131eaed25c2ea0acad5bff556bdaea3960ca9da3ac8c084dc39fab7e9013aa50f233b8c67065a04ca2f155c3c2f767418a6b14f261bfb41d6ba88c315223613612479262779b584fca74f925ab3b85dc2935ab57aa9b0d3f41f2ec94c32ffc4a918fbaf982b366766721c91e7c051b097ee359bbb2eb84b40f49f6a1fb406a8e50ad5bd7d548acae52390701550ced231f6518450e5cf2bcadcd770ca8c66860283e6175bfaef80132b13996ecc1311ef61c7de706f100f845618335fb05c8b12f281e5d7e0ac0ebbfe2878d2cb961ed1b16cb8315dd499319d23453e1631309259bee30bd12ba23c169c8ab57d4c46d4c4c84abd712196dddcaca9d20f9277b598d7f443103f49f644dd589e8f9653ac733703ddd1392949c41226171ce058d71c9ca470455f95755e68269de6eff433c30879575e0d5cf6fb5a62f9bf2945b2170779da5012b094a6c29ddc47259b9831e44c75f05e2fb5fd8d6c47899faeb8ee5787aa702a131a2c152c23ac92107b0fd34b66aba71e4b5ecdd40f362b8c70d2000800752d6cf01d0e16f343400143a173b91f50a7dcb9f7dc64ac1699d9b8e9d2f03417510d44f3b68bd840c527ed2178bf86c94f7b89dee9c4ce991afb171faab155c3d765b54d14ad7f7f339807f947ddc16e52176aac9a2d65a4cd506c1d241fb8cb598e6f1519790110a5cdaa732555f15aa13ef15aa4b9a77f5d85004a20c10040349e999653f9e7e038a007c7fb4d0de784e0b0f68459e070439e29ad791d672a2b9e2d324b4a07bd9fb9e24c535569749b2b8deff80850efc730ac614268880dbe82d9bab433821b85e211ce978dd209cdb792c10ce4251cf2803506babe20a8401a143454752d414c280514c234ca2f1f3512626dfac322add205cbc1cd38c0d5c2cac384f7a073da3c1969a076143d22807bb8e5e5118219996dfb958af87d5b9136121fb8d36cc85dc0f3837dd96bf5978f2014b1ed79c9b1a5db41b9d294a6f04a98dd82d7165472dec968a13f0066faacd5940d6eff531a9371f3bb01fa6acdab8dca698f740e5410cec7e2a57940d73e27730ff9f4b05d9a66908176e56bc92bf1b7174580d9baf1b9f6e53c59d83fc096b2593dd1c83f097885d6cbfcb5cb89c77c1a4c8d96d4ea0e2ba80a6d2a666227798b26f2bb344d79441f6215cca51126447dc2c60da4cdcd238178b65af6abf7bdb25b4f5c5c0bd826c8fd9ff555b97c8cf7589162ffd4f2968d7a8d44088dff55536c0f73e52e07d0535af6dd3b2605edddfca469e7b5f06637ceb40567cd58341c0a2074cc369e54d048f40464bf29c9b924658217837cfad2eeb46a8d35ebac8dbd0c7383afccddf4cde78273f59d161a19481c9a6f12685c4136e575b0ebdc13d7875d3003320c9dbc9f3fdb912d5788fe194b5cc68129472e7c9f7c4881cbe7f3f273f93f02685b407d75dfc4aee8296cf02af5256689f4b4a122d7632f883b2acd328823a7e94321a72461955183d0430233a592acccee52522813d8b76f54b49d146d4b4537e5259f8ea19d83c3738af2b9d2a0a2418768d9e0ee774148e9f4c70e23de57275e1462a8d60368db4952590b81552ea9ace36687ede6deb1ea42755b464b699b2d172ae8505dc11a68be34790f5e4d4fc50c5e05ae0dd7760bd98a585e1ec5c995f4601058ae328506768bd0a89add253d621a42c5646ef8bea8a445ee3e355f69d6a5e572bdc27c2f733dcbf9bfc537e663e4019cf559e36c2df432a9b2e0aa1175a4e21611ad16fb9693226b27ca5fe25cf41db8be1a131dfb45b5bf7e3116b1b82ac952aa543efb1a42fc79fbdb091919fb1b45d38518e5d970a8c9bd1d889be668755c2ad83bd87c295cdce6e43d55f193826e72c116503516094192bacf7494d85df8673daf14c073f261449404ee652dee2a08100ba443b694dacfa02b2bfc4a97da90e3286e4e80134761531b5ecf665570760719fef6e84c179069282693f57c3ea6b1328d45b0c703c1867a21551ef355fccaf190fd97148bfbb49855f7fa08460ccaa44c94e7b1b0b0e0a92c7a105c772dd4d758e94aa2f073c6a83b73c9fdf85ce258e4d0f33e007e0545b2fd9ec789280d0ab412af6200b665f43d4672b2df296040393a8bc55069c61e95499df1efa45f1cd94d273f97ef8c48c664e0df88cc495ae059b4a0ad2b3e7858dd136877735fe09d705d133322c83d6727a6eaa95d209cbdded01765757cffb9555d69c6cac9aa8a3e005b17f9c338a80287a7808c034c5545d63dd0520404159220200387f514f14d065dc153417dbf220853ef2354aa989d395001a11cff242746d66f00ae96e9dd174b2e5438676236ef488fb8ca22e914c5fb22a9f97684265f9841793590dcfa21ecadab7b4bb7528d02435a14d8efff8fb2a722981b64341a3f5acfb579670b65644976dbf74b02917f422d4855437ea225f4814f3c6200587821303621d6db41f7e196606c822c68568aa068dc93b01018e115b90259693eccf357eb560dc0523c9c9950ceb95489eec5a1b85582f6bea8e6947a094a0799931a1eec734e0935e306549305837c6dcb4eac72b87f519cc2ffb33ba65bc328e7d5339c22e78bb67f86b49928fa925f2efc6504ccddeecc7dcef46de233f6d9081057f10c97f1c4e5534e35b58454f4b324f253e30abbfeed55a0409cf791299acadc112e90d02d1b8c3ccdefc05e2cf4ce1fe982d621993e141a9e1864ec417196135ffd4f76167cde7f81149a947da4bf6bc0497e46bb95365d073c8fc4a99401bbf52920163d7536140ceb6e4b1d18e0392b2f0fc2a744e0449b50fb9c555535f1606221ec980c7ef6feee0d8f2931ca9251b29678c4900068d8d7d0d80061964c35fe424c7f3bd2c59b5414002a223b49332696447d54a987fb3b793308d7ad3e495d2a615aa7d4f77c21cc214b39a9efcc2b2ee615065f6c4556dbf8f1f39a958be6e7a86802b9140be296e453e4b2ed7e1b8bd877a13ac5893b3397cbca4a70b2ade4bbe541dfe1bbf9bf1c6477c5a49e72cdb707a50fd12daeb0d3e67659a0e88c137f99e46dced418b86189371437ad9b12acc41cb7b3d080d3b322f7abe2f9416e9d2e913bc192886072d98cb451f3f47dadef34c792e3c68fb5c7dfafc25de99e03432a863a9fb5eda5ddbd443ee3e0703d7211a9b93a40b3c8080827da66fadbdc725ad6e12210b1f2acd511cb8be50f8742918769b06c9176994c705ee2f95a0bd5aabd6d37dc56463fd3ff24e848b670a138bd236c31b345b00a288cc293b8ff6efb9e03989b1ed1b1d82f6f095c1fc0f2679dd64b5fa7809193ea0601362696c3e247ba97810a1021805882e681c43ddf526621a6f3c99319d8f5e3e5bbe68cd1d4828abb97b7db15e668117e3fb7022a70d18f1ccda008380918c6fdab687abdb85c8db810d8407d85df2a92499a8b4147c483a4d996f2e46f119c0aa0e877ea73593aa468f50d60c4fa64767aa60689bc1e6bad80820d8ca1f4a09fb3d38de040d37aaafa5077b7830d9cf42f90b30c5ba9fd407c5f4d106d5233a95ba0d6703176f90d76ac27be38c28b86048b6b2918e087d749c973806ade8800f9b6180bec44302138a5eba1edc8f007ae1bb84e890d7530dd0de9c8232003e46eca18f97bd451f986b30f562c75cc87e559e3e1e58e057ec8cbd85d44632eb80a0a0f7d43362272ba4a0ca821acc2a3f6c75a45b6f1910d374aaeea7d7458c0cd90da7e2712882d24e4af4d79c46688d2523157edc97c9c4f861086bd7b03ccaa1411ba159ac9f6f88bd9f69895a4fc95615944b23e3dc80d61b0a3482037de49466ccea17f429a6954180fdd5bc50e50eb6215e44d5b94103975ac5164ba685fdde00c2acc8559f3af840aa8908e7e1bd0fb4bca0434b88db4979d7ce70d66ee04eb0d64d21131a035497268cc54b28b203bf6e4e78cf6f792e456cba5079feec008c04e650a7bde060034acc0c1c553b529efed106e6285f4c68654ef08e668fc215c15fe09aff5433350302fcdcd630489aaad0d520715150cd0a6d4da47ad5e67742fa7275e49d1554f33296235fd7dad2bd9161771c4a63a59a2950c492d581e44665f0c423d58c8ef904d57b2325129e760baa79176413e7b110b0e5cb8f554d7384d18864aab9d7bfa545048247fc0a8d359be8ff9ff37a1a0f0848cdfae97aea466c251152f919cceb83da88a3597361ecfb798e333aad37f1d2664f9d10e749dba9d90c442e0ec11cc6ca7ecde322fc63834bfc211f7bfe6dda1379f11f95c29a830e6672ee4152b35f0cc38a71c8cbd46be2ee3788b5a5be2cdc63d37272546adcb765441b157105b665e0bf9c3a79c109c53b7efdaacd87390ec2e463f54a211361a199da804ba36235dafe0ab08f48397e07adc87de8d38e4d0d8411781c615ee2e1abbac2bf767cbd7f760590941bb21b8eef5fa9679b92eb40c851835d8ec1c64ac907291b677cc1262657b704e3b377bf48220e70895b49c90a4c88edb8e109a692505eb11500587f223592dc087019c7b3104247edef0e3a4e14d2392aa06de0b142a4a5545c09b22b0fdb2169d11abaafeed5f1f196e8d1557c0166d0318e54a4c372ffb0817738f91df3e536a24486c8045ab6244572dbb6e5312c0103fb163608cd87fc375a812c4ce430a87e80f286ef793cc2515c97e72df9d3cb80a89230c19f8294ed5f048dcf4f80c2188d5349c0ffe4e0407bf195e52a8ac46b5e49e818559c362fc4ecb0d30396d3fc52a834c93bfd117348a2255c3f9342f92b2ba31ecb18e9aae85d5c6fa04479a3fec5504e27d42e66638cbd8338c3cbdfd77be5c3fe7b80d1a654c194c4c58ad547779370c48a85078ce7d20c60dbd16f6042d4a3be8b8cdc2eae5b21d0d0a7200561f467b3bad6b06abbe6c60ea451b8aa18dd1446bc54a7e72e7a1b2cbdb9995b58cebca9bc72232773e97734ea385b85f62948ed5f45562348c5a3d637bd75e8ab4ff3316da2956134da5c4c69476372e1eefa45f073b56f847ac8993416453bdfbaae9ae173d7d834a9d57b14e156254377166c31449b0200df523cd5486e72cfde7870a9893de1670b81c8829413b329b0fdd28c27906fb31c59b70c2a30b297a1cf2d4c875e08a27950655744905e68b6330ef8042b6ba77559e61e61e6004fa4efdf124e95f85c5a039de3154539aa62156e7c716f98cfc4e31186ec3716a9939e28c05de0b19167ec7fa6ce79307a8d9d22ab4e5faa56da0941c0d87662354781216deab3879b608deb1504f3254070c26addda39d29501e14c1be92bba7346133ec6fbf4599f6aab0641362dd2790a57b41777db1581454805e476172c26502361b8102b08edf1541d5deb29987e295ff6535f7e0cf03ffc8cd2b4018599eb3f61cbcf4d03f2c5c2d17947bd6f6f7137ba0da2a1d8994262a60e69cadad117bf224e10b13ef171599b0e223b64db469bb15e08dd81e25d149d04fb6593c2f491bcb308b33b2c4e6ade2379c5013dce8c36ca07a0598d24354d9b89ef694c9f63ba69279be304cd7c804865856d78d49b93178dfddc523ad1a4fb1719ba86f5893bf22b561bd13c3a2749c07917696c776dfc07fc6b7c7289f5b89b6f0f6f9edd0208023e14b2c3f467e32416e9749ea8b04a6c8ed68326a729f2ee8019808e2401ac669f37b3287641f7d9512c0aed799d0f4f1a16676cb0c9dab4e0fd5aa15a78c3cab1edecc03d6d4eac719d780bd45dd1da401ded6a2554b62d5015af959b8303af2d64846d75f56046a5a59d64d3694978d874fd027dd0a60f15be84e5902efd179c2dec2ef15409a4e801c165eb6b69c98c5c2568334f00b42316daa0153a2fc17a0e9be00f76a86e4d9e12d05e31f177ec6bc74e8486eae2441a04d9794792ed739c2893f31ad9ef7e10b02b75a1211b1ad415380cddea1c07f40d5ca27ec9087e81d5030e38e60985ed6ebc76cd4e84e45e8419b9fe088c5f4f09967c0f01d41af42c6cb73b86809a4e750d8ddddfaa7d3565e9db185aca2eac7bdac0d9f879b27702bb1b8c0e6e14fd3c8791d63fd06496d0663e00c8bc8bdbc92e5cf6a66f7f7facf4906831dafcb4edf20cd466f367de756a034db15a86430629a68bf2f98c47cab3e954d5ced0c81f3f6cadf2f4753444f26e714587b837c3e91e7f66c7997739019f1519c1cba83c7322dc2c59d2091b6fdd2c71a6f40ef3127aa18b499cee749084edb0f8e032c50ac345ceedcbc4185b5213232f3b8b3ad8ba604813a9bbd60e2458d85faa9337698c797639fe69f09e0a361f970c9bf7141b5f8125d85ea56ff8072e63fb966ae333800cab7e554a6f78f90cf8e91d5c52d513bd25a6a19ab91d1a0bb147f642cc79a10b034aa5ec1bd6cb969d164fa3e31ec0121f37128a1b19e4960fc494f12b1541d860702e4b612fb6d564ac69a9209151f40d0b22fc79310fec909d6e9b37f2d286c19f38f6357e233bf5b6e2de4cb8c17d7e77e486148b3a07a9b7ad662524a9cbaad877ea0304dc940744645ba6dac6349f107dead02df37b143bf3817c5f32023e779f1a895c48c7b7d7e8b4ad9fd04f1170ea4b911106abbf8ae44866f21ecaa4eaae0794d0144930a1f709ed152a7e764f93dd0ba227c6d9bcfaac35fd27787830483d1c8273d45fe3c744bb39aa63e6b1d0e98f25161d566aeaafbfc618d1abad01df1e61c77708b4a11b525d9157ec5c20a3961bf661f8fd3dc25a9703230a95af40cc5ab8908ec1db334a02b0986ece14dd16c2c41ab666455ae0c2c29529b99f412dc21ba4964c1255a840249098fada8e6d8f1d1bb25d8428e45993b028f31b9bb5c2b9eda174dbcbbd28a31a5380a6499bd580be90dfb1404da0916dd47bba9b682c351104c48ca85681488f45228849134c0b812beb0e912d222aa9c35ef557f0e01cf5ea3d1858a3dac58c0858d334840cc8057e692004669a3eeb8530b2472e29eaaedb683feba82775e951c8df505452a6e4c43d2a4341cf4c246d2c18a148c0fa161aaaa54772b4eb4c4aafc114abc2436f5002be7f5d6993afe117651c31034824743e8a3b9516e52956876044860d52a4ff297771596017255bba30d5310db65e61d0eed375d805018592d6b6a57d3cbb44e617c89398767a0c1a8c8671cc90619c0bb45583180b98f44bab102d51d107f04e42b03331263cf8c1bbf5c4ab99a5fb0a7c8e7b47c6212530d8742bd47c2552960408de6e0574392c0ce3eb8c700ca782729c82098915d72a691850ead19d92daf5c273ff87d76c740746236faf9cb01d2b166d6a26fe45e4805216617b7460300a7471fb360c48fa3b68c2b51f34babb1203f7f6fe98027ee407c82b5bba54f501f64e26fe3927c1e736fcf9527b54ff809ae172d13f31cf61ee39b52328e49d9249dbe932fddd7d0d0b9f004af22100180efd40b8f2a30bfaf804a3a5253e3809045ad4d6ca1eb641d300698c283e98105e3b3c35d7bac3c5c16bb707e19387804d73f59280eee3005b95971cf8531da0ede34a00a07c2166ae2871e14c050dec297f7dd7017dabbb042b8aac878c9c36c1c962bca5caeac5daf5c215100813b62cdd689829f975ccd2b70903259d31ec35de076cac66644ed8e2cdba42e24a297bb34cf853455684522f8a1684bee856f112f678284a19a98c72844dd70bab43f54d1148bd2330053be603c394b497e4d75baab7b6c0299cdfa2d5052a1d2c28fa2e87697978b0d0621364b4b2a13919c7f9007d8578c66e7a281b24f9e127de5528e0685bdedf5faf1bf12d22dabb7bf46ec60e619496dfe6bc1540048d3ef67bb3386ccca5be622d53ab9dcfeac68abd7fc459871b426c799945839eb1ce85ffd9d7ccf6d3b7a515072d94c2091671b996175e2278921f62c036e2c8eaf8590830bf6b022a92c4bb20690b94dc7e4e52b0906a778e2942c06c1175d4050ae6c93fd288e93c8c1d397c463b6fa048cb30058660112cad015102f140d32d005056442e1b6ea797e05d56666e053e1a713771654197ea402c459a8a4f2ec5863b1fd66b72d310a2e29abe1e7d0f65bcddf62a165db1a28e74035aa9b733e0a4e8949e8973ca80e426435909a57d738e44b926525ea60697900138f62934f9b4731c5eed49e2853609f01f6ac1e9c81af875588132db215ff8289a690c5400fa3d442f27eda1fe452d971b711fa3adb2525e86f90f95e835c6b80ab23351a21ff3be96d8840fca942ddd48eeb322a99ddbb26a7f276f6947824a24c05b479b68c2a6ee091a5c239be1fb59986195522e574fe205deb12bd6b668edcd546ae368ecc9fab7d532569917d45a0f369a8a10000aceecb6749d4d00e899ba9e97450f9994b2005163fa2e60d980798a8da54716e406bd8d1c4e7a3666a368884193b14938dcc067fa04c420bf954d58a1dbc155b599c916d37474854bf9b2bc333d14aa276d6a107145815676552440cae7899cd3b863a9c49f676c0f34027d4f703e1c2b60e4beab5b800087819ccc62385afa10c7c55a6d656df4ae78014383299fce61c681949c313a3b5e902a15a0d48f2c2534cd2573108e75dff36a98ac267d65d0e9d22ae1c3eb9e823231ae34c03fea6ff5e56e6d163937bec1dd06a6e260d515e2734f68d172f874cdfe2090515c4767e1f9fa734e594a2ae7291398e8cedca35411fcd6a6b1e8adcb0ab59d1eadb6913b73c7b596330bf6845b4bb1b0921da549ec9b79e3cb63d9977ca033e4892ff3bec020547874f71a1d1c53a20962d303251b7bee6ab9deb86719b1aa0b86864b6bb98e71eb39f9b257594d5b1361375adce55d6c36454eb1d13c5b1f64a6a8e1decff0596b178a18d8c849de31acf680646a0adf1b796f6774d850793c5f6dd03f597861efda0c0d4ede9822d232d13671c6399c70dc93c502be57ac63d79920755770692d8b3478e7ffcabb00934e9781c132a1446ac9f605a2bc9425f1d139d5868f2d572e51cab7e349c3a0b0db45fd630351d8116ff84a9a68410486063c43ee029619a38d141bfbf3b94990439109eb6a47021c7946c374c58282847ae326c534d6fda1360e419fe0930100ff0ab95909f9c4a69b41752eee525a96c4dff1740497a7e3d865fba2fd69e807b2493d286934c23c935f5c59b768a0941d372d5c88ef8cf5f20a2bfd67ce937e679f57d58bc8930c4cc5d712065e79e9f3234609fcb27866a6ed8021deab42d7b41027e4aea6462058e729c5f02a44149443daf27eb1ac4dc36529851141da9df05b0b64d6c39345eab9770c2d52fb8e1666342260b76759c66472f86fb3207b7ebcc0cad99adf5178ca08a7e7e8a0bee970b88b08aabf4c1d496f184c98819fcb56ae4127904fd93dd5a5eca23a070be4120d85b18640fc8465778570d04bf19bbd9d438ebcfd002752e7bc23998645b74c1191b702e040b410bacb0340f40824b1d6f81fd68ef6559b79f0efe6691363d6b19c6563f231597902730c08c7fa2b1ce61df402d3d7e8ac08c1e97535fc47f521abf0f531f722f95496f6dcba877b6307d81ac27a4488fdad563cedc2dd30628f674d2c8e482f20fc6396554d723334cb012b380884f58c9378f5bbf1eb2a116905f1424e168f5eb9a12f330578a154329b5549f9c83d698ce3ba0d6860fc0a169e3b701972d144b483277eae00aacdcf47691b8b405217a5aef7b31da52a0b877c383144004242720112c26025dd49cc0b0935de9ca1ced952d682a91bae8f1174a6608c41cbe2e69cde4cfebc01b6652d57d918e610e854cb7555b000b94acdf59d587cd46fbb9aaa508fde2757548b7ce681945c72d2df2a1d4d9323b74ca638145bf5bd1968733fb189eff0b8f6175b59127eb5b6327d123c1376faeae62bc83d2c5a400d2cdcad06c2657ded64d2be8051c526c0d84d219bfb74ec7c2708d4dbde40a8c91e11fc5ddbe6d24fb39de9ab6136c5a0100168082ee581bdf95700b34d7dc4bfd28888ea874019b8703a5a10e2e92942d1a2c1b4d1a9801d8accfbcb16508e0497cc72e7314d358989bfb81bc78b7b32aed9bf4d071b0dd516c958d2256437dfc650b142bee2eb397a755c4e788b73e3362836e5fadf03d2cc036b0906531532ad04b17277a8ca8f70a03c8160f183638b180af1f53eb47a31d4b05c46df4d1dc02b0e60526a727baa34d13d029fb836f7ba406644c296a7fcdde1dbed8c1605d9647f2fa4b2162cf75bc79a43f4365200b02100897b87a0a4a154b9c216b555922946f3fb97a3be95cdd0cb4e7f45646b15c58208025f2a3c7e2780085cbe3b89ce3031446c2c50c3d8e994f37a06c2c98b4bb7aeeb138736cfcbe3c909fa97e308fa0ef03f6b6cbbef5e7deef8409cabefc29df23c8ef7112651cc6606e523d1a3dba1e9bccf041df907990d9bfc594ef2cbe8ae130434c2d4e3da265005efa7d4e1531bd853ade429efed141c3a85f7747f83ba54850a99bb7872a5a04aa5b0cc321537501d26fd04355fe7a50b4a91f978948612a1b074520d9682cae70933e92c52f98464a93641a35c13785655bbb9330123a63928a469689dc7ee9a8b1c78a6594879bb0d69450a0876b037285727586442a6a512a746a76269141b0477113fc4353592bec6afc464656857966604c8908349ee1f7d08db14f37c673e3bded0489900ad62263ee46c56f4c2c028a8b493157e596c02cb1e36bd96501c150f6eae08e4cf6cfe81274c23f7e04c7c560083635df0c6c4c4081802f2b24fa9732531c4db6a48c633c141e487644e55044723a45aef4ecf74018d04adeb5f58f33b720460421bd362b81d142e51b63faf70ca339a6e2be0711b2e5d2dae1d78c8d61cc4ff8358b995f86d7b181cd7813d01e0bce2a3a86c6c52973ac5bc31513e7bdae622c890bc78e24a1ab11b3a3c94d946795c223d7116cdd795a4ef38ec8b8b70e218f45df337168531f49a29fee83e474a52e7dd0ffb704d5c314402116191a5e32f6a0128fcfc15b384676bbadb7fcf1ad7ebfe7323e1d1eff0c88a1364b483755b26db8683f0fcf782de4e88752436c240431c6fd3f5cb93864f224e80da3203a56829c9dfbafe83243e501040b91ea321ec5ad1fc7288d3e5b1e97a7ba21f12b87018635f1e8d7ffd49ee7557a08f5c8068cc201b5f0fa65b285fb08a1b202af5c2941abbfa60039d0738fbfa6476a21649547551e6e50d2be0a0cb8b16b0963e0280f4af12c1954db2b6f536cb762cf4f559df4feb89508c648bb42efd0ed11e041e684ea407e876e6cb15615592589d739dfad5cdc79585611180ff71972d3db723c05c69180353bc6b4ffb5218f803717ece0ce67437e1b2783965072d3872e92fd001c36ba739c0cd3a05911eda30422424b7485956a396a0a2182f608583fea91c63da3f74c60c6931a62e4b670718172f990bcc7c1729e355be8420e86b80f9fe1dfc0f44a56ce079837047a3f57ba6139c8ac44b6dfeeac81481c8a5e0478c619cf948394c9712c3f0d5ec3de17cb6e6449aa2dbf491a920289a21e43c3901f9372cf89cceb9e871525fff02e643ca55873eaa7a8463b0e7d5b6c90839b9c9f4db9385ce3bb9474d85e72e591d527ec5220ad8dbd1212a33a8f3f533c29104a13a180dbdda185ea29fd46f4130832354798956123ffa816ee74d5cc10d3240e0e0fe68366c0b99bd0cde17d7d40d55b80b855d63e5f50b085cd7f5f7f5f79ebe1e6b2e73c04a9f24c058328df4588103d9d931ae287aa8a024b46a39fa838e4a208827222b73d58316d7acbe0061d7ad318a9d215fc3dc082f5547dedb90543f215729dc75ab2228496049780d45f5a40d020c4c82e7c85321aa96500e0d65f25f5e608a96745ffeb8ec54006d4aecc6ed2d2a88a1398b975c70b6d17e51ed8eb5a6b2df10342bdd033208431bda8a60e100e39aeff2f7bfd0bbb6a537474dd27805455c89666afb345cdd49790a2481ceab38f1d2d175c208d6393b64b850868701516ddf7a9382908c120f4e2c6794a7d4e67df699be8629002f28cd53fe632625e5427538bbacf02010bef2d30f8d0cabcdc5af54aca4a2e35689b39d71fb48251d161764281461c8ae018e3c2dd577788b0f2577fde3358c723c94ba1656232492cf3953bc6fbb178e5ab991027b5ad5ecb104640dd9d5967e5c851b54a33a6fe1fc3c7f22ee9ae5aed9b08706f84a8b0423ff3fdaf4356c605b1728fd2bf5fe6686c1b4a48adf5a8808244fe3714ac0d59c002047b24533f124c6becc0175da9ea40660562a428147db840e3d962bc10a980d4e9fc99731c9d9280743225c271cb7df5af167bb78a762ba53eaf1eb3579f0d0a26dfbc97f304a1dd7b18046a2331f52a5d83dd8ed87c5d209fac31d77b547326a9c45085d605823f4d11ecc2f987783431b3d874decf705cad333f85f38172d8fec90b7e05d6125b45c22bbf0284aa5baa91fa1522d901db46287561d55c42659b9df28ff538f9fa4ba45495869a987b771b9441c95b5cdb8cd94ec7200f71393b78a120f039737e1c09fc65fb1b4aebf9b9e5ee7fdd4f7a8c498949cf485e657de75bcd4f1dbbdadc31989d63af007f05aba858f2fcd2dea0f1aad903a9cdfc1e5bda1c2a9a0bcdf33f347c0684ecf2234f65a0ee8997bc07801a66fecd2d43fcea17ea39b3aca48db3ba6465840102d54423c927d640377a34a6cd2b596360f6aa20b71c6e6b5d664cd1178d904898a29a402d2f6154266021a005b4028d24d07494a3ef36a232fcab801802d4805c90116c863b3767b2c9865a819a111a42bf3384e7a450f243418b1526962d514550832b18d0a6fe472e75e4017a39b816e98f465fb62a4227cc1c2350a9a0061c24ba0af1d857b109373c54fd24f2b3670f731fc809f585784c9adaddf459cd6d4a1845b9dc09a1a60292b89e8532efb86f8937327c3112a263e20845898ce10e2b80a8b60a6aa1fe9e658d6441ebeab1a8246197138cb39e33da7fd7f8d7afb982ab186829aaca63b01f719aa595d3dbe4e12d54c1a1c89e48675a3f6c58aade858419d018390fc554ac021bb0a9c660f52cdfc4ab39834d194e8aff1416ea1349a6303af58b683e4d9a682283a341f65a4a1eda4b7a83e102ffb514690bc3f4562d8c004e3f3a1a5c74eecaff2132330b9cfd7b215d0a08cf771e18665a10fd0f52b9e4d90959c804d7a8793628fc434bf6934568e22cfbd057663e2c9f70f9611c88c3b20293fbc567e5644acc0bc876cfc90705444955fe8a6b6dd712ece12288599526a11dc64ca861d44e257e887a615e1614f464d142ffd5afc231692b9b8556327e0b307e2f373e2ffe58de9f5f1528b9d5408f69d04893b798686cd768d431678f4d4ea48169931b51d869252fc503e2375df3dd4ddf4d01c1f99f8452e1b09e03ee55c79d16386f6ebd32f3aa70721f195e50c29f71d69d09da6de316e9be08015a063a0842b94b10704bab99d8e55b1937d374c6ca01a85205d559d9d0e882b31f56b952632b6b7daaefa4ebb498ec1a33ba60741bcb8548dfbcb7341337ad124fe16e128d6034ac2d0df1a32ed43f823ed0fe992d9b26ecc844ee23bb07b505f084f55f968a4ca718b5f5e1922eb71508963a5366fcac67296f421c9fd7ea0e85fe490be48331a4871fb2ae558ff44d485e1b49549ae847759fa8c1162c5d47008f926d06b2b83b80fbdf56902e115e4129c12cd52a41b56a5248655eac1c63b3869862a4676b2792febd25fc31ac4f5582f87cc8d278088cf154f2e2388dde9ec0a920b4c326b7749c63c9c5a12122b40ccdb1334a79dde61fc901000c33dded256a8605ac5c00e6241628ee60c99b04cc2a199e0c65cda87995f8406452cf47e3481d98055ad9b77fb996ed1de1458110ee7601e261216222724d8fdddac7cf1ecded3d1adfb7ece4048fc9393bf814c8c7f38910cbf0386e51b0f0904f8dfa44e39b5e7f48fcbfb181e62c08a801ffa2ca1a5af7bac5e87f3da06ef521630cb0cfdf7334b91e76c113eb95c400d66de5bc49fa842468212b051417a4d1f42d35c8d5228a3e683bed30614f1e1596f34b6c10a02ced489de54fe5032d1db18a32e3e19eb2267479dc7192aeb58b86cfa77cb6987db879f843013037ff0a656ba3f6f083ccf3b12bb509cee18a625e022ff7558ce8b7a3d024c46fd7e7ac095a17da2027e40920bc27fe301816aa7eb519026f83fe6377a3fabf6527e56bf4c17c5e32dcef7fd0dbf4c2b7e3b8ccd0afaee953da32077b4a16ef9a7c9dcac5a2d696e3d041756fa1f0dc84ff726021bb39df0fa1d1b0248a6ada6ed4e0e5dc487c945beb80283e4865799737ceca4d0e181b536579086ac38ef9e2390e02f3c1fdc662d8236183a2eab97d12095cb628bbaf1578e509b4a73495de6ee8d7811edfc7e88439c2096b634808950a101e4bd510818b425994c0c50201a1d5e400e0bf110fcdd7897f654b21ee72de8b5dcd11519820cc76aeeafa0b34948c007d39ff7ad4f338f8964364dc7cec63143b4a671f06e037c90031aa9ce885d40d4554d1b9dfd3270dfa5fc0e217b0171daddc2f3ef0d7d37045beaeced93832f4e0cd7d82686ab8f6be6c1df2249e8de237c7b763e603b06f3014d841cb0521f557efa2ee9f85bf735a84714c565ebefebdfd6ec924d24b2bbbb7b07ec0869082f08b5c66ac413bcd65a6bb5422f800add5b6eb47c4a6684bbf0279331910df1ae4210feae67dc155aa4f6f971f0d77069707a78e1851d7a470b97ffc28ecbb5e7f08634776bdbeef862d0979c461ab9df8bc16d9c1a9e66e519609bb8ddbf5f0af1eb3ee1a5e2e70de3cdc4e752e031fe7dfafdef5db9f3c580786b3497c6d2e0cbe15d69b0c6e14d69f0c6e13d6930e6f0963498b3dc467a35efbb35c7f7e62d69f0c6e51d6930862fe2499a24953813b38c2f4f52de1b0d877326e112d6f0453df186792d6d5643e1375e170441a408208048203b4206b22378901db1c39fec089c234680e48a8be485c40a19922964488a6e2093f5c864b012c86436c8642358821156144166c413322386f89319614466c40f6446f8c88ce89119b1020e7fda17812062448f031891030f23486083206d8d70801f5d221ad27509247094a0e4defba4889f21dac49fac881afca061308422788a50010d973f591145cc29e07b0fa59412764ff62862079756040d3af748136cb04790e0920207dabad1048fd9f24a78b46ebc9f06dce081ec4810ce8d964f1d21c2bb0a2dd08ef4a0067980233770454e85d32a478ed0807747663083b602a7f2722408bcbff8b9e148cf0cf2080b781c29c1eb088f1a82665c094147f6464e1cb9496da69c928b292dad7df15e782989b6225743d7e02a47730d176013969005df311ff2bb1db0c267ae61ffe61a1462344d6a93445fcb3528702b2b0cb72db8cc36b8bb6f9c892a977613f530888171f1826ae1d2c2725ab140a4a09874899439bc69b6d229c512f9b709290421349c5840115990104148295b6813300848fe9505fd200bfa81d71eb88810ce1ba8442d61062f57901f34a1c374028a263e84600426e0304133e79c530ee173ce39e79c72ce39e79c73de54d08f2014e8a02159908b882756f02723828877cd9f1219114132228cf0272342888c881cc88800e24346c44b46c4cd11ac43cc64121c11b648104aa45fd91042644300910dd1c39f6c08986c081dd9103328a10a9910444ac8844022138248106442f8f4c884e09109f19209e1920981f3a2a36ef8fcb76d48f3685a3a3a3e4cf9c941f74b5d6f86f653db33a675aa038f9b0e293f2fc69c2aaf1763ba7497199f2eb3d922f6624cf9bd458ccfd7c1e5f566d49ff3bbca8caf5c95199f6f4b2f3e2b45dd0405f1482389267d7e51ce59ba93d6a46e846fce523763cac67b29d34bbd7f9583b9e6c554ea7de94bfac598cfe51afbc598bf5f8c99238043030db9065faee61a73c358d3368db359022bc899f978cbf3b77fb9f41873304ba0f498e3f204b852c9f4a5df72cdc64d1d3695ee8b71f3bfac25a01f672ee6cf790257ceccbf8f257cf19274e9f5e35cb3f152b7a1e8d772cd76ed46323d4af7bad2435eea7a07b8ee5ee92f2f913a1a423a478ebda56bbbafe002cca2db4c70c381cc8815fcc98a3ce15dc7644586701d5bb212b3b1c2e7ef1212ddb7574c65f666cc97f1a98ef1aedfebc590dfe9ebc5e56b21ba00b388b3bbcd1ecf8277ea7a31e4e7a03dc7ece8cde3b179030d213dff29d1f5697d4f370d212d1fda78b00759911f3c1c3e0765457c70f82f0a61c81043860002880430082245b4602d14c8d80296403f59921fde391ebf06da05181631c20300f893010184084736aed9101a6e980cd1841b05f8a08aa3285c468c80c80fad06dc78000d221c3cb9018f31deadd5801b0f0042063300e206206e6ef09cd467038635102162079717472d4036b454a151721089bc6087d30284e8c99f8c080b88ec90a34284869423bc50a0d0312591a38fdc5002e241b2418f1cc40a4ec005818309301625d8a0388106840450911200fdc003a827054028d0018826f000c413302094e47004c411179123cec29fac080d456e7857a185116834c10581650a1f84702428073a43f1df8d4d8e7083273841a630a28426aaa002919432222184048d221c11638442348a4084191f007f3222c4b06d41bf2569ac761d86204e3fc64363570c29d19822888c083cb221c8644370b594e06f4ff8f62c459c6c8810977f9f086172dc93bac62e6fc22ed80443104adb8059705cd36108e2a5ef3004c110a4b18b097fc9e57197c3456f1d34c6b72fb99c682c25a7e49c493893527226e19c4ba552a944630a4dd33419115eb22110699a065f930d01e21a6973269af4a6cd9968a9691acc36b8d735f93b8dc5682c28c61d01a50b34e6caa417509e8dc3f4457b7a5ed487bee0a9680fb8dd437d680f9eeabdba75efc5d05e3e9d97fe6871ced0555a5e34ab75b5bb9c13fdb8eca8b5f787951ac4a34ad76db84accf45d02d91103d48bdc81f92e7362be4b1cc8d2e2bb0038ec18d03aed5741ca38a1933e72a6f3018a0c782a59e4c674fdc2745dbbe87a0b7fe9faa3ba9eda5bfe964cf8c4a89241459e4a4a9f5db934e2a94e1f5f2679aa24dee9f42814b41075a2fcc9d39e5c0649284f5b721974da91cba078da90cb248f899780f708d0f52c2e20e5df4b00cae34a42fdb67c3f0ab7d82befb25756dee559583e3fc086afb0ac74187237eed52d0f480bda52b6a590cbae3c51e8d36fafc2694481df65a74498cb462972d92697ad398d2874e95d7689d38842eb77d9244e238a2096bf9ca5eb1ce02c9f79cb3e753d3ee12bbb4b959db2bb24924ff0f8a6dd5f1282666cee4e5ff48727e8870e19cb352697d901b106414c706b104c2c1961a5c5ec452987680dc818cf61bfbed51efb88291e08bb0df662dc5dffdea7db46fdfb24d2735145bb0da721e8e1340430e0b4c39b151af2522bd21f79afd6b2a5c57e8fa126ae0686ebcef4e4c5889ff5c7870fe0f7610c41fc7edf603527ae6f94361e3c6f9b8128147596776aeaa36c3f85de0cf8dbbf2878fc37e3d6d8567e7812dee9cf8b6245c92906859491837833f18ffc28e1312fe1f18b98e0f17619e8a5fb06335da184c77c8af1083bd3131d7447094af1bec1f22baaee472ce20c7d9c9ba3775a7c40f98353209c7edea1dfb7dbc527312563f45fb6d162867bc04f86ce3ffcf25210ca96b26ddbb66d5b1234e43a775d735d6fc15dff1414f903b96eebf4861c4208650e2962116568199f74ef47ca90377772939dfc180bd75efec81ff9237fe48ffce9f2e709ef1c8f7dad2bc162aa06bad7231e1ebf1ebd195a0d7887f0c9bb5f80bcd7a352edb8a0ed2806924a6edf5eb956393bb37341e69af3bfdcc29be87af3f6b5e7b01d35cd296594aca9eb96d4e58ec3d6767deb764cae75dd66a5a3c25d12c4b97a4108e193f049f8247c123e3e770efe765ff98077f5da56af7beffddbdd375d94fdb28b974a3d77efea9dbbba717d6d93f2573a2b9d95ce4ae7458ad5f5c40f2658c4f71e7e9b49130e833f1993214c827003f0276372c35f67dfd3f7543e7dd6ce7bcaedcee1420cdcfee3d4761d72da77c4d7278f9d05e3f26bae616bd87ff9d99734c6ebd67126da763a6cd82e87d649296f7dcbfd949d4a6c3aa99505949f05c3f5b186eb531f089fba288a52fa2cfa38d7a0d53ecc2e6d1bf52e767c1a9332debbb0aca448d35621ed7a4c2a6fdbb6e5e05eccb6e5bcc57439f2733195c23c8561c152bed31e4e690b5828a574cbcf7d870ee06a878af9f8366f33d2eb47f9171afbc699e8ceea2c188f8fda39dba84f6b6cd1727a7915fab6ebb038dba89f83dbeaebd70b8a2645ab01511e5379cc7e3c539a37a5d42606d68bb543bfb27ef06e512f03a71b64b176583e78b775eb72d047e587df77c47e7be4a8afbbb360dc12d103d4025ee90f0fb1fa94c793412bccd70e451f45dfb680a2947e0cca3e6b07a64051bfbd85d9a577b1f3a3f6e32f5b6fd68bc6a48c6dc6d2d1d8a95be9684ca54ba131fab7bee4ccfcde12835d7cbe49db28fb8f6f34c6513a93a943d9cfff9232a8909c997f35157a09f518def5ab6357e54cb40e1ae3f9bb0e4a5df97390ba9e9f0a491994c79b813d4968c1110f1c7ea7457c521d38fcaeeba05dfbf099b9c7cf7ab17a401666c1f8b596d503b222d641ebd5eeedeee4b676ac1e3005baf2d3a20543664f9a08c255e04fd6040e9f1531a144cf0fbf471c01fcc9887cb88cc8257362262382ad5efc721e5e1fe7fc99e5f4902ee1317e8baeeba05d8799cb364a7f1fbfff56ae95ceea155537ee996b5ca85f659bde6efd7897229428b074f484eec5bfcad911b5fb6fa5ddd76c4a0b2a2b9d94ab3de9aea8743d72d2afac5edcce0ee3be634208490f21046e87224100beed3a0bf0eddb87d15aabe39772b6b1f2965b89f6f547bd1223be5b2ff1706fb7a2a35efd9048d63e7e58729adbc42003bc5d042b1fbcebdf117394225cb9563990053fae7678d7b7851e7969f5e27d477c8dbbbe7a71fd1743dce5b05ffa8bf555f9db5dfbfddac7fa71e4acb54f2ae9550e4cc17ed51b9a5eee935eb9361d78f05a2dcac36c03869778d87440e1368a84527a1448825f22a1fcf624940ea5bd7edb4b3cf0dab7225e77ee3af2b3ecd37e52937eeafa26adbbfba5fa2b9dfba4cfbf72ad7420ebf1fc32d7c8ab17ad5c5be94056875cca90126bdf77ccbe63eaa02eae69570775d93bb976bb950e4cc1762a3c3ab6fc906f42195b44d0315e1863d4e08d56563aab6c1141c78f7dc629e18daa3e5f76bdbe8d72cac97b4b069a76574aca29c532dc02d27d76cd4d253ca6c09b1703de4008e19c70c299922a4ff880a30c42b80c3f73faf0770383e0401f2ce08fb5d6eeb0d45a6b6d9cb4da99c3cd6aaf5685ccab6df86e98cb1b97e7e4707824e19064d06584cfd7f3c9a26cbe148a3e22103e9fbed90b7a71f462be4cc126f3e10f9f1f77c80f4021d0c8061ac0636cc00d984323d0823b3cbe84f138f49ad8f0749b178f0fa394735218a59c93d23a69add6deabd9ab69db8631b77135575229d75289ab5a73d564e22aca9cbbab3057e6ee02387193859ab8babb0c44bcee14a203f0f92a45757701f0f92b2b5cdd3d017cfe4986231ead8d32cc5ed7618cc757e187f95a45e7d27031116302064cf828c25aeb2384eb53c4b2c0f2400619ee80091c82a850c211ae58c268092782a065bceb1b5d872082c3c40cbca76a9053d67b2f124d03239688c1122eb0610921f36708c9b342153a08c9d3528556d13b182279768075cb9382091f3da8a2a7871e57001142921b244a9a5042637770026e77c0c3c760852a745c628725784c815f8caf25ca486bad4f2801042572e04409204af028618223256a584092a1274243530c112921a4c49112454a502cc815400927849d7e534ab9d275172e3b095f42d882aa416d8e62a153d97500706b6f0c130628f0f85535359c19e863bb67d800aedc8daa14321480b5d64a4a274591e4dffd68e04e71fb2202e0cfcdc91909858ecfa9600c70d95d15e40f3ca3ea85969732b0b43c3faeb507f918728f06cf2d65e0b57e7daac2fb999be3dcc6d930c4e9a1e6dd43edc16affc28ecbdf4b61470b0b8793430ef394f04949b2df8ab35e6eee8d73fbd164ce444b140b3fe18b2dfbc5985be3735f2ef186350d76737b43ae66ab46ea32aca0b9b9a78caa6c512ed420b75def00af1de66f7368d52be594d55abb04ad7d3084040d1c868ab85ab7fc5011234d2e2088ee578bff2d7246caf9f244b1202940a4372ab54704bf88638c24cd668ee18b29d28d292ac4d00c3ac048e268079924a2b0c15a6badb5347248220997325a43763821073a1d901b364fcea380474c1239dc0093840d35b8b842e7a50838a090d86901c40e2e12891ee4b420d1830e0b122b7821c103123928c9428913254b9420515244c90f4a80284181121a849020b44448263404212142303881900a72844890c428891249900cfd180a92242845a4a77874a2456d9491d65aa748d26343121624e9c16badb5d62649729048723343153f38e2091a3847082971841045470c9936890e9cc08d43ca218c33f7c59081866fc3319450ca4e6f3a1f04f44d7cce7f3cf29951af8b00ed38e4400caf2d786de195e5b4008e356d53717af74a871a7f91bf15e40ce6b07238399428702c63844f6ea4f85d843000fccaf0fb82df8ce3fdd0cc6e9fd03d221c6329238410c2873752fcf703b7b966bbd70598059721dac86867405274841024482031826408487c80c4064862808407090fde5b6ed02490350149132d2fffa275a3013125bb010e9aac0787bb032d1b410d7509d40a5e6badb5d65a6badb5d6bf3d0eed371cda6fbf7531689d0d0dad42cf97ff125391df687ea37baa023aa26a7e9c1f810b3c9e8aaa490f300510558fd77fff96bc787c491f05e571a7674168ee63febf9b5c2b3e269729c7f432ed6c3d52c6c35bcfc73c6c5179f8304854ad3c647908218750cfa28a28aa5c7493a882f9e88376bd192d5f5d3c3ee9b1101e8aaa958f8f6711134515cbc7ad87fa6072b93ee66d68523a9404fe631ec77f4c17430f291f43cc7f97d2e1d8ffff5d0cffbbb3a1815ddf3171ca3ebdcb5679d8826f7a78c7422e2ca4676f469194f1df2f2f95dec577c9b58bae438ef21a0b995c760a961ccc4ef9975b3ccc82bb78eca21bd21dc6b88b37c1ed6277f82ea87f7968c35fb60eeae228976fc9167bc6948bfd8e6f78fc963d8578f8fd8e850e1053f14f5b0501c4547c95aeb77094ff7ddf0ccac76c14f9a616bd443fd1592812f1d84d2e938bc7a884bbf7e4226e308cb2115fc67f8f826fc35fc781d8d5b8e86a5c442a4ab319a5e2e8a852717464a9a0828a4b85d5a8d8a8d0f05f8c102aa1e5a4e5a4e5a4e5a4e5a475d43a6a1da9fc70d882dba0fbe69a97bea48cd70b06e3e1910f4b2945251f0e493e2f067c1a322dbff7cdc5217571951f290577e9528fbcf5238d3a70e32105bd19b3d4d3c3a54c119269f89df2947a26d08b3163ea51bab98cc5214451545454a3b5448a181428386fdb3671bf710072fddb93bad612bd3dc9c46ddceb6ddbfad6b596c010c4b97ffa2bf7a66eeb72e48c31c6186b8cb1c6188a1aad25b1d692d6120e06531899c2070fccda22d87c5b9f16c182607104464646464646464646464646464646464646464646464646464646464646464646464646319e16139e29729afc48618509a5047f23e2dbb3c864520c3122e2f2afd11097cfa964182ce75c042bea30141515655886c16028282693c9d462d2048b26415204211549ee493018ac450483c18a603c4b5888afe7951e88e130bec7f1e4cccf5c432b7d9fc5b4115fbebce122c6186394524a29e79c734e4a29a5b5d66aadbdb789561351ca5c53b3d9d062a2b504fc526b7674045b5899cd62942f29a5ac734e7a7444e9acb2bfa0a0d6ac35d3f09fc642944fbb4859a83246d9cd58b44978511549dccef12594dac69cb7b46d3c5e7a9a6f3c5ea23c78b6114bfb4d4f43caa37ccd2809a8bce971a874f94d8f23a5b3b986ad5fd22e9e4b5d6b48e7ae730fb77ff9730dad919cbedd3510e5c583cb9761dae42895009b716adfe9cbb57aad5ef7eea07395b3d2f1d94268cc0524b4d211825b1013f07bd1318d45159c7176ef032c584c59166cd639699ddf62f68f4ff764f58074c3af13c216685047655c7e2b898edf5564c4b0811a9e86d5031a00be7c958ec29f73569a44ef8b7b82609dfaa02e2983f4b0e50a01f18e562942771ad346748efb145bcd47c8cf10a0558eb672fda03d407ef444d506e44d2ac4a4ab9da0d80f2051758dc462417c84fc6c2b9d988f915810212b9d55ceb6726d2b1ded4979dabfb7ebd0d5b2d2a1415bd47ec0ef058d05e1d087c38e33d1587bdcbd298780d8c2eeb68ee84e835eab88cea13dc576e330855cd76d5ec61d6b07a60037d6cb01936b5d4bd28e0ea1401bd3214051458d44557c930ef1f8a4d40787df2242d787748891a892df2aa2217cfb7428aab419258aaaa2a8ba2f7987bcb37ac014ba6ee3840f4e85a2aad326322776b87c2aa3435c3eccac1e30858eb56323a7b073a0059df4c88a5a394a394efeca9573a692d25a29ac1052aab37a51c94108394829a590e3385af29133f649f93b8d01b7f65566dcd2a7dcd26ea51355af1255b0b3d5662e44d3ef5bac0686cf9f374342c17b2988ed31144170fb925248df722f370c7fd906f774f66654de443f28b8fc1bdb6235302fb7b6cd98fd4b611c3ef731fccd88e176c27db998b2a51f6e7f9b41e0d6f6a8cc8200e743d8d3d2026beb8d9ca16ff1db0e42f8479c9e7c44d5d33fc1a2ea4f3f20fd134f54f544d56987b27a0c71fa3c07dd29c6315ba1c442f546cad03339439f96ea0da7a6dac3e9ebee81f4ec96f48ca46759cf669c76938bd3c71b057b31e8e3d8f634668b71dab110a7cf79d0f4513c70fa5a3fbdf807c169bdf92ca494524e1289d4829ef5eb4a67e55ae5c82757392bd74a67f55ae948b972c9954e4c8c43232b3951b5e28aaa5fd9892adbddacbca20a1655bf8203573a93eb68ae03ffe58d0a0c94b7bd220aaeeb4f0c0f77050c50500b979c8178fbbe51e1127b31e00a06e2f0390a6e38ec313d2d5e2e3eb480c104c161d1eab5d289897111fb70c4e5e356119da33ee5f27da2f0c171e4606681724bbbb4012184b385c9d1396b58db8305cb3568ad33aae09c733ecc7ae59aca3720ee032dbfd31f2ebb1f3c77c7ea0153986f6be782dc8e86f22a2753fab9723967ee92eedd9ee372cedc73f439ee7b87dc46ff5e99f175ad74563a2b1d9ea35d01b7454aa9fc9da3db9f96d2483fdaaa6dbfe518b7c8fa9103ff23ddfbac9dcd0549c2f86fcc376f5572f13e77b78f9b76bb0e9f571f26a731c66fc398dafb18ae5eab57b6a5c7586bac35d61a6b89ed638c4bf84b566bacfb8ec97794fe4a19295feafa0e8d65c915e35a7d4c75f5e1b8eb3a6ee6f04a67a5b3d2a12f52b44ea2c8e128f0272b9a150571a8c39f0c8a9f927c54fc3773ce99f6edebcbb0e54ce17d58f3ed936badc8eaf1f931d673e699f57ba639f3eb67ede45634ed2e03cf015b20bdfd567cdbe9ac95dea6d352777fdaa74fca9cd6a948560f98824aedb86967d062b42c58fcf7aa7c55be2a593bd6b27e441ba3b5d1da686db4ac1f31c6c87a45960ffba2b5b6e2afdf75c4ae43dc6996d54385ab4650c4ac7d29abb48fa58482e789274f14f102f0277b228894f2b3fc2c3fcb5c7f6616a40b92e7aec31a1b7ee77cfb3ecb1c1a106412aad829c1cab572ad5eac979cf265395f525abfd62925ab47544939a59c3b5a0e1f15e221fd4a87447afdb4a298b45c353bb30dfbf8b1dd603b7bf321297595e093f6cdf0396da523ff692b9ca3b7d56ba563ada6759d56fa28dbb45bc0f6e14fb8d2e1a9525801b92556701d7f9ea48f1bab07e438db60bd583d6adc8a36a29892bf35f9b71171d9698c838f7767f960e51a51c57a450d077dbb1755b405cc63dc70ba20b3c882c7a72d3939131d29fda31c1b95bbc082bd17f36244daa344f79859cc9bf1a40c1d23ed62e544b887ed31c6db9e3ea54d49184688379a2d4a578cd37f90db6e628a7e2b08ddb79e970f4ee96f2f49b7ae6f389cbe387d1a08efb641be6ddbcd86b3b966cf9bb13d9d4f38fd497f62416f284e54697bdb3e6f758bbf09f17971de353c4d0fb8d6522c07f7df8bae372122ba1759b115c96d2be2f1c1ddc37ab17a6c3ebc4d681bda66f083d041d8810ab63e9ddfd53c75bddd1827a62276e11c7c13534a68f812de0883c7273c72b1caf342a2e73f1f213f43808c04c984866644454d8eac788205abc70bd692e9d90324aa62373e3a04f5f1a991a8d282843a1b8fcf8a6893379fa669f0d6f91e765b776fa40a9c08e29b3f991340b66ef58aa909730dfb62489b1612badb20b6da37e3711cf771dbdede7f5cdb3aa86bd29fc8e4bea8c4544beb08dd5f74ccde8c18f8e29cd09212c1e3c7cbc94ec7143f81eeffffff4f83a409708cd583b5c37ab15e2cd80830754529a59434cba3a21e995998724e2925a471d35fb92895f265c7c5f86a8f91cf911010ba0e4ae5cbcd7abd94314ad96d248cff5305474fa870ed98ab9c950be3d5cb891027334080131f2f2eb43051309aadcf5d5a08c67e2818cd76d15aa86933d780792c730d6b6d6b48ef7b511c6a1ff7dc7d035c9b35b40c6b15384e8c5c3b2fcf6107d13b82455105e3e330c2d8c987a61997cf71d05c9461129226219ea35d52abad2c74af375a0b8ff163bd89aa8ae3ca79ed4415acfaa83c5185821da7bdfcf82f1ad0c2b96720a6e4ef8829f9dca5df13f91253b2a5097a6846d4c47464b2c2f424aa50b57bf60508dcef51c5021d8c97f95e6fb6d89b11f3f5a6e244d5092fbfba6a0ebc312c7f827cf13286e54fe05ca69b7ac30261c078199997e96290897bffdd1ff33acd624a96585c2a8ff26171b1e4b0bc5876744fd73d16b88084d005dc30e6e13fec1ec27b9a45557fb3135154dd5393a802c04b1f4eae37c3c59bde241455312fdf341455fff24db3a8da2fdf441455dd4bdd837d6071b9e2cbc41863ccc7bd5ddcf47029c4e2b200b01206e6022db80d9afe69762a923260b49c5c585c9ec5247461601e5beec58eff32ccad355617f35bd1864f17f70231256f6701998d829ffa9987b15130054309d73e465b816bbf5331a5fd095bfbbdb5efb6f633fbca19ed531bc696d9f77616882969bae1f25dec2df662c8dcc9dfbbfeae3831253f66d79b98920f3b0c636399ad65935012bad79b16afe51a2d505d73140a651292324c320a3d0cccbbd8dd86bb789c6bb89873da5a63fe6568c3610ccc4798bfbb6f80c3a4bc8b8df2766fb9468af62fbb5398ab85cbee94470bcbc924a4555850b49010974fdafd44c4e5e7dd35b7d56edadbc9b74006e4cbb43921bec8e2e177b92f3d0df9492f821ee28b80fbd2dbfc241cf9495de41c803cfe8c9bdfa0391adb2fa6e8d77aeffd6ddbe2b6d2a134462438c9e14f56841737007fb229867849453f7921e10cf8bde8bb7337e28ce9b90e07e051f87e9aad3cea75fad3ec44742a3a3581280420be00709a4118320fe371c83c8c00bc8c0c0a2f5377f7767fe400204d3198b23253310931f99882986211c009c0a3f098f3a84f01999f790ac0f894087ac081c2a75e0401e850f2675ee6673ea2d0a16487aa9d04665ee671ccc83c8ecf4f8ab906a9eebeedd690ae7677189ee8b7e151e7afdbce988add8605a15b5ee6617c37c556662a6f8a998274fa86e527cbdfdc78c094f9a8bbef3006839cf031c60ddb3ea2caee1f51f5c2e5ffe7cdd03fffe7efef4ef879c383e31997791b9a08e3651e078c979179181d8ed4c378185d0c303ed5d9d0c4ffba3bad85f40dcfe641bdfc8b8cb52fb294f52d29461bbeb564b6b6bb115373e5bb1642bd5e8c793a3539ed7d228aa9f9bf4f331e3b54d18b311fc6461dc999f9321be61afc068df2a8a23723fe7cd491940143e663bec54d69092f351fe6df7cfcefa9e893989aef82c7e7e6c390d94f42ba84220ebe14f793fb92f631fd34eb92bbe83ae5c1fb6936795e76a73c50bb531ede5f5e5dbbec3e7d6861d97dfbe0f34f27959d12e3ba0eca73882f1588a9f9e223aa62ec248e987a79bda2aaf2c4a24afecb0eccc7cb8f979e17205155bb07dc889433c5f20b76fb93cf8bd1398ee354b60a3538fa051b5b9421f330beeb0b6373714666bf38c373d01dcf287c796dd89b51b74cfaf764e87f4f8629668ac5d75da9eb5777cd39536cebac29c6039f8f6bb76124d01dcff87c4b54d4041f4595ed6c3c6e057e125558703751858aff54a029c65d7ac3e40c8a05f9bd02a7199f9b87cfffe123d0ddf4f28a4555fd098aaa6d7353101f21a621516502321989aadacdfa0204e4f7d8c17ee90bacb13c762faf24e83efb8bbc11461927a93eb6f33d0827a9cef83768e6d0fea9365d7c11c566515e85fb9eda17cbffb9403ae86d425c7e4dc6db8c789bb1ce6d7a3c390de6a727bd5ccc36f25f9bf23854baed71a0fc93331bc65ddc9dba5a433a3eb775189e70f8a67f1942536c035c9736e9391a7b136f3342bccd08237ed8722fc7486349680825677913daf27ce69acae3cc1ab7b759297243780e3d74d73cc67f9be328d7d1cf67d05d739596dad9789c3eaec2013a673bb9b94aa774e167c4729d07544007053210011c16b800af41db8ed3a0e17dba1a41cf97f5b7b7a1b9b54349400ba1d9a8c42d75a639ea14910c000014a315000030140c89c322a1501405829aeb1d14800b839a4a6450988a034a90842888318c184214020000400c109999a9a1420008040026604c40cc00cc81980098033001300163026206600ec404c01c800900d39ad962ddcf6fa366e7cb9f4600de1cd0148c29802980790073105330e600a6604c014c01cc03985f103023f54977fbde90d80cb223a95a02654065804a804a80940195002f012a012a0754065c02bc0ca8047809502281c00c3c6128526296ef8925346130334013e026802680e614003447c7072ff1a53b4f0270a3890011961fb0e845485018f031abfad970e13309a609304d904f5829e059e8540efda3351ddd04dfb5efa40dc5252e2b60dede6f502acfa2a2b36da04494c87d6e7cfa9bc37ff32d1f63c4d10d9f167bd8d9ed59944a53fa58eefcf7c1d72bf9000ecd48e6ef3969a7ccfdcb89537d79f21a937fbbd66738dfaa07bf0a90d5a35e5b6f991268b56b5273e5937f43eb6d4025755674a066d11503bec58c1396c9f793fe73de6d107e047fb3769be0ecfb6149411304d602ab1ff36ee968cbd37cee25046b5562dc3482c025c4329abe901d211f03afa0a41aa796245a32a991aa269ac1d3c6d58c0361fa6602df8d6281ab6b863992e05e840ae5497996ea6e698c1b145c9d21a87171adcfffcfc9272dc537168a770303d7f1086d86a7a4719718db0caefc97a9f7244a632d575c07f94d1db9b415d9a6a9e2ac4ff472519ca9f4ea63eb157e20c6082e42d1354c5d4075cda21f246aa92204506568332de3ee640a0122aaeb690c52d97ba6cc5fe5e67be1df59b21e56018c03394022f3eb9ecd82280a40fcbcf456a615cef2c026f59038283348df8b70b47ad3a403bf85aedfa13a6b6f6ab9a08e59f7a9d1f100ce269e14db53dcf82cbe1ede51b0ea4da78616cae098c1f827a6e09d583c6454806f427c670ae8c0240b463cacf20bd4d059b78e10df3b6160676ef873e967ff0f57208778628e760cad931c5b6d45ba83129a9061137e8500c730a8b1dd51e1ccd8daf1e0a0cd2239e4ccd8b9512f0db63d96c6a93c5d257b52a075e85df3b56a734abdc0e43b29a367d1e29eb6819df8f3d48795031a0befe460afe8be1d05a089f4f6920931e41e3b9e75eaabb555badb85e1858387cf97f99c1bc2e48fad76b3f42674557980a738028ed571dcbb0d4b9df8975ea0eeb3410953027b940e391131fcf4b209c7813ac248aa628d6f6d9bac2c26881056e7a119ae7defee9a59976e78974d654c5424ba2889660abd289b24362feaa99f407da23711820e0514360877a28df52fd337d6707580d6196ffdf02273bd034bc369a2774bcb2b3b9c5f0187a525ba121b71bf4eaf2992e2ecda86a12eb33079837354a5eb56b6ad7432d8bdd83ced3756d301c5f59b052bd7b3afd23e35ef9266a2c380ac560cf20971638692379c19a4765e50fb570545a47594d9ff2919eaa7d4cf1d13a8ec1be05fe254a3fff9529f563d16e10f20a9f674f876563d732d47aba7f5a9313f1d690352552b8ed7d1f3b47be7c23c51abf3f2edc0e2f4c0a1ecbb8080276bc5f10523da4864c2f1867f80d88acfc63969f3f83caf8048864953dc1061206fc0e3419ed67914de79c6decd98719e2518c0eb5dc55c4957b975a39ed8d035137e965c2e856c1c0e03678a9ec7c95b898e33ba6365dc2379f76c98a9038af09d74cf82ad548f677e8d98946afb6a6b2e451c5a3ddb187ea5dfc9c21ee1c5d4313e135253f58a309eb08d9c71cd9ddb358d3f21180ef0f1001e1424576c7fb4e780c5b35740d7d143078ab79a143574a022de93b6cd9c56b0e3407621061df2a05fa1696cd91bf72849b4911cb982218cba0acb2d8db512daf567329f4b747395303a4de209dea14170214f9613c7c9942d23a4963d358c9b0f99ba347602a1d061d22773516f73e45a79cfb4455552240727422b8e9e19dc99e16d634b9157c85ce9e3c581cc72765671586c6cce0fee7f0eee7601a5dad43f12831b8dadc4ce301bbc540b5e67450850d9d749ef34e7a8c22fced215c41b38668156f16ccabfcf6a386a1d8c606fb458581775a1b1627d5a7c8912cef368b1c21acde68cac0a159ddd9076f12c2ff95155e7e4861e370521e984b7f90d0c0c48ae27129d8ebbb5acf315eb18cb2a63f56bddd2edfbe3f68a27afb53c57b04ead9806949f0403ad5266eccfc401ae95a8adc8839f8eccdfe54b58a5376e8d3457cdc4005e1d0fdca48d3a57eb719c90aab4e6397044309137299d4423649058484796ab0e3248eca1b8a61a06196e2d45dbf9760224e2a9fa7817342f9bf813a8585d78247a532eb237da8d0ab3e850373207069f409431ec3c64ec23b072d369e1c36728208e43e9ce9ecc43a212a49b1a6aa8a8e3684267b8ba0a8cc0af48c88f80a609121fc3fca8bcf84c81099ede1d563bd21feeaabda70f0347aacab59df5c9b9b93c7d4558d641d8d1c885c9331683327191f5160b0f3330889082d73927e4ee8b0b3feb04cc4b09f43cc51b6e1106eebfc16affe0d7936d1dad8b34883816eb49fea43e88f36aae6b11a9b4f5578c8f05b0b5b59334ecdd25fdf4cac2c09d52fb114b2440459a42f552498729a02007cfe48419f125102ea50eaa4d21833b39b1532f334dc7d635bf4d0b9323bd500b0a382de9702f911d3b6c16e7486a94be4097d2e6293f194fc442e68748f931137d7ecc39f5e5325e14b0d3cb023638a9e54d40a27cce419b82e9b7fd927630c0de85a4c600e853df12c53ad273911ee56526608557ca05e396a8d81dc8f2071ad71a47b4d48194667acf361e5c72bd3dcc97c98dbf95225f86e178ebfc6c6e4514cbd110bd95a9a7262fe256c625bef211b0f744ec6f7fe03192091cae7c386bc846b40512383d94790d3be59de0acd070d69b57b8e5d1676544878a5d390d93c4699fc1a47c94cecad56a4b3b7d9252ecd2497eaaa7696cf0bbd3bc39fe1f3a1460b01faf6922a18cb54951122495d75fc2e701c88d56dd4607bd5ebd79b66c382feaf990994898fdcaab91621062189dc7f84179abb33d7f7683886215bb3b68fb9460d4c2495345f7249189a3fee0386051111431d33a88647a3241b388a16dc35cc5733f3c4199cb6e490fe9c9119680e332400cfab9b733e8566d63622182deb3d8c4d0a0c58f188aaa843ae2012a9e2811a468169c4d2fe734baa4f90ce33489078a6269cb12ee4ccbaf9a32f0a8ac0899bc2383e70c0b1493b1d37f9a22cb5518ada9daf799dba0906b053cfe8925050e1fd9ac5a0140cc4cbfa2eb8ceb6cbf40001a603f8da0b172eb24aa5d7c6486134982350d1fd9f07949908c8807b01b60b4011a570d9bf09181daa5e279b717f021c8fba206ba3c361500eeb1ded9f57b3ea11169f76458f92f486613880f5a26fe84c04ba54841d02aca921408640ff000fc2548492a66ea6579ab06f91387aac7f2aebb135a4859477ac7fa30df5435de3a7dac71da5f5c2c443f1d682b8670ee0ea70b80f2c7663b3e5b748bbcc898e7715a9b1e3eb734da4d8500a35e0d2152dc6a7eaaa9d69742fae122dd4b7f9688d4a990dc2bc14827431a6b1856c876380a39a7d1c61f95fd1b61b75b86aa64db9cb058eb50ed1185e62265b414816043e17226721164510b4dbb30cbec7f9e2f625ee0e108f94a60c7de881caa2e508617918f1841e09adf7e452cd89406921c09f10e5861a2d3c1a9118f695276e370d1f6508e88bab5633266b5bab85215fb6a352f2702e0b1869bc732e05ec706cc702383a8e0501d58626bea93eb9e66486f66dce60c06bdaff2718e427f27aa1ce10c066a0fb5e30eeb24c51ee4f687fdf9264b77a211f3834d7facbeed0f238211ef8ad5ca68da6636e811f105d2df1a423d06256a99f3845d760ff4a6d326b79c6baeba489615039e1e42f0bcf18fd09e379e8f6d78b3880888a9377559b5b3e5d06c102dd1a72359b20927be899376e8330aefd93485ec0025384566744106ca088186b398c8e086cfecff9fb43e54e52b1423cdd9d434dd73b31523bb123c17780373d48ab2333697944a06de6cb3141927ba3c42feeb72ff1de2be7954f6504c9b67adb9ce773d7e6baad0be14ba6c6c9954660bc3bd16feca9d734c765ab2023ddb67fc6648f495116353ce0bfa5663ae708d831518a7ccfddf67549a1314bc0d39412b89226ae7fd632778b249d293d89c42dc61d0995db5e64af701a9f88854b4c7ff7d20e82c6988efc595d8dbe368bb510d34e00f62edd724a66572941486985edc010d6cfe9fa845c5de2372bac9b1520260b2b02059f4df5bde705b99a83fedef25b73935e9b3fc8f6fe55f6fad5a304b16717088c5c751e1c9ac801d21ef5fa5484423e1bf424e44945ee82bca24a22543e13e6a137b80fbea8cc187b9b78f8af305e6612682a8ca5add0290a786e0abc33881acec66435f3a5eb50c118f61da96ea3e40fef88ad6f3af7be8a491b228458c69850011f322ea1d4c21e2a71c1781f93369c645de493d97f933371f38886736af5b830ed8077447c3b471148bb241c1e689fa6bad3497475bc7764ab2848c73d9310084e3788d5ef37c565052550c7b3c87c73938b1600c1cefb84c6e46ad50cea6fe0cad6b6ccd0c2ab53e848c21ee311bb45e320ec5c6246332d54de9f6b6540c3bbeba894bab1ad1f7da68da3ab3c8c421fff8e1801e066c0333586aa07597c9549f98d1316e89d99e6b711da51c096912d86466982c5ffcf192d855638e7de790b346bbd1766eab3ee9bcef0b27bab4fc00bf358b048387d161c4065cd1d11777a582ce6414dc5de5feb1c758a0b4743df69a51f28924385c64047bffcedf9b063ee423d9e8a8fb389937400a97a54eb708b956d6e0bd33e283fd15c2d46c008f7c3fdb1e2f2e130389d47a7d3780460fccf2d30e0dafec74401cf0a9d192b812fade4ab4eb31e6b2c9b86f64c131b02a3c8006624baf7b34204e71295227acdb12a6ee876a3812de6ad6b1d5a4d10e40f4c71c71e6d8482f49d7e1b084e405c612fa1459bbc30f9ea1e406d6d0fdced59103b63b3f5f216d81a5d8932a4809afaf380236a599caeacc01b8eaf9e913db3709b67513795df0963672ac65cbdd9be18b9c92afc913ebdff58372f4f5d41418f731496cfdb0720756a811ac81eacfd38406afa0df633bfc58033092d0c8001578b798093bad91c9022c29698fc17a9c2a47d78d03260e2592b0026b418ca0e8ddee57b93ee55319b8447446b3c5413d16a89d80637e83d651af25df5c7287dd50dd45c05b088b59c929664dd40a11964cd3c511b9a851addc97463328cca31464124108c5988f9b70044a215e6462d8192da84f9d9d298a63a5c21b7313a8feea100c438afaea79e3f7e955c97f99877e44581dd5c73f38d6b58008f8b99eebf75e72e3d6ffab3373cf10a60a1fa01bfb95398a876b33cf3ca264f3e85b6ef4d2ea562f2e0028ffade636dc50b13953f54fb7a7349735fd987464d187d8803f1dd973ea8455c96dd629daccba5c7dc204069cbe227ed7834808b45de3075e7ca1d50840a23df32551a0ba1250455b7af6e90281748e9d21747606110e71a121a235c359d7270834aad631698202c797115b3adc61b126bf835a6292674069ab12a19d1eab01ef2603895bd302d6aab60767439a298e9bc61f32b1289d89a943e793beb47c4a25fc6889eca9526ca125668170269336817c4489c0d57f484c92a879d8e495b9aa99c290c3b6e5f51d79f251ade66a34e73911763e5a1b09aeaddae99f626fd802ae8f4bf280216a67fe8ae68e28d016121b61182396145a23b44ba0406357c68480660a4307f7a417bf4bbfcba025de863731a7ec01979dc5de4e22c012c3c15e58e8e060316d5db194bcc4f9c50dd254af1dd4e7a796da319725067b8f5c07305e3c468295f4476e9f4d9ca2db4d6c2611ae4b5da1391d6a4ed2dad96eb368d95d3246ffdf4fc82edcdca576fb6b461a7975fcf1983a5e7d1b642dfb4dc6ed6750e2a50f3d2295b6d3a80e9fc7617c2e5117d522b1dc2864485564588124653188909458b5efa884e877c28e6956a20efb773097383e74fa17cbfa09ffa46afc94f93fd224b393a7fa7da98a653c4f00dec7b7ad2f62376e6b1153d7beacaa25ee20eff3979555a33a337e20e2a0bdeed0508744fea85d52644a0caa104a90a1cb9c64b477abf7a495de037c78340105571f42cf420a06dcfd520abd7d3c4d66313805fb3542b7cbe5e635c43cccb47cc2c66a6f6bd92a45c2cf3ae03ef79b0c5472ae6e2ee62caec759de577a6d5b8234c3af46ffb93d433dbeefc413587cd09ac5bc810d29efdde83c030949ecaf4fd17f5a3c7899937734e1003255f6f56eea1f1ab8d645f868170fe05dd29f67e7e9f6795b3cfb1a678e95c1c12d92e74788454645a55714a7fe235c1c1d43e3014eff563a4560d14aef19a433f96a9bfb9c04e5135c0a4fb8611b1db98f47d263aedc3682cc34e9121170450b04ab755813303f7d1bb9d819f0306de80a6e40556f2e1f647ac39b58c0240ab11f470817b057cb55a544df396e6e1da39503f025ca043016b96063ba12379c1898a0fc4dd7648357b6577f592a594adf4658d6cd363199d2ba160ff456c75d12721905b98a504f2839721c5388b5245accfe534cf1f66b4a8295ae2fcf434ec79e013460a86cdfa7c68933c85cac36bdbf2f7fd9a81a39943034892b0098d603250961b21e294a4dbab0cc94314250765a6856fdb070ca28e938316b67e7cce63f4e1f24df2ae18f990eb534fcb1ca9d807eb061dac62a276389dad87b1116b1959adb00b8297b25b22b9268a0d534e2667bf9bffd1e861d4f46b68efbc325a3e3e3bad4ad713d86bf570c4e42fcd1aaa0c85e012150485150b4bd627c5b8ca746122f7413b779dc2d62cd73dadd6d7e28132f91fb9a4db2c93a53b06f18657f7fb921995badf567e147c9a73099c5373249252ef4277e66edf43ffeb5a0d58fd7543d84eff636e5c829ef423c2b3527a35230a286812a92124567e7c2a9df870e0fbae11e7ef2fdc174eb9db8963131aceaa7dae357e4d68c4171a307f185faed9bb02f6ee8fdfca5c7d87726428e89c9473e32f301d7f2c9ef39bfcac7c7d227069c1bd063e9fec6c26ede5ae56917e7626cb39d5210c5ea719510df3cb4b576dca3e4595bf19f25de889dd400a42d9592d16ee6a521c21b7f8bca5a5cf71de6eab7ae4d635254f22961c3ad99cdeec956a2af1a305e8883f2ff63ced7b9fb43088f859e17f83129269575a4c41a2e21168233f0b5501c23c4b0384c1c5e472f5cb77ce62bf7f9cac6fda53c390be5825c82647e496c341b0c06a020495c0c5cad61563fa699c761362e7e4e131c8a5e49f9f76128f342f6076f73a5ebeb5cf4a3b5c198ad4dc21ee764d282c3491c4fdc60c5664a8810b85ff79ac8c2350ffc9a17d59369a3875664386ff38c27f98cc11fa28e16cc75c71b23fac0f8b4040b229e16672926d04f8fae079c8b0280110ac1f1b7cd6f8184741b1927a93438c4586515abbfa1dcea14757ff2b7b61115f62a2502ceef8331fb8e91d6f207c5633bf83c9a74d0b2711293f2bc8dbc72a6fa547a29ef69e4a62053219192528ce2607828f38270b2648ec1cbac345aad48cf1ba576b6d72f5cd955fbd3c19c218f6ff987c12d99753d97b31104ad4e1758ecf4ce6467b770e8f1e5183e3b0aefc77e35f08e0f14cbfb58453b3d94ba1bdb3b0213fec5222b3f08cfa662a1f5b987c75005d2d05866d3bef1407a880a004a8bba13e698366f32811aa8f2ef696fd4f28dbe06053fc42d446a9cf3c8bb3b5883e742f419e8f6b30760cc98a7e1841f1221a17d7d4dacf560760f6cc8b993ff611b4ee9586b46464af04fd17781688a57502f964e222e3529a637e1226c264f943e1cc699f0efdaaee8e4b16bfb39847fe242b464a40d1d65756cf8b9058b0fa1fc1a1f6f53339f1122e8fe3ecb384350732351a3a1a14d56b0ad2959cd7674c8358e60a75b51d520899a6da412a24cfb5c4a56921708485facae9231f0a5d8614252886d80982a926bf32238f3d51d4b9f003d623dd605ddf08f3f883526d7768e6597a5fceb14bf28c4831b1cb1d2d8c82c327fed9d0b6514e4227cf95b2bf31a3c69c7af7208a522ed16b343bf1767482c52b57b84d96583d5816d69f7ad63932880561df413f357b37f687a32278362b38ff9d4b9d676c873404ad7a967c98805495b7809a73f177fa585c968b4344b6992ea8f8439e7cd3e226bf78a59ba179bae58c952584a674838cab3544efa6cd52a102e68f41e66b6a7f965c5912e546488888a0767220b114993401db38878f3944ba4b8275696f5e10377c54931601b21016bf5cf8b07321dea3c97d78636a7bfc6f378122fa015849092b68bcb655940dfe87a508fb65216210849181911ceb28c6824ebf70c1e0131a2fb85a4bfcff2d7e77bf95ec441922814874de36e717980c3a6047e382e174450a4327878a934a4bd7974bd1128dcb71aa7ec11e0986495c660b535b877e3125612191c0ac1629fbfc79d033197bd40e136764b792b1b02fd871a13f561b40455236e65c8184a46fb44486df70dd1bdf91ec2f39f5c29baf000bc49fdb51a53f0d39f915ff25d4aa953782ff129bbe081020c5e612e5264206ab2044e23fbf6df546318da6d7f3e010a5e814a4c74bdbec8ec6b2a70aa68dad5cbd205aff91c7cabf43536305a1bd68491ebfba7564cbba07582fb5b0976779a244cb38747f56f482a982c8589306554e69222e862d084ad62d3ac1252bb9b893a48d87965044735f2397fdcfa3d655c6889abcb65a8b5ab18c4895b6da5e9b7bee8aec36c606a6641621bf3ae91063296ff4e6dc2b1dddeafcb84c7f913ba1aa15e30120c8f5e0ad83e7bff98975e4f08f0942902f41de5e10040d5a3bef8e9c5c0cf7f7f62522e2a537829471698417519d6829e8908b2cab837c982677adc9248ae5c9833f0dd6d6f6664888b3f6777a379f9c15ce964acc0c05bb7f331c18477991a5303c9ce0ed6b006a1d185df1fefa78075713ac7bd6b2c60cc613cb789f612f206a684c7365b5cacc7d3b16a775a53fc7098e6cd8a889f66e89e1112fbebcabfd4b8e0e66f4786be126f41aa5d978f03a7706306819682408c90dfc421d6f55ea7fb7554d81ec3882fa8a0a0660f51ec391f47247dd3b84cce819ba27833fbc637c93bd4cd3e567e8cac0d22c10f4ff1151b173460c61bbad0bb9f5ae3d847302200c047b6eb4d39bf3629a0f4aecb2d173fe3a6f11d2b3dd45a715bc84a435d92d5cc0b34df9699274dda1f0f50469247595b3ab069d0be3245d64bb22faa30c90a50081565aed5f32867534b456c758269114d39528bbbf6a31ca9d5e1fc79f913ff081d2a2bcdbc55b1ac573f6216ae8359f9f2a625ed35d1af24fe8536346190153b4671025a4595629b2060b77714df023a43fd28db88f4727356baa0b4ca301ad1cb1166a509628dd4b01182b3223d059e15abd1836810a8c079f0822932a234b1e40947cbe0bce8520d91a7445b64a57e4a635e7682b5818a786728c88be3cb1f5c368d3ba8f131aa400c28ddf1f4fe2f2d1766484be953c0258aff46e0320ae351f417c19729f8035a84085c42e11fe82320f0128ae352fc03c12e08b8e4fe45742fe6fc08cf121406542fa3437818319e5eb51f529225acdcb5a7071c37377378689bcd01f938a1192bb8c6d9dbbeceb1c752f7a5ba7ae9a0ecaa0a912185ce4130a90ecbe26e660ba7b0b67c8227ce5c886b76fc862172c691384a085728a225dbd107b7f80fc5af913afce3b1f41634b90729ee7c946d7101df3dc26ad987b1b574429b91f0028e94e4eb41d294a9d241216ffe806e5c604ac95832862f00fed8fc1d232cb382f44228b1e2a8a265095c223d628d8914d5b4a71b6564036bc71bff852686c61a995f28922502fae7a93466358f3bdbb9f54b37971a804c43840b12bef1304bbf9c853d4bb99503b4db5a4db8d4adde56858ba545c4930549d07ef296a47213378d01f4822cb1e18a20cb2efce544903f77ea6aa71613b4062f1b15cb8bf85552e33f109e840fa82454962af42add5fcfb7bc76e98b6b41ece4f8931fbd859e6f11b7685a3f684e82b4896e42517e0d0f340947d7f7553740378e79f6f5942364135f2c40f0d0a8cc0e160593130092bd16e30111ba418d00f31668855b0d9f7f4be84f20c61f4edb0d8c35255c5a0010b30400ba27e96bd0eb4848109eff46a6b89cbf3e7ed21b602711fbd936407f037617f0997426b94648ee684369257f10a2469990804cab66934ae28903900bdea986a34a92e3acf1ec08b4482f0ca51549fa8d19f7bfd0b870947a692fe6488f2001fb3be37f27efbb2bacb8397b0110954b1665b57f7dc4444895bd008baa0536ee5f4ac00e72b56eefa90188be86fea7294a4ba6b09769faff69e00188ffbd6c8d4d5c5d716422fbb7114fffc865426ee49522252f00931afcf1be8ffcfe8f65a864b34b5b07ed51545a26aa8693fc88a9c6aa368230e23f159a85df6332274b88ee07ef76e5481a8586597ec1d1d97f2ba9aecefb119dd0a6eae87e579d5c3426159757e753889eb2d17ea334e8742da8cbd9548b7d0b12829bd1292c25f022de31f5f5cb9c2dec96897ddd6bc4b90e39d33b43aac5b8e366553548e1b4ef1fb020970a6840771530f3a6ca5ce304ad2c272fa86cc3d8f5df2ad70c8fecd6c7e4c2199010f1f70ec204f889cafda721f05a17196c7135a2479002759bb841d62a9e77ad390825dadf97b204ae725bb556334942629279f9fbb4afd170208754bc5babc1096716c95aba3429f6a2364357066b95d58a9311eed15bfff5ad77f60d39a821c2a85ff1932a1428edef0117bfd3aa824a8ba697da58cd35ee6884818b661ea91819118c7f77dc84da57540c1fdb5857ac3a34a2f42c8e5a5e72a76939854e90c18655f170a705681bf46d9e423f1b4032676838f5a1a141059253235983b4a779dff2522e787b4c86ee9f131f09de0a48d13af15364f7bb36ba3b4204fab080a038a8249d928c50c20221a4a59e03b5e9187e141111740c29d6981c06bd07020d0c779eaad808c6807bccf2d69049a056b723124cc624e9ad95ebc1a8510d36faedcb0c591bb50a4ddd407a4bd92dabc10124437cc7453b5fe2e4f4b4658c71c122b3c4242d9044b25488a77a711b6922b533e05e3814a76d7322bbe39e909e82a0060627880ee97fcc2001460bd82a905bfed606086c2068f1da79126e5079d0979f256c8e371192cbaa89618b85a1dbb264cda258e2daf2607c0a1675397585b9c04134b0eb1b5b2ec325332a112863e904a8db6080c13755624984885392fc9485b081d5b110607351d43be063175ec05818028c18fa32a788beba3dcbcfa765375952e85f7d03a77c127a7189f7fcba66302591cc09e2615ada7904bccc74838427f0452bc11b1319fe5418885c6a9ecb3efc9db4acb2479a680d77bf53ab6be6d4ad48aa916e7b8e47ddd0d21e552c375697a17199638e6842146532d4a561352b4d239380fc5ba8dc86ae603ae4085520ab461d7a14b5b941b1c568b80036a9d7548a824d0f3ca40f81a28c8a3f87e927202485b047c1e2c65a76a53fdd0cf7155e08d5c07cba4f7b18c1924ce1903b4e80ffd4b75f30ec2bb16099bdd095cd0084dec6a918120e4dea26e45348061ef76b2def870e710f35ac3610abd73ddfc5a6b288f95c62e8c1be6d0ac1a90a6731a77c221f675d381bd1265c3856a6637a45b1052f89e350f0f4a57188b94aca4c2a39b40e2bd8014ac338cc1e00ebdab05e7b968db62f85ed2fbc33b7543b92cf944e7acac6781bae49fd19e7ac0315770715481735c7b0ab2a8cfa2d5a7c110988ee3a68e4b0019fda316462b367e315008a9a6592b883dfd0d1910ba64e610b44ff27c80e390466a07d2de6abbc18771b5a7cc7840183368eea050f819c661c46358f151914e8843549f7cbcb32b61970b509868ca9b69c9126313b52603edfc66d28537a02d3949a544ba63636be49563eb55d059c9de0a88a45aece58c7b5eabd77db2a353f12ee615c4901c6a2bef0ab51bc70b6b35e8053bfead2024a0c7749a8163c89dcc3a538ade2371d674dda4469ce205d875f3d132923f253d02620915413b0320043e8680823c723ac89bd5c51f952697d1fa4592343450070de10685f1227a9482b649a1f4c5973112c19eda3cbb104422f78c9d902314fc7e43218f86f8f4cc594ce888e806f43e3416a676390aecdc801944b43fac853c00dc5f363fc03ae0c3f16a40bb8f249e9958732236b94eebbafc0171216799a7db432611fc1b988a2f63fbcdf6f16ea480a28624f47d1143428d8d9500403fe50025330b10271c619b6cc365d47ccdab97e051efac3c5a7d8962fd62c575240b477b49afe575b2b1f49654340fa442f5bcfac0b94aadd9915cc4d9a485795661707fe2a9287754ba59ef328363b84403e8e08d58bdf24551972a45fb774db83213563ff4990245d125bb62cf6ae42e78b6fcf2e92120ec4b7a7154e633e74758dae37020da7375949615c6bc15184f26aa3cfc4206a5940136421b23df386833c8fe2ed8108e304ab7bf4c91c69b88c9aff341f2dd16949b149c77f71e68290ee90849f4a6808c14eb9aefeea8582c942cef3b5cc7f450e5e03d3db01c5c6fe7a0a9d95a4cd4cda26b0c542f904b5c025aa210c5e14f3c05c3f49344b6168e774a768dcfbdf14865380ef6e00422cd48bc9eff701a2a4f32b8ab671492491924b30b9266abb15d2e5138194f8e8773d1229973467a6d1a3c44bf3ab3b3e72917b3b29cee93f0645f811e4a038040ae5322cad15061bb979d70d95ac69a1e2c3eb6671670dac875f1bc5e490980b44e40052d6358839e08a229efcf0a15d3ee36c0eb51469a3488e90f47c9d1b8c257082b9bde7df37af533e371f89b43a4a5034a16e64149af8ebd52682c54078648a5f2878fdce3310e18d3e205e893ab0e78a5409bd1d619e9bdb550a84075722613954ad4d0cc7eae4d4ea8042ea76edd0d8aa7a3ad1bee8f390c292a9b470c2372c827c08942160314fb18f2abfcfc931de14c9431de1ced81f8a9c15ae1c08520a381ec34a966bd0ce68ba273d130992725486b1ba64c109b70235de50af0e75ba1154d0b916b5c9dbdd5dae19cd56966b4d6aa0c2b24930619742c7a5d3d81b9606157df5968ae8ba2594619270317347764b87924955da98411346674726a8bbfd93deb65994343e260b8b50cbb062a4714422da50a34dd2da2106b8d059853fba26cba7c2a6ee23985cd14ec6683e16b7f37324e5f290c80564ea7d117db318f3551c90ae14e13412e6e3db02f82a5b8aded061bc1a93e7a2e6258b911852f35f69e9c7bee8de409946a11976b7b972a4c08d425c48fa522e1582113130600ab03b9d0039e4aeac71283b9145502ad59c06d6fe00c197fe6dcdd50e4fc803752cd12351a4bc6005adcf8db3d8b38e910c6dfc9eae24138331ceda2d44bfa81e53f905bed90b10fc37a72c097085686af13d146118991408d8d4735aead758340e97542c8183e39b7fb9f7d8def70f98622b61b28b0edc0a00c758d625c97ef3fb8bb6ad471d8b8ed6af045d00d5d6c4a891888412e984b47fbc35c4f95b05f8bd20d57257ebe0c2c81b15d0d81074116181eeb1e4b0297fb3df07978f2cfe77bac02fcad002d470725e4148ce3d99c71ae29e2c6b9c4df99510022142a275bec4451c3c701d9a77ef9dea4fc9fe80b084442279cee246b320aef439bad59fb0c1a56a1925059a9613dead9cebb079182328c687477e4fff81d31f395f67ac2d908cbee0c8865957d92b6fb99d6535ee8a08e62d870921cafe304f3397dd2e57afe19a9f66d1b63bf35845299bc12364e3a7cdf8345bc259a4f669b9b7e8034f3f5a6e70bc899ad803d35731c7f369cb8a1c2dd0680e510b3264b6c2d3d766b9ea2f2f6a3964b0dd1a60411f7f6812e735444eaea8d1c5abd46aa4fe52e339796c4020e85f91657ec5563c98b8315340242986e7748ca4f966409fde6dc4a01f2b2c74c95abc0f16e5796bb80e126162107e147c92c0058a886055b58f916ae90fa1a058944d5f4ec3c4f8baf0efa3bf5f1c093eb828368215918ad83a911222257f1bd5ee935bf643273d2d43272db2e3bf8c7e939a7603a67cee368f5f6e975b5ca71a40a4188daf2a9ca4dc203040b3d435245fe53159954e3723c519014ef15cd0bace0804c8c9c910faed3bc58b059a270e6f52873ebd3b6fbd4b791e28e13eaa19c4b46bbced34d56dc759834c54d647fac526c48b798a7c1e2003cd2480fdd2919caa62e852032c2baa6ef1e2c68c1b10365f37c41f500d3621af8ff61b1975c18ffe647b9d2e30247de90e285efc8331e73ae519de25b63fd40fb062dd7886ca5bbc47ffc6e4fbe5bc24ad04cee9e72fb8a0d5112e261b94cf3aee98f0ad9f0451d53b0b107367ab4b8068137a7958b30a6f8391f25e32edc8440ba6788e7206c623e4796fe04b64bd5dbbd2a59f3412517592b433034a8509e3c42248208fc63a75fddc3c3b3d58f1732d3732d790355889601501a069193f68c25e1c610a843e2116125a5f129178a89df4564dc7adc81c627ea290d5e6bf294058036123733db35d308fa16f7916e2f3d170a6c71377e49313dcc4813c9de988731be92f649f5bb35dd11e8f2e477525c4dbfb5c20d907c3b50cc790addbeb2f0948f9f60a356a22f7fe384045b869fc918cef88a8d57b8a97bb25122112809453265dac8c853f1f901dc98342c20246d4a576d95504c1f81da525cf25c5c6ef670390168579360cc75f92eb17028ab5374abcb65c3f96686f0649f5c0ef1c5d75ee01bdc8568cffdc77d77049ca85ec52cc1ad8c1ccb5aeeb12a7c2ec8a4d078cc6cc9ae1b395691b832bdcfb9f95d42d325de0873319412ae426deb8116013ce42919d95d4482b43489ec69f571a1c756c293c501b15057da69abebc42832b0b18ffd88956c83cb65bf8f60c630d789ff761312877ae9a1555c7f05741cef580fa1a17c24b73d702740b9230227d156cd813815c73a777cf790f5381054d45d58e68ecdeb3d9a12c74299602ac8e58c25c764c6989f74a838a84243d4da9a719977079bbb10d5c5b93b6448c1fe0b85f5e36476a060142c340f6b15115b469189e0084ac075436ca663b35b419723f63719cd4a87a119e0725faf78e61c1c518170a82d6ec4ec72db2aea146116a183fde20eab21f200f6188997e77e5c24b221fe0000be70f44790f70e94030268fcec5d91ecef4d1aa98914f7394df33d5336fa1f4ee7f68b2038e1a0b21980bd52a24f99a379ccc7ee8e42f2245b98789444405f0e8b9f1086966ce0e69b1565ff8a0ec990ad71e6417b02e8dc2f71eca999dfd830d9488dc08d8a39906337442e3ad01b6ff27f005c268d1b99e129420158ef27d6039e9897ca65cc9095e019f45e244e0ee3ce6e3b5a872be8be0a8c8599b5505486be967280acdaa66a85a904a06d71eab8dc5db9ef22f589004f871278b48bc6ca869e170d3c64c9c9246645c150dd2a2ee582a4b68b4c6f58c5cb0a13fedb49dcc7ea98bcda6fc993ad0f68458a561caa4f3e28b504123bf79d491c8ee240ee3707e4407d5403169a89419a8ac213848efba02b97be6ad501c73e2e1f505802935265bb5fec0511aaa4d0a09b5dc39ecf4ea3dcd5b452403771f66497bc6ebe41b42c2302e8b92a5fc14aa202f663f81b0ccd15493ca45877816d40f6bb709a988df0a1a1ef02b868920908946d1466aaa2454c4dbd064be9ca5a0da9a685232b5e67c7495c0316f696280609a3f0ef85ca1be3cef4bc837e7b0cb99376798f275eb2788f9f0378d5bf878c089400de60aba9b91801ff842ece22d2d5f02cecd883b68a08543aec4e7be1747817488a3d54b5842f9839239abc6593914f80f8a345be66acc65f34a01d40ad20148396eeea4fa1080745db7c52c43f4d2447cdaf8ad87849953de7f8e0b39d3cb7529ae22d81b0cb54254358a01d30f402d8b81e90bdfa27d1dfecfd475145c6071d13fa6110e47d5e0311e8a7a58cc228c01a2c6f47099e56b609bcc6eac542d95dd66d95fddf24c75e24a053b92ee4df897e1e528cabf10f3a273327b12eeb6d5d223430765f842861d4fc28839075961c632a913a27586cc1be7e36cc64677138caf9fcf185b43c600ca180633584e1c86a3e4d0b9873e2c672c098d4be68f5360271980956d334a4eb295a41ce3b94cef07ce9da4209e2caddc6270bdfcdd78018ab692be5d3d017415e66fc3e5ae0c046c25f1b3346052a484aae89f4e5b2be934f64061dea3364ae806840934cc342cf51da854d9c627c363b5b97be018c887cbe194a6a5236952a79c56e74feec6ccea157acae694cd3fcf288696a0b19e6867c07e61bf06dedba39bc867dacc15dd04ecb404548ed166aa347be6d0252cf2dbfb66ee0241f37fb5287e7f366b380d1c28b89c09755b682a89d80a5264d7878e7686febf3accfda31c75e05c97ef46b4317aee4e57181e77b799c966072091fdf5d476aeb1f2cf02a013a50a6eed347396843bb53fa27e06b418a9e3771e827679edb12026d6506793cbf5df5d80ff2bd9e7ce5ec0d3de1e0a7c8be1ccf9bf98f50a91b93ca32c99fa8b847893e48b04417d0d647b03077b06e93764fdedc397f1d021df4f9e8ac93f63075c1d388a5958798627034e025b441e35443903d133f2a8b28c6ebaf14454a6157d2caad4b9bda874326a6e74e8990f7a1c72ba937c812f40ce51b0bd45dd7050fc3fff5e4b91783c7f9c0a7bef7e397b644b00aca9145b6468e4051ec9c3c547dfa1bcb4422f0a5d4c465de61504e8f616b04742052cf2f56d7b01e9917ad3e34c32d80ebe7f1e50e7b13d7d2ce98edcf24f9a7be1cf083238fb00f4a4c37b3e5f17ad18464b7e6a843044f3ffb6128e7c0752c08204c51c1ef8f9d5d2ee10b33b0703f25656fbafd1b5200f14a51bb68003028e4961ec2a8ec336baf68f5eceae67aaeaa2348aab71002700394fb851348ea1bfe91b6dfa2131f28fae5e9705ef72fcba37773f21811e6ccd8be4f9f8e270dd21f7bb2bdda55bceae2bdd9a43c8e71afc17ddc93757ba35208941c941822eee179609e8756f8623e572cfe85eff33ccde329748e9923220b5ecb788ded083911666d2e98b1f388cbbf3923ea97a5c024a7114896cfe5566897aff674e8468871e2e2afd08befc7b4a35b3e2b6c9a76068219aa99fad9107cee479aaec76414b3f913d3abeaaed70822e3adb65a8ab989bd0223c99126ab62e0f3ed79d79424fe94adfefce35996123547648860a89382d197b5e71518703aa4054d47612d5b29a26fc4348c37cc46d692015d223749c77e8214d7feb2225924ee9ecd08dfb6f6958d22b7b0978190ad10db05a5729e40fcce2db750b8d9e1ee7e4e8087b4be4bd9f3bb27ff86fdc3b761e330cfff8f294a871c37cd12d54414cefe5064066a0763e1550a482abdb38555b37ffba85d27f0040da4271631523e739adbc5be88c571e5f612d030ccde4fcdace948d3cb5a8e64876e0fd0b459eb3f982c1277dc1fc3d0d4d959675bd8be0516b9fa10f7c803d527bb1843086001d8827f81970230c907ef756dbd5c399241560bbd9b4b3e03673eb5fa4d961b4f2447c8b02e9a433ef7c825b5df3b25b66185b2bc77e6301fefc541fd74d05585deecf9fdc8315a2a544827ccf4b33a5adae099d44a8f41f86b42c766a88e157ca6d98c6c06971d359e654ea3052673bc60c8a2eddd7c2ca3822494a83347a0a2134fc31515551d74cea3e9d119d5a8244f44062e8a0ebd84841ad356374c60ea8953364776f27b2056d6ff1c18fd183f4fde04f713d48235e82c317e12320b654ca8c475fc2866f6800ee30fa657bfbf63092d689ffcdf3572316fd306a086e21814b48b879c0b9f8cbbf74ce0a705a07d62ddbb5da87c50495141de87bdb739a5f5db341ed026bb9a81c4cff2638224aa9d48b462c4cdb5798fef00c8f235a618ad4a36c665daca437f67ab5be47460824fcd0e23528ddb77f74df099691a1cb5d3e2e090efa4675c07543bf1c421ff063334308812d041d545e83b1f88a93a0163382f1aa27760bf0f06ac277d44b37b624e95717cb3e4074b477ea037cb853b6ec960dfb355bd449a05665c5724429795d70bed49e64cbd75a357d51da67e10ece86118a3ecb670fd4e646e6098da99e4a7847f246b1540c48379ac25b448737b986fc2b180f2e133d3be8c790263b84886875b00fa0492c711573750a3e67398537ab7dba9b770df07652f7cbaf3f56308cfa6b0317bc7551d85ff286fd2b7096dcdc0e03e10de17f5d1d85216c568b1710e34a29db4109b7210482ddec0b760960c467715d171e0fa9791e4ab8756885e2c309d967540d47807e089404df7402dd23afc1b4e6733bed9c7a73dc68f6bd9e9d13a589466d968a8af7d4a33c992486ff11d87c347e0346678a7f1a567d85e928d29a292068ce253e374802759c86546629ac55947b4f1e992c9afcaa551ca39d21284286de63b67ad8d7c5413fe1d226afa20a84126b7165a30f8fe88ba02842986fd0f2cca11d1453e0991e10323a0341b5caba6d958543dce09b91d3c1622b7940be90ad2e6e910ebe57ac7515f47ed5ad3539e3b5c580a9e66c538a7e81dc90d71a3c8ab3fe8f9b4d7ca038237b99522b03d12a6221b43537d38858b28ee14378cb7ae767dc97eaae1c32d4f9ee5fb811704a60e2e78a53e2761bb4910d1807d812463da90a87a273c2f27f70131648c605dd1c029d045cd3d061972d1a8060c389402c511bee1617a89941552b12693c8205bd0a0d3bc0fb3d650fc15730bcc25f563d162fb729483dee5198030ad1f5f66015c96b381414944ee0e678304840d36e75c89efdd9c09c4431011f640cc02cac61c457810312c3275891c88366259b0f9e63d2cca2314f30600d8d676f01a311a9070cfe334099e6ab4b11654931652e79c759d5eb5e0d97a26724884e591f74f865dc0f4984bac4190636144391ab161b283a7e05c6d1b7d37354b17d2b58112c978d416172c00286536602c8e021d4fb2eaf0156f0b489532d0456fa2a60d9ef0c27463733fbb612add0b3f1c7028d4666e26485b32b968534bc4f75513b1082cbcb53c38de5cbf0ed2d677d4d27d3628e5a9155261463a34cc96c26020548c3d1c8f1689a09704e56a93b90c33d2ff5c23076f455c12b0600cebdb3782c4ebd188cc6c25208307a60f9a5f066b402c4cd478590be85fec0c65d4beccff8bfb589bd447c8a01831ebbf3e0fed6c977b5c031edfa17c72512c6f319c0a2314b51c00588617ae043269198bf440b21b687558329eb4b27589b5d93f887aa0cc14d0251fac40ae8e55a68c0c0a61cc7232b0d46a47cf19a4764508f21306946241c5b15fa516140246840e5c6732144c28e59c7288560be925ea0e70e5488630006ed4738571b3104ea6005678dffdfeff1638eaedb0293e578c111e9d6cb07daa61047e2757351e12e83cc8744f697b2cb1bc3180c8d8cf40c7b30720f4e700b3ed404251d26cc43d18ef8eefeca22649dd01b60ae1d5ee2147568ba1a75594d0c00a42e729f0c9a3956c7d9c4541d91eba5e53c7c8e1413f59f350c4511c18321b1235f57f7ccced036f2cb8d8ffecb3688add92348c4492a1e71f8b0734457dc09e016fafc74310038079ad9edda607f0a3b7271e069633ee99960c310b4c855b23baa8ca204b5b27ff626586aa5a5404886407d31dfb3ea33a2f6ac3a36680f7a356b606b38fd01e0990c1b083abc65004bfc74718e86af92ee8a7a7a3711885d4094072e3526c352a32c14d4197f385e4e5f10e3f0d59ec6d176dc548d1b100e92f852c461fe529d4f73426c1f6bec768f3e68a64beb99412daf207df3e8b01c5bfe911b3af07079da5ca82b0298a27b9b28b07940b5e3dcbc25039d86428ac0c0f03987bc497ee5927793007de0b470ac0a37aa315f346d4dd1cfc4933804bd84d14df20f5cc71cda368a3847a151306b6917a81ac4e3f805e1d8e6c2d4406944e3e1cb40ca60bdb6792269db556821ce868ea99225b47ea8dc31ca3a561deecddf847ab52dce2cdc443e954b462ed7c653f13dc7802d9a54934570bf0aa3e2cb3f1e5c217b5a6c4a5c12d426150e62869e3664c4e4a0c443d86f5576bf61ce3a4b54fa3b48d51a6481214284a22b8485a7f14a9a195471061d446685991771af2a7fc250641ffb649cf056c0c2f6bec2f88847ad7a5db01264f7f5a54542fcaff9f4af66e6af9098754185baadf59dca0e892296c4a321246a94c70a4f3b029350a027dc44530ccbe7d043f8401a2f3f28fe0297a097db53ee8906a76c569113f81d151dac61fb678d2779592b8ea5aa04c85a9a40b747ca104d2220c185290a245efb1fd31eb9e3730896233434d4e6b1e82702086bc27ba764060c7d33c55060e6b666c722ad71bcd31de49d6836cf8bbca348b37cd2e10d226c79d5b46b3ab7fab3b7a4555efc1a1384aa099eda5d2e18ad7b33d9dd0d953ee8aa066f6f89e5df337e5ce8a21fb2aa67e5dbcc6e01c28b6f901ebadbc55583b34e9742ea1d0cb7c87510f210e1bd3825a24ca22b47fbf7dc706388df5b7868fcc942ec48f8cf55ecd6893422924c1903df21811bdaaebb77728d59aea9d7aaa48c89734c3dc3e31aa4315672c65a4b34c0f50c8d5f96420731b445479736992162a6f062bfceb9db6ab758062423c6f260c066dfd626cb111f0c968a2cfb0a90958dd0010ad13a5dcc8b02144bd18897ff794dc735601ddb11a2372c5ce1b5ac7f67353e0f9fd90ff7c2dfe539a68b9fa6dd6dcfd18a76ed5783996cf27686a9d43f61282b21ee0a1ede9cd85f00ae2e62bebeb4387ad0874caada7b99c2b823863499e16e920b05ea9c439b46933a551ba82252a6aec184162dc69a08ddc9d52d8d5eca0025bab8dd8975fa4a9c9d4a14df7419347c5bc6fdc470a055c618a344f6f2e8dbbc7283ff6a89915b5033992d95aea92c64881a30a5649567abeb6d4b13452d2b2d99f3ec768c4d713e8f072ee4d256cc335f5aba781f3209c400e86a0aa991c71e6c4c834989f302259ec93425022d5333db48752b7f645ad83d82d1206c69294d199ffbed406b695fd09534e03f4ae332db21ec4c32917affbb992af1a726a2254ada9b0b28d3668f77213d4c5f94860948dd61c37929f6948fd8c50e1e03445015198d85947b422a6cd18ec5d28aa2776c1997f09263321550c1247955314e2aa2c2f4c8539df1a302aa4c259f6ac64f052a994ebe6a8c4b25543129b9fd7d828049876c1ca02083b790599c2ac984fcabb98eaafe3a1b24429741dbcbbd805b5eab0ba0f3154b809ebddc0ab8e5b5aa00fa5eb104e8d1cbbd805b5e0b18d7620c3c727bc08daf1506e8462d19853af153259b1fdccea4831026e4bc7b492d2ee276492e6c4bd6285108ecd1dc248009c6a536c4e666c6ef9f1bc1c1b96105736cd348d252b759d77165437c617f83731a8b91d93c8d11d2e972b75ca78cbb8e0f5ae38ab8f00bede927dc9d9dd5ec41cf365d46f19039ed82772c306ebf0b13286d94ffd1741c76c8fffa25d6a9b13ef3007a63b88ffe6db33ea41f11747290b06ef1f26c0ca6e671f4eb13d0b6069a80da6a20f81ce55c29dd5748df388a109d7123c8405cd83a32088f8a03a7466a85c23eb8a02aeb00aaaf0028d424aa95134ee6dbb88ccb41280b94244d01bad1534a0c155a3eb5d5387d40c4d1884ab7058a88703314233c8636f905530bc512c205293fe10ac229c974654b37e5f737a972c0e1669993792e98c21771ca68c10f15f6f5a907216c42a1d1c3e0065719ba1cb777761c4496c8078853835e4006663d9e9f3a41675e918a7d300af214040913785ffdf63826eda62fc5c34f54ee2dd49295b35f30c55c32ef2378a63b839524bcf1197ddbc3129f9d5baf9505d0f78a2540ef5e75e34ea953b80d2513a07d8d934cc41c5545c21c94fa1d7ef1048fdbc5ce67cc3316894a4c30a2132a0913af25aa930986b41b174f868496fde3ad6c053a411fb0dfbe3a37b7efe0da41a8d8c223edce1496e7466a82af120baf4d533e30f2f52dce2d405c01ecc3250b1fb5a62d2a77c92713bbbc86043baab4e5b7d96c231f4e80284b83d9623778df946e3618cee7576f6b556e641d66e385eaae70a5b19277ec845226db0dadb560bafae16505c95ba93771642740553c0d0dd4bb3fbfad73f1b7bab74534ff86e5d0e05ea18945a58b3f5bf6d44f69f4db7c8889ada95e66e2c56ff51e03eca0dd793738bc89198eb5f9354eab190b53f489700e65e6b045a70d72249207fc92b1324db1797a6b242dffcd30f4df7b2ddb14b810a42c1875655d6625cce97d54b17ce43ebe825e3a92e43c6939418b01ddc5172c39ac0a02a69d3d72b643d141d566b95c470693780be0230d2dde8f8c1cfd4a28b739f2e88f032f719b178c80765ee23bd73a011ab0559e17397388b7213a9335e9f667a671297ff19a86b636035df7e022faf934d5b55a96e98a5b0337f1212a692472cde1ce1f8a444a0652e43c1d1f6795889c7058f6bad0719365cba847b9c0eee1679c930643f44603ab179966d22b7d71ee38d4f31df642e2904d0484339ddd704bf363d08d39f0f2ab5086a232986d8e0acec8fe2a58eafcee861c6a3f1d8f033979a75d3be3f93657a3caee627718c80050109e3430aeb6aece869b78418241ea42dc7d979c9d29505ed2c0b8484f630327b9fbb27dfb0560ba2456745f30668fc5df90018020ac523528f67e9cb0936673e54b50bbb5232909024c71d687253296e5d9ccbb20b7548a4b08a8041ed1e8b1ed15c1402960215eb062b2bdbce0dbc780be85c7340560adbde448d14859983dccdc4a3fa57400550d917ce26f3273a1983d05e972be7385514193fd7d681aea39bd9fcfd97f13762fe847c41e2f1b0a458545981812fd1a08a8471bc2076325ab15adc5607151a10a49a79dfbc589aead50ab5c8b36bb1004a8f35a72d343c1675a036ddff8cf37b34f51d800bb38ff55dcd8e2fc4533d85b05a0a51f25aa3572bd84da2a4f075eda043a2761d96485101577470129d66e4e3c1df916daa81a6d82ff9502445da7ef39a5c9f0ad61bd13a914855b913a6352cb8ae21f405e98857f207518d7a6c2bd4953f1908a9f47ba96102dc7996c3445753dd1ae90a4218ec36755632949771534bf3b5ca14ae64b30d5ae6f0a257f0bd595e734b8cfcbe8965e3d06c46f809472d14aa38ac2a79a2d75f30df1e6e808986f1b8df7834df969631e8e5925a363bb6f8fb61d19a7878748b4c724a018a73747b7cd09d3600d9551c1ec4e3b2602bf6932394114cd5cdaf7034fe5473c017e7603d5ff443968a00e001a4dfb706cf24093e299030eb4621a164946074ebaea15995da9d4336e92b42a2db1d82d12224a027eaa0a8c53efd753e2c78aea5bdad3bef03d555f1bd62fa25f4104510c94cf4ea5e197c6f2ba92846e0b8948df35f61ae86562c282bb76d195438e721fd44dc3f36ad7fa45089c23a71215b46b5f78019cfd3412b53546585abcd027e859365811979fc4be7bd911e321cc3d13ee4244f91bc154b05395d0caf2b41813fb5eacde9ff53bb2f84e96df3956982bff4b389f0f2b70162f7ef7eeeb63fd1eacdf87e577b0fe0e96c97b775a02738c8d6bb3a2f7959a7996af19260ed1ca3916e0338cfc8a393f4a9a251fd6cf5f2fc1f2a1bf8c0fa9d3daf9d1604edfa6c3d7527bb07fe2308e817103fa7ff2b439e2299d54fbf497b74565add06c6d7d0216b9c403257497b6820f7b317f2893c726521281309c151ff3b0645e36aa42091462212c18961280f59e58ab7749652dabd773e44b24dd6a6055c55714d8af53078e859c94ad6778f5aae222d8d01b97a2b777a9ff8ae165aac8066fb25f971a7029d6b276d6f6e8b1446559b7eed82da1ffc448a8bdf19281d6d63de2a7f888839402baa7961ebaa64953ab283dea5f6dd3b0f89029ec5a77e6ea9f55b1937075d0045b1729d5460606cd709a683e1fc1b80a64ecb07920202e8dee9370d1140e55cc1530d4392f0b2bb180e43a9d34b0e69c3aa08f1ccf05c7f192d849b84631ab1597bcee8120f8eaea248513d333023771096f2749e99d7f5ed1dbf7bc45a89a85c422b029578cc5e2e029c246aa2cb00fc3a7910f067c4b2168aad6be95fb725a0db2dd47127cef30e1e1c52bdd922078f516cfc24b12bc14bc062316717285588047d382f04479c5e23452aaa119240928b49bac19e202907170ee9c7cb1905e33a84cc27945dfb8090fda8b3876d52127ec396f783ec6f1472f7bf82efb7e5467b30ecb516d7ce1946eda4559888572cf2fcc4b6f229f8c61076ac60a455d13023b834b34935d56e38350ca9850c57fd578b5a4ced6e229a72a705dbb4cce5a650dcdb207a5bd18a0e6624e0b20de6f7a597d49dd40c7a421a9f151bd52b0f5fd6b52057f60df4c9ca6962a0a1b227b58909cc61083dd4d955778d1a7586a8192d3f192446789b820d2843cad5ba1c959e54a57fd58728c4fc0cc208c9a4dc8fca2f196bacf5eac0ddc1a273eead25b4716f351790dca9f837705ce57ead0c3a0920c31c8bbcf9592fd79d390ccfb166b6b10a3d6672b01fbcdf23189fa52e8a0c3275196c03e8d3e63eac28eb116824add7af3add894ca209c2245352a6ccfc4deb12fe398e95f88d17d7045689a4051cd131c8cc89df1e4081a08eec72f4879ad87c14fe55b546e992de2ff19b1183e14da5381304c5b0987aba0ddd605179dd2a607cae25bd90ab6120db43fb4e8d8e46162156d7bc6969ca4c90d85e09fd27baafd9554c46c421f1ae920f9cfc9f2a641487df717c219091f5ed1184a313ca461ca72c8794b8e83b1269b8488e7ce8ca28629fa95f03ed29ddfa6ddcf35f42a9035cca1ab676cf5f7720e41dda1101d58c3292a8f7cb33cf8a08b530d4d03ef14b2888654f48b9f4c3b272a152364077670f77078b89959d5abbfead3504be9bc9c54be28148105f834de6a9f69187862a4f2554d63543e44d3e7a723917790ea7e55b1ae8fc98b0acd272166a626f4fcad751742050029b3c4040c896a99c686e981b3be97f9faf08423ad1ebc74cc914d54d96551ff0dd35979825c4271a5f04919ab9bc7a448ace189d2db3f6ec6f70bb3bb1e8f97b4688d262daa2a21e6e8177cc1208716390c35ea28aba7427062ddc11899e92d62912c25ac43d89b3acedfe15742df27f6008d05cf26913a0e79fad755568171397c03059ce32cdcc8e7f98d5922e356132865b8cc55d686cd65631f62515bc277e224c3d2cfa392db83b498c1fa7b5ccce0af499db649f81f0ed34cd40c63e82d7155c3fee5c3756e9337e2a504c9bc730b6d04ad67e3a3a275209c241212b311475a832387143f370a64742e14156ee27c28ffcd322bd46c0d54c329badbce586109c2e827340dd9761a953aab5b40afdadf1577b0e1b2b50cc722df367ee08fc0f7696f8b34eb6c925b38e3d9d6bee52d1a14307d6761c0790c5ab4b8e0b67e9c920bbd157f358518bf386b4dfcf812aefc6c5085d43526d33b221c28a2eff85b1cf72d8843ffc3b2c460dcaafefb54f2bcd95206d9982ce99c4d4011b66c894cdeeeed591f10db689288093e51fae675e69e7873ada5e5396d1bd7e156fbaa622a4c604ff5c65745aa98609f6a8d57e55499c01e558d7b2a53cde4eb51d578aa4c05d3d853adb1c5b16cb52fcaecae07d6512c702549ab284c118c77451d043d795f144f0d3679df176d20f8fc9aee51f447cf25a36698158eefaa483ecbb8625cc9b4cc164f3d9a1eae6e41ec41c08585378cd364e64c1f419cb215714a8f464d64744d2a34e7fde0ea98dfe06e9f87effd5cdd3a9ec9f0e7c6fc774194e897b04b3f72d4a32c79a9db0580183c62add58f7d9f896edceeee2e3f5cb7d6affaecdb4ef0e3b502f59302180b71a35bfcdc682b7e1469addd5faaf12d7d7a1fe81a80206513fc3dad45f5b106bad4a7d8bd37c41b0b50a90c2ae8fc04b32990a4c5d32b1444a5256ac4590ad27c060b3789f14d0fd0963e05c302620d555c40514e9584cebb3f78b63c9e814dcae858fe1ac18f88a2d45168cf97b565e62794da6328e1efde6c89ed4bfb08ef39b40d03d8d4f371413542ecdd1f6f3c9ac8f988cf1bff8cf5135d2ebf89124beae5c691ec426bbd9edf9f0798df7d9359a02d068f90a1bd14ca16fc4346f51e2ca88b127e915f77f2dd5f2e5bcd4b70ae2db583ef7e2dd72261a86dd88ebdfb7864bb3582bf9bf6427dcfe158f6f3b561b69e9896a4549a353dff6c2b06c0df6a445d8ae7d8faf4af653c2df7f65c5f9a17d5181ed0b6d55b6a85b98cba18dd7a8464df4909c65cd2b1128c99855d1e10674d4709134fc521e08f2ea0c8c9073eeb9e6f1f54fbae948075fa4d6405082ea16d2ec103560bae773f640b53160218e2cbfebf02dc5b045fc4d24c291a5aa9c39b63ad86e0d4854108419f15cfc8aa00aa03e5a30915c205a21d182f0152b95670b5e00a5c049fd6b9eca769b0acdc4b7045583b72be3f8c25d60cf89e39f98777ef9ef9c6d802ca0498b96160460866140603653f17bff7e3ff2123704904ea0602d549137126be59bf6b608198ecbc493f1f31f32b13c4eb7ea5328e0c9019a01c6931ed99a3f0e8cf948885ff1c14d8bc0269ce74e8f13ac9a1dec06f0ce3a8d92f4b451c6ecc8e8987280f234418af63e657e1a9a52f6d39f1836e31739682579483285775ecbc0626ac3e49cd6cbede756ec920e0a9386fafceb5744d781dfbdaccae9cb87ef3bf8db00fab9dee72b2c8409ee91142d9465fb33e78d3cd857be7522941d7def8d1cf198edfa5b11620a01011615380454d99004031973054cf62741e26a3bf4d57227b35d6ed64f178118f0cc9707aa432b9d0375a5383b94627cc6b07effd227a9fe25ad97bd5dacf61c08ec0247c2007b237c472a2046016454b670b72fbd8eb0cd9e98c4b34c47987637386b706e86b57ce14b59d83885deca5c385517ed7572f216359633b8b63e595d9b7182efb8981ef10b092986c8e1da7cf9cfee7f154321b2e49501d2521e50ffce2eb211a62615a28e45101e5200542c8229de7c58b48564f512eb4151e97e986a29cf02a45dd65ea879ca9f19e3ca341321842db39c26cf0f570d42c060298070715e7a38aecfcf0cc9cafd4a1fa44ff3472230c24a6137a5ebe0ab63dc1ea2043604a3dd870d47b52c5891020091938257bc823ae25e9981d1e87e94081eae4e8478ef126f60500bab49738bd845ff315f39b5aa7f78f64882f2686838556a3ac7572d3fde760cf8c63cce725693f4c3144ee6028639b00e29c1e5710c5017f208628b536e07b22e3e185f6386eb2c38dee6b155dbd6327f1274a4f5100ac448f5fa1969255b40270ae546c92ce2e7070c6b7f76d804f4b9fed61b4b15416641694b4ec714d300914a65280c94e7c1454db072de5cf7ab534b0447e3c35d1368005ca1574a499ff4c6f2a339fb8cba645ef66f71cff89534aea3f5f9516974618f74bba81f79469571bc00924f3140f1e49d1286ec6745c330d8d5ec0411a5f896ce41941d37939a81a720c58b6b5b856474cc5e896d573b90c98e53b471b46b17dc8ceded1616738cc886b721a21b3e97baedb9a01de5bbfb65903675c93221ab0ddb27ba2ed6847738c549976f69274b37bfed4f53d8df921b72b0015a5e2d3e2401cbcb0257e87715c26def70e3dfc8f482d115d074384651dc50d8f5c344e1c83e6c901f7118a4276e829e2e9b25d9855527bd117192616318d55afc0c3fb25a628ad0150c96d99a383045c999cc9827623f1c674abd0f806b0c7979c53a4df2c93b5e4137380999ca8098d354abf9c11f456d782de4f138a193fe274234b5291e5600434813de91b143d5af1050ece1650c3dd924847a2f281b49772a1ffecc4a348089c1d66b47653fb08534d7c0aa01a9a8b922c69194a2a72ef0492cac0ffcc8aca9c4e1b428f85cc315a27ef99b39aa0ae92185ea898c319d748e462ac71cd9132d47bb0e7e7271b0949a6b731cc5834228ec0e6d77c00c2741e0aa2958e096a732fcb6075a5c4d6724a77cff5bb1a95ea887ff4ddd050041d56ea418969038edc8e924a93b12a9f685cef66057fa88fd68d98b543bbbbe218b36d794e3f035131891df0501bb641fd59dc757fd5b6e225b692937e90a28a2699420e7db7268e075b744c7f65fe636dbf00dc173d448bda8d2f70f007329141615c094ac3dfb2e0b6fb9c82563627644bc667bdf3e5ff707afba5bc2c984a9c123e28a8308b39cbbbd31a0189d2fa5afb1ebcc4cd8de8f1270c03909db2f8eb004009c7e219fbbf6173584c175d48f49e47aabde34c764b99aea7191023c3dda97f219488ea8c634b47c85d0a799b7609275ffa3bb860f683579319e9cd9e40aad03a84ce125c385858ee86acd413eca3b0bc466ce3c81afd2e0d2c423d4a7e25984a3e285ceef8a9c3f374ba51f5b16a18d86c0627cd449993c07b5c4271e8f8629077485dfc0b9b29476ad3020daf621d2e58e99ff321bf3160dce1141be326f090e38fe377c0456166677ad58a63f276ea1ae2f61c51c41031b06cfb4f941616a1aee9c8622cf8b2d5507619a5e297411d1435069e4e468815561038ec6a3a3f9f2ee772a735f9240351126683f9dc21a227293e5a3b5c1c07a0f3693c2abaf81348dc52726c915d7ce946d2ee96c6072f178e6f0af70d473f285bdedd40d47e4b012d36fcb440847bdfbe9b8890bd5355177515c614af2aa488c2892d491c918022b418a0894e1021600108201575668d326a2c88110615229e01e183b515995003dbf20316233422d842892d43478276e4b0a989c138f811010848799289530a4c4a4943447e763298ddc0691da0071c6ec8604c110a3cb180256478e2c448108f1cad0e8021c349d1094134b017036c88a201460c20081d5c40c0010ee00313a7221382dc786ab062f0996995a1617c645a2bf84ce01ae371f185e003018d989b305f073e2d3e293e06b09ef8a85a535e08de07b10e5c1ce0f4f8767c3abc1c330d5c197c334fd6baf1d9b86a3e9a58ec83c15c5fcb6379decb6bdc87cc4713ee65adee6bb329e4493cda7b7a343eae7c3c694b653e80c87cf490f52043d6838cd3a80dd31daa43e993565f4bb5a5db521376b9e68a1b69b574ef6a3dace81101590f07c87a288046a3b76b1fa7a33bf40422aa7302d1141004a3e06eaf233aee5292f5f0719dc19b7fef6a0ac95b7b8bf5b927dbf1821d5b5cbbf593946e7ca97e4cd21d9d1ff389f58e28761ce1e4fd5da9de6185bc2fdb01b503092da90dd31f6da969c6b65cb7a67fbb35d3803445feccfb75596dee0e24086c8cbb7fe0ee1a23039a4f0b8efcd0229af3399270e488d0112347828e143942e4c8902340477e8ef81c3922242464442848a8881011a1214240423f423e42478c0819316224c8481123448c0c310264e4c7888f9123414241468282828a0411091a120414f413e41374a48850112345828a142942a4c8902240457e8af8143942448888112241448a10214264081120223f447c881c192234c4c890a02145861019326408d0909f213e438e00090119010a022a02440468081010d00f900fd0911fa11f233f413f457e88fc0cf901faf9f9f1f939e223e463c427c8a7880f119f213e403e3f3e3e3e351febee3f5ca62306cf9dd7ca270c1d44dccb6a2bc56dabc3697b6d961c60b8ef9e8aea6de9676cfb1aad94b52487143a833a3f59dab32664e76c4a2ecb51baffc5549fd8567d36e9e3be347378a4fbc4b86d757497f77d6ad61cd5fda5955e7bfb1ac59b923fc5851a9e1a1d1d18280c353c352e50ca435da09452ea5e82bb931024870e1d5a030c773a24d3e00a0d1c20d320014e876ae8d0b67d49690d6de36e3653ba6d5fd21e37ee9a3b01c80927b8fb8e4e100da4641a1071a7dad27dd628d5f6719b0e69f29eb8466d98ee1353ab274710c1bd6688ee4ac9a71aedada69928431960e165adee339701039c0e915fa33bb27e2e6b53c63927e970ced8c8f6e458ab47848c0415213204e8c74796810bee0e823b67cb20892c0324afa59d4f06bf5f5ad59c8fed5aa7ea54420fe8034ee144f4ced5a440109f20355a44a7f844b19d3529dc1d0497cd48d71924710e8b14dc3f313e147ce517f40d31810057b8cb0c13b86719c095e33042e29e0d5adc83c8dc5964dc9df44a4002af8bbfd889462fb6db64b2a3b3db66ee456d41db5903d28413483c1c9cbf0addd5e893b6ca92146fbacddcef5dbd9a27767e82281111fdd1a1449496b0002696500206190ed9a96dbe2d69e170c100a8b85178a1130112cb8c03f418011050a0e08712442c2ec20cd961002276e812126179e9e14684901690cef8c0c352001540be40c26a82043d21b074b84252d2429524b4a8810396d9840e1541cd84327672b09aac405600358a20e2c600372c130a203b22052cf8e167c76bb128980fc49021f1c40acf1aac970e4cf42006049010e1a38ccf0513a85ab22489239064607c60d428c00b2238220924a22f3e086c114107a2a4a0c00103e8e22bc009b43ca00b213ef0190af3cd90650316c87001489417587c362c681605f880142b0554f12db9b206193bc6c8094f20c5f713812ea8889262c1145940f16d704606089013900501529af0d65040012c406404477610e108cf04255042000586d022a28008cf0a01900085941808a1c50101f09af852240a035f0630e5841d3c206c88620310510a80010b58f17450487d51c48e043c742f7852c6a0b172010a18a86ad89e9111b9040c4100317429945e102ebc30481f260f2d203d1c209a2c0f123f5600458a8f51c5940ed230a2d20101a47c0b005811ebc107133f02770a7029c10bedf0c5892d486ec40b46237ec254a14610f72b08601264841d04c84922e239311e103a8209165ce1783cca871880b270a105524c77212f4264e18206603a1ce0eec10c281cb13213001a2bee2c27ac5c8081266a3767c89009a300d9992c8840b2c619077420023ba09ca0c7f3947166881da4c082063f5dc1028c33314891821809c4cc870bbe3833b271c303c600805f71a38b334c4b8410c2105603f1813067c02fa4c8aa20a104135e589cc931040a27c80018176468a28a36d2e00017119afccf0f04a468c38b1c6265cc5081430715146d5421012433081fb614408b26da50c28c12a21657360c0138a20d1f90f0820208e892822e3e10d1c6f6220d5d08e64e0c1408401b2c0cc0a9861d7e886284263bb4818206a438432352019f282b6d8870434d74952fa4a0c30b6dd43ce0014e6c59e2cc5597cd8618649cc04c1025b8000c4628d9109300266c5070442ece20d98862044d9421c050538015296c6809820a01594c40040d0c408a8d1a304002a4203e3ec0812896b04165e54b182f3c9001144c4062e3a9014237354828d2801e88d8282206919a2c3b4868220544d8f8a1c5062d382004154294c1c3868760d7b001116818b2228435548065002dc0424b599870b0c6062c200b4050931a4e8ce4588301341065b09b02812c9edcac31800560c1f40312aba8dc99d61a2eb480881c1d0861e8b08135d6a806a0d2840f4e20a1810794b186d2075490a2f3d384000000630d1e1ec07ce0041619d620fa628dd9144e7e1023a402c14d176a9c7146c78035a690a20b2661d4e88209b38d1d5610200357b8bbb781851a1550810f2d5827f848f202c7bb91e3ee29f11e004fdcbdaa10dc3d2a37365e8d950e49d6dd8ecee7b016b50577746aa716c9a71a1f3782fbd62077cf8b4105aa444931256142129330458950c2267a4211ddd1b95f82b6b3a62bcd2ad7e7b57eca605bdc8716d17d6b0e2475062fbed54c0ad9dd7ed7bcb590f149a05dda5c5168885d88914519f7055d5c7561051a4da4d019e3d3106307164db497f18cd40d22a30fb0d0818ea0109cc8808dcb080da072c508600b1c5aa4704daa123c6520031d426ed8420408c8537ce0862859c0173cff9c58f0c1082c2486c8d0430a0e70e1a28a5617b10f6861061820ec2f84e0d021c406cb8b216840011479ce83098b0528a45106174908f1822bf402928aa90f3c6f85d1930ba3d4d08418338060c318b802eeba2201701b1758c0bd9f1e770fac5c390b0789bb1375878171f72f9fd3127707e2b2d7ef8a4b9bb8b3a490dc793fe3d1879e5044eb2e9f7c3aa4ab6f8c74bbb6b4354be93187b8db896fd2c64eb87dbbbf64b7cd5c92bbfb28ebb9c74afe1edfb44adaf6669184807e5e57a39b35c2586acca1bbf7688db992b6ac559769cc6115ee0eca5a562e255c59dc7774f25b9bddf749a63dfe548dc916779fe232978ebbe778c4dcc9cf656c2b6b8e223131217221ee2db8ac6535e61a041e017d7a488b7bb6be7874edee2bb8ac8553b3e5ceb856dd75b833b9b7662d16eb0377d720037799bbe370f71b7ee335ee4ef3d3a37fef3cd3ddc63d8acbbe2cae33f8241e9ff4018b803e3d4245744d88edc7c7a7c84fadd5808048233fb6a01e6c41fdbbe611dce5adededb3107ccb75048564bcc7c709d1f97513211fceb72d4d4d69bbd23270d947e45ed61d2efb6edc3d87cb3c337e427e7dadbb7b2ef3bac880bb6fe0328f8bbbdf2f2911fd1a25cb13e334dda1daea50ab27afa55f85739f45b3eab4bb03b97bd8dd7bb8ccb3e2ee3a83e3dde9d89f65ada2b49c9368f4567a31a5ede89835ebee3934b4cb533f148d925f96757477eafe91eecec3651ed519dc391bccfde519e7fcf4564afecde7febcefe7be3473966e5bf3a6b76bf7aeb98c6db46a71cf0877f7e13237dd1dc7658e0077d7e132cf81fcd2561bd5bf77354a6d985e6c77a5bb8c739fd319fc80b83b072e731d779fb9cc91dc5d874b5bfe2a4c77db8ed5aca3cee0f855a2ae662163d642465c9655c82ed75cb3a5bbbb58eede72f71b77fff689777549c63927e9c0c18b8d7bb9ba0a9da583072f9e0d9e0d2d2b573c6a432b87872c3c41d802994764137337b2b901f2dddc7c379fdfbc727e28c1e88b0a9693c4eea3af9c24762c8a42d8a2ad9a16adf9be1b2034f4c379a2a12d205660b0a11ecd8d1b7d406c80d88082118bd600b172c53362511b50306a51cf33fa3e572ce78a45bd1b2b38f40a35aaa13120566ca80dd4a8867a36395756608881456b72ae58566ca04637f4c361e106080c31b0284ece158b7e2ab0e8475938522c7ac533aaa13440ae784634d40688151b5030aaa1573c231bdabab9c981c1c64a2cca8d6e72607042ca867a14861afa513772bda867148621a34a62f7d124762dd9d3473d9c1f2ab4e847a59e58348b4d8882f08b18cbc8f75df9ae00b172a595e30415146c70820a0a1f0e15f7f2e485183ecaa23178b4455f70420a466be80b56ae502397d48bba680c2fd8408d5c392fc4409373851a7931bc682ce70a356251584e0c2f8fba7258d4690c2fefda8426a072d11675e5b8f7b06460794a6cfc034285e52a63566898c1bf96fb90f7001b970108954761395458214dabd56ad10f46d382516fb1682c463dd614cb6bb158ad298fbe98bcaa6fb3688cc658b11760b19ccd5af2609445f5a2c9a17ac55a39acd847a95e3954582e20545e083fea9f8b8b8d7b1eb5b159f2c298d7aafae8ab05840a8f90ea453dacc9f98050e111be72366ba945bd1c2a2f8436fea2b49543c565e1472d60f3f2c2168fab35d50a3f1a1a63f1b43c9d100ad34e080b127a3953bb15b6bcec85ad1faf0ff6234659ad50e7d3f13ceadac1c6c5dca045cc0d59c258e8626ec022e686ab156cfc1383c395bbf77d1fadbac9107e4a3c02e85cc12274313774114ec56ee012c670e012d2d0c5e08025b461dd509d2fe845c314c85e2c1bd6abf55118fd5ad45d406230186dd11b9793879fd24761d405c4719876629ea713b276f06ebc1cd88bd250d7eb870bc80f176db95c9ed2473d203098f7c15a3f5a2c17cb45dd45ab6e328431263f5ed4457542578e4e063eeff5c211b26809a18b99614ce872d947bd250f3f0f091b0f612a168bb1aaf88260316a138bc5621487c973c56e5c39add78b7a30188d81f1c2781e8e126f8c8bc9abf13caf2627067bbdbc7079168595096134067b167589b1014ce8a2af5906b3190d81030d70943c2f212c67eac6867ace940d102b4e4cb9e8476da0464e50c97094782f1c384c2efaca41933305fb4224ac1b1e21f8102d49d14a2b2b5888d8e2416193e346c78773c3e58626b6c18d8b662a46bf187dd18f06478927c686319ec714a330ea38321a202e1c252ceaca69c5be16cbf3cf0b4e1a357cb1e20b0d3e13534317313570095d4c0d5ac2d0c5d44080f015ba981a02400418a177117a13a1531716214b0c00a40859744a86d087aa5a3f58493f583940dc71dc8128f1426fb764089d3a2b86d3d4f4ca71ea1e2bc75fd4f34212c8762b7ce134b9a8e7fc50a2c3d3daad90f582e134794d5332fc78b5743ceaa23fbc97c7137af4a32e04d888a1a10930369e4d4eeb53924149cc0c5d4231575f844e39f8826ecc842e66060fc173a8a8938d7f343a1f4d924dce0f2fe7bbb1a11eb5a10102b3f9be1f361ecdf7ed5648437f50f1c2170d4d8c26a7ca0b5b542f23ce12c11a5084308fb63cd60bf6e3f57d30fa03465f300a63bda86034d4806caad5f2a1186d51970fd1d0168d51bd680da5014205070df5804cd5e4d0e478f8c1e82bf6a2b0166d8991227c515713a187ae18a42185982b65c259e862ae74117a218bd2b8e8d4eb454303a32f58eb86ee160d8501a179b96e62af168db16c5855ad10a7c9455f3f94e878ac1775fd70fd70d1dcbcc22e642fea1427e9c5f4852f5a75932164518ffe88519d1dcb51a213bee82b4787e70b7ad1cfcb71b97ebca8ff7851efe57af1788fe38829c0c686e70b9afa280f1161ceecb04648435b3ec572d5d05016cd6ee1d01bcac249b2c954708455ad1046772b6cb1583f582c5ac362b1680b674a8632de7393f34389ce548bfe50a213c6a63ecaa2353494a6a99553e5fd88e5e8c810d2d8140df5bc900432a71e75fac3a32ffac3a33a1eebc5fac162f1b83ad08614a1dbf0fc68d1a956e83f5a394a74429db0153a8bfef0688bb280fcf0280f0c4605a31e8de5b0a8a63c8f7a0e152f74e55079947e393cac1c6870b0945e34bcc0c6c1518ab9dfd01f3834b406070815af898685c3a4c5ca51f2a29e84e7eb800d8b8d31a10d8db5a82b8517885118fd581fbdd1f1947ed0d45098bbd31b2a4db19c2aea3955ac1c25cf7fd0d018a5c951a213c672743e1d8fbe603954ae9cd68781d6174475e3439f8bbaeb9533e539931665d123dc5b32b83caf015642166d0520fca84d19218bb6c2a8f145f8511bb7c95ccc95172a18659285fa9361ca45b717e6fc60e550e550d9d00fc8940d7db570986ce8476d5c5470849aba987cd4c60504489557e5c568121b1aa755add0a35470849e476b5839555e489343d5a2db0b5f392daa8f6e2f74e550f1c2580b896f515818ff168da9514518a32f8a83e52c6739cb75dc73a67e28d10979c258c8ea808c8a177e94c5a236ad1665b5e8cb6bbd7098e030bd28ac458575c362e97c39555e52cb63da093dfa01997ab5688cbe70583854aabc10e6a254aeed9109a306143ead8f8310c2cf693802d994cbe3093fea29a9f22a6083c37ba8a723a422a422a4c2c6c35172d7d1b9a12ab891951a6a7069c1c2da8925b16e5c382ab870f09d9b16cb75e306c5c9a1e29d09a590e1a0373e9c22f9582c168bde8001c17173837303c70d1c36de0d20afd07192bc288c5ef12117bdf9207613bbc9b9a12e2eac1a16a5b981b97080511b188cd6c0288debe626278b0fc1428f4ec5804cf108a73e88c9a65c43842f336cb4178653248553789e37c5f77db02f9ca24c19162bc98b95144ed172b55a38495a2ed62b9c42e6d1245f3805ec4b8a019105030d20234b2801d767c38d03b008a762b15bac05de8d2e3e9818568c032d1b0bb824107ad4e645068c8cabd0a3319a3542cf8731b68c71c4171a2e504516686841430068f080460d679c39238d33c638038c33be38838bd0c38cd1c519599cf1e50c2aba8431d344183347781bc062083301308325f43066aec2291d34ca80b2097fd0c0151e188383107888940981870851181c84c0b3451834aa00a3d584b7a08c8b09329e96d712686c117a9830685411060d2ac2a03101cf8a2f3484584220ca8040190a28434be861cac052860e6500808c36c840838c31c668e20c2e6768398388d0c39cb1c319339861c68c32c298510233c29801810098b1c58c2c0230030718186658998a9571461965841ea68c2fcae8a28c0e90a1a58c2fa111634891c615cf4c99cfcc9810b0c29071258c990e782d33aa20234be8d11b335f72fc2a4c1a4d84492301a18731e38b30691011260d1f2e504516a10f610142027cf4bbf2837b9e47433deac2e2c3e8d5fa6eb0a8d7927dae580b16a3af98eb86d660436b28ec864ae1e4b8b848d9e4d0c4983ca3308bccc5a5a68bf7b8ae70e9c2a58bd0a35d6868c68c202422242224824be85d3c16b571cfe805248bc7fac22cb2cf03570ecd17ef69b162748618e572856b0c920fc8a672782dcff321980b890a64532e2fc28f8641f0e0c183078f315f19366e4496634c180bb9b84c00a32d586b02322f6cade06573e541e8e5e4f852b346161797355c61b870e1c2850b17562bc798a91ee19725ec4186838b07612b27c71717c8a66caebe6409736820fc707099c1e6ea8b0e2e1cf0127e948cb05566ca861e6db572a6cc295ccbfb72a6a47c3e9d9007590df51f521f4e92242c1c2cae63433fea22e3867e30dfe2aba14464df940c07c8944c0b2bb4c999920de1fa12d6009922e232c3e5cbebe6a5c1cbf3a0178d852ef73c845768469645cb27d302644bf851282c23322eac9d8fca86700d88083ffac9ba841fc5d2ca91656185217c3a5ed883ccc3e165069947a76cb078a159c106210f396c6ee8946b8b67c6f36c68c228645e6823739961c560af1b33496c9a88c95a2ed7179b26bea09a9cef8beb8beb4bf8d11b59cb55c4102d1eb495a3c30b8f180f322fa441e651306453365cb4841f957589c55a74ea83d035868b0d17598e0e32def3d1503646861b2fbb8e178f5014a409d9f649a3957e8dfcbfeea07ebb6d596ffe6df5d55651f23536ad9e7ec67b6b90fcd7bbb2ac58ef9eca862bfd4dc97f0dc3f8243ef29c905528c84f84ba547faaccdde90944940ed16874eb6ad21f6fad226f1d97d85d9e4d45454227d1f84e886833e4d0824cbc72f7135c269aa1424dd0387f157abb76575e4cc9fa25c59bea6d6bd4da6ca7cde2f478040c0287f4f4ecb6cdfa62533f546e845232216fb8d3d8e9a33e375addea8ebad92627eede25021070f71f273e4e6e552df438ab15637d2cd8f782d9e890fcdc6fa6dc6f26bded9323f27f5f262962ec33e7242a264952590a165d75b42ceb88e43229486451ca545ceeb7a55fdeaed53474f71e9745e9e2eea03e6bb22855dc1d5f1268c819e504776fe23216c8385896afd395f2dcaedd3a5b1bb5614ac15d599e364a5a92eaa7364c71e3ae462c540139d9f7ed78c31f27fb7e6e574df175fdf2a156c840d04fcfb5f5f45c9b98c5155a4ed221f712e31af9393c1611093a898a88c67792b1cda688f357b9f8eeac6b594d5d735235a3a0e8c86f6d74df6a73add2bbaa2bc3bf58f74e3f66ac74bb76cc5849db3e3f65bc9d60db65aa7b0cf5ad6654d4ed5aaabab5f824e6240a07b7fedbedd474e36e3647dfdced4a2f7ddce679dcce9db75c719b3ed5bd5394931b9a98712feb88b369c78722a36ed7eafa797ca45cffda2595bc9fdff6b92a9f47ee3bd18a481013f9565629e33d561b896d7ed3fcadc9fba5fd31635cdacad2d6f23fa9c09ffe5673f6b349967849ca848dcba8934a359990d72a21afa58a1ae3ee4d2e8b0a421685828353a46c5c6a1ef25aaa285240fd385d4b4d49f29fdcf7ab9e6a8b93a2e0c6a5a69fb39bee8cd666c737750f792d950e792ba589af696f9a154769e4b554347abfcadee893bf33363f537a2bd5967e7e9c141359147d73b7a97e9b0d4305b12b739f9fc82f4bab04a7eb8e229fbcd84897183fd5ce283257dd4361fc445e5cbb4d2ed38fd58caab2fabeed91ae6d2a317efa2aff59490527b76b77386ffd48f74d26bfeb2ecb50573389dbf689d65f9a397ca4f597e4eb126353cce19bff29676b79f494005bd519ccb91c91a1a19ccbe5724fee4e87444d55df74772598ac706f364a34cd3a3474e4a74811a0ac8786fedaf262315777450a2a02f49f71524a828a00555c54501120ac937aaa5a1a010dd155a89f21ba0ae5334457a18e00e92a941090ae421901d255a820205d852a02a4ab50448074156a0890ae420101e92a940f90ae421df9d15528a11f5d8532f2a3ab50413fba0a55e44757a188fce82ad4901f5d8502fad155a89f1f5d853aa2ab5042ba0a654457a1827415aa88ae4211d155a821ba0a05a4ab503fba0ae5a3ab507fb153d39726284d459e7f6fab93fa5bcd31e5bf5dab64de9e4a5b73491b5ba8da3f29ebed97ec6a696a8ba4878676db8a64f95669b7976c877ad26f75efb4e487db30cd9df7298d461f273534544df2d67cdbf7ab92644ac038487eeed49f95180192afcf6aeefb399f475bdb25e17e2d2a8102926f4bd3acf4fed7a8ae38ba5fd3ddb619e3f659a9ee9d524801d3062e63a271d9521a2e5b0ac3654b645cb6d485cb96c0b86ca90a972d7571d9d2167787c95e371b68c8997f57976027f271637da86d737609f93a5c96e1c64e1b63a88b6dc55925b9bb0c52ee1ec368f7e770dbc2504585a5b4c64e50f973a7f617aebdd9cc84ac46e64985f11277cff9719b89bbbbe0ee555abbf2247113f95fd62a79b11359e2a5fb557056daaf7578b4f1bdf52877e6ecb54d3a5cbed1d3aebc4c34794f2577d7552d89e0eeb2a4292e4b6ae2b2a4251ebbf8887cf29ed848efbfe52a457eb6fa9176b736612ca5c34b3096faadcfbc6f13f29e182ae331ea3776526f937d4f7c94ff5efbe476717ef2556c5466b21befdff2e792a8c65a2bcbaad484fc7bb351d756dcd165228af9495b85b3299e660e1fb9e7af2a7194ce19376127a9b2ac476789a3c8cf78476127aa112f3977db96b666757da5edaea9c6c77dbeb8764695183f7d59aba5ad55e16db2314e9bf546b9bb4ed2d8741a1aca7f6dd3f7dcb3e775c5993d7697674ec86edb5c4d9c9f859dd1c556db2a8bd4c4dd3315a40b580515213204c8ea877caa112f3972ff8dab86866ed76e5c65ab2e1ec5dfd8c95fec8484e65caea727e772e2cef6bfb3fdd7644752ee0e44ebcf2459e9925412c59bee5ec968cbdaf94457504a4a32a23b7f95bb0b01fd9cfa564ba59ab755525986a3b64dff4afacddd1e1ad2fa625d1fca8809f29e586963a727b1d3ad1a7dae465da68d9df2dbaafa4b1b3b695b0e0d6d6d4b51df6a4d34b55d1276e1e6eb9e1c26af843c84db29de54937fbb15379a98fe79edbe78b479d313aff0832cecc0835cfd98d416b7296eb4381de5b9d5d246a5c8d7273df10afe024e6c0149e940a00ff8539564c4044a2a8ae6b9b7c5d319fc1ace5bff803e2050cfb565fedccdcd506081eb0c5ab38abf6b95cda62802dd7099cf5ddf4669fa9e6215154d9f94fcb256efd3afd1adcf1c256fa5a5cd3dbba772772a779f72778b734111180722e5d484c99188e4d4840994a8242a098f8e9294d05b719be617c97be24c4322e00fe8d34355c7f1a9ae62ded5d50c573557ee5757fe5d39ebca71b8721d7470af711a77bfe29ec395d35c5dcd7075a5c395fbd5550e573478b7b7fde770d4934f46af3da934f1490b4fa63c91f224ca13169eacf004ca13d91014bb9a73a51953bdb3f1a51953f27bac7c286ee39a8ed7201bf261c88aee4a79e850fe3d56abc70d49b95dabb5cd59db67935af91c11f222223f3cdc5dc8ce1127ee0e4449a025d01f5af5f93511d0a7e7c9fcbaa73473d6ca8705991018772070c80fe8d3737538d770bae2849aa014a7eb924c08018e6d97e9c99a6f6693adeb12bbed65aa62cb7aad52d2ae34cd5057dc139468eacfd5bbc76ae6f0d1d0d0f8241eab80869c45627ed3aae6a8465cd6725937dea255cd59d5dc68f5b5795bbdf8bad68a80869c44563587af542ea805f99ff4d010d5884b230f0a591129f6f839e3916e7c35a5364ba9b6f47152d4049a98b14823df4867506f9bb365eeb7de494579fe279b2859111e6e02912dbef55f11679b38bea9858c5f45a407b27cbb42fe2a26e4df263af7b7aaf53769fd23ce4f4a643522bf2abf7ea8ffac346a9b1b1ad2f7a9f01e1ad2e7ae3beac75bcb6ab4357ec2b6cbb4cb7857f2d6a6b2e63799943597b113a977f5a9887cd3b479eba19cae3a22eca47f050f0040de8f77c373b97b76199097fcdb8ab9fa79ebf2353d818892365756d9cf01dc41100cb2bfe4d9f5f38d6eec44414dcb5acb732ceb78bb96bc27fd5ce93f192abfea4bb1ea5bf31ec2e98afb49e2ee3b639ca6186f9cae383af43a7fd567aa3388d315c7e4ee4b2dbc45f314856cbbc9c556e77772bb96c4e34ddad7e227bccd5d3e72f724493f5787ee2e020b2e130286bb2bb97bcb3dc9dd6f7553ab33b8afc5e610d008e8d3f333be769d41216011a09e1e9caeb87b0e0dfdad66bcf5d0d0e7ecbe6716e2230414e2c3dd6974884677a5bfebd694fc6d9e39e32392697f59d6a79db1699e5afc5ccd367727ee8e44c8b69bdcaebdb6e63e9375d7dfbb1a0aeeee15b9df26b72a95bf963b9d6e55ea49dc74ab52f9c9fa50f9ab9830b95d9b9fcc4cf647fdaea32dcd13697f94bb9fd0b2f8eaf0a5ba4d48cba489b44cca3ada8b6f1d2f767277a25bddbfedb53613dc7de84bf1ff32297dce4afdae48ee7ec4dd5de862bbadc6a6bb1be17127afa5ca38e724770f2ae29fc3517fb1935408c49b22444d103aa31411897a579ffe6da2de5553eb5a1ee1c65d4d6d91b4aee5f864e36ef675ee0d70f7eab212d8204b7bfafc80403dd8766dcf9775d4e4df9bd51ab7eb5301461881fad01380d0fdda66c3ae2257cf0823d0138a2879df897bcb022d2890b8b77a68a5d0817b8bc95b4bde324146c2ce580b919100c599be1d5684c0c7fd5bc1dd4597ed98b0ebcd56d5775db1ef89477a4211bd5f8adbf6a5489618c6c1d6243de184316b2d3a2ff72be43fef9a107db1dde397251e8500fdfc0c39528bd4b715111a420ef923458a000d013a1254a448cde783aa8d14f209fa79202121e3d66716b28214d351f8141e51226a455a907cf27fb47a9d7fe32afaf9d43729081241b4d0212b1f9d5b957ac1dda3d024a9d00913d4539027f728f4884989e928e929aa470a4a92941393a3204582f090bfc7337f95dd3667b33982902cc88d209ebbebd02951a8131326a9f08869c9d353f8d46464b575f2392b457e155bd6fcf7937cce4a1d4935291232e127ad13abdf5fbed4d368f3e74e27a9a4a8a423a7a4262a2445ddaecd3b4a4849aa095292540895d4d4c429694998040595c4a4c424e59484c444a58e92523062b2644913a724a92326499c98a0a4a2a814931154529224292726a73069091326463b23f838ab2a881f637421e22d27b003c44066715808929c314595907b00c035423ce101879da185c905f0c719879d3973e6cc1930dc35001d8c3c61b3807b14896b8550c2bf9c094fa4b0d371d70058171832421177b1b004d20b9aa8fb0e8c041d4a2872a7c2e28a266178e1de0564c0d280971587f560220345acc1c45b3415088058812a87d9f0058b94189cf1970a36f5842f67dc61f5db5240f1cf054be0930f1c71676389ab29485ae0a241599c0002671c762403a316a209b86b0546d03c2f3bee6dd13141c7a580b39aaed06005ab04f8872467000ce4cef84bef6005929dce595a2079615d4139ebe9a98a041254f157010230420360b0827f5d80965a6b74e0b01a0480c4d59203384c8c1688a0c00dcd5d8c02d6f0818701fcf523480a37b470712f734573580ee62d6f9de0394c8b47ba661ecc7178ae0dbc1b5e0ca865c45901687900fb6231578be579bee303fd734f85160a9ec34c70398e97e79ee7b95c443c8ff52d791eccfb3c8ff5aaf2799f07fb3680f2bc9707f3cfc30159dfeba55343bdd6f7b5b0782dcffb6a3c333e8fc65d5eeb63bde74d7d9ef7c59a7c3f3eef7bb53ecf059fe7bd3e4f056f87e7b1bed8055c2cd80d6f03cfd311637906f03eeff579dec712bdaf554343e4bbf18a629e2b04d6091eecfb5a3fac9aeff3767004792eb47e6c94584f9fb7fc5380d762e9b45c9fc7729700bc1378feb94c2673cfbd96f7796178b18f04cffb5cdfc7f2bc219e102fe6dd7cdff7bd8ebc20dfd7fa3c1f1668d32336828793818f4f08cff5f5f05a1ecbf3efe9a3355ecb3ffb724af3786039900b788e24031fcb7b792d9887e3b1b27c5f6c88e509b1bcef6bd1ef8646c773791ecca7f5f3818ff7d5bc621fccf386bcef1b01ebe5d17c2d569597f39d9ec7eaf1686c3e2f06f33e249f079f075f072c67b987c37b7d9f87d392b15a5f8feffbbc97d7b27934217836aecf7379378cfcf8986036349f578bddc03e4f052fe679accf6b794b5e07df918f83cfe6837d2e8fe57dde67f3c15a1ecbc5f23c231ecbd3f168bc1bcff34cf03cf86a58302fd6f23ecf1bf2bcd7065f0eaff579ae9677e4b3f1589f071e8bf57dadafe51df93ecfc757e3d178b1d6e779de90d7c157036379ad58cbf33c23d4e341428c885582cb6379345e8b874743336413e587071e082deffb5e1fec3d990e1f9b25cffbbccff3bc1e87b9e92cc8e09559210ca72b144106cc0a40be00e3493dc1029a98608c4b01e1c2a38ae8c047552d1caa08290c0005043351a188a9324f95089225457840c652e5c0e748113c841ca937983062029c108c00a9f1824ce0b111443b738020da868334353ce8a16df978c6208179a80f092568e111e3031abdf980eec8c0b56830c569ae1f9cb600e0ceca8fdb980825a27adb9b25f175af0977f7c06594cccdd684e4ceeb5ea35ddcdd85538acee09b75d42fc5fd49464d9dc1ba2b29e2e060fd604d71d5e2e1aab5e44502f56066cc2043e2cae5ba818dc0c50cad227e5a3b6e8e60e295c3556b09cd06351cf000c015cd0a2d16581ed8ecd74d4c2926f4aa6199c0a3c6b581ab5897ab1c5266a031c232c018375e5cb9ce5cb96e7c80e0ea66e74c7145c3e3c60733c125c415802b3a6c7a0841436b872b1c40700061f5cc84c478ccced0e02a2126042362e16011c58eb86235fd0879d5bc9ab862d9bc7cb4786c7e585eeba6c553a3e42a01b6c2cbc7abe6357593e326070d0f9a0d602bb0d8a0e1e583c58506d7972b11a65a392a8ad0416be806c76bd6f2583daca3d6d3cd8ed7077b02fb017372e9b8e1bd6c58aed60d8bc5fa5830568c4553c3418b056b02cb00c753cd0cf682792c588b484b48cb8bf560fd9881e603171357379a9861f66afd8821d1d0f282861c91fa99365620822d3a0046035fce5bd40f58928c5038c108be62842124880c470c168505264e67b208e3810f7cf0c9220412027811022daca022024f2421041c6100e7f64167336050a60b316130f000196268410a0b5098382551fac0831d1b483101199e58400c30881d7080ef0737bc280195dcd59936d038434a941d1bcc426045062a40450420c0001f7ac0416c6185274c9c98b4c822031ca04096a51170a1851518a0620a248ed0a10600c0a04c08c4503185140db072f52453d20ca74c0abef04203189840145028f1030f4f8a2d4889f28429c984a19d198e165968c00005f8c1ca932da4c0a4946482a7e00b2db2b822031388020a062801440f56a6a4c0748209434688fcec64306bf999147c51822b3490010c4c200a062801c40f3df060e504e21429280801d7506389121c3748c001961d7480f2c4c7081e74d85939417386d5c6c7864b8d2f0631265a4b7c4a7c497840df0fcbc7036d7a5825b0e8061f7c1c783f603e583d3c1ead1dde06341a6490014bd6c271734386e3e3a6870d0735331a58ec05fb5e2f978be5f9cb4a8d081bb882d1c0685a376241301a560737523338e5c4745e3531a1d60d0eaf75f3125b3a160e6bd6da020004b87addf860342d1e9c0e84167055e3e4866cf1dc98e123f2c3d5a4e5bd882c7075c212a41900be564d6bc90e1a572aa08104303378aea1d9074866f85a3e583da607a4c8558298abd7eb83272b3a7018d5c04a32c30d573d689edce4b8c95145498719d335675c116d9a24342064301a168e8baa85c30e33c45a375e1d783886ccb0022368480081959819216e7c362e2433d89196928fc285060d5c3a354a3523bca4b448801da141024524a161091f3690f958c11997e450c595cd692b0000708070784e38609900eb1134430decc8ab26768365842909ab831aa533ae6a604c3851b1a51f494a35344b3751249104ae76b478826a5e431ae0bc6a6c92725a40e2aa26b6e4414d872b174be6f25e2abc6a5c26bc482832b2396982c4965e35b01e38483421b49c6876e4e060041f1b90102b4109d40833d4c440d8109c2146989e60372d980fd7102b88e6a615842281d1c06a5a425c4a5a42483cd70f1610d7063e34b1917524c9041eb19a0d688ccc70e4644324a6d30aa115c26b892b126eb4905c25b83ca009a1c5018e1f5607345c81423c968dd5d362b95cc869218829f07d620160bc7079628923729001062b4d65fb91d6821416a0386912f5b42485a521a1213a238800026d65000367c400630528148990e3a3074c0b07b048020915925018ea40c78d4d78f3d4100c141de4cb9add607c36be144cac865a8cd959e14c1e6981c56f5fda2a9bcddfb5aca3fe232d90807a88cbb4a0f9afae9a1aa7eb5259d623ab2f0afa39b3b8ca028a67e193858c0364c02934d20b072c074c92ac1c409213f7f8539f39e0239fe6ef7afbf2c9b27ec615f114f1149966a86b0d110fc9b4b3fd1b0d0d49511e6d452c7e747fc5fd1aa7ebd2d09014b65d2630eeb427f13844dbc0167a996ce08a5975e10668baeac20d2071df4028bbe28b839fc3a3aeb827ed68cfa82b76ae5efa38a92b9eaef07fddfe1a7d5d3f6b60cb2d9f660e679cbf4acfd54009927fdfc8651a90c9be8871079d644c69651d9340dd6fabdfbd12bd7baadaa98b764f55b47b25b9dff6493c7e31fd0b922f32700a4def13efd764dc0a2fbe5f5b91c5c12934fdb76a8a667d9cb85f77e0322b4cb12c2d95154aa872cd7d2e9232f14eaabb22d55d496d7b285d73d2d09054d10ee5011af2243eaaed6a13c9e494426e84a2ab59dc768abc96ea56ddcef85af1da5c59339eaa3911db2ed3e7ead53827ee2aeaafb237f25a256feeb6f854a3dd5fc56ad1aae6c8ffb27662a4dc68a5ad6a4e29634b24e8bcd832118def644815516e843234045455c5ce1dccaf4fb2e676796a59152394baea6c962c8b8686a430796a912cf105c660f2d434bc40974a9a27262f60e554f89ca23b3a53748d720125e4195523ef47e9fe5a61a3b2ac639114918d89795261bc84c4381d19700a4d57d1025dee2962f2d416c8024ea1ed9e4adcaf2d6085c9535b80861528632bf95b56012dee0e9eb50a24f11c66bc4d9b47fd48dbea9df25f1d93dd2b191a922a2a2a9222ca58892889c80a1bb97b082ef3b2c5bd98322f480e4ea1fdedd6d224f39345f9a132d2d67fb3e43e4d9cae4b4544e33bd1f9c9fa4bd87699b6c6e6141fa0294043ac9ebc53a461f52493a1a1ad7fd752ffdb84cedbb5bb6a6e8dc7229289b4626e849271ce8fd375293742216d5011a0259cae380a3899f15da5f0f252d820850fa92b8e4e408d092431812777f062f3a4e4efb152f2d61ade3c3cf9772de904645e3f4345d16587961ba190f7a368bf6d5827bf8eea7fa5285a8822b6b5cdd910dc96929ff1c5b81327812fdcefeb50025048000012e0c197263e55dd344ad62e6174c9e260d311947c628ab7cde14d29597134ece2a44bcc1dcc915211c0c2ac79d3fdb208ec22e0e3eee0cedf8c6b3a745b0ade100263408008082c3948dba13c24138f0e8d5655dc499a00011d5e1cc46dabab9f1fa0c30382a018e3e0e7ecce98f2d4fc557f6fd7d65dcd41f1e4ee4c5ce680329cbcef00313207ece0a0d6a736f1d6f4a4f2f99fc81c20d4801334004b79eafd37f2b4aada5a5aa5edad2a34008a7bd311147a2bb5e1a406f09031c0020cc00cf880011fc8b860c1c5caefd728c6b71ace26d5f67ed58d96f5bcb58982e49b26cee44e9f38ffed567287d6cfb74bab0ea8afad393bd6d224bf8a0b757730d7727c1237dedaf3f9e80932e48ff471524f68b927b6d1afd55d37ce7da6e113a683f977696d4f2c81f4b35e4019f0628a498a7574b7539655875e1d5e40976b73f9f7933a88d4025e7077506a01424e9071076db6b33656936aac25ad549b1597ff09bc96ee60f2d4da525d754e78019d4842e6c493a578dfaedd27ced486e9aeea28be25e5f9b2567163fd7c4faaabae093337fbf9abb0be55d68416f7fd9fcb7893b69aff38a92670e0eed61cc578e7bf3add041277908932fac46d4bdab23e4e8a892f3226acc09da62328d48649ad3fd7b6d5d9f88e54c6848fbba55fa3d1a4644b8c01c9df9fcd2f6b9526b5c40c5b677dd6f16b947c7a4ffa3829f2c9a2a2b2ac474554572a4544941ba1d89c5d221615ede810e54628a255cded72b5a3b5fdfd5a91d64043cedc6f2bfedbacb0d1d64fe64628454456d848a6840e0f97291103a7d0645bc06cd9b20577cf2d3e0e4ea17dcde651d7b6c8c8fb7a4c7e5b125c3c375ac992b802a7d074f95b243f09289f42bbd8eafba63eb5f863c6b6a1215a14fa1f959f6ac4a510d0cfb9ef8973b5485bd526cab32304f473521e1da2f19d8c45f96dfe938a58b42374521ea15387e88a5fdbd51cf9fa4b8c6ba2b6fbc49fb39b7c2754232e8d7665c162309a22e16c0642083a20384d11978baa34a95c22009901f971ff51c1dd7fdc4510c1e5342e1a9c1916387777970f2aa044e9254439d0dc63b0978b86f579beef5791163bc95f96f5a82ceb91161504b183115218d1c50807dc8cc88c38c200089841004600c0852096ec9c116f440b412c1901c5ddadcc5cc6591b7ec88216c1c5292de39c5fdca749837259114dfc2fded49e9447a9080d645a5ae0645977b5d18b2f0ffd1c8ec2e4a96ba6c5e91cdefad4e56c2d472b9ccd9bd535912c2d4ea4dabadab0cea499cb386c13f5eb2cea3a8a358bfbb5aee419f5b56a64e6ead69fb3524c3ad44b4c724cbb7ceafa59ca0994deda96bf2dee8976d2e466b57ebbef898dc8d2e28ea8ead6b7c9d655e988fc5c71514c660ec9cce5256cabb93e69245d737d0a6bae4fb942e98dcb287d2b2e491dce47b911caef0ab55feb30e79a6cf59760f28c7ae209776f015e134cb87b4b784a6c71f79240c2dd538077c45058fe78ebd18d3c53b85d4b75f357e124f96d173bed6ef8e64e6a6785f3d3107e5d9fa49820d15d7d3a732605698066146007e75908e1c5871388b1854b600020f0f2c3147524ba04d1850803332e000c9015041bbab80d3a4431f2624217b722c101ba486203342f83f802041398808f571cd4b03a6ba83f41807863012ca0b81304b8e080002620c2952020c4160207c0380a356011440e2746f023322b57f850012d3ee4080aaa87cc8a83381ed4a005b5f94e0b3ed00083fab9083b5c94a10282e4406a06a0112922c73b60e3011d48010957ee030621b4400d99e73c86886145491649b88e295a45bcb8c1876b7005842096c830c5673a5ce181209c94c0715c801e8000b52e57377450d0c50688b4f84d17294334f002832b9bdc120a4526c16b8ebeb822c304059c464802500738411157b1a5081c416409dc158c0a0735d8e064057f3d51a60009297af0977791982ac0e4aea740a2788103496b0b08eca042f383b75800c28726640802098b05e1991b7ab0171600aa8c305778e28aa5d33282012098f1f289290112471be470f5ed90c1034c2a332f1f9315b9032531d0f2dd3822840d4b977a5b4860021b8461858fb765892412c8321be3c10083130b50a38b27cf09141518401121a83784044922d0008a325e0e2c04e8a1e5c0e266320f4ad6e0c0957be1d3346e0294f12f32ec114050228b43d141090ac01ee878111cb0bb870ce0fc07164ed0e2a668c96908824814379a00e3e7122b96c86081256ec511ec94e080166f4189a72f9880e2ca9bd00c61ad9800852f21a5904086e98ea4254783528a1dfc04246a3eb013c47523158718722f04f98f171d170d57ca380f039ec2e4548185eb8cd0811910b270e021cc7a50b8a2e28a539b1516352419c13bf8318409333488c27d88b0446b054398c077c0108215041c6980ebe891450384e410c4332803012588aa40037c0653a2b2a10726c7b144c78fd404ca380e05c6a88247931bbf819202ee220ad06d3668238a1e1890c069ce987294030531f018191a986007213e8fd58c30822953ece03021323fb02c6186bf5e10a329881dc07057980c30104601d65d4435e70520d4e02d287e0460881c2e78eb0897081411840a676d200268fce0a53a0bf702dc112cb0c259321007890ea8e09f971d03177af4cf4a0c19cf04a27f4232482de0e7c6bd361c6064822e0770ef0a2b7609a404b947448e1a0ea80206f732d1fe028318f796643985e8c4c03d12be78f0c10674dcbbb981c05665873b0c3c10c1f5c200dcb72080124b5c4000ee16108090323b27ee0bc0828b27988c7137008c2cd3c1903b0fb2aa145a1eb8c7208198030e00833b151094c06b2dc0dd86c4aaea82e31ea504b50f062b7087ba6185303e9eb8a700022e84045871371a02044042bce06e42187393f0722f424512100ab870f759b2586820c8bd04110361e436dc4738e30b129460b983e0568c22c8c2fd032a55e0d0460eee1ca040231a0a807b0f9a10326a74e0bec106a6982141e39ea30a15da081fb867f0554865b47097d9b0c4088440c3fdc6163b70e1840bdc719cecac6085e96ea3c68d13c08ce05e73811368051ee04ec3c4073d94b0847bec8917a8a48001ee300edc2136700177d82705e4a105ee2f2562d49c38dc5d5b7042b0c3e7eeca2166cc0a8cdc5b580460458c16f7560f2b8c18000b77d61338b10d90706731e1c9a28222dcbf346c68e8a1c7fd63a2090d040085fb6723e19b3670ff8248400a006471f7c4300294e173f728500480d001ee9e0f3170fa02e6eedd9e886e43b87b465facacd1c5dd0382860f458edcbdd60b0dd04101776f81c743dce1ee1e08f272c50fee2e4508b22849b9bb124730d143cbddb37c8e0a15dcfdca0a665f6aee5e458d323060e5eed7851d02a071f7110524369872f7157472784289bb3ff1b8d9c207774f42c62e08ebee488c0853c50bdc7d480604169cbb13d97932868abb8323a8c04801772781874f130db8bb08608878e1cadd819899fa401477f7c0cad25490bbff98a2a999c1dd7968c101490feebec10741981370770dbcb042092e6a209385bbcb68b828c00adcfd062e972374f71b18600d68e1ee365a80282273f71a2a65f4e0e2ee34351f3fc8b87b2c878218da70771810576140c0dd5f1c28857070f71707b42e94dcdd0543931684dcbd15c699e487bbb7ee0f2f4631c8428a20868808e2eeac20902900eefe9d4008066c71f74f88ab0390e1ee9f94cd171ef4b3c78a4d27f16bb5d603081e1c4a24b8bb03e181bb3b103d40204692104840870135dc9db58209c584981c67c870f7d616239478d260025f8cb8bb870210519860c1c10052b8bba7830b3ed8c92e2226dcddb3004b860fa410a60aceddbf1b40c88100148870c506dc9d65c60b5a6840131818e205eeeed10e70a48912102d90e0ee1f142d3cc0858717627e707716979b1ca47e3cd1022677779d902b3242888fe70977ff9624a190021d82e88086bbb374f800260c21b248e10177f7cc245c804002a088c1c3dd3d072ca0e6385220b1c3dd5f041080192fcc501b48dcfdfbc28c1f5e584308141871f7560168b021701b98f2c2f7dfad7ff7884284e0d7d514d2d404d268bb9253687a68c8567e142d0a7ddd84823ce45b4aa3d5fd39fab89df111583ba39eee8aa37dc647d63e0593c0b2ac47e03ecd6be9e730ed5f094bd1fe6d655947905696f588f6361eaa8235c3a77f9b88b728fedbb0ed5af17eb9ad4e6b864ea0ae22dea24dd4fd15f11669d486cb5a654f2aa4154b8c4d11ccd8f6398cd35933fcf16227106f11a4914c21ede23b566b8651229871a51b9f54a8b66688b40b33ad4708cd9a7597bf0a8fda926fad76556f73127057da6c98bc15772d99311e4b3ce28db3b9e9aeac39bccf4a2f8fa61aa90dd721bd5fd39b0dd3f2499cd327f8ba676737befdb5b9e66c36a9b6a4d5b5bf91f54677fbf7b54c4f2125ed27d9813f3dda525bf97a5b6a048220e5012ac188f2fc9460a4b36f25ef8ffa494af1b6795bca63741ff78482e46b8d234ff271a336adce864f484e215412d0967fdbfefc5305f26fb72a45133f3f9931d5d8a4bbafe92f4d5a626cd6e8aee69c74d556d3685affdd23def4a96a4e97b6ee27e9cdbbda5bedadf1d213a877f94f2a4c4f61c6a02ecb0aeefbb5fc4cf5892fceb8f1ee74d541c09aab69c3a22802d12789b34931120572bbf656b7a6956a6bc3398cd381bba72aa9f2e76825ada8ff9e6091dadfadb7c6651533d6e35bfdc5b42ceb675314b5adca04f7eb8c773525274fd486a97e51b4559925c626a5f7766dcf67932a3979a27ae7b6c636204ab7c6385ab3d554936fb39407db44f16250935f5562fdbf71d5586b94e7f7f966cd63d4ae26ea6d453397712288755973f81e5150977f6fc58d36acf715a9e44890e6aabb3a4cd26bb735edf8598b23d6f9f5b6e12a8ae06baba3d13e87a3686fd2df95b4e4ad23ada6fdf1b378b1a5859ff111131ad5aeb65f49ccd82682b4a3dbb5f766a368b4527ceb58da2a569b7fdb3cea6aea7d62b0ac27950fb27bdcdefdc5b7f2d45c4d5cab36cc444551a491ff598946b5adb9da6ca5bae64abe3ee9adb8ac944632d55c9f68175bf2b7b63a7feed4ba9256acb99a2298d33557f3d6f13f2b51907c6b9ee3883fdbecd3cf47f4d6aa2f3f535d478ac5c7ed8cb5fe713c69d87699a0cc13e724349a0e5f1add950a57d1df1ae374d48629254b8b1bf7e336367738fae4eb5aa3e457b1d8762dcee689f38dd2c76d50ef4f0292aff1a53c9a2cdf56baf599bbf489825aff487efe7dcfc7e5fd5c0e8f9f9928a82da596664cc9276d15d33e4d4ade5a96a7ed49bdbb955eaca744f141fdd9fc4ca3d1ba99f0be7a8f67dedaee5b6bb8ac5127265129d04a75a5db1e25a1d15d9ed5f624b566485aba5fefd7a415f7ebfd5aacd256fffd1bf942ae3ef57d7df1a8a3e01e6bfe7d2dc55beb2f45f22dd5b6877ed59428f42f1e455b15a5d16b29fd5cd5f42b8eea1f2d792db5d52f2979ebc5a6aea7d6f46b3cbfb1137d7d6a5bdbfada7aab3b9bcdef84eaafaa5fbe2e932848bb34a8a6261edaced5f91c8ea227d0a88d89829ada72c636a8a62651dcfa6b5ab4d52fc59ccb691b16732e07e230ce14aaa9897ead1ae1b6d589a2086eabdf178fd75e2614dcb9f9dc64ae38aaad8ea5b76b6d968237f0298f2e6db5edcfa3a6ca58b7ffd2c76d5d47b2e25ca35fc357a7ac232ecd1fc74abf46defab51d1aeddaba6b5887569af1a69b8abba7cab84dfeeb537f3ef7a944c18be957d9926afbbb52babb95820f5acab371377bbbf66b94c4b8fd394cf5dbf23325eb6f5d6dc6f766a9fe5ccdd5a4ba52dac6a5a651d54d999ec2db89719b0e25493171a2a0aeb22795b7b9daa969c65afff8977eaeda86717ea2603e494a37d596ee9eaae25dd6d166bcb5c595e68947aa2dcdfdadea937e69e6aad5d31b52d3e274feabc3364c2bd576e352ef903fde13df5be9aea4baea74a8d55f32d7db677ab1bd56047123369fee5a824946a1d179b3b68bc74a6fd7eeb62debcdf6a4f2995ab3529aa841bc29cde16ca3bb5cab68595a1dadbb92fa71d7be0d54a2bbd2342b782d259f3ccbd152fd9fc3e33ef5598ed7d25ba935c39c6bdad9fe8d40bdefdb722ccbd3f6faa44c4fa1b8adfe927ffe4945c8b6fa2beed72268c3389b95eecad19ae11326a0352bcd4f95b14eb4d93048a974ddf4da8a1b7b6c364c1fb7a3687eb23e4eef5e0968cd1a45c1dd53d112a8ae666d4bbd7baa27f1f8487af754e2ef1b6852f269d292f0288a92bfebfd3477e66cc50580065106671dd536882e0e0681450741037da8b641d03a03e2cbe3b6898118c23de7ce9b3b2fc964f50f66c029b4fb26fee1cbad5f8e3f64a1c2e60fb81f7cccb83b2eb5fe11cb17700a0d8b88d3f6b1d0ecb55874dc872ddc072dae6d3ed4e0830fb86b0f65f29bb4872f610f3bd45d91740f4b7ebf8798ee2f0f5e78b8e23c40e181c70e6476d8e2be83b97f07243bc45c07303a5cd1018a0e348732e0145a0e39e0dc73f0c1c18ce3d0059c42c3e10a8725700a0d07d9953157b8b85f311d9c42bb2274dfc457620e4ea181b921cb0db41b7c6e701bbeecc6fb5b5badabb9abd990c5069adb5083b85fcf6af0b25fd780c57def1a68af6bd0995929034ea159e962e5cacc8a0a3a87452c5ad5dcd561b2c478b4aa39ab8ac57d925627e236ce5f456b118bb65c25ee6af9f9331e45ab9ad3bfb17edcf8b9dc5bb455995a87715ac4b7dc5b6bb23eae52615c8ab76b75aee6fa6434de9d0ec59a78f1950de72b2019bac0381d8dee6a3cff364a33eda6d930e5a1fddb68a1d6b57c9bf86f13ff6d62d12bbd4d34ed46bae9dcaee2beaf8b848686c8ad4553c760c6a748e1c1385d142914cc36062eee0e5e1c430c48dc63e0010319aa9afb8b290c5ff0130c59dc4fad6b09c3938364c6365bad5230f02837ae7ac1cbaeb4babe70be401d3c699487d48fdb7b575d712e94016fd7851e74f89ee4dd6311365d90552173cf2a5faa6871f72aa67b95255ca577f5eadfd5b26e6bd6b188f2d4a322fd1b3bf98d9df094f849a708495f5c4435e225bfabd7d6ad6b7557efc655562eb0d2f2396c45734b7ec5e5688544c98a475935ad3a32475deaadb8a46519eaae3898b1ee7550f0d66d5c46d95a1518b8aaeaaaee4afc4441b256d1bc4ac7dda9129413a7d38cbb9f5c78ce2b77da6b5ba174ef44a3d7da66a78ed7a80e72ee2fe0eb9d65d3665b666fd96eabb5d5e690dc4cd7253ae60ee62ffae62bb32c74d2e8102a63dc3d5f9efdbb90cad5df9bad66ae8e54a03888739fa3325484739fa3b285c9e5cd2b8e7b2a6c9a38f739913429f9580db38ea712f9dad65c94df161d6d5d97d42cf67107cb32a4b3cbc5bde220f9a57966b29e54e8e34d3569abc24bc49d36250a8de6bf5d5c5292b4353abb1ee4bee4684f68e66b8c1b733bb8833ad2e66cb91cee2005495ba33aa5524c79e5e0b5942c1f47b5a556b7672514f75247db32e6545fdcc119d516772a2c0ed24b65c3a59e32e3eebabf535bd4a6b8383885264e594931418a9afa291e6ecb580fd82bf7d2ccd9247457cd209f67f629b43edc2f125354d5e498247ed1ce6793bc5649ee4cc23db9e37c70b12ade4e706d4e146f55371166b62ddcc1283048cdd534f1a617d39a6f5502353dafadbad0b6e54e11a3d0a8eeafcdeada943cbfaebfe4df8bbb8b6559c5cf024ea191b9e2dac562fedbcde66dc53741fa4bee5e1ff73aee471f73f0ab584d7271275f20f1a666d5e95c356e63d0ac3a4dbf1c77e3db6c4985d08d4b5d473223168af7eb3ae266e3e3a4467777128fb406c6419269d7b238b893d3c1ed9aeb13ad363eabc1502b01dcd5529fe569da5b73b87c22f1a8fb5bbfb85975ba6631dd9d246b45e25e7938ad8ce3527c1a185a02f2dfeaadb9a212e3da5f8ba7689ff884c88208a40518b4a0a585215a409a4d39630a18076bd8ccfda999c07bbbb6fea96b0fb843a3e950f27b6653b04cc94de1e10e96f8946246ca172958aa265f0a1477293aee1ec54c388b428128b7281fb060c6c11f8bedaef975adf234a1d5d2e66c940d536d495ab62c6871a7d5fcb4190b341a0b321ac59b66c32b2025d1d13c57d8b2c295575c955a21079430c01dba53965587ee72ddf72c7155594328d7e2291343c1e2b55343a139883194988354a3a5daa94fb6202dddd17952cb7c6aa727b4273ab4fb4bac6ad3d0102d0ad54f5c9ff45a275c1c0c5262ece4e95eece424468d9a80d1440ba8b3adb90914776fc2c149e5c92aa586d496bf18975fdbd51c296593c211154594095e8b53d0e15237d1db1dc98b6b184fe1fdb92824da294a06e28d2fd41710ca0a541215cc501ebc77b75615b858555baa70e53e53c107b4375cea3a32d127330e92afa34f4f11983ded4aadbfccd84633c69b4ea10d0dd1a2d06be993cc73b6cca78d3219e3a710d2d212e3272658c012639b2913288e315252ce52ecc444875ad51cd596eafe6e8cf3a8fb4b5e6c54f3b6fa22dddf6bf194786daec4d814cb5ac3e5adc98bfbace90a94261dab9a139b968071f7d9122e164f2db9222e59a2335362c6ddc59912304ab628b9721795a8a04592a9c4f8a928ffd09094b82bd4d1ae59b4aab92ff7c619b78b76748a8aa4889a509e9abf488a48bc36572bc238eb2f315489f193fe12e72229a2ac97c6804b5bdc974cf7a52577f770c97b747f937cf16b294da2b3aa4d344d5a91b462121d2533ee2459bf2809f11b5715d5f03c511e92897c7d8a4bee0eda241dbf5513e9cbae397dea505ac634a42c7eed0c0969b455f9f5c6778644c2ec882c31a5bae2cc7ab4038dcf8e68b3a39a31ee9fcfaf2a5fe71eb7f1ef5b733d6f74e38b1bcfa89bb199fb4db535dae246a6b6746684c4dd6ff5291c330b15e0e0eef94c7735ba2bb82d79ab8d1a1a92fa5b35ff56cd10099e851e805368b9a88848e713d77037fb5724efdfea93ae6511e5f92a36caacbf440434a409de9789f2089d667d9c51936d6b4550484b444644e33ba11a6b0d0a29e3a38c6dbb8a78dc186771a9acfbe22a36635c91eeaf1645ddc43cc9fab8a29a9da21dcab33f2a8ab4f9d4353fd35885cd8c772d4b7cb41baf4dc4bb8afbc4e2e7ec364f9c937c59b3e689f34d143fe3a3f262d13c8b9688b649fe2ef2a9e92543434343e3576d5ba33c42a735d27fb1dd3bdc6d4b34be93ddb64b44196b8dd3754953e5aa138b9c28cf1251f8744434be932227a223bdafad79eb8bc7a21dcae3a4b3b34f26948764d2a9c2e6f84ec82228d1cc9d5fc53a112d3173798909a7ebd293f8e8622b8ae715cddc295ad55cdd1589acbf248ad7e674cd7f44872f25e911211e5df3ffae1422e30eead2e274b467eb6aa3b76b85beb883a45029b4c34819bfd83c29881b7725efe79aa33c9a164523695a87cb12dba8de555d5943235ab4b53323381abe467cdc7d1634a6fe12bdf69e4147f82c284a508f83f573357f9083536845c01461e2c92a366a671f59d526f28b9c501e251b97511b97e2d0d047511e9289f2602745444745524f64c5e5ae9a24d3fe28d21625e1aa225bfd2544e33b79123b118def842cf110b3e7331def90a45308e8a7c9ef9a87f000f28063db65da1a3fe1b67d026452dccde280908026931eec444d9801555cfe6c81efec8709a75627de2fc59fa71f9d990f191f289cfca121291dbe3e393c95ae5254ba6e1f21f7a39990310e92f76fbabf9fe94c88172156b78e33215048211aa72b0ef4a2ebc63d17eb13cce220696d20cddd4c320379e4ec7ea8cf55272a5da57ab0f4d07a847a64ee3c2af85cb5bb6d8b8a9e8686663c347710c72304ce786218a72b810cb8672560d9d9d54a803234245502757712cc5430e08c842b900412623b60e88e961d7347a8ee50e98099e96471f075c59934d4a1e9f83818c40cc6370818f78b836cd141ac9e6a949a05f101edcf46d8427fbee16cd26b69b5e13ac216f029761a81e656b311e84c04323488085bdcc99a13e14a8424be4f1b4e575c4e2ccb1ac215a79a850025041d31bfee6de25f0c42997bda3e83b00504118425f16fe4794110c1fd73566a969345eeb4614aa576655977d14e2ed7b2eab2ac4745455463cd5bbcb68827ace1d9956595a23c479487f2508d354be5ceade96877dd3ac808fb7e6e8ff5be786deedadce76a7e36493b3e793f879bc4f1c9a2dbb5b95c542445f4a5794a9133fa644b9b0de38ba92c876f38fb600b904632d13ee8025eecf48100284949a6a50f3470af5fdbb93eee7e296adc3e4351f777e64116c739dcc483eab75aa37f719307b48ed5166a4be2f27740e6566b9f3bf0024ea1cd3ae0c186c57d71b689d78afb34ab3e9b9ff1a8b7d5dfcf788c1a1a92ca6f9aa778abb5d2d64dd6c7ed44511e273a5b676b1349317f152e4b9c49a6a1a1a25d7da2bad2fc5bd7dc8eb422f9bb7e9e7160e6cdc1925b5c157220fbd1a5b4fb9e347f15a6ba2c713641575cd4ecc795fb8f27077ff8fc70cf67cd86b7f08145876fa53e9e707ce663e643e6e0e7700f14cc7a607130e3cd44c11e4f396d6fc58d9f9bf5e031e3b1c58e927fe9e5c165c6430aac178f968ace78cc768c0177ed715b874b3cdbd105bc12b263c933e6d9212b6bf666cba7fb77748312b83b58c4447988acb05159492b5a3d7999c8fb66d40642b30d78cc749439673abee8c8e23a4cd2e2aa998e2707a7d074e8805368628e3576153f5b534911c94434cb719503cacde1e30e6a30e6739d6990c5c16d671ad0dcdd7bf0c5cd34e0e1387f15a959065dc68be9ae94a664491323310929844af2d4445c8a0a97442861138dde8a9b32b072cf656ccb6f56f90c96c05bae33319ceabaf53e31c5b708a7eb126ec6e59eb32be2cf6650dc67331dbfa7ac8d8d6fd18ed4538d4043ee97b76b6fd7ca74ce9bee2f0e330ee2f882e32ffe1cd6210e1f4ab5bd31a64677904b6f6c719fddc039589b66377860a719ce98190e1707e9ce679cd3a1bb5b8f663850dc431c1f0733a64052331c0767375daa4edb9bd5f8d2fd3bca43c31babaa939add20f152f7b699cd18b59d7e9bf116f7cce6c946675663e6479cd568c05d57a2cf59a9fb385dc645a1556ddad8e64d79eaae484536d1bc99b5d79165bd7d59da9afb6b6b6e46d3c57de7198de995e62987331aea1e2bb367b105cc62385b7336ef6a7e9ec574c8cff5cb7106dba2a776ea196c8b83ba8633186e06a3eebb5ba96e82cd5ebb6de65e5fdc1d3bcd5e5c1c24ff9566af2ce0ec05c5b7cd9274f692cd5c65be685716f7abc3b533ca6535734171b047d74e3d7309f9cc256b9599f9ac0586eea846bb5b4e80b468a7ee8a4479489ddaa96ba72ee2a92962a2ba52225d74fb5c7745fab70d0d49cd585b5cb3ae5850583eb97ec992815368649d7d6448b27e5eeee70f0bce8afbf5ec43e2e0149a38fba84ddcaf675e19f18bbbd7ce99a7c57ddb93cacc83019c42ab9d5ad4459447670adbae2d22998894b6987917dd3bcdfc8afbae46b59d396de642ee33e7519e29e3e0192ef975264c9db97277906a7b66c91dccd5f16be4191dd7f68c836d70a1641b58a0da30dddb40e20e92656d8387bb0ef2c406995a568d4d2736beb8bf8dcad8c0d1abc3e4be2716f2568a0da19badd18b755d83056b64e160c6bb9e7847792896b2bb1d1631511e29221b136c49d28a6b58adf15485b369d63568b6a6d58bf7b7d5ab51e68b7b396a712773d559393885266ef3c7b1aaf1a44608bba2ddbe2736fab7e5d7d8c4d9144f52cc78d77c8ebb8a39ac4fbcffb32d0634f718c8a80e4d030cb893c6965d8deed76958ed6b7369e8287199193096fc3c9a69c2cc684686371a5ea08145e392ee13f32025511d2ebf46f75943c304c9d755dc4643c71d6f1d2a3b630cb893b1adaab8af699b3b834bed8c2b7e06eecf5802cd28e3b527290f8d56d68da5cc0003565d0e9b9165ebcf3233a0b8833b66504a7eaede32ccb80e97466570b95fc655595a2a1d15520692b08cb2529db7fe4c77db92f6a4624b32c03878b3388af126430b59e225b2c43832cc9ecfa61119443425a7ff2c35869931beb8975534ffa9c6c8e2e239064e8f21e4beeb93a238460dc94435e225a4d5f93fdbf4ad96361848c1c0c9d7b9e77e9c94a565c03838454a1429f496d12255e6292ce35527c610623cb93b782db5569f3f478f28f81793364cd356b5894675c58921a3551762db65fa010a03cbd65f1586a9bf2a0c24ee61f0a87ac10b6ed7922f58c2bd6868488ac80a1bd5b2ace30b90b8e3b6d5bd80475956b14c05e38bbb8b6068a9b24f8aba823183835368e4ef138ba4ada6986db76b499cb37af2ab585df3d7fca2bb1fb9cc055d5c5bdc1577509ba10ba0b88337fab906d12e005bb085d36814b733d6d11650b5e0c9cb1d1d9a5be0a036ed68b76641095890c541f2b725731d6bfeca02d359d043660b77077327a92d252f1e5ff75813f66b5a33193257f9ab584d66c9ada5f9d889d2c749911961056068cdcff3f64d9e8cc3156871d7f9aec08ac4b915e05081142ab8e2e0e34d773cbbb2563776a2d556fd14293c51a45050053e0e565da8821b590a309002d33d054fee2099abaee64f41c639fa8519f04f2af69e94bc35f79be90b2fb86d3e49775f94a5fd020948bbb6e94bba6b130575b8a4181f7d21cb282803a2000c4e6fec84822e200a5c40810e68ab1ab7a9f94f45560a4aa120963b41175bf3536da14e8025db7a7402f3043cdc411dc67d0eebaf95f59a000a9ddfa4f7477dd2d726686282d7182eeea0105da90ef217d36876c736d12e36bab68946ffb5ceae667b927e8933cd78cc15a8a9ee891be9ad47b2314b94690c0fea45184eb4edb359b4ef8ff99f4a8cd39f715bb4aa39247daba9c5dc79c98b6ba2786daea8ac24598b8086e0742d4d262510aa620964eebeab64dcf38b98045f3e93600b09acdc5d24c1d38bbabf24d8afbb30239af5731760bad0d28555fe2e96bae0e1fe65ade6bfe55975cb8c008cfb08b4e4fcb627c57104563e02280e4ea19d23a05c98a917d7b8d862b4545c70294b9cf7e5e24a73b1742d171db88b65697163d1bed6ac4dff59cac8d6fc385db72ec26df39176e417e92656b58988ea9eb8a326b76bcd5317e97dada88b767488c6775234be13b3a888f2107d3e3536ad92ca7a5e261dde028a83fb9e1889893a6d2104d22d5c5bd229045b3c155408acf8ef6a47ac75a578e72cd541b6a558539eafb2e52bd121780a818e0641190777eea9431f045fdc1d04c11512d357c1d9168260090431777721e47fb6edfbb7e6f29b545b315b4889e1e2ee2ee674b0aca3bed5eac92b46480c8f30661c9c42b38501e3e0145a182e9fc36c5dcb8bb1a658873922fb8019777087fc2a5bca3e00c507761f28f2b953bf4e481615511e0f78d95afc8defae2259e4443a15116d6d97904f4a95f5af2d2fd3d2fd72684849fc7c9a9f71074220eb801607ad9e3c6fb696abda92dbeafee6d3a46107ae48b27680d6010ada2ade370443c6419e5d597521982de5be38ac76a834d0c936ba20059942cc8c80000000000063110030382c188e884452c96ce53c2a0f14800378b8648a5a1d4aa3284721841c22600c00000000000000300400a242a4947caf40a86d2d8a2043f4b6a65378d87ae6a6ab230be45da167914bc20d90f0fec128a4574c60adf3063630b74488254ef812e75ecd5d5912a184e0648dbd6c3a38acf26b630308eb6bd7a1b8759bb6511b2594fd8a19c0b0000519e059de9ac31adf358cecc69c2ca94390fedc361ae99846f4121ce68c205e49502cc3391f58f1866b308eb459f613e311ddc805947da5aba496b6ebf0a33843510343f446049aa4326a37e516b78a1e10e1b8d56f126b02e0f6f4502bde60d6db12fac33a28bb704ee5c358c1c79eb3122a76b7c3ac0a80f35006247bbf75d9d4d9ae60cf90a1b4e92da41532db3e92ec2e17e59c8793fd12b814dc5f8a4feb9cc241d3138a2d6b1d98a6751c58e8d83b211683f54b50a83abdd03487dab59ca6832611fe9253075d680fc6e530f061ae390ee16ed95e5c56b71c6679a68199ef410a3c22eff800bd26f830494dd13e1fb318e84a597c1b6294b06dedb353990559984e9193d908970d06274a08dff4b3464ff42814dd06f2e95a850daa3b049bb9f7cab7ed688643db4b160c5fb7c2aa475804f0dceebf899b725ca23c97c835c4ec81fc80a617131e0359ff1ec43518e74e4abfa25a798d169c63b71bea6a0876f326f9594ff3460bf10deb64836bb63b129802c076e7ba8e20dc3ec319378ef2e82fab4ab6a65f629b495bf8f5b25e37cfa1b639076c8f09dff532b8e291b1e173eca8fb1e39dab46ccd9c321f1a5771164460179178c07e4cfc10e26c471bab3b007186501b202e8305fcccc20c68da954a976833cd217396075c089c848db8ccd07f53bc1e67e884cdf247d3d8376877c427e14baaecd9b47b570099bef7a97a8b71f345d6ff6dedfd69608bac7a8e2e39a75c728ec1ac7a7b5efc062acc8db73a68901674e3b1c2303144902400b5ddae592808188c4b9385dc0e9797ed9e89cc7337c8e7149b71fd5caf1a93b1deace9cbebd8df990ec661348e112ce0dbfa729e605060520b4cfe2ac85043b846e8bf5f689bb61bcba1a6138773228c4269ad81d8021dd7e0c2a08b4cd02ec0e2616ccc1b135ccdd3e57f53455a5baa2de4132e39380223eb18fdb65e909703dfc183a6a49e9d9d17d0c8a3f7924b6d09db6e7630e4103bc24585a948edac13c5b658aefe7def5b4b30cacceee55be5d96d763a4f2ca8fc11c7b2fa04b0d8036d77af9742c5271643eaed4ba91c03b3f0ff203956c2c0465a52da89445dc7c5cf39524b200768bbade85da51570a4da5e690d1156f16eff5323b2821b40489d8796938ad50dd605b1b1c581101e228b80bf78aa31fb0903e1960bbd57fd23ae16558def81a29dd2a3f97988823fd9d93d8e05c0ea3c3766f895c62c05784c91dc311fd4c53d5887e521502c6a5257c3793f0aa6a0d0771afeb24396cc5976f2b0099b52dc96ea8fcb818efea56f1c79d3cae5460ba2ef5085613c2116857d801d376db11764f84c98af92aa703011998ef3e7d0e009d5c0a348a2cbba4c89f4d1fad04f9a916045dae11a1fd29dd72094e0134e4a8be219c8bb6fde59f12758f78cb5e5692595101858adf0b29f5b7206778829db3257231a5d5e6cc4becb375c5cd6fee1cb40d98f205830aeb4c90208cf9cd3d41296dfe3269a7ed43d9b47782c2d031e92e5711d4cd5fc05e1ad14bd89bd43c0540555f855e0ed25e486a8a13893485030163ca7033f2578413b7f4194dca3173e90073acb74d78c47a50a60bcb16a02c4820a57ee3455b62a77378bf4df520be0468ced6d5b26be746edbb78918095016c046dc3f54e77fd82da3269abee40bb2a9afce3831b2ba014604c479f35cc441aaff21a35f3a7a2150c2b2c2007cc1a69910bef48be35cc274f3a59168280125d3437ac4ec80d185d8629d809d330c900a9c0f6e4596ac0d679a9adeb286623429188955f92033952c5df7746cee6d628bc82a612f27937147092c34bd1c0d48aa52758e8eeebd70e4bab2964cf61dd364ad4c38b38817ad349b64bc2af5279c71dd3d1b8e8ffbe65eb6ca39c993c7ba4ae14d8a4dcb1126b26859ec199d9119bf2112890f40d19ec71aaa58251a71b934d590ed45259536a8ceaaf8b4bf1a4fedaa785bd60c635a6b1a6c2c3cb8db5c10eb98e5d8785ca2e84455b7b7e9eea30a9f7296be652b83a765f95b390d86124a8c9142fcdb0c3c12f07fcc2043bab2101317b31fe0e91348d0b770b41cd71cb5c5d9188fa588e9a58f38d1ddfa851a9077756ab35253721e84df476e823d661c2132f25ebafd9629be55ddfdb1e7f8be611865660fe2e7df10d065dd7618c1c5c930a783cee06adf3fa7d7f1baf84146f08548906291fb79e4266d61c78811dc5ade2fa391ce8699d45021ae73718489538dac4004aa9fec4dd61a323fdb1fd206539adeac18d501629c7e892bd82575f2a3c11f8703f0f08e63fa4c6c2e116b11e7dd3c56741022753ada8a238e3c54ac8cf1cf522107fc17c1b51fcddf69f0836fb89fdc09b948c152ffc88dabf6e876e2497655e9c4ebbcaba3d50a49cba5039dbb113eca4c5569501fd4f68b77157c65cef1949e3b9d6e1fb3c359024819fdf5975525d37963bff51d4e410386ec092f129a71c65929372d94f1a6ec5c61eff688db14718766861564693771c893cc7806c963914652c75265bb90cc146b0b63a37fa91b627a17bf5b14f93459ee97ff4f7bab8826ff5d3edc58ece21718bb3be5f5f608a60abd0b8e2019731c17422e6e0022f052c9487d9540e3ca6c37d560bee41a03887a871e40dad42a752b4eaebbb91367be22c87380f22b28f32a229d7e103d39c97a811d144ba498074752e13688fd97b1ca330f1e5d7b06f84362c1fc061a306b711008a1d081c5b786ff24192c106b857ab43c529df37559f7955acd45cf2fb50f54bdf6ebdfa4dac735e98957a5ada8b2bdbce8fd8a43595068f393a1f30486bf9156deb148575bcf944788b9aaaef8ae3a2cab9efba10e6c7d0ef63e15c0ec7d0cf72a7c91dc38bdee0b4f08641aed518815c0485f27fd12b920b7e8ac7658c52c84e32bcc9e6e6669458b63dd922588c0c0429805348d512a87112433df46891ffeef80cd400752384490554874fb10204f9e9b4c7d81b6ee5b1c3837047a3010da714faf243f281d1af4f3cd0a3f8ee0eca5842b4e7a2be32329b77a2db0e5db2da37e0fa71ca73f95987f3318ac78dd945b1e6a605ef2a71fb72bad2ea8491a4c0030b0342209cb98a6b1d32987752785fdaf9160d10eaf620f97cae3a7473f813cdf03255a9fae097840f7681973540fd70f951540b073d055282b06d4acf880c9106af8aec4b237ad23da49b8571ce976ad74f22303576cebbea854c77967f862cffc6a9e425b9d246652b0211d61c00ad1e7ee04a2656291f7f66669d1b66575703153459574cbbaff7393d7039e0f0f93d40234dfc850a84d597c1852271fb56a3e185dabd41971ebdab0d1a5d3006faa02545a3fc37ba23b5359cc672103a05bfe4adb3127747d2ba6dbb33269086b4a5e050024aa7b5bdfbc904eb13019e5ce306a8428701846e95ebe7dc17628953881340b5568b1cb43b6f89a6ad15c5afed95104643d886147181fed4dabcd61e1c7740c1ba0df2b435c78133a0c80f3ca024864cc57e03ec7404da9b63242eab11998c4aed9e061e48668539ad4d3dee42fc8e7444df14cc0365ae61983d48369e078a9cec5f8f7943959e37233584eacee5cb0612f41a7b36ab6dff11a5c061532a51c9dffd358addab4b8e482b19df67eae8f6c6c8d2b0dbf0330966a124fa037b000dcf857c0b169c9a6184be227ab0bc75601f66e6908ea428f4d6c30047074a031b7775eca8a30bf4bb8b33211ae16ed10afa6602435f94bc10105711f455d1e9c39ed9abd7ab2ff86d629566f38c1a9c4cae5ab1ddd6b041b7bee8dc75c53ac0e3bdd6cd5d68ac00f6ec0a561ba8888eedb9104f4bb7cd74e4293d9c2ecc8b9315f683e7bc1a26b8bcccd0d03554317677d41fe03ca55fe46006773f83f9aca88586beaa61197767873dbd7177f53b99fdfb957961bf7fa5da0aa61d18082791bf8e3d275b8e91f8d713bf7377d0905605cfecdffd9de5298f0e9fdf63af6c11a8430345f983e41df7ef66c22fdd39f7928ad88a1dc4f3d9390889835457781ccca3e0ca4790fa88cdc06b981686831e0b11d3f2ed1f6b1496be4de62b0398ae49c4944ef23072933b600461acaaabfa661a2638cb0692687a3ed1929758fc5e194c46224d742788c53d3025c8c1c987132e4614e8e841abad5cae229bcc6e83c0c3011d5d617ac89d63387b1ee49ff10853f1861389c51d8267d7b7835fe182a8697b2ba3203dd8daae61def1ab272dd3e5e083eb80c4c948132c03c87981af1cd2bb333fdc7c7e3eeb8758cc377458d2bafee040e6e9f72243571e4df6ae67ac3808bb458826bab29a030f9c08db6b220c5334729b7d3fa19595077af673fbf22da884789db79912f9be1771aed99666e34b0bb7203973093ba55ff2a76109cc623041f32b8bce392ebeec21f78231d93a6e8ececa2beb88c37fc33b9326559da768108b3c7d4463d404458cb8b179c1f1cd6cad1269bf6b1b78302a0035c2746ec9c2b84f1c0bcdda1b7a90f33c957db52d18a8881947e810f7733c16ea5dfa666ecf35f514eb71655a53561da5535dbcd786f13d81129ee297e7e13f9b57d818ccc2609b706f300efbd65e7b8d7cbdfaacb5f4ff0e25e64962ffc12e8ad326bbbabd8ad2440de7bc007b9d6846731ce81c74576f093ad6757b98b7fbcd0928270b6b46c9f06b073f8102c52853f4b665536e789bafe9f0b254e0cdc4b431eec6fe74e8f8766c635a775b0e55eeeccff9b77274e1c29070b43a2d1bf5cb1ca596b77772d0aa432bcbc6388e1bf43bbca732cd87b9d9d552e1a63c1f744b5da9a8002a705dec7b70e33d4dcdd8f45bbda411cc5dac33cb47d351f99830b3fbe39c01237652f69e9d0fb08f51a8a01128a0f4a0e4198d644147f4a409e0abb3a0db11550503d6a1a5ce7d034e89bcbbe8139f5ba4f32a7562bcfb4f3e7c9905c91f20fcf09bad8e7e0818e220c03ea3bc7d42b3ddec5caa3c8195aa034e466f2bd6b21e89c37949ad37e4c53f5c8e8060839dbb832a15ad2451bd88c9e3d5d669f0c9db6af0c5d27c002cba277174f82c914f9cadc28c33b03d47b04992f64c8a10b0e5c60c124eb171b00d2c4732c7519fdd920fac3e8d8c2b6f4000a9aed34add05a177be3f8c3e6944187178f29544741693a8ce49f3521e41b21d8e983d89046f60e0824651f4748e2649d701c1d7e736aa3b1a758bf6dd52e39c736c568895c92b18a602b2bd16c595de76a732372757d1be5904b8bf0b076067f30b3c1b7ce7d5dbaf272bde986229f34f57be5e1b441cf445b629adf841150e3c76418e2119321c0467506763dbe65d4f4f769f47593552050e74541aff423c1186959532ed21684eab88b69ba02a4bcc0e8f71df1dd1220675dfcb1758953b576e0deef09448359776d1a438745480f541290a86cc6456648ef86def693ae25c5ef9f28fcd1585b4d15530d86ba46b21f6e2db6f1f9241bad1ca091776364b80cd3c3d136e53c3d125112b7d0a227819ec31771f2f46ff874703d48329fbcbbf59142846ca62a808df258f56f08f3d449d4d4aedb12519f13ecf86ed2a6b2c3b8b9eb2223e0922d0d9933b53c2c4966eec2a3f3d3ce556fb95adcadb8b6d4e6e625bc33ffc195fb3f6be70bb3f7987cf2cea58d388ae4bc86eac3ce6321f06b47589364a996e240379e5e39481ff65aae11af122f17e7ac0dbe92c3156d1d52161ae418e7f2a64acf04a36449bb7b7003b3bd9ffbec2274cc14f5b466cf4833e4b19f43710601a118ce014c69edcad134a065077ae871340c61d6a7d47cd2f6f5aefc9a2c0d0b98a1bb5b257b11915fb0fdd9396279269c11867a848e97a6e9de433ed42110bd2974fbce69d7a55581109f2a1f9f4abcd300a53d59a726c8c7bab233ca6cae15bd4e268745437dd7cc8f1c2d1c868c50f20da96f1c5e47aa5991093fc29e409b57944f9fd391905f156e708a754305bc733ab84c6dcdd1e66d602b3107c07a40e4959ccf0407fc8cb919a63d3084f4c1e2a1e5cb733635f665ce434f20da115039d6c300add5cca807edb4b41dba7b877badde1c9b9c32d571e8dd8f875e7a14cfdf59a6d6ac3868d78cb63a9ffec218b23f3a87afec8d2821dedef07c93b0338a8c8d474741b7785baf0b496419b71e012f78fd822de46bbaa05d8efed91fc8fed3f90195413ec38f5121657486f57a86d636152d4720ba5a73f01adeea57f121c30d408529982182daa57b3a514c027c17f25af6dcd3cd6f0185370d72526f689b6f80f809d5da38a0de6471f6136753db13d63a4f9c7d1cb4aa9c99b3862c5c025cd12f3b409c60978f9f48d4c3079bdcfca93dd2568c3c381f8bf0c19d7aeb4dd943cc1c636ff0afbd3e6476c3f8ef026ef2f8a13f7a7fa54892bcfba608702c13a1bf4a0d9013f7a27e86d9adac116b4a59961d9935d9ebbad15d548e18f453dff263e4e27e3669d8d27e6fa980f5852161874f74d9ba83959a56112fc5f3df51cce1a90c0b211e10b5d65c860e130959c066089eccef095cf6167d39b4dfbf90b7bdc5bbfec34c0ada482cfdde98cd8d885114cdfdf1fac9488c781beaf892bbc8b1f50c9e66fb6c85b78c17a9aad0948d4ec112e1e72d920db1cc08640e10c9c9d7c8e1a276906a511cae32395f938fdc37038a2b9ba94e883f2f65a561fc24e080aacfb93594334cabcb3c5b2701ff148dcc017807f5822a5902eb68a53e19fe7095f5c79146e2d2d59d416a0e69a6e29c329e3da3e893b8c851352206d2c97c92388b93cd76e761ae9af4f83628544221c439e386baa3d4636c73064f501bf7733ab507265dc3038f40c2585c1e7de58d865bc35ce3c2ca7d79bcc3b7ed21a4204fef324bdd53061c47f908c527db3281ccefb06f1aaca3d0e0680096e05ae573d98cb0677e0bfb5ddb97fd09c66bd4a27b3cc2acd51f070480f228b79e8b9bb33fa55d0103f7543301dee3f0e9da248a7c544bdaebc253f435d7db3a2a468724e063714f7094cf9395d0bbb38163e7449b6f4110f2447f4f3650bb652327150a2f744c4a26cc48fb3f5512045bdc93d47482dd0a8bd0dce7a1a6d301ddbc98165881e068e059bb0402e80dc8ffbb264f36d700018011602214ef9099ee221c5cb15614a23904e33e58c2e71af7e7d8ba5589de18b8dd3318e244ed3e5c3ddf9384c341fbb0494f0b6f1dc91d39928ca0188bf8f570d4f3302bfa3c12d0e0738717689505cb4f116630be4f3df61b0fbfdd0ffb23f3b089a246c5c54a5317fea31e76edcc1ad7d4acc6046f2577b37d8ca36c78057d5ae76005f85317d41810d2fc2472ed8b0be076a17b2c8bbbb85e840cb108407fe464cf376d3a6ff154f6d09bb487026f4c64e896fa80a33685caae3c173b8acc32df56ac0dde4a92828fb2a297e1aad6d060e89f7a919b0e6e35843f6b334f760b0547649e06a1e7d66ea0cc25b429cd74d7789aa1f7dabdd2fe73c76e5883af0a43ce030d35711d89501a67f330c547fac623cbdf874df7396aa2832595ccb0e828639cbf006b8cedbe6d72dea9a83ee7499b41b73936b03040e117e601daadcb23909c0f9c594d8ad848ee7e9e12e0d6a0472584f645207ac025778e212d31e7ea41ef20e53526de45cdffe5344f494272811dea996e1fa15d711587a95d4c01f268527d51565b62985526682188db3064aac5fb520001ffbfcaf43123bdd1eb3fa1877ea3a4b57e0015e61d940dbc14427ad6947d331e2cc84cccd839b272eba7c8f2e5849afd1395190c634fd5ce501e52af7d2762f8eda94841ec9e644de3c17245438f212f46de4878d6a47c4b1707a140253a99de3ae24e7142fa825b4542ee9bbe07944055cd39800fbd73f98c39611fccc2c89a9975ca328858d57ea4da7dfac70f90bbe85852927ea01c991696012854d5817db5949a721e40603bfa642089c3a27ac885edb592b29d04cce8d4531bc108ed86036f166005896be32bf30721d1708010d637e86c6e18401d4515bf3d72009118fbd3a8d6f1b34875f87d39885b43317b46906ecdc5d82cd376ff18e79d23bf8c0480528d559b1ff825acad3fa56338be42ea7ef957ef5d50979aa42180976c018a85ebd14cb98c25f129a147518580ab1f67ce95edbd3a487933a539024526d54b35080dc851b0ec2da21110bbb66db5b9695b48baad9225f0c6fb40623cd8a4fc8bb2fe0d4ae854ebda765c1009bb0ced6ad4a4af517467144081a18cb01c1b24dda0c95be9e074182ff10517732e2bdc9be1552e2a509f02644d1e7033047aabb27fe79711c4ed05c01809cd931bf223c0d5e75c32e31464cdb312d00a40777f1ce170302e507b278eceb9f710f45b450a450dbcc6e283d552fea1c771aff5e06c532600a56e5c033990e752e48e4baf863b796591116bbed0def1e681c4e922bf3890fbce60df408df46626415d5bb3df03019c52b434726e31ade970cad7df969b360c21a987575a15b5e651ad366072a81b8be6b308c086a8d3c6d9e9bb707c8b201fa1bc5f117c2c0f8f82bb872d93c6d30eb7c1d6bcc209a5dda1de6f25323aac4baa2dbe13162319811d1705e3d7729f3e2f3e50ac6e1e44ef00ebdc9c953afc331a51ceb62027e89f82bc31c3fab9a0d6e9606463181e741844a940ddd0eeff499c43b83a5554b978349f790780c1651b33894ac840b96109afb7448a9612e6a16d6e5d521c8df41a063621ccedf6ca4a64485f858db658f074bee25a4d6f3e29a8434e5d8382da74427b05307b4ed882090466bb06cd5c2ff92167159b21beb201bea790465a267eec2c9cfa426629c7997ae8c0aff2b80064a519c7afa7d92c43ecf5197ee145a887571600db7691c5f56189232bc2269480802a6b3b1a48ed9aa17a3b8a9457738639e5c9e8dc34f4380f253803b9beb9a121a00c7dcaede2e876b22bca907107bc36ee30b867cf2517ab9e109bffaac8bee2bb2843032b01a0a6d3b5123f7c19cdf742fb7d3136a7e975771b522bd8a2ebf8b11a68eb023530b6fd5873e3a348be2b2f896ad0e370539579cf1578bac83ce79c50b59fa56364b3c7eaccbfd3010467254f526d8155a86057d6a13f0400f7b8ce5428b0affccd01107c514f9d0588423cc6c8d22aa64f04cf27a27bdcfa3ed2fe1eace28ce3216df3f4e650434553db643170df77e5392cd48ce4fdc94a21eb3b321358bf685bed0cd7b81d74a8da70ff699617767d7979ec5e36865682c73a5b683b7d0e827898033ef077df037a8bf4e4e824bfe90e4a147bd7ec4bc6926dd63e498fa46745a90e769b25dd7f66a466055046d127c08ec1566fcea300cff48e704ee09a466303ae4f2af9047b51cbda7516f6c0ac23bc5e289caaa3d649e8a4670632bcff035603b8ae04fc8741b62ee8361fec684e19c2fa8a240b283fe197358432648da5d3373ccc55f8c6e73b9177ac1c04470c65aad5ff96f2dc8335f1f8f9aeb9299b4e4a4ce64f276625947f3d18c24159b35b9955a5ed7e1ec62472bf1cb6854a46ab03cd57399162c5ec92c6da4bcd7e695432a7134f9b682dd8c78988a7019506121333fa12b6609100f476cd58d30a9c5f4f0eff726d2338c30aa08cfd3554deff7d3ecef41f470629101fa0ae97f54ecd8790cb9a1c125ab877da0c89c7b6082f1066ab46c464b1de83da9bd1c8a29fd582119d7b7d400a67165a607ac985b96471816518c44df2467f7961614316c38a54ea8e170f88d1ee2714ff3bf0247d6a03668e5669358f0f337edbfdabf52c06c624df51be78aff0dc46c06fe90bff90f32c1d7a569835c2ac33ed9ed3d7f382fe9087589f270f575c3ff0a2ee527dad7c21e08274d40ed3b77bba23909abf131929669321984cf33702e76b8375f68ad92314508aa7a595aed7dba1eb8a24fc8363ecd8b1286d422d19f7cd38c7938e5a693e421667163847cd32700c8f041c7997b247d45b35548791484a6bd7086ce7b6eeeb7a2e868a0700afefbd2f03fe2688f77505190ebf17a71f12a0969a82f3050ecfb6c9b20e116cdb65d199953d3d597aa66e76cab7ad4cb2873f5754d71bdb02ebbc44e97d2cc41829c5ad3d66dcc992671122fff43c905152448a7434b68e3e8d0c2a32a3f0e1a25dae6cbebf4f17e2318f788ddcc901be8c6cc31dc2c61ae7f1c22b79b2eb5fd7a191b7a63e5ae42fc328dac11e065ac87424ab73e0ae6cde0436bb82e8f6428ae809c2f97411f2595e3ee8dfe6605383c354c6d2e790f97701eab8cfd45faa4136a7ae37abdb04e4ac467fce8dad7284458de002e4fb324fabb8b114d9e6eb01b9b0a2dd07c622bd4035a8cce0ffec55a2a581d2917faacd81b15de5fb0e023738c26e539bfcc648884543fbf12bc81690c45cb0ca6255493297a1d922952ee5bbdd5b5087771e2bd87a13bbb8588efe1f586d97a10e1ac48ef5b4fe451a34c937e70b516dc4ddc43d537c4a653f8747eacc75f64f84dc7f9a64e6875234643119e182dbbf30468d9a24e37324084af9f5763b95039649e4081d3d43c90c95a2c36a0eb9669ca8b06c4720a7345be1140fb03ac95cea190ac984975dec607138d091c1f92bbce8b2d226c69e61b043c5a0a17eec7615922bef7dc068abf9dba04067dd9ad839d9505694adceceae320ef3cc92f6726cca5d250502f1c0ffd901adddb4eab0a965a253d4c99c695a0a5def568d49cfd1a3685bb80bb835577530a56894d0f30db48bc4beca12657833435783c6b4d0484f2b26f8c69bc9955830b8facfde87ca3771a03652500227f57d9333bf4fece04a1659c3e832c35e24b07059f20d7928e5e95013b67870c8f7ea94671c69e3c0cdda93c6fd28fa964890d130113c4f771e115ae0263d8a7dd3cd59ab82f9965a36c7480d74312d7fbcdc3a1772a8a72f0c1254cc9ba00d7bd0ded67e2e2e3c41fe5b9248992ce3f52d69a86f05218182d3f90184cab7f313ba984114db776136cf369e090501044c9daf8c131a9f79413e41c0b4a32e1251d94638ba54389035cc4ac2c4ea4363fc212bd797038139576c395525f7c1a9b878680eed45c687c8aaaea3b5c89f94e972f79198c4eca065c00aa2e6e51f5639317853d5d67fffce91edb6265a1efd9649c3e11ca76ecfc37f117cc43922d129a29d10e988eea9de6e40fc5c922d6524170ac23c5ccb687b5f0c0f9012028bc6dc0d6585c73d0be3906fd2eca7797b60c3ad3f96b2a2affe680e4a9ac8c25457062c11f3fa9e448fc1e69bea68c62951b922296f238077165aa99f50f424292069356eba6aa2b5f725c6130e8d3d040a4e9d51f7f535441cdbd195c8e8379c602291c50c86d4bc4c1f6b6b88696c534f9e9005da6da789c7528f5dd0f2984aa05d8a0d73bd6abe224d080c41e8d6fa150c2eb3322fad9a60fc38a928dd2d91c2fd7d38232628acae57ef00af9644a3e5f2ad37ecd5d0e8227f9afde36da36dcff574d3a662d464c76e4ce08d6f149fa21c4ce38463ed6f5d2510cada4f13bb847e0ece7de41c46a0e419c01275fa6c3bffa4559a3f8ae5a9a51a1d929c467c2c2f98bd1accbcce4899f3cb893471c299c95ef35b4d84b7b9c4d995880824df49977c711ec01fe7eec9cce08987ab829b428779bc54939ab9cfc931218dc8d8479cba05e4aae9feb0a2d43be5979a45f2dd46c0b5a841be90c74c7108802294f1d104489cfbe06856d4af3488eb80e33b48a6c096189abb6328fd0de0933bc3bc0a1c627fc15113081382790b2f1c59db9169195b4e184907b08016390c011bc4be5f45ae496dab5210e30a5b53667f496d9b9f595f803cd37bab23cb20a9c76c8173f67a1ef12fbe7b479959eeece5c7378dc4d5eaf3db731bb135e9783b1982f5a7c676a71f23064805eb09ed1ab79ad9e8fafa9ba5fc2e8b4ac1c25044b4f5b639ebb54a2152237c0cb5b156748f6d358869214ef9da89d2980776018c318527fd0566c1f205712fd0bbe1d75214bf867528079c5b603dac8f6aa00d2b4ed5bd9194b9d213cd4141c8427b7cb4fa55a48dacba6d580cd6622a5d0af88a1837efbfcdbc62e4d0385b6576dac1b6a0566262d0691dd2af6c71cf91cc60057a27fd2b9d420495dd55180b45c6d837aac4a4b4a33e230dbeac78e746795e187ba3384772bb979e63bd98ba0b9e854446ff6b8a60cf78a2650af325dfc19aac5d96a6f8df0fc475027c5baab491cbc6952172c4ac426e3bd4a46e7055d7c6d08ec22ea7a008ee2ebb05178188100d9f7754990745bb40a1deadd69595f6eb210087e423fdf104b2e486df6737d805fbf08a2b9862ef8753de4cdcf71b14e37464edf88e61f25d911d69d3c2c92065f9a3f641904ceb6ee2821484cbad6178f3a8678271fe6cad4afc18106c4cf1c609d116091131a2fd83076511e91faab225cae47e35af0f62b4c9f5a42e09da06cbe7daecff10da2d01e812ea8cdee8726213b3d2b67e2d956d7b37cc8a027047a2f18849379777987e02b18964b85565896c8c30da08d366feaadd48ffef809e492f090c5c3a0e44c030b91736ec19c4b5a217eab6854e709c84589dd995d770a359897ae1c47fe8f96df739cf7c275f16c9d643d7b0e1a5983f034fe1c550680b3a8598610cd89584b6882e21d28a389c7741741d66792d34d4b3b5bc7ec50b1bb762784b28f94ee7341cecf42c9d6f33e9813038598088a956f14d5ed10e43ef7e327a2968a9b629103952a45300117a261e1cffc2734382a0bcceef5092e767b13a1c935ddb236f191fe52547fc867d04b258f87a27a8eb2bfe3cfa91d19b208bcc5300364472f95b9c835b21ed891f3aeb827c55dd7829e64e0bee43ac06106a824e861e64943ba7b3c3c4636921811e5ce6ff44f74a8ed4844bb48a882e7abe0dc3ab7efd833c0496cd17178a91031030d778766df72af88ca75ab851d099c8deac514d87c3bbf2329a8bfb8e70e9b3be7eeedcc3b9c99737f344243beddad2ea823f69c577db5e7c74bfe922ed431870ad63a5b7739096d1b89d3c6e8e7f8c14cac4221f785162992e74ffead22b75498c2e406a2bf5b94461cd252f0285034622fbe7b80c44fe51e66015ebb263eb5e854990315095f9f6ccb2a980e43bf8a63b6e33a3c3c6654bf7abb9113bfb7f684c3e0f9066bd87c936c22d64e45e88e3f93d955d0193af801e7a5d156e3cf61e8ecfffd1a004553267e96d0cda0d4369a0e886f335979a755db742cb7dc01c0cee55adc85b9a773a915364889adf5ca82ba23984b34ddcb278218b90b1ceeae397c1297305ce932ad9ceaba2ad0401ed72958b64eb1053dd6eb04d836e10b82487940fd75194b491b6f16c74a570966cda157354347a39ee92d5b9a79995276389674903fc709c8f865115e5fe9516978d53eff389632e4bf49aaec5097423db3882381543da126a35acaed80f2d9dd51f36d5974e29734f29b34181c0166bd0e43c95d45cbebb743ddacf9d28be38e9a7ec2830bb613cd9e34d56569293aa183972a6bcd3f021261df9151103c869f90ca875caba1336783901cb2560159b0016c6552b934da25897afe619efd2656982933808106b07018174e3f3c1ef361db773e4c6694679831e29ca3dbb301834ce6d4d1f42a4af463ce245a0af0227d7c1c95ac60611ae0894963484e7b4b57c9d5680ff30d1424904922b6ddfd0fd4ea8fd9abba60b208ba44a3b1288be51600162f66396dc8938fe58053dfd130972d174d0eae726d252cb38a41b9424f99547363d00d548f1cc8a60033384ccdcdf74baddac3bef59f188c7b3a29a296319692d16d62a7f873faf974a903886505154c41e1bf8a2d0b9f21efab68ead8c1af60e8a3fa642cf25757cf1cf2ee1a32db8071788ee97714dc55b42adcd0f301fb3303e7dd8a2c99ecb480d004fe006cbd91059c124d55865760d0aa7226b1dfaf37f1b275b6455a17adb433ae2b22aecc9d6b403816dc58e1fb0563616b8f5acab03c3202c93ad2c20ffec73ee24cdd802ff3921ca8ebf47e457ac471576416e3b6791a11c62f659f61711bce0941502d32ff0d741211fd1ca45e472417a30b848f341332fba21cc02edbe467ce92ebb142c0182290fe5aebb030eee4ac3cf1c759148df6afa8a147bd79be701ca45c9339b7460c06cd3ea136f97403c12e2801512e90a020252e1518aa73b708c9190294a181d40d805854e1e9eb83735daf62cf915788c5313fd849094a02d4532d3a36c800a9ee504bd1ba4c36bc651386ac3109e3eb85e7cf4ce58c2951ade425647db4115c88cceab18b2dfff6e4a11c3cc358fbca4db9624fb3855e0037e736764da3cc183b1092f880d22030300b6d35afb6619393df9f8be098e1adbdb5480963234771918ac70ee52925570404e5306324044b28a713560a37ec7c0ecb32628ecdc809b3c2cf279e63aee920c8b73a60ed72161239d8dc6526bd9aeb4e1b0342e9d9df84d4bfbba94f68d4a326147c926005522cb1b34c2210730d58490de128d9b6057d27309a58ff01f308f47b927e81f10564d2d41b2cb02a8105f0d59dbae86e33811aa3dc5994ed06d838e9d94ad86224b7e810be2948c4f75eda32ca72d319217135d0f965aa8cca688a48c28ff5cd83c2a93507be2b7cf9f49f8940fba268e6b102a6050ec1e40e923c7e07a8e86d0ca54864af59af82e41d0469b84412517ef30f865f82cede49b95c2556dbf10f707e80cc42946aefe1a1826bc0fea3803e80ea318eb9d4ba567812963a11c3acf437b6aa4402e339136503059f9da027e26dd3268c8a941e130b7a009f36274a0747089cc7b3837748346a563c49e88ae4b0b363916d2b457e8f66e9e201b27cf8f2614c2ee88989a9c5c0cf264f7a6f663ee23d10af694ef40688b4526ddeb01674569a6830c60574a826e18b318accf052226b55bccaaf97f4713454efe5cf335e96e348cf05016c1cdf151f2ede23a2b9373c252ea1d94dad157f27e3a960a95144f11ee985bdc38e81e863ef15655b462d79c41e8d6406e4c31ced791e225c2f6b828bd61cfb4108e7a2c3838846284ed6aec879221c8c1de2f01c7334e229321c9119c54f90f0eaedcc6aabcaacb71d99e42f583b325f214f4f335a56150528a4cdb63e3f86494ae8c0ecbe3823ab4ea6e61a849e2fc22ce7abdc727d7423e56ea37982e82d03fa482993afd7d4e84fea21572654f4a04bdf44b83685486fe4438192527c49575243c8e4a271724868fc6e78a907be3ced294299323a8e85b00e5d9b3cc34fb60131cde12913b76814d278bc790cfd2d7af9d129ce9c71d285556781b01dc869afc7662fece00fd1aaf6887e5401546acc6c2e7cdd1eeca5543187c80475b950541f4566b9203d3e70e8f65cebc6de05b9fad8c679e355e65b24c978b1e415aaa50e74017056bde602ae463405ef017c98927bc0ea9963926bec0ebeb5740056275f820e9f039ea3e0ab8d93c510f20c919d5795ee7e040a3da355f179e277f01d8206f78f0ba2b01ff61114b6a8eaa4bfb78288479de3d60ce1acfaf06d9ca30ff99a02da5919175d42c4b00e1277a7da043aafdf231076bf88f56e0f8523c61370fc752848c514822dbe46397847e3bc889d5ca0725ec6336070bd396d2558ee88c48fb85deab6c31767ef76b5b2b96c6dc17bc7f7e87fd2916144957da36e1c7b79c142af2bd07b53ebb3931e66ed4372911c6dd10e87b8a3514bcb04920df5d69db9a262f4f3be6ef06c010902ddc24e922e6f16e3175fe7c2c11bb32b38fe8f8e2a66e6a311e593b1a1013a6af94757fc2daf6e2534c3eb4114685107e11f7510f5986a5095a605e908cb319733f2323585ae3743fda7583b692379a275b9223ad0b8a2246d72e31c337d621256761ea68283a198d2fde9d58746bda697b3d7ce8c09dbf11ca83f77f2ba66f7a3eb1740d28777dad1330a279c805b4df5187b953e1180856930a760e5b026731272950c1f3628250f459fc295a69a664dfdbb699865218c0fc817dd2373debe6730f539d4e3b045ea907774b71e15d062129aca8d6011b12ffbf4ca3ecfed836037cf7bd0b55a9cb1bea5421d497be5a7222d992cbc4372b0b701b9c9750ac4f2ca4d5517722340a74337117afda1241ba760ea0c97f547fc07a29b235fc62d11e2727aede2fdd7b5121c4a2d43f13bfcae8ad2e3ca718e6c89c9807eba3013d1f94444eed820a52f530b75a71871dea862413a874e153c48fc1e99c0ff2aa1d463acfc9c2f19d70fd60d0f964f732cdf16a2917bec27d67a195bff9039f825834f4663f87427059bba2a81f656cfa692549e30330af31896b31d752e387958dc5f0c6befc665c94f69211eb33e5e878de96d5950f30981212e84cccf0df376bb9e5959ab332ecd8a549f019b51dc946a6c692db92c1ed4f6f59dfa0a95a1c3eee808258c9a370b940d1509b8fb490c8717f3abf3e2327c10bec8b33da0bed31458c8a8919db0be2b7628380272388a3e4961d52dd6daeeceb50e5ab49f79d401129fcd51735ace8ef3712a30f3a19a602ee00c53bf558488e0dfc84ca3d67437c516ca60dd5f64fc957cf4120efa6320c09e669cdcde41ada747e33e5cb00eb3bb602cdee9cdd735d64b61f1a16ffd49533e80093aa169e64b9733213906d70dc97cb0f435fc78cf5dd71413125e9f05c85312ac2ff33361b65675e3c5f5da1112dccbdc682880a43b2eb1ea5d8730ac208dc74f1745b1fe72944a88554617c123ddd8e25aa123f8e65e0bc16f53fc330edc1dd5a01f7793fc5601873bcb6a92b7e01c832ac4fafc3255b36a02a664679b90eddcddb9918586fb70b17314324dbe23ad371e754d8d935c3bbad892da3101e5a62c51ca5bd493861ad6da8f13956f4bbf424cc0ed0b1b3e7581d58a358e8281c4f1e28502fe5c1af35ce6525fbed66002e77dd342f30ea7b2343b75b117f9d6d4c0cbc110b7cceafa3cb90edc12105b8e023605938feb2813bdcb7c736c8bc3127ebc0de5ebe2bdf30f779736a5a4742bf411c9a1db1e0941969b86ee9b7d2491ab3692721052cfb16644bd81214e6b465d60253867594717509a5eb4a5bbcb8a2898ee3258dd7ba33d52121bf43e59a0d35d22936196cc87b80d1377e8c4d02b2e25b008b75a16ad1cc1bdd24d06cdeae2b3efc76b99e521bbf35398b2e21293ced4e8e969246fd20eaf330b0a8ce2988ef38ef80ef4bb6b7e6adc66754e1b285500999db0b0b64d1897ab707c9fb89900204e8c7e226059cd4b99cbbbc020770c658a2aeb3a44d22bc8b9ca37fe146602969c920f0b78e868b2c94dda81a1cf51c2dfae09cb67f4f59aceeaaa0959ac4be298a1c30453414effdf7c4895fab5caa1fc3b50481bba2156e3c4642dcc3a1056f778a20c998cd591ab57122b479ae389be45773e751278921b0c7a03847c0caedb9cba9a9b6297b45d510a3eec3699c6408e01bc262b26064006117e49c0f58def19f1e188c7873c53794e8d7cba6777961623dcab408f867913a8922cb26eaf57164a331146c3ce0bac416147a7513eed2eae34a4b1b89cace63d80fda90d5b3f284bd815f413cd25e28dee664af2d4a5cac71b7a7da49bfb04c253e8513faab650a1a58b1da293a9e897fd17a47bcbeb27db8c47ea902a183aae8369b54f03e9fdf256beccc0b6cba865ee98a0492254372aea82ab2221eea99315126cf4a7ccde232f082138acd0904eede0da47744098aef5087f58a5425d282da84aa3d90ed42545d11e04deb04418e1d4ceb933a34391fd670ef0c4ac8e192474b8a1874065f2b69ac49e8a4e51bbee100a3de1042dc68e1d6f7acffab1f6230c00ae7b255aab618880d1723361dd06598192d3dcfc46159b534847bc26a24688d30be649f786194a4bc8e425645a391ed6ea89d6e30469d984d62d85e29d2e8d5a4e3ef868f19db23eeb1c678dc1d7899d5d3669c7654c773348629d3817c3dade0e83b45aad581b092bbd62d1af6823738671a88446fec433fd51cf27c5dc89d2b063a4d399675e44856d76ee420c449b8587eb36364c02883a41176805bbc39c4e519e001f59a03f922df212a7550e2dd89a3b6d726679230f47d71b14f5b8b381d8cd36eddf3cda3418bf63985de4bbd896a6cfe27865a2002961353c74884d9c4be605e615759252879e3ba4583dbc00f643314fd3c07263373aa5c5429a1da3d3c5e0e779bd53dae9fa0de2002b1665a45d025035858ff6ea8218db969b6f560a833b42c36ec262397da4874919b4f4e395430aa28eedadf89659ed3e9761d0ee88010d7f626755a9d4e20cda396c6e1561663866b149415466514dd2a745824f6d8cab0b93869becc77cdeeb4ed8e51cf9d381edd83ac9ec7799f97f795acd7fc22a75ea6cc05ee46bc1cc6a39107be14725f65d172ebd6ab6963322117014e1edd882f5dce6f712c1e19dad33d791301148b90b91eaa0974c2a33ebe81ea38edbb259cefc228e8984fbfaadaef2368e7de99e35203fd36bf0ad0f75459d36cfe567b689d445bf4f152c75f1cf05b08b1c366b5b6e4e2297d88fd0f733dd030e2e0e31a30e821ca757d931528ffea8b389bff0f4a2f08d895422432099b71a61c42da13b5fcfb4fbceb3f940d907c835118b098ec265650db5f72965172672572da07254ed35983b01406deb4eb085231dcdfc90532b337e27f8ad4533e897177163fa341754b14925fd85370e10f009109eea04c1be8a4b23dda5f3e04121eb01dfd084285a569f8ea1222adee759bb0b02b09bffd8cec14436ea6400651d268f3ddc0ae7a8da36812900d8c9a16cc38c74faecc00ea4d04bcca9585099cbd663aee4f43bf37bdee31be7425517142b55a02b6fdca888e8b744d2c986bbdb426df3e33a42bcb3d73a056ed6e22cae8beb1b44153c0d4024038a57f97fbcd30c97ac01460f1e62f06e0803ad2a9e2ddd5646846697f252dc3ea73443b7a29ad0fd9c5814d30d9093827e8d9cc77563501f92631860157a197dc10d1e882067480a2eabd7c0eb79d5dad9cd8b2e281e2d55b929c8bcecbd16a78bcaacb0c2427de57469dbafea49ee20d4b529bc233ece2212efb76e5fc8b390cb487c46ef0204becc0bfd137b921a8619e9e2708dbd1b639f25b3da5b459356e8163ef550185d04c85f56a484977e39ed6ebd5de52a1dd2568acdbf2f9622915bb58cfe554c8500cc899b67dc916145acddebbf0dbb0b28d2eed199b9dea1ae89a7f2d1ec2a22b5f3facc8fb5eb81b6edfcb4c56e006ac743a31aacdfa9226005486188f45cffc5f9ba0d8fcb2716f51d130bc7d58109b7532d1f29afa0eb121d3f66fb713b901a59bcbc9ce7d0ccc520757613afa0ad043fdab712d09de8890edc0b43ca877b74400f08f0bdbf46521b84cfa52c644540a8a456484551e57422eda13c20e8847ab16da37bf52d49a71dcbe98c9bf6de9c085ac9b0e757a7c0510c4a956a6857b27237fdb7b68b96a26ca7ba9f8ae4197f0dabf41b6d4a3bcbd2178fd375ba250e216d703bef9b2225a7de448a87d6733bb2544c2b13ac4f64b0657ac69877c1e99ae01506aabfb90e830a02856e0145d94e55942110507e66faec8b8e77d5d7fcef048c87170f1d0267b889c7e085069214cffbf162c368c3651160b7e2298ace8cd6125f863a1bd28483136916e7cd36df4f22b1c952fef94317d6203acb6b055921b4cad80a04b4b39aab73de349f2e343ff0fe3ce6ea7d5d34bd5f87abcb45f15788cfbf5f957c38fd5e9d53d07cc48d0050f68c87c7ad62be9dccc4a7217370e32f1cb011d8dc7e7e0708fa1d80bc1b8bed3c4258e6d7629f1f707c16602ebf490da0bafd276b4d4d293fe3da73a247da58eb765c06bea946c7f3062835af06fab6e3cb853a1a724862bbc1b3e3e8385c413a71ea79d565e57cf85c43960fd7b5e80ab787fcf90b87372e5d62b44289b16e9ddc3981ead2b504b0eede61d888ad63b474273ae84b435557ffb7bd8e8291ef8b5674e719795c2c165f7d5e0c8e0f448a3eec77d2b4e1af0d281477fb4b7ea40faa1abda0fc9d4ff2033956ace05ff23dbfdcbd2839459fdabfa65b813ccadf80d04cd41f02fdec3ad058d2e0b3a303edcdf09c06f5510d4fe4ab615768ce84593fe0c9bb50efd45079bd9f0f148eb407ed208fdb96c5d7efa83928200cc8d0186515475af7cac5f2432dc9e42586eb34c29a61f8be6f4e957247e7d5d066f7c9019df3fd1386b300f54684f04f398431dbf532cb2cf7572c46161af3ff749880c047b207dc637ad2f8ecfdde8655adb922d0ff6362ad9598885d6bf9383a146b7b0659a12e1fc2789077015bd9e6b06dee2b64d4e3de5241ef990d23d45113602cdee3dcd247aa12e707c3ccf2377618317e54793546dac4938d56d40d57040b6e9b97d033860d010a1e6e26888fc6ddde77ab90ea14592b5fe7bce8bc00333a2427416d1981294b448185b19fd6c25355b5da16ebb4d02c3137b642c06f4ac2cbf473f2e0cc01448ab54477378e8955097f922ad30e019ac68dce94b292653ed98c78d9b4f1cf4b8431807c383f618555ca30e6782c84792354b584d188a269f0f993072b3e28a85e99a94335cc3a22540c85737be5a64e4e37f6ea09512027026a6a0aecb7b7c8a8a60df33ccc8dedec59e37d0b0beda473399431ce44179f1f2c1a3a04c4b7647f319499997b7bd3ffe3dd7dc7d9aa8241fc0a5b9dc48aa17ad7636e3647e2cb1b0e88831af7628b8f801bc8542bb4f1d7d55bd2efc6311ba22f2d4ed698272f6e480d510de988af7d41cc9cc2638926c4493eb97ad00909f68019b4ca84accfbfe3da88e6e497752ca73f884e788929d2aa8eeb84f564e14b82840ae9aa31634426fbe0272993523d87def0e84ce78bfddb93c10b0fa3c711999c7e4554489081840a2c62d9ac6303a7042d19c789de08ecc177d3e7cfcb72383a6dde326f3ea0c0c630689ee92ae330290d804497476f247a1d814958189e0e64be4a24d39731edd5526f4152bf824645b346193d13b93326096031a1d4b017b748a84c4fd9a69e1a112e2bfc0fb8096e95b4683b4ab170aeae100da16c1771685cef83aab16e146314d0336789a4360a5b48caafa334c03d7d8f7aa87c2997f05bbc89fdecc15ddc72a234cceef4907afa47d8778e7eceea02f5391b0406d0da1e1e01c4f3734e7e2fc9460aca5d74f80231d085617c5532da837739edc466179e83e5d0c002809de60445b0baee519f5c24a9b432fc2cc3e0b973937cdd212201d7a183bfc18f1bc67d6d5d17df556cbb0fb6861aeca3aee47008787690b49ea0dbe8002794f3b1094bb3ef49770ed30bccff559b203f8004d6c0c17b0463e6cec3993308dbba86b3a0d3f372f9d64a82ec43d80a64c9d4ca62cd45cfa993078a8ce4377045b230efe08dc56e4d0cbb368d1cc949830ea4588cc70a515177f971e0651e3c9122721c8b45c3523689cefd596ede9ef96a9fa2c2587eef3f5736183dd54c9af715ed9670a5ae52648d9ff6fe3f967048deaf9ae753cf833505bf75a801b1295196497af7f0fb8279bf24bf2c7dd7384ec07c046e92cfc36ea977fab76e0e31af4e94fd0857539119d803c972539a9ff31f50d612ab05f53ee3f906a11acb6e60d317deae612c093dcf25a3f02a422e2c290d19151a23cfde1e4b81f641e862c6ed4b15f3e43311d5cfe06f602938e2f46ad6b777bba3c779faea3d3e6e848775447f705776505459caa375ce1bfaa8cb18bc3fbde60ed201ef1a3bcfd5f3a43389f6dbe4d21201cd36565687b58fc34b32dae63937a74eecdd992280e64121740fff2af329c0c2e1f3b6fe0e1ca57f702693cd648a97156de10cada7503f357b61c968885901bd28eb86b081b77fa06db3a4889f60cc5a70c999fbf65b8b83b6601c0bbe3396d066f64486a73940a80c6866b18fee7f1df150404e844feb81d97e049232a5924fda17dddc80bfc8419e013709d000d6d7e883d274e183b5bb387ad8d3c35b95f1c92ab88981721b293c1378cecdb66b9d48748a406536f3079d5cb18e8f235cfac76a24e343f887dbe86c822807ace21248a18249b3fef24f18f512e8305f0c1a3bbc99fa8fc700b3b8fe9506ffc297c5ac1895bc16f223792a65ac2f967c33442043be3e45b90d3554c9d1c869ad9b1803999cb4c5e8909e2c95bd470bf44386e30563b3a717d8479da5d58978ca69ab6b2e1a3b571cbc742e56a7537a362903f0c84084cccf21520c3ec2c0d9c0753cfea016949590c1b9d5905636bb8de491165a4a6513a9a8d46901e8891ab0cb4768112ff3924533ad668da529db82c6e8b9b9edc9680ea0a0a4e0aaacb061f6032a65271ec0c8809c2a3f079cf28591676b7fc0cd356d288506694e4bf23af36b3f7af56235760aa0c472cf29c7fcee13d8625f863abbcc19f5d62a380bb1ca5c1e4bb60cff0851ec70ae7489fd2aba2a7bf35e75a51e22431506b1435935d9d2ec66a501905a55fed91f565a57ea493a67248a18a42a82a863c13c073be2648021cf6320ba5372acd7a2b1ad3c50c066071771f567b4941b2c5a083b898d16cf14a30cab65c44cfed3109c39fd631645c12c7b0b910e429ca208c6d0ad62db2f154fe5c305dca40ed10b86fa4a027f79260836d5ff40865ece59a47a1b271b3d31653a507f994c22b98776923c7f7b3cfcfd0c1bce62a8426c5a5947e7045e03377882b46fa1900003ea83623a1977e967a620cde641a44d8599946b9b7295684f2eaeb999dd86f768b197e7259e5fec96b0537c33f76918afee021f745c7e40fdf8c00bbf327c818aec16635e7bdc74c940a18ddf5eba21e2432f1b2053aca67f7270d3253dbd3154d36a695acf01cfcc4ccbf8e20e4480656fad058d3acef84893da18304a06843d0cf67407fa26e3e7b0497ea9d13dad8c39e00e97f2a6b08830309645b2e1514a37e3cb1456219b92283731d90cafcc76f38d0dc0bb8a20285a36634a398bee59f7ee0f24d0b7bb59d7e45c501d5d8d087ce062c9d53415023230141d2e50fbe5b15429bb671028dc5e44b04110e32b513bf6d21fe709e156861644d6b690b50cb3b9cc0c9cea2d952ae83bb8bfa5e25a564a925cd9370f982b81a95ea1faa664724ddf5b2a10b12baae6a9e607db94ef14d8dabf09bd25dda02d8f70f9695d5a9d425ba86e0c07302ac1a898a33482720f469a361d0d53f94b38126046de1ffa0468c5f75785fd5d2205fbe44fd03d676269bf45c60950466008b7b5509d2128b6326ab59822c6fcb14dc0eeed561fbd874105e3a15d99c19c60b6483f3e17bfc5f49c76df76f44312a6667f97336a274b94ba5413439641ad4a51d03ffff8b9d2e6e5f6a87eab334ac39ff2f93d5aec0438d738fd2494910dea42ac86d8108a1d9a4c17c09cb38e9a43b7f2d81a5550d6497d98f30085c34d6da797a27715e2bf1376ec88b75d77d4505cdf63bdc778769c3cabb1241f0d14e1d2ad03e47c9ac58a29680d5cf18bb1cb39e6e84f54d53c534a91e6710104e83c8e32aec7a36e1dc315fc1d6a211ec7bc05b102f00f1e09093e0f867279ac681d942a7328c8777f78da8087ff8c554ee7ab2cad3a9e4723c2a7980393c56763654e6cc2f16f3a4ee9316da8f89a3d3be684d5932bd2aca276c1e75bbcbf45495e0b2b804e2f401ce208e04ffb9e8c02977ea7c8891d39328a911fe7fe275488583409f3cf3dc7d61f3ce71c27ecb0c2391a6eada10b586ef62fdc2904a3104ca31c44e001242986753270bc272998a8b202240ba66d6191cf1f6728100e69f614e2368fff58a77d1a809814b7bb395d929b0c0e79d699c84d050c9d64645d4d17f8aba0ecc14b70e4f5138fa90a5c886ba6a480a09e27d1d4e5bf5a7017dabb55d3c866b1241ebb140acc2fa34bad6741e5f2d56547b50652f82a00353133ca212a226646bb101e19fe13034c8c9c49ea8e6f69382d1b189b2e4f44573101775c87d8162a83f469e2f89c775c9d453ecee8462d217340e52b8d91eb26506be5c4cc33427e9a171c1fce97a81a05354b624eba5ddf1dd82e63df02a47113a95406f255058648796bcf8545852ba3bd2b8c2223c14ab5577f3db246df63520c9c7a5965db840bac925f4a1cc0c4e26b36691c1151c23cc336bf6ef6befe89b6cc4588e3615016070ba1eb623ec36d86186c15bbab76745933d5fa518309273aa6f91ea085ccca37b30e3540d4a8d59551cb4994d168ab4b4ff39f45cf6f186c8f0037961629039ba116e4a0a670f116f63d935d9892e62024ca8c176d5516b19840a6f1427aa2199ed02ce5514a50546caf52c3a17e0815d733aa865ca639d504160151e2319b0c089fd90225256e9896db769a38fda1e70e5d03518515a0ea62d2e3dab44990326e97c932308b558cb346bfaf11a1fa4fbd1427e2a0b80c1bb55df25a64dfa14fb35f8bc619c05bc8d4bc26ae001d2c7a979d29a22cab54b4fa45601e0dffb2abd33db10e11b0563e45c1738cc476cf919b0e71237b208a4f5fbb470d2c4efc46e8d6d835c825f98f9fb8b4a52979be2e6d4a8222a63191ec2fdaf2bc82e1c40a7a2ed45409710fb1cff0e105369cc45ec8da3cc560a43929817d2318677601c1df1f357996d84cb2bf86e1e2aafffd8af0f6d6782004df50ac7816b622eba8aabeb4fe84c5c20ed224e714ccf16a3eb66a4751c86b0a47afb1d21a8da7b2ee99c9c164844f864615f544473ef6e447e00dc02074cae6f1fb85e917bc1550b1d6923a863159c4481b11dcde8b7e8b46049f8ba06585d2f1d3e359e23e423628d436b724a219ac6b7740cf68c8bcc68486bb6600a17ada64b40b77400747c72731b21b507e541d4a5ba1f3b568ccb83bf22c08b574f44e3c5c8b5511747484c6e9c78ac8333f40bc8b8d9cc5e6e6f7b6d321ff6dd8df1fe260512d2317f4c60f7e53dda03ea34e853d35d11fa790685c43579e5cfcf3d5fffec32944528304a57a7fbb5cb41f4acb45008c820e4810f8e42c8cde08546864ff70dc28525c0132bf0e5e90802d52d1c6f3650970a2dc8ab215d9b21b4dfcf365eefef1860d49311ab79a32c594523da38bc4bcf74ec3dc84c2b0ec64b99c844a8bf3e74905058fe3bce47662324f6554beb7fd972339579e9e486d41bda46e9f8795dde061c33f27629cedf19453e93c3f0d47103159ee3265c97009c2d352774b7d64b08b4222c75cd98c23c1f0375dbc8abadb85db45e90b44170d9b9013788e24da7f5679781dff25580dcc270f3f626396f4a9189ac0c44228518bf7ea5163ee94d64f19fd3c0079dcf1b4a9cf8937bf9bfa045ec58bb19e797223b2b0ebcd0de8a13db8baf85c7ac381a3f4601788091cc02d3efbdc368703bd4699e8321d9afc856cb726cfb0eb772bdce207c670ee33e042a47495e0ac5d50a756a4c4f08a129d3b5c8a3436434282f56cd709d538f5476400fbfaff7aa3dafb88a701adbb8035a1ea708a20fb91ce50bcd3eec491f525a208fc3ae228bea8101d6692acc59fae5a5b8107b280f5e478d9b3513a20917fa55cf98eded6f87ba318f9bf85a1c79b876e4853f137d558df1cd1c22b49d74c1b2f2f914ebee663b6fd81b99cff5f75fb1edfb3e4d13f22ed908eb05a452ef843d4ed1e3d5a21fdb03834180a7012d5562675d0969f6443c89a82fdb0a3f04790590a64f80e2f1d3346c0e61a2c2e5ed18405ca9b47fe97873a3b711a7f3df9f353200c360473efc44f0cedbc39e33e355c17f0a251db80f1d2b1c8e33bb6c82bf77fe08cdcb1319c61613d6207cad9ef33c5a86d1c49bc457b23a7cb99504de500aafc96c5ec763975cbbf71f22d70aa91ad9a380a7adb09af91c130431caca822e61b378327127ae608342aebf332ddf46dd7924e8120de5549302a88b28ba5c7018435ae2301fa26a337c2be264bcb4c8e1b52a13f6781d1af4a1a7479f72735051a9f4ef6bf4dcc15eef415f54ae51c7b90ac407e41246c2f397f2bbe145a5bbcc583ea7ede083133c58bb3aff714f9bf87f61a8e12cdda3fc332842152bb27989a861d2cf2521b4fde1cd99ab8ccad8d174d820af65d891ed20d7be929426954b34822375bd3fba301df18c20de448b941c905ce3f82455912aa9e1bf22d312c8042ef4b70a6e838a39563c7be9100a9f0d4e2d1b36743fe095958a8797a8fd7cc16c3c70e495cdbdf7148855606a6093f4cc2ff9eb01d794a4fa18be3b2e89c8abbc03b6155240df7da90e1c07241677b93cf99fd6555158d0a141e55eeb069f10e5d59df958e068c900b578b7c1548d006dfd7fd41338d552953fef4251d16315dbb263d94543238866a7d40914f4c3f1f6042ca873a12311bf085af687f3aed3e7d424dfc326c7de03eb4c0a1d6b940af7b6d16f98ff20c519f153566fd6c861bddc2e6f1623c4388a8a44540e5c8a1d967ebddc48b2043b05bd0e36febb3d11d5888788c309e0342a0819074f5334a173900643d981f88f94e398aba5baed4a04f40aad0f9868586101f029f877c0579dee1ae3144736adc8a6f234367927a0d204bebe635d6a1f9e9d52fe22186ad3b76e630bc25c20f3b77c9751c15f0c3814d89ab4bccf251aacb9139f593012adc33051001627850343cd59faf8f1fbf9e85493819ab00cac570ad0c2f96ebbc2c2f4425f8cfe557e5b79ff7d009e3f1ab33c85ff339df81000a069a6d8577400cff24e9a9e1bb5b16f766c35dd29b696170e6275009c5b5aa909854eb0b4710b6143a042e97739489e85a8b12e095099f8de4b8d4d313bd9446c9de7395c061667ee38db84893c42bd069ff0daf9fa60d0a3354470f134690de3c4ed6716560ccb1a54bfc5dbc22704382a71cc780931f003b3ff0f831ab90cae3df53aab74bcdc34a81e096cc77b999f26a89c9bcfae34bec3bcf82f106b3800816d71a505dddf4fcd292ce1f1930cc4628782126d1d978f021e8938c272eac58bc14bec433599b08f31b822c1e861c9164f55a542eb3f72dec663804d8b72d319d996d1dbc60d5adf1fa17c3b94d66e5c7e785d333dc50b67f140d80b03f09e3b2ae5510d886d921095d452303c10dde3ced1acf1caf4ffd1abdbf73988c9ef02f763668be456bf264c4baa31f71b3e90af68ef48f011d0c837b8a76a8d530b7fe7e8d976bd0e792c0f4c8aa4ddb9416f784ebbcdac29032d7abe53f518dc3d91ee5f7902b34279e024ba217d2bc50a221b80d688e9ba46f687baa3af81014982febf10c8d74125c1fe9f08e69ba092c0ffba7ff15b8632747b2be242adb5564922241399773c582e4d0a4b6b6e45ac9e1a6eef35ec242e6eeb61c21cdb5afd57db25b4fedc284cc4b7cbdba672edaec3385233c5562531f1d0603b9ee6f3cc41c63258cf82b66530852b091d7c0db9a87cc9aba6566216a25d86cffda409959403c3847a46d8a362edd027791e638dcb029cd7a8c215fe37947096aef7c4ce2027d6b38c18a46d1d35bb6ba7bc5e44139ea3ebacf8fe165751acd56a2e9eefa6cf91801175009326a425ef5f1926a74f5f21d0aec18da731af88468688b44c53940ef4002489942b3f749188202aa001134d29d036c12a73c4b55f1e510a11338231006af54c30e7e8b25bc6a79a10f440fd33653bbc088731341793cbf5e37613898ebef9954720a64bffaf80d4345459973fa17465ffdac8242735076e4d32f54df4bd8ff5a5185b2bfe816005d0128e7d56df331472a28b57b7d7a4ea34e8c7bcd1f8c6c0bc10e8cf55daf18f6057bf72a526f8b0b7ea44a379ab1f73d84c0d77c89f1f204bc522bc8d270e33564989d10b328548ac300134417592b43f7316dabf67095dc58cd04ee0b130c5a77fc883e9e61f589607041dba73b95f12258aaef57f2214f4f24b10cbc7b4014685039fdf0e9981f0c55a9be17fe0f38600b6dc10c43f1aabbcef496371d26c4cfee742f691c64f623d52b6ccff4c1624269ce90217ced070910fd622b99f6dc10c8f3a97bf48f7ba644fb75fd776fe35a6b443b92f38c54092333e97024574d2117b328db0081ea86edf7728665e7a99eafb8ac3b9207e6a5f3eeffbc0324e11e7dabec72c562f5591063759933adf605ec38e0423a29a0ecb3385fd16254784698c592f97dbb8c4149204a7ac2fe01cb2dcd4a9861ce26e08abc687b3198131340a5e5ced197b3fdf00435be8340761348755d163e3681ef677ce3a9294079a5741243b97d36589fc68ab0f8aa9d003d48f5f2004c3978bac354d0cd0d54128c9d5c058f27bc42b061f5f524876bce06560b1278b2637ec19074f7862fbcb7d1e36ba69a64c72468581a25828d147e1d3b462181a8e4f1bbed503a25776f75ffe3be1956d71d33e8fb6c4f35874fbf1fca64217e291b175feade3d73c7bd514b07ca01d7d6142247ac50e0ac2a5967eae5106fc41bd928b5ea5ce204cdf35048966796229aaa27c14f24ce734c240ebb57fb52abb78d7ab41a22078c00004ca3f08b780cce231cf247edd0d5697e4146207d435c618531c709f507558370e1601c551fec6db80babfecf4c05c4e2c80cf69dab7b2fbc74a3f6ae0eb04eaff9f1f91de33e597c0be454b3684b3ef7dbdac4d2eda8b27f024fc768bbf398f7093a39ff2db919ef43bff0bf53f8d8e4c421e702f3a00a37869b3fb3f4dff397c7900a47edcafad53432f3415176eb7a0befc1cec5bea220ad87ee866e0390a1b64cb6cdd63829c88bf5eed58ff130332b37aadc9158ebf166e5cd80c2c3e2ab79060a7fa2db7eb10b3defafafaab70047014952a48ef508fd47ef779ee0a5f915644bc8ac667f640cd276e5e7a6598b662c86d2d620b78f0d5e28b0992c930a443121c7a2ce086308d2c2191a0cafd2148b11e47bfac034bc0551e1c5bff1611cb7e2b8fd6d91f8c17012e3af4065a5f99b7411ef10557cbfb0a2d1878820ed1c41b1f15498f760444ca51fb07477033e543f33893501f50c2c7ed36cd0f510b9732fa40748a9cef09671db96ee70f7af720db35501581518d98e967aed2e03c3b207928d1e78f09e794f45b3ce62dcc8a1386226f39d7da845f4cfc9114825c5f8d84c056f55d21a1db5f13fe1395dac2c3e85bc9e2f1e3c284a2ac61879705d8d65b5cddf712bff13f4720bc02c08539571ae3872615c2f5915fe241238e1022a3f8ee03c9b120f11649915edc36a371fe872e01e89c31ec3bd8325527153ddf5352a9a774dc22dfb5591fbcb83aa4386e1eff844e915c5d7419aec98575142ebc280fe3d1526a1a7cd25d8571727d17872e888e823d79c21504ad0ee41da990d50a49f1d46df83e8af07d064b6a133242d0f77e02b849a60f437accea3667c6d85d53cf402779045487ae2ba585d11be5bf77cab34dd42294af6f2eb15a459601e650bbb6e830fde95d6b322c53c0c6d56062b34454ff93bca5a8998696d94a85cd6c779eb9d16d028f59c29fcd5d643afbd5698a0c671f658386e50005fc93acd44febc1baac481e5b0082da64d3aa933ca4612acce1be89fe5df192be1f67a85fa31b0275c6ea945c51e82105ff1f1c0c4317d53b9f659dd8435f3b7de677fdebcb044e19fcb058872761026428cac7f94139e8e373e881a3ced8290d7afd023398e77ffdc3232c6c56ded4b29108be2a0b90c3372ae3e39d7826daab3fb4e71bdb732d2e8cb62f927d440a8a229c84f7941f1d67f75d693cdf167d1a2df402cd0c940667d024d297c5e69118d037a1aeb17a5cbe138bbaa48f61f49fda55cf4d2052bc22cfce7e50b03a61d1bd57e30abce3ff70f609cbe5c43226fe9f4afdeb9833e95eedc18e9e7c421a30fa7ce6d8a8e8069da343fa03b6b1ac3f1eb852b2c3e9689e9154d3b2195ea0d3f83b8ffb17e212e367b599471ed79258c70b0f5ac3cd3ffb29f78fbe8fbec7b297e34dc6e583a8b098427f88c255d6d6eb015250ef37cd313bb95fc7cad3f8f36b551b26ff5c7ba49295e3c1e8691e714270a47d6cd1f17b547a1296ef490026be36f42be766ec7393bb8732f0bbd53a36b2d0d085718fa0698c2b1e114872dea3aedffdd61bbf8a7a2149ee7263a6b8bdb5d2bb73fdb450f284c030ff8d47ca862343027d4205af147070d41d8fae4b535c5b056f75750d342f50125ce05b12fcebf0fdfef56b68901cf107f6f9eb33ec4df5b10afb3e532ba1cb5f2baf9f50f9bf41e4afeb02d487c1807e87b0bfa4a2f64b9bbd34b288664ab76a29fd1ff40e53068d5265e6838925dcecda1466eb33bef3b5cdcb30b31c84137d044877669be7fe092aff7111f4efca7befd4f4e3ca85d4e876a185f09b826fc8965bdfcabe486e4f8d9a1aaf4231600a8c8e1720286ad5368d41dda4eee00b7939bf1456e3f4c40261e01d2318ef7a3802da9644fec7368d5b274f60f59218e3024c6446d103c2f173b23a70cec4406d957b6778c451cbfe98d43d395fd391bd7dd56651d075d687ab65be50ddf1733ed1c771b25e870dd84b23d29e0fc7839791daf0d3d300598e630ef03b8ec2aec6e320587193dc634dfcdc1e42caa5b7ccffa0371e9e7b6a5f4af500f2de8324b2f60cb6a28c2351bf7cd7bcf4f842561da72f385e2db85f097d6c4996908d0b5c9b133940ed41941f60f06af4f54ee44585b17cce9bbf78878e9f47e43e7161bed0246f593053f2597bef71c271dfe365c839df95d855d067085e289bc864eb2cbde759654d68ce3ae98b7757246b0aae623cdc6aa2f227a4919e8d2fee9517aaf33f2b4c5f8428d9f4e351b9834c9d484a2a993bec6fff3d1ebaeff03fe4530adb891f1f191352eb59af1b079a563321a5cf7508ea6692b62ccc8d60a640e8b9ccd07b45375ef221b8392ad6ee8237b6b3de1bcc2bd8d08c55809d27bdcc0bb6c030312453dfb17f2ee4dd391d0093095f8b2b654f1ad554a39f654a4cfd7387b8419bb68f43c409e35d1d6d023875420ae5eb9613e769b30cc6bcbbd0e1b581db153cc62be18f11a712f901b154f23e48c4f858589125fc4962af043f5e9c4bc40f8a8592fb0131578a1f214625e9f3c4b0c4e863a25b9fe0c6a96efdfb0dccc7787748569cc4a18c4f912c2e1833b3f0bfac0f129325f4c962af043f5e9c4ae487c542c9f940315b0a1f290625e973c5a0c47d494c95e027127b25fc71e25c22f403bb32da598125f60b6227b5090099e954ec4ec05d7c1ed3df0aa3e8ee34bac119057bbb1c44990cbd0e71e1c9d4de5756124b5a7fbe993d53b8a9b183ff891a46227f673912df0892cdac36a6aad1f8c1d45c1ee3b8f802bd4a5ed0c8387e5974d1d8bfdff303c83effcadbb3418fb0e378a5132330aa6a7100b97dad054353f804ffaf304448db127a4ed06f71bc9cecaa1ffecd0a11379266521cecf039d73c3bb96df21fc4a1205f7edcaf2612fac906173fdf5bedcd3c37c4a5b4c111ae6b4d891fd372edb9faba2d9563a88fb78ed741014e362b66416342a1bac44a3e0fe5d98a7ce1fe7b42776ff806d1856f33d76776cad7b2e6255cc8141f773c86527cb7c99c3acda39b89dc04e9d9ce1f3438e1d4f6ee6b47827db47f4a592a8e3406712f1495e63e3196aaedf79d5e56d326d89042b803fb1e86d88341c58392f75deb04f09fc0b14067361591e881ace8298242132c4215bcbd9d5dd0e5c473ecea456b77b63ca07b3afa019469a5ecd2f21f78a95f20572e1f96c6de9ded86b30ce6d0034494903c6be81089e1f4bf6d7e0956af442dba5ea6e785f92752e51ed19232691484b809e1af88a9e84cc5ca7c0d7eb52bc273c8acb3b4a10601982cf75a7206f317cd6f8e85b9a0de3957d80041fec4ce573259e3c64793e4e72ec04a843b074604a4d31963911517ecc8d775e12c43f1e53330393a2e6e49846f4ccff3bc01c446ef6c5732edf0e5f2ffefe5a5c1371092c3e82b3449ec383ac6f33204bdb50e65d1b6bfa51551a0796fe8f47685ca22d7a9b00eac0e720e9ae9c12632a2a03a31dc571419b433f1dbb8ed1001ebc73debfcb3d256747a259ae4aefd3b886e85efef4f453be964a45afb75463155541fea1930e90c2c3c9b9501b4692c11946cfec6fedb753556d8653d82aea955bfb9d6108000211e059e99c6f55923ca4a8cc29c27bf4ce55ec386fc8aa32e9410340be858cb36aad530e424531932561db70ad6d0b87183b08e6f0fdac4eec2f3000eed756e945970ce45ccd10214058301668670211c70085bda0f1ca8e595d73e185a189cdb0e768a0f642c33c7c44e8613519323bb7777948600b207258d0bd5f01a346f24990634b720525048f3892e653e6dedf9256a653f0bec3a01d68c561517e368fa4b14542be20c0fb2e34f5e20ed5b9aeb776a4834c6e8b21935812863ec4ebf429661d38a49595d0aa06a030def16444cb9dbc4ba5cb7954dd8b0a3ebdfaa258397264f64c285a589f9270e54973fb079d558b004f337c6a5e8da05f620559ecc4db2ff28a88a29a3554b90a8da88e5275eedd2f849a824d64717bff8662f0b875f002d3acd0a35d655649d06806f5ca7a38ec32f6e54c04eb12144e4a8bb55dfd9125601e8da151ef89bb16204aef4f906c4ca3017ef0759b8fabe81fa0730d8a5eb764c2d4dbb252ecef9832c353225fc361f640f8d83d4c7c0916f5423d29e754dde63e81b17dc176a2a4843a375fdc2490b207fbcb82b3cc4b8e9ec54ed38d5760c0db8ea8a8692f63b6a24286ef45c30fcb287c2fed4942da80a7a8c95db0a0b3cdc5b937cd6d8f23426d2712c2d3d67bce591735e2e47980634872844a1cd594c62e13641dd17cf529ffb854e8dc6ccbaa7f955e4d8e4ea21bd990018209e8168b4552d5357bb06fc6a5fe5186a6823bccc5c4b34fba9301a6c64425886441247e0daa9f04d73c3e477a24529e6faa6f23206d89064e55793c650ad14ee3a101dd04ffc9f69743ca80430acf66c1b2dac996bad6b4b88b0441ec9202e758aec263a6c1265d4dc45eb28123859f1ed103ec880d971cb1561eeb8cbe5f48e2e00921d4f9e9bd5cce91c5e66b970b034404f36ff0529ead63301274388791b9c866e663991f8550c0d43120a2b62e5b343fd8c0df24bc6acaada66cb4b541cc0d92f7f31d120c8a00522f3e657f5e598338a4c5857055a18ec366a3ecdc658d4939c113e8c51725a035342dbb67e32635b015bc99de47f944f7ff2c2aef9423a2fcfd81cfd7aac7feaa7814df402f127f84931073593297d247fe20340e701337b8050f66fd24aacb62977b5cca415e8cd17c74dd46965a535e532d06e4829d9d6469e783aa1fc6789ee4052848927ed2270a0e8045cbd214972a2a5936744e1db9538a1fe189141bf4815b12170ff11a8af103b81fa94e92634074bae14b7087012839f16cfe41b6584ee19343aaa84a38484d2b7304b0f94e46b2a5f4445d8b3a2a6ed128ca1938e5cba1e58a5b71ca6d019bcdef760776f183662ae4923c418c476146faddc46c1436219987a79c9f02ea72d3cd49e86e1c9ab6a49a79944c867e4d5bf67eebfca2f33a10e9e080572312f7948f615bdb49ac58ea534c1951f9b7217cbd06bdd2a14e57bab8a26739869318f25720d78c4e31fd94e26813e4e4f4021271ceb8e76d5c59aa9a6af909c6342dc19a58348c917b9e6d71452e983925683408310738044f2433f2651e613d5cac7955c579da2dba92ca37880c8a9af709c057fa6fe387341eb96a1d19764d0e6d5b4dacb5edac17dac2ff750403da464b288e148e81983474452e9ebe0588d4322f7119600e4fc868820ca7be9451869c54d0c20fe8bd7b842ba150e7d799a40057064e460023d794738598eb3003399e79f91f600ba8d502fddf306ad2c74b7a8e6ce995cf9d96fd0f927b29f6981b6410fb8fe112ec7b1037aea67aea09a9f068bf163c3165bbfde371203c9a064da24752231365ce951cf2cd364931a0445190afa111cfad8a7e07fb0c1d432e4266c0f48cd0ad003a51461d86f764cb3b0864ee98ce1776a6388da639e5d19067cb453f2eeb2985a6f3a5e2890a0ce7d019f50f6021b0f069da97e618b478476201c3b272da360fd527e1a8d9ee96094fa9241f7592f8d389bf5a89aaf132709ff394a938c562f915877dffc21ce04eb9cb908f173baabff5eb57ad2dc9ec017f77012af4d411da88c2d813988fc565c6a40def27897753504800ba658f632b3f9f95573350495838816b4b5f4a6a2b3a51b427b5975462c32cb0700f3bf160509082fa178dcac57101773933b34576b0fe44a7afd85095e7d9b5c438febd081c302ce1bb12b130d4cf792d35c4c090ed7f590168de284abfc0ed9fd5dbbeac14e3e803c9e58163207478fc330e796c7f0cfebfe75e96c3c0782390cff0efdeb77e5bbde1ec5e16d46726061db102e57bd321134648a48b79befc7b0e0e4db9458ba76c93a17c37ce7d1e3bf5f9215bf687f43722a1870a521d1db8c55ba09186560487670d0269efa2d19239439f7056cc2c0011f2bf36480a41060bd0f2a8493b45fb72561d36dcec836b31ad8dd8117e9987662c7d38a0e58f94d5d59effd74beb3292d27608d39a457b44260d2a01c9e0b472421736e9d2de4cb786bd392741f43eed1926ac3a6d3d715f4ac4485046d67a015d131b5123d231f196849876669b0b9547cf0d3cc9d24a31f4d6b8093831ac9532c4f2e540e2de5863f76f2f6e27b0ad7d955fe87b02a87bd673196a34563d7ba44fd9a1a45463728177b357eddea5131aaf841e71c0d4badf439a014912e3dbb597c464aaa8100d20140bfa3e940c9edd9f41f726fc1393fb0d5d505f0995676eeed106b51c9acc30e0bda048531549590eadbd810cdc7116c6cca672b82f42dce9f78e1abe7dffc7eac15ac68db20ef9716cf9caf082a427115271db2afb7bfaa8b82d89035a7830843cad883d0628ad3981a1e60d200c27de3a081cf7d9f29ce9596058bf096ff33896a9cc71bc6cc6719c81a6f7a18a198960697ad4309eef93ef2c6f0db9bbd4bf6445f4c428fe1cf695834860d3712425c508a171379fbca2a0029aa9bb90e639efae7cf13f02caf9f0f81274a7082ba0613d57dd6ed80a728fe601f1a7bd16df138807356090e2f5a38cfc13391f21a7bc071c99216f861d6a06a4c9d4f333bc907df5b9da2466e8ee83a5c89134a60558e66cef6c28d08d8784d03439a498d5bda832d4c11628f8fc12e52ca304c3e7c5b045b1fa9d050bcfadadb096a2e6e56e3579d855b20c67c95be7826f9bbf45bf11a34add265d4091d9c77e43069e9aaa802f9851f693b62cd689197e6f8a495fcdd8dbe782576f08df47a661242ba341176db9eca8479f0ff6f55e865d90520e1a51413e868c8d05847c84e2b2488bd0819b7d3d915442d2d0025f58be7bbbe41ecf533e801c061fe4398272a9850e26c1facff99bbe7ad4c1dc740287434ab2c04f7db7cee5f8453ba33ee2921b4a32226502270718475dda922a26a22b666627c22905a61a29bbbedf3d6ae29f6bd8307a9c4c631378b56aa8b185f659dc9aeb2ace038618af4428cd9586e9f4fb8b3f414c31841e4d223c924291b0c65605cd63477b4f1a96eadeb7f41ab9ae96d4db9b9d014ed0a9715c533c02743730c25e4ae4eb9f5b290d10a1ed5c921f2654dcf3d44b03bbf9db16d97413033459e5305c284b416c51482ce5f604c18ecc886e8549b81d86dbfe8ef8ee0b270a8aceb08e5ad8b8ccbbc522469b5f37d6542d898d69b91c81e42f835524f3c3332ac28d9d5aef981a9517490cbe1dbc650c91c32785b4efeebd25cf6cefc640355af00dac234a01553e7f0f2e70746683800e300d9d174d84e3b5ca3f765c99fd24970bbfb357614e2b9d60b0c0f29dd83933912c2717622e592d1b9f040c5ef35b54eec7707baa56023141b462726554bdb3d2a664445eb9d8a00402097005a8acbaef5dd85400bef8e2e95ce5c8d4fea0118235adb54550ccb9b810bdcea37c1144225c04f7c5918a1478aa00dac572e629a38a82f25f55a9bf3bc63723031c80ea9adb41c582928750b7ae45cecc61d90299c99fa39ffe2db4b770b84f5d9312a00b8247eeb8de444713c5a4c00b4ff889de03dc0c3c1b4005a9b51c4de14abcce7eb8e5a3dd451c78c8802a03d71dcc0cf8b8a8ed63520bdbad4821a083256f5379e9901e2476caf1da23ee37a1689e075424fbed874cd57e03a308ab130b2f0e8e6b3cbb9cd230e4229dc76fd02d7ebb34262bf26bba44498a3ff47e6a8316f6a14e38f3c9a02036d6e96b90b816eee3924769508524c5e9262e635221c9a9c8b43c597c78502f9933379bfc9f8bef3370ada0e0a829a8975a5c9c0c1b48adcc5fe38fedac1c95c84425d5ecc9ffbb7e8fb4cf35673f0e20877aa43d65217b5fbe7a4ab7b112e3acf456e94b65c8128cabd2eb85568f29815400e461e0bdb3c70c14ba72cf2011b62b21aea36c39ae05550954162a390b91642c4400b9c4726a3be8083871baddb6441097979340c4c429e14054f6118720d94143b4ca2c3ecac0f4390802ee3e66d440a19c8d601f39d6b39c4e68fea6a8da56292da20a398891a15193b8e30c07d9c0d1286fc836203886fa383dc50ee96f145bbb53cb467f3c628de97d10f230629ae34005aa386ff8762c0267439135d12f7f95903f1e5c06b718cf0dbc5ab6158dfb97012f9c6ad49f6d685b5a8debfcd47dac7a544b250690dc8aabc17ba6080900c3b59acd2e5e8e6a9ce3b460401ec46f43fdd2f5df0d00dd568cb42bd4427eccfdab58db4229cada8e6ce12e6a86d7305eec5b72b5781010beace34a5a64a2f9a0180cd5ec9ee1d777613802185f872013890c6bd898d369b70f371cf96ea7304346b2f2e0e23786ee1815699f7a32e3cffc7b1c0ae5bd69ddd937a99aabda3a89874598fdc3045519717793748b1871273e204f8cd6dad674b16d90f2e928b0d7a275d5fc4cfdd74668634934ef3e0764281b6b624bfabad181bffdadff29a492e36d079e7d78185bc33b69ad164ef8225cf1c03d8439767d93940fe021554a0b2c66a6ca919dc51b0ebefcc6e767d0d4aa355c260c1c53cd522d0b5827bdf2da543bd9848058669a6d8d711bfa8e7334352d5f65b179a22baeb1f2af9168c14a506e6a1cb51dd5146e4b2d46fa1a2bafd9f163f40f44ce68560f0d42d3693eb0a7e28902753a236e0b59f45c1596c34ceb3e78f180b1aa5ccb93091ef436bb174a6963de10389e74fedb3a1c538b3d0b19922dbbea786ab2b3cc70b469d48628cc3d6e30e5ac49df462d4efecdb7a6856bbe11f35f37177f855ee97e760e5803b19b22bd455b7bbea7559c22c034a5e9d25dccb32e4b87a1a3388ffba37f25c16f43cbd4c6fa763088b5a67b2e24787aed83c9902907bcfd3c2a00812bdbd57ec110b8a416b71ba7e52b262c4982b0cca8375f62934c2a1f4161d5fc1383384a1837e0d3cc3bf164f0b0b7924db7b9d186975c2ed6a105c21e929fd8473ca45cee439d10ee44c564398301b7b8a1e97d5d93a1d10883385aa4424ddccb926d81419e6c5721d68893bb22e9f2cafa10154a71346176e3373f9e7a76664523ad252c301f67779262ee04c2e094f9d7557080ebc5ce7289e471bb9d3f899ac17038548c26fdd83ac374996c0fe560504c094170780e83e7db321cadf19220bec88e99dd92cb602afb5c745d9c3d16ea3e6e881e25273f320a148118183c61361b7ae807079ee1cc2b27176720846c2bd1992e5092d040c1a968ab568d4b13249c97803c0c9c64ec075a8d8634baeb6c47ae245599553b5b468bd568dee97c1af0a1af4d8c4a1fbc7965a8f4367759a02305837a983079a11885766c82d20d74417d7112a0e32881f0a09721a9dc0000b75c2989c18986a758e2083b56c79166f4041861da0cac783006c434e52174bed038783911501c0208021663d4889291cc700b5bc85d3286f4c010b81435e082d830fdcc72490b504306f7be0c21561aff2a23176531e564a12af868639106a791456118496b2e7c86302c0b1ff95dff89e9e046aae8a26b9af52cfddd33d8207615e1fc5074d49e500190d53cadb1d4833b2ffd0fd9efe2bb1b05749156c10833fe32f3b323d16d1fc2218ee0792b19530b1970a8460b263ab52e4340dc38fb10629a6c65ea5ca167360d709beedbb6093708883e06d3446133692806aa4e6a231248c98da65968489adf15080afbb9147f9ab315d50221855ea010193d72f438b09a98c5646717eb0c6b8e134728241cc74ba787c91e04340a85f1ecf580020a49404b0dced415b764853e9104060d87f8190b9fae5d9fec03e312ba653265b6e32d1396cd12348e9880055e64c2dca2815fb484101e5d6159ba79206412cbf84cbd66c3ee6c8f5d0516b2ff88d91660e239b30c1b95f2a6386aac4ca6b7300164bd39c758548cbec31da22ead9fa43e03300803d76609bf41a4ee48f32fdb79576c64aa2807e0b7654f190209def41620d889f1532f8cf677df21e841ca856d68e903038cc8d14c7b0d55724ecdc51429608c8e23164a7f5f18c3657b05db79ec8edcb1676ae0f88075ec542487408081fb4fa4490e42104ca3ee06cf9703104541afd5d3d61aec83d52d7c1110b911a925ec53e3dc1da3562cda552cc269284c4ef7061519926f258794d1067cc2202f77f967c89b478ebf3736bb243578834ed65c0e042be3989e1cb55df2293734ed7d1dc10a9cefa1c1b291cc1bb16b9da908e914a386e83ebaad470d461712942d47eb739f0b32f42aa5ae87c1b32e0047edb12009d116a5a796e4633319b0260397883c02b91bcd385593527911ee1b12945446c091de3581b6ef99412c91d2ea64c482292e706fac5c148f54d9a08581238c2318d6d91290d49cc5d609e0901d857d7c2604bf8562b3dff06313127c88c119441983d96c07db8e6fa19fdaed09d9444a2a7248b6f686b8ebed0516725dd5dde2c62fa8a898b27a6c014ee9386c5f92908e98f7b6783418af5f4ac1ca47755a03d33a275491570f06e25c0afe8b701d765564270580870de08b3455c225273498cc29e2d43fa71a24a98a7f62c7651afd00983f8843a3822afaeaaa690d857bec819ec15a1323892ca00d3de06c3d521cdebef95ef0aa4b08fd74e3ae0c8181d12aa09d5f03424a4e7c11dda0f818aefbe02f319fc162dacbd0796f9ba7727928955f142ce981e2eb6d815d2a992eb773cb4729bf90ca62e21097ba518ba5fe9d898a9e18172800f59b43b8c8b403a4f9380953772fa240e203dc7dce136969db04858676bab10450047cc3c545d8145a1eb4ac1414c34324567115d0a1d1e559e4a862f3430141f8a564fb31a721dd7de22faaf51d9d08d5a43073dce5a024d666d878a7d70eb674d697903c6269fe2051f2fb634244868eb1d7a022ea3ad197be98b5c1b3c5a312bcd5b2e5d0c619d2b570272acfc853634029183d0184ed16550b86bbe431d937ac2777998a126536e09bf8cce20ed105018e9e1c99c200f49356fad5970e16e93eb9279dfdc6279826a4dc9c771625159eca1fe28bda940b04f809d7905072fff1705d0d1d193adfdbfbd501abb060f2e742562057d4bf0c7a3d479c703b83b84840820b6fc19f7905c4c342efa433107844a0c7496487cef297d2cb9ae62140d30af385aa5442a1d0be13e40a95ccd58eedbe7d4c4bc99e0a0687c6dd617422043bcc2c2fd9c4f228f8c77bb91eb43c9690827db99bd58389eaf2130f870e3cdf50c53d4f8c99bea67e90f2fef841cd0f657194d69d7c128e0c5e49c2acd06599e813815af88f8bae00b56b6a53e9125ebfe2c3a0c1f90b7f0e7fbd18de959aaabf98a1216588acc49409456f5f93978d8161db52b507e76106efc3810911832aa07d83ae438880bb3eda62111ae517cf0f6a40676f97373e08080f10e3cf6022c3c0c1ef87da25675377190f653ed79b8bab0ab9b55dfd0e1dbbdd237be593c2d81edda209002b0e28e2e9d10bdacf5130bc9ab34cae5f6892e23b34497ecc1ed13e7df8588638e79069d1c75a05188108a771f7c554c54f989bbcdcc213f3caf249a0006f0d56000db92e0bf380048e90f890638a8fac81db68be6ed20eb078ded4a967becbbe5d2d600192b6a37fc6794cd2aa2317d9722ba581c342ae4baaf01038ba97365d2b79cff51506d50a088875e1887990a2b77b009e38b30ac098159feb1bb07e351037a0c693eae06ae932c83764b3ef16569ccd52303595c91870373cababae122afc25727c5005e6609205e662fc30b826c62efdc1e62ef4081ce7ddb8ad9109d2326642754370cb8397167be10c1e7f7b3f4af5c35f39a53c1b07b69ab542958e394a3c6e8b945d13bd34c87c54d7ae8597510c9e328d5d1bc738b8e09097620057e240fdec7f14553ba3c745149977280502016ffad4be4304b0fdef9aa644a49e1054d974405ab70f330160b05cd6dca41d2ca4566473331b45c30ecdbe628200080fc23bf2509ba58ffd6a10d3be808974274624782090a16b27d8d85ae24f087eef01d90388b0efad4126cb9043a315fa95510382b391da0006b82d39ca834e3e741522f4cce7284671af491ac3f5ea87f4adfc37f92275559fbb7549a2de58e56a891b4bbc98acb1ed69e1b5c171f489a5445acdba3bfb604169e9155d235076f657612443605990af209180b756bb266d93d22c76ca461a25889c2c778488396c4327dcba28dc75f2a8149cd2efd56ccd5a5dfea9a5d1b8b4b9830fdae48e137811829ffae0955239dfb29babe516bdf12eba35a4d29e9282916dad683d7c6c2dfb87f3d9206adbe76283cdaae2a4443f7492572cc4649b99f82c5d8c6fd4be77e4a186e5d91b445d244afb1f8845ff7b5e05c141eed8f1de977aa8f5453bae96a54abfa32e9dc4f19ca1f0beb1b7d2c3682569a402cea9a5d5b5ba49a13ec9bea8e11e9dc4f0943fd16f7affc5624ffffb31e314832c56cd7de32c3ee8fb68f696d9192c652278918c336ee5fa16ee95c157f09d7621917e5574137c544d1de88f2c3b04cd7ec7a91b45986652193d67f471cdeba54cb546eba6edcbfb4a67509ad615a45a5a5f0995e2447abad98415a53c8f4dc379175f43ccf9bcd206fdcd69a98f1ae3b62662a0bd6886336dbc2678ac2cf4d972bcc94ac7e980ae2ce9ab38abb9761493d242654965019412b73f64c22ee23881b41dc8c5669acfda248abb409048709e44e20573aea721f456ecce05e26090d69d23469851972850dccdd1d001bd03961258214c761a9e70f13fc09d0d32a6dfa9873024f1720e0628b2e3ee0810e80c1810e70d1812fb6f0a20b0e70800b2eb6a8b3012d3490812cb0b8820e062e60812aaca8a28a2aaab041260a25eb05847c67c9ddb338102fc270e7a9c08e0cf8d3dfb9230af730bfa6e1b5536aae30df59b9961ceec9a9dc3abb40e23b36b5606fb6da8720ad5e61c14a152a4cb2d8920060af24a4292b18a950e46a110d0929e958ab354848e2a3ea19410424211c31b2062d024200887ce04107433800c01a6bfc58638769ea90b9ce1dde642e832c527b1672668e36ae84473673b4dc9d8aacb1c61a33c70f676d4be3810254dc76858da5e69940911313742cac434e4c785d87c23ae4ce338598b30bc4a22844e4ce23011e29469c8b7822c003019e07f0cc19e2f3c609ba70773d6fbc71f71b3ff8bcb1e59b37622d77d7f8aee60d2637907c1fb5dd7923c7ccc0052bea8d318c6543af994117175e9bd039e97e58e1ad598e03a288c3038709283c50ec40a0013b56ec5ce13b74a68d273a7738bf16eb64439ea389eae1b66dae4a34895d0713779fe213e5c475ee781a90135bb4baf3bc71e761803bcf133c4e60e1ee3038100fb460f2e4e061fddbe481b943b92fd2954d8fd476b1d0dca1a395682537f0f788c18e56deb6b5ed4a5214c2cf6548ab175bdc3de7736784e94a7327c874164c07c17434fecd664b3bbfd32f25e5a4df6568632fdaae8dd59476a9a4f7c7ba1c8d8ae0b5ab55ed6c4986bfa2ddc03a443b2dd6fc4eafb5280a7d1fd595d63fa2ddb53991ee7ce00214b0581b5351aafb933ec4445bc35c8044bddf35245bda054bd2506345bdad312c0d2a3c8d329e0698c60a481a3f80a4d1038d2e9c46a1d4a3140d22fc335da1d1058dcfdda9f75aac4623887a5b33a141dda987ab4963b8ec8c29ce5073c60feed423816ad1d6b4d8d819e219023843e5ee947a59eaaee10c8b1966b0cc30803bf57e6e56ba4c7adf1f95881ed6515d296829ed9ee8aaea2398508f2b4968a988d630d57adb6d2bcd895fab7d141f5590be55a146e0e35c65d87019f91956738279de8b64b95940c74bc046e2deafc56afd19833a3c1a7e07ee3edd795070f7eb403cb0e3ce534310771e26de09d32a5d69fc0a1f0536dcdd456563d868ab48845fba1ac5c818ddbd23c30377ef74bd51bb2fad44a2588970b6f619d6e1bd627d86d12e77ab7dc237da655ca3f749fc994480bbdf702060bcc077897342e113851f86422678c18bb35cde33139cf126b89a24620ccb0fc3d51157c7f0e2a16bc7d104495c038db83a8ea3ceb0a29a5d404a0073d74cb42d0bcdc2fa37b1fe92e72db58ceaaead5d2a853f5a59f89f8b3226aabbb6603a346ae2e4797a8949e7bee9430cca907cdfb7f7916040c458220609eeb96f1a411aeeae97bc7e1b1ee5719c917a7f6c044bee0ef4b5aadd79dcb871e3a6091e2644e000d7e2d325371093aea7d5210a2ea08d93457ab9bb8ed28184e0c749f16fb3fc3c6c7896f02e7c1728de6164c0a97771ed5b391cc6ed51a63d2f779ee779b3990780700394f980ce1debe271c4208bb56b556b690259782da9d002beb520b471e553f92b279c608ba85cb1569a5a586222d3025bc1e856bbd5a42697151f71dcb72e57b1b47d56d26d1cd62611939d12259e26f7be510f69894945bbdcab498d094d286ce26add642e1548185315a61b68af64a625fb4c4bc85795274c624d642eb06005081c0540b56d62c2129690516ccc6fab3447fbfc377a74d3d5c8f3409bffbe6d679c849335817f039f8cf1ace151c3a384dbc8c16d90f9c2eadc7de8e407a8fbe9805817eb16661fe60702ea8058e03b89621d750f102fb6e8dc95230681b4e49e808074a1c6ebe96f064170d1b15a41890285fae042abdab547f296b2d2ae3d12a594ea7881e2423b7b5bf8b3f1c6931c377078066950004a1009b350c4282f6c74e136cad0866c5183bb7f88af173ef5882803445950a0d0ee6de1e700a48e1524903a413a774ac83aba0640b8fb1507b2010c907504f77d271c965a9363be013d784457faa9d22a2d871653f13c1d517058c688b291cd6a5d6975284a2c28e32251ac446225f23c1d9ef7e1fd30b4b79925eb8cd4daf39a000101010101fd003d71724213134a60b2042828a80605053dad0e053dadd2b00c09d59506fdd7a2cc9c3e939ef744cbdd3beb84099ca8e3dd0db4b7a7d056bdf1eb0a395143e70492133c6ed8b8a9b901d244144d84e9fee211e3fc7d99f727624cfb3ecf937d4af9af1d7ff5f97c5f1352dc3b204dfc70af42a4c40418ae9998c34498fb3a7f0ddb2ece5598b8e5fa4c38717767ad9aea3f3191abe402ea5459005d00e9de2d0006a44d0a2eceddbaf7d344b1acb579e30e9623c56349dbe46ea55f9428513c4f1654530a7aaa4b41383c347baa398a9ee1d810c1e636fbd97ecde6c76fc9c64697e5abcdeaaead281a5793744cfbdc21ba1231a6a9a2bc8272795f97aeb96a716fd91a347ccd9c3538f76e8d14ffb2d0d547bb35384a206ac0e8b49a376a6e6556e3e45a25c4704aff6221259450024767c3fba0ae4fd44559b9daa380281480f33e6390820a80919448014988e1ded124d2c8928021095812aa8a5795ea3475701f5e5095e607f734a025d3a0a9e3ee1db89fae5695a64283735ac6399a7e914463e4c3baf8aae83d42f3c3e8cc1b9ccf7471a76782dc3badcf6c60e68d7b670647cd587137b3840a86d16bb3fa330675d6d7ee3a0382c41b249030727724e81174fc8830eef4080260bcc323702019c1c6882d5f9601ac428b65005fcd080f8ae0a288314558a925ad8552d32270f8006e580640bbf08998e33522ba942411469789081c9dc6af21c0f0ee623a449b2148f78be9104e5a43e0f02ebf05ad58475a85f0c02d7d6eba1ad1d54d572355d0972e7c0b7c2a429078a45f44052684945a0d0b1126808a0474716ab475c6b504fca874eb5b193ab54c1877ef5c0ea48c941c8de65de673198415e51eb70e0287fb7d1f8f41cc7e0731048c591856202ace5d8a2e6f0904192da2e8b212d59c60336dab7668d75958ff268455d81f9b615b9ded3adb751625ca2b48fff84b41e05309ff963947fb214dae648e06fe50c30fdf0f2a8c9768b54e409e541a43a7674c18fc2434e6e69db663707897a311f940850fd407293e0c11238677a118fcb4e96b311fde558cbbfbddb68734b0a425237a2bedc18a77342c527f616dfcd247a25845b15ea6cfb03008372b0842bc9856061065ec0984103a4ad012322470c7afcb845fb88565afb00e896551a8ab91d2c6af1c60e0423fdc5c5b2420634eb0b51559dae664f53ddaf805cb89b9ba42d7c6afdcad493b63be707f6dfccac1871e678dd6c3763f61248cab49f8758f624f5f84b1ec855fe147d103113b4aa06070f71d1417a795da794ad0cab88856c6367eedb7e557f8b62f22c78d5fb432b6c50e67e86ab44b9cfba22fc58afb50bb0b74086309ab7ecb76ad4640180bf81346da42b66bf16ba747181b5e26071abcd3e56dd3d5db9c4113b50e318559d794b0ace622fc22fa8c93f02bbc7808b6f16be317155fa6b8bf74eea7e057eea784a1107ed530ce3c46bc8cd9f8b5f12bfc8d5f6ec60bdcf5e318c632004c1cb29ce0e47937c070c3df103aad618a4445a6690e6f502003990f7ce9f2811b72182205340b16215918864261f89f4b58f83648c0dd6d10e336103969f27d1f5dd5cea70910cde5b68a8695163eeb47bb7135a9867d541d25812e61f235d5fdad58dfb7355dc224cc4fbeae435dee9b3e550dbf16abbf9a036b58d7dc37a9680e87f3ea73256b12ee9635fc0a2f137ebd48ab9769e3170f922d753c77d4961766b3d94c498e14433cfa0366a0e264fd9b278a15e7bf72f18ba875f1cb85657f84653afc7ffd585fe093311e2a836de7a704eebe440cb4768f34d33d6a0231d2fea48d5ffabf28b6f1eb0923d162f815d6a13af44badcb14fee7f27e8cc99d470a9416d762f54e98023419411c0b86317cc2d0020c4a1306239d3b50db5109a82d172a261737938b1bfd560bce8708de63f37c008b212568711f2a2a23e820410f527074900407002840a87077146e412c7991254de4085864516788170bf89962e82b72c743900972c0800b0869bcf083113b61bc90c347d535655cebc2d76283bbd3d913be340b16fd52f2b93c8209d96c37d5f869258a57146b7993d1ce6783f56d756baa0a6fdd5ff725a1947a1ab3ea670cf63c8de6eaa2dd0dacdff4034477a5d4a3fbd66b471cfefcfc00b17e7e80288ed463a93dda599d318c453ffd19837f9568a7a9b6e24ebd9a13a983b891ad2d1278737ae63afea2bd3d9125cd3db83b4d887663cda2ebdae7998b9c665c9bb987d3e9c2197aabadaefd10971b5311eb6e11e5b665ea3e2c593e2c7495e5bbe96ab4bb2cb9fa54e9912d57aa35ed76a5d956d2453b5ddafa54a97ea23eaafb4ff49f7405c52a44bb6debd3cd63b64e54bb644aaf72657b2ec69a6a21daddc06d9f34bd15d421d53bac2c6ca395de72dc75f65128515a4735573257da51274b69f8f99decbe4ff1ce8995aec2271b66d2e6b7d93e4d6b18ed76895742b4cbf27d589c886e3e2a5658ffd63a12c5dad9aecdd56c88475ac334cbf737b012dd36bd4a6156a29dfebe5cad6871a550ed445188a2ca08df85b7f46fbbe75610c582496be33e69640fe9534889493361d254eee4986fb38ee13d9ed7a35be4988d94c2d7825f17db5c7dba4c44fbeac72dfd5a6c0ce7bfb254133f86654af749dcd15cd536ff2ef1171efd58bb28e111f8543e9affde5cab50adeb4d2759caba1eedba6b6db7864f73d115ccd57d3e30ba3a527d945e4b8f3e3afeb61f8c453d4d7d682adae96ba94f55d1eebb23323f61f195dc8ec254da7ade4773356d77d5f5837d942582f673155a7d9937c5fbfb3e1f2b7435537d9f95eff399d19515d5a7bf26b06692aca0757a8d2f6551ef1ed16d6f25474ddfe65ab4fba074dd47df666f7dc2e1b54f3877f6bfd5a69538a4d7eab7b9d29ebf9895a3b16a35dc737126edae4ef60826444ba57b54b444e5697568c7ce25152c75d1695a85fd17751a6f4d5a2b9263fda78f1c4b1ab5ad708c76fbbed6fff47d1f45c187048a8258935012e87f6da6a2502869f76cbf88820f69b70a142b38834245254ae86aeb327fdf473bd26e1fd26e15d5ac9c787116eb98f5c5b68aa5c5a4dd34eb4abfefd3181f21eda6622d77b64e473eb17edb8ae52844b12cc4e327b996423bf46278ab51288a424bb0f0f10b768f7255fc562d53b947426fcb150963191e3fa98565b9b0fed2c62f8d5fe187d7551665a5d00e6dfc7252729195e8e8627b5dd735748f722dc258a6733f65e9c9eefb6cddf941ba351ec5ea7324bc650d5492238fd092a84092765f7844bb5c6b146b9aed3b595ac661bde1da3da2077077d1e70a5b7eba254b585ac49864b15059dc1d076a00abfd9a565a4ad631039f2b1071775d73cae7510cdc7d1e9d39b2818bbb172d51b9b68ab058788572b09c08036d78e441f8637de1d7d615768fb00c57933ad647f7c768579b721d6fe07d1aedd1fb7e8b92d0e97aeb4a70a27f5b423f97e044a3b02813a7265d57744ed510a1235dde2793d8e0e131c67421e1ee94ee84e122adebc75b2eb4caa0e1d9728333adee1efa6c4971622df1d9b2e1de85a8a2b91a3289e0b85b9dbbdab59e973d8f1cf32dac7ffb1083a258674d98dc36fc0f3d4f8a14294072dff417b7b4100ecb5898fb29a10dcbd84c810e0ecb58073e53f8c1759de1b0c461a93b135248a244da9b9e51cecc6694944c146b7729ae26753e34fd819445813e15fdc04f57eb64f306edd656b4fa69ae21a1a177aaadae09b4998635c5a190255ad570c5db86377dbbeb13ad347c96fef901da42b4f3795dc1efa3789738a75ad162b4fbd0ea5d628b29595f04ed1336a29db6a25e69daf9e84cc314676b3912e77d9fd636beb7caf7fa3e20d6ebfb5bcbd537bbf8f3a9bbe7e23014499acb1593f469e2675c63e52769cd529f9a8ae664b4cbd5266cfbfd7d2c2b4a5564b9fcf351bc69958dd30f5e25da7d4632155e2ea499ece54a52c1159bbd948e64444c4bb2d84b8968b6e46abd98be92f5b51a667d58f3a6957e15da5d6ce98bd24ed7b02d7cf109df26d6b5186455fd1a93b92473b9eafc4e610dbf88763ee27f9315559f75cdeff44ff846571ab437b266dbb52c08258df9372dc5dab57465bb56a48dd54633aec9945e5416634a2ac18fd11068972449fea1da62b17bc1fcc119719e18a0a860791a8f01ec2d6fbb96d084004b2868a7122f1d88afede801cec385a5ff4451a0d7521e2a50c8edaf559dc1129a94b466290a7f31786d094d4aaa6da7cb16c22a443bead52a08e8f1c9c2c1fdfb74ee3c6fae12c0ba56895841ccda11c05449c05fbec44cf261cf6b3d48650a0e4bcda24d15175fc2629989c1dd734c404edc879471e7f172bfd1e38e4a75f11d1be69c002585470dcf1a540a11e8d9f1206abf74e1c319f84edd5ffca2d752d75ffca2b8860bed6c36c28f3b8bd5ca29e99a5df7e87111958b8944229dbfe96d15a675ed97741572cc46757f524da9eedacab848df4ac6322eaa29695db3cb458ed948c33452cd1596df163e52eea784f58df47fd1fdac8bfe8b72f99dacf82dfd36e734599f62b6fac2b2df7589487f885fe02f6d8d9334ee6b4a9a56c66e25637a5fab6b768935bc6fd3fb9635a5fc6419d3e17d3237f42126facf55185993b4de37e3225cbb4763f94c5817e9261023e9b79aac4962624a0719fd5629950306a91c6b7035a9c3f9b56ceaa3daf5f3472fc5d524da89386f5d86e2e77fd2db2649d23a12a29da6354c8fecd7477cf45bab2f06ed882f065fcc1f629a2ad7baa7ce67b5ab8a7ab918e5f1810222291b488472974211b15d2bd26c2c77291e139c7ab8768f7297da2193dac1b92ba1bbd2b7795f9bda2172a75e0eacb64732d2df5a2a12aae56e16c5c912a03268e33c6f0d32d6b0c28d587a9f300a020f3012826aae81c475ee72df34132b88cf2801668718c4e00ec4122bced6e9be1a6dd440a3060e6a3c51cf47ac1babe87b1f11599f74084b6a51fc0227dcdd459bb840042e88e3023819d75a2e6abb76a671c6933852687f2cffc7742992b98ce5ca21239cab95eb8b44b66b3516899efe458ed9e8c59785ff5a2f71f2bc11b482461134823c71c61037333430230377dfafbfa41cedb513054a0707683106d00e06525006116ee407bb6aff341b96f5da74adb99217df9a6d3b1f94e163b60210062ab0310725c7dd797080ffb56258bf7585fe736d9261858fbf8f46bc6fbdc16633323c328a9031e4043f9c60cb09b6cc2964f03945e9738af739c5159f53c87c4e61e4738a209f53fcf89c0289cf2982f098737ee61c99c3c3a79c16f89423029f72b2f029478e4f3949f89403844f3931f89453f32907a907073e3e88b3c5671cd1679c98cf38527cc651f98c93f20987053ee16ce1130e153ee140e1130e1a9f707cf009c7003ee1903ee1549f7092e0783ee178e013ce0d9f50900105163ea180804f2816e0138a323ea1c8f98422e6138a9f1f423c00e2e307ed20040f21d580303e1b80f3d900d06703947c3620e88df6f9e6f3f946003edfa4e0f30deb4d109f0c80814f0680e1e307074f58c0e7130cf0f984199f4f7cf1f984e8f309269f4fa4e0334d9127807c3e8104c83402800ddc883edd7c3edd08f974d3e3d3cd0d9f4d8cc0671356f86ca28dcf2676f0d9840b3e9b60f2d9c4139f4d78e0938918f864a28e4f26a0f0c9c4189f4c6cf1c944169f4c143142a4c8082114f1d9460d9f6d36e0b38d047cb651e3b30d199f6dbaf86403e493cd083ed970e0938d0f9f6c787c2ea1029f4b84e173892c7c2e21c512717c92d93e36c0b1c4129f4b509f4bf8f0b904cae71a16f85ce3019f6bb0f0b9660a9f6b9ef0b946099f68cc5823c6e79a1b7caee1e2738df5b9a6fa5c03f3b946c8e71a1f9f6b7af854d3029f6ac2983c7cecd88163887730d5bc7caa19f2a9c6894f353d3ed500c0a79a0c7c2a51c68f1f4964c0671252f84ce28dcf24d2f84ce2079f4974f19986059f69603ed3b87ca641c1679ace679a223ed3f8f09986c7271a337ca211814f345ca0a1804f347172f0008286fa44b3814f34eef34c0b7c9ee980cf3356f83cb384cf33627c9e79f27966e6f38c91cf33467c9e19e2f30ccaa719327c9af1c2a7190cf83433019f66e6f834a3844f3343f834b3834f3307f069a6f46926f46926e6d38ccba799954f33447c9ad1e11309347c2231c68e0e86f408e1d1c1e4d10112577c2221e41389950bd1d1840bd151c685e8a08103213a70b8901c5eb8901c685c488e2e2e2447cd85e428722139582e0487192e0487065c088e39ee6ea48907de81911d3f8a90c167112df82cc28acf22967c1631e4b388273e8b60e2b308558f39c4103e87e8c1e71038f81c828bcf21489f5fa8e0d909e2a38c169f656a3ecbbc7c9649c16799d5c40104199f4020c0271024109f4f325bf82443c72799099089c22799277c9251c22719217c92e9c12799303ec9d4e0930c0c3ec9ec1c3b74cc311ef03946033ec754c0e718287c8e61e373cc113ec77cf139468bcf31a1cf31b2d40f0d70f85067fa60854f1f22e0d307383e7d58c2a70f46f8f4a18c4f3115f029068e4f31697c8a01c2a7981c7c7a7941cc169f626c3ec530f914d3f22986894f31487c8a09b263fae8a1c7670f3a7cf6c0e39307357830814f1ebef0c9c3153c3cc0270f4df8e401099f3c00e19387303e7938804f1e60e001478f0d7ce8d8a1043e77d0c2e70e16f0b9c31c9f3b3ce1730705f8dca18ccf1dbcf8dca18bcf1db6cf1dac04d9e0870e5af8d4a1023e7580e35387363e7520e353072f3e75d0e253079b4f1d967cead072f71e3b7c83d4102161def80c4384cf30637c8691c167189ccf1c94f8cca188cf1c7af80403039f604ee0134c183ec168e113cc057c8279e313cc113ec188f10966069f60ac4f30557c8299e2134c149f6096f80473c42718203ec1a07c7e39c3e79712f8fce285cf2f1af0f9858a1f00981bf0c07183832f433ebf04f9fca2c4e797213ebf6430bd80f1e965062f2ff8f4420ed160e250864f1c46e013070ef8c4818ea792a8f05412cc5348753c85f4796a8a1853484fad80c60a5d3cb5020e4f1d85f1d4d1104f1911e129239593940a6d3ca582131e3b6858c1270d29f8a481894f1a92f8a4a1884f1a38f049830f9f34e070000c09e3ce23e51ecc19a4f89c01c8e70c20f89c61c7a70c23f029431d9f3168e13386393e6348e33386303ebb94e1b38b183ebb7ce1b34b153ebbc8f1d9c5099f5d92f0d9e5079f5d6ef0d9a5003ebb943ebbdc7c76c1e2b34b92cf2e463ebbfcf8ec0282cf2e00f0d96587cf2e3adc79f0e8b181f718e2387674204c07e8176138f5be68433d1cf5be9042bd2f70b8536f7a51c7a9e70512eed4f342a49e173fb96fea828a2e3e7747830335b8738072e1c6b968f91674b6f8b640e2d4ab93823a719c7a7560ee1b18630369e60664eed41b430b1ab46861510b1ed4d300111a08720db8bbd30c84c900cca9974518ee59a4a15e16a1532f8b1f2ccaa0dec4624e0d0b19163f9c7ab32bbaa0deec8adbbc4235e98c413d3a6adca94727c87d86013a597c62e0e6ee1828817ab30ba031c79d7a35b853ef023077ea5d8008f5b418d4d31668433d6d8196bb5be007f5ac40425b2152cf0a1c55d0f159451977ea69d0a30a24f70a88e1be4b12df921c9a14b0625220cea400035cbba36afe8d9d848adc516156e00ec5dd59400512274bba1f162d64bdcd3b4ef8b9962ee8d9586a77d4ed87fb4caca81c5060505c505f505c505e503848600aea49e0059dbb8b7d54530a3a6005a570e3d4cb34f01449412445cf942200ee4e6dd7e20dde326fbad2a2584125112040047ee60386e8dc4120055a0c77dfe21302a1cedd0dee8ec3513694b7ce0710e128226a40d180520285001e3e878b3975dce96d5bdac498215240b38480250d1a4721e15db699fcb06697ede2fc042addc03209635985896259d454dfc60e0e88008bc58af144e1074019004543ada67487a290e21e278b3855cc38108833c647b5f251e1de47b55aaa6f547385ddb44dbae96a54b56d3dfdeb7351cd1576992e5356d2a2d06bb131fda0dd613500cd0ddc75d436293cda69c2ddb9f87cc3466725a128da1a4a800103d0b97be20b77e7d1e2441927c2ae13ed2e592cbb4b3735f86bb1fa7513c6b29d131640858e02f85c800e3267a47377829312911cedcc9255067787c1271b14b83ffd4bc764f3c45de73aa47fe3d77d16f26f4c85cd5c220596076a08502a852efc4a801239ce4cb386bbdbae7d551cdcdd059f6940b23ec53051eb434c24c444a3a46c2114c22ffc92857f1f095793f43b5523dcdaf8752bd17d52292be56f02ed948d5f196ffc6ad276697fd2ce5d21dbb522c6302cd3431a202171ddbe720ec4116ddc8ff0e2eef388a623c0235a78d315f556d43b8288bb1f61c3881438f5f0ed89ae8cb880fe90ee128f20ce880318e1823bf556d4fb0162914580e14e875e46224db4f8f5b60ac3af251e938835ee64098b05f49bac619d79de1cc28a8c6dded5863f8ef69bdd0ad637daf8258a65d1c6af35dcfde6530834667047c9e08e8ac11dd5c5dd6d14c08f88218c3b143e013f3385f8e13a77f7475bcd37f2869d2f3b3284471a937746f200394f13e7019a091081c91296d698bc01ee46dc3dc8533c98e14ebdcc0318b75d1bfe8338c36827e2fb4d38d3a8b64fff3fe6c09cfec2cfd34bb0168568b792227545880e36e8f0aec3b3d58874500f1b75fa6b95525d622c7ee053f9c6df568876b68bc58c65b4d3a5d6175b5dd66e78ebb8dff685f5c5cf47f5f9bc166b4db55f7ffacb7f2d76b49bcc45366f7debf831daa5be84c0f5a8f58338574bc438296cdd5d2a85b6c26c687277c9f4be56849f27d8e67a1fd4b4d21b58c66807e4d530adae663f40fb078876b68e56c3b4aebe4fe777c29f7112edf2ebba332647fbb1f06675a1a53da3ad22896d68a9de560be577728df5465735f753a8588e2508562a62dcb98a8462dac9ee11afbe8f46b1651a2862acadae4fb44abb77aa2f524d8ffc586dd736e923d9d25d921bd32ac549b4d33d9f8831ec637ddf97e5d31f162a8af5cbffa47106eb96327ee4a92d46eeeea3dae2f44551acf485389e033d4f967a61e76eea05cfc3f9afa86619cfba98e7c9baf841e62e624d535a7eb8ff502850a8cf082acf8b220bf2bc1c069cbe131e498c5fa4d2bd479f8b70653859f797a2a764407052a460651ce765bfc519e1a2e05838117043701bb8d1cbf39a38799eec2da87fe96829cce550d21253a831d2d6652bfc271c5e971398f20a77f7a3528e7735a9b35b3fcd89d4c85f6c4bec546b14b7281df1de788876374b73b9df96aba32e712e865b34e316c8d26bd236d3fb84692e718eee5ae29c11ed7e76ed47e90ae7d79224278af57312234a4bae2bf4256424a34b2e99906b4905ea1aeaee93b856c008ddb285864fa144a15bb6501f95b6dd7fae751ad317edeae755cd5d21dad59c78f1f7e9efd32b5dabe10f6bfe719743f4fb58e042295d8574150b1aed2d46d624289452fa0211a52f5a72c420bedff7b9680835dce9f105ee3ec553634f0ff5423b5bb93bf6d4f8a4fb5ad5252de707cb10e77dadf8464837811889d2d96c564b23fca5a77f95b154cd0677ef526f029a71ceae0fbf042726c4621d6eaae313be4db4824f6a9a3b52e4c404ad8f38312116a336daf55c5b6fb456f74dd809bce96a14fe2d3f14b1aaebf4b6a3a747a0ddedd397d62cf55151da7d4b9894df577edfd658bcf4fb7262f9f9aca2c882322efab67e5ac335aadf6696c6a02585827c5494d624da6d6d45fa4591058d7fdbf9da1a66ed12536cc3e121caba9652c1b0dab547b4d4146bb1d215edbaefa3399a4f4f1d55146fb226ad7649fa5c4bbbd651066fdcbd7a4a005ab8db306283de74bd953f6091a1d4583e2c312c485888b07458565848702731f511414595501f11285d89403d12d395085445a977db369a054b0a8b06574ee04e3d1f559ded6b3d17aedddcb1583c37522cc0dcbdbb75074909808521eeee368aec239cff0aae268de51dcb57f8b89aa48fdc6deccc2ad2c5d6095793dc515e6c8090ab51a83716634ff816c32f9cff8a10ce7fa508e7bff221063d5c1d67a2686fe0be16b7c005f7e36ec6dd8334794ac645e72eff0ddc75bc21003688a494caa496a4a404e0c5dd53302229180ed88e1f71234ebd8883e0423c88f3701fdec337f01daea3470ef70be0a822c49c3048806bc3e587194222dcdd35f012a3c2532e264fb9923ce57279ca9582a75c4edc3d478a88059e221a81a788bcf0145106dc9d071a25784aca124f4939e229294472dc40e140915d50472cf52045851162f057b85025642977da04091db9228915a8ab3024c918baa3802be470a002f93163078b112234c7e7ee4b5c8c0c98f9a1c20eca63c5776c98c381919318aec2ce034a0801171f4c4841c916d9b1610e15452d18010b4d4049498640918690231d8e40b8d1e353c85902a578511842766c988312a3884e9008f87802062b34751934f91cc15386112cf4283ab34151103c720c7965227278aa68871d1ae0d0c1cad500857a91016cb879f1137462e070161e243f4414b8d1e35758f0438b142fd239da932222d082672a7932c4415095177e8830668c1d7722c56ff4b8bb8d36eebe83fa0203125374f122ec01b0c03b0a405440e6ee9efa826883281b08e36eb3b4b1b4e18ff96d96969f24ed9ee53c1b4b91b4b7afe5bf760ceb2cbf286e8cb33b6a0c0c15668c5a4de9bfe86db9de88dc51267047952063eb8e22014a0c8d1ac12d6bee281184164485608342bf3f831713a18218321b411c2a8c0380c0016ce47c8893f47f511358778c1cdd511f083ffccb24d66fe117ce75f4637d69b116bd13ce85b14cff17d9ae7d7d88c16fe17c9976c6642862a317695514cba2f02f933bca033377549ada677714181db00e407d015a126f7794175db88776c60177c78192e3236825bf2edd515cb8a3b6b8362b5677d4123c51781dd40678e2a0bcb88f2a8aacb36314da5d6b9fa08401c5003e1654515a4853415d7439a80141628260accf64102b08472d854246a1a57397f2caa8294f4dcabbd194f7937a52c6fe9c7ad2060aed42b0d227b8d7c2fa4c3e09d24f504e54907252270aa59e130638619372f2038d3971c1492b8555ea8414ac4e68536b2246aac91b2ffc307c5951cc841ff4dafcb0dbb6759f8fcaf3649ff77d54db9d63e58751fd355a7ade87855e1fbdabc6d524da65bceb6ceb729cd112e74a9cfba2c882569f4b1d5aec54b5a63859fe6b939674cfdfb6ae6415df849509b43e997fef1f8a1d3942751d2dad61da7db4eafa351a3e6def9eb2672c6f75834fea6bf3eb9285f7e327592ee3f1c78bcbfa9f8c769a8e611dbfe79f7edbd2854f5ffb7d9f3f9f996a2544bbcf7f7b226b92a69fcb5d35cd6d5dc94a75cfaeab9f9512ed40bb51a8d4bae8b5b42cdf8725cbf76111af12de9476391aed2e26cb55c6abad9ff651b2ac9f7f04edd6f8daaa0dc35bc91aeb436a860f23f0300326421defbaba302542162baec2cfb409c422923290bcb94f62243720d1924212ae52218ce120a659b080a910429fcd5247e87c1fcd189632b285c54a1939725a0b9f24eb532cfcdfb9a1fcb06ee76aaeb0c76048f1f6e9b05ea968177ecfad59da69b23ee914083505420922c6e42c00b701ac34112b0020048047009c7a17eb3acef47fcdab7d9e51efbf468980e1d45b525a5a725123468c0041a48bfb2cff4a496a080c435a48113172d7e3ec56900812771fe229223cdc8ef6c5d9ec7505675b67fcf48118140a14281fd0f9c0531fa8f1502c719512fc00e883221ffcd0b3940775dc3de5c111290f6070a71ef5b26cf65fd3ffb554076b3ad852d2e82afc8cbfee568a43fcfa3a40a25e0746521da43ac0911a2202779ffc24cea48a76d433f236e73ab4c4863f1b41dc909e21448604a1de6c45531cd4a1f888140739a438b839f55a1c3ce14088536f45e9aaa4799e66724769a1810c6481c515743070010b585105aa02ee280ab8a3a870474de0c7faeabed9278ab56bd1206a94910af20137a25fd3fd217e1dd9ea502a480d30a482e454905b2ac8476d9546c3cf828596d10135853b4a02ee2829dc51114039209552c3dd6d7588a260abb40ff16b878c542a4967ab347adf058a02de21be5a4c4d3a2edaba6f977a44b95b93f0be96123dfd8b6e7bcb254c7c54aa1a26819660771533d6f7495c69a54ef540e33af74da91e425dee9b48a05f78f4644e96fb29dfece2ef06e6fa9ae672bd9676edaee437bd530df7e86b6d4fa3556e4fbfccb24fedf0e2eea91d5adcfdbe16fcb928b50328a8dba804f447d5510a15a2110000000000b31000203824180d06c3e190583ea4d7011480015fa05ea85c48168949948314528618430002000006000000060c05f108e2a2c0fa27e23275c813160f8790eaae5683035ac3f1ed0a5520b38cd1166dd7a4b61edd93012995edb2959fed232dc876b7e49c82be6346161d5018ed6f17dd281dd657835718650693cba7b933284500ab1539dfb965a99e23433dc0970e292bb4b9483a6ceddcc954c0fae876e61e5118334f80083f464fec9364bf3a59ca49a8ccbd231822e84012690a361712798c1a5dce3a0265932a2ee0f608b22e390e99a18288baae0bcd826a09dd5d734bfad65acc3d07bf9862eb968410dbbff638f6dec3397dbd0b39a6845be2a1ab67fb26fdc4a89c6a26736d86a9bf95cbb420abce292799a34e214c5b74e40b2439e2e891a1be9da53523d321eabefbd1806c97aee584cb3ae84a273da6869447fffce0f06a0cf383b01a767d78a7b09f9729f85f904ccd4e4e6d1fdc62fce6b6c50fc2683a4e9d24f94136995347b7cb2e8a6c0a4dbb80cc8cd33444bc6f0eca02a1589ecd23a9b2662643f8ff66cd645d65fdb36eb58179ea71e3b3c2e874673c7850099223811c2d064ce5b1f7936470ade688481cba513e7ad2589b6753a585260c72237d019ae0d9e985575d2690098914311d4bd726c322560410ec4435cf26929536652669707f76322d892972fb32419f44823a641a34e21491cd3a2c81d4cb9955d4beea47fdf8294e34a51afb1aad50030f011a211c4d82b02d209b85a5398993fd0b74151a21ddd2284dfdb657a8372a5fa9d314aca439502e5973388d03c21286db1bce8e78137961471cdb80885842eb3129ae018801de6bda021d41dec2a05074a6057d403ffb27031c7c47c1933dc20180d158157c9ec605c176ef4bfe6df1d93a91d325cafc1d8a6431ae6a3f88dceb70a092d58b59000c437e6af8ff5775b18332b38b262e80619881783948263c234f6b1052d09d7032dbee6d482119135b6559c770be6182a52414f541b8350b331246f61ab4a752562b1579a8afb8c4788f0ce69f1c60a5c14658286e89142b64fe7a97a09602a175ea3a296d1277cfd23c1cdb698879be58ee263d704f0624a37e2f80d5237f42606ad4af1e747b53a99ee2978e14d04773d342b050f7229e22cdd40fee8e219cc9c143ea77fd4eaf26fffaaa5650f28ccf7fa3b53668c31345e9dcba9ce140c96187398c9c8c9ea61f3fad8e85d0214bd09590e57e20611bfdc0fdb09aa974c8c2c39839d7c9fb19a033a6bab3fab5087241c2725ce3ff3709f2746954a71b6a58fa3d78e12d354cc520f0a75740095861af0e1f167573365efdcf3577376e2273508035a4c11d162bc265131c89e23b13ec4a3bdccf99c2b43f5b560fe34840bb1b70d2e21e134a98f3440a72c7a6e0cc9e25f98992454364397f420c1783e19382eb24496328aadc98cf437d5e678a2f28ebd1ca5296ceee181d6e191ecb3c34b54259cd2576b62b04ba031f7ab277b572f2daf5c89e4e3932003777d227748c1abb43edda9bd7367fa4c885a210db124138552e000b8d8e748ced43eede885849c7de21e23ff0d65856ada89f3ec1407ed72c5107331b8a505c8e4694b302dbff7ed0e5870354033159264866fee9c4f0eb75a2d6e96736f88c4d6e2a925b67f70495a02e9c0f8dea12d6860d9fefd203f6e12825a0ba8bbfabd5569e7bb71ba6e627d8e3eabd041dd733da2014b68fc9f09dc7c0ca1ad366db80e0c42c60d56135659f3b175784c6c8b6ec711d013747030c548fd0dc6489aa9059fd065853352d69a101c11de88527b469b7b4a9b7c2b5517f3432da0051ca5e1f2cf59703833c651624d6cd888b8b4b953427292b0bfda063a13c6f9db9df596b7ec440bc640b5b1f4d1aae20ac7dc7625264ee433410d3bc24200b277263f0fd94a9d9e1c51c7c0eafb2ca2eb6b73c6d053a1710856230089656cb10b6033760c2acf7feeed160c6ac0ad2dcf01b00e757e751b972a814da1ca3d42c5d2a0e5f0ff8be16e92cc79315615f28e5e864a53ae87099f18f9b6732a42a50b35ecb270d18fffceeed261c34648c45eb7734cc0e82589a3861f8403ad251527ce89cb00558f8b9a9ba39f94ae2e9e711491f51d1abd404a7468ead47a8f47985b51fe5cc44355ac9ef74e1126b6aae28f4d5e421af62dbb8a093e37e37ce1e2858d35809490c4e09c257ccd51ebd56f8a6bdcb116c7cc7c1e4b037a74ceb2a64244674c0fb74b9f794dffdd0da42f2713e01678e78a0056088d25247bcd4e7fe4f0ca95f3b0c84546f1031072cdd354a6947103e04460dd78d371e2bd355f0eaf1d86199520fe98dd97fa4eec0aa40a739407fef4a0b4dd46a4f64b44f004cdb4e98984c907c1c344a0e039f0bc2fa07a90d93e87381cf2e8f77bd70fdcb9838a5d72843fc49ed5b5cc640f380088c796bf3e876cb434902e21d31fb5fef6dc5e6865af4430df0f16ec043424817510d258b44b0b33e57a9fb4f69155d8a8734002e53516a24f0654f94391f6702dac5d5a4e3d8e7fd0d70d06a717200982d37266d555fbf68e6fca3306d61e975ad7b6c55a8c6c3e69f56b2e3f5974c55dbeb6ac9d9a1c0037daaae69f6bbdecc1b3b894c9657528f9b04972822d0401473cdd07290f0bf4054653481f19f4a159c8c7fe463ff88f8c3821860d5c0ec440a2542d160e903089e176399f58a5d724d6c0ee8affedf4446578868a90b57b40d4e330444f3e9a4246ac208e5fc1b81a03e0929030701d9bc7b66e020711d67a4345fc427613ed676c87ec6208723f525ad30aee001844b29643f4c210b4d401a8d08655adb1439b4e0713a2414228b936d000ab14290041bfcf44d80a427442e86299533039bc85463dd7284e07936dad702959a1ef8f947d0e130e9f1edf98863c9ff92717f2ec3673255ac224062d8dab88350fcef16f6ceba41b755d2940a8a142950ee48c46482094600730cb5fe6dc8875de64a3c5b71dab8056c05cf849475c54783b0e85e72917a8e6900f3f8d0a8143de95cba56d347541714799fc87f8b72fcbe3eb78119337fb10a4455f21d8a799e984bfd2f14f755c6ad73e4438e2ef12d0ddda699d72586af11bd9618fef575edc24f31dfeb8ac6659e30900fb209330b38ce1df81936c59d4dd911c3a025d1af3b1ba827ce1104b0e42563652ba0eba2a0ef8546029b00ec1dc9a99b687ff034e858dacccb484eb59fd23780fe35830e8112596b53ff4a648cbaaef992c08a2f3efd4f063745f80c163ab5af697dc54fe37d440d6a85a6c0643ab2352cad8067ce0eb59bd315ce151a66a29438202deb6bc954637c104f51ac074cea2e54005773be881329ee89f7e89761ebedafcc2ec990fc1a4b6cc418640fa4fc8668f7a50962b77dd35bdb62977048baef33a460eec8f595485e0f0d00582d1791a04950e807d1b30a85f67e3eaf2513f8a2ecd47dbaf97e67b885265756108f60dbac7f4e884589a5acf61bec81a564d70814a588bb2eccf4dfed4d7fd864754e79edf85695f24615a0cee3d173fe88f106a79b0102c61f64f12235af9208f28d70c33164c125b06da0dcc518b321158baa54248e7145545ea242e3a91428bc1b986eca7be150cc5aaaaccdad116d8478190d60078807b12ddcdeddc3eab1db015fb92039cf98e97d0acf3c30aaeb7834f66ebe946749bc0708900245fd7e9d942beeefddcb0747b4abab0b4a0ce2eabeaac9bb8ac74bab2391c8a68777d9b03a445fc5c5c53f0a8fc2973f36da5989991ab77b00021cfd1388cfdfd6cddf7ee9381e0671c0dca0c589676033210bbd8b226ef87ecba77ced76fec30829251f1219dd48033ffd24723cf8008dbf55defcc40110da51b49f268af47fceb74aa710b72684605b345ec419d67d170a1d4138e0b774fdb433364b0f73be8611ab24d043e01b6fbdfc53ec748939b009e4fd55e8af645b16006e6027d17a7ec32ff278279be74c9c47e0c27a3bee42f5c810e6db9fede02f0677e6fa9f69221d6246d25171c1557740bdce34f82663d472d405382078faa5536ad1eaf45b42f509b407e639ad7c103a57c39c17c06cfea7e423c44270fab6cc40052fb94b1dbcd82826b96e97840f9c7f6409006bfa61051a1f9c877f1490a17bdf2832a418253189bf8e6b84447141079b6254c272bbc6ddc7371a134099654676de08627bcd9dea5aa6773c02cfbca8940ea8ac86506ba2d51b884dcb7f846633058870f0bfdfe855d60ceba0bd79f92e7722ba377a05029e37cb551e3b8c1fba4b677802f882511bf13d1d05dba732f55e9bef53781e564b3714cded0dcf821ead4578d66ebc8dadf74d195fc84eb0b10fdea6be4057b0cd5e2aa7573190b417f74b354d116690c5fb68c732c6a6a8dec755bcee6f36674a619660aba1d4505f5229711dd20ed12041a7373b035bdcb4d2c5cf68fd4f341bc2757d33822ae73a0418c1d6a1285fc45570e83fd7bcfcc0c320fde5c83507074e31fdf2e5e638b54163f1067024910530466b87edd33fcf7042bc7b8a941a09b641891f042844a2ae526d04f85f3edfd1df48563b093a9c62b561a7af2e8c7144b540cd86717d363909d4e1562fcfd0cdbc97f9d34c84bf9e34f32afd9c1a89d789e0bb45114aebf2f3c30d79a472e930a26b183e295b1fffeb6a770e72f1cbe324e385603a0b378b0dc929375bde0a182675b1e94edffb4dc996d9e474283cbeb7a6d306e47723b990f002ae4d2e18b82018bfdc2ae841538c7e80d3a3459da2f824aa7b4506c4bd0f7d4c4ce1198297ec722e9fc9714463c0036a3801961a29e2614145bd010b60a8e2cae395161430872a7f552f7e2e931f4ce11ae6ee7de44f746c2e0ec5c2c49456cf1899c7decd7fe76635188d902209bc294924b1d62601095b46bb91a12cdaa1a9f927ea35994ba956e266caba92988c7c3e909a05e5d0cafe295782f96394ce4cfee5270e0887ec6e8987856228cbd1bedec55ea4131e021aaa5ecfd2958e99dad067335b40b47159607aba2f4fe8f75426fc1ea0b953cbf44b707e96c72f88b6c945fa34afcc66d4a6dc695b985eec0dd083bfd13b224baf1a11478c25d5e805001662ffb7c0fba330fec56e5a3fb88e2e2bba51353ab215367160c0ec6c76bb9c4eabe1e1566d5791de6f526bd7c69abdbc3646bf169c38e1e9e175d81196cda8bfbf195d46c20c3e756043b9d5dfbf5548c03aa494a102c3ba50e4105147b86c100573846248fe81b09ea7c23fa4aafe6a6f684a807a9c3c9f9089d2bc97069929868354834f2c06e9983ec01d0bd763b3ad084e6bb496229bf15efa85ba33eeb8f74835c9b5bb993c4e08ffca2219e82492aa400d0c7c7d2f707e4df9b78d348c5034c1d1ad7729dbf6d8af854f6fb823f19ae563e4a4f5fb496ad02e01a41192bfc1e918c0835b3a93f0b8112e266bb25a732a11ec1119cb2be38f20f06e16064226cbad63527387d140c210fc5d4f7a84d4c5b8cce4c8f0309f6d2fc31b0672864ddad848c9831183252013720289aefb5080528d0d81fdc52bd24956164d980992d7e6b75018ca17098ab12758ec61b386b68764e5304fa7b0259046a8c820dc1f59f6699ea0a2d5ab5a9aa04f6c1d108d62f6e787f48363672e96fd6618e2f5a51231d47f0970b180d7a6b9c5a4243f89ca3877ec40d118e6f6f8ae294caa33f0e099506c3138c1945bf0248e5abbc28403c79fa82d1460f48b2603a55befff5d867d1dbb24af65833123f734bf614d5b0a372df72182fff2cd2acbb77d5e40b62f8fb5b21c833f7d2525d516f23abec2f98067fbab67d3eb954986411c2d69f6da3843aa6ea2eb8627b9505746bfe8cc800712bd9677caf1c87d5f014b25292fe1cc29ef4fdf89b6dfa36bf044ed3743eaea6024fb3ccbf1ed188a6668c2d0b19bddeb0199d9502abb7a250ee42f9a6d5a246cfe3a88d42ec80ee176b5822a5b22a8aeb1e8fe6087c32926b4d59bd7c77034cc0f1dd9af431e6698ee06d8793a96be0771b96e745418a191813f34340c2881f62bcb20047b0fd1d17d04e3ff34aa0c0799a54ca71dc5ac4cf0bf809c5ff51fda1fe3703eff909043bc0e035d839affb59833258ddc7d84e3d7666e938edc3909c7af4d67ef95795cca6968d78430df1b7b74cc8f36bcd2f9e4d49be72029469ade82d9638c5beffadcb0b7e3cf0eb6ac05f76fca29ba39a174793acfa68a97f8bc359dec3812caf6432087501d1a3876978707280dc2bff96090972b0501676b97fc5b3f1f7a98a794a9242cfe3c439e82fdd74178b1c2561ed5a0dea3d134bc19f2380a1bc84575a7bb12dcce17907108490e52d06bd97bea11965adb6bedc03a88f2c41e78aa788ce77a992f7ef2f3e998eb0367f88896bfa5c51f1d4f573683d7e4531ecd7d8ec395c31fbfdef6916206921fa8b892b45a35e9c4be5db2b72c7c7a5940c318c91586179f0df70c43197c0efbc86483e73f71358b3f1d42fc84152f86147c606f1b2aaeb581eae1446be3df8b115975d442303038d7c710ba4d21b480cabf5f102027b6fca72958587bc3e0933b2d35971a5ef33168e36ec887a43e23d941be69768eb2f14abfd2bef11b135baa5bad7c64e81668bd44f6e43a2d7600250f5b161675f0e2539684ea994bdc84d924c3829c8c0ff90d7c613abb7756e8f91644bd25784c91d6747cd9cd06ef5d2c9181ca07d188e4cb4c8dbcb473bee5f1052a0d6a3788fd72b56167cd0cb9ce8310803434b281050ef6570f80d0afafe5979804392ff7da79307f7c20b25855a064fd5bc84a097e872283542eee33242da0eb9f3f83d049d6b188e5eba810f3629a611c03afdba705777d756d36f3aa6ba8dfbc801d1f8071f8432fa0b6a07ebb923d64b68cb5f3b04ed3c3459edfcc3e7eb0eabbe8b0109ff2e46606e621b531fd781de588436f6fcabb81fd56bdc8bf887d7e1b7dbfb1643f481a683070b611e38558d6577ed38c25719d3c077c24ae7cd93e680c08cd947455cdd763d34706f7383209c884e2bde6103d6f76e0df72e8913bf88f34caaaa1c470d88be6e7119fd8c44889e19f70bfc943be8f7868bebf63fe3ef9b62f1d5e0c1d468a4a75a7df57cede7ad85d1afaf44f49284846d50709f6615e504460b48d720c419709a7a3951b422a2a20072d6459eceb07b489c3b8a5c8a414a87d6bce0e5db95d0f0db7c945db5f94305cdb7e7ac22044718daaf8a1cfada48ccdadd6746061cd9e4892d3e3a43544911f0addafbb0f0d904338bcc2f34236d8d27ab32bea5fda8b84522c502bb4d89b1e59f8563bada56ff3ee6b17ebf3fffdb1779e90767b408d20a9fca41e1c9dedb0b9c569f67b66159df538a7dc5245dd00bddf78cd7bf83e1d1d524a6fe95b14c947e1ffc2d64fafc1cad76f3a23cafe0c763ae8c4bdbe2b0ee694e7e85027d187477f8edf0ba68544cd65c303077dc1e23d64d0385060b08443dd1fd0e2303ee6fe9a0f0e2599cedb750592923419809c41149168599365fe164fbe1e8fea7c746a5636d7234def88f710afa4b9122d22b677ce590836f67ed7f399810ebf794c0ff7a40636ffc3807f0bf2296cfa1506f65a989d2e6827d1b7bfeacacd3bb2d4f67190171518e8065e6811de2c990d9c20440060b945bb1404c3d1e7606c4b26a77dd0222be965352d1c84bcb0078bd78a5e5b454178da413f7e7079d3d9da25b8e7348f5dd286c9bd5051b04c95633e2bfc7e7a61292854d7d17031377821ee2b501a6afd35b299232484d9e2b45028ebc314612fc60d40385fb8020f2c11f1e64d3e430c300537954a4d52f7e072633b5dbe0436aadc6f074013f0969a96834b54c3e65647694d433051bc1cc3d3c5f1570a21e180c1ebbe5ab926cdfb68cde6720cb6e6fa59746b4739570021e7e8b513ba3289599da75bffd44654ab87ece2315fce28a5482460a3ee7e2039d0a82f622e669adfd2599300a7938036e129c94be08d6670e6c619e820d646fec001956b39301edb85f286484c92e2b8c3d30260a873ae0b6bf266976c3db25d010050f40563a305fe3396c19e9364a9d890f4d3b0f2c88482be8a405b5b95519fc76976c45be1d945bd821f9b8e1121b71d68f8f7a6e338934e69296d2d82a086e7032f59ecafe67774e91810f65d073f021ac240d36272812bdcc0438384a6c7e7d304b0b8f6b1e8a0f4a39385564edd7055d4704c6e64d26d9d6b6057c59d4195452f9badad82654ed49718eef8de4be81e54865ed62e6e61464f0acf8d6f3f6533c9bf03543ef072434b847bf97a529565eb290815273b6f86fa0cdb30cd10821601ff3987840bbe3ee7c0fc21ef78fbfb1d2ad2b97707018e637cccf1050e33641fc78ebbf90d7945c36ff5864f8f2b82df28673c76e8a49fcd4fee4f85eb1064dcca7e0f26f4d9d91af1fad3cbf37132b5c549ba1510178e1c059efb6619cb45598847b77278c0bbfba45f5ad9d71c9ec3f06007ef279d5eb7bb832fc174a97aa14cccb89b0f0b512459ac82b761c57f2586d1f8198b19c5f518e40bdb9c9244d4881bde83cc26041c138d11992b3e3b275fb14fc767d6860093c37d8a9d6597d9dbe9d019622f52ac08e99390414a4098c26c5fbcceca250799e14ea0e4be621d2ec828f5b54ba54058a1ef1b7f44af3e955a1397d061eccb53348e9ebcb167cc2e06a6c115a2da0b0f55f14e8bca5a1656a34d8c452c15515caece90bd8c4d764bab380aa535ae93c3304f0e2f13d7302022650bae99a23199081a828deb5955738667c3bbdae78606dbf9d96dc2752589112dbe8c594665b900969fd08c158b70a83a08d0dc9f490d62bc0e5b5101e2f32bbd23313556e0e5d7f9fbbc275d043b9a837d3fdb7215a2793aaf465cd57aecdda38c3154e30ce6ec10d700e8dcbe815574f08a79d85ec78bb5e8a0269b12c2a4055c09dfeb1ebc1172d320141021cd8b14d5aee843169d43834c823be65e8d74b98a2feaaebfb0f55b5b35e284f4a93a6e1900f3d234ce1c71f66a38e0bd22d0d35fcacdc61171d714c72d91b44cae9030001c6b06beb0192aa22a44c58bd4b2c9fb308bf934ec8b84221ea075965c05cda31d151aa2e209106bde6eca4ab4cf6c787532500fcfce9ae6be96f59732a591cd4c8ac06c40b996633a68ef3da75e65bb36a93cee1e4a782c5cd06d7fa9c5cfe0516773dbbd3dac82f992e1c86ef0fe93883ca29c7c19e1c0f754859e388019acde6b3d722a9103714d16dc62a61d76bb583c44e88f57e762c9bc7537dacb0a6ee92bfc1a41952d839b0f45ce8ed0575bcaaffadbc17fa8ba6aeb35c5c8b8dc8c21d00464bffdfafc6952e64f4322fb26a860dab46838be5086b5776c55190affe7569f0f6c0513ffce22fc465c5b1ef854c729af3d73ebab37fd8afcee052e23a3c392b5e5c86c58398e6cd22673bd998fb7808613c15c76e474cb305dfbc10bd37e8314e9bf5fbcab1e589e7cb2aa58a978eff824ebdfacaaf05cc7ae5b663d6fdd89d465509b57f6147b9349fa78ab19dd0f89d8e185c39163e6146c1f3a3306dfbe80a7cc397a46ca9824748e00211de1883a691dd73cb106001b543ae4cc5125b9e2e0e538c728dd8443fab97d2bfa8f0ea938186f3c1510a7c36b252efb185cddd7aa4f726a7cc32eb439f22a0ab5adb910e385f5663447f3d7df06a6ab5222072c69adb29068ebad421b77ca5deb907fba9dfc6295c29880675e1d822da0446d36f1c1cb8edc7dba7f0b4e7bedc9869f70ff8f8ce05455d9393e4a2420dfa805ef799b40f69d752afa17df2204b418a09796ccf8805926acdf182765291b99d58f762e8b67aa04d84760cb3f9bee751047ab497161dc3dea34fc8cf134874095d742b5bbc5234bc58a55d239c33cf3c71d1c13b2fd2c08cd52ace8ddb94cc076b46a76afcae7582228383dcfb49ef8133bbe010d528149346ab7aed2894f74bf06cd6f63b173d055c6651086b33a67163c675f44fd0839fc7cd6a12cb835d3a7706cc7c3cdb6c7c44e394cdaade6b84d17ed918deb4dd5fcc374126dcfb2b03795bdf6508264d56ff454ae42dbe79147b5726a6e7d61555741dc29f6b32dad814bffd01c5ab6c4e1ece03c8b9c6d28c3503db3e1ba4c521c5e87c7469911682530e2b7db0b39bfd82bb71a667aa4ce31b1e3abcd7fff1c72b37b9e47b45d11beb8bc4303887f06fcc1a76c98910e34787b5bd21720bedc44f76bad2de2b17b73456e108cee146e1fa9edb777c6527bb0c0ebb91ea94e6e386fd1240338fb2eb734e78122bae58e1ced1bfe9438c71dfe635c4b48e69d04584e70b0f921b392e7166d1408cb4a556c6a7588bec890ad5eb3b88e4f5e87f6015b717ec6dd815a369ce863e0b3ab65f4861f5206f75ddfc8fe48382d1abed6e8831d919227372c8c3788998b44da61b66cbeb6b568070c6aa09b34b1a2582898be304869431982fd42b1caf60fdae4e6c12e1ff2031499d076f5fc4ad9df48c9293ccec5356dd92ccc03cbf9794c6cc7239b810a46082477bee5a83a962c0301ae7061512f73d52d77f2c238763ab4698752a51e179a9648e038aaae70562098d31df9cc868ba6aa11bbdb9e9984a571666002691433214053fec7bcb755a214d5f4b696a5fb7adfa47778c01aebdedf252197af2d5da38fd09f27b6861a3620951d7601a24a11081284dd9aad9caa85c5b971bf62dd100556a3e932473d3cf059fcefdd34d437a3b5aa194d5f18b40855b83a25a35473b38c24b1eb6acf897eef5872bad2f0f5bd8bb58f0d500c6f8ef76f11f17b93254144fb269fd43e772834bb8c6ccf019b08ed47f43b9427e1ca0fb19d27bb61b84203ba5326dd260f5864864fa9e4ca4800ce2c054e0404f6865eda585161a61e613e9531c740fb0351a21c6b5208c7db2f4bdbbf9622e394bf9e13384f318dfa8a9a9f8975d52d58f89a72020fa17d7d8fa4f85ec2c3d4c8fd207986c93ecdd3ac8b388d729d30babccde8dd02d5860e3af18a134edee12f100d4709d51b6a1ec9b4cfa324f849fc3e526c74452bf0ebd4a7efe91e3221ec0127d22302ca9d37f18df55fe928686b2918fc43c9d6a4d452e93d3dca588cf68a45a398b3b2e31c05de3cc55018d32822112822c195e63acb99f956f86ab00db82d149e119b836243080cdc7e40817cc9f3df4a5a0d540a7d8e2796075dff1a820a13f05b41c1fb8b7705bbbdee6be35720b276b65e53a51497272f1e9cd5b98339704ea0544819f8ca558b121bc16b42e2b8864d25a7013767f6b5d9ebfc609d33628290202240e982768cdc9f734ec702b90a5b5187bccbb1de0d1905ef282806205e90a67a01f5eacf3ef302b285773cdaa0d08f5dd7873d85666562e99128f294d9cf159bc55c9c8a28ed57e2261ab13a5023234b411babc1ae500820f1084cd12317b7df80101b547873caaf06cbee836d10ed8e44aec3598fe126d1b7e65c70c121741ec35075d48f2d80ff84ea1753725385864af4ba969fad521ebf30335a3e38cb82710e42655470ad2710ad1ad280cddf5b40f26f01c4c7f49d1b64a5933e8fe880dc3710fd613035a3290196cbe3b8bf8ea5add0b42b10c13ba45a5fcb2f700ac6ecb2c50d97e6af9f4d76f16eb1e50fc6511dd700d1c972c35b8e62904a0d0d8f64d31ea2b91e4bac29c7c6735069aaa58a388062748f016a79a8de0fbb035d75cb9de73a6b6ed58c5c947df8836d05e5c0d511a82872c046fd4761d1d1e83bc0381be0e18d00936d29369f9b5938a92201604a92be1079f8e91e7fcf7cc0b4565222e161fd3c93defc85fa7816d5851258dda5592da5283eccfe96fce10d318f520cf7731f43930531437d3719424a96c95a620f994280896b61106cfc3e7e3baab02df2c7cfc483a84da47e73e15c39d0e004d755ecc4c71cd50b169ae37f3bdf0a6982498260983f5a301136bfe63dc4874acac3cb626cb3a83abfd07897e5062b1b1828d00377d086185eec624f3cf2819079a31186062b125274ed89a9ba6be6e8537cfb51cad84c3161a08b38a5f5d7e700c1a103ea2f4f46f2e1958bf554a9ddfd811bf375ba1da29350184d433776c12ed2fe43ca160f46b87aa02f4978d89fb58342d0eaf82b5c452baad8de6a2f70e84daee54b27e1ab6aa19144c4079c5c2f971221bc087ddd8fdd2f7abc589fec97c63916a1b7ec6ce359bd10b7ddda10d52e1941a2d314f3fc21fbb6cb358bd6b527a23a10349b697e7ea5840e4ad22e75249d0829ee8249e375b53f611320cee8ab3be62723f6f666462405f61635fa088bc299fbbfdb67af0a941a1ba0879ddd5f24e0832dd27f4d37a2f3565b0f744ab9ec6923f0a35783636a43bc0a7a5b3aceb60b279982e67b2b43fce5c3794a88749fcb8001c0d9c068f683355569aad090b477bb08d242bd219b07b8f301f7f328d3dafd750a9ec178a10ed50a234f203551934f96d9d82203b887a1a531dfd5021ed8aa264696683c2442dc06e640f411e99aeb25dfce6883e4b20e66a12848533f9e4c179e6c667b1be8cb7a68ea137e9622c56c666f08a0e78f32045c7d239feb2ae61858333402d2600b2846e4ab26b42940cf9a3b815c12f56cca8b41f172db2c0128ff80d9d5772315768bcff19af2c3ada97776a68d70b21c6b972006f8ded1e71b6dc17c2598a786b53dabc99ed86f271dfb80ef630d8697c0c37179145f2dd851a398cefea9703e68146662d8844cd9d1540a4fb9acd052cf16c56994ac9e9c3cb4097759579fd3e056a9f03c8d7655363896aa38bfe72598aee468bfd1c9f5b4c10ea189f2dbc33f7c80fd45e545e1b9736c8a047f2700552e0eff2314c766cb61972041178643f4e23d5c96fd9231205d38e3480f56d13c19c1e2f743e0cbac20d3f2576f8d3793040aeb255de3662047805975363c6918ba5f8e3c80757bb282b123dfa51efd8d7b43c5e5dc7258c9bba0f7749b2ad5af67448a23615b0dcd43c559ea7e74b367f23dd719f7bbe3fa9ec5b2a4a82af9b36608f8e9122e362b612abfc6a5793652aebf021c118145c12a7029649743ba3f2a21a80df5a52a9215f584d194fc777bf9d389f579bb0e06a3ee8b99a78b36a5f15c385ceaa92189261e177c8eca89489edffac2281bca61bb285fb7c867c75a7458a331c9af4465541be1873ebaac4197b89655e0f669f6018c421dd2e5c6cadc2b0a7d6e657b3c5e65a95ffc87d330cafc42f01ef82663b234e08e5c541ce1cca0e17b861bd7a743f4e68330b88444512744385d6870e6d2c0311dc257dee346ff47e7560ce98643ca316f5deb3af37d85f930bbb0ac671cfdafa36ed79da4edaf522e0464e7fc9b5547ab22b1423453a55406c02326c3ae636db885b40ecf4ca736d4b09984d75077e1f1345c48dc710eb40f842c8c260f318ead01c588e62cc310acd1088aa687716fc163773cb298f124133aaa4023463f0cd52d2eb7f323541877ce48cc03f075fa2591790da009d9975f94af8a3ae6f123fe09acf17892fea827c4bf06eee9cfcd1a76c446bad204bd3a66f8f26f9430ffbea5bfdfe0bbadcd676e98dd58b65576fbd57b4efe91efc20fbf773197bcd6a68f2f9edc33001ee6bacbe7ea6fecbbd36f3faffe35607d212a5fa8d6903962b5c3456c1f95f4bb285affc71a3739acfdf56293349b782752e69b2a6f0914c8835ef6bf7da85b4467e2e712ae674d5b021e0d2157bf7c6f2f29ebe957994f41ea2f12d3eafad46e31f72fa7f0a53994e96b2da8f49bc144e1e602cf07defbdef28211aeb6a16bc2bdcec07c5a3c06ee39a07dcac45d231e0c7406e1c3d5c94f55fe2947ffe0ff80049d03b24f147df9db9f6e871b027e139339efbfec12e960af07e90f257e142a33dd419776835c79a3f6bf188f20c79e303bf6074ffc1b5721d8814fd35d291e103b4bd2d1274e9a5fb8e34afc837a889985b76c1db0f63a3cf30eaad9df2f0fee218ab28175e53df0edf16b4310749dec874e288f5dcd8c47d81b2b7c7f7dd3b236deee72dbe50ff6ce4d6f7e05ae3eb9fcb4f0bbfa74fd8187385fee7cb829f883badfafdf0a27fb2af89afd045efa6eb072c4f8a8fc90560176a934dfe989b520b37f8fd5eb05e386da7f31a8ad256cfb0bef06f9fcc31943fff7b6418936c4301ab38a3f3df88e3febe3985659fa7793e992c1ba53dc53c7764c98a97fedb6b2c7bc8e4c28b679544f455bd99aa6d8867a1cf3baf876ec20eedf4b51bd848d9fdce0228fa3eec80d3ec7b8b20745c408ddefafec8f60d59eb0e8c6db91e75b80502714c93d5da526ea22c010339e3f9f75e7830e3f99d775b08c79da87fdbc3ccc9a72d7c13cbff011a8c942f504671f85ca5631ef43879af78afe1f48235db9ad71e3c6c343f07c3bfbca35f452a904b8516d344c433b9854e6de32fc2161cdee6fc3611e07e5462b14b6a1d75c9907c53ac2b7d8ff42299377f5dca0500c345d7a65fe41c90e9f4dfef90fb3a09832bd2099558e52ba3cb67077e741a0ffb8f96f3706a191e4ee0ed93afab2eb85f407682d0324fba4998baa08a3c30db9adf96d5366fac439dafac65488a173bda2396e0899eb46ccb9a8689f19dcefbe48e50544f3927366dc2dc327fe471ebb031ede7cc1788ae5a8b394cef2cbfbdd3ac608f1741895c6cccd2bfb64f6c94153ea45881a4ec60ec70234bc7be0032f783bb3e05e88977d4371bb8d8f9b1a5a01c8ed7d20357663f2a2fc3f8b05755fb3fc7f28dd840154385883cc606a8cc6c4321ec8bff5643be57d4c24309d55bbb7e3f36d943194dd430874266be3b33bd2f463fac2ca496aac392ab011fe6371ebc37c46a8d072ba49e6a6489e05813f5c90703a2a6bb7867feef1668dbddaeac7582ab7ff09bcf1382e2c4ec5fec1a89dc99156fcaa7258e8866958450bcfb3e95e7db658450c3aacb1c3cc30e68c7f1bc1abdc8e5f10ce50d8ed7ec1a8d6e734c9dee3b1950d74c832191d3dd1dc3a0cc01e006616d6741405b0aa9f6243af1a99c2980fd7ed6e64b7c582d338118115cb9523d0b6bc4b6ddce86a262bfce063ef9ba418e6ac387130cacd1e17a298948699c05e675a783c62dba8b321880bd34f80baf5787956f95d1578d100cddfc0ae14fcdff406e4de216bfaef55e72a21b7bb42408e44b06277493843fc4c9403c476c90717c41cb6b8ef53791f19e4e664d750bfb84c4a229bdfd60c227a8ab2c147c26e600222885df06ac46cb27b039dd5ed162e727e65f785be873cb35aaf867ff6eda1a8fd5c01bcdc8d100b174ae08ed6e21c7cf8a8549a64ead3a0195bc0fbda4547da2c6fe66af80bf113aad814b1cf6dfae1e8c7ab59cd2b3047cf7a9ced69d061dd56f34affbb39207e5ccd53d62da621ad723f4e2f528059111d40dac226b10c9a78818501c2e6d11b069fd01b54d95d1fd5c617e366e4ef5a9e5a446888f454b6b39ee005f27a25ef61cc2f333c47ac5b2c27be4e766390518f4aec1f1e267e3c913c341cd6d1c92b70d3b6f3d9cfa9f056c484f74cbfe109d2f0cb7411e85a52fbdebc10550ebdb6faa05ce227179e87d4c6e4e37594233836bd39f6bbfdc96cb955bb66ecc03500f1e1ad8f857fcecc2ebf23a2dbaa06341176e014937d11523793d038349301c173f4c93d01a03880a0bbc5762b9572fffb0c38414d85879d7f8d3f7089e5c3f03899deead317c57464ef35ccc2c2830ac2156623cc79a7ba348c8b4cf67b78db3ea1f353302f50c40f3263c3d7a6f786787d4132fc5d73f94864f463e0dfa4f817fe0126ac4f47d0136f38b1c34ffc57813f37c8e1a5f4090bde285af4f2ab1bc2c0380525bfdd0839547b92be07905b267d1b142fbbd64b02dd636b725c1798bf96da30dccabbe69bede0788232bf537411496a8df78e21e17be7be3f04642932296fe5bd4dbef218c6f548e624ee603e8a5f2bd586f851b522e426726efc0be1f709eb15b684a5a1f7c106cd078681c98332f3836f742b7dafb2ce01cf2be4de60e2b2a5dc05bf01d8b80cbfb9702478236c44eb81a92d0f8f0f61e100d2a9b75e7ef3564159e30b3ff15eaca17af5f208f403e57a641b73be1c40e5cf0d4e176e7c56d720cf41e7298eb9256911e1db860dd74657cd0c3c8e757bf4a9bb7a7832e52946e03eb29292852cfd9a11e1808770cdf84845835947b42a4fa8d10fee113c98acc01dd4832a99ae76dd492bcccadcf15664ec233cf400b3c6d4f1d5860f9dc137ee68993167efac27f18e5ed44b3b5e019f763aa8adfd8bfd408d33f244f734eaf127b73867ca5c4f94cb5f56069a78b05196f17903f69e5addfc27710edd439a3f79bee5799bd8e25ac17001e4b0f836d108d74d5810ffee07264924e3ae98277e672242108235c902651ea5c08c25ccaea9befab934a1951081b1f7699dc70c6d278dc775c614bfd880d337f4404f44f1ee825c8eb4fc3411011d109edfda2578422a478de3967d010ea2c9d405608da6525bd2171423fa7d7d6f1ce8a4767866184947c06582d7846e93e46d2321bc73acb9354ae3a9d14cf7249b36d4c349690a2863da1f3ae3a41c7ba87655bc299f047edf7313cdfefa7b509c2c4c32cda273e4a1cc793479cdb4cff2016ea9044dbe4fe1a0f25ec2cfdcad8db31a970bd0f99041cee8bd4c0042764a1eae5ee51881b42189b8c5dd70d87c27f3cddc3029fa07871b6386d9e1e9953f420fffcc27781efa4145533cc18b623bc5702d0c0e133bb92af4f0aba1b09d16089be399159efb0980f7adfc2fd71cf2adcdb01a3c83bbe12c885662d0d27ea299973bfc0c0b85014cd1219a540173e02b8d88c0ad8b96a96e9aa8f072bbd20d026f4524c1fd746d6cc1e503e397a37b4b5ad57d3fba4ac2236b46645847519deb301edd0080d4096c60117cef6cd8b9145226a7865fea8a4d52286886383783742fdb15a2f57b7899667421f5612b8db7a91e0d68c4e8b7cb00c227a0f700e35e32948be40f62f6bbcfb9ac244635b3526e272614616f95f03cc7bd4e4a459b0317fdca0d2d3715ecc47944b0ae874c90cf0d03df27c8f60d9c5ce52768eb3bf820518ca32959f248761bbf21d3e6b4e9996f9f605247ed0822381c04a0c05d93b2f5343775eba913cd523e39a4e279043812f11fa0f71076a8d7474f99f79b4db62ad675495f3902cce7f802908f101f7edbcfdca38110033fc97709d7b2edca2aeec54d599cc2a5db86f8e58bd04bec040b8470daf854eeba2fb930571409c9dd7b9fce829f926ebbd7547620819a0f617e3bf3d34aeac88b13fcd4be8182b61e772edec7fd9549aa58bcfe23221cb1428b749f3e05a3edc7807f2493e47bc34d011e2a5f2c37ae624b182db9d67eef0b26cc87d55d926a17fba17b0f9dd14f77caea0ab82af84286a352c324a20b49779aceeb45ed24d8c2e380fc894235b16bf39f6fa321005f37d01f95a4dae8e7ce2132aa1ed7bdd45177c3b412fca272a867793a51f2b736bc6c6927c103727e3eb2081254083d74539d0cb4792e16e16a0f5a7b0533964a31e851c5dd6762f6649419e6fb958d920515c0ea395cf538ec04d42d7e4801f3ebcd3084cf6c89aaa3dbc696cad2561f5647c3ffbfe610d6e0fbce6ddfe6ff99078fb9c77f15afbdb10a6d4f1123b5904151b3e6819364c360555c38442aa7c1c8bc3cc5b8d4853b964dff0e61aac91c20750d557b812b72e6effe347f0c3df8fb4946b53453ddd83b351422d15a938aa6f186b4e0dd3d72deda3254fd3702fa9e68eae4d8db5b460882d45afd5c6fbc74ae44f2dfa05bafa07c35018dd4677593c3c63874e97ddcc716a1bb7c6b0a8d15214ca9ebac63335c97618e398e43f4bf6ce7c1233a550d4d0749eb7a2c7a105eaed15f852317924f147fd41972fee698207bf0383bc322a589ac1313b9a78b4a6193076f7290ea3e36c7132e41597bb555006ce90804e47d264601c8a4014e24e72dd6ae353a51a97d8e19382cf58f42b15ffa637f0e07880fe914027acc4d01ce5b8f24ddf3746ee7d3c4cb07bbcb2f29da8da1f31dfa4f5493604a07557d8bb997ab63e86d51724f72db36df521329d5ae169e36deed193fc0f46d32f535ec57ce0430e8e0742db6c52452cefb3ebc2233001d49d66cb9865b116df77d7c463dc6b094ab979eecbd796adae9c49fd887b8c30d0b4fba428f22a68dcf3ebebce88e08bae18bfd8b6fdf180a10295d590f145c9270e4809ca85dd7f5f089251ec57544cae907765827f904737a92664a285fdfdcfd32dacf0604def890a1bd7ce521ad91453b6b3e8c8658a3618d95503e1846ea38c1fe98a484e26d28716cfd0368af2c9efafb060e44c01a474a7fb969215bdc6ec1cb46f730e21d6c1c5043e51242b439bb89e2398ca2e3acc677c2fd0c04ccec57baefeaa99baed66a78515ade04ebe16865cd89b3b2d21866e3dc2f5f1519f9921914b565021caa1de8a2badf45198b8052b6e99124dd65af8b447dc6c60f29b514244ef69d8af6a3a388e2fa74eb4b789fc178d3057059638217acbed94639b6e20cb68d158b90712a02a2fd1431b13aa2e91bd91811539e636aa9a30b6bc91b60fd472ae6a6480fbeb37bcc6bca1c7c0339b2301f7542f58c7eb1a018f600fc6b4a8c1d9b5de11fb0aa54ec02ed91e1ae055050b5bd0db673255d0df283b4f9a9fce270f4e156de1f8ac78a30c6c8443f67508efff4f3b725e423dfece93d4486d19f9733c2f267e5dae814370bc0cbd0f15fc369c5c8aeb85d7797cd781736d47701ab5399e5308646fc2a0b2a345634ca6b4794fb496e1b9423fab684fd4d49ae41d655a067482f262d81d877b650a9e837a3fdbe3f2ed6479d258a940584ce6ad687a6c258e2c2c0ed8700a67a395600674b469d5b379211e7a8fee7897226ddeb0cb8b0a46ea59534a9a6a8e1756b1be48d81376009d26082c6d884a4d50b8ea8522b1a8ff70691ac704436e53c2114b12e48d51badb0a6cec07a8fb0b79aff247fb450646b08741382fdabe7f9f501d995f0d653a59cd9036bee1816d9d97e8f502d92216ca4a8ee6122422fb841c2b36dd57ee4d7ad40b0828771f0ba00e4780c3a0a05be8b34af7c98d214bdbddd903204773883ab8ad50e3755a68ce4a1ec480e22c4bb24981e2a0a492202f822a70fc7035f1ab51867a40547081a8e0c8a5ccd6e75c32be2b43ff354ff41b222d7a602538374c80dda7add9e8cbf29bdab4d642b9432d1d8213e086c67dabc40b3f5bfdb6c48b16a9478cbaa32cb5c057fa82e5b694eabf140c75a6d22d51aeba918535e5decb7b4d7ee190cf005376f0647ecc41b00c5a30cb20801aeaf2cb06e0249fed8125157c8cb94acf7c9a60c5ac8e475d76b79a7457671631c79c1875622f35c2f2984d583655b90ca8debd2c7359aecd26577598a7727d67e1cbebe3b9f0a5b12d297832d430e58797072f3307f85f564a3e8a621ff03b9d12d3a5752d27dbcd222c09dafc86997677e07d915e8ca6677b73b1fdd318907e780e5fa8ee0363bd8bb28d0a30b4c85693fc905f8c93fe61518495e69d7466e664145c1a5483fa689b0e27ca524a66e96ff8f72007d0b92f4cd7f5cd1a0af56a980a92d93020713323d4e92aa1b32844a5fd7a4515b7f438ace888f24a5528f05cc5cb41a2879e46c5bc05452f43161387dbdd74fdf58c7374475d39b63b6431744099d8969912416cf6fd1530ec76ace5236d28037976f63d49f041eb196673ac2347f31c5528082db84854d4512d94a27788e55522122f1d69bb4bf0252d9a6d5f83ea441b651559419256aad7d21968f39e4c57e9bc609c5a2d34e77724323f46acb0e8cfd67b1656c550c9da21d41b8cacc9ec74023e078b49bcf9440a45a09eb0a46d56cc84306ade04b38909ab3cf6f25cd2da57f14661867a95483ed22021293162d3e4c28696d7b91f2406aa7fe3d07aa64b5095407a1468c3347852d4cbe680370c25583fc7e328a662855cb397c63cb7cb67bc12da0ba97097bc94ab55952244424a665126ecfbdcd85408ab69fdd4191190ab5145f51e550fce49b4c634ad654185030c2845aa4be74700295a5524a02ce356ff169567f3872247c90df47a88be531b98d4ca97006b7e6241a90c3ce15e0a99150349bbff626bc823dea6d2d51bb7457c2ed3b7c00e8fa14acce5c9e7cb41623ff9a8ff96101bb2f31ec9da9237789cedef431d4f9dae4af76c8a98ab5f06b09884d2c60df6fa70f91bc763170c6a6b4ca4443f7148a3278dd43d0f2b123c96ebdafdb494ae2c4807a11bdd614abac40a3ec5a8fe51d8ecf64bc3dc623a29c01c654950efbfd61dbc8bab131cc1a75cc84f0466fa6fbc3d337a536e582e4488f85db87e9d9914dbb60f485c523f2c0278f0bccb6d7fa1fc4d4069825a5fd4698d85061ce223e398b73a71ee858a8c2942109e0ea0b292a6c20548e1328a1ca2cc5fab9ddc5d6fdfdb3ea82f698862fecabde45b030c0994d094d1bb8ce84be6e9007d676df8df455187e8542118a900ad17dc97546d734801c3de11b10a36fae0baa36bfd676e6084a683380eb0ff02540ae0014b347a18116bf982176dc65cc7bcf221d5f806b0ea85b53cc2b79c23caa2ba7e82d4d0af9a844d732240b1d73c29928b555886ab0ee6e06c3bb1968de056a62995c1bac9493d00a877b1c4c21d9f9213e95cb59e50885e3a973520d71e66c543e3cc1af4eacf5d25a2dafd9d1e3b4e389404651abe3d7b01bc1e35f02a069c5f7f9fd907438ef1fd0542bd3be89d16a40765b9a0da9aa4b1d966b2661d69cceb160cc86e9a26398ef270308306d10b58367d0c596b4ff8d4e1c644a6dd133a7034877545f4b4276c392b1a7d1044ddb4f6cfcfe948fa1ffea588647d2ac8163706e47f7593f37711b549c7c0aa118dd563d4d42fa7f7f249b6118b08d0c2d5c6bbf71a4e9f99240d6057a160b27dacb0c445f05f84401c37003c47b3c9a58411b2624372b4a830ff527ba24d7736379a594536d5a888257ea8daabddbe32c337e5bd7182408635715002fdc5a5deb05c39038fde72c03701c387209228841dd3d3e8e89ff09284f65a45d45a83d7b331f38f87990c9933bd8834d27d35e45125ec6aa076a01101e7f7f1c8920d80138984e3f3a2b264e9edee2d554e64d4d2c3e127d084976d8e88e81c93a2171301fdeeee3ca405f94d88958b941655cccc9bc8d559405a0750e658a8adbfc0747f5794884f18a29deb1460efb050878fd4af2b022b76cdcb7ad2a8136f1eae8bdd0f34da2dbdb723c2ca824b8bd29b13612b4e08d158bd4933be323a8ea5fea33f8e4a92012d76916613081697b63d02b1d1c0810d66aa6304197da6e3abdb24212c7f46cc67af481ac07472f8f1b0078c2b260384ab711c1f95dd634d02922301afc77e96ec73d639d675ae8b03f813a3c23501f606d91d0ae30f024cd94b9897087916662b7c45fc02c34d2080172709f33ce1f4f6fd53a03e24a7c8837f58a16f72de100e21fe6466dcda8dbb2d9b5237e20dd630abafbafa4b0ad8bfb5a146f35a10cfce9f02593557d4876b9c64fc91e1e5a4c904489aefd1f5a1e49681c96be6c2997abc0f935e25619f2448e172e73c145d88c8d3f8f79ab46e5c23053a954dccad83544a8d025cebec8467f296d061424ecb64424eddcb15e82e3bbaff240f835a6a699ef35e56d6f3665ba300b68b6e1940631cd44e7f21d433e6436e3cfe0dba5017f1a9b68573f40faa704b37c22987ddf8764f11f01bc4e624d3268aef1f98045e00213e70e4b629b97bb3c20cd1c27526da21a277c1a68d2022444eb3ef3fecbe89cded59c746cb80cc1ccee08f59d8700a96f7fe467076957f0b00dbdbc8cb5653ce8e8da705639280e969a58d67429c873d369f5991f44838e64bd66607e96e7964788377b8c2b16e85de5d5a23edc84ec1a6d3af8ed985c659bd9b63ade5646ade730d56fc0ee72be25697d7f89e5bfe776c585c598f8b66dc2cf3bb55b5e7c5ad290c87a17fb8f5ea924788cb17e29e0079c3da55272dcc3567d6188fd53c3774a2d5e4d34a7cbdc5add21c64e36801903581596845badc59b44c1b2e090aaf86cf81a1d13dc6701b76763104d575f1fe146277c107a7c403921e25c342bee76a7b3a4b1e0c8dc7beb18a9ab8b8b34c2332976646cc1daef04760ab015725380c235df5609eee5f7f16aba1cb3cd6e02ffec70f3d59a0fe502f3c46048685fda042c79fc952241ba4d37faab97a4771bc4ace8ce4dd230093f62753734583b4cd3e702f08268d048e6a164880d7b1ad2b614bd4fba6205fca499e711052ddf8d4ee111b4afcdfe631ea332b07b36196c4dcac1f8638a0e62869185905212c933b2543cebd8c177f0bc1d6f12ff170799b9e8341043bd5ef14aa3b662b98a3f6c3635c241dfbc983c9f1201af203b46a82878303e1a2523b2d510733a400b577b7a13e84afd19893a06e63a57a38141414f510bc2d4d7ef4a36cb4f9d9b4a1cf97e680b082b4df67bdeda8106493a56efa0b79fe50266cf6c3d4a2748a8aa8d3a0fb3728164c23dd4aade807b29dbc3ddc07e14f4579b3183a3fbb719a09ded581aa15bd2cb105a6f1e6a1c8ae2be6808c36d46307be0804048be9ccefe6fa78fbae3e474055f166566e3c9f5e9a629e9205b5bba8befbf278a06dcc9fc573c61875f5bdea043e61cbdd27720a7fb89ec3b9988e64d37d9bf2f24d330835b1991698b229accb38983ddbf9de938a7535358c66bba0cd01ad35c42f052b2c0a963a5a1e0b8ff47cbf0b39c1b4de63877437a8f7ff12760d1b0461c5f9474e1a13a9d355009a4b42279389afbe80f9ecdc199bdf0c63693dec9ff283e3530d46d5de0b83b45f1b007438baec00249327504b398df7aa1f3c8d9388ba32d0f6b3bab00ebd1a44bbd2f45591f1aa2d5ad6971ea307f3a5b3f3c7cfea527318f56b48e0c281076ad2b85e8b1b4adb9febc842ae9963219c7db99bd3f004c7acb2eb154f18358e8f3dbc88b916df16f5300a8f6410a5a7fa134bded2a63b0145a9b20aec17676eac969ede3a95ab82376b4f804736119c5dd03e9cba718bd20bf40a9f4218301ad4458803f09d2bbf88bda875bdeacccb180997fd98558efa51e3d9c652b9ca7da9df4fa79327b1ff4dc41ada4b224983805211334ce906af613348512cc193a853d8fe5cfaba251833e4210afe5a830702fd0f01b4a23ce6db39738d545ffd19df74d1d5d21f678d43f9b979b5e20faafc735ea27e494e0916256cad15939066cbd484b729242596ef4ff526e1411e0067f774542d4a22242d29f10f8b6a5d03498085448fb01a056c80b9bf16b3705a020793046206dba9e0aca456a22a72dba9721181c76ab9b8cc1664def5b3979f0c059a2c3a693ea33f244971e209bd0f1475c61994a536b05d65c5213a70f04bbc9fc7ebef36017466f5c985e3bf06e2d32dcf69335b5903ba1858423bc5bb78c6c8491b4a423acc2dff5969347849b6cee0e4da1526f3be4dd951482a455814dcf18b6b1d2108f51f016241c9071fda6ec6961cbdb6276e372591bc022574cadf9d3d0b9a783dec0903acf275da463dea626f1ce9870396a8b90883e10773e79a3f4d5eaf24c488f7250ef7a5faa6b130cbfe5b6ad2b25c00ffe61a4280eba5903e93b27b12aabf010cd57091fe86b9ecdad6b7032942d5c8d1131b97db2f0b1c1a1258a902fef20611cc753f0a12452661ab014441f5b3420db3f51d6d9286d1dafe100490ec1e977817cf8df45ffe8a53bd35fd844d1f7a98fb3c873c387a4fbcbb964292fe425e211c9b15baf6bc4891f6cf60a64fcdbbe0d5a483fa8c0507e442777a0f974e14cf2fe3d78965d335dcaa0b079662737d36ea510cfc2bceb092185199ec5e6deecb1c0d57e2ca6e959580192ff45b3c222a0119b6d4003e3a0ae8707f2936cf3672bebabd09f204d99c6c4d3bfc22d0df4dfebc496de0f5575af7662b8c041652c14589ce4a4ab15ec096e4098735fe06fa9bbbd1768ce64b2975d72d3680a8662efa5d3daf8f630610bd4c045adfe0f14c2f91d38c855c5b31d37ae8e60b05a24defac39a2e22c084cfafd82a197c289d4dd74b4aa119c4358ecaa0a5943d60892459e94bd1cd653849fc03648e77128e6e94b0bc2f929f764520dcf78428cabb65beafb31225437025d0d96bdd9766d221189760daa87ceaeaa5165a9e4ace484667f79c9639dd22b9bc6798940c7b3b88707d3156606b04a8b104a650a9b55fd42e37980ac3694e5c63736b0354c1af1c2cc76fee2b502d06a45ce0f311c248f821ab209fafbb8e5f2efe58b64203084dfd848aad7c65f8edd2bced25de939082a4345f95c82f3f24ac30794daf1a1b732b9d3332efe69f64a0eaae947a8e460c3f9ad8a49e7b595a2a23bb7ae97f53fc7408a2fa4db5962fafc0913b9aca2f9a7b77223131f9ed2c6718603bec29427a6c975d9e8895f23e80e495fd8d4bcf030427af4b4338ac66204e3ad875adc11114d76d47f258c09a49df9a1b0c537ffd8e80c822faddb111cddca3a0ba210c02b49f5616ba0922837208bcfe23aedeba813e36b32ffb62538ffa7bb6cc7845d10b87aa935b611f71d775512969b348d1768e79c6b127c02200e63b4aeceb7150ac25cda9eb0e9e0619516b79753ee48a71cfe8b1008909e43d1940bd1e38665f4bd9938de9778e97c63fa256670c993d61f95b0916c674e830bce781487f009133aa977fcd3c2a68410c04f2ae948e977e9acf74867b888c93a31290acdfd13b1f70915cd68f0d1cbad18227e1917c7c8411d76885c2e4777cb5cf59cf73402f0951662daa6129191aad5836e1877d4366b07dfc24a225d6e053d7bc4dc1e26413b7773f02f544ead1298ca88bc167ed385bbecc21ff3793f5ee23074353949a4beb95e8ccb803ca62f9414c326df41e2eb2cdd8f0cd7975385df4878b7075562c6aef31a3bca0d050affdc889c14a618be76699302dfdff940fb58d810b80af013e84ddd9892c45a393d6b8eeddee1ae442a5e3a4c9e3ae4d4bae24d3a30ae1837e525bf09ddf612ca692904ca1e35c044f5fa02c52a28b4c8e74d24383527c396b5cedec50b60098c4fc2f0774d5606e83ffc55631f81a949567db3e14f646b6de95db67c1f61fb372e40e641b14d35672274267139bfbd2cf54ec15b8c03381cd091c5ed5140623154c08b6882ec6c4a4f599f538984ff18e6714bd459e75b52f5dacdff5b374b0baa627de0735c18d2a5be8892e2e8b7380fcd8e81a84d18dfab081fdc56d4a778ccae60e076f2234645ec930f5de341e515d419b22755fc62dee142b77306ff984c655010646d2725ae96676ff003860553421de567315458034e3ebef00722d4a66b4b8409081be245b102ee0fefab34ae436dd35ccda34f03678a27d7d70f012ed7fd467cdc7988d80f2bcf95677d748cd234f11b69ac01b8a9bf372191f76226ba74e23bb0f0a0eca3a4951a8806439eca11a6913ccf6a5d537325522b468c720260873127069e61e2e9fb16955b4045525698706f0ab73742493aa4e838e4edbc0f9dcb98a4fc9ec26e81ed7b7e948aab348654430daf3b664e98b1f3c7caba90a0142fc8fcba278ea89eb278502c2b29f85771c34a371cca63ece5c2ac193502bb8b183fb4f1776031bf66787adbd99049ad39f987f96ea0fb4ff8df9a5c628240f393729b5e62fffca4ad94375056d6204665590a9c4b9d275cafcc2509d26cbcf0df20f81e019103b3e89cc47330d3199be8d5c6d3dcc7495f0aa1ff29e57e33b3a0fbd9807bd2edb7e49ce00fcd37b0f7cea2b5973f057f38fa6bc7a1fc5c8f8afbf9f7eed8fc1b0db9b54a52a5f95ebf447aaea9346d98bb280b77768bec716ccf500d708602a040b4203e300e8ff834748be2d862124fae459fa9e69474a1ae38a1920797ac2885d1deb004ee1a9bd4375d08c255db11314a3dff62e6e75de855fed3932c1585fd3ec091850196b77a4ca6415710c3ee2f04d5acb42dc8201fff44c880117c78fb59f7869b84adb37a758939b9a90628a3d32313468e52c698a32e526862c3201655f5c49e945cefb0c418fdee39b8a64ee588694919c795339ed004ebd9e3ab0f1350fc3a6c5a60167aa31dea2fddad06ac3bcc5c933e4f133419df5e6f7253e5518332f7d738516242bcb37ecd91ba17ba5bf027c681dcfdd176da574152788e01f6f9b351bee74cef4997b8fbc3ecb4e1d8e0ba657acb81d0874e181b207f2ab6f3caa750bb4b5efb6fbcdcd2cfccfb8b72f43e89230a101d9512a42bd81881543bbbbb63802f110abc7f97aa787cd2d2359023acaf74970787ed751ae2c320f0ac96c6e688d5171552315af8aaad3b828678b2d4fbea5469efe0b68b4cefb7af29e12d99a26440d1008d63920ab089eca8dd2c1d3d467f46f947747aefd859057bddfb16cf1c0fef1dc971567ca6db258badee44ae4b2851661a5842a9d0508869cb6a114dfb3ac68fc42167b4c097e6e27129a12e48c7a7c8dd303c98739f59f007ba661a764e797ff5f4d6ee06dcbb005ca757f2aa8e6c136e245d8e9c28ddde2d70f1884255e0ca0d664eb22ad454956094911a1242b2b78c8617683b992878c0bf1146e6cd412fa2d1a33dedfef5a4356ffdfce6b4962072b84b7067a676f68e6d3a07acb57b7399908b573da68d19820333b6d216290b36c5d5f88680107cc48b97d7171b2f762ef73c8cc4f40106220f42d8e161ccb1eb842826adb91456bf02bf164f7df3e58671b3320540f6aec011f80c03d63ad02c295cf3d60be00079075e8481f7d512ce5019895d4e0ad00887da68e1cf9ee18f5d09ccc11b68172b84e79246c3b24c444cde58ef39bb61418a3bdd00da4d6449ab3e77a33fe94f287adf6d4625ad33848c77c11393e6275d9d6089ac1ae30663a7bc247886945c7b0a422e310bb3eb86996a2255d2a0f09e30d0b92ab4b15fac9de31a8d27b095e5e70a6c33cc9390a00773d7a983b01b771db1000e1725def7628690a30db19a1db2f97b2b449b0958d13c127d32b87c3dc155d971689e831fd861273fd8b7c882c968199e3297df81f7dad292c57b1a8921c76601ea77d791326688e03e01855daaa108b10571763030cc1cca946c4edb826fbdead307b005fa149dbb78908803137825e09fd3a116702c4b7ae229405aecedf04813ab33c47ef196a0cd8b8237931d7ce1a5e4aa35779b5aebf5db0dc9b6d7bc76965b4d90c5c750be7e1bafd0e5df07102103f06aff148019f48db411e0e17338b0f80c1a0c29a52810cc07b68911e29f69910befb82dd138611485e580c4f03a735aee5d207d0610df3a04bf98a89e4b033eefb3354d3de1fbac64e893e460a73fd5099635ac32a226268a5a672f10723f42d2b9817056eec4840659c97800642492e9283f7507c565c018cb3dd2403790f69989434c1f27428bb3df1e653e8bf58cc59e85ec40e754f1f6799301f15fd96076ec0fabdb3e0a11dbf8b0cc7318513e9fa621488c5f06ccd530693f9d565945ac74d00556c3bb36d59d407a9e278f98811800be7ce2666f947ceb13f7177a042145b180db75bfd1186f5dfee54409a337ffde42212d5f08e8151d1f5e4d1e34a730136bc63f6f27fe231c60d52316c6936d5b9e1f8e12f5d30b060953686c1048b6aac961a605fdbaa78de5e1ffece43cf8fd60105793064a909e47668fe133579abdf3248b8eade57861acd1efac032420225f6b5b0a3f372c173c39f79db7b060122f755a67e3fe6d715a12d9404f5cbf82ee0899b4941eb62c4e3248b266539bb5547d3d5847783086ff837356e6605c857a668afdb442c3d7746510ad0543e7d35b7c8b26e159f4066f889fe3a0521172c4caaf9038e585b252502a54eff79f047ed2d044b0121a31ef87c8e6c8424c826ddc98e99b5459047dac23c8cf59fa4016586cbed3734f1e4b83c3c16fc14ec5c4f019e0f0b6463b2eafd6cc0182f7346e0814d6c1b00136432d295336d871f0d1b4724dfd6363df5cd1305ced1e6108daaa401c060a4b37240ce316804cbde0398cd4abdc4c39ad8968bfd06a65e166a3781f7c8cbbf9db1b354e1ee7a3b17e1acc4816690465daaffe9d6f37a0f37bfa77542711bd4590b6aaf24247c2c1c0e824e3d285ca52dc5657867506d34ce1a6b524ac94255aee8d388a12483ce4c736c562df1b9b9674277257061915a31016c1be32b2700fee36ae388e3cb0e3f8780407b6ece46b0b30a657e73fe054266d953d539cf70c43f98a1fde972ad1903716e807f73231f969d2bbfd5fc99b139c05cdfde7bbd0e8666ab9d7cbcd7e9f3e68692193f091250ff13c7b94cb046760de3ddd6517bbe307de4896c1a60185a901d402e797c760a37f601364b9cb2708c06f73c762021d4bf8b0936144dbbdf0930d859fa2806862279b615db82c2b7a6035a0f7ea76078343dd26290bc2e4ea1b80af691512799f07d563d546b806c7924d00b2fb848c2f4e021c88faf95060a1f9535f51de841dabc667942a5667809e5add0d9e0bb739b3802a6c1ec0ae8d75de76ab1a2aa2e7e1845f2f95fd7ccde9cc5a10defaec486b5f802a6bd0b110f63d74ddd33dcd25da4d6a734e143f21aaca60208e6971502a0951721aa11ea4f03dcff520a5d458650db682bf83b4508fd5f92a151378d69d6725ff308962a4d98dba523c3165a8b6237f6d6e2f08ca4429536309836ce946aaab2bf3b7667ceef45347fceea65fdba03403935c7d0da05c4d4c37239e3a58ee8942af27c466a48f36cdf4a70815ff6b67b6ed33a522b62855a4f62fa1d7618004eafa4b71852b2dd50e730bfed254de97cee2d8fdcffe21e691d18381bf9c58951c2f469b3744292c66be1127cedaa0c4baf971c30d3b5e8806d8385b0be0837d7b69d37b3a559b95c26ff7c05d746953a9fce696368e37dba1aa10cb5ce357c7b1a7ee64b4b1e139516ed3a014290cec1c50bdf02280788e132b9fe45f0a5fefb50859653239649b94b05e7e2db4135bd417d9ecdf397bf5259fb8b65243d36ebaaf08403a56a6b7ab0a443ab079c0fb73feed0ae1f12ce9dd76973304bc8d63f2e83a37b15456d9bc40001c9d092c8836f1e69fb9140b4b55271624d4cdf0af66f8e9dc1e9bbc9874dcb6100cc30b7ac078c47f7599e82fbc19f9443ade2451dc8fc8d44e8747e7b7f5beb48ac5fd8b688e02d381b2b84a6477ab53c94d055866a25fd74b0a5a5f63c296d02611cd39fc291bc7d6c1413a20c902cf3865ab0c19476c67f7580ea8764961f9dbd2002f1001834c0ebb151fb410b3a1350429a6b57ec0e2cf0950d9b581c670f3b8fc1e34d4a03f58a7aa404605c45b334998caa472d2804f5ed846edf37cd35b375b794dd3b8b113bdc3444159835e449c70a009712b6639b113df69a61cb431b6a9039fb7b3f6198242ad0226f295f5c6a289f06087efec390fc817a41ac9733ccc568b1d9764b11c6a510d8f78aceaf20347cb2b47f126dbf87d314759e1afc9a1c6a6bec1647b74ec05fea7717f80d624bc1473b913a645ab140de9ef9b0692701bb1c7ccae5d4a24fe673b91717e3b93d85ed98a4c70766536afb5e802f38f450362ca1ba6ab53effe0adba03575f0b262e992b7032a35c4c0e9dc291b4c97c2f5537619c83f32ce32d2830675b3474c89f4c54c4760b309c5e14c675e3c1d99803b14be4e49257c06516811582dda7991b1178addfe1ab76aaad447bfa62d1fae21257aea3498611d52aa3595f4be2e82757099495cfee802c33db5bf1c9c1b371c6fc1dbd57f4e3db9babc19d60b60d9d8349a583b60f5c13b2de1788868ca5fe42c4301b9cbf0084ccea1436402b542a1a720f63c1aaa5c8740878505629da46835de3306adfd7696e321c2d05df7ce657fb15dde4ec891393410057684a28387bced7e61f5ebf8cad630b7502f9b3c65b186cc252aa0dd986c389dd27cd8d02c9eef56e000860d10e95ea6519235717a472b4108cef31a7d84b2fde8da16f721f8b45fdbfda6e934b410defd5a7676702b95400a230e665611aa9694ad4aad2da42ea8901f3e00bbb50718b8e48a511d3e58805a764cb1c11251aa304f265bc9fe35c9b90e63855fc349ff7e359cbf30bf05bd665e6474a2d9f491475faefe97efb358b37bf4df600d28d97f28b82dcf9436349ce52d5a31b31cb5cbcd90834883b0f92dda6829a9192856fc57d5209465e4423c9e69ff1a820907b677b91b6dc58031303d5fd9bb857a11400577a02e2af12e2952587b3fe9a0c86e66160d0f7ec60232915f418fd9c388e94c3f01c6b2697cf020f9c3eda8df3e7e8f92ddc63730732026313d5b946fd448eb99ee03af4d8f39e38e3bd2dbae64756713e9c306f89c3e54137f0895afeeb9f54bef4bb87be4b6963313d8b614b90b847cbc3f488282ec26e6db5dcc4edb3b77147c3f61ad3363ab801804160a8de649966829bf4df3fc553c0fdff614270b30d6811e23201de657e2938068ec06643da9ff2814ec2d022fd4efbefa65cc4fcb0efd7ec2864f8a8391993029bfbe4640bd6bd086fab349b80dc6834de05fb061ca30a3619644c137818708c7ad832c89b66f030601b15b0799037ade079c0376a619339e4932d7e3950791526aadd6d7f2588b1677f1c7ece7e918267b2a7f86d88e22d5cd4507c38359d54cb0b289ac3fbd8615ad827b27e45401cadbeb43a60052ec33b7dab978ac117eedc40f213171688d4c953c52075070a8b3fbd5f08fceec6f8d7a420f0d9d394995ce46efcea696972b61a8a9042f7125630984071091c76b57f59f70478bfc2b9c5abbe71f220bc9445b653e06a77d176e1a99afc5b5bbde9cc337638347d01474fd0b19bfd76f0b4efeb98473fdca5c678430fe666d2f79850f0615f06a4b5ba4559e9362635efb889fb283604a4418034a9bfb67b7679983db114f42df6c2765641d77e45e8baef1e43f1764df8b65ade4b3fedb5d4682d4e7bf37d5a7fda9befd891eeb437890b7a41edad8ba54a1355e990f2bf440e329d7073fc67e373ffd3cbbb541815bc84b5486048ece65ffe1fe926dbc54a00f6b72829ac5bb90774e5099c20633e47a55b008e77baf4389af7ea6f2b0561043379c4628af3e8d8bc52eacb549c29076520bea8c431c9670ae4fa3487917fada78b13604e9fc93cb1af7fcb3f0718869a9f0792969ec3019c42b93f49386d04e03ec4b924b6bdad5fc0d42f69807c1a60911dd08ca6120f88f762f705fa57d29e46e8b7defde3c5be0e713e9c1f7f12eb279c7edef7c7b5908a4c47e35f19aa13669c40a0fe3e6bf3a4286cbd5be134be859705e010335d91db15f71ba99fe5542b5a1277c1b4304192adda772f5e77959513020938c754c8a6587a39c885618eee822639ea200794700bf15346837974f13b297e2a574a1c5256832369e95ffc7ad8799d6221e2ee526ee6f0bb21100ed925527e8c8e7b7ba6ec67b1d62f7d0ba75296ad374c4952804ab7c9849243da86b1f50ad483170e135d8c9d820f5559fffb682e514096aa6c23a8958801a930772d7f976aeb0e508fd1f4f7ba8fc6dd7081fb7da1ad5d2a5ac26243199b0518841d72a248c0c11cdc50883dcf3c621f32931f570c499dfc42ca1f6939b2043e3018187ed370cee8d4242b1b6651d70ab662799514b1dea98cfe412d8dc18ce5127187a55834d7a71422a22a037a6d936275096650680d6eb1436f9685ae2925ca91bd8ba66838bd23f8fc9133ca5df315f284d3ac5a1bea85f5914d1927e42505c64ce068f7067514494a97bdd5a2e206b27a81378293f636c0e0cb875d41200675ee2d0a827f2d808543a2c8c1a3cac1bf4fc4e60754abdccec2a4bc40bf248258a97b139b953639fa0ff8bf9010d52b287a8bab22fda5eaf4dc4b7013f02478a28c9d1af5438937e8154c3cadf8eeb0a3a9280ab9b52f91513d07ea414336d8f717c30ee98ad38d72537eced2f81a1e17fdf78225830b2d7f07ee561888a23b4894fff2f1d2dd20f1c76a121b27d9a401c630239075a20af2cb1fc5d8208299862a7660d27ee1bf85a647a0ec47658cd0bae52c10aec2a4c5b1cfc2815701389c8d72098493c027e7c2f0f08903ce9c0a93ff9d9a084e1d70f8af189e6a0342e8034ae9c8e391294f7de4b62f40d5e19673e4dfa48dc07d85e489b695f69d09abd52dd36e8389687f19b2ced7938d0373ebe1362ab069a3a6efa4a6686a1c2d083407267d98babd9b02a5e78a690434bd598760b0f93a9517db9f36ddaf849102d73c13b2fed034583ed3c1b6bc23dc286ace28b35e362f3d1f6c7fe110b520324c44649a17589f9d1811cd412e670e76dd73653178fabf81d0cf38446e3e2b3b43f243da53e2fe4d1ba1147f7344f25afb2e4887f72ff196e551de0feb6edcaef1206dbd1b25c381a3b1204c08f2d920945bfdb8b38cf6813291e8301fdbdf16f9e2eed4cfb388a7b7d6d280789fa4e9fad83102dca538b92dca21d540625d614121987cad8dc15c41d08ad83b9bc7ea9812181dd6cac55400d939770a781c999823859ca54f9909ab6177d5bf514d8de8dc2d331d80ec8dac8ffaac8a451648a4fefca73afca857af9a0a1cb2f97dbc2999565531e343cc564c160ce023e8096477456cbc9560f16d6a9213f3de507843833c1f161d2b7e1460d37c5039040021e9e1a3edcf38ef91a61a9da403b55c5dd34b964f681f43717fe0b0f016412a1e3809d7a662cae02a03bd0a6fbf2b86c985e8a77039ba8a70f266a257d34b9d02233bc26504662226a6132ccf5372335d0451db3f0b4bfe3cdedd4af0d25064bbadba4f5b6993b36b4e70e478f98dd5352e5f567b85af5492b887310a49690cba13f982ccaaca47acdd12018192b572d67261eed6ed1eced4ebe182c04be813fe12667decdece75161f9042d0f83a9ce7d38ee91982ad4d8fd7b68b48b36c95d6fb359c69ebf13eb6f1353955af7f2d32f4f2b14ecf5b84b85e8449dcf9c9655cee104462c29a8c134728695d57cf260dd7fe600db3f0fc2cc26017ec96ec56fb0f003615b7092aac234db925047ed6d52cac57f92ae434c0f3580fbd426bd30c9b3da6e7e961bdf780c1381f561ec700c4d4d80a7109393b0e21e0253e32ed2d48968aa911471b18fe88fa7d4c61c733545ac16aac7e795f258ab5ba5ff3a8b9c28925c5fbc3ddcb6f3824173b130fe7d1edb07114b65ac5eea1d15b800d0a45b8af9af0305291f1d00fb503c64c94720b1dfed29d3b7d373a75aac48ed5c4c6d9e63ec8de93a2395867c66a91f52d271772a988e3e593d7d64f53ddad795bd8571ccf37014c9a3ba2ec81e75cc1775fff39366338f6069347c18f3fc0a234e09c364ef92a4a333828f055028506ba79811fc44e9f6d0a5e8a0d239a1e29b8840048ae5f9c34c5938b1eeb6672fdcb964039055338887be1ab3922fb7ac0fe0cffff9198e395c7f81552c135971ed0db30099c0b46b78070243b0a77429026f088a33ca22406df9166f28484b0376147c7b0923b82fec804433fe003caf41ea99a0721e002929841efee3f17210039270515c9dda3cd89bc42061a155471134e5cb8c578f35dc2fe12cd516c826d995bfbcd3a7bc99c11cdea54c6b5182e4468f1df462a02ff8d4421bb7d1c63fb341f0dbb56298e6a15c91dc2abae98ec89acde881c92c6de254210bd23aba9885916209608c7e14d296d1aa81a541a2ceb04d9c328a75f92e1619f06f027d1baf077d77fc1a78804e0b0e7e27659e056c522b4602342e3dd8ac9ccae9b85cef9365c170e9154fb8602fbcd97db075003ab8e80521aaa5bae9e6fe6234f2863b1bb95f21e258bb20bc3ca780798bab9d5c1cacb31f5e6c16b4d78983b481f2f0d31a1643b46be90de1ce54d675f2132698d5a79d8c30db07de3f4748c9d31bcb2f2bca8f44315ae99c8c53a6088660a9ca24a4a1453956755b534b8a8ec6d9cf2534449fa04dd232eddb09385840f88e0c04c30549ab56ffcf2b45e78a8d402026a6f5d014579730ffa06bc5f9724ffc67c6253cdcd8db9d2506ebfc2ef6c057374038953acf06e17316dd12cab6e76e21310abe0b0411dd8a007319181b107bfa28e03bfd04d34203826f20421f695c11b7126da3bc80a0062a283aa63914c204adf5b26aa234a4d094898b96798bc3b24ee2791853b515d87efc0c60cd62b6206ca33c5b134ad3e56f035f20f514dbe9e72fd6bf9cf610eeed1c71d6fa821f3c1f69bbad43a6c52b198838e2299c54825faa794fbf532a8f5feae05bf67e920932a6e02226bfdf7351e013e3bf9679bfc2c254b71ad82b9071c9619f94bad22016d5d9c92481ed459e1219deff276e773ba705df14a1547ee8fe3e223d30751c85682ed519409a4e17c051f0233056420bc9b29e28f849e0216a50805abd1a163dcf32d0a2762e6da38d1b936c4b14b614e66c90e060fcf56279e4539310c8e8aeffd3eab1224fbf3547bce3fbffbc6e77c74e8b6ab5740176759e95986ff00acfe7b21c3807ef10bd25dcde3d104757057086673f775b8cadd1a934dd94ccbfe7ace6ce5b6b4af46b10806eed9d5efdb3ec9eab586f64276d67112b9ecabadf5c7204b5fc3d7203a3a6a89ccf3ecc842cb4dc93ca29aa759f57dcd909be071bb3c4663d347be359777100b92d3ec1bd7f0efc2431bcdb8b193cd2f35ed0831feff86c55ed15216feb390b5a34c8c1ab4cbffb88493bc3198e08e61579f773a7f9261414fdfcfcb3ae26cd38198d91c5874f193d109e4d513b4101e58ef7eebbc3906fd101989426c85ef4764c6a28e3ade3884516e5c638ce10115854ecea91859c6c85c7ed0712f2896069b3ea2e664907033bdd570ccd10e719467f02f6205e891a4198ea6408790648c7cf098b8a5c2ba8a16008f19e01684758c3264c88c06f243aab15ba58e061f8c913746a5d65e547eae5c724023be228719b3007a38b3024272b31a8d2147cc8c52a9d826ac8cb582549e6c5264dd9da3a455f35f25c18787a23f5668d84d0a9f1a5ce25406067dff3bcf0dd848dbcfdaaf5b9bdd774933ebf1d1a3990f6179de1924b9f56df49ac872f21a9f10d621266252ae80174b78dbc9e487366ee52876289d2e74efc6c64e5d1350f37664ae63a8216fe9b0036daab4111cae5fe872281a1cffc26be237893d2f554a223f5644002737441b4971fafd3ec92f5cfb6d573cd08d1f3bdb2997400413ca5f9aa4ec054c683494eb14b7c3bc33b2240bdb54911856996da2b4b0e05841b0c90156290e211b1aee77539ba067db7d16e1205e69b142c81779cbea478940fc48a1ca2341042f761b321eff8c7161891a57e7628d521d775f66e3fbf885b80ce689e7570b149d96c07740f782e38f18e3ce86a4687bdfa9fe22b6bf617054d0696530e55590d65f0654c4dcb192cd1230e8efb2c3a2f51f25e417717aad98d142426c992aa7be4b68f9b28922a3be9881dabe508d01fcd6d0fe6f3b00549b5abb6a67e6aea102a076302eeaddce94042466298814ac127786abcb5dadfd26e2f6080a440b4175f3242d96cc71f39e525329eed653909526335c02a6c1b5f98b36f18d4b4bc02e82d22aa24526695df15a6533493ac2d576e2f90bf7dbc84425624bf2d254047ecd89dcc68a13287afb90ce0ad870a33724c64f7a0e31cee8c8eff1ee1831c941c092de071e8ab733f8280e2206457a2cc8066b6e049c4b39242b62d35cc60c69ba0c1518e12e22525a7fae0c86d010cd3879b2cfa51bd1958337c746a0138480ea59d8356a24505c584432d4e933e6544c41dc3d8c2edc3518b9166c10d32119dcd810c66d24e22346ac3d1d4a7f3de7366ae555d17745716272a99aa40439c6e09a230d490e0c9f418f4c3e57c311288c84482b0051ae31602181272cc2e49d7a23e9a67e45760c2411402666b1f9e12f9f51c654acf0034a55bdf5217570223244f9aee80b2523d37a0e6ce655bdb9c9171f982962c38db229a29d0a3a4f6154cea5dfaafe22df48d36342d6c3d70e93ab25532d27a652325c73a8b908e9726c2ebf9fd5d5822ad66879c414cda578d8c619a3394fda1d6fe21f7569c437b6b4927e5a5d1a66d8ad1e0906f8cec17cabc646f3f281b71c42fa9f4c277fc76f8e48a1e131e6d513892666e14000b6418005e1548e1896ec3cfd672e2c9d47ea04a5a3b09457f1ac4b730389a6c6e459dfa0c7a110f5e7c2062f082e4a013fa687cf189f8d45030033fcf0d0ffbcc23755d5762cfaae5be5e79fedd6aea0b9bc01b8649bfd501fd610858e603eee2e7b4d28ae7adf0583c06c3c087389273a60ba671d33fcaf178f6aa0f83cd80a4bb08bc20b94fc55814c85b29f4195f0c979b8fa41edd934d34feef7dde76fb3a93848341c8cbebe6b62edb88761bee006b8e77ccd76be0ad7e41feca4362d5553b1d5bd63d97d9b0831a5c873f1892e873deb03b3379fbe19d99782771b1c99e0fc32ad797aae17e1828002cec6f87b6d1bde7e24389d8fd6bc5ef254eb19dc759c7dce2089f46d170c11b2132836fa657e004ba9ebcba86cccdc8cf9fae696777fec357f078a7e64fef36497609d08cae124496910d9612f64d08bae9050fe98381952b54cc3e2744b10f52fbad469456afda654568dafacacde8a8601b9c4d9945727b5f49d6624bc6a4493937074705e35c3347264c64f54c07aa1db272b6b7d37478b06a1c9d3a72854857c0f72862ec2b81a5afe76a745f633114c269aff290da56acb84edf5aa1347fbbc288a7706104b43f5f4c9f3b5fe53477962d02a291103f64ccc8227420a99807c0caccbfc8cfc14be88dc24fb3db69f17ed472a45e7daff71091f7696a3999811e263f13960ca0f346edbec7c6a672f99bb361aeb26efb5d8dcbe88b498020c39e740c3441a61b14e6893fcdb8c4b1c2991ad4e01560cdabf94eb47185d9966262e4525d36dc17265fd77130f4045bef1a781339a65242c189796f06d08fe46de9e55d2438bfef6d808f962f6fbfe108e7b559c6945915b3986a993475e9c18d7973077bd6cd90a03e5c95ccd78b3a91e29fed207cc6c4b732a371227847750c4ffdcefa114f9e4a3283c31697827a5bf224e1c2e42fa9bb120fc87cf956800116dd31a70bd975a336b18693a527e9c73de4fbf37e57ff72a791df703b4e1ab30d0e461b4ee5b38103400a5e72c593d23c7688bbcc9b3af64227ffa5509b4f0de0ba6d522f3863ad4e04a359b477c5e237bb15fe20dbcf52bd4ed6dc38a528bc67afebc2a2606d1413ca1144312fce4de17799baf882fe8e28d3ed2000609900cf6e8958cefc1a40b9007811141ce122b4d88f4d15484ec0028f3e65f1a56257f686adb7d54e32791d9a767be74e5a8882d70ed4212575d6a3f70842c2e40b68d791e7146a6444347314570498fda9cb68558a069e9b82df13b42619889cfbb7237be59138a11bbea94a6182019f52ad28c496f6800740f32f8ed209136086406802d2a4778eb302082bd69b0ff3af68ea87c2538408e7d97eb393a1ef053e0e52b9692d778ba1ad2b5b960f40d1605fc9ae179418fb88997d506b9b322242e616c18d14420b4b8344b52a0b7abb3dda42aedb87b3fe45e93f3e1523ca82be6f184361e19d49024db371b117f85fdc123cf6b383b4a55cd10182078cdbb16fde54e4748d7df468c66fc2d3d5c93b470a4cff1bda2dcb96b3ec7739e46dbdd30b70c742d51a89359043d8760babd76381a0092c71f05fa3cea4c64cfd37106c2cbff0dadc39e1536924aa394cb97148933794684fb1bffbfae2833e2c333545d02eb6cbdbcf65b8bd4d6161c12dee5cc13023c6bd886cd413417cb46edf1cb4ffa611c50e0ef9bb53a0b5201044f1f1d7a84d83a86e515dbcbc0aae328c4b894b0f7384f0d40ced95d7359dcdfb90502f2674a229c3ea219312c333313371ff1cbc33c4273cd4f3c416454415204c72fd9c6dc81319adab931c11374da0284259a8a19cf9752bc1bd2c17030c9899d4f87beb3c7ed17cb8ccf247a8f7b5d49c79cf91caf83069ed849f026c78ef0819b90f24c066025679e24c4b467dcd19c2b5ac219806e20c35b3302d4c96f1a879f8960d5dc859575058d5652278ef341ac20568358b52e5b1a65b0994064e7b0576e184cb2e82722cbf8297e0de639b0949de196651c64dbfcd891a194eb2d3e323c1a124d580353f407f018e4821d612154514b06e972a3d53748c096ecd4f38a02aae4966cce190a7d704141119265c368503c0fb7c538527ec06d3fed47aad30ea6920ee45eda35d799b8af8a867a8a94c0edb44079f27fa7d0f7e2ce56cd7d2ecc5a3b998d3a6538b4d508cf3002dc366d6d4be070d91cfe36b246d01a0fa9ae2b1c2b10a14f521cea1d7ae9e0e2c064f4024676f849d36d2fa57e44ef416b12883c505fa9b1cada820d2c91a5e63821d0e11cec138f5680da63d700bbdd7b8c1e6091a07ff37fefb4887021d9251f792482b97d2748e5f4e211880ff809488763731968eb1e66a824003b2ad46797ec36cafb2b238e4a8b2dc0b66e6a8a32b767136e28380752f4c46655a17cdf13ea1ac8720399f18df2314db099d67e3f5b2a2fccfb3882b65baa8cdba2afc50deadc4e6e5dbbf8847de74098c33acff98d805c7fddabe6bfb6c1a3b53491135873768072c0a053dd3a4fb4ee4fe0028612d52b4519ce1f2d84ab7fe5c858ef643184b26e5f0461fdfd8d1e4a676ae05e0a5b47827800c39a818365c7ca74fcbab407b1855e9a5a3aa774df8f6d152b0ae30173c251836af4e4db0b64fac467f8a0f02975b8e99ebe67b59c45fecd5e9d389fd974c373a898d6f0de73304c0159e38938de38f4c0d0afe4c94cebcf538c05203df2995b1bc8f2f9ea1e1e4b231ee547c232dafa369ee678a1d0c1b807291a0f9a12a643910b6ef63298ee70ebe5b0560d1b4fe6034fdf7028863ec182c62cf74b633ba88484f5a69a13e5c1d70619bfbed270aebc9ae3780f3cf685677da2ea0d2bdbd3e9e78b3a7270445605b83544a8228af89ea36e51718a531dc25396ea4e1bb02c34e691a6252408ff325ecf33d0bd593e48631db727ea43a657f5913484ffc0033befc8a086c1006484160b0727ca3699c56454ed04d9c21d6534c8dc37852f88b294304c2eb36c78aad72e18149a7460f598cec914c28bb6af64de100d2a0dd8a730864dd29ce92da12cb0b329648241e6f83a7a77b867566809a48f6899965b6d5e64861c98bc6548e012ef1c335712448f31a8e5392c246b005b7602df7888dc76135f3eafff4b61666afcf9961c7c2c3d562d330e88fee497bd2ccc13b3fcb4045e18c4260e511020ee4a7549b768e229019a1c4e1e66094542309c8c3014346292e7a35aa0a0d87fb0f41b6960844e3d0d112992880cea0f9cd5e3f90e2a1c58eab92dd9ee2de28a7cf2883fa17ad0769894fd7c7c9b02200e980f400e4a3f3e3df63a292971aeacbf69cb6e3ab6712994aaa6543597941de5887ff3757b5590968f0e05ffcf12c2fa714181a19be9d795a52f94279c9703147982829aa99448a97d9a4a89a0dad6086a4d65bce5dc3725fa0afedb777d90c6ff0705f1deea18c704635354a5a15b57699c5d5376ad9d5bef68aa76fe6efda3e47304db8236575b11c1b6a08deb6bfb82c1b6a01f259fa30d886803e2bac77c60db4b46b5a66ad1074adbbb719a0b92d58a36eedcbcabaa2e424257a42e63955874453abbd3eba649ae27b0ff47e260dd4d9360dbaba36c1cef2a3b63f7a6b46db071fbed1b10ce401dde5a76ebb6745ba5bc0d286f40b80a6c73c72f7358965e755dcebd8a3d37d8176e53faa4cd54754a13056d6e8ac485b57da6c2a860b01fbc0de04acbb81ff3c826e5b32951b249e16d001b551518d04edbb7cbd83eb5e9a26d838daba9acd50be4d6562d6548e9f5ea2dbbf9fab2ed4cf7d9f6d27a9b6e2f33289575d7dc80789fb946f8eb4ef1745b87783ba5571a477237b7aba97edd297d4ee9736bd3be6aaa3555b7ed294aa93b713e54f4f6a7a1165c4b64ae2542ff0f84b25bed4daf64b5f7ededec654282b4b46ab4a76d9f71fd6482b49d34979bedd4d5443a85c1ce7765d397956d6aba571abbd37e4ea527fb6e6e0ae4a643ab6be4d540ee9b6e444e9a4b44d5dbdaf6192d062f686c4f986a6f8d5d913697c6f6956ddbb2f6a6aaa67d60c526f5573341995e1a1367d9269d45572427579aab3d35e2482dc7b9049fc366a4e1ff7f806a9dca6744affa9a76397b56da89235d75beea5acba2ae308e708aff17f2aeb088edb5bdbad6a9a6f4e90a89986ecb9dee49737955fc07b93c21ffdf9243fc961c46be25c704df9243e75b6fecf8d69b36df7a53c6b7dea0f9d69b27bef566886fbdb9e15b6f50f8d61b2cdf7a637eebcdd3b7de187debcdeb5b6f8e7ceb0d05df7ac3c0b7dc54e05b6ee6f8961b36df7243c6b7dc70a10688771d09f2ae2338effaa1000bedfd54f57fce12ff9f43078e13ff3f5a7073e6c851e3766370561c1de4470639750cc991e33fe70d900740136773dcfce7c491039211fa9aaa514cb8902cf9777178709fe49fd5c510cb8a8b8392018e1f6c7ebcf19fd3e63fe78dff1c37aeb8bda32cbaa6e6ff8f3054fdaedaaa57a553ff396db0f1c38d967ddb9eb386aaeafd9fa346ce0effba9dbbff396c7abae63f870cba228511464e1a3968f00ef59ff3ffe38c29ca4083f7154a8e9a1c3372ca78165d9172c8c8f981fc901ce939b2fdbfcebb8e58f02fd36b4e9aff1c09b0e88af423859c0838e58c91e3aa2a6d09c8ccf513814f192e1f33dbabb704c0f040403eac0ff781faed8abfb6b74ff98cbfbd5c59577b0e2c1c1e8ccd8d4d4de9f3ff7cfd3376c63afa7fd9bb8cf8b432590e5a531d1474526d170763fcbf5b04a328abaa1a455d1c08f9ffedf5b2b03c71159152048a5fd9f49dd166bac7b657cf923e35b97ad4e834eac96d3932c8d573e4eae971d9ed6e6bfab47b9549a5bbd5eb65f24ea57b140ddeb50114a68b489a7787b277059b288868e92fed4da3c07eb6234a36d8c64d71e5c6ad28cad465ec1367d926aa3ac4871879b7d6a9f8faba431be7c284a0927024180c6567bd03e9add35c377d61477bebf3855df52518bb699653394f3755d5a8d510ebba408f0bdc5cb0c50554fce6b36d2fa74d6a7b55094202c605efff0fe13d4bfa044deb0a30fe73c4f8ffa6948d42e26b9f39bd6b4b23721a725560f48fc46936e5389a6e6e4f59174a5b3141725fa09646c4cddc26cee55569934cf39525e2a8b63e8d3cbdbdb6b1ef06357359b4abaf913588aae6729df977572b767de2722de06ac5a1e36a9971b580d8d877735b0e00ae205fb88274e10a32852b0813bfbdba03a1a06ddb6aa8218737bff3f3ae20eaffbfe94ed5d955e90a0284e40e197997046c9ad45ed593662cd4aa674f516f7f7ad232e12a13ef3cd54dba2d4957043e425c11007145c0a2c305811a170462b820b8c205c1025c1000f16faee9d976aa52c3603d6d473b136ea5b140ddc6be40b573e35a16a575dd966d6f7275cb59bd335a7b6ad3ec7a6bfbec4cf7d49ac26030180b0bda843618cce53620d80b26a5dbbe056d5560efacb6a6dbac77aa1fd8912bad04f3d960475ad608e6b32179d70edbd07463d7d6477335769382bd5eb02a1bfbaea9abcf97c6ae7ae66adeb2fb897367b31526b575604ead6937abc0b6976e7bd0f6e3ca68bb4df7566b750b73dd94a3a8528754dbb6d7c8daabca2716c90f5f69b0d58a5df2994acf0dd6f6a69685826d1a9782c1aab8dbdb5d1d4342dabadaf946a5d2ce8d7d37bd6d1c4c4ab725d016b4e9b67cabc0b635fde9b023a8a6928939c58909ea09e90826057bbd90aae8f64d37a0963dd3a718906ebb9bd6aa6c3aadaab93a69e3dad70bb6f5d9dad25e1feec7a7ed6ffa7ac1b6d7aaaf402fbbb6e9cfebd63a9509abea69dba66e7775cba560fa65691fc0aa6cae9175a6651d28e5eceaceac7efaa9d7555bf9b47c8555d96ae7c6c6de2edbdad811a827284a47b63ea5d957bf3a91edc7479602c13a18ab5f2244dcb7afafdb5f74ddac7c3655a73157f7dda390366eaba967ba5dde5dbeb2fb5d3b4fdda8e0c6cb9a7624df72b3c44d5d3740c6bc108719715811879938bcfc6c6e0ae4b3f5878a238c83678cabddce3b90db6d68438730665ad6ade000facf4173a60d1b6dbe680381364ab8402e3b5bb78db739fab762d7cddde2c12b84ed05839551484f4ba551c9a4f5461b8eeb363735d2f697add27d36d36f8419817bfb1b4f7dcc0b9b1b75b8a1861b62b8e100f6dd7eb635dd7c8a6c28abdb971bfcd59b1b49dc70e0a7d674cc0bee4c96b601c2b68de182b61c30fe73bef8ff1c2fbae869fb72f19fb3c57f8e16ff3959fce760f19f73c57f8e15ff9f9353c50fbd5e3be57d85c206cff63272dd964362ae71c1ff6b735dad461d1ce77a53d5c0e2d500a383daaec6153536359ea8c1b5dc39c5660a1b2436ddff6f40459d4a4359695953c7f6b24d36eec7f4a1622ae1f512eaae26da5cbdbd5e5049b66ddb02a024c9e6ae017a8eafec99c61d699c49038cff4d48c9b6bdc6ac90851369a0ff1c10e7a99ead5074aa0eed74c6f6a7fed4d553f7b765550da5d55d2deaaadad288bc961a04b4d498a0467d33c83083016600f18fc40c155a65a0699541a6558612657c6568f0c59a9a4ab553aad66dcd4ea55fb365f9ca9e54bbc78ab6a4819ae956a751f2bca7bac9eddde883541b75b75369a8ee3af19ed6b8ee4fbcb72220c3186acd74f9dadd96181db43de562efb671afee561ba7df8d635f2b261b87b29bac5b6d6e4b63dd24176537ee4755356edf94f60373790742d96dcb9d4aabe713d9be32f9dadd2fd02f60ff4fe3a2d6da428aff77e05b5b30608b30ffbfc55cbd6d2e3bdb4edeca647ced33b5bbb1a9161665b82df7d2645890100cf10f25fc2f218229743033b4000f343495396207206ee7a9fbd298fe719c9045800d2b20c035abfee784f9910615534d846f5581c73fcb7b556c56c389dac1ff6fe55b5568715bae0a2a55405541c1bfebaa6ed09b9e3376e778d93daa650666068e14b0161560a828a14545fa0fe5aafccfd1e189fceb40d09a028daaf69d032627871c1cba8c7dfac769e2c71938647242c071c00d3624a0869c2f577ea440c30c32c49003c30f28390878e1711c6895c1e33d70bb0c68af35778100bcdc32669451a255c64bab0c51ab4c5726e7b7a8a6c791a387204f403b4d81de967300ec99982d2770d0af979bab5eaf74a6835a4d88d13601812680f84722a355b1e7501357efbee9696e4a8698fcd5040a916e2269883e9bd8feb757130c9051f39b12a16d7b9169e29f0c1832379089fdffcf9664f319b2bd5e57ab6498fcf672c91c2133011334fcffbbfb9593e606b941bc773708278a06b021a4b5c3019e5bf5a5eea22853eddcdeee72eeeb6a75eb556aaa5bada6af06aaa9412bbb35baf5ce5b761674aee991b7d78e6cbcb71add5cbdfdf0eefebc6eaaaedac75d3b0d8b668d366e43551debe7c66e346ee3fda7e6e32e7144181896f0d22eb19780f2ff542a8de8bd2a65ae8ed2afb492aa773ac5d65a5666a4841dffff3b0000882356dab6f6f64d81d0ed0856450ac6fbeb05abb24dad299014acab3c3557f6e59c14ec4a2bf553055ada60eeacf727ae967529985ed38d48a77522486c249e5e401ba7b1e63862ccbb697ad537293b10f9cf71e1755a7544929223b8cefb4aeb20f64eaddd75bbca8511556c2faadd8da019416544132344a04d0990db81288b78ffff559524a16dae36dff4c4e0a7881083b5f39f07072d22deffe77e76cbfa6ced79b21c00052b0a5614507053b47363a754bdc160db9a96494443474543a5d312143e581520718e5400d60447c31e87ea0847c5a11a6284f7a24e992d21d208a1c3ffbf3655559b4248f0ff6f9a9cabaa4198c00691f4ff5b42d836b7e55eaf1610b31fdefc9026cc92ffedf5c3093f6cf981f683fa83953078fc6f4ab617906efb98177278b349b1ecf0818d9c16587877f72af75d53dd96503e60e083cb87067cc04182d257fe7a99e6193c6830c4ad75aa0d6f41565a2bab15d4ca69c58a152256aa3c902140b81d065a6162eeb774f8e25b3af49012b01cb020fd1698ab1f6a8169e075e000c26ae5d042100e6970c802072cb6dab96d40bc20a5854353eb0635ad1ba4f856979c6f7191e35b5cd67c8bcb18dfe252e65b5c8ef8169717bec5a5f62d2e55bec5a5e85b5c80bec545e75b5b28f0ad2d6b7c6b8b17dfda02c5b7b624f1ad2d437c6b0b0fdfdac2c2b7b614e05b5baabeb5e5cab7b64cf9d696a36f6d11bfb5e5e75b5b22f8d696ff969638bea525cdb7b4703164674747021c1cce7d529a9cb091938710342cc01de008091c4f00e1206401242da4d6977ff53cd315870b1a9af82ff3ad19de7c6dd59a7d5756e5f47f4e91ff9c1e578dd3785fad983a8ff29fb3c17f0e919c0c8c6448f36ecb95b0d49a32e67f4d5b31f09c055a308cf0ffba7aa6ce663024f941220f40ae7461b31d4dd971af208d40c11759a858b8e24a8b203213d540aa060a8518182668522136331cc8e22547faae21248c304e2ae992316ac4885932220d0014535988708244eccc14097b3871864a4c070d7038fb607214a3ea56887cbc1c88816f0001b2028630622c13be8802c4aa3585c50319c8f143cf1b53326051009536189c30a5eb58c1880d9c803105c4c416363a4c0c80deb1c70c6e5cb96144a338cd8883cc1179a02a5ca9c01a93002ca0514cc062010ad0a20194c81768f0608101253d0e0d1c4085cb95ee6328e83c380f367a019a8c10411d54b4e94b627cb104e5baba1022686214b150c4d37062026ac206426e840c53d026d444f15ae972ea92b8e24cc4a2978e28a6e011008113f889e5b0c75013258568491f9b8724ae8c123095f78c05045019410214fbd5c5a96413668bad938110dd60a387930b3b9e4c37db08670288645001360fc6d99560f365840fe2c4522364e1e24bd07b98f96202497c0de8295e45402c5841a35d30033ae1c1962b6dc53d81bb628f3a340751805184a54019d81c60d5085366c081394124cacb478e1b60252c89e14a308204cca98728147270aa0386c19928e5150c80c35c830c33a81630e5309310001b37af248c985c52d84188d41bad793413a1b6a6892a664b05906b92c10810cc388232c11a51ba8010c48e10570d08820508af0e94209804d080b02487498f9296214058008c6c070d1d440a0c2f51c6252aa0498141c50449152185d415256a8e62582393fafa50da29a3298ad45f31f3e2895bb362851915b811c4a98a9518ba1c91199280162b3a8389410ba4ceca0046f888a4018452953b7e586163019b922a50d8e0e4490a3566a892425051033a08400a55a20e60030c483ad8a10a11205b8aa45040042a6d2270ea5409c2810a03782c10b5f470a12282d5511e1d06998a120a3fd8418119262a0208d3460a17180fa6a0c18613a910146031a58821241054b140c494abaf480f78b4724c29b2e2c61b413e504c79600f09ae8e864029629889c01460be235276f8028dd1cb0f19296c03d23a9e080252483da48507a9a4e42829e17a526ea27021f463471448a410e50b1f10b8b9810d3551b8152e070280c34b944e073bc6b47ad0283d6c6862ca989792280838e99a4c01431f512e00e120072f22b822aaca1225581460294854112cfa50028af10014396657f001b43c8042668d21beb8cac00a28067072930626240c940f2440c7044918b101e5020464708031585c2835d20859f3a8c30a94029088280243992d505b888a0853420e1c5493180a4b904945a08230b1801415b30c9ec8b883768a91c47efa010f293688b0c2f4e40609008e285b1a78122a228522e6d0443c0141618707f82cf5387d11a68dde00313070ca810a82057ea650e1941269654c14413a7d16ace0004e0e2a9c7e0206ae900285fa41154d9831041460960f60988182a8ef88990f6057674850068aec832355580bd0811242931d3c35e091c3e46c7aa20c1e04843758d074000ab8f9e0cd1e661394198a48c008922e4d434a06a041c203be30bd11e6015c9ca94015a6055880c50f127c9980890046a069f3804b02a6a424145a480d588269821dc2d0c080c18525342e20c004c828fa61498c1e690a31900d2c59714ca021830a254b44289819624d0e7cc90131afd18b861c94c270e2a70b335928500ac3079907c83d9a28ada71469b08047ab3432fd68c3833cec50fad1a625a0da85a42d30a0f530b3c182241ad68080011d47f024ed36d6ac89820e264948d2e8b0e68c913dc9638b921c37c0a23c91820b5159a3d47ad2421346a34949104fa850d0c6150a2830f4a4e78c124c7055a18593374aa82a19ab9013269868e28a614be78404ed4515197c3ce1e4030b1e8000175e83130b40e002c48a170b486cd860303a9871919018c148124a80b182a465a7873650de144846540c78536405072409dc4c31658b2d4947691480e60e21666a473ed87125851a30faa895d243ac8082358e94ec1f39ca58e9e10800229450870d4e3068e285165f1c994007249ae02080314551520b9ac482e4b1456d4ba38947a45b2a944430ea838b04b82186961f46667c488388511536182160cc124be8ac0230325570630290237a8c7e84a690605270a3ac03abd1438d3086944f18590389064108509e300696357d8c80534211510703f20fb0dc503802e483e3021337ae8a6a63dca00493258270a838c3c91d4cbcbcd96247e9cc0b4c9e54b0060d1a6e9a98f01881c1d512292c293a43ca1a980b4abe68082864534b66bea8ea8b42821860be68a84c4d54e3e58b1aa0b28383ef9f084d135264d0c23f5198ce06364bfe896415c010463caa62e3ff8970c0985b1659f419c2186107e162881bc10b1e57ca98c0c29229bfa4e7df042923c76d393605e25fe7071fee98a30d161aac32c888e0d9b6ed69e648b3264d13ffafaab4757bf559ed4d43439a150c90c6cb0bc8278d549a6d95d154766fdbab37daeeadabd729b66d696e5f59f5075dd3202403d85a765bd24bdbcb4ef96c9bdbd754d73ad58f11ee3a9a95a0aeeb3a9a159fadcff4763b8cc8162920d8f682b1dbaa5b3d33622a5978ff7f561fb3d5b16dba29cece03638c2e31d2e8f4a0c383ce0eff3a61fe7574006385d6a2b4f53d695f48cb1e2d0c29ff1b501847ef0ac307081b3442744e62aee3701fe1d1a8ffef42038566099a4f465b3b1a9f9f69191a2168feff4c1b31fecf0c9d79e2b7333c3ceccc08b0ed5d5336f6ffb03350679efc3f0cb64dad7ad55d65d973d36fda9d6e12183d80c1b341fb85149d196278b7052fd47821e45b2a2e2face81992da2b430cae4b738abd7ab6a9ead0ebd5c110437418f0ff4cefeac2842e846c81c5161dbc077dfcbfd4bbb4e08fb91c74d563415a1c3df02e2d8c68e1fa7f2346b62c4ef80fc17c9445ec7df08246161f162d7080450bff6f5e7559509031d705055d21c40a3e56b61d9ac9a0b4535343ffb6fc6597b8ee47567d89eb7ee4aac2016dcf92aa33591bfb7f76c9ed53f4669374144085140ab8a64033c50bdb1450fe1fcabba680c55c1d836d1c9b6a1704c6bc0b025e5e76e52e082c1982c0ffbba488e2ff613c6dda7c4da9b610779190663228bac7cc8d4536e55e75dea7b4a9b2ecb9b3472bd3810b8a312e287880e2bd28cdbedbe6486f77dd219e9aaf9757250586525d7e4285ff9fcd74d493cd95b97d4a736a00c0850e97256ebc5e11fcbf13474e5ce004044e3ce004007e36d366d19b2f210dcc1a0a10e60105181a84a1d744e9420f0414017a60e68aa033009b345bfce8b2d9e12273848bcc12323d2e269470352036e6ccffb72c1af54486f4f6a7feaeddedbd35e261d5ebb504035c0b68bddb722acb9eab90d055e72b47328538ef52d9e3bdbba690d08f4f92dda3d6f4094f85381292104fe2d63a15475ad3277daf29d5cbaaee164ab27bd49a3ee16bfae40b696b57cdecd190c0f21c297b34ced9a2d7eb082c8ea0721473f591cb08220e8023c5957f9d542796c3c0991b3e0b96344448f97f25ef2a4289ffe7f6c62e15d14211b3ff229a8ae08ae8d988d0c345849a7f2e0a11649edb9c5d8366380f8869e3b69c1828c428918418312b9b4e9d419bdefe75a680e8a0ee9b9eff3a9d73dd63ff3afbfcff96733dd23810d3e312b38198ed8536a0246f4ae41a624c183cb26b0897105c3c0e08385138610f0b02d6f603841f54d6c0e9c205c4983c80f0097a29c0f543091f54eb542b8d5d5d2a165d91bad1cb46e9a2a13755674fbcd57cd5ef537fd92a165d91f84a33ea6d53dbabfa9269b2e83ad3b2a827332d337b6fdf138923d5a25e2f105c3c08fda36bcab24edc4a3bb97b65d73064b81beaed4f36084048861934004194122247936c8c174e48283ae2ff03f00387f5ef72a18777b970c3bb5c8081a5f32f4196ff8ffa508ed90a62fecffc3f95ee009c273698231673c04a29c6ff5bcd61011c357c931a1a28c0961e130c20e4ffbf02221ebc444d10c4ff0761800e0ef8e0ffffeb59c2042a5c5f1a20c6f5258ceb8b0cae2f24b8be60e1515c5f9ab8be24717df15c5f38707d71b9be4440c30a34b878a82a0d851f23579d91fc6d1bca6e9a4804d70c3ccc40c3ff55f7c30dccd534ca7fce18dd3fefbcab485026551d52d521570c643e7bff3a5c88c7afa6db7688af5074825676490748c782a9b62badbd49e75d6700bd65dfa795e96559a7b73719a588524229a0944f8a27254bf9cf6983a5f4b61ff5962d5a5376bf29114fcd28ec6637ebc4d7feba3d8a966997f624e6ead8bfce11204fd5b24635a22635229756f4aff3f3eaf80069696a93ba32e957f37f1d233a426afdc93f4e133a1cd43a55976bfdc98f33be30fdd729f2ff40742cc8deaa6350bd65958664ecdaf9bf4e8f8c5dddbe5336ea0527aec6a6a9aad39d729a13379dea49b1dda17ad58f14ae7436e854e9ca2abd29119d214fc5a4b3e5dcf023d5d100c70936ff3fdea09a05c9d620b4ad72b5a0febb5810f3ffff3a19e860e0fef878318077b1d0f32e161a88b934d70a6d9c9494fedfc83f0e1b2bc854a080ea82d5a07026519c9aea77ed9bebae48dcf65ad974aa756beaaa7b958e751c3774ab673823fcffec5de61aff383be860c03b16bc0d20dd926c57605b07b0a7a6a6a42dc996c2784ae416a94f6d6f72fb948bb2db064a3618920d06db38cdb66f6f37bc056db0cd4d3be836377d7adafa19d46d3df6ba4666ab4cbb1d4ecff627e8a4b93e9ca744f8da3722ec4e5d1a4b9b4adf9575b93e4778dd5aa772ea53ba89af25575361eeebe5d2d8da9b4e759577daa6ea97f75ed537a094f683b22e27054399d69e04abb2d5ce9aaaeacd4d5d969dda86fa949eb1b31f577b0152d4454dba5239b9ba80f97f98ab8b5ae3bad37a4d8db9bd35ea42fe4fed978bcb13ff1cebe2b2a48a162e147009f2ff2faa9f9cb85626eb2e2d52681941cb989fc9645a6ad0f245aa4accd547ad4cc6b92b4b1b52cfd4a56a59abada6aa6a4b63a76c9c4b7bf576e4889b76a21915cbc66a27fbbae9db9f38efec39246b9b983cb99cabea2a59abd5218ef795b6a6acdbf6ad6551242ed7bd1ddab8b6772a6df5ae9af6c1eaba7a563bd3297ea595b81f9f0d4683c96828bbf5297db67a6ad36a8a3e1935216d2dbbcd6434de044b6b2aecf582c13634e57dab9d1b106dd5547a0392d17458394a508890ba9aa29b7b6e4044b3f45dd32bcdc1d6542b1559b93ad6d1d7dd9a38fdf6da4edf73ddf97f1913b211b601b59b555fdab8960b0a7abd605030348f3bda709be54d6db02c78c075c5eaff7350d0cc75a50f489d70a541bc4c738909e9c9a98c32cb26434e4c504fa6f94a69e995ff77c5d8b8622ffc3fd75ba01fd88f0ff7a9116d1c517779fa76f75935ec26eeda1aec077aeab69cebccc0e4e9b9ba3490db725e95ce05af63c1d3121427a694212576dd4caacdaa2badbf6c551c526bb891375dd33c383ba2807049a9ffaeac091794987f1d077ef72a738acb4a9395a47f7565537728086dabd634086dab8c9ca262ae3e32728ae288986cea0f95ee4e4a01674cc47daf2cd9f7cab41a85a33b639f74893f4fe4dcdb1bfd4634879ce3a6c0ca4fe7ad459cf7ce1de73cc644dcbea3bbdba1cfddadfec8252ae66796bd9fe0d98d604635399e6137d27a8c9c7ac4ac04841287bc935dccf904d18f14398ea7acf9ba6b684a9161e78da3d88da4f87560f6bc6f24fbb83b4ef6513cd1738bdfb65276cfc367eef4d78161d7275aa5c419dcbdfbd02f9f5de6e308d563e4d493bf252a66132a65389ea0d8690f0ccf9888cdb74f91a1699a27d506f31215b368ca2766d0f3b03782a1d87578f4bcfc8d27d9c93d8af9d4224aa2524a0dee1115c7cd35d98ddb8b52ea4c7a1ffa658f87e3e99d2d7bea0da2f4dea4a8cf3083baf7ec612750b817821ccd3b9f18f5b487c644ece124a8fe6911ef9173504451f1ec193f792a4fbe35f8693e92df89710e493c3a95e8078a79e3dca1b9e38f3c6322e6eceb835244c1b1f3c01ce67ca2641f39679b4a4de6bd47ef3c43347b1aa35d26994a11c5e2de39ef4e76ba9f39266275264bcd515c2a4794ec7aeca2388e9844d19e73074a65d761117f18f4d08e876788ba6298548a23dee197bd7d765dec4e4fc6b6339c5f4fce908bddc3796fad77cf5d4cc433b6e5d889931287b87314ebec75e1879e614cc4bb5799eceb65241c7a62279223e879e1e7815d18667067be39b871c7990c3136330697a8984f8ece2665474150871c8764c7a7e87d1e18c5a8fc3aefe4fbeb279ac5f1dc684cc4ecbba626c6e108bae7b744c5ecca12f34ff4ba4776e7d99dd92363221e7bcb16b53aea24fa70b844c5149994dd1bc7b1ebd0f3f4b0776e1465cd3755672e9954548a9a3cbf7c82e389fbd9654e547af814c12ea320d7ddeec42f441a2abf50cc1fe965cf1337d93b1d13b1e9618c43bc7b15d392523cf70631efa1d65fcf9c8c89d8dcadcede5e6beec7c4832d8a9dc8b93ebb107b61171371ab63bbc33521ed81e1477e9ff6b60776241a1371fbba23b844c5b452529eb9e7139f18fd72c875df3111833d504d7afacaaa451cd75756dd5db844c5ac92a41c4f94f34febfc9ddd163d1c13b19971f8ca502fec40c6b2a6ca5bd35ce05592609847929f60b775ff481c1371cca5cdcc9645439c44963b8f19ec1fd98d2238628ec6446c8ae35866ceb1479268d86db177988c8978c4a25872107330e439835b7778d431115bb1ed94897358929aa3986fb1eb780441ac632236f9aa598eb3d803d5a467a8a7a807aa072aa967f728115ca2624e01bbb087231e7588f7a94790e438325ca2626af9f077628dd1be3b527ffa3bbd29dad999b8baa7cb34d30397a898aab7fb377ebd4343ef1bfb378e4f1cc771f94333397e1925413e76a7a7370f6322ee816ad2c3bd3294eb814aea31d7d49cb12d17bdf69d693c6611f4c40c8a22ce3814f19731e66455aaca95a3d7755afcc88eecdd177a3b26e257869afd4d5b2bb2bf691b057c65a8d75b767f4b544c279de9d25ad3ac0009ef6608e6239c2c08f716355bf6d517006d03307f8e10f9717d7c7c8cf0559b1f07478ab81bf460221ba02f8d08367bcc34b79bca2e18626403d2c048063f185cf085185870c55abd1954404108e64d081e3336cdd826002313b814f064966d2b70b1ed9196ee6d05413290e0ed53144480dd0b20c0a94cc6fa3c908938d0eaae6e0b1ac01730903708c03a95ba4316c03e40da2200e05dc66e7127f7165385609eedee02e96c9053e487696e8073a5651ab0b0c9aa26ab9aef55a7e087dc780085185697e935c70328d06880813fa3020d436f25a5027df041813df4c8038f09dc61471d74cc21c71b3770b479c38d36d858430d366bd240e30c35669441461a0944600c31c24073068c2fbce8c2032d1f81073014fd1083813f73c21343cf53d4e65f042f04d8f112071cac0838c16a82e88b9d2e5cb6fcf72ca92b8668dcd1120293129a70f9ef62c29008001076b2ecd40240c692a69d233c4b549e254dbb1de2f120cde780830d251c3d09476f4bd441de8a6c6b57bb4dc9906ded2ac823f42ab9a30e228cc05f5a6021aac9032547bf13074f9208fc4e55f66821de79dd9d7607cbffceac294bf9df61572999944a75258d9d53a85497dae1fbfcdfd1b0ff1d730704299e519cc0ff8e952affdf028fb851f97f203b537e6a4d559a0b72f088e733c383a1783a1a783a2035ce1275b9d69f40b56cdb7a2cfa8519264e03ced5b23b4a517e27ea08d21121d9be2a77a0ec40fdef3c79fa4f5728b5752857bd5e7c4d9ff858f1f9e065fbca69e7839da29da61da6a51da59da49d273cfddf71d2ed20ed1cf1700064a7c98ed1ff4ef9bfc364a7a888acc829db5733dd42a92acde8096af7aa7f9e2178f00c91c05f0933c3bb43be213f3810b80df06c38ff394a03253408c28b7273066a3238f3b27d75b22a1157d32846321e0caee0c1e089ecb9d9ab7abd7295108b0aad3d4968ed495da6afb45297e955bf9a0b71242419bbba2e57d3284249768fa2a17c28c4e3dbeaa61a6789de1a67898484b297247b505e77658bc68c6923add6a9be30a5094125d93daa82113e57993c1578c05301e6a960fbd95e3efd4d5b2bae4f77e6fe17d228c0f2b4dda3dc7436e4a6333db5ce64a90b65c5160999f2df44884700523c93d9d3f67d3267ee0454e8b6ebb60441100441f0fbbeeffbbeeffb3ccff33ccff33c2fe79c73ce39678c31c618638cbbdce52e77b9cb5dee7297bbdc65922449922449921cc7711cc7711c47511445511445510cc3300cc3300c4310044110044110fcbeeffbbeeffb3ecff33ccff33ccfcb39e79c73ce19638c31c6b8ebbaaeebbaaeeb30499224499224498ee3388ee3388ea3288aa2288aa2288661188661188621088220088220087edff77ddff77d9fe7799ee7799ee7e59c73ce39e78c31c618638c3b4c8e62087e5ec64a32a4293c0e24fdbf6e3b1255f7a7b649d54eed53d95fde572b3d73db5ed3eaa66a26432d6d6fd68a55d175684913a96c6c5bd96ded59da941bf10cf1ec64f13c3b293ccfce93ff1740077f44039267e77b1e9d389e472789e7d181e17974ae3c8f0e93e7d129f23c3a0f3c4fce1acf9353c4f3e4acf0ff25d213bbd4764dc4355191935bc6de3625d2445da5bd3455d545e68c46c5b2aacbf10eb8556f9babfba9d5cdd53df6b6e9a9b735fdb1ea684dcf90544dc3b2e3fadf69fdef04d991802707f6bf13c1ff0e04ff3b0fec38f0aa66c254b4549a4e4c4e4ea559264161c2a4644a195252d9293d63db595295d094866aea542cd4481392f517698a5585461a525fd3a9b5c499f2cf72add8f5c9eb7654f7a4984b6b9a31edb4ed329aee496bf93c3f0af91f1fd6eb7081c5bfce163a5a005181efffcc028b5ff59acad276bb29ff2dfa501fe7a0f40a2bfe65aeb6dad82377e6463d61e29a54ac5012fd6ace07d85b9eb2514a681bc584b6515f583a41811a5a6a82f45452417a32999454909286909cca27734af9c42c424a2282d2f4edc1c5a36dd5ebd5dbec954e4d23f8f4f4ff5f4863f3cfbb1e1dbc9e7d67b5769bdae5bb0bfd088d348e84070a38cac829ca7dbdfea752a19f0d88fba4e617d25e5675dd9755dd9f2fa46d405f48f3d9464e51afdba7d0360a6dabee10f2bfd959c97b3f3591c9a2d5e163959299eb4aa221a2a723cb4ccfdcecd1424c1b6963c6b42f4c99e6b0e1d373ccd89ce3c89831ed4dd137f2cf2a23655d69dd107ef852c257fd93374ffcd3a6d2b389123762fcab6a88a1b4bdc9f566e8bf88db72aed9f699cb0d162e3752b889c581471c640001134703ffaf571c55ff1f7b532bb7e54c73e6b691e28da437baafc0023f7c10c2e1e0ccb3b6605df1ac29583ab0b1bdee6d9733b0a0838437cc80e92226040d928879bd2e5566d858b1410b3f5d885e1fac228cc14417078e58b026878516b8840195c6055cb411e012460826274baaa0c14546c613211e013fb8886b9298f0341bb8fcb8800ff2cb048ed8a2050c66acfca490b48506ab9d23862809c096fd02d51315ccd0c116244d62d016e4c0434b1e0e448d71eba0428b140118628a3247462d2d0039816a0b283db44cf981c84848097768e921410b1cb2ec9821bca16200893dc6a410986062460106a082510824fc5003e704255e84d0b4c51be06b06098450811ae590094c01210b1b12722c006ad2250b1262a86503b56709018503c04622d82c460b74e025284a0a5924004301f4006266b5341f1501b0caa254f3a1851c3a78c18c925aeb40121220c0e05a12345a5d5e4f841a002c20c2c2ca1dac2b2fb4803327204c5ddd8000139210a2ebe16a2a88d70f141d63ae321c66864410451e567d202df9d6c0c18a9599d797326db81c618580d365831399032bf30754d01e059859f96c518502121ba854d131c600c2a4b085a7ea01509871258b265375c2149b38cc2c21a9827aca400a18a114aa36222e4424f58186e6c60f3ed0705921074d892dfa58b202f204cd8b0f9d8117645334273b80614693110cd07898c8e8e23e20c97b460348e4282ab0df219a10c08d2e68c0e1a579a10594378b90778886858c3bccb85e06dc5c2043141f0ce0a29192c61035a71c5707350b2042c5cb85abd6e0444e0b45003744a3e3a24a55162ece920aae169381360b2721bca1071ea29d61ade20418ea38a13d1f00001d8aee00a30deaa34d400e723c6199401f514c40810a69b094c95f1959c24803cb0a0b60820f17a6506191f202123ce48ac2b2011045a078322498b971d9047c30b4316bc00f073c6584809a8db0bdc1c406138a664d1540e1620bb9c58c82324d783163a50bbbc60619b2904d80057bc496124b4f10256c9613c8123b0580812d2d781da1b2a18a8d000d18e268620bd02a819c215bf4d066ac3dd8b0c60c7b10a0cb8ac58993191498fab2762044065e50cbc2ba330489280e104503b22e945801ec408b99cc06a809c8bc90861a32348821aa20627a43968744bd12e06ea0f281b3410b788c11552abe36964c91c714ea0b2d3051c3484517aa9412526556684004d548192e21034a402a3a70ae0081e547a81c70a50c3ebaec08416502942e385391a17ab2a2a10e9fa88e4a83225018c087374957d878833592a04200ae24e1e60b6e18064784b2dbde387a6127338879fec4590d8ae36a2fc799b8f6665602700850ee1e76f9433fafeb74e61cedaaf9a269cc35df96754d30e37829fb4986a0179e631eb5d875dde1b765ddaf0265c737173b11cc7ad46407e63eca1014d131672ee6b1839a63f65dd3918f120ccfbebb477ebd13d13cced89609c7cdd8969324054aed79681776bd4331fcc48e7b9a9c9a927a7aa092f620412c7e2299711762307bf8fb46d1ebc00d72af8f3914bda935adf10eb3ef8a04e69996792f4b8f121d45bdb9debbf79888cd99968978acb56387f328398945d0033f32c424b83bb2e4388e834aea115960e1519227f98d7b730fed3abac73e8192875af7af7732443bf1f3ce3b4a8fd4df78ea0d861df86dd28e52e41e7aa23d8f2117fb178a7594ddb7c58dc98ee68f1c3b95453f1689e38c7a8a7a907aa0927a665a89e3665ac6716eee301d251a7ea3d7852307f7c745f2a4526927d932a1ba2715f544f514f53ce929eae17db562e2b8b653b55a8676a7ced9258ee3384ec42188f11dac39ca8ef7ae8b24b83f54f753d43111cbd816fd7aa09af4f0ce713d50493df8c341b0e42875f6f6e981212649deb94792c07a53eadd9de3b8bff33b439204b99b12243fac71487678f44074ec719462f74e14dd1e1f73e76171c3519218f4d00d863c771d18ea31266212a9a7a86d8d769f3d711cb77bd5d8619618569bb2effdf52d669044f5b7bf5a13c775f524c1f69d49b1de28c751445151fcf4f99d61ef27cb0d8cc191fcc20f04c390ecb2378a188f5def20984f4d7e797bac364a8f243daeb1ce1b6f10f5381ba597f3296ef11bf7a94f71edaac9ae268977e7ec06b739e2354a1d9263f7a1d80bbd0ed52057a3ec783f79c7b7c8c3512449b063b129f5e7ed7c92a038628cb3f869a8252ae607ac3525e8811a3dc34e83a03ec7b0a75176d01b39d7dde39dec21ee388ee3a6f4cb716de72c344aefe479cc1d1543b07727076322c6d2cd174ba939aeabef4973396e5ca262d25867781deebe0ff4c64f0c470f779ee879a09741fd7531a31d7be08e89b865abb48a9a53a9aaf630d7586a4a3d8264377a1deeb8478a21ff92586694e7d8f1d0eb5b9fe00876e8d879e7544462f67d7bfbba694b42b1ca28c58df9de79ef8c398a6a50ede952af62db268e0b45ecaa19f3c122a30c39dee7263bfe32b9f7e69af3a1946d2a398e771f5869ca73047777ea737f60c7f947d2786fc350882581926f4fece0f6c4afe3243fc30e8f1128fbd8791fe98560eec8bc4f322662aaad671fd86a55ef278e13db9000ac314a7d7e5ed6e8d99d24de5ca5c93ca8262a4d89e3bad10b961865878e5ec7fa13f3f9799d1c6322a6ca56ec0c0ca30449b0771bdc9d16f73ec33126e2d46cb1b899e338ee0b691cc7711c27b25660a129c73d8aa8b84f511cd12fc45d4cc4ec3b62f0fb429a17f255a4eaaae6bdaaa5ed102f5131abb0ce94b9f378973729629c35064130cabe47516b10e4e8ee1d14bd2f4af21cc1ee13bbecf5eeec204af3a2e4a2d7b527927d6f8e7a1eeea2f4b2f7e15387b86f10f43ccc4529762fe3108bbcd35c77e3b845796ef00c49116bdcbfece50eb3b4d821ea7524cf5f0e3316774cc45f28ce64a987c4caa2243b71937cefcf133badbb138b72d4e2e789bcc327fa718fecdf1565d7fceb229af9a9498f0c452b4a313cf3e771b493e0d745de55517ae0cee4d889dd798e9e287e66cafc7de4f7657c76b88738f4a828519004bf3d8ee787c52f87798af21cb7263bef9c731da2980c31044a3d9260d779077a2709e22cce6650a4283bdccf6ff74f8bded981dd78d58fda6ec52681c02a53724c76b1f34e7d821d6b0f4d89acb0a22849fea17d771d04516fdce0f7852814e5d6e4994774873bc431d61365f8a1baf7bd75d619ec5b8f4f32b635e2388e6b5f3794d1d607949decc89cb528e291f4f0d7410794a3b7f589c7b0eb1e8a4734344996132507b91e75973f0e6af244794cc4567df5dafed4be4f188bedeb36517ea4ce19a359e7500cc51ec6442c635b9474dfb17d5d326538826197353972b0eb3239caccb5ab22aecdd80df67090d603d57382b41e3277161325b8b9ce9dc77b3e3f8e379997b01a507adfd975d6a3c6d8fbd0bd4326ac31251fb9d6a326c7af0bbbee9daf0c35db2e628fc580f2cca3f8f54e04c9affbf2282ea0dca7de9d878e9df7e1fe75a78e2d518ae83e3149ee8ec50e7b60672951f253e37014478f93e3497a6288dbd7f59228470fec3e94c45ed78562ffc4d75540b9f9798e9d1647d4eba838862acb9e489459ecc08e3c3f1493bc8b1e1813f14ccb8e28c92e0c419044bd3d92e8c7c554edb011e519e6eefb3ebc41ee851924dd224a340c45b1db249a43318fe40812516ebd37888258dcbc1343cd3f3165ee488ea262b879c747ef0bbd214a3077dc134332d4591cc98f67214a510445be31f7cedc47b1eb6010e53982e7873f11dcbb13492cc6448cb1c802a20c7b3f73c71dee611fd18e747f283dafef50c42229660f1c41d4f3a1e4dcc3b98362e8e9b07b7ae71e4a54e47a04750ff90e31ba41d30c330f65e765141c31b8499d418cee9888772879b77b276a1005370fcf110c538e21e89160377ae0486a0ff53e960e25ef401ea260c7bbc6798805a61cc5b07b7b2433d6f91bb39e791c2b87f21473b749fee9dcc36ff72f26e28c43497621eea8b7bd917ba7f658fe61b07ddd1bcace4345d41bb1d7a123e6dec9b2a1ccdf899e1e397661174fd03b6322567302bace64eec48c86dd23511d13f19831cd7c65e8c8aaa1dc601fc78eb9de5e48a2181c3336595f4614837cfcce133cc11e7e5f4833bbdbead98765b4d55362d1508adaebdf476a527b5b1c3b99bd23d60ca5f7e5ef233d3c7aa70ef53e632236797f4dae67246efb6b447ac092a1d4a74633b8f5877a9fce6168aa5a9692192c59319421f98da3179e1dd8f12e92e84c2b8d2c184a91f4c8feeddd33f748908f31118333ad8480d2d37c7f5fb841b08fa2e7893111d73a9517b25e28d1cd33099ef90337297a9ccfb4920ba53e33e879e0a9f7e891587faf9b26912d94e2798e27f98d67df593c45302662f0ede3c862a1d4df38a224e9817a6fefecce6e8592dc587f7b7bdb03c3efec5ea742397e282a927b24c70eeb1db2522877c67c0c43efd32288d14f8c89187cc2787c65a8c742a114f9398e20d9bd4f8fa8ee3a651da0d4dfd99d19a322a877de7c88eb266e8a7542f975540cc7b18bb8eb9993a087c3cc32a10cfb17eacc3bece19dbbe8b9efda65b4a976880497a8985258256c3ce60fe3f0cc689775076319c0db63d785587f64e76d708c89d85b62915092a1d879a4d79de0f971afeb48cc1aa124bb8fa33df78e35086e0ef235b55a69ecca2a40297e3b77dcf376163bb8c1992cf564b4d513a1cc7ad49bf432efda3bf388b2e88ab4d35537711c8baea9292e513151160150fda19db83bdabbc7bbf164792943f0fc506ff4c86f7394f7cec361ee526a706f8e921a3dc5be37de31d174d38c672497d2cbe7d835cf1a25c3f1eb674cc42137bbacc766ba9d0271c6e29632e467cede26c1ac41de7557dd9ca29d9d9b61ce62ab63fb7bd252763b8b5a3c3b0f87e73e35564ffdd2649d371442396e1e765c24b3c6f82345de6529fbfebe8e76233f5134877b8c899877d3cc5955fbfe6aa5386611eca1b849117723dee11215d3ca552962bd4f94dc9ddede279e23c771bdb52a49ee65143cf7898e6088512f26629e9a7d567bc57588e36aabf696a89865558976e226fb187e19e53a83bd07aa49cf15479a5ab513c7719c3b63b1b844c5e4b47263ec7de09747f0eb449dbf9888fb9bb656e02b433978514f871d1ecf10edbcdec99e2575a1701cc7c9686b08ae18ee1115c3ceebe4276611cd1e8d457bba4c5367b21494d156ef95a1b4b60c51dd8dba87e749e6bcc9218ee3da7736864b544c8da504c57de6f3eb34b8f9d69fde9d9bec6b8ab88359b949dcc3f343cffe8124e63b2662f39bc296dec73dd2434ff123d1aeeb5fb896e887e630c41be459cc200e4159a977fe50d4eb421e9e3d0c794cc4ef8c35490c26a965d831de58ec67f7895aefadafba1155398e9b04f348ea8e8f5cf4784cc420d09552dc9cdc5e973fb477e19747322d4154f4341739d891f93cc72e26e2d7053152ac24456f04b9ee78888e1d45bb98884d9526eb70f75d656f2a251a43196df5924c95bcf3ae7f58f76edc1e39ee9888dd114fad2915f942cb9014bbb01bcf8ec7eedc201a13f1da5573ede69741b0971dc724d88558dca8063949c644dc612b7666aa3419b9b253bae5e128ca682b112f33f75010a3a117a23c83986cb2f5c93dde773f73efbaf3d43130b7ef0cea0cc571cc62388a1d1992b813bd90ec7ae49ec8bfad4f8ff3a380a8d47209c645e91432460000c468020424c31100304024188a8562e17050301cd90f148002548c5ebe5440178ad32846619031c818630c3000000000220333b80aa92aacca547144c509b08644b2ba816a2a29136f4bee651fbde01ce9f36bc3f346d25a1805597becc63af2b65259667229655124b5fa84e0895df5c73c00a7e547841ef5a4b5425fd7d4d43f69da8bb9cdb0e4d71a35bec0d1b892f8f40b23ca473804a02cb4851433904b9e622650194f0277f1d0ffb2ac078aa9fb24c6027877484e116cb16533e8cb558843e04bc2caf509f9d77ac89e787b204d8939d823707fc3d8b39475ce4386e4c8f9f1bd1919647522cb8061de5f98daea6aa6507d2049a55a0e9c236484ea6f17b51e7d5a3d5755fa0f2803c563166680495439919a04cd13b966edc09d4f9ca7579ecf4ec297234c3efd2833e6b2834bc3f759f35a3ac457484901eeab1cfcb83b50d27cbad55c0feb0f14771039050bef3894c30224bd033f1ee39b3e9d267cfc0ece65e3bbaacc86555252765d90792ef3006e15772dd032bf0503a710f26033fcd33eaf506d09d969a29eb214343514b3915e2b1be955ba99dd4ea4ac5014e25abe507419c0a0a6d0290310f3323dff539576cabd81f7da014f270f721d226996d18eaa8a7c079068d675f58bca5594501980fd270c4f6d81a0591b1ac0d4a51b13be5b3758d65e8c5b27c1417b8bcdf0fd804cc7e510c8a331460c435cf38396f95997df690f008569b69fd7b5512784c95f9a77c6649bd12d75870a5494b218f2cfeb4651f455d11c712030293789bbedeb6c2eb4eaf6db4a3d4d7446ad859ab532aeaf58e05281ce5af1d41e0873953515b5def75237bdebd45207ee8af041fa8bf625ebaf047df8abb4e15ef6d607f537a9bb4bf91bd88ba0bac37a33e59d21ec241c3105064132c8cef5e0695c28b6ac365e1e4695410c11d9e013e6af73a54962e19cf04ca384cf905b48e3c2ab40da0011980b7d40c08f2d22c1bb80e576dea2b5723c2b53936d4b864d480d4150e0dc975e03a807bc87ddf9fd1c8564c3422f20e3ba086907a04d23daa46ade08c9e3bca38de0f4d4224eb3822f7bcf82175eccefbc1a60a0096f665af42019ed390040a0a2898453402049fbc979b2930644da4372b493bd4ae7f6110138f5fb072b546891c340566e59e4b8d7864a7b208fc4642a7a084204fd625484881994ecc1805e08aab2667d8f19418366e1f9ff84879dbabce9bb22b9fa5cd812dbbb2450bbc10b94a041a0a9e4a36bf3e328a7a5f1347dce250701383a9143116e1494484a685ec071d19bf8e58f8c5a78c299352e2594a5bd9fecf3225d8f146289a1ed9f08c4e864661db27ef3cf1e63df66d67f9af0aa59532e80f1b7a313f65993184eed2d80c2ac245867bb005792842e5b89162e92489d617a60650340fe03ff63dbc05d353320630c79dc3f0c6e5c1c65926d5d423be33e2c4af5245add0fa041bde670a59fff53315d37559b45ea97da0a7b355e46719905809d00513a8dc379647a6270394323775f446741bc049b92a13259852fe754a866546b39325bb84b5b50fa31be9767a72a061f92399fc06b9c02d1e2e38c0987af8512cfab742100249f615293ba9203cb62e1ae1419aef5e4de38620a12203071cf0345f590a7ae906a2aa05aeef50a4be17d41084ad2b6e08758aa1dce0f3d21638ddfce08a137cda001f76584b0d843b04de9983a31a4fea7b8e2cc3f709118913196447df72f9f5cc65a0c7f15c42224a7e2b1d6a85a87208f34ac6c2b5927327d45e74b6f8fc820bf8cb7fcd50ae28ad45fb27d92b88b282ab6a90c4f4f1e0252c1a1a2e9aff35aeb712ed643c5abd6c865d18578734bef679ffae60e5ce4fc3163178d44495893fdd2a0ef674b55f0d8087380d6672e523930c53e5e9aa802abe931feade71f3f8710e04262751a44be16bfb7342b5a911eb56a3e10db1c6a04094d3f205fc3866111f4f648229849eef6f3bebb08c92e761930c014e9dd7d232a9b2c7227b1ec2af301eea8ab7ffe795b7e885f8c6fdb017402b687b702ac19b82e8784720805d79fd236328cb3084859158e39ea6e50e5ce65ea94da27e6db68dc681fdc16b27f07ad25745196357a2a88f9984b41a63a3d25a8189ef355cfe01b7beceb105a03c3b1e45370878207a6cdcf5b9867171f3951a9f3e1267cea86049ac0caaf8a0636e7e037db334be795644e70602f9e4c1de1c3d2f41b910cc9172c9088271a9ea392644148520dd1b4989da2a84572fb979f253f73aa5a72cca79ba94397406d79d0021d4367ded3e1813f755bdf069ed373ae16b9a41dea5047e223c34473727305a90c0860747181ce0db078cbd24b2af1e1fcc2cddd95f56f89ba313d44c3e359f64228e57d8dfc01619cf902c25684b977a06ad56b91e203c9b83b87dad02ec0b9bbfed486669b5c92895c9a3df42e6286aa9373bb617aaa36803d60bd6c28d185826cf4d2c800f74b400810f1bcf5cdf950c6e8103a94537c58c401ef01c969466009a49e298f9962debf44bf01061f4bb6c29aa49d6db54d1b4c5434c2d46bb2e47251c304526a9c13b18253fd16874d6e80dc88c2c5671c1310b15c8390fdb456f5711bc7c8cefaa337f8298acab2d08a7feb439b8973d3c9450f098c355049d40bf8e29e23d511a3b6629c9c489a8eed845a05789c0a94dce8e3a91bffca53f7da4f34db2b1439c09798986343e0ee80de22099482fc8620df3f79d9f7a469f910624e0d37450f5e440f267543f6bfc16ce2d8e31376f20d25f68df5e45c6fa6cf3807d42bdbd3326813d3ac56218be02959f017bf50e9b9f1584485ffceaade51640d1e0cd568f3c56c887abc3053d50b9797da6ecaf7b85ce1d5edb1f5ef928c466694aefad46a5481c6cca943693200ff45a8998b29352285cc80fd293b5aaca1432994bcc4c287bc81e10a2b6f971c0e8c3c288d67e7a4e723ae5b07f862101c1321acf840e1e1cc98b62a4c37a033aa73df986ae14c71b29b2a1e2fa1829e7f6cfb311d2fa01c8190412700d8fd6dd8b6c4e1e52d8c4cade52f176e675110b2a1ff4c78a358dda0d3c12ab6e607611b13205ecccf629be7b139fcefcea0db1040c928c8df9f34b19472f160bd6ea72f4e28625d50fb2892c4be176da8a03126a872959b887cacefb396c5681594dd3be86c6a6415054a55528acf4436430e45a5c3db24794ad255291e973c55eff6ac0d4af0e5a413cda1b0a6cfbf13ff44f2064d406484012f7c40df76673939d0ba571a8b04e154b5098529548dab13f0913ce26d8cc67090d42f6105a658d287bf4c43d496b1c7f843c2fa41dac44485f13d05d0aedb154f7585155b64ed74322f451ccb09481ff09ea2cd6a82b1f2ea1028472061e94627294999e37ff6014a9e10df05aba80fa23aac5c1c949ab56ab0417ba2609ea998b6f7719b8b664bd7fec1c430132ce7007d8f7fe761833e8c3ab5648f803e42eb41745d8dfeba4ac13464dad10749d476b0a8cb59e3d50ee51299232577f28e2780224f59d409c43401210c83c7365af00d5dd8806d28cae8c206c472b125badd1758b089ff6435164326a6f00685df7ae1ebc530bf989fbc11e4c5a5266120f711b0dbd056b0b37289933f65aa4b5c4b3e26aa63483f6619aede09f321ef10dd1e42844a3071dda33545c525e7abe4adb4f6842c9a86fb282d62e333bc2d02dbb3d07b9c6e7d05ccdd50e9360ebb900d0535410cc6ddbc5ae82443a4bddd7ad0ce0d26e956ac2220f77f3c75d6c7e50d011265c41b03f84b2e7a1f50e506349f3ba6b560cec2e742aa98f94170809376d6493b8c894312d0020730903b592c0d3b183f85059a0424a3264ae9bfc4b68e3d291e1f4ae0e49d96f1dbb34928409fbb9f9f1f22842b090b5423d2dd1b41d1828e7fe585e1d35b869496c823e1aa88bae5f78cdc66bc6c0fd9374fc007abeb575d45e988278a79a15a10f8eb6cafaaf07ce9bb9c5e98fd36dd405b405f77aca741f84fec54a73616b796d5d439c039fe3ad603e433378b6b81e4e82d61e822364a83089d49ee46554e30bcb9c61e0d647c0c0d98c2e9f7554c6fd133e57f7f85bbd32eeb7c786d7768278eed6907e4e69cddd826ee5148d69feb49a5a58e8c01f4028fdb4f80bffc8b099f4c5fc0b78024acc07d1f3d5ba3cde2de67e618a0f0c18b71cd1ec47bbb824628f7dd7a30319b1653187c417550ad526324bb1b3e75f23aef3cb01a5fff775a5ce470d6da758d23b994893575dac18d9f08cacf80e62708085c73699c167bbe4d879e38e4a59748f3769fd2a50bbaecee23d1226c8f6d4abb3582a1112e257a85ae3c68d5599f93dbd3d9cf7a1a4849bb16c43ef1f20c3e6c2cea60c33e3a67a0e3876b90ff4e10f78bf99a8f083e5a4decfa0089ddfd64db7976055e65f08d3341e22757a82e1ffe14d0a494ca93799128cda3b1fc3c5e113b7ab0fd1d64fade81de10637ed844d39dcb7bf95ed78c8c12f94044bdb6617f7f95d8f246c016e8c81ef9ddabdbe15fd3eb3e97406c0af80c326f911f5eaaecc0f8841dded30b857793a925cdc69ea64fa91e17fd096460e8ce3aa52cadc4aaf73b4c46abd250b6187f6f4f8623d9cf95b9e4689ae6a66bcef5423b13c8a216f64c8257b5f7f1d3a85193d0ced745e5e1fa9c355bc3fbafcc53ee57dc887db11cf32f3ef94515244673ab830b07616f41838f64086111e9f7402f1e836c360c872359e5a391ccffa21af1ff061f278dc17967b74e1982947c5c42605d242898f6884f45244e01f91b6144b7a146a033b0b3d6725796fa5f46a20e6fba196229f0acc4011d3a35ebf7af16b91a49677ff85aced510d50f93a55974f336dc0ddca42803bda6288a1e0b10e71f6e4e47adab7232d8c0f6b3823b122b3b68d0fbad58fa1f1d2b380b3474263f4d9ab5ff77f26ec54ab6e5b6db028ef23e987c4913d3f0fef92a8586fd066e10f682bebd83668e4534ca4064b0c3d5eb0e20b0cf412b61691a93e2a3b520de32dff3230225601ac1a4634336b6cd9be60e9956b845d262a229d2fa989bbb2f48258ce4a18f18b08070d2f9dcc802b4f433c6b8a36f7701e453b2ed01ad2ea7a4f8fbc97075d0abb77f7a53ab97b5147b770e606541c3bd7f3b02aac1e832133084231835cd9fbf00576a80ce0fd694264aed8df8e7302dbcf99fc36081c6b561e2677dcbd6bd7ab0edafb053244b2d3ce1184fde137ebc24f60a1d48c02cc56b53ca22b62b86681631b9922f50ff25a3b9a41627a65da80061f489ffcbba6f48906871865a8c4d2d52e849901565455e5b0d5151544a0982dbcd9070e84e2f56df050e9bb67984211abdbbf6b7eb74944154b0c8df3e90c8f882da014ce91cfb21ca8c29f8f5972714765c84688682f6ab970ca57b1145d61f9497f6c38db2916c0c25c5e2f2e3eaf567ac52ac5dccae5278f8ae59a51000fb7141f749906f22536a8e6a1fca8f2d9d3f101c37185db429d11e5d2969aabc889f1502241efc92e3e24bc4a847ac369adae2dedc6488c6540cb4f8b9eefda596670be6ecfb6e17b832bca750a399fb031c3d18898a8eeafcd3325325d668873fcb3355a09fc57ca19253f26ad1adabd5d529affba8ad04184c6056abdd9504e9000ff93233cfe01134545160d74a8e23a6dcb2f0c12674e3ce86d7cbfdfbd5e382513dceb56e9dd3d00c620ad676efc5bf43dcf104e7b65e779fed8b25a50081d2a3e1cbdb80a15a7f458c8001269e745154436f567a8ef10d17e64f5dfd23859d7651bf5c17a09022463ba4e007a0a5d6bbdaa1a17790834464d20870aed02c1a68eb2d1ae72cd04d235e64840119f9ec009c9b060cf814df9f7a767af0d7a99fb23e9181781639a640e42c8330760d24e5cb4f9cc9fb7001e2d3e43ea8ba7fa38b1477d5c9ac284ccd370c251127ea4a1355be6844f71c22a6fc1f0b6e96ec71f7e7260ea7ec4913f6c6edb30f62e319026c1ee25013dcab07973382bfa08d7616003c5415c4ee25664c5246c7372db0902a5615aaf7083f74d37b497496db0824f8eb2ec3459fa7fb33c36948a5105cca89328df572774cf024a0767c82feadfb46fd84023eba1b3945d338c1a1c59aeab3a8a8304910bbe00bf6a56861a9bfe0529edbeecea6d0dc0e67e6131738658335d348316ce06eaaacbafba05cce09eb425f14b2b98cec1edd06bb16950e0b88826556fe30a7c97b3aea58a83e84d3df19e31a44cb5d3f87b1e0b40adc6ab4e199c9bc991ce84608971bf25596e2db2c479eb324916b05e7bea98a337b92ef4138171039b6a367edd9e112b8ace31fbb07f4ae0d45d10a93e42b51ee6e77825b802d7dd198e0b895b00d7d094bcd370ad18ba3f360b4506c704299abd12040626050c9cbca3b74ee1145eedb875330c5fb061fe1945f58edc994ff31f1265ac0d59fa5e48a1f6fc67228ef19fa0b5179d79ae5c5d4fc2073fc92916ea7dd0ca596fe31332c5ceac7d4bbb8b05bbf5689543e3d9be452bb6df6104af5bdd59e4cf91f136fa2055cfd594aaef8f1662c87f29ea1bf109577d63664e57d9a7b881176edc32a99e2bf87897cca378c7e42aabfd8d8932de36be651ba53e8d28796107253e03642b5599ded16b6c0aecdd55ab36a0ea0064aa60366f5d531ce690edb5688ca33db8dab43e6aef5f5ba837ba96d478a80f9db532fa5217e6fa0254de13fb4d7a4fa50ee78575b05b09f192c5f0f26ff4c6ea02db0179dd76804ded336aaaa87e57d0b757406f80cdfcef404fdc19d62aa3c8940221be51844e693f30e99266b18f2963c0f04bf59f62054dca571471035097df1535a7e129c1bdd04e26047553431732b8720c74b35eb71db704eb25b3534e739d884328dae90b28d2510f9e5494305ce2419c4033641f0956c4696a285144f8e20222620b91119e4248cb2ecc4cf5ad95d9d924111f35f1061588d8923fb15e1b0d965a89c0d911e698f213a487d23ffd919e5ec96888ce64e7363cc154711e140f1ad1c0bcb68e75626b7a1eee33cd19aa8ac3439bf88a6b5c3c858dceac3e5dbab819c94aa767616ab926dbc5cfc2a95ebf92bf21fb7c9ac63d7737ed3b5a61f1967aad9944f224a66f8efa179571e8764ee59b402b30258159b2a3f6d716d348a170c812ec4c2dc26bac46e1dfb92ffd88964404fda6264cb0c4031c26a6d2eda5613a1fa5e1571a19253070fac1b8d58d1b436ea03098cec05c59519d6b49fb9405404a8178a33aa1fb00e0105d7a6c4b75eae2f8270b3d17c578f9c76200c4164d5bf3f1443acf6385bfd549f70059ba573675c1a375dc6416cb9fa16ec4fc3c31f9d98403a0334ce75291a8d3991e24b9c5dffd5cfeade9bb65260b5e6436f643de28b613db13f23d0981438db69f4f2c8b199d256bc979d8e5bf94195632b3070b963a99c6ba66be5a2fcc9ff60065e41e846a1f4e8000b2e74c35365970fd20e21dee61df0ec4a9879268794f2171027457220f4863fbf1140b5e7a7eba760195c4089cc918fe04a04d5f536f0e5cc5dc2ff7aa78228278d6005a6ceae75fbb0d98633c261390ed4affcbc3e79d5508d488cf4638229d74b216e29d546fdabc0d22e9dc88bb029b4d77bc3512ddbbe85c8acae4270cd986b05349efc559c8f30b1902560c8ef66b8c44e600e61277ee7af4a06aec250d08450fe92404574f6b1fe80cd9aa3a9a624595f2ff39d53634c024ff22dd627990c137daaf8e8e4c9cf956cb2b82db4f4a2a54e1a97cba5021ad93e10dbcbe8bd07ba09fc4b65df52247351990830c8a944c630cb621e65da8bc40f49e9596f84b15446bca6946a7a2e5aeca82e2d6d8a27fdf849139aa81c45c07bdf5aa3ec9716e7e8c809696174d8e03c11b443333d3a4a18448684d377175f30e9cefe7e3eb5ae2cb03c2d8bd048cd13d5bf9080d203f755711ff0bc60484ec110c6c644d7896347e6b15fb8b6a7418b207001f5f827c467da1aa98cb948130a728d91b5419a8a58f95b0a6efd90f48fce27cd25ce9535b4530979a8af2736e9250340ee8bf7b60cd4b934a9049c382b21563c98bdd10000d17d4448fa33a9e745a39a29164b1269290d5ccb40389123d18a859e2c78f02fb50cca80a03a2f0817f2eb0d69ea0af544c11960d0c7201e6e70e14f636966c4827d6013d62f176f69444677e131f0022d4e2e485b3cae76c644209ad1410de5b56bee1b31eef47c858a9c26cf0fff4702ff72fa17ac867a97073594f7fe3ef6a3f01a52f470db25c46623c786558c052fb91dfabea812dd510b71ed84c7cd1b5dbb302581b3f15415c02831815935957ce588171d6cada2df4a959eb15f128dac373b08c710249931cc370b3288876248af7a75dba47e360dcd49727c4e70663eb7f28a4b8ec38819ede943231a630aa4f0808472fac3d5bbc3fabde58ff9b6cf51537b76c81ba5b9a1ab69c2e725bbe29b839b18cc3effac0c2b8b786751a5bdf0d3a00ff969a7f8857c72cd81e311647c9e699f0b2d05a9e92ee54ea403cd52b35d4ba6dd07528f03dd4b657a7891aa0b4a8f2e21853d19075fd56454abc25ef060a9150f37e755f2369e1b06873c97a876aecbb21dd6efa0804fdbd7a837670c2e36b66f95c6c4c3e1b2778814ae322d88be4a749f5c7e5719dbc53f458980a2b01400a6fc7983b6ded3f02f583fed730d785f4c95850b805f48c6eaa3077d4175b2eb2cd98b1127d2146d6addfe780111f599ae79b4edff72e1adc2fe850e4d0b1d3f78f5701750c0a6eae963682cbf91bde4938760ee82f194704ac23e2dbd5ff3e7c7cacae737ba1a25f79510b147e1a5fe212012a7a78a5ae2bcfc38cc007f5a869218ff7194487788b2cffa1cc7dcd7a7e877ebcfddedbfcb98aaeff37d350e8c0e936bedf6b74f4d9b107c2881e446954fbaeb0ee2f07b1958f68a32340cdabd13b9e63b211944583ec33e482ea873e02d9a33b78dddb9c7bd51cad4e66e21f6d6b1dfca0a4a62cba4edc8e4e04e2e44146a6b322f101c9066d6884b36caec46ac2deefaa10ca05d81e7c6dc222928de4fca603f4af2caeb89f693805f4109740fe321e1ba33dde0bf96b99a45d307f85b9e8ba9e830460b4f14e606d0dd06140bf2bede83f1033a966976fbc6d267af516fad7cada39f758206f3e1d937de7d1bed0352cab5ea164373f60fee0d862f409fabe5f36cb07533e6b948b5d0631399411fdfd49bf5feca38b176928b0299442ad9b7e18b23c9efd8a625f905e06579003e52487cfbf29ce191508e9410f2fc37d5eafa62653eed56b8965afc58cb66e28c2a97e5d80e1a712c46dbdfde3a23fb5488c6b6ab3add999d4059cc8bdab3bf6b4b269a142595356322395ded8c6f51f0ede52cf13ec8a77a8205c365e2da65a22d636f4cdfa88c35dfe214b7ae7d395a5a41968d26bfe480c78f98f3b2d7cca2cb32f439e2babbc81a0536504251ff9f31cf5801bc07bd22d1c428372e7e7e0c14878d99e42da84cfe0eed1d7e9fdbee6be9660cbcad22edb930f00c504fe0c082429395c9d20c638ff28ad4e52e599754d60896aa402f24d0340824f89a1d2301e23208650af1a6c278616908a7df954139a5a8f5ed97fe4817194b3a663b46f78c2e4b510b3456070b905a85ff25cdf35627d52f776efb2f04cf32c3011bed2812c400003876dfb230b738fb23d3099b1d6074b805777b91f75e7e5a0dd40612c22bb9c1e807e4b84e9cbb11e3c67f3869b9d2afe56f8b4dfb47d1cdc6eaf8894b9f527434c7366d6f6d157476dc08b129174b75722c48c2154f0a25c743f0212ef9f8e78ad1d4adc9251c0d2a53f02eeea6815e3bf706c79bc390f022f6ec4e746f7a2faaf65f9445be726fa701e2d2efe95d9518596cfdc91394a36805b17e787d469a168ff5d98c351c349bb8139ea181f8c712226c26c16ed33912835a334daae18e8ffdba3313a11a214172891f331367f78fc5c3b1bc4296cda06ecabf02498964144c1d5ba955386bff137e1a6b7ecd5dd8bcae0abe408639f05c26f89d8bf583e45732b2ab71cd8d74577a3f177587869d63da9cc28d5f39770d77269e173385966926ae888324901627df087cd7f38261aed3d2778bb00e9cd74f82f089327b11977b738a31853205335de44b007401bd9b98fdbe8ca49bc57bd77b3bb3ebb500519f9a108d3f1f7f15d36278cacf731aab6b8bb4a8dd345c7bfdc1ef188b43177fe70e5afb5a5a683d440f89206f4e723826325661efd2c24a3513a69d12fbe617a52874142a8e6076383eaf89dbc818a95193ef2d7cbd995e68fae7e89ff106b07701c90f82ec6c2e18e69d40c06d1a66b0f143e2fa3dd4a981c6bfc39912c93a1fcd1a3a1bdce83bd8404ecb97305b74d163a28eeb70d55ba511840a88915f86b68844764c4fbe939b291372fdeca1529870ecf86a61a920a43ee747411388daed031aec217af5e46ea00f4639d7c1882ed04ebf2c2df157166bd0f7cc94f46512885c9815dd9b7d5ce581d866b14a0e9893520cd0d21d4439875a118366acd863a16006f8b42264f6727b6ade8042e5cd34440489a13eaf248c685278c15dc1def7c107b161ad215ab67d74604a02ee52b60919a3a83f60db0e14ee6b18b2c167ddeb75541254e37666ebf97999647353ad4ef704090e6df0d5ba535d48309498a9d3da15f87159fce7cf6cf80b169482e0bb82e13ee37b5ef6967d32a65d007f0599bc41a5dc6bc5a05fbfe75e902f30caeab8447920f7dc39ef56aa6cc1ff2bad077a6f00b78d3e93e63ad2e42e5c7021a07eebc412f3526a7c90a21797f22c9ce31bf78ac58ed5f4c156b663c95a2ddd7bcb2c220b8d89e166b8723c5d2b6d3a3ca90a0c3521e8431e16b9673e56c87ee1c91cf4d20a422aac232dfacb547e1db904594225ec9bf8e52c3deb9cb9d2162e0551796e4b58a3c3d430be15414cec044835ad296fc19257dceeb3409fa06585b6f94b74f19b10234740e5f2c791d9d00d2d6c4ee208991a83cc2d87107db14e4d687531b7216f9558e55b0d2742c855324655ace039528137b6c3bdd787e365bf61caedf1e6001625fa4988032fdf96c27ba60f31464939beb0281e0d1a8254cb72cb19693bd00ba3a721148b26799208f218dc5a30fcee78a37912b3e054fc783dbccded56a3f7ad4f2990e20b36f80ea080969ebc20736c1e582de7749e1e58bb93cb1629589a5ca0c8b7d5198397f53ef671a19a903075e6ef58e6a5699964b30201d392c3f3f9c72ef2fbdba85a7ef9da61a7a43adc8ff02323e19d77a80009c17ce622aa2558f4c48ea20d8f928990a687cc7435b86b55f78ac7e4b93f84105c19668572340d43004914c5a742509641c17f65a5d0be40dbf082641a8e5eb36806a69a99bae544f9f9a432c701c048526837d244d7f86cd5a80c5accc2c0c215fc3e04c2b89897d1ce46c2b5a3b93326b9b16988f6ff8782e34c801baf2ab517c90bce5790d27c8873d917caef67154f1768efcf00b8a2a4acc223b11ec155abbe8594d63788607ba803f804b74d3fcb0a3767e30646c4c71cb4792f921f8e79ccaa62d707346e7e62f29520c0e8c409e4724a37f34e316fe119fa310ea2da8cf2bb9487e659e0e7db90f8fde7ede96bcd02b2f0b8b6f5edffd9556d498ab54f2bc99686ccd2800f041fcdefbb591d99ff568aa61d9447ccc3655755f32f71baab84d8a74bcb1fa90cae45ae7cef3ec1813a98df9e4ee1832de2ad1cc7a07be379b0939b2e364745b5ed7006b8ff481810fb98f1204bcb74239330892633bde21ad3c7db838936fd1411a09ada95a3cbcf3a50582897631c5ed206ec8229e54b1b4043063d9dee944001fb808a4ff3c3ba3d08c6f9282e228c884e20c344753c36207837cdeebb6a943364e1dab4d7f8fcbd5becdeaf72b284a03b0f7eb25edd403ebcd00b5abdb67ab08c8fd501578c7f36273f7ca2a56dddfa8e28527bafe6d370250bdba540d69bfbb53168c8354667391875f3e531e912fd826c44a2dc710897809307e532de26326e99b519fb9018492f6430d5c81753b73b4bbbdca2718b2aa943ed63c969cbbae5085ea84bf91713cab7ae40c39fa4cddd19ec87c66be47c20686c2ba773f9de185fa8514d48e8a68347230af7fcbe7702b7fb0b6eaab0264b261c932b7ca476741f47f0072bda370ebef67046fab697cb763070e993109903c68766305fb69963eebc5bf87c0f057a24534c174c099f2c09e8012cdd0ab001528f5bc64780d4c91884b431e669065aeb504044e01be46e7e64cb7aee5ab8fdb3309b6303488b850cb68065a57b37f0e9614516208d848443c575ccceecf6fdfe8a9450b4919591506e9558bb2529d4c4126c00793f0ae89c210cb8c800dfecd85ebb21304863a0af570b9fd2566c219d428655f839ecee9e2d071f5a08d78d1ec971821b709f4334cf71ce17baffea460a7fd9508c0391fb6097f97d598f8d19bcb02b4d1501e8730ae959df6e7e40f8a4261f506239f13099f30405434f2027ac9dce736a730b3c9c33ce1d986672fa8233e2215f04fe4a0fbde95f4e95e26960ea80e94035da399c5f739b5343af84a15233f3fc5430e963397969724c0377f3cc8ff3fba07c274eab6a33beff72942b3f0e64854991bf3fb806e0d5778c47e9339e40a7b553992de495233f6e96ef6979d8fcbafa5f71d4aae993ea6218529b005619dbe0b5945369654d8f6987468e4d73bd47dbb723da768dd05bbc2e679d0f98be4e7fad692643d988001aa3e1df5622ec4b0867ca432a47a5cdc6fcd04453286c333236b86c6acc18c7749195049351c85a314dcb81903474bf57ef6b495bd83221fc200be0c49e6696fb2802ce5528b65f9ea4983fad05989f36230e35acfbd39075aadac19775cc5de59bbaeb6a07d5746e1085f687c8316a56a79bd497da4fbeb7a27916b84d6c01f74fb1bbb2a04f93a18b26b2b37ebd5533b8fe5320566ebdfe42f2c1b54147995b0c2e5919d0e107a6e5bc179d5312fc34bb61f5e26d079da4f8bf21175970e05e1541271e06c584bbd70aab1a6a7787247f1d1a9f51cb280bebc8d218fc7532b9dc591611c3c1ec8bff378f731482ccbb8fbabb2522bb0c4c1cdb5a777415186c0a45ae413e6bc73057fa057693083886b29a43c9f593ce707bf238124c6b47d5c08cf981f20ec655301ed39def9770911631fef18f01940388e10513f8b17ccd58c12fd5339116883f5ad0f9f827451ca8b8b7e8dfa32922aab129e9e98b02cef37437cbb8f4bff7207fec50aa1fae1e854ca50763ae9cda32dcafb9302d406894cc3b6923b2d18ef85b4f636ab489c41b32b0998e743708e9b38822c9e8d993b65c4cf2372b7d63e9db48b99758197beeb53f98f1dd592ee6a4c6482226f231948e39d9d851a97339eacd4ba79fcebf492af5c20b78cd9aadeeb696769d684005885904cf50a985c85e8fb4b647423791054a8bc0163460537a9bf609adf7537752a8ee0defa00b79fbc224b073c9d78ddb63998f276fb4430fcdf01634d070000c4456a571e775d1fbeb816d4b2db857edc34cfd787c198f9f2d12c62d00ea555bc4ec8f3e1ee6802737a6afbac9b7e12cdb110d83c0780d2c4309bc71974c90eee5dc86dbc029540d4e525a7ba033d4d8f17aec80e4e88412ce6d3c0ec07c934d9861957f49514b5e8a78016555fdb98f07affa497f3f31b609d455d35de08e2915892194d4e25e21a20708eb13b63fe9c1dfaaa41152ba941761f2adabf0def7bd3ddfb19d62d1ab3ce690b179efce710f97d96dc750698ff2324efb1792f7e92ceac16266c9e93ef9fd73753c898301e49914a080fb63e0a16c626ba713de0e890a9e1aef1b7c22262676eca573db5bff217c6c11749f64a1e35211dce70514204deaf85901189e881ba2d71841c6ff8ba848b270f197155719bcf60536e77ce488d7bc45945b62a2bb5b485c68cdbff81807e48b8b1adea3bdc2f96188f76173d2bc08539585bff0c5486927524add28bb2a1bdaab2aef3b5982ee2bd5840ec9fda6d376598e169c0d4f32da38591b263997c078b369ec9eed3cbe26710f1e261fd3f8fc7865c4d1dadb9c7f2c12e675753658a944aeec2477e3c5334619b6f53077ea19d7010189d29aa3e28175151248abda09b8d204fdc677b52ec6ccda15bb8e404a8c426cb5988e7ffee424f06ccad2df9d4004e492ad4b147743d96dfeeb1ad2b8ddff66b1427db6d1ff69089f65f5ac09c701cddfa1cbdf3497202b62e14b440575a402587e4c4bad247b2eb249e9e82dc95410f207cf566d212b4c0b7a70cffdb48971653e64b42ec70b0eeab84f797115ed60196a55e8a5baa663853cb0827594b0a86b9500d5b25370e861511adf694de1000911aac3af253bb95fc89a31f0b66be2c68e1a3da1a551cf93d3390d36312a0d316e2ef9ac37a750cd510b55faf3c679f1478047623c1506507c4b20dbc1dea1d0c67179858acbf89df1d101257f763c0640b1b4fb5c62e81d6b322f9deedc14ae328518ed89cf9c11d69d909a701550d242af51119cfe2ba0bcc2123a7974cb06eebcbf67835e3689418abd67f28f1a02feeac2bada8ca6d7d741a2e20e0c169129e3f55b2ad68d5bbe33af9ba32d9f70afced44ff4f179a3bb6833244a0074d130e64a7a729dc246269bff6d4ae5a980de8efed3c24ed84a47bf6f604016ebea9e6133943c4741d50068b2e4e41f9293e94ba223c9e7b4bd76980d122600b5c469ee5771a6bc699449829f4a3cf0f12b6a35d7238190a85da603eeee0575d7e568410a8119292009e0e7620cd5fee8eb4f8c15d499817f646cc4a38f2870b2d97c004b0961a9408363303289e160eb155263a2e20aa6b757a29d6a341465b878d0df9b2d0f3d92a6de3a19aa2622a9a458b0201b2e1a8383aa02fe609bbd94f871f470cedbfb52aa6ffa7ba9ea6826498f9c1fab174c4b3d579c8f5ffd4bb0e5ead72b70e05d8babbfda3cb8928ec6825631f575da20013963a1089cbf535e73e7672157fd61a9ba26fa18330f7b1b4dd6d78a63d302e5caca40d5f260cafce16125c21c7a006fa991a9d694559450ff14c05f6386fb374a3c5008aeb7be585d54e6387cb8b42fc59b5dfc94e30f163f6aa630c5cf5a0eb90fc8655ac1d93f4336e7189288fde928433cf972dc2059ffcaf0658efdcc4495fe9240a691f85d61c564ac509638429a6cdcfe8930b1d30932bb84457391c7e0c5c076d5a725274295d0694c7bd35c43b400694e296950a9e38262e7f8dbc163c52c19a1be4d303454a59f2499c4e9528abf3922d1894bf0bd5c6278aae15c20a63927290539ac1385dc22283be4b636bfc199abf25707009a8e5838438dbdf59ec2a088700c07f1c242d9e51cc4c0a84944dc9814e2de885ef6144581599d557f4de9831338d74cc387bacf28365d1b0bd9728e407523664535deb70d0d2e43a71d948d10f0c79f55d9687bef5be387751de2536c4e44202000caeb9bf7aab2eca6d14a9fc4c2133ab6300166cce8dac5ab493fc1faedca99bcc74a4c5285add0455d41b31f49007ff102df50d12c8119faab49252052cf1c9f25e221ac008c6b4496e6a772a3d4cec9d09aaeab9035cc914bbc4c01c7011b9e80315a58146d391b44ff28e1d8f606b43be41a430d1d8e3df5ee05d6e24b9f44d461b4a4b9e8bd181541be8f73ed4c1255d688f835f230d6933efbdded80cee0e86855f47bbec173eb0118e2c86d122685b862ff7e5b228fd7e0f9072635cca88d4b891cde29b7f5b4e8512765c0cd0520e80dfe8ee402e2a92f0d8b3def34819af74cbfdd6e06d660fbae4a96486743206005af60888e2aeac5fcab5765ee7b24c388fb9aa0761f8ad88f64f860213be2283ea54365382888e452f01ef5de8aeb83ac7245b49639fccab1133b133f6221dfb1ae4ed680f1fac930c8cfab4f396dc54eb5b439e35cfb04be015032c510abe37bc4f60226723b02dd8afe7bab56ead5331259227c6656f5cd5ccc502c266986bd1c8cca1dc345dce4b8f478c14121565375417d170dc9b6cd764f39af0d51bf006441f340b480e4dbd1184be574aa187cc4d8470893da74906a1531c988f6bea9d1d93480f2f66de4fdc6f286034e46ff136c7523b1f1d2547a8f6f4b16825941ccc4727fe614bf6c9f99adeacbd403b5b8ff7693ebe823c1c108b887a18609a8c53384186580b20858d5c18048d8d9a93ccfcff160e544be67129d3881c120cdb23b4be922e84e21017a66831096d54fd1f6859f40c5acfe0a4643aebfe4a0f839457c0c17125a04a55e604140a991974bf0c8c795250e3d6cd8f292fbdc43dd2256c50e64a9e22e7f39959b0e579e9d0cfefe7713857df4bac0b9fd1274fa2d85d2fe5ed41ce5288d1da9881535b1ab3a640cce9fb91b2aebaa96026e5cda951d8846660645e01cc909710c27271700617c58599a43da6d1f4e3c5aa9a53c138fee66a3e4333a0b6ac193ca91b2cbb3037f367d23882a39f6eea1dffe7965e23daf02234c65fbbcc0b832b877c0569eca487eb49371683e528a9520c582f73bc86aca57ef56d9e041a079eaf68670a16dd931f91d00be81cbfdd5853ca9b8df9a1d195848bd909e32ff515bb63447151d1e40eb85626ec496b3a797fd8e66a353515e30b3fa6a3e0c953a6349b425c1a513b93178dbd62419a983544f2821edc6396c69a238e43772fcad253f59227b6f781053c8721047482735fd7a43b266c0bb8a4d8c009c2fcbca4aa202e0a847fdb294ec15be4ef301be9037483c82563b883a5c59cf21abf1025281f7b35f20094af6dd10114ac141efc164b4e36ffa0dda1dc6b14e51c0e483ec75ee74c2cdea64b7ce672956a214aaa7cb4f4f5107579a43f7a9826b902af3f78c442ab7a4cd085b1b1202cb5766b1ec0ef7e816d45f430a60c4e068caf4d8cf44ec181714701e6d808680674c23d698038d8be88d29337ad2c3d797a01e4720ebac2ac7e2962dcf59c0368cc4ef83000c100e842a550d0f89885738caa5121523d1d86317c015e4bb2bf16960dcc14c51f7d2eb8d499dba80769c6cd0e55c4c7d74f4e90b034c1e75cbfdc8d7a95eda4276202e3dbbf9d14f7fdd7d0a30a8f09b91f209b22b1db6b64f1307e07bba701a5eea0a8166d11823b2de41a71986f67c585a98f1659d1b97c79025bd145adf542f398b94db3ecb7eb8f8593840a434ec627c765958b64e278a7922e4679ea4948e303dd7ebc4c3f5dab1b6ffc573ff6db662639e10f6a1766bec2e4444bed8dbd0b6b536953e6b22eae7efdbcb038c57e4b05f3b8f5c0fc2cf0118156153ce7df394166892af6c570d4de800297cdf1b1bb94f02ec59ed7721dff40f65121b6b4ded6f36b4db3dd307b95b7ca39e5a7847343ec67c1cf3fd1406b1b9176a7a0d5917dec567860099dcf45187d2fbcfa63ece59a71dc466a6291a92d44196c334689e0702bebff99421046a60a82b3db25280c5dc007b69421fc82a4e72dd6b078e8eee75ed1e513d9dc1fa0d36302b723260fc882b1a4cf5c8a457b1691cbe1362c14dc96143b34daa2b81d0b220e678e19548e129fd195ea53f479e807873f05a158c07ee1478ddc6a13510075ee457ff8988029e55529388703a81e78c72fee269c5ac3af3a4b7badbc26151387cfa81010d62fe6fd0ff43ee17e7a36c89f92316f560f152b03b66c6f81a953a19feb0696fe1eeb92d0e9ede899deab7dd6fa76be0ab5cbd7ba0931d7c7905c21a2e8dfab91fddeb77870c882fc5b634a577251cfc4269adc21a3835c5f6d2b52767f038ccd0aee015dd612f64228303bade510d9ad95fa9b86c7f6adbcc5a2038bd2ce275a51d2a5cbdb4bf4d99276f049ddad5b32d560eba0c48908a5ba042166eb172225c8e8f47bb76e871f5b37d1cf7a051d365a7f331e681ec7d65a58916943283f51066529586975d309ee4963cbc80e7c6e553c1faefadd873e755df422851327bd78b63d2edc8d20efa06babc87557bb6b6f5e51e74e15a4d54f5b07798c7878964745abfef50a806ae5c6fbe39c151321a75228c7ad13b30a03ea45dd7161af317d89878d4b5e5f23e2e8e50d01308fdc51d56f262e5222db53ffd5b120b07aeeaeb347ec6c489f8d289ce0e0a2924306540105680f422ab9e9bfa7d580690e075a62d2926f6953dac66dc3866c325367bff7bfd50f8243a834e95a969af568ba4f7b7306e392f0c2be162cbe4d051d2142244a1319730ae9697465712b96cd25ac44473ebe96cc6e9eb76805eb05af66a7302b515b3d9fdef4304c3267319dd660e6dc998db9aeb0ab409290eb78662dc082accba18174ada35087c57f811bd3a03f04a2b4350d17e28f663425eada2726d6e0f0f6be392f107124b03b4083c58a4cbd8de72e57c0c86018cadb5b68c4d734f8f9538d42d4c43c9878b5d7482ab3e8b904c86e58b0c85a2bb2609cab63b49549436c7612f27e21419ed60d3a105d753639fde3f91ac2361f67f980d81df794417ed3e2344d0caaf7513101165669a61379d7e50d708e1958d4d1b537751eb7cb2fde91951566d233c05480c1d59c658da027e65e39b15fd2e992ceb933b320bff6f4b8f966ae018f658030be8e0d9657e6381309c06d0eff6394d94f1601a92779cf0278f8aa673bc60d3f96c4646d31c9af7f4f093b1a8b3baf2d9347816d4b043206f24e5985c439e99f61ad0f68ee7a32b3d3ab1a8b314308e04e2fba109603187fb036d6dc74dc61ab9419221bda146cd628aa79a00aa015fd5ca24bb75c590bc050b83b696c3dbcc20211d8aef61c2af93b24eb95568c4b079580a98cd154132edaab95e238d0e66c61b5d3d34dc9c88f211bb644d57c6aa49d6bcafe40f3dae34272b2ce417752b4d3d940a285110d7b3459909ac20c436b30857f4e5839bbde29cc2ada0c3106d6b9791041a99a721e275253b7463184e415e37aaeda6229fca6f10d19272419e3bf46e4fa199725092faf198c829e53aea04cf70b97e0f8577313cc642723705b9fa8a956cf883f0190be4b6264151fee80910cfbba667f4442aee653b07e5d96e884bfc629ee5e904a73555c7fdd94d06c31d3ba9d201e577ebc474d9a22fd506df340d06eee39c0987d8372522539997b580750ae08e8d68685354b08da7de4097cbe78ef7be390d34630d8dc403cd103d6656b735b6cebc9be46b5648ff8e389580e07d200baed0bc853d01b198e05a50e097a9a82097b4194e967da15989d101c2ceaf67d440738295931c5c4c2a7d2615a57a28c6d2d1e119889e36442c96c56c20cbc626bc3381779ad214a25e9d4b36a74c566628d4128e6c4e631fe327f06b5fc34e7782f729d5b4c687da8ac7fe7a274c0a5403f2b56881bd85edfdedcdbb68711709f4707e307da4119602af6edf30308e9ed63491a7446d5d0037b58fb1d16d9ca62fe93c69a38549a7b33704e54d420d811b2f0b4e870d9c98e235ba836c3cd1f7b4a335dc4f96eb86139a70c942b683f4b41a2ed5325d4b2772fb545dfbb9d139201d9b1fe27a13a026f22d5f4b2b15135b760ff86e9e37536c34854f246d2539143d753e1e9603964d20e84a035d1bb5e0dd171102f0a33cf5c021dd12bccdcf73f6915e8d30ef1f2c373e5c8d3033b558ca2eab3266a1672a4cebcd0b148942ef49b310818ea418f66a72ba3c9b0223625103b6d59047669b007a83688615417f23c62d7d2c12f52c9739b7c349378626e13be731f2b1b7bbc9b463b8e991ec74b9b4b9218c2e8a55dbdf2ac5fddd1ccd3c74d2499c97654ba0025a9a3ba0be0291cb2debf23b48536e787ac5b7265f9120c1f56c51607b5a1568d0676f7071af28193b4b20aa0d017a19c97a38bbb7c7b3416691b1ded56c74ced11b094b0ece7de3def490d3011f488c61623d40064b5461475585338508095bc3bc5f39ce4948827bec6bdde570203e68c8237a86fe101cea12e3a314c4ba19ca434968a75144155d38ae833cc185007ef4f3bc7898117867c8a8435f211b9ec614e51c92de7a39ba93a0c0ceb45089502ca88d59411af04b6c954de0d1263c207c196568fd3df64c0a04fcfa573e7e55ebc23cbfa7996c1754c67c00e3f42f1a504f43ff84c9ee58d1fb10d0006b15babfc84b5fe11a6f27c2c14124dcf78f3e1ddf789626929b8122c2f578f899cc162e5f055b3d87dc4d094c610270e8d819f926c01fc63a6f3e5703ecf282501f239942563d8e93da687285419fbaf3844fc434f8b6caf7814cae8c86d0d75da03a7e1cb4e8b5e46ccefc38191c2535e8f03928039d9b220c3a9d0dc3d910992aaa6dab188d248c26eab21c84e279f3abfbe81120125544d2de39bc6c5a9ae56576db867c2d3931459c71a84cdfb7e47413e6facde27354ab20aab2883ad4ca6c60d64eefa695fbc97daf779db55c8911094e2a39bb9e43883471b7ff9cb377dd8a015aba7371c227f2b6e70a198dd16cbab039e2e0dc208d86d19fd37afba327bd1d4e450e822584c2450cb8e64be5869765439f9e56afc0899e0bbf47a556e992ce289ec5aacc98a5a5f22c9b1befcccda501411c35c4d498fe16f22448d00c5cd42df6f737d820e7539c1ec46c7a26143e528dde70c361b89214194794cbaac76d94ac88119dee248905c33e119c3a7a06d1ebfd7e082d165f44de70f66bbbbabd10908517b96b7bb7c88307ad135958597cef6933fe7a4c489ae3f81f03319363e480ebedd8de89102c014cd46797d36a4dbc4c0e46e69b1e94a41da73f0e84fa2e2723d5c58658b6458f827d3355d6fbda28e1acaefd030222a600ecf58acefeeb638fbe932a7b1ac9188ca6891d73e20e20a4bf08aa98403db3cce837d36a067a9735d4e6c779344cde2c38b009ab4575296ce879b445ce101859060dd090d74edc8ad05ef93287cb8ef6dec6d39bf4ae97a80f9b914a24370ab584ad5170bd778b79d143447c86ce12413d1272b55f7671fb43f2646ed9d3412a5748cbb92e28bc4a4b0c163a5871f76815ba3d0312236e190ab8ac8d175fb4e75b4ca1f0cea0cc05c573cd079fafdcd11bd524c0e91e09afb73d53ebd6a9097ef877a7fe886c1c64f0ca77edfe5142b67be8b5d680c21aa5de06dc9df97d4e3d1e88a8f65564d3de2fc4cb52e22ad038f7097ebf6c288c537ca49415558d04a2953408a4a446aea458447a0c943b2a16a38794b36e4f9fe1520a9f1bd9b362ff15e5b8a4aeab998f1c5e6707e2f10e9cf26654dcf965a6c38d124ad96840cbe03dd50a03aabd8d58ff2e82a65ccb0e3541ce7b3ac37ded10d9381e2b273a1b501ec204d312977ba8e02114c77b8af113c2399082e8bd6c3d953e7b7a4a17241bff35f37b128cb27916f1468d28d2dc8b204a70f25a8c7f54a23a0e019a4371ecccf450cda43f9089838d79e29998bcc18133748b41cbe11811999631994cd5c8c44caa7cb6081da549cc762ae68126cce94d3111eedf9f9bedfdf9e19f5705529e5ba58cd2a7fda91e5cb39de4881b490e752119d98e03fd02d5eefa28b43f3a36c66645c2bc5779fe6206f7fb7826c7fcee9c9fdfb182e576ea4e2f69be6f668e359aa3f959ee724fed8ee2f9afeca0154ca9fc73f70ceeef9503757ebb76d89a032da22f6c5e7e51e47042aefd5acc5c07a6279c934d21f2d3483d471585c68c3642bd2612dd67cbe16acc3c03f69213610c205cd6304c0a3961f4cfcba17277a899f1add9354e3aa7bb8739ec34301c33704cc2ea7837f669c8e11ae260dea386d7a1e88ffda72976df3ff0109e52de0697fe4bce9be7443f55b956b3f8a592e14b0c33b83042b804f883503d6f4f032b38162e918a73249f84ebc5f0f510beaaa05c5e081e33d5d34bfe307e40c5057c2a66bafef9aa71a0e7ff31f385c8eae987bb5ad70d556d13d5be37bece02087c672dfc03b444b415f13e4b8687880dc8dca4452e5b8c30420c9422a7436e1031adf0b7c4f41a94c783b2ce1c8682c123599b6a6d2cc239bd50ccf172d7ed6bd6a77ffe25445b148a44c387ae2b4fa38d0e76fee6e7fd77cfb657c11a772270dbe91142148a6902be217807ca65239c6806cc1bf142c12ca5b34fd6f85c89f8bd05b16ac5fc91ac6860dd38a8c6e88387133cfd4756330966b461a8cb744c0d991453336f4a60cefaba873b04c02269537db6f3fe08dcd1fed27a2c862dc86b788d6d3c9331643ccd77e389c5d16a2753fe0e2ef53bcf5df2ed827b86fca49ed059879e093be9d91f1c5922d7c1c4d2bdd6076c8f785de6aed30797943cf38c985796177186caf6f672921f51bcf4cbbb7fc29fdf25c6659945d4ff583b4c137db78bdc3f87df86686318d04389fbc4b518d30bf18b717cb1f776915897c56cbdbc2f725003bb9ec5d79939770926636e7bc3097edbe9c93f91c6fa9134d50934cae224573e523045e60ab65df0825f613c77b7622e9f3d3629cfae530211fd4f9aa33a73c8433a4ddbbeeda59529681f19e67c869d81935d92d1abeb7a3e3b967fa98e1ae393e7f62b93f73c15a983c294696fcb46cb5d583c555742c8aafc07defeb4c811c41dc7446400cb5572279c7b9c75956818177480cae5c8ad083cfe015786e0b0d8bdab5ef3ce5a3e85688b0bfa861150b43fe56754b508f540df5647bd8be4f0c7fc3fec0df4b43aefc6fc308c810fd066a6e4b862cb27c26f811ba407d60c9576d6ccf0665cc9112ac10b79cbf5ca978bb7e5dd6addde66ab9db6d71288c24fd877f6aaadde4f097c7da2ba7db43d1e5a13d2c21f973219abe2040e066262621ae67685997d59c10c95c2e357d20bd23d55e2132e3594f7712a799dcc56008dd6fc518bf2306486aee8d2b987eb7f340008d33565953ec4d53c46294aead303c4c3c04053d1495a622bdea1de7148c1f93bcb957ade422fefbab23fd529481c69913f51bf24807c57e1199f83f625cfaf09bb4cda90c0bc5beab4c62ec19d16775d2bcaf3022165ebebe7f35ac9cf79861bca2136125d2943ddede538cc076ec30e00f2027821b786927cb61541bce803ac61a80fb32f6a8b0a658b0b77f643c8c83be7a6932c7af29764d085327548711a983744310030b7be2421c69536e41e1a38439e3904114da32e0281ce7ee8b443ac41a22c5449de9c4f9b8052e6e5a1bb8a54c8a7b2884ae56fa2ccb780026d690fd336fda4156f528bcf75b8579e7c50d31565938335d0d6794a313920805fba890bcf3e633c1c3b708688507c77e9234c107de03e1e55be280cad7e71f265a6c93bb649273e0b75447801a74bf66e248a91920c2a11d4294bb5557d31671b8390daba19566535bb30d99e195e996643dd1a75883c8cfe2ae8ab2ac5c2d59d69b5581c4279d73d109af34196dd6424ce81dd3e68d98a4ab07a706c5d0d08d8507dc1a9181e7e9f867bfc56ee6d1cb7e32e4b9a74de40ceb675e98876596747cb25402ee1d7b957130428bf70e02fa4adbc25e455c9b7cb0c0a4ac4cb751018408025f61ab87828ef100104c9d4d523e2d6c369e3d0bd25d2f1f3c18cba35b482f9e32f6c5f5b8d11fe5b59bb40263a1aac6c45c9a0f07dbfe221409a386b03711fb317edfc3a6702c307ff035eb485c7ad29a2e7df0f0e129fb3d1a59154c164896eb741c627daa4c958897ab860b969456796e9c3185e5d1d55019bcce21f609b58e4950635837bacf76c02e7a427ef2eb3952ca563978001258e420ab603601d3f4bdcde27454325d9de1602fad21c4df95b30ec827f9f15c461251f82362d7231a4c0903937e1efb8063680a2de64b77b6e4dc0be880b091eb437b962078f144e2f2e84efb602fbfa8146cb819c5c34c1cc35584992c56586b3c146d27de89a1cecf66082b8b1a9e52738b3042915144e614832faa69b5a549749f2a60dcde95ab851019f504037a9362e6bc522c7ae72d7808723f8d5fa7d453d4930d38fd5c42a0f63d17ab908b3115a617cb057fed69af6edc9dbabe12da98c379fe75b8bb12e1d292ed22708f10110b8583f53759014c8468681dee8882ba8355fc8d2519b61defaa065a031bba01f695c72588467f3ccb32a089f1b9e2ef50ef92a9aea27ba028058c7e389b4b6dd3d109c827d7771e64000267304d9075fb552c61a527d4608fc91ec87602caa7731f2ca8036b6e8c27504270ecd309b639fec63860fd4a913461eed05c700cbacf648b7bde403f6611ca3adcceae53ed055b434ab7af83f22fe625ff6fd5bb56be0188ea97bce96a82e379bc646946349a92c2f42e9084d465a887f4b216fb576509d133844cb9a929c8e972c3dd0fcf0c0d7eceb762bd9e8c7174cfc05a7d83f5c311c6fae3c3cc54edf5084cc8fe12b34b196bed581179d8ddf6e24753b1de6137592e9b4aa34f4d19e104523f88b66a6f67375bc3c9d25fba5f7c2cb03c17c29f98e043dbb4794dc5d4352d9bc12ac1baf90ae4f3dc2f2503182200e68a5c5f6593898cae49aa80ef35b87150d922e665583869562dd61aec16d579c689cc02f1b0b511bd507e869b2902f5c8260bd783aad5bf659907992b9b3d4b1c9a79027969112b35bb30583a539942ae70ea1cbfc6a1ddbc1042c888634277fe2d260019b7b2d2303c55569e6310b3547b98a6e535fce26c344767b53c1e12dc022023fd5a5236d30ebefe8c7b25760fad60c325384010c8a188a7fe48d3af43ad9737df237e3e970e0982c391f458058f354ea9dad4e089f83ad1722b28f0cb1a465a443ca2a9350172d38c919a975c3b174cae8c5f2f43852a9589892578f122eeb02acf112ceb5aa63e058e1cf6b9ba9840a9bd9118bd04178ca06e688b4307da14d76d1a67679365beb35d800fd02f73ead9357c2446bafec606d4e7b57f334e2f12ddf6af322fa1676d25dc6a04aa0da50d1de12def527fe73fbd42bdd17a12c850003f236c4ae3a1e5a4efeaa384b142d8d06e7085483af9343b256754b4b5d442c6dde70c74c606e772b6f25aff7fdaf155256f34be054deb4a48740af710000bbc6b79c628443cbbcf2035f6ad1e9db946011b0b9f8752b0d2ad1e5cab288ed79827ec3193e8847a17686460a0dfbad5cbb868f586b0b2a3b25453677766d32dcfe886a1a64908ebaea4bda1832f01aad657349f59a66cd23c9c8315f4ef008eef9f81c658dfc7e416fd2af0e5583684367c5c08e194f1b87b3a66a9a30af84453bf64f2ee5d9acb596f7f956dd44fd2bd9c93bb28d5a1a4baf42ad59ac473172aa83b0a0d881d12a029f5dc1389ddf50126ec0d6e7a29e71a497660e889ac8c0a193678d1b5b41d973c75ef6014652ec481ba50e0997055f9db557ff5d48b74fc62e10b1269b221fa21174e617c6f317e044c8c7c8fd115504831e579d348174aaed6730ec38024e753a4c8ced2aa222bac40886fc7c30818d3b92b56c5055805ab79c05be53fa4ee116a4059bacab0af8ac8de5c30ea0b519e7a0c732966ec0a7859f49e6986ca35f82555b057e77aac3bfa9d8be60fc59409b642fbc6fedb94a9ab2945fd4c87b12503c6b396d65074e34c29903d7905ad472199109a3a0d148e3ce2889f1dc5e40cad0aebfa1d56470a403ad1af23bb471fbcb3c2d208cc21bd6130260c38a4870ae1114bfa4b89e8ca79160da31824e1f2b603d248b26ba74135c07daa40c1826a87a3f462f845d70cfd406e2e7ceee0d4a5a7c7942ae6d4ca997b2a8bc91c00ea5e56c5d46b8ab06f44cb2c9088221c5dc3e2447ba55cb824387121c2f013f756ff08e8a4d6ee785cc5e8d902355adc26eab1b3573bf3ffbe4aebb7e4960f48b6019b0808b6224ae70ae2b843fc787ac2bd8dd297b35c4ab055f8399fb1f1dca36d6e23e4e622e8e558fc2e4ab23c8e5ff06867ac72bc6a9944866c9f934d277d3e3746c1b28ae49649ecb9e80ae7f32b399658ceb3179f25154fb8e413e1354aafa43d83ac3221317e1e05e5a4ba3c3ff8a2f06183e2da45a2fcfb668d2624c63ab15166deee1fcf052cfabead1a059937ac665871aaa65a28f07d91c0ae4c032c803e563eae9436a3bedfbc9fccc13a491c2e5629b1cab195a7062103220dad0fd45a33269842d65e4d68a8e04186a58eab3e19721e4349dd74e1a5bc264bce2adffdbbaef135214e9815117014889dfda36750cdcdeb295e31a53a4d0af83b9d8c45e718859e4333eb63326a2de15fb38317638e18731859e04b4410585dbc9edcf22e685c76e96bb522fabc87537b8c3a0e1b14e3b682e2d40c681ae22c84606a929e7cbd015e8ca74fd66b93186dff915adef2e774bd99f6266532d7596c944d5b78347151802006b049afc698ea7394b04b79bc61fc5b31917d8f8542157274ac69556fd24d7fa940787e41140408e50e1a26df4b9d2290fe9f7d8d2c69488ba50b788e2026381523417e41f316e15291b62110627029b1d588911b9f32d7360fa32e1fe0ae0354898b20250d185ac42cf7749e924ddc70c230b8a949e0f6efe2c0fa2208dd25c9f29d57d111b623121aeac48b38344be5121ba97c7ecaa29483615151a6693a102845e0b9e55b11ae3587c8b15a3bacceac7fd910cc5949c55b3bed876fc50a9ad4fa45d114cb730b012ca490b9cb62e640394a3f925279d759b2b81315dd7847e3c1b09a54af8c189308e6e2d2c00a3261641300c648ab033579dafdf9b66fc7f5e34b6011524c0fbd040275932b3f067ce322f1d285bb8fe26ea0515f94d11c73dd94036567a7afd0f5b47391c53a1ef47f21920ce6d680e0935f37080412f425a370a9c71c631e5ee0a98af6fbf519a00977ff2211d77db1e04fcbbdc5af721bcb435817dfecbd861ef7c50158d82acb7a42853940d8115aa234c041e4785596247b27b549b2e4c79d17da87d3182d16d428f17806d63a5f4a87534e02ad3a4d8d7c15ba9425880a37ec987513b2c216eece8febacf554c972b66bdff1880bc3ae3262e4530dc9cb2df4690a9280c9454900900feee4ea19612f52d3f66781f72a3534aefc1bbad320e2054b10c03aecae7d68cc767a032f1acfdf76320a796b2842db7675bdecbf7b37e4eb8bb3778b29a2a0f0238437bd6c0b82875c3261dbdd45114ff9bd01562503bd9832ca38e0f3fdc53c8f629071d21941d921250cb2d2388109aabaeac04ae0a893fcb2b840b5a3e55460e08b40200cafe2d00cd3892025a15d7914fb243de80e44acb8c1c4dd1c7a7de825381ff3b2393c44f03ba96168e1f061c72e404e463f7db98c085ddf347a9ca9831b3082e06ed9ef5aba4e62fe6d9900b290836acae265b5945b7084240e5e4dfbdfab7828794fb53a3ae1eae7b4c383d6d465ccf50fb8405e2cafa1ee1ee5572ed83ad77e8c32fb81f083e459454b3e6afc9acf75d35983fba17e5a3893e037fc3bb93a8020a240412794862ead78462142650a2899121aaa343037708381d685c5da6eed9681027bbec56cbb9b75defee364d4f4f9c889569e601d634c1b2befe62b10531b5b7ec6956044ddd69d7ce7c2b8019b4e0adf5db36e05b7a9920fc00c3470d6c4ad6947f52662d1488df3e404563cc054d85f76d9a65c8f259d4c73576c150d38ecc85c70a0e252b595843bc5663bc241fe504fc8cb4e078a5337071f3df1b6070a3f012c8ccb52375c96760124aac0900ae7aaf3254de8412da8461c838838b91397c814dd0281e4a6f1f1dd4de3d707a39edb5f297f69d0bd1646d7b078df5ec9ebcecb178daf0a862b78a1ace6b11555f7bed6321b19ce58a4667aae4be894e5eba30d469db7f64e162f814d7d80ed00d73fdb3949fe42a6d0d69e70c18f7db67c097a23c735821d4c9b0e9ca0520678b47282a70d548888906b8f01f3cb8069f07fdff8cf21b24e5e42df82ef9cfef3f9c69832c786c87f52a36954a8533f41b3a7c62fafa661f8360c8aa7d07fa3c43383c30a20bb1b366c978afec8d6e791b34c568b37e4e0c566ff9390952e281b23f2063689f8ff06195bc3c3d3aa7f57023aebc47e621230e0003e7dcac69e261271550261eb07f7d756c47b79a5da7d703e85c630280b71e733bc8bedf8127cedcc5bd7c31d358fdb860fa3870df8c31e2e0df5d2511356029f792fb065b48bf7ee7828cae1234ebac626887fb6f82bdc02aac226f25b88a3616fd22683b0d5ffa1cb95d6085faff98716147f35786c952db88efdaff0bf1015595ababd050a5342ce400b03fb9c12c7bb23d1ad1fb6cd74360216c6d15375dbd3a3351007ab2400db25f834ba6752ce1479e212443f3d9ba989d15e489960f83b987fd80d3cc89750fd90ca7b3cfc27471f7e38734fb82d1638a8415716c6987ed6941494939cb3e2ec0e88617c26fb1e21d7c87bee813751ae6ef765a7fcc301f23cd3f3ad8a87e736ea47db70a1f631438c8fab066768cfee2b69ba3c5c477eca90ca55ff8f5a21a36c3c6813d284811ec0f082806147e5ef62414491848c25fe43fe9fb771fa42396bf624a85f7a4bc9de2320adaa6a41cede35f36d399f950687fda0ef80624d7a915ca3aa4f9b07c31efc0c1a2cf9f4aabb375a890b858c5fea67e7e01e9cbc3bcca0af0ae42f9137ecc010d49a2b0a0c014afb76e8b78edbc650e04e50ee78beefd9934e0733abd9c2df7d8ee43130b45ad4385a3def1a84fe04ee125c264f11cf421ff7b0e34309623e46bdd8e6708e10791791ff3d870799e3231c22d1044f6acd57a82e8b157c4d141ff1045fa8ed4a4ab0b3d2c7989ed0e6e2fa16778efd5653d8bcc409d674c9539d082d68ec3b2468310d66653df64e9999bda139d9385211bdbd0267d8e6545850d2df607f47a8726aa2f9491b12684ec24aebec843e49d2f7edc1adabad99c0aa1f6af141c3836b1eec524f08f30d1bcf5f8f75e225371e7153f8e3a4bbbbe9dbc6b5571f4759e24bd4084c41b987a177a1b756457065b8c38c0e48606e8ca9b91051e28b7541a788f1820a3437d888b2250b2bf773ea0789d21fe7175ff603c29604e04007dfffad7549200b98bde0809a34ebadd5b61a85df34d12b80eee0f1c3aa0de0e3feb8631001e9e6673461b0e0e8484f90ef50d0bf3f97d42da04d58edf88ad918fdd6bbe4b94fcf7d95f34dfe4a76fe073af76d2f1f3c358a7e7c2b70571094d4a56a352a3a53829ba5dcb4401f0489c4be5104c2f94ef686e857cd84afc1f8defd79672f8df4434f55af9d1813b6e9e510a8a0d46665794a6dff67e8aade3880cfe36e99a3387428e4dc5c8037cf483dc6bf9a56e298a104a51ba0cb0827f9116f868dfccc262d9ad10ce8e26aeeccdc1cf8560814630491caf460c0edc6c36961d6381ac906a5cea972fdd9eb9ac7144b38af39455131864e208f9309b89e7f69d84e2c3a47340ccdc56ef9e9f5c156919b6f56429c41d652e2f17f039a12d11ebfb5e0719bc906a1f4530e99250e8c2d9f490df4f91ccdb2ca1ed0f2a0ee547deebecb2bc5031dc8d78f315f5f579870fc44b9e4ccb3b8055468009434d700d952138f01320205f8c370757bcb338b27e6a6b4d07dbf459fa29013f67ecd0e75450cd52493d5799691c6503d2046a2ea24ec061eea37d54bcb82245c881f96d527c9a64fd7cac0ef6e87d10f34f1c39bbceb7c9be3c8a5d862c6a548012fc4ced81ee0b17651fd29d25d4f0491cc4e1649ea5f63089703cd86602a4b75894fe5285cc59e54edfd6403d0fa10ec727fb38fc57a28104c6365b05a5beae220b47e3a1c6518812bac76488786b2d2af641c5fc5297a5963daadb628f46e4982de2b5a769ad28cccb3df845ea573622ffd8cdbb656fbe439e6c94ad60bfd2c472b20e91b133e8a26c222e65de226556932c195fb61926add60ed33cc9a5336970d506960cbec88893b624bf20204d3bdf224cf6e1327a98155245dfd6d405336a01c17d654733d5ab3f1bb7e4342e8923cb909d5df21ce630e1603aadebb2082d9afdd70795d9301dc07f0f991455e36752657f25302fca4ff547257092f109b4a207ad32653d5c273f3b740b347b1cbf2c302e30612ecef8b8f2a94f1188379a5f514e921804f6d2378a7a5bbad8b3e12263f030961ce6a9785db1fe2ff960fef796bad70101416cb3d9202eb57365ee3a1bfa3f5024bf3d62b7feff5e82cbe0e0bfd0808f4d4dcfbab8237e541f8da59cf99e324bc3eaebf236132830c80324f64fbc655f0dbff86cad40323cd1c3439b1df014baef56807e0e24b242112715b2e27ff5a54ef79fe169f7e2f2e616ad138b2e06e4681080697f76668d3b71639d4bf11b21ffcecc509f8a6a195dc3cbe5b0a5e6ceb4580f4a4259c47b5f13da7239250edd68c35f982f5b5af2c463b8892f0c8d499896e7f8307b75b27b7d87a7875d16640ffde727d34e580815f351ebf16e99568729878e74ae83de92ea50b5fc31a18440b3be822b7bfeff0310fec5cb570f8875313c4604eb28d7026a0e97459aaef060086d98a6ee2fdf34ae8f533f0e98e950284cbd7d9b1604c7a6f2d5ff44bf46f41d6d3c6f71ba2220830abd642e9a74d2d831c1775e881cde01d62a96c06e9fddf14a3fd749a0dc9801365acb02f0a799aec61428225ec20a9e73997c839d8cdc363a69bf25bbf14fa68f3ade945a48375348315484797b1275ce3bcf1cf92ad993361234c45dbd2260f4fde12db4b33db7de8595d6285d87189eefcd08de10dd5bc850fa6f7b88cc85cd386e1c4d9e562ab5c630c6d86f01a1e2f2d091a0a7e07f8970f24abdbb8acb0fa71512901ceeb1ecde83b6ce527baa24388e1dc380b02cc0c93dc22fa03d655c262a4b09bd402f46399171fc2558a3aefef3792e9076c1b0342c0801616b1f641f9fd9ce9d56264027f2301438639b0e74313357be2739560f048e2ac5d4888976e9b7edf9c07e167ab4e7957c3b39492b9ee10653db38409987ae120c29e3e2ce52c3d2c7ea58fa68d11a03db298e46c353489b0ceb9fc5074046690cc7f34b553a42060fa12e19960aa09b8ce3da030b652b136930d0c0e93c26521643ce93e4c3af878c7c40cdfec6d309acdf49ffe196be469731ab8dcd702e62ed6fed29eab8f66130d5bf630b80b7249dec690dbb0c51f7434bd75c11aa903c58b09d11c44467753302709af0dceecc8c701aebb653fc327f66eb564888f81fd139320a27523420beb1c60cc541d995fe052ffdf14f11667027ffb5fe0c46ad4f30f8893e8a32636b6313ec98fd2f19f262f13ad839647e3f49ecaf65ce10c69e80752d18a7fdc751d4d3eacc56c73eb078b80e98c1f3c215db8c10ef0e2b81db7b6326a2b7fd356a9e0eb0a6b5fd868648e08976de8c43f37f614043f64d81acf907c19f6035964d8a1f77c337c3723d88d0c631853d3a86f05df7f55665c3330d84dd0828d88129e17d8aa40bb494b8d5a0f3c17c4d19c11c6566cb5d0a87337a657662796526661da396bbef7abb225f11eca6236cc3f18c47162ba5005d8451367372567a4c16df34613d03b891fae62d64021bdc6b15bab309c6c984b8be4e83e49a07439b2cfbc1108c63653b8578e986cd9108d26d845619993e0e2c24dc292ac20e53a9123b0d1bd180559300c8cc0d2355a3d17545cf5fe1e56c15c01d1fc44d067a89b6a59a1cfcf0ef2567241bd2d00c71bcb38138a4b45545bd36f0c997609fc85877c5d84d65dc3d4bac24e581ca9f613f56255f7b0639085308a5695b88e144886bc7e7c503c69d1f977863ce2557097d28be36650d25af4c4005d1bd3365f3ba9cf8103e65be4e86a624aca68624b4dce5b312f291de5df77511f6babc36631c76f19bd09faa179ca9e7da2f2f68d981792150f027bbe01733ae05a61597bc570db52bcd149966d690428517c6add8fa8e68841bce3945f2c07f3503d083723ee36ecd73a1c729e7cba84290701352147ebbe1b82bf5f34c4d6057615d73547890e7cf51f96dae7a9ac8bf0a40f8480488a2e946d9f2130d8f805b4b29299020029f79d9ac324275709f4046526be8fb379fbe9e948106eedba19a86d692f9b46ab10c8b90b6dcd3563d132a10c8c1912a26b402f374d3e35cb12d0a0dbd2f7fe2e08edcf0237ac530806b4399a50200c5f0706e09a1ea7b0885acf54caeeae3ca5cc23ded78a8316910add2401f24e4b3be625bad3cbd145214b1399678b8ea3117028023e0a53c6cdaca72b2a22ea4ead5a87b7fa8e1c6b7bec0d2bb1544df143172925768a806c56778fbdf4e93b833cf3307332cdc9eb2e194c91d93d9f9c97f5488d160e4edfb36fc6dca2be6e799553045f28cccdc139a8a11a995fff7715310c70d5b7e58bb46829838ddf7ac1b6bccfd392f220c4cfd0d90237fd68da4c36561cae2d0dde1e0618225dc7ccb2833eae7b937857277d11f2cf05d78bc29ee2c8e314cf313718b4eea092b437f0568d6180e7169e11cfad5217131c1c7cbc37da447c8dcf08a06082aca5251ab9f33a0ff62d28337bef4fc3c012690f0d6b05db065892fb24c224393673af83a30ac630bce4aef3df4546548aef67d09d2ff4d4f839b111e6c1184fa587d6411dda9ac3d731405f0acdaf6fa0e9f74f381e2b81e8527600fbe783cafaf9c79a4cfa647c3f7c983e2e06f155bd78819ddbfb30c4b5a194d655e8d4a41cf426a7aea59f8e3487cde2eebb2965ef8439199bcad3a681497c75769cfea464b19bb4c3b182e6721e5d375ce4165fda92fac5615bf610bd8870eb3002f7a356f28ff361d6fc4dbb7d2f430b195e0960d93eeafdc1e74a9f4cfea3748e07d70c90cffe5d6df5da9e5827bc7477ecfdb1a91b20d9bf187907646bdaab59e442bd7455cf2ca4cb79722a5abe344a2740612c2b285b74325b6a1ad8593ad19d266c8a36a236e04813c6cea3a135bf8fd3399c66b82530e149b470d91f0a93bbf8bf815e86c3950aed0c2bef52aff9ac16fc4174be595c767489c2dba7400ee1e81875aec76e94ab0c2221d4528824219ebac7c4ce15fe3a09d8f7ba8cf55edeb8b08bc99a9497b4f38797edc5a397cea3ba19e3baaf317e61d80ee3ce2e53bca09253ff6a3ad2d60e4c312d4cb1a5483664033b376c8b7f1f7f83bef921687f92e969126e1755444ed37e359be5ac79ea0d88b8f7ebc384490c9e47a06e3c83b68c5d00a17bf4894fca0edbcc177a818386e357e6de8748ed30755d83f789edf7155a0df5646d44ab3324009c2fe8284fcc24e32a4411c720294fe7cf872c598dc7b0bfb5e0fb0d8438bc6c5ba097b218ed1ab6b611d9b971e8b99b3eef3d9924e89e1878ca97d40caf4617569e08a230357ffa68c67154c62c201ba42e33b896884e88636c11d3851d93bcf280c90ab52b8cf4b3674fdadbf6bff0d49b331587ad43efe13d59f0ab20f101ffc36676c3fdefcb500b1ed02464be3303a6a8bd88ab588bb139469e53d0298bdc436c82cc86cfdee884c8686ab2d01283d8f7f529136ba145a61f78eaeea67ae1e419696f52682c04c385f6bd9015eea6447c59deea94d86ef8f60e20a3ce7e811f357ab6a6885ce565ef8cfbdb1a1cc5f2c9f0175f568e8c2b09c14a4c411002245860036df25e0e2fadd8576a2143b694fef465e0501c033adfb62cdad5b343fe36d1811675a969de9d3782436581d6cd8a89da2e9a59efd53ee8df57a62d581ce403e5a63f7e36806e1f2f0506675737653b6d4e96795811cc51c0778a277193dc4f67a06486ba6f8336ae0f7eff51cb6bc78a84ee440ce8e9ce04f6c7b72f8643296bfa408e753f96a64042889d78ebffbce226f31fdda9890a0cfdc0daf67b7e57df05876db1071c8fadd115078d1a1066451067f36033236142b292ea068c9d4d1842905e597f37c17b33fd9c4fa29b8214fdc243aad59dd210fbc22346c83124546088b3ca08d7b574f4cb0e608a272043bc54172e8e4c5d1f9d77d29f705159c74f0037b7ca6588431e9ac856eee8dd7f3a4171e8811127365d61eefa970d7b8de8945df83d496b81afaefa4ef18817cde13749357ebf4dce359c7a75382cd1a103e6ee189eaa17da8fe07e9c07505e4da023e4c46b40f3360b0a4900330333333333333333333332bf59ff17bdab9911e0f43a4289092e4ae8864253e9d77daf01769c35f44e2f9b663094b103110010ff7c49471373f051a68e073fcf62905e94852a8740834cec048dee49ea0de9185a41938ed499ddd83cedc792b03933f46dd959964a946063e88f038eb476bd2cec6c049fe3842b98e4585101a62e0739caa31440f3d1791461838cda1759483b5456e0b1850f5d6d2b4f412add71c4a73e687b92fb016247fe5ff69eaa0452f70561531f4a45a2649c5c82a0aa0d105269ebd07153f7a73c88891b5870663cc2002a51d40830bfc4bdd4fe69c24c6fa6c81f36842ba14dff7526a686881cf156b42e3e5786d521a59e072bc8ee9513f648e2d88055ea472a2d6875d81df9e8eea2e243d5acb0a5c4edbe558df6bb5bd2a30923a3f3c4d21d7688a061538a9287def1ee84bf0694c81cb1f670e2f76f78a78a534a4c0efb746c7962fc7e83e8d28309592e4871cd875c78e0614f8207914415b72482a590d98a0860c683c81f58cbe501ec51c529a6819683881cbe951a40effce6c730c349ac045def2fea4717214e21a051a4c60731839f658a5de6fb6b151e3055ba3ce682c81cb1b19b572a43a91221a4a302d259b98856cb15424557ad6a8ebb757132149602553b465e59fac7a0c1894f182198c11831a3028a306b1315ce0821bc30516a08104b6cd55e3e4282639f328a071043e878c1eb48557be6a0da06104cebdb6e26793ae102f348ac0af07b59f5a21b1f2f5061a446053be56c63b4b9f39dad8d8d8d81a55956ba03104a62be710d1ad3253ec6908e16c91ac60a2ae5621555489663174e091afe5894610d894b13377b6edc7f588410308dc88c77a6fc9b2a5af88918512500d98a0c618347e50847229cb90d4ea2a1629426dcc9c9cc643d9051a3e60dcd423875a485fe4f8a217ec58da58b4714b1fffbc604353aeeb980355b5f18b5df0d144ff3bb9ab0bf62ecd7ab7f7d3889a0bba4bb3526464b308352fc9711c6e1b792d7a830b7e343f4d5c229855cac6c6d9d080096a8cf1c52df8683fc69ecaf669390e5bf095d382eb47deb298530bae72c8a1c4e491379f87165ce53789c894d9fd9d59b0298ee669cde9515e47165c4eb00fa9fbc43ef463c17405f5bd9ea899290f0bd63ff0eb2868ea8dd0bf8231df90577a7557f0696f297d103947bde956b0adfdb1b33efcf778b3822b4f5fef9efc432b7b159c788c11f2751c424c695530622b5175e94d05973448a5f638e6c86317156cc87d6b2175e468b73d05579971d3a2e6a0ef5153706b97ff7a43b4146c85944315cd1852ea4852f09e96b4033d7d8f2b390aa6c646ea2d3ff61c92a26023eadd6b8530147c9d76eea79cf7af5340c1597adae7bc1ba2c47c8253f11062a19248dc3dc1b7f54de95a8eb3aaa413dca9d55aafe7cd390727d8f4b431fd73de867f9b602aaf2559ce619ae037858869eff64c309ad9525cf16b350f26d8609adff7c9e3f0f512fc24dff030dbfd678878f08525b80ef3eb55dae4b1924725b8906ce5221e9460b2c4d72fc91e4bb56312fc07e192344eec9cae43125c8a39e50ec93c3cc74f24f8dcf8db1943a68df7810417c733a6ae18c5ce721ec187df3984e0631d72ee3882d5581f7d7ca37e39f61bc1a57c413cc42469a9c3308215ab8f8ab71ec729c72c82f7e8ca6ab921e3e68d22f80badf2c92caa1f6b12c147e8d3cc49b2fa8d0611fc678994b223837b901f8297eec951f63849481f6d08d6cc2b5855fa8ddf5d083eee47fb1d76d01cec26049b3c9d5574e4f697d283607264dd518be6403ad782e0f26e45c7a6413dc63a10dcefab448e1dbe6bba8060ccde839c39f6f8d2dc3fb06a5131ba59e55171fdc0bd25f31c6e78a0fe917de063fb97ad84d0f6b8e403a39176bc562c761c967b6077facef323e299877a605b733f47217daee82979606b4259580c1eb8f3fb8e0c0fe93a2f776052e7287e93d71d8e67073e69f66a7548759f3af0e1be8d644e3cf30f1d780f41f26f799787ff1c58ed8e3f453c7b743539b066eabb77da41928ee2c0558e4777520e3c7a0f6d6c6c6c10257c010726871eb6c4cad14296fec51b981c497bc85cba1ddd74c325592d22859248123dcd3adfbba7048b4955a236f081f9e60fdea6a9548740181108e3016170000361109cc1176ce036ffe247d59df4c1176be0a28b75ac106953cafc0b35f01b993c27f3abcc184f03eb1634b4647af471284143165582e50ef5aa2439dc57527f48d0aac8589fc10a1d8487d6b3187321f8c20c6ceecc163785bef04ad91865c460bf2803bf1aa34a47d559c3eb2564e0a31cdf3c5987db7b8e311c69923c92ab467473c95faf7eae6f8d2fc4c08654b01c79148f4cc1303099abff6139ca786601031f4142a7f2dcacaf912ff093af11275ada8d5a79813f3bcb9abaad8207d9d8a8aa5179f8a20b7c34e5d145a77b4c2117811a25872fb8c08717bdff22855437211b1b1b1b0a003b7cb105d63ae8d882848888a7f1063dc6185dce1830302ef8420b5b7fbed46521659031010f846177822fb2c0679d349bf4aea8f46381dffd0fb615b76d42ca15ece989d7a1af4545c50a9646a860d96d6d59252942ccba57297ffad0ba2faac087ff194adac6c5dc2fa8c0460fd39a283921e6fcc6c6d6282a626cf8620a6c47d2ca5ba1e3e9582a030622d8d83865c080061b1b991a30418d187c210536492ecffef690982f5f4481ebaecd1a2939884aa12fa040ee88edaa16c2d272a490a22a9447cf1eed27f58b27f01d44cd31068d14fd2131b2363636366000820d417ce1042e74921c6b1adb4f8f37810fbdbbd7ef30455099c0a48f1e3df958ae067b09ec8418bab692a33ce10b25b05e92111e068d3412b3b1b1b1a135aa905198f04512b80ef2e5f29c9af73f1b1b6590a182166c6c10277c81047e37e9c5686522f5d21747e023b4494f8a8e9e59fac2084c8ad1736feee8ad939c14bce0b4a0052d86295504d66264cf1a2af765778891456a025f10818fbdcf93c49c254e4e20a0a24ac01743e02f273acc93b89573b286aad50716510326a8a15f0881cf1c6686b82eae173431b2ee8b20f0e9ecaac377e96c33e00b20b0af152d2787a718effbe2078c4721d6e4b969bc102246aa20065de33460821a1b5ff860fdd82a8d485eaa600b8ed28b3df0d0551d913d2980410bae67f082dc662975c65fafc5c84a010c307066ec226d8d4ce9b2a826261d2229de84aeff1c7ae5a4200530c0400c60a0818d8d14c0a00537461931d04591c4924a881e11521a1eaa3efe48437d18528e185931a8a1980b2e846f1e4bb1ef2d3b189481300041162e18e9c9517f21ee792131b2de05301863026398710b763db859a4750d315a1f90c0c6c6c6466d61862df8d3103b267f5dfd6bb4a0b55ae0fd811bb4e0011b1be7052a388eded8d8d8c0622c00001166d482cb3fffca9039dde45206649009d80366d06216aa4529e948a219d1cc4d8386897e9cb7c39c912cd88cb593fa1e7d5aed58d486c2a2365ec185108ff24b7ecdf974056f154dca3ff77fd8be1859686394118319ada80d63051732b2271bc9275a1eabe045dbea7e4248e11d5570c1e38bb935f4c4cf9e54709f22e7c61c58486b2d2ad8287ebd1fe4088d6d9e82c9714abe26921baa29f8db4ebbf992eb81574ac107d963db8d1f5eeeed48c1b54b784ddd48b858a360db2dbe75e7c0fd4f2246168a825db5c9eb67b707668482c931dbcfce2e55f68818593028a306195a3e03146cc7dcc13394e4a91c072a78c17e823dfd8e08f78e2f45e6093e4c29e728d13b0fab61596836a0aa514585c558403ac1f8af5db579791ce4d0143083134ccc71b4971b296aa7498cac1af418302883eaecf9310e193b63135cbd6d7e092ac9a6dcd41a8584199ae0ddf2760a39b674dce021a3c5e040d6a81bccc804132dfc3fa4d7a36307134c0aabb42d8f3f52a497e0f3dda8d98666cafc2dc15da8764a0f3bc4c9b195d0245959081524755594bca0251a223b4b09b6f3c64aa1991afbc3a24d983109b6a5c30a0b69121e93046f3a1d7858da7134df921a30410d31664482ade415630831a3a4cca1356640826949e61ed53c9a452e0604f611dc5ad6a5b3cdb16a536264a999230a5142a5a45995452ccab3527c3ad4b427da8a9135060cc618831bc1844694bc5d9617b2b1b1b1810685198c60b27696de98bff2c576117c904c577dcaa397788661862238bb9c91952d76e07de32682af948e65f9b7624e16447059296e04edf0bf626ac62158ed48a3354ec68a9c1982d7f3a4df1e92445bab105cda49e4bf0e9eb12642f0914493488effd7e1c70e82f7a8738a741f955488a82038f11191cecfc8c1b31b1b1b5435ca90a1021710c435cc0804e3ea5adf195f2c26dbf60a3300c14e477feb633164774da730e30f6c7a4909bb96a8f739c8e8164460a930c30f7c85d08eb6eeb0a47f326ed01cd8d8a851da0726d685b00c397b602af1814b1f9e859ff9e4a883670c12060828607b503524b5235aa40896b2527f69e407a9735aba8891950215f855193388c10b2c605535c60c3db05db9b3b5b667b3dcf3c0e64afa38c61e4ddd0a1ed8de9cb19255456fed0e5c87377aa1d6beae2163f40c28b0b1e183197668daa3901193e7ce61d180096abc60461d6ee94a2982848a65470cabf4398e7c9122e6a6ccb931ca8881994107562a8b755d6574cee40c0c0533e6c07b9c99ded2e1468f837260829667b4751c7ed05171603d8f4551bf1c3d7e6bc02fe1c0079a6298d6e68d493b31b26a20061e00810d608002883581196f60526aaaca29ea07f1324e0a482919e9067268a56c1e39a272a66468c80e3df66e9790ee196d603fd6b69c3da70faa270bd4a82b0d98a0060f66b0818fb443c44b8f611ee74030630d9c8f7e94e25658cc08ff052ab8c00866a8818d132a1e985d85caeec606160d98a0460866a4818ffe77c94ae37176518c2c1ca38c18cc40839aed65dd16b9324a5d4cebd26688186ac522821967e0a3a8d38de699627e6e065e4b353ffaffd0a153065662c893236e774a122103d7b1461f0f2db6448fcd18031b623186da5821adba6264c1e078c18601020a6819c20c31701fb4456e8d5e795aca1c324a04c2000106c2d0a2aa615450460c54d082161c12cc0803eb714e93bc4c3ac5f6c1c09b468aa0659a391cf70b7c14ead1670eea83c89d17f8dccfa97218daed535582195de02a8739e344b888c63c17f8bd1c55713a78a764cdd8825129457496584694abb855875977ddadc5bcc00c2df061a6d89a2c48fe60e92c3029cd4d2dfee57c1e2946820003619091f52d50c10cbc48600616f8da2bcf49b24f060f22e40afcc6945692bdd42e3d428815b88e1e3978102a495448aac05b8bde8bb7f65469845081891551528eb3650f3b3305f652b2b19f3839f7076da8064c50830633a4c0e4c815d348ecdd8fdc0dc628e305fc01a2861951e06e7dcf3f65debff60956d528c2861950e0e32cf5ee89faef172df08118cce08f04fec460067f3ecf0c339ec0874193e594f2e592546e6c94613a062e2025cc7002f7a9d32177497bab765f98d104b6554b72f7e487955902c20c26f04144cb93464eef77395ac28c25f0f1c75b675f71f34e574a041a81194a6033c7b0bc8cef69838f1a30418d9f91045662aaaaeef6ff52f3612086ba610612382ff50d953cb9a36a2a88c103acd030e308bce5b768e9ddd7e9716c94a2418d2a4583330213d1af32ae75aeed78810ac4a87170a00232b6861466148109fdddf9517e9024a23a600611b8e013f6817dea9d6ec8036144200cea40181cc0401808002ecc18021f87a429c71edc4ed316831b80606ba81666088171d50f5a72e4d861f245b0b151a86a54926146109894304b1e6b3bf3ba3002fa67d1ce66d28291c8398c413b67abe42c780bf95672fe4e264959b0395e9ae01de6a0ae8c059b3983e86553dd2861c156c695e88e57b01e265d0fb4cef67705fb1962be0e66e3716c05db793e69db753b4456b0659a27e5f4c934c72ad8b2d897b552f37b54c1a79872d8e41cf3f754f096f1bcd2acd5f3820a3ea6ff0871cbb17ee5148c44fbab9ca9d5a34dc1856e0d0f5c2c7a9a94828f396306d58eba13420a3e6ae52e0fdd519951f081075ec1c4bf3e79a26027dbe3b7a8a93779a16042fee9db8a288b83828f1ed9233c573bff0413db42dc0bbad3ae2718939083c5d4b459ed0497d5f1c7891a27b84d11730e2c99eb669b6033fe76e05d6982df0f235ba8786c51592638cffb74d921c3047739561717f5c83eb24bb829a2f54ece5196c8bd2d4dccc1a312fc75f8ab390e456c725082cfaabf6ef963cbce99041f7d54fb71e6448a47127c5c51a67bdf61073991e07ca543f238079bea4082c9dde1d15d8e1fe4ff083e2587e9c47adca277049772ec318847b1b3c41bc17ebcb9e3f7daf49d3382d5f620215be838ec7b11ac5d4adf574821a4ad08d673cc514ce9463aa513c19bf8fae41cf273d588603d33f405b1548fef2118cb2bb34c2166f51a820d9596bca31ce9782178ffb4395fe767af84e03c6d4eb0ef8b3675107ca499299d831ca4101504a7b9b93b4787664a03c1c6cc51ac4754f75240b07e973e5f8ade1bca3f702b15733be8c8f0f003ffa179e820c4e8eef481cd711c22636e47c9463ef019ebe30a379536710fdc6a250f82e4c03d827ae02bb6a48f37329787796082e730d886984334050f5c0879f247cdf13a57eec0471ef4a4096e953f881d984e39b4cb0a9efc2775e0ba6248883cb394217460537b253a732a343207fe7db36bda49fa614e0efc655734ffac51ba8b03a7ed1a69e3b9e4e9e0c075ee86b0cd923eff062eee74103c8867c13537b0131d62a6715292581b180f63cacd2ce6a93336b0e5318e7ea09a83cad6c0c791c31c761d21f96ae0ff5f7298d2b98374a5818fc8cb9e3352a52c347057111deb66e59fd419989ca392aabd374eca0c6ccca9cccd99e3dc2903bf1e3d3f0711457232b0a9bf6bc74fbd5aaa31f01f327fd746ca714a2506ee723fe4204b523aa9c2c0588eeba23fd97ba402031b1eaf7e7cfa29aec717b8b4f9b3e97845881c5e607376ad69741c963abac047be7992f56bea3b5ce0c3d51072c8514ffabf057e7208d21f99bd685e0b6c4bfcd30e6274cc7e16d8c80d313bf6f813792c701e07aa1e7594e2a15760472c04ab94d1dbb40217b2a53275e6d02fa60a6ca69ceb4d3db6dd0c15782f1391909f6e333305f6fe6e42b97ff0ca4881bffed6cc21b3f2e351e0a4e3fb8fd284fe280e05f6edb35f738cd2883f814f3974c494f726759cc0871635739a5f7ddd0476d36be6a61859b34ce0e368e355c8f1275397c098ef8d9f8ffb445a09eca51043475a96c3af93c0c4ade49ad34907b9460297355bca51d588497d04b623afedf8bbe35cae11583d0dd7eb8d1253b6087cbcd9e3eda7e5ad96084c7f925aab0d79a21d02ffbfaf371a3fec0f21389691e32006818fe3c5b79437baf740e0248877ec16ba9ff2033e48770a661a526b01f0019bfdeff2b669fe487bc1e7e8e3ee0da2d9392fb890a04957fac31cbd0bfeb38434d6139ad705d77194d9cac3ea2b73c168bee051e575e052e282f7f20fc54ab3aae316fc8450399d75a81fb6e035a6348f9b6c42bc167ca7b09ea8d5d96d5ab039d0cd792224573b0b36996b78c594faa92cb89a1ceb85a44697c482edd0dfec3205891ac282cbb29d6c9a3e1ee7157cf8e87598fc73e4bb828bfbb924674ecf602b38db28d50cd92e66ace02bcd744b4724466515ec5e66eeade8e86354c1c7e579a2a2c95234157cdfe65023dc7c4a820ad6edbe3f48f7959f537053494b4f638672cf145cae1ce4c9bc68ed948289b512b572f4e96f52f0b1a34d9e92e3d8e62838ff2c9d7da73aa488828b109d39a46fe464a160c4c3df1ce9e7180705ebfa57a59f1db5f30926d56dcc75ad5d1a4f30b62b91bd11a9f14eb09139cc19b3c7ab2327d809669e39799c63496d82afc98d209afd7f4d705a9a3f77d4cd6c2698cae5edf12be5fa98e04c53a460d771b24d04c625d8e9f68e23f2e62d89c0b004db22f97fb5a963864e09605482c931d3525c2fcd0d3e25d89ad4f0d4f5d21ac749f039f98ae7b0e320d54b24c145951e0d51ed2711a92680110976f2b647e93fa7b6ac4382ef38478f4de6ab05f7118cae85966075fb1eef8ee003c9528f3f1c1bc1be6bbfe5cbd48bfe61041fc71d27f148937b85e82218eb8e24f7520875ff15c1751e3dabcc7b89d871063012c1a57a0f327aea44b38e47808108563b4aa9af94e491791c82cf9fb3c6defc8b18f1620876237e592c2bd3ff142d041bfef1e8b9476f4ad706d228000621d8d7982475a7778daf11232b07c1796976a474a5cf981623eb8c1103ab304040813068008620d8bee9cf1af1f6ef6831b26a9c61d98037369e004620d8d8716a58fb9547538701020a6c6c90c10218c0400c238001083e6bb6fa4a5a39544cf9031f7654c91fefa6f08ff981f117eb683d58c88debf581efe852c71da5d3a43b1f580d4d1afa515bd490438cac1a662f08c1c6c6ef81bb9cce2baf8f6eb01c62a4046400861ed86dbde41ed47ab8394e4300230fdc27bb1ca694cdbcdc27238d0b60e081f7bff48f5b2468f9bbb141d400c61df8a8397d0cdee6f799aa25c0b003962f5bcc1db68798f43d805107c663b26c298344741c4260d0819bac48fa795f3921a400630edc759c43bfc9b1e418626264e10ec090031f07df0bb61e73960806301883e4008c38f0ad922669598d5fe96264dd608c32e0c0795beab8c35be37e6c2902186f683f8a943753d607ba81d18997a3dd88a74162dac047e9618c9c94839c29c806c6eddac389115352770d4c921062ad44ea1d330559651c0aa8064c5003004100430ddcbfdd65bd1ccc93bf06e0021869e053dc8e2d55c7b1c76d6c78fbf1f602f0020c34f0b69a6ea93fc791f32d46d6d612c038036fb1c7b377d8d1dea78891655700c30c7c941b3ad0d4ba1b2515060828108130b0580536364c042a88c103c6704106c670810b2e0b609481b3f678ea1abd22a7bc1859859c08541083071045804106d6f244d3cd1cc7ed612e469616119441060c2a40060cc4a8a1821834195100630c8cf6df67f28888361531b24a6d6c6c6c1cf3820cdca00c1594b1b1b1b1414604c20883037f64e00121d8d88840187633f83e15d8d8d8d8d8d84011b4c09cdfd8880119698023802186bb3eb69caafa3e2646d6182aa851952000230cacc761da28f952948ea5e8000c30f0492c567d9ef43dcfbec0f5fd4f88214acee4e311c0f002ef7194e24787b1a30b561820a04018e6011108e305c7055e667083314040c30d60748149f6d1c42c1d87fc8e22461619c40a6070818d59967a1f8ea4d83b185be062908af46c5ba2b9d40217aa5ab7f34cb78320185960bd63a7c6aefd07606081abfaf032658977e039c0b8021b72e284e6bffd5002c30a7cbef6d190a35899994255e0274b5b65a8800c15d060c3000105ca5001192a10418d1a1b1bbfb121811a680830a8c05bbce8d1f143faa04b31920c2080310526ab47fccc5b51a23962649151a3063d069905c09002b76e9a3cf5a2e6b4d602c08802fb1e7a44eefe5072889f0bb4e0a0c06ed408bd29cfed2e0bd4a0c0c6c66ac004356e00c613f88f52113b5e11fffba4e09cc0c51c66bc5af1e8e3d81423abc7383380c10d6a004613f84866b9a36e95cca589915523062e3057317041043870690083097ca7c9c9aef7d437826264556df4008c25f0ef29645a757674a1a2023094c05477f4ede7a2dd625a0b5a05658cd11cd8d888810b108c24b07add3e1ede3eea123090c0862c390aabffe83498476063fa38b0607e9f2949140c23b0395393957694058c2270199631db9587c5046010819fa4a5ad95437e4ab1010c20b0b1f1c7063070cb2134414d3b553c9d9ec4c8222b004308f994d7f6c7ba5152bfb1519d002308e777ef74e754b66830f88d8d8d8d0d5a9bc1093080607938a6f14b4cf28d8d8d30404081304a8d51460c008009307ef026af5cfa8167768c82e103f2e6e497b336fc72f4c2ca69592f3d2ccff0c2cbedd67ed9533be22e7a89b993597a6841cc1a6a478dffa652418f0182bb030d5d94c673564f4d8cac303e6710860b542006191b3408c373066110c9c5da99112b248d16d1f5380795a1aa3266e0821a2d68411b2d63061978c1044a0768e082c98efce259166babc92dd8d2bfed905aa2d95d1b1be7373668d8820992f15bf76ed32e550ba652c4547d919f26850c18c440035635ea3460821a1fa0410b3662dba50e633d0bdee3681e27fb8b1272109205677b77b59552a8e82a16bcdad7848cd7f73978e080062cf8702473b68b9d5473381956afe02e9877b42a5a1fe7942bd8360b5eb1323a4be62d6841531268b4828f10a3e5e620da81c524c03458c1b4b5dbbb6dc7973f5e8c0c03041408e348e056c1df6f4e264143e5b07f1aaae03afcd0f16fa2471d98a9e0a463f33bcbbb13df50c1c64bfbe97f221ef277be461a1963cc2002649c326e00011aa760428e1bd9b73f95cb9fc10b6898c29c831c5688ceb1792019344a514c492925cb22493417eb4aafe016f3c71f88a4301aa3609365670cebbc71cb210aeeb39b2791989a13fc50f0ee4188216eb953da028a2c6874ba254929da91cd3352c75e71fdd255f4092ee4284f7f2f7298e3d83b4fb07f315b4c965a2547e95d186874828bae1ed629794e1e62c609a6fa473fe58d128bfe26b814f69eb1c32b73746a82ff6cda9b163fbacd5f2678dfca488fcaf2826698e024e62093e55beaf04e59028d4b709df343f3e7cf4a316b092e57881ff65fc84a41a75109265d82e4f59e976b9894e034279564eaca5339dc88c624f8203564f1979ced3a87185948c629a33150041a9260728584b859736e841d09c6b3a654e7597a27b83420c1e4203784c5d81f4fca79049bed530e53688cd09c3b824b4bef9b358f9a77aa115cfa8f6db7f3438c2c31c898410cb68c19c4a08c196c0019c1e4b8c314db55b3aae33416c1e6e0512be6fe8598dbc6c651d5a8ab83030d4570a9421cc91e77f6d0311b1bfa051a896043c71f871e63270fd2bfb16134d8d8301a5835810622b84dfaff61742c8bec21b8e0717c52f76511238721b89059f3935804fb3c6b542158d1d89fe38cfd71a987105c7dd25cbb79663f9a41f09ba7d3c7f96204c1796666091ec4dc5af336107cd0fcd0426693c388800736368e4003106f8b6b7e6021fd47e61ff83f8967b13a7b5caafb813da96421577efad8dd075ed532ef5d508fc3900f7c5c4f1e7b4988529dee018d98a2d1124285b985d4e8bcbe6eaf29c40e0d3d70db1dcc42aefc1b6de781891c7fd3144d2b22e18153931ca61b8dbe94531b1b687760328a44ced8a1fd68c60e9ce5889891a3cae469ac039ff4562abb6efa1a37f01a3450c19782000d3a30d19fbeeac792c75605631c326a8c018316dca0cba8516c0eac460aa5f6d9eb71d434e4c0e616adb857371e7b4e1cf8c852fd8667ae9bd4c2a12049ca5342a8ac6cc92fc78ed2b6d4f6063e62bfbfe6d1cb36961bf8c914d5c8d4c80f510f68b4815151d5fa502b8638f909d06003ef6e9aa3f44d1f3f47171168ac81af9c52745e8ddd715f1b6ae0e39c31887b9985f2fcc6c6c6c6d628b5028d34f01373ca09d805f001bfc1726465273b4d6902f482fbf83e97e5304d31a509c00b6eb37969a965176ceee4e6894aeb82eb209da40c1e7dd090ce056b952c76da74146bd2b8e0a3e5b2983937ae47fa167ca07f1bad5e532fd2b6e0c3bc8865d782959026679b2ca9c5a3053b594ffc22d47467164c88145137595eff65c17fa59e889f9ee31b0bbec3d871d66aab060b4ecfcf363d144f9157b09d238fd4a1246f64ae6042b6a05174b388df0a362cf3473bd13e0a59c1c77b6b9deed73454abe0bc2ba262a889f4a10abe3f96587e143c2e53c1ebe438674963661a352ab88b79792af24698a7e0c65282757c5193789882f598f2c77a31d9454bc1e94964fde0e178c821051bd29b4a62f2e9f85170bf2956caf2ec18140593a4dc52acce1f5342c1e4e48e24e441c174d29822f9092ec472b3541a4ff02791398c9c77828b397e20f903ab09694eb01b82bd9a787d8eeb4db019b277a45c6b82899b3d07ed172c7b6c2698a831063b91641fbb98e0b5ef5cf237f2be7b09b63ec5b57a8b7bc9b5049fa129f32a8be76c2bc14ebcce5a1ad3071aa5041b9da33fe9daa65627c1f4e6641524ac36a49260fccdadd7ede3d06624783dcbd9a2c6943a4a428237ddcef125f908eed4b4b2794e993fd0115c0ee191a257aaa3b111ec86a5c90ef7a8153282cb13a1bfa7963e5216c1affd76ac6aa1bd238a60b753aa84c825820db7cba903adf8924304ab318594af7607217708d673760f358b4ececd104c852cdd1a53e48a6c0bc1e8787c298db584606a2ac6d6edfc51a676107c0eb2554eb163c765ad2078ffe8c3cfd91ec5606d20d81077c5a3d41575aa0504f7d99356488e249bb47f60a344bb2c2ad9bf39fcc0844bb6e4fdd10736c7b9b9fe41a7f5e0032bbe7f2e493a1ecd1ed897d8e351f3efaf0736fda34fac8914953c706beb572d794f277860a37be8316367c8b17307be2fa7c81d1df5453b70b12623db7398b97d1d989c77b2a392fa1c74602db3a6667747fa9803231124e56b530d8d910353371d954f8f03a7395868640e07fe3c3d4f7589a61cfd06be423d768896fcbe7603d7ba5629f9dd0646625b45b3698d58b381cf96a333e9eb1ca25e03635652be297ee40f3530f5a59fb9f91d7aa4810fdd359dc31c3a7a2c1ab89f98d4c3de3330de29c903a96d0f5d33f0713fa7ecae1a1da70c9cef7b8829ad64605aaa62c7f531b4a963e0d53cc689292a06a6a7e207cded774fc3c079da983754bc354d3070a779a1839c32e62dbfc0a59c52b17b244f2abdc04dd65011a2e5741f5de02a56dea40fe4027b9aed6fb7f7e31cdc02ffa15cb3e6905a7cd402bb1dc1420ec42cb0e9437d07be5d35412cf09ab9a6a390b3bf04afc0f874bc3b92f51b422bb09e3cf78fa73469c22ab0a71d332c6aa6140b153897c8cf981a517d3205364296c6ddf58e1a22053e7a3bda787fd371a25160a2e3e8dbefdbc142140a9c6d4aa932e4a8ca73fa04364dee0be239818ff224ebbce671bc6b021b424d2c84799433c604b63d881fa7dd2c8fb525b031a5d879b22ec7a02981c995a6e395e86ef1d224f06799f36712adea4a91c0f4c608a9b3c3b718d22330b9827b548d314735a911180fb2c7a123d6b79216810f3af2b1ee682a7d1c44e063f0ed389fe4fcfa310426c779edfb2c781c3a0410023bb126f6afc4e8ce1320086c8c79d99176a0a53d0180c06ee826d188f8d96108f0037eed3a5e079ef17243001fb0b12ae80729a7d534bde07e3d2fbba6aaeb79c15ec550e3b93f7aeebb606def4a7c4c3cb7ae0bb6222ff4b54d75a0e782ab4f9d199d263de8b860533a4e3152505fcf6fc184985cca73181562db82d5541fa46bfed03eb6165cbd8b5eec585a706513aabaf7d33f66c16565c9e551aee49c2c58ffd0927b1cf5b162c1e43cd1bcf23d8d14165c9e1423a494e5005ec1591c89953aef6e923900577057d767619ab2a33207d08af5bf831c578eace034a57acbbe1e438babe0a2550c12cfa20aa6726dea64d7d24b4905db164357bc90b95e4105a3e68188d96775ac9c82b5cbcda6f98147513105175a123274ac1f764829b89e4c898ca9271d210597af3f34d7894e1319059317f3d652fe30f31305d367d9a1e69cacc60b053be167f9e378e3a1060abe3ff26825477610b24ff0618eb586ee38b4a73cc15404b518ecea04d391786d97eaad599c603a5f688ee38b1423b509f67b24660e5de25aa509b6a3145531fa48852a33c1eb56fce8703b9b871213bc7ff2903da939e39497e06212df0b9aa3b821a525f0d01e6525d8c9499be92379f6a00437eddefe9e8358fb24b83b6bad9ffa8d5a125c7f1027ea7dd7a891e0a398dd49d30312fcd69e87ba8aec96e3116c4e5759fffda2b4c311bc87312bcae33482899d63bdbc0b12721c46b0923d8ea3c7e11afa5904db71f4122cf557ba1c45f0217960412b4f72ea2482a9b89ba3c9ebb4d520824ffd91a6f41de44bcc21f86c89636d9f9b1a37045755d69e72fce06b1782ab142923354a9c5c1382c98bd6f1b4467ad683603b2a6257748af96a41b09a9f8334963de8d581602c25ff0ca176f6b180e063f7a41473f01c7ef60f4c8867292b7358e4ac1f98dcee761d0d66d2f681a9ff14152a7a455a3eb01eda58aae57045d53db0651eb4d4a317ed540f4c2aade974691e789b0e2c639ee01e291ef8949bcec53fee5af20e4cd48769f735b7426907d634fad57992b41c75e0fef533073979b63c1d98fc9b24738e93973e072ee8e5fdcd98f71eca818ff78278c5300e7c3c9efefe7110fb2e70e03bcee0f1063648f4286367c8b30aba817789296df288314305dbc0c796d399655709f5900d9c66ebf03c4ce33979b806563b27dd8e31598ec3500dac96986a9ebc9453c334b06569a7171a1a986ce6414f861c796667e037640fa22ba1679919f8307718ecdf635ec9cac0c71d897ee5b2d77c9181b74a9fd9e3f4e66e8d81cf712421ba5ea5db120393b394fd7594ca422a0cac68e61ed11c7fcc0a0cbc47eb61499876e87f81fb8fb207e1f9f2e65ee03b2b3bb4cc3a7c09bbc0a5b869474dc2f225e40217d3c4eed8c3ec4a116e818f3f1933b776bc8a500b7cc5da1e0fa121548459e0c3ceae8cebd729736081091551752b163aca7105de538e43c892de9d0e2b30f1e3eeb856f2eb4f15388f3fca11f69226e65081cd996f1f9b87f6963305466b4ab3fe635ded4881ddb65825a2c1eff351e03fbb876ce392cbf250e0234279278f9eb28779021f6f244dba9e9caf7102d35752ede17efe8e3781898ca93c0e19253b9a099c56cef7d5facba897c0a4c80ec1fecc3247096cab871c43ed56ba37097cab851c6e1a9aea45023f6eeea1835412913d02176a9d1e7d397bb746e043d7182d879a3c445b042e69c8714647bd6a2a11f89c6ff71739d4e773088c448999d43e4889c9010881fd50543b7b76c9901c4010d8535ffd9083b6c5710040e02db679a448d8a471003fe063520ba976d3ecc301f8800bba1751246ffa0fd20bde32779c58d1b253c20b463a0593a0162a7976c1a758519355d0ea485df05194a6cddf5e1abc5cb09e273d4c19d563f170c18e073ad691b9b7bb5bb051d5a11172f453670b36b7c53fbcaed482cb2a92b3786aca88155af0bf933992977ec75165168ce79e74f8595be25464c15ac8cbdf51b68c199558b0ad12257c73c082330f11c53d737d1ce7157cbc7ecdd08fcbf2e30aee436e0fc2727aa54f2b988e1fe75c751b2d1e56f0e1640dc9ccc3298f5f051f7adbab0797a839af0aee73dc9cfe0911fb4f051f56fe74d495266b1e156ca49945eab632d79c820f75696d732c62a531057f5695620c1afd717829d874f5d8a34d09a9765290e3382afd888e824b55b7ccd6fc3814059bf45527424c964342c1f4a40fa286dcdbcf41c1f49a7f8f8fb54efe092ef9da567bf9a66c7b824f3ee11ef27eb4b53bc1e6e8f414dbc562bf9c603f47cc5a8b314e7037c1e55ee6a6a996bcd1046f5122e7ee9a185fcd049fed5f2f4467ca9a6282aface8dcda91871d790976377a3db28f3b86a425b8fd8b39db637bff6025d88ef6bfae2edb5d9012dcbdd9c6ecaddc3993606232f7cfd197d25f24c1b4e4c8d771bc1aa712093e886892e3feef5012487092efc3d7be28e13f82f3bebc932bf22fe30846f3dee338aecdee36824b3988d0bb1e23f8dfe875d16a2d67b708367b495e799822380ff9ddee1e65ce27824d93fa5c6a29e61044b09bbbd351ea1869d52158fb8f4edb10314469d571488a112904e369952a85383d2e21d89c961e4224a64e8e41b0a213e3994df7871d82e0e3fb9d07d1a1c38e409c9b22f226092098f0f833f55d72f3ce1fd81c5d8650cdfb816fcda1a78e7e1f98ca1b62eeb154937c3e30f6b716b273fca063f6c0a798b22dc7589fc38d1ef88d57d277413b6b260f6ceee6b8e3b8e381bf8d123dc73be948bf033f29c48b139253a7dc0e9cc490561e86ed7e741dd889f71fe57a50f6371df8ca6114d31ca4adda73603aa5f68ea8d7115f39f025992e6667a470370e5cd254d135ffa411170ebcc6742f313c0cb1ec1bb8ba5c29fd2ea163d50d4cc6f81ee465de10a26d6092076952a6c829c6940d9cde7a983fa3a3cd916be023cf92a37d875a39a906de52ec28b26b9a1c9e69e026e448fb4e851ccf43032b95b2c3a0d217a37967e02c539aae081d87963c33b066e39aa31873442caf0c9cea86564fba6f493c32f041e652c9b159c814bc31701712cf73ae5fcd514e0cdc89ff75eed66b47b930f0e9cc227c3af2fc210706466dd383bc8a9232e4bec04fc8aef7a4917248ce0b9cc7a1e29f92cd62eebac04af6fdf724294a7dc70576f57f72aceafd21775b60f2762c71a4ee226ba70526daf7fbac2cf09a53a63a893f6e1916384dadb7e5315dc8b9029f3bfcefb45de68156e0730c16b67665495205bef63bae602975ea8a0aacfdbd789047fbf25360624ae530859ce3b65260cb73f8b97ac5758c02eb6d9583ce99a98602b71ddd458f26216b744fe0efbcd2836887d63881d7889903dbe9c9e5d1047e537d7eec543ded6102179d82a498c5c35f025fee23163757fa56094cceb288a8f66c258149561b224dd48e0a12d8b28fbe081d68747f04b622e78776d69b3946e0d3ae8715fdb3c37c11b8749f97d69b3dd6108189f02c518267ff7608dc5ddcc8a21d744e11027b97671337a79a9009027b6df635395baed081c0e7c9fe30e6b4007ec0a520f5d99b2e8ad502f0019762151aad9aafdf5e7095d69f5256c8109717bc47ff4842eeb415dc5d30519d921e52f08eb2ba60aa6f24be89d77e682e788d8eaab2a62c652b2e98ecc98385d4b9e3aab7e037c33cdbf22cc4d4167c4fa7ecd1e6b87fcf5a30f1241e4670dc2a5d043e8cead291460fa96a22301131b5a5eb4a1dd443603daa4ae3515d21f09319e1398c7d9eea06811df5fadd6ec953e72200084cce9d126e9336b48f801f30d137f6adf868ca1b04f880af919c2cbb4deeacf782c9619e14a21fa9a69a178c6edeebb24a962ddd057fa97bff76515db0f9a3c9949a2b574534175c7bfb478d22ea394c71c1bb985aa69ce92dd8094f9ebf25bfa7a4b660247b3dc70e7d4c23ad059fa6cf7f7214a37b50d382bf8e4ad344c71e5aa4b3e0a38d2a9ea1729cc34fca82f58ea9adc3201a3a3a63c15de6ef92aed8a776c28277bf493994e9ab27f3155c8e728839767748f939ae60520e77f42ac7a92399ad60cbde237de4ee7a29c90a56ba3f8448a1377d2a57c1e71ca5be28a15405e3b61e576d08d216ca54b01e6da8a9ce1f74e4810abe3dd3d9e6cf29ae7f0aceb743349d5e8a9237057f3bfa671d259ab4a5e052d358ce2a3df15652b0ba397b1835e646a8a3606b42d04c57e2c12b280a56cb93aedb9945b230145c8e43caea6b498358080af66ee2c7940e2125859f603bfccedde15f3cc16bf7f476868af1624a27984852f69633e4a465e10457d92ee6f4eef0b42c9be0837d9c1beb5234c1ebb8fec4f4507db592092e87e379c13bc8d03930c164b878548ff5277e5c8233c9f1bb4951ff7a4bf09b3b3dbba5b95d5f09b662a688799e59fc3e94e02da4d552329360e3448447c99a2ff996049b3f394cc12e877e6d24d89174e51d5f2a4b5148b02b5dbf63b7e9b3f908b62e8d7f18c2f2c5cf116cb4f13c4f398ec262a411dcdda40823f8380e3234a68cc871e616c1a4a66d268d2b82558d2942befb6c5513c1e62ccd71f4feb1e4484470f939a5504dab54f3109c68883192e7ab8f4443b096f386e4fc923ad51582ef38cc1c67cbd72ad511820b7edd295dc714e90c82c994cd3cde780ae91604e797432c104cda2d5d891ed584c400c1e71427348de70ffc258bec28720eab347ee02368e6cf24edeef13eb0995572c71f2f5fd4381fb88e19f524343f28b7f6c0fb5488a19f436f5a4b0f9ca5ed4de60b261d5979e0f623c79f2a2a7a280b0f5c284bea133bc68a48dd81711b8f728c943ddcadecc0a6aca11f67fb1ebbaa0e7cc8d16f90a89034e7890e5c4e4d48d7f47587cf81a9503166eabb87db7260624eaf9e249a4c3571e05a5244f030d65b04e1c04a886611a3a50f397c039b7c444b2d85dcc0b6f485fa2eb3ec618e36701a39886ac4f44a123670e117d1327a8e11ae81b5907218199375484e0d4cce71b67fa591300d7ceaca71e534b942060dec6768fe8590b3ba2231b25e705a600e0d6a6c4de000676034a5bd4d8d9272c70c6cb8f7beb82431bf0c7c4fec8a9f34d5c69081e91cd67e14d1a9fb31063ea8d3cad7996a7b31b01972583ac9b9969f3070d2f9732cd1fe7b30307133a4569407e1f9021f6ffa76b2ac20792fb031ef685e7e0edaee02fb51865f9e4829840bfcc698f951f55b602b748c581d460b7c849c59f2ddf2654c16b8d718638e8e3a46d660818bc8f4133a6adedeafc06ed65881a96d09a94752c56815f8a834c9b4b5ba3ba702e376f7ff365e914e81d7dc21e7a60f8f925260df739caed2e51c865160ef3edb448d7ab1d250e0e376cd10838b9afe04cea35b0e742db88b4ee0f58386f9c6da94b6098c644aaf9f72bff34ce0bf2a2d7fce1d25cd12d83ca9f28f5dfaa054029b36a5afbd47d524815bdf7fff9cde425091c0479bf1dd23f1e8398ec069b0f68c19ebed4c23f041d00bc9be99e216816f0bc9722574e51422b09f3f4c672d9d2e84436053d61c722015fb7245084cce98723ca9e3d0db20b0975ae2af871c00085c882e751e77982f2507f801d39b3c5afb2b4f8f3b800fb8d1faefa0bfc300bd602fb6c7cc29378f78870178c1d5e4c8318e5b8cb13b0cb00b765483a6bc1e4287ee30802eb8d469297858396f8e1d06c80563f1e350dd443a3ced30002ef810faebbf62b7e0534aab495bdf2962b6d03b78c56099d5828d1a9239e5a022e5450b26556d0cf57f1db6350bce63caa371333b4aea90059b3a4c317fb1e0e3e8f3ff26cff5a982052baeffe9e9e398fd0a36a528cdb917db5c57f0b5ad9d9347ab35690597d643f4841c73d258c1741053b6acaec92d3a56c1dda64ee7d4dfee51051f3c680e42fe380648052ff15b43ff570edfe3180015fcee27df00a760e27d10766191b939c700a6e026e97aaa14995b738e014ac1ad276bd3d2645d9f6300521c075e4933e547c1759c1e3d33e958fe45c144f5bcfdfc97a27e28b8bb4e912e3df5a60f0afec3570b0f43d48bfe13dce4150be6613cc1e41ca3e4f477183ca6136c77bcd19037e7dc184ef0a19a92eee468426e36c18490f21dcb35c1ef87bfdbe7af8e3299606d2f730571959c6382a90c397718c9efd37e0936b32e7a1ce3f66f6e09b6edffe3984c62f65482f73c2904cbebcf9e12dc0756512c87b4cd4c82c90f59cf9206cfae24b8601fef7ded48301ebe69fcd37f4f1b129cc5348f03ad1fc165288f3d8839d4aada11dc847d7bd8a1deed6d04979b9e37a464294d96115c87b5be1d4af5fab908ee2279d8a12615c1e6907247b929a55cc944f0615fbdd122a584242218bf8bb6313dfc737908eebd634ba6e0f71134046357ef393dff03b314828f3786342d413d300921f820b47322998468de20b8feda24a9a2a9bb1304d717dc7ba2831c5a7702c1e6bb4f1fc95977ba03086e62e5d97ff4af713b7fe072d884e72babd0d9f103dfff92c9d53efeb74e1f588f63a84f661d3eb01fdde5fefdb749a9b3077ea4a205c98cce161d3df0bb1539f0d4bf0ea29307d6a26d472d2dbdcd8107fef2e31c9ec7f7921c77e0cffe24e4f250cb1c3bf0122dc48e1a2b52fa75e0c53b735a2f3fb09e0eec997aca10fd1cd8cfb1e74a1de75897031fe66b85e5c83d67e2c0779cca18ec6b7c87036fb5c9c30c212dbb6fe053c769912ae63832ddc05e8a9b6ab503bdcab48149e9cf23d3fe96071bf88e58766639887e0daca61d4b5f69bd4a570313e377ce61ae5dd6d2c04928b7b10df553a1818992aa0e519f818db4ed388eae19d83eabf50e51fd915b06bec34c69e7692c5d4b063e637be69493db73e8189830abad14ea9a3b540cdcc5f18cefd69e1f0d037fb7e2818aa98ea46060d376983aae0e83f9f90526f74308f5d0728ad20bbcc40eaa92b506efc02ef095af3507aeb997825ce032ef682a8fca97c32db03951312d654a15422df0d1b575cc8d9d31c22cf081d487973d050b8c558847a9995a39e50a4c7a64d6fd673f59b1023be5665d113587a85481fb1cc4bc3197881c4205be7c920651cd2529640a4c9d485859c60f39f752e0a335c7a4d645813b3ff5f0b4cd4e1b14d8cc9bd25f70f18d790267e7df717565ed502770dad97c2fd66ea709bca5767e7654f7554ce0e3f175e9389964ca1298ac9c31fb790e3b47af042ebd6df6c7e8817524812b1bf10e32340012784921751c6b25edcb618023f0d641df69af664d87018cc09947b9639fd6f1388e018ac0755e8e834899b7c7630022f039d2f45b0fa777720c30043e7d7772c8193fbd630021f07937dd15e59edd314010d8ca314eb7b887371d0300810d9e15e2719ce378f306f8017f912362ce903107be017cc0c50f4b1ebb6596f7bde0e35451d772fc2149cf0b2e337b1ce7afde90c3ec8237cf81e4f851e8a835bae053464a69a53daed3e482abdd888ec31bdf89c10517377ac8903a78cc995bf07e399c8e93755fcad882cb93b45f531d5bf45af09ff3c73c7a9d52745af01edf390b5eba3e4821a72c915c16acd9f969eaf85173742cf84d3147d1c3538ea761c1649eb28bce3cdaf72bd8be7cd19cdeb19876059f4933630eb6d16ab782bfcca16e7994759666051733bd6d3f65588e5d051b394a8ec8618ef9b3aae02d456b0c412a527c53c1a4368dfc6c79425251c148e86cdf93f8514e4fc1a754464f71d74c4953709a6f92c7b79a3a92a560a5f2e69cf18394bf24051b4a57af1f051faa876ff9e314630c8a82cdddadfb31ec3f130ac6b737f5470e6697020a567d53d77ef6e708f9041b9ea5729424d9fd9e60f34e0e15aff246ad13fc7ee5ac3d2e1da538c1f4b7db4b5ee84db709b6637bad8bdb93a309d6b44f4255e4dc31135ce520badb44458a0c134c8cd93e7dcae8f1b8049fd5e2b58a947558823193bcfabab1e3bc128cc49883c4afe0775382ff3cc12b7ff2b88293e0e390c395ecb8352b25093e6affcd0c21b5f948b0af493c5d4b2546c84082dbff78c17df4023ce2fcebb18e60c4367fbb63f30f3c8d60625acacc99e2153c8c60dd37dff7c713c5f38be062ca5e1dead64ff38a603d8a12a37b9477433e116cd4b20f434cd929f78860334eb4b5b2cf349a43f09fe3fe2cba7e51620cc16765cd0fbba394670a81c71b3cda0c213815b3cde952ca96cc20383597ee28eff50f417039bbee6b8d772a03c1eae6e82f67b4e42120f88e5243ac6cdf61e57fe0b7326fdb93f76bda0f6cadc7491f84c50b6e1ff8089f1811b4736cf9c07a500db103750f7cf8a61b52a67ae06debe3bbd70ccdc93c70399a8d4749f2839778e06f235d9be6d8299677e0e394dbf6d2e2d79476e04edbe35c1da7690ed681afc8c156fb52472948072664ea541bf5724a700efc74ccdb39aba6ac500ebc7fbc29e520a5958471e044c33258a4c081e9b70b153943f45879037bf1ac2268d68d49e20646aa62baf4e4071e6903eb9ebf2c04b18e52c4d9c04d74f3489b4dda73be06be345e67667b089a733570bf1e47938715193f4f037b41da83998d77f01c0d5c5f660f3a4abd1acfcfc0667fd7b5ca4a229e9b818949dd2346284d1de665603353b060394aaf3727031fe4b28adf71f2d8e563e0dc524e96a3493e75b91898b4f6ac9bd2d45e7918f86c1d7710b9962f073918b81cda3cc614e2e59ffc0bfca5b81df787ad1758572ba9102abf4ac8bbc0db646d568664fb0f2eb01279d39991c5ca630b7c6848ef4a1139ba1c2df0398819d2d55b0c969305a6a37a85f86e97f4c7021f3bf4f412e268b57f054e74453bb22599f756603a7d14ddd2a3c5ecabc05f86cc1f8fbc2d7a2af0a17d9ca38d8e4a35660a9c764485862cbd9791023f2ea69744b26adea3c0e771ed10620e728c7128f0b9a37ceb90374a8c3fa169b70ee1b61398387137b847d28e6c02ff96b3a5dbe4182f6702db917ba61b8d36f95e02173ff2d89d13f2344ae0f3b7a6ee6fbc4d93c0f8a47493d7a663b848e0d6fec32af856ec8fc08e65fdb823fd286d23705adf922b7dfc6c11b875fd97901c54599408acc6d49a1c43ba8c0f81b50d59ad69760184c0c4fefc90e3df90c7ec0204810f3cc7faeb95bfe2d805000293d42a7ff7d7378d5d801f303177282126bb10a2018bd8a8e46ae42242e1e0c05030180a0381c06037be3593160000000c180d85d2340d34c176071400033b322c3e2420121c120c1810160e0c0c0c0c0608068482402018000604c240301818c493d1ba06de9514db58cd16dcfabd95d3eaddd28c5d84376ef3d1e3b9bcb6ac5e0f606e1fd8a2c511771fc97706f0c30c1d4a7cd1468d0b6a28d1c484c9b7712ddd33b6e90bebaf5ab25d45a468636ae64976f9c918e45043a3a2007a92372148d92eaeda4ce51305f8d8ae815e59ca75ebb6525958c1ef3d03b17ffc0cf14752b2d48e9078cdfa85dbe8c42065cddf8a2bbfd283a97105b1bb939b186c0f779bd66a81088618b1898a2a6ef49216dbb4b435a202bae2ee765c89d435591fc7ca987177cd038e50269cf55a4d3c0c2816fc1c0d9294b5ca28a8091379954c1eaf1cd07d64297ebceebb705facc3e881a20743fd8738538dc3c79dc13cb45ce6d0a05da635f6c96c224a70df5421956b07e60cf1847d456fe6eb9133ba61a38d1b7b638efb1a5f49f7b1a689fdd4a3870c87d28e0935b59e746b9011c280982aa54275246a4e532ace09d86ddf387874d2d98703eb2eeadc935737befbc08a435040372e1f6e3a41bef989d04913694e2c87840d719911ba192af553bd994d007abdf6f4f1c34350573e6c5092b7970f8fbabe72e5dc31bbe4214016a533090a441d499328134c5ed7d9530797b6bb1a2a208270d954440e1fb64c46026dc774845d2a7d5426bdba2b1fe5258a78edccd18147174edf3d7770e7cc0127a3e7a401215e7779e0d17d860b099ae2e038ed8e6dccc4b7c778647a7e5289e6834549244a34c184d023484f92c4299f7878eefae99bf36e1d1237c74a428502688abbf0e88443e76e4edd3d7b76fddcd36397cc3d5610bc217ecb62ce6326b042cb13467aa49bbb3c35c8d1b2358a358a1472cba756c41174152db13bbf7c7cf3c6a36737a71e3813d4e725fea23dac51d1e7387fca5e122a817e0930be64843670834f1d7077efe0bed393f78416903fee0d777cef712b09d2919c6cfa642745069504e924a7a17dcdc1324899122b3afceed9b3dba7cf9cbbece8dac98dbdabe0aef5b8c09972c708b67cd69025f14653422ab727126a4d9ce6f8c8938fbfa9aa1d94c1cf6cda5002192ad4d0491023eb324d8f633bcdf0e0ad540af9cda14cb3063a56b2798d255b4081f0844a5f182eeee529d920460339959c4d43339ec3ba305d7affc831d720064cf6ac72f7c491b7f7ae9f3eb877eab0d6578942b0be38be79e7f0facc8c09b9949d3b758e810ed1af77949969d1442ba10495c4ed6a68219498c53cae555165319b6da6f5274e9ce2559d24330c1b08218ff4fc12bfb5be35b5cbdd93c6f013b90c4bab836879a6051b23784e718107946bc5ff83c3dd7efff29a0d94582d2ecd6d37177d0751e71e47f1f1eb8b07dcbdbdaa4932e971f2ac5cfaacd1dd75c7ce5b4b341d0268153dbc940c92085049c63acd9dd387ee9c3e906366cc125dea3662a14e8c7f8a9e464774ce84829bfdb571b86c9ecd523d596f3bbc7becf6f535e78e5d9d7620673b7a059c81dfbd75de3cfa08c9dc329be859582584ac930066b488e5c4a2018b84f4f8fdd91e0bc2778b3a77e8e0f447876e4e9d3dbdecf8c5c3fbce4fdf9c7add8ee39bf7cdc51b4f5a61419a7fb008f0b56783d70a8c7ed249907f017e14d2489a32f9347e45ad0e4f1ef7d095a383f74e38be350f217ad491a44a76ad534777ce9d3cbbc6f9e5b93b470e2ca774e6fcca933b0737234c843632c91c5b8392fdd40d87ae9999016ed7410a59a448d4c933fc1957f3f7ce6f1cb9efeeaaa3937b270fee9199a359f73812b45437ce3abc76c264faf5a76e9cdf6b9274ef8cf14898681811adf62d7ea6b68f25ceeb9f01f4cc9b53141e36d721b351e369362223fd7943851141c889e369a6a7686d1a37ce6d66f35d48f2dcb55307b97102dc838594c7270edc7675d9d9c9b5b3e70e5c7f7a8d499a09134f9d442448a490247dc2f4274f964639470843f0898c60c34c680b7d54e5a08e5cb28b6ca02929f5a633860f1d12b40c4f48a7b8995da43f15fac74edd3b7ff3d0c1c519e7675d38f91a52fb67e20e419877c50006ec6c9d98ce3dc720c16546b8d070cc61449db3d3eab5b44516b350eb8d77615d1526ab9874b1315dd4617a3ab60895965b5ddcbebde7e8d4cdf9cfce2e39bb7b681ffaa4b7271d1fb78058dea95b27e72ecf3b71fae2b98b1336d29fba71de6cca8533f78ce1829028dde44a9dbbeee8c2d1cd9366f8a73c7b76f9f98563b62121c249ebf0ec1ac777cfee30c4fcb037497b9f067acc865ae1dc6c6ad26d5d3a35e898d0e225611b21129e3426d0b36590d910070a94fc6a522d1ae6d032cdf07755245480a199edb52a15c7582e4475e6396541fc6ad691165d377f13db231f847e3c0207ee8926e27d24b684f4315f3a5d40d3ac37d2312b0104e32d3048d731b75c9ed484da8179234c3a61901e616072f36f530b1a09fa97dc50940928afe39f14c728cd943eb19c77e70866e198c6a6e8f8e7048eddcbc22d038fc433a00e004c87884488627d3dc98f195e28bc96819c850a5560e5f605b53feb0f0e91ff9a1ac354e1f0453899253e1d9c085bf8e4aa8588c7bc0b98880d46d5d062097ff8d2e35e9dfdb53108545281bfac16e14ff86a1992ff4e17b5c574a798bd1ebce18611c7b452ed0c9a4a711026fcd1205e94067b1510907d0b7ee7a845fae81fcb7110b948db36c94c638205de06625225f4a8033b048aff6ec689590168f522513b8a4aa05984e91cf209013270abb2357ee3b79acb49304a6236acaff154e7cb8e39d9ccd6baa8f4b41744550373c14e8e932cc63cc42885f2398c12c0d870be215debd4a9ca16e6d74cb101360551ec482dee3481d412f033fc17ec8515e59117b4aac04bf8d33a7c4d6f007839def0d289145742f128013566654cdede54a23389289aa58667515da82854e195facda491db4fda1dbea95bc4113c15ae4c5136f86343dc1d7df81cba9c6d61e0a34ab68c0a376f485e988bc521b442cf4cfdba458a6cceba78abcccdccde708785375a6db61dc2e48773f08a1fe315ce6744a2ee1400b793b122e474970eb11d7e0098a37218a4f4312a6c12339f07891e10872e1779d0de3fd7fbcfe4145bcac9620c04bcf3295ceed13fa42de23231a18e732450148903a5ac0ebff0c08053fbea353893946e6b3cc4b8c33475120afa14b6f64241b8c90b65c84b44fe90e916204e2d979b3bafaa59a7c5df5d08309a7eaf86b02a2cfbf41f588d65139f8be5dbc3230d50831837d65b1dd49c91798eb2353c80aeb8e71087113589db0714215f1d1e67ee54c4dc8f6447a4d1f0d9ee8185e6a99e30b5e49397e7337c708a4d2c50945da25593ca99ab4758385608b67bddc087b47fa4c421a83606779ce39ed0e94ae91ccaca959063300f1fa4a7cba8a224803d915cdecbcc00b84515147029bfe6b7f5b023d8c20db56aa90678662cebed044083e9ba5f16d50c09e12ba91aac8d68b157a98a292e99d77432ed2302fa138e03dabdf5d00d4d465db9bfdc424b27cdffa014b80999137ee4770d4900ee4fdd0673b57f147f6f552ad4b87730780714812a0a1648edde55d2c1b7cfb9a29c7a70c66a141ea681eeaaedc7292d00a7f67137bf3e3d87ed06300ffc770652c9435eb72cb00b4380bd5c0eaec62da08df1f303278bb9a66c5cdc6476229f135f3cf337cb08041a6f3a8da2690603cfb49bfda52a4c4a60479ad9e258b81d034a5ee177c1983c819e78cc5e345749de13d79243ebe271c14a01be909d7d5bf75784c31205ece6c966a4dc0076a44070b31bcc72f1816e4857150615d7de68a3f420cb3e58a29840102e1671937e11da73885b89f6c5192f0473f75641da416d3e1b1a289c028a1b550d18cb391f30685c0622dc1671f6995205a861cec29afd6d49f02ec8c00688f4a178dbeb9b9568e4beeca50a946ead82dc59c3c52f8f6b59c9fd08ec991d6ab500bc2382aaa47272267fcd55266cd5a77accf28f220d9ef287003df79bd3cc32f0aae9d9f31bc35e69350a83ece6941669ea4346b07006ad90111d371ae9d2fa3fd204019987181c4bb89b020006668033f0b7777b58d01007c05f0420a48c2141c5183ab142b5f51c47a7873617c9df14901052872e5b19b6775b2b06f05fa7100e3e3c31e9f4a48be41acae6a451984f8c2c5100d0c1c372da0b4021007d923833585e6a8c1e9be263de024aa478320b002e978283d073dc58253602bf1252517b813e4da907e59e549dad232f3a1a4d395ef6bf975a0e83672c01f9b4615bb610b4752a9c441136a2f7d642140e69314ff6498e3a6bc77688e3f30e0d4ee5710fa61f61f6cf19388040ff91bda50666800c578f785fe4fd69087dfb1d50c44a8303529dee83a144cc668aa0ae5ab401407d94cafae342c013d32216c6b48882f70c5aa9a3713d132da8881ad539d5ff66d079d58c3d6381c1b0695aed9ee22b42350eb7f8e47ec501deff1cc0eda83b0c1e20291367e2a54effbbdb69df585a37d1df8590e32c3a6ce7e42286a940385c0ff0faf6d1e940eae5e53912eb9ee7c3584b44cc60f1930c9da0ee94e8333df7c7d105fa2b14a1f13d4822d69e9fc2b1440a1d2f21a3c01ee476a407de062e35ac139fdc76f682d9b7c265f7d4ea3785cf46d32e7aa3c5f0e20577ca0968a59914dbdbaa90ef29dcf6a82100abe8e7d17cc8799a0d6535a6d38844be2abb852900817bd451d0c2530a11de0e87d07b0ea35546aae4d269484f0d2bbbdbe73876c070a8a6cf7f89817b38876c9a95e054f5b0f4376e9611b7cc3d289ccd4660016c3b1466b567d1ca3393507b1deb075cba4588445942d676d283aefbe3c26bae958c08450f2496160f97b01fddfb8630fb333bc2fdba2e89d9d0c1e2d3f52f51c5f1f07ec550703d696594c6ef8065d8a516a645ea42da8e9d26b18efc41be48e19664cfac553b35ac1d22e8af9c0b37209ce73587b8f430da485c7a00d1a8e83a8a98189c342372cf6ed8c2cd542171e8aca047c606e4a63c4edefdc31105a50b52ce2d696007be80b60d0b87c39fcd57c0db799b52e536ddaeab45e20c7bd8c9c525bff5cb4b2d6699af31e538eac01adbc88420f892e7d24cb25cfbe65512331ec2ebd02f925981ba25a54ef72638c132425fa2aef98568de8c34ce362323b6b7dadbd123a26328f42a67ff3b34005962038c44a11602be0947cf0481c4d0f862a564fcd41fc6786a1c2f46aecd135a034c11539e5d8b5494c166ed4924bae9f025c3776a3709c55f094a2b753d01663dca1fd54384f02dcd2a687de216c828b4240a671e5ad2d154abfead23bd211cdb160d7c5b959b2e5bc549f355a96cc5b01b45c4ca204d0eeccb1b8fd95201b8bc4e0f10bada9e0ac25d6a2331fb31c7dbfd2d391ece50a05e397285d5b2b0d12646bee054c5d7b592181afd64cd5317987dcc110a0bca066f8b689c7b72e8ed9ecdbb56cb208dae4c4d43fe6c50045f13360f41f042de0cab7bc64df9158b8152b11560e2608ac216d9da582a30a31d48ec61e65be169053c8fb72a2f92a4cce0e2cbedae73ef35a9cf732893abbe5dddc6341b09a794e7660a2199a5ad5649e8c80d072972614865fde8c02eba4c2377b21e68161806c17333d41aec9ba4606fc2e2f4932d9a60e58c5265b674f12c1ddee63d3402e313215b370e58cc0044e4be9a1feb805e6f72742642803905accc01b8766116668073263cb82a21355e8908c06a798711d9ffc961b2d08f18c77699ed3363c474fecd9a81999af865745f896bddd8d1b0a2e9404113a84d04759739616118b420e841450496485907ebc9552896fb3a2ae1c9fa1b52b66813f39a37bf82d22e0bdd1561b2502238c7e69a6bb4fc482d021197fbf5a259a0d41b29c1c82b0b4e9e9185b84f65a50081bf436b541454b9de23e5736d6961d1ea008b6e71fd7ad4ed8476a481f038b275a3288eac375cde5026dd9309725a6f342bfc2fba982038a4ff8139ee0580f9ed0c3448a1ebde4b0f0fc2ea94ecd758faa4cef4e25468f1f9560181be89bc79fffb4bdca91242362eeb229e64d806da634909ca842bba29fe2b60e7318c97dcd058c36734dce8687094e060a5cdedb667b38d505521f45498eb7393055901276169b0382dd7e5a2c32a64e9bb6354c96c651466d8d714c22477b8ae057b1eb02f73ecf343acef7668e79638cdbe9afda34820116378c0842a6d378bf8c60c33fa5e13536abc895684ce9ebc1e775d8d41b8157c6261acab0725846d2e6d6c71b301f2a3bf213bf885b358074633a442b51516436a5ed64e4957437548e8f29f7e2e185395b84ab67ed1d93b99e38e6d10a11b99e752b7eb9c76ff799e6cffc121785e7271704b3006a112c15067694c193520295b7e926dd738ad353bc5f3396620b3b868e3024152114ec19d2a6bd99f2f620fb3fb91676ba448a0a48c7d4f45b9967a425e6d54fd571de3e71ac6581cf30e3e01c82c3c769fdaa122aa82477b6bf55ae10187504ebd262124152f1bedf84c4a8de2c9fe3c7c0a25c13bd1707a664f53b1ef8119199d275e8e132a06adb928119960150a245567a69ef11891400fd001a396296ce8c8bcf00ba09e7874dd4337904a99cb74ef2429ecce7120777584c36caf020b594929906f6615189b9b0ea7f1bc1d102870566049faeade8d901a27c1e81309809499b336c9cb91ada67bf9649117db321683af1608fced281c4ac0a39a887d4a426b82a008a374f7cd92a8f8fc9040ccda4eec63cd080f0e0c0f675c741ac8f29deec08fc9a7068296e5683cbad9c8cd48ae62fa0f88806d2a497871bf2d304aa3e8d586bb99cb468b37219868f4cdab06e40669930dfda328c5ba93e652a292be7043746772501d8011c7178a5f91005c57cdd71a20d7163162f768b13ce18a0ca97b5fc8edb7f4d48c9bf8492c3fa9d691b3e9edd24187491ad00b898857927b75f417489523997e3758dd3e329fdd581c851ef7dd4119af25126347184d704f31322d103e5f8c6ad316ff07e10639912417b365110f7d6b0ce6d8c136bc6700adda71893566c4a0c2ca84118b598bc581298f5517ce10f5d5b5cec7980f4c2c0c11d85b991d682e27154960b860ca61cc65d981bbb8a87e8ef98389815931c814cf868e480c239ab566c3a9299de5a6c92f3302862d34451cc20c3fe4748e65e36c26ae116ea582f7e40508d093838e2788486e499028d504d3428f9a2449a4273779e2d4224125411a12934d9feca4c8a09040aa18d13338c281ccd34b9ef7848d4e0a741a46877566ec49858597e9fccb0925afe82778940ef93cbb0304460ffa605fe7289512f5d509c0b6c291407c22689817b27e1bc2d4c61b427e0acd70e4a974445d9d4aad06dd05c414692fc8fad1ca1533e76cea8ff8fa4b84a669377d9db321fee05d310647e484cd4bd754098ff55ed8fcd8215c6ccd0fdcf94bf628a154da105ea710ea9ee2a3f34842df2d236a9ae0ee7eb7ab62382f852a2b765f34e33cb94e7ad00b5ca312abd7e0dedf35ed497f32469949167f22bb5aa1dd1e8ccb3660cb2b48d0d667d49bf309cf66d026b71c1ce1c635c840959a6a682338ba5b230db024637d7b5f74dee6d3f5101fd98caf0c256d5c5623804a0835c149624b5b589600cff67e4d561167ba5e3afb06ed46066501096e63e8d7b16e940f00618c51b2bfe61b566550ece5dd330ea8ee529ab85aa8a69f27cfbf31013c586e0b6dbea680a90003b7939b47f4761d36f67cbe922be9ba5481727ce0d5807b2776972ec71fd123f26db02a29aec1a15ddde7b4db0abb125d5eb8705e91cab02a6312a2c4806802a2324ac5bb693275a015d1862db9b7b623173c6760b34c38f8c5ca725532820710576525ff11a73b71008556082cb7bdccb59844155bb980a821c1e511bd3277de14108780eed5695861352dbd5deb0d45e4c40b445adff00120705d801d901301d88a28697bbb4f82bf158a02de10f0e8e3e9735c6c94df592f4613785eac5becd98b05fa0cf5e5b515b592949db22d7fa5014cf65a7fddc37f910672fe694efe4f5f6f341f9e3c0fa1fa793645ade3cf6c5deb5cedcbcae11470adc4c2363d2302c2eebfa5f7d343056b5a45f26547b93dd9e23682b575b55453f86c957f8efbdb0a187c50c26a4e62516557099805249c2609b662fb68512b3cf831dc212573904a14e238daa06c02a0a43a30136f6a6dcad205b8d40305b0b683127fa23f41aacf30643a763f9cba541990b6661bde4903870260ad6816f3f6211fdc761f26205a7045ce02ee9ef93a2ac0b56f4523fe15f9a41111b86fb0e9156cba4cd33005dea7f379bab0ef2083cdbda90925db4d43dd86db1fc5b4682405762066291a061948b36c2e7b806d8c6024058770999ad0379f2dec52a143b5ff144f1b37fb287943c48f4e8c5a94625ae48355649a803e7cb49536ebe8af5fc3f7725127dd25d5db38ec80d3b3712105d6a926337cd3c625dfdd706d7304f9946a6d815540671e55230a01c39d7ca853f4caa8825393a89876cdbfbccfe63a93f3ecce4a4bec1515b765b7aee8988e8774785cc18df362d9aab9ec596e825e9d269efa8389858f142ed4b01f862422b316f385e5205c47a2a19d77a569fc63d95e40dd870c8fd87758c03f2156776bb0bd7c076080e2ca187375da4f1c5d7986f231b1723d07f8c31561e76495d2d7e0d3276ed0ecaf5f1038e6b4ac4d05031e1ac05b1a0c2889dba70b07b499d1366d5696eb084115d17002839631235ad5536365666dc76061b49462e6724411513da426d706ac2d94c925c7390026f0aa52bbab023d3f854f923754343c44b102fd230847c6c7e33c1cafcb80b61b5303060df49096dd224ec0917c821c8218f3c9689d2dce4d359338e4061c9ad05f09487e145fee02e372d1c8d6441484a8466cba454c60b45693eb36493e14882f0075ec392b40f8fcd2ef7eacb7208d1543dff8c61e806ee04208f596d647df1c92f0d91151eacc2c3c63834934d09b73ea6d2ec9e97a8d696105c71031a4c8e934d399ebebb2576240e673d6c9ed36fbc604bcd2c123162096051a1345b992535d9bf015af4f6085aa662854dd28efcba599ba94459303c2e421de6b93edae2a2ff5bc5bf66b03c4719b3df82d4f6f3ec16a9df894e836953882c8ca2e8949e31ad17584255a1145d4f6f7d68bee4e3c2588022bc070618474128b7e29c6047610b1994d7dabeb713a07d868d047f471862c2c46e4ea7aee32bb41ca8ee72501f42a1ff82862237511671fb2a006deabda92925fba09e25829883a1ba19f2e7a38acbaaac4886da548ccac63f57a15323a454b0d6c15d1a42bc7975033b87236d53e7f404a869a78eb89a4443e176bdaf7c7ce501953043603d8ad17892d609636f889515d5465372041c9977634cdc3d3fde6e013163c05f5401f096a2a80403fa55b6427800329f1d72896445d80b218c191079a76859d2245ac4d4a1e8dfce89162c1590aab01e84ba3ecc961902d7f69e7c68e881958df474a410fc00b86f95b4ef4367ca50d018e9a6740ff19ec09929624c2b0ae195ef94f9fcb258143ca1c533c502d33693a3505e2e84d3369df647e1a871ecf7d61bdbd646e570b03710421a43a1b727bd47da66476b208fc5d494a9f569319f5a56b8817e7d53e16a2635e48c9edcf8dc65f828c2d92bbcc87fc5a2384874e5e12b69c5389b7d503abbbed981321c8b7328593a9cc1f20bc5fb5a2b92f4e365c73f57921a3263a0109851944ef996fc2e2f79e57a3a786f35a7cec2583be413b8931da98970703b2f539597940f0ca016a74c48753d53bae942f37cbf614bb8834eb09ad37c7311f449f3ef331ee6e9eff931a1db26ef98aed026ff4c8011e25a5960f8ebae9b45202ae2c0241222aff11fc04518563943edfa68d76171c648450c313d0542daec89daaad0ba62d3615dec018259d46bc5aca668288577ae4aa0ef9944f962fd04bb1d7624e0a85434937fa16526d2b8ccf4bac20425a33cec72dcc6278c99adab1682af7cb0e41a24d905dbff7eb01b32b986f932aee7c323da02115893fc758bdca7fa5203f7a376c4840b8369bdd2df9c220cc541f146629ad23025cfa26b984e330cd798295fe90744c06710498a3ef2ef3265fed393cce2b7615d050309feda65ec3a35a1250dcc7c4ad210695b2d4360047abd7140a5a0a7dd812b196a1bd6775152c45029e2ec4a60a3960b46439330f0f0f0f0f0f0f0fafa18d90da483b8424c8946412af76dceaa5197557a694a44c2909ce4c7cd91dbc8377206b6467c4a7934509620a2f0bae0a5d7e5612c6274e5153dbf75f7c99ac270eba2246549377299b979d38485121457b98fa87cc685891030c4e9c949c58150de7a6e3927480b189e395a9a559887532e66634ec03c806189a38ca8a8d980d977d3fb3a0616ba5071899385f040d3959ae4745048f031347ff0f95d4f9d550f382b9a0e15dbc1e1897388ce44a2d6ab63203862556ef5049c9468c8d2d6c201a364200a31296685132cf48b26994408b74564a066050e2145537cba5b1c352bc5cdb9916729cbe861a0d05018c491cf3d594f0eb1c592ff130004312a7494253df09bf60012312c7ebb3935a71439e3941e224d17dd734a8304a591fe8c2c6164b01188f38977ab9141bcd1a6a8e38570c32cfebaebb0bc068c4294951c24ca420b62dd6502bc133e29c737bc9da33b9db4c329108c058c4b1532e62aebad450db82b9d002bde315301471ba8d1199c9235c84bf869a3d0046224ee611d6efb4ad2815d650a311827f2faa0276efe7001888389d8eab4d51b5a4ff431ce732e5b4a410ca5490214e3232d585388dc65512d9bc2caef850020c429cc7fbd5a25ff6a6880ce26c4a95ce74997f477e8238e91eb30c9d6c6a9436e363c69a0046208e7bb2499a0a237e210910a7f0962b7cbdf504187f386a285331c1477e38e6899d2482b4eab7511f7a4d21649c58623e9c7e938ca92184d290e73d1c946ab694b35b627bd6c371d56f73fb8dd5ee9c8753ae1e4bf99f9d96331e4e4a4c7adde8fb1d0e26cf23e6fbbd9453b5c321e5dfdf87cc3721cf3a9c3425c85a1e8d913b4287b3e4891584a65c26229cc3514d5facd80be570c863b2f15a412be671389d929b3c83d01be4342c3e667c34e0238b2b262043468e40868c1cc1192dc080c329cfc45506cdb5f90d0799eb340b6de3a2bae1d89a215ab8943c93eada705229236224c9d870ca9d3196898fb469b6351cc534c5966c25415fa98653e65049684a0d49229386a34fbe0849de050dc78d9727d4522b5406912f609ce1a4a2654d5a3c821e13491c30cc70cc62faf462927b3ac31a38b8011f33ca68d88d77fe1aa9850518653858fe51f54ada94a9b5e0d8c20b2eb4e00206198ee329a72a5c87f69071f00df602c6180e7f62aaa1f67f23070db32386030081802186939688997b5bf14f4f6138650491a476392f520e86f39799a5ca5c3891375fc0f7626cbc709c9c6717f53798b0b50b8768f147438dc98593e8bbee8bb316df2d5b387ce5da57bf65fc9668e1e027f24bdbc6d6f62c9cf5ecc664ee35d98e20049b87808185638989b9d12ec913697485c386b9d18d642148535be16426c2a2ebec894bb80a07512526869b9d974d8563c917b1ab396137de291ccc23a920f39f94e0a714ceb3a243f66d46cd3289c2a9ed2bf67b8974aa7450387f5cf68d24d913ce9a4e5c879297c1f3aaa1368210d048fcc43000817201c8030c279c456ebab05d89fa736ac2416c92a0fde2c484a3c8b352a64e5d25f92fe1d4f9a54509afe81764251caa5dea92fa2609c749238259cea96d6f9170d098c9a13d312feae50887b8d6657e6aee7b538c70b62cdd8a672292e94a114ed935a5b89908a7fc9f5fd2f327e84a86703689e633daae57260ae17c29e5bf8a77eea7bd201cf2cf7dcfc87658de8070da5cb67719edc7de82f18363a5d04ce7235f77be0fce1b438ae297ed1e9cb252388d5ff72563cc8363b01a11379ba129da1d9c33e84a9baf411d1c57a4e60aab961c1c44be942ca892903d3d1c9ccdae94e685b234767900c60dce93fbf6349e12fb7fb2c1393628bb58a6279b08d5e02c26262692086d23453438e8502327cd058b1e9b191c4c48bc50fbb1517d95c12957b8f8ab92a6e1a23138a4175d1e322c3038e9c875994bd246d2ef05e753718236cffc1d4a5643ed3fe04fa39c0d182e384c90fdbba067bd645a708a184a4bac0a0c169c5636baa9b1f82acedb13fdadc4d37e47aa38056da6749b48d779e1541c2fcaa5f83b5fbb29898a7305f5216da2ef87aa9ce2a0fd4385983dc37655a6385b88ef97e2945c5e677c7d529c3e6f444831eae58d3e8a4310daa4968590b07d8ae2d473a272855852362ea138697c6658d0cf9431041407d9c917e26ec9698a9f38b6ada776c5ca1307d917f355c62a624c278e1e692b65ca262c9d8913e79131987c7b869f7e13c7b653ed12322f4df29a3828dbcc99bffefcf24c9c228e06adb334264e42b7a4a8fbf3258eeaa384c7697c4d3f5be218a2a9c6fa7d2b71d211bc4fc64a54b19712c7cc3e4bd72c67e9ce491c36485b0b0f91b4dc298953f76cdbeae4d2783312c7fe7feb519599549b90386493d72c299adc51e6238c71bdd61435c4116799a8a6f9da24a450234e715b6335dc6710f731e2acf5f2932af6a6642ee27c2a6b9226466b508b220e96367c75c66dec0f7441e33fe0e7b7f02eb80165481040224e6ad3b5e948a2174f0120e278eded1fe726b346c386af0704708883be3bb56fe32e7bb12df873e0a011822dbee862e6de6d744104608893c9092e12d444c9badae01268910c737c1181126891300034104021ce3722a620be4d1c1000218ea3b2355f3e6d947635d4f60b0d086010071d93d8a32c28791909e26476596fd35f6b6b62122080401cde4f6b4e9a98dd1702c431bd6bda7f478c1163fe70086ae36662b44831b37ec04d8f188d23210610401fcedfba26735c491dcbf3e1581d2ac96fd3b29efd1ecebea1a331d4480f47f58cab3659ed5d64f270d09c20ee93eb4d36888773ea46481627b488ebee703e4bc9648a9031400076386cd6e01f62d6e170fe9237f8a620b582e8702aad48e21374d94b7a0ea73c3a8345d68c31822c87d30615ae614a5ad4d7c4e17c21bd7e88d312f15b381cc4e4db7d6e1a794af28653b6a0f2a6fef90b3a74c329fba91877662405ef04d08663521f191776574c576c38dfa92ced21396428ade1985a1a5f456d2bef6a38c89455d1083a4cc8d370f22a7161d2e44d66a3e1b8c9f54cdbae2ed26738498e244c5614bda349663845331d7df9082aa4a90c272547f95f881e190ee2e96e1674dfe998c67032b913af6c92761b93188e3fc2e7c26e27ac98c270dc9798134524cded12180ec93c46fe6a9aec2b7de190cc36c52a8b1bcb7be198f6ce72a6b01db1efc2e9f287d6ddce85635a7ebfdcb61223dfc231f4e289bdaf2469d7c2b1769209d32ec15ccfc2512f95509bf6f6478485f388307243d63d5bbec2210565ca54257527e3b7c251ec5764d4f4ab704a3e9752cc57316b792a9c54843b9942c5464a7e0ac77fd1155dfd99d92485631212b4a4a047e1745b32560aebb17443e16c65bf296d2bcbc44f380611997d6eeabb66271c62ca96922aa937e128baefdfe3cf2d93ce84f3a5acaec154be84a36625b9a9527a4d952be1dc16a92d6782c8dc51128e495d1e19564aff8810120e4a49772bd1267e54d0114ef14f9b983416b48dc808e717597f76a992e91015e1a0f233fc6c564f9321221cc44faeaed62071ff1ec2b1d449185b11429fbc8570cc1511bd2d97874a76100e49e48c280d2daa5a03e198fe62ca67f95664fe07a7b2115142aeb5b4b00f0e31f65ac85992ced41e9c3de304ff92a4e62ccc83d35eccaf31e8f65215dec12924aa5a74938d90631de0e69dd9926c9c8353fede4ad413cfbc180767d3d02e226688088b6f701e716a84d8c7feff3638c98914fb746d4a3daac1416bfe081a432fa30805ceee88ace15c69a7bb2aab6380871a4e32c8903645a9f8999d86b356ecfd17ab4965ab071a0e9752241567458ee6ca190edf9b3526192fd89c40e161867368d5dc9b6cec3bcec16e6e20161ca011804c7894e170192e24b75a501f298107190e2a628839c278394af039bab031a390041e6338693c33a12ecc89597e080f319c427875c9f50ecd75ea834718cefbe11b638f96a825bb8307188e32774248485a499cec0ba7d899921eed227c4798070f2f9c7c6edf4f6daa281a77e12442bebd72176ddbe171e1a816a772b8445d93bb1b3cb6709e64316752764cc8a40f786881517726e45610ad520db5c32ff6230b067ca08b0ac890f1376c54a08e6bcce01a3364c8e01a886b201ade05dff0c8c2f1c2dba46c3fd6d02e6cd0489d8207168ebb9da9e773a4068f2b1ccfa2d987fd4912daf9dfe01a38f23dac70de517a825b280b7de11a6a9fc3c60868e0e01a6bc3a30a278b166a55256d64996aa871f1c50d1b5f88208f70e1410563c50d172cc409d6dfd0c20b4614784ce194f13766c8d3dbb2be865a073ca470f6f6fc92383ab9281c53c85d5b4f99fc1a34080f281c74ab558af9b58c372b203c9e70d26ba27d4a69dfd5fcece0e184b4a67cd59a1b6ec2a9feb4474e5ac634ca82060f261c7deb92cde45259c2d1e6eeeee2a8f48dbf124e69f9336ed0162fc4cb47c0cae0918473d8eba83799e812c25cf04042d9165696d99210c2820334bef038c2d1a22865ea2f55fcd53eb2608006687818e1e4ae775a64299965b72458708046043c8a70cca6e9de5e7d4484b986da0d1b39b4e872430239b448800c1939b4682c3840030b0f229ccc4559fb87b2865a0e2d1a6d011e43386484ab79d6c7f6a4861a8eefc2068d3209202db6b0400e2d1260c71e42d0fc4a7a88dd90e5e0f7e26fa404cc8f2087161af008c2c9455c0669ba94ae940081cdb8a523c2e307e7b858a6444c90114d7d70ea4865631543479d55a885f0e8c1317885cdb4298dd6bfca070f1e1c458548298968e789a03d78ece05c297aef621a5563af76e1a18363ca095d1792da13a99483535808b69947c490f7ff076e7ce0c647a040c00307a7f417b19bedf2d285183078dce058215cf4124b93c93362f0b0c121977a1ba5e25a265fbce05183939d67d22ef1afb839390f1a9cf2e7f4569c7c661bafa1863ef098c149b2564ada6acad662060e1e323824b1303b3289a7ab9a85b13678c4e0b8a3a44aaafc1be242dee00183f3da48ab7bff8ce0fe0b8ec9c243b3286d5d705cd3792d21befb7e6cf068c149988aa8070b8e96dfa352f3cc551ce75b540a4267658c93183a5471d8152192253fa93a261c07828e549c92baaca3dd465c4eab861a1769853b5071da3b15b4ac925788f31447dd202208ad2979a638681df9fa23161bfe183a4a71b64a67d71aee7e7559411b1da438785aadb9a9fa31e3c3d9c61626e0097c6471c5c7651c3a46714ac234e809a5f7249a5c8310d44087284edf554aa43d150ffb1ad0118a93d01052eb689712b382e220428a9133053159177fe298a4d68e4c2f71df27c6130793d1441aa5d23b434727cea3eba5cc57333e6d4e1c52457bbfd3e9173a36715c9fa0a26eae53e7996a02e1ae72298292944c9ce2c98adea544fec919828973f986f09a2e9e5c142f71ccb420b6b4feac65d01227a9418624966e256b0e2b71f6b1db1853282971f0bc987bcc3456d224d4b07c15492411644c1267d90d32450a264afcde489c246f87b975cdc8e822244eb1542825d72765b25f858e471c27c860fb95c29a94dc5b204717cfc55aa1c31127f5932d6b9730a9d0d18843981817b12fe95ff97114469c4b9518755731bf4dbd88f38a30314d3572225f6ca42e1c708a3889d1df52e9eddfb031a32311e7f7b1a0273376f13d441c421e6fcbcc7e9f3b15163a0e71feaa9535b9ab4a491be2984d988ab11e5a5a4b4ee828c4d144cce8a34f2f745236d2123a0871fe92c9f466bcc811d3a60b1d8338ee05d9aa624a759cd008e2fc69bad56f696b260ec47944ddb2bc895ee800c47936c5e7c858b5ec2b0a1d7f38cee54cea299b846e976fe428c1f998f191c3868d0afc1621b8f11148fc57dce022024af4d0e18793bb6f0a61a1324a56169021e306175ca009d27f77f4e1a077c44aca52a3454c7c38e5eaaa3c2aaadb947c0fe73c151725a63e514d8ee074e8e1a454acda18d5b4e593c9c3c957349366381b35193c9c2cc55b49bee81d0ea35637779ad468c60e47135a2d454cc973dfacc3b1728890820a173a1cacd298ba1435ef2599c371f625eba6b92829dadfb06159e890c349347acfeda91a11b538681b4995b5e90a0ee7bef7caa332416732bde11813c3669dd8a6abbc1b4e9b2f840e9544ca8a95c5151f34acb4e1a0445c1c13ba345a92b3e1bca7e74d677e0da7645a1b624a133fb71a8ea3446398c592b0164ac341c6c9a4d46caafc7ba3e1a8b5f9efdc64af8658061a0db3eb38c3215fa5d6241ab5ebc21d66385fcbc4149694f41172194e69c25ebf566234cc28a2830c47d98ed39ab7ddba3763386e88314ad26ec4702cefed48aa52674a360c873d8f6093cf7f33ad6038a972bf0caad42f1c278bcc90cf37355ad40be750936d215e94a851bbf0c5bbe9cdff92960d7470e1683ba6f59362082d972d9c3e4bac8a522a36c7440ba7140b136df375cf255938a94c1b84668d60e1209216e1e67e622c835738d68f0ccf542366295ae1ac312bdbac99f8e6b00aadf59ba4af8bab630dfdc8e20a2f70987650e1a041c6c6929762a59ec24934259ac8d923437b5238bfb589c94ba579f451385e6fcf5a5c9c95170a07bfb093dd5f31a0e30995bc0ca7a76571e38f191f3264e0c861630b1c5b870e279cb4c94b9bb4f5f2437c3a9a70b4131b359923d4cd4c388750692bae4974886509073fa54dac970a426e5009a7f0aa15dde49ea64ec2a926799bb0b5cc52de133a9070b40a2a4919113ec2d144662f17e1d6b1970930a1c308c730951d1a4246091d4538bfc66d536d9d6ff2255ce82082a2eff296502a47a476e818c241d89f9a51cb5359f7113a84702a51d33241565d7077c6474de063c64749e063c64761f131e3a322f031e3a3aef898f15110f898f1510ff898c0151f6ee808c2f154239dc58d191d403897a891652b412925b316f8985103073760cf0be6020d161ca0e1808e1f9c2fea294d2762941dbf865ae6a1c307e70849a208a01102c4bdc5169c6430eae8c151c279af5c467bdf041f021a38de6d74a1f7850464c8a881831b500307d7b8e28ad7e2461657c89071e365c868d74774f0007926b3e7b58c080e3a7670de903535368514db3f2db8d0e28a8f191f58d498f1376ce4b040123a74700c37a633ae26639e59430d87163264e0c0f137f2068d2d3870a4a02307075da5a9777295265836860e1c1c766c7d53c9480d35bb0b74dce0f81b36c38990a2e9d372a0c30687d45f15825c10bae1770570f1b1800a7cd8a0a306a7ab79b11629136dff1a6a67775774d0e014e76cd2bac6cd7eda7761c3ee011d33386b0cf18da7b5c64cc6043772acda62c1011a05e890c1e15bde42bc2077ee26171f5930e00301bec516cc850564c8409342470c4e4ac577f3957c04db0fa1d00183a35c9ee02ad9572ea88968e878c12158058d5177c1d0e18293340b218feecab030de163a5a707a11f194fe45cb2aedc70c1ad6c182a39c1c25f267f22f1f59306089e961c1011a00f8028c551c54e90d1af77fa523a98002ae00431567977c714b49f8df2ca9a15664c830978af3bb66d9d3a8da692d0dd6e3dfc507b4b0c01460a0e2706f2959b890358ba41463028c539c4ae8d3b9fc9772c85843ad468ed7c483618a8358962057a11cc113d6820b1b5d98600b1b13f85fc01e0e122c004629ce6f695a16b63552fc3880418a83dee58929a55c21867514a7b0cc25e36ce4964b860c18a238869cd877abc965e32b0618a1f0b7bb5e94bd4d8cd601800f304071f64ce51ae96e6d9ee826fc34e58815ceada5ee728cc7d90a062baa7098a0823e21226aa34e54384c904164a63f8563502337559221242197c2b966df4f5585f44a3272c18a289c548c94444b432a7d3e140eff2f1b54fa3671a57cc259c447c8b1d558fba1134efa679b2e29d56dc18a261c2f4553d2164bc4fa13138e998297ccb6ef124ed6ebebd737a3c4460907514b5d8ba6e2f7c30482154938f9a83497dda02a79e31c36b2f898f1b1c5169c45de07bad022878d11d0e080154838e64852d226c65757c88d1c6507818f191f96052b8e80bc4d61923c5beb3e19a19558df6649ab4a3615218db027aac1b4f29a88f0a9c81cfffb10b014639824b5617121741669e28f8290c30a20a0b343c6483d7957463f682c93d0923399423e20f9c93c57cb92e11e5821744e489c7097632b7890c64ca916e31d98214ce5e7629f90191d9865f36a5836d3a4cdc197ebfd4bce5f650907e88a2e9b221e129237289245d1fcddf669411b64ca6a2c5b9cdca15403448a4c7154478364d613aace5f53b5e70547206d8bfec28697e9c08a191c83e6bf785142a77721e01ce4bff898f1f131c30437fe0b0a7cccf8f898f1618287c0c78c8f1b6feb0573813cb04206479f24ab59b1ac54750678c15ca0e981153138e5dba6a99353e9fa0483b3241133e69674d22afc8253d4d37b199171c129939a4ada33a4056795e09af6da324c6756b0e05c95dafa2fb6600c5c0362ace2e0162b857c21aa388fe6f0dd48c137bc948a83e5d0dd8b7f1911a2a8387758f6b828d974c4f114e7bcdc90bf2bdece2586298eb6224348a737fe09efbd6c01314a71144d1935645d4c95f518a438583c4d5f27770d352f6cdc701a26b891634d70230b1932100e2db84029c418c529c689ea1bdf92ee21238a9354c97fdba74ef67f1fc408c5f96408bde312725c3441714a273625c8abb00a8b7ee2f026aec637a98c295c3c71d4786eebea75e2a445488b91edf5ca7e4e1cb45a8590f5bc4b6acc12626ce2f8397ace267c5cb818690009313471baff1131057595a26a35d4d6beb92d1347cd9c9adae12237885ae0b031014c9ca4a518df228d984a290e70c0071e0b193270c890610224e307312e71941417c9eab45eb610201b5b74d1420c4b9c5e53f6896c4159e8bc1287a4f26bf4ff579a184484189438bc858a2761ec7655d7102fcdee122f44964dd9db5da4b983189238ea8c0ec96f298798192312c749729bda967d279864c880c4c125e88a215974495a7cc429dcf574369bda6ff46f10bb2286238efa36226ca765dc383f2046234efb12b4bad268488d33e29054d7cf4e6e10255e193264c8b8e26306161ca0b182188b38c574ded9e75a3971451c459a49bf6497428e2811c92c1b53d64dea45c459f7729b88f425b2ca87385784bbb4d61ae2907db646e8370b71cc663f4ae556aab610421ca36b8fcefdcd6ca70de220ff82b03d75d9622909e26892d62456967511fa409c47ad2ccbdaa9f4a705c449ac2c25e50cdbadf20f0719b7fb46e8ceac4cf1c361a4e9510fb16261efc34154a40b3973c1e7267c3879a89d5851db12c37b38c4f63719412ef86ff470aa2c2a365c7526c42c0f07192c5f52722f3c1c4ec8d55032bc7e43bec3f9fd5cacc3e254cc163b9ca49d963e13ab21ed8828885187f3c92442a4905b0e2dbaf8020327884187a35a4811ba4a755fc498c3295b9814ad2968d3a395833331e28fc9ac89c36135f4c550a752de6882c3f9d2649c1426415ca76f38e8dc2842e978982c951b8e6159e5f52ae7662578ef420b19327060c1011a3662b481547fb59f25dbb3e13a39d714ee23e2a8d780ce1b512fd5809b927759624b8ca14b037ba2aebb64558c1442c339e389d8956d1a12c2831867386fd2faf6b33166388d58b2b44c7941db329cbd7a4ef7b48b418693c509b3fb4ceb91ff319c326ccae7edc9d3530c07292a3a9bc454743731c270c91d19fffd82c0f0755fd0a2440e7de1705daa4e466d6d1979e12483c964526643f75d3858760996b6612e9c4b56d0a095925851c9b185c36fbc9c1d3967656d2d1c34c657659066e1243be4868493c1c2219b4c7ff15ada4368ae701c931445bb4a2b9c53c2240daf334d2756e1e09e9b23a60952e11ceadb8450425febbd291c2d531022c97092c2612e5bcc33be21fdf63868c890f1ae5138255169a6bde1567d2c3840438b1850e075279ec60c91715f10f013987fddd029e9420b2e9cb06ea4788e269872ebad64aebc5b0d35e7af71966230a136537ea991d2ae1a6aec058e8db10445b25cd84dfab4a86aa8992087175c7c89c04716577c28002f957012b5385ddb2a42732909c790c91d235fada1a697430b2eb4d882468d1c5ebc27128e1ae6e4040bd1f6bb9d11e3088cca1075ad952086114e49aaa51da1496613a5229c4bfbb2e6d4d0203a12e194f46fec68fd8fb55c16c5630ce15426832ef5674ae64912c2796c4536cea659ca3d46104e624c9dde70eb225312100eb925a56d4a963295fe07071513e23f4146cb57f9e0f8223792a94bdb0aeac129a80b353b99761f2f0f4e4205953dc1de812a2ac4a09405d9a0cc1ec4d0c121aa08a11b536e9dd4e7e0a0369a5f62353838c88f535142ba32d10d4e13641257f56dbfabcb0c62d8e098c2ed051339474fd663d4e03896d2abef5757d2eaff16b0183438869aa03317f2dd583e83f37f7a8599d930aa443238f7c4519df2a3189c6265b598a59c21d5078363bafd8c4187fc82b3a49c7f12f33c56171c7305bd0dca92dbbf18a305879467d258b0a83b293158704cd617f4428fab385f5a50a32396103231aa38994bb4794915e2f24ec549e84e102b7751711425ba6d3dd7531c92eabdad8b144648d21407152f987b04ddfa3296e2d421329c503d8d8da22f48710ed3e2f59142f56946719e1421a5944b76a31d8ae2d8be3e7b21188a83525aedcba4a4a83683e22cf2a33a8229adf43e7152a546a45bb798ac7bc0c313c7922b32da27892d912443864727ce73c9de4e2d7325536ec1818386a1771b33b6e0b080c9bfa1587080c6013c38711217597d3345ddb0f526ce21642a1322ef85cc4e13e70c97a99d1f7ea5f732038f4c9c73b643fb2893e4b261e274327d9a9a578b9fb14b1c8498d3741e9aa747b3c4c1629e8d10a3335656e2e027bfb3976a76bb428943ae8ae152cda5332771debcbc41a9fcd520a287240eeb23aaffe2898a9d08de02eb118993122aab48d09b279ebc0c078e4708015e70040c24ce27216e3293652535a8863ee22442a83d11edb327a478510f479c32c4525518690d35921e8d382459618410f71edee6178c38c637136abccee543a7c1c5223a194a735393dfa988c365f4892198897b7ef87ec523111e88f03844d225ba991296459521630b8e36c4c9beb54d89101f29a385385e85cc5952b110e24888639824bcfc358338243913122fe404e111886390674282d99aec9e64f131e3e3021f13b8e2c3031007a1920c1593429031d713b8e2c3e30f7bdd5c4d1c597aaf871f0c42344e6ee632a5217d386528b770fa848548c0830f8d5051cde343c5bcd2630fb5c5a66fd7b518f5f0f7c99341847b9ba0ba3ca86615453777c6743df0708773a6747131da7ec898d750b304dc35c0c30e87eb133da24397a60d9a79d4e1945962da925bdf6d7e036c6421434609be068d0f2f5f7cec171f5dbe3014f0a0c37934a9d89325c489f8e7707851a144c4fcad92457238ce56f28b5113a75e138783ba4ade251a389c9418cb15f632c92df30d6713f23fd7117465d60d4791a15e6445ecbfd886f3a548bb0c3961ae2b6c388f684cba1d0a402040160e415e99a639b99a82b0700cd771d715bac2b9f572c83c42d2c58d158e26729e17db646ab50aa7b0ed12a236d829930a27911dba3189f3b6e44de1a0c4f7ede6eea4706acfb01941478418bb289c35b3e35fddf3f20405c3bd65fab553aa80004f38069df6db97bb36424e385d50beaaf15fc1454d385f703f3713a6d2cc4c3858252fbfd494216596706e3b0b2a5b259c82da7e8a3cbbcc3409a7eaac4d966e4b7d24a82641e9d095239cf2f547a6a0b32d4233c231ae9588cc6317f4b2221834668f20e26ac95c0d9df171e80e4873040188702e65f2bc4f96943d0de1341733a6a4bd422a5f08af768c5b8a93fa17c681800facddc8e105003e4180201c5c82d0d29c03e1242385c6ae491235f483936aff9514969b2eea8383a59862a788580f0e26d42f2d24a931e5a9061008c083d3e40b937d839b66f67770d24ca52bf2d4c129fae4d199effcd4f939385e586568e91399e3e3e05c314c6676c4a99e6e7032e996c93d34e9736d708829a5d998b306c7e0ef63c2d2ca29d16970de90296d082f99c171aef24de58564700ce2cc542add8ce4770c4e33c15e4d3dd4a86cc3e014847cdea697186212bfe019cb681155171cd3c9184959d80a13710b4e21a99ee50b255ae44b00169c3cf4bfa664372f395dc551eb6c738b4aad13a48af328a5952b4890396fa6e26076797276acc7c9a0e2ac3549659fe40b1a2da738f8a9d5202aa864fa35c531e4b90ddfaf77df95e2f4e223c9b25f525e8414c714b3289594b8b875ba519c2f8e4db83ca7c25213c531838f8c1cdf97b22514279710e3a8b2d92fab7c3000501c53fcb9ddbad9a429f989c3cc89c8eabfe0f0c4412911da3aecc47964636269881387499b33ab6bd2268e3116dd6c8297c865d2c43944367d260ed252c8a1b4d4d3d7c7c4295bf5fe7a84a462f99738467ad5baf491f42d6f89e397cbfad76f48d2f295388574ddf4912a74da4e89d36a6668ff2ac99bf4499c75476e5b3049e29c67f2b52f7d479e237112ffaebefc69c15b481ca45e67987871b2d4479c524cbe7f964bb78638e268da726ea5a1469cece47a8c568811e74b2e2792d266a46911871141fc3745844c157152639ba75e464f851271b4145126376bfbdf883804a16d95bece62ca218e1e4a29b56d9762c418e264329e5ac9de18922bc4795344e267d68468b3f2b7e48df020ce2229bb4bd68d200e26834fdeefd21c6913889334bbdcca7db27b630071526a7f6232b4655ecd1f4e2b1629ac23dccec4f8e19c973ee22d8dcadf993e1caf47c9598d193e1c920a773a520ced73dac3e9e2cba58c889239e9e17c152cee324c65caf370d26ed75a4153cc20e3e13c399455d2a941c8f70e87fc954296e9d72ceedae1a4a96eb4869716ab6c1d0e5f363f2b527fe2b77438c87c5149c8a614e4b673384d5ab5bc5e4185d5e57092225267d8e3704a09a32496b0701b048783c5b49c60296648e1371ce4a89ecaa152248dbae17cb3d1e2ccd4361c368892bdc8291b4eb729fca436f96791359c4289ac985d8494b654c3419205e16e266641290dc7389564aa90454fdad170d0204744b6cb1bfe198e1a93069933c80ca748226f440d97321ced5bd5c42493a021850ca79b5197936d545aaa8ce12443aa09975511c3a96e75b229f195d387e1b0de953ed297901243c07010137db38e26d538c9170e9b4d9fca9ab4a0712f1c564f34a4959c97f22e9cb27c5e5e621c59e2c2a944e5d37095a2e9164e5669639f58c654222d1c4cb575690b65e120367be44dcd9a62838573678998d0e9150e7bfa2c8ce8c90ac7b4aba65c92a5881856e16476a5e57ba7c2b94e538a20eb6ac6bc291c2f69dfa0662eea962785d38b56ac13b9454cc845e11893aae8fed17faf43e1d4611631abeb89193de1f01abc9234d79c70526f1617f97337566bc221c811f55a1582e88931e1781a6b6aa4664b38dacde8987c9b21f94a3879cac9b4add134879270d2376d5947e9503946c2a9ae45ee7fe9bbdaea08a74c9b67dd2229a9a76484d3a9dd0ab2952fc2513769d8b86fb1c974221cc2c60c2afbe843388f7b5e9cc916a42809e19482124994d21873ce0ec22989346a379899be080807eb114189b7fc83c3a5a0525710611f9cd4de98fbc6104facdb8343da1d4d69920c994cc283e3fe8b1255896695d31d9c2fbb05e556afdd1ad1c149b3e9db789a8c859883735eec1273a15e41e97070109ff9332a96f7896f70b25ac91b577923656483836a3999746e08ea25050803a8c131ca84582ddaf49f667a30001a9caa2da56ce608a536333805e9116287a4cddc1a13062083535a4b2204a59268cd1f8393081f95545c8d1b71048383c85b6d4abd864818c00b0e2944e508a7368d3ea501b8e018d297efc5ac2e3ffa01b4e0245a46680b25739ff807c08283accad817b2056deeafe260dd9f5695aee5d657c5612d8638499e9e8a734bf6cd27c442ec1242c5d994882849524abc1d9de2a472e694cda4442e1999e2a02fc6596f9858dda0521c75efce4b868b902722c5694c3cc382d6a3389ff6bfa64ebafb0d8be258bb69577ef396f04c284e722932ed7f5d88a605c5c17bd29a94249276de4f9c3647ac58c5522966eb89a35766171311edc4a94aebee5bb48e9c1327ad4a9be426b334a74d9c6293aa8ca01ac5d4c4f9ea4e85b03a13e79ea44a88de0d268eb1c9b37fc3bcc4c9747556e957ca362a9638843121d66a1b73a4a512a7d8582584aef85fb050e2742a448c91567754582671fe535632c8587e32552471d80c32a61c3e89c471efcae2ce4e927b219038a890252fb2f65b04e1234e99f735ea255a36253ae274f325e35509f11bb11107f5d297cf0e19719898912ac435d7b42ee2b4692e481d2b8dd9a288c3e6492a89dd505edd25e26c1da9cbc3bd235881885312baed7f54e910c7cc193f21a5185eb5210ea3db5204b529c4b9f2f859725115527b429c5236df19d56c7ab23d8884faae6c29fe268873462da5ad0cc449fa5fec05b990646e0171ba517f3f937e3df2fdc3796382fc16137b2ac90fa72e8b5f2797a52a53fa708c90d344d67d496b1a1f4e31294c8934f98bfd1e4e32da9908229e157a30f8846427538a4fbaf3d05c690916c6c594783095bcd1bd133695ee70d438579bbcb42aea6f07d484cc2eab212eaac3e14fd296ccc576a90c1dcc942b2e748e733849ebbb9231c44e14570e9ed8eb3d91b1445ec88a381c937785d0a52386a42afb2d9a6f7c0e071831580187c377b756924fd3ccf00d27b1759af46a379cdde6a46ff08c3b596bc3f9f26a99904165c34149ee95604ab3dd660da7245d8266d1b170991a4ea1213c84b62babd2a4e19032882bddb04f8d2d1a8e7ea78450e7259489cf705095d23fb2ddd8298f0a5698e1147a2d7268e6489d4ac18a321c279fde88c41039494c8683256951824b8a79cf8ce1dcdf33326917b14c59311c47f9a8287b1b5632250ce7de8f1d93ba11f3236038c88b3b721e4ad5462e0a567ce1142cb8c698345e38a6ccb10c415e10aa7117ce7726df72da890bc70b15dfcf50a3216fe1a441997a8bae9c31532d1c25baa81865c45cc4250b674b9aea279c25cbea62e1b47d4246d35a5de1048a7da8c4ed0503c248241487030251201406a071a600631408001828248d0663f1681c46c21f1400035532263a322c161a1c12121410108a03c14010100c8bc26040281408050220a158708c23d1f007847dba4834dd96206082be846a04161d2c8fef3dbd4d033507082790a38c201019fef948e867f8499c3f26e558eea95539d24fc7d646c27e09d412983661790432923c2dc12a024e850d2673165f2884998441ca06190047fd3e798a239f72f9f7e44734056563b43db2cd2ca1d65799e832ee56eefb4901ece6af072484753162ea4e3147c2ef08c246980ff51b5d6d9d6c4590822ce9d9192dfd596f70c2c4b8de089751e7d76d1725858f9e53bd4a87e8e83c74d7b637f35fdc01368c6eca77aa4907de187491437042e909ff36c2e6c98d989d7ed5506ff6dddbefb6ab3902f11a283cea273011187940a3e012085e70f6910592088817810c4a5ded280e6c817959e158a0594045c08081e2d5fbf683dd2027201d9060004a90c5c03e41e4018405e009e002670164030725c84c4980ebe1caf780c0d73f9d0eaa78506320764f6b1217609220379f890db420d715a61ea08c011640b93d0d29854d2f80820016007a80770013007d1ec00e3b39b9611bf8310061a06080e005305221f98228035619ccc5686cc0d202bc0a2a0d1c0b102af867203903984e208ddd2100e6539e178b4080c0b0df682e178017400168073801c8af006a8e1d7676e200eb03b6075a0d9034c027400370012005f82920290357b6bc3794e1027a03ec0720cf0086dbfa08c7151018b08379770e40168012107fe0b940aa0b3005b2cb573503c2081fd88f011400f6660050adc690843920bf401d00da00b203a008ac1240293809032d9153420536000a0318e39cac6f36065a3c826ada004d1b10188052407501e000f9007003d00d204c40d8dd59ea15809f00af47c015d5fd2f8b06681db032908a00a69c00a4af118f25373790a37818cdc7a4db03f320f97107c2e22349434eb044873acc1fef47da7dddcb83e041711e84920360e1ecb1ec81301fa7aa41d83069b01181deead7cc0fef3cd6e7d0092f6090d3f27e375b01cb2c4ce6c5486bdb8d91757d1f98253014b6360135714da0521cc08adec6a3b6d9a0c0a480a758a310a4687314bd918ebfac90a24f214d814c318cc2cc2bfe94be27535a14fa32ae59583686081e60a56ef64284fe4b3e7114bd6124f36623052385491180628722bb293c4ed94c9d9bc241814e114241ab28fe24190b9dc28ae40b458b83a6108dd7ccdfd428fac206bcf81b714f9f7c013914316d133d243feb214d4249089089081c060c4b09904f68e5d0089ab9fab945254087809862ad68e06f84ea8b5e75db2aed8310609b36c965b5a3b8beaeafa9e46024863d7bd88517329ff0534a80ae81a8616900e3fcc10990ac16e42003167837d3b2b21f2c4f42d9b5510477682942e3d5b0e5068d0973d70b38bb82c0924408fffae4c0c5b064ef78174bf2013a9528783fed9b110033d7193e6d1b6584eb72f7892b7111f551c1155aebd8c478c0b7d3bfbca8bb6e7e05f38a2f8cb1178ead0878891d7911f212a11db3d2c433270e6a976b2f5e615e30818ff4acc2646a3f0d7f9b16e75078502a2857140a5058e2f5e306e162ceb5d3d9a491e58c10fc8b2196b607601d8fe4a5d1eeaa113a1bce2501a49fc43ab0900a02405c708c76dc9e5e0a01aff92e56f46224899fb5408942609a9fae403708428311b6efe48b31c573c6e3e41e1b1c474f19774b18bfe2d4a462106a0e0d7c20c4d9cfa1fd5327d52bf1a52459253c71ec75db710cd31103884cb7080b13bbe5a5914d73a3d3768b7b489607bc47008b377c918c2496b778e9357516d720ada64e11f3f15b1c9ce923cbca1a0c4a83a60111113f72a55c9ae98aaec73137a5975c15c6fec86b0354371f3074a5e73b8c5968b8304bb14d841abd6b933b5c545d5e9b4d67083836d94cf932f8acdd72b9ee77dce37c27d980eb040c3bb3c3565ad2a20e207e49fccc9fb862b26385750d82e857461f06e4043f039cd1424c8fcba17408132a369ced90c25eae8b1c95730b7e6348b2b100da71dfaca0d19593cca72380eadf381bfce80e76eba1378c8594cb0a4714de6d5a5e6cc464e3c4fe0375844508a5b2e1cc91d395b4c2ed2c9a911f939fe5498827932983fd9c3ed86a90805def7426caa232b4b4a5d1f7e9ccc63b33bbe15377cb047a3b74fde2a7df74e6b36f9a069803ae439cb65b5af50b3c62d8a557e33a9c0772fbccd4b2f80135e4ddca2cba8c256c431451e6ccb1f8bcc56deb6fab1bdcd6dfed006907bad0d26cd0f799bc0b27b6746d31d7b422accd7f288ca13897f15aa628e9e430832d16b4c4472d9101b6975de840b35cc7ad8c22ec43862b061bbbccc4c34de4062b431e9f223d9de6f80c7a244a5d0a1a9a58197c1bb401302417bb46a30b267c71e76388ec274be8d5a316a420384c34eb5a881197e004d44704b27af5f6d2700da618a4701b63eac61594ce4a4ff3020771cacf0602522e5a5cd5bf7b18efc4e4fd42135d8383b62835aef13320d121c82f1630f0da01c84588caf3090e1171a70e02637324be16e1457bb8c88a81f7825c71fec462c0f1b900385a3219c4af3722c9f8efa2b55edab2b29688ccc0ebcda887229a3a7ce0592e760c4f0c9360621a0a8b6f7131835db947f4004095f86b87c326d054e10a54f608ed3993eef43e169baf188b2fe4f3ac02cb10ce350ae06e8ea2e4169ae5b506ab3a21a298f2058467a9601c206951fc9b035513cb51d33e96e24f2af51e8e250e4061ad00f2dcc858f7a3b838e6d01cc16c21b80ba6f3db58c1baf9967796d0582bf83b3d930b70286c9e063aeb8362ca57c01c196dcdc2cda5f347f83c8cb8e527c81196c95cc69d8dcc9a6675635b6e21b8d1b64bbeddb84c8e75388e24a801b20eccd97c3b4bb7042c14a43a7e6200606c73dc2809571c0021ab0a14a8b9817a9dea734ea58bda00939224537589acccd48630f73c7cfc28ed1ad8b82aeebe01c76c7269907f22173bcb3af6a4fae7c46ac5049ad8a7fd2a5659443b9a6bcf6fc2cd202c28cefa0cb615e15720e36bd7068f31d95b5251dde77cd29ec5626e9e68332d9b087c2e2d19aeccd6a2a2590cef301802e2361b6392f8304400614da68014ec4de0f4050e7d93c630bf4803e3a10dc6743d83e539b92c32f3c2a2b078a37afbae9568b0f4ce6380a8e732b822b98ea928778ecfe1d57a69dd985e69f508c67bca385f979a1ac215f2ffa2f437a04a7f74180de147b3f0dc82316091e7c40e967b241f8c0c28a857b9d7b118c99742802a3d497b3f342e4b3f6df239509e454b20efc898a4a614b54b085d2ad23518a203495a03c32092973ea1a037c2917400cd783c8ef879bb6c9d8577d2035002ce311039c6639e4e511387ec51470327021d0e4f772299b1da8383e7f6f2cf5f7b8459311449b210a311f0dc261c1c895b86c45bec40dd3bacb812537d4b31dfda5bef7fd427e760fcc86c5a3bc8c65f43d885b733cabc220f25e754e3977201858ee70caf024d4145b320fa82d6bfd8193f64aa0d112de4883e13c247fd7171f1046a37ef28d23d699511b636dc624e6e65730025598ea825bf3afae4bc0f8ac502da330ba139abbf1349dbb1b42a49eb590ebc07906401af02cbc8cca9f7ec2a24fce99880549003480a060a1098d04e2cc9a5e423428fe4abab24d319115ec3ffdf5b75e35455865655ed6ec4b734f463f3360d36bfff312715e8926bfc05d89099103bfc2c838ce483a1f179a95671106bf4c0e53331c5d0683ecb7e04879399c0ecedae27636a9130817f930f12dff03256cc3e750cc4e519143fd7e5050d611756e74dd0a4a7754ee03100abe2f71b5a9c7bd697609eba2362ca194cae3fa9781ca1254bfcd0897bca290045fe77e0d359d6289f61fc7d9d020e0065697c86701e6eab925d9c5821e3bb8d98e90ac9217df0f155aa3069cb91b17264d481b55e2f774330716bdc3f9b0c4497e7a5b3640667dc80cb349dac06636116ec1945d09a2bcb83fea8ad042a168ca7432fa6d0ec72299e382d0911113d9e3956046e7f79f232929e8a7393da1d5de568e845893cf51b3a3813eccd2276d491fb57b8aa909bd5e60f2dcdf34582331c43080b6affabe0beb78466d199e64159524a54448ef5d966c67cff52b47d0508d1c6e15f18b21da0ad1a505197ebd119e255ae9795b8e535156ef8670d1b177f9145dd3d457a0f833ae130f1c8fab9d3962b463d2fcecf29d8a390caeb6883b995275215dda32e7b748600b997aee62c8000bad3267ee0084f16b4e11278f447d6def22098153df517143d192d12cab0697e72a0f5b6f5a4a46db399c6424681fb080a92c27e2c870eb2f00d5b605e125aa3d41da28940042d6c783742f04a80ef7dd2eaeefa88422f6ff968a757d28480805ed0f6ca7a0a8f4cf12c4b083dfda03e46b96a5fa1b511ff5fe6a00265a6306f762a66490f38f5bc819977b8e387bd33dffe48aec2fdbb869275e9ce25f32965e6d07a68bb654d088e60de38e1f4f760c45524adf2eb2ffe279b1be2c0ab614fce0995ddb4f1e66f4be2127778df03640332d92fb2599712bd960ec04eb1014264e10f1a3b4d6611a2a3a6b238848f872491e40533d8a5c01b5bb8b99580fab7c6aaccf989f43356ee4bb82ad5cb4454dd466a74adae9010ad994f187cee4ab15660e027cfedfef1dfe7fdf034d4953c61aee9ff7c5a36739034fd7f6991864aef9c2d2ca16074b7e989c29e7046c04757444d3f86f4ea42954814d690f45b06deb962b6e1f8b5b26ba819350e3a4b36588910ca01541061295303769a195d7a0d4ba4379ccc61f31199b82909cf516a62e2f0f6ed7b48f9d232b1fd70bddc36520eaed8116b509920666a0d72b917c74b5fece793c949f3a8628e117bfc40fee3ce4114259870cd6436f049cc8e44c2963897f92f01839c98f7029d0ae5b9a908f00de3ebe885f23bb341cd1e118a0881d664a67439a8be538a269cd0e9ee0db247db7a330107a58cf2bacac673a0c1923cdb4e9efc06d5e216d7e8bc95a29414155ee49ff1b8b33f4b4bfca16cc3d4914082c9506af6a28bc373ccb2b37bc4cd0d231a7453288556a8aff5efcfa173b289c2d6b48a7e7b879430147401704491126222029f938e30b142b249eb40588ef4b8c2e558869b2b96d7f3d103b4bd547d6f151ffd37cd47a7d945c8484bf150ccb32d300f69d9c8105e362e0125bf1267a00adcf5fcf954c6e106e5c8125f63a7f6170f812b4c8de7e3fd9135ab6aa2703eae49e00c28471f0c54212ad72ca98a71f16ec4e03e269049021a07b202faaa7f78776407e0c13db436266c3591787329c01cd8fe59b3f319021e28be96e5db126e1127c7407dc47250b2f4661fd723d46d6b0b7864d889c3965f6bc8b3b0ed65a59515c6b7e0364c4e117bbfde2c7ca977dc9163643c9d66cc836d1ffbacc5eb398b1df47223b1164e89c9e33ab33a14d58becdd4d7bd6252190b8bfbd6ab7b66322028b2cc56c18f7646bb77266edfeb2d3629842cde9dc980ddc0fd55512dc5acaea0e9b4be0e8610f3f1d789f0b770872e7f2e0b12d1817aebc7fe3bba51dbd7c7cb489e598aabb13716e36fceb055796a42c88d9e00809861b6540dfd236f20a98d89c46a46abe711efb11177e7b75eb5cd24647ef85799b8b4814e583b85436f2e037f4b565054e2b6cb5b29b1ba8627e8ee5963b02a4b9425b0d94be6c15548125aabb8613ffe533f12ceca01301bf89bb1adec531bc610bad9a8e9c8b546a1949faaf29926302b59804343c4bde249aecdbb029f09ac7167c7472c02116d33f43036aab075937bb742412192b8fde2200920f8e91a859c6cffd4a510b2c4b4971e59d049ed492496bcc0b72dec80593c7a2d40cd4644a04c54f77cc484a32a864e436262cc189ac4466f77252016332af23cc2bf3fc32623612cc52e1502ee3f96f28b77be49ec0cda786874503d87f0911c478d33cb67c02a3841b1fe0bce80cde7454a4b5d0e1126060079f27a2fb05d55ef5b183d45bb2ed015f4083dc4457cb4c698fc2625aadf46db28c21cc6261b33182ba99ceea5189c6c576855bc7ae015164b50c1b1da74e15d05bb2c32248202bc1290b79cf033d713110f46ca252818cc91e09295cffc5251bb94659143e981b0677761e64d25463189249b9c150397412832de2d70a5cb9b294681c54a1380395fcc9be04790a741ea01a12f87a3b5a1afa9f307a94a08fa04a2563bce9dc540a406ab760e0029138659c76278248408ea6f656260e09639e103895ebb2152b1cf929b67addc50fc22b56002a65ec74eb9c4e5578ed1444570f4e0826473683380cb80258edd9cccc07cbe9e3693003f308bdce46a1da3cef4239d068bc26eeb3cd5d1a6107cb30e10ecca731116e0918d8b6aac15c25c2b96fc394d98ec16ca3cf48a15d5a88a437ec14b5aa76d57b0ef02a47ac8ec40d1d0be1d5d130510122257e4cec22119f009348ac679e3943034902b7965cf70d56d9ee7080aeab50d03fc04156d248b548daaa26049b94ede1f53c06bd4a235071eebc4751ef46e757b424d3732cfb087322936bc1fd5db9fc13769e8d2baece84cbae55505db0f410bcf8fea91b4ce0e094060280ad7abae2746330850d544c2f46f4c9a045bdc444103aa41102ba31acc6704fd6546ac0b707c5abdb82155f8cbc479b59aeb53b47a92a6a518399be85f8eb518c94b76ebf4756ca342a03ed9502e60227c02720ddf715d3f27d849c8fa510740cb32ec2a767d57cc7b21bd7f9e9ca78212acf2eaa9e31b3b808f043f6f42b47309fb21dbd87955122ed90b310e62c946a9632a53fb1f9bc2f7e4c10bac40e31f87f1ee1d1ccb39555092e1ff82ae164c60baf30533f77d13066f0ad4439ec5ade2d5e990109add165a455d365251be84b72a9c214a2aa90f7eb09883988c5143decd144498089abfba8d9a15c2fb0d6c1693294d902b99d08b3529fb0723c727fd89e36c47705514b486ee7ab68c4d0945951d2e10b198ccde3f6a276ed8f1dad814f1b1d6a8e3c0f7a0b19bb744de09eb9406d48d319a1c6e70fe6e0df1e041834617dcd49f80fc2ce23835b4f06956e25ea99ae2518c6fbaa80514451968447ec4a6a1e9cc93ea9c22391aa5ea3a2d16537313303adee96fa0f573851ebde45c1aea8bb285e4657e8e1297afd80912feac10eabac22a3c3291c80f6478a08a1a2892258af75ea3ba8c50b70a98f3d9c64adf6a2632471176e99e7e68e5a6aafb7bd354097b7e942a86df34a3ac4fbd28d1625b1844991a6dd3ccda080ce04090ebea9911851987cc5bef050bbace747ec36c661cd29e1a11df12aadeaf8a397b1baaa480122cd202c6252713345996e646ec354837a98d462b53076433aca6c3fe5a6753b365e8cc85de0f22d0459271ea7734a6fea0af6b898e39587c6a2acacecc0c8231e978407a728f95bfe6c3c29e7049570d05d6cba1aa295b471b59361233ce86ed08fbc9bebcc852173931cce92c81cab80a1c0fbb67c654d39be57f2eef1d6f6fd2eba2f7f5cdc72800db38451d02c835675cb2ae7440518d28b8a32594822945c66a21afc47a1443299b7500c9ecea5bf4b971ea7ef17c000cda4bb316e6697e11ac58c69b032c673cbc7044111769a04db4dbad48e2cd145de2bd3a8dd0ce316c3b8d4554586f7210557862acfb745aa2e8c1029b28973d19742e40cc66293430f44d8cb026c4b0b8192af1eb08d256365922320521296b82239e8966969921e1b1268dcb8726d0d4b92ddd3ec79fa97081b705ca6b7117d533a2c87955f43df43551854cd8b7b69b40506070758d5a06471d1f2291c8af9f36de2580c5e7bee539130cd586b36c8338e85c44057e5607a9dc1f906188002124c0a19fbd4c98ab47b8d88efe4814dbae56812352fe145d3e2811c0c3aad7014309eb8cde3bb1ef7267f65152ae1903ba7d1a5144b550437692ed2232dd48dde0964d8d452fdc6f8e34889b7738712f094d8d1dc00180524ed83c1d7c10a8451e24863fba259a16b1c0b3db04992053df73f2a9a97eeadb0d076f7dd6d9da08367420de842d0b48691a0640799898ff42ad53aa187f974468e73513c33e7a34e267bbcfebe7fbd2fe632eee660b1f716724a792b1b0416ae17f3ff7ed3bd6f5d19b280a646ddcf313ade2732ed59a1e4ab8b059cd955da2331ca8d57802c973761b1c79f9bceec5fc67750a9c93025f4a0906a534c09a3bd9154f2855cf677d2601bf82ec9c8a16340bcd8f7b9419daec67a58a9a04957283d62ed69a686e13ad78b1b032484e19251d53473178ed42bb8a88af1677efaef4416da218070af16d9e56cb7e2dd282c15593d813808bb39e42aa96ccc482f7a27b6fab1553c861bbdb12bd47aec90e0ae70c511e642dc48952c568603f9aae414f95d3f2d9fdfedd7ce651a38b45baf5e880d8db75867f6da2f3185d7ce39af99e2fbac6470ff1227f3720042f116f6733dc87a6f0a6e5b65703d72e997f87dd8126d1469f6eb344de11edfb7c25f35645c0acf0c1bf52fd4e09a3b1725cf44a79a9092031357983e514649e22e092aa252dc52be91098e4fc5742310be83650a4a81f108d9c2b2853a4f6787019ae68c47f9f046c453034efb04d2e527c41febe11c3fc16113d4a7ee87a6ded5c850e3e2154c6e528a3684c6a7c067fb6e237a53901a51c1dc89c4ecabe61279acc4bdf803a6206c3995710787c72462520e092312ca11978e213441b0b63e4e085631102cddfe368a85073e702181f4185df956db3dd8cbf1ed165ea727b48af87b017d12a2d35c8a73909a85f0ef89bbf56300b4bab2c43915fe38c1be2f476da46ee2b3e5e38ca76fdacc452d73e6bbafa9acd2fc3fc582c602356309ed6e2cff8f5547d83585cb352c751320959ad30c9e68a5c136a14ca79d59203480a93d6d0fd3ac9ef08cfad2eb6a9fbea599f33e1cec7494630ecc65094a96e46c69912f82d3f5db53c593a307f9ef2fc3c54ae2c7e344b86d2e6774d1fe974f97b6953a0da23c0c5adafcae24ba5b464711d88b8045d1af283c6c24aea6480bb0801e354d6b726d86a1588f48c7f1d6bdf08a5d489dd7b3a219b4978cd3bc654a0effaf58093438e1941965d30a6058268e414754df51ec90600c7313dae79f71627f4c44e10a6e69a053c27635258e72a93785b1a2a7a082b0a0d430e81f878081c1403e90b12035d53feb7c1a7f5f2a4e4f28a5508932d3ab5ca9659c0e8bdb7f0f511a4ba8ac40aafbd01f955e6b7e157e10eb643ccd9f1adda37232f10d2183d8f985e8a0326f034e4bdbe9443c0279670772a6d0ae4afa75ee0a852def06a68ceb40c42896749d813a7fe85334321f1c866b7bd8af0fcdea68401de51efdc67c4e24449733285b6b3e15ceffd40d2adacd187e3731966f6c412985d2408cd506de469a41933fb6a42bb7bb0ded8c6763a0e17e8c39c8cb711cf8d87aa4831cf15f796105ef37252957fccc44294d51b9c55ff2ac418707b7007bb75b64e91879ac8ffda2c75409ce485b65e02720d511c7342eb8820a71660b14c176850ef1e7495b52847814a8c3d1ce08e2d371553c739bd9cdf37d8f5b9b90c64215aade6ae35bc356b1e90a88af86224cfa911d01021915bde3b32209a31be6c19267287265a99202307331f32bda84cd934dc0ac0e0e607dc601ce31fecba873f2d66ee0fcc266f64b6982da82d35b466ec1231cba558e0525ee530a774ac15e3272a5515d0bd4a4e4f449e9af09c5b8a39292eb29a97f258bb925b1713cc179681e1f7df34db90d4e609fb39843c73282a0f0ec0a4fbde6818e1ed6f1a01fcf98f0d03be5a142693f62a52d9d87aa5e179aa36ccfccfc1e09e88b0bcd12e682713a12478d59185a8e779f86491f6574e58c2b9733638a3bd1942f94ad945dca9d65b99cdf3d47458179451988f24a9988725f4172b51184d37624d5f1afab60d16ccd05bfa32f3df26fbd433ffe5bfe64f7283b12602f189f8e448f5f8b4b8ba7c3ab85637d8650300911e92433a96b65f5c96605e81ad7c83b5aec227ab118b4b8eb889dd8d384e26e644d442d5a03d13a88dd7a23a6857251f11e3b4393e233474f8d5ccb8c660d264c730693e698ceace447cd8b571e6a341d86e9b8c04a0ce97121621e86113340be8627168660f092af8a05bb7e0be3afc49f91d02d4cdf82eb2da8cf42315a706ba1bab8305a546f638ec185dc60b09f0bd292a1d7c030e202a87af485d2c425cc32703a5a422044544b832fac7b452333e4a10790501a622997b71d7ffa929a987e403e034c1ab57b6a247d5dd27b129553b80a8ae433f0dc5777043b9712290367690e953914b35b4cd54f33878a24bf34bff0a3b39bbe463fcfa0412e025d4f295bbfb40fc0af7d284ddd81e94a2585426e1f8618018530a036e40190a25e1cbd57a1017dfa938c2ee2b2462c865217092ef761408a4d27f88ad8e55aaf295b565105b2e4ddb224706f7e56f35557a2a641b19436a9243df26b43fe2b9623c2b2275b7e0f89d9cd0bd49cadd7b3f882b4f03d2c45ce083bc8dcbc27ae3be8f7655ce5b6b3d5b6edea19cc9373c9f4b2c268fc87b351258ac77c13bfad6254407e41a0235780dd6027bfe4f6b39ea6781263f278002803aa9186774f8699b30f683fd93496046845e08faf69dc4459d23d49808328109b08012ec16e488f6c22797c439af8f62c65395d5a651b67905e988bddf3b9c7210f8c49a2b8e02d1e66214043e4db017a784f8c3b80b0a4900330f0fcc0f303cf0f3c3ff0fc009d37f1db165bdf851b8a48410aded15eab1172b9bb52ee8a283fa1d4f9398a2bb6d90128d57f72220852087b08e308e42e057a7d0ce1b323f7b0b228d047b626ce62a4d6ca4ef07c6f55c592a7308112a4be2a7fe07f3945042885be97538c17429614bab9e7cb614cf2c3a021c028d4930d923ea51c4cc649124014ca6cea9bd9345be953040284e2d85257b6c5982a03c531b9519773dafbfd4431ebcc278f8dcfb33df1860e374dd071dff23b81642cbf9917bb0927fced0f1e778ee3678537f19588888795262c8fd385943ac4904c2469abf294c7937248004ce8527a63d9a74be881997c8e9a8e2e87b825b47f9992d71829c7bc7640804a28d962e374982f22e54f09dd64c6a3d8cce9fbfa49e8e7c169ac205f1e462f09ad37cf6fe48fc3d0af4742bdbf701792e698bfe290d06388581a3b64479df923744b132c3cc8f0b03eda118a784964eca5f0f1e64668761e6c4472e8119b19a175249ac34c591ef2e54568ad215e3a8fc2a6d4b122d4ec91ed04cba61df92311fa7bdc48928cee583f10a1f9e5cf5b7b1c42abc94147cafd61b777184289de101f67f140234721749f6dcb3928cd732521948f1d4a6be642d8e00e428bec16ee71201f245710ea874f6d1ee94b749440e841238dcfe6c97ce400428f73fcf114cbc2c7fd1ff438bcc8f172dcf2713fa8615b2ede2b8773721fd4088f4ddcfb7fefe583d661436ee2e498fd1e1493b0cbd159f0fc307a503f24c9610e32824d300f6a5cc7d8f77eefcee141b7fc2083db77c79a3207cf299d54e6b083962b928cb975d03e74c2cdf774d0dae34d737acf41e9986b67c2b3859095833aed63c6416bedeaceca120e9ace5575dc298dc5fc1b947c8931793c8faf73833a9721e11f498e63db062549de10a32a987e1836681d75ac7bb1f6624e59831e2b7418a77a54c37eff6ddf9d2d69d0357e1883062597777c36e21625953368bb1d427df0e82888c40c6af230d5c6f86b4e1d298362c1e68265cc296b44c8a0febd650c5512fee36f0cca475797993e62502ae2858860f93cae5c1814b3ce8a7ba12fde3a30283985ca94dfb9dde15f5037c5d4445586e4c70b4a58e41897e93a73982e28939f3e4e7e883b122ea8b5614ae38e580e21b605a52fcc37a7c8fbf8332d68d1f144d69cc4e3b46741b7b05da31327e9c5b1a0c7978376ebafa067fe584c3ffb16b35650f3648f92eea70a6ad7e5eeac1c77bcc9a282b27d16dd79642a2635053de838ffa39c4b41f9d75021ef32de76444193caf83c613c2ccf88005050dc3cc7c977a32657f40435a6f841db84f9a033ef042d6ff4c7933c9c14c16f82126ef29f7bfdc6993c13b48b1d570a1b2c654ff712f4b0638e6cb7c30ef7d14ad03c27f7437c303a6f2741cb293f44fc2b56e73412f48ccffe1ef51114bbf459825988d79a8da048867b7c6998751c5c0425878eef74af34c23f4450339c0711e6cb27da33043507312c9e5484a04eeab03cff658e1cc60441ebd1fc8d1cf9332706088a58107f8f1ce5f82ef303cd2a7d0a1fcf91fb9f3ed0e3ff7d5897c3cb3fd9035d2f3cba147310eec7e481e29e65b2e538c16ecb1da85bef9283bf0fa77bd481321f6eb80fd976e30673a066674d9f3598c61c421c6816938755f92c3750a643ae904b426f8cc4069abf8b97c649b2572135503cacb98fc1937e3cd3408be0b9e307ede0367c33d0ae63bbb3fc09d5efc940e9d82749e5cac540dd9171cb419b7e9c33186833b95bcaecc267cc5ea066ca614498cb5ca0e7c79c3ecf9b660a590b348d94b5dcc345c84fb1408fd35d7fb1422f44b5025df204b7f01c22cc47055a443ad77133057a143ffc9c72d8b1d204054a3a4b9df45b3a817259fe121f97560a014ca048f628f7cc7c29f4f84dcbf3760a9dcc9342ed10c353c814f3a4f247a164cc0be1adf3c409be28f4f81cf5e638ea9c3bca87427bcb21119252dcf31e149aec5f5ca838313dfb27143f0f5305f9db938f7ba2eb4fe69e49f34e28fd22525693a33fc939a1a5907b6c2648c56b37a1586ffeb8ab3c8ea7d39a507298b97fcc3246329d09dd62a6ea38c95bcab331a1d969fd5c4a22b9cbbe841e79dae3e794b6845a93ea23b2b7c448e94a68231fb85f7f74e8784ae85af216bd3908fdf324d46a19f31453ed1d47126acef371a7cbf0b09b4828319e5e7fac2c966218128a47475dfe0829d5c88f50538a1191e3287684fe1d74e6bc9177b23149184023d4f0f142e48eb3e7790e46e89fa3bdaaf94cd59b6311daa40f5184ee1e3e88f25c35251d89d0a3c3cb7e9d909b7b44687a11d2b9450e1dee875053feac2ecd8fdc36841ea3e3380cbbecac6c2174ff8be92a570841b20e4673c2759cda18792418c020b44811a4e6b3c35cdf0a420f1ae275fe1c3bc7b10d84ee17234b5e0c104acc2392baec7b63b67f502fc78cf191586f0aad1fb4dc61868b74b9d2fb7dd07fd3659bdfecd29b0f6af21399349aeed379f6a0e58c1c1159f72fcba307fdbf52ef1de02b28608515be81f5c0154e634615069007fd33eb6c0e6e63681f0f6a8a3539538c5d13fa1dd4f938ee92143b14f72aa2bccc3aa89fc6c30f31c8e74e07c5a54d3e86938e08e7a05874eaf6dcafe315392871c9827e6e09edc5412f8dbf4f2962e0a094eed9fd7fe60d8a9d7d1c72241d9d9d71839e637c701ed4ef843cdba08c7ece90ddd9a0b5f9051d0d1a2376ac41c9091e63e5ec24dfa8410bb7cbf350962387641ab4ca7e1d9b64b8ec52a2418f29db30d9986c8f33a8adb9643cbda6e90e33287555d333f162a6b70c7a902badd89a227c2c9241d3f1b91c48fa3898188e418d937ea272da641f2e06657a6e436bacec110f831a27a9a39bafdeb2c1a006ad5012f9a37c418f19f5e1aaa47275142fe8619274937260e9822e35e3dd953243f0e082221de4ef460726716e419b0f9aef03330f9942b4a04b78c8e778b9247b240b9a7f78bbc8cedb88112ce839d6c7d56196f0b85f41afb7915cee3ebf492ba8d51dfede834408c9ab8276afe17118a7a3821e79ec335365b1b27400087b46cc09396cf1a0d885bbef587b26d6e70ecae40a9fb9976387b3071e772c733975d0c390c47d934c740a1b3aa8992f49bbf226546ce6a0799033eb5f7f96ec18396832a3993f0eaf7ca6898336edf91d7f7edc183470d0f287b1fb2ce68d7ee60d7ac7f156dca499b3c68c1bb41c3aff7ce4b78b946983e6b14ee7dcd6cdc7271b34fd491b9f63cbb9f15c83f22192b9af063d68aeef509ae3fd9306ad76fee2e38986cda041cfc86163ce4e4ee133a83bbbf17ae6c13d2ccda04739baca9037587c1c65d022777e73f0931d4b06f53555e49f8e9b9033062d430c1a530ede6f226250b672de3096f62a2c0c831ee587ab583d18f4ce49a2c6e52fe8712c2307752ef93cbca0cb57aa1f778f62ee827e96ce7d3254ee18c385ff23475d0e62d98292cd4ab77b2d282397453e9a2a692d0b6a7e961cf78c7f5863418de41a591f84e80c952ba81d467d7b9a98a9e3b0821e7df67bedbfcddd902a28769eb3dbce5450d368866ecf1474114fa571a6f1d12805fdafb296a410bc668b82e27af399a3da628482fe13442ba6cd1e5f754fd0f29df869db4ed0aaa733d7b84dd03f967ed68d35594163821a2f45e87db6042526cd61a86fd9d25f097ac60d19ebb257ef4950b365a48fa3d1a63112f4b090e9720c8bce1d47d03aca77c182e6b0dc184193cbe14bc2c383c78aa05458d2b81f39bb554504dd629bd4e8875d1f3c04cdb7267bd8a937bf87109438d97218723899f31b04ad3f48c71c83f4a40c10348fde2d798a0beeff404d97826fb28d3925892841850fd49c7c92c751ca17808a1e281d3b2b62c6bcf1639a0a1ee8a29de7c2766ec95d1440c50ef428428958786db18feb40c99e420a299c470ed4daecb15308c173ac1f1c68f29303cf4c1b4a77bc811e6cb2f2890add71b2d840dd0e4278f990b3327f35d0e3f7ce7e921f0f3ba381a9b28be494f29a815e1582e5780e19e839471b43ce21933d4954c4404979c282edf9a4ae910a18e891d959788ff30bb4fd0f3b22696bcafd7081ae2f9d36d85dc70c1a11a86881eed661aa8ee1ae997311c82050c10225c33d5bfee920d2843860c67a208b4650d18647be0a94fe1c69f8e7891cc44f813a9be793d2e9285077729c21538ae092f509b48f392e33420e2a4ca065ac1c9232c5afcd4f29b49ebc7176b72e63e89042c9f9c07c735f8c51e328f4f9ce8b99781185dae1c297ff68eef886428f37a67693289f9825a0d042f674cf7f4e5d26f9849a7a7f5b37e27e4bcc135a4a7b497eda3afcb813cad855c4e4164ee8711ce8e77d894b4cd526f4dc9d3d85ceb429e4506371c51607a92a28a080edc3149ad025dcc7fac14765e3716442b164d79b6e66628612134af828ecd684e023235e42fd8d78d55fb7655ab184b9e3cbf0521d570925d38664f9ef93b92c4ae88197d7e7e578337610bb05126b8a49689a64420ac9c364610a4930415c643a0abe158cb2c21491d023cfee91cc166cb22d85292081b8040fdbb1e765adb0c20c533c62b3ce20e952e8949918a6708412fca2f2495c74e4762394b0f96827dd5f8c876c610a46287de12c76841db91cc1c2148bd042f2fd481e7936870b3a610a45a81d836b6c37c9369292401917a64884362923270d9b909803a74084ee5315f6a310de634e1f421dd9ae8d55f13184b0017a01a784290ca1d7ff867e9b6fce4c075846030aa1bf95dddc79ae08da22610a42e8398e1bd3eeb139c5384696d79061812a4c310825f48465bbed18d2dc832904a1be077117e73ab2d4db1481d026e43013ba3baad23c20f43059ac0fb276d8b1fc3f68f31b92e4dde72095f7c36e9bdfe3f6141f5d1fb44bf793df47bc3decf9a0a58be05a7aa797ec3de8f1c6f2384b7319173da8e3b12f71ef764bf33c28d9a763918f82db68f0a0f9ffe56c9a0facbc8362e1357764231321d57650a68375e8ce1336e75c073dcc93b556ba4df2d3410fcaf773d0cf41b7105a23ce7dc841c9914c3a6cf2888356dd91e48d9b462b0f073de43cb6b88f52d6b66fd0e38c8777a4d210b11b14a9daca410c164bbad306edc7afe330da7eee830d7ad2d97c1539e472cb1ab4cbe9e3348ce791941ad42099dce3b839fc964c1af43890589315ae49643468164268b967495ce70c8a77746962647eb74c9a4193b19cff3963192a97fc3c53fa162964d06adc237b596f759a8c412b998ecf83fcb0ab11cc90c130662c8d1018a08a03949d0a4c2106dd4367491894c8a9dc3f8610c3851030a87716326ce43c61f25fd0ee52ee93ae8fc5c3bda09d4ff0ba710f66c3d70535acc6c3e01fef7e94e382ba31684587d53ef1b2052d82c69c1fa674511ed1829e5376bec9b0ed1a5916342d97ec8ee72d751616b41293b3f073791ed515f4d85a327496ca57af15b498105f3ec6ba90db29aaa06674c4f0b2d0de310515d4dbadb3943ba4f898827e169f24871c2928152e678ec542ae1c4741bdcaf2e17cc2ddc51c0a8458d5fd6f162e6a2bac3810101a3566dc144fd0724cd98255ecb9c9ec144e50ece378078d0a911f374513d4dc51ce81f7cd0435e7af3012638cd4f64bd0fe3d4c915c32e69f5e097aacc12c2ceb7d601d4f829234beb3b674cc573990a09d8699f3943c47d0c3e90afdd7d5b12766043dea482ec7129a27f8550435ee8ee59cd3a789e927829e66376d0e9a0f410fb635cbc22746c7b910d48a3936351b2cfcde20286133ef548ae7d39203042dc2277898c1723cd6fc40b9fc1c3fbee303c52be7f37d799c5d323dd043f8be0a9515c22bc803e5a7fb2342f877a0c64d6119924407fac576201f41fb6ab61ca8c1d2c454a96338d062a8b3cd331fdf4175033f4d7bf06c711b28b962c347fd576796b6985103fdc3a0394ee7c647e9a781e29174e6388e5f8578cc4071db8e4b7af771ca1d32507c3c8e426bfa0c6b37068abc747fb88a57995b18a85d239d7f52e7cafbbc4029bbc93cf99126d2c7055ad89cc3d0ff713375d8022d6c9e34b1310bf4cff3d69014243b5b56a0dc87fcdc1f6e0e3e8ea840bd9842c81f6c8c4b2437bb107a1ddb3cce02c6d2d819a70b1b3750ec2cb8e48e5c9f1dd2840d1b28356137c791bb5b75aa140b6cd440778bf4e1443bc5e44e03a52dcf42f3ec32934502aa38c02fa0062f8d1a22d019281f7d0af3f02ff9cfde81ad616586810d19a893d2e68a97f925586b8515a49eb011032df7bb555b0c1ac7ba23840d18682e1fc7bdd7adcd92737eb0f1023da549c9d3c6da05ba2673cbd14b4f32dd375aa0e64f8a7b5a17e3741c1b2c506fb2bc34f4327ba7ac203754a05ba6d84bdf6da440f138d8503937967c4ef1c1060ab4cfda4147d6b2192727503cf0e8f4bc4c6257b861023ddc194b3796a23f8ec9e82db42885963284f70d5691d15b68410a3d7de6a0c62b88a6df46a1cc548cd80d1dc58c31a250a77c82c57b9020b8088592f4da43dad8cbea4181071e4c3393a4cc27d48ae329e6d6d1ce1b3e3e70e109a5cf22e73b784e1d84b1135a7930a39d6386062e38a14476cd619fe12246fa022e36a19827e9d017733f638e035c6842f9388248e5109d6de12213ea848a7d396797e61c1723eb7cc005263489393ac9e1227f9c182c63865f075c5c420ff2d2d127860b4be81d749862547490e0f118593268cc380198c0452594eae02b5cbe860c1a309ccef502300a179428748c9f2117236b125a248fdfe5f48d91d559982cb4b1d842468c09586185b100e4c18524d418bec285093da92c1e60851559c8b8020406132e22c15b852c1e3234064f8cac04800b5c404209d963ccd1c590496d3d429dca57926d1adc4e7384966e3e2cb9251ba1bee44f931d6c8ee3f124b86084f2a195e3ebc9c7615e333c402306125c2c423d9dd38f7b2f7edb5302178ad03b48ea8a103fce92424770910825e730eafdc3903ad68f0825a74a23547bb974fc105a6faad2fa1cc4c896c3105a78c7e1e5e52869cb5b085d3cec28aaa2bfa3ec1042cbf795c1e384e7704206a1e6c8987638d1b12f8250e46aea7c2c24f4e402a15bc5bdfb6dbd1cdd00a1c7113a4fc749fd41f338e4d6b80ab9f0835d3105495261c44d18745550400165072efaa0e60df5b193874e9cebc71e562ef8a08b7b9cf0399cd2398d175cec41ffd8f5f5ebf42db8d083b2f9e38f2276737ea49a868c196e85155658e19c85ffcbc80d64714507b6861651709107c5b3b844108de11f3bf0604edd21894564b250562176bcf9ac24597234292ab8b883b527c17393e65d02a54c035cd841fff0f41d74ec75d03efac81e72f0f427d3418f390779b3a6944f2e3c07bdbfa2e3a426e496e5a064cf77992a5778a71c71d092b4c7317dacf7f072e0a05d9ab3cf0c1d6ef56fd02b4d8e21dfe4b0501b3728c9a3a8cb97d1147a6c83121d59b8e810a17bb341bdbefff899943568952e4dbaf14f0d7a5c0eda2eb44b839e9bf947633a4cc70b0d7af8f68fa53d2e668f50e0e20cba4488c57790262ff366d0638f935f6ef22883661dba9134c7fce4c9a0644b92fd2d26899ccb31a8614288c60d1f42ca88082ec4a0496859e630464dcf260c7ae530a7f2b94da58f8041bd90354d848a1ff4f3052df64be5728db0a84a8b113803bca07f2c4152ce7b0e229e5d503a44d01cfe8470414d193331f967cfde395bd0f368c7cf39885a507232a6fabe8f83f0962ca81fe52876b618c3829ac962eadb6c93e962727105357c1cf34fcbaa810b2be829795021c6182a5ea6aaa0b5a68d8f7278d91d3315d49aeec8cfa3dfb0f04e41b1898eb7a17db6f1430aca07a691837cc9814b15054dab4a4fdfd307e51514b409314c9d841ca783a08b27a493ecac3747942403174ed0ba43e463ee8e4c327603174dd02e86089b1d739894364c5073ca9d5899f662db25860146408302c5c512d4d78e72f85fa139060426a346160b38800b25e8e16f3c0ff2459090641749d03afc6053a810211d752e9040e8e0976fa7c443fc1ce133cf0d29e2fbc731c21f59daa0b5313b2f528443eae039e9d8748c032e88a0079176f38554c12a3443d0fba522b27558c747c1800b21a8399e88201fdf88e5254626400255181a3566b80882f72974180be54132461604ac68d498010617405073270d97d8ec29f527015658f102173f50477345b02b8b79fefb40c9c164ee68b64567d23dd023a78bfdd32e3b8fc203bd2c5bf83889f8e796ec408be1eff52f64e37cd381fe7d1def6ce898a34be5408f314f0e1347ccd24f2e70a0042b999ccca1227b72710335dd67c95196dfeb8c5cd840cbf92e480e399fb9af33b8a8819a2ed7475772d1b4330d74f933af7029730c7321838b19e895a93a43f853066ad544e87c799c65bf1659c8701103f52d69c6904f18e851ce7d7b6eb9edb17f81d6e935a7f6c6bb7217e89793c7e1e3c06252b805ca853fabefd11cffe72cd083dd98d7ce1f36db5e81dab1e57479d2c879b40af4dc91cc1f6264b8f9488196339783cde1a4ebb845817616e2f79d6e04c9cd0994f3fdb83c0c29e40e441726d0c4837ce8b842e4799452e8521d3df1f3c5ae9f9042afc9b755216ce89473a3d033e5ac113ff09034178526396da4fbb18aae2b14ca84c971d68b07963b99d508dcd0800a50a87bd65982666eb27e679c28a8f88416d95298799a98379823d819ef129041812a0e50451507a8a2c61632dc035750e00a095471802a1640c341f080112c04acb062043bc31c800118016801159e505c333c3a0eff9ae33ba1a6c957625ba125cb09f53c8ca49de3f9307d13ca96c741900ae7671d9ad0c3d0b124cde513f44c28269a3b8e733c64b498d0e3c955a5b97284652ea1b46b87a12ff7c5182da147b289fd1072a62a95d0db4c4224e4889794d0fd5af42f773f092de56d8753d54b4273d1918deb10337724d478f183f05a43420f3a104b12e3accde3115a6e9bffb0dfbce774843a379ae2e328c4d9c41ba1c6da4f211273c8719c33420de221c7981c8bd0c4c33ac73d92cdb28aa87d62878f4ad389d073945354d2d051efd988d034d24d7786fa10da74b09cdbde3463ce86d0e32cd6d53dd956321742ed1c861cc7ca39303b99106a46fb5732b7f214f220348f214d77acada12a2c08b53da7f871be7ddf8e03a1fec7f1f886e994cb3f00a1841852b887f9077dc7836c19394b58c8e10725242387dc2e1f65bf0fda957bbcf8b75da1f34191e938a40e0939c7f21ed40d99c1620a8f6ad6833ab6399b3fcce641036c50e3ad620e36749063cdb106edf23fd984c8a841cb6539436a2999918e3468b1a3bcd339b7d170d1a04e8e983777d835b13e67d02e879f634bffb1a61ecda0c7311d379285cba3974133c9b127276bc954173228fb2d27192cb70721640cda9ffe944b8e03eb1431683f9511cc3e8e15338b91056304346a54991761d03cc7abe2e4b8a2068d9d718ca1e135ae20087801062b4cdd95a40f5bbbe383175f28b74d55a418fdbc50bc840f162bac3010240b5e74e114d2c179ac1bd5f78c175c282bb078b105a5cb728e3672723fb6a802020da8e2dc025e684149b3b1b4efb3a394c22fb2a0c5c47def4cd2f81e3105bcc08296ba224c7e4c9e67f315f4f87dc2e51c5faca00751fd7576e122a7e94515348dd7f039de4d9e568efcf0820a6abc6d499983e5cf106721e316c0861753d052c87a793c5674b5468e03300083042fa4a0f48ddb565b7647efc7c8926180f0220a5afb07215b75a59c81a18507bcc615300829c30b28e83732da71e016d993f2044d3c38bd8f5ce9bb6a2728369dee3ace79d104adc39cf5cb42c4ed6d63a4d39041b00d2f98a0c8dcb487dd162ba5548c2c2cb05882de39112c66b6a4c7e32bda69cc805103c6d25de1851234bf54b9cf423cba0a99c28b24e861ee91b2af7c5f3928bc4082ae1542b22fb3d2cf5d8c2c193560b4db11d48f7119d9b7f3df3e62649911f4f8dbe96cbd90972ea7085a078b0ff1df8c2d64d0d80012418f25527820bd4172e55c1f5e0c41ff8c1f6e2ec4974b9b1c5e08418fe925c2479e7214a382c38b20687921058d0f7285d8738c1740d06296ce1c22ccb3a79418590e83ee092f7ea09f7847b3236217b28a91d530cc0b1f68915fef2534cd876c01a3d769c44826bce8412985d2defc93a9f2173c50629945a488ff61b9037dfbb72793574eefbe84173ad0d398472958fa0f3b87bcc881f2e12e4688a1d5190c1a768417385037898cc88f17236bc61637d03d9c5c235fadc92a33c20b1b1c62f6d81a72f72f034607f88a0e70e1450dd4d87f159ffff4d3c531b268a05e6859301e043360d4e0cdc2cd8b192831bbfbf9c52aed281223eb9d060cf7ce1732d0637f4fc5c83a1fbc88811a3c937ef8b72aef28465a0f5ec0406bcf54312b77746fef0bf4e8a2426cd37c9573bce1850bb4cec13e7cd83acb1cde02753c9e8e1f2652b858b240cfbe5149c772c386172bd07398cdd1a754ee529f33bc50819a2b6d8a2186e41e39f6450afaf0308c664a39670c2f50a0f6792b861727503b4c6e2529598e37e8a55f9840ab8e3f5bba484123e6520afd3a9acf31f8f869b731b2e83648a1849d4fe8927c597251d818853a3dc17e24dda5f05144a167cafc7a971de55c8d2d64c0a0e1357e8b8542eb90aeb0677559221bc20628f4703264d987e162cffd84123464e4c0224dfc6b6c21c3135ada4996a1cc62703ba14ce54ee7e870e2f8727798d984feb675d765d18626f48edfdb49026123137a1cc7b1d961e75964b13118866b21030b3e1e6c604297e0fe1acbcc363ec303346250e560e3127a69e7984ddb13f3c672c386253469110b7692fd49ef5ac3462574fba06c424c4a681ddbb90726993dcd3f093d54082316cb2209ad83058d182d9272a64442cf71546f5775920a1324b4309da31cf9f8f38a31f908edb7f6f2d3dc44a4080c1b8e50ec7d7259cacef0008d1884371aa1c7c82c69262b7b87b0163618a14bfb4ffa30f79c6256586c2c8214a126d9130f53b66264553dc06400c6b091083da2e2e4f9d05107bf09c30622b4f20fbbcc3fd08e99372f6c1c420f2c67df449e0dfa1a2a6c1842a973bb89fc7bfa11f21b85502ccd8657bd46ccb86b6083109a04bbf0be5caef72931b288051b83383afe8f9a3146560896060cf72f26083dc78efb7378399e63baaf0884f651dd9e47c390d1570908ed8330c94fcaa3bbf730386cfc41cb1d75ee2197b561c30f9a664b71f2644bbb6f7d503bcba760c1272bae830fda68c7cfb817db534ddeb0b1072564cc6f3162c7b11f3de8b9bbef83858dc7b66cd8c8836ee1c30e997f3baac278d03c850e6c63f06a8ff433868d3be851d8db87d09a1836ecb047a1b3e9818d3a289eb43a864e1132a4f7f4061db4cc31ee76d25ba6dde7a089471d5eb622a4d851725047b4d35d661b9790e2a0a58fb3a2e3f71c744a9d0d3868697298b27de7be3cff0d4a0739a44e31173243bbe1063d4899f37e94cafe2a67a30dea46de68ab8fad4def0d3668fb12f244922a461e1b6bd0624a1d527e25fbce220236d4a0e7c8c6364f9ee9cbca0e36d2a085a4f92ebbfe25458e18595589063dbe8ee3871839ecdde60e1b6750225c08e7518fa40ac90ccb88fd070c2c83962c927cd899d35c4d06359cf9758e236f099f31a821c227a49c52440c9aa7fa8a9c8441bfb7147396fc82414d9ac29ca6ccad243261e30b5a4dceb8193ce668aff782dee6162c7fa0e9829a722c1562cac8b39d33b0c105e57348c983fe84d4db5b50729c23fe5b2eefc77616be818531638b2cd6b16002820d2d282e2e9badee80165b0386f3623183686c6441eb38700f724bbebfc6039b058c2c2ca8d1a1a9efc7e7ab3431b2647495161b5750672b87b85397e1fd8221a3cf8c0d2b681d77211f87b3c9623e461616ce592c63160638820258c44615b4b3cf8cb6cc410e9702b1410543978792381e75141bc3116c4c410f8348a7ae1ce4cd392f3f6c48410b1f272abe6be2525f636bd860230a7a59a52ca29993bf075571002b4ac1283a6c4041cbded4e52e2968a7b49031630434b6d0629d460d226c3c41cd1da57517233c923846169913144979af3a0af31c6f3246160def000d192180d104bdf3ce6d82ec7c842ca9246c30414f9bf3847b98e9ceaa185923582c1a0b19bc812caee8800c19078c1835ae08010c2df022b1b184ef2288c771fa38691d23ab03326460d15798a96143098a7b124dd133731d45091b49d0c3858fe27ef889910563091b48d0376648861c58caf9b278c00162d4b8e2025a60818501aa38401516a8e200551ca00a25545e368ea005e9f062e3ec56e6da086a876579938bcf39b54550642e7af272bc134e4304ddff3ed9c67948f00c417dbf37ef16afd8b208418fde0edf8e47bfab725ec0043682a07b5c221d62aa81a06f7c4dffe1f74f628e1f28c972360d7ee75f2dfa408f3c11b3737f3479c41ee84166bc8e15471ee895bde7395968db1c3bd02572969c3e88e840cfb5115e95ae45e38d1c289bfdfab4039b1c73e4093670108886a874ae6402d2581c0e8783e170180c0629b32e00e31408104080b0341409c5b2280ce4ed0314000447281e382422161c22160e18101218080804c260604014088502815028180a8445e1714024287e2e4410114be70b347121a8d17b55692ca54a395206effcd8a78f56bf4da49d383846a0abc2c2da1662054a2cf91ec8df5bd4ff716d4663b2093c52680fc080dd621f5814c117a61c2c5edcaf263bfd844be25fbc988009570d0c36dcddb95a0c99375ed6262c153edd349c045ef7c1d692108d73bd7bb4cc5980a4d22131e704bc77e60701280ade49750c0f94017de7afe251012196e83d42ab2fc9ce18888db86e57c53040739e3a02c6cc590488c9a8a3ee86c02193dd87b5b2ec7f1191ca702089a79d2acb09b8551095ffb70439823a05f30e64cf08be9b384766eceb2173252013c3283112e2aaf8fd014b7ce29d77067e419304885a0a15bfad18a6b55a1d02ad0becb05592f62ef15a20c2a721841dd905d2bae195ab6e6116960e84c0df3e68e484ef7100bd117cafecb368e8ffa64c742a197d217150821457419352f49132eb5d80e1be28942b010af719419820ed841b958538bdea243f6484631b3e6ecf9562a9283fd22b2dc9fe7eaab4e90294019027ac577edaa1f8484ad9d1ac08b4d7c4fb5d630e8dea580ef3f5a56307b5516513ff5e58d717972063ee348a7440f2595c68aba30164e9380d7929e48a3ae0ab4aee0332f2185d20609c35dcd9340693ed5e3153866303e0b0f4f2c0f5770ed2892ab6b6c6f5b77fc7cd47a46a4a45d56b5197c906089ca8d58e959d017b1a95caa69fd3279dc1bf89752deeb0e1beba3950a63622b0971237c917ec4dd439c78db414cece333a1ce1424eed2f7b79320ce3a71da30b295c20e623b11d109c45e0086aaa4fb0b62fb648b4cc4c801085378406c96f8a067d9e3397210ada4ba6e8389785188440581a4f5506d37a8d18782f86db1f542f98bbcfbf1ecc48f4404f7ed469030848c7290fb10b704af54e42fd640f3a20962386fcf359f6bb3698941ed6923853cd8da29b21d269fb4a4a777875be02a4a723d9ac08b5e76d7d0ca85cfc8bcce8b9e19953daef3c1ac9cb8defcfb2647a6a22e34121c799231fdc37ba1c3b34db9ecf0858f3451f18d1301ebd0f33df5e6e02959938e2a0a9b98c671bd3a4b8c834b5261d5c0ee7e1747c64b6f30324f2acb8fc8266bfc0a481e118f3e421e51f3c5a24b53a721451222650d3963c3f38579162ff9e86830005870191e492626078f455f3119d4e9beece502824cb4b0c40c55b35fc89d1b69888096ba695f7ffdecec363ebb3a8c5a6ae9a02c44830d695dc191181c19ae384d4710c90f7e2f40a68aaadeb6a97350388251dbb04250276f9104b757f59ad58511c91aafeff4fb014008a6f07e0f6a6aa6596e449a793efd8c7a5ea7e20aa5794156afae5b808692dc42d704b56fb384137c64977379a76e269431089307cbb437d7675f4b66c076ab371129a2e7b8ec28e36386c4d58cf831c8475b4e0c4751551d166691806d277dea189d21921a110ce8e901167bf747762ad79d3324acd1889c0a19b3d73da1ddacc917a6ec082c9c730a34c370ad5a29ea431acf08c9fe531c47cb284df29118878a8172703d270921dc4095e6196784296638dc8f6c5a5e7a08d9ce38625320204fa23e0b50e801ec0132006033318e602c94a5dbe271a17522c6b8d16851edebef086a813f3100909fe479441ea8f84ba9125bd565367cb449b5499d347c01d5e6583061013d04b83182caa49feeb1390c2d29d23db8ac746df45636003c56f295e107338308080217438621092c375b0e0662a7dad3c1c19acb42ba8d886b8a39a224f51ad020d7179e9982d6187a4daa0628b9f67cd1973bd5b513bbf18401abf7abf1c9a16615676178ef515f77bb01c5635409ac02915e492e397b039778caf3f9464d45de5e2a0954dbff1c75b0eab86be97bedb5a3f44a0cbce8a04b0ef736af092c1bfef425a55f0f68e05d87fc084bc813c3b988c38993627d7ef0a31e585ff6cf4af8547622ed87f2b27e0cfd81bbd33a640514c65f73f6cb5be8b00f9b7dd286ff10486d541e26891acf2f165197d569d3bb41e561e9b86453ce5d5cccb5859c2088c3e9991856c3cc33469777e95dd57bf18b4e1693a5a824049149a6488bf867624f7d351d4b159270eb2e4d835c8e1071f4ad237b627a5c15c0f045d9e06fb776eb3cece63174b06a3298cf4f1deffc7d4ca4929fdc791376f036cc23e8a251e0e7ab9c39cc4673eb9be09c1d6ccec7a3e322993926cce72985df8ea3e00ef67449e1831ca41dc6068607294db503c578ff3ab369d884f7b667b3cc0d38f213608d7f2ac2be73cfaf6680f4a4ea881152523eb9def5fb66034b505b892d2d0dfa7e18dbc60c1f1aab420154d60011021ff7fc0cd30e36d48ba9be0448e98dbc47a837fcbf7d94cde68c987f07fabb5480afd23c9ad1a15ee8e0d2d68d358eeb4ccdfc2f5cac8963c15e76e77190988484991339d221c978d587c856136d1260e9a26829d9473056b7e6bdf8d52e391202f495d7dcbffaa495ad0898ed23155a1e21309c4bbf46e0658f840e0ab898336be263a92ec82d681931598f4850130305b84f5d7023994cf6d8004be35194a817e69e62b80ff9a51b2b61ab79ffa5ca092cc14c88ff401fd228179cb5fa1e1c218d5c09af1953b16bc17a14a7eb84d55ed59bdb680b847422111aa21859db7fff960e9539a3a6d48a3568ad313ee3726d10af65680e1575a1fca2efb9c26e58b000122512572cbfc211efb65a4bd35d9526866d74a9131bab92ef6b2c50d39f7219999dfb72f6dbc8bafb51d28d65f7129990d4f00777e405658e1d7685709bfad5b07edb3e5b68aad89d4ae370ca0a3a9dab8c7fcd86d39cf907f076b56fd9886a37039265e2da0d71895a9f17e43cd1dc017b32a56078d98d6640d7487a5c19800b812300959861fed99e858e531c23e229115d1d3a99e0803399026872ad5d28a3b1eed4b8613bd17b40b6d412a8e3889359e60a9acdb396252a7a2a7959170a31c5cb44be179de9b9deab9de64e3034a3f06fd178364060ec66c125b4ebcddeb630bdeb5e8bba4c4510809ea07b461aedf5ab5971fda46a0ba8b2099aef401e8fff0b9df91b9c15b4d983b5cc7ca61e45698c4b64f5c391a55ae4586d49ad579314a622c46d09022c29661d9fc37e592f242f2d69764e1040e22c9340af1c5897a0ad053c22d127bfed7aecbfcaf518d4bac4e4d66991523b5f0bd1ad7ea581ef02c6ca327c9b288bc04cd55a7a0711b060b35cbc21af5552caa3b1c5b3cc8d0daf02cb082e2156eb296b40b4ac1994f619205031914e96bab41005279a6d0190e56b800b5d75d8422f878d63ad98a321b9eba8d1ccfb410d06281b0edf42f5d35903304ed1a4d2014116516433c5891c3a5c8a0baf803319089e63742698865f997e49cfb548cc0701cfc908ecfb48ddd466473dedc8c85cbf4c76ff4c89999accc70376e66df37e296611e664287f9b55656a5194377874219dee61cbf757476716737239a99a1a79d7b9121a2cabe72636ca558cde1101af4c6b629d54110a1b0294714e12b1681975ed96e401fa8d25e7a311e00971d3eebb20e5c27debbec469a6b7cd53ba110c3be0a744e5d7bfc1c6624fb871cd3c7cf49aca0cfd84bdb58c466a6dd6f241dc766308fb41d96b289aab689fd2be3b8188717acfbfb511bf4a7be53eff9e3e9c230c38d27d22c4a52e8ecc483823e897ac1e33dbec016a136152aca44a15c8a9aebb233fd81e137fc5dcf8374124177646b5b325feb0f91f8fe881e23c08f6ea543762e7eeb7e6155a589eeed3771d0969769078025cca6e4594705e11ce0b24fb4821fac5257204dfe297e1b84fd82eb910f9ec5152253d266af110b4ec44924547a6181f8a8e3af8be3b61eda8b8ebd5a4dbc344f3e3eab283eac3faa349ff925a61479dcfa9b8aca2dfa4059ddc2a05529a503a7ca47240981bc784697e9380ce317890d2afc771f54bd4119c8495c5e0bc4eb8d03403f5a9e50a5b2225aa579fcde9c75c5dcde1b824d042d7d703078eb6638195abe801a2c765b099eea38a3fe636e018d28052cb75b314ee2a0a7cf584040c3dff72f17dd0e09dd59185342fe86f0fcfd60f50f0781b9f522c1b37bd52dd968e809e6e6a9103ef7ff140df37666d450d5ad5adc0e297756042c0144a4c890af52fd81e2737083f33430c99adb5e500abe9e671812c4c7e393eba9ba21e5c7c82a39b3350482fd9ca646d285750305a8cbffbc1310059e8d628f50f3874ae2aa4ed286218cf7242ce18d3b0736d485d895ba257537571de20e6780fb41f081f10132f5b4c7fedca37e561c1f5309df9753ef90869ff3f23edcaad7d6fd11bae6a94aba051b39a6dbf8c9b74b6830aa89d441fc629257aa84ca78be4c941e52715bcd20398d0219468cf724bcc0bc1b4ca85ac7cf8266a85152bb433f046a415076637fe57838d05da5691ac8d53b80b831382d4af6ce3d320be65eaf38095882930084c04200161c0d4804f01668e40ad6720f11687206dd5fe4f6cd929ff0dbb5b180eb87ede37fb4057c46ab5b566280027dc954d5e846b7eefc8e409ef4c4cbfa58d4691c0ff933c2dd2b5c87dacdde2acbd6341946bb50d509dbea442b3598dec0814098ded493bec25f0ddfe155fb9a72a2652e4d2cfe8ee012d2f7dff6dc83d7017071d83d1858a6ca2af5f2dbc480534a2ca7e379982ce3b68646acc0a1c4e3258bea243f02f3204b1e1114aff857281effeec2610da2f47d8200b10c4df68ec81e18f1726587f003912f354ae05af870b1c9261d9b4d71ebdb02b362cc98047744472611f7328a236bc4c98ee9639978f0053d06464c5c66801266223ea4b3f4751a45018a09a66ceb0a5c4df0600646610a8f13fbf5e3c8a63b86a02e2dea4023ddad1e8e34dde07368344aa6f66e5bdbd55ea7205a12da921a900c282df81ab50d49e10cdf545a822f6b18653cda1b4ae05398a11be479f9bf9cb738fedff9a0f812319c11d514943106774415f415b852011486d474687531961ab76d574c24e001989b2041aab8054fed36d78d312b4af8c33606d29e8d917b5ff75519a40a010eef5e276e0dcaedfeab9c07521cc895c19b03971f0d24fe5e800bedb0ed9d299e0c9c9a18e01ce8084366ffb6800e2ff2b500c958b7a2d426ff2bd45771d4ac357f7560cefac6c385e4700050a08759d511b4f97992de2519a545aedc938e96e97a20c73b27f37077fa4bfcf2bfa0ec93539532b259a65d506f4872ebde5d798835d88e6f1b2042c9b0f2718f631f2f926106ea3e82a0b26eb97197142765a836f3dae5c05bed1b68ea0f9e4011a6b026f60776492f18bafb6acb52f0d50dff6e771a0148f02aa1214744bf2e267cec8e107c81e1caf5d49a72419ca69905897c6108fcf09291912aedcd5ef436cca2e788610ebb36fa2322f0417a39a1eff21a6386c315277ac34d711aa4110f00199cafcac3e800a79c5409472d1fe681bfdbf7a055746bd9ed4be42608983f39f793b41bca0fd8c528d465125bba24a500bb1d91b72d338077ce98b229628f6a5c8a65217752998b8701756866b72d938c0fc3c23b7e22f151f26bf77dfaeffca2fe6cffca9fa36ff417faa07c587fac3fb7efe1dfd0aff00997256b4000a1fae43ce56ae7febc9273999b6df4dce67eb124839db21d4107893d24f3b874e6e80e7407c8a2cc02f03a5853061a9e0b8d5f6a52f0c48c77c9ef40c5af24104d5a5134562a7319c901283f163103e5f87f15a13c5e159029d46b2c1054f22737d89cbc8bc59b06029680b170aff01d86152022cdfb39e1c5e619febca85f875e1a2ff56fb177ab57ab37c03ba86fbd8ab79b83b4bbe7e86cfc4075375befed25f8eb0c0cf4f2f75abcb5ee0cd53d4f8fb24e1dbd73f49e73070b329d6e36eb4e4e62bf163a75715d8f2e882ea11be89e747db3fb9a3451d5e97891773dbdcabd01de59fdd60bd2a30404d63d070cdad54dddd7bebbb596b3b7e3b60b05ac8ba6abd785e83edd715d9b6ed2bdeb567439ba6fdebdcb3d0d90600c66eb35f046bef7771378b9dfe95e062f3276eb126e7f1afcbccbe941546279ef37efddef95b71ee14ece56e1ddd7e62033c06f09efce97b83be0f59d6e1d21451a9a19de5e929b875e43ef5caf8a37e92ba4ddbaee7611190befb997d019a2ae97ef3631a818c816d9d5f0f2fea2f50a7a21bd6b5eacbbbcde76ef63af8a77af6f9dbd71fc4b7f9c2bedbb91fc6e5cc34be62ace0e0365a0d74820c25bc6b573aa2c85241bf3d70ad666219b3a527d3b857165cc06857d0db70cb11e168cdc6fe1efe37bdde3b2e772a4d1ca8974c5ec6eb1b81a371aa5e18f99524a429a318fa8ac19f0cc6e85cf70e5d334aace1eeade860bae60bbbcd014f7b4427a65cefcbd104ff0898cde623bb0f7988a7dc8d118f81e8b4256ce248989497ef88c6d853117ba0bf6908ccec1e80d8dfb01bc3818f78cd9106349a9e78af2a871393618198c641a8b3de6defe96025fc72fa37702758e7e0ccec669af705169331b6bdd85f50eee6713ea499f6b167f8e3aeb119273de9eb05ff70368cf4109ec12a36344d359d0b1e8b0d185364d440298ae4d2755b1f1a82ed725e05968a39b90ee9f5802adaa9703f586be82f714a87f74094e6e29bd99aad083063d739ace72d668294fe8160f5f0a2b6ce9db3be76495744e6c7245f906e624fc78529cb0783310f02d94d196204d5d2efe4636a7e22eea2e6839c0c7b1cf3127aaa183c13ad4512b878915cd6c5dc001c586c6a2c08e46c060359ecb4410c7d895251391b887129455212fbc4ef2af8652c128120fd7ba145b71834b0a00e4965516bcc8c50f2245dff2a651bc656b88f1ca7823dd550e8f85d1b37fc98596468c26be69a07f37e2d95b2872e7c08997d8be28c09fe411221c1222b758331844082b1adc781a453a2178a9434259d609d11a28e5f4dc5c6a96ea7632931c5746f8e2a0cc50204e73f8d4079fd29f82be9a9462af4e8de2c512e8c4a4c6f0651bba286902c157a04e33849976f4e27c284d0287e272c3747c295d09510133566e0e7637f066651f83aece5ba06fad102dfe8d2f30399cdb268faa9f0f4e6bb8f25bcfacc309d3c034d818c8825e198675db81fe040c217e3086a028340d5e0e528cb0f9adfd7e140a9b79ca5169d80d46ee0b7ba4db831d02c78301017c609d204cd822f01f202444840331d8201fcf949c0e10c21574825d007dcc8c6ac7b989b93f2143ae89f8a2350806c76002823a64867414db238178d936dd87fcb127388fe4e7dd40f1e021e14410186c0e2e840c03c36067003e804e18e857b2c396f913678357ac20d033d4ef8fcbc8396396d62e1136de0c105a9a8997b1246a8c1f843a288cab1e9dd4e8985e2b40f95ede8c734a5b471f115bb3abffe63354d73b59000ea0005801a076408b020eb018c04b1857a45b9ad484ed468b29805d7dbfdae70045001b000d70080284b37bea0913a001e6ac004cfb20d7cf01b48844968d7a80510068b99ed3574b80379831acabf314a78acc60aaa757e0349a02a0067800360029c003700990250081257b1a800ad0000200a600a0407b00863ca8a9ef94628e5932624b4fc4dcdccfb279e228437815403cd93279fd367850b566476cb31688146af05551e8f775edc2e5e0136a0b7f6dd979342cb421a1249c3d030363bc9e47e411647073542e726aa003fb5f6daab89910fc0016db731a12c3df4adc0d7bf34446450c735c850e783b487e23b6257652bfd3e1a5d94c692c0452a03ef0c55de2d20a20089c470f5585185a83772f061903da806970198c19d806b9c1c9a036601bfc0da0c36043e2a10eac0880070e0931c2c541408244383cc08fc0596825cc234816a612e6133a0419bcf09961f32b6c3612d369ed0a1b1f0259d3df12665439e5cf264437c226f0bb2e41b6d9bdb60793f596eb89f2012504e10227612a613e840d2b33c66a36d8980f9f2060184ca6ebe4cb9104b918f40d7e06a7816070d40d167dbeb4d119026da07c204938271c4808110c839b034a02ba22ccb41d80c6258141252c838ced100682c080a283990bb25f4a3a6184b0b129885e6315852e19dc0cde068cc164e035d8a6c13e7215bb08b8c1d56065103290548345274017011a98061f83b00169f019e00df80c9ec1dec0131a4cd6eded37be816330e5a043600c1ecb60196ea0b7f80c3e83c671b0cfed666e0883968130c83af03cc20c6b2d76664ea0778338d433eeeefe6a650ad06d7442081b0a2bf7b26b6019cc0d60069f81de203198c76005c3762806d400763042d01b9c068b413e7c305947b975cec077409c504fb8247887304332b0d403399a7903a035b81bf6f65ebd26300e17a67b38b8e5057ea133209083c95abeb4a80543c882b03bb04ee84380165e3a61e3a2b2307e25c4ea819612cb6a50b5de278a114aa791ed99d066f8ba1324834e30d807e574fd35c2c1603dd849701f61063530ec81f9304802fdbd78cc28d839507b0a64d7b76dead53e7c93d33402660e591c6697dd3073be96c0c4840dc710dd6b21ec7bf42218c5081816b8846b04182b6cfe7c6abfbe1e2c93dfc28fd3a01a486307bbfb05f672128013ec08c560fea07b029370432019700f7e12a6125c803043cb430e6e066d72b01524dabd403de89cd040380656038a034c420fe1881a2c079e44c268100c9848c6206ccc029e7744b70b3440b0a6d0013c0c3c0c3c0c3c0cac4dfcd6d7adcdbc05996492d3d03e5508ebba24d39629a5e44de39f441a5167ca13b7ef90a20b3e0b620b2d0c962cc168ea5042e36e890eaa04a7aaa593888ac95644096e93a47b1da249b02f1e9398b3c916fd4882b11cf53befe2dec9468293cecdb593e5a43406128c9d6758fe08de84ac50e23133491a4730b2bff67b4735c66823b80e96a4549f3ce89d11ac2621fa26f97d3c4916c1c85c79d36715a1639228020b3412c146d58c2d523bb9668b091a88e0845276a3a5520aba840cc149328fdafc4107d3642138f194e89e5249085ef7db2a4cea5c264c06c1c7cdd7355a4170a952bcb4e992283a0b041fcbd3880e566db295008293398b49ca740cbaf407be45d3c9d3d9a4e1072e7484be6a2bd349a8d0e80327cdf3aa72cbbf4585061f52a204d11e78b5936212da04b7def5c027bd5e591ae3eb79f2c0b9c93a2a25cb0a428b073ec73f93df62eec099a4dc846c91164bb4d881ad9ce4bf53293b9aa5d481b394cf045d5da1035b72eeec41e5e53db1320736793e5125b33edf2a7260d53f74964a2194928f03634ac558caec24994170602beb85d226e80d6cd612af5cc93d9bee06fea2978d09253a9da70d6c55fa3ff71cd52d1bb8ceb1e289a9e1ed1a788bf9645633f92566d4c09b9d0c5aba53a8a434703aa58c5ebac43249140d7c2e1399b1fc5a058d33f0d71fb35745cd5065d028039bd45c4d59493fbaa14106ce4f4c82b6335db1928c8193dd524ebef99a938a18189d529434794278520903376e826ec8a47bb1020646e8bff760514db3f20576a345cf5fb526c5bdb0c924664cd7a982a834bac05aa7ed9d9bc905b6c3ec735f474f4a32b790b058d94665ec58f3911c1468688135e982c864f23f7efcb97103ef7bec7014a0e9096864416960814d2d9a84436d40e30a5cae2a254cb6b05c41293b41c30adc8a0ca1429355e0a44aeeae1e4fb60c15f82c393b2679e9e49429b06351439a1254e511a5c0a718e29615ba89058d28f06149f449b1a4072507853328f58ba6d913381f25a7fd3cb3d22b9dc07e284f269324a4d104ce6de4c8ac1233a98f3498c0bb5a8aa9a950ea8290c612f8a0354b0c1f1d6928812d31689de4f9bfe41ca4910446b4944a761eb3de83349060e58b9a96fe92a0a1048d23f041a8eeeb99badf46e0d4e5527277c84b825b04766b3449276e6810816b93b32839b35892541a436033a8b74e2767be6c823484c0092583ca6af6b1dec460b0e9979359bb8a27210283ed2b1364c98ef71de22fd890222bcc8367141dfa8237df2bf590a5733fec052b723385282595480d79c189799fb4c9c25d70d993a4b7478b09c2a40beeb7d35b29cbae752ef87cb257caec6d0f175c6a2db16bafa4995b7082494d495473ebcadb82dd944f5fcde3a6a45af027c9f1f2d4346dd382cdc92e09fab45970a2c49cb26d9e8d5e65b260544c4c9a4c932679c782cd5ea2b299c792731616fc5f9f3ceaaaa49cde5770f2c7f3fcd3189e5d57f0efb629c6dc69dd6d2bb83ca61f73b97e3e1956704295d0a7eff45b8959057b3ac850f7f14d8919557019a47890f977e6692a18e5317a55aecaa74c50c1e9283165916ad9c4cb29385139dfed56fcd836de1c6698a21ab74c25774ac1bfc53a3d3284126c52f0194b4dcc1b26ad2aa3e04ecce4891fa46d2e0a2e7fcc5a3b43c1fe77b2cda3f2c70f0f14f96776cd7fd61f1a9654ccf804d73b4a3f5b48b3b3be5829667882cf3e667292c245e5ad139c6993947c0f4baa63c7093ee978176c2c5797ea36c1c74b2568935212baadd3045f2908cda27e1ed7ba4cf0de991f4dffa44b4a9860f427a1bbd16d34275d82cf24c99f6926b304f71a969dec64afafd13c07d231a3128ceaf50d4a4c929c5344093e8eba8c26e7754a8226c1c88f67490a133eb64b82af24c9a2936e8bbdf148303a9b78565996d9198343518e1c7cc283478b51823052d08112842146182708438c32cc8004dfc9e47437717b04a32f0893692b5f996e8ee0e4f26c92bdbaa735c146307aca2e7b5da8ce1d46b09e97359d9caabed1457092e82cf182cecda32a821375e4c9b2745bea2411fc65f1a444ab99a42622f8cf49b6fcfb9d9f3e04e7c12f588ee3bf1a34041b324ff4e5fdcf275808c6dc3b644992a426a58c109c868ad18427a9412b1b049bfc4af7e5310982df18e36ba9a4626e522038f133e3552725dff980e0a2668ff1cdff037bc2734776cc6d52ee074e8a29da6ba6a566b0933e70c2a2c6d1d896da1932767f98c1073eeba25a4ab2cbafde031fc5b48a77a7b09cd1036f9ed5a3e612b4df9a074666502553795a0dfab9c30c3c70d9fc45c9655228612e72ac4cecc0757ebf3f9d2ae536333131a30e9c92aa7ed3473d4154e8c07930f76d171b799739f09ae42e214d6a911bad1972e04b9d2a617789c30c38f09ea4b8c94f75d09f7c03a374c926ed348de8b86e0262861bf84b7dd59777a23ad886196cb8e42b49ce11266a41d4812366ac81f3f04cfbd22625d1a9810f4a4a6e31b865ed581ab8f4974a4bbbc69224e9f230030d7c75fcb55862859faa70a8253646e3193831b59ff44ae357e29a81f3244f4f652769fbb932709973a38ac6d3a5a52123470af430830ced57dc8b5b23f21f65f0d091e387ff188fa76387f6983106c67ce3da07999a536862e0eaf429c1537ac3c06bcc7623c5dc5b93e817668081d39a3fafc392dceecd17784baaf3dbcbe2c20c2f70726bf00a42755abdde05764cf60e3a5656a730830bfc7ff6944e10da63f23e29ccd8026b9a4dd2dadc5962120bc30c2d70e6257e3491ba176664811f73f75329699bb51d988105f6d4e5d49583c7d28db760c61558cb65a95c533251db92608615d8927d2a788cfbd6f72883c78d31a30a7c3c73511ffda702bbbb194cfe98e050433a72a462831953e0dfe4f65c2e2e0fd2bf1418b96aa2544d5dcad1db30230a7cb25fdd4cf96453a33dda3052d0013d28f8c172aa3cb1242d42cc78022727e9d3a2b6a6248e57c68f6ec20c2770620cba9bcda44a98d104d6729a96d82787093398c098ccff1f732651d641e6862561c61238997276cb234d9e28cb8e8485194ae0ea358a097e3fba1a9b9104de2435a26bb44bc30c242c5adf5e6742bea80c338e60caa51d2645cd124c439b602769ed1c05c30c23b0d7f76be1fe6e9efc22b0b6299e2df849dfbc89c088f0fce9639b9ad664087ce7934491d79f59af324308dc99da92fc244f30182f292993c9eac4cb3b301851974ef4a5a73cb9f30bde7352ba93abc6177c99e4375ec9e2e68fe905278752925c25575ef0f93944e9135a6de4ba0b4e68d2a3b3094a74c1f787e79283fe93e44bc905772f6a479f2c5d192db8e03caf5349eae52dd89393d063c24b7d8ecc169c9824359922a3e8cdc95ab0dba5b6b172df9b9a169c261551aa2bc876cd2c58f724f707e15ff275ad031f3774ece0d13a40810e12981861d48fc1a38c06c882fbbe8d232d9b30d9772c181f8bb9531a008bc4b29b2497a42727a5bfc224be6582d0ef49da159e7c63622a59cd5664f2077da2e9ac398eac3899b6246d7ad5ad0c1f377057c197144b52b92296f4d3d28406a882931a524f0ce9c9a42fa582cb5e1dcb6ce38dd98f0a763d4591ba1e2abaf753f09baec24c16edb6256e0ad6838b3c3998f5e7f69482f3bb54cb4a4d273587149c88558799e0a32cec51b015f54b4ebb39dda64614ec987496a56a28b8d4494e6232f9ddc80b28d8ecd027b54575f03c7890821ecf8347f76081111af009fe4dcbd5629027384b4227758237b54a5983e70de0047f9725a65841b34f256d8291163a86e8ce35c1297dd5e0f17fc73fcb046b4a450fa5d2f6631e138c108f79b3aae8e827e9126cee7fca0aaffbca794bf0ea174a8a3b9e4af0a572ca11327593983594e0f2c63b39eae67fea49706eea452d8a9262ad24d811919e7fcd62f84623c178d4d7101b51728a20c1979249ffc494fa43e71ec17eeea44decb48e60df4451a2fe08a14a5d0d6804632926ef8b41c4083628d9c4cf6ab2b4a22868c02218abbc92f4d7679e8e14c1a994c44d72ca5c17539408be74c92ee527c898b70a235d34a54c8d2cc1ef6530b9cb729a68f24a704266beba730f253811619622664af5497160129ce5fda714111e4f46129c0a9e8470b1ce1db144821725df4dec5d4ba80f0412fcb76ec7f44b52df57208f60bd3ee92ddde9691c3e72e828838741418f1d1c30012c02c4115c2e49cea74193ea74231df80e6d04a374ca70bf7ce8c841869e0f1046f09d37476f074f693d090eb51e3dfe068f26431764115c86a693d5493f8a8970a8dd50d3914304990344115ced7dc98ca22f076d72e373d03ed08c0a4012c1a6bbff52d21be87ffcd091a37b203b1d8020824b4a988ab13f49728f6a0b9043304aff88b76e6188c10a1043b09a54a576665b082e49c1e4ec133355b5150a1042704198f6961c3a259db1417059bbbe7b4a86132082603ff9a7206c3b9d091a1d65eca0044820184fcd59baa485fab050122080e0a4f509ffb63e53a74104c81f7ad74d27e3c80fac8e2e557b29ee49361904481f78535a2a5ebfa160f700c20776773c59fa0a9e53529903c81e58cbcd3926a9a0ed4a5a87067c348e12d801440fc9936b437cd5b28203903c249a1853df01081ed85319ab36454bb2575f40eec0e51cb373ccc14daded4c4f80d881edd0496436258543edc7fb3865f8b8d18663e4f85146d681379196a34a929553376e58b209103ab07963462bd14aa7b18e473990397016d59224b8c83751397840e4c0ba65101384bc6c2708e5b8c1831f3a3a073fc6f7b86b9038f023c4c45249ee9cba9101081cf89cfa4c49afa6e29edc486000f206b6a44e49d0315da154d60d6cca6f5fa34ef24d17d31c5cf2029036b0f99e1d4ad7ea081036b09a9d73a865d1c9b2ee9808903570298666932bc858524c1b4b80a8813b75725f729335d9ba8b0b9034b019c2d35452b2a6e97d472f40d0708eb77b42c9ac39433a733a77fd1e6f8098810fd966a34b2c65606ff3e6b6b1cb3565ca01840cece65cb7eec1635079f3fd02c818b87c6fa59fe4741db59476ece851823a31f029a54a297ff02eeda91cf9c3478e10a0ffd163070a7cbc0f159402240cbca8d378a743fbb49f80815182d6f50e356a4afd021b6410bfcc9233880e03205ee0a49427a8cb495da9a959f009902e70c9c642e8d22ed964c805decbafcf3573d01f3b1ab061432d12205be05492ea4efad169729203d102bb514d56ced6affc570740b2c09ed4de963ea655651c040b8caadfb14cb9de9f2f03c81538a11b6ef2999845e8e6060ede879ae1008815b864b1aeb5d54d5a1dfd8e1f8a3eb40aec49ee6ed2bef8bba6763b5670e702102ab09f94bcf1f7205fede4861640a6c0a6ac7f92dce51eccb3366cec0d2c804881b5169344cb6c13f2b1e387824481ed1e252f6c93fc2a323700814295a5f299ec9b82fe06fd030548049027b0eb49ca166ee238d46ef0a0c78f1218fa30ab018813d8bb0c1d409ac0868abb214ddcaf8a291b35d091a3063a729838803081f3edd594246142f529c11e75005902a35a53a614b7246d9267c7184902c3118028c14c777629345bdef4469a6d8f5f9024f0a13b9f8ed1fa242979923b8020813ddbffb3cb5162ced311d87442ababe60f16cc64044e446f2c8effef054dfa02a408eca7b374c2a398203a2270655f7552546915eb4186c05a2a131332e6da8f8d437b7c42cb0211026762c94b9deb1f7b8482c18b522738d4d006fa30c408438c303c033c701b366e945d2f1c000cfe43a5b5b20e8ff9f52f38ad4abad2fee45391f1059bf62453f064740f0ed8b031465b2fb854523cd1d6964fb88517ecc7f64c2926bb0bf6dc6e2d944c7173864c060ed005af795a83cc7bd1b1c3e80a76a42059c16b0e6cd8b0e1805c7059f5fa3b9f20754db8602bb38bf230dd820bfd61bfa93cbb09d982bf6ca13ef7e824ca530bceb6e4e86e9baa849a167c10999efcb684f27716c9cb1a73a69895059b4952e529e717f54c2c1821577bc36df75f58b05a6a2f6e4c32a78cbe82d5fda4444b962bf80fa9d94c4ad20a3e68eaae7553e399c20a4ed05df29992bf56e52ab83777cffbb9af27a80a36a47fec6892782ec1940ab6abb582da7472474ca8480755b2bf662c9d824f6da3593d499b4fa66094e8fa29b4e49125540aee4e29318b8814fc2795a4e07ea26d39a3e0a48da7366a2d0a4ee8ca98a575d99336147ccc9d4bb54cfa681a5070a9c4e49b2c66c7019f60e4d726d5ee95ad4a3cc1a567da942d669a7782fb6c6665ab27d4979ce0f47b12d362aa4e1137c19db463194c50326df69a6034a85025cdfa4c702698eb47ab8e31acc704bfb142d5a5d8da31e7b41c7009c6456505fbcfd9b46f09ee6e74fab4a24af0490a2a968eb9a2a6204a7055e9217cd44cd43e09764c7e4cd1e48a345949f031ad5a6e93a4dc7223c17b5a6edfca7184d04082f10cfbccb83e824d5a9e49c8b89a36ea082e9a581e75268de0f37e0e0d39a6e1298ce03efdc99654052d82ef20ae1df2838f522245f0a54c728da574899e4489605bf55d3c88e074693593e1a5748d87e0ce3a8f0629d252c5107c8a9e6f264d3a31af106c8dfeeaa90c328b0a1182b7782abdc8fabd3e0d82937c7412efdefadf17041fa47a285dd1d43b0f04172bac83ad05217340b027f8757709fa1f3e3e070ef80327e35bd0a692e4dfb61f18dfd357bf0f9ca035babef8dd5ecb07c67e3fb58ecc1ef84ed32c71a407ceae629dd0ea6cca03976a694ce82579658207c63ce8933a560775953bf079326f4e1e3bf075415bc537ebc07ace13c264d01d4007ee4c85bc24733e3bd11d30074edcbcfb99ba7389cc1d2007c6a44d933deaa978ee71401c3821f367d3397338f031d47b8d5062fc36bd81516b4a7e4ca36d16e406fe46e9d63c1363babd0dfc655139aa7336b09b5f25ba41b532be064e4cd00c9d6412847dd4c0ed9858b0368d3189a6e1aad1a059538a0646f7abe468a69d7d39031b2d55faf599c59262063ee53be9a9c93270f92e5959289341956460ff524e791dafe278670c6c6ebd492645ed3cd9110327e231492663270cdc49a75ffd4785d6ea8081ff4d26655a12ca46a9bfc0c82064073511769fd45e60a38ec8a0493a59b9d45de047e5d51a9961b1ffe6029bf44c4de50fa14e8b0cfa4824e1802d701b7a416e4a62d4d16b810dd7d2d5a0d4a3fa59e0b74ec68cd56381cd329d43e465f6a02bf07f23d4da655341075981b70df66e59af02eff6c1e44beaa602e7398f9fcaa5baa1ed2970252fc91774ce13f2d252e0939befae49d923941d057ed3a7784aa91a0a7cd01b16ade468e6543f81f798a4a5e80a9affe40436a81cc3ed04396a4f4d604b9026fd5dc610556202970411d56beda1dd5f426f4992570257aa437ece124fba93c07fa7263b4b6fd24448e07cdf9457d6cafc089c89d9635f68bfef8dc099f4e3ada66392c4bd085cd44b9d729299543880085c7eb38cb17a3d95d60143e024991ac3dcf5da5c070881af13f116d9ddb1da0d069b3b4d544b122a99bac0e0f3424793d3aac83ed95f301a4b6dd46865298aeb0bf662daecabdff682cfe725779b92b2c46d79c198dc21ffaae42427fd2eb8de7a8d9bc41cf27e5d70dfa5b3b67663879f0bb6fb52286d4d2b13c2452687ab7774d12d385da73df34b83d0215b704135a8e059ad5f3ab56094fe7862c7cad5e1a105d79b3a4c8c496eb1ec2cb812ad19c392dc599705279a297b7d54f3a089059ba4c9a99d4c56bb0c2cf8249a9c83da5c7d5dbe820b558d1b9a5f455f9596a0e10a2e26e9275aeb3a5334ad602d6e0e4246f51cb36658c1fa08e55b23c355b07eb209161aac4c7d55b055e9154d253996284a05179a4acc24392ab853def5224597fc4fc10795d37743c70f8d29f8349eb3ae5b9e474bc19a9a955a97b2dc0e29f84e3ab37f7f346f47c1f8a6fcb24b2b0d51709ed18312d326213a46698482eb9875d35510e129a33440c19ada91e6714cb8892a8d4fb0a3f5e45dbcdf3551a5e1094e0a326e7a8edea9c4687482d1267f4c69514e706757efa219f3ada99be0d38269ee9910fd996a82bfa42ab782da9333a599e0cead7cb74d7b4a29c5047765194ad0a64b7051f4653c93c6dc9b50e0b256a950593aed3ce70791277015d3b9dfaec8098cba922989e64c2b95d38492de4b6207b36b0f224c6084454b973ea618367c882cc104224ae0d3c6dd98bf61f1b22e1e2249e0eaa2e7e69c2ac68f3b0eb52282044675d4742a3c3d3b96e050d381c8111825563439784e278949fe79249a8f05818811f84fd5226d4c501b998243edc60e64c5072245e03ce46797e41b3ce989c09d7b2c57f5bb8e3169088c3c1d3ba407e19559171182296d4a6a9d3cc160e36bcea31f3bd5540d0c3e878efae9f81a1adb5f30a226e6d2a3e4e5a04f7cc1e86df224e66f1d2593bd388e07a1f3551c515083178ca66e496971dd00076cd8f8319281448d5df0a2af64f44cd205174f7ab2a4e4ea859f0bd64fa93031b93532967091d037e9d641ff5b30322695c1cd04d9824d266d072bd3649de46bc18d59884a3a87097942b460e408af4bd5b13f799f05f72596a81d43e347d165c19e8e49a93758e8744f2cb8ca360dd629ad85be61c1c594ebd2e9e78f19ed577063fa22538caf2bf8b498eefa62eefa7a5bc15bdf8ea796969cc76505379e4992641b2585f29855309692ac96bf39aae02e3da3e6b849f48752c1f9080f6e7ad544e6a082d3b4dbfd62d253f89d69632c7526a6c0d2d65d36192aa5e0533ecbfa18e3a9b714527099df2ca50b4d8d3ad61805234fbbfef92745c1e8a7fcdca2cf24992443c1554cbe95735efd354950f09f5344736c0d329bf0135ce8d0fcce1ff4045b395e657fb5d4de6227d80dad5c163da6cf0d72822f49e53c2698123d4f7013fc055552faa43de87e4e137c0c91ee55e3f7a5bd4cf02725298e994962af394cf06939fa62ce5c823539abfb9bc9a6df9d2538592a3aaffb54da5d094e4caf59cc4e98a42625383b319e2c3de1968493e0c41c2fea7626094e50b2c935421409fed2e73249294bcb3524f8283672a389d193245a38d47494d123ed118c56b98d1a9daf7f47477027982a193c8b8dce4f2318dd62aa26985785a83082b70e6a774dbbff7f76118cd071d426bdba22584d927439f2ff922ed144705fd97b92fabb458b228213e36f7bccde92772687e0ce544a1ea326a5f74f43702d7e621453df154db04621b8acf427878810bcc953f953532a932c85438d070f8231da7784c0778cb163f4e320f8f85dd194ea917ea31a82e0b2c432319b7725133502c18919eb3ed7aeaf0b084eeaecb294e63a3a6abc448d3ff0a1b2494ac7ca1d744cfdc0558956dad4ea21abb5448d3e5cab9693505e92207a53830f9c784149f28999e3503339ba043e74e4e81f3ec8b81a7be0a44b7d2757ec14256ae881f34ba2bd72f5c9f410d70c35f2c0a8379deef17227f9cdbd49d4c0438d3b70ae3178fa9e6aaf5cfb7bfc40418fff31dac550c30e9c98b7e4a649413de524c90a76a4e04560c346f2861a756037b9e5f1d0bc46a2061df892731aed3625a6fa926ba831074e2ed1823e935392a7a46bc8814fd57a1135e2c05ad26954104f99be92706063ae58d2985935dec05ec778994bdff8c9478f1ce9c68f1c63f0f061e6637dac076ab881d50e4b3d4b511c6a64f80e6e201defc3688d367069576dda6e5f49df5ea8c1062e28f10cb6fb5595693276f88f3248906ca1c61a38d10c99741cff98afe7420d35f0e6f153e70f7da6c54b83963f98c95da28487434dc9f016dca2061ad8f5f73c4998c8933052d0010d88408c305810460a421046d638039fa6c1f394ae92623a1c6a7664780bbed00435ccc09b9cfbff464b12735296815152965de5b714d2c431d420032b4aa7249a244d63e0469352a293a8ba77480c6c98862c952b7b1a1907438d3024e75b8c0103174268cafcbf5143a9260b35bec056efa930b5bc17d81a9326ef49522955638d2e703e5e82974cf209fa9a26d4e0022f9a4c4cb27aca16d8b09444587b92dbf6d402dfbad72b4293184d7a5960c4b3a69493e5cf582650a881853fc9622532c7ce50e30a9ca4a4646e52f95ea69215d850a3eb4e92b26609aa029796c2bc4653f4efa4022f2a8959f9bffd4e48a7c0e54bb9fcbbcf043d1929f0ffdafbbde246811152fcf6ce63ab09322870224b92afe2fb2731b927b021849f20476f4e6053ead89525d9bd046113b8ffbe24a50da1b3dac604b6bd2441c7a44674ca9425307a349bec2564a7125325f019b5945827a6f6932a097c901e363af675d62e41025fd5a92a566a643699237096513fc95fea1a46e0a493a4969c775af5536a1481cd59deeff7a62da72422f07e26ad49efe3501b03d5180297af4daa53a9a9210456efcbc4de4c06834d5236d1434781c19a549bfab972cc5bf3177c3e256faa989e84f2135f70d2552519d3bc54e8d60b4da7355d7a53c40bf69385d0e6a1fe2af8bbe09424692551ab4ed4ed75c1c7743a7ea8a04c565273c1c5ecf2ee8a49d76b0c178ca57d92d49a8eba93bd05f77973326171640bde3cf52993c4249b68ca5af0dd5782b4e0f4b9491bb36ed221fc5930a25373559294820891056f365631061df3794eb91c1c194262c157d0ea776a3308f9292cf8b4a5c96292db4484bc82919f469924ba497a3b5dc1c5de6cababa3712f492b6c0621ac60945e658ec9f362d2dc87ac82ed91565243e7c6dd2144158c5a4b6551ad82d636157cf64e7143a80dab78082a582d2956e7924b424ec17af274310926640a4e9f24b8b929a1b42c1d21a52843e7a0b3b796d2e1c1df20ad64134248c15892547d7da7d44b49aa10320a5eb54f673cb929448828d8dc55cf49304197322d0b21a1e0b37e92d726090f214fa0606c44b76bd569bf2df904fb9de40bbae2f59e4ef1045f923ee9446fd9092e9d8e1e64658db17ce404b7aaf74147fb0c316d82abeece599b2d0e144d70419499942c893542da99e0e434951a2aa568ca144c30e241c52f593de5f3521222e4126ca518633e559324a5d496e0a4a0f23796076d3a2d95e0648fa37247b1e4d53525d8f11c93db93d0bf10854c827d4fa5f6829b982c953052d0011d8f822f03073974a800c78f1c2cf851c68e1e366c502144125c67adfa553c1d8f9748683a752621541248707a8209b5a44f89a15b0b44c82338f983f2ffa09395961447304258671e21930011d2084669e7dd710de2504b3b14878ff6406a0823b8e829ed7470cf95565a04ab5e67d79b92f59bab08468e59a76029329b894904d723a679744f29b95410c1c5ace9c430a143f0258690259fdca2653104277e3206bb52eb5116828b31a6ca9c2284d22924049764514147d7b1d3a80d82efb02b99daad5652b28c10417092ec6f4ac9b182456f4302c1dd88bb496dffd974c90d238400823795597143de7f60cb634a924aaae2871f217de0febfa397e42e21840fbc058fa12c8910ded00d7821640fc9a949348d5e22aac135e89b5c319909bd64f941881ed8f4efe1d726a5acebe40742f2c06d2a7157ed452fbd28040f3342ee1046881d2aa40e638cd162d0610e140891830442e27023078f0c94a046081cde75ecd07123070f0784bc2124c40d3e78f037100969838fcf91019110369490358411a2860384a4010d3342ce7023012166904048194c08196efc6040c8187c7c0e901031841112869010303820e40b0808f142dab1a3078f2edc48fd632420840b3f76ece85180902d4020440b4948167ebc8f1b58b8918347067890fe35a080902b58e1c60d1efc0d4442aa702324840a0a0899020e1f8d6324440a0f0889c20442a04023e4093c38379cd00426f82063093b52034294e0e3878ecfc18724c10221487040c8118c1081902240208408120819428810404082e1c3c70e0f2c0004183772f0c8000b44407e5101105fe4e0910114d000e9052fc200d9850fd4a375f03d72f0c8808f3176ec28c108882e725103041733406e718306882d7c3400a41634406821020380cc220120b23800482c0800020b4e6c8f3926138458f7e504905730766f7fe9772daf63aee0635aea4b0fb6c11f5f0313460a3aa0810d9001d20a1056b01e4dc93ebda3ac360ab20a3e7f7b499fd52dde5e094210c6085e70030520aae0cee2580eb7926f64387ce418e39401920a2e7a3653f6b7b5261f03082ada37c9ec9498478d0e6401c8294cd67f95f2e7c6bb8ece01ea3253585ae117ad2b746671688fff91c3478f1d1ce8c00d1b3678201e2ae8f13f7494b1438c313a073bc8f813e820810d1bef237d8f1224037003482940487120a3380665824cd79b4445c1aa26bbd126fc6e8416871a48281895fa2da3c92c0eb5ebf183070828180bed1a2fed67413ec1f899244553997b8233d56da3e2c8403a6136403801b20946ef07fd298f65f5276982d75ca272840611baa64c60825192cedc3ccabf046ba937ac0f4842f1c5e44e23203c00096ce698efa6b4c97c27fb8023b0177a23babebb2a77d0038cc0793ca12698d81781cb799d7da287d0a099071081134c12efac62daf85732044e599da0194b891da4e50142e03726e9977694c611058393cc73e88d6f25e705189c585265d73dd35fe52fd8cc9dc4bdcbf94fee0bb6b5c4a04cc772a4176cc9cf959bf25c64a54678c1e811992663a72e533138b414c7c82e70441766c3e0482e8a315ea97fd5ef366cf878ef51c60e1f62e8c8d138c4b06143478ec6e185115c3496c7df4cc6334138f43dc7183ec4b061037d0e1e3b3c077f021b3672f03dd07afce07188915b7095da841079d68ecd00099a30620b6e2fb7ea6ee894ced75af0dbf6a3d6c71ca1c58dcc829317541e19843e220bae4dec526e7f2cf8f32c6a3f29999643040bbeb45992e935a764f20a469989b1e3e55dc145d5dffc24de0ab63d2f95b9e6ac60ab63dae09736756567156ab032bb8ad75105db15cd2dfb6a77de9d0a46b42f2d73f46c26d7a8e0dd3a0537559258987b0ac6db43bf6b8c9a8233eb9cb5a4bf905ad152b049e52ae52226a4e072d2294a6a32abab925170f23ac949b997a4352aa2602d357a079129a1e0458a3ca1a3df54731214ac0769829b4c59f519fc043726556cb711ad4ef1045b310942889dd6d4dc7582ddd54e27c59337fe6e9c607b4dd268d2a64636c126b73729b3da3ef465441366a307239960834a21325e05a1a007096cd808c20826d831594a0c59a5e492e518462e6136d08825d88e2769e8efb859c34825d851e739896f3aed37995182d3ac7925b3ec488c4c823d19e36df6b7fe92948e1891041c4622c15b5fb2ff8c6ee29f8104e3754973534992ee7c3e82d349594ccd973989274d8811477022636feb07bd65291b6984d918638411ace6e67c72060f32e53db208c6da2f5989162a824b926c9db693fd5dc96a3092084ec9244f2cc97bea4a58b4308208364cf8e709f3ec594587e0f6c646f52539e639c5105cb0249b56108e14829374759027b5f5c352cfe1a3cf11824d3244533e9994fd9f1a3132082e6a27d5f9d48a5fa97168598f1f3c94302208fe649f6072103d1b4602c1c91b25f2bee41c94d094e41323806075af62c8d4232cc95a1846fec065cd5ce5553298162d31318cf881f352f6a64f12d33878dc50378cf481eb8ba724d9f4bb499beb60840f8cc5d4ac39553eb207764337de8526154e8ce881933f53d2697742438ce481d329bbf6b54226008218c1032773e852da8234d9bb0388913b302a4a87c9ce26aaa2e70e2376e0f54cf6f426f489a1e78ed4818b57c16d57e4a792d27448924acf2bf46f1a8a9139b031bce412d3f9ed43732372e0f2aea7fdcee88d4b8cc4813d3d99d13f9a3c46e0c0a52c8b7d9a72cecee1c81b58f72a5994acbea0c42438f4863137f09e34c4f265cb1a5a0e32c8d8e1628441c68fc161a4200461e0f01fad8113884004e67a9041c6f6481bd8a4ac7793d2cbcb8af7f81c683dd8c09e5af656763d29e7a00e1decb8d163c78deed13ccacd61640d7eaea4d735c9a91c3776a03c398ca88151f904f318ba5dd3db869134b02b1afd4673b0f8a68443edc60e8423686084e8571f19639a888c9561e40cece79433c97eb9c55246861133f02955cc4ba93db5b3c96462a40c9c3e0f66da04fd217b632c31420646271996838e08256b3406364b4ea73b0932e3e51313236260446a4c8fb1b763f51f063ebae8c7beb4f9aec42b3102062ee564594afa2425dffa0b6ca6cf98ace437594c4e61c48817d853722cadc9566a84cc2246bac0e9ab1c5ef229a995c47f8c7081b18ca9d225a5c42475e806235be02e692da166315ae06a64ca12f2a4c8bd71240b7fe5ab984feecf47ff0946b0c0be595576693e93638843ad879660e40a66c3062356e0cb3cf877501a138c5481d131e4c94fe9781f2982112aa08d1b9982d9b01129b06d4a9fe55c524d5c53321205cece4eb2304b82022b7a4274099eed76474f40b3ce82562eb91338a5b1832e61f126707ab98385aea669d23281cf1342f4799a27f9a34b6037a5eb5ea69ce378ca8812d8b437395d5d5012d84a72527a2cfac9ed20815dcfa76485ee9c61ffc811f83856b91aaa937812f120a3078e1c310227b6ea58ce5f5257770d8c1481cb95849e67af1b0bba1122b09e25e546bdae52e522244686c0e7cbb6186d93a8b27ef0e0ec8f3278e8f840c9c08810d8bf1293499e1aa3ff2d120cceab52d0627db9a47c038337693c6db64ae4178c98baadd5b7df03115fb0b9b62fab92072df19422bd60c7b209e141692d10e105a319fab4374d9f527fe92e38a153922767934ea828a92eb813659a4a503a9ede5acbe582d3b16a3c9518c581a6c70f1e22b8e084c6abb2284ae78b9d5bf0d91b3bf589c616dcfde8e793ff594cda5289e09f03366cfca71e9f031f9f831ccd8230c420c35b10460a4210460a7cfc73800c6f818d058029446ac1263bff134f7a12e43efed38daf418fc6e166092d78170f6d2d55a9b46997831b22b3e0c3c53cd5653d52a043053a48803ef0cf811d291091051b33d6a7f292b72a44291089056799b1c4b22406d34188432de19103870f85059b24dd92824eb2939c0c249c107905a332e7d239c554e5903e42c415ecc95499620a9a27a36dd82884482bb8cb4963d6132a4a3f8a39b8b1e3c70dbb80082b38ed5f39e992b4b2499655a4b1df62860653db2e5105b7b9f12495c4ce4a376dea0f412ad8245ee98fc61e2544a6051154f0afdb5563c12bccaae41466830622a6e074ee1af55972be49726220520ab67ad376d29a6ce3f7a4d8b5b67cdb5a1f397c07ff68c70846c10932f79baeec25b41e3bd28d5d8188283831d5ba9f4a9a074442c1a5ea2a1db5e3aa49b11c21d004147cfbe572d1d723221d37ec3e5083d640623f7ce418235920f2092e08abf6bc29fe6ea38591820ef810230c31c220c35b4086ef2011f1045b1e1a636bba5c915d27f8ac19efb7e49276f2c509ae4dfeba8d16dd045b7b62e22951d404a76308abf1f466821f35d3da27bd98e0934cf9c4ac3697e0d4e5f8769f5aa3a8de129cfa6675b76c578231c9fbede46d77cb9d13885082172d5a2dc898d7a0753419377aecb83109ee725413753f25cd8ced4044129c0e2d966e9477d6ca8904dbeb6a996a72b39896051148f056e2bee79c7e049fd3576f64107a53437806114770b1d4bf27cf26d7db46914670779fbfb5a40b8db184117c8e126a648e3a4158bb0846c3432715a2135104a34a2f5b35a713c157b4cff869d9a4fab38c4104117c66a5248f6852c14f120c440ec19a8dd9096dc183bf3a440cc1c54da904a5aa1b3ce8d13a729c52083e899a73d27d6e8fe7b143c710210423ac62129ef1ce20880c82378f7ea5f7714130a641c9ef55d287854920d87c26973a6f9346ed06109c8992617ea1fcd7b23f301ebb43059d52ce10323fb0c952a536d1174cda7de03254962cdd181fcc2798d22066b27be0b4b947139a6338d46eec408803113df0572663925a59eb047507b23cf0a5a4cbd16972c614223cb031d96591d5eb1dd81883129e6b64ecc05645abda1c54dab4291c6a85162275603d5e123359b68e4a111d92faf72c5a96340740108618617880073d761c7483073d7690f1642439109903ef1e83f664d993ce6c0361881186b1b25d88c8814b22b46b0c75e3c09f778a41ba499941fe70e07f3cd3b7c43aff45dfc09d5ece5f274d67f1de0dbc8a302ded9ed5e4752ecb20d206de54da9aa4fcfda2989c1844d89076fa25bfa0ed35f0a27674b224a90646879a6cee22afb3e7d3c0a6df93745d96a081f54c2986d4763fe93e060c2267e0b6c562e9fc61fa352562062e43ee9b92c2c7824819f83826f735f858fcbf5c41840c9c3a416bb6103ad8a78ab182c81838eb0b192afdc6ce211503974e2d57d212cc5385641009039f5f74a9e5f926d31e0c8cde161594ee85a554e2500b83c817b830a947875bf01df705225ea853675e78d0b92e70d2affd45875a04112e304a0ef6bfa9194aede6cf9f1b25b1cc2844b660366e20a20546a3e964927de87d93e3504b4260d2042192054e92d5839a7492e94b6ae22258484a2072056e94b4959f17c44f883844acc049b771ac76fb245549912ab0654263d0ecb5cae6d0011ee20e112af027678cf741bf28b52422536045ddb54eea9bfadbca0644a4c09a9292d427a8a0848969c42312055effad3f69de1c5e8ecea8d430455269281008c3e17018043170305f007313000018141892c642a158389e6b8af403140004502e2456302e1a201a181c1c8a04c37030180a0582a1402810000502a14028280c4bcb15e5012b410b5ceb89042187f93993d85d140fdc05ab49609df91f12296db48bd59eda01b1e28d204fee5335cf61a073de20c10c282e25ccfb262a5bcb656404a527db7e23519dee78ee6b0d65ab3e55e79e4afecc0fcfef5569c172e7af9f338937b00740f9090e959b616007e45a8838a00d700320341a08fabafc451e0a1cfff95108c11dd45e57cef35f12f99236c4e07e23aae7c50fea5e6946110c8f94123bc17b04407bf50d7868c33274b0e57f200ac0ad56f94d9889a6e94049e269cd9e101fb313405600072c9b282ec13365663ab9e517a2860b3d3be7b7159f623d7bed65e04bce1ee79901838ffd334767d19bb4608f6facead0eb0d2cd94fed4adac97caa15c9460c39792636d4fb3e6ea3470fb872c9839ddaa204d0a2ef98c9fdd429d61bee9b5f56b0decd4daa4f3020d44b357bec191a3fba42aab23e575281eac4aa45ede540eb19a35cea860b63ebcb04b4227dd4fbdb03bf1a35a3a7d42daf37bc9ee2ceb731e84d1d26364feb2e7d04f742a8aaa8a07107e12c3e28cb8af61d6a42a10aada10ac12e9b7197946e5f68c201e8408e351d5e9041f909494f6ed7f78fcc71b18083172986c60490da6335046e199dde4ee047a666c95e6b04b2dc9079219213c94e7afbf6481209c4e0efad215414a49461f34d5843afbdcf94e3eb8830f93f7d2846af9f6c2a0088a40ba7534140f909203749ce89b1b450911759d347be57032614630d893be67e42689acf2f8dc6319d170011b7f5e643d0a7a67c7dc9659c48817270ec425e2dfdad8b310ee32bdc40ce7d1b023ea24f93efcf30b41004ebf0fb06bb30cba3ad0e3bf90de6e61e3f522f42deae4edb2f504475d72c1f580fe2ad1910fa2be8c7aef9ec130f7b2fb0df73d58fe31679d0dad2dfed116fe5a0861cbb4bcf30447427a712239cd726147f36211e0c2c98dc1d9ed433d8ea88296d9e36d7147060ada48d28401bf4d94c983eb665637de103b1d41024a7190aebf7bd8c40093aa7d1cd6e86cfc92646973fbe3ead7267412c8f59ba9533963f2c33c77d4843f177ebaa14da3645b5f8de6de6299ee285e3f9bd8a3759e27b40c3e32afad090a97809f2c9a822b8fcb345c13988392b04fd333592c5cefa3853e5a5535e33918ffe8d1cdf398a8534a37b662c4deb3de811f988e9742cb8457fbd0586e46defe885f7f2e06aba6e0a6a0397b92e3563d5664e4358fb6cfb531ddbc12e3e6679bd6029bb781bd0db0ac450e23cda64fd40863a5927dc292c1cadfe0bcd2e6d479b8a6729dfd522124137903d4795317896a9766d5d8d5bdd19e80a090c4f121903b96bacf6ab4966490c7aaca4d37cce3d97ebc330f819ee1037c587b6a4aa37b0ae494e9c5e1ac9c76e212b78c07d3d39151b916e6491d3cc155dfb5f0a85ad8d66982eae830306cb2a1a1cdb9dd16e0cc45fbf2c66b3bb49b06bcd18c660474a2440a30072fb5735ef6a9dd75c705405c6e34495c4db0dcdd95e8b9098012527f60bd0c6fc462d8472a7d127f06b8d8d2c83e41eee2243c47f788dbbbaf24e8954ebe161920b840b21624e94591cb9ad145799c510778b90bb8ea88ad31661e76a1540869149760b53c5cb8d0194aa5fb961586fca6ec8dcfa506bd0785482e50cc7aeef91355e9b655de81c7737a9f9566b18aca1b8e2fc3f0b810558fe8e5bad26ecb2edcfed1af70d20e177fbaa3ce2efc98a1f31bb93538c6c293bcae311df40c56efd4a7bcc31bf36771f880a84dab7edf7c8cf334490fd52f759d6da6825f5d1e8bc1819f36313c58d1306e55c5f41fba318ebdd6185904b99348beb82db2276c88c4b11014631fda20e3d8ef4197c54fb4c621dadc1863e502f45e126bf840230ef22d5e230ddc8d834e733a6996312cf85f6b6225262218ff138e12a4328921e2aee5eecb41175a7c8dae8b5e884bddcea219e67cbb1a6d2a943408d509d6a67a7d233614f576a84d6684207c6c10be23335e553682ae60bdf6af9ce1586947a7f67e55122d97cc167538b84a08be56e3de910a947a191edb50e6668b6f314ba04770551a4e6f79e9834735680fdc0a7b6e79774bc413e1d5cb7ad05938ac9fb28e87f5f94fe54de9345e8718338b938a53fe98b43b8841d2960911ab25938d0cd3687111dbf4fc86cff245b65199f71faaf6b5d1559015e38b42d5f8d53744311308ec26eee79f86a10623d8409417dd4024169ff0fe2582323bddcf441217a57a108f936e168eec2c1383d558e16cc8941b73c113910816788ba3fbb8ef98c56d9afad909232064b8ba20d3339d2389ca05fe0da9f8c4583934c301bc6eca2b50e3c3c960fe941deac60f0bb6a2931322f205934b12b11eedce7103615bd628e8351c38fc03d7ca3575d58e1fff1665a452eda103053653cbf35f501cbb51d3edbbb4748f36a57314c44876a6fc31882aa27cc2be47006918a01c3af95a790a5f33b306cb51007f1a86d07a8b4148c071b6bc640fabedc8f470be4a6cb0064023c38f5c60908eb0808c48169f4b853577a7e6b91727d477dd7deb8fa5d8878f0511762ae3c8bd0634b8e8a5a91c3f4a07416b67c07165085b2078c28d00502a99646dc78918ef9757e45135d46839f481ae61fc188fd77a5e503bca7fd8e86badfd245872dd0aefe4a1112e5198bc016bb7e0752fefa4e65d858a40e352239cca58925b16f28dd5a8aa1e109aabf40787ed27db30ef0afdb5eec62a1f89427cb0d2d95190f9d1be9e913632467918328cf1a9c952b7ca256fcc79687bf49c97e05e18d2e1c93cde32fa57ea0c73306ed22a6b651c44f18221ee87cd8f737dc1709c79441e64306f03869d6d0d13ce03c976dc9a889052ebd94293cd86e3018c99c0796c85700565917165b557d61f0397b9df336f6564e40e0eb8d6892cccce3771d2dc5b0ddf8010f0b26ea59d00f5f88953eab86cb77f67abcfc365485884e1d3f2a0de4769ec6168ceaed12027636cd6b349c16f325be3fb195a0cb8466dd0f7895ac27b47851ac7693a52fbc3a61b890788fec113fa99485240ce5824f78d08a9b411546b072628f74ad1d860c0d9dc12c6957c939fdc1e022698b4a580e037a54913f9a008228c21d609207eb49764af300f20cdf3bb3a4d2205e615dbc4a3ccfad3a4e423c86ce891b1b9df6b51c2a06f74b00070ae45a29ebbae188b1744b5e7a9b79eb868e4725dcb5761998735b77e122aa6c2d114f3f7f711877c3a229a630ff2f8fe61dcefd3efdf44a77b203549772e66db295ba709b862774312807a22cffc8c9c49a576de7202332d78a5e69c352a6e6d8295e6ae5192d5d896fd8da7bd1a7a3a41a0473e017461a4eb8f528d7c3c9ca6ab419547e86adfa3a5f6958080582f2b155d914aa4170845d6302b16067a7998fef993a10c08200d3763077940cf2d40dc283071132359d6b183dca58073748dd0218334536b1fd2d1029fe6fd2cac30407f6f2c988401eb5a791951776d247ffa333def6b19d8616dc1802667398725197a548f97f1285d6d4070ac533c9f37ad8dac47418de44b559d124afa67d38a4fdb8d9bab86cde6e7770919bac6acad02edc3bb522a1db29949a5aed1409e99d03d1610301829a687342073d4263125c8317fb335f11dfc8db34a0d1b29d9288a6745f9ac5d1dcd9c4691a0d845ec6461af88fd90297acb0ee334cec4ebf900807848d7b59128be4d28cb1f26b0de77cc88e358f7050d39c9798347b69d07b4066c04932f0d9a825ec1dc382c205eacc4438b489a840ae5a30b05140f161aaf815950e23e18d54a7b1099fd852a450857e1cdee158564d114ea66265fc756dc48d5aaa75013ed5dceeb3c80be74ae7a7870964dd8b139860381913a50e1b792e8dfd1a60f8e33d47e627ae3c2b52e2f43559d7466e0dae13dc1e0e76e0879706cb46c77ca85be1fc9af4091987f3137e34b17c1ece9f7af60f370d2b80bda2f31423c526c739de0f409ace1b227add63311bacfb91cdab7f1c6dd32013900d0641069b3cea81c1958bcc3c62ca078db3d6a69bff3084cd11e2f6a6d60ccd33447a57a804b45f628ef62de9dc84120cb590b28e24937c7864e38ce1fce84e38442313e92b1904186170deb7d96ead9c4c1b9396e707f687e334a606f74c4236d566be88143d881151adbd3eeaaa4aefee53418c48cd2b983897e80616ab0b4739680fcf4aa5046d678efd9154791a282869c5208e0bf82c9f242787e97f60c258bcfa6ed790fd6680ee067e24e3dc8dff11b637785432e8994a545beb5290ac159be4a34b69dbc1b54d8d48140210070c8765c4d90f53d5df14afae41fa8539316265e7ff97da65aa37a6e7030b45b194b916dc41f0243bc6d2fcf5dc1a5f24253e9f18ab3d9e52a799d6779872151a24259026b700240369d54ccee63eae3dc21df4196291a6720dc5d7b373032156475f510ce53941fc14ed197f19dec70a70299764f4d267bb8040882e9c61026d64adb487168a18f083066c96a6b898a55436a4be71f6ef2c771930a0d6c8888f10005a8b50d162fc7d2a901b0d45c726b65d61db0d60e82ccceb09e9762ae8d325d440b56d7b4760f2ca1452051a3c39776872ddeb30a7152e586b35a4d754e29d368846c3f7201483d09eade2b00e96f59f291f63e7040a614bde8ca343eb1a248f6c455aff6bce4b0bff9806b2b07740d739a3c517846547596dfc6170fb63cb4c55c0f9ef8783d8f483000b495d1e04751fca0568a4120cfe3f9ece905aa2210237427b2876f2ed078b3b1776144ac9ee30240bce096dd432f1a16b1b9b02c02e2372b4990469d26ab805fab27b4ca597dec5efd3423bded6815a5614305577b7511076367d085764c8d599c6f99e3106d96c8a4875334e85226082c94a8b9a651f84398838c54493fd30c56830784da99f86a72bb28234245c5a1e151a415f12ee5563ca96cd3b73d3813d0a34fc8d824bc33a97e89161710e3abd4228b7cb85794e30b426f18ea3414c90a448c2957756f50ba7dbe898675db31f7d3d14099a1ea5a25fffae36f00b7f5e17c3fc21c4cb45b9c3c89c09a21332a9a765dac9489ae25f04a5820f898cd0ecdf08ced45a393b01ee0b3f4ce351b512158fa6c9a96d161ffa01e78e6f06ff02d2d323b7dcb12bda98ccba0e3ac26ac5c84926103d1f89096e18aa8fef93a5390830f9e03915b5c3a5fc9313f37acb8e3fd393f844de1e77c96bf29d0c0aa6d3fa0546fd58fb9ddfe75db22a90c9ef3a9c46fa321f257847a137b231ce8eabed7e119633fd12904ee673243304b6291222906c75647745efb5cd4f634bbf22a521ca5135dcbc34c3c714e086608913065a9d03c8cb98024c546e92dfd1d6eb1c45a421fd777bb22f973f80de3959cd76994b3853a9bb7744faf3e81d104dc6de3b6577060b5fbacf0d6b31511abcc8cb30006b36af1d5bce6e6c909d1ce302736db03cd92c465999f24e98fe5049a21b83087505620b5cd1e36cbd5fab6dc8304905c329eb4cbc164403038a0dfcb591e3b7a351dfee759ebfbdecf4c5502bf101594740817adf5f3974dfa9f03ad4066efdb6d664704557972e8276e953abe026d749930edde307c22c536ce537d31648694fddd81648a118b77cc65a807e4c9fcf2ba7560524dc308b64cd1ca531ca4b4ad9e909feb6e9a26e62b99aa81ad28babf4b7daf439ede0cdacf178c713615965e5b9b9cb9b3fa2a1d4a3194aa15753c997372619614b3b25a9897eee74ffab9df7cf5fa8a4c2c977a1efdd98ca489c08b9a5ba74183b0546319a016bb82c53c8a73daae72ef42b531f5fa1bd9d20c62aa144c6ae2883797aa4011fee2ff788c6fd977fa4d14f996f3c93ab36c1696f02cb569ce9f637d9c13a132ec8c8e7815286f592dcbec23a5c337281a4245c45e903855c983b36080aa94b25c0b47d4eb8a6d240b5f15fb897a680314b30a3526693ef0b5daa931dfc1631bc550385ad7bec4dcfa392a8b98f456cc6917fd4c92caea2eee253047f13285bf23129c702fbca032dc3c2ab9fde364ad0c9d200bb9bf446ba4ce6dd36866fc0cff9c04d319415319000becdbb5a180109261289823da53671b50510af7c9cdfd7d78ff6dfa8879621a00a32892e0a64ce8af9e010080a6d891cd8200adc4fba1faf607df584a0bc4ec3ef4efacd5f96a7f7624505584b8e78702f2797ce13b447e34c02bb8973867d517245766a0d9a14b86ed395936e8c61a180fdbdff8a150294d6e9a29363c1ee0cc9068f37630ee8813bb182fd8b5d17550c3a0df415ba9608fbecbf49d8088e7512b5c57e01077ae1822a45ff416c07a71cc9543315aed39702f42c6f0e486d12e702e298fae6aa55a80095ed3426340041c19beea0db49b59b0bee2830a2331cb2c6f76a94aa994b8bce3934a7c1d664d4f9b7328d085bb666173d6d6e7470febf8bf347068fd331c61d09b704246969ce2e1631bb4973febc65952c65ac5afe376a617649bc59b5775e3b06589a51edcbd0e20269ab985530692c950e651c51586f11c5c7ae4a43ceacc4c455a1bc7d88542dd09eb114d58bd308820b722382f863bf9e2b92746ee7d5052ff0ddeb09a0b75c875b2fd17a69cfbd469c46ef3003bd46f33abed79a5e2cf022b5173dbda055afe3853e244877a5d85d3eab9e1108ac13ead1d11ed5433a0a3a812ce763567bd4c3a6bb4523929e39ef930f92ce161d52274daf898e1925b49c57edbd76f4c2f65e9be472e472abbc16eac5b2d7545eeaeda56df65ab4d4c48b34af88edb5687537dca4ad5c158d975dfe75ac3d759c65f37fe3ee94eea4dfb748613db41888bee0c34f74529ae80f884a0a970689a96921858ee58c84df2d729ec4761b389cf817b96e18fc63c726211fe6917500d7f0cc741e5bb1c6bbde9be9fdf146127b111ffdc48e841984a9fb1fef368e61f16c9038a352056af21fdf4107dda6c132f4fb0fa3a3ab671446408836bd3432652136de6ecf0fabdc1990e828ede313dd225bb47c3cb102ea1842df1fb81c70c33cce090ecfe837e7c942189994c4a212ad49366b5f8aa8fdc713d865152417f089a68b865a5cb174099a8e4de0ecf88e10232e8ca10ec5202968b2ba300f302113e2280796bf4cb9aecd66c5d4220db784878c962fb6fc6ddc802e0fc1ef84bb21913c9dd6502c318af1d4a3ecf2aa3b36895512dfe30d919a4884522b9545d8a48088201609630b8c2c0166d3f6bc5f712517589900357ba0d8c51c39941038eec0ea4390995dd11ef0aab39f23888de7c000260328d38207e7108ae0d8a4ff8a15255e6c0896bf022065bd47b24a910c772bb1b6c634af203dbfaddcc414c956bbe9d4f414878025034f48f1a0d2721370a1017370691e23284d40f94a4c55e7e80ea4d8ee5d94a141a3c59e4897595791b037626ed701855f744e8b69ce40150a328edf77733cf58c837f2e63452c6841f4eaac652831b296408c567304623d3616b98be5d3255cace5f58314c166ee2b96d4908971079e1f9cb530d89cd2efcfc13791350bd49e3f0576275c1d303f2dbe7181d49660355fcbbc83b206852197f97a86f35efa3339d4b00307b23ed6e6491145393012e5c25aad3869724932519e583bc363e7ba20a9973bd601dc2563ff72d4ee482e67b10e5644b1cbc2369e368d2ad98092bbad33573d1789fa46524319e954dee88b88212e0e9baa27f840fb4fc1dc8d718738b4f91c58e18d40843e12b98e8c16027fc14f72b89c915b43b6c0794647bb2ac0554026e5d4dc6d25bb36e3dabc4520e2789f26c67c3a97c0e879768ccfd48a465d1e25176bd9e7dca8ffc8569489ef345acd7e853028fdf40163320b17b3b631bfa4c2a7b1ee3920fd4043b418ab78b8d08023bee8f62ef6222d439b3dc22a07fde2d09e80cb040f85e304d463b421f6dc6c740133f848a5c7b85df8a0e8cc9ba9d7703d05f026ce4f4c2da88c08a98b6776dcf4a5a78281af14a5f9757f74af544821ef13be73209b46f60225ede10b9eddc2088b5a8eabcbde7bd8165e19b733d39f389c598c2deeebfc3a255be17b1548f57c2ec2e13629c445e8c67364c5b29bc5db054223a59788d0e25e4cdbe00a64ac37c29d11c7afb6a1f72c8b93699b4bcab6c8a4dfbbb592826eeb97b4055001be6eac48f0de06698d370f44db0d2bfbe272615901b1505ea591cce256ff0b1732ce79ac0ef1f6cf765de34a0c6a6d3322ea000b9a86a37ea36536356d693d2be6a67be402c0d5c47b85884ff6dc2c9a2d34aa80199c00bdb9b5b356e4826a9662d18d078da4a83ab956636e1657f9a64f335db474dee55ccf5bdd78f47721c933f09d2acc7ff661335ba1963d0421bba8ee311a9c9a70ef00394f16626ca5461d6df59951467434403aa9f223723893edf8a0bed0e4a2455557b0ef7b07e05baa2b0a075db59629824d07adb468208e99c70474441c6fbcb03270f62f30dbbeefdf8dbe5e859e8a6f93370bb54708605871a31de84842a53a1f79c29858f22b8bcc1ae712824fd65635300267586459498721ef2c17ad952dd054d91b1d854f39ee846ca2883fc593ac5afb26fb2e8a07cf0a124821d328f0de02dbbcd1ad200feb480e495e6e20fe5d3e609de552748666e1dc8546b5dd7b096471856591044e39df0a9d6068753c7e9a49fd125890ea45cb422ff864d945dd272fd04d5ce50f848986a6d5dbed8bb38e2ccf2f8d9e2ab1d24f57b3eca4e8643ef751e55b7f785c10bdb9db7fa12b7d5e2c87f79e3c37fc60ace07b5b3b74ec8c4665d31f9c32efb80a6f9dac05ff166c1ce475bae1ab01d8b3c9d81045e18b1931739fbee4f1a930ca477a2177949383944a82462a2265fb15fdf4bd6c802d25525dda27cfa34a2f0945d18dfc8a3460b8647f0080020d36cbb5e04940db199f3bdc3afb2b69bf916b14b4ae4abe29b6d4c96ab35c346dbc01d85333d0493e7543cf9d8f8379116728807b8473bf4bd85281595bddffde3328cdf2e58cdf7b6b5930d9d84a73ea7e639f38bb5bc0a7e8b4d02ac3412d12bd6825441f937397a6d0da4df366c80ba629c570438c4f17f9096decfc1d6d1c3b71f5568f27355f5143ab3992121bfce92f867cfd03d4a8f63dd3ac4334547edeb97dcfa5122f79c0338f2450b7f54b00b6757af6c7c8e5558060458f92ddefa38f9eaa7ba56de8c009ba7da844793f3acdf909000b8dcefcfb461996c95a48ebe7c18ec5a53688a698607f9a7e0ec9b1c4ded553d34452d7da1f9b529c7518ba849ec9a63ab8f08bdfdd629f5a133dc37fcfe938f694fed28271a7953a92dd677d4d4d5e21de4747923d01673f36bb1f057eab26644d132081e04ec3ba1e3a5b233c7336a75e40903b079b5c256625d1799cf247b2e428e7320c4c8d43802ffbf11a5e8a701a86b3e009e0ab3708529cf052447021d5b011b1170ba2c660a05360a7c410f4f749fedee45484441929119728fc010bc4bfdc14d7fb7ded793f8943e151c8e64e3422f11728f149374b09075a631356cea10b09d4e5e586c0a85b6fd51a1be5f693f335c119ddcd72499f53019c667b39215431bd067947c5337eaf88cd1732eb11bf085383069f0499714bdb127f95d5793dbdcd86e100a6d33c680c590eb9b0545deb62411378042ab16244bdc43bf805f27ab910578ecd5225a9d749fd4e31f56b0cd90d874bd99ed4d0569462d6f2492a80e9470b0791354d0b08648569d4687c8dbe0bd4718c59cec479256b796eb5c86d11ec0dbd2abc758d01513b3cb7875efbe617202e868672bf5150b618de59c57e8d1b1c7adfa66f380d8984446c244932fd8c346ed5615e3fa460d2dc3348300f945e3f7622dfede037e2d8f61121622e12776f4f4a81b0b9f248879875097261c08c3fcad13ec4dbb06bb6eb08dbdacd032c7f6c24cbaefdf78eeca6900b31241594147513ea5290ab607412298393fad525c88bfd0dd4c9b50dad13ea50facdba9d7a36850bc4b26eb557f81be003d573b11c3db6fb5fb2aebea2b608f6c86d080cf748db66e39387633656683b0cea33bb23c3176eee48870742b97b1726d565a9a8a6876ef300c2786a4e8c51f6989ad9a7be3026114ad8ad7bcd65ec19fa7fac566b8fc93bd91d43f04d822fa288c681aeff8bcc2d7575dd933b9f9bf744315abed0cb08bf94d9d410641c3e85fd3f1f4abede34877c51901322e5324039694472ce5b48fb080aa6224bea56f1cf5c312358a5394da3d2f3c4682d7982b4c461556cdbeca09418c95a42ed6939643119b0233acb72540fabfbfae748257d814b0568b2e4fb8808c4ad9b3e50dd0c514a6c4a0c6bc1ac22f06dc8aa3d4bec16cca4dd297d66ca6eed2d4107fc9f97500dc9f86ca7b1cfedb3b896d4b1d0ca803e8f036b234892083b52208d94642ab06c97133bd3cfa0049c93285c1b1572d0022ca2fe0ca4a10db8b4f10a8358b954e28a8a491c0d2849d70e260c723201494ab4730b62036f5274801351e1581c501487c075eff27c9ca86b1524284d88b76793168521022b0408f13b81634c0d331c5ae66a46d1e8aaac04bd716888195fe9246993145d701010bce7a8c2ed670dc21214c490559f8fb28cefb3b5621a641f0d11758ce592b89dc7ee71af0f1652ca16048deae07aff30e0174cfd6ba48f1fe496c4d2973af939b152f8895d15da431482637419e3757df5fb4d059224f718d3a83c5b206aeffe9a9727ce3747c147beb129850cbad377b128dec1777d590a8f13c4c309e052062780aa72190ee4b78e052e4a64af465d69d29c56efa191698f7638689de9e7ecdc556d7db1cd186413f06145b3acc085b2f7771851b342149af737a9a334c680ec8d45ac2d476062a234e073992dadf7a8be86869b1f25d680d1e2b18618f20a6713e92162704b36fa066e3ae5292aadc21f28783863057c07d0b4ddba29926e8929304acd0fd976536733741d3c0c87a235eeb2f6c6b1cb0b69c175be3a6b1f70448860a53f5a24bc0629f4554cc2faa459a19cc18e3bceb0f3e08e379609d973d2c73d3a3ed6b692dd911d400b9998cdc5abcf50e25bd6ea8d3674fab28128ca6caded58f1506df62abebe037e0426d36dc02a9467f715890797224514215d368009ea04f1c660aaa150fd1428b05edbe0d9b4f432188156c28362ca1cb9b55038033a61c5c0f285ec18eb03f7b2ffc92a404c1c0a5e6a276e4f2aaa4b0e4e086a6a6a85d07538d01cc14523ef79d6a0c82afb0a03476ff3c17caff8d864af4e1d5a643e8f5e3cda8fe2d8240d0658e42b851795b614df42cb3c4995fd969e8412904495c255425a9f3817d8f94747a896c17a394b7641231dfc77617af56310a8f565f8f8ce50fae038f12f9710afbbe237a13b3edc42e98bc578eda9826f81951bf0182378e89fbbedf155bbc64f6b62df85ac9b0b32c9944d22cec2e6948603317121878925bf96c7f6c8e7d340188fb466c8933ca257953442787baa6a42099ed3ccafdbff5da7f8e65efc76f81ef6af11e31e4bd07d08e0b873eace86049f62fa4ed77b6934cd3dbc94e119952fe8e119d61f37baa2ad39429adf9109b08d3ffb93dea239675405cfe63b1c5482242ae403914fbb8377c52ce93cd9f9cb8b3ea3b60fd393c4b000d9803fe53af806708c1c2f7f6142cf47e1f99b1d97cb07fdb84d1aae946f71037b3828fa1543e5fb82e06a8de643a406648d638f1dcdb3e5ed817e57103d881ed1f7f432ba5e9fa59f934fce77248eb116ff7c8ad4dc5326da0f84f3e630d444d625f54b9db449401bd68b1f851ffe5ecc6679d8c837387105623d02e0cf246a58f7c0ad6b25d6bbea8a9f14de3e2da9e715ea9f4557f4b40793a4f79275a50e06bffd0961635a495c09cc61c7e8e5abf6ea2c8b8c7025d4a99666a4849c35ddf754f03ad28435761cbdf353e3cbf2c2cda07dd7b7d14b6bd899b3aa5fe912fb59ce3b39bf4366f63ebd11f824b07c528d3a697cd2516561cff241721770ada7e314be12a90df4f9727c39e9ead61257bb333f70ffa59718f8afd650615bd9ce1332f3101c788b5f3aba9a5e1198608d97f6b8daae4095e89a1a29e8bb17d49d74d4b73b876eaebfe997ba735ca16a9b5fcabe708ee12b3fdf7780cb5f19c806f2829f5f85baa0bd34d7d69f4f3688a81f252d6c2cc6d56e582bdf50db6d093aab672a1cdd771c4d2ce95cefb74b6e2a4d4603ba832002127199bd4f1fd1f31a2d4cce13a24fd93542f19f2102ac114cbef03021e26df2dd697497207db69d1525d6430d306efe7f62059375d3d881df4387f033577c567fe3bf3e43a6eebfe2d5cb8228e401b936c3cc491cc3d083a4a118ef66b497ac904db606c343759302aec0dd257ad99844ee2d5da3d39c0a2f2540bcfb3f7aa366dba3332fa5b6347db2f04e43e5a1f815d17983a0dd5d7b12eac6f41e3c3ae00831ac28de5464359544f41b8399a8f2f500cc9651fb4fc5276197fdbf4712e13efc8df3290f157e3067e8d725870c3b9882d7233bd7f3f5abdb4a0e57f2c05c0b03aef6e6eadf7aa81eaeb7d284c9f9c45ff6378d97d6efdccea6451a69a866d4274bdbe6e20ef29a34dc0c4337ecdff323383e04da30057da5bb1a10c2123ccabd334c6d37860c13df3290bf84af2e902656fc00317380530aef8f15c517f97b38d4c4553a4d901dfe2f90ebe14e3c2b789abcf58818686b769df325b8f3793681bd58bbb774b8d42b9467a55df806ae7625ba01f63a1ea623faac65c60413973835feec995b468c2eecae957fa128a2f022fa4f6e5d82f3d287a46577a1f2490e3a78856163fc185fdccd86c25fdb4ccb98fef61de0ebc5c26975021ae3104d1fc74b7dffd3341119bddbaa294847c845464200fc73d02602685bef279d0c7d8bbf03c198cb83d80bd22e5014ae8ab77aadaed46fe230f442adf635b8aac9b0a11574372063278e2dbeb2f41bc9a54099bd8dcf2c2419e7ec66c53c4d59052d712f5bf5ab9b68293cb32e6b4b193dd032f1c9cdcd70dc388db61a2b1d46509d97b914a0f4fe4f70c93d867fbecd46929e0edde64c0b6fd11b7cdf8dfcebc97334fae24f44b91a05a572583ddde7fca4a8953e2550e11428ec24a4208839ef95cb98e8b901a0e61931b03e987dc5934d453932b343802a46275f8a8148d519bc9a0190c1eaefb25ad765f05ddb989eda2b36f44da0a66d2f09d9f07bc79a3606c00e3b88a08682d88b48cca9f27acd0a7e592cc809dff3a76772f64a01783b8861b86319adb44565aad94a07b3d5520869cabf792bace920f5ae572f8235b00519fdd49f75f90fec1f5c73b398c3c4b0c815752275098286be4d9a3bca50be701029428d38f80283f47800d289cbeb4a07ed1bdf628d32933e5a8fdba1827b65eefad5b87fdcd16fbe732227559a8bdd14618a42383151522ca1fb1903c87336ae0dc8bfc9d50c4ec9e02d7857a2c122ff5ffd7ee5b81a1cfa69e59483469f1fcb59988c71f0bcd23e3aa8a73fc3e808651f992b655037b13051b469c96c15af80dd488c9fb75c5139d4c9cac1493070b54c919f23026ee11496cbb6af7e90eeb0f9da6c1a577ef83adf8abc4b317e3d11bdb25dccf7f0bba2ab3d47f6f6d6937413635e9a7328b8bee0d245cc9717e5f5003227e0a65335be2e39ae2712b84e108cec709771bf5b368c6ec7c049f61cb8e8c12bc8ab6b6cfcbb59debcf593a77f8186bdf6808d0306551dacac1bf89a1b50fb8d505ba5a2e5bc801864ed80da3c703ad2345273f6567cf5b77993709c765a27849b8a2e0a14e31cb1599a6f132213e0db39dc7c13955332373cdfd42eba37e2bfac33be68c09d31e65759e78b5e2178b9e576a62e170f19c5ced8f489a1b6a407e073957a42598319c98a268632fa3d1cd140be9d2240eff48ec3c99d922f86e3ae1483212233a1c0dcc07b50acb50c91a3c08228358f45d782d744a810f7c92433280059afd778129a13d4e2f7bc54d67124b98e538a2539b2477ac17c64afc71b29cb173f3c5f281d748a5fe1f3d1f8b71ddd7a9eb9808104bf321fda754b4c2c34c605436ea01f3f76119c917712cd34e951e6f74efca8880363f1e93865c7f57bf9024052e2af95d9190cd2599e41b7519f7b6d0ac5442894a88ed740819e3ac7c7b77602e62d6edcf4f108ac61d0f40bcc058c1c238f6e145dfa0f2ce45eb85ea8e054c0e2f74ad9c55bb39c7912e462ab90bce8a4930a3d0d2b96256964286f4d3634b45548e6a3165f61ebb896d3e3da091ce4c1706b383dc6ad3e3957e1c9d376990e9b8a9f75f77c41f05a596f789746ec2f20a08bc38ff3f63d110ba1208126c6c73c39fdf0a6cf0c338b67cc16add107599c6849dd1433908c6cf7e913216666bbcc9bb46473bd32b51ead62555ad87e2ab16490dfb4dad823d6b89c63309d8dbd46e99f33f15e82f71dca6e5663877cb986ecb932d1de56f18a687add963561c17c40871bf274e40396cae2b42f863453cb901dfaaf01a489a1fc15841e494df904c81f494defaf090af7139ba1a30f318a24467b1fde36350656daaae3c835386c9e9b04a2b3bd646420c8dc00b7834d0e96d5613cc41bba09205585e669b94b70c6e17a10d1f3ad0f3fdb121f198276a5753369856f790042ee2a336ac846f4910074640f4b2693f402305b498cf144a4d2f8b4fda9b54b9e355e744116111b1ac79e544e86d6544d1dc702c801787f7e1513c3c058642cc3c814a84456e0206a10e205950738fd2ee2225055bb532f260dc78e278927ca4382ef05af1184530fb109a9580c7c24838cebcf05fe42f10c6c702a61a3539f905b8c189ab0c18600f00da32b9f3c1776915212fc28266e04dd0384f548a290b2c108208a5b3502df4eb3850236fc4c5b4054eed48c888cc7c838a923f19d27a961beb115d4f735a62dcf5a6d13e14b4ead17024f837162a600cc428fa252bbb6022a0049fb800953598f9aeb1f488c20a413b036683db29ef29c61d02e9dbae454d8fbbd76d4275e02e8ee2a8e6d24841b925743b95e6c40fb526a3b6f47a9d5b424cff569758e0ae1b1d216b8219e5bfc0b4cdb78b93e2e2cf0c0c48158ba293e73d94c8899acd1eccc3c00f3e56e4e0cf910c589dafcc03b17a6a86fcc7ae17af6e0052daf8af4a2ea2fdbdd7c53dd292796eab60184f9a48f548eba4641843d963e749b5abf3996ea49b452a18bce8634fa7e204390bd9d6a5e868ec46024078e61e7b009d5ae213b50144e43729871eb88189174131a167f57154e8f500f3a88fbd2882d6d1037051b1f5857271852998d4cc6ad25f480e48b39225f00e588e2d35814543602dacbc3993760b46439330f0f0f0f0f0f0f8f4408b7b60642da169220934c12709a62d0c82499924c2945c2153b10b2371bfe226df88bb4e111120004a809b60954097e2e9b9894d64bef6622f8f89fbeaab288e0440973919512748ee42118d5f14b9e56baa934046bf23fd7c8bcf57d29046bead3065d1a4270a7df6b3a7e6510dc9f79ced17eaf3c5604c168ebe451f5c440b0651a4229394aec27080826e6f4a11bddf794d21fb8dc7e79645091b39ffcc0c7cd6ff99fd2072eabc4f28b1bbe993b3e304a7ed2ce31b53d702332e99832c60d3aa62e20850e3d247a54b209b1abdf151d79e033e76e9f3ceaa74c78e0aedd76c42c7d07eedd44478a7442a1c30e6cd24df71eb3eef6c460243aeac0e8a41954d2f8aa2f163ab09ea4e7a76c6ab2480e9bd03107f66f6352bb79b6194f28fd24bd35f552ba858e3830c24b5ada0b716bf5140b1d70e0920c6d2a395edec0a605e9a96336154bc4ddc076e477bdaea30dfc2699d484984636b05a952309a1295407915c031fa228b3ac4d5ea1430d7ce99590db22d8479a7c816698a046165c183b1d69e04430fda2a5732b59850636e5ff52dabe22784ee940c7194c2e4aa3fec7e0191a5a093bccc0da298fae9f2287ae0040091d65e0b74e86ac7531ad628d2f96091d64e0be7af3f84d9041ccb278858e31705ee14993ae6006500a1d62602c69d276a546c7af182ffe863942471838538d1194de2030b8eaa9f53b47911e1a5a37b4701b5b58c7173839b636f13a99a660d3d09a800c19bfc5692ddcc6164be8f002973528cb9afa2ee652e90213cd544a5a636d71a3c8a0830b8c656df98ffc696899a0461643e8d802db9637a6e99cbb337566bc16cd0531217468818b9a1f723c8e97c814d40e80207464c17c72434f475f2c7039263da6d2ba4c075d175760f285b28e49d345c9f52302001c74588157dbd1765481bf9464b092639b35561d54e07263aa51b24fd7990a3ba6c09f893c955939c6a44926e8420134bcc8c2031b820e2930ee934392e6fcca5eb14581dd7ef10832a93a6d1d2830a92de99fd09427b0e19931b6a6886de23981976016df57c5c494d6d1044e9eaf7972c99fe960022bfabc3372d6184b550a828e2530c9447c517a216372130dad2e14031d4ae0540af2d276356cccb8b1680b1b3448123a92c08dda16791683b64b161a5aef45165dace064c8906146e8400213dc72c62da12a5fad34b4bc682fbea040a22d6cd0c00a741c81cf3e52b724a6061d46e064a89f529db3f4655b78e1c5df480a741481bd8c599e73482764bda8ae00e0830e22b031588cd99284d0d09af12ad8c2c68def22cbdc1018b3344aa387ddf6c408810f539a829f655fd0c8133a82c08646fd18fb7389681010981c299808d2528a12b1fd017b155f744e61f132d34ce8f0011729a5587e0e7949653de0456e322969723a840e1eb0a1156ab3b492ea2b848e1df061229795ef46fb5f75c05e30fd26297516858e1cf8d515aa112d2774e020539f3721ad4517cdc577910de8b8017f693fec53d561035e82e7c7b46fd6a6fe0f74d4800b2a82d27749fd43582cd041032e4347d698d3fac68d093a66c00575b2e27a0e49716441870c8c2316ac656526653978e70d16e42c7642e634b40c72bc424d93f2e8d15cc1e5c632215483686879f137be8b56307a938eeb26522c8bc9b72d3858c1c78e393d2b54e98edc2ad82d993d49f34bbeea34b44ec0a10a26694fcb885e961d8023155c081aad5f4354b0f9ec533ad1d77b0d1ba760dc74e759164bbae427430613384cc168ae9462f48a3a5182560a6e73f05c1da93c7fd0719082d1fb0fa1b59641e48a718c82dfb4d737ba765ad20019324c148cde34939b1afb6a2ba16043cede97d4a6855c1714bc59d250e215a2c8f13ec1295753ca47ab7e7ac98681c3136c109d22c9f3b213dc858a81818313bca87893d488663391db049bf37ed03b99e1d0045b1b62e792a124f5c7ac58173832c1f5f9bfe8eb16536d16810313dcc49c543debc8d71cc271092ea5499b3cf9580a32ad21705882f5bf0a4ae4986efad29560824e253285f429247d29e1b7490b765a5426c1a694f5ce257ed0693949b0f6e6a696af4d4d7d91e04f2f62ddc71224b849f69533a8b3cd177f04232c4fe868428e602c9d6fb808e9ddbe3682731119733368d74d9f116c10aa699b7f4cc58e2f824bd52127ab5ad4c92b8249e94ca51ca39b49cc268271cba147969d56d6112238214db38a568b55e21f82cb1075ba25568f25b9214c6a3aa29e489242b041e4942da7ac9f7b6942706a915375064b27c71d049343c65c2f2243da4a05c1997c8b582a8d49896a2050ad512540a44a9b4889932b7fe0c4ef42cab9347ee0b73af77bf2f1f217fbc08b88192c99ce072666f55411fed903a7f28ba68bef114b89f4c06627f5131e6279607325b36e0dbaabedc6037f7e514b345ed2d3d51db808fa6ba37bb56b291a030e3bf0e719218dca98775bc251074e4d889de9ccf72c533ab041582953ca53e988983930d13ebf861c52c9905e0e3930724b8b03a3e2c99437a44cf79b84031f548a6363da1bd83c39998eaa615bad1f81c30d6c88419a92a939bb841c6de0bfdf36dcf7eb2d651c6c60f37f47b13bf5f821e158039b1b5457a8cc0d42ed345439d4c0a4fcd3bd74a3c433a3ec091c69e07254b7b3131f0d7ccc794b6e48798d2c4ac990c1451238cec0e6123a57764b31d794190adb284a4791e00d82a30cab57a6242dab68b9d4aaaafd74be105bb33cb5eac041064ec7dc91904e9f255d4901fc81630c5cf27ecf331d5137e60f38c4c088aeb3d2133f258ddb488888887877777777676666666656555555556545006fe00803e3b944d58bbdae05170c5d08d3aa9efdfa02dbbbe982889f953624993c707881f174d61137a56069121a5a356c6829a594520a22222222e2dddddddd9d999999995955555555add14401a881a30b6cdd0779a6313749be891138b8c07765a6535f2d217c1f706c81b1cd924763ad05fe5cd355a64f22b59959e0e4a65aa78d6982d48a030bfc87121ecf2f7f053edf3ca70e9ef386885b814b2a49f64e2a3a9234abc00913b92742ca39e6272a30f6395a293ff7586e4f819f904452217b8a14b894354fba489e1dd216054ea59560498550275f82030e28702b22afeb3f664ea9d1d07a021b27f9b928ad132c6d018713d85431e435ed3a2d93c990718109740040101c4d60a4c52c1d64bee49a837b430b6f02071378dfd3b9743c75043b97c0a69ca89d54489284bb1b040e25b0153c527b97ea2f9d01024712caa732f7c5a1c081844448b09c271aec25701c21edfc31159612388c80c43c6f091262b4a5c05104469767c564621281cda6d3e5f9ae8f128b0c193b04f6fe6bdcd3edc520d70d7c063884c0e9bcbb9d20e4416052d84737b9ed92b473010710d2a684ce1cf53e3f607564af859aab6451ab0f18bf7819f288509e37ca028e1eb07b29ee4955c9c103ce5bb495e6f0b20817af2be0d801632266c5f7fc0af97b0e1df0612542c5bef08a046dce3719f85c1d3d35da6360d472f88f8e5e29d26260dd2bbabe47bd4b6d187851b7ca165330f055e1498ae7d98847bec05fe7a4fa2364558f395ee0df32d32dcbd3e82975810b4a25e752d7d10f6a2ef0fa41946be64aa9edde0293b3d6326676b5c0f7af258d3ecacfdb9205d65fd26be54abab4e5b0c0a691253188bc6d27b52bb07e7afba332c4ff245a811fb9b1720ce9825105ced4d3754fd2c2a0029f53cc4bebae5919c09802a33153c90a5d39c5523252609295e5a4de4a2ec802461438bb48e7e11ec3430c80010556a2df88a463a5274a0c17309ec0097fd79228292b8d4a0b184e60bc728fd0f53cf931a86d6c914501184d602b55e97c91241a5a3366dc680301cb000c26b015f92b628abf04ce5208517b2d4909ec767d4a16e92544d1a1a1578f6c54000d8c243066a39be19693d226b2e14529a2001848307810a9f65e4d787d04d6f6339bce4976e93a69689d2f6e1881cb9cfc2ea938ea193766a0065a00a3082f80410416c01802d7aaad41e6a4934aaf3084c0e77417a9a73345c8de1637b60b0564210046105200030805e307250361f88051a62b278da634b4740b183de03d33dd8dd066d5588105c81560f080fb20ec63ec182f6c6476c08f2ce5412711354795349486a3e08b195ad8b0b1851a063a1830812d147ca1850d1b5ba40a60e8808d9aaf52bf763072c05f1e1115dbf2c97c32f5c8460d3ca8022198d1001838e0c254eef5a42b86b859ace1002b1837e0d534a713f97f3b378a11806103465878fc1c64e4d03bd680939c96694c253bbdd38089a73178a949d2533d03d6239bf6d12682fa88c190019b6cd3d64242cc2926c5827fb50c225d32c182db5499e259753cf3ff0aeeb5d54a8b974c3d7a57f0bf35316d79752ef9b782cb194a5ec6e897d53e2b38574fd2625756d2e0af8213c9fc821411a982d1591777630eff18940ab693259d3b28dda5324705ff964327a5b68a9df25370133f461dbded0832a660646534b10a31a4a839a5e0fd3e76efd8c689e721051fb2489e147293e84c8f22213778b6585e8b828bdc665f1b27c511da50f0fffaa79d5b50b0254f86529a317f5b3ec148bdced1354dac24349e603d2429493188f4e9339d60256a36b7d6d02f9b139cc4e45d9eecb4c78b6e827f4f8f9643ed5f5faa093e799bf9a810f3f529137c7e1759ea841213ec69f0589f31e4cfd9bc049f431ed312dca5ab67aea045675e2ac1a7b4fb0b1a546ee99460920afe66428293e0a4e86d176591045f4a4dc34b55f64f4682895e6a2dc71c735011129c7a9498cbbc47b0216b5efd98352b5be7086e6d35c7e0a335829d203763041793dc98f72eaa3a69114c3a6b11e999f32247119c4c9fd46a6e2a118c755232d52521829469fdd9ff121a5a66e6106ceb8dd2af219488ed1a82b710a38d67d03c22a41482ebfa98a161840721f8d488aa5d29c91c7a1d04d799e9544e5af4a5ac20b84b4252b02fb1cab23d02c179f00c49b8fb0a080f40b06982169d5e3f7ff0f8031f648b85d09af5f0036f1f82bab01f11e1d107ae4a9ac4c949def59beac1077e4d35489aecf5ffa94278ec81d159d1844e2562c7cfedc1430fdce90941956bd6ce4d0b8f3cf0a6d354edea453c190088c1030fbce853b56926f284ac310078c1e30e859c44f2b012ca62460d1bfa5ba008d4b0809a871d784fb94453ec242dbd08004df0a80363f9b4d74fa2e8790c1d584d52624a692f6e993c0b1e73e0f3dd542e1d245534150b1e7260a4a5182fe7d69c8304eb0c1e716063ad774a23e4dea60e1cd8eebbd4316d87f6856f603fa4c57c1dde99dd74039fee25d5695687142766f068037b1db442bc14237b3ab181dd7a49793ce9785bd6c0eec91fa52d281d4d683cd4c08ae5082ac64bbf1b5d1af84b7252b21c3c6faa4e083cd0c0669151d4bb257b699186560c3ccec07feeae534aef28d10c1bc8cc071e6660b3738f6f68e5609d7f1918f33442d9253931dd6460e47bc6133153caf19486d68c31703a8baebff1fba082e4c5c05ef5491e112d7afccc230c5c14cd9b3a0d067663f68a21f6d60e3cbec0e53a952b871ad38d280dad193650b981871718e9f993d05a39a7a0f91728e8021f936648aa793c85e75117bd822c1c787081dbff117af12628eb81c716b8effc119da2b9fddd85172c781b5a60334a905bc2dd327555038f459f9f58468ed98c1a36fc5170a346046a580003f0070f2cf0a9496eda30d331d5bc02173bc99327575249d25b81ad5cd3759319fe7e55810fea924e6f2d15d88f94f29ee8af51ba330546fb538e933f2749504a813777c9b611c745732cd0048f28309652a55777a690c1030afcdf7da7f1d45b4a795ff078427a4ddfdfbea75df07002bbe9a7c73e53d362cc3c9ac086ae12ebff8b9be2e8091e4c606367d055e3a639c7f412f89cfd638ac493a42eeaa104c6ebec3655a3789da6021e4960cbeed5ff5c73acdc17376e645124e08184548ca22cc918b38805051e476043791042f5e7a02e6cf877910123b03184d43b19a44b8aaa166e630b2d0227515378c698f5a6073c88c0a54db0d4956a77534a430b031e4360ccd45bfb7a8ea75a4a010f21304ad4724b6d0c083c82c0e7be9afc9c6ed2c882e602089cb27611caaff2c63d7ec0e5bcb6b93374bdbd4a436b468dc0c3076c7fb9c5696222f0e8819264e9e4dd21a9e8d3d0eac28307dcc94c4ddabbe59a275fe8073c76c06871315192b4e96c86d7c842075c0a3ae8ce41c31a5fa419a8868d33a3055d78811cf0c8011b414b24cb7fd7a44728b031e3cf0c1b5eccd0c2c6ed063c70c0a994520c11b2666a33feb4a0b9d0d20e78dc80d7a4929a982c6afcb752e161033dde05ff06e1510346a9edcaca1854e9ba2b30070f1a30a24288bbda66b7d9cb83c70c3895948974a363d28f6079c8804b4a899f759069f3361932ae23169c6b90db171673042d2c38db944596499658d17e05f7ed923b66eca4db4d577029c8b210bd26debdde0aee52a7bca7eebe6296ace0d294508b1a828bea7115bce61cba4b989e7a509121860e5570ffb515ccd6e48a1da9e047c57deb2c3a968674a0824b1e4f26353298acdd3a4ec1b6c71862dc3599824bb6fbfef929057756aa74756c3dd59e14fcde77a62b9decf1f551f0e3a9a47a1c656a37a2e045976e5ebd5c3aad1d0af684461129da939e3428d8eead78a557d1d7329f607bf46e79283dc1987d129a41e73ac197d0d1fa39ca09bed282d2954dc69221b609ee3f59f5e4d5ff136982d3a4428a91bfca049762343921e9a99027d28109465f758c6595bf0493521219d46b869c5b82532aa8eb521332ab852aa108d366d52ea2043f394f8ee9333e09c6cbb2cffc96049ff1f2730a514f39ec48f0aef96a4dc8b3d424487029c55394468822fd47706d99ad4143a4577a1dc1a476ff2e13318bd8db08ae63de74a5258611bcc8183989b06c8bac2e82730f42597d5415c1018a8e1d2ad735ae54602375554e499a53e0ab72a37ff5c4189502a74ab495be90fc92a94481bf9c257ac3ea74560f0a6cc68f9ac652824ecf13d8a044830c2ae60446df7890c164d2009ac0299d24ab44697c8f1d26309a83ab08e5fd123825e2a5654a21746b45099ca79a70cdcae125c424f0a34442fc4e4202abfea23e0217f285e688904c757d4628c1008ac008899fbabdcedf4c44e02b7ddbe91821768e0f81bd6ca1b93327a54647088cce29920e4241e0a27f48429dcabc881510b8ea9427c5cf2126d34407f0035633d48e8ac498e3ee007cc087143b6e797c8b105403e801a76bd7f7537678c056b42a91f7be72657b077c28b3ecf36c75c0c9f3dc544d9e84e99a0336e9cdd18409d3219289032e7f8af9dd4e4fa4eb6ec02821a4dd8e0e3169ab6cc0ad6f083a4ba7067c0679cad2521a30a662ab6d6be5d42419c00cf87051dfdb5b2123650032e0ecca3f47a62f59568a0537aa52bd75768f758105ebe9d9e26ff0155cba27e54127ef0a7e257fc7cb296a052341cf445df55552102b387dfad974e2ab607356c931955537c88f2af8a4632ea9559d543021879224d77c458f50c1e9d4162aa5a4bb4b7b0a4ed37dd2f92e798fc614ec050f962d5f5d0aced36ffeab9c149cea38da64fda80d77149c92af17224657146ce7abecb9a550b096c33ca84eb9bf42a0603f5e86c631cd272c8627b8d14968b59c329d6054aa5215d45789a40c27f8dba0d2c5eff46a2837c1784eea473497bc10494d70932ce608fdff2892cc0413b3872426784b95f7b5339fc89272094692ebc4e0fa31ffc9127ca43f759b7494ee7c2518912628d1d0d6d2714ab0b146855a10d1b36a3809c64f4f7f85a4e9238292608398e428d1bd48f093ba762d7dd0966220c1063fa9b9d4698fe0729b7c5d4bcb619f39822dab5a4d31e41bc19ab24e99397777598c60df749c9094b69876528b6045b5781c91bb3c8ae0f53c78acde3a8d27824dfd889fa1fafc438860eb9495109e94a5c70fc188984829a51412c3105c490cda25a9f6b491c428049b43c7f6901074ff2284e0a3e68f5ebb97e207558d2fbaf0c21c20c62058bfa0829ac8ac20f8b254b735519b636620187d5b41a45229e54e16200620b8129664befbd15769d25007c4f8036fea296d858897ce263fb025b3064dd155927a4e1f386d799193a95b92a1e5039fd59227d12951b72b7be024855e6b4ffa828b1935b2682fbe0b527ae0f3aab2b4e5185492280f5c2e2de9447d48d6b7e38133c99f4a53fef22bfd0e6ce4bff4bb14836ba8edc05f0ed282e748cd7b771db8f1a819bf364307765584c6cbf5217e660e4c4e95216489dad44be5c0e58df5397554a8d2548c38f097b4f2440a318d52a9187060734a9e9c4e4571f53d10e30d6ca6d320593d7eb4deb8814b1a4bbdd66b7c4515a30d2523530c3660f1255fceba3eb135a881b5bcf471c921758e791a5aab31d2c0c61853c8d7579df5a91a349c3b6ee9b6a6b36bd5821867e072debd29eda14ef54968c430830b62940165580c32a81631c65019882106ce44e7b8ada12cc73ad120168a1861e0ec64b9da69cb231e43436380210831bec0a735ef4ad125777304c5f002d71e512fffa95cf8070af1418c2e580c2e9c0c12c4d80293b5749241db739c2cd2025bc182cc74ae6781bfbfdc5d971b2cb0212125bb9390185780410c2bb06361c95f2c53aebb1610a30a8c8410ef4d086dd39753017d35b6fd273931a6c0785ccbc14c3d2930e95d82487f7282ea244614184b4a9b8aa6eadfa650606375c5cad6ae76227b029b72c88b219bc71d9140218613584feb12dcae734cbb3781118f92f527a7d17a394c60f344eecd1de51258ad111ad3378ba1044e5d9749bb6a93617954a3679c756ce0011d352cc0010b7430a043868c1849e047051594a9f691c0e50f31f9962788946268a8d517336ad8b8da13c438026bae913b7278a4d0bd11cc97c12d827b2996eee019c620023b2955ca3ca232c44c8c21f039a76adb1ea1591154d5b181076c208610f62cf3149558b142f08e202726cf62b142c960f1428c2070d72552c8feaf2afa03815313a3c994b2c5f823af007a2f6e7c8d195584183f60d52c8936ed4cff4af201371a5f2b5a05d1b6a51ef09eb74c5707dd41e879c08d92d93772324f39da019b469f103a754e698374c05a1a95354d3352c673c0f95d4ab79b83037e5c42fa902235a4f40df87859a322a3478ea10d18b5db2c9df4bb4e35e0def327915e826c9506fcded5578a60dbe6fd0c384929c94ef1c49001ff29461112d36616752c3817cf946458ac4f5258b0218890cc35e43091be02156a94aee0c7423c959d72a790d20ac6e37e32b993f4eface0d2ffaac79369f256c178a8e9a82f524486aae0cdd5f53b2f89578752c18fda547e13775470b9ef2fff6f3f055f6eca7f73ade9bcdd149c9bcc67275d948ea59782edac7f1d8fbd26472705a7f39de698b25bcaa28f82b32472907b49720c2a17051b2d681ef17861e93fa160bc333743a96592fb01055fa3834e29e83df5cdf90463daee25db554ce58e2718b5a126dbd4e93ed5e9049f3c9ea568e526f19b13ac88c8961c73125542bd092ea4515242cce37fa3d604a754f094ee2fb5e3d9996092b0a0a654bed1383626f82454333b477555ec4bf0d95a841ee55982fb12a9468de5d4a6aa041b53b473d5cf6d0f694ab0a11ada6fa1448ea64930d937795e1a15a9aa24d8504148f3eb4d7e478289eff5ed99bfd2860b095ee308113ac4903e8fe0276beab2acc935083982aff5a4d147dd083ec6f5ec511546b0169eabcd33b30836985f66fd15c1e90bd713e9a389e0f2ce72cc1b447bd02822d8b72bcd9292758c513d0497d36795f0f4a64c450dc124ad94e3ba8eeeacb4106c86a8bf951f42b0af7d25c23e575acd20f82064a84fb79e269a20b88935d9e464ffab54068275cf7ba7418858b980e0369bd24a124f7abcfc81b7bb98aa5979d476c50fa94b97739023c53eb01f42bf7f05f9c0b675f4b168a99df43db039e752263fc9167deb81d5f5b496b3bde5f3c049959cad43e814c4c4035f4af443f6afb6e8dd1d18a17e9544e5d221c70e7c7f59e6f3182b5b07d692bda6de5856f6d381ffaacea739c6649a9e031fd7b6d6d52f932b077ef33c66e64c11931a07c63462f5a7dfb0bd0c0ebc4d504f4ff91e43fa0d5ca8ed7463fa7e2feb064e83c4a452ffe93adbc0a5082a779299620377d23fbfb95a6be0532b9426dd15e9cf52037fd2aa3b9de97419ab34703f7e49a96822d328a18153319666b98954317f06467a8ca1cad754dc1c33b0d716b4ffe7acf69d32b061417b254b0a88878a515cf75c271020077ca911ca2ad89e0002e080117aa571e448f2f49e1bf0a324aafe062bb19cb10113d577573c526ac0893e0db943bde6f4200168b097b60aa926be240d0808300336d3e5a5af0e5252b75c74177d812e6c143c1040068c5c4d79bcfffa88055713ff2659b0a4f98085114b06cd75a65fa2a1f50cf8d4376a7040868c2db678cfaa57f0aa9daab7f482e7ccc12b067cb882fdf7907c726fce9f4c1bc3472b1897a0353187fe64e729317cb082d3244564bf9fe86d57c198ec241e33d737a6d40dadc2872ad8111627a5ca4a295847860c3c7ca482b39cbbf72c2da76a0b0d2d1aee45a3a0630313b0000d2fb2f0801d3e50c15db68ba46c7f62221fa7e0533419849efe4e62fa3085b93da852faddff28052fb94e6fd494113e48c1a878ae273add5ace75146c4eb591275db43f49110517d2f8c91cf742b2988582d37f5aeb49d64e0a2550948c4fb0ab2de2af92b286e47e788297981e41da4eba738b2cb4e804177a623ab4f9c1095ebd46cf44e807b9f8d8049772ff8d0e9db2c58726ce1f5c4d69f55589660b3e32c17906ef3121646a8b7cc10726eee312f8610947941ecbe23d41e9faa3125cb2cf561262f283126cb4bb6f4b9646a5fdcdf86312eca4ef0b2982e71d49d7c8a2bbe00f49f02942564be5a548f0a5dfa72cc95189ba4382c91752eed5f54d1a9ef45d5c601fc1dfe6da0b31d446929f1a5fd060000796081f8ee0d24deed01d3b430e79207c3482cb4a9b84d29cd3c5d41a1f7c3082cdf628f6ebd913a2c6061f8be0f26bb46dea4deaf50fc387221871afb869fbccae2b89e062fa66ab389e9a7db3850f44f0695de36f96a02989aa858f43705a72e84abbba11f23704a7a9fca3bf67de695a08bede5cf5edf253690daff04108de64dcacfc397a2e8f61e16310eced4f1a95b46f6d4c3254f810041bed47c93da14ae836104c8c21a95c9353e7f693133e00c1483f31b517d157436b02f413b08f3ff09d822c992688a949af014df8f00323f34995b4d90d267cf481edfcf96e4ca2c7e8f61a3ef8c05f8e79ed9eaafbc8e6c71e18f563d933069d0f3d703a676e917a31755ea81f7960f3e432a1feb992aae4071ed888ee9382fc1c3d0ada6f98eae26f9c013eeec0ff9ea6d0497bc81c94c65f0533bcc8e208e1c30e9ce95112f2250f091f75b07459ac2dede8c0a435ff5093318a90d6b0310305378c9c1b5b20d6c71cc87fd13565882439f01352564e4af47130b72a56e776d11a97f0010723a95fbfb20bbfca0b1f6fe05ac53c567255ed72ddc0d8969e9223d936709e5e3b87fedd47d1b08133af095e3bd235b0de56bdd5a174688aaa81d39fae2b588d6895681af8d3123a2ce7a9117941039bcd5574b09442436bc68c1b4da3d8c719d8d321b5952c8bf91e3370278445da6429c224a50cfce9b411af4939e51dc9c0954c5abba23f06ee2245b09a64b2d23c31309efa1b270911db932a59a05c054230230035f80803a79571530c9e22e6a081a16af0f1051c7c7881ff209397d2f9f9a1aa2eb01722a4cdf38a633ab2830f2e309e2ba4cf132ca4557f0bac9b0c22a59e5d588db4c0859883ecece4675a9e2c905de4b548d0fdb1b447f8c0029baad74166c8a7a5dc2b7042a83b9dcd532726d70a5c1c2fd939a90a8c4842e4bcf52483245181116da15d123724efcd1458df49e9358ee8558991025f955ff2c41c8f9d8f0227725869fa1dfbb82a14188b20b6e933e9ce127d02979744ead121e904be4695e851dffaaf96263022a28bef7585097cd6ea6584ac96a7bd25b0e9e6d99a9a5242d1c255d484dc5e8d38c21bdfc51733b4509005e9f09104c6d2ebf5865216621324b0f143d27ca6348ee7e908fc7fa594da825241dec9088c6de5b23b8bc058d29a2bd9ae5d2c44e03f664e761f9596636908ac8905659d759b3e2d04b6cd22c44add36d90d029bf774d09b2110b888653ae9f67ec07e9c9883854c318690f7019f5b3aa98ca61e70a5b42c6948e201bba2cdc72495ef05ed8049ff593b5bad034ee84f1b95de31883607ec95eb284d3138e0e45fc6f536b967e60df80f1db5a516b701b7a195da832e99a404d58017af3d3bed0e0d18fb700d6d25a3a567065c275d912382103ad21f3260ff4352f34ca1f4b8b160e2a6f1dc51f4b26560c144bbeb88b7196d92af60824cd9c47a62489e3aae60f36204d99f9364b15bc148bc1d333d2bd8ff49124cb555b05a26244fbc5a15ec9ee9b67f5d2f39e95470b232248e0c6954307133894a4c9237fd5370a63f597fbc3791846b0a4e62e7ce3ababc57dc52303a6de6d58c99e93d29d88ca294474b2a6a8a8f82097aaad54b6944c1a7592edd0f6da231130a6e3492341533030ace94b595ed464fd2ff041b3c8665aebdb75c7b82d169b2c25fef4dd34e3096673aafc909c64e33c4fa897983a99b58c58457525f13bcae4ac821266526b8ca08c192da60821fb51cb4c8d8a7ca7209ce3d8b6d289dd2774c4b70a142c3fa476290a04af05ef2cac5dfd3590e25f84df5936369ca24d81077fdd7b22a77a4488209417e16d5b613dc8391603d68eca83a2224d80dc1fff3d4d73ffe083e3b27d1d9a3c7fbac23f8e029e3244da3926d04a3f26a9a2795392dca083ea6bcfc91acff335d04e79f940c6ea722b8ce2942ee9a07d12997085e3d6a3479d623825393bed7299e10c1ba437032f95db06c396bc50dc1a86c21c44ae942b02958e5bd20b4b62404e39af5a2d89a67b88360e3a6d4cd0fb611a282e047086531ad66816054e598124f0d08364af2abd320f289fb07f6b2c7107488d85dfc801239ef4f62a5cc0d06d007f66aa4e5cb27731049cb072687faccb9ae928301ec818b5bf9b6b2e5f5c0beee5966a5868dfa5ca00232645cc08b01e481bd743aad650fc2039fcb34e987caefc0e8584ef2ad62c4341a3bf0aaa72425653a9487681df8243a56c918547460b209a92a7952b41cc98c1a690617377a0533de8beec20b1b5edc7d170b18c01cd8d611f23abf993c213930d2f4327e7be7912971e0d2c8c8232c75cceac1812b4b679a5755f3c4d21b38d55f5f4963c80d8c0cedbfb20db5812f53e29dbb3f6ce035be558a8dce1af81aaf68f92d65b5243570a2a3a564224a0317735e771e65a38137394affa7bdcfc0e468da1df33503a3fe22a83432277a956560e3e42b8b9184add964e02b9ad25da32963e0329dd6524fa318f87113e1d90c035fe9473db86b08fa2118d8f6d1252b646e8ba32fb0a292bd2b2466858c17387d8b6a75f9ceedb32ef09d51b36554d3f2b0b8c0b778a8e49fc452e6b6c0efe918ea26335ae0bc73a49379d22facc600b2c04a0c3a74e678a1af3b16780bd15a3af54516a573052e746ad3bb7ca19e3c56e0242799942c3d19afdf2ab0950a8b11a8d4eea6026924160804e270381403b1e9ed010314000000001413c742a14820908455f40114800452281c3828241a1e1e1818361807c6816030100a86028150200c0a8402615030201a4403aaf905cdc8200a1182db1ce778c61a327abe50ceb843e2acb7b0b269b45ae9c6b711fc689a11af0dbfc9393a5cbb8360edea843fc6be24a486b549cde159628eed8992fc07fcba280c4308828853c9f222e958fd16698d5b7692d44e3deffdeced41112a38f470d64fcaf6116f16d197283e98de2921d840f61fd0ddd59b462cffc96d7997500f40d2031cfc5c7c594dd57ce904df27c1477ac67a7aaa61b7df6f927cad393bd824f39b938cc3d9bf0583bdc9a85cd532eed4e2cf4b73e15aabb7aea75ac32b488c0eb8267ce32cd698f425318372b2f78ab72a47ad9504911f7fc21cfa404369497844e4913bfb2ff05eb812d722c7c0e351ed6e52a8f1a73ed228b3964f52f8998ebe06550384046311721dd29c30a46a6795d409198f7fca1235601a123bdf58f83aefe14b70f21476740c4156ed53830415a7e31591b395b3763fb1ee065b33d42830eaf5c53b5a6598988673c2eaf54543a5e503a2c652050988a494446df3856fbf01f67cc600cb50bd1cfc908b459fb8df33497229945cc586333a9f15ddb218348993f4b26d96462a8f2824ddeca0ae903b77bf031964ff28bc90ede3f1b7fa7211771a72632a3fd16eb6fe1c851f23c1022ca9a4dfd77858ddb9beadf1136082cbc7421a8e2c16ee067f865f145555be73a52838146eaef16b1ea7c657bc032dcae8c9f8854a8300d0b07c0ea3e5875e4cb97382fbe4b27ff72241256e1eccc63b7f55e58055b0e90dc748d3a459710be42bab91496d4fe4b2d9e79c427e0ffe450842420a87a0bfe9d37c677bf7cee0f7c4a7cf4d6687f28c978abcacdb1ab7820f54e82d038fae65a237e5e88101924e3d335ac257b5a17034d674a621b30da68fb0858054bd0794633b633a3b684203c505ae0d4513e2f37c004b1d33b2c7c65ecf8eb4e44f845eb7768af33fcf43a4ea1e86409178fc943af49af5aab08d55dcf3404a93af36628eb4a7fd304adf5058fc4c97d973df0183f989c91a0cd6b26f634f0b26f1a5007f4bbc3f758422c698bfa1f794a3aeddff6a82835ae7d8e2846c8f91ac5c465f07b95b46caea83a356e8a69a40b5036f711467e0c868f6690792512840e6b9e558de401c9a5f042981b7789308e48315a3aece28e90c94fb7a08a18671078ce4fdc0d485c4d3ac701fb40d7229fc817b9de8cec93e846254b33687f617102c6b455aa08a592f3f0b31af5d0f4fcb7c9e30066c079265c78366838dd58c56d4dd876998b4f4315cd3045bd3f45b6bdc6e781daa8d51a699107e010dc2a9c468b3eb13031a3a13de3de43b8a47d8c355032b9a7141a53e92a1359cb0bc3059e6c45067bc157e80871c920308e4ba025823a4b966b8b508760b01c594f7c1d2a8a053e5cba73a81eda523d08391e89d1be3515ec6ef27a91aae98a215c00e0e7eb797ac463d5920c79453d08d194f2f1c58558eb565bc8c7c3307b6e6ea0bdb28780a17b006754a771b53f6648ef5c9548803819ad8c23b56a09f6b125613886a5bc173d8d298f52eab85b90d46557626edf6df67392b3c7c131a1f5514d522b56b73e6302c275ac1aa180e480206105b66d0ca0c1a9b07ee78b0ffc95570e7c51051aa094700abaac002e04a042e7000450b271b08f0615c4158fbf33a69750764177863c1906d0678cf5b869c0fbe50279fc91ced55f0b4d4e290e642a75fc4cd07140982294c39b3d83d350740a01ce75d7a154df546a886077dc566234f0a3568f10e3ec988af19883a4eb9d33ee5c093bfe8535db65879c69d9b27ce80e071e80b814f190759399be01b40bc01847aa019a1ccace809280661481159d3099a81289e9a47595160148e40271a10f887df4e59ecf32332fb025200c5ac5478a6cb69d0ddfaae0242234ce3d440b456472b801b03e1a28385566422f5de2ee8aea60c8e959beca450290256c788dece5acd1534325af841a5609f7bad35135cac6627d7cbd9909027677bc58d1d3a74960fa51a789a8df7738c40289500157218ac756027002226b328d74a610168bf154c5d39a971d3086bc35706efcee869ba568c65dbac59aa9d9132fafb467ba8ae15dff5c472de8a246ac51309e65cb4d68e5ae1e8989b37b7a290b5e2dd0ae6355affa59eded24ecf4de3ae326898b5f26b9c9a28cda7ca906a5e6a67906534b44af3b6542b6c6e9ee540a1af34679dd5d0723a755757d0cfa573d767aa158c10ca5a2ba847414fc83f1469f852eed756d6ae512b125a981882d83fa38cc31766ecba9631ae694fd3bc282cd9c2c07ebcf652efa607d67bbf325ab981e3275a0795593467c56edb279f9e5bf1aac66d63ae8157ade8465e19432dfb514f8d38ab823e4b8b623d01b0de18215ce57c1b776dca95c1f9908d576aea6971fb93022b09b5dc96a1987bb1e6b62a274b582e06d1a4f1a7c2445f9d12a2e103ebf05392a69733732934e31786b3b4e4326473f116eb8b39399a9272c2e778a5601808bd14cdb6b6ae3c8232f6af6907b4163aeceb08c96ad4c873e76699856646d3ac85cf20f53abc6a780a48407d692032bde7a0fd00e94d5df2635b555f2d98931809f0c07b466d3beea8ea388c4c5ba05d0da185e91ce3e8db67a6bb1bfb6ee8af5cee056d9d44c833214d0b0a86c902d44d3763946adb0aa6c57994d9375b05057cfcd0a3719d4b8f4d0fad1b180a3d4c9b8b9b56744fb04601410ac39626fd1ca6dd93ce085733076b360d2b5cbef0fad7b7f69b8528171c784cc3a4534fa45f46b45e3042479fbdc405516d591bad77634074e614d0ca23c03221698c24454a20817162a09e5bf1299a088e7e211b574edda336d3a6bd402f45d46ac027ebff80c874ed20632668582f6060001f03d4deac9cff9ba259a08b5fc26da10090235009641871b030894ad91646dd41cd8c018e7d4e349765936ef84c201640fd2a02e8a41ea66b517b6d991725539259503eaef2908d2feb8c4ef63f2812b02d31aa38245cf9cca488757f262aa8c9da6da3811535a9f0cb9ed9c12fd1436c6e547773bc39b32e890d9204c199f1174a6907959b312284bb1d6ea3279b318de908ac409b35e96698d8556dc5ea862b39c5e4b4449c19279b8ccc693336acf76a55cea993335be65ebf0d683366db2d03b6960363e6cc90310da8b08d75fa506308837637acb736e56d54d8c46d136536d3b0f02d481dc42779d94cffe6a69c4d72367046d95cc29b3192e85083d7cdf7c51933f9ced22ada404536d32c6d7eb2f81b7e1c2f6a53244f823b51c9498f9c19e4f644845443bea6280975b3f8de88909b6a4f5387da73f8f76c844af760303700fc3109bb6025739ca9d27dc74bff7a579732af8bbbc29d10bd55b41c08b7d0fd98d5f8a1d282500c9ac6099f6fa84dc822040e62215043955e8f57153111e9fe20c8ac9719eea700db98f838e1641ee952e68763da9387752dd475b2b22883802ca7847ac5404dbf309829a107179251b4e6be74ea3f856b0caa8647a407ac8b253f996456fa690b19f7686a2a1af76f57c14776c5611970bc3ffbaa6dd1e87c43f10809d5a3adf8977e836cb8d739d6d6d486be8f54618d6184f7c227c13aa919fca89e158487a9926fc84b6ee15efbc94a1cf71383841fbe1bf9695462b1f8cc8e0d28ae5d9ad848146a32b1977aab44a90c55a1399b8800fab5261061af0687bb9a346849cbedbb880acf0a67f31722d0da7efb23f4a90224808c7bf6f2cdd8a1d3cf87c54e94077a2d9f467cd6a5ba2c13c6c004af8251bafc8de92d6a5bdc7a05106fb73bcfe840d68258d803e32516e48241704cd0b2efe9c391f3ec8b36328bd4d11af88f08931f26e14d7b2c2d9f2cbe5c6f854dad67b8366e4df66408579b61bf76b6b9781bb31280fce5e018b6c4461b3d32c34f7c7d122909080ce4cf2f585182cb98845c62a234c699c64a696dca733695143508d428c16072ab40e9fd361621490a39528860a296b6374321aa5d1a2b924df82cb66d1f884aa20d20f1671ba4cea6c25a542e22ce4782f2e2a09194c9a8550be9fe41ebad3baa60228487a07f6e240474b27af9c2344c55c5730661c90bb85a3290408504728053ff53c129b91bdb55b74e0eede061b26f14fbc72c39b4d6c3e79d1b1b1417dc8f10bb8fc129c1d5c66083ec8c9480c1030a0a801857a7005789db26fde1396c7944827d900d67ac5841716cafb1b06254eb235b35850dde3787576fe2078b6f041a9e367404b9f6c9abe87a2387149e1f9599d4d6a25036758d20bd8f91dc3fbce98235525adef5be39e18af0bf70b5861b5df6a2b961e1342158b01231420cc97740279a13a607e0506e980cdcd8f8228159cf7b14994346601131c33116cc8c77803ca82480b8ef1887ab0a97df1bf32879315e82d7c3abed257b01bd582fce2bf37a79355eb9d7c38b2ebf5376e6d6647af80292fd321746029bc442f4322f7b3b3c30dc099353c283957df31c0b0f571081f21adfa1a4f0d8a62782974851d217d953f3be7953de61e27d160266538443b0612630cad73e0c086cf61d98f3b1d525ef0d61630a3c22ed5b1802853066190116f17af658b32c18f605cc33b68061bfcc8591c09a1c0f8a1fb2a59de38d2030f88ec43c2fde04dfa4f048f863784bb832e0e3af09d709147a355cdce1c2f9bfa8e4a0eede61a5bd39980d490fd78d3bca6fc93f3714e6dd69cad88531fe25518c4779bdef17a20722628c016ee063fc526ee20308c600b2f3d7b1e421d504433d6383b0172447617855f9787095ef200f76f8dd6b10f4854b050d481e598b594c179845e9e371d0faeb82000ca6c28e551e160921c6974e1d84168afad061e31180b7c9883f62d958f10e53472fc5165986aa3cea706ed3f64f30609c94fafe237baaf4d45f21a2c923c259cc17e6bcd8ed9d23cf4251f804d1fa7c8457ba091f76413cafcc4a1b7601c10eb56c189b16580e77b30700376bd54e11e34353b22609fd4a8c0101352edc67a223a219b00ebf2604cb43e53ee571674746ce43c2fee137d86f289a837e5292ee7eb2fa234346065e4f576852fa1f1bfed9d6bb93335e25b105524292a98375f4729edc9a13cb1220d3eca399b2fbef2da0e478504f1f7f39545dc90a00b29d7d00dd365b2bb5c2fda9fa13f2fb4fd05a487e48f17de2c0e905424610eabd0fb2e3a4cc9414a527bce9eea29f19f68084fff7ff61bdc6fa333661a9b0fad149f98e55bbffe5c1640ef53166292ac6a57dcd1a828f30b5714caeaa3808c8f2e53a9f75e05dd8773b673232608dc12c85ec5b64eae067e00a3430602ef25870002efa5cbba7e8c594e88065fe028aa90953a4cfe7f667a7f02639dd06342410c2717d97b597a2cf85640aee211ab116b33e74144f0b32d487d0244002deea0af34176e12893d52e2921a52c74c41e0995d642cc84e4095512ca23940742b3cd9c0534141b82465453a8aaa11c445d4205844a62e82d5a05950421c45d0acdf64f16ef17174921ba2774e9d05ea26f42870d5d46a23752d1cdc1167ae7a112641864a87ef16a9a17c26828064539408d0c87fb0a951005d0448422be45fda4e82d991306be11555f43b91670f121930d9540368c08331a5420191a4bd1e728ca5db88464704d28a7c169ed65a29caab4d2e40d7a3c3504734abbf27c694e606e802afb33d28006d9aef3247283daa311aea72e9261dfaa1c1b7c7380625c5b05d084385d46afb2f4f58f2bd355631fef9583c2d1ad6f90b7919628a23a65fdde0384eb59babcd03ab987ba9c25cf436b83b51d0021d42265d5cbd56f8d6bcf1c07a690819bf1362fddf9a6032a30ec259b2f5dc8c3d75adc754ae565999ed26dfecabccd0fca755fc50c74a11ce04df0c3174eb4404813025e278996649206a99a49e10d73b82b17b7274009f549744b79390bd225d5502d6eb167a1d81601d689b670242e3c2457b25749d9479dde3d4147e87163a499ba121b4441a1a622749b9b9d890ff1640e2af72bbec3ae62c153a191f83853e03cc0c7cc0db0499d701ea837064f441d744a77096058f6ab00088e2ce5d83f1591a3e2eadc91f6e0075a30ef7ca0aba9a71780c2087010fe28b2178628c1ace8e234dcdd81726295b5c6d930eedb0062c270e42017349ae9b19478a82fc8cfab5368b952f29dec97f12cc7b228d865175e6da0cc869230d7553f2140b987f80e2239b0f1c28c61f87e255034306080108adb7c4e0d0907839cb4228565158594d2716542948b0e2ac19b94401ee15646b8b865b45bb4a2b0c6f5487cc40d4f4d104e5e1d7908666db687550c1203ad97f0e2dee18a29774805c710a8a211e72df61703d01613d5f5da3b73174d4db4bb1f52ddf9d8e42b81d2b540ea204e7231c7cbf54a59507731209e90c7aecd650e0e5af24f7f0f8a82dabf78992f76ae87d91754b808c95a8bab247a25a341f161aa85610e24108346922226455585c93f6ee28a831427526976ce871fbd33acec1174f89fcc72501711b5b89c5989b821a49b466edfc8b06408881d4da7f13b1b470438ae3bd03722a5d7ed0becfe087a8be060e2e3a780ebb36fc82f97e4504f6ebd651ae12edbff1f2ac61d5bce1590743d7ae1b0913786c256d5523e3b2af8b09984306c60029b4c04315207a220b39faf69320530c9ca230e01f8ae59637f89b9a926dbc683c1dc43b58856da4a10f42432d7f5ea2c0a88d13176f9bfcdb7a9a64ab48c8abb6e55ae88271adbd71be52eccd483f22b105d1d908bb9fe97054b4dae73cdf837b7532cf227a2a121d2b06c32895b909f06603964880981c7a1a5dfd82c605094830ad1be712512053c278eea78df25e86b63e173a4c027dbb98ad81a30b6c55eddde559bb902d79a6a9a79a3910b4302964cc5938c47f0608afd2803a68b0bae471430ec84cf0505a81352c14da711b20048a20a405606c8291c32b898e5431164f938fb8f318462224e1fdaff6293621b9fb6044d352d76cfcaf5545606d3fd93717ab4005b3b6eb662604486c7301c4bf0d1e093e80dffe6e4c1f4984d12f4ef3d743f1668c32d44209becc59b0166d764d2b4e076b7107b556e2d244150f3334df42a90db4e2a40504353d9b5035f79f28253efae57b43dad552c31da0c0cfc0a064b3c02c5269b7a7ea0c02a01d72cb6bfa423ad33e22d19c104528ec2875611ba56f9a83f0523700632fda6ad994347e501529a262e66cce08aff5a68073e20f01b7308010d6e78a00693d3dd93d9f3cf28dfb8f2b878a13406d6d96de798d1d8de3ae07d99ac3d171097ee0b51a3b9345ee2e5d5973209329e67c82e4b5870bb24255b27ae5ddc668dc7897a656defb5eb5c2cc349381fe35da8833dfb608bacda8ac0ebafd6b9e68c7fe3db532422a137ed34f364b6b000b717c3b0daee7d7d5629952de86073d23947b5291ed2f69a1b2b8b967598749585bd9e9cc4e931dc5b2bac20a3769413d185afd4e915ddc1c2f5285790b2c4a150a427abae82e10a16bbc173e1b21a2e273bb01a00f043b81df8db6d6004cb6aacf1c276acf782682f7142740227613e115a2a637eaebda0bde85536b9b3202d3d15a597f619227419d0a66569c03f84b56bafc09d1cf24ab0192a721e9b71373b9b06ddac8595e4f5b85ec580d116c6602daa5cf2dfac335d17655c0925927eb7e8cb643f09074afa4c0a2a296152aa4954cacde496768044f50d627aeb5e821f5b45de9433d9ac841c27aa855a5d6e5b4854672e026deda2e968c27b701149ec71129d031b984c20a7d6f8641b621fdb3bd9f62de3319f0f7c43ba80f47944681e4b1d619cb3cdc34a7c2c912049eb858716f23129f4897eb320bb7d80125219404eaac14559bf204b1c12b890ccc32bfc98a489025422f5c0f623bb908e04b294b8ac6ff300e1da8f13ab3e875e158fd30382639f6c299140fc6eb63fbf787ca54fff1effa9bf634530a3692d74cca210323a4a954e7e36216e94a21897704c132b6ffc657a7fc9df58238359839c806a7aac2434abf1e5ba16fe0cc0304a166a88081114d4af11b1aca7541012967edb09e922cafad3a56f258367dc2c61b3fa523f110a82bde03e59cdb7b54bc54a1c4f0aa9496b737011d69924394020645d6de5dcf9d5a38790020b45f4f26a66be5fb302d28d7c4589eee5ad824c8690b398a91371d7ddd963ec28acb6e8b9105f3fe934b3382c5a0699cff9396312b27011800b6a0215a03b6a359a3135033f5b1b7343659c39ad54786febb404c50fb75cd143eb49b57f3e1c4aa21d98cc22a060adafc9f2174d2bb1bf471263491b1f5bd5839851e66aadba49ae528f34f19731e33116e67525edb84b8b42feb056257adeb11f0ac592923c31cced48e7e5e97dc5929ee7ffd9a67342178f871008c461b120c7165e9c9bb0e0bc020ec9cfcef7c97107156a5a2e652c2f440e6a6f0791379d91d253ae1371f3fa47b67ee5c7c224afc28f121941e9d7994bc36c2a719556b824ada85383fa5012f56854138fab55eab15161ec81cc017066f5fde63cdccdf7a5899e8ca1b5e2e890fcb61ef4917186a1c9cee50bdfe8535f3d746ca33e8fb447b6207ee6541af91c71c9f34612e81be8b992a51b5a732aa08e84af5d5c30d78c02c4af90a7bef8a8da822f915d6033816ee8b4dbc960604b2d40c1622c7bc63b90eba3d6ae783d668fdac4f22d592f90bdaf79d4840907ec12f1a5dcc0aa8dcb9555e1a8641741959713888e6fb341e0ffb89991631567cfb7bac6146147f1257fe4c74aab616ffd60278b5763c508734e209ac89edfc0313c05af26439df61ac9ef05f879ba4f8b50a6cf82ce2c2c2deded88e32d205a210df32e010d2dbeae771d12fc02e3707e7afda2b4f5db4a19bdff161898720d0ede78a1dfd376637548032877318fac9310129cd262d995401252b0686dae6297fb0d6c2df8d833c82d27abbfd330b8a2efb580966e8d63d18198afd4a1481efb72260a8a18bbe53de1e35cbc8229d63529ba14a629823e617eb42aa96c160820cc5053da0fff77f56b04798b1b1b60424521da0464cb36da313d6470f53b57372cdcd2d7e08a5a98d50199919ed36f3b5d3b7c2008e3f409619042f18d175808384031f29108d9ae46ac1f9b5f6b2209cf363e4fce67a15d68a98c21ae315e9fcac42059d0421df9269bfcb2856a02b3f4a989de4a5b34a75234dd19178b2ef0e2b371f4f3a5d43de8f6997440b4a923855bdad261aae37fca4704a6b2449ca9e8e25ee03dce4d268d0272881153951e4536f2af1d4d61df23179bd0393bd4bfc7c336841acd7cb3d10b94e749e918776721fa06382e29d534d01a14db7de5dea5f19176c45c1101767f5f42e767e57ec9d1e135b44eb920bfb7b07be5778bc654e23b857fc76450967eab65ca5a0430489ece93cd4afa1a62ae58207965ad791d70f405f1707cd1286e29ae0a6b68d6c1aab5a7c03eb92407b57c1697e876263c9326d130136bbc1b02bc6854d6386ee51446c9490034595a58a8e38bacf3e2e3588be55d827a56c49347a82747071212667b09d4cb110fc259af9f2dbe80495a1f5b80bdcce7428e2b50ec2e113683f4b2f1361721b8aeeed659c17fbef995aa0c5781d0aa29255d5813548a5544b904aae0ad008a07b2e31dc4dcd7772d9188ea3d5432c52741e35977d4daafdb55dfea430dca168ce95c3cc431ebc771e48a267486a85a91e5880e1ced0ce48962df5c3e2e52fe45ee386c8e748de232954cbd75acec94d34e00d76ec2da181b639c1044ad6930614d5b97b0ca944437855053c6eb78b9ef97e75b1cd715293f09b40d9e295a85bc05cf15a4ef71bdfe209e19f0d890b33a6addc8e076880470631dab86b1832a32ecd43818cc30f90e37de84f38148b94fd44d0597e57d9a0700b9dae6370c631b6941bd5b594453daf44eff87cd9f026e128874521634367ff71d98f1ba9f17ca03a80c2e60a61bd07654f41545db55e6270f3767099f510af7b8847575ec69a4e8bfa393d2b2de42acd4ce0a06c305e1c2089c0e1f8dac0181634b08ee1e27188049715099132532b5114e7d45dd100856c189294b837a62b54e1a16b003d0c0b4e0bcc2ccecf0313a84d8db0e40f0686bac9a7d90f5df7b122f16c203f03f8a7f9ed8043ffaae6e060a35ba019821dc9ee3c00dacbf07638b98e05862273a0004ae35487130ff89edc5a28535b6bf4c934aa1a4211874daa0528bb0038e8cb846b7482cdf46d9ab0d6be8393812af7cd6c8a81f20533fecabb326468a8693c8d96375fa92e21763f6b46141fcccd2549d53aab1d85f9fdbbd7baf1708b302476b2002fd95d346fdc9d553e340fef37550e88eb5825e06e1c16d933b00dd87b9013849bd616d83736c7f68073da0f3a255290d9ed15656d872f7c523fd52a61747851eac1420f8aae7441aa727239a5ebdea84b6af6391809f670142214adffcb7be057fdae8af08fe39551b7634fcbc2354bc48a5c100f16fbf11482f1c4757889d603b8898bcda65f77c9b77b59293b963edb2b5d841fd3ed8110b13e7aa0acafe0e6fcb012d8d003efbf94f94f569bf859479e2011f0f81eacce56a8c528fd2e4f1303ade1619fc5af08aa050d5e83eacaee645e7d7ae48e7a216eb247a611d4529d0f188c53a88aa6067118aee2c5a91ce452dd649f4c23a8ad20340ee1910400904c4d0801daade368ec33dd9c18ba92d514735821f970d540175b3e106a81fec0f4c1aa6c35b232fab386c45897f78e1e351e07ead474f36467316a978a7a315eb24baa29d4529deb148453a88bc6067118aea305a814e472bd64974453b8b52bc63912ad2d203d692af3aa8f2590a086e168d3acda1a968e7a522382f3a0032a73a12a30cae9b5cd1d704696c5ada53c4cdcc836580c11f6ca9801264b225525fe9f034aab0021a2629a7d7c6e47dedb8db8c2c04ac037fc31f3bec88ae688a52c7c0a67fe870bdb4038a5105811b1c635bb8a9d9e08ac730d5c3d78be8936282a74a4eb5b173b781d1ebbb5bec9e1f234e81354d63f2a17d7e3980370afc7acfc71a67514a32ff3b36ae28055879510df6d88255dcbe77f3c335740a956604519cc1b411d69df65297b8e319514e69cba294aa3a2f657dd859229090d9606d0d907490ecce627d308a162ec17efd0f1af683db08f54c925b89c1b92f9925f2400614143d01ccb6a33dfe52bdab814e3e1aaf1822b3736ecccd87d682305140292297d8562dfebf3ae5dbaab348c786e86eb7b058b855079bd03dce5110bd2feecf04a6793f5ba8ead8ac52e16de01b291450d0d6129acdfe72ad299f197d2f7a37f6a2025bbc401ea503be9c8a0bb7483a0562a8b20f71fdca74ef38f69965552b9a12faa4737a766fa091af9bd5f2c98e35b828704ac721202cda0451d87d1169760c230b61793a35a8dcefa63f8fbde6dab0fc98cbfd8a076342a0c0ed86096fb3673100ecf7a9ac3ebf9fef5f9cca287def788e217cfe137d1daa260444d2978184c485cd5ae143d11e001f9207d2c314e94a43e3733084751a96857aee32c58e629af77fad13cd02f5ed05ed3c8763b76a028c9902ae0b04660a3860b46439330f0f0f0f0f0f0f0fafa18d90da083904429a4c494ac0c9624aa14549a694a44c2991bd1ba30de8e9ccc4a733139f2e12872e019d0a420a700a33d470d8f08234014628d2bd2ffa3666fc4bdd0b608082db0c56212f4ace3ec188fc174253b6ede51024c0f004773a82c8d8592d72df09ae525faa0cca93caa9e404bf7e9b54d29a7387082e8e22c0d80477bea13bd1460555060e1a9a60254bf2889f5d77234f1899e092d2a5933215d1bae2828b2fd2596a010313a7fc98ffbbf42d5e022f502738c0b8045ba3548c37e9c534441c396858829d54425d27eb743a56da03605482ddcef531525f1f1fd706189460b307df94ab3e46dad22418ddac5f32b3335b64788d3e4b00b911c09004a373f41c56ea9e1c604482d33d39e9fd6d3e3e549083868c06801a604082b78b9eae34d2569f07c623d84c151d9e725ef40d0e3882d3b9ce7f2d898d602fa8204cdfe3a94b32827d4ba6a29b5f4a80b1087e54aae410f447f6978ae02e68932d6efae39d7e13c16437d19b848710ba11443049736288f40fc1e79862a5194fc61a0d39c19921b8d6c956f991b5ecdb42f0314f2e2531efc9285a1260108249429efaabca20a6f241702745fb266afe885aae11600882b11ce39aea53b764d2fd018c4030f246a753690704bf13b4ee759e52d16bec018c3f70d1732447ac0c0f60f881bf8d172ffadb26130d1030fac076be37a5848aed972729680974f1058e1a36b4f0cf61a38bbf40cd01061f5853e9a172081ab564bb07c654a8e94b7f7e49281102430f7c5f9034396b88ca70b700230f9ce4984468cc931dc0c003e3b9f9f427a1c7028c3b3051925750b9d33930200194020c3b30228745f2d8554173ee041875e02ad47910c9934e214774602f8ae48e1b74c7882e8c39b0a69bb72ac7f7582109c19003933d5b08de2263daf1c8c813c08803a334671271f7941c30e0c068f091a0d29768e4b051e3ee068c37302945e6cdddaa1b92d164b261b4814f8f6a715d73a8cb1f2e3e870c1b6eb0060c36702ac9287aa39deec9da1a5813a2e4c9ee0cd5c08aa71cf2664b73e0285d809106d67c445b84887901061a78558dd8af124b4eb0cc50eb824673818e0b30cec0a5ec5dfeba4174bc6e8b1a3472a0f722056fc200c30c044619c84003c61878f5db6dcff4618881afce97b23d8f64c008835e1252ca9023677b87a909030c380809607c819f9093d69b269d9f5466a8c9a861c30bdc758ed9c73f731025047861e386023e3e70e4781c385a0b30bac05b57d42d29eaa1c423c0e0022fca226598d71cc8f10cb81cc0d8029f3108979cb154a87881a105fe368755ed0429cad61a3464e4b8f13870744a004616d8681db2bafa0717bdcc50b39183c691e1050e848105764f698b97edb1eded0b7c7ca01b07c615b8f6a4619d83367bdf0a9ca90d2674f348cf7c15b8dfac4928b71315583bd56313a3fda8264d81bb1425c8db520a9cb29c47275fb390cf1405f62d63984437156497a0c0e9fe0c16c283656b9fc0e6da24d3c2ee3448df096c6551a3f2e3041db46f0267e9cdf4c499c0c4cb66715744b6f64be094cc78a5e95402a71a25a76bc693c0978b6fd22283a7dc50f0356e612081edb7d6fc5395637d8ec0a63ad5cb15947d903102278448a37e841c11691118897925eb42f46e0822029733bd333ce6929e33043678304df9ed4f83f40881f588363176d6a4cfef20b01547f7e90d25b30f0436570ad192ccd348fe0f18b51b636a467dc0e9341e96cfdc1e70da9982cccb2d0fb8b8bfa224fa7da5b4d901b7222ac742905a2dd201173f6f25d6aa39602fa20413c94d1cf06b5a22e85a35e963de8073bb354fbe693c4ed2068cbb24539633852044b2066c523a89068ca5947db462deacd20c3895f2b8c91c52be2492017b398455fd27ada5833062c04fca1ba345d5899d441830e046fbc2d5ed3a48ce2b982472a81c695f3b645dc18559f6fa4f9656b09db3e8d2dc113c968515c5ed3bad82f7cb7a1a6bf446f255c165d2129d605d7a44a9e02249d14f3f2a1825f1dd93f47efb9ce25531ddf0099e24c5048f01aff1850d2f6e3c8e0e5370dad43393d4482918b55b299e2e85146cd227a405d96b9f9246c18510a9eb540e16c316057b5b21e951d3bbb509051f4b294d6992fe3fef40c1e690ff7a7ad927d8de6457edb7e149c9135b47eb13dd8bf419006ad0d109fe8450416ba87082f16c9f6f9fa67ead9281e6454be00ed0b109fec374caeca5df4e760303a509ae83d2496aaa6c8d39efc8049b3908cd99378e09fe829a8a31e279094e08eff40d41e5e89158820d1d293ff42feca844991a3167867650023b26c1ded968c58ea3aae3da2109fb00434724344d5b9b33436d0117c0e220f1082e930e964b24b5232694830e47d84747233869af9add5e31dbc969540723d8d0ef6b49c4e86239ea58041fb7468e9ea0a4084e4694ac26af4bf4d789e0b564c98d9a2b2238537dbe1abda35885741c827f6f3dd567aa4f6594101d86201d8560544d8b9fa4bbce2a7510c23e72108ce610d931d36ce81004afa1bb621afcb57fe3397e0b2d1d81e04ba61d8ff8254ce56b861a0d2fbaca1a3a00c1d89dae0f1d9d9feafee16a2f37f5f90c352c32c0803474f88151a5a3e4105bd3d1074e744addd724562af9196a9e1d7c60d367ce135352ce50432974eca173738be87a42a866a861871ed8ecbe5321c4a0aef1321eddb091cce4814bfa2777b0d0fb91d32a880e3c70166e2a9dfc5c1bcafb43c71db8e4eb2932a6d869bfb40323377acc1d3526d55a12ad43471d18797b1ef4f6eba62e3be8c076bae7a78d6d08ba9ad1310756dd64fe72ad90bd3e5bc8a86123fdbff82f2c5083021f1fdb21073e67b333edd2229468c481cf298a062d31c6f453e98003b72731df8fc6dfd486d7f8a274bc81c9312c9bc7535929bf2e1cf0393a070614b084041d6ee023476a2fc9d6c9daa2060d2fc7818e36707f91acafd1c1064e86e957478fb8759f321c5b34170b500b41c71a98a4be27bae49b24c9c3d105121374a881114129b5f7f165e8e1504d037b564a6bccd8d2e88206177a1d68488396ee0b96de82fab7a8d1373acec0e6d08b22fadaa2a49c083accc08d489efe66517bd7520626e4d86ae55a0719b8cd2445a89cd3757e50171d63e052545efe9e2a2195e1353a078d43cc8c02586881c5d540000e2f6c1031948e3074808133d91525c690cd50fb15d0c841a346e3f8428717f832916376b7bc943a9ca166aca30b6cb4521a33a7d48d1c355e031d5ce0237ed0186b2538b8682542c716d8dab390a259cec8a1430b8c1e8da4de3b687578cc1b3ab2c078ea04757e771742270e1d5860cfc623e47c5d9a257b05de9492546b95b4022735f9560832749808abc005dd922d5e2519b386b0830aec6545d19c9a24a3630aacc9b413ef75a5d1210526c98f496f43d2083aa2c004d7b088d9de0094a2030a4c12fd1b37f88aa85e56d1f1045693c6ec563a66bef99f7138fa238001484587139898f7fc3de71b061d4d6084122b9db6d184959409eca5bca62229751a417574e858021f49e9d225af8466dd4a60ef6d47ae7ec7ca61cda123096c72ddd51c27ae8767ddd0810446e692d9229be408bca8a89164cc27aedfe93002a7ab94ceca54f1be4a277414a12444777e9269d42e741081cd3599b54bcc835e5cb5d031046e945a55ca8fe91002ff2926d51bb314042ea987f6783a760081cf1bcb7692c6cc50cbc145cf280ee8f841bd315fca98ef93d1e1033ec40bf6b9ccb30719dd8e1e706d61fbb1d2c94a1fcd5015dcc800fa13986d1f3a78c0c40f9a3a4e48aa92a677c0e6fee6fddbbaab8f1b0a74e8809da4facc47689fd0910356cb4b2da7ef38e07a271d248d1b55b5c504276bff4ca4dfcd30cf25f8e89f7f82ca31f1532ac1c312ec86a462d6e89f2dadaf04a7bd322d683135d1130f4ab01fa369ec4e3998e6dc63129cdab9c5acae784a0425c1e80f5983f25f772d4f24b824d2a89c2369cc4d8b0724d84aa2d33a7ad48e27f3083e5975bb4b30ed1ee3e108c6b63a6f49c849768b1e8de0bd640771031e8c6064d2cc25d46f8e581b2ec16311bc054f7af2ae76e8c420c143115cce90ac3377da23118c8da87927514ded8d0c1c34520d1e88e02d674c2ffa53624afa21503184257da9744330c27267f4109ac733a8106c4c7522a6e5eb1fbaa2051687030d1e84e08249887b0cc23e4e109ce6681bb5bbfa41571f1fe71108de32247954bb50008b0c4480143a780082111234bfe5d0586aa63f309eead249bea8fbd94cfbc2c30fdc590e513ba8cbba5ef2e803abc1f3757eff502572b0d0020b2db4c04206161988001638f00e1e7c60548850497bb567919ac71ece430f9c648b9d37640b722b96818f3878e48149afd97edb924b2aa50d37eb8107d6555b83bcff7a0d252b78dc814ded17ef3426ffce423cecc0c9905822e69ae9118b471dfc14f3281db8d1c14c254b316b935ba8e031073e479f0a296e96db4353f09003a336b1934ae9b794ecc4e0110746961a9136c848d9173ce0c085b67526cfa49fd5be81511ada5b540af934c7ddc0e5607e96368fc2e0d10636bfc71c53c22ef3ea6c6027bb564c96e51af8ec2649c83c42ef22ab0626c41c3da5a73b0daca84b228be8100d8c1c95beea274c35299d81df58d2c4e4bf66a86b0656849e18428d5d064637a554efd720522764e08375a8d1513e39235990e6497a7e8888811b2d328994933ce35a6160b2be85203f4efc48193e7880812b3795f46d66bfc0296d37bfda4d7a810b42a9348d6dd993a7bbc07bb2dc9f3a5525752617d88fa0df444ac12d709123071121e6a1053e24bf28b1d4b64716d85342928ecc7c9bedd2010f2c705a62c81a32dc73ceeb7ae07105f4b0827de0f0a8029b3d317267cf1732a95081519274fcbceb4353e052e56814930d571d7848811dbda72bf306652a6467a84581cb25fbf4998ece50bb61c333071e50e02b8886ac09b94bba44468ec7416ce0f1043e6528f57d9541c1d790a1821b39d6c3098c7e37ffb24a1fed5a2fbcf0680297a2448d22d4c804937550714c434e09ca6309dc68ff98fc3cb8d808b51738f6ca29811b8f26bdbfd45b8f2470a762be7162a8a890c089b45f2945d00cad00175c7cb100228035781c81b15c1325d4c8e47fb211030f237011cdf27e2559394278148114f6294fec7bed8307118ac710180b39449f1ad51fa2cf50b33d7808815151a33e9e2c48cdd7305af0080297822ee91f96f2aea76620bc820710d8dcd1e2eaaf9a213278fc809f5c6bada2d4ff69e5cdbce0e1032e05393aa8bdd2dba9341a78f4a0a4a9f26eaa10d7b2e1c51c60c3c6051af0396c4cc0480b3c78c06d7e289ded3ee8910a6efc1726d8019ffde44b010f1db0975c336bdacf0cad0de4f84202095040113c7270fe2416bfa7712303a50c1e38f0b8019fd75c2505fdd9d3b891812d6ad471c0c3068c4e9a949f858a6b5a8ec1a3065c3e15738d2ed18013f2d57c5329d3b14e3360c42c89e9c9b80cf8ae5c71ef1403b64388dcef9fe301032ee8dfbb778d1944f30a3ec8d115cdcdaabeb42bf833a52b77d09be8752b588f413368cc2a757559c1454cda4f97a7362dcd2a18a5c1ae7b4d8614fb54c1df687c370b9223a4cca4824b3923e635a147056b6aa2272ba5d036f2533039fba78b505a75948829784dd394e954599482499bcd82fafb574a5716a4e04c88322f1962598c82edbfbebaad4cdf13e94216a2e03ba48c5a9597d2a7e80c352c32c0001570e1851708d0228b503031e26687f2b614d40b8acbe213ece97351697592852758911cfbe39b8d597482d3dabfd2a1ab196ac6b86864230239687471bec08021260b4ed8c767b189928526d83c3542e5f38b1799e0ccd56285a0732b6414095960821325a3249d648914c4bf047f29a6e9fd384154095982abb49d56b364703d5125b853df7ae7d143092e255ad2ce6954ad69127c923812a40789f99346126c342552ec6c151e3a18096e94ea2b214ba8df0a063e3e929005241879d5766d133596527a041f3c66fadfa83b82adbecf9b2b6ab4ba682378addfecd943c8083678bae6c94155f7733dc862119ce95e488c557aeda3b640c842119caba6b8659aa9de671689e062059142c8374204173a2d8efc2041da0907591c828f31a81f2d0b9e39655918828f2cee63a22b276451083ea6fb3db5b6e2f59d1d6441084ec791a3be17f4887e06c17f783ead1dec2ae7b420f8133d4ae40e03c1b665d71cf504083eb2a4ef8d21e40f7c6a8d9bfdaa2961fb814f214acebf51d3074ea8da3619eae403bb39418268d1d018d53db0ebd135699e187244d50337da35a87fa7f2c0afc59c92744d15fc4a3c70223953e6ccea1d38bf8979b1d52d8687d8818b68e98214617a745f7560d2989b0e62fa54ec181dd8cd911cd3dee84a159f03a345258b869047e41191039f4b97d60f9df62e46e3c0b9bd4409b936660e221c3877b1db31fb94f4856fe0ab25a9f2ce24a309ddc09b12952b63b6b4814d5dd3da3c11797db2817fdf0ccfa742966c296b606cfcefccfd44ed666ae0336bfc3b66acd377a5810b1a7c4f660591fa296860b255a764253c67e0c2d28d0e4a86181e333398bdb2e5cd29a7cac0fb95069535e7d5acc9c048fab4b2da8f2948d1185851a5aa52db79d4498981edbc6e4ac4f5a85e7e1818a1d2ed8e5e1218184f995975b6b1e2565f604349caf8d79d17388b5ba1abaca26675bbc05fa4a8212f8438d9e6029b64cea4a386bc31f9640bece954972c3b2bfdc5b4c0a989ed172f8ab2c08feeb4d5633258b0d47b97e81ccb2b7069ffd4760ca65d5964053e8559f43b0fdd16275560526e2c11a26a52c1332a70d1d4c812cd77156e4d81cbeffda63ec4e4214129f09e7724e5540ffa641b054ec490175963060536756bb0f4a03d42dc9ec07f9b16f3981944ee8a1318112c757d1affbc2b9bc027a5b5a73675d097264c6054b4b8c1829744c862098c4e5d77427dc5981f2a810b3277f8951615721293c0295379436789042e636a9290829649de8ed0a7797fd0258446e0fedc6f7784570476f2a7f1dfce664104f6644d0c212236044eeb2ee94eeb29c8241502df7fa24f9d8b41e076b46809aa9a3f4a08087c081e44e9b5bc9f46e5079c5dd66c1174c5075c6eff88d1ce2b68ee7ac0499d74def6271e146da49d8a1be90d42163be0a38b2ce1adf5415da403d6dcd442a4bbeca0cf01a72b688da1732931ff70c0a451a5c24567734bea1b7031ac2a36604765e7d1a4a5db12520336a827979c93d6a0ae440326e8fcbcbad90cacf3d55306ecb678e494b26a8a746370a65789640183f228695a43902e1160bc82491bcf6ddb5a57302adb77d09474becd7a2bf8b81b22478998b29789155c085e5ac9eaf6620757c1962a399a46e3b6f64515ac27cdb8b529950618e7da9862781aab2c01062a3e8d96a6e4baade70b0dc629182d9e419d902963020c53a067659372670318a5783dbe4ed28d1b19c020c5173046615e1de9363a248ba3230a466fe658ede7059ad20fbced26bd2562f46cb5f68171dbcb9236c94a793a3762f081f1e0d13cfd5731f6c0c874b959fd6b23683b861e1871ff3f1b751e182dd5982aa21d030fbc5866ed33cb1d55217760fd3f7b4a263ae5cdc9f2871876e0c736c5544f32778851075eb35dd20ff51322871874e023a848132165cc1b392ac811831873e0cf437d881e2647f215430e6c89c6f51c82c76c17ba03b0d0020b57438c38741e295792fa396f04074e47daa41dd29dbe5bd4a031230337be02e60131dec085d0e013d43e62f0387203a736dfe9aabc19a6325288d106f6fb32d4bbf28927bd9d0762b08115a529f77eaecbf7118df3f15146d660d6939836e60dcf7c0c35b0213737b64b34461af814747ad99d090d4711a17d6f153a03d776aa7b9a3603af92a2ea5fb0711176195853923e5eb995b6cc92818f6ea5796d9245cd8e814939c493d54bb25219313051339d0433d3ac4cc3c069d0fc135576ba2624a99a4e5d582e7d818f565aa76df5b4c70b7ccc1caae4bad705fe826fe594abd4940a165a181738cf987b6409a5a7712303ce058d195a6c81cff590a46ece1484ccec10430beceb552c2dd1f2a6aa64814df36cfb1d3f5cab9a430c2c30713f77d29439076dcf6b5c1a625c81533d55b20223b2ac4cc67c568111398d1252e3d9ed5ea8c08925532e2276aacf488c2970498988a6b4ab75fe1e430a6c3ecdf9a3dc14053ea6cffe74490f054e0409a92d64718feb13d84cadfa1da926a60a72029f2505734fb5d9c2bf78c013623481ffdfaadc986f26f029632affac7a09dcc8b3ca66572e9a2b814f9b3269245d31d9a649e072d9668f562281ddadbfce51c34dad6ee304318ec09b16a129f6a7dee6d1089ccaa0eba77c2c021b4964a5f04ea9ed2644603fc5d1cb36c9cbed2130d23d7d345a88221702af315ae7a867a33925088c1ead6934440e086cf88d98bc4f776143025868515b88f1033e48127a82d0cc07bc58dedb8f145b375226f0372af0f1914288d183f4c9b397b895e2011f2c95aa60254a5de5ec80357713f6f11443074cce98f7925fe65ab95fc4c801a772a8b8a758282b79e2888103b6eadad66bec1bb0752a447d1c49f921b2019f9ff2667f91196356ba8851831834e04314d7d851bc553cad8287c0f220c60c3891556e9e27e5516d8921037e448a98378ba608316250aa684c99346968ac982d9ed29d36f1ce093160c0af78b068f133ef525005e1e315dc886c42f44d743f5cc188106a74793a55de7b01400c3e5ac17d86b0e89e342f7f7c86da711938ba0c070226f001192df860059342d6dffdbeb3d575869a8d1c3256051fabe0f2b388ccb1b7ae4a7ea882cfc9b2e4cad2c9083c8d1b19c8f1910a6e2348ec3fbddfe7251736643c6a2ebcf81b6a15f840c5974325d50b2529d53b828f5370a74fbcd63d86469a22993ff65fc8d87e2958cd8841097d13ef5472c607290e4a464cc26a1b05935d2d28efcc19354351f02af1cfc52a49edef43c18e4e51d368f1d44de003149ce8788c5aad2239e5355060033fc157e63feb20b38968d4134cc89e92d648bf152deb1f9d60ddedd63f7ec78d14bb61434669c00727d894b41bc32c4436c1a6cf2239ed4fdedb574003c78df7fe19664fe3468efdd004a7a96fda3666b7f493b274e304047d6482531f8f24427275a6bec60726eee312f76109ceb6836eaa78df47ca161f95e0425d54e710733e28611f1f9360f25dbe25c18564d92da4b07c44821141c40eb5f0aa9c7c483039a8cc7831a6caef9a47b0ffa1f4a53121e4e8c88723f8acedef4e4b295e9f1f8d6094dea64b5ea54262ce08aed453d729a14570294212fd1666213fad085e3b75b609a272326d268291f984fada8eaea7ae2e3e10f1e8e834eddf4f2d67a8f1e0e310f96108fbf828c47d90027c1082138b987473ed6efc67e0e80668a1a9878f41dc8720d8c993c36d93e746f70b4302c1754c79dc3a4bc5dcfd0cd4a800c108ed587944e211287f607d54ca19eb5e645ecc0de1c30f7cde8c61dfdb9a472db0305f08e1a30f7c78b4f51cdcde02c2071fb84a1b2db25799f6f7b1072eb7a5113bbbae4cd203232fd9e42d553ff2d0a94d6b9d94c3942cf8c043e6a2635ab5ec5d39173466201939ce8cad0c3eeec05f7aac8bdea66bb7f9b003174a7fd00fcfeca8918f3a900f3ab0e96d358b6db238e0630efc451c6d1692c849ab490e4cccd44b5df9f2e4fb7160f7357f509e32ae780e072e079dd7827abb12b1f3063e44b44aa3ce76036341432346104a3f881f6dd8eb47d297c89a0dfc5a59ecbdcdda4fd7c06e0e59e21d94ce2162d4c09889ca7d9d21c6a453d2c0e5d3d3c152eaed6c221f68e04d44a7f1d59062eeefe30cac9578c531e96ba9ee871998643157b2f4dfbf95b278f8280377fe7ecaba554306cefd5b44a8d14abb6e1e3ec6c04634d116bf2409c9ee8718ee230c9caaa77b9f76570faf0c1f60e0d6db2db544f32b8b99a196650c1f5fe0bf82482269fa68eddf0b8cca953a889919281cf8e8021f5488a6db3ca4b1b5b9c0ebb59dcec9cd45a7b7c66fb15be0728896a8d7e4d458da628b1a346e74d1c50c1cdd801b14e81cad800b4840021f1f0ed042cdf0a105de4663fa8de469649eb2c0c9107a4aa9a46a9b7d0d7c60814b96c4b643c4ab0cf12fbc2816f8b802e7191683596e52e275bf173270ccb821638b3e12b88004245077a38b2e08083eacc05a8d47f6097a0d6c4123011f1f55e0b26d5d6b0ae9196a6a0af8a0021745e737492928b724f442468e96e17ffd3105266596887834f5e11f117c48810f9d981fea2f2283771df8880297b6c62707f32084d75ed028010e2870bfa68305311de266446f031f4fe083d094924ba8baf0e104fe449d44b7dffd949c42858f26b03d2684d2547577daf2f1714ce07d84f707e176697661a1c5165d01287c2c814d49aa7b1c9dfd42dbba527c28816b3b377d37ad9cd9fbc34712181952ec2c4b3b12788f394809c9424d33e508aca6bc6d97fdb72ee83e8cc0e4e039849cd3fef111868f223036e963e5242302a3fef69b23cfea2a3504fe62e6e44983f6a67a84c06877644ff9930892a206f808026fd61793709328d16a20b0192b4a767111fe1efe80bbecbc69cf7248ce8b0ff858f957e97475f61cf9e801579f5310bb3f3f78c0ebc66c1dafedd2d466076cccf422bb47e53acdb9f184001f3ae0f2b42625f3f76be8d4ecff460ef391033e5b9ab2945b775bf2880f1cf0218e4e232c88d0bad7f88f8f198df8b801632a12a396cab944e86cc067eb7ad296314bf8a801977489dc2193a7840f1a70d2b2b7a46cc1779238034647f18b1d2b5f2c35a166e14306fce7cd412dbd660bdaa3153e62c05eed450a514d9486e403067c502551e3e71399eaea2bd85abdd25dd7d178a62bf8edbb9c837a116999d40a3679901f42ff4859c18a5fa54dae238f557011ebf3c673f31b1df75005a33ce845fe2474b3728f54f03925499d924490a9f44005a7e377ea177d4966ed789ce2d7ca2b1d3c75537095e22f724f8594829b542234837f1ea4e064a888d51b9a3478e9310afef2557d8e4a4a2404a51c3c44c1f649dc102704dd9da4013c42c1da59a6b4918182af6cd9bf43dacf7ea62e920f3c3ec1ada6ca1c4fe566280e1aebe10956c3555376cbcf5093f15c6c5183060e3bcc4e7012927a50abfd195addb091fe5c7a7082979083d98f593c36c188d64692d9a3f79a796882ad4d42eb6fab1e99e00a6de02fb54549b24dd944367067d965c13a9b8ea4d7c0eb28937ffd5103274544919d73d2c0fbe67e4caf9793caa281bb929bd28472cf6077eaaf8f9c3403e725b25e4cedd9524a193893125448882275bd25031b4c9baf08d5a4447e0c9c26bdca1e1e42c42031f01e3dbdbe25ab6e320c5c5a25a12c9d704d2a6060b3e5cb4df22c5e90982fb066a1a26ffe158fbc17b8ffdc39b4e25de093d2b14b3aa95ce0458f12692dbb057675bcd592d4f6204b2df07d622aa4ff0e4296b2c0b64889a13f72988f05ce7545055b8b7832bf029ff22819bca268057e4d6d5805ce3b5fcc937f24d353810b5a4aa34af44e1e4e81cfc9432d058d4881cfba5b25c213056e437de648f1640a6928b05622a9cfd39757629ec0d77fac1c437950a17402a3dca2c8bf8871f3ba26b04169eeca9373ad746302a3925049f28dc5d2a725b0c134c98aa5be415b94c06b95cc244a4f50515249606da3664f1d75bd26a98c21814d5164c86a4ae3023b02a3929297458fe837a1590b981118dd164466341d56b932432d052fc3460e19e450604560eb6a42bcacbad1412442e54127f14cf22b36047e52fcec907933c8b00b13025ba222e513a1d74b75160456f376d09245e6d8498de34fd0cf858cb51b5d74610c087cb2cc5cc1feb27e8af6032e454a2993e9c8ff79643ee04a64fda63508d6032e4a52117c7d7d720cf29f81a367d4f8c214c078c0c5bcc1eb548d4db2640008b6034e8d7ee7cbead94c9e706819311d70f147a4ff5ea82fe97f8cc172c0fad5464f614a7ba3f803c30177e2aa1641d6a6c9abb9011bc9effb3a8ece1738f4b46881d980cbe8ee41890e762542ac066c90f194a854a63289241a703a5a864ea33a88f47d067cb95a8da58f4c06aca6ed1cbff3551411b2187023eab3ede73da56390c1800f9542aee01d744b087a059f26c5bb64ea96a26d57b0c9dbd279a78f92476d05a72668d34a23f1344559c1c59446927e4d57c1a98c4984eb6bf01b53156c27992cab68c4ea3015fc660ab2b4e7f0182da8e0d4e82f997b84679a9453305e793c4fe68a2918ad2a167f83f5c57829d80c8b77c2d3a4e03bed22d9c4dc28f8507293df474e147cfacc9ec15348b9da8582db546ec17dffd4f8060a76c783daa02b745f8e7d82d1acea929444a7f2cc136cceb95b3db34eb0d193166159276dba8c138cd98498c1838e96a34d70ea7ad36f0c1d71d4046b72344347ff18b393092e33b7f6065dff2a263851da36b3b897e06292273ce369094efc82f03eb9ef5aa9aa04577eeadae289128c3c59d9828f3f09c6d46531732b61597949b09ed5f6f4867c2458ad9c2f49cc6022760e2478b55117a2d4a3a8d123d84bbd6572e3b66ded08fe728510240769ab6937829568a2e27e2a89d0352378d19c2396c8f5223849ebd529563a21f38ae02ee42444ce8e3f4a2611bc557a45d66f11c167c88b549d630ec1aff7a8e58d3104ff41734a4246bcb68829049362acd6542683d94e08d64b071f112f340836a75349c84a9973982a087e2cf9291f990c0427d3d4ba9bce2f6e4940b06b1e4dc9ed9cb327e11ff8502273a618f5031febfb5db47d6512f6814b13da84ecf841c60bf2814bd5392cde7d6889ee81b51ffd99fbdbd7cda20746d276ca499ace08ca0393728e133da64aaa170f6c32fde423c5e44dcc1db8ab8dd8a1985925a97fac0e9c103a84eea9081df89c2832ccfc9c0317e615122d24f7b44f0eec47db8b5945895d7d71e06405215553e45788393870fff9ce552bac3b726f6044d2881cd1cb972073039f2d2f2ce96056d5b136f09594f24af3d0a65e63031f34677f901735736a6be0cc3ee7de6cff2f2aa6064ee5cffb66973430669dfb476a16919da181bb78a29a4967dd339d81dbf5bcb142277a7ecdc0a78da64c79f805a12c039b9288a7f32559ca181918ada13dc772cda41e039f4b83d010ac8a408981f53aefad98dd61411206564ffb586d9a860c333060d93ab7721057eb0b7ce7bf983faa7deeec9417ec6a5329e9bb3429e6868d2f70fc16349c7c810516e7bea8a102cfd15c2ce0e3a3c6e7c8d15ca401e4a0bac085e705cd2d3e17d88f549774c9d316b8e4a93e9a52500b9cbc4c72372fe8aaf72a0bec66cd20c5f2080becc79049e97a6ea6b194e1b8ba0213ff449bd4dd98f309dda0f18509509f1dbea0acc0aee6a49fc1b7d2e972068e96615505de46aadb57b0edc8a6196a26e8c2f7074505467b94fc18ea428d8360a1a6c06ac618836a8d90c43bfff8f0a20b274d2829307a54123a2789b95f1927a7a2c0a7a89e2334ae95861414b8689ec9830c494ad07c3e8153a133a994d652ae4ed190423981bbb16e3725721b866a02df1faae9a344103dea7aa198c00815217bddb2876fba0436e77b87f0ec2b81f75c9d3b8a3651229b60a824b09a4ee7e0393a3fdb47978aa64c17ea08fcc8ef4ffdd1ebfaff4e52bda8af3b5045e0345ea7564b9f82a520192ac851e30b1ba7ce0645042e2b4c2deccca4b95b831a02a3259a11026b6b7a83901e83d4cf82c0de08edfd10433d5d12088cec3b6da2bb82a89ffc802dc97fa1cddbf201e7f613c392b69c2ee6aa07fc5b9a3461728347ce140f58d39f2d28cd5bed80b153a52383e6be789d29940ed824d4d59526297ea3ad00142a077ccaf72041cf53881ee1808961d6e92e4fccbb3937e0929ea6c7a4531bf076a153b4e4f89fdc523560cf2e6d70f7fca1538606bc6b55e9b7cc50392c35034673947eb588556b6c092503d68277b57e4c79e15dc580bf78ff1153a9c70f220503467b90173f7743428c57b0a7c722f5f9565cc1c6896fc5680577625ba742ba6c5e3b2b182dee41e69034b9dac40a3156c1d7298d41afa555c1061db93b87e8c64805eb5669bcac8448f1c2196a35fab940c656100315aca49d5c417cbb0dc4380523f5bcd5b34677b77e3310c314ac04f9c1b4887c3632a5314ac1ab558f4a4d69f37db6f02f6ac8c004109b816af48d931588418a749a9b3ca19121c628781d212c5bcf62c8498982db58e9f2f8fdae6f2a003488110ab63e930e39e4d441e731063140c15b4b88fbd7b7a622c62738b14e9b513f674dd28385165a6091a788e10936875876907fa226d73968e0b0e14572214627385552f407b527d535b2450d1a4e03bd0238c1e6d851b209567363ed6bf4383aed4d88a109f6849cf4e5ed255aa24c88910936e61092334f98e78b09b64bcf2269042fc155d0df14b4ff6f75c812fca7894907954da413a54a7021735ab41083127c5516bbf1ec0ea6e49360ebc2124312acad5884b41ab4238811892bf4bd7bd0ff6240826f11b55a3313a9427dfe860c1b19e3116c7bb074227e899c42770427d3eb24e5a153428c46f0954c475e8e1416623082fbda24bfc23f8bb84c6fd26b31b50145f07fed9233de5a52a5c1438c44b0318629d1bf3b1a2597818f0f44f069325488db9ffbba5e438c437035f135a57acfd93215c3108cd0bb71f5b62aefe8310ac19e86887e3a4d57be530c42f09e29d967fb28d1ec1883609279444d22699c148f21082e558a559eb6744a9581606fb42555ab2240b0e9d4574712a910e30fbcedae5a0a295d2a8e02a82411a52269281609045220083108cebc07e312000000081a140663a16830220ef54d0f140003582a22523a341a20261a108dc681913010088481e14018140885028150208e84711ce9440f0fa10a8ea20c32aec88a0b5d2ba0a6bff5d4f98a86ab8caa9e0fee014a4d2a8afbd1cb5951a85a684a41eb4ab956e6aa12d5e2a65eb8cad082940eb4d9cae8f4806f163f0a0b75cf6cafba74a5a6a932e596e9ab0c101c9d6122534f85bf6e9bfc683e74366dc11556b33268fbe9abe24fa92189403415b122ca3531d789a80947257aaac8abc5ab208a324c78d6f6b63b18b1cbf571a932357ff991cbe2ea19f8de99ac95f068d7870ff96ec2687d75c15558bcc2df274eaefadf9f99a46046638ce89c13294cf618c94de26a0cc78cc19c1d627216c69a27b1b3cd8069f9f81df640ec70f3d353cf74630bbab474ce5dc965522dc2883a6bea8cdd6bf0146e6f76b00f0ff5ab02980bdc33af510919f809e221f8d6ad32158169a98bf94a43a7b9c5fbb5c7042830abda4478dd076243cfa908de9f6e5bdc41af203c346f6fa5c18c2080b01de1a58042c9b7d63a78dc890bec16729404f9e6b41ac4d97d3ca4080bff2027e52211d4590f542eec0728170dfc4cffed1e28085f60dc6c5904230dc642c25bb8d891b396d66c33114ffefe925c3dd6cfa672c533bda43734b46f8ef37033fb90501a802eb4a47d83d1eb2b060ef753f91d7b67bd2186245956c7a4806bb9d979058cb26e6984f50319cee2277c2b2b42e5dd99268974d7ecdaf0877703ad28f0f87b328a23384ed34052a0ed8f64e309adeb6bd88f05fa4156075bbd6fdf8e876f6e3c35b0b785ba5238293b93db3da70ea16030e9f2fce9c0e86be878bd9d067093e1c5874c841fe217a2bf18fc869a09fd3bf69e8f1e094baf38e070863ad2dc52e0adb0dc249846c0bb7e9806eeccd9cb50e22fbf098e5ecc0bfc06ecfd5855187e0288055e0a6cc4c8db6d8538e58c38a89482aa7befc630151b1d6bd1522745a330f1db8283c75b11bb2edc7c927e93c61bb4be0a1f49b2d1f8c6b05ff0667b085e5e20f2bbb4080b614c930d30940208de0b82b93a662292a495688f437ad1f7dfbd8435ed22cf766f8a5ba9c5cfa29a847ec0d19db7eb392127a15127fe6797494b468a8a3b8b32ae458c203bea0bc18db6464591ac26e9c82289af5438138bdb4132c1b99de295e0c7a76e1c5dab341927a571cdc34585a016688540b6d6863ea4a44325e0bf19c11308b807df059a4b31d266ab314aec2ec0d7c471bf1c3b533278c0442bfe1eb3706f7a498d5e830655c115bb34f2bfb2636c4f7ab6cd793c5ac391d03082f4d282d03c6af13640045afbee18aaa3a54153df4e821aa093a1e9a5ad21260024a29e202436819d2179a25abdaf0d324e161ddaae1c794d0ce615f87c155b0732e01577f04cf1dc227776609399d3355db75a4fb1f4827b3f405380b7f108a4697dd290c406f8860f54b66c9ee74ef878ae283ab65b5649aec84129ffb7015016122a7702be0f222e30f70ddb900b31564bf4cf459bb563c1804b1b39a42a92ac3683134eed5cd208e33418d2e4e72d78f09122e7845378dbe663b82aca645b21733f60ac1b3a5c579b66da55e81234992f3805ae7db88dc141c3767544342cc96c21a032cca4a1dc4ba5a3088c685e023ca0d679041292c63e3b56b9eec183bcb7dd5ff6b2588e81367db76597e1f843c54f245ad5499fc0f148250835cc71c2aef3ba33d499b200a45b28d17dc2c7f889aa236b33ad65b3147aa24cdf691d592351e9491e2da32a1a7df0251eff862de354a5f6229590206eda64006a576dc09a49e73c48ae8e46bcc81b813462d45e81cb8e4c2b0c456194f189dcf92e3e1055e915cbc82a856b72b3324e54f9f8dc1e3d61e5b0b31f513f4ddb754ff7cca18da762263862e2491a6393ba7b0969e0c5d2f63d514ce470f96ad9669a0c0945830b66d5427b3aad663efee4b4f6b7182b397f71080db6d22c5d19bef9dcf33e52410c51aaad0b330fe5a0a42049c15b9e3de8580d663087455a6b6f3037c7a88a82a728961560ecc335c094999f294c221b1a86372d69aafb9b1a06067f5d8c8bce0d6370f676584ed388810f21abd67cd22c3153039669940cc0a48b201a25a932cccb747414176ff587089c296c910d035753e62a5b762689a7cf23dd7c5946eb69cba7a091f7722a853c5bfd58a51a1229174f0ff5f6f064ec446f53fe631ce9323b1f038003d0f52aaefdff4725294d6ba870c4f1b827edc8dc8e1c3604aa45dc78d10d545a664346866b004f6644d56c6a7e381391a8aa95a2a519960d01ef110a6401b6df484d62843c4a7f7a29e3a07a37befa16a529b3b059f7569d71b134f01b135f18ebe220b65f2bd964e42af70f56de0dd792b43fd79b03b3a6dbd863503ad392e3e5deea6e8e820ee4a3cdb4842140c8b54cc0927073aa513614d83d95d759f3739c176e4a9a015896994078bcee486388d3f051fab043803d8cc3b54f689f37c1f714b95fe81e4ee4410e59a22480ef5f68f148012ef979c92b171ef8db54768bc11e82325673cd14c4933681f44dd29a8ca0e89f398599acc8306fa6bee5b461933293332a5883d3a3b417b263107b98b7f28f8e2d8bf85338eb53e8b1a588063be447ad2da264506b30337ec6ab123446ae0f87ba9ed40c7e70e33a59180d7558815a424af1557401c022899fbe46993c18587526feba74e6fee652b157cc968e9290b460424dd6e0c3b5026a2cb6848f2a84e0c742e81ae167e8282a44a3049289d523cb03ef0b60d08ee8b8640feec235c8e25237c2ea6cde6e46eae1508bb622532a1fa0d9be91b6f20ed4254af002d3663dc597b23e6f8c3c14afc78e51335edc62daf7ba6ab129996e5ea6447e43ade9849118644eb0419a3d4ad824f9193a05eba2b9485bca778bb2e92c4868460fa359daa3b327420d95a00a633a14220d570a53db2b025014527125d6c3a08b6873048b607866ac3c85c56bb2fb3f5e7901f9e3ad2490b78c272d63943793384d57f5fb3be41ea6260ba57e9722296972ae36ae620186ea4bfd93ce4382531e42aab3b67f56fc54412cdfc270812487ccaf6c4fc3c9914866abe65e110d6e0b33c3597e6d3879024685a5acca745edb9486571acf07f230a8bda9d2e9f2923060bd9672ef6c4dcce0f26e255853cfa681e3dd9237262c970689576367cd6ff7956b9df1f2b0521c6e563affc96aa4ee44c706432bead59332c0591da0114807d7e32f5633fbb12b54943c782c603f43a24b3bd1aa538644745d98ad4e2c467dfbcf57093791dba9f75047a353c26bdecc429ee568e720d66d61e874c3eb569b2c10ce2526dd9ed89f1a63344edd259f602855d79e2721436021653111dbde067e8c39dfaa37f3a2b4e71e547de5cc4b81fa105ba79a7cc97cf8d230f753799762df14f65b34de75b2d56addfec6a2eaebbb7960a478fc619417e2f2dea3fccada923b74b06dfdbc4b4465b60800af43dded429244e26d4a4f50aefd34681b5603d8eaefd02a339326c2215eec8091366be77583de18f9875afb68481cd82f74ff674939095b344ca2d4084fa91bd82ca5e0b2142f4a9bb62694753c3adef93ff27b2389b79bcd9ddc36264466f6bfa636c76dfb6a3864ea103d6094377dc08224d6081ae609a9875890cd5c9de45d6684f30b39d9dd2fefdc2d4f7ee29a8adae69a658a6884314a1881d38f2d49d76461f359506f43e068483c358433820c7993b8e6bb148c45e8a904cb14b8440007a1435829ac8724190a68c2c0293ab2e0abfe04ceb9043b10f2561bd6831c074f16c90684c96a0e92ed7f68a0cd3245150921a632eb4b8bdb06842d0ca0d62ede1d0293053b94462353c66cbf26b17b016d9c0fc8e2fba5d22b3cf0c258e4f9fb14b0f355168b4604fc68035f3cd1fe4e875ef48ebd5f712a9baa179908e440c7a77f80b604775670e85947d8b0fe8e11047a81c56c109a500383331cf99bc7dce9c7a389fc875e4476f19de171e4936df0e54c8eeaec26ff38b2c72ebdba214875b9efb95cb0800ab702fa072bb4186be9aa88199ce1480f91621ffb88fb3aa9c68c8775c159b1a27b883c6c7410c2733b98a3c7166b17cefb3506651c1484ac944b9649766c350a5fee61a85cf4901ff160c367989363405388da425cf7996f6f8182204ca89fa34b119aff20427e525c33511911c72e4e4d162b03d6f8e7653426855dc06c1870c94823d80d2278c62e4b1f715a5e4a3f60089409a47c78883af64218056f6539a12c7bd615e8ab19b4a4564c25b459e5c3ce920f49d4d368ce7573e48aeb44087ae690db4420a12976802859eba813b88ad0234759b8e3c8564bb2036f21b5cc120ece61ecdb80589b8da150df63d23aaaa90e25d9df002e61dd87cf13b004dc3fbf740978eb6efb349037d4ecdb2694c410da386cc7bad5937a067232da02230a9a885824e4109405e92ff51e81a055b56b90e9083d11f97f6dda63013f90a664f2b3ab0e47c480e388c0e925d8ff92cc378ed08bc208bd800dd05dbc30bf7304db282c8cf3e6d5c610766693af0ad2471d20dc31457bcdeb23507c9b6d1d9d86f902d7101768a913db9d07cdbf9e44ea9ff00e5b771a9d78b469eb5d165c76e60fbe4649831529f4b82b8e95aa92522d00cf740405eec623a244ca2d5bb82af2dd5f515f349eaa4a58cd21484643869f86515052936b4bb9665b731205766427b137031bce3cdf32ac9a78b7d87981143fe01a1870f3fd1da6b2056877763e5bae6609fb1dc4282bc0478f2244b5ade95bbc0cdde018cf25df80725155358bc5d0488bd5c1066cf2c0589b3242556bddde9dd091ea44405f55c7e1722a42ba669e4aa740c49fceb6a67560a28ed2d71f7f147144bc41da845d1aa2f35f97215980175502ced6f760059a8c00cac02e8a877f72524629b8a3548338eab82a806e0d688da288faa3200c10ccb06f91b2ea53c5a14555abb8e882b33586420ece9152952ab8c8f50081a01b18ff41ff6f041e2f93d465d5b3a5cb1d9fb32f6230012547253bc51ccf7f6bc3b568d95c3b175cdc37eccd929b77f7b68624dd567e9ec8d5c7ef5ba30ca88c01bce8f8a46341e9381636091e51eeb64e86d6e38d98b9a47630c5bac748a4abff61297970e9eda38b0f9f9926bf9c0e8780e7efd6eb0b4449fa05a6dd689ce662a9f0182239a66b04ef146fb1eefeae080348f6fdf82069596688642e3787af907f544749cd22f09806d13df7ada56129668512921de147b053f731d1f7125afd0d6032a4562dd06bc98fb3971127693167936533082ffa3478c85fd8182dc23a8270ec18bbaa336ae500d5477ad23efb0a204dd3e96f3ad6351d91f79d8a23d4fed33113d1354dd0c466d84de9549bb8cea9f622c25281a77910b9414cbb34d6d600590235779e6d675fa2c3e8bf1516fa95dfdc99cc44a778f5cb0de8abc8d38310d8baea7489094b7f9151694c93d305b536da6f1432edae98f0eb55b9743a5c3a60606fb12e07aca1310db5c86803b4ec66b7dcf052353f37426b36c65bb31ebf191ec67938931a23c854228d882025dc4289f8606553d14e5b141f1ad9a903a42b183e3d2f3218ca0ca81d2fded7dac0692fa937a306ed4222afa4f31b5e85f5b5baf11e3c0516b7218e77e17eb9e3ee2479deec2980aa88c90ee2ec57319db4bd05657f876b7060f9ee6875ab854ef95d630021a1c575b51374404f0a0d505637c9863ce1d44944edb9872a03c197cb9583bf2c0e916fc047a04bbcb6dafc35c692781fc500507a7bb5dffd04265c732b60c3f45ed3745cb1238a976995fa9e2814bb7800d17f182bdddf70c440cc735ddcbdc467874fa89e1566c9fd2d70d93362c27eb65d78e68c95d9806e94df87a42679f461edaf65cd8aa1c929f01b668332964f87428ce07a216a29595353c359fa19bbe9163828a2274a9d7cbb646e5d160af0613c6253e34bf67c5baea255a1b1d7823acf730c95692bd280a50c2747394460546e75422ca961a01b270a73445855e43d7bc9c824ccf7b5fb82f698e1cdaa8771ea3013918563aca63b279a32ff82102e088abdc63967728e946f27d0b1748011976c4298012acfeb63a5a152d8a0f8f471520122b6bc853928d7be748b90b86cbe741a7a023e5968b403bf2e268c260eb1bf129aafafac0693e942e799baed33e184acd9339b44caa0662de0bccc90962ce6d2e22402f22cc2180926856d83ade7bd4fe615c93746bb36db5dfb8f52f054934e0cdfc4926d39ec70c0ae30faa84b1c07536c41f6ab338a406b9a6d72fef2c021988c0acfd9340d84ee83e5fa3d4d912500b7658057d103f490b73af20d82283c6a63ad99823c6d2cacb940d3a8ec0add23378a5619ecd1732adaf9b0d892a427377f8e344bdb94a04f3d63f3fcb2c79b175fc9153e333be81f4dab8d7ca6a4d31acc844d8f71b7c190c7f63457a7bedafeed917f146b7fdb922141423d50d5bb83a452aa217d2886d4859bde54df7e1e9b4aed8ae6c144e6263b923bc11b79bb2bad2514175cd854e2c44384fc5af72f8836eafa93dc5f38e7f0172c079a030356cec0d0b5562a49ae405b7a04d6e903199a5efcac17c061fc63f42ccc5551ee557401c6d3e2365bb536b579587e326a595a8bbc752bbab9ea5cd9a4da6d41684c0a2b17a6b32f113ec2c09ce0f471e07890dc3a13b0f982308cdc412808db829ef1d7846161d6bf2bc74803d8bb2acd9cad890d7aaf6599c604936c80bcdd2498cb9bbf81e6a53cae73de2d408382e07e25aa059811eb1ff999ed42276d0d080720053022156af525122fa65f422c589ed53dfb792c510a703c77ce2b84d54e5782ab5869c70d7598da6434aeae21e8560ecc2301d7424129360883193ace0dbf18e353d8424ce5b80d8ca4fc3ff16ef75256d7a0570d93b9ef396e72ffa5cf541b722935b5abaeb7357d60068013245cc2cc81a7571fab7f9155291f2aa00befda8b8981a544079ca0c9e9ba6c98645071884936b9c7ba6dbd22f55090657be6124b761ec12920283e053b99aa2a3cab3d3294c16ec956d421ce3afb8f1225397b8db4488586ee2e97229e32648aeabbb62545100c4c75eda431e89be1074218df67cb2d863437143c342f41b782a68b70e49eb32e48c94381b80a139ba93a9005ab004fedf653c7bd640ef70c0dc66c7b003e0c58a0c6d4a03026cb868399aa21e785b023bf3da9fea9678185dfbbbcb8e4a5ad3d6c0a1f1c94745c52585e3201be8843cdc4c0943e87d690d610f8d32cf3849482190d724c269d12e06b6f678f7c70e9f7499287a4143154ecc0a002390e261feb5e714786711fd73a26c9ce0b51cf972274236bc9aa9494f9ad2650acac3b144ea33c0abed8c5b5a9d0a5481b543d59f350011eb34de0ff7cb2074f11aae5767082ffa3939ffb7a4d20f82aa0d35c532b90c625daf5f3e9f06f70b78dcc6f5353836acd98e49d86a0a796b87019832e313428a139f5cfad74f8f19606590b5189eb2890b025e63230f66c0a4af94bc7e679ec54a71bb09fb0658eb00c0c2c076c251b857005ea36aa5fc3a5d12b621be8df4e279b286c7b4d8bedd940aa2fcd9866af709fe5d744a1ba7672ed6a731f277f5e166468801324d942d3dd9472dd4b8b62160adbfbea45d8a2ff858295766f61a7f6a2014224639b64093b64811ba1fc06bd99699f001ae3c5b6f7dfee929a3168d62ad55acf6fff1373b2ae6dee4adc74e30c8919c045075e0045297dbbd9d48b82058e3908efd20bfad8c482097d361a4b5ee2c90650ae35815f3510956cc13bf07506099036fbcc765e8e58d90b1b2d2bdcb4aab5a7f044731444a67c5892a00fa0c3b11f2655ae799441ec4a60b484d6b7992d73e09d526cb94f2c5e02ccea6df03201b4efc73ad09451e2d3539e56790b3000b870f190666aa9dd786d445f340dabaeac4440411e98435815b82b8c2d0400dcc30089c7a86980a694879032f3e8951fdf680d77bb60800dfcdb40f807883a910289f461d41f2355c05baedc114914f60108a7ae4d68228400831f03e302acfdd86e1406ce50ff677770db4d4b74397db5bb2b86084f97f16387a09dbcd8a9ccad68e390b0e3c14e7567d4f6e78c629706bb29ca90cde81a98da74825d87338aeadd87690a3282d07ce29ef011c1106b41367a6dd32df31b9921af3b4fedd248549c4715d2e3830613b89c2a7139afcbab491ab441e8e5256adae8933928684c1251fe731935b8ce4851283e931f1ca2369d1d2e809aacbd891a6eeb9240ad278c104356622a60d491abe47640e006321e7ab23774f2b8e10ee4924fef83b3abd3ba637ff4bc09c4db3b7bf6b1d12e4067b64721de97623aaef17b486d1293764d46e661fabc2a20a5fce8a14306e93d7db5a541ec2593873001a2d150e656e380cd08c73a962f25607465f27da3992b2f34a63be435bc71eedbde1d4d006a2cbee9cca2430d1bed4e9d6724d19418a6b023cbe57fc21fec9237bbb3ad8b4731f0a13e6232a10556588711a6272cf87088093b670a39e3b00677f0cfb0083912a16ed8cc34eefd4035903225a932a14b8f3299e890adeb4b0a4494eefec562217b4a991a2a6d60633067ea87c925966b2cf2a631a4bef3eb25ed63c128cdd8a22b8fa326adcec00ab91b06c4d55f7671685254a186542338207c980f17d2621035bfc3d5c6bb0b81a5f9364d965349286c3670d252c9041bdea76432a4cda5fe2d5ca6e2db6f899d6e90069368719ec62df63890a233bd6df53a0087fc16ff88b5d7a1ed1a4fed88ef5549a23e66e26f02535a649e8661da032fd59835a67f511a87f64b38560dc47deda9a2a0d5fe3c5baec4b1bda9c053a21d5c29ce1c1fb4ead03fe1cd580ee1d67a2eb4451bc4836ae35b1660a52aa2f217e9febce24041834c0ebf004a01af5b6c9deb4fa2207029409e365d57bf6e593b380fc92ca562e1f6be2b5dfa4c133f66ffa0a4283baa2a3e979585adbe1f80c5199b4b98301affd00605e856bba6bd13e065880489e6838404a0c658e11b3f005f13c8c5caf06e6f12fd492bacbaaacc05678b29185882a1677519ddd088a91980fcc389097e9a753c5d23c92398dc7e51561d81516b18c06e2c02ab32e9d10248739ee4ad6ea66b97e13780e72ce268090e94fc29aacc6bb780591dd0e985c715f2b2c2d166013b561d43aecfc8da7b392de1cc91b136776d4c8f645603c048b4032512ea36d8228d141b143924321c44bca156388bcc54e0416d9886101d286cb4c8303ab28fed0ae20dfaada1d2ae3313196de5a7e7aa68bb78ef9bce8e1857cf7389756e68b25554abb302e774fb072b0aa50652bbd0a4fee015a801636e4320ab733af2aab96271771fc576d4be73e96b3875b5ac581d282b7f2bc1be8528f0fa72f513b9153976bc94a31f37c5b006ee43edabddc04848741c7ed39742f0551af58aa690f180a790f14d2f53b37c0bf7bb2848c52d5fdc71928c57f5615092f53de736cc26c415ab9c785e41752797218bf88f4b794956cc13d9fda10ac8297c2f11b18695445ebe17154c0b04f45e6d33729629f540780ec7ed4930c09ef1a562460ac14d24be450052f0a4d94a1b2e1c74bc9880a00ab1488db863f9b8e87f25a2f312c442d4ad081029d5817dc7e5614d3b3b9059230b40a952316328e7da98e9e2e67b62e32b45b52543e5c3bf442285b6dd6e4b54480dfd9b43e1921c21dfa5a65b9534ae38a5a8ed84638053fcd731c46c3e21e6c0f912d3867481d0c8129a966a1912fcad0c3ec7ece6d7f8f405f704a969d8fbf0b1b2f3364dd2ec09d15f57c195dce08d9f83ff79b404cbaf8906276b0de004a31762e32f542a4501b1188fd7641b140793347d6be05d10d106c7399a9428349802163d985ed008a58344d2bd2d0d951f541688ea0b5d60220343fdf2461994b361919301681c2850a8418106351354d4505207a5439450b31a6548493111793f8a5d0f2527541135d0388f50768022f6517dac500c4ffb4011112a5ba7ab96f052149fb3c87634949da080a410a8af4fc2f44c190a2202c450b4a1f5fd5a3a50f08a9280946750ee031450d9d9135a1b056cb3a126871bcaa05ed796aa1d0022320294cf50d4a05a841a26545e42e9d03c5ffe4102a50514a342f5ad836a0844550087d628685e448434883714280dd57773abc12c93424214b0b4fa295b3551c0236bb268531407d7000d9fcb0922ea2b25bca00f95f18ed2a197866af00a2524147389ea7b2dc5ef9043a15d286059aa7a026d146375bc4b29d25bdc2cb22e0ab32e20d1a485259ae265e18b5116a5bc84021ca1746ca6ce4adefa0602052314880205e400e5c4bba4fa60f0637378dc8e3c0628f145015df74748c2e14f109a13d6e8b46043fec756601ce22a16e148034f153610ed38e30cae056a44289a40498562652820e18064fadfe4aebc46b41bdc0808273f97af182eedb95f5bec2bd444a0c9edb2c11bcdc33cd89511e726871b73c6cb2195b19516d3cfc81ee5cf89dd4b9e31edb98e1032f1cecd225b27b8f88bb66203040e8919ab40cf374fe12486a217f515044019ceda9b04d96a705c049a8fb9836882ee598b5c7d57dcc6466bc2d6d1016560dc65c40c2dbcaff6fe154868c814008c17c0dca226e68d08b1425966d301a3b4e8f9bd780948852f9e4b8d716b7a49208452662816ea935028662e67b94617d696fb62d010d5dd97fb61bab6d0ad22c9b6f1a9bb17dec7acf85e4a29b96bea7bc3c35ab2cd3b5eddf83d8f8106ac952fb9d186d3fd37595380120287683092a5e1df946b0a95d39925e3370fa53be1130089405100849b619f9a3a55bc2c800dfcff04bd4d88a2678c290c0b9a5b610e0363aa28a2ac27bda18978217e280f89f4357afb98d2635ba135f71d863b01b0ff814e0e288528fa9f91a6b1753a6878ddb724883cf521f3061845d32820ef66bd1bb55c0de30ce8e48b0a7862d133a5653a8d2eeb59a57872e4d605ddeca4534f1c7beb93d00381d7c3cfaa635f2a031e403275e307a54d2be02e53bdc13e0ccf2304563e37077534af28e917a9f8b68b2c955cdb217171b82c8a923297f0152da3edbac650c5d1b908414ff6130a2760004815ba97009354f33942d99fa1ef81071caef31dcac440fd7f93fdd26077ad414621acf4bf52f6ccb4ee1bb0b0a4f55114bbbe8636476ef158f24327fda0fdd2a56bb27009bf0f592b0e85c3635485d249e07933201e9d162107f196669a1649fae0a31cdc6eb98680e715a3a065a0a7e3e42c6fbe06abe02871c1760ebeee958634fa8e18bc712c8ba1a9a720b21662a91e02149a7a3d4a504f10b3d8884207af36fd5205dc2d81ca6371aeb825992717c50f523d327afa6d44f8ae328b4549e16901456f0e7a66069c126641b43c40a19354048959d703ab5a729fad650584498b73122998815001612557a1ae444ed7f06c6a9c64e0b7722cb272c8a9881fcff093bd1db8aca722bae375076d934cb8ad5c61f16aa002ce12bd9b76607e2f80e8a58ccd4124bdc3b9ad94a723bbb1d36a1410796f567cf2158570bd1266856b88e215d3799585739928207604e7b6a8527cd24c45b006035052080b2f699152eb2935908d305a68327f26bbb56dd17b4ad649ee88435f252f0fcb4a8c95898652fee24bf371859b1ede0e5f3e304ebf203c45cdc3d42123fb2e277ab3ff122a68652ca91083e19c6e78a1b1c9c483ab4ce318c9fa922e57b199f8e8390c51aec391f0f2c8a6d18c2841811ff614f6070e246860284cc4cf220a5729c61720b61c942dc042f2ce2d7c1a7e7eaee634e47683ab069cdf5b22fc761e902fe59597d87614c1178f5d16351c01da0b72b3c29cae8c6981616de4f3cabc817e320702f5aa69b95072adecde27c487a47961d5406b933692837aa7e356e26f0b2e6231e7c99f79e9a5223408f2e8599ea5dbc2fe4e9c8e60074ee7d2696c1f01baff768dd1aab19adf881dfc7909843388e58ef3a7a34d7b81c0c58dd417c23790e4d9a9add26848faac8f3614e360d4230afa9124bfd69ebce2cb04728838e5fab1644b03f588d1242dfa2409b8507240be1b9f2b7cac26360459e725c1f593111c2f0ad8d526bc81433511032af84ce47818f21a9b25a76c372aef5865c38058c38b5bfa3d5ada2f2844e8a206d5fd794ebdbc5cace469a326113a7a958af43672e560ccf3fba4d23afd530da9ec2904e1f54758ec10bc6749457eca59467cd7fa1dfe3d7c61f5180384295afed6b342ac28cbf608409b5aab1dcc48045867e30151462b339d1fb84a9fdcc5418d21c7870ddba6bffdd5864324e7a7b2605b6abf762f203fe1272359f4c55fac95023e86aea8bdc20ea35e33c7c8eb3201eb5bc08a9820f66c6c33bb337a6d373ef67132ada9f5209d149a589a24b7424be61106d98f8a45c03cd4a70069944f430cca07a12bb4f66788739d374cbb648da417a58708088e0d186f5a47f6c30d1e7358b19f65d27eca04f927165e01391bbba01a47fb3f1f60719c34ff7c8d0491ba481f2652098aaaa844ee631cf7a219dcae50a35d2ef144ecbd2b3279e64899f2e7170c1c92329ef8f43c38d98609abb98bbd8251428c81026f440c5dc699f46869a60db1bbd7cc368a14b7817aaa29a9381897c3998d8972905e4a3f5a4388c353ca931dcef75bbb9a0bce7bc5003a0d989cac46f66f0daefe89602406f46de47ad5a2689c1f413ad0d038dbe63f2dc39a6892f54375c8de8c6403c6ef64caac8752b43e81e06b499d8c2c499b25ebcfb3cf9fc7f4e4e68a2144a9e65633167860ce477e66e1e686c72b9224b9cf2f88068a502840105089429939cd16abf23ee5131cbc731417d4daec546445a9aebc7e9920242dde50ec8f9fccd165db97b3bbc2758ac1d3a5be2a0c99afe1c801c4eabe0e5a64dbe1e08a02008ab4e0c44fc9bb06a4fd0615fd079052f0479502acceb7f5ee7ff5feba06d19993e4151599a1065acf01e0019d67467f55b8a5e333158b6c5ad61da265856eba6470d201950f6f42f8cc58b3c9e72a3b70ec9c0cc7d9c8de55914915379be3ef181e9ab3dded33dcf191765883b4078566309edca81723baed52b4131caff1ce28ae7530eec4535efb719b27acc3c7333644e19d237dd8aaa841c6a9c1e0838ea28c44c2620c323c10673f65e3708018af78342c7d5a7199d6d88838dbdc9dfe42abaad9b65525dfa0659f34895b1aed3168331db369a650b402b88b41c6d299a0c98c1e71ee1786e735c4dc60981c95b8cd7960084b50fa6417f8c38cd005d3a1930d651c9602fb126c7a50e8afaba2597264234a57d038a4d268d3ac554736a295a68d0e6495294c4f3ae7f03278d958b3373b1bd1e298187e987d4b6d7d22525c2f8759e1b9df5922463b94ae671dd24c34acb02ce7ecfbe68c6ba85df4f5ba91353f43ac6986e6b014f0486158f2a7f2d9e05613730186d3d19194dec98d524ac54c922ec7ba59982ef36e98897776a92dead567b11eaba10d48348fbd6acf71740544ef088d1242ff2d54df03591b37846dbc21773b71aa93332456a74ecb6fe791e6a252b60a2ae3aebd05a99f3a0108fa5886c6c9c2bdae2738a6015d6a8185b3c11a752c9313f9626599fb84f4484d454166b64099e4e8383bc5f027e724340c09589a92b2d6660af422aaa1a7ddd2f1abb5bcf51f922e63320a11485053e921a161cd9b822c7c54e960fcf895a3b8ab7dcf555a1917cf8e8c34d64e1e7647b34364bad78debc216df8d694952bca2e43a5d1dc4d36e58e96bf30b61adf2adc5cd115edd8478e56856acfe64c1ea14ace8142e3351b313b0562596f9540866307387962a4424d1a808d406e0ee80da312a1dffedfb487c1872fa102f9acaa3d9405ee73fe4b19e478ab69ffecb4b1006319eb42aa0d0ba49837b5a18df19ac635ea03b308e010084a2fb59fb020d44d483599bcbe1fa25072e6863cd144d0ecc864f34958f05bcf38034fc6837325cb83c53664e8622af5e862f23037d42c67e1597017b0e86a6b91be51639948160e34ecd33276e3b189683367e65a751d68c7235bab777001735b9d7c44cf41c711b1490b810d8b79ef2657fc27b4f966a41949e3a701b207a1f6ab4b563c7d53cf620903f1e03f0a50095162db8394e54721de4a484271fc74bd61650cbf6b29464e7e13fb791acf2d8c926722756a97a309ade68028b2c23c360909a602553e41aa8291361c68486b0b76eaf1d9f45d5fc56b134097cb5d271d35e8729a11e3a21271f22404518314dabe25831f092981f3e0b69da8163e3fcee32410ad644e1b8e04ef80c22229b36c5e7c1d4a092b8470e6641f9998301f98e6b8276b4ce6611f96dfa6e72907ac131e6fb5657f56bed1d21e07a31db74d24d796a6e9c7fff57e791218cf3ae845a139200bc5901da4f6be04ed458a85a37eebd9ab1c0e678e6d8f5da008cfd6fa7c24d1a41d6219772a8f2a0e608464cff4886c45f1fcace89be33654b88370059c05291ac08f815f44378d888fd78d26c49cddfe04884f09e9d5c4b172753d62c41aa7bf988e9cfaa9c651f6b88896a43783d91677765a0b17f84ea48941432f7665d4895693882a6a5a417ca035043a8c2338a145af4050668f47c529fcc6312065e11e3e8c696363aaa6f613133fd4c8c37b1446ea625cc8fd1967d08edf87c0b6ec0dc8c0bf63d21c09c539beac70c1a92505723c4dd3417e756441e18d8896dba019a0fa3d82d64545b389f59a365b6830c516c8285e7a472342e5277243d51597664aca5be1374b08b4b271c305e565f50098e1b6984c630f6e43c8840ee0248c3d545c0e8d094d7b55587d76d3d4f3964e5ec18ec67997b96220b4ef2e8320aa09f95bf6dd2df9a55c46eda7c3f194ceae7c0d7843ee452a207919f3e894c8b73e4dab887788e7ecdf66d24fb0d8fa3d2325679e55e8c0e483e0b6cad020e96c45e0b2b70b61a0730c30c33cc30c30c33ac9ca72df7fe8317a9bb39252525259709cd80c6c584c6c584c6b50de701140b4c0b780b7f08894421a5d118628686055f8c158ccac141c249314f86f697257f0c5df002128c2a13b400052b58810b2e50b6b847b849b35d7b4639473871269639549c856b849362cac631c13e5ebbc4c231c20793b43192b8fb9c369b67b8457852e1248ab7df9d38960ca708ef463b468c6c541ee544f8281d653a8ced21c2d7e8e181ffc55ec9dd1dc20b398b74467510b21d6708cf82a7574c8fb9cfa11cc315c28bce91ad345bcbb54c121c215c6b982ae5b289e1b335084f3cb45d5a88df26ef04e1bd4b466a3454cf8ed5e002e137f60c2dfb66b439860f10aec7742a8e442e69eafcc1ff2c764ee1fce025bf747119d41bc52c85eb839b1c887dca281aa53c0cc3707c70aad33d0e29ec4a1a695eb83db89212425378e6be4d0fde27edcf24a6e6c1b1e4153d3c78e1d343738bccddc1496f0c3d835ce9824ace0efea4838ab3be94e1375707a7a663e5fc6943c0d1c1e91862c858a293c34cde1cdc105ff3e910ed31454fb0b5293839f852628f2f35ef02c334b838b8f9f1b656ce920b56400707274778adbe7ce271db09f6dee05ba88fa88621df021794b7c1970bce0d3e8e17cd2a733131fa27d832255c1b7c341aaf31323ac192206b001a708001a008c706a7e423e69ad11851fa35b8e92d99b466e9e86be9d4e04bf2c9a0a18617f94a1a7ce9194d6bdb7a106b3478fd37a1a99534567268803b83bf3d6a6972f6fa89314371d2b5f69252067ffa2385da0ce9d84106ff2c83a694db31f857d1434369c5e0d46ae69864a799ba307853123acea70306371e6d7ef1ff0b4ec6a833c8c675bf7ac1df4c0db545424e16e982977a4c72ca33170867fe783c83b7e0fa4a55ae4fbf9d472d785d114ae6c52c38975298e8c8191e7b58f0e5d782a4d0fd151c77891a7923c60a9e5b8c18c6ec1b6ace54c193a894dd96192af8a04185c9488ae77f0abe64c73f39266965560a5ec66ad964b9fe2d1a05e7c16a68913fb9dfa0e0464a6b6af6ca139ccdb9fbe62a27789e2743cb1eb6dba5d2043f23244465ea14fb99e08620da5ab295736996e0dafcfc796b72a9b412dcf28e998f71127c0dbb8b41fc4282d7491ad544c8c33ec9113ccd3086c81a2ee273c408aae3b8641bb122b89a1ac5cdd69a544588e084e81411d619e6e80cc10d19927b0c1db1715e089e4d68d4a12b9dc64c105cbb680dcec2cb630b10dcd09da2edc2f7036f62229a64399fbc9e0fdce0d8d16904cf20a3bd7063844ca7868e330379e1add86be58a51b3c5c62efca011da3795535a6ae8c2cffa71cd9a6f947372e184479325f8cb3d88c1851fcdcdb3b745d3d8dcc20b595679aef1cad5b6702e74546e4d311ee15a781aa4a5cf238fac490b3759ab584a74bc7fb3f02346ed6e8bb52cbcd8e629e653040bad63e1a458fda64c0d0b1f86895219ab83bc9d5738ebbeedb9c2c7ec1857b83d3973fa36cfc12aadf0b6bf6385354e9f6256781e659a233e3f8e7715ce47c9d02f4759157e8a315da3a0e9392439154ef89cab26c6149d4546852f9172881839a7707a563bf27b7cf68e29fcf4205386d408277f297c183fb3f19f21f785144e4d57869e1a937965147e88f0e917da4b43220a4fe3c4da3233078b84c24f6b29b9a77641e1a6c494831871b2d1fd84db187834ffcbc0b1ba9e3036e830e339dc4e389f53aa36364d336f39e1e694193eb7dbca49bb09274b689cec31ca16bf26dc8a6c953617e53f9970a3d1c9bd8497ff07269c568dcc612e657b8c4b781a12a9659b39a786251c3b1bfb7ce3db5a57c2197f492b352b25bcec1e7e3cd45a63ac93702d6da7e39390b2b14ac2edb9476a3d6a24fcb4cfd2c03778b507125e9691c79f24cea3f3081f2493f6982b5afa7784936b2ac7f0b071b7a5119ec7b56493b3b45061847fe10d728cd822bc741c177f961ade5084efe9572d54f892b413e1bbbdcd6c4ea92dbd8908c773b0cbf8ce43785dbe59b423a3cba521dc587db1159eac3b5708bf26446545760c1e47087f22499294f1d5566c108e7f7d8b85f9e7d552105ebb59105971d43895817063e5f9d031d4937d00416cece338ae817ff0672b5dda98cbad1ae8072f747aec935cec839b791a4ab4c62934453e386162d228971d4f8cb8072f39ead5cc9dcb7f433db85916eeb637433be4f2e0635c15171ec9c3320e0f3e18ab9cc9caeac7be3b78a2619363b4f49cd4b3838fef616450da8da37475f073a7caa58ba152dad0c1b594c3c4acc91baa3207efa39fa5904198f5b41c1c798b5932223d0e721cbca4fe8eed633838dd20e4303926e951dfe06afab746fa49fad20d9e4f454d9ad2b3fd6d701e238fc7ff0dc63d36b811c3b5e47bbf34da1a3cef3af7cf91a9c1fb709724a7096360692053abe70a231afc9445a6c2b64f3257677036b4dd77c619c48a31839f9281e498256570c2245169ac92c10deb763ea11a83371563450adba4492231382d2985a83f94e48f738085c1c0e09d4accf88d19581c01fb82772b593d4776378f792ff8e3682b97e4cd979ee9823f97d263bc25d3d043b870ceea924f258e2df81f23527a48bfbc59d682935db3b95b3a2d0bae770eae9952c7b0e08b78cc4982dd69069f0c76052f1a4b7b78b558c195fb9ca2c2af4dafb805ab829b630cc96e1efa55ea50c187e21731bbc3b9953d057fee91879e7415b21c26051f66cc1a6ed36951f0fe46a32bdf7b8c313228b8961e5cf60d19f3803dc169f1088df9cb72e6a605cc09d604dfec35a68b19461d454990674cf02cb7f4dff5c4e64d1e0b6c09684c5d49e471b800a6041fd9ab7806153c1c35b8646149f0d342f75c6b7ee0957382dd1e181268c9d6f431fa7bca0b5e900017c8e00537f8e20531b8c1f957806d05404002015cc18ee0855f36b7d4a1720d62850333829f26a23374c629826f8dba3de4f4b03685be6044f0e7eaaa44f267508919825f8e734ee5317fb69a85e0e54721fafb3c25cb2d172c084e65d1c86a11dc345380e04ce714a984c17ee05d0c7d65256216b2623ef034b37bc6b081bdf06c935fa5188d7b45f342f1c26d94c5719a7d76e1d8a72c928dc2baf0b2ee62b498954f9277b970fb7eb23f0c142e7c104b452323af4f0dbe851773b9cb75b06ce15df86e1826c5ac4d9b5a787df162e1b91a4a86d1c2dbce94ed1dab789669164eb8b2e8161dc4571465e1a399f1541b7362e1440d6f3f36fe9b53a460e1847093debdc2b36d9825e3f0b8c2ab102bfb36b6cd658f563849335f869c452ce4c20a37fa1a6f86d95c851f414c72f0987ff74e156e085e1b35354dad5f77a970ad5274d89d354b95d8864285a3311323f6a468b319a7f0e2336504fb0ef628dc6a2853b815b6c19878570a7f1dd54f239b3cded3198a149e24af98e327ec233a0ad7bc2a948cac872c8f287c47ad6a86a042c1a5a4d690621e544603234381c24bad1e132cc2833d100cf50927a5f5c8b28b217779c2eb8c71d924a323c76485ea8493613566a3c5486dbc5c284eb891af4f4afa1f746cbb09afa3f85f5abb54a134e1f5984684d8f249c36b5aa84c385ac126483bb630c155acaaad746476b98c6b5feacd32394d41a84bf87241a53346a7b4ba2ce14fe71c5e24c83f885855c2793b4742a128e18ce3adac068eb1e40baa49789673c87b8ad992843f61b64172aa5958ae22e1038d512c87cd552cb50c19c8606c3500031c680614249c6cf95d35493ef737f97c41835bc1abe08b2f5cd0821318a01ee177474b86dd7184336b292bc2d62c661ae1864621f7639c6151c2087fee521d83e0297a7411fe854916edca83a7d82bc2314dc9dba56312e18770cbb1213588f04396b58791d2a5670ee185d8953cdf764ad910ce46f6ca30b914c207f7eadb195a08e1b45768ce78c728fc41380f366535e4b79042045187e7941eeb4078d5d3a629db3df41910deb9a4a3f0ffc11579e49d34763416fde0e377c9f361227da0b5b3850f4ed6d4108928116a9fa070420eb73927f7137e0aaaa1ee3594679fce138e45c9923cd147fb613ae1e7b79432aa59adcba040062b9801058c07c90947bad287cfb4f8c739f583dc84b3317d847acd96b4660f5213dea749b98245544edb5ec039c84c78a921d3c77e7439c61c4c38e9dd2e224b94b6c6b98497a24743ce915237f058c249513208e9eca1ace52be1ac4dc84836172e434f0983f57dcc24dc4839ed720852ea939184f3af9251393b049f48249c87a11e47d7dfe6fc8084d3d330bd671456a5ef4778e7a85d2bd886b18c7584976ded337c8594b7b6119eb7f86aa6f48e31aa8cf02d5bdea41a53f85575117eda1812625295d9a02ac2f193e449846fa1a18d86a4d8701311ae54e8c70d2cc798633b84ef5b9652eee428e4184378793c48c85e2144c4aa105ed6601969a699985a2284dfa9bcac2fed527906e1869a761845b22c4f47109e667ca934dba6acd0098497ae3bb4add778d03c20fc6c90d6213d5ffae30ffe9cc55423269ebbe1077f1d8614e233fae8b7e983134436dfe4ccd158357cf056257bf0e3fd3a62db3d5259f4e0a7f990a96d953c7837edd5ea51ab2d4af0e0dcc685c9dec1f3958e311ca590413bece026cd65e94ddc4a93a30e3eb6185ab1432d3d0c1ddccab098ea33f73b90e7e065c90c42f9c772f0c3cf7d288decaf4f1cbcbeba2812c270f0ffc61cf5e65791e4bec1cf20a7b6e67937381fd3e5d77eb6c1c7290387522525f94d36b8ad751943953a8a5eaec1f5a97fac1ae61a22a7067f5b528a4aacacda5d1a7c0c22f6c59482063f878c635a4ab660d933382239dd64f8a5d8c8cce0e4afe83845668b7d193cb796e065f926635c91c1779873acc5305fed18830f3ae4d47ea15296550c7eb8a3ab737c235e5286c14dffae1583e147a9d9a2437b6be082051080003570c1175fb880c020bfa09cdb44cff66833fa03e98522c009b20baeb6c64551cfd9336480905c70326477c687ea06c6050ac82db8591362c335faac2ab55083cc820fe5aeee4382a7c7512c389931ccf08c357905374f466f9d41b2e90aa5150a292d3c5345cae717590537f6353e87e66eb6122ab816a91e597414d3249d82ffd60d5622c6de5811520a5ed79c550e498d822729cd69b88f515c24149c08bffd2627a39d2ad7802df20927891d1b3f5a904ef052f97cc7a434c10d1315aae5e9aea94a269c72ccf24972c89c608b309730ca9b1ab4b483dfe681548265125cff6831844ae4ef9e344d05a39497807d218317c822917047c83402a208b2086ef00d55f564a5d21922b89a6d1e877a087ecd5f886f97d8a91621b81639cf658e36bf4910fc8c8c5cad16b53b0d042765c931760859e15ff2032f8618c1fa72237de0d8e7ef740f8f21c4bd7042a61c19bab8c30c2f7c9c3dc4827f6417bedc54c819a5b02ebc97f31bfb60fea1712e3c2db5b81cfe6287ece2c2cb9a7144c914e32d7cb4d2a0e61bc4b411b585b3665177eed7c943ad859b8287ec20e5248defa485e358b4424ed779a39bb3f0a1afb8cd947b467cb270455d621a839b6d8fc5c29f0c9a16fd86855392c394a389471bb357789d2368d6f099dd29e50a27ad23d2d9a4d70ab7c291ee984556f82054bc556e7f153e0cee39ac8fc64c8d51857fd1eb2462264c456629ccb26fc30168c001182000010840000cfc37e0043240410756309e010420c0a1c24b1e352ea8877495c053382ab22659b1d7ae61884053789f2c6323d6841cc2054be1631cee28bbc32829bccd97367cfd5d388eea285ccf1453822787c13534120c1485f313eb43667708a99141c05038161d24e78cb5fe490282c2491355d9c1f959840437f842066604fc841f9fa167e968933ee509ff51e798314507f128a89d702cb64cfebbd0d9eb523b20277c98398688d91d8bc7cc26bccbe141869d3d9af0522d79b0fe960b3196093f35b5e39b5c95278309a7cb3ea30e7809ffff3465b9a83d29394bf835e1151f29e7aab10f2be136aa160fe14addc3352025fecbe0ba52b28e9d0027e15caeb8e0a0a65b638c0428092fa26543cb23dfe1fa136c550123e1d4b54c24c9f5f2af2d0021e145cd5d0f3d4965087c84174e42fabd32de2eab41a023fc961cd4da1b5f4e0f35c233c97f8d728530c2b506a32eefb9638cba10b808373aa6c5f556dda744115e700f71ac61c942469b2030117e6cc72c296ef6512d44f8695d52f02c39c45417ce031ec20b61c356fa9a9475493ca0219ccd9d95633cd67cea0ab010bee5486ddbe1d305b52021fc697c6134d4c62ced4fb0655040a28083f0bfacad2ae547df890109f01350178021a020fc9ebe09cfc6e82be7dc0103e1a35895dad01c867c0808c72452ff96879b7535bf807ff0a3c6f4307b5e0fde0e2fa01fdc148f32c68f4286d9f83ef8e9fa2a58d44e1b900f4eaa71a41a630cab01f7e05b4ef3615d3ca6871036a01e7c3019784c99a13ee79c3c38a92754ecb29a4879d38078f06347787a88d8bccb25c03b381d3663340dd301b48323514ed2c29727d832c3052bb8c1784111b00e8e276fb9b7ea0eb68d136c0d01e9e0c318be619f7dc3dce609b6be20810b8ce900e7e0860c22d954b67f327a82ad18bcfe0c7e063068811b00328172c0fd552c3240410b54d0821990e00666fc178b058c83b32621d584ec0840000210c0030358c00028908104fc37c03cbd02e1e0a5f412793ca43fa56f70b3fde5ec93aebdbce306b7330709414ae6be6f83d3696e272b0d7c629e0d3e0c591d530eb5d99135dcb1311b934ad4e0a42b7b98d271c65c9a34389d2334389d83bce46ef994927206a7353c9a4fb9ddce2b66f0fd71248ff29e327856b361254506672b877c912b4608d918fcec2987e059c63ba4c4e067ca90e5f1b73d530983631943c91ec3669062c0e09987ead09b6a21ea2f789abdaa1e62e20527f4a650ab1cd205b71f4dc8f0e83ba490c1053fed318c1ccdde8227f218ac05278966181997b3e08d3490b568f93f628b05e7563de36493225da257f0254334b064a25511b582db2863ce1ed266e3a155f0f38fcd6453a9e05b5f5606c9814a6d3a05c73ffd1e5ac55ca15229f82af5c8c5420c13ea8c82172bc7181236a3a830a1e0a96a9b76c48414b67c82a35e39df5fcce2afa513fcfc7d6aeb40a39b954df035e4c71a4cfaf2fac804ef2393a954e85e79e0127c1c53688b1e1bc28751093e944849f2e528934a4c82db3977cede2cb92d8848f0debbaae453ad63acf1086e56ec0659f1753d3182e3ef3397ca52b8f7ae08ae6df94b248d61293b2238679929da9a4858c6109c0c2b66b056d127b82604ef6263b4216b8ab0c982e0a75411b2efc32bd5050457e44b4e73593ff024564697962603cba00f7cfce999963da6a7a517bec563748f3e656f8c175edfe5eccbee2952a25df86942e53bbf2465e1a30b273cb6708fe6910b2735c6e1c33bd86f4ee3c275e423e9417eb0daf3ddc2cb199944fb6a5b78f6c953d2a429fe63b616be7b5c588b9d917c98b4f033dfc74ef779ed2a9b85f749352daac34c479e9385efa1b5717bfeca2e3ae062e1ba45690ce9374f46be57f00216a0e00e070b7f3367488eabb25535ee156e8cecb852944d15dd7e802bf84e2d9b22caace35ae1a67b14339217b92063138e157edae80d1a568787d0afc2af699c71ce95d2cc7a2c9c2a7c891a22678ad54c9d63854b851b437e1c9e197bad8f8a325c4adf29fc1cf3e518292a6d4ff64ce1788e9650edcf95c2cf932e774fca48e1448ded9a31dd1b85237e9171a6b16ae144e183d8d45d123d62b844d370a170d4b7f3844ac58c9466058597353ae6f2e47dc299dce87358c9776c7f9ef07fc2c6980d1155aab94e78f9277c67d022393b4ef8995190702dc14336f336e17466b2cad1efd384f711d66fc173e332e1484b7bceaf7d3156d032384c7851be194f26e9b5754fb0751684bb849b59b9ee1a86344bda09b6583003e6c159c28f91fc40f3ab9f6ace09b60c095a8002133c411c5c259cf37614a7a511a9bbc151c24d29f44a4717ed26e1894beed0b5fea56a3949b829cc939896dc01abf073a39b3c394223738f2a7c9b7099518af4f8ec543857e944925ccca6c8a0c2cf9ed72323d23d85f3bfda8d362ac3fcdf9ac2372b6d60dfb3b19e3ec192e00b19bc805cf085e696c29f9461370e6fe12a34a440be2b2ce4cc5ff951f8a61552a489398fd52e88c10bc69f806945d1842029f7a61e0b7e3183f25fec0336146e9094b4ed06a7aa0d50782173cc0e11320ec9d34f386bc95187b4293478d2137e58ca8d3ca22283838213c480046adb09365d739d64989cf0cfbdccbe3504ec26bc13c930f3bd59c6999a70727cc68c19e3c32f2df8e2652083f10212a860fc1704371394aca7918a86c18417c2afe6bc39cdc9e65cc28b359137c50ca5fe2a96f0cd3c5786c9a06e9253093f4ccc23ff9ea4845f3ebf769161842927e148a7142cd362347f2509c73324874fc9f3197d24fcf7536bbb7021e18a7a5b45fa9f53cf23bc1497c9f2478e702d63b6b0d5d40d1c8df07270f70d973384a8c9081fcd5a4a90d011a12d8bf05ac66f8364aa08ef32e3d0a9368970423cb628218dca7f10e14f4d5bf21865c241c6211c4bb2197a46de105ea9b66cda14b5885d21bcf5a03d298609e1784a475af39d41f833d15182552d08ff62a3adbb6903e1f8386cd1d4f4b9220684232ac9b1fcd857cafa0f894cf77ef03f4850b954f954b1f6c151c9971635271f1cf5cf1c43d4e41ebc14c3c9a4eec96c51d383133dd59a65b5960cc53c78796a835b8ec143882a1ebcf990c5b2b2e243bb8367dde173e7901d5a991d7cbce2338dfcf346eaeae05874091d3cff9442ee7e6dc7aecdc1bb68b3a5f931e4e0a564a22173acff60571c7c1492a61c63f8f4535938786ac143a6b52af99c37f833133ecadb9fa9e7b8c18d5cd7e0dc34ac41dae0ada5aaca6a9b3684880d5e54b3fca1ae6294acc1ff5c6e7196b305b94c0d4ed218b59861747f3b0d6e87b98cac298306bfa6c33a7b4db0349ec14b91be1e4ce8d60cde68fa24ee3065f545b765582b8a7bbabace6c60206083372d40c117a3052850800c58d0001cdca006485832b8112606f90ec11bc38a418b61cc643c6c50c906360c4eeecfea073369ee6f30f81e7286eb589b5d1e7684fd82d560bde08c7a8890be55179c34762a5e165a2ef80d335a4677bf2a55f218760b4edc6b5c5a4b71b9cc09b674001a70800b4c9080131417bcc0bf051660810bbe680006084000bd0a8080040158c26ac16fd0b0b562f26818fc012ce0109b05cf5289d6f5e7349db662c18b78943699bb2b40c190c133e0bf0175d82b78da1923ad183953ac15bccd696203c970010738b155f0b32fd671e7cc171a0358c00230124b0527db81a5162d4dd08244ec141cbf071163225a54b14c0f2b05377b7a370d2af3198ac5878d821b551ac5a19a464b2928f81bb4e543e76c186388ea0efb043f95b8c5c49ea855e129d609cea79a982979ca4e6c137cd190da63aae076d72d6299e0ab660bdb61dde53b2583188c09ec127c9f98b29da69a11ab042f53e5b81abb069e7192e03dcaca525b23c19918a2d895a763709923b88dab6108991ddbc3085ebeb4ac718ea6d22745704e32df24073311ba8ce21d43f02ea5e020ec2a32305108dec420275f194b2c4f101c7f640d33c3dc294db58b05828fc424a4cf6e318728d81f78934cfefed53bc1d6fac0490f36a5139595caf109d615da0b672dd465e4b06942fcb8505e78af912a6ac63c2d7417cba41821d9cf545df819c4321ec61c124ea583e662bfe4e939a3ce98fd93c10c5869608ad025e5b8cc241359bb6581dec2394b375e3321a38b0e5b38a19549a543f95d4e65e005830524d85af819030723a6854069e155aa10f375eb889967e1bf9ba64669c89cdd809040065fb820060b0295859f4c267c86f138c17e418217fcab8004672ad058781b192e2236eeb631b0f07b32c5e3e0d8afe37136027d855be929858ccde30ab71e3bcc41bc6f85afc9cb65c426871433ac70430ccdf090bb188f55f8ffa9227f259b51165578f7ee8e31ccf8c427a9f042e8cfb0b0b8e96aa0c2ada90c52a2a54fe145d330c92a368593432b58ec724be168d87649e17f4c7f9c1a4ae6ec76149e8d65cf4bb7d8ca2a0a673397b84c87cbf26a289cb3dc39c25bf8dfa8a0f0453355061fea279c3495535bb265cb1c4f78511baae7106dcfd0ec84f325fe9e1b573fba70c2cb6ef5affede26dcd290982743a70927f643c7573949c660cb849341aa08963ce63ce1c2841b9742394e9d4b38b32e651316a925dc0619a718bf8bd93868ae95f0d2264bc5462bd6b6f24129e1265b9fa4152265ec9d9e842fda49ccdca1c30ce29284675d26a59e34d2a7250d1a093fbd1f07f3903b66ef760c0a097f2aa5479651ec118ec34a4bbfabe09223161c39c279edfb724b13b43ea7116e6d6bb4c79f3b37d630c2edd77490126691d3b208675385484fe9bcd22c8a70a52cdd573a23115e56a7d50e0f5545634438d519458aeeec219c07e19a7932caf86c13420de177c80c07392675f557082f2afc6ab86984f051862e1e3e3a0c91d520bcefcde358a4fa1e8304e16948139e2a1b26bf27105e568f901d6600e1468cb24f7e3985dbfe0f5e8887bee94d23bbec071f5408b908e9434cb60f5e4773f9103eb87953c5ce5fb3073f3a4c0e600104204091a054a17a70365b47f3280b31843b0fcee4889dc3a39bddc3281e5c9bf5e86f5adfc1ebbeb56df49ae1e5b583efa81e848fc3749d5307bfebd743c80c33a52a1d7cf039f8c534ff0956cec1b11799b28a3969cecbc1f9346d52b1222233c6c17f18993394b47c9e378583e7d1f7d2198c58cc287d0331b2bcb793eb06229644f6cedbb6911b9c7f6684ae92433aab6c70c372e6f033a90fba06d7c4b378f0183da81abcf1142a40681abc9c1bfd68feb19c26a26870fbfc62dd7d0420809ec1094f5a0dcdb1755033f87d113c5ca7e5a065f06366c76555f1e29d4c342819bcb7f03bb7b7f590ea0632d031f8314fcda518919184eb102a06277bb32d9c879cdef209b6d006a001070ce002e30bff62d440062d40810bb2340cae865023d7c842442818bc4dd529432aafafef82d3021458ed41bfe06568e1410c96b11dac136cb940062490c1c7400631e833ea052f3bb55f1dc378f5f50dda05473e63a4d277da91473728171c5f73104524c7863eae41b7e0a72c4d23924a6e6519c4c00517482df8969d1ef9852899396d2706cd82eff197a3db5c757834161cf1cc9b53e3c9f678c361d02b78252215eb1a5c84c85bc1690c2af5e4be54c1cd20d66d2c9f938c6a2af8e0256d632f0963f99d825f6229b52e7aab67530a5e650eef2ff1176f6314fca025f9257d4bb3040a4e46121da6b43ec10d16a646fb5cb227cd097edd5df40ca4ce2ae434c15f8d4c66d7284c701caf668859962578762984f86910330e132578ee9ab339fe8e922c2309cea76b2437418267aa591e47cab619ea113cad49a6dd993282271b2be4f88c2278216d1ba6168bd020028312c1bff8d0672953c21c6698abd20b3a04cf325eb5c6216c8105fe051618c0021470061582eaeb579331ca4eb075835701096e40484026832f3e062d40356810ec8ff93f3de42cf95620f8a142453568f0d92e2de80f1ccf31fb038796c35414a03e704de32ee3cd91e9d3ee857f8ecbeed185178eb5a4986cb298bbe0532cc58c65ac0b2f324619639c71850e3717c6bbbd4c99bba9a68fe20412178eb94fcc75a9691b856ee17f08590ec237e8f4c4e08b97410b2090b6f06175e4a496f3b5f0caa38f048d6971dad2c2ef8ec8da369741276f169ead4cd67e90a13cb232e0849485dbf3a0a1240f21bc5b4ae12163e1e491096911aa324a242cfc939c4348d50e041630000730e009f90ae79138cea6b2211cd2153ed47e14958346a4cab4c24b935103edad1c7119ac705423434dd963e11965158e54d8ccf113ae35e755e178f615759ce554783979a669fb07010820874485ff21a2f78791d0f2344fe145ba4ae7471f61214de1cb25cb17fccbffd5a42c858f6a82ca787bf99a0119fc173220a6852485f3e062509354113173cc841c8523fd1f52e70be92a4414cea34b31b45456cfd1134286c2c9ba881ad382da8be5020d0a2f39cc7479c462ada52df02db08006fa13ae6b9a3419315b45115d069ef07ec2c3fb854ab3aa7c0b36d0093f2d4ab6c98d32456539e1a645aeac49bd4295d49b30f23d8cf4d8644d388f67da53249f98ff41240613200001be78f3850b6883d099f0c543457a2715135e54659cf517ed66cabe849325cab33f2b7537b42db15597aadb6747c9e5c7b12476587827d8fac2050df8159021832f5c7001021080055fb8e020a18b90233b65f69c94f0cd66d4c17a27c711ea49781763b42c6722ff634ac2752cde3836763a127e0acf517c520e0a209169469d4736e347381fd2c7fba9e454ae3ac2edfae8fe7259231cadf9d35c1a41153423bc9cc1f6e5708dd232caa5a017e1a750bbec8fa13347ef02179015b422dc8c3ea58c695ba3e43ac1d6178f821383197c418218a0802b062b40810c669008ff529a8d1029c58e616b44902a2551d1bcd130dc8770da1ed87d76076d393ecf807fc10d3440833684ffa55922a667f43ee209b648700219a0a00624a8c1b740ab10aee5f2c813a983977f02198c0be00964305e803790816113a2cbeaa8bb2d4bb1ad748db64f294ca6d3bce50964302e4000029c400632200001ec053d08e743a61bf96594db6341389a610629889d47e840b8256f139534a4bf4903c2f791d4ff301e7f70ec32ae0931ca7cfadb0f4eae94d0ca4e761f9c343d9beb525d57a5f98099b9ca4446d6da7564c43e770f7ecd868d1939cc92ebe8c1b1efe9cb15ca26a48c3c789b793248455d0eb1361e7cd478a2590e973b38153edaa64eddb6832f31112634964a1b235d07279f65cf1945d6ba8daaa1e9e0457bf5cf5b1936fbdd73602dbb4cbe4cad356fcf35b69031c81c185a0e6e9e1a5bf5749f2778e2e0cc688e29a7e31b0e7e0a198f7bda8a6b34cb00022ee83778e71ee2603e6f837f000b5cf04503dce0953bca46e7bd520d7382adac18547d2183185cb7c17928a1c73a54fb952502cd06643e44a342a64d53eb35bc2d558c555446abd06b702b470669538ad4e08c55f8cba9b34e8357eabe9a62b34b82e241a3c1778952d79872d8469f3e835b0fb2c845c6b211d38136839f516a30f1df29e542ac037419fcf38c2a47830fd3b9800524a0010acc6ada06309b0c9c9659499686b8de1493064a8fc197cd413e494619645c693178951e65328bc6647776183c3b0f4d69424c8e301380005ffca1c1e0c3e86f194af7e66c321cfa0bfe798c31a5360c8fd1e4437bc1c9719b4522860c1da62174175ce9bf509b341d45c39a0b8e89c474aa6be8141a5bf02fc6d460a1b3ad053f2e6dc80dfa6e6db29d85bebd55d32d4ea4bea6c63e9ac490ebca63754d96ed7cd1ae265fc1f70696c27430dfd41b40b415bc34f2117f1e7615bc4992afeb6f3c2e639b0aae46ffd60cab26dd834cebd053f092250bd7a8f23a9a54069f8196821f7129fc2201d6868e821b4635460ab9464553d6d05070bbc26cb56b347325af9fe074189fedb4102d5ab973682778ee32f1133329a21fe38b71011b7413fc937e4992b5dc6682f7e26213dfd9226a3bc1165906b87a09be858f6a1a294709cedb0633cb7726219d2478921661a2ac6d6da691e06c1af11c36ac32b8fa084ec8ded3387ad808aef57fd61c35b37d0617c1d50e5759a29444f0bca53f926d0815f586e0a5477f3c12c25afa08c1ef764dbbac06a9371604cfc51b5d14bf09f75503c1cb5c1353bbd867ca1497a17fe04f0cf996f694551ba4cdd03ef0ce1a9ba4e49414824d06ee856f315bb29ddc5a280b0a5050cc99176e374ec9e3d15845f6ecc20729b4523ea5c8e0a2ba70f2c530da49836d8f24173e74b18c5170e0c295d3b2983ac99d6ff016ae7796cf6a058d5d9b2d7c0d9edf431eb9bcffb530653e4768e1e75eb74d99c2b36025e262cbb2a6332aba676d2da6f3ef64e1672c1e15dd92fc232f16ce65e03866e49ad3be8585971936b2d33ce56e617e859fb9619ba50769ec1e5738d7c025bf46a4ef07722b9cd83ffe1ad9d0ff1cacf0cdb4d32449b95578a1baab518c1c33fca60aaf53b2b5481f5306c77903a762f0c9b2e7caa89603a3c2bbabfc613c03e9143e96986206cd0e627fea052f18a6f05a2e3d3c94b7a8309a814be1bf439b4a313d76259f49e1468e97b0942454a3703525896e93c72a840fb2289c8c1af972d68c4371ca64cf79ae9f41e198d979494fda49dffc09cf3d976d7c8791b8c09e7022d6658fc8491a4a783be16cb97cc6b8c29cf067b68204eb18336c2b068537e185499a1caaa6dc51df6c604d3879a2564bbcd2c764a1800528980067c2cb281623524a5ee9a7c30363c2b5b210ef9a315508365fc28922d96eed1a51ceb534b025bcebad0a7d16c28aaf5c09b727c60e19d6730253c207b3295ddd864a9a734ae04978c122a4343331bad88325f1662cf9824d58e84747428d1e1ba5b5e4136b010a580089c4b7c363f173f0234aa952be317804ec88e733fc7f2c8f071ee64654de5d22ebb2eda91eee7da5629a433a66849faa1a23b9fcf92b3343e045b8b6e23835657a9cedb3225c999467aa7beb61aa7022fce49acbd187f81c838311e15a6730a129e30fe1c9c7dba784c5107e68bc25294838ac3c29841f3b330c0d3badcbdb84f01cc8794d37f84e9f0771c7a5f6b02cae201cf5de8acec1a7ac0f849f1a35aa464ba4081120dc4c2aff1fefa919cf7f70264da6a670cd311beb073f64ee18b16dec839b2b030dd3e893e6431f603e38528ec3cd843c6529630f4e477bb3930be92193b3f0f0ea9a4fbbd0fa8676d5ed99474209701efc8c3437bead1bc078f022675f74712800b4c07770ad4190feaf9eec1bb4839773f2f8872a19a48cd5c1f10793db436620293b58603a78a7397b76ba0c29f01cf8f1b0de2986871c3c15910acbd12045c6380ede5f7c6a7bf965108397810c120007cf3dc48450a932acaa33a0057e837fb153696e98a5410b2070636037f8d91da4680fdb16a0400261e036f81b3365309f53e34f90001738800d6e54a6be89f2c802afc14b179e634ad9b8330c13d0055683b76296f2a44bcafcc02f5cb000d354e034786915226362ff8219b8e00b077014180d4e63ecd9e4f30a053e83eb399c6c6b49f9d5ba053683ab1633ca5eb53952ccb5c004288841961606b80cdee5b48ece6bdee49118038b0093c1514bbf6116c2928683c7e0dca6863d59421383e313b3256365340fbd0187c1cb171b4832879a39a32f5ca034a80283c19190f933ec1ce92b2d7fc14bd9f92643c6602ff8f7f93eaa1f4489dd110377c12f4bf5217d50c911395cf09283cd309a5ccb5d7e0b4ee4f46bc1abd4e96a22a6742137b2e04486b9a35f9694ee0616dcec17c26914b9496b5cc1ffb0a5a5d9b7822b5f2187b10f31d17115dc185cbcd3d74a048da9e065d4e51aec29f816f15f41a37c8ca14ac1aff586a1ea68834fc951704336481952c38cb68fa1e0af87104b1ff0131c8979e31ed4c4e430eb04533a44546e5455accb3c84e99e076982e778726c5af850a6a11e9809fe49ba60556ae2a71a37f012fc96a9b4feb51a2bc1bb3f9ba8871191e5e73d7012bc4bffab7922cd362a7560247832339dda2d1fc17bc7b1b161d509b011fc1422a548991ce322b8594a265a0ae1d6dfbc021381aa6b9558d3c610dcf458f216c472566859085e649cc7189f0e82972ea949b444033bf18c5f41ef8081e0dd652e15cd97ea1de4074eb4981e457606fbc08deb8fef160d72312468236c2fdc14e4c43afac67cd6bcf01d54980cd1617d4f8541d85df819d604bb8fb9612c892e5409e70e26a63bc1d6e6c2c931fb52c8e359edc92f3c1717bec7949375564e154e2e6f5cb080372ea8405319606fe1a714826b7d6768616de166b11cb4b26abe183c0420c0f98206e70b1adc5e616be175c567f9f05241738716be75ae8918f3eb48e99d85ffd192f6a58478982f74bc200332408102d05a305e1003fc42062f900555570f3e3748afbae002b1703e539e28517360e1f57f78b97fbf4fceec2b5a9f3009796ab386d615fe78f0902c8302ab32197c0cb6157eca69a6474b1945cb7fe10224cb0a27d286501a528a5913a9cc6ef0850c5af039820d8dc4a884b084025924140804e280388a61b0e8f800a31308001038280d4542a168341145550f148003522020422c2a1c262618101a18128d44a17030180a85c1e04018140a8702a1a089b0c431570725dfd8a894a05b8acd0826b4f06fefb46bf4071403f0bbcb34e8309ba499b5787c0ceeb8086e43b1c12a4848be5fcd8011ca94345e40e68f1be4f5c8a7b71b7c572d262daf3b536139d27fd6edd19ac45b5bb00c8870f163671b76cb6b8c41fca09b49be1dc9d6a6bc0bedc1e0ef38b4819c0b507a7f9523936b3bf164b536f62105dcdc9dc438b5c9fae2c4e40a7053c4de4b5b3e197fb05389446aed2ad1c52923085a26c7372e053fa25c79b7bc6f28536c9b0acce84686099290bfb740a252448e34d3122bb778f40758b4ba9d490b52c462dd8167438c858074aff6e0a27cab773c1ecdfad3c057d999ec65e247893254d14b9ca48bcbb036373fb1f183d4f8e103fb9f09cde0a75235430df23ae3f757353bd38e7c2072466e39fa9b6fcfea9b4c9dbdf4b9258e786ff770b2c6f32edaed785fb4f46a9f93a919d3fbf05cf899fd87a3893dc9cbd343bb51c2da64829d379d6082d5ce31dc83c709fd545d80d9f08da41289652ff07b91924e440366d2795927a4800b2260c20080aaab2a7f2f4f93d844e180d54333911c4be3bec10c5b33329b7d8058a1f9dc97ba30a189a5d9ad80039b77c00ef50bcaa881cdf4ea1681a5103f1d50f31c0b91dc3126209b20f7296e846edc3e4dfad56491a096049d595ae41e9a6313524d385867f64f87a42f2e6cb6bcf0b511c31746faeca26d39b90a201afe48bd1294a123ad46e0271f34c37e82ed9ff2a2a9b1692473ba5d16772319ec102d6385583cbca578d62dc6a5ce7a65be29be8161eddcde56468ccae2cf82da33712cb09973a2c234f15392d408fe383e7eb0e09ae48c9c5a043134f9e54353e534721766734767d796037cb5dee1cface38d8fd7cdb891c0f955ccc625b75f6e49230a7358fab3f744bf7db0f464e8a1dddf1876de0aacff5447ea373b6f0d32321f6c6f4d4160bc7ff30ef39494fd498922cf358cb413aa35f995c3463bbd500e39c4fdb2a41eada8076eff05590da7bd0f42d1dfc2dce68eade6cb14bb26feb7f8fb92ef22f9b7d0ea8b427960e2860b628ac9f3ec30053d968901b9bf9edc80a8ce5df9fa27a98b1113e630f73ef5443476f2324f851aa75b0e9f856ae2cdc93e013439c4b7d32a5a1c9b94047170c7557e83311dfe39465708c586a8345e428171c125beac92d55475e15c1125ed3ae0b4218630427e560f114dd387980424f29371fbd9cb609456f002348e3c58f3a010f80b7a6cf0275d785b5609ae8a5746b9ffab41205cb607c8cf0c92591ea66d484c068dd1cbf31329dfd4bb254d2bc827685dc97b8833eda34de0686ded6adea96ff821df2a9125a44bb9e65786d1e609beec8563deb97fe2f3e5100a02ef38d6491078ff743b31519f0c312ba5f5d23a0d9b308186d38b517d098a0786bf38066e6241cda78d2a977f61b3fbffe2e5f0ae9afa4799497c8cc143c4a75c41aac7636da418f9f14e027f8b704a0272de9680f02b4c7ad257f022662e71ac75693519adb424a689c7945d1559dcd9778ed3bb8a3eb257436014298d959fc58c94783435b4b759359cc0d4ae6f39675d14ab6d9e076ea5493c76efda5a811696b0c70812e5dc1136d156f12716e41e630025ab64d9b96bf98ee3fd5dc6e332dc1e5417e2d0420b4e0fa23d8cd04973d18c6682256e46b7d85c2fd72a2411aa1e45f6d91dba5fb2246f3b94892cea2320d9bc5281086b0a120e82c8a091cb348e8e2ea4277f7abdbc693272f65c139c197c960e56683979158596584074b821e44d45fed8588db855dc17859dfdc22e2b74ec211cb36f7061bb6b09f5a359901ed52ff623451f709c6cad3cce12951f20e2e4e9053e54232858bceada6b782bd05315714f558c3d2f542d33df80b9db30d0b5f34fcfee7914946eb6a6a1cac56931de682be808d2dd9a127324f7af4568027fa9c97004d133c72ebf6923a364018d75320b48cc3f2dd84b8ef7e8f9ae5efcd746583abd2e5a93d2b31a79308b0a1405735eae4529ffc9af8eba1e91b1f8a7bf6bd1fc2e1aaf956c7867fe9fd6c529867ee4e6ebc5701a3e3fa221b10735a406e4cd07160d431d874b4d0cb0a91d2f9f1c3f0f1add6a45d4f26839c050994f0a2f85efe6412318fd26bed8e7040aadbf0d7308ad96b634c4922b39f6370b6fe013183e6a0d8b622c58efd6297482accbc6c0e6975d3228b6db3cfc38729cd1598e36e8744fd3a40b286ef566bedddc2875212bb97c3018bfdb79d58a66e66d149c4e681220d77366e9c5e7d91e579944b43f26d6bc2b09bb687e663295115438602eb73c8044e5b283e4ac2ff9a91ad640ac0d1401cf9057dc9623bf5e3c4d0b9339e953307db2f5b7246dc2194cb88bc4eac9b8917ec5f63b56df0095e458b9481ad300068dc7960e1ba05a0e2297d594679f7ad9876993fe3f849e32e07e86fb4e99fda6be9bb86c238f47ad1b46f97d7e13aea9b05c443d963d6ede1ef216e0b6cb71ff7cf081072ce7991a5ece4fed3e6392c41d20759fb192644804134748a25709999da173ca4467cd19f44f739ebdd643094fe117b16f8d900275c73000dfbe3967eb819d66b9a8a8209bef9821459422a1318c124dcd844c1c46e8b97496fc9a3a0a1d7803d1b05aae07d1b401216f1126769c028f2d3fcb8ea7122918e509ca8c1b9e813c4ef687a4c40edbb8ec23a59c71ee8cfcb8441f9a5ba6bb91e29484073a0640c5d119e1568306e840e7695356375ae6a478469a589d7791310577e32fd5a193aaa282529de025135140aab93e674fe1da7442bbf3244a7718e587451598c74567e14700e65bb4682ff314f9c8f8e3882342e1b7d0e9469abe006791ee3684666bdb281cddc52303c1d85beacdde13af5a926d2657275e92bb47e05d05ad53736fe9fb03333bc791b559d071e932e0082fd7fc4bda2b936712042efc3b255cc3402ba656c2058401a20f462f009fbd5b8495986d436da541638f38f367e11a38dfc34a0103fcfc3e79eb0e1d01873f2ec13e7f2e35813c92154b6918cb253334e9394531742aaf9ca304213e0513a66c3dcdfed80b4f4b1ad0a3acf8b7030839003818ba9f9f1e582d503ac72dac4a7c07db3dfe4ce4190922a7bd1f0937b387b6d712bc8b1fc7644b55e822bb84a1190cc4cff1e8dbad8fd1f3d32d7504ad298d05014fcba5b0952783e9847d44b99a2205f7a3bcdeda6f48117e885bfeb164ccdbe25292f700dbd4c1ae89121495ba21931bc16b9293712999be8c279ed24eefc24da38fe43ce79204e6dec823b6c234fd1ae96648890778cb0a9f4e503abf09bc0535d9b06be490bbe5327f5fcbf85f9a18cb2c7bc38b535f136bca3fb675d1046c972a6c01ed9b67f8b8167c1341ce8b97bd27e075bc9107e6b02fdebd390d8c9d25a58a548bb552a0d004026892f061135b7058078290f29761e27697cba9d74259c86f5749d5026d22f70b2aca8d5788c698d8d8411de55e68d7f8d0ed545afd6511629c5a740f7ee568f0457a218539c5426039a7702dee9002ca64a7f6c70d7ad43b3104338322201274828391375a6b20187355570b6ba4fc7d44048d824444fba87b51478a1c3bfe5c9a816479e7918ae91cd27a6db11673f2df01c3961d6cd7c7a1c9c15d166409e7ecb671d8961a0c83cb595b82fd57b84ba1d6d4d260e4848ca413ac67af54cf01ab5bb75f5972019d4723b743397da61950ec447736a59569b41a14652a0ff5b87c35a98f18b49ee911f21cc24e6d346fca2fe4a13832400e8769eb961d18561c7a825e33b9dd1a8873c5af6a92dd13f31252739802e6e4667edb4cd8b81597255704a6d2dddccc64d0d737e718907cf3c5d60e8219df6b94dd547ac8d14be7228ef2f4c4caa66cd6bfa319f378c8ec245817a6caa4ed350293fc0386f0098cb1a09e3128b53de0d95d5028d023b33d38a9ceecb8ae0526e4cdd49a847ee9d1fc37eda02a60144e1ca0b79b7886d6a5d860241b6946fb648e5d1ba9ffbb06f35039a197376d15cb0032b3ff3d5f05b2dac6001051ff120e563b0f184a0e10aa19f41153df418536eb8e4cf0c5bf0f2aae8b46e832d31e6cf110133730ad5707d9ba855b979a6223cf5cdc9748afac3305928870159e3d7698a608144f1460c47b9eb74f32a47450160a020789be4b4dd0fd882704f21561d63c5df34e940312a37d8bc2710efc04794290ada8dacb9747780f0fcbcc00cb2a400084e1177164706c673ed1fc4b2dd8e08f370ae6c24ce6517da9fa5ee043986506ad8a4a36a66d61bd8d93bc99e53b5bb032451582a907b0a99818d20270713ba17240043478fa434844bcc99502824b87d5c093c9195685213698e868e22fdc01f2c371a95f419685cf3238a3d81dc7d9f91204b137e97fa97e27b336858f861a16c010bc867bc2f50dae7a157043a2b5f501904470261d28024e4e40d1f434fd624cceabc457b3aefac45d85cfabc57aecd5f5e3941c5503a742abb19fccc6e4f74b6cb6c4abfa41751bcca3c6281c371086dc8180a0264befebc25d8d000d104bad14bc36d784750fd03eafcd0279f56514b14dbe6d3bf573f6acd866553f4643520e249e0feea3c47ef088f230dee7403a596fd32b2135601a4995f268df40ae6d51442b62cd794da251a15ca8efcb9f35a096dd438756fe6fe845aaace485d2d8e009a28ef023e14ace7e09bdd3881074125289832f63a7a4407da4c2c6aa53a207037fa5148571a07c7f21689d21a38f508d919c9acba9b2300c51db8c0285432d77d155bbb2afebb7b2ee7263b381d9b67173720ecfa5a808d5623a6d5ecfc766c11865f1547acfc85e87e56059d65a4857a8f9c269de37ad06204a9b507550562581bc2ddf3e9ccbb3674303b92c4bc15cc5e601c1fe83624045fc9bc066752e2bdc6b175509e2cd8567dc419284f62f03f46ae1b0c2d02276fe28a37f4f6b116b5a7c64997063df52d3dc46d2081f09f74b1d5d40ad014e30b3d22590bb47488cca815377f5edfa296b5e3c3c92f6293e206bfaf5ad7c56488a04c1b057662c98186f631e289567d904bb2d508bac0d7a1e9aed43beee201a43dec9130d9c6aa2f4807c1ba7f1e68d85c82d6fc096402b7432e4e47ce7e5927abcce79be0d6a527b5944c568adcba0cde32c2db225a91d58c49f3b803f6b92a4078cc0821040a8c7d17957ef026398d97ce71688f168f601aaedb79fbc36306227c69d73651370c158e1d13cb64104ff7c9dcec9ea73ecdcca26346d82d70fcc44cd4e20c0da68a9b0931782be29ea391f4ceb19e29ba065b1dda8f00b78baf1e071d18941ec3b54c777229732c0a3e4a062cc9cde6d713c46d8a487383460074a2f95d43e9b3181b8e756645393ef464b12274e20718a14ecc47d6b5d785d1cdfee90ca9d44711ab06850244683ba8034a8ad1c5111f437541882ea2313646614687c9460aede690614b96c748da692bd21660f0b63691bb7b65eb8f355b2d92f4cc739e536744cae28e3d3146c5639fb242afe28af70ef664c22c472d7af7d1cc241330470aeba8214e7326e8a6c9df3832a10fed90d9567b364a4f744408542f431db45782155ae2b5ba897aac94a0e22940b72107ccb26b826b57f59d5f04319b9cf8f3d42a99bb565af8f49c532e8a16c58c388bb0f0d44b1725c12f3f6ac3a9a42157db72dc308d847892335dd913d48ecc2d1ce3603e7fade8c7632298c6a71c3d1aee483c82bb91c6da6a3fd1b0b0f07a218e16ec495d188464a0fa37134bc1efbf18e3e421aeaa3e82369b74b9b225ff4462bf0ce709bbb8c986694dd1ced204d1084ee483b56e3a8fba5e83fbb4fa8e23454c4450538a4948870e8f95391da679cd649c93076da9325b69a0eb3b13e952991f2c5dc68d5900b655b4e22cf402d5b6f220a1eebdb4e37632c2b3ef77b95aaf4ef660ba236d1431fe597aa7b00dafc4edfac76bb3c95fe80ce8ed707fad5927d42a25c2998d0804969487c90234b0184b96889c332740279c5eeb467e568624b99be4c2d2d3b56fa5ec6a633450127a2b82c5516de01ed37ea9a53053a553082678753f400864777efdd3c1233cc7c2c129faed1684802b91ab9d96c5c398e94e0245929f3d0fb7d1d0e045eb6084a5a2aa8960aaba65df98bf5b572632cd836b4fce506b6fc7a5d2cffe640404c1312b4077c81c4885da955dc2fcc0ed0af655613e2d9bf6af1b721c44e9a7a753634d988847a8f2dd53bf6ae35e15380155d22db8e57068f6770f750ef6cd01cbf166923b3e46b436172109695d23492e43907004955c2ddb91c1143f82f80a7bb91fe13c4df44f06199e01876a8b01fd564b9eb0722bd4cc1eb65802627241d03079bb1b281a5db81dca780993d0bc9e256743fbc830fb34191717e2b3edd2ec61ff1e8eed902261262d4db67c5d04461873288d1121897546cc2ae2c3bdbe8feadb3f2287480e08911f8b86dcc7bf28bc0387148f94436a47a173b1b410b6e6616a083b061d42c7eaf3e12ca4bb464cceed2528a17d433646c89e158933ad01dadbc2321a471e316e34e671e183e48368e6f894e2a62ec8ba5084f0bd9baeda5c05cc9a9ff9a9e37a8b6ce3a68ff7a74027d344036e9e350b4398b72232de379c33b459784d19e762cce7c89ddacffda67a508fcf71e599e2905e528becd86e17a9b0b122ca4b650656644a98c53b4688258cb27ced9fd133f6eabea54ec96c6d01867984e54b02fcaaad62a3f1e44538ad5e5e7c768c0cc8f93071b2f5198d730a60053d17438b26e6113f2c2d31e8be54e494426cc2775b0d9ad728877533a1dc25e86c55419a3623a64c08ba5deb8cb5cc668beafc5cde5704dfe9b648a39e8560fbf1b2966e1d7c6f535a92a7035d1088a0318b5d8cdc058f653c3f3163a5dcf43939651fbdb333fc8090d3e51bffd15b7567c274d31a777cfe67628fb5504d0262a092074e2181511846d6b55d8741c1188a2240f661155fffa99f28bfd1da14e457adba8de37a2baffcf0a3b157ff234c0072b72de09aa12912fc247841891d58988d608cb2b49ad6d6e4baaa59c0fe2c97ad28bbe415c844752501ab253f45ea4febccf8370bb084a2249c7c81397ae182a8b7c3b4552660cb9ac26222911902b993e24a9b53eb610aa1344305b0c8783631df7883fd1f76942b844a2cb25de4beb6e2e23b84f657d998b59acbe488ee998e27ce1cc9334716f1c90331cead8a0fdc729734353ad7fe7e824f0a92f7f853b774fefe1657b31a855aa22ac07706a797229e250203df4b12415fabb250b6246db6c3bd54bc3933bd166a1b77a6b9e29edcf54507cd326d8fd503e2e8461dc62946b139bf62c23bb53af7fb1d1e9506df64519aa6431b2e30bf9512be8b4a58823e9e41af13eeccb51edd0501e06fe9f5817a0732ea9b7dece49c388ededaaeef6fbe5db716c6a86ba60021a8f4c6655ae35866ffaf820f849ee5f10679ebdbfd5561498fbcc585f3212f309cbbad063c2f48573b9cc83032832402e5e1475695ae60a060b9e8d74dd9c5b0807804492799efdf8bd662f2f0826c51134c942988892764c3e5c241126a4180078b5d844da995b7a6b3cbcee505a2fde17e007c76e8f25107265c4de665c1da7b9d9e04a058afc78ca9ff14952eed2d2d6f375487d4ceb8227814ff234d05df9fdca4bea62b0d190112563de7434732dc0cd94178f197fc4215061e6384f104d7170c599a337f772d5a0bd88b44cd071a3e5ddf8af7c4c60bad44a10475a2aad1552539f96b079e2cbbb94bbf6417a3eb222f196f420d47588684a93d913034200468b4c853d8366a83288906b17b52163874069747c84b31c4170c4012f50f73c8156bf3c278a8c272c0489d42b17d1f2f76335eb43bdc19d4e4c0074bd8f1b49e3000354826f0d65511f395ce8027d93fe64f0f3f2fdf3afb16b1e125c8ed221b62c9308c8a50c5fe9444746182c0a8bc4bd19c1de2532531afa34760395788f65a827eefb2e67ba088f0e494e11375b79ccad06f97658e6f91641d91a8c2eb8be5b0df4ca22647f470dd76fddf8982871fd636c5c7daa838294ca2b198908e9843880306fd28bed6f1690a8e91b732153103010b9102e91c9105d104610fd90388a8091909feb5e55540b808001812bd9bd42c4109e9d27f9f638b15f6894a0d3c070c52e4263021d0def1d8d7ef26185c72f61880cef22684d945e78230b51e4eca0562410c409b51e4a24b298f0066ee01bc4fd9073e2bd4b586f18437c1c84dc65b9f20d42149196e9dc5a6043c85b6854484e859e994b32d6380ae2885a851219550fa2533089c81d2fe03514b45d1efe4e6a3153510ba0db55f5d8a7615662cf3f0b33a4b57fa3d490c3d0be2dd6bbe0a5462cfdb4d51e6573961c0000849cf4a63a03eb184430d8794305b14bd64be2e2a3c4cdb7546aaaa16b6a22cc6a6e1b70b1091d6bd6b1006c6980d9ade93d65b4105ae44c95bd17cff87a9696693c3b141eb27d0c828ec86183fe41054520e3151bd8eadba11f40e005e5862f64199610d7264b5be29c6d12c736aa9e85c4ace3e5f082881c9794b1264634f525e5602ab5e7a492671e6d9b8ed9143c9ecac72b2a892b81c46f27788a8f50caef547ddea6fc712fb25003291ea31a4d39e948b1503ba82262100528e51704e7996b6054de0666d264698d4195d1687032ff4a83d08c1603b205cde63ddfc9dc947f20173c2abd5200fe79a8e57f73d6284fc8e1e331a699e3d37f7dd8f1d231c09d075d497f0ce70021667d87487d30d51460b64455e6a34894d4c9a92d8272fd423d9d9aef5037cf7edffbbe9d42bfda77afc3f83e1558ce50e699b4a3ff69a855ce1700c05c47c188067bbe24c898a1375ec320f39cc0d1a720c1becb9b25186bc97b7458f1abcd52fa8e0b8f01568df7a0c14239c20bd58d7111e060054c6c9df25722c9c1605be8f4524c6569c321604c028a40ccc9f2379260d6324fc33e7c9a062e2a3ba5cd7a62df0523242871c6b0fe0708d085e5738d3206a0acd2b0026097f9474423575cab5acd5373d4aef08b57f24fbc357d6dd53f6ef864f26bf127b0f2be1410a8e60678fb22d04006d27d904638cd72d07a92f8eb15cbd9dc445ac0a726a1e6670b30314339b6d0733247d807d1920c0449e78e4788a22e1d0f89a0a3c563e8e35cdf64407b2a9d86fc2f292423e5bb09898ba0bb46df4f8cced86f5b24ae58fbf875121ece5219d85c0d5ee65714e2bcb5602458d0d84631fb97502dc5ff709d38b5aa2f79af7475e097208b455cb4e8e073be1cbbd8601a2f926cc2ec72e0ea2f33e7ef75d19a3bc52452985db4454ea603aa0d54d192175f20645d93e78032dd87b0ec83d648ca560f1d42586489e83b02dd2057638a8c018b558b937d4c4d0b0a3e28120f58e1daba65673d6480c25f373f774e4bbf4e6a56ca087b5326ef2af02d14b5f8a073105b058c781cec450614cf071d6586297736f4815b0e8a03f7cad9397049ec3b68c110ef47f0825ddfc9fede954ff8d5bdceba33b569135e0ebe8d81211537102daaf1b9485d08297927a8b4e62c30a9606ef5a39e400154dde9f5fe5c83275fe4bbafb5209e7184a6acae12073ed621abe8025a824a1c29e4b66bae2d69554ee0bdd1aa97c15d2ce46614b32f923b44330c69b1beb5687031253d2abc90fb417163669c4bdc71998e205ee23bb1e21f85f520d443d1b44d7777414639241b871498b39463f46b40ff8c62ba2416735fd712a39316b3591f379eba7655ec210f45a72acad05bf355cee0abc55604b339eb6bd7446c3f5cfc22ac40b3e5eaf86b28130f311e250b7d306b4a1796e2fb7b0c61fdb82e939c97829e49a0b794c54d8669a682c7f115002256c74196a0e3a3ecb392a3662a8dba6b09ffff68d23165f8a3cb43d21ef8d5b95d6632be8c5df0e5c8b3c0c5c3cfe9991071442dc8ab34eb2a39183c571e732d49c41dd5475ddebdc62ebfd9dfbee38746cea27b9342080877ed1e0f3823925462dc2b87e26c8b73663cf523ae50cabc7aa89b44fdd5f7021ff1284075e92759452058dfe0519387bf04063553a6c68ac4f6074a276c661e5a64592ecab3f00a29e61e9debc1498c1e715c5cc84c1a41498c527b05c361c4a69121158df6dd911a3cf4d9ea889ee84e5ea481705bbe339b717500080d3db17344d0b144d4637ae60c0de36fbebf509ea4881e67fd93c9b0cfc7b5a727549dba72149026fe397b5d1d2d3afcff6eac4918d32489f07e309f2954fe8eda8032a9c1da5685c9aa576746f6552c03ca03d5a107e52b1db517793bc44562e195e25c63776eceb7d2f2bce912b4c63ce2084342c2e35148ebcb1c14f556f0f0388fc47ae1f9b41175b880cc72e9e694a2e53473601d128816ede60c9d4d9a8b8a8bb5a96dcd9bb3ddbcccf0d3eb8be3a7b953dd04a0946d35bc864ab42943760e99262d19b36e5affb766f0901dd865c06143160008aa85ce447685a0d4d7d8e6a3d97385b0255ab21ebce9bce4cb6ec35394290f8164a77c3c6d4decb7bd0e6b0277a42f329c544b4e531e16e3723bee82b80330aa0866a7d45d15bcd52c5f89b88274cded89a828ee5a454df0f4b325a385a492911262b2dc63645c474b6d11a9a2548c8a268956b4e264948a52112ab68c158b94921332e4188775d38aad72565c952a4b7740effa503b32d015b20d141611456c9f08f7f22efeb3801725a26a7d1ec6b31f7b23b186750abd06a43691a70d193f1f08a2f1de4f14ae902ab4a5d5a1532644446025035908b29e4d1d83d22198286146b3cbdf670e2b90132fee30fb0a5f299bf0d57af9f1c34833cea641b89b4a4925098b4cd3b6940b7445ec5fae42988f9a58cad6f84095f50a5191c2f01191852e6f37459a04c18ec349ec4497cb4043f720fcb6a3637e2343b249f9a626cba9429598afe5ca5040ce085a4fb469495bb228f0874d5436400d9e4222b116ceb7b180e06a849654758b7ad1c6c4285f3fe22a0be4d5cd6e0572f34391fb996fa1fcd91e986e27690b7bbc8a44839c72461c8cd5e6676baa9b6b995de66e7ca09f224b96b013e80f4ca35de71a97cc5b1b47faf607e1dff51b9884492f23575adc5b8783cb315975aa5c839d41b9311eb2570d8570dd9926cf387e7fd36055b39d63b7d5a690b564ef91d57e9b2feb647d5b307bd864580f6b0a99b0e3a696b43e272f30c87c23cfa08ce35a07996090930b2991ddb36e8c8ba2207351ce619035f37dc7580b88ee0e6a790a9f84fd0d65fb23a800ad6abf9be81111396a54862562238f9700ccf55b6d4f04fd10b05c566d2e070ee659ec914682d2dc3a0000b79ed1b37c58e7ac0b6ab658eb488417e35c250f5a3e98763285a7ad9284789026879fb38fec8739b38079aaf74ada2e602bcbb9efdcc4a8f676c26048b70b293ca34a63a9d15e07ba60c82e499f2282900dfe2a9aef5154d299e45a1fa818cf21529f82d559d3fcbd6716a2938e50958ce053fb87523f178667ea891b84f7d1f7b1584c827828883f245299bcdf2e3e81a6ba96dcf1850e1d0a819cefb68d65e2e624758c012aa1641f44e1a2fca3aab05a28647c93b8f756344b2d0aa0b11a4492751b51320871a07c1aa28588ce98eef944e210e3bf78c550a10d868e6946ac16dba580366bc2585b75a97cd85e53b0deea2f93695fcd9c5ebe28d694b41c71270d73f6344d6b43af2243b544f71cbfdd0b3dc29b61ffd45b509ac96ab9e29268f9a0821f0b73284183bc79173f2ded6cecc0ca79edeaa283bdade49895912bee329cc94bfa73bd65a84424e760cb9bd2f5b1f570abaf110a197c520146a66c18822324e4fe04b445131d4f473c089f49ea8dcd65192e9db97584556302f0805b360f86d1750c85541a83cc74bd8da45a215cc2f316ebcdd9207a3fd531d50356c251a86a2e2e7c53fb36b97f7d4254ec42076a1557991b95d638d01c078ba60c654458f6e6d96c20bf0cc91178c018e7e1de5bb1cb0ffc624056bc855d26538216daedc5582b328e0c485ff04cc97228b8bd6fb351a030b947bd0600cca5364386cb984abf197845ee8c14659ad5b870e79b6fa8914aec68ae4b205b15de4ac26544c46b41811dda3b6261b6a975e4bf6c95d5175ecc8cf6cc7f53440b3af2151b3863b523cb3561b74a7edf311b80a05da52576a981115f9f829d3ac6691dd8f2d5ec3ef1316c11e375c923863c0580547157b18ea2bfb3b1690d4b1af01a7039ef1382d47fca7a422c52a36906e025a5e0e457cfb2665d353792f5f981814cc348dfa77f2e2fab1da47688ec6f805cf99054f978835210f6f8c17ed32cc2295469c3e5787561722c32405aaf55421916032784962c3b5b0ef8f665f6237cadd8e6b7a277030069e81bb96faf7800b5f3054cd9a13b5690c20aa65ccdf4a09169711a2e1b847a91c91c2a8180db59a894f838b7b4accd862a5be076b655e9fce90918c00099e7ee58a4f8831e3d0417988e9d96d27ccd1e2eb641f4a5a7694151adb7571b1c68af54f4d6df425c0fa97ab537c28ecbc88192884116e3184ab5bf932655d1c33dd771012b1d5799061cf6ce6d7a5497424e14b5bbb72cb9178c6d6f932de03a936ad6dccff70c0d7c735374b841350f1d940b21d052a329ab8f0b198f49ae479afecc25ee1d7204619652657eb90c54aa554af552242a4cba859e063d752a722b6c8339ded156a920c72541fd61fbdc94b2ad19b8a06e34d9d4664017748cc6580e65b2864884b726d8a3e855a2ab8e57448c29f133a2030353b48102b36450d6b319c9a70151ff0cecf2190c908015bd8113ba5a3b6dbe1d6e83b835be598cad6e3b7d2a5205c6968a7628d95b22ef0513c6cbb289755e1931728e8ce1a157307370ae33e09d1f340acf9b4d0a125121fe56686c1825fd87964faf16e39641c9251ef5cf568d4112b59184a2cee08d579808795cf134b876d816464bb16264a5d0ded24a8ef960bc91a059575f94b8588960182f454dc1fa619474fccd0348ce659d748bebb9454bf57167fc2b48b908344d38f06fc72aaec8df82b205fc9d24eb5816a4b9990263367afb528e158a155dd7c18083e843555bb393722c642ac420e233f5f2a3ac5795a6dd9c7d74accb69e5dc26200c076d877eb9dd43cfa0664a1a8e15e22e14a544ba7ee16b062de90c0e485f1baa77e4803422ab3312b516f2af1c1438b516e006b1a76040c9258e24a45d3bca809eb0fb8fdaff0df156293f7662a1f5d13e3de8388825c290e0fea6101d025116e1a2464e52e94e57d05e26958520573c2d5ba4dd7b66aef1c3578c6de1795dd64bfae0d0a0b246f290ff6edaa2aa5e283007213ae08c03a31f18c72d080aad9a53326f73c13ad53552a851c2ae5fa11bd2be28e3193593c564b2a14854986b289fe16fe34a0c064e08e0c8cfb144858457a381c709f3065bce039db8ca6fd22409f445eb237484338c62c3a0b4a223d0630b21b7a0ac3e8f4dc106a10cc890a7e89c8350885ad4160b16359ad7e2ef099ef4aeb3e64e5582a78b2ddd1defe72e48bec7661a6cf0856b65dd0b69606271c5c6cb6d66ba6d14461b060b0240e150b29450625f44384c16784945e473a382b2ed47e19cb9710214556d280891d1723792229eb55b05bfcf2ab230953dcdc8146a345b724e65caa16d0bf536cb25da840ef3c12190456b261386701ce3fb49cc45d1e097c3905e78af94da0960333b1ef5db5b0d225d807e6208b6b967d86a9ba6f77e30b02f2c3b33c6a306567d6d1a4b0b9da92cfc464ac3fa4eaa036a3b46ff1404fdab21f679fc0eefd22e7114826a7753385b05bb6c88d8065ec6fbc75ec681bde38acf274d1491edef0d2e3f415bffe7e0456ffdc13693a7719fb42588db2327f280f8c55a3a3d0412784e5648e3120c3630cbc6821f208552be7267cad74c45663c90bc5a72bb24404791278247971b9c731d8642a2486f4e38932c4f72618c02755dca5748f6d44a3f85f60a939ee8412eefb632efaa92886e53ee900ca3a56beb6c1be4ed4415811e6fefdee423005f14e28cbc42208be8a56cb6148a4602827118628b479a9a8ea3b9860674c30d60268bb2051ffb0db0c1a8dcad2054c300d2ef1034b6b3a73e3da0ef127f15b7219950adc3c5acf7a346d9447d9d454248fe51e9e621b9e7c0c44cb246275347d46d9504c31409bc228cdce17fe29aba8e9e4b92cad612089b06a91b7f6ad3d9b261c3ef60cd94a7e5247e4dc077edf18e9b793b68ee9c2a31c24e4f82e3f5674128dfa567370f3a34f8960e1852345d31b04e4f8d2dca5859d1888d18f54ce0a96e77a947d519a065909d5af39f53cf73aa0edaaba690ac89ab5630431a7367ca15ddac15b105cfb3b0b618c7ca20a11f941be889e0cff2185fdc11745aeb5d6b5006cc5573022e4b04040b3340b2a4d001ffffffffffffffffff51dbdab7cdda07edcb94361913500c45c8fc84a494524a3225f3f43338ed03ff151cc287100f0b6c0acc0a9c0a4a3c39e520913005b1975fb3cc322c830308244c313eba69a8dccfcbbd8d1c3bf011e6d2be8138421fcd0a48234cfab48d560a35dd184118614a2d25afcf9a4a005984f13e95685ac642375411c62f335ddacabb94249f236127c26cfae652e724bd5423c2a04fe816f93d0f953c8449af6b9d7e3fbb3de11a6b6608534a2bb18e4218644f4a2928112a4ad6354298c5d664cb31ffaf837c076410863325433b5dc97111b7204ca7443b09baa31aa2a1c3c659208c1672f1b1b4691d95c510c306093c3c4000e163d8e0c118653000e40f56ba1b1bcb15d6b3933c32727455633900e207731284aefaa42ad907a37512bd7637ef1b678d354e3bca28e38339bb47dffe391b6d273a6cdcc03d184b963072edf43af4600ea192126d9ec44ea29e07a3794e425a78ec4dabf1600a131fe127b37b01c81dcc694cc3afa46d0763c979616445f4b8b97530cea6ea8de97e3c9581d0e1f5d0cf5eff49903998c457ebf23149fea58126079356a8fe53e154630d75e36054cf16173d0c07a35ace11933ebad2e31c9c24f91cbcc1a4ed4e9afcecd458d33c37984a94877e0eaa4c94688d353ea381ca6a9800a40da6dd33b59f4ef8874e52636dad05206c30de2533ff931a77f7ea5883a9d3785e4b52b2c6da0e1c38d46012f48b891e9583b6d4c100240d465136221696e754856a2c1a4c65626f27a14c0cb5748d353e83e12bb89aec5945c5e866387f6e85c9aabf0ca6f4222b2749b2a5bd548d35268341c7c9e1533e99a177a200640c46f99c1dcba348eb0a0840c46092aec3e4ae5ec6581b02903098ccf2e3cf9a60305a0e5afaa41925b8c67702902f986543081d4a3679269ada05205e30e55c363d25eee79dba60d2398710d54949275a88061607e142524992249f166da9b1564e06205b3028f5a1c4ae534dd18c86164ca2a75392f44ea22b00c98239f5ef4df2144ae49bd052008205f39f1484ec7ce92b1884c8b7bd93a3493a9605b142aa24bd566b6b8db5260148158c164fcf7df0b7a01d1c62141a89c60e1d386ad0d0c3c118367080031c622c0e1b34c83020549802881444001205d5dc2c2d2e68c650007982c9d69289fda4ecc491937143043ee0800e1d27051e1e1e06e2049026f0f5b2d9ea59ad7de5a9a49caca28e594098605e4b39f1e2b64936421c3bc610c1128c7a7225ed4949b224a5b59192083ef0811b3a0e0f3c3c9293d000a204c37aac279debc2824a27c1fc72929e58236d4f1222c1ec49b40e173a7d5ecf811cc160726996525610239837fdaddf336f56669022185bd3737dae83502d99004204833efd241ff43f0c934a5236b13bf51fc230c91384ba1065929069f90886797432cb59a205184693da2fe845f74e3afa8b362e59b8d3b2e02ea79569a1ba7b94245f18f76227e9e7a504f929bd30858a551a2127d5a8145e1867c3cf73ca92f373ca2e38ab28e375156bcb2aecc7dae5445329f87e125d18ce5cbbac44b53993fbc8854994d8a13d8f1017e6ee720f3a9c9494d0f716a69157d1644b96dd45b585d94abab575d0b072b7166619359324954db4307812d54faed678162635a22bc927e34b4dede1f139fc6561ca3ff34ea243dcfad5217cc4c268728553dfeb32081fb0309b55884a2594685d6b03c70bf4c6c72bccda26c68937d1043cf870c516541cd3a7726cbb15f9874e95e7da5167561c941c9ecda28af26e15cea5301d46ffe9b54d15a588dc76aa6859d20f13aa4a3015c60c5d7a266eaabfde072acc56264d54b8925318ae4aac1353a2867dca16e1c314c6396984ae13b73f4b45c34a61bc3b553a4d1e5142ac1c7c90c25c794fb783fc5f1ea9181fa3302555fb1dad2b4de5134e1d3a5833f0210a639e94662c66e95c521fa130e5258d9354feb9fd948707280c9773dcda3dd9270c4a56ca75675b269afe3e3c61129f8451fa5acadf549dc8be4beba2ddd55b7795c897ca27459c308cf5e7ec9b245ff8d884b9d242e627cdb64e0b1f9a3025b9b1193732f7b3c52b7c64c26079593d688a8962745cec122653b75dc1e4e5e1b13e48ff6c0983d8b8d87ae2bb9f302b615eb5bbd1159b1226a9aa537849529e24a727616e75b5539df4ee644f12a6941dff4818bb2fa5e52d25244cd9c3d37e28a5728aa347943b2b68597585d3d2b4a81764e57fc711e611f6e5a3a146cee4f8d10853126bf4e8f4764985cdc3e3ccf0c108d309b5fe12be63624517619e37bd22da411f8a30795a2a31cf4e5c35b59de1231126b95f9232199d0face00569f8408429e5131d174eb6868f43184fb549b765db5542e4831ce7868d317c18c27057b9c2082587fd8b3e0a618aa154ceadebc53f930f4258f284910fc2706f82295d268e891a0bc22073bad74559febf1a0853fa649ae35ea1acad0f4098dbca53e737753ae8fce30fa6bc999db42c49a2d33dc2871f8cefb97fa4c5ef9c242d7d30c99e7225a66fdf7eb4f9601c5da16e4d5dec942e34ecd159277cecc15ce174f578aa1ea99687c7871ecc63d9737e0927472ba93d3a280a1f7930bf86be7dfe3ff06034419b7caa2374b4943b9852ee6b2b436c4c6eed601c8d3dcf595475307c7bff9c7b9f5813a5834149275cb4b13ee6604e4f3988bfbfaa37793918de7c4e5bd5cda76012076399d63ad3351ccc2147bdf6760755a27c834996f586851edd5070b93677f98a9975bf261fbf3698f2c8508230b1e4935a7eb0c132abe8eded16cbd2ac429d7acfae269558ca640d66ab8fa5fd4ff3f02864e8b8fb50834938e94cc67deb81e6b317039581c3fb041f693098b55df4de133dd2f001a281056d061f6830e5ac8b122fa91a6b64dc484a0e14887156e0e1710693eecf9f36fdf81c33182c087595a44863f0510693e8e059e7549758aec8507e96d8db95c43268ecc08673c8c7184c4abac505955de2592f06f3996e379d4c4949e7160693872c97bf1c7dabf5533e3ec0603cf95b2c4be835d6c4d0dd31868d32706003ed063ebe600a71c13e65eedde7bb630c1b65e8206b7c78c1249a49f6c954384bd6415d3077a55ba7f315b3fcfd830b861be1a19b969ddffb8d2d9866ee533afd785549d00588850f2d983e3cfa96e0414f9827b3f09105549714dfee52fec082f92e5dcaa93ae90aa69c277d8e118b3df15bc1687eb7bed716c382f75105a3dce778b1fc2413d753c17c296a28e9659f82f9632de7b8ac5526280553278f6619da55b9e947148cefe597b2e9030a0661a27bf9b59609daf3f184d2725c4eb9d0b69469e1a255e4fa047d38c16cc92f9b0c11237ab90bb80b1f4d3089273549bf2583058d840f2698e4c7cae6e9120f0f2e7c2cc1a442c7b10fa13ca77760c369948123070d7fb6157c28c11c7663a276ba54eacf111a49f84882e1a4efcab5d55c3b291f48308befb6c83e29438bd0118cf717475edcc3dc9818c1685f274bdd4b95a0f647118cf932a69e2d2dc7b67c10c1a4e2e7fe938354bf5c0e1c63e0c046d9304c1fa2efe4b1b41b69aab196703c8d1c38cc84a1fd67939229cf493f9f033d3a18e612a57c7be354cef7e06bd0d81c0d0ce3c8a9dbbff53442b5af23c721a36df42f0c6a9d6566df22d4ff3472f04f46b131da1746d74f3749dcf54c9e400b40707e059fd81083051e1e7e3e878747752f4c42ab879ea8d331fbe585f9249d72a5b45cef42b78e51f1144b2e72e326cc83c996433c6c565d98459c4a5258c9615684395e478e9382b3f7cb052a68a9d3233e19376c7878e0b0d1b8308f5b98c7695b98472dcc9f44fdbe0c352d8c95837bbcb4df2c0cea54efe7bcb485919e79cbc21c6d6d776ca45d4e158dcfc1b951168b45c3e26653d52b5997c78c68dd176161d2aa9676667b8449a219f42b4c622669d3f8b25d61f636b9a52ae9db50e20e742bcc2ea2935f92ff4e6c6d5c192b6ad0aba0d1aa30aa9859ec5a4ad2ec9b8a15342a160f258ffa14868fab6c262f8ebc726f0409294cc193789cfb2496671426ffa815df3c278d4561d6be14cd721d0ab3fb86b79d30280cbb1a3aff423dff9f308927ce76cd5d67513d81d85a2a497ed90993de3925ca09396138a14a97286a3d266ec230b2dde52a78eda768c2a039dea25dc98451ad24b14d0e13d673983049aa593ada9524e95dc25426b9698dbf7852f7963025937b74c931ea93ec2b615c913fe9b2f69430c8adae97312df2a7491864c8d36162f9e82849c2a0f30925679c226178bd14aa5ae4ece99030d7fa96fe3919df9247184f4ac1d2091fd32bc81106f9a943fefd4698729fffa829ffa03a8c305f8559524927b5672fc22c5ba37a4de94f232bc27049c79d1225ca25d1449892ae1acf96378b1311668b25c5e7d31a26070f617c1344e81acd10c6f730f9de2ff7655808638ebbc54e3a69890a214c3bd77d927b83309b6da5c91ffaa73741983e97ba19f19e82c80261fc5075f29a00619273e4b4ced208d11fcceef5726fa28b6ecbfd60d4b1f39b37257d30eba9922f5be283d1a37a6a7153a1b1efc1e8b167f23d1f264df4601a157c5fc74fb414e5c1d8b19398167db9d2c18369b7cdfe04f16addb983492a41a9962d413ede7630c53425c6bfc9aeb7eb60f4360b1b3a9cc7ce743049522dd9e87251da9d83c9c7cb6d3cc8d0a59483f9a48f8d6725a54f308983f9acf42529e7ba9d96c0c11c274c586deb08cf923798e2a7b648ebd0ab2b7183c1deebb2b5dee4d1b7c178727f121edbe48fcf0663aa7e1215a4589a246b3087aed3ad38174bfca8c15cad5a925ca72e79380d2679276b0861a73b321a4c6a26c896f4d4ebd933189424992cefd3bbf79ac124fbe74a124fea11b70cc6b558a3d39d49926cc9605069733be874694c3a06f3c5d0255552c560d0be6a33b94bfea40c8329c931a98399b42523180c172ac7afcae215c62f184dd6091aeae20573a938f92e899f59972e18c74ddb9392e682b16333b7b65f2dbc2d98639bce754a8fc99e212d28aac4ea9c9414ca82e984f5dbdbf8981f1618f149ddae770593b0ed93b5d5f52b59c17ca32bada25f0593202ea782c173c4a86c9772673405a3b7578d2993b39f470ae6159513a7e72898edb2ea6e7b0eea562898a414ebe27a3b74e709463349f8befc49ca5e3ac1a0224dc44ce8dd49698269be644fcceb30c1d8fee59e4d6e0906b7b5dc2657824105f350b9a3fac95fd2a5c4f0d5d691601a1343958ff224fa2318d7a49ed27be249b311cc225a642d664eaf49110cdbf1b2441b2082a965946c987ccd7d8661521fd9fb310bc314ba9f82d06e300c4ae73be70e36304ceae941ed75fa17065d5ec29bec51eaaaf685f9353dbc4f3e31e1d40b83d09eef463d47fd122f4c6ede229f4abb30e7281152dfe35bea7561148f2de2d299bc26b9309c38a3623eef58d2716190bd94740e2a26e7b73089271f27f76c9e1c5b984289deab9494a0e3a4168538215a74f9af21dc74666152fad1439778eaffc3b2309d5c4a4f28d14ac99a6361924fede734f13dc4ccb0306988e89244db3d09f91506997982a50e3acc8bec0af32979abeea378740bb7c27432161bdbf1e23f668559949da07e4fedc98d5761f0d85f61b6b12a8c66b7fd9ed4793a8b5361124df94a173ac44ea830e9bc2174cebda6bf3f85b1f5d2b6ab73fce2a63049e17379bcfc452d2985c1d3925612457b3e8714c6fb24a2a662e8d8e951984afba6e9a896e26151984dcc6c8f8796953714e6fe93163f545098e38890a74ac5954c3f61bed15352b985d2997ac2e815a6541ae9a1f7ec8441ccd3d8e7ef2539e484313fa86b988af893b209b37934b972ce7dad451326fffc1e2dc9b75b2513c693544cea6e3161101df76e2cc66f6b7b09c307a157d55ae6165b4b18c5342b6e575b09f3c9f5cf494277f4244a1854d33c45578df2934998c4dd083f3d494c9648c224e79294147ff6a1a248986f54ba7612a9322248984d959a7ffce8234c79fdac93fd59298f3ac214462bed98db089387fe8ef4bf7bbd19614e79cab29f1026e9781126196276e76e4395561146cfe19d93a096a6dc44983b8efef4d34b49a528224c79566d4fdeae123d3d84c9a47029a7673a7f4a0d616c352fb162e1494f8530ec499f922949cc8612214cf395aa4e272955f34198444f5352b092bcca4410a65c975573e440989429d1d9c4c6e70a02c2e0167aa673f433cffdc1743aa7e7b8f7fbc1e871c2a81cfc3e984a9fbb5ea9124b9ff0c1a442cdf8c79cc9c1640fa624ede8fde59c28213d18b5f5b7848abfadf3609252bc8b9573923d45f1600c0b9e3394242a32bd83393fad4b8ea71d0cf65fbad4899bce631d4cdbf61566844807a3c9cba2ba2784bc0bcec16039d485aee594e5827230452d3d1197611c8c21d74a8558c93cc1c1fc995de1498963e26f30a7d2bcb653b7322637982fdc961c3daa93ba0da693a4a062e3b3c1e46aa944bdbe06838ea272c84f651f4ad4603a9d4a5a5c57bf1aa5c1d8b75e42754b3446683086297964bceae84f9fc178b37fb72787934cd80ce658419f779bf8f56d19ea959155eb26190c27ad6c2521945b07c760ce26492943e59294876230898bb65ddab5245bc260f0942264e32b603099fc9e27a712d47a2b5f306d8a92b564cd0be631938b5de2739a5d30accd78a5e8f9e552850ba6a463bb5ce5c773d2164cd17faf6543e54ebe161c13e24a84e85930b52561b904132c1855f57412f4be82f136f4dd7bb682c994fa24792cabdcb80aa6a444cdd968a960922cbdc8bdab1cf64ec1f8497cd3a14499c9492998e5ccd24f0a2f0ae69274d0974d2c39e8efa0600e2ab3e4ffbd53b47b8229ddcfe70473fa0d93562f4e1c53134c722fcd4305dd9d9298603ae531d7b4f6472d2dc164312a5f36c92cde578239098b9d3be59360d05195db4912fb794782b9e436314d253549cc8f60ae921e23984dbc8e2d2d39e92298e7bc926ebb35400493ea9c9b25499ea4131e865176fc5a6f45f8bec23096f814de540ed7ef06c3a4c4f8e5b91418e68ad721f6dae92afec21c4c5011ea74e60bf3dcecf75e28e969b35e982c9892e4cf1a2f0c9e6f2f469e1445671746713361d2e4b9a095e9c29c73f4b4123b77dc5c98c4f6cf5450aa9368c285c94ddd5daeb5e0b3dfc278325f9432496c618c193f497ea716a62bd9430b9394e409aa634791a69e85792d534f5c0c6d6acbc2246527e59eafc4da3a16c53d112ccc39bd63970ad1d22b4ce1db04ff5322d6e20a83da5daa133ae9cfb81526b5f5f46ce9c4cf9215e63013e7250517f9acc2242f594a19f27bb4aa30857f7193b62a76f052613aabbcaff7b658428579c37e4e2e3bf1ec2a9053985408a56a7e4a7c535ac282278098c218a3439b259d7545dfa530aa9d2a2528499614e6718bf96dc2c74f9c466198b9d8271e2d0771368828b074234ede791e2414a6a4e4aded3e0f3dcaf262a05305105018a4880ea7af832a9df11326292991dbc9e48bda314fac16aeabc28a5c0e75cbbdefa93eb21a6261274ccd6a4b163ddde66e2e5677e91fed9d6eba7b018413261f6d1eea79e46aa53b4036619204511993921c73d0a0b1e371900347ba62d79a306ca5f9e9106a8d35342e904c18363b64286d2befc191209830850f99eaa626d6a7cdbc8441c5533c71d23f081d8258c230d7da6d9bba086ee0c8f101b41d941c366890a103f700520953ce9ea07277892cb15f4a98c24dda9a947f12a6ca503a4b5e93244c579b8a7d2514020b93204eca5df112e49fd22b0c63bdd5bfa9224dc97185791cb6420db1b895bd9d0d6185495c45286d411cb20a83ab473b191796d524435491b9c6cba57bad6617920a539d94546fec8bece4a3c21cb236db834af191f914c62c8f7721a30b318529cb7df5ef8d4a61eee429a824550e290cdac43e6182ca25e5da46618ea5325ff254c4bc22428828cc55fa63ce4913cd2c2914a66a8fd62aaaed3bda164240616c0bf2629faaa421e413e9894e1846899e3dfe623d25c91a6b3bcecd08e1040ad98439e3c404e110030734c6b05163870d1e68e2ae59757b7b17adca2c8d4dcd3ecb67e7f3185f43471964ac65c2ec597bf7d9b36775b0c69a8d622308c184f9043361dab9e48841e3737076749b904b184c7f955c63828a250c9f3c334d3e75250caed9b762b3274b398450c224acba4af01c9a8439fdd7c97353265d724324611cf92d8f26a5b9c51123615ecf5d9ec4cab549d2658440c2145465bf99ca0e7bf2904798938e63331b2a58678707218e308ff2ba8f2587ce277a84904618bbfb3d09b28475fe890a218c305ac5dbef5e894b3a5b44882230118888cbd5f2e9d2f9935cc8215071abfaf7002c21c410e67183904298c711c2e899df265c86ec8ccc46c820aa3399f54a91ef0ba7b684755c0f4204611893ec6dd3f37277bd0b84f1c45fcbebda3b407c616408ad5fe5dd1f4ca14b647e30fea95c7292cdbceb83b1d594f49177f2f192dcf1c1e41eb5776486eef660caa7fb52bca44bed8e777a30a7b314f772d0eb336e481ecca34caca4c604dde9a329383c989358752525712785ddcaddc1d42b4a50972127cb566707f3497d174e9c0815c5bc3a18f64b5e5a9354e5e860eed49bf326c7b424e9949b83c1aa837c52bab46bfc0b918326a3dc455a546bace9b09197829038186fc4a934daa40f0ea6b5be509efd69f7a37b83f14db678d95343bc99e5dc602cedbc921e4625b3dc43da604ccfa962b28d3ced710d6183419bd986daf4c610b206531cbb52a1822a253ba506838c35e9fb96f71742d26092be737e34157fe6e25c08418349d05b4a49d79d2443c8194c395f3459ee67fd2d66216630552541ea7d09eb2db98494a18490c1383a429497df55563a86e291831031982b7b8a5715461d48418484c124c949faa0157f08184c29d5be6708f982a92cc712c43ada56aa663a42bc60fa5252647de56bacf9fb0d1c39129f0eb3414817ccf104ef4bd29987102e98e2bb987cb1be6209a58e2d98b6d479e92c3f440b9b453bef2c4bb26b921ea1521b92059314b6b3a9d8cae6af3970d448c6389fa3ac48108205932c1f53bdd2bbf5c3902b983dd977ccd236ee7d9f60063470106205b3575fba684a123f992e86902a9844b930f5df2a71fb0fa1823955adc55a25099982393c55fabe90140ce3614c1a59898241d9f5afe9a1600ebe97af214b4f3005515e416ee4844a8ad539bc859b6092e307f9a5cd6782410795a12d993c640926419a509517528239b5dcecbead6e7892604e56f66bf27ef04a22c1149bdbd6c14e5cb31cc1701d64a629214a2ee64630cd251f934a8a7a9914c1d4f76ef183988d168510c1a04bc71813ef30cc713e8b3a1d4a5f528561befc2154d007c398e9f183881026426018ac840a7a964b7e619091a7d7215f187f2cc583b43659fd5e98e24a45d73bcd9bbc30eb5c72cb1eda8529943835ad756130c1939b9a3ab991736190a332adfa45b830e8b6869b9436445de816a6f5e829af6f0b939c9fd5222aba797b6a61d836b32a25589acb0e2d0c7b22e45b4811aed6998549864e37499f8a3d4ab24850614b8832752c8c6582ee9e64e3a24b5818bcf4d77f986c4b955720c7f2ae3096d80bd159eb56187e7f2f457e49b2b266854949e1e492bb64152653d124514dae33c9c3aa306865c96151bc63979c0ac3fee5a8a44654984e5c59322ddf2d1e9fc224f3d624497df707159bc22426e6ceaf782c41a9140659a3044be984c95393c26022cfe4d3df8ec230dab45b25917752b6a23009f774b1846f43613215cff944bdf594406112f9bb2b96ca5452fa84294486bb8ceca8be3d61101a5b2e6a3d4929d44e98d4a69da493977668ca0973105fa2c88d36612c179d673e7874cfd184513b5a6fe83b13e6b294a4fc7e1384943161fab951979dbd84399dcbe82d614ccdd2f1f2323fa795308f9fdc62a29430cc9d5a2d53cb8c4998c43c31badf4a499835eef3c793c748983e898eab13724d9b20248c72f721c4b5f8088386baf1354177db828e30a79b8b8c88558ba146984ccb96502578da5133c21c2bdcff9cf692e35c84e9c33ac9498a75e75714610a17b467d3ae53e74a22cce1aa3f095171f4fb8830de5a4ab1f52af3f24398e4770ef5a09d4f7c0c61d8b8102a7bbb42187d6eb67366593cb1238431d4865a5907616c134f96a70a55724910e69254092ae951ffe1b540982ffff565bf29ed016112c5940eea2e5495e80fe63422eb722d9f20fbc1e84912bc64cf2528d1d307737ad5a91c2c0fcce083e14fb6ca28298d050befc1e0213d4b96d856ea473d983db9c88e973d992721cfc883594f868e1fc69e810773fca53d593ce7ccb883a9543f2849d81f4d0bd261872a4ebeba92b99cdaa68852b9c429b994c74b52077350c24ae45a34bcb374309e52e331a48866ccc1ac9d9f6e974a3960e9d5dd9629a62629eb51b1b784b766c4c19c34c7a41aff0a1c3e1346a94fcfd68c37983c774e759e4afde79de10673ccf582196d4087e5ca6f67e849b2a1b46dbb4ab92c5aacf911f24eb86b307a3a0b9de42ce2abb621cc5043eea74fd08c34984bd9675b366d21c734030d067dd2884add396730a93df30f9f6798c194b6f2db3e7974b530a30cc6f8e0157af1f3ee8ccad0c19f3274608a0c0611fa835059392787f1f038397ec6188c7de69b9fe25fce1dd631430c5c975e8d4fc15f4187c13c66d9463e3d34bc2f3f980106d3693f4b1327fbb8858530e30be6b42d9a5e9d448c6384195e3065d3ada44ae77b13951865388e2e98f472c71093a48f4098c1057392fae40fe7962d98f2cb7e50923a9562e533b4601e39230be6dd10359f727606164c52e59e585ef5a83cba195730a55fb999170b0a33ac60ce13e4d689d413473e560583f0131595928965273f39cca082f1b4f4db799831852a091df35cab9682397fd2740e33a260f6ce2baa849e9815ed0c2898f2c784c6b0815406339ed088d1a7da3c5f0788194ef0f3093aee826e0f8b91b209a62046e8c9d9c4bbcf3899c1044b4aa26928396ec9e58c256c767529432c76a7cac9faef9736b916c3c3e36628c1a07b37f34f94fc1f4c7c0677a7c4d0bfffd30c249853d49b7cf7e28c23983bfcd34c76898bee8d60925d9492ea6415790f17c1b0a26428499ec9a33e398308a6afdfddcb7a320ca397b6b82e370bc324b645b9786f6d20182693a794163db54ae2b20160184df6d241b9a95cbeff0b835afef872c28c9e92fbc218ae3a424d1e373928d9402fcc6f4975d0a2d793cebb015e984dad09d749691726dfae941ff94ef2d2ba30c8d930418d3a37900bc452b9b9bc5cd8ce388d39b962947cf9bd47be015c182ccc4f52bd57d2be85417db4d88bf15372b6308599137a746fdf956a61169d334e289f16a6d0ab5b15f92ccc26c5678d08fb349285b9b742b34b74ff8d62611ecf7913afe4b39561918e9e8258a96c7a85c13a8c56b2d615c6f5dc5fa2bc28d9d35618dcfafaec6207999315062545d997e5925236d32a0c335796f2cdf28530a9c27025051d37f9bec49652616a0d21c46b899656255498c2e5d4a293f0a2e2e91446f75831d174e52749a630959e5bd0132f85e9a493f36fe9b229053b7af018180307367420c0023a30f062a0b3a38c1b0bb08000747c8e32769c4f341670010054c00e03671828572781f4c714904079e47a58040a10001f200c2800003b7494b1020204e07170cac0c118470c040840478e4fca701c39c848800974d820e3282000b5000000000000004060c78fb143c7efc000e2781d870c072c4001a04307f2208000ce8ee31e0508c0d9711c470e8f030060000f48408ecf417276e8a0416301000840030e506cec10a3868e438346024664516cec701c376271801158141b3b7660c3cba041230123af308997b19cac4d6a2c9f957176e373d0d8810da7e1dfb6630c1b2a1871c58ed7d10a326eb0a2d8d891a3860e3168d048c0c82a0a0d1a0818518501465261aafe9404a5525b5041541874cb47ee53d029a7ce298c5552d0b14387d27fddf81bab23a630f6579a18e6a6e4c6dfd01b7fa3e818c3c68e1c2f860d326ee04876a414267b2b4168e95c6107525082097c600513c0b4c408297630328a2a9e347d9b593a29f588280c3f6ba3bba17bf2ec91501465eb33ed6eab4366fe53b6ae31afcb279f6006345a30020aa3c89d3422de914f98f4a7142766661f58c10476f88003628c78c27855662a9ecb9cca6a8d318e182928239d08c20827ca9da61ef216c6debd3e2ba983914d983d9aba7f474734a1239930d7fc968c60c2542deaec44852e610eb1a1e26437fdded812865fb3244fc85c1939691d64e0a051239518a144625d9d7ecff12f274732868dcdc17918ec24cca7935c9a312289a4383a8850da628f045aa62d972aca24198184e1fe4cec77ff8e65a547184b0e2b1fc654ff898f71c438578830e208c3dced6768132d97be6bac8d31d208539cd359eebf540e96c30893a4f38fd2d14a4b32f911c392df412f22f38f1db34eec5f30a20893785151ef36cbb2ce35d692df818e44987279282588f498f2f91a6b85630411c6d17b625c304f62091934c6c071e3068ea4588e914318bbd4c9e16ada8e114318f459fb9f160f395b71ec388187879916c2ca1baba0741ed558eb010e442307c91103f58bb10395a1434f30031a141821c48e0c42470461b4b025a5b5cb072293adce0a6336daa22a1e3f48d33c51d515afb1f6635c937123f9c008208c59f2e82f5349237f3066872c31cf84f2b8c960c40fbba789659ac96aaa452dd1e4bd52d92526df69a40f0613e27ced83b769ab4046f8703546f6701e7a30a9d52a29d4739aca96913c24ea34de6db4c83f713c98abba54f4bc0e1bafe3c7c81dcc49e486507a4eacb4fb881db20e5b3618a1838eccc1a42b3684475f0ec93df567ca3f290e066182121c8c2596e91c6e724a42fd6f3069ef50f217773798d4e8b96c32649d9ce36d309a945298ac39618349ca8b9ae07943c92d598329b88f7f882f2b4174d46078cb1e2b6bab73c99d34984cd8ebffebfbf0d14683714c54536577e964eb33dc88190cc273cae9fc16af4cb60c261f75299fcce40735194c51d394d8b6854a151c4331677767df2e73312c05252ad7411e11835145f4a44ec235128632028632f2851bf18249f79654763add85d26da5e4e908174c693f4dfc3211e4f81d22781ce4781394cbf13b6cd060640b7b6ab3b4fe338261440b86134d0e954ebe9dea932c98e72ca8dabf207ebd62c1ec95842c31d146aed0a75d34111d762b182ffb7eff08bb0ae63dd3714a4b72840a26f910eddcf1bfa1323205d3c9572e77eebbd6272998d473e62d892fd9aaed228c44c10c25ea7b12e4fa0a05bbba4ad6aaac5db347fbc8e9850d234f308c52a53f2b7a18f39213cc9fdd3fcd8d29b74ed204f3284950399e526aee3d4c3076a7f512712657b67009461f135521ef5182491097d386de175d79adf182912498a229a9ba62877eed7d368204f37deac81565795e7381c3c8114c49e5af133dc95b67a211cc1d33faf31e4fc7915d61a408e6fab7f4f5e291c208110cbe774ad67f7d18c64eb1a4e90abae6a426228cf455126b44f6a41c54826190bf664a78b8458061b292b3437f1b37ca2f4c254fb624c99a2c0422be3095d67653ffa79467d78be4a4f465956c114a8a8618e74478614cbb4cd379ca1288ecc2141f43eae97e35afb8c61a7b40a4fe8f53be7aa1a992402417c6b470c19274299cfc15eb20820b93c679f796f8262fc9ed10b9850d115b5c2d54841629320b7369e734694f1caba0d31c3bc810914535f3157761c1da2de6a28d4ee93d9938a2f1d658cbc1694189a4acbc46c49f4a81857135dd6396506a59ba2688bce25c711ead300f11569854ec1c4d4b2ce5e5db2a4c823c9d2cd5afaa30eca99deca1543fd625920a115498c44d999c6a07955b899cc23c4c6192e2f8a8f47ff2521c8994c23c48611ea330fbe7f73529b497a093444461927949edddeacc2733147a885730eb9275f9ed70b97f4d6c2e020ad35ab61c1d4a1d804c887cc2647625d77a520a15f4229e305dea4ee25d4ff68abd7e42a413e62d69237f945b9c688b70c2d8bb96a4db988aeae8092012229b305908176f3975f259521326159e92fc1d9bcfa7cb84c9e434492c347e5c344c986c7b74ccce2988e5942e442e6150a29efe2816114b183f653dc4dea6758e8954c224077d524a822539c93a11a184f1a472511f4a65adf6e01099843975bc74aea39684794ecf426aeaa9309526914898ef76f32c5c229030cfc935a52f3f970c51e41126252bdfa2c77684c136d64f9576451a612c2947fd421461449d24a1affd6974c6b07123c7b7c0078e83038f6ce44874bc07506411c60f192589bc8c4f4f22a20863a9fbad0fb58b24224dcb32266e15ddc275980a2ac69569ed8b082288306cbec941a8cf97bd43987349d966534f9785dc10fe8cf8f826dfa4102649a7f49f7c564218e7efcd4ef6141984495b69358b1f15dfff2208e385f8cb4edf25e56ce204914098e412c24bfcc9950208736fde88a648cb1244fe60ce275a52bc5c4925bbc50fe60d2d5a3dd5a95ed12929d207d3b765653d93b39ea8dcf1c19cc39a18dbca692e28ddedc11cd277cbf4cbffe975450f267525c449f7db4bfa532e0f86710f537a3a3a05113c184e569ab7f8bac81d4c5a224aca88a99ad444ec70b625ab5597f30a9be5c240a40ec65ecf397a10659e318b41840ee63a759dc49372ba5451292273308d1057a664b7e79b89881c4cf1f2838e38917b4b6986834988dc1033a954d02929f206837f86fa6c4a4ec40da6ef58b9cbe28a5610698359cb94a84e556ddbd12c88b0c1e826c8d2313efbe7cc4e640d06a584d89a245d4cbd2435984bcd08e939e55fd489481a50040d2a72066377ca61ba4e8e19cc29084f7a52d2595cb63298e49c4ad27fd16c248890c168a32f885d16392a976330579f99b47f520a27e445101183a94337f45f2f27059130984cea6cf392b3db9e1087200206d3953c7aa753f8af245f912f18aeaeafeadcbc238878c154aa4fde5b5c184b97638248174c7de26ef7f58b70c1b49dedcce494cfe1df10d98229a83939a6c7490ba6cf355917a79205639a6b28cf9a08160cb3a3b488e65a0221720563b9b5574a234f9424a714112b98070e44aa601e2f420593b65827c5cb39e9ac1415884cc1203f7f1ae59504e56a12838c1b3674f00944a470ae7a66a9d27f0e328e05225130d55f5813c363c4ab480c326a243bce8d7c8108140c3662257aa7d26953167982418ef00d5bd1151127985b44259593242729497d600513d80d8834c16097a4648b30216b20b2047352d663a37b6139f94a30c992c2a9c8e734de27c1384a1056b284aa8d3a418239b5727dce614b1e751fc1245faba5ab24664d6e0463072b115d725b04a3e8cb9eaa388a10c198e1e9baa4d9cec15b43840cc3a85b2a3caef6981027c2b0c45c95784247c34348304c9653a82badbdd793041886d55c933be83a3565fec2606ff36549bf5d5a2e0b21be308593c3782715bb905e987b9497ece085f0c2b0a27582d0bf3c3da65d18bb042bc982858dd35d1706a1f565ba9e5c984f3095e41bdd679260e3c254b363929a249d720f86dcc2244449c1afcf6d3d46b630b6e596a07feae1e3b53029213f5d57a74a10420b93508b25f9e9ab9e3c08426651d97bcba5fabd9a6c9fad9e105998bcc6f4622407426261028bbca8844d86c202712c14094522812814c549de02a31308001040288bc562c1589c4792a80714800261301c30301e22261a1810161c140844a27018100a05c36030200c0a868361704038d72bce01d27eef3b00b85f514892e958453c11e6f509852fd6ada4feb37c69993829a97f39fff8442ca5d66769eedf13552078fa948f347755964205c2adeec70de4a7bd56f01fedc60a52b8fe4e865a2707a21a7b1b39cdd7739a0f21b1d04218dfcbe703be4b8fbbe8cdd5a0edba8dfe5c5052de871837ac68b65c1f84516301e64f33055d564e4841430c57abbf30a7111465d1855cf229ae23dab1f9d98093a221048ed6d73c2b5e2ebb173b4225444b156c07728f5cd09f9795bd4d32b89a3f3b4ab83a1eb80ba8c5b2a2e6cf5c80a53a9caf80c1c9c0420f93547c67c43496e2e0b159cf66549cbc5d49d67983af744d3a9cdffda91a3839816ad87a60072c2690b22688df258f08ae08801288d08dca75a5112e5967a1d9c9d6ecaf2ee9163245504f4ae297d8d0c3b23ab354be07a25a1b7dab9f1546ea510b691178ff3ee3dc69a6feca02bbb77ebe8922a89001681f48392cca6e919a45ac28f4064c9315efe2e506ed11eacf4fd913d21176239fd38b5c454f1c2feadcc24b5c09a1fca23267941e115c686c366b51438ee787ec7c218f2f3334549a06a5b3d5297ab3cc66069ae4fc3b9c2856904361e69f3f9192269c106284cbfac206694dd6cc7582c8902e8b7b4587b6dea3fdc8690b623476e0d197611ed745fb30fa1a02b2d5557aad99f7e96790b8a43b1d4de056bb4cd140064e4576c393363480a54b0a490963eacc1e86f0beeca0866a9a3f9e9092ae474381d56ba45a8b5b470585820a3175b3866719e4585255411d33da9d9320e083f3a2fc01d9d0fd3058b1216ca0f5c15466994ee37c9de8827f6684b292d5f2eed7a2f479eefb96df17177a269cbb261c6b1d99ccad084f715837f8503afb878097b7499e7bdefd6b8730ed378efc1d2046144a94077ca6b359a33a9a269fd18f1deae2513462894373c94810ad9c2c4ef39126295a5b3bb99471c106a55a96a996a420d9485ec6a3f893bc554d13c3b31a8a2e74f3b374a7edf7dcbd92f2c571414c91b724edb8b56d7cccc9dfab9da7175e40b5c3a22b8e584c64625297cc92a5d12f59d91c426cdfca70cea6106b4bfc77a09ac31750d0a815ec275b6e42ee997396bd68c608608629f38e7acebdd0ee29da536d6a57acf58626520db54e03d74b36154003c85072a6dcdf2ab8e9bdc2728a4c21e7ff35af8f56384f969192ff6501702c45b38542f1dc6c0882c04bfd34c300a1a7282cda3c5084a84adb665eafe29b4619c726062681da7b04edde8599eb04c913b24181b00c63eb24d0d89a321270d0576a699e82f91eff82abca9d752db3659ee7772e58cc5cffd2e7db2df8ec1f44bc5420613316f34758110ef78e11f4870587f55768330f4157bf239b242cb36a33b0d8ff0d6046df21626fb402afc73812cce104abf16a4b6530f639884be0132a5b791cd423262a94c4e1c47ec56cd416eee1fe8087f1310d3bafe70d5db643291c875994f17631c1c2c6635a0e35c5f31a513bb19d26a29c40f3ae5ee0c28d5d63df7e932d3cd0642b3e863e90fff9f3369930dfce206f6079e51b8ab8a787d7238cd77ba757050cbf2053b644689cefdce821a4096d58734c50789273b0b5ca466a83a411d353d9ec2a4209b743371ab4491abfe2e64ba060f0b9710b929dbf00f28736fd5ae23514ac11b73e0c94f863477ed0ba0a83f37827b51359469559e8841f6f32d1398fd897358baa67f858de7f406eecf2deff960266edaf14a828cb3d3cc829b26b45e008ded1282fd53bfb94810de98cdd7578add51b674a7580df293d368841e71d9603f06c9b58ebf861829e73949ae2f1cd63050defd4589cf707aff9dddb41796b22ffe0a82f5445cd59e5c1c637364790f863c091483c61de7dbc347e1995182c7d27826b54ad434161a85876c558422a8721f6f16c2b916f941c337c725554cd5d298a28d5ea7eea5398c6af90ce2edd9a3df4fe778163699c87c2037cd9c4445b6d2d37dfeff0ddafba6d7eaa8d91f17c6b2751c761dbc7774f54f32bede8981420d69dcf716543192848fe20e80508512d052599e96bf00680aee4bd3805a81159eb5c92643480e6eaaabab34b43885cd099e6a5449984c1a6364fbf728478630dc8f177a6f382f7587166162f829b2601c9939b37049dc47f10a79fe074ec8e70c877f68f0c7cd07ee37a01bfc0e6f36807b9da112ae79e72f453ee9f9680ca7aac9caadac15c2b80a7ef8711ff954d289462c4544ec4a4252c594faffa49d4346404e2bee859b065bd82d1064d107bf863ff7ae119bd765a901542e702974869d4611580e09f6c61649eb00e1e54a9c267989f713aa6511c27c40aef6beca967cc3bdaaf4a54a327cee306b7697400b62d2cc25172da176b3281740c0531022a6236ba6860d074a4207132659dd70f97588c7c142585268b6611c86d5e74ed83538a11e5faa0ffc71d444630bf645dea15234430844d183182ef69b5d5222f15448dbf63174b00001d38167758450611487cf9ef9e8378d0af1c7d52ed9a8a40d6de75022cbb1c9e90fb72072e490f18050753655e36073f7e8c80452d2e87110da03808800f4ea369a594a0c08b90435dcb4f97136d7f2defa2ab168103a33f723e3b762d77396b3ebe92e88faa2491a3c222819b1f41143f3f9083b353e991e563952a3bfbea4f33ccef436edc917ea9d26ec2f4615c64cb43a3c089f013e0e52b727f6d4c3109eca2a26c4e5a40242aa93f1345bf8d4d0a483b3b2158f91a110abd60d1c705d21c7b98dcbc55a326330a2605aa31995295aaf9781797b22b15ba412dcfe5c22722f732032b8a5daa5e7a4e5c8cdbe046e3e43a6580fcc8a6900726b7f609474efc7d0eae89e0c768dd28920ec504fe5ee0055b0bccb2ef17ae5cfd1c0de09be413aebbd6f7a5f122702d359b85dcdf84a70e5eb3ea5df2a9f9733d73bad765dc202ebef2c7433562166b1d42bc4c20ace8bd951990ca5f450f1106fc28891f9bf3491284dfc54afddd2bbf0ca04071f5293cc6a2c57bbda040442ca19497fc5e35a6b057cc1af3eec5c5623c008ca1c5407505c0927087987b5669c6bf50b66ab40809d0ab4b7abe1a0ab7d1f5f524cb52cd8826a68f23f5e221f65894c00782f598327ca4efefdb49192bd5874c3e3f6aea8499b475b85ae3ef7ab44edb7962b8dce476d86895b2f77f37e46e5f2b422698f93d131e1ad861462ebee61e34b5a1db93ad762c1143325b79a8af4e1152a4c522711f5c1852dd34b23b650d1eca3a66b99e84600ea141634eea15004d982935a73693493fad6543ac344a38007884e204353070f84a4addb531c8933f8b5d7623c08b993c18fb4be5a24d5510d5cac3d2a654f44288ee7c9217ccd7fee0a1a9a0568f8174d9aa901b3bc69270a4363c822c778532d025d3caeb03ee49f03cda6dce01029bbd5a89bf6e6b4ecdd6e122ec0d089c71e78aeec49defbd8542c953663be180f13176e54e2df4f56b621b499d9c8374895ab2dd66a892eddca1bcd823b8ccbd06b7f3dc4f382be151ba4f063635f411ab1637a9dcc8343d7581224794963cad6d7bea7ca9459dc185943364048bb12638d642a78e22049456c84ad5f819aa74fa8b8a26e2cc2b7ee68c08e0b03d8b9011a084d3603d5c66051e56440f95f377a101a5e9f956184c3266bcdf81e11dfe30a4454ddc8b8692271e8f7f6b1ee9a9642d79f5e29ab2cc77e2a06e1c9a1318d1e4e0dc26aab378590d9ae82dcc131ab7aabd14cf3bcc01b7f0991b0db060b4d4daa0118df6212d8a029c91b79cdd130f99dd87a845c220e5402fda990c3915080cd15e62ad9c971b4b1f85f24eb5d18b7f03a129db6d890af048c062db80cf8aaaa3e3569d1295a5cac7b48c0140453ee7a0883a3ee1e559377c97f4be200a569f6535bab0765180877c6870480a2b27574916919c0f42579d9d87be55b2c69941902f75bb0522c68c244ccb7fa469520ecc49dbf2c5f21e57572c8d53953f3a4dd77ba40f20caf009820c831ef7240055d8e23f6df7b1d217bfcbffcc781d09af4d8a3042b2b2d4495dd4f663a839944471a5cb6e22168651bc0bc57da031ccd2624af209394358fae0258712066c4d417503a1c7d467eb4a55706a3628bbc9c199c8fe8454d11bb9300b585d23ea02ed701a820d0f72c3a5c0e984ee9e5e86318cf6bcf1180170a484a576750a36d3a3ec24b81b16a0fc75adb90990c77ae8ce6a239533a0732b45b3341343364c1b0a0bf8e5fc342c8892270c932971ff7cf19dd4b73844185915a6e5b22a0b779ed805194c9593ed456419dcd1b67447dfcb09b342ced21449b9e1542a95d8fd7998e00077edf8ae3eec342bc72b7787e5929b4652d0fa462f211aaf31b584e85cb604be2ab6f9f0d4b663b8e3671b3602d18c231fb1419fbb0d5c448a25fce60e5252e5a5dc790e000c5048b76988f32475faa4815598a8672a39cec134be4283533d93c86a86917e56567512464d55509d387b2a229ca90159a5c7fc0999bd1fc01db1081d66c95472674f41c6d6ac45ada8fa14112c3fd03d96fcb43657e87648cf92cb467c4bc626e2f33a02597c39aaea18882b6911a87de7e4f75c71acda31fdd3894122c87490bdc7c955a9dba4e670d257e91c40608992c17ae3e5ef8a78b1b71c6d2964ded9e81d82ecf8cfe3979fd550803ac33665b7b7c0421482905c2a640914f81defa09b2fd1c8dbfc538e9ec473685462968ee2a76733a4650450806b943690dc056a3e928102e62a95194cbec13c1c0817050c40518e12b9939f2012c43c43ce8242808934c4be4e050366ac0f97f630c2f977762f439e3c8c2658e5093748c4d9d041a637a0a85708a5f69b53c6a96e69f55d6c7d17cfa951147077527eeceda06695c58b21b82b67c8ed511ccd040c9a6177aa912ae7f752a64548e822818aa540d1f82062a970e4b3ab557420ec31f9382bb4d8895e4aa08d747ac8da75dcb6e4755984c4255ef08568816f774b0258b3f79bc738a0caa082609a398a139f2673abefca59ccd5ac600a0428baed34bd84d9b784c4bcb803d96a86337f9ecb3de64e0d5a6f9d5b2e2379f2a3ea82bcc1cc9a4b37cf97ffe25db81efccac93dd706317d245ceb77aaf433b2404d8eb51bf09e09c78adc2248695d1a461d40eefa4878a03300b5e5a683e11f50d6d15e9717cd34d8770089e9b5a3eaecf56de5e8f164291eb3fac13e26cf130c0c62082b3ee1455af50ad212737974435e78972f11cd587c07cc7ea24a6f3aa382375152a83191fb40780a56d43fed559e88fd9e15eb781db1a2b85e748d6659bf0971b2745e531e53d9a34c82d5ad9261f04e00292a2c15dd0423454624d34f427dc7480f5814e86ac82f7c101e014238ca1cdd84d918c6a1d9deaabfe5b2881f8e39536aeff8af171a06da130b8807f69ae243cb0ad29429f98c8fe6cfa9c076f72af35a8a18c8d7c953f20dc83c7f98029e8dd83473a4c8f77e9af0cc02ed643a173776d9acb7025f72a40c51ec25301d122c021b9428d4a8be54cc7081fb932c6cc9ffd69e69a105924ab708e1f32254a658b9280f918b80a439257449726566064630389b456aa4be15d0b0ef86aee0f72579e4a6748f78c5b72e14a61969d5ee344b098c0bfb674ae4170b8008adcc08ac8197af012570cd7679b6c872cca65ad24f40ad8fde0036d6d2953e405b4b81aec8fe5f26baef852f521d94ddded9d1291fab3e2f1f2fd275ef4bf21ace4e61cd8cbacc392a6c06e29d28e3bc5d6d65458e247420242ba964be407f16926cd51daf5b67aac4a5bc2ef1a5c722305bc744422a41f4fddcbc8a4c7ee3a5e5a980c1a6964c21d4400a70650a3a6c576a5c924bb300fe47b282d584e452c07339e073ffcf6811f8ceb7b7c1441f50e2e6336b9d9a4b1a478113db3e21b588b8f13580d91cee9f6d2585ae1e86d8c8e59edfd2983cae5f97ca80c3faaad7091a6b9c8814ed9e5ae34331b9f0d47ae6f6e0ccf74325d3226ba3d68c4e5739043d15c410148897e03a4c8d47cc070120a58c963de934184fd4f9bd503d579916ac173dde7d18476bb4bd07d4ac8e96dfc7437fb1e3dc1e4533f0b6692eff866b685f1852f7ffbf2ae2019ee923d797a32669682031ab53e3c57110acbdb088aef9f82d8a3b908c25a9bda7da060cd0be8569b442bef9f02cf1a41c97d100fd088c87660d3a0de2f840b795aed760c83ebce161606f1a2091982ae49940a36e4884f0dd990e0324b5cd204332b846e2dea877074f7b4b4a6c4a6098219c467baa7778876fcd52ab1ca743183c52609cca21fc8b55bbe1dd9565c69a3f576459c14d3015f39788f4ea8a1d0612275b366467fdefd608e6ba0748e3a4313f12782f695fd09f3bd3f2e1b1faef10a82d064730e429da5a24ff5c37b6b6e0986f01fc10e85340f6b04947f60ae6ecc6fa1d79bb361e05723854bb0d01ac26534739c06fea3848628c351881688fd82a8fd009ca37ffc5cdefc6707c3e10dcc25276a50f8ce16e6277d5943d506cb689675e7aeb0e9775428f60e417d1c4542e9829beb29b22dbe240ec5cb015c412ae3c74e3a7dfec142e2c0c7b4473f0bee1b1dc1e9565c3800c71857c2b1cd6ebc41e33a976e85d9057681ad4c5e50add5d6cbdf0435fbe593ae660c2427b9ee6b909daeba520a2b8e1cc6ebf4fa4ee83e746670efbb76e745522fc4014331064e28f717bd1ce930e72031a927089a8ebf8dbd6627b835ef7774d13d58fdd3fd4494a6e46cffbc193c679a2b527b9b00c3ceb16aba988fe067c0242467cd93df9fb862262181a223b7f2c73b48693995e6f532cbb42545a68eeab263b7050674958684ba326700a63c51ac307846b79536ce33d7229a4bd02180eae702c98a5b3a7959f6acbe716220f5a86b8c46297343fa183d0cb3a1a3e3e24e66de6b3d68da27b78576b85159c09fce7289bfbce34cfd6404081a67e5c6f28fa4420b2b33328ba39372ab5a8aa5fb27606bc758384ed701ff83c0fb2e4879be8d015206e3a7189a9841dbde58abe96762e39cc0a713c9638b4bacd66a4235620229e43efe040890febaf7790f19f179af80ee24e8d023fdedf3148f7e1b069a7ede31ec29560becdf24a2abab0cc5368582493b23f1587c372c8538e92e535ebbe8fa73ac20a6a0c93e5969b827f6737564682bcd4abb84d0efe2c8c032d9252e22e6f17caf6a15e520c9a2f9a51a1fea042731830b9c3ca53bb129d1b53f27b0a12f8b130de612bbd514bcce13f1279660f440aca7f28aecc44c47d856dd80b0deae205c47da81fc983964bf0989cba8c9edba8a363073adab7e325b9dac56bc37e5317c63bbe8b98c3fe668773e5a1baf818f66373068b901da3a414f653ecbb24cab9a85fd770f1a11cdd0d75e84ee3f22edba93f96bb337984829cd4b6829cd931bbcd5375804fdd655cdee93aa6631f9ff2b1f4eb1e5dff05c545ee705983abfec33242a10cdebf6d5c911a894a579f5063c43be06bbb2b67624ae902973fe6b07b2edaf5b7a2daf4a378c462666fefd3b1b9ffb649c62e6da6d0c3a35aef4a09632b7dc316e929129a4c265baee137b66163c42a295e53a27ecb33e21f4cd1235f18b8cb29655b246dfe143ba26ab59ff5d1ac9f227b114cd93d0632fa5bbd8caeebd6ac54c2d90d1496b49ad248b84441e21d828b0992d7c57930a68dc0932935a134d91100da224a76c2cf687b69b5ae4fffeb72699776394feb98d8edc02d2d848e7b757d07e3fe4eb3833f590e9b0f1ec8240c5d93cc52ab25e524eda99fb774922fdfc56191549a12061c1af075f53c613adb111deb9b785516805229a3b41cde2d3b3d1b767ac9909a3bc4238ba69c55228aa0457fe7b38208bbdf753b947694828f3d16598c3a9706f745872d9ce7b4c8898b440c99e185ac8db6680dbbb29d25022a93fd5d8bb98d7efcb81ebc7c70c7edb63f90d3bbb8ed4319787b5738c20b7501bec8d97964d5e82fcb2c6ca61f904c165296a00bfd14767a4f779cf29622d8d1bf29a91544f8d3ca8b286b4a9ffc786bd85cce2a0ade7d3f491896af57c1b22144623f32bb59eca872a960336bf0d25fe2a5e7b070bfd893fc715efc5be49eefb98e539aaab059aed227db8f719a72434fc01761e6ad067e0f202c72d0921385929aabb5070f75146d4c88411753d891ca9456eee3203ea69090f76887fb403bb8cfa202fe9267bbbd8e7e13d42e2d3f3b7825644232539e39ec4a591ff6c83493182a41c7ddb89d844abcdd8468010fbbccbede504e31942fe2511ae804d7b8fdf0b85ff4ed07de98fad90b94c2e37944737d1dbc41e3990bb3bb8b537be79b51a06ef3ceb7bb59480ea51912a8dac763d0e24fa6a4ce70d4e24733242f476842225711736f564913a9691960d5f0ad512b80adeb44681b503461f0139f369489da0427132ccb947afc99a2a5b006be98bf1bf9ee1aef88e3fe06e4b9e18e35d283df391ef98ee88ab84457fa74f06d442f146fdd5a4403fac43be0e4550b5b43c84efbf7a2748584af707351f1ef51222c5d09523ce2ccf2fee4db20e5fec98167eba2b80855717965c76dc19cb33edec85fa39951d2a7146ca8c7cdab9abe74acb20c1b13334337a90699ae8646283c9e96fa59859a55228bf9a8870c36a0910722ce1dee6616772d991bd8decc6c415dcd4d37e75a519def85b94682ddeef8539f910b919ce4c16d46bb60659fdb4f0e11f53de68a76b009d2ed7d8538cdf07231896e622e1a8b00f54904cc6f20c1ec4839866b88dc28c7388c755b0a58e23651b3d1ce085d88646b0710fbaffdb5959a8e5388ca360fb0fdda5e0238d756f5f5cb91af69e5e9afa899404de547a9b7c2590bcb3c05018c4c80499126916e2d0f6d1c4f207276337e32f5362f0ef99eebcf740544d9c00ee80ea99dd9aae37e40975010854c829cc979f2cfc9d5a253a5674a56690e3066c9fa6fbf9416c29c28b8052fddc84d9d69bc72aa258edf0505a99e93fcd55069bbaabdb8e120c1d34b0ca7218e73a022a9c26f687122739036048384de7fd89733c6f1415ccf7009498b5a4de553b483d3436dcfcd250968e3c80bc5a11506f7d03782afe0e48661c84357d8c2dd1fc759525f7a1a80dd346b93ee33b526567c41da09f94f02ccce18451d5426944c88eaccd8474a4b11bbf21b526dc8ecb30903323316a07631128b680afec1a9f2400671ff745a903fcb8c7407c1894894fc0cae758abf57a5cb89872186e42845b5f69b4f573019054746080d12938d399a64c7cc16e1bf7adaa72d646a1d4f785228161462a08e71fab62c84dd9c99e5fc45d18567647a9c89b5fd9a0929945bf5d49d50a63f61971263a45255ca99ab447f5e348b515a25289a953ec813e89c1b69d1329d78b6f6e702c45221e3713066ad22ba70fde00cbc46521106baee69258f3df20d8936e3b4de2cb7e70c3c824c8119ed0b63fac29774b24a9e319cbe1ec922c7e18a0a3cc58b8b2b223a9e3f20a6b577826940abce6dad8f467fc9187b300823b57a9234b968d804dcea80d26391720fd45582dc1be011b390a757a8c8a4c83696fc41859a46efbbf8a30adee59481d3c31782a6888fc13a0476010604cec3c70f20d955b0e8cae6f8d0b678181447d11798e9b5dabc1c7ab88545d345e6f1f182c8308532a333933a8d21f4e640628ff32195aeaf8adff31560fc7e68cb6b183627311cbedd03258aef3a30c712b92f0266b233de40a517f2b13fc5a0e6aea12bc435eede24c8caaf7e4ec971cd951181f36857e1c4c78ed8d43e5380ce88dcf5eb9221eef013dd0d3e2af7b66aa650d1b0e2746ce96e04ae6b3186c51b22c240b3be458ca4538bb1cc890fb6cbf02ce20b9a0f478072db03a079026a467478b1125c7169c97eee394a2688719ad9e293dfbd1bd7a0e96a5d18bc554ef602b483310408c764367ccf323f48cd7f9ab6e8f725333b19a66a1431a9881f36c359059cc1125cd31d1953bbc64572177a725b07c78a89c67f11d019fdd387cf4ec30ee8318dcd76a99cade0d0c45a9cbd10fd93688f34a17f5b8999a2a6c5e6198f74e0b4d0013ecf84c8e28b3eb7775058eeaab7c32160aa0f18b8c33eaeef60f3697dc62434e60d99faa3628b3a94d0f0d85715c383fef38216bb06ef34300408bd73279aa27a0c9aa1549a63388e32d89d61afaa0901c126bc8ef786bdf082c238ab1fd84d0cc9b485b0b796cdc17e1b7d16300060a481f6c5b99551092fda0786eaa9702f1e7bcffe03a5a36422341535f148ac007a3ab8c891eb363d54cd9dd39178da932f25816a0a474e96b7c77ef18b88604c55992a2c99c2f5f09004fa9fbf53bd45085c45be40c8872cf3399df238e21bb8b304c03208409eea94bbdde75f4b969af38d7216532a7035b1b47800b732e9fb40b4fcae45101f9432e965414e9f74ec1e122f2b0616d69383831420a0239d2acc4efb4e07f387a257d21118d9e52131f46fc4a9dcb965e46d112772dd5418be938aaf6c0ec67c9ac27137af60a38177c42a85a4a6135e4534647aa28fd55bc3bba0a613d88a72455ce08dff531b031f0d5c9ff8e069d19217678e817edca92e9b726047665b40cc021801c4eb719d1f51659b3292d2f724e4d1fa99bb481295472c2057f3cc1b2ecfedf59338a2f7fede8128f53d5f87953090b2c7823b47c9f53e93ce0a0eca7c4d0227cba983f5a20ae210321b20c2f4b9a97dda5238268322c5d18ad608c088e51a6cb14fc3be9dab5d80a55af0181b4e95c9394acdac928cbe79f304ca0037ce4b8c0a1e43ff8e54ad8b4e6b97c13accd31640e5d44b8d3302f364bb14d7637986c56a7893d67a3f96f8ae3d2d05b6c5b965a04661c5119080c4c507f0b07d9de283bebc378650c367c24d2658652012515eb75038740ba97954f29cde1978d30297aafa06f2d20ab72d485b96ef2b135b324a64e28f147c9866e6153e84529c4a220d4c90e2fccef893e39b12788625eb01dbacec409bcc038b320c0e80053489ac76a04ec39191500607c1b01049a3561c1f9652906bb28b6bd0ab6cb10436e21dfe546388e6c79c89b2587696736b4a4c591bb6b5567a916cc297fce14235c27ba0d4b9fb7168e6fea995fc71ced97a7a07be3109d429745d3b2167ef7bdf98e50dcc0e70d8eb5449fa1bf4fc4da340abcb189732127b4dcc2a73290a7656eb91cb0893cef64eec483e6639e0e416b3f5fd0708404353698e4531e4746a9726cfed18ac1bc7819bb16d6308dba9eb7716d0661172eea4f44942b266c0c50de7ba1df2d3757685d82b3fe605a27bda547b187f5af0ae0d678fb27089748c7b2d4646c8b1a629fee0c9df95e212c3b053b2383cbd6c85d4b065b6995735566420a8ee17db532a60c34c072d14c111a8e36c741081e2ccd3b2ad18faac5400e9d5c3411740e3268b4449c0a84a0b24310da871dd315ad3beac036e0b6e74c51361131f58ba7cd186d5b437d0c55a07abe61b01553a92c2d3eb01d5587f61d3f2ef9482f61e4d1efede76d4340d87b0fcc9d7421267f14a22cca6ff5bbb889c99df49f24dcc0a8d4c1f72607337949f75a74e81b35b38b4e5da4de598cebf9dab3c7129bdef825fd1c4b4f8468b8ac0810f14d4c07e9e965c0c6317000b1f5f1bbf5ca3c9771b33278dae93483ce9243794e62036dd1f5bd3102a889afc922e6e512bd235a70eb2809ded3005a07478aaecc17002dba479371de6bdd8332c2ccc073aab89e83af8b8c8e0c0b6cab14e1a33b9f69c85e3e9c22b1ac0de924570309273fa30e242f35d131d8e1f8c51d11d7b5e6b0baefffaaff96020620556faf460954223720d04fea71bd015cfb8bd144970791c9b82fdab2263513f03d4c26ad3e5dbb004bf5b63163e3204a9d0dd0a5d0284e4566be9258b96a5a0164e39bfdcc2b58f76d4112dc52d7812c58c9a47e73fef65a45bb898fba8d7fcb8ac1d266593e9b0c2052f46d2d3e2dfd6dc2fe1d656d28a3f04c01d003ad9656c5100b603f819f9ba32eda9dc1643c6cd983283534208d3a4447850abe58d22f971298dc0a5f8fcaf71e534ff4c7d70a783ee30c57032b86a4b9205f3000c61ffebe0c2cdcedd5b02ca80c3b1f5d301c482fce2f83a5cbe317b9ae0466105aa993188faaea171db0c5410e0b468d82b6d4d183b860f1787ab6cca3f567f2f29c179c1e538c4757f825369b411196ce827a6c0b094a29243ae57017ad2db6204609d5f2b4092296f55e27d55801d2c965003a50af84619f93e957365c3fb6518c9b18e070f8186316404", "0x3a65787472696e7369635f696e646578": "0x00000000", - "0x3a6772616e6470615f617574686f726974696573": "0x0110c8caee6f6eddc41c6cc55e554343392cbc13d2a8a57b97f6f85fc965bdd20ce801000000000000008270a62b61639ee56113834aecec01de6cda91413a5111b89f74d6585da34f5001000000000000004c669b04865e9acaf7b72bdfcb0099d70d9ec63c8c2d6b8cb0552815d7b50a0a0100000000000000c9a68a26e9aa37ba6334f1a20275e3be7d3a9d4aa988627eadac8ea0d0a2dfbf0100000000000000", + "0x3a6772616e6470615f617574686f726974696573": "0x0138c8caee6f6eddc41c6cc55e554343392cbc13d2a8a57b97f6f85fc965bdd20ce8010000000000000083f43ee3e4521b55de0fe830847fda88a6b017b87979af1a41b180c39da1e4b001000000000000005fafb6219eb8d463bec0370b2aab69f45fc780959fc2eddbc7703760aa34202201000000000000008270a62b61639ee56113834aecec01de6cda91413a5111b89f74d6585da34f500100000000000000622c382187c0b2c61ecfb17443294d11a9d2ab770ae6f1fb49184a43906d59fe01000000000000006e309dfa4c8de814cad140b8612a9e41bfba244f9ab1468e1b5d9b3cc1f5e56501000000000000000509f9caf32fda5584343c473b386c433acb99fd9400724b8cf3c618d840133f01000000000000004c669b04865e9acaf7b72bdfcb0099d70d9ec63c8c2d6b8cb0552815d7b50a0a0100000000000000e41426f7465c13c48335771c5450bf61c50a9cf28b9274f170c7421eea7974f10100000000000000ace46e899b90e75199549d8fa2ae7097e896ab3c845217e3155f99b6ffb888030100000000000000c9a68a26e9aa37ba6334f1a20275e3be7d3a9d4aa988627eadac8ea0d0a2dfbf01000000000000006e60f1e253735fb113c183fa603f591e4456435171f387c0849001b428b5ccb10100000000000000c8de3a01502422b59dfa601c9c3a04a98d2bfbd79dd0810d1d1250feab4241ee010000000000000064adb43a7628139f6c02100f6a5465dbd33422418426c572b12547c5a665008c0100000000000000", "0x3d9cad2baf702e20b136f4c8900cd8024e7b9012096b41c4eb3aaf947f6ea429": "0x0200", "0x3db7a24cfdc9de785974746c14a99df94e7b9012096b41c4eb3aaf947f6ea429": "0x0400", "0x3f1467a096bcd71a5b6a0c8155e208104e7b9012096b41c4eb3aaf947f6ea429": "0x0000", "0x3fba98689ebed1138735e0e7a5a790ab4e7b9012096b41c4eb3aaf947f6ea429": "0x0100", "0x42b50b77ef717947e7043bb52127d6654e7b9012096b41c4eb3aaf947f6ea429": "0x0000", "0x47c9410b11325752265d54845357656f4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x4da2c41eaffa8e1a791c5d65beeefd1f028685274e698e781f7f2766cba0cc8300000000": "0x1003000000010000000000000002000000abc3f086f5ac20eaab792c75933b2e196307835a61a955be82aa63bc0ff9617a0600000010ea9400f05e7fb75a3f7a92febbf58e5a3060dd06132ed6d5d68a3d75ec452826ad90a2c3fa2c756f974628dd279adb87935f7ea509856276e3b86f759b22451c161d0af40e6efc165c17d0189bd2d770bdfa0a9b8393cb89113f473a2e948c682253ee3c02d89582602ca5b0570cfc01dc82cc8d1b9d2071eb5db6318749124b000000000000000000000000000000000000000100000000000000", + "0x4da2c41eaffa8e1a791c5d65beeefd1f028685274e698e781f7f2766cba0cc8300000000": "0x380a000000030000000400000002000000070000000b000000050000000c0000000000000009000000060000000d0000000100000008000000abc3f086f5ac20eaab792c75933b2e196307835a61a955be82aa63bc0ff9617a0600000038ea9400f05e7fb75a3f7a92febbf58e5a3060dd06132ed6d5d68a3d75ec452826ad90a2c3fa2c756f974628dd279adb87935f7ea509856276e3b86f759b22451c303094c583e253794c9db14803585baaa74472f4ecba846defefc8aecfb6214ac45a6d0878f808b1baaa85dcfb4e930ae06e3205bb38855527aee6f259e3327b2253ee3c02d89582602ca5b0570cfc01dc82cc8d1b9d2071eb5db6318749124b02683131f96baec9121383995904c49a02ce2c2451f8038291e5db2dce66663e0a988fb965b156a07debf072fd9d34a9c7c0fc0e0ff5bd63ef766afb76e2b32890032c39c968f486f77f8764301a8479206f063d49eeb9f6d499333e2a1be045161d0af40e6efc165c17d0189bd2d770bdfa0a9b8393cb89113f473a2e948c680ce84accce1ced0de223aa72f760f1b3d13ddfd267938cd63e25308378d320084e1a59090261a7e6bd82544df1eebd96dc87b4eb1211346645fa44d6b932960b441629077e228528f91ca7dc17051bb437408a5ae272d0950e58961846a8fc2ed0d052eca7d732d9f560ba970ca48f67387b899e76958ea6ed342a3a553ef0229e065eea4143325fbbd26967c26a228d51a3a8384062f7434973f15d1da2c010000000000000000000000000000000000000000100000000000000", "0x4da2c41eaffa8e1a791c5d65beeefd1f4e5747352ae927817a9171156fb3da7f00000000": "0x00", "0x4da2c41eaffa8e1a791c5d65beeefd1f4e7b9012096b41c4eb3aaf947f6ea429": "0x0100", "0x4da2c41eaffa8e1a791c5d65beeefd1f5762b52ec4f696c1235b20491a567f8500000000": "0x00", @@ -90,43 +109,113 @@ "0x5f27b51b5ec208ee9cb25b55d8728243308ce9615de0775a82f8a94dc3d285a1": "0x01", "0x5f27b51b5ec208ee9cb25b55d87282434e7b9012096b41c4eb3aaf947f6ea429": "0x0000", "0x5f3e4907f716ac89b6347d15ececedca0b6a45321efae92aea15e0740ec7afe7": "0x00000000", - "0x5f3e4907f716ac89b6347d15ececedca138e71612491192d68deab7e6f563fe1": "0x04000000", + "0x5f3e4907f716ac89b6347d15ececedca138e71612491192d68deab7e6f563fe1": "0x0e000000", "0x5f3e4907f716ac89b6347d15ececedca28dccb559b95c40168a1b2696581b5a7": "0x00000000000000000000000000000000", + "0x5f3e4907f716ac89b6347d15ececedca3ed14b45ed20d054f05e37e2542cfe700afd9ad680e7563894c4156ed6a101ae478a3de3ba70a05fce8a3d67be6fb85f33bfcf2777ab6b10": "0x94c4156ed6a101ae478a3de3ba70a05fce8a3d67be6fb85f33bfcf2777ab6b10", "0x5f3e4907f716ac89b6347d15ececedca3ed14b45ed20d054f05e37e2542cfe700e8cb253c2fa33f382c3105dbd4bb206428d8a8b7ea1f19965a0668dd583b06c3b75daa181fe654c": "0x82c3105dbd4bb206428d8a8b7ea1f19965a0668dd583b06c3b75daa181fe654c", + "0x5f3e4907f716ac89b6347d15ececedca3ed14b45ed20d054f05e37e2542cfe701887a9d70c3dff6e6ed774481ff68097867271bc8ecaeee3500817ccefdfda74ceeafd32a2259627": "0x6ed774481ff68097867271bc8ecaeee3500817ccefdfda74ceeafd32a2259627", + "0x5f3e4907f716ac89b6347d15ececedca3ed14b45ed20d054f05e37e2542cfe70198703ff0791c2de1e30aa51ad68b8918d2c46e914986818c111bee03582610cbc9fb73fe0e4c413": "0x1e30aa51ad68b8918d2c46e914986818c111bee03582610cbc9fb73fe0e4c413", + "0x5f3e4907f716ac89b6347d15ececedca3ed14b45ed20d054f05e37e2542cfe70260868bcb77241070efe248e3ddcfcb4f29675b70fc0a8e2db66b65381c45d299427b60d05f76108": "0x0efe248e3ddcfcb4f29675b70fc0a8e2db66b65381c45d299427b60d05f76108", "0x5f3e4907f716ac89b6347d15ececedca3ed14b45ed20d054f05e37e2542cfe70572aae990801cce1043393e76c137dfdc403a6fd9a2d6129d470d51c5a67bd40517378030c87170d": "0x043393e76c137dfdc403a6fd9a2d6129d470d51c5a67bd40517378030c87170d", + "0x5f3e4907f716ac89b6347d15ececedca3ed14b45ed20d054f05e37e2542cfe7065903e26e594bcd6d41a8a9678862ebe9d1a1d59cac1c8430ef31e282f9cb391cf6f2b4d9ce2fd3d": "0xd41a8a9678862ebe9d1a1d59cac1c8430ef31e282f9cb391cf6f2b4d9ce2fd3d", + "0x5f3e4907f716ac89b6347d15ececedca3ed14b45ed20d054f05e37e2542cfe70a8a26ecf38bdcfc668728d12a90fb1a9f5b0f0b2814d730401d314964113554e66ff19e7067d7c69": "0x68728d12a90fb1a9f5b0f0b2814d730401d314964113554e66ff19e7067d7c69", + "0x5f3e4907f716ac89b6347d15ececedca3ed14b45ed20d054f05e37e2542cfe70ab8d3e1fa99ea7e2d0b4896a63b672a7a74f5234bf9ec8567ff3c5bb8f93795e15e2c498b48d327c": "0xd0b4896a63b672a7a74f5234bf9ec8567ff3c5bb8f93795e15e2c498b48d327c", "0x5f3e4907f716ac89b6347d15ececedca3ed14b45ed20d054f05e37e2542cfe70d12736684524574c32eebacd223f4aef33d98a667a68f9e371f40384257c6d31030952b9d94e1152": "0x32eebacd223f4aef33d98a667a68f9e371f40384257c6d31030952b9d94e1152", + "0x5f3e4907f716ac89b6347d15ececedca3ed14b45ed20d054f05e37e2542cfe70d30ebbc69dfd05038eef6710734f5d1e7d2eb303fa8f04e9bef65fb680647b24624723f95b868964": "0x8eef6710734f5d1e7d2eb303fa8f04e9bef65fb680647b24624723f95b868964", "0x5f3e4907f716ac89b6347d15ececedca3ed14b45ed20d054f05e37e2542cfe70deca1f47c95ad9e99492b8c38442c79061bdbb8d38dcd28138938a7fd476edf89ecdec06a5a9d20f": "0x9492b8c38442c79061bdbb8d38dcd28138938a7fd476edf89ecdec06a5a9d20f", + "0x5f3e4907f716ac89b6347d15ececedca3ed14b45ed20d054f05e37e2542cfe70e7e316712ac574569037d1020ed699c2f538d3ffcf0eb98087ee11ca4bd07bfddb0d68633806af74": "0x9037d1020ed699c2f538d3ffcf0eb98087ee11ca4bd07bfddb0d68633806af74", + "0x5f3e4907f716ac89b6347d15ececedca3ed14b45ed20d054f05e37e2542cfe70eec11b5fca7cddef5270ec35ba01254d8bff046a1a58f16d3ae615c235efd6e99a35f233b2d9df2c": "0x5270ec35ba01254d8bff046a1a58f16d3ae615c235efd6e99a35f233b2d9df2c", + "0x5f3e4907f716ac89b6347d15ececedca422adb579f1dbf4f3886c5cfa3bb8cc402d496d20c019d22397accfc42b7635d94c4156ed6a101ae478a3de3ba70a05fce8a3d67be6fb85f33bfcf2777ab6b10": "0x94c4156ed6a101ae478a3de3ba70a05fce8a3d67be6fb85f33bfcf2777ab6b100f0080c6a47e8d030f0080c6a47e8d030000", "0x5f3e4907f716ac89b6347d15ececedca422adb579f1dbf4f3886c5cfa3bb8cc40ffdb9747f7a8bfa200ea2291eea6bdf9492b8c38442c79061bdbb8d38dcd28138938a7fd476edf89ecdec06a5a9d20f": "0x9492b8c38442c79061bdbb8d38dcd28138938a7fd476edf89ecdec06a5a9d20f0f0080c6a47e8d030f0080c6a47e8d030000", + "0x5f3e4907f716ac89b6347d15ececedca422adb579f1dbf4f3886c5cfa3bb8cc411fcf3e922de10898cb04273301735e65270ec35ba01254d8bff046a1a58f16d3ae615c235efd6e99a35f233b2d9df2c": "0x5270ec35ba01254d8bff046a1a58f16d3ae615c235efd6e99a35f233b2d9df2c0f0080c6a47e8d030f0080c6a47e8d030000", + "0x5f3e4907f716ac89b6347d15ececedca422adb579f1dbf4f3886c5cfa3bb8cc415fbc5d9b44885a2dce0fbaa3834ba211e30aa51ad68b8918d2c46e914986818c111bee03582610cbc9fb73fe0e4c413": "0x1e30aa51ad68b8918d2c46e914986818c111bee03582610cbc9fb73fe0e4c4130f0080c6a47e8d030f0080c6a47e8d030000", + "0x5f3e4907f716ac89b6347d15ececedca422adb579f1dbf4f3886c5cfa3bb8cc4279effc2672354478fb5e3f7e65726b668728d12a90fb1a9f5b0f0b2814d730401d314964113554e66ff19e7067d7c69": "0x68728d12a90fb1a9f5b0f0b2814d730401d314964113554e66ff19e7067d7c690f0080c6a47e8d030f0080c6a47e8d030000", + "0x5f3e4907f716ac89b6347d15ececedca422adb579f1dbf4f3886c5cfa3bb8cc42ffe7c0dd7d3d8d8485c403a33fb7adb6ed774481ff68097867271bc8ecaeee3500817ccefdfda74ceeafd32a2259627": "0x6ed774481ff68097867271bc8ecaeee3500817ccefdfda74ceeafd32a22596270f0080c6a47e8d030f0080c6a47e8d030000", + "0x5f3e4907f716ac89b6347d15ececedca422adb579f1dbf4f3886c5cfa3bb8cc4350ea875b4c0459b3527d475e9825c99d41a8a9678862ebe9d1a1d59cac1c8430ef31e282f9cb391cf6f2b4d9ce2fd3d": "0xd41a8a9678862ebe9d1a1d59cac1c8430ef31e282f9cb391cf6f2b4d9ce2fd3d0f0080c6a47e8d030f0080c6a47e8d030000", "0x5f3e4907f716ac89b6347d15ececedca422adb579f1dbf4f3886c5cfa3bb8cc44d176c4abc6d2410c43423c2714b909c32eebacd223f4aef33d98a667a68f9e371f40384257c6d31030952b9d94e1152": "0x32eebacd223f4aef33d98a667a68f9e371f40384257c6d31030952b9d94e11520f0080c6a47e8d030f0080c6a47e8d030000", + "0x5f3e4907f716ac89b6347d15ececedca422adb579f1dbf4f3886c5cfa3bb8cc4585bd5ccc1af6cf60c19d791bb091b750efe248e3ddcfcb4f29675b70fc0a8e2db66b65381c45d299427b60d05f76108": "0x0efe248e3ddcfcb4f29675b70fc0a8e2db66b65381c45d299427b60d05f761080f0080c6a47e8d030f0080c6a47e8d030000", "0x5f3e4907f716ac89b6347d15ececedca422adb579f1dbf4f3886c5cfa3bb8cc465bb58c29c9825c1f6727fe8c41650ac82c3105dbd4bb206428d8a8b7ea1f19965a0668dd583b06c3b75daa181fe654c": "0x82c3105dbd4bb206428d8a8b7ea1f19965a0668dd583b06c3b75daa181fe654c0f0080c6a47e8d030f0080c6a47e8d030000", + "0x5f3e4907f716ac89b6347d15ececedca422adb579f1dbf4f3886c5cfa3bb8cc46deaa967a94fa09152be01a253511479d0b4896a63b672a7a74f5234bf9ec8567ff3c5bb8f93795e15e2c498b48d327c": "0xd0b4896a63b672a7a74f5234bf9ec8567ff3c5bb8f93795e15e2c498b48d327c0f0080c6a47e8d030f0080c6a47e8d030000", "0x5f3e4907f716ac89b6347d15ececedca422adb579f1dbf4f3886c5cfa3bb8cc4829f3f4d6d7c991993e0c044ae97410b043393e76c137dfdc403a6fd9a2d6129d470d51c5a67bd40517378030c87170d": "0x043393e76c137dfdc403a6fd9a2d6129d470d51c5a67bd40517378030c87170d0f0080c6a47e8d030f0080c6a47e8d030000", + "0x5f3e4907f716ac89b6347d15ececedca422adb579f1dbf4f3886c5cfa3bb8cc4ba2db252d1b8c64ec51b04d0f50d7d2b9037d1020ed699c2f538d3ffcf0eb98087ee11ca4bd07bfddb0d68633806af74": "0x9037d1020ed699c2f538d3ffcf0eb98087ee11ca4bd07bfddb0d68633806af740f0080c6a47e8d030f0080c6a47e8d030000", + "0x5f3e4907f716ac89b6347d15ececedca422adb579f1dbf4f3886c5cfa3bb8cc4dfc40f350cc4563ad9ddff5ad92944278eef6710734f5d1e7d2eb303fa8f04e9bef65fb680647b24624723f95b868964": "0x8eef6710734f5d1e7d2eb303fa8f04e9bef65fb680647b24624723f95b8689640f0080c6a47e8d030f0080c6a47e8d030000", + "0x5f3e4907f716ac89b6347d15ececedca42982b9d6c7acc99faa9094c912372c2b4def25cfda6ef3a000000000afd9ad680e7563894c4156ed6a101ae478a3de3ba70a05fce8a3d67be6fb85f33bfcf2777ab6b10": "0x0f0080c6a47e8d030f0080c6a47e8d0300", "0x5f3e4907f716ac89b6347d15ececedca42982b9d6c7acc99faa9094c912372c2b4def25cfda6ef3a000000000e8cb253c2fa33f382c3105dbd4bb206428d8a8b7ea1f19965a0668dd583b06c3b75daa181fe654c": "0x0f0080c6a47e8d030f0080c6a47e8d0300", + "0x5f3e4907f716ac89b6347d15ececedca42982b9d6c7acc99faa9094c912372c2b4def25cfda6ef3a000000001887a9d70c3dff6e6ed774481ff68097867271bc8ecaeee3500817ccefdfda74ceeafd32a2259627": "0x0f0080c6a47e8d030f0080c6a47e8d0300", + "0x5f3e4907f716ac89b6347d15ececedca42982b9d6c7acc99faa9094c912372c2b4def25cfda6ef3a00000000198703ff0791c2de1e30aa51ad68b8918d2c46e914986818c111bee03582610cbc9fb73fe0e4c413": "0x0f0080c6a47e8d030f0080c6a47e8d0300", + "0x5f3e4907f716ac89b6347d15ececedca42982b9d6c7acc99faa9094c912372c2b4def25cfda6ef3a00000000260868bcb77241070efe248e3ddcfcb4f29675b70fc0a8e2db66b65381c45d299427b60d05f76108": "0x0f0080c6a47e8d030f0080c6a47e8d0300", "0x5f3e4907f716ac89b6347d15ececedca42982b9d6c7acc99faa9094c912372c2b4def25cfda6ef3a00000000572aae990801cce1043393e76c137dfdc403a6fd9a2d6129d470d51c5a67bd40517378030c87170d": "0x0f0080c6a47e8d030f0080c6a47e8d0300", + "0x5f3e4907f716ac89b6347d15ececedca42982b9d6c7acc99faa9094c912372c2b4def25cfda6ef3a0000000065903e26e594bcd6d41a8a9678862ebe9d1a1d59cac1c8430ef31e282f9cb391cf6f2b4d9ce2fd3d": "0x0f0080c6a47e8d030f0080c6a47e8d0300", + "0x5f3e4907f716ac89b6347d15ececedca42982b9d6c7acc99faa9094c912372c2b4def25cfda6ef3a00000000a8a26ecf38bdcfc668728d12a90fb1a9f5b0f0b2814d730401d314964113554e66ff19e7067d7c69": "0x0f0080c6a47e8d030f0080c6a47e8d0300", + "0x5f3e4907f716ac89b6347d15ececedca42982b9d6c7acc99faa9094c912372c2b4def25cfda6ef3a00000000ab8d3e1fa99ea7e2d0b4896a63b672a7a74f5234bf9ec8567ff3c5bb8f93795e15e2c498b48d327c": "0x0f0080c6a47e8d030f0080c6a47e8d0300", "0x5f3e4907f716ac89b6347d15ececedca42982b9d6c7acc99faa9094c912372c2b4def25cfda6ef3a00000000d12736684524574c32eebacd223f4aef33d98a667a68f9e371f40384257c6d31030952b9d94e1152": "0x0f0080c6a47e8d030f0080c6a47e8d0300", + "0x5f3e4907f716ac89b6347d15ececedca42982b9d6c7acc99faa9094c912372c2b4def25cfda6ef3a00000000d30ebbc69dfd05038eef6710734f5d1e7d2eb303fa8f04e9bef65fb680647b24624723f95b868964": "0x0f0080c6a47e8d030f0080c6a47e8d0300", "0x5f3e4907f716ac89b6347d15ececedca42982b9d6c7acc99faa9094c912372c2b4def25cfda6ef3a00000000deca1f47c95ad9e99492b8c38442c79061bdbb8d38dcd28138938a7fd476edf89ecdec06a5a9d20f": "0x0f0080c6a47e8d030f0080c6a47e8d0300", + "0x5f3e4907f716ac89b6347d15ececedca42982b9d6c7acc99faa9094c912372c2b4def25cfda6ef3a00000000e7e316712ac574569037d1020ed699c2f538d3ffcf0eb98087ee11ca4bd07bfddb0d68633806af74": "0x0f0080c6a47e8d030f0080c6a47e8d0300", + "0x5f3e4907f716ac89b6347d15ececedca42982b9d6c7acc99faa9094c912372c2b4def25cfda6ef3a00000000eec11b5fca7cddef5270ec35ba01254d8bff046a1a58f16d3ae615c235efd6e99a35f233b2d9df2c": "0x0f0080c6a47e8d030f0080c6a47e8d0300", "0x5f3e4907f716ac89b6347d15ececedca487df464e44a534ba6b0cbb32407b587": "0x0000000000", "0x5f3e4907f716ac89b6347d15ececedca4e7b9012096b41c4eb3aaf947f6ea429": "0x0d00", - "0x5f3e4907f716ac89b6347d15ececedca5579297f4dfb9609e7e4c2ebab9ce40a": "0x10043393e76c137dfdc403a6fd9a2d6129d470d51c5a67bd40517378030c87170d82c3105dbd4bb206428d8a8b7ea1f19965a0668dd583b06c3b75daa181fe654c32eebacd223f4aef33d98a667a68f9e371f40384257c6d31030952b9d94e11529492b8c38442c79061bdbb8d38dcd28138938a7fd476edf89ecdec06a5a9d20f", + "0x5f3e4907f716ac89b6347d15ececedca5579297f4dfb9609e7e4c2ebab9ce40a": "0x3894c4156ed6a101ae478a3de3ba70a05fce8a3d67be6fb85f33bfcf2777ab6b1082c3105dbd4bb206428d8a8b7ea1f19965a0668dd583b06c3b75daa181fe654c6ed774481ff68097867271bc8ecaeee3500817ccefdfda74ceeafd32a22596271e30aa51ad68b8918d2c46e914986818c111bee03582610cbc9fb73fe0e4c4130efe248e3ddcfcb4f29675b70fc0a8e2db66b65381c45d299427b60d05f76108043393e76c137dfdc403a6fd9a2d6129d470d51c5a67bd40517378030c87170dd41a8a9678862ebe9d1a1d59cac1c8430ef31e282f9cb391cf6f2b4d9ce2fd3d68728d12a90fb1a9f5b0f0b2814d730401d314964113554e66ff19e7067d7c69d0b4896a63b672a7a74f5234bf9ec8567ff3c5bb8f93795e15e2c498b48d327c32eebacd223f4aef33d98a667a68f9e371f40384257c6d31030952b9d94e11528eef6710734f5d1e7d2eb303fa8f04e9bef65fb680647b24624723f95b8689649492b8c38442c79061bdbb8d38dcd28138938a7fd476edf89ecdec06a5a9d20f9037d1020ed699c2f538d3ffcf0eb98087ee11ca4bd07bfddb0d68633806af745270ec35ba01254d8bff046a1a58f16d3ae615c235efd6e99a35f233b2d9df2c", "0x5f3e4907f716ac89b6347d15ececedca666fdcbb473985b3ac933d13f4acff8d": "0x0080c6a47e8d03000000000000000000", + "0x5f3e4907f716ac89b6347d15ececedca682db92dde20a10d96d00ff0e9e221c0b4def25cfda6ef3a000000000afd9ad680e7563894c4156ed6a101ae478a3de3ba70a05fce8a3d67be6fb85f33bfcf2777ab6b10": "0x0000", "0x5f3e4907f716ac89b6347d15ececedca682db92dde20a10d96d00ff0e9e221c0b4def25cfda6ef3a000000000e8cb253c2fa33f382c3105dbd4bb206428d8a8b7ea1f19965a0668dd583b06c3b75daa181fe654c": "0x0000", + "0x5f3e4907f716ac89b6347d15ececedca682db92dde20a10d96d00ff0e9e221c0b4def25cfda6ef3a000000001887a9d70c3dff6e6ed774481ff68097867271bc8ecaeee3500817ccefdfda74ceeafd32a2259627": "0x0000", + "0x5f3e4907f716ac89b6347d15ececedca682db92dde20a10d96d00ff0e9e221c0b4def25cfda6ef3a00000000198703ff0791c2de1e30aa51ad68b8918d2c46e914986818c111bee03582610cbc9fb73fe0e4c413": "0x0000", + "0x5f3e4907f716ac89b6347d15ececedca682db92dde20a10d96d00ff0e9e221c0b4def25cfda6ef3a00000000260868bcb77241070efe248e3ddcfcb4f29675b70fc0a8e2db66b65381c45d299427b60d05f76108": "0x0000", "0x5f3e4907f716ac89b6347d15ececedca682db92dde20a10d96d00ff0e9e221c0b4def25cfda6ef3a00000000572aae990801cce1043393e76c137dfdc403a6fd9a2d6129d470d51c5a67bd40517378030c87170d": "0x0000", + "0x5f3e4907f716ac89b6347d15ececedca682db92dde20a10d96d00ff0e9e221c0b4def25cfda6ef3a0000000065903e26e594bcd6d41a8a9678862ebe9d1a1d59cac1c8430ef31e282f9cb391cf6f2b4d9ce2fd3d": "0x0000", + "0x5f3e4907f716ac89b6347d15ececedca682db92dde20a10d96d00ff0e9e221c0b4def25cfda6ef3a00000000a8a26ecf38bdcfc668728d12a90fb1a9f5b0f0b2814d730401d314964113554e66ff19e7067d7c69": "0x0000", + "0x5f3e4907f716ac89b6347d15ececedca682db92dde20a10d96d00ff0e9e221c0b4def25cfda6ef3a00000000ab8d3e1fa99ea7e2d0b4896a63b672a7a74f5234bf9ec8567ff3c5bb8f93795e15e2c498b48d327c": "0x0000", "0x5f3e4907f716ac89b6347d15ececedca682db92dde20a10d96d00ff0e9e221c0b4def25cfda6ef3a00000000d12736684524574c32eebacd223f4aef33d98a667a68f9e371f40384257c6d31030952b9d94e1152": "0x0000", + "0x5f3e4907f716ac89b6347d15ececedca682db92dde20a10d96d00ff0e9e221c0b4def25cfda6ef3a00000000d30ebbc69dfd05038eef6710734f5d1e7d2eb303fa8f04e9bef65fb680647b24624723f95b868964": "0x0000", "0x5f3e4907f716ac89b6347d15ececedca682db92dde20a10d96d00ff0e9e221c0b4def25cfda6ef3a00000000deca1f47c95ad9e99492b8c38442c79061bdbb8d38dcd28138938a7fd476edf89ecdec06a5a9d20f": "0x0000", - "0x5f3e4907f716ac89b6347d15ececedca6ddc7809c6da9bb6093ee22e0fda4ba8": "0x04000000", + "0x5f3e4907f716ac89b6347d15ececedca682db92dde20a10d96d00ff0e9e221c0b4def25cfda6ef3a00000000e7e316712ac574569037d1020ed699c2f538d3ffcf0eb98087ee11ca4bd07bfddb0d68633806af74": "0x0000", + "0x5f3e4907f716ac89b6347d15ececedca682db92dde20a10d96d00ff0e9e221c0b4def25cfda6ef3a00000000eec11b5fca7cddef5270ec35ba01254d8bff046a1a58f16d3ae615c235efd6e99a35f233b2d9df2c": "0x0000", + "0x5f3e4907f716ac89b6347d15ececedca6ddc7809c6da9bb6093ee22e0fda4ba8": "0x0e000000", + "0x5f3e4907f716ac89b6347d15ececedca88dcde934c658227ee1dfafcd6e169030afd9ad680e7563894c4156ed6a101ae478a3de3ba70a05fce8a3d67be6fb85f33bfcf2777ab6b10": "0x0000", "0x5f3e4907f716ac89b6347d15ececedca88dcde934c658227ee1dfafcd6e169030e8cb253c2fa33f382c3105dbd4bb206428d8a8b7ea1f19965a0668dd583b06c3b75daa181fe654c": "0x0000", + "0x5f3e4907f716ac89b6347d15ececedca88dcde934c658227ee1dfafcd6e169031887a9d70c3dff6e6ed774481ff68097867271bc8ecaeee3500817ccefdfda74ceeafd32a2259627": "0x0000", + "0x5f3e4907f716ac89b6347d15ececedca88dcde934c658227ee1dfafcd6e16903198703ff0791c2de1e30aa51ad68b8918d2c46e914986818c111bee03582610cbc9fb73fe0e4c413": "0x0000", + "0x5f3e4907f716ac89b6347d15ececedca88dcde934c658227ee1dfafcd6e16903260868bcb77241070efe248e3ddcfcb4f29675b70fc0a8e2db66b65381c45d299427b60d05f76108": "0x0000", "0x5f3e4907f716ac89b6347d15ececedca88dcde934c658227ee1dfafcd6e16903572aae990801cce1043393e76c137dfdc403a6fd9a2d6129d470d51c5a67bd40517378030c87170d": "0x0000", + "0x5f3e4907f716ac89b6347d15ececedca88dcde934c658227ee1dfafcd6e1690365903e26e594bcd6d41a8a9678862ebe9d1a1d59cac1c8430ef31e282f9cb391cf6f2b4d9ce2fd3d": "0x0000", + "0x5f3e4907f716ac89b6347d15ececedca88dcde934c658227ee1dfafcd6e16903a8a26ecf38bdcfc668728d12a90fb1a9f5b0f0b2814d730401d314964113554e66ff19e7067d7c69": "0x0000", + "0x5f3e4907f716ac89b6347d15ececedca88dcde934c658227ee1dfafcd6e16903ab8d3e1fa99ea7e2d0b4896a63b672a7a74f5234bf9ec8567ff3c5bb8f93795e15e2c498b48d327c": "0x0000", "0x5f3e4907f716ac89b6347d15ececedca88dcde934c658227ee1dfafcd6e16903d12736684524574c32eebacd223f4aef33d98a667a68f9e371f40384257c6d31030952b9d94e1152": "0x0000", + "0x5f3e4907f716ac89b6347d15ececedca88dcde934c658227ee1dfafcd6e16903d30ebbc69dfd05038eef6710734f5d1e7d2eb303fa8f04e9bef65fb680647b24624723f95b868964": "0x0000", "0x5f3e4907f716ac89b6347d15ececedca88dcde934c658227ee1dfafcd6e16903deca1f47c95ad9e99492b8c38442c79061bdbb8d38dcd28138938a7fd476edf89ecdec06a5a9d20f": "0x0000", + "0x5f3e4907f716ac89b6347d15ececedca88dcde934c658227ee1dfafcd6e16903e7e316712ac574569037d1020ed699c2f538d3ffcf0eb98087ee11ca4bd07bfddb0d68633806af74": "0x0000", + "0x5f3e4907f716ac89b6347d15ececedca88dcde934c658227ee1dfafcd6e16903eec11b5fca7cddef5270ec35ba01254d8bff046a1a58f16d3ae615c235efd6e99a35f233b2d9df2c": "0x0000", + "0x5f3e4907f716ac89b6347d15ececedca8bde0a0ea8864605e3b68ed9cb2da01bb4def25cfda6ef3a000000000afd9ad680e7563894c4156ed6a101ae478a3de3ba70a05fce8a3d67be6fb85f33bfcf2777ab6b10": "0x0f0080c6a47e8d030f0080c6a47e8d0300", "0x5f3e4907f716ac89b6347d15ececedca8bde0a0ea8864605e3b68ed9cb2da01bb4def25cfda6ef3a000000000e8cb253c2fa33f382c3105dbd4bb206428d8a8b7ea1f19965a0668dd583b06c3b75daa181fe654c": "0x0f0080c6a47e8d030f0080c6a47e8d0300", + "0x5f3e4907f716ac89b6347d15ececedca8bde0a0ea8864605e3b68ed9cb2da01bb4def25cfda6ef3a000000001887a9d70c3dff6e6ed774481ff68097867271bc8ecaeee3500817ccefdfda74ceeafd32a2259627": "0x0f0080c6a47e8d030f0080c6a47e8d0300", + "0x5f3e4907f716ac89b6347d15ececedca8bde0a0ea8864605e3b68ed9cb2da01bb4def25cfda6ef3a00000000198703ff0791c2de1e30aa51ad68b8918d2c46e914986818c111bee03582610cbc9fb73fe0e4c413": "0x0f0080c6a47e8d030f0080c6a47e8d0300", + "0x5f3e4907f716ac89b6347d15ececedca8bde0a0ea8864605e3b68ed9cb2da01bb4def25cfda6ef3a00000000260868bcb77241070efe248e3ddcfcb4f29675b70fc0a8e2db66b65381c45d299427b60d05f76108": "0x0f0080c6a47e8d030f0080c6a47e8d0300", "0x5f3e4907f716ac89b6347d15ececedca8bde0a0ea8864605e3b68ed9cb2da01bb4def25cfda6ef3a00000000572aae990801cce1043393e76c137dfdc403a6fd9a2d6129d470d51c5a67bd40517378030c87170d": "0x0f0080c6a47e8d030f0080c6a47e8d0300", + "0x5f3e4907f716ac89b6347d15ececedca8bde0a0ea8864605e3b68ed9cb2da01bb4def25cfda6ef3a0000000065903e26e594bcd6d41a8a9678862ebe9d1a1d59cac1c8430ef31e282f9cb391cf6f2b4d9ce2fd3d": "0x0f0080c6a47e8d030f0080c6a47e8d0300", + "0x5f3e4907f716ac89b6347d15ececedca8bde0a0ea8864605e3b68ed9cb2da01bb4def25cfda6ef3a00000000a8a26ecf38bdcfc668728d12a90fb1a9f5b0f0b2814d730401d314964113554e66ff19e7067d7c69": "0x0f0080c6a47e8d030f0080c6a47e8d0300", + "0x5f3e4907f716ac89b6347d15ececedca8bde0a0ea8864605e3b68ed9cb2da01bb4def25cfda6ef3a00000000ab8d3e1fa99ea7e2d0b4896a63b672a7a74f5234bf9ec8567ff3c5bb8f93795e15e2c498b48d327c": "0x0f0080c6a47e8d030f0080c6a47e8d0300", "0x5f3e4907f716ac89b6347d15ececedca8bde0a0ea8864605e3b68ed9cb2da01bb4def25cfda6ef3a00000000d12736684524574c32eebacd223f4aef33d98a667a68f9e371f40384257c6d31030952b9d94e1152": "0x0f0080c6a47e8d030f0080c6a47e8d0300", + "0x5f3e4907f716ac89b6347d15ececedca8bde0a0ea8864605e3b68ed9cb2da01bb4def25cfda6ef3a00000000d30ebbc69dfd05038eef6710734f5d1e7d2eb303fa8f04e9bef65fb680647b24624723f95b868964": "0x0f0080c6a47e8d030f0080c6a47e8d0300", "0x5f3e4907f716ac89b6347d15ececedca8bde0a0ea8864605e3b68ed9cb2da01bb4def25cfda6ef3a00000000deca1f47c95ad9e99492b8c38442c79061bdbb8d38dcd28138938a7fd476edf89ecdec06a5a9d20f": "0x0f0080c6a47e8d030f0080c6a47e8d0300", + "0x5f3e4907f716ac89b6347d15ececedca8bde0a0ea8864605e3b68ed9cb2da01bb4def25cfda6ef3a00000000e7e316712ac574569037d1020ed699c2f538d3ffcf0eb98087ee11ca4bd07bfddb0d68633806af74": "0x0f0080c6a47e8d030f0080c6a47e8d0300", + "0x5f3e4907f716ac89b6347d15ececedca8bde0a0ea8864605e3b68ed9cb2da01bb4def25cfda6ef3a00000000eec11b5fca7cddef5270ec35ba01254d8bff046a1a58f16d3ae615c235efd6e99a35f233b2d9df2c": "0x0f0080c6a47e8d030f0080c6a47e8d0300", + "0x5f3e4907f716ac89b6347d15ececedca9220e172bed316605f73f1ff7b4ade980afd9ad680e7563894c4156ed6a101ae478a3de3ba70a05fce8a3d67be6fb85f33bfcf2777ab6b10": "0x00", "0x5f3e4907f716ac89b6347d15ececedca9220e172bed316605f73f1ff7b4ade980e8cb253c2fa33f382c3105dbd4bb206428d8a8b7ea1f19965a0668dd583b06c3b75daa181fe654c": "0x00", + "0x5f3e4907f716ac89b6347d15ececedca9220e172bed316605f73f1ff7b4ade981887a9d70c3dff6e6ed774481ff68097867271bc8ecaeee3500817ccefdfda74ceeafd32a2259627": "0x00", + "0x5f3e4907f716ac89b6347d15ececedca9220e172bed316605f73f1ff7b4ade98198703ff0791c2de1e30aa51ad68b8918d2c46e914986818c111bee03582610cbc9fb73fe0e4c413": "0x00", + "0x5f3e4907f716ac89b6347d15ececedca9220e172bed316605f73f1ff7b4ade98260868bcb77241070efe248e3ddcfcb4f29675b70fc0a8e2db66b65381c45d299427b60d05f76108": "0x00", "0x5f3e4907f716ac89b6347d15ececedca9220e172bed316605f73f1ff7b4ade98572aae990801cce1043393e76c137dfdc403a6fd9a2d6129d470d51c5a67bd40517378030c87170d": "0x00", + "0x5f3e4907f716ac89b6347d15ececedca9220e172bed316605f73f1ff7b4ade9865903e26e594bcd6d41a8a9678862ebe9d1a1d59cac1c8430ef31e282f9cb391cf6f2b4d9ce2fd3d": "0x00", + "0x5f3e4907f716ac89b6347d15ececedca9220e172bed316605f73f1ff7b4ade98a8a26ecf38bdcfc668728d12a90fb1a9f5b0f0b2814d730401d314964113554e66ff19e7067d7c69": "0x00", + "0x5f3e4907f716ac89b6347d15ececedca9220e172bed316605f73f1ff7b4ade98ab8d3e1fa99ea7e2d0b4896a63b672a7a74f5234bf9ec8567ff3c5bb8f93795e15e2c498b48d327c": "0x00", "0x5f3e4907f716ac89b6347d15ececedca9220e172bed316605f73f1ff7b4ade98d12736684524574c32eebacd223f4aef33d98a667a68f9e371f40384257c6d31030952b9d94e1152": "0x00", + "0x5f3e4907f716ac89b6347d15ececedca9220e172bed316605f73f1ff7b4ade98d30ebbc69dfd05038eef6710734f5d1e7d2eb303fa8f04e9bef65fb680647b24624723f95b868964": "0x00", "0x5f3e4907f716ac89b6347d15ececedca9220e172bed316605f73f1ff7b4ade98deca1f47c95ad9e99492b8c38442c79061bdbb8d38dcd28138938a7fd476edf89ecdec06a5a9d20f": "0x00", + "0x5f3e4907f716ac89b6347d15ececedca9220e172bed316605f73f1ff7b4ade98e7e316712ac574569037d1020ed699c2f538d3ffcf0eb98087ee11ca4bd07bfddb0d68633806af74": "0x00", + "0x5f3e4907f716ac89b6347d15ececedca9220e172bed316605f73f1ff7b4ade98eec11b5fca7cddef5270ec35ba01254d8bff046a1a58f16d3ae615c235efd6e99a35f233b2d9df2c": "0x00", "0x5f3e4907f716ac89b6347d15ececedca98c2640cda6c0d801194a8a61c699224": "0xc8000000", - "0x5f3e4907f716ac89b6347d15ececedcaa141c4fe67c2d11f4a10c6aca7a79a04b4def25cfda6ef3a00000000": "0x00001a93fa350e000000000000000000", + "0x5f3e4907f716ac89b6347d15ececedcaa141c4fe67c2d11f4a10c6aca7a79a04b4def25cfda6ef3a00000000": "0x0000db02edbc31000000000000000000", "0x5f3e4907f716ac89b6347d15ececedcaad811cd65a470ddc5f1d628ff0550982b4def25cfda6ef3a00000000": "0x00000000", "0x5f3e4907f716ac89b6347d15ececedcab49a2738eeb30896aacb8b3fb46471bd": "0x02000000", "0x5f3e4907f716ac89b6347d15ececedcac0d39ff577af2cc6b67ac3641fa9c4e7": "0x01000000", @@ -145,18 +234,29 @@ "0x6ac983d82528bf1595ab26438ae5b2cf4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", "0x7474449cca95dc5d0c00e71735a6d17d4e7b9012096b41c4eb3aaf947f6ea429": "0x0100", "0x74dd702da46f77d7acf77f5a48d4af7d4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x74dd702da46f77d7acf77f5a48d4af7d62556a85fcb7c61b2c6c750924846b150e8cb253c2fa33f382c3105dbd4bb206428d8a8b7ea1f19965a0668dd583b06c3b75daa181fe654c": "0x82c3105dbd4bb206428d8a8b7ea1f19965a0668dd583b06c3b75daa181fe654c01043393e76c137dfdc403a6fd9a2d6129d470d51c5a67bd40517378030c87170d0132eebacd223f4aef33d98a667a68f9e371f40384257c6d31030952b9d94e115261c091f7b7cb03000080c6a47e8d0300", - "0x74dd702da46f77d7acf77f5a48d4af7d62556a85fcb7c61b2c6c750924846b15572aae990801cce1043393e76c137dfdc403a6fd9a2d6129d470d51c5a67bd40517378030c87170d": "0x043393e76c137dfdc403a6fd9a2d6129d470d51c5a67bd40517378030c87170d000182c3105dbd4bb206428d8a8b7ea1f19965a0668dd583b06c3b75daa181fe654c61c091f7b7cb03000080c6a47e8d0300", - "0x74dd702da46f77d7acf77f5a48d4af7d62556a85fcb7c61b2c6c750924846b15d12736684524574c32eebacd223f4aef33d98a667a68f9e371f40384257c6d31030952b9d94e1152": "0x32eebacd223f4aef33d98a667a68f9e371f40384257c6d31030952b9d94e11520182c3105dbd4bb206428d8a8b7ea1f19965a0668dd583b06c3b75daa181fe654c019492b8c38442c79061bdbb8d38dcd28138938a7fd476edf89ecdec06a5a9d20f61c091f7b7cb03000080c6a47e8d0300", - "0x74dd702da46f77d7acf77f5a48d4af7d62556a85fcb7c61b2c6c750924846b15deca1f47c95ad9e99492b8c38442c79061bdbb8d38dcd28138938a7fd476edf89ecdec06a5a9d20f": "0x9492b8c38442c79061bdbb8d38dcd28138938a7fd476edf89ecdec06a5a9d20f0132eebacd223f4aef33d98a667a68f9e371f40384257c6d31030952b9d94e11520061c091f7b7cb03000080c6a47e8d0300", - "0x74dd702da46f77d7acf77f5a48d4af7d7a6dc62e324093ba1331bf49fdb2f24a": "0x04000000", - "0x74dd702da46f77d7acf77f5a48d4af7de5c03730c8f59f00941607850b6633d80863c87cd8a129fa61c091f7b7cb0300": "0x01043393e76c137dfdc403a6fd9a2d6129d470d51c5a67bd40517378030c87170d019492b8c38442c79061bdbb8d38dcd28138938a7fd476edf89ecdec06a5a9d20f", + "0x74dd702da46f77d7acf77f5a48d4af7d62556a85fcb7c61b2c6c750924846b150afd9ad680e7563894c4156ed6a101ae478a3de3ba70a05fce8a3d67be6fb85f33bfcf2777ab6b10": "0x94c4156ed6a101ae478a3de3ba70a05fce8a3d67be6fb85f33bfcf2777ab6b10000182c3105dbd4bb206428d8a8b7ea1f19965a0668dd583b06c3b75daa181fe654c61c091f7b7cb03000080c6a47e8d0300", + "0x74dd702da46f77d7acf77f5a48d4af7d62556a85fcb7c61b2c6c750924846b150e8cb253c2fa33f382c3105dbd4bb206428d8a8b7ea1f19965a0668dd583b06c3b75daa181fe654c": "0x82c3105dbd4bb206428d8a8b7ea1f19965a0668dd583b06c3b75daa181fe654c0194c4156ed6a101ae478a3de3ba70a05fce8a3d67be6fb85f33bfcf2777ab6b10016ed774481ff68097867271bc8ecaeee3500817ccefdfda74ceeafd32a225962761c091f7b7cb03000080c6a47e8d0300", + "0x74dd702da46f77d7acf77f5a48d4af7d62556a85fcb7c61b2c6c750924846b151887a9d70c3dff6e6ed774481ff68097867271bc8ecaeee3500817ccefdfda74ceeafd32a2259627": "0x6ed774481ff68097867271bc8ecaeee3500817ccefdfda74ceeafd32a22596270182c3105dbd4bb206428d8a8b7ea1f19965a0668dd583b06c3b75daa181fe654c011e30aa51ad68b8918d2c46e914986818c111bee03582610cbc9fb73fe0e4c41361c091f7b7cb03000080c6a47e8d0300", + "0x74dd702da46f77d7acf77f5a48d4af7d62556a85fcb7c61b2c6c750924846b15198703ff0791c2de1e30aa51ad68b8918d2c46e914986818c111bee03582610cbc9fb73fe0e4c413": "0x1e30aa51ad68b8918d2c46e914986818c111bee03582610cbc9fb73fe0e4c413016ed774481ff68097867271bc8ecaeee3500817ccefdfda74ceeafd32a2259627010efe248e3ddcfcb4f29675b70fc0a8e2db66b65381c45d299427b60d05f7610861c091f7b7cb03000080c6a47e8d0300", + "0x74dd702da46f77d7acf77f5a48d4af7d62556a85fcb7c61b2c6c750924846b15260868bcb77241070efe248e3ddcfcb4f29675b70fc0a8e2db66b65381c45d299427b60d05f76108": "0x0efe248e3ddcfcb4f29675b70fc0a8e2db66b65381c45d299427b60d05f76108011e30aa51ad68b8918d2c46e914986818c111bee03582610cbc9fb73fe0e4c41301043393e76c137dfdc403a6fd9a2d6129d470d51c5a67bd40517378030c87170d61c091f7b7cb03000080c6a47e8d0300", + "0x74dd702da46f77d7acf77f5a48d4af7d62556a85fcb7c61b2c6c750924846b15572aae990801cce1043393e76c137dfdc403a6fd9a2d6129d470d51c5a67bd40517378030c87170d": "0x043393e76c137dfdc403a6fd9a2d6129d470d51c5a67bd40517378030c87170d010efe248e3ddcfcb4f29675b70fc0a8e2db66b65381c45d299427b60d05f7610801d41a8a9678862ebe9d1a1d59cac1c8430ef31e282f9cb391cf6f2b4d9ce2fd3d61c091f7b7cb03000080c6a47e8d0300", + "0x74dd702da46f77d7acf77f5a48d4af7d62556a85fcb7c61b2c6c750924846b1565903e26e594bcd6d41a8a9678862ebe9d1a1d59cac1c8430ef31e282f9cb391cf6f2b4d9ce2fd3d": "0xd41a8a9678862ebe9d1a1d59cac1c8430ef31e282f9cb391cf6f2b4d9ce2fd3d01043393e76c137dfdc403a6fd9a2d6129d470d51c5a67bd40517378030c87170d0168728d12a90fb1a9f5b0f0b2814d730401d314964113554e66ff19e7067d7c6961c091f7b7cb03000080c6a47e8d0300", + "0x74dd702da46f77d7acf77f5a48d4af7d62556a85fcb7c61b2c6c750924846b15a8a26ecf38bdcfc668728d12a90fb1a9f5b0f0b2814d730401d314964113554e66ff19e7067d7c69": "0x68728d12a90fb1a9f5b0f0b2814d730401d314964113554e66ff19e7067d7c6901d41a8a9678862ebe9d1a1d59cac1c8430ef31e282f9cb391cf6f2b4d9ce2fd3d01d0b4896a63b672a7a74f5234bf9ec8567ff3c5bb8f93795e15e2c498b48d327c61c091f7b7cb03000080c6a47e8d0300", + "0x74dd702da46f77d7acf77f5a48d4af7d62556a85fcb7c61b2c6c750924846b15ab8d3e1fa99ea7e2d0b4896a63b672a7a74f5234bf9ec8567ff3c5bb8f93795e15e2c498b48d327c": "0xd0b4896a63b672a7a74f5234bf9ec8567ff3c5bb8f93795e15e2c498b48d327c0168728d12a90fb1a9f5b0f0b2814d730401d314964113554e66ff19e7067d7c690132eebacd223f4aef33d98a667a68f9e371f40384257c6d31030952b9d94e115261c091f7b7cb03000080c6a47e8d0300", + "0x74dd702da46f77d7acf77f5a48d4af7d62556a85fcb7c61b2c6c750924846b15d12736684524574c32eebacd223f4aef33d98a667a68f9e371f40384257c6d31030952b9d94e1152": "0x32eebacd223f4aef33d98a667a68f9e371f40384257c6d31030952b9d94e115201d0b4896a63b672a7a74f5234bf9ec8567ff3c5bb8f93795e15e2c498b48d327c018eef6710734f5d1e7d2eb303fa8f04e9bef65fb680647b24624723f95b86896461c091f7b7cb03000080c6a47e8d0300", + "0x74dd702da46f77d7acf77f5a48d4af7d62556a85fcb7c61b2c6c750924846b15d30ebbc69dfd05038eef6710734f5d1e7d2eb303fa8f04e9bef65fb680647b24624723f95b868964": "0x8eef6710734f5d1e7d2eb303fa8f04e9bef65fb680647b24624723f95b8689640132eebacd223f4aef33d98a667a68f9e371f40384257c6d31030952b9d94e1152019492b8c38442c79061bdbb8d38dcd28138938a7fd476edf89ecdec06a5a9d20f61c091f7b7cb03000080c6a47e8d0300", + "0x74dd702da46f77d7acf77f5a48d4af7d62556a85fcb7c61b2c6c750924846b15deca1f47c95ad9e99492b8c38442c79061bdbb8d38dcd28138938a7fd476edf89ecdec06a5a9d20f": "0x9492b8c38442c79061bdbb8d38dcd28138938a7fd476edf89ecdec06a5a9d20f018eef6710734f5d1e7d2eb303fa8f04e9bef65fb680647b24624723f95b868964019037d1020ed699c2f538d3ffcf0eb98087ee11ca4bd07bfddb0d68633806af7461c091f7b7cb03000080c6a47e8d0300", + "0x74dd702da46f77d7acf77f5a48d4af7d62556a85fcb7c61b2c6c750924846b15e7e316712ac574569037d1020ed699c2f538d3ffcf0eb98087ee11ca4bd07bfddb0d68633806af74": "0x9037d1020ed699c2f538d3ffcf0eb98087ee11ca4bd07bfddb0d68633806af74019492b8c38442c79061bdbb8d38dcd28138938a7fd476edf89ecdec06a5a9d20f015270ec35ba01254d8bff046a1a58f16d3ae615c235efd6e99a35f233b2d9df2c61c091f7b7cb03000080c6a47e8d0300", + "0x74dd702da46f77d7acf77f5a48d4af7d62556a85fcb7c61b2c6c750924846b15eec11b5fca7cddef5270ec35ba01254d8bff046a1a58f16d3ae615c235efd6e99a35f233b2d9df2c": "0x5270ec35ba01254d8bff046a1a58f16d3ae615c235efd6e99a35f233b2d9df2c019037d1020ed699c2f538d3ffcf0eb98087ee11ca4bd07bfddb0d68633806af740061c091f7b7cb03000080c6a47e8d0300", + "0x74dd702da46f77d7acf77f5a48d4af7d7a6dc62e324093ba1331bf49fdb2f24a": "0x0e000000", + "0x74dd702da46f77d7acf77f5a48d4af7de5c03730c8f59f00941607850b6633d80863c87cd8a129fa61c091f7b7cb0300": "0x0194c4156ed6a101ae478a3de3ba70a05fce8a3d67be6fb85f33bfcf2777ab6b10015270ec35ba01254d8bff046a1a58f16d3ae615c235efd6e99a35f233b2d9df2c", "0x7a6d38deaa01cb6e76ee69889f1696272be9a4e88368a2188d2b9100a9f3cd43": "0x00000000000000000000000000000000", "0x7a6d38deaa01cb6e76ee69889f16962730256ea2c545a3e5e3744665ffb2ed28": "0x00020000", "0x7a6d38deaa01cb6e76ee69889f1696273f0d64e1907361c689834a9c1cb0fbe0": "0x20000000", "0x7a6d38deaa01cb6e76ee69889f16962749d67997de33812a1cc37310f765b82e": "0x00000000000000000000000000000000", - "0x7a6d38deaa01cb6e76ee69889f1696274e7b9012096b41c4eb3aaf947f6ea429": "0x0500", + "0x7a6d38deaa01cb6e76ee69889f1696274e7b9012096b41c4eb3aaf947f6ea429": "0x0700", "0x7a6d38deaa01cb6e76ee69889f169627ba93302f3b868c50785e6ade45c6a1d8": "0x10000000", + "0x8671567f6bbc0021f6f23105f33002a84e7b9012096b41c4eb3aaf947f6ea429": "0x0000", "0x89d139e01a5eb2256f222e5fc5dbe6b34e7b9012096b41c4eb3aaf947f6ea429": "0x0000", "0x94eadf0156a8ad5156507773d0471e4a16973e1142f5bd30d9464076794007db": "0x00", "0x94eadf0156a8ad5156507773d0471e4a4e7b9012096b41c4eb3aaf947f6ea429": "0x0100", @@ -166,52 +266,147 @@ "0x9c5d795d0297be56027a4b2464e33397f43d6436dec51f09c3b71287a8fc9d48": "0x00000000000000000000000000000000", "0xa0eb495036d368196a2b6c51d9d788814e7b9012096b41c4eb3aaf947f6ea429": "0x0000", "0xa37f719efab16103103a0c8c2c784ce14e7b9012096b41c4eb3aaf947f6ea429": "0x0400", - "0xb341e3a63e58a188839b242d17f8c9f82586833f834350b4d435d5fd269ecc8b": "0x1003000000010000000000000002000000", + "0xa8c65209d47ee80f56b0011e8fd91f504e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0xb341e3a63e58a188839b242d17f8c9f82586833f834350b4d435d5fd269ecc8b": "0x380a000000030000000400000002000000070000000b000000050000000c0000000000000009000000060000000d0000000100000008000000", "0xb341e3a63e58a188839b242d17f8c9f84e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xb341e3a63e58a188839b242d17f8c9f87a50c904b368210021127f9238883a6e": "0x10ea9400f05e7fb75a3f7a92febbf58e5a3060dd06132ed6d5d68a3d75ec452826ad90a2c3fa2c756f974628dd279adb87935f7ea509856276e3b86f759b22451c161d0af40e6efc165c17d0189bd2d770bdfa0a9b8393cb89113f473a2e948c682253ee3c02d89582602ca5b0570cfc01dc82cc8d1b9d2071eb5db6318749124b", + "0xb341e3a63e58a188839b242d17f8c9f87a50c904b368210021127f9238883a6e": "0x38ea9400f05e7fb75a3f7a92febbf58e5a3060dd06132ed6d5d68a3d75ec452826ad90a2c3fa2c756f974628dd279adb87935f7ea509856276e3b86f759b22451c303094c583e253794c9db14803585baaa74472f4ecba846defefc8aecfb6214ac45a6d0878f808b1baaa85dcfb4e930ae06e3205bb38855527aee6f259e3327b2253ee3c02d89582602ca5b0570cfc01dc82cc8d1b9d2071eb5db6318749124b02683131f96baec9121383995904c49a02ce2c2451f8038291e5db2dce66663e0a988fb965b156a07debf072fd9d34a9c7c0fc0e0ff5bd63ef766afb76e2b32890032c39c968f486f77f8764301a8479206f063d49eeb9f6d499333e2a1be045161d0af40e6efc165c17d0189bd2d770bdfa0a9b8393cb89113f473a2e948c680ce84accce1ced0de223aa72f760f1b3d13ddfd267938cd63e25308378d320084e1a59090261a7e6bd82544df1eebd96dc87b4eb1211346645fa44d6b932960b441629077e228528f91ca7dc17051bb437408a5ae272d0950e58961846a8fc2ed0d052eca7d732d9f560ba970ca48f67387b899e76958ea6ed342a3a553ef0229e065eea4143325fbbd26967c26a228d51a3a8384062f7434973f15d1da2c010", "0xb341e3a63e58a188839b242d17f8c9f89d1fb17def62216d598940d64654f69e": "0x0000000000", "0xb341e3a63e58a188839b242d17f8c9f8b5cab3380174032968897a4c3ce57c0a": "0x00000000", "0xb8753e9383841da95f7b8871e5de32694e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0xc2261276cc9d1f8598ea4b6a74b15c2f218f26c73add634897550b4003b26bc602d496d20c019d22397accfc42b7635d94c4156ed6a101ae478a3de3ba70a05fce8a3d67be6fb85f33bfcf2777ab6b10": "0x047374616b696e67200080c6a47e8d0300000000000000000002", "0xc2261276cc9d1f8598ea4b6a74b15c2f218f26c73add634897550b4003b26bc60ffdb9747f7a8bfa200ea2291eea6bdf9492b8c38442c79061bdbb8d38dcd28138938a7fd476edf89ecdec06a5a9d20f": "0x047374616b696e67200080c6a47e8d0300000000000000000002", + "0xc2261276cc9d1f8598ea4b6a74b15c2f218f26c73add634897550b4003b26bc611fcf3e922de10898cb04273301735e65270ec35ba01254d8bff046a1a58f16d3ae615c235efd6e99a35f233b2d9df2c": "0x047374616b696e67200080c6a47e8d0300000000000000000002", + "0xc2261276cc9d1f8598ea4b6a74b15c2f218f26c73add634897550b4003b26bc615fbc5d9b44885a2dce0fbaa3834ba211e30aa51ad68b8918d2c46e914986818c111bee03582610cbc9fb73fe0e4c413": "0x047374616b696e67200080c6a47e8d0300000000000000000002", + "0xc2261276cc9d1f8598ea4b6a74b15c2f218f26c73add634897550b4003b26bc6279effc2672354478fb5e3f7e65726b668728d12a90fb1a9f5b0f0b2814d730401d314964113554e66ff19e7067d7c69": "0x047374616b696e67200080c6a47e8d0300000000000000000002", + "0xc2261276cc9d1f8598ea4b6a74b15c2f218f26c73add634897550b4003b26bc62ffe7c0dd7d3d8d8485c403a33fb7adb6ed774481ff68097867271bc8ecaeee3500817ccefdfda74ceeafd32a2259627": "0x047374616b696e67200080c6a47e8d0300000000000000000002", + "0xc2261276cc9d1f8598ea4b6a74b15c2f218f26c73add634897550b4003b26bc6350ea875b4c0459b3527d475e9825c99d41a8a9678862ebe9d1a1d59cac1c8430ef31e282f9cb391cf6f2b4d9ce2fd3d": "0x047374616b696e67200080c6a47e8d0300000000000000000002", "0xc2261276cc9d1f8598ea4b6a74b15c2f218f26c73add634897550b4003b26bc64d176c4abc6d2410c43423c2714b909c32eebacd223f4aef33d98a667a68f9e371f40384257c6d31030952b9d94e1152": "0x047374616b696e67200080c6a47e8d0300000000000000000002", + "0xc2261276cc9d1f8598ea4b6a74b15c2f218f26c73add634897550b4003b26bc6585bd5ccc1af6cf60c19d791bb091b750efe248e3ddcfcb4f29675b70fc0a8e2db66b65381c45d299427b60d05f76108": "0x047374616b696e67200080c6a47e8d0300000000000000000002", "0xc2261276cc9d1f8598ea4b6a74b15c2f218f26c73add634897550b4003b26bc665bb58c29c9825c1f6727fe8c41650ac82c3105dbd4bb206428d8a8b7ea1f19965a0668dd583b06c3b75daa181fe654c": "0x047374616b696e67200080c6a47e8d0300000000000000000002", + "0xc2261276cc9d1f8598ea4b6a74b15c2f218f26c73add634897550b4003b26bc66deaa967a94fa09152be01a253511479d0b4896a63b672a7a74f5234bf9ec8567ff3c5bb8f93795e15e2c498b48d327c": "0x047374616b696e67200080c6a47e8d0300000000000000000002", "0xc2261276cc9d1f8598ea4b6a74b15c2f218f26c73add634897550b4003b26bc6829f3f4d6d7c991993e0c044ae97410b043393e76c137dfdc403a6fd9a2d6129d470d51c5a67bd40517378030c87170d": "0x047374616b696e67200080c6a47e8d0300000000000000000002", + "0xc2261276cc9d1f8598ea4b6a74b15c2f218f26c73add634897550b4003b26bc6ba2db252d1b8c64ec51b04d0f50d7d2b9037d1020ed699c2f538d3ffcf0eb98087ee11ca4bd07bfddb0d68633806af74": "0x047374616b696e67200080c6a47e8d0300000000000000000002", + "0xc2261276cc9d1f8598ea4b6a74b15c2f218f26c73add634897550b4003b26bc6dfc40f350cc4563ad9ddff5ad92944278eef6710734f5d1e7d2eb303fa8f04e9bef65fb680647b24624723f95b868964": "0x047374616b696e67200080c6a47e8d0300000000000000000002", "0xc2261276cc9d1f8598ea4b6a74b15c2f4e7b9012096b41c4eb3aaf947f6ea429": "0x0100", - "0xc2261276cc9d1f8598ea4b6a74b15c2f57c875e4cff74148e4628f264b974c80": "0x00e473ba7fd26e0e0000000000000000", + "0xc2261276cc9d1f8598ea4b6a74b15c2f57c875e4cff74148e4628f264b974c80": "0x00e4be87ea9ef50f0000000000000000", "0xca32a41f4b3ed515863dc0a38697f84e4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", "0xcd710b30bd2eab0352ddcc26417aa1944e7b9012096b41c4eb3aaf947f6ea429": "0x0000", "0xcd710b30bd2eab0352ddcc26417aa1949f4993f016e2d2f8e5f43be7bb259486": "0x00", - "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb30e8cb253c2fa33f382c3105dbd4bb206428d8a8b7ea1f19965a0668dd583b06c3b75daa181fe654c": "0x4c669b04865e9acaf7b72bdfcb0099d70d9ec63c8c2d6b8cb0552815d7b50a0afacb2f987caac6c1290a9784b1efdba78343d39aed805addb12945efbe444000ca3c2703db1633a27eff681d979967988c3a6752c669fd41f1abde10f3b054462253ee3c02d89582602ca5b0570cfc01dc82cc8d1b9d2071eb5db6318749124bf0e6c42698fffc28f9fc769fddcdf165af54c171cde43690cc8f73c853de1f0426e2fc857945d01520797a75388c58e710c9fefedd28387af70880f1682be41e", - "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3572aae990801cce1043393e76c137dfdc403a6fd9a2d6129d470d51c5a67bd40517378030c87170d": "0xc8caee6f6eddc41c6cc55e554343392cbc13d2a8a57b97f6f85fc965bdd20ce8b07d600e3487e2712dcc3879c7b17c9b29cd2243b45f0d9343c591b89cf82a650edf2a41cb81178704560b02c35f5e01a5a97a568ebc10c025ade18b6ab2fa1d161d0af40e6efc165c17d0189bd2d770bdfa0a9b8393cb89113f473a2e948c68def964eed9a73f8a6610f1a0373378dca6f277eb7787869ed5841893105ad930f89c97bf5b2c07c05c84eebce4ffc7b28766946c03741fd1a71fdae0942e8768", - "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3d12736684524574c32eebacd223f4aef33d98a667a68f9e371f40384257c6d31030952b9d94e1152": "0x8270a62b61639ee56113834aecec01de6cda91413a5111b89f74d6585da34f5058108e1651614afc6a535c426fc013945e93533faa33819fe4e69423fe32330274bd654c470ed9b94972c1f997593fab7bdd4d6b85e3cf49401265668142584ead90a2c3fa2c756f974628dd279adb87935f7ea509856276e3b86f759b22451cc083b0d0bd7d6ffd14562b4c9e28738b087ccc32262170c633c18359ff84877992cb05c48fc643f057626c669604675c5ad5a836266f260ae7030c6fdc17a543", - "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3deca1f47c95ad9e99492b8c38442c79061bdbb8d38dcd28138938a7fd476edf89ecdec06a5a9d20f": "0xc9a68a26e9aa37ba6334f1a20275e3be7d3a9d4aa988627eadac8ea0d0a2dfbfae240842b74e5dd778972e451558134f434c7a1d8a52bc70519f38054e24553306bd8fd81e50cda2bd67bf6893d921d1aae5cb08409ae43e0bff4d54e1830e58ea9400f05e7fb75a3f7a92febbf58e5a3060dd06132ed6d5d68a3d75ec452826bed3b452f869d187be58a4ba98588611084283810728fa75981e792beaec4151763d070989ead31f265b40cc7a0cd29d47799b766d6a7f084e44c82baedfc01e", + "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb30afd9ad680e7563894c4156ed6a101ae478a3de3ba70a05fce8a3d67be6fb85f33bfcf2777ab6b10": "0x6e60f1e253735fb113c183fa603f591e4456435171f387c0849001b428b5ccb118bd0f67d77f04f1a92400421813d8927fad109b40a8689254a5f0c8b346857cd28145a7cde195a4c834276730d30f074b212a150e770931ee9470e853e7d22402683131f96baec9121383995904c49a02ce2c2451f8038291e5db2dce66663e92ac14f8ad1811cc83861afadf12f3191cca1391f1f3af705977faa2fa2bf46a629f9fd0dd7279c7af7470472d1208a13e33239b484974d47cffce4ad47856440333022898140662dfea847e3cbfe5e989845ac6766e83472f8b0c650d85e77bae", + "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb30e8cb253c2fa33f382c3105dbd4bb206428d8a8b7ea1f19965a0668dd583b06c3b75daa181fe654c": "0x4c669b04865e9acaf7b72bdfcb0099d70d9ec63c8c2d6b8cb0552815d7b50a0afacb2f987caac6c1290a9784b1efdba78343d39aed805addb12945efbe444000ca3c2703db1633a27eff681d979967988c3a6752c669fd41f1abde10f3b054462253ee3c02d89582602ca5b0570cfc01dc82cc8d1b9d2071eb5db6318749124bf0e6c42698fffc28f9fc769fddcdf165af54c171cde43690cc8f73c853de1f0426e2fc857945d01520797a75388c58e710c9fefedd28387af70880f1682be41e02182879ec92e811e2a8cc117f3cde1f61d3cba0093134cfb1ed17a4ef74915d4a", + "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb31887a9d70c3dff6e6ed774481ff68097867271bc8ecaeee3500817ccefdfda74ceeafd32a2259627": "0x0509f9caf32fda5584343c473b386c433acb99fd9400724b8cf3c618d840133fb2efe7e70daf44b3466c63ccbf4487f42c6a9f6fbb7050b849691e36ce92e347bef47a9e4b47ed57461e1d28cac7da327a52ebcd64d74080d31deb3ac7a7645e4e1a59090261a7e6bd82544df1eebd96dc87b4eb1211346645fa44d6b932960be4ca45c68b0248885d190d22068c6628ee2f00d9fa0706d5a5c1c8456369f03eaa3955187f755708cd6a8104314b962ff5043e36efa3ec5d84df40c58b44222102f4f4d0eccb899bf2d611b56e0afec7c740efba404f8d0e82a545f988c45316c4", + "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3198703ff0791c2de1e30aa51ad68b8918d2c46e914986818c111bee03582610cbc9fb73fe0e4c413": "0x5fafb6219eb8d463bec0370b2aab69f45fc780959fc2eddbc7703760aa34202274dacbca0cdb5099afef67e622c147614198e669931cebc605629da332632473b414aa148096a92a1831309f758f944725653363ccbaeb21817b7df5784b8d46c45a6d0878f808b1baaa85dcfb4e930ae06e3205bb38855527aee6f259e3327b2e2f75472708a497d1743f52b04edf26c250d9e6d220f3bae3d176f02f8e586c2ada042fb4bbfd9b6d8c48293ffc4a7722632c843a67e608554c41d06aabc41303a0af06322d100056125fac1df39d161089b07ae279505aae8731c4d110a54ad7", + "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3260868bcb77241070efe248e3ddcfcb4f29675b70fc0a8e2db66b65381c45d299427b60d05f76108": "0x83f43ee3e4521b55de0fe830847fda88a6b017b87979af1a41b180c39da1e4b05440add43e5388a81aef665c9086d386c0be0ce75e4f8a4a3d8168e976ea821f98aab6f52520022d011a6eba2dca1c6327edbbcd753c170dcf0e9118b5f0f25bd0d052eca7d732d9f560ba970ca48f67387b899e76958ea6ed342a3a553ef0223e547f5cc3455a61d0404d7296ceec7375cbe20322109d118c5e725b1a5cbf04cce3ec06252cf7cdad47fe1265047a9bbddb9059ee4bdc6dec83b67249b4a93403f045328f504c13dac9ddd9b1186098aee7c46cb8d55289dbbf2433bab7a26239", + "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3572aae990801cce1043393e76c137dfdc403a6fd9a2d6129d470d51c5a67bd40517378030c87170d": "0xc8caee6f6eddc41c6cc55e554343392cbc13d2a8a57b97f6f85fc965bdd20ce8b07d600e3487e2712dcc3879c7b17c9b29cd2243b45f0d9343c591b89cf82a650edf2a41cb81178704560b02c35f5e01a5a97a568ebc10c025ade18b6ab2fa1d161d0af40e6efc165c17d0189bd2d770bdfa0a9b8393cb89113f473a2e948c68def964eed9a73f8a6610f1a0373378dca6f277eb7787869ed5841893105ad930f89c97bf5b2c07c05c84eebce4ffc7b28766946c03741fd1a71fdae0942e87680325fc2095902f5fe394f244bce38b0dc3d631cbc05f0b64d5620a71bbf2514f0f", + "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb365903e26e594bcd6d41a8a9678862ebe9d1a1d59cac1c8430ef31e282f9cb391cf6f2b4d9ce2fd3d": "0x64adb43a7628139f6c02100f6a5465dbd33422418426c572b12547c5a665008c1ab03b1b3277edfedd24ef3d3359b449b64bd95ed82a04e7f9fbaab7b71dc0152cd12c731d91441f0114b08d314cd3f9a9f7fd0240d467fe54adefbee4d90762441629077e228528f91ca7dc17051bb437408a5ae272d0950e58961846a8fc2ec22ce14ba0e59aa974d4a05c9208ba5ae18674c6a23c9998d91e7d1ebea7e06b9a86227e204a2d003399c2a3b50c2c869c4380c195a014a02f6d2e7048941237029a1eb2e31dcaf468dbb516f9b620fdd7c3f090d58a88e02b51b25255b2182dd1", + "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3a8a26ecf38bdcfc668728d12a90fb1a9f5b0f0b2814d730401d314964113554e66ff19e7067d7c69": "0x6e309dfa4c8de814cad140b8612a9e41bfba244f9ab1468e1b5d9b3cc1f5e565c44b3e8efe854419ccd5801a82ada22d39cfccdbcece382304cdfeac81ebe402a8a03d86e6c0dbe180cadfc7994121f462b28f7a8cb1be7e0e354147624be7340a988fb965b156a07debf072fd9d34a9c7c0fc0e0ff5bd63ef766afb76e2b3289ef622d2467ed115fa0c6c86303e1ef6a08a0609c97e616aa69b026a6d3f2663729053f28155071474b4686323db5f7a318cb3f088b76660cc8ff5e3e11ec32e030e901c390fa37d101ff25d70594acd2df67b4493ee77a73684f25d39313536d7", + "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3ab8d3e1fa99ea7e2d0b4896a63b672a7a74f5234bf9ec8567ff3c5bb8f93795e15e2c498b48d327c": "0xc8de3a01502422b59dfa601c9c3a04a98d2bfbd79dd0810d1d1250feab4241ee6248d87bd2a640ffe26d6b831735887c24e2076a3a0f3a74f7ae7568c27604087c03ca47a3201455f8f89defda4aa909cb1d25dd9ddb7fd62a940606f79b566390032c39c968f486f77f8764301a8479206f063d49eeb9f6d499333e2a1be045165f3b255dc17054e6d4447c4005f689eb5ed2f99fe201f4ff799bf088495850047277f22b9ef92a8b99618f4c86c2412f0e3b08a4f965f842775672043d1e2503586dafcdab3d4647d4dc68732a9cab8aa34c00c5edd04e65d9dd44c2a1fd21e2", + "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3d12736684524574c32eebacd223f4aef33d98a667a68f9e371f40384257c6d31030952b9d94e1152": "0x8270a62b61639ee56113834aecec01de6cda91413a5111b89f74d6585da34f5058108e1651614afc6a535c426fc013945e93533faa33819fe4e69423fe32330274bd654c470ed9b94972c1f997593fab7bdd4d6b85e3cf49401265668142584ead90a2c3fa2c756f974628dd279adb87935f7ea509856276e3b86f759b22451cc083b0d0bd7d6ffd14562b4c9e28738b087ccc32262170c633c18359ff84877992cb05c48fc643f057626c669604675c5ad5a836266f260ae7030c6fdc17a54303aec8e80ea0375f8669d6e55d7abb6a3117678d7bb851a1bd100a01e52a4fed90", + "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3d30ebbc69dfd05038eef6710734f5d1e7d2eb303fa8f04e9bef65fb680647b24624723f95b868964": "0xe41426f7465c13c48335771c5450bf61c50a9cf28b9274f170c7421eea7974f168a9ec74fa35b3425eaf503dd36294ba8e758e7b8084c4d6bfd547f8c6b5827460fcc9d094d21fe17cfb7426501f50cb3d75c4c9395a3140e0f255443f660d3b9e065eea4143325fbbd26967c26a228d51a3a8384062f7434973f15d1da2c01068f7a83678a377701b46a5e6a4637e99868186ff4835fc0e3914cc56a76a360164ffc83f4f86cc595e607a00b977eeb6641e02a4e6e556c24ab163aecd7d146c03e843f200e30bc5b951c73a96d968db1c0cd05e357d910fce159fc59c40e9d6e2", + "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3deca1f47c95ad9e99492b8c38442c79061bdbb8d38dcd28138938a7fd476edf89ecdec06a5a9d20f": "0xc9a68a26e9aa37ba6334f1a20275e3be7d3a9d4aa988627eadac8ea0d0a2dfbfae240842b74e5dd778972e451558134f434c7a1d8a52bc70519f38054e24553306bd8fd81e50cda2bd67bf6893d921d1aae5cb08409ae43e0bff4d54e1830e58ea9400f05e7fb75a3f7a92febbf58e5a3060dd06132ed6d5d68a3d75ec452826bed3b452f869d187be58a4ba98588611084283810728fa75981e792beaec4151763d070989ead31f265b40cc7a0cd29d47799b766d6a7f084e44c82baedfc01e029338ece1c6bc6439dc4d16bfe33f28c9f0af31626bb8142849742b7a624f6807", + "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3e7e316712ac574569037d1020ed699c2f538d3ffcf0eb98087ee11ca4bd07bfddb0d68633806af74": "0xace46e899b90e75199549d8fa2ae7097e896ab3c845217e3155f99b6ffb888037c8348ec95a0faad6a638ef74864761028c53221bde07e9ff7c81a3f427abf3f30c40adee5476157ef3c2a26e10cab95ec7d54b62dd220738f5a474d5f86874e0ce84accce1ced0de223aa72f760f1b3d13ddfd267938cd63e25308378d32008eed33645cda7812cd343bbaef9131b2794812f2fd37701ccb6cddf9c1e293d387aeb767131602e6612e607a9eb8e26b4ce4fa4765593d032bc923ce8acadda420203d51bba2124f480e3507eb1764fc3019ac7abae8ee215683a285078bda7f51d", + "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3eec11b5fca7cddef5270ec35ba01254d8bff046a1a58f16d3ae615c235efd6e99a35f233b2d9df2c": "0x622c382187c0b2c61ecfb17443294d11a9d2ab770ae6f1fb49184a43906d59fe50412bd7d3f1075e8f8e3b682d05ea20b391c287d8c849a0e49a78f568553e6994848b8cf2cbc9e6fd72db8d80676591b5be4d1ec68972ada48cf6fd01228712303094c583e253794c9db14803585baaa74472f4ecba846defefc8aecfb6214ab400c4164d016282b202c1d42d9dc8ede28cbe4b751d463bab5f23fef42b295a8c15606f4c121376097ff0e96c2a33ea7b024d812b42fe2c741c8b8cee17e63d03d46c454f9b620603feef8c3a2a5d7098205b8566500fda0fa0b456d6ded54538", "0xcec5070d609dd3497f72bde07fc96ba04e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19500ad445de53dc0cfe6175646980729053f28155071474b4686323db5f7a318cb3f088b76660cc8ff5e3e11ec32e": "0x68728d12a90fb1a9f5b0f0b2814d730401d314964113554e66ff19e7067d7c69", "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19501153f927dde4f0796173676e80f0e6c42698fffc28f9fc769fddcdf165af54c171cde43690cc8f73c853de1f04": "0x82c3105dbd4bb206428d8a8b7ea1f19965a0668dd583b06c3b75daa181fe654c", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195012ba4e8c9e90550f6173676e80b400c4164d016282b202c1d42d9dc8ede28cbe4b751d463bab5f23fef42b295a": "0x5270ec35ba01254d8bff046a1a58f16d3ae615c235efd6e99a35f233b2d9df2c", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195016108068be661c046772616e806e309dfa4c8de814cad140b8612a9e41bfba244f9ab1468e1b5d9b3cc1f5e565": "0x68728d12a90fb1a9f5b0f0b2814d730401d314964113554e66ff19e7067d7c69", "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195016d5d491326e20327061726180ea9400f05e7fb75a3f7a92febbf58e5a3060dd06132ed6d5d68a3d75ec452826": "0x9492b8c38442c79061bdbb8d38dcd28138938a7fd476edf89ecdec06a5a9d20f", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950172bf7b1d4fd362d62616265806248d87bd2a640ffe26d6b831735887c24e2076a3a0f3a74f7ae7568c2760408": "0xd0b4896a63b672a7a74f5234bf9ec8567ff3c5bb8f93795e15e2c498b48d327c", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19501aeb8a0909a0259a696d6f6e8098aab6f52520022d011a6eba2dca1c6327edbbcd753c170dcf0e9118b5f0f25b": "0x0efe248e3ddcfcb4f29675b70fc0a8e2db66b65381c45d299427b60d05f76108", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950206946fcbcbb55c06772616e800509f9caf32fda5584343c473b386c433acb99fd9400724b8cf3c618d840133f": "0x6ed774481ff68097867271bc8ecaeee3500817ccefdfda74ceeafd32a2259627", "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195022df7698c94798dc6261626580facb2f987caac6c1290a9784b1efdba78343d39aed805addb12945efbe444000": "0x82c3105dbd4bb206428d8a8b7ea1f19965a0668dd583b06c3b75daa181fe654c", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19502bf84b6fe354ffa4696d6f6e80bef47a9e4b47ed57461e1d28cac7da327a52ebcd64d74080d31deb3ac7a7645e": "0x6ed774481ff68097867271bc8ecaeee3500817ccefdfda74ceeafd32a2259627", "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19502d8e55cbf27bd5fa6175646980763d070989ead31f265b40cc7a0cd29d47799b766d6a7f084e44c82baedfc01e": "0x9492b8c38442c79061bdbb8d38dcd28138938a7fd476edf89ecdec06a5a9d20f", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195033918a92ec5a0337626162658068a9ec74fa35b3425eaf503dd36294ba8e758e7b8084c4d6bfd547f8c6b58274": "0x8eef6710734f5d1e7d2eb303fa8f04e9bef65fb680647b24624723f95b868964", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950365a4d707a6ade5270617261800a988fb965b156a07debf072fd9d34a9c7c0fc0e0ff5bd63ef766afb76e2b328": "0x68728d12a90fb1a9f5b0f0b2814d730401d314964113554e66ff19e7067d7c69", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195036942a186c91d1fb6772616e80e41426f7465c13c48335771c5450bf61c50a9cf28b9274f170c7421eea7974f1": "0x8eef6710734f5d1e7d2eb303fa8f04e9bef65fb680647b24624723f95b868964", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950377ac9e1db771a9a696d6f6e8060fcc9d094d21fe17cfb7426501f50cb3d75c4c9395a3140e0f255443f660d3b": "0x8eef6710734f5d1e7d2eb303fa8f04e9bef65fb680647b24624723f95b868964", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19503a73714b16fa1b3b62616265805440add43e5388a81aef665c9086d386c0be0ce75e4f8a4a3d8168e976ea821f": "0x0efe248e3ddcfcb4f29675b70fc0a8e2db66b65381c45d299427b60d05f76108", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195042faced8513a5a6162656566840325fc2095902f5fe394f244bce38b0dc3d631cbc05f0b64d5620a71bbf2514f0f": "0x043393e76c137dfdc403a6fd9a2d6129d470d51c5a67bd40517378030c87170d", "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195047d6f38d0fa588e4617564698026e2fc857945d01520797a75388c58e710c9fefedd28387af70880f1682be41e": "0x82c3105dbd4bb206428d8a8b7ea1f19965a0668dd583b06c3b75daa181fe654c", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950486e2fc6fe1baf7d62656566840333022898140662dfea847e3cbfe5e989845ac6766e83472f8b0c650d85e77bae": "0x94c4156ed6a101ae478a3de3ba70a05fce8a3d67be6fb85f33bfcf2777ab6b10", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195048ac54571b914843626565668403e843f200e30bc5b951c73a96d968db1c0cd05e357d910fce159fc59c40e9d6e2": "0x8eef6710734f5d1e7d2eb303fa8f04e9bef65fb680647b24624723f95b868964", "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19504d5070934a9a468e6261626580b07d600e3487e2712dcc3879c7b17c9b29cd2243b45f0d9343c591b89cf82a65": "0x043393e76c137dfdc403a6fd9a2d6129d470d51c5a67bd40517378030c87170d", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19504f6e7e79cc9e4f1c6772616e8064adb43a7628139f6c02100f6a5465dbd33422418426c572b12547c5a665008c": "0xd41a8a9678862ebe9d1a1d59cac1c8430ef31e282f9cb391cf6f2b4d9ce2fd3d", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19504fbe8be23f344f7a6173676e809ef622d2467ed115fa0c6c86303e1ef6a08a0609c97e616aa69b026a6d3f2663": "0x68728d12a90fb1a9f5b0f0b2814d730401d314964113554e66ff19e7067d7c69", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19505214a412d15781646173676e8068f7a83678a377701b46a5e6a4637e99868186ff4835fc0e3914cc56a76a3601": "0x8eef6710734f5d1e7d2eb303fa8f04e9bef65fb680647b24624723f95b868964", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950523f922d3cd709c261756469809a86227e204a2d003399c2a3b50c2c869c4380c195a014a02f6d2e7048941237": "0xd41a8a9678862ebe9d1a1d59cac1c8430ef31e282f9cb391cf6f2b4d9ce2fd3d", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195053557db7980560f461756469802ada042fb4bbfd9b6d8c48293ffc4a7722632c843a67e608554c41d06aabc413": "0x1e30aa51ad68b8918d2c46e914986818c111bee03582610cbc9fb73fe0e4c413", "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19505bb3161fb65601ff626162658058108e1651614afc6a535c426fc013945e93533faa33819fe4e69423fe323302": "0x32eebacd223f4aef33d98a667a68f9e371f40384257c6d31030952b9d94e1152", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19505d3dc734864e36256265656684029338ece1c6bc6439dc4d16bfe33f28c9f0af31626bb8142849742b7a624f6807": "0x9492b8c38442c79061bdbb8d38dcd28138938a7fd476edf89ecdec06a5a9d20f", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19505d9ac86ecdf920c170617261804e1a59090261a7e6bd82544df1eebd96dc87b4eb1211346645fa44d6b932960b": "0x6ed774481ff68097867271bc8ecaeee3500817ccefdfda74ceeafd32a2259627", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195062a6c483038fd12d6265656684030e901c390fa37d101ff25d70594acd2df67b4493ee77a73684f25d39313536d7": "0x68728d12a90fb1a9f5b0f0b2814d730401d314964113554e66ff19e7067d7c69", "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195064cc468ab603f8926772616e80c9a68a26e9aa37ba6334f1a20275e3be7d3a9d4aa988627eadac8ea0d0a2dfbf": "0x9492b8c38442c79061bdbb8d38dcd28138938a7fd476edf89ecdec06a5a9d20f", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195065ccc9ce9f581b2c61756469807aeb767131602e6612e607a9eb8e26b4ce4fa4765593d032bc923ce8acadda42": "0x9037d1020ed699c2f538d3ffcf0eb98087ee11ca4bd07bfddb0d68633806af74", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950678c21325827e7c66173676e802e2f75472708a497d1743f52b04edf26c250d9e6d220f3bae3d176f02f8e586c": "0x1e30aa51ad68b8918d2c46e914986818c111bee03582610cbc9fb73fe0e4c413", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19506792a176f707220962616265801ab03b1b3277edfedd24ef3d3359b449b64bd95ed82a04e7f9fbaab7b71dc015": "0xd41a8a9678862ebe9d1a1d59cac1c8430ef31e282f9cb391cf6f2b4d9ce2fd3d", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195067f9bb125e8b25cf696d6f6e802cd12c731d91441f0114b08d314cd3f9a9f7fd0240d467fe54adefbee4d90762": "0xd41a8a9678862ebe9d1a1d59cac1c8430ef31e282f9cb391cf6f2b4d9ce2fd3d", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195068d2c0f060d8e93b6772616e806e60f1e253735fb113c183fa603f591e4456435171f387c0849001b428b5ccb1": "0x94c4156ed6a101ae478a3de3ba70a05fce8a3d67be6fb85f33bfcf2777ab6b10", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195069561cd534084d42696d6f6e80b414aa148096a92a1831309f758f944725653363ccbaeb21817b7df5784b8d46": "0x1e30aa51ad68b8918d2c46e914986818c111bee03582610cbc9fb73fe0e4c413", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950717bb541f3dc932d6772616e80c8de3a01502422b59dfa601c9c3a04a98d2bfbd79dd0810d1d1250feab4241ee": "0xd0b4896a63b672a7a74f5234bf9ec8567ff3c5bb8f93795e15e2c498b48d327c", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19507180ab4d5ffe8c79706172618090032c39c968f486f77f8764301a8479206f063d49eeb9f6d499333e2a1be045": "0xd0b4896a63b672a7a74f5234bf9ec8567ff3c5bb8f93795e15e2c498b48d327c", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195073b0d3d9242f219d70617261800ce84accce1ced0de223aa72f760f1b3d13ddfd267938cd63e25308378d32008": "0x9037d1020ed699c2f538d3ffcf0eb98087ee11ca4bd07bfddb0d68633806af74", "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19507466b8cede2256a27061726180ad90a2c3fa2c756f974628dd279adb87935f7ea509856276e3b86f759b22451c": "0x32eebacd223f4aef33d98a667a68f9e371f40384257c6d31030952b9d94e1152", "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950749c8bce91e643ae6772616e808270a62b61639ee56113834aecec01de6cda91413a5111b89f74d6585da34f50": "0x32eebacd223f4aef33d98a667a68f9e371f40384257c6d31030952b9d94e1152", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950795802224826305461756469808c15606f4c121376097ff0e96c2a33ea7b024d812b42fe2c741c8b8cee17e63d": "0x5270ec35ba01254d8bff046a1a58f16d3ae615c235efd6e99a35f233b2d9df2c", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19507e5838eaecbd9fe66175646980629f9fd0dd7279c7af7470472d1208a13e33239b484974d47cffce4ad4785644": "0x94c4156ed6a101ae478a3de3ba70a05fce8a3d67be6fb85f33bfcf2777ab6b10", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195085436b71cc38efc86173676e80e4ca45c68b0248885d190d22068c6628ee2f00d9fa0706d5a5c1c8456369f03e": "0x6ed774481ff68097867271bc8ecaeee3500817ccefdfda74ceeafd32a2259627", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195087f680d5c3a7dcbf617564698064ffc83f4f86cc595e607a00b977eeb6641e02a4e6e556c24ab163aecd7d146c": "0x8eef6710734f5d1e7d2eb303fa8f04e9bef65fb680647b24624723f95b868964", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950892d429df08b8e486772616e805fafb6219eb8d463bec0370b2aab69f45fc780959fc2eddbc7703760aa342022": "0x1e30aa51ad68b8918d2c46e914986818c111bee03582610cbc9fb73fe0e4c413", "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19508cec3cc48ae13ec86173676e80def964eed9a73f8a6610f1a0373378dca6f277eb7787869ed5841893105ad930": "0x043393e76c137dfdc403a6fd9a2d6129d470d51c5a67bd40517378030c87170d", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195090ddc04de598f6716772616e8083f43ee3e4521b55de0fe830847fda88a6b017b87979af1a41b180c39da1e4b0": "0x0efe248e3ddcfcb4f29675b70fc0a8e2db66b65381c45d299427b60d05f76108", "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950961fc927b0be61a66175646980f89c97bf5b2c07c05c84eebce4ffc7b28766946c03741fd1a71fdae0942e8768": "0x043393e76c137dfdc403a6fd9a2d6129d470d51c5a67bd40517378030c87170d", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195097b423b109a1a3e7626565668403a0af06322d100056125fac1df39d161089b07ae279505aae8731c4d110a54ad7": "0x1e30aa51ad68b8918d2c46e914986818c111bee03582610cbc9fb73fe0e4c413", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19509990e89dc7508f8f626565668403d46c454f9b620603feef8c3a2a5d7098205b8566500fda0fa0b456d6ded54538": "0x5270ec35ba01254d8bff046a1a58f16d3ae615c235efd6e99a35f233b2d9df2c", "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19509c34aadd3112cff46772616e80c8caee6f6eddc41c6cc55e554343392cbc13d2a8a57b97f6f85fc965bdd20ce8": "0x043393e76c137dfdc403a6fd9a2d6129d470d51c5a67bd40517378030c87170d", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19509cc6d5a70d4342de706172618002683131f96baec9121383995904c49a02ce2c2451f8038291e5db2dce66663e": "0x94c4156ed6a101ae478a3de3ba70a05fce8a3d67be6fb85f33bfcf2777ab6b10", "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19509d726f19fb7e918f6173676e80c083b0d0bd7d6ffd14562b4c9e28738b087ccc32262170c633c18359ff848779": "0x32eebacd223f4aef33d98a667a68f9e371f40384257c6d31030952b9d94e1152", "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19509f08b41b3412bdf7696d6f6e8074bd654c470ed9b94972c1f997593fab7bdd4d6b85e3cf49401265668142584e": "0x32eebacd223f4aef33d98a667a68f9e371f40384257c6d31030952b9d94e1152", "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19509f796bfaa6092095696d6f6e800edf2a41cb81178704560b02c35f5e01a5a97a568ebc10c025ade18b6ab2fa1d": "0x043393e76c137dfdc403a6fd9a2d6129d470d51c5a67bd40517378030c87170d", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950a0aff76314285afe6173676e803e547f5cc3455a61d0404d7296ceec7375cbe20322109d118c5e725b1a5cbf04": "0x0efe248e3ddcfcb4f29675b70fc0a8e2db66b65381c45d299427b60d05f76108", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950a39a50629306361270617261809e065eea4143325fbbd26967c26a228d51a3a8384062f7434973f15d1da2c010": "0x8eef6710734f5d1e7d2eb303fa8f04e9bef65fb680647b24624723f95b868964", "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950a69397f216a7497a6261626580ae240842b74e5dd778972e451558134f434c7a1d8a52bc70519f38054e245533": "0x9492b8c38442c79061bdbb8d38dcd28138938a7fd476edf89ecdec06a5a9d20f", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950a8670a2360fb4f7d626565668402f4f4d0eccb899bf2d611b56e0afec7c740efba404f8d0e82a545f988c45316c4": "0x6ed774481ff68097867271bc8ecaeee3500817ccefdfda74ceeafd32a2259627", "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950ab8402a39318e10f70617261802253ee3c02d89582602ca5b0570cfc01dc82cc8d1b9d2071eb5db6318749124b": "0x82c3105dbd4bb206428d8a8b7ea1f19965a0668dd583b06c3b75daa181fe654c", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950aba2e02edcf42d916175646980cce3ec06252cf7cdad47fe1265047a9bbddb9059ee4bdc6dec83b67249b4a934": "0x0efe248e3ddcfcb4f29675b70fc0a8e2db66b65381c45d299427b60d05f76108", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950ac3745478a256f54696d6f6e8094848b8cf2cbc9e6fd72db8d80676591b5be4d1ec68972ada48cf6fd01228712": "0x5270ec35ba01254d8bff046a1a58f16d3ae615c235efd6e99a35f233b2d9df2c", "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950ae71ab667a6367956173676e80bed3b452f869d187be58a4ba98588611084283810728fa75981e792beaec4151": "0x9492b8c38442c79061bdbb8d38dcd28138938a7fd476edf89ecdec06a5a9d20f", "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950aee25d4290ea4d846772616e804c669b04865e9acaf7b72bdfcb0099d70d9ec63c8c2d6b8cb0552815d7b50a0a": "0x82c3105dbd4bb206428d8a8b7ea1f19965a0668dd583b06c3b75daa181fe654c", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950b090c0a6a6d34dc97061726180441629077e228528f91ca7dc17051bb437408a5ae272d0950e58961846a8fc2e": "0xd41a8a9678862ebe9d1a1d59cac1c8430ef31e282f9cb391cf6f2b4d9ce2fd3d", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950b40a2e291d3757e66265656684029a1eb2e31dcaf468dbb516f9b620fdd7c3f090d58a88e02b51b25255b2182dd1": "0xd41a8a9678862ebe9d1a1d59cac1c8430ef31e282f9cb391cf6f2b4d9ce2fd3d", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950b469b5316f2df49e626162658018bd0f67d77f04f1a92400421813d8927fad109b40a8689254a5f0c8b346857c": "0x94c4156ed6a101ae478a3de3ba70a05fce8a3d67be6fb85f33bfcf2777ab6b10", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950b6da07aad040c4596772616e80ace46e899b90e75199549d8fa2ae7097e896ab3c845217e3155f99b6ffb88803": "0x9037d1020ed699c2f538d3ffcf0eb98087ee11ca4bd07bfddb0d68633806af74", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950b9847e90f2a93d58626565668403aec8e80ea0375f8669d6e55d7abb6a3117678d7bb851a1bd100a01e52a4fed90": "0x32eebacd223f4aef33d98a667a68f9e371f40384257c6d31030952b9d94e1152", "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950bad6b6ae80666780696d6f6e8006bd8fd81e50cda2bd67bf6893d921d1aae5cb08409ae43e0bff4d54e1830e58": "0x9492b8c38442c79061bdbb8d38dcd28138938a7fd476edf89ecdec06a5a9d20f", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950bd1ab2cd6f1dc5a6696d6f6e80d28145a7cde195a4c834276730d30f074b212a150e770931ee9470e853e7d224": "0x94c4156ed6a101ae478a3de3ba70a05fce8a3d67be6fb85f33bfcf2777ab6b10", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950bdd996f23001764e62656566840203d51bba2124f480e3507eb1764fc3019ac7abae8ee215683a285078bda7f51d": "0x9037d1020ed699c2f538d3ffcf0eb98087ee11ca4bd07bfddb0d68633806af74", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950be81b84f18801f516173676e80165f3b255dc17054e6d4447c4005f689eb5ed2f99fe201f4ff799bf088495850": "0xd0b4896a63b672a7a74f5234bf9ec8567ff3c5bb8f93795e15e2c498b48d327c", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950bef85ee78e59fe8a6173676e80eed33645cda7812cd343bbaef9131b2794812f2fd37701ccb6cddf9c1e293d38": "0x9037d1020ed699c2f538d3ffcf0eb98087ee11ca4bd07bfddb0d68633806af74", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950bfb5b848b461277c7061726180c45a6d0878f808b1baaa85dcfb4e930ae06e3205bb38855527aee6f259e3327b": "0x1e30aa51ad68b8918d2c46e914986818c111bee03582610cbc9fb73fe0e4c413", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950c1cabf91e699980a6261626580b2efe7e70daf44b3466c63ccbf4487f42c6a9f6fbb7050b849691e36ce92e347": "0x6ed774481ff68097867271bc8ecaeee3500817ccefdfda74ceeafd32a2259627", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950c2bef1fa94927270626565668403f045328f504c13dac9ddd9b1186098aee7c46cb8d55289dbbf2433bab7a26239": "0x0efe248e3ddcfcb4f29675b70fc0a8e2db66b65381c45d299427b60d05f76108", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950c3b366be127c04d76772616e80622c382187c0b2c61ecfb17443294d11a9d2ab770ae6f1fb49184a43906d59fe": "0x5270ec35ba01254d8bff046a1a58f16d3ae615c235efd6e99a35f233b2d9df2c", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950c61ff1db24ad5e86626565668402182879ec92e811e2a8cc117f3cde1f61d3cba0093134cfb1ed17a4ef74915d4a": "0x82c3105dbd4bb206428d8a8b7ea1f19965a0668dd583b06c3b75daa181fe654c", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950cb18236e84f2bcc8626565668403586dafcdab3d4647d4dc68732a9cab8aa34c00c5edd04e65d9dd44c2a1fd21e2": "0xd0b4896a63b672a7a74f5234bf9ec8567ff3c5bb8f93795e15e2c498b48d327c", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950d1c1264edac2bfeb7061726180303094c583e253794c9db14803585baaa74472f4ecba846defefc8aecfb6214a": "0x5270ec35ba01254d8bff046a1a58f16d3ae615c235efd6e99a35f233b2d9df2c", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950d4b8d8139a9d2a3862616265807c8348ec95a0faad6a638ef74864761028c53221bde07e9ff7c81a3f427abf3f": "0x9037d1020ed699c2f538d3ffcf0eb98087ee11ca4bd07bfddb0d68633806af74", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950d5b902094e722e906261626580c44b3e8efe854419ccd5801a82ada22d39cfccdbcece382304cdfeac81ebe402": "0x68728d12a90fb1a9f5b0f0b2814d730401d314964113554e66ff19e7067d7c69", "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950d74338095b2b3a5f7061726180161d0af40e6efc165c17d0189bd2d770bdfa0a9b8393cb89113f473a2e948c68": "0x043393e76c137dfdc403a6fd9a2d6129d470d51c5a67bd40517378030c87170d", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950d84b213ff11dcdc96175646980047277f22b9ef92a8b99618f4c86c2412f0e3b08a4f965f842775672043d1e25": "0xd0b4896a63b672a7a74f5234bf9ec8567ff3c5bb8f93795e15e2c498b48d327c", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950d912f1fd94200c50696d6f6e8030c40adee5476157ef3c2a26e10cab95ec7d54b62dd220738f5a474d5f86874e": "0x9037d1020ed699c2f538d3ffcf0eb98087ee11ca4bd07bfddb0d68633806af74", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950db189b9054ee003e6175646980aa3955187f755708cd6a8104314b962ff5043e36efa3ec5d84df40c58b442221": "0x6ed774481ff68097867271bc8ecaeee3500817ccefdfda74ceeafd32a2259627", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950dd45ac2fed4ab0db6173676e8092ac14f8ad1811cc83861afadf12f3191cca1391f1f3af705977faa2fa2bf46a": "0x94c4156ed6a101ae478a3de3ba70a05fce8a3d67be6fb85f33bfcf2777ab6b10", "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950dfe86daa30500684696d6f6e80ca3c2703db1633a27eff681d979967988c3a6752c669fd41f1abde10f3b05446": "0x82c3105dbd4bb206428d8a8b7ea1f19965a0668dd583b06c3b75daa181fe654c", "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950e326352daf693946617564698092cb05c48fc643f057626c669604675c5ad5a836266f260ae7030c6fdc17a543": "0x32eebacd223f4aef33d98a667a68f9e371f40384257c6d31030952b9d94e1152", - "0xcec5070d609dd3497f72bde07fc96ba088dcde934c658227ee1dfafcd6e16903": "0x10043393e76c137dfdc403a6fd9a2d6129d470d51c5a67bd40517378030c87170d32eebacd223f4aef33d98a667a68f9e371f40384257c6d31030952b9d94e115282c3105dbd4bb206428d8a8b7ea1f19965a0668dd583b06c3b75daa181fe654c9492b8c38442c79061bdbb8d38dcd28138938a7fd476edf89ecdec06a5a9d20f", - "0xcec5070d609dd3497f72bde07fc96ba0e0cdd062e6eaf24295ad4ccfc41d4609": "0x10043393e76c137dfdc403a6fd9a2d6129d470d51c5a67bd40517378030c87170dc8caee6f6eddc41c6cc55e554343392cbc13d2a8a57b97f6f85fc965bdd20ce8b07d600e3487e2712dcc3879c7b17c9b29cd2243b45f0d9343c591b89cf82a650edf2a41cb81178704560b02c35f5e01a5a97a568ebc10c025ade18b6ab2fa1d161d0af40e6efc165c17d0189bd2d770bdfa0a9b8393cb89113f473a2e948c68def964eed9a73f8a6610f1a0373378dca6f277eb7787869ed5841893105ad930f89c97bf5b2c07c05c84eebce4ffc7b28766946c03741fd1a71fdae0942e876832eebacd223f4aef33d98a667a68f9e371f40384257c6d31030952b9d94e11528270a62b61639ee56113834aecec01de6cda91413a5111b89f74d6585da34f5058108e1651614afc6a535c426fc013945e93533faa33819fe4e69423fe32330274bd654c470ed9b94972c1f997593fab7bdd4d6b85e3cf49401265668142584ead90a2c3fa2c756f974628dd279adb87935f7ea509856276e3b86f759b22451cc083b0d0bd7d6ffd14562b4c9e28738b087ccc32262170c633c18359ff84877992cb05c48fc643f057626c669604675c5ad5a836266f260ae7030c6fdc17a54382c3105dbd4bb206428d8a8b7ea1f19965a0668dd583b06c3b75daa181fe654c4c669b04865e9acaf7b72bdfcb0099d70d9ec63c8c2d6b8cb0552815d7b50a0afacb2f987caac6c1290a9784b1efdba78343d39aed805addb12945efbe444000ca3c2703db1633a27eff681d979967988c3a6752c669fd41f1abde10f3b054462253ee3c02d89582602ca5b0570cfc01dc82cc8d1b9d2071eb5db6318749124bf0e6c42698fffc28f9fc769fddcdf165af54c171cde43690cc8f73c853de1f0426e2fc857945d01520797a75388c58e710c9fefedd28387af70880f1682be41e9492b8c38442c79061bdbb8d38dcd28138938a7fd476edf89ecdec06a5a9d20fc9a68a26e9aa37ba6334f1a20275e3be7d3a9d4aa988627eadac8ea0d0a2dfbfae240842b74e5dd778972e451558134f434c7a1d8a52bc70519f38054e24553306bd8fd81e50cda2bd67bf6893d921d1aae5cb08409ae43e0bff4d54e1830e58ea9400f05e7fb75a3f7a92febbf58e5a3060dd06132ed6d5d68a3d75ec452826bed3b452f869d187be58a4ba98588611084283810728fa75981e792beaec4151763d070989ead31f265b40cc7a0cd29d47799b766d6a7f084e44c82baedfc01e", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950ec74f4b6dbe6f07e626162658074dacbca0cdb5099afef67e622c147614198e669931cebc605629da332632473": "0x1e30aa51ad68b8918d2c46e914986818c111bee03582610cbc9fb73fe0e4c413", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950f10dac37e2a0f812696d6f6e80a8a03d86e6c0dbe180cadfc7994121f462b28f7a8cb1be7e0e354147624be734": "0x68728d12a90fb1a9f5b0f0b2814d730401d314964113554e66ff19e7067d7c69", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950f39a56e067ee2ba9696d6f6e807c03ca47a3201455f8f89defda4aa909cb1d25dd9ddb7fd62a940606f79b5663": "0xd0b4896a63b672a7a74f5234bf9ec8567ff3c5bb8f93795e15e2c498b48d327c", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950f87aebc04f6a52ae6173676e80c22ce14ba0e59aa974d4a05c9208ba5ae18674c6a23c9998d91e7d1ebea7e06b": "0xd41a8a9678862ebe9d1a1d59cac1c8430ef31e282f9cb391cf6f2b4d9ce2fd3d", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950fc36b10abae8cf4f626162658050412bd7d3f1075e8f8e3b682d05ea20b391c287d8c849a0e49a78f568553e69": "0x5270ec35ba01254d8bff046a1a58f16d3ae615c235efd6e99a35f233b2d9df2c", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950fcf43201be771ed27061726180d0d052eca7d732d9f560ba970ca48f67387b899e76958ea6ed342a3a553ef022": "0x0efe248e3ddcfcb4f29675b70fc0a8e2db66b65381c45d299427b60d05f76108", + "0xcec5070d609dd3497f72bde07fc96ba088dcde934c658227ee1dfafcd6e16903": "0x38043393e76c137dfdc403a6fd9a2d6129d470d51c5a67bd40517378030c87170d0efe248e3ddcfcb4f29675b70fc0a8e2db66b65381c45d299427b60d05f761081e30aa51ad68b8918d2c46e914986818c111bee03582610cbc9fb73fe0e4c41332eebacd223f4aef33d98a667a68f9e371f40384257c6d31030952b9d94e11525270ec35ba01254d8bff046a1a58f16d3ae615c235efd6e99a35f233b2d9df2c68728d12a90fb1a9f5b0f0b2814d730401d314964113554e66ff19e7067d7c696ed774481ff68097867271bc8ecaeee3500817ccefdfda74ceeafd32a225962782c3105dbd4bb206428d8a8b7ea1f19965a0668dd583b06c3b75daa181fe654c8eef6710734f5d1e7d2eb303fa8f04e9bef65fb680647b24624723f95b8689649037d1020ed699c2f538d3ffcf0eb98087ee11ca4bd07bfddb0d68633806af749492b8c38442c79061bdbb8d38dcd28138938a7fd476edf89ecdec06a5a9d20f94c4156ed6a101ae478a3de3ba70a05fce8a3d67be6fb85f33bfcf2777ab6b10d0b4896a63b672a7a74f5234bf9ec8567ff3c5bb8f93795e15e2c498b48d327cd41a8a9678862ebe9d1a1d59cac1c8430ef31e282f9cb391cf6f2b4d9ce2fd3d", + "0xcec5070d609dd3497f72bde07fc96ba0e0cdd062e6eaf24295ad4ccfc41d4609": "0x38043393e76c137dfdc403a6fd9a2d6129d470d51c5a67bd40517378030c87170dc8caee6f6eddc41c6cc55e554343392cbc13d2a8a57b97f6f85fc965bdd20ce8b07d600e3487e2712dcc3879c7b17c9b29cd2243b45f0d9343c591b89cf82a650edf2a41cb81178704560b02c35f5e01a5a97a568ebc10c025ade18b6ab2fa1d161d0af40e6efc165c17d0189bd2d770bdfa0a9b8393cb89113f473a2e948c68def964eed9a73f8a6610f1a0373378dca6f277eb7787869ed5841893105ad930f89c97bf5b2c07c05c84eebce4ffc7b28766946c03741fd1a71fdae0942e87680325fc2095902f5fe394f244bce38b0dc3d631cbc05f0b64d5620a71bbf2514f0f0efe248e3ddcfcb4f29675b70fc0a8e2db66b65381c45d299427b60d05f7610883f43ee3e4521b55de0fe830847fda88a6b017b87979af1a41b180c39da1e4b05440add43e5388a81aef665c9086d386c0be0ce75e4f8a4a3d8168e976ea821f98aab6f52520022d011a6eba2dca1c6327edbbcd753c170dcf0e9118b5f0f25bd0d052eca7d732d9f560ba970ca48f67387b899e76958ea6ed342a3a553ef0223e547f5cc3455a61d0404d7296ceec7375cbe20322109d118c5e725b1a5cbf04cce3ec06252cf7cdad47fe1265047a9bbddb9059ee4bdc6dec83b67249b4a93403f045328f504c13dac9ddd9b1186098aee7c46cb8d55289dbbf2433bab7a262391e30aa51ad68b8918d2c46e914986818c111bee03582610cbc9fb73fe0e4c4135fafb6219eb8d463bec0370b2aab69f45fc780959fc2eddbc7703760aa34202274dacbca0cdb5099afef67e622c147614198e669931cebc605629da332632473b414aa148096a92a1831309f758f944725653363ccbaeb21817b7df5784b8d46c45a6d0878f808b1baaa85dcfb4e930ae06e3205bb38855527aee6f259e3327b2e2f75472708a497d1743f52b04edf26c250d9e6d220f3bae3d176f02f8e586c2ada042fb4bbfd9b6d8c48293ffc4a7722632c843a67e608554c41d06aabc41303a0af06322d100056125fac1df39d161089b07ae279505aae8731c4d110a54ad732eebacd223f4aef33d98a667a68f9e371f40384257c6d31030952b9d94e11528270a62b61639ee56113834aecec01de6cda91413a5111b89f74d6585da34f5058108e1651614afc6a535c426fc013945e93533faa33819fe4e69423fe32330274bd654c470ed9b94972c1f997593fab7bdd4d6b85e3cf49401265668142584ead90a2c3fa2c756f974628dd279adb87935f7ea509856276e3b86f759b22451cc083b0d0bd7d6ffd14562b4c9e28738b087ccc32262170c633c18359ff84877992cb05c48fc643f057626c669604675c5ad5a836266f260ae7030c6fdc17a54303aec8e80ea0375f8669d6e55d7abb6a3117678d7bb851a1bd100a01e52a4fed905270ec35ba01254d8bff046a1a58f16d3ae615c235efd6e99a35f233b2d9df2c622c382187c0b2c61ecfb17443294d11a9d2ab770ae6f1fb49184a43906d59fe50412bd7d3f1075e8f8e3b682d05ea20b391c287d8c849a0e49a78f568553e6994848b8cf2cbc9e6fd72db8d80676591b5be4d1ec68972ada48cf6fd01228712303094c583e253794c9db14803585baaa74472f4ecba846defefc8aecfb6214ab400c4164d016282b202c1d42d9dc8ede28cbe4b751d463bab5f23fef42b295a8c15606f4c121376097ff0e96c2a33ea7b024d812b42fe2c741c8b8cee17e63d03d46c454f9b620603feef8c3a2a5d7098205b8566500fda0fa0b456d6ded5453868728d12a90fb1a9f5b0f0b2814d730401d314964113554e66ff19e7067d7c696e309dfa4c8de814cad140b8612a9e41bfba244f9ab1468e1b5d9b3cc1f5e565c44b3e8efe854419ccd5801a82ada22d39cfccdbcece382304cdfeac81ebe402a8a03d86e6c0dbe180cadfc7994121f462b28f7a8cb1be7e0e354147624be7340a988fb965b156a07debf072fd9d34a9c7c0fc0e0ff5bd63ef766afb76e2b3289ef622d2467ed115fa0c6c86303e1ef6a08a0609c97e616aa69b026a6d3f2663729053f28155071474b4686323db5f7a318cb3f088b76660cc8ff5e3e11ec32e030e901c390fa37d101ff25d70594acd2df67b4493ee77a73684f25d39313536d76ed774481ff68097867271bc8ecaeee3500817ccefdfda74ceeafd32a22596270509f9caf32fda5584343c473b386c433acb99fd9400724b8cf3c618d840133fb2efe7e70daf44b3466c63ccbf4487f42c6a9f6fbb7050b849691e36ce92e347bef47a9e4b47ed57461e1d28cac7da327a52ebcd64d74080d31deb3ac7a7645e4e1a59090261a7e6bd82544df1eebd96dc87b4eb1211346645fa44d6b932960be4ca45c68b0248885d190d22068c6628ee2f00d9fa0706d5a5c1c8456369f03eaa3955187f755708cd6a8104314b962ff5043e36efa3ec5d84df40c58b44222102f4f4d0eccb899bf2d611b56e0afec7c740efba404f8d0e82a545f988c45316c482c3105dbd4bb206428d8a8b7ea1f19965a0668dd583b06c3b75daa181fe654c4c669b04865e9acaf7b72bdfcb0099d70d9ec63c8c2d6b8cb0552815d7b50a0afacb2f987caac6c1290a9784b1efdba78343d39aed805addb12945efbe444000ca3c2703db1633a27eff681d979967988c3a6752c669fd41f1abde10f3b054462253ee3c02d89582602ca5b0570cfc01dc82cc8d1b9d2071eb5db6318749124bf0e6c42698fffc28f9fc769fddcdf165af54c171cde43690cc8f73c853de1f0426e2fc857945d01520797a75388c58e710c9fefedd28387af70880f1682be41e02182879ec92e811e2a8cc117f3cde1f61d3cba0093134cfb1ed17a4ef74915d4a8eef6710734f5d1e7d2eb303fa8f04e9bef65fb680647b24624723f95b868964e41426f7465c13c48335771c5450bf61c50a9cf28b9274f170c7421eea7974f168a9ec74fa35b3425eaf503dd36294ba8e758e7b8084c4d6bfd547f8c6b5827460fcc9d094d21fe17cfb7426501f50cb3d75c4c9395a3140e0f255443f660d3b9e065eea4143325fbbd26967c26a228d51a3a8384062f7434973f15d1da2c01068f7a83678a377701b46a5e6a4637e99868186ff4835fc0e3914cc56a76a360164ffc83f4f86cc595e607a00b977eeb6641e02a4e6e556c24ab163aecd7d146c03e843f200e30bc5b951c73a96d968db1c0cd05e357d910fce159fc59c40e9d6e29037d1020ed699c2f538d3ffcf0eb98087ee11ca4bd07bfddb0d68633806af74ace46e899b90e75199549d8fa2ae7097e896ab3c845217e3155f99b6ffb888037c8348ec95a0faad6a638ef74864761028c53221bde07e9ff7c81a3f427abf3f30c40adee5476157ef3c2a26e10cab95ec7d54b62dd220738f5a474d5f86874e0ce84accce1ced0de223aa72f760f1b3d13ddfd267938cd63e25308378d32008eed33645cda7812cd343bbaef9131b2794812f2fd37701ccb6cddf9c1e293d387aeb767131602e6612e607a9eb8e26b4ce4fa4765593d032bc923ce8acadda420203d51bba2124f480e3507eb1764fc3019ac7abae8ee215683a285078bda7f51d9492b8c38442c79061bdbb8d38dcd28138938a7fd476edf89ecdec06a5a9d20fc9a68a26e9aa37ba6334f1a20275e3be7d3a9d4aa988627eadac8ea0d0a2dfbfae240842b74e5dd778972e451558134f434c7a1d8a52bc70519f38054e24553306bd8fd81e50cda2bd67bf6893d921d1aae5cb08409ae43e0bff4d54e1830e58ea9400f05e7fb75a3f7a92febbf58e5a3060dd06132ed6d5d68a3d75ec452826bed3b452f869d187be58a4ba98588611084283810728fa75981e792beaec4151763d070989ead31f265b40cc7a0cd29d47799b766d6a7f084e44c82baedfc01e029338ece1c6bc6439dc4d16bfe33f28c9f0af31626bb8142849742b7a624f680794c4156ed6a101ae478a3de3ba70a05fce8a3d67be6fb85f33bfcf2777ab6b106e60f1e253735fb113c183fa603f591e4456435171f387c0849001b428b5ccb118bd0f67d77f04f1a92400421813d8927fad109b40a8689254a5f0c8b346857cd28145a7cde195a4c834276730d30f074b212a150e770931ee9470e853e7d22402683131f96baec9121383995904c49a02ce2c2451f8038291e5db2dce66663e92ac14f8ad1811cc83861afadf12f3191cca1391f1f3af705977faa2fa2bf46a629f9fd0dd7279c7af7470472d1208a13e33239b484974d47cffce4ad47856440333022898140662dfea847e3cbfe5e989845ac6766e83472f8b0c650d85e77baed0b4896a63b672a7a74f5234bf9ec8567ff3c5bb8f93795e15e2c498b48d327cc8de3a01502422b59dfa601c9c3a04a98d2bfbd79dd0810d1d1250feab4241ee6248d87bd2a640ffe26d6b831735887c24e2076a3a0f3a74f7ae7568c27604087c03ca47a3201455f8f89defda4aa909cb1d25dd9ddb7fd62a940606f79b566390032c39c968f486f77f8764301a8479206f063d49eeb9f6d499333e2a1be045165f3b255dc17054e6d4447c4005f689eb5ed2f99fe201f4ff799bf088495850047277f22b9ef92a8b99618f4c86c2412f0e3b08a4f965f842775672043d1e2503586dafcdab3d4647d4dc68732a9cab8aa34c00c5edd04e65d9dd44c2a1fd21e2d41a8a9678862ebe9d1a1d59cac1c8430ef31e282f9cb391cf6f2b4d9ce2fd3d64adb43a7628139f6c02100f6a5465dbd33422418426c572b12547c5a665008c1ab03b1b3277edfedd24ef3d3359b449b64bd95ed82a04e7f9fbaab7b71dc0152cd12c731d91441f0114b08d314cd3f9a9f7fd0240d467fe54adefbee4d90762441629077e228528f91ca7dc17051bb437408a5ae272d0950e58961846a8fc2ec22ce14ba0e59aa974d4a05c9208ba5ae18674c6a23c9998d91e7d1ebea7e06b9a86227e204a2d003399c2a3b50c2c869c4380c195a014a02f6d2e7048941237029a1eb2e31dcaf468dbb516f9b620fdd7c3f090d58a88e02b51b25255b2182dd1", "0xd57bce545fb382c34570e5dfbf338f5e4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", "0xd5c41b52a371aa36c9254ce34324f2a54e7b9012096b41c4eb3aaf947f6ea429": "0x0100", "0xd5e1a2fa16732ce6906189438c0a82c64e7b9012096b41c4eb3aaf947f6ea429": "0x0000", @@ -224,4 +419,4 @@ "childrenDefault": {} } } -} +} \ No newline at end of file diff --git a/polkadot/node/service/chain-specs/polkadot.json b/polkadot/node/service/chain-specs/polkadot.json index 71dbb9004038d1394cebe568627e1e6163ee9049..5f8d88102d7edd9d9d640a21b43a3c37982430d5 100644 --- a/polkadot/node/service/chain-specs/polkadot.json +++ b/polkadot/node/service/chain-specs/polkadot.json @@ -17,8 +17,8 @@ "/dns/boot-node.helikon.io/tcp/7072/wss/p2p/12D3KooWS9ZcvRxyzrSf6p63QfTCWs12nLoNKhGux865crgxVA4H", "/dns/polkadot.bootnode.amforc.com/tcp/30333/p2p/12D3KooWAsuCEVCzUVUrtib8W82Yne3jgVGhQZN3hizko5FTnDg3", "/dns/polkadot.bootnode.amforc.com/tcp/30334/wss/p2p/12D3KooWAsuCEVCzUVUrtib8W82Yne3jgVGhQZN3hizko5FTnDg3", - "/dns/polkadot-bootnode.polkadotters.com/tcp/30333/p2p/12D3KooWPAVUgBaBk6n8SztLrMk8ESByncbAfRKUdxY1nygb9zG3", - "/dns/polkadot-bootnode.polkadotters.com/tcp/30334/wss/p2p/12D3KooWPAVUgBaBk6n8SztLrMk8ESByncbAfRKUdxY1nygb9zG3", + "/dns/polkadot.bootnodes.polkadotters.com/tcp/30314/p2p/12D3KooWPAVUgBaBk6n8SztLrMk8ESByncbAfRKUdxY1nygb9zG3", + "/dns/polkadot.bootnodes.polkadotters.com/tcp/30316/wss/p2p/12D3KooWPAVUgBaBk6n8SztLrMk8ESByncbAfRKUdxY1nygb9zG3", "/dns/boot-cr.gatotech.network/tcp/33100/p2p/12D3KooWK4E16jKk9nRhvC4RfrDVgcZzExg8Q3Q2G7ABUUitks1w", "/dns/boot-cr.gatotech.network/tcp/35100/wss/p2p/12D3KooWK4E16jKk9nRhvC4RfrDVgcZzExg8Q3Q2G7ABUUitks1w", "/dns/boot-polkadot.metaspan.io/tcp/13012/p2p/12D3KooWRjHFApinuqSBjoaDjQHvxwubQSpEVy5hrgC9Smvh92WF", @@ -36,7 +36,8 @@ "/dns/dot14.rotko.net/tcp/35214/wss/p2p/12D3KooWPyEvPEXghnMC67Gff6PuZiSvfx3fmziKiPZcGStZ5xff", "/dns/dot14.rotko.net/tcp/33214/p2p/12D3KooWPyEvPEXghnMC67Gff6PuZiSvfx3fmziKiPZcGStZ5xff", "/dns/ibp-boot-polkadot.luckyfriday.io/tcp/30333/p2p/12D3KooWEjk6QXrZJ26fLpaajisJGHiz6WiQsR8k7mkM9GmWKnRZ", - "/dns/ibp-boot-polkadot.luckyfriday.io/tcp/30334/wss/p2p/12D3KooWEjk6QXrZJ26fLpaajisJGHiz6WiQsR8k7mkM9GmWKnRZ" + "/dns/ibp-boot-polkadot.luckyfriday.io/tcp/30334/wss/p2p/12D3KooWEjk6QXrZJ26fLpaajisJGHiz6WiQsR8k7mkM9GmWKnRZ", + "/dns/boot-polkadot.luckyfriday.io/tcp/443/wss/p2p/12D3KooWAdyiVAaeGdtBt6vn5zVetwA4z4qfm9Fi2QCSykN1wTBJ" ], "telemetryEndpoints": [ [ diff --git a/polkadot/node/service/chain-specs/westend.json b/polkadot/node/service/chain-specs/westend.json index 697675871fcd7b4b11cac5a25e71c704d471cbde..775f3e72ac75578a0f0166cba96531244af760c9 100644 --- a/polkadot/node/service/chain-specs/westend.json +++ b/polkadot/node/service/chain-specs/westend.json @@ -14,8 +14,8 @@ "/dns/boot-node.helikon.io/tcp/7082/wss/p2p/12D3KooWRFDPyT8vA8mLzh6dJoyujn4QNjeqi6Ch79eSMz9beKXC", "/dns/westend.bootnode.amforc.com/tcp/30333/p2p/12D3KooWJ5y9ZgVepBQNW4aabrxgmnrApdVnscqgKWiUu4BNJbC8", "/dns/westend.bootnode.amforc.com/tcp/30334/wss/p2p/12D3KooWJ5y9ZgVepBQNW4aabrxgmnrApdVnscqgKWiUu4BNJbC8", - "/dns/westend-bootnode.polkadotters.com/tcp/30333/p2p/12D3KooWHPHb64jXMtSRJDrYFATWeLnvChL8NtWVttY67DCH1eC5", - "/dns/westend-bootnode.polkadotters.com/tcp/30334/wss/p2p/12D3KooWHPHb64jXMtSRJDrYFATWeLnvChL8NtWVttY67DCH1eC5", + "/dns/westend.bootnodes.polkadotters.com/tcp/30308/p2p/12D3KooWHPHb64jXMtSRJDrYFATWeLnvChL8NtWVttY67DCH1eC5", + "/dns/westend.bootnodes.polkadotters.com/tcp/30310/wss/p2p/12D3KooWHPHb64jXMtSRJDrYFATWeLnvChL8NtWVttY67DCH1eC5", "/dns/boot-cr.gatotech.network/tcp/33300/p2p/12D3KooWQGR1vUhoy6mvQorFp3bZFn6NNezhQZ6NWnVV7tpFgoPd", "/dns/boot-cr.gatotech.network/tcp/35300/wss/p2p/12D3KooWQGR1vUhoy6mvQorFp3bZFn6NNezhQZ6NWnVV7tpFgoPd", "/dns/boot-westend.metaspan.io/tcp/33012/p2p/12D3KooWNTau7iG4G9cUJSwwt2QJP1W88pUf2SgqsHjRU2RL8pfa", diff --git a/polkadot/node/service/src/benchmarking.rs b/polkadot/node/service/src/benchmarking.rs index 400daf1aee3448f841f9030f24b78a0029fc0830..a0c4d3b04469b1bcf85990d4f6f62922f09bf88a 100644 --- a/polkadot/node/service/src/benchmarking.rs +++ b/polkadot/node/service/src/benchmarking.rs @@ -222,7 +222,7 @@ fn westend_sign_call( runtime::UncheckedExtrinsic::new_signed( call, sp_runtime::AccountId32::from(acc.public()).into(), - polkadot_core_primitives::Signature::Sr25519(signature.clone()), + polkadot_core_primitives::Signature::Sr25519(signature), extra, ) .into() @@ -274,7 +274,7 @@ fn rococo_sign_call( runtime::UncheckedExtrinsic::new_signed( call, sp_runtime::AccountId32::from(acc.public()).into(), - polkadot_core_primitives::Signature::Sr25519(signature.clone()), + polkadot_core_primitives::Signature::Sr25519(signature), extra, ) .into() diff --git a/polkadot/node/service/src/chain_spec.rs b/polkadot/node/service/src/chain_spec.rs index af241d1cbc558c849bbf533dd644848b20fa4491..1b990af2394b6fba31b0c8ddb2c1839cb2c09fb0 100644 --- a/polkadot/node/service/src/chain_spec.rs +++ b/polkadot/node/service/src/chain_spec.rs @@ -24,10 +24,10 @@ use polkadot_primitives::{AccountId, AccountPublic, AssignmentId, ValidatorId}; use sp_authority_discovery::AuthorityId as AuthorityDiscoveryId; use sp_consensus_babe::AuthorityId as BabeId; +#[cfg(feature = "westend-native")] +use polkadot_primitives::vstaging::SchedulerParams; #[cfg(feature = "rococo-native")] use rococo_runtime as rococo; -#[cfg(feature = "rococo-native")] -use rococo_runtime_constants::currency::UNITS as ROC; use sc_chain_spec::ChainSpecExtension; #[cfg(any(feature = "westend-native", feature = "rococo-native"))] use sc_chain_spec::ChainType; @@ -116,11 +116,14 @@ pub fn wococo_config() -> Result { } /// The default parachains host configuration. -#[cfg(any(feature = "rococo-native", feature = "westend-native",))] +#[cfg(feature = "westend-native")] fn default_parachains_host_configuration( ) -> polkadot_runtime_parachains::configuration::HostConfiguration { - use polkadot_primitives::{AsyncBackingParams, MAX_CODE_SIZE, MAX_POV_SIZE}; + use polkadot_primitives::{ + node_features::FeatureIndex, ApprovalVotingParams, AsyncBackingParams, MAX_CODE_SIZE, + MAX_POV_SIZE, + }; polkadot_runtime_parachains::configuration::HostConfiguration { validation_upgrade_cooldown: 2u32, @@ -129,8 +132,6 @@ fn default_parachains_host_configuration( max_code_size: MAX_CODE_SIZE, max_pov_size: MAX_POV_SIZE, max_head_data_size: 32 * 1024, - group_rotation_frequency: 20, - paras_availability_period: 4, max_upward_queue_count: 8, max_upward_queue_size: 1024 * 1024, max_downward_message_size: 1024 * 1024, @@ -151,16 +152,26 @@ fn default_parachains_host_configuration( relay_vrf_modulo_samples: 2, zeroth_delay_tranche_width: 0, minimum_validation_upgrade_delay: 5, - scheduling_lookahead: 2, async_backing_params: AsyncBackingParams { max_candidate_depth: 3, allowed_ancestry_len: 2, }, + node_features: bitvec::vec::BitVec::from_element( + 1u8 << (FeatureIndex::ElasticScalingMVP as usize) | + 1u8 << (FeatureIndex::EnableAssignmentsV2 as usize), + ), + scheduler_params: SchedulerParams { + lookahead: 2, + group_rotation_frequency: 20, + paras_availability_period: 4, + ..Default::default() + }, + approval_voting_params: ApprovalVotingParams { max_approval_coalesce_count: 5 }, ..Default::default() } } -#[cfg(any(feature = "rococo-native", feature = "westend-native",))] +#[cfg(feature = "westend-native")] #[test] fn default_parachains_host_configuration_is_consistent() { default_parachains_host_configuration().panic_if_not_consistent(); @@ -185,25 +196,6 @@ fn westend_session_keys( } } -#[cfg(feature = "rococo-native")] -fn rococo_session_keys( - babe: BabeId, - grandpa: GrandpaId, - para_validator: ValidatorId, - para_assignment: AssignmentId, - authority_discovery: AuthorityDiscoveryId, - beefy: BeefyId, -) -> rococo_runtime::SessionKeys { - rococo_runtime::SessionKeys { - babe, - grandpa, - para_validator, - para_assignment, - authority_discovery, - beefy, - } -} - #[cfg(feature = "westend-native")] fn westend_staging_testnet_config_genesis() -> serde_json::Value { use hex_literal::hex; @@ -381,265 +373,6 @@ fn westend_staging_testnet_config_genesis() -> serde_json::Value { }) } -#[cfg(feature = "rococo-native")] -fn rococo_staging_testnet_config_genesis() -> serde_json::Value { - use hex_literal::hex; - use sp_core::crypto::UncheckedInto; - - // subkey inspect "$SECRET" - let endowed_accounts = vec![ - // 5DwBmEFPXRESyEam5SsQF1zbWSCn2kCjyLW51hJHXe9vW4xs - hex!["52bc71c1eca5353749542dfdf0af97bf764f9c2f44e860cd485f1cd86400f649"].into(), - ]; - - // ./scripts/prepare-test-net.sh 8 - let initial_authorities: Vec<( - AccountId, - AccountId, - BabeId, - GrandpaId, - ValidatorId, - AssignmentId, - AuthorityDiscoveryId, - BeefyId, - )> = vec![ - ( - //5EHZkbp22djdbuMFH9qt1DVzSCvqi3zWpj6DAYfANa828oei - hex!["62475fe5406a7cb6a64c51d0af9d3ab5c2151bcae982fb812f7a76b706914d6a"].into(), - //5FeSEpi9UYYaWwXXb3tV88qtZkmSdB3mvgj3pXkxKyYLGhcd - hex!["9e6e781a76810fe93187af44c79272c290c2b9e2b8b92ee11466cd79d8023f50"].into(), - //5Fh6rDpMDhM363o1Z3Y9twtaCPfizGQWCi55BSykTQjGbP7H - hex!["a076ef1280d768051f21d060623da3ab5b56944d681d303ed2d4bf658c5bed35"] - .unchecked_into(), - //5CPd3zoV9Aaah4xWucuDivMHJ2nEEmpdi864nPTiyRZp4t87 - hex!["0e6d7d1afbcc6547b92995a394ba0daed07a2420be08220a5a1336c6731f0bfa"] - .unchecked_into(), - //5CP6oGfwqbEfML8efqm1tCZsUgRsJztp9L8ZkEUxA16W8PPz - hex!["0e07a51d3213842f8e9363ce8e444255990a225f87e80a3d651db7841e1a0205"] - .unchecked_into(), - //5HQdwiDh8Qtd5dSNWajNYpwDvoyNWWA16Y43aEkCNactFc2b - hex!["ec60e71fe4a567ef9fef99d4bbf37ffae70564b41aa6f94ef0317c13e0a5477b"] - .unchecked_into(), - //5HbSgM72xVuscsopsdeG3sCSCYdAeM1Tay9p79N6ky6vwDGq - hex!["f49eae66a0ac9f610316906ec8f1a0928e20d7059d76a5ca53cbcb5a9b50dd3c"] - .unchecked_into(), - //5DPSWdgw38Spu315r6LSvYCggeeieBAJtP5A1qzuzKhqmjVu - hex!["034f68c5661a41930c82f26a662276bf89f33467e1c850f2fb8ef687fe43d62276"] - .unchecked_into(), - ), - ( - //5DvH8oEjQPYhzCoQVo7WDU91qmQfLZvxe9wJcrojmJKebCmG - hex!["520b48452969f6ddf263b664de0adb0c729d0e0ad3b0e5f3cb636c541bc9022a"].into(), - //5ENZvCRzyXJJYup8bM6yEzb2kQHEb1NDpY2ZEyVGBkCfRdj3 - hex!["6618289af7ae8621981ffab34591e7a6486e12745dfa3fd3b0f7e6a3994c7b5b"].into(), - //5DLjSUfqZVNAADbwYLgRvHvdzXypiV1DAEaDMjcESKTcqMoM - hex!["38757d0de00a0c739e7d7984ef4bc01161bd61e198b7c01b618425c16bb5bd5f"] - .unchecked_into(), - //5HnDVBN9mD6mXyx8oryhDbJtezwNSj1VRXgLoYCBA6uEkiao - hex!["fcd5f87a6fd5707a25122a01b4dac0a8482259df7d42a9a096606df1320df08d"] - .unchecked_into(), - //5EPEWRecy2ApL5n18n3aHyU1956zXTRqaJpzDa9DoqiggNwF - hex!["669a10892119453e9feb4e3f1ee8e028916cc3240022920ad643846fbdbee816"] - .unchecked_into(), - //5ES3fw5X4bndSgLNmtPfSbM2J1kLqApVB2CCLS4CBpM1UxUZ - hex!["68bf52c482630a8d1511f2edd14f34127a7d7082219cccf7fd4c6ecdb535f80d"] - .unchecked_into(), - //5HeXbwb5PxtcRoopPZTp5CQun38atn2UudQ8p2AxR5BzoaXw - hex!["f6f8fe475130d21165446a02fb1dbce3a7bf36412e5d98f4f0473aed9252f349"] - .unchecked_into(), - //5F7nTtN8MyJV4UsXpjg7tHSnfANXZ5KRPJmkASc1ZSH2Xoa5 - hex!["03a90c2bb6d3b7000020f6152fe2e5002fa970fd1f42aafb6c8edda8dacc2ea77e"] - .unchecked_into(), - ), - ( - //5FPMzsezo1PRxYbVpJMWK7HNbR2kUxidsAAxH4BosHa4wd6S - hex!["92ef83665b39d7a565e11bf8d18d41d45a8011601c339e57a8ea88c8ff7bba6f"].into(), - //5G6NQidFG7YiXsvV7hQTLGArir9tsYqD4JDxByhgxKvSKwRx - hex!["b235f57244230589523271c27b8a490922ffd7dccc83b044feaf22273c1dc735"].into(), - //5GpZhzAVg7SAtzLvaAC777pjquPEcNy1FbNUAG2nZvhmd6eY - hex!["d2644c1ab2c63a3ad8d40ad70d4b260969e3abfe6d7e6665f50dc9f6365c9d2a"] - .unchecked_into(), - //5HAes2RQYPbYKbLBfKb88f4zoXv6pPA6Ke8CjN7dob3GpmSP - hex!["e1b68fbd84333e31486c08e6153d9a1415b2e7e71b413702b7d64e9b631184a1"] - .unchecked_into(), - //5FtAGDZYJKXkhVhAxCQrXmaP7EE2mGbBMfmKDHjfYDgq2BiU - hex!["a8e61ffacafaf546283dc92d14d7cc70ea0151a5dd81fdf73ff5a2951f2b6037"] - .unchecked_into(), - //5CtK7JHv3h6UQZ44y54skxdwSVBRtuxwPE1FYm7UZVhg8rJV - hex!["244f3421b310c68646e99cdbf4963e02067601f57756b072a4b19431448c186e"] - .unchecked_into(), - //5D4r6YaB6F7A7nvMRHNFNF6zrR9g39bqDJFenrcaFmTCRwfa - hex!["2c57f81fd311c1ab53813c6817fe67f8947f8d39258252663b3384ab4195494d"] - .unchecked_into(), - //5EPoHj8uV4fFKQHYThc6Z9fDkU7B6ih2ncVzQuDdNFb8UyhF - hex!["039d065fe4f9234f0a4f13cc3ae585f2691e9c25afa469618abb6645111f607a53"] - .unchecked_into(), - ), - ( - //5DMNx7RoX6d7JQ38NEM7DWRcW2THu92LBYZEWvBRhJeqcWgR - hex!["38f3c2f38f6d47f161e98c697bbe3ca0e47c033460afda0dda314ab4222a0404"].into(), - //5GGdKNDr9P47dpVnmtq3m8Tvowwf1ot1abw6tPsTYYFoKm2v - hex!["ba0898c1964196474c0be08d364cdf4e9e1d47088287f5235f70b0590dfe1704"].into(), - //5EjkyPCzR2SjhDZq8f7ufsw6TfkvgNRepjCRQFc4TcdXdaB1 - hex!["764186bc30fd5a02477f19948dc723d6d57ab174debd4f80ed6038ec960bfe21"] - .unchecked_into(), - //5DJV3zCBTJBLGNDCcdWrYxWDacSz84goGTa4pFeKVvehEBte - hex!["36be9069cdb4a8a07ecd51f257875150f0a8a1be44a10d9d98dabf10a030aef4"] - .unchecked_into(), - //5F9FsRjpecP9GonktmtFL3kjqNAMKjHVFjyjRdTPa4hbQRZA - hex!["882d72965e642677583b333b2d173ac94b5fd6c405c76184bb14293be748a13b"] - .unchecked_into(), - //5F1FZWZSj3JyTLs8sRBxU6QWyGLSL9BMRtmSKDmVEoiKFxSP - hex!["821271c99c958b9220f1771d9f5e29af969edfa865631dba31e1ab7bc0582b75"] - .unchecked_into(), - //5CtgRR74VypK4h154s369abs78hDUxZSJqcbWsfXvsjcHJNA - hex!["2496f28d887d84705c6dae98aee8bf90fc5ad10bb5545eca1de6b68425b70f7c"] - .unchecked_into(), - //5CPx6dsr11SCJHKFkcAQ9jpparS7FwXQBrrMznRo4Hqv1PXz - hex!["0307d29bbf6a5c4061c2157b44fda33b7bb4ec52a5a0305668c74688cedf288d58"] - .unchecked_into(), - ), - ( - //5C8AL1Zb4bVazgT3EgDxFgcow1L4SJjVu44XcLC9CrYqFN4N - hex!["02a2d8cfcf75dda85fafc04ace3bcb73160034ed1964c43098fb1fe831de1b16"].into(), - //5FLYy3YKsAnooqE4hCudttAsoGKbVG3hYYBtVzwMjJQrevPa - hex!["90cab33f0bb501727faa8319f0845faef7d31008f178b65054b6629fe531b772"].into(), - //5Et3tfbVf1ByFThNAuUq5pBssdaPPskip5yob5GNyUFojXC7 - hex!["7c94715e5dd8ab54221b1b6b2bfa5666f593f28a92a18e28052531de1bd80813"] - .unchecked_into(), - //5EX1JBghGbQqWohTPU6msR9qZ2nYPhK9r3RTQ2oD1K8TCxaG - hex!["6c878e33b83c20324238d22240f735457b6fba544b383e70bb62a27b57380c81"] - .unchecked_into(), - //5EUNaBpX9mJgcmLQHyG5Pkms6tbDiKuLbeTEJS924Js9cA1N - hex!["6a8570b9c6408e54bacf123cc2bb1b0f087f9c149147d0005badba63a5a4ac01"] - .unchecked_into(), - //5CaZuueRVpMATZG4hkcrgDoF4WGixuz7zu83jeBdY3bgWGaG - hex!["16c69ea8d595e80b6736f44be1eaeeef2ac9c04a803cc4fd944364cb0d617a33"] - .unchecked_into(), - //5DABsdQCDUGuhzVGWe5xXzYQ9rtrVxRygW7RXf9Tsjsw1aGJ - hex!["306ac5c772fe858942f92b6e28bd82fb7dd8cdd25f9a4626c1b0eee075fcb531"] - .unchecked_into(), - //5H91T5mHhoCw9JJG4NjghDdQyhC6L7XcSuBWKD3q3TAhEVvQ - hex!["02fb0330356e63a35dd930bc74525edf28b3bf5eb44aab9e9e4962c8309aaba6a6"] - .unchecked_into(), - ), - ( - //5C8XbDXdMNKJrZSrQURwVCxdNdk8AzG6xgLggbzuA399bBBF - hex!["02ea6bfa8b23b92fe4b5db1063a1f9475e3acd0ab61e6b4f454ed6ba00b5f864"].into(), - //5GsyzFP8qtF8tXPSsjhjxAeU1v7D1PZofuQKN9TdCc7Dp1JM - hex!["d4ffc4c05b47d1115ad200f7f86e307b20b46c50e1b72a912ec4f6f7db46b616"].into(), - //5GHWB8ZDzegLcMW7Gdd1BS6WHVwDdStfkkE4G7KjPjZNJBtD - hex!["bab3cccdcc34401e9b3971b96a662686cf755aa869a5c4b762199ce531b12c5b"] - .unchecked_into(), - //5GzDPGbUM9uH52ZEwydasTj8edokGUJ7vEpoFWp9FE1YNuFB - hex!["d9c056c98ca0e6b4eb7f5c58c007c1db7be0fe1f3776108f797dd4990d1ccc33"] - .unchecked_into(), - //5CmLCFeSurRXXtwMmLcVo7sdJ9EqDguvJbuCYDcHkr3cpqyE - hex!["1efc23c0b51ad609ab670ecf45807e31acbd8e7e5cb7c07cf49ee42992d2867c"] - .unchecked_into(), - //5DnsSy8a8pfE2aFjKBDtKw7WM1V4nfE5sLzP15MNTka53GqS - hex!["4c64d3f06d28adeb36a892fdaccecace150bec891f04694448a60b74fa469c22"] - .unchecked_into(), - //5CZdFnyzZvKetZTeUwj5APAYskVJe4QFiTezo5dQNsrnehGd - hex!["160ea09c5717270e958a3da42673fa011613a9539b2e4ebcad8626bc117ca04a"] - .unchecked_into(), - //5HgoR9JJkdBusxKrrs3zgd3ToppgNoGj1rDyAJp4e7eZiYyT - hex!["020019a8bb188f8145d02fa855e9c36e9914457d37c500e03634b5223aa5702474"] - .unchecked_into(), - ), - ( - //5HinEonzr8MywkqedcpsmwpxKje2jqr9miEwuzyFXEBCvVXM - hex!["fa373e25a1c4fe19c7148acde13bc3db1811cf656dc086820f3dda736b9c4a00"].into(), - //5EHJbj6Td6ks5HDnyfN4ttTSi57osxcQsQexm7XpazdeqtV7 - hex!["62145d721967bd88622d08625f0f5681463c0f1b8bcd97eb3c2c53f7660fd513"].into(), - //5EeCsC58XgJ1DFaoYA1WktEpP27jvwGpKdxPMFjicpLeYu96 - hex!["720537e2c1c554654d73b3889c3ef4c3c2f95a65dd3f7c185ebe4afebed78372"] - .unchecked_into(), - //5DnEySxbnppWEyN8cCLqvGjAorGdLRg2VmkY96dbJ1LHFK8N - hex!["4bea0b37e0cce9bddd80835fa2bfd5606f5dcfb8388bbb10b10c483f0856cf14"] - .unchecked_into(), - //5CAC278tFCHAeHYqE51FTWYxHmeLcENSS1RG77EFRTvPZMJT - hex!["042f07fc5268f13c026bbe199d63e6ac77a0c2a780f71cda05cee5a6f1b3f11f"] - .unchecked_into(), - //5HjRTLWcQjZzN3JDvaj1UzjNSayg5ZD9ZGWMstaL7Ab2jjAa - hex!["fab485e87ed1537d089df521edf983a777c57065a702d7ed2b6a2926f31da74f"] - .unchecked_into(), - //5ELv74v7QcsS6FdzvG4vL2NnYDGWmRnJUSMKYwdyJD7Xcdi7 - hex!["64d59feddb3d00316a55906953fb3db8985797472bd2e6c7ea1ab730cc339d7f"] - .unchecked_into(), - //5FaUcPt4fPz93vBhcrCJqmDkjYZ7jCbzAF56QJoCmvPaKrmx - hex!["033f1a6d47fe86f88934e4b83b9fae903b92b5dcf4fec97d5e3e8bf4f39df03685"] - .unchecked_into(), - ), - ( - //5Ey3NQ3dfabaDc16NUv7wRLsFCMDFJSqZFzKVycAsWuUC6Di - hex!["8062e9c21f1d92926103119f7e8153cebdb1e5ab3e52d6f395be80bb193eab47"].into(), - //5HiWsuSBqt8nS9pnggexXuHageUifVPKPHDE2arTKqhTp1dV - hex!["fa0388fa88f3f0cb43d583e2571fbc0edad57dff3a6fd89775451dd2c2b8ea00"].into(), - //5H168nKX2Yrfo3bxj7rkcg25326Uv3CCCnKUGK6uHdKMdPt8 - hex!["da6b2df18f0f9001a6dcf1d301b92534fe9b1f3ccfa10c49449fee93adaa8349"] - .unchecked_into(), - //5DrA2fZdzmNqT5j6DXNwVxPBjDV9jhkAqvjt6Us3bQHKy3cF - hex!["4ee66173993dd0db5d628c4c9cb61a27b76611ad3c3925947f0d0011ee2c5dcc"] - .unchecked_into(), - //5Gx6YeNhynqn8qkda9QKpc9S7oDr4sBrfAu516d3sPpEt26F - hex!["d822d4088b20dca29a580a577a97d6f024bb24c9550bebdfd7d2d18e946a1c7d"] - .unchecked_into(), - //5DhDcHqwxoes5s89AyudGMjtZXx1nEgrk5P45X88oSTR3iyx - hex!["481538f8c2c011a76d7d57db11c2789a5e83b0f9680dc6d26211d2f9c021ae4c"] - .unchecked_into(), - //5DqAvikdpfRdk5rR35ZobZhqaC5bJXZcEuvzGtexAZP1hU3T - hex!["4e262811acdfe94528bfc3c65036080426a0e1301b9ada8d687a70ffcae99c26"] - .unchecked_into(), - //5E41Znrr2YtZu8bZp3nvRuLVHg3jFksfQ3tXuviLku4wsao7 - hex!["025e84e95ed043e387ddb8668176b42f8e2773ddd84f7f58a6d9bf436a4b527986"] - .unchecked_into(), - ), - ]; - - const ENDOWMENT: u128 = 1_000_000 * ROC; - const STASH: u128 = 100 * ROC; - - serde_json::json!({ - "balances": { - "balances": endowed_accounts - .iter() - .map(|k: &AccountId| (k.clone(), ENDOWMENT)) - .chain(initial_authorities.iter().map(|x| (x.0.clone(), STASH))) - .collect::>(), - }, - "session": { - "keys": initial_authorities - .iter() - .map(|x| { - ( - x.0.clone(), - x.0.clone(), - rococo_session_keys( - x.2.clone(), - x.3.clone(), - x.4.clone(), - x.5.clone(), - x.6.clone(), - x.7.clone(), - ), - ) - }) - .collect::>(), - }, - "babe": { - "epochConfig": Some(rococo_runtime::BABE_GENESIS_EPOCH_CONFIG), - }, - "sudo": { "key": Some(endowed_accounts[0].clone()) }, - "configuration": { - "config": default_parachains_host_configuration(), - }, - "registrar": { - "nextFreeParaId": polkadot_primitives::LOWEST_PUBLIC_ID, - }, - }) -} - /// Westend staging testnet config. #[cfg(feature = "westend-native")] pub fn westend_staging_testnet_config() -> Result { @@ -669,7 +402,7 @@ pub fn rococo_staging_testnet_config() -> Result { .with_name("Rococo Staging Testnet") .with_id("rococo_staging_testnet") .with_chain_type(ChainType::Live) - .with_genesis_config_patch(rococo_staging_testnet_config_genesis()) + .with_genesis_config_preset_name("staging_testnet") .with_telemetry_endpoints( TelemetryEndpoints::new(vec![(ROCOCO_STAGING_TELEMETRY_URL.to_string(), 0)]) .expect("Rococo Staging telemetry url is valid; qed"), @@ -699,7 +432,7 @@ pub fn versi_staging_testnet_config() -> Result { .with_name("Versi Staging Testnet") .with_id("versi_staging_testnet") .with_chain_type(ChainType::Live) - .with_genesis_config_patch(rococo_staging_testnet_config_genesis()) + .with_genesis_config_preset_name("staging_testnet") .with_telemetry_endpoints( TelemetryEndpoints::new(vec![(VERSI_STAGING_TELEMETRY_URL.to_string(), 0)]) .expect("Versi Staging telemetry url is valid; qed"), @@ -756,7 +489,7 @@ pub fn get_authority_keys_from_seed_no_beefy( ) } -#[cfg(any(feature = "westend-native", feature = "rococo-native"))] +#[cfg(feature = "westend-native")] fn testnet_accounts() -> Vec { vec![ get_account_id_from_seed::("Alice"), @@ -842,65 +575,6 @@ pub fn westend_testnet_genesis( }) } -/// Helper function to create rococo runtime `GenesisConfig` patch for testing -#[cfg(feature = "rococo-native")] -pub fn rococo_testnet_genesis( - initial_authorities: Vec<( - AccountId, - AccountId, - BabeId, - GrandpaId, - ValidatorId, - AssignmentId, - AuthorityDiscoveryId, - BeefyId, - )>, - root_key: AccountId, - endowed_accounts: Option>, -) -> serde_json::Value { - let endowed_accounts: Vec = endowed_accounts.unwrap_or_else(testnet_accounts); - - const ENDOWMENT: u128 = 1_000_000 * ROC; - - serde_json::json!({ - "balances": { - "balances": endowed_accounts.iter().map(|k| (k.clone(), ENDOWMENT)).collect::>(), - }, - "session": { - "keys": initial_authorities - .iter() - .map(|x| { - ( - x.0.clone(), - x.0.clone(), - rococo_session_keys( - x.2.clone(), - x.3.clone(), - x.4.clone(), - x.5.clone(), - x.6.clone(), - x.7.clone(), - ), - ) - }) - .collect::>(), - }, - "babe": { - "epochConfig": Some(rococo_runtime::BABE_GENESIS_EPOCH_CONFIG), - }, - "sudo": { "key": Some(root_key.clone()) }, - "configuration": { - "config": polkadot_runtime_parachains::configuration::HostConfiguration { - max_validators_per_core: Some(1), - ..default_parachains_host_configuration() - }, - }, - "registrar": { - "nextFreeParaId": polkadot_primitives::LOWEST_PUBLIC_ID, - } - }) -} - #[cfg(feature = "westend-native")] fn westend_development_config_genesis() -> serde_json::Value { westend_testnet_genesis( @@ -910,15 +584,6 @@ fn westend_development_config_genesis() -> serde_json::Value { ) } -#[cfg(feature = "rococo-native")] -fn rococo_development_config_genesis() -> serde_json::Value { - rococo_testnet_genesis( - vec![get_authority_keys_from_seed("Alice")], - get_account_id_from_seed::("Alice"), - None, - ) -} - /// Westend development config (single validator Alice) #[cfg(feature = "westend-native")] pub fn westend_development_config() -> Result { @@ -944,7 +609,7 @@ pub fn rococo_development_config() -> Result { .with_name("Development") .with_id("rococo_dev") .with_chain_type(ChainType::Development) - .with_genesis_config_patch(rococo_development_config_genesis()) + .with_genesis_config_preset_name("development") .with_protocol_id(DEFAULT_PROTOCOL_ID) .build()) } @@ -959,7 +624,7 @@ pub fn versi_development_config() -> Result { .with_name("Development") .with_id("versi_dev") .with_chain_type(ChainType::Development) - .with_genesis_config_patch(rococo_development_config_genesis()) + .with_genesis_config_preset_name("development") .with_protocol_id("versi") .build()) } @@ -975,7 +640,7 @@ pub fn wococo_development_config() -> Result { .with_name("Development") .with_id("wococo_dev") .with_chain_type(ChainType::Development) - .with_genesis_config_patch(rococo_development_config_genesis()) + .with_genesis_config_preset_name("development") .with_protocol_id(WOCOCO_DEV_PROTOCOL_ID) .build()) } @@ -1004,15 +669,6 @@ pub fn westend_local_testnet_config() -> Result { .build()) } -#[cfg(feature = "rococo-native")] -fn rococo_local_testnet_genesis() -> serde_json::Value { - rococo_testnet_genesis( - vec![get_authority_keys_from_seed("Alice"), get_authority_keys_from_seed("Bob")], - get_account_id_from_seed::("Alice"), - None, - ) -} - /// Rococo local testnet config (multivalidator Alice + Bob) #[cfg(feature = "rococo-native")] pub fn rococo_local_testnet_config() -> Result { @@ -1023,26 +679,11 @@ pub fn rococo_local_testnet_config() -> Result { .with_name("Rococo Local Testnet") .with_id("rococo_local_testnet") .with_chain_type(ChainType::Local) - .with_genesis_config_patch(rococo_local_testnet_genesis()) + .with_genesis_config_preset_name("local_testnet") .with_protocol_id(DEFAULT_PROTOCOL_ID) .build()) } -/// Wococo is a temporary testnet that uses almost the same runtime as rococo. -#[cfg(feature = "rococo-native")] -fn wococo_local_testnet_genesis() -> serde_json::Value { - rococo_testnet_genesis( - vec![ - get_authority_keys_from_seed("Alice"), - get_authority_keys_from_seed("Bob"), - get_authority_keys_from_seed("Charlie"), - get_authority_keys_from_seed("Dave"), - ], - get_account_id_from_seed::("Alice"), - None, - ) -} - /// Wococo local testnet config (multivalidator Alice + Bob + Charlie + Dave) #[cfg(feature = "rococo-native")] pub fn wococo_local_testnet_config() -> Result { @@ -1053,26 +694,11 @@ pub fn wococo_local_testnet_config() -> Result { .with_name("Wococo Local Testnet") .with_id("wococo_local_testnet") .with_chain_type(ChainType::Local) - .with_genesis_config_patch(wococo_local_testnet_genesis()) + .with_genesis_config_preset_name("wococo_local_testnet") .with_protocol_id(DEFAULT_PROTOCOL_ID) .build()) } -/// `Versi` is a temporary testnet that uses the same runtime as rococo. -#[cfg(feature = "rococo-native")] -fn versi_local_testnet_genesis() -> serde_json::Value { - rococo_testnet_genesis( - vec![ - get_authority_keys_from_seed("Alice"), - get_authority_keys_from_seed("Bob"), - get_authority_keys_from_seed("Charlie"), - get_authority_keys_from_seed("Dave"), - ], - get_account_id_from_seed::("Alice"), - None, - ) -} - /// `Versi` local testnet config (multivalidator Alice + Bob + Charlie + Dave) #[cfg(feature = "rococo-native")] pub fn versi_local_testnet_config() -> Result { @@ -1083,7 +709,7 @@ pub fn versi_local_testnet_config() -> Result { .with_name("Versi Local Testnet") .with_id("versi_local_testnet") .with_chain_type(ChainType::Local) - .with_genesis_config_patch(versi_local_testnet_genesis()) + .with_genesis_config_preset_name("versi_local_testnet") .with_protocol_id("versi") .build()) } diff --git a/polkadot/node/service/src/fake_runtime_api.rs b/polkadot/node/service/src/fake_runtime_api.rs index ccc3da22400dfc38f5e94aa4f6e89969499dbee8..c6cfb7a27d042bdf9e1b23cd41f88b8483a414a5 100644 --- a/polkadot/node/service/src/fake_runtime_api.rs +++ b/polkadot/node/service/src/fake_runtime_api.rs @@ -30,6 +30,7 @@ use polkadot_primitives::{ ScrapedOnChainVotes, SessionIndex, SessionInfo, ValidationCode, ValidationCodeHash, ValidatorId, ValidatorIndex, ValidatorSignature, }; + use sp_core::OpaqueMetadata; use sp_runtime::{ traits::Block as BlockT, @@ -39,7 +40,7 @@ use sp_runtime::{ use sp_version::RuntimeVersion; use sp_weights::Weight; use std::collections::BTreeMap; - +use xcm::{VersionedAssetId, VersionedAssets, VersionedLocation, VersionedXcm}; sp_api::decl_runtime_apis! { /// This runtime API is only implemented for the test runtime! pub trait GetLastTimestamp { @@ -60,7 +61,7 @@ sp_api::impl_runtime_apis! { unimplemented!() } - fn initialize_block(_: &::Header) { + fn initialize_block(_: &::Header) -> sp_runtime::ExtrinsicInclusionMode { unimplemented!() } } @@ -396,4 +397,22 @@ sp_api::impl_runtime_apis! { unimplemented!() } } + + impl xcm_fee_payment_runtime_api::XcmPaymentApi for Runtime { + fn query_acceptable_payment_assets(_: xcm::Version) -> Result, xcm_fee_payment_runtime_api::Error> { + unimplemented!() + } + + fn query_weight_to_asset_fee(_: Weight, _: VersionedAssetId) -> Result { + unimplemented!() + } + + fn query_xcm_weight(_: VersionedXcm<()>) -> Result { + unimplemented!() + } + + fn query_delivery_fees(_: VersionedLocation, _: VersionedXcm<()>) -> Result { + unimplemented!() + } + } } diff --git a/polkadot/node/service/src/lib.rs b/polkadot/node/service/src/lib.rs index 6dcdec07ca84bd0fe9456e2bc29cbdf6cee6a9f8..22231c84b1d9c377c24bf689e7c5a88d40dba62b 100644 --- a/polkadot/node/service/src/lib.rs +++ b/polkadot/node/service/src/lib.rs @@ -92,6 +92,7 @@ pub use chain_spec::{GenericChainSpec, RococoChainSpec, WestendChainSpec}; pub use consensus_common::{Proposal, SelectChain}; use frame_benchmarking_cli::SUBSTRATE_REFERENCE_HARDWARE; use mmr_gadget::MmrGadget; +use polkadot_node_subsystem_types::DefaultSubsystemClient; pub use polkadot_primitives::{Block, BlockId, BlockNumber, CollatorPair, Hash, Id as ParaId}; pub use sc_client_api::{Backend, CallExecutor}; pub use sc_consensus::{BlockImport, LongestChain}; @@ -654,7 +655,7 @@ pub struct NewFull { pub task_manager: TaskManager, pub client: Arc, pub overseer_handle: Option, - pub network: Arc::Hash>>, + pub network: Arc, pub sync_service: Arc>, pub rpc_handlers: RpcHandlers, pub backend: Arc, @@ -718,7 +719,10 @@ pub const AVAILABILITY_CONFIG: AvailabilityConfig = AvailabilityConfig { /// searched. If the path points to an executable rather then directory, that executable is used /// both as preparation and execution worker (supposed to be used for tests only). #[cfg(feature = "full-node")] -pub fn new_full( +pub fn new_full< + OverseerGenerator: OverseerGen, + Network: sc_network::NetworkBackend::Hash>, +>( mut config: Configuration, NewFullParams { is_parachain_node, @@ -804,18 +808,29 @@ pub fn new_full( other: (rpc_extensions_builder, import_setup, rpc_setup, slot_duration, mut telemetry), } = new_partial::>(&mut config, basics, select_chain)?; + let metrics = Network::register_notification_metrics( + config.prometheus_config.as_ref().map(|cfg| &cfg.registry), + ); let shared_voter_state = rpc_setup; let auth_disc_publish_non_global_ips = config.network.allow_non_globals_in_dht; - let mut net_config = sc_network::config::FullNetworkConfiguration::new(&config.network); + let auth_disc_public_addresses = config.network.public_addresses.clone(); + + let mut net_config = + sc_network::config::FullNetworkConfiguration::<_, _, Network>::new(&config.network); let genesis_hash = client.block_hash(0).ok().flatten().expect("Genesis block exists; qed"); + let peer_store_handle = net_config.peer_store_handle(); // Note: GrandPa is pushed before the Polkadot-specific protocols. This doesn't change // anything in terms of behaviour, but makes the logs more consistent with the other // Substrate nodes. let grandpa_protocol_name = grandpa::protocol_standard_name(&genesis_hash, &config.chain_spec); let (grandpa_protocol_config, grandpa_notification_service) = - grandpa::grandpa_peers_set_config(grandpa_protocol_name.clone()); + grandpa::grandpa_peers_set_config::<_, Network>( + grandpa_protocol_name.clone(), + metrics.clone(), + Arc::clone(&peer_store_handle), + ); net_config.add_notification_protocol(grandpa_protocol_config); let beefy_gossip_proto_name = @@ -823,7 +838,7 @@ pub fn new_full( // `beefy_on_demand_justifications_handler` is given to `beefy-gadget` task to be run, // while `beefy_req_resp_cfg` is added to `config.network.request_response_protocols`. let (beefy_on_demand_justifications_handler, beefy_req_resp_cfg) = - beefy::communication::request_response::BeefyJustifsRequestHandler::new( + beefy::communication::request_response::BeefyJustifsRequestHandler::new::<_, Network>( &genesis_hash, config.chain_spec.fork_id(), client.clone(), @@ -833,7 +848,11 @@ pub fn new_full( false => None, true => { let (beefy_notification_config, beefy_notification_service) = - beefy::communication::beefy_peers_set_config(beefy_gossip_proto_name.clone()); + beefy::communication::beefy_peers_set_config::<_, Network>( + beefy_gossip_proto_name.clone(), + metrics.clone(), + Arc::clone(&peer_store_handle), + ); net_config.add_notification_protocol(beefy_notification_config); net_config.add_request_response_protocol(beefy_req_resp_cfg); @@ -855,13 +874,18 @@ pub fn new_full( use polkadot_network_bridge::{peer_sets_info, IsAuthority}; let is_authority = if role.is_authority() { IsAuthority::Yes } else { IsAuthority::No }; - peer_sets_info(is_authority, &peerset_protocol_names) - .into_iter() - .map(|(config, (peerset, service))| { - net_config.add_notification_protocol(config); - (peerset, service) - }) - .collect::>>() + peer_sets_info::<_, Network>( + is_authority, + &peerset_protocol_names, + metrics.clone(), + Arc::clone(&peer_store_handle), + ) + .into_iter() + .map(|(config, (peerset, service))| { + net_config.add_notification_protocol(config); + (peerset, service) + }) + .collect::>>() } else { std::collections::HashMap::new() }; @@ -869,17 +893,19 @@ pub fn new_full( let req_protocol_names = ReqProtocolNames::new(&genesis_hash, config.chain_spec.fork_id()); let (collation_req_v1_receiver, cfg) = - IncomingRequest::get_config_receiver(&req_protocol_names); + IncomingRequest::get_config_receiver::<_, Network>(&req_protocol_names); net_config.add_request_response_protocol(cfg); let (collation_req_v2_receiver, cfg) = - IncomingRequest::get_config_receiver(&req_protocol_names); + IncomingRequest::get_config_receiver::<_, Network>(&req_protocol_names); net_config.add_request_response_protocol(cfg); let (available_data_req_receiver, cfg) = - IncomingRequest::get_config_receiver(&req_protocol_names); + IncomingRequest::get_config_receiver::<_, Network>(&req_protocol_names); net_config.add_request_response_protocol(cfg); - let (pov_req_receiver, cfg) = IncomingRequest::get_config_receiver(&req_protocol_names); + let (pov_req_receiver, cfg) = + IncomingRequest::get_config_receiver::<_, Network>(&req_protocol_names); net_config.add_request_response_protocol(cfg); - let (chunk_req_receiver, cfg) = IncomingRequest::get_config_receiver(&req_protocol_names); + let (chunk_req_receiver, cfg) = + IncomingRequest::get_config_receiver::<_, Network>(&req_protocol_names); net_config.add_request_response_protocol(cfg); let grandpa_hard_forks = if config.chain_spec.is_kusama() { @@ -922,12 +948,13 @@ pub fn new_full( None }; let (statement_req_receiver, cfg) = - IncomingRequest::get_config_receiver(&req_protocol_names); + IncomingRequest::get_config_receiver::<_, Network>(&req_protocol_names); net_config.add_request_response_protocol(cfg); let (candidate_req_v2_receiver, cfg) = - IncomingRequest::get_config_receiver(&req_protocol_names); + IncomingRequest::get_config_receiver::<_, Network>(&req_protocol_names); net_config.add_request_response_protocol(cfg); - let (dispute_req_receiver, cfg) = IncomingRequest::get_config_receiver(&req_protocol_names); + let (dispute_req_receiver, cfg) = + IncomingRequest::get_config_receiver::<_, Network>(&req_protocol_names); net_config.add_request_response_protocol(cfg); let approval_voting_config = ApprovalVotingConfig { col_approval_data: parachains_db::REAL_COLUMNS.col_approval_data, @@ -968,6 +995,7 @@ pub fn new_full( block_announce_validator_builder: None, warp_sync_params: Some(WarpSyncParams::WithProvider(warp_sync)), block_relay: None, + metrics, })?; if config.offchain_worker.enabled { @@ -983,7 +1011,7 @@ pub fn new_full( transaction_pool: Some(OffchainTransactionPoolFactory::new( transaction_pool.clone(), )), - network_provider: network.clone(), + network_provider: Arc::new(network.clone()), is_validator: role.is_authority(), enable_http_requests: false, custom_extensions: move |_| vec![], @@ -1060,12 +1088,13 @@ pub fn new_full( let (worker, service) = sc_authority_discovery::new_worker_and_service_with_config( sc_authority_discovery::WorkerConfig { publish_non_global_ips: auth_disc_publish_non_global_ips, + public_addresses: auth_disc_public_addresses, // Require that authority discovery records are signed. strict_record_validation: true, ..Default::default() }, client.clone(), - network.clone(), + Arc::new(network.clone()), Box::pin(dht_event_stream), authority_discovery_role, prometheus_registry.clone(), @@ -1081,12 +1110,17 @@ pub fn new_full( None }; + let runtime_client = Arc::new(DefaultSubsystemClient::new( + overseer_client.clone(), + OffchainTransactionPoolFactory::new(transaction_pool.clone()), + )); + let overseer_handle = if let Some(authority_discovery_service) = authority_discovery_service { let (overseer, overseer_handle) = overseer_gen - .generate::( + .generate::>( overseer_connector, OverseerGenArgs { - runtime_client: overseer_client.clone(), + runtime_client, network_service: network.clone(), sync_service: sync_service.clone(), authority_discovery_service, @@ -1099,9 +1133,6 @@ pub fn new_full( overseer_message_channel_capacity_override, req_protocol_names, peerset_protocol_names, - offchain_transaction_pool_factory: OffchainTransactionPoolFactory::new( - transaction_pool.clone(), - ), notification_services, }, ext_overseer_args, @@ -1209,7 +1240,7 @@ pub fn new_full( if let Some(notification_service) = beefy_notification_service { let justifications_protocol_name = beefy_on_demand_justifications_handler.protocol_name(); let network_params = beefy::BeefyNetworkParams { - network: network.clone(), + network: Arc::new(network.clone()), sync: sync_service.clone(), gossip_protocol_name: beefy_gossip_proto_name, justifications_protocol_name, @@ -1228,6 +1259,7 @@ pub fn new_full( prometheus_registry: prometheus_registry.clone(), links: beefy_links, on_demand_justifications_handler: beefy_on_demand_justifications_handler, + is_authority: role.is_authority(), }; let gadget = beefy::start_beefy_gadget::<_, _, _, _, _, _, _>(beefy_params); @@ -1237,18 +1269,18 @@ pub fn new_full( task_manager .spawn_essential_handle() .spawn_blocking("beefy-gadget", None, gadget); - // When offchain indexing is enabled, MMR gadget should also run. - if is_offchain_indexing_enabled { - task_manager.spawn_essential_handle().spawn_blocking( - "mmr-gadget", - None, - MmrGadget::start( - client.clone(), - backend.clone(), - sp_mmr_primitives::INDEXING_PREFIX.to_vec(), - ), - ); - } + } + // When offchain indexing is enabled, MMR gadget should also run. + if is_offchain_indexing_enabled { + task_manager.spawn_essential_handle().spawn_blocking( + "mmr-gadget", + None, + MmrGadget::start( + client.clone(), + backend.clone(), + sp_mmr_primitives::INDEXING_PREFIX.to_vec(), + ), + ); } let config = grandpa::Config { @@ -1377,7 +1409,12 @@ pub fn build_full( capacity }); - new_full(config, params) + match config.network.network_backend { + sc_network::config::NetworkBackendType::Libp2p => + new_full::<_, sc_network::NetworkWorker>(config, params), + sc_network::config::NetworkBackendType::Litep2p => + new_full::<_, sc_network::Litep2pNetworkBackend>(config, params), + } } /// Reverts the node state down to at most the last finalized block. diff --git a/polkadot/node/service/src/overseer.rs b/polkadot/node/service/src/overseer.rs index b2b0786bfc24e5f702ddd82aec0676f0f9f795a8..26b1446bf515afa342bd53c6237a87e7e750022d 100644 --- a/polkadot/node/service/src/overseer.rs +++ b/polkadot/node/service/src/overseer.rs @@ -14,10 +14,9 @@ // You should have received a copy of the GNU General Public License // along with Polkadot. If not, see . -use super::{AuthorityDiscoveryApi, Block, Error, Hash, IsParachainNode, Registry}; -use polkadot_node_subsystem_types::DefaultSubsystemClient; +use super::{Error, IsParachainNode, Registry}; +use polkadot_node_subsystem_types::{ChainApiBackend, RuntimeApiSubsystemClient}; use polkadot_overseer::{DummySubsystem, InitializedOverseerBuilder, SubsystemError}; -use sc_transaction_pool_api::OffchainTransactionPoolFactory; use sp_core::traits::SpawnNamed; use polkadot_availability_distribution::IncomingRequestReceivers; @@ -40,14 +39,10 @@ use polkadot_overseer::{ }; use parking_lot::Mutex; -use polkadot_primitives::runtime_api::ParachainHost; use sc_authority_discovery::Service as AuthorityDiscoveryService; use sc_client_api::AuxStore; use sc_keystore::LocalKeystore; use sc_network::{NetworkStateInfo, NotificationService}; -use sp_api::ProvideRuntimeApi; -use sp_blockchain::HeaderBackend; -use sp_consensus_babe::BabeApi; use std::{collections::HashMap, sync::Arc}; pub use polkadot_approval_distribution::ApprovalDistribution as ApprovalDistributionSubsystem; @@ -80,16 +75,14 @@ pub use polkadot_statement_distribution::StatementDistributionSubsystem; /// Arguments passed for overseer construction. pub struct OverseerGenArgs<'a, Spawner, RuntimeClient> where - RuntimeClient: 'static + ProvideRuntimeApi + HeaderBackend + AuxStore, - RuntimeClient::Api: ParachainHost + BabeApi + AuthorityDiscoveryApi, Spawner: 'static + SpawnNamed + Clone + Unpin, { - /// Runtime client generic, providing the `ProvieRuntimeApi` trait besides others. + /// Runtime client generic, providing the `ProvideRuntimeApi` trait besides others. pub runtime_client: Arc, /// Underlying network service implementation. - pub network_service: Arc>, + pub network_service: Arc, /// Underlying syncing service implementation. - pub sync_service: Arc>, + pub sync_service: Arc, /// Underlying authority discovery service. pub authority_discovery_service: AuthorityDiscoveryService, /// Collations request receiver for network protocol v1. @@ -111,8 +104,6 @@ where pub req_protocol_names: ReqProtocolNames, /// `PeerSet` protocol names to protocols mapping. pub peerset_protocol_names: PeerSetProtocolNames, - /// The offchain transaction pool factory. - pub offchain_transaction_pool_factory: OffchainTransactionPoolFactory, /// Notification services for validation/collation protocols. pub notification_services: HashMap>, } @@ -160,7 +151,6 @@ pub fn validator_overseer_builder( overseer_message_channel_capacity_override, req_protocol_names, peerset_protocol_names, - offchain_transaction_pool_factory, notification_services, }: OverseerGenArgs, ExtendedOverseerGenArgs { @@ -180,7 +170,7 @@ pub fn validator_overseer_builder( ) -> Result< InitializedOverseerBuilder< SpawnGlue, - Arc>, + Arc, CandidateValidationSubsystem, PvfCheckerSubsystem, CandidateBackingSubsystem, @@ -190,14 +180,14 @@ pub fn validator_overseer_builder( BitfieldSigningSubsystem, BitfieldDistributionSubsystem, ProvisionerSubsystem, - RuntimeApiSubsystem>, + RuntimeApiSubsystem, AvailabilityStoreSubsystem, NetworkBridgeRxSubsystem< - Arc>, + Arc, AuthorityDiscoveryService, >, NetworkBridgeTxSubsystem< - Arc>, + Arc, AuthorityDiscoveryService, >, ChainApiSubsystem, @@ -214,8 +204,7 @@ pub fn validator_overseer_builder( Error, > where - RuntimeClient: 'static + ProvideRuntimeApi + HeaderBackend + AuxStore, - RuntimeClient::Api: ParachainHost + BabeApi + AuthorityDiscoveryApi, + RuntimeClient: RuntimeApiSubsystemClient + ChainApiBackend + AuxStore + 'static, Spawner: 'static + SpawnNamed + Clone + Unpin, { use polkadot_node_subsystem_util::metrics::Metrics; @@ -227,11 +216,6 @@ where let network_bridge_metrics: NetworkBridgeMetrics = Metrics::register(registry)?; - let runtime_api_client = Arc::new(DefaultSubsystemClient::new( - runtime_client.clone(), - offchain_transaction_pool_factory, - )); - let builder = Overseer::builder() .network_bridge_tx(NetworkBridgeTxSubsystem::new( network_service.clone(), @@ -298,7 +282,7 @@ where }) .provisioner(ProvisionerSubsystem::new(Metrics::register(registry)?)) .runtime_api(RuntimeApiSubsystem::new( - runtime_api_client.clone(), + runtime_client.clone(), Metrics::register(registry)?, spawner.clone(), )) @@ -339,7 +323,7 @@ where .activation_external_listeners(Default::default()) .span_per_active_leaf(Default::default()) .active_leaves(Default::default()) - .supports_parachains(runtime_api_client) + .supports_parachains(runtime_client) .metrics(metrics) .spawner(spawner); @@ -367,13 +351,12 @@ pub fn collator_overseer_builder( overseer_message_channel_capacity_override, req_protocol_names, peerset_protocol_names, - offchain_transaction_pool_factory, notification_services, }: OverseerGenArgs, ) -> Result< InitializedOverseerBuilder< SpawnGlue, - Arc>, + Arc, DummySubsystem, DummySubsystem, DummySubsystem, @@ -383,14 +366,14 @@ pub fn collator_overseer_builder( DummySubsystem, DummySubsystem, DummySubsystem, - RuntimeApiSubsystem>, + RuntimeApiSubsystem, DummySubsystem, NetworkBridgeRxSubsystem< - Arc>, + Arc, AuthorityDiscoveryService, >, NetworkBridgeTxSubsystem< - Arc>, + Arc, AuthorityDiscoveryService, >, ChainApiSubsystem, @@ -407,24 +390,17 @@ pub fn collator_overseer_builder( Error, > where - RuntimeClient: 'static + ProvideRuntimeApi + HeaderBackend + AuxStore, - RuntimeClient::Api: ParachainHost + BabeApi + AuthorityDiscoveryApi, Spawner: 'static + SpawnNamed + Clone + Unpin, + RuntimeClient: RuntimeApiSubsystemClient + ChainApiBackend + AuxStore + 'static, { use polkadot_node_subsystem_util::metrics::Metrics; - let metrics = ::register(registry)?; let notification_sinks = Arc::new(Mutex::new(HashMap::new())); let spawner = SpawnGlue(spawner); let network_bridge_metrics: NetworkBridgeMetrics = Metrics::register(registry)?; - let runtime_api_client = Arc::new(DefaultSubsystemClient::new( - runtime_client.clone(), - offchain_transaction_pool_factory, - )); - let builder = Overseer::builder() .network_bridge_tx(NetworkBridgeTxSubsystem::new( network_service.clone(), @@ -475,7 +451,7 @@ where }) .provisioner(DummySubsystem) .runtime_api(RuntimeApiSubsystem::new( - runtime_api_client.clone(), + runtime_client.clone(), Metrics::register(registry)?, spawner.clone(), )) @@ -490,8 +466,8 @@ where .activation_external_listeners(Default::default()) .span_per_active_leaf(Default::default()) .active_leaves(Default::default()) - .supports_parachains(runtime_api_client) - .metrics(metrics) + .supports_parachains(runtime_client) + .metrics(Metrics::register(registry)?) .spawner(spawner); let builder = if let Some(capacity) = overseer_message_channel_capacity_override { @@ -510,13 +486,9 @@ pub trait OverseerGen { connector: OverseerConnector, args: OverseerGenArgs, ext_args: Option, - ) -> Result< - (Overseer, Arc>>, OverseerHandle), - Error, - > + ) -> Result<(Overseer, Arc>, OverseerHandle), Error> where - RuntimeClient: 'static + ProvideRuntimeApi + HeaderBackend + AuxStore, - RuntimeClient::Api: ParachainHost + BabeApi + AuthorityDiscoveryApi, + RuntimeClient: RuntimeApiSubsystemClient + ChainApiBackend + AuxStore + 'static, Spawner: 'static + SpawnNamed + Clone + Unpin; // It would be nice to make `create_subsystems` part of this trait, @@ -533,13 +505,9 @@ impl OverseerGen for ValidatorOverseerGen { connector: OverseerConnector, args: OverseerGenArgs, ext_args: Option, - ) -> Result< - (Overseer, Arc>>, OverseerHandle), - Error, - > + ) -> Result<(Overseer, Arc>, OverseerHandle), Error> where - RuntimeClient: 'static + ProvideRuntimeApi + HeaderBackend + AuxStore, - RuntimeClient::Api: ParachainHost + BabeApi + AuthorityDiscoveryApi, + RuntimeClient: RuntimeApiSubsystemClient + ChainApiBackend + AuxStore + 'static, Spawner: 'static + SpawnNamed + Clone + Unpin, { let ext_args = ext_args.ok_or(Error::Overseer(SubsystemError::Context( @@ -561,13 +529,9 @@ impl OverseerGen for CollatorOverseerGen { connector: OverseerConnector, args: OverseerGenArgs, _ext_args: Option, - ) -> Result< - (Overseer, Arc>>, OverseerHandle), - Error, - > + ) -> Result<(Overseer, Arc>, OverseerHandle), Error> where - RuntimeClient: 'static + ProvideRuntimeApi + HeaderBackend + AuxStore, - RuntimeClient::Api: ParachainHost + BabeApi + AuthorityDiscoveryApi, + RuntimeClient: RuntimeApiSubsystemClient + ChainApiBackend + AuxStore + 'static, Spawner: 'static + SpawnNamed + Clone + Unpin, { collator_overseer_builder(args)? diff --git a/polkadot/node/service/src/parachains_db/upgrade.rs b/polkadot/node/service/src/parachains_db/upgrade.rs index d22eebb5c8d4edebdd2174f3cb1ba144fea0b130..4d7370859609d5559eb9f3b440bb6b4ee28cddff 100644 --- a/polkadot/node/service/src/parachains_db/upgrade.rs +++ b/polkadot/node/service/src/parachains_db/upgrade.rs @@ -93,7 +93,7 @@ pub(crate) fn try_upgrade_db( } /// Try upgrading parachain's database to the next version. -/// If successfull, it returns the current version. +/// If successful, it returns the current version. pub(crate) fn try_upgrade_db_to_next_version( db_path: &Path, db_kind: DatabaseKind, @@ -115,7 +115,7 @@ pub(crate) fn try_upgrade_db_to_next_version( Some(CURRENT_VERSION) => CURRENT_VERSION, // This is an arbitrary future version, we don't handle it. Some(v) => return Err(Error::FutureVersion { current: CURRENT_VERSION, got: v }), - // No version file. For `RocksDB` we dont need to do anything. + // No version file. For `RocksDB` we don't need to do anything. None if db_kind == DatabaseKind::RocksDB => CURRENT_VERSION, // No version file. `ParityDB` did not previously have a version defined. // We handle this as a `0 -> 1` migration. @@ -183,7 +183,7 @@ fn migrate_from_version_1_to_2(path: &Path, db_kind: DatabaseKind) -> Result { // The total lag accounting for disputes. let lag_disputes = initial_leaf_number.saturating_sub(subchain_number); diff --git a/polkadot/node/subsystem-bench/Cargo.toml b/polkadot/node/subsystem-bench/Cargo.toml index 136eccbf685482f05b34b8de20007c7ef548320d..e534ac18e4b36bdb40737d4ad7052a008c0497e7 100644 --- a/polkadot/node/subsystem-bench/Cargo.toml +++ b/polkadot/node/subsystem-bench/Cargo.toml @@ -8,9 +8,13 @@ license.workspace = true readme = "README.md" publish = false +[lib] +name = "polkadot_subsystem_bench" +path = "src/lib/lib.rs" + [[bin]] name = "subsystem-bench" -path = "src/subsystem-bench.rs" +path = "src/cli/subsystem-bench.rs" # Prevent rustdoc error. Already documented from top-level Cargo.toml. doc = false @@ -31,20 +35,20 @@ color-eyre = { version = "0.6.1", default-features = false } polkadot-overseer = { path = "../overseer" } colored = "2.0.4" assert_matches = "1.5" -async-trait = "0.1.57" +async-trait = "0.1.79" sp-keystore = { path = "../../../substrate/primitives/keystore" } sc-keystore = { path = "../../../substrate/client/keystore" } sp-core = { path = "../../../substrate/primitives/core" } -clap = { version = "4.4.18", features = ["derive"] } -futures = "0.3.21" +clap = { version = "4.5.3", features = ["derive"] } +futures = "0.3.30" futures-timer = "3.0.2" bincode = "1.3.3" sha1 = "0.10.6" hex = "0.4.3" gum = { package = "tracing-gum", path = "../gum" } polkadot-erasure-coding = { package = "polkadot-erasure-coding", path = "../../erasure-coding" } -log = "0.4.17" -env_logger = "0.9.0" +log = { workspace = true, default-features = true } +env_logger = "0.11" rand = "0.8.5" # `rand` only supports uniform distribution, we need normal distribution for latency. rand_distr = "0.4.3" @@ -52,12 +56,13 @@ bitvec = "1.0.1" kvdb-memorydb = "0.13.0" parity-scale-codec = { version = "3.6.1", features = ["derive", "std"] } -tokio = "1.24.2" +tokio = { version = "1.24.2", features = ["parking_lot", "rt-multi-thread"] } clap-num = "1.0.2" polkadot-node-subsystem-test-helpers = { path = "../subsystem-test-helpers" } sp-keyring = { path = "../../../substrate/primitives/keyring" } sp-application-crypto = { path = "../../../substrate/primitives/application-crypto" } sc-network = { path = "../../../substrate/client/network" } +sc-network-types = { path = "../../../substrate/client/network/types" } sc-service = { path = "../../../substrate/client/service" } sp-consensus = { path = "../../../substrate/primitives/consensus/common" } polkadot-node-metrics = { path = "../metrics" } @@ -65,8 +70,9 @@ itertools = "0.11.0" polkadot-primitives-test-helpers = { path = "../../primitives/test-helpers" } prometheus_endpoint = { package = "substrate-prometheus-endpoint", path = "../../../substrate/utils/prometheus" } prometheus = { version = "0.13.0", default-features = false } -serde = "1.0.195" -serde_yaml = "0.9" +serde = { workspace = true, default-features = true } +serde_yaml = { workspace = true } +serde_json = { workspace = true } polkadot-node-core-approval-voting = { path = "../core/approval-voting" } polkadot-approval-distribution = { path = "../network/approval-distribution" } @@ -74,8 +80,9 @@ sp-consensus-babe = { path = "../../../substrate/primitives/consensus/babe" } sp-runtime = { path = "../../../substrate/primitives/runtime", default-features = false } sp-timestamp = { path = "../../../substrate/primitives/timestamp" } -schnorrkel = { version = "0.9.1", default-features = false } -rand_core = "0.6.2" # should match schnorrkel +schnorrkel = { version = "0.11.4", default-features = false } +# rand_core should match schnorrkel +rand_core = "0.6.2" rand_chacha = { version = "0.3.1" } paste = "1.0.14" orchestra = { version = "0.3.5", default-features = false, features = ["futures_channel"] } diff --git a/polkadot/node/subsystem-bench/README.md b/polkadot/node/subsystem-bench/README.md index e090a0392cb733ffc2a4b21edc73da44e5aed708..228fba41c46cce48a2a4bda96e869f6abcba1c44 100644 --- a/polkadot/node/subsystem-bench/README.md +++ b/polkadot/node/subsystem-bench/README.md @@ -1,6 +1,6 @@ # Subsystem benchmark client -Run parachain consensus stress and performance tests on your development machine. +Run parachain consensus stress and performance tests on your development machine or in CI. ## Motivation @@ -27,12 +27,13 @@ The output binary will be placed in `target/testnet/subsystem-bench`. ### Test metrics Subsystem, CPU usage and network metrics are exposed via a prometheus endpoint during the test execution. -A small subset of these collected metrics are displayed in the CLI, but for an in depth analysys of the test results, +A small subset of these collected metrics are displayed in the CLI, but for an in depth analysis of the test results, a local Grafana/Prometheus stack is needed. ### Run Prometheus, Pyroscope and Graphana in Docker -If docker is not usable, then follow the next sections to manually install Prometheus, Pyroscope and Graphana on your machine. +If docker is not usable, then follow the next sections to manually install Prometheus, Pyroscope and Graphana +on your machine. ```bash cd polkadot/node/subsystem-bench/docker @@ -44,7 +45,7 @@ docker compose up Please follow the [official installation guide](https://prometheus.io/docs/prometheus/latest/installation/) for your platform/OS. -After succesfully installing and starting up Prometheus, we need to alter it's configuration such that it +After successfully installing and starting up Prometheus, we need to alter it's configuration such that it will scrape the benchmark prometheus endpoint `127.0.0.1:9999`. Please check the prometheus official documentation regarding the location of `prometheus.yml`. On MacOS for example the full path `/opt/homebrew/etc/prometheus.yml` @@ -95,39 +96,16 @@ If you are running the servers in Docker, use the following URLs: Follow [this guide](https://grafana.com/docs/grafana/latest/dashboards/manage-dashboards/#export-and-import-dashboards) to import the dashboards from the repository `grafana` folder. -## How to run a test - -To run a test, you need to first choose a test objective. Currently, we support the following: - -``` -target/testnet/subsystem-bench --help -The almighty Subsystem Benchmark Tool™️ - -Usage: subsystem-bench [OPTIONS] - -Commands: - data-availability-read Benchmark availability recovery strategies +### Standard test options ``` +$ subsystem-bench --help +Usage: subsystem-bench [OPTIONS] -Note: `test-sequence` is a special test objective that wraps up an arbitrary number of test objectives. It is tipically - used to run a suite of tests defined in a `yaml` file like in this [example](examples/availability_read.yaml). +Arguments: + Path to the test sequence configuration file -### Standard test options - -``` - --network The type of network to be emulated [default: ideal] [possible values: ideal, healthy, - degraded] - --n-cores Number of cores to fetch availability for [default: 100] - --n-validators Number of validators to fetch chunks from [default: 500] - --min-pov-size The minimum pov size in KiB [default: 5120] - --max-pov-size The maximum pov size bytes [default: 5120] - -n, --num-blocks The number of blocks the test is going to run [default: 1] - -p, --peer-bandwidth The bandwidth of emulated remote peers in KiB - -b, --bandwidth The bandwidth of our node in KiB - --connectivity Emulated peer connection ratio [0-100] - --peer-mean-latency Mean remote peer latency in milliseconds [0-5000] - --peer-latency-std-dev Remote peer latency standard deviation +Options: --profile Enable CPU Profiling with Pyroscope --pyroscope-url Pyroscope Server URL [default: http://localhost:4040] --pyroscope-sample-rate Pyroscope Sample Rate [default: 113] @@ -135,27 +113,17 @@ Note: `test-sequence` is a special test objective that wraps up an arbitrary num -h, --help Print help ``` -These apply to all test objectives, except `test-sequence` which relies on the values being specified in a file. - -### Test objectives - -Each test objective can have it's specific configuration options, in contrast with the standard test options. +## How to run a test -For `data-availability-read` the recovery strategy to be used is configurable. +To run a test, you need to use a path to a test objective: ``` -target/testnet/subsystem-bench data-availability-read --help -Benchmark availability recovery strategies - -Usage: subsystem-bench data-availability-read [OPTIONS] - -Options: - -f, --fetch-from-backers Turbo boost AD Read by fetching the full availability datafrom backers first. Saves CPU - as we don't need to re-construct from chunks. Tipically this is only faster if nodes - have enough bandwidth - -h, --help Print help +target/testnet/subsystem-bench polkadot/node/subsystem-bench/examples/availability_read.yaml ``` +Note: test objectives may be wrapped up into a test sequence. +It is typically used to run a suite of tests like in this [example](examples/availability_read.yaml). + ### Understanding the test configuration A single test configuration `TestConfiguration` struct applies to a single run of a certain test objective. @@ -169,42 +137,71 @@ usage: From the perspective of the subsystem under test, this means that it will receive an `ActiveLeavesUpdate` signal followed by an arbitrary amount of messages. This process repeats itself for `num_blocks`. The messages are generally -test payloads pre-generated before the test run, or constructed on pre-genereated payloads. For example the +test payloads pre-generated before the test run, or constructed on pre-generated payloads. For example the `AvailabilityRecoveryMessage::RecoverAvailableData` message includes a `CandidateReceipt` which is generated before the test is started. ### Example run -Let's run an availabilty read test which will recover availability for 10 cores with max PoV size on a 500 +Let's run an availability read test which will recover availability for 200 cores with max PoV size on a 1000 node validator network. + + ``` - target/testnet/subsystem-bench --n-cores 10 data-availability-read -[2023-11-28T09:01:59Z INFO subsystem_bench::core::display] n_validators = 500, n_cores = 10, pov_size = 5120 - 5120, - latency = None -[2023-11-28T09:01:59Z INFO subsystem-bench::availability] Generating template candidate index=0 pov_size=5242880 -[2023-11-28T09:01:59Z INFO subsystem-bench::availability] Created test environment. -[2023-11-28T09:01:59Z INFO subsystem-bench::availability] Pre-generating 10 candidates. -[2023-11-28T09:02:01Z INFO subsystem-bench::core] Initializing network emulation for 500 peers. -[2023-11-28T09:02:01Z INFO substrate_prometheus_endpoint] 〽️ Prometheus exporter started at 127.0.0.1:9999 -[2023-11-28T09:02:01Z INFO subsystem-bench::availability] Current block 1/1 -[2023-11-28T09:02:01Z INFO subsystem_bench::availability] 10 recoveries pending -[2023-11-28T09:02:04Z INFO subsystem_bench::availability] Block time 3231ms -[2023-11-28T09:02:04Z INFO subsystem-bench::availability] Sleeping till end of block (2768ms) -[2023-11-28T09:02:07Z INFO subsystem_bench::availability] All blocks processed in 6001ms -[2023-11-28T09:02:07Z INFO subsystem_bench::availability] Throughput: 51200 KiB/block -[2023-11-28T09:02:07Z INFO subsystem_bench::availability] Block time: 6001 ms -[2023-11-28T09:02:07Z INFO subsystem_bench::availability] - - Total received from network: 66 MiB - Total sent to network: 58 KiB - Total subsystem CPU usage 4.16s - CPU usage per block 4.16s - Total test environment CPU usage 0.00s - CPU usage per block 0.00s +target/testnet/subsystem-bench polkadot/node/subsystem-bench/examples/availability_write.yaml +[2024-02-19T14:10:32.981Z INFO subsystem_bench] Sequence contains 1 step(s) +[2024-02-19T14:10:32.981Z INFO subsystem-bench::cli] Step 1/1 +[2024-02-19T14:10:32.981Z INFO subsystem-bench::cli] [objective = DataAvailabilityWrite] n_validators = 1000, n_cores = 200, pov_size = 5120 - 5120, connectivity = 75, latency = Some(PeerLatency { mean_latency_ms: 30, std_dev: 2.0 }) +[2024-02-19T14:10:32.982Z INFO subsystem-bench::availability] Generating template candidate index=0 pov_size=5242880 +[2024-02-19T14:10:33.106Z INFO subsystem-bench::availability] Created test environment. +[2024-02-19T14:10:33.106Z INFO subsystem-bench::availability] Pre-generating 600 candidates. +[2024-02-19T14:10:34.096Z INFO subsystem-bench::network] Initializing emulation for a 1000 peer network. +[2024-02-19T14:10:34.096Z INFO subsystem-bench::network] connectivity 75%, latency Some(PeerLatency { mean_latency_ms: 30, std_dev: 2.0 }) +[2024-02-19T14:10:34.098Z INFO subsystem-bench::network] Network created, connected validator count 749 +[2024-02-19T14:10:34.099Z INFO subsystem-bench::availability] Seeding availability store with candidates ... +[2024-02-19T14:10:34.100Z INFO substrate_prometheus_endpoint] 〽️ Prometheus exporter started at 127.0.0.1:9999 +[2024-02-19T14:10:34.387Z INFO subsystem-bench::availability] Done +[2024-02-19T14:10:34.387Z INFO subsystem-bench::availability] Current block #1 +[2024-02-19T14:10:34.389Z INFO subsystem-bench::availability] Waiting for all emulated peers to receive their chunk from us ... +[2024-02-19T14:10:34.625Z INFO subsystem-bench::availability] All chunks received in 237ms +[2024-02-19T14:10:34.626Z INFO polkadot_subsystem_bench::availability] Waiting for 749 bitfields to be received and processed +[2024-02-19T14:10:35.710Z INFO subsystem-bench::availability] All bitfields processed +[2024-02-19T14:10:35.710Z INFO subsystem-bench::availability] All work for block completed in 1322ms +[2024-02-19T14:10:35.710Z INFO subsystem-bench::availability] Current block #2 +[2024-02-19T14:10:35.712Z INFO subsystem-bench::availability] Waiting for all emulated peers to receive their chunk from us ... +[2024-02-19T14:10:35.947Z INFO subsystem-bench::availability] All chunks received in 236ms +[2024-02-19T14:10:35.947Z INFO polkadot_subsystem_bench::availability] Waiting for 749 bitfields to be received and processed +[2024-02-19T14:10:37.038Z INFO subsystem-bench::availability] All bitfields processed +[2024-02-19T14:10:37.038Z INFO subsystem-bench::availability] All work for block completed in 1328ms +[2024-02-19T14:10:37.039Z INFO subsystem-bench::availability] Current block #3 +[2024-02-19T14:10:37.040Z INFO subsystem-bench::availability] Waiting for all emulated peers to receive their chunk from us ... +[2024-02-19T14:10:37.276Z INFO subsystem-bench::availability] All chunks received in 237ms +[2024-02-19T14:10:37.276Z INFO polkadot_subsystem_bench::availability] Waiting for 749 bitfields to be received and processed +[2024-02-19T14:10:38.362Z INFO subsystem-bench::availability] All bitfields processed +[2024-02-19T14:10:38.362Z INFO subsystem-bench::availability] All work for block completed in 1323ms +[2024-02-19T14:10:38.362Z INFO subsystem-bench::availability] All blocks processed in 3974ms +[2024-02-19T14:10:38.362Z INFO subsystem-bench::availability] Avg block time: 1324 ms +[2024-02-19T14:10:38.362Z INFO parachain::availability-store] received `Conclude` signal, exiting +[2024-02-19T14:10:38.362Z INFO parachain::bitfield-distribution] Conclude +[2024-02-19T14:10:38.362Z INFO subsystem-bench::network] Downlink channel closed, network interface task exiting + +polkadot/node/subsystem-bench/examples/availability_write.yaml #1 DataAvailabilityWrite + +Network usage, KiB total per block +Received from peers 12922.000 4307.333 +Sent to peers 47705.000 15901.667 + +CPU usage, seconds total per block +availability-distribution 0.045 0.015 +bitfield-distribution 0.104 0.035 +availability-store 0.304 0.101 +Test environment 3.213 1.071 ``` -`Block time` in the context of `data-availability-read` has a different meaning. It measures the amount of time it + + +`Block time` in the current context has a different meaning. It measures the amount of time it took the subsystem to finish processing all of the messages sent in the context of the current test block. ### Test logs @@ -214,7 +211,7 @@ You can select log target, subtarget and verbosity just like with Polkadot node ### View test metrics -Assuming the Grafana/Prometheus stack installation steps completed succesfully, you should be able to +Assuming the Grafana/Prometheus stack installation steps completed successfully, you should be able to view the test progress in real time by accessing [this link](http://localhost:3000/goto/SM5B8pNSR?orgId=1). Now run @@ -233,8 +230,9 @@ Since the execution will be very slow, it's recommended not to run it together w benchmark results into account. A report is saved in a file `cachegrind_report.txt`. Example run results: + ``` -$ target/testnet/subsystem-bench --n-cores 10 --cache-misses data-availability-read +$ target/testnet/subsystem-bench --cache-misses cache-misses-data-availability-read.yaml $ cat cachegrind_report.txt I refs: 64,622,081,485 I1 misses: 3,018,168 @@ -275,7 +273,7 @@ happy and negative scenarios (low bandwidth, network errors and low connectivity To faster write a new test objective you need to use some higher level wrappers and logic: `TestEnvironment`, `TestConfiguration`, `TestAuthorities`, `NetworkEmulator`. To create the `TestEnvironment` you will -need to also build an `Overseer`, but that should be easy using the mockups for subsystems in`core::mock`. +need to also build an `Overseer`, but that should be easy using the mockups for subsystems in `mock`. ### Mocking diff --git a/polkadot/node/subsystem-bench/examples/approvals_no_shows.yaml b/polkadot/node/subsystem-bench/examples/approvals_no_shows.yaml index 758c7fbbf1121a249ff3094bc74967e3ad2420da..146da57d44c4aaf973e13c886a357028cdbe3559 100644 --- a/polkadot/node/subsystem-bench/examples/approvals_no_shows.yaml +++ b/polkadot/node/subsystem-bench/examples/approvals_no_shows.yaml @@ -1,14 +1,14 @@ TestConfiguration: # Test 1 - objective: !ApprovalVoting - last_considered_tranche: 89 coalesce_mean: 3.0 coalesce_std_dev: 1.0 + enable_assignments_v2: true + last_considered_tranche: 89 stop_when_approved: true coalesce_tranche_diff: 12 - workdir_prefix: "/tmp/" - enable_assignments_v2: true num_no_shows_per_candidate: 10 + workdir_prefix: "/tmp/" n_validators: 500 n_cores: 100 min_pov_size: 1120 diff --git a/polkadot/node/subsystem-bench/examples/approvals_throughput.yaml b/polkadot/node/subsystem-bench/examples/approvals_throughput.yaml index 9eeeefc53a4277aae51e44ee5940a2eb65111cd3..6b17e62c20aa3f69153fb596d1a303a2e0320ddd 100644 --- a/polkadot/node/subsystem-bench/examples/approvals_throughput.yaml +++ b/polkadot/node/subsystem-bench/examples/approvals_throughput.yaml @@ -7,11 +7,10 @@ TestConfiguration: last_considered_tranche: 89 stop_when_approved: false coalesce_tranche_diff: 12 - workdir_prefix: "/tmp" num_no_shows_per_candidate: 0 + workdir_prefix: "/tmp" n_validators: 500 n_cores: 100 - n_included_candidates: 100 min_pov_size: 1120 max_pov_size: 5120 peer_bandwidth: 524288000000 diff --git a/polkadot/node/subsystem-bench/examples/approvals_throughput_best_case.yaml b/polkadot/node/subsystem-bench/examples/approvals_throughput_best_case.yaml index 370bb31a5c4c102174c29382ab6de70ca336278e..e946c28e8ef5d4e38736ffc21e56d8b1c6cd0ddc 100644 --- a/polkadot/node/subsystem-bench/examples/approvals_throughput_best_case.yaml +++ b/polkadot/node/subsystem-bench/examples/approvals_throughput_best_case.yaml @@ -7,8 +7,8 @@ TestConfiguration: last_considered_tranche: 89 stop_when_approved: true coalesce_tranche_diff: 12 - workdir_prefix: "/tmp/" num_no_shows_per_candidate: 0 + workdir_prefix: "/tmp/" n_validators: 500 n_cores: 100 min_pov_size: 1120 diff --git a/polkadot/node/subsystem-bench/examples/approvals_throughput_no_optimisations_enabled.yaml b/polkadot/node/subsystem-bench/examples/approvals_throughput_no_optimisations_enabled.yaml index 30b9ac8dc50fec25bc4952ef3706f9878aa2bbd7..8f4b050e72f27dd4b5bb0c52bd49162cd0bb83ec 100644 --- a/polkadot/node/subsystem-bench/examples/approvals_throughput_no_optimisations_enabled.yaml +++ b/polkadot/node/subsystem-bench/examples/approvals_throughput_no_optimisations_enabled.yaml @@ -7,8 +7,8 @@ TestConfiguration: last_considered_tranche: 89 stop_when_approved: false coalesce_tranche_diff: 12 - workdir_prefix: "/tmp/" num_no_shows_per_candidate: 0 + workdir_prefix: "/tmp/" n_validators: 500 n_cores: 100 min_pov_size: 1120 diff --git a/polkadot/node/subsystem-bench/grafana/availability-read.json b/polkadot/node/subsystem-bench/grafana/availability-read.json index 31c4ad3c795230402ec54d5558c24a3ab9664db4..96a83d2d70fe2e627eda9f142bdf7c67c54fd5a2 100644 --- a/polkadot/node/subsystem-bench/grafana/availability-read.json +++ b/polkadot/node/subsystem-bench/grafana/availability-read.json @@ -119,7 +119,7 @@ "editorMode": "code", "expr": "subsystem_benchmark_n_validators{}", "instant": false, - "legendFormat": "n_vaidators", + "legendFormat": "n_validators", "range": true, "refId": "A" }, @@ -1046,7 +1046,7 @@ "refId": "A" } ], - "title": "Availability subystem metrics", + "title": "Availability subsystem metrics", "type": "row" }, { @@ -1397,7 +1397,7 @@ "refId": "B" } ], - "title": "Recovery throughtput", + "title": "Recovery throughput", "transformations": [], "type": "timeseries" }, diff --git a/polkadot/node/subsystem-bench/src/cli.rs b/polkadot/node/subsystem-bench/src/cli.rs deleted file mode 100644 index bfce8cc183a9b06ae3a91c7fb3600835dcf72885..0000000000000000000000000000000000000000 --- a/polkadot/node/subsystem-bench/src/cli.rs +++ /dev/null @@ -1,66 +0,0 @@ -// Copyright (C) Parity Technologies (UK) Ltd. -// This file is part of Polkadot. - -// Polkadot is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Polkadot is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Polkadot. If not, see . -use super::availability::DataAvailabilityReadOptions; -use crate::approval::ApprovalsOptions; -use serde::{Deserialize, Serialize}; - -#[derive(Debug, Clone, Serialize, Deserialize, clap::Parser)] -#[clap(rename_all = "kebab-case")] -#[allow(missing_docs)] -pub struct TestSequenceOptions { - #[clap(short, long, ignore_case = true)] - pub path: String, -} - -/// Supported test objectives -#[derive(Debug, Clone, clap::Parser, Serialize, Deserialize)] -#[command(rename_all = "kebab-case")] -pub enum TestObjective { - /// Benchmark availability recovery strategies. - DataAvailabilityRead(DataAvailabilityReadOptions), - /// Benchmark availability and bitfield distribution. - DataAvailabilityWrite, - /// Run a test sequence specified in a file - TestSequence(TestSequenceOptions), - /// Benchmark the approval-voting and approval-distribution subsystems. - ApprovalVoting(ApprovalsOptions), - Unimplemented, -} - -#[derive(Debug, clap::Parser)] -#[clap(rename_all = "kebab-case")] -#[allow(missing_docs)] -pub struct StandardTestOptions { - #[clap(long, ignore_case = true, default_value_t = 100)] - /// Number of cores to fetch availability for. - pub n_cores: usize, - - #[clap(long, ignore_case = true, default_value_t = 500)] - /// Number of validators to fetch chunks from. - pub n_validators: usize, - - #[clap(long, ignore_case = true, default_value_t = 5120)] - /// The minimum pov size in KiB - pub min_pov_size: usize, - - #[clap(long, ignore_case = true, default_value_t = 5120)] - /// The maximum pov size bytes - pub max_pov_size: usize, - - #[clap(short, long, ignore_case = true, default_value_t = 1)] - /// The number of blocks the test is going to run. - pub num_blocks: usize, -} diff --git a/polkadot/node/subsystem-bench/src/cli/subsystem-bench.rs b/polkadot/node/subsystem-bench/src/cli/subsystem-bench.rs new file mode 100644 index 0000000000000000000000000000000000000000..10953b6c7839d8ea2a4e0396a4ee37b9875828e9 --- /dev/null +++ b/polkadot/node/subsystem-bench/src/cli/subsystem-bench.rs @@ -0,0 +1,200 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +//! A tool for running subsystem benchmark tests +//! designed for development and CI regression testing. + +use clap::Parser; +use color_eyre::eyre; +use colored::Colorize; +use polkadot_subsystem_bench::{approval, availability, configuration}; +use pyroscope::PyroscopeAgent; +use pyroscope_pprofrs::{pprof_backend, PprofConfig}; +use serde::{Deserialize, Serialize}; +use std::path::Path; + +mod valgrind; + +const LOG_TARGET: &str = "subsystem-bench::cli"; + +/// Supported test objectives +#[derive(Debug, Clone, Parser, Serialize, Deserialize)] +#[command(rename_all = "kebab-case")] +pub enum TestObjective { + /// Benchmark availability recovery strategies. + DataAvailabilityRead(availability::DataAvailabilityReadOptions), + /// Benchmark availability and bitfield distribution. + DataAvailabilityWrite, + /// Benchmark the approval-voting and approval-distribution subsystems. + ApprovalVoting(approval::ApprovalsOptions), +} + +impl std::fmt::Display for TestObjective { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!( + f, + "{}", + match self { + Self::DataAvailabilityRead(_) => "DataAvailabilityRead", + Self::DataAvailabilityWrite => "DataAvailabilityWrite", + Self::ApprovalVoting(_) => "ApprovalVoting", + } + ) + } +} + +/// The test input parameters +#[derive(Clone, Debug, Serialize, Deserialize)] +struct CliTestConfiguration { + /// Test Objective + pub objective: TestObjective, + /// Test Configuration + #[serde(flatten)] + pub test_config: configuration::TestConfiguration, +} + +#[derive(Serialize, Deserialize)] +pub struct TestSequence { + #[serde(rename(serialize = "TestConfiguration", deserialize = "TestConfiguration"))] + test_configurations: Vec, +} + +impl TestSequence { + fn new_from_file(path: &Path) -> std::io::Result { + let string = String::from_utf8(std::fs::read(path)?).expect("File is valid UTF8"); + Ok(serde_yaml::from_str(&string).expect("File is valid test sequence YA")) + } +} + +#[derive(Debug, Parser)] +#[allow(missing_docs)] +struct BenchCli { + #[clap(long, default_value_t = false)] + /// Enable CPU Profiling with Pyroscope + pub profile: bool, + + #[clap(long, requires = "profile", default_value_t = String::from("http://localhost:4040"))] + /// Pyroscope Server URL + pub pyroscope_url: String, + + #[clap(long, requires = "profile", default_value_t = 113)] + /// Pyroscope Sample Rate + pub pyroscope_sample_rate: u32, + + #[clap(long, default_value_t = false)] + /// Enable Cache Misses Profiling with Valgrind. Linux only, Valgrind must be in the PATH + pub cache_misses: bool, + + #[arg(required = true)] + /// Path to the test sequence configuration file + pub path: String, +} + +impl BenchCli { + fn launch(self) -> eyre::Result<()> { + let is_valgrind_running = valgrind::is_valgrind_running(); + if !is_valgrind_running && self.cache_misses { + return valgrind::relaunch_in_valgrind_mode() + } + + let agent_running = if self.profile { + let agent = PyroscopeAgent::builder(self.pyroscope_url.as_str(), "subsystem-bench") + .backend(pprof_backend(PprofConfig::new().sample_rate(self.pyroscope_sample_rate))) + .build()?; + + Some(agent.start()?) + } else { + None + }; + + let test_sequence = TestSequence::new_from_file(Path::new(&self.path)) + .expect("File exists") + .test_configurations; + let num_steps = test_sequence.len(); + gum::info!("{}", format!("Sequence contains {} step(s)", num_steps).bright_purple()); + + for (index, CliTestConfiguration { objective, mut test_config }) in + test_sequence.into_iter().enumerate() + { + let benchmark_name = format!("{} #{} {}", &self.path, index + 1, objective); + gum::info!(target: LOG_TARGET, "{}", format!("Step {}/{}", index + 1, num_steps).bright_purple(),); + gum::info!(target: LOG_TARGET, "[{}] {}", format!("objective = {:?}", objective).green(), test_config); + test_config.generate_pov_sizes(); + + let usage = match objective { + TestObjective::DataAvailabilityRead(opts) => { + let state = availability::TestState::new(&test_config); + let (mut env, _protocol_config) = availability::prepare_test( + &state, + availability::TestDataAvailability::Read(opts), + true, + ); + env.runtime().block_on(availability::benchmark_availability_read( + &benchmark_name, + &mut env, + &state, + )) + }, + TestObjective::DataAvailabilityWrite => { + let state = availability::TestState::new(&test_config); + let (mut env, _protocol_config) = availability::prepare_test( + &state, + availability::TestDataAvailability::Write, + true, + ); + env.runtime().block_on(availability::benchmark_availability_write( + &benchmark_name, + &mut env, + &state, + )) + }, + TestObjective::ApprovalVoting(ref options) => { + let (mut env, state) = + approval::prepare_test(test_config.clone(), options.clone(), true); + env.runtime().block_on(approval::bench_approvals( + &benchmark_name, + &mut env, + state, + )) + }, + }; + println!("{}", usage); + } + + if let Some(agent_running) = agent_running { + let agent_ready = agent_running.stop()?; + agent_ready.shutdown(); + } + + Ok(()) + } +} + +fn main() -> eyre::Result<()> { + color_eyre::install()?; + env_logger::builder() + .filter(Some("hyper"), log::LevelFilter::Info) + // Avoid `Terminating due to subsystem exit subsystem` warnings + .filter(Some("polkadot_overseer"), log::LevelFilter::Error) + .filter(None, log::LevelFilter::Info) + .format_timestamp_millis() + .try_init() + .unwrap(); + + let cli: BenchCli = BenchCli::parse(); + cli.launch()?; + Ok(()) +} diff --git a/polkadot/node/subsystem-bench/src/valgrind.rs b/polkadot/node/subsystem-bench/src/cli/valgrind.rs similarity index 100% rename from polkadot/node/subsystem-bench/src/valgrind.rs rename to polkadot/node/subsystem-bench/src/cli/valgrind.rs diff --git a/polkadot/node/subsystem-bench/src/approval/helpers.rs b/polkadot/node/subsystem-bench/src/lib/approval/helpers.rs similarity index 98% rename from polkadot/node/subsystem-bench/src/approval/helpers.rs rename to polkadot/node/subsystem-bench/src/lib/approval/helpers.rs index 7cbe3ba75949339646b9157452f358f479bca657..ca58875c81393eebfea236e4fee0c25ca9d3a023 100644 --- a/polkadot/node/subsystem-bench/src/approval/helpers.rs +++ b/polkadot/node/subsystem-bench/src/lib/approval/helpers.rs @@ -11,7 +11,10 @@ // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. -use crate::core::configuration::TestAuthorities; +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +use crate::configuration::TestAuthorities; use itertools::Itertools; use polkadot_node_core_approval_voting::time::{Clock, SystemClock, Tick}; use polkadot_node_network_protocol::{ @@ -29,7 +32,7 @@ use polkadot_primitives::{ use polkadot_primitives_test_helpers::dummy_candidate_receipt_bad_sig; use rand::{seq::SliceRandom, SeedableRng}; use rand_chacha::ChaCha20Rng; -use sc_network::PeerId; +use sc_network_types::PeerId; use sp_consensus_babe::{ digests::{CompatibleDigestItem, PreDigest, SecondaryVRFPreDigest}, AllowedSlots, BabeEpochConfiguration, Epoch as BabeEpoch, VrfSignature, VrfTranscript, @@ -39,9 +42,6 @@ use sp_keyring::sr25519::Keyring as Sr25519Keyring; use sp_runtime::{Digest, DigestItem}; use std::sync::{atomic::AtomicU64, Arc}; -// You should have received a copy of the GNU General Public License -// along with Polkadot. If not, see . - /// A fake system clock used for driving the approval voting and make /// it process blocks, assignments and approvals from the past. #[derive(Clone)] diff --git a/polkadot/node/subsystem-bench/src/approval/message_generator.rs b/polkadot/node/subsystem-bench/src/lib/approval/message_generator.rs similarity index 93% rename from polkadot/node/subsystem-bench/src/approval/message_generator.rs rename to polkadot/node/subsystem-bench/src/lib/approval/message_generator.rs index 4318dcdf8902a6672a73ac208e43efbf34da3e66..219b2cb515d7da5df52df9902c0da28e09838763 100644 --- a/polkadot/node/subsystem-bench/src/approval/message_generator.rs +++ b/polkadot/node/subsystem-bench/src/lib/approval/message_generator.rs @@ -14,15 +14,17 @@ // You should have received a copy of the GNU General Public License // along with Polkadot. If not, see . -use std::{ - cmp::max, - collections::{BTreeMap, HashSet}, - fs, - io::Write, - path::{Path, PathBuf}, - time::Duration, +use crate::{ + approval::{ + helpers::{generate_babe_epoch, generate_topology}, + test_message::{MessagesBundle, TestMessageInfo}, + ApprovalTestState, ApprovalsOptions, BlockTestData, GeneratedState, + BUFFER_FOR_GENERATION_MILLIS, LOG_TARGET, SLOT_DURATION_MILLIS, + }, + configuration::{TestAuthorities, TestConfiguration}, + mock::runtime_api::session_info_for_peers, + NODE_UNDER_TEST, }; - use futures::SinkExt; use itertools::Itertools; use parity_scale_codec::Encode; @@ -30,46 +32,38 @@ use polkadot_node_core_approval_voting::{ criteria::{compute_assignments, Config}, time::tranche_to_tick, }; -use polkadot_node_network_protocol::grid_topology::{ - GridNeighbors, RandomRouting, RequiredRouting, SessionGridTopology, +use polkadot_node_network_protocol::{ + grid_topology::{GridNeighbors, RandomRouting, RequiredRouting, SessionGridTopology}, + v3 as protocol_v3, }; use polkadot_node_primitives::approval::{ self, v2::{CoreBitfield, IndirectAssignmentCertV2, IndirectSignedApprovalVoteV2}, }; use polkadot_primitives::{ - vstaging::ApprovalVoteMultipleCandidates, CandidateEvent, CandidateHash, CandidateIndex, - CoreIndex, SessionInfo, Slot, ValidatorId, ValidatorIndex, ASSIGNMENT_KEY_TYPE_ID, + ApprovalVoteMultipleCandidates, CandidateEvent, CandidateHash, CandidateIndex, CoreIndex, Hash, + SessionInfo, Slot, ValidatorId, ValidatorIndex, ASSIGNMENT_KEY_TYPE_ID, }; use rand::{seq::SliceRandom, RngCore, SeedableRng}; use rand_chacha::ChaCha20Rng; use rand_distr::{Distribution, Normal}; use sc_keystore::LocalKeystore; -use sc_network::PeerId; +use sc_network_types::PeerId; +use sc_service::SpawnTaskHandle; use sha1::Digest; use sp_application_crypto::AppCrypto; use sp_consensus_babe::SlotDuration; use sp_keystore::Keystore; use sp_timestamp::Timestamp; - -use super::{ - test_message::{MessagesBundle, TestMessageInfo}, - ApprovalTestState, ApprovalsOptions, BlockTestData, -}; -use crate::{ - approval::{ - helpers::{generate_babe_epoch, generate_topology}, - GeneratedState, BUFFER_FOR_GENERATION_MILLIS, LOG_TARGET, SLOT_DURATION_MILLIS, - }, - core::{ - configuration::{TestAuthorities, TestConfiguration, TestObjective}, - mock::session_info_for_peers, - NODE_UNDER_TEST, - }, +use std::{ + cmp::max, + collections::{BTreeMap, HashSet}, + fs, + io::Write, + path::{Path, PathBuf}, + time::Duration, }; -use polkadot_node_network_protocol::v3 as protocol_v3; -use polkadot_primitives::Hash; -use sc_service::SpawnTaskHandle; + /// A generator of messages coming from a given Peer/Validator pub struct PeerMessagesGenerator { /// The grid neighbors of the node under test. @@ -80,8 +74,8 @@ pub struct PeerMessagesGenerator { pub validator_index: ValidatorIndex, /// An array of pre-generated random samplings, that is used to determine, which nodes would /// send a given assignment, to the node under test because of the random samplings. - /// As an optimization we generate this sampling at the begining of the test and just pick - /// one randomly, because always taking the samples would be too expensive for benchamrk. + /// As an optimization we generate this sampling at the beginning of the test and just pick + /// one randomly, because always taking the samples would be too expensive for benchmark. pub random_samplings: Vec>, /// Channel for sending the generated messages to the aggregator pub tx_messages: futures::channel::mpsc::UnboundedSender<(Hash, Vec)>, @@ -135,11 +129,7 @@ impl PeerMessagesGenerator { options: &ApprovalsOptions, ) -> String { let mut fingerprint = options.fingerprint(); - let mut exclude_objective = configuration.clone(); - // The objective contains the full content of `ApprovalOptions`, we don't want to put all of - // that in fingerprint, so execlute it because we add it manually see above. - exclude_objective.objective = TestObjective::Unimplemented; - let configuration_bytes = bincode::serialize(&exclude_objective).unwrap(); + let configuration_bytes = bincode::serialize(&configuration).unwrap(); fingerprint.extend(configuration_bytes); let mut sha1 = sha1::Sha1::new(); sha1.update(fingerprint); @@ -244,7 +234,7 @@ impl PeerMessagesGenerator { let all_messages = all_messages .into_iter() .flat_map(|(_, mut messages)| { - // Shuffle the messages inside the same tick, so that we don't priorites messages + // Shuffle the messages inside the same tick, so that we don't priorities messages // for older nodes. we try to simulate the same behaviour as in real world. messages.shuffle(&mut rand_chacha); messages @@ -570,12 +560,12 @@ struct TestSignInfo { candidate_index: CandidateIndex, /// The validator sending the assignments validator_index: ValidatorIndex, - /// The assignments convering this candidate + /// The assignments covering this candidate assignment: TestMessageInfo, } impl TestSignInfo { - /// Helper function to create a signture for all candidates in `to_sign` parameter. + /// Helper function to create a signature for all candidates in `to_sign` parameter. /// Returns a TestMessage fn sign_candidates( to_sign: &mut Vec, diff --git a/polkadot/node/subsystem-bench/src/approval/mock_chain_selection.rs b/polkadot/node/subsystem-bench/src/lib/approval/mock_chain_selection.rs similarity index 95% rename from polkadot/node/subsystem-bench/src/approval/mock_chain_selection.rs rename to polkadot/node/subsystem-bench/src/lib/approval/mock_chain_selection.rs index ab23a8ced484eb7584eaa3d90c5a0e967ba897f7..77ba80d4b2bbcbc7616c00ad6f5069ceb22979bc 100644 --- a/polkadot/node/subsystem-bench/src/approval/mock_chain_selection.rs +++ b/polkadot/node/subsystem-bench/src/lib/approval/mock_chain_selection.rs @@ -14,9 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Polkadot. If not, see . -use crate::approval::{LOG_TARGET, SLOT_DURATION_MILLIS}; - -use super::{ApprovalTestState, PastSystemClock}; +use crate::approval::{ApprovalTestState, PastSystemClock, LOG_TARGET, SLOT_DURATION_MILLIS}; use futures::FutureExt; use polkadot_node_core_approval_voting::time::{slot_number_to_tick, Clock, TICK_DURATION_MILLIS}; use polkadot_node_subsystem::{overseer, SpawnedSubsystem, SubsystemError}; diff --git a/polkadot/node/subsystem-bench/src/approval/mod.rs b/polkadot/node/subsystem-bench/src/lib/approval/mod.rs similarity index 93% rename from polkadot/node/subsystem-bench/src/approval/mod.rs rename to polkadot/node/subsystem-bench/src/lib/approval/mod.rs index 3544ce74711e6df4f5e5b4f92299ef54f6757733..6ab5b86baede30117489b892490dd14b415650e7 100644 --- a/polkadot/node/subsystem-bench/src/approval/mod.rs +++ b/polkadot/node/subsystem-bench/src/lib/approval/mod.rs @@ -14,33 +14,31 @@ // You should have received a copy of the GNU General Public License // along with Polkadot. If not, see . -use self::{ - helpers::{make_candidates, make_header}, - test_message::{MessagesBundle, TestMessageInfo}, -}; use crate::{ approval::{ helpers::{ generate_babe_epoch, generate_new_session_topology, generate_peer_view_change_for, - PastSystemClock, + make_header, PastSystemClock, }, message_generator::PeerMessagesGenerator, mock_chain_selection::MockChainSelection, + test_message::{MessagesBundle, TestMessageInfo}, }, - core::{ - configuration::{TestAuthorities, TestConfiguration}, - environment::{TestEnvironment, TestEnvironmentDependencies, MAX_TIME_OF_FLIGHT}, - mock::{ - dummy_builder, - network_bridge::{MockNetworkBridgeRx, MockNetworkBridgeTx}, - AlwaysSupportsParachains, ChainApiState, MockChainApi, MockRuntimeApi, TestSyncOracle, - }, - network::{ - new_network, HandleNetworkMessage, NetworkEmulatorHandle, NetworkInterface, - NetworkInterfaceReceiver, - }, - NODE_UNDER_TEST, + configuration::{TestAuthorities, TestConfiguration}, + dummy_builder, + environment::{TestEnvironment, TestEnvironmentDependencies, MAX_TIME_OF_FLIGHT}, + mock::{ + chain_api::{ChainApiState, MockChainApi}, + network_bridge::{MockNetworkBridgeRx, MockNetworkBridgeTx}, + runtime_api::MockRuntimeApi, + AlwaysSupportsParachains, TestSyncOracle, }, + network::{ + new_network, HandleNetworkMessage, NetworkEmulatorHandle, NetworkInterface, + NetworkInterfaceReceiver, + }, + usage::BenchmarkUsage, + NODE_UNDER_TEST, }; use colored::Colorize; use futures::channel::oneshot; @@ -89,8 +87,7 @@ mod message_generator; mod mock_chain_selection; mod test_message; -pub const LOG_TARGET: &str = "subsystem-bench::approval"; -const DATA_COL: u32 = 0; +pub(crate) const LOG_TARGET: &str = "subsystem-bench::approval"; pub(crate) const NUM_COLUMNS: u32 = 1; pub(crate) const SLOT_DURATION_MILLIS: u64 = 6000; pub(crate) const TEST_CONFIG: ApprovalVotingConfig = ApprovalVotingConfig { @@ -98,6 +95,8 @@ pub(crate) const TEST_CONFIG: ApprovalVotingConfig = ApprovalVotingConfig { slot_duration_millis: SLOT_DURATION_MILLIS, }; +const DATA_COL: u32 = 0; + /// Start generating messages for a slot into the future, so that the /// generation nevers falls behind the current slot. const BUFFER_FOR_GENERATION_MILLIS: u64 = 30_000; @@ -116,7 +115,7 @@ pub struct ApprovalsOptions { #[clap(short, long, default_value_t = 1.0)] /// Max candidate to be signed in a single approval. pub coalesce_std_dev: f32, - /// The maximum tranche diff between approvals coalesced toghther. + /// The maximum tranche diff between approvals coalesced together. pub coalesce_tranche_diff: u32, #[clap(short, long, default_value_t = false)] /// Enable assignments v2. @@ -171,7 +170,7 @@ struct BlockTestData { total_candidates_before: u64, /// The votes we sent. /// votes[validator_index][candidate_index] tells if validator sent vote for candidate. - /// We use this to mark the test as succesfull if GetApprovalSignatures returns all the votes + /// We use this to mark the test as successful if GetApprovalSignatures returns all the votes /// from here. votes: Arc>>, } @@ -232,13 +231,13 @@ impl CandidateTestData { #[derive(Debug, Clone, Encode, Decode, PartialEq, Eq)] struct GeneratedState { /// All assignments and approvals - all_messages: Option>, + all_messages: Option>, /// The first slot in the test. initial_slot: Slot, } /// Approval test state used by all mock subsystems to be able to answer messages emitted -/// by the approval-voting and approval-distribution-subystems. +/// by the approval-voting and approval-distribution-subsystems. /// /// This gets cloned across all mock subsystems, so if there is any information that gets /// updated between subsystems, they would have to be wrapped in Arc's. @@ -365,7 +364,7 @@ impl ApprovalTestState { block_number: block_number as BlockNumber, hash: block_hash, header, - candidates: make_candidates( + candidates: helpers::make_candidates( block_hash, block_number as BlockNumber, configuration.n_cores as u32, @@ -469,11 +468,9 @@ impl ApprovalTestState { impl HandleNetworkMessage for ApprovalTestState { fn handle( &self, - _message: crate::core::network::NetworkMessage, - _node_sender: &mut futures::channel::mpsc::UnboundedSender< - crate::core::network::NetworkMessage, - >, - ) -> Option { + _message: crate::network::NetworkMessage, + _node_sender: &mut futures::channel::mpsc::UnboundedSender, + ) -> Option { self.total_sent_messages_from_node .as_ref() .fetch_add(1, std::sync::atomic::Ordering::SeqCst); @@ -501,13 +498,17 @@ struct PeerMessageProducer { impl PeerMessageProducer { /// Generates messages by spawning a blocking task in the background which begins creating - /// the assignments/approvals and peer view changes at the begining of each block. - fn produce_messages(mut self, env: &TestEnvironment, all_messages: Vec) { + /// the assignments/approvals and peer view changes at the beginning of each block. + fn produce_messages( + mut self, + env: &TestEnvironment, + all_messages: Vec, + ) { env.spawn_blocking("produce-messages", async move { let mut initialized_blocks = HashSet::new(); let mut per_candidate_data: HashMap<(Hash, CandidateIndex), CandidateTestData> = self.initialize_candidates_test_data(); - let mut skipped_messages: Vec = Vec::new(); + let mut skipped_messages: Vec = Vec::new(); let mut re_process_skipped = false; let system_clock = @@ -604,9 +605,9 @@ impl PeerMessageProducer { // send the message in our simulation. pub fn process_message( &mut self, - bundle: MessagesBundle, + bundle: test_message::MessagesBundle, per_candidate_data: &mut HashMap<(Hash, CandidateIndex), CandidateTestData>, - skipped_messages: &mut Vec, + skipped_messages: &mut Vec, ) -> bool { let mut reprocess_skipped = false; let block_info = self @@ -739,7 +740,7 @@ impl PeerMessageProducer { } } - // Initializes the candidates test data. This is used for bookeeping if more assignments and + // Initializes the candidates test data. This is used for bookkeeping if more assignments and // approvals would be needed. fn initialize_candidates_test_data( &self, @@ -766,7 +767,7 @@ impl PeerMessageProducer { } /// Helper function to build an overseer with the real implementation for `ApprovalDistribution` and -/// `ApprovalVoting` subystems and mock subsytems for all others. +/// `ApprovalVoting` subsystems and mock subsystems for all others. fn build_overseer( state: &ApprovalTestState, network: &NetworkEmulatorHandle, @@ -834,8 +835,14 @@ fn build_overseer( pub fn prepare_test( config: TestConfiguration, options: ApprovalsOptions, + with_prometheus_endpoint: bool, ) -> (TestEnvironment, ApprovalTestState) { - prepare_test_inner(config, TestEnvironmentDependencies::default(), options) + prepare_test_inner( + config, + TestEnvironmentDependencies::default(), + options, + with_prometheus_endpoint, + ) } /// Build the test environment for an Approval benchmark. @@ -843,6 +850,7 @@ fn prepare_test_inner( config: TestConfiguration, dependencies: TestEnvironmentDependencies, options: ApprovalsOptions, + with_prometheus_endpoint: bool, ) -> (TestEnvironment, ApprovalTestState) { gum::info!("Prepare test state"); let state = ApprovalTestState::new(&config, options, &dependencies); @@ -871,12 +879,17 @@ fn prepare_test_inner( overseer, overseer_handle, state.test_authorities.clone(), + with_prometheus_endpoint, ), state, ) } -pub async fn bench_approvals(env: &mut TestEnvironment, mut state: ApprovalTestState) { +pub async fn bench_approvals( + benchmark_name: &str, + env: &mut TestEnvironment, + mut state: ApprovalTestState, +) -> BenchmarkUsage { let producer_rx = state .start_message_production( env.network(), @@ -885,15 +898,16 @@ pub async fn bench_approvals(env: &mut TestEnvironment, mut state: ApprovalTestS env.registry().clone(), ) .await; - bench_approvals_run(env, state, producer_rx).await + bench_approvals_run(benchmark_name, env, state, producer_rx).await } /// Runs the approval benchmark. pub async fn bench_approvals_run( + benchmark_name: &str, env: &mut TestEnvironment, state: ApprovalTestState, producer_rx: oneshot::Receiver<()>, -) { +) -> BenchmarkUsage { let config = env.config().clone(); env.metrics().set_n_validators(config.n_validators); @@ -922,7 +936,7 @@ pub async fn bench_approvals_run( for block_num in 0..env.config().num_blocks { let mut current_slot = tick_to_slot_number(SLOT_DURATION_MILLIS, system_clock.tick_now()); - // Wait untill the time arrieves at the first slot under test. + // Wait until the time arrives at the first slot under test. while current_slot < state.generated_state.initial_slot { sleep(Duration::from_millis(5)).await; current_slot = tick_to_slot_number(SLOT_DURATION_MILLIS, system_clock.tick_now()); @@ -947,7 +961,7 @@ pub async fn bench_approvals_run( } // Wait for all blocks to be approved before exiting. - // This is an invariant of the benchmark, if this does not happen something went teribbly wrong. + // This is an invariant of the benchmark, if this does not happen something went terribly wrong. while state.last_approved_block.load(std::sync::atomic::Ordering::SeqCst) < env.config().num_blocks as u32 { @@ -1054,6 +1068,5 @@ pub async fn bench_approvals_run( state.total_unique_messages.load(std::sync::atomic::Ordering::SeqCst) ); - env.display_network_usage(); - env.display_cpu_usage(&["approval-distribution", "approval-voting"]); + env.collect_resource_usage(benchmark_name, &["approval-distribution", "approval-voting"]) } diff --git a/polkadot/node/subsystem-bench/src/approval/test_message.rs b/polkadot/node/subsystem-bench/src/lib/approval/test_message.rs similarity index 94% rename from polkadot/node/subsystem-bench/src/approval/test_message.rs rename to polkadot/node/subsystem-bench/src/lib/approval/test_message.rs index ea578776f261d07e7124f8abc12d5e1c03f00987..9641b62a94d8a8612cd394b5964fd66eb1d6a0b4 100644 --- a/polkadot/node/subsystem-bench/src/approval/test_message.rs +++ b/polkadot/node/subsystem-bench/src/lib/approval/test_message.rs @@ -14,14 +14,15 @@ // You should have received a copy of the GNU General Public License // along with Polkadot. If not, see . -use super::{ApprovalsOptions, BlockTestData, CandidateTestData}; -use crate::core::configuration::TestAuthorities; +use crate::{ + approval::{ApprovalsOptions, BlockTestData, CandidateTestData}, + configuration::TestAuthorities, +}; use itertools::Itertools; use parity_scale_codec::{Decode, Encode}; use polkadot_node_network_protocol::v3 as protocol_v3; - use polkadot_primitives::{CandidateIndex, Hash, ValidatorIndex}; -use sc_network::PeerId; +use sc_network_types::PeerId; use std::collections::{HashMap, HashSet}; #[derive(Debug, Clone, Encode, Decode, PartialEq, Eq)] @@ -30,7 +31,7 @@ pub struct TestMessageInfo { pub msg: protocol_v3::ApprovalDistributionMessage, /// The list of peers that would sends this message in a real topology. /// It includes both the peers that would send the message because of the topology - /// or because of randomly chosing so. + /// or because of randomly choosing so. pub sent_by: Vec, /// The tranche at which this message should be sent. pub tranche: u32, @@ -89,7 +90,7 @@ impl MessagesBundle { /// Tells if the bundle is needed for sending. /// We either send it because we need more assignments and approvals to approve the candidates - /// or because we configured the test to send messages untill a given tranche. + /// or because we configured the test to send messages until a given tranche. pub fn should_send( &self, candidates_test_data: &HashMap<(Hash, CandidateIndex), CandidateTestData>, @@ -173,24 +174,24 @@ impl TestMessageInfo { } } - /// Returns a list of candidates indicies in this message + /// Returns a list of candidates indices in this message pub fn candidate_indices(&self) -> HashSet { - let mut unique_candidate_indicies = HashSet::new(); + let mut unique_candidate_indices = HashSet::new(); match &self.msg { protocol_v3::ApprovalDistributionMessage::Assignments(assignments) => for (_assignment, candidate_indices) in assignments { for candidate_index in candidate_indices.iter_ones() { - unique_candidate_indicies.insert(candidate_index); + unique_candidate_indices.insert(candidate_index); } }, protocol_v3::ApprovalDistributionMessage::Approvals(approvals) => for approval in approvals { for candidate_index in approval.candidate_indices.iter_ones() { - unique_candidate_indicies.insert(candidate_index); + unique_candidate_indices.insert(candidate_index); } }, } - unique_candidate_indicies + unique_candidate_indices } /// Marks this message as no-shows if the number of configured no-shows is above the registered diff --git a/polkadot/node/subsystem-bench/src/availability/av_store_helpers.rs b/polkadot/node/subsystem-bench/src/lib/availability/av_store_helpers.rs similarity index 89% rename from polkadot/node/subsystem-bench/src/availability/av_store_helpers.rs rename to polkadot/node/subsystem-bench/src/lib/availability/av_store_helpers.rs index e6827f1d8aeaa63678561fb295a4a5166eb50b28..3300def2235ee0ea90f466316f9bc5a7a965869c 100644 --- a/polkadot/node/subsystem-bench/src/availability/av_store_helpers.rs +++ b/polkadot/node/subsystem-bench/src/lib/availability/av_store_helpers.rs @@ -14,16 +14,11 @@ // You should have received a copy of the GNU General Public License // along with Polkadot. If not, see . -use crate::core::mock::TestSyncOracle; - -use super::*; - +use crate::{environment::TestEnvironmentDependencies, mock::TestSyncOracle}; +use polkadot_node_core_av_store::{AvailabilityStoreSubsystem, Config}; use polkadot_node_metrics::metrics::Metrics; - -use polkadot_node_core_av_store::Config; use polkadot_node_subsystem_util::database::Database; - -use polkadot_node_core_av_store::AvailabilityStoreSubsystem; +use std::sync::Arc; mod columns { pub const DATA: u32 = 0; diff --git a/polkadot/node/subsystem-bench/src/availability/mod.rs b/polkadot/node/subsystem-bench/src/lib/availability/mod.rs similarity index 50% rename from polkadot/node/subsystem-bench/src/availability/mod.rs rename to polkadot/node/subsystem-bench/src/lib/availability/mod.rs index f7f1184448b357edab23ec2e8d28f51c8291d8ff..5b93c3d862de683ea35dde9f0a9e313b1a77ad4d 100644 --- a/polkadot/node/subsystem-bench/src/availability/mod.rs +++ b/polkadot/node/subsystem-bench/src/lib/availability/mod.rs @@ -13,71 +13,72 @@ // You should have received a copy of the GNU General Public License // along with Polkadot. If not, see . -use crate::{core::mock::ChainApiState, TestEnvironment}; -use av_store::NetworkAvailabilityState; -use bitvec::bitvec; -use colored::Colorize; -use itertools::Itertools; -use polkadot_availability_bitfield_distribution::BitfieldDistribution; -use polkadot_node_core_av_store::AvailabilityStoreSubsystem; -use polkadot_node_subsystem::{Overseer, OverseerConnector, SpawnGlue}; -use polkadot_node_subsystem_types::{ - messages::{AvailabilityStoreMessage, NetworkBridgeEvent}, - Span, -}; -use polkadot_overseer::{metrics::Metrics as OverseerMetrics, Handle as OverseerHandle}; -use sc_network::{request_responses::ProtocolConfig, PeerId}; -use sp_core::H256; -use std::{collections::HashMap, iter::Cycle, ops::Sub, sync::Arc, time::Instant}; -use av_store_helpers::new_av_store; +use crate::{ + availability::av_store_helpers::new_av_store, + dummy_builder, + environment::{TestEnvironment, TestEnvironmentDependencies, GENESIS_HASH}, + mock::{ + av_store::{self, MockAvailabilityStore, NetworkAvailabilityState}, + chain_api::{ChainApiState, MockChainApi}, + network_bridge::{self, MockNetworkBridgeRx, MockNetworkBridgeTx}, + runtime_api::{self, MockRuntimeApi}, + AlwaysSupportsParachains, + }, + network::new_network, + usage::BenchmarkUsage, +}; +use colored::Colorize; use futures::{channel::oneshot, stream::FuturesUnordered, StreamExt}; +use parity_scale_codec::Encode; +use polkadot_availability_bitfield_distribution::BitfieldDistribution; use polkadot_availability_distribution::{ AvailabilityDistributionSubsystem, IncomingRequestReceivers, }; -use polkadot_node_metrics::metrics::Metrics; - use polkadot_availability_recovery::AvailabilityRecoverySubsystem; -use polkadot_node_primitives::{AvailableData, ErasureChunk}; - -use crate::GENESIS_HASH; -use parity_scale_codec::Encode; +use polkadot_node_core_av_store::AvailabilityStoreSubsystem; +use polkadot_node_metrics::metrics::Metrics; use polkadot_node_network_protocol::{ - request_response::{v1::ChunkFetchingRequest, IncomingRequest, ReqProtocolNames}, - OurView, Versioned, VersionedValidationProtocol, + request_response::{IncomingRequest, ReqProtocolNames}, + OurView, }; -use sc_network::request_responses::IncomingRequest as RawIncomingRequest; - -use polkadot_node_primitives::{BlockData, PoV}; -use polkadot_node_subsystem::messages::{AllMessages, AvailabilityRecoveryMessage}; - -use crate::core::{ - environment::TestEnvironmentDependencies, - mock::{ - av_store, - network_bridge::{self, MockNetworkBridgeRx, MockNetworkBridgeTx}, - runtime_api, MockAvailabilityStore, MockChainApi, MockRuntimeApi, - }, +use polkadot_node_subsystem::{ + messages::{AllMessages, AvailabilityRecoveryMessage}, + Overseer, OverseerConnector, SpawnGlue, +}; +use polkadot_node_subsystem_types::{ + messages::{AvailabilityStoreMessage, NetworkBridgeEvent}, + Span, }; +use polkadot_overseer::{metrics::Metrics as OverseerMetrics, Handle as OverseerHandle}; +use polkadot_primitives::{Block, GroupIndex, Hash}; +use sc_network::request_responses::{IncomingRequest as RawIncomingRequest, ProtocolConfig}; + +use sc_service::SpawnTaskHandle; +use serde::{Deserialize, Serialize}; +use std::{ops::Sub, sync::Arc, time::Instant}; +pub use test_state::TestState; -use super::core::{configuration::TestConfiguration, mock::dummy_builder, network::*}; +mod av_store_helpers; +mod test_state; const LOG_TARGET: &str = "subsystem-bench::availability"; -use super::{cli::TestObjective, core::mock::AlwaysSupportsParachains}; -use polkadot_node_subsystem_test_helpers::{ - derive_erasure_chunks_with_proofs_and_root, mock::new_block_import_info, -}; -use polkadot_primitives::{ - AvailabilityBitfield, BlockNumber, CandidateHash, CandidateReceipt, GroupIndex, Hash, HeadData, - Header, PersistedValidationData, Signed, SigningContext, ValidatorIndex, -}; -use polkadot_primitives_test_helpers::{dummy_candidate_receipt, dummy_hash}; -use sc_service::SpawnTaskHandle; +#[derive(Debug, Clone, Serialize, Deserialize, clap::Parser)] +#[clap(rename_all = "kebab-case")] +#[allow(missing_docs)] +pub struct DataAvailabilityReadOptions { + #[clap(short, long, default_value_t = false)] + /// Turbo boost AD Read by fetching the full availability datafrom backers first. Saves CPU as + /// we don't need to re-construct from chunks. Typically this is only faster if nodes have + /// enough bandwidth. + pub fetch_from_backers: bool, +} -mod av_store_helpers; -mod cli; -pub use cli::{DataAvailabilityReadOptions, NetworkEmulation}; +pub enum TestDataAvailability { + Read(DataAvailabilityReadOptions), + Write, +} fn build_overseer_for_availability_read( spawn_task_handle: SpawnTaskHandle, @@ -135,54 +136,12 @@ fn build_overseer_for_availability_write( (overseer, OverseerHandle::new(raw_handle)) } -/// Takes a test configuration and uses it to create the `TestEnvironment`. pub fn prepare_test( - config: TestConfiguration, - state: &mut TestState, + state: &TestState, + mode: TestDataAvailability, + with_prometheus_endpoint: bool, ) -> (TestEnvironment, Vec) { - prepare_test_inner(config, state, TestEnvironmentDependencies::default()) -} - -fn prepare_test_inner( - config: TestConfiguration, - state: &mut TestState, - dependencies: TestEnvironmentDependencies, -) -> (TestEnvironment, Vec) { - // Generate test authorities. - let test_authorities = config.generate_authorities(); - - let mut candidate_hashes: HashMap> = HashMap::new(); - - // Prepare per block candidates. - // Genesis block is always finalized, so we start at 1. - for block_num in 1..=config.num_blocks { - for _ in 0..config.n_cores { - candidate_hashes - .entry(Hash::repeat_byte(block_num as u8)) - .or_default() - .push(state.next_candidate().expect("Cycle iterator")) - } - - // First candidate is our backed candidate. - state.backed_candidates.push( - candidate_hashes - .get(&Hash::repeat_byte(block_num as u8)) - .expect("just inserted above") - .first() - .expect("just inserted above") - .clone(), - ); - } - - let runtime_api = runtime_api::MockRuntimeApi::new( - config.clone(), - test_authorities.clone(), - candidate_hashes, - Default::default(), - Default::default(), - 0, - ); - + let dependencies = TestEnvironmentDependencies::default(); let availability_state = NetworkAvailabilityState { candidate_hashes: state.candidate_hashes.clone(), available_data: state.available_data.clone(), @@ -191,31 +150,49 @@ fn prepare_test_inner( let mut req_cfgs = Vec::new(); - let (collation_req_receiver, collation_req_cfg) = - IncomingRequest::get_config_receiver(&ReqProtocolNames::new(GENESIS_HASH, None)); + let (collation_req_receiver, collation_req_cfg) = IncomingRequest::get_config_receiver::< + Block, + sc_network::NetworkWorker, + >(&ReqProtocolNames::new(GENESIS_HASH, None)); req_cfgs.push(collation_req_cfg); - let (pov_req_receiver, pov_req_cfg) = - IncomingRequest::get_config_receiver(&ReqProtocolNames::new(GENESIS_HASH, None)); + let (pov_req_receiver, pov_req_cfg) = IncomingRequest::get_config_receiver::< + Block, + sc_network::NetworkWorker, + >(&ReqProtocolNames::new(GENESIS_HASH, None)); - let (chunk_req_receiver, chunk_req_cfg) = - IncomingRequest::get_config_receiver(&ReqProtocolNames::new(GENESIS_HASH, None)); + let (chunk_req_receiver, chunk_req_cfg) = IncomingRequest::get_config_receiver::< + Block, + sc_network::NetworkWorker, + >(&ReqProtocolNames::new(GENESIS_HASH, None)); req_cfgs.push(pov_req_cfg); - let (network, network_interface, network_receiver) = - new_network(&config, &dependencies, &test_authorities, vec![Arc::new(availability_state)]); + let (network, network_interface, network_receiver) = new_network( + &state.config, + &dependencies, + &state.test_authorities, + vec![Arc::new(availability_state.clone())], + ); let network_bridge_tx = network_bridge::MockNetworkBridgeTx::new( network.clone(), network_interface.subsystem_sender(), - test_authorities.clone(), + state.test_authorities.clone(), ); - let network_bridge_rx = - network_bridge::MockNetworkBridgeRx::new(network_receiver, Some(chunk_req_cfg.clone())); + network_bridge::MockNetworkBridgeRx::new(network_receiver, Some(chunk_req_cfg)); + + let runtime_api = runtime_api::MockRuntimeApi::new( + state.config.clone(), + state.test_authorities.clone(), + state.candidate_receipts.clone(), + Default::default(), + Default::default(), + 0, + ); - let (overseer, overseer_handle) = match &state.config().objective { - TestObjective::DataAvailabilityRead(options) => { + let (overseer, overseer_handle) = match &mode { + TestDataAvailability::Read(options) => { let use_fast_path = options.fetch_from_backers; let subsystem = if use_fast_path { @@ -245,29 +222,14 @@ fn prepare_test_inner( &dependencies, ) }, - TestObjective::DataAvailabilityWrite => { + TestDataAvailability::Write => { let availability_distribution = AvailabilityDistributionSubsystem::new( - test_authorities.keyring.keystore(), + state.test_authorities.keyring.keystore(), IncomingRequestReceivers { pov_req_receiver, chunk_req_receiver }, Metrics::try_register(&dependencies.registry).unwrap(), ); - let block_headers = (1..=config.num_blocks) - .map(|block_number| { - ( - Hash::repeat_byte(block_number as u8), - Header { - digest: Default::default(), - number: block_number as BlockNumber, - parent_hash: Default::default(), - extrinsics_root: Default::default(), - state_root: Default::default(), - }, - ) - }) - .collect::>(); - - let chain_api_state = ChainApiState { block_headers }; + let chain_api_state = ChainApiState { block_headers: state.block_headers.clone() }; let chain_api = MockChainApi::new(chain_api_state); let bitfield_distribution = BitfieldDistribution::new(Metrics::try_register(&dependencies.registry).unwrap()); @@ -282,174 +244,47 @@ fn prepare_test_inner( &dependencies, ) }, - _ => { - unimplemented!("Invalid test objective") - }, }; ( TestEnvironment::new( dependencies, - config, + state.config.clone(), network, overseer, overseer_handle, - test_authorities, + state.test_authorities.clone(), + with_prometheus_endpoint, ), req_cfgs, ) } -#[derive(Clone)] -pub struct TestState { - // Full test configuration - config: TestConfiguration, - // A cycle iterator on all PoV sizes used in the test. - pov_sizes: Cycle>, - // Generated candidate receipts to be used in the test - candidates: Cycle>, - // Map from pov size to candidate index - pov_size_to_candidate: HashMap, - // Map from generated candidate hashes to candidate index in `available_data` - // and `chunks`. - candidate_hashes: HashMap, - // Per candidate index receipts. - candidate_receipt_templates: Vec, - // Per candidate index `AvailableData` - available_data: Vec, - // Per candiadte index chunks - chunks: Vec>, - // Per relay chain block - candidate backed by our backing group - backed_candidates: Vec, -} - -impl TestState { - fn config(&self) -> &TestConfiguration { - &self.config - } - - pub fn next_candidate(&mut self) -> Option { - let candidate = self.candidates.next(); - let candidate_hash = candidate.as_ref().unwrap().hash(); - gum::trace!(target: LOG_TARGET, "Next candidate selected {:?}", candidate_hash); - candidate - } - - /// Generate candidates to be used in the test. - fn generate_candidates(&mut self) { - let count = self.config.n_cores * self.config.num_blocks; - gum::info!(target: LOG_TARGET,"{}", format!("Pre-generating {} candidates.", count).bright_blue()); - - // Generate all candidates - self.candidates = (0..count) - .map(|index| { - let pov_size = self.pov_sizes.next().expect("This is a cycle; qed"); - let candidate_index = *self - .pov_size_to_candidate - .get(&pov_size) - .expect("pov_size always exists; qed"); - let mut candidate_receipt = - self.candidate_receipt_templates[candidate_index].clone(); - - // Make it unique. - candidate_receipt.descriptor.relay_parent = Hash::from_low_u64_be(index as u64); - // Store the new candidate in the state - self.candidate_hashes.insert(candidate_receipt.hash(), candidate_index); - - gum::debug!(target: LOG_TARGET, candidate_hash = ?candidate_receipt.hash(), "new candidate"); - - candidate_receipt - }) - .collect::>() - .into_iter() - .cycle(); - } - - pub fn new(config: &TestConfiguration) -> Self { - let config = config.clone(); - - let mut chunks = Vec::new(); - let mut available_data = Vec::new(); - let mut candidate_receipt_templates = Vec::new(); - let mut pov_size_to_candidate = HashMap::new(); - - // we use it for all candidates. - let persisted_validation_data = PersistedValidationData { - parent_head: HeadData(vec![7, 8, 9]), - relay_parent_number: Default::default(), - max_pov_size: 1024, - relay_parent_storage_root: Default::default(), - }; - - // For each unique pov we create a candidate receipt. - for (index, pov_size) in config.pov_sizes().iter().cloned().unique().enumerate() { - gum::info!(target: LOG_TARGET, index, pov_size, "{}", "Generating template candidate".bright_blue()); - - let mut candidate_receipt = dummy_candidate_receipt(dummy_hash()); - let pov = PoV { block_data: BlockData(vec![index as u8; pov_size]) }; - - let new_available_data = AvailableData { - validation_data: persisted_validation_data.clone(), - pov: Arc::new(pov), - }; - - let (new_chunks, erasure_root) = derive_erasure_chunks_with_proofs_and_root( - config.n_validators, - &new_available_data, - |_, _| {}, - ); - - candidate_receipt.descriptor.erasure_root = erasure_root; - - chunks.push(new_chunks); - available_data.push(new_available_data); - pov_size_to_candidate.insert(pov_size, index); - candidate_receipt_templates.push(candidate_receipt); - } - - gum::info!(target: LOG_TARGET, "{}","Created test environment.".bright_blue()); - - let mut _self = Self { - available_data, - candidate_receipt_templates, - chunks, - pov_size_to_candidate, - pov_sizes: Vec::from(config.pov_sizes()).into_iter().cycle(), - candidate_hashes: HashMap::new(), - candidates: Vec::new().into_iter().cycle(), - backed_candidates: Vec::new(), - config, - }; - - _self.generate_candidates(); - _self - } - - pub fn backed_candidates(&mut self) -> &mut Vec { - &mut self.backed_candidates - } -} - -pub async fn benchmark_availability_read(env: &mut TestEnvironment, mut state: TestState) { +pub async fn benchmark_availability_read( + benchmark_name: &str, + env: &mut TestEnvironment, + state: &TestState, +) -> BenchmarkUsage { let config = env.config().clone(); - env.import_block(new_block_import_info(Hash::repeat_byte(1), 1)).await; - - let test_start = Instant::now(); - let mut batch = FuturesUnordered::new(); - let mut availability_bytes = 0u128; - env.metrics().set_n_validators(config.n_validators); env.metrics().set_n_cores(config.n_cores); - for block_num in 1..=env.config().num_blocks { + let mut batch = FuturesUnordered::new(); + let mut availability_bytes = 0u128; + let mut candidates = state.candidates.clone(); + let test_start = Instant::now(); + for block_info in state.block_infos.iter() { + let block_num = block_info.number as usize; gum::info!(target: LOG_TARGET, "Current block {}/{}", block_num, env.config().num_blocks); env.metrics().set_current_block(block_num); let block_start_ts = Instant::now(); + env.import_block(block_info.clone()).await; + for candidate_num in 0..config.n_cores as u64 { let candidate = - state.next_candidate().expect("We always send up to n_cores*num_blocks; qed"); + candidates.next().expect("We always send up to n_cores*num_blocks; qed"); let (tx, rx) = oneshot::channel(); batch.push(rx); @@ -490,19 +325,22 @@ pub async fn benchmark_availability_read(env: &mut TestEnvironment, mut state: T format!("{} ms", test_start.elapsed().as_millis() / env.config().num_blocks as u128).red() ); - env.display_network_usage(); - env.display_cpu_usage(&["availability-recovery"]); env.stop().await; + env.collect_resource_usage(benchmark_name, &["availability-recovery"]) } -pub async fn benchmark_availability_write(env: &mut TestEnvironment, mut state: TestState) { +pub async fn benchmark_availability_write( + benchmark_name: &str, + env: &mut TestEnvironment, + state: &TestState, +) -> BenchmarkUsage { let config = env.config().clone(); env.metrics().set_n_validators(config.n_validators); env.metrics().set_n_cores(config.n_cores); gum::info!(target: LOG_TARGET, "Seeding availability store with candidates ..."); - for backed_candidate in state.backed_candidates().clone() { + for backed_candidate in state.backed_candidates.clone() { let candidate_index = *state.candidate_hashes.get(&backed_candidate.hash()).unwrap(); let available_data = state.available_data[candidate_index].clone(); let (tx, rx) = oneshot::channel(); @@ -525,15 +363,14 @@ pub async fn benchmark_availability_write(env: &mut TestEnvironment, mut state: gum::info!(target: LOG_TARGET, "Done"); let test_start = Instant::now(); - - for block_num in 1..=env.config().num_blocks { + for block_info in state.block_infos.iter() { + let block_num = block_info.number as usize; gum::info!(target: LOG_TARGET, "Current block #{}", block_num); env.metrics().set_current_block(block_num); let block_start_ts = Instant::now(); - let relay_block_hash = Hash::repeat_byte(block_num as u8); - env.import_block(new_block_import_info(relay_block_hash, block_num as BlockNumber)) - .await; + let relay_block_hash = block_info.hash; + env.import_block(block_info.clone()).await; // Inform bitfield distribution about our view of current test block let message = polkadot_node_subsystem_types::messages::BitfieldDistributionMessage::NetworkBridgeUpdate( @@ -544,20 +381,13 @@ pub async fn benchmark_availability_write(env: &mut TestEnvironment, mut state: let chunk_fetch_start_ts = Instant::now(); // Request chunks of our own backed candidate from all other validators. - let mut receivers = Vec::new(); - for index in 1..config.n_validators { + let payloads = state.chunk_fetching_requests.get(block_num - 1).expect("pregenerated"); + let receivers = (1..config.n_validators).filter_map(|index| { let (pending_response, pending_response_receiver) = oneshot::channel(); - let request = RawIncomingRequest { - peer: PeerId::random(), - payload: ChunkFetchingRequest { - candidate_hash: state.backed_candidates()[block_num - 1].hash(), - index: ValidatorIndex(index as u32), - } - .encode(), - pending_response, - }; - + let peer_id = *env.authorities().peer_ids.get(index).expect("all validators have ids"); + let payload = payloads.get(index).expect("pregenerated").clone(); + let request = RawIncomingRequest { peer: peer_id, payload, pending_response }; let peer = env .authorities() .validator_authority_id @@ -567,59 +397,39 @@ pub async fn benchmark_availability_write(env: &mut TestEnvironment, mut state: if env.network().is_peer_connected(peer) && env.network().send_request_from_peer(peer, request).is_ok() { - receivers.push(pending_response_receiver); + Some(pending_response_receiver) + } else { + None } - } + }); gum::info!(target: LOG_TARGET, "Waiting for all emulated peers to receive their chunk from us ..."); - for receiver in receivers.into_iter() { - let response = receiver.await.expect("Chunk is always served succesfully"); - // TODO: check if chunk is the one the peer expects to receive. - assert!(response.result.is_ok()); - } - let chunk_fetch_duration = Instant::now().sub(chunk_fetch_start_ts).as_millis(); + let responses = futures::future::try_join_all(receivers) + .await + .expect("Chunk is always served successfully"); + // TODO: check if chunk is the one the peer expects to receive. + assert!(responses.iter().all(|v| v.result.is_ok())); + let chunk_fetch_duration = Instant::now().sub(chunk_fetch_start_ts).as_millis(); gum::info!(target: LOG_TARGET, "All chunks received in {}ms", chunk_fetch_duration); - let signing_context = SigningContext { session_index: 0, parent_hash: relay_block_hash }; let network = env.network().clone(); let authorities = env.authorities().clone(); - let n_validators = config.n_validators; - // Spawn a task that will generate `n_validator` - 1 signed bitfiends and + // Spawn a task that will generate `n_validator` - 1 signed bitfields and // send them from the emulated peers to the subsystem. // TODO: Implement topology. - env.spawn_blocking("send-bitfields", async move { - for index in 1..n_validators { - let validator_public = - authorities.validator_public.get(index).expect("All validator keys are known"); - - // Node has all the chunks in the world. - let payload: AvailabilityBitfield = - AvailabilityBitfield(bitvec![u8, bitvec::order::Lsb0; 1u8; 32]); - // TODO(soon): Use pre-signed messages. This is quite intensive on the CPU. - let signed_bitfield = Signed::::sign( - &authorities.keyring.keystore(), - payload, - &signing_context, - ValidatorIndex(index as u32), - validator_public, - ) - .ok() - .flatten() - .expect("should be signed"); - - let from_peer = &authorities.validator_authority_id[index]; - - let message = peer_bitfield_message_v2(relay_block_hash, signed_bitfield); + let messages = state.signed_bitfields.get(&relay_block_hash).expect("pregenerated").clone(); + for index in 1..config.n_validators { + let from_peer = &authorities.validator_authority_id[index]; + let message = messages.get(index).expect("pregenerated").clone(); - // Send the action from peer only if it is connected to our node. - if network.is_peer_connected(from_peer) { - let _ = network.send_message_from_peer(from_peer, message); - } + // Send the action from peer only if it is connected to our node. + if network.is_peer_connected(from_peer) { + let _ = network.send_message_from_peer(from_peer, message); } - }); + } gum::info!( "Waiting for {} bitfields to be received and processed", @@ -628,7 +438,7 @@ pub async fn benchmark_availability_write(env: &mut TestEnvironment, mut state: // Wait for all bitfields to be processed. env.wait_until_metric( - "polkadot_parachain_received_availabilty_bitfields_total", + "polkadot_parachain_received_availability_bitfields_total", None, |value| value == (config.connected_count() * block_num) as f64, ) @@ -648,27 +458,9 @@ pub async fn benchmark_availability_write(env: &mut TestEnvironment, mut state: format!("{} ms", test_start.elapsed().as_millis() / env.config().num_blocks as u128).red() ); - env.display_network_usage(); - - env.display_cpu_usage(&[ - "availability-distribution", - "bitfield-distribution", - "availability-store", - ]); - env.stop().await; -} - -pub fn peer_bitfield_message_v2( - relay_hash: H256, - signed_bitfield: Signed, -) -> VersionedValidationProtocol { - let bitfield = polkadot_node_network_protocol::v2::BitfieldDistributionMessage::Bitfield( - relay_hash, - signed_bitfield.into(), - ); - - Versioned::V2(polkadot_node_network_protocol::v2::ValidationProtocol::BitfieldDistribution( - bitfield, - )) + env.collect_resource_usage( + benchmark_name, + &["availability-distribution", "bitfield-distribution", "availability-store"], + ) } diff --git a/polkadot/node/subsystem-bench/src/lib/availability/test_state.rs b/polkadot/node/subsystem-bench/src/lib/availability/test_state.rs new file mode 100644 index 0000000000000000000000000000000000000000..c328ffedf916e1ae9ce7fcd05e25750e01dc7506 --- /dev/null +++ b/polkadot/node/subsystem-bench/src/lib/availability/test_state.rs @@ -0,0 +1,268 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +use crate::configuration::{TestAuthorities, TestConfiguration}; +use bitvec::bitvec; +use colored::Colorize; +use itertools::Itertools; +use parity_scale_codec::Encode; +use polkadot_node_network_protocol::{ + request_response::v1::ChunkFetchingRequest, Versioned, VersionedValidationProtocol, +}; +use polkadot_node_primitives::{AvailableData, BlockData, ErasureChunk, PoV}; +use polkadot_node_subsystem_test_helpers::{ + derive_erasure_chunks_with_proofs_and_root, mock::new_block_import_info, +}; +use polkadot_overseer::BlockInfo; +use polkadot_primitives::{ + AvailabilityBitfield, BlockNumber, CandidateHash, CandidateReceipt, Hash, HeadData, Header, + PersistedValidationData, Signed, SigningContext, ValidatorIndex, +}; +use polkadot_primitives_test_helpers::{dummy_candidate_receipt, dummy_hash}; +use sp_core::H256; +use std::{collections::HashMap, iter::Cycle, sync::Arc}; + +const LOG_TARGET: &str = "subsystem-bench::availability::test_state"; + +#[derive(Clone)] +pub struct TestState { + // Full test configuration + pub config: TestConfiguration, + // A cycle iterator on all PoV sizes used in the test. + pub pov_sizes: Cycle>, + // Generated candidate receipts to be used in the test + pub candidates: Cycle>, + // Map from pov size to candidate index + pub pov_size_to_candidate: HashMap, + // Map from generated candidate hashes to candidate index in `available_data` and `chunks`. + pub candidate_hashes: HashMap, + // Per candidate index receipts. + pub candidate_receipt_templates: Vec, + // Per candidate index `AvailableData` + pub available_data: Vec, + // Per candiadte index chunks + pub chunks: Vec>, + // Per relay chain block - candidate backed by our backing group + pub backed_candidates: Vec, + // Relay chain block infos + pub block_infos: Vec, + // Chung fetching requests for backed candidates + pub chunk_fetching_requests: Vec>>, + // Pregenerated signed availability bitfields + pub signed_bitfields: HashMap>, + // Relay chain block headers + pub block_headers: HashMap, + // Authority keys for the network emulation. + pub test_authorities: TestAuthorities, + // Map from generated candidate receipts + pub candidate_receipts: HashMap>, +} + +impl TestState { + pub fn new(config: &TestConfiguration) -> Self { + let mut test_state = Self { + available_data: Default::default(), + candidate_receipt_templates: Default::default(), + chunks: Default::default(), + pov_size_to_candidate: Default::default(), + pov_sizes: Vec::from(config.pov_sizes()).into_iter().cycle(), + candidate_hashes: HashMap::new(), + candidates: Vec::new().into_iter().cycle(), + backed_candidates: Vec::new(), + config: config.clone(), + block_infos: Default::default(), + chunk_fetching_requests: Default::default(), + signed_bitfields: Default::default(), + candidate_receipts: Default::default(), + block_headers: Default::default(), + test_authorities: config.generate_authorities(), + }; + + // we use it for all candidates. + let persisted_validation_data = PersistedValidationData { + parent_head: HeadData(vec![7, 8, 9]), + relay_parent_number: Default::default(), + max_pov_size: 1024, + relay_parent_storage_root: Default::default(), + }; + + // For each unique pov we create a candidate receipt. + for (index, pov_size) in config.pov_sizes().iter().cloned().unique().enumerate() { + gum::info!(target: LOG_TARGET, index, pov_size, "{}", "Generating template candidate".bright_blue()); + + let mut candidate_receipt = dummy_candidate_receipt(dummy_hash()); + let pov = PoV { block_data: BlockData(vec![index as u8; pov_size]) }; + + let new_available_data = AvailableData { + validation_data: persisted_validation_data.clone(), + pov: Arc::new(pov), + }; + + let (new_chunks, erasure_root) = derive_erasure_chunks_with_proofs_and_root( + config.n_validators, + &new_available_data, + |_, _| {}, + ); + + candidate_receipt.descriptor.erasure_root = erasure_root; + + test_state.chunks.push(new_chunks); + test_state.available_data.push(new_available_data); + test_state.pov_size_to_candidate.insert(pov_size, index); + test_state.candidate_receipt_templates.push(candidate_receipt); + } + + test_state.block_infos = (1..=config.num_blocks) + .map(|block_num| { + let relay_block_hash = Hash::repeat_byte(block_num as u8); + new_block_import_info(relay_block_hash, block_num as BlockNumber) + }) + .collect(); + + test_state.block_headers = test_state + .block_infos + .iter() + .map(|info| { + ( + info.hash, + Header { + digest: Default::default(), + number: info.number, + parent_hash: info.parent_hash, + extrinsics_root: Default::default(), + state_root: Default::default(), + }, + ) + }) + .collect::>(); + + // Generate all candidates + let candidates_count = config.n_cores * config.num_blocks; + gum::info!(target: LOG_TARGET,"{}", format!("Pre-generating {} candidates.", candidates_count).bright_blue()); + test_state.candidates = (0..candidates_count) + .map(|index| { + let pov_size = test_state.pov_sizes.next().expect("This is a cycle; qed"); + let candidate_index = *test_state + .pov_size_to_candidate + .get(&pov_size) + .expect("pov_size always exists; qed"); + let mut candidate_receipt = + test_state.candidate_receipt_templates[candidate_index].clone(); + + // Make it unique. + candidate_receipt.descriptor.relay_parent = Hash::from_low_u64_be(index as u64); + // Store the new candidate in the state + test_state.candidate_hashes.insert(candidate_receipt.hash(), candidate_index); + + gum::debug!(target: LOG_TARGET, candidate_hash = ?candidate_receipt.hash(), "new candidate"); + + candidate_receipt + }) + .collect::>() + .into_iter() + .cycle(); + + // Prepare per block candidates. + // Genesis block is always finalized, so we start at 1. + for info in test_state.block_infos.iter() { + for _ in 0..config.n_cores { + let receipt = test_state.candidates.next().expect("Cycle iterator"); + test_state.candidate_receipts.entry(info.hash).or_default().push(receipt); + } + + // First candidate is our backed candidate. + test_state.backed_candidates.push( + test_state + .candidate_receipts + .get(&info.hash) + .expect("just inserted above") + .first() + .expect("just inserted above") + .clone(), + ); + } + + test_state.chunk_fetching_requests = test_state + .backed_candidates + .iter() + .map(|candidate| { + (0..config.n_validators) + .map(|index| { + ChunkFetchingRequest { + candidate_hash: candidate.hash(), + index: ValidatorIndex(index as u32), + } + .encode() + }) + .collect::>() + }) + .collect::>(); + + test_state.signed_bitfields = test_state + .block_infos + .iter() + .map(|block_info| { + let signing_context = + SigningContext { session_index: 0, parent_hash: block_info.hash }; + let messages = (0..config.n_validators) + .map(|index| { + let validator_public = test_state + .test_authorities + .validator_public + .get(index) + .expect("All validator keys are known"); + + // Node has all the chunks in the world. + let payload: AvailabilityBitfield = + AvailabilityBitfield(bitvec![u8, bitvec::order::Lsb0; 1u8; 32]); + let signed_bitfield = Signed::::sign( + &test_state.test_authorities.keyring.keystore(), + payload, + &signing_context, + ValidatorIndex(index as u32), + validator_public, + ) + .ok() + .flatten() + .expect("should be signed"); + + peer_bitfield_message_v2(block_info.hash, signed_bitfield) + }) + .collect::>(); + + (block_info.hash, messages) + }) + .collect(); + + gum::info!(target: LOG_TARGET, "{}","Created test environment.".bright_blue()); + + test_state + } +} + +fn peer_bitfield_message_v2( + relay_hash: H256, + signed_bitfield: Signed, +) -> VersionedValidationProtocol { + let bitfield = polkadot_node_network_protocol::v2::BitfieldDistributionMessage::Bitfield( + relay_hash, + signed_bitfield.into(), + ); + + Versioned::V2(polkadot_node_network_protocol::v2::ValidationProtocol::BitfieldDistribution( + bitfield, + )) +} diff --git a/polkadot/node/subsystem-bench/src/core/configuration.rs b/polkadot/node/subsystem-bench/src/lib/configuration.rs similarity index 62% rename from polkadot/node/subsystem-bench/src/core/configuration.rs rename to polkadot/node/subsystem-bench/src/lib/configuration.rs index 0c8a78c504c8c22ca83eb0d7362aca3e2bcda916..1e0efb72a7dff163898bcf6974ce9bc048bfa086 100644 --- a/polkadot/node/subsystem-bench/src/core/configuration.rs +++ b/polkadot/node/subsystem-bench/src/lib/configuration.rs @@ -13,31 +13,18 @@ // You should have received a copy of the GNU General Public License // along with Polkadot. If not, see . -// + //! Test configuration definition and helpers. -use super::*; -use itertools::Itertools; -use keyring::Keyring; -use sc_network::PeerId; -use sp_consensus_babe::AuthorityId; -use std::{collections::HashMap, path::Path}; -pub use crate::cli::TestObjective; +use crate::keyring::Keyring; +use itertools::Itertools; use polkadot_primitives::{AssignmentId, AuthorityDiscoveryId, ValidatorId}; use rand::thread_rng; use rand_distr::{Distribution, Normal, Uniform}; - +use sc_network_types::PeerId; use serde::{Deserialize, Serialize}; - -pub fn random_pov_size(min_pov_size: usize, max_pov_size: usize) -> usize { - random_uniform_sample(min_pov_size, max_pov_size) -} - -fn random_uniform_sample + From>(min_value: T, max_value: T) -> T { - Uniform::from(min_value.into()..=max_value.into()) - .sample(&mut thread_rng()) - .into() -} +use sp_consensus_babe::AuthorityId; +use std::collections::HashMap; /// Peer networking latency configuration. #[derive(Clone, Debug, Default, Serialize, Deserialize)] @@ -48,19 +35,34 @@ pub struct PeerLatency { pub std_dev: f64, } +// Based on Kusama `max_validators` +fn default_n_validators() -> usize { + 300 +} + +// Based on Kusama cores +fn default_n_cores() -> usize { + 60 +} + // Default PoV size in KiB. fn default_pov_size() -> usize { - 5120 + 5 * 1024 } -// Default bandwidth in bytes +// Default bandwidth in bytes, based stats from Kusama validators fn default_bandwidth() -> usize { - 52428800 + 42 * 1024 * 1024 +} + +// Default peer latency +fn default_peer_latency() -> Option { + Some(PeerLatency { mean_latency_ms: 30, std_dev: 2.0 }) } // Default connectivity percentage fn default_connectivity() -> usize { - 100 + 90 } // Default backing group size @@ -76,6 +78,7 @@ fn default_needed_approvals() -> usize { fn default_zeroth_delay_tranche_width() -> usize { 0 } + fn default_relay_vrf_modulo_samples() -> usize { 6 } @@ -90,11 +93,11 @@ fn default_no_show_slots() -> usize { /// The test input parameters #[derive(Clone, Debug, Serialize, Deserialize)] pub struct TestConfiguration { - /// The test objective - pub objective: TestObjective, /// Number of validators + #[serde(default = "default_n_validators")] pub n_validators: usize, /// Number of cores + #[serde(default = "default_n_cores")] pub n_cores: usize, /// The number of needed votes to approve a candidate. #[serde(default = "default_needed_approvals")] @@ -118,74 +121,50 @@ pub struct TestConfiguration { pub max_pov_size: usize, /// Randomly sampled pov_sizes #[serde(skip)] - pov_sizes: Vec, - /// The amount of bandiwdth remote validators have. + pub pov_sizes: Vec, + /// The amount of bandwidth remote validators have. #[serde(default = "default_bandwidth")] pub peer_bandwidth: usize, - /// The amount of bandiwdth our node has. + /// The amount of bandwidth our node has. #[serde(default = "default_bandwidth")] pub bandwidth: usize, /// Optional peer emulation latency (round trip time) wrt node under test - #[serde(default)] + #[serde(default = "default_peer_latency")] pub latency: Option, - /// Connectivity ratio, the percentage of peers we are not connected to, but ar part of - /// the topology. + /// Connectivity ratio, the percentage of peers we are connected to, but as part of the + /// topology. #[serde(default = "default_connectivity")] pub connectivity: usize, /// Number of blocks to run the test for pub num_blocks: usize, } -fn generate_pov_sizes(count: usize, min_kib: usize, max_kib: usize) -> Vec { - (0..count).map(|_| random_pov_size(min_kib * 1024, max_kib * 1024)).collect() -} - -#[derive(Serialize, Deserialize)] -pub struct TestSequence { - #[serde(rename(serialize = "TestConfiguration", deserialize = "TestConfiguration"))] - test_configurations: Vec, -} - -impl TestSequence { - pub fn into_vec(self) -> Vec { - self.test_configurations - .into_iter() - .map(|mut config| { - config.pov_sizes = - generate_pov_sizes(config.n_cores, config.min_pov_size, config.max_pov_size); - config - }) - .collect() - } -} - -impl TestSequence { - pub fn new_from_file(path: &Path) -> std::io::Result { - let string = String::from_utf8(std::fs::read(path)?).expect("File is valid UTF8"); - Ok(serde_yaml::from_str(&string).expect("File is valid test sequence YA")) +impl Default for TestConfiguration { + fn default() -> Self { + Self { + n_validators: default_n_validators(), + n_cores: default_n_cores(), + needed_approvals: default_needed_approvals(), + zeroth_delay_tranche_width: default_zeroth_delay_tranche_width(), + relay_vrf_modulo_samples: default_relay_vrf_modulo_samples(), + n_delay_tranches: default_n_delay_tranches(), + no_show_slots: default_no_show_slots(), + max_validators_per_core: default_backing_group_size(), + min_pov_size: default_pov_size(), + max_pov_size: default_pov_size(), + pov_sizes: Default::default(), + peer_bandwidth: default_bandwidth(), + bandwidth: default_bandwidth(), + latency: default_peer_latency(), + connectivity: default_connectivity(), + num_blocks: Default::default(), + } } } -/// Helper struct for authority related state. -#[derive(Clone)] -pub struct TestAuthorities { - pub keyring: Keyring, - pub validator_public: Vec, - pub validator_authority_id: Vec, - pub validator_babe_id: Vec, - pub validator_assignment_id: Vec, - pub key_seeds: Vec, - pub peer_ids: Vec, - pub peer_id_to_authority: HashMap, -} - impl TestConfiguration { - #[allow(unused)] - pub fn write_to_disk(&self) { - // Serialize a slice of configurations - let yaml = serde_yaml::to_string(&TestSequence { test_configurations: vec![self.clone()] }) - .unwrap(); - std::fs::write("last_test.yaml", yaml).unwrap(); + pub fn generate_pov_sizes(&mut self) { + self.pov_sizes = generate_pov_sizes(self.n_cores, self.min_pov_size, self.max_pov_size); } pub fn pov_sizes(&self) -> &[usize] { @@ -226,7 +205,7 @@ impl TestConfiguration { let peer_id_to_authority = peer_ids .iter() .zip(validator_authority_id.iter()) - .map(|(peer_id, authorithy_id)| (*peer_id, authorithy_id.clone())) + .map(|(peer_id, authority_id)| (*peer_id, authority_id.clone())) .collect(); TestAuthorities { @@ -240,95 +219,33 @@ impl TestConfiguration { peer_id_to_authority, } } +} - /// An unconstrained standard configuration matching Polkadot/Kusama - pub fn ideal_network( - objective: TestObjective, - num_blocks: usize, - n_validators: usize, - n_cores: usize, - min_pov_size: usize, - max_pov_size: usize, - ) -> TestConfiguration { - Self { - objective, - n_cores, - n_validators, - max_validators_per_core: 5, - pov_sizes: generate_pov_sizes(n_cores, min_pov_size, max_pov_size), - bandwidth: 50 * 1024 * 1024, - peer_bandwidth: 50 * 1024 * 1024, - // No latency - latency: None, - num_blocks, - min_pov_size, - max_pov_size, - connectivity: 100, - needed_approvals: default_needed_approvals(), - n_delay_tranches: default_n_delay_tranches(), - no_show_slots: default_no_show_slots(), - relay_vrf_modulo_samples: default_relay_vrf_modulo_samples(), - zeroth_delay_tranche_width: default_zeroth_delay_tranche_width(), - } - } +fn random_uniform_sample + From>(min_value: T, max_value: T) -> T { + Uniform::from(min_value.into()..=max_value.into()) + .sample(&mut thread_rng()) + .into() +} - pub fn healthy_network( - objective: TestObjective, - num_blocks: usize, - n_validators: usize, - n_cores: usize, - min_pov_size: usize, - max_pov_size: usize, - ) -> TestConfiguration { - Self { - objective, - n_cores, - n_validators, - max_validators_per_core: 5, - pov_sizes: generate_pov_sizes(n_cores, min_pov_size, max_pov_size), - bandwidth: 50 * 1024 * 1024, - peer_bandwidth: 50 * 1024 * 1024, - latency: Some(PeerLatency { mean_latency_ms: 50, std_dev: 12.5 }), - num_blocks, - min_pov_size, - max_pov_size, - connectivity: 95, - needed_approvals: default_needed_approvals(), - n_delay_tranches: default_n_delay_tranches(), - no_show_slots: default_no_show_slots(), - relay_vrf_modulo_samples: default_relay_vrf_modulo_samples(), - zeroth_delay_tranche_width: default_zeroth_delay_tranche_width(), - } - } +fn random_pov_size(min_pov_size: usize, max_pov_size: usize) -> usize { + random_uniform_sample(min_pov_size, max_pov_size) +} - pub fn degraded_network( - objective: TestObjective, - num_blocks: usize, - n_validators: usize, - n_cores: usize, - min_pov_size: usize, - max_pov_size: usize, - ) -> TestConfiguration { - Self { - objective, - n_cores, - n_validators, - max_validators_per_core: 5, - pov_sizes: generate_pov_sizes(n_cores, min_pov_size, max_pov_size), - bandwidth: 50 * 1024 * 1024, - peer_bandwidth: 50 * 1024 * 1024, - latency: Some(PeerLatency { mean_latency_ms: 150, std_dev: 40.0 }), - num_blocks, - min_pov_size, - max_pov_size, - connectivity: 67, - needed_approvals: default_needed_approvals(), - n_delay_tranches: default_n_delay_tranches(), - no_show_slots: default_no_show_slots(), - relay_vrf_modulo_samples: default_relay_vrf_modulo_samples(), - zeroth_delay_tranche_width: default_zeroth_delay_tranche_width(), - } - } +fn generate_pov_sizes(count: usize, min_kib: usize, max_kib: usize) -> Vec { + (0..count).map(|_| random_pov_size(min_kib * 1024, max_kib * 1024)).collect() +} + +/// Helper struct for authority related state. +#[derive(Clone)] +pub struct TestAuthorities { + pub keyring: Keyring, + pub validator_public: Vec, + pub validator_authority_id: Vec, + pub validator_babe_id: Vec, + pub validator_assignment_id: Vec, + pub key_seeds: Vec, + pub peer_ids: Vec, + pub peer_id_to_authority: HashMap, } /// Sample latency (in milliseconds) from a normal distribution with parameters diff --git a/polkadot/node/subsystem-bench/src/core/display.rs b/polkadot/node/subsystem-bench/src/lib/display.rs similarity index 88% rename from polkadot/node/subsystem-bench/src/core/display.rs rename to polkadot/node/subsystem-bench/src/lib/display.rs index b130afdcfad578e2565d4556f67b76280df7de11..b153d54a7c36f43bc110dde9443f2413a34d9af6 100644 --- a/polkadot/node/subsystem-bench/src/core/display.rs +++ b/polkadot/node/subsystem-bench/src/lib/display.rs @@ -13,12 +13,13 @@ // You should have received a copy of the GNU General Public License // along with Polkadot. If not, see . -// + //! Display implementations and helper methods for parsing prometheus metrics //! to a format that can be displayed in the CLI. //! //! Currently histogram buckets are skipped. -use super::{configuration::TestConfiguration, LOG_TARGET}; + +use crate::configuration::TestConfiguration; use colored::Colorize; use prometheus::{ proto::{MetricFamily, MetricType}, @@ -26,6 +27,8 @@ use prometheus::{ }; use std::fmt::Display; +const LOG_TARGET: &str = "subsystem-bench::display"; + #[derive(Default, Debug)] pub struct MetricCollection(Vec); @@ -84,6 +87,7 @@ impl Display for MetricCollection { Ok(()) } } + #[derive(Debug, Clone)] pub struct TestMetric { name: String, @@ -183,15 +187,16 @@ pub fn parse_metrics(registry: &Registry) -> MetricCollection { test_metrics.into() } -pub fn display_configuration(test_config: &TestConfiguration) { - gum::info!( - "[{}] {}, {}, {}, {}, {}", - format!("objective = {:?}", test_config.objective).green(), - format!("n_validators = {}", test_config.n_validators).blue(), - format!("n_cores = {}", test_config.n_cores).blue(), - format!("pov_size = {} - {}", test_config.min_pov_size, test_config.max_pov_size) - .bright_black(), - format!("connectivity = {}", test_config.connectivity).bright_black(), - format!("latency = {:?}", test_config.latency).bright_black(), - ); +impl Display for TestConfiguration { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!( + f, + "{}, {}, {}, {}, {}", + format!("n_validators = {}", self.n_validators).blue(), + format!("n_cores = {}", self.n_cores).blue(), + format!("pov_size = {} - {}", self.min_pov_size, self.max_pov_size).bright_black(), + format!("connectivity = {}", self.connectivity).bright_black(), + format!("latency = {:?}", self.latency).bright_black(), + ) + } } diff --git a/polkadot/node/subsystem-bench/src/core/environment.rs b/polkadot/node/subsystem-bench/src/lib/environment.rs similarity index 84% rename from polkadot/node/subsystem-bench/src/core/environment.rs rename to polkadot/node/subsystem-bench/src/lib/environment.rs index 59bfed7f112005ad9002afaddd2cd51200ddcb3f..42955d0302232f35e387a044e34a0c7d665512e8 100644 --- a/polkadot/node/subsystem-bench/src/core/environment.rs +++ b/polkadot/node/subsystem-bench/src/lib/environment.rs @@ -13,28 +13,28 @@ // You should have received a copy of the GNU General Public License // along with Polkadot. If not, see . + //! Test environment implementation + use crate::{ - core::{mock::AlwaysSupportsParachains, network::NetworkEmulatorHandle}, - TestConfiguration, + configuration::{TestAuthorities, TestConfiguration}, + mock::AlwaysSupportsParachains, + network::NetworkEmulatorHandle, + usage::{BenchmarkUsage, ResourceUsage}, }; -use colored::Colorize; use core::time::Duration; use futures::{Future, FutureExt}; -use polkadot_overseer::{BlockInfo, Handle as OverseerHandle}; - use polkadot_node_subsystem::{messages::AllMessages, Overseer, SpawnGlue, TimeoutExt}; use polkadot_node_subsystem_types::Hash; use polkadot_node_subsystem_util::metrics::prometheus::{ self, Gauge, Histogram, PrometheusError, Registry, U64, }; - +use polkadot_overseer::{BlockInfo, Handle as OverseerHandle}; use sc_service::{SpawnTaskHandle, TaskManager}; use std::net::{Ipv4Addr, SocketAddr}; use tokio::runtime::Handle; const LOG_TARGET: &str = "subsystem-bench::environment"; -use super::configuration::TestAuthorities; /// Test environment/configuration metrics #[derive(Clone)] @@ -118,6 +118,7 @@ fn new_runtime() -> tokio::runtime::Runtime { .thread_name("subsystem-bench") .enable_all() .thread_stack_size(3 * 1024 * 1024) + .worker_threads(4) .build() .unwrap() } @@ -201,6 +202,7 @@ impl TestEnvironment { overseer: Overseer, AlwaysSupportsParachains>, overseer_handle: OverseerHandle, authorities: TestAuthorities, + with_prometheus_endpoint: bool, ) -> Self { let metrics = TestEnvironmentMetrics::new(&dependencies.registry) .expect("Metrics need to be registered"); @@ -208,19 +210,21 @@ impl TestEnvironment { let spawn_handle = dependencies.task_manager.spawn_handle(); spawn_handle.spawn_blocking("overseer", "overseer", overseer.run().boxed()); - let registry_clone = dependencies.registry.clone(); - dependencies.task_manager.spawn_handle().spawn_blocking( - "prometheus", - "test-environment", - async move { - prometheus_endpoint::init_prometheus( - SocketAddr::new(std::net::IpAddr::V4(Ipv4Addr::LOCALHOST), 9999), - registry_clone, - ) - .await - .unwrap(); - }, - ); + if with_prometheus_endpoint { + let registry_clone = dependencies.registry.clone(); + dependencies.task_manager.spawn_handle().spawn_blocking( + "prometheus", + "test-environment", + async move { + prometheus_endpoint::init_prometheus( + SocketAddr::new(std::net::IpAddr::V4(Ipv4Addr::LOCALHOST), 9999), + registry_clone, + ) + .await + .unwrap(); + }, + ); + } TestEnvironment { runtime_handle: dependencies.runtime.handle().clone(), @@ -347,57 +351,64 @@ impl TestEnvironment { } } - /// Display network usage stats. - pub fn display_network_usage(&self) { - let stats = self.network().peer_stats(0); - - let total_node_received = stats.received() / 1024; - let total_node_sent = stats.sent() / 1024; - - println!( - "\nPayload bytes received from peers: {}, {}", - format!("{:.2} KiB total", total_node_received).blue(), - format!("{:.2} KiB/block", total_node_received / self.config().num_blocks) - .bright_blue() - ); + pub fn collect_resource_usage( + &self, + benchmark_name: &str, + subsystems_under_test: &[&str], + ) -> BenchmarkUsage { + BenchmarkUsage { + benchmark_name: benchmark_name.to_string(), + network_usage: self.network_usage(), + cpu_usage: self.cpu_usage(subsystems_under_test), + } + } - println!( - "Payload bytes sent to peers: {}, {}", - format!("{:.2} KiB total", total_node_sent).blue(), - format!("{:.2} KiB/block", total_node_sent / self.config().num_blocks).bright_blue() - ); + fn network_usage(&self) -> Vec { + let stats = self.network().peer_stats(0); + let total_node_received = (stats.received() / 1024) as f64; + let total_node_sent = (stats.sent() / 1024) as f64; + let num_blocks = self.config().num_blocks as f64; + + vec![ + ResourceUsage { + resource_name: "Received from peers".to_string(), + total: total_node_received, + per_block: total_node_received / num_blocks, + }, + ResourceUsage { + resource_name: "Sent to peers".to_string(), + total: total_node_sent, + per_block: total_node_sent / num_blocks, + }, + ] } - /// Print CPU usage stats in the CLI. - pub fn display_cpu_usage(&self, subsystems_under_test: &[&str]) { + fn cpu_usage(&self, subsystems_under_test: &[&str]) -> Vec { let test_metrics = super::display::parse_metrics(self.registry()); + let mut usage = vec![]; + let num_blocks = self.config().num_blocks as f64; for subsystem in subsystems_under_test.iter() { let subsystem_cpu_metrics = test_metrics.subset_with_label_value("task_group", subsystem); let total_cpu = subsystem_cpu_metrics.sum_by("substrate_tasks_polling_duration_sum"); - println!( - "{} CPU usage {}", - subsystem.to_string().bright_green(), - format!("{:.3}s", total_cpu).bright_purple() - ); - println!( - "{} CPU usage per block {}", - subsystem.to_string().bright_green(), - format!("{:.3}s", total_cpu / self.config().num_blocks as f64).bright_purple() - ); + usage.push(ResourceUsage { + resource_name: subsystem.to_string(), + total: total_cpu, + per_block: total_cpu / num_blocks, + }); } let test_env_cpu_metrics = test_metrics.subset_with_label_value("task_group", "test-environment"); let total_cpu = test_env_cpu_metrics.sum_by("substrate_tasks_polling_duration_sum"); - println!( - "Total test environment CPU usage {}", - format!("{:.3}s", total_cpu).bright_purple() - ); - println!( - "Test environment CPU usage per block {}", - format!("{:.3}s", total_cpu / self.config().num_blocks as f64).bright_purple() - ) + + usage.push(ResourceUsage { + resource_name: "test-environment".to_string(), + total: total_cpu, + per_block: total_cpu / num_blocks, + }); + + usage } } diff --git a/polkadot/node/subsystem-bench/src/core/keyring.rs b/polkadot/node/subsystem-bench/src/lib/keyring.rs similarity index 100% rename from polkadot/node/subsystem-bench/src/core/keyring.rs rename to polkadot/node/subsystem-bench/src/lib/keyring.rs diff --git a/polkadot/node/subsystem-bench/src/core/mod.rs b/polkadot/node/subsystem-bench/src/lib/lib.rs similarity index 81% rename from polkadot/node/subsystem-bench/src/core/mod.rs rename to polkadot/node/subsystem-bench/src/lib/lib.rs index 507dd1aa83f6634583182c0faf77872ce556d52a..ef2724abc98920c79d8dd9d94f97bed32b0ab8e2 100644 --- a/polkadot/node/subsystem-bench/src/core/mod.rs +++ b/polkadot/node/subsystem-bench/src/lib/lib.rs @@ -14,13 +14,16 @@ // You should have received a copy of the GNU General Public License // along with Polkadot. If not, see . -const LOG_TARGET: &str = "subsystem-bench::core"; // The validator index that represent the node that is under test. pub const NODE_UNDER_TEST: u32 = 0; +pub mod approval; +pub mod availability; pub mod configuration; -pub mod display; -pub mod environment; -pub mod keyring; -pub mod mock; -pub mod network; +pub(crate) mod display; +pub(crate) mod environment; +pub(crate) mod keyring; +pub(crate) mod mock; +pub(crate) mod network; +pub mod usage; +pub mod utils; diff --git a/polkadot/node/subsystem-bench/src/core/mock/av_store.rs b/polkadot/node/subsystem-bench/src/lib/mock/av_store.rs similarity index 97% rename from polkadot/node/subsystem-bench/src/core/mock/av_store.rs rename to polkadot/node/subsystem-bench/src/lib/mock/av_store.rs index 76609ab5dba607865d28e5402f9bff5571ea403d..fba33523be85dbfd241bc1fcf42d8f8069ebf95c 100644 --- a/polkadot/node/subsystem-bench/src/core/mock/av_store.rs +++ b/polkadot/node/subsystem-bench/src/lib/mock/av_store.rs @@ -13,30 +13,24 @@ // You should have received a copy of the GNU General Public License // along with Polkadot. If not, see . -//! + //! A generic av store subsystem mockup suitable to be used in benchmarks. +use crate::network::{HandleNetworkMessage, NetworkMessage}; +use futures::{channel::oneshot, FutureExt}; use parity_scale_codec::Encode; use polkadot_node_network_protocol::request_response::{ v1::{AvailableDataFetchingResponse, ChunkFetchingResponse, ChunkResponse}, Requests, }; -use polkadot_primitives::CandidateHash; -use sc_network::ProtocolName; - -use std::collections::HashMap; - -use futures::{channel::oneshot, FutureExt}; - use polkadot_node_primitives::{AvailableData, ErasureChunk}; - use polkadot_node_subsystem::{ messages::AvailabilityStoreMessage, overseer, SpawnedSubsystem, SubsystemError, }; - use polkadot_node_subsystem_types::OverseerSignal; - -use crate::core::network::{HandleNetworkMessage, NetworkMessage}; +use polkadot_primitives::CandidateHash; +use sc_network::ProtocolName; +use std::collections::HashMap; pub struct AvailabilityStoreState { candidate_hashes: HashMap, @@ -45,8 +39,9 @@ pub struct AvailabilityStoreState { const LOG_TARGET: &str = "subsystem-bench::av-store-mock"; -/// Mockup helper. Contains Ccunks and full availability data of all parachain blocks +/// Mockup helper. Contains Chunks and full availability data of all parachain blocks /// used in a test. +#[derive(Clone)] pub struct NetworkAvailabilityState { pub candidate_hashes: HashMap, pub available_data: Vec, @@ -103,7 +98,7 @@ impl HandleNetworkMessage for NetworkAvailabilityState { outgoing_request .pending_response .send(response) - .expect("Response is always sent succesfully"); + .expect("Response is always sent successfully"); None }, _ => Some(NetworkMessage::RequestFromNode(peer, request)), diff --git a/polkadot/node/subsystem-bench/src/core/mock/chain_api.rs b/polkadot/node/subsystem-bench/src/lib/mock/chain_api.rs similarity index 98% rename from polkadot/node/subsystem-bench/src/core/mock/chain_api.rs rename to polkadot/node/subsystem-bench/src/lib/mock/chain_api.rs index 7a5ee80de8007fcd9d4c362676ebb391f0b268d9..86b030fb6fdcf7248b57f7fd47cdee6085bf8377 100644 --- a/polkadot/node/subsystem-bench/src/core/mock/chain_api.rs +++ b/polkadot/node/subsystem-bench/src/lib/mock/chain_api.rs @@ -13,21 +13,19 @@ // You should have received a copy of the GNU General Public License // along with Polkadot. If not, see . -//! + //! A generic runtime api subsystem mockup suitable to be used in benchmarks. +use futures::FutureExt; use itertools::Itertools; -use polkadot_primitives::Header; - use polkadot_node_subsystem::{ messages::ChainApiMessage, overseer, SpawnedSubsystem, SubsystemError, }; use polkadot_node_subsystem_types::OverseerSignal; +use polkadot_primitives::Header; use sp_core::H256; use std::collections::HashMap; -use futures::FutureExt; - const LOG_TARGET: &str = "subsystem-bench::chain-api-mock"; /// State used to respond to `BlockHeader` requests. @@ -91,7 +89,7 @@ impl MockChainApi { let hash = self .state .get_header_by_number(requested_number) - .expect("Unknow block number") + .expect("Unknown block number") .hash(); sender.send(Ok(Some(hash))).unwrap(); }, diff --git a/polkadot/node/subsystem-bench/src/core/mock/dummy.rs b/polkadot/node/subsystem-bench/src/lib/mock/dummy.rs similarity index 99% rename from polkadot/node/subsystem-bench/src/core/mock/dummy.rs rename to polkadot/node/subsystem-bench/src/lib/mock/dummy.rs index a0a908750c5181619fe836cdbf86c42ba8b99596..8783b35f1c04a9c59bf415340689b1a9ae29ee6a 100644 --- a/polkadot/node/subsystem-bench/src/core/mock/dummy.rs +++ b/polkadot/node/subsystem-bench/src/lib/mock/dummy.rs @@ -13,10 +13,11 @@ // You should have received a copy of the GNU General Public License // along with Polkadot. If not, see . + //! Dummy subsystem mocks. -use paste::paste; use futures::FutureExt; +use paste::paste; use polkadot_node_subsystem::{overseer, SpawnedSubsystem, SubsystemError}; use std::time::Duration; use tokio::time::sleep; diff --git a/polkadot/node/subsystem-bench/src/core/mock/mod.rs b/polkadot/node/subsystem-bench/src/lib/mock/mod.rs similarity index 95% rename from polkadot/node/subsystem-bench/src/core/mock/mod.rs rename to polkadot/node/subsystem-bench/src/lib/mock/mod.rs index e766b07e8b16479f9ce654e8a56f430b60136432..6dda9a47d398f3e6e952cd054bce9769e8942e70 100644 --- a/polkadot/node/subsystem-bench/src/core/mock/mod.rs +++ b/polkadot/node/subsystem-bench/src/lib/mock/mod.rs @@ -16,6 +16,7 @@ use polkadot_node_subsystem::HeadSupportsParachains; use polkadot_node_subsystem_types::Hash; +use sp_consensus::SyncOracle; pub mod av_store; pub mod chain_api; @@ -23,11 +24,8 @@ pub mod dummy; pub mod network_bridge; pub mod runtime_api; -pub use av_store::*; -pub use chain_api::*; -pub use runtime_api::*; - pub struct AlwaysSupportsParachains {} + #[async_trait::async_trait] impl HeadSupportsParachains for AlwaysSupportsParachains { async fn head_supports_parachains(&self, _head: &Hash) -> bool { @@ -36,9 +34,10 @@ impl HeadSupportsParachains for AlwaysSupportsParachains { } // An orchestra with dummy subsystems +#[macro_export] macro_rules! dummy_builder { ($spawn_task_handle: ident, $metrics: ident) => {{ - use super::core::mock::dummy::*; + use $crate::mock::dummy::*; // Initialize a mock overseer. // All subsystem except approval_voting and approval_distribution are mock subsystems. @@ -75,9 +74,6 @@ macro_rules! dummy_builder { }}; } -pub(crate) use dummy_builder; -use sp_consensus::SyncOracle; - #[derive(Clone)] pub struct TestSyncOracle {} diff --git a/polkadot/node/subsystem-bench/src/core/mock/network_bridge.rs b/polkadot/node/subsystem-bench/src/lib/mock/network_bridge.rs similarity index 96% rename from polkadot/node/subsystem-bench/src/core/mock/network_bridge.rs rename to polkadot/node/subsystem-bench/src/lib/mock/network_bridge.rs index a171deb2e715d09093b7b0df1f0d9836551e9f84..ec66ad4e279c217f7510d4c09def128f41fbffe5 100644 --- a/polkadot/node/subsystem-bench/src/core/mock/network_bridge.rs +++ b/polkadot/node/subsystem-bench/src/lib/mock/network_bridge.rs @@ -13,28 +13,25 @@ // You should have received a copy of the GNU General Public License // along with Polkadot. If not, see . -//! + //! Mocked `network-bridge` subsystems that uses a `NetworkInterface` to access //! the emulated network. + +use crate::{ + configuration::TestAuthorities, + network::{NetworkEmulatorHandle, NetworkInterfaceReceiver, NetworkMessage, RequestExt}, +}; use futures::{channel::mpsc::UnboundedSender, FutureExt, StreamExt}; +use polkadot_node_network_protocol::Versioned; +use polkadot_node_subsystem::{ + messages::NetworkBridgeTxMessage, overseer, SpawnedSubsystem, SubsystemError, +}; use polkadot_node_subsystem_types::{ messages::{ApprovalDistributionMessage, BitfieldDistributionMessage, NetworkBridgeEvent}, OverseerSignal, }; - use sc_network::{request_responses::ProtocolConfig, RequestFailure}; -use polkadot_node_subsystem::{ - messages::NetworkBridgeTxMessage, overseer, SpawnedSubsystem, SubsystemError, -}; - -use polkadot_node_network_protocol::Versioned; - -use crate::core::{ - configuration::TestAuthorities, - network::{NetworkEmulatorHandle, NetworkInterfaceReceiver, NetworkMessage, RequestExt}, -}; - const LOG_TARGET: &str = "subsystem-bench::network-bridge"; const CHUNK_REQ_PROTOCOL_NAME_V1: &str = "/ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff/req_chunk/1"; @@ -45,8 +42,8 @@ pub struct MockNetworkBridgeTx { network: NetworkEmulatorHandle, /// A channel to the network interface, to_network_interface: UnboundedSender, - /// Test authorithies - test_authorithies: TestAuthorities, + /// Test authorities + test_authorities: TestAuthorities, } /// A mock of the network bridge tx subsystem. @@ -61,9 +58,9 @@ impl MockNetworkBridgeTx { pub fn new( network: NetworkEmulatorHandle, to_network_interface: UnboundedSender, - test_authorithies: TestAuthorities, + test_authorities: TestAuthorities, ) -> MockNetworkBridgeTx { - Self { network, to_network_interface, test_authorithies } + Self { network, to_network_interface, test_authorities } } } @@ -128,13 +125,13 @@ impl MockNetworkBridgeTx { } }, NetworkBridgeTxMessage::ReportPeer(_) => { - // ingore rep changes + // ignore rep changes }, NetworkBridgeTxMessage::SendValidationMessage(peers, message) => { for peer in peers { self.to_network_interface .unbounded_send(NetworkMessage::MessageFromNode( - self.test_authorithies + self.test_authorities .peer_id_to_authority .get(&peer) .unwrap() diff --git a/polkadot/node/subsystem-bench/src/core/mock/runtime_api.rs b/polkadot/node/subsystem-bench/src/lib/mock/runtime_api.rs similarity index 97% rename from polkadot/node/subsystem-bench/src/core/mock/runtime_api.rs rename to polkadot/node/subsystem-bench/src/lib/mock/runtime_api.rs index ca6896dbb29d50fbf25a040e5e0981debed93e35..b73d61321cd3b274915dda37233c1945240c2b11 100644 --- a/polkadot/node/subsystem-bench/src/core/mock/runtime_api.rs +++ b/polkadot/node/subsystem-bench/src/lib/mock/runtime_api.rs @@ -13,31 +13,30 @@ // You should have received a copy of the GNU General Public License // along with Polkadot. If not, see . -//! -//! A generic runtime api subsystem mockup suitable to be used in benchmarks. -use itertools::Itertools; -use polkadot_primitives::{ - vstaging::NodeFeatures, CandidateEvent, CandidateReceipt, CoreState, GroupIndex, IndexedVec, - OccupiedCore, SessionIndex, SessionInfo, ValidatorIndex, -}; +//! A generic runtime api subsystem mockup suitable to be used in benchmarks. +use crate::configuration::{TestAuthorities, TestConfiguration}; use bitvec::prelude::BitVec; +use futures::FutureExt; +use itertools::Itertools; use polkadot_node_subsystem::{ messages::{RuntimeApiMessage, RuntimeApiRequest}, overseer, SpawnedSubsystem, SubsystemError, }; use polkadot_node_subsystem_types::OverseerSignal; +use polkadot_primitives::{ + CandidateEvent, CandidateReceipt, CoreState, GroupIndex, IndexedVec, NodeFeatures, + OccupiedCore, SessionIndex, SessionInfo, ValidatorIndex, +}; use sp_consensus_babe::Epoch as BabeEpoch; use sp_core::H256; use std::collections::HashMap; -use crate::core::configuration::{TestAuthorities, TestConfiguration}; -use futures::FutureExt; - const LOG_TARGET: &str = "subsystem-bench::runtime-api-mock"; /// Minimal state to answer requests. +#[derive(Clone)] pub struct RuntimeApiState { // All authorities in the test, authorities: TestAuthorities, @@ -51,6 +50,7 @@ pub struct RuntimeApiState { } /// A mocked `runtime-api` subsystem. +#[derive(Clone)] pub struct MockRuntimeApi { state: RuntimeApiState, config: TestConfiguration, diff --git a/polkadot/node/subsystem-bench/src/core/network.rs b/polkadot/node/subsystem-bench/src/lib/network.rs similarity index 97% rename from polkadot/node/subsystem-bench/src/core/network.rs rename to polkadot/node/subsystem-bench/src/lib/network.rs index 8e7c28140635377785ff1a2646128cda741d17de..9bf2415e5a864a9c4512350b9387b6c172b37114 100644 --- a/polkadot/node/subsystem-bench/src/core/network.rs +++ b/polkadot/node/subsystem-bench/src/lib/network.rs @@ -12,10 +12,10 @@ // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with Polkadot. If not, see . -//! + //! Implements network emulation and interfaces to control and specialize //! network peer behaviour. -// + // [TestEnvironment] // [NetworkEmulatorHandle] // || @@ -33,20 +33,22 @@ // | // Subsystems under test -use crate::core::configuration::random_latency; - -use super::{ - configuration::{TestAuthorities, TestConfiguration}, +use crate::{ + configuration::{random_latency, TestAuthorities, TestConfiguration}, environment::TestEnvironmentDependencies, - *, + NODE_UNDER_TEST, }; use colored::Colorize; use futures::{ - channel::{mpsc, oneshot}, + channel::{ + mpsc, + mpsc::{UnboundedReceiver, UnboundedSender}, + oneshot, + }, lock::Mutex, stream::FuturesUnordered, + Future, FutureExt, StreamExt, }; - use itertools::Itertools; use net_protocol::{ peer_set::{ProtocolVersion, ValidationVersion}, @@ -54,27 +56,30 @@ use net_protocol::{ ObservedRole, VersionedValidationProtocol, }; use parity_scale_codec::Encode; +use polkadot_node_network_protocol::{self as net_protocol, Versioned}; use polkadot_node_subsystem_types::messages::{ApprovalDistributionMessage, NetworkBridgeEvent}; +use polkadot_node_subsystem_util::metrics::prometheus::{ + self, CounterVec, Opts, PrometheusError, Registry, +}; use polkadot_overseer::AllMessages; use polkadot_primitives::AuthorityDiscoveryId; use prometheus_endpoint::U64; use rand::{seq::SliceRandom, thread_rng}; use sc_network::{ request_responses::{IncomingRequest, OutgoingResponse}, - PeerId, RequestFailure, + RequestFailure, }; +use sc_network_types::PeerId; use sc_service::SpawnTaskHandle; use std::{ collections::HashMap, sync::Arc, + task::Poll, time::{Duration, Instant}, }; -use polkadot_node_network_protocol::{self as net_protocol, Versioned}; - -use futures::channel::mpsc::{UnboundedReceiver, UnboundedSender}; +const LOG_TARGET: &str = "subsystem-bench::network"; -use futures::{Future, FutureExt, StreamExt}; // An emulated node egress traffic rate_limiter. #[derive(Debug)] pub struct RateLimit { @@ -150,7 +155,7 @@ pub enum NetworkMessage { MessageFromNode(AuthorityDiscoveryId, VersionedValidationProtocol), /// A request originating from our node RequestFromNode(AuthorityDiscoveryId, Requests), - /// A request originating from an emultated peer + /// A request originating from an emulated peer RequestFromPeer(IncomingRequest), } @@ -202,8 +207,6 @@ struct ProxiedResponse { pub result: Result, RequestFailure>, } -use std::task::Poll; - impl Future for ProxiedRequest { // The sender and result. type Output = ProxiedResponse; @@ -217,7 +220,7 @@ impl Future for ProxiedRequest { Poll::Ready(response) => Poll::Ready(ProxiedResponse { sender: self.sender.take().expect("sender already used"), result: response - .expect("Response is always succesfully received.") + .expect("Response is always successfully received.") .result .map_err(|_| RequestFailure::Refused), }), @@ -265,9 +268,9 @@ impl NetworkInterface { task_rx_limiter.lock().await.reap(size).await; rx_network.inc_received(size); - // To be able to apply the configured bandwidth limits for responses being sent - // over channels, we need to implement a simple proxy that allows this loop - // to receive the response and enforce the configured bandwidth before + // To be able to apply the configured bandwidth limits for responses being sent + // over channels, we need to implement a simple proxy that allows this loop + // to receive the response and enforce the configured bandwidth before // sending it to the original recipient. if let NetworkMessage::RequestFromPeer(request) = peer_message { let (response_sender, response_receiver) = oneshot::channel(); @@ -759,7 +762,7 @@ pub fn new_network( gum::info!(target: LOG_TARGET, "{}",format!("connectivity {}%, latency {:?}", config.connectivity, config.latency).bright_black()); let metrics = - Metrics::new(&dependencies.registry).expect("Metrics always register succesfully"); + Metrics::new(&dependencies.registry).expect("Metrics always register successfully"); let mut validator_authority_id_mapping = HashMap::new(); // Create the channel from `peer` to `NetworkInterface` . @@ -788,9 +791,9 @@ pub fn new_network( let connected_count = config.connected_count(); - let mut peers_indicies = (0..n_peers).collect_vec(); + let mut peers_indices = (0..n_peers).collect_vec(); let (_connected, to_disconnect) = - peers_indicies.partial_shuffle(&mut thread_rng(), connected_count); + peers_indices.partial_shuffle(&mut thread_rng(), connected_count); // Node under test is always mark as disconnected. peers[NODE_UNDER_TEST as usize].disconnect(); @@ -914,10 +917,6 @@ impl NetworkEmulatorHandle { } } -use polkadot_node_subsystem_util::metrics::prometheus::{ - self, CounterVec, Opts, PrometheusError, Registry, -}; - /// Emulated network metrics. #[derive(Clone)] pub(crate) struct Metrics { @@ -960,7 +959,7 @@ impl Metrics { .inc_by(bytes as u64); } - /// Increment total receioved for a peer. + /// Increment total received for a peer. pub fn on_peer_received(&self, peer_index: usize, bytes: usize) { self.peer_total_received .with_label_values(vec![format!("node{}", peer_index).as_str()].as_slice()) @@ -1036,15 +1035,14 @@ impl RequestExt for Requests { #[cfg(test)] mod tests { - use std::time::Instant; - use super::RateLimit; + use std::time::Instant; #[tokio::test] async fn test_expected_rate() { let tick_rate = 200; let budget = 1_000_000; - // rate must not exceeed 100 credits per second + // rate must not exceed 100 credits per second let mut rate_limiter = RateLimit::new(tick_rate, budget); let mut total_sent = 0usize; let start = Instant::now(); diff --git a/polkadot/node/subsystem-bench/src/lib/usage.rs b/polkadot/node/subsystem-bench/src/lib/usage.rs new file mode 100644 index 0000000000000000000000000000000000000000..59296746ec3d4154274ce68d9ee910bb61d0f9f8 --- /dev/null +++ b/polkadot/node/subsystem-bench/src/lib/usage.rs @@ -0,0 +1,181 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +//! Test usage implementation + +use colored::Colorize; +use itertools::Itertools; +use serde::{Deserialize, Serialize}; +use std::collections::HashMap; + +#[derive(Debug, Serialize, Deserialize, Clone)] +pub struct BenchmarkUsage { + pub benchmark_name: String, + pub network_usage: Vec, + pub cpu_usage: Vec, +} + +impl std::fmt::Display for BenchmarkUsage { + fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { + write!( + f, + "\n{}\n\n{}\n{}\n\n{}\n{}\n", + self.benchmark_name.purple(), + format!("{:<32}{:>12}{:>12}", "Network usage, KiB", "total", "per block").blue(), + self.network_usage + .iter() + .map(|v| v.to_string()) + .sorted() + .collect::>() + .join("\n"), + format!("{:<32}{:>12}{:>12}", "CPU usage, seconds", "total", "per block").blue(), + self.cpu_usage + .iter() + .map(|v| v.to_string()) + .sorted() + .collect::>() + .join("\n") + ) + } +} + +impl BenchmarkUsage { + pub fn average(usages: &[Self]) -> Self { + let all_network_usages: Vec<&ResourceUsage> = + usages.iter().flat_map(|v| &v.network_usage).collect(); + let all_cpu_usage: Vec<&ResourceUsage> = usages.iter().flat_map(|v| &v.cpu_usage).collect(); + + Self { + benchmark_name: usages.first().map(|v| v.benchmark_name.clone()).unwrap_or_default(), + network_usage: ResourceUsage::average_by_resource_name(&all_network_usages), + cpu_usage: ResourceUsage::average_by_resource_name(&all_cpu_usage), + } + } + + pub fn check_network_usage(&self, checks: &[ResourceUsageCheck]) -> Vec { + check_usage(&self.benchmark_name, &self.network_usage, checks) + } + + pub fn check_cpu_usage(&self, checks: &[ResourceUsageCheck]) -> Vec { + check_usage(&self.benchmark_name, &self.cpu_usage, checks) + } + + pub fn cpu_usage_diff(&self, other: &Self, resource_name: &str) -> Option { + let self_res = self.cpu_usage.iter().find(|v| v.resource_name == resource_name); + let other_res = other.cpu_usage.iter().find(|v| v.resource_name == resource_name); + + match (self_res, other_res) { + (Some(self_res), Some(other_res)) => Some(self_res.diff(other_res)), + _ => None, + } + } + + // Prepares a json string for a graph representation + // See: https://github.com/benchmark-action/github-action-benchmark?tab=readme-ov-file#examples + pub fn to_chart_json(&self) -> color_eyre::eyre::Result { + let chart = self + .network_usage + .iter() + .map(|v| ChartItem { + name: v.resource_name.clone(), + unit: "KiB".to_string(), + value: v.per_block, + }) + .chain(self.cpu_usage.iter().map(|v| ChartItem { + name: v.resource_name.clone(), + unit: "seconds".to_string(), + value: v.per_block, + })) + .collect::>(); + + Ok(serde_json::to_string(&chart)?) + } +} + +fn check_usage( + benchmark_name: &str, + usage: &[ResourceUsage], + checks: &[ResourceUsageCheck], +) -> Vec { + checks + .iter() + .filter_map(|check| { + check_resource_usage(usage, check) + .map(|message| format!("{}: {}", benchmark_name, message)) + }) + .collect() +} + +fn check_resource_usage( + usage: &[ResourceUsage], + (resource_name, base, precision): &ResourceUsageCheck, +) -> Option { + if let Some(usage) = usage.iter().find(|v| v.resource_name == *resource_name) { + let diff = (base - usage.per_block).abs() / base; + if diff < *precision { + None + } else { + Some(format!( + "The resource `{}` is expected to be equal to {} with a precision {}, but the current value is {} ({})", + resource_name, base, precision, usage.per_block, diff + )) + } + } else { + Some(format!("The resource `{}` is not found", resource_name)) + } +} + +#[derive(Debug, Serialize, Deserialize, Clone)] +pub struct ResourceUsage { + pub resource_name: String, + pub total: f64, + pub per_block: f64, +} + +impl std::fmt::Display for ResourceUsage { + fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { + write!(f, "{:<32}{:>12.4}{:>12.4}", self.resource_name.cyan(), self.total, self.per_block) + } +} + +impl ResourceUsage { + fn average_by_resource_name(usages: &[&Self]) -> Vec { + let mut by_name: HashMap> = Default::default(); + for usage in usages { + by_name.entry(usage.resource_name.clone()).or_default().push(usage); + } + let mut average = vec![]; + for (resource_name, values) in by_name { + let total = values.iter().map(|v| v.total).sum::() / values.len() as f64; + let per_block = values.iter().map(|v| v.per_block).sum::() / values.len() as f64; + average.push(Self { resource_name, total, per_block }); + } + average + } + + fn diff(&self, other: &Self) -> f64 { + (self.per_block - other.per_block).abs() / self.per_block + } +} + +type ResourceUsageCheck<'a> = (&'a str, f64, f64); + +#[derive(Debug, Serialize)] +pub struct ChartItem { + pub name: String, + pub unit: String, + pub value: f64, +} diff --git a/polkadot/node/subsystem-bench/src/availability/cli.rs b/polkadot/node/subsystem-bench/src/lib/utils.rs similarity index 52% rename from polkadot/node/subsystem-bench/src/availability/cli.rs rename to polkadot/node/subsystem-bench/src/lib/utils.rs index 65df8c1552aa8266497eb2738cc562f656050b68..b3cd3a88b6c1324ec18a402cbc92524f4865380f 100644 --- a/polkadot/node/subsystem-bench/src/availability/cli.rs +++ b/polkadot/node/subsystem-bench/src/lib/utils.rs @@ -14,24 +14,28 @@ // You should have received a copy of the GNU General Public License // along with Polkadot. If not, see . -use serde::{Deserialize, Serialize}; +//! Test utils -#[derive(clap::ValueEnum, Clone, Copy, Debug, PartialEq)] -#[value(rename_all = "kebab-case")] -#[non_exhaustive] -pub enum NetworkEmulation { - Ideal, - Healthy, - Degraded, -} +use std::{fs::File, io::Write}; + +// Saves a given string to a file +pub fn save_to_file(path: &str, value: String) -> color_eyre::eyre::Result<()> { + let output = std::process::Command::new(env!("CARGO")) + .arg("locate-project") + .arg("--workspace") + .arg("--message-format=plain") + .output() + .unwrap() + .stdout; + let workspace_dir = std::path::Path::new(std::str::from_utf8(&output).unwrap().trim()) + .parent() + .unwrap(); + let path = workspace_dir.join(path); + if let Some(dir) = path.parent() { + std::fs::create_dir_all(dir)?; + } + let mut file = File::create(path)?; + file.write_all(value.as_bytes())?; -#[derive(Debug, Clone, Serialize, Deserialize, clap::Parser)] -#[clap(rename_all = "kebab-case")] -#[allow(missing_docs)] -pub struct DataAvailabilityReadOptions { - #[clap(short, long, default_value_t = false)] - /// Turbo boost AD Read by fetching the full availability datafrom backers first. Saves CPU as - /// we don't need to re-construct from chunks. Tipically this is only faster if nodes have - /// enough bandwidth. - pub fetch_from_backers: bool, + Ok(()) } diff --git a/polkadot/node/subsystem-bench/src/subsystem-bench.rs b/polkadot/node/subsystem-bench/src/subsystem-bench.rs deleted file mode 100644 index 6f45214bc7359287bae873ce95d8306e99e799a8..0000000000000000000000000000000000000000 --- a/polkadot/node/subsystem-bench/src/subsystem-bench.rs +++ /dev/null @@ -1,273 +0,0 @@ -// Copyright (C) Parity Technologies (UK) Ltd. -// This file is part of Polkadot. - -// Polkadot is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Polkadot is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Polkadot. If not, see . - -//! A tool for running subsystem benchmark tests designed for development and -//! CI regression testing. -use clap::Parser; - -use colored::Colorize; - -use color_eyre::eyre; -use pyroscope::PyroscopeAgent; -use pyroscope_pprofrs::{pprof_backend, PprofConfig}; - -use std::path::Path; - -pub(crate) mod approval; -pub(crate) mod availability; -pub(crate) mod cli; -pub(crate) mod core; -mod valgrind; - -const LOG_TARGET: &str = "subsystem-bench"; - -use availability::{prepare_test, NetworkEmulation, TestState}; -use cli::TestObjective; - -use core::{ - configuration::TestConfiguration, - environment::{TestEnvironment, GENESIS_HASH}, -}; - -use clap_num::number_range; - -use crate::{approval::bench_approvals, core::display::display_configuration}; - -fn le_100(s: &str) -> Result { - number_range(s, 0, 100) -} - -fn le_5000(s: &str) -> Result { - number_range(s, 0, 5000) -} - -#[derive(Debug, Parser)] -#[allow(missing_docs)] -struct BenchCli { - #[arg(long, value_enum, ignore_case = true, default_value_t = NetworkEmulation::Ideal)] - /// The type of network to be emulated - pub network: NetworkEmulation, - - #[clap(flatten)] - pub standard_configuration: cli::StandardTestOptions, - - #[clap(short, long)] - /// The bandwidth of emulated remote peers in KiB - pub peer_bandwidth: Option, - - #[clap(short, long)] - /// The bandwidth of our node in KiB - pub bandwidth: Option, - - #[clap(long, value_parser=le_100)] - /// Emulated peer connection ratio [0-100]. - pub connectivity: Option, - - #[clap(long, value_parser=le_5000)] - /// Mean remote peer latency in milliseconds [0-5000]. - pub peer_mean_latency: Option, - - #[clap(long, value_parser=le_5000)] - /// Remote peer latency standard deviation - pub peer_latency_std_dev: Option, - - #[clap(long, default_value_t = false)] - /// Enable CPU Profiling with Pyroscope - pub profile: bool, - - #[clap(long, requires = "profile", default_value_t = String::from("http://localhost:4040"))] - /// Pyroscope Server URL - pub pyroscope_url: String, - - #[clap(long, requires = "profile", default_value_t = 113)] - /// Pyroscope Sample Rate - pub pyroscope_sample_rate: u32, - - #[clap(long, default_value_t = false)] - /// Enable Cache Misses Profiling with Valgrind. Linux only, Valgrind must be in the PATH - pub cache_misses: bool, - - #[command(subcommand)] - pub objective: cli::TestObjective, -} - -impl BenchCli { - fn create_test_configuration(&self) -> TestConfiguration { - let configuration = &self.standard_configuration; - - match self.network { - NetworkEmulation::Healthy => TestConfiguration::healthy_network( - self.objective.clone(), - configuration.num_blocks, - configuration.n_validators, - configuration.n_cores, - configuration.min_pov_size, - configuration.max_pov_size, - ), - NetworkEmulation::Degraded => TestConfiguration::degraded_network( - self.objective.clone(), - configuration.num_blocks, - configuration.n_validators, - configuration.n_cores, - configuration.min_pov_size, - configuration.max_pov_size, - ), - NetworkEmulation::Ideal => TestConfiguration::ideal_network( - self.objective.clone(), - configuration.num_blocks, - configuration.n_validators, - configuration.n_cores, - configuration.min_pov_size, - configuration.max_pov_size, - ), - } - } - - fn launch(self) -> eyre::Result<()> { - let is_valgrind_running = valgrind::is_valgrind_running(); - if !is_valgrind_running && self.cache_misses { - return valgrind::relaunch_in_valgrind_mode() - } - - let agent_running = if self.profile { - let agent = PyroscopeAgent::builder(self.pyroscope_url.as_str(), "subsystem-bench") - .backend(pprof_backend(PprofConfig::new().sample_rate(self.pyroscope_sample_rate))) - .build()?; - - Some(agent.start()?) - } else { - None - }; - - let mut test_config = match self.objective { - TestObjective::TestSequence(options) => { - let test_sequence = - core::configuration::TestSequence::new_from_file(Path::new(&options.path)) - .expect("File exists") - .into_vec(); - let num_steps = test_sequence.len(); - gum::info!( - "{}", - format!("Sequence contains {} step(s)", num_steps).bright_purple() - ); - for (index, test_config) in test_sequence.into_iter().enumerate() { - gum::info!(target: LOG_TARGET, "{}", format!("Step {}/{}", index + 1, num_steps).bright_purple(),); - display_configuration(&test_config); - - match test_config.objective { - TestObjective::DataAvailabilityRead(ref _opts) => { - let mut state = TestState::new(&test_config); - let (mut env, _protocol_config) = prepare_test(test_config, &mut state); - env.runtime().block_on(availability::benchmark_availability_read( - &mut env, state, - )); - }, - TestObjective::ApprovalVoting(ref options) => { - let (mut env, state) = - approval::prepare_test(test_config.clone(), options.clone()); - - env.runtime().block_on(bench_approvals(&mut env, state)); - }, - TestObjective::DataAvailabilityWrite => { - let mut state = TestState::new(&test_config); - let (mut env, _protocol_config) = prepare_test(test_config, &mut state); - env.runtime().block_on(availability::benchmark_availability_write( - &mut env, state, - )); - }, - TestObjective::TestSequence(_) => todo!(), - TestObjective::Unimplemented => todo!(), - } - } - return Ok(()) - }, - TestObjective::DataAvailabilityRead(ref _options) => self.create_test_configuration(), - TestObjective::DataAvailabilityWrite => self.create_test_configuration(), - TestObjective::ApprovalVoting(_) => todo!(), - TestObjective::Unimplemented => todo!(), - }; - - let mut latency_config = test_config.latency.clone().unwrap_or_default(); - - if let Some(latency) = self.peer_mean_latency { - latency_config.mean_latency_ms = latency; - } - - if let Some(std_dev) = self.peer_latency_std_dev { - latency_config.std_dev = std_dev; - } - - // Write back the updated latency. - test_config.latency = Some(latency_config); - - if let Some(connectivity) = self.connectivity { - test_config.connectivity = connectivity; - } - - if let Some(bandwidth) = self.peer_bandwidth { - // CLI expects bw in KiB - test_config.peer_bandwidth = bandwidth * 1024; - } - - if let Some(bandwidth) = self.bandwidth { - // CLI expects bw in KiB - test_config.bandwidth = bandwidth * 1024; - } - - display_configuration(&test_config); - - let mut state = TestState::new(&test_config); - let (mut env, _protocol_config) = prepare_test(test_config, &mut state); - - match self.objective { - TestObjective::DataAvailabilityRead(_options) => { - env.runtime() - .block_on(availability::benchmark_availability_read(&mut env, state)); - }, - TestObjective::DataAvailabilityWrite => { - env.runtime() - .block_on(availability::benchmark_availability_write(&mut env, state)); - }, - TestObjective::TestSequence(_options) => {}, - TestObjective::ApprovalVoting(_) => todo!(), - TestObjective::Unimplemented => todo!(), - } - - if let Some(agent_running) = agent_running { - let agent_ready = agent_running.stop()?; - agent_ready.shutdown(); - } - - Ok(()) - } -} - -fn main() -> eyre::Result<()> { - color_eyre::install()?; - env_logger::builder() - .filter(Some("hyper"), log::LevelFilter::Info) - // Avoid `Terminating due to subsystem exit subsystem` warnings - .filter(Some("polkadot_overseer"), log::LevelFilter::Error) - .filter(None, log::LevelFilter::Info) - .format_timestamp_millis() - // .filter(None, log::LevelFilter::Trace) - .try_init() - .unwrap(); - - let cli: BenchCli = BenchCli::parse(); - cli.launch()?; - Ok(()) -} diff --git a/polkadot/node/subsystem-test-helpers/Cargo.toml b/polkadot/node/subsystem-test-helpers/Cargo.toml index c71f030568d9da378da61c7c4af90a409f936b64..57678e8e8d4a1057ec843f097c2cd9811f33a6bb 100644 --- a/polkadot/node/subsystem-test-helpers/Cargo.toml +++ b/polkadot/node/subsystem-test-helpers/Cargo.toml @@ -11,8 +11,8 @@ license.workspace = true workspace = true [dependencies] -async-trait = "0.1.74" -futures = "0.3.21" +async-trait = "0.1.79" +futures = "0.3.30" parking_lot = "0.12.1" polkadot-node-subsystem = { path = "../subsystem" } polkadot-erasure-coding = { path = "../../erasure-coding" } diff --git a/polkadot/node/subsystem-types/Cargo.toml b/polkadot/node/subsystem-types/Cargo.toml index ffd05cca2e9306ca8cb311cc8c93e9a65c0732ff..93dd43c5dbfc495ff92fa76f28e3ad80992b8a6a 100644 --- a/polkadot/node/subsystem-types/Cargo.toml +++ b/polkadot/node/subsystem-types/Cargo.toml @@ -11,7 +11,7 @@ workspace = true [dependencies] derive_more = "0.99.17" -futures = "0.3.21" +futures = "0.3.30" polkadot-primitives = { path = "../../primitives" } polkadot-node-primitives = { path = "../primitives" } polkadot-node-network-protocol = { path = "../network/protocol" } @@ -19,6 +19,7 @@ polkadot-statement-table = { path = "../../statement-table" } polkadot-node-jaeger = { path = "../jaeger" } orchestra = { version = "0.3.5", default-features = false, features = ["futures_channel"] } sc-network = { path = "../../../substrate/client/network" } +sc-network-types = { path = "../../../substrate/client/network/types" } sp-api = { path = "../../../substrate/primitives/api" } sp-blockchain = { path = "../../../substrate/primitives/blockchain" } sp-consensus-babe = { path = "../../../substrate/primitives/consensus/babe" } @@ -28,6 +29,6 @@ sc-client-api = { path = "../../../substrate/client/api" } sc-transaction-pool-api = { path = "../../../substrate/client/transaction-pool/api" } smallvec = "1.8.0" substrate-prometheus-endpoint = { path = "../../../substrate/utils/prometheus" } -thiserror = "1.0.48" -async-trait = "0.1.74" +thiserror = { workspace = true } +async-trait = "0.1.79" bitvec = { version = "1.0.0", default-features = false, features = ["alloc"] } diff --git a/polkadot/node/subsystem-types/src/messages.rs b/polkadot/node/subsystem-types/src/messages.rs index 1d5d82b57fdfb482383bc943d22ee61a512f035b..2ca6728af012166649ccfee136b098cff9b9fe4a 100644 --- a/polkadot/node/subsystem-types/src/messages.rs +++ b/polkadot/node/subsystem-types/src/messages.rs @@ -42,19 +42,18 @@ use polkadot_node_primitives::{ ValidationResult, }; use polkadot_primitives::{ - async_backing, slashing, - vstaging::{ApprovalVotingParams, NodeFeatures}, - AuthorityDiscoveryId, BackedCandidate, BlockNumber, CandidateEvent, CandidateHash, - CandidateIndex, CandidateReceipt, CollatorId, CommittedCandidateReceipt, CoreState, - DisputeState, ExecutorParams, GroupIndex, GroupRotationInfo, Hash, Header as BlockHeader, - Id as ParaId, InboundDownwardMessage, InboundHrmpMessage, MultiDisputeStatementSet, - OccupiedCoreAssumption, PersistedValidationData, PvfCheckStatement, PvfExecKind, SessionIndex, - SessionInfo, SignedAvailabilityBitfield, SignedAvailabilityBitfields, ValidationCode, - ValidationCodeHash, ValidatorId, ValidatorIndex, ValidatorSignature, + async_backing, slashing, ApprovalVotingParams, AuthorityDiscoveryId, BackedCandidate, + BlockNumber, CandidateEvent, CandidateHash, CandidateIndex, CandidateReceipt, CollatorId, + CommittedCandidateReceipt, CoreIndex, CoreState, DisputeState, ExecutorParams, GroupIndex, + GroupRotationInfo, Hash, HeadData, Header as BlockHeader, Id as ParaId, InboundDownwardMessage, + InboundHrmpMessage, MultiDisputeStatementSet, NodeFeatures, OccupiedCoreAssumption, + PersistedValidationData, PvfCheckStatement, PvfExecKind, SessionIndex, SessionInfo, + SignedAvailabilityBitfield, SignedAvailabilityBitfields, ValidationCode, ValidationCodeHash, + ValidatorId, ValidatorIndex, ValidatorSignature, }; use polkadot_statement_table::v2::Misbehavior; use std::{ - collections::{BTreeMap, HashMap, HashSet}, + collections::{BTreeMap, HashMap, HashSet, VecDeque}, sync::Arc, }; @@ -81,8 +80,15 @@ pub struct CanSecondRequest { pub enum CandidateBackingMessage { /// Requests a set of backable candidates attested by the subsystem. /// - /// Each pair is (candidate_hash, candidate_relay_parent). - GetBackedCandidates(Vec<(CandidateHash, Hash)>, oneshot::Sender>), + /// The order of candidates of the same para must be preserved in the response. + /// If a backed candidate of a para cannot be retrieved, the response should not contain any + /// candidates of the same para that follow it in the input vector. In other words, assuming + /// candidates are supplied in dependency order, we must ensure that this dependency order is + /// preserved. + GetBackedCandidates( + HashMap>, + oneshot::Sender>>, + ), /// Request the subsystem to check whether it's allowed to second given candidate. /// The rule is to only fetch collations that are either built on top of the root /// of some fragment tree or have a parent node which represents backed candidate. @@ -207,16 +213,22 @@ pub enum CollatorProtocolMessage { /// This should be sent before any `DistributeCollation` message. CollateOn(ParaId), /// Provide a collation to distribute to validators with an optional result sender. - /// The second argument is the parent head-data hash. - /// - /// The result sender should be informed when at least one parachain validator seconded the - /// collation. It is also completely okay to just drop the sender. - DistributeCollation( - CandidateReceipt, - Hash, - PoV, - Option>, - ), + DistributeCollation { + /// The receipt of the candidate. + candidate_receipt: CandidateReceipt, + /// The hash of the parent head-data. + /// Here to avoid computing the hash of the parent head data twice. + parent_head_data_hash: Hash, + /// Proof of validity. + pov: PoV, + /// This parent head-data is needed for elastic scaling. + parent_head_data: HeadData, + /// The result sender should be informed when at least one parachain validator seconded the + /// collation. It is also completely okay to just drop the sender. + result_sender: Option>, + /// The core index where the candidate should be backed. + core_index: CoreIndex, + }, /// Report a collator as having provided an invalid collation. This should lead to disconnect /// and blacklist of the collator. ReportCollator(CollatorId), @@ -724,6 +736,9 @@ pub enum RuntimeApiRequest { /// Approval voting params /// `V10` ApprovalVotingParams(SessionIndex, RuntimeApiSender), + /// Fetch the `ClaimQueue` from scheduler pallet + /// `V11` + ClaimQueue(RuntimeApiSender>>), } impl RuntimeApiRequest { @@ -758,6 +773,9 @@ impl RuntimeApiRequest { /// `approval_voting_params` pub const APPROVAL_VOTING_PARAMS_REQUIREMENT: u32 = 10; + + /// `ClaimQueue` + pub const CLAIM_QUEUE_RUNTIME_REQUIREMENT: u32 = 11; } /// A message to the Runtime API subsystem. @@ -787,7 +805,7 @@ pub enum StatementDistributionMessage { /// This data becomes intrinsics or extrinsics which should be included in a future relay chain /// block. -// It needs to be cloneable because multiple potential block authors can request copies. +// It needs to be clonable because multiple potential block authors can request copies. #[derive(Debug, Clone)] pub enum ProvisionableData { /// This bitfield indicates the availability of various candidate blocks. @@ -1104,14 +1122,41 @@ pub struct ProspectiveValidationDataRequest { pub para_id: ParaId, /// The relay-parent of the candidate. pub candidate_relay_parent: Hash, - /// The parent head-data hash. - pub parent_head_data_hash: Hash, + /// The parent head-data. + pub parent_head_data: ParentHeadData, +} + +/// The parent head-data hash with optional data itself. +#[derive(Debug, Clone)] +pub enum ParentHeadData { + /// Parent head-data hash. + OnlyHash(Hash), + /// Parent head-data along with its hash. + WithData { + /// This will be provided for collations with elastic scaling enabled. + head_data: HeadData, + /// Parent head-data hash. + hash: Hash, + }, +} + +impl ParentHeadData { + /// Return the hash of the parent head-data. + pub fn hash(&self) -> Hash { + match self { + ParentHeadData::OnlyHash(hash) => *hash, + ParentHeadData::WithData { hash, .. } => *hash, + } + } } /// Indicates the relay-parents whose fragment tree a candidate /// is present in and the depths of that tree the candidate is present in. pub type FragmentTreeMembership = Vec<(Hash, Vec)>; +/// A collection of ancestor candidates of a parachain. +pub type Ancestors = HashSet; + /// Messages sent to the Prospective Parachains subsystem. #[derive(Debug)] pub enum ProspectiveParachainsMessage { @@ -1128,14 +1173,19 @@ pub enum ProspectiveParachainsMessage { /// has been backed. This requires that the candidate was successfully introduced in /// the past. CandidateBacked(ParaId, CandidateHash), - /// Get a backable candidate hash along with its relay parent for the given parachain, - /// under the given relay-parent hash, which is a descendant of the given candidate hashes. - /// Returns `None` on the channel if no such candidate exists. - GetBackableCandidate( + /// Try getting N backable candidate hashes along with their relay parents for the given + /// parachain, under the given relay-parent hash, which is a descendant of the given ancestors. + /// Timed out ancestors should not be included in the collection. + /// N should represent the number of scheduled cores of this ParaId. + /// A timed out ancestor frees the cores of all of its descendants, so if there's a hole in the + /// supplied ancestor path, we'll get candidates that backfill those timed out slots first. It + /// may also return less/no candidates, if there aren't enough backable candidates recorded. + GetBackableCandidates( Hash, ParaId, - Vec, - oneshot::Sender>, + u32, + Ancestors, + oneshot::Sender>, ), /// Get the hypothetical frontier membership of candidates with the given properties /// under the specified active leaves' fragment trees. diff --git a/polkadot/node/subsystem-types/src/messages/network_bridge_event.rs b/polkadot/node/subsystem-types/src/messages/network_bridge_event.rs index e6d7f64784ca0cffd1699fa59f7dcfce1cbd35a9..fa2c7687b38a52ed1a02cdd1373ab5fd41552470 100644 --- a/polkadot/node/subsystem-types/src/messages/network_bridge_event.rs +++ b/polkadot/node/subsystem-types/src/messages/network_bridge_event.rs @@ -16,7 +16,8 @@ use std::{collections::HashSet, convert::TryFrom}; -pub use sc_network::{PeerId, ReputationChange}; +pub use sc_network::ReputationChange; +pub use sc_network_types::PeerId; use polkadot_node_network_protocol::{ grid_topology::SessionGridTopology, peer_set::ProtocolVersion, ObservedRole, OurView, View, diff --git a/polkadot/node/subsystem-types/src/runtime_client.rs b/polkadot/node/subsystem-types/src/runtime_client.rs index 7f6183076101b4474e8059435b42a69b108fbb05..664d10ed1af5fdb77c3105ab995ab5ff89df2220 100644 --- a/polkadot/node/subsystem-types/src/runtime_client.rs +++ b/polkadot/node/subsystem-types/src/runtime_client.rs @@ -16,24 +16,24 @@ use async_trait::async_trait; use polkadot_primitives::{ - async_backing, - runtime_api::ParachainHost, - slashing, - vstaging::{self, ApprovalVotingParams}, - Block, BlockNumber, CandidateCommitments, CandidateEvent, CandidateHash, - CommittedCandidateReceipt, CoreState, DisputeState, ExecutorParams, GroupRotationInfo, Hash, - Header, Id, InboundDownwardMessage, InboundHrmpMessage, OccupiedCoreAssumption, + async_backing, runtime_api::ParachainHost, slashing, ApprovalVotingParams, Block, BlockNumber, + CandidateCommitments, CandidateEvent, CandidateHash, CommittedCandidateReceipt, CoreIndex, + CoreState, DisputeState, ExecutorParams, GroupRotationInfo, Hash, Header, Id, + InboundDownwardMessage, InboundHrmpMessage, NodeFeatures, OccupiedCoreAssumption, PersistedValidationData, PvfCheckStatement, ScrapedOnChainVotes, SessionIndex, SessionInfo, ValidationCode, ValidationCodeHash, ValidatorId, ValidatorIndex, ValidatorSignature, }; -use sc_client_api::HeaderBackend; +use sc_client_api::{AuxStore, HeaderBackend}; use sc_transaction_pool_api::OffchainTransactionPoolFactory; use sp_api::{ApiError, ApiExt, ProvideRuntimeApi}; use sp_authority_discovery::AuthorityDiscoveryApi; -use sp_blockchain::Info; +use sp_blockchain::{BlockStatus, Info}; use sp_consensus_babe::{BabeApi, Epoch}; -use sp_runtime::traits::{Header as HeaderT, NumberFor}; -use std::{collections::BTreeMap, sync::Arc}; +use sp_runtime::traits::{Block as BlockT, Header as HeaderT, NumberFor}; +use std::{ + collections::{BTreeMap, VecDeque}, + sync::Arc, +}; /// Offers header utilities. /// @@ -320,7 +320,7 @@ pub trait RuntimeApiSubsystemClient { // === v9 === /// Get the node features. - async fn node_features(&self, at: Hash) -> Result; + async fn node_features(&self, at: Hash) -> Result; // == v10: Approval voting params == /// Approval voting configuration parameters @@ -329,6 +329,10 @@ pub trait RuntimeApiSubsystemClient { at: Hash, session_index: SessionIndex, ) -> Result; + + // == v11: Claim queue == + /// Fetch the `ClaimQueue` from scheduler pallet + async fn claim_queue(&self, at: Hash) -> Result>, ApiError>; } /// Default implementation of [`RuntimeApiSubsystemClient`] using the client. @@ -578,7 +582,7 @@ where self.client.runtime_api().async_backing_params(at) } - async fn node_features(&self, at: Hash) -> Result { + async fn node_features(&self, at: Hash) -> Result { self.client.runtime_api().node_features(at) } @@ -594,4 +598,66 @@ where ) -> Result { self.client.runtime_api().approval_voting_params(at) } + + async fn claim_queue(&self, at: Hash) -> Result>, ApiError> { + self.client.runtime_api().claim_queue(at) + } +} + +impl HeaderBackend for DefaultSubsystemClient +where + Client: HeaderBackend, + Block: sp_runtime::traits::Block, +{ + fn header( + &self, + hash: Block::Hash, + ) -> sc_client_api::blockchain::Result> { + self.client.header(hash) + } + + fn info(&self) -> Info { + self.client.info() + } + + fn status(&self, hash: Block::Hash) -> sc_client_api::blockchain::Result { + self.client.status(hash) + } + + fn number( + &self, + hash: Block::Hash, + ) -> sc_client_api::blockchain::Result::Header as HeaderT>::Number>> { + self.client.number(hash) + } + + fn hash( + &self, + number: NumberFor, + ) -> sc_client_api::blockchain::Result> { + self.client.hash(number) + } +} + +impl AuxStore for DefaultSubsystemClient +where + Client: AuxStore, +{ + fn insert_aux< + 'a, + 'b: 'a, + 'c: 'a, + I: IntoIterator, + D: IntoIterator, + >( + &self, + insert: I, + delete: D, + ) -> sp_blockchain::Result<()> { + self.client.insert_aux(insert, delete) + } + + fn get_aux(&self, key: &[u8]) -> sp_blockchain::Result>> { + self.client.get_aux(key) + } } diff --git a/polkadot/node/subsystem-util/Cargo.toml b/polkadot/node/subsystem-util/Cargo.toml index 5f615e05abd4f2cf7526935d3093e2c9492b9eba..79a6a75e4cdfb5cf644dc8f963e51d0ef49c1fcd 100644 --- a/polkadot/node/subsystem-util/Cargo.toml +++ b/polkadot/node/subsystem-util/Cargo.toml @@ -10,15 +10,15 @@ license.workspace = true workspace = true [dependencies] -async-trait = "0.1.74" -futures = "0.3.21" +async-trait = "0.1.79" +futures = "0.3.30" futures-channel = "0.3.23" itertools = "0.10" parity-scale-codec = { version = "3.6.1", default-features = false, features = ["derive"] } parking_lot = "0.12.1" pin-project = "1.0.9" rand = "0.8.5" -thiserror = "1.0.48" +thiserror = { workspace = true } fatality = "0.0.6" gum = { package = "tracing-gum", path = "../gum" } derive_more = "0.99.17" @@ -44,9 +44,9 @@ parity-db = { version = "0.4.12" } [dev-dependencies] assert_matches = "1.4.0" -env_logger = "0.9.0" -futures = { version = "0.3.21", features = ["thread-pool"] } -log = "0.4.17" +env_logger = "0.11" +futures = { version = "0.3.30", features = ["thread-pool"] } +log = { workspace = true, default-features = true } polkadot-node-subsystem-test-helpers = { path = "../subsystem-test-helpers" } lazy_static = "1.4.0" polkadot-primitives-test-helpers = { path = "../../primitives/test-helpers" } diff --git a/polkadot/node/subsystem-util/src/inclusion_emulator/mod.rs b/polkadot/node/subsystem-util/src/inclusion_emulator/mod.rs index c7b91bffb3d705b27ee4c611985328dd1b1b7e77..d38d838fedefac643253528ab99d0035eeae55da 100644 --- a/polkadot/node/subsystem-util/src/inclusion_emulator/mod.rs +++ b/polkadot/node/subsystem-util/src/inclusion_emulator/mod.rs @@ -78,7 +78,7 @@ /// /// 2. The root fragment is invalid under the new constraints because it has been subsumed by /// the relay-chain. In this case, we can discard the root and split & re-root the fragment -/// tree under its descendents and compare to the new constraints again. This is the +/// tree under its descendants and compare to the new constraints again. This is the /// "prediction came true" case. /// /// 3. The root fragment is invalid under the new constraints because a competing parachain diff --git a/polkadot/node/subsystem-util/src/lib.rs b/polkadot/node/subsystem-util/src/lib.rs index f13beb3502fc22dcb768fb5548965eb7727f46fd..83b046f0bf0ac54533958da36dc230e8c8ce2922 100644 --- a/polkadot/node/subsystem-util/src/lib.rs +++ b/polkadot/node/subsystem-util/src/lib.rs @@ -30,7 +30,7 @@ use polkadot_node_subsystem::{ messages::{RuntimeApiMessage, RuntimeApiRequest, RuntimeApiSender}, overseer, SubsystemSender, }; -use polkadot_primitives::{slashing, ExecutorParams}; +use polkadot_primitives::{async_backing::BackingState, slashing, CoreIndex, ExecutorParams}; pub use overseer::{ gen::{OrchestraError as OverseerError, Timeout}, @@ -53,7 +53,10 @@ pub use rand; use sp_application_crypto::AppCrypto; use sp_core::ByteArray; use sp_keystore::{Error as KeystoreError, KeystorePtr}; -use std::time::Duration; +use std::{ + collections::{BTreeMap, VecDeque}, + time::Duration, +}; use thiserror::Error; use vstaging::get_disabled_validators_with_fallback; @@ -304,6 +307,8 @@ specialize_requests! { fn request_submit_report_dispute_lost(dp: slashing::DisputeProof, okop: slashing::OpaqueKeyOwnershipProof) -> Option<()>; SubmitReportDisputeLost; fn request_disabled_validators() -> Vec; DisabledValidators; fn request_async_backing_params() -> AsyncBackingParams; AsyncBackingParams; + fn request_claim_queue() -> BTreeMap>; ClaimQueue; + fn request_para_backing_state(para_id: ParaId) -> Option; ParaBackingState; } /// Requests executor parameters from the runtime effective at given relay-parent. First obtains @@ -378,7 +383,7 @@ pub fn signing_key_and_index<'a>( /// Sign the given data with the given validator ID. /// -/// Returns `Ok(None)` if the private key that correponds to that validator ID is not found in the +/// Returns `Ok(None)` if the private key that corresponds to that validator ID is not found in the /// given keystore. Returns an error if the key could not be used for signing. pub fn sign( keystore: &KeystorePtr, diff --git a/polkadot/node/subsystem-util/src/runtime/mod.rs b/polkadot/node/subsystem-util/src/runtime/mod.rs index 481625acb321994c58482c14aaf2860f092ae0c3..714384b32e37bcbd6ba7f077252fa23f50eac490 100644 --- a/polkadot/node/subsystem-util/src/runtime/mod.rs +++ b/polkadot/node/subsystem-util/src/runtime/mod.rs @@ -30,12 +30,11 @@ use polkadot_node_subsystem::{ }; use polkadot_node_subsystem_types::UnpinHandle; use polkadot_primitives::{ - slashing, - vstaging::{node_features::FeatureIndex, NodeFeatures}, - AsyncBackingParams, CandidateEvent, CandidateHash, CoreState, EncodeAs, ExecutorParams, - GroupIndex, GroupRotationInfo, Hash, IndexedVec, OccupiedCore, ScrapedOnChainVotes, - SessionIndex, SessionInfo, Signed, SigningContext, UncheckedSigned, ValidationCode, - ValidationCodeHash, ValidatorId, ValidatorIndex, LEGACY_MIN_BACKING_VOTES, + node_features::FeatureIndex, slashing, AsyncBackingParams, CandidateEvent, CandidateHash, + CoreState, EncodeAs, ExecutorParams, GroupIndex, GroupRotationInfo, Hash, IndexedVec, + NodeFeatures, OccupiedCore, ScrapedOnChainVotes, SessionIndex, SessionInfo, Signed, + SigningContext, UncheckedSigned, ValidationCode, ValidationCodeHash, ValidatorId, + ValidatorIndex, LEGACY_MIN_BACKING_VOTES, }; use crate::{ diff --git a/polkadot/node/subsystem-util/src/vstaging.rs b/polkadot/node/subsystem-util/src/vstaging.rs index 3e807eff5387693bc00198a3be5f257778bea0f2..b166a54f75c46ebfe4dd8d06af32a3dea3495b7a 100644 --- a/polkadot/node/subsystem-util/src/vstaging.rs +++ b/polkadot/node/subsystem-util/src/vstaging.rs @@ -19,14 +19,45 @@ //! This module is intended to contain common boiler plate code handling unreleased runtime API //! calls. +use std::collections::{BTreeMap, VecDeque}; + use polkadot_node_subsystem_types::messages::{RuntimeApiMessage, RuntimeApiRequest}; use polkadot_overseer::SubsystemSender; -use polkadot_primitives::{Hash, ValidatorIndex}; +use polkadot_primitives::{CoreIndex, Hash, Id as ParaId, ValidatorIndex}; -use crate::{has_required_runtime, request_disabled_validators, runtime}; +use crate::{has_required_runtime, request_claim_queue, request_disabled_validators, runtime}; const LOG_TARGET: &'static str = "parachain::subsystem-util-vstaging"; +/// A snapshot of the runtime claim queue at an arbitrary relay chain block. +#[derive(Default)] +pub struct ClaimQueueSnapshot(BTreeMap>); + +impl From>> for ClaimQueueSnapshot { + fn from(claim_queue_snapshot: BTreeMap>) -> Self { + ClaimQueueSnapshot(claim_queue_snapshot) + } +} + +impl ClaimQueueSnapshot { + /// Returns the `ParaId` that has a claim for `core_index` at the specified `depth` in the + /// claim queue. A depth of `0` means the very next block. + pub fn get_claim_for(&self, core_index: CoreIndex, depth: usize) -> Option { + self.0.get(&core_index)?.get(depth).copied() + } + + /// Returns an iterator over all claimed cores and the claiming `ParaId` at the specified + /// `depth` in the claim queue. + pub fn iter_claims_at_depth( + &self, + depth: usize, + ) -> impl Iterator + '_ { + self.0 + .iter() + .filter_map(move |(core_index, paras)| Some((*core_index, *paras.get(depth)?))) + } +} + // TODO: https://github.com/paritytech/polkadot-sdk/issues/1940 /// Returns disabled validators list if the runtime supports it. Otherwise logs a debug messages and /// returns an empty vec. @@ -54,3 +85,28 @@ pub async fn get_disabled_validators_with_fallback, + relay_parent: Hash, +) -> Result, runtime::Error> { + if has_required_runtime( + sender, + relay_parent, + RuntimeApiRequest::CLAIM_QUEUE_RUNTIME_REQUIREMENT, + ) + .await + { + let res = request_claim_queue(relay_parent, sender) + .await + .await + .map_err(runtime::Error::RuntimeRequestCanceled)??; + Ok(Some(res.into())) + } else { + gum::trace!(target: LOG_TARGET, "Runtime doesn't support `request_claim_queue`"); + Ok(None) + } +} diff --git a/polkadot/node/test/client/Cargo.toml b/polkadot/node/test/client/Cargo.toml index 36748c3b455b90315ab445c7c8b612b5a0d4ab0b..7db00404eb8eca049a6194d19e5e92e66325628c 100644 --- a/polkadot/node/test/client/Cargo.toml +++ b/polkadot/node/test/client/Cargo.toml @@ -38,7 +38,7 @@ frame-benchmarking = { path = "../../../../substrate/frame/benchmarking" } [dev-dependencies] sp-keyring = { path = "../../../../substrate/primitives/keyring" } -futures = "0.3.21" +futures = "0.3.30" [features] runtime-benchmarks = [ diff --git a/polkadot/node/test/service/Cargo.toml b/polkadot/node/test/service/Cargo.toml index f04108537995f1caa0eb72833af2ca558fe931ec..48a206f23c660ca9dbb5e0dd48b1cf0f4835b183 100644 --- a/polkadot/node/test/service/Cargo.toml +++ b/polkadot/node/test/service/Cargo.toml @@ -10,13 +10,13 @@ license.workspace = true workspace = true [dependencies] -futures = "0.3.21" +futures = "0.3.30" hex = "0.4.3" gum = { package = "tracing-gum", path = "../../gum" } rand = "0.8.5" -serde_json = "1.0.111" +serde_json = { workspace = true, default-features = true } tempfile = "3.2.0" -tokio = "1.24.2" +tokio = "1.37" # Polkadot dependencies polkadot-overseer = { path = "../../overseer" } @@ -63,7 +63,7 @@ substrate-test-client = { path = "../../../../substrate/test-utils/client" } [dev-dependencies] pallet-balances = { path = "../../../../substrate/frame/balances", default-features = false } substrate-test-utils = { path = "../../../../substrate/test-utils" } -tokio = { version = "1.24.2", features = ["macros"] } +tokio = { version = "1.37", features = ["macros"] } [features] runtime-metrics = ["polkadot-test-runtime/runtime-metrics"] diff --git a/polkadot/node/test/service/src/chain_spec.rs b/polkadot/node/test/service/src/chain_spec.rs index 0295090b9521551533d012addeda064595dbeac3..f14fa9fde58b4426690cd1bd0e16129f095c34ec 100644 --- a/polkadot/node/test/service/src/chain_spec.rs +++ b/polkadot/node/test/service/src/chain_spec.rs @@ -19,7 +19,9 @@ use babe_primitives::AuthorityId as BabeId; use grandpa::AuthorityId as GrandpaId; use pallet_staking::Forcing; -use polkadot_primitives::{AccountId, AssignmentId, ValidatorId, MAX_CODE_SIZE, MAX_POV_SIZE}; +use polkadot_primitives::{ + vstaging::SchedulerParams, AccountId, AssignmentId, ValidatorId, MAX_CODE_SIZE, MAX_POV_SIZE, +}; use polkadot_service::chain_spec::{get_account_id_from_seed, get_from_seed, Extensions}; use polkadot_test_runtime::BABE_GENESIS_EPOCH_CONFIG; use sc_chain_spec::{ChainSpec, ChainType}; @@ -165,10 +167,14 @@ fn polkadot_testnet_genesis( max_code_size: MAX_CODE_SIZE, max_pov_size: MAX_POV_SIZE, max_head_data_size: 32 * 1024, - group_rotation_frequency: 20, - paras_availability_period: 4, no_show_slots: 10, minimum_validation_upgrade_delay: 5, + max_downward_message_size: 1024, + scheduler_params: SchedulerParams { + group_rotation_frequency: 20, + paras_availability_period: 4, + ..Default::default() + }, ..Default::default() }, } diff --git a/polkadot/node/test/service/src/lib.rs b/polkadot/node/test/service/src/lib.rs index e4eec32baf2abc3d766f6daf444528ea3ad2a528..d313c19333483095291b09c79103d681961dbff6 100644 --- a/polkadot/node/test/service/src/lib.rs +++ b/polkadot/node/test/service/src/lib.rs @@ -44,8 +44,8 @@ use sc_network::{ }; use sc_service::{ config::{ - DatabaseSource, KeystoreConfig, MultiaddrWithPeerId, WasmExecutionMethod, - WasmtimeInstantiationStrategy, + DatabaseSource, KeystoreConfig, MultiaddrWithPeerId, RpcBatchRequestConfig, + WasmExecutionMethod, WasmtimeInstantiationStrategy, }, BasePath, BlocksPruning, Configuration, Role, RpcHandlers, TaskManager, }; @@ -79,24 +79,46 @@ pub fn new_full( ) -> Result { let workers_path = Some(workers_path.unwrap_or_else(get_relative_workers_path_for_test)); - polkadot_service::new_full( - config, - polkadot_service::NewFullParams { - is_parachain_node, - enable_beefy: true, - force_authoring_backoff: false, - jaeger_agent: None, - telemetry_worker_handle: None, - node_version: None, - secure_validator_mode: false, - workers_path, - workers_names: None, - overseer_gen, - overseer_message_channel_capacity_override: None, - malus_finality_delay: None, - hwbench: None, - }, - ) + match config.network.network_backend { + sc_network::config::NetworkBackendType::Libp2p => + polkadot_service::new_full::<_, sc_network::NetworkWorker<_, _>>( + config, + polkadot_service::NewFullParams { + is_parachain_node, + enable_beefy: true, + force_authoring_backoff: false, + jaeger_agent: None, + telemetry_worker_handle: None, + node_version: None, + secure_validator_mode: false, + workers_path, + workers_names: None, + overseer_gen, + overseer_message_channel_capacity_override: None, + malus_finality_delay: None, + hwbench: None, + }, + ), + sc_network::config::NetworkBackendType::Litep2p => + polkadot_service::new_full::<_, sc_network::Litep2pNetworkBackend>( + config, + polkadot_service::NewFullParams { + is_parachain_node, + enable_beefy: true, + force_authoring_backoff: false, + jaeger_agent: None, + telemetry_worker_handle: None, + node_version: None, + secure_validator_mode: false, + workers_path, + workers_names: None, + overseer_gen, + overseer_message_channel_capacity_override: None, + malus_finality_delay: None, + hwbench: None, + }, + ), + } } fn get_relative_workers_path_for_test() -> PathBuf { @@ -186,6 +208,8 @@ pub fn node_config( rpc_max_subs_per_conn: Default::default(), rpc_port: 9944, rpc_message_buffer_capacity: Default::default(), + rpc_batch_config: RpcBatchRequestConfig::Unlimited, + rpc_rate_limit: None, prometheus_config: None, telemetry_endpoints: None, default_heap_pages: None, @@ -408,7 +432,7 @@ pub fn construct_extrinsic( UncheckedExtrinsic::new_signed( function.clone(), polkadot_test_runtime::Address::Id(caller.public().into()), - polkadot_primitives::Signature::Sr25519(signature.clone()), + polkadot_primitives::Signature::Sr25519(signature), extra.clone(), ) } diff --git a/polkadot/node/zombienet-backchannel/Cargo.toml b/polkadot/node/zombienet-backchannel/Cargo.toml index 6af7a8d6e380a0180bb83f670fd15deee7dfc21b..fa99490a997434eedee977121f13d8dcc1a9b5a1 100644 --- a/polkadot/node/zombienet-backchannel/Cargo.toml +++ b/polkadot/node/zombienet-backchannel/Cargo.toml @@ -19,7 +19,7 @@ futures-util = "0.3.30" lazy_static = "1.4.0" parity-scale-codec = { version = "3.6.1", features = ["derive"] } reqwest = { version = "0.11", features = ["rustls-tls"], default-features = false } -thiserror = "1.0.48" +thiserror = { workspace = true } gum = { package = "tracing-gum", path = "../gum" } -serde = { version = "1.0", features = ["derive"] } -serde_json = "1.0.111" +serde = { features = ["derive"], workspace = true, default-features = true } +serde_json = { workspace = true, default-features = true } diff --git a/polkadot/parachain/Cargo.toml b/polkadot/parachain/Cargo.toml index e5ff1051d25a3a972f22e9521a864b035332d500..15eea2addc893ced551edaf2557ff703a455a879 100644 --- a/polkadot/parachain/Cargo.toml +++ b/polkadot/parachain/Cargo.toml @@ -14,7 +14,7 @@ workspace = true # this crate for WASM. This is critical to avoid forcing all parachain WASM into implementing # various unnecessary Substrate-specific endpoints. parity-scale-codec = { version = "3.6.1", default-features = false, features = ["derive"] } -scale-info = { version = "2.10.0", default-features = false, features = ["derive", "serde"] } +scale-info = { version = "2.11.1", default-features = false, features = ["derive", "serde"] } sp-std = { path = "../../substrate/primitives/std", default-features = false } sp-runtime = { path = "../../substrate/primitives/runtime", default-features = false, features = ["serde"] } sp-core = { path = "../../substrate/primitives/core", default-features = false, features = ["serde"] } @@ -24,7 +24,7 @@ derive_more = "0.99.11" bounded-collections = { version = "0.2.0", default-features = false, features = ["serde"] } # all optional crates. -serde = { version = "1.0.195", default-features = false, features = ["alloc", "derive"] } +serde = { features = ["alloc", "derive"], workspace = true } [features] default = ["std"] diff --git a/polkadot/parachain/test-parachains/adder/collator/Cargo.toml b/polkadot/parachain/test-parachains/adder/collator/Cargo.toml index 7dd0d9a563c5087b9295d5de5d6a6ee812033578..5a2b5405741446f52e5f1212de2665ab04d350d2 100644 --- a/polkadot/parachain/test-parachains/adder/collator/Cargo.toml +++ b/polkadot/parachain/test-parachains/adder/collator/Cargo.toml @@ -16,15 +16,15 @@ path = "src/main.rs" [dependencies] parity-scale-codec = { version = "3.6.1", default-features = false, features = ["derive"] } -clap = { version = "4.4.18", features = ["derive"] } -futures = "0.3.21" +clap = { version = "4.5.3", features = ["derive"] } +futures = "0.3.30" futures-timer = "3.0.2" -log = "0.4.17" +log = { workspace = true, default-features = true } test-parachain-adder = { path = ".." } polkadot-primitives = { path = "../../../../primitives" } polkadot-cli = { path = "../../../../cli" } -polkadot-service = { path = "../../../../node/service", features = ["rococo-native"] } +polkadot-service = { path = "../../../../node/service", features = ["elastic-scaling-experimental", "rococo-native"] } polkadot-node-primitives = { path = "../../../../node/primitives" } polkadot-node-subsystem = { path = "../../../../node/subsystem" } diff --git a/polkadot/parachain/test-parachains/adder/collator/src/lib.rs b/polkadot/parachain/test-parachains/adder/collator/src/lib.rs index 5f62ae34caefa5db97f6481dfc21067e42666b50..c2ba93f389b03d3c3171bc68ad845d373da124f3 100644 --- a/polkadot/parachain/test-parachains/adder/collator/src/lib.rs +++ b/polkadot/parachain/test-parachains/adder/collator/src/lib.rs @@ -102,11 +102,47 @@ impl State { } } +/// Local collator state so we can compute how fast we are advancing +/// per relay parent. +#[derive(Default)] +pub struct LocalCollatorState { + /// First relay block number on which we've built on. + first_relay_parent: Option, + /// Last relay block number on which we've built on. + last_relay_parent: Option, +} + +impl LocalCollatorState { + fn advance(&mut self, new_relay_parent: u32, best_block: u64) { + match (self.first_relay_parent, self.last_relay_parent) { + (Some(first_relay_parent), Some(last_relay_parent)) => { + // Compute the parachain velocity when relay parent changes vs our last + // recorded relay parent. We do this to only print out the velocity + // once per relay parent. + if new_relay_parent > last_relay_parent { + let building_for = (new_relay_parent - first_relay_parent) as f32; + // Round it up, as we don't expect perfect runs in CI. + let velocity = (best_block as f32 / building_for).ceil() as u32; + + log::info!("Parachain velocity: {:}", velocity); + } + }, + _ => {}, + } + + if self.first_relay_parent.is_none() { + self.first_relay_parent = Some(new_relay_parent); + } + self.last_relay_parent = Some(new_relay_parent); + } +} + /// The collator of the adder parachain. pub struct Collator { state: Arc>, key: CollatorPair, seconded_collations: Arc, + collator_state: Arc>, } impl Collator { @@ -116,6 +152,7 @@ impl Collator { state: Arc::new(Mutex::new(State::genesis())), key: CollatorPair::generate().0, seconded_collations: Arc::new(AtomicU32::new(0)), + collator_state: Default::default(), } } @@ -156,12 +193,18 @@ impl Collator { use futures::FutureExt as _; let state = self.state.clone(); + let collator_state = self.collator_state.clone(); let seconded_collations = self.seconded_collations.clone(); Box::new(move |relay_parent, validation_data| { let parent = HeadData::decode(&mut &validation_data.parent_head.0[..]) .expect("Decodes parent head"); + collator_state + .lock() + .unwrap() + .advance(validation_data.relay_parent_number, parent.number); + let (block_data, head_data) = state.lock().unwrap().advance(parent); log::info!( diff --git a/polkadot/parachain/test-parachains/undying/Cargo.toml b/polkadot/parachain/test-parachains/undying/Cargo.toml index 19e1261db1e7c4f17308061929d559df34943159..82ceebcf4eee99f36140908580b41c13b04ea87e 100644 --- a/polkadot/parachain/test-parachains/undying/Cargo.toml +++ b/polkadot/parachain/test-parachains/undying/Cargo.toml @@ -17,7 +17,7 @@ parity-scale-codec = { version = "3.6.1", default-features = false, features = [ sp-std = { path = "../../../../substrate/primitives/std", default-features = false } tiny-keccak = { version = "2.0.2", features = ["keccak"] } dlmalloc = { version = "0.2.4", features = ["global"] } -log = { version = "0.4.17", default-features = false } +log = { workspace = true } # We need to make sure the global allocator is disabled until we have support of full substrate externalities sp-io = { path = "../../../../substrate/primitives/io", default-features = false, features = ["disable_allocator"] } diff --git a/polkadot/parachain/test-parachains/undying/collator/Cargo.toml b/polkadot/parachain/test-parachains/undying/collator/Cargo.toml index 001c48476b58929852075fd914154b0b86daa93a..cacf7304f90a29d39848b80a58159afbbb6cb3e5 100644 --- a/polkadot/parachain/test-parachains/undying/collator/Cargo.toml +++ b/polkadot/parachain/test-parachains/undying/collator/Cargo.toml @@ -16,15 +16,15 @@ path = "src/main.rs" [dependencies] parity-scale-codec = { version = "3.6.1", default-features = false, features = ["derive"] } -clap = { version = "4.4.18", features = ["derive"] } -futures = "0.3.21" +clap = { version = "4.5.3", features = ["derive"] } +futures = "0.3.30" futures-timer = "3.0.2" -log = "0.4.17" +log = { workspace = true, default-features = true } test-parachain-undying = { path = ".." } polkadot-primitives = { path = "../../../../primitives" } polkadot-cli = { path = "../../../../cli" } -polkadot-service = { path = "../../../../node/service", features = ["rococo-native"] } +polkadot-service = { path = "../../../../node/service", features = ["elastic-scaling-experimental", "rococo-native"] } polkadot-node-primitives = { path = "../../../../node/primitives" } polkadot-node-subsystem = { path = "../../../../node/subsystem" } diff --git a/polkadot/primitives/Cargo.toml b/polkadot/primitives/Cargo.toml index c2fdf331568d6e69350542f5c4186b916474987a..004fa62acf34595c548e0e36da1d05f0a52abb53 100644 --- a/polkadot/primitives/Cargo.toml +++ b/polkadot/primitives/Cargo.toml @@ -13,8 +13,9 @@ workspace = true bitvec = { version = "1.0.0", default-features = false, features = ["alloc", "serde"] } hex-literal = "0.4.1" parity-scale-codec = { version = "3.6.1", default-features = false, features = ["bit-vec", "derive"] } -scale-info = { version = "2.10.0", default-features = false, features = ["bit-vec", "derive", "serde"] } -serde = { version = "1.0.195", default-features = false, features = ["alloc", "derive"] } +scale-info = { version = "2.11.1", default-features = false, features = ["bit-vec", "derive", "serde"] } +log = { workspace = true, default-features = false } +serde = { features = ["alloc", "derive"], workspace = true } application-crypto = { package = "sp-application-crypto", path = "../../substrate/primitives/application-crypto", default-features = false, features = ["serde"] } inherents = { package = "sp-inherents", path = "../../substrate/primitives/inherents", default-features = false } @@ -38,6 +39,7 @@ std = [ "application-crypto/std", "bitvec/std", "inherents/std", + "log/std", "parity-scale-codec/std", "polkadot-core-primitives/std", "polkadot-parachain-primitives/std", diff --git a/polkadot/primitives/src/lib.rs b/polkadot/primitives/src/lib.rs index 2570bcadf606ab8ef0809a1f258a6068263f1db1..d4eeb3cc3d2951089213b924777cbcd9a979c1c9 100644 --- a/polkadot/primitives/src/lib.rs +++ b/polkadot/primitives/src/lib.rs @@ -20,7 +20,7 @@ #![cfg_attr(not(feature = "std"), no_std)] // `v6` is currently the latest stable version of the runtime API. -pub mod v6; +pub mod v7; // The 'staging' version is special - it contains primitives which are // still in development. Once they are considered stable, they will be @@ -33,33 +33,35 @@ pub mod runtime_api; // Current primitives not requiring versioning are exported here. // Primitives requiring versioning must not be exported and must be referred by an exact version. -pub use v6::{ +pub use v7::{ async_backing, byzantine_threshold, check_candidate_backing, collator_signature_payload, - effective_minimum_backing_votes, executor_params, metric_definitions, slashing, + effective_minimum_backing_votes, executor_params, metric_definitions, node_features, slashing, supermajority_threshold, well_known_keys, AbridgedHostConfiguration, AbridgedHrmpChannel, - AccountId, AccountIndex, AccountPublic, ApprovalVote, AssignmentId, AsyncBackingParams, - AuthorityDiscoveryId, AvailabilityBitfield, BackedCandidate, Balance, BlakeTwo256, Block, - BlockId, BlockNumber, CandidateCommitments, CandidateDescriptor, CandidateEvent, CandidateHash, - CandidateIndex, CandidateReceipt, CheckedDisputeStatementSet, CheckedMultiDisputeStatementSet, - CollatorId, CollatorSignature, CommittedCandidateReceipt, CompactStatement, ConsensusLog, - CoreIndex, CoreState, DisputeState, DisputeStatement, DisputeStatementSet, DownwardMessage, - EncodeAs, ExecutorParam, ExecutorParamError, ExecutorParams, ExecutorParamsHash, + AccountId, AccountIndex, AccountPublic, ApprovalVote, ApprovalVoteMultipleCandidates, + ApprovalVotingParams, AssignmentId, AsyncBackingParams, AuthorityDiscoveryId, + AvailabilityBitfield, BackedCandidate, Balance, BlakeTwo256, Block, BlockId, BlockNumber, + CandidateCommitments, CandidateDescriptor, CandidateEvent, CandidateHash, CandidateIndex, + CandidateReceipt, CheckedDisputeStatementSet, CheckedMultiDisputeStatementSet, CollatorId, + CollatorSignature, CommittedCandidateReceipt, CompactStatement, ConsensusLog, CoreIndex, + CoreState, DisputeState, DisputeStatement, DisputeStatementSet, DownwardMessage, EncodeAs, + ExecutorParam, ExecutorParamError, ExecutorParams, ExecutorParamsHash, ExplicitDisputeStatement, GroupIndex, GroupRotationInfo, Hash, HashT, HeadData, Header, HorizontalMessages, HrmpChannelId, Id, InboundDownwardMessage, InboundHrmpMessage, IndexedVec, - InherentData, InvalidDisputeStatementKind, Moment, MultiDisputeStatementSet, Nonce, - OccupiedCore, OccupiedCoreAssumption, OutboundHrmpMessage, ParathreadClaim, ParathreadEntry, - PersistedValidationData, PvfCheckStatement, PvfExecKind, PvfPrepKind, RuntimeMetricLabel, - RuntimeMetricLabelValue, RuntimeMetricLabelValues, RuntimeMetricLabels, RuntimeMetricOp, - RuntimeMetricUpdate, ScheduledCore, ScrapedOnChainVotes, SessionIndex, SessionInfo, Signature, - Signed, SignedAvailabilityBitfield, SignedAvailabilityBitfields, SignedStatement, - SigningContext, Slot, UncheckedSigned, UncheckedSignedAvailabilityBitfield, + InherentData, InvalidDisputeStatementKind, Moment, MultiDisputeStatementSet, NodeFeatures, + Nonce, OccupiedCore, OccupiedCoreAssumption, OutboundHrmpMessage, ParathreadClaim, + ParathreadEntry, PersistedValidationData, PvfCheckStatement, PvfExecKind, PvfPrepKind, + RuntimeMetricLabel, RuntimeMetricLabelValue, RuntimeMetricLabelValues, RuntimeMetricLabels, + RuntimeMetricOp, RuntimeMetricUpdate, ScheduledCore, ScrapedOnChainVotes, SessionIndex, + SessionInfo, Signature, Signed, SignedAvailabilityBitfield, SignedAvailabilityBitfields, + SignedStatement, SigningContext, Slot, UncheckedSigned, UncheckedSignedAvailabilityBitfield, UncheckedSignedAvailabilityBitfields, UncheckedSignedStatement, UpgradeGoAhead, UpgradeRestriction, UpwardMessage, ValidDisputeStatementKind, ValidationCode, ValidationCodeHash, ValidatorId, ValidatorIndex, ValidatorSignature, ValidityAttestation, ValidityError, ASSIGNMENT_KEY_TYPE_ID, LEGACY_MIN_BACKING_VOTES, LOWEST_PUBLIC_ID, - MAX_CODE_SIZE, MAX_HEAD_DATA_SIZE, MAX_POV_SIZE, ON_DEMAND_DEFAULT_QUEUE_MAX_SIZE, - PARACHAINS_INHERENT_IDENTIFIER, PARACHAIN_KEY_TYPE_ID, + MAX_CODE_SIZE, MAX_HEAD_DATA_SIZE, MAX_POV_SIZE, MIN_CODE_SIZE, + ON_DEMAND_DEFAULT_QUEUE_MAX_SIZE, ON_DEMAND_MAX_QUEUE_MAX_SIZE, PARACHAINS_INHERENT_IDENTIFIER, + PARACHAIN_KEY_TYPE_ID, }; #[cfg(feature = "std")] -pub use v6::{AssignmentPair, CollatorPair, ValidatorPair}; +pub use v7::{AssignmentPair, CollatorPair, ValidatorPair}; diff --git a/polkadot/primitives/src/runtime_api.rs b/polkadot/primitives/src/runtime_api.rs index d661005e32ffc9ce146e96ad984fb3f60025ca4c..f611936f2701d367283503e761176e9b61e72cbe 100644 --- a/polkadot/primitives/src/runtime_api.rs +++ b/polkadot/primitives/src/runtime_api.rs @@ -114,17 +114,19 @@ //! separated from the stable primitives. use crate::{ - async_backing, slashing, - vstaging::{self, ApprovalVotingParams}, - AsyncBackingParams, BlockNumber, CandidateCommitments, CandidateEvent, CandidateHash, - CommittedCandidateReceipt, CoreState, DisputeState, ExecutorParams, GroupRotationInfo, Hash, + async_backing, slashing, ApprovalVotingParams, AsyncBackingParams, BlockNumber, + CandidateCommitments, CandidateEvent, CandidateHash, CommittedCandidateReceipt, CoreIndex, + CoreState, DisputeState, ExecutorParams, GroupRotationInfo, Hash, NodeFeatures, OccupiedCoreAssumption, PersistedValidationData, PvfCheckStatement, ScrapedOnChainVotes, SessionIndex, SessionInfo, ValidatorId, ValidatorIndex, ValidatorSignature, }; use polkadot_core_primitives as pcp; use polkadot_parachain_primitives::primitives as ppp; -use sp_std::{collections::btree_map::BTreeMap, prelude::*}; +use sp_std::{ + collections::{btree_map::BTreeMap, vec_deque::VecDeque}, + prelude::*, +}; sp_api::decl_runtime_apis! { /// The API for querying the state of parachains on-chain. @@ -275,11 +277,16 @@ sp_api::decl_runtime_apis! { /// Get node features. /// This is a staging method! Do not use on production runtimes! #[api_version(9)] - fn node_features() -> vstaging::NodeFeatures; + fn node_features() -> NodeFeatures; /***** Added in v10 *****/ /// Approval voting configuration parameters #[api_version(10)] fn approval_voting_params() -> ApprovalVotingParams; + + /***** Added in v11 *****/ + /// Claim queue + #[api_version(11)] + fn claim_queue() -> BTreeMap>; } } diff --git a/polkadot/primitives/src/v6/async_backing.rs b/polkadot/primitives/src/v7/async_backing.rs similarity index 100% rename from polkadot/primitives/src/v6/async_backing.rs rename to polkadot/primitives/src/v7/async_backing.rs diff --git a/polkadot/primitives/src/v6/executor_params.rs b/polkadot/primitives/src/v7/executor_params.rs similarity index 98% rename from polkadot/primitives/src/v6/executor_params.rs rename to polkadot/primitives/src/v7/executor_params.rs index 112a529f62b0570e9270d1f09e397e6b9dc358b0..1e19f3b23fec9b9889d5976380f52ab6b66072b4 100644 --- a/polkadot/primitives/src/v6/executor_params.rs +++ b/polkadot/primitives/src/v7/executor_params.rs @@ -159,7 +159,9 @@ impl sp_std::fmt::LowerHex for ExecutorParamsHash { // into individual fields of the structure. Thus, complex migrations shall be avoided when adding // new entries and removing old ones. At the moment, there's no mandatory parameters defined. If // they show up, they must be clearly documented as mandatory ones. -#[derive(Clone, Debug, Encode, Decode, PartialEq, Eq, TypeInfo, Serialize, Deserialize)] +#[derive( + Clone, Debug, Default, Encode, Decode, PartialEq, Eq, TypeInfo, Serialize, Deserialize, +)] pub struct ExecutorParams(Vec); impl ExecutorParams { @@ -334,9 +336,3 @@ impl From<&[ExecutorParam]> for ExecutorParams { ExecutorParams(arr.to_vec()) } } - -impl Default for ExecutorParams { - fn default() -> Self { - ExecutorParams(vec![]) - } -} diff --git a/polkadot/primitives/src/v6/metrics.rs b/polkadot/primitives/src/v7/metrics.rs similarity index 100% rename from polkadot/primitives/src/v6/metrics.rs rename to polkadot/primitives/src/v7/metrics.rs diff --git a/polkadot/primitives/src/v6/mod.rs b/polkadot/primitives/src/v7/mod.rs similarity index 86% rename from polkadot/primitives/src/v6/mod.rs rename to polkadot/primitives/src/v7/mod.rs index fd0b32db799434d1b76071d53edf1e20a491c109..5647bfe68d5667c17f23a684ba97d8ce271fcb26 100644 --- a/polkadot/primitives/src/v6/mod.rs +++ b/polkadot/primitives/src/v7/mod.rs @@ -14,9 +14,9 @@ // You should have received a copy of the GNU General Public License // along with Polkadot. If not, see . -//! `V6` Primitives. +//! `V7` Primitives. -use bitvec::vec::BitVec; +use bitvec::{field::BitField, slice::BitSlice, vec::BitVec}; use parity_scale_codec::{Decode, Encode}; use scale_info::TypeInfo; use sp_std::{ @@ -72,6 +72,7 @@ pub use metrics::{ /// The key type ID for a collator key. pub const COLLATOR_KEY_TYPE_ID: KeyTypeId = KeyTypeId(*b"coll"); +const LOG_TARGET: &str = "runtime::primitives"; mod collator_app { use application_crypto::{app_crypto, sr25519}; @@ -362,6 +363,9 @@ pub const PARACHAINS_INHERENT_IDENTIFIER: InherentIdentifier = *b"parachn0"; /// The key type ID for parachain assignment key. pub const ASSIGNMENT_KEY_TYPE_ID: KeyTypeId = KeyTypeId(*b"asgn"); +/// Compressed or not the wasm blob can never be less than 9 bytes. +pub const MIN_CODE_SIZE: u32 = 9; + /// Maximum compressed code size we support right now. /// At the moment we have runtime upgrade on chain, which restricts scalability severely. If we want /// to have bigger values, we should fix that first. @@ -395,6 +399,13 @@ pub const MAX_POV_SIZE: u32 = 5 * 1024 * 1024; /// Can be adjusted in configuration. pub const ON_DEMAND_DEFAULT_QUEUE_MAX_SIZE: u32 = 10_000; +/// Maximum for maximum queue size. +/// +/// Setting `on_demand_queue_max_size` to a value higher than this is unsound. This is more a +/// theoretical limit, just below enough what the target type supports, so comparisons are possible +/// even with indices that are overflowing the underyling type. +pub const ON_DEMAND_MAX_QUEUE_MAX_SIZE: u32 = 1_000_000_000; + /// Backing votes threshold used from the host prior to runtime API version 6 and from the runtime /// prior to v9 configuration migration. pub const LEGACY_MIN_BACKING_VOTES: u32 = 2; @@ -529,18 +540,6 @@ impl CandidateReceipt { } } -/// All data pertaining to the execution of a para candidate. -#[derive(PartialEq, Eq, Clone, Encode, Decode, TypeInfo, RuntimeDebug)] -pub struct FullCandidateReceipt { - /// The inner candidate receipt. - pub inner: CandidateReceipt, - /// The validation data derived from the relay-chain state at that - /// point. The hash of the persisted validation data should - /// match the `persisted_validation_data_hash` in the descriptor - /// of the receipt. - pub validation_data: PersistedValidationData, -} - /// A candidate-receipt with commitments directly included. #[derive(PartialEq, Eq, Clone, Encode, Decode, TypeInfo, RuntimeDebug)] #[cfg_attr(feature = "std", derive(Hash))] @@ -703,19 +702,50 @@ pub type UncheckedSignedAvailabilityBitfields = Vec { /// The candidate referred to. - pub candidate: CommittedCandidateReceipt, + candidate: CommittedCandidateReceipt, /// The validity votes themselves, expressed as signatures. - pub validity_votes: Vec, - /// The indices of the validators within the group, expressed as a bitfield. - pub validator_indices: BitVec, + validity_votes: Vec, + /// The indices of the validators within the group, expressed as a bitfield. May be extended + /// beyond the backing group size to contain the assigned core index, if ElasticScalingMVP is + /// enabled. + validator_indices: BitVec, } impl BackedCandidate { - /// Get a reference to the descriptor of the para. + /// Constructor + pub fn new( + candidate: CommittedCandidateReceipt, + validity_votes: Vec, + validator_indices: BitVec, + core_index: Option, + ) -> Self { + let mut instance = Self { candidate, validity_votes, validator_indices }; + if let Some(core_index) = core_index { + instance.inject_core_index(core_index); + } + instance + } + + /// Get a reference to the descriptor of the candidate. pub fn descriptor(&self) -> &CandidateDescriptor { &self.candidate.descriptor } + /// Get a reference to the committed candidate receipt of the candidate. + pub fn candidate(&self) -> &CommittedCandidateReceipt { + &self.candidate + } + + /// Get a reference to the validity votes of the candidate. + pub fn validity_votes(&self) -> &[ValidityAttestation] { + &self.validity_votes + } + + /// Get a mutable reference to validity votes of the para. + pub fn validity_votes_mut(&mut self) -> &mut Vec { + &mut self.validity_votes + } + /// Compute this candidate's hash. pub fn hash(&self) -> CandidateHash where @@ -731,6 +761,48 @@ impl BackedCandidate { { self.candidate.to_plain() } + + /// Get a copy of the validator indices and the assumed core index, if any. + pub fn validator_indices_and_core_index( + &self, + core_index_enabled: bool, + ) -> (&BitSlice, Option) { + // This flag tells us if the block producers must enable Elastic Scaling MVP hack. + // It extends `BackedCandidate::validity_indices` to store a 8 bit core index. + if core_index_enabled { + let core_idx_offset = self.validator_indices.len().saturating_sub(8); + if core_idx_offset > 0 { + let (validator_indices_slice, core_idx_slice) = + self.validator_indices.split_at(core_idx_offset); + return ( + validator_indices_slice, + Some(CoreIndex(core_idx_slice.load::() as u32)), + ); + } + } + + (&self.validator_indices, None) + } + + /// Inject a core index in the validator_indices bitvec. + fn inject_core_index(&mut self, core_index: CoreIndex) { + let core_index_to_inject: BitVec = + BitVec::from_vec(vec![core_index.0 as u8]); + self.validator_indices.extend(core_index_to_inject); + } + + /// Update the validator indices and core index in the candidate. + pub fn set_validator_indices_and_core_index( + &mut self, + new_indices: BitVec, + maybe_core_index: Option, + ) { + self.validator_indices = new_indices; + + if let Some(core_index) = maybe_core_index { + self.inject_core_index(core_index); + } + } } /// Verify the backing of the given candidate. @@ -743,43 +815,65 @@ impl BackedCandidate { /// /// Returns either an error, indicating that one of the signatures was invalid or that the index /// was out-of-bounds, or the number of signatures checked. -pub fn check_candidate_backing + Clone + Encode>( - backed: &BackedCandidate, +pub fn check_candidate_backing + Clone + Encode + core::fmt::Debug>( + candidate_hash: CandidateHash, + validity_votes: &[ValidityAttestation], + validator_indices: &BitSlice, signing_context: &SigningContext, group_len: usize, validator_lookup: impl Fn(usize) -> Option, ) -> Result { - if backed.validator_indices.len() != group_len { + if validator_indices.len() != group_len { + log::debug!( + target: LOG_TARGET, + "Check candidate backing: indices mismatch: group_len = {} , indices_len = {}", + group_len, + validator_indices.len(), + ); return Err(()) } - if backed.validity_votes.len() > group_len { + if validity_votes.len() > group_len { + log::debug!( + target: LOG_TARGET, + "Check candidate backing: Too many votes, expected: {}, found: {}", + group_len, + validity_votes.len(), + ); return Err(()) } - // this is known, even in runtime, to be blake2-256. - let hash = backed.candidate.hash(); - let mut signed = 0; - for ((val_in_group_idx, _), attestation) in backed - .validator_indices + for ((val_in_group_idx, _), attestation) in validator_indices .iter() .enumerate() .filter(|(_, signed)| **signed) - .zip(backed.validity_votes.iter()) + .zip(validity_votes.iter()) { let validator_id = validator_lookup(val_in_group_idx).ok_or(())?; - let payload = attestation.signed_payload(hash, signing_context); + let payload = attestation.signed_payload(candidate_hash, signing_context); let sig = attestation.signature(); if sig.verify(&payload[..], &validator_id) { signed += 1; } else { + log::debug!( + target: LOG_TARGET, + "Check candidate backing: Invalid signature. validator_id = {:?}, validator_index = {} ", + validator_id, + val_in_group_idx, + ); return Err(()) } } - if signed != backed.validity_votes.len() { + if signed != validity_votes.len() { + log::error!( + target: LOG_TARGET, + "Check candidate backing: Too many signatures, expected = {}, found = {}", + validity_votes.len(), + signed, + ); return Err(()) } @@ -992,10 +1086,16 @@ pub enum CoreState { } impl CoreState { - /// If this core state has a `para_id`, return it. + /// Returns the scheduled `ParaId` for the core or `None` if nothing is scheduled. + /// + /// This function is deprecated. `ClaimQueue` should be used to obtain the scheduled `ParaId`s + /// for each core. + #[deprecated( + note = "`para_id` will be removed. Use `ClaimQueue` to query the scheduled `para_id` instead." + )] pub fn para_id(&self) -> Option { match self { - Self::Occupied(ref core) => Some(core.para_id()), + Self::Occupied(ref core) => core.next_up_on_available.as_ref().map(|n| n.para_id), Self::Scheduled(core) => Some(core.para_id), Self::Free => None, } @@ -1090,6 +1190,32 @@ impl<'a> ApprovalVoteMultipleCandidates<'a> { } } +/// Approval voting configuration parameters +#[derive( + RuntimeDebug, + Copy, + Clone, + PartialEq, + Encode, + Decode, + TypeInfo, + serde::Serialize, + serde::Deserialize, +)] +pub struct ApprovalVotingParams { + /// The maximum number of candidates `approval-voting` can vote for with + /// a single signatures. + /// + /// Setting it to 1, means we send the approval as soon as we have it available. + pub max_approval_coalesce_count: u32, +} + +impl Default for ApprovalVotingParams { + fn default() -> Self { + Self { max_approval_coalesce_count: 1 } + } +} + /// Custom validity errors used in Polkadot while validating transactions. #[repr(u8)] pub enum ValidityError { @@ -1363,7 +1489,7 @@ pub enum ValidDisputeStatementKind { #[codec(index = 3)] ApprovalChecking, /// An approval vote from the new version. - /// We can't create this version untill all nodes + /// We can't create this version until all nodes /// have been updated to support it and max_approval_coalesce_count /// is set to more than 1. #[codec(index = 4)] @@ -1510,7 +1636,7 @@ impl ValidityAttestation { pub fn to_compact_statement(&self, candidate_hash: CandidateHash) -> CompactStatement { // Explicit and implicit map directly from // `ValidityVote::Valid` and `ValidityVote::Issued`, and hence there is a - // `1:1` relationshow which enables the conversion. + // `1:1` relationship which enables the conversion. match *self { ValidityAttestation::Implicit(_) => CompactStatement::Seconded(candidate_hash), ValidityAttestation::Explicit(_) => CompactStatement::Valid(candidate_hash), @@ -1853,9 +1979,60 @@ pub enum PvfExecKind { Approval, } +/// Bit indices in the `HostConfiguration.node_features` that correspond to different node features. +pub type NodeFeatures = BitVec; + +/// Module containing feature-specific bit indices into the `NodeFeatures` bitvec. +pub mod node_features { + /// A feature index used to identify a bit into the node_features array stored + /// in the HostConfiguration. + #[repr(u8)] + pub enum FeatureIndex { + /// Tells if tranch0 assignments could be sent in a single certificate. + /// Reserved for: `` + EnableAssignmentsV2 = 0, + /// This feature enables the extension of `BackedCandidate::validator_indices` by 8 bits. + /// The value stored there represents the assumed core index where the candidates + /// are backed. This is needed for the elastic scaling MVP. + ElasticScalingMVP = 1, + /// First unassigned feature bit. + /// Every time a new feature flag is assigned it should take this value. + /// and this should be incremented. + FirstUnassigned = 2, + } +} + #[cfg(test)] mod tests { use super::*; + use bitvec::bitvec; + use primitives::sr25519; + + pub fn dummy_committed_candidate_receipt() -> CommittedCandidateReceipt { + let zeros = Hash::zero(); + + CommittedCandidateReceipt { + descriptor: CandidateDescriptor { + para_id: 0.into(), + relay_parent: zeros, + collator: CollatorId::from(sr25519::Public::default()), + persisted_validation_data_hash: zeros, + pov_hash: zeros, + erasure_root: zeros, + signature: CollatorSignature::from(sr25519::Signature::default()), + para_head: zeros, + validation_code_hash: ValidationCode(vec![1, 2, 3, 4, 5, 6, 7, 8, 9]).hash(), + }, + commitments: CandidateCommitments { + head_data: HeadData(vec![]), + upward_messages: vec![].try_into().expect("empty vec fits within bounds"), + new_validation_code: None, + horizontal_messages: vec![].try_into().expect("empty vec fits within bounds"), + processed_downward_messages: 0, + hrmp_watermark: 0_u32, + }, + } + } #[test] fn group_rotation_info_calculations() { @@ -1930,4 +2107,73 @@ mod tests { assert!(zero_b.leading_zeros() >= zero_u.leading_zeros()); } + + #[test] + fn test_backed_candidate_injected_core_index() { + let initial_validator_indices = bitvec![u8, bitvec::order::Lsb0; 0, 1, 0, 1]; + let mut candidate = BackedCandidate::new( + dummy_committed_candidate_receipt(), + vec![], + initial_validator_indices.clone(), + None, + ); + + // No core index supplied, ElasticScalingMVP is off. + let (validator_indices, core_index) = candidate.validator_indices_and_core_index(false); + assert_eq!(validator_indices, initial_validator_indices.as_bitslice()); + assert!(core_index.is_none()); + + // No core index supplied, ElasticScalingMVP is on. Still, decoding will be ok if backing + // group size is <= 8, to give a chance to parachains that don't have multiple cores + // assigned. + let (validator_indices, core_index) = candidate.validator_indices_and_core_index(true); + assert_eq!(validator_indices, initial_validator_indices.as_bitslice()); + assert!(core_index.is_none()); + + let encoded_validator_indices = candidate.validator_indices.clone(); + candidate.set_validator_indices_and_core_index(validator_indices.into(), core_index); + assert_eq!(candidate.validator_indices, encoded_validator_indices); + + // No core index supplied, ElasticScalingMVP is on. Decoding is corrupted if backing group + // size larger than 8. + let candidate = BackedCandidate::new( + dummy_committed_candidate_receipt(), + vec![], + bitvec![u8, bitvec::order::Lsb0; 0, 1, 0, 1, 0, 1, 0, 1, 0], + None, + ); + let (validator_indices, core_index) = candidate.validator_indices_and_core_index(true); + assert_eq!(validator_indices, bitvec![u8, bitvec::order::Lsb0; 0].as_bitslice()); + assert!(core_index.is_some()); + + // Core index supplied, ElasticScalingMVP is off. Core index will be treated as normal + // validator indices. Runtime will check against this. + let candidate = BackedCandidate::new( + dummy_committed_candidate_receipt(), + vec![], + bitvec![u8, bitvec::order::Lsb0; 0, 1, 0, 1], + Some(CoreIndex(10)), + ); + let (validator_indices, core_index) = candidate.validator_indices_and_core_index(false); + assert_eq!( + validator_indices, + bitvec![u8, bitvec::order::Lsb0; 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0] + ); + assert!(core_index.is_none()); + + // Core index supplied, ElasticScalingMVP is on. + let mut candidate = BackedCandidate::new( + dummy_committed_candidate_receipt(), + vec![], + bitvec![u8, bitvec::order::Lsb0; 0, 1, 0, 1], + Some(CoreIndex(10)), + ); + let (validator_indices, core_index) = candidate.validator_indices_and_core_index(true); + assert_eq!(validator_indices, bitvec![u8, bitvec::order::Lsb0; 0, 1, 0, 1]); + assert_eq!(core_index, Some(CoreIndex(10))); + + let encoded_validator_indices = candidate.validator_indices.clone(); + candidate.set_validator_indices_and_core_index(validator_indices.into(), core_index); + assert_eq!(candidate.validator_indices, encoded_validator_indices); + } } diff --git a/polkadot/primitives/src/v6/signed.rs b/polkadot/primitives/src/v7/signed.rs similarity index 100% rename from polkadot/primitives/src/v6/signed.rs rename to polkadot/primitives/src/v7/signed.rs diff --git a/polkadot/primitives/src/v6/slashing.rs b/polkadot/primitives/src/v7/slashing.rs similarity index 98% rename from polkadot/primitives/src/v6/slashing.rs rename to polkadot/primitives/src/v7/slashing.rs index efffb932cdc0d997e08f9d195e2c42b857a7c8f5..bcd7d0c2fc4455e2ebf01fab027dbf0618f63dba 100644 --- a/polkadot/primitives/src/v6/slashing.rs +++ b/polkadot/primitives/src/v7/slashing.rs @@ -54,7 +54,7 @@ impl DisputesTimeSlot { /// is required to identify and verify it. #[derive(PartialEq, Eq, Clone, Encode, Decode, TypeInfo, Debug)] pub struct DisputeProof { - /// Time slot when the dispute occured. + /// Time slot when the dispute occurred. pub time_slot: DisputesTimeSlot, /// The dispute outcome. pub kind: SlashingOffenceKind, diff --git a/polkadot/primitives/src/vstaging/mod.rs b/polkadot/primitives/src/vstaging/mod.rs index 630bcf8679ad3046ce734042a1557058ea440110..1af73993f640cb8d28bc5145ffb797ab0619d16c 100644 --- a/polkadot/primitives/src/vstaging/mod.rs +++ b/polkadot/primitives/src/vstaging/mod.rs @@ -17,14 +17,15 @@ //! Staging Primitives. // Put any primitives used by staging APIs functions here -pub use crate::v6::*; +use crate::v7::*; use sp_std::prelude::*; use parity_scale_codec::{Decode, Encode}; use primitives::RuntimeDebug; use scale_info::TypeInfo; +use sp_arithmetic::Perbill; -/// Approval voting configuration parameters +/// Scheduler configuration parameters. All coretime/ondemand parameters are here. #[derive( RuntimeDebug, Copy, @@ -36,37 +37,65 @@ use scale_info::TypeInfo; serde::Serialize, serde::Deserialize, )] -pub struct ApprovalVotingParams { - /// The maximum number of candidates `approval-voting` can vote for with - /// a single signatures. +pub struct SchedulerParams { + /// How often parachain groups should be rotated across parachains. /// - /// Setting it to 1, means we send the approval as soon as we have it available. - pub max_approval_coalesce_count: u32, + /// Must be non-zero. + pub group_rotation_frequency: BlockNumber, + /// Availability timeout for a block on a core, measured in blocks. + /// + /// This is the maximum amount of blocks after a core became occupied that validators have time + /// to make the block available. + /// + /// This value only has effect on group rotations. If backers backed something at the end of + /// their rotation, the occupied core affects the backing group that comes afterwards. We limit + /// the effect one backing group can have on the next to `paras_availability_period` blocks. + /// + /// Within a group rotation there is no timeout as backers are only affecting themselves. + /// + /// Must be at least 1. With a value of 1, the previous group will not be able to negatively + /// affect the following group at the expense of a tight availability timeline at group + /// rotation boundaries. + pub paras_availability_period: BlockNumber, + /// The maximum number of validators to have per core. + /// + /// `None` means no maximum. + pub max_validators_per_core: Option, + /// The amount of blocks ahead to schedule paras. + pub lookahead: u32, + /// How many cores are managed by the coretime chain. + pub num_cores: u32, + /// The max number of times a claim can time out in availability. + pub max_availability_timeouts: u32, + /// The maximum queue size of the pay as you go module. + pub on_demand_queue_max_size: u32, + /// The target utilization of the spot price queue in percentages. + pub on_demand_target_queue_utilization: Perbill, + /// How quickly the fee rises in reaction to increased utilization. + /// The lower the number the slower the increase. + pub on_demand_fee_variability: Perbill, + /// The minimum amount needed to claim a slot in the spot pricing queue. + pub on_demand_base_fee: Balance, + /// The number of blocks a claim stays in the scheduler's claim queue before getting cleared. + /// This number should go reasonably higher than the number of blocks in the async backing + /// lookahead. + pub ttl: BlockNumber, } -impl Default for ApprovalVotingParams { +impl> Default for SchedulerParams { fn default() -> Self { - Self { max_approval_coalesce_count: 1 } - } -} - -use bitvec::vec::BitVec; - -/// Bit indices in the `HostConfiguration.node_features` that correspond to different node features. -pub type NodeFeatures = BitVec; - -/// Module containing feature-specific bit indices into the `NodeFeatures` bitvec. -pub mod node_features { - /// A feature index used to indentify a bit into the node_features array stored - /// in the HostConfiguration. - #[repr(u8)] - pub enum FeatureIndex { - /// Tells if tranch0 assignments could be sent in a single certificate. - /// Reserved for: `` - EnableAssignmentsV2 = 0, - /// First unassigned feature bit. - /// Every time a new feature flag is assigned it should take this value. - /// and this should be incremented. - FirstUnassigned = 1, + Self { + group_rotation_frequency: 1u32.into(), + paras_availability_period: 1u32.into(), + max_validators_per_core: Default::default(), + lookahead: 1, + num_cores: Default::default(), + max_availability_timeouts: Default::default(), + on_demand_queue_max_size: ON_DEMAND_DEFAULT_QUEUE_MAX_SIZE, + on_demand_target_queue_utilization: Perbill::from_percent(25), + on_demand_fee_variability: Perbill::from_percent(3), + on_demand_base_fee: 10_000_000u128, + ttl: 5u32.into(), + } } } diff --git a/polkadot/primitives/test-helpers/src/lib.rs b/polkadot/primitives/test-helpers/src/lib.rs index d532d6ff57f4a34c53d7099d011f1ca68bf6cf5f..d43cf3317e573adffb21b8fdc077eeebf993d40d 100644 --- a/polkadot/primitives/test-helpers/src/lib.rs +++ b/polkadot/primitives/test-helpers/src/lib.rs @@ -126,7 +126,7 @@ pub fn dummy_candidate_descriptor>(relay_parent: H) -> CandidateD /// Create meaningless validation code. pub fn dummy_validation_code() -> ValidationCode { - ValidationCode(vec![1, 2, 3]) + ValidationCode(vec![1, 2, 3, 4, 5, 6, 7, 8, 9]) } /// Create meaningless head data. @@ -136,17 +136,17 @@ pub fn dummy_head_data() -> HeadData { /// Create a meaningless collator id. pub fn dummy_collator() -> CollatorId { - CollatorId::from(sr25519::Public::from_raw([0; 32])) + CollatorId::from(sr25519::Public::default()) } /// Create a meaningless validator id. pub fn dummy_validator() -> ValidatorId { - ValidatorId::from(sr25519::Public::from_raw([0; 32])) + ValidatorId::from(sr25519::Public::default()) } /// Create a meaningless collator signature. pub fn dummy_collator_signature() -> CollatorSignature { - CollatorSignature::from(sr25519::Signature([0u8; 64])) + CollatorSignature::from(sr25519::Signature::default()) } /// Create a meaningless persisted validation data. @@ -249,7 +249,7 @@ pub fn resign_candidate_descriptor_with_collator>( descriptor.signature = signature; } -/// Extracts validators's public keus (`ValidatorId`) from `Sr25519Keyring` +/// Extracts validators's public keys (`ValidatorId`) from `Sr25519Keyring` pub fn validator_pubkeys(val_ids: &[Sr25519Keyring]) -> Vec { val_ids.iter().map(|v| v.public().into()).collect() } diff --git a/polkadot/roadmap/implementers-guide/src/disputes-flow.md b/polkadot/roadmap/implementers-guide/src/disputes-flow.md index b5cc5611c6ff897826e128d240c38761991e0a5c..540b3c45bad4b3328437ad5e6177227ef13a4f22 100644 --- a/polkadot/roadmap/implementers-guide/src/disputes-flow.md +++ b/polkadot/roadmap/implementers-guide/src/disputes-flow.md @@ -74,7 +74,7 @@ The set of validators eligible to vote consists of the validators that had duty votes by the backing validators. If a validator receives an initial dispute message (a set of votes where there are at least two opposing votes -contained), and the PoV or Code are hence not reconstructable from local storage, that validator must request the +contained), and the PoV or Code are hence not reconstructible from local storage, that validator must request the required data from its peers. The dispute availability message must contain code, persisted validation data, and the proof of validity. diff --git a/polkadot/roadmap/implementers-guide/src/node/approval/approval-distribution.md b/polkadot/roadmap/implementers-guide/src/node/approval/approval-distribution.md index ce71de6f76b8f8550e815849ba80002f890a9b85..c987b7fe5beaa366c23c2fc58a179a916bbb8a21 100644 --- a/polkadot/roadmap/implementers-guide/src/node/approval/approval-distribution.md +++ b/polkadot/roadmap/implementers-guide/src/node/approval/approval-distribution.md @@ -101,7 +101,7 @@ struct State { } enum MessageFingerprint { - Assigment(Hash, u32, ValidatorIndex), + Assignment(Hash, u32, ValidatorIndex), Approval(Hash, u32, ValidatorIndex), } @@ -203,7 +203,7 @@ For all peers: * Compute `view_intersection` as the intersection of the peer's view blocks with the hashes of the new blocks. * Invoke `unify_with_peer(peer, view_intersection)`. -#### `ApprovalDistributionMessage::DistributeAsignment` +#### `ApprovalDistributionMessage::DistributeAssignment` Call `import_and_circulate_assignment` with `MessageSource::Local`. diff --git a/polkadot/roadmap/implementers-guide/src/node/availability/availability-recovery.md b/polkadot/roadmap/implementers-guide/src/node/availability/availability-recovery.md index e3bb14db3a55499dfc1546494c8e83d5e6cb6ed7..c57c4589244e79f6cd54a87f823abc466ed8eb43 100644 --- a/polkadot/roadmap/implementers-guide/src/node/availability/availability-recovery.md +++ b/polkadot/roadmap/implementers-guide/src/node/availability/availability-recovery.md @@ -115,7 +115,7 @@ On `Conclude`, shut down the subsystem. Launch the source as a background task running `run(recovery_task)`. -#### `run(recovery_task) -> Result` +#### `run(recovery_task) -> Result` ```rust // How many parallel requests to have going at once. diff --git a/polkadot/roadmap/implementers-guide/src/node/backing/prospective-parachains.md b/polkadot/roadmap/implementers-guide/src/node/backing/prospective-parachains.md index 286aeddb986d3db3c7077d8d6227ebcf979073cb..8f00ff084941cc260dea6a9e76c0ff30d3770caf 100644 --- a/polkadot/roadmap/implementers-guide/src/node/backing/prospective-parachains.md +++ b/polkadot/roadmap/implementers-guide/src/node/backing/prospective-parachains.md @@ -92,9 +92,10 @@ prospective validation data. This is unlikely to change. been backed. - Sent by the Backing Subsystem after it successfully imports a statement giving a candidate the necessary quorum of backing votes. -- `ProspectiveParachainsMessage::GetBackableCandidate` - - Get a backable candidate hash along with its relay parent for a given parachain, - under a given relay-parent (leaf) hash, which is a descendant of given candidate hashes. +- `ProspectiveParachainsMessage::GetBackableCandidates` + - Get the requested number of backable candidate hashes along with their relay parent for a given + parachain,under a given relay-parent (leaf) hash, which are descendants of given candidate + hashes. - Sent by the Provisioner when requesting backable candidates, when selecting candidates for a given relay-parent. - `ProspectiveParachainsMessage::GetHypotheticalFrontier` diff --git a/polkadot/roadmap/implementers-guide/src/node/disputes/dispute-coordinator.md b/polkadot/roadmap/implementers-guide/src/node/disputes/dispute-coordinator.md index e0738e219d1b6f02e20d5bd360b9ed9f72b3cbd7..90b29249f3e5bdf2170d0f56e95e99db1cfd1b83 100644 --- a/polkadot/roadmap/implementers-guide/src/node/disputes/dispute-coordinator.md +++ b/polkadot/roadmap/implementers-guide/src/node/disputes/dispute-coordinator.md @@ -76,7 +76,7 @@ dispute is raised reconsider their vote and send an explicit invalid vote. If th recorded, then they could avoid a slash. This is not a problem for our basic security assumptions: The backers are the ones to be supposed to have skin in the -game, so we are not too woried about colluding approval voters getting away slash free as the gambler's ruin property is +game, so we are not too worried about colluding approval voters getting away slash free as the gambler's ruin property is maintained anyway. There is however a separate problem, from colluding approval-voters, that is "lazy" approval voters. If it were easy and reliable for approval-voters to reconsider their vote, in case of an actual dispute, then they don't have a direct incentive (apart from playing a part in securing the network) to properly run the validation function at @@ -331,13 +331,13 @@ off-chain. The reason for this is a dispute can be raised for a candidate in a p validator that is going to be slashed for it might not even be in the current active set. That means it can't be disabled on-chain. We need a way to prevent someone from disputing all valid candidates in the previous era. We do this by keeping track of the validators who lost a dispute in the past few sessions and use that list in addition to the -on-chain disabled validators state. In addition to past session misbehavior, this also heps in case a slash is delayed. +on-chain disabled validators state. In addition to past session misbehavior, this also helps in case a slash is delayed. When we receive a dispute statements set, we do the following: 1. Take the on-chain state of disabled validators at the relay parent block. 1. Take a list of those who lost a dispute in that session in the order that prioritizes the biggest and newest offence. 1. Combine the two lists and take the first byzantine threshold validators from it. -1. If the dispute is unconfimed, check if all votes against the candidate are from disabled validators. +1. If the dispute is unconfirmed, check if all votes against the candidate are from disabled validators. If so, we don't participate in the dispute, but record the votes. ### Backing Votes @@ -591,7 +591,7 @@ Initiates processing via the `Participation` module and updates the internal sta ### On `MuxedMessage::Participation` -This message is sent from `Participatuion` module and indicates a processed dispute participation. It's the result of +This message is sent from `Participation` module and indicates a processed dispute participation. It's the result of the processing job initiated with `OverseerSignal::ActiveLeaves`. The subsystem issues a `DisputeMessage` with the result. diff --git a/polkadot/roadmap/implementers-guide/src/node/overseer.md b/polkadot/roadmap/implementers-guide/src/node/overseer.md index 53a1153081013b684d0cab419fb3eaa0be5a15c1..960539b84998455ab52350a78f432dd9d399ab89 100644 --- a/polkadot/roadmap/implementers-guide/src/node/overseer.md +++ b/polkadot/roadmap/implementers-guide/src/node/overseer.md @@ -108,11 +108,11 @@ way that the receiving subsystem can further address the communication to one of This communication prevents a certain class of race conditions. When the Overseer determines that it is time for subsystems to begin working on top of a particular relay-parent, it will dispatch a `ActiveLeavesUpdate` message to all subsystems to do so, and those messages will be handled asynchronously by those subsystems. Some subsystems will receive -those messsages before others, and it is important that a message sent by subsystem A after receiving +those messages before others, and it is important that a message sent by subsystem A after receiving `ActiveLeavesUpdate` message will arrive at subsystem B after its `ActiveLeavesUpdate` message. If subsystem A maintained an independent channel with subsystem B to communicate, it would be possible for subsystem B to handle the side message before the `ActiveLeavesUpdate` message, but it wouldn't have any logical course of action to take with the -side message - leading to it being discarded or improperly handled. Well-architectured state machines should have a +side message - leading to it being discarded or improperly handled. Well-architected state machines should have a single source of inputs, so that is what we do here. One exception is reasonable to make for responses to requests. A request should be made via the overseer in order to diff --git a/polkadot/roadmap/implementers-guide/src/node/utility/provisioner.md b/polkadot/roadmap/implementers-guide/src/node/utility/provisioner.md index 0b4fe6a458732de10c2dcd23466ba30f9a46924c..b017259da8c0863e47deb87e916076d20ed95996 100644 --- a/polkadot/roadmap/implementers-guide/src/node/utility/provisioner.md +++ b/polkadot/roadmap/implementers-guide/src/node/utility/provisioner.md @@ -187,16 +187,16 @@ this process is a vector of `CandidateHash`s, sorted in order of their core inde #### Required Path -Required path is a parameter for `ProspectiveParachainsMessage::GetBackableCandidate`, which the provisioner sends in +Required path is a parameter for `ProspectiveParachainsMessage::GetBackableCandidates`, which the provisioner sends in candidate selection. -An empty required path indicates that the requested candidate should be a direct child of the most recently included +An empty required path indicates that the requested candidate chain should start with the most recently included parablock for the given `para_id` as of the given relay parent. In contrast, a required path with one or more entries prompts [prospective parachains](../backing/prospective-parachains.md) to step forward through its fragment tree for the given `para_id` and -relay parent until the desired parablock is reached. We then select a direct child of that parablock to pass to the -provisioner. +relay parent until the desired parablock is reached. We then select the chain starting with the direct child of that +parablock to pass to the provisioner. The parablocks making up a required path do not need to have been previously seen as included in relay chain blocks. Thus the ability to provision backable candidates based on a required path effectively decouples backing from inclusion. diff --git a/polkadot/roadmap/implementers-guide/src/node/utility/pvf-host-and-workers.md b/polkadot/roadmap/implementers-guide/src/node/utility/pvf-host-and-workers.md index e0984bd58d1dd8ea22b145a15b4a3bab8779de80..39a317a07c847aa734e78f85de524f5541c8ddf6 100644 --- a/polkadot/roadmap/implementers-guide/src/node/utility/pvf-host-and-workers.md +++ b/polkadot/roadmap/implementers-guide/src/node/utility/pvf-host-and-workers.md @@ -125,6 +125,14 @@ execution request: reason, which may or may not be independent of the candidate or PVF. 5. **Internal errors:** See "Internal Errors" section. In this case, after the retry we abstain from voting. +6. **RuntimeConstruction** error. The precheck handles a general case of a wrong + artifact but doesn't guarantee its consistency between the preparation and + the execution. If something happened with the artifact between + the preparation of the artifact and its execution (e.g. the artifact was + corrupted on disk or a dirty node upgrade happened when the prepare worker + has a wasmtime version different from the execute worker's wasmtime version). + We treat such an error as possibly transient due to local issues and retry + one time. ### Preparation timeouts diff --git a/polkadot/roadmap/implementers-guide/src/node/utility/pvf-prechecker.md b/polkadot/roadmap/implementers-guide/src/node/utility/pvf-prechecker.md index 7f6fef7ddf631f10eadd7c1cc5f4d7d4b7f9cd04..f8e88a67fcb813cae22fc43abd273f020b91620f 100644 --- a/polkadot/roadmap/implementers-guide/src/node/utility/pvf-prechecker.md +++ b/polkadot/roadmap/implementers-guide/src/node/utility/pvf-prechecker.md @@ -8,7 +8,7 @@ pre-checking. Head over to [overview] for the PVF pre-checking process overview. There is no dedicated input mechanism for PVF pre-checker. Instead, PVF pre-checker looks on the `ActiveLeavesUpdate` event stream for work. -This subsytem does not produce any output messages either. The subsystem will, however, send messages to the +This subsystem does not produce any output messages either. The subsystem will, however, send messages to the [Runtime API] subsystem to query for the pending PVFs and to submit votes. In addition to that, it will also communicate with [Candidate Validation] Subsystem to request PVF pre-check. diff --git a/polkadot/roadmap/implementers-guide/src/runtime/README.md b/polkadot/roadmap/implementers-guide/src/runtime/README.md index 459f0e6b69d98bddb19a9ccea85830ed8dc01150..10eedb49ec38233af5b17992134f1f14dfcbaa74 100644 --- a/polkadot/roadmap/implementers-guide/src/runtime/README.md +++ b/polkadot/roadmap/implementers-guide/src/runtime/README.md @@ -89,7 +89,7 @@ struct SessionChangeNotification { prev_config: HostConfiguration, // The configuration after handling the session change. new_config: HostConfiguration, - // A secure randomn seed for the session, gathered from BABE. + // A secure random seed for the session, gathered from BABE. random_seed: [u8; 32], // The session index of the beginning session. session_index: SessionIndex, diff --git a/polkadot/roadmap/implementers-guide/src/runtime/disputes.md b/polkadot/roadmap/implementers-guide/src/runtime/disputes.md index 688ff7f1b330033ed46e54c069c673c9922c29cf..f2b83aecb6483dcae738e448fbcbd89f5cf6a886 100644 --- a/polkadot/roadmap/implementers-guide/src/runtime/disputes.md +++ b/polkadot/roadmap/implementers-guide/src/runtime/disputes.md @@ -121,9 +121,6 @@ This is currently a `no op`. * `is_frozen()`: Load the value of `Frozen` from storage. Return true if `Some` and false if `None`. -* `last_valid_block()`: Load the value of `Frozen` from storage and return. None indicates that all blocks in the chain - are potentially valid. - * `revert_and_freeze(BlockNumber)`: 1. If `is_frozen()` return. 1. Set `Frozen` to `Some(BlockNumber)` to indicate a rollback to the block number. diff --git a/polkadot/roadmap/implementers-guide/src/runtime/hrmp.md b/polkadot/roadmap/implementers-guide/src/runtime/hrmp.md index 69d33ca8670db942ecd8f5cb564f8d973ef6e47b..ed765634b592cdabf0b1f971ce34e7edbc9f069c 100644 --- a/polkadot/roadmap/implementers-guide/src/runtime/hrmp.md +++ b/polkadot/roadmap/implementers-guide/src/runtime/hrmp.md @@ -62,7 +62,7 @@ HRMP related storage layout HrmpOpenChannelRequests: map HrmpChannelId => Option; HrmpOpenChannelRequestsList: Vec; -/// This mapping tracks how many open channel requests are inititated by a given sender para. +/// This mapping tracks how many open channel requests are initiated by a given sender para. /// Invariant: `HrmpOpenChannelRequests` should contain the same number of items that has `(X, _)` /// as the number of `HrmpOpenChannelRequestCount` for `X`. HrmpOpenChannelRequestCount: map ParaId => u32; @@ -233,7 +233,7 @@ executed the message. 1. Send a downward message to the opposite party notifying about the channel closing. * The DM is sent using `queue_downward_message`. * The DM is represented by the `HrmpChannelClosing` XCM message with: - * `initator` is set to `origin`, + * `initiator` is set to `origin`, * `sender` is set to `ch.sender`, * `recipient` is set to `ch.recipient`. * The opposite party is `ch.sender` if `origin` is `ch.recipient` and `ch.recipient` if `origin` is `ch.sender`. diff --git a/polkadot/roadmap/implementers-guide/src/runtime/inclusion.md b/polkadot/roadmap/implementers-guide/src/runtime/inclusion.md index f6a32a01d5025e2fb824b94f804fd1e89fd0392b..fd74f33253b72bd629313b5763e2cbbed75a6314 100644 --- a/polkadot/roadmap/implementers-guide/src/runtime/inclusion.md +++ b/polkadot/roadmap/implementers-guide/src/runtime/inclusion.md @@ -147,15 +147,16 @@ All failed checks should lead to an unrecoverable error making the block invalid // return a vector of cleaned-up core IDs. } ``` -* `force_enact(ParaId)`: Forcibly enact the candidate with the given ID as though it had been deemed available by - bitfields. Is a no-op if there is no candidate pending availability for this para-id. This should generally not be - used but it is useful during execution of Runtime APIs, where the changes to the state are expected to be discarded - directly after. +* `force_enact(ParaId)`: Forcibly enact the pending candidates of the given paraid as though they had been deemed + available by bitfields. Is a no-op if there is no candidate pending availability for this para-id. + If there are multiple candidates pending availability for this para-id, it will enact all of + them. This should generally not be used but it is useful during execution of Runtime APIs, + where the changes to the state are expected to be discarded directly after. * `candidate_pending_availability(ParaId) -> Option`: returns the `CommittedCandidateReceipt` pending availability for the para provided, if any. * `pending_availability(ParaId) -> Option`: returns the metadata around the candidate pending availability for the para, if any. -* `collect_disputed(disputed: Vec) -> Vec`: Sweeps through all paras pending availability. If +* `free_disputed(disputed: Vec) -> Vec`: Sweeps through all paras pending availability. If the candidate hash is one of the disputed candidates, then clean up the corresponding storage for that candidate and the commitments. Return a vector of cleaned-up core IDs. diff --git a/polkadot/roadmap/implementers-guide/src/runtime/parainherent.md b/polkadot/roadmap/implementers-guide/src/runtime/parainherent.md index 5419ddae83d4a58222bc405e41a58ca0fd8315f3..7972c706b9ee1ebce2132a49ccf62a194d6c1e58 100644 --- a/polkadot/roadmap/implementers-guide/src/runtime/parainherent.md +++ b/polkadot/roadmap/implementers-guide/src/runtime/parainherent.md @@ -17,7 +17,7 @@ There are a couple of important notes to the operations in this inherent as they this fork. 1. When disputes are initiated, we remove the block from pending availability. This allows us to roll back chains to the block before blocks are included as opposed to backing. It's important to do this before processing bitfields. -1. `Inclusion::collect_disputed` is kind of expensive so it's important to gate this on whether there are actually any +1. `Inclusion::free_disputed` is kind of expensive so it's important to gate this on whether there are actually any new disputes. Which should be never. 1. And we don't accept parablocks that have open disputes or disputes that have concluded against the candidate. It's important to import dispute statements before backing, but this is already the case as disputes are imported before @@ -88,7 +88,7 @@ to `sanitize_bitfields` function for implementation details. Backed candidates sanitization removes malformed ones, candidates which have got concluded invalid disputes against them or candidates produced by unassigned cores. Furthermore any backing votes from disabled validators for a candidate are dropped. This is part of the validator disabling strategy. After filtering the statements from disabled validators a -backed candidate may end up with votes count less than `minimum_backing_votes` (a parameter from `HostConfiguiration`). +backed candidate may end up with votes count less than `minimum_backing_votes` (a parameter from `HostConfiguration`). In this case the whole candidate is dropped otherwise it will be rejected by `process_candidates` from pallet inclusion. All checks related to backed candidates are implemented in `sanitize_backed_candidates` and `filter_backed_statements_from_disabled_validators`. diff --git a/polkadot/roadmap/implementers-guide/src/runtime/scheduler.md b/polkadot/roadmap/implementers-guide/src/runtime/scheduler.md index 32a7fe652dbcb0ee60aa7d828d3a8226dcb80730..083ed2b6feac9ed6d27c44bc2267744dd49fffd1 100644 --- a/polkadot/roadmap/implementers-guide/src/runtime/scheduler.md +++ b/polkadot/roadmap/implementers-guide/src/runtime/scheduler.md @@ -229,7 +229,7 @@ Actions: [`HostConfiguration`](../types/runtime.md#host-configuration)) 1. Fetch `Shared::ActiveValidators` as AV. 1. Determine the number of cores & validator groups as `n_cores`. This is the maximum of - 1. `Paras::parachains().len() + configuration.parathread_cores` + 1. `paras::Parachains::::get().len() + configuration.parathread_cores` 1. `n_validators / max_validators_per_core` if `configuration.max_validators_per_core` is `Some` and non-zero. 1. Resize `AvailabilityCores` to have length `n_cores` with all `None` entries. 1. Compute new validator groups by shuffling using a secure randomness beacon @@ -261,7 +261,7 @@ No finalization routine runs for this module. - Fails if any on-demand claim on the same parachain is currently indexed. - Fails if the queue length is >= `config.scheduling_lookahead * config.parathread_cores`. - The core used for the on-demand claim is the `next_core` field of the `ParathreadQueue` (on-demand queue) and adding - `Paras::parachains().len()` to it. + `paras::Parachains::::get().len()` to it. - `next_core` is then updated by adding 1 and taking it modulo `config.parathread_cores`. - The claim is then added to the claim index. - `free_cores(Vec<(CoreIndex, FreedReason)>)`: indicate previously-occupied cores which are to be considered returned @@ -285,7 +285,6 @@ No finalization routine runs for this module. - This clears them from `Scheduled` and marks each corresponding `core` in the `AvailabilityCores` as occupied. - Since both the availability cores and the newly-occupied cores lists are sorted ascending, this method can be implemented efficiently. -- `core_para(CoreIndex) -> ParaId`: return the currently-scheduled or occupied ParaId for the given core. - `group_validators(GroupIndex) -> Option>`: return all validators in a given group, if the group index is valid for this session. - `availability_timeout_predicate() -> Option bool>`: returns an optional predicate diff --git a/polkadot/roadmap/implementers-guide/src/runtime/session_info.md b/polkadot/roadmap/implementers-guide/src/runtime/session_info.md index 0442ee57505d0823b98b54bed79596e09a16f641..fa7f55c4f0b41c42270fc4c5f7d6c826f903f20e 100644 --- a/polkadot/roadmap/implementers-guide/src/runtime/session_info.md +++ b/polkadot/roadmap/implementers-guide/src/runtime/session_info.md @@ -76,6 +76,6 @@ Sessions: map SessionIndex => Option, ## Routines -* `earliest_stored_session() -> SessionIndex`: Yields the earliest session for which we have information stored. -* `session_info(session: SessionIndex) -> Option`: Yields the session info for the given session, if +* `EarliestStoredSession::::get() -> SessionIndex`: Yields the earliest session for which we have information stored. +* `Sessions::::get(session: SessionIndex) -> Option`: Yields the session info for the given session, if stored. diff --git a/polkadot/roadmap/implementers-guide/src/types/README.md b/polkadot/roadmap/implementers-guide/src/types/README.md index 87092bf3a005353b09d375b89f599c2918295ef5..5fd3050f94906f04e876e9018698edb1a5218e2f 100644 --- a/polkadot/roadmap/implementers-guide/src/types/README.md +++ b/polkadot/roadmap/implementers-guide/src/types/README.md @@ -55,17 +55,6 @@ digraph { CandidateCommitmentsHash [label = "Hash", shape="doublecircle", fill="gray90"] CandidateCommitmentsHash -> CandidateCommitments:name - FullCandidateReceipt [label = < - - - - -
FullCandidateReceipt<H = Hash, N = BlockNumber>
innerCandidateReceipt<H>
validation_dataValidationData<N>
- >] - - FullCandidateReceipt:inner -> CandidateReceipt:name - FullCandidateReceipt:validation_data -> ValidationData:name - CommittedCandidateReceipt [label = < diff --git a/polkadot/roadmap/implementers-guide/src/types/approval.md b/polkadot/roadmap/implementers-guide/src/types/approval.md index c19ffa53762a5fc9e2ac0766604efc22cf20ef4d..29d973ca0ab8c3717bfbaa1077bd5f9873cf7a94 100644 --- a/polkadot/roadmap/implementers-guide/src/types/approval.md +++ b/polkadot/roadmap/implementers-guide/src/types/approval.md @@ -39,7 +39,7 @@ enum AssignmentCertKindV2 { /// The core index chosen in this cert. core_index: CoreIndex, }, - /// Deprectated assignment. Soon to be removed. + /// Deprecated assignment. Soon to be removed. /// /// An assignment story based on the VRF that authorized the relay-chain block where the /// candidate was included combined with a sample number. @@ -117,7 +117,7 @@ struct IndirectSignedApprovalVote { ## `CheckedAssignmentCert` An assignment cert which has checked both the VRF and the validity of the implied assignment according to the selection -criteria rules of the protocol. This type should be declared in such a way as to be instantiatable only when the checks +criteria rules of the protocol. This type should be declared in such a way as to be instantiable only when the checks have actually been done. Fields should be accessible via getters, not direct struct access. ```rust diff --git a/polkadot/roadmap/implementers-guide/src/types/candidate.md b/polkadot/roadmap/implementers-guide/src/types/candidate.md index 00176229e5a4356a9f88ae91c16eb46617b47216..399d7854ac4a057f49435702adb1a815c960c593 100644 --- a/polkadot/roadmap/implementers-guide/src/types/candidate.md +++ b/polkadot/roadmap/implementers-guide/src/types/candidate.md @@ -20,12 +20,8 @@ struct ParaId(u32); ## Candidate Receipt -Much info in a [`FullCandidateReceipt`](#full-candidate-receipt) is duplicated from the relay-chain state. When the -corresponding relay-chain state is considered widely available, the Candidate Receipt should be favored over the -`FullCandidateReceipt`. - -Examples of situations where the state is readily available includes within the scope of work done by subsystems working -on a given relay-parent, or within the logic of the runtime importing a backed candidate. +Compact representation of the result of a validation. This is what validators +receive from collators, together with the PoV. ```rust /// A candidate-receipt. @@ -37,24 +33,6 @@ struct CandidateReceipt { } ``` -## Full Candidate Receipt - -This is the full receipt type. The `PersistedValidationData` are technically redundant with the `inner.relay_parent`, -which uniquely describes the block in the blockchain from whose state these values are derived. The -[`CandidateReceipt`](#candidate-receipt) variant is often used instead for this reason. - -However, the Full Candidate Receipt type is useful as a means of avoiding the implicit dependency on availability of old -blockchain state. In situations such as availability and approval, having the full description of the candidate within a -self-contained struct is convenient. - -```rust -/// All data pertaining to the execution of a para candidate. -struct FullCandidateReceipt { - inner: CandidateReceipt, - validation_data: PeristedValidationData, -} -``` - ## Committed Candidate Receipt This is a variant of the candidate receipt which includes the commitments of the candidate receipt alongside the diff --git a/polkadot/roadmap/implementers-guide/src/types/disputes.md b/polkadot/roadmap/implementers-guide/src/types/disputes.md index c49e0fea262510ef2e1585f9aa8433dc02883b50..ac09084c48a2f3170939387473ed4c772ee1dcf1 100644 --- a/polkadot/roadmap/implementers-guide/src/types/disputes.md +++ b/polkadot/roadmap/implementers-guide/src/types/disputes.md @@ -82,7 +82,7 @@ struct DisputeState { struct ScrapedOnChainVotes { /// The session index at which the block was included. session: SessionIndex, - /// The backing and seconding validity attestations for all candidates, provigind the full candidate receipt. + /// The backing and seconding validity attestations for all candidates, providing the full candidate receipt. backing_validators_per_candidate: Vec<(CandidateReceipt, Vec<(ValidatorIndex, ValidityAttestation)>)> /// Set of concluded disputes that were recorded /// on chain within the inherent. diff --git a/polkadot/roadmap/implementers-guide/src/types/overseer-protocol.md b/polkadot/roadmap/implementers-guide/src/types/overseer-protocol.md index 54cdc2edd12d2537c1b80d9f2e973562375fc150..e011afb97089aaf59d685b8d4bf9998d21390146 100644 --- a/polkadot/roadmap/implementers-guide/src/types/overseer-protocol.md +++ b/polkadot/roadmap/implementers-guide/src/types/overseer-protocol.md @@ -22,7 +22,7 @@ All subsystems have their own message types; all of them need to be able to list are currently two proposals for how to handle that with unified communication channels: 1. Retaining the `OverseerSignal` definition above, add `enum FromOrchestra {Signal(OverseerSignal), Message(T)}`. -1. Add a generic varint to `OverseerSignal`: `Message(T)`. +1. Add a generic variant to `OverseerSignal`: `Message(T)`. Either way, there will be some top-level type encapsulating messages from the overseer to each subsystem. @@ -340,9 +340,15 @@ enum BitfieldSigningMessage { } ```rust enum CandidateBackingMessage { /// Requests a set of backable candidates attested by the subsystem. - /// - /// Each pair is (candidate_hash, candidate_relay_parent). - GetBackedCandidates(Vec<(CandidateHash, Hash)>, oneshot::Sender>), + /// The order of candidates of the same para must be preserved in the response. + /// If a backed candidate of a para cannot be retrieved, the response should not contain any + /// candidates of the same para that follow it in the input vector. In other words, assuming + /// candidates are supplied in dependency order, we must ensure that this dependency order is + /// preserved. + GetBackedCandidates( + HashMap>, + oneshot::Sender>>, + ), /// Note that the Candidate Backing subsystem should second the given candidate in the context of the /// given relay-parent (ref. by hash). This candidate must be validated using the provided PoV. /// The PoV is expected to match the `pov_hash` in the descriptor. diff --git a/polkadot/roadmap/implementers-guide/src/types/runtime.md b/polkadot/roadmap/implementers-guide/src/types/runtime.md index 4b97409f8df3e4f3581161ef47713bfdfbcb9654..1dfabd96db7cdb929c416201eeeb233af11f5dbb 100644 --- a/polkadot/roadmap/implementers-guide/src/types/runtime.md +++ b/polkadot/roadmap/implementers-guide/src/types/runtime.md @@ -4,106 +4,24 @@ Types used within the runtime exclusively and pervasively. ## Host Configuration -The internal-to-runtime configuration of the parachain host. This is expected to be altered only by governance procedures. - -```rust -struct HostConfiguration { - /// The minimum period, in blocks, between which parachains can update their validation code. - pub validation_upgrade_cooldown: BlockNumber, - /// The delay, in blocks, before a validation upgrade is applied. - pub validation_upgrade_delay: BlockNumber, - /// How long to keep code on-chain, in blocks. This should be sufficiently long that disputes - /// have concluded. - pub code_retention_period: BlockNumber, - /// The maximum validation code size, in bytes. - pub max_code_size: u32, - /// The maximum head-data size, in bytes. - pub max_head_data_size: u32, - /// The amount of availability cores to dedicate to parathreads (on-demand parachains). - pub parathread_cores: u32, - /// The number of retries that a parathread (on-demand parachain) author has to submit their block. - pub parathread_retries: u32, - /// How often parachain groups should be rotated across parachains. - pub group_rotation_frequency: BlockNumber, - /// The availability period, in blocks, for parachains. This is the amount of blocks - /// after inclusion that validators have to make the block available and signal its availability to - /// the chain. Must be at least 1. - pub chain_availability_period: BlockNumber, - /// The availability period, in blocks, for parathreads (on-demand parachains). Same as the `chain_availability_period`, - /// but a differing timeout due to differing requirements. Must be at least 1. - pub thread_availability_period: BlockNumber, - /// The amount of blocks ahead to schedule on-demand parachains. - pub scheduling_lookahead: u32, - /// The maximum number of validators to have per core. `None` means no maximum. - pub max_validators_per_core: Option, - /// The maximum number of validators to use for parachains, in total. `None` means no maximum. - pub max_validators: Option, - /// The amount of sessions to keep for disputes. - pub dispute_period: SessionIndex, - /// How long after dispute conclusion to accept statements. - pub dispute_post_conclusion_acceptance_period: BlockNumber, - /// The maximum number of dispute spam slots - pub dispute_max_spam_slots: u32, - /// The amount of consensus slots that must pass between submitting an assignment and - /// submitting an approval vote before a validator is considered a no-show. - /// Must be at least 1. - pub no_show_slots: u32, - /// The number of delay tranches in total. - pub n_delay_tranches: u32, - /// The width of the zeroth delay tranche for approval assignments. This many delay tranches - /// beyond 0 are all consolidated to form a wide 0 tranche. - pub zeroth_delay_tranche_width: u32, - /// The number of validators needed to approve a block. - pub needed_approvals: u32, - /// The number of samples to use in `RelayVRFModulo` or `RelayVRFModuloCompact` approval assignment criterions. - pub relay_vrf_modulo_samples: u32, - /// Total number of individual messages allowed in the parachain -> relay-chain message queue. - pub max_upward_queue_count: u32, - /// Total size of messages allowed in the parachain -> relay-chain message queue before which - /// no further messages may be added to it. If it exceeds this then the queue may contain only - /// a single message. - pub max_upward_queue_size: u32, - /// The maximum size of an upward message that can be sent by a candidate. - /// - /// This parameter affects the upper bound of size of `CandidateCommitments`. - pub max_upward_message_size: u32, - /// The maximum number of messages that a candidate can contain. - /// - /// This parameter affects the upper bound of size of `CandidateCommitments`. - pub max_upward_message_num_per_candidate: u32, - /// The maximum size of a message that can be put in a downward message queue. - /// - /// Since we require receiving at least one DMP message the obvious upper bound of the size is - /// the PoV size. Of course, there is a lot of other different things that a parachain may - /// decide to do with its PoV so this value in practice will be picked as a fraction of the PoV - /// size. - pub max_downward_message_size: u32, - /// The deposit that the sender should provide for opening an HRMP channel. - pub hrmp_sender_deposit: u32, - /// The deposit that the recipient should provide for accepting opening an HRMP channel. - pub hrmp_recipient_deposit: u32, - /// The maximum number of messages allowed in an HRMP channel at once. - pub hrmp_channel_max_capacity: u32, - /// The maximum total size of messages in bytes allowed in an HRMP channel at once. - pub hrmp_channel_max_total_size: u32, - /// The maximum number of inbound HRMP channels a parachain is allowed to accept. - pub hrmp_max_parachain_inbound_channels: u32, - /// The maximum number of inbound HRMP channels a parathread (on-demand parachain) is allowed to accept. - pub hrmp_max_parathread_inbound_channels: u32, - /// The maximum size of a message that could ever be put into an HRMP channel. - /// - /// This parameter affects the upper bound of size of `CandidateCommitments`. - pub hrmp_channel_max_message_size: u32, - /// The maximum number of outbound HRMP channels a parachain is allowed to open. - pub hrmp_max_parachain_outbound_channels: u32, - /// The maximum number of outbound HRMP channels a parathread (on-demand parachain) is allowed to open. - pub hrmp_max_parathread_outbound_channels: u32, - /// The maximum number of outbound HRMP messages can be sent by a candidate. - /// - /// This parameter affects the upper bound of size of `CandidateCommitments`. - pub hrmp_max_message_num_per_candidate: u32, -} -``` +The internal-to-runtime configuration of the parachain host is kept in `struct HostConfiguration`. This is expected to +be altered only by governance procedures or via migrations from the Polkadot-SDK codebase. The latest definition of +`HostConfiguration` can be found in the project repo +[here](https://github.com/paritytech/polkadot-sdk/blob/master/polkadot/runtime/parachains/src/configuration.rs). Each +parameter has got a doc comment so for any details please refer to the code. + +Some related parameters in `HostConfiguration` are grouped together so that they can be managed easily. These are: +* `async_backing_params` in `struct AsyncBackingParams` +* `executor_params` in `struct ExecutorParams` +* `approval_voting_params` in `struct ApprovalVotingParams` +* `scheduler_params` in `struct SchedulerParams` + +Check the definitions of these structs for further details. + +### Configuration migrations +Modifying `HostConfiguration` requires a storage migration. These migrations are located in the +[`migrations`](https://github.com/paritytech/polkadot-sdk/blob/master/polkadot/runtime/parachains/src/configuration.rs) +subfolder of Polkadot-SDK repo. ## ParaInherentData diff --git a/polkadot/roadmap/phase-1.toml b/polkadot/roadmap/phase-1.toml index 3a5f0d752debee41c51a2124f8e91f3e03dc9d68..9b9374d234bdc735a601ad93f94899ab086c2c06 100644 --- a/polkadot/roadmap/phase-1.toml +++ b/polkadot/roadmap/phase-1.toml @@ -34,7 +34,7 @@ requires = ["two-phase-inclusion"] items = [ { label = "Submit secondary checks to runtime", port = "submitsecondary", requires = ["secondary-checking"] }, { label = "Track all candidates within the slash period as well as their session" }, - { label = "Track reports and attestatations for candidates" }, + { label = "Track reports and attestations for candidates" }, ] [[group]] diff --git a/polkadot/rpc/Cargo.toml b/polkadot/rpc/Cargo.toml index 98ce2e482ce1a381ec0df08a68ab124781294387..5af5e63b175380f7e695deb973ea48df52c326e4 100644 --- a/polkadot/rpc/Cargo.toml +++ b/polkadot/rpc/Cargo.toml @@ -10,7 +10,7 @@ description = "Polkadot specific RPC functionality." workspace = true [dependencies] -jsonrpsee = { version = "0.20.3", features = ["server"] } +jsonrpsee = { version = "0.22", features = ["server"] } polkadot-primitives = { path = "../primitives" } sc-client-api = { path = "../../substrate/client/api" } sp-blockchain = { path = "../../substrate/primitives/blockchain" } diff --git a/polkadot/runtime/common/Cargo.toml b/polkadot/runtime/common/Cargo.toml index acbc845c41a3cbc6077bd0d4c743066369db6885..4219a7e7b0dcb57c50a5e709d0695dfa723b582a 100644 --- a/polkadot/runtime/common/Cargo.toml +++ b/polkadot/runtime/common/Cargo.toml @@ -13,11 +13,11 @@ workspace = true impl-trait-for-tuples = "0.2.2" bitvec = { version = "1.0.0", default-features = false, features = ["alloc"] } parity-scale-codec = { version = "3.6.1", default-features = false, features = ["derive"] } -log = { version = "0.4.17", default-features = false } +log = { workspace = true } rustc-hex = { version = "2.1.0", default-features = false } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.195", default-features = false, features = ["alloc"] } -serde_derive = { version = "1.0.117" } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +serde = { features = ["alloc"], workspace = true } +serde_derive = { workspace = true } static_assertions = "1.1.0" sp-api = { path = "../../../substrate/primitives/api", default-features = false } @@ -58,8 +58,6 @@ runtime-parachains = { package = "polkadot-runtime-parachains", path = "../parac slot-range-helper = { path = "slot_range_helper", default-features = false } xcm = { package = "staging-xcm", path = "../../xcm", default-features = false } xcm-executor = { package = "staging-xcm-executor", path = "../../xcm/xcm-executor", default-features = false, optional = true } - -pallet-xcm-benchmarks = { path = "../../xcm/pallet-xcm-benchmarks", default-features = false, optional = true } xcm-builder = { package = "staging-xcm-builder", path = "../../xcm/xcm-builder", default-features = false } [dev-dependencies] @@ -69,7 +67,7 @@ pallet-babe = { path = "../../../substrate/frame/babe" } pallet-treasury = { path = "../../../substrate/frame/treasury" } sp-keystore = { path = "../../../substrate/primitives/keystore" } sp-keyring = { path = "../../../substrate/primitives/keyring" } -serde_json = "1.0.111" +serde_json = { workspace = true, default-features = true } libsecp256k1 = "0.7.0" test-helpers = { package = "polkadot-primitives-test-helpers", path = "../../primitives/test-helpers" } @@ -99,7 +97,6 @@ std = [ "pallet-transaction-payment/std", "pallet-treasury/std", "pallet-vesting/std", - "pallet-xcm-benchmarks/std", "parity-scale-codec/std", "primitives/std", "runtime-parachains/std", @@ -137,7 +134,6 @@ runtime-benchmarks = [ "pallet-timestamp/runtime-benchmarks", "pallet-treasury/runtime-benchmarks", "pallet-vesting/runtime-benchmarks", - "pallet-xcm-benchmarks/runtime-benchmarks", "primitives/runtime-benchmarks", "runtime-parachains/runtime-benchmarks", "sp-runtime/runtime-benchmarks", diff --git a/polkadot/runtime/common/src/assigned_slots/migration.rs b/polkadot/runtime/common/src/assigned_slots/migration.rs index ba3108c0aa38b9b9a2dabba0559d74ec3c97d0ed..b52509bbdf498a7bc9b03be6b4432326d894211b 100644 --- a/polkadot/runtime/common/src/assigned_slots/migration.rs +++ b/polkadot/runtime/common/src/assigned_slots/migration.rs @@ -15,7 +15,7 @@ // along with Polkadot. If not, see . use super::{Config, MaxPermanentSlots, MaxTemporarySlots, Pallet, LOG_TARGET}; -use frame_support::traits::{Get, GetStorageVersion, OnRuntimeUpgrade}; +use frame_support::traits::{Get, GetStorageVersion, UncheckedOnRuntimeUpgrade}; #[cfg(feature = "try-runtime")] use frame_support::ensure; @@ -23,25 +23,24 @@ use frame_support::ensure; use sp_std::vec::Vec; pub mod v1 { - use super::*; pub struct VersionUncheckedMigrateToV1(sp_std::marker::PhantomData); - impl OnRuntimeUpgrade for VersionUncheckedMigrateToV1 { + impl UncheckedOnRuntimeUpgrade for VersionUncheckedMigrateToV1 { #[cfg(feature = "try-runtime")] fn pre_upgrade() -> Result, sp_runtime::TryRuntimeError> { - let onchain_version = Pallet::::on_chain_storage_version(); - ensure!(onchain_version < 1, "assigned_slots::MigrateToV1 migration can be deleted"); + let on_chain_version = Pallet::::on_chain_storage_version(); + ensure!(on_chain_version < 1, "assigned_slots::MigrateToV1 migration can be deleted"); Ok(Default::default()) } fn on_runtime_upgrade() -> frame_support::weights::Weight { - let onchain_version = Pallet::::on_chain_storage_version(); - if onchain_version < 1 { + let on_chain_version = Pallet::::on_chain_storage_version(); + if on_chain_version < 1 { const MAX_PERMANENT_SLOTS: u32 = 100; const MAX_TEMPORARY_SLOTS: u32 = 100; - >::put(MAX_PERMANENT_SLOTS); - >::put(MAX_TEMPORARY_SLOTS); + MaxPermanentSlots::::put(MAX_PERMANENT_SLOTS); + MaxTemporarySlots::::put(MAX_TEMPORARY_SLOTS); // Return the weight consumed by the migration. T::DbWeight::get().reads_writes(1, 3) } else { @@ -52,10 +51,10 @@ pub mod v1 { #[cfg(feature = "try-runtime")] fn post_upgrade(_state: Vec) -> Result<(), sp_runtime::TryRuntimeError> { - let onchain_version = Pallet::::on_chain_storage_version(); - ensure!(onchain_version == 1, "assigned_slots::MigrateToV1 needs to be run"); - assert_eq!(>::get(), 100); - assert_eq!(>::get(), 100); + let on_chain_version = Pallet::::on_chain_storage_version(); + ensure!(on_chain_version == 1, "assigned_slots::MigrateToV1 needs to be run"); + assert_eq!(MaxPermanentSlots::::get(), 100); + assert_eq!(MaxTemporarySlots::::get(), 100); Ok(()) } } diff --git a/polkadot/runtime/common/src/assigned_slots/mod.rs b/polkadot/runtime/common/src/assigned_slots/mod.rs index 3419e3497f7d446f7bea02bf8134932c0a0cdbf6..9b24b99cfbe2a2f1d06fc842f798a6232077e2fb 100644 --- a/polkadot/runtime/common/src/assigned_slots/mod.rs +++ b/polkadot/runtime/common/src/assigned_slots/mod.rs @@ -107,7 +107,7 @@ type LeasePeriodOf = <::Leaser as Leaser>>::Le pub mod pallet { use super::*; - /// The current storage version. + /// The in-code storage version. const STORAGE_VERSION: StorageVersion = StorageVersion::new(1); #[pallet::pallet] @@ -148,18 +148,15 @@ pub mod pallet { /// Assigned permanent slots, with their start lease period, and duration. #[pallet::storage] - #[pallet::getter(fn permanent_slots)] pub type PermanentSlots = StorageMap<_, Twox64Concat, ParaId, (LeasePeriodOf, LeasePeriodOf), OptionQuery>; /// Number of assigned (and active) permanent slots. #[pallet::storage] - #[pallet::getter(fn permanent_slot_count)] pub type PermanentSlotCount = StorageValue<_, u32, ValueQuery>; /// Assigned temporary slots. #[pallet::storage] - #[pallet::getter(fn temporary_slots)] pub type TemporarySlots = StorageMap< _, Twox64Concat, @@ -170,12 +167,10 @@ pub mod pallet { /// Number of assigned temporary slots. #[pallet::storage] - #[pallet::getter(fn temporary_slot_count)] pub type TemporarySlotCount = StorageValue<_, u32, ValueQuery>; /// Number of active temporary slots in current slot lease period. #[pallet::storage] - #[pallet::getter(fn active_temporary_slot_count)] pub type ActiveTemporarySlotCount = StorageValue<_, u32, ValueQuery>; /// The max number of temporary slots that can be assigned. @@ -197,8 +192,8 @@ pub mod pallet { #[pallet::genesis_build] impl BuildGenesisConfig for GenesisConfig { fn build(&self) { - >::put(&self.max_permanent_slots); - >::put(&self.max_temporary_slots); + MaxPermanentSlots::::put(&self.max_permanent_slots); + MaxTemporarySlots::::put(&self.max_temporary_slots); } } @@ -306,7 +301,7 @@ pub mod pallet { LeasePeriodOf::::from(T::PermanentSlotLeasePeriodLength::get()), ), ); - >::mutate(|count| count.saturating_inc()); + PermanentSlotCount::::mutate(|count| count.saturating_inc()); Self::deposit_event(Event::::PermanentSlotAssigned(id)); Ok(()) @@ -364,7 +359,7 @@ pub mod pallet { }; if lease_period_start == SlotLeasePeriodStart::Current && - Self::active_temporary_slot_count() < T::MaxTemporarySlotPerLeasePeriod::get() + ActiveTemporarySlotCount::::get() < T::MaxTemporarySlotPerLeasePeriod::get() { // Try to allocate slot directly match Self::configure_slot_lease( @@ -394,7 +389,7 @@ pub mod pallet { } TemporarySlots::::insert(id, temp_slot); - >::mutate(|count| count.saturating_inc()); + TemporarySlotCount::::mutate(|count| count.saturating_inc()); Self::deposit_event(Event::::TemporarySlotAssigned(id)); @@ -420,12 +415,12 @@ pub mod pallet { if PermanentSlots::::contains_key(id) { PermanentSlots::::remove(id); - >::mutate(|count| *count = count.saturating_sub(One::one())); + PermanentSlotCount::::mutate(|count| *count = count.saturating_sub(One::one())); } else if TemporarySlots::::contains_key(id) { TemporarySlots::::remove(id); - >::mutate(|count| *count = count.saturating_sub(One::one())); + TemporarySlotCount::::mutate(|count| *count = count.saturating_sub(One::one())); if is_parachain { - >::mutate(|active_count| { + ActiveTemporarySlotCount::::mutate(|active_count| { *active_count = active_count.saturating_sub(One::one()) }); } @@ -456,7 +451,7 @@ pub mod pallet { pub fn set_max_permanent_slots(origin: OriginFor, slots: u32) -> DispatchResult { ensure_root(origin)?; - >::put(slots); + MaxPermanentSlots::::put(slots); Self::deposit_event(Event::::MaxPermanentSlotsChanged { slots }); Ok(()) @@ -468,7 +463,7 @@ pub mod pallet { pub fn set_max_temporary_slots(origin: OriginFor, slots: u32) -> DispatchResult { ensure_root(origin)?; - >::put(slots); + MaxTemporarySlots::::put(slots); Self::deposit_event(Event::::MaxTemporarySlotsChanged { slots }); Ok(()) @@ -680,7 +675,7 @@ mod tests { pub const BlockHashCount: u32 = 250; } - #[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] + #[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { type BaseCallFilter = frame_support::traits::Everything; type BlockWeights = (); @@ -965,7 +960,7 @@ mod tests { RuntimeOrigin::root(), ParaId::from(2_u32), )); - assert_eq!(AssignedSlots::permanent_slot_count(), 2); + assert_eq!(assigned_slots::PermanentSlotCount::::get(), 2); assert_noop!( AssignedSlots::assign_perm_parachain_slot( @@ -989,8 +984,8 @@ mod tests { dummy_validation_code(), )); - assert_eq!(AssignedSlots::permanent_slot_count(), 0); - assert_eq!(AssignedSlots::permanent_slots(ParaId::from(1_u32)), None); + assert_eq!(assigned_slots::PermanentSlotCount::::get(), 0); + assert_eq!(assigned_slots::PermanentSlots::::get(ParaId::from(1_u32)), None); assert_ok!(AssignedSlots::assign_perm_parachain_slot( RuntimeOrigin::root(), @@ -1004,9 +999,12 @@ mod tests { assert_eq!(TestRegistrar::::is_parachain(ParaId::from(1_u32)), true); - assert_eq!(AssignedSlots::permanent_slot_count(), 1); + assert_eq!(assigned_slots::PermanentSlotCount::::get(), 1); assert_eq!(AssignedSlots::has_permanent_slot(ParaId::from(1_u32)), true); - assert_eq!(AssignedSlots::permanent_slots(ParaId::from(1_u32)), Some((0, 3))); + assert_eq!( + assigned_slots::PermanentSlots::::get(ParaId::from(1_u32)), + Some((0, 3)) + ); assert_eq!(Slots::already_leased(ParaId::from(1_u32), 0, 2), true); @@ -1138,7 +1136,7 @@ mod tests { )); } - assert_eq!(AssignedSlots::temporary_slot_count(), 6); + assert_eq!(assigned_slots::TemporarySlotCount::::get(), 6); // Attempt to assign one more temp slot assert_ok!(TestRegistrar::::register( @@ -1170,15 +1168,15 @@ mod tests { dummy_validation_code(), )); - assert_eq!(AssignedSlots::temporary_slots(ParaId::from(1_u32)), None); + assert_eq!(assigned_slots::TemporarySlots::::get(ParaId::from(1_u32)), None); assert_ok!(AssignedSlots::assign_temp_parachain_slot( RuntimeOrigin::root(), ParaId::from(1_u32), SlotLeasePeriodStart::Current )); - assert_eq!(AssignedSlots::temporary_slot_count(), 1); - assert_eq!(AssignedSlots::active_temporary_slot_count(), 1); + assert_eq!(assigned_slots::TemporarySlotCount::::get(), 1); + assert_eq!(assigned_slots::ActiveTemporarySlotCount::::get(), 1); // Block 1-5 // Para is a lease holding parachain for TemporarySlotLeasePeriodLength * LeasePeriod @@ -1186,14 +1184,14 @@ mod tests { while block < 6 { println!("block #{}", block); println!("lease period #{}", AssignedSlots::current_lease_period_index()); - println!("lease {:?}", Slots::lease(ParaId::from(1_u32))); + println!("lease {:?}", slots::Leases::::get(ParaId::from(1_u32))); assert_eq!(TestRegistrar::::is_parachain(ParaId::from(1_u32)), true); assert_eq!(AssignedSlots::has_temporary_slot(ParaId::from(1_u32)), true); - assert_eq!(AssignedSlots::active_temporary_slot_count(), 1); + assert_eq!(assigned_slots::ActiveTemporarySlotCount::::get(), 1); assert_eq!( - AssignedSlots::temporary_slots(ParaId::from(1_u32)), + assigned_slots::TemporarySlots::::get(ParaId::from(1_u32)), Some(ParachainTemporarySlot { manager: 1, period_begin: 0, @@ -1212,23 +1210,23 @@ mod tests { // Block 6 println!("block #{}", block); println!("lease period #{}", AssignedSlots::current_lease_period_index()); - println!("lease {:?}", Slots::lease(ParaId::from(1_u32))); + println!("lease {:?}", slots::Leases::::get(ParaId::from(1_u32))); // Para lease ended, downgraded back to on-demand parachain assert_eq!(TestRegistrar::::is_parathread(ParaId::from(1_u32)), true); assert_eq!(Slots::already_leased(ParaId::from(1_u32), 0, 3), false); - assert_eq!(AssignedSlots::active_temporary_slot_count(), 0); + assert_eq!(assigned_slots::ActiveTemporarySlotCount::::get(), 0); // Block 12 // Para should get a turn after TemporarySlotLeasePeriodLength * LeasePeriod blocks run_to_block(12); println!("block #{}", block); println!("lease period #{}", AssignedSlots::current_lease_period_index()); - println!("lease {:?}", Slots::lease(ParaId::from(1_u32))); + println!("lease {:?}", slots::Leases::::get(ParaId::from(1_u32))); assert_eq!(TestRegistrar::::is_parachain(ParaId::from(1_u32)), true); assert_eq!(Slots::already_leased(ParaId::from(1_u32), 4, 5), true); - assert_eq!(AssignedSlots::active_temporary_slot_count(), 1); + assert_eq!(assigned_slots::ActiveTemporarySlotCount::::get(), 1); }); } @@ -1270,7 +1268,7 @@ mod tests { assert_eq!(TestRegistrar::::is_parachain(ParaId::from(3_u32)), false); assert_eq!(TestRegistrar::::is_parachain(ParaId::from(4_u32)), false); assert_eq!(TestRegistrar::::is_parachain(ParaId::from(5_u32)), false); - assert_eq!(AssignedSlots::active_temporary_slot_count(), 2); + assert_eq!(assigned_slots::ActiveTemporarySlotCount::::get(), 2); } // Block 6-11, Period 2-3 @@ -1282,7 +1280,7 @@ mod tests { assert_eq!(TestRegistrar::::is_parachain(ParaId::from(3_u32)), true); assert_eq!(TestRegistrar::::is_parachain(ParaId::from(4_u32)), false); assert_eq!(TestRegistrar::::is_parachain(ParaId::from(5_u32)), false); - assert_eq!(AssignedSlots::active_temporary_slot_count(), 2); + assert_eq!(assigned_slots::ActiveTemporarySlotCount::::get(), 2); } // Block 12-17, Period 4-5 @@ -1294,7 +1292,7 @@ mod tests { assert_eq!(TestRegistrar::::is_parachain(ParaId::from(3_u32)), false); assert_eq!(TestRegistrar::::is_parachain(ParaId::from(4_u32)), true); assert_eq!(TestRegistrar::::is_parachain(ParaId::from(5_u32)), true); - assert_eq!(AssignedSlots::active_temporary_slot_count(), 2); + assert_eq!(assigned_slots::ActiveTemporarySlotCount::::get(), 2); } // Block 18-23, Period 6-7 @@ -1306,7 +1304,7 @@ mod tests { assert_eq!(TestRegistrar::::is_parachain(ParaId::from(3_u32)), false); assert_eq!(TestRegistrar::::is_parachain(ParaId::from(4_u32)), false); assert_eq!(TestRegistrar::::is_parachain(ParaId::from(5_u32)), false); - assert_eq!(AssignedSlots::active_temporary_slot_count(), 2); + assert_eq!(assigned_slots::ActiveTemporarySlotCount::::get(), 2); } // Block 24-29, Period 8-9 @@ -1318,7 +1316,7 @@ mod tests { assert_eq!(TestRegistrar::::is_parachain(ParaId::from(3_u32)), true); assert_eq!(TestRegistrar::::is_parachain(ParaId::from(4_u32)), false); assert_eq!(TestRegistrar::::is_parachain(ParaId::from(5_u32)), false); - assert_eq!(AssignedSlots::active_temporary_slot_count(), 2); + assert_eq!(assigned_slots::ActiveTemporarySlotCount::::get(), 2); } // Block 30-35, Period 10-11 @@ -1330,7 +1328,7 @@ mod tests { assert_eq!(TestRegistrar::::is_parachain(ParaId::from(3_u32)), false); assert_eq!(TestRegistrar::::is_parachain(ParaId::from(4_u32)), true); assert_eq!(TestRegistrar::::is_parachain(ParaId::from(5_u32)), true); - assert_eq!(AssignedSlots::active_temporary_slot_count(), 2); + assert_eq!(assigned_slots::ActiveTemporarySlotCount::::get(), 2); } }); } @@ -1386,9 +1384,9 @@ mod tests { ParaId::from(1_u32), )); - assert_eq!(AssignedSlots::permanent_slot_count(), 0); + assert_eq!(assigned_slots::PermanentSlotCount::::get(), 0); assert_eq!(AssignedSlots::has_permanent_slot(ParaId::from(1_u32)), false); - assert_eq!(AssignedSlots::permanent_slots(ParaId::from(1_u32)), None); + assert_eq!(assigned_slots::PermanentSlots::::get(ParaId::from(1_u32)), None); assert_eq!(Slots::already_leased(ParaId::from(1_u32), 0, 2), false); }); @@ -1419,10 +1417,10 @@ mod tests { ParaId::from(1_u32), )); - assert_eq!(AssignedSlots::temporary_slot_count(), 0); - assert_eq!(AssignedSlots::active_temporary_slot_count(), 0); + assert_eq!(assigned_slots::TemporarySlotCount::::get(), 0); + assert_eq!(assigned_slots::ActiveTemporarySlotCount::::get(), 0); assert_eq!(AssignedSlots::has_temporary_slot(ParaId::from(1_u32)), false); - assert_eq!(AssignedSlots::temporary_slots(ParaId::from(1_u32)), None); + assert_eq!(assigned_slots::TemporarySlots::::get(ParaId::from(1_u32)), None); assert_eq!(Slots::already_leased(ParaId::from(1_u32), 0, 1), false); }); diff --git a/polkadot/runtime/common/src/auctions.rs b/polkadot/runtime/common/src/auctions.rs index 46ab673a7a0cb9c685b486c89599c2d9dd324a0d..aa4caac96f154b43f60fb4aa0dc45b9017aff1d9 100644 --- a/polkadot/runtime/common/src/auctions.rs +++ b/polkadot/runtime/common/src/auctions.rs @@ -174,7 +174,6 @@ pub mod pallet { /// Number of auctions started so far. #[pallet::storage] - #[pallet::getter(fn auction_counter)] pub type AuctionCounter = StorageValue<_, AuctionIndex, ValueQuery>; /// Information relating to the current auction, if there is one. @@ -183,13 +182,11 @@ pub mod pallet { /// contiguous lease periods on auction is for. The second is the block number when the /// auction will "begin to end", i.e. the first block of the Ending Period of the auction. #[pallet::storage] - #[pallet::getter(fn auction_info)] pub type AuctionInfo = StorageValue<_, (LeasePeriodOf, BlockNumberFor)>; /// Amounts currently reserved in the accounts of the bidders currently winning /// (sub-)ranges. #[pallet::storage] - #[pallet::getter(fn reserved_amounts)] pub type ReservedAmounts = StorageMap<_, Twox64Concat, (T::AccountId, ParaId), BalanceOf>; @@ -197,7 +194,6 @@ pub mod pallet { /// the current auction. The map's key is the 0-based index into the Sample Size. The /// first sample of the ending period is 0; the last is `Sample Size - 1`. #[pallet::storage] - #[pallet::getter(fn winning)] pub type Winning = StorageMap<_, Twox64Concat, BlockNumberFor, WinningData>; #[pallet::extra_constants] @@ -707,7 +703,7 @@ mod tests { pub const BlockHashCount: u32 = 250; } - #[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] + #[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { type BaseCallFilter = frame_support::traits::Everything; type BlockWeights = (); @@ -983,7 +979,7 @@ mod tests { assert_eq!(Balances::reserved_balance(1), 5); assert_eq!(Balances::free_balance(1), 5); assert_eq!( - Auctions::winning(0).unwrap()[SlotRange::ZeroThree as u8 as usize], + Winning::::get(0).unwrap()[SlotRange::ZeroThree as u8 as usize], Some((1, 0.into(), 5)) ); }); @@ -1016,7 +1012,7 @@ mod tests { assert_eq!(Balances::reserved_balance(2), 6); assert_eq!(Balances::free_balance(2), 14); assert_eq!( - Auctions::winning(0).unwrap()[SlotRange::ZeroThree as u8 as usize], + Winning::::get(0).unwrap()[SlotRange::ZeroThree as u8 as usize], Some((2, 0.into(), 6)) ); }); @@ -1453,7 +1449,7 @@ mod tests { let mut winning = [None; SlotRange::SLOT_RANGE_COUNT]; winning[SlotRange::ZeroThree as u8 as usize] = Some((1, para_1, 9)); winning[SlotRange::TwoThree as u8 as usize] = Some((2, para_2, 19)); - assert_eq!(Auctions::winning(0), Some(winning)); + assert_eq!(Winning::::get(0), Some(winning)); run_to_block(9); assert_eq!( @@ -1466,14 +1462,14 @@ mod tests { Auctions::auction_status(System::block_number()), AuctionStatus::::EndingPeriod(0, 0) ); - assert_eq!(Auctions::winning(0), Some(winning)); + assert_eq!(Winning::::get(0), Some(winning)); run_to_block(11); assert_eq!( Auctions::auction_status(System::block_number()), AuctionStatus::::EndingPeriod(1, 0) ); - assert_eq!(Auctions::winning(1), Some(winning)); + assert_eq!(Winning::::get(1), Some(winning)); assert_ok!(Auctions::bid(RuntimeOrigin::signed(3), para_3, 1, 3, 4, 29)); run_to_block(12); @@ -1482,7 +1478,7 @@ mod tests { AuctionStatus::::EndingPeriod(2, 0) ); winning[SlotRange::TwoThree as u8 as usize] = Some((3, para_3, 29)); - assert_eq!(Auctions::winning(2), Some(winning)); + assert_eq!(Winning::::get(2), Some(winning)); }); } @@ -1569,7 +1565,7 @@ mod tests { let mut winning = [None; SlotRange::SLOT_RANGE_COUNT]; winning[SlotRange::ZeroThree as u8 as usize] = Some((1, para_1, 9)); winning[SlotRange::TwoThree as u8 as usize] = Some((2, para_2, 19)); - assert_eq!(Auctions::winning(0), Some(winning)); + assert_eq!(Winning::::get(0), Some(winning)); run_to_block(9); assert_eq!( @@ -1582,31 +1578,31 @@ mod tests { Auctions::auction_status(System::block_number()), AuctionStatus::::EndingPeriod(0, 0) ); - assert_eq!(Auctions::winning(0), Some(winning)); + assert_eq!(Winning::::get(0), Some(winning)); // New bids update the current winning assert_ok!(Auctions::bid(RuntimeOrigin::signed(3), para_3, 1, 14, 14, 29)); winning[SlotRange::ThreeThree as u8 as usize] = Some((3, para_3, 29)); - assert_eq!(Auctions::winning(0), Some(winning)); + assert_eq!(Winning::::get(0), Some(winning)); run_to_block(20); assert_eq!( Auctions::auction_status(System::block_number()), AuctionStatus::::EndingPeriod(1, 0) ); - assert_eq!(Auctions::winning(1), Some(winning)); + assert_eq!(Winning::::get(1), Some(winning)); run_to_block(25); // Overbid mid sample assert_ok!(Auctions::bid(RuntimeOrigin::signed(3), para_3, 1, 13, 14, 29)); winning[SlotRange::TwoThree as u8 as usize] = Some((3, para_3, 29)); - assert_eq!(Auctions::winning(1), Some(winning)); + assert_eq!(Winning::::get(1), Some(winning)); run_to_block(30); assert_eq!( Auctions::auction_status(System::block_number()), AuctionStatus::::EndingPeriod(2, 0) ); - assert_eq!(Auctions::winning(2), Some(winning)); + assert_eq!(Winning::::get(2), Some(winning)); set_last_random(H256::from([254; 32]), 40); run_to_block(40); @@ -1899,10 +1895,13 @@ mod benchmarking { // Trigger epoch change for new random number value: { + pallet_babe::EpochStart::::set((Zero::zero(), u32::MAX.into())); pallet_babe::Pallet::::on_initialize(duration + now + T::EndingPeriod::get()); let authorities = pallet_babe::Pallet::::authorities(); - let next_authorities = authorities.clone(); - pallet_babe::Pallet::::enact_epoch_change(authorities, next_authorities, None); + // Check for non empty authority set since it otherwise emits a No-OP warning. + if !authorities.is_empty() { + pallet_babe::Pallet::::enact_epoch_change(authorities.clone(), authorities, None); + } } }: { diff --git a/polkadot/runtime/common/src/claims.rs b/polkadot/runtime/common/src/claims.rs index 86550ea8b4ebf97054ce6713fffcdd0dd2cf628e..8407c7f0dda9d9567d0f4283fbc9999c5b0f0a7d 100644 --- a/polkadot/runtime/common/src/claims.rs +++ b/polkadot/runtime/common/src/claims.rs @@ -203,20 +203,17 @@ pub mod pallet { } #[pallet::storage] - #[pallet::getter(fn claims)] - pub(super) type Claims = StorageMap<_, Identity, EthereumAddress, BalanceOf>; + pub type Claims = StorageMap<_, Identity, EthereumAddress, BalanceOf>; #[pallet::storage] - #[pallet::getter(fn total)] - pub(super) type Total = StorageValue<_, BalanceOf, ValueQuery>; + pub type Total = StorageValue<_, BalanceOf, ValueQuery>; /// Vesting schedule for a claim. /// First balance is the total amount that should be held for vesting. /// Second balance is how much should be unlocked per block. /// The block number is when the vesting should start. #[pallet::storage] - #[pallet::getter(fn vesting)] - pub(super) type Vesting = + pub type Vesting = StorageMap<_, Identity, EthereumAddress, (BalanceOf, BalanceOf, BlockNumberFor)>; /// The statement kind that must be signed, if any. @@ -341,10 +338,10 @@ pub mod pallet { ) -> DispatchResult { ensure_root(origin)?; - >::mutate(|t| *t += value); - >::insert(who, value); + Total::::mutate(|t| *t += value); + Claims::::insert(who, value); if let Some(vs) = vesting_schedule { - >::insert(who, vs); + Vesting::::insert(who, vs); } if let Some(s) = statement { Signing::::insert(who, s); @@ -492,7 +489,7 @@ pub mod pallet { ))?; let e = InvalidTransaction::Custom(ValidityError::SignerHasNoClaim.into()); - ensure!(>::contains_key(&signer), e); + ensure!(Claims::::contains_key(&signer), e); let e = InvalidTransaction::Custom(ValidityError::InvalidStatement.into()); match Signing::::get(signer) { @@ -551,9 +548,10 @@ impl Pallet { } fn process_claim(signer: EthereumAddress, dest: T::AccountId) -> sp_runtime::DispatchResult { - let balance_due = >::get(&signer).ok_or(Error::::SignerHasNoClaim)?; + let balance_due = Claims::::get(&signer).ok_or(Error::::SignerHasNoClaim)?; - let new_total = Self::total().checked_sub(&balance_due).ok_or(Error::::PotUnderflow)?; + let new_total = + Total::::get().checked_sub(&balance_due).ok_or(Error::::PotUnderflow)?; let vesting = Vesting::::get(&signer); if vesting.is_some() && T::VestingSchedule::vesting_balance(&dest).is_some() { @@ -571,9 +569,9 @@ impl Pallet { .expect("No other vesting schedule exists, as checked above; qed"); } - >::put(new_total); - >::remove(&signer); - >::remove(&signer); + Total::::put(new_total); + Claims::::remove(&signer); + Vesting::::remove(&signer); Signing::::remove(&signer); // Let's deposit an event to let the outside world know this happened. @@ -683,7 +681,7 @@ mod secp_utils { what: &[u8], extra: &[u8], ) -> EcdsaSignature { - let msg = keccak_256(&>::ethereum_signable_message( + let msg = keccak_256(&super::Pallet::::ethereum_signable_message( &to_ascii_hex(what)[..], extra, )); @@ -702,7 +700,6 @@ mod tests { use secp_utils::*; use parity_scale_codec::Encode; - use sp_core::H256; // The testing primitives are very useful for avoiding having to work with signatures // or public keys. `u64` is used as the `AccountId` and no `Signature`s are required. use crate::claims; @@ -715,11 +712,8 @@ mod tests { }; use pallet_balances; use sp_runtime::{ - traits::{BlakeTwo256, Identity, IdentityLookup}, - transaction_validity::TransactionLongevity, - BuildStorage, - DispatchError::BadOrigin, - TokenError, + traits::Identity, transaction_validity::TransactionLongevity, BuildStorage, + DispatchError::BadOrigin, TokenError, }; type Block = frame_system::mocking::MockBlock; @@ -734,34 +728,13 @@ mod tests { } ); - parameter_types! { - pub const BlockHashCount: u32 = 250; - } - - #[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] + #[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { - type BaseCallFilter = frame_support::traits::Everything; - type BlockWeights = (); - type BlockLength = (); - type DbWeight = (); type RuntimeOrigin = RuntimeOrigin; type RuntimeCall = RuntimeCall; - type Nonce = u64; - type Hash = H256; - type Hashing = BlakeTwo256; - type AccountId = u64; - type Lookup = IdentityLookup; type Block = Block; type RuntimeEvent = RuntimeEvent; - type BlockHashCount = BlockHashCount; - type Version = (); - type PalletInfo = PalletInfo; type AccountData = pallet_balances::AccountData; - type OnNewAccount = (); - type OnKilledAccount = (); - type SystemWeightInfo = (); - type SS58Prefix = (); - type OnSetCode = (); type MaxConsumers = frame_support::traits::ConstU32<16>; } @@ -862,13 +835,13 @@ mod tests { #[test] fn basic_setup_works() { new_test_ext().execute_with(|| { - assert_eq!(Claims::total(), total_claims()); - assert_eq!(Claims::claims(ð(&alice())), Some(100)); - assert_eq!(Claims::claims(ð(&dave())), Some(200)); - assert_eq!(Claims::claims(ð(&eve())), Some(300)); - assert_eq!(Claims::claims(ð(&frank())), Some(400)); - assert_eq!(Claims::claims(&EthereumAddress::default()), None); - assert_eq!(Claims::vesting(ð(&alice())), Some((50, 10, 1))); + assert_eq!(claims::Total::::get(), total_claims()); + assert_eq!(claims::Claims::::get(ð(&alice())), Some(100)); + assert_eq!(claims::Claims::::get(ð(&dave())), Some(200)); + assert_eq!(claims::Claims::::get(ð(&eve())), Some(300)); + assert_eq!(claims::Claims::::get(ð(&frank())), Some(400)); + assert_eq!(claims::Claims::::get(&EthereumAddress::default()), None); + assert_eq!(claims::Vesting::::get(ð(&alice())), Some((50, 10, 1))); }); } @@ -892,7 +865,7 @@ mod tests { )); assert_eq!(Balances::free_balance(&42), 100); assert_eq!(Vesting::vesting_balance(&42), Some(50)); - assert_eq!(Claims::total(), total_claims() - 100); + assert_eq!(claims::Total::::get(), total_claims() - 100); }); } @@ -925,7 +898,7 @@ mod tests { )); assert_eq!(Balances::free_balance(&42), 100); assert_eq!(Vesting::vesting_balance(&42), Some(50)); - assert_eq!(Claims::total(), total_claims() - 100); + assert_eq!(claims::Total::::get(), total_claims() - 100); }); } @@ -1029,7 +1002,7 @@ mod tests { StatementKind::Regular.to_text().to_vec() )); assert_eq!(Balances::free_balance(&42), 200); - assert_eq!(Claims::total(), total_claims() - 200); + assert_eq!(claims::Total::::get(), total_claims() - 200); let s = sig::(&dave(), &42u64.encode(), StatementKind::Regular.to_text()); let r = Claims::claim_attest( @@ -1062,7 +1035,7 @@ mod tests { StatementKind::Saft.to_text().to_vec() )); assert_eq!(Balances::free_balance(&42), 300); - assert_eq!(Claims::total(), total_claims() - 300); + assert_eq!(claims::Total::::get(), total_claims() - 300); }); } @@ -1083,7 +1056,7 @@ mod tests { StatementKind::Saft.to_text().to_vec() )); assert_eq!(Balances::free_balance(&42), 100 + 300); - assert_eq!(Claims::total(), total_claims() - 400); + assert_eq!(claims::Total::::get(), total_claims() - 400); }); } @@ -1147,7 +1120,7 @@ mod tests { Error::::SignerHasNoClaim, ); assert_ok!(Claims::mint_claim(RuntimeOrigin::root(), eth(&bob()), 200, None, None)); - assert_eq!(Claims::total(), total_claims() + 200); + assert_eq!(claims::Total::::get(), total_claims() + 200); assert_ok!(Claims::claim( RuntimeOrigin::none(), 69, @@ -1155,7 +1128,7 @@ mod tests { )); assert_eq!(Balances::free_balance(&69), 200); assert_eq!(Vesting::vesting_balance(&69), None); - assert_eq!(Claims::total(), total_claims()); + assert_eq!(claims::Total::::get(), total_claims()); }); } @@ -1309,7 +1282,7 @@ mod tests { None )); // New total - assert_eq!(Claims::total(), total_claims() + 200); + assert_eq!(claims::Total::::get(), total_claims() + 200); // They should not be able to claim assert_noop!( @@ -1372,7 +1345,7 @@ mod tests { new_test_ext().execute_with(|| { assert_eq!( - >::validate_unsigned( + Pallet::::validate_unsigned( source, &ClaimsCall::claim { dest: 1, @@ -1388,14 +1361,14 @@ mod tests { }) ); assert_eq!( - >::validate_unsigned( + Pallet::::validate_unsigned( source, &ClaimsCall::claim { dest: 0, ethereum_signature: EcdsaSignature([0; 65]) } ), InvalidTransaction::Custom(ValidityError::InvalidEthereumSignature.into()).into(), ); assert_eq!( - >::validate_unsigned( + Pallet::::validate_unsigned( source, &ClaimsCall::claim { dest: 1, @@ -1411,7 +1384,7 @@ mod tests { statement: StatementKind::Regular.to_text().to_vec(), }; assert_eq!( - >::validate_unsigned(source, &call), + Pallet::::validate_unsigned(source, &call), Ok(ValidTransaction { priority: 100, requires: vec![], @@ -1421,7 +1394,7 @@ mod tests { }) ); assert_eq!( - >::validate_unsigned( + Pallet::::validate_unsigned( source, &ClaimsCall::claim_attest { dest: 1, @@ -1439,7 +1412,7 @@ mod tests { statement: StatementKind::Regular.to_text().to_vec(), }; assert_eq!( - >::validate_unsigned(source, &call), + Pallet::::validate_unsigned(source, &call), InvalidTransaction::Custom(ValidityError::SignerHasNoClaim.into()).into(), ); @@ -1450,7 +1423,7 @@ mod tests { statement: StatementKind::Regular.to_text().to_vec(), }; assert_eq!( - >::validate_unsigned(source, &call), + Pallet::::validate_unsigned(source, &call), InvalidTransaction::Custom(ValidityError::SignerHasNoClaim.into()).into(), ); @@ -1461,7 +1434,7 @@ mod tests { statement: StatementKind::Saft.to_text().to_vec(), }; assert_eq!( - >::validate_unsigned(source, &call), + Pallet::::validate_unsigned(source, &call), InvalidTransaction::Custom(ValidityError::InvalidStatement.into()).into(), ); }); diff --git a/polkadot/runtime/common/src/crowdloan/migration.rs b/polkadot/runtime/common/src/crowdloan/migration.rs index 5133c14ada9276a56ae91f38e8a67b4846979866..3afd6b3fbc94b5b30bad162cfcf8236a029b77da 100644 --- a/polkadot/runtime/common/src/crowdloan/migration.rs +++ b/polkadot/runtime/common/src/crowdloan/migration.rs @@ -24,9 +24,9 @@ use frame_support::{ pub struct MigrateToTrackInactiveV2(sp_std::marker::PhantomData); impl OnRuntimeUpgrade for MigrateToTrackInactiveV2 { fn on_runtime_upgrade() -> Weight { - let onchain_version = Pallet::::on_chain_storage_version(); + let on_chain_version = Pallet::::on_chain_storage_version(); - if onchain_version == 1 { + if on_chain_version == 1 { let mut translated = 0u64; for item in Funds::::iter_values() { let b = diff --git a/polkadot/runtime/common/src/crowdloan/mod.rs b/polkadot/runtime/common/src/crowdloan/mod.rs index 7d1b892dfa7fc6c4057a7da8731e39a9a4b2d3e8..12078871a1957215fd209402894fc0434fba6ba5 100644 --- a/polkadot/runtime/common/src/crowdloan/mod.rs +++ b/polkadot/runtime/common/src/crowdloan/mod.rs @@ -60,7 +60,7 @@ use frame_support::{ pallet_prelude::{DispatchResult, Weight}, storage::{child, ChildTriePrefixIterator}, traits::{ - Currency, + Currency, Defensive, ExistenceRequirement::{self, AllowDeath, KeepAlive}, Get, ReservableCurrency, }, @@ -83,10 +83,6 @@ type CurrencyOf = <::Auctioneer as Auctioneer> type LeasePeriodOf = <::Auctioneer as Auctioneer>>::LeasePeriod; type BalanceOf = as Currency<::AccountId>>::Balance; -#[allow(dead_code)] -type NegativeImbalanceOf = - as Currency<::AccountId>>::NegativeImbalance; - type FundIndex = u32; pub trait WeightInfo { @@ -180,7 +176,7 @@ pub mod pallet { use frame_support::pallet_prelude::*; use frame_system::{ensure_root, ensure_signed, pallet_prelude::*}; - /// The current storage version. + /// The in-code storage version. const STORAGE_VERSION: StorageVersion = StorageVersion::new(2); #[pallet::pallet] @@ -229,8 +225,7 @@ pub mod pallet { /// Info on all of the funds. #[pallet::storage] - #[pallet::getter(fn funds)] - pub(crate) type Funds = StorageMap< + pub type Funds = StorageMap< _, Twox64Concat, ParaId, @@ -240,18 +235,15 @@ pub mod pallet { /// The funds that have had additional contributions during the last block. This is used /// in order to determine which funds should submit new or updated bids. #[pallet::storage] - #[pallet::getter(fn new_raise)] - pub(super) type NewRaise = StorageValue<_, Vec, ValueQuery>; + pub type NewRaise = StorageValue<_, Vec, ValueQuery>; /// The number of auctions that have entered into their ending period so far. #[pallet::storage] - #[pallet::getter(fn endings_count)] - pub(super) type EndingsCount = StorageValue<_, u32, ValueQuery>; + pub type EndingsCount = StorageValue<_, u32, ValueQuery>; /// Tracker for the next available fund index #[pallet::storage] - #[pallet::getter(fn next_fund_index)] - pub(super) type NextFundIndex = StorageValue<_, u32, ValueQuery>; + pub type NextFundIndex = StorageValue<_, u32, ValueQuery>; #[pallet::event] #[pallet::generate_deposit(pub(super) fn deposit_event)] @@ -342,7 +334,7 @@ pub mod pallet { let new_raise = NewRaise::::take(); let new_raise_len = new_raise.len() as u32; for (fund, para_id) in - new_raise.into_iter().filter_map(|i| Self::funds(i).map(|f| (f, i))) + new_raise.into_iter().filter_map(|i| Funds::::get(i).map(|f| (f, i))) { // Care needs to be taken by the crowdloan creator that this function will // succeed given the crowdloaning configuration. We do some checks ahead of time @@ -416,7 +408,7 @@ pub mod pallet { ensure!(depositor == manager, Error::::InvalidOrigin); ensure!(T::Registrar::is_registered(index), Error::::InvalidParaId); - let fund_index = Self::next_fund_index(); + let fund_index = NextFundIndex::::get(); let new_fund_index = fund_index.checked_add(1).ok_or(Error::::Overflow)?; let deposit = T::SubmissionDeposit::get(); @@ -486,7 +478,7 @@ pub mod pallet { ) -> DispatchResult { ensure_signed(origin)?; - let mut fund = Self::funds(index).ok_or(Error::::InvalidParaId)?; + let mut fund = Funds::::get(index).ok_or(Error::::InvalidParaId)?; let now = frame_system::Pallet::::block_number(); let fund_account = Self::fund_account_id(fund.fund_index); Self::ensure_crowdloan_ended(now, &fund_account, &fund)?; @@ -519,7 +511,7 @@ pub mod pallet { ) -> DispatchResultWithPostInfo { ensure_signed(origin)?; - let mut fund = Self::funds(index).ok_or(Error::::InvalidParaId)?; + let mut fund = Funds::::get(index).ok_or(Error::::InvalidParaId)?; let now = frame_system::Pallet::::block_number(); let fund_account = Self::fund_account_id(fund.fund_index); Self::ensure_crowdloan_ended(now, &fund_account, &fund)?; @@ -562,7 +554,8 @@ pub mod pallet { pub fn dissolve(origin: OriginFor, #[pallet::compact] index: ParaId) -> DispatchResult { let who = ensure_signed(origin)?; - let fund = Self::funds(index).ok_or(Error::::InvalidParaId)?; + let fund = Funds::::get(index).ok_or(Error::::InvalidParaId)?; + let pot = Self::fund_account_id(fund.fund_index); let now = frame_system::Pallet::::block_number(); // Only allow dissolution when the raised funds goes to zero, @@ -576,7 +569,10 @@ pub mod pallet { // can take care of that. debug_assert!(Self::contribution_iterator(fund.fund_index).count().is_zero()); - frame_system::Pallet::::dec_providers(&Self::fund_account_id(fund.fund_index))?; + // Crowdloan over, burn all funds. + let _imba = CurrencyOf::::make_free_balance_be(&pot, Zero::zero()); + let _ = frame_system::Pallet::::dec_providers(&pot).defensive(); + CurrencyOf::::unreserve(&fund.depositor, fund.deposit); Funds::::remove(index); Self::deposit_event(Event::::Dissolved { para_id: index }); @@ -599,7 +595,7 @@ pub mod pallet { ) -> DispatchResult { ensure_root(origin)?; - let fund = Self::funds(index).ok_or(Error::::InvalidParaId)?; + let fund = Funds::::get(index).ok_or(Error::::InvalidParaId)?; Funds::::insert( index, @@ -630,7 +626,7 @@ pub mod pallet { let who = ensure_signed(origin)?; ensure!(memo.len() <= T::MaxMemoLength::get().into(), Error::::MemoTooLarge); - let fund = Self::funds(index).ok_or(Error::::InvalidParaId)?; + let fund = Funds::::get(index).ok_or(Error::::InvalidParaId)?; let (balance, _) = Self::contribution_get(fund.fund_index, &who); ensure!(balance > Zero::zero(), Error::::NoContributions); @@ -647,7 +643,7 @@ pub mod pallet { #[pallet::weight(T::WeightInfo::poke())] pub fn poke(origin: OriginFor, index: ParaId) -> DispatchResult { ensure_signed(origin)?; - let fund = Self::funds(index).ok_or(Error::::InvalidParaId)?; + let fund = Funds::::get(index).ok_or(Error::::InvalidParaId)?; ensure!(!fund.raised.is_zero(), Error::::NoContributions); ensure!(!NewRaise::::get().contains(&index), Error::::AlreadyInNewRaise); NewRaise::::append(index); @@ -757,12 +753,12 @@ impl Pallet { existence: ExistenceRequirement, ) -> DispatchResult { ensure!(value >= T::MinContribution::get(), Error::::ContributionTooSmall); - let mut fund = Self::funds(index).ok_or(Error::::InvalidParaId)?; + let mut fund = Funds::::get(index).ok_or(Error::::InvalidParaId)?; fund.raised = fund.raised.checked_add(&value).ok_or(Error::::Overflow)?; ensure!(fund.raised <= fund.cap, Error::::CapExceeded); // Make sure crowdloan has not ended - let now = >::block_number(); + let now = frame_system::Pallet::::block_number(); ensure!(now < fund.end, Error::::ContributionPeriodOver); // Make sure crowdloan is in a valid lease period @@ -811,7 +807,7 @@ impl Pallet { }, } } else { - let endings_count = Self::endings_count(); + let endings_count = EndingsCount::::get(); match fund.last_contribution { LastContribution::PreEnding(a) if a == endings_count => { // Not in ending period and no auctions have ended ending since our @@ -900,7 +896,7 @@ mod tests { type BlockNumber = u64; - #[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] + #[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { type BaseCallFilter = frame_support::traits::Everything; type BlockWeights = (); @@ -1155,11 +1151,11 @@ mod tests { fn basic_setup_works() { new_test_ext().execute_with(|| { assert_eq!(System::block_number(), 0); - assert_eq!(Crowdloan::funds(ParaId::from(0)), None); + assert_eq!(crowdloan::Funds::::get(ParaId::from(0)), None); let empty: Vec = Vec::new(); - assert_eq!(Crowdloan::new_raise(), empty); + assert_eq!(crowdloan::NewRaise::::get(), empty); assert_eq!(Crowdloan::contribution_get(0u32, &1).0, 0); - assert_eq!(Crowdloan::endings_count(), 0); + assert_eq!(crowdloan::EndingsCount::::get(), 0); assert_ok!(TestAuctioneer::new_auction(5, 0)); @@ -1201,14 +1197,14 @@ mod tests { last_period: 4, fund_index: 0, }; - assert_eq!(Crowdloan::funds(para), Some(fund_info)); + assert_eq!(crowdloan::Funds::::get(para), Some(fund_info)); // User has deposit removed from their free balance assert_eq!(Balances::free_balance(1), 999); // Deposit is placed in reserved assert_eq!(Balances::reserved_balance(1), 1); // No new raise until first contribution let empty: Vec = Vec::new(); - assert_eq!(Crowdloan::new_raise(), empty); + assert_eq!(crowdloan::NewRaise::::get(), empty); }); } @@ -1241,14 +1237,14 @@ mod tests { last_period: 4, fund_index: 0, }; - assert_eq!(Crowdloan::funds(ParaId::from(0)), Some(fund_info)); + assert_eq!(crowdloan::Funds::::get(ParaId::from(0)), Some(fund_info)); // User has deposit removed from their free balance assert_eq!(Balances::free_balance(1), 999); // Deposit is placed in reserved assert_eq!(Balances::reserved_balance(1), 1); // No new raise until first contribution let empty: Vec = Vec::new(); - assert_eq!(Crowdloan::new_raise(), empty); + assert_eq!(crowdloan::NewRaise::::get(), empty); }); } @@ -1321,9 +1317,9 @@ mod tests { // Contributions appear in free balance of crowdloan assert_eq!(Balances::free_balance(Crowdloan::fund_account_id(index)), 49); // Crowdloan is added to NewRaise - assert_eq!(Crowdloan::new_raise(), vec![para]); + assert_eq!(crowdloan::NewRaise::::get(), vec![para]); - let fund = Crowdloan::funds(para).unwrap(); + let fund = crowdloan::Funds::::get(para).unwrap(); // Last contribution time recorded assert_eq!(fund.last_contribution, LastContribution::PreEnding(0)); @@ -1418,7 +1414,7 @@ mod tests { assert_eq!(Balances::free_balance(Crowdloan::fund_account_id(index)), 59); // Contribution amount is correct - let fund = Crowdloan::funds(para).unwrap(); + let fund = crowdloan::Funds::::get(para).unwrap(); assert_eq!(fund.raised, 59); }); } @@ -1570,7 +1566,7 @@ mod tests { ); // Endings count incremented - assert_eq!(Crowdloan::endings_count(), 1); + assert_eq!(crowdloan::EndingsCount::::get(), 1); }); } @@ -1609,6 +1605,7 @@ mod tests { new_test_ext().execute_with(|| { let para = new_para(); let index = NextFundIndex::::get(); + let issuance = Balances::total_issuance(); // Set up a crowdloan assert_ok!(Crowdloan::create(RuntimeOrigin::signed(1), para, 1000, 1, 1, 9, None)); @@ -1629,9 +1626,10 @@ mod tests { // Some funds are left over assert_eq!(Balances::free_balance(&account_id), 10); - // They wil be left in the account at the end + // Remaining funds will be burned assert_ok!(Crowdloan::dissolve(RuntimeOrigin::signed(1), para)); - assert_eq!(Balances::free_balance(&account_id), 10); + assert_eq!(Balances::free_balance(&account_id), 0); + assert_eq!(Balances::total_issuance(), issuance - 10); }); } @@ -1740,6 +1738,41 @@ mod tests { }); } + // Regression test to check that a pot account with just one provider can be dissolved. + #[test] + fn dissolve_provider_refs_total_issuance_works() { + new_test_ext().execute_with(|| { + let para = new_para(); + let issuance = Balances::total_issuance(); + + // Set up a crowdloan + assert_ok!(Crowdloan::create(RuntimeOrigin::signed(1), para, 1000, 1, 1, 9, None)); + assert_ok!(Crowdloan::contribute(RuntimeOrigin::signed(2), para, 100, None)); + assert_ok!(Crowdloan::contribute(RuntimeOrigin::signed(3), para, 50, None)); + + run_to_block(10); + + // We test the historic case where crowdloan accounts only have one provider: + { + let fund = crowdloan::Funds::::get(para).unwrap(); + let pot = Crowdloan::fund_account_id(fund.fund_index); + System::dec_providers(&pot).unwrap(); + assert_eq!(System::providers(&pot), 1); + } + + // All funds are refunded + assert_ok!(Crowdloan::refund(RuntimeOrigin::signed(2), para)); + + // Now that `fund.raised` is zero, it can be dissolved. + assert_ok!(Crowdloan::dissolve(RuntimeOrigin::signed(1), para)); + + assert_eq!(Balances::free_balance(1), 1000); + assert_eq!(Balances::free_balance(2), 2000); + assert_eq!(Balances::free_balance(3), 3000); + assert_eq!(Balances::total_issuance(), issuance); + }); + } + #[test] fn dissolve_works() { new_test_ext().execute_with(|| { @@ -1873,10 +1906,10 @@ mod tests { assert_ok!(Crowdloan::create(RuntimeOrigin::signed(1), para_1, 1000, 1, 1, 9, None)); assert_ok!(Crowdloan::contribute(RuntimeOrigin::signed(2), para_1, 100, None)); - let old_crowdloan = Crowdloan::funds(para_1).unwrap(); + let old_crowdloan = crowdloan::Funds::::get(para_1).unwrap(); assert_ok!(Crowdloan::edit(RuntimeOrigin::root(), para_1, 1234, 2, 3, 4, None)); - let new_crowdloan = Crowdloan::funds(para_1).unwrap(); + let new_crowdloan = crowdloan::Funds::::get(para_1).unwrap(); // Some things stay the same assert_eq!(old_crowdloan.depositor, new_crowdloan.depositor); @@ -1937,7 +1970,7 @@ mod tests { assert_ok!(Crowdloan::contribute(RuntimeOrigin::signed(2), para_1, 100, None)); run_to_block(6); assert_ok!(Crowdloan::poke(RuntimeOrigin::signed(1), para_1)); - assert_eq!(Crowdloan::new_raise(), vec![para_1]); + assert_eq!(crowdloan::NewRaise::::get(), vec![para_1]); assert_noop!( Crowdloan::poke(RuntimeOrigin::signed(1), para_1), Error::::AlreadyInNewRaise diff --git a/polkadot/runtime/common/src/identity_migrator.rs b/polkadot/runtime/common/src/identity_migrator.rs index 0dfb03b06ba32b65941165ec993bc694b84a1389..bf334a63e9588411f57ecc8b6ee2fca72861d7aa 100644 --- a/polkadot/runtime/common/src/identity_migrator.rs +++ b/polkadot/runtime/common/src/identity_migrator.rs @@ -31,7 +31,7 @@ use pallet_identity; use sp_core::Get; #[cfg(feature = "runtime-benchmarks")] -use frame_benchmarking::{account, impl_benchmark_test_suite, v2::*, BenchmarkError}; +use frame_benchmarking::{account, v2::*, BenchmarkError}; pub trait WeightInfo { fn reap_identity(r: u32, s: u32) -> Weight; diff --git a/polkadot/runtime/common/src/impls.rs b/polkadot/runtime/common/src/impls.rs index 1ddad37831b68582cfc14f882870922c67058f1d..cc1243790c2e58b23c169de918f28d75397420ba 100644 --- a/polkadot/runtime/common/src/impls.rs +++ b/polkadot/runtime/common/src/impls.rs @@ -16,8 +16,12 @@ //! Auxiliary `struct`/`enum`s for polkadot runtime. -use crate::NegativeImbalance; -use frame_support::traits::{Currency, Imbalance, OnUnbalanced}; +use frame_support::traits::{ + fungible::{Balanced, Credit}, + tokens::imbalance::ResolveTo, + Imbalance, OnUnbalanced, +}; +use pallet_treasury::TreasuryAccountId; use parity_scale_codec::{Decode, Encode, MaxEncodedLen}; use primitives::Balance; use sp_runtime::{traits::TryConvert, Perquintill, RuntimeDebug}; @@ -25,28 +29,31 @@ use xcm::VersionedLocation; /// Logic for the author to get a portion of fees. pub struct ToAuthor(sp_std::marker::PhantomData); -impl OnUnbalanced> for ToAuthor +impl OnUnbalanced>> for ToAuthor where R: pallet_balances::Config + pallet_authorship::Config, ::AccountId: From, ::AccountId: Into, { - fn on_nonzero_unbalanced(amount: NegativeImbalance) { + fn on_nonzero_unbalanced( + amount: Credit<::AccountId, pallet_balances::Pallet>, + ) { if let Some(author) = >::author() { - >::resolve_creating(&author, amount); + let _ = >::resolve(&author, amount); } } } pub struct DealWithFees(sp_std::marker::PhantomData); -impl OnUnbalanced> for DealWithFees +impl OnUnbalanced>> for DealWithFees where - R: pallet_balances::Config + pallet_treasury::Config + pallet_authorship::Config, - pallet_treasury::Pallet: OnUnbalanced>, + R: pallet_balances::Config + pallet_authorship::Config + pallet_treasury::Config, ::AccountId: From, ::AccountId: Into, { - fn on_unbalanceds(mut fees_then_tips: impl Iterator>) { + fn on_unbalanceds( + mut fees_then_tips: impl Iterator>>, + ) { if let Some(fees) = fees_then_tips.next() { // for fees, 80% to treasury, 20% to author let mut split = fees.ration(80, 20); @@ -54,8 +61,7 @@ where // for tips, if any, 100% to author tips.merge_into(&mut split.1); } - use pallet_treasury::Pallet as Treasury; - as OnUnbalanced<_>>::on_unbalanced(split.0); + ResolveTo::, pallet_balances::Pallet>::on_unbalanced(split.0); as OnUnbalanced<_>>::on_unbalanced(split.1); } } @@ -107,7 +113,7 @@ pub fn era_payout( )] pub enum VersionedLocatableAsset { #[codec(index = 3)] - V3 { location: xcm::v3::MultiLocation, asset_id: xcm::v3::AssetId }, + V3 { location: xcm::v3::Location, asset_id: xcm::v3::AssetId }, #[codec(index = 4)] V4 { location: xcm::v4::Location, asset_id: xcm::v4::AssetId }, } @@ -140,7 +146,7 @@ impl TryConvert<&VersionedLocation, xcm::latest::Location> for VersionedLocation ) -> Result { let latest = match location.clone() { VersionedLocation::V2(l) => { - let v3: xcm::v3::MultiLocation = l.try_into().map_err(|_| location)?; + let v3: xcm::v3::Location = l.try_into().map_err(|_| location)?; v3.try_into().map_err(|_| location)? }, VersionedLocation::V3(l) => l.try_into().map_err(|_| location)?, @@ -191,11 +197,11 @@ pub mod benchmarks { { fn create_asset_kind(seed: u32) -> VersionedLocatableAsset { VersionedLocatableAsset::V3 { - location: xcm::v3::MultiLocation::new( + location: xcm::v3::Location::new( Parents::get(), [xcm::v3::Junction::Parachain(ParaId::get())], ), - asset_id: xcm::v3::MultiLocation::new( + asset_id: xcm::v3::Location::new( 0, [ xcm::v3::Junction::PalletInstance(seed.try_into().unwrap()), @@ -264,7 +270,7 @@ mod tests { pub const AvailableBlockRatio: Perbill = Perbill::one(); } - #[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] + #[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { type BaseCallFilter = frame_support::traits::Everything; type RuntimeOrigin = RuntimeOrigin; @@ -366,8 +372,14 @@ mod tests { #[test] fn test_fees_and_tip_split() { new_test_ext().execute_with(|| { - let fee = Balances::issue(10); - let tip = Balances::issue(20); + let fee = + as frame_support::traits::fungible::Balanced< + AccountId, + >>::issue(10); + let tip = + as frame_support::traits::fungible::Balanced< + AccountId, + >>::issue(20); assert_eq!(Balances::free_balance(Treasury::account_id()), 0); assert_eq!(Balances::free_balance(TEST_ACCOUNT), 0); diff --git a/polkadot/runtime/common/src/integration_tests.rs b/polkadot/runtime/common/src/integration_tests.rs index f551743b395cbdb3ffa1748b75c2a48d782a0d4a..91b64ef7259c3c260ca39e30a8e4dc63362bf339 100644 --- a/polkadot/runtime/common/src/integration_tests.rs +++ b/polkadot/runtime/common/src/integration_tests.rs @@ -36,6 +36,7 @@ use pallet_identity::{self, legacy::IdentityInfo}; use parity_scale_codec::Encode; use primitives::{ BlockNumber, HeadData, Id as ParaId, SessionIndex, ValidationCode, LOWEST_PUBLIC_ID, + MAX_CODE_SIZE, }; use runtime_parachains::{ configuration, origin, paras, shared, Origin as ParaOrigin, ParaLifecycle, @@ -114,7 +115,7 @@ parameter_types! { ); } -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { type BaseCallFilter = frame_support::traits::Everything; type BlockWeights = BlockWeights; @@ -315,7 +316,7 @@ pub fn new_test_ext() -> TestExternalities { let mut t = frame_system::GenesisConfig::::default().build_storage().unwrap(); configuration::GenesisConfig:: { config: configuration::HostConfiguration { - max_code_size: 2 * 1024 * 1024, // 2 MB + max_code_size: MAX_CODE_SIZE, max_head_data_size: 1 * 1024 * 1024, // 1 MB ..Default::default() }, @@ -347,7 +348,7 @@ const VALIDATORS: &[Sr25519Keyring] = &[ fn maybe_new_session(n: u32) { if n % BLOCKS_PER_SESSION == 0 { - let session_index = shared::Pallet::::session_index() + 1; + let session_index = shared::CurrentSessionIndex::::get() + 1; let validators_pub_keys = validators_public_keys(VALIDATORS); shared::Pallet::::set_session_index(session_index); @@ -463,7 +464,7 @@ fn basic_end_to_end_works() { 200 + offset, // Block End None, )); - let fund_2 = Crowdloan::funds(ParaId::from(para_2)).unwrap(); + let fund_2 = crowdloan::Funds::::get(ParaId::from(para_2)).unwrap(); let crowdloan_account = Crowdloan::fund_account_id(fund_2.fund_index); // Auction ending begins on block 100 + offset, so we make a bid before then. @@ -825,7 +826,7 @@ fn competing_bids() { run_to_block(starting_block + 110); // Appropriate Paras should have won slots - let fund_1 = Crowdloan::funds(ParaId::from(2000)).unwrap(); + let fund_1 = crowdloan::Funds::::get(ParaId::from(2000)).unwrap(); let crowdloan_1 = Crowdloan::fund_account_id(fund_1.fund_index); assert_eq!( slots::Leases::::get(ParaId::from(2000)), @@ -911,7 +912,7 @@ fn basic_swap_works() { 200, // Block End None, )); - let fund = Crowdloan::funds(ParaId::from(2000)).unwrap(); + let fund = crowdloan::Funds::::get(ParaId::from(2000)).unwrap(); let crowdloan_account = Crowdloan::fund_account_id(fund.fund_index); // Bunch of contributions @@ -931,7 +932,7 @@ fn basic_swap_works() { // ----------------------------------------- para deposit --- crowdloan let crowdloan_deposit = 100; let para_id_deposit = ::ParaDeposit::get(); - let code_deposit = configuration::Pallet::::config().max_code_size * + let code_deposit = configuration::ActiveConfig::::get().max_code_size * ::DataDepositPerByte::get(); // Para 2000 has a genesis head size of 10. @@ -943,16 +944,16 @@ fn basic_swap_works() { assert_eq!(Balances::reserved_balance(&account_id(2)), para_id_deposit + code_deposit + 20); assert_eq!(Balances::reserved_balance(&crowdloan_account), total); // Crowdloan is appropriately set - assert!(Crowdloan::funds(ParaId::from(2000)).is_some()); - assert!(Crowdloan::funds(ParaId::from(2001)).is_none()); + assert!(crowdloan::Funds::::get(ParaId::from(2000)).is_some()); + assert!(crowdloan::Funds::::get(ParaId::from(2001)).is_none()); // New leases will start on block 400 let lease_start_block = 400; run_to_block(lease_start_block); // Slots are won by Para 1 - assert!(!Slots::lease(ParaId::from(2000)).is_empty()); - assert!(Slots::lease(ParaId::from(2001)).is_empty()); + assert!(!slots::Leases::::get(ParaId::from(2000)).is_empty()); + assert!(slots::Leases::::get(ParaId::from(2001)).is_empty()); // 2 sessions later it is a parachain run_to_block(lease_start_block + 20); @@ -985,11 +986,11 @@ fn basic_swap_works() { assert_eq!(Balances::reserved_balance(&account_id(1)), crowdloan_deposit); assert_eq!(Balances::reserved_balance(&account_id(2)), para_id_deposit + code_deposit + 20); // Crowdloan ownership is swapped - assert!(Crowdloan::funds(ParaId::from(2000)).is_none()); - assert!(Crowdloan::funds(ParaId::from(2001)).is_some()); + assert!(crowdloan::Funds::::get(ParaId::from(2000)).is_none()); + assert!(crowdloan::Funds::::get(ParaId::from(2001)).is_some()); // Slot is swapped - assert!(Slots::lease(ParaId::from(2000)).is_empty()); - assert!(!Slots::lease(ParaId::from(2001)).is_empty()); + assert!(slots::Leases::::get(ParaId::from(2000)).is_empty()); + assert!(!slots::Leases::::get(ParaId::from(2001)).is_empty()); // Cant dissolve assert_noop!( @@ -1060,7 +1061,9 @@ fn parachain_swap_works() { assert_eq!(Paras::lifecycle(ParaId::from(2001)), Some(ParaLifecycle::Onboarding)); assert_eq!( - Balances::total_balance(&Crowdloan::fund_account_id(Crowdloan::next_fund_index())), + Balances::total_balance(&Crowdloan::fund_account_id( + crowdloan::NextFundIndex::::get() + )), 0 ); @@ -1089,7 +1092,7 @@ fn parachain_swap_works() { end, // Block End None, )); - let winner_fund = Crowdloan::funds(ParaId::from(winner)).unwrap(); + let winner_fund = crowdloan::Funds::::get(ParaId::from(winner)).unwrap(); let crowdloan_account = Crowdloan::fund_account_id(winner_fund.fund_index); // Bunch of contributions @@ -1106,7 +1109,7 @@ fn parachain_swap_works() { run_to_block(end); // Crowdloan is appropriately set - assert!(Crowdloan::funds(ParaId::from(winner)).is_some()); + assert!(crowdloan::Funds::::get(ParaId::from(winner)).is_some()); // New leases will start on block lease period index * 100 let lease_start_block = lease_period_index_start * 100; @@ -1115,8 +1118,8 @@ fn parachain_swap_works() { start_auction(4u32, 2000, 200); // Slots are won by Para 1 - assert!(!Slots::lease(ParaId::from(2000)).is_empty()); - assert!(Slots::lease(ParaId::from(2001)).is_empty()); + assert!(!slots::Leases::::get(ParaId::from(2000)).is_empty()); + assert!(slots::Leases::::get(ParaId::from(2001)).is_empty()); // 2 sessions later it is a parachain run_to_block(4 * 100 + 20); @@ -1126,8 +1129,8 @@ fn parachain_swap_works() { // Let's repeat the process now for another parachain. start_auction(6u32, 2001, 500); // Slots are won by Para 1 - assert!(!Slots::lease(ParaId::from(2000)).is_empty()); - assert!(!Slots::lease(ParaId::from(2001)).is_empty()); + assert!(!slots::Leases::::get(ParaId::from(2000)).is_empty()); + assert!(!slots::Leases::::get(ParaId::from(2001)).is_empty()); // 2 sessions later it is a parachain run_to_block(6 * 100 + 20); @@ -1144,22 +1147,22 @@ fn parachain_swap_works() { assert_eq!(slots::Leases::::get(ParaId::from(2000)).len(), 6); assert_eq!(slots::Leases::::get(ParaId::from(2001)).len(), 8); - let fund_2000 = Crowdloan::funds(ParaId::from(2000)).unwrap(); + let fund_2000 = crowdloan::Funds::::get(ParaId::from(2000)).unwrap(); assert_eq!(fund_2000.fund_index, 0); assert_eq!( Balances::reserved_balance(&Crowdloan::fund_account_id(fund_2000.fund_index)), fund_2000.raised ); - let fund_2001 = Crowdloan::funds(ParaId::from(2001)).unwrap(); + let fund_2001 = crowdloan::Funds::::get(ParaId::from(2001)).unwrap(); assert_eq!(fund_2001.fund_index, 1); assert_eq!( Balances::reserved_balance(&Crowdloan::fund_account_id(fund_2001.fund_index)), fund_2001.raised ); - assert_eq!(Slots::lease(ParaId::from(2000)).len(), 6); - assert_eq!(Slots::lease(ParaId::from(2001)).len(), 8); + assert_eq!(slots::Leases::::get(ParaId::from(2000)).len(), 6); + assert_eq!(slots::Leases::::get(ParaId::from(2001)).len(), 8); // Now we swap them. assert_ok!(Registrar::swap( @@ -1181,14 +1184,14 @@ fn parachain_swap_works() { )); // Crowdloan Swapped - let fund_2000 = Crowdloan::funds(ParaId::from(2000)).unwrap(); + let fund_2000 = crowdloan::Funds::::get(ParaId::from(2000)).unwrap(); assert_eq!(fund_2000.fund_index, 1); assert_eq!( Balances::reserved_balance(&Crowdloan::fund_account_id(fund_2000.fund_index)), fund_2000.raised ); - let fund_2001 = Crowdloan::funds(ParaId::from(2001)).unwrap(); + let fund_2001 = crowdloan::Funds::::get(ParaId::from(2001)).unwrap(); assert_eq!(fund_2001.fund_index, 0); assert_eq!( Balances::reserved_balance(&Crowdloan::fund_account_id(fund_2001.fund_index)), @@ -1196,8 +1199,8 @@ fn parachain_swap_works() { ); // Slots Swapped - assert_eq!(Slots::lease(ParaId::from(2000)).len(), 8); - assert_eq!(Slots::lease(ParaId::from(2001)).len(), 6); + assert_eq!(slots::Leases::::get(ParaId::from(2000)).len(), 8); + assert_eq!(slots::Leases::::get(ParaId::from(2001)).len(), 6); }) } @@ -1262,7 +1265,7 @@ fn crowdloan_ending_period_bid() { 200, // Block End None, )); - let fund = Crowdloan::funds(ParaId::from(2000)).unwrap(); + let fund = crowdloan::Funds::::get(ParaId::from(2000)).unwrap(); let crowdloan_account = Crowdloan::fund_account_id(fund.fund_index); // Bunch of contributions @@ -1296,7 +1299,7 @@ fn crowdloan_ending_period_bid() { winning[SlotRange::ZeroThree as u8 as usize] = Some((crowdloan_account.clone(), ParaId::from(2000), total)); - assert_eq!(Auctions::winning(0), Some(winning)); + assert_eq!(auctions::Winning::::get(0), Some(winning)); run_to_block(ends_at + 1); @@ -1309,7 +1312,7 @@ fn crowdloan_ending_period_bid() { winning[SlotRange::ZeroOne as u8 as usize] = Some((account_id(2), ParaId::from(2001), 900)); winning[SlotRange::ZeroThree as u8 as usize] = Some((crowdloan_account.clone(), ParaId::from(2000), total + 900)); - assert_eq!(Auctions::winning(2), Some(winning)); + assert_eq!(auctions::Winning::::get(2), Some(winning)); }) } @@ -1614,7 +1617,7 @@ fn cant_bid_on_existing_lease_periods() { 400, // Long block end None, )); - let fund = Crowdloan::funds(ParaId::from(2000)).unwrap(); + let fund = crowdloan::Funds::::get(ParaId::from(2000)).unwrap(); let crowdloan_account = Crowdloan::fund_account_id(fund.fund_index); // Bunch of contributions @@ -1655,7 +1658,7 @@ fn cant_bid_on_existing_lease_periods() { // Poke the crowdloan into `NewRaise` assert_ok!(Crowdloan::poke(signed(1), ParaId::from(2000))); - assert_eq!(Crowdloan::new_raise(), vec![ParaId::from(2000)]); + assert_eq!(crowdloan::NewRaise::::get(), vec![ParaId::from(2000)]); // Beginning of ending block. run_to_block(starting_block + 100); diff --git a/polkadot/runtime/common/src/lib.rs b/polkadot/runtime/common/src/lib.rs index bd49d3cccc9cac99f3a11b698629dfd51b847816..65161764ccd7bf363a85238fbf7a708421561743 100644 --- a/polkadot/runtime/common/src/lib.rs +++ b/polkadot/runtime/common/src/lib.rs @@ -63,6 +63,9 @@ pub use sp_runtime::BuildStorage; /// Implementations of some helper traits passed into runtime modules as associated types. pub use impls::ToAuthor; +#[deprecated( + note = "Please use fungible::Credit instead. This type will be removed some time after March 2024." +)] pub type NegativeImbalance = as Currency< ::AccountId, >>::NegativeImbalance; diff --git a/polkadot/runtime/common/src/paras_registrar/migration.rs b/polkadot/runtime/common/src/paras_registrar/migration.rs index f977674a1e4e22254bcac6e68cc7bdf20711a043..18bb6bbfb559a23e44109230ad7fd87d0b2682ca 100644 --- a/polkadot/runtime/common/src/paras_registrar/migration.rs +++ b/polkadot/runtime/common/src/paras_registrar/migration.rs @@ -15,7 +15,7 @@ // along with Polkadot. If not, see . use super::*; -use frame_support::traits::{Contains, OnRuntimeUpgrade}; +use frame_support::traits::{Contains, UncheckedOnRuntimeUpgrade}; #[derive(Encode, Decode)] pub struct ParaInfoV1 { @@ -27,7 +27,7 @@ pub struct ParaInfoV1 { pub struct VersionUncheckedMigrateToV1( sp_std::marker::PhantomData<(T, UnlockParaIds)>, ); -impl> OnRuntimeUpgrade +impl> UncheckedOnRuntimeUpgrade for VersionUncheckedMigrateToV1 { fn on_runtime_upgrade() -> Weight { diff --git a/polkadot/runtime/common/src/paras_registrar/mod.rs b/polkadot/runtime/common/src/paras_registrar/mod.rs index c05c8a1ae00ba4e8a5a97095ad15a0a9a618cbbe..cc949c9d3f626407b77590b35d44177a847fedae 100644 --- a/polkadot/runtime/common/src/paras_registrar/mod.rs +++ b/polkadot/runtime/common/src/paras_registrar/mod.rs @@ -26,10 +26,10 @@ use frame_support::{ traits::{Currency, Get, ReservableCurrency}, }; use frame_system::{self, ensure_root, ensure_signed}; -use primitives::{HeadData, Id as ParaId, ValidationCode, LOWEST_PUBLIC_ID}; +use primitives::{HeadData, Id as ParaId, ValidationCode, LOWEST_PUBLIC_ID, MIN_CODE_SIZE}; use runtime_parachains::{ configuration, ensure_parachain, - paras::{self, ParaGenesisArgs, SetGoAhead}, + paras::{self, ParaGenesisArgs, UpgradeStrategy}, Origin, ParaLifecycle, }; use sp_std::{prelude::*, result}; @@ -106,7 +106,7 @@ pub mod pallet { use frame_support::pallet_prelude::*; use frame_system::pallet_prelude::*; - /// The current storage version. + /// The in-code storage version. const STORAGE_VERSION: StorageVersion = StorageVersion::new(1); #[pallet::pallet] @@ -182,8 +182,8 @@ pub mod pallet { ParaLocked, /// The ID given for registration has not been reserved. NotReserved, - /// Registering parachain with empty code is not allowed. - EmptyCode, + /// The validation code is invalid. + InvalidCode, /// Cannot perform a parachain slot / lifecycle swap. Check that the state of both paras /// are correct for the swap to work. CannotSwap, @@ -408,6 +408,13 @@ pub mod pallet { /// Schedule a parachain upgrade. /// + /// This will kick off a check of `new_code` by all validators. After the majority of the + /// validators have reported on the validity of the code, the code will either be enacted + /// or the upgrade will be rejected. If the code will be enacted, the current code of the + /// parachain will be overwritten directly. This means that any PoV will be checked by this + /// new code. The parachain itself will not be informed explictely that the validation code + /// has changed. + /// /// Can be called by Root, the parachain, or the parachain manager if the parachain is /// unlocked. #[pallet::call_index(7)] @@ -418,7 +425,11 @@ pub mod pallet { new_code: ValidationCode, ) -> DispatchResult { Self::ensure_root_para_or_owner(origin, para)?; - runtime_parachains::schedule_code_upgrade::(para, new_code, SetGoAhead::No)?; + runtime_parachains::schedule_code_upgrade::( + para, + new_code, + UpgradeStrategy::ApplyAtExpectedBlock, + )?; Ok(()) } @@ -451,7 +462,7 @@ impl Registrar for Pallet { // All lease holding parachains. Ordered ascending by ParaId. On-demand parachains are not // included. fn parachains() -> Vec { - paras::Pallet::::parachains() + paras::Parachains::::get() } // Return if a para is a parathread (on-demand parachain) @@ -519,14 +530,14 @@ impl Registrar for Pallet { #[cfg(any(feature = "runtime-benchmarks", test))] fn worst_head_data() -> HeadData { - let max_head_size = configuration::Pallet::::config().max_head_data_size; + let max_head_size = configuration::ActiveConfig::::get().max_head_data_size; assert!(max_head_size > 0, "max_head_data can't be zero for generating worst head data."); vec![0u8; max_head_size as usize].into() } #[cfg(any(feature = "runtime-benchmarks", test))] fn worst_validation_code() -> ValidationCode { - let max_code_size = configuration::Pallet::::config().max_code_size; + let max_code_size = configuration::ActiveConfig::::get().max_code_size; assert!(max_code_size > 0, "max_code_size can't be zero for generating worst code data."); let validation_code = vec![0u8; max_code_size as usize]; validation_code.into() @@ -656,8 +667,8 @@ impl Pallet { validation_code: ValidationCode, para_kind: ParaKind, ) -> Result<(ParaGenesisArgs, BalanceOf), sp_runtime::DispatchError> { - let config = configuration::Pallet::::config(); - ensure!(validation_code.0.len() > 0, Error::::EmptyCode); + let config = configuration::ActiveConfig::::get(); + ensure!(validation_code.0.len() >= MIN_CODE_SIZE as usize, Error::::InvalidCode); ensure!(validation_code.0.len() <= config.max_code_size as usize, Error::::CodeTooLarge); ensure!( genesis_head.0.len() <= config.max_head_data_size as usize, @@ -712,7 +723,7 @@ mod tests { }; use frame_system::limits; use pallet_balances::Error as BalancesError; - use primitives::{Balance, BlockNumber, SessionIndex}; + use primitives::{Balance, BlockNumber, SessionIndex, MAX_CODE_SIZE}; use runtime_parachains::{configuration, origin, shared}; use sp_core::H256; use sp_io::TestExternalities; @@ -757,7 +768,7 @@ mod tests { limits::BlockLength::max_with_normal_ratio(4 * 1024 * 1024, NORMAL_RATIO); } - #[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] + #[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { type BaseCallFilter = frame_support::traits::Everything; type RuntimeOrigin = RuntimeOrigin; @@ -849,7 +860,7 @@ mod tests { configuration::GenesisConfig:: { config: configuration::HostConfiguration { - max_code_size: 2 * 1024 * 1024, // 2 MB + max_code_size: MAX_CODE_SIZE, max_head_data_size: 1 * 1024 * 1024, // 1 MB ..Default::default() }, @@ -904,7 +915,7 @@ mod tests { } // Session change every 3 blocks. if (b + 1) % BLOCKS_PER_SESSION == 0 { - let session_index = shared::Pallet::::session_index() + 1; + let session_index = shared::CurrentSessionIndex::::get() + 1; let validators_pub_keys = VALIDATORS.iter().map(|v| v.public().into()).collect(); shared::Pallet::::set_session_index(session_index); @@ -936,11 +947,11 @@ mod tests { } fn max_code_size() -> u32 { - Configuration::config().max_code_size + configuration::ActiveConfig::::get().max_code_size } fn max_head_size() -> u32 { - Configuration::config().max_head_data_size + configuration::ActiveConfig::::get().max_head_data_size } #[test] @@ -1032,6 +1043,51 @@ mod tests { }); } + #[test] + fn schedule_code_upgrade_validates_code() { + new_test_ext().execute_with(|| { + const START_SESSION_INDEX: SessionIndex = 1; + run_to_session(START_SESSION_INDEX); + + let para_id = LOWEST_PUBLIC_ID; + assert!(!Parachains::is_parathread(para_id)); + + let validation_code = test_validation_code(32); + assert_ok!(Registrar::reserve(RuntimeOrigin::signed(1))); + assert_eq!(Balances::reserved_balance(&1), ::ParaDeposit::get()); + assert_ok!(Registrar::register( + RuntimeOrigin::signed(1), + para_id, + test_genesis_head(32), + validation_code.clone(), + )); + conclude_pvf_checking::(&validation_code, VALIDATORS, START_SESSION_INDEX); + + run_to_session(START_SESSION_INDEX + 2); + assert!(Parachains::is_parathread(para_id)); + + let new_code = test_validation_code(0); + assert_noop!( + Registrar::schedule_code_upgrade( + RuntimeOrigin::signed(1), + para_id, + new_code.clone(), + ), + paras::Error::::InvalidCode + ); + + let new_code = test_validation_code(max_code_size() as usize + 1); + assert_noop!( + Registrar::schedule_code_upgrade( + RuntimeOrigin::signed(1), + para_id, + new_code.clone(), + ), + paras::Error::::InvalidCode + ); + }); + } + #[test] fn register_handles_basic_errors() { new_test_ext().execute_with(|| { @@ -1310,7 +1366,7 @@ mod tests { RuntimeOrigin::signed(1), para_id, vec![1; 3].into(), - vec![1, 2, 3].into(), + test_validation_code(32) )); assert_noop!(Registrar::add_lock(RuntimeOrigin::signed(2), para_id), BadOrigin); @@ -1473,7 +1529,7 @@ mod benchmarking { use crate::traits::Registrar as RegistrarT; use frame_support::assert_ok; use frame_system::RawOrigin; - use primitives::{MAX_CODE_SIZE, MAX_HEAD_DATA_SIZE}; + use primitives::{MAX_CODE_SIZE, MAX_HEAD_DATA_SIZE, MIN_CODE_SIZE}; use runtime_parachains::{paras, shared, Origin as ParaOrigin}; use sp_runtime::traits::Bounded; @@ -1604,7 +1660,7 @@ mod benchmarking { } schedule_code_upgrade { - let b in 1 .. MAX_CODE_SIZE; + let b in MIN_CODE_SIZE .. MAX_CODE_SIZE; let new_code = ValidationCode(vec![0; b as usize]); let para_id = ParaId::from(1000); }: _(RawOrigin::Root, para_id, new_code) diff --git a/polkadot/runtime/common/src/paras_sudo_wrapper.rs b/polkadot/runtime/common/src/paras_sudo_wrapper.rs index 4735c176329192abc586e1765b08a0712cbe6fc0..b56dc96af436d0bdd2e4c4313e426a6e7bfc2995 100644 --- a/polkadot/runtime/common/src/paras_sudo_wrapper.rs +++ b/polkadot/runtime/common/src/paras_sudo_wrapper.rs @@ -146,9 +146,9 @@ pub mod pallet { xcm: Box, ) -> DispatchResult { ensure_root(origin)?; - ensure!(>::is_valid_para(id), Error::::ParaDoesntExist); - let config = >::config(); - >::queue_downward_message(&config, id, xcm.encode()).map_err(|e| match e + ensure!(paras::Pallet::::is_valid_para(id), Error::::ParaDoesntExist); + let config = configuration::ActiveConfig::::get(); + dmp::Pallet::::queue_downward_message(&config, id, xcm.encode()).map_err(|e| match e { dmp::QueueDownwardMessageError::ExceedsMaxMessageSize => Error::::ExceedsMaxMessageSize.into(), @@ -170,13 +170,13 @@ pub mod pallet { ) -> DispatchResult { ensure_root(origin)?; - >::init_open_channel( + hrmp::Pallet::::init_open_channel( sender, recipient, max_capacity, max_message_size, )?; - >::accept_open_channel(recipient, sender)?; + hrmp::Pallet::::accept_open_channel(recipient, sender)?; Ok(()) } } diff --git a/polkadot/runtime/common/src/purchase.rs b/polkadot/runtime/common/src/purchase.rs index 301f1f21fbce90d311c9b06ae376f2c99931ef27..b90bbb3a7cfb87c8753114de74d12119ad8b6c56 100644 --- a/polkadot/runtime/common/src/purchase.rs +++ b/polkadot/runtime/common/src/purchase.rs @@ -425,8 +425,8 @@ pub mod pallet { impl Pallet { fn verify_signature(who: &T::AccountId, signature: &[u8]) -> Result<(), DispatchError> { // sr25519 always expects a 64 byte signature. - let signature: AnySignature = sr25519::Signature::from_slice(signature) - .ok_or(Error::::InvalidSignature)? + let signature: AnySignature = sr25519::Signature::try_from(signature) + .map_err(|_| Error::::InvalidSignature)? .into(); // In Polkadot, the AccountId is always the same as the 32 byte public key. @@ -512,7 +512,7 @@ mod tests { pub const BlockHashCount: u32 = 250; } - #[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] + #[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { type BaseCallFilter = frame_support::traits::Everything; type BlockWeights = (); diff --git a/polkadot/runtime/common/src/slots/mod.rs b/polkadot/runtime/common/src/slots/mod.rs index 51bd0ba4debe6531da9cca604bb6aa069ad016f3..738569ff4416c0049ca134e5ea94cf5e9245f81d 100644 --- a/polkadot/runtime/common/src/slots/mod.rs +++ b/polkadot/runtime/common/src/slots/mod.rs @@ -114,7 +114,6 @@ pub mod pallet { /// /// It is illegal for a `None` value to trail in the list. #[pallet::storage] - #[pallet::getter(fn lease)] pub type Leases = StorageMap<_, Twox64Concat, ParaId, Vec)>>, ValueQuery>; @@ -530,7 +529,7 @@ mod tests { pub const BlockHashCount: u32 = 250; } - #[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] + #[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { type BaseCallFilter = frame_support::traits::Everything; type BlockWeights = (); diff --git a/polkadot/runtime/common/src/xcm_sender.rs b/polkadot/runtime/common/src/xcm_sender.rs index 7f1100a13619a8c5e1048afd4a34d2d977aa8914..0cbc2e603c8e776b2377f15569a2c38934753967 100644 --- a/polkadot/runtime/common/src/xcm_sender.rs +++ b/polkadot/runtime/common/src/xcm_sender.rs @@ -116,11 +116,11 @@ where // Downward message passing. let xcm = msg.take().ok_or(MissingArgument)?; - let config = >::config(); + let config = configuration::ActiveConfig::::get(); let para = id.into(); let price = P::price_for_delivery(para, &xcm); let blob = W::wrap_version(&d, xcm).map_err(|()| DestinationUnsupported)?.encode(); - >::can_queue_downward_message(&config, ¶, &blob) + dmp::Pallet::::can_queue_downward_message(&config, ¶, &blob) .map_err(Into::::into)?; Ok(((config, para, blob), price)) @@ -130,16 +130,16 @@ where (config, para, blob): (HostConfiguration>, ParaId, Vec), ) -> Result { let hash = sp_io::hashing::blake2_256(&blob[..]); - >::queue_downward_message(&config, para, blob) + dmp::Pallet::::queue_downward_message(&config, para, blob) .map(|()| hash) .map_err(|_| SendError::Transport(&"Error placing into DMP queue")) } } -/// Implementation of `pallet_xcm_benchmarks::EnsureDelivery` which helps to ensure delivery to the +/// Implementation of `xcm_builder::EnsureDelivery` which helps to ensure delivery to the /// `ParaId` parachain (sibling or child). Deposits existential deposit for origin (if needed). /// Deposits estimated fee to the origin account (if needed). -/// Allows to trigger additional logic for specific `ParaId` (e.g. open HRMP channel) (if neeeded). +/// Allows to trigger additional logic for specific `ParaId` (e.g. open HRMP channel) (if needed). #[cfg(feature = "runtime-benchmarks")] pub struct ToParachainDeliveryHelper< XcmConfig, @@ -164,7 +164,7 @@ impl< PriceForDelivery: PriceForMessageDelivery, Parachain: Get, ToParachainHelper: EnsureForParachain, - > pallet_xcm_benchmarks::EnsureDelivery + > xcm_builder::EnsureDelivery for ToParachainDeliveryHelper< XcmConfig, ExistentialDeposit, @@ -175,7 +175,7 @@ impl< { fn ensure_successful_delivery( origin_ref: &Location, - _dest: &Location, + dest: &Location, fee_reason: xcm_executor::traits::FeeReason, ) -> (Option, Option) { use xcm_executor::{ @@ -183,6 +183,15 @@ impl< FeesMode, }; + // check if the destination matches the expected `Parachain`. + if let Some(Parachain(para_id)) = dest.first_interior() { + if ParaId::from(*para_id) != Parachain::get().into() { + return (None, None) + } + } else { + return (None, None) + } + let mut fees_mode = None; if !XcmConfig::FeeManager::is_waived(Some(origin_ref), fee_reason) { // if not waived, we need to set up accounts for paying and receiving fees diff --git a/polkadot/runtime/parachains/Cargo.toml b/polkadot/runtime/parachains/Cargo.toml index 507df01ac4816c07b5dd8533fff483c5489631a9..dff8549f29f3ad38748c3c2cc5b21c328356196a 100644 --- a/polkadot/runtime/parachains/Cargo.toml +++ b/polkadot/runtime/parachains/Cargo.toml @@ -13,10 +13,10 @@ workspace = true impl-trait-for-tuples = "0.2.2" bitvec = { version = "1.0.0", default-features = false, features = ["alloc"] } parity-scale-codec = { version = "3.6.1", default-features = false, features = ["derive", "max-encoded-len"] } -log = { version = "0.4.17", default-features = false } +log = { workspace = true } rustc-hex = { version = "2.1.0", default-features = false } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.195", default-features = false, features = ["alloc", "derive"] } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +serde = { features = ["alloc", "derive"], workspace = true } derive_more = "0.99.17" bitflags = "1.3.2" @@ -59,7 +59,7 @@ polkadot-runtime-metrics = { path = "../metrics", default-features = false } polkadot-core-primitives = { path = "../../core-primitives", default-features = false } [dev-dependencies] -futures = "0.3.21" +futures = "0.3.30" hex-literal = "0.4.1" keyring = { package = "sp-keyring", path = "../../../substrate/primitives/keyring" } frame-support-test = { path = "../../../substrate/frame/support/test" } @@ -69,7 +69,8 @@ sp-tracing = { path = "../../../substrate/primitives/tracing" } sp-crypto-hashing = { path = "../../../substrate/primitives/crypto/hashing" } thousands = "0.2.0" assert_matches = "1" -serde_json = "1.0.111" +rstest = "0.18.2" +serde_json = { workspace = true, default-features = true } [features] default = ["std"] diff --git a/polkadot/runtime/parachains/src/assigner_coretime/mock_helpers.rs b/polkadot/runtime/parachains/src/assigner_coretime/mock_helpers.rs index 71c3f1fa39f7c6c127ac954b8299fb16a323e72d..e2ba0b4f7ea5d5ca2eb49c903afb764229e0491f 100644 --- a/polkadot/runtime/parachains/src/assigner_coretime/mock_helpers.rs +++ b/polkadot/runtime/parachains/src/assigner_coretime/mock_helpers.rs @@ -64,11 +64,12 @@ impl GenesisConfigBuilder { pub(super) fn build(self) -> MockGenesisConfig { let mut genesis = default_genesis_config(); let config = &mut genesis.configuration.config; - config.coretime_cores = self.on_demand_cores; - config.on_demand_base_fee = self.on_demand_base_fee; - config.on_demand_fee_variability = self.on_demand_fee_variability; - config.on_demand_queue_max_size = self.on_demand_max_queue_size; - config.on_demand_target_queue_utilization = self.on_demand_target_queue_utilization; + config.scheduler_params.num_cores = self.on_demand_cores; + config.scheduler_params.on_demand_base_fee = self.on_demand_base_fee; + config.scheduler_params.on_demand_fee_variability = self.on_demand_fee_variability; + config.scheduler_params.on_demand_queue_max_size = self.on_demand_max_queue_size; + config.scheduler_params.on_demand_target_queue_utilization = + self.on_demand_target_queue_utilization; let paras = &mut genesis.paras.paras; for para_id in self.onboarded_on_demand_chains { diff --git a/polkadot/runtime/parachains/src/assigner_coretime/mod.rs b/polkadot/runtime/parachains/src/assigner_coretime/mod.rs index 9da81dc816cabeb7019e44b8f88c0f526582830d..1e821dd86846824719f6d84f0bdc0e19222ddd84 100644 --- a/polkadot/runtime/parachains/src/assigner_coretime/mod.rs +++ b/polkadot/runtime/parachains/src/assigner_coretime/mod.rs @@ -30,7 +30,7 @@ mod tests; use crate::{ assigner_on_demand, configuration, paras::AssignCoretime, - scheduler::common::{Assignment, AssignmentProvider, AssignmentProviderConfig}, + scheduler::common::{Assignment, AssignmentProvider}, ParaId, }; @@ -256,7 +256,7 @@ pub mod pallet { impl AssignmentProvider> for Pallet { fn pop_assignment_for_core(core_idx: CoreIndex) -> Option { - let now = >::block_number(); + let now = frame_system::Pallet::::block_number(); CoreDescriptors::::mutate(core_idx, |core_state| { Self::ensure_workload(now, core_idx, core_state); @@ -316,14 +316,6 @@ impl AssignmentProvider> for Pallet { } } - fn get_provider_config(_core_idx: CoreIndex) -> AssignmentProviderConfig> { - let config = >::config(); - AssignmentProviderConfig { - max_availability_timeouts: config.on_demand_retries, - ttl: config.on_demand_ttl, - } - } - #[cfg(any(feature = "runtime-benchmarks", test))] fn get_mock_assignment(_: CoreIndex, para_id: primitives::Id) -> Assignment { // Given that we are not tracking anything in `Bulk` assignments, it is safe to always @@ -332,8 +324,8 @@ impl AssignmentProvider> for Pallet { } fn session_core_count() -> u32 { - let config = >::config(); - config.coretime_cores + let config = configuration::ActiveConfig::::get(); + config.scheduler_params.num_cores } } @@ -481,9 +473,9 @@ impl AssignCoretime for Pallet { let current_block = frame_system::Pallet::::block_number(); // Add a new core and assign the para to it. - let mut config = >::config(); - let core = config.coretime_cores; - config.coretime_cores.saturating_inc(); + let mut config = configuration::ActiveConfig::::get(); + let core = config.scheduler_params.num_cores; + config.scheduler_params.num_cores.saturating_inc(); // `assign_coretime` is only called at genesis or by root, so setting the active // config here is fine. diff --git a/polkadot/runtime/parachains/src/assigner_coretime/tests.rs b/polkadot/runtime/parachains/src/assigner_coretime/tests.rs index 998e39670f97d6f6e48d079e4544e547d702509b..5d42a9d0c8eec877292b2d5d6ca318e7df8df5b4 100644 --- a/polkadot/runtime/parachains/src/assigner_coretime/tests.rs +++ b/polkadot/runtime/parachains/src/assigner_coretime/tests.rs @@ -622,7 +622,7 @@ fn assignment_proportions_in_core_state_work() { ); } - // Case 2: Current assignment remaning < step after pop + // Case 2: Current assignment remaining < step after pop { assert_eq!( CoretimeAssigner::pop_assignment_for_core(core_idx), diff --git a/polkadot/runtime/parachains/src/assigner_on_demand/benchmarking.rs b/polkadot/runtime/parachains/src/assigner_on_demand/benchmarking.rs index 5a6060cd2b4eab88867088dee30b6fb1047bdf20..779d6f04e39638d5dfe2552c983de4715ee089d7 100644 --- a/polkadot/runtime/parachains/src/assigner_on_demand/benchmarking.rs +++ b/polkadot/runtime/parachains/src/assigner_on_demand/benchmarking.rs @@ -43,7 +43,7 @@ where { ParasShared::::set_session_index(SESSION_INDEX); let mut config = HostConfiguration::default(); - config.coretime_cores = 1; + config.scheduler_params.num_cores = 1; ConfigurationPallet::::force_set_active_config(config); let mut parachains = ParachainsCache::new(); ParasPallet::::initialize_para_now( @@ -70,11 +70,7 @@ mod benchmarks { let para_id = ParaId::from(111u32); init_parathread::(para_id); T::Currency::make_free_balance_be(&caller, BalanceOf::::max_value()); - let order = EnqueuedOrder::new(para_id); - - for _ in 0..s { - Pallet::::add_on_demand_order(order.clone(), QueuePushDirection::Back).unwrap(); - } + Pallet::::populate_queue(para_id, s); #[extrinsic_call] _(RawOrigin::Signed(caller.into()), BalanceOf::::max_value(), para_id) @@ -87,11 +83,8 @@ mod benchmarks { let para_id = ParaId::from(111u32); init_parathread::(para_id); T::Currency::make_free_balance_be(&caller, BalanceOf::::max_value()); - let order = EnqueuedOrder::new(para_id); - for _ in 0..s { - Pallet::::add_on_demand_order(order.clone(), QueuePushDirection::Back).unwrap(); - } + Pallet::::populate_queue(para_id, s); #[extrinsic_call] _(RawOrigin::Signed(caller.into()), BalanceOf::::max_value(), para_id) diff --git a/polkadot/runtime/parachains/src/assigner_on_demand/migration.rs b/polkadot/runtime/parachains/src/assigner_on_demand/migration.rs new file mode 100644 index 0000000000000000000000000000000000000000..50e5e1daf41a56bb6bb191d0e2205d2cc9bb8b52 --- /dev/null +++ b/polkadot/runtime/parachains/src/assigner_on_demand/migration.rs @@ -0,0 +1,181 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +//! A module that is responsible for migration of storage. +use super::*; +use frame_support::{ + migrations::VersionedMigration, pallet_prelude::ValueQuery, storage_alias, + traits::UncheckedOnRuntimeUpgrade, weights::Weight, +}; + +mod v0 { + use super::*; + use sp_std::collections::vec_deque::VecDeque; + + #[derive(Encode, Decode, TypeInfo, Debug, PartialEq, Clone)] + pub(super) struct EnqueuedOrder { + pub para_id: ParaId, + } + + /// Keeps track of the multiplier used to calculate the current spot price for the on demand + /// assigner. + /// NOTE: Ignoring the `OnEmpty` field for the migration. + #[storage_alias] + pub(super) type SpotTraffic = StorageValue, FixedU128, ValueQuery>; + + /// The order storage entry. Uses a VecDeque to be able to push to the front of the + /// queue from the scheduler on session boundaries. + /// NOTE: Ignoring the `OnEmpty` field for the migration. + #[storage_alias] + pub(super) type OnDemandQueue = + StorageValue, VecDeque, ValueQuery>; +} + +mod v1 { + use super::*; + + use crate::assigner_on_demand::LOG_TARGET; + + /// Migration to V1 + pub struct UncheckedMigrateToV1(sp_std::marker::PhantomData); + impl UncheckedOnRuntimeUpgrade for UncheckedMigrateToV1 { + fn on_runtime_upgrade() -> Weight { + let mut weight: Weight = Weight::zero(); + + // Migrate the current traffic value + let config = configuration::ActiveConfig::::get(); + QueueStatus::::mutate(|mut queue_status| { + Pallet::::update_spot_traffic(&config, &mut queue_status); + + let v0_queue = v0::OnDemandQueue::::take(); + // Process the v0 queue into v1. + v0_queue.into_iter().for_each(|enqueued_order| { + // Readding the old orders will use the new systems. + Pallet::::add_on_demand_order( + queue_status, + enqueued_order.para_id, + QueuePushDirection::Back, + ); + }); + }); + + // Remove the old storage. + v0::OnDemandQueue::::kill(); // 1 write + v0::SpotTraffic::::kill(); // 1 write + + // Config read + weight.saturating_accrue(T::DbWeight::get().reads(1)); + // QueueStatus read write (update_spot_traffic) + weight.saturating_accrue(T::DbWeight::get().reads_writes(1, 1)); + // Kill x 2 + weight.saturating_accrue(T::DbWeight::get().writes(2)); + + log::info!(target: LOG_TARGET, "Migrated on demand assigner storage to v1"); + weight + } + + #[cfg(feature = "try-runtime")] + fn pre_upgrade() -> Result, sp_runtime::TryRuntimeError> { + let n: u32 = v0::OnDemandQueue::::get().len() as u32; + + log::info!( + target: LOG_TARGET, + "Number of orders waiting in the queue before: {n}", + ); + + Ok(n.encode()) + } + + #[cfg(feature = "try-runtime")] + fn post_upgrade(state: Vec) -> Result<(), sp_runtime::TryRuntimeError> { + log::info!(target: LOG_TARGET, "Running post_upgrade()"); + + ensure!( + v0::OnDemandQueue::::get().is_empty(), + "OnDemandQueue should be empty after the migration" + ); + + let expected_len = u32::decode(&mut &state[..]).unwrap(); + let queue_status_size = QueueStatus::::get().size(); + ensure!( + expected_len == queue_status_size, + "Number of orders should be the same before and after migration" + ); + + let n_affinity_entries: u32 = + AffinityEntries::::iter().map(|(_index, heap)| heap.len() as u32).sum(); + let n_para_id_affinity: u32 = ParaIdAffinity::::iter() + .map(|(_para_id, affinity)| affinity.count as u32) + .sum(); + ensure!( + n_para_id_affinity == n_affinity_entries, + "Number of affinity entries should be the same as the counts in ParaIdAffinity" + ); + + Ok(()) + } + } +} + +/// Migrate `V0` to `V1` of the storage format. +pub type MigrateV0ToV1 = VersionedMigration< + 0, + 1, + v1::UncheckedMigrateToV1, + Pallet, + ::DbWeight, +>; + +#[cfg(test)] +mod tests { + use super::{v0, v1, UncheckedOnRuntimeUpgrade, Weight}; + use crate::mock::{new_test_ext, MockGenesisConfig, OnDemandAssigner, Test}; + use primitives::Id as ParaId; + + #[test] + fn migration_to_v1_preserves_queue_ordering() { + new_test_ext(MockGenesisConfig::default()).execute_with(|| { + // Place orders for paraids 1..5 + for i in 1..=5 { + v0::OnDemandQueue::::mutate(|queue| { + queue.push_back(v0::EnqueuedOrder { para_id: ParaId::new(i) }) + }); + } + + // Queue has 5 orders + let old_queue = v0::OnDemandQueue::::get(); + assert_eq!(old_queue.len(), 5); + // New queue has 0 orders + assert_eq!(OnDemandAssigner::get_queue_status().size(), 0); + + // For tests, db weight is zero. + assert_eq!( + as UncheckedOnRuntimeUpgrade>::on_runtime_upgrade(), + Weight::zero() + ); + + // New queue has 5 orders + assert_eq!(OnDemandAssigner::get_queue_status().size(), 5); + + // Compare each entry from the old queue with the entry in the new queue. + old_queue.iter().zip(OnDemandAssigner::get_free_entries().iter()).for_each( + |(old_enq, new_enq)| { + assert_eq!(old_enq.para_id, new_enq.para_id); + }, + ); + }); + } +} diff --git a/polkadot/runtime/parachains/src/assigner_on_demand/mock_helpers.rs b/polkadot/runtime/parachains/src/assigner_on_demand/mock_helpers.rs index de30330ac84e0a7715799d71d26fb42ce48efff8..f8d1a894f0e4d5c619377ba4c34158c8f6d60597 100644 --- a/polkadot/runtime/parachains/src/assigner_on_demand/mock_helpers.rs +++ b/polkadot/runtime/parachains/src/assigner_on_demand/mock_helpers.rs @@ -63,11 +63,12 @@ impl GenesisConfigBuilder { pub(super) fn build(self) -> MockGenesisConfig { let mut genesis = default_genesis_config(); let config = &mut genesis.configuration.config; - config.coretime_cores = self.on_demand_cores; - config.on_demand_base_fee = self.on_demand_base_fee; - config.on_demand_fee_variability = self.on_demand_fee_variability; - config.on_demand_queue_max_size = self.on_demand_max_queue_size; - config.on_demand_target_queue_utilization = self.on_demand_target_queue_utilization; + config.scheduler_params.num_cores = self.on_demand_cores; + config.scheduler_params.on_demand_base_fee = self.on_demand_base_fee; + config.scheduler_params.on_demand_fee_variability = self.on_demand_fee_variability; + config.scheduler_params.on_demand_queue_max_size = self.on_demand_max_queue_size; + config.scheduler_params.on_demand_target_queue_utilization = + self.on_demand_target_queue_utilization; let paras = &mut genesis.paras.paras; for para_id in self.onboarded_on_demand_chains { diff --git a/polkadot/runtime/parachains/src/assigner_on_demand/mod.rs b/polkadot/runtime/parachains/src/assigner_on_demand/mod.rs index 1b746e88694c9f105db119d351a76e336fd3fdba..598a0f10970067a67186098019e6f067798df2da 100644 --- a/polkadot/runtime/parachains/src/assigner_on_demand/mod.rs +++ b/polkadot/runtime/parachains/src/assigner_on_demand/mod.rs @@ -16,22 +16,32 @@ //! The parachain on demand assignment module. //! -//! Implements a mechanism for taking in orders for pay as you go (PAYG) or on demand -//! parachain (previously parathreads) assignments. This module is not handled by the -//! initializer but is instead instantiated in the `construct_runtime` macro. +//! Implements a mechanism for taking in orders for on-demand parachain (previously parathreads) +//! assignments. This module is not handled by the initializer but is instead instantiated in the +//! `construct_runtime` macro. //! //! The module currently limits parallel execution of blocks from the same `ParaId` via //! a core affinity mechanism. As long as there exists an affinity for a `CoreIndex` for //! a specific `ParaId`, orders for blockspace for that `ParaId` will only be assigned to -//! that `CoreIndex`. This affinity mechanism can be removed if it can be shown that parallel -//! execution is valid. +//! that `CoreIndex`. +//! +//! NOTE: Once we have elastic scaling implemented we might want to extend this module to support +//! ignoring core affinity up to a certain extend. This should be opt-in though as the parachain +//! needs to support multiple cores in the same block. If we want to enable a single parachain +//! occupying multiple cores in on-demand, we will likely add a separate order type, where the +//! intent can be made explicit. mod benchmarking; +pub mod migration; mod mock_helpers; +extern crate alloc; + #[cfg(test)] mod tests; +use core::mem::take; + use crate::{configuration, paras, scheduler::common::Assignment}; use frame_support::{ @@ -43,13 +53,17 @@ use frame_support::{ }, }; use frame_system::pallet_prelude::*; -use primitives::{CoreIndex, Id as ParaId}; +use primitives::{CoreIndex, Id as ParaId, ON_DEMAND_MAX_QUEUE_MAX_SIZE}; use sp_runtime::{ traits::{One, SaturatedConversion}, FixedPointNumber, FixedPointOperand, FixedU128, Perbill, Saturating, }; -use sp_std::{collections::vec_deque::VecDeque, prelude::*}; +use alloc::collections::BinaryHeap; +use sp_std::{ + cmp::{Ord, Ordering, PartialOrd}, + prelude::*, +}; const LOG_TARGET: &str = "runtime::parachains::assigner-on-demand"; @@ -73,17 +87,116 @@ impl WeightInfo for TestWeightInfo { } } +/// Meta data for full queue. +/// +/// This includes elements with affinity and free entries. +/// +/// The actual queue is implemented via multiple priority queues. One for each core, for entries +/// which currently have a core affinity and one free queue, with entries without any affinity yet. +/// +/// The design aims to have most queue accessess be O(1) or O(log(N)). Absolute worst case is O(N). +/// Importantly this includes all accessess that happen in a single block. Even with 50 cores, the +/// total complexity of all operations in the block should maintain above complexities. In +/// particular O(N) stays O(N), it should never be O(N*cores). +/// +/// More concrete rundown on complexity: +/// +/// - insert: O(1) for placing an order, O(log(N)) for push backs. +/// - pop_assignment_for_core: O(log(N)), O(N) worst case: Can only happen for one core, next core +/// is already less work. +/// - report_processed & push back: If affinity dropped to 0, then O(N) in the worst case. Again +/// this divides per core. +/// +/// Reads still exist, also improved slightly, but worst case we fetch all entries. +#[derive(Encode, Decode, TypeInfo)] +struct QueueStatusType { + /// Last calculated traffic value. + traffic: FixedU128, + /// The next index to use. + next_index: QueueIndex, + /// Smallest index still in use. + /// + /// In case of a completely empty queue (free + affinity queues), `next_index - smallest_index + /// == 0`. + smallest_index: QueueIndex, + /// Indices that have been freed already. + /// + /// But have a hole to `smallest_index`, so we can not yet bump `smallest_index`. This binary + /// heap is roughly bounded in the number of on demand cores: + /// + /// For a single core, elements will always be processed in order. With each core added, a + /// level of out of order execution is added. + freed_indices: BinaryHeap, +} + +impl Default for QueueStatusType { + fn default() -> QueueStatusType { + QueueStatusType { + traffic: FixedU128::default(), + next_index: QueueIndex(0), + smallest_index: QueueIndex(0), + freed_indices: BinaryHeap::new(), + } + } +} + +impl QueueStatusType { + /// How many orders are queued in total? + /// + /// This includes entries which have core affinity. + fn size(&self) -> u32 { + self.next_index + .0 + .overflowing_sub(self.smallest_index.0) + .0 + .saturating_sub(self.freed_indices.len() as u32) + } + + /// Get current next index + /// + /// to use for an element newly pushed to the back of the queue. + fn push_back(&mut self) -> QueueIndex { + let QueueIndex(next_index) = self.next_index; + self.next_index = QueueIndex(next_index.overflowing_add(1).0); + QueueIndex(next_index) + } + + /// Push something to the front of the queue + fn push_front(&mut self) -> QueueIndex { + self.smallest_index = QueueIndex(self.smallest_index.0.overflowing_sub(1).0); + self.smallest_index + } + + /// The given index is no longer part of the queue. + /// + /// This updates `smallest_index` if need be. + fn consume_index(&mut self, removed_index: QueueIndex) { + if removed_index != self.smallest_index { + self.freed_indices.push(removed_index.reverse()); + return + } + let mut index = self.smallest_index.0.overflowing_add(1).0; + // Even more to advance? + while self.freed_indices.peek() == Some(&ReverseQueueIndex(index)) { + index = index.overflowing_add(1).0; + self.freed_indices.pop(); + } + self.smallest_index = QueueIndex(index); + } +} + /// Keeps track of how many assignments a scheduler currently has at a specific `CoreIndex` for a /// specific `ParaId`. #[derive(Encode, Decode, Default, Clone, Copy, TypeInfo)] #[cfg_attr(test, derive(PartialEq, RuntimeDebug))] -pub struct CoreAffinityCount { - core_idx: CoreIndex, +struct CoreAffinityCount { + core_index: CoreIndex, count: u32, } /// An indicator as to which end of the `OnDemandQueue` an assignment will be placed. -pub enum QueuePushDirection { +#[cfg_attr(test, derive(RuntimeDebug))] +enum QueuePushDirection { Back, Front, } @@ -93,9 +206,8 @@ type BalanceOf = <::Currency as Currency<::AccountId>>::Balance; /// Errors that can happen during spot traffic calculation. -#[derive(PartialEq)] -#[cfg_attr(feature = "std", derive(Debug))] -pub enum SpotTrafficCalculationErr { +#[derive(PartialEq, RuntimeDebug)] +enum SpotTrafficCalculationErr { /// The order queue capacity is at 0. QueueCapacityIsZero, /// The queue size is larger than the queue capacity. @@ -104,15 +216,85 @@ pub enum SpotTrafficCalculationErr { Division, } +/// Type used for priority indices. +// NOTE: The `Ord` implementation for this type is unsound in the general case. +// Do not use it for anything but it's intended purpose. +#[derive(Encode, Decode, TypeInfo, Debug, PartialEq, Clone, Eq, Copy)] +struct QueueIndex(u32); + +/// QueueIndex with reverse ordering. +/// +/// Same as `Reverse(QueueIndex)`, but with all the needed traits implemented. +#[derive(Encode, Decode, TypeInfo, Debug, PartialEq, Clone, Eq, Copy)] +struct ReverseQueueIndex(u32); + +impl QueueIndex { + fn reverse(self) -> ReverseQueueIndex { + ReverseQueueIndex(self.0) + } +} + +impl Ord for QueueIndex { + fn cmp(&self, other: &Self) -> Ordering { + let diff = self.0.overflowing_sub(other.0).0; + if diff == 0 { + Ordering::Equal + } else if diff <= ON_DEMAND_MAX_QUEUE_MAX_SIZE { + Ordering::Greater + } else { + Ordering::Less + } + } +} + +impl PartialOrd for QueueIndex { + fn partial_cmp(&self, other: &Self) -> Option { + Some(self.cmp(other)) + } +} + +impl Ord for ReverseQueueIndex { + fn cmp(&self, other: &Self) -> Ordering { + QueueIndex(other.0).cmp(&QueueIndex(self.0)) + } +} +impl PartialOrd for ReverseQueueIndex { + fn partial_cmp(&self, other: &Self) -> Option { + Some(self.cmp(&other)) + } +} + /// Internal representation of an order after it has been enqueued already. -#[derive(Encode, Decode, TypeInfo, Debug, PartialEq, Clone)] -pub(super) struct EnqueuedOrder { - pub para_id: ParaId, +/// +/// This data structure is provided for a min BinaryHeap (Ord compares in reverse order with regards +/// to its elements) +#[derive(Encode, Decode, TypeInfo, Debug, PartialEq, Clone, Eq)] +struct EnqueuedOrder { + para_id: ParaId, + idx: QueueIndex, } impl EnqueuedOrder { - pub fn new(para_id: ParaId) -> Self { - Self { para_id } + fn new(idx: QueueIndex, para_id: ParaId) -> Self { + Self { idx, para_id } + } +} + +impl PartialOrd for EnqueuedOrder { + fn partial_cmp(&self, other: &Self) -> Option { + match other.idx.partial_cmp(&self.idx) { + Some(Ordering::Equal) => other.para_id.partial_cmp(&self.para_id), + o => o, + } + } +} + +impl Ord for EnqueuedOrder { + fn cmp(&self, other: &Self) -> Ordering { + match other.idx.cmp(&self.idx) { + Ordering::Equal => other.para_id.cmp(&self.para_id), + o => o, + } } } @@ -121,8 +303,11 @@ pub mod pallet { use super::*; + const STORAGE_VERSION: StorageVersion = StorageVersion::new(1); + #[pallet::pallet] #[pallet::without_storage_info] + #[pallet::storage_version(STORAGE_VERSION)] pub struct Pallet(_); #[pallet::config] @@ -141,36 +326,44 @@ pub mod pallet { type TrafficDefaultValue: Get; } - /// Creates an empty spot traffic value if one isn't present in storage already. + /// Creates an empty queue status for an empty queue with initial traffic value. #[pallet::type_value] - pub fn SpotTrafficOnEmpty() -> FixedU128 { - T::TrafficDefaultValue::get() + pub(super) fn QueueStatusOnEmpty() -> QueueStatusType { + QueueStatusType { traffic: T::TrafficDefaultValue::get(), ..Default::default() } } - /// Creates an empty on demand queue if one isn't present in storage already. #[pallet::type_value] - pub(super) fn OnDemandQueueOnEmpty() -> VecDeque { - VecDeque::new() + pub(super) fn EntriesOnEmpty() -> BinaryHeap { + BinaryHeap::new() } - /// Keeps track of the multiplier used to calculate the current spot price for the on demand - /// assigner. - #[pallet::storage] - pub(super) type SpotTraffic = - StorageValue<_, FixedU128, ValueQuery, SpotTrafficOnEmpty>; - - /// The order storage entry. Uses a VecDeque to be able to push to the front of the - /// queue from the scheduler on session boundaries. - #[pallet::storage] - pub(super) type OnDemandQueue = - StorageValue<_, VecDeque, ValueQuery, OnDemandQueueOnEmpty>; - /// Maps a `ParaId` to `CoreIndex` and keeps track of how many assignments the scheduler has in /// it's lookahead. Keeping track of this affinity prevents parallel execution of the same /// `ParaId` on two or more `CoreIndex`es. #[pallet::storage] pub(super) type ParaIdAffinity = - StorageMap<_, Twox256, ParaId, CoreAffinityCount, OptionQuery>; + StorageMap<_, Twox64Concat, ParaId, CoreAffinityCount, OptionQuery>; + + /// Overall status of queue (both free + affinity entries) + #[pallet::storage] + pub(super) type QueueStatus = + StorageValue<_, QueueStatusType, ValueQuery, QueueStatusOnEmpty>; + + /// Priority queue for all orders which don't yet (or not any more) have any core affinity. + #[pallet::storage] + pub(super) type FreeEntries = + StorageValue<_, BinaryHeap, ValueQuery, EntriesOnEmpty>; + + /// Queue entries that are currently bound to a particular core due to core affinity. + #[pallet::storage] + pub(super) type AffinityEntries = StorageMap< + _, + Twox64Concat, + CoreIndex, + BinaryHeap, + ValueQuery, + EntriesOnEmpty, + >; #[pallet::event] #[pallet::generate_deposit(pub(super) fn deposit_event)] @@ -183,9 +376,6 @@ pub mod pallet { #[pallet::error] pub enum Error { - /// The `ParaId` supplied to the `place_order` call is not a valid `ParaThread`, making the - /// call is invalid. - InvalidParaId, /// The order queue is full, `place_order` will not continue. QueueFull, /// The current spot price is higher than the max amount specified in the `place_order` @@ -196,46 +386,15 @@ pub mod pallet { #[pallet::hooks] impl Hooks> for Pallet { fn on_initialize(_now: BlockNumberFor) -> Weight { - let config = >::config(); - // Calculate spot price multiplier and store it. - let old_traffic = SpotTraffic::::get(); - match Self::calculate_spot_traffic( - old_traffic, - config.on_demand_queue_max_size, - Self::queue_size(), - config.on_demand_target_queue_utilization, - config.on_demand_fee_variability, - ) { - Ok(new_traffic) => { - // Only update storage on change - if new_traffic != old_traffic { - SpotTraffic::::set(new_traffic); - Pallet::::deposit_event(Event::::SpotTrafficSet { - traffic: new_traffic, - }); - return T::DbWeight::get().reads_writes(2, 1) - } - }, - Err(SpotTrafficCalculationErr::QueueCapacityIsZero) => { - log::debug!( - target: LOG_TARGET, - "Error calculating spot traffic: The order queue capacity is at 0." - ); - }, - Err(SpotTrafficCalculationErr::QueueSizeLargerThanCapacity) => { - log::debug!( - target: LOG_TARGET, - "Error calculating spot traffic: The queue size is larger than the queue capacity." - ); - }, - Err(SpotTrafficCalculationErr::Division) => { - log::debug!( - target: LOG_TARGET, - "Error calculating spot traffic: Arithmetic error during division, either division by 0 or over/underflow." - ); - }, - }; - T::DbWeight::get().reads_writes(2, 0) + let config = configuration::ActiveConfig::::get(); + // We need to update the spot traffic on block initialize in order to account for idle + // blocks. + QueueStatus::::mutate(|queue_status| { + Self::update_spot_traffic(&config, queue_status); + }); + + // 2 reads in config and queuestatus, at maximum 1 write to queuestatus. + T::DbWeight::get().reads_writes(2, 1) } } @@ -258,7 +417,7 @@ pub mod pallet { /// Events: /// - `SpotOrderPlaced` #[pallet::call_index(0)] - #[pallet::weight(::WeightInfo::place_order_allow_death(OnDemandQueue::::get().len() as u32))] + #[pallet::weight(::WeightInfo::place_order_allow_death(QueueStatus::::get().size()))] pub fn place_order_allow_death( origin: OriginFor, max_amount: BalanceOf, @@ -285,7 +444,7 @@ pub mod pallet { /// Events: /// - `SpotOrderPlaced` #[pallet::call_index(1)] - #[pallet::weight(::WeightInfo::place_order_keep_alive(OnDemandQueue::::get().len() as u32))] + #[pallet::weight(::WeightInfo::place_order_keep_alive(QueueStatus::::get().size()))] pub fn place_order_keep_alive( origin: OriginFor, max_amount: BalanceOf, @@ -297,10 +456,78 @@ pub mod pallet { } } +// Internal functions and interface to scheduler/wrapping assignment provider. impl Pallet where BalanceOf: FixedPointOperand, { + /// Take the next queued entry that is available for a given core index. + /// + /// Parameters: + /// - `core_index`: The core index + pub fn pop_assignment_for_core(core_index: CoreIndex) -> Option { + let entry: Result = QueueStatus::::try_mutate(|queue_status| { + AffinityEntries::::try_mutate(core_index, |affinity_entries| { + let free_entry = FreeEntries::::try_mutate(|free_entries| { + let affinity_next = affinity_entries.peek(); + let free_next = free_entries.peek(); + let pick_free = match (affinity_next, free_next) { + (None, _) => true, + (Some(_), None) => false, + (Some(a), Some(f)) => f < a, + }; + if pick_free { + let entry = free_entries.pop().ok_or(())?; + let (mut affinities, free): (BinaryHeap<_>, BinaryHeap<_>) = + take(free_entries) + .into_iter() + .partition(|e| e.para_id == entry.para_id); + affinity_entries.append(&mut affinities); + *free_entries = free; + Ok(entry) + } else { + Err(()) + } + }); + let entry = free_entry.or_else(|()| affinity_entries.pop().ok_or(()))?; + queue_status.consume_index(entry.idx); + Ok(entry) + }) + }); + + let assignment = entry.map(|e| Assignment::Pool { para_id: e.para_id, core_index }).ok()?; + + Pallet::::increase_affinity(assignment.para_id(), core_index); + Some(assignment) + } + + /// Report that the `para_id` & `core_index` combination was processed. + /// + /// This should be called once it is clear that the assignment won't get pushed back anymore. + /// + /// In other words for each `pop_assignment_for_core` a call to this function or + /// `push_back_assignment` must follow, but only one. + pub fn report_processed(para_id: ParaId, core_index: CoreIndex) { + Pallet::::decrease_affinity_update_queue(para_id, core_index); + } + + /// Push an assignment back to the front of the queue. + /// + /// The assignment has not been processed yet. Typically used on session boundaries. + /// + /// NOTE: We are not checking queue size here. So due to push backs it is possible that we + /// exceed the maximum queue size slightly. + /// + /// Parameters: + /// - `para_id`: The para that did not make it. + /// - `core_index`: The core the para was scheduled on. + pub fn push_back_assignment(para_id: ParaId, core_index: CoreIndex) { + Pallet::::decrease_affinity_update_queue(para_id, core_index); + QueueStatus::::mutate(|queue_status| { + Pallet::::add_on_demand_order(queue_status, para_id, QueuePushDirection::Front); + }); + } + /// Helper function for `place_order_*` calls. Used to differentiate between placing orders /// with a keep alive check or to allow the account to be reaped. /// @@ -324,35 +551,64 @@ where para_id: ParaId, existence_requirement: ExistenceRequirement, ) -> DispatchResult { - let config = >::config(); - - // Traffic always falls back to 1.0 - let traffic = SpotTraffic::::get(); - - // Calculate spot price - let spot_price: BalanceOf = - traffic.saturating_mul_int(config.on_demand_base_fee.saturated_into::>()); - - // Is the current price higher than `max_amount` - ensure!(spot_price.le(&max_amount), Error::::SpotPriceHigherThanMaxAmount); - - // Charge the sending account the spot price - let _ = T::Currency::withdraw( - &sender, - spot_price, - WithdrawReasons::FEE, - existence_requirement, - )?; - - let order = EnqueuedOrder::new(para_id); - - let res = Pallet::::add_on_demand_order(order, QueuePushDirection::Back); - - if res.is_ok() { - Pallet::::deposit_event(Event::::OnDemandOrderPlaced { para_id, spot_price }); - } + let config = configuration::ActiveConfig::::get(); + + QueueStatus::::mutate(|queue_status| { + Self::update_spot_traffic(&config, queue_status); + let traffic = queue_status.traffic; + + // Calculate spot price + let spot_price: BalanceOf = traffic.saturating_mul_int( + config.scheduler_params.on_demand_base_fee.saturated_into::>(), + ); + + // Is the current price higher than `max_amount` + ensure!(spot_price.le(&max_amount), Error::::SpotPriceHigherThanMaxAmount); + + // Charge the sending account the spot price + let _ = T::Currency::withdraw( + &sender, + spot_price, + WithdrawReasons::FEE, + existence_requirement, + )?; + + ensure!( + queue_status.size() < config.scheduler_params.on_demand_queue_max_size, + Error::::QueueFull + ); + Pallet::::add_on_demand_order(queue_status, para_id, QueuePushDirection::Back); + Ok(()) + }) + } - res + /// Calculate and update spot traffic. + fn update_spot_traffic( + config: &configuration::HostConfiguration>, + queue_status: &mut QueueStatusType, + ) { + let old_traffic = queue_status.traffic; + match Self::calculate_spot_traffic( + old_traffic, + config.scheduler_params.on_demand_queue_max_size, + queue_status.size(), + config.scheduler_params.on_demand_target_queue_utilization, + config.scheduler_params.on_demand_fee_variability, + ) { + Ok(new_traffic) => { + // Only update storage on change + if new_traffic != old_traffic { + queue_status.traffic = new_traffic; + Pallet::::deposit_event(Event::::SpotTrafficSet { traffic: new_traffic }); + } + }, + Err(err) => { + log::debug!( + target: LOG_TARGET, + "Error calculating spot traffic: {:?}", err + ); + }, + }; } /// The spot price multiplier. This is based on the transaction fee calculations defined in: @@ -377,7 +633,7 @@ where /// - `SpotTrafficCalculationErr::QueueCapacityIsZero` /// - `SpotTrafficCalculationErr::QueueSizeLargerThanCapacity` /// - `SpotTrafficCalculationErr::Division` - pub(crate) fn calculate_spot_traffic( + fn calculate_spot_traffic( traffic: FixedU128, queue_capacity: u32, queue_size: u32, @@ -428,173 +684,141 @@ where /// Adds an order to the on demand queue. /// - /// Paramenters: - /// - `order`: The `EnqueuedOrder` to add to the queue. + /// Parameters: /// - `location`: Whether to push this entry to the back or the front of the queue. Pushing an /// entry to the front of the queue is only used when the scheduler wants to push back an /// entry it has already popped. - /// Returns: - /// - The unit type on success. - /// - /// Errors: - /// - `InvalidParaId` - /// - `QueueFull` fn add_on_demand_order( - order: EnqueuedOrder, + queue_status: &mut QueueStatusType, + para_id: ParaId, location: QueuePushDirection, - ) -> Result<(), DispatchError> { - // Only parathreads are valid paraids for on the go parachains. - ensure!(>::is_parathread(order.para_id), Error::::InvalidParaId); - - let config = >::config(); - - OnDemandQueue::::try_mutate(|queue| { - // Abort transaction if queue is too large - ensure!(Self::queue_size() < config.on_demand_queue_max_size, Error::::QueueFull); - match location { - QueuePushDirection::Back => queue.push_back(order), - QueuePushDirection::Front => queue.push_front(order), - }; - Ok(()) - }) + ) { + let idx = match location { + QueuePushDirection::Back => queue_status.push_back(), + QueuePushDirection::Front => queue_status.push_front(), + }; + + let affinity = ParaIdAffinity::::get(para_id); + let order = EnqueuedOrder::new(idx, para_id); + #[cfg(test)] + log::debug!(target: LOG_TARGET, "add_on_demand_order, order: {:?}, affinity: {:?}, direction: {:?}", order, affinity, location); + + match affinity { + None => FreeEntries::::mutate(|entries| entries.push(order)), + Some(affinity) => + AffinityEntries::::mutate(affinity.core_index, |entries| entries.push(order)), + } } - /// Get the size of the on demand queue. + /// Decrease core affinity for para and update queue /// - /// Returns: - /// - The size of the on demand queue. - fn queue_size() -> u32 { - let config = >::config(); - match OnDemandQueue::::get().len().try_into() { - Ok(size) => return size, - Err(_) => { - log::debug!( - target: LOG_TARGET, - "Failed to fetch the on demand queue size, returning the max size." - ); - return config.on_demand_queue_max_size - }, + /// if affinity dropped to 0, moving entries back to `FreeEntries`. + fn decrease_affinity_update_queue(para_id: ParaId, core_index: CoreIndex) { + let affinity = Pallet::::decrease_affinity(para_id, core_index); + #[cfg(not(test))] + debug_assert_ne!( + affinity, None, + "Decreased affinity for a para that has not been served on a core?" + ); + if affinity != Some(0) { + return } - } - - /// Getter for the order queue. - #[cfg(test)] - fn get_queue() -> VecDeque { - OnDemandQueue::::get() - } - - /// Getter for the affinity tracker. - pub fn get_affinity_map(para_id: ParaId) -> Option { - ParaIdAffinity::::get(para_id) + // No affinity more for entries on this core, free any entries: + // + // This is necessary to ensure them being served as the core might no longer exist at all. + AffinityEntries::::mutate(core_index, |affinity_entries| { + FreeEntries::::mutate(|free_entries| { + let (mut freed, affinities): (BinaryHeap<_>, BinaryHeap<_>) = + take(affinity_entries).into_iter().partition(|e| e.para_id == para_id); + free_entries.append(&mut freed); + *affinity_entries = affinities; + }) + }); } /// Decreases the affinity of a `ParaId` to a specified `CoreIndex`. - /// Subtracts from the count of the `CoreAffinityCount` if an entry is found and the core_idx + /// + /// Subtracts from the count of the `CoreAffinityCount` if an entry is found and the core_index /// matches. When the count reaches 0, the entry is removed. /// A non-existant entry is a no-op. - fn decrease_affinity(para_id: ParaId, core_idx: CoreIndex) { + /// + /// Returns: The new affinity of the para on that core. `None` if there is no affinity on this + /// core. + fn decrease_affinity(para_id: ParaId, core_index: CoreIndex) -> Option { ParaIdAffinity::::mutate(para_id, |maybe_affinity| { - if let Some(affinity) = maybe_affinity { - if affinity.core_idx == core_idx { - let new_count = affinity.count.saturating_sub(1); - if new_count > 0 { - *maybe_affinity = Some(CoreAffinityCount { core_idx, count: new_count }); - } else { - *maybe_affinity = None; - } + let affinity = maybe_affinity.as_mut()?; + if affinity.core_index == core_index { + let new_count = affinity.count.saturating_sub(1); + if new_count > 0 { + *maybe_affinity = Some(CoreAffinityCount { core_index, count: new_count }); + } else { + *maybe_affinity = None; } + return Some(new_count) + } else { + None } - }); + }) } /// Increases the affinity of a `ParaId` to a specified `CoreIndex`. - /// Adds to the count of the `CoreAffinityCount` if an entry is found and the core_idx matches. - /// A non-existant entry will be initialized with a count of 1 and uses the supplied + /// Adds to the count of the `CoreAffinityCount` if an entry is found and the core_index + /// matches. A non-existent entry will be initialized with a count of 1 and uses the supplied /// `CoreIndex`. - fn increase_affinity(para_id: ParaId, core_idx: CoreIndex) { + fn increase_affinity(para_id: ParaId, core_index: CoreIndex) { ParaIdAffinity::::mutate(para_id, |maybe_affinity| match maybe_affinity { Some(affinity) => - if affinity.core_idx == core_idx { + if affinity.core_index == core_index { *maybe_affinity = Some(CoreAffinityCount { - core_idx, + core_index, count: affinity.count.saturating_add(1), }); }, None => { - *maybe_affinity = Some(CoreAffinityCount { core_idx, count: 1 }); + *maybe_affinity = Some(CoreAffinityCount { core_index, count: 1 }); }, }) } -} -impl Pallet { - /// Take the next queued entry that is available for a given core index. - /// Invalidates and removes orders with a `para_id` that is not `ParaLifecycle::Parathread` - /// but only in [0..P] range slice of the order queue, where P is the element that is - /// removed from the order queue. - /// - /// Parameters: - /// - `core_idx`: The core index - pub fn pop_assignment_for_core(core_idx: CoreIndex) -> Option { - let mut queue: VecDeque = OnDemandQueue::::get(); - - let mut invalidated_para_id_indexes: Vec = vec![]; - - // Get the position of the next `ParaId`. Select either a valid `ParaId` that has an - // affinity to the same `CoreIndex` as the scheduler asks for or a valid `ParaId` with no - // affinity at all. - let pos = queue.iter().enumerate().position(|(index, assignment)| { - if >::is_parathread(assignment.para_id) { - match ParaIdAffinity::::get(&assignment.para_id) { - Some(affinity) => return affinity.core_idx == core_idx, - None => return true, - } - } - // Record no longer valid para_ids. - invalidated_para_id_indexes.push(index); - return false - }); + /// Getter for the affinity tracker. + #[cfg(test)] + fn get_affinity_map(para_id: ParaId) -> Option { + ParaIdAffinity::::get(para_id) + } - // Collect the popped value. - let popped = pos.and_then(|p: usize| { - if let Some(assignment) = queue.remove(p) { - Pallet::::increase_affinity(assignment.para_id, core_idx); - return Some(assignment) - }; - None - }); + /// Getter for the affinity entries. + #[cfg(test)] + fn get_affinity_entries(core_index: CoreIndex) -> BinaryHeap { + AffinityEntries::::get(core_index) + } - // Only remove the invalid indexes *after* using the index. - // Removed in reverse order so that the indexes don't shift. - invalidated_para_id_indexes.iter().rev().for_each(|idx| { - queue.remove(*idx); - }); + /// Getter for the free entries. + #[cfg(test)] + fn get_free_entries() -> BinaryHeap { + FreeEntries::::get() + } - // Write changes to storage. - OnDemandQueue::::set(queue); + #[cfg(feature = "runtime-benchmarks")] + pub fn populate_queue(para_id: ParaId, num: u32) { + QueueStatus::::mutate(|queue_status| { + for _ in 0..num { + Pallet::::add_on_demand_order(queue_status, para_id, QueuePushDirection::Back); + } + }); + } - popped.map(|p| Assignment::Pool { para_id: p.para_id, core_index: core_idx }) + #[cfg(test)] + fn set_queue_status(new_status: QueueStatusType) { + QueueStatus::::set(new_status); } - /// Report that the `para_id` & `core_index` combination was processed. - pub fn report_processed(para_id: ParaId, core_index: CoreIndex) { - Pallet::::decrease_affinity(para_id, core_index) + #[cfg(test)] + fn get_queue_status() -> QueueStatusType { + QueueStatus::::get() } - /// Push an assignment back to the front of the queue. - /// - /// The assignment has not been processed yet. Typically used on session boundaries. - /// Parameters: - /// - `assignment`: The on demand assignment. - pub fn push_back_assignment(para_id: ParaId, core_index: CoreIndex) { - Pallet::::decrease_affinity(para_id, core_index); - // Skip the queue on push backs from scheduler - match Pallet::::add_on_demand_order( - EnqueuedOrder::new(para_id), - QueuePushDirection::Front, - ) { - Ok(_) => {}, - Err(_) => {}, - } + #[cfg(test)] + fn get_traffic_default_value() -> FixedU128 { + ::TrafficDefaultValue::get() } } diff --git a/polkadot/runtime/parachains/src/assigner_on_demand/tests.rs b/polkadot/runtime/parachains/src/assigner_on_demand/tests.rs index 8404700780c84e493d6436c5f3174f814c1082ef..982efe77b939cf64d355e1111606c3856c4a0aea 100644 --- a/polkadot/runtime/parachains/src/assigner_on_demand/tests.rs +++ b/polkadot/runtime/parachains/src/assigner_on_demand/tests.rs @@ -73,11 +73,24 @@ fn run_to_block( Paras::initializer_initialize(b + 1); Scheduler::initializer_initialize(b + 1); + // We need to update the spot traffic on every block. + OnDemandAssigner::on_initialize(b + 1); + // In the real runtime this is expected to be called by the `InclusionInherent` pallet. Scheduler::free_cores_and_fill_claimqueue(BTreeMap::new(), b + 1); } } +fn place_order(para_id: ParaId) { + let alice = 100u64; + let amt = 10_000_000u128; + + Balances::make_free_balance_be(&alice, amt); + + run_to_block(101, |n| if n == 101 { Some(Default::default()) } else { None }); + OnDemandAssigner::place_order_allow_death(RuntimeOrigin::signed(alice), amt, para_id).unwrap() +} + #[test] fn spot_traffic_capacity_zero_returns_none() { match OnDemandAssigner::calculate_spot_traffic( @@ -201,6 +214,42 @@ fn spot_traffic_decreases_over_time() { assert_eq!(traffic, FixedU128::from_inner(3_125_000_000_000_000_000u128)) } +#[test] +fn spot_traffic_decreases_between_idle_blocks() { + // Testing spot traffic assumptions, but using the mock runtime and default on demand + // configuration values. Ensuring that blocks with no on demand activity (idle) + // decrease traffic. + + let para_id = ParaId::from(111); + + new_test_ext(GenesisConfigBuilder::default().build()).execute_with(|| { + // Initialize the parathread and wait for it to be ready. + schedule_blank_para(para_id, ParaKind::Parathread); + assert!(!Paras::is_parathread(para_id)); + run_to_block(100, |n| if n == 100 { Some(Default::default()) } else { None }); + assert!(Paras::is_parathread(para_id)); + + // Set the spot traffic to a large number + OnDemandAssigner::set_queue_status(QueueStatusType { + traffic: FixedU128::from_u32(10), + ..Default::default() + }); + + assert_eq!(OnDemandAssigner::get_queue_status().traffic, FixedU128::from_u32(10)); + + // Run to block 101 and ensure that the traffic decreases. + run_to_block(101, |n| if n == 100 { Some(Default::default()) } else { None }); + assert!(OnDemandAssigner::get_queue_status().traffic < FixedU128::from_u32(10)); + + // Run to block 102 and observe that we've hit the default traffic value. + run_to_block(102, |n| if n == 100 { Some(Default::default()) } else { None }); + assert_eq!( + OnDemandAssigner::get_queue_status().traffic, + OnDemandAssigner::get_traffic_default_value() + ); + }) +} + #[test] fn place_order_works() { let alice = 1u64; @@ -278,74 +327,6 @@ fn place_order_keep_alive_keeps_alive() { }); } -#[test] -fn add_on_demand_order_works() { - let para_a = ParaId::from(111); - let order = EnqueuedOrder::new(para_a); - - let mut genesis = GenesisConfigBuilder::default(); - genesis.on_demand_max_queue_size = 1; - new_test_ext(genesis.build()).execute_with(|| { - // Initialize the parathread and wait for it to be ready. - schedule_blank_para(para_a, ParaKind::Parathread); - - // `para_a` is not onboarded as a parathread yet. - assert_noop!( - OnDemandAssigner::add_on_demand_order(order.clone(), QueuePushDirection::Back), - Error::::InvalidParaId - ); - - assert!(!Paras::is_parathread(para_a)); - run_to_block(100, |n| if n == 100 { Some(Default::default()) } else { None }); - assert!(Paras::is_parathread(para_a)); - - // `para_a` is now onboarded as a valid parathread. - assert_ok!(OnDemandAssigner::add_on_demand_order(order.clone(), QueuePushDirection::Back)); - - // Max queue size is 1, queue should be full. - assert_noop!( - OnDemandAssigner::add_on_demand_order(order, QueuePushDirection::Back), - Error::::QueueFull - ); - }); -} - -#[test] -fn spotqueue_push_directions() { - new_test_ext(GenesisConfigBuilder::default().build()).execute_with(|| { - let para_a = ParaId::from(111); - let para_b = ParaId::from(222); - let para_c = ParaId::from(333); - - schedule_blank_para(para_a, ParaKind::Parathread); - schedule_blank_para(para_b, ParaKind::Parathread); - schedule_blank_para(para_c, ParaKind::Parathread); - - run_to_block(11, |n| if n == 11 { Some(Default::default()) } else { None }); - - let order_a = EnqueuedOrder::new(para_a); - let order_b = EnqueuedOrder::new(para_b); - let order_c = EnqueuedOrder::new(para_c); - - assert_ok!(OnDemandAssigner::add_on_demand_order( - order_a.clone(), - QueuePushDirection::Front - )); - assert_ok!(OnDemandAssigner::add_on_demand_order( - order_b.clone(), - QueuePushDirection::Front - )); - - assert_ok!(OnDemandAssigner::add_on_demand_order( - order_c.clone(), - QueuePushDirection::Back - )); - - assert_eq!(OnDemandAssigner::queue_size(), 3); - assert_eq!(OnDemandAssigner::get_queue(), VecDeque::from(vec![order_b, order_a, order_c])) - }); -} - #[test] fn pop_assignment_for_core_works() { new_test_ext(GenesisConfigBuilder::default().build()).execute_with(|| { @@ -356,51 +337,32 @@ fn pop_assignment_for_core_works() { run_to_block(11, |n| if n == 11 { Some(Default::default()) } else { None }); - let order_a = EnqueuedOrder::new(para_a); - let order_b = EnqueuedOrder::new(para_b); - let assignment_a = Assignment::Pool { para_id: para_a, core_index: CoreIndex(0) }; - let assignment_b = Assignment::Pool { para_id: para_b, core_index: CoreIndex(1) }; - // Pop should return none with empty queue assert_eq!(OnDemandAssigner::pop_assignment_for_core(CoreIndex(0)), None); // Add enough assignments to the order queue. for _ in 0..2 { - OnDemandAssigner::add_on_demand_order(order_a.clone(), QueuePushDirection::Back) - .expect("Invalid paraid or queue full"); - - OnDemandAssigner::add_on_demand_order(order_b.clone(), QueuePushDirection::Back) - .expect("Invalid paraid or queue full"); - } - - // Queue should contain orders a, b, a, b - { - let queue: Vec = OnDemandQueue::::get().into_iter().collect(); - assert_eq!( - queue, - vec![order_a.clone(), order_b.clone(), order_a.clone(), order_b.clone()] - ); + place_order(para_a); + place_order(para_b); } // Popped assignments should be for the correct paras and cores assert_eq!( - OnDemandAssigner::pop_assignment_for_core(CoreIndex(0)), - Some(assignment_a.clone()) + OnDemandAssigner::pop_assignment_for_core(CoreIndex(0)).map(|a| a.para_id()), + Some(para_a) ); assert_eq!( - OnDemandAssigner::pop_assignment_for_core(CoreIndex(1)), - Some(assignment_b.clone()) + OnDemandAssigner::pop_assignment_for_core(CoreIndex(1)).map(|a| a.para_id()), + Some(para_b) ); assert_eq!( - OnDemandAssigner::pop_assignment_for_core(CoreIndex(0)), - Some(assignment_a.clone()) + OnDemandAssigner::pop_assignment_for_core(CoreIndex(0)).map(|a| a.para_id()), + Some(para_a) + ); + assert_eq!( + OnDemandAssigner::pop_assignment_for_core(CoreIndex(1)).map(|a| a.para_id()), + Some(para_b) ); - - // Queue should contain one left over order - { - let queue: Vec = OnDemandQueue::::get().into_iter().collect(); - assert_eq!(queue, vec![order_b.clone(),]); - } }); } @@ -414,28 +376,19 @@ fn push_back_assignment_works() { run_to_block(11, |n| if n == 11 { Some(Default::default()) } else { None }); - let order_a = EnqueuedOrder::new(para_a); - let order_b = EnqueuedOrder::new(para_b); - // Add enough assignments to the order queue. - OnDemandAssigner::add_on_demand_order(order_a.clone(), QueuePushDirection::Back) - .expect("Invalid paraid or queue full"); - - OnDemandAssigner::add_on_demand_order(order_b.clone(), QueuePushDirection::Back) - .expect("Invalid paraid or queue full"); + place_order(para_a); + place_order(para_b); // Pop order a - OnDemandAssigner::pop_assignment_for_core(CoreIndex(0)); + assert_eq!( + OnDemandAssigner::pop_assignment_for_core(CoreIndex(0)).unwrap().para_id(), + para_a + ); // Para a should have affinity for core 0 assert_eq!(OnDemandAssigner::get_affinity_map(para_a).unwrap().count, 1); - assert_eq!(OnDemandAssigner::get_affinity_map(para_a).unwrap().core_idx, CoreIndex(0)); - - // Queue should still contain order b - { - let queue: Vec = OnDemandQueue::::get().into_iter().collect(); - assert_eq!(queue, vec![order_b.clone()]); - } + assert_eq!(OnDemandAssigner::get_affinity_map(para_a).unwrap().core_index, CoreIndex(0)); // Push back order a OnDemandAssigner::push_back_assignment(para_a, CoreIndex(0)); @@ -444,10 +397,82 @@ fn push_back_assignment_works() { assert_eq!(OnDemandAssigner::get_affinity_map(para_a).is_none(), true); // Queue should contain orders a, b. A in front of b. - { - let queue: Vec = OnDemandQueue::::get().into_iter().collect(); - assert_eq!(queue, vec![order_a.clone(), order_b.clone()]); + assert_eq!( + OnDemandAssigner::pop_assignment_for_core(CoreIndex(0)).unwrap().para_id(), + para_a + ); + assert_eq!( + OnDemandAssigner::pop_assignment_for_core(CoreIndex(0)).unwrap().para_id(), + para_b + ); + }); +} + +#[test] +fn affinity_prohibits_parallel_scheduling() { + new_test_ext(GenesisConfigBuilder::default().build()).execute_with(|| { + let para_a = ParaId::from(111); + let para_b = ParaId::from(222); + + schedule_blank_para(para_a, ParaKind::Parathread); + schedule_blank_para(para_b, ParaKind::Parathread); + + run_to_block(11, |n| if n == 11 { Some(Default::default()) } else { None }); + + // There should be no affinity before starting. + assert!(OnDemandAssigner::get_affinity_map(para_a).is_none()); + assert!(OnDemandAssigner::get_affinity_map(para_b).is_none()); + + // Add 2 assignments for para_a for every para_b. + place_order(para_a); + place_order(para_a); + place_order(para_b); + + // Approximate having 1 core. + for _ in 0..3 { + assert!(OnDemandAssigner::pop_assignment_for_core(CoreIndex(0)).is_some()); } + assert!(OnDemandAssigner::pop_assignment_for_core(CoreIndex(0)).is_none()); + + // Affinity on one core is meaningless. + assert_eq!(OnDemandAssigner::get_affinity_map(para_a).unwrap().count, 2); + assert_eq!(OnDemandAssigner::get_affinity_map(para_b).unwrap().count, 1); + assert_eq!( + OnDemandAssigner::get_affinity_map(para_a).unwrap().core_index, + OnDemandAssigner::get_affinity_map(para_b).unwrap().core_index, + ); + + // Clear affinity + OnDemandAssigner::report_processed(para_a, 0.into()); + OnDemandAssigner::report_processed(para_a, 0.into()); + OnDemandAssigner::report_processed(para_b, 0.into()); + + // Add 2 assignments for para_a for every para_b. + place_order(para_a); + place_order(para_a); + place_order(para_b); + + // Approximate having 3 cores. CoreIndex 2 should be unable to obtain an assignment + for _ in 0..3 { + OnDemandAssigner::pop_assignment_for_core(CoreIndex(0)); + OnDemandAssigner::pop_assignment_for_core(CoreIndex(1)); + assert!(OnDemandAssigner::pop_assignment_for_core(CoreIndex(2)).is_none()); + } + + // Affinity should be the same as before, but on different cores. + assert_eq!(OnDemandAssigner::get_affinity_map(para_a).unwrap().count, 2); + assert_eq!(OnDemandAssigner::get_affinity_map(para_b).unwrap().count, 1); + assert_eq!(OnDemandAssigner::get_affinity_map(para_a).unwrap().core_index, CoreIndex(0)); + assert_eq!(OnDemandAssigner::get_affinity_map(para_b).unwrap().core_index, CoreIndex(1)); + + // Clear affinity + OnDemandAssigner::report_processed(para_a, CoreIndex(0)); + OnDemandAssigner::report_processed(para_a, CoreIndex(0)); + OnDemandAssigner::report_processed(para_b, CoreIndex(1)); + + // There should be no affinity after clearing. + assert!(OnDemandAssigner::get_affinity_map(para_a).is_none()); + assert!(OnDemandAssigner::get_affinity_map(para_b).is_none()); }); } @@ -458,7 +483,6 @@ fn affinity_changes_work() { let core_index = CoreIndex(0); schedule_blank_para(para_a, ParaKind::Parathread); - let order_a = EnqueuedOrder::new(para_a); run_to_block(11, |n| if n == 11 { Some(Default::default()) } else { None }); // There should be no affinity before starting. @@ -466,8 +490,7 @@ fn affinity_changes_work() { // Add enough assignments to the order queue. for _ in 0..10 { - OnDemandAssigner::add_on_demand_order(order_a.clone(), QueuePushDirection::Front) - .expect("Invalid paraid or queue full"); + place_order(para_a); } // There should be no affinity before the scheduler pops. @@ -483,7 +506,6 @@ fn affinity_changes_work() { // Affinity count is 1 after popping with a previous para. assert_eq!(OnDemandAssigner::get_affinity_map(para_a).unwrap().count, 1); - assert_eq!(OnDemandAssigner::queue_size(), 8); for _ in 0..3 { OnDemandAssigner::pop_assignment_for_core(core_index); @@ -491,147 +513,197 @@ fn affinity_changes_work() { // Affinity count is 4 after popping 3 times without a previous para. assert_eq!(OnDemandAssigner::get_affinity_map(para_a).unwrap().count, 4); - assert_eq!(OnDemandAssigner::queue_size(), 5); for _ in 0..5 { OnDemandAssigner::report_processed(para_a, 0.into()); - OnDemandAssigner::pop_assignment_for_core(core_index); + assert!(OnDemandAssigner::pop_assignment_for_core(core_index).is_some()); } // Affinity count should still be 4 but queue should be empty. + assert!(OnDemandAssigner::pop_assignment_for_core(core_index).is_none()); assert_eq!(OnDemandAssigner::get_affinity_map(para_a).unwrap().count, 4); - assert_eq!(OnDemandAssigner::queue_size(), 0); // Pop 4 times and get to exactly 0 (None) affinity. for _ in 0..4 { OnDemandAssigner::report_processed(para_a, 0.into()); - OnDemandAssigner::pop_assignment_for_core(core_index); + assert!(OnDemandAssigner::pop_assignment_for_core(core_index).is_none()); } assert!(OnDemandAssigner::get_affinity_map(para_a).is_none()); // Decreasing affinity beyond 0 should still be None. OnDemandAssigner::report_processed(para_a, 0.into()); - OnDemandAssigner::pop_assignment_for_core(core_index); + assert!(OnDemandAssigner::pop_assignment_for_core(core_index).is_none()); assert!(OnDemandAssigner::get_affinity_map(para_a).is_none()); }); } #[test] -fn affinity_prohibits_parallel_scheduling() { - new_test_ext(GenesisConfigBuilder::default().build()).execute_with(|| { - let para_a = ParaId::from(111); - let para_b = ParaId::from(222); +fn new_affinity_for_a_core_must_come_from_free_entries() { + // If affinity count for a core was zero before, and is 1 now, then the entry + // must have come from free_entries. + let parachains = + vec![ParaId::from(111), ParaId::from(222), ParaId::from(333), ParaId::from(444)]; + let core_indices = vec![CoreIndex(0), CoreIndex(1), CoreIndex(2), CoreIndex(3)]; - schedule_blank_para(para_a, ParaKind::Parathread); - schedule_blank_para(para_b, ParaKind::Parathread); + new_test_ext(GenesisConfigBuilder::default().build()).execute_with(|| { + parachains.iter().for_each(|chain| { + schedule_blank_para(*chain, ParaKind::Parathread); + }); run_to_block(11, |n| if n == 11 { Some(Default::default()) } else { None }); - let order_a = EnqueuedOrder::new(para_a); - let order_b = EnqueuedOrder::new(para_b); - - // There should be no affinity before starting. - assert!(OnDemandAssigner::get_affinity_map(para_a).is_none()); - assert!(OnDemandAssigner::get_affinity_map(para_b).is_none()); - - // Add 2 assignments for para_a for every para_b. - OnDemandAssigner::add_on_demand_order(order_a.clone(), QueuePushDirection::Back) - .expect("Invalid paraid or queue full"); - - OnDemandAssigner::add_on_demand_order(order_a.clone(), QueuePushDirection::Back) - .expect("Invalid paraid or queue full"); - - OnDemandAssigner::add_on_demand_order(order_b.clone(), QueuePushDirection::Back) - .expect("Invalid paraid or queue full"); - - assert_eq!(OnDemandAssigner::queue_size(), 3); + // Place orders for all chains. + parachains.iter().for_each(|chain| { + place_order(*chain); + }); + + // There are 4 entries in free_entries. + let start_free_entries = OnDemandAssigner::get_free_entries().len(); + assert_eq!(start_free_entries, 4); + + // Pop assignments on all cores. + core_indices.iter().enumerate().for_each(|(n, core_index)| { + // There is no affinity on the core prior to popping. + assert!(OnDemandAssigner::get_affinity_entries(*core_index).is_empty()); + + // There's always an order to be popped for each core. + let free_entries = OnDemandAssigner::get_free_entries(); + let next_order = free_entries.peek(); + + // There is no affinity on the paraid prior to popping. + assert!(OnDemandAssigner::get_affinity_map(next_order.unwrap().para_id).is_none()); + + match OnDemandAssigner::pop_assignment_for_core(*core_index) { + Some(assignment) => { + // The popped assignment came from free entries. + assert_eq!( + start_free_entries - 1 - n, + OnDemandAssigner::get_free_entries().len() + ); + // The popped assignment has the same para id as the next order. + assert_eq!(assignment.para_id(), next_order.unwrap().para_id); + }, + None => panic!("Should not happen"), + } + }); - // Approximate having 1 core. - for _ in 0..3 { - OnDemandAssigner::pop_assignment_for_core(CoreIndex(0)); - } + // All entries have been removed from free_entries. + assert!(OnDemandAssigner::get_free_entries().is_empty()); - // Affinity on one core is meaningless. - assert_eq!(OnDemandAssigner::get_affinity_map(para_a).unwrap().count, 2); - assert_eq!(OnDemandAssigner::get_affinity_map(para_b).unwrap().count, 1); - assert_eq!( - OnDemandAssigner::get_affinity_map(para_a).unwrap().core_idx, - OnDemandAssigner::get_affinity_map(para_b).unwrap().core_idx - ); - - // Clear affinity - OnDemandAssigner::report_processed(para_a, 0.into()); - OnDemandAssigner::report_processed(para_a, 0.into()); - OnDemandAssigner::report_processed(para_b, 0.into()); - - // Add 2 assignments for para_a for every para_b. - OnDemandAssigner::add_on_demand_order(order_a.clone(), QueuePushDirection::Back) - .expect("Invalid paraid or queue full"); + // All chains have an affinity count of 1. + parachains.iter().for_each(|chain| { + assert_eq!(OnDemandAssigner::get_affinity_map(*chain).unwrap().count, 1); + }); + }); +} - OnDemandAssigner::add_on_demand_order(order_a.clone(), QueuePushDirection::Back) - .expect("Invalid paraid or queue full"); +#[test] +#[should_panic] +fn queue_index_ordering_is_unsound_over_max_size() { + // NOTE: Unsoundness proof. If the number goes sufficiently over the max_queue_max_size + // the overflow will cause an opposite comparison to what would be expected. + let max_num = u32::MAX - ON_DEMAND_MAX_QUEUE_MAX_SIZE; + // 0 < some large number. + assert_eq!(QueueIndex(0).cmp(&QueueIndex(max_num + 1)), Ordering::Less); +} - OnDemandAssigner::add_on_demand_order(order_b.clone(), QueuePushDirection::Back) - .expect("Invalid paraid or queue full"); +#[test] +fn queue_index_ordering_works() { + // The largest accepted queue size. + let max_num = ON_DEMAND_MAX_QUEUE_MAX_SIZE; + + // 0 == 0 + assert_eq!(QueueIndex(0).cmp(&QueueIndex(0)), Ordering::Equal); + // 0 < 1 + assert_eq!(QueueIndex(0).cmp(&QueueIndex(1)), Ordering::Less); + // 1 > 0 + assert_eq!(QueueIndex(1).cmp(&QueueIndex(0)), Ordering::Greater); + // 0 < max_num + assert_eq!(QueueIndex(0).cmp(&QueueIndex(max_num)), Ordering::Less); + // 0 > max_num + 1 + assert_eq!(QueueIndex(0).cmp(&QueueIndex(max_num + 1)), Ordering::Less); + + // Ordering within the bounds of ON_DEMAND_MAX_QUEUE_MAX_SIZE works. + let mut v = vec![3, 6, 2, 1, 5, 4]; + v.sort_by_key(|&num| QueueIndex(num)); + assert_eq!(v, vec![1, 2, 3, 4, 5, 6]); + + v = vec![max_num, 4, 5, 1, 6]; + v.sort_by_key(|&num| QueueIndex(num)); + assert_eq!(v, vec![1, 4, 5, 6, max_num]); + + // Ordering with an element outside of the bounds of the max size also works. + v = vec![max_num + 2, 0, 6, 2, 1, 5, 4]; + v.sort_by_key(|&num| QueueIndex(num)); + assert_eq!(v, vec![0, 1, 2, 4, 5, 6, max_num + 2]); + + // Numbers way above the max size will overflow + v = vec![u32::MAX - 1, u32::MAX, 6, 2, 1, 5, 4]; + v.sort_by_key(|&num| QueueIndex(num)); + assert_eq!(v, vec![u32::MAX - 1, u32::MAX, 1, 2, 4, 5, 6]); +} - // Approximate having 3 cores. CoreIndex 2 should be unable to obtain an assignment - for _ in 0..3 { - OnDemandAssigner::pop_assignment_for_core(CoreIndex(0)); - OnDemandAssigner::pop_assignment_for_core(CoreIndex(1)); - assert_eq!(None, OnDemandAssigner::pop_assignment_for_core(CoreIndex(2))); - } +#[test] +fn reverse_queue_index_does_reverse() { + let mut v = vec![1, 2, 3, 4, 5, 6]; - // Affinity should be the same as before, but on different cores. - assert_eq!(OnDemandAssigner::get_affinity_map(para_a).unwrap().count, 2); - assert_eq!(OnDemandAssigner::get_affinity_map(para_b).unwrap().count, 1); - assert_eq!(OnDemandAssigner::get_affinity_map(para_a).unwrap().core_idx, CoreIndex(0)); - assert_eq!(OnDemandAssigner::get_affinity_map(para_b).unwrap().core_idx, CoreIndex(1)); + // Basic reversal of a vector. + v.sort_by_key(|&num| ReverseQueueIndex(num)); + assert_eq!(v, vec![6, 5, 4, 3, 2, 1]); - // Clear affinity - OnDemandAssigner::report_processed(para_a, 0.into()); - OnDemandAssigner::report_processed(para_a, 0.into()); - OnDemandAssigner::report_processed(para_b, 1.into()); + // Example from rust docs on `Reverse`. Should work identically. + v.sort_by_key(|&num| (num > 3, ReverseQueueIndex(num))); + assert_eq!(v, vec![3, 2, 1, 6, 5, 4]); - // There should be no affinity after clearing. - assert!(OnDemandAssigner::get_affinity_map(para_a).is_none()); - assert!(OnDemandAssigner::get_affinity_map(para_b).is_none()); - }); + let mut v2 = vec![1, 2, u32::MAX]; + v2.sort_by_key(|&num| ReverseQueueIndex(num)); + assert_eq!(v2, vec![2, 1, u32::MAX]); } #[test] -fn on_demand_orders_cannot_be_popped_if_lifecycle_changes() { - let para_id = ParaId::from(10); - let core_index = CoreIndex(0); - let order = EnqueuedOrder::new(para_id); +fn queue_status_size_fn_works() { + // Add orders to the on demand queue, and make sure that they are properly represented + // by the QueueStatusType::size fn. + let parachains = vec![ParaId::from(111), ParaId::from(222), ParaId::from(333)]; + let core_indices = vec![CoreIndex(0), CoreIndex(1)]; new_test_ext(GenesisConfigBuilder::default().build()).execute_with(|| { - // Register the para_id as a parathread - schedule_blank_para(para_id, ParaKind::Parathread); - - assert!(!Paras::is_parathread(para_id)); - run_to_block(10, |n| if n == 10 { Some(Default::default()) } else { None }); - assert!(Paras::is_parathread(para_id)); + parachains.iter().for_each(|chain| { + schedule_blank_para(*chain, ParaKind::Parathread); + }); - // Add two assignments for a para_id with a valid lifecycle. - assert_ok!(OnDemandAssigner::add_on_demand_order(order.clone(), QueuePushDirection::Back)); - assert_ok!(OnDemandAssigner::add_on_demand_order(order.clone(), QueuePushDirection::Back)); + assert_eq!(OnDemandAssigner::get_queue_status().size(), 0); - // First pop is fine - assert!( - OnDemandAssigner::pop_assignment_for_core(core_index) == - Some(Assignment::Pool { para_id, core_index }) - ); + run_to_block(11, |n| if n == 11 { Some(Default::default()) } else { None }); - // Deregister para - assert_ok!(Paras::schedule_para_cleanup(para_id)); + // Place orders for all chains. + parachains.iter().for_each(|chain| { + // 2 per chain for a total of 6 + place_order(*chain); + place_order(*chain); + }); - // Run to new session and verify that para_id is no longer a valid parathread. - assert!(Paras::is_parathread(para_id)); - run_to_block(20, |n| if n == 20 { Some(Default::default()) } else { None }); - assert!(!Paras::is_parathread(para_id)); + // 6 orders in free entries + assert_eq!(OnDemandAssigner::get_free_entries().len(), 6); + // 6 orders via queue status size + assert_eq!( + OnDemandAssigner::get_free_entries().len(), + OnDemandAssigner::get_queue_status().size() as usize + ); - // Second pop should be None. - OnDemandAssigner::report_processed(para_id, core_index); - assert_eq!(OnDemandAssigner::pop_assignment_for_core(core_index), None); + core_indices.iter().for_each(|core_index| { + OnDemandAssigner::pop_assignment_for_core(*core_index); + }); + + // There should be 2 orders in the scheduler's claimqueue, + // 2 in assorted AffinityMaps and 2 in free. + // ParaId 111 + assert_eq!(OnDemandAssigner::get_affinity_entries(core_indices[0]).len(), 1); + // ParaId 222 + assert_eq!(OnDemandAssigner::get_affinity_entries(core_indices[1]).len(), 1); + // Free entries are from ParaId 333 + assert_eq!(OnDemandAssigner::get_free_entries().len(), 2); + // For a total size of 4. + assert_eq!(OnDemandAssigner::get_queue_status().size(), 4) }); } diff --git a/polkadot/runtime/parachains/src/assigner_parachains.rs b/polkadot/runtime/parachains/src/assigner_parachains.rs index 34b5d3c1ec51811e8e4c50255592b1e9344014d8..e79facd1fef0856ba7933b1d03901e2e0d397b12 100644 --- a/polkadot/runtime/parachains/src/assigner_parachains.rs +++ b/polkadot/runtime/parachains/src/assigner_parachains.rs @@ -27,7 +27,7 @@ use primitives::CoreIndex; use crate::{ configuration, paras, - scheduler::common::{Assignment, AssignmentProvider, AssignmentProviderConfig}, + scheduler::common::{Assignment, AssignmentProvider}, }; pub use pallet::*; @@ -46,7 +46,7 @@ pub mod pallet { impl AssignmentProvider> for Pallet { fn pop_assignment_for_core(core_idx: CoreIndex) -> Option { - >::parachains() + paras::Parachains::::get() .get(core_idx.0 as usize) .copied() .map(Assignment::Bulk) @@ -58,16 +58,6 @@ impl AssignmentProvider> for Pallet { /// this is a no-op in the case of a bulk assignment slot. fn push_back_assignment(_: Assignment) {} - fn get_provider_config(_core_idx: CoreIndex) -> AssignmentProviderConfig> { - AssignmentProviderConfig { - // The next assignment already goes to the same [`ParaId`], no timeout tracking needed. - max_availability_timeouts: 0, - // The next assignment already goes to the same [`ParaId`], this can be any number - // that's high enough to clear the time it takes to clear backing/availability. - ttl: 10u32.into(), - } - } - #[cfg(any(feature = "runtime-benchmarks", test))] fn get_mock_assignment(_: CoreIndex, para_id: primitives::Id) -> Assignment { Assignment::Bulk(para_id) diff --git a/polkadot/runtime/parachains/src/assigner_parachains/mock_helpers.rs b/polkadot/runtime/parachains/src/assigner_parachains/mock_helpers.rs index e6e9fb074aa97e87e6fe92819cc57e5bfa2ca656..a46e114daeaf458fb6bc985a5bb2ebad951d7e3b 100644 --- a/polkadot/runtime/parachains/src/assigner_parachains/mock_helpers.rs +++ b/polkadot/runtime/parachains/src/assigner_parachains/mock_helpers.rs @@ -60,11 +60,12 @@ impl GenesisConfigBuilder { pub(super) fn build(self) -> MockGenesisConfig { let mut genesis = default_genesis_config(); let config = &mut genesis.configuration.config; - config.coretime_cores = self.on_demand_cores; - config.on_demand_base_fee = self.on_demand_base_fee; - config.on_demand_fee_variability = self.on_demand_fee_variability; - config.on_demand_queue_max_size = self.on_demand_max_queue_size; - config.on_demand_target_queue_utilization = self.on_demand_target_queue_utilization; + config.scheduler_params.num_cores = self.on_demand_cores; + config.scheduler_params.on_demand_base_fee = self.on_demand_base_fee; + config.scheduler_params.on_demand_fee_variability = self.on_demand_fee_variability; + config.scheduler_params.on_demand_queue_max_size = self.on_demand_max_queue_size; + config.scheduler_params.on_demand_target_queue_utilization = + self.on_demand_target_queue_utilization; let paras = &mut genesis.paras.paras; for para_id in self.onboarded_on_demand_chains { diff --git a/polkadot/runtime/parachains/src/builder.rs b/polkadot/runtime/parachains/src/builder.rs index 016b3fca589a5b845110d9f25199cc8b8aef5bfe..d1e2bc392febe67deeda2f545387665435e42eaa 100644 --- a/polkadot/runtime/parachains/src/builder.rs +++ b/polkadot/runtime/parachains/src/builder.rs @@ -18,23 +18,20 @@ use crate::{ configuration, inclusion, initializer, paras, paras::ParaKind, paras_inherent, - scheduler::{ - self, - common::{AssignmentProvider, AssignmentProviderConfig}, - CoreOccupied, ParasEntry, - }, + scheduler::{self, common::AssignmentProvider, CoreOccupied, ParasEntry}, session_info, shared, }; use bitvec::{order::Lsb0 as BitOrderLsb0, vec::BitVec}; use frame_support::pallet_prelude::*; use frame_system::pallet_prelude::*; use primitives::{ - collator_signature_payload, AvailabilityBitfield, BackedCandidate, CandidateCommitments, - CandidateDescriptor, CandidateHash, CollatorId, CollatorSignature, CommittedCandidateReceipt, - CompactStatement, CoreIndex, DisputeStatement, DisputeStatementSet, GroupIndex, HeadData, - Id as ParaId, IndexedVec, InherentData as ParachainsInherentData, InvalidDisputeStatementKind, - PersistedValidationData, SessionIndex, SigningContext, UncheckedSigned, - ValidDisputeStatementKind, ValidationCode, ValidatorId, ValidatorIndex, ValidityAttestation, + collator_signature_payload, node_features::FeatureIndex, AvailabilityBitfield, BackedCandidate, + CandidateCommitments, CandidateDescriptor, CandidateHash, CollatorId, CollatorSignature, + CommittedCandidateReceipt, CompactStatement, CoreIndex, DisputeStatement, DisputeStatementSet, + GroupIndex, HeadData, Id as ParaId, IndexedVec, InherentData as ParachainsInherentData, + InvalidDisputeStatementKind, PersistedValidationData, SessionIndex, SigningContext, + UncheckedSigned, ValidDisputeStatementKind, ValidationCode, ValidatorId, ValidatorIndex, + ValidityAttestation, }; use sp_core::{sr25519, H256}; use sp_runtime::{ @@ -42,7 +39,11 @@ use sp_runtime::{ traits::{Header as HeaderT, One, TrailingZeroInput, Zero}, RuntimeAppPublic, }; -use sp_std::{collections::btree_map::BTreeMap, prelude::Vec, vec}; +use sp_std::{ + collections::{btree_map::BTreeMap, btree_set::BTreeSet, vec_deque::VecDeque}, + prelude::Vec, + vec, +}; fn mock_validation_code() -> ValidationCode { ValidationCode(vec![1, 2, 3]) @@ -86,18 +87,25 @@ pub(crate) struct BenchBuilder { /// Optionally set the number of dispute statements for each candidate. dispute_statements: BTreeMap, /// Session index of for each dispute. Index of slice corresponds to a core, - /// which is offset by the number of entries for `backed_and_concluding_cores`. I.E. if - /// `backed_and_concluding_cores` has 3 entries, the first index of `dispute_sessions` + /// which is offset by the number of entries for `backed_and_concluding_paras`. I.E. if + /// `backed_and_concluding_paras` has 3 entries, the first index of `dispute_sessions` /// will correspond to core index 3. There must be one entry for each core with a dispute /// statement set. dispute_sessions: Vec, - /// Map from core seed to number of validity votes. - backed_and_concluding_cores: BTreeMap, + /// Map from para id to number of validity votes. Core indices are generated based on + /// `elastic_paras` configuration. Each para id in `elastic_paras` gets the + /// specified amount of consecutive cores assigned to it. If a para id is not present + /// in `elastic_paras` it get assigned to a single core. + backed_and_concluding_paras: BTreeMap, + /// Map from para id (seed) to number of chained candidates. + elastic_paras: BTreeMap, /// Make every candidate include a code upgrade by setting this to `Some` where the interior /// value is the byte length of the new code. code_upgrade: Option, /// Specifies whether the claimqueue should be filled. fill_claimqueue: bool, + /// Cores which should not be available when being populated with pending candidates. + unavailable_cores: Vec, _phantom: sp_std::marker::PhantomData, } @@ -109,6 +117,7 @@ pub(crate) struct Bench { pub(crate) _block_number: BlockNumberFor, } +#[allow(dead_code)] impl BenchBuilder { /// Create a new `BenchBuilder` with some opinionated values that should work with the rest /// of the functions in this implementation. @@ -122,9 +131,11 @@ impl BenchBuilder { max_validators: None, dispute_statements: BTreeMap::new(), dispute_sessions: Default::default(), - backed_and_concluding_cores: Default::default(), + backed_and_concluding_paras: Default::default(), + elastic_paras: Default::default(), code_upgrade: None, fill_claimqueue: true, + unavailable_cores: vec![], _phantom: sp_std::marker::PhantomData::, } } @@ -132,7 +143,7 @@ impl BenchBuilder { /// Set the session index for each dispute statement set (in other words, set the session the /// the dispute statement set's relay chain block is from). Indexes of `dispute_sessions` /// correspond to a core, which is offset by the number of entries for - /// `backed_and_concluding_cores`. I.E. if `backed_and_concluding_cores` cores has 3 entries, + /// `backed_and_concluding_paras`. I.E. if `backed_and_concluding_paras` cores has 3 entries, /// the first index of `dispute_sessions` will correspond to core index 3. /// /// Note that there must be an entry for each core with a dispute statement set. @@ -141,12 +152,24 @@ impl BenchBuilder { self } - /// Set a map from core/para id seed to number of validity votes. - pub(crate) fn set_backed_and_concluding_cores( + /// Set the cores which should not be available when being populated with pending candidates. + pub(crate) fn set_unavailable_cores(mut self, unavailable_cores: Vec) -> Self { + self.unavailable_cores = unavailable_cores; + self + } + + /// Set a map from para id seed to number of validity votes. + pub(crate) fn set_backed_and_concluding_paras( mut self, - backed_and_concluding_cores: BTreeMap, + backed_and_concluding_paras: BTreeMap, ) -> Self { - self.backed_and_concluding_cores = backed_and_concluding_cores; + self.backed_and_concluding_paras = backed_and_concluding_paras; + self + } + + /// Set a map from para id seed to number of cores assigned to it. + pub(crate) fn set_elastic_paras(mut self, elastic_paras: BTreeMap) -> Self { + self.elastic_paras = elastic_paras; self } @@ -178,7 +201,7 @@ impl BenchBuilder { /// Maximum number of validators that may be part of a validator group. pub(crate) fn fallback_max_validators() -> u32 { - configuration::Pallet::::config().max_validators.unwrap_or(200) + configuration::ActiveConfig::::get().max_validators.unwrap_or(200) } /// Maximum number of validators participating in parachains consensus (a.k.a. active @@ -197,7 +220,10 @@ impl BenchBuilder { /// Maximum number of validators per core (a.k.a. max validators per group). This value is used /// if none is explicitly set on the builder. pub(crate) fn fallback_max_validators_per_core() -> u32 { - configuration::Pallet::::config().max_validators_per_core.unwrap_or(5) + configuration::ActiveConfig::::get() + .scheduler_params + .max_validators_per_core + .unwrap_or(5) } /// Specify a mapping of core index/ para id to the number of dispute statements for the @@ -241,18 +267,8 @@ impl BenchBuilder { (Self::fallback_max_validators() / 2) + 1 } - /// Create para id, core index, and grab the associated group index from the scheduler pallet. - fn create_indexes(&self, seed: u32) -> (ParaId, CoreIndex, GroupIndex) { - let para_id = ParaId::from(seed); - let core_idx = CoreIndex(seed); - let group_idx = - scheduler::Pallet::::group_assigned_to_core(core_idx, self.block_number).unwrap(); - - (para_id, core_idx, group_idx) - } - fn mock_head_data() -> HeadData { - let max_head_size = configuration::Pallet::::config().max_head_data_size; + let max_head_size = configuration::ActiveConfig::::get().max_head_data_size; HeadData(vec![0xFF; max_head_size as usize]) } @@ -264,7 +280,7 @@ impl BenchBuilder { persisted_validation_data_hash: Default::default(), pov_hash: Default::default(), erasure_root: Default::default(), - signature: CollatorSignature::from(sr25519::Signature([42u8; 64])), + signature: CollatorSignature::from(sr25519::Signature::from_raw([42u8; 64])), para_head: Default::default(), validation_code_hash: mock_validation_code().hash(), } @@ -276,11 +292,13 @@ impl BenchBuilder { core_idx: CoreIndex, candidate_hash: CandidateHash, availability_votes: BitVec, + commitments: CandidateCommitments, ) -> inclusion::CandidatePendingAvailability> { inclusion::CandidatePendingAvailability::>::new( core_idx, // core candidate_hash, // hash Self::candidate_descriptor_mock(), // candidate descriptor + commitments, // commitments availability_votes, // availability votes Default::default(), // backers Zero::zero(), // relay parent @@ -301,12 +319,6 @@ impl BenchBuilder { availability_votes: BitVec, candidate_hash: CandidateHash, ) { - let candidate_availability = Self::candidate_availability_mock( - group_idx, - core_idx, - candidate_hash, - availability_votes, - ); let commitments = CandidateCommitments:: { upward_messages: Default::default(), horizontal_messages: Default::default(), @@ -315,16 +327,29 @@ impl BenchBuilder { processed_downward_messages: 0, hrmp_watermark: 0u32.into(), }; - inclusion::PendingAvailability::::insert(para_id, candidate_availability); - inclusion::PendingAvailabilityCommitments::::insert(¶_id, commitments); + let candidate_availability = Self::candidate_availability_mock( + group_idx, + core_idx, + candidate_hash, + availability_votes, + commitments, + ); + inclusion::PendingAvailability::::mutate(para_id, |maybe_andidates| { + if let Some(candidates) = maybe_andidates { + candidates.push_back(candidate_availability); + } else { + *maybe_andidates = + Some([candidate_availability].into_iter().collect::>()); + } + }); } /// Create an `AvailabilityBitfield` where `concluding` is a map where each key is a core index /// that is concluding and `cores` is the total number of cores in the system. - fn availability_bitvec(concluding: &BTreeMap, cores: u32) -> AvailabilityBitfield { + fn availability_bitvec(concluding_cores: &BTreeSet, cores: usize) -> AvailabilityBitfield { let mut bitfields = bitvec::bitvec![u8, bitvec::order::Lsb0; 0; 0]; for i in 0..cores { - if concluding.get(&(i as u32)).is_some() { + if concluding_cores.contains(&(i as u32)) { bitfields.push(true); } else { bitfields.push(false) @@ -348,13 +373,13 @@ impl BenchBuilder { } } - /// Register `cores` count of parachains. + /// Register `n_paras` count of parachains. /// /// Note that this must be called at least 2 sessions before the target session as there is a /// n+2 session delay for the scheduled actions to take effect. - fn setup_para_ids(cores: u32) { + fn setup_para_ids(n_paras: usize) { // make sure parachains exist prior to session change. - for i in 0..cores { + for i in 0..n_paras { let para_id = ParaId::from(i as u32); let validation_code = mock_validation_code(); @@ -407,7 +432,10 @@ impl BenchBuilder { mut self, target_session: SessionIndex, validators: Vec<(T::AccountId, ValidatorId)>, - total_cores: u32, + // Total cores used in the scenario + total_cores: usize, + // Additional cores for elastic parachains + extra_cores: usize, ) -> Self { let mut block = 1; for session in 0..=target_session { @@ -431,18 +459,16 @@ impl BenchBuilder { &Digest { logs: Vec::new() }, ); - assert_eq!(>::session_index(), target_session); + assert_eq!(shared::CurrentSessionIndex::::get(), target_session); // We need to refetch validators since they have been shuffled. - let validators_shuffled = session_info::Pallet::::session_info(target_session) - .unwrap() - .validators - .clone(); + let validators_shuffled = + session_info::Sessions::::get(target_session).unwrap().validators.clone(); self.validators = Some(validators_shuffled); self.block_number = block_number; self.session = target_session; - assert_eq!(paras::Pallet::::parachains().len(), total_cores as usize); + assert_eq!(paras::Parachains::::get().len(), total_cores - extra_cores); self } @@ -453,13 +479,42 @@ impl BenchBuilder { /// to the cores successfully being freed from the candidates being marked as available. fn create_availability_bitfields( &self, - concluding_cores: &BTreeMap, - total_cores: u32, + concluding_paras: &BTreeMap, + elastic_paras: &BTreeMap, + total_cores: usize, ) -> Vec> { let validators = self.validators.as_ref().expect("must have some validators prior to calling"); - let availability_bitvec = Self::availability_bitvec(concluding_cores, total_cores); + let mut current_core_idx = 0u32; + let mut concluding_cores = BTreeSet::new(); + + for (seed, _) in concluding_paras.iter() { + // make sure the candidates that will be concluding are marked as pending availability. + let para_id = ParaId::from(*seed); + + for _chain_idx in 0..elastic_paras.get(&seed).cloned().unwrap_or(1) { + let core_idx = CoreIndex::from(current_core_idx); + let group_idx = + scheduler::Pallet::::group_assigned_to_core(core_idx, self.block_number) + .unwrap(); + + Self::add_availability( + para_id, + core_idx, + group_idx, + // No validators have made this candidate available yet. + bitvec::bitvec![u8, bitvec::order::Lsb0; 0; validators.len()], + CandidateHash(H256::from(byte32_slice_from(current_core_idx))), + ); + if !self.unavailable_cores.contains(¤t_core_idx) { + concluding_cores.insert(current_core_idx); + } + current_core_idx += 1; + } + } + + let availability_bitvec = Self::availability_bitvec(&concluding_cores, total_cores); let bitfields: Vec> = validators .iter() @@ -476,122 +531,149 @@ impl BenchBuilder { }) .collect(); - for (seed, _) in concluding_cores.iter() { - // make sure the candidates that will be concluding are marked as pending availability. - let (para_id, core_idx, group_idx) = self.create_indexes(*seed); - Self::add_availability( - para_id, - core_idx, - group_idx, - Self::validator_availability_votes_yes(validators.len()), - CandidateHash(H256::from(byte32_slice_from(*seed))), - ); - } - bitfields } /// Create backed candidates for `cores_with_backed_candidates`. You need these cores to be /// scheduled _within_ paras inherent, which requires marking the available bitfields as fully /// available. - /// - `cores_with_backed_candidates` Mapping of `para_id`/`core_idx`/`group_idx` seed to number - /// of + /// - `cores_with_backed_candidates` Mapping of `para_id` seed to number of /// validity votes. fn create_backed_candidates( &self, - cores_with_backed_candidates: &BTreeMap, + paras_with_backed_candidates: &BTreeMap, + elastic_paras: &BTreeMap, includes_code_upgrade: Option, ) -> Vec> { let validators = self.validators.as_ref().expect("must have some validators prior to calling"); - let config = configuration::Pallet::::config(); + let config = configuration::ActiveConfig::::get(); - cores_with_backed_candidates + let mut current_core_idx = 0u32; + paras_with_backed_candidates .iter() - .map(|(seed, num_votes)| { + .flat_map(|(seed, num_votes)| { assert!(*num_votes <= validators.len() as u32); - let (para_id, _core_idx, group_idx) = self.create_indexes(*seed); - - // This generates a pair and adds it to the keystore, returning just the public. - let collator_public = CollatorId::generate_pair(None); - let header = Self::header(self.block_number); - let relay_parent = header.hash(); - let head_data = Self::mock_head_data(); - let persisted_validation_data_hash = PersistedValidationData:: { - parent_head: head_data.clone(), - relay_parent_number: self.relay_parent_number(), - relay_parent_storage_root: Default::default(), - max_pov_size: config.max_pov_size, - } - .hash(); - - let pov_hash = Default::default(); - let validation_code_hash = mock_validation_code().hash(); - let payload = collator_signature_payload( - &relay_parent, - ¶_id, - &persisted_validation_data_hash, - &pov_hash, - &validation_code_hash, - ); - let signature = collator_public.sign(&payload).unwrap(); - - // Set the head data so it can be used while validating the signatures on the - // candidate receipt. - paras::Pallet::::heads_insert(¶_id, head_data.clone()); - - let mut past_code_meta = paras::ParaPastCodeMeta::>::default(); - past_code_meta.note_replacement(0u32.into(), 0u32.into()); - - let group_validators = scheduler::Pallet::::group_validators(group_idx).unwrap(); - - let candidate = CommittedCandidateReceipt:: { - descriptor: CandidateDescriptor:: { - para_id, - relay_parent, - collator: collator_public, - persisted_validation_data_hash, - pov_hash, - erasure_root: Default::default(), - signature, - para_head: head_data.hash(), - validation_code_hash, - }, - commitments: CandidateCommitments:: { - upward_messages: Default::default(), - horizontal_messages: Default::default(), - new_validation_code: includes_code_upgrade - .map(|v| ValidationCode(vec![42u8; v as usize])), - head_data, - processed_downward_messages: 0, - hrmp_watermark: self.relay_parent_number(), - }, - }; - - let candidate_hash = candidate.hash(); - - let validity_votes: Vec<_> = group_validators - .iter() - .take(*num_votes as usize) - .map(|val_idx| { - let public = validators.get(*val_idx).unwrap(); - let sig = UncheckedSigned::::benchmark_sign( - public, - CompactStatement::Valid(candidate_hash), - &self.signing_context(), - *val_idx, + + let para_id = ParaId::from(*seed); + let mut prev_head = None; + // How many chained candidates we want to build ? + (0..elastic_paras.get(&seed).cloned().unwrap_or(1)) + .map(|chain_idx| { + let core_idx = CoreIndex::from(current_core_idx); + // Advance core index. + current_core_idx += 1; + let group_idx = scheduler::Pallet::::group_assigned_to_core( + core_idx, + self.block_number, ) - .benchmark_signature(); + .unwrap(); - ValidityAttestation::Explicit(sig.clone()) - }) - .collect(); + // This generates a pair and adds it to the keystore, returning just the + // public. + let collator_public = CollatorId::generate_pair(None); + let header = Self::header(self.block_number); + let relay_parent = header.hash(); - BackedCandidate:: { - candidate, - validity_votes, - validator_indices: bitvec::bitvec![u8, bitvec::order::Lsb0; 1; group_validators.len()], - } + // Set the head data so it can be used while validating the signatures on + // the candidate receipt. + let mut head_data = Self::mock_head_data(); + + if chain_idx == 0 { + // Only first parahead of the chain needs to be set in storage. + paras::Pallet::::heads_insert(¶_id, head_data.clone()); + } else { + // Make each candidate head data unique to avoid cycles. + head_data.0[0] = chain_idx; + } + + let persisted_validation_data_hash = PersistedValidationData:: { + // To form a chain we set parent head to previous block if any, or + // default to what is in storage already setup. + parent_head: prev_head.take().unwrap_or(head_data.clone()), + relay_parent_number: self.relay_parent_number(), + relay_parent_storage_root: Default::default(), + max_pov_size: config.max_pov_size, + } + .hash(); + + prev_head = Some(head_data.clone()); + + let pov_hash = Default::default(); + let validation_code_hash = mock_validation_code().hash(); + let payload = collator_signature_payload( + &relay_parent, + ¶_id, + &persisted_validation_data_hash, + &pov_hash, + &validation_code_hash, + ); + let signature = collator_public.sign(&payload).unwrap(); + + let mut past_code_meta = + paras::ParaPastCodeMeta::>::default(); + past_code_meta.note_replacement(0u32.into(), 0u32.into()); + + let group_validators = + scheduler::Pallet::::group_validators(group_idx).unwrap(); + + let candidate = CommittedCandidateReceipt:: { + descriptor: CandidateDescriptor:: { + para_id, + relay_parent, + collator: collator_public, + persisted_validation_data_hash, + pov_hash, + erasure_root: Default::default(), + signature, + para_head: head_data.hash(), + validation_code_hash, + }, + commitments: CandidateCommitments:: { + upward_messages: Default::default(), + horizontal_messages: Default::default(), + new_validation_code: includes_code_upgrade + .map(|v| ValidationCode(vec![42u8; v as usize])), + head_data, + processed_downward_messages: 0, + hrmp_watermark: self.relay_parent_number(), + }, + }; + + let candidate_hash = candidate.hash(); + + let validity_votes: Vec<_> = group_validators + .iter() + .take(*num_votes as usize) + .map(|val_idx| { + let public = validators.get(*val_idx).unwrap(); + let sig = UncheckedSigned::::benchmark_sign( + public, + CompactStatement::Valid(candidate_hash), + &self.signing_context(), + *val_idx, + ) + .benchmark_signature(); + + ValidityAttestation::Explicit(sig.clone()) + }) + .collect(); + + // Check if the elastic scaling bit is set, if so we need to supply the core + // index in the generated candidate. + let core_idx = configuration::ActiveConfig::::get() + .node_features + .get(FeatureIndex::ElasticScalingMVP as usize) + .map(|_the_bit| core_idx); + + BackedCandidate::::new( + candidate, + validity_votes, + bitvec::bitvec![u8, bitvec::order::Lsb0; 1; group_validators.len()], + core_idx, + ) + }) + .collect::>() }) .collect() } @@ -608,6 +690,8 @@ impl BenchBuilder { self.validators.as_ref().expect("must have some validators prior to calling"); let dispute_sessions = dispute_sessions.as_ref(); + let mut current_core_idx = start; + (start..last) .map(|seed| { let dispute_session_idx = (seed - start) as usize; @@ -616,7 +700,14 @@ impl BenchBuilder { .cloned() .unwrap_or(self.target_session); - let (para_id, core_idx, group_idx) = self.create_indexes(seed); + let para_id = ParaId::from(seed); + let core_idx = CoreIndex::from(current_core_idx); + current_core_idx +=1; + + let group_idx = + scheduler::Pallet::::group_assigned_to_core(core_idx, self.block_number) + .unwrap(); + let candidate_hash = CandidateHash(H256::from(byte32_slice_from(seed))); let relay_parent = H256::from(byte32_slice_from(seed)); @@ -660,87 +751,130 @@ impl BenchBuilder { /// Build a scenario for testing or benchmarks. /// - /// Note that this API only allows building scenarios where the `backed_and_concluding_cores` + /// Note that this API only allows building scenarios where the `backed_and_concluding_paras` /// are mutually exclusive with the cores for disputes. So - /// `backed_and_concluding_cores.len() + dispute_sessions.len()` must be less than the max + /// `backed_and_concluding_paras.len() + dispute_sessions.len()` must be less than the max /// number of cores. pub(crate) fn build(self) -> Bench { // Make sure relevant storage is cleared. This is just to get the asserts to work when // running tests because it seems the storage is not cleared in between. #[allow(deprecated)] - inclusion::PendingAvailabilityCommitments::::remove_all(None); - #[allow(deprecated)] inclusion::PendingAvailability::::remove_all(None); // We don't allow a core to have both disputes and be marked fully available at this block. - let max_cores = self.max_cores(); + let max_cores = self.max_cores() as usize; + + let extra_cores = self + .elastic_paras + .values() + .map(|count| *count as usize) + .sum::() + .saturating_sub(self.elastic_paras.len() as usize); + let used_cores = - (self.dispute_sessions.len() + self.backed_and_concluding_cores.len()) as u32; + self.dispute_sessions.len() + self.backed_and_concluding_paras.len() + extra_cores; + assert!(used_cores <= max_cores); let fill_claimqueue = self.fill_claimqueue; // NOTE: there is an n+2 session delay for these actions to take effect. // We are currently in Session 0, so these changes will take effect in Session 2. - Self::setup_para_ids(used_cores); + Self::setup_para_ids(used_cores - extra_cores); configuration::ActiveConfig::::mutate(|c| { - c.coretime_cores = used_cores; + c.scheduler_params.num_cores = used_cores as u32; }); let validator_ids = Self::generate_validator_pairs(self.max_validators()); let target_session = SessionIndex::from(self.target_session); - let builder = self.setup_session(target_session, validator_ids, used_cores); + let builder = self.setup_session(target_session, validator_ids, used_cores, extra_cores); - let bitfields = - builder.create_availability_bitfields(&builder.backed_and_concluding_cores, used_cores); - let backed_candidates = builder - .create_backed_candidates(&builder.backed_and_concluding_cores, builder.code_upgrade); + let bitfields = builder.create_availability_bitfields( + &builder.backed_and_concluding_paras, + &builder.elastic_paras, + used_cores, + ); + let backed_candidates = builder.create_backed_candidates( + &builder.backed_and_concluding_paras, + &builder.elastic_paras, + builder.code_upgrade, + ); let disputes = builder.create_disputes( - builder.backed_and_concluding_cores.len() as u32, - used_cores, + builder.backed_and_concluding_paras.len() as u32, + (used_cores - extra_cores) as u32, builder.dispute_sessions.as_slice(), ); + let mut disputed_cores = (builder.backed_and_concluding_paras.len() as u32.. + ((used_cores - extra_cores) as u32)) + .into_iter() + .map(|idx| (idx, 0)) + .collect::>(); - assert_eq!( - inclusion::PendingAvailabilityCommitments::::iter().count(), - used_cores as usize, - ); - assert_eq!(inclusion::PendingAvailability::::iter().count(), used_cores as usize,); + let mut all_cores = builder.backed_and_concluding_paras.clone(); + all_cores.append(&mut disputed_cores); + + assert_eq!(inclusion::PendingAvailability::::iter().count(), used_cores - extra_cores); // Mark all the used cores as occupied. We expect that there are - // `backed_and_concluding_cores` that are pending availability and that there are - // `used_cores - backed_and_concluding_cores ` which are about to be disputed. - let now = >::block_number() + One::one(); - let cores = (0..used_cores) - .into_iter() - .map(|i| { - let AssignmentProviderConfig { ttl, .. } = - scheduler::Pallet::::assignment_provider_config(CoreIndex(i)); - // Load an assignment into provider so that one is present to pop - let assignment = ::AssignmentProvider::get_mock_assignment( - CoreIndex(i), - ParaId::from(i), - ); - CoreOccupied::Paras(ParasEntry::new(assignment, now + ttl)) + // `backed_and_concluding_paras` that are pending availability and that there are + // `used_cores - backed_and_concluding_paras ` which are about to be disputed. + let now = frame_system::Pallet::::block_number() + One::one(); + + let mut core_idx = 0u32; + let elastic_paras = &builder.elastic_paras; + // Assign potentially multiple cores to same parachains, + let cores = all_cores + .iter() + .flat_map(|(para_id, _)| { + (0..elastic_paras.get(¶_id).cloned().unwrap_or(1)) + .map(|_para_local_core_idx| { + let ttl = configuration::ActiveConfig::::get().scheduler_params.ttl; + // Load an assignment into provider so that one is present to pop + let assignment = + ::AssignmentProvider::get_mock_assignment( + CoreIndex(core_idx), + ParaId::from(*para_id), + ); + core_idx += 1; + CoreOccupied::Paras(ParasEntry::new(assignment, now + ttl)) + }) + .collect::>>() }) - .collect(); + .collect::>>(); + scheduler::AvailabilityCores::::set(cores); + + core_idx = 0u32; if fill_claimqueue { - // Add items to claim queue as well: - let cores = (0..used_cores) - .into_iter() - .map(|i| { - let AssignmentProviderConfig { ttl, .. } = - scheduler::Pallet::::assignment_provider_config(CoreIndex(i)); - // Load an assignment into provider so that one is present to pop - let assignment = - ::AssignmentProvider::get_mock_assignment( - CoreIndex(i), - ParaId::from(i), - ); - (CoreIndex(i), [ParasEntry::new(assignment, now + ttl)].into()) + let cores = all_cores + .keys() + .flat_map(|para_id| { + (0..elastic_paras.get(¶_id).cloned().unwrap_or(1)) + .filter_map(|_para_local_core_idx| { + let ttl = configuration::ActiveConfig::::get().scheduler_params.ttl; + // Load an assignment into provider so that one is present to pop + let assignment = + ::AssignmentProvider::get_mock_assignment( + CoreIndex(core_idx), + ParaId::from(*para_id), + ); + + let entry = ( + CoreIndex(core_idx), + [ParasEntry::new(assignment, now + ttl)].into(), + ); + let res = if builder.unavailable_cores.contains(&core_idx) { + None + } else { + Some(entry) + }; + core_idx += 1; + res + }) + .collect::>)>>() }) - .collect(); + .collect::>>>(); + scheduler::ClaimQueue::::set(cores); } diff --git a/polkadot/runtime/parachains/src/configuration.rs b/polkadot/runtime/parachains/src/configuration.rs index 4619313590ebc2d5d92dfc85a4e845c381c61607..b5dad6c6e864ba94854e3b56198c75f894f89ce7 100644 --- a/polkadot/runtime/parachains/src/configuration.rs +++ b/polkadot/runtime/parachains/src/configuration.rs @@ -26,10 +26,9 @@ use polkadot_parachain_primitives::primitives::{ MAX_HORIZONTAL_MESSAGE_NUM, MAX_UPWARD_MESSAGE_NUM, }; use primitives::{ - vstaging::{ApprovalVotingParams, NodeFeatures}, - AsyncBackingParams, Balance, ExecutorParamError, ExecutorParams, SessionIndex, - LEGACY_MIN_BACKING_VOTES, MAX_CODE_SIZE, MAX_HEAD_DATA_SIZE, MAX_POV_SIZE, - ON_DEMAND_DEFAULT_QUEUE_MAX_SIZE, + ApprovalVotingParams, AsyncBackingParams, Balance, ExecutorParamError, ExecutorParams, + NodeFeatures, SessionIndex, LEGACY_MIN_BACKING_VOTES, MAX_CODE_SIZE, MAX_HEAD_DATA_SIZE, + MAX_POV_SIZE, ON_DEMAND_MAX_QUEUE_MAX_SIZE, }; use sp_runtime::{traits::Zero, Perbill}; use sp_std::prelude::*; @@ -43,6 +42,7 @@ mod benchmarking; pub mod migration; pub use pallet::*; +use primitives::vstaging::SchedulerParams; const LOG_TARGET: &str = "runtime::configuration"; @@ -118,9 +118,9 @@ pub struct HostConfiguration { /// been completed. /// /// Note, there are situations in which `expected_at` in the past. For example, if - /// [`paras_availability_period`](Self::paras_availability_period) is less than the delay set - /// by this field or if PVF pre-check took more time than the delay. In such cases, the upgrade - /// is further at the earliest possible time determined by + /// [`paras_availability_period`](SchedulerParams::paras_availability_period) is less than the + /// delay set by this field or if PVF pre-check took more time than the delay. In such cases, + /// the upgrade is further at the earliest possible time determined by /// [`minimum_validation_upgrade_delay`](Self::minimum_validation_upgrade_delay). /// /// The rationale for this delay has to do with relay-chain reversions. In case there is an @@ -172,48 +172,7 @@ pub struct HostConfiguration { /// How long to keep code on-chain, in blocks. This should be sufficiently long that disputes /// have concluded. pub code_retention_period: BlockNumber, - /// How many cores are managed by the coretime chain. - pub coretime_cores: u32, - /// The number of retries that a on demand author has to submit their block. - pub on_demand_retries: u32, - /// The maximum queue size of the pay as you go module. - pub on_demand_queue_max_size: u32, - /// The target utilization of the spot price queue in percentages. - pub on_demand_target_queue_utilization: Perbill, - /// How quickly the fee rises in reaction to increased utilization. - /// The lower the number the slower the increase. - pub on_demand_fee_variability: Perbill, - /// The minimum amount needed to claim a slot in the spot pricing queue. - pub on_demand_base_fee: Balance, - /// The number of blocks an on demand claim stays in the scheduler's claimqueue before getting - /// cleared. This number should go reasonably higher than the number of blocks in the async - /// backing lookahead. - pub on_demand_ttl: BlockNumber, - /// How often parachain groups should be rotated across parachains. - /// - /// Must be non-zero. - pub group_rotation_frequency: BlockNumber, - /// The minimum availability period, in blocks. - /// - /// This is the minimum amount of blocks after a core became occupied that validators have time - /// to make the block available. - /// - /// This value only has effect on group rotations. If backers backed something at the end of - /// their rotation, the occupied core affects the backing group that comes afterwards. We limit - /// the effect one backing group can have on the next to `paras_availability_period` blocks. - /// - /// Within a group rotation there is no timeout as backers are only affecting themselves. - /// - /// Must be at least 1. With a value of 1, the previous group will not be able to negatively - /// affect the following group at the expense of a tight availability timeline at group - /// rotation boundaries. - pub paras_availability_period: BlockNumber, - /// The amount of blocks ahead to schedule paras. - pub scheduling_lookahead: u32, - /// The maximum number of validators to have per core. - /// - /// `None` means no maximum. - pub max_validators_per_core: Option, + /// The maximum number of validators to use for parachain consensus, period. /// /// `None` means no maximum. @@ -227,7 +186,7 @@ pub struct HostConfiguration { /// /// Must be at least 1. pub no_show_slots: u32, - /// The number of delay tranches in total. + /// The number of delay tranches in total. Must be at least 1. pub n_delay_tranches: u32, /// The width of the zeroth delay tranche for approval assignments. This many delay tranches /// beyond 0 are all consolidated to form a wide 0 tranche. @@ -257,7 +216,7 @@ pub struct HostConfiguration { /// scheduled. This number is controlled by this field. /// /// This value should be greater than - /// [`paras_availability_period`](Self::paras_availability_period). + /// [`paras_availability_period`](SchedulerParams::paras_availability_period). pub minimum_validation_upgrade_delay: BlockNumber, /// The minimum number of valid backing statements required to consider a parachain candidate /// backable. @@ -266,32 +225,28 @@ pub struct HostConfiguration { pub node_features: NodeFeatures, /// Params used by approval-voting pub approval_voting_params: ApprovalVotingParams, + /// Scheduler parameters + pub scheduler_params: SchedulerParams, } impl> Default for HostConfiguration { fn default() -> Self { - Self { + let ret = Self { async_backing_params: AsyncBackingParams { max_candidate_depth: 0, allowed_ancestry_len: 0, }, - group_rotation_frequency: 1u32.into(), - paras_availability_period: 1u32.into(), no_show_slots: 1u32.into(), validation_upgrade_cooldown: Default::default(), validation_upgrade_delay: 2u32.into(), code_retention_period: Default::default(), - max_code_size: Default::default(), + max_code_size: MAX_CODE_SIZE, max_pov_size: Default::default(), max_head_data_size: Default::default(), - coretime_cores: Default::default(), - on_demand_retries: Default::default(), - scheduling_lookahead: 1, - max_validators_per_core: Default::default(), max_validators: None, dispute_period: 6, dispute_post_conclusion_acceptance_period: 100.into(), - n_delay_tranches: Default::default(), + n_delay_tranches: 1, zeroth_delay_tranche_width: Default::default(), needed_approvals: Default::default(), relay_vrf_modulo_samples: Default::default(), @@ -312,14 +267,33 @@ impl> Default for HostConfiguration> HostConfiguration { + /// Mutate the values of self to be good estimates for benchmarking. + /// + /// The values do not need to be worst-case, since the benchmarking logic extrapolates. They + /// should be a bit more than usually expected. + fn with_benchmarking_default(mut self) -> Self { + self.max_head_data_size = self.max_head_data_size.max(1 << 20); + self.max_downward_message_size = self.max_downward_message_size.max(1 << 16); + self.hrmp_channel_max_capacity = self.hrmp_channel_max_capacity.max(1000); + self.hrmp_channel_max_message_size = self.hrmp_channel_max_message_size.max(1 << 16); + self.hrmp_max_parachain_inbound_channels = + self.hrmp_max_parachain_inbound_channels.max(100); + self.hrmp_max_parachain_outbound_channels = + self.hrmp_max_parachain_outbound_channels.max(100); + self } } @@ -359,6 +333,12 @@ pub enum InconsistentError { ZeroMinimumBackingVotes, /// `executor_params` are inconsistent. InconsistentExecutorParams { inner: ExecutorParamError }, + /// TTL should be bigger than lookahead + LookaheadExceedsTTL, + /// Passed in queue size for on-demand was too large. + OnDemandQueueSizeTooLarge, + /// Number of delay tranches cannot be 0. + ZeroDelayTranches, } impl HostConfiguration @@ -373,11 +353,11 @@ where pub fn check_consistency(&self) -> Result<(), InconsistentError> { use InconsistentError::*; - if self.group_rotation_frequency.is_zero() { + if self.scheduler_params.group_rotation_frequency.is_zero() { return Err(ZeroGroupRotationFrequency) } - if self.paras_availability_period.is_zero() { + if self.scheduler_params.paras_availability_period.is_zero() { return Err(ZeroParasAvailabilityPeriod) } @@ -399,10 +379,11 @@ where return Err(MaxPovSizeExceedHardLimit { max_pov_size: self.max_pov_size }) } - if self.minimum_validation_upgrade_delay <= self.paras_availability_period { + if self.minimum_validation_upgrade_delay <= self.scheduler_params.paras_availability_period + { return Err(MinimumValidationUpgradeDelayLessThanChainAvailabilityPeriod { minimum_validation_upgrade_delay: self.minimum_validation_upgrade_delay.clone(), - paras_availability_period: self.paras_availability_period.clone(), + paras_availability_period: self.scheduler_params.paras_availability_period.clone(), }) } @@ -447,6 +428,18 @@ where return Err(InconsistentExecutorParams { inner }) } + if self.scheduler_params.ttl < self.scheduler_params.lookahead.into() { + return Err(LookaheadExceedsTTL) + } + + if self.scheduler_params.on_demand_queue_max_size > ON_DEMAND_MAX_QUEUE_MAX_SIZE { + return Err(OnDemandQueueSizeTooLarge) + } + + if self.n_delay_tranches.is_zero() { + return Err(ZeroDelayTranches) + } + Ok(()) } @@ -471,6 +464,7 @@ pub trait WeightInfo { fn set_config_with_executor_params() -> Weight; fn set_config_with_perbill() -> Weight; fn set_node_feature() -> Weight; + fn set_config_with_scheduler_params() -> Weight; } pub struct TestWeightInfo; @@ -499,13 +493,16 @@ impl WeightInfo for TestWeightInfo { fn set_node_feature() -> Weight { Weight::MAX } + fn set_config_with_scheduler_params() -> Weight { + Weight::MAX + } } #[frame_support::pallet] pub mod pallet { use super::*; - /// The current storage version. + /// The in-code storage version. /// /// v0-v1: /// v1-v2: @@ -520,7 +517,8 @@ pub mod pallet { /// v8-v9: /// v9-v10: /// v10-11: - const STORAGE_VERSION: StorageVersion = StorageVersion::new(11); + /// v11-12: + const STORAGE_VERSION: StorageVersion = StorageVersion::new(12); #[pallet::pallet] #[pallet::storage_version(STORAGE_VERSION)] @@ -542,8 +540,7 @@ pub mod pallet { /// The active configuration for the current session. #[pallet::storage] #[pallet::whitelist_storage] - #[pallet::getter(fn config)] - pub(crate) type ActiveConfig = + pub type ActiveConfig = StorageValue<_, HostConfiguration>, ValueQuery>; /// Pending configuration changes. @@ -667,7 +664,7 @@ pub mod pallet { /// Set the number of coretime execution cores. /// - /// Note that this configuration is managed by the coretime chain. Only manually change + /// NOTE: that this configuration is managed by the coretime chain. Only manually change /// this, if you really know what you are doing! #[pallet::call_index(6)] #[pallet::weight(( @@ -679,16 +676,16 @@ pub mod pallet { Self::set_coretime_cores_unchecked(new) } - /// Set the number of retries for a particular on demand. + /// Set the max number of times a claim may timeout on a core before it is abandoned #[pallet::call_index(7)] #[pallet::weight(( T::WeightInfo::set_config_with_u32(), DispatchClass::Operational, ))] - pub fn set_on_demand_retries(origin: OriginFor, new: u32) -> DispatchResult { + pub fn set_max_availability_timeouts(origin: OriginFor, new: u32) -> DispatchResult { ensure_root(origin)?; Self::schedule_config_update(|config| { - config.on_demand_retries = new; + config.scheduler_params.max_availability_timeouts = new; }) } @@ -704,7 +701,7 @@ pub mod pallet { ) -> DispatchResult { ensure_root(origin)?; Self::schedule_config_update(|config| { - config.group_rotation_frequency = new; + config.scheduler_params.group_rotation_frequency = new; }) } @@ -720,7 +717,7 @@ pub mod pallet { ) -> DispatchResult { ensure_root(origin)?; Self::schedule_config_update(|config| { - config.paras_availability_period = new; + config.scheduler_params.paras_availability_period = new; }) } @@ -733,7 +730,7 @@ pub mod pallet { pub fn set_scheduling_lookahead(origin: OriginFor, new: u32) -> DispatchResult { ensure_root(origin)?; Self::schedule_config_update(|config| { - config.scheduling_lookahead = new; + config.scheduler_params.lookahead = new; }) } @@ -749,7 +746,7 @@ pub mod pallet { ) -> DispatchResult { ensure_root(origin)?; Self::schedule_config_update(|config| { - config.max_validators_per_core = new; + config.scheduler_params.max_validators_per_core = new; }) } @@ -1141,7 +1138,7 @@ pub mod pallet { pub fn set_on_demand_base_fee(origin: OriginFor, new: Balance) -> DispatchResult { ensure_root(origin)?; Self::schedule_config_update(|config| { - config.on_demand_base_fee = new; + config.scheduler_params.on_demand_base_fee = new; }) } @@ -1154,7 +1151,7 @@ pub mod pallet { pub fn set_on_demand_fee_variability(origin: OriginFor, new: Perbill) -> DispatchResult { ensure_root(origin)?; Self::schedule_config_update(|config| { - config.on_demand_fee_variability = new; + config.scheduler_params.on_demand_fee_variability = new; }) } @@ -1167,9 +1164,10 @@ pub mod pallet { pub fn set_on_demand_queue_max_size(origin: OriginFor, new: u32) -> DispatchResult { ensure_root(origin)?; Self::schedule_config_update(|config| { - config.on_demand_queue_max_size = new; + config.scheduler_params.on_demand_queue_max_size = new; }) } + /// Set the on demand (parathreads) fee variability. #[pallet::call_index(50)] #[pallet::weight(( @@ -1182,7 +1180,7 @@ pub mod pallet { ) -> DispatchResult { ensure_root(origin)?; Self::schedule_config_update(|config| { - config.on_demand_target_queue_utilization = new; + config.scheduler_params.on_demand_target_queue_utilization = new; }) } /// Set the on demand (parathreads) ttl in the claimqueue. @@ -1194,7 +1192,7 @@ pub mod pallet { pub fn set_on_demand_ttl(origin: OriginFor, new: BlockNumberFor) -> DispatchResult { ensure_root(origin)?; Self::schedule_config_update(|config| { - config.on_demand_ttl = new; + config.scheduler_params.ttl = new; }) } @@ -1244,6 +1242,22 @@ pub mod pallet { config.approval_voting_params = new; }) } + + /// Set scheduler-params. + #[pallet::call_index(55)] + #[pallet::weight(( + T::WeightInfo::set_config_with_scheduler_params(), + DispatchClass::Operational, + ))] + pub fn set_scheduler_params( + origin: OriginFor, + new: SchedulerParams>, + ) -> DispatchResult { + ensure_root(origin)?; + Self::schedule_config_update(|config| { + config.scheduler_params = new; + }) + } } impl Pallet { @@ -1252,7 +1266,7 @@ pub mod pallet { /// To be used if authorization is checked otherwise. pub fn set_coretime_cores_unchecked(new: u32) -> DispatchResult { Self::schedule_config_update(|config| { - config.coretime_cores = new; + config.scheduler_params.num_cores = new; }) } } @@ -1296,7 +1310,7 @@ impl Pallet { pub(crate) fn initializer_on_new_session( session_index: &SessionIndex, ) -> SessionChangeOutcome> { - let pending_configs = >::get(); + let pending_configs = PendingConfigs::::get(); let prev_config = ActiveConfig::::get(); // No pending configuration changes, so we're done. @@ -1323,7 +1337,7 @@ impl Pallet { ActiveConfig::::put(new_config); } - >::put(future); + PendingConfigs::::put(future); SessionChangeOutcome { prev_config, new_config } } @@ -1358,7 +1372,7 @@ impl Pallet { pub(crate) fn schedule_config_update( updater: impl FnOnce(&mut HostConfiguration>), ) -> DispatchResult { - let mut pending_configs = >::get(); + let mut pending_configs = PendingConfigs::::get(); // 1. pending_configs = [] No pending configuration changes. // @@ -1389,11 +1403,11 @@ impl Pallet { let mut base_config = pending_configs .last() .map(|(_, config)| config.clone()) - .unwrap_or_else(Self::config); + .unwrap_or_else(ActiveConfig::::get); let base_config_consistent = base_config.check_consistency().is_ok(); // Now, we need to decide what the new configuration should be. - // We also move the `base_config` to `new_config` to empahsize that the base config was + // We also move the `base_config` to `new_config` to emphasize that the base config was // destroyed by the `updater`. updater(&mut base_config); let new_config = base_config; @@ -1441,7 +1455,7 @@ impl Pallet { pending_configs.push((scheduled_session, new_config)); } - >::put(pending_configs); + PendingConfigs::::put(pending_configs); Ok(()) } diff --git a/polkadot/runtime/parachains/src/configuration/benchmarking.rs b/polkadot/runtime/parachains/src/configuration/benchmarking.rs index 67daf1c459884d42378056b6528605da29578c95..882b5aab096ad2f8227aa7ad0efaddfd2078c3ad 100644 --- a/polkadot/runtime/parachains/src/configuration/benchmarking.rs +++ b/polkadot/runtime/parachains/src/configuration/benchmarking.rs @@ -51,6 +51,8 @@ benchmarks! { set_node_feature{}: set_node_feature(RawOrigin::Root, 255, true) + set_config_with_scheduler_params {} : set_scheduler_params(RawOrigin::Root, SchedulerParams::default()) + impl_benchmark_test_suite!( Pallet, crate::mock::new_test_ext(Default::default()), diff --git a/polkadot/runtime/parachains/src/configuration/migration.rs b/polkadot/runtime/parachains/src/configuration/migration.rs index 2838b73092dbab4a029a684948a85123aa489906..87b30b177e735bdc1ec618a6e403c4c74a801533 100644 --- a/polkadot/runtime/parachains/src/configuration/migration.rs +++ b/polkadot/runtime/parachains/src/configuration/migration.rs @@ -18,6 +18,7 @@ pub mod v10; pub mod v11; +pub mod v12; pub mod v6; pub mod v7; pub mod v8; diff --git a/polkadot/runtime/parachains/src/configuration/migration/v10.rs b/polkadot/runtime/parachains/src/configuration/migration/v10.rs index cf228610e5c9cec1dde8cfb31880fa2b1f68821f..fa72c357d7dab20dfee26fefa270e677f6b8549f 100644 --- a/polkadot/runtime/parachains/src/configuration/migration/v10.rs +++ b/polkadot/runtime/parachains/src/configuration/migration/v10.rs @@ -17,17 +17,19 @@ //! A module that is responsible for migration of storage. use crate::configuration::{Config, Pallet}; -use frame_support::{pallet_prelude::*, traits::Defensive, weights::Weight}; +use frame_support::{ + pallet_prelude::*, + traits::{Defensive, UncheckedOnRuntimeUpgrade}, + weights::Weight, +}; use frame_system::pallet_prelude::BlockNumberFor; use primitives::{ - vstaging::NodeFeatures, AsyncBackingParams, Balance, ExecutorParams, SessionIndex, + AsyncBackingParams, Balance, ExecutorParams, NodeFeatures, SessionIndex, LEGACY_MIN_BACKING_VOTES, ON_DEMAND_DEFAULT_QUEUE_MAX_SIZE, }; use sp_runtime::Perbill; use sp_std::vec::Vec; -use frame_support::traits::OnRuntimeUpgrade; - use super::v9::V9HostConfiguration; // All configuration of the runtime with respect to paras. #[derive(Clone, Encode, PartialEq, Decode, Debug)] @@ -163,7 +165,7 @@ mod v10 { } pub struct VersionUncheckedMigrateToV10(sp_std::marker::PhantomData); -impl OnRuntimeUpgrade for VersionUncheckedMigrateToV10 { +impl UncheckedOnRuntimeUpgrade for VersionUncheckedMigrateToV10 { #[cfg(feature = "try-runtime")] fn pre_upgrade() -> Result, sp_runtime::TryRuntimeError> { log::trace!(target: crate::configuration::LOG_TARGET, "Running pre_upgrade() for HostConfiguration MigrateToV10"); diff --git a/polkadot/runtime/parachains/src/configuration/migration/v11.rs b/polkadot/runtime/parachains/src/configuration/migration/v11.rs index a69061ac1381e253cdbaef6d4681511973f83e86..65656e8d7c065ac916dde9be670e8c3dfdbfc477 100644 --- a/polkadot/runtime/parachains/src/configuration/migration/v11.rs +++ b/polkadot/runtime/parachains/src/configuration/migration/v11.rs @@ -18,16 +18,126 @@ use crate::configuration::{self, Config, Pallet}; use frame_support::{ - migrations::VersionedMigration, pallet_prelude::*, traits::Defensive, weights::Weight, + migrations::VersionedMigration, + pallet_prelude::*, + traits::{Defensive, UncheckedOnRuntimeUpgrade}, + weights::Weight, }; use frame_system::pallet_prelude::BlockNumberFor; -use primitives::{vstaging::ApprovalVotingParams, SessionIndex}; +use primitives::{ + ApprovalVotingParams, AsyncBackingParams, ExecutorParams, NodeFeatures, SessionIndex, + LEGACY_MIN_BACKING_VOTES, ON_DEMAND_DEFAULT_QUEUE_MAX_SIZE, +}; use sp_std::vec::Vec; -use frame_support::traits::OnRuntimeUpgrade; +use polkadot_core_primitives::Balance; +use sp_arithmetic::Perbill; use super::v10::V10HostConfiguration; -type V11HostConfiguration = configuration::HostConfiguration; + +#[derive(Clone, Encode, PartialEq, Decode, Debug)] +pub struct V11HostConfiguration { + pub max_code_size: u32, + pub max_head_data_size: u32, + pub max_upward_queue_count: u32, + pub max_upward_queue_size: u32, + pub max_upward_message_size: u32, + pub max_upward_message_num_per_candidate: u32, + pub hrmp_max_message_num_per_candidate: u32, + pub validation_upgrade_cooldown: BlockNumber, + pub validation_upgrade_delay: BlockNumber, + pub async_backing_params: AsyncBackingParams, + pub max_pov_size: u32, + pub max_downward_message_size: u32, + pub hrmp_max_parachain_outbound_channels: u32, + pub hrmp_sender_deposit: Balance, + pub hrmp_recipient_deposit: Balance, + pub hrmp_channel_max_capacity: u32, + pub hrmp_channel_max_total_size: u32, + pub hrmp_max_parachain_inbound_channels: u32, + pub hrmp_channel_max_message_size: u32, + pub executor_params: ExecutorParams, + pub code_retention_period: BlockNumber, + pub coretime_cores: u32, + pub on_demand_retries: u32, + pub on_demand_queue_max_size: u32, + pub on_demand_target_queue_utilization: Perbill, + pub on_demand_fee_variability: Perbill, + pub on_demand_base_fee: Balance, + pub on_demand_ttl: BlockNumber, + pub group_rotation_frequency: BlockNumber, + pub paras_availability_period: BlockNumber, + pub scheduling_lookahead: u32, + pub max_validators_per_core: Option, + pub max_validators: Option, + pub dispute_period: SessionIndex, + pub dispute_post_conclusion_acceptance_period: BlockNumber, + pub no_show_slots: u32, + pub n_delay_tranches: u32, + pub zeroth_delay_tranche_width: u32, + pub needed_approvals: u32, + pub relay_vrf_modulo_samples: u32, + pub pvf_voting_ttl: SessionIndex, + pub minimum_validation_upgrade_delay: BlockNumber, + pub minimum_backing_votes: u32, + pub node_features: NodeFeatures, + pub approval_voting_params: ApprovalVotingParams, +} + +impl> Default for V11HostConfiguration { + fn default() -> Self { + Self { + async_backing_params: AsyncBackingParams { + max_candidate_depth: 0, + allowed_ancestry_len: 0, + }, + group_rotation_frequency: 1u32.into(), + paras_availability_period: 1u32.into(), + no_show_slots: 1u32.into(), + validation_upgrade_cooldown: Default::default(), + validation_upgrade_delay: 2u32.into(), + code_retention_period: Default::default(), + max_code_size: Default::default(), + max_pov_size: Default::default(), + max_head_data_size: Default::default(), + coretime_cores: Default::default(), + on_demand_retries: Default::default(), + scheduling_lookahead: 1, + max_validators_per_core: Default::default(), + max_validators: None, + dispute_period: 6, + dispute_post_conclusion_acceptance_period: 100.into(), + n_delay_tranches: Default::default(), + zeroth_delay_tranche_width: Default::default(), + needed_approvals: Default::default(), + relay_vrf_modulo_samples: Default::default(), + max_upward_queue_count: Default::default(), + max_upward_queue_size: Default::default(), + max_downward_message_size: Default::default(), + max_upward_message_size: Default::default(), + max_upward_message_num_per_candidate: Default::default(), + hrmp_sender_deposit: Default::default(), + hrmp_recipient_deposit: Default::default(), + hrmp_channel_max_capacity: Default::default(), + hrmp_channel_max_total_size: Default::default(), + hrmp_max_parachain_inbound_channels: Default::default(), + hrmp_channel_max_message_size: Default::default(), + hrmp_max_parachain_outbound_channels: Default::default(), + hrmp_max_message_num_per_candidate: Default::default(), + pvf_voting_ttl: 2u32.into(), + minimum_validation_upgrade_delay: 2.into(), + executor_params: Default::default(), + approval_voting_params: ApprovalVotingParams { max_approval_coalesce_count: 1 }, + on_demand_queue_max_size: ON_DEMAND_DEFAULT_QUEUE_MAX_SIZE, + on_demand_base_fee: 10_000_000u128, + on_demand_fee_variability: Perbill::from_percent(3), + on_demand_target_queue_utilization: Perbill::from_percent(25), + on_demand_ttl: 5u32.into(), + minimum_backing_votes: LEGACY_MIN_BACKING_VOTES, + node_features: NodeFeatures::EMPTY, + } + } +} mod v10 { use super::*; @@ -68,7 +178,7 @@ pub type MigrateToV11 = VersionedMigration< >; pub struct UncheckedMigrateToV11(sp_std::marker::PhantomData); -impl OnRuntimeUpgrade for UncheckedMigrateToV11 { +impl UncheckedOnRuntimeUpgrade for UncheckedMigrateToV11 { #[cfg(feature = "try-runtime")] fn pre_upgrade() -> Result, sp_runtime::TryRuntimeError> { log::trace!(target: crate::configuration::LOG_TARGET, "Running pre_upgrade() for HostConfiguration MigrateToV11"); diff --git a/polkadot/runtime/parachains/src/configuration/migration/v12.rs b/polkadot/runtime/parachains/src/configuration/migration/v12.rs new file mode 100644 index 0000000000000000000000000000000000000000..69bacc83d044670ed65c9b168c07ae9acca508a5 --- /dev/null +++ b/polkadot/runtime/parachains/src/configuration/migration/v12.rs @@ -0,0 +1,349 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +//! A module that is responsible for migration of storage. + +use crate::configuration::{self, migration::v11::V11HostConfiguration, Config, Pallet}; +use frame_support::{ + migrations::VersionedMigration, + pallet_prelude::*, + traits::{Defensive, UncheckedOnRuntimeUpgrade}, +}; +use frame_system::pallet_prelude::BlockNumberFor; +use primitives::vstaging::SchedulerParams; +use sp_core::Get; +use sp_staking::SessionIndex; +use sp_std::vec::Vec; + +type V12HostConfiguration = configuration::HostConfiguration; + +mod v11 { + use super::*; + + #[frame_support::storage_alias] + pub(crate) type ActiveConfig = + StorageValue, V11HostConfiguration>, OptionQuery>; + + #[frame_support::storage_alias] + pub(crate) type PendingConfigs = StorageValue< + Pallet, + Vec<(SessionIndex, V11HostConfiguration>)>, + OptionQuery, + >; +} + +mod v12 { + use super::*; + + #[frame_support::storage_alias] + pub(crate) type ActiveConfig = + StorageValue, V12HostConfiguration>, OptionQuery>; + + #[frame_support::storage_alias] + pub(crate) type PendingConfigs = StorageValue< + Pallet, + Vec<(SessionIndex, V12HostConfiguration>)>, + OptionQuery, + >; +} + +pub type MigrateToV12 = VersionedMigration< + 11, + 12, + UncheckedMigrateToV12, + Pallet, + ::DbWeight, +>; + +pub struct UncheckedMigrateToV12(sp_std::marker::PhantomData); + +impl UncheckedOnRuntimeUpgrade for UncheckedMigrateToV12 { + #[cfg(feature = "try-runtime")] + fn pre_upgrade() -> Result, sp_runtime::TryRuntimeError> { + log::trace!(target: crate::configuration::LOG_TARGET, "Running pre_upgrade() for HostConfiguration MigrateToV12"); + Ok(Vec::new()) + } + + fn on_runtime_upgrade() -> Weight { + log::info!(target: configuration::LOG_TARGET, "HostConfiguration MigrateToV12 started"); + let weight_consumed = migrate_to_v12::(); + + log::info!(target: configuration::LOG_TARGET, "HostConfiguration MigrateToV12 executed successfully"); + + weight_consumed + } + + #[cfg(feature = "try-runtime")] + fn post_upgrade(_state: Vec) -> Result<(), sp_runtime::TryRuntimeError> { + log::trace!(target: crate::configuration::LOG_TARGET, "Running post_upgrade() for HostConfiguration MigrateToV12"); + ensure!( + StorageVersion::get::>() >= 12, + "Storage version should be >= 12 after the migration" + ); + + Ok(()) + } +} + +fn migrate_to_v12() -> Weight { + // Unusual formatting is justified: + // - make it easier to verify that fields assign what they supposed to assign. + // - this code is transient and will be removed after all migrations are done. + // - this code is important enough to optimize for legibility sacrificing consistency. + #[rustfmt::skip] + let translate = + |pre: V11HostConfiguration>| -> + V12HostConfiguration> + { + V12HostConfiguration { + max_code_size : pre.max_code_size, + max_head_data_size : pre.max_head_data_size, + max_upward_queue_count : pre.max_upward_queue_count, + max_upward_queue_size : pre.max_upward_queue_size, + max_upward_message_size : pre.max_upward_message_size, + max_upward_message_num_per_candidate : pre.max_upward_message_num_per_candidate, + hrmp_max_message_num_per_candidate : pre.hrmp_max_message_num_per_candidate, + validation_upgrade_cooldown : pre.validation_upgrade_cooldown, + validation_upgrade_delay : pre.validation_upgrade_delay, + max_pov_size : pre.max_pov_size, + max_downward_message_size : pre.max_downward_message_size, + hrmp_sender_deposit : pre.hrmp_sender_deposit, + hrmp_recipient_deposit : pre.hrmp_recipient_deposit, + hrmp_channel_max_capacity : pre.hrmp_channel_max_capacity, + hrmp_channel_max_total_size : pre.hrmp_channel_max_total_size, + hrmp_max_parachain_inbound_channels : pre.hrmp_max_parachain_inbound_channels, + hrmp_max_parachain_outbound_channels : pre.hrmp_max_parachain_outbound_channels, + hrmp_channel_max_message_size : pre.hrmp_channel_max_message_size, + code_retention_period : pre.code_retention_period, + max_validators : pre.max_validators, + dispute_period : pre.dispute_period, + dispute_post_conclusion_acceptance_period: pre.dispute_post_conclusion_acceptance_period, + no_show_slots : pre.no_show_slots, + n_delay_tranches : pre.n_delay_tranches, + zeroth_delay_tranche_width : pre.zeroth_delay_tranche_width, + needed_approvals : pre.needed_approvals, + relay_vrf_modulo_samples : pre.relay_vrf_modulo_samples, + pvf_voting_ttl : pre.pvf_voting_ttl, + minimum_validation_upgrade_delay : pre.minimum_validation_upgrade_delay, + async_backing_params : pre.async_backing_params, + executor_params : pre.executor_params, + minimum_backing_votes : pre.minimum_backing_votes, + node_features : pre.node_features, + approval_voting_params : pre.approval_voting_params, + scheduler_params: SchedulerParams { + group_rotation_frequency : pre.group_rotation_frequency, + paras_availability_period : pre.paras_availability_period, + max_validators_per_core : pre.max_validators_per_core, + lookahead : pre.scheduling_lookahead, + num_cores : pre.coretime_cores, + max_availability_timeouts : pre.on_demand_retries, + on_demand_queue_max_size : pre.on_demand_queue_max_size, + on_demand_target_queue_utilization : pre.on_demand_target_queue_utilization, + on_demand_fee_variability : pre.on_demand_fee_variability, + on_demand_base_fee : pre.on_demand_base_fee, + ttl : pre.on_demand_ttl, + } + } + }; + + let v11 = v11::ActiveConfig::::get() + .defensive_proof("Could not decode old config") + .unwrap_or_default(); + let v12 = translate(v11); + v12::ActiveConfig::::set(Some(v12)); + + // Allowed to be empty. + let pending_v11 = v11::PendingConfigs::::get().unwrap_or_default(); + let mut pending_v12 = Vec::new(); + + for (session, v11) in pending_v11.into_iter() { + let v12 = translate(v11); + pending_v12.push((session, v12)); + } + v12::PendingConfigs::::set(Some(pending_v12.clone())); + + let num_configs = (pending_v12.len() + 1) as u64; + T::DbWeight::get().reads_writes(num_configs, num_configs) +} + +#[cfg(test)] +mod tests { + use primitives::LEGACY_MIN_BACKING_VOTES; + use sp_arithmetic::Perbill; + + use super::*; + use crate::mock::{new_test_ext, Test}; + + #[test] + fn v12_deserialized_from_actual_data() { + // Example how to get new `raw_config`: + // We'll obtain the raw_config at a specified a block + // Steps: + // 1. Go to Polkadot.js -> Developer -> Chain state -> Storage: https://polkadot.js.org/apps/#/chainstate + // 2. Set these parameters: + // 2.1. selected state query: configuration; activeConfig(): + // PolkadotRuntimeParachainsConfigurationHostConfiguration + // 2.2. blockhash to query at: + // 0xf89d3ab5312c5f70d396dc59612f0aa65806c798346f9db4b35278baed2e0e53 (the hash of + // the block) + // 2.3. Note the value of encoded storage key -> + // 0x06de3d8a54d27e44a9d5ce189618f22db4b49d95320d9021994c850f25b8e385 for the + // referenced block. + // 2.4. You'll also need the decoded values to update the test. + // 3. Go to Polkadot.js -> Developer -> Chain state -> Raw storage + // 3.1 Enter the encoded storage key and you get the raw config. + + // This exceeds the maximal line width length, but that's fine, since this is not code and + // doesn't need to be read and also leaving it as one line allows to easily copy it. + let raw_config = + hex_literal::hex![ + "0000300000800000080000000000100000c8000005000000050000000200000002000000000000000000000000005000000010000400000000000000000000000000000000000000000000000000000000000000000000000800000000200000040000000000100000b004000000060000006400000002000000190000000000000002000000020000000200000005000000020000000001000000140000000400000001010000000100000001000000000000001027000080b2e60e80c3c9018096980000000000000000000000000005000000" + ]; + + let v12 = + V12HostConfiguration::::decode(&mut &raw_config[..]).unwrap(); + + // We check only a sample of the values here. If we missed any fields or messed up data + // types that would skew all the fields coming after. + assert_eq!(v12.max_code_size, 3_145_728); + assert_eq!(v12.validation_upgrade_cooldown, 2); + assert_eq!(v12.max_pov_size, 5_242_880); + assert_eq!(v12.hrmp_channel_max_message_size, 1_048_576); + assert_eq!(v12.n_delay_tranches, 25); + assert_eq!(v12.minimum_validation_upgrade_delay, 5); + assert_eq!(v12.minimum_backing_votes, LEGACY_MIN_BACKING_VOTES); + assert_eq!(v12.approval_voting_params.max_approval_coalesce_count, 1); + assert_eq!(v12.scheduler_params.group_rotation_frequency, 20); + assert_eq!(v12.scheduler_params.paras_availability_period, 4); + assert_eq!(v12.scheduler_params.lookahead, 1); + assert_eq!(v12.scheduler_params.num_cores, 1); + assert_eq!(v12.scheduler_params.max_availability_timeouts, 0); + assert_eq!(v12.scheduler_params.on_demand_queue_max_size, 10_000); + assert_eq!( + v12.scheduler_params.on_demand_target_queue_utilization, + Perbill::from_percent(25) + ); + assert_eq!(v12.scheduler_params.on_demand_fee_variability, Perbill::from_percent(3)); + assert_eq!(v12.scheduler_params.on_demand_base_fee, 10_000_000); + assert_eq!(v12.scheduler_params.ttl, 5); + } + + #[test] + fn test_migrate_to_v12() { + // Host configuration has lots of fields. However, in this migration we only add one + // field. The most important part to check are a couple of the last fields. We also pick + // extra fields to check arbitrarily, e.g. depending on their position (i.e. the middle) and + // also their type. + // + // We specify only the picked fields and the rest should be provided by the `Default` + // implementation. That implementation is copied over between the two types and should work + // fine. + let v11 = V11HostConfiguration:: { + needed_approvals: 69, + paras_availability_period: 55, + hrmp_recipient_deposit: 1337, + max_pov_size: 1111, + minimum_validation_upgrade_delay: 20, + on_demand_ttl: 3, + on_demand_retries: 10, + ..Default::default() + }; + + let mut pending_configs = Vec::new(); + pending_configs.push((100, v11.clone())); + pending_configs.push((300, v11.clone())); + + new_test_ext(Default::default()).execute_with(|| { + // Implant the v10 version in the state. + v11::ActiveConfig::::set(Some(v11.clone())); + v11::PendingConfigs::::set(Some(pending_configs)); + + migrate_to_v12::(); + + let v12 = v12::ActiveConfig::::get().unwrap(); + assert_eq!(v12.approval_voting_params.max_approval_coalesce_count, 1); + + let mut configs_to_check = v12::PendingConfigs::::get().unwrap(); + configs_to_check.push((0, v12.clone())); + + for (_, v12) in configs_to_check { + #[rustfmt::skip] + { + assert_eq!(v11.max_code_size , v12.max_code_size); + assert_eq!(v11.max_head_data_size , v12.max_head_data_size); + assert_eq!(v11.max_upward_queue_count , v12.max_upward_queue_count); + assert_eq!(v11.max_upward_queue_size , v12.max_upward_queue_size); + assert_eq!(v11.max_upward_message_size , v12.max_upward_message_size); + assert_eq!(v11.max_upward_message_num_per_candidate , v12.max_upward_message_num_per_candidate); + assert_eq!(v11.hrmp_max_message_num_per_candidate , v12.hrmp_max_message_num_per_candidate); + assert_eq!(v11.validation_upgrade_cooldown , v12.validation_upgrade_cooldown); + assert_eq!(v11.validation_upgrade_delay , v12.validation_upgrade_delay); + assert_eq!(v11.max_pov_size , v12.max_pov_size); + assert_eq!(v11.max_downward_message_size , v12.max_downward_message_size); + assert_eq!(v11.hrmp_max_parachain_outbound_channels , v12.hrmp_max_parachain_outbound_channels); + assert_eq!(v11.hrmp_sender_deposit , v12.hrmp_sender_deposit); + assert_eq!(v11.hrmp_recipient_deposit , v12.hrmp_recipient_deposit); + assert_eq!(v11.hrmp_channel_max_capacity , v12.hrmp_channel_max_capacity); + assert_eq!(v11.hrmp_channel_max_total_size , v12.hrmp_channel_max_total_size); + assert_eq!(v11.hrmp_max_parachain_inbound_channels , v12.hrmp_max_parachain_inbound_channels); + assert_eq!(v11.hrmp_channel_max_message_size , v12.hrmp_channel_max_message_size); + assert_eq!(v11.code_retention_period , v12.code_retention_period); + assert_eq!(v11.max_validators , v12.max_validators); + assert_eq!(v11.dispute_period , v12.dispute_period); + assert_eq!(v11.no_show_slots , v12.no_show_slots); + assert_eq!(v11.n_delay_tranches , v12.n_delay_tranches); + assert_eq!(v11.zeroth_delay_tranche_width , v12.zeroth_delay_tranche_width); + assert_eq!(v11.needed_approvals , v12.needed_approvals); + assert_eq!(v11.relay_vrf_modulo_samples , v12.relay_vrf_modulo_samples); + assert_eq!(v11.pvf_voting_ttl , v12.pvf_voting_ttl); + assert_eq!(v11.minimum_validation_upgrade_delay , v12.minimum_validation_upgrade_delay); + assert_eq!(v11.async_backing_params.allowed_ancestry_len, v12.async_backing_params.allowed_ancestry_len); + assert_eq!(v11.async_backing_params.max_candidate_depth , v12.async_backing_params.max_candidate_depth); + assert_eq!(v11.executor_params , v12.executor_params); + assert_eq!(v11.minimum_backing_votes , v12.minimum_backing_votes); + assert_eq!(v11.group_rotation_frequency , v12.scheduler_params.group_rotation_frequency); + assert_eq!(v11.paras_availability_period , v12.scheduler_params.paras_availability_period); + assert_eq!(v11.max_validators_per_core , v12.scheduler_params.max_validators_per_core); + assert_eq!(v11.scheduling_lookahead , v12.scheduler_params.lookahead); + assert_eq!(v11.coretime_cores , v12.scheduler_params.num_cores); + assert_eq!(v11.on_demand_retries , v12.scheduler_params.max_availability_timeouts); + assert_eq!(v11.on_demand_queue_max_size , v12.scheduler_params.on_demand_queue_max_size); + assert_eq!(v11.on_demand_target_queue_utilization , v12.scheduler_params.on_demand_target_queue_utilization); + assert_eq!(v11.on_demand_fee_variability , v12.scheduler_params.on_demand_fee_variability); + assert_eq!(v11.on_demand_base_fee , v12.scheduler_params.on_demand_base_fee); + assert_eq!(v11.on_demand_ttl , v12.scheduler_params.ttl); + }; // ; makes this a statement. `rustfmt::skip` cannot be put on an expression. + } + }); + } + + // Test that migration doesn't panic in case there are no pending configurations upgrades in + // pallet's storage. + #[test] + fn test_migrate_to_v12_no_pending() { + let v11 = V11HostConfiguration::::default(); + + new_test_ext(Default::default()).execute_with(|| { + // Implant the v10 version in the state. + v11::ActiveConfig::::set(Some(v11)); + // Ensure there are no pending configs. + v12::PendingConfigs::::set(None); + + // Shouldn't fail. + migrate_to_v12::(); + }); + } +} diff --git a/polkadot/runtime/parachains/src/configuration/tests.rs b/polkadot/runtime/parachains/src/configuration/tests.rs index f1570017dd7ba75db429eac4f00f26fa277de2d6..239b466fde3970babec24ad109a22e16be2c9066 100644 --- a/polkadot/runtime/parachains/src/configuration/tests.rs +++ b/polkadot/runtime/parachains/src/configuration/tests.rs @@ -15,7 +15,10 @@ // along with Polkadot. If not, see . use super::*; -use crate::mock::{new_test_ext, Configuration, ParasShared, RuntimeOrigin, Test}; +use crate::{ + configuration, + mock::{new_test_ext, Configuration, ParasShared, RuntimeOrigin, Test}, +}; use bitvec::{bitvec, prelude::Lsb0}; use frame_support::{assert_err, assert_noop, assert_ok}; @@ -30,7 +33,7 @@ fn on_new_session(session_index: SessionIndex) -> (HostConfiguration, HostC #[test] fn default_is_consistent() { new_test_ext(Default::default()).execute_with(|| { - Configuration::config().panic_if_not_consistent(); + configuration::ActiveConfig::::get().panic_if_not_consistent(); }); } @@ -63,7 +66,7 @@ fn initializer_on_new_session() { #[test] fn config_changes_after_2_session_boundary() { new_test_ext(Default::default()).execute_with(|| { - let old_config = Configuration::config(); + let old_config = configuration::ActiveConfig::::get(); let mut config = old_config.clone(); config.validation_upgrade_delay = 100; assert!(old_config != config); @@ -72,18 +75,18 @@ fn config_changes_after_2_session_boundary() { // Verify that the current configuration has not changed and that there is a scheduled // change for the SESSION_DELAY sessions in advance. - assert_eq!(Configuration::config(), old_config); + assert_eq!(configuration::ActiveConfig::::get(), old_config); assert_eq!(PendingConfigs::::get(), vec![(2, config.clone())]); on_new_session(1); // One session has passed, we should be still waiting for the pending configuration. - assert_eq!(Configuration::config(), old_config); + assert_eq!(configuration::ActiveConfig::::get(), old_config); assert_eq!(PendingConfigs::::get(), vec![(2, config.clone())]); on_new_session(2); - assert_eq!(Configuration::config(), config); + assert_eq!(configuration::ActiveConfig::::get(), config); assert_eq!(PendingConfigs::::get(), vec![]); }) } @@ -91,7 +94,7 @@ fn config_changes_after_2_session_boundary() { #[test] fn consecutive_changes_within_one_session() { new_test_ext(Default::default()).execute_with(|| { - let old_config = Configuration::config(); + let old_config = configuration::ActiveConfig::::get(); let mut config = old_config.clone(); config.validation_upgrade_delay = 100; config.validation_upgrade_cooldown = 100; @@ -99,17 +102,17 @@ fn consecutive_changes_within_one_session() { assert_ok!(Configuration::set_validation_upgrade_delay(RuntimeOrigin::root(), 100)); assert_ok!(Configuration::set_validation_upgrade_cooldown(RuntimeOrigin::root(), 100)); - assert_eq!(Configuration::config(), old_config); + assert_eq!(configuration::ActiveConfig::::get(), old_config); assert_eq!(PendingConfigs::::get(), vec![(2, config.clone())]); on_new_session(1); - assert_eq!(Configuration::config(), old_config); + assert_eq!(configuration::ActiveConfig::::get(), old_config); assert_eq!(PendingConfigs::::get(), vec![(2, config.clone())]); on_new_session(2); - assert_eq!(Configuration::config(), config); + assert_eq!(configuration::ActiveConfig::::get(), config); assert_eq!(PendingConfigs::::get(), vec![]); }); } @@ -117,7 +120,7 @@ fn consecutive_changes_within_one_session() { #[test] fn pending_next_session_but_we_upgrade_once_more() { new_test_ext(Default::default()).execute_with(|| { - let initial_config = Configuration::config(); + let initial_config = configuration::ActiveConfig::::get(); let intermediate_config = HostConfiguration { validation_upgrade_delay: 100, ..initial_config.clone() }; let final_config = HostConfiguration { @@ -127,7 +130,7 @@ fn pending_next_session_but_we_upgrade_once_more() { }; assert_ok!(Configuration::set_validation_upgrade_delay(RuntimeOrigin::root(), 100)); - assert_eq!(Configuration::config(), initial_config); + assert_eq!(configuration::ActiveConfig::::get(), initial_config); assert_eq!(PendingConfigs::::get(), vec![(2, intermediate_config.clone())]); on_new_session(1); @@ -137,7 +140,7 @@ fn pending_next_session_but_we_upgrade_once_more() { assert_ok!(Configuration::set_validation_upgrade_cooldown(RuntimeOrigin::root(), 99)); // This should result in yet another configuration change scheduled. - assert_eq!(Configuration::config(), initial_config); + assert_eq!(configuration::ActiveConfig::::get(), initial_config); assert_eq!( PendingConfigs::::get(), vec![(2, intermediate_config.clone()), (3, final_config.clone())] @@ -145,12 +148,12 @@ fn pending_next_session_but_we_upgrade_once_more() { on_new_session(2); - assert_eq!(Configuration::config(), intermediate_config); + assert_eq!(configuration::ActiveConfig::::get(), intermediate_config); assert_eq!(PendingConfigs::::get(), vec![(3, final_config.clone())]); on_new_session(3); - assert_eq!(Configuration::config(), final_config); + assert_eq!(configuration::ActiveConfig::::get(), final_config); assert_eq!(PendingConfigs::::get(), vec![]); }); } @@ -158,7 +161,7 @@ fn pending_next_session_but_we_upgrade_once_more() { #[test] fn scheduled_session_config_update_while_next_session_pending() { new_test_ext(Default::default()).execute_with(|| { - let initial_config = Configuration::config(); + let initial_config = configuration::ActiveConfig::::get(); let intermediate_config = HostConfiguration { validation_upgrade_delay: 100, ..initial_config.clone() }; let final_config = HostConfiguration { @@ -169,7 +172,7 @@ fn scheduled_session_config_update_while_next_session_pending() { }; assert_ok!(Configuration::set_validation_upgrade_delay(RuntimeOrigin::root(), 100)); - assert_eq!(Configuration::config(), initial_config); + assert_eq!(configuration::ActiveConfig::::get(), initial_config); assert_eq!(PendingConfigs::::get(), vec![(2, intermediate_config.clone())]); on_new_session(1); @@ -180,7 +183,7 @@ fn scheduled_session_config_update_while_next_session_pending() { assert_ok!(Configuration::set_code_retention_period(RuntimeOrigin::root(), 98)); // This should result in yet another configuration change scheduled. - assert_eq!(Configuration::config(), initial_config); + assert_eq!(configuration::ActiveConfig::::get(), initial_config); assert_eq!( PendingConfigs::::get(), vec![(2, intermediate_config.clone()), (3, final_config.clone())] @@ -188,12 +191,12 @@ fn scheduled_session_config_update_while_next_session_pending() { on_new_session(2); - assert_eq!(Configuration::config(), intermediate_config); + assert_eq!(configuration::ActiveConfig::::get(), intermediate_config); assert_eq!(PendingConfigs::::get(), vec![(3, final_config.clone())]); on_new_session(3); - assert_eq!(Configuration::config(), final_config); + assert_eq!(configuration::ActiveConfig::::get(), final_config); assert_eq!(PendingConfigs::::get(), vec![]); }); } @@ -226,8 +229,11 @@ fn invariants() { ); ActiveConfig::::put(HostConfiguration { - paras_availability_period: 10, minimum_validation_upgrade_delay: 11, + scheduler_params: SchedulerParams { + paras_availability_period: 10, + ..Default::default() + }, ..Default::default() }); assert_err!( @@ -258,14 +264,14 @@ fn consistency_bypass_works() { assert_ok!(Configuration::set_max_code_size(RuntimeOrigin::root(), MAX_CODE_SIZE + 1)); assert_eq!( - Configuration::config().max_code_size, + configuration::ActiveConfig::::get().max_code_size, HostConfiguration::::default().max_code_size ); on_new_session(1); on_new_session(2); - assert_eq!(Configuration::config().max_code_size, MAX_CODE_SIZE + 1); + assert_eq!(configuration::ActiveConfig::::get().max_code_size, MAX_CODE_SIZE + 1); }); } @@ -283,12 +289,6 @@ fn setting_pending_config_members() { max_code_size: 100_000, max_pov_size: 1024, max_head_data_size: 1_000, - coretime_cores: 2, - on_demand_retries: 5, - group_rotation_frequency: 20, - paras_availability_period: 10, - scheduling_lookahead: 3, - max_validators_per_core: None, max_validators: None, dispute_period: 239, dispute_post_conclusion_acceptance_period: 10, @@ -314,13 +314,21 @@ fn setting_pending_config_members() { minimum_validation_upgrade_delay: 20, executor_params: Default::default(), approval_voting_params: ApprovalVotingParams { max_approval_coalesce_count: 1 }, - on_demand_queue_max_size: 10_000u32, - on_demand_base_fee: 10_000_000u128, - on_demand_fee_variability: Perbill::from_percent(3), - on_demand_target_queue_utilization: Perbill::from_percent(25), - on_demand_ttl: 5u32, minimum_backing_votes: 5, node_features: bitvec![u8, Lsb0; 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1], + scheduler_params: SchedulerParams { + group_rotation_frequency: 20, + paras_availability_period: 10, + max_validators_per_core: None, + lookahead: 3, + num_cores: 2, + max_availability_timeouts: 5, + on_demand_queue_max_size: 10_000u32, + on_demand_base_fee: 10_000_000u128, + on_demand_fee_variability: Perbill::from_percent(3), + on_demand_target_queue_utilization: Perbill::from_percent(25), + ttl: 5u32, + }, }; Configuration::set_validation_upgrade_cooldown( @@ -342,13 +350,19 @@ fn setting_pending_config_members() { Configuration::set_max_pov_size(RuntimeOrigin::root(), new_config.max_pov_size).unwrap(); Configuration::set_max_head_data_size(RuntimeOrigin::root(), new_config.max_head_data_size) .unwrap(); - Configuration::set_coretime_cores(RuntimeOrigin::root(), new_config.coretime_cores) - .unwrap(); - Configuration::set_on_demand_retries(RuntimeOrigin::root(), new_config.on_demand_retries) - .unwrap(); + Configuration::set_coretime_cores( + RuntimeOrigin::root(), + new_config.scheduler_params.num_cores, + ) + .unwrap(); + Configuration::set_max_availability_timeouts( + RuntimeOrigin::root(), + new_config.scheduler_params.max_availability_timeouts, + ) + .unwrap(); Configuration::set_group_rotation_frequency( RuntimeOrigin::root(), - new_config.group_rotation_frequency, + new_config.scheduler_params.group_rotation_frequency, ) .unwrap(); // This comes out of order to satisfy the validity criteria for the chain and thread @@ -360,17 +374,17 @@ fn setting_pending_config_members() { .unwrap(); Configuration::set_paras_availability_period( RuntimeOrigin::root(), - new_config.paras_availability_period, + new_config.scheduler_params.paras_availability_period, ) .unwrap(); Configuration::set_scheduling_lookahead( RuntimeOrigin::root(), - new_config.scheduling_lookahead, + new_config.scheduler_params.lookahead, ) .unwrap(); Configuration::set_max_validators_per_core( RuntimeOrigin::root(), - new_config.max_validators_per_core, + new_config.scheduler_params.max_validators_per_core, ) .unwrap(); Configuration::set_max_validators(RuntimeOrigin::root(), new_config.max_validators) diff --git a/polkadot/runtime/parachains/src/coretime/migration.rs b/polkadot/runtime/parachains/src/coretime/migration.rs index 9bc0a20ef5b4afce7d63da9bb1d231d39bf445ab..72eda1ea3f3cd03a50c595a4b36b6188cca81aaa 100644 --- a/polkadot/runtime/parachains/src/coretime/migration.rs +++ b/polkadot/runtime/parachains/src/coretime/migration.rs @@ -113,8 +113,8 @@ mod v_coretime { } let legacy_paras = paras::Parachains::::get(); - let config = >::config(); - let total_core_count = config.coretime_cores + legacy_paras.len() as u32; + let config = configuration::ActiveConfig::::get(); + let total_core_count = config.scheduler_params.num_cores + legacy_paras.len() as u32; let dmp_queue_size = crate::dmp::Pallet::::dmq_contents(T::BrokerId::get().into()).len() as u32; @@ -150,15 +150,15 @@ mod v_coretime { // Migrate to Coretime. // - // NOTE: Also migrates coretime_cores config value in configuration::ActiveConfig. + // NOTE: Also migrates `num_cores` config value in configuration::ActiveConfig. fn migrate_to_coretime< T: Config, SendXcm: xcm::v4::SendXcm, LegacyLease: GetLegacyLease>, >() -> Weight { - let legacy_paras = paras::Pallet::::parachains(); + let legacy_paras = paras::Parachains::::get(); let legacy_count = legacy_paras.len() as u32; - let now = >::block_number(); + let now = frame_system::Pallet::::block_number(); for (core, para_id) in legacy_paras.into_iter().enumerate() { let r = assigner_coretime::Pallet::::assign_core( CoreIndex(core as u32), @@ -175,9 +175,9 @@ mod v_coretime { } } - let config = >::config(); - // coretime_cores was on_demand_cores until now: - for on_demand in 0..config.coretime_cores { + let config = configuration::ActiveConfig::::get(); + // num_cores was on_demand_cores until now: + for on_demand in 0..config.scheduler_params.num_cores { let core = CoreIndex(legacy_count.saturating_add(on_demand as _)); let r = assigner_coretime::Pallet::::assign_core( core, @@ -189,9 +189,9 @@ mod v_coretime { log::error!("Creating assignment for existing on-demand core, failed: {:?}", err); } } - let total_cores = config.coretime_cores + legacy_count; + let total_cores = config.scheduler_params.num_cores + legacy_count; configuration::ActiveConfig::::mutate(|c| { - c.coretime_cores = total_cores; + c.scheduler_params.num_cores = total_cores; }); if let Err(err) = migrate_send_assignments_to_coretime_chain::() { @@ -200,7 +200,9 @@ mod v_coretime { let single_weight = ::WeightInfo::assign_core(1); single_weight - .saturating_mul(u64::from(legacy_count.saturating_add(config.coretime_cores))) + .saturating_mul(u64::from( + legacy_count.saturating_add(config.scheduler_params.num_cores), + )) // Second read from sending assignments to the coretime chain. .saturating_add(T::DbWeight::get().reads_writes(2, 1)) } @@ -210,7 +212,7 @@ mod v_coretime { SendXcm: xcm::v4::SendXcm, LegacyLease: GetLegacyLease>, >() -> result::Result<(), SendError> { - let legacy_paras = paras::Pallet::::parachains(); + let legacy_paras = paras::Parachains::::get(); let legacy_paras_count = legacy_paras.len(); let (system_chains, lease_holding): (Vec<_>, Vec<_>) = legacy_paras.into_iter().partition(IsSystem::is_system); @@ -236,7 +238,7 @@ mod v_coretime { return None }, }; - // We assume the coretime chain set this parameter to the recommened value in RFC-1: + // We assume the coretime chain set this parameter to the recommended value in RFC-1: const TIME_SLICE_PERIOD: u32 = 80; let round_up = if valid_until % TIME_SLICE_PERIOD > 0 { 1 } else { 0 }; let time_slice = valid_until / TIME_SLICE_PERIOD + TIME_SLICE_PERIOD * round_up; @@ -244,7 +246,10 @@ mod v_coretime { Some(mk_coretime_call(crate::coretime::CoretimeCalls::SetLease(p.into(), time_slice))) }); - let core_count: u16 = configuration::Pallet::::config().coretime_cores.saturated_into(); + let core_count: u16 = configuration::ActiveConfig::::get() + .scheduler_params + .num_cores + .saturated_into(); let set_core_count = iter::once(mk_coretime_call( crate::coretime::CoretimeCalls::NotifyCoreCount(core_count), )); diff --git a/polkadot/runtime/parachains/src/coretime/mod.rs b/polkadot/runtime/parachains/src/coretime/mod.rs index 531f5c2e4e470095989bbb73429cc2180ff4f321..9095cd90ae0cfea6a72fde2d4730cad28cf97d29 100644 --- a/polkadot/runtime/parachains/src/coretime/mod.rs +++ b/polkadot/runtime/parachains/src/coretime/mod.rs @@ -83,6 +83,8 @@ enum CoretimeCalls { SetLease(pallet_broker::TaskId, pallet_broker::Timeslice), #[codec(index = 19)] NotifyCoreCount(u16), + #[codec(index = 99)] + SwapLeases(ParaId, ParaId), } #[frame_support::pallet] @@ -214,8 +216,8 @@ impl Pallet { } pub fn initializer_on_new_session(notification: &SessionChangeNotification>) { - let old_core_count = notification.prev_config.coretime_cores; - let new_core_count = notification.new_config.coretime_cores; + let old_core_count = notification.prev_config.scheduler_params.num_cores; + let new_core_count = notification.new_config.scheduler_params.num_cores; if new_core_count != old_core_count { let core_count: u16 = new_core_count.saturated_into(); let message = Xcm(vec![ @@ -233,6 +235,24 @@ impl Pallet { } } } + + // Handle legacy swaps in coretime. Notifies broker parachain that a lease swap has occurred via + // XCM message. This function is meant to be used in an implementation of `OnSwap` trait. + pub fn on_legacy_lease_swap(one: ParaId, other: ParaId) { + let message = Xcm(vec![ + Instruction::UnpaidExecution { + weight_limit: WeightLimit::Unlimited, + check_origin: None, + }, + mk_coretime_call(crate::coretime::CoretimeCalls::SwapLeases(one, other)), + ]); + if let Err(err) = send_xcm::( + Location::new(0, [Junction::Parachain(T::BrokerId::get())]), + message, + ) { + log::error!("Sending `SwapLeases` to coretime chain failed: {:?}", err); + } + } } impl OnNewSession> for Pallet { diff --git a/polkadot/runtime/parachains/src/disputes.rs b/polkadot/runtime/parachains/src/disputes.rs index c2383dad3053882b7abec959446b23d149aa4a5f..62e02e67157d9e0e84de995dae18ee14143488a5 100644 --- a/polkadot/runtime/parachains/src/disputes.rs +++ b/polkadot/runtime/parachains/src/disputes.rs @@ -25,11 +25,11 @@ use frame_system::pallet_prelude::*; use parity_scale_codec::{Decode, Encode}; use polkadot_runtime_metrics::get_current_time; use primitives::{ - byzantine_threshold, supermajority_threshold, vstaging::ApprovalVoteMultipleCandidates, - ApprovalVote, CandidateHash, CheckedDisputeStatementSet, CheckedMultiDisputeStatementSet, - CompactStatement, ConsensusLog, DisputeState, DisputeStatement, DisputeStatementSet, - ExplicitDisputeStatement, InvalidDisputeStatementKind, MultiDisputeStatementSet, SessionIndex, - SigningContext, ValidDisputeStatementKind, ValidatorId, ValidatorIndex, ValidatorSignature, + byzantine_threshold, supermajority_threshold, ApprovalVote, ApprovalVoteMultipleCandidates, + CandidateHash, CheckedDisputeStatementSet, CheckedMultiDisputeStatementSet, CompactStatement, + ConsensusLog, DisputeState, DisputeStatement, DisputeStatementSet, ExplicitDisputeStatement, + InvalidDisputeStatementKind, MultiDisputeStatementSet, SessionIndex, SigningContext, + ValidDisputeStatementKind, ValidatorId, ValidatorIndex, ValidatorSignature, }; use scale_info::TypeInfo; use sp_runtime::{ @@ -181,7 +181,7 @@ pub trait DisputesHandler { fn is_frozen() -> bool; /// Remove dispute statement duplicates and sort the non-duplicates based on - /// local (lower indicies) vs remotes (higher indices) and age (older with lower indices). + /// local (lower indices) vs remotes (higher indices) and age (older with lower indices). /// /// Returns `Ok(())` if no duplicates were present, `Err(())` otherwise. /// @@ -379,7 +379,7 @@ pub mod pallet { type WeightInfo: WeightInfo; } - /// The current storage version. + /// The in-code storage version. const STORAGE_VERSION: StorageVersion = StorageVersion::new(1); #[pallet::pallet] @@ -432,8 +432,7 @@ pub mod pallet { /// and its value indicates the last valid block number in the chain. /// It can only be set back to `None` by governance intervention. #[pallet::storage] - #[pallet::getter(fn last_valid_block)] - pub(super) type Frozen = StorageValue<_, Option>, ValueQuery>; + pub type Frozen = StorageValue<_, Option>, ValueQuery>; #[pallet::event] #[pallet::generate_deposit(pub fn deposit_event)] @@ -865,7 +864,7 @@ impl Pallet { pub(crate) fn initializer_on_new_session( notification: &SessionChangeNotification>, ) { - let config = >::config(); + let config = configuration::ActiveConfig::::get(); if notification.session_index <= config.dispute_period + 1 { return @@ -883,14 +882,14 @@ impl Pallet { for to_prune in to_prune { // This should be small, as disputes are rare, so `None` is fine. #[allow(deprecated)] - >::remove_prefix(to_prune, None); + Disputes::::remove_prefix(to_prune, None); #[allow(deprecated)] - >::remove_prefix(to_prune, None); + BackersOnDisputes::::remove_prefix(to_prune, None); // This is larger, and will be extracted to the `shared` pallet for more proper // pruning. TODO: https://github.com/paritytech/polkadot/issues/3469 #[allow(deprecated)] - >::remove_prefix(to_prune, None); + Included::::remove_prefix(to_prune, None); } *last_pruned = Some(pruning_target); @@ -910,7 +909,7 @@ impl Pallet { pub(crate) fn process_checked_multi_dispute_data( statement_sets: &CheckedMultiDisputeStatementSet, ) -> Result, DispatchError> { - let config = >::config(); + let config = configuration::ActiveConfig::::get(); let mut fresh = Vec::with_capacity(statement_sets.len()); for statement_set in statement_sets { @@ -943,22 +942,22 @@ impl Pallet { // Dispute statement sets on any dispute which concluded // before this point are to be rejected. - let now = >::block_number(); + let now = frame_system::Pallet::::block_number(); let oldest_accepted = now.saturating_sub(post_conclusion_acceptance_period); // Load session info to access validators - let session_info = match >::session_info(set.session) { + let session_info = match session_info::Sessions::::get(set.session) { Some(s) => s, None => return StatementSetFilter::RemoveAll, }; - let config = >::config(); + let config = configuration::ActiveConfig::::get(); let n_validators = session_info.validators.len(); // Check for ancient. let dispute_state = { - if let Some(dispute_state) = >::get(&set.session, &set.candidate_hash) { + if let Some(dispute_state) = Disputes::::get(&set.session, &set.candidate_hash) { if dispute_state.concluded_at.as_ref().map_or(false, |c| c < &oldest_accepted) { return StatementSetFilter::RemoveAll } @@ -976,7 +975,7 @@ impl Pallet { }; let backers = - >::get(&set.session, &set.candidate_hash).unwrap_or_default(); + BackersOnDisputes::::get(&set.session, &set.candidate_hash).unwrap_or_default(); // Check and import all votes. let summary = { @@ -1061,13 +1060,13 @@ impl Pallet { ) -> Result { // Dispute statement sets on any dispute which concluded // before this point are to be rejected. - let now = >::block_number(); + let now = frame_system::Pallet::::block_number(); let oldest_accepted = now.saturating_sub(dispute_post_conclusion_acceptance_period); let set = set.as_ref(); // Load session info to access validators - let session_info = match >::session_info(set.session) { + let session_info = match session_info::Sessions::::get(set.session) { Some(s) => s, None => return Err(Error::::AncientDisputeStatement.into()), }; @@ -1076,7 +1075,7 @@ impl Pallet { // Check for ancient. let (fresh, dispute_state) = { - if let Some(dispute_state) = >::get(&set.session, &set.candidate_hash) { + if let Some(dispute_state) = Disputes::::get(&set.session, &set.candidate_hash) { ensure!( dispute_state.concluded_at.as_ref().map_or(true, |c| c >= &oldest_accepted), Error::::AncientDisputeStatement, @@ -1097,7 +1096,7 @@ impl Pallet { }; let backers = - >::get(&set.session, &set.candidate_hash).unwrap_or_default(); + BackersOnDisputes::::get(&set.session, &set.candidate_hash).unwrap_or_default(); // Import all votes. They were pre-checked. let summary = { @@ -1127,7 +1126,7 @@ impl Pallet { let backers = summary.backers; // Reject statements with no accompanying backing votes. ensure!(!backers.is_empty(), Error::::MissingBackingVotes); - >::insert(&set.session, &set.candidate_hash, backers.clone()); + BackersOnDisputes::::insert(&set.session, &set.candidate_hash, backers.clone()); // AUDIT: from now on, no error should be returned. let DisputeStatementSet { ref session, ref candidate_hash, .. } = set; @@ -1135,7 +1134,7 @@ impl Pallet { let candidate_hash = *candidate_hash; if fresh { - let is_local = >::contains_key(&session, &candidate_hash); + let is_local = Included::::contains_key(&session, &candidate_hash); Self::deposit_event(Event::DisputeInitiated( candidate_hash, @@ -1185,12 +1184,12 @@ impl Pallet { ); } - >::insert(&session, &candidate_hash, &summary.state); + Disputes::::insert(&session, &candidate_hash, &summary.state); // Freeze if the INVALID votes against some local candidate are above the byzantine // threshold if summary.new_flags.contains(DisputeStateFlags::AGAINST_BYZANTINE) { - if let Some(revert_to) = >::get(&session, &candidate_hash) { + if let Some(revert_to) = Included::::get(&session, &candidate_hash) { Self::revert_and_freeze(revert_to); } } @@ -1201,7 +1200,7 @@ impl Pallet { #[allow(unused)] pub(crate) fn disputes() -> Vec<(SessionIndex, CandidateHash, DisputeState>)> { - >::iter().collect() + Disputes::::iter().collect() } pub(crate) fn note_included( @@ -1215,9 +1214,9 @@ impl Pallet { let revert_to = included_in - One::one(); - >::insert(&session, &candidate_hash, revert_to); + Included::::insert(&session, &candidate_hash, revert_to); - if let Some(state) = >::get(&session, candidate_hash) { + if let Some(state) = Disputes::::get(&session, candidate_hash) { if has_supermajority_against(&state) { Self::revert_and_freeze(revert_to); } @@ -1228,22 +1227,22 @@ impl Pallet { session: SessionIndex, candidate_hash: CandidateHash, ) -> Option> { - >::get(session, candidate_hash) + Included::::get(session, candidate_hash) } pub(crate) fn concluded_invalid(session: SessionIndex, candidate_hash: CandidateHash) -> bool { - >::get(&session, &candidate_hash).map_or(false, |dispute| { + Disputes::::get(&session, &candidate_hash).map_or(false, |dispute| { // A dispute that has concluded with supermajority-against. has_supermajority_against(&dispute) }) } pub(crate) fn is_frozen() -> bool { - Self::last_valid_block().is_some() + Frozen::::get().is_some() } pub(crate) fn revert_and_freeze(revert_to: BlockNumberFor) { - if Self::last_valid_block().map_or(true, |last| last > revert_to) { + if Frozen::::get().map_or(true, |last| last > revert_to) { Frozen::::set(Some(revert_to)); // The `Revert` log is about reverting a block, not reverting to a block. diff --git a/polkadot/runtime/parachains/src/disputes/slashing.rs b/polkadot/runtime/parachains/src/disputes/slashing.rs index 9b2b7a48dc8b3ace0b4feea937b7efbe98e4950e..d0c74e4bc958320fca78231129dd6e8e135e0179 100644 --- a/polkadot/runtime/parachains/src/disputes/slashing.rs +++ b/polkadot/runtime/parachains/src/disputes/slashing.rs @@ -187,13 +187,13 @@ where validators: impl IntoIterator, ) -> Option>> { // We use `ValidatorSet::session_index` and not - // `shared::Pallet::session_index()` because at the first block of a new era, + // `shared::CurrentSessionIndex::::get()` because at the first block of a new era, // the `IdentificationOf` of a validator in the previous session might be // missing, while `shared` pallet would return the same session index as being // updated at the end of the block. let current_session = T::ValidatorSet::session_index(); if session_index == current_session { - let account_keys = crate::session_info::Pallet::::account_keys(session_index); + let account_keys = crate::session_info::AccountKeys::::get(session_index); let account_ids = account_keys.defensive_unwrap_or_default(); let fully_identified = validators @@ -232,7 +232,7 @@ where return } - let session_info = crate::session_info::Pallet::::session_info(session_index); + let session_info = crate::session_info::Sessions::::get(session_index); let session_info = match session_info.defensive_proof(DEFENSIVE_PROOF) { Some(info) => info, None => return, @@ -544,7 +544,7 @@ impl Pallet { // fine. const REMOVE_LIMIT: u32 = u32::MAX; - let config = >::config(); + let config = crate::configuration::ActiveConfig::::get(); if session_index <= config.dispute_period + 1 { return } @@ -643,7 +643,7 @@ fn is_known_offence( } } -/// Actual `HandleReports` implemention. +/// Actual `HandleReports` implementation. /// /// When configured properly, should be instantiated with /// `T::KeyOwnerIdentification, Offences, ReportLongevity` parameters. diff --git a/polkadot/runtime/parachains/src/disputes/slashing/benchmarking.rs b/polkadot/runtime/parachains/src/disputes/slashing/benchmarking.rs index f075ce5ca737d7597c4ed5d664050e08b9d28bf8..42a64725160c31746f9f1fe02b8239befd106a1e 100644 --- a/polkadot/runtime/parachains/src/disputes/slashing/benchmarking.rs +++ b/polkadot/runtime/parachains/src/disputes/slashing/benchmarking.rs @@ -83,8 +83,8 @@ where } initializer::Pallet::::on_finalize(BlockNumberFor::::one()); - let session_index = crate::shared::Pallet::::session_index(); - let session_info = crate::session_info::Pallet::::session_info(session_index); + let session_index = crate::shared::CurrentSessionIndex::::get(); + let session_info = crate::session_info::Sessions::::get(session_index); let session_info = session_info.unwrap(); let validator_id = session_info.validators.get(ValidatorIndex::from(0)).unwrap().clone(); let key = (PARACHAIN_KEY_TYPE_ID, validator_id.clone()); @@ -95,7 +95,7 @@ where pallet_session::Pallet::::rotate_session(); initializer::Pallet::::on_finalize(BlockNumberFor::::one()); - let idx = crate::shared::Pallet::::session_index(); + let idx = crate::shared::CurrentSessionIndex::::get(); assert!( idx > session_index, "session rotation should work for parachain pallets: {} <= {}", diff --git a/polkadot/runtime/parachains/src/disputes/tests.rs b/polkadot/runtime/parachains/src/disputes/tests.rs index 1f3f00132d680ce16b9fdf65e21a5af92f89caea..16b4fa3a9f1a6b551cb94ff56dd3ba8ac53323f6 100644 --- a/polkadot/runtime/parachains/src/disputes/tests.rs +++ b/polkadot/runtime/parachains/src/disputes/tests.rs @@ -37,7 +37,7 @@ const VOTE_AGAINST: VoteKind = VoteKind::Invalid; const VOTE_BACKING: VoteKind = VoteKind::Backing; fn filter_dispute_set(stmts: MultiDisputeStatementSet) -> CheckedMultiDisputeStatementSet { - let config = >::config(); + let config = configuration::ActiveConfig::::get(); let post_conclusion_acceptance_period = config.dispute_post_conclusion_acceptance_period; stmts @@ -1985,7 +1985,7 @@ fn deduplication_and_sorting_works() { fn apply_filter_all>( sets: I, ) -> Vec { - let config = >::config(); + let config = configuration::ActiveConfig::::get(); let post_conclusion_acceptance_period = config.dispute_post_conclusion_acceptance_period; let mut acc = Vec::::new(); @@ -2203,7 +2203,7 @@ fn filter_removes_concluded_ancient() { let candidate_hash_a = CandidateHash(sp_core::H256::repeat_byte(1)); let candidate_hash_b = CandidateHash(sp_core::H256::repeat_byte(2)); - >::insert( + Disputes::::insert( &1, &candidate_hash_a, DisputeState { @@ -2214,7 +2214,7 @@ fn filter_removes_concluded_ancient() { }, ); - >::insert( + Disputes::::insert( &1, &candidate_hash_b, DisputeState { diff --git a/polkadot/runtime/parachains/src/dmp.rs b/polkadot/runtime/parachains/src/dmp.rs index 15147e9210e21c6ced17d5904e60b4a633f7e902..354b16cc3f082f2f74ad276e8139e21d4094c4cc 100644 --- a/polkadot/runtime/parachains/src/dmp.rs +++ b/polkadot/runtime/parachains/src/dmp.rs @@ -226,7 +226,7 @@ impl Pallet { } let inbound = - InboundDownwardMessage { msg, sent_at: >::block_number() }; + InboundDownwardMessage { msg, sent_at: frame_system::Pallet::::block_number() }; // obtain the new link in the MQC and update the head. DownwardMessageQueueHeads::::mutate(para, |head| { @@ -346,14 +346,14 @@ impl FeeTracker for Pallet { } fn increase_fee_factor(id: Self::Id, message_size_factor: FixedU128) -> FixedU128 { - >::mutate(id, |f| { + DeliveryFeeFactor::::mutate(id, |f| { *f = f.saturating_mul(EXPONENTIAL_FEE_BASE.saturating_add(message_size_factor)); *f }) } fn decrease_fee_factor(id: Self::Id) -> FixedU128 { - >::mutate(id, |f| { + DeliveryFeeFactor::::mutate(id, |f| { *f = InitialFactor::get().max(*f / EXPONENTIAL_FEE_BASE); *f }) diff --git a/polkadot/runtime/parachains/src/dmp/tests.rs b/polkadot/runtime/parachains/src/dmp/tests.rs index f9197b156a1e1d901d55344d6b3439f39d2afbf8..f39d7ae167330be3a32b9454c449373515ac28bc 100644 --- a/polkadot/runtime/parachains/src/dmp/tests.rs +++ b/polkadot/runtime/parachains/src/dmp/tests.rs @@ -17,7 +17,7 @@ use super::*; use crate::{ configuration::ActiveConfig, - mock::{new_test_ext, Configuration, Dmp, MockGenesisConfig, Paras, System, Test}, + mock::{new_test_ext, Dmp, MockGenesisConfig, Paras, System, Test}, }; use frame_support::assert_ok; use hex_literal::hex; @@ -58,7 +58,7 @@ fn queue_downward_message( para_id: ParaId, msg: DownwardMessage, ) -> Result<(), QueueDownwardMessageError> { - Dmp::queue_downward_message(&Configuration::config(), para_id, msg) + Dmp::queue_downward_message(&configuration::ActiveConfig::::get(), para_id, msg) } #[test] diff --git a/polkadot/runtime/parachains/src/hrmp.rs b/polkadot/runtime/parachains/src/hrmp.rs index 42592d9d9f1496c882e0dd2d98e53cf06fcefcc1..05a540aef828b95b602439c89d6e44ad95c3174a 100644 --- a/polkadot/runtime/parachains/src/hrmp.rs +++ b/polkadot/runtime/parachains/src/hrmp.rs @@ -229,12 +229,12 @@ impl fmt::Debug for OutboundHrmpAcceptanceErr { ), TotalSizeExceeded { idx, total_size, limit } => write!( fmt, - "sending the HRMP message at index {} would exceed the neogitiated channel total size ({} > {})", + "sending the HRMP message at index {} would exceed the negotiated channel total size ({} > {})", idx, total_size, limit, ), CapacityExceeded { idx, count, limit } => write!( fmt, - "sending the HRMP message at index {} would exceed the neogitiated channel capacity ({} > {})", + "sending the HRMP message at index {} would exceed the negotiated channel capacity ({} > {})", idx, count, limit, ), } @@ -597,7 +597,7 @@ pub mod pallet { Error::::WrongWitness ); - let host_config = configuration::Pallet::::config(); + let host_config = configuration::ActiveConfig::::get(); Self::process_hrmp_open_channel_requests(&host_config); Ok(()) } @@ -724,7 +724,7 @@ pub mod pallet { Error::::ChannelCreationNotAuthorized ); - let config = >::config(); + let config = configuration::ActiveConfig::::get(); let max_message_size = config.hrmp_channel_max_message_size; let max_capacity = config.hrmp_channel_max_capacity; @@ -761,7 +761,7 @@ pub mod pallet { let channel_id = HrmpChannelId { sender, recipient }; let is_system = sender.is_system() || recipient.is_system(); - let config = >::config(); + let config = configuration::ActiveConfig::::get(); // Channels with and amongst the system do not require a deposit. let (new_sender_deposit, new_recipient_deposit) = if is_system { @@ -790,7 +790,7 @@ pub mod pallet { .ok_or(ArithmeticError::Underflow)?; T::Currency::unreserve( &channel_id.sender.into_account_truncating(), - // The difference should always be convertable into `Balance`, but be + // The difference should always be convertible into `Balance`, but be // paranoid and do nothing in case. amount.try_into().unwrap_or(Zero::zero()), ); @@ -840,7 +840,7 @@ pub mod pallet { } fn initialize_storage(preopen_hrmp_channels: &[(ParaId, ParaId, u32, u32)]) { - let host_config = configuration::Pallet::::config(); + let host_config = configuration::ActiveConfig::::get(); for &(sender, recipient, max_capacity, max_message_size) in preopen_hrmp_channels { if let Err(err) = preopen_hrmp_channel::(sender, recipient, max_capacity, max_message_size) @@ -848,7 +848,7 @@ fn initialize_storage(preopen_hrmp_channels: &[(ParaId, ParaId, u32, panic!("failed to initialize the genesis storage: {:?}", err); } } - >::process_hrmp_open_channel_requests(&host_config); + Pallet::::process_hrmp_open_channel_requests(&host_config); } fn preopen_hrmp_channel( @@ -857,8 +857,8 @@ fn preopen_hrmp_channel( max_capacity: u32, max_message_size: u32, ) -> DispatchResult { - >::init_open_channel(sender, recipient, max_capacity, max_message_size)?; - >::accept_open_channel(recipient, sender)?; + Pallet::::init_open_channel(sender, recipient, max_capacity, max_message_size)?; + Pallet::::accept_open_channel(recipient, sender)?; Ok(()) } @@ -1018,8 +1018,8 @@ impl Pallet { let recipient_deposit = if system_channel { 0 } else { config.hrmp_recipient_deposit }; if request.confirmed { - if >::is_valid_para(channel_id.sender) && - >::is_valid_para(channel_id.recipient) + if paras::Pallet::::is_valid_para(channel_id.sender) && + paras::Pallet::::is_valid_para(channel_id.recipient) { HrmpChannels::::insert( &channel_id, @@ -1310,7 +1310,7 @@ impl Pallet { /// Returns the amount of weight consumed. pub(crate) fn queue_outbound_hrmp(sender: ParaId, out_hrmp_msgs: HorizontalMessages) -> Weight { let mut weight = Weight::zero(); - let now = >::block_number(); + let now = frame_system::Pallet::::block_number(); for out_msg in out_hrmp_msgs { let channel_id = HrmpChannelId { sender, recipient: out_msg.recipient }; @@ -1387,11 +1387,11 @@ impl Pallet { ) -> DispatchResult { ensure!(origin != recipient, Error::::OpenHrmpChannelToSelf); ensure!( - >::is_valid_para(recipient), + paras::Pallet::::is_valid_para(recipient), Error::::OpenHrmpChannelInvalidRecipient, ); - let config = >::config(); + let config = configuration::ActiveConfig::::get(); ensure!(proposed_max_capacity > 0, Error::::OpenHrmpChannelZeroCapacity); ensure!( proposed_max_capacity <= config.hrmp_channel_max_capacity, @@ -1459,7 +1459,7 @@ impl Pallet { .encode() }; if let Err(dmp::QueueDownwardMessageError::ExceedsMaxMessageSize) = - >::queue_downward_message(&config, recipient, notification_bytes) + dmp::Pallet::::queue_downward_message(&config, recipient, notification_bytes) { // this should never happen unless the max downward message size is configured to a // jokingly small number. @@ -1485,7 +1485,7 @@ impl Pallet { // check if by accepting this open channel request, this parachain would exceed the // number of inbound channels. - let config = >::config(); + let config = configuration::ActiveConfig::::get(); let channel_num_limit = config.hrmp_max_parachain_inbound_channels; let ingress_cnt = HrmpIngressChannelsIndex::::decode_len(&origin).unwrap_or(0) as u32; let accepted_cnt = HrmpAcceptedChannelRequestCount::::get(&origin); @@ -1517,7 +1517,7 @@ impl Pallet { VersionedXcm::from(xcm).encode() }; if let Err(dmp::QueueDownwardMessageError::ExceedsMaxMessageSize) = - >::queue_downward_message(&config, sender, notification_bytes) + dmp::Pallet::::queue_downward_message(&config, sender, notification_bytes) { // this should never happen unless the max downward message size is configured to an // jokingly small number. @@ -1580,7 +1580,7 @@ impl Pallet { HrmpCloseChannelRequests::::insert(&channel_id, ()); HrmpCloseChannelRequestsList::::append(channel_id.clone()); - let config = >::config(); + let config = configuration::ActiveConfig::::get(); let notification_bytes = { use parity_scale_codec::Encode as _; use xcm::opaque::{latest::prelude::*, VersionedXcm}; @@ -1595,7 +1595,7 @@ impl Pallet { let opposite_party = if origin == channel_id.sender { channel_id.recipient } else { channel_id.sender }; if let Err(dmp::QueueDownwardMessageError::ExceedsMaxMessageSize) = - >::queue_downward_message(&config, opposite_party, notification_bytes) + dmp::Pallet::::queue_downward_message(&config, opposite_party, notification_bytes) { // this should never happen unless the max downward message size is configured to an // jokingly small number. diff --git a/polkadot/runtime/parachains/src/hrmp/benchmarking.rs b/polkadot/runtime/parachains/src/hrmp/benchmarking.rs index 2cb49c88d437cb3e0a4c01a40d343a179316ec9d..13f4cdfe3eeaf767f6c04bab6a627610db16939d 100644 --- a/polkadot/runtime/parachains/src/hrmp/benchmarking.rs +++ b/polkadot/runtime/parachains/src/hrmp/benchmarking.rs @@ -22,7 +22,7 @@ use crate::{ paras::{Pallet as Paras, ParaKind, ParachainsCache}, shared::Pallet as Shared, }; -use frame_benchmarking::{impl_benchmark_test_suite, v2::*, whitelisted_caller}; +use frame_benchmarking::{v2::*, whitelisted_caller}; use frame_support::{assert_ok, traits::Currency}; type BalanceOf = @@ -71,11 +71,13 @@ fn establish_para_connection( where ::RuntimeOrigin: From, { - let config = Configuration::::config(); + let config = configuration::ActiveConfig::::get(); let ed = T::Currency::minimum_balance(); let deposit: BalanceOf = config.hrmp_sender_deposit.unique_saturated_into(); let capacity = config.hrmp_channel_max_capacity; let message_size = config.hrmp_channel_max_message_size; + assert!(message_size > 0, "Invalid genesis for benchmarking"); + assert!(capacity > 0, "Invalid genesis for benchmarking"); let sender: ParaId = from.into(); let sender_origin: crate::Origin = from.into(); @@ -109,7 +111,7 @@ where return output } - Hrmp::::process_hrmp_open_channel_requests(&Configuration::::config()); + Hrmp::::process_hrmp_open_channel_requests(&configuration::ActiveConfig::::get()); if matches!(until, ParachainSetupStep::Established) { return output } @@ -154,13 +156,14 @@ mod benchmarks { // make sure para is registered, and has enough balance. let ed = T::Currency::minimum_balance(); - let deposit: BalanceOf = - Configuration::::config().hrmp_sender_deposit.unique_saturated_into(); + let deposit: BalanceOf = configuration::ActiveConfig::::get() + .hrmp_sender_deposit + .unique_saturated_into(); register_parachain_with_balance::(sender_id, deposit + ed); register_parachain_with_balance::(recipient_id, deposit + ed); - let capacity = Configuration::::config().hrmp_channel_max_capacity; - let message_size = Configuration::::config().hrmp_channel_max_message_size; + let capacity = configuration::ActiveConfig::::get().hrmp_channel_max_capacity; + let message_size = configuration::ActiveConfig::::get().hrmp_channel_max_message_size; #[extrinsic_call] _(sender_origin, recipient_id, capacity, message_size); @@ -226,7 +229,7 @@ mod benchmarks { // .. and enact it. Configuration::::initializer_on_new_session(&Shared::::scheduled_session()); - let config = Configuration::::config(); + let config = configuration::ActiveConfig::::get(); let deposit: BalanceOf = config.hrmp_sender_deposit.unique_saturated_into(); let para: ParaId = 1u32.into(); @@ -358,7 +361,7 @@ mod benchmarks { assert_eq!(HrmpOpenChannelRequestsList::::decode_len().unwrap_or_default() as u32, c); let outgoing = (0..c).map(|id| (id + PREFIX_1).into()).collect::>(); - let config = Configuration::::config(); + let config = configuration::ActiveConfig::::get(); #[block] { @@ -381,13 +384,14 @@ mod benchmarks { // Make sure para is registered. The sender does actually need the normal deposit because it // is first going the "init" route. let ed = T::Currency::minimum_balance(); - let sender_deposit: BalanceOf = - Configuration::::config().hrmp_sender_deposit.unique_saturated_into(); + let sender_deposit: BalanceOf = configuration::ActiveConfig::::get() + .hrmp_sender_deposit + .unique_saturated_into(); register_parachain_with_balance::(sender_id, sender_deposit + ed); register_parachain_with_balance::(recipient_id, Zero::zero()); - let capacity = Configuration::::config().hrmp_channel_max_capacity; - let message_size = Configuration::::config().hrmp_channel_max_message_size; + let capacity = configuration::ActiveConfig::::get().hrmp_channel_max_capacity; + let message_size = configuration::ActiveConfig::::get().hrmp_channel_max_message_size; let channel_id = HrmpChannelId { sender: sender_id, recipient: recipient_id }; if c == 1 { @@ -434,7 +438,7 @@ mod benchmarks { let recipient_id: ParaId = 2u32.into(); let caller: T::AccountId = whitelisted_caller(); - let config = Configuration::::config(); + let config = configuration::ActiveConfig::::get(); // make sure para is registered, and has zero balance. register_parachain_with_balance::(sender_id, Zero::zero()); @@ -464,7 +468,7 @@ mod benchmarks { let channel_id = HrmpChannelId { sender: sender_id, recipient: recipient_id }; let caller: T::AccountId = whitelisted_caller(); - let config = Configuration::::config(); + let config = configuration::ActiveConfig::::get(); // make sure para is registered, and has balance to reserve. let ed = T::Currency::minimum_balance(); diff --git a/polkadot/runtime/parachains/src/hrmp/tests.rs b/polkadot/runtime/parachains/src/hrmp/tests.rs index 7e7b67c8059dbf4ed9e2c4fc1cebb04efd44c89d..8d43b866bc19767ad3308c4f9730c1ad894d4c0c 100644 --- a/polkadot/runtime/parachains/src/hrmp/tests.rs +++ b/polkadot/runtime/parachains/src/hrmp/tests.rs @@ -19,17 +19,20 @@ // both paras are system chains, then they are also configured to the system's max configuration. use super::*; -use crate::mock::{ - deregister_parachain, new_test_ext, register_parachain, register_parachain_with_balance, - Configuration, Hrmp, MockGenesisConfig, Paras, ParasShared, RuntimeEvent as MockEvent, - RuntimeOrigin, System, Test, +use crate::{ + mock::{ + deregister_parachain, new_test_ext, register_parachain, register_parachain_with_balance, + Hrmp, MockGenesisConfig, Paras, ParasShared, RuntimeEvent as MockEvent, RuntimeOrigin, + System, Test, + }, + shared, }; use frame_support::{assert_noop, assert_ok}; use primitives::BlockNumber; use std::collections::BTreeMap; pub(crate) fn run_to_block(to: BlockNumber, new_session: Option>) { - let config = Configuration::config(); + let config = configuration::ActiveConfig::::get(); while System::block_number() < to { let b = System::block_number(); @@ -42,7 +45,7 @@ pub(crate) fn run_to_block(to: BlockNumber, new_session: Option let notification = crate::initializer::SessionChangeNotification { prev_config: config.clone(), new_config: config.clone(), - session_index: ParasShared::session_index() + 1, + session_index: shared::CurrentSessionIndex::::get() + 1, ..Default::default() }; @@ -412,7 +415,7 @@ fn poke_deposits_works() { register_parachain_with_balance(para_a, 200); register_parachain_with_balance(para_b, 200); - let config = Configuration::config(); + let config = configuration::ActiveConfig::::get(); let channel_id = HrmpChannelId { sender: para_a, recipient: para_b }; // Our normal establishment won't actually reserve deposits, so just insert them directly. @@ -512,7 +515,7 @@ fn send_recv_messages() { vec![OutboundHrmpMessage { recipient: para_b, data: b"this is an emergency".to_vec() }] .try_into() .unwrap(); - let config = Configuration::config(); + let config = configuration::ActiveConfig::::get(); assert!(Hrmp::check_outbound_hrmp(&config, para_a, &msgs).is_ok()); let _ = Hrmp::queue_outbound_hrmp(para_a, msgs); Hrmp::assert_storage_consistency_exhaustive(); @@ -621,7 +624,7 @@ fn check_sent_messages() { vec![OutboundHrmpMessage { recipient: para_b, data: b"knock".to_vec() }] .try_into() .unwrap(); - let config = Configuration::config(); + let config = configuration::ActiveConfig::::get(); assert!(Hrmp::check_outbound_hrmp(&config, para_a, &msgs).is_ok()); let _ = Hrmp::queue_outbound_hrmp(para_a, msgs.clone()); @@ -702,7 +705,7 @@ fn verify_externally_accessible() { sp_io::storage::get(&well_known_keys::hrmp_ingress_channel_index(para_b)) .expect("the ingress index must be present for para_b"); let ingress_index = >::decode(&mut &raw_ingress_index[..]) - .expect("ingress indexx should be decodable as a list of para ids"); + .expect("ingress index should be decodable as a list of para ids"); assert_eq!(ingress_index, vec![para_a]); // Now, verify that we can access and decode the egress index. @@ -912,7 +915,7 @@ fn watermark_maxed_out_at_relay_parent() { vec![OutboundHrmpMessage { recipient: para_b, data: b"this is an emergency".to_vec() }] .try_into() .unwrap(); - let config = Configuration::config(); + let config = configuration::ActiveConfig::::get(); assert!(Hrmp::check_outbound_hrmp(&config, para_a, &msgs).is_ok()); let _ = Hrmp::queue_outbound_hrmp(para_a, msgs); Hrmp::assert_storage_consistency_exhaustive(); diff --git a/polkadot/runtime/parachains/src/inclusion/migration.rs b/polkadot/runtime/parachains/src/inclusion/migration.rs new file mode 100644 index 0000000000000000000000000000000000000000..5f35680ee694c45f519a1e31478c4aef0f7c19b9 --- /dev/null +++ b/polkadot/runtime/parachains/src/inclusion/migration.rs @@ -0,0 +1,317 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +pub use v1::MigrateToV1; + +pub mod v0 { + use crate::inclusion::{Config, Pallet}; + use bitvec::{order::Lsb0 as BitOrderLsb0, vec::BitVec}; + use frame_support::{storage_alias, Twox64Concat}; + use frame_system::pallet_prelude::BlockNumberFor; + use parity_scale_codec::{Decode, Encode}; + use primitives::{ + AvailabilityBitfield, CandidateCommitments, CandidateDescriptor, CandidateHash, CoreIndex, + GroupIndex, Id as ParaId, ValidatorIndex, + }; + use scale_info::TypeInfo; + + #[derive(Encode, Decode, PartialEq, TypeInfo, Clone, Debug)] + pub struct CandidatePendingAvailability { + pub core: CoreIndex, + pub hash: CandidateHash, + pub descriptor: CandidateDescriptor, + pub availability_votes: BitVec, + pub backers: BitVec, + pub relay_parent_number: N, + pub backed_in_number: N, + pub backing_group: GroupIndex, + } + + #[derive(Encode, Decode, TypeInfo, Debug, PartialEq)] + pub struct AvailabilityBitfieldRecord { + pub bitfield: AvailabilityBitfield, + pub submitted_at: N, + } + + #[storage_alias] + pub type PendingAvailability = StorageMap< + Pallet, + Twox64Concat, + ParaId, + CandidatePendingAvailability<::Hash, BlockNumberFor>, + >; + + #[storage_alias] + pub type PendingAvailabilityCommitments = + StorageMap, Twox64Concat, ParaId, CandidateCommitments>; + + #[storage_alias] + pub type AvailabilityBitfields = StorageMap< + Pallet, + Twox64Concat, + ValidatorIndex, + AvailabilityBitfieldRecord>, + >; +} + +mod v1 { + use super::v0::{ + AvailabilityBitfields, PendingAvailability as V0PendingAvailability, + PendingAvailabilityCommitments as V0PendingAvailabilityCommitments, + }; + use crate::inclusion::{ + CandidatePendingAvailability as V1CandidatePendingAvailability, Config, Pallet, + PendingAvailability as V1PendingAvailability, + }; + use frame_support::{traits::UncheckedOnRuntimeUpgrade, weights::Weight}; + use sp_core::Get; + use sp_std::{collections::vec_deque::VecDeque, vec::Vec}; + + #[cfg(feature = "try-runtime")] + use frame_support::{ + ensure, + traits::{GetStorageVersion, StorageVersion}, + }; + #[cfg(feature = "try-runtime")] + use parity_scale_codec::{Decode, Encode}; + + pub struct VersionUncheckedMigrateToV1(sp_std::marker::PhantomData); + + impl UncheckedOnRuntimeUpgrade for VersionUncheckedMigrateToV1 { + #[cfg(feature = "try-runtime")] + fn pre_upgrade() -> Result, sp_runtime::TryRuntimeError> { + log::trace!(target: crate::inclusion::LOG_TARGET, "Running pre_upgrade() for inclusion MigrateToV1"); + let candidates_before_upgrade = V0PendingAvailability::::iter().count(); + let commitments_before_upgrade = V0PendingAvailabilityCommitments::::iter().count(); + + if candidates_before_upgrade != commitments_before_upgrade { + log::warn!( + target: crate::inclusion::LOG_TARGET, + "Number of pending candidates differ from the number of pending commitments. {} vs {}", + candidates_before_upgrade, + commitments_before_upgrade + ); + } + + Ok((candidates_before_upgrade as u32).encode()) + } + + fn on_runtime_upgrade() -> Weight { + let mut weight: Weight = Weight::zero(); + + let v0_candidates: Vec<_> = V0PendingAvailability::::drain().collect(); + + for (para_id, candidate) in v0_candidates { + let commitments = V0PendingAvailabilityCommitments::::take(para_id); + // One write for each removal (one candidate and one commitment). + weight = weight.saturating_add(T::DbWeight::get().writes(2)); + + if let Some(commitments) = commitments { + let mut per_para = VecDeque::new(); + per_para.push_back(V1CandidatePendingAvailability { + core: candidate.core, + hash: candidate.hash, + descriptor: candidate.descriptor, + availability_votes: candidate.availability_votes, + backers: candidate.backers, + relay_parent_number: candidate.relay_parent_number, + backed_in_number: candidate.backed_in_number, + backing_group: candidate.backing_group, + commitments, + }); + V1PendingAvailability::::insert(para_id, per_para); + + weight = weight.saturating_add(T::DbWeight::get().writes(1)); + } + } + + // should've already been drained by the above for loop, but as a sanity check, in case + // there are more commitments than candidates. + // V0PendingAvailabilityCommitments should not contain too many keys so removing + // everything at once should be safe + let res = V0PendingAvailabilityCommitments::::clear(u32::MAX, None); + weight = weight.saturating_add( + T::DbWeight::get().reads_writes(res.loops as u64, res.backend as u64), + ); + + // AvailabilityBitfields should not contain too many keys so removing everything at once + // should be safe. + let res = AvailabilityBitfields::::clear(u32::MAX, None); + weight = weight.saturating_add( + T::DbWeight::get().reads_writes(res.loops as u64, res.backend as u64), + ); + + weight + } + + #[cfg(feature = "try-runtime")] + fn post_upgrade(state: Vec) -> Result<(), sp_runtime::TryRuntimeError> { + log::trace!(target: crate::inclusion::LOG_TARGET, "Running post_upgrade() for inclusion MigrateToV1"); + ensure!( + Pallet::::on_chain_storage_version() >= StorageVersion::new(1), + "Storage version should be >= 1 after the migration" + ); + + let candidates_before_upgrade = + u32::decode(&mut &state[..]).expect("Was properly encoded") as usize; + let candidates_after_upgrade = V1PendingAvailability::::iter().fold( + 0usize, + |mut acc, (_paraid, para_candidates)| { + acc += para_candidates.len(); + acc + }, + ); + + ensure!( + candidates_before_upgrade == candidates_after_upgrade, + "Number of pending candidates should be the same as the one before the upgrade." + ); + ensure!( + V0PendingAvailability::::iter().next() == None, + "Pending availability candidates storage v0 should have been removed" + ); + ensure!( + V0PendingAvailabilityCommitments::::iter().next() == None, + "Pending availability commitments storage should have been removed" + ); + ensure!( + AvailabilityBitfields::::iter().next() == None, + "Availability bitfields storage should have been removed" + ); + + Ok(()) + } + } + + /// Migrate to v1 inclusion module storage. + /// - merges the `PendingAvailabilityCommitments` into the `CandidatePendingAvailability` + /// storage + /// - removes the `AvailabilityBitfields` storage, which was never read. + pub type MigrateToV1 = frame_support::migrations::VersionedMigration< + 0, + 1, + VersionUncheckedMigrateToV1, + Pallet, + ::DbWeight, + >; +} + +#[cfg(test)] +mod tests { + use super::{v1::VersionUncheckedMigrateToV1, *}; + use crate::{ + inclusion::{ + CandidatePendingAvailability as V1CandidatePendingAvailability, + PendingAvailability as V1PendingAvailability, *, + }, + mock::{new_test_ext, MockGenesisConfig, Test}, + }; + use frame_support::traits::UncheckedOnRuntimeUpgrade; + use primitives::{AvailabilityBitfield, Id as ParaId}; + use test_helpers::{dummy_candidate_commitments, dummy_candidate_descriptor, dummy_hash}; + + #[test] + fn migrate_to_v1() { + new_test_ext(MockGenesisConfig::default()).execute_with(|| { + // No data to migrate. + assert_eq!( + as UncheckedOnRuntimeUpgrade>::on_runtime_upgrade(), + Weight::zero() + ); + assert!(V1PendingAvailability::::iter().next().is_none()); + + let mut expected = vec![]; + + for i in 1..5 { + let descriptor = dummy_candidate_descriptor(dummy_hash()); + v0::PendingAvailability::::insert( + ParaId::from(i), + v0::CandidatePendingAvailability { + core: CoreIndex(i), + descriptor: descriptor.clone(), + relay_parent_number: i, + hash: CandidateHash(dummy_hash()), + availability_votes: Default::default(), + backed_in_number: i, + backers: Default::default(), + backing_group: GroupIndex(i), + }, + ); + v0::PendingAvailabilityCommitments::::insert( + ParaId::from(i), + dummy_candidate_commitments(HeadData(vec![i as _])), + ); + + v0::AvailabilityBitfields::::insert( + ValidatorIndex(i), + v0::AvailabilityBitfieldRecord { + bitfield: AvailabilityBitfield(Default::default()), + submitted_at: i, + }, + ); + + expected.push(( + ParaId::from(i), + [V1CandidatePendingAvailability { + core: CoreIndex(i), + descriptor, + relay_parent_number: i, + hash: CandidateHash(dummy_hash()), + availability_votes: Default::default(), + backed_in_number: i, + backers: Default::default(), + backing_group: GroupIndex(i), + commitments: dummy_candidate_commitments(HeadData(vec![i as _])), + }] + .into_iter() + .collect::>(), + )); + } + // add some wrong data also, candidates without commitments or commitments without + // candidates. + v0::PendingAvailability::::insert( + ParaId::from(6), + v0::CandidatePendingAvailability { + core: CoreIndex(6), + descriptor: dummy_candidate_descriptor(dummy_hash()), + relay_parent_number: 6, + hash: CandidateHash(dummy_hash()), + availability_votes: Default::default(), + backed_in_number: 6, + backers: Default::default(), + backing_group: GroupIndex(6), + }, + ); + v0::PendingAvailabilityCommitments::::insert( + ParaId::from(7), + dummy_candidate_commitments(HeadData(vec![7 as _])), + ); + + // For tests, db weight is zero. + assert_eq!( + as UncheckedOnRuntimeUpgrade>::on_runtime_upgrade(), + Weight::zero() + ); + + assert_eq!(v0::PendingAvailabilityCommitments::::iter().next(), None); + assert_eq!(v0::PendingAvailability::::iter().next(), None); + assert_eq!(v0::AvailabilityBitfields::::iter().next(), None); + + let mut actual = V1PendingAvailability::::iter().collect::>(); + actual.sort_by(|(id1, _), (id2, _)| id1.cmp(id2)); + expected.sort_by(|(id1, _), (id2, _)| id1.cmp(id2)); + + assert_eq!(actual, expected); + }); + } +} diff --git a/polkadot/runtime/parachains/src/inclusion/mod.rs b/polkadot/runtime/parachains/src/inclusion/mod.rs index 90af9cde00a8faaec13101b490ea3ba92f4a827c..9d60bbb23b6fae7f34b5b3152d01afe824c5936f 100644 --- a/polkadot/runtime/parachains/src/inclusion/mod.rs +++ b/polkadot/runtime/parachains/src/inclusion/mod.rs @@ -22,33 +22,34 @@ use crate::{ configuration::{self, HostConfiguration}, disputes, dmp, hrmp, - paras::{self, SetGoAhead}, - scheduler::{self, AvailabilityTimeoutStatus}, + paras::{self, UpgradeStrategy}, + scheduler, shared::{self, AllowedRelayParentsTracker}, + util::make_persisted_validation_data_with_parent, }; use bitvec::{order::Lsb0 as BitOrderLsb0, vec::BitVec}; use frame_support::{ defensive, pallet_prelude::*, - traits::{Defensive, EnqueueMessage, Footprint, QueueFootprint}, + traits::{EnqueueMessage, Footprint, QueueFootprint}, BoundedSlice, }; use frame_system::pallet_prelude::*; use pallet_message_queue::OnQueueChanged; use parity_scale_codec::{Decode, Encode}; use primitives::{ - effective_minimum_backing_votes, supermajority_threshold, well_known_keys, - AvailabilityBitfield, BackedCandidate, CandidateCommitments, CandidateDescriptor, - CandidateHash, CandidateReceipt, CommittedCandidateReceipt, CoreIndex, GroupIndex, Hash, - HeadData, Id as ParaId, SignedAvailabilityBitfields, SigningContext, UpwardMessage, - ValidatorId, ValidatorIndex, ValidityAttestation, + effective_minimum_backing_votes, supermajority_threshold, well_known_keys, BackedCandidate, + CandidateCommitments, CandidateDescriptor, CandidateHash, CandidateReceipt, + CommittedCandidateReceipt, CoreIndex, GroupIndex, Hash, HeadData, Id as ParaId, + SignedAvailabilityBitfields, SigningContext, UpwardMessage, ValidatorId, ValidatorIndex, + ValidityAttestation, }; use scale_info::TypeInfo; use sp_runtime::{traits::One, DispatchError, SaturatedConversion, Saturating}; #[cfg(feature = "std")] use sp_std::fmt; use sp_std::{ - collections::{btree_map::BTreeMap, btree_set::BTreeSet}, + collections::{btree_map::BTreeMap, btree_set::BTreeSet, vec_deque::VecDeque}, prelude::*, }; @@ -60,6 +61,8 @@ pub(crate) mod tests; #[cfg(feature = "runtime-benchmarks")] mod benchmarking; +pub mod migration; + pub trait WeightInfo { fn receive_upward_messages(i: u32) -> Weight; } @@ -83,20 +86,8 @@ impl WeightInfo for () { /// `configuration` pallet to check these values before setting. pub const MAX_UPWARD_MESSAGE_SIZE_BOUND: u32 = 128 * 1024; -/// A bitfield signed by a validator indicating that it is keeping its piece of the erasure-coding -/// for any backed candidates referred to by a `1` bit available. -/// -/// The bitfield's signature should be checked at the point of submission. Afterwards it can be -/// dropped. -#[derive(Encode, Decode, TypeInfo)] -#[cfg_attr(test, derive(Debug))] -pub struct AvailabilityBitfieldRecord { - bitfield: AvailabilityBitfield, // one bit per core. - submitted_at: N, // for accounting, as meaning of bits may change over time. -} - /// A backed candidate pending availability. -#[derive(Encode, Decode, PartialEq, TypeInfo)] +#[derive(Encode, Decode, PartialEq, TypeInfo, Clone)] #[cfg_attr(test, derive(Debug))] pub struct CandidatePendingAvailability { /// The availability core this is assigned to. @@ -105,6 +96,8 @@ pub struct CandidatePendingAvailability { hash: CandidateHash, /// The candidate descriptor. descriptor: CandidateDescriptor, + /// The candidate commitments. + commitments: CandidateCommitments, /// The received availability votes. One bit per validator. availability_votes: BitVec, /// The backers of the candidate pending availability. @@ -124,8 +117,11 @@ impl CandidatePendingAvailability { } /// Get the relay-chain block number this was backed in. - pub(crate) fn backed_in_number(&self) -> &N { - &self.backed_in_number + pub(crate) fn backed_in_number(&self) -> N + where + N: Clone, + { + self.backed_in_number.clone() } /// Get the core index. @@ -143,6 +139,11 @@ impl CandidatePendingAvailability { &self.descriptor } + /// Get the candidate commitments. + pub(crate) fn candidate_commitments(&self) -> &CandidateCommitments { + &self.commitments + } + /// Get the candidate's relay parent's number. pub(crate) fn relay_parent_number(&self) -> N where @@ -151,11 +152,22 @@ impl CandidatePendingAvailability { self.relay_parent_number.clone() } + /// Get the candidate backing group. + pub(crate) fn backing_group(&self) -> GroupIndex { + self.backing_group + } + + /// Get the candidate's backers. + pub(crate) fn backers(&self) -> &BitVec { + &self.backers + } + #[cfg(any(feature = "runtime-benchmarks", test))] pub(crate) fn new( core: CoreIndex, hash: CandidateHash, descriptor: CandidateDescriptor, + commitments: CandidateCommitments, availability_votes: BitVec, backers: BitVec, relay_parent_number: N, @@ -166,6 +178,7 @@ impl CandidatePendingAvailability { core, hash, descriptor, + commitments, availability_votes, backers, relay_parent_number, @@ -256,8 +269,10 @@ pub type MaxUmpMessageLenOf = pub mod pallet { use super::*; + const STORAGE_VERSION: StorageVersion = StorageVersion::new(1); #[pallet::pallet] #[pallet::without_storage_info] + #[pallet::storage_version(STORAGE_VERSION)] pub struct Pallet(_); #[pallet::config] @@ -300,30 +315,10 @@ pub mod pallet { #[pallet::error] pub enum Error { - /// Validator indices are out of order or contains duplicates. - UnsortedOrDuplicateValidatorIndices, - /// Dispute statement sets are out of order or contain duplicates. - UnsortedOrDuplicateDisputeStatementSet, - /// Backed candidates are out of order (core index) or contain duplicates. - UnsortedOrDuplicateBackedCandidates, - /// A different relay parent was provided compared to the on-chain stored one. - UnexpectedRelayParent, - /// Availability bitfield has unexpected size. - WrongBitfieldSize, - /// Bitfield consists of zeros only. - BitfieldAllZeros, - /// Multiple bitfields submitted by same validator or validators out of order by index. - BitfieldDuplicateOrUnordered, /// Validator index out of bounds. ValidatorIndexOutOfBounds, - /// Invalid signature - InvalidBitfieldSignature, /// Candidate submitted but para not scheduled. UnscheduledCandidate, - /// Candidate scheduled despite pending candidate already existing for the para. - CandidateScheduledBeforeParaFree, - /// Scheduled cores out of order. - ScheduledOutOfOrder, /// Head data exceeds the configured maximum. HeadDataTooLarge, /// Code upgrade prematurely. @@ -359,31 +354,22 @@ pub mod pallet { /// The `para_head` hash in the candidate descriptor doesn't match the hash of the actual /// para head in the commitments. ParaHeadMismatch, - /// A bitfield that references a freed core, - /// either intentionally or as part of a concluded - /// invalid dispute. - BitfieldReferencesFreedCore, } - /// The latest bitfield for each validator, referred to by their index in the validator set. - #[pallet::storage] - pub(crate) type AvailabilityBitfields = - StorageMap<_, Twox64Concat, ValidatorIndex, AvailabilityBitfieldRecord>>; - - /// Candidates pending availability by `ParaId`. + /// Candidates pending availability by `ParaId`. They form a chain starting from the latest + /// included head of the para. + /// Use a different prefix post-migration to v1, since the v0 `PendingAvailability` storage + /// would otherwise have the exact same prefix which could cause undefined behaviour when doing + /// the migration. #[pallet::storage] + #[pallet::storage_prefix = "V1"] pub(crate) type PendingAvailability = StorageMap< _, Twox64Concat, ParaId, - CandidatePendingAvailability>, + VecDeque>>, >; - /// The commitments of candidates pending availability, by `ParaId`. - #[pallet::storage] - pub(crate) type PendingAvailabilityCommitments = - StorageMap<_, Twox64Concat, ParaId, CandidateCommitments>; - #[pallet::call] impl Pallet {} } @@ -472,9 +458,7 @@ impl Pallet { ) { // unlike most drain methods, drained elements are not cleared on `Drop` of the iterator // and require consumption. - for _ in >::drain() {} - for _ in >::drain() {} - for _ in >::drain() {} + for _ in PendingAvailability::::drain() {} Self::cleanup_outgoing_ump_dispatch_queues(outgoing_paras); } @@ -493,27 +477,18 @@ impl Pallet { /// /// Bitfields are expected to have been sanitized already. E.g. via `sanitize_bitfields`! /// - /// Updates storage items `PendingAvailability` and `AvailabilityBitfields`. + /// Updates storage items `PendingAvailability`. /// /// Returns a `Vec` of `CandidateHash`es and their respective `AvailabilityCore`s that became /// available, and cores free. - pub(crate) fn update_pending_availability_and_get_freed_cores( - expected_bits: usize, + pub(crate) fn update_pending_availability_and_get_freed_cores( validators: &[ValidatorId], signed_bitfields: SignedAvailabilityBitfields, - core_lookup: F, - ) -> Vec<(CoreIndex, CandidateHash)> - where - F: Fn(CoreIndex) -> Option, - { - let mut assigned_paras_record = (0..expected_bits) - .map(|bit_index| core_lookup(CoreIndex::from(bit_index as u32))) - .map(|opt_para_id| { - opt_para_id.map(|para_id| (para_id, PendingAvailability::::get(¶_id))) - }) - .collect::>(); + ) -> Vec<(CoreIndex, CandidateHash)> { + let threshold = availability_threshold(validators.len()); + + let mut votes_per_core: BTreeMap> = BTreeMap::new(); - let now = >::block_number(); for (checked_bitfield, validator_index) in signed_bitfields.into_iter().map(|signed_bitfield| { let validator_idx = signed_bitfield.validator_index(); @@ -521,298 +496,275 @@ impl Pallet { (checked_bitfield, validator_idx) }) { for (bit_idx, _) in checked_bitfield.0.iter().enumerate().filter(|(_, is_av)| **is_av) { - let pending_availability = if let Some((_, pending_availability)) = - assigned_paras_record[bit_idx].as_mut() - { - pending_availability - } else { - // For honest validators, this happens in case of unoccupied cores, - // which in turn happens in case of a disputed candidate. - // A malicious one might include arbitrary indices, but they are represented - // by `None` values and will be sorted out in the next if case. - continue - }; - - // defensive check - this is constructed by loading the availability bitfield - // record, which is always `Some` if the core is occupied - that's why we're here. - let validator_index = validator_index.0 as usize; - if let Some(mut bit) = - pending_availability.as_mut().and_then(|candidate_pending_availability| { - candidate_pending_availability.availability_votes.get_mut(validator_index) - }) { - *bit = true; - } + let core_index = CoreIndex(bit_idx as u32); + votes_per_core + .entry(core_index) + .or_insert_with(|| BTreeSet::new()) + .insert(validator_index); } - - let record = - AvailabilityBitfieldRecord { bitfield: checked_bitfield, submitted_at: now }; - - >::insert(&validator_index, record); } - let threshold = availability_threshold(validators.len()); + let mut freed_cores = vec![]; + + let pending_paraids: Vec<_> = PendingAvailability::::iter_keys().collect(); + for paraid in pending_paraids { + PendingAvailability::::mutate(paraid, |candidates| { + if let Some(candidates) = candidates { + let mut last_enacted_index: Option = None; + + for (candidate_index, candidate) in candidates.iter_mut().enumerate() { + if let Some(validator_indices) = votes_per_core.remove(&candidate.core) { + for validator_index in validator_indices.iter() { + // defensive check - this is constructed by loading the + // availability bitfield record, which is always `Some` if + // the core is occupied - that's why we're here. + if let Some(mut bit) = + candidate.availability_votes.get_mut(validator_index.0 as usize) + { + *bit = true; + } + } + } + + // We check for the candidate's availability even if we didn't get any new + // bitfields for its core, as it may have already been available at a + // previous block but wasn't enacted due to its predecessors not being + // available. + if candidate.availability_votes.count_ones() >= threshold { + // We can only enact a candidate if we've enacted all of its + // predecessors already. + let can_enact = if candidate_index == 0 { + last_enacted_index == None + } else { + let prev_candidate_index = usize::try_from(candidate_index - 1) + .expect("Previous `if` would have caught a 0 candidate index."); + matches!(last_enacted_index, Some(old_index) if old_index == prev_candidate_index) + }; + + if can_enact { + last_enacted_index = Some(candidate_index); + } + } + } - let mut freed_cores = Vec::with_capacity(expected_bits); - for (para_id, pending_availability) in assigned_paras_record - .into_iter() - .flatten() - .filter_map(|(id, p)| p.map(|p| (id, p))) - { - if pending_availability.availability_votes.count_ones() >= threshold { - >::remove(¶_id); - let commitments = match PendingAvailabilityCommitments::::take(¶_id) { - Some(commitments) => commitments, - None => { - log::warn!( - target: LOG_TARGET, - "Inclusion::process_bitfields: PendingAvailability and PendingAvailabilityCommitments - are out of sync, did someone mess with the storage?", - ); - continue - }, - }; - - let receipt = CommittedCandidateReceipt { - descriptor: pending_availability.descriptor, - commitments, - }; - let _weight = Self::enact_candidate( - pending_availability.relay_parent_number, - receipt, - pending_availability.backers, - pending_availability.availability_votes, - pending_availability.core, - pending_availability.backing_group, - ); - - freed_cores.push((pending_availability.core, pending_availability.hash)); - } else { - >::insert(¶_id, &pending_availability); - } + // Trim the pending availability candidates storage and enact candidates of this + // para now. + if let Some(last_enacted_index) = last_enacted_index { + let evicted_candidates = candidates.drain(0..=last_enacted_index); + for candidate in evicted_candidates { + freed_cores.push((candidate.core, candidate.hash)); + + let receipt = CommittedCandidateReceipt { + descriptor: candidate.descriptor, + commitments: candidate.commitments, + }; + let _weight = Self::enact_candidate( + candidate.relay_parent_number, + receipt, + candidate.backers, + candidate.availability_votes, + candidate.core, + candidate.backing_group, + ); + } + } + } + }); } freed_cores } - /// Process candidates that have been backed. Provide the relay storage root, a set of - /// candidates and scheduled cores. + /// Process candidates that have been backed. Provide a set of + /// candidates along with their scheduled cores. /// - /// Both should be sorted ascending by core index, and the candidates should be a subset of - /// scheduled cores. If these conditions are not met, the execution of the function fails. + /// Candidates of the same paraid should be sorted according to their dependency order (they + /// should form a chain). If this condition is not met, this function will return an error. + /// (This really should not happen here, if the candidates were properly sanitised in + /// paras_inherent). pub(crate) fn process_candidates( allowed_relay_parents: &AllowedRelayParentsTracker>, - candidates: Vec>, - scheduled: &BTreeMap, + candidates: &BTreeMap, CoreIndex)>>, group_validators: GV, + core_index_enabled: bool, ) -> Result, DispatchError> where GV: Fn(GroupIndex) -> Option>, { - let now = >::block_number(); - - ensure!(candidates.len() <= scheduled.len(), Error::::UnscheduledCandidate); - - if scheduled.is_empty() { + if candidates.is_empty() { return Ok(ProcessedCandidates::default()) } - let minimum_backing_votes = configuration::Pallet::::config().minimum_backing_votes; - let validators = shared::Pallet::::active_validator_keys(); + let now = frame_system::Pallet::::block_number(); + let validators = shared::ActiveValidatorKeys::::get(); // Collect candidate receipts with backers. let mut candidate_receipt_with_backing_validator_indices = Vec::with_capacity(candidates.len()); + let mut core_indices = Vec::with_capacity(candidates.len()); - // Do all checks before writing storage. - let core_indices_and_backers = { - let mut core_indices_and_backers = Vec::with_capacity(candidates.len()); - let mut last_core = None; - - let mut check_assignment_in_order = |core_idx| -> DispatchResult { - ensure!( - last_core.map_or(true, |core| core_idx > core), - Error::::ScheduledOutOfOrder, - ); - - last_core = Some(core_idx); - Ok(()) + for (para_id, para_candidates) in candidates { + let mut latest_head_data = match Self::para_latest_head_data(para_id) { + None => { + defensive!("Latest included head data for paraid {:?} is None", para_id); + continue + }, + Some(latest_head_data) => latest_head_data, }; - // We combine an outer loop over candidates with an inner loop over the scheduled, - // where each iteration of the outer loop picks up at the position - // in scheduled just after the past iteration left off. - // - // If the candidates appear in the same order as they appear in `scheduled`, - // then they should always be found. If the end of `scheduled` is reached, - // then the candidate was either not scheduled or out-of-order. - // - // In the meantime, we do certain sanity checks on the candidates and on the scheduled - // list. - for (candidate_idx, backed_candidate) in candidates.iter().enumerate() { - let relay_parent_hash = backed_candidate.descriptor().relay_parent; - let para_id = backed_candidate.descriptor().para_id; - - let prev_context = >::para_most_recent_context(para_id); - - let check_ctx = CandidateCheckContext::::new(prev_context); - let signing_context = SigningContext { - parent_hash: relay_parent_hash, - session_index: shared::Pallet::::session_index(), - }; - - let relay_parent_number = match check_ctx.verify_backed_candidate( + for (candidate, core) in para_candidates.iter() { + let candidate_hash = candidate.candidate().hash(); + + let check_ctx = CandidateCheckContext::::new(None); + let relay_parent_number = check_ctx.verify_backed_candidate( &allowed_relay_parents, - candidate_idx, - backed_candidate, - )? { - Err(FailedToCreatePVD) => { - log::debug!( - target: LOG_TARGET, - "Failed to create PVD for candidate {}", - candidate_idx, - ); - // We don't want to error out here because it will - // brick the relay-chain. So we return early without - // doing anything. - return Ok(ProcessedCandidates::default()) - }, - Ok(rpn) => rpn, - }; - - let para_id = backed_candidate.descriptor().para_id; - let mut backers = bitvec::bitvec![u8, BitOrderLsb0; 0; validators.len()]; - - let core_idx = *scheduled.get(¶_id).ok_or(Error::::UnscheduledCandidate)?; - check_assignment_in_order(core_idx)?; - ensure!( - >::get(¶_id).is_none() && - >::get(¶_id).is_none(), - Error::::CandidateScheduledBeforeParaFree, - ); - - // The candidate based upon relay parent `N` should be backed by a group - // assigned to core at block `N + 1`. Thus, `relay_parent_number + 1` - // will always land in the current session. - let group_idx = >::group_assigned_to_core( - core_idx, + candidate.candidate(), + latest_head_data.clone(), + )?; + + // The candidate based upon relay parent `N` should be backed by a + // group assigned to core at block `N + 1`. Thus, + // `relay_parent_number + 1` will always land in the current + // session. + let group_idx = scheduler::Pallet::::group_assigned_to_core( + *core, relay_parent_number + One::one(), ) .ok_or_else(|| { log::warn!( target: LOG_TARGET, - "Failed to compute group index for candidate {}", - candidate_idx + "Failed to compute group index for candidate {:?}", + candidate_hash ); Error::::InvalidAssignment })?; let group_vals = group_validators(group_idx).ok_or_else(|| Error::::InvalidGroupIndex)?; - // check the signatures in the backing and that it is a majority. - { - let maybe_amount_validated = primitives::check_candidate_backing( - &backed_candidate, - &signing_context, - group_vals.len(), - |intra_group_vi| { - group_vals - .get(intra_group_vi) - .and_then(|vi| validators.get(vi.0 as usize)) - .map(|v| v.clone()) - }, - ); - - match maybe_amount_validated { - Ok(amount_validated) => ensure!( - amount_validated >= - effective_minimum_backing_votes( - group_vals.len(), - minimum_backing_votes - ), - Error::::InsufficientBacking, - ), - Err(()) => { - Err(Error::::InvalidBacking)?; - }, + // Check backing vote count and validity. + let (backers, backer_idx_and_attestation) = Self::check_backing_votes( + candidate, + &validators, + group_vals, + core_index_enabled, + )?; + + // Found a valid candidate. + latest_head_data = candidate.candidate().commitments.head_data.clone(); + candidate_receipt_with_backing_validator_indices + .push((candidate.receipt(), backer_idx_and_attestation)); + core_indices.push((*core, *para_id)); + + // Update storage now + PendingAvailability::::mutate(¶_id, |pending_availability| { + let new_candidate = CandidatePendingAvailability { + core: *core, + hash: candidate_hash, + descriptor: candidate.candidate().descriptor.clone(), + commitments: candidate.candidate().commitments.clone(), + // initialize all availability votes to 0. + availability_votes: bitvec::bitvec![u8, BitOrderLsb0; 0; validators.len()], + relay_parent_number, + backers: backers.to_bitvec(), + backed_in_number: now, + backing_group: group_idx, + }; + + if let Some(pending_availability) = pending_availability { + pending_availability.push_back(new_candidate); + } else { + *pending_availability = + Some([new_candidate].into_iter().collect::>()) } + }); - let mut backer_idx_and_attestation = - Vec::<(ValidatorIndex, ValidityAttestation)>::with_capacity( - backed_candidate.validator_indices.count_ones(), - ); - let candidate_receipt = backed_candidate.receipt(); - - for ((bit_idx, _), attestation) in backed_candidate - .validator_indices - .iter() - .enumerate() - .filter(|(_, signed)| **signed) - .zip(backed_candidate.validity_votes.iter().cloned()) - { - let val_idx = - group_vals.get(bit_idx).expect("this query succeeded above; qed"); - backer_idx_and_attestation.push((*val_idx, attestation)); - - backers.set(val_idx.0 as _, true); - } - candidate_receipt_with_backing_validator_indices - .push((candidate_receipt, backer_idx_and_attestation)); - } - - core_indices_and_backers.push(( - (core_idx, para_id), - backers, + // Deposit backed event. + Self::deposit_event(Event::::CandidateBacked( + candidate.candidate().to_plain(), + candidate.candidate().commitments.head_data.clone(), + *core, group_idx, - relay_parent_number, )); } + } - core_indices_and_backers - }; + Ok(ProcessedCandidates:: { + core_indices, + candidate_receipt_with_backing_validator_indices, + }) + } - // one more sweep for actually writing to storage. - let core_indices = core_indices_and_backers.iter().map(|(c, ..)| *c).collect(); - for (candidate, (core, backers, group, relay_parent_number)) in - candidates.into_iter().zip(core_indices_and_backers) - { - let para_id = candidate.descriptor().para_id; + // Get the latest backed output head data of this para. + pub(crate) fn para_latest_head_data(para_id: &ParaId) -> Option { + match PendingAvailability::::get(para_id).and_then(|pending_candidates| { + pending_candidates.back().map(|x| x.commitments.head_data.clone()) + }) { + Some(head_data) => Some(head_data), + None => paras::Heads::::get(para_id), + } + } - // initialize all availability votes to 0. - let availability_votes: BitVec = - bitvec::bitvec![u8, BitOrderLsb0; 0; validators.len()]; + fn check_backing_votes( + backed_candidate: &BackedCandidate, + validators: &[ValidatorId], + group_vals: Vec, + core_index_enabled: bool, + ) -> Result<(BitVec, Vec<(ValidatorIndex, ValidityAttestation)>), Error> { + let minimum_backing_votes = configuration::ActiveConfig::::get().minimum_backing_votes; + + let mut backers = bitvec::bitvec![u8, BitOrderLsb0; 0; validators.len()]; + let signing_context = SigningContext { + parent_hash: backed_candidate.descriptor().relay_parent, + session_index: shared::CurrentSessionIndex::::get(), + }; - Self::deposit_event(Event::::CandidateBacked( - candidate.candidate.to_plain(), - candidate.candidate.commitments.head_data.clone(), - core.0, - group, - )); + let (validator_indices, _) = + backed_candidate.validator_indices_and_core_index(core_index_enabled); + + // check the signatures in the backing and that it is a majority. + let maybe_amount_validated = primitives::check_candidate_backing( + backed_candidate.candidate().hash(), + backed_candidate.validity_votes(), + validator_indices, + &signing_context, + group_vals.len(), + |intra_group_vi| { + group_vals + .get(intra_group_vi) + .and_then(|vi| validators.get(vi.0 as usize)) + .map(|v| v.clone()) + }, + ); - let candidate_hash = candidate.candidate.hash(); - - let (descriptor, commitments) = - (candidate.candidate.descriptor, candidate.candidate.commitments); - - >::insert( - ¶_id, - CandidatePendingAvailability { - core: core.0, - hash: candidate_hash, - descriptor, - availability_votes, - relay_parent_number, - backers: backers.to_bitvec(), - backed_in_number: now, - backing_group: group, - }, + match maybe_amount_validated { + Ok(amount_validated) => ensure!( + amount_validated >= + effective_minimum_backing_votes(group_vals.len(), minimum_backing_votes), + Error::::InsufficientBacking, + ), + Err(()) => { + Err(Error::::InvalidBacking)?; + }, + } + + let mut backer_idx_and_attestation = + Vec::<(ValidatorIndex, ValidityAttestation)>::with_capacity( + validator_indices.count_ones(), ); - >::insert(¶_id, commitments); + + for ((bit_idx, _), attestation) in validator_indices + .iter() + .enumerate() + .filter(|(_, signed)| **signed) + .zip(backed_candidate.validity_votes().iter().cloned()) + { + let val_idx = group_vals.get(bit_idx).expect("this query succeeded above; qed"); + backer_idx_and_attestation.push((*val_idx, attestation)); + + backers.set(val_idx.0 as _, true); } - Ok(ProcessedCandidates:: { - core_indices, - candidate_receipt_with_backing_validator_indices, - }) + Ok((backers, backer_idx_and_attestation)) } /// Run the acceptance criteria checks on the given candidate commitments. @@ -821,7 +773,7 @@ impl Pallet { relay_parent_number: BlockNumberFor, validation_outputs: primitives::CandidateCommitments, ) -> bool { - let prev_context = >::para_most_recent_context(para_id); + let prev_context = paras::MostRecentContext::::get(para_id); let check_ctx = CandidateCheckContext::::new(prev_context); if check_ctx @@ -858,7 +810,7 @@ impl Pallet { ) -> Weight { let plain = receipt.to_plain(); let commitments = receipt.commitments; - let config = >::config(); + let config = configuration::ActiveConfig::::get(); T::RewardValidators::reward_backing( backers @@ -880,19 +832,19 @@ impl Pallet { let mut weight = T::DbWeight::get().reads_writes(1, 0); if let Some(new_code) = commitments.new_validation_code { // Block number of candidate's inclusion. - let now = >::block_number(); + let now = frame_system::Pallet::::block_number(); - weight.saturating_add(>::schedule_code_upgrade( + weight.saturating_add(paras::Pallet::::schedule_code_upgrade( receipt.descriptor.para_id, new_code, now, &config, - SetGoAhead::Yes, + UpgradeStrategy::SetGoAheadSignal, )); } // enact the messaging facet of the candidate. - weight.saturating_accrue(>::prune_dmq( + weight.saturating_accrue(dmp::Pallet::::prune_dmq( receipt.descriptor.para_id, commitments.processed_downward_messages, )); @@ -900,11 +852,11 @@ impl Pallet { receipt.descriptor.para_id, commitments.upward_messages.as_slice(), )); - weight.saturating_accrue(>::prune_hrmp( + weight.saturating_accrue(hrmp::Pallet::::prune_hrmp( receipt.descriptor.para_id, BlockNumberFor::::from(commitments.hrmp_watermark), )); - weight.saturating_accrue(>::queue_outbound_hrmp( + weight.saturating_accrue(hrmp::Pallet::::queue_outbound_hrmp( receipt.descriptor.para_id, commitments.horizontal_messages, )); @@ -916,7 +868,7 @@ impl Pallet { backing_group, )); - weight.saturating_add(>::note_new_head( + weight.saturating_add(paras::Pallet::::note_new_head( receipt.descriptor.para_id, commitments.head_data, relay_parent_number, @@ -935,7 +887,7 @@ impl Pallet { upward_messages: &[UpwardMessage], ) -> Result<(), UmpAcceptanceCheckErr> { // Cannot send UMP messages while off-boarding. - if >::is_offboarding(para) { + if paras::Pallet::::is_offboarding(para) { ensure!(upward_messages.is_empty(), UmpAcceptanceCheckErr::IsOffboarding); } @@ -1019,110 +971,155 @@ impl Pallet { weight } - /// Cleans up all paras pending availability that the predicate returns true for. - /// - /// The predicate accepts the index of the core and the block number the core has been occupied - /// since (i.e. the block number the candidate was backed at in this fork of the relay chain). + /// Cleans up all timed out candidates as well as their descendant candidates. /// /// Returns a vector of cleaned-up core IDs. - pub(crate) fn collect_pending( - pred: impl Fn(BlockNumberFor) -> AvailabilityTimeoutStatus>, - ) -> Vec { - let mut cleaned_up_ids = Vec::new(); - let mut cleaned_up_cores = Vec::new(); - - for (para_id, pending_record) in >::iter() { - if pred(pending_record.backed_in_number).timed_out { - cleaned_up_ids.push(para_id); - cleaned_up_cores.push(pending_record.core); - } - } - - for para_id in cleaned_up_ids { - let pending = >::take(¶_id); - let commitments = >::take(¶_id); - - if let (Some(pending), Some(commitments)) = (pending, commitments) { - // defensive: this should always be true. - let candidate = CandidateReceipt { - descriptor: pending.descriptor, - commitments_hash: commitments.hash(), - }; + pub(crate) fn free_timedout() -> Vec { + let timeout_pred = scheduler::Pallet::::availability_timeout_predicate(); + + let timed_out: Vec<_> = Self::free_failed_cores( + |candidate| timeout_pred(candidate.backed_in_number).timed_out, + None, + ) + .collect(); + + let mut timed_out_cores = Vec::with_capacity(timed_out.len()); + for candidate in timed_out.iter() { + timed_out_cores.push(candidate.core); + + let receipt = CandidateReceipt { + descriptor: candidate.descriptor.clone(), + commitments_hash: candidate.commitments.hash(), + }; - Self::deposit_event(Event::::CandidateTimedOut( - candidate, - commitments.head_data, - pending.core, - )); - } + Self::deposit_event(Event::::CandidateTimedOut( + receipt, + candidate.commitments.head_data.clone(), + candidate.core, + )); } - cleaned_up_cores + timed_out_cores } - /// Cleans up all paras pending availability that are in the given list of disputed candidates. + /// Cleans up all cores pending availability occupied by one of the disputed candidates or which + /// are descendants of a disputed candidate. /// - /// Returns a vector of cleaned-up core IDs. - pub(crate) fn collect_disputed(disputed: &BTreeSet) -> Vec { - let mut cleaned_up_ids = Vec::new(); - let mut cleaned_up_cores = Vec::new(); - - for (para_id, pending_record) in >::iter() { - if disputed.contains(&pending_record.hash) { - cleaned_up_ids.push(para_id); - cleaned_up_cores.push(pending_record.core); + /// Returns a vector of cleaned-up core IDs, along with the evicted candidate hashes. + pub(crate) fn free_disputed( + disputed: &BTreeSet, + ) -> Vec<(CoreIndex, CandidateHash)> { + Self::free_failed_cores( + |candidate| disputed.contains(&candidate.hash), + Some(disputed.len()), + ) + .map(|candidate| (candidate.core, candidate.hash)) + .collect() + } + + // Clean up cores whose candidates are deemed as failed by the predicate. `pred` returns true if + // a candidate is considered failed. + // A failed candidate also frees all subsequent cores which hold descendants of said candidate. + fn free_failed_cores< + P: Fn(&CandidatePendingAvailability>) -> bool, + >( + pred: P, + capacity_hint: Option, + ) -> impl Iterator>> { + let mut earliest_dropped_indices: BTreeMap = BTreeMap::new(); + + for (para_id, pending_candidates) in PendingAvailability::::iter() { + // We assume that pending candidates are stored in dependency order. So we need to store + // the earliest dropped candidate. All others that follow will get freed as well. + let mut earliest_dropped_idx = None; + for (index, candidate) in pending_candidates.iter().enumerate() { + if pred(candidate) { + earliest_dropped_idx = Some(index); + // Since we're looping the candidates in dependency order, we've found the + // earliest failed index for this paraid. + break; + } + } + + if let Some(earliest_dropped_idx) = earliest_dropped_idx { + earliest_dropped_indices.insert(para_id, earliest_dropped_idx); } } - for para_id in cleaned_up_ids { - let _ = >::take(¶_id); - let _ = >::take(¶_id); + let mut cleaned_up_cores = + if let Some(capacity) = capacity_hint { Vec::with_capacity(capacity) } else { vec![] }; + + for (para_id, earliest_dropped_idx) in earliest_dropped_indices { + // Do cleanups and record the cleaned up cores + PendingAvailability::::mutate(¶_id, |record| { + if let Some(record) = record { + let cleaned_up = record.drain(earliest_dropped_idx..); + cleaned_up_cores.extend(cleaned_up); + } + }); } - cleaned_up_cores + cleaned_up_cores.into_iter() } - /// Forcibly enact the candidate with the given ID as though it had been deemed available - /// by bitfields. + /// Forcibly enact the pending candidates of the given paraid as though they had been deemed + /// available by bitfields. /// /// Is a no-op if there is no candidate pending availability for this para-id. - /// This should generally not be used but it is useful during execution of Runtime APIs, + /// If there are multiple candidates pending availability for this para-id, it will enact all of + /// them. This should generally not be used but it is useful during execution of Runtime APIs, /// where the changes to the state are expected to be discarded directly after. pub(crate) fn force_enact(para: ParaId) { - let pending = >::take(¶); - let commitments = >::take(¶); - - if let (Some(pending), Some(commitments)) = (pending, commitments) { - let candidate = - CommittedCandidateReceipt { descriptor: pending.descriptor, commitments }; - - Self::enact_candidate( - pending.relay_parent_number, - candidate, - pending.backers, - pending.availability_votes, - pending.core, - pending.backing_group, - ); - } + PendingAvailability::::mutate(¶, |candidates| { + if let Some(candidates) = candidates { + for candidate in candidates.drain(..) { + let receipt = CommittedCandidateReceipt { + descriptor: candidate.descriptor, + commitments: candidate.commitments, + }; + + Self::enact_candidate( + candidate.relay_parent_number, + receipt, + candidate.backers, + candidate.availability_votes, + candidate.core, + candidate.backing_group, + ); + } + } + }); } - /// Returns the `CommittedCandidateReceipt` pending availability for the para provided, if any. + /// Returns the first `CommittedCandidateReceipt` pending availability for the para provided, if + /// any. pub(crate) fn candidate_pending_availability( para: ParaId, ) -> Option> { - >::get(¶) - .map(|p| p.descriptor) - .and_then(|d| >::get(¶).map(move |c| (d, c))) - .map(|(d, c)| CommittedCandidateReceipt { descriptor: d, commitments: c }) + PendingAvailability::::get(¶).and_then(|p| { + p.get(0).map(|p| CommittedCandidateReceipt { + descriptor: p.descriptor.clone(), + commitments: p.commitments.clone(), + }) + }) } - /// Returns the metadata around the candidate pending availability for the + /// Returns the metadata around the first candidate pending availability for the /// para provided, if any. pub(crate) fn pending_availability( para: ParaId, ) -> Option>> { - >::get(¶) + PendingAvailability::::get(¶).and_then(|p| p.get(0).cloned()) + } + + /// Returns the metadata around the candidate pending availability occupying the supplied core, + /// if any. + pub(crate) fn pending_availability_with_core( + para: ParaId, + core: CoreIndex, + ) -> Option>> { + PendingAvailability::::get(¶) + .and_then(|p| p.iter().find(|c| c.core == core).cloned()) } } @@ -1159,7 +1156,7 @@ impl OnQueueChanged for Pallet { #[allow(deprecated)] well_known_keys::relay_dispatch_queue_size_typed(para).set((count, size)); - let config = >::config(); + let config = configuration::ActiveConfig::::get(); let remaining_count = config.max_upward_queue_count.saturating_sub(count); let remaining_size = config.max_upward_queue_size.saturating_sub(size); well_known_keys::relay_dispatch_queue_remaining_capacity(para) @@ -1173,13 +1170,9 @@ pub(crate) struct CandidateCheckContext { prev_context: Option>, } -/// An error indicating that creating Persisted Validation Data failed -/// while checking a candidate's validity. -pub(crate) struct FailedToCreatePVD; - impl CandidateCheckContext { pub(crate) fn new(prev_context: Option>) -> Self { - Self { config: >::config(), prev_context } + Self { config: configuration::ActiveConfig::::get(), prev_context } } /// Execute verification of the candidate. @@ -1194,11 +1187,11 @@ impl CandidateCheckContext { pub(crate) fn verify_backed_candidate( &self, allowed_relay_parents: &AllowedRelayParentsTracker>, - candidate_idx: usize, - backed_candidate: &BackedCandidate<::Hash>, - ) -> Result, FailedToCreatePVD>, Error> { - let para_id = backed_candidate.descriptor().para_id; - let relay_parent = backed_candidate.descriptor().relay_parent; + backed_candidate_receipt: &CommittedCandidateReceipt<::Hash>, + parent_head_data: HeadData, + ) -> Result, Error> { + let para_id = backed_candidate_receipt.descriptor().para_id; + let relay_parent = backed_candidate_receipt.descriptor().relay_parent; // Check that the relay-parent is one of the allowed relay-parents. let (relay_parent_storage_root, relay_parent_number) = { @@ -1209,63 +1202,58 @@ impl CandidateCheckContext { }; { - let persisted_validation_data = match crate::util::make_persisted_validation_data::( - para_id, + let persisted_validation_data = make_persisted_validation_data_with_parent::( relay_parent_number, relay_parent_storage_root, - ) - .defensive_proof("the para is registered") - { - Some(l) => l, - None => return Ok(Err(FailedToCreatePVD)), - }; + parent_head_data, + ); let expected = persisted_validation_data.hash(); ensure!( - expected == backed_candidate.descriptor().persisted_validation_data_hash, + expected == backed_candidate_receipt.descriptor().persisted_validation_data_hash, Error::::ValidationDataHashMismatch, ); } ensure!( - backed_candidate.descriptor().check_collator_signature().is_ok(), + backed_candidate_receipt.descriptor().check_collator_signature().is_ok(), Error::::NotCollatorSigned, ); - let validation_code_hash = >::current_code_hash(para_id) + let validation_code_hash = paras::CurrentCodeHash::::get(para_id) // A candidate for a parachain without current validation code is not scheduled. .ok_or_else(|| Error::::UnscheduledCandidate)?; ensure!( - backed_candidate.descriptor().validation_code_hash == validation_code_hash, + backed_candidate_receipt.descriptor().validation_code_hash == validation_code_hash, Error::::InvalidValidationCodeHash, ); ensure!( - backed_candidate.descriptor().para_head == - backed_candidate.candidate.commitments.head_data.hash(), + backed_candidate_receipt.descriptor().para_head == + backed_candidate_receipt.commitments.head_data.hash(), Error::::ParaHeadMismatch, ); if let Err(err) = self.check_validation_outputs( para_id, relay_parent_number, - &backed_candidate.candidate.commitments.head_data, - &backed_candidate.candidate.commitments.new_validation_code, - backed_candidate.candidate.commitments.processed_downward_messages, - &backed_candidate.candidate.commitments.upward_messages, - BlockNumberFor::::from(backed_candidate.candidate.commitments.hrmp_watermark), - &backed_candidate.candidate.commitments.horizontal_messages, + &backed_candidate_receipt.commitments.head_data, + &backed_candidate_receipt.commitments.new_validation_code, + backed_candidate_receipt.commitments.processed_downward_messages, + &backed_candidate_receipt.commitments.upward_messages, + BlockNumberFor::::from(backed_candidate_receipt.commitments.hrmp_watermark), + &backed_candidate_receipt.commitments.horizontal_messages, ) { log::debug!( target: LOG_TARGET, - "Validation outputs checking during inclusion of a candidate {} for parachain `{}` failed", - candidate_idx, + "Validation outputs checking during inclusion of a candidate {:?} for parachain `{}` failed", + backed_candidate_receipt.hash(), u32::from(para_id), ); Err(err.strip_into_dispatch_err::())?; }; - Ok(Ok(relay_parent_number)) + Ok(relay_parent_number) } /// Check the given outputs after candidate validation on whether it passes the acceptance @@ -1303,7 +1291,7 @@ impl CandidateCheckContext { // if any, the code upgrade attempt is allowed. if let Some(new_validation_code) = new_validation_code { ensure!( - >::can_upgrade_validation_code(para_id), + paras::Pallet::::can_upgrade_validation_code(para_id), AcceptanceCheckErr::PrematureCodeUpgrade, ); ensure!( @@ -1313,14 +1301,14 @@ impl CandidateCheckContext { } // check if the candidate passes the messaging acceptance criteria - >::check_processed_downward_messages( + dmp::Pallet::::check_processed_downward_messages( para_id, relay_parent_number, processed_downward_messages, )?; Pallet::::check_upward_messages(&self.config, para_id, upward_messages)?; - >::check_hrmp_watermark(para_id, relay_parent_number, hrmp_watermark)?; - >::check_outbound_hrmp(&self.config, para_id, horizontal_messages)?; + hrmp::Pallet::::check_hrmp_watermark(para_id, relay_parent_number, hrmp_watermark)?; + hrmp::Pallet::::check_outbound_hrmp(&self.config, para_id, horizontal_messages)?; Ok(()) } diff --git a/polkadot/runtime/parachains/src/inclusion/tests.rs b/polkadot/runtime/parachains/src/inclusion/tests.rs index 232e65d78ed2aef86aa7903d88cbe99236ba9ec1..c19bc6eb7bfc7eb8fcc13ad7de640990beeb4e40 100644 --- a/polkadot/runtime/parachains/src/inclusion/tests.rs +++ b/polkadot/runtime/parachains/src/inclusion/tests.rs @@ -19,15 +19,14 @@ use crate::{ configuration::HostConfiguration, initializer::SessionChangeNotification, mock::{ - new_test_ext, Configuration, MockGenesisConfig, ParaInclusion, Paras, ParasShared, - Scheduler, System, Test, + new_test_ext, MockGenesisConfig, ParaInclusion, Paras, ParasShared, Scheduler, System, Test, }, paras::{ParaGenesisArgs, ParaKind}, paras_inherent::DisputedBitfield, shared::AllowedRelayParentsTracker, }; use primitives::{ - effective_minimum_backing_votes, SignedAvailabilityBitfields, + effective_minimum_backing_votes, AvailabilityBitfield, SignedAvailabilityBitfields, UncheckedSignedAvailabilityBitfields, }; @@ -47,10 +46,10 @@ use test_helpers::{dummy_collator, dummy_collator_signature, dummy_validation_co fn default_config() -> HostConfiguration { let mut config = HostConfiguration::default(); - config.coretime_cores = 1; + config.scheduler_params.num_cores = 1; config.max_code_size = 0b100000; config.max_head_data_size = 0b100000; - config.group_rotation_frequency = u32::MAX; + config.scheduler_params.group_rotation_frequency = u32::MAX; config } @@ -120,11 +119,12 @@ pub(crate) fn back_candidate( keystore: &KeystorePtr, signing_context: &SigningContext, kind: BackingKind, + core_index: Option, ) -> BackedCandidate { let mut validator_indices = bitvec::bitvec![u8, BitOrderLsb0; 0; group.len()]; let threshold = effective_minimum_backing_votes( group.len(), - configuration::Pallet::::config().minimum_backing_votes, + configuration::ActiveConfig::::get().minimum_backing_votes, ); let signing = match kind { @@ -155,15 +155,20 @@ pub(crate) fn back_candidate( validity_votes.push(ValidityAttestation::Explicit(signature).into()); } - let backed = BackedCandidate { candidate, validity_votes, validator_indices }; + let backed = + BackedCandidate::new(candidate, validity_votes, validator_indices.clone(), core_index); - let successfully_backed = - primitives::check_candidate_backing(&backed, signing_context, group.len(), |i| { - Some(validators[group[i].0 as usize].public().into()) - }) - .ok() - .unwrap_or(0) >= - threshold; + let successfully_backed = primitives::check_candidate_backing( + backed.candidate().hash(), + backed.validity_votes(), + validator_indices.as_bitslice(), + signing_context, + group.len(), + |i| Some(validators[group[i].0 as usize].public().into()), + ) + .ok() + .unwrap_or(0) >= + threshold; match kind { BackingKind::Unanimous | BackingKind::Threshold => assert!(successfully_backed), @@ -176,9 +181,9 @@ pub(crate) fn back_candidate( pub(crate) fn run_to_block_default_notifications(to: BlockNumber, new_session: Vec) { run_to_block(to, |b| { new_session.contains(&b).then_some(SessionChangeNotification { - prev_config: Configuration::config(), - new_config: Configuration::config(), - session_index: ParasShared::session_index() + 1, + prev_config: configuration::ActiveConfig::::get(), + new_config: configuration::ActiveConfig::::get(), + session_index: shared::CurrentSessionIndex::::get() + 1, ..Default::default() }) }); @@ -218,7 +223,8 @@ pub(crate) fn run_to_block( } pub(crate) fn expected_bits() -> usize { - Paras::parachains().len() + Configuration::config().coretime_cores as usize + paras::Parachains::::get().len() + + configuration::ActiveConfig::::get().scheduler_params.num_cores as usize } fn default_bitfield() -> AvailabilityBitfield { @@ -226,11 +232,11 @@ fn default_bitfield() -> AvailabilityBitfield { } fn default_availability_votes() -> BitVec { - bitvec::bitvec![u8, BitOrderLsb0; 0; ParasShared::active_validator_keys().len()] + bitvec::bitvec![u8, BitOrderLsb0; 0; shared::ActiveValidatorKeys::::get().len()] } fn default_backing_bitfield() -> BitVec { - bitvec::bitvec![u8, BitOrderLsb0; 0; ParasShared::active_validator_keys().len()] + bitvec::bitvec![u8, BitOrderLsb0; 0; shared::ActiveValidatorKeys::::get().len()] } fn backing_bitfield(v: &[usize]) -> BitVec { @@ -317,7 +323,7 @@ impl TestCandidateBuilder { } pub(crate) fn make_vdata_hash(para_id: ParaId) -> Option { - let relay_parent_number = >::block_number() - 1; + let relay_parent_number = frame_system::Pallet::::block_number() - 1; make_vdata_hash_with_block_number(para_id, relay_parent_number) } @@ -340,8 +346,8 @@ fn simple_sanitize_bitfields( expected_bits: usize, ) -> SignedAvailabilityBitfields { let parent_hash = frame_system::Pallet::::parent_hash(); - let session_index = shared::Pallet::::session_index(); - let validators = shared::Pallet::::active_validator_keys(); + let session_index = shared::CurrentSessionIndex::::get(); + let validators = shared::ActiveValidatorKeys::::get(); crate::paras_inherent::sanitize_bitfields::( unchecked_bitfields, @@ -354,81 +360,288 @@ fn simple_sanitize_bitfields( } /// Process a set of already sanitized bitfields. pub(crate) fn process_bitfields( - expected_bits: usize, signed_bitfields: SignedAvailabilityBitfields, - core_lookup: impl Fn(CoreIndex) -> Option, ) -> Vec<(CoreIndex, CandidateHash)> { - let validators = shared::Pallet::::active_validator_keys(); + let validators = shared::ActiveValidatorKeys::::get(); - ParaInclusion::update_pending_availability_and_get_freed_cores::<_>( - expected_bits, + ParaInclusion::update_pending_availability_and_get_freed_cores( &validators[..], signed_bitfields, - core_lookup, ) } #[test] -fn collect_pending_cleans_up_pending() { +fn free_timedout() { let chain_a = ParaId::from(1_u32); let chain_b = ParaId::from(2_u32); - let thread_a = ParaId::from(3_u32); + let chain_c = ParaId::from(3_u32); + let chain_d = ParaId::from(4_u32); + let chain_e = ParaId::from(5_u32); + let chain_f = ParaId::from(6_u32); + let thread_a = ParaId::from(7_u32); let paras = vec![ (chain_a, ParaKind::Parachain), (chain_b, ParaKind::Parachain), + (chain_c, ParaKind::Parachain), + (chain_d, ParaKind::Parachain), + (chain_e, ParaKind::Parachain), + (chain_f, ParaKind::Parachain), (thread_a, ParaKind::Parathread), ]; let mut config = genesis_config(paras); - config.configuration.config.group_rotation_frequency = 3; + config.configuration.config.scheduler_params.group_rotation_frequency = 3; new_test_ext(config).execute_with(|| { - let default_candidate = TestCandidateBuilder::default().build(); - >::insert( - chain_a, + let timed_out_cores = ParaInclusion::free_timedout(); + assert!(timed_out_cores.is_empty()); + + let make_candidate = |core_index: u32, timed_out: bool| { + let default_candidate = TestCandidateBuilder::default().build(); + let backed_in_number = if timed_out { 0 } else { 5 }; + CandidatePendingAvailability { - core: CoreIndex::from(0), + core: CoreIndex::from(core_index), hash: default_candidate.hash(), descriptor: default_candidate.descriptor.clone(), availability_votes: default_availability_votes(), relay_parent_number: 0, - backed_in_number: 0, + backed_in_number, backers: default_backing_bitfield(), - backing_group: GroupIndex::from(0), - }, - ); - PendingAvailabilityCommitments::::insert( + backing_group: GroupIndex::from(core_index), + commitments: default_candidate.commitments.clone(), + } + }; + + PendingAvailability::::insert( chain_a, - default_candidate.commitments.clone(), + [make_candidate(0, true)].into_iter().collect::>(), ); - >::insert( + PendingAvailability::::insert( &chain_b, + [make_candidate(1, false)].into_iter().collect::>(), + ); + + // 2 chained candidates. The first one is timed out. The other will be evicted also. + let mut c_candidates = VecDeque::new(); + c_candidates.push_back(make_candidate(2, true)); + c_candidates.push_back(make_candidate(3, false)); + + PendingAvailability::::insert(&chain_c, c_candidates); + + // 2 chained candidates. All are timed out. + let mut d_candidates = VecDeque::new(); + d_candidates.push_back(make_candidate(4, true)); + d_candidates.push_back(make_candidate(5, true)); + + PendingAvailability::::insert(&chain_d, d_candidates); + + // 3 chained candidates. The second one is timed out. The first one will remain in place. + // With the current time out predicate this scenario is impossible. But this is not a + // concern for this module. + let mut e_candidates = VecDeque::new(); + e_candidates.push_back(make_candidate(6, false)); + e_candidates.push_back(make_candidate(7, true)); + e_candidates.push_back(make_candidate(8, false)); + + PendingAvailability::::insert(&chain_e, e_candidates); + + // 3 chained candidates, none are timed out. + let mut f_candidates = VecDeque::new(); + f_candidates.push_back(make_candidate(9, false)); + f_candidates.push_back(make_candidate(10, false)); + f_candidates.push_back(make_candidate(11, false)); + + PendingAvailability::::insert(&chain_f, f_candidates); + + run_to_block(5, |_| None); + + assert_eq!(PendingAvailability::::get(&chain_a).unwrap().len(), 1); + assert_eq!(PendingAvailability::::get(&chain_b).unwrap().len(), 1); + assert_eq!(PendingAvailability::::get(&chain_c).unwrap().len(), 2); + assert_eq!(PendingAvailability::::get(&chain_d).unwrap().len(), 2); + assert_eq!(PendingAvailability::::get(&chain_e).unwrap().len(), 3); + assert_eq!(PendingAvailability::::get(&chain_f).unwrap().len(), 3); + + let timed_out_cores = ParaInclusion::free_timedout(); + + assert_eq!( + timed_out_cores, + vec![ + CoreIndex(0), + CoreIndex(2), + CoreIndex(3), + CoreIndex(4), + CoreIndex(5), + CoreIndex(7), + CoreIndex(8), + ] + ); + + assert!(PendingAvailability::::get(&chain_a).unwrap().is_empty()); + assert_eq!(PendingAvailability::::get(&chain_b).unwrap().len(), 1); + assert!(PendingAvailability::::get(&chain_c).unwrap().is_empty()); + assert!(PendingAvailability::::get(&chain_d).unwrap().is_empty()); + assert_eq!( + PendingAvailability::::get(&chain_e) + .unwrap() + .into_iter() + .map(|c| c.core) + .collect::>(), + vec![CoreIndex(6)] + ); + assert_eq!( + PendingAvailability::::get(&chain_f) + .unwrap() + .into_iter() + .map(|c| c.core) + .collect::>(), + vec![CoreIndex(9), CoreIndex(10), CoreIndex(11)] + ); + }); +} + +#[test] +fn free_disputed() { + let chain_a = ParaId::from(1_u32); + let chain_b = ParaId::from(2_u32); + let chain_c = ParaId::from(3_u32); + let chain_d = ParaId::from(4_u32); + let chain_e = ParaId::from(5_u32); + let chain_f = ParaId::from(6_u32); + let thread_a = ParaId::from(7_u32); + + let paras = vec![ + (chain_a, ParaKind::Parachain), + (chain_b, ParaKind::Parachain), + (chain_c, ParaKind::Parachain), + (chain_d, ParaKind::Parachain), + (chain_e, ParaKind::Parachain), + (chain_f, ParaKind::Parachain), + (thread_a, ParaKind::Parathread), + ]; + let mut config = genesis_config(paras); + config.configuration.config.scheduler_params.group_rotation_frequency = 3; + new_test_ext(config).execute_with(|| { + let disputed_cores = ParaInclusion::free_disputed(&BTreeSet::new()); + assert!(disputed_cores.is_empty()); + + let disputed_cores = ParaInclusion::free_disputed( + &[CandidateHash::default()].into_iter().collect::>(), + ); + assert!(disputed_cores.is_empty()); + + let make_candidate = |core_index: u32| { + let default_candidate = TestCandidateBuilder::default().build(); + CandidatePendingAvailability { - core: CoreIndex::from(1), - hash: default_candidate.hash(), - descriptor: default_candidate.descriptor, + core: CoreIndex::from(core_index), + hash: CandidateHash(Hash::from_low_u64_be(core_index as _)), + descriptor: default_candidate.descriptor.clone(), availability_votes: default_availability_votes(), relay_parent_number: 0, - backed_in_number: 5, + backed_in_number: 0, backers: default_backing_bitfield(), - backing_group: GroupIndex::from(1), - }, + backing_group: GroupIndex::from(core_index), + commitments: default_candidate.commitments.clone(), + } + }; + + // Disputed + PendingAvailability::::insert( + chain_a, + [make_candidate(0)].into_iter().collect::>(), ); - PendingAvailabilityCommitments::::insert(chain_b, default_candidate.commitments); + + // Not disputed. + PendingAvailability::::insert( + &chain_b, + [make_candidate(1)].into_iter().collect::>(), + ); + + // 2 chained candidates. The first one is disputed. The other will be evicted also. + let mut c_candidates = VecDeque::new(); + c_candidates.push_back(make_candidate(2)); + c_candidates.push_back(make_candidate(3)); + + PendingAvailability::::insert(&chain_c, c_candidates); + + // 2 chained candidates. All are disputed. + let mut d_candidates = VecDeque::new(); + d_candidates.push_back(make_candidate(4)); + d_candidates.push_back(make_candidate(5)); + + PendingAvailability::::insert(&chain_d, d_candidates); + + // 3 chained candidates. The second one is disputed. The first one will remain in place. + let mut e_candidates = VecDeque::new(); + e_candidates.push_back(make_candidate(6)); + e_candidates.push_back(make_candidate(7)); + e_candidates.push_back(make_candidate(8)); + + PendingAvailability::::insert(&chain_e, e_candidates); + + // 3 chained candidates, none are disputed. + let mut f_candidates = VecDeque::new(); + f_candidates.push_back(make_candidate(9)); + f_candidates.push_back(make_candidate(10)); + f_candidates.push_back(make_candidate(11)); + + PendingAvailability::::insert(&chain_f, f_candidates); run_to_block(5, |_| None); - assert!(>::get(&chain_a).is_some()); - assert!(>::get(&chain_b).is_some()); - assert!(>::get(&chain_a).is_some()); - assert!(>::get(&chain_b).is_some()); + assert_eq!(PendingAvailability::::get(&chain_a).unwrap().len(), 1); + assert_eq!(PendingAvailability::::get(&chain_b).unwrap().len(), 1); + assert_eq!(PendingAvailability::::get(&chain_c).unwrap().len(), 2); + assert_eq!(PendingAvailability::::get(&chain_d).unwrap().len(), 2); + assert_eq!(PendingAvailability::::get(&chain_e).unwrap().len(), 3); + assert_eq!(PendingAvailability::::get(&chain_f).unwrap().len(), 3); + + let disputed_candidates = [ + CandidateHash(Hash::from_low_u64_be(0)), + CandidateHash(Hash::from_low_u64_be(2)), + CandidateHash(Hash::from_low_u64_be(4)), + CandidateHash(Hash::from_low_u64_be(5)), + CandidateHash(Hash::from_low_u64_be(7)), + ] + .into_iter() + .collect::>(); + let disputed_cores = ParaInclusion::free_disputed(&disputed_candidates); - ParaInclusion::collect_pending(Scheduler::availability_timeout_predicate()); + assert_eq!( + disputed_cores.into_iter().map(|(core, _)| core).collect::>(), + vec![ + CoreIndex(0), + CoreIndex(2), + CoreIndex(3), + CoreIndex(4), + CoreIndex(5), + CoreIndex(7), + CoreIndex(8), + ] + ); - assert!(>::get(&chain_a).is_none()); - assert!(>::get(&chain_b).is_some()); - assert!(>::get(&chain_a).is_none()); - assert!(>::get(&chain_b).is_some()); + assert!(PendingAvailability::::get(&chain_a).unwrap().is_empty()); + assert_eq!(PendingAvailability::::get(&chain_b).unwrap().len(), 1); + assert!(PendingAvailability::::get(&chain_c).unwrap().is_empty()); + assert!(PendingAvailability::::get(&chain_d).unwrap().is_empty()); + assert_eq!( + PendingAvailability::::get(&chain_e) + .unwrap() + .into_iter() + .map(|c| c.core) + .collect::>(), + vec![CoreIndex(6)] + ); + assert_eq!( + PendingAvailability::::get(&chain_f) + .unwrap() + .into_iter() + .map(|c| c.core) + .collect::>(), + vec![CoreIndex(9), CoreIndex(10), CoreIndex(11)] + ); }); } @@ -468,14 +681,6 @@ fn bitfield_checks() { let signing_context = SigningContext { parent_hash: System::parent_hash(), session_index: 5 }; - let core_lookup = |core| match core { - core if core == CoreIndex::from(0) => Some(chain_a), - core if core == CoreIndex::from(1) => Some(chain_b), - core if core == CoreIndex::from(2) => Some(thread_a), - core if core == CoreIndex::from(3) => None, // for the expected_cores() + 1 test below. - _ => panic!("out of bounds for testing"), - }; - // too many bits in bitfield { let mut bare_bitfield = default_bitfield(); @@ -544,7 +749,7 @@ fn bitfield_checks() { ); assert_eq!(checked_bitfields.len(), 1, "No bitfields should have been filtered!"); - let x = process_bitfields(expected_bits(), checked_bitfields, core_lookup); + let x = process_bitfields(checked_bitfields); assert!(x.is_empty(), "No core should be freed."); } @@ -565,7 +770,7 @@ fn bitfield_checks() { ); assert_eq!(checked_bitfields.len(), 1, "No bitfields should have been filtered!"); - let x = process_bitfields(expected_bits(), checked_bitfields, core_lookup); + let x = process_bitfields(checked_bitfields); assert!(x.is_empty(), "No core should be freed."); } @@ -573,12 +778,10 @@ fn bitfield_checks() { { let mut bare_bitfield = default_bitfield(); - assert_eq!(core_lookup(CoreIndex::from(0)), Some(chain_a)); - let default_candidate = TestCandidateBuilder::default().build(); - >::insert( + PendingAvailability::::insert( chain_a, - CandidatePendingAvailability { + [CandidatePendingAvailability { core: CoreIndex::from(0), hash: default_candidate.hash(), descriptor: default_candidate.descriptor, @@ -587,9 +790,11 @@ fn bitfield_checks() { backed_in_number: 0, backers: default_backing_bitfield(), backing_group: GroupIndex::from(0), - }, + commitments: default_candidate.commitments, + }] + .into_iter() + .collect::>(), ); - PendingAvailabilityCommitments::::insert(chain_a, default_candidate.commitments); *bare_bitfield.0.get_mut(0).unwrap() = true; let signed = sign_bitfield( @@ -607,53 +812,10 @@ fn bitfield_checks() { ); assert_eq!(checked_bitfields.len(), 1, "No bitfields should have been filtered!"); - let x = process_bitfields(expected_bits(), checked_bitfields, core_lookup); + let x = process_bitfields(checked_bitfields); assert!(x.is_empty(), "No core should be freed."); - >::remove(chain_a); - PendingAvailabilityCommitments::::remove(chain_a); - } - - // bitfield signed with pending bit signed, but no commitments. - { - let mut bare_bitfield = default_bitfield(); - - assert_eq!(core_lookup(CoreIndex::from(0)), Some(chain_a)); - - let default_candidate = TestCandidateBuilder::default().build(); - >::insert( - chain_a, - CandidatePendingAvailability { - core: CoreIndex::from(0), - hash: default_candidate.hash(), - descriptor: default_candidate.descriptor, - availability_votes: default_availability_votes(), - relay_parent_number: 0, - backed_in_number: 0, - backers: default_backing_bitfield(), - backing_group: GroupIndex::from(0), - }, - ); - - *bare_bitfield.0.get_mut(0).unwrap() = true; - let signed = sign_bitfield( - &keystore, - &validators[0], - ValidatorIndex(0), - bare_bitfield, - &signing_context, - ); - - let checked_bitfields = simple_sanitize_bitfields( - vec![signed.into()], - DisputedBitfield::zeros(expected_bits()), - expected_bits(), - ); - assert_eq!(checked_bitfields.len(), 1, "No bitfields should have been filtered!"); - - let x = process_bitfields(expected_bits(), checked_bitfields, core_lookup); - // no core is freed - assert!(x.is_empty(), "No core should be freed."); + PendingAvailability::::remove(chain_a); } }); } @@ -667,13 +829,17 @@ fn availability_threshold_is_supermajority() { #[test] fn supermajority_bitfields_trigger_availability() { - let chain_a = ParaId::from(1_u32); - let chain_b = ParaId::from(2_u32); - let thread_a = ParaId::from(3_u32); + let chain_a = ParaId::from(0_u32); + let chain_b = ParaId::from(1_u32); + let chain_c = ParaId::from(2_u32); + let chain_d = ParaId::from(3_u32); + let thread_a = ParaId::from(4_u32); let paras = vec![ (chain_a, ParaKind::Parachain), (chain_b, ParaKind::Parachain), + (chain_c, ParaKind::Parachain), + (chain_d, ParaKind::Parachain), (thread_a, ParaKind::Parathread), ]; let validators = vec![ @@ -682,6 +848,8 @@ fn supermajority_bitfields_trigger_availability() { Sr25519Keyring::Charlie, Sr25519Keyring::Dave, Sr25519Keyring::Ferdie, + Sr25519Keyring::One, + Sr25519Keyring::Two, ]; let keystore: KeystorePtr = Arc::new(LocalKeystore::in_memory()); for validator in validators.iter() { @@ -701,13 +869,7 @@ fn supermajority_bitfields_trigger_availability() { let signing_context = SigningContext { parent_hash: System::parent_hash(), session_index: 5 }; - let core_lookup = |core| match core { - core if core == CoreIndex::from(0) => Some(chain_a), - core if core == CoreIndex::from(1) => Some(chain_b), - core if core == CoreIndex::from(2) => Some(thread_a), - _ => panic!("Core out of bounds for 2 parachains and 1 parathread core."), - }; - + // Chain A only has one candidate pending availability. It will be made available now. let candidate_a = TestCandidateBuilder { para_id: chain_a, head_data: vec![1, 2, 3, 4].into(), @@ -715,9 +877,9 @@ fn supermajority_bitfields_trigger_availability() { } .build(); - >::insert( + PendingAvailability::::insert( chain_a, - CandidatePendingAvailability { + [CandidatePendingAvailability { core: CoreIndex::from(0), hash: candidate_a.hash(), descriptor: candidate_a.clone().descriptor, @@ -726,10 +888,13 @@ fn supermajority_bitfields_trigger_availability() { backed_in_number: 0, backers: backing_bitfield(&[3, 4]), backing_group: GroupIndex::from(0), - }, + commitments: candidate_a.clone().commitments, + }] + .into_iter() + .collect::>(), ); - PendingAvailabilityCommitments::::insert(chain_a, candidate_a.clone().commitments); + // Chain B only has one candidate pending availability. It won't be made available now. let candidate_b = TestCandidateBuilder { para_id: chain_b, head_data: vec![5, 6, 7, 8].into(), @@ -737,9 +902,9 @@ fn supermajority_bitfields_trigger_availability() { } .build(); - >::insert( + PendingAvailability::::insert( chain_b, - CandidatePendingAvailability { + [CandidatePendingAvailability { core: CoreIndex::from(1), hash: candidate_b.hash(), descriptor: candidate_b.descriptor, @@ -748,40 +913,99 @@ fn supermajority_bitfields_trigger_availability() { backed_in_number: 0, backers: backing_bitfield(&[0, 2]), backing_group: GroupIndex::from(1), - }, + commitments: candidate_b.commitments, + }] + .into_iter() + .collect::>(), ); - PendingAvailabilityCommitments::::insert(chain_b, candidate_b.commitments); - // this bitfield signals that a and b are available. - let a_and_b_available = { - let mut bare_bitfield = default_bitfield(); - *bare_bitfield.0.get_mut(0).unwrap() = true; - *bare_bitfield.0.get_mut(1).unwrap() = true; + // Chain C has three candidates pending availability. The first and third candidates will be + // made available. Only the first candidate will be evicted from the core and enacted. + let candidate_c_1 = TestCandidateBuilder { + para_id: chain_c, + head_data: vec![7, 8].into(), + ..Default::default() + } + .build(); + let candidate_c_2 = TestCandidateBuilder { + para_id: chain_c, + head_data: vec![9, 10].into(), + ..Default::default() + } + .build(); + let candidate_c_3 = TestCandidateBuilder { + para_id: chain_c, + head_data: vec![11, 12].into(), + ..Default::default() + } + .build(); - bare_bitfield - }; + let mut c_candidates = VecDeque::new(); + c_candidates.push_back(CandidatePendingAvailability { + core: CoreIndex::from(2), + hash: candidate_c_1.hash(), + descriptor: candidate_c_1.descriptor.clone(), + availability_votes: default_availability_votes(), + relay_parent_number: 0, + backed_in_number: 0, + backers: backing_bitfield(&[1]), + backing_group: GroupIndex::from(2), + commitments: candidate_c_1.commitments.clone(), + }); + c_candidates.push_back(CandidatePendingAvailability { + core: CoreIndex::from(3), + hash: candidate_c_2.hash(), + descriptor: candidate_c_2.descriptor.clone(), + availability_votes: default_availability_votes(), + relay_parent_number: 0, + backed_in_number: 0, + backers: backing_bitfield(&[5]), + backing_group: GroupIndex::from(3), + commitments: candidate_c_2.commitments.clone(), + }); + c_candidates.push_back(CandidatePendingAvailability { + core: CoreIndex::from(4), + hash: candidate_c_3.hash(), + descriptor: candidate_c_3.descriptor.clone(), + availability_votes: default_availability_votes(), + relay_parent_number: 0, + backed_in_number: 0, + backers: backing_bitfield(&[6]), + backing_group: GroupIndex::from(4), + commitments: candidate_c_3.commitments.clone(), + }); + + PendingAvailability::::insert(chain_c, c_candidates); - // this bitfield signals that only a is available. - let a_available = { + // this bitfield signals that a and b are available. + let all_available = { let mut bare_bitfield = default_bitfield(); - *bare_bitfield.0.get_mut(0).unwrap() = true; + for bit in 0..=4 { + *bare_bitfield.0.get_mut(bit).unwrap() = true; + } bare_bitfield }; let threshold = availability_threshold(validators.len()); - // 4 of 5 first value >= 2/3 - assert_eq!(threshold, 4); + // 5 of 7 first value >= 2/3 + assert_eq!(threshold, 5); let signed_bitfields = validators .iter() .enumerate() .filter_map(|(i, key)| { - let to_sign = if i < 3 { - a_and_b_available.clone() - } else if i < 4 { - a_available.clone() + let to_sign = if i < 4 { + all_available.clone() + } else if i < 5 { + // this bitfield signals that only a, c1 and c3 are available. + let mut bare_bitfield = default_bitfield(); + *bare_bitfield.0.get_mut(0).unwrap() = true; + *bare_bitfield.0.get_mut(2).unwrap() = true; + *bare_bitfield.0.get_mut(4).unwrap() = true; + + bare_bitfield } else { // sign nothing. return None @@ -808,46 +1032,129 @@ fn supermajority_bitfields_trigger_availability() { ); assert_eq!(checked_bitfields.len(), old_len, "No bitfields should have been filtered!"); - // only chain A's core is freed. - let v = process_bitfields(expected_bits(), checked_bitfields, core_lookup); - assert_eq!(vec![(CoreIndex(0), candidate_a.hash())], v); - - // chain A had 4 signing off, which is >= threshold. - // chain B has 3 signing off, which is < threshold. - assert!(>::get(&chain_a).is_none()); - assert!(>::get(&chain_a).is_none()); - assert!(>::get(&chain_b).is_some()); - assert_eq!(>::get(&chain_b).unwrap().availability_votes, { - // check that votes from first 3 were tracked. + // only chain A's core and candidate's C1 core are freed. + let v = process_bitfields(checked_bitfields); + assert_eq!( + vec![(CoreIndex(2), candidate_c_1.hash()), (CoreIndex(0), candidate_a.hash())], + v + ); + let votes = |bits: &[usize]| { let mut votes = default_availability_votes(); - *votes.get_mut(0).unwrap() = true; - *votes.get_mut(1).unwrap() = true; - *votes.get_mut(2).unwrap() = true; + for bit in bits { + *votes.get_mut(*bit).unwrap() = true; + } votes - }); + }; + + assert!(PendingAvailability::::get(&chain_a).unwrap().is_empty()); + assert_eq!( + PendingAvailability::::get(&chain_b) + .unwrap() + .pop_front() + .unwrap() + .availability_votes, + votes(&[0, 1, 2, 3]) + ); + let mut pending_c = PendingAvailability::::get(&chain_c).unwrap(); + assert_eq!(pending_c.pop_front().unwrap().availability_votes, votes(&[0, 1, 2, 3])); + assert_eq!(pending_c.pop_front().unwrap().availability_votes, votes(&[0, 1, 2, 3, 4])); + assert!(pending_c.is_empty()); - // and check that chain head was enacted. - assert_eq!(Paras::para_head(&chain_a), Some(vec![1, 2, 3, 4].into())); + // and check that chain heads. + assert_eq!(paras::Heads::::get(&chain_a), Some(vec![1, 2, 3, 4].into())); + assert_ne!(paras::Heads::::get(&chain_b), Some(vec![5, 6, 7, 8].into())); + assert_eq!(paras::Heads::::get(&chain_c), Some(vec![7, 8].into())); // Check that rewards are applied. { let rewards = crate::mock::availability_rewards(); - assert_eq!(rewards.len(), 4); - assert_eq!(rewards.get(&ValidatorIndex(0)).unwrap(), &1); - assert_eq!(rewards.get(&ValidatorIndex(1)).unwrap(), &1); - assert_eq!(rewards.get(&ValidatorIndex(2)).unwrap(), &1); + assert_eq!(rewards.len(), 5); + assert_eq!(rewards.get(&ValidatorIndex(0)).unwrap(), &2); + assert_eq!(rewards.get(&ValidatorIndex(1)).unwrap(), &2); + assert_eq!(rewards.get(&ValidatorIndex(2)).unwrap(), &2); + assert_eq!(rewards.get(&ValidatorIndex(3)).unwrap(), &2); + assert_eq!(rewards.get(&ValidatorIndex(4)).unwrap(), &2); + } + + { + let rewards = crate::mock::backing_rewards(); + + assert_eq!(rewards.len(), 3); assert_eq!(rewards.get(&ValidatorIndex(3)).unwrap(), &1); + assert_eq!(rewards.get(&ValidatorIndex(4)).unwrap(), &1); + assert_eq!(rewards.get(&ValidatorIndex(1)).unwrap(), &1); + } + + // Add a new bitfield which will make candidate C2 available also. This will also evict and + // enact C3. + let signed_bitfields = vec![sign_bitfield( + &keystore, + &validators[5], + ValidatorIndex(5), + { + let mut bare_bitfield = default_bitfield(); + *bare_bitfield.0.get_mut(3).unwrap() = true; + bare_bitfield + }, + &signing_context, + ) + .into()]; + + let old_len = signed_bitfields.len(); + let checked_bitfields = simple_sanitize_bitfields( + signed_bitfields, + DisputedBitfield::zeros(expected_bits()), + expected_bits(), + ); + assert_eq!(checked_bitfields.len(), old_len, "No bitfields should have been filtered!"); + + let v = process_bitfields(checked_bitfields); + assert_eq!( + vec![(CoreIndex(3), candidate_c_2.hash()), (CoreIndex(4), candidate_c_3.hash())], + v + ); + + assert!(PendingAvailability::::get(&chain_a).unwrap().is_empty()); + assert_eq!( + PendingAvailability::::get(&chain_b) + .unwrap() + .pop_front() + .unwrap() + .availability_votes, + votes(&[0, 1, 2, 3]) + ); + assert!(PendingAvailability::::get(&chain_c).unwrap().is_empty()); + + // and check that chain heads. + assert_eq!(paras::Heads::::get(&chain_a), Some(vec![1, 2, 3, 4].into())); + assert_ne!(paras::Heads::::get(&chain_b), Some(vec![5, 6, 7, 8].into())); + assert_eq!(paras::Heads::::get(&chain_c), Some(vec![11, 12].into())); + + // Check that rewards are applied. + { + let rewards = crate::mock::availability_rewards(); + + assert_eq!(rewards.len(), 6); + assert_eq!(rewards.get(&ValidatorIndex(0)).unwrap(), &4); + assert_eq!(rewards.get(&ValidatorIndex(1)).unwrap(), &4); + assert_eq!(rewards.get(&ValidatorIndex(2)).unwrap(), &4); + assert_eq!(rewards.get(&ValidatorIndex(3)).unwrap(), &4); + assert_eq!(rewards.get(&ValidatorIndex(4)).unwrap(), &3); + assert_eq!(rewards.get(&ValidatorIndex(5)).unwrap(), &1); } { let rewards = crate::mock::backing_rewards(); - assert_eq!(rewards.len(), 2); + assert_eq!(rewards.len(), 5); assert_eq!(rewards.get(&ValidatorIndex(3)).unwrap(), &1); assert_eq!(rewards.get(&ValidatorIndex(4)).unwrap(), &1); + assert_eq!(rewards.get(&ValidatorIndex(1)).unwrap(), &1); + assert_eq!(rewards.get(&ValidatorIndex(5)).unwrap(), &1); + assert_eq!(rewards.get(&ValidatorIndex(6)).unwrap(), &1); } }); } @@ -872,6 +1179,7 @@ fn candidate_checks() { Sr25519Keyring::Charlie, Sr25519Keyring::Dave, Sr25519Keyring::Ferdie, + Sr25519Keyring::One, ]; let keystore: KeystorePtr = Arc::new(LocalKeystore::in_memory()); for validator in validators.iter() { @@ -898,7 +1206,8 @@ fn candidate_checks() { group_index if group_index == GroupIndex::from(0) => Some(vec![0, 1]), group_index if group_index == GroupIndex::from(1) => Some(vec![2, 3]), group_index if group_index == GroupIndex::from(2) => Some(vec![4]), - _ => panic!("Group index out of bounds for 2 parachains and 1 parathread core"), + group_index if group_index == GroupIndex::from(3) => Some(vec![5]), + _ => panic!("Group index out of bounds"), } .map(|m| m.into_iter().map(ValidatorIndex).collect::>()) }; @@ -908,20 +1217,31 @@ fn candidate_checks() { vec![ValidatorIndex(0), ValidatorIndex(1)], vec![ValidatorIndex(2), ValidatorIndex(3)], vec![ValidatorIndex(4)], + vec![ValidatorIndex(5)], ]; Scheduler::set_validator_groups(validator_groups); let thread_collator: CollatorId = Sr25519Keyring::Two.public().into(); let chain_a_assignment = (chain_a, CoreIndex::from(0)); - let chain_b_assignment = (chain_b, CoreIndex::from(1)); let thread_a_assignment = (thread_a, CoreIndex::from(2)); let allowed_relay_parents = default_allowed_relay_parent_tracker(); - // unscheduled candidate. + // no candidates. + assert_eq!( + ParaInclusion::process_candidates( + &allowed_relay_parents, + &BTreeMap::new(), + &group_validators, + false + ), + Ok(ProcessedCandidates::default()) + ); + + // Check candidate ordering { - let mut candidate = TestCandidateBuilder { + let mut candidate_a = TestCandidateBuilder { para_id: chain_a, relay_parent: System::parent_hash(), pov_hash: Hash::repeat_byte(1), @@ -930,52 +1250,37 @@ fn candidate_checks() { ..Default::default() } .build(); - collator_sign_candidate(Sr25519Keyring::One, &mut candidate); - - let backed = back_candidate( - candidate, - &validators, - group_validators(GroupIndex::from(0)).unwrap().as_ref(), - &keystore, - &signing_context, - BackingKind::Threshold, - ); - - assert_noop!( - ParaInclusion::process_candidates( - &allowed_relay_parents, - vec![backed], - &[chain_b_assignment].into_iter().collect(), - &group_validators, - ), - Error::::UnscheduledCandidate - ); - } - - // candidates out of order. - { - let mut candidate_a = TestCandidateBuilder { - para_id: chain_a, + let mut candidate_b_1 = TestCandidateBuilder { + para_id: chain_b, relay_parent: System::parent_hash(), - pov_hash: Hash::repeat_byte(1), - persisted_validation_data_hash: make_vdata_hash(chain_a).unwrap(), + pov_hash: Hash::repeat_byte(2), + persisted_validation_data_hash: make_vdata_hash(chain_b).unwrap(), hrmp_watermark: RELAY_PARENT_NUM, + head_data: HeadData(vec![1, 2, 3]), ..Default::default() } .build(); - let mut candidate_b = TestCandidateBuilder { + + // Make candidate b2 a child of b1. + let mut candidate_b_2 = TestCandidateBuilder { para_id: chain_b, relay_parent: System::parent_hash(), - pov_hash: Hash::repeat_byte(2), - persisted_validation_data_hash: make_vdata_hash(chain_b).unwrap(), + pov_hash: Hash::repeat_byte(3), + persisted_validation_data_hash: make_persisted_validation_data_with_parent::( + RELAY_PARENT_NUM, + Default::default(), + candidate_b_1.commitments.head_data.clone(), + ) + .hash(), hrmp_watermark: RELAY_PARENT_NUM, + head_data: HeadData(vec![5, 6, 7]), ..Default::default() } .build(); collator_sign_candidate(Sr25519Keyring::One, &mut candidate_a); - - collator_sign_candidate(Sr25519Keyring::Two, &mut candidate_b); + collator_sign_candidate(Sr25519Keyring::Two, &mut candidate_b_1); + collator_sign_candidate(Sr25519Keyring::Two, &mut candidate_b_2); let backed_a = back_candidate( candidate_a, @@ -984,26 +1289,105 @@ fn candidate_checks() { &keystore, &signing_context, BackingKind::Threshold, + None, ); - let backed_b = back_candidate( - candidate_b, + let backed_b_1 = back_candidate( + candidate_b_1.clone(), + &validators, + group_validators(GroupIndex::from(2)).unwrap().as_ref(), + &keystore, + &signing_context, + BackingKind::Threshold, + None, + ); + + let backed_b_2 = back_candidate( + candidate_b_2, &validators, group_validators(GroupIndex::from(1)).unwrap().as_ref(), &keystore, &signing_context, BackingKind::Threshold, + None, + ); + + // candidates are required to be sorted in dependency order. + assert_noop!( + ParaInclusion::process_candidates( + &allowed_relay_parents, + &vec![( + chain_b, + vec![ + (backed_b_2.clone(), CoreIndex(1)), + (backed_b_1.clone(), CoreIndex(2)) + ] + ),] + .into_iter() + .collect(), + &group_validators, + false + ), + Error::::ValidationDataHashMismatch + ); + + // candidates are no longer required to be sorted by core index. + ParaInclusion::process_candidates( + &allowed_relay_parents, + &vec![ + ( + chain_b, + vec![ + (backed_b_1.clone(), CoreIndex(2)), + (backed_b_2.clone(), CoreIndex(1)), + ], + ), + (chain_a_assignment.0, vec![(backed_a.clone(), chain_a_assignment.1)]), + ] + .into_iter() + .collect(), + &group_validators, + false, + ) + .unwrap(); + + // candidate does not build on top of the latest unincluded head + + let mut candidate_b_3 = TestCandidateBuilder { + para_id: chain_b, + relay_parent: System::parent_hash(), + pov_hash: Hash::repeat_byte(4), + persisted_validation_data_hash: make_persisted_validation_data_with_parent::( + RELAY_PARENT_NUM, + Default::default(), + candidate_b_1.commitments.head_data.clone(), + ) + .hash(), + hrmp_watermark: RELAY_PARENT_NUM, + head_data: HeadData(vec![8, 9]), + ..Default::default() + } + .build(); + collator_sign_candidate(Sr25519Keyring::Two, &mut candidate_b_3); + + let backed_b_3 = back_candidate( + candidate_b_3, + &validators, + group_validators(GroupIndex::from(3)).unwrap().as_ref(), + &keystore, + &signing_context, + BackingKind::Threshold, + None, ); - // out-of-order manifests as unscheduled. assert_noop!( ParaInclusion::process_candidates( &allowed_relay_parents, - vec![backed_b, backed_a], - &[chain_a_assignment, chain_b_assignment].into_iter().collect(), + &vec![(chain_b, vec![(backed_b_3, CoreIndex(3))])].into_iter().collect(), &group_validators, + false ), - Error::::ScheduledOutOfOrder + Error::::ValidationDataHashMismatch ); } @@ -1020,24 +1404,51 @@ fn candidate_checks() { .build(); collator_sign_candidate(Sr25519Keyring::One, &mut candidate); + // Insufficient backing. let backed = back_candidate( - candidate, + candidate.clone(), &validators, group_validators(GroupIndex::from(0)).unwrap().as_ref(), &keystore, &signing_context, BackingKind::Lacking, + None, ); assert_noop!( ParaInclusion::process_candidates( &allowed_relay_parents, - vec![backed], - &[chain_a_assignment].into_iter().collect(), + &vec![(chain_a_assignment.0, vec![(backed, chain_a_assignment.1)])] + .into_iter() + .collect(), &group_validators, + false ), Error::::InsufficientBacking ); + + // Wrong backing group. + let backed = back_candidate( + candidate, + &validators, + group_validators(GroupIndex::from(1)).unwrap().as_ref(), + &keystore, + &signing_context, + BackingKind::Threshold, + None, + ); + + assert_noop!( + ParaInclusion::process_candidates( + &allowed_relay_parents, + &vec![(chain_a_assignment.0, vec![(backed, chain_a_assignment.1)])] + .into_iter() + .collect(), + &group_validators, + false + ), + Error::::InvalidBacking + ); } // one of candidates is not based on allowed relay parent. @@ -1075,6 +1486,7 @@ fn candidate_checks() { &keystore, &signing_context, BackingKind::Threshold, + None, ); let backed_b = back_candidate( @@ -1084,14 +1496,20 @@ fn candidate_checks() { &keystore, &signing_context, BackingKind::Threshold, + None, ); assert_noop!( ParaInclusion::process_candidates( &allowed_relay_parents, - vec![backed_b, backed_a], - &[chain_a_assignment, chain_b_assignment].into_iter().collect(), + &vec![ + (chain_b_assignment.0, vec![(backed_b, chain_b_assignment.1)]), + (chain_a_assignment.0, vec![(backed_a, chain_a_assignment.1)]) + ] + .into_iter() + .collect(), &group_validators, + false ), Error::::DisallowedRelayParent ); @@ -1122,109 +1540,20 @@ fn candidate_checks() { &keystore, &signing_context, BackingKind::Threshold, + None, ); assert_noop!( ParaInclusion::process_candidates( &allowed_relay_parents, - vec![backed], - &[thread_a_assignment].into_iter().collect(), - &group_validators, - ), - Error::::NotCollatorSigned - ); - } - - // para occupied - reject. - { - let mut candidate = TestCandidateBuilder { - para_id: chain_a, - relay_parent: System::parent_hash(), - pov_hash: Hash::repeat_byte(1), - persisted_validation_data_hash: make_vdata_hash(chain_a).unwrap(), - hrmp_watermark: RELAY_PARENT_NUM, - ..Default::default() - } - .build(); - - collator_sign_candidate(Sr25519Keyring::One, &mut candidate); - - let backed = back_candidate( - candidate, - &validators, - group_validators(GroupIndex::from(0)).unwrap().as_ref(), - &keystore, - &signing_context, - BackingKind::Threshold, - ); - - let candidate = TestCandidateBuilder::default().build(); - >::insert( - &chain_a, - CandidatePendingAvailability { - core: CoreIndex::from(0), - hash: candidate.hash(), - descriptor: candidate.descriptor, - availability_votes: default_availability_votes(), - relay_parent_number: 3, - backed_in_number: 4, - backers: default_backing_bitfield(), - backing_group: GroupIndex::from(0), - }, - ); - >::insert(&chain_a, candidate.commitments); - - assert_noop!( - ParaInclusion::process_candidates( - &allowed_relay_parents, - vec![backed], - &[chain_a_assignment].into_iter().collect(), - &group_validators, - ), - Error::::CandidateScheduledBeforeParaFree - ); - - >::remove(&chain_a); - >::remove(&chain_a); - } - - // messed up commitments storage - do not panic - reject. - { - let mut candidate = TestCandidateBuilder { - para_id: chain_a, - relay_parent: System::parent_hash(), - pov_hash: Hash::repeat_byte(1), - persisted_validation_data_hash: make_vdata_hash(chain_a).unwrap(), - hrmp_watermark: RELAY_PARENT_NUM, - ..Default::default() - } - .build(); - - collator_sign_candidate(Sr25519Keyring::One, &mut candidate); - - // this is not supposed to happen - >::insert(&chain_a, candidate.commitments.clone()); - - let backed = back_candidate( - candidate, - &validators, - group_validators(GroupIndex::from(0)).unwrap().as_ref(), - &keystore, - &signing_context, - BackingKind::Threshold, - ); - - assert_noop!( - ParaInclusion::process_candidates( - &allowed_relay_parents, - vec![backed], - &[chain_a_assignment].into_iter().collect(), + &vec![(thread_a_assignment.0, vec![(backed, thread_a_assignment.1)])] + .into_iter() + .collect(), &group_validators, + false ), - Error::::CandidateScheduledBeforeParaFree + Error::::NotCollatorSigned ); - - >::remove(&chain_a); } // interfering code upgrade - reject @@ -1233,7 +1562,7 @@ fn candidate_checks() { para_id: chain_a, relay_parent: System::parent_hash(), pov_hash: Hash::repeat_byte(1), - new_validation_code: Some(vec![5, 6, 7, 8].into()), + new_validation_code: Some(dummy_validation_code()), persisted_validation_data_hash: make_vdata_hash(chain_a).unwrap(), hrmp_watermark: RELAY_PARENT_NUM, ..Default::default() @@ -1249,27 +1578,30 @@ fn candidate_checks() { &keystore, &signing_context, BackingKind::Threshold, + None, ); { - let cfg = Configuration::config(); + let cfg = configuration::ActiveConfig::::get(); let expected_at = 10 + cfg.validation_upgrade_delay; assert_eq!(expected_at, 12); Paras::schedule_code_upgrade( chain_a, - vec![1, 2, 3, 4].into(), + vec![9, 8, 7, 6, 5, 4, 3, 2, 1].into(), expected_at, &cfg, - SetGoAhead::Yes, + UpgradeStrategy::SetGoAheadSignal, ); } assert_noop!( ParaInclusion::process_candidates( &allowed_relay_parents, - vec![backed], - &[chain_a_assignment].into_iter().collect(), + &vec![(chain_a_assignment.0, vec![(backed, chain_a_assignment.1)])] + .into_iter() + .collect(), &group_validators, + false ), Error::::PrematureCodeUpgrade ); @@ -1296,16 +1628,19 @@ fn candidate_checks() { &keystore, &signing_context, BackingKind::Threshold, + None, ); - assert_eq!( + assert_noop!( ParaInclusion::process_candidates( &allowed_relay_parents, - vec![backed], - &[chain_a_assignment].into_iter().collect(), + &vec![(chain_a_assignment.0, vec![(backed, chain_a_assignment.1)])] + .into_iter() + .collect(), &group_validators, + false, ), - Err(Error::::ValidationDataHashMismatch.into()), + Error::::ValidationDataHashMismatch ); } @@ -1317,7 +1652,7 @@ fn candidate_checks() { pov_hash: Hash::repeat_byte(1), persisted_validation_data_hash: make_vdata_hash(chain_a).unwrap(), hrmp_watermark: RELAY_PARENT_NUM, - validation_code: ValidationCode(vec![1]), + validation_code: ValidationCode(vec![9, 8, 7, 6, 5, 4, 3, 2, 1]), ..Default::default() } .build(); @@ -1331,14 +1666,17 @@ fn candidate_checks() { &keystore, &signing_context, BackingKind::Threshold, + None, ); assert_noop!( ParaInclusion::process_candidates( &allowed_relay_parents, - vec![backed], - &[chain_a_assignment].into_iter().collect(), + &vec![(chain_a_assignment.0, vec![(backed, chain_a_assignment.1)])] + .into_iter() + .collect(), &group_validators, + false ), Error::::InvalidValidationCodeHash ); @@ -1366,14 +1704,17 @@ fn candidate_checks() { &keystore, &signing_context, BackingKind::Threshold, + None, ); assert_noop!( ParaInclusion::process_candidates( &allowed_relay_parents, - vec![backed], - &[chain_a_assignment].into_iter().collect(), + &vec![(chain_a_assignment.0, vec![(backed, chain_a_assignment.1)])] + .into_iter() + .collect(), &group_validators, + false ), Error::::ParaHeadMismatch ); @@ -1486,6 +1827,7 @@ fn backing_works() { &keystore, &signing_context, BackingKind::Threshold, + None, ); let backed_b = back_candidate( @@ -1495,6 +1837,7 @@ fn backing_works() { &keystore, &signing_context, BackingKind::Threshold, + None, ); let backed_c = back_candidate( @@ -1504,15 +1847,25 @@ fn backing_works() { &keystore, &signing_context, BackingKind::Threshold, + None, ); - let backed_candidates = vec![backed_a.clone(), backed_b.clone(), backed_c]; + let backed_candidates = vec![ + (chain_a_assignment.0, vec![(backed_a, chain_a_assignment.1)]), + (chain_b_assignment.0, vec![(backed_b, chain_b_assignment.1)]), + (thread_a_assignment.0, vec![(backed_c, thread_a_assignment.1)]), + ] + .into_iter() + .collect::>(); + let get_backing_group_idx = { // the order defines the group implicitly for this test case let backed_candidates_with_groups = backed_candidates - .iter() + .values() .enumerate() - .map(|(idx, backed_candidate)| (backed_candidate.hash(), GroupIndex(idx as _))) + .map(|(idx, backed_candidates)| { + (backed_candidates.iter().next().unwrap().0.hash(), GroupIndex(idx as _)) + }) .collect::>(); move |candidate_hash_x: CandidateHash| -> Option { @@ -1531,11 +1884,9 @@ fn backing_works() { candidate_receipt_with_backing_validator_indices, } = ParaInclusion::process_candidates( &allowed_relay_parents, - backed_candidates.clone(), - &[chain_a_assignment, chain_b_assignment, thread_a_assignment] - .into_iter() - .collect(), + &backed_candidates, &group_validators, + false, ) .expect("candidates scheduled, in order, and backed"); @@ -1554,22 +1905,23 @@ fn backing_works() { CandidateHash, (CandidateReceipt, Vec<(ValidatorIndex, ValidityAttestation)>), >::new(); - backed_candidates.into_iter().for_each(|backed_candidate| { + backed_candidates.values().for_each(|backed_candidates| { + let backed_candidate = backed_candidates.iter().next().unwrap().0.clone(); let candidate_receipt_with_backers = intermediate .entry(backed_candidate.hash()) .or_insert_with(|| (backed_candidate.receipt(), Vec::new())); - - assert_eq!( - backed_candidate.validity_votes.len(), - backed_candidate.validator_indices.count_ones() - ); + let (validator_indices, None) = + backed_candidate.validator_indices_and_core_index(false) + else { + panic!("Expected no injected core index") + }; + assert_eq!(backed_candidate.validity_votes().len(), validator_indices.count_ones()); candidate_receipt_with_backers.1.extend( - backed_candidate - .validator_indices + validator_indices .iter() .enumerate() .filter(|(_, signed)| **signed) - .zip(backed_candidate.validity_votes.iter().cloned()) + .zip(backed_candidate.validity_votes().iter().cloned()) .filter_map(|((validator_index_within_group, _), attestation)| { let grp_idx = get_backing_group_idx(backed_candidate.hash()).unwrap(); group_validators(grp_idx).map(|validator_indices| { @@ -1599,69 +1951,353 @@ fn backing_works() { let backers = { let num_backers = effective_minimum_backing_votes( group_validators(GroupIndex(0)).unwrap().len(), - configuration::Pallet::::config().minimum_backing_votes, + configuration::ActiveConfig::::get().minimum_backing_votes, ); backing_bitfield(&(0..num_backers).collect::>()) }; assert_eq!( - >::get(&chain_a), - Some(CandidatePendingAvailability { - core: CoreIndex::from(0), - hash: candidate_a.hash(), - descriptor: candidate_a.descriptor, - availability_votes: default_availability_votes(), - relay_parent_number: System::block_number() - 1, - backed_in_number: System::block_number(), - backers, - backing_group: GroupIndex::from(0), - }) - ); - assert_eq!( - >::get(&chain_a), - Some(candidate_a.commitments), + PendingAvailability::::get(&chain_a), + Some( + [CandidatePendingAvailability { + core: CoreIndex::from(0), + hash: candidate_a.hash(), + descriptor: candidate_a.descriptor, + availability_votes: default_availability_votes(), + relay_parent_number: System::block_number() - 1, + backed_in_number: System::block_number(), + backers, + backing_group: GroupIndex::from(0), + commitments: candidate_a.commitments, + }] + .into_iter() + .collect::>() + ) ); let backers = { let num_backers = effective_minimum_backing_votes( group_validators(GroupIndex(0)).unwrap().len(), - configuration::Pallet::::config().minimum_backing_votes, + configuration::ActiveConfig::::get().minimum_backing_votes, ); backing_bitfield(&(0..num_backers).map(|v| v + 2).collect::>()) }; assert_eq!( - >::get(&chain_b), - Some(CandidatePendingAvailability { - core: CoreIndex::from(1), - hash: candidate_b.hash(), - descriptor: candidate_b.descriptor, - availability_votes: default_availability_votes(), - relay_parent_number: System::block_number() - 1, - backed_in_number: System::block_number(), - backers, - backing_group: GroupIndex::from(1), - }) + PendingAvailability::::get(&chain_b), + Some( + [CandidatePendingAvailability { + core: CoreIndex::from(1), + hash: candidate_b.hash(), + descriptor: candidate_b.descriptor, + availability_votes: default_availability_votes(), + relay_parent_number: System::block_number() - 1, + backed_in_number: System::block_number(), + backers, + backing_group: GroupIndex::from(1), + commitments: candidate_b.commitments, + }] + .into_iter() + .collect::>() + ) + ); + + assert_eq!( + PendingAvailability::::get(&thread_a), + Some( + [CandidatePendingAvailability { + core: CoreIndex::from(2), + hash: candidate_c.hash(), + descriptor: candidate_c.descriptor, + availability_votes: default_availability_votes(), + relay_parent_number: System::block_number() - 1, + backed_in_number: System::block_number(), + backers: backing_bitfield(&[4]), + backing_group: GroupIndex::from(2), + commitments: candidate_c.commitments + }] + .into_iter() + .collect::>() + ) + ); + }); +} + +#[test] +fn backing_works_with_elastic_scaling_mvp() { + let chain_a = ParaId::from(1_u32); + let chain_b = ParaId::from(2_u32); + let thread_a = ParaId::from(3_u32); + + // The block number of the relay-parent for testing. + const RELAY_PARENT_NUM: BlockNumber = 4; + + let paras = vec![ + (chain_a, ParaKind::Parachain), + (chain_b, ParaKind::Parachain), + (thread_a, ParaKind::Parathread), + ]; + let validators = vec![ + Sr25519Keyring::Alice, + Sr25519Keyring::Bob, + Sr25519Keyring::Charlie, + Sr25519Keyring::Dave, + Sr25519Keyring::Ferdie, + ]; + let keystore: KeystorePtr = Arc::new(LocalKeystore::in_memory()); + for validator in validators.iter() { + Keystore::sr25519_generate_new( + &*keystore, + PARACHAIN_KEY_TYPE_ID, + Some(&validator.to_seed()), + ) + .unwrap(); + } + let validator_public = validator_pubkeys(&validators); + + new_test_ext(genesis_config(paras)).execute_with(|| { + shared::Pallet::::set_active_validators_ascending(validator_public.clone()); + shared::Pallet::::set_session_index(5); + + run_to_block(5, |_| None); + + let signing_context = + SigningContext { parent_hash: System::parent_hash(), session_index: 5 }; + + let group_validators = |group_index: GroupIndex| { + match group_index { + group_index if group_index == GroupIndex::from(0) => Some(vec![0, 1]), + group_index if group_index == GroupIndex::from(1) => Some(vec![2, 3]), + group_index if group_index == GroupIndex::from(2) => Some(vec![4]), + _ => panic!("Group index out of bounds for 2 parachains and 1 parathread core"), + } + .map(|vs| vs.into_iter().map(ValidatorIndex).collect::>()) + }; + + // When processing candidates, we compute the group index from scheduler. + let validator_groups = vec![ + vec![ValidatorIndex(0), ValidatorIndex(1)], + vec![ValidatorIndex(2), ValidatorIndex(3)], + vec![ValidatorIndex(4)], + ]; + Scheduler::set_validator_groups(validator_groups); + + let allowed_relay_parents = default_allowed_relay_parent_tracker(); + + let mut candidate_a = TestCandidateBuilder { + para_id: chain_a, + relay_parent: System::parent_hash(), + pov_hash: Hash::repeat_byte(1), + persisted_validation_data_hash: make_vdata_hash(chain_a).unwrap(), + hrmp_watermark: RELAY_PARENT_NUM, + ..Default::default() + } + .build(); + collator_sign_candidate(Sr25519Keyring::One, &mut candidate_a); + + let mut candidate_b_1 = TestCandidateBuilder { + para_id: chain_b, + relay_parent: System::parent_hash(), + pov_hash: Hash::repeat_byte(2), + persisted_validation_data_hash: make_vdata_hash(chain_b).unwrap(), + hrmp_watermark: RELAY_PARENT_NUM, + ..Default::default() + } + .build(); + collator_sign_candidate(Sr25519Keyring::One, &mut candidate_b_1); + + // Make candidate b2 a child of b1. + let mut candidate_b_2 = TestCandidateBuilder { + para_id: chain_b, + relay_parent: System::parent_hash(), + pov_hash: Hash::repeat_byte(3), + persisted_validation_data_hash: make_persisted_validation_data_with_parent::( + RELAY_PARENT_NUM, + Default::default(), + candidate_b_1.commitments.head_data.clone(), + ) + .hash(), + hrmp_watermark: RELAY_PARENT_NUM, + ..Default::default() + } + .build(); + collator_sign_candidate(Sr25519Keyring::One, &mut candidate_b_2); + + let backed_a = back_candidate( + candidate_a.clone(), + &validators, + group_validators(GroupIndex::from(0)).unwrap().as_ref(), + &keystore, + &signing_context, + BackingKind::Threshold, + None, + ); + + let backed_b_1 = back_candidate( + candidate_b_1.clone(), + &validators, + group_validators(GroupIndex::from(1)).unwrap().as_ref(), + &keystore, + &signing_context, + BackingKind::Threshold, + Some(CoreIndex(1)), + ); + + let backed_b_2 = back_candidate( + candidate_b_2.clone(), + &validators, + group_validators(GroupIndex::from(2)).unwrap().as_ref(), + &keystore, + &signing_context, + BackingKind::Threshold, + Some(CoreIndex(2)), + ); + + let mut backed_candidates = BTreeMap::new(); + backed_candidates.insert(chain_a, vec![(backed_a, CoreIndex(0))]); + backed_candidates + .insert(chain_b, vec![(backed_b_1, CoreIndex(1)), (backed_b_2, CoreIndex(2))]); + + let get_backing_group_idx = { + // the order defines the group implicitly for this test case + let backed_candidates_with_groups = backed_candidates + .values() + .enumerate() + .map(|(idx, backed_candidates)| { + backed_candidates + .iter() + .enumerate() + .map(|(i, c)| (c.0.hash(), GroupIndex((idx + i) as _))) + .collect() + }) + .collect::>>() + .concat(); + + move |candidate_hash_x: CandidateHash| -> Option { + backed_candidates_with_groups.iter().find_map(|(candidate_hash, grp)| { + if *candidate_hash == candidate_hash_x { + Some(*grp) + } else { + None + } + }) + } + }; + + let ProcessedCandidates { + core_indices: occupied_cores, + candidate_receipt_with_backing_validator_indices, + } = ParaInclusion::process_candidates( + &allowed_relay_parents, + &backed_candidates, + &group_validators, + true, + ) + .expect("candidates scheduled, in order, and backed"); + + // Both b candidates will be backed. + assert_eq!( + occupied_cores, + vec![ + (CoreIndex::from(0), chain_a), + (CoreIndex::from(1), chain_b), + (CoreIndex::from(2), chain_b), + ] ); + + // Transform the votes into the setup we expect + let mut expected = std::collections::HashMap::< + CandidateHash, + (CandidateReceipt, Vec<(ValidatorIndex, ValidityAttestation)>), + >::new(); + backed_candidates.values().for_each(|backed_candidates| { + for backed_candidate in backed_candidates { + let backed_candidate = backed_candidate.0.clone(); + let candidate_receipt_with_backers = expected + .entry(backed_candidate.hash()) + .or_insert_with(|| (backed_candidate.receipt(), Vec::new())); + let (validator_indices, _maybe_core_index) = + backed_candidate.validator_indices_and_core_index(true); + assert_eq!(backed_candidate.validity_votes().len(), validator_indices.count_ones()); + candidate_receipt_with_backers.1.extend( + validator_indices + .iter() + .enumerate() + .filter(|(_, signed)| **signed) + .zip(backed_candidate.validity_votes().iter().cloned()) + .filter_map(|((validator_index_within_group, _), attestation)| { + let grp_idx = get_backing_group_idx(backed_candidate.hash()).unwrap(); + group_validators(grp_idx).map(|validator_indices| { + (validator_indices[validator_index_within_group], attestation) + }) + }), + ); + } + }); + assert_eq!( - >::get(&chain_b), - Some(candidate_b.commitments), + expected, + candidate_receipt_with_backing_validator_indices + .into_iter() + .map(|c| (c.0.hash(), c)) + .collect() ); + let backers = { + let num_backers = effective_minimum_backing_votes( + group_validators(GroupIndex(0)).unwrap().len(), + configuration::ActiveConfig::::get().minimum_backing_votes, + ); + backing_bitfield(&(0..num_backers).collect::>()) + }; assert_eq!( - >::get(&thread_a), - Some(CandidatePendingAvailability { - core: CoreIndex::from(2), - hash: candidate_c.hash(), - descriptor: candidate_c.descriptor, - availability_votes: default_availability_votes(), - relay_parent_number: System::block_number() - 1, - backed_in_number: System::block_number(), - backers: backing_bitfield(&[4]), - backing_group: GroupIndex::from(2), - }) + PendingAvailability::::get(&chain_a), + Some( + [CandidatePendingAvailability { + core: CoreIndex::from(0), + hash: candidate_a.hash(), + descriptor: candidate_a.descriptor, + availability_votes: default_availability_votes(), + relay_parent_number: System::block_number() - 1, + backed_in_number: System::block_number(), + backers, + backing_group: GroupIndex::from(0), + commitments: candidate_a.commitments + }] + .into_iter() + .collect::>() + ) ); + + // Both candidates of b will be recorded on chain. assert_eq!( - >::get(&thread_a), - Some(candidate_c.commitments), + PendingAvailability::::get(&chain_b), + Some( + [ + CandidatePendingAvailability { + core: CoreIndex::from(1), + hash: candidate_b_1.hash(), + descriptor: candidate_b_1.descriptor, + availability_votes: default_availability_votes(), + relay_parent_number: System::block_number() - 1, + backed_in_number: System::block_number(), + backers: backing_bitfield(&[2, 3]), + backing_group: GroupIndex::from(1), + commitments: candidate_b_1.commitments + }, + CandidatePendingAvailability { + core: CoreIndex::from(2), + hash: candidate_b_2.hash(), + descriptor: candidate_b_2.descriptor, + availability_votes: default_availability_votes(), + relay_parent_number: System::block_number() - 1, + backed_in_number: System::block_number(), + backers: backing_bitfield(&[4]), + backing_group: GroupIndex::from(2), + commitments: candidate_b_2.commitments + } + ] + .into_iter() + .collect::>() + ) ); }); } @@ -1726,7 +2362,7 @@ fn can_include_candidate_with_ok_code_upgrade() { relay_parent: System::parent_hash(), pov_hash: Hash::repeat_byte(1), persisted_validation_data_hash: make_vdata_hash(chain_a).unwrap(), - new_validation_code: Some(vec![1, 2, 3].into()), + new_validation_code: Some(vec![9, 8, 7, 6, 5, 4, 3, 2, 1].into()), hrmp_watermark: RELAY_PARENT_NUM, ..Default::default() } @@ -1740,14 +2376,17 @@ fn can_include_candidate_with_ok_code_upgrade() { &keystore, &signing_context, BackingKind::Threshold, + None, ); let ProcessedCandidates { core_indices: occupied_cores, .. } = ParaInclusion::process_candidates( &allowed_relay_parents, - vec![backed_a], - &[chain_a_assignment].into_iter().collect(), - &group_validators, + &vec![(chain_a_assignment.0, vec![(backed_a, chain_a_assignment.1)])] + .into_iter() + .collect::>(), + group_validators, + false, ) .expect("candidates scheduled, in order, and backed"); @@ -1756,26 +2395,27 @@ fn can_include_candidate_with_ok_code_upgrade() { let backers = { let num_backers = effective_minimum_backing_votes( group_validators(GroupIndex(0)).unwrap().len(), - configuration::Pallet::::config().minimum_backing_votes, + configuration::ActiveConfig::::get().minimum_backing_votes, ); backing_bitfield(&(0..num_backers).collect::>()) }; assert_eq!( - >::get(&chain_a), - Some(CandidatePendingAvailability { - core: CoreIndex::from(0), - hash: candidate_a.hash(), - descriptor: candidate_a.descriptor, - availability_votes: default_availability_votes(), - relay_parent_number: System::block_number() - 1, - backed_in_number: System::block_number(), - backers, - backing_group: GroupIndex::from(0), - }) - ); - assert_eq!( - >::get(&chain_a), - Some(candidate_a.commitments), + PendingAvailability::::get(&chain_a), + Some( + [CandidatePendingAvailability { + core: CoreIndex::from(0), + hash: candidate_a.hash(), + descriptor: candidate_a.descriptor, + availability_votes: default_availability_votes(), + relay_parent_number: System::block_number() - 1, + backed_in_number: System::block_number(), + backers, + backing_group: GroupIndex::from(0), + commitments: candidate_a.commitments + }] + .into_iter() + .collect::>() + ) ); }); } @@ -1809,7 +2449,7 @@ fn check_allowed_relay_parents() { } let validator_public = validator_pubkeys(&validators); let mut config = genesis_config(paras); - config.configuration.config.group_rotation_frequency = 1; + config.configuration.config.scheduler_params.group_rotation_frequency = 1; new_test_ext(config).execute_with(|| { shared::Pallet::::set_active_validators_ascending(validator_public.clone()); @@ -1932,6 +2572,7 @@ fn check_allowed_relay_parents() { &keystore, &signing_context_a, BackingKind::Threshold, + None, ); let backed_b = back_candidate( @@ -1941,6 +2582,7 @@ fn check_allowed_relay_parents() { &keystore, &signing_context_b, BackingKind::Threshold, + None, ); let backed_c = back_candidate( @@ -1950,17 +2592,22 @@ fn check_allowed_relay_parents() { &keystore, &signing_context_c, BackingKind::Threshold, + None, ); - let backed_candidates = vec![backed_a, backed_b, backed_c]; + let backed_candidates = vec![ + (chain_a_assignment.0, vec![(backed_a, chain_a_assignment.1)]), + (chain_b_assignment.0, vec![(backed_b, chain_b_assignment.1)]), + (thread_a_assignment.0, vec![(backed_c, thread_a_assignment.1)]), + ] + .into_iter() + .collect::>(); ParaInclusion::process_candidates( &allowed_relay_parents, - backed_candidates.clone(), - &[chain_a_assignment, chain_b_assignment, thread_a_assignment] - .into_iter() - .collect(), + &backed_candidates, &group_validators, + false, ) .expect("candidates scheduled, in order, and backed"); }); @@ -2006,25 +2653,10 @@ fn session_change_wipes() { run_to_block(10, |_| None); - >::insert( - &ValidatorIndex(0), - AvailabilityBitfieldRecord { bitfield: default_bitfield(), submitted_at: 9 }, - ); - - >::insert( - &ValidatorIndex(1), - AvailabilityBitfieldRecord { bitfield: default_bitfield(), submitted_at: 9 }, - ); - - >::insert( - &ValidatorIndex(4), - AvailabilityBitfieldRecord { bitfield: default_bitfield(), submitted_at: 9 }, - ); - let candidate = TestCandidateBuilder::default().build(); - >::insert( + PendingAvailability::::insert( &chain_a, - CandidatePendingAvailability { + [CandidatePendingAvailability { core: CoreIndex::from(0), hash: candidate.hash(), descriptor: candidate.descriptor.clone(), @@ -2033,13 +2665,15 @@ fn session_change_wipes() { backed_in_number: 6, backers: default_backing_bitfield(), backing_group: GroupIndex::from(0), - }, + commitments: candidate.commitments.clone(), + }] + .into_iter() + .collect::>(), ); - >::insert(&chain_a, candidate.commitments.clone()); - >::insert( + PendingAvailability::::insert( &chain_b, - CandidatePendingAvailability { + [CandidatePendingAvailability { core: CoreIndex::from(1), hash: candidate.hash(), descriptor: candidate.descriptor, @@ -2048,22 +2682,18 @@ fn session_change_wipes() { backed_in_number: 7, backers: default_backing_bitfield(), backing_group: GroupIndex::from(1), - }, + commitments: candidate.commitments, + }] + .into_iter() + .collect::>(), ); - >::insert(&chain_b, candidate.commitments); run_to_block(11, |_| None); - assert_eq!(shared::Pallet::::session_index(), 5); + assert_eq!(shared::CurrentSessionIndex::::get(), 5); - assert!(>::get(&ValidatorIndex(0)).is_some()); - assert!(>::get(&ValidatorIndex(1)).is_some()); - assert!(>::get(&ValidatorIndex(4)).is_some()); - - assert!(>::get(&chain_a).is_some()); - assert!(>::get(&chain_b).is_some()); - assert!(>::get(&chain_a).is_some()); - assert!(>::get(&chain_b).is_some()); + assert!(PendingAvailability::::get(&chain_a).is_some()); + assert!(PendingAvailability::::get(&chain_b).is_some()); run_to_block(12, |n| match n { 12 => Some(SessionChangeNotification { @@ -2077,20 +2707,9 @@ fn session_change_wipes() { _ => None, }); - assert_eq!(shared::Pallet::::session_index(), 6); - - assert!(>::get(&ValidatorIndex(0)).is_none()); - assert!(>::get(&ValidatorIndex(1)).is_none()); - assert!(>::get(&ValidatorIndex(4)).is_none()); + assert_eq!(shared::CurrentSessionIndex::::get(), 6); - assert!(>::get(&chain_a).is_none()); - assert!(>::get(&chain_b).is_none()); - assert!(>::get(&chain_a).is_none()); - assert!(>::get(&chain_b).is_none()); - - assert!(>::iter().collect::>().is_empty()); - assert!(>::iter().collect::>().is_empty()); - assert!(>::iter().collect::>().is_empty()); + assert!(PendingAvailability::::iter().collect::>().is_empty()); }); } @@ -2133,7 +2752,7 @@ fn para_upgrade_delay_scheduled_from_inclusion() { shared::Pallet::::set_active_validators_ascending(validator_public.clone()); shared::Pallet::::set_session_index(5); - let new_validation_code: ValidationCode = vec![1, 2, 3, 4, 5].into(); + let new_validation_code: ValidationCode = vec![9, 8, 7, 6, 5, 4, 3, 2, 1].into(); let new_validation_code_hash = new_validation_code.hash(); // Otherwise upgrade is no-op. @@ -2162,11 +2781,6 @@ fn para_upgrade_delay_scheduled_from_inclusion() { ]]; Scheduler::set_validator_groups(validator_groups); - let core_lookup = |core| match core { - core if core == CoreIndex::from(0) => Some(chain_a), - _ => None, - }; - let allowed_relay_parents = default_allowed_relay_parent_tracker(); let chain_a_assignment = (chain_a, CoreIndex::from(0)); @@ -2189,14 +2803,17 @@ fn para_upgrade_delay_scheduled_from_inclusion() { &keystore, &signing_context, BackingKind::Threshold, + None, ); let ProcessedCandidates { core_indices: occupied_cores, .. } = ParaInclusion::process_candidates( &allowed_relay_parents, - vec![backed_a], - &[chain_a_assignment].into_iter().collect(), + &vec![(chain_a_assignment.0, vec![(backed_a, chain_a_assignment.1)])] + .into_iter() + .collect::>(), &group_validators, + false, ) .expect("candidates scheduled, in order, and backed"); @@ -2229,11 +2846,10 @@ fn para_upgrade_delay_scheduled_from_inclusion() { expected_bits(), ); - let v = process_bitfields(expected_bits(), checked_bitfields, core_lookup); + let v = process_bitfields(checked_bitfields); assert_eq!(vec![(CoreIndex(0), candidate_a.hash())], v); - assert!(>::get(&chain_a).is_none()); - assert!(>::get(&chain_a).is_none()); + assert!(PendingAvailability::::get(&chain_a).unwrap().is_empty()); let active_vote_state = paras::Pallet::::active_vote_state(&new_validation_code_hash) .expect("prechecking must be initiated"); @@ -2241,7 +2857,7 @@ fn para_upgrade_delay_scheduled_from_inclusion() { let cause = &active_vote_state.causes()[0]; // Upgrade block is the block of inclusion, not candidate's parent. assert_matches!(cause, - paras::PvfCheckCause::Upgrade { id, included_at, set_go_ahead: SetGoAhead::Yes } + paras::PvfCheckCause::Upgrade { id, included_at, upgrade_strategy: UpgradeStrategy::SetGoAheadSignal } if id == &chain_a && included_at == &7 ); }); diff --git a/polkadot/runtime/parachains/src/initializer.rs b/polkadot/runtime/parachains/src/initializer.rs index 3c8ab7c4726fe1687cebd7ca516584f6cd35e431..511d74421032e9e97028a90140189f97b1945599 100644 --- a/polkadot/runtime/parachains/src/initializer.rs +++ b/polkadot/runtime/parachains/src/initializer.rs @@ -341,15 +341,15 @@ impl OneSessionHandler for Pal where I: Iterator, { - >::on_new_session(false, 0, validators, None); + Pallet::::on_new_session(false, 0, validators, None); } fn on_new_session<'a, I: 'a>(changed: bool, validators: I, queued: I) where I: Iterator, { - let session_index = >::current_index(); - >::on_new_session(changed, session_index, validators, Some(queued)); + let session_index = pallet_session::Pallet::::current_index(); + Pallet::::on_new_session(changed, session_index, validators, Some(queued)); } fn on_disabled(_i: u32) {} diff --git a/polkadot/runtime/parachains/src/initializer/benchmarking.rs b/polkadot/runtime/parachains/src/initializer/benchmarking.rs index dd87ce9c9d974332bf7213ff3311fdb38adfbca9..ece41c726f04767fd7257cd8f016a209a9aecb66 100644 --- a/polkadot/runtime/parachains/src/initializer/benchmarking.rs +++ b/polkadot/runtime/parachains/src/initializer/benchmarking.rs @@ -27,12 +27,12 @@ benchmarks! { force_approve { let d in 0 .. DIGEST_MAX_LEN; for _ in 0 .. d { - >::deposit_log(ConsensusLog::ForceApprove(d).into()); + frame_system::Pallet::::deposit_log(ConsensusLog::ForceApprove(d).into()); } }: _(RawOrigin::Root, d + 1) verify { assert_eq!( - >::digest().logs.last().unwrap(), + frame_system::Pallet::::digest().logs.last().unwrap(), &DigestItem::from(ConsensusLog::ForceApprove(d + 1)), ); } diff --git a/polkadot/runtime/parachains/src/initializer/tests.rs b/polkadot/runtime/parachains/src/initializer/tests.rs index b0993d739fa9a9dbb22d25ee62861f37ce1152e2..e757e6b9d1178121b2c500e292d9433a53c7e98d 100644 --- a/polkadot/runtime/parachains/src/initializer/tests.rs +++ b/polkadot/runtime/parachains/src/initializer/tests.rs @@ -15,14 +15,14 @@ // along with Polkadot. If not, see . use super::*; -use crate::mock::{ - new_test_ext, Configuration, Dmp, Initializer, MockGenesisConfig, Paras, SessionInfo, System, - Test, +use crate::{ + mock::{new_test_ext, Dmp, Initializer, MockGenesisConfig, Paras, System, Test}, + paras::ParaKind, + session_info, }; use primitives::{HeadData, Id as ParaId}; use test_helpers::dummy_validation_code; -use crate::paras::ParaKind; use frame_support::{ assert_ok, traits::{OnFinalize, OnInitialize}, @@ -36,8 +36,8 @@ fn session_0_is_instantly_applied() { let v = BufferedSessionChanges::::get(); assert!(v.is_empty()); - assert_eq!(SessionInfo::earliest_stored_session(), 0); - assert!(SessionInfo::session_info(0).is_some()); + assert_eq!(session_info::EarliestStoredSession::::get(), 0); + assert!(session_info::Sessions::::get(0).is_some()); }); } @@ -116,9 +116,21 @@ fn scheduled_cleanup_performed() { }) .execute_with(|| { // enqueue downward messages to A, B and C. - assert_ok!(Dmp::queue_downward_message(&Configuration::config(), a, vec![1, 2, 3])); - assert_ok!(Dmp::queue_downward_message(&Configuration::config(), b, vec![4, 5, 6])); - assert_ok!(Dmp::queue_downward_message(&Configuration::config(), c, vec![7, 8, 9])); + assert_ok!(Dmp::queue_downward_message( + &configuration::ActiveConfig::::get(), + a, + vec![1, 2, 3] + )); + assert_ok!(Dmp::queue_downward_message( + &configuration::ActiveConfig::::get(), + b, + vec![4, 5, 6] + )); + assert_ok!(Dmp::queue_downward_message( + &configuration::ActiveConfig::::get(), + c, + vec![7, 8, 9] + )); assert_ok!(Paras::schedule_para_cleanup(a)); assert_ok!(Paras::schedule_para_cleanup(b)); diff --git a/polkadot/runtime/parachains/src/lib.rs b/polkadot/runtime/parachains/src/lib.rs index b0dc27b72863fe76d5d23a9bf18408907d2b89dd..97d6ab74904d5283bc60524adeaa1fab02a71f17 100644 --- a/polkadot/runtime/parachains/src/lib.rs +++ b/polkadot/runtime/parachains/src/lib.rs @@ -54,7 +54,7 @@ mod mock; mod ump_tests; pub use origin::{ensure_parachain, Origin}; -pub use paras::{ParaLifecycle, SetGoAhead}; +pub use paras::{ParaLifecycle, UpgradeStrategy}; use primitives::{HeadData, Id as ParaId, ValidationCode}; use sp_runtime::{DispatchResult, FixedU128}; @@ -82,12 +82,12 @@ pub fn schedule_para_initialize( id: ParaId, genesis: paras::ParaGenesisArgs, ) -> Result<(), ()> { - >::schedule_para_initialize(id, genesis).map_err(|_| ()) + paras::Pallet::::schedule_para_initialize(id, genesis).map_err(|_| ()) } /// Schedule a para to be cleaned up at the start of the next session. pub fn schedule_para_cleanup(id: primitives::Id) -> Result<(), ()> { - >::schedule_para_cleanup(id).map_err(|_| ()) + paras::Pallet::::schedule_para_cleanup(id).map_err(|_| ()) } /// Schedule a parathread (on-demand parachain) to be upgraded to a lease holding parachain. @@ -104,7 +104,7 @@ pub fn schedule_parachain_downgrade(id: ParaId) -> Result<(), pub fn schedule_code_upgrade( id: ParaId, new_code: ValidationCode, - set_go_ahead: SetGoAhead, + set_go_ahead: UpgradeStrategy, ) -> DispatchResult { paras::Pallet::::schedule_code_upgrade_external(id, new_code, set_go_ahead) } diff --git a/polkadot/runtime/parachains/src/mock.rs b/polkadot/runtime/parachains/src/mock.rs index 1925ca19501accce8148e23d5e34c8f6625097a2..461b9f4b431acea91614b295d47e3d4c273adccf 100644 --- a/polkadot/runtime/parachains/src/mock.rs +++ b/polkadot/runtime/parachains/src/mock.rs @@ -23,7 +23,7 @@ use crate::{ initializer, origin, paras, paras::ParaKind, paras_inherent, scheduler, - scheduler::common::{AssignmentProvider, AssignmentProviderConfig}, + scheduler::common::AssignmentProvider, session_info, shared, ParaId, }; use frame_support::pallet_prelude::*; @@ -103,7 +103,7 @@ parameter_types! { pub type AccountId = u64; -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { type BaseCallFilter = frame_support::traits::Everything; type BlockWeights = BlockWeights; @@ -365,6 +365,7 @@ impl pallet_message_queue::Config for Test { type HeapSize = ConstU32<65536>; type MaxStale = ConstU32<8>; type ServiceWeight = MessageQueueServiceWeight; + type IdleMaxServiceWeight = (); } parameter_types! { @@ -463,10 +464,6 @@ pub mod mock_assigner { pub(super) type MockAssignmentQueue = StorageValue<_, VecDeque, ValueQuery>; - #[pallet::storage] - pub(super) type MockProviderConfig = - StorageValue<_, AssignmentProviderConfig, OptionQuery>; - #[pallet::storage] pub(super) type MockCoreCount = StorageValue<_, u32, OptionQuery>; } @@ -478,12 +475,6 @@ pub mod mock_assigner { MockAssignmentQueue::::mutate(|queue| queue.push_back(assignment)); } - // This configuration needs to be customized to service `get_provider_config` in - // scheduler tests. - pub fn set_assignment_provider_config(config: AssignmentProviderConfig) { - MockProviderConfig::::set(Some(config)); - } - // Allows for customized core count in scheduler tests, rather than a core count // derived from on-demand config + parachain count. pub fn set_core_count(count: u32) { @@ -512,17 +503,6 @@ pub mod mock_assigner { // in the mock assigner. fn push_back_assignment(_assignment: Assignment) {} - // Gets the provider config we set earlier using `set_assignment_provider_config`, falling - // back to the on demand parachain configuration if none was set. - fn get_provider_config(_core_idx: CoreIndex) -> AssignmentProviderConfig { - match MockProviderConfig::::get() { - Some(config) => config, - None => AssignmentProviderConfig { - max_availability_timeouts: 1, - ttl: BlockNumber::from(5u32), - }, - } - } #[cfg(any(feature = "runtime-benchmarks", test))] fn get_mock_assignment(_: CoreIndex, para_id: ParaId) -> Assignment { Assignment::Bulk(para_id) diff --git a/polkadot/runtime/parachains/src/paras/benchmarking.rs b/polkadot/runtime/parachains/src/paras/benchmarking.rs index 554f0c15af24ff632e6e5ae9da34baf43aa0975e..437c4091a98b58049a7cb3204f35079be8395ce0 100644 --- a/polkadot/runtime/parachains/src/paras/benchmarking.rs +++ b/polkadot/runtime/parachains/src/paras/benchmarking.rs @@ -68,7 +68,7 @@ pub(crate) fn generate_disordered_upgrades() { fn generate_disordered_actions_queue() { let mut queue = Vec::new(); - let next_session = shared::Pallet::::session_index().saturating_add(One::one()); + let next_session = shared::CurrentSessionIndex::::get().saturating_add(One::one()); for _ in 0..SAMPLE_SIZE { let id = ParaId::from(1000); @@ -82,7 +82,7 @@ fn generate_disordered_actions_queue() { benchmarks! { force_set_current_code { - let c in 1 .. MAX_CODE_SIZE; + let c in MIN_CODE_SIZE .. MAX_CODE_SIZE; let new_code = ValidationCode(vec![0; c as usize]); let para_id = ParaId::from(c as u32); CurrentCodeHash::::insert(¶_id, new_code.hash()); @@ -92,7 +92,7 @@ benchmarks! { assert_last_event::(Event::CurrentCodeUpdated(para_id).into()); } force_set_current_head { - let s in 1 .. MAX_HEAD_DATA_SIZE; + let s in MIN_CODE_SIZE .. MAX_HEAD_DATA_SIZE; let new_head = HeadData(vec![0; s as usize]); let para_id = ParaId::from(1000); }: _(RawOrigin::Root, para_id, new_head) @@ -104,7 +104,7 @@ benchmarks! { let context = BlockNumberFor::::from(1000u32); }: _(RawOrigin::Root, para_id, context) force_schedule_code_upgrade { - let c in 1 .. MAX_CODE_SIZE; + let c in MIN_CODE_SIZE .. MAX_CODE_SIZE; let new_code = ValidationCode(vec![0; c as usize]); let para_id = ParaId::from(c as u32); let block = BlockNumberFor::::from(c); @@ -114,7 +114,7 @@ benchmarks! { assert_last_event::(Event::CodeUpgradeScheduled(para_id).into()); } force_note_new_head { - let s in 1 .. MAX_HEAD_DATA_SIZE; + let s in MIN_CODE_SIZE .. MAX_HEAD_DATA_SIZE; let para_id = ParaId::from(1000); let new_head = HeadData(vec![0; s as usize]); let old_code_hash = ValidationCode(vec![0]).hash(); @@ -126,10 +126,10 @@ benchmarks! { generate_disordered_pruning::(); Pallet::::schedule_code_upgrade( para_id, - ValidationCode(vec![0]), + ValidationCode(vec![0u8; MIN_CODE_SIZE as usize]), expired, &config, - SetGoAhead::Yes, + UpgradeStrategy::SetGoAheadSignal, ); }: _(RawOrigin::Root, para_id, new_head) verify { @@ -140,12 +140,12 @@ benchmarks! { generate_disordered_actions_queue::(); }: _(RawOrigin::Root, para_id) verify { - let next_session = crate::shared::Pallet::::session_index().saturating_add(One::one()); + let next_session = crate::shared::CurrentSessionIndex::::get().saturating_add(One::one()); assert_last_event::(Event::ActionQueued(para_id, next_session).into()); } add_trusted_validation_code { - let c in 1 .. MAX_CODE_SIZE; + let c in MIN_CODE_SIZE .. MAX_CODE_SIZE; let new_code = ValidationCode(vec![0; c as usize]); pvf_check::prepare_bypassing_bench::(new_code.clone()); diff --git a/polkadot/runtime/parachains/src/paras/benchmarking/pvf_check.rs b/polkadot/runtime/parachains/src/paras/benchmarking/pvf_check.rs index 05c4c9c37b4d9241a64539c13a1960f93c80d7c1..9281332fdada8fa6078100586be9329430623fd4 100644 --- a/polkadot/runtime/parachains/src/paras/benchmarking/pvf_check.rs +++ b/polkadot/runtime/parachains/src/paras/benchmarking/pvf_check.rs @@ -27,10 +27,10 @@ const SESSION_INDEX: SessionIndex = 1; const VALIDATOR_NUM: usize = 800; const CAUSES_NUM: usize = 100; fn validation_code() -> ValidationCode { - ValidationCode(vec![0]) + ValidationCode(vec![1, 2, 3, 4, 5, 6, 7, 8, 9]) } fn old_validation_code() -> ValidationCode { - ValidationCode(vec![1]) + ValidationCode(vec![9, 8, 7, 6, 5, 4, 3, 2, 1]) } /// Prepares the PVF check statement and the validator signature to pass into @@ -133,7 +133,7 @@ where .collect::>(); // 1. Make sure PVF pre-checking is enabled in the config. - let config = configuration::Pallet::::config(); + let config = configuration::ActiveConfig::::get(); configuration::Pallet::::force_set_active_config(config.clone()); // 2. initialize a new session with deterministic validator set. @@ -176,8 +176,8 @@ where id, validation_code, /* relay_parent_number */ 1u32.into(), - &configuration::Pallet::::config(), - SetGoAhead::Yes, + &configuration::ActiveConfig::::get(), + UpgradeStrategy::SetGoAheadSignal, ); } else { let r = Pallet::::schedule_para_initialize( @@ -202,7 +202,7 @@ fn generate_statements( where T: Config + shared::Config, { - let validators = ParasShared::::active_validator_keys(); + let validators = shared::ActiveValidatorKeys::::get(); let accept_threshold = primitives::supermajority_threshold(validators.len()); let required_votes = match vote_outcome { diff --git a/polkadot/runtime/parachains/src/paras/mod.rs b/polkadot/runtime/parachains/src/paras/mod.rs index e97df8e4a2b3aaeee4e4d69c3c39262c23780588..6f67c4b8c03da1278f45532b8c9b1a1db4cf427e 100644 --- a/polkadot/runtime/parachains/src/paras/mod.rs +++ b/polkadot/runtime/parachains/src/paras/mod.rs @@ -119,7 +119,7 @@ use frame_system::pallet_prelude::*; use parity_scale_codec::{Decode, Encode}; use primitives::{ ConsensusLog, HeadData, Id as ParaId, PvfCheckStatement, SessionIndex, UpgradeGoAhead, - UpgradeRestriction, ValidationCode, ValidationCodeHash, ValidatorSignature, + UpgradeRestriction, ValidationCode, ValidationCodeHash, ValidatorSignature, MIN_CODE_SIZE, }; use scale_info::{Type, TypeInfo}; use sp_core::RuntimeDebug; @@ -386,16 +386,32 @@ pub(crate) enum PvfCheckCause { /// /// See https://github.com/paritytech/polkadot/issues/4601 for detailed explanation. included_at: BlockNumber, - /// Whether or not the given para should be sent the `GoAhead` signal. - set_go_ahead: SetGoAhead, + /// Whether or not the upgrade should be enacted directly. + /// + /// If set to `Yes` it means that no `GoAheadSignal` will be set and the parachain code + /// will also be overwritten directly. + upgrade_strategy: UpgradeStrategy, }, } -/// Should the `GoAhead` signal be set after a successful check of the new wasm binary? +/// The strategy on how to handle a validation code upgrade. +/// +/// When scheduling a parachain code upgrade the upgrade first is checked by all validators. The +/// validators ensure that the new validation code can be compiled and instantiated. After the +/// majority of the validators have reported their checking result the upgrade is either scheduled +/// or aborted. This strategy then comes into play around the relay chain block this upgrade was +/// scheduled in. #[derive(Debug, Copy, Clone, PartialEq, TypeInfo, Decode, Encode)] -pub enum SetGoAhead { - Yes, - No, +pub enum UpgradeStrategy { + /// Set the `GoAhead` signal to inform the parachain that it is time to upgrade. + /// + /// The upgrade will then be applied after the first parachain block was enacted that must have + /// observed the `GoAhead` signal. + SetGoAheadSignal, + /// Apply the upgrade directly at the expected relay chain block. + /// + /// This doesn't wait for the parachain to make any kind of progress. + ApplyAtExpectedBlock, } impl PvfCheckCause { @@ -679,6 +695,8 @@ pub mod pallet { PvfCheckSubjectInvalid, /// Parachain cannot currently schedule a code upgrade. CannotUpgradeCode, + /// Invalid validation code size. + InvalidCode, } /// All currently active PVF pre-checking votes. @@ -704,8 +722,7 @@ pub mod pallet { /// /// Consider using the [`ParachainsCache`] type of modifying. #[pallet::storage] - #[pallet::getter(fn parachains)] - pub(crate) type Parachains = StorageValue<_, Vec, ValueQuery>; + pub type Parachains = StorageValue<_, Vec, ValueQuery>; /// The current lifecycle of a all known Para IDs. #[pallet::storage] @@ -713,22 +730,17 @@ pub mod pallet { /// The head-data of every registered para. #[pallet::storage] - #[pallet::getter(fn para_head)] - pub(super) type Heads = StorageMap<_, Twox64Concat, ParaId, HeadData>; + pub type Heads = StorageMap<_, Twox64Concat, ParaId, HeadData>; /// The context (relay-chain block number) of the most recent parachain head. #[pallet::storage] - #[pallet::getter(fn para_most_recent_context)] - pub(super) type MostRecentContext = - StorageMap<_, Twox64Concat, ParaId, BlockNumberFor>; + pub type MostRecentContext = StorageMap<_, Twox64Concat, ParaId, BlockNumberFor>; /// The validation code hash of every live para. /// /// Corresponding code can be retrieved with [`CodeByHash`]. #[pallet::storage] - #[pallet::getter(fn current_code_hash)] - pub(super) type CurrentCodeHash = - StorageMap<_, Twox64Concat, ParaId, ValidationCodeHash>; + pub type CurrentCodeHash = StorageMap<_, Twox64Concat, ParaId, ValidationCodeHash>; /// Actual past code hash, indicated by the para id as well as the block number at which it /// became outdated. @@ -742,8 +754,7 @@ pub mod pallet { /// but we also keep their code on-chain for the same amount of time as outdated code /// to keep it available for approval checkers. #[pallet::storage] - #[pallet::getter(fn past_code_meta)] - pub(super) type PastCodeMeta = + pub type PastCodeMeta = StorageMap<_, Twox64Concat, ParaId, ParaPastCodeMeta>, ValueQuery>; /// Which paras have past code that needs pruning and the relay-chain block at which the code @@ -756,21 +767,30 @@ pub mod pallet { pub(super) type PastCodePruning = StorageValue<_, Vec<(ParaId, BlockNumberFor)>, ValueQuery>; - /// The block number at which the planned code change is expected for a para. + /// The block number at which the planned code change is expected for a parachain. + /// /// The change will be applied after the first parablock for this ID included which executes /// in the context of a relay chain block with a number >= `expected_at`. #[pallet::storage] - #[pallet::getter(fn future_code_upgrade_at)] - pub(super) type FutureCodeUpgrades = - StorageMap<_, Twox64Concat, ParaId, BlockNumberFor>; + pub type FutureCodeUpgrades = StorageMap<_, Twox64Concat, ParaId, BlockNumberFor>; + + /// The list of upcoming future code upgrades. + /// + /// Each item is a pair of the parachain and the expected block at which the upgrade should be + /// applied. The upgrade will be applied at the given relay chain block. In contrast to + /// [`FutureCodeUpgrades`] this code upgrade will be applied regardless the parachain making any + /// progress or not. + /// + /// Ordered ascending by block number. + #[pallet::storage] + pub(super) type FutureCodeUpgradesAt = + StorageValue<_, Vec<(ParaId, BlockNumberFor)>, ValueQuery>; /// The actual future code hash of a para. /// /// Corresponding code can be retrieved with [`CodeByHash`]. #[pallet::storage] - #[pallet::getter(fn future_code_hash)] - pub(super) type FutureCodeHash = - StorageMap<_, Twox64Concat, ParaId, ValidationCodeHash>; + pub type FutureCodeHash = StorageMap<_, Twox64Concat, ParaId, ValidationCodeHash>; /// This is used by the relay-chain to communicate to a parachain a go-ahead with in the upgrade /// procedure. @@ -796,8 +816,7 @@ pub mod pallet { /// NOTE that this field is used by parachains via merkle storage proofs, therefore changing /// the format will require migration of parachains. #[pallet::storage] - #[pallet::getter(fn upgrade_restriction_signal)] - pub(super) type UpgradeRestrictionSignal = + pub type UpgradeRestrictionSignal = StorageMap<_, Twox64Concat, ParaId, UpgradeRestriction>; /// The list of parachains that are awaiting for their upgrade restriction to cooldown. @@ -807,8 +826,10 @@ pub mod pallet { pub(super) type UpgradeCooldowns = StorageValue<_, Vec<(ParaId, BlockNumberFor)>, ValueQuery>; - /// The list of upcoming code upgrades. Each item is a pair of which para performs a code - /// upgrade and at which relay-chain block it is expected at. + /// The list of upcoming code upgrades. + /// + /// Each item is a pair of which para performs a code upgrade and at which relay-chain block it + /// is expected at. /// /// Ordered ascending by block number. #[pallet::storage] @@ -817,8 +838,7 @@ pub mod pallet { /// The actions to perform during the start of a specific session index. #[pallet::storage] - #[pallet::getter(fn actions_queue)] - pub(super) type ActionsQueue = + pub type ActionsQueue = StorageMap<_, Twox64Concat, SessionIndex, Vec, ValueQuery>; /// Upcoming paras instantiation arguments. @@ -839,9 +859,7 @@ pub mod pallet { /// This storage is consistent with [`FutureCodeHash`], [`CurrentCodeHash`] and /// [`PastCodeHash`]. #[pallet::storage] - #[pallet::getter(fn code_by_hash)] - pub(super) type CodeByHash = - StorageMap<_, Identity, ValidationCodeHash, ValidationCode>; + pub type CodeByHash = StorageMap<_, Identity, ValidationCodeHash, ValidationCode>; #[pallet::genesis_config] #[derive(DefaultNoBound)] @@ -878,21 +896,9 @@ pub mod pallet { new_code: ValidationCode, ) -> DispatchResult { ensure_root(origin)?; - let maybe_prior_code_hash = CurrentCodeHash::::get(¶); let new_code_hash = new_code.hash(); Self::increase_code_ref(&new_code_hash, &new_code); - CurrentCodeHash::::insert(¶, new_code_hash); - - let now = frame_system::Pallet::::block_number(); - if let Some(prior_code_hash) = maybe_prior_code_hash { - Self::note_past_code(para, now, now, prior_code_hash); - } else { - log::error!( - target: LOG_TARGET, - "Pallet paras storage is inconsistent, prior code not found {:?}", - ¶ - ); - } + Self::set_current_code(para, new_code_hash, frame_system::Pallet::::block_number()); Self::deposit_event(Event::CurrentCodeUpdated(para)); Ok(()) } @@ -920,13 +926,13 @@ pub mod pallet { relay_parent_number: BlockNumberFor, ) -> DispatchResult { ensure_root(origin)?; - let config = configuration::Pallet::::config(); + let config = configuration::ActiveConfig::::get(); Self::schedule_code_upgrade( para, new_code, relay_parent_number, &config, - SetGoAhead::No, + UpgradeStrategy::ApplyAtExpectedBlock, ); Self::deposit_event(Event::CodeUpgradeScheduled(para)); Ok(()) @@ -954,7 +960,7 @@ pub mod pallet { #[pallet::weight(::WeightInfo::force_queue_action())] pub fn force_queue_action(origin: OriginFor, para: ParaId) -> DispatchResult { ensure_root(origin)?; - let next_session = shared::Pallet::::session_index().saturating_add(One::one()); + let next_session = shared::CurrentSessionIndex::::get().saturating_add(One::one()); ActionsQueue::::mutate(next_session, |v| { if let Err(i) = v.binary_search(¶) { v.insert(i, para); @@ -996,9 +1002,9 @@ pub mod pallet { } }); - let cfg = configuration::Pallet::::config(); + let cfg = configuration::ActiveConfig::::get(); Self::enact_pvf_accepted( - >::block_number(), + frame_system::Pallet::::block_number(), &code_hash, &vote.causes, vote.age, @@ -1057,8 +1063,8 @@ pub mod pallet { ) -> DispatchResultWithPostInfo { ensure_none(origin)?; - let validators = shared::Pallet::::active_validator_keys(); - let current_session = shared::Pallet::::session_index(); + let validators = shared::ActiveValidatorKeys::::get(); + let current_session = shared::CurrentSessionIndex::::get(); if stmt.session_index < current_session { return Err(Error::::PvfCheckStatementStale.into()) } else if stmt.session_index > current_session { @@ -1106,9 +1112,9 @@ pub mod pallet { }); match outcome { PvfCheckOutcome::Accepted => { - let cfg = configuration::Pallet::::config(); + let cfg = configuration::ActiveConfig::::get(); Self::enact_pvf_accepted( - >::block_number(), + frame_system::Pallet::::block_number(), &stmt.subject, &active_vote.causes, active_vote.age, @@ -1156,7 +1162,7 @@ pub mod pallet { _ => return InvalidTransaction::Call.into(), }; - let current_session = shared::Pallet::::session_index(); + let current_session = shared::CurrentSessionIndex::::get(); if stmt.session_index < current_session { return InvalidTransaction::Stale.into() } else if stmt.session_index > current_session { @@ -1164,7 +1170,7 @@ pub mod pallet { } let validator_index = stmt.validator_index.0 as usize; - let validators = shared::Pallet::::active_validator_keys(); + let validators = shared::ActiveValidatorKeys::::get(); let validator_public = match validators.get(validator_index) { Some(pk) => pk, None => return InvalidTransaction::Custom(INVALID_TX_BAD_VALIDATOR_IDX).into(), @@ -1225,15 +1231,19 @@ impl Pallet { pub(crate) fn schedule_code_upgrade_external( id: ParaId, new_code: ValidationCode, - set_go_ahead: SetGoAhead, + upgrade_strategy: UpgradeStrategy, ) -> DispatchResult { // Check that we can schedule an upgrade at all. ensure!(Self::can_upgrade_validation_code(id), Error::::CannotUpgradeCode); - let config = configuration::Pallet::::config(); + let config = configuration::ActiveConfig::::get(); + // Validation code sanity checks: + ensure!(new_code.0.len() >= MIN_CODE_SIZE as usize, Error::::InvalidCode); + ensure!(new_code.0.len() <= config.max_code_size as usize, Error::::InvalidCode); + let current_block = frame_system::Pallet::::block_number(); // Schedule the upgrade with a delay just like if a parachain triggered the upgrade. let upgrade_block = current_block.saturating_add(config.validation_upgrade_delay); - Self::schedule_code_upgrade(id, new_code, upgrade_block, &config, set_go_ahead); + Self::schedule_code_upgrade(id, new_code, upgrade_block, &config, upgrade_strategy); Self::deposit_event(Event::CodeUpgradeScheduled(id)); Ok(()) } @@ -1246,8 +1256,9 @@ impl Pallet { /// Called by the initializer to initialize the paras pallet. pub(crate) fn initializer_initialize(now: BlockNumberFor) -> Weight { - let weight = Self::prune_old_code(now); - weight + Self::process_scheduled_upgrade_changes(now) + Self::prune_old_code(now) + + Self::process_scheduled_upgrade_changes(now) + + Self::process_future_code_upgrades_at(now) } /// Called by the initializer to finalize the paras pallet. @@ -1268,7 +1279,7 @@ impl Pallet { /// The validation code of live para. pub(crate) fn current_code(para_id: &ParaId) -> Option { - Self::current_code_hash(para_id).and_then(|code_hash| { + CurrentCodeHash::::get(para_id).and_then(|code_hash| { let code = CodeByHash::::get(&code_hash); if code.is_none() { log::error!( @@ -1292,7 +1303,7 @@ impl Pallet { fn apply_actions_queue(session: SessionIndex) -> Vec { let actions = ActionsQueue::::take(session); let mut parachains = ParachainsCache::new(); - let now = >::block_number(); + let now = frame_system::Pallet::::block_number(); let mut outgoing = Vec::new(); for para in actions { @@ -1349,16 +1360,13 @@ impl Pallet { // NOTE both of those iterates over the list and the outgoing. We do not expect either // of these to be large. Thus should be fine. UpcomingUpgrades::::mutate(|upcoming_upgrades| { - *upcoming_upgrades = mem::take(upcoming_upgrades) - .into_iter() - .filter(|(para, _)| !outgoing.contains(para)) - .collect(); + upcoming_upgrades.retain(|(para, _)| !outgoing.contains(para)); }); UpgradeCooldowns::::mutate(|upgrade_cooldowns| { - *upgrade_cooldowns = mem::take(upgrade_cooldowns) - .into_iter() - .filter(|(para, _)| !outgoing.contains(para)) - .collect(); + upgrade_cooldowns.retain(|(para, _)| !outgoing.contains(para)); + }); + FutureCodeUpgradesAt::::mutate(|future_upgrades| { + future_upgrades.retain(|(para, _)| !outgoing.contains(para)); }); } @@ -1368,7 +1376,7 @@ impl Pallet { outgoing } - // note replacement of the code of para with given `id`, which occured in the + // note replacement of the code of para with given `id`, which occurred in the // context of the given relay-chain block number. provide the replaced code. // // `at` for para-triggered replacement is the block number of the relay-chain @@ -1400,7 +1408,7 @@ impl Pallet { // looks at old code metadata, compares them to the current acceptance window, and prunes those // that are too old. fn prune_old_code(now: BlockNumberFor) -> Weight { - let config = configuration::Pallet::::config(); + let config = configuration::ActiveConfig::::get(); let code_retention_period = config.code_retention_period; if now <= code_retention_period { let weight = T::DbWeight::get().reads_writes(1, 0); @@ -1436,7 +1444,7 @@ impl Pallet { } } - meta.is_empty() && Self::para_head(¶_id).is_none() + meta.is_empty() && Heads::::get(¶_id).is_none() }); // This parachain has been removed and now the vestigial code @@ -1454,6 +1462,37 @@ impl Pallet { T::DbWeight::get().reads_writes(1 + pruning_tasks_done, 2 * pruning_tasks_done) } + /// Process the future code upgrades that should be applied directly. + /// + /// Upgrades that should not be applied directly are being processed in + /// [`Self::process_scheduled_upgrade_changes`]. + fn process_future_code_upgrades_at(now: BlockNumberFor) -> Weight { + // account weight for `FutureCodeUpgradeAt::mutate`. + let mut weight = T::DbWeight::get().reads_writes(1, 1); + FutureCodeUpgradesAt::::mutate( + |upcoming_upgrades: &mut Vec<(ParaId, BlockNumberFor)>| { + let num = upcoming_upgrades.iter().take_while(|&(_, at)| at <= &now).count(); + for (id, expected_at) in upcoming_upgrades.drain(..num) { + weight += T::DbWeight::get().reads_writes(1, 1); + + // Both should always be `Some` in this case, since a code upgrade is scheduled. + let new_code_hash = if let Some(new_code_hash) = FutureCodeHash::::take(&id) + { + new_code_hash + } else { + log::error!(target: LOG_TARGET, "Missing future code hash for {:?}", &id); + continue + }; + + weight += Self::set_current_code(id, new_code_hash, expected_at); + } + num + }, + ); + + weight + } + /// Process the timers related to upgrades. Specifically, the upgrade go ahead signals toggle /// and the upgrade cooldown restrictions. However, this function does not actually unset /// the upgrade restriction, that will happen in the `initializer_finalize` function. However, @@ -1574,14 +1613,14 @@ impl Pallet { PvfCheckCause::Onboarding(id) => { weight += Self::proceed_with_onboarding(*id, sessions_observed); }, - PvfCheckCause::Upgrade { id, included_at, set_go_ahead } => { + PvfCheckCause::Upgrade { id, included_at, upgrade_strategy } => { weight += Self::proceed_with_upgrade( *id, code_hash, now, *included_at, cfg, - *set_go_ahead, + *upgrade_strategy, ); }, } @@ -1597,7 +1636,7 @@ impl Pallet { // // we cannot onboard at the current session, so it must be at least one // session ahead. - let onboard_at: SessionIndex = shared::Pallet::::session_index() + + let onboard_at: SessionIndex = shared::CurrentSessionIndex::::get() + cmp::max(shared::SESSION_DELAY.saturating_sub(sessions_observed), 1); ActionsQueue::::mutate(onboard_at, |v| { @@ -1615,43 +1654,55 @@ impl Pallet { now: BlockNumberFor, relay_parent_number: BlockNumberFor, cfg: &configuration::HostConfiguration>, - set_go_ahead: SetGoAhead, + upgrade_strategy: UpgradeStrategy, ) -> Weight { let mut weight = Weight::zero(); - // Compute the relay-chain block number starting at which the code upgrade is ready to be - // applied. + // Compute the relay-chain block number starting at which the code upgrade is ready to + // be applied. // - // The first parablock that has a relay-parent higher or at the same height of `expected_at` - // will trigger the code upgrade. The parablock that comes after that will be validated - // against the new validation code. + // The first parablock that has a relay-parent higher or at the same height of + // `expected_at` will trigger the code upgrade. The parablock that comes after that will + // be validated against the new validation code. // - // Here we are trying to choose the block number that will have `validation_upgrade_delay` - // blocks from the relay-parent of inclusion of the the block that scheduled code upgrade - // but no less than `minimum_validation_upgrade_delay`. We want this delay out of caution - // so that when the last vote for pre-checking comes the parachain will have some time until - // the upgrade finally takes place. + // Here we are trying to choose the block number that will have + // `validation_upgrade_delay` blocks from the relay-parent of inclusion of the the block + // that scheduled code upgrade but no less than `minimum_validation_upgrade_delay`. We + // want this delay out of caution so that when the last vote for pre-checking comes the + // parachain will have some time until the upgrade finally takes place. let expected_at = cmp::max( relay_parent_number + cfg.validation_upgrade_delay, now + cfg.minimum_validation_upgrade_delay, ); - weight += T::DbWeight::get().reads_writes(1, 4); - FutureCodeUpgrades::::insert(&id, expected_at); + match upgrade_strategy { + UpgradeStrategy::ApplyAtExpectedBlock => { + FutureCodeUpgradesAt::::mutate(|future_upgrades| { + let insert_idx = future_upgrades + .binary_search_by_key(&expected_at, |&(_, b)| b) + .unwrap_or_else(|idx| idx); + future_upgrades.insert(insert_idx, (id, expected_at)); + }); - // Only set an upcoming upgrade if `GoAhead` signal should be set for the respective para. - if set_go_ahead == SetGoAhead::Yes { - UpcomingUpgrades::::mutate(|upcoming_upgrades| { - let insert_idx = upcoming_upgrades - .binary_search_by_key(&expected_at, |&(_, b)| b) - .unwrap_or_else(|idx| idx); - upcoming_upgrades.insert(insert_idx, (id, expected_at)); - }); + weight += T::DbWeight::get().reads_writes(0, 2); + }, + UpgradeStrategy::SetGoAheadSignal => { + FutureCodeUpgrades::::insert(&id, expected_at); + + UpcomingUpgrades::::mutate(|upcoming_upgrades| { + let insert_idx = upcoming_upgrades + .binary_search_by_key(&expected_at, |&(_, b)| b) + .unwrap_or_else(|idx| idx); + upcoming_upgrades.insert(insert_idx, (id, expected_at)); + }); + + weight += T::DbWeight::get().reads_writes(1, 3); + }, } let expected_at = expected_at.saturated_into(); let log = ConsensusLog::ParaScheduleUpgradeCode(id, *code_hash, expected_at); - >::deposit_log(log.into()); + frame_system::Pallet::::deposit_log(log.into()); weight } @@ -1750,7 +1801,7 @@ impl Pallet { // // - Empty value is treated as the current code is already inserted during the onboarding. // - // This is only an intermediate solution and should be fixed in foreseable future. + // This is only an intermediate solution and should be fixed in foreseeable future. // // [soaking issue]: https://github.com/paritytech/polkadot/issues/3918 let validation_code = @@ -1759,7 +1810,7 @@ impl Pallet { let validation_code_hash = validation_code.hash(); CurrentCodeHash::::insert(&id, validation_code_hash); - let cfg = configuration::Pallet::::config(); + let cfg = configuration::ActiveConfig::::get(); Self::kick_off_pvf_check( PvfCheckCause::Onboarding(id), validation_code_hash, @@ -1886,11 +1937,18 @@ impl Pallet { new_code: ValidationCode, inclusion_block_number: BlockNumberFor, cfg: &configuration::HostConfiguration>, - set_go_ahead: SetGoAhead, + upgrade_strategy: UpgradeStrategy, ) -> Weight { let mut weight = T::DbWeight::get().reads(1); - // Enacting this should be prevented by the `can_schedule_upgrade` + // Should be prevented by checks in `schedule_code_upgrade_external` + let new_code_len = new_code.0.len(); + if new_code_len < MIN_CODE_SIZE as usize || new_code_len > cfg.max_code_size as usize { + log::warn!(target: LOG_TARGET, "attempted to schedule an upgrade with invalid new validation code",); + return weight + } + + // Enacting this should be prevented by the `can_upgrade_validation_code` if FutureCodeHash::::contains_key(&id) { // This branch should never be reached. Signalling an upgrade is disallowed for a para // that already has one upgrade scheduled. @@ -1936,7 +1994,7 @@ impl Pallet { }); weight += Self::kick_off_pvf_check( - PvfCheckCause::Upgrade { id, included_at: inclusion_block_number, set_go_ahead }, + PvfCheckCause::Upgrade { id, included_at: inclusion_block_number, upgrade_strategy }, code_hash, new_code, cfg, @@ -1981,14 +2039,14 @@ impl Pallet { // The code is known and there is no active PVF vote for it meaning it is // already checked -- fast track the PVF checking into the accepted state. weight += T::DbWeight::get().reads(1); - let now = >::block_number(); + let now = frame_system::Pallet::::block_number(); weight += Self::enact_pvf_accepted(now, &code_hash, &[cause], 0, cfg); } else { // PVF is not being pre-checked and it is not known. Start a new pre-checking // process. weight += T::DbWeight::get().reads_writes(3, 2); - let now = >::block_number(); - let n_validators = shared::Pallet::::active_validator_keys().len(); + let now = frame_system::Pallet::::block_number(); + let n_validators = shared::ActiveValidatorKeys::::get().len(); PvfActiveVoteMap::::insert( &code_hash, PvfCheckActiveVoteState::new(now, n_validators, cause), @@ -2048,24 +2106,10 @@ impl Pallet { log::error!(target: LOG_TARGET, "Missing future code hash for {:?}", &id); return T::DbWeight::get().reads_writes(3, 1 + 3) }; - let maybe_prior_code_hash = CurrentCodeHash::::get(&id); - CurrentCodeHash::::insert(&id, &new_code_hash); - let log = ConsensusLog::ParaUpgradeCode(id, new_code_hash); - >::deposit_log(log.into()); - - // `now` is only used for registering pruning as part of `fn note_past_code` - let now = >::block_number(); - - let weight = if let Some(prior_code_hash) = maybe_prior_code_hash { - Self::note_past_code(id, expected_at, now, prior_code_hash) - } else { - log::error!(target: LOG_TARGET, "Missing prior code hash for para {:?}", &id); - Weight::zero() - }; + let weight = Self::set_current_code(id, new_code_hash, expected_at); - // add 1 to writes due to heads update. - weight + T::DbWeight::get().reads_writes(3, 1 + 3) + weight + T::DbWeight::get().reads_writes(3, 3) } else { T::DbWeight::get().reads_writes(1, 1 + 0) } @@ -2081,6 +2125,34 @@ impl Pallet { weight.saturating_add(T::OnNewHead::on_new_head(id, &new_head)) } + /// Set the current code for the given parachain. + // `at` for para-triggered replacement is the block number of the relay-chain + // block in whose context the parablock was executed + // (i.e. number of `relay_parent` in the receipt) + pub(crate) fn set_current_code( + id: ParaId, + new_code_hash: ValidationCodeHash, + at: BlockNumberFor, + ) -> Weight { + let maybe_prior_code_hash = CurrentCodeHash::::get(&id); + CurrentCodeHash::::insert(&id, &new_code_hash); + + let log = ConsensusLog::ParaUpgradeCode(id, new_code_hash); + >::deposit_log(log.into()); + + // `now` is only used for registering pruning as part of `fn note_past_code` + let now = >::block_number(); + + let weight = if let Some(prior_code_hash) = maybe_prior_code_hash { + Self::note_past_code(id, at, now, prior_code_hash) + } else { + log::error!(target: LOG_TARGET, "Missing prior code hash for para {:?}", &id); + Weight::zero() + }; + + weight + T::DbWeight::get().writes(1) + } + /// Returns the list of PVFs (aka validation code) that require casting a vote by a validator in /// the active validator set. pub(crate) fn pvfs_require_precheck() -> Vec { @@ -2204,7 +2276,7 @@ impl Pallet { #[cfg(any(feature = "std", feature = "runtime-benchmarks", test))] pub fn test_on_new_session() { Self::initializer_on_new_session(&SessionChangeNotification { - session_index: shared::Pallet::::session_index(), + session_index: shared::CurrentSessionIndex::::get(), ..Default::default() }); } diff --git a/polkadot/runtime/parachains/src/paras/tests.rs b/polkadot/runtime/parachains/src/paras/tests.rs index cca200c2765e361120b4c5ea8db3dfc7c82bdc13..0b458f2f91eb2db68fb5d56aa9c35df7c373e894 100644 --- a/polkadot/runtime/parachains/src/paras/tests.rs +++ b/polkadot/runtime/parachains/src/paras/tests.rs @@ -17,7 +17,7 @@ use super::*; use frame_support::{assert_err, assert_ok, assert_storage_noop}; use keyring::Sr25519Keyring; -use primitives::{BlockNumber, PARACHAIN_KEY_TYPE_ID}; +use primitives::{vstaging::SchedulerParams, BlockNumber, PARACHAIN_KEY_TYPE_ID}; use sc_keystore::LocalKeystore; use sp_keystore::{Keystore, KeystorePtr}; use std::sync::Arc; @@ -25,10 +25,8 @@ use test_helpers::{dummy_head_data, dummy_validation_code, validator_pubkeys}; use crate::{ configuration::HostConfiguration, - mock::{ - new_test_ext, Configuration, MockGenesisConfig, Paras, ParasShared, RuntimeOrigin, System, - Test, - }, + mock::{new_test_ext, MockGenesisConfig, Paras, ParasShared, RuntimeOrigin, System, Test}, + paras, }; static VALIDATORS: &[Sr25519Keyring] = &[ @@ -67,6 +65,16 @@ fn submit_super_majority_pvf_votes( .for_each(sign_and_include_pvf_check_statement); } +fn test_validation_code_1() -> ValidationCode { + let validation_code = vec![1, 2, 3, 4, 5, 6, 7, 8, 9]; + ValidationCode(validation_code) +} + +fn test_validation_code_2() -> ValidationCode { + let validation_code = vec![9, 8, 7, 6, 5, 4, 3, 2, 1]; + ValidationCode(validation_code) +} + fn run_to_block(to: BlockNumber, new_session: Option>) { let keystore: KeystorePtr = Arc::new(LocalKeystore::in_memory()); for validator in VALIDATORS.iter() { @@ -85,7 +93,8 @@ fn run_to_block(to: BlockNumber, new_session: Option>) { ParasShared::initializer_finalize(); if new_session.as_ref().map_or(false, |v| v.contains(&(b + 1))) { let mut session_change_notification = SessionChangeNotification::default(); - session_change_notification.session_index = ParasShared::session_index() + 1; + session_change_notification.session_index = + shared::CurrentSessionIndex::::get() + 1; session_change_notification.validators = validator_pubkeys.clone(); ParasShared::initializer_on_new_session( session_change_notification.session_index, @@ -284,14 +293,14 @@ fn para_past_code_pruning_in_initialize() { let id = ParaId::from(0u32); let at_block: BlockNumber = 10; let included_block: BlockNumber = 12; - let validation_code = ValidationCode(vec![4, 5, 6]); + let validation_code = test_validation_code_2(); Paras::increase_code_ref(&validation_code.hash(), &validation_code); PastCodeHash::::insert(&(id, at_block), &validation_code.hash()); PastCodePruning::::put(&vec![(id, included_block)]); { - let mut code_meta = Paras::past_code_meta(&id); + let mut code_meta = paras::PastCodeMeta::::get(&id); code_meta.note_replacement(at_block, included_block); PastCodeMeta::::insert(&id, &code_meta); } @@ -302,12 +311,12 @@ fn para_past_code_pruning_in_initialize() { run_to_block(pruned_at - 1, None); assert_eq!(PastCodeHash::::get(&(id, at_block)), Some(validation_code.hash())); - assert_eq!(Paras::past_code_meta(&id).most_recent_change(), Some(at_block)); + assert_eq!(paras::PastCodeMeta::::get(&id).most_recent_change(), Some(at_block)); check_code_is_stored(&validation_code); run_to_block(pruned_at, None); assert!(PastCodeHash::::get(&(id, at_block)).is_none()); - assert!(Paras::past_code_meta(&id).most_recent_change().is_none()); + assert!(paras::PastCodeMeta::::get(&id).most_recent_change().is_none()); check_code_is_not_stored(&validation_code); }); } @@ -335,11 +344,11 @@ fn note_new_head_sets_head() { new_test_ext(genesis_config).execute_with(|| { let id_a = ParaId::from(0u32); - assert_eq!(Paras::para_head(&id_a), Some(dummy_head_data())); + assert_eq!(paras::Heads::::get(&id_a), Some(dummy_head_data())); Paras::note_new_head(id_a, vec![1, 2, 3].into(), 0); - assert_eq!(Paras::para_head(&id_a), Some(vec![1, 2, 3].into())); + assert_eq!(paras::Heads::::get(&id_a), Some(vec![1, 2, 3].into())); }); } @@ -377,16 +386,16 @@ fn note_past_code_sets_up_pruning_correctly() { let id_a = ParaId::from(0u32); let id_b = ParaId::from(1u32); - Paras::note_past_code(id_a, 10, 12, ValidationCode(vec![1, 2, 3]).hash()); - Paras::note_past_code(id_b, 20, 23, ValidationCode(vec![4, 5, 6]).hash()); + Paras::note_past_code(id_a, 10, 12, test_validation_code_1().hash()); + Paras::note_past_code(id_b, 20, 23, test_validation_code_2().hash()); assert_eq!(PastCodePruning::::get(), vec![(id_a, 12), (id_b, 23)]); assert_eq!( - Paras::past_code_meta(&id_a), + paras::PastCodeMeta::::get(&id_a), ParaPastCodeMeta { upgrade_times: vec![upgrade_at(10, 12)], last_pruned: None } ); assert_eq!( - Paras::past_code_meta(&id_b), + paras::PastCodeMeta::::get(&id_b), ParaPastCodeMeta { upgrade_times: vec![upgrade_at(20, 23)], last_pruned: None } ); }); @@ -398,7 +407,7 @@ fn code_upgrade_applied_after_delay() { let validation_upgrade_delay = 5; let validation_upgrade_cooldown = 10; - let original_code = ValidationCode(vec![1, 2, 3]); + let original_code = test_validation_code_1(); let paras = vec![( 0u32.into(), ParaGenesisArgs { @@ -425,7 +434,7 @@ fn code_upgrade_applied_after_delay() { check_code_is_stored(&original_code); let para_id = ParaId::from(0); - let new_code = ValidationCode(vec![4, 5, 6]); + let new_code = test_validation_code_2(); // Wait for at least one session change to set active validators. const EXPECTED_SESSION: SessionIndex = 1; @@ -440,15 +449,15 @@ fn code_upgrade_applied_after_delay() { para_id, new_code.clone(), 1, - &Configuration::config(), - SetGoAhead::Yes, + &configuration::ActiveConfig::::get(), + UpgradeStrategy::SetGoAheadSignal, ); // Include votes for super-majority. submit_super_majority_pvf_votes(&new_code, EXPECTED_SESSION, true); Paras::note_new_head(para_id, Default::default(), 1); - assert!(Paras::past_code_meta(¶_id).most_recent_change().is_none()); + assert!(paras::PastCodeMeta::::get(¶_id).most_recent_change().is_none()); assert_eq!(FutureCodeUpgrades::::get(¶_id), Some(expected_at)); assert_eq!(FutureCodeHash::::get(¶_id), Some(new_code.hash())); assert_eq!(UpcomingUpgrades::::get(), vec![(para_id, expected_at)]); @@ -467,7 +476,7 @@ fn code_upgrade_applied_after_delay() { { Paras::note_new_head(para_id, Default::default(), expected_at - 1); - assert!(Paras::past_code_meta(¶_id).most_recent_change().is_none()); + assert!(paras::PastCodeMeta::::get(¶_id).most_recent_change().is_none()); assert_eq!(FutureCodeUpgrades::::get(¶_id), Some(expected_at)); assert_eq!(FutureCodeHash::::get(¶_id), Some(new_code.hash())); assert_eq!(UpgradeGoAheadSignal::::get(¶_id), Some(UpgradeGoAhead::GoAhead)); @@ -483,7 +492,10 @@ fn code_upgrade_applied_after_delay() { { Paras::note_new_head(para_id, Default::default(), expected_at); - assert_eq!(Paras::past_code_meta(¶_id).most_recent_change(), Some(expected_at)); + assert_eq!( + paras::PastCodeMeta::::get(¶_id).most_recent_change(), + Some(expected_at) + ); assert_eq!( PastCodeHash::::get(&(para_id, expected_at)), Some(original_code.hash()), @@ -511,12 +523,12 @@ fn code_upgrade_applied_after_delay() { } #[test] -fn code_upgrade_applied_without_setting_go_ahead_signal() { +fn upgrade_strategy_apply_at_expected_block_works() { let code_retention_period = 10; let validation_upgrade_delay = 5; let validation_upgrade_cooldown = 10; - let original_code = ValidationCode(vec![1, 2, 3]); + let original_code = test_validation_code_1(); let paras = vec![( 0u32.into(), ParaGenesisArgs { @@ -543,84 +555,52 @@ fn code_upgrade_applied_without_setting_go_ahead_signal() { check_code_is_stored(&original_code); let para_id = ParaId::from(0); - let new_code = ValidationCode(vec![4, 5, 6]); + let new_code = test_validation_code_2(); // Wait for at least one session change to set active validators. const EXPECTED_SESSION: SessionIndex = 1; run_to_block(2, Some(vec![1])); assert_eq!(Paras::current_code(¶_id), Some(original_code.clone())); - let (expected_at, next_possible_upgrade_at) = { - // this parablock is in the context of block 1. - let expected_at = 1 + validation_upgrade_delay; - let next_possible_upgrade_at = 1 + validation_upgrade_cooldown; - // `set_go_ahead` parameter set to `false` which prevents signaling the parachain - // with the `GoAhead` signal. - Paras::schedule_code_upgrade( - para_id, - new_code.clone(), - 1, - &Configuration::config(), - SetGoAhead::No, - ); - // Include votes for super-majority. - submit_super_majority_pvf_votes(&new_code, EXPECTED_SESSION, true); - - Paras::note_new_head(para_id, Default::default(), 1); - - assert!(Paras::past_code_meta(¶_id).most_recent_change().is_none()); - assert_eq!(FutureCodeUpgrades::::get(¶_id), Some(expected_at)); - assert_eq!(FutureCodeHash::::get(¶_id), Some(new_code.hash())); - assert_eq!(UpcomingUpgrades::::get(), vec![]); - assert_eq!(UpgradeCooldowns::::get(), vec![(para_id, next_possible_upgrade_at)]); - assert_eq!(Paras::current_code(¶_id), Some(original_code.clone())); - check_code_is_stored(&original_code); - check_code_is_stored(&new_code); - - (expected_at, next_possible_upgrade_at) - }; + // this parablock is in the context of block 1. + let expected_at = 1 + validation_upgrade_delay; + let next_possible_upgrade_at = 1 + validation_upgrade_cooldown; + // `set_go_ahead` parameter set to `false` which prevents signaling the parachain + // with the `GoAhead` signal. + Paras::schedule_code_upgrade( + para_id, + new_code.clone(), + 1, + &configuration::ActiveConfig::::get(), + UpgradeStrategy::ApplyAtExpectedBlock, + ); + // Include votes for super-majority. + submit_super_majority_pvf_votes(&new_code, EXPECTED_SESSION, true); + assert!(FutureCodeUpgradesAt::::get().iter().any(|(id, _)| *id == para_id)); + // Going to the expected block triggers the upgrade directly. run_to_block(expected_at, None); - // the candidate is in the context of the parent of `expected_at`, - // thus does not trigger the code upgrade. However, now the `UpgradeGoAheadSignal` - // should not be set. - { - Paras::note_new_head(para_id, Default::default(), expected_at - 1); - - assert!(Paras::past_code_meta(¶_id).most_recent_change().is_none()); - assert_eq!(FutureCodeUpgrades::::get(¶_id), Some(expected_at)); - assert_eq!(FutureCodeHash::::get(¶_id), Some(new_code.hash())); - assert!(UpgradeGoAheadSignal::::get(¶_id).is_none()); - assert_eq!(Paras::current_code(¶_id), Some(original_code.clone())); - check_code_is_stored(&original_code); - check_code_is_stored(&new_code); - } - - run_to_block(expected_at + 1, None); - - // the candidate is in the context of `expected_at`, and triggers - // the upgrade. - { - Paras::note_new_head(para_id, Default::default(), expected_at); + // Reporting a head doesn't change anything. + Paras::note_new_head(para_id, Default::default(), expected_at - 1); - assert_eq!(Paras::past_code_meta(¶_id).most_recent_change(), Some(expected_at)); - assert_eq!( - PastCodeHash::::get(&(para_id, expected_at)), - Some(original_code.hash()), - ); - assert!(FutureCodeUpgrades::::get(¶_id).is_none()); - assert!(FutureCodeHash::::get(¶_id).is_none()); - assert!(UpgradeGoAheadSignal::::get(¶_id).is_none()); - assert_eq!(Paras::current_code(¶_id), Some(new_code.clone())); - assert_eq!( - UpgradeRestrictionSignal::::get(¶_id), - Some(UpgradeRestriction::Present), - ); - assert_eq!(UpgradeCooldowns::::get(), vec![(para_id, next_possible_upgrade_at)]); - check_code_is_stored(&original_code); - check_code_is_stored(&new_code); - } + assert_eq!( + paras::PastCodeMeta::::get(¶_id).most_recent_change(), + Some(expected_at) + ); + assert_eq!(PastCodeHash::::get(&(para_id, expected_at)), Some(original_code.hash())); + assert!(FutureCodeUpgrades::::get(¶_id).is_none()); + assert!(FutureCodeUpgradesAt::::get().iter().all(|(id, _)| *id != para_id)); + assert!(FutureCodeHash::::get(¶_id).is_none()); + assert!(UpgradeGoAheadSignal::::get(¶_id).is_none()); + assert_eq!(Paras::current_code(¶_id), Some(new_code.clone())); + assert_eq!( + UpgradeRestrictionSignal::::get(¶_id), + Some(UpgradeRestriction::Present), + ); + assert_eq!(UpgradeCooldowns::::get(), vec![(para_id, next_possible_upgrade_at)]); + check_code_is_stored(&original_code); + check_code_is_stored(&new_code); run_to_block(next_possible_upgrade_at + 1, None); @@ -637,7 +617,7 @@ fn code_upgrade_applied_after_delay_even_when_late() { let validation_upgrade_delay = 5; let validation_upgrade_cooldown = 10; - let original_code = ValidationCode(vec![1, 2, 3]); + let original_code = test_validation_code_1(); let paras = vec![( 0u32.into(), ParaGenesisArgs { @@ -662,7 +642,7 @@ fn code_upgrade_applied_after_delay_even_when_late() { new_test_ext(genesis_config).execute_with(|| { let para_id = ParaId::from(0); - let new_code = ValidationCode(vec![4, 5, 6]); + let new_code = test_validation_code_2(); // Wait for at least one session change to set active validators. const EXPECTED_SESSION: SessionIndex = 1; @@ -677,15 +657,15 @@ fn code_upgrade_applied_after_delay_even_when_late() { para_id, new_code.clone(), 1, - &Configuration::config(), - SetGoAhead::Yes, + &configuration::ActiveConfig::::get(), + UpgradeStrategy::SetGoAheadSignal, ); // Include votes for super-majority. submit_super_majority_pvf_votes(&new_code, EXPECTED_SESSION, true); Paras::note_new_head(para_id, Default::default(), 1); - assert!(Paras::past_code_meta(¶_id).most_recent_change().is_none()); + assert!(paras::PastCodeMeta::::get(¶_id).most_recent_change().is_none()); assert_eq!(FutureCodeUpgrades::::get(¶_id), Some(expected_at)); assert_eq!(FutureCodeHash::::get(¶_id), Some(new_code.hash())); assert_eq!(UpcomingUpgrades::::get(), vec![(para_id, expected_at)]); @@ -706,7 +686,10 @@ fn code_upgrade_applied_after_delay_even_when_late() { Paras::note_new_head(para_id, Default::default(), expected_at + 4); - assert_eq!(Paras::past_code_meta(¶_id).most_recent_change(), Some(expected_at)); + assert_eq!( + paras::PastCodeMeta::::get(¶_id).most_recent_change(), + Some(expected_at) + ); assert_eq!( PastCodeHash::::get(&(para_id, expected_at)), @@ -750,8 +733,8 @@ fn submit_code_change_when_not_allowed_is_err() { new_test_ext(genesis_config).execute_with(|| { let para_id = ParaId::from(0); - let new_code = ValidationCode(vec![4, 5, 6]); - let newer_code = ValidationCode(vec![4, 5, 6, 7]); + let new_code = test_validation_code_1(); + let newer_code = test_validation_code_2(); // Wait for at least one session change to set active validators. const EXPECTED_SESSION: SessionIndex = 1; @@ -761,8 +744,8 @@ fn submit_code_change_when_not_allowed_is_err() { para_id, new_code.clone(), 1, - &Configuration::config(), - SetGoAhead::Yes, + &configuration::ActiveConfig::::get(), + UpgradeStrategy::SetGoAheadSignal, ); // Include votes for super-majority. submit_super_majority_pvf_votes(&new_code, EXPECTED_SESSION, true); @@ -779,8 +762,8 @@ fn submit_code_change_when_not_allowed_is_err() { para_id, newer_code.clone(), 2, - &Configuration::config(), - SetGoAhead::Yes, + &configuration::ActiveConfig::::get(), + UpgradeStrategy::SetGoAheadSignal, ); assert_eq!( FutureCodeUpgrades::::get(¶_id), @@ -832,8 +815,8 @@ fn upgrade_restriction_elapsed_doesnt_mean_can_upgrade() { new_test_ext(genesis_config).execute_with(|| { let para_id = 0u32.into(); - let new_code = ValidationCode(vec![4, 5, 6]); - let newer_code = ValidationCode(vec![4, 5, 6, 7]); + let new_code = test_validation_code_1(); + let newer_code = test_validation_code_2(); // Wait for at least one session change to set active validators. const EXPECTED_SESSION: SessionIndex = 1; @@ -843,8 +826,8 @@ fn upgrade_restriction_elapsed_doesnt_mean_can_upgrade() { para_id, new_code.clone(), 0, - &Configuration::config(), - SetGoAhead::Yes, + &configuration::ActiveConfig::::get(), + UpgradeStrategy::SetGoAheadSignal, ); // Include votes for super-majority. submit_super_majority_pvf_votes(&new_code, EXPECTED_SESSION, true); @@ -868,8 +851,8 @@ fn upgrade_restriction_elapsed_doesnt_mean_can_upgrade() { para_id, newer_code.clone(), 30, - &Configuration::config(), - SetGoAhead::Yes, + &configuration::ActiveConfig::::get(), + UpgradeStrategy::SetGoAheadSignal, ); assert_eq!(FutureCodeUpgrades::::get(¶_id), Some(0 + validation_upgrade_delay)); }); @@ -880,7 +863,7 @@ fn full_parachain_cleanup_storage() { let code_retention_period = 20; let validation_upgrade_delay = 1 + 5; - let original_code = ValidationCode(vec![1, 2, 3]); + let original_code = test_validation_code_1(); let paras = vec![( 0u32.into(), ParaGenesisArgs { @@ -899,7 +882,10 @@ fn full_parachain_cleanup_storage() { minimum_validation_upgrade_delay: 2, // Those are not relevant to this test. However, HostConfiguration is still a // subject for the consistency check. - paras_availability_period: 1, + scheduler_params: SchedulerParams { + paras_availability_period: 1, + ..Default::default() + }, ..Default::default() }, }, @@ -910,7 +896,7 @@ fn full_parachain_cleanup_storage() { check_code_is_stored(&original_code); let para_id = ParaId::from(0); - let new_code = ValidationCode(vec![4, 5, 6]); + let new_code = test_validation_code_2(); // Wait for at least one session change to set active validators. const EXPECTED_SESSION: SessionIndex = 1; @@ -926,15 +912,15 @@ fn full_parachain_cleanup_storage() { para_id, new_code.clone(), 1, - &Configuration::config(), - SetGoAhead::Yes, + &configuration::ActiveConfig::::get(), + UpgradeStrategy::SetGoAheadSignal, ); // Include votes for super-majority. submit_super_majority_pvf_votes(&new_code, EXPECTED_SESSION, true); Paras::note_new_head(para_id, Default::default(), 1); - assert!(Paras::past_code_meta(¶_id).most_recent_change().is_none()); + assert!(paras::PastCodeMeta::::get(¶_id).most_recent_change().is_none()); assert_eq!(FutureCodeUpgrades::::get(¶_id), Some(expected_at)); assert_eq!(FutureCodeHash::::get(¶_id), Some(new_code.hash())); assert_eq!(Paras::current_code(¶_id), Some(original_code.clone())); @@ -949,7 +935,7 @@ fn full_parachain_cleanup_storage() { // For that run to block #7 and submit a new head. assert_eq!(expected_at, 7); run_to_block(7, None); - assert_eq!(>::block_number(), 7); + assert_eq!(frame_system::Pallet::::block_number(), 7); Paras::note_new_head(para_id, Default::default(), expected_at); assert_ok!(Paras::schedule_para_cleanup(para_id)); @@ -963,7 +949,7 @@ fn full_parachain_cleanup_storage() { // // Why 7 and 8? See above, the clean up scheduled above was processed at the block 8. // The initial upgrade was enacted at the block 7. - assert_eq!(Paras::past_code_meta(¶_id).most_recent_change(), Some(8)); + assert_eq!(paras::PastCodeMeta::::get(¶_id).most_recent_change(), Some(8)); assert_eq!(PastCodeHash::::get(&(para_id, 8)), Some(new_code.hash())); assert_eq!(PastCodePruning::::get(), vec![(para_id, 7), (para_id, 8)]); check_code_is_stored(&original_code); @@ -980,7 +966,7 @@ fn full_parachain_cleanup_storage() { run_to_block(cleaned_up_at, None); // now the final cleanup: last past code cleaned up, and this triggers meta cleanup. - assert_eq!(Paras::past_code_meta(¶_id), Default::default()); + assert_eq!(paras::PastCodeMeta::::get(¶_id), Default::default()); assert!(PastCodeHash::::get(&(para_id, 7)).is_none()); assert!(PastCodeHash::::get(&(para_id, 8)).is_none()); assert!(PastCodePruning::::get().is_empty()); @@ -993,8 +979,8 @@ fn full_parachain_cleanup_storage() { fn cannot_offboard_ongoing_pvf_check() { let para_id = ParaId::from(0); - let existing_code: ValidationCode = vec![1, 2, 3].into(); - let new_code: ValidationCode = vec![3, 2, 1].into(); + let existing_code = test_validation_code_1(); + let new_code = test_validation_code_2(); let paras = vec![( para_id, @@ -1022,8 +1008,8 @@ fn cannot_offboard_ongoing_pvf_check() { para_id, new_code.clone(), RELAY_PARENT, - &Configuration::config(), - SetGoAhead::Yes, + &configuration::ActiveConfig::::get(), + UpgradeStrategy::SetGoAheadSignal, ); assert!(!Paras::pvfs_require_precheck().is_empty()); @@ -1117,7 +1103,7 @@ fn para_incoming_at_session() { // run to block without session change. run_to_block(2, None); - assert_eq!(Paras::parachains(), Vec::new()); + assert_eq!(paras::Parachains::::get(), Vec::new()); assert_eq!(ActionsQueue::::get(Paras::scheduled_session()), vec![c, b, a],); // Lifecycle is tracked correctly @@ -1128,7 +1114,7 @@ fn para_incoming_at_session() { // Two sessions pass, so action queue is triggered run_to_block(4, Some(vec![3, 4])); - assert_eq!(Paras::parachains(), vec![c, b]); + assert_eq!(paras::Parachains::::get(), vec![c, b]); assert_eq!(ActionsQueue::::get(Paras::scheduled_session()), Vec::new()); // Lifecycle is tracked correctly @@ -1152,7 +1138,7 @@ fn code_hash_at_returns_up_to_end_of_code_retention_period() { ParaGenesisArgs { para_kind: ParaKind::Parachain, genesis_head: dummy_head_data(), - validation_code: vec![1, 2, 3].into(), + validation_code: test_validation_code_1(), }, )]; @@ -1174,14 +1160,14 @@ fn code_hash_at_returns_up_to_end_of_code_retention_period() { const EXPECTED_SESSION: SessionIndex = 1; let para_id = ParaId::from(0); - let old_code: ValidationCode = vec![1, 2, 3].into(); - let new_code: ValidationCode = vec![4, 5, 6].into(); + let old_code = test_validation_code_1(); + let new_code = test_validation_code_2(); Paras::schedule_code_upgrade( para_id, new_code.clone(), 0, - &Configuration::config(), - SetGoAhead::Yes, + &configuration::ActiveConfig::::get(), + UpgradeStrategy::SetGoAheadSignal, ); // Include votes for super-majority. submit_super_majority_pvf_votes(&new_code, EXPECTED_SESSION, true); @@ -1194,32 +1180,35 @@ fn code_hash_at_returns_up_to_end_of_code_retention_period() { run_to_block(10, None); Paras::note_new_head(para_id, Default::default(), 7); - assert_eq!(Paras::past_code_meta(¶_id).upgrade_times, vec![upgrade_at(4, 10)]); + assert_eq!( + paras::PastCodeMeta::::get(¶_id).upgrade_times, + vec![upgrade_at(4, 10)] + ); assert_eq!(Paras::current_code(¶_id), Some(new_code.clone())); - // Make sure that the old code is available **before** the code retion period passes. + // Make sure that the old code is available **before** the code retention period passes. run_to_block(10 + code_retention_period, None); - assert_eq!(Paras::code_by_hash(&old_code.hash()), Some(old_code.clone())); - assert_eq!(Paras::code_by_hash(&new_code.hash()), Some(new_code.clone())); + assert_eq!(paras::CodeByHash::::get(&old_code.hash()), Some(old_code.clone())); + assert_eq!(paras::CodeByHash::::get(&new_code.hash()), Some(new_code.clone())); run_to_block(10 + code_retention_period + 1, None); // code entry should be pruned now. assert_eq!( - Paras::past_code_meta(¶_id), + paras::PastCodeMeta::::get(¶_id), ParaPastCodeMeta { upgrade_times: Vec::new(), last_pruned: Some(10) }, ); - assert_eq!(Paras::code_by_hash(&old_code.hash()), None); // pruned :( - assert_eq!(Paras::code_by_hash(&new_code.hash()), Some(new_code.clone())); + assert_eq!(paras::CodeByHash::::get(&old_code.hash()), None); // pruned :( + assert_eq!(paras::CodeByHash::::get(&new_code.hash()), Some(new_code.clone())); }); } #[test] fn code_ref_is_cleaned_correctly() { new_test_ext(Default::default()).execute_with(|| { - let code: ValidationCode = vec![1, 2, 3].into(); + let code = test_validation_code_1(); Paras::increase_code_ref(&code.hash(), &code); Paras::increase_code_ref(&code.hash(), &code); @@ -1244,8 +1233,8 @@ fn pvf_check_coalescing_onboarding_and_upgrade() { let a = ParaId::from(111); let b = ParaId::from(222); - let existing_code: ValidationCode = vec![1, 2, 3].into(); - let validation_code: ValidationCode = vec![3, 2, 1].into(); + let existing_code = test_validation_code_1(); + let validation_code = test_validation_code_2(); let paras = vec![( a, @@ -1289,8 +1278,8 @@ fn pvf_check_coalescing_onboarding_and_upgrade() { a, validation_code.clone(), RELAY_PARENT, - &Configuration::config(), - SetGoAhead::Yes, + &configuration::ActiveConfig::::get(), + UpgradeStrategy::SetGoAheadSignal, ); assert!(!Paras::pvfs_require_precheck().is_empty()); @@ -1320,7 +1309,7 @@ fn pvf_check_coalescing_onboarding_and_upgrade() { fn pvf_check_onboarding_reject_on_expiry() { let pvf_voting_ttl = 2; let a = ParaId::from(111); - let validation_code: ValidationCode = vec![3, 2, 1].into(); + let validation_code = test_validation_code_1(); let genesis_config = MockGenesisConfig { configuration: crate::configuration::GenesisConfig { @@ -1368,8 +1357,8 @@ fn pvf_check_onboarding_reject_on_expiry() { #[test] fn pvf_check_upgrade_reject() { let a = ParaId::from(111); - let old_code: ValidationCode = vec![1, 2, 3].into(); - let new_code: ValidationCode = vec![3, 2, 1].into(); + let old_code = test_validation_code_1(); + let new_code = test_validation_code_2(); let paras = vec![( a, @@ -1399,8 +1388,8 @@ fn pvf_check_upgrade_reject() { a, new_code.clone(), RELAY_PARENT, - &Configuration::config(), - SetGoAhead::Yes, + &configuration::ActiveConfig::::get(), + UpgradeStrategy::SetGoAheadSignal, ); check_code_is_stored(&new_code); @@ -1437,8 +1426,8 @@ fn pvf_check_upgrade_reject() { #[test] fn pvf_check_submit_vote() { - let code_a: ValidationCode = vec![3, 2, 1].into(); - let code_b: ValidationCode = vec![1, 2, 3].into(); + let code_a = test_validation_code_1(); + let code_b = test_validation_code_2(); let check = |stmt: PvfCheckStatement| -> (Result<_, _>, Result<_, _>) { let validators = &[ @@ -1554,8 +1543,8 @@ fn pvf_check_submit_vote() { #[test] fn include_pvf_check_statement_refunds_weight() { let a = ParaId::from(111); - let old_code: ValidationCode = vec![1, 2, 3].into(); - let new_code: ValidationCode = vec![3, 2, 1].into(); + let old_code = test_validation_code_1(); + let new_code = test_validation_code_2(); let paras = vec![( a, @@ -1585,8 +1574,8 @@ fn include_pvf_check_statement_refunds_weight() { a, new_code.clone(), RELAY_PARENT, - &Configuration::config(), - SetGoAhead::Yes, + &configuration::ActiveConfig::::get(), + UpgradeStrategy::SetGoAheadSignal, ); let mut stmts = IntoIterator::into_iter([0, 1, 2, 3]) @@ -1620,7 +1609,7 @@ fn include_pvf_check_statement_refunds_weight() { fn add_trusted_validation_code_inserts_with_no_users() { // This test is to ensure that trusted validation code is inserted into the storage // with the reference count equal to 0. - let validation_code = ValidationCode(vec![1, 2, 3]); + let validation_code = test_validation_code_1(); new_test_ext(Default::default()).execute_with(|| { assert_ok!(Paras::add_trusted_validation_code( RuntimeOrigin::root(), @@ -1634,7 +1623,7 @@ fn add_trusted_validation_code_inserts_with_no_users() { fn add_trusted_validation_code_idempotent() { // This test makes sure that calling add_trusted_validation_code twice with the same // parameters is a no-op. - let validation_code = ValidationCode(vec![1, 2, 3]); + let validation_code = test_validation_code_1(); new_test_ext(Default::default()).execute_with(|| { assert_ok!(Paras::add_trusted_validation_code( RuntimeOrigin::root(), @@ -1653,7 +1642,7 @@ fn add_trusted_validation_code_idempotent() { fn poke_unused_validation_code_removes_code_cleanly() { // This test makes sure that calling poke_unused_validation_code with a code that is currently // in the storage but has no users will remove it cleanly from the storage. - let validation_code = ValidationCode(vec![1, 2, 3]); + let validation_code = test_validation_code_1(); new_test_ext(Default::default()).execute_with(|| { assert_ok!(Paras::add_trusted_validation_code( RuntimeOrigin::root(), @@ -1672,7 +1661,7 @@ fn poke_unused_validation_code_removes_code_cleanly() { #[test] fn poke_unused_validation_code_doesnt_remove_code_with_users() { let para_id = 100.into(); - let validation_code = ValidationCode(vec![1, 2, 3]); + let validation_code = test_validation_code_1(); new_test_ext(Default::default()).execute_with(|| { // First we add the code to the storage. assert_ok!(Paras::add_trusted_validation_code( @@ -1686,8 +1675,8 @@ fn poke_unused_validation_code_doesnt_remove_code_with_users() { para_id, validation_code.clone(), 1, - &Configuration::config(), - SetGoAhead::Yes, + &configuration::ActiveConfig::::get(), + UpgradeStrategy::SetGoAheadSignal, ); Paras::note_new_head(para_id, HeadData::default(), 1); @@ -1704,11 +1693,11 @@ fn poke_unused_validation_code_doesnt_remove_code_with_users() { #[test] fn increase_code_ref_doesnt_have_allergy_on_add_trusted_validation_code() { - // Verify that accidential calling of increase_code_ref or decrease_code_ref does not lead + // Verify that accidental calling of increase_code_ref or decrease_code_ref does not lead // to a disaster. // NOTE that this test is extra paranoid, as it is not really possible to hit // `decrease_code_ref` without calling `increase_code_ref` first. - let code = ValidationCode(vec![1, 2, 3]); + let code = test_validation_code_1(); new_test_ext(Default::default()).execute_with(|| { assert_ok!(Paras::add_trusted_validation_code(RuntimeOrigin::root(), code.clone())); @@ -1732,7 +1721,7 @@ fn add_trusted_validation_code_insta_approval() { // `add_trusted_validation_code` and uses the `CodeByHash::contains_key` which is what // `add_trusted_validation_code` uses. let para_id = 100.into(); - let validation_code = ValidationCode(vec![1, 2, 3]); + let validation_code = test_validation_code_1(); let validation_upgrade_delay = 25; let minimum_validation_upgrade_delay = 2; let genesis_config = MockGenesisConfig { @@ -1757,8 +1746,8 @@ fn add_trusted_validation_code_insta_approval() { para_id, validation_code.clone(), 1, - &Configuration::config(), - SetGoAhead::Yes, + &configuration::ActiveConfig::::get(), + UpgradeStrategy::SetGoAheadSignal, ); Paras::note_new_head(para_id, HeadData::default(), 1); @@ -1779,7 +1768,7 @@ fn add_trusted_validation_code_enacts_existing_pvf_vote() { // already going through PVF pre-checking voting will conclude the voting and enact the // code upgrade. let para_id = 100.into(); - let validation_code = ValidationCode(vec![1, 2, 3]); + let validation_code = test_validation_code_1(); let validation_upgrade_delay = 25; let minimum_validation_upgrade_delay = 2; let genesis_config = MockGenesisConfig { @@ -1799,8 +1788,8 @@ fn add_trusted_validation_code_enacts_existing_pvf_vote() { para_id, validation_code.clone(), 1, - &Configuration::config(), - SetGoAhead::Yes, + &configuration::ActiveConfig::::get(), + UpgradeStrategy::SetGoAheadSignal, ); Paras::note_new_head(para_id, HeadData::default(), 1); @@ -1868,7 +1857,7 @@ fn verify_para_head_is_externally_accessible() { #[test] fn most_recent_context() { - let validation_code: ValidationCode = vec![1, 2, 3].into(); + let validation_code = test_validation_code_1(); let genesis_config = MockGenesisConfig::default(); @@ -1878,7 +1867,7 @@ fn most_recent_context() { let para_id = ParaId::from(111); - assert_eq!(Paras::para_most_recent_context(para_id), None); + assert_eq!(paras::MostRecentContext::::get(para_id), None); assert_ok!(Paras::schedule_para_initialize( para_id, @@ -1897,16 +1886,16 @@ fn most_recent_context() { // Double-check the para is onboarded, the context is set to the recent block. assert_eq!(ParaLifecycles::::get(¶_id), Some(ParaLifecycle::Parachain)); - assert_eq!(Paras::para_most_recent_context(para_id), Some(0)); + assert_eq!(paras::MostRecentContext::::get(para_id), Some(0)); // Progress para to the new head and check that the recent context is updated. Paras::note_new_head(para_id, vec![4, 5, 6].into(), 3); - assert_eq!(Paras::para_most_recent_context(para_id), Some(3)); + assert_eq!(paras::MostRecentContext::::get(para_id), Some(3)); // Finally, offboard the para and expect the context to be cleared. assert_ok!(Paras::schedule_para_cleanup(para_id)); run_to_block(6, Some(vec![5, 6])); - assert_eq!(Paras::para_most_recent_context(para_id), None); + assert_eq!(paras::MostRecentContext::::get(para_id), None); }) } diff --git a/polkadot/runtime/parachains/src/paras_inherent/benchmarking.rs b/polkadot/runtime/parachains/src/paras_inherent/benchmarking.rs index 0f6b23ae1b39213f8afbd37798f8f7f31a024cf9..e643888ae29a1464a20130dc16dc756c95799949 100644 --- a/polkadot/runtime/parachains/src/paras_inherent/benchmarking.rs +++ b/polkadot/runtime/parachains/src/paras_inherent/benchmarking.rs @@ -20,7 +20,7 @@ use frame_benchmarking::{benchmarks, impl_benchmark_test_suite}; use frame_system::RawOrigin; use sp_std::{cmp::min, collections::btree_map::BTreeMap}; -use primitives::v6::GroupIndex; +use primitives::v7::GroupIndex; use crate::builder::BenchBuilder; @@ -65,7 +65,7 @@ benchmarks! { .collect(); let scenario = BenchBuilder::::new() - .set_backed_and_concluding_cores(cores_with_backed) + .set_backed_and_concluding_paras(cores_with_backed) .build(); let mut benchmark = scenario.data.clone(); @@ -110,7 +110,7 @@ benchmarks! { .collect(); let scenario = BenchBuilder::::new() - .set_backed_and_concluding_cores(cores_with_backed.clone()) + .set_backed_and_concluding_paras(cores_with_backed.clone()) .build(); let mut benchmark = scenario.data.clone(); @@ -120,7 +120,7 @@ benchmarks! { // with `v` validity votes. // let votes = v as usize; let votes = min(scheduler::Pallet::::group_validators(GroupIndex::from(0)).unwrap().len(), v as usize); - assert_eq!(benchmark.backed_candidates.get(0).unwrap().validity_votes.len(), votes); + assert_eq!(benchmark.backed_candidates.get(0).unwrap().validity_votes().len(), votes); benchmark.bitfields.clear(); benchmark.disputes.clear(); @@ -145,10 +145,6 @@ benchmarks! { assert_eq!(backing_validators.1.len(), votes); } - assert_eq!( - inclusion::PendingAvailabilityCommitments::::iter().count(), - cores_with_backed.len() - ); assert_eq!( inclusion::PendingAvailability::::iter().count(), cores_with_backed.len() @@ -157,7 +153,7 @@ benchmarks! { enter_backed_candidate_code_upgrade { // For now we always assume worst case code size. In the future we could vary over this. - let v = crate::configuration::Pallet::::config().max_code_size; + let v = crate::configuration::ActiveConfig::::get().max_code_size; let cores_with_backed: BTreeMap<_, _> = vec![(0, BenchBuilder::::fallback_min_validity_votes())] @@ -165,7 +161,7 @@ benchmarks! { .collect(); let scenario = BenchBuilder::::new() - .set_backed_and_concluding_cores(cores_with_backed.clone()) + .set_backed_and_concluding_paras(cores_with_backed.clone()) .set_code_upgrade(v) .build(); @@ -177,7 +173,7 @@ benchmarks! { // There is 1 backed assert_eq!(benchmark.backed_candidates.len(), 1); assert_eq!( - benchmark.backed_candidates.get(0).unwrap().validity_votes.len(), + benchmark.backed_candidates.get(0).unwrap().validity_votes().len(), votes, ); @@ -209,10 +205,6 @@ benchmarks! { ); } - assert_eq!( - inclusion::PendingAvailabilityCommitments::::iter().count(), - cores_with_backed.len() - ); assert_eq!( inclusion::PendingAvailability::::iter().count(), cores_with_backed.len() diff --git a/polkadot/runtime/parachains/src/paras_inherent/mod.rs b/polkadot/runtime/parachains/src/paras_inherent/mod.rs index 81e092f0a991cd216bac3c1d8e48ae8bcea59144..2c6c48acc6d47d0e8176fe0b4702b9cfa6781af7 100644 --- a/polkadot/runtime/parachains/src/paras_inherent/mod.rs +++ b/polkadot/runtime/parachains/src/paras_inherent/mod.rs @@ -24,8 +24,7 @@ use crate::{ configuration, disputes::DisputesHandler, - inclusion, - inclusion::CandidateCheckContext, + inclusion::{self, CandidateCheckContext}, initializer, metrics::METRICS, paras, @@ -35,6 +34,7 @@ use crate::{ }; use bitvec::prelude::BitVec; use frame_support::{ + defensive, dispatch::{DispatchErrorWithPostInfo, PostDispatchInfo}, inherent::{InherentData, InherentIdentifier, MakeFatalError, ProvideInherent}, pallet_prelude::*, @@ -43,15 +43,14 @@ use frame_support::{ use frame_system::pallet_prelude::*; use pallet_babe::{self, ParentBlockRandomness}; use primitives::{ - effective_minimum_backing_votes, BackedCandidate, CandidateHash, CandidateReceipt, - CheckedDisputeStatementSet, CheckedMultiDisputeStatementSet, CoreIndex, DisputeStatementSet, - InherentData as ParachainsInherentData, MultiDisputeStatementSet, ScrapedOnChainVotes, - SessionIndex, SignedAvailabilityBitfields, SigningContext, UncheckedSignedAvailabilityBitfield, - UncheckedSignedAvailabilityBitfields, ValidatorId, ValidatorIndex, ValidityAttestation, - PARACHAINS_INHERENT_IDENTIFIER, + effective_minimum_backing_votes, node_features::FeatureIndex, BackedCandidate, CandidateHash, + CandidateReceipt, CheckedDisputeStatementSet, CheckedMultiDisputeStatementSet, CoreIndex, + DisputeStatementSet, HeadData, InherentData as ParachainsInherentData, + MultiDisputeStatementSet, ScrapedOnChainVotes, SessionIndex, SignedAvailabilityBitfields, + SigningContext, UncheckedSignedAvailabilityBitfield, UncheckedSignedAvailabilityBitfields, + ValidatorId, ValidatorIndex, ValidityAttestation, PARACHAINS_INHERENT_IDENTIFIER, }; use rand::{seq::SliceRandom, SeedableRng}; - use scale_info::TypeInfo; use sp_runtime::traits::{Header as HeaderT, One}; use sp_std::{ @@ -135,16 +134,13 @@ pub mod pallet { /// The hash of the submitted parent header doesn't correspond to the saved block hash of /// the parent. InvalidParentHeader, - /// Disputed candidate that was concluded invalid. - CandidateConcludedInvalid, /// The data given to the inherent will result in an overweight block. InherentOverweight, - /// The ordering of dispute statements was invalid. - DisputeStatementsUnsortedOrDuplicates, - /// A dispute statement was invalid. - DisputeInvalid, - /// A candidate was backed by a disabled validator - BackedByDisabled, + /// A candidate was filtered during inherent execution. This should have only been done + /// during creation. + CandidatesFilteredDuringExecution, + /// Too many candidates supplied. + UnscheduledCandidate, } /// Whether the paras inherent was included within this block. @@ -158,8 +154,7 @@ pub mod pallet { /// Scraped on chain data for extracting resolved disputes as well as backing votes. #[pallet::storage] - #[pallet::getter(fn on_chain_votes)] - pub(crate) type OnChainVotes = StorageValue<_, ScrapedOnChainVotes>; + pub type OnChainVotes = StorageValue<_, ScrapedOnChainVotes>; /// Update the disputes statements set part of the on-chain votes. pub(crate) fn set_scrapable_on_chain_disputes( @@ -232,35 +227,6 @@ pub mod pallet { } } - /// Collect all freed cores based on storage data. (i.e. append cores freed from timeouts to - /// the given `freed_concluded`). - /// - /// The parameter `freed_concluded` contains all core indicies that became - /// free due to candidate that became available. - pub(crate) fn collect_all_freed_cores( - freed_concluded: I, - ) -> BTreeMap - where - I: core::iter::IntoIterator, - T: Config, - { - // Handle timeouts for any availability core work. - let freed_timeout = if >::availability_timeout_check_required() { - let pred = >::availability_timeout_predicate(); - >::collect_pending(pred) - } else { - Vec::new() - }; - - // Schedule paras again, given freed cores, and reasons for freeing. - let freed = freed_concluded - .into_iter() - .map(|(c, _hash)| (c, FreedReason::Concluded)) - .chain(freed_timeout.into_iter().map(|c| (c, FreedReason::TimedOut))) - .collect::>(); - freed - } - #[pallet::call] impl Pallet { /// Enter the paras inherent. This will process bitfields and backed candidates. @@ -316,7 +282,7 @@ impl Pallet { /// Process inherent data. /// /// The given inherent data is processed and state is altered accordingly. If any data could - /// not be applied (inconsitencies, weight limit, ...) it is removed. + /// not be applied (inconsistencies, weight limit, ...) it is removed. /// /// When called from `create_inherent` the `context` must be set to /// `ProcessInherentDataContext::ProvideInherent` so it guarantees the invariant that inherent @@ -351,15 +317,15 @@ impl Pallet { disputes.len() ); - let parent_hash = >::parent_hash(); + let parent_hash = frame_system::Pallet::::parent_hash(); ensure!( parent_header.hash().as_ref() == parent_hash.as_ref(), Error::::InvalidParentHeader, ); - let now = >::block_number(); - let config = >::config(); + let now = frame_system::Pallet::::block_number(); + let config = configuration::ActiveConfig::::get(); // Before anything else, update the allowed relay-parents. { @@ -375,7 +341,7 @@ impl Pallet { ); }); } - let allowed_relay_parents = >::allowed_relay_parents(); + let allowed_relay_parents = shared::AllowedRelayParents::::get(); let candidates_weight = backed_candidates_weight::(&backed_candidates); let bitfields_weight = signed_bitfields_weight::(&bitfields); @@ -388,9 +354,9 @@ impl Pallet { log::debug!(target: LOG_TARGET, "Size before filter: {}, candidates + bitfields: {}, disputes: {}", all_weight_before.proof_size(), candidates_weight.proof_size() + bitfields_weight.proof_size(), disputes_weight.proof_size()); log::debug!(target: LOG_TARGET, "Time weight before filter: {}, candidates + bitfields: {}, disputes: {}", all_weight_before.ref_time(), candidates_weight.ref_time() + bitfields_weight.ref_time(), disputes_weight.ref_time()); - let current_session = >::session_index(); - let expected_bits = >::availability_cores().len(); - let validator_public = shared::Pallet::::active_validator_keys(); + let current_session = shared::CurrentSessionIndex::::get(); + let expected_bits = scheduler::AvailabilityCores::::get().len(); + let validator_public = shared::ActiveValidatorKeys::::get(); // We are assuming (incorrectly) to have all the weight (for the mandatory class or even // full block) available to us. This can lead to slightly overweight blocks, which still @@ -523,7 +489,7 @@ impl Pallet { // Contains the disputes that are concluded in the current session only, // since these are the only ones that are relevant for the occupied cores - // and lightens the load on `collect_disputed` significantly. + // and lightens the load on `free_disputed` significantly. // Cores can't be occupied with candidates of the previous sessions, and only // things with new votes can have just concluded. We only need to collect // cores with disputes that conclude just now, because disputes that @@ -539,21 +505,17 @@ impl Pallet { .map(|(_session, candidate)| candidate) .collect::>(); - let freed_disputed: BTreeMap = - >::collect_disputed(¤t_concluded_invalid_disputes) + // Get the cores freed as a result of concluded invalid candidates. + let (freed_disputed, concluded_invalid_hashes): (Vec, BTreeSet) = + inclusion::Pallet::::free_disputed(¤t_concluded_invalid_disputes) .into_iter() - .map(|core| (core, FreedReason::Concluded)) - .collect(); + .unzip(); // Create a bit index from the set of core indices where each index corresponds to // a core index that was freed due to a dispute. // // I.e. 010100 would indicate, the candidates on Core 1 and 3 would be disputed. - let disputed_bitfield = create_disputed_bitfield(expected_bits, freed_disputed.keys()); - - if !freed_disputed.is_empty() { - >::free_cores_and_fill_claimqueue(freed_disputed.clone(), now); - } + let disputed_bitfield = create_disputed_bitfield(expected_bits, freed_disputed.iter()); let bitfields = sanitize_bitfields::( bitfields, @@ -568,11 +530,9 @@ impl Pallet { // Process new availability bitfields, yielding any availability cores whose // work has now concluded. let freed_concluded = - >::update_pending_availability_and_get_freed_cores::<_>( - expected_bits, + inclusion::Pallet::::update_pending_availability_and_get_freed_cores( &validator_public[..], bitfields.clone(), - >::core_para, ); // Inform the disputes module of all included candidates. @@ -582,62 +542,78 @@ impl Pallet { METRICS.on_candidates_included(freed_concluded.len() as u64); - let freed = collect_all_freed_cores::(freed_concluded.iter().cloned()); + // Get the timed out candidates + let freed_timeout = if scheduler::Pallet::::availability_timeout_check_required() { + inclusion::Pallet::::free_timedout() + } else { + Vec::new() + }; - >::free_cores_and_fill_claimqueue(freed, now); - let scheduled = >::scheduled_paras() - .map(|(core_idx, para_id)| (para_id, core_idx)) - .collect(); + if !freed_timeout.is_empty() { + log::debug!(target: LOG_TARGET, "Evicted timed out cores: {:?}", freed_timeout); + } + + // We'll schedule paras again, given freed cores, and reasons for freeing. + let freed = freed_concluded + .into_iter() + .map(|(c, _hash)| (c, FreedReason::Concluded)) + .chain(freed_disputed.into_iter().map(|core| (core, FreedReason::Concluded))) + .chain(freed_timeout.into_iter().map(|c| (c, FreedReason::TimedOut))) + .collect::>(); + scheduler::Pallet::::free_cores_and_fill_claimqueue(freed, now); METRICS.on_candidates_processed_total(backed_candidates.len() as u64); - let SanitizedBackedCandidates { backed_candidates, votes_from_disabled_were_dropped } = - sanitize_backed_candidates::( - backed_candidates, - &allowed_relay_parents, - |candidate_idx: usize, - backed_candidate: &BackedCandidate<::Hash>| - -> bool { - let para_id = backed_candidate.descriptor().para_id; - let prev_context = >::para_most_recent_context(para_id); - let check_ctx = CandidateCheckContext::::new(prev_context); - - // never include a concluded-invalid candidate - current_concluded_invalid_disputes.contains(&backed_candidate.hash()) || - // Instead of checking the candidates with code upgrades twice - // move the checking up here and skip it in the training wheels fallback. - // That way we avoid possible duplicate checks while assuring all - // backed candidates fine to pass on. - // - // NOTE: this is the only place where we check the relay-parent. - check_ctx - .verify_backed_candidate(&allowed_relay_parents, candidate_idx, backed_candidate) - .is_err() - }, - &scheduled, - ); + let core_index_enabled = configuration::ActiveConfig::::get() + .node_features + .get(FeatureIndex::ElasticScalingMVP as usize) + .map(|b| *b) + .unwrap_or(false); + + let mut scheduled: BTreeMap> = BTreeMap::new(); + let mut total_scheduled_cores = 0; - METRICS.on_candidates_sanitized(backed_candidates.len() as u64); + for (core_idx, para_id) in scheduler::Pallet::::scheduled_paras() { + total_scheduled_cores += 1; + scheduled.entry(para_id).or_default().insert(core_idx); + } - // In `Enter` context (invoked during execution) there should be no backing votes from - // disabled validators because they should have been filtered out during inherent data - // preparation (`ProvideInherent` context). Abort in such cases. + let initial_candidate_count = backed_candidates.len(); + let backed_candidates_with_core = sanitize_backed_candidates::( + backed_candidates, + &allowed_relay_parents, + concluded_invalid_hashes, + scheduled, + core_index_enabled, + ); + let count = count_backed_candidates(&backed_candidates_with_core); + + ensure!(count <= total_scheduled_cores, Error::::UnscheduledCandidate); + + METRICS.on_candidates_sanitized(count as u64); + + // In `Enter` context (invoked during execution) no more candidates should be filtered, + // because they have already been filtered during `ProvideInherent` context. Abort in such + // cases. if context == ProcessInherentDataContext::Enter { - ensure!(!votes_from_disabled_were_dropped, Error::::BackedByDisabled); + ensure!( + initial_candidate_count == count, + Error::::CandidatesFilteredDuringExecution + ); } // Process backed candidates according to scheduled cores. let inclusion::ProcessedCandidates::< as HeaderT>::Hash> { core_indices: occupied, candidate_receipt_with_backing_validator_indices, - } = >::process_candidates( + } = inclusion::Pallet::::process_candidates( &allowed_relay_parents, - backed_candidates.clone(), - &scheduled, - >::group_validators, + &backed_candidates_with_core, + scheduler::Pallet::::group_validators, + core_index_enabled, )?; // Note which of the scheduled cores were actually occupied by a backed candidate. - >::occupied(occupied.into_iter().map(|e| (e.0, e.1)).collect()); + scheduler::Pallet::::occupied(occupied.into_iter().map(|e| (e.0, e.1)).collect()); set_scrapable_on_chain_backings::( current_session, @@ -651,8 +627,18 @@ impl Pallet { let bitfields = bitfields.into_iter().map(|v| v.into_unchecked()).collect(); - let processed = - ParachainsInherentData { bitfields, backed_candidates, disputes, parent_header }; + let processed = ParachainsInherentData { + bitfields, + backed_candidates: backed_candidates_with_core.into_iter().fold( + Vec::with_capacity(count), + |mut acc, (_id, candidates)| { + acc.extend(candidates.into_iter().map(|(c, _)| c)); + acc + }, + ), + disputes, + parent_header, + }; Ok((processed, Some(all_weight_after).into())) } } @@ -746,12 +732,12 @@ fn random_sel Weight>( /// are preferred. And for disputes, local and older disputes are preferred (see /// `limit_and_sanitize_disputes`). for backed candidates, since with a increasing number of /// parachains their chances of inclusion become slim. All backed candidates are checked -/// beforehands in `fn create_inherent_inner` which guarantees sanity. +/// beforehand in `fn create_inherent_inner` which guarantees sanity. /// /// Assumes disputes are already filtered by the time this is called. /// /// Returns the total weight consumed by `bitfields` and `candidates`. -fn apply_weight_limit( +pub(crate) fn apply_weight_limit( candidates: &mut Vec::Hash>>, bitfields: &mut UncheckedSignedAvailabilityBitfields, max_consumable_weight: Weight, @@ -768,35 +754,71 @@ fn apply_weight_limit( return total } - // Prefer code upgrades, they tend to be large and hence stand no chance to be picked - // late while maintaining the weight bounds. - let preferred_indices = candidates + // Invariant: block author provides candidate in the order in which they form a chain + // wrt elastic scaling. If the invariant is broken, we'd fail later when filtering candidates + // which are unchained. + + let mut chained_candidates: Vec> = Vec::new(); + let mut current_para_id = None; + + for candidate in sp_std::mem::take(candidates).into_iter() { + let candidate_para_id = candidate.descriptor().para_id; + if Some(candidate_para_id) == current_para_id { + let chain = chained_candidates + .last_mut() + .expect("if the current_para_id is Some, then vec is not empty; qed"); + chain.push(candidate); + } else { + current_para_id = Some(candidate_para_id); + chained_candidates.push(vec![candidate]); + } + } + + // Elastic scaling: we prefer chains that have a code upgrade among the candidates, + // as the candidates containing the upgrade tend to be large and hence stand no chance to + // be picked late while maintaining the weight bounds. + // + // Limitations: For simplicity if total weight of a chain of candidates is larger than + // the remaining weight, the chain will still not be included while it could still be possible + // to include part of that chain. + let preferred_chain_indices = chained_candidates .iter() .enumerate() - .filter_map(|(idx, candidate)| { - candidate.candidate.commitments.new_validation_code.as_ref().map(|_code| idx) + .filter_map(|(idx, candidates)| { + // Check if any of the candidate in chain contains a code upgrade. + if candidates + .iter() + .any(|candidate| candidate.candidate().commitments.new_validation_code.is_some()) + { + Some(idx) + } else { + None + } }) .collect::>(); - // There is weight remaining to be consumed by a subset of candidates + // There is weight remaining to be consumed by a subset of chained candidates // which are going to be picked now. if let Some(max_consumable_by_candidates) = max_consumable_weight.checked_sub(&total_bitfields_weight) { - let (acc_candidate_weight, indices) = - random_sel::::Hash>, _>( + let (acc_candidate_weight, chained_indices) = + random_sel::::Hash>>, _>( rng, - &candidates, - preferred_indices, - |c| backed_candidate_weight::(c), + &chained_candidates, + preferred_chain_indices, + |candidates| backed_candidates_weight::(&candidates), max_consumable_by_candidates, ); - log::debug!(target: LOG_TARGET, "Indices Candidates: {:?}, size: {}", indices, candidates.len()); - candidates.indexed_retain(|idx, _backed_candidate| indices.binary_search(&idx).is_ok()); + log::debug!(target: LOG_TARGET, "Indices Candidates: {:?}, size: {}", chained_indices, candidates.len()); + chained_candidates + .indexed_retain(|idx, _backed_candidates| chained_indices.binary_search(&idx).is_ok()); // pick all bitfields, and // fill the remaining space with candidates let total_consumed = acc_candidate_weight.saturating_add(total_bitfields_weight); + *candidates = chained_candidates.into_iter().flatten().collect::>(); + return total_consumed } @@ -913,77 +935,86 @@ pub(crate) fn sanitize_bitfields( bitfields } -// Result from `sanitize_backed_candidates` -#[derive(Debug, PartialEq)] -struct SanitizedBackedCandidates { - // Sanitized backed candidates. The `Vec` is sorted according to the occupied core index. - backed_candidates: Vec>, - // Set to true if any votes from disabled validators were dropped from the input. - votes_from_disabled_were_dropped: bool, -} - -/// Filter out: -/// 1. any candidates that have a concluded invalid dispute -/// 2. all backing votes from disabled validators -/// 3. any candidates that end up with less than `effective_minimum_backing_votes` backing votes +/// Performs various filtering on the backed candidates inherent data. +/// Must maintain the invariant that the returned candidate collection contains the candidates +/// sorted in dependency order for each para. When doing any filtering, we must therefore drop any +/// subsequent candidates after the filtered one. /// -/// `scheduled` follows the same naming scheme as provided in the -/// guide: Currently `free` but might become `occupied`. -/// For the filtering here the relevant part is only the current `free` -/// state. -/// -/// `candidate_has_concluded_invalid_dispute` must return `true` if the candidate -/// is disputed, false otherwise. The passed `usize` is the candidate index. +/// Filter out: +/// 1. any candidates which don't form a chain with the other candidates of the paraid (even if they +/// do form a chain but are not in the right order). +/// 2. any candidates that have a concluded invalid dispute or who are descendants of a concluded +/// invalid candidate. +/// 3. any unscheduled candidates, as well as candidates whose paraid has multiple cores assigned +/// but have no injected core index. +/// 4. all backing votes from disabled validators +/// 5. any candidates that end up with less than `effective_minimum_backing_votes` backing votes /// -/// Returns struct `SanitizedBackedCandidates` where `backed_candidates` are sorted according to the -/// occupied core index. -fn sanitize_backed_candidates< - T: crate::inclusion::Config, - F: FnMut(usize, &BackedCandidate) -> bool, ->( - mut backed_candidates: Vec>, +/// Returns the scheduled +/// backed candidates which passed filtering, mapped by para id and in the right dependency order. +fn sanitize_backed_candidates( + backed_candidates: Vec>, allowed_relay_parents: &AllowedRelayParentsTracker>, - mut candidate_has_concluded_invalid_dispute_or_is_invalid: F, - scheduled: &BTreeMap, -) -> SanitizedBackedCandidates { - // Remove any candidates that were concluded invalid. - // This does not assume sorting. - backed_candidates.indexed_retain(move |candidate_idx, backed_candidate| { - !candidate_has_concluded_invalid_dispute_or_is_invalid(candidate_idx, backed_candidate) - }); + concluded_invalid_with_descendants: BTreeSet, + scheduled: BTreeMap>, + core_index_enabled: bool, +) -> BTreeMap, CoreIndex)>> { + // Map the candidates to the right paraids, while making sure that the order between candidates + // of the same para is preserved. + let mut candidates_per_para: BTreeMap> = BTreeMap::new(); + for candidate in backed_candidates { + candidates_per_para + .entry(candidate.descriptor().para_id) + .or_default() + .push(candidate); + } - // Assure the backed candidate's `ParaId`'s core is free. - // This holds under the assumption that `Scheduler::schedule` is called _before_. - // We don't check the relay-parent because this is done in the closure when - // constructing the inherent and during actual processing otherwise. + // Check that candidates pertaining to the same para form a chain. Drop the ones that + // don't, along with the rest of candidates which follow them in the input vector. + filter_unchained_candidates::(&mut candidates_per_para, allowed_relay_parents); - backed_candidates.retain(|backed_candidate| { - let desc = backed_candidate.descriptor(); + // Remove any candidates that were concluded invalid or who are descendants of concluded invalid + // candidates (along with their descendants). + retain_candidates::(&mut candidates_per_para, |_, candidate| { + let keep = !concluded_invalid_with_descendants.contains(&candidate.candidate().hash()); - scheduled.get(&desc.para_id).is_some() + if !keep { + log::debug!( + target: LOG_TARGET, + "Found backed candidate {:?} which was concluded invalid or is a descendant of a concluded invalid candidate, for paraid {:?}.", + candidate.candidate().hash(), + candidate.descriptor().para_id + ); + } + keep }); - // Filter out backing statements from disabled validators - let dropped_disabled = filter_backed_statements_from_disabled_validators::( - &mut backed_candidates, + // Map candidates to scheduled cores. Filter out any unscheduled candidates along with their + // descendants. + let mut backed_candidates_with_core = map_candidates_to_cores::( &allowed_relay_parents, scheduled, + core_index_enabled, + candidates_per_para, ); - // Sort the `Vec` last, once there is a guarantee that these - // `BackedCandidates` references the expected relay chain parent, - // but more importantly are scheduled for a free core. - // This both avoids extra work for obviously invalid candidates, - // but also allows this to be done in place. - backed_candidates.sort_by(|x, y| { - // Never panics, since we filtered all panic arguments out in the previous `fn retain`. - scheduled[&x.descriptor().para_id].cmp(&scheduled[&y.descriptor().para_id]) - }); + // Filter out backing statements from disabled validators. If by that we render a candidate with + // less backing votes than required, filter that candidate also. As all the other filtering + // operations above, we drop the descendants of the dropped candidates also. + filter_backed_statements_from_disabled_validators::( + &mut backed_candidates_with_core, + &allowed_relay_parents, + core_index_enabled, + ); - SanitizedBackedCandidates { - backed_candidates, - votes_from_disabled_were_dropped: dropped_disabled, - } + backed_candidates_with_core +} + +fn count_backed_candidates(backed_candidates: &BTreeMap>) -> usize { + backed_candidates.iter().fold(0, |mut count, (_id, candidates)| { + count += candidates.len(); + count + }) } /// Derive entropy from babe provided per block randomness. @@ -1038,7 +1069,7 @@ fn limit_and_sanitize_disputes< log::debug!(target: LOG_TARGET, "Above max consumable weight: {}/{}", disputes_weight, max_consumable_weight); let mut checked_acc = Vec::::with_capacity(disputes.len()); - // Accumualated weight of all disputes picked, that passed the checks. + // Accumulated weight of all disputes picked, that passed the checks. let mut weight_acc = Weight::zero(); // Select disputes in-order until the remaining weight is attained @@ -1067,56 +1098,87 @@ fn limit_and_sanitize_disputes< } } -// Filters statements from disabled validators in `BackedCandidate`, non-scheduled candidates and -// few more sanity checks. Returns `true` if at least one statement is removed and `false` -// otherwise. -fn filter_backed_statements_from_disabled_validators( - backed_candidates: &mut Vec::Hash>>, +// Helper function for filtering candidates which don't pass the given predicate. When/if the first +// candidate which failes the predicate is found, all the other candidates that follow are dropped. +fn retain_candidates< + T: inclusion::Config + paras::Config + inclusion::Config, + F: FnMut(ParaId, &mut C) -> bool, + C, +>( + candidates_per_para: &mut BTreeMap>, + mut pred: F, +) { + for (para_id, candidates) in candidates_per_para.iter_mut() { + let mut latest_valid_idx = None; + + for (idx, candidate) in candidates.iter_mut().enumerate() { + if pred(*para_id, candidate) { + // Found a valid candidate. + latest_valid_idx = Some(idx); + } else { + break + } + } + + if let Some(latest_valid_idx) = latest_valid_idx { + candidates.truncate(latest_valid_idx + 1); + } else { + candidates.clear(); + } + } + + candidates_per_para.retain(|_, c| !c.is_empty()); +} + +// Filters statements from disabled validators in `BackedCandidate` and does a few more sanity +// checks. +fn filter_backed_statements_from_disabled_validators< + T: shared::Config + scheduler::Config + inclusion::Config, +>( + backed_candidates_with_core: &mut BTreeMap< + ParaId, + Vec<(BackedCandidate<::Hash>, CoreIndex)>, + >, allowed_relay_parents: &AllowedRelayParentsTracker>, - scheduled: &BTreeMap, -) -> bool { + core_index_enabled: bool, +) { let disabled_validators = BTreeSet::<_>::from_iter(shared::Pallet::::disabled_validators().into_iter()); if disabled_validators.is_empty() { // No disabled validators - nothing to do - return false + return } - let backed_len_before = backed_candidates.len(); - - // Flag which will be returned. Set to `true` if at least one vote is filtered. - let mut filtered = false; - - let minimum_backing_votes = configuration::Pallet::::config().minimum_backing_votes; + let minimum_backing_votes = configuration::ActiveConfig::::get().minimum_backing_votes; // Process all backed candidates. `validator_indices` in `BackedCandidates` are indices within // the validator group assigned to the parachain. To obtain this group we need: // 1. Core index assigned to the parachain which has produced the candidate // 2. The relay chain block number of the candidate - backed_candidates.retain_mut(|bc| { - // Get `core_idx` assigned to the `para_id` of the candidate - let core_idx = match scheduled.get(&bc.descriptor().para_id) { - Some(core_idx) => *core_idx, - None => { - log::debug!(target: LOG_TARGET, "Can't get core idx of a backed candidate for para id {:?}. Dropping the candidate.", bc.descriptor().para_id); - return false - } - }; - - // Get relay parent block number of the candidate. We need this to get the group index assigned to this core at this block number - let relay_parent_block_number = match allowed_relay_parents - .acquire_info(bc.descriptor().relay_parent, None) { + retain_candidates::(backed_candidates_with_core, |para_id, (bc, core_idx)| { + let (validator_indices, maybe_core_index) = + bc.validator_indices_and_core_index(core_index_enabled); + let mut validator_indices = BitVec::<_>::from(validator_indices); + + // Get relay parent block number of the candidate. We need this to get the group index + // assigned to this core at this block number + let relay_parent_block_number = + match allowed_relay_parents.acquire_info(bc.descriptor().relay_parent, None) { Some((_, block_num)) => block_num, None => { - log::debug!(target: LOG_TARGET, "Relay parent {:?} for candidate is not in the allowed relay parents. Dropping the candidate.", bc.descriptor().relay_parent); + log::debug!( + target: LOG_TARGET, + "Relay parent {:?} for candidate is not in the allowed relay parents. Dropping the candidate.", + bc.descriptor().relay_parent + ); return false - } + }, }; // Get the group index for the core - let group_idx = match >::group_assigned_to_core( - core_idx, + let group_idx = match scheduler::Pallet::::group_assigned_to_core( + *core_idx, relay_parent_block_number + One::one(), ) { Some(group_idx) => group_idx, @@ -1127,44 +1189,306 @@ fn filter_backed_statements_from_disabled_validators>::group_validators(group_idx) { + let validator_group = match scheduler::Pallet::::group_validators(group_idx) { Some(validator_group) => validator_group, None => { log::debug!(target: LOG_TARGET, "Can't get the validators from group {:?}. Dropping the candidate.", group_idx); return false - } + }, }; // Bitmask with the disabled indices within the validator group - let disabled_indices = BitVec::::from_iter(validator_group.iter().map(|idx| disabled_validators.contains(idx))); - // The indices of statements from disabled validators in `BackedCandidate`. We have to drop these. - let indices_to_drop = disabled_indices.clone() & &bc.validator_indices; + let disabled_indices = BitVec::::from_iter( + validator_group.iter().map(|idx| disabled_validators.contains(idx)), + ); + // The indices of statements from disabled validators in `BackedCandidate`. We have to drop + // these. + let indices_to_drop = disabled_indices.clone() & &validator_indices; // Apply the bitmask to drop the disabled validator from `validator_indices` - bc.validator_indices &= !disabled_indices; + validator_indices &= !disabled_indices; + // Update the backed candidate + bc.set_validator_indices_and_core_index(validator_indices, maybe_core_index); + // Remove the corresponding votes from `validity_votes` for idx in indices_to_drop.iter_ones().rev() { - bc.validity_votes.remove(idx); - } - - // If at least one statement was dropped we need to return `true` - if indices_to_drop.count_ones() > 0 { - filtered = true; + bc.validity_votes_mut().remove(idx); } // By filtering votes we might render the candidate invalid and cause a failure in // [`process_candidates`]. To avoid this we have to perform a sanity check here. If there // are not enough backing votes after filtering we will remove the whole candidate. - if bc.validity_votes.len() < effective_minimum_backing_votes( - validator_group.len(), - minimum_backing_votes + if bc.validity_votes().len() < + effective_minimum_backing_votes(validator_group.len(), minimum_backing_votes) + { + log::debug!( + target: LOG_TARGET, + "Dropping candidate {:?} of paraid {:?} because it was left with too few backing votes after votes from disabled validators were filtered.", + bc.candidate().hash(), + para_id + ); - ) { return false } true }); +} + +// Check that candidates pertaining to the same para form a chain. Drop the ones that +// don't, along with the rest of candidates which follow them in the input vector. +// In the process, duplicated candidates will also be dropped (even if they form a valid cycle; +// cycles are not allowed if they entail backing duplicated candidates). +fn filter_unchained_candidates( + candidates: &mut BTreeMap>>, + allowed_relay_parents: &AllowedRelayParentsTracker>, +) { + let mut para_latest_head_data: BTreeMap = BTreeMap::new(); + for para_id in candidates.keys() { + let latest_head_data = match inclusion::Pallet::::para_latest_head_data(¶_id) { + None => { + defensive!("Latest included head data for paraid {:?} is None", para_id); + continue + }, + Some(latest_head_data) => latest_head_data, + }; + para_latest_head_data.insert(*para_id, latest_head_data); + } + + let mut para_visited_candidates: BTreeMap> = BTreeMap::new(); + + retain_candidates::(candidates, |para_id, candidate| { + let Some(latest_head_data) = para_latest_head_data.get(¶_id) else { return false }; + let candidate_hash = candidate.candidate().hash(); + + let visited_candidates = + para_visited_candidates.entry(para_id).or_insert_with(|| BTreeSet::new()); + if visited_candidates.contains(&candidate_hash) { + log::debug!( + target: LOG_TARGET, + "Found duplicate candidates for paraid {:?}. Dropping the candidates with hash {:?}", + para_id, + candidate_hash + ); + + // If we got a duplicate candidate, stop. + return false + } else { + visited_candidates.insert(candidate_hash); + } + + let prev_context = paras::MostRecentContext::::get(para_id); + let check_ctx = CandidateCheckContext::::new(prev_context); + + let res = match check_ctx.verify_backed_candidate( + &allowed_relay_parents, + candidate.candidate(), + latest_head_data.clone(), + ) { + Ok(_) => true, + Err(err) => { + log::debug!( + target: LOG_TARGET, + "Backed candidate verification for candidate {:?} of paraid {:?} failed with {:?}", + candidate_hash, + para_id, + err + ); + false + }, + }; + + if res { + para_latest_head_data + .insert(para_id, candidate.candidate().commitments.head_data.clone()); + } + + res + }); +} + +/// Map candidates to scheduled cores. +/// If the para only has one scheduled core and one candidate supplied, map the candidate to the +/// single core. If the para has multiple cores scheduled, only map the candidates which have a +/// proper core injected. Filter out the rest. +/// Also returns whether or not we dropped any candidates. +/// When dropping a candidate of a para, we must drop all subsequent candidates from that para +/// (because they form a chain). +fn map_candidates_to_cores( + allowed_relay_parents: &AllowedRelayParentsTracker>, + mut scheduled: BTreeMap>, + core_index_enabled: bool, + candidates: BTreeMap>>, +) -> BTreeMap, CoreIndex)>> { + let mut backed_candidates_with_core = BTreeMap::new(); + + for (para_id, backed_candidates) in candidates.into_iter() { + if backed_candidates.len() == 0 { + defensive!("Backed candidates for paraid {} is empty.", para_id); + continue + } + + let scheduled_cores = scheduled.get_mut(¶_id); + + // ParaIds without scheduled cores are silently filtered out. + if let Some(scheduled_cores) = scheduled_cores { + if scheduled_cores.len() == 0 { + log::debug!( + target: LOG_TARGET, + "Paraid: {:?} has no scheduled cores but {} candidates were supplied.", + para_id, + backed_candidates.len() + ); + + // Non-elastic scaling case. One core per para. + } else if scheduled_cores.len() == 1 && !core_index_enabled { + backed_candidates_with_core.insert( + para_id, + vec![( + // We need the first one here, as we assume candidates of a para are in + // dependency order. + backed_candidates.into_iter().next().expect("Length is at least 1"), + scheduled_cores.pop_first().expect("Length is 1"), + )], + ); + continue; + + // Elastic scaling case. We only allow candidates which have the right core + // indices injected. + } else if scheduled_cores.len() >= 1 && core_index_enabled { + // We must preserve the dependency order given in the input. + let mut temp_backed_candidates = Vec::with_capacity(scheduled_cores.len()); + + for candidate in backed_candidates { + if scheduled_cores.len() == 0 { + // We've got candidates for all of this para's assigned cores. Move on to + // the next para. + log::debug!( + target: LOG_TARGET, + "Found enough candidates for paraid: {:?}.", + candidate.descriptor().para_id + ); + break; + } + let maybe_injected_core_index: Option = + get_injected_core_index::(allowed_relay_parents, &candidate); + + if let Some(core_index) = maybe_injected_core_index { + if scheduled_cores.remove(&core_index) { + temp_backed_candidates.push((candidate, core_index)); + } else { + // if we got a candidate for a core index which is not scheduled, stop + // the work for this para. the already processed candidate chain in + // temp_backed_candidates is still fine though. + log::debug!( + target: LOG_TARGET, + "Found a backed candidate {:?} with injected core index {}, which is not scheduled for paraid {:?}.", + candidate.candidate().hash(), + core_index.0, + candidate.descriptor().para_id + ); + + break; + } + } else { + // if we got a candidate which does not contain its core index, stop the + // work for this para. the already processed candidate chain in + // temp_backed_candidates is still fine though. + + log::debug!( + target: LOG_TARGET, + "Found a backed candidate {:?} with no injected core index, for paraid {:?} which has multiple scheduled cores.", + candidate.candidate().hash(), + candidate.descriptor().para_id + ); + + break; + } + } + + if !temp_backed_candidates.is_empty() { + backed_candidates_with_core + .entry(para_id) + .or_insert_with(|| vec![]) + .extend(temp_backed_candidates); + } + } else { + log::warn!( + target: LOG_TARGET, + "Found a paraid {:?} which has multiple scheduled cores but ElasticScalingMVP feature is not enabled: {:?}", + para_id, + scheduled_cores + ); + } + } else { + log::debug!( + target: LOG_TARGET, + "Paraid: {:?} has no scheduled cores but {} candidates were supplied.", + para_id, + backed_candidates.len() + ); + } + } - // Also return `true` if a whole candidate was dropped from the set - filtered || backed_len_before != backed_candidates.len() + backed_candidates_with_core +} + +fn get_injected_core_index( + allowed_relay_parents: &AllowedRelayParentsTracker>, + candidate: &BackedCandidate, +) -> Option { + // After stripping the 8 bit extensions, the `validator_indices` field length is expected + // to be equal to backing group size. If these don't match, the `CoreIndex` is badly encoded, + // or not supported. + let (validator_indices, maybe_core_idx) = candidate.validator_indices_and_core_index(true); + + let Some(core_idx) = maybe_core_idx else { return None }; + + let relay_parent_block_number = + match allowed_relay_parents.acquire_info(candidate.descriptor().relay_parent, None) { + Some((_, block_num)) => block_num, + None => { + log::debug!( + target: LOG_TARGET, + "Relay parent {:?} for candidate {:?} is not in the allowed relay parents.", + candidate.descriptor().relay_parent, + candidate.candidate().hash(), + ); + return None + }, + }; + + // Get the backing group of the candidate backed at `core_idx`. + let group_idx = match scheduler::Pallet::::group_assigned_to_core( + core_idx, + relay_parent_block_number + One::one(), + ) { + Some(group_idx) => group_idx, + None => { + log::debug!( + target: LOG_TARGET, + "Can't get the group index for core idx {:?}.", + core_idx, + ); + return None + }, + }; + + let group_validators = match scheduler::Pallet::::group_validators(group_idx) { + Some(validators) => validators, + None => return None, + }; + + if group_validators.len() == validator_indices.len() { + Some(core_idx) + } else { + log::debug!( + target: LOG_TARGET, + "Expected validator_indices count different than the real one: {}, {} for candidate {:?}", + group_validators.len(), + validator_indices.len(), + candidate.candidate().hash() + ); + + None + } } diff --git a/polkadot/runtime/parachains/src/paras_inherent/tests.rs b/polkadot/runtime/parachains/src/paras_inherent/tests.rs index 6f3eac35685a82b32c69b27e5379620988c956b7..64fbc9c4a4e0335a148ce55777b015ff6f99a11a 100644 --- a/polkadot/runtime/parachains/src/paras_inherent/tests.rs +++ b/polkadot/runtime/parachains/src/paras_inherent/tests.rs @@ -16,21 +16,48 @@ use super::*; +use crate::{ + configuration::{self, HostConfiguration}, + mock::MockGenesisConfig, +}; +use primitives::vstaging::SchedulerParams; + +fn default_config() -> MockGenesisConfig { + MockGenesisConfig { + configuration: configuration::GenesisConfig { + config: HostConfiguration { + max_head_data_size: 0b100000, + scheduler_params: SchedulerParams { + group_rotation_frequency: u32::MAX, + ..Default::default() + }, + ..Default::default() + }, + }, + ..Default::default() + } +} + // In order to facilitate benchmarks as tests we have a benchmark feature gated `WeightInfo` impl // that uses 0 for all the weights. Because all the weights are 0, the tests that rely on // weights for limiting data will fail, so we don't run them when using the benchmark feature. #[cfg(not(feature = "runtime-benchmarks"))] mod enter { - - use super::*; + use super::{inclusion::tests::TestCandidateBuilder, *}; use crate::{ builder::{Bench, BenchBuilder}, - mock::{mock_assigner, new_test_ext, BlockLength, BlockWeights, MockGenesisConfig, Test}, - scheduler::common::Assignment, + mock::{mock_assigner, new_test_ext, BlockLength, BlockWeights, RuntimeOrigin, Test}, + scheduler::{ + common::{Assignment, AssignmentProvider}, + ParasEntry, + }, + session_info, }; use assert_matches::assert_matches; + use core::panic; use frame_support::assert_ok; use frame_system::limits; + use primitives::{vstaging::SchedulerParams, AvailabilityBitfield, UncheckedSigned}; use sp_runtime::Perbill; use sp_std::collections::btree_map::BTreeMap; @@ -41,6 +68,8 @@ mod enter { num_validators_per_core: u32, code_upgrade: Option, fill_claimqueue: bool, + elastic_paras: BTreeMap, + unavailable_cores: Vec, } fn make_inherent_data( @@ -51,25 +80,39 @@ mod enter { num_validators_per_core, code_upgrade, fill_claimqueue, + elastic_paras, + unavailable_cores, }: TestConfig, ) -> Bench { + let extra_cores = elastic_paras + .values() + .map(|count| *count as usize) + .sum::() + .saturating_sub(elastic_paras.len() as usize); + let total_cores = dispute_sessions.len() + backed_and_concluding.len() + extra_cores; + let builder = BenchBuilder::::new() - .set_max_validators( - (dispute_sessions.len() + backed_and_concluding.len()) as u32 * - num_validators_per_core, - ) + .set_max_validators((total_cores) as u32 * num_validators_per_core) + .set_elastic_paras(elastic_paras.clone()) .set_max_validators_per_core(num_validators_per_core) .set_dispute_statements(dispute_statements) - .set_backed_and_concluding_cores(backed_and_concluding) + .set_backed_and_concluding_paras(backed_and_concluding.clone()) .set_dispute_sessions(&dispute_sessions[..]) - .set_fill_claimqueue(fill_claimqueue); + .set_fill_claimqueue(fill_claimqueue) + .set_unavailable_cores(unavailable_cores); // Setup some assignments as needed: mock_assigner::Pallet::::set_core_count(builder.max_cores()); - for core_index in 0..builder.max_cores() { - // Core index == para_id in this case - mock_assigner::Pallet::::add_test_assignment(Assignment::Bulk(core_index.into())); - } + + (0..(builder.max_cores() as usize - extra_cores)).for_each(|para_id| { + (0..elastic_paras.get(&(para_id as u32)).cloned().unwrap_or(1)).for_each( + |_para_local_core_idx| { + mock_assigner::Pallet::::add_test_assignment(Assignment::Bulk( + para_id.into(), + )); + }, + ); + }); if let Some(code_size) = code_upgrade { builder.set_code_upgrade(code_size).build() @@ -84,7 +127,7 @@ mod enter { // `create_inherent` and will not cause `enter` to early. fn include_backed_candidates() { let config = MockGenesisConfig::default(); - assert!(config.configuration.config.scheduling_lookahead > 0); + assert!(config.configuration.config.scheduler_params.lookahead > 0); new_test_ext(config).execute_with(|| { let dispute_statements = BTreeMap::new(); @@ -100,6 +143,8 @@ mod enter { num_validators_per_core: 1, code_upgrade: None, fill_claimqueue: false, + elastic_paras: BTreeMap::new(), + unavailable_cores: vec![], }); // We expect the scenario to have cores 0 & 1 with pending availability. The backed @@ -121,7 +166,7 @@ mod enter { .unwrap(); // The current schedule is empty prior to calling `create_inherent_enter`. - assert!(>::claimqueue_is_empty()); + assert!(scheduler::Pallet::::claimqueue_is_empty()); // Nothing is filtered out (including the backed candidates.) assert_eq!( @@ -132,15 +177,317 @@ mod enter { assert_eq!( // The length of this vec is equal to the number of candidates, so we know our 2 // backed candidates did not get filtered out - Pallet::::on_chain_votes().unwrap().backing_validators_per_candidate.len(), + OnChainVotes::::get().unwrap().backing_validators_per_candidate.len(), + 2 + ); + + assert_eq!( + // The session of the on chain votes should equal the current session, which is 2 + OnChainVotes::::get().unwrap().session, + 2 + ); + + assert_eq!( + inclusion::PendingAvailability::::get(ParaId::from(0)) + .unwrap() + .into_iter() + .map(|c| c.core_occupied()) + .collect::>(), + vec![CoreIndex(0)] + ); + assert_eq!( + inclusion::PendingAvailability::::get(ParaId::from(1)) + .unwrap() + .into_iter() + .map(|c| c.core_occupied()) + .collect::>(), + vec![CoreIndex(1)] + ); + }); + } + + #[test] + fn include_backed_candidates_elastic_scaling() { + // ParaId 0 has one pending candidate on core 0. + // ParaId 1 has one pending candidate on core 1. + // ParaId 2 has three pending candidates on cores 2, 3 and 4. + // All of them are being made available in this block. Propose 5 more candidates (one for + // each core) and check that they're successfully backed and the old ones enacted. + let config = default_config(); + assert!(config.configuration.config.scheduler_params.lookahead > 0); + new_test_ext(config).execute_with(|| { + // Set the elastic scaling MVP feature. + configuration::Pallet::::set_node_feature( + RuntimeOrigin::root(), + FeatureIndex::ElasticScalingMVP as u8, + true, + ) + .unwrap(); + + let dispute_statements = BTreeMap::new(); + + let mut backed_and_concluding = BTreeMap::new(); + backed_and_concluding.insert(0, 1); + backed_and_concluding.insert(1, 1); + backed_and_concluding.insert(2, 1); + + let scenario = make_inherent_data(TestConfig { + dispute_statements, + dispute_sessions: vec![], // No disputes + backed_and_concluding, + num_validators_per_core: 1, + code_upgrade: None, + fill_claimqueue: false, + elastic_paras: [(2, 3)].into_iter().collect(), + unavailable_cores: vec![], + }); + + let expected_para_inherent_data = scenario.data.clone(); + + // Check the para inherent data is as expected: + // * 1 bitfield per validator (5 validators) + assert_eq!(expected_para_inherent_data.bitfields.len(), 5); + // * 1 backed candidate per core (5 cores) + assert_eq!(expected_para_inherent_data.backed_candidates.len(), 5); + // * 0 disputes. + assert_eq!(expected_para_inherent_data.disputes.len(), 0); + let mut inherent_data = InherentData::new(); + inherent_data + .put_data(PARACHAINS_INHERENT_IDENTIFIER, &expected_para_inherent_data) + .unwrap(); + + // The current schedule is empty prior to calling `create_inherent_enter`. + assert!(scheduler::Pallet::::claimqueue_is_empty()); + + assert!(pallet::OnChainVotes::::get().is_none()); + + // Nothing is filtered out (including the backed candidates.) + assert_eq!( + Pallet::::create_inherent_inner(&inherent_data.clone()).unwrap(), + expected_para_inherent_data + ); + + assert_eq!( + // The length of this vec is equal to the number of candidates, so we know our 5 + // backed candidates did not get filtered out + pallet::OnChainVotes::::get() + .unwrap() + .backing_validators_per_candidate + .len(), + 5 + ); + + assert_eq!( + // The session of the on chain votes should equal the current session, which is 2 + pallet::OnChainVotes::::get().unwrap().session, 2 ); + assert_eq!( + inclusion::PendingAvailability::::get(ParaId::from(0)) + .unwrap() + .into_iter() + .map(|c| c.core_occupied()) + .collect::>(), + vec![CoreIndex(0)] + ); + assert_eq!( + inclusion::PendingAvailability::::get(ParaId::from(1)) + .unwrap() + .into_iter() + .map(|c| c.core_occupied()) + .collect::>(), + vec![CoreIndex(1)] + ); + assert_eq!( + inclusion::PendingAvailability::::get(ParaId::from(2)) + .unwrap() + .into_iter() + .map(|c| c.core_occupied()) + .collect::>(), + vec![CoreIndex(2), CoreIndex(3), CoreIndex(4)] + ); + }); + + // ParaId 0 has one pending candidate on core 0. + // ParaId 1 has one pending candidate on core 1. + // ParaId 2 has 4 pending candidates on cores 2, 3, 4 and 5. + // Cores 1, 2 and 3 are being made available in this block. Propose 6 more candidates (one + // for each core) and check that the right ones are successfully backed and the old ones + // enacted. + let config = default_config(); + assert!(config.configuration.config.scheduler_params.lookahead > 0); + new_test_ext(config).execute_with(|| { + // Set the elastic scaling MVP feature. + configuration::Pallet::::set_node_feature( + RuntimeOrigin::root(), + FeatureIndex::ElasticScalingMVP as u8, + true, + ) + .unwrap(); + + let mut backed_and_concluding = BTreeMap::new(); + backed_and_concluding.insert(0, 1); + backed_and_concluding.insert(1, 1); + backed_and_concluding.insert(2, 1); + + // Modify the availability bitfields so that cores 0, 4 and 5 are not being made + // available. + let unavailable_cores = vec![0, 4, 5]; + + let scenario = make_inherent_data(TestConfig { + dispute_statements: BTreeMap::new(), + dispute_sessions: vec![], // No disputes + backed_and_concluding, + num_validators_per_core: 1, + code_upgrade: None, + fill_claimqueue: true, + elastic_paras: [(2, 4)].into_iter().collect(), + unavailable_cores: unavailable_cores.clone(), + }); + + let mut expected_para_inherent_data = scenario.data.clone(); + + // Check the para inherent data is as expected: + // * 1 bitfield per validator (6 validators) + assert_eq!(expected_para_inherent_data.bitfields.len(), 6); + // * 1 backed candidate per core (6 cores) + assert_eq!(expected_para_inherent_data.backed_candidates.len(), 6); + // * 0 disputes. + assert_eq!(expected_para_inherent_data.disputes.len(), 0); + assert!(pallet::OnChainVotes::::get().is_none()); + + expected_para_inherent_data.backed_candidates = expected_para_inherent_data + .backed_candidates + .into_iter() + .filter(|candidate| { + let (_, Some(core_index)) = candidate.validator_indices_and_core_index(true) + else { + panic!("Core index must have been injected"); + }; + !unavailable_cores.contains(&core_index.0) + }) + .collect(); + + let mut inherent_data = InherentData::new(); + inherent_data.put_data(PARACHAINS_INHERENT_IDENTIFIER, &scenario.data).unwrap(); + + assert!(!scheduler::Pallet::::claimqueue_is_empty()); + + // The right candidates have been filtered out (the ones for cores 0,4,5) + assert_eq!( + Pallet::::create_inherent_inner(&inherent_data.clone()).unwrap(), + expected_para_inherent_data + ); + + // 3 candidates have been backed (for cores 1,2 and 3) + assert_eq!( + pallet::OnChainVotes::::get() + .unwrap() + .backing_validators_per_candidate + .len(), + 3 + ); + assert_eq!( // The session of the on chain votes should equal the current session, which is 2 - Pallet::::on_chain_votes().unwrap().session, + pallet::OnChainVotes::::get().unwrap().session, 2 ); + + assert_eq!( + inclusion::PendingAvailability::::get(ParaId::from(1)) + .unwrap() + .into_iter() + .map(|c| c.core_occupied()) + .collect::>(), + vec![CoreIndex(1)] + ); + assert_eq!( + inclusion::PendingAvailability::::get(ParaId::from(2)) + .unwrap() + .into_iter() + .map(|c| c.core_occupied()) + .collect::>(), + vec![CoreIndex(4), CoreIndex(5), CoreIndex(2), CoreIndex(3)] + ); + + let expected_heads = (0..=2) + .map(|id| { + inclusion::PendingAvailability::::get(ParaId::from(id)) + .unwrap() + .back() + .unwrap() + .candidate_commitments() + .head_data + .clone() + }) + .collect::>(); + + // Now just make all candidates available. + let mut data = scenario.data.clone(); + let validators = session_info::Sessions::::get(2).unwrap().validators; + let signing_context = SigningContext { + parent_hash: BenchBuilder::::header(4).hash(), + session_index: 2, + }; + + data.backed_candidates.clear(); + + data.bitfields.iter_mut().enumerate().for_each(|(i, bitfield)| { + let unchecked_signed = UncheckedSigned::::benchmark_sign( + validators.get(ValidatorIndex(i as u32)).unwrap(), + bitvec::bitvec![u8, bitvec::order::Lsb0; 1; 6].into(), + &signing_context, + ValidatorIndex(i as u32), + ); + *bitfield = unchecked_signed; + }); + let mut inherent_data = InherentData::new(); + inherent_data.put_data(PARACHAINS_INHERENT_IDENTIFIER, &data).unwrap(); + + // Nothing has been filtered out. + assert_eq!( + Pallet::::create_inherent_inner(&inherent_data.clone()).unwrap(), + data + ); + + // No more candidates have been backed + assert!(pallet::OnChainVotes::::get() + .unwrap() + .backing_validators_per_candidate + .is_empty()); + + // No more pending availability candidates + assert_eq!( + inclusion::PendingAvailability::::get(ParaId::from(0)) + .unwrap() + .into_iter() + .map(|c| c.core_occupied()) + .collect::>(), + vec![] + ); + assert_eq!( + inclusion::PendingAvailability::::get(ParaId::from(1)) + .unwrap() + .into_iter() + .map(|c| c.core_occupied()) + .collect::>(), + vec![] + ); + assert_eq!( + inclusion::PendingAvailability::::get(ParaId::from(2)) + .unwrap() + .into_iter() + .map(|c| c.core_occupied()) + .collect::>(), + vec![] + ); + + // Paras have the right on-chain heads now + expected_heads.into_iter().enumerate().for_each(|(id, head)| { + assert_eq!(paras::Heads::::get(ParaId::from(id as u32)).unwrap(), head); + }); }); } @@ -207,7 +554,7 @@ mod enter { let candidate_hash = CandidateHash(sp_core::H256::repeat_byte(1)); let statements = generate_votes(3, candidate_hash); set_scrapable_on_chain_disputes::(3, statements); - assert_matches!(pallet::Pallet::::on_chain_votes(), Some(ScrapedOnChainVotes { + assert_matches!(pallet::OnChainVotes::::get(), Some(ScrapedOnChainVotes { session, .. } ) => { @@ -226,7 +573,7 @@ mod enter { let candidate_hash = CandidateHash(sp_core::H256::repeat_byte(2)); let statements = generate_votes(7, candidate_hash); set_scrapable_on_chain_disputes::(7, statements); - assert_matches!(pallet::Pallet::::on_chain_votes(), Some(ScrapedOnChainVotes { + assert_matches!(pallet::OnChainVotes::::get(), Some(ScrapedOnChainVotes { session, .. } ) => { @@ -251,6 +598,8 @@ mod enter { num_validators_per_core: 5, code_upgrade: None, fill_claimqueue: false, + elastic_paras: BTreeMap::new(), + unavailable_cores: vec![], }); let expected_para_inherent_data = scenario.data.clone(); @@ -269,7 +618,7 @@ mod enter { .unwrap(); // The current schedule is empty prior to calling `create_inherent_enter`. - assert!(>::claimqueue_is_empty()); + assert!(scheduler::Pallet::::claimqueue_is_empty()); let multi_dispute_inherent_data = Pallet::::create_inherent_inner(&inherent_data.clone()).unwrap(); @@ -292,13 +641,13 @@ mod enter { assert_eq!( // The length of this vec is equal to the number of candidates, so we know there // where no backed candidates included - Pallet::::on_chain_votes().unwrap().backing_validators_per_candidate.len(), + OnChainVotes::::get().unwrap().backing_validators_per_candidate.len(), 0 ); assert_eq!( // The session of the on chain votes should equal the current session, which is 2 - Pallet::::on_chain_votes().unwrap().session, + OnChainVotes::::get().unwrap().session, 2 ); }); @@ -322,6 +671,8 @@ mod enter { num_validators_per_core: 6, code_upgrade: None, fill_claimqueue: false, + elastic_paras: BTreeMap::new(), + unavailable_cores: vec![], }); let expected_para_inherent_data = scenario.data.clone(); @@ -339,7 +690,7 @@ mod enter { .unwrap(); // The current schedule is empty prior to calling `create_inherent_enter`. - assert!(>::claimqueue_is_empty()); + assert!(scheduler::Pallet::::claimqueue_is_empty()); let limit_inherent_data = Pallet::::create_inherent_inner(&inherent_data.clone()).unwrap(); @@ -358,13 +709,13 @@ mod enter { assert_eq!( // Ensure that our inherent data did not included backed candidates as expected - Pallet::::on_chain_votes().unwrap().backing_validators_per_candidate.len(), + OnChainVotes::::get().unwrap().backing_validators_per_candidate.len(), 0 ); assert_eq!( // The session of the on chain votes should equal the current session, which is 2 - Pallet::::on_chain_votes().unwrap().session, + OnChainVotes::::get().unwrap().session, 2 ); }); @@ -391,6 +742,8 @@ mod enter { num_validators_per_core: 4, code_upgrade: None, fill_claimqueue: false, + elastic_paras: BTreeMap::new(), + unavailable_cores: vec![], }); let expected_para_inherent_data = scenario.data.clone(); @@ -409,7 +762,7 @@ mod enter { .unwrap(); // The current schedule is empty prior to calling `create_inherent_enter`. - assert!(>::claimqueue_is_empty()); + assert!(scheduler::Pallet::::claimqueue_is_empty()); // Nothing is filtered out (including the backed candidates.) let limit_inherent_data = @@ -439,13 +792,13 @@ mod enter { assert_eq!( // The length of this vec is equal to the number of candidates, so we know // all of our candidates got filtered out - Pallet::::on_chain_votes().unwrap().backing_validators_per_candidate.len(), + OnChainVotes::::get().unwrap().backing_validators_per_candidate.len(), 0, ); assert_eq!( // The session of the on chain votes should equal the current session, which is 2 - Pallet::::on_chain_votes().unwrap().session, + OnChainVotes::::get().unwrap().session, 2 ); }); @@ -476,6 +829,8 @@ mod enter { num_validators_per_core: 5, code_upgrade: None, fill_claimqueue: false, + elastic_paras: BTreeMap::new(), + unavailable_cores: vec![], }); let expected_para_inherent_data = scenario.data.clone(); @@ -494,7 +849,7 @@ mod enter { .unwrap(); // The current schedule is empty prior to calling `create_inherent_enter`. - assert!(>::claimqueue_is_empty()); + assert!(scheduler::Pallet::::claimqueue_is_empty()); // Nothing is filtered out (including the backed candidates.) let limit_inherent_data = @@ -525,13 +880,13 @@ mod enter { assert_eq!( // The length of this vec is equal to the number of candidates, so we know // all of our candidates got filtered out - Pallet::::on_chain_votes().unwrap().backing_validators_per_candidate.len(), + OnChainVotes::::get().unwrap().backing_validators_per_candidate.len(), 0, ); assert_eq!( // The session of the on chain votes should equal the current session, which is 2 - Pallet::::on_chain_votes().unwrap().session, + OnChainVotes::::get().unwrap().session, 2 ); }); @@ -561,6 +916,8 @@ mod enter { num_validators_per_core: 5, code_upgrade: None, fill_claimqueue: false, + elastic_paras: BTreeMap::new(), + unavailable_cores: vec![], }); let expected_para_inherent_data = scenario.data.clone(); @@ -622,7 +979,7 @@ mod enter { #[test] fn limit_candidates_over_weight_1() { let config = MockGenesisConfig::default(); - assert!(config.configuration.config.scheduling_lookahead > 0); + assert!(config.configuration.config.scheduler_params.lookahead > 0); new_test_ext(config).execute_with(|| { // Create the inherent data for this block @@ -645,6 +1002,8 @@ mod enter { num_validators_per_core: 5, code_upgrade: None, fill_claimqueue: false, + elastic_paras: BTreeMap::new(), + unavailable_cores: vec![], }); let expected_para_inherent_data = scenario.data.clone(); @@ -687,16 +1046,35 @@ mod enter { assert_eq!( // The length of this vec is equal to the number of candidates, so we know 1 // candidate got filtered out - Pallet::::on_chain_votes().unwrap().backing_validators_per_candidate.len(), + OnChainVotes::::get().unwrap().backing_validators_per_candidate.len(), 1 ); assert_eq!( // The session of the on chain votes should equal the current session, which is 2 - Pallet::::on_chain_votes().unwrap().session, + OnChainVotes::::get().unwrap().session, 2 ); + // One core was scheduled. We should put the assignment back, before calling enter(). + let now = frame_system::Pallet::::block_number() + 1; + let used_cores = 5; + let cores = (0..used_cores) + .into_iter() + .map(|i| { + let SchedulerParams { ttl, .. } = + configuration::ActiveConfig::::get().scheduler_params; + // Load an assignment into provider so that one is present to pop + let assignment = + ::AssignmentProvider::get_mock_assignment( + CoreIndex(i), + ParaId::from(i), + ); + (CoreIndex(i), [ParasEntry::new(assignment, now + ttl)].into()) + }) + .collect(); + scheduler::ClaimQueue::::set(cores); + assert_ok!(Pallet::::enter( frame_system::RawOrigin::None.into(), limit_inherent_data, @@ -731,6 +1109,8 @@ mod enter { num_validators_per_core: 5, code_upgrade: None, fill_claimqueue: false, + elastic_paras: BTreeMap::new(), + unavailable_cores: vec![], }); let expected_para_inherent_data = scenario.data.clone(); @@ -797,6 +1177,8 @@ mod enter { num_validators_per_core: 5, code_upgrade: None, fill_claimqueue: false, + elastic_paras: BTreeMap::new(), + unavailable_cores: vec![], }); let expected_para_inherent_data = scenario.data.clone(); @@ -861,6 +1243,8 @@ mod enter { num_validators_per_core: 5, code_upgrade: None, fill_claimqueue: false, + elastic_paras: BTreeMap::new(), + unavailable_cores: vec![], }); let expected_para_inherent_data = scenario.data.clone(); @@ -902,6 +1286,131 @@ mod enter { }); } + // Helper fn that builds chained dummy candidates for elastic scaling tests + fn build_backed_candidate_chain( + para_id: ParaId, + len: usize, + start_core_index: usize, + code_upgrade_index: Option, + ) -> Vec { + if let Some(code_upgrade_index) = code_upgrade_index { + assert!(code_upgrade_index < len, "Code upgrade index out of bounds"); + } + + (0..len) + .into_iter() + .map(|idx| { + let mut builder = TestCandidateBuilder::default(); + builder.para_id = para_id; + let mut ccr = builder.build(); + + if Some(idx) == code_upgrade_index { + ccr.commitments.new_validation_code = Some(vec![1, 2, 3, 4].into()); + } + + ccr.commitments.processed_downward_messages = idx as u32; + let core_index = start_core_index + idx; + + BackedCandidate::new( + ccr.into(), + Default::default(), + Default::default(), + Some(CoreIndex(core_index as u32)), + ) + }) + .collect::>() + } + + // Ensure that overweight parachain inherents are always rejected by the runtime. + // Runtime should panic and return `InherentOverweight` error. + #[test] + fn test_backed_candidates_apply_weight_works_for_elastic_scaling() { + new_test_ext(MockGenesisConfig::default()).execute_with(|| { + let seed = [ + 1, 0, 52, 0, 0, 0, 0, 0, 1, 0, 10, 0, 22, 32, 0, 0, 2, 0, 55, 49, 0, 11, 0, 0, 3, + 0, 0, 0, 0, 0, 2, 92, + ]; + let mut rng = rand_chacha::ChaChaRng::from_seed(seed); + + // Create an overweight inherent and oversized block + let mut backed_and_concluding = BTreeMap::new(); + + for i in 0..30 { + backed_and_concluding.insert(i, i); + } + + let scenario = make_inherent_data(TestConfig { + dispute_statements: Default::default(), + dispute_sessions: vec![], // 3 cores with disputes + backed_and_concluding, + num_validators_per_core: 5, + code_upgrade: None, + fill_claimqueue: false, + elastic_paras: BTreeMap::new(), + unavailable_cores: vec![], + }); + + let mut para_inherent_data = scenario.data.clone(); + + // Check the para inherent data is as expected: + // * 1 bitfield per validator (5 validators per core, 30 backed candidates, 0 disputes + // => 5*30 = 150) + assert_eq!(para_inherent_data.bitfields.len(), 150); + // * 30 backed candidates + assert_eq!(para_inherent_data.backed_candidates.len(), 30); + + let mut input_candidates = + build_backed_candidate_chain(ParaId::from(1000), 3, 0, Some(1)); + let chained_candidates_weight = backed_candidates_weight::(&input_candidates); + + input_candidates.append(&mut para_inherent_data.backed_candidates); + let input_bitfields = para_inherent_data.bitfields; + + // Test if weight insufficient even for 1 candidate (which doesn't contain a code + // upgrade). + let max_weight = backed_candidate_weight::(&input_candidates[0]) + + signed_bitfields_weight::(&input_bitfields); + let mut backed_candidates = input_candidates.clone(); + let mut bitfields = input_bitfields.clone(); + apply_weight_limit::( + &mut backed_candidates, + &mut bitfields, + max_weight, + &mut rng, + ); + + // The chained candidates are not picked, instead a single other candidate is picked + assert_eq!(backed_candidates.len(), 1); + assert_ne!(backed_candidates[0].descriptor().para_id, ParaId::from(1000)); + + // All bitfields are kept. + assert_eq!(bitfields.len(), 150); + + // Test if para_id 1000 chained candidates make it if there is enough room for its 3 + // candidates. + let max_weight = + chained_candidates_weight + signed_bitfields_weight::(&input_bitfields); + let mut backed_candidates = input_candidates.clone(); + let mut bitfields = input_bitfields.clone(); + apply_weight_limit::( + &mut backed_candidates, + &mut bitfields, + max_weight, + &mut rng, + ); + + // Only the chained candidates should pass filter. + assert_eq!(backed_candidates.len(), 3); + // Check the actual candidates + assert_eq!(backed_candidates[0].descriptor().para_id, ParaId::from(1000)); + assert_eq!(backed_candidates[1].descriptor().para_id, ParaId::from(1000)); + assert_eq!(backed_candidates[2].descriptor().para_id, ParaId::from(1000)); + + // All bitfields are kept. + assert_eq!(bitfields.len(), 150); + }); + } + // Ensure that overweight parachain inherents are always rejected by the runtime. // Runtime should panic and return `InherentOverweight` error. #[test] @@ -926,6 +1435,8 @@ mod enter { num_validators_per_core: 5, code_upgrade: None, fill_claimqueue: false, + elastic_paras: BTreeMap::new(), + unavailable_cores: vec![], }); let expected_para_inherent_data = scenario.data.clone(); @@ -973,13 +1484,14 @@ mod sanitizers { inclusion::tests::{ back_candidate, collator_sign_candidate, BackingKind, TestCandidateBuilder, }, - mock::{new_test_ext, MockGenesisConfig}, + mock::new_test_ext, }; use bitvec::order::Lsb0; use primitives::{ AvailabilityBitfield, GroupIndex, Hash, Id as ParaId, SignedAvailabilityBitfield, ValidatorIndex, }; + use rstest::rstest; use sp_core::crypto::UncheckedFrom; use crate::mock::Test; @@ -1228,9 +1740,11 @@ mod sanitizers { mod candidates { use crate::{ - mock::set_disabled_validators, + mock::{set_disabled_validators, RuntimeOrigin}, scheduler::{common::Assignment, ParasEntry}, + util::{make_persisted_validation_data, make_persisted_validation_data_with_parent}, }; + use primitives::ValidationCode; use sp_std::collections::vec_deque::VecDeque; use super::*; @@ -1238,12 +1752,14 @@ mod sanitizers { // Backed candidates and scheduled parachains used for `sanitize_backed_candidates` testing struct TestData { backed_candidates: Vec, - scheduled_paras: BTreeMap, + expected_backed_candidates_with_core: + BTreeMap>, + scheduled_paras: BTreeMap>, } - // Generate test data for the candidates and assert that the evnironment is set as expected + // Generate test data for the candidates and assert that the environment is set as expected // (check the comments for details) - fn get_test_data() -> TestData { + fn get_test_data_one_core_per_para(core_index_enabled: bool) -> TestData { const RELAY_PARENT_NUM: u32 = 3; // Add the relay parent to `shared` pallet. Otherwise some code (e.g. filtering backing @@ -1285,9 +1801,14 @@ mod sanitizers { shared::Pallet::::set_active_validators_ascending(validator_ids); // Two scheduled parachains - ParaId(1) on CoreIndex(0) and ParaId(2) on CoreIndex(1) - let scheduled = (0_usize..2) + let scheduled: BTreeMap> = (0_usize..2) .into_iter() - .map(|idx| (ParaId::from(1_u32 + idx as u32), CoreIndex::from(idx as u32))) + .map(|idx| { + ( + ParaId::from(1_u32 + idx as u32), + [CoreIndex::from(idx as u32)].into_iter().collect(), + ) + }) .collect::>(); // Set the validator groups in `scheduler` @@ -1301,7 +1822,7 @@ mod sanitizers { ( CoreIndex::from(0), VecDeque::from([ParasEntry::new( - Assignment::Pool { para_id: 1.into(), core_index: CoreIndex(1) }, + Assignment::Pool { para_id: 1.into(), core_index: CoreIndex(0) }, RELAY_PARENT_NUM, )]), ), @@ -1314,17 +1835,35 @@ mod sanitizers { ), ])); + // Set the on-chain included head data for paras. + paras::Pallet::::set_current_head(ParaId::from(1), HeadData(vec![1])); + paras::Pallet::::set_current_head(ParaId::from(2), HeadData(vec![2])); + + // Set the current_code_hash + paras::Pallet::::force_set_current_code( + RuntimeOrigin::root(), + ParaId::from(1), + ValidationCode(vec![1]), + ) + .unwrap(); + paras::Pallet::::force_set_current_code( + RuntimeOrigin::root(), + ParaId::from(2), + ValidationCode(vec![2]), + ) + .unwrap(); + // Callback used for backing candidates let group_validators = |group_index: GroupIndex| { match group_index { group_index if group_index == GroupIndex::from(0) => Some(vec![0, 1]), group_index if group_index == GroupIndex::from(1) => Some(vec![2, 3]), - _ => panic!("Group index out of bounds for 2 parachains and 1 parathread core"), + _ => panic!("Group index out of bounds"), } .map(|m| m.into_iter().map(ValidatorIndex).collect::>()) }; - // Two backed candidates from each parachain + // One backed candidate from each parachain let backed_candidates = (0_usize..2) .into_iter() .map(|idx0| { @@ -1333,8 +1872,15 @@ mod sanitizers { para_id: ParaId::from(idx1), relay_parent, pov_hash: Hash::repeat_byte(idx1 as u8), - persisted_validation_data_hash: [42u8; 32].into(), + persisted_validation_data_hash: make_persisted_validation_data::( + ParaId::from(idx1), + RELAY_PARENT_NUM, + Default::default(), + ) + .unwrap() + .hash(), hrmp_watermark: RELAY_PARENT_NUM, + validation_code: ValidationCode(vec![idx1 as u8]), ..Default::default() } .build(); @@ -1348,6 +1894,7 @@ mod sanitizers { &keystore, &signing_context, BackingKind::Threshold, + core_index_enabled.then_some(CoreIndex(idx0 as u32)), ); backed }) @@ -1355,11 +1902,11 @@ mod sanitizers { // State sanity checks assert_eq!( - >::scheduled_paras().collect::>(), + scheduler::Pallet::::scheduled_paras().collect::>(), vec![(CoreIndex(0), ParaId::from(1)), (CoreIndex(1), ParaId::from(2))] ); assert_eq!( - shared::Pallet::::active_validator_indices(), + shared::ActiveValidatorIndices::::get(), vec![ ValidatorIndex(0), ValidatorIndex(1), @@ -1369,116 +1916,1321 @@ mod sanitizers { ] ); - TestData { backed_candidates, scheduled_paras: scheduled } - } - - #[test] - fn happy_path() { - new_test_ext(MockGenesisConfig::default()).execute_with(|| { - let TestData { backed_candidates, scheduled_paras: scheduled } = get_test_data(); - - let has_concluded_invalid = - |_idx: usize, _backed_candidate: &BackedCandidate| -> bool { false }; - - assert_eq!( - sanitize_backed_candidates::( - backed_candidates.clone(), - &>::allowed_relay_parents(), - has_concluded_invalid, - &scheduled - ), - SanitizedBackedCandidates { - backed_candidates, - votes_from_disabled_were_dropped: false - } - ); + let mut expected_backed_candidates_with_core = BTreeMap::new(); - {} - }); - } + for candidate in backed_candidates.iter() { + let para_id = candidate.descriptor().para_id; - // nothing is scheduled, so no paraids match, thus all backed candidates are skipped - #[test] - fn nothing_scheduled() { - new_test_ext(MockGenesisConfig::default()).execute_with(|| { - let TestData { backed_candidates, scheduled_paras: _ } = get_test_data(); - let scheduled = &BTreeMap::new(); - let has_concluded_invalid = - |_idx: usize, _backed_candidate: &BackedCandidate| -> bool { false }; - - let SanitizedBackedCandidates { - backed_candidates: sanitized_backed_candidates, - votes_from_disabled_were_dropped, - } = sanitize_backed_candidates::( - backed_candidates.clone(), - &>::allowed_relay_parents(), - has_concluded_invalid, - &scheduled, - ); + expected_backed_candidates_with_core.entry(para_id).or_insert(vec![]).push(( + candidate.clone(), + scheduled.get(¶_id).unwrap().first().copied().unwrap(), + )); + } - assert!(sanitized_backed_candidates.is_empty()); - assert!(!votes_from_disabled_were_dropped); - }); + TestData { + backed_candidates, + scheduled_paras: scheduled, + expected_backed_candidates_with_core, + } } - // candidates that have concluded as invalid are filtered out - #[test] - fn invalid_are_filtered_out() { - new_test_ext(MockGenesisConfig::default()).execute_with(|| { - let TestData { backed_candidates, scheduled_paras: scheduled } = get_test_data(); + // Generate test data for the candidates and assert that the environment is set as expected + // (check the comments for details) + // Para 1 scheduled on core 0 and core 1. Two candidates are supplied. + // Para 2 scheduled on cores 2 and 3. One candidate supplied. + // Para 3 scheduled on core 4. One candidate supplied. + // Para 4 scheduled on core 5. Two candidates supplied. + // Para 5 scheduled on core 6. No candidates supplied. + // Para 6 is not scheduled. One candidate supplied. + // Para 7 is scheduled on core 7 and 8, but the candidate contains the wrong core index. + // Para 8 is scheduled on core 9, but the candidate contains the wrong core index. + fn get_test_data_multiple_cores_per_para(core_index_enabled: bool) -> TestData { + const RELAY_PARENT_NUM: u32 = 3; - // mark every second one as concluded invalid - let set = { - let mut set = std::collections::HashSet::new(); - for (idx, backed_candidate) in backed_candidates.iter().enumerate() { - if idx & 0x01 == 0 { - set.insert(backed_candidate.hash()); - } - } - set - }; - let has_concluded_invalid = - |_idx: usize, candidate: &BackedCandidate| set.contains(&candidate.hash()); - let SanitizedBackedCandidates { - backed_candidates: sanitized_backed_candidates, - votes_from_disabled_were_dropped, - } = sanitize_backed_candidates::( - backed_candidates.clone(), - &>::allowed_relay_parents(), - has_concluded_invalid, - &scheduled, - ); + // Add the relay parent to `shared` pallet. Otherwise some code (e.g. filtering backing + // votes) won't behave correctly + shared::Pallet::::add_allowed_relay_parent( + default_header().hash(), + Default::default(), + RELAY_PARENT_NUM, + 1, + ); - assert_eq!(sanitized_backed_candidates.len(), backed_candidates.len() / 2); - assert!(!votes_from_disabled_were_dropped); - }); - } + let header = default_header(); + let relay_parent = header.hash(); + let session_index = SessionIndex::from(0_u32); - #[test] - fn disabled_non_signing_validator_doesnt_get_filtered() { - new_test_ext(MockGenesisConfig::default()).execute_with(|| { - let TestData { mut backed_candidates, scheduled_paras } = get_test_data(); + let keystore = LocalKeystore::in_memory(); + let keystore = Arc::new(keystore) as KeystorePtr; + let signing_context = SigningContext { parent_hash: relay_parent, session_index }; + + let validators = vec![ + keyring::Sr25519Keyring::Alice, + keyring::Sr25519Keyring::Bob, + keyring::Sr25519Keyring::Charlie, + keyring::Sr25519Keyring::Dave, + keyring::Sr25519Keyring::Eve, + keyring::Sr25519Keyring::Ferdie, + keyring::Sr25519Keyring::One, + keyring::Sr25519Keyring::Two, + ]; + for validator in validators.iter() { + Keystore::sr25519_generate_new( + &*keystore, + PARACHAIN_KEY_TYPE_ID, + Some(&validator.to_seed()), + ) + .unwrap(); + } + + // Set active validators in `shared` pallet + let validator_ids = + validators.iter().map(|v| v.public().into()).collect::>(); + shared::Pallet::::set_active_validators_ascending(validator_ids); + + // Set the validator groups in `scheduler` + scheduler::Pallet::::set_validator_groups(vec![ + vec![ValidatorIndex(0)], + vec![ValidatorIndex(1)], + vec![ValidatorIndex(2)], + vec![ValidatorIndex(3)], + vec![ValidatorIndex(4)], + vec![ValidatorIndex(5)], + vec![ValidatorIndex(6)], + vec![ValidatorIndex(7)], + ]); + + // Update scheduler's claimqueue with the parachains + scheduler::Pallet::::set_claimqueue(BTreeMap::from([ + ( + CoreIndex::from(0), + VecDeque::from([ParasEntry::new( + Assignment::Pool { para_id: 1.into(), core_index: CoreIndex(0) }, + RELAY_PARENT_NUM, + )]), + ), + ( + CoreIndex::from(1), + VecDeque::from([ParasEntry::new( + Assignment::Pool { para_id: 1.into(), core_index: CoreIndex(1) }, + RELAY_PARENT_NUM, + )]), + ), + ( + CoreIndex::from(2), + VecDeque::from([ParasEntry::new( + Assignment::Pool { para_id: 2.into(), core_index: CoreIndex(2) }, + RELAY_PARENT_NUM, + )]), + ), + ( + CoreIndex::from(3), + VecDeque::from([ParasEntry::new( + Assignment::Pool { para_id: 2.into(), core_index: CoreIndex(3) }, + RELAY_PARENT_NUM, + )]), + ), + ( + CoreIndex::from(4), + VecDeque::from([ParasEntry::new( + Assignment::Pool { para_id: 3.into(), core_index: CoreIndex(4) }, + RELAY_PARENT_NUM, + )]), + ), + ( + CoreIndex::from(5), + VecDeque::from([ParasEntry::new( + Assignment::Pool { para_id: 4.into(), core_index: CoreIndex(5) }, + RELAY_PARENT_NUM, + )]), + ), + ( + CoreIndex::from(6), + VecDeque::from([ParasEntry::new( + Assignment::Pool { para_id: 5.into(), core_index: CoreIndex(6) }, + RELAY_PARENT_NUM, + )]), + ), + ( + CoreIndex::from(7), + VecDeque::from([ParasEntry::new( + Assignment::Pool { para_id: 7.into(), core_index: CoreIndex(7) }, + RELAY_PARENT_NUM, + )]), + ), + ( + CoreIndex::from(8), + VecDeque::from([ParasEntry::new( + Assignment::Pool { para_id: 7.into(), core_index: CoreIndex(8) }, + RELAY_PARENT_NUM, + )]), + ), + ( + CoreIndex::from(9), + VecDeque::from([ParasEntry::new( + Assignment::Pool { para_id: 8.into(), core_index: CoreIndex(9) }, + RELAY_PARENT_NUM, + )]), + ), + ])); + + // Set the on-chain included head data and current code hash. + for id in 1..=8u32 { + paras::Pallet::::set_current_head(ParaId::from(id), HeadData(vec![id as u8])); + paras::Pallet::::force_set_current_code( + RuntimeOrigin::root(), + ParaId::from(id), + ValidationCode(vec![id as u8]), + ) + .unwrap(); + } + + // Callback used for backing candidates + let group_validators = |group_index: GroupIndex| { + match group_index { + group_index if group_index == GroupIndex::from(0) => Some(vec![0]), + group_index if group_index == GroupIndex::from(1) => Some(vec![1]), + group_index if group_index == GroupIndex::from(2) => Some(vec![2]), + group_index if group_index == GroupIndex::from(3) => Some(vec![3]), + group_index if group_index == GroupIndex::from(4) => Some(vec![4]), + group_index if group_index == GroupIndex::from(5) => Some(vec![5]), + group_index if group_index == GroupIndex::from(6) => Some(vec![6]), + group_index if group_index == GroupIndex::from(7) => Some(vec![7]), + + _ => panic!("Group index out of bounds"), + } + .map(|m| m.into_iter().map(ValidatorIndex).collect::>()) + }; + + let mut backed_candidates = vec![]; + let mut expected_backed_candidates_with_core = BTreeMap::new(); + + // Para 1 + { + let mut candidate = TestCandidateBuilder { + para_id: ParaId::from(1), + relay_parent, + pov_hash: Hash::repeat_byte(1 as u8), + persisted_validation_data_hash: make_persisted_validation_data::( + ParaId::from(1), + RELAY_PARENT_NUM, + Default::default(), + ) + .unwrap() + .hash(), + hrmp_watermark: RELAY_PARENT_NUM, + head_data: HeadData(vec![1, 1]), + validation_code: ValidationCode(vec![1]), + ..Default::default() + } + .build(); + + collator_sign_candidate(Sr25519Keyring::One, &mut candidate); + + let prev_candidate = candidate.clone(); + let backed: BackedCandidate = back_candidate( + candidate, + &validators, + group_validators(GroupIndex::from(0 as u32)).unwrap().as_ref(), + &keystore, + &signing_context, + BackingKind::Threshold, + core_index_enabled.then_some(CoreIndex(0 as u32)), + ); + backed_candidates.push(backed.clone()); + if core_index_enabled { + expected_backed_candidates_with_core + .entry(ParaId::from(1)) + .or_insert(vec![]) + .push((backed, CoreIndex(0))); + } + + let mut candidate = TestCandidateBuilder { + para_id: ParaId::from(1), + relay_parent, + pov_hash: Hash::repeat_byte(2 as u8), + persisted_validation_data_hash: make_persisted_validation_data_with_parent::< + Test, + >( + RELAY_PARENT_NUM, + Default::default(), + prev_candidate.commitments.head_data, + ) + .hash(), + hrmp_watermark: RELAY_PARENT_NUM, + validation_code: ValidationCode(vec![1]), + ..Default::default() + } + .build(); + + collator_sign_candidate(Sr25519Keyring::One, &mut candidate); + + let backed = back_candidate( + candidate, + &validators, + group_validators(GroupIndex::from(1 as u32)).unwrap().as_ref(), + &keystore, + &signing_context, + BackingKind::Threshold, + core_index_enabled.then_some(CoreIndex(1 as u32)), + ); + backed_candidates.push(backed.clone()); + if core_index_enabled { + expected_backed_candidates_with_core + .entry(ParaId::from(1)) + .or_insert(vec![]) + .push((backed, CoreIndex(1))); + } + } + + // Para 2 + { + let mut candidate = TestCandidateBuilder { + para_id: ParaId::from(2), + relay_parent, + pov_hash: Hash::repeat_byte(3 as u8), + persisted_validation_data_hash: make_persisted_validation_data::( + ParaId::from(2), + RELAY_PARENT_NUM, + Default::default(), + ) + .unwrap() + .hash(), + hrmp_watermark: RELAY_PARENT_NUM, + validation_code: ValidationCode(vec![2]), + ..Default::default() + } + .build(); + + collator_sign_candidate(Sr25519Keyring::One, &mut candidate); + + let backed = back_candidate( + candidate, + &validators, + group_validators(GroupIndex::from(2 as u32)).unwrap().as_ref(), + &keystore, + &signing_context, + BackingKind::Threshold, + core_index_enabled.then_some(CoreIndex(2 as u32)), + ); + backed_candidates.push(backed.clone()); + if core_index_enabled { + expected_backed_candidates_with_core + .entry(ParaId::from(2)) + .or_insert(vec![]) + .push((backed, CoreIndex(2))); + } + } + + // Para 3 + { + let mut candidate = TestCandidateBuilder { + para_id: ParaId::from(3), + relay_parent, + pov_hash: Hash::repeat_byte(4 as u8), + persisted_validation_data_hash: make_persisted_validation_data::( + ParaId::from(3), + RELAY_PARENT_NUM, + Default::default(), + ) + .unwrap() + .hash(), + hrmp_watermark: RELAY_PARENT_NUM, + validation_code: ValidationCode(vec![3]), + ..Default::default() + } + .build(); + + collator_sign_candidate(Sr25519Keyring::One, &mut candidate); + + let backed = back_candidate( + candidate, + &validators, + group_validators(GroupIndex::from(4 as u32)).unwrap().as_ref(), + &keystore, + &signing_context, + BackingKind::Threshold, + core_index_enabled.then_some(CoreIndex(4 as u32)), + ); + backed_candidates.push(backed.clone()); + expected_backed_candidates_with_core + .entry(ParaId::from(3)) + .or_insert(vec![]) + .push((backed, CoreIndex(4))); + } + + // Para 4 + { + let mut candidate = TestCandidateBuilder { + para_id: ParaId::from(4), + relay_parent, + pov_hash: Hash::repeat_byte(5 as u8), + persisted_validation_data_hash: make_persisted_validation_data::( + ParaId::from(4), + RELAY_PARENT_NUM, + Default::default(), + ) + .unwrap() + .hash(), + hrmp_watermark: RELAY_PARENT_NUM, + validation_code: ValidationCode(vec![4]), + ..Default::default() + } + .build(); + + collator_sign_candidate(Sr25519Keyring::One, &mut candidate); + + let prev_candidate = candidate.clone(); + let backed = back_candidate( + candidate, + &validators, + group_validators(GroupIndex::from(5 as u32)).unwrap().as_ref(), + &keystore, + &signing_context, + BackingKind::Threshold, + core_index_enabled.then_some(CoreIndex(5 as u32)), + ); + backed_candidates.push(backed.clone()); + expected_backed_candidates_with_core + .entry(ParaId::from(4)) + .or_insert(vec![]) + .push((backed, CoreIndex(5))); + + let mut candidate = TestCandidateBuilder { + para_id: ParaId::from(4), + relay_parent, + pov_hash: Hash::repeat_byte(6 as u8), + persisted_validation_data_hash: make_persisted_validation_data_with_parent::< + Test, + >( + RELAY_PARENT_NUM, + Default::default(), + prev_candidate.commitments.head_data, + ) + .hash(), + hrmp_watermark: RELAY_PARENT_NUM, + validation_code: ValidationCode(vec![4]), + ..Default::default() + } + .build(); + + collator_sign_candidate(Sr25519Keyring::One, &mut candidate); + + let backed = back_candidate( + candidate, + &validators, + group_validators(GroupIndex::from(5 as u32)).unwrap().as_ref(), + &keystore, + &signing_context, + BackingKind::Threshold, + core_index_enabled.then_some(CoreIndex(5 as u32)), + ); + backed_candidates.push(backed.clone()); + } + + // No candidate for para 5. + + // Para 6. + { + let mut candidate = TestCandidateBuilder { + para_id: ParaId::from(6), + relay_parent, + pov_hash: Hash::repeat_byte(3 as u8), + persisted_validation_data_hash: make_persisted_validation_data::( + ParaId::from(6), + RELAY_PARENT_NUM, + Default::default(), + ) + .unwrap() + .hash(), + hrmp_watermark: RELAY_PARENT_NUM, + validation_code: ValidationCode(vec![6]), + ..Default::default() + } + .build(); + + collator_sign_candidate(Sr25519Keyring::One, &mut candidate); + + let backed = back_candidate( + candidate, + &validators, + group_validators(GroupIndex::from(6 as u32)).unwrap().as_ref(), + &keystore, + &signing_context, + BackingKind::Threshold, + core_index_enabled.then_some(CoreIndex(6 as u32)), + ); + backed_candidates.push(backed.clone()); + } + + // Para 7. + { + let mut candidate = TestCandidateBuilder { + para_id: ParaId::from(7), + relay_parent, + pov_hash: Hash::repeat_byte(3 as u8), + persisted_validation_data_hash: make_persisted_validation_data::( + ParaId::from(7), + RELAY_PARENT_NUM, + Default::default(), + ) + .unwrap() + .hash(), + hrmp_watermark: RELAY_PARENT_NUM, + validation_code: ValidationCode(vec![7]), + ..Default::default() + } + .build(); + + collator_sign_candidate(Sr25519Keyring::One, &mut candidate); + + let backed = back_candidate( + candidate, + &validators, + group_validators(GroupIndex::from(6 as u32)).unwrap().as_ref(), + &keystore, + &signing_context, + BackingKind::Threshold, + core_index_enabled.then_some(CoreIndex(6 as u32)), + ); + backed_candidates.push(backed.clone()); + } + + // Para 8. + { + let mut candidate = TestCandidateBuilder { + para_id: ParaId::from(8), + relay_parent, + pov_hash: Hash::repeat_byte(3 as u8), + persisted_validation_data_hash: make_persisted_validation_data::( + ParaId::from(8), + RELAY_PARENT_NUM, + Default::default(), + ) + .unwrap() + .hash(), + hrmp_watermark: RELAY_PARENT_NUM, + validation_code: ValidationCode(vec![8]), + ..Default::default() + } + .build(); + + collator_sign_candidate(Sr25519Keyring::One, &mut candidate); + + let backed = back_candidate( + candidate, + &validators, + group_validators(GroupIndex::from(6 as u32)).unwrap().as_ref(), + &keystore, + &signing_context, + BackingKind::Threshold, + core_index_enabled.then_some(CoreIndex(7 as u32)), + ); + backed_candidates.push(backed.clone()); + if !core_index_enabled { + expected_backed_candidates_with_core + .entry(ParaId::from(8)) + .or_insert(vec![]) + .push((backed, CoreIndex(9))); + } + } + + // State sanity checks + assert_eq!( + scheduler::Pallet::::scheduled_paras().collect::>(), + vec![ + (CoreIndex(0), ParaId::from(1)), + (CoreIndex(1), ParaId::from(1)), + (CoreIndex(2), ParaId::from(2)), + (CoreIndex(3), ParaId::from(2)), + (CoreIndex(4), ParaId::from(3)), + (CoreIndex(5), ParaId::from(4)), + (CoreIndex(6), ParaId::from(5)), + (CoreIndex(7), ParaId::from(7)), + (CoreIndex(8), ParaId::from(7)), + (CoreIndex(9), ParaId::from(8)), + ] + ); + let mut scheduled: BTreeMap> = BTreeMap::new(); + for (core_idx, para_id) in scheduler::Pallet::::scheduled_paras() { + scheduled.entry(para_id).or_default().insert(core_idx); + } + + assert_eq!( + shared::ActiveValidatorIndices::::get(), + vec![ + ValidatorIndex(0), + ValidatorIndex(1), + ValidatorIndex(2), + ValidatorIndex(3), + ValidatorIndex(4), + ValidatorIndex(5), + ValidatorIndex(6), + ValidatorIndex(7), + ] + ); + + TestData { + backed_candidates, + scheduled_paras: scheduled, + expected_backed_candidates_with_core, + } + } + + // Para 1 scheduled on core 0 and core 1. Two candidates are supplied. They form a chain but + // in the wrong order. + // Para 2 scheduled on core 2, core 3 and core 4. Three candidates are supplied. The second + // one is not part of the chain. + // Para 3 scheduled on core 5 and 6. Two candidates are supplied and they all form a chain. + // Para 4 scheduled on core 7 and 8. Duplicated candidates. + fn get_test_data_for_order_checks(core_index_enabled: bool) -> TestData { + const RELAY_PARENT_NUM: u32 = 3; + + // Add the relay parent to `shared` pallet. Otherwise some code (e.g. filtering backing + // votes) won't behave correctly + shared::Pallet::::add_allowed_relay_parent( + default_header().hash(), + Default::default(), + RELAY_PARENT_NUM, + 1, + ); + + let header = default_header(); + let relay_parent = header.hash(); + let session_index = SessionIndex::from(0_u32); + + let keystore = LocalKeystore::in_memory(); + let keystore = Arc::new(keystore) as KeystorePtr; + let signing_context = SigningContext { parent_hash: relay_parent, session_index }; + + let validators = vec![ + keyring::Sr25519Keyring::Alice, + keyring::Sr25519Keyring::Bob, + keyring::Sr25519Keyring::Charlie, + keyring::Sr25519Keyring::Dave, + keyring::Sr25519Keyring::Eve, + keyring::Sr25519Keyring::Ferdie, + keyring::Sr25519Keyring::One, + keyring::Sr25519Keyring::Two, + keyring::Sr25519Keyring::AliceStash, + ]; + for validator in validators.iter() { + Keystore::sr25519_generate_new( + &*keystore, + PARACHAIN_KEY_TYPE_ID, + Some(&validator.to_seed()), + ) + .unwrap(); + } + + // Set active validators in `shared` pallet + let validator_ids = + validators.iter().map(|v| v.public().into()).collect::>(); + shared::Pallet::::set_active_validators_ascending(validator_ids); + + // Set the validator groups in `scheduler` + scheduler::Pallet::::set_validator_groups(vec![ + vec![ValidatorIndex(0)], + vec![ValidatorIndex(1)], + vec![ValidatorIndex(2)], + vec![ValidatorIndex(3)], + vec![ValidatorIndex(4)], + vec![ValidatorIndex(5)], + vec![ValidatorIndex(6)], + vec![ValidatorIndex(7)], + vec![ValidatorIndex(8)], + ]); + + // Update scheduler's claimqueue with the parachains + scheduler::Pallet::::set_claimqueue(BTreeMap::from([ + ( + CoreIndex::from(0), + VecDeque::from([ParasEntry::new( + Assignment::Pool { para_id: 1.into(), core_index: CoreIndex(0) }, + RELAY_PARENT_NUM, + )]), + ), + ( + CoreIndex::from(1), + VecDeque::from([ParasEntry::new( + Assignment::Pool { para_id: 1.into(), core_index: CoreIndex(1) }, + RELAY_PARENT_NUM, + )]), + ), + ( + CoreIndex::from(2), + VecDeque::from([ParasEntry::new( + Assignment::Pool { para_id: 2.into(), core_index: CoreIndex(2) }, + RELAY_PARENT_NUM, + )]), + ), + ( + CoreIndex::from(3), + VecDeque::from([ParasEntry::new( + Assignment::Pool { para_id: 2.into(), core_index: CoreIndex(3) }, + RELAY_PARENT_NUM, + )]), + ), + ( + CoreIndex::from(4), + VecDeque::from([ParasEntry::new( + Assignment::Pool { para_id: 2.into(), core_index: CoreIndex(4) }, + RELAY_PARENT_NUM, + )]), + ), + ( + CoreIndex::from(5), + VecDeque::from([ParasEntry::new( + Assignment::Pool { para_id: 3.into(), core_index: CoreIndex(5) }, + RELAY_PARENT_NUM, + )]), + ), + ( + CoreIndex::from(6), + VecDeque::from([ParasEntry::new( + Assignment::Pool { para_id: 3.into(), core_index: CoreIndex(6) }, + RELAY_PARENT_NUM, + )]), + ), + ( + CoreIndex::from(7), + VecDeque::from([ParasEntry::new( + Assignment::Pool { para_id: 4.into(), core_index: CoreIndex(7) }, + RELAY_PARENT_NUM, + )]), + ), + ( + CoreIndex::from(8), + VecDeque::from([ParasEntry::new( + Assignment::Pool { para_id: 4.into(), core_index: CoreIndex(8) }, + RELAY_PARENT_NUM, + )]), + ), + ])); + + // Set the on-chain included head data and current code hash. + for id in 1..=4u32 { + paras::Pallet::::set_current_head(ParaId::from(id), HeadData(vec![id as u8])); + paras::Pallet::::force_set_current_code( + RuntimeOrigin::root(), + ParaId::from(id), + ValidationCode(vec![id as u8]), + ) + .unwrap(); + } + + // Callback used for backing candidates + let group_validators = |group_index: GroupIndex| { + match group_index { + group_index if group_index == GroupIndex::from(0) => Some(vec![0]), + group_index if group_index == GroupIndex::from(1) => Some(vec![1]), + group_index if group_index == GroupIndex::from(2) => Some(vec![2]), + group_index if group_index == GroupIndex::from(3) => Some(vec![3]), + group_index if group_index == GroupIndex::from(4) => Some(vec![4]), + group_index if group_index == GroupIndex::from(5) => Some(vec![5]), + group_index if group_index == GroupIndex::from(6) => Some(vec![6]), + group_index if group_index == GroupIndex::from(7) => Some(vec![7]), + group_index if group_index == GroupIndex::from(8) => Some(vec![8]), + + _ => panic!("Group index out of bounds"), + } + .map(|m| m.into_iter().map(ValidatorIndex).collect::>()) + }; + + let mut backed_candidates = vec![]; + let mut expected_backed_candidates_with_core = BTreeMap::new(); + + // Para 1 + { + let mut candidate = TestCandidateBuilder { + para_id: ParaId::from(1), + relay_parent, + pov_hash: Hash::repeat_byte(1 as u8), + persisted_validation_data_hash: make_persisted_validation_data::( + ParaId::from(1), + RELAY_PARENT_NUM, + Default::default(), + ) + .unwrap() + .hash(), + head_data: HeadData(vec![1, 1]), + hrmp_watermark: RELAY_PARENT_NUM, + validation_code: ValidationCode(vec![1]), + ..Default::default() + } + .build(); + + collator_sign_candidate(Sr25519Keyring::One, &mut candidate); + + let prev_candidate = candidate.clone(); + let prev_backed: BackedCandidate = back_candidate( + candidate, + &validators, + group_validators(GroupIndex::from(0 as u32)).unwrap().as_ref(), + &keystore, + &signing_context, + BackingKind::Threshold, + core_index_enabled.then_some(CoreIndex(0 as u32)), + ); + + let mut candidate = TestCandidateBuilder { + para_id: ParaId::from(1), + relay_parent, + pov_hash: Hash::repeat_byte(2 as u8), + persisted_validation_data_hash: make_persisted_validation_data_with_parent::< + Test, + >( + RELAY_PARENT_NUM, + Default::default(), + prev_candidate.commitments.head_data, + ) + .hash(), + hrmp_watermark: RELAY_PARENT_NUM, + validation_code: ValidationCode(vec![1]), + ..Default::default() + } + .build(); + + collator_sign_candidate(Sr25519Keyring::One, &mut candidate); + + let backed = back_candidate( + candidate, + &validators, + group_validators(GroupIndex::from(1 as u32)).unwrap().as_ref(), + &keystore, + &signing_context, + BackingKind::Threshold, + core_index_enabled.then_some(CoreIndex(1 as u32)), + ); + backed_candidates.push(backed.clone()); + backed_candidates.push(prev_backed.clone()); + } + + // Para 2. + { + let mut candidate_1 = TestCandidateBuilder { + para_id: ParaId::from(2), + relay_parent, + pov_hash: Hash::repeat_byte(3 as u8), + persisted_validation_data_hash: make_persisted_validation_data::( + ParaId::from(2), + RELAY_PARENT_NUM, + Default::default(), + ) + .unwrap() + .hash(), + head_data: HeadData(vec![2, 2]), + hrmp_watermark: RELAY_PARENT_NUM, + validation_code: ValidationCode(vec![2]), + ..Default::default() + } + .build(); + + collator_sign_candidate(Sr25519Keyring::One, &mut candidate_1); + + let backed_1: BackedCandidate = back_candidate( + candidate_1, + &validators, + group_validators(GroupIndex::from(2 as u32)).unwrap().as_ref(), + &keystore, + &signing_context, + BackingKind::Threshold, + core_index_enabled.then_some(CoreIndex(2 as u32)), + ); + + backed_candidates.push(backed_1.clone()); + if core_index_enabled { + expected_backed_candidates_with_core + .entry(ParaId::from(2)) + .or_insert(vec![]) + .push((backed_1, CoreIndex(2))); + } + + let mut candidate_2 = TestCandidateBuilder { + para_id: ParaId::from(2), + relay_parent, + pov_hash: Hash::repeat_byte(4 as u8), + persisted_validation_data_hash: make_persisted_validation_data::( + ParaId::from(2), + RELAY_PARENT_NUM, + Default::default(), + ) + .unwrap() + .hash(), + hrmp_watermark: RELAY_PARENT_NUM, + validation_code: ValidationCode(vec![2]), + head_data: HeadData(vec![3, 3]), + ..Default::default() + } + .build(); + + collator_sign_candidate(Sr25519Keyring::One, &mut candidate_2); + + let backed_2 = back_candidate( + candidate_2.clone(), + &validators, + group_validators(GroupIndex::from(3 as u32)).unwrap().as_ref(), + &keystore, + &signing_context, + BackingKind::Threshold, + core_index_enabled.then_some(CoreIndex(3 as u32)), + ); + backed_candidates.push(backed_2.clone()); + + let mut candidate_3 = TestCandidateBuilder { + para_id: ParaId::from(2), + relay_parent, + pov_hash: Hash::repeat_byte(5 as u8), + persisted_validation_data_hash: make_persisted_validation_data_with_parent::< + Test, + >( + RELAY_PARENT_NUM, + Default::default(), + candidate_2.commitments.head_data, + ) + .hash(), + hrmp_watermark: RELAY_PARENT_NUM, + validation_code: ValidationCode(vec![2]), + ..Default::default() + } + .build(); + + collator_sign_candidate(Sr25519Keyring::One, &mut candidate_3); + + let backed_3 = back_candidate( + candidate_3, + &validators, + group_validators(GroupIndex::from(4 as u32)).unwrap().as_ref(), + &keystore, + &signing_context, + BackingKind::Threshold, + core_index_enabled.then_some(CoreIndex(4 as u32)), + ); + backed_candidates.push(backed_3.clone()); + } + + // Para 3 + { + let mut candidate = TestCandidateBuilder { + para_id: ParaId::from(3), + relay_parent, + pov_hash: Hash::repeat_byte(6 as u8), + persisted_validation_data_hash: make_persisted_validation_data::( + ParaId::from(3), + RELAY_PARENT_NUM, + Default::default(), + ) + .unwrap() + .hash(), + head_data: HeadData(vec![3, 3]), + hrmp_watermark: RELAY_PARENT_NUM, + validation_code: ValidationCode(vec![3]), + ..Default::default() + } + .build(); + + collator_sign_candidate(Sr25519Keyring::One, &mut candidate); + + let prev_candidate = candidate.clone(); + let backed: BackedCandidate = back_candidate( + candidate, + &validators, + group_validators(GroupIndex::from(5 as u32)).unwrap().as_ref(), + &keystore, + &signing_context, + BackingKind::Threshold, + core_index_enabled.then_some(CoreIndex(5 as u32)), + ); + backed_candidates.push(backed.clone()); + if core_index_enabled { + expected_backed_candidates_with_core + .entry(ParaId::from(3)) + .or_insert(vec![]) + .push((backed, CoreIndex(5))); + } + + let mut candidate = TestCandidateBuilder { + para_id: ParaId::from(3), + relay_parent, + pov_hash: Hash::repeat_byte(6 as u8), + persisted_validation_data_hash: make_persisted_validation_data_with_parent::< + Test, + >( + RELAY_PARENT_NUM, + Default::default(), + prev_candidate.commitments.head_data, + ) + .hash(), + hrmp_watermark: RELAY_PARENT_NUM, + validation_code: ValidationCode(vec![3]), + ..Default::default() + } + .build(); + + collator_sign_candidate(Sr25519Keyring::One, &mut candidate); + + let backed = back_candidate( + candidate, + &validators, + group_validators(GroupIndex::from(6 as u32)).unwrap().as_ref(), + &keystore, + &signing_context, + BackingKind::Threshold, + core_index_enabled.then_some(CoreIndex(6 as u32)), + ); + backed_candidates.push(backed.clone()); + if core_index_enabled { + expected_backed_candidates_with_core + .entry(ParaId::from(3)) + .or_insert(vec![]) + .push((backed, CoreIndex(6))); + } + } + + // Para 4 + { + let mut candidate = TestCandidateBuilder { + para_id: ParaId::from(4), + relay_parent, + pov_hash: Hash::repeat_byte(8 as u8), + persisted_validation_data_hash: make_persisted_validation_data::( + ParaId::from(4), + RELAY_PARENT_NUM, + Default::default(), + ) + .unwrap() + .hash(), + head_data: HeadData(vec![4]), + hrmp_watermark: RELAY_PARENT_NUM, + validation_code: ValidationCode(vec![4]), + ..Default::default() + } + .build(); + + collator_sign_candidate(Sr25519Keyring::One, &mut candidate); + + let backed: BackedCandidate = back_candidate( + candidate.clone(), + &validators, + group_validators(GroupIndex::from(7 as u32)).unwrap().as_ref(), + &keystore, + &signing_context, + BackingKind::Threshold, + core_index_enabled.then_some(CoreIndex(7 as u32)), + ); + backed_candidates.push(backed.clone()); + if core_index_enabled { + expected_backed_candidates_with_core + .entry(ParaId::from(4)) + .or_insert(vec![]) + .push((backed, CoreIndex(7))); + } + + let backed: BackedCandidate = back_candidate( + candidate, + &validators, + group_validators(GroupIndex::from(7 as u32)).unwrap().as_ref(), + &keystore, + &signing_context, + BackingKind::Threshold, + core_index_enabled.then_some(CoreIndex(8 as u32)), + ); + backed_candidates.push(backed.clone()); + } + + // State sanity checks + assert_eq!( + scheduler::Pallet::::scheduled_paras().collect::>(), + vec![ + (CoreIndex(0), ParaId::from(1)), + (CoreIndex(1), ParaId::from(1)), + (CoreIndex(2), ParaId::from(2)), + (CoreIndex(3), ParaId::from(2)), + (CoreIndex(4), ParaId::from(2)), + (CoreIndex(5), ParaId::from(3)), + (CoreIndex(6), ParaId::from(3)), + (CoreIndex(7), ParaId::from(4)), + (CoreIndex(8), ParaId::from(4)), + ] + ); + let mut scheduled: BTreeMap> = BTreeMap::new(); + for (core_idx, para_id) in scheduler::Pallet::::scheduled_paras() { + scheduled.entry(para_id).or_default().insert(core_idx); + } + + assert_eq!( + shared::ActiveValidatorIndices::::get(), + vec![ + ValidatorIndex(0), + ValidatorIndex(1), + ValidatorIndex(2), + ValidatorIndex(3), + ValidatorIndex(4), + ValidatorIndex(5), + ValidatorIndex(6), + ValidatorIndex(7), + ValidatorIndex(8), + ] + ); + + TestData { + backed_candidates, + scheduled_paras: scheduled, + expected_backed_candidates_with_core, + } + } + + #[rstest] + #[case(false)] + #[case(true)] + fn happy_path_one_core_per_para(#[case] core_index_enabled: bool) { + new_test_ext(default_config()).execute_with(|| { + let TestData { + backed_candidates, + expected_backed_candidates_with_core, + scheduled_paras: scheduled, + } = get_test_data_one_core_per_para(core_index_enabled); + + assert_eq!( + sanitize_backed_candidates::( + backed_candidates.clone(), + &shared::AllowedRelayParents::::get(), + BTreeSet::new(), + scheduled, + core_index_enabled + ), + expected_backed_candidates_with_core, + ); + }); + } + + #[rstest] + #[case(false)] + #[case(true)] + fn test_with_multiple_cores_per_para(#[case] core_index_enabled: bool) { + new_test_ext(default_config()).execute_with(|| { + let TestData { + backed_candidates, + expected_backed_candidates_with_core, + scheduled_paras: scheduled, + } = get_test_data_multiple_cores_per_para(core_index_enabled); + + assert_eq!( + sanitize_backed_candidates::( + backed_candidates.clone(), + &shared::AllowedRelayParents::::get(), + BTreeSet::new(), + scheduled, + core_index_enabled + ), + expected_backed_candidates_with_core, + ); + }); + } + + #[rstest] + #[case(false)] + #[case(true)] + fn test_candidate_ordering(#[case] core_index_enabled: bool) { + new_test_ext(default_config()).execute_with(|| { + let TestData { + backed_candidates, + scheduled_paras: scheduled, + expected_backed_candidates_with_core, + } = get_test_data_for_order_checks(core_index_enabled); + + assert_eq!( + sanitize_backed_candidates::( + backed_candidates.clone(), + &shared::AllowedRelayParents::::get(), + BTreeSet::new(), + scheduled, + core_index_enabled, + ), + expected_backed_candidates_with_core + ); + }); + } + + // nothing is scheduled, so no paraids match, thus all backed candidates are skipped + #[rstest] + #[case(false, false)] + #[case(true, true)] + #[case(false, true)] + #[case(true, false)] + fn nothing_scheduled( + #[case] core_index_enabled: bool, + #[case] multiple_cores_per_para: bool, + ) { + new_test_ext(default_config()).execute_with(|| { + let TestData { backed_candidates, .. } = if multiple_cores_per_para { + get_test_data_multiple_cores_per_para(core_index_enabled) + } else { + get_test_data_one_core_per_para(core_index_enabled) + }; + let scheduled = BTreeMap::new(); + + let sanitized_backed_candidates = sanitize_backed_candidates::( + backed_candidates.clone(), + &shared::AllowedRelayParents::::get(), + BTreeSet::new(), + scheduled, + core_index_enabled, + ); + + assert!(sanitized_backed_candidates.is_empty()); + }); + } + + // candidates that have concluded as invalid are filtered out + #[rstest] + #[case(false)] + #[case(true)] + fn concluded_invalid_are_filtered_out_single_core_per_para( + #[case] core_index_enabled: bool, + ) { + new_test_ext(default_config()).execute_with(|| { + let TestData { backed_candidates, scheduled_paras: scheduled, .. } = + get_test_data_one_core_per_para(core_index_enabled); + + // mark every second one as concluded invalid + let set = { + let mut set = std::collections::BTreeSet::new(); + for (idx, backed_candidate) in backed_candidates.iter().enumerate() { + if idx & 0x01 == 0 { + set.insert(backed_candidate.hash()); + } + } + set + }; + let sanitized_backed_candidates: BTreeMap< + ParaId, + Vec<(BackedCandidate<_>, CoreIndex)>, + > = sanitize_backed_candidates::( + backed_candidates.clone(), + &shared::AllowedRelayParents::::get(), + set, + scheduled, + core_index_enabled, + ); + + assert_eq!(sanitized_backed_candidates.len(), backed_candidates.len() / 2); + }); + } + + // candidates that have concluded as invalid are filtered out, as well as their descendants. + #[test] + fn concluded_invalid_are_filtered_out_multiple_cores_per_para() { + // Mark the first candidate of paraid 1 as invalid. Its descendant should also + // be dropped. Also mark the candidate of paraid 3 as invalid. + new_test_ext(default_config()).execute_with(|| { + let TestData { + backed_candidates, + scheduled_paras: scheduled, + mut expected_backed_candidates_with_core, + .. + } = get_test_data_multiple_cores_per_para(true); + + let mut invalid_set = std::collections::BTreeSet::new(); + + for (idx, backed_candidate) in backed_candidates.iter().enumerate() { + if backed_candidate.descriptor().para_id == ParaId::from(1) && idx == 0 { + invalid_set.insert(backed_candidate.hash()); + } else if backed_candidate.descriptor().para_id == ParaId::from(3) { + invalid_set.insert(backed_candidate.hash()); + } + } + let sanitized_backed_candidates: BTreeMap< + ParaId, + Vec<(BackedCandidate<_>, CoreIndex)>, + > = sanitize_backed_candidates::( + backed_candidates.clone(), + &shared::AllowedRelayParents::::get(), + invalid_set, + scheduled, + true, + ); + + // We'll be left with candidates from paraid 2 and 4. + + expected_backed_candidates_with_core.remove(&ParaId::from(1)).unwrap(); + expected_backed_candidates_with_core.remove(&ParaId::from(3)).unwrap(); + + assert_eq!(sanitized_backed_candidates, sanitized_backed_candidates); + }); + + // Mark the second candidate of paraid 1 as invalid. Its predecessor should be left + // in place. + new_test_ext(default_config()).execute_with(|| { + let TestData { + backed_candidates, + scheduled_paras: scheduled, + mut expected_backed_candidates_with_core, + .. + } = get_test_data_multiple_cores_per_para(true); + + let mut invalid_set = std::collections::BTreeSet::new(); + + for (idx, backed_candidate) in backed_candidates.iter().enumerate() { + if backed_candidate.descriptor().para_id == ParaId::from(1) && idx == 1 { + invalid_set.insert(backed_candidate.hash()); + } + } + let sanitized_backed_candidates: BTreeMap< + ParaId, + Vec<(BackedCandidate<_>, CoreIndex)>, + > = sanitize_backed_candidates::( + backed_candidates.clone(), + &shared::AllowedRelayParents::::get(), + invalid_set, + scheduled, + true, + ); + + // Only the second candidate of paraid 1 should be removed. + expected_backed_candidates_with_core + .get_mut(&ParaId::from(1)) + .unwrap() + .remove(1); + + // We'll be left with candidates from paraid 1, 2, 3 and 4. + assert_eq!(sanitized_backed_candidates, expected_backed_candidates_with_core); + }); + } + + #[rstest] + #[case(false)] + #[case(true)] + fn disabled_non_signing_validator_doesnt_get_filtered(#[case] core_index_enabled: bool) { + new_test_ext(default_config()).execute_with(|| { + let TestData { mut expected_backed_candidates_with_core, .. } = + get_test_data_one_core_per_para(core_index_enabled); // Disable Eve set_disabled_validators(vec![4]); - let before = backed_candidates.clone(); + let before = expected_backed_candidates_with_core.clone(); // Eve is disabled but no backing statement is signed by it so nothing should be // filtered - assert!(!filter_backed_statements_from_disabled_validators::( - &mut backed_candidates, - &>::allowed_relay_parents(), - &scheduled_paras - )); - assert_eq!(backed_candidates, before); + filter_backed_statements_from_disabled_validators::( + &mut expected_backed_candidates_with_core, + &shared::AllowedRelayParents::::get(), + core_index_enabled, + ); + assert_eq!(expected_backed_candidates_with_core, before); }); } - #[test] - fn drop_statements_from_disabled_without_dropping_candidate() { - new_test_ext(MockGenesisConfig::default()).execute_with(|| { - let TestData { mut backed_candidates, scheduled_paras } = get_test_data(); + #[rstest] + #[case(false)] + #[case(true)] + fn drop_statements_from_disabled_without_dropping_candidate( + #[case] core_index_enabled: bool, + ) { + new_test_ext(default_config()).execute_with(|| { + let TestData { mut expected_backed_candidates_with_core, .. } = + get_test_data_one_core_per_para(core_index_enabled); // Disable Alice set_disabled_validators(vec![0]); @@ -1486,67 +3238,202 @@ mod sanitizers { // Update `minimum_backing_votes` in HostConfig. We want `minimum_backing_votes` set // to one so that the candidate will have enough backing votes even after dropping // Alice's one. - let mut hc = configuration::Pallet::::config(); + let mut hc = configuration::ActiveConfig::::get(); hc.minimum_backing_votes = 1; configuration::Pallet::::force_set_active_config(hc); // Verify the initial state is as expected - assert_eq!(backed_candidates.get(0).unwrap().validity_votes.len(), 2); assert_eq!( - backed_candidates.get(0).unwrap().validator_indices.get(0).unwrap(), - true + expected_backed_candidates_with_core + .get(&ParaId::from(1)) + .unwrap() + .iter() + .next() + .unwrap() + .0 + .validity_votes() + .len(), + 2 ); - assert_eq!( - backed_candidates.get(0).unwrap().validator_indices.get(1).unwrap(), - true - ); - let untouched = backed_candidates.get(1).unwrap().clone(); + let (validator_indices, maybe_core_index) = expected_backed_candidates_with_core + .get(&ParaId::from(1)) + .unwrap() + .iter() + .next() + .unwrap() + .0 + .validator_indices_and_core_index(core_index_enabled); + if core_index_enabled { + assert!(maybe_core_index.is_some()); + } else { + assert!(maybe_core_index.is_none()); + } - assert!(filter_backed_statements_from_disabled_validators::( - &mut backed_candidates, - &>::allowed_relay_parents(), - &scheduled_paras - )); + assert_eq!(validator_indices.get(0).unwrap(), true); + assert_eq!(validator_indices.get(1).unwrap(), true); + let untouched = expected_backed_candidates_with_core + .get(&ParaId::from(2)) + .unwrap() + .iter() + .next() + .unwrap() + .0 + .clone(); + + let before = expected_backed_candidates_with_core.clone(); + filter_backed_statements_from_disabled_validators::( + &mut expected_backed_candidates_with_core, + &shared::AllowedRelayParents::::get(), + core_index_enabled, + ); + assert_eq!(before.len(), expected_backed_candidates_with_core.len()); + + let (validator_indices, maybe_core_index) = expected_backed_candidates_with_core + .get(&ParaId::from(1)) + .unwrap() + .iter() + .next() + .unwrap() + .0 + .validator_indices_and_core_index(core_index_enabled); + if core_index_enabled { + assert!(maybe_core_index.is_some()); + } else { + assert!(maybe_core_index.is_none()); + } // there should still be two backed candidates - assert_eq!(backed_candidates.len(), 2); + assert_eq!(expected_backed_candidates_with_core.len(), 2); // but the first one should have only one validity vote - assert_eq!(backed_candidates.get(0).unwrap().validity_votes.len(), 1); - // Validator 0 vote should be dropped, validator 1 - retained assert_eq!( - backed_candidates.get(0).unwrap().validator_indices.get(0).unwrap(), - false + expected_backed_candidates_with_core + .get(&ParaId::from(1)) + .unwrap() + .iter() + .next() + .unwrap() + .0 + .validity_votes() + .len(), + 1 ); + // Validator 0 vote should be dropped, validator 1 - retained + assert_eq!(validator_indices.get(0).unwrap(), false); + assert_eq!(validator_indices.get(1).unwrap(), true); + // the second candidate shouldn't be modified assert_eq!( - backed_candidates.get(0).unwrap().validator_indices.get(1).unwrap(), - true + expected_backed_candidates_with_core + .get(&ParaId::from(2)) + .unwrap() + .iter() + .next() + .unwrap() + .0, + untouched ); - // the second candidate shouldn't be modified - assert_eq!(*backed_candidates.get(1).unwrap(), untouched); }); } - #[test] - fn drop_candidate_if_all_statements_are_from_disabled() { - new_test_ext(MockGenesisConfig::default()).execute_with(|| { - let TestData { mut backed_candidates, scheduled_paras } = get_test_data(); + #[rstest] + #[case(false)] + #[case(true)] + fn drop_candidate_if_all_statements_are_from_disabled_single_core_per_para( + #[case] core_index_enabled: bool, + ) { + new_test_ext(default_config()).execute_with(|| { + let TestData { mut expected_backed_candidates_with_core, .. } = + get_test_data_one_core_per_para(core_index_enabled); // Disable Alice and Bob set_disabled_validators(vec![0, 1]); // Verify the initial state is as expected - assert_eq!(backed_candidates.get(0).unwrap().validity_votes.len(), 2); - let untouched = backed_candidates.get(1).unwrap().clone(); + assert_eq!( + expected_backed_candidates_with_core + .get(&ParaId::from(1)) + .unwrap() + .iter() + .next() + .unwrap() + .0 + .validity_votes() + .len(), + 2 + ); + let untouched = expected_backed_candidates_with_core + .get(&ParaId::from(2)) + .unwrap() + .iter() + .next() + .unwrap() + .0 + .clone(); + + filter_backed_statements_from_disabled_validators::( + &mut expected_backed_candidates_with_core, + &shared::AllowedRelayParents::::get(), + core_index_enabled, + ); - assert!(filter_backed_statements_from_disabled_validators::( - &mut backed_candidates, - &>::allowed_relay_parents(), - &scheduled_paras - )); + assert_eq!(expected_backed_candidates_with_core.len(), 1); + assert_eq!( + expected_backed_candidates_with_core + .get(&ParaId::from(2)) + .unwrap() + .iter() + .next() + .unwrap() + .0, + untouched + ); + assert_eq!(expected_backed_candidates_with_core.get(&ParaId::from(1)), None); + }); + } + + #[test] + fn drop_candidate_if_all_statements_are_from_disabled_multiple_cores_per_para() { + // Disable Bob, only the second candidate of paraid 1 should be removed. + new_test_ext(default_config()).execute_with(|| { + let TestData { mut expected_backed_candidates_with_core, .. } = + get_test_data_multiple_cores_per_para(true); - assert_eq!(backed_candidates.len(), 1); - assert_eq!(*backed_candidates.get(0).unwrap(), untouched); + set_disabled_validators(vec![1]); + + let mut untouched = expected_backed_candidates_with_core.clone(); + + filter_backed_statements_from_disabled_validators::( + &mut expected_backed_candidates_with_core, + &shared::AllowedRelayParents::::get(), + true, + ); + + untouched.get_mut(&ParaId::from(1)).unwrap().remove(1); + + assert_eq!(expected_backed_candidates_with_core, untouched); }); + + // Disable Alice or disable both Alice and Bob, all candidates of paraid 1 should be + // removed. + for disabled in [vec![0], vec![0, 1]] { + new_test_ext(default_config()).execute_with(|| { + let TestData { mut expected_backed_candidates_with_core, .. } = + get_test_data_multiple_cores_per_para(true); + + set_disabled_validators(disabled); + + let mut untouched = expected_backed_candidates_with_core.clone(); + + filter_backed_statements_from_disabled_validators::( + &mut expected_backed_candidates_with_core, + &shared::AllowedRelayParents::::get(), + true, + ); + + untouched.remove(&ParaId::from(1)).unwrap(); + + assert_eq!(expected_backed_candidates_with_core, untouched); + }); + } } } } diff --git a/polkadot/runtime/parachains/src/paras_inherent/weights.rs b/polkadot/runtime/parachains/src/paras_inherent/weights.rs index 05cc53fae04652c188d62b57fa5281aa6bb88e22..0f4e5be572a66d16c1476ada7671c495a27bbc83 100644 --- a/polkadot/runtime/parachains/src/paras_inherent/weights.rs +++ b/polkadot/runtime/parachains/src/paras_inherent/weights.rs @@ -149,11 +149,11 @@ pub fn backed_candidate_weight( candidate: &BackedCandidate, ) -> Weight { set_proof_size_to_tx_size( - if candidate.candidate.commitments.new_validation_code.is_some() { + if candidate.candidate().commitments.new_validation_code.is_some() { <::WeightInfo as WeightInfo>::enter_backed_candidate_code_upgrade() } else { <::WeightInfo as WeightInfo>::enter_backed_candidates_variable( - candidate.validity_votes.len() as u32, + candidate.validity_votes().len() as u32, ) }, candidate, diff --git a/polkadot/runtime/parachains/src/reward_points.rs b/polkadot/runtime/parachains/src/reward_points.rs index e9a9c5547a7ad8f35b61008c49f0002126a5b276..3be743a2c55133da56e52b654bfa87f26ef596d1 100644 --- a/polkadot/runtime/parachains/src/reward_points.rs +++ b/polkadot/runtime/parachains/src/reward_points.rs @@ -45,7 +45,7 @@ where indices: impl IntoIterator, points: u32, ) { - let validators = session_info::Pallet::::account_keys(&session_index); + let validators = session_info::AccountKeys::::get(&session_index); let validators = match validators .defensive_proof("account_keys are present for dispute_period sessions") { @@ -71,7 +71,7 @@ where C::ValidatorSet: ValidatorSet, { fn reward_backing(indices: impl IntoIterator) { - let session_index = shared::Pallet::::session_index(); + let session_index = shared::CurrentSessionIndex::::get(); Self::reward_only_active(session_index, indices, BACKING_POINTS); } diff --git a/polkadot/runtime/parachains/src/runtime_api_impl/mod.rs b/polkadot/runtime/parachains/src/runtime_api_impl/mod.rs index ba74e488cd3b7aac66fb4e62938235b491cce839..ed2e95b3cfa989f0c00f32af63f5f3d015b175ae 100644 --- a/polkadot/runtime/parachains/src/runtime_api_impl/mod.rs +++ b/polkadot/runtime/parachains/src/runtime_api_impl/mod.rs @@ -26,5 +26,5 @@ //! 2. Move methods from `vstaging` to `v3`. The new stable version should include all methods from //! `vstaging` tagged with the new version number (e.g. all `v3` methods). -pub mod v7; +pub mod v10; pub mod vstaging; diff --git a/polkadot/runtime/parachains/src/runtime_api_impl/v7.rs b/polkadot/runtime/parachains/src/runtime_api_impl/v10.rs similarity index 66% rename from polkadot/runtime/parachains/src/runtime_api_impl/v7.rs rename to polkadot/runtime/parachains/src/runtime_api_impl/v10.rs index 1bbd4dfb716f1f541b40bca3e3a434b21c5a7a81..39d4f520994a9993e64f448b456086d4aca99a83 100644 --- a/polkadot/runtime/parachains/src/runtime_api_impl/v7.rs +++ b/polkadot/runtime/parachains/src/runtime_api_impl/v10.rs @@ -14,7 +14,7 @@ //! A module exporting runtime API implementation functions for all runtime APIs using `v5` //! primitives. //! -//! Runtimes implementing the v2 runtime API are recommended to forward directly to these +//! Runtimes implementing the v10 runtime API are recommended to forward directly to these //! functions. use crate::{ @@ -22,24 +22,26 @@ use crate::{ scheduler::{self, CoreOccupied}, session_info, shared, }; +use frame_support::traits::{GetStorageVersion, StorageVersion}; use frame_system::pallet_prelude::*; use primitives::{ async_backing::{ AsyncBackingParams, BackingState, CandidatePendingAvailability, Constraints, InboundHrmpLimitations, OutboundHrmpChannelLimitations, }, - slashing, AuthorityDiscoveryId, CandidateEvent, CandidateHash, CommittedCandidateReceipt, - CoreIndex, CoreState, DisputeState, ExecutorParams, GroupIndex, GroupRotationInfo, Hash, - Id as ParaId, InboundDownwardMessage, InboundHrmpMessage, OccupiedCore, OccupiedCoreAssumption, - PersistedValidationData, PvfCheckStatement, ScrapedOnChainVotes, SessionIndex, SessionInfo, - ValidationCode, ValidationCodeHash, ValidatorId, ValidatorIndex, ValidatorSignature, + slashing, ApprovalVotingParams, AuthorityDiscoveryId, CandidateEvent, CandidateHash, + CommittedCandidateReceipt, CoreIndex, CoreState, DisputeState, ExecutorParams, GroupIndex, + GroupRotationInfo, Hash, Id as ParaId, InboundDownwardMessage, InboundHrmpMessage, + NodeFeatures, OccupiedCore, OccupiedCoreAssumption, PersistedValidationData, PvfCheckStatement, + ScrapedOnChainVotes, SessionIndex, SessionInfo, ValidationCode, ValidationCodeHash, + ValidatorId, ValidatorIndex, ValidatorSignature, }; use sp_runtime::traits::One; use sp_std::{collections::btree_map::BTreeMap, prelude::*}; /// Implementation for the `validators` function of the runtime API. pub fn validators() -> Vec { - >::active_validator_keys() + shared::ActiveValidatorKeys::::get() } /// Implementation for the `validator_groups` function of the runtime API. @@ -47,29 +49,29 @@ pub fn validator_groups( ) -> (Vec>, GroupRotationInfo>) { // This formula needs to be the same as the one we use // when populating group_responsible in `availability_cores` - let now = >::block_number() + One::one(); + let now = frame_system::Pallet::::block_number() + One::one(); - let groups = >::validator_groups(); - let rotation_info = >::group_rotation_info(now); + let groups = scheduler::ValidatorGroups::::get(); + let rotation_info = scheduler::Pallet::::group_rotation_info(now); (groups, rotation_info) } /// Implementation for the `availability_cores` function of the runtime API. pub fn availability_cores() -> Vec>> { - let cores = >::availability_cores(); - let now = >::block_number() + One::one(); + let cores = scheduler::AvailabilityCores::::get(); + let now = frame_system::Pallet::::block_number() + One::one(); // This explicit update is only strictly required for session boundaries: // // At the end of a session we clear the claim queues: Without this update call, nothing would be // scheduled to the client. - >::free_cores_and_fill_claimqueue(Vec::new(), now); + scheduler::Pallet::::free_cores_and_fill_claimqueue(Vec::new(), now); - let time_out_for = >::availability_timeout_predicate(); + let time_out_for = scheduler::Pallet::::availability_timeout_predicate(); let group_responsible_for = - |backed_in_number, core_index| match >::group_assigned_to_core( + |backed_in_number, core_index| match scheduler::Pallet::::group_assigned_to_core( core_index, backed_in_number, ) { @@ -85,39 +87,64 @@ pub fn availability_cores() -> Vec = >::scheduled_paras().collect(); + let scheduled: BTreeMap<_, _> = scheduler::Pallet::::scheduled_paras().collect(); cores .into_iter() .enumerate() .map(|(i, core)| match core { CoreOccupied::Paras(entry) => { - let pending_availability = - >::pending_availability(entry.para_id()) - .expect("Occupied core always has pending availability; qed"); - - let backed_in_number = *pending_availability.backed_in_number(); + // Due to https://github.com/paritytech/polkadot-sdk/issues/64, using the new storage types would cause + // this runtime API to panic. We explicitly handle the storage for version 0 to + // prevent that. When removing the inclusion v0 -> v1 migration, this bit of code + // can also be removed. + let pending_availability = if inclusion::Pallet::::on_chain_storage_version() == + StorageVersion::new(0) + { + inclusion::migration::v0::PendingAvailability::::get(entry.para_id()) + .expect("Occupied core always has pending availability; qed") + } else { + let candidate = inclusion::Pallet::::pending_availability_with_core( + entry.para_id(), + CoreIndex(i as u32), + ) + .expect("Occupied core always has pending availability; qed"); + + // Translate to the old candidate format, as we don't need the commitments now. + inclusion::migration::v0::CandidatePendingAvailability { + core: candidate.core_occupied(), + hash: candidate.candidate_hash(), + descriptor: candidate.candidate_descriptor().clone(), + availability_votes: candidate.availability_votes().clone(), + backers: candidate.backers().clone(), + relay_parent_number: candidate.relay_parent_number(), + backed_in_number: candidate.backed_in_number(), + backing_group: candidate.backing_group(), + } + }; + + let backed_in_number = pending_availability.backed_in_number; // Use the same block number for determining the responsible group as what the // backing subsystem would use when it calls validator_groups api. let backing_group_allocation_time = - pending_availability.relay_parent_number() + One::one(); + pending_availability.relay_parent_number + One::one(); CoreState::Occupied(OccupiedCore { - next_up_on_available: >::next_up_on_available(CoreIndex( + next_up_on_available: scheduler::Pallet::::next_up_on_available(CoreIndex( i as u32, )), occupied_since: backed_in_number, time_out_at: time_out_for(backed_in_number).live_until, - next_up_on_time_out: >::next_up_on_time_out(CoreIndex( + next_up_on_time_out: scheduler::Pallet::::next_up_on_time_out(CoreIndex( i as u32, )), - availability: pending_availability.availability_votes().clone(), + availability: pending_availability.availability_votes.clone(), group_responsible: group_responsible_for( backing_group_allocation_time, - pending_availability.core_occupied(), + pending_availability.core, ), - candidate_hash: pending_availability.candidate_hash(), - candidate_descriptor: pending_availability.candidate_descriptor().clone(), + candidate_hash: pending_availability.hash, + candidate_descriptor: pending_availability.descriptor, }) }, CoreOccupied::Free => { @@ -135,8 +162,8 @@ pub fn availability_cores() -> Vec( ) -> (BlockNumberFor, ::Hash) { use parity_scale_codec::Decode as _; - let state_version = >::runtime_version().state_version(); - let relay_parent_number = >::block_number(); + let state_version = frame_system::Pallet::::runtime_version().state_version(); + let relay_parent_number = frame_system::Pallet::::block_number(); let relay_parent_storage_root = T::Hash::decode(&mut &sp_io::storage::root(state_version)[..]) .expect("storage root must decode to the Hash type; qed"); (relay_parent_number, relay_parent_storage_root) @@ -200,15 +227,15 @@ pub fn assumed_validation_data( }; let persisted_validation_data = make_validation_data().or_else(|| { - // Try again with force enacting the core. This check only makes sense if - // the core is occupied. - >::pending_availability(para_id).and_then(|_| { - >::force_enact(para_id); + // Try again with force enacting the pending candidates. This check only makes sense if + // there are any pending candidates. + inclusion::Pallet::::pending_availability(para_id).and_then(|_| { + inclusion::Pallet::::force_enact(para_id); make_validation_data() }) }); // If we were successful, also query current validation code hash. - persisted_validation_data.zip(>::current_code_hash(¶_id)) + persisted_validation_data.zip(paras::CurrentCodeHash::::get(¶_id)) } /// Implementation for the `check_validation_outputs` function of the runtime API. @@ -216,8 +243,8 @@ pub fn check_validation_outputs( para_id: ParaId, outputs: primitives::CandidateCommitments, ) -> bool { - let relay_parent_number = >::block_number(); - >::check_validation_outputs_for_runtime_api( + let relay_parent_number = frame_system::Pallet::::block_number(); + inclusion::Pallet::::check_validation_outputs_for_runtime_api( para_id, relay_parent_number, outputs, @@ -233,7 +260,7 @@ pub fn session_index_for_child() -> SessionIndex { // // Incidentally, this is also the rationale for why it is OK to query validators or // occupied cores or etc. and expect the correct response "for child". - >::session_index() + shared::CurrentSessionIndex::::get() } /// Implementation for the `AuthorityDiscoveryApi::authorities()` function of the runtime API. @@ -242,18 +269,18 @@ pub fn session_index_for_child() -> SessionIndex { pub fn relevant_authority_ids( ) -> Vec { let current_session_index = session_index_for_child::(); - let earliest_stored_session = >::earliest_stored_session(); + let earliest_stored_session = session_info::EarliestStoredSession::::get(); // Due to `max_validators`, the `SessionInfo` stores only the validators who are actively // selected to participate in parachain consensus. We'd like all authorities for the current // and next sessions to be used in authority-discovery. The two sets likely have large overlap. - let mut authority_ids = >::current_authorities().to_vec(); - authority_ids.extend(>::next_authorities().to_vec()); + let mut authority_ids = pallet_authority_discovery::Pallet::::current_authorities().to_vec(); + authority_ids.extend(pallet_authority_discovery::Pallet::::next_authorities().to_vec()); // Due to disputes, we'd like to remain connected to authorities of the previous few sessions. // For this, we don't need anyone other than the validators actively participating in consensus. for session_index in earliest_stored_session..current_session_index { - let info = >::session_info(session_index); + let info = session_info::Sessions::::get(session_index); if let Some(mut info) = info { authority_ids.append(&mut info.discovery_keys); } @@ -270,14 +297,14 @@ pub fn validation_code( para_id: ParaId, assumption: OccupiedCoreAssumption, ) -> Option { - with_assumption::(para_id, assumption, || >::current_code(¶_id)) + with_assumption::(para_id, assumption, || paras::Pallet::::current_code(¶_id)) } /// Implementation for the `candidate_pending_availability` function of the runtime API. pub fn candidate_pending_availability( para_id: ParaId, ) -> Option> { - >::candidate_pending_availability(para_id) + inclusion::Pallet::::candidate_pending_availability(para_id) } /// Implementation for the `candidate_events` function of the runtime API. @@ -290,7 +317,7 @@ where { use inclusion::Event as RawEvent; - >::read_events_no_consensus() + frame_system::Pallet::::read_events_no_consensus() .into_iter() .filter_map(|record| extract_event(record.event)) .filter_map(|event| { @@ -311,33 +338,33 @@ where /// Get the session info for the given session, if stored. pub fn session_info(index: SessionIndex) -> Option { - >::session_info(index) + session_info::Sessions::::get(index) } /// Implementation for the `dmq_contents` function of the runtime API. pub fn dmq_contents( recipient: ParaId, ) -> Vec>> { - >::dmq_contents(recipient) + dmp::Pallet::::dmq_contents(recipient) } /// Implementation for the `inbound_hrmp_channels_contents` function of the runtime API. pub fn inbound_hrmp_channels_contents( recipient: ParaId, ) -> BTreeMap>>> { - >::inbound_hrmp_channels_contents(recipient) + hrmp::Pallet::::inbound_hrmp_channels_contents(recipient) } /// Implementation for the `validation_code_by_hash` function of the runtime API. pub fn validation_code_by_hash( hash: ValidationCodeHash, ) -> Option { - >::code_by_hash(hash) + paras::CodeByHash::::get(hash) } /// Disputes imported via means of on-chain imports. pub fn on_chain_votes() -> Option> { - >::on_chain_votes() + paras_inherent::OnChainVotes::::get() } /// Submits an PVF pre-checking vote. @@ -345,12 +372,12 @@ pub fn submit_pvf_check_statement( stmt: PvfCheckStatement, signature: ValidatorSignature, ) { - >::submit_pvf_check_statement(stmt, signature) + paras::Pallet::::submit_pvf_check_statement(stmt, signature) } /// Returns the list of all PVF code hashes that require pre-checking. pub fn pvfs_require_precheck() -> Vec { - >::pvfs_require_precheck() + paras::Pallet::::pvfs_require_precheck() } /// Returns the validation code hash for the given parachain making the given @@ -362,28 +389,26 @@ pub fn validation_code_hash( where T: inclusion::Config, { - with_assumption::(para_id, assumption, || { - >::current_code_hash(¶_id) - }) + with_assumption::(para_id, assumption, || paras::CurrentCodeHash::::get(¶_id)) } /// Implementation for `get_session_disputes` function from the runtime API pub fn get_session_disputes( ) -> Vec<(SessionIndex, CandidateHash, DisputeState>)> { - >::disputes() + disputes::Pallet::::disputes() } /// Get session executor parameter set pub fn session_executor_params( session_index: SessionIndex, ) -> Option { - >::session_executor_params(session_index) + session_info::SessionExecutorParams::::get(session_index) } /// Implementation of `unapplied_slashes` runtime API pub fn unapplied_slashes( ) -> Vec<(SessionIndex, CandidateHash, slashing::PendingSlashes)> { - >::unapplied_slashes() + disputes::slashing::Pallet::::unapplied_slashes() } /// Implementation of `submit_report_dispute_lost` runtime API @@ -393,7 +418,7 @@ pub fn submit_unsigned_slashing_report( ) -> Option<()> { let key_ownership_proof = key_ownership_proof.decode()?; - >::submit_unsigned_slashing_report( + disputes::slashing::Pallet::::submit_unsigned_slashing_report( dispute_proof, key_ownership_proof, ) @@ -401,46 +426,46 @@ pub fn submit_unsigned_slashing_report( /// Return the min backing votes threshold from the configuration. pub fn minimum_backing_votes() -> u32 { - >::config().minimum_backing_votes + configuration::ActiveConfig::::get().minimum_backing_votes } /// Implementation for `ParaBackingState` function from the runtime API pub fn backing_state( para_id: ParaId, ) -> Option>> { - let config = >::config(); + let config = configuration::ActiveConfig::::get(); // Async backing is only expected to be enabled with a tracker capacity of 1. // Subsequent configuration update gets applied on new session, which always // clears the buffer. // // Thus, minimum relay parent is ensured to have asynchronous backing enabled. - let now = >::block_number(); - let min_relay_parent_number = >::allowed_relay_parents() + let now = frame_system::Pallet::::block_number(); + let min_relay_parent_number = shared::AllowedRelayParents::::get() .hypothetical_earliest_block_number(now, config.async_backing_params.allowed_ancestry_len); - let required_parent = >::para_head(para_id)?; - let validation_code_hash = >::current_code_hash(para_id)?; + let required_parent = paras::Heads::::get(para_id)?; + let validation_code_hash = paras::CurrentCodeHash::::get(para_id)?; - let upgrade_restriction = >::upgrade_restriction_signal(para_id); + let upgrade_restriction = paras::UpgradeRestrictionSignal::::get(para_id); let future_validation_code = - >::future_code_upgrade_at(para_id).and_then(|block_num| { + paras::FutureCodeUpgrades::::get(para_id).and_then(|block_num| { // Only read the storage if there's a pending upgrade. - Some(block_num).zip(>::future_code_hash(para_id)) + Some(block_num).zip(paras::FutureCodeHash::::get(para_id)) }); let (ump_msg_count, ump_total_bytes) = - >::relay_dispatch_queue_size(para_id); + inclusion::Pallet::::relay_dispatch_queue_size(para_id); let ump_remaining = config.max_upward_queue_count - ump_msg_count; let ump_remaining_bytes = config.max_upward_queue_size - ump_total_bytes; - let dmp_remaining_messages = >::dmq_contents(para_id) + let dmp_remaining_messages = dmp::Pallet::::dmq_contents(para_id) .into_iter() .map(|msg| msg.sent_at) .collect(); - let valid_watermarks = >::valid_watermarks(para_id); + let valid_watermarks = hrmp::Pallet::::valid_watermarks(para_id); let hrmp_inbound = InboundHrmpLimitations { valid_watermarks }; - let hrmp_channels_out = >::outbound_remaining_capacity(para_id) + let hrmp_channels_out = hrmp::Pallet::::outbound_remaining_capacity(para_id) .into_iter() .map(|(para, (messages_remaining, bytes_remaining))| { (para, OutboundHrmpChannelLimitations { messages_remaining, bytes_remaining }) @@ -465,27 +490,23 @@ pub fn backing_state( }; let pending_availability = { - // Note: the API deals with a `Vec` as it is future-proof for cases - // where there may be multiple candidates pending availability at a time. - // But at the moment only one candidate can be pending availability per - // parachain. crate::inclusion::PendingAvailability::::get(¶_id) - .and_then(|pending| { - let commitments = - crate::inclusion::PendingAvailabilityCommitments::::get(¶_id); - commitments.map(move |c| (pending, c)) + .map(|pending_candidates| { + pending_candidates + .into_iter() + .map(|candidate| { + CandidatePendingAvailability { + candidate_hash: candidate.candidate_hash(), + descriptor: candidate.candidate_descriptor().clone(), + commitments: candidate.candidate_commitments().clone(), + relay_parent_number: candidate.relay_parent_number(), + max_pov_size: constraints.max_pov_size, /* assume always same in + * session. */ + } + }) + .collect() }) - .map(|(pending, commitments)| { - CandidatePendingAvailability { - candidate_hash: pending.candidate_hash(), - descriptor: pending.candidate_descriptor().clone(), - commitments, - relay_parent_number: pending.relay_parent_number(), - max_pov_size: constraints.max_pov_size, // assume always same in session. - } - }) - .into_iter() - .collect() + .unwrap_or_else(|| vec![]) }; Some(BackingState { constraints, pending_availability }) @@ -493,5 +514,25 @@ pub fn backing_state( /// Implementation for `AsyncBackingParams` function from the runtime API pub fn async_backing_params() -> AsyncBackingParams { - >::config().async_backing_params + configuration::ActiveConfig::::get().async_backing_params +} + +/// Implementation for `DisabledValidators` +// CAVEAT: this should only be called on the node side +// as it might produce incorrect results on session boundaries +pub fn disabled_validators() -> Vec +where + T: shared::Config, +{ + >::disabled_validators() +} + +/// Returns the current state of the node features. +pub fn node_features() -> NodeFeatures { + configuration::ActiveConfig::::get().node_features +} + +/// Approval voting subsystem configuration parameters +pub fn approval_voting_params() -> ApprovalVotingParams { + configuration::ActiveConfig::::get().approval_voting_params } diff --git a/polkadot/runtime/parachains/src/runtime_api_impl/vstaging.rs b/polkadot/runtime/parachains/src/runtime_api_impl/vstaging.rs index 1fee1a4097d8ee465317e32274dcc6f14075a6ee..9ea29a2d374007fa54337fcc8d0fd2f8092553be 100644 --- a/polkadot/runtime/parachains/src/runtime_api_impl/vstaging.rs +++ b/polkadot/runtime/parachains/src/runtime_api_impl/vstaging.rs @@ -16,30 +16,28 @@ //! Put implementations of functions from staging APIs here. -use crate::{configuration, initializer, shared}; -use primitives::{ - vstaging::{ApprovalVotingParams, NodeFeatures}, - ValidatorIndex, +use crate::scheduler; +use primitives::{CoreIndex, Id as ParaId}; +use sp_runtime::traits::One; +use sp_std::{ + collections::{btree_map::BTreeMap, vec_deque::VecDeque}, + vec::Vec, }; -use sp_std::prelude::Vec; - -/// Implementation for `DisabledValidators` -// CAVEAT: this should only be called on the node side -// as it might produce incorrect results on session boundaries -pub fn disabled_validators() -> Vec -where - T: shared::Config, -{ - >::disabled_validators() -} - -/// Returns the current state of the node features. -pub fn node_features() -> NodeFeatures { - >::config().node_features -} -/// Approval voting subsystem configuration parameteres -pub fn approval_voting_params() -> ApprovalVotingParams { - let config = >::config(); - config.approval_voting_params +/// Returns the claimqueue from the scheduler +pub fn claim_queue() -> BTreeMap> { + let now = >::block_number() + One::one(); + + // This explicit update is only strictly required for session boundaries: + // + // At the end of a session we clear the claim queues: Without this update call, nothing would be + // scheduled to the client. + >::free_cores_and_fill_claimqueue(Vec::new(), now); + + scheduler::ClaimQueue::::get() + .into_iter() + .map(|(core_index, entries)| { + (core_index, entries.into_iter().map(|e| e.para_id()).collect()) + }) + .collect() } diff --git a/polkadot/runtime/parachains/src/scheduler.rs b/polkadot/runtime/parachains/src/scheduler.rs index 3dbb050fb4e5e40dc6f7b512bf55c45368a3ac5d..baeec49839dfd03a9fb8fd71e7e88d2a3c79dc5c 100644 --- a/polkadot/runtime/parachains/src/scheduler.rs +++ b/polkadot/runtime/parachains/src/scheduler.rs @@ -37,7 +37,7 @@ //! availability cores over time. use crate::{configuration, initializer::SessionChangeNotification, paras}; -use frame_support::pallet_prelude::*; +use frame_support::{pallet_prelude::*, traits::Defensive}; use frame_system::pallet_prelude::BlockNumberFor; pub use polkadot_core_primitives::v2::BlockNumber; use primitives::{ @@ -51,7 +51,7 @@ use sp_std::{ pub mod common; -use common::{Assignment, AssignmentProvider, AssignmentProviderConfig}; +use common::{Assignment, AssignmentProvider}; pub use pallet::*; @@ -59,6 +59,7 @@ pub use pallet::*; mod tests; const LOG_TARGET: &str = "runtime::parachains::scheduler"; + pub mod migration; #[frame_support::pallet] @@ -85,21 +86,16 @@ pub mod pallet { /// multiplexers. Reasonably, 100-1000. The dominant factor is the number of validators: safe /// upper bound at 10k. #[pallet::storage] - #[pallet::getter(fn validator_groups)] - pub(crate) type ValidatorGroups = StorageValue<_, Vec>, ValueQuery>; + pub type ValidatorGroups = StorageValue<_, Vec>, ValueQuery>; - /// One entry for each availability core. Entries are `None` if the core is not currently - /// occupied. Can be temporarily `Some` if scheduled but not occupied. - /// The i'th parachain belongs to the i'th core, with the remaining cores all being - /// parathread-multiplexers. + /// One entry for each availability core. The i'th parachain belongs to the i'th core, with the + /// remaining cores all being on demand parachain multiplexers. /// /// Bounded by the maximum of either of these two values: /// * The number of parachains and parathread multiplexers /// * The number of validators divided by `configuration.max_validators_per_core`. #[pallet::storage] - #[pallet::getter(fn availability_cores)] - pub(crate) type AvailabilityCores = - StorageValue<_, Vec>, ValueQuery>; + pub type AvailabilityCores = StorageValue<_, Vec>, ValueQuery>; /// Representation of a core in `AvailabilityCores`. /// @@ -141,15 +137,13 @@ pub mod pallet { /// Thus for all intents and purposes the effect of the session change is observed at the /// block following the session change, block number of which we save in this storage value. #[pallet::storage] - #[pallet::getter(fn session_start_block)] - pub(crate) type SessionStartBlock = StorageValue<_, BlockNumberFor, ValueQuery>; + pub type SessionStartBlock = StorageValue<_, BlockNumberFor, ValueQuery>; /// One entry for each availability core. The `VecDeque` represents the assignments to be /// scheduled on that core. The value contained here will not be valid after the end of - /// a block. Runtime APIs should be used to determine scheduled cores/ for the upcoming block. + /// a block. Runtime APIs should be used to determine scheduled cores for the upcoming block. #[pallet::storage] - #[pallet::getter(fn claimqueue)] - pub(crate) type ClaimQueue = + pub type ClaimQueue = StorageValue<_, BTreeMap>>, ValueQuery>; /// Assignments as tracked in the claim queue. @@ -222,7 +216,7 @@ impl Pallet { let n_cores = core::cmp::max( T::AssignmentProvider::session_core_count(), - match config.max_validators_per_core { + match config.scheduler_params.max_validators_per_core { Some(x) if x != 0 => validators.len() as u32 / x, _ => 0, }, @@ -236,8 +230,16 @@ impl Pallet { if n_cores == 0 || validators.is_empty() { ValidatorGroups::::set(Vec::new()); } else { - let group_base_size = validators.len() / n_cores as usize; - let n_larger_groups = validators.len() % n_cores as usize; + let group_base_size = validators + .len() + .checked_div(n_cores as usize) + .defensive_proof("n_cores should not be 0") + .unwrap_or(0); + let n_larger_groups = validators + .len() + .checked_rem(n_cores as usize) + .defensive_proof("n_cores should not be 0") + .unwrap_or(0); // Groups contain indices into the validators from the session change notification, // which are already shuffled. @@ -266,8 +268,8 @@ impl Pallet { ValidatorGroups::::set(groups); } - let now = >::block_number() + One::one(); - >::set(now); + let now = frame_system::Pallet::::block_number() + One::one(); + SessionStartBlock::::set(now); } /// Free unassigned cores. Provide a list of cores that should be considered newly-freed along @@ -348,8 +350,9 @@ impl Pallet { /// `AssignmentProvider`. A claim is considered expired if it's `ttl` field is lower than the /// current block height. fn drop_expired_claims_from_claimqueue() { - let now = >::block_number(); + let now = frame_system::Pallet::::block_number(); let availability_cores = AvailabilityCores::::get(); + let ttl = configuration::ActiveConfig::::get().scheduler_params.ttl; ClaimQueue::::mutate(|cq| { for (idx, _) in (0u32..).zip(availability_cores) { @@ -382,8 +385,6 @@ impl Pallet { if let Some(assignment) = T::AssignmentProvider::pop_assignment_for_core(core_idx) { - let AssignmentProviderConfig { ttl, .. } = - T::AssignmentProvider::get_provider_config(core_idx); core_claimqueue.push_back(ParasEntry::new(assignment, now + ttl)); } } @@ -392,16 +393,6 @@ impl Pallet { }); } - /// Get the para (chain or thread) ID assigned to a particular core or index, if any. Core - /// indices out of bounds will return `None`, as will indices of unassigned cores. - pub(crate) fn core_para(core_index: CoreIndex) -> Option { - let cores = AvailabilityCores::::get(); - match cores.get(core_index.0 as usize) { - None | Some(CoreOccupied::Free) => None, - Some(CoreOccupied::Paras(entry)) => Some(entry.para_id()), - } - } - /// Get the validators in the given group, if the group index is valid for this session. pub(crate) fn group_validators(group_index: GroupIndex) -> Option> { ValidatorGroups::::get().get(group_index.0 as usize).map(|g| g.clone()) @@ -414,8 +405,8 @@ impl Pallet { core: CoreIndex, at: BlockNumberFor, ) -> Option { - let config = >::config(); - let session_start_block = >::get(); + let config = configuration::ActiveConfig::::get(); + let session_start_block = SessionStartBlock::::get(); if at < session_start_block { return None @@ -428,7 +419,7 @@ impl Pallet { } let rotations_since_session_start: BlockNumberFor = - (at - session_start_block) / config.group_rotation_frequency; + (at - session_start_block) / config.scheduler_params.group_rotation_frequency; let rotations_since_session_start = as TryInto>::try_into(rotations_since_session_start) @@ -446,8 +437,8 @@ impl Pallet { /// This only ever times out cores that have been occupied across a group rotation boundary. pub(crate) fn availability_timeout_predicate( ) -> impl Fn(BlockNumberFor) -> AvailabilityTimeoutStatus> { - let config = >::config(); - let now = >::block_number(); + let config = configuration::ActiveConfig::::get(); + let now = frame_system::Pallet::::block_number(); let rotation_info = Self::group_rotation_info(now); let next_rotation = rotation_info.next_rotation_at(); @@ -460,9 +451,9 @@ impl Pallet { // Note: blocks backed in this rotation will never time out here as backed_in + // config.paras_availability_period will always be > now for these blocks, as // otherwise above condition would not be true. - pending_since + config.paras_availability_period + pending_since + config.scheduler_params.paras_availability_period } else { - next_rotation + config.paras_availability_period + next_rotation + config.scheduler_params.paras_availability_period }; AvailabilityTimeoutStatus { timed_out: time_out_at <= now, live_until: time_out_at } @@ -474,11 +465,12 @@ impl Pallet { /// This can be used to avoid calling `availability_timeout_predicate` for each core in case /// this function returns false. pub(crate) fn availability_timeout_check_required() -> bool { - let config = >::config(); - let now = >::block_number() + One::one(); + let config = configuration::ActiveConfig::::get(); + let now = frame_system::Pallet::::block_number() + One::one(); let rotation_info = Self::group_rotation_info(now); - let current_window = rotation_info.last_rotation_at() + config.paras_availability_period; + let current_window = + rotation_info.last_rotation_at() + config.scheduler_params.paras_availability_period; now < current_window } @@ -486,9 +478,10 @@ impl Pallet { pub(crate) fn group_rotation_info( now: BlockNumberFor, ) -> GroupRotationInfo> { - let session_start_block = Self::session_start_block(); - let group_rotation_frequency = - >::config().group_rotation_frequency; + let session_start_block = SessionStartBlock::::get(); + let group_rotation_frequency = configuration::ActiveConfig::::get() + .scheduler_params + .group_rotation_frequency; GroupRotationInfo { session_start_block, now, group_rotation_frequency } } @@ -508,6 +501,9 @@ impl Pallet { /// Return the next thing that will be scheduled on this core assuming it is currently /// occupied and the candidate occupying it times out. pub(crate) fn next_up_on_time_out(core: CoreIndex) -> Option { + let max_availability_timeouts = configuration::ActiveConfig::::get() + .scheduler_params + .max_availability_timeouts; Self::next_up_on_available(core).or_else(|| { // Or, if none, the claim currently occupying the core, // as it would be put back on the queue after timing out if number of retries is not at @@ -515,16 +511,12 @@ impl Pallet { let cores = AvailabilityCores::::get(); cores.get(core.0 as usize).and_then(|c| match c { CoreOccupied::Free => None, - CoreOccupied::Paras(pe) => { - let AssignmentProviderConfig { max_availability_timeouts, .. } = - T::AssignmentProvider::get_provider_config(core); - + CoreOccupied::Paras(pe) => if pe.availability_timeouts < max_availability_timeouts { Some(Self::paras_entry_to_scheduled_core(pe)) } else { None - } - }, + }, }) }) } @@ -566,7 +558,7 @@ impl Pallet { // ClaimQueue related functions // fn claimqueue_lookahead() -> u32 { - >::config().scheduling_lookahead + configuration::ActiveConfig::::get().scheduler_params.lookahead } /// Frees cores and fills the free claimqueue spots by popping from the `AssignmentProvider`. @@ -585,15 +577,15 @@ impl Pallet { let n_lookahead = Self::claimqueue_lookahead().max(1); let n_session_cores = T::AssignmentProvider::session_core_count(); let cq = ClaimQueue::::get(); - let ttl = >::config().on_demand_ttl; + let config = configuration::ActiveConfig::::get(); + let max_availability_timeouts = config.scheduler_params.max_availability_timeouts; + let ttl = config.scheduler_params.ttl; for core_idx in 0..n_session_cores { let core_idx = CoreIndex::from(core_idx); // add previously timedout paras back into the queue if let Some(mut entry) = timedout_paras.remove(&core_idx) { - let AssignmentProviderConfig { max_availability_timeouts, .. } = - T::AssignmentProvider::get_provider_config(core_idx); if entry.availability_timeouts < max_availability_timeouts { // Increment the timeout counter. entry.availability_timeouts += 1; @@ -668,13 +660,6 @@ impl Pallet { .filter_map(|(core_idx, v)| v.front().map(|e| (core_idx, e.assignment.para_id()))) } - #[cfg(any(feature = "runtime-benchmarks", test))] - pub(crate) fn assignment_provider_config( - core_idx: CoreIndex, - ) -> AssignmentProviderConfig> { - T::AssignmentProvider::get_provider_config(core_idx) - } - #[cfg(any(feature = "try-runtime", test))] fn claimqueue_len() -> usize { ClaimQueue::::get().iter().map(|la_vec| la_vec.1.len()).sum() diff --git a/polkadot/runtime/parachains/src/scheduler/common.rs b/polkadot/runtime/parachains/src/scheduler/common.rs index 2eb73385803c6e62a88fc55526e3ba18218cf06d..66a4e6d30be0830650295d5311b7d7e1fc3b1d20 100644 --- a/polkadot/runtime/parachains/src/scheduler/common.rs +++ b/polkadot/runtime/parachains/src/scheduler/common.rs @@ -48,22 +48,10 @@ impl Assignment { } } -#[derive(Encode, Decode, TypeInfo)] -/// A set of variables required by the scheduler in order to operate. -pub struct AssignmentProviderConfig { - /// How many times a collation can time out on availability. - /// Zero timeouts still means that a collation can be provided as per the slot auction - /// assignment provider. - pub max_availability_timeouts: u32, - - /// How long the collator has to provide a collation to the backing group before being dropped. - pub ttl: BlockNumber, -} - pub trait AssignmentProvider { /// Pops an [`Assignment`] from the provider for a specified [`CoreIndex`]. /// - /// This is where assignments come into existance. + /// This is where assignments come into existence. fn pop_assignment_for_core(core_idx: CoreIndex) -> Option; /// A previously popped `Assignment` has been fully processed. @@ -77,14 +65,11 @@ pub trait AssignmentProvider { /// Push back a previously popped assignment. /// /// If the assignment could not be processed within the current session, it can be pushed back - /// to the assignment provider in order to be poppped again later. + /// to the assignment provider in order to be popped again later. /// /// This is the second way the life of an assignment can come to an end. fn push_back_assignment(assignment: Assignment); - /// Returns a set of variables needed by the scheduler - fn get_provider_config(core_idx: CoreIndex) -> AssignmentProviderConfig; - /// Push some assignment for mocking/benchmarks purposes. /// /// Useful for benchmarks and testing. The returned assignment is "valid" and can if need be diff --git a/polkadot/runtime/parachains/src/scheduler/migration.rs b/polkadot/runtime/parachains/src/scheduler/migration.rs index 4c0a07d73674205dbc4fc80090f1331a8858633e..5482c8821e58c7bdf8fd29b4607837355640a1f3 100644 --- a/polkadot/runtime/parachains/src/scheduler/migration.rs +++ b/polkadot/runtime/parachains/src/scheduler/migration.rs @@ -19,12 +19,12 @@ use super::*; use frame_support::{ migrations::VersionedMigration, pallet_prelude::ValueQuery, storage_alias, - traits::OnRuntimeUpgrade, weights::Weight, + traits::UncheckedOnRuntimeUpgrade, weights::Weight, }; /// Old/legacy assignment representation (v0). /// -/// `Assignment` used to be a concrete type with the same layout V0Assignment, idential on all +/// `Assignment` used to be a concrete type with the same layout V0Assignment, identical on all /// assignment providers. This can be removed once storage has been migrated. #[derive(Encode, Decode, RuntimeDebug, TypeInfo, PartialEq, Clone)] struct V0Assignment { @@ -105,7 +105,8 @@ mod v0 { // - Assignments only consist of `ParaId`, `Assignment` is a concrete type (Same as V0Assignment). mod v1 { use frame_support::{ - pallet_prelude::ValueQuery, storage_alias, traits::OnRuntimeUpgrade, weights::Weight, + pallet_prelude::ValueQuery, storage_alias, traits::UncheckedOnRuntimeUpgrade, + weights::Weight, }; use frame_system::pallet_prelude::BlockNumberFor; @@ -164,14 +165,14 @@ mod v1 { /// Migration to V1 pub struct UncheckedMigrateToV1(sp_std::marker::PhantomData); - impl OnRuntimeUpgrade for UncheckedMigrateToV1 { + impl UncheckedOnRuntimeUpgrade for UncheckedMigrateToV1 { fn on_runtime_upgrade() -> Weight { let mut weight: Weight = Weight::zero(); v0::ParathreadQueue::::kill(); v0::ParathreadClaimIndex::::kill(); - let now = >::block_number(); + let now = frame_system::Pallet::::block_number(); let scheduled = v0::Scheduled::::take(); let sched_len = scheduled.len() as u64; for core_assignment in scheduled { @@ -181,7 +182,7 @@ mod v1 { v1::add_to_claimqueue::(core_idx, pe); } - let parachains = paras::Pallet::::parachains(); + let parachains = paras::Parachains::::get(); let availability_cores = v0::AvailabilityCores::::take(); let mut new_availability_cores = Vec::new(); @@ -302,7 +303,7 @@ mod v2 { /// Migration to V2 pub struct UncheckedMigrateToV2(sp_std::marker::PhantomData); - impl OnRuntimeUpgrade for UncheckedMigrateToV2 { + impl UncheckedOnRuntimeUpgrade for UncheckedMigrateToV2 { fn on_runtime_upgrade() -> Weight { let mut weight: Weight = Weight::zero(); diff --git a/polkadot/runtime/parachains/src/scheduler/tests.rs b/polkadot/runtime/parachains/src/scheduler/tests.rs index 9af23ce64bd67ab0901dd1a03e849d51cfffe342..200f49ff2e820cd2716f25693628173c56b0f4aa 100644 --- a/polkadot/runtime/parachains/src/scheduler/tests.rs +++ b/polkadot/runtime/parachains/src/scheduler/tests.rs @@ -18,7 +18,9 @@ use super::*; use frame_support::assert_ok; use keyring::Sr25519Keyring; -use primitives::{BlockNumber, SessionIndex, ValidationCode, ValidatorId}; +use primitives::{ + vstaging::SchedulerParams, BlockNumber, SessionIndex, ValidationCode, ValidatorId, +}; use sp_std::collections::{btree_map::BTreeMap, btree_set::BTreeSet}; use crate::{ @@ -29,7 +31,7 @@ use crate::{ Scheduler, System, Test, }, paras::{ParaGenesisArgs, ParaKind}, - scheduler::{common::Assignment, ClaimQueue}, + scheduler::{self, common::Assignment, ClaimQueue}, }; fn schedule_blank_para(id: ParaId) { @@ -103,15 +105,19 @@ fn run_to_end_of_block( fn default_config() -> HostConfiguration { HostConfiguration { - coretime_cores: 3, - group_rotation_frequency: 10, - paras_availability_period: 3, - scheduling_lookahead: 2, // This field does not affect anything that scheduler does. However, `HostConfiguration` // is still a subject to consistency test. It requires that // `minimum_validation_upgrade_delay` is greater than `chain_availability_period` and // `thread_availability_period`. minimum_validation_upgrade_delay: 6, + scheduler_params: SchedulerParams { + group_rotation_frequency: 10, + paras_availability_period: 3, + lookahead: 2, + num_cores: 3, + max_availability_timeouts: 1, + ..Default::default() + }, ..Default::default() } } @@ -155,7 +161,7 @@ fn scheduled_entries() -> impl Iterator(vec![para_id])); // Add a claim on core 0 with a ttl == now (17) let paras_entry_non_expired = ParasEntry::new(Assignment::Bulk(para_id), now); @@ -216,8 +222,8 @@ fn claimqueue_ttl_drop_fn_works() { Scheduler::add_to_claimqueue(core_idx, paras_entry_non_expired.clone()); Scheduler::add_to_claimqueue(core_idx, paras_entry_expired.clone()); Scheduler::add_to_claimqueue(core_idx, paras_entry_non_expired.clone()); - let cq = Scheduler::claimqueue(); - assert!(cq.get(&core_idx).unwrap().len() == 3); + let cq = scheduler::ClaimQueue::::get(); + assert_eq!(cq.get(&core_idx).unwrap().len(), 3); // Add a claim to the test assignment provider. let assignment = Assignment::Bulk(para_id); @@ -227,10 +233,11 @@ fn claimqueue_ttl_drop_fn_works() { // Drop expired claim. Scheduler::drop_expired_claims_from_claimqueue(); - let cq = Scheduler::claimqueue(); + let cq = scheduler::ClaimQueue::::get(); let cqc = cq.get(&core_idx).unwrap(); - // Same number of claims - assert!(cqc.len() == 3); + // Same number of claims, because a new claim is popped from `MockAssigner` instead of the + // expired one + assert_eq!(cqc.len(), 3); // The first 2 claims in the queue should have a ttl of 17, // being the ones set up prior in this test as claims 1 and 3. @@ -290,7 +297,7 @@ fn session_change_shuffles_validators() { fn session_change_takes_only_max_per_core() { let config = { let mut config = default_config(); - config.max_validators_per_core = Some(1); + config.scheduler_params.max_validators_per_core = Some(1); config }; @@ -330,7 +337,8 @@ fn session_change_takes_only_max_per_core() { #[test] fn fill_claimqueue_fills() { - let genesis_config = genesis_config(&default_config()); + let config = default_config(); + let genesis_config = genesis_config(&config); let para_a = ParaId::from(3_u32); let para_b = ParaId::from(4_u32); @@ -342,22 +350,20 @@ fn fill_claimqueue_fills() { new_test_ext(genesis_config).execute_with(|| { MockAssigner::set_core_count(2); - let AssignmentProviderConfig { ttl: config_ttl, .. } = - MockAssigner::get_provider_config(CoreIndex(0)); + let coretime_ttl = config.scheduler_params.ttl; // Add 3 paras schedule_blank_para(para_a); schedule_blank_para(para_b); schedule_blank_para(para_c); - // start a new session to activate, 3 validators for 3 cores. + // start a new session to activate, 2 validators for 2 cores. run_to_block(1, |number| match number { 1 => Some(SessionChangeNotification { new_config: default_config(), validators: vec![ ValidatorId::from(Sr25519Keyring::Alice.public()), ValidatorId::from(Sr25519Keyring::Bob.public()), - ValidatorId::from(Sr25519Keyring::Charlie.public()), ], ..Default::default() }), @@ -381,16 +387,16 @@ fn fill_claimqueue_fills() { &ParasEntry { assignment: assignment_a.clone(), availability_timeouts: 0, - ttl: 2 + config_ttl + ttl: 2 + coretime_ttl }, ); // Sits on the same core as `para_a` assert_eq!( - Scheduler::claimqueue().get(&CoreIndex(0)).unwrap()[1], + scheduler::ClaimQueue::::get().get(&CoreIndex(0)).unwrap()[1], ParasEntry { assignment: assignment_b.clone(), availability_timeouts: 0, - ttl: 2 + config_ttl + ttl: 2 + coretime_ttl } ); assert_eq!( @@ -398,7 +404,7 @@ fn fill_claimqueue_fills() { &ParasEntry { assignment: assignment_c.clone(), availability_timeouts: 0, - ttl: 2 + config_ttl + ttl: 2 + coretime_ttl }, ); } @@ -410,7 +416,7 @@ fn schedule_schedules_including_just_freed() { let mut config = default_config(); // NOTE: This test expects on demand cores to each get slotted on to a different core // and not fill up the claimqueue of each core first. - config.scheduling_lookahead = 1; + config.scheduler_params.lookahead = 1; let genesis_config = genesis_config(&config); let para_a = ParaId::from(3_u32); @@ -477,9 +483,9 @@ fn schedule_schedules_including_just_freed() { assert!(Scheduler::scheduled_paras().collect::>().is_empty()); // All `core_queue`s should be empty - Scheduler::claimqueue() + scheduler::ClaimQueue::::get() .iter() - .for_each(|(_core_idx, core_queue)| assert!(core_queue.len() == 0)) + .for_each(|(_core_idx, core_queue)| assert_eq!(core_queue.len(), 0)) } // add a couple more para claims - the claim on `b` will go to the 3rd core @@ -557,7 +563,7 @@ fn schedule_schedules_including_just_freed() { #[test] fn schedule_clears_availability_cores() { let mut config = default_config(); - config.scheduling_lookahead = 1; + config.scheduler_params.lookahead = 1; let genesis_config = genesis_config(&config); let para_a = ParaId::from(1_u32); @@ -597,7 +603,7 @@ fn schedule_clears_availability_cores() { run_to_block(2, |_| None); - assert_eq!(Scheduler::claimqueue().len(), 3); + assert_eq!(scheduler::ClaimQueue::::get().len(), 3); // cores 0, 1, and 2 should be occupied. mark them as such. Scheduler::occupied( @@ -614,7 +620,7 @@ fn schedule_clears_availability_cores() { assert_eq!(cores[2].is_free(), false); // All `core_queue`s should be empty - Scheduler::claimqueue() + scheduler::ClaimQueue::::get() .iter() .for_each(|(_core_idx, core_queue)| assert!(core_queue.len() == 0)) } @@ -659,11 +665,11 @@ fn schedule_clears_availability_cores() { fn schedule_rotates_groups() { let config = { let mut config = default_config(); - config.scheduling_lookahead = 1; + config.scheduler_params.lookahead = 1; config }; - let rotation_frequency = config.group_rotation_frequency; + let rotation_frequency = config.scheduler_params.group_rotation_frequency; let on_demand_cores = 2; let genesis_config = genesis_config(&config); @@ -693,7 +699,7 @@ fn schedule_rotates_groups() { _ => None, }); - let session_start_block = Scheduler::session_start_block(); + let session_start_block = scheduler::SessionStartBlock::::get(); assert_eq!(session_start_block, 1); MockAssigner::add_test_assignment(assignment_a.clone()); @@ -742,9 +748,12 @@ fn schedule_rotates_groups() { #[test] fn on_demand_claims_are_pruned_after_timing_out() { - let max_retries = 20; + let max_timeouts = 20; let mut config = default_config(); - config.scheduling_lookahead = 1; + config.scheduler_params.lookahead = 1; + // Need more timeouts for this test + config.scheduler_params.max_availability_timeouts = max_timeouts; + config.scheduler_params.ttl = BlockNumber::from(5u32); let genesis_config = genesis_config(&config); let para_a = ParaId::from(1_u32); @@ -753,11 +762,6 @@ fn on_demand_claims_are_pruned_after_timing_out() { new_test_ext(genesis_config).execute_with(|| { MockAssigner::set_core_count(2); - // Need more timeouts for this test - MockAssigner::set_assignment_provider_config(AssignmentProviderConfig { - max_availability_timeouts: max_retries, - ttl: BlockNumber::from(5u32), - }); schedule_blank_para(para_a); // #1 @@ -779,7 +783,7 @@ fn on_demand_claims_are_pruned_after_timing_out() { // #2 now += 1; run_to_block(now, |_| None); - assert_eq!(Scheduler::claimqueue().len(), 1); + assert_eq!(scheduler::ClaimQueue::::get().len(), 1); // ParaId a is in the claimqueue. assert!(claimqueue_contains_para_ids::(vec![para_a])); @@ -794,7 +798,7 @@ fn on_demand_claims_are_pruned_after_timing_out() { // Run to block #n over the max_retries value. // In this case, both validator groups with time out on availability and // the assignment will be dropped. - for n in now..=(now + max_retries + 1) { + for n in now..=(now + max_timeouts + 1) { // #n run_to_block(n, |_| None); // Time out on core 0. @@ -806,7 +810,7 @@ fn on_demand_claims_are_pruned_after_timing_out() { Scheduler::free_cores_and_fill_claimqueue(just_updated, now); // ParaId a exists in the claim queue until max_retries is reached. - if n < max_retries + now { + if n < max_timeouts + now { assert!(claimqueue_contains_para_ids::(vec![para_a])); } else { assert!(!claimqueue_contains_para_ids::(vec![para_a])); @@ -822,7 +826,7 @@ fn on_demand_claims_are_pruned_after_timing_out() { assert!(!availability_cores_contains_para_ids::(vec![para_a])); // #25 - now += max_retries + 2; + now += max_timeouts + 2; // Add assignment back to the mix. MockAssigner::add_test_assignment(assignment_a.clone()); @@ -832,8 +836,8 @@ fn on_demand_claims_are_pruned_after_timing_out() { // #26 now += 1; - // Run to block #n but this time have group 1 conclude the availabilty. - for n in now..=(now + max_retries + 1) { + // Run to block #n but this time have group 1 conclude the availability. + for n in now..=(now + max_timeouts + 1) { // #n run_to_block(n, |_| None); // Time out core 0 if group 0 is assigned to it, if group 1 is assigned, conclude. @@ -874,10 +878,8 @@ fn on_demand_claims_are_pruned_after_timing_out() { fn availability_predicate_works() { let genesis_config = genesis_config(&default_config()); - let HostConfiguration { group_rotation_frequency, paras_availability_period, .. } = - default_config(); - - assert!(paras_availability_period < group_rotation_frequency); + let SchedulerParams { group_rotation_frequency, paras_availability_period, .. } = + default_config().scheduler_params; new_test_ext(genesis_config).execute_with(|| { run_to_block(1 + paras_availability_period, |_| None); @@ -947,13 +949,13 @@ fn next_up_on_available_uses_next_scheduled_or_none() { { assert_eq!(Scheduler::claimqueue_len(), 1); - assert_eq!(Scheduler::availability_cores().len(), 1); + assert_eq!(scheduler::AvailabilityCores::::get().len(), 1); let mut map = BTreeMap::new(); map.insert(CoreIndex(0), para_a); Scheduler::occupied(map); - let cores = Scheduler::availability_cores(); + let cores = scheduler::AvailabilityCores::::get(); match &cores[0] { CoreOccupied::Paras(entry) => assert_eq!(entry, &entry_a), _ => panic!("There should only be one test assigner core"), @@ -1004,14 +1006,14 @@ fn next_up_on_time_out_reuses_claim_if_nothing_queued() { run_to_block(2, |_| None); { - assert_eq!(Scheduler::claimqueue().len(), 1); - assert_eq!(Scheduler::availability_cores().len(), 1); + assert_eq!(scheduler::ClaimQueue::::get().len(), 1); + assert_eq!(scheduler::AvailabilityCores::::get().len(), 1); let mut map = BTreeMap::new(); map.insert(CoreIndex(0), para_a); Scheduler::occupied(map); - let cores = Scheduler::availability_cores(); + let cores = scheduler::AvailabilityCores::::get(); match cores.get(0).unwrap() { CoreOccupied::Paras(entry) => { assert_eq!(entry.assignment, assignment_a.clone()); @@ -1044,7 +1046,7 @@ fn next_up_on_time_out_reuses_claim_if_nothing_queued() { #[test] fn session_change_requires_reschedule_dropping_removed_paras() { let mut config = default_config(); - config.scheduling_lookahead = 1; + config.scheduler_params.lookahead = 1; let genesis_config = genesis_config(&config); let para_a = ParaId::from(1_u32); @@ -1056,7 +1058,7 @@ fn session_change_requires_reschedule_dropping_removed_paras() { new_test_ext(genesis_config).execute_with(|| { // Setting explicit core count MockAssigner::set_core_count(5); - let assignment_provider_ttl = MockAssigner::get_provider_config(CoreIndex::from(0)).ttl; + let coretime_ttl = configuration::ActiveConfig::::get().scheduler_params.ttl; schedule_blank_para(para_a); schedule_blank_para(para_b); @@ -1083,7 +1085,7 @@ fn session_change_requires_reschedule_dropping_removed_paras() { _ => None, }); - assert_eq!(Scheduler::claimqueue().len(), 2); + assert_eq!(scheduler::ClaimQueue::::get().len(), 2); let groups = ValidatorGroups::::get(); assert_eq!(groups.len(), 5); @@ -1114,13 +1116,13 @@ fn session_change_requires_reschedule_dropping_removed_paras() { Scheduler::free_cores_and_fill_claimqueue(BTreeMap::new(), 3); assert_eq!( - Scheduler::claimqueue(), + scheduler::ClaimQueue::::get(), vec![( CoreIndex(0), vec![ParasEntry::new( Assignment::Bulk(para_a), // At end of block 2 - assignment_provider_ttl + 2 + coretime_ttl + 2 )] .into_iter() .collect() @@ -1154,7 +1156,7 @@ fn session_change_requires_reschedule_dropping_removed_paras() { _ => None, }); - assert_eq!(Scheduler::claimqueue().len(), 2); + assert_eq!(scheduler::ClaimQueue::::get().len(), 2); let groups = ValidatorGroups::::get(); assert_eq!(groups.len(), 5); @@ -1162,14 +1164,14 @@ fn session_change_requires_reschedule_dropping_removed_paras() { Scheduler::free_cores_and_fill_claimqueue(BTreeMap::new(), 4); assert_eq!( - Scheduler::claimqueue(), + scheduler::ClaimQueue::::get(), vec![ ( CoreIndex(0), vec![ParasEntry::new( Assignment::Bulk(para_a), // At block 3 - assignment_provider_ttl + 3 + coretime_ttl + 3 )] .into_iter() .collect() @@ -1179,7 +1181,7 @@ fn session_change_requires_reschedule_dropping_removed_paras() { vec![ParasEntry::new( Assignment::Bulk(para_b), // At block 3 - assignment_provider_ttl + 3 + coretime_ttl + 3 )] .into_iter() .collect() diff --git a/polkadot/runtime/parachains/src/session_info.rs b/polkadot/runtime/parachains/src/session_info.rs index 9e1b3d05842fd7b35f87de5c297958f5f3f36bf3..2f7f1ead76ade121d5ed06182cb7f69bf2ba71c4 100644 --- a/polkadot/runtime/parachains/src/session_info.rs +++ b/polkadot/runtime/parachains/src/session_info.rs @@ -86,28 +86,23 @@ pub mod pallet { /// The earliest session for which previous session info is stored. #[pallet::storage] - #[pallet::getter(fn earliest_stored_session)] - pub(crate) type EarliestStoredSession = StorageValue<_, SessionIndex, ValueQuery>; + pub type EarliestStoredSession = StorageValue<_, SessionIndex, ValueQuery>; /// Session information in a rolling window. /// Should have an entry in range `EarliestStoredSession..=CurrentSessionIndex`. /// Does not have any entries before the session index in the first session change notification. #[pallet::storage] - #[pallet::getter(fn session_info)] - pub(crate) type Sessions = StorageMap<_, Identity, SessionIndex, SessionInfo>; + pub type Sessions = StorageMap<_, Identity, SessionIndex, SessionInfo>; /// The validator account keys of the validators actively participating in parachain consensus. // We do not store this in `SessionInfo` to avoid leaking the `AccountId` type to the client, // which would complicate the migration process if we are to change it in the future. #[pallet::storage] - #[pallet::getter(fn account_keys)] - pub(crate) type AccountKeys = - StorageMap<_, Identity, SessionIndex, Vec>>; + pub type AccountKeys = StorageMap<_, Identity, SessionIndex, Vec>>; /// Executor parameter set for a given session index #[pallet::storage] - #[pallet::getter(fn session_executor_params)] - pub(crate) type SessionExecutorParams = + pub type SessionExecutorParams = StorageMap<_, Identity, SessionIndex, ExecutorParams>; } @@ -120,7 +115,7 @@ pub trait AuthorityDiscoveryConfig { impl AuthorityDiscoveryConfig for T { fn authorities() -> Vec { - >::current_authorities().to_vec() + pallet_authority_discovery::Pallet::::current_authorities().to_vec() } } @@ -129,17 +124,17 @@ impl Pallet { pub(crate) fn initializer_on_new_session( notification: &crate::initializer::SessionChangeNotification>, ) { - let config = >::config(); + let config = configuration::ActiveConfig::::get(); let dispute_period = config.dispute_period; let validators = notification.validators.clone().into(); let discovery_keys = ::authorities(); let assignment_keys = AssignmentKeysUnsafe::::get(); - let active_set = >::active_validator_indices(); + let active_set = shared::ActiveValidatorIndices::::get(); - let validator_groups = >::validator_groups().into(); - let n_cores = >::availability_cores().len() as u32; + let validator_groups = scheduler::ValidatorGroups::::get().into(); + let n_cores = scheduler::AvailabilityCores::::get().len() as u32; let zeroth_delay_tranche_width = config.zeroth_delay_tranche_width; let relay_vrf_modulo_samples = config.relay_vrf_modulo_samples; let n_delay_tranches = config.n_delay_tranches; @@ -158,7 +153,7 @@ impl Pallet { for idx in old_earliest_stored_session..new_earliest_stored_session { Sessions::::remove(&idx); // Idx will be missing for a few sessions after the runtime upgrade. - // But it shouldn'be be a problem. + // But it shouldn't be a problem. AccountKeys::::remove(&idx); SessionExecutorParams::::remove(&idx); } diff --git a/polkadot/runtime/parachains/src/session_info/migration.rs b/polkadot/runtime/parachains/src/session_info/migration.rs index 228c1e3bb2515b14f5fe59a89578b03be065955d..ea6f81834b5db6eb7336521d3d471a6c3df49985 100644 --- a/polkadot/runtime/parachains/src/session_info/migration.rs +++ b/polkadot/runtime/parachains/src/session_info/migration.rs @@ -18,5 +18,5 @@ use frame_support::traits::StorageVersion; -/// The current storage version. +/// The in-code storage version. pub const STORAGE_VERSION: StorageVersion = StorageVersion::new(1); diff --git a/polkadot/runtime/parachains/src/session_info/tests.rs b/polkadot/runtime/parachains/src/session_info/tests.rs index 92a50575deda8413abb18f892680d693c148d0cb..18b9d8f59010eb49a26768ad31a3c3296d65b41a 100644 --- a/polkadot/runtime/parachains/src/session_info/tests.rs +++ b/polkadot/runtime/parachains/src/session_info/tests.rs @@ -25,7 +25,7 @@ use crate::{ util::take_active_subset, }; use keyring::Sr25519Keyring; -use primitives::{BlockNumber, ValidatorId, ValidatorIndex}; +use primitives::{vstaging::SchedulerParams, BlockNumber, ValidatorId, ValidatorIndex}; fn run_to_block( to: BlockNumber, @@ -62,9 +62,9 @@ fn run_to_block( fn default_config() -> HostConfiguration { HostConfiguration { - coretime_cores: 1, dispute_period: 2, needed_approvals: 3, + scheduler_params: SchedulerParams { num_cores: 1, ..Default::default() }, ..Default::default() } } @@ -92,7 +92,7 @@ fn new_session_every_block(n: BlockNumber) -> Option::get(); assert_eq!(config.dispute_period, 2); // Move to session 10 @@ -109,11 +109,11 @@ fn session_pruning_is_based_on_dispute_period() { Configuration::set_dispute_period(RuntimeOrigin::root(), dispute_period).unwrap(); // Dispute period does not automatically change - let config = Configuration::config(); + let config = configuration::ActiveConfig::::get(); assert_eq!(config.dispute_period, 2); // Two sessions later it will though run_to_block(120, session_changes); - let config = Configuration::config(); + let config = configuration::ActiveConfig::::get(); assert_eq!(config.dispute_period, 5); run_to_block(200, session_changes); @@ -128,7 +128,7 @@ fn session_pruning_is_based_on_dispute_period() { // Two sessions later it kicks in run_to_block(220, session_changes); - let config = Configuration::config(); + let config = configuration::ActiveConfig::::get(); assert_eq!(config.dispute_period, 16); // Earliest session stays the same assert_eq!(EarliestStoredSession::::get(), 21 - dispute_period); @@ -183,7 +183,7 @@ fn session_info_active_subsets() { new_test_ext(genesis_config()).execute_with(|| { ParasShared::set_active_validators_with_indices(active_set.clone(), validators.clone()); - assert_eq!(ParasShared::active_validator_indices(), active_set); + assert_eq!(shared::ActiveValidatorIndices::::get(), active_set); AssignmentKeysUnsafe::::set(unscrambled_assignment.clone()); crate::mock::set_discovery_authorities(unscrambled_discovery.clone()); diff --git a/polkadot/runtime/parachains/src/shared.rs b/polkadot/runtime/parachains/src/shared.rs index bdaffcd505f8e3bfc0c62d1e5f5def4fb3617abc..319b22515889568b7e29f84a4710f0ff5e10d8d0 100644 --- a/polkadot/runtime/parachains/src/shared.rs +++ b/polkadot/runtime/parachains/src/shared.rs @@ -138,25 +138,20 @@ pub mod pallet { /// The current session index. #[pallet::storage] - #[pallet::getter(fn session_index)] - pub(super) type CurrentSessionIndex = StorageValue<_, SessionIndex, ValueQuery>; + pub type CurrentSessionIndex = StorageValue<_, SessionIndex, ValueQuery>; /// All the validators actively participating in parachain consensus. /// Indices are into the broader validator set. #[pallet::storage] - #[pallet::getter(fn active_validator_indices)] - pub(super) type ActiveValidatorIndices = - StorageValue<_, Vec, ValueQuery>; + pub type ActiveValidatorIndices = StorageValue<_, Vec, ValueQuery>; /// The parachain attestation keys of the validators actively participating in parachain /// consensus. This should be the same length as `ActiveValidatorIndices`. #[pallet::storage] - #[pallet::getter(fn active_validator_keys)] - pub(super) type ActiveValidatorKeys = StorageValue<_, Vec, ValueQuery>; + pub type ActiveValidatorKeys = StorageValue<_, Vec, ValueQuery>; /// All allowed relay-parents. #[pallet::storage] - #[pallet::getter(fn allowed_relay_parents)] pub(crate) type AllowedRelayParents = StorageValue<_, AllowedRelayParentsTracker>, ValueQuery>; @@ -218,13 +213,13 @@ impl Pallet { /// Return the session index that should be used for any future scheduled changes. pub fn scheduled_session() -> SessionIndex { - Self::session_index().saturating_add(SESSION_DELAY) + CurrentSessionIndex::::get().saturating_add(SESSION_DELAY) } /// Fetches disabled validators list from session pallet. /// CAVEAT: this might produce incorrect results on session boundaries pub fn disabled_validators() -> Vec { - let shuffled_indices = Pallet::::active_validator_indices(); + let shuffled_indices = ActiveValidatorIndices::::get(); // mapping from raw validator index to `ValidatorIndex` // this computation is the same within a session, but should be cheap let reverse_index = shuffled_indices diff --git a/polkadot/runtime/parachains/src/shared/tests.rs b/polkadot/runtime/parachains/src/shared/tests.rs index ae12b4b3fc16f0d2c60c787aab8d8ce360391a8f..4ae37463a6d9d010332de3346750dc7d57156861 100644 --- a/polkadot/runtime/parachains/src/shared/tests.rs +++ b/polkadot/runtime/parachains/src/shared/tests.rs @@ -17,7 +17,8 @@ use super::*; use crate::{ configuration::HostConfiguration, - mock::{new_test_ext, MockGenesisConfig, ParasShared}, + mock::{new_test_ext, MockGenesisConfig, ParasShared, Test}, + shared, }; use assert_matches::assert_matches; use keyring::Sr25519Keyring; @@ -120,10 +121,10 @@ fn sets_and_shuffles_validators() { ]) ); - assert_eq!(ParasShared::active_validator_keys(), validators); + assert_eq!(shared::ActiveValidatorKeys::::get(), validators); assert_eq!( - ParasShared::active_validator_indices(), + shared::ActiveValidatorIndices::::get(), vec![ ValidatorIndex(4), ValidatorIndex(1), @@ -155,10 +156,10 @@ fn sets_truncates_and_shuffles_validators() { assert_eq!(validators, validator_pubkeys(&[Sr25519Keyring::Ferdie, Sr25519Keyring::Bob,])); - assert_eq!(ParasShared::active_validator_keys(), validators); + assert_eq!(shared::ActiveValidatorKeys::::get(), validators); assert_eq!( - ParasShared::active_validator_indices(), + shared::ActiveValidatorIndices::::get(), vec![ValidatorIndex(4), ValidatorIndex(1),] ); }); diff --git a/polkadot/runtime/parachains/src/ump_tests.rs b/polkadot/runtime/parachains/src/ump_tests.rs index 2ed1d64336b31e42d1fd0363143a7d17a66c7b97..43829974b5693ea9f57494722cad54600b1beb7b 100644 --- a/polkadot/runtime/parachains/src/ump_tests.rs +++ b/polkadot/runtime/parachains/src/ump_tests.rs @@ -15,13 +15,14 @@ // along with Polkadot. If not, see . use crate::{ + configuration, inclusion::{ tests::run_to_block_default_notifications as run_to_block, AggregateMessageOrigin, AggregateMessageOrigin::Ump, UmpAcceptanceCheckErr, UmpQueueId, }, mock::{ - assert_last_event, assert_last_events, new_test_ext, Configuration, MessageQueue, - MessageQueueSize, MockGenesisConfig, ParaInclusion, Processed, System, Test, *, + assert_last_event, assert_last_events, new_test_ext, MessageQueue, MessageQueueSize, + MockGenesisConfig, ParaInclusion, Processed, System, Test, *, }, }; use frame_support::{ @@ -88,7 +89,7 @@ fn queue_upward_msg(para: ParaId, msg: UpwardMessage) { fn try_queue_upward_msg(para: ParaId, msg: UpwardMessage) -> Result<(), UmpAcceptanceCheckErr> { let msgs = vec![msg]; - ParaInclusion::check_upward_messages(&Configuration::config(), para, &msgs)?; + ParaInclusion::check_upward_messages(&configuration::ActiveConfig::::get(), para, &msgs)?; ParaInclusion::receive_upward_messages(para, msgs.as_slice()); Ok(()) } @@ -107,7 +108,12 @@ mod check_upward_messages { /// Check that these messages *could* be queued. fn check(para: ParaId, msgs: Vec, err: Option) { assert_eq!( - ParaInclusion::check_upward_messages(&Configuration::config(), para, &msgs[..]).err(), + ParaInclusion::check_upward_messages( + &configuration::ActiveConfig::::get(), + para, + &msgs[..] + ) + .err(), err ); } @@ -132,7 +138,8 @@ mod check_upward_messages { fn num_per_candidate_exceeded_error() { new_test_ext(GenesisConfigBuilder::default().build()).execute_with(|| { let _g = frame_support::StorageNoopGuard::default(); - let permitted = Configuration::config().max_upward_message_num_per_candidate; + let permitted = + configuration::ActiveConfig::::get().max_upward_message_num_per_candidate; for sent in 0..permitted + 1 { check(P_0, vec![msg(""); sent as usize], None); @@ -151,8 +158,9 @@ mod check_upward_messages { fn size_per_message_exceeded_error() { new_test_ext(GenesisConfigBuilder::default().build()).execute_with(|| { let _g = frame_support::StorageNoopGuard::default(); - let max_size = Configuration::config().max_upward_message_size; - let max_per_candidate = Configuration::config().max_upward_message_num_per_candidate; + let max_size = configuration::ActiveConfig::::get().max_upward_message_size; + let max_per_candidate = + configuration::ActiveConfig::::get().max_upward_message_num_per_candidate; for msg_size in 0..=max_size { check(P_0, vec![vec![0; msg_size as usize]], None); @@ -175,7 +183,7 @@ mod check_upward_messages { #[test] fn queue_count_exceeded_error() { new_test_ext(GenesisConfigBuilder::default().build()).execute_with(|| { - let limit = Configuration::config().max_upward_queue_count as u64; + let limit = configuration::ActiveConfig::::get().max_upward_queue_count as u64; for _ in 0..limit { check(P_0, vec![msg("")], None); @@ -198,10 +206,10 @@ mod check_upward_messages { #[test] fn queue_size_exceeded_error() { new_test_ext(GenesisConfigBuilder::large_queue_count().build()).execute_with(|| { - let limit = Configuration::config().max_upward_queue_size as u64; + let limit = configuration::ActiveConfig::::get().max_upward_queue_size as u64; assert_eq!(pallet_message_queue::ItemHeader::::max_encoded_len(), 5); assert!( - Configuration::config().max_upward_queue_size < + configuration::ActiveConfig::::get().max_upward_queue_size < crate::inclusion::MaxUmpMessageLenOf::::get(), "Test will not work" ); @@ -351,7 +359,7 @@ fn queue_enact_too_long_ignored() { #[test] fn relay_dispatch_queue_size_is_updated() { new_test_ext(GenesisConfigBuilder::default().build()).execute_with(|| { - let cfg = Configuration::config(); + let cfg = configuration::ActiveConfig::::get(); for p in 0..100 { let para = p.into(); @@ -430,7 +438,7 @@ fn verify_relay_dispatch_queue_size_is_externally_accessible() { // Make sure that the relay dispatch queue size storage entry is accessible via well known // keys and is decodable into a (u32, u32). new_test_ext(GenesisConfigBuilder::default().build()).execute_with(|| { - let cfg = Configuration::config(); + let cfg = configuration::ActiveConfig::::get(); for para in 0..10 { let para = para.into(); @@ -456,7 +464,7 @@ fn verify_relay_dispatch_queue_size_is_externally_accessible() { fn assert_queue_size(para: ParaId, count: u32, size: u32) { #[allow(deprecated)] let raw_queue_size = sp_io::storage::get(&well_known_keys::relay_dispatch_queue_size(para)).expect( - "enqueing a message should create the dispatch queue\ + "enqueuing a message should create the dispatch queue\ and it should be accessible via the well known keys", ); let (c, s) = <(u32, u32)>::decode(&mut &raw_queue_size[..]) @@ -466,7 +474,7 @@ fn assert_queue_size(para: ParaId, count: u32, size: u32) { // Test the deprecated but at least type-safe `relay_dispatch_queue_size_typed`: #[allow(deprecated)] let (c, s) = well_known_keys::relay_dispatch_queue_size_typed(para).get().expect( - "enqueing a message should create the dispatch queue\ + "enqueuing a message should create the dispatch queue\ and it should be accessible via the well known keys", ); assert_eq!((c, s), (count, size)); diff --git a/polkadot/runtime/parachains/src/util.rs b/polkadot/runtime/parachains/src/util.rs index aa07ef0800554e9676ff67df8efb91f6643f502b..5aa2d58da3c9bd70ec8ec201a59705c21faffb9b 100644 --- a/polkadot/runtime/parachains/src/util.rs +++ b/polkadot/runtime/parachains/src/util.rs @@ -18,7 +18,7 @@ //! on all modules. use frame_system::pallet_prelude::BlockNumberFor; -use primitives::{Id as ParaId, PersistedValidationData, ValidatorIndex}; +use primitives::{HeadData, Id as ParaId, PersistedValidationData, ValidatorIndex}; use sp_std::{collections::btree_set::BTreeSet, vec::Vec}; use crate::{configuration, hrmp, paras}; @@ -32,16 +32,33 @@ pub fn make_persisted_validation_data( relay_parent_number: BlockNumberFor, relay_parent_storage_root: T::Hash, ) -> Option>> { - let config = >::config(); + let config = configuration::ActiveConfig::::get(); Some(PersistedValidationData { - parent_head: >::para_head(¶_id)?, + parent_head: paras::Heads::::get(¶_id)?, relay_parent_number, relay_parent_storage_root, max_pov_size: config.max_pov_size, }) } +/// Make the persisted validation data for a particular parachain, a specified relay-parent, its +/// storage root and parent head data. +pub fn make_persisted_validation_data_with_parent( + relay_parent_number: BlockNumberFor, + relay_parent_storage_root: T::Hash, + parent_head: HeadData, +) -> PersistedValidationData> { + let config = configuration::ActiveConfig::::get(); + + PersistedValidationData { + parent_head, + relay_parent_number, + relay_parent_storage_root, + max_pov_size: config.max_pov_size, + } +} + /// Take an active subset of a set containing all validators. /// /// First item in pair will be all items in set have indices found in the `active` indices set (in diff --git a/polkadot/runtime/rococo/Cargo.toml b/polkadot/runtime/rococo/Cargo.toml index 11be7a9ffc4396e7deeabf7527bdf72e6c0bf92e..20a914fb8085fcc917b83fbf5f879e603609904b 100644 --- a/polkadot/runtime/rococo/Cargo.toml +++ b/polkadot/runtime/rococo/Cargo.toml @@ -12,16 +12,19 @@ workspace = true [dependencies] parity-scale-codec = { version = "3.6.1", default-features = false, features = ["derive", "max-encoded-len"] } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -log = { version = "0.4.17", default-features = false } -serde = { version = "1.0.195", default-features = false } -serde_derive = { version = "1.0.117", optional = true } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +log = { workspace = true } +serde = { workspace = true } +serde_derive = { optional = true, workspace = true } +serde_json = { features = ["alloc"], workspace = true } static_assertions = "1.1.0" smallvec = "1.8.0" +bitvec = { version = "1.0.1", default-features = false, features = ["alloc"] } authority-discovery-primitives = { package = "sp-authority-discovery", path = "../../../substrate/primitives/authority-discovery", default-features = false } babe-primitives = { package = "sp-consensus-babe", path = "../../../substrate/primitives/consensus/babe", default-features = false } beefy-primitives = { package = "sp-consensus-beefy", path = "../../../substrate/primitives/consensus/beefy", default-features = false } +grandpa_primitives = { package = "sp-consensus-grandpa", path = "../../../substrate/primitives/consensus/grandpa", default-features = false } binary-merkle-tree = { path = "../../../substrate/utils/binary-merkle-tree", default-features = false } rococo-runtime-constants = { package = "rococo-runtime-constants", path = "constants", default-features = false } sp-api = { path = "../../../substrate/primitives/api", default-features = false } @@ -60,7 +63,6 @@ pallet-asset-rate = { path = "../../../substrate/frame/asset-rate", default-feat frame-executive = { path = "../../../substrate/frame/executive", default-features = false } pallet-grandpa = { path = "../../../substrate/frame/grandpa", default-features = false } pallet-identity = { path = "../../../substrate/frame/identity", default-features = false } -pallet-im-online = { path = "../../../substrate/frame/im-online", default-features = false } pallet-indices = { path = "../../../substrate/frame/indices", default-features = false } pallet-membership = { path = "../../../substrate/frame/membership", default-features = false } pallet-message-queue = { path = "../../../substrate/frame/message-queue", default-features = false } @@ -104,6 +106,7 @@ polkadot-parachain-primitives = { path = "../../parachain", default-features = f xcm = { package = "staging-xcm", path = "../../xcm", default-features = false } xcm-executor = { package = "staging-xcm-executor", path = "../../xcm/xcm-executor", default-features = false } xcm-builder = { package = "staging-xcm-builder", path = "../../xcm/xcm-builder", default-features = false } +xcm-fee-payment-runtime-api = { path = "../../xcm/xcm-fee-payment-runtime-api", default-features = false } [dev-dependencies] tiny-keccak = { version = "2.0.2", features = ["keccak"] } @@ -111,7 +114,7 @@ keyring = { package = "sp-keyring", path = "../../../substrate/primitives/keyrin remote-externalities = { package = "frame-remote-externalities", path = "../../../substrate/utils/frame/remote-externalities" } sp-trie = { path = "../../../substrate/primitives/trie" } separator = "0.4.1" -serde_json = "1.0.111" +serde_json = { workspace = true, default-features = true } sp-tracing = { path = "../../../substrate/primitives/tracing", default-features = false } tokio = { version = "1.24.2", features = ["macros"] } @@ -126,6 +129,7 @@ std = [ "babe-primitives/std", "beefy-primitives/std", "binary-merkle-tree/std", + "bitvec/std", "block-builder-api/std", "frame-benchmarking?/std", "frame-executive/std", @@ -134,6 +138,7 @@ std = [ "frame-system-rpc-runtime-api/std", "frame-system/std", "frame-try-runtime/std", + "grandpa_primitives/std", "inherents/std", "log/std", "offchain-primitives/std", @@ -152,7 +157,6 @@ std = [ "pallet-elections-phragmen/std", "pallet-grandpa/std", "pallet-identity/std", - "pallet-im-online/std", "pallet-indices/std", "pallet-membership/std", "pallet-message-queue/std", @@ -191,6 +195,7 @@ std = [ "scale-info/std", "serde/std", "serde_derive", + "serde_json/std", "sp-api/std", "sp-arithmetic/std", "sp-core/std", @@ -208,6 +213,7 @@ std = [ "tx-pool-api/std", "xcm-builder/std", "xcm-executor/std", + "xcm-fee-payment-runtime-api/std", "xcm/std", ] runtime-benchmarks = [ @@ -226,7 +232,6 @@ runtime-benchmarks = [ "pallet-elections-phragmen/runtime-benchmarks", "pallet-grandpa/runtime-benchmarks", "pallet-identity/runtime-benchmarks", - "pallet-im-online/runtime-benchmarks", "pallet-indices/runtime-benchmarks", "pallet-membership/runtime-benchmarks", "pallet-message-queue/runtime-benchmarks", @@ -282,7 +287,6 @@ try-runtime = [ "pallet-elections-phragmen/try-runtime", "pallet-grandpa/try-runtime", "pallet-identity/try-runtime", - "pallet-im-online/try-runtime", "pallet-indices/try-runtime", "pallet-membership/try-runtime", "pallet-message-queue/try-runtime", diff --git a/polkadot/runtime/rococo/README.md b/polkadot/runtime/rococo/README.md index 5b2c296f0ced9a053de46bac5d8207d7a1d835d8..c19c3654fe4d35717283a5ad5fe1f2546a0d0f3a 100644 --- a/polkadot/runtime/rococo/README.md +++ b/polkadot/runtime/rococo/README.md @@ -4,7 +4,7 @@ Rococo is a testnet runtime with no stability guarantees. ## How to build `rococo` runtime `EpochDurationInBlocks` parameter is configurable via `ROCOCO_EPOCH_DURATION` environment variable. To build wasm -runtime blob with customized epoch duration the following command shall be exectuted: +runtime blob with customized epoch duration the following command shall be executed: ```bash ROCOCO_EPOCH_DURATION=10 ./polkadot/scripts/build-only-wasm.sh rococo-runtime /path/to/output/directory/ ``` diff --git a/polkadot/runtime/rococo/src/genesis_config_presets.rs b/polkadot/runtime/rococo/src/genesis_config_presets.rs new file mode 100644 index 0000000000000000000000000000000000000000..bac6902383e3b549bc99181f921905760a71cd96 --- /dev/null +++ b/polkadot/runtime/rococo/src/genesis_config_presets.rs @@ -0,0 +1,544 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +//! Genesis configs presets for the Rococo runtime + +use crate::{SessionKeys, BABE_GENESIS_EPOCH_CONFIG}; +use authority_discovery_primitives::AuthorityId as AuthorityDiscoveryId; +use babe_primitives::AuthorityId as BabeId; +use beefy_primitives::ecdsa_crypto::AuthorityId as BeefyId; +use grandpa_primitives::AuthorityId as GrandpaId; +use primitives::{vstaging::SchedulerParams, AccountId, AccountPublic, AssignmentId, ValidatorId}; +use rococo_runtime_constants::currency::UNITS as ROC; +use sp_core::{sr25519, Pair, Public}; +use sp_runtime::traits::IdentifyAccount; +#[cfg(not(feature = "std"))] +use sp_std::alloc::format; +use sp_std::vec::Vec; + +/// Helper function to generate a crypto pair from seed +fn get_from_seed(seed: &str) -> ::Public { + TPublic::Pair::from_string(&format!("//{}", seed), None) + .expect("static values are valid; qed") + .public() +} + +/// Helper function to generate an account ID from seed +fn get_account_id_from_seed(seed: &str) -> AccountId +where + AccountPublic: From<::Public>, +{ + AccountPublic::from(get_from_seed::(seed)).into_account() +} + +/// Helper function to generate stash, controller and session key from seed +fn get_authority_keys_from_seed( + seed: &str, +) -> ( + AccountId, + AccountId, + BabeId, + GrandpaId, + ValidatorId, + AssignmentId, + AuthorityDiscoveryId, + BeefyId, +) { + let keys = get_authority_keys_from_seed_no_beefy(seed); + (keys.0, keys.1, keys.2, keys.3, keys.4, keys.5, keys.6, get_from_seed::(seed)) +} + +/// Helper function to generate stash, controller and session key from seed +fn get_authority_keys_from_seed_no_beefy( + seed: &str, +) -> (AccountId, AccountId, BabeId, GrandpaId, ValidatorId, AssignmentId, AuthorityDiscoveryId) { + ( + get_account_id_from_seed::(&format!("{}//stash", seed)), + get_account_id_from_seed::(seed), + get_from_seed::(seed), + get_from_seed::(seed), + get_from_seed::(seed), + get_from_seed::(seed), + get_from_seed::(seed), + ) +} + +fn testnet_accounts() -> Vec { + Vec::from([ + get_account_id_from_seed::("Alice"), + get_account_id_from_seed::("Bob"), + get_account_id_from_seed::("Charlie"), + get_account_id_from_seed::("Dave"), + get_account_id_from_seed::("Eve"), + get_account_id_from_seed::("Ferdie"), + get_account_id_from_seed::("Alice//stash"), + get_account_id_from_seed::("Bob//stash"), + get_account_id_from_seed::("Charlie//stash"), + get_account_id_from_seed::("Dave//stash"), + get_account_id_from_seed::("Eve//stash"), + get_account_id_from_seed::("Ferdie//stash"), + ]) +} + +fn rococo_session_keys( + babe: BabeId, + grandpa: GrandpaId, + para_validator: ValidatorId, + para_assignment: AssignmentId, + authority_discovery: AuthorityDiscoveryId, + beefy: BeefyId, +) -> SessionKeys { + SessionKeys { babe, grandpa, para_validator, para_assignment, authority_discovery, beefy } +} + +fn default_parachains_host_configuration( +) -> runtime_parachains::configuration::HostConfiguration { + use primitives::{ + node_features::FeatureIndex, AsyncBackingParams, MAX_CODE_SIZE, MAX_POV_SIZE, + }; + + runtime_parachains::configuration::HostConfiguration { + validation_upgrade_cooldown: 2u32, + validation_upgrade_delay: 2, + code_retention_period: 1200, + max_code_size: MAX_CODE_SIZE, + max_pov_size: MAX_POV_SIZE, + max_head_data_size: 32 * 1024, + max_upward_queue_count: 8, + max_upward_queue_size: 1024 * 1024, + max_downward_message_size: 1024 * 1024, + max_upward_message_size: 50 * 1024, + max_upward_message_num_per_candidate: 5, + hrmp_sender_deposit: 0, + hrmp_recipient_deposit: 0, + hrmp_channel_max_capacity: 8, + hrmp_channel_max_total_size: 8 * 1024, + hrmp_max_parachain_inbound_channels: 4, + hrmp_channel_max_message_size: 1024 * 1024, + hrmp_max_parachain_outbound_channels: 4, + hrmp_max_message_num_per_candidate: 5, + dispute_period: 6, + no_show_slots: 2, + n_delay_tranches: 25, + needed_approvals: 2, + relay_vrf_modulo_samples: 2, + zeroth_delay_tranche_width: 0, + minimum_validation_upgrade_delay: 5, + async_backing_params: AsyncBackingParams { + max_candidate_depth: 3, + allowed_ancestry_len: 2, + }, + node_features: bitvec::vec::BitVec::from_element( + 1u8 << (FeatureIndex::ElasticScalingMVP as usize), + ), + scheduler_params: SchedulerParams { + lookahead: 2, + group_rotation_frequency: 20, + paras_availability_period: 4, + ..Default::default() + }, + ..Default::default() + } +} + +#[test] +fn default_parachains_host_configuration_is_consistent() { + default_parachains_host_configuration().panic_if_not_consistent(); +} + +fn rococo_testnet_genesis( + initial_authorities: Vec<( + AccountId, + AccountId, + BabeId, + GrandpaId, + ValidatorId, + AssignmentId, + AuthorityDiscoveryId, + BeefyId, + )>, + root_key: AccountId, + endowed_accounts: Option>, +) -> serde_json::Value { + let endowed_accounts: Vec = endowed_accounts.unwrap_or_else(testnet_accounts); + + const ENDOWMENT: u128 = 1_000_000 * ROC; + + serde_json::json!({ + "balances": { + "balances": endowed_accounts.iter().map(|k| (k.clone(), ENDOWMENT)).collect::>(), + }, + "session": { + "keys": initial_authorities + .iter() + .map(|x| { + ( + x.0.clone(), + x.0.clone(), + rococo_session_keys( + x.2.clone(), + x.3.clone(), + x.4.clone(), + x.5.clone(), + x.6.clone(), + x.7.clone(), + ), + ) + }) + .collect::>(), + }, + "babe": { + "epochConfig": Some(BABE_GENESIS_EPOCH_CONFIG), + }, + "sudo": { "key": Some(root_key.clone()) }, + "configuration": { + "config": runtime_parachains::configuration::HostConfiguration { + scheduler_params: SchedulerParams { + max_validators_per_core: Some(1), + ..default_parachains_host_configuration().scheduler_params + }, + ..default_parachains_host_configuration() + }, + }, + "registrar": { + "nextFreeParaId": primitives::LOWEST_PUBLIC_ID, + } + }) +} + +// staging_testnet +fn rococo_staging_testnet_config_genesis() -> serde_json::Value { + use hex_literal::hex; + use sp_core::crypto::UncheckedInto; + + // subkey inspect "$SECRET" + let endowed_accounts = Vec::from([ + // 5DwBmEFPXRESyEam5SsQF1zbWSCn2kCjyLW51hJHXe9vW4xs + hex!["52bc71c1eca5353749542dfdf0af97bf764f9c2f44e860cd485f1cd86400f649"].into(), + ]); + + // ./scripts/prepare-test-net.sh 8 + let initial_authorities: Vec<( + AccountId, + AccountId, + BabeId, + GrandpaId, + ValidatorId, + AssignmentId, + AuthorityDiscoveryId, + BeefyId, + )> = Vec::from([ + ( + //5EHZkbp22djdbuMFH9qt1DVzSCvqi3zWpj6DAYfANa828oei + hex!["62475fe5406a7cb6a64c51d0af9d3ab5c2151bcae982fb812f7a76b706914d6a"].into(), + //5FeSEpi9UYYaWwXXb3tV88qtZkmSdB3mvgj3pXkxKyYLGhcd + hex!["9e6e781a76810fe93187af44c79272c290c2b9e2b8b92ee11466cd79d8023f50"].into(), + //5Fh6rDpMDhM363o1Z3Y9twtaCPfizGQWCi55BSykTQjGbP7H + hex!["a076ef1280d768051f21d060623da3ab5b56944d681d303ed2d4bf658c5bed35"] + .unchecked_into(), + //5CPd3zoV9Aaah4xWucuDivMHJ2nEEmpdi864nPTiyRZp4t87 + hex!["0e6d7d1afbcc6547b92995a394ba0daed07a2420be08220a5a1336c6731f0bfa"] + .unchecked_into(), + //5CP6oGfwqbEfML8efqm1tCZsUgRsJztp9L8ZkEUxA16W8PPz + hex!["0e07a51d3213842f8e9363ce8e444255990a225f87e80a3d651db7841e1a0205"] + .unchecked_into(), + //5HQdwiDh8Qtd5dSNWajNYpwDvoyNWWA16Y43aEkCNactFc2b + hex!["ec60e71fe4a567ef9fef99d4bbf37ffae70564b41aa6f94ef0317c13e0a5477b"] + .unchecked_into(), + //5HbSgM72xVuscsopsdeG3sCSCYdAeM1Tay9p79N6ky6vwDGq + hex!["f49eae66a0ac9f610316906ec8f1a0928e20d7059d76a5ca53cbcb5a9b50dd3c"] + .unchecked_into(), + //5DPSWdgw38Spu315r6LSvYCggeeieBAJtP5A1qzuzKhqmjVu + hex!["034f68c5661a41930c82f26a662276bf89f33467e1c850f2fb8ef687fe43d62276"] + .unchecked_into(), + ), + ( + //5DvH8oEjQPYhzCoQVo7WDU91qmQfLZvxe9wJcrojmJKebCmG + hex!["520b48452969f6ddf263b664de0adb0c729d0e0ad3b0e5f3cb636c541bc9022a"].into(), + //5ENZvCRzyXJJYup8bM6yEzb2kQHEb1NDpY2ZEyVGBkCfRdj3 + hex!["6618289af7ae8621981ffab34591e7a6486e12745dfa3fd3b0f7e6a3994c7b5b"].into(), + //5DLjSUfqZVNAADbwYLgRvHvdzXypiV1DAEaDMjcESKTcqMoM + hex!["38757d0de00a0c739e7d7984ef4bc01161bd61e198b7c01b618425c16bb5bd5f"] + .unchecked_into(), + //5HnDVBN9mD6mXyx8oryhDbJtezwNSj1VRXgLoYCBA6uEkiao + hex!["fcd5f87a6fd5707a25122a01b4dac0a8482259df7d42a9a096606df1320df08d"] + .unchecked_into(), + //5EPEWRecy2ApL5n18n3aHyU1956zXTRqaJpzDa9DoqiggNwF + hex!["669a10892119453e9feb4e3f1ee8e028916cc3240022920ad643846fbdbee816"] + .unchecked_into(), + //5ES3fw5X4bndSgLNmtPfSbM2J1kLqApVB2CCLS4CBpM1UxUZ + hex!["68bf52c482630a8d1511f2edd14f34127a7d7082219cccf7fd4c6ecdb535f80d"] + .unchecked_into(), + //5HeXbwb5PxtcRoopPZTp5CQun38atn2UudQ8p2AxR5BzoaXw + hex!["f6f8fe475130d21165446a02fb1dbce3a7bf36412e5d98f4f0473aed9252f349"] + .unchecked_into(), + //5F7nTtN8MyJV4UsXpjg7tHSnfANXZ5KRPJmkASc1ZSH2Xoa5 + hex!["03a90c2bb6d3b7000020f6152fe2e5002fa970fd1f42aafb6c8edda8dacc2ea77e"] + .unchecked_into(), + ), + ( + //5FPMzsezo1PRxYbVpJMWK7HNbR2kUxidsAAxH4BosHa4wd6S + hex!["92ef83665b39d7a565e11bf8d18d41d45a8011601c339e57a8ea88c8ff7bba6f"].into(), + //5G6NQidFG7YiXsvV7hQTLGArir9tsYqD4JDxByhgxKvSKwRx + hex!["b235f57244230589523271c27b8a490922ffd7dccc83b044feaf22273c1dc735"].into(), + //5GpZhzAVg7SAtzLvaAC777pjquPEcNy1FbNUAG2nZvhmd6eY + hex!["d2644c1ab2c63a3ad8d40ad70d4b260969e3abfe6d7e6665f50dc9f6365c9d2a"] + .unchecked_into(), + //5HAes2RQYPbYKbLBfKb88f4zoXv6pPA6Ke8CjN7dob3GpmSP + hex!["e1b68fbd84333e31486c08e6153d9a1415b2e7e71b413702b7d64e9b631184a1"] + .unchecked_into(), + //5FtAGDZYJKXkhVhAxCQrXmaP7EE2mGbBMfmKDHjfYDgq2BiU + hex!["a8e61ffacafaf546283dc92d14d7cc70ea0151a5dd81fdf73ff5a2951f2b6037"] + .unchecked_into(), + //5CtK7JHv3h6UQZ44y54skxdwSVBRtuxwPE1FYm7UZVhg8rJV + hex!["244f3421b310c68646e99cdbf4963e02067601f57756b072a4b19431448c186e"] + .unchecked_into(), + //5D4r6YaB6F7A7nvMRHNFNF6zrR9g39bqDJFenrcaFmTCRwfa + hex!["2c57f81fd311c1ab53813c6817fe67f8947f8d39258252663b3384ab4195494d"] + .unchecked_into(), + //5EPoHj8uV4fFKQHYThc6Z9fDkU7B6ih2ncVzQuDdNFb8UyhF + hex!["039d065fe4f9234f0a4f13cc3ae585f2691e9c25afa469618abb6645111f607a53"] + .unchecked_into(), + ), + ( + //5DMNx7RoX6d7JQ38NEM7DWRcW2THu92LBYZEWvBRhJeqcWgR + hex!["38f3c2f38f6d47f161e98c697bbe3ca0e47c033460afda0dda314ab4222a0404"].into(), + //5GGdKNDr9P47dpVnmtq3m8Tvowwf1ot1abw6tPsTYYFoKm2v + hex!["ba0898c1964196474c0be08d364cdf4e9e1d47088287f5235f70b0590dfe1704"].into(), + //5EjkyPCzR2SjhDZq8f7ufsw6TfkvgNRepjCRQFc4TcdXdaB1 + hex!["764186bc30fd5a02477f19948dc723d6d57ab174debd4f80ed6038ec960bfe21"] + .unchecked_into(), + //5DJV3zCBTJBLGNDCcdWrYxWDacSz84goGTa4pFeKVvehEBte + hex!["36be9069cdb4a8a07ecd51f257875150f0a8a1be44a10d9d98dabf10a030aef4"] + .unchecked_into(), + //5F9FsRjpecP9GonktmtFL3kjqNAMKjHVFjyjRdTPa4hbQRZA + hex!["882d72965e642677583b333b2d173ac94b5fd6c405c76184bb14293be748a13b"] + .unchecked_into(), + //5F1FZWZSj3JyTLs8sRBxU6QWyGLSL9BMRtmSKDmVEoiKFxSP + hex!["821271c99c958b9220f1771d9f5e29af969edfa865631dba31e1ab7bc0582b75"] + .unchecked_into(), + //5CtgRR74VypK4h154s369abs78hDUxZSJqcbWsfXvsjcHJNA + hex!["2496f28d887d84705c6dae98aee8bf90fc5ad10bb5545eca1de6b68425b70f7c"] + .unchecked_into(), + //5CPx6dsr11SCJHKFkcAQ9jpparS7FwXQBrrMznRo4Hqv1PXz + hex!["0307d29bbf6a5c4061c2157b44fda33b7bb4ec52a5a0305668c74688cedf288d58"] + .unchecked_into(), + ), + ( + //5C8AL1Zb4bVazgT3EgDxFgcow1L4SJjVu44XcLC9CrYqFN4N + hex!["02a2d8cfcf75dda85fafc04ace3bcb73160034ed1964c43098fb1fe831de1b16"].into(), + //5FLYy3YKsAnooqE4hCudttAsoGKbVG3hYYBtVzwMjJQrevPa + hex!["90cab33f0bb501727faa8319f0845faef7d31008f178b65054b6629fe531b772"].into(), + //5Et3tfbVf1ByFThNAuUq5pBssdaPPskip5yob5GNyUFojXC7 + hex!["7c94715e5dd8ab54221b1b6b2bfa5666f593f28a92a18e28052531de1bd80813"] + .unchecked_into(), + //5EX1JBghGbQqWohTPU6msR9qZ2nYPhK9r3RTQ2oD1K8TCxaG + hex!["6c878e33b83c20324238d22240f735457b6fba544b383e70bb62a27b57380c81"] + .unchecked_into(), + //5EUNaBpX9mJgcmLQHyG5Pkms6tbDiKuLbeTEJS924Js9cA1N + hex!["6a8570b9c6408e54bacf123cc2bb1b0f087f9c149147d0005badba63a5a4ac01"] + .unchecked_into(), + //5CaZuueRVpMATZG4hkcrgDoF4WGixuz7zu83jeBdY3bgWGaG + hex!["16c69ea8d595e80b6736f44be1eaeeef2ac9c04a803cc4fd944364cb0d617a33"] + .unchecked_into(), + //5DABsdQCDUGuhzVGWe5xXzYQ9rtrVxRygW7RXf9Tsjsw1aGJ + hex!["306ac5c772fe858942f92b6e28bd82fb7dd8cdd25f9a4626c1b0eee075fcb531"] + .unchecked_into(), + //5H91T5mHhoCw9JJG4NjghDdQyhC6L7XcSuBWKD3q3TAhEVvQ + hex!["02fb0330356e63a35dd930bc74525edf28b3bf5eb44aab9e9e4962c8309aaba6a6"] + .unchecked_into(), + ), + ( + //5C8XbDXdMNKJrZSrQURwVCxdNdk8AzG6xgLggbzuA399bBBF + hex!["02ea6bfa8b23b92fe4b5db1063a1f9475e3acd0ab61e6b4f454ed6ba00b5f864"].into(), + //5GsyzFP8qtF8tXPSsjhjxAeU1v7D1PZofuQKN9TdCc7Dp1JM + hex!["d4ffc4c05b47d1115ad200f7f86e307b20b46c50e1b72a912ec4f6f7db46b616"].into(), + //5GHWB8ZDzegLcMW7Gdd1BS6WHVwDdStfkkE4G7KjPjZNJBtD + hex!["bab3cccdcc34401e9b3971b96a662686cf755aa869a5c4b762199ce531b12c5b"] + .unchecked_into(), + //5GzDPGbUM9uH52ZEwydasTj8edokGUJ7vEpoFWp9FE1YNuFB + hex!["d9c056c98ca0e6b4eb7f5c58c007c1db7be0fe1f3776108f797dd4990d1ccc33"] + .unchecked_into(), + //5CmLCFeSurRXXtwMmLcVo7sdJ9EqDguvJbuCYDcHkr3cpqyE + hex!["1efc23c0b51ad609ab670ecf45807e31acbd8e7e5cb7c07cf49ee42992d2867c"] + .unchecked_into(), + //5DnsSy8a8pfE2aFjKBDtKw7WM1V4nfE5sLzP15MNTka53GqS + hex!["4c64d3f06d28adeb36a892fdaccecace150bec891f04694448a60b74fa469c22"] + .unchecked_into(), + //5CZdFnyzZvKetZTeUwj5APAYskVJe4QFiTezo5dQNsrnehGd + hex!["160ea09c5717270e958a3da42673fa011613a9539b2e4ebcad8626bc117ca04a"] + .unchecked_into(), + //5HgoR9JJkdBusxKrrs3zgd3ToppgNoGj1rDyAJp4e7eZiYyT + hex!["020019a8bb188f8145d02fa855e9c36e9914457d37c500e03634b5223aa5702474"] + .unchecked_into(), + ), + ( + //5HinEonzr8MywkqedcpsmwpxKje2jqr9miEwuzyFXEBCvVXM + hex!["fa373e25a1c4fe19c7148acde13bc3db1811cf656dc086820f3dda736b9c4a00"].into(), + //5EHJbj6Td6ks5HDnyfN4ttTSi57osxcQsQexm7XpazdeqtV7 + hex!["62145d721967bd88622d08625f0f5681463c0f1b8bcd97eb3c2c53f7660fd513"].into(), + //5EeCsC58XgJ1DFaoYA1WktEpP27jvwGpKdxPMFjicpLeYu96 + hex!["720537e2c1c554654d73b3889c3ef4c3c2f95a65dd3f7c185ebe4afebed78372"] + .unchecked_into(), + //5DnEySxbnppWEyN8cCLqvGjAorGdLRg2VmkY96dbJ1LHFK8N + hex!["4bea0b37e0cce9bddd80835fa2bfd5606f5dcfb8388bbb10b10c483f0856cf14"] + .unchecked_into(), + //5CAC278tFCHAeHYqE51FTWYxHmeLcENSS1RG77EFRTvPZMJT + hex!["042f07fc5268f13c026bbe199d63e6ac77a0c2a780f71cda05cee5a6f1b3f11f"] + .unchecked_into(), + //5HjRTLWcQjZzN3JDvaj1UzjNSayg5ZD9ZGWMstaL7Ab2jjAa + hex!["fab485e87ed1537d089df521edf983a777c57065a702d7ed2b6a2926f31da74f"] + .unchecked_into(), + //5ELv74v7QcsS6FdzvG4vL2NnYDGWmRnJUSMKYwdyJD7Xcdi7 + hex!["64d59feddb3d00316a55906953fb3db8985797472bd2e6c7ea1ab730cc339d7f"] + .unchecked_into(), + //5FaUcPt4fPz93vBhcrCJqmDkjYZ7jCbzAF56QJoCmvPaKrmx + hex!["033f1a6d47fe86f88934e4b83b9fae903b92b5dcf4fec97d5e3e8bf4f39df03685"] + .unchecked_into(), + ), + ( + //5Ey3NQ3dfabaDc16NUv7wRLsFCMDFJSqZFzKVycAsWuUC6Di + hex!["8062e9c21f1d92926103119f7e8153cebdb1e5ab3e52d6f395be80bb193eab47"].into(), + //5HiWsuSBqt8nS9pnggexXuHageUifVPKPHDE2arTKqhTp1dV + hex!["fa0388fa88f3f0cb43d583e2571fbc0edad57dff3a6fd89775451dd2c2b8ea00"].into(), + //5H168nKX2Yrfo3bxj7rkcg25326Uv3CCCnKUGK6uHdKMdPt8 + hex!["da6b2df18f0f9001a6dcf1d301b92534fe9b1f3ccfa10c49449fee93adaa8349"] + .unchecked_into(), + //5DrA2fZdzmNqT5j6DXNwVxPBjDV9jhkAqvjt6Us3bQHKy3cF + hex!["4ee66173993dd0db5d628c4c9cb61a27b76611ad3c3925947f0d0011ee2c5dcc"] + .unchecked_into(), + //5Gx6YeNhynqn8qkda9QKpc9S7oDr4sBrfAu516d3sPpEt26F + hex!["d822d4088b20dca29a580a577a97d6f024bb24c9550bebdfd7d2d18e946a1c7d"] + .unchecked_into(), + //5DhDcHqwxoes5s89AyudGMjtZXx1nEgrk5P45X88oSTR3iyx + hex!["481538f8c2c011a76d7d57db11c2789a5e83b0f9680dc6d26211d2f9c021ae4c"] + .unchecked_into(), + //5DqAvikdpfRdk5rR35ZobZhqaC5bJXZcEuvzGtexAZP1hU3T + hex!["4e262811acdfe94528bfc3c65036080426a0e1301b9ada8d687a70ffcae99c26"] + .unchecked_into(), + //5E41Znrr2YtZu8bZp3nvRuLVHg3jFksfQ3tXuviLku4wsao7 + hex!["025e84e95ed043e387ddb8668176b42f8e2773ddd84f7f58a6d9bf436a4b527986"] + .unchecked_into(), + ), + ]); + + const ENDOWMENT: u128 = 1_000_000 * ROC; + const STASH: u128 = 100 * ROC; + + serde_json::json!({ + "balances": { + "balances": endowed_accounts + .iter() + .map(|k: &AccountId| (k.clone(), ENDOWMENT)) + .chain(initial_authorities.iter().map(|x| (x.0.clone(), STASH))) + .collect::>(), + }, + "session": { + "keys": initial_authorities + .into_iter() + .map(|x| { + ( + x.0.clone(), + x.0, + rococo_session_keys( + x.2, + x.3, + x.4, + x.5, + x.6, + x.7, + ), + ) + }) + .collect::>(), + }, + "babe": { + "epochConfig": Some(BABE_GENESIS_EPOCH_CONFIG), + }, + "sudo": { "key": Some(endowed_accounts[0].clone()) }, + "configuration": { + "config": default_parachains_host_configuration(), + }, + "registrar": { + "nextFreeParaId": primitives::LOWEST_PUBLIC_ID, + }, + }) +} + +//development +fn rococo_development_config_genesis() -> serde_json::Value { + rococo_testnet_genesis( + Vec::from([get_authority_keys_from_seed("Alice")]), + get_account_id_from_seed::("Alice"), + None, + ) +} + +//local_testnet +fn rococo_local_testnet_genesis() -> serde_json::Value { + rococo_testnet_genesis( + Vec::from([get_authority_keys_from_seed("Alice"), get_authority_keys_from_seed("Bob")]), + get_account_id_from_seed::("Alice"), + None, + ) +} + +/// `Versi` is a temporary testnet that uses the same runtime as rococo. +// versi_local_testnet +fn versi_local_testnet_genesis() -> serde_json::Value { + rococo_testnet_genesis( + Vec::from([ + get_authority_keys_from_seed("Alice"), + get_authority_keys_from_seed("Bob"), + get_authority_keys_from_seed("Charlie"), + get_authority_keys_from_seed("Dave"), + ]), + get_account_id_from_seed::("Alice"), + None, + ) +} + +/// Wococo is a temporary testnet that uses almost the same runtime as rococo. +//wococo_local_testnet +fn wococo_local_testnet_genesis() -> serde_json::Value { + rococo_testnet_genesis( + Vec::from([ + get_authority_keys_from_seed("Alice"), + get_authority_keys_from_seed("Bob"), + get_authority_keys_from_seed("Charlie"), + get_authority_keys_from_seed("Dave"), + ]), + get_account_id_from_seed::("Alice"), + None, + ) +} + +/// Provides the JSON representation of predefined genesis config for given `id`. +pub fn get_preset(id: &sp_genesis_builder::PresetId) -> Option> { + let patch = match id.try_into() { + Ok("local_testnet") => rococo_local_testnet_genesis(), + Ok("development") => rococo_development_config_genesis(), + Ok("staging_testnet") => rococo_staging_testnet_config_genesis(), + Ok("wococo_local_testnet") => wococo_local_testnet_genesis(), + Ok("versi_local_testnet") => versi_local_testnet_genesis(), + _ => return None, + }; + Some( + serde_json::to_string(&patch) + .expect("serialization to json is expected to work. qed.") + .into_bytes(), + ) +} diff --git a/polkadot/runtime/rococo/src/governance/fellowship.rs b/polkadot/runtime/rococo/src/governance/fellowship.rs index 9ac47e008a2719c6f637b2c9a58b3a8ae75b4c65..a589b768afde2c0757e74a6535509228f1613a82 100644 --- a/polkadot/runtime/rococo/src/governance/fellowship.rs +++ b/polkadot/runtime/rococo/src/governance/fellowship.rs @@ -17,7 +17,7 @@ //! Elements of governance concerning the Rococo Fellowship. use frame_support::traits::{MapSuccess, TryMapSuccess}; -use sp_runtime::traits::{CheckedReduceBy, ConstU16, Replace}; +use sp_runtime::traits::{CheckedReduceBy, ConstU16, Replace, ReplaceWithDefault}; use super::*; use crate::{CENTS, DAYS}; @@ -315,6 +315,11 @@ pub type FellowshipCollectiveInstance = pallet_ranked_collective::Instance1; impl pallet_ranked_collective::Config for Runtime { type WeightInfo = weights::pallet_ranked_collective::WeightInfo; type RuntimeEvent = RuntimeEvent; + // Adding is by any of: + // - Root. + // - the FellowshipAdmin origin. + // - a Fellowship origin. + type AddOrigin = MapSuccess>; // Promotion is by any of: // - Root can demote arbitrarily. // - the FellowshipAdmin origin (i.e. token holder referendum); @@ -326,6 +331,11 @@ impl pallet_ranked_collective::Config for Runtime TryMapSuccess>>, >, >; + // Removing is by any of: + // - Root can remove arbitrarily. + // - the FellowshipAdmin origin (i.e. token holder referendum); + // - a vote by the rank two above the current rank. + type RemoveOrigin = Self::DemoteOrigin; // Demotion is by any of: // - Root can demote arbitrarily. // - the FellowshipAdmin origin (i.e. token holder referendum); diff --git a/polkadot/runtime/rococo/src/impls.rs b/polkadot/runtime/rococo/src/impls.rs index ac7100d7858377dca5991e0d0308dc64577b9350..cf364b6ac7942753b6fd5f47dbf621d70c7ebcf7 100644 --- a/polkadot/runtime/rococo/src/impls.rs +++ b/polkadot/runtime/rococo/src/impls.rs @@ -167,11 +167,16 @@ where }, ]); + let encoded_versioned_xcm = + VersionedXcm::V4(program).encode().try_into().map_err(|error| { + log::error!(target: "runtime::on_reap_identity", "XCM too large, error: {:?}", error); + pallet_xcm::Error::::XcmTooLarge + })?; // send - let _ = >::send( + let _ = >::send_blob( RawOrigin::Root.into(), Box::new(VersionedLocation::V4(destination)), - Box::new(VersionedXcm::V4(program)), + encoded_versioned_xcm, )?; Ok(()) } diff --git a/polkadot/runtime/rococo/src/lib.rs b/polkadot/runtime/rococo/src/lib.rs index 6b223840420890eb09c158b46c5f374eaa043972..92ea1b9df84b6f264c3ba55a434c3205d5f19351 100644 --- a/polkadot/runtime/rococo/src/lib.rs +++ b/polkadot/runtime/rococo/src/lib.rs @@ -20,16 +20,20 @@ // `construct_runtime!` does a lot of recursion and requires us to increase the limit. #![recursion_limit = "512"] +use authority_discovery_primitives::AuthorityId as AuthorityDiscoveryId; +use beefy_primitives::{ + ecdsa_crypto::{AuthorityId as BeefyId, Signature as BeefySignature}, + mmr::{BeefyDataProvider, MmrLeafVersion}, +}; use pallet_nis::WithMaximumOf; use parity_scale_codec::{Decode, Encode, MaxEncodedLen}; use primitives::{ - slashing, - vstaging::{ApprovalVotingParams, NodeFeatures}, - AccountId, AccountIndex, Balance, BlockNumber, CandidateEvent, CandidateHash, - CommittedCandidateReceipt, CoreState, DisputeState, ExecutorParams, GroupRotationInfo, Hash, - Id as ParaId, InboundDownwardMessage, InboundHrmpMessage, Moment, Nonce, - OccupiedCoreAssumption, PersistedValidationData, ScrapedOnChainVotes, SessionInfo, Signature, - ValidationCode, ValidationCodeHash, ValidatorId, ValidatorIndex, PARACHAIN_KEY_TYPE_ID, + slashing, AccountId, AccountIndex, ApprovalVotingParams, Balance, BlockNumber, CandidateEvent, + CandidateHash, CommittedCandidateReceipt, CoreIndex, CoreState, DisputeState, ExecutorParams, + GroupRotationInfo, Hash, Id as ParaId, InboundDownwardMessage, InboundHrmpMessage, Moment, + NodeFeatures, Nonce, OccupiedCoreAssumption, PersistedValidationData, ScrapedOnChainVotes, + SessionInfo, Signature, ValidationCode, ValidationCodeHash, ValidatorId, ValidatorIndex, + PARACHAIN_KEY_TYPE_ID, }; use rococo_runtime_constants::system_parachain::BROKER_ID; use runtime_common::{ @@ -38,52 +42,49 @@ use runtime_common::{ LocatableAssetConverter, ToAuthor, VersionedLocatableAsset, VersionedLocationConverter, }, paras_registrar, paras_sudo_wrapper, prod_or_fast, slots, - traits::Leaser, + traits::{Leaser, OnSwap}, BlockHashCount, BlockLength, SlowAdjustingFeeUpdate, }; -use scale_info::TypeInfo; -use sp_std::{cmp::Ordering, collections::btree_map::BTreeMap, prelude::*}; - use runtime_parachains::{ assigner_coretime as parachains_assigner_coretime, - assigner_on_demand as parachains_assigner_on_demand, - assigner_parachains as parachains_assigner_parachains, - configuration as parachains_configuration, coretime, disputes as parachains_disputes, + assigner_on_demand as parachains_assigner_on_demand, configuration as parachains_configuration, + coretime, disputes as parachains_disputes, disputes::slashing as parachains_slashing, dmp as parachains_dmp, hrmp as parachains_hrmp, inclusion as parachains_inclusion, inclusion::{AggregateMessageOrigin, UmpQueueId}, initializer as parachains_initializer, origin as parachains_origin, paras as parachains_paras, paras_inherent as parachains_paras_inherent, runtime_api_impl::{ - v7 as parachains_runtime_api_impl, vstaging as parachains_staging_runtime_api_impl, + v10 as parachains_runtime_api_impl, vstaging as vstaging_parachains_runtime_api_impl, }, scheduler as parachains_scheduler, session_info as parachains_session_info, shared as parachains_shared, }; - -use authority_discovery_primitives::AuthorityId as AuthorityDiscoveryId; -use beefy_primitives::{ - ecdsa_crypto::{AuthorityId as BeefyId, Signature as BeefySignature}, - mmr::{BeefyDataProvider, MmrLeafVersion}, +use scale_info::TypeInfo; +use sp_genesis_builder::PresetId; +use sp_std::{ + cmp::Ordering, + collections::{btree_map::BTreeMap, vec_deque::VecDeque}, + prelude::*, }; use frame_support::{ construct_runtime, derive_impl, - genesis_builder_helper::{build_config, create_default_config}, + genesis_builder_helper::{build_state, get_preset}, parameter_types, traits::{ fungible::HoldConsideration, Contains, EitherOf, EitherOfDiverse, EverythingBut, InstanceFilter, KeyOwnerProofSystem, LinearStoragePrice, PrivilegeCmp, ProcessMessage, ProcessMessageError, StorageMapShim, WithdrawReasons, }, - weights::{ConstantMultiplier, WeightMeter}, + weights::{ConstantMultiplier, WeightMeter, WeightToFee as _}, PalletId, }; use frame_system::{EnsureRoot, EnsureSigned}; use pallet_grandpa::{fg_primitives, AuthorityId as GrandpaId}; use pallet_identity::legacy::IdentityInfo; use pallet_session::historical as session_historical; -use pallet_transaction_payment::{CurrencyAdapter, FeeDetails, RuntimeDispatchInfo}; +use pallet_transaction_payment::{FeeDetails, FungibleAdapter, RuntimeDispatchInfo}; use sp_core::{ConstU128, OpaqueMetadata, H256}; use sp_runtime::{ create_runtime_str, generic, impl_opaque_keys, @@ -92,14 +93,16 @@ use sp_runtime::{ IdentityLookup, Keccak256, OpaqueKeys, SaturatedConversion, Verify, }, transaction_validity::{TransactionPriority, TransactionSource, TransactionValidity}, - ApplyExtrinsicResult, BoundToRuntimeAppPublic, FixedU128, KeyTypeId, Perbill, Percent, Permill, - RuntimeAppPublic, RuntimeDebug, + ApplyExtrinsicResult, FixedU128, KeyTypeId, Perbill, Percent, Permill, RuntimeDebug, }; use sp_staking::SessionIndex; #[cfg(any(feature = "std", test))] use sp_version::NativeVersion; use sp_version::RuntimeVersion; -use xcm::{latest::prelude::*, VersionedLocation}; +use xcm::{ + latest::prelude::*, IntoVersion, VersionedAssetId, VersionedAssets, VersionedLocation, + VersionedXcm, +}; use xcm_builder::PayOverXcm; pub use frame_system::Call as SystemCall; @@ -124,10 +127,12 @@ use governance::{ pallet_custom_origins, AuctionAdmin, Fellows, GeneralAdmin, LeaseAdmin, Treasurer, TreasurySpender, }; +use xcm_fee_payment_runtime_api::Error as XcmPaymentApiError; #[cfg(test)] mod tests; +mod genesis_config_presets; mod validator_manager; impl_runtime_weights!(rococo_runtime_constants); @@ -150,7 +155,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("rococo"), impl_name: create_runtime_str!("parity-rococo-v2.0"), authoring_version: 0, - spec_version: 1_006_002, + spec_version: 1_010_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 24, @@ -186,7 +191,7 @@ parameter_types! { pub const SS58Prefix: u8 = 42; } -#[derive_impl(frame_system::config_preludes::RelayChainDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::RelayChainDefaultConfig)] impl frame_system::Config for Runtime { type BaseCallFilter = EverythingBut; type BlockWeights = BlockWeights; @@ -217,7 +222,7 @@ pub struct OriginPrivilegeCmp; impl PrivilegeCmp for OriginPrivilegeCmp { fn cmp_privilege(left: &OriginCaller, right: &OriginCaller) -> Option { if left == right { - return Some(Ordering::Equal) + return Some(Ordering::Equal); } match (left, right) { @@ -325,7 +330,7 @@ parameter_types! { impl pallet_transaction_payment::Config for Runtime { type RuntimeEvent = RuntimeEvent; - type OnChargeTransaction = CurrencyAdapter>; + type OnChargeTransaction = FungibleAdapter>; type OperationalFeeMultiplier = OperationalFeeMultiplier; type WeightToFee = WeightToFee; type LengthToFee = ConstantMultiplier; @@ -347,46 +352,6 @@ impl pallet_authorship::Config for Runtime { type EventHandler = (); } -#[derive(Clone, Debug, PartialEq, Eq, Encode, Decode)] -pub struct OldSessionKeys { - pub grandpa: ::Public, - pub babe: ::Public, - pub im_online: pallet_im_online::sr25519::AuthorityId, - pub para_validator: ::Public, - pub para_assignment: ::Public, - pub authority_discovery: ::Public, - pub beefy: ::Public, -} - -impl OpaqueKeys for OldSessionKeys { - type KeyTypeIdProviders = (); - fn key_ids() -> &'static [KeyTypeId] { - &[ - <::Public>::ID, - <::Public>::ID, - sp_core::crypto::key_types::IM_ONLINE, - <::Public>::ID, - <::Public>::ID, - <::Public>::ID, - <::Public>::ID, - ] - } - fn get_raw(&self, i: KeyTypeId) -> &[u8] { - match i { - <::Public>::ID => self.grandpa.as_ref(), - <::Public>::ID => self.babe.as_ref(), - sp_core::crypto::key_types::IM_ONLINE => self.im_online.as_ref(), - <::Public>::ID => self.para_validator.as_ref(), - <::Public>::ID => - self.para_assignment.as_ref(), - <::Public>::ID => - self.authority_discovery.as_ref(), - <::Public>::ID => self.beefy.as_ref(), - _ => &[], - } - } -} - impl_opaque_keys! { pub struct SessionKeys { pub grandpa: Grandpa, @@ -398,18 +363,6 @@ impl_opaque_keys! { } } -// remove this when removing `OldSessionKeys` -fn transform_session_keys(_val: AccountId, old: OldSessionKeys) -> SessionKeys { - SessionKeys { - grandpa: old.grandpa, - babe: old.babe, - para_validator: old.para_validator, - para_assignment: old.para_assignment, - authority_discovery: old.authority_discovery, - beefy: old.beefy, - } -} - /// Special `ValidatorIdOf` implementation that is just returning the input as result. pub struct ValidatorIdOf; impl sp_runtime::traits::Convert> for ValidatorIdOf { @@ -984,6 +937,7 @@ impl pallet_message_queue::Config for Runtime { type HeapSize = MessageQueueHeapSize; type MaxStale = MessageQueueMaxStale; type ServiceWeight = MessageQueueServiceWeight; + type IdleMaxServiceWeight = MessageQueueServiceWeight; #[cfg(not(feature = "runtime-benchmarks"))] type MessageProcessor = MessageProcessor; #[cfg(feature = "runtime-benchmarks")] @@ -1038,8 +992,6 @@ impl parachains_assigner_on_demand::Config for Runtime { type WeightInfo = weights::runtime_parachains_assigner_on_demand::WeightInfo; } -impl parachains_assigner_parachains::Config for Runtime {} - impl parachains_assigner_coretime::Config for Runtime {} impl parachains_initializer::Config for Runtime { @@ -1081,7 +1033,7 @@ impl paras_registrar::Config for Runtime { type RuntimeOrigin = RuntimeOrigin; type RuntimeEvent = RuntimeEvent; type Currency = Balances; - type OnSwap = (Crowdloan, Slots); + type OnSwap = (Crowdloan, Slots, SwapLeases); type ParaDeposit = ParaDeposit; type DataDepositPerByte = DataDepositPerByte; type WeightInfo = weights::runtime_common_paras_registrar::WeightInfo; @@ -1202,6 +1154,8 @@ impl pallet_nis::Config for Runtime { type MaxIntakeWeight = MaxIntakeWeight; type ThawThrottle = ThawThrottle; type RuntimeHoldReason = RuntimeHoldReason; + #[cfg(feature = "runtime-benchmarks")] + type BenchmarkSetup = (); } parameter_types! { @@ -1245,9 +1199,11 @@ parameter_types! { pub struct ParaHeadsRootProvider; impl BeefyDataProvider for ParaHeadsRootProvider { fn extra_data() -> H256 { - let mut para_heads: Vec<(u32, Vec)> = Paras::parachains() + let mut para_heads: Vec<(u32, Vec)> = parachains_paras::Parachains::::get() .into_iter() - .filter_map(|id| Paras::para_head(&id).map(|head| (id.into(), head.0))) + .filter_map(|id| { + parachains_paras::Heads::::get(&id).map(|head| (id.into(), head.0)) + }) .collect(); para_heads.sort(); binary_merkle_tree::merkle_root::( @@ -1309,6 +1265,14 @@ impl pallet_asset_rate::Config for Runtime { type BenchmarkHelper = runtime_common::impls::benchmarks::AssetRateArguments; } +// Notify `coretime` pallet when a lease swap occurs +pub struct SwapLeases; +impl OnSwap for SwapLeases { + fn on_swap(one: ParaId, other: ParaId) { + coretime::Pallet::::on_legacy_lease_swap(one, other); + } +} + construct_runtime! { pub enum Runtime { @@ -1401,7 +1365,6 @@ construct_runtime! { ParasSlashing: parachains_slashing = 63, MessageQueue: pallet_message_queue = 64, OnDemandAssignmentProvider: parachains_assigner_on_demand = 66, - ParachainsAssignmentProvider: parachains_assigner_parachains = 67, CoretimeAssignmentProvider: parachains_assigner_coretime = 68, // Parachain Onboarding Pallets. Start indices at 70 to leave room. @@ -1480,20 +1443,18 @@ pub mod migrations { use frame_support::traits::LockIdentifier; use frame_system::pallet_prelude::BlockNumberFor; - #[cfg(feature = "try-runtime")] - use sp_core::crypto::ByteArray; pub struct GetLegacyLeaseImpl; impl coretime::migration::GetLegacyLease for GetLegacyLeaseImpl { fn get_parachain_lease_in_blocks(para: ParaId) -> Option { let now = frame_system::Pallet::::block_number(); - let lease = slots::Pallet::::lease(para); + let lease = slots::Leases::::get(para); if lease.is_empty() { - return None + return None; } // Lease not yet started, ignore: if lease.iter().any(Option::is_none) { - return None + return None; } let (index, _) = as Leaser>::lease_period_index(now)?; @@ -1508,7 +1469,6 @@ pub mod migrations { pub const PhragmenElectionPalletName: &'static str = "PhragmenElection"; pub const TechnicalMembershipPalletName: &'static str = "TechnicalMembership"; pub const TipsPalletName: &'static str = "Tips"; - pub const ImOnlinePalletName: &'static str = "ImOnline"; pub const PhragmenElectionPalletId: LockIdentifier = *b"phrelect"; } @@ -1545,79 +1505,6 @@ pub mod migrations { type PalletName = TipsPalletName; } - /// Upgrade Session keys to exclude `ImOnline` key. - /// When this is removed, should also remove `OldSessionKeys`. - pub struct UpgradeSessionKeys; - const UPGRADE_SESSION_KEYS_FROM_SPEC: u32 = 104000; - - impl frame_support::traits::OnRuntimeUpgrade for UpgradeSessionKeys { - #[cfg(feature = "try-runtime")] - fn pre_upgrade() -> Result, sp_runtime::TryRuntimeError> { - if System::last_runtime_upgrade_spec_version() > UPGRADE_SESSION_KEYS_FROM_SPEC { - log::warn!(target: "runtime::session_keys", "Skipping session keys migration pre-upgrade check due to spec version (already applied?)"); - return Ok(Vec::new()) - } - - log::info!(target: "runtime::session_keys", "Collecting pre-upgrade session keys state"); - let key_ids = SessionKeys::key_ids(); - frame_support::ensure!( - key_ids.into_iter().find(|&k| *k == sp_core::crypto::key_types::IM_ONLINE) == None, - "New session keys contain the ImOnline key that should have been removed", - ); - let storage_key = pallet_session::QueuedKeys::::hashed_key(); - let mut state: Vec = Vec::new(); - frame_support::storage::unhashed::get::>( - &storage_key, - ) - .ok_or::("Queued keys are not available".into())? - .into_iter() - .for_each(|(id, keys)| { - state.extend_from_slice(id.as_slice()); - for key_id in key_ids { - state.extend_from_slice(keys.get_raw(*key_id)); - } - }); - frame_support::ensure!(state.len() > 0, "Queued keys are not empty before upgrade"); - Ok(state) - } - - fn on_runtime_upgrade() -> Weight { - if System::last_runtime_upgrade_spec_version() > UPGRADE_SESSION_KEYS_FROM_SPEC { - log::info!("Skipping session keys upgrade: already applied"); - return ::DbWeight::get().reads(1) - } - log::trace!("Upgrading session keys"); - Session::upgrade_keys::(transform_session_keys); - Perbill::from_percent(50) * BlockWeights::get().max_block - } - - #[cfg(feature = "try-runtime")] - fn post_upgrade( - old_state: sp_std::vec::Vec, - ) -> Result<(), sp_runtime::TryRuntimeError> { - if System::last_runtime_upgrade_spec_version() > UPGRADE_SESSION_KEYS_FROM_SPEC { - log::warn!(target: "runtime::session_keys", "Skipping session keys migration post-upgrade check due to spec version (already applied?)"); - return Ok(()) - } - - let key_ids = SessionKeys::key_ids(); - let mut new_state: Vec = Vec::new(); - pallet_session::QueuedKeys::::get().into_iter().for_each(|(id, keys)| { - new_state.extend_from_slice(id.as_slice()); - for key_id in key_ids { - new_state.extend_from_slice(keys.get_raw(*key_id)); - } - }); - frame_support::ensure!(new_state.len() > 0, "Queued keys are not empty after upgrade"); - frame_support::ensure!( - old_state == new_state, - "Pre-upgrade and post-upgrade keys do not match!" - ); - log::info!(target: "runtime::session_keys", "Session keys migrated successfully"); - Ok(()) - } - } - // We don't have a limit in the Relay Chain. const IDENTITY_MIGRATION_KEY_LIMIT: u64 = u64::MAX; @@ -1651,17 +1538,18 @@ pub mod migrations { pallet_grandpa::migrations::MigrateV4ToV5, parachains_configuration::migration::v10::MigrateToV10, - // Upgrade `SessionKeys` to exclude `ImOnline` - UpgradeSessionKeys, - - // Remove `im-online` pallet on-chain storage - frame_support::migrations::RemovePallet::DbWeight>, - // Migrate Identity pallet for Usernames pallet_identity::migration::versioned::V0ToV1, parachains_configuration::migration::v11::MigrateToV11, // This needs to come after the `parachains_configuration` above as we are reading the configuration. coretime::migration::MigrateToCoretime, + parachains_configuration::migration::v12::MigrateToV12, + parachains_assigner_on_demand::migration::MigrateV0ToV1, + + // permanent + pallet_xcm::migration::MigrateToLatestXcmVersion, + + parachains_inclusion::migration::MigrateToV1, ); } @@ -1769,11 +1657,42 @@ sp_api::impl_runtime_apis! { Executive::execute_block(block); } - fn initialize_block(header: &::Header) { + fn initialize_block(header: &::Header) -> sp_runtime::ExtrinsicInclusionMode { Executive::initialize_block(header) } } + impl xcm_fee_payment_runtime_api::XcmPaymentApi for Runtime { + fn query_acceptable_payment_assets(xcm_version: xcm::Version) -> Result, XcmPaymentApiError> { + if !matches!(xcm_version, 3 | 4) { + return Err(XcmPaymentApiError::UnhandledXcmVersion); + } + Ok([VersionedAssetId::V4(xcm_config::TokenLocation::get().into())] + .into_iter() + .filter_map(|asset| asset.into_version(xcm_version).ok()) + .collect()) + } + + fn query_weight_to_asset_fee(weight: Weight, asset: VersionedAssetId) -> Result { + let local_asset = VersionedAssetId::V4(xcm_config::TokenLocation::get().into()); + let asset = asset + .into_version(4) + .map_err(|_| XcmPaymentApiError::VersionedConversionFailed)?; + + if asset != local_asset { return Err(XcmPaymentApiError::AssetNotFound); } + + Ok(WeightToFee::weight_to_fee(&weight)) + } + + fn query_xcm_weight(message: VersionedXcm<()>) -> Result { + XcmPallet::query_xcm_weight(message) + } + + fn query_delivery_fees(destination: VersionedLocation, message: VersionedXcm<()>) -> Result { + XcmPallet::query_delivery_fees(destination, message) + } + } + impl sp_api::Metadata for Runtime { fn metadata() -> OpaqueMetadata { OpaqueMetadata::new(Runtime::metadata().into()) @@ -1825,7 +1744,7 @@ sp_api::impl_runtime_apis! { } } - #[api_version(10)] + #[api_version(11)] impl primitives::runtime_api::ParachainHost for Runtime { fn validators() -> Vec { parachains_runtime_api_impl::validators::() @@ -1970,22 +1889,26 @@ sp_api::impl_runtime_apis! { } fn approval_voting_params() -> ApprovalVotingParams { - parachains_staging_runtime_api_impl::approval_voting_params::() + parachains_runtime_api_impl::approval_voting_params::() } fn disabled_validators() -> Vec { - parachains_staging_runtime_api_impl::disabled_validators::() + parachains_runtime_api_impl::disabled_validators::() } fn node_features() -> NodeFeatures { - parachains_staging_runtime_api_impl::node_features::() + parachains_runtime_api_impl::node_features::() + } + + fn claim_queue() -> BTreeMap> { + vstaging_parachains_runtime_api_impl::claim_queue::() } } #[api_version(3)] impl beefy_primitives::BeefyApi for Runtime { fn beefy_genesis() -> Option { - Beefy::genesis_block() + pallet_beefy::GenesisBlock::::get() } fn validator_set() -> Option> { @@ -2023,11 +1946,11 @@ sp_api::impl_runtime_apis! { #[api_version(2)] impl mmr::MmrApi for Runtime { fn mmr_root() -> Result { - Ok(Mmr::mmr_root()) + Ok(pallet_mmr::RootHash::::get()) } fn mmr_leaf_count() -> Result { - Ok(Mmr::mmr_leaves()) + Ok(pallet_mmr::NumberOfLeaves::::get()) } fn generate_proof( @@ -2266,12 +2189,30 @@ sp_api::impl_runtime_apis! { TokenLocation::get(), ExistentialDeposit::get() ).into()); - pub ToParachain: ParaId = rococo_runtime_constants::system_parachain::ASSET_HUB_ID.into(); + pub AssetHubParaId: ParaId = rococo_runtime_constants::system_parachain::ASSET_HUB_ID.into(); + pub const RandomParaId: ParaId = ParaId::new(43211234); } impl frame_system_benchmarking::Config for Runtime {} impl frame_benchmarking::baseline::Config for Runtime {} impl pallet_xcm::benchmarking::Config for Runtime { + type DeliveryHelper = ( + runtime_common::xcm_sender::ToParachainDeliveryHelper< + XcmConfig, + ExistentialDepositAsset, + xcm_config::PriceForChildParachainDelivery, + AssetHubParaId, + (), + >, + runtime_common::xcm_sender::ToParachainDeliveryHelper< + XcmConfig, + ExistentialDepositAsset, + xcm_config::PriceForChildParachainDelivery, + RandomParaId, + (), + > + ); + fn reachable_dest() -> Option { Some(crate::xcm_config::AssetHub::get()) } @@ -2280,7 +2221,7 @@ sp_api::impl_runtime_apis! { // Relay/native token can be teleported to/from AH. Some(( Asset { - fun: Fungible(EXISTENTIAL_DEPOSIT), + fun: Fungible(ExistentialDeposit::get()), id: AssetId(Here.into()) }, crate::xcm_config::AssetHub::get(), @@ -2291,10 +2232,10 @@ sp_api::impl_runtime_apis! { // Relay can reserve transfer native token to some random parachain. Some(( Asset { - fun: Fungible(EXISTENTIAL_DEPOSIT), + fun: Fungible(ExistentialDeposit::get()), id: AssetId(Here.into()) }, - Parachain(43211234).into(), + Parachain(RandomParaId::get().into()).into(), )) } @@ -2311,6 +2252,13 @@ sp_api::impl_runtime_apis! { dest ) } + + fn get_asset() -> Asset { + Asset { + id: AssetId(Location::here()), + fun: Fungible(ExistentialDeposit::get()), + } + } } impl pallet_xcm_benchmarks::Config for Runtime { type XcmConfig = XcmConfig; @@ -2319,7 +2267,7 @@ sp_api::impl_runtime_apis! { XcmConfig, ExistentialDepositAsset, xcm_config::PriceForChildParachainDelivery, - ToParachain, + AssetHubParaId, (), >; fn valid_destination() -> Result { @@ -2428,12 +2376,22 @@ sp_api::impl_runtime_apis! { } impl sp_genesis_builder::GenesisBuilder for Runtime { - fn create_default_config() -> Vec { - create_default_config::() + fn build_state(config: Vec) -> sp_genesis_builder::Result { + build_state::(config) + } + + fn get_preset(id: &Option) -> Option> { + get_preset::(id, &genesis_config_presets::get_preset) } - fn build_config(config: Vec) -> sp_genesis_builder::Result { - build_config::(config) + fn preset_names() -> Vec { + vec![ + PresetId::from("local_testnet"), + PresetId::from("development"), + PresetId::from("staging_testnet"), + PresetId::from("wococo_local_testnet"), + PresetId::from("versi_local_testnet"), + ] } } } @@ -2450,7 +2408,7 @@ mod remote_tests { #[tokio::test] async fn run_migrations() { if var("RUN_MIGRATION_TESTS").is_err() { - return + return; } sp_tracing::try_init_simple(); diff --git a/polkadot/runtime/rococo/src/weights/mod.rs b/polkadot/runtime/rococo/src/weights/mod.rs index 0ba21ccf322d3fcdc63ac83261f5d4c3338de4e2..7328dca9393693e335b49dc317d6754f9fd6e840 100644 --- a/polkadot/runtime/rococo/src/weights/mod.rs +++ b/polkadot/runtime/rococo/src/weights/mod.rs @@ -23,7 +23,6 @@ pub mod pallet_bounties; pub mod pallet_child_bounties; pub mod pallet_conviction_voting; pub mod pallet_identity; -pub mod pallet_im_online; pub mod pallet_indices; pub mod pallet_message_queue; pub mod pallet_multisig; diff --git a/polkadot/runtime/rococo/src/weights/pallet_im_online.rs b/polkadot/runtime/rococo/src/weights/pallet_im_online.rs deleted file mode 100644 index b866426de52a3abc7608f96bb192a1ae4fbb1d90..0000000000000000000000000000000000000000 --- a/polkadot/runtime/rococo/src/weights/pallet_im_online.rs +++ /dev/null @@ -1,76 +0,0 @@ -// Copyright (C) Parity Technologies (UK) Ltd. -// This file is part of Polkadot. - -// Polkadot is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Polkadot is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Polkadot. If not, see . - -//! Autogenerated weights for `pallet_im_online` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `build-host`, CPU: `AMD EPYC 7601 32-Core Processor` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("rococo-dev"), DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot -// benchmark -// pallet -// --chain=rococo-dev -// --steps=50 -// --repeat=20 -// --pallet=pallet_im_online -// --extrinsic=* -// --execution=wasm -// --wasm-execution=compiled -// --header=./file_header.txt -// --output=./runtime/rococo/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `pallet_im_online`. -pub struct WeightInfo(PhantomData); -impl pallet_im_online::WeightInfo for WeightInfo { - /// Storage: Session Validators (r:1 w:0) - /// Proof Skipped: Session Validators (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Session CurrentIndex (r:1 w:0) - /// Proof Skipped: Session CurrentIndex (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ImOnline Keys (r:1 w:0) - /// Proof: ImOnline Keys (max_values: Some(1), max_size: Some(320002), added: 320497, mode: MaxEncodedLen) - /// Storage: unknown `0x39e295d143ed41353167609a3d816584` (r:1 w:0) - /// Proof Skipped: unknown `0x39e295d143ed41353167609a3d816584` (r:1 w:0) - /// Storage: ImOnline ReceivedHeartbeats (r:1 w:1) - /// Proof: ImOnline ReceivedHeartbeats (max_values: None, max_size: Some(1028), added: 3503, mode: MaxEncodedLen) - /// Storage: ImOnline AuthoredBlocks (r:1 w:0) - /// Proof: ImOnline AuthoredBlocks (max_values: None, max_size: Some(56), added: 2531, mode: MaxEncodedLen) - /// The range of component `k` is `[1, 1000]`. - fn validate_unsigned_and_then_heartbeat(k: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `394 + k * (32 ±0)` - // Estimated: `321487 + k * (1761 ±0)` - // Minimum execution time: 132_910_000 picoseconds. - Weight::from_parts(149_854_501, 0) - .saturating_add(Weight::from_parts(0, 321487)) - // Standard Error: 3_317 - .saturating_add(Weight::from_parts(61_141, 0).saturating_mul(k.into())) - .saturating_add(T::DbWeight::get().reads(5)) - .saturating_add(T::DbWeight::get().writes(1)) - .saturating_add(Weight::from_parts(0, 1761).saturating_mul(k.into())) - } -} diff --git a/polkadot/runtime/rococo/src/weights/pallet_scheduler.rs b/polkadot/runtime/rococo/src/weights/pallet_scheduler.rs index e4732a2d17dca5180a8e07d5cddd19acd55f1b76..0f36dbd384df87d5a90c2a11392923e7ae8633aa 100644 --- a/polkadot/runtime/rococo/src/weights/pallet_scheduler.rs +++ b/polkadot/runtime/rococo/src/weights/pallet_scheduler.rs @@ -17,24 +17,25 @@ //! Autogenerated weights for `pallet_scheduler` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-26, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2024-01-25, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm5`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("rococo-dev"), DB CACHE: 1024 +//! HOSTNAME: `runner-grjcggob-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("rococo-dev")`, DB CACHE: 1024 // Executed Command: -// ./target/production/polkadot +// target/production/polkadot // benchmark // pallet -// --chain=rococo-dev // --steps=50 // --repeat=20 -// --pallet=pallet_scheduler // --extrinsic=* -// --execution=wasm // --wasm-execution=compiled -// --header=./file_header.txt -// --output=./runtime/rococo/src/weights/ +// --heap-pages=4096 +// --json-file=/builds/parity/mirrors/polkadot-sdk/.git/.artifacts/bench.json +// --pallet=pallet_scheduler +// --chain=rococo-dev +// --header=./polkadot/file_header.txt +// --output=./polkadot/runtime/rococo/src/weights/ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -47,30 +48,30 @@ use core::marker::PhantomData; /// Weight functions for `pallet_scheduler`. pub struct WeightInfo(PhantomData); impl pallet_scheduler::WeightInfo for WeightInfo { - /// Storage: Scheduler IncompleteSince (r:1 w:1) - /// Proof: Scheduler IncompleteSince (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + /// Storage: `Scheduler::IncompleteSince` (r:1 w:1) + /// Proof: `Scheduler::IncompleteSince` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) fn service_agendas_base() -> Weight { // Proof Size summary in bytes: - // Measured: `69` + // Measured: `68` // Estimated: `1489` - // Minimum execution time: 4_741_000 picoseconds. - Weight::from_parts(4_939_000, 0) + // Minimum execution time: 2_869_000 picoseconds. + Weight::from_parts(3_109_000, 0) .saturating_add(Weight::from_parts(0, 1489)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } - /// Storage: Scheduler Agenda (r:1 w:1) - /// Proof: Scheduler Agenda (max_values: None, max_size: Some(38963), added: 41438, mode: MaxEncodedLen) + /// Storage: `Scheduler::Agenda` (r:1 w:1) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(38963), added: 41438, mode: `MaxEncodedLen`) /// The range of component `s` is `[0, 50]`. fn service_agenda_base(s: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `116 + s * (177 ±0)` + // Measured: `115 + s * (177 ±0)` // Estimated: `42428` - // Minimum execution time: 4_504_000 picoseconds. - Weight::from_parts(7_569_333, 0) + // Minimum execution time: 3_326_000 picoseconds. + Weight::from_parts(5_818_563, 0) .saturating_add(Weight::from_parts(0, 42428)) - // Standard Error: 1_818 - .saturating_add(Weight::from_parts(771_180, 0).saturating_mul(s.into())) + // Standard Error: 1_261 + .saturating_add(Weight::from_parts(336_446, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -78,36 +79,38 @@ impl pallet_scheduler::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 5_709_000 picoseconds. - Weight::from_parts(5_929_000, 0) + // Minimum execution time: 3_007_000 picoseconds. + Weight::from_parts(3_197_000, 0) .saturating_add(Weight::from_parts(0, 0)) } - /// Storage: Preimage PreimageFor (r:1 w:1) - /// Proof: Preimage PreimageFor (max_values: None, max_size: Some(4194344), added: 4196819, mode: Measured) - /// Storage: Preimage StatusFor (r:1 w:1) - /// Proof: Preimage StatusFor (max_values: None, max_size: Some(91), added: 2566, mode: MaxEncodedLen) + /// Storage: `Preimage::PreimageFor` (r:1 w:1) + /// Proof: `Preimage::PreimageFor` (`max_values`: None, `max_size`: Some(4194344), added: 4196819, mode: `Measured`) + /// Storage: `Preimage::StatusFor` (r:1 w:0) + /// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) + /// Storage: `Preimage::RequestStatusFor` (r:1 w:1) + /// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) /// The range of component `s` is `[128, 4194304]`. fn service_task_fetched(s: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `251 + s * (1 ±0)` // Estimated: `3716 + s * (1 ±0)` - // Minimum execution time: 20_710_000 picoseconds. - Weight::from_parts(20_918_000, 0) + // Minimum execution time: 16_590_000 picoseconds. + Weight::from_parts(16_869_000, 0) .saturating_add(Weight::from_parts(0, 3716)) // Standard Error: 9 - .saturating_add(Weight::from_parts(1_257, 0).saturating_mul(s.into())) - .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(Weight::from_parts(1_308, 0).saturating_mul(s.into())) + .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(2)) .saturating_add(Weight::from_parts(0, 1).saturating_mul(s.into())) } - /// Storage: Scheduler Lookup (r:0 w:1) - /// Proof: Scheduler Lookup (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) + /// Storage: `Scheduler::Lookup` (r:0 w:1) + /// Proof: `Scheduler::Lookup` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) fn service_task_named() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_262_000 picoseconds. - Weight::from_parts(7_412_000, 0) + // Minimum execution time: 4_320_000 picoseconds. + Weight::from_parts(4_594_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -115,90 +118,173 @@ impl pallet_scheduler::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 5_774_000 picoseconds. - Weight::from_parts(5_887_000, 0) + // Minimum execution time: 2_956_000 picoseconds. + Weight::from_parts(3_216_000, 0) .saturating_add(Weight::from_parts(0, 0)) } fn execute_dispatch_signed() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_777_000 picoseconds. - Weight::from_parts(2_865_000, 0) + // Minimum execution time: 1_824_000 picoseconds. + Weight::from_parts(1_929_000, 0) .saturating_add(Weight::from_parts(0, 0)) } fn execute_dispatch_unsigned() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_739_000 picoseconds. - Weight::from_parts(2_827_000, 0) + // Minimum execution time: 1_749_000 picoseconds. + Weight::from_parts(1_916_000, 0) .saturating_add(Weight::from_parts(0, 0)) } - /// Storage: Scheduler Agenda (r:1 w:1) - /// Proof: Scheduler Agenda (max_values: None, max_size: Some(38963), added: 41438, mode: MaxEncodedLen) + /// Storage: `Scheduler::Agenda` (r:1 w:1) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(38963), added: 41438, mode: `MaxEncodedLen`) /// The range of component `s` is `[0, 49]`. fn schedule(s: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `116 + s * (177 ±0)` + // Measured: `115 + s * (177 ±0)` // Estimated: `42428` - // Minimum execution time: 14_788_000 picoseconds. - Weight::from_parts(17_705_748, 0) + // Minimum execution time: 9_086_000 picoseconds. + Weight::from_parts(11_733_696, 0) .saturating_add(Weight::from_parts(0, 42428)) - // Standard Error: 1_703 - .saturating_add(Weight::from_parts(760_991, 0).saturating_mul(s.into())) + // Standard Error: 1_362 + .saturating_add(Weight::from_parts(375_266, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } - /// Storage: Scheduler Agenda (r:1 w:1) - /// Proof: Scheduler Agenda (max_values: None, max_size: Some(38963), added: 41438, mode: MaxEncodedLen) - /// Storage: Scheduler Lookup (r:0 w:1) - /// Proof: Scheduler Lookup (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) + /// Storage: `Scheduler::Agenda` (r:1 w:1) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(38963), added: 41438, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Lookup` (r:0 w:1) + /// Proof: `Scheduler::Lookup` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) /// The range of component `s` is `[1, 50]`. fn cancel(s: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `116 + s * (177 ±0)` + // Measured: `115 + s * (177 ±0)` // Estimated: `42428` - // Minimum execution time: 18_716_000 picoseconds. - Weight::from_parts(18_220_022, 0) + // Minimum execution time: 12_716_000 picoseconds. + Weight::from_parts(12_529_180, 0) .saturating_add(Weight::from_parts(0, 42428)) - // Standard Error: 1_508 - .saturating_add(Weight::from_parts(1_357_835, 0).saturating_mul(s.into())) + // Standard Error: 867 + .saturating_add(Weight::from_parts(548_188, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) } - /// Storage: Scheduler Lookup (r:1 w:1) - /// Proof: Scheduler Lookup (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) - /// Storage: Scheduler Agenda (r:1 w:1) - /// Proof: Scheduler Agenda (max_values: None, max_size: Some(38963), added: 41438, mode: MaxEncodedLen) + /// Storage: `Scheduler::Lookup` (r:1 w:1) + /// Proof: `Scheduler::Lookup` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Agenda` (r:1 w:1) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(38963), added: 41438, mode: `MaxEncodedLen`) /// The range of component `s` is `[0, 49]`. fn schedule_named(s: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `293 + s * (185 ±0)` + // Measured: `292 + s * (185 ±0)` // Estimated: `42428` - // Minimum execution time: 17_719_000 picoseconds. - Weight::from_parts(21_657_806, 0) + // Minimum execution time: 12_053_000 picoseconds. + Weight::from_parts(15_358_056, 0) .saturating_add(Weight::from_parts(0, 42428)) - // Standard Error: 2_645 - .saturating_add(Weight::from_parts(794_184, 0).saturating_mul(s.into())) + // Standard Error: 3_176 + .saturating_add(Weight::from_parts(421_589, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } - /// Storage: Scheduler Lookup (r:1 w:1) - /// Proof: Scheduler Lookup (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) - /// Storage: Scheduler Agenda (r:1 w:1) - /// Proof: Scheduler Agenda (max_values: None, max_size: Some(38963), added: 41438, mode: MaxEncodedLen) + /// Storage: `Scheduler::Lookup` (r:1 w:1) + /// Proof: `Scheduler::Lookup` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Agenda` (r:1 w:1) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(38963), added: 41438, mode: `MaxEncodedLen`) /// The range of component `s` is `[1, 50]`. fn cancel_named(s: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `319 + s * (185 ±0)` + // Measured: `318 + s * (185 ±0)` // Estimated: `42428` - // Minimum execution time: 20_225_000 picoseconds. - Weight::from_parts(20_494_405, 0) + // Minimum execution time: 14_803_000 picoseconds. + Weight::from_parts(15_805_714, 0) .saturating_add(Weight::from_parts(0, 42428)) - // Standard Error: 1_890 - .saturating_add(Weight::from_parts(1_379_025, 0).saturating_mul(s.into())) + // Standard Error: 2_597 + .saturating_add(Weight::from_parts(611_053, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } + /// Storage: `Scheduler::Retries` (r:1 w:2) + /// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Agenda` (r:1 w:1) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(38963), added: 41438, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Lookup` (r:0 w:1) + /// Proof: `Scheduler::Lookup` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) + /// The range of component `s` is `[1, 50]`. + fn schedule_retry(s: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `196` + // Estimated: `42428` + // Minimum execution time: 13_156_000 picoseconds. + Weight::from_parts(13_801_287, 0) + .saturating_add(Weight::from_parts(0, 42428)) + // Standard Error: 568 + .saturating_add(Weight::from_parts(35_441, 0).saturating_mul(s.into())) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(4)) + } + /// Storage: `Scheduler::Agenda` (r:1 w:0) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(38963), added: 41438, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Retries` (r:0 w:1) + /// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`) + /// The range of component `s` is `[1, 50]`. + fn set_retry() -> Weight { + // Proof Size summary in bytes: + // Measured: `115 + s * (177 ±0)` + // Estimated: `42428` + // Minimum execution time: 7_912_000 picoseconds. + Weight::from_parts(8_081_460, 0) + .saturating_add(Weight::from_parts(0, 42428)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `Scheduler::Lookup` (r:1 w:0) + /// Proof: `Scheduler::Lookup` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Agenda` (r:1 w:0) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(38963), added: 41438, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Retries` (r:0 w:1) + /// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`) + /// The range of component `s` is `[1, 50]`. + fn set_retry_named() -> Weight { + // Proof Size summary in bytes: + // Measured: `324 + s * (185 ±0)` + // Estimated: `42428` + // Minimum execution time: 10_673_000 picoseconds. + Weight::from_parts(12_212_185, 0) + .saturating_add(Weight::from_parts(0, 42428)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `Scheduler::Agenda` (r:1 w:0) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(38963), added: 41438, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Retries` (r:0 w:1) + /// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`) + /// The range of component `s` is `[1, 50]`. + fn cancel_retry() -> Weight { + // Proof Size summary in bytes: + // Measured: `115 + s * (177 ±0)` + // Estimated: `42428` + // Minimum execution time: 7_912_000 picoseconds. + Weight::from_parts(8_081_460, 0) + .saturating_add(Weight::from_parts(0, 42428)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `Scheduler::Lookup` (r:1 w:0) + /// Proof: `Scheduler::Lookup` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Agenda` (r:1 w:0) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(38963), added: 41438, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Retries` (r:0 w:1) + /// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`) + /// The range of component `s` is `[1, 50]`. + fn cancel_retry_named() -> Weight { + // Proof Size summary in bytes: + // Measured: `324 + s * (185 ±0)` + // Estimated: `42428` + // Minimum execution time: 10_673_000 picoseconds. + Weight::from_parts(12_212_185, 0) + .saturating_add(Weight::from_parts(0, 42428)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(1)) + } } diff --git a/polkadot/runtime/rococo/src/weights/pallet_xcm.rs b/polkadot/runtime/rococo/src/weights/pallet_xcm.rs index 177407ef7088b5c9bdcc460f36cb7d6485743a71..42972baa1c830baa820fc5c72b35f346daaf27d0 100644 --- a/polkadot/runtime/rococo/src/weights/pallet_xcm.rs +++ b/polkadot/runtime/rococo/src/weights/pallet_xcm.rs @@ -16,10 +16,10 @@ //! Autogenerated weights for `pallet_xcm` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-11-07, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-03-21, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-yprdrvc7-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! HOSTNAME: `runner-h2rr8wx7-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("rococo-dev")`, DB CACHE: 1024 // Executed Command: @@ -48,10 +48,6 @@ use core::marker::PhantomData; /// Weight functions for `pallet_xcm`. pub struct WeightInfo(PhantomData); impl pallet_xcm::WeightInfo for WeightInfo { - fn transfer_assets() -> Weight { - // TODO: run benchmarks - Weight::zero() - } /// Storage: `Dmp::DeliveryFeeFactor` (r:1 w:0) /// Proof: `Dmp::DeliveryFeeFactor` (`max_values`: None, `max_size`: None, mode: `Measured`) /// Storage: `XcmPallet::SupportedVersion` (r:1 w:0) @@ -62,36 +58,106 @@ impl pallet_xcm::WeightInfo for WeightInfo { /// Proof: `Dmp::DownwardMessageQueueHeads` (`max_values`: None, `max_size`: None, mode: `Measured`) fn send() -> Weight { // Proof Size summary in bytes: - // Measured: `142` - // Estimated: `3607` - // Minimum execution time: 27_328_000 picoseconds. - Weight::from_parts(27_976_000, 0) - .saturating_add(Weight::from_parts(0, 3607)) + // Measured: `180` + // Estimated: `3645` + // Minimum execution time: 24_724_000 picoseconds. + Weight::from_parts(25_615_000, 0) + .saturating_add(Weight::from_parts(0, 3645)) + .saturating_add(T::DbWeight::get().reads(4)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: `Dmp::DeliveryFeeFactor` (r:1 w:0) + /// Proof: `Dmp::DeliveryFeeFactor` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `XcmPallet::SupportedVersion` (r:1 w:0) + /// Proof: `XcmPallet::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Dmp::DownwardMessageQueues` (r:1 w:1) + /// Proof: `Dmp::DownwardMessageQueues` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Dmp::DownwardMessageQueueHeads` (r:1 w:1) + /// Proof: `Dmp::DownwardMessageQueueHeads` (`max_values`: None, `max_size`: None, mode: `Measured`) + fn send_blob() -> Weight { + // Proof Size summary in bytes: + // Measured: `180` + // Estimated: `3645` + // Minimum execution time: 24_709_000 picoseconds. + Weight::from_parts(25_326_000, 0) + .saturating_add(Weight::from_parts(0, 3645)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) } + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `Dmp::DeliveryFeeFactor` (r:1 w:0) + /// Proof: `Dmp::DeliveryFeeFactor` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `XcmPallet::SupportedVersion` (r:1 w:0) + /// Proof: `XcmPallet::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Dmp::DownwardMessageQueues` (r:1 w:1) + /// Proof: `Dmp::DownwardMessageQueues` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Dmp::DownwardMessageQueueHeads` (r:1 w:1) + /// Proof: `Dmp::DownwardMessageQueueHeads` (`max_values`: None, `max_size`: None, mode: `Measured`) fn teleport_assets() -> Weight { // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 16_280_000 picoseconds. - Weight::from_parts(16_904_000, 0) - .saturating_add(Weight::from_parts(0, 0)) + // Measured: `180` + // Estimated: `3645` + // Minimum execution time: 106_600_000 picoseconds. + Weight::from_parts(110_781_000, 0) + .saturating_add(Weight::from_parts(0, 3645)) + .saturating_add(T::DbWeight::get().reads(5)) + .saturating_add(T::DbWeight::get().writes(3)) } + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `Dmp::DeliveryFeeFactor` (r:1 w:0) + /// Proof: `Dmp::DeliveryFeeFactor` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `XcmPallet::SupportedVersion` (r:1 w:0) + /// Proof: `XcmPallet::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Dmp::DownwardMessageQueues` (r:1 w:1) + /// Proof: `Dmp::DownwardMessageQueues` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Dmp::DownwardMessageQueueHeads` (r:1 w:1) + /// Proof: `Dmp::DownwardMessageQueueHeads` (`max_values`: None, `max_size`: None, mode: `Measured`) fn reserve_transfer_assets() -> Weight { + // Proof Size summary in bytes: + // Measured: `232` + // Estimated: `3697` + // Minimum execution time: 103_030_000 picoseconds. + Weight::from_parts(106_018_000, 0) + .saturating_add(Weight::from_parts(0, 3697)) + .saturating_add(T::DbWeight::get().reads(5)) + .saturating_add(T::DbWeight::get().writes(3)) + } + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `Dmp::DeliveryFeeFactor` (r:1 w:0) + /// Proof: `Dmp::DeliveryFeeFactor` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `XcmPallet::SupportedVersion` (r:1 w:0) + /// Proof: `XcmPallet::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Dmp::DownwardMessageQueues` (r:1 w:1) + /// Proof: `Dmp::DownwardMessageQueues` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Dmp::DownwardMessageQueueHeads` (r:1 w:1) + /// Proof: `Dmp::DownwardMessageQueueHeads` (`max_values`: None, `max_size`: None, mode: `Measured`) + fn transfer_assets() -> Weight { + // Proof Size summary in bytes: + // Measured: `180` + // Estimated: `3645` + // Minimum execution time: 107_017_000 picoseconds. + Weight::from_parts(109_214_000, 0) + .saturating_add(Weight::from_parts(0, 3645)) + .saturating_add(T::DbWeight::get().reads(5)) + .saturating_add(T::DbWeight::get().writes(3)) + } + fn execute() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 15_869_000 picoseconds. - Weight::from_parts(16_264_000, 0) + // Minimum execution time: 6_864_000 picoseconds. + Weight::from_parts(7_135_000, 0) .saturating_add(Weight::from_parts(0, 0)) } - fn execute() -> Weight { + fn execute_blob() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 6_923_000 picoseconds. - Weight::from_parts(7_432_000, 0) + // Minimum execution time: 6_955_000 picoseconds. + Weight::from_parts(7_165_000, 0) .saturating_add(Weight::from_parts(0, 0)) } /// Storage: `XcmPallet::SupportedVersion` (r:0 w:1) @@ -100,8 +166,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_333_000 picoseconds. - Weight::from_parts(7_566_000, 0) + // Minimum execution time: 6_827_000 picoseconds. + Weight::from_parts(7_211_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -109,8 +175,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_219_000 picoseconds. - Weight::from_parts(2_375_000, 0) + // Minimum execution time: 1_788_000 picoseconds. + Weight::from_parts(2_021_000, 0) .saturating_add(Weight::from_parts(0, 0)) } /// Storage: `XcmPallet::VersionNotifiers` (r:1 w:1) @@ -129,11 +195,11 @@ impl pallet_xcm::WeightInfo for WeightInfo { /// Proof: `XcmPallet::Queries` (`max_values`: None, `max_size`: None, mode: `Measured`) fn force_subscribe_version_notify() -> Weight { // Proof Size summary in bytes: - // Measured: `142` - // Estimated: `3607` - // Minimum execution time: 30_650_000 picoseconds. - Weight::from_parts(31_683_000, 0) - .saturating_add(Weight::from_parts(0, 3607)) + // Measured: `180` + // Estimated: `3645` + // Minimum execution time: 30_627_000 picoseconds. + Weight::from_parts(31_350_000, 0) + .saturating_add(Weight::from_parts(0, 3645)) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(5)) } @@ -151,11 +217,11 @@ impl pallet_xcm::WeightInfo for WeightInfo { /// Proof: `XcmPallet::Queries` (`max_values`: None, `max_size`: None, mode: `Measured`) fn force_unsubscribe_version_notify() -> Weight { // Proof Size summary in bytes: - // Measured: `322` - // Estimated: `3787` - // Minimum execution time: 37_666_000 picoseconds. - Weight::from_parts(38_920_000, 0) - .saturating_add(Weight::from_parts(0, 3787)) + // Measured: `360` + // Estimated: `3825` + // Minimum execution time: 36_688_000 picoseconds. + Weight::from_parts(37_345_000, 0) + .saturating_add(Weight::from_parts(0, 3825)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -165,45 +231,45 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_244_000 picoseconds. - Weight::from_parts(2_425_000, 0) + // Minimum execution time: 1_829_000 picoseconds. + Weight::from_parts(1_986_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } - /// Storage: `XcmPallet::SupportedVersion` (r:4 w:2) + /// Storage: `XcmPallet::SupportedVersion` (r:5 w:2) /// Proof: `XcmPallet::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) fn migrate_supported_version() -> Weight { // Proof Size summary in bytes: - // Measured: `26` - // Estimated: `10916` - // Minimum execution time: 14_710_000 picoseconds. - Weight::from_parts(15_156_000, 0) - .saturating_add(Weight::from_parts(0, 10916)) - .saturating_add(T::DbWeight::get().reads(4)) + // Measured: `22` + // Estimated: `13387` + // Minimum execution time: 16_104_000 picoseconds. + Weight::from_parts(16_464_000, 0) + .saturating_add(Weight::from_parts(0, 13387)) + .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) } - /// Storage: `XcmPallet::VersionNotifiers` (r:4 w:2) + /// Storage: `XcmPallet::VersionNotifiers` (r:5 w:2) /// Proof: `XcmPallet::VersionNotifiers` (`max_values`: None, `max_size`: None, mode: `Measured`) fn migrate_version_notifiers() -> Weight { // Proof Size summary in bytes: - // Measured: `30` - // Estimated: `10920` - // Minimum execution time: 14_630_000 picoseconds. - Weight::from_parts(15_290_000, 0) - .saturating_add(Weight::from_parts(0, 10920)) - .saturating_add(T::DbWeight::get().reads(4)) + // Measured: `26` + // Estimated: `13391` + // Minimum execution time: 16_267_000 picoseconds. + Weight::from_parts(16_675_000, 0) + .saturating_add(Weight::from_parts(0, 13391)) + .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) } - /// Storage: `XcmPallet::VersionNotifyTargets` (r:5 w:0) + /// Storage: `XcmPallet::VersionNotifyTargets` (r:6 w:0) /// Proof: `XcmPallet::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) fn already_notified_target() -> Weight { // Proof Size summary in bytes: // Measured: `40` - // Estimated: `13405` - // Minimum execution time: 16_686_000 picoseconds. - Weight::from_parts(17_332_000, 0) - .saturating_add(Weight::from_parts(0, 13405)) - .saturating_add(T::DbWeight::get().reads(5)) + // Estimated: `15880` + // Minimum execution time: 18_487_000 picoseconds. + Weight::from_parts(19_102_000, 0) + .saturating_add(Weight::from_parts(0, 15880)) + .saturating_add(T::DbWeight::get().reads(6)) } /// Storage: `XcmPallet::VersionNotifyTargets` (r:2 w:1) /// Proof: `XcmPallet::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) @@ -217,38 +283,38 @@ impl pallet_xcm::WeightInfo for WeightInfo { /// Proof: `Dmp::DownwardMessageQueueHeads` (`max_values`: None, `max_size`: None, mode: `Measured`) fn notify_current_targets() -> Weight { // Proof Size summary in bytes: - // Measured: `178` - // Estimated: `6118` - // Minimum execution time: 30_180_000 picoseconds. - Weight::from_parts(31_351_000, 0) - .saturating_add(Weight::from_parts(0, 6118)) + // Measured: `216` + // Estimated: `6156` + // Minimum execution time: 29_603_000 picoseconds. + Weight::from_parts(31_002_000, 0) + .saturating_add(Weight::from_parts(0, 6156)) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(3)) } - /// Storage: `XcmPallet::VersionNotifyTargets` (r:3 w:0) + /// Storage: `XcmPallet::VersionNotifyTargets` (r:4 w:0) /// Proof: `XcmPallet::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) fn notify_target_migration_fail() -> Weight { // Proof Size summary in bytes: // Measured: `69` - // Estimated: `8484` - // Minimum execution time: 9_624_000 picoseconds. - Weight::from_parts(10_029_000, 0) - .saturating_add(Weight::from_parts(0, 8484)) - .saturating_add(T::DbWeight::get().reads(3)) + // Estimated: `10959` + // Minimum execution time: 12_183_000 picoseconds. + Weight::from_parts(12_587_000, 0) + .saturating_add(Weight::from_parts(0, 10959)) + .saturating_add(T::DbWeight::get().reads(4)) } - /// Storage: `XcmPallet::VersionNotifyTargets` (r:4 w:2) + /// Storage: `XcmPallet::VersionNotifyTargets` (r:5 w:2) /// Proof: `XcmPallet::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) fn migrate_version_notify_targets() -> Weight { // Proof Size summary in bytes: - // Measured: `37` - // Estimated: `10927` - // Minimum execution time: 15_139_000 picoseconds. - Weight::from_parts(15_575_000, 0) - .saturating_add(Weight::from_parts(0, 10927)) - .saturating_add(T::DbWeight::get().reads(4)) + // Measured: `33` + // Estimated: `13398` + // Minimum execution time: 16_372_000 picoseconds. + Weight::from_parts(16_967_000, 0) + .saturating_add(Weight::from_parts(0, 13398)) + .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) } - /// Storage: `XcmPallet::VersionNotifyTargets` (r:4 w:2) + /// Storage: `XcmPallet::VersionNotifyTargets` (r:5 w:2) /// Proof: `XcmPallet::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) /// Storage: `Dmp::DeliveryFeeFactor` (r:1 w:0) /// Proof: `Dmp::DeliveryFeeFactor` (`max_values`: None, `max_size`: None, mode: `Measured`) @@ -260,12 +326,12 @@ impl pallet_xcm::WeightInfo for WeightInfo { /// Proof: `Dmp::DownwardMessageQueueHeads` (`max_values`: None, `max_size`: None, mode: `Measured`) fn migrate_and_notify_old_targets() -> Weight { // Proof Size summary in bytes: - // Measured: `182` - // Estimated: `11072` - // Minimum execution time: 37_871_000 picoseconds. - Weight::from_parts(38_940_000, 0) - .saturating_add(Weight::from_parts(0, 11072)) - .saturating_add(T::DbWeight::get().reads(8)) + // Measured: `216` + // Estimated: `13581` + // Minimum execution time: 38_904_000 picoseconds. + Weight::from_parts(39_983_000, 0) + .saturating_add(Weight::from_parts(0, 13581)) + .saturating_add(T::DbWeight::get().reads(9)) .saturating_add(T::DbWeight::get().writes(4)) } /// Storage: `XcmPallet::QueryCounter` (r:1 w:1) @@ -276,8 +342,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `1485` - // Minimum execution time: 2_732_000 picoseconds. - Weight::from_parts(2_892_000, 0) + // Minimum execution time: 2_067_000 picoseconds. + Weight::from_parts(2_195_000, 0) .saturating_add(Weight::from_parts(0, 1485)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) @@ -288,10 +354,22 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `7576` // Estimated: `11041` - // Minimum execution time: 23_813_000 picoseconds. - Weight::from_parts(24_201_000, 0) + // Minimum execution time: 23_982_000 picoseconds. + Weight::from_parts(24_409_000, 0) .saturating_add(Weight::from_parts(0, 11041)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } + /// Storage: `XcmPallet::AssetTraps` (r:1 w:1) + /// Proof: `XcmPallet::AssetTraps` (`max_values`: None, `max_size`: None, mode: `Measured`) + fn claim_assets() -> Weight { + // Proof Size summary in bytes: + // Measured: `23` + // Estimated: `3488` + // Minimum execution time: 33_430_000 picoseconds. + Weight::from_parts(34_433_000, 0) + .saturating_add(Weight::from_parts(0, 3488)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } } diff --git a/polkadot/runtime/rococo/src/weights/runtime_parachains_assigner_on_demand.rs b/polkadot/runtime/rococo/src/weights/runtime_parachains_assigner_on_demand.rs index ac0f05301b486dbdbb8c0ca004e195ab47171ff3..dba9e7904c79065c33c9fffc9851171c72c2e66a 100644 --- a/polkadot/runtime/rococo/src/weights/runtime_parachains_assigner_on_demand.rs +++ b/polkadot/runtime/rococo/src/weights/runtime_parachains_assigner_on_demand.rs @@ -16,10 +16,10 @@ //! Autogenerated weights for `runtime_parachains::assigner_on_demand` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-08-11, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-03-18, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-fljshgub-project-163-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! HOSTNAME: `runner-h2rr8wx7-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("rococo-dev")`, DB CACHE: 1024 // Executed Command: @@ -31,11 +31,11 @@ // --extrinsic=* // --wasm-execution=compiled // --heap-pages=4096 -// --json-file=/builds/parity/mirrors/polkadot/.git/.artifacts/bench.json +// --json-file=/builds/parity/mirrors/polkadot-sdk/.git/.artifacts/bench.json // --pallet=runtime_parachains::assigner_on_demand // --chain=rococo-dev -// --header=./file_header.txt -// --output=./runtime/rococo/src/weights/ +// --header=./polkadot/file_header.txt +// --output=./polkadot/runtime/rococo/src/weights/ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -48,44 +48,44 @@ use core::marker::PhantomData; /// Weight functions for `runtime_parachains::assigner_on_demand`. pub struct WeightInfo(PhantomData); impl runtime_parachains::assigner_on_demand::WeightInfo for WeightInfo { - /// Storage: `OnDemandAssignmentProvider::SpotTraffic` (r:1 w:0) - /// Proof: `OnDemandAssignmentProvider::SpotTraffic` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `Paras::ParaLifecycles` (r:1 w:0) - /// Proof: `Paras::ParaLifecycles` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `OnDemandAssignmentProvider::OnDemandQueue` (r:1 w:1) - /// Proof: `OnDemandAssignmentProvider::OnDemandQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `OnDemandAssignmentProvider::QueueStatus` (r:1 w:1) + /// Proof: `OnDemandAssignmentProvider::QueueStatus` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `OnDemandAssignmentProvider::ParaIdAffinity` (r:1 w:0) + /// Proof: `OnDemandAssignmentProvider::ParaIdAffinity` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `OnDemandAssignmentProvider::FreeEntries` (r:1 w:1) + /// Proof: `OnDemandAssignmentProvider::FreeEntries` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) /// The range of component `s` is `[1, 9999]`. fn place_order_keep_alive(s: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `297 + s * (4 ±0)` - // Estimated: `3762 + s * (4 ±0)` - // Minimum execution time: 33_522_000 picoseconds. - Weight::from_parts(35_436_835, 0) - .saturating_add(Weight::from_parts(0, 3762)) - // Standard Error: 129 - .saturating_add(Weight::from_parts(14_041, 0).saturating_mul(s.into())) + // Measured: `218 + s * (8 ±0)` + // Estimated: `3681 + s * (8 ±0)` + // Minimum execution time: 21_053_000 picoseconds. + Weight::from_parts(17_291_897, 0) + .saturating_add(Weight::from_parts(0, 3681)) + // Standard Error: 104 + .saturating_add(Weight::from_parts(18_779, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(3)) - .saturating_add(T::DbWeight::get().writes(1)) - .saturating_add(Weight::from_parts(0, 4).saturating_mul(s.into())) + .saturating_add(T::DbWeight::get().writes(2)) + .saturating_add(Weight::from_parts(0, 8).saturating_mul(s.into())) } - /// Storage: `OnDemandAssignmentProvider::SpotTraffic` (r:1 w:0) - /// Proof: `OnDemandAssignmentProvider::SpotTraffic` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `Paras::ParaLifecycles` (r:1 w:0) - /// Proof: `Paras::ParaLifecycles` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `OnDemandAssignmentProvider::OnDemandQueue` (r:1 w:1) - /// Proof: `OnDemandAssignmentProvider::OnDemandQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `OnDemandAssignmentProvider::QueueStatus` (r:1 w:1) + /// Proof: `OnDemandAssignmentProvider::QueueStatus` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `OnDemandAssignmentProvider::ParaIdAffinity` (r:1 w:0) + /// Proof: `OnDemandAssignmentProvider::ParaIdAffinity` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `OnDemandAssignmentProvider::FreeEntries` (r:1 w:1) + /// Proof: `OnDemandAssignmentProvider::FreeEntries` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) /// The range of component `s` is `[1, 9999]`. fn place_order_allow_death(s: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `297 + s * (4 ±0)` - // Estimated: `3762 + s * (4 ±0)` - // Minimum execution time: 33_488_000 picoseconds. - Weight::from_parts(34_848_934, 0) - .saturating_add(Weight::from_parts(0, 3762)) - // Standard Error: 143 - .saturating_add(Weight::from_parts(14_215, 0).saturating_mul(s.into())) + // Measured: `218 + s * (8 ±0)` + // Estimated: `3681 + s * (8 ±0)` + // Minimum execution time: 20_843_000 picoseconds. + Weight::from_parts(16_881_986, 0) + .saturating_add(Weight::from_parts(0, 3681)) + // Standard Error: 104 + .saturating_add(Weight::from_parts(18_788, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(3)) - .saturating_add(T::DbWeight::get().writes(1)) - .saturating_add(Weight::from_parts(0, 4).saturating_mul(s.into())) + .saturating_add(T::DbWeight::get().writes(2)) + .saturating_add(Weight::from_parts(0, 8).saturating_mul(s.into())) } } diff --git a/polkadot/runtime/rococo/src/weights/runtime_parachains_configuration.rs b/polkadot/runtime/rococo/src/weights/runtime_parachains_configuration.rs index 34541b83597e6284a401a171e703b200366114a0..ca0575cb1b64689b7b016d63a2cfc5080dc874a5 100644 --- a/polkadot/runtime/rococo/src/weights/runtime_parachains_configuration.rs +++ b/polkadot/runtime/rococo/src/weights/runtime_parachains_configuration.rs @@ -16,10 +16,10 @@ //! Autogenerated weights for `runtime_parachains::configuration` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-11-10, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-02-08, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-yprdrvc7-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! HOSTNAME: `runner-bn-ce5rx-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("rococo-dev")`, DB CACHE: 1024 // Executed Command: @@ -58,8 +58,8 @@ impl runtime_parachains::configuration::WeightInfo for // Proof Size summary in bytes: // Measured: `151` // Estimated: `1636` - // Minimum execution time: 7_793_000 picoseconds. - Weight::from_parts(8_192_000, 0) + // Minimum execution time: 7_789_000 picoseconds. + Weight::from_parts(8_269_000, 0) .saturating_add(Weight::from_parts(0, 1636)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(1)) @@ -74,8 +74,8 @@ impl runtime_parachains::configuration::WeightInfo for // Proof Size summary in bytes: // Measured: `151` // Estimated: `1636` - // Minimum execution time: 7_819_000 picoseconds. - Weight::from_parts(8_004_000, 0) + // Minimum execution time: 7_851_000 picoseconds. + Weight::from_parts(8_152_000, 0) .saturating_add(Weight::from_parts(0, 1636)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(1)) @@ -90,8 +90,8 @@ impl runtime_parachains::configuration::WeightInfo for // Proof Size summary in bytes: // Measured: `151` // Estimated: `1636` - // Minimum execution time: 7_760_000 picoseconds. - Weight::from_parts(8_174_000, 0) + // Minimum execution time: 7_960_000 picoseconds. + Weight::from_parts(8_276_000, 0) .saturating_add(Weight::from_parts(0, 1636)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(1)) @@ -116,8 +116,8 @@ impl runtime_parachains::configuration::WeightInfo for // Proof Size summary in bytes: // Measured: `151` // Estimated: `1636` - // Minimum execution time: 7_814_000 picoseconds. - Weight::from_parts(8_098_000, 0) + // Minimum execution time: 7_912_000 picoseconds. + Weight::from_parts(8_164_000, 0) .saturating_add(Weight::from_parts(0, 1636)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(1)) @@ -132,8 +132,8 @@ impl runtime_parachains::configuration::WeightInfo for // Proof Size summary in bytes: // Measured: `151` // Estimated: `1636` - // Minimum execution time: 10_028_000 picoseconds. - Weight::from_parts(10_386_000, 0) + // Minimum execution time: 9_782_000 picoseconds. + Weight::from_parts(10_373_000, 0) .saturating_add(Weight::from_parts(0, 1636)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(1)) @@ -148,8 +148,8 @@ impl runtime_parachains::configuration::WeightInfo for // Proof Size summary in bytes: // Measured: `151` // Estimated: `1636` - // Minimum execution time: 7_867_000 picoseconds. - Weight::from_parts(8_191_000, 0) + // Minimum execution time: 7_870_000 picoseconds. + Weight::from_parts(8_274_000, 0) .saturating_add(Weight::from_parts(0, 1636)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(1)) @@ -164,8 +164,24 @@ impl runtime_parachains::configuration::WeightInfo for // Proof Size summary in bytes: // Measured: `151` // Estimated: `1636` - // Minimum execution time: 10_158_000 picoseconds. - Weight::from_parts(10_430_000, 0) + // Minimum execution time: 9_960_000 picoseconds. + Weight::from_parts(10_514_000, 0) + .saturating_add(Weight::from_parts(0, 1636)) + .saturating_add(T::DbWeight::get().reads(3)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `Configuration::PendingConfigs` (r:1 w:1) + /// Proof: `Configuration::PendingConfigs` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Configuration::BypassConsistencyCheck` (r:1 w:0) + /// Proof: `Configuration::BypassConsistencyCheck` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParasShared::CurrentSessionIndex` (r:1 w:0) + /// Proof: `ParasShared::CurrentSessionIndex` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + fn set_config_with_scheduler_params() -> Weight { + // Proof Size summary in bytes: + // Measured: `151` + // Estimated: `1636` + // Minimum execution time: 7_913_000 picoseconds. + Weight::from_parts(8_338_000, 0) .saturating_add(Weight::from_parts(0, 1636)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(1)) diff --git a/polkadot/runtime/rococo/src/weights/runtime_parachains_paras_inherent.rs b/polkadot/runtime/rococo/src/weights/runtime_parachains_paras_inherent.rs index a102d1903b2f2b4a757edf3bb96809c982f31383..c250c86665be0eebf54e570e73290a3ebdbdab82 100644 --- a/polkadot/runtime/rococo/src/weights/runtime_parachains_paras_inherent.rs +++ b/polkadot/runtime/rococo/src/weights/runtime_parachains_paras_inherent.rs @@ -13,161 +13,322 @@ // You should have received a copy of the GNU General Public License // along with Polkadot. If not, see . + //! Autogenerated weights for `runtime_parachains::paras_inherent` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2021-11-20, STEPS: `50`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("rococo-dev"), DB CACHE: 128 +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-03-18, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `runner-h2rr8wx7-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("rococo-dev")`, DB CACHE: 1024 // Executed Command: -// target/release/polkadot +// target/production/polkadot // benchmark -// --chain=rococo-dev +// pallet // --steps=50 // --repeat=20 -// --pallet=runtime_parachains::paras_inherent // --extrinsic=* -// --execution=wasm // --wasm-execution=compiled // --heap-pages=4096 -// --output=./runtime/rococo/src/weights/runtime_parachains_paras_inherent.rs -// --header=./file_header.txt +// --json-file=/builds/parity/mirrors/polkadot-sdk/.git/.artifacts/bench.json +// --pallet=runtime_parachains::paras_inherent +// --chain=rococo-dev +// --header=./polkadot/file_header.txt +// --output=./polkadot/runtime/rococo/src/weights/ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] #![allow(unused_imports)] +#![allow(missing_docs)] use frame_support::{traits::Get, weights::Weight}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions for `runtime_parachains::paras_inherent`. pub struct WeightInfo(PhantomData); impl runtime_parachains::paras_inherent::WeightInfo for WeightInfo { - // Storage: ParaInherent Included (r:1 w:1) - // Storage: System ParentHash (r:1 w:0) - // Storage: ParaScheduler AvailabilityCores (r:1 w:1) - // Storage: ParasShared CurrentSessionIndex (r:1 w:0) - // Storage: Configuration ActiveConfig (r:1 w:0) - // Storage: ParaSessionInfo Sessions (r:1 w:0) - // Storage: ParasDisputes Disputes (r:1 w:1) - // Storage: ParasDisputes Included (r:1 w:1) - // Storage: ParasDisputes SpamSlots (r:1 w:1) - // Storage: ParasDisputes Frozen (r:1 w:0) - // Storage: ParaInclusion PendingAvailability (r:2 w:1) - // Storage: ParasShared ActiveValidatorKeys (r:1 w:0) - // Storage: Paras Parachains (r:1 w:0) - // Storage: ParaInclusion PendingAvailabilityCommitments (r:1 w:1) - // Storage: Dmp DownwardMessageQueues (r:1 w:1) - // Storage: Hrmp HrmpChannelDigests (r:1 w:1) - // Storage: Paras FutureCodeUpgrades (r:1 w:0) - // Storage: ParaScheduler SessionStartBlock (r:1 w:0) - // Storage: ParaScheduler ParathreadQueue (r:1 w:1) - // Storage: ParaScheduler Scheduled (r:1 w:1) - // Storage: ParaScheduler ValidatorGroups (r:1 w:0) - // Storage: Ump NeedsDispatch (r:1 w:1) - // Storage: Ump NextDispatchRoundStartWith (r:1 w:1) - // Storage: ParaInherent OnChainVotes (r:0 w:1) - // Storage: Hrmp HrmpWatermarks (r:0 w:1) - // Storage: Paras Heads (r:0 w:1) + /// Storage: `ParaInherent::Included` (r:1 w:1) + /// Proof: `ParaInherent::Included` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `System::ParentHash` (r:1 w:0) + /// Proof: `System::ParentHash` (`max_values`: Some(1), `max_size`: Some(32), added: 527, mode: `MaxEncodedLen`) + /// Storage: `ParasShared::AllowedRelayParents` (r:1 w:1) + /// Proof: `ParasShared::AllowedRelayParents` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParasShared::CurrentSessionIndex` (r:1 w:0) + /// Proof: `ParasShared::CurrentSessionIndex` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParaScheduler::AvailabilityCores` (r:1 w:1) + /// Proof: `ParaScheduler::AvailabilityCores` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParasShared::ActiveValidatorKeys` (r:1 w:0) + /// Proof: `ParasShared::ActiveValidatorKeys` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Babe::AuthorVrfRandomness` (r:1 w:0) + /// Proof: `Babe::AuthorVrfRandomness` (`max_values`: Some(1), `max_size`: Some(33), added: 528, mode: `MaxEncodedLen`) + /// Storage: `ParaSessionInfo::Sessions` (r:1 w:0) + /// Proof: `ParaSessionInfo::Sessions` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `ParasDisputes::Disputes` (r:1 w:1) + /// Proof: `ParasDisputes::Disputes` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `ParasDisputes::BackersOnDisputes` (r:1 w:1) + /// Proof: `ParasDisputes::BackersOnDisputes` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `ParasDisputes::Included` (r:1 w:1) + /// Proof: `ParasDisputes::Included` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `ParaInherent::OnChainVotes` (r:1 w:1) + /// Proof: `ParaInherent::OnChainVotes` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParasDisputes::Frozen` (r:1 w:0) + /// Proof: `ParasDisputes::Frozen` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParaInclusion::V1` (r:2 w:1) + /// Proof: `ParaInclusion::V1` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Dmp::DownwardMessageQueues` (r:1 w:1) + /// Proof: `Dmp::DownwardMessageQueues` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Dmp::DeliveryFeeFactor` (r:1 w:1) + /// Proof: `Dmp::DeliveryFeeFactor` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpChannelDigests` (r:1 w:1) + /// Proof: `Hrmp::HrmpChannelDigests` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Paras::FutureCodeUpgrades` (r:1 w:0) + /// Proof: `Paras::FutureCodeUpgrades` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Registrar::Paras` (r:1 w:0) + /// Proof: `Registrar::Paras` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `ParaScheduler::SessionStartBlock` (r:1 w:0) + /// Proof: `ParaScheduler::SessionStartBlock` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParaScheduler::ValidatorGroups` (r:1 w:0) + /// Proof: `ParaScheduler::ValidatorGroups` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParaScheduler::ClaimQueue` (r:1 w:1) + /// Proof: `ParaScheduler::ClaimQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `CoretimeAssignmentProvider::CoreDescriptors` (r:1 w:1) + /// Proof: `CoretimeAssignmentProvider::CoreDescriptors` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `ParasShared::ActiveValidatorIndices` (r:1 w:0) + /// Proof: `ParasShared::ActiveValidatorIndices` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Session::DisabledValidators` (r:1 w:0) + /// Proof: `Session::DisabledValidators` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpWatermarks` (r:0 w:1) + /// Proof: `Hrmp::HrmpWatermarks` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Paras::Heads` (r:0 w:1) + /// Proof: `Paras::Heads` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Paras::UpgradeGoAheadSignal` (r:0 w:1) + /// Proof: `Paras::UpgradeGoAheadSignal` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Paras::MostRecentContext` (r:0 w:1) + /// Proof: `Paras::MostRecentContext` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// The range of component `v` is `[10, 200]`. fn enter_variable_disputes(v: u32, ) -> Weight { - Weight::from_parts(352_590_000 as u64, 0) - // Standard Error: 13_000 - .saturating_add(Weight::from_parts(49_254_000 as u64, 0).saturating_mul(v as u64)) - .saturating_add(T::DbWeight::get().reads(24 as u64)) - .saturating_add(T::DbWeight::get().writes(16 as u64)) + // Proof Size summary in bytes: + // Measured: `67785` + // Estimated: `73725 + v * (23 ±0)` + // Minimum execution time: 949_716_000 picoseconds. + Weight::from_parts(482_361_515, 0) + .saturating_add(Weight::from_parts(0, 73725)) + // Standard Error: 17_471 + .saturating_add(Weight::from_parts(50_100_764, 0).saturating_mul(v.into())) + .saturating_add(T::DbWeight::get().reads(25)) + .saturating_add(T::DbWeight::get().writes(15)) + .saturating_add(Weight::from_parts(0, 23).saturating_mul(v.into())) } - // Storage: ParaInherent Included (r:1 w:1) - // Storage: System ParentHash (r:1 w:0) - // Storage: ParaScheduler AvailabilityCores (r:1 w:1) - // Storage: ParasShared CurrentSessionIndex (r:1 w:0) - // Storage: Configuration ActiveConfig (r:1 w:0) - // Storage: ParasDisputes Frozen (r:1 w:0) - // Storage: ParasShared ActiveValidatorKeys (r:1 w:0) - // Storage: Paras Parachains (r:1 w:0) - // Storage: ParaInclusion PendingAvailability (r:2 w:1) - // Storage: ParaInclusion PendingAvailabilityCommitments (r:1 w:1) - // Storage: Dmp DownwardMessageQueues (r:1 w:1) - // Storage: Hrmp HrmpChannelDigests (r:1 w:1) - // Storage: Paras FutureCodeUpgrades (r:1 w:0) - // Storage: ParasDisputes Disputes (r:1 w:0) - // Storage: ParaScheduler SessionStartBlock (r:1 w:0) - // Storage: ParaScheduler ParathreadQueue (r:1 w:1) - // Storage: ParaScheduler Scheduled (r:1 w:1) - // Storage: ParaScheduler ValidatorGroups (r:1 w:0) - // Storage: Ump NeedsDispatch (r:1 w:1) - // Storage: Ump NextDispatchRoundStartWith (r:1 w:1) - // Storage: ParaInclusion AvailabilityBitfields (r:0 w:1) - // Storage: ParaInherent OnChainVotes (r:0 w:1) - // Storage: ParasDisputes Included (r:0 w:1) - // Storage: Hrmp HrmpWatermarks (r:0 w:1) - // Storage: Paras Heads (r:0 w:1) + /// Storage: `ParaInherent::Included` (r:1 w:1) + /// Proof: `ParaInherent::Included` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `System::ParentHash` (r:1 w:0) + /// Proof: `System::ParentHash` (`max_values`: Some(1), `max_size`: Some(32), added: 527, mode: `MaxEncodedLen`) + /// Storage: `ParasShared::AllowedRelayParents` (r:1 w:1) + /// Proof: `ParasShared::AllowedRelayParents` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParasShared::CurrentSessionIndex` (r:1 w:0) + /// Proof: `ParasShared::CurrentSessionIndex` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParaScheduler::AvailabilityCores` (r:1 w:1) + /// Proof: `ParaScheduler::AvailabilityCores` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParasShared::ActiveValidatorKeys` (r:1 w:0) + /// Proof: `ParasShared::ActiveValidatorKeys` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Babe::AuthorVrfRandomness` (r:1 w:0) + /// Proof: `Babe::AuthorVrfRandomness` (`max_values`: Some(1), `max_size`: Some(33), added: 528, mode: `MaxEncodedLen`) + /// Storage: `ParaInherent::OnChainVotes` (r:1 w:1) + /// Proof: `ParaInherent::OnChainVotes` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParasDisputes::Frozen` (r:1 w:0) + /// Proof: `ParasDisputes::Frozen` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParaInclusion::V1` (r:2 w:1) + /// Proof: `ParaInclusion::V1` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Dmp::DownwardMessageQueues` (r:1 w:1) + /// Proof: `Dmp::DownwardMessageQueues` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Dmp::DeliveryFeeFactor` (r:1 w:1) + /// Proof: `Dmp::DeliveryFeeFactor` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpChannelDigests` (r:1 w:1) + /// Proof: `Hrmp::HrmpChannelDigests` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Paras::FutureCodeUpgrades` (r:1 w:0) + /// Proof: `Paras::FutureCodeUpgrades` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Registrar::Paras` (r:1 w:0) + /// Proof: `Registrar::Paras` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `ParasDisputes::Disputes` (r:1 w:0) + /// Proof: `ParasDisputes::Disputes` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `ParaScheduler::SessionStartBlock` (r:1 w:0) + /// Proof: `ParaScheduler::SessionStartBlock` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParaScheduler::ValidatorGroups` (r:1 w:0) + /// Proof: `ParaScheduler::ValidatorGroups` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParaScheduler::ClaimQueue` (r:1 w:1) + /// Proof: `ParaScheduler::ClaimQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `CoretimeAssignmentProvider::CoreDescriptors` (r:1 w:1) + /// Proof: `CoretimeAssignmentProvider::CoreDescriptors` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `ParasShared::ActiveValidatorIndices` (r:1 w:0) + /// Proof: `ParasShared::ActiveValidatorIndices` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Session::DisabledValidators` (r:1 w:0) + /// Proof: `Session::DisabledValidators` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParasDisputes::Included` (r:0 w:1) + /// Proof: `ParasDisputes::Included` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpWatermarks` (r:0 w:1) + /// Proof: `Hrmp::HrmpWatermarks` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Paras::Heads` (r:0 w:1) + /// Proof: `Paras::Heads` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Paras::UpgradeGoAheadSignal` (r:0 w:1) + /// Proof: `Paras::UpgradeGoAheadSignal` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Paras::MostRecentContext` (r:0 w:1) + /// Proof: `Paras::MostRecentContext` (`max_values`: None, `max_size`: None, mode: `Measured`) fn enter_bitfields() -> Weight { - Weight::from_parts(299_878_000 as u64, 0) - .saturating_add(T::DbWeight::get().reads(21 as u64)) - .saturating_add(T::DbWeight::get().writes(15 as u64)) + // Proof Size summary in bytes: + // Measured: `42757` + // Estimated: `48697` + // Minimum execution time: 437_627_000 picoseconds. + Weight::from_parts(460_975_000, 0) + .saturating_add(Weight::from_parts(0, 48697)) + .saturating_add(T::DbWeight::get().reads(23)) + .saturating_add(T::DbWeight::get().writes(15)) } - // Storage: ParaInherent Included (r:1 w:1) - // Storage: System ParentHash (r:1 w:0) - // Storage: ParaScheduler AvailabilityCores (r:1 w:1) - // Storage: ParasShared CurrentSessionIndex (r:1 w:0) - // Storage: Configuration ActiveConfig (r:1 w:0) - // Storage: ParasDisputes Frozen (r:1 w:0) - // Storage: ParasShared ActiveValidatorKeys (r:1 w:0) - // Storage: Paras Parachains (r:1 w:0) - // Storage: ParaInclusion PendingAvailability (r:2 w:1) - // Storage: ParaInclusion PendingAvailabilityCommitments (r:1 w:1) - // Storage: Dmp DownwardMessageQueues (r:1 w:1) - // Storage: Hrmp HrmpChannelDigests (r:1 w:1) - // Storage: Paras FutureCodeUpgrades (r:1 w:0) - // Storage: ParasDisputes Disputes (r:2 w:0) - // Storage: ParaScheduler SessionStartBlock (r:1 w:0) - // Storage: ParaScheduler ParathreadQueue (r:1 w:1) - // Storage: ParaScheduler Scheduled (r:1 w:1) - // Storage: ParaScheduler ValidatorGroups (r:1 w:0) - // Storage: Paras PastCodeMeta (r:1 w:0) - // Storage: Paras CurrentCodeHash (r:1 w:0) - // Storage: Ump RelayDispatchQueueSize (r:1 w:0) - // Storage: Ump NeedsDispatch (r:1 w:1) - // Storage: Ump NextDispatchRoundStartWith (r:1 w:1) - // Storage: ParaInherent OnChainVotes (r:0 w:1) - // Storage: ParasDisputes Included (r:0 w:1) - // Storage: Hrmp HrmpWatermarks (r:0 w:1) - // Storage: Paras Heads (r:0 w:1) - fn enter_backed_candidates_variable(_v: u32) -> Weight { - Weight::from_parts(442_472_000 as u64, 0) - .saturating_add(T::DbWeight::get().reads(25 as u64)) - .saturating_add(T::DbWeight::get().writes(14 as u64)) + /// Storage: `ParaInherent::Included` (r:1 w:1) + /// Proof: `ParaInherent::Included` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `System::ParentHash` (r:1 w:0) + /// Proof: `System::ParentHash` (`max_values`: Some(1), `max_size`: Some(32), added: 527, mode: `MaxEncodedLen`) + /// Storage: `ParasShared::AllowedRelayParents` (r:1 w:1) + /// Proof: `ParasShared::AllowedRelayParents` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParasShared::CurrentSessionIndex` (r:1 w:0) + /// Proof: `ParasShared::CurrentSessionIndex` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParaScheduler::AvailabilityCores` (r:1 w:1) + /// Proof: `ParaScheduler::AvailabilityCores` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParasShared::ActiveValidatorKeys` (r:1 w:0) + /// Proof: `ParasShared::ActiveValidatorKeys` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Babe::AuthorVrfRandomness` (r:1 w:0) + /// Proof: `Babe::AuthorVrfRandomness` (`max_values`: Some(1), `max_size`: Some(33), added: 528, mode: `MaxEncodedLen`) + /// Storage: `ParaInherent::OnChainVotes` (r:1 w:1) + /// Proof: `ParaInherent::OnChainVotes` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParasDisputes::Frozen` (r:1 w:0) + /// Proof: `ParasDisputes::Frozen` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParaInclusion::V1` (r:2 w:1) + /// Proof: `ParaInclusion::V1` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Dmp::DownwardMessageQueues` (r:1 w:1) + /// Proof: `Dmp::DownwardMessageQueues` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Dmp::DeliveryFeeFactor` (r:1 w:1) + /// Proof: `Dmp::DeliveryFeeFactor` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpChannelDigests` (r:1 w:1) + /// Proof: `Hrmp::HrmpChannelDigests` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Paras::FutureCodeUpgrades` (r:1 w:0) + /// Proof: `Paras::FutureCodeUpgrades` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Registrar::Paras` (r:1 w:0) + /// Proof: `Registrar::Paras` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `ParasDisputes::Disputes` (r:1 w:0) + /// Proof: `ParasDisputes::Disputes` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `ParaScheduler::SessionStartBlock` (r:1 w:0) + /// Proof: `ParaScheduler::SessionStartBlock` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParaScheduler::ValidatorGroups` (r:1 w:0) + /// Proof: `ParaScheduler::ValidatorGroups` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParaScheduler::ClaimQueue` (r:1 w:1) + /// Proof: `ParaScheduler::ClaimQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `CoretimeAssignmentProvider::CoreDescriptors` (r:1 w:1) + /// Proof: `CoretimeAssignmentProvider::CoreDescriptors` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Paras::CurrentCodeHash` (r:1 w:0) + /// Proof: `Paras::CurrentCodeHash` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Paras::ParaLifecycles` (r:1 w:0) + /// Proof: `Paras::ParaLifecycles` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `MessageQueue::BookStateFor` (r:1 w:0) + /// Proof: `MessageQueue::BookStateFor` (`max_values`: None, `max_size`: Some(55), added: 2530, mode: `MaxEncodedLen`) + /// Storage: `ParasShared::ActiveValidatorIndices` (r:1 w:0) + /// Proof: `ParasShared::ActiveValidatorIndices` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Session::DisabledValidators` (r:1 w:0) + /// Proof: `Session::DisabledValidators` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParasDisputes::Included` (r:0 w:1) + /// Proof: `ParasDisputes::Included` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpWatermarks` (r:0 w:1) + /// Proof: `Hrmp::HrmpWatermarks` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Paras::Heads` (r:0 w:1) + /// Proof: `Paras::Heads` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Paras::UpgradeGoAheadSignal` (r:0 w:1) + /// Proof: `Paras::UpgradeGoAheadSignal` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Paras::MostRecentContext` (r:0 w:1) + /// Proof: `Paras::MostRecentContext` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// The range of component `v` is `[101, 200]`. + fn enter_backed_candidates_variable(v: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `42829` + // Estimated: `48769` + // Minimum execution time: 1_305_254_000 picoseconds. + Weight::from_parts(1_347_160_667, 0) + .saturating_add(Weight::from_parts(0, 48769)) + // Standard Error: 22_128 + .saturating_add(Weight::from_parts(57_229, 0).saturating_mul(v.into())) + .saturating_add(T::DbWeight::get().reads(26)) + .saturating_add(T::DbWeight::get().writes(15)) } - // Storage: ParaInherent Included (r:1 w:1) - // Storage: System ParentHash (r:1 w:0) - // Storage: ParaScheduler AvailabilityCores (r:1 w:1) - // Storage: ParasShared CurrentSessionIndex (r:1 w:0) - // Storage: Configuration ActiveConfig (r:1 w:0) - // Storage: ParasDisputes Frozen (r:1 w:0) - // Storage: ParasShared ActiveValidatorKeys (r:1 w:0) - // Storage: Paras Parachains (r:1 w:0) - // Storage: ParaInclusion PendingAvailability (r:2 w:1) - // Storage: ParaInclusion PendingAvailabilityCommitments (r:1 w:1) - // Storage: Dmp DownwardMessageQueues (r:1 w:1) - // Storage: Hrmp HrmpChannelDigests (r:1 w:1) - // Storage: Paras FutureCodeUpgrades (r:1 w:0) - // Storage: ParasDisputes Disputes (r:2 w:0) - // Storage: ParaScheduler SessionStartBlock (r:1 w:0) - // Storage: ParaScheduler ParathreadQueue (r:1 w:1) - // Storage: ParaScheduler Scheduled (r:1 w:1) - // Storage: ParaScheduler ValidatorGroups (r:1 w:0) - // Storage: Paras PastCodeMeta (r:1 w:0) - // Storage: Paras CurrentCodeHash (r:1 w:0) - // Storage: Ump RelayDispatchQueueSize (r:1 w:0) - // Storage: Ump NeedsDispatch (r:1 w:1) - // Storage: Ump NextDispatchRoundStartWith (r:1 w:1) - // Storage: ParaInherent OnChainVotes (r:0 w:1) - // Storage: ParasDisputes Included (r:0 w:1) - // Storage: Hrmp HrmpWatermarks (r:0 w:1) - // Storage: Paras Heads (r:0 w:1) + /// Storage: `ParaInherent::Included` (r:1 w:1) + /// Proof: `ParaInherent::Included` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `System::ParentHash` (r:1 w:0) + /// Proof: `System::ParentHash` (`max_values`: Some(1), `max_size`: Some(32), added: 527, mode: `MaxEncodedLen`) + /// Storage: `ParasShared::AllowedRelayParents` (r:1 w:1) + /// Proof: `ParasShared::AllowedRelayParents` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParasShared::CurrentSessionIndex` (r:1 w:0) + /// Proof: `ParasShared::CurrentSessionIndex` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParaScheduler::AvailabilityCores` (r:1 w:1) + /// Proof: `ParaScheduler::AvailabilityCores` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParasShared::ActiveValidatorKeys` (r:1 w:0) + /// Proof: `ParasShared::ActiveValidatorKeys` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Babe::AuthorVrfRandomness` (r:1 w:0) + /// Proof: `Babe::AuthorVrfRandomness` (`max_values`: Some(1), `max_size`: Some(33), added: 528, mode: `MaxEncodedLen`) + /// Storage: `ParaInherent::OnChainVotes` (r:1 w:1) + /// Proof: `ParaInherent::OnChainVotes` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParasDisputes::Frozen` (r:1 w:0) + /// Proof: `ParasDisputes::Frozen` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParaInclusion::V1` (r:2 w:1) + /// Proof: `ParaInclusion::V1` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Dmp::DownwardMessageQueues` (r:1 w:1) + /// Proof: `Dmp::DownwardMessageQueues` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Dmp::DeliveryFeeFactor` (r:1 w:1) + /// Proof: `Dmp::DeliveryFeeFactor` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpChannelDigests` (r:1 w:1) + /// Proof: `Hrmp::HrmpChannelDigests` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Paras::FutureCodeUpgrades` (r:1 w:0) + /// Proof: `Paras::FutureCodeUpgrades` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Registrar::Paras` (r:1 w:0) + /// Proof: `Registrar::Paras` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `ParasDisputes::Disputes` (r:1 w:0) + /// Proof: `ParasDisputes::Disputes` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `ParaScheduler::SessionStartBlock` (r:1 w:0) + /// Proof: `ParaScheduler::SessionStartBlock` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParaScheduler::ValidatorGroups` (r:1 w:0) + /// Proof: `ParaScheduler::ValidatorGroups` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParaScheduler::ClaimQueue` (r:1 w:1) + /// Proof: `ParaScheduler::ClaimQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `CoretimeAssignmentProvider::CoreDescriptors` (r:1 w:1) + /// Proof: `CoretimeAssignmentProvider::CoreDescriptors` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Paras::CurrentCodeHash` (r:1 w:0) + /// Proof: `Paras::CurrentCodeHash` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Paras::FutureCodeHash` (r:1 w:0) + /// Proof: `Paras::FutureCodeHash` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Paras::UpgradeRestrictionSignal` (r:1 w:0) + /// Proof: `Paras::UpgradeRestrictionSignal` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Paras::ParaLifecycles` (r:1 w:0) + /// Proof: `Paras::ParaLifecycles` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `MessageQueue::BookStateFor` (r:1 w:0) + /// Proof: `MessageQueue::BookStateFor` (`max_values`: None, `max_size`: Some(55), added: 2530, mode: `MaxEncodedLen`) + /// Storage: `ParasShared::ActiveValidatorIndices` (r:1 w:0) + /// Proof: `ParasShared::ActiveValidatorIndices` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Session::DisabledValidators` (r:1 w:0) + /// Proof: `Session::DisabledValidators` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParasDisputes::Included` (r:0 w:1) + /// Proof: `ParasDisputes::Included` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpWatermarks` (r:0 w:1) + /// Proof: `Hrmp::HrmpWatermarks` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Paras::Heads` (r:0 w:1) + /// Proof: `Paras::Heads` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Paras::UpgradeGoAheadSignal` (r:0 w:1) + /// Proof: `Paras::UpgradeGoAheadSignal` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Paras::MostRecentContext` (r:0 w:1) + /// Proof: `Paras::MostRecentContext` (`max_values`: None, `max_size`: None, mode: `Measured`) fn enter_backed_candidate_code_upgrade() -> Weight { - Weight::from_parts(36_903_411_000 as u64, 0) - .saturating_add(T::DbWeight::get().reads(25 as u64)) - .saturating_add(T::DbWeight::get().writes(14 as u64)) + // Proof Size summary in bytes: + // Measured: `42842` + // Estimated: `48782` + // Minimum execution time: 38_637_547_000 picoseconds. + Weight::from_parts(41_447_412_000, 0) + .saturating_add(Weight::from_parts(0, 48782)) + .saturating_add(T::DbWeight::get().reads(28)) + .saturating_add(T::DbWeight::get().writes(15)) } } diff --git a/polkadot/runtime/rococo/src/xcm_config.rs b/polkadot/runtime/rococo/src/xcm_config.rs index 5fddd749dad3859d13cafa93818aef6d03fd9f03..c7063bd7ad616c2e5cb7b2e3f8c397087e522c33 100644 --- a/polkadot/runtime/rococo/src/xcm_config.rs +++ b/polkadot/runtime/rococo/src/xcm_config.rs @@ -36,17 +36,15 @@ use runtime_common::{ }; use sp_core::ConstU32; use xcm::latest::prelude::*; -#[allow(deprecated)] -use xcm_builder::CurrencyAdapter as XcmCurrencyAdapter; use xcm_builder::{ AccountId32Aliases, AllowExplicitUnpaidExecutionFrom, AllowKnownQueryResponses, AllowSubscriptionsFrom, AllowTopLevelPaidExecutionFrom, ChildParachainAsNative, - ChildParachainConvertsVia, DescribeBodyTerminal, DescribeFamily, FixedWeightBounds, - FrameTransactionalProcessor, HashedDescription, IsChildSystemParachain, IsConcrete, - MintLocation, OriginToPluralityVoice, SignedAccountId32AsNative, SignedToAccountId32, - SovereignSignedViaLocation, TakeWeightCredit, TrailingSetTopicAsId, UsingComponents, - WeightInfoBounds, WithComputedOrigin, WithUniqueTopic, XcmFeeManagerFromComponents, - XcmFeeToAccount, + ChildParachainConvertsVia, DescribeAllTerminal, DescribeFamily, FixedWeightBounds, + FrameTransactionalProcessor, FungibleAdapter, HashedDescription, IsChildSystemParachain, + IsConcrete, MintLocation, OriginToPluralityVoice, SignedAccountId32AsNative, + SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit, TrailingSetTopicAsId, + UsingComponents, WeightInfoBounds, WithComputedOrigin, WithUniqueTopic, + XcmFeeManagerFromComponents, XcmFeeToAccount, }; use xcm_executor::XcmExecutor; @@ -65,16 +63,15 @@ pub type LocationConverter = ( ChildParachainConvertsVia, // We can directly alias an `AccountId32` into a local account. AccountId32Aliases, - // Allow governance body to be used as a sovereign account. - HashedDescription>, + // Foreign locations alias into accounts according to a hash of their standard description. + HashedDescription>, ); /// Our asset transactor. This is what allows us to interest with the runtime facilities from the /// point of view of XCM-only concepts like `Location` and `Asset`. /// /// Ours is only aware of the Balances pallet, which is mapped to `RocLocation`. -#[allow(deprecated)] -pub type LocalAssetTransactor = XcmCurrencyAdapter< +pub type LocalAssetTransactor = FungibleAdapter< // Use this currency: Balances, // Use this currency when it is a fungible asset matching the given location or name: @@ -224,6 +221,9 @@ impl xcm_executor::Config for XcmConfig { type SafeCallFilter = Everything; type Aliasers = Nothing; type TransactionalProcessor = FrameTransactionalProcessor; + type HrmpNewChannelOpenRequestHandler = (); + type HrmpChannelAcceptedHandler = (); + type HrmpChannelClosingHandler = (); } parameter_types! { @@ -259,11 +259,9 @@ pub type LocalPalletOriginToLocation = ( impl pallet_xcm::Config for Runtime { type RuntimeEvent = RuntimeEvent; - // We only allow the root, fellows and the staking admin to send messages. - // This is basically safe to enable for everyone (safe the possibility of someone spamming the - // parachain if they're willing to pay the KSM to send from the Relay-chain), but it's useless - // until we bring in XCM v3 which will make `DescendOrigin` a bit more useful. - type SendXcmOrigin = xcm_builder::EnsureXcmOrigin; + // Note that this configuration of `SendXcmOrigin` is different from the one present in + // production. + type SendXcmOrigin = xcm_builder::EnsureXcmOrigin; type XcmRouter = XcmRouter; // Anyone can execute XCM messages locally. type ExecuteXcmOrigin = xcm_builder::EnsureXcmOrigin; diff --git a/polkadot/runtime/test-runtime/Cargo.toml b/polkadot/runtime/test-runtime/Cargo.toml index 9778ff82439494767b83d5acb6f7f9f57ac89619..35fb684597e7d3f8082478353a643ee2adf2481d 100644 --- a/polkadot/runtime/test-runtime/Cargo.toml +++ b/polkadot/runtime/test-runtime/Cargo.toml @@ -13,11 +13,11 @@ workspace = true [dependencies] bitvec = { version = "1.0.0", default-features = false, features = ["alloc"] } parity-scale-codec = { version = "3.6.1", default-features = false, features = ["derive"] } -log = { version = "0.4.17", default-features = false } +log = { workspace = true } rustc-hex = { version = "2.1.0", default-features = false } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.195", default-features = false } -serde_derive = { version = "1.0.117", optional = true } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +serde = { workspace = true } +serde_derive = { optional = true, workspace = true } smallvec = "1.8.0" authority-discovery-primitives = { package = "sp-authority-discovery", path = "../../../substrate/primitives/authority-discovery", default-features = false } @@ -74,7 +74,7 @@ hex-literal = "0.4.1" tiny-keccak = { version = "2.0.2", features = ["keccak"] } keyring = { package = "sp-keyring", path = "../../../substrate/primitives/keyring" } sp-trie = { path = "../../../substrate/primitives/trie" } -serde_json = "1.0.111" +serde_json = { workspace = true, default-features = true } [build-dependencies] substrate-wasm-builder = { path = "../../../substrate/utils/wasm-builder" } diff --git a/polkadot/runtime/test-runtime/src/lib.rs b/polkadot/runtime/test-runtime/src/lib.rs index b74def5de8aadd718df48b27aff1a7ca324389c3..f01382509501186bbe6efbdad67eea536ce59990 100644 --- a/polkadot/runtime/test-runtime/src/lib.rs +++ b/polkadot/runtime/test-runtime/src/lib.rs @@ -20,7 +20,7 @@ // `construct_runtime!` does a lot of recursion and requires us to increase the limit to 256. #![recursion_limit = "256"] -use pallet_transaction_payment::CurrencyAdapter; +use pallet_transaction_payment::FungibleAdapter; use parity_scale_codec::Encode; use sp_std::{collections::btree_map::BTreeMap, prelude::*}; @@ -30,7 +30,7 @@ use polkadot_runtime_parachains::{ disputes::slashing as parachains_slashing, dmp as parachains_dmp, hrmp as parachains_hrmp, inclusion as parachains_inclusion, initializer as parachains_initializer, origin as parachains_origin, paras as parachains_paras, - paras_inherent as parachains_paras_inherent, runtime_api_impl::v7 as runtime_impl, + paras_inherent as parachains_paras_inherent, runtime_api_impl::v10 as runtime_impl, scheduler as parachains_scheduler, session_info as parachains_session_info, shared as parachains_shared, }; @@ -43,7 +43,7 @@ use frame_election_provider_support::{ }; use frame_support::{ construct_runtime, derive_impl, - genesis_builder_helper::{build_config, create_default_config}, + genesis_builder_helper::{build_state, get_preset}, parameter_types, traits::{KeyOwnerProofSystem, WithdrawReasons}, }; @@ -139,7 +139,7 @@ parameter_types! { pub const SS58Prefix: u8 = 42; } -#[derive_impl(frame_system::config_preludes::RelayChainDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::RelayChainDefaultConfig)] impl frame_system::Config for Runtime { type BlockWeights = BlockWeights; type BlockLength = BlockLength; @@ -233,7 +233,7 @@ parameter_types! { impl pallet_transaction_payment::Config for Runtime { type RuntimeEvent = RuntimeEvent; - type OnChargeTransaction = CurrencyAdapter; + type OnChargeTransaction = FungibleAdapter; type OperationalFeeMultiplier = OperationalFeeMultiplier; type WeightToFee = WeightToFee; type LengthToFee = frame_support::weights::ConstantMultiplier; @@ -767,7 +767,7 @@ sp_api::impl_runtime_apis! { Executive::execute_block(block); } - fn initialize_block(header: &::Header) { + fn initialize_block(header: &::Header) -> sp_runtime::ExtrinsicInclusionMode { Executive::initialize_block(header) } } @@ -829,6 +829,7 @@ sp_api::impl_runtime_apis! { } } + #[api_version(10)] impl primitives::runtime_api::ParachainHost for Runtime { fn validators() -> Vec { runtime_impl::validators::() @@ -956,6 +957,30 @@ sp_api::impl_runtime_apis! { key_ownership_proof, ) } + + fn minimum_backing_votes() -> u32 { + runtime_impl::minimum_backing_votes::() + } + + fn para_backing_state(para_id: ParaId) -> Option { + runtime_impl::backing_state::(para_id) + } + + fn async_backing_params() -> primitives::AsyncBackingParams { + runtime_impl::async_backing_params::() + } + + fn approval_voting_params() -> primitives::ApprovalVotingParams { + runtime_impl::approval_voting_params::() + } + + fn disabled_validators() -> Vec { + runtime_impl::disabled_validators::() + } + + fn node_features() -> primitives::NodeFeatures { + runtime_impl::node_features::() + } } impl beefy_primitives::BeefyApi for Runtime { @@ -1146,12 +1171,16 @@ sp_api::impl_runtime_apis! { } impl sp_genesis_builder::GenesisBuilder for Runtime { - fn create_default_config() -> Vec { - create_default_config::() + fn build_state(config: Vec) -> sp_genesis_builder::Result { + build_state::(config) + } + + fn get_preset(id: &Option) -> Option> { + get_preset::(id, |_| None) } - fn build_config(config: Vec) -> sp_genesis_builder::Result { - build_config::(config) + fn preset_names() -> Vec { + vec![] } } } diff --git a/polkadot/runtime/test-runtime/src/xcm_config.rs b/polkadot/runtime/test-runtime/src/xcm_config.rs index a81d35f4d788f1628cf20cf5cbd0e366828101ff..8411b79f2529d8e2d26815bd9ab806457e4ca99b 100644 --- a/polkadot/runtime/test-runtime/src/xcm_config.rs +++ b/polkadot/runtime/test-runtime/src/xcm_config.rs @@ -16,14 +16,16 @@ use frame_support::{ parameter_types, - traits::{Everything, Nothing}, + traits::{Everything, Get, Nothing}, weights::Weight, }; use frame_system::EnsureRoot; +use polkadot_runtime_parachains::FeeTracker; +use runtime_common::xcm_sender::{ChildParachainRouter, PriceForMessageDelivery}; use xcm::latest::prelude::*; use xcm_builder::{ AllowUnpaidExecutionFrom, EnsureXcmOrigin, FixedWeightBounds, FrameTransactionalProcessor, - SignedAccountId32AsNative, SignedToAccountId32, + SignedAccountId32AsNative, SignedToAccountId32, WithUniqueTopic, }; use xcm_executor::{ traits::{TransactAsset, WeightTrader}, @@ -36,6 +38,8 @@ parameter_types! { pub const MaxInstructions: u32 = 100; pub const MaxAssetsIntoHolding: u32 = 16; pub const UniversalLocation: xcm::latest::InteriorLocation = xcm::latest::Junctions::Here; + pub TokenLocation: Location = Here.into_location(); + pub FeeAssetId: AssetId = AssetId(TokenLocation::get()); } /// Type to convert an `Origin` type value into a `Location` value which represents an interior @@ -45,17 +49,43 @@ pub type LocalOriginToLocation = ( SignedToAccountId32, ); -pub struct DoNothingRouter; -impl SendXcm for DoNothingRouter { - type Ticket = (); - fn validate(_dest: &mut Option, _msg: &mut Option>) -> SendResult<()> { - Ok(((), Assets::new())) - } - fn deliver(_: ()) -> Result { - Ok([0; 32]) +/// Implementation of [`PriceForMessageDelivery`], returning a different price +/// based on whether a message contains a reanchored asset or not. +/// This implementation ensures that messages with non-reanchored assets return higher +/// prices than messages with reanchored assets. +/// Useful for `deposit_reserve_asset_works_for_any_xcm_sender` integration test. +pub struct TestDeliveryPrice(sp_std::marker::PhantomData<(A, F)>); +impl, F: FeeTracker> PriceForMessageDelivery for TestDeliveryPrice { + type Id = F::Id; + + fn price_for_delivery(_: Self::Id, msg: &Xcm<()>) -> Assets { + let base_fee: super::Balance = 1_000_000; + + let parents = msg.iter().find_map(|xcm| match xcm { + ReserveAssetDeposited(assets) => { + let AssetId(location) = &assets.inner().first().unwrap().id; + Some(location.parents) + }, + _ => None, + }); + + // If no asset is found, price defaults to `base_fee`. + let amount = base_fee + .saturating_add(base_fee.saturating_mul(parents.unwrap_or(0) as super::Balance)); + + (A::get(), amount).into() } } +pub type PriceForChildParachainDelivery = TestDeliveryPrice; + +/// The XCM router. When we want to send an XCM message, we use this type. It amalgamates all of our +/// individual routers. +pub type XcmRouter = WithUniqueTopic< + // Only one router so far - use DMP to communicate with child parachains. + ChildParachainRouter, +>; + pub type Barrier = AllowUnpaidExecutionFrom; pub struct DummyAssetTransactor; @@ -99,7 +129,7 @@ type OriginConverter = ( pub struct XcmConfig; impl xcm_executor::Config for XcmConfig { type RuntimeCall = super::RuntimeCall; - type XcmSender = DoNothingRouter; + type XcmSender = XcmRouter; type AssetTransactor = DummyAssetTransactor; type OriginConverter = OriginConverter; type IsReserve = (); @@ -123,6 +153,9 @@ impl xcm_executor::Config for XcmConfig { type SafeCallFilter = Everything; type Aliasers = Nothing; type TransactionalProcessor = FrameTransactionalProcessor; + type HrmpNewChannelOpenRequestHandler = (); + type HrmpChannelAcceptedHandler = (); + type HrmpChannelClosingHandler = (); } impl pallet_xcm::Config for crate::Runtime { @@ -133,7 +166,7 @@ impl pallet_xcm::Config for crate::Runtime { type UniversalLocation = UniversalLocation; type SendXcmOrigin = EnsureXcmOrigin; type Weigher = FixedWeightBounds; - type XcmRouter = DoNothingRouter; + type XcmRouter = XcmRouter; type XcmExecuteFilter = Everything; type XcmExecutor = xcm_executor::XcmExecutor; type XcmTeleportFilter = Everything; diff --git a/polkadot/runtime/westend/Cargo.toml b/polkadot/runtime/westend/Cargo.toml index 0ea2436b6811eb74a4e402eb49c38b176592a869..d726adfb8e6e439edd2b5f378f5b5160ac70e6be 100644 --- a/polkadot/runtime/westend/Cargo.toml +++ b/polkadot/runtime/westend/Cargo.toml @@ -13,11 +13,11 @@ workspace = true [dependencies] bitvec = { version = "1.0.0", default-features = false, features = ["alloc"] } parity-scale-codec = { version = "3.6.1", default-features = false, features = ["derive", "max-encoded-len"] } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -log = { version = "0.4.17", default-features = false } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +log = { workspace = true } rustc-hex = { version = "2.1.0", default-features = false } -serde = { version = "1.0.195", default-features = false } -serde_derive = { version = "1.0.117", optional = true } +serde = { workspace = true } +serde_derive = { optional = true, workspace = true } smallvec = "1.8.0" authority-discovery-primitives = { package = "sp-authority-discovery", path = "../../../substrate/primitives/authority-discovery", default-features = false } @@ -45,7 +45,7 @@ sp-npos-elections = { path = "../../../substrate/primitives/npos-elections", def frame-election-provider-support = { path = "../../../substrate/frame/election-provider-support", default-features = false } frame-executive = { path = "../../../substrate/frame/executive", default-features = false } -frame-support = { path = "../../../substrate/frame/support", default-features = false, features = ["tuples-96"] } +frame-support = { path = "../../../substrate/frame/support", default-features = false, features = ["experimental", "tuples-96"] } frame-system = { path = "../../../substrate/frame/system", default-features = false } frame-system-rpc-runtime-api = { path = "../../../substrate/frame/system/rpc/runtime-api", default-features = false } westend-runtime-constants = { package = "westend-runtime-constants", path = "constants", default-features = false } @@ -64,7 +64,6 @@ pallet-election-provider-multi-phase = { path = "../../../substrate/frame/electi pallet-fast-unstake = { path = "../../../substrate/frame/fast-unstake", default-features = false } pallet-grandpa = { path = "../../../substrate/frame/grandpa", default-features = false } pallet-identity = { path = "../../../substrate/frame/identity", default-features = false } -pallet-im-online = { path = "../../../substrate/frame/im-online", default-features = false } pallet-indices = { path = "../../../substrate/frame/indices", default-features = false } pallet-membership = { path = "../../../substrate/frame/membership", default-features = false } pallet-message-queue = { path = "../../../substrate/frame/message-queue", default-features = false } @@ -114,12 +113,13 @@ runtime-parachains = { package = "polkadot-runtime-parachains", path = "../parac xcm = { package = "staging-xcm", path = "../../xcm", default-features = false } xcm-executor = { package = "staging-xcm-executor", path = "../../xcm/xcm-executor", default-features = false } xcm-builder = { package = "staging-xcm-builder", path = "../../xcm/xcm-builder", default-features = false } +xcm-fee-payment-runtime-api = { path = "../../xcm/xcm-fee-payment-runtime-api", default-features = false } [dev-dependencies] hex-literal = "0.4.1" tiny-keccak = { version = "2.0.2", features = ["keccak"] } keyring = { package = "sp-keyring", path = "../../../substrate/primitives/keyring" } -serde_json = "1.0.111" +serde_json = { workspace = true, default-features = true } remote-externalities = { package = "frame-remote-externalities", path = "../../../substrate/utils/frame/remote-externalities" } tokio = { version = "1.24.2", features = ["macros"] } sp-tracing = { path = "../../../substrate/primitives/tracing", default-features = false } @@ -166,7 +166,6 @@ std = [ "pallet-fast-unstake/std", "pallet-grandpa/std", "pallet-identity/std", - "pallet-im-online/std", "pallet-indices/std", "pallet-membership/std", "pallet-message-queue/std", @@ -227,6 +226,7 @@ std = [ "westend-runtime-constants/std", "xcm-builder/std", "xcm-executor/std", + "xcm-fee-payment-runtime-api/std", "xcm/std", ] runtime-benchmarks = [ @@ -249,7 +249,6 @@ runtime-benchmarks = [ "pallet-fast-unstake/runtime-benchmarks", "pallet-grandpa/runtime-benchmarks", "pallet-identity/runtime-benchmarks", - "pallet-im-online/runtime-benchmarks", "pallet-indices/runtime-benchmarks", "pallet-membership/runtime-benchmarks", "pallet-message-queue/runtime-benchmarks", @@ -308,7 +307,6 @@ try-runtime = [ "pallet-fast-unstake/try-runtime", "pallet-grandpa/try-runtime", "pallet-identity/try-runtime", - "pallet-im-online/try-runtime", "pallet-indices/try-runtime", "pallet-membership/try-runtime", "pallet-message-queue/try-runtime", diff --git a/polkadot/runtime/westend/constants/src/lib.rs b/polkadot/runtime/westend/constants/src/lib.rs index 848cccd559dc3e50cbd2a50c4df6a643910fe35c..c98f4b114fd88241dea1e2e5ffcf694848448007 100644 --- a/polkadot/runtime/westend/constants/src/lib.rs +++ b/polkadot/runtime/westend/constants/src/lib.rs @@ -107,6 +107,8 @@ pub mod system_parachain { pub const COLLECTIVES_ID: u32 = 1001; /// BridgeHub parachain ID. pub const BRIDGE_HUB_ID: u32 = 1002; + /// Encointer parachain ID. + pub const ENCOINTER_ID: u32 = 1003; /// People Chain parachain ID. pub const PEOPLE_ID: u32 = 1004; /// Brokerage parachain ID. @@ -128,6 +130,8 @@ pub mod xcm { const ROOT_INDEX: u32 = 0; // The bodies corresponding to the Polkadot OpenGov Origins. pub const FELLOWSHIP_ADMIN_INDEX: u32 = 1; + #[deprecated = "Will be removed after August 2024; Use `xcm::latest::BodyId::Treasury` \ + instead"] pub const TREASURER_INDEX: u32 = 2; } } diff --git a/polkadot/runtime/westend/src/impls.rs b/polkadot/runtime/westend/src/impls.rs index 71e6b696a20a0feb89e669067d02b12e6eeb89fd..d8741c939a507d49c181b3620d322c08692d730b 100644 --- a/polkadot/runtime/westend/src/impls.rs +++ b/polkadot/runtime/westend/src/impls.rs @@ -167,11 +167,16 @@ where }, ]); + let encoded_versioned_xcm = + VersionedXcm::V4(program).encode().try_into().map_err(|error| { + log::error!(target: "runtime::on_reap_identity", "XCM too large, error: {:?}", error); + pallet_xcm::Error::::XcmTooLarge + })?; // send - let _ = >::send( + let _ = >::send_blob( RawOrigin::Root.into(), Box::new(VersionedLocation::V4(destination)), - Box::new(VersionedXcm::V4(program)), + encoded_versioned_xcm, )?; Ok(()) } diff --git a/polkadot/runtime/westend/src/lib.rs b/polkadot/runtime/westend/src/lib.rs index 25a40051ac756bce4056281c3ee96227e77e778c..ab356ae6ca4ede128bce82129589dffb63694ebb 100644 --- a/polkadot/runtime/westend/src/lib.rs +++ b/polkadot/runtime/westend/src/lib.rs @@ -17,7 +17,7 @@ //! The Westend runtime. This can be compiled with `#[no_std]`, ready for Wasm. #![cfg_attr(not(feature = "std"), no_std)] -// `construct_runtime!` does a lot of recursion and requires us to increase the limit. +// `#[frame_support::runtime]!` does a lot of recursion and requires us to increase the limit. #![recursion_limit = "512"] use authority_discovery_primitives::AuthorityId as AuthorityDiscoveryId; @@ -27,32 +27,30 @@ use beefy_primitives::{ }; use frame_election_provider_support::{bounds::ElectionBoundsBuilder, onchain, SequentialPhragmen}; use frame_support::{ - construct_runtime, derive_impl, - genesis_builder_helper::{build_config, create_default_config}, + derive_impl, + genesis_builder_helper::{build_state, get_preset}, parameter_types, traits::{ fungible::HoldConsideration, ConstU32, Contains, EitherOf, EitherOfDiverse, EverythingBut, InstanceFilter, KeyOwnerProofSystem, LinearStoragePrice, ProcessMessage, ProcessMessageError, WithdrawReasons, }, - weights::{ConstantMultiplier, WeightMeter}, + weights::{ConstantMultiplier, WeightMeter, WeightToFee as _}, PalletId, }; use frame_system::{EnsureRoot, EnsureSigned}; use pallet_grandpa::{fg_primitives, AuthorityId as GrandpaId}; use pallet_identity::legacy::IdentityInfo; use pallet_session::historical as session_historical; -use pallet_transaction_payment::{CurrencyAdapter, FeeDetails, RuntimeDispatchInfo}; +use pallet_transaction_payment::{FeeDetails, FungibleAdapter, RuntimeDispatchInfo}; use parity_scale_codec::{Decode, Encode, MaxEncodedLen}; use primitives::{ - slashing, - vstaging::{ApprovalVotingParams, NodeFeatures}, - AccountId, AccountIndex, Balance, BlockNumber, CandidateEvent, CandidateHash, - CommittedCandidateReceipt, CoreState, DisputeState, ExecutorParams, GroupRotationInfo, Hash, - Id as ParaId, InboundDownwardMessage, InboundHrmpMessage, Moment, Nonce, - OccupiedCoreAssumption, PersistedValidationData, PvfCheckStatement, ScrapedOnChainVotes, - SessionInfo, Signature, ValidationCode, ValidationCodeHash, ValidatorId, ValidatorIndex, - ValidatorSignature, PARACHAIN_KEY_TYPE_ID, + slashing, AccountId, AccountIndex, ApprovalVotingParams, Balance, BlockNumber, CandidateEvent, + CandidateHash, CommittedCandidateReceipt, CoreIndex, CoreState, DisputeState, ExecutorParams, + GroupRotationInfo, Hash, Id as ParaId, InboundDownwardMessage, InboundHrmpMessage, Moment, + NodeFeatures, Nonce, OccupiedCoreAssumption, PersistedValidationData, PvfCheckStatement, + ScrapedOnChainVotes, SessionInfo, Signature, ValidationCode, ValidationCodeHash, ValidatorId, + ValidatorIndex, ValidatorSignature, PARACHAIN_KEY_TYPE_ID, }; use runtime_common::{ assigned_slots, auctions, crowdloan, @@ -61,19 +59,22 @@ use runtime_common::{ impls::{ LocatableAssetConverter, ToAuthor, VersionedLocatableAsset, VersionedLocationConverter, }, - paras_registrar, paras_sudo_wrapper, prod_or_fast, slots, BalanceToU256, BlockHashCount, - BlockLength, CurrencyToVote, SlowAdjustingFeeUpdate, U256ToBalance, + paras_registrar, paras_sudo_wrapper, prod_or_fast, slots, + traits::{Leaser, OnSwap}, + BalanceToU256, BlockHashCount, BlockLength, CurrencyToVote, SlowAdjustingFeeUpdate, + U256ToBalance, }; use runtime_parachains::{ - assigner_parachains as parachains_assigner_parachains, - configuration as parachains_configuration, disputes as parachains_disputes, + assigner_coretime as parachains_assigner_coretime, + assigner_on_demand as parachains_assigner_on_demand, configuration as parachains_configuration, + coretime, disputes as parachains_disputes, disputes::slashing as parachains_slashing, dmp as parachains_dmp, hrmp as parachains_hrmp, inclusion as parachains_inclusion, inclusion::{AggregateMessageOrigin, UmpQueueId}, initializer as parachains_initializer, origin as parachains_origin, paras as parachains_paras, paras_inherent as parachains_paras_inherent, reward_points as parachains_reward_points, runtime_api_impl::{ - v7 as parachains_runtime_api_impl, vstaging as parachains_staging_runtime_api_impl, + v10 as parachains_runtime_api_impl, vstaging as vstaging_parachains_runtime_api_impl, }, scheduler as parachains_scheduler, session_info as parachains_session_info, shared as parachains_shared, @@ -89,20 +90,24 @@ use sp_runtime::{ Keccak256, OpaqueKeys, SaturatedConversion, Verify, }, transaction_validity::{TransactionPriority, TransactionSource, TransactionValidity}, - ApplyExtrinsicResult, BoundToRuntimeAppPublic, FixedU128, KeyTypeId, Perbill, Percent, Permill, - RuntimeAppPublic, + ApplyExtrinsicResult, FixedU128, KeyTypeId, Perbill, Percent, Permill, }; use sp_staking::SessionIndex; -use sp_std::{collections::btree_map::BTreeMap, prelude::*}; +use sp_std::{ + collections::{btree_map::BTreeMap, vec_deque::VecDeque}, + prelude::*, +}; #[cfg(any(feature = "std", test))] use sp_version::NativeVersion; use sp_version::RuntimeVersion; use xcm::{ - latest::{InteriorLocation, Junction, Junction::PalletInstance}, - VersionedLocation, + latest::prelude::*, IntoVersion, VersionedAssetId, VersionedAssets, VersionedLocation, + VersionedXcm, }; use xcm_builder::PayOverXcm; +use xcm_fee_payment_runtime_api::Error as XcmPaymentApiError; + pub use frame_system::Call as SystemCall; pub use pallet_balances::Call as BalancesCall; pub use pallet_election_provider_multi_phase::{Call as EPMCall, GeometricDepositBase}; @@ -147,7 +152,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("westend"), impl_name: create_runtime_str!("parity-westend"), authoring_version: 2, - spec_version: 1_006_001, + spec_version: 1_010_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 24, @@ -183,7 +188,7 @@ parameter_types! { pub const SS58Prefix: u8 = 42; } -#[derive_impl(frame_system::config_preludes::RelayChainDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::RelayChainDefaultConfig)] impl frame_system::Config for Runtime { type BaseCallFilter = EverythingBut; type BlockWeights = BlockWeights; @@ -349,9 +354,11 @@ parameter_types! { pub struct ParaHeadsRootProvider; impl BeefyDataProvider for ParaHeadsRootProvider { fn extra_data() -> H256 { - let mut para_heads: Vec<(u32, Vec)> = Paras::parachains() + let mut para_heads: Vec<(u32, Vec)> = parachains_paras::Parachains::::get() .into_iter() - .filter_map(|id| Paras::para_head(&id).map(|head| (id.into(), head.0))) + .filter_map(|id| { + parachains_paras::Heads::::get(&id).map(|head| (id.into(), head.0)) + }) .collect(); para_heads.sort_by_key(|k| k.0); binary_merkle_tree::merkle_root::( @@ -377,7 +384,7 @@ parameter_types! { impl pallet_transaction_payment::Config for Runtime { type RuntimeEvent = RuntimeEvent; - type OnChargeTransaction = CurrencyAdapter>; + type OnChargeTransaction = FungibleAdapter>; type OperationalFeeMultiplier = OperationalFeeMultiplier; type WeightToFee = WeightToFee; type LengthToFee = ConstantMultiplier; @@ -404,46 +411,6 @@ parameter_types! { pub const Offset: BlockNumber = 0; } -#[derive(Clone, Debug, PartialEq, Eq, Encode, Decode)] -pub struct OldSessionKeys { - pub grandpa: ::Public, - pub babe: ::Public, - pub im_online: pallet_im_online::sr25519::AuthorityId, - pub para_validator: ::Public, - pub para_assignment: ::Public, - pub authority_discovery: ::Public, - pub beefy: ::Public, -} - -impl OpaqueKeys for OldSessionKeys { - type KeyTypeIdProviders = (); - fn key_ids() -> &'static [KeyTypeId] { - &[ - <::Public>::ID, - <::Public>::ID, - sp_core::crypto::key_types::IM_ONLINE, - <::Public>::ID, - <::Public>::ID, - <::Public>::ID, - <::Public>::ID, - ] - } - fn get_raw(&self, i: KeyTypeId) -> &[u8] { - match i { - <::Public>::ID => self.grandpa.as_ref(), - <::Public>::ID => self.babe.as_ref(), - sp_core::crypto::key_types::IM_ONLINE => self.im_online.as_ref(), - <::Public>::ID => self.para_validator.as_ref(), - <::Public>::ID => - self.para_assignment.as_ref(), - <::Public>::ID => - self.authority_discovery.as_ref(), - <::Public>::ID => self.beefy.as_ref(), - _ => &[], - } - } -} - impl_opaque_keys! { pub struct SessionKeys { pub grandpa: Grandpa, @@ -455,18 +422,6 @@ impl_opaque_keys! { } } -// remove this when removing `OldSessionKeys` -fn transform_session_keys(_v: AccountId, old: OldSessionKeys) -> SessionKeys { - SessionKeys { - grandpa: old.grandpa, - babe: old.babe, - para_validator: old.para_validator, - para_assignment: old.para_assignment, - authority_discovery: old.authority_discovery, - beefy: old.beefy, - } -} - impl pallet_session::Config for Runtime { type RuntimeEvent = RuntimeEvent; type ValidatorId = AccountId; @@ -1143,7 +1098,7 @@ impl parachains_paras::Config for Runtime { type QueueFootprinter = ParaInclusion; type NextSessionRotation = Babe; type OnNewHead = (); - type AssignCoretime = (); + type AssignCoretime = CoretimeAssignmentProvider; } parameter_types! { @@ -1185,6 +1140,7 @@ impl pallet_message_queue::Config for Runtime { type HeapSize = MessageQueueHeapSize; type MaxStale = MessageQueueMaxStale; type ServiceWeight = MessageQueueServiceWeight; + type IdleMaxServiceWeight = MessageQueueServiceWeight; #[cfg(not(feature = "runtime-benchmarks"))] type MessageProcessor = MessageProcessor; #[cfg(feature = "runtime-benchmarks")] @@ -1212,20 +1168,40 @@ impl parachains_paras_inherent::Config for Runtime { impl parachains_scheduler::Config for Runtime { // If you change this, make sure the `Assignment` type of the new provider is binary compatible, // otherwise provide a migration. - type AssignmentProvider = ParachainsAssignmentProvider; + type AssignmentProvider = CoretimeAssignmentProvider; } parameter_types! { pub const BrokerId: u32 = BROKER_ID; } -impl parachains_assigner_parachains::Config for Runtime {} +impl coretime::Config for Runtime { + type RuntimeOrigin = RuntimeOrigin; + type RuntimeEvent = RuntimeEvent; + type Currency = Balances; + type BrokerId = BrokerId; + type WeightInfo = weights::runtime_parachains_coretime::WeightInfo; + type SendXcm = crate::xcm_config::XcmRouter; +} + +parameter_types! { + pub const OnDemandTrafficDefaultValue: FixedU128 = FixedU128::from_u32(1); +} + +impl parachains_assigner_on_demand::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type Currency = Balances; + type TrafficDefaultValue = OnDemandTrafficDefaultValue; + type WeightInfo = weights::runtime_parachains_assigner_on_demand::WeightInfo; +} + +impl parachains_assigner_coretime::Config for Runtime {} impl parachains_initializer::Config for Runtime { type Randomness = pallet_babe::RandomnessFromOneEpochAgo; type ForceOrigin = EnsureRoot; type WeightInfo = weights::runtime_parachains_initializer::WeightInfo; - type CoretimeOnNewSession = (); + type CoretimeOnNewSession = Coretime; } impl paras_sudo_wrapper::Config for Runtime {} @@ -1279,7 +1255,7 @@ impl paras_registrar::Config for Runtime { type RuntimeOrigin = RuntimeOrigin; type RuntimeEvent = RuntimeEvent; type Currency = Balances; - type OnSwap = (Crowdloan, Slots); + type OnSwap = (Crowdloan, Slots, SwapLeases); type ParaDeposit = ParaDeposit; type DataDepositPerByte = RegistrarDataDepositPerByte; type WeightInfo = weights::runtime_common_paras_registrar::WeightInfo; @@ -1366,6 +1342,7 @@ impl pallet_nomination_pools::Config for Runtime { type MaxUnbonding = ::MaxUnlockingChunks; type PalletId = PoolsPalletId; type MaxPointsToBalance = MaxPointsToBalance; + type AdminOrigin = EitherOf, StakingAdmin>; } impl pallet_root_testing::Config for Runtime { @@ -1391,128 +1368,211 @@ impl pallet_asset_rate::Config for Runtime { type BenchmarkHelper = runtime_common::impls::benchmarks::AssetRateArguments; } -construct_runtime! { - pub enum Runtime - { - // Basic stuff; balances is uncallable initially. - System: frame_system = 0, - - // Babe must be before session. - Babe: pallet_babe = 1, - - Timestamp: pallet_timestamp = 2, - Indices: pallet_indices = 3, - Balances: pallet_balances = 4, - TransactionPayment: pallet_transaction_payment = 26, - - // Consensus support. - // Authorship must be before session in order to note author in the correct session and era. - Authorship: pallet_authorship = 5, - Staking: pallet_staking = 6, - Offences: pallet_offences = 7, - Historical: session_historical = 27, - - Session: pallet_session = 8, - Grandpa: pallet_grandpa = 10, - AuthorityDiscovery: pallet_authority_discovery = 12, - - // Utility module. - Utility: pallet_utility = 16, - - // Less simple identity module. - Identity: pallet_identity = 17, - - // Social recovery module. - Recovery: pallet_recovery = 18, - - // Vesting. Usable initially, but removed once all vesting is finished. - Vesting: pallet_vesting = 19, - - // System scheduler. - Scheduler: pallet_scheduler = 20, - - // Preimage registrar. - Preimage: pallet_preimage = 28, - - // Sudo. - Sudo: pallet_sudo = 21, - - // Proxy module. Late addition. - Proxy: pallet_proxy = 22, - - // Multisig module. Late addition. - Multisig: pallet_multisig = 23, - - // Election pallet. Only works with staking, but placed here to maintain indices. - ElectionProviderMultiPhase: pallet_election_provider_multi_phase = 24, - - // Provides a semi-sorted list of nominators for staking. - VoterList: pallet_bags_list:: = 25, - - // Nomination pools for staking. - NominationPools: pallet_nomination_pools = 29, - - // Fast unstake pallet: extension to staking. - FastUnstake: pallet_fast_unstake = 30, - - // OpenGov - ConvictionVoting: pallet_conviction_voting = 31, - Referenda: pallet_referenda = 32, - Origins: pallet_custom_origins = 35, - Whitelist: pallet_whitelist = 36, - - // Treasury - Treasury: pallet_treasury = 37, - - // Parachains pallets. Start indices at 40 to leave room. - ParachainsOrigin: parachains_origin = 41, - Configuration: parachains_configuration = 42, - ParasShared: parachains_shared = 43, - ParaInclusion: parachains_inclusion = 44, - ParaInherent: parachains_paras_inherent = 45, - ParaScheduler: parachains_scheduler = 46, - Paras: parachains_paras = 47, - Initializer: parachains_initializer = 48, - Dmp: parachains_dmp = 49, - // RIP Ump 50 - Hrmp: parachains_hrmp = 51, - ParaSessionInfo: parachains_session_info = 52, - ParasDisputes: parachains_disputes = 53, - ParasSlashing: parachains_slashing = 54, - ParachainsAssignmentProvider: parachains_assigner_parachains = 55, - - // Parachain Onboarding Pallets. Start indices at 60 to leave room. - Registrar: paras_registrar = 60, - Slots: slots = 61, - ParasSudoWrapper: paras_sudo_wrapper = 62, - Auctions: auctions = 63, - Crowdloan: crowdloan = 64, - AssignedSlots: assigned_slots = 65, - - // Pallet for sending XCM. - XcmPallet: pallet_xcm = 99, - - // Generalized message queue - MessageQueue: pallet_message_queue = 100, - - // Asset rate. - AssetRate: pallet_asset_rate = 101, - - // Root testing pallet. - RootTesting: pallet_root_testing = 102, - - // BEEFY Bridges support. - Beefy: pallet_beefy = 200, - // MMR leaf construction must be after session in order to have a leaf's next_auth_set - // refer to block. See issue polkadot-fellows/runtimes#160 for details. - Mmr: pallet_mmr = 201, - BeefyMmrLeaf: pallet_beefy_mmr = 202, - - // Pallet for migrating Identity to a parachain. To be removed post-migration. - IdentityMigrator: identity_migrator = 248, +// Notify `coretime` pallet when a lease swap occurs +pub struct SwapLeases; +impl OnSwap for SwapLeases { + fn on_swap(one: ParaId, other: ParaId) { + coretime::Pallet::::on_legacy_lease_swap(one, other); } } +#[frame_support::runtime(legacy_ordering)] +mod runtime { + #[runtime::runtime] + #[runtime::derive( + RuntimeCall, + RuntimeEvent, + RuntimeError, + RuntimeOrigin, + RuntimeFreezeReason, + RuntimeHoldReason, + RuntimeSlashReason, + RuntimeLockId, + RuntimeTask + )] + pub struct Runtime; + + // Basic stuff; balances is uncallable initially. + #[runtime::pallet_index(0)] + pub type System = frame_system; + + // Babe must be before session. + #[runtime::pallet_index(1)] + pub type Babe = pallet_babe; + + #[runtime::pallet_index(2)] + pub type Timestamp = pallet_timestamp; + #[runtime::pallet_index(3)] + pub type Indices = pallet_indices; + #[runtime::pallet_index(4)] + pub type Balances = pallet_balances; + #[runtime::pallet_index(26)] + pub type TransactionPayment = pallet_transaction_payment; + + // Consensus support. + // Authorship must be before session in order to note author in the correct session and era. + #[runtime::pallet_index(5)] + pub type Authorship = pallet_authorship; + #[runtime::pallet_index(6)] + pub type Staking = pallet_staking; + #[runtime::pallet_index(7)] + pub type Offences = pallet_offences; + #[runtime::pallet_index(27)] + pub type Historical = session_historical; + + #[runtime::pallet_index(8)] + pub type Session = pallet_session; + #[runtime::pallet_index(10)] + pub type Grandpa = pallet_grandpa; + #[runtime::pallet_index(12)] + pub type AuthorityDiscovery = pallet_authority_discovery; + + // Utility module. + #[runtime::pallet_index(16)] + pub type Utility = pallet_utility; + + // Less simple identity module. + #[runtime::pallet_index(17)] + pub type Identity = pallet_identity; + + // Social recovery module. + #[runtime::pallet_index(18)] + pub type Recovery = pallet_recovery; + + // Vesting. Usable initially, but removed once all vesting is finished. + #[runtime::pallet_index(19)] + pub type Vesting = pallet_vesting; + + // System scheduler. + #[runtime::pallet_index(20)] + pub type Scheduler = pallet_scheduler; + + // Preimage registrar. + #[runtime::pallet_index(28)] + pub type Preimage = pallet_preimage; + + // Sudo. + #[runtime::pallet_index(21)] + pub type Sudo = pallet_sudo; + + // Proxy module. Late addition. + #[runtime::pallet_index(22)] + pub type Proxy = pallet_proxy; + + // Multisig module. Late addition. + #[runtime::pallet_index(23)] + pub type Multisig = pallet_multisig; + + // Election pallet. Only works with staking, but placed here to maintain indices. + #[runtime::pallet_index(24)] + pub type ElectionProviderMultiPhase = pallet_election_provider_multi_phase; + + // Provides a semi-sorted list of nominators for staking. + #[runtime::pallet_index(25)] + pub type VoterList = pallet_bags_list; + + // Nomination pools for staking. + #[runtime::pallet_index(29)] + pub type NominationPools = pallet_nomination_pools; + + // Fast unstake pallet = extension to staking. + #[runtime::pallet_index(30)] + pub type FastUnstake = pallet_fast_unstake; + + // OpenGov + #[runtime::pallet_index(31)] + pub type ConvictionVoting = pallet_conviction_voting; + #[runtime::pallet_index(32)] + pub type Referenda = pallet_referenda; + #[runtime::pallet_index(35)] + pub type Origins = pallet_custom_origins; + #[runtime::pallet_index(36)] + pub type Whitelist = pallet_whitelist; + + // Treasury + #[runtime::pallet_index(37)] + pub type Treasury = pallet_treasury; + + // Parachains pallets. Start indices at 40 to leave room. + #[runtime::pallet_index(41)] + pub type ParachainsOrigin = parachains_origin; + #[runtime::pallet_index(42)] + pub type Configuration = parachains_configuration; + #[runtime::pallet_index(43)] + pub type ParasShared = parachains_shared; + #[runtime::pallet_index(44)] + pub type ParaInclusion = parachains_inclusion; + #[runtime::pallet_index(45)] + pub type ParaInherent = parachains_paras_inherent; + #[runtime::pallet_index(46)] + pub type ParaScheduler = parachains_scheduler; + #[runtime::pallet_index(47)] + pub type Paras = parachains_paras; + #[runtime::pallet_index(48)] + pub type Initializer = parachains_initializer; + #[runtime::pallet_index(49)] + pub type Dmp = parachains_dmp; + // RIP Ump 50 + #[runtime::pallet_index(51)] + pub type Hrmp = parachains_hrmp; + #[runtime::pallet_index(52)] + pub type ParaSessionInfo = parachains_session_info; + #[runtime::pallet_index(53)] + pub type ParasDisputes = parachains_disputes; + #[runtime::pallet_index(54)] + pub type ParasSlashing = parachains_slashing; + #[runtime::pallet_index(56)] + pub type OnDemandAssignmentProvider = parachains_assigner_on_demand; + #[runtime::pallet_index(57)] + pub type CoretimeAssignmentProvider = parachains_assigner_coretime; + + // Parachain Onboarding Pallets. Start indices at 60 to leave room. + #[runtime::pallet_index(60)] + pub type Registrar = paras_registrar; + #[runtime::pallet_index(61)] + pub type Slots = slots; + #[runtime::pallet_index(62)] + pub type ParasSudoWrapper = paras_sudo_wrapper; + #[runtime::pallet_index(63)] + pub type Auctions = auctions; + #[runtime::pallet_index(64)] + pub type Crowdloan = crowdloan; + #[runtime::pallet_index(65)] + pub type AssignedSlots = assigned_slots; + #[runtime::pallet_index(66)] + pub type Coretime = coretime; + + // Pallet for sending XCM. + #[runtime::pallet_index(99)] + pub type XcmPallet = pallet_xcm; + + // Generalized message queue + #[runtime::pallet_index(100)] + pub type MessageQueue = pallet_message_queue; + + // Asset rate. + #[runtime::pallet_index(101)] + pub type AssetRate = pallet_asset_rate; + + // Root testing pallet. + #[runtime::pallet_index(102)] + pub type RootTesting = pallet_root_testing; + + // BEEFY Bridges support. + #[runtime::pallet_index(200)] + pub type Beefy = pallet_beefy; + // MMR leaf construction must be after session in order to have a leaf's next_auth_set + // refer to block. See issue polkadot-fellows/runtimes#160 for details. + #[runtime::pallet_index(201)] + pub type Mmr = pallet_mmr; + #[runtime::pallet_index(202)] + pub type BeefyMmrLeaf = pallet_beefy_mmr; + + // Pallet for migrating Identity to a parachain. To be removed post-migration. + #[runtime::pallet_index(248)] + pub type IdentityMigrator = identity_migrator; +} + /// The address format for describing accounts. pub type Address = sp_runtime::MultiAddress; /// Block header type as expected by this runtime. @@ -1552,83 +1612,22 @@ pub type Migrations = migrations::Unreleased; #[allow(deprecated, missing_docs)] pub mod migrations { use super::*; - #[cfg(feature = "try-runtime")] - use sp_core::crypto::ByteArray; - - parameter_types! { - pub const ImOnlinePalletName: &'static str = "ImOnline"; - } - - /// Upgrade Session keys to exclude `ImOnline` key. - /// When this is removed, should also remove `OldSessionKeys`. - pub struct UpgradeSessionKeys; - const UPGRADE_SESSION_KEYS_FROM_SPEC: u32 = 104000; - impl frame_support::traits::OnRuntimeUpgrade for UpgradeSessionKeys { - #[cfg(feature = "try-runtime")] - fn pre_upgrade() -> Result, sp_runtime::TryRuntimeError> { - if System::last_runtime_upgrade_spec_version() > UPGRADE_SESSION_KEYS_FROM_SPEC { - log::warn!(target: "runtime::session_keys", "Skipping session keys migration pre-upgrade check due to spec version (already applied?)"); - return Ok(Vec::new()) + pub struct GetLegacyLeaseImpl; + impl coretime::migration::GetLegacyLease for GetLegacyLeaseImpl { + fn get_parachain_lease_in_blocks(para: ParaId) -> Option { + let now = frame_system::Pallet::::block_number(); + let lease = slots::Leases::::get(para); + if lease.is_empty() { + return None; } - - log::info!(target: "runtime::session_keys", "Collecting pre-upgrade session keys state"); - let key_ids = SessionKeys::key_ids(); - frame_support::ensure!( - key_ids.into_iter().find(|&k| *k == sp_core::crypto::key_types::IM_ONLINE) == None, - "New session keys contain the ImOnline key that should have been removed", - ); - let storage_key = pallet_session::QueuedKeys::::hashed_key(); - let mut state: Vec = Vec::new(); - frame_support::storage::unhashed::get::>( - &storage_key, - ) - .ok_or::("Queued keys are not available".into())? - .into_iter() - .for_each(|(id, keys)| { - state.extend_from_slice(id.as_slice()); - for key_id in key_ids { - state.extend_from_slice(keys.get_raw(*key_id)); - } - }); - frame_support::ensure!(state.len() > 0, "Queued keys are not empty before upgrade"); - Ok(state) - } - - fn on_runtime_upgrade() -> Weight { - if System::last_runtime_upgrade_spec_version() > UPGRADE_SESSION_KEYS_FROM_SPEC { - log::warn!("Skipping session keys upgrade: already applied"); - return ::DbWeight::get().reads(1) + // Lease not yet started, ignore: + if lease.iter().any(Option::is_none) { + return None; } - log::info!("Upgrading session keys"); - Session::upgrade_keys::(transform_session_keys); - Perbill::from_percent(50) * BlockWeights::get().max_block - } - - #[cfg(feature = "try-runtime")] - fn post_upgrade( - old_state: sp_std::vec::Vec, - ) -> Result<(), sp_runtime::TryRuntimeError> { - if System::last_runtime_upgrade_spec_version() > UPGRADE_SESSION_KEYS_FROM_SPEC { - log::warn!(target: "runtime::session_keys", "Skipping session keys migration post-upgrade check due to spec version (already applied?)"); - return Ok(()) - } - - let key_ids = SessionKeys::key_ids(); - let mut new_state: Vec = Vec::new(); - pallet_session::QueuedKeys::::get().into_iter().for_each(|(id, keys)| { - new_state.extend_from_slice(id.as_slice()); - for key_id in key_ids { - new_state.extend_from_slice(keys.get_raw(*key_id)); - } - }); - frame_support::ensure!(new_state.len() > 0, "Queued keys are not empty after upgrade"); - frame_support::ensure!( - old_state == new_state, - "Pre-upgrade and post-upgrade keys do not match!" - ); - log::info!(target: "runtime::session_keys", "Session keys migrated successfully"); - Ok(()) + let (index, _) = + as Leaser>::lease_period_index(now)?; + Some(index.saturating_add(lease.len() as u32).saturating_mul(LeasePeriod::get())) } } @@ -1647,15 +1646,20 @@ pub mod migrations { pallet_referenda::migration::v1::MigrateV0ToV1, pallet_grandpa::migrations::MigrateV4ToV5, parachains_configuration::migration::v10::MigrateToV10, - pallet_nomination_pools::migration::versioned::V7ToV8, - UpgradeSessionKeys, - frame_support::migrations::RemovePallet< - ImOnlinePalletName, - ::DbWeight, - >, + pallet_nomination_pools::migration::unversioned::TotalValueLockedSync, // Migrate Identity pallet for Usernames pallet_identity::migration::versioned::V0ToV1, parachains_configuration::migration::v11::MigrateToV11, + parachains_configuration::migration::v12::MigrateToV12, + // permanent + pallet_xcm::migration::MigrateToLatestXcmVersion, + // Migrate from legacy lease to coretime. Needs to run after configuration v11 + coretime::migration::MigrateToCoretime< + Runtime, + crate::xcm_config::XcmRouter, + GetLegacyLeaseImpl, + >, + parachains_inclusion::migration::MigrateToV1, ); } @@ -1694,6 +1698,8 @@ mod benches { [runtime_parachains::initializer, Initializer] [runtime_parachains::paras, Paras] [runtime_parachains::paras_inherent, ParaInherent] + [runtime_parachains::assigner_on_demand, OnDemandAssignmentProvider] + [runtime_parachains::coretime, Coretime] // Substrate [pallet_bags_list, VoterList] [pallet_balances, Balances] @@ -1740,7 +1746,7 @@ sp_api::impl_runtime_apis! { Executive::execute_block(block); } - fn initialize_block(header: &::Header) { + fn initialize_block(header: &::Header) -> sp_runtime::ExtrinsicInclusionMode { Executive::initialize_block(header) } } @@ -1796,7 +1802,7 @@ sp_api::impl_runtime_apis! { } } - #[api_version(10)] + #[api_version(11)] impl primitives::runtime_api::ParachainHost for Runtime { fn validators() -> Vec { parachains_runtime_api_impl::validators::() @@ -1941,21 +1947,25 @@ sp_api::impl_runtime_apis! { } fn approval_voting_params() -> ApprovalVotingParams { - parachains_staging_runtime_api_impl::approval_voting_params::() + parachains_runtime_api_impl::approval_voting_params::() } fn disabled_validators() -> Vec { - parachains_staging_runtime_api_impl::disabled_validators::() + parachains_runtime_api_impl::disabled_validators::() } fn node_features() -> NodeFeatures { - parachains_staging_runtime_api_impl::node_features::() + parachains_runtime_api_impl::node_features::() + } + + fn claim_queue() -> BTreeMap> { + vstaging_parachains_runtime_api_impl::claim_queue::() } } impl beefy_primitives::BeefyApi for Runtime { fn beefy_genesis() -> Option { - Beefy::genesis_block() + pallet_beefy::GenesisBlock::::get() } fn validator_set() -> Option> { @@ -1992,11 +2002,11 @@ sp_api::impl_runtime_apis! { impl mmr::MmrApi for Runtime { fn mmr_root() -> Result { - Ok(Mmr::mmr_root()) + Ok(pallet_mmr::RootHash::::get()) } fn mmr_leaf_count() -> Result { - Ok(Mmr::mmr_leaves()) + Ok(pallet_mmr::NumberOfLeaves::::get()) } fn generate_proof( @@ -2190,6 +2200,37 @@ sp_api::impl_runtime_apis! { } } + impl xcm_fee_payment_runtime_api::XcmPaymentApi for Runtime { + fn query_acceptable_payment_assets(xcm_version: xcm::Version) -> Result, XcmPaymentApiError> { + if !matches!(xcm_version, 3 | 4) { + return Err(XcmPaymentApiError::UnhandledXcmVersion); + } + Ok([VersionedAssetId::V4(xcm_config::TokenLocation::get().into())] + .into_iter() + .filter_map(|asset| asset.into_version(xcm_version).ok()) + .collect()) + } + + fn query_weight_to_asset_fee(weight: Weight, asset: VersionedAssetId) -> Result { + let local_asset = VersionedAssetId::V4(xcm_config::TokenLocation::get().into()); + let asset = asset + .into_version(4) + .map_err(|_| XcmPaymentApiError::VersionedConversionFailed)?; + + if asset != local_asset { return Err(XcmPaymentApiError::AssetNotFound); } + + Ok(WeightToFee::weight_to_fee(&weight)) + } + + fn query_xcm_weight(message: VersionedXcm<()>) -> Result { + XcmPallet::query_xcm_weight(message) + } + + fn query_delivery_fees(destination: VersionedLocation, message: VersionedXcm<()>) -> Result { + XcmPallet::query_delivery_fees(destination, message) + } + } + impl pallet_nomination_pools_runtime_api::NominationPoolsApi< Block, AccountId, @@ -2284,7 +2325,36 @@ sp_api::impl_runtime_apis! { impl pallet_session_benchmarking::Config for Runtime {} impl pallet_offences_benchmarking::Config for Runtime {} impl pallet_election_provider_support_benchmarking::Config for Runtime {} + + use xcm_config::{AssetHub, TokenLocation}; + + parameter_types! { + pub ExistentialDepositAsset: Option = Some(( + TokenLocation::get(), + ExistentialDeposit::get() + ).into()); + pub AssetHubParaId: ParaId = westend_runtime_constants::system_parachain::ASSET_HUB_ID.into(); + pub const RandomParaId: ParaId = ParaId::new(43211234); + } + impl pallet_xcm::benchmarking::Config for Runtime { + type DeliveryHelper = ( + runtime_common::xcm_sender::ToParachainDeliveryHelper< + xcm_config::XcmConfig, + ExistentialDepositAsset, + xcm_config::PriceForChildParachainDelivery, + AssetHubParaId, + (), + >, + runtime_common::xcm_sender::ToParachainDeliveryHelper< + xcm_config::XcmConfig, + ExistentialDepositAsset, + xcm_config::PriceForChildParachainDelivery, + RandomParaId, + (), + > + ); + fn reachable_dest() -> Option { Some(crate::xcm_config::AssetHub::get()) } @@ -2292,7 +2362,7 @@ sp_api::impl_runtime_apis! { fn teleportable_asset_and_dest() -> Option<(Asset, Location)> { // Relay/native token can be teleported to/from AH. Some(( - Asset { fun: Fungible(EXISTENTIAL_DEPOSIT), id: AssetId(Here.into()) }, + Asset { fun: Fungible(ExistentialDeposit::get()), id: AssetId(Here.into()) }, crate::xcm_config::AssetHub::get(), )) } @@ -2301,10 +2371,10 @@ sp_api::impl_runtime_apis! { // Relay can reserve transfer native token to some random parachain. Some(( Asset { - fun: Fungible(EXISTENTIAL_DEPOSIT), + fun: Fungible(ExistentialDeposit::get()), id: AssetId(Here.into()) }, - crate::Junction::Parachain(43211234).into(), + crate::Junction::Parachain(RandomParaId::get().into()).into(), )) } @@ -2322,6 +2392,13 @@ sp_api::impl_runtime_apis! { dest ) } + + fn get_asset() -> Asset { + Asset { + id: AssetId(Location::here()), + fun: Fungible(ExistentialDeposit::get()), + } + } } impl frame_system_benchmarking::Config for Runtime {} impl pallet_nomination_pools_benchmarking::Config for Runtime {} @@ -2331,15 +2408,6 @@ sp_api::impl_runtime_apis! { AssetId, Fungibility::*, InteriorLocation, Junction, Junctions::*, Asset, Assets, Location, NetworkId, Response, }; - use xcm_config::{AssetHub, TokenLocation}; - - parameter_types! { - pub ExistentialDepositAsset: Option = Some(( - TokenLocation::get(), - ExistentialDeposit::get() - ).into()); - pub ToParachain: ParaId = westend_runtime_constants::system_parachain::ASSET_HUB_ID.into(); - } impl pallet_xcm_benchmarks::Config for Runtime { type XcmConfig = xcm_config::XcmConfig; @@ -2348,7 +2416,7 @@ sp_api::impl_runtime_apis! { xcm_config::XcmConfig, ExistentialDepositAsset, xcm_config::PriceForChildParachainDelivery, - ToParachain, + AssetHubParaId, (), >; fn valid_destination() -> Result { @@ -2458,12 +2526,16 @@ sp_api::impl_runtime_apis! { } impl sp_genesis_builder::GenesisBuilder for Runtime { - fn create_default_config() -> Vec { - create_default_config::() + fn build_state(config: Vec) -> sp_genesis_builder::Result { + build_state::(config) + } + + fn get_preset(id: &Option) -> Option> { + get_preset::(id, |_| None) } - fn build_config(config: Vec) -> sp_genesis_builder::Result { - build_config::(config) + fn preset_names() -> Vec { + vec![] } } } @@ -2480,7 +2552,7 @@ mod remote_tests { #[tokio::test] async fn run_migrations() { if var("RUN_MIGRATION_TESTS").is_err() { - return + return; } sp_tracing::try_init_simple(); diff --git a/polkadot/runtime/westend/src/tests.rs b/polkadot/runtime/westend/src/tests.rs index 9f99631605903c805ac42089453e0fb8e5aa0485..4acb81e963b2165ee01881d189daf89c0c1a7924 100644 --- a/polkadot/runtime/westend/src/tests.rs +++ b/polkadot/runtime/westend/src/tests.rs @@ -21,7 +21,6 @@ use std::collections::HashSet; use crate::*; use frame_support::traits::WhitelistedStorageKeys; use sp_core::hexdisplay::HexDisplay; -use xcm::latest::prelude::*; #[test] fn remove_keys_weight_is_sensible() { @@ -55,11 +54,12 @@ fn sanity_check_teleport_assets_weight() { // Usually when XCM runs into an issue, it will return a weight of `Weight::MAX`, // so this test will certainly ensure that this problem does not occur. use frame_support::dispatch::GetDispatchInfo; - let weight = pallet_xcm::Call::::teleport_assets { + let weight = pallet_xcm::Call::::limited_teleport_assets { dest: Box::new(Here.into()), beneficiary: Box::new(Here.into()), assets: Box::new((Here, 200_000).into()), fee_asset_item: 0, + weight_limit: Unlimited, } .get_dispatch_info() .weight; diff --git a/polkadot/runtime/westend/src/weights/mod.rs b/polkadot/runtime/westend/src/weights/mod.rs index d8a2ae5d2da6fab158898e6cb6548f5f56aa612c..f6a9008d71876726dda2ad240ecdb4588a1f82a3 100644 --- a/polkadot/runtime/westend/src/weights/mod.rs +++ b/polkadot/runtime/westend/src/weights/mod.rs @@ -24,7 +24,6 @@ pub mod pallet_conviction_voting; pub mod pallet_election_provider_multi_phase; pub mod pallet_fast_unstake; pub mod pallet_identity; -pub mod pallet_im_online; pub mod pallet_indices; pub mod pallet_message_queue; pub mod pallet_multisig; diff --git a/polkadot/runtime/westend/src/weights/pallet_im_online.rs b/polkadot/runtime/westend/src/weights/pallet_im_online.rs deleted file mode 100644 index a83cd43804dfdc1ca8827a1988221dd0c6f4ee4d..0000000000000000000000000000000000000000 --- a/polkadot/runtime/westend/src/weights/pallet_im_online.rs +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright (C) Parity Technologies (UK) Ltd. -// This file is part of Polkadot. - -// Polkadot is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Polkadot is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Polkadot. If not, see . - -//! Autogenerated weights for `pallet_im_online` -//! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-05-30, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `build-host`, CPU: `AMD EPYC 7601 32-Core Processor` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("westend-dev"), DB CACHE: 1024 - -// Executed Command: -// ./target/production/polkadot -// benchmark -// pallet -// --chain=westend-dev -// --steps=50 -// --repeat=20 -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --pallet=pallet_im_online -// --extrinsic=* -// --execution=wasm -// --wasm-execution=compiled -// --header=./file_header.txt -// --output=./runtime/westend/src/weights/ - -#![cfg_attr(rustfmt, rustfmt_skip)] -#![allow(unused_parens)] -#![allow(unused_imports)] -#![allow(missing_docs)] - -use frame_support::{traits::Get, weights::Weight}; -use core::marker::PhantomData; - -/// Weight functions for `pallet_im_online`. -pub struct WeightInfo(PhantomData); -impl pallet_im_online::WeightInfo for WeightInfo { - /// Storage: Session Validators (r:1 w:0) - /// Proof Skipped: Session Validators (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Session CurrentIndex (r:1 w:0) - /// Proof Skipped: Session CurrentIndex (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ImOnline Keys (r:1 w:0) - /// Proof: ImOnline Keys (max_values: Some(1), max_size: Some(320002), added: 320497, mode: MaxEncodedLen) - /// Storage: ImOnline ReceivedHeartbeats (r:1 w:1) - /// Proof: ImOnline ReceivedHeartbeats (max_values: None, max_size: Some(1028), added: 3503, mode: MaxEncodedLen) - /// Storage: ImOnline AuthoredBlocks (r:1 w:0) - /// Proof: ImOnline AuthoredBlocks (max_values: None, max_size: Some(56), added: 2531, mode: MaxEncodedLen) - /// The range of component `k` is `[1, 1000]`. - fn validate_unsigned_and_then_heartbeat(k: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `361 + k * (32 ±0)` - // Estimated: `321487 + k * (1761 ±0)` - // Minimum execution time: 122_571_000 picoseconds. - Weight::from_parts(162_954_849, 0) - .saturating_add(Weight::from_parts(0, 321487)) - // Standard Error: 8_676 - .saturating_add(Weight::from_parts(11_122, 0).saturating_mul(k.into())) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(1)) - .saturating_add(Weight::from_parts(0, 1761).saturating_mul(k.into())) - } -} diff --git a/polkadot/runtime/westend/src/weights/pallet_scheduler.rs b/polkadot/runtime/westend/src/weights/pallet_scheduler.rs index 7291b98093300ef887d422051dcf6be7274c0d12..beef3796dea6e5ab3a47a62238422df652f30797 100644 --- a/polkadot/runtime/westend/src/weights/pallet_scheduler.rs +++ b/polkadot/runtime/westend/src/weights/pallet_scheduler.rs @@ -17,27 +17,25 @@ //! Autogenerated weights for `pallet_scheduler` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-06-14, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2024-01-25, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner--ss9ysm1-project-163-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("westend-dev"), DB CACHE: 1024 +//! HOSTNAME: `runner-grjcggob-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("westend-dev")`, DB CACHE: 1024 // Executed Command: -// ./target/production/polkadot +// target/production/polkadot // benchmark // pallet -// --chain=westend-dev // --steps=50 // --repeat=20 -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --pallet=pallet_scheduler // --extrinsic=* -// --execution=wasm // --wasm-execution=compiled -// --header=./file_header.txt -// --output=./runtime/westend/src/weights/ +// --heap-pages=4096 +// --json-file=/builds/parity/mirrors/polkadot-sdk/.git/.artifacts/bench.json +// --pallet=pallet_scheduler +// --chain=westend-dev +// --header=./polkadot/file_header.txt +// --output=./polkadot/runtime/westend/src/weights/ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -50,30 +48,30 @@ use core::marker::PhantomData; /// Weight functions for `pallet_scheduler`. pub struct WeightInfo(PhantomData); impl pallet_scheduler::WeightInfo for WeightInfo { - /// Storage: Scheduler IncompleteSince (r:1 w:1) - /// Proof: Scheduler IncompleteSince (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + /// Storage: `Scheduler::IncompleteSince` (r:1 w:1) + /// Proof: `Scheduler::IncompleteSince` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) fn service_agendas_base() -> Weight { // Proof Size summary in bytes: // Measured: `69` // Estimated: `1489` - // Minimum execution time: 3_991_000 picoseconds. - Weight::from_parts(4_160_000, 0) + // Minimum execution time: 3_220_000 picoseconds. + Weight::from_parts(3_512_000, 0) .saturating_add(Weight::from_parts(0, 1489)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } - /// Storage: Scheduler Agenda (r:1 w:1) - /// Proof: Scheduler Agenda (max_values: None, max_size: Some(38963), added: 41438, mode: MaxEncodedLen) + /// Storage: `Scheduler::Agenda` (r:1 w:1) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(38963), added: 41438, mode: `MaxEncodedLen`) /// The range of component `s` is `[0, 50]`. fn service_agenda_base(s: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `116 + s * (177 ±0)` // Estimated: `42428` - // Minimum execution time: 3_647_000 picoseconds. - Weight::from_parts(6_608_270, 0) + // Minimum execution time: 3_565_000 picoseconds. + Weight::from_parts(6_102_216, 0) .saturating_add(Weight::from_parts(0, 42428)) - // Standard Error: 2_516 - .saturating_add(Weight::from_parts(892_866, 0).saturating_mul(s.into())) + // Standard Error: 1_413 + .saturating_add(Weight::from_parts(339_016, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -81,36 +79,38 @@ impl pallet_scheduler::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 5_552_000 picoseconds. - Weight::from_parts(5_836_000, 0) + // Minimum execution time: 2_940_000 picoseconds. + Weight::from_parts(3_070_000, 0) .saturating_add(Weight::from_parts(0, 0)) } - /// Storage: Preimage PreimageFor (r:1 w:1) - /// Proof: Preimage PreimageFor (max_values: None, max_size: Some(4194344), added: 4196819, mode: Measured) - /// Storage: Preimage StatusFor (r:1 w:1) - /// Proof: Preimage StatusFor (max_values: None, max_size: Some(91), added: 2566, mode: MaxEncodedLen) + /// Storage: `Preimage::PreimageFor` (r:1 w:1) + /// Proof: `Preimage::PreimageFor` (`max_values`: None, `max_size`: Some(4194344), added: 4196819, mode: `Measured`) + /// Storage: `Preimage::StatusFor` (r:1 w:0) + /// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) + /// Storage: `Preimage::RequestStatusFor` (r:1 w:1) + /// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) /// The range of component `s` is `[128, 4194304]`. fn service_task_fetched(s: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `217 + s * (1 ±0)` // Estimated: `3682 + s * (1 ±0)` - // Minimum execution time: 20_583_000 picoseconds. - Weight::from_parts(20_771_000, 0) + // Minimum execution time: 16_602_000 picoseconds. + Weight::from_parts(16_834_000, 0) .saturating_add(Weight::from_parts(0, 3682)) - // Standard Error: 11 - .saturating_add(Weight::from_parts(2_250, 0).saturating_mul(s.into())) - .saturating_add(T::DbWeight::get().reads(2)) + // Standard Error: 10 + .saturating_add(Weight::from_parts(1_307, 0).saturating_mul(s.into())) + .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(2)) .saturating_add(Weight::from_parts(0, 1).saturating_mul(s.into())) } - /// Storage: Scheduler Lookup (r:0 w:1) - /// Proof: Scheduler Lookup (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) + /// Storage: `Scheduler::Lookup` (r:0 w:1) + /// Proof: `Scheduler::Lookup` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) fn service_task_named() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_271_000 picoseconds. - Weight::from_parts(7_447_000, 0) + // Minimum execution time: 4_202_000 picoseconds. + Weight::from_parts(4_383_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -118,90 +118,169 @@ impl pallet_scheduler::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 5_547_000 picoseconds. - Weight::from_parts(5_776_000, 0) + // Minimum execution time: 2_917_000 picoseconds. + Weight::from_parts(3_043_000, 0) .saturating_add(Weight::from_parts(0, 0)) } fn execute_dispatch_signed() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_480_000 picoseconds. - Weight::from_parts(2_628_000, 0) + // Minimum execution time: 1_707_000 picoseconds. + Weight::from_parts(1_802_000, 0) .saturating_add(Weight::from_parts(0, 0)) } fn execute_dispatch_unsigned() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_479_000 picoseconds. - Weight::from_parts(2_626_000, 0) + // Minimum execution time: 1_671_000 picoseconds. + Weight::from_parts(1_796_000, 0) .saturating_add(Weight::from_parts(0, 0)) } - /// Storage: Scheduler Agenda (r:1 w:1) - /// Proof: Scheduler Agenda (max_values: None, max_size: Some(38963), added: 41438, mode: MaxEncodedLen) + /// Storage: `Scheduler::Agenda` (r:1 w:1) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(38963), added: 41438, mode: `MaxEncodedLen`) /// The range of component `s` is `[0, 49]`. fn schedule(s: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `116 + s * (177 ±0)` // Estimated: `42428` - // Minimum execution time: 13_350_000 picoseconds. - Weight::from_parts(15_289_847, 0) + // Minimum execution time: 9_313_000 picoseconds. + Weight::from_parts(12_146_613, 0) .saturating_add(Weight::from_parts(0, 42428)) - // Standard Error: 5_375 - .saturating_add(Weight::from_parts(974_567, 0).saturating_mul(s.into())) + // Standard Error: 1_381 + .saturating_add(Weight::from_parts(360_418, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } - /// Storage: Scheduler Agenda (r:1 w:1) - /// Proof: Scheduler Agenda (max_values: None, max_size: Some(38963), added: 41438, mode: MaxEncodedLen) - /// Storage: Scheduler Lookup (r:0 w:1) - /// Proof: Scheduler Lookup (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) + /// Storage: `Scheduler::Agenda` (r:1 w:1) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(38963), added: 41438, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Lookup` (r:0 w:1) + /// Proof: `Scheduler::Lookup` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) /// The range of component `s` is `[1, 50]`. fn cancel(s: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `116 + s * (177 ±0)` // Estimated: `42428` - // Minimum execution time: 17_646_000 picoseconds. - Weight::from_parts(15_858_434, 0) + // Minimum execution time: 13_079_000 picoseconds. + Weight::from_parts(12_921_017, 0) .saturating_add(Weight::from_parts(0, 42428)) - // Standard Error: 5_354 - .saturating_add(Weight::from_parts(1_697_642, 0).saturating_mul(s.into())) + // Standard Error: 1_112 + .saturating_add(Weight::from_parts(538_089, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) } - /// Storage: Scheduler Lookup (r:1 w:1) - /// Proof: Scheduler Lookup (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) - /// Storage: Scheduler Agenda (r:1 w:1) - /// Proof: Scheduler Agenda (max_values: None, max_size: Some(38963), added: 41438, mode: MaxEncodedLen) + /// Storage: `Scheduler::Lookup` (r:1 w:1) + /// Proof: `Scheduler::Lookup` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Agenda` (r:1 w:1) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(38963), added: 41438, mode: `MaxEncodedLen`) /// The range of component `s` is `[0, 49]`. fn schedule_named(s: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `293 + s * (185 ±0)` // Estimated: `42428` - // Minimum execution time: 16_419_000 picoseconds. - Weight::from_parts(19_868_760, 0) + // Minimum execution time: 12_458_000 picoseconds. + Weight::from_parts(16_009_539, 0) .saturating_add(Weight::from_parts(0, 42428)) - // Standard Error: 6_915 - .saturating_add(Weight::from_parts(1_010_225, 0).saturating_mul(s.into())) + // Standard Error: 2_260 + .saturating_add(Weight::from_parts(399_245, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } - /// Storage: Scheduler Lookup (r:1 w:1) - /// Proof: Scheduler Lookup (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) - /// Storage: Scheduler Agenda (r:1 w:1) - /// Proof: Scheduler Agenda (max_values: None, max_size: Some(38963), added: 41438, mode: MaxEncodedLen) + /// Storage: `Scheduler::Lookup` (r:1 w:1) + /// Proof: `Scheduler::Lookup` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Agenda` (r:1 w:1) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(38963), added: 41438, mode: `MaxEncodedLen`) /// The range of component `s` is `[1, 50]`. fn cancel_named(s: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `319 + s * (185 ±0)` // Estimated: `42428` - // Minimum execution time: 19_574_000 picoseconds. - Weight::from_parts(18_453_197, 0) + // Minimum execution time: 15_173_000 picoseconds. + Weight::from_parts(15_602_728, 0) .saturating_add(Weight::from_parts(0, 42428)) - // Standard Error: 6_009 - .saturating_add(Weight::from_parts(1_707_130, 0).saturating_mul(s.into())) + // Standard Error: 1_302 + .saturating_add(Weight::from_parts(557_878, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } + /// Storage: `Scheduler::Retries` (r:1 w:2) + /// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Agenda` (r:1 w:1) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(38963), added: 41438, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Lookup` (r:0 w:1) + /// Proof: `Scheduler::Lookup` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) + /// The range of component `s` is `[1, 50]`. + fn schedule_retry(s: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `197` + // Estimated: `42428` + // Minimum execution time: 13_531_000 picoseconds. + Weight::from_parts(13_985_249, 0) + .saturating_add(Weight::from_parts(0, 42428)) + // Standard Error: 619 + .saturating_add(Weight::from_parts(39_068, 0).saturating_mul(s.into())) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(4)) + } + /// Storage: `Scheduler::Agenda` (r:1 w:0) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(38963), added: 41438, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Retries` (r:0 w:1) + /// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`) + fn set_retry() -> Weight { + // Proof Size summary in bytes: + // Measured: `116 + s * (177 ±0)` + // Estimated: `42428` + // Minimum execution time: 8_050_000 picoseconds. + Weight::from_parts(8_440_627, 0) + .saturating_add(Weight::from_parts(0, 42428)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `Scheduler::Lookup` (r:1 w:0) + /// Proof: `Scheduler::Lookup` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Agenda` (r:1 w:0) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(38963), added: 41438, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Retries` (r:0 w:1) + /// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`) + fn set_retry_named() -> Weight { + // Proof Size summary in bytes: + // Measured: `325 + s * (185 ±0)` + // Estimated: `42428` + // Minimum execution time: 10_876_000 picoseconds. + Weight::from_parts(11_708_172, 0) + .saturating_add(Weight::from_parts(0, 42428)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `Scheduler::Agenda` (r:1 w:0) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(38963), added: 41438, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Retries` (r:0 w:1) + /// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`) + fn cancel_retry() -> Weight { + // Proof Size summary in bytes: + // Measured: `116 + s * (177 ±0)` + // Estimated: `42428` + // Minimum execution time: 8_050_000 picoseconds. + Weight::from_parts(8_440_627, 0) + .saturating_add(Weight::from_parts(0, 42428)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `Scheduler::Lookup` (r:1 w:0) + /// Proof: `Scheduler::Lookup` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Agenda` (r:1 w:0) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(38963), added: 41438, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Retries` (r:0 w:1) + /// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`) + fn cancel_retry_named() -> Weight { + // Proof Size summary in bytes: + // Measured: `325 + s * (185 ±0)` + // Estimated: `42428` + // Minimum execution time: 10_876_000 picoseconds. + Weight::from_parts(11_708_172, 0) + .saturating_add(Weight::from_parts(0, 42428)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(1)) + } } diff --git a/polkadot/runtime/westend/src/weights/pallet_staking.rs b/polkadot/runtime/westend/src/weights/pallet_staking.rs index 1ecd44747ef5140b0f83f5226d8368a9231085d0..393fa0b37176a0ca5ce8160eec7e8e3ac56c3458 100644 --- a/polkadot/runtime/westend/src/weights/pallet_staking.rs +++ b/polkadot/runtime/westend/src/weights/pallet_staking.rs @@ -16,10 +16,10 @@ //! Autogenerated weights for `pallet_staking` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-12-10, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-03-27, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-itmxxexx-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! HOSTNAME: `runner-h2rr8wx7-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("westend-dev")`, DB CACHE: 1024 // Executed Command: @@ -50,22 +50,22 @@ pub struct WeightInfo(PhantomData); impl pallet_staking::WeightInfo for WeightInfo { /// Storage: `Staking::Bonded` (r:1 w:1) /// Proof: `Staking::Bonded` (`max_values`: None, `max_size`: Some(72), added: 2547, mode: `MaxEncodedLen`) + /// Storage: `Staking::Ledger` (r:1 w:1) + /// Proof: `Staking::Ledger` (`max_values`: None, `max_size`: Some(1091), added: 3566, mode: `MaxEncodedLen`) /// Storage: `Balances::Locks` (r:1 w:1) /// Proof: `Balances::Locks` (`max_values`: None, `max_size`: Some(1299), added: 3774, mode: `MaxEncodedLen`) /// Storage: `Balances::Freezes` (r:1 w:0) /// Proof: `Balances::Freezes` (`max_values`: None, `max_size`: Some(67), added: 2542, mode: `MaxEncodedLen`) - /// Storage: `Staking::Ledger` (r:0 w:1) - /// Proof: `Staking::Ledger` (`max_values`: None, `max_size`: Some(1091), added: 3566, mode: `MaxEncodedLen`) /// Storage: `Staking::Payee` (r:0 w:1) /// Proof: `Staking::Payee` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) fn bond() -> Weight { // Proof Size summary in bytes: - // Measured: `894` + // Measured: `1009` // Estimated: `4764` - // Minimum execution time: 38_316_000 picoseconds. - Weight::from_parts(40_022_000, 0) + // Minimum execution time: 40_585_000 picoseconds. + Weight::from_parts(41_800_000, 0) .saturating_add(Weight::from_parts(0, 4764)) - .saturating_add(T::DbWeight::get().reads(3)) + .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(4)) } /// Storage: `Staking::Bonded` (r:1 w:0) @@ -84,22 +84,22 @@ impl pallet_staking::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `1921` // Estimated: `8877` - // Minimum execution time: 81_027_000 picoseconds. - Weight::from_parts(83_964_000, 0) + // Minimum execution time: 81_809_000 picoseconds. + Weight::from_parts(84_387_000, 0) .saturating_add(Weight::from_parts(0, 8877)) .saturating_add(T::DbWeight::get().reads(9)) .saturating_add(T::DbWeight::get().writes(7)) } /// Storage: `Staking::Ledger` (r:1 w:1) /// Proof: `Staking::Ledger` (`max_values`: None, `max_size`: Some(1091), added: 3566, mode: `MaxEncodedLen`) + /// Storage: `Staking::Bonded` (r:1 w:0) + /// Proof: `Staking::Bonded` (`max_values`: None, `max_size`: Some(72), added: 2547, mode: `MaxEncodedLen`) /// Storage: `Staking::Nominators` (r:1 w:0) /// Proof: `Staking::Nominators` (`max_values`: None, `max_size`: Some(558), added: 3033, mode: `MaxEncodedLen`) /// Storage: `Staking::MinNominatorBond` (r:1 w:0) /// Proof: `Staking::MinNominatorBond` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) /// Storage: `Staking::CurrentEra` (r:1 w:0) /// Proof: `Staking::CurrentEra` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - /// Storage: `Staking::Bonded` (r:1 w:0) - /// Proof: `Staking::Bonded` (`max_values`: None, `max_size`: Some(72), added: 2547, mode: `MaxEncodedLen`) /// Storage: `Balances::Locks` (r:1 w:1) /// Proof: `Balances::Locks` (`max_values`: None, `max_size`: Some(1299), added: 3774, mode: `MaxEncodedLen`) /// Storage: `Balances::Freezes` (r:1 w:0) @@ -112,43 +112,45 @@ impl pallet_staking::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `2128` // Estimated: `8877` - // Minimum execution time: 85_585_000 picoseconds. - Weight::from_parts(87_256_000, 0) + // Minimum execution time: 89_419_000 picoseconds. + Weight::from_parts(91_237_000, 0) .saturating_add(Weight::from_parts(0, 8877)) .saturating_add(T::DbWeight::get().reads(12)) .saturating_add(T::DbWeight::get().writes(7)) } /// Storage: `Staking::Ledger` (r:1 w:1) /// Proof: `Staking::Ledger` (`max_values`: None, `max_size`: Some(1091), added: 3566, mode: `MaxEncodedLen`) - /// Storage: `Staking::CurrentEra` (r:1 w:0) - /// Proof: `Staking::CurrentEra` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) /// Storage: `Staking::Bonded` (r:1 w:0) /// Proof: `Staking::Bonded` (`max_values`: None, `max_size`: Some(72), added: 2547, mode: `MaxEncodedLen`) + /// Storage: `Staking::CurrentEra` (r:1 w:0) + /// Proof: `Staking::CurrentEra` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) /// Storage: `Balances::Locks` (r:1 w:1) /// Proof: `Balances::Locks` (`max_values`: None, `max_size`: Some(1299), added: 3774, mode: `MaxEncodedLen`) /// Storage: `Balances::Freezes` (r:1 w:0) /// Proof: `Balances::Freezes` (`max_values`: None, `max_size`: Some(67), added: 2542, mode: `MaxEncodedLen`) + /// Storage: `NominationPools::ReversePoolIdLookup` (r:1 w:0) + /// Proof: `NominationPools::ReversePoolIdLookup` (`max_values`: None, `max_size`: Some(44), added: 2519, mode: `MaxEncodedLen`) /// The range of component `s` is `[0, 100]`. fn withdraw_unbonded_update(s: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `1075` + // Measured: `1223` // Estimated: `4764` - // Minimum execution time: 39_520_000 picoseconds. - Weight::from_parts(41_551_548, 0) + // Minimum execution time: 45_152_000 picoseconds. + Weight::from_parts(46_460_819, 0) .saturating_add(Weight::from_parts(0, 4764)) - // Standard Error: 1_094 - .saturating_add(Weight::from_parts(50_426, 0).saturating_mul(s.into())) - .saturating_add(T::DbWeight::get().reads(5)) + // Standard Error: 972 + .saturating_add(Weight::from_parts(55_473, 0).saturating_mul(s.into())) + .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) } /// Storage: `Staking::Ledger` (r:1 w:1) /// Proof: `Staking::Ledger` (`max_values`: None, `max_size`: Some(1091), added: 3566, mode: `MaxEncodedLen`) + /// Storage: `Staking::Bonded` (r:1 w:1) + /// Proof: `Staking::Bonded` (`max_values`: None, `max_size`: Some(72), added: 2547, mode: `MaxEncodedLen`) /// Storage: `Staking::CurrentEra` (r:1 w:0) /// Proof: `Staking::CurrentEra` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) /// Storage: `Staking::SlashingSpans` (r:1 w:1) /// Proof: `Staking::SlashingSpans` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `Staking::Bonded` (r:1 w:1) - /// Proof: `Staking::Bonded` (`max_values`: None, `max_size`: Some(72), added: 2547, mode: `MaxEncodedLen`) /// Storage: `Balances::Locks` (r:1 w:1) /// Proof: `Balances::Locks` (`max_values`: None, `max_size`: Some(1299), added: 3774, mode: `MaxEncodedLen`) /// Storage: `Balances::Freezes` (r:1 w:0) @@ -174,11 +176,11 @@ impl pallet_staking::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `2127 + s * (4 ±0)` // Estimated: `6248 + s * (4 ±0)` - // Minimum execution time: 82_915_000 picoseconds. - Weight::from_parts(89_597_160, 0) + // Minimum execution time: 82_762_000 picoseconds. + Weight::from_parts(91_035_077, 0) .saturating_add(Weight::from_parts(0, 6248)) - // Standard Error: 3_146 - .saturating_add(Weight::from_parts(1_228_061, 0).saturating_mul(s.into())) + // Standard Error: 3_771 + .saturating_add(Weight::from_parts(1_217_871, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(13)) .saturating_add(T::DbWeight::get().writes(11)) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(s.into()))) @@ -186,6 +188,8 @@ impl pallet_staking::WeightInfo for WeightInfo { } /// Storage: `Staking::Ledger` (r:1 w:0) /// Proof: `Staking::Ledger` (`max_values`: None, `max_size`: Some(1091), added: 3566, mode: `MaxEncodedLen`) + /// Storage: `Staking::Bonded` (r:1 w:0) + /// Proof: `Staking::Bonded` (`max_values`: None, `max_size`: Some(72), added: 2547, mode: `MaxEncodedLen`) /// Storage: `Staking::MinValidatorBond` (r:1 w:0) /// Proof: `Staking::MinValidatorBond` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) /// Storage: `Staking::MinCommission` (r:1 w:0) @@ -196,8 +200,6 @@ impl pallet_staking::WeightInfo for WeightInfo { /// Proof: `Staking::MaxValidatorsCount` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) /// Storage: `Staking::Nominators` (r:1 w:0) /// Proof: `Staking::Nominators` (`max_values`: None, `max_size`: Some(558), added: 3033, mode: `MaxEncodedLen`) - /// Storage: `Staking::Bonded` (r:1 w:0) - /// Proof: `Staking::Bonded` (`max_values`: None, `max_size`: Some(72), added: 2547, mode: `MaxEncodedLen`) /// Storage: `VoterList::ListNodes` (r:1 w:1) /// Proof: `VoterList::ListNodes` (`max_values`: None, `max_size`: Some(154), added: 2629, mode: `MaxEncodedLen`) /// Storage: `VoterList::ListBags` (r:1 w:1) @@ -210,33 +212,37 @@ impl pallet_staking::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `1301` // Estimated: `4556` - // Minimum execution time: 48_070_000 picoseconds. - Weight::from_parts(49_226_000, 0) + // Minimum execution time: 50_555_000 picoseconds. + Weight::from_parts(52_052_000, 0) .saturating_add(Weight::from_parts(0, 4556)) .saturating_add(T::DbWeight::get().reads(11)) .saturating_add(T::DbWeight::get().writes(5)) } /// Storage: `Staking::Ledger` (r:1 w:0) /// Proof: `Staking::Ledger` (`max_values`: None, `max_size`: Some(1091), added: 3566, mode: `MaxEncodedLen`) + /// Storage: `Staking::Bonded` (r:1 w:0) + /// Proof: `Staking::Bonded` (`max_values`: None, `max_size`: Some(72), added: 2547, mode: `MaxEncodedLen`) /// Storage: `Staking::Nominators` (r:128 w:128) /// Proof: `Staking::Nominators` (`max_values`: None, `max_size`: Some(558), added: 3033, mode: `MaxEncodedLen`) /// The range of component `k` is `[1, 128]`. fn kick(k: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `1243 + k * (569 ±0)` + // Measured: `1778 + k * (572 ±0)` // Estimated: `4556 + k * (3033 ±0)` - // Minimum execution time: 29_140_000 picoseconds. - Weight::from_parts(30_225_579, 0) + // Minimum execution time: 35_037_000 picoseconds. + Weight::from_parts(35_081_878, 0) .saturating_add(Weight::from_parts(0, 4556)) - // Standard Error: 5_394 - .saturating_add(Weight::from_parts(6_401_367, 0).saturating_mul(k.into())) - .saturating_add(T::DbWeight::get().reads(1)) + // Standard Error: 5_473 + .saturating_add(Weight::from_parts(6_667_924, 0).saturating_mul(k.into())) + .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(k.into()))) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(k.into()))) .saturating_add(Weight::from_parts(0, 3033).saturating_mul(k.into())) } /// Storage: `Staking::Ledger` (r:1 w:0) /// Proof: `Staking::Ledger` (`max_values`: None, `max_size`: Some(1091), added: 3566, mode: `MaxEncodedLen`) + /// Storage: `Staking::Bonded` (r:1 w:0) + /// Proof: `Staking::Bonded` (`max_values`: None, `max_size`: Some(72), added: 2547, mode: `MaxEncodedLen`) /// Storage: `Staking::MinNominatorBond` (r:1 w:0) /// Proof: `Staking::MinNominatorBond` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) /// Storage: `Staking::Nominators` (r:1 w:1) @@ -247,8 +253,6 @@ impl pallet_staking::WeightInfo for WeightInfo { /// Proof: `Staking::Validators` (`max_values`: None, `max_size`: Some(45), added: 2520, mode: `MaxEncodedLen`) /// Storage: `Staking::CurrentEra` (r:1 w:0) /// Proof: `Staking::CurrentEra` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - /// Storage: `Staking::Bonded` (r:1 w:0) - /// Proof: `Staking::Bonded` (`max_values`: None, `max_size`: Some(72), added: 2547, mode: `MaxEncodedLen`) /// Storage: `VoterList::ListNodes` (r:2 w:2) /// Proof: `VoterList::ListNodes` (`max_values`: None, `max_size`: Some(154), added: 2629, mode: `MaxEncodedLen`) /// Storage: `VoterList::ListBags` (r:1 w:1) @@ -262,11 +266,11 @@ impl pallet_staking::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `1797 + n * (102 ±0)` // Estimated: `6248 + n * (2520 ±0)` - // Minimum execution time: 59_287_000 picoseconds. - Weight::from_parts(58_285_052, 0) + // Minimum execution time: 62_098_000 picoseconds. + Weight::from_parts(60_154_061, 0) .saturating_add(Weight::from_parts(0, 6248)) - // Standard Error: 14_556 - .saturating_add(Weight::from_parts(3_863_008, 0).saturating_mul(n.into())) + // Standard Error: 19_257 + .saturating_add(Weight::from_parts(3_839_855, 0).saturating_mul(n.into())) .saturating_add(T::DbWeight::get().reads(12)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(n.into()))) .saturating_add(T::DbWeight::get().writes(6)) @@ -274,6 +278,8 @@ impl pallet_staking::WeightInfo for WeightInfo { } /// Storage: `Staking::Ledger` (r:1 w:0) /// Proof: `Staking::Ledger` (`max_values`: None, `max_size`: Some(1091), added: 3566, mode: `MaxEncodedLen`) + /// Storage: `Staking::Bonded` (r:1 w:0) + /// Proof: `Staking::Bonded` (`max_values`: None, `max_size`: Some(72), added: 2547, mode: `MaxEncodedLen`) /// Storage: `Staking::Validators` (r:1 w:0) /// Proof: `Staking::Validators` (`max_values`: None, `max_size`: Some(45), added: 2520, mode: `MaxEncodedLen`) /// Storage: `Staking::Nominators` (r:1 w:1) @@ -288,12 +294,12 @@ impl pallet_staking::WeightInfo for WeightInfo { /// Proof: `VoterList::CounterForListNodes` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) fn chill() -> Weight { // Proof Size summary in bytes: - // Measured: `1581` + // Measured: `1747` // Estimated: `6248` - // Minimum execution time: 51_035_000 picoseconds. - Weight::from_parts(52_163_000, 0) + // Minimum execution time: 54_993_000 picoseconds. + Weight::from_parts(56_698_000, 0) .saturating_add(Weight::from_parts(0, 6248)) - .saturating_add(T::DbWeight::get().reads(8)) + .saturating_add(T::DbWeight::get().reads(9)) .saturating_add(T::DbWeight::get().writes(6)) } /// Storage: `Staking::Ledger` (r:1 w:0) @@ -306,40 +312,40 @@ impl pallet_staking::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `865` // Estimated: `4556` - // Minimum execution time: 15_809_000 picoseconds. - Weight::from_parts(16_451_000, 0) + // Minimum execution time: 18_100_000 picoseconds. + Weight::from_parts(18_547_000, 0) .saturating_add(Weight::from_parts(0, 4556)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } /// Storage: `Staking::Ledger` (r:1 w:0) /// Proof: `Staking::Ledger` (`max_values`: None, `max_size`: Some(1091), added: 3566, mode: `MaxEncodedLen`) - /// Storage: `Staking::Payee` (r:1 w:1) - /// Proof: `Staking::Payee` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) /// Storage: `Staking::Bonded` (r:1 w:0) /// Proof: `Staking::Bonded` (`max_values`: None, `max_size`: Some(72), added: 2547, mode: `MaxEncodedLen`) + /// Storage: `Staking::Payee` (r:1 w:1) + /// Proof: `Staking::Payee` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) fn update_payee() -> Weight { // Proof Size summary in bytes: // Measured: `932` // Estimated: `4556` - // Minimum execution time: 21_695_000 picoseconds. - Weight::from_parts(22_351_000, 0) + // Minimum execution time: 23_428_000 picoseconds. + Weight::from_parts(24_080_000, 0) .saturating_add(Weight::from_parts(0, 4556)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(1)) } /// Storage: `Staking::Bonded` (r:1 w:1) /// Proof: `Staking::Bonded` (`max_values`: None, `max_size`: Some(72), added: 2547, mode: `MaxEncodedLen`) - /// Storage: `Staking::Ledger` (r:1 w:2) + /// Storage: `Staking::Ledger` (r:2 w:2) /// Proof: `Staking::Ledger` (`max_values`: None, `max_size`: Some(1091), added: 3566, mode: `MaxEncodedLen`) fn set_controller() -> Weight { // Proof Size summary in bytes: // Measured: `865` - // Estimated: `4556` - // Minimum execution time: 18_548_000 picoseconds. - Weight::from_parts(19_205_000, 0) - .saturating_add(Weight::from_parts(0, 4556)) - .saturating_add(T::DbWeight::get().reads(2)) + // Estimated: `8122` + // Minimum execution time: 21_159_000 picoseconds. + Weight::from_parts(21_706_000, 0) + .saturating_add(Weight::from_parts(0, 8122)) + .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(3)) } /// Storage: `Staking::ValidatorCount` (r:0 w:1) @@ -348,8 +354,8 @@ impl pallet_staking::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_193_000 picoseconds. - Weight::from_parts(2_408_000, 0) + // Minimum execution time: 1_910_000 picoseconds. + Weight::from_parts(2_003_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -359,8 +365,8 @@ impl pallet_staking::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_475_000 picoseconds. - Weight::from_parts(7_874_000, 0) + // Minimum execution time: 7_076_000 picoseconds. + Weight::from_parts(7_349_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -370,8 +376,8 @@ impl pallet_staking::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_393_000 picoseconds. - Weight::from_parts(7_643_000, 0) + // Minimum execution time: 7_067_000 picoseconds. + Weight::from_parts(7_389_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -381,8 +387,8 @@ impl pallet_staking::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_474_000 picoseconds. - Weight::from_parts(7_814_000, 0) + // Minimum execution time: 7_148_000 picoseconds. + Weight::from_parts(7_446_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -393,32 +399,32 @@ impl pallet_staking::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_358_000 picoseconds. - Weight::from_parts(2_589_423, 0) + // Minimum execution time: 2_025_000 picoseconds. + Weight::from_parts(2_229_953, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 81 - .saturating_add(Weight::from_parts(13_612, 0).saturating_mul(v.into())) + // Standard Error: 67 + .saturating_add(Weight::from_parts(11_785, 0).saturating_mul(v.into())) .saturating_add(T::DbWeight::get().writes(1)) } - /// Storage: `Staking::Ledger` (r:751 w:1502) + /// Storage: `Staking::Ledger` (r:1502 w:1502) /// Proof: `Staking::Ledger` (`max_values`: None, `max_size`: Some(1091), added: 3566, mode: `MaxEncodedLen`) + /// Storage: `Staking::Bonded` (r:751 w:751) + /// Proof: `Staking::Bonded` (`max_values`: None, `max_size`: Some(72), added: 2547, mode: `MaxEncodedLen`) /// Storage: `Staking::Payee` (r:751 w:0) /// Proof: `Staking::Payee` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) - /// Storage: `Staking::Bonded` (r:0 w:751) - /// Proof: `Staking::Bonded` (`max_values`: None, `max_size`: Some(72), added: 2547, mode: `MaxEncodedLen`) /// The range of component `i` is `[0, 751]`. fn deprecate_controller_batch(i: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `668 + i * (148 ±0)` - // Estimated: `990 + i * (3566 ±0)` - // Minimum execution time: 1_934_000 picoseconds. - Weight::from_parts(2_070_000, 0) + // Measured: `680 + i * (227 ±0)` + // Estimated: `990 + i * (7132 ±0)` + // Minimum execution time: 4_321_000 picoseconds. + Weight::from_parts(4_407_000, 0) .saturating_add(Weight::from_parts(0, 990)) - // Standard Error: 19_129 - .saturating_add(Weight::from_parts(13_231_580, 0).saturating_mul(i.into())) - .saturating_add(T::DbWeight::get().reads((2_u64).saturating_mul(i.into()))) + // Standard Error: 37_239 + .saturating_add(Weight::from_parts(21_300_598, 0).saturating_mul(i.into())) + .saturating_add(T::DbWeight::get().reads((4_u64).saturating_mul(i.into()))) .saturating_add(T::DbWeight::get().writes((3_u64).saturating_mul(i.into()))) - .saturating_add(Weight::from_parts(0, 3566).saturating_mul(i.into())) + .saturating_add(Weight::from_parts(0, 7132).saturating_mul(i.into())) } /// Storage: `Staking::SlashingSpans` (r:1 w:1) /// Proof: `Staking::SlashingSpans` (`max_values`: None, `max_size`: None, mode: `Measured`) @@ -453,11 +459,11 @@ impl pallet_staking::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `2127 + s * (4 ±0)` // Estimated: `6248 + s * (4 ±0)` - // Minimum execution time: 80_290_000 picoseconds. - Weight::from_parts(87_901_664, 0) + // Minimum execution time: 78_908_000 picoseconds. + Weight::from_parts(84_886_373, 0) .saturating_add(Weight::from_parts(0, 6248)) - // Standard Error: 2_960 - .saturating_add(Weight::from_parts(1_195_050, 0).saturating_mul(s.into())) + // Standard Error: 3_376 + .saturating_add(Weight::from_parts(1_217_850, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(13)) .saturating_add(T::DbWeight::get().writes(12)) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(s.into()))) @@ -470,11 +476,11 @@ impl pallet_staking::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `66639` // Estimated: `70104` - // Minimum execution time: 132_682_000 picoseconds. - Weight::from_parts(932_504_297, 0) + // Minimum execution time: 136_389_000 picoseconds. + Weight::from_parts(1_207_241_524, 0) .saturating_add(Weight::from_parts(0, 70104)) - // Standard Error: 57_593 - .saturating_add(Weight::from_parts(4_829_705, 0).saturating_mul(s.into())) + // Standard Error: 77_138 + .saturating_add(Weight::from_parts(6_443_948, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -510,12 +516,12 @@ impl pallet_staking::WeightInfo for WeightInfo { fn payout_stakers_alive_staked(n: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `8249 + n * (396 ±0)` - // Estimated: `10779 + n * (3774 ±3)` - // Minimum execution time: 129_091_000 picoseconds. - Weight::from_parts(166_186_167, 0) + // Estimated: `10779 + n * (3774 ±0)` + // Minimum execution time: 130_222_000 picoseconds. + Weight::from_parts(167_236_150, 0) .saturating_add(Weight::from_parts(0, 10779)) - // Standard Error: 36_242 - .saturating_add(Weight::from_parts(40_467_481, 0).saturating_mul(n.into())) + // Standard Error: 34_051 + .saturating_add(Weight::from_parts(39_899_917, 0).saturating_mul(n.into())) .saturating_add(T::DbWeight::get().reads(14)) .saturating_add(T::DbWeight::get().reads((6_u64).saturating_mul(n.into()))) .saturating_add(T::DbWeight::get().writes(4)) @@ -539,11 +545,11 @@ impl pallet_staking::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `1922 + l * (5 ±0)` // Estimated: `8877` - // Minimum execution time: 77_461_000 picoseconds. - Weight::from_parts(80_118_021, 0) + // Minimum execution time: 79_136_000 picoseconds. + Weight::from_parts(82_129_497, 0) .saturating_add(Weight::from_parts(0, 8877)) - // Standard Error: 4_343 - .saturating_add(Weight::from_parts(59_113, 0).saturating_mul(l.into())) + // Standard Error: 3_867 + .saturating_add(Weight::from_parts(75_156, 0).saturating_mul(l.into())) .saturating_add(T::DbWeight::get().reads(9)) .saturating_add(T::DbWeight::get().writes(7)) } @@ -578,11 +584,11 @@ impl pallet_staking::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `2127 + s * (4 ±0)` // Estimated: `6248 + s * (4 ±0)` - // Minimum execution time: 89_366_000 picoseconds. - Weight::from_parts(91_964_557, 0) + // Minimum execution time: 89_375_000 picoseconds. + Weight::from_parts(91_224_907, 0) .saturating_add(Weight::from_parts(0, 6248)) - // Standard Error: 2_799 - .saturating_add(Weight::from_parts(1_206_123, 0).saturating_mul(s.into())) + // Standard Error: 3_424 + .saturating_add(Weight::from_parts(1_219_542, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(12)) .saturating_add(T::DbWeight::get().writes(11)) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(s.into()))) @@ -627,14 +633,14 @@ impl pallet_staking::WeightInfo for WeightInfo { fn new_era(v: u32, n: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `0 + n * (716 ±0) + v * (3594 ±0)` - // Estimated: `456136 + n * (3566 ±4) + v * (3566 ±40)` - // Minimum execution time: 520_430_000 picoseconds. - Weight::from_parts(527_125_000, 0) + // Estimated: `456136 + n * (3566 ±4) + v * (3566 ±0)` + // Minimum execution time: 520_905_000 picoseconds. + Weight::from_parts(523_771_000, 0) .saturating_add(Weight::from_parts(0, 456136)) - // Standard Error: 1_974_092 - .saturating_add(Weight::from_parts(64_885_491, 0).saturating_mul(v.into())) - // Standard Error: 196_707 - .saturating_add(Weight::from_parts(18_100_326, 0).saturating_mul(n.into())) + // Standard Error: 2_142_714 + .saturating_add(Weight::from_parts(68_631_588, 0).saturating_mul(v.into())) + // Standard Error: 213_509 + .saturating_add(Weight::from_parts(19_343_025, 0).saturating_mul(n.into())) .saturating_add(T::DbWeight::get().reads(184)) .saturating_add(T::DbWeight::get().reads((5_u64).saturating_mul(v.into()))) .saturating_add(T::DbWeight::get().reads((4_u64).saturating_mul(n.into()))) @@ -665,13 +671,13 @@ impl pallet_staking::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `3108 + n * (907 ±0) + v * (391 ±0)` // Estimated: `456136 + n * (3566 ±0) + v * (3566 ±0)` - // Minimum execution time: 33_917_323_000 picoseconds. - Weight::from_parts(34_173_565_000, 0) + // Minimum execution time: 36_848_619_000 picoseconds. + Weight::from_parts(37_362_442_000, 0) .saturating_add(Weight::from_parts(0, 456136)) - // Standard Error: 367_135 - .saturating_add(Weight::from_parts(4_696_840, 0).saturating_mul(v.into())) - // Standard Error: 367_135 - .saturating_add(Weight::from_parts(3_889_075, 0).saturating_mul(n.into())) + // Standard Error: 415_031 + .saturating_add(Weight::from_parts(5_204_987, 0).saturating_mul(v.into())) + // Standard Error: 415_031 + .saturating_add(Weight::from_parts(4_132_636, 0).saturating_mul(n.into())) .saturating_add(T::DbWeight::get().reads(179)) .saturating_add(T::DbWeight::get().reads((5_u64).saturating_mul(v.into()))) .saturating_add(T::DbWeight::get().reads((4_u64).saturating_mul(n.into()))) @@ -688,11 +694,11 @@ impl pallet_staking::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `946 + v * (50 ±0)` // Estimated: `3510 + v * (2520 ±0)` - // Minimum execution time: 2_447_197_000 picoseconds. - Weight::from_parts(13_003_614, 0) + // Minimum execution time: 2_512_817_000 picoseconds. + Weight::from_parts(119_401_374, 0) .saturating_add(Weight::from_parts(0, 3510)) - // Standard Error: 9_738 - .saturating_add(Weight::from_parts(4_953_442, 0).saturating_mul(v.into())) + // Standard Error: 8_463 + .saturating_add(Weight::from_parts(4_860_364, 0).saturating_mul(v.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(v.into()))) .saturating_add(Weight::from_parts(0, 2520).saturating_mul(v.into())) @@ -703,6 +709,8 @@ impl pallet_staking::WeightInfo for WeightInfo { /// Proof: `Staking::MinValidatorBond` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) /// Storage: `Staking::MaxValidatorsCount` (r:0 w:1) /// Proof: `Staking::MaxValidatorsCount` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `Staking::MaxStakedRewards` (r:0 w:1) + /// Proof: `Staking::MaxStakedRewards` (`max_values`: Some(1), `max_size`: Some(1), added: 496, mode: `MaxEncodedLen`) /// Storage: `Staking::ChillThreshold` (r:0 w:1) /// Proof: `Staking::ChillThreshold` (`max_values`: Some(1), `max_size`: Some(1), added: 496, mode: `MaxEncodedLen`) /// Storage: `Staking::MaxNominatorsCount` (r:0 w:1) @@ -713,10 +721,10 @@ impl pallet_staking::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_714_000 picoseconds. - Weight::from_parts(3_956_000, 0) + // Minimum execution time: 3_686_000 picoseconds. + Weight::from_parts(3_881_000, 0) .saturating_add(Weight::from_parts(0, 0)) - .saturating_add(T::DbWeight::get().writes(6)) + .saturating_add(T::DbWeight::get().writes(7)) } /// Storage: `Staking::MinCommission` (r:0 w:1) /// Proof: `Staking::MinCommission` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) @@ -724,6 +732,8 @@ impl pallet_staking::WeightInfo for WeightInfo { /// Proof: `Staking::MinValidatorBond` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) /// Storage: `Staking::MaxValidatorsCount` (r:0 w:1) /// Proof: `Staking::MaxValidatorsCount` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `Staking::MaxStakedRewards` (r:0 w:1) + /// Proof: `Staking::MaxStakedRewards` (`max_values`: Some(1), `max_size`: Some(1), added: 496, mode: `MaxEncodedLen`) /// Storage: `Staking::ChillThreshold` (r:0 w:1) /// Proof: `Staking::ChillThreshold` (`max_values`: Some(1), `max_size`: Some(1), added: 496, mode: `MaxEncodedLen`) /// Storage: `Staking::MaxNominatorsCount` (r:0 w:1) @@ -734,10 +744,10 @@ impl pallet_staking::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_361_000 picoseconds. - Weight::from_parts(3_632_000, 0) + // Minimum execution time: 3_143_000 picoseconds. + Weight::from_parts(3_424_000, 0) .saturating_add(Weight::from_parts(0, 0)) - .saturating_add(T::DbWeight::get().writes(6)) + .saturating_add(T::DbWeight::get().writes(7)) } /// Storage: `Staking::Bonded` (r:1 w:0) /// Proof: `Staking::Bonded` (`max_values`: None, `max_size`: Some(72), added: 2547, mode: `MaxEncodedLen`) @@ -765,8 +775,8 @@ impl pallet_staking::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `1870` // Estimated: `6248` - // Minimum execution time: 65_329_000 picoseconds. - Weight::from_parts(67_247_000, 0) + // Minimum execution time: 66_946_000 picoseconds. + Weight::from_parts(69_382_000, 0) .saturating_add(Weight::from_parts(0, 6248)) .saturating_add(T::DbWeight::get().reads(12)) .saturating_add(T::DbWeight::get().writes(6)) @@ -779,8 +789,8 @@ impl pallet_staking::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `658` // Estimated: `3510` - // Minimum execution time: 11_760_000 picoseconds. - Weight::from_parts(12_095_000, 0) + // Minimum execution time: 11_278_000 picoseconds. + Weight::from_parts(11_603_000, 0) .saturating_add(Weight::from_parts(0, 3510)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) @@ -791,9 +801,29 @@ impl pallet_staking::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_256_000 picoseconds. - Weight::from_parts(2_378_000, 0) + // Minimum execution time: 1_963_000 picoseconds. + Weight::from_parts(2_077_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } + /// Storage: `Balances::Locks` (r:1 w:1) + /// Proof: `Balances::Locks` (`max_values`: None, `max_size`: Some(1299), added: 3774, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `Staking::Bonded` (r:1 w:1) + /// Proof: `Staking::Bonded` (`max_values`: None, `max_size`: Some(72), added: 2547, mode: `MaxEncodedLen`) + /// Storage: `Staking::Ledger` (r:1 w:1) + /// Proof: `Staking::Ledger` (`max_values`: None, `max_size`: Some(1091), added: 3566, mode: `MaxEncodedLen`) + /// Storage: `Balances::Freezes` (r:1 w:0) + /// Proof: `Balances::Freezes` (`max_values`: None, `max_size`: Some(67), added: 2542, mode: `MaxEncodedLen`) + fn restore_ledger() -> Weight { + // Proof Size summary in bytes: + // Measured: `1014` + // Estimated: `4764` + // Minimum execution time: 40_258_000 picoseconds. + Weight::from_parts(41_210_000, 0) + .saturating_add(Weight::from_parts(0, 4764)) + .saturating_add(T::DbWeight::get().reads(5)) + .saturating_add(T::DbWeight::get().writes(4)) + } } diff --git a/polkadot/runtime/westend/src/weights/pallet_xcm.rs b/polkadot/runtime/westend/src/weights/pallet_xcm.rs index 493acd0f9e7bdfbfd1e716b7e82a474643f1050b..80bc551ba1e264f9703f5fd307ec7075642bc3bd 100644 --- a/polkadot/runtime/westend/src/weights/pallet_xcm.rs +++ b/polkadot/runtime/westend/src/weights/pallet_xcm.rs @@ -16,26 +16,24 @@ //! Autogenerated weights for `pallet_xcm` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-11-07, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-03-21, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-yprdrvc7-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! HOSTNAME: `runner-h2rr8wx7-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("westend-dev")`, DB CACHE: 1024 // Executed Command: -// ./target/production/polkadot +// target/production/polkadot // benchmark // pallet -// --chain=westend-dev // --steps=50 // --repeat=20 -// --no-storage-info -// --no-median-slopes -// --no-min-squares -// --pallet=pallet_xcm // --extrinsic=* -// --execution=wasm // --wasm-execution=compiled +// --heap-pages=4096 +// --json-file=/builds/parity/mirrors/polkadot-sdk/.git/.artifacts/bench.json +// --pallet=pallet_xcm +// --chain=westend-dev // --header=./polkadot/file_header.txt // --output=./polkadot/runtime/westend/src/weights/ @@ -50,10 +48,6 @@ use core::marker::PhantomData; /// Weight functions for `pallet_xcm`. pub struct WeightInfo(PhantomData); impl pallet_xcm::WeightInfo for WeightInfo { - fn transfer_assets() -> Weight { - // TODO: run benchmarks - Weight::zero() - } /// Storage: `Dmp::DeliveryFeeFactor` (r:1 w:0) /// Proof: `Dmp::DeliveryFeeFactor` (`max_values`: None, `max_size`: None, mode: `Measured`) /// Storage: `XcmPallet::SupportedVersion` (r:1 w:0) @@ -64,33 +58,105 @@ impl pallet_xcm::WeightInfo for WeightInfo { /// Proof: `Dmp::DownwardMessageQueueHeads` (`max_values`: None, `max_size`: None, mode: `Measured`) fn send() -> Weight { // Proof Size summary in bytes: - // Measured: `109` - // Estimated: `3574` - // Minimum execution time: 28_098_000 picoseconds. - Weight::from_parts(28_887_000, 0) - .saturating_add(Weight::from_parts(0, 3574)) + // Measured: `147` + // Estimated: `3612` + // Minimum execution time: 24_535_000 picoseconds. + Weight::from_parts(25_618_000, 0) + .saturating_add(Weight::from_parts(0, 3612)) + .saturating_add(T::DbWeight::get().reads(4)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: `Dmp::DeliveryFeeFactor` (r:1 w:0) + /// Proof: `Dmp::DeliveryFeeFactor` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `XcmPallet::SupportedVersion` (r:1 w:0) + /// Proof: `XcmPallet::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Dmp::DownwardMessageQueues` (r:1 w:1) + /// Proof: `Dmp::DownwardMessageQueues` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Dmp::DownwardMessageQueueHeads` (r:1 w:1) + /// Proof: `Dmp::DownwardMessageQueueHeads` (`max_values`: None, `max_size`: None, mode: `Measured`) + fn send_blob() -> Weight { + // Proof Size summary in bytes: + // Measured: `147` + // Estimated: `3612` + // Minimum execution time: 25_376_000 picoseconds. + Weight::from_parts(26_180_000, 0) + .saturating_add(Weight::from_parts(0, 3612)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) } + /// Storage: `System::Account` (r:2 w:2) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `Dmp::DeliveryFeeFactor` (r:1 w:0) + /// Proof: `Dmp::DeliveryFeeFactor` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `XcmPallet::SupportedVersion` (r:1 w:0) + /// Proof: `XcmPallet::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Dmp::DownwardMessageQueues` (r:1 w:1) + /// Proof: `Dmp::DownwardMessageQueues` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Dmp::DownwardMessageQueueHeads` (r:1 w:1) + /// Proof: `Dmp::DownwardMessageQueueHeads` (`max_values`: None, `max_size`: None, mode: `Measured`) fn teleport_assets() -> Weight { // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 17_609_000 picoseconds. - Weight::from_parts(18_000_000, 0) - .saturating_add(Weight::from_parts(0, 0)) + // Measured: `250` + // Estimated: `6196` + // Minimum execution time: 108_786_000 picoseconds. + Weight::from_parts(112_208_000, 0) + .saturating_add(Weight::from_parts(0, 6196)) + .saturating_add(T::DbWeight::get().reads(6)) + .saturating_add(T::DbWeight::get().writes(4)) } + /// Storage: `System::Account` (r:2 w:2) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `Dmp::DeliveryFeeFactor` (r:1 w:0) + /// Proof: `Dmp::DeliveryFeeFactor` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `XcmPallet::SupportedVersion` (r:1 w:0) + /// Proof: `XcmPallet::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Dmp::DownwardMessageQueues` (r:1 w:1) + /// Proof: `Dmp::DownwardMessageQueues` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Dmp::DownwardMessageQueueHeads` (r:1 w:1) + /// Proof: `Dmp::DownwardMessageQueueHeads` (`max_values`: None, `max_size`: None, mode: `Measured`) fn reserve_transfer_assets() -> Weight { + // Proof Size summary in bytes: + // Measured: `302` + // Estimated: `6196` + // Minimum execution time: 105_190_000 picoseconds. + Weight::from_parts(107_140_000, 0) + .saturating_add(Weight::from_parts(0, 6196)) + .saturating_add(T::DbWeight::get().reads(6)) + .saturating_add(T::DbWeight::get().writes(4)) + } + /// Storage: `System::Account` (r:2 w:2) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `Dmp::DeliveryFeeFactor` (r:1 w:0) + /// Proof: `Dmp::DeliveryFeeFactor` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `XcmPallet::SupportedVersion` (r:1 w:0) + /// Proof: `XcmPallet::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Dmp::DownwardMessageQueues` (r:1 w:1) + /// Proof: `Dmp::DownwardMessageQueues` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Dmp::DownwardMessageQueueHeads` (r:1 w:1) + /// Proof: `Dmp::DownwardMessageQueueHeads` (`max_values`: None, `max_size`: None, mode: `Measured`) + fn transfer_assets() -> Weight { + // Proof Size summary in bytes: + // Measured: `250` + // Estimated: `6196` + // Minimum execution time: 109_027_000 picoseconds. + Weight::from_parts(111_404_000, 0) + .saturating_add(Weight::from_parts(0, 6196)) + .saturating_add(T::DbWeight::get().reads(6)) + .saturating_add(T::DbWeight::get().writes(4)) + } + /// Storage: `Benchmark::Override` (r:0 w:0) + /// Proof: `Benchmark::Override` (`max_values`: None, `max_size`: None, mode: `Measured`) + fn execute() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 17_007_000 picoseconds. - Weight::from_parts(17_471_000, 0) + // Minimum execution time: 18_446_744_073_709_551_000 picoseconds. + Weight::from_parts(18_446_744_073_709_551_000, 0) .saturating_add(Weight::from_parts(0, 0)) } /// Storage: `Benchmark::Override` (r:0 w:0) /// Proof: `Benchmark::Override` (`max_values`: None, `max_size`: None, mode: `Measured`) - fn execute() -> Weight { + fn execute_blob() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` @@ -104,8 +170,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_444_000 picoseconds. - Weight::from_parts(7_671_000, 0) + // Minimum execution time: 6_668_000 picoseconds. + Weight::from_parts(7_013_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -113,8 +179,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_126_000 picoseconds. - Weight::from_parts(2_253_000, 0) + // Minimum execution time: 1_740_000 picoseconds. + Weight::from_parts(1_884_000, 0) .saturating_add(Weight::from_parts(0, 0)) } /// Storage: `XcmPallet::VersionNotifiers` (r:1 w:1) @@ -133,11 +199,11 @@ impl pallet_xcm::WeightInfo for WeightInfo { /// Proof: `XcmPallet::Queries` (`max_values`: None, `max_size`: None, mode: `Measured`) fn force_subscribe_version_notify() -> Weight { // Proof Size summary in bytes: - // Measured: `109` - // Estimated: `3574` - // Minimum execution time: 31_318_000 picoseconds. - Weight::from_parts(32_413_000, 0) - .saturating_add(Weight::from_parts(0, 3574)) + // Measured: `147` + // Estimated: `3612` + // Minimum execution time: 30_200_000 picoseconds. + Weight::from_parts(30_768_000, 0) + .saturating_add(Weight::from_parts(0, 3612)) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(5)) } @@ -155,11 +221,11 @@ impl pallet_xcm::WeightInfo for WeightInfo { /// Proof: `XcmPallet::Queries` (`max_values`: None, `max_size`: None, mode: `Measured`) fn force_unsubscribe_version_notify() -> Weight { // Proof Size summary in bytes: - // Measured: `289` - // Estimated: `3754` - // Minimum execution time: 35_282_000 picoseconds. - Weight::from_parts(35_969_000, 0) - .saturating_add(Weight::from_parts(0, 3754)) + // Measured: `327` + // Estimated: `3792` + // Minimum execution time: 33_928_000 picoseconds. + Weight::from_parts(35_551_000, 0) + .saturating_add(Weight::from_parts(0, 3792)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -169,45 +235,45 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_247_000 picoseconds. - Weight::from_parts(2_381_000, 0) + // Minimum execution time: 1_759_000 picoseconds. + Weight::from_parts(1_880_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } - /// Storage: `XcmPallet::SupportedVersion` (r:4 w:2) + /// Storage: `XcmPallet::SupportedVersion` (r:5 w:2) /// Proof: `XcmPallet::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) fn migrate_supported_version() -> Weight { // Proof Size summary in bytes: - // Measured: `26` - // Estimated: `10916` - // Minimum execution time: 14_512_000 picoseconds. - Weight::from_parts(15_042_000, 0) - .saturating_add(Weight::from_parts(0, 10916)) - .saturating_add(T::DbWeight::get().reads(4)) + // Measured: `22` + // Estimated: `13387` + // Minimum execution time: 16_507_000 picoseconds. + Weight::from_parts(17_219_000, 0) + .saturating_add(Weight::from_parts(0, 13387)) + .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) } - /// Storage: `XcmPallet::VersionNotifiers` (r:4 w:2) + /// Storage: `XcmPallet::VersionNotifiers` (r:5 w:2) /// Proof: `XcmPallet::VersionNotifiers` (`max_values`: None, `max_size`: None, mode: `Measured`) fn migrate_version_notifiers() -> Weight { // Proof Size summary in bytes: - // Measured: `30` - // Estimated: `10920` - // Minimum execution time: 14_659_000 picoseconds. - Weight::from_parts(15_164_000, 0) - .saturating_add(Weight::from_parts(0, 10920)) - .saturating_add(T::DbWeight::get().reads(4)) + // Measured: `26` + // Estimated: `13391` + // Minimum execution time: 16_633_000 picoseconds. + Weight::from_parts(16_889_000, 0) + .saturating_add(Weight::from_parts(0, 13391)) + .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) } - /// Storage: `XcmPallet::VersionNotifyTargets` (r:5 w:0) + /// Storage: `XcmPallet::VersionNotifyTargets` (r:6 w:0) /// Proof: `XcmPallet::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) fn already_notified_target() -> Weight { // Proof Size summary in bytes: // Measured: `40` - // Estimated: `13405` - // Minimum execution time: 16_261_000 picoseconds. - Weight::from_parts(16_986_000, 0) - .saturating_add(Weight::from_parts(0, 13405)) - .saturating_add(T::DbWeight::get().reads(5)) + // Estimated: `15880` + // Minimum execution time: 19_297_000 picoseconds. + Weight::from_parts(19_820_000, 0) + .saturating_add(Weight::from_parts(0, 15880)) + .saturating_add(T::DbWeight::get().reads(6)) } /// Storage: `XcmPallet::VersionNotifyTargets` (r:2 w:1) /// Proof: `XcmPallet::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) @@ -221,38 +287,38 @@ impl pallet_xcm::WeightInfo for WeightInfo { /// Proof: `Dmp::DownwardMessageQueueHeads` (`max_values`: None, `max_size`: None, mode: `Measured`) fn notify_current_targets() -> Weight { // Proof Size summary in bytes: - // Measured: `145` - // Estimated: `6085` - // Minimum execution time: 30_539_000 picoseconds. - Weight::from_parts(31_117_000, 0) - .saturating_add(Weight::from_parts(0, 6085)) + // Measured: `183` + // Estimated: `6123` + // Minimum execution time: 30_364_000 picoseconds. + Weight::from_parts(31_122_000, 0) + .saturating_add(Weight::from_parts(0, 6123)) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(3)) } - /// Storage: `XcmPallet::VersionNotifyTargets` (r:3 w:0) + /// Storage: `XcmPallet::VersionNotifyTargets` (r:4 w:0) /// Proof: `XcmPallet::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) fn notify_target_migration_fail() -> Weight { // Proof Size summary in bytes: // Measured: `69` - // Estimated: `8484` - // Minimum execution time: 9_463_000 picoseconds. - Weight::from_parts(9_728_000, 0) - .saturating_add(Weight::from_parts(0, 8484)) - .saturating_add(T::DbWeight::get().reads(3)) + // Estimated: `10959` + // Minimum execution time: 11_997_000 picoseconds. + Weight::from_parts(12_392_000, 0) + .saturating_add(Weight::from_parts(0, 10959)) + .saturating_add(T::DbWeight::get().reads(4)) } - /// Storage: `XcmPallet::VersionNotifyTargets` (r:4 w:2) + /// Storage: `XcmPallet::VersionNotifyTargets` (r:5 w:2) /// Proof: `XcmPallet::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) fn migrate_version_notify_targets() -> Weight { // Proof Size summary in bytes: - // Measured: `37` - // Estimated: `10927` - // Minimum execution time: 15_169_000 picoseconds. - Weight::from_parts(15_694_000, 0) - .saturating_add(Weight::from_parts(0, 10927)) - .saturating_add(T::DbWeight::get().reads(4)) + // Measured: `33` + // Estimated: `13398` + // Minimum execution time: 16_894_000 picoseconds. + Weight::from_parts(17_452_000, 0) + .saturating_add(Weight::from_parts(0, 13398)) + .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) } - /// Storage: `XcmPallet::VersionNotifyTargets` (r:4 w:2) + /// Storage: `XcmPallet::VersionNotifyTargets` (r:5 w:2) /// Proof: `XcmPallet::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) /// Storage: `Dmp::DeliveryFeeFactor` (r:1 w:0) /// Proof: `Dmp::DeliveryFeeFactor` (`max_values`: None, `max_size`: None, mode: `Measured`) @@ -264,12 +330,12 @@ impl pallet_xcm::WeightInfo for WeightInfo { /// Proof: `Dmp::DownwardMessageQueueHeads` (`max_values`: None, `max_size`: None, mode: `Measured`) fn migrate_and_notify_old_targets() -> Weight { // Proof Size summary in bytes: - // Measured: `149` - // Estimated: `11039` - // Minimum execution time: 37_549_000 picoseconds. - Weight::from_parts(38_203_000, 0) - .saturating_add(Weight::from_parts(0, 11039)) - .saturating_add(T::DbWeight::get().reads(8)) + // Measured: `183` + // Estimated: `13548` + // Minimum execution time: 39_864_000 picoseconds. + Weight::from_parts(40_859_000, 0) + .saturating_add(Weight::from_parts(0, 13548)) + .saturating_add(T::DbWeight::get().reads(9)) .saturating_add(T::DbWeight::get().writes(4)) } /// Storage: `XcmPallet::QueryCounter` (r:1 w:1) @@ -280,8 +346,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `1485` - // Minimum execution time: 2_947_000 picoseconds. - Weight::from_parts(3_117_000, 0) + // Minimum execution time: 2_363_000 picoseconds. + Weight::from_parts(2_519_000, 0) .saturating_add(Weight::from_parts(0, 1485)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) @@ -292,10 +358,22 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `7576` // Estimated: `11041` - // Minimum execution time: 24_595_000 picoseconds. - Weight::from_parts(24_907_000, 0) + // Minimum execution time: 22_409_000 picoseconds. + Weight::from_parts(22_776_000, 0) .saturating_add(Weight::from_parts(0, 11041)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } + /// Storage: `XcmPallet::AssetTraps` (r:1 w:1) + /// Proof: `XcmPallet::AssetTraps` (`max_values`: None, `max_size`: None, mode: `Measured`) + fn claim_assets() -> Weight { + // Proof Size summary in bytes: + // Measured: `23` + // Estimated: `3488` + // Minimum execution time: 33_551_000 picoseconds. + Weight::from_parts(34_127_000, 0) + .saturating_add(Weight::from_parts(0, 3488)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } } diff --git a/polkadot/runtime/westend/src/weights/runtime_parachains_assigner_on_demand.rs b/polkadot/runtime/westend/src/weights/runtime_parachains_assigner_on_demand.rs index ac0f05301b486dbdbb8c0ca004e195ab47171ff3..acd1834f79ed8c35ed83bd56d75c0907b02f7f5d 100644 --- a/polkadot/runtime/westend/src/weights/runtime_parachains_assigner_on_demand.rs +++ b/polkadot/runtime/westend/src/weights/runtime_parachains_assigner_on_demand.rs @@ -16,11 +16,11 @@ //! Autogenerated weights for `runtime_parachains::assigner_on_demand` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-08-11, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-03-18, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-fljshgub-project-163-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("rococo-dev")`, DB CACHE: 1024 +//! HOSTNAME: `runner-h2rr8wx7-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("westend-dev")`, DB CACHE: 1024 // Executed Command: // target/production/polkadot @@ -31,11 +31,11 @@ // --extrinsic=* // --wasm-execution=compiled // --heap-pages=4096 -// --json-file=/builds/parity/mirrors/polkadot/.git/.artifacts/bench.json +// --json-file=/builds/parity/mirrors/polkadot-sdk/.git/.artifacts/bench.json // --pallet=runtime_parachains::assigner_on_demand -// --chain=rococo-dev -// --header=./file_header.txt -// --output=./runtime/rococo/src/weights/ +// --chain=westend-dev +// --header=./polkadot/file_header.txt +// --output=./polkadot/runtime/westend/src/weights/ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -48,44 +48,44 @@ use core::marker::PhantomData; /// Weight functions for `runtime_parachains::assigner_on_demand`. pub struct WeightInfo(PhantomData); impl runtime_parachains::assigner_on_demand::WeightInfo for WeightInfo { - /// Storage: `OnDemandAssignmentProvider::SpotTraffic` (r:1 w:0) - /// Proof: `OnDemandAssignmentProvider::SpotTraffic` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `Paras::ParaLifecycles` (r:1 w:0) - /// Proof: `Paras::ParaLifecycles` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `OnDemandAssignmentProvider::OnDemandQueue` (r:1 w:1) - /// Proof: `OnDemandAssignmentProvider::OnDemandQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `OnDemandAssignmentProvider::QueueStatus` (r:1 w:1) + /// Proof: `OnDemandAssignmentProvider::QueueStatus` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `OnDemandAssignmentProvider::ParaIdAffinity` (r:1 w:0) + /// Proof: `OnDemandAssignmentProvider::ParaIdAffinity` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `OnDemandAssignmentProvider::FreeEntries` (r:1 w:1) + /// Proof: `OnDemandAssignmentProvider::FreeEntries` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) /// The range of component `s` is `[1, 9999]`. fn place_order_keep_alive(s: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `297 + s * (4 ±0)` - // Estimated: `3762 + s * (4 ±0)` - // Minimum execution time: 33_522_000 picoseconds. - Weight::from_parts(35_436_835, 0) - .saturating_add(Weight::from_parts(0, 3762)) - // Standard Error: 129 - .saturating_add(Weight::from_parts(14_041, 0).saturating_mul(s.into())) + // Measured: `218 + s * (8 ±0)` + // Estimated: `3681 + s * (8 ±0)` + // Minimum execution time: 21_396_000 picoseconds. + Weight::from_parts(20_585_695, 0) + .saturating_add(Weight::from_parts(0, 3681)) + // Standard Error: 127 + .saturating_add(Weight::from_parts(20_951, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(3)) - .saturating_add(T::DbWeight::get().writes(1)) - .saturating_add(Weight::from_parts(0, 4).saturating_mul(s.into())) + .saturating_add(T::DbWeight::get().writes(2)) + .saturating_add(Weight::from_parts(0, 8).saturating_mul(s.into())) } - /// Storage: `OnDemandAssignmentProvider::SpotTraffic` (r:1 w:0) - /// Proof: `OnDemandAssignmentProvider::SpotTraffic` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `Paras::ParaLifecycles` (r:1 w:0) - /// Proof: `Paras::ParaLifecycles` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `OnDemandAssignmentProvider::OnDemandQueue` (r:1 w:1) - /// Proof: `OnDemandAssignmentProvider::OnDemandQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `OnDemandAssignmentProvider::QueueStatus` (r:1 w:1) + /// Proof: `OnDemandAssignmentProvider::QueueStatus` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `OnDemandAssignmentProvider::ParaIdAffinity` (r:1 w:0) + /// Proof: `OnDemandAssignmentProvider::ParaIdAffinity` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `OnDemandAssignmentProvider::FreeEntries` (r:1 w:1) + /// Proof: `OnDemandAssignmentProvider::FreeEntries` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) /// The range of component `s` is `[1, 9999]`. fn place_order_allow_death(s: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `297 + s * (4 ±0)` - // Estimated: `3762 + s * (4 ±0)` - // Minimum execution time: 33_488_000 picoseconds. - Weight::from_parts(34_848_934, 0) - .saturating_add(Weight::from_parts(0, 3762)) - // Standard Error: 143 - .saturating_add(Weight::from_parts(14_215, 0).saturating_mul(s.into())) + // Measured: `218 + s * (8 ±0)` + // Estimated: `3681 + s * (8 ±0)` + // Minimum execution time: 21_412_000 picoseconds. + Weight::from_parts(19_731_554, 0) + .saturating_add(Weight::from_parts(0, 3681)) + // Standard Error: 128 + .saturating_add(Weight::from_parts(21_055, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(3)) - .saturating_add(T::DbWeight::get().writes(1)) - .saturating_add(Weight::from_parts(0, 4).saturating_mul(s.into())) + .saturating_add(T::DbWeight::get().writes(2)) + .saturating_add(Weight::from_parts(0, 8).saturating_mul(s.into())) } } diff --git a/polkadot/runtime/westend/src/weights/runtime_parachains_configuration.rs b/polkadot/runtime/westend/src/weights/runtime_parachains_configuration.rs index 3a4813b667c68ea6400c9ad58cea8fd1bfece5d0..8fa3207c6446082a97877f488913d9c063114fca 100644 --- a/polkadot/runtime/westend/src/weights/runtime_parachains_configuration.rs +++ b/polkadot/runtime/westend/src/weights/runtime_parachains_configuration.rs @@ -16,10 +16,10 @@ //! Autogenerated weights for `runtime_parachains::configuration` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-11-10, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-02-08, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-yprdrvc7-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! HOSTNAME: `runner-bn-ce5rx-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("westend-dev")`, DB CACHE: 1024 // Executed Command: @@ -58,8 +58,8 @@ impl runtime_parachains::configuration::WeightInfo for // Proof Size summary in bytes: // Measured: `151` // Estimated: `1636` - // Minimum execution time: 8_065_000 picoseconds. - Weight::from_parts(8_389_000, 0) + // Minimum execution time: 7_775_000 picoseconds. + Weight::from_parts(8_036_000, 0) .saturating_add(Weight::from_parts(0, 1636)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(1)) @@ -74,8 +74,8 @@ impl runtime_parachains::configuration::WeightInfo for // Proof Size summary in bytes: // Measured: `151` // Estimated: `1636` - // Minimum execution time: 8_038_000 picoseconds. - Weight::from_parts(8_463_000, 0) + // Minimum execution time: 7_708_000 picoseconds. + Weight::from_parts(7_971_000, 0) .saturating_add(Weight::from_parts(0, 1636)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(1)) @@ -90,8 +90,8 @@ impl runtime_parachains::configuration::WeightInfo for // Proof Size summary in bytes: // Measured: `151` // Estimated: `1636` - // Minimum execution time: 7_843_000 picoseconds. - Weight::from_parts(8_216_000, 0) + // Minimum execution time: 7_746_000 picoseconds. + Weight::from_parts(8_028_000, 0) .saturating_add(Weight::from_parts(0, 1636)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(1)) @@ -116,8 +116,8 @@ impl runtime_parachains::configuration::WeightInfo for // Proof Size summary in bytes: // Measured: `151` // Estimated: `1636` - // Minimum execution time: 7_969_000 picoseconds. - Weight::from_parts(8_362_000, 0) + // Minimum execution time: 7_729_000 picoseconds. + Weight::from_parts(7_954_000, 0) .saturating_add(Weight::from_parts(0, 1636)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(1)) @@ -132,8 +132,8 @@ impl runtime_parachains::configuration::WeightInfo for // Proof Size summary in bytes: // Measured: `151` // Estimated: `1636` - // Minimum execution time: 10_084_000 picoseconds. - Weight::from_parts(10_451_000, 0) + // Minimum execution time: 9_871_000 picoseconds. + Weight::from_parts(10_075_000, 0) .saturating_add(Weight::from_parts(0, 1636)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(1)) @@ -148,8 +148,8 @@ impl runtime_parachains::configuration::WeightInfo for // Proof Size summary in bytes: // Measured: `151` // Estimated: `1636` - // Minimum execution time: 7_948_000 picoseconds. - Weight::from_parts(8_268_000, 0) + // Minimum execution time: 7_869_000 picoseconds. + Weight::from_parts(8_000_000, 0) .saturating_add(Weight::from_parts(0, 1636)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(1)) @@ -164,8 +164,24 @@ impl runtime_parachains::configuration::WeightInfo for // Proof Size summary in bytes: // Measured: `151` // Estimated: `1636` - // Minimum execution time: 10_257_000 picoseconds. - Weight::from_parts(10_584_000, 0) + // Minimum execution time: 9_797_000 picoseconds. + Weight::from_parts(10_373_000, 0) + .saturating_add(Weight::from_parts(0, 1636)) + .saturating_add(T::DbWeight::get().reads(3)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `Configuration::PendingConfigs` (r:1 w:1) + /// Proof: `Configuration::PendingConfigs` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Configuration::BypassConsistencyCheck` (r:1 w:0) + /// Proof: `Configuration::BypassConsistencyCheck` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParasShared::CurrentSessionIndex` (r:1 w:0) + /// Proof: `ParasShared::CurrentSessionIndex` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + fn set_config_with_scheduler_params() -> Weight { + // Proof Size summary in bytes: + // Measured: `151` + // Estimated: `1636` + // Minimum execution time: 7_718_000 picoseconds. + Weight::from_parts(7_984_000, 0) .saturating_add(Weight::from_parts(0, 1636)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(1)) diff --git a/polkadot/runtime/westend/src/weights/runtime_parachains_coretime.rs b/polkadot/runtime/westend/src/weights/runtime_parachains_coretime.rs index d9f2d45207b923e3afe661a6021629cb8441970e..aa65a2e9034a7c9f10a3d596db9cf8d167f561ac 100644 --- a/polkadot/runtime/westend/src/weights/runtime_parachains_coretime.rs +++ b/polkadot/runtime/westend/src/weights/runtime_parachains_coretime.rs @@ -16,11 +16,11 @@ //! Autogenerated weights for `runtime_parachains::coretime` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-12-01, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-02-15, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-r43aesjn-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("rococo-dev")`, DB CACHE: 1024 +//! HOSTNAME: `runner-bn-ce5rx-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("westend-dev")`, DB CACHE: 1024 // Executed Command: // target/production/polkadot @@ -32,10 +32,10 @@ // --wasm-execution=compiled // --heap-pages=4096 // --json-file=/builds/parity/mirrors/polkadot-sdk/.git/.artifacts/bench.json -// --pallet=runtime_common::coretime -// --chain=rococo-dev +// --pallet=runtime_parachains::coretime +// --chain=westend-dev // --header=./polkadot/file_header.txt -// --output=./polkadot/runtime/rococo/src/weights/ +// --output=./polkadot/runtime/westend/src/weights/ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -45,28 +45,39 @@ use frame_support::{traits::Get, weights::Weight}; use core::marker::PhantomData; -use runtime_parachains::configuration::{self, WeightInfo as ConfigWeightInfo}; - -/// Weight functions for `runtime_common::coretime`. +/// Weight functions for `runtime_parachains::coretime`. pub struct WeightInfo(PhantomData); -impl runtime_parachains::coretime::WeightInfo for WeightInfo { +impl runtime_parachains::coretime::WeightInfo for WeightInfo { + /// Storage: `Configuration::PendingConfigs` (r:1 w:1) + /// Proof: `Configuration::PendingConfigs` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Configuration::BypassConsistencyCheck` (r:1 w:0) + /// Proof: `Configuration::BypassConsistencyCheck` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParasShared::CurrentSessionIndex` (r:1 w:0) + /// Proof: `ParasShared::CurrentSessionIndex` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) fn request_core_count() -> Weight { - ::WeightInfo::set_config_with_u32() + // Proof Size summary in bytes: + // Measured: `151` + // Estimated: `1636` + // Minimum execution time: 7_486_000 picoseconds. + Weight::from_parts(7_889_000, 0) + .saturating_add(Weight::from_parts(0, 1636)) + .saturating_add(T::DbWeight::get().reads(3)) + .saturating_add(T::DbWeight::get().writes(1)) } - /// Storage: `CoreTimeAssignmentProvider::CoreDescriptors` (r:1 w:1) - /// Proof: `CoreTimeAssignmentProvider::CoreDescriptors` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `CoreTimeAssignmentProvider::CoreSchedules` (r:0 w:1) - /// Proof: `CoreTimeAssignmentProvider::CoreSchedules` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `CoretimeAssignmentProvider::CoreDescriptors` (r:1 w:1) + /// Proof: `CoretimeAssignmentProvider::CoreDescriptors` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `CoretimeAssignmentProvider::CoreSchedules` (r:0 w:1) + /// Proof: `CoretimeAssignmentProvider::CoreSchedules` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `s` is `[1, 100]`. fn assign_core(s: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `76` - // Estimated: `3541` - // Minimum execution time: 6_275_000 picoseconds. - Weight::from_parts(6_883_543, 0) - .saturating_add(Weight::from_parts(0, 3541)) - // Standard Error: 202 - .saturating_add(Weight::from_parts(15_028, 0).saturating_mul(s.into())) + // Measured: `147` + // Estimated: `3612` + // Minimum execution time: 9_409_000 picoseconds. + Weight::from_parts(10_177_115, 0) + .saturating_add(Weight::from_parts(0, 3612)) + // Standard Error: 259 + .saturating_add(Weight::from_parts(13_932, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) } diff --git a/polkadot/runtime/westend/src/weights/runtime_parachains_paras_inherent.rs b/polkadot/runtime/westend/src/weights/runtime_parachains_paras_inherent.rs index 0dd64f054d009ac1aa01e251b01652ea2dd909c4..aa99ac9438c404aad48715370badd821207f669c 100644 --- a/polkadot/runtime/westend/src/weights/runtime_parachains_paras_inherent.rs +++ b/polkadot/runtime/westend/src/weights/runtime_parachains_paras_inherent.rs @@ -16,11 +16,11 @@ //! Autogenerated weights for `runtime_parachains::paras_inherent` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-06-29, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-03-18, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-xerhrdyb-project-163-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("westend-dev"), DB CACHE: 1024 +//! HOSTNAME: `runner-h2rr8wx7-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("westend-dev")`, DB CACHE: 1024 // Executed Command: // target/production/polkadot @@ -29,14 +29,13 @@ // --steps=50 // --repeat=20 // --extrinsic=* -// --execution=wasm // --wasm-execution=compiled // --heap-pages=4096 -// --json-file=/builds/parity/mirrors/polkadot/.git/.artifacts/bench.json +// --json-file=/builds/parity/mirrors/polkadot-sdk/.git/.artifacts/bench.json // --pallet=runtime_parachains::paras_inherent // --chain=westend-dev -// --header=./file_header.txt -// --output=./runtime/westend/src/weights/ +// --header=./polkadot/file_header.txt +// --output=./polkadot/runtime/westend/src/weights/ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -49,297 +48,311 @@ use core::marker::PhantomData; /// Weight functions for `runtime_parachains::paras_inherent`. pub struct WeightInfo(PhantomData); impl runtime_parachains::paras_inherent::WeightInfo for WeightInfo { - /// Storage: ParaInherent Included (r:1 w:1) - /// Proof Skipped: ParaInherent Included (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: System ParentHash (r:1 w:0) - /// Proof: System ParentHash (max_values: Some(1), max_size: Some(32), added: 527, mode: MaxEncodedLen) - /// Storage: ParasShared CurrentSessionIndex (r:1 w:0) - /// Proof Skipped: ParasShared CurrentSessionIndex (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ParaScheduler AvailabilityCores (r:1 w:1) - /// Proof Skipped: ParaScheduler AvailabilityCores (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ParasShared ActiveValidatorKeys (r:1 w:0) - /// Proof Skipped: ParasShared ActiveValidatorKeys (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Babe AuthorVrfRandomness (r:1 w:0) - /// Proof: Babe AuthorVrfRandomness (max_values: Some(1), max_size: Some(33), added: 528, mode: MaxEncodedLen) - /// Storage: ParaSessionInfo Sessions (r:1 w:0) - /// Proof Skipped: ParaSessionInfo Sessions (max_values: None, max_size: None, mode: Measured) - /// Storage: ParasDisputes Disputes (r:1 w:1) - /// Proof Skipped: ParasDisputes Disputes (max_values: None, max_size: None, mode: Measured) - /// Storage: ParasDisputes BackersOnDisputes (r:1 w:1) - /// Proof Skipped: ParasDisputes BackersOnDisputes (max_values: None, max_size: None, mode: Measured) - /// Storage: ParasDisputes Included (r:1 w:1) - /// Proof Skipped: ParasDisputes Included (max_values: None, max_size: None, mode: Measured) - /// Storage: ParaSessionInfo AccountKeys (r:1 w:0) - /// Proof Skipped: ParaSessionInfo AccountKeys (max_values: None, max_size: None, mode: Measured) - /// Storage: Session Validators (r:1 w:0) - /// Proof Skipped: Session Validators (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Staking ActiveEra (r:1 w:0) - /// Proof: Staking ActiveEra (max_values: Some(1), max_size: Some(13), added: 508, mode: MaxEncodedLen) - /// Storage: Staking ErasRewardPoints (r:1 w:1) - /// Proof Skipped: Staking ErasRewardPoints (max_values: None, max_size: None, mode: Measured) - /// Storage: ParaInherent OnChainVotes (r:1 w:1) - /// Proof Skipped: ParaInherent OnChainVotes (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ParasDisputes Frozen (r:1 w:0) - /// Proof Skipped: ParasDisputes Frozen (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ParaInclusion PendingAvailability (r:2 w:1) - /// Proof Skipped: ParaInclusion PendingAvailability (max_values: None, max_size: None, mode: Measured) - /// Storage: Paras Parachains (r:1 w:0) - /// Proof Skipped: Paras Parachains (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ParaInclusion PendingAvailabilityCommitments (r:1 w:1) - /// Proof Skipped: ParaInclusion PendingAvailabilityCommitments (max_values: None, max_size: None, mode: Measured) - /// Storage: Dmp DownwardMessageQueues (r:1 w:1) - /// Proof Skipped: Dmp DownwardMessageQueues (max_values: None, max_size: None, mode: Measured) - /// Storage: Dmp DeliveryFeeFactor (r:1 w:1) - /// Proof Skipped: Dmp DeliveryFeeFactor (max_values: None, max_size: None, mode: Measured) - /// Storage: Hrmp HrmpChannelDigests (r:1 w:1) - /// Proof Skipped: Hrmp HrmpChannelDigests (max_values: None, max_size: None, mode: Measured) - /// Storage: Paras FutureCodeUpgrades (r:1 w:0) - /// Proof Skipped: Paras FutureCodeUpgrades (max_values: None, max_size: None, mode: Measured) - /// Storage: ParaScheduler SessionStartBlock (r:1 w:0) - /// Proof Skipped: ParaScheduler SessionStartBlock (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ParaScheduler ParathreadQueue (r:1 w:1) - /// Proof Skipped: ParaScheduler ParathreadQueue (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ParaScheduler Scheduled (r:1 w:1) - /// Proof Skipped: ParaScheduler Scheduled (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ParaScheduler ValidatorGroups (r:1 w:0) - /// Proof Skipped: ParaScheduler ValidatorGroups (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Hrmp HrmpWatermarks (r:0 w:1) - /// Proof Skipped: Hrmp HrmpWatermarks (max_values: None, max_size: None, mode: Measured) - /// Storage: Paras Heads (r:0 w:1) - /// Proof Skipped: Paras Heads (max_values: None, max_size: None, mode: Measured) - /// Storage: Paras UpgradeGoAheadSignal (r:0 w:1) - /// Proof Skipped: Paras UpgradeGoAheadSignal (max_values: None, max_size: None, mode: Measured) + /// Storage: `ParaInherent::Included` (r:1 w:1) + /// Proof: `ParaInherent::Included` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `System::ParentHash` (r:1 w:0) + /// Proof: `System::ParentHash` (`max_values`: Some(1), `max_size`: Some(32), added: 527, mode: `MaxEncodedLen`) + /// Storage: `ParasShared::AllowedRelayParents` (r:1 w:1) + /// Proof: `ParasShared::AllowedRelayParents` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParasShared::CurrentSessionIndex` (r:1 w:0) + /// Proof: `ParasShared::CurrentSessionIndex` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParaScheduler::AvailabilityCores` (r:1 w:1) + /// Proof: `ParaScheduler::AvailabilityCores` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParasShared::ActiveValidatorKeys` (r:1 w:0) + /// Proof: `ParasShared::ActiveValidatorKeys` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Babe::AuthorVrfRandomness` (r:1 w:0) + /// Proof: `Babe::AuthorVrfRandomness` (`max_values`: Some(1), `max_size`: Some(33), added: 528, mode: `MaxEncodedLen`) + /// Storage: `ParaSessionInfo::Sessions` (r:1 w:0) + /// Proof: `ParaSessionInfo::Sessions` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `ParasDisputes::Disputes` (r:1 w:1) + /// Proof: `ParasDisputes::Disputes` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `ParasDisputes::BackersOnDisputes` (r:1 w:1) + /// Proof: `ParasDisputes::BackersOnDisputes` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `ParasDisputes::Included` (r:1 w:1) + /// Proof: `ParasDisputes::Included` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `ParaSessionInfo::AccountKeys` (r:1 w:0) + /// Proof: `ParaSessionInfo::AccountKeys` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Session::Validators` (r:1 w:0) + /// Proof: `Session::Validators` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Staking::ActiveEra` (r:1 w:0) + /// Proof: `Staking::ActiveEra` (`max_values`: Some(1), `max_size`: Some(13), added: 508, mode: `MaxEncodedLen`) + /// Storage: `Staking::ErasRewardPoints` (r:1 w:1) + /// Proof: `Staking::ErasRewardPoints` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `ParaInherent::OnChainVotes` (r:1 w:1) + /// Proof: `ParaInherent::OnChainVotes` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParasDisputes::Frozen` (r:1 w:0) + /// Proof: `ParasDisputes::Frozen` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParaInclusion::V1` (r:2 w:1) + /// Proof: `ParaInclusion::V1` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Dmp::DownwardMessageQueues` (r:1 w:1) + /// Proof: `Dmp::DownwardMessageQueues` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Dmp::DeliveryFeeFactor` (r:1 w:1) + /// Proof: `Dmp::DeliveryFeeFactor` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpChannelDigests` (r:1 w:1) + /// Proof: `Hrmp::HrmpChannelDigests` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Paras::FutureCodeUpgrades` (r:1 w:0) + /// Proof: `Paras::FutureCodeUpgrades` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `ParaScheduler::SessionStartBlock` (r:1 w:0) + /// Proof: `ParaScheduler::SessionStartBlock` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParaScheduler::ValidatorGroups` (r:1 w:0) + /// Proof: `ParaScheduler::ValidatorGroups` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParaScheduler::ClaimQueue` (r:1 w:1) + /// Proof: `ParaScheduler::ClaimQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `CoretimeAssignmentProvider::CoreDescriptors` (r:1 w:1) + /// Proof: `CoretimeAssignmentProvider::CoreDescriptors` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `ParasShared::ActiveValidatorIndices` (r:1 w:0) + /// Proof: `ParasShared::ActiveValidatorIndices` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Session::DisabledValidators` (r:1 w:0) + /// Proof: `Session::DisabledValidators` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpWatermarks` (r:0 w:1) + /// Proof: `Hrmp::HrmpWatermarks` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Paras::Heads` (r:0 w:1) + /// Proof: `Paras::Heads` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Paras::UpgradeGoAheadSignal` (r:0 w:1) + /// Proof: `Paras::UpgradeGoAheadSignal` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Paras::MostRecentContext` (r:0 w:1) + /// Proof: `Paras::MostRecentContext` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `v` is `[10, 200]`. fn enter_variable_disputes(v: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `50518` - // Estimated: `56458 + v * (23 ±0)` - // Minimum execution time: 998_338_000 picoseconds. - Weight::from_parts(468_412_001, 0) - .saturating_add(Weight::from_parts(0, 56458)) - // Standard Error: 20_559 - .saturating_add(Weight::from_parts(56_965_025, 0).saturating_mul(v.into())) - .saturating_add(T::DbWeight::get().reads(27)) - .saturating_add(T::DbWeight::get().writes(15)) + // Measured: `67518` + // Estimated: `73458 + v * (23 ±0)` + // Minimum execution time: 844_022_000 picoseconds. + Weight::from_parts(456_682_337, 0) + .saturating_add(Weight::from_parts(0, 73458)) + // Standard Error: 16_403 + .saturating_add(Weight::from_parts(41_871_245, 0).saturating_mul(v.into())) + .saturating_add(T::DbWeight::get().reads(28)) + .saturating_add(T::DbWeight::get().writes(16)) .saturating_add(Weight::from_parts(0, 23).saturating_mul(v.into())) } - /// Storage: ParaInherent Included (r:1 w:1) - /// Proof Skipped: ParaInherent Included (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: System ParentHash (r:1 w:0) - /// Proof: System ParentHash (max_values: Some(1), max_size: Some(32), added: 527, mode: MaxEncodedLen) - /// Storage: ParasShared CurrentSessionIndex (r:1 w:0) - /// Proof Skipped: ParasShared CurrentSessionIndex (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ParaScheduler AvailabilityCores (r:1 w:1) - /// Proof Skipped: ParaScheduler AvailabilityCores (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ParasShared ActiveValidatorKeys (r:1 w:0) - /// Proof Skipped: ParasShared ActiveValidatorKeys (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Babe AuthorVrfRandomness (r:1 w:0) - /// Proof: Babe AuthorVrfRandomness (max_values: Some(1), max_size: Some(33), added: 528, mode: MaxEncodedLen) - /// Storage: ParaInherent OnChainVotes (r:1 w:1) - /// Proof Skipped: ParaInherent OnChainVotes (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ParasDisputes Frozen (r:1 w:0) - /// Proof Skipped: ParasDisputes Frozen (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ParaInclusion PendingAvailability (r:2 w:1) - /// Proof Skipped: ParaInclusion PendingAvailability (max_values: None, max_size: None, mode: Measured) - /// Storage: Paras Parachains (r:1 w:0) - /// Proof Skipped: Paras Parachains (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ParaInclusion PendingAvailabilityCommitments (r:1 w:1) - /// Proof Skipped: ParaInclusion PendingAvailabilityCommitments (max_values: None, max_size: None, mode: Measured) - /// Storage: ParaSessionInfo AccountKeys (r:1 w:0) - /// Proof Skipped: ParaSessionInfo AccountKeys (max_values: None, max_size: None, mode: Measured) - /// Storage: Session Validators (r:1 w:0) - /// Proof Skipped: Session Validators (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Staking ActiveEra (r:1 w:0) - /// Proof: Staking ActiveEra (max_values: Some(1), max_size: Some(13), added: 508, mode: MaxEncodedLen) - /// Storage: Staking ErasRewardPoints (r:1 w:1) - /// Proof Skipped: Staking ErasRewardPoints (max_values: None, max_size: None, mode: Measured) - /// Storage: Dmp DownwardMessageQueues (r:1 w:1) - /// Proof Skipped: Dmp DownwardMessageQueues (max_values: None, max_size: None, mode: Measured) - /// Storage: Dmp DeliveryFeeFactor (r:1 w:1) - /// Proof Skipped: Dmp DeliveryFeeFactor (max_values: None, max_size: None, mode: Measured) - /// Storage: Hrmp HrmpChannelDigests (r:1 w:1) - /// Proof Skipped: Hrmp HrmpChannelDigests (max_values: None, max_size: None, mode: Measured) - /// Storage: Paras FutureCodeUpgrades (r:1 w:0) - /// Proof Skipped: Paras FutureCodeUpgrades (max_values: None, max_size: None, mode: Measured) - /// Storage: ParasDisputes Disputes (r:1 w:0) - /// Proof Skipped: ParasDisputes Disputes (max_values: None, max_size: None, mode: Measured) - /// Storage: ParaScheduler SessionStartBlock (r:1 w:0) - /// Proof Skipped: ParaScheduler SessionStartBlock (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ParaScheduler ParathreadQueue (r:1 w:1) - /// Proof Skipped: ParaScheduler ParathreadQueue (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ParaScheduler Scheduled (r:1 w:1) - /// Proof Skipped: ParaScheduler Scheduled (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ParaScheduler ValidatorGroups (r:1 w:0) - /// Proof Skipped: ParaScheduler ValidatorGroups (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ParaInclusion AvailabilityBitfields (r:0 w:1) - /// Proof Skipped: ParaInclusion AvailabilityBitfields (max_values: None, max_size: None, mode: Measured) - /// Storage: ParasDisputes Included (r:0 w:1) - /// Proof Skipped: ParasDisputes Included (max_values: None, max_size: None, mode: Measured) - /// Storage: Hrmp HrmpWatermarks (r:0 w:1) - /// Proof Skipped: Hrmp HrmpWatermarks (max_values: None, max_size: None, mode: Measured) - /// Storage: Paras Heads (r:0 w:1) - /// Proof Skipped: Paras Heads (max_values: None, max_size: None, mode: Measured) - /// Storage: Paras UpgradeGoAheadSignal (r:0 w:1) - /// Proof Skipped: Paras UpgradeGoAheadSignal (max_values: None, max_size: None, mode: Measured) + /// Storage: `ParaInherent::Included` (r:1 w:1) + /// Proof: `ParaInherent::Included` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `System::ParentHash` (r:1 w:0) + /// Proof: `System::ParentHash` (`max_values`: Some(1), `max_size`: Some(32), added: 527, mode: `MaxEncodedLen`) + /// Storage: `ParasShared::AllowedRelayParents` (r:1 w:1) + /// Proof: `ParasShared::AllowedRelayParents` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParasShared::CurrentSessionIndex` (r:1 w:0) + /// Proof: `ParasShared::CurrentSessionIndex` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParaScheduler::AvailabilityCores` (r:1 w:1) + /// Proof: `ParaScheduler::AvailabilityCores` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParasShared::ActiveValidatorKeys` (r:1 w:0) + /// Proof: `ParasShared::ActiveValidatorKeys` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Babe::AuthorVrfRandomness` (r:1 w:0) + /// Proof: `Babe::AuthorVrfRandomness` (`max_values`: Some(1), `max_size`: Some(33), added: 528, mode: `MaxEncodedLen`) + /// Storage: `ParaInherent::OnChainVotes` (r:1 w:1) + /// Proof: `ParaInherent::OnChainVotes` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParasDisputes::Frozen` (r:1 w:0) + /// Proof: `ParasDisputes::Frozen` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParaInclusion::V1` (r:2 w:1) + /// Proof: `ParaInclusion::V1` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `ParaSessionInfo::AccountKeys` (r:1 w:0) + /// Proof: `ParaSessionInfo::AccountKeys` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Session::Validators` (r:1 w:0) + /// Proof: `Session::Validators` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Staking::ActiveEra` (r:1 w:0) + /// Proof: `Staking::ActiveEra` (`max_values`: Some(1), `max_size`: Some(13), added: 508, mode: `MaxEncodedLen`) + /// Storage: `Staking::ErasRewardPoints` (r:1 w:1) + /// Proof: `Staking::ErasRewardPoints` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Dmp::DownwardMessageQueues` (r:1 w:1) + /// Proof: `Dmp::DownwardMessageQueues` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Dmp::DeliveryFeeFactor` (r:1 w:1) + /// Proof: `Dmp::DeliveryFeeFactor` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpChannelDigests` (r:1 w:1) + /// Proof: `Hrmp::HrmpChannelDigests` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Paras::FutureCodeUpgrades` (r:1 w:0) + /// Proof: `Paras::FutureCodeUpgrades` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `ParasDisputes::Disputes` (r:1 w:0) + /// Proof: `ParasDisputes::Disputes` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `ParaScheduler::SessionStartBlock` (r:1 w:0) + /// Proof: `ParaScheduler::SessionStartBlock` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParaScheduler::ValidatorGroups` (r:1 w:0) + /// Proof: `ParaScheduler::ValidatorGroups` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParaScheduler::ClaimQueue` (r:1 w:1) + /// Proof: `ParaScheduler::ClaimQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `CoretimeAssignmentProvider::CoreDescriptors` (r:1 w:1) + /// Proof: `CoretimeAssignmentProvider::CoreDescriptors` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `ParasShared::ActiveValidatorIndices` (r:1 w:0) + /// Proof: `ParasShared::ActiveValidatorIndices` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Session::DisabledValidators` (r:1 w:0) + /// Proof: `Session::DisabledValidators` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParasDisputes::Included` (r:0 w:1) + /// Proof: `ParasDisputes::Included` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpWatermarks` (r:0 w:1) + /// Proof: `Hrmp::HrmpWatermarks` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Paras::Heads` (r:0 w:1) + /// Proof: `Paras::Heads` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Paras::UpgradeGoAheadSignal` (r:0 w:1) + /// Proof: `Paras::UpgradeGoAheadSignal` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Paras::MostRecentContext` (r:0 w:1) + /// Proof: `Paras::MostRecentContext` (`max_values`: None, `max_size`: None, mode: `Measured`) fn enter_bitfields() -> Weight { // Proof Size summary in bytes: - // Measured: `42352` - // Estimated: `48292` - // Minimum execution time: 457_404_000 picoseconds. - Weight::from_parts(485_416_000, 0) - .saturating_add(Weight::from_parts(0, 48292)) - .saturating_add(T::DbWeight::get().reads(25)) + // Measured: `43196` + // Estimated: `49136` + // Minimum execution time: 438_637_000 picoseconds. + Weight::from_parts(458_342_000, 0) + .saturating_add(Weight::from_parts(0, 49136)) + .saturating_add(T::DbWeight::get().reads(26)) .saturating_add(T::DbWeight::get().writes(16)) } - /// Storage: ParaInherent Included (r:1 w:1) - /// Proof Skipped: ParaInherent Included (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: System ParentHash (r:1 w:0) - /// Proof: System ParentHash (max_values: Some(1), max_size: Some(32), added: 527, mode: MaxEncodedLen) - /// Storage: ParasShared CurrentSessionIndex (r:1 w:0) - /// Proof Skipped: ParasShared CurrentSessionIndex (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ParaScheduler AvailabilityCores (r:1 w:1) - /// Proof Skipped: ParaScheduler AvailabilityCores (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ParasShared ActiveValidatorKeys (r:1 w:0) - /// Proof Skipped: ParasShared ActiveValidatorKeys (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Babe AuthorVrfRandomness (r:1 w:0) - /// Proof: Babe AuthorVrfRandomness (max_values: Some(1), max_size: Some(33), added: 528, mode: MaxEncodedLen) - /// Storage: ParaInherent OnChainVotes (r:1 w:1) - /// Proof Skipped: ParaInherent OnChainVotes (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ParasDisputes Frozen (r:1 w:0) - /// Proof Skipped: ParasDisputes Frozen (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ParaInclusion PendingAvailability (r:2 w:1) - /// Proof Skipped: ParaInclusion PendingAvailability (max_values: None, max_size: None, mode: Measured) - /// Storage: Paras Parachains (r:1 w:0) - /// Proof Skipped: Paras Parachains (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ParaInclusion PendingAvailabilityCommitments (r:1 w:1) - /// Proof Skipped: ParaInclusion PendingAvailabilityCommitments (max_values: None, max_size: None, mode: Measured) - /// Storage: ParaSessionInfo AccountKeys (r:1 w:0) - /// Proof Skipped: ParaSessionInfo AccountKeys (max_values: None, max_size: None, mode: Measured) - /// Storage: Session Validators (r:1 w:0) - /// Proof Skipped: Session Validators (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Staking ActiveEra (r:1 w:0) - /// Proof: Staking ActiveEra (max_values: Some(1), max_size: Some(13), added: 508, mode: MaxEncodedLen) - /// Storage: Staking ErasRewardPoints (r:1 w:1) - /// Proof Skipped: Staking ErasRewardPoints (max_values: None, max_size: None, mode: Measured) - /// Storage: Dmp DownwardMessageQueues (r:1 w:1) - /// Proof Skipped: Dmp DownwardMessageQueues (max_values: None, max_size: None, mode: Measured) - /// Storage: Dmp DeliveryFeeFactor (r:1 w:1) - /// Proof Skipped: Dmp DeliveryFeeFactor (max_values: None, max_size: None, mode: Measured) - /// Storage: Hrmp HrmpChannelDigests (r:1 w:1) - /// Proof Skipped: Hrmp HrmpChannelDigests (max_values: None, max_size: None, mode: Measured) - /// Storage: Paras FutureCodeUpgrades (r:1 w:0) - /// Proof Skipped: Paras FutureCodeUpgrades (max_values: None, max_size: None, mode: Measured) - /// Storage: ParasDisputes Disputes (r:1 w:0) - /// Proof Skipped: ParasDisputes Disputes (max_values: None, max_size: None, mode: Measured) - /// Storage: ParaScheduler SessionStartBlock (r:1 w:0) - /// Proof Skipped: ParaScheduler SessionStartBlock (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ParaScheduler ParathreadQueue (r:1 w:1) - /// Proof Skipped: ParaScheduler ParathreadQueue (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ParaScheduler Scheduled (r:1 w:1) - /// Proof Skipped: ParaScheduler Scheduled (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ParaScheduler ValidatorGroups (r:1 w:0) - /// Proof Skipped: ParaScheduler ValidatorGroups (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Paras CurrentCodeHash (r:1 w:0) - /// Proof Skipped: Paras CurrentCodeHash (max_values: None, max_size: None, mode: Measured) - /// Storage: Paras ParaLifecycles (r:1 w:0) - /// Proof Skipped: Paras ParaLifecycles (max_values: None, max_size: None, mode: Measured) - /// Storage: MessageQueue BookStateFor (r:1 w:0) - /// Proof: MessageQueue BookStateFor (max_values: None, max_size: Some(55), added: 2530, mode: MaxEncodedLen) - /// Storage: ParasDisputes Included (r:0 w:1) - /// Proof Skipped: ParasDisputes Included (max_values: None, max_size: None, mode: Measured) - /// Storage: Hrmp HrmpWatermarks (r:0 w:1) - /// Proof Skipped: Hrmp HrmpWatermarks (max_values: None, max_size: None, mode: Measured) - /// Storage: Paras Heads (r:0 w:1) - /// Proof Skipped: Paras Heads (max_values: None, max_size: None, mode: Measured) - /// Storage: Paras UpgradeGoAheadSignal (r:0 w:1) - /// Proof Skipped: Paras UpgradeGoAheadSignal (max_values: None, max_size: None, mode: Measured) + /// Storage: `ParaInherent::Included` (r:1 w:1) + /// Proof: `ParaInherent::Included` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `System::ParentHash` (r:1 w:0) + /// Proof: `System::ParentHash` (`max_values`: Some(1), `max_size`: Some(32), added: 527, mode: `MaxEncodedLen`) + /// Storage: `ParasShared::AllowedRelayParents` (r:1 w:1) + /// Proof: `ParasShared::AllowedRelayParents` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParasShared::CurrentSessionIndex` (r:1 w:0) + /// Proof: `ParasShared::CurrentSessionIndex` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParaScheduler::AvailabilityCores` (r:1 w:1) + /// Proof: `ParaScheduler::AvailabilityCores` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParasShared::ActiveValidatorKeys` (r:1 w:0) + /// Proof: `ParasShared::ActiveValidatorKeys` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Babe::AuthorVrfRandomness` (r:1 w:0) + /// Proof: `Babe::AuthorVrfRandomness` (`max_values`: Some(1), `max_size`: Some(33), added: 528, mode: `MaxEncodedLen`) + /// Storage: `ParaInherent::OnChainVotes` (r:1 w:1) + /// Proof: `ParaInherent::OnChainVotes` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParasDisputes::Frozen` (r:1 w:0) + /// Proof: `ParasDisputes::Frozen` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParaInclusion::V1` (r:2 w:1) + /// Proof: `ParaInclusion::V1` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `ParaSessionInfo::AccountKeys` (r:1 w:0) + /// Proof: `ParaSessionInfo::AccountKeys` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Session::Validators` (r:1 w:0) + /// Proof: `Session::Validators` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Staking::ActiveEra` (r:1 w:0) + /// Proof: `Staking::ActiveEra` (`max_values`: Some(1), `max_size`: Some(13), added: 508, mode: `MaxEncodedLen`) + /// Storage: `Staking::ErasRewardPoints` (r:1 w:1) + /// Proof: `Staking::ErasRewardPoints` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Dmp::DownwardMessageQueues` (r:1 w:1) + /// Proof: `Dmp::DownwardMessageQueues` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Dmp::DeliveryFeeFactor` (r:1 w:1) + /// Proof: `Dmp::DeliveryFeeFactor` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpChannelDigests` (r:1 w:1) + /// Proof: `Hrmp::HrmpChannelDigests` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Paras::FutureCodeUpgrades` (r:1 w:0) + /// Proof: `Paras::FutureCodeUpgrades` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `ParasDisputes::Disputes` (r:1 w:0) + /// Proof: `ParasDisputes::Disputes` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `ParaScheduler::SessionStartBlock` (r:1 w:0) + /// Proof: `ParaScheduler::SessionStartBlock` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParaScheduler::ValidatorGroups` (r:1 w:0) + /// Proof: `ParaScheduler::ValidatorGroups` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParaScheduler::ClaimQueue` (r:1 w:1) + /// Proof: `ParaScheduler::ClaimQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `CoretimeAssignmentProvider::CoreDescriptors` (r:1 w:1) + /// Proof: `CoretimeAssignmentProvider::CoreDescriptors` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Paras::CurrentCodeHash` (r:1 w:0) + /// Proof: `Paras::CurrentCodeHash` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Paras::ParaLifecycles` (r:1 w:0) + /// Proof: `Paras::ParaLifecycles` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `MessageQueue::BookStateFor` (r:1 w:0) + /// Proof: `MessageQueue::BookStateFor` (`max_values`: None, `max_size`: Some(55), added: 2530, mode: `MaxEncodedLen`) + /// Storage: `ParasShared::ActiveValidatorIndices` (r:1 w:0) + /// Proof: `ParasShared::ActiveValidatorIndices` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Session::DisabledValidators` (r:1 w:0) + /// Proof: `Session::DisabledValidators` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParasDisputes::Included` (r:0 w:1) + /// Proof: `ParasDisputes::Included` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpWatermarks` (r:0 w:1) + /// Proof: `Hrmp::HrmpWatermarks` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Paras::Heads` (r:0 w:1) + /// Proof: `Paras::Heads` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Paras::UpgradeGoAheadSignal` (r:0 w:1) + /// Proof: `Paras::UpgradeGoAheadSignal` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Paras::MostRecentContext` (r:0 w:1) + /// Proof: `Paras::MostRecentContext` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `v` is `[101, 200]`. fn enter_backed_candidates_variable(v: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `42387` - // Estimated: `48327` - // Minimum execution time: 6_864_029_000 picoseconds. - Weight::from_parts(1_237_704_892, 0) - .saturating_add(Weight::from_parts(0, 48327)) - // Standard Error: 33_413 - .saturating_add(Weight::from_parts(56_199_819, 0).saturating_mul(v.into())) - .saturating_add(T::DbWeight::get().reads(28)) - .saturating_add(T::DbWeight::get().writes(15)) + // Measured: `43269` + // Estimated: `49209` + // Minimum execution time: 5_955_361_000 picoseconds. + Weight::from_parts(1_285_398_956, 0) + .saturating_add(Weight::from_parts(0, 49209)) + // Standard Error: 57_369 + .saturating_add(Weight::from_parts(47_073_853, 0).saturating_mul(v.into())) + .saturating_add(T::DbWeight::get().reads(29)) + .saturating_add(T::DbWeight::get().writes(16)) } - /// Storage: ParaInherent Included (r:1 w:1) - /// Proof Skipped: ParaInherent Included (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: System ParentHash (r:1 w:0) - /// Proof: System ParentHash (max_values: Some(1), max_size: Some(32), added: 527, mode: MaxEncodedLen) - /// Storage: ParasShared CurrentSessionIndex (r:1 w:0) - /// Proof Skipped: ParasShared CurrentSessionIndex (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ParaScheduler AvailabilityCores (r:1 w:1) - /// Proof Skipped: ParaScheduler AvailabilityCores (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ParasShared ActiveValidatorKeys (r:1 w:0) - /// Proof Skipped: ParasShared ActiveValidatorKeys (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Babe AuthorVrfRandomness (r:1 w:0) - /// Proof: Babe AuthorVrfRandomness (max_values: Some(1), max_size: Some(33), added: 528, mode: MaxEncodedLen) - /// Storage: ParaInherent OnChainVotes (r:1 w:1) - /// Proof Skipped: ParaInherent OnChainVotes (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ParasDisputes Frozen (r:1 w:0) - /// Proof Skipped: ParasDisputes Frozen (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ParaInclusion PendingAvailability (r:2 w:1) - /// Proof Skipped: ParaInclusion PendingAvailability (max_values: None, max_size: None, mode: Measured) - /// Storage: Paras Parachains (r:1 w:0) - /// Proof Skipped: Paras Parachains (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ParaInclusion PendingAvailabilityCommitments (r:1 w:1) - /// Proof Skipped: ParaInclusion PendingAvailabilityCommitments (max_values: None, max_size: None, mode: Measured) - /// Storage: ParaSessionInfo AccountKeys (r:1 w:0) - /// Proof Skipped: ParaSessionInfo AccountKeys (max_values: None, max_size: None, mode: Measured) - /// Storage: Session Validators (r:1 w:0) - /// Proof Skipped: Session Validators (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Staking ActiveEra (r:1 w:0) - /// Proof: Staking ActiveEra (max_values: Some(1), max_size: Some(13), added: 508, mode: MaxEncodedLen) - /// Storage: Staking ErasRewardPoints (r:1 w:1) - /// Proof Skipped: Staking ErasRewardPoints (max_values: None, max_size: None, mode: Measured) - /// Storage: Dmp DownwardMessageQueues (r:1 w:1) - /// Proof Skipped: Dmp DownwardMessageQueues (max_values: None, max_size: None, mode: Measured) - /// Storage: Dmp DeliveryFeeFactor (r:1 w:1) - /// Proof Skipped: Dmp DeliveryFeeFactor (max_values: None, max_size: None, mode: Measured) - /// Storage: Hrmp HrmpChannelDigests (r:1 w:1) - /// Proof Skipped: Hrmp HrmpChannelDigests (max_values: None, max_size: None, mode: Measured) - /// Storage: Paras FutureCodeUpgrades (r:1 w:0) - /// Proof Skipped: Paras FutureCodeUpgrades (max_values: None, max_size: None, mode: Measured) - /// Storage: ParasDisputes Disputes (r:1 w:0) - /// Proof Skipped: ParasDisputes Disputes (max_values: None, max_size: None, mode: Measured) - /// Storage: ParaScheduler SessionStartBlock (r:1 w:0) - /// Proof Skipped: ParaScheduler SessionStartBlock (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ParaScheduler ParathreadQueue (r:1 w:1) - /// Proof Skipped: ParaScheduler ParathreadQueue (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ParaScheduler Scheduled (r:1 w:1) - /// Proof Skipped: ParaScheduler Scheduled (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ParaScheduler ValidatorGroups (r:1 w:0) - /// Proof Skipped: ParaScheduler ValidatorGroups (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Paras CurrentCodeHash (r:1 w:0) - /// Proof Skipped: Paras CurrentCodeHash (max_values: None, max_size: None, mode: Measured) - /// Storage: Paras FutureCodeHash (r:1 w:0) - /// Proof Skipped: Paras FutureCodeHash (max_values: None, max_size: None, mode: Measured) - /// Storage: Paras UpgradeRestrictionSignal (r:1 w:0) - /// Proof Skipped: Paras UpgradeRestrictionSignal (max_values: None, max_size: None, mode: Measured) - /// Storage: Paras ParaLifecycles (r:1 w:0) - /// Proof Skipped: Paras ParaLifecycles (max_values: None, max_size: None, mode: Measured) - /// Storage: MessageQueue BookStateFor (r:1 w:0) - /// Proof: MessageQueue BookStateFor (max_values: None, max_size: Some(55), added: 2530, mode: MaxEncodedLen) - /// Storage: ParasDisputes Included (r:0 w:1) - /// Proof Skipped: ParasDisputes Included (max_values: None, max_size: None, mode: Measured) - /// Storage: Hrmp HrmpWatermarks (r:0 w:1) - /// Proof Skipped: Hrmp HrmpWatermarks (max_values: None, max_size: None, mode: Measured) - /// Storage: Paras Heads (r:0 w:1) - /// Proof Skipped: Paras Heads (max_values: None, max_size: None, mode: Measured) - /// Storage: Paras UpgradeGoAheadSignal (r:0 w:1) - /// Proof Skipped: Paras UpgradeGoAheadSignal (max_values: None, max_size: None, mode: Measured) + /// Storage: `ParaInherent::Included` (r:1 w:1) + /// Proof: `ParaInherent::Included` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `System::ParentHash` (r:1 w:0) + /// Proof: `System::ParentHash` (`max_values`: Some(1), `max_size`: Some(32), added: 527, mode: `MaxEncodedLen`) + /// Storage: `ParasShared::AllowedRelayParents` (r:1 w:1) + /// Proof: `ParasShared::AllowedRelayParents` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParasShared::CurrentSessionIndex` (r:1 w:0) + /// Proof: `ParasShared::CurrentSessionIndex` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParaScheduler::AvailabilityCores` (r:1 w:1) + /// Proof: `ParaScheduler::AvailabilityCores` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParasShared::ActiveValidatorKeys` (r:1 w:0) + /// Proof: `ParasShared::ActiveValidatorKeys` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Babe::AuthorVrfRandomness` (r:1 w:0) + /// Proof: `Babe::AuthorVrfRandomness` (`max_values`: Some(1), `max_size`: Some(33), added: 528, mode: `MaxEncodedLen`) + /// Storage: `ParaInherent::OnChainVotes` (r:1 w:1) + /// Proof: `ParaInherent::OnChainVotes` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParasDisputes::Frozen` (r:1 w:0) + /// Proof: `ParasDisputes::Frozen` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParaInclusion::V1` (r:2 w:1) + /// Proof: `ParaInclusion::V1` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `ParaSessionInfo::AccountKeys` (r:1 w:0) + /// Proof: `ParaSessionInfo::AccountKeys` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Session::Validators` (r:1 w:0) + /// Proof: `Session::Validators` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Staking::ActiveEra` (r:1 w:0) + /// Proof: `Staking::ActiveEra` (`max_values`: Some(1), `max_size`: Some(13), added: 508, mode: `MaxEncodedLen`) + /// Storage: `Staking::ErasRewardPoints` (r:1 w:1) + /// Proof: `Staking::ErasRewardPoints` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Dmp::DownwardMessageQueues` (r:1 w:1) + /// Proof: `Dmp::DownwardMessageQueues` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Dmp::DeliveryFeeFactor` (r:1 w:1) + /// Proof: `Dmp::DeliveryFeeFactor` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpChannelDigests` (r:1 w:1) + /// Proof: `Hrmp::HrmpChannelDigests` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Paras::FutureCodeUpgrades` (r:1 w:0) + /// Proof: `Paras::FutureCodeUpgrades` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `ParasDisputes::Disputes` (r:1 w:0) + /// Proof: `ParasDisputes::Disputes` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `ParaScheduler::SessionStartBlock` (r:1 w:0) + /// Proof: `ParaScheduler::SessionStartBlock` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParaScheduler::ValidatorGroups` (r:1 w:0) + /// Proof: `ParaScheduler::ValidatorGroups` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParaScheduler::ClaimQueue` (r:1 w:1) + /// Proof: `ParaScheduler::ClaimQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `CoretimeAssignmentProvider::CoreDescriptors` (r:1 w:1) + /// Proof: `CoretimeAssignmentProvider::CoreDescriptors` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Paras::CurrentCodeHash` (r:1 w:0) + /// Proof: `Paras::CurrentCodeHash` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Paras::FutureCodeHash` (r:1 w:0) + /// Proof: `Paras::FutureCodeHash` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Paras::UpgradeRestrictionSignal` (r:1 w:0) + /// Proof: `Paras::UpgradeRestrictionSignal` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Paras::ParaLifecycles` (r:1 w:0) + /// Proof: `Paras::ParaLifecycles` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `MessageQueue::BookStateFor` (r:1 w:0) + /// Proof: `MessageQueue::BookStateFor` (`max_values`: None, `max_size`: Some(55), added: 2530, mode: `MaxEncodedLen`) + /// Storage: `ParasShared::ActiveValidatorIndices` (r:1 w:0) + /// Proof: `ParasShared::ActiveValidatorIndices` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Session::DisabledValidators` (r:1 w:0) + /// Proof: `Session::DisabledValidators` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParasDisputes::Included` (r:0 w:1) + /// Proof: `ParasDisputes::Included` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Hrmp::HrmpWatermarks` (r:0 w:1) + /// Proof: `Hrmp::HrmpWatermarks` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Paras::Heads` (r:0 w:1) + /// Proof: `Paras::Heads` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Paras::UpgradeGoAheadSignal` (r:0 w:1) + /// Proof: `Paras::UpgradeGoAheadSignal` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Paras::MostRecentContext` (r:0 w:1) + /// Proof: `Paras::MostRecentContext` (`max_values`: None, `max_size`: None, mode: `Measured`) fn enter_backed_candidate_code_upgrade() -> Weight { // Proof Size summary in bytes: - // Measured: `42414` - // Estimated: `48354` - // Minimum execution time: 43_320_529_000 picoseconds. - Weight::from_parts(45_622_613_000, 0) - .saturating_add(Weight::from_parts(0, 48354)) - .saturating_add(T::DbWeight::get().reads(30)) - .saturating_add(T::DbWeight::get().writes(15)) + // Measured: `43282` + // Estimated: `49222` + // Minimum execution time: 42_128_606_000 picoseconds. + Weight::from_parts(42_822_806_000, 0) + .saturating_add(Weight::from_parts(0, 49222)) + .saturating_add(T::DbWeight::get().reads(31)) + .saturating_add(T::DbWeight::get().writes(16)) } } diff --git a/polkadot/runtime/westend/src/weights/xcm/mod.rs b/polkadot/runtime/westend/src/weights/xcm/mod.rs index 0162012825ff7e4d47c43868ac94f894b38514c7..09e883a9f7af5820832e7db52a8eeba5148d3a48 100644 --- a/polkadot/runtime/westend/src/weights/xcm/mod.rs +++ b/polkadot/runtime/westend/src/weights/xcm/mod.rs @@ -142,7 +142,7 @@ impl XcmWeightInfo for WestendXcmWeight { fn descend_origin(_who: &InteriorLocation) -> Weight { XcmGeneric::::descend_origin() } - fn report_error(_query_repsonse_info: &QueryResponseInfo) -> Weight { + fn report_error(_query_response_info: &QueryResponseInfo) -> Weight { XcmGeneric::::report_error() } diff --git a/polkadot/runtime/westend/src/xcm_config.rs b/polkadot/runtime/westend/src/xcm_config.rs index 8c2fea69006089992e7af99658e903b6b01f7942..f661c4b0e4f437a2f2d597d8bdef26e0b76930c3 100644 --- a/polkadot/runtime/westend/src/xcm_config.rs +++ b/polkadot/runtime/westend/src/xcm_config.rs @@ -34,21 +34,18 @@ use runtime_common::{ }; use sp_core::ConstU32; use westend_runtime_constants::{ - currency::CENTS, - system_parachain::*, - xcm::body::{FELLOWSHIP_ADMIN_INDEX, TREASURER_INDEX}, + currency::CENTS, system_parachain::*, xcm::body::FELLOWSHIP_ADMIN_INDEX, }; use xcm::latest::prelude::*; -#[allow(deprecated)] -use xcm_builder::CurrencyAdapter as XcmCurrencyAdapter; use xcm_builder::{ AccountId32Aliases, AllowExplicitUnpaidExecutionFrom, AllowKnownQueryResponses, AllowSubscriptionsFrom, AllowTopLevelPaidExecutionFrom, ChildParachainAsNative, - ChildParachainConvertsVia, DescribeBodyTerminal, DescribeFamily, FrameTransactionalProcessor, - HashedDescription, IsConcrete, MintLocation, OriginToPluralityVoice, SignedAccountId32AsNative, - SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit, TrailingSetTopicAsId, - UsingComponents, WeightInfoBounds, WithComputedOrigin, WithUniqueTopic, - XcmFeeManagerFromComponents, XcmFeeToAccount, + ChildParachainConvertsVia, DescribeAllTerminal, DescribeFamily, FrameTransactionalProcessor, + FungibleAdapter, HashedDescription, IsChildSystemParachain, IsConcrete, MintLocation, + OriginToPluralityVoice, SignedAccountId32AsNative, SignedToAccountId32, + SovereignSignedViaLocation, TakeWeightCredit, TrailingSetTopicAsId, UsingComponents, + WeightInfoBounds, WithComputedOrigin, WithUniqueTopic, XcmFeeManagerFromComponents, + XcmFeeToAccount, }; use xcm_executor::XcmExecutor; @@ -71,12 +68,11 @@ pub type LocationConverter = ( ChildParachainConvertsVia, // We can directly alias an `AccountId32` into a local account. AccountId32Aliases, - // Allow governance body to be used as a sovereign account. - HashedDescription>, + // Foreign locations alias into accounts according to a hash of their standard description. + HashedDescription>, ); -#[allow(deprecated)] -pub type LocalAssetTransactor = XcmCurrencyAdapter< +pub type LocalAssetTransactor = FungibleAdapter< // Use this currency: Balances, // Use this currency when it is a fungible asset matching the given location or name: @@ -117,12 +113,16 @@ parameter_types! { pub AssetHub: Location = Parachain(ASSET_HUB_ID).into_location(); pub Collectives: Location = Parachain(COLLECTIVES_ID).into_location(); pub BridgeHub: Location = Parachain(BRIDGE_HUB_ID).into_location(); + pub Encointer: Location = Parachain(ENCOINTER_ID).into_location(); pub People: Location = Parachain(PEOPLE_ID).into_location(); + pub Broker: Location = Parachain(BROKER_ID).into_location(); pub Wnd: AssetFilter = Wild(AllOf { fun: WildFungible, id: AssetId(TokenLocation::get()) }); pub WndForAssetHub: (AssetFilter, Location) = (Wnd::get(), AssetHub::get()); pub WndForCollectives: (AssetFilter, Location) = (Wnd::get(), Collectives::get()); pub WndForBridgeHub: (AssetFilter, Location) = (Wnd::get(), BridgeHub::get()); + pub WndForEncointer: (AssetFilter, Location) = (Wnd::get(), Encointer::get()); pub WndForPeople: (AssetFilter, Location) = (Wnd::get(), People::get()); + pub WndForBroker: (AssetFilter, Location) = (Wnd::get(), Broker::get()); pub MaxInstructions: u32 = 100; pub MaxAssetsIntoHolding: u32 = 64; } @@ -131,7 +131,9 @@ pub type TrustedTeleporters = ( xcm_builder::Case, xcm_builder::Case, xcm_builder::Case, + xcm_builder::Case, xcm_builder::Case, + xcm_builder::Case, ); pub struct OnlyParachains; @@ -141,13 +143,12 @@ impl Contains for OnlyParachains { } } -pub struct CollectivesOrFellows; -impl Contains for CollectivesOrFellows { +pub struct Fellows; +impl Contains for Fellows { fn contains(location: &Location) -> bool { matches!( location.unpack(), - (0, [Parachain(COLLECTIVES_ID)]) | - (0, [Parachain(COLLECTIVES_ID), Plurality { id: BodyId::Technical, .. }]) + (0, [Parachain(COLLECTIVES_ID), Plurality { id: BodyId::Technical, .. }]) ) } } @@ -171,8 +172,8 @@ pub type Barrier = TrailingSetTopicAsId<( AllowTopLevelPaidExecutionFrom, // Subscriptions for version tracking are OK. AllowSubscriptionsFrom, - // Collectives and Fellows plurality get free execution. - AllowExplicitUnpaidExecutionFrom, + // Messages from system parachains or the Fellows plurality need not pay for execution. + AllowExplicitUnpaidExecutionFrom<(IsChildSystemParachain, Fellows)>, ), UniversalLocation, ConstU32<8>, @@ -218,6 +219,9 @@ impl xcm_executor::Config for XcmConfig { type SafeCallFilter = Everything; type Aliasers = Nothing; type TransactionalProcessor = FrameTransactionalProcessor; + type HrmpNewChannelOpenRequestHandler = (); + type HrmpChannelAcceptedHandler = (); + type HrmpChannelClosingHandler = (); } parameter_types! { @@ -228,7 +232,7 @@ parameter_types! { // FellowshipAdmin pluralistic body. pub const FellowshipAdminBodyId: BodyId = BodyId::Index(FELLOWSHIP_ADMIN_INDEX); // `Treasurer` pluralistic body. - pub const TreasurerBodyId: BodyId = BodyId::Index(TREASURER_INDEX); + pub const TreasurerBodyId: BodyId = BodyId::Treasury; } /// Type to convert the `GeneralAdmin` origin to a Plurality `Location` value. @@ -262,18 +266,19 @@ pub type LocalPalletOriginToLocation = ( StakingAdminToPlurality, // FellowshipAdmin origin to be used in XCM as a corresponding Plurality `Location` value. FellowshipAdminToPlurality, - // `Treasurer` origin to be used in XCM as a corresponding Plurality `MultiLocation` value. + // `Treasurer` origin to be used in XCM as a corresponding Plurality `Location` value. TreasurerToPlurality, ); impl pallet_xcm::Config for Runtime { type RuntimeEvent = RuntimeEvent; - type SendXcmOrigin = xcm_builder::EnsureXcmOrigin; + // Note that this configuration of `SendXcmOrigin` is different from the one present in + // production. + type SendXcmOrigin = xcm_builder::EnsureXcmOrigin; type XcmRouter = XcmRouter; - // Anyone can execute XCM messages locally... + // Anyone can execute XCM messages locally. type ExecuteXcmOrigin = xcm_builder::EnsureXcmOrigin; - // ...but they must match our filter, which rejects everything. - type XcmExecuteFilter = Nothing; + type XcmExecuteFilter = Everything; type XcmExecutor = XcmExecutor; type XcmTeleportFilter = Everything; type XcmReserveTransferFilter = Everything; diff --git a/polkadot/scripts/build-only-wasm.sh b/polkadot/scripts/build-only-wasm.sh index b6da3319c8214aeca3ca54b76fda87d83077eec5..50b786dab41014dd53cd3e4dea3e02f66fd8b42d 100755 --- a/polkadot/scripts/build-only-wasm.sh +++ b/polkadot/scripts/build-only-wasm.sh @@ -13,6 +13,14 @@ fi WASM_BUILDER_RUNNER="$PROJECT_ROOT/target/release/wbuild-runner/$1" +fl_cargo () { + if command -v forklift >/dev/null 2>&1; then + forklift cargo "$@"; + else + cargo "$@"; + fi +} + if [ -z "$2" ]; then export WASM_TARGET_DIRECTORY=$(pwd) else @@ -22,8 +30,8 @@ fi if [ -d $WASM_BUILDER_RUNNER ]; then export DEBUG=false export OUT_DIR="$PROJECT_ROOT/target/release/build" - cargo run --release --manifest-path="$WASM_BUILDER_RUNNER/Cargo.toml" \ + fl_cargo run --release --manifest-path="$WASM_BUILDER_RUNNER/Cargo.toml" \ | grep -vE "cargo:rerun-if-|Executing build command" else - cargo build --release -p $1 + fl_cargo build --release -p $1 fi diff --git a/polkadot/scripts/packaging/polkadot.service b/polkadot/scripts/packaging/polkadot.service index 7fb549c97f8b9ee439e960d1ff233aff8a6bd514..8c5a483d4243e2a921a40a4b8a9b872efdbdaeb5 100644 --- a/polkadot/scripts/packaging/polkadot.service +++ b/polkadot/scripts/packaging/polkadot.service @@ -25,12 +25,13 @@ ProtectKernelTunables=true ProtectSystem=strict RemoveIPC=true RestrictAddressFamilies=AF_INET AF_INET6 AF_NETLINK AF_UNIX -RestrictNamespaces=true +RestrictNamespaces=false RestrictSUIDSGID=true SystemCallArchitectures=native SystemCallFilter=@system-service -SystemCallFilter=landlock_add_rule landlock_create_ruleset landlock_restrict_self seccomp -SystemCallFilter=~@clock @module @mount @reboot @swap @privileged +SystemCallFilter=landlock_add_rule landlock_create_ruleset landlock_restrict_self seccomp mount umount2 +SystemCallFilter=~@clock @module @reboot @swap @privileged +SystemCallFilter=pivot_root UMask=0027 [Install] diff --git a/polkadot/statement-table/Cargo.toml b/polkadot/statement-table/Cargo.toml index 6403b822ed9b1ad6879698b3909f0f48daf1e765..37b8a99d640a2d23e0d7a532adc0c43b04bba1f2 100644 --- a/polkadot/statement-table/Cargo.toml +++ b/polkadot/statement-table/Cargo.toml @@ -13,3 +13,4 @@ workspace = true parity-scale-codec = { version = "3.6.1", default-features = false, features = ["derive"] } sp-core = { path = "../../substrate/primitives/core" } primitives = { package = "polkadot-primitives", path = "../primitives" } +gum = { package = "tracing-gum", path = "../node/gum" } diff --git a/polkadot/statement-table/src/generic.rs b/polkadot/statement-table/src/generic.rs index 22bffde5acc11b8fdbea565d054949caf40d788f..2ee6f6a4f781842866728e2105d6c23e2fa1cd70 100644 --- a/polkadot/statement-table/src/generic.rs +++ b/polkadot/statement-table/src/generic.rs @@ -36,6 +36,7 @@ use primitives::{ }; use parity_scale_codec::{Decode, Encode}; +const LOG_TARGET: &str = "parachain::statement-table"; /// Context for the statement table. pub trait Context { @@ -53,9 +54,6 @@ pub trait Context { /// get the digest of a candidate. fn candidate_digest(candidate: &Self::Candidate) -> Self::Digest; - /// get the group of a candidate. - fn candidate_group(candidate: &Self::Candidate) -> Self::GroupId; - /// Whether a authority is a member of a group. /// Members are meant to submit candidates and vote on validity. fn is_member_of(&self, authority: &Self::AuthorityId, group: &Self::GroupId) -> bool; @@ -342,13 +340,13 @@ impl Table { pub fn import_statement( &mut self, context: &Ctx, + group_id: Ctx::GroupId, statement: SignedStatement, ) -> Option> { let SignedStatement { statement, signature, sender: signer } = statement; - let res = match statement { Statement::Seconded(candidate) => - self.import_candidate(context, signer.clone(), candidate, signature), + self.import_candidate(context, signer.clone(), candidate, signature, group_id), Statement::Valid(digest) => self.validity_vote(context, signer.clone(), digest, ValidityVote::Valid(signature)), }; @@ -387,9 +385,10 @@ impl Table { authority: Ctx::AuthorityId, candidate: Ctx::Candidate, signature: Ctx::Signature, + group: Ctx::GroupId, ) -> ImportResult { - let group = Ctx::candidate_group(&candidate); if !context.is_member_of(&authority, &group) { + gum::debug!(target: LOG_TARGET, authority = ?authority, group = ?group, "New `Misbehavior::UnauthorizedStatement`, candidate backed by validator that doesn't belong to expected group" ); return Err(Misbehavior::UnauthorizedStatement(UnauthorizedStatement { statement: SignedStatement { signature, @@ -634,10 +633,6 @@ mod tests { Digest(candidate.1) } - fn candidate_group(candidate: &Candidate) -> GroupId { - GroupId(candidate.0) - } - fn is_member_of(&self, authority: &AuthorityId, group: &GroupId) -> bool { self.authorities.get(authority).map(|v| v == group).unwrap_or(false) } @@ -675,10 +670,10 @@ mod tests { sender: AuthorityId(1), }; - table.import_statement(&context, statement_a); + table.import_statement(&context, GroupId(2), statement_a); assert!(!table.detected_misbehavior.contains_key(&AuthorityId(1))); - table.import_statement(&context, statement_b); + table.import_statement(&context, GroupId(2), statement_b); assert_eq!( table.detected_misbehavior[&AuthorityId(1)][0], Misbehavior::MultipleCandidates(MultipleCandidates { @@ -711,10 +706,10 @@ mod tests { sender: AuthorityId(1), }; - table.import_statement(&context, statement_a); + table.import_statement(&context, GroupId(2), statement_a); assert!(!table.detected_misbehavior.contains_key(&AuthorityId(1))); - table.import_statement(&context, statement_b); + table.import_statement(&context, GroupId(2), statement_b); assert!(!table.detected_misbehavior.contains_key(&AuthorityId(1))); } @@ -735,7 +730,7 @@ mod tests { sender: AuthorityId(1), }; - table.import_statement(&context, statement); + table.import_statement(&context, GroupId(2), statement); assert_eq!( table.detected_misbehavior[&AuthorityId(1)][0], @@ -769,7 +764,7 @@ mod tests { }; let candidate_a_digest = Digest(100); - table.import_statement(&context, candidate_a); + table.import_statement(&context, GroupId(2), candidate_a); assert!(!table.detected_misbehavior.contains_key(&AuthorityId(1))); assert!(!table.detected_misbehavior.contains_key(&AuthorityId(2))); @@ -779,7 +774,7 @@ mod tests { signature: Signature(2), sender: AuthorityId(2), }; - table.import_statement(&context, bad_validity_vote); + table.import_statement(&context, GroupId(3), bad_validity_vote); assert_eq!( table.detected_misbehavior[&AuthorityId(2)][0], @@ -811,7 +806,7 @@ mod tests { sender: AuthorityId(1), }; - table.import_statement(&context, statement); + table.import_statement(&context, GroupId(2), statement); assert!(!table.detected_misbehavior.contains_key(&AuthorityId(1))); let invalid_statement = SignedStatement { @@ -820,7 +815,7 @@ mod tests { sender: AuthorityId(1), }; - table.import_statement(&context, invalid_statement); + table.import_statement(&context, GroupId(2), invalid_statement); assert!(table.detected_misbehavior.contains_key(&AuthorityId(1))); } @@ -842,7 +837,7 @@ mod tests { }; let candidate_digest = Digest(100); - table.import_statement(&context, statement); + table.import_statement(&context, GroupId(2), statement); assert!(!table.detected_misbehavior.contains_key(&AuthorityId(1))); let extra_vote = SignedStatement { @@ -851,7 +846,7 @@ mod tests { sender: AuthorityId(1), }; - table.import_statement(&context, extra_vote); + table.import_statement(&context, GroupId(2), extra_vote); assert_eq!( table.detected_misbehavior[&AuthorityId(1)][0], Misbehavior::ValidityDoubleVote(ValidityDoubleVote::IssuedAndValidity( @@ -910,7 +905,7 @@ mod tests { }; let candidate_digest = Digest(100); - table.import_statement(&context, statement); + table.import_statement(&context, GroupId(2), statement); assert!(!table.detected_misbehavior.contains_key(&AuthorityId(1))); assert!(table.attested_candidate(&candidate_digest, &context, 2).is_none()); @@ -921,7 +916,7 @@ mod tests { sender: AuthorityId(2), }; - table.import_statement(&context, vote); + table.import_statement(&context, GroupId(2), vote); assert!(!table.detected_misbehavior.contains_key(&AuthorityId(2))); assert!(table.attested_candidate(&candidate_digest, &context, 2).is_some()); } @@ -944,7 +939,7 @@ mod tests { }; let summary = table - .import_statement(&context, statement) + .import_statement(&context, GroupId(2), statement) .expect("candidate import to give summary"); assert_eq!(summary.candidate, Digest(100)); @@ -971,7 +966,7 @@ mod tests { }; let candidate_digest = Digest(100); - table.import_statement(&context, statement); + table.import_statement(&context, GroupId(2), statement); assert!(!table.detected_misbehavior.contains_key(&AuthorityId(1))); let vote = SignedStatement { @@ -980,8 +975,9 @@ mod tests { sender: AuthorityId(2), }; - let summary = - table.import_statement(&context, vote).expect("candidate vote to give summary"); + let summary = table + .import_statement(&context, GroupId(2), vote) + .expect("candidate vote to give summary"); assert!(!table.detected_misbehavior.contains_key(&AuthorityId(2))); diff --git a/polkadot/statement-table/src/lib.rs b/polkadot/statement-table/src/lib.rs index d4629330ac01512e2dc2b0f441d2302f0fd38624..3740d15cc4f326962b962557e61ca14e9163de7d 100644 --- a/polkadot/statement-table/src/lib.rs +++ b/polkadot/statement-table/src/lib.rs @@ -35,8 +35,8 @@ pub use generic::{Config, Context, Table}; pub mod v2 { use crate::generic; use primitives::{ - CandidateHash, CommittedCandidateReceipt, CompactStatement as PrimitiveStatement, Id, - ValidatorIndex, ValidatorSignature, + CandidateHash, CommittedCandidateReceipt, CompactStatement as PrimitiveStatement, + CoreIndex, ValidatorIndex, ValidatorSignature, }; /// Statements about candidates on the network. @@ -59,7 +59,7 @@ pub mod v2 { >; /// A summary of import of a statement. - pub type Summary = generic::Summary; + pub type Summary = generic::Summary; impl<'a> From<&'a Statement> for PrimitiveStatement { fn from(s: &'a Statement) -> PrimitiveStatement { diff --git a/polkadot/tests/common.rs b/polkadot/tests/common.rs index 15721c990e01b30b97db32151b0899c1e5a3888b..dbee2d3650347e228db0b3663a696f67f5a2240a 100644 --- a/polkadot/tests/common.rs +++ b/polkadot/tests/common.rs @@ -48,8 +48,8 @@ pub async fn wait_n_finalized_blocks(n: usize, url: &str) { /// Read the WS address from the output. /// -/// This is hack to get the actual binded sockaddr because -/// polkadot assigns a random port if the specified port was already binded. +/// This is hack to get the actual bound sockaddr because +/// polkadot assigns a random port if the specified port was already bound. /// /// You must call /// `Command::new("cmd").stdout(process::Stdio::piped()).stderr(process::Stdio::piped())` diff --git a/polkadot/tests/running_the_node_and_interrupt.rs b/polkadot/tests/running_the_node_and_interrupt.rs index 079c34e0421e8a1936359b03bc46f3fea87f4b8b..85c073d3023a8e28417a2f0eb5047e2f04100820 100644 --- a/polkadot/tests/running_the_node_and_interrupt.rs +++ b/polkadot/tests/running_the_node_and_interrupt.rs @@ -32,7 +32,7 @@ async fn running_the_node_works_and_can_be_interrupted() { }; async fn run_command_and_kill(signal: Signal) { - let tmpdir = tempdir().expect("coult not create temp dir"); + let tmpdir = tempdir().expect("could not create temp dir"); let mut cmd = Command::new(cargo_bin("polkadot")) .stdout(process::Stdio::piped()) diff --git a/polkadot/utils/generate-bags/Cargo.toml b/polkadot/utils/generate-bags/Cargo.toml index b255b7ab64d05790d5e278ea9e74664d9236a5fc..ad6d7259d2483e11e9df8c121bab75461a71c525 100644 --- a/polkadot/utils/generate-bags/Cargo.toml +++ b/polkadot/utils/generate-bags/Cargo.toml @@ -10,7 +10,7 @@ description = "CLI to generate voter bags for Polkadot runtimes" workspace = true [dependencies] -clap = { version = "4.4.18", features = ["derive"] } +clap = { version = "4.5.3", features = ["derive"] } generate-bags = { path = "../../../substrate/utils/frame/generate-bags" } sp-io = { path = "../../../substrate/primitives/io" } diff --git a/polkadot/utils/remote-ext-tests/bags-list/Cargo.toml b/polkadot/utils/remote-ext-tests/bags-list/Cargo.toml index f8190e6aefa941f328a31c46b21bda7d8f089872..20e4130f888bcb1f826dab81fb7e5a721a53a225 100644 --- a/polkadot/utils/remote-ext-tests/bags-list/Cargo.toml +++ b/polkadot/utils/remote-ext-tests/bags-list/Cargo.toml @@ -18,6 +18,6 @@ sp-tracing = { path = "../../../../substrate/primitives/tracing" } frame-system = { path = "../../../../substrate/frame/system" } sp-core = { path = "../../../../substrate/primitives/core" } -clap = { version = "4.4.18", features = ["derive"] } -log = "0.4.17" +clap = { version = "4.5.3", features = ["derive"] } +log = { workspace = true, default-features = true } tokio = { version = "1.24.2", features = ["macros"] } diff --git a/polkadot/xcm/Cargo.toml b/polkadot/xcm/Cargo.toml index 41b79051bbf01d5af62bd0646e77e146a8498d93..b214342d2f4860837ec0d2a56daa9108f1a53fe2 100644 --- a/polkadot/xcm/Cargo.toml +++ b/polkadot/xcm/Cargo.toml @@ -14,11 +14,11 @@ array-bytes = "6.1" bounded-collections = { version = "0.2.0", default-features = false, features = ["serde"] } derivative = { version = "2.2.0", default-features = false, features = ["use_core"] } impl-trait-for-tuples = "0.2.2" -log = { version = "0.4.17", default-features = false } +log = { workspace = true } parity-scale-codec = { version = "3.6.1", default-features = false, features = ["derive", "max-encoded-len"] } -scale-info = { version = "2.10.0", default-features = false, features = ["derive", "serde"] } +scale-info = { version = "2.11.1", default-features = false, features = ["derive", "serde"] } sp-weights = { path = "../../substrate/primitives/weights", default-features = false, features = ["serde"] } -serde = { version = "1.0.195", default-features = false, features = ["alloc", "derive", "rc"] } +serde = { features = ["alloc", "derive", "rc"], workspace = true } schemars = { version = "0.8.13", default-features = true, optional = true } xcm-procedural = { path = "procedural" } environmental = { version = "1.1.4", default-features = false } diff --git a/polkadot/xcm/pallet-xcm-benchmarks/Cargo.toml b/polkadot/xcm/pallet-xcm-benchmarks/Cargo.toml index adeacddf90c1522a9505b7126365e2791fbc88e9..8c71426a6faee49023603caa250f37bcbb42f631 100644 --- a/polkadot/xcm/pallet-xcm-benchmarks/Cargo.toml +++ b/polkadot/xcm/pallet-xcm-benchmarks/Cargo.toml @@ -14,7 +14,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } frame-support = { path = "../../../substrate/frame/support", default-features = false } frame-system = { path = "../../../substrate/frame/system", default-features = false } sp-runtime = { path = "../../../substrate/primitives/runtime", default-features = false } @@ -24,7 +24,7 @@ xcm-executor = { package = "staging-xcm-executor", path = "../xcm-executor", def frame-benchmarking = { path = "../../../substrate/frame/benchmarking", default-features = false } xcm = { package = "staging-xcm", path = "..", default-features = false } xcm-builder = { package = "staging-xcm-builder", path = "../xcm-builder", default-features = false } -log = "0.4.17" +log = { workspace = true, default-features = true } [dev-dependencies] pallet-balances = { path = "../../../substrate/frame/balances" } diff --git a/polkadot/xcm/pallet-xcm-benchmarks/src/fungible/benchmarking.rs b/polkadot/xcm/pallet-xcm-benchmarks/src/fungible/benchmarking.rs index e96ec48fcba46f2aaf668445ad25ecc5888a7d7a..4b77199069d341320a67f196719604cedcc35157 100644 --- a/polkadot/xcm/pallet-xcm-benchmarks/src/fungible/benchmarking.rs +++ b/polkadot/xcm/pallet-xcm-benchmarks/src/fungible/benchmarking.rs @@ -64,13 +64,16 @@ benchmarks_instance_pallet! { transfer_asset { let (sender_account, sender_location) = account_and_location::(1); let asset = T::get_asset(); - let assets: Assets = vec![ asset.clone() ].into(); + let assets: Assets = vec![asset.clone()].into(); // this xcm doesn't use holding let dest_location = T::valid_destination()?; let dest_account = T::AccountIdConverter::convert_location(&dest_location).unwrap(); >::deposit_asset(&asset, &sender_location, None).unwrap(); + // We deposit the asset twice so we have enough for ED after transferring + >::deposit_asset(&asset, &sender_location, None).unwrap(); + let sender_account_balance_before = T::TransactAsset::balance(&sender_account); assert!(T::TransactAsset::balance(&dest_account).is_zero()); let mut executor = new_executor::(sender_location); @@ -79,7 +82,7 @@ benchmarks_instance_pallet! { }: { executor.bench_process(xcm)?; } verify { - assert!(T::TransactAsset::balance(&sender_account).is_zero()); + assert!(T::TransactAsset::balance(&sender_account) < sender_account_balance_before); assert!(!T::TransactAsset::balance(&dest_account).is_zero()); } @@ -93,11 +96,12 @@ benchmarks_instance_pallet! { &dest_location, FeeReason::TransferReserveAsset ); - let sender_account_balance_before = T::TransactAsset::balance(&sender_account); let asset = T::get_asset(); >::deposit_asset(&asset, &sender_location, None).unwrap(); - assert!(T::TransactAsset::balance(&sender_account) > sender_account_balance_before); + // We deposit the asset twice so we have enough for ED after transferring + >::deposit_asset(&asset, &sender_location, None).unwrap(); + let sender_account_balance_before = T::TransactAsset::balance(&sender_account); let assets: Assets = vec![asset].into(); assert!(T::TransactAsset::balance(&dest_account).is_zero()); diff --git a/polkadot/xcm/pallet-xcm-benchmarks/src/fungible/mock.rs b/polkadot/xcm/pallet-xcm-benchmarks/src/fungible/mock.rs index fe3ee81f9d44c1a3717b07670ee71cd6f967c8ca..c831cd024659135fd3fd5d85a4406351945d887f 100644 --- a/polkadot/xcm/pallet-xcm-benchmarks/src/fungible/mock.rs +++ b/polkadot/xcm/pallet-xcm-benchmarks/src/fungible/mock.rs @@ -46,7 +46,7 @@ parameter_types! { frame_system::limits::BlockWeights::simple_max(Weight::from_parts(1024, u64::MAX)); } -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { type BaseCallFilter = Everything; type BlockWeights = (); @@ -77,7 +77,7 @@ parameter_types! { pub const ExistentialDeposit: u64 = 7; } -#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig as pallet_balances::DefaultConfig)] +#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] impl pallet_balances::Config for Test { type ReserveIdentifier = [u8; 8]; type AccountStore = System; @@ -103,8 +103,7 @@ impl xcm_executor::traits::MatchesFungible for MatchAnyFungible { } // Use balances as the asset transactor. -#[allow(deprecated)] -pub type AssetTransactor = xcm_builder::CurrencyAdapter< +pub type AssetTransactor = xcm_builder::FungibleAdapter< Balances, MatchAnyFungible, AccountIdConverter, @@ -146,6 +145,9 @@ impl xcm_executor::Config for XcmConfig { type SafeCallFilter = Everything; type Aliasers = Nothing; type TransactionalProcessor = FrameTransactionalProcessor; + type HrmpNewChannelOpenRequestHandler = (); + type HrmpChannelAcceptedHandler = (); + type HrmpChannelClosingHandler = (); } impl crate::Config for Test { @@ -192,8 +194,7 @@ impl xcm_balances_benchmark::Config for Test { type TrustedReserve = TrustedReserve; fn get_asset() -> Asset { - let amount = - >::minimum_balance() as u128; + let amount = 1_000_000_000_000; Asset { id: AssetId(Here.into()), fun: Fungible(amount) } } } diff --git a/polkadot/xcm/pallet-xcm-benchmarks/src/generic/mock.rs b/polkadot/xcm/pallet-xcm-benchmarks/src/generic/mock.rs index c84f062a8d169b2ca25704e13b08449573a97006..534f7d85ea2e9aa9759aca4bda9e4759dbf49517 100644 --- a/polkadot/xcm/pallet-xcm-benchmarks/src/generic/mock.rs +++ b/polkadot/xcm/pallet-xcm-benchmarks/src/generic/mock.rs @@ -51,7 +51,7 @@ parameter_types! { frame_system::limits::BlockWeights::simple_max(Weight::from_parts(1024, u64::MAX)); } -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { type BaseCallFilter = Everything; type BlockWeights = (); @@ -135,13 +135,16 @@ impl xcm_executor::Config for XcmConfig { type SafeCallFilter = Everything; type Aliasers = Aliasers; type TransactionalProcessor = FrameTransactionalProcessor; + type HrmpNewChannelOpenRequestHandler = (); + type HrmpChannelAcceptedHandler = (); + type HrmpChannelClosingHandler = (); } parameter_types! { pub const ExistentialDeposit: u64 = 7; } -#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig as pallet_balances::DefaultConfig)] +#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] impl pallet_balances::Config for Test { type ReserveIdentifier = [u8; 8]; type AccountStore = System; diff --git a/polkadot/xcm/pallet-xcm-benchmarks/src/lib.rs b/polkadot/xcm/pallet-xcm-benchmarks/src/lib.rs index 6ce8d3e99e8e54114048ff35d2c2a7c38b01b9c4..63ed0ac0ca736450077a4677d29d65a81e9eaf3b 100644 --- a/polkadot/xcm/pallet-xcm-benchmarks/src/lib.rs +++ b/polkadot/xcm/pallet-xcm-benchmarks/src/lib.rs @@ -22,10 +22,8 @@ use codec::Encode; use frame_benchmarking::{account, BenchmarkError}; use sp_std::prelude::*; use xcm::latest::prelude::*; -use xcm_executor::{ - traits::{ConvertLocation, FeeReason}, - Config as XcmConfig, FeesMode, -}; +use xcm_builder::EnsureDelivery; +use xcm_executor::{traits::ConvertLocation, Config as XcmConfig}; pub mod fungible; pub mod generic; @@ -114,29 +112,3 @@ pub fn account_and_location(index: u32) -> (T::AccountId, Location) { (account, location) } - -/// Trait for a type which ensures all requirements for successful delivery with XCM transport -/// layers. -pub trait EnsureDelivery { - /// Prepare all requirements for successful `XcmSender: SendXcm` passing (accounts, balances, - /// channels ...). Returns: - /// - possible `FeesMode` which is expected to be set to executor - /// - possible `Assets` which are expected to be subsume to the Holding Register - fn ensure_successful_delivery( - origin_ref: &Location, - dest: &Location, - fee_reason: FeeReason, - ) -> (Option, Option); -} - -/// `()` implementation does nothing which means no special requirements for environment. -impl EnsureDelivery for () { - fn ensure_successful_delivery( - _origin_ref: &Location, - _dest: &Location, - _fee_reason: FeeReason, - ) -> (Option, Option) { - // doing nothing - (None, None) - } -} diff --git a/polkadot/xcm/pallet-xcm/Cargo.toml b/polkadot/xcm/pallet-xcm/Cargo.toml index dc9b3c0e20d352bd3240f9e002919be39e6e4464..460597e6649ab27acec712e1b055fbf5968005f2 100644 --- a/polkadot/xcm/pallet-xcm/Cargo.toml +++ b/polkadot/xcm/pallet-xcm/Cargo.toml @@ -12,9 +12,9 @@ workspace = true [dependencies] bounded-collections = { version = "0.2.0", default-features = false } codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.195", optional = true, features = ["derive"] } -log = { version = "0.4.17", default-features = false } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +serde = { optional = true, features = ["derive"], workspace = true, default-features = true } +log = { workspace = true } frame-support = { path = "../../../substrate/frame/support", default-features = false } frame-system = { path = "../../../substrate/frame/system", default-features = false } @@ -26,6 +26,7 @@ sp-std = { path = "../../../substrate/primitives/std", default-features = false xcm = { package = "staging-xcm", path = "..", default-features = false } xcm-executor = { package = "staging-xcm-executor", path = "../xcm-executor", default-features = false } xcm-builder = { package = "staging-xcm-builder", path = "../xcm-builder", default-features = false } +xcm-fee-payment-runtime-api = { path = "../xcm-fee-payment-runtime-api", default-features = false } # marked optional, used in benchmarking frame-benchmarking = { path = "../../../substrate/frame/benchmarking", default-features = false, optional = true } @@ -54,6 +55,7 @@ std = [ "sp-std/std", "xcm-builder/std", "xcm-executor/std", + "xcm-fee-payment-runtime-api/std", "xcm/std", ] runtime-benchmarks = [ diff --git a/polkadot/xcm/pallet-xcm/src/benchmarking.rs b/polkadot/xcm/pallet-xcm/src/benchmarking.rs index c7d8fb24e9df320f8439616591c467f3f6d7aa1e..e2903d592dc18aeafc7ef15d5ccc8d3fade1bcef 100644 --- a/polkadot/xcm/pallet-xcm/src/benchmarking.rs +++ b/polkadot/xcm/pallet-xcm/src/benchmarking.rs @@ -16,22 +16,28 @@ use super::*; use bounded_collections::{ConstU32, WeakBoundedVec}; +use codec::Encode; use frame_benchmarking::{benchmarks, whitelisted_caller, BenchmarkError, BenchmarkResult}; -use frame_support::{traits::Currency, weights::Weight}; +use frame_support::{ + traits::fungible::{Inspect, Mutate}, + weights::Weight, +}; use frame_system::RawOrigin; use sp_std::prelude::*; use xcm::{latest::prelude::*, v2}; +use xcm_builder::EnsureDelivery; +use xcm_executor::traits::FeeReason; type RuntimeOrigin = ::RuntimeOrigin; -// existential deposit multiplier -const ED_MULTIPLIER: u32 = 100; - /// Pallet we're benchmarking here. pub struct Pallet(crate::Pallet); /// Trait that must be implemented by runtime to be able to benchmark pallet properly. pub trait Config: crate::Config { + /// Helper that ensures successful delivery for extrinsics/benchmarks which need `SendXcm`. + type DeliveryHelper: EnsureDelivery; + /// A `Location` that can be reached via `XcmRouter`. Used only in benchmarks. /// /// If `None`, the benchmarks that depend on a reachable destination will be skipped. @@ -74,6 +80,13 @@ pub trait Config: crate::Config { fn set_up_complex_asset_transfer() -> Option<(Assets, u32, Location, Box)> { None } + + /// Gets an asset that can be handled by the AssetTransactor. + /// + /// Used only in benchmarks. + /// + /// Used, for example, in the benchmark for `claim_assets`. + fn get_asset() -> Asset; } benchmarks! { @@ -96,6 +109,21 @@ benchmarks! { let versioned_msg = VersionedXcm::from(msg); }: _>(send_origin, Box::new(versioned_dest), Box::new(versioned_msg)) + send_blob { + let send_origin = + T::SendXcmOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; + if T::SendXcmOrigin::try_origin(send_origin.clone()).is_err() { + return Err(BenchmarkError::Override(BenchmarkResult::from_weight(Weight::MAX))) + } + let msg = Xcm::<()>(vec![ClearOrigin]); + let versioned_dest: VersionedLocation = T::reachable_dest().ok_or( + BenchmarkError::Override(BenchmarkResult::from_weight(Weight::MAX)), + )? + .into(); + let versioned_msg = VersionedXcm::from(msg); + let encoded_versioned_msg = versioned_msg.encode().try_into().unwrap(); + }: _>(send_origin, Box::new(versioned_dest), encoded_versioned_msg) + teleport_assets { let (asset, destination) = T::teleportable_asset_and_dest().ok_or( BenchmarkError::Override(BenchmarkResult::from_weight(Weight::MAX)), @@ -107,23 +135,29 @@ benchmarks! { }.into(); let assets: Assets = asset.into(); - let existential_deposit = T::ExistentialDeposit::get(); - let caller = whitelisted_caller(); - - // Give some multiple of the existential deposit - let balance = existential_deposit.saturating_mul(ED_MULTIPLIER.into()); - assert!(balance >= transferred_amount); - let _ = as Currency<_>>::make_free_balance_be(&caller, balance); - // verify initial balance - assert_eq!(pallet_balances::Pallet::::free_balance(&caller), balance); - + let caller: T::AccountId = whitelisted_caller(); let send_origin = RawOrigin::Signed(caller.clone()); let origin_location = T::ExecuteXcmOrigin::try_origin(send_origin.clone().into()) .map_err(|_| BenchmarkError::Override(BenchmarkResult::from_weight(Weight::MAX)))?; - if !T::XcmTeleportFilter::contains(&(origin_location, assets.clone().into_inner())) { + if !T::XcmTeleportFilter::contains(&(origin_location.clone(), assets.clone().into_inner())) { return Err(BenchmarkError::Override(BenchmarkResult::from_weight(Weight::MAX))) } + // Ensure that origin can send to destination (e.g. setup delivery fees, ensure router setup, ...) + let (_, _) = T::DeliveryHelper::ensure_successful_delivery( + &origin_location, + &destination, + FeeReason::ChargeFees, + ); + + // Actual balance (e.g. `ensure_successful_delivery` could drip delivery fees, ...) + let balance = as Inspect<_>>::balance(&caller); + // Add transferred_amount to origin + as Mutate<_>>::mint_into(&caller, transferred_amount)?; + // verify initial balance + let balance = balance + transferred_amount; + assert_eq!( as Inspect<_>>::balance(&caller), balance); + let recipient = [0u8; 32]; let versioned_dest: VersionedLocation = destination.into(); let versioned_beneficiary: VersionedLocation = @@ -132,7 +166,7 @@ benchmarks! { }: _>(send_origin.into(), Box::new(versioned_dest), Box::new(versioned_beneficiary), Box::new(versioned_assets), 0) verify { // verify balance after transfer, decreased by transferred amount (+ maybe XCM delivery fees) - assert!(pallet_balances::Pallet::::free_balance(&caller) <= balance - transferred_amount); + assert!( as Inspect<_>>::balance(&caller) <= balance - transferred_amount); } reserve_transfer_assets { @@ -146,23 +180,29 @@ benchmarks! { }.into(); let assets: Assets = asset.into(); - let existential_deposit = T::ExistentialDeposit::get(); - let caller = whitelisted_caller(); - - // Give some multiple of the existential deposit - let balance = existential_deposit.saturating_mul(ED_MULTIPLIER.into()); - assert!(balance >= transferred_amount); - let _ = as Currency<_>>::make_free_balance_be(&caller, balance); - // verify initial balance - assert_eq!(pallet_balances::Pallet::::free_balance(&caller), balance); - + let caller: T::AccountId = whitelisted_caller(); let send_origin = RawOrigin::Signed(caller.clone()); let origin_location = T::ExecuteXcmOrigin::try_origin(send_origin.clone().into()) .map_err(|_| BenchmarkError::Override(BenchmarkResult::from_weight(Weight::MAX)))?; - if !T::XcmReserveTransferFilter::contains(&(origin_location, assets.clone().into_inner())) { + if !T::XcmReserveTransferFilter::contains(&(origin_location.clone(), assets.clone().into_inner())) { return Err(BenchmarkError::Override(BenchmarkResult::from_weight(Weight::MAX))) } + // Ensure that origin can send to destination (e.g. setup delivery fees, ensure router setup, ...) + let (_, _) = T::DeliveryHelper::ensure_successful_delivery( + &origin_location, + &destination, + FeeReason::ChargeFees, + ); + + // Actual balance (e.g. `ensure_successful_delivery` could drip delivery fees, ...) + let balance = as Inspect<_>>::balance(&caller); + // Add transferred_amount to origin + as Mutate<_>>::mint_into(&caller, transferred_amount)?; + // verify initial balance + let balance = balance + transferred_amount; + assert_eq!( as Inspect<_>>::balance(&caller), balance); + let recipient = [0u8; 32]; let versioned_dest: VersionedLocation = destination.into(); let versioned_beneficiary: VersionedLocation = @@ -171,7 +211,7 @@ benchmarks! { }: _>(send_origin.into(), Box::new(versioned_dest), Box::new(versioned_beneficiary), Box::new(versioned_assets), 0) verify { // verify balance after transfer, decreased by transferred amount (+ maybe XCM delivery fees) - assert!(pallet_balances::Pallet::::free_balance(&caller) <= balance - transferred_amount); + assert!( as Inspect<_>>::balance(&caller) <= balance - transferred_amount); } transfer_assets { @@ -203,6 +243,19 @@ benchmarks! { let versioned_msg = VersionedXcm::from(msg); }: _>(execute_origin, Box::new(versioned_msg), Weight::MAX) + execute_blob { + let execute_origin = + T::ExecuteXcmOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; + let origin_location = T::ExecuteXcmOrigin::try_origin(execute_origin.clone()) + .map_err(|_| BenchmarkError::Override(BenchmarkResult::from_weight(Weight::MAX)))?; + let msg = Xcm(vec![ClearOrigin]); + if !T::XcmExecuteFilter::contains(&(origin_location, msg.clone())) { + return Err(BenchmarkError::Override(BenchmarkResult::from_weight(Weight::MAX))) + } + let versioned_msg = VersionedXcm::from(msg); + let encoded_versioned_msg = versioned_msg.encode().try_into().unwrap(); + }: _>(execute_origin, encoded_versioned_msg, Weight::MAX) + force_xcm_version { let loc = T::reachable_dest().ok_or( BenchmarkError::Override(BenchmarkResult::from_weight(Weight::MAX)), @@ -324,11 +377,23 @@ benchmarks! { u32::MAX, ).unwrap()).collect::>(); crate::Pallet::::expect_response(query_id, Response::PalletsInfo(infos.try_into().unwrap())); - }: { as QueryHandler>::take_response(query_id); } + claim_assets { + let claim_origin = RawOrigin::Signed(whitelisted_caller()); + let claim_location = T::ExecuteXcmOrigin::try_origin(claim_origin.clone().into()).map_err(|_| BenchmarkError::Override(BenchmarkResult::from_weight(Weight::MAX)))?; + let asset: Asset = T::get_asset(); + // Trap assets for claiming later + crate::Pallet::::drop_assets( + &claim_location, + asset.clone().into(), + &XcmContext { origin: None, message_id: [0u8; 32], topic: None } + ); + let versioned_assets = VersionedAssets::V4(asset.into()); + }: _>(claim_origin.into(), Box::new(versioned_assets), Box::new(VersionedLocation::V4(claim_location))) + impl_benchmark_test_suite!( Pallet, crate::mock::new_test_ext_with_balances(Vec::new()), diff --git a/polkadot/xcm/pallet-xcm/src/lib.rs b/polkadot/xcm/pallet-xcm/src/lib.rs index 55154198a9b2d3ed537de187c489632b18e76610..ef255068734aae29d879e16c575a8a5cea4c5e59 100644 --- a/polkadot/xcm/pallet-xcm/src/lib.rs +++ b/polkadot/xcm/pallet-xcm/src/lib.rs @@ -29,7 +29,7 @@ pub mod migration; use codec::{Decode, Encode, EncodeLike, MaxEncodedLen}; use frame_support::{ - dispatch::GetDispatchInfo, + dispatch::{DispatchErrorWithPostInfo, GetDispatchInfo, WithPostDispatchInfo}, pallet_prelude::*, traits::{ Contains, ContainsPair, Currency, Defensive, EnsureOrigin, Get, LockableCurrency, @@ -50,8 +50,8 @@ use sp_runtime::{ use sp_std::{boxed::Box, marker::PhantomData, prelude::*, result::Result, vec}; use xcm::{latest::QueryResponseInfo, prelude::*}; use xcm_builder::{ - ExecuteController, ExecuteControllerWeightInfo, QueryController, QueryControllerWeightInfo, - SendController, SendControllerWeightInfo, + ExecuteController, ExecuteControllerWeightInfo, MaxXcmEncodedSize, QueryController, + QueryControllerWeightInfo, SendController, SendControllerWeightInfo, }; use xcm_executor::{ traits::{ @@ -61,6 +61,10 @@ use xcm_executor::{ }, AssetsInHolding, }; +use xcm_fee_payment_runtime_api::Error as FeePaymentError; + +#[cfg(any(feature = "try-runtime", test))] +use sp_runtime::TryRuntimeError; pub trait WeightInfo { fn send() -> Weight; @@ -82,6 +86,9 @@ pub trait WeightInfo { fn migrate_and_notify_old_targets() -> Weight; fn new_query() -> Weight; fn take_response() -> Weight; + fn claim_assets() -> Weight; + fn execute_blob() -> Weight; + fn send_blob() -> Weight; } /// fallback implementation @@ -162,6 +169,18 @@ impl WeightInfo for TestWeightInfo { fn take_response() -> Weight { Weight::from_parts(100_000_000, 0) } + + fn claim_assets() -> Weight { + Weight::from_parts(100_000_000, 0) + } + + fn execute_blob() -> Weight { + Weight::from_parts(100_000_000, 0) + } + + fn send_blob() -> Weight { + Weight::from_parts(100_000_000, 0) + } } #[frame_support::pallet] @@ -277,60 +296,49 @@ pub mod pallet { } impl ExecuteControllerWeightInfo for Pallet { - fn execute() -> Weight { - T::WeightInfo::execute() + fn execute_blob() -> Weight { + T::WeightInfo::execute_blob() } } impl ExecuteController, ::RuntimeCall> for Pallet { type WeightInfo = Self; - fn execute( + fn execute_blob( origin: OriginFor, - message: Box::RuntimeCall>>, + encoded_message: BoundedVec, max_weight: Weight, - ) -> Result { + ) -> Result { let origin_location = T::ExecuteXcmOrigin::ensure_origin(origin)?; - let mut hash = message.using_encoded(sp_io::hashing::blake2_256); - let message = (*message).try_into().map_err(|()| Error::::BadVersion)?; - let value = (origin_location, message); - ensure!(T::XcmExecuteFilter::contains(&value), Error::::Filtered); - let (origin_location, message) = value; - let outcome = T::XcmExecutor::prepare_and_execute( - origin_location, - message, - &mut hash, - max_weight, - max_weight, - ); - Self::deposit_event(Event::Attempted { outcome: outcome.clone() }); - Ok(outcome) + let message = + VersionedXcm::<::RuntimeCall>::decode(&mut &encoded_message[..]) + .map_err(|error| { + log::error!(target: "xcm::execute_blob", "Unable to decode XCM, error: {:?}", error); + Error::::UnableToDecode + })?; + Self::execute_base(origin_location, Box::new(message), max_weight) } } impl SendControllerWeightInfo for Pallet { - fn send() -> Weight { - T::WeightInfo::send() + fn send_blob() -> Weight { + T::WeightInfo::send_blob() } } impl SendController> for Pallet { type WeightInfo = Self; - fn send( + fn send_blob( origin: OriginFor, dest: Box, - message: Box>, + encoded_message: BoundedVec, ) -> Result { let origin_location = T::SendXcmOrigin::ensure_origin(origin)?; - let interior: Junctions = - origin_location.clone().try_into().map_err(|_| Error::::InvalidOrigin)?; - let dest = Location::try_from(*dest).map_err(|()| Error::::BadVersion)?; - let message: Xcm<()> = (*message).try_into().map_err(|()| Error::::BadVersion)?; - - let message_id = Self::send_xcm(interior, dest.clone(), message.clone()) - .map_err(Error::::from)?; - let e = Event::Sent { origin: origin_location, destination: dest, message, message_id }; - Self::deposit_event(e); - Ok(message_id) + let message = + VersionedXcm::<()>::decode(&mut &encoded_message[..]).map_err(|error| { + log::error!(target: "xcm::send_blob", "Unable to decode XCM, error: {:?}", error); + Error::::UnableToDecode + })?; + Self::send_base(origin_location, dest, Box::new(message)) } } @@ -350,7 +358,7 @@ pub mod pallet { origin: OriginFor, timeout: BlockNumberFor, match_querier: VersionedLocation, - ) -> Result { + ) -> Result { let responder = ::ExecuteXcmOrigin::ensure_origin(origin)?; let query_id = ::new_query( responder, @@ -464,6 +472,8 @@ pub mod pallet { FeesPaid { paying: Location, fees: Assets }, /// Some assets have been claimed from an asset trap AssetsClaimed { hash: H256, origin: Location, assets: VersionedAssets }, + /// A XCM version migration finished. + VersionMigrationFinished { version: XcmVersion }, } #[pallet::origin] @@ -535,6 +545,11 @@ pub mod pallet { TooManyReserves, /// Local XCM execution incomplete. LocalExecutionIncomplete, + /// Could not decode XCM. + UnableToDecode, + /// XCM encoded length is too large. + /// Returned when an XCM encoded length is larger than `MaxXcmEncodedSize`. + XcmTooLarge, } impl From for Error { @@ -765,6 +780,9 @@ pub mod pallet { // Consume 10% of block at most let max_weight = T::BlockWeights::get().max_block / 10; let (w, maybe_migration) = Self::check_xcm_version_change(migration, max_weight); + if maybe_migration.is_none() { + Self::deposit_event(Event::VersionMigrationFinished { version: XCM_VERSION }); + } CurrentMigration::::set(maybe_migration); weight_used.saturating_accrue(w); } @@ -791,6 +809,11 @@ pub mod pallet { } weight_used } + + #[cfg(feature = "try-runtime")] + fn try_state(_n: BlockNumberFor) -> Result<(), TryRuntimeError> { + Self::do_try_state() + } } pub mod migrations { @@ -864,16 +887,72 @@ pub mod pallet { } } - #[pallet::call] impl Pallet { + /// Underlying logic for both [`execute_blob`] and [`execute`]. + fn execute_base( + origin_location: Location, + message: Box::RuntimeCall>>, + max_weight: Weight, + ) -> Result { + log::trace!(target: "xcm::pallet_xcm::execute", "message {:?}, max_weight {:?}", message, max_weight); + let outcome = (|| { + let mut hash = message.using_encoded(sp_io::hashing::blake2_256); + let message = (*message).try_into().map_err(|()| Error::::BadVersion)?; + let value = (origin_location, message); + ensure!(T::XcmExecuteFilter::contains(&value), Error::::Filtered); + let (origin_location, message) = value; + Ok(T::XcmExecutor::prepare_and_execute( + origin_location, + message, + &mut hash, + max_weight, + max_weight, + )) + })() + .map_err(|e: DispatchError| e.with_weight(T::WeightInfo::execute()))?; + + Self::deposit_event(Event::Attempted { outcome: outcome.clone() }); + let weight_used = outcome.weight_used(); + outcome.ensure_complete().map_err(|error| { + log::error!(target: "xcm::pallet_xcm::execute", "XCM execution failed with error {:?}", error); + Error::::LocalExecutionIncomplete + .with_weight(weight_used.saturating_add(T::WeightInfo::execute())) + })?; + Ok(weight_used) + } + + /// Underlying logic for both [`send_blob`] and [`send`]. + fn send_base( + origin_location: Location, + dest: Box, + message: Box>, + ) -> Result { + let interior: Junctions = + origin_location.clone().try_into().map_err(|_| Error::::InvalidOrigin)?; + let dest = Location::try_from(*dest).map_err(|()| Error::::BadVersion)?; + let message: Xcm<()> = (*message).try_into().map_err(|()| Error::::BadVersion)?; + + let message_id = Self::send_xcm(interior, dest.clone(), message.clone()) + .map_err(Error::::from)?; + let e = Event::Sent { origin: origin_location, destination: dest, message, message_id }; + Self::deposit_event(e); + Ok(message_id) + } + } + + #[pallet::call(weight(::WeightInfo))] + impl Pallet { + /// WARNING: DEPRECATED. `send` will be removed after June 2024. Use `send_blob` instead. + #[allow(deprecated)] + #[deprecated(note = "`send` will be removed after June 2024. Use `send_blob` instead.")] #[pallet::call_index(0)] - #[pallet::weight(T::WeightInfo::send())] pub fn send( origin: OriginFor, dest: Box, message: Box>, ) -> DispatchResult { - >::send(origin, dest, message)?; + let origin_location = T::SendXcmOrigin::ensure_origin(origin)?; + Self::send_base(origin_location, dest, message)?; Ok(()) } @@ -896,23 +975,10 @@ pub mod pallet { /// - `fee_asset_item`: The index into `assets` of the item which should be used to pay /// fees. #[pallet::call_index(1)] - #[pallet::weight({ - let maybe_assets: Result = (*assets.clone()).try_into(); - let maybe_dest: Result = (*dest.clone()).try_into(); - match (maybe_assets, maybe_dest) { - (Ok(assets), Ok(dest)) => { - use sp_std::vec; - let count = assets.len() as u32; - let mut message = Xcm(vec![ - WithdrawAsset(assets), - SetFeesMode { jit_withdraw: true }, - InitiateTeleport { assets: Wild(AllCounted(count)), dest, xcm: Xcm(vec![]) }, - ]); - T::Weigher::weight(&mut message).map_or(Weight::MAX, |w| T::WeightInfo::teleport_assets().saturating_add(w)) - } - _ => Weight::MAX, - } - })] + #[allow(deprecated)] + #[deprecated( + note = "This extrinsic uses `WeightLimit::Unlimited`, please migrate to `limited_teleport_assets` or `transfer_assets`" + )] pub fn teleport_assets( origin: OriginFor, dest: Box, @@ -954,23 +1020,10 @@ pub mod pallet { /// - `fee_asset_item`: The index into `assets` of the item which should be used to pay /// fees. #[pallet::call_index(2)] - #[pallet::weight({ - let maybe_assets: Result = (*assets.clone()).try_into(); - let maybe_dest: Result = (*dest.clone()).try_into(); - match (maybe_assets, maybe_dest) { - (Ok(assets), Ok(dest)) => { - use sp_std::vec; - // heaviest version of locally executed XCM program: equivalent in weight to - // transfer assets to SA, reanchor them, extend XCM program, and send onward XCM - let mut message = Xcm(vec![ - SetFeesMode { jit_withdraw: true }, - TransferReserveAsset { assets, dest, xcm: Xcm(vec![]) } - ]); - T::Weigher::weight(&mut message).map_or(Weight::MAX, |w| T::WeightInfo::reserve_transfer_assets().saturating_add(w)) - } - _ => Weight::MAX, - } - })] + #[allow(deprecated)] + #[deprecated( + note = "This extrinsic uses `WeightLimit::Unlimited`, please migrate to `limited_reserve_transfer_assets` or `transfer_assets`" + )] pub fn reserve_transfer_assets( origin: OriginFor, dest: Box, @@ -997,8 +1050,12 @@ pub mod pallet { /// the maximum amount of weight that the message could take to be executed, then no /// execution attempt will be made. /// - /// NOTE: A successful return to this does *not* imply that the `msg` was executed - /// successfully to completion; only that it was attempted. + /// WARNING: DEPRECATED. `execute` will be removed after June 2024. Use `execute_blob` + /// instead. + #[allow(deprecated)] + #[deprecated( + note = "`execute` will be removed after June 2024. Use `execute_blob` instead." + )] #[pallet::call_index(3)] #[pallet::weight(max_weight.saturating_add(T::WeightInfo::execute()))] pub fn execute( @@ -1006,13 +1063,8 @@ pub mod pallet { message: Box::RuntimeCall>>, max_weight: Weight, ) -> DispatchResultWithPostInfo { - log::trace!(target: "xcm::pallet_xcm::execute", "message {:?}, max_weight {:?}", message, max_weight); - let outcome = >::execute(origin, message, max_weight)?; - let weight_used = outcome.weight_used(); - outcome.ensure_complete().map_err(|error| { - log::error!(target: "xcm::pallet_xcm::execute", "XCM execution failed with error {:?}", error); - Error::::LocalExecutionIncomplete - })?; + let origin_location = T::ExecuteXcmOrigin::ensure_origin(origin)?; + let weight_used = Self::execute_base(origin_location, message, max_weight)?; Ok(Some(weight_used.saturating_add(T::WeightInfo::execute())).into()) } @@ -1023,7 +1075,6 @@ pub mod pallet { /// - `location`: The destination that is being described. /// - `xcm_version`: The latest version of XCM that `location` supports. #[pallet::call_index(4)] - #[pallet::weight(T::WeightInfo::force_xcm_version())] pub fn force_xcm_version( origin: OriginFor, location: Box, @@ -1042,7 +1093,6 @@ pub mod pallet { /// - `origin`: Must be an origin specified by AdminOrigin. /// - `maybe_xcm_version`: The default XCM encoding version, or `None` to disable. #[pallet::call_index(5)] - #[pallet::weight(T::WeightInfo::force_default_xcm_version())] pub fn force_default_xcm_version( origin: OriginFor, maybe_xcm_version: Option, @@ -1057,7 +1107,6 @@ pub mod pallet { /// - `origin`: Must be an origin specified by AdminOrigin. /// - `location`: The location to which we should subscribe for XCM version notifications. #[pallet::call_index(6)] - #[pallet::weight(T::WeightInfo::force_subscribe_version_notify())] pub fn force_subscribe_version_notify( origin: OriginFor, location: Box, @@ -1081,7 +1130,6 @@ pub mod pallet { /// - `location`: The location to which we are currently subscribed for XCM version /// notifications which we no longer desire. #[pallet::call_index(7)] - #[pallet::weight(T::WeightInfo::force_unsubscribe_version_notify())] pub fn force_unsubscribe_version_notify( origin: OriginFor, location: Box, @@ -1114,7 +1162,7 @@ pub mod pallet { /// /// Fee payment on the destination side is made from the asset in the `assets` vector of /// index `fee_asset_item`, up to enough to pay for `weight_limit` of weight. If more weight - /// is needed than `weight_limit`, then the operation will fail and the assets send may be + /// is needed than `weight_limit`, then the operation will fail and the sent assets may be /// at risk. /// /// - `origin`: Must be capable of withdrawing the `assets` and executing XCM. @@ -1129,23 +1177,7 @@ pub mod pallet { /// fees. /// - `weight_limit`: The remote-side weight limit, if any, for the XCM fee purchase. #[pallet::call_index(8)] - #[pallet::weight({ - let maybe_assets: Result = (*assets.clone()).try_into(); - let maybe_dest: Result = (*dest.clone()).try_into(); - match (maybe_assets, maybe_dest) { - (Ok(assets), Ok(dest)) => { - use sp_std::vec; - // heaviest version of locally executed XCM program: equivalent in weight to - // transfer assets to SA, reanchor them, extend XCM program, and send onward XCM - let mut message = Xcm(vec![ - SetFeesMode { jit_withdraw: true }, - TransferReserveAsset { assets, dest, xcm: Xcm(vec![]) } - ]); - T::Weigher::weight(&mut message).map_or(Weight::MAX, |w| T::WeightInfo::reserve_transfer_assets().saturating_add(w)) - } - _ => Weight::MAX, - } - })] + #[pallet::weight(T::WeightInfo::reserve_transfer_assets())] pub fn limited_reserve_transfer_assets( origin: OriginFor, dest: Box, @@ -1168,7 +1200,7 @@ pub mod pallet { /// /// Fee payment on the destination side is made from the asset in the `assets` vector of /// index `fee_asset_item`, up to enough to pay for `weight_limit` of weight. If more weight - /// is needed than `weight_limit`, then the operation will fail and the assets send may be + /// is needed than `weight_limit`, then the operation will fail and the sent assets may be /// at risk. /// /// - `origin`: Must be capable of withdrawing the `assets` and executing XCM. @@ -1183,23 +1215,7 @@ pub mod pallet { /// fees. /// - `weight_limit`: The remote-side weight limit, if any, for the XCM fee purchase. #[pallet::call_index(9)] - #[pallet::weight({ - let maybe_assets: Result = (*assets.clone()).try_into(); - let maybe_dest: Result = (*dest.clone()).try_into(); - match (maybe_assets, maybe_dest) { - (Ok(assets), Ok(dest)) => { - use sp_std::vec; - let count = assets.len() as u32; - let mut message = Xcm(vec![ - WithdrawAsset(assets), - SetFeesMode { jit_withdraw: true }, - InitiateTeleport { assets: Wild(AllCounted(count)), dest, xcm: Xcm(vec![]) }, - ]); - T::Weigher::weight(&mut message).map_or(Weight::MAX, |w| T::WeightInfo::teleport_assets().saturating_add(w)) - } - _ => Weight::MAX, - } - })] + #[pallet::weight(T::WeightInfo::teleport_assets())] pub fn limited_teleport_assets( origin: OriginFor, dest: Box, @@ -1223,7 +1239,6 @@ pub mod pallet { /// - `origin`: Must be an origin specified by AdminOrigin. /// - `suspended`: `true` to suspend, `false` to resume. #[pallet::call_index(10)] - #[pallet::weight(T::WeightInfo::force_suspension())] pub fn force_suspension(origin: OriginFor, suspended: bool) -> DispatchResult { T::AdminOrigin::ensure_origin(origin)?; XcmExecutionSuspended::::set(suspended); @@ -1236,7 +1251,7 @@ pub mod pallet { /// Fee payment on the destination side is made from the asset in the `assets` vector of /// index `fee_asset_item` (hence referred to as `fees`), up to enough to pay for /// `weight_limit` of weight. If more weight is needed than `weight_limit`, then the - /// operation will fail and the assets sent may be at risk. + /// operation will fail and the sent assets may be at risk. /// /// `assets` (excluding `fees`) must have same reserve location or otherwise be teleportable /// to `dest`, no limitations imposed on `fees`. @@ -1264,26 +1279,6 @@ pub mod pallet { /// fees. /// - `weight_limit`: The remote-side weight limit, if any, for the XCM fee purchase. #[pallet::call_index(11)] - #[pallet::weight({ - let maybe_assets: Result = (*assets.clone()).try_into(); - let maybe_dest: Result = (*dest.clone()).try_into(); - match (maybe_assets, maybe_dest) { - (Ok(assets), Ok(dest)) => { - use sp_std::vec; - // heaviest version of locally executed XCM program: equivalent in weight to withdrawing fees, - // burning them, transferring rest of assets to SA, reanchoring them, extending XCM program, - // and sending onward XCM - let mut message = Xcm(vec![ - SetFeesMode { jit_withdraw: true }, - WithdrawAsset(assets.clone()), - BurnAsset(assets.clone()), - TransferReserveAsset { assets, dest, xcm: Xcm(vec![]) } - ]); - T::Weigher::weight(&mut message).map_or(Weight::MAX, |w| T::WeightInfo::transfer_assets().saturating_add(w)) - } - _ => Weight::MAX, - } - })] pub fn transfer_assets( origin: OriginFor, dest: Box, @@ -1365,6 +1360,89 @@ pub mod pallet { weight_limit, ) } + + /// Claims assets trapped on this pallet because of leftover assets during XCM execution. + /// + /// - `origin`: Anyone can call this extrinsic. + /// - `assets`: The exact assets that were trapped. Use the version to specify what version + /// was the latest when they were trapped. + /// - `beneficiary`: The location/account where the claimed assets will be deposited. + #[pallet::call_index(12)] + pub fn claim_assets( + origin: OriginFor, + assets: Box, + beneficiary: Box, + ) -> DispatchResult { + let origin_location = T::ExecuteXcmOrigin::ensure_origin(origin)?; + log::debug!(target: "xcm::pallet_xcm::claim_assets", "origin: {:?}, assets: {:?}, beneficiary: {:?}", origin_location, assets, beneficiary); + // Extract version from `assets`. + let assets_version = assets.identify_version(); + let assets: Assets = (*assets).try_into().map_err(|()| Error::::BadVersion)?; + let number_of_assets = assets.len() as u32; + let beneficiary: Location = + (*beneficiary).try_into().map_err(|()| Error::::BadVersion)?; + let ticket: Location = GeneralIndex(assets_version as u128).into(); + let mut message = Xcm(vec![ + ClaimAsset { assets, ticket }, + DepositAsset { assets: AllCounted(number_of_assets).into(), beneficiary }, + ]); + let weight = + T::Weigher::weight(&mut message).map_err(|()| Error::::UnweighableMessage)?; + let mut hash = message.using_encoded(sp_io::hashing::blake2_256); + let outcome = T::XcmExecutor::prepare_and_execute( + origin_location, + message, + &mut hash, + weight, + weight, + ); + outcome.ensure_complete().map_err(|error| { + log::error!(target: "xcm::pallet_xcm::claim_assets", "XCM execution failed with error: {:?}", error); + Error::::LocalExecutionIncomplete + })?; + Ok(()) + } + + /// Execute an XCM from a local, signed, origin. + /// + /// An event is deposited indicating whether the message could be executed completely + /// or only partially. + /// + /// No more than `max_weight` will be used in its attempted execution. If this is less than + /// the maximum amount of weight that the message could take to be executed, then no + /// execution attempt will be made. + /// + /// The message is passed in encoded. It needs to be decodable as a [`VersionedXcm`]. + #[pallet::call_index(13)] + #[pallet::weight(max_weight.saturating_add(T::WeightInfo::execute_blob()))] + pub fn execute_blob( + origin: OriginFor, + encoded_message: BoundedVec, + max_weight: Weight, + ) -> DispatchResultWithPostInfo { + let weight_used = >::execute_blob( + origin, + encoded_message, + max_weight, + )?; + Ok(Some(weight_used.saturating_add(T::WeightInfo::execute_blob())).into()) + } + + /// Send an XCM from a local, signed, origin. + /// + /// The destination, `dest`, will receive this message with a `DescendOrigin` instruction + /// that makes the origin of the message be the origin on this system. + /// + /// The message is passed in encoded. It needs to be decodable as a [`VersionedXcm`]. + #[pallet::call_index(14)] + pub fn send_blob( + origin: OriginFor, + dest: Box, + encoded_message: BoundedVec, + ) -> DispatchResult { + >::send_blob(origin, dest, encoded_message)?; + Ok(()) + } } } @@ -1394,7 +1472,6 @@ impl sp_std::fmt::Debug for FeesHandling { } impl QueryHandler for Pallet { - type QueryId = u64; type BlockNumber = BlockNumberFor; type Error = XcmError; type UniversalLocation = T::UniversalLocation; @@ -1404,7 +1481,7 @@ impl QueryHandler for Pallet { responder: impl Into, timeout: BlockNumberFor, match_querier: impl Into, - ) -> Self::QueryId { + ) -> QueryId { Self::do_new_query(responder, None, timeout, match_querier) } @@ -1414,7 +1491,7 @@ impl QueryHandler for Pallet { message: &mut Xcm<()>, responder: impl Into, timeout: Self::BlockNumber, - ) -> Result { + ) -> Result { let responder = responder.into(); let destination = Self::UniversalLocation::get() .invert_target(&responder) @@ -1427,7 +1504,7 @@ impl QueryHandler for Pallet { } /// Removes response when ready and emits [Event::ResponseTaken] event. - fn take_response(query_id: Self::QueryId) -> QueryResponseStatus { + fn take_response(query_id: QueryId) -> QueryResponseStatus { match Queries::::get(query_id) { Some(QueryStatus::Ready { response, at }) => match response.try_into() { Ok(response) => { @@ -1444,7 +1521,7 @@ impl QueryHandler for Pallet { } #[cfg(feature = "runtime-benchmarks")] - fn expect_response(id: Self::QueryId, response: Response) { + fn expect_response(id: QueryId, response: Response) { let response = response.into(); Queries::::insert( id, @@ -1907,6 +1984,7 @@ impl Pallet { ]); Ok(Xcm(vec![ WithdrawAsset(assets.into()), + SetFeesMode { jit_withdraw: true }, InitiateReserveWithdraw { assets: Wild(AllCounted(max_assets)), reserve, @@ -2279,6 +2357,37 @@ impl Pallet { AccountIdConversion::::into_account_truncating(&ID) } + pub fn query_xcm_weight(message: VersionedXcm<()>) -> Result { + let message = + Xcm::<()>::try_from(message).map_err(|_| FeePaymentError::VersionedConversionFailed)?; + + T::Weigher::weight(&mut message.into()).map_err(|()| { + log::error!(target: "xcm::pallet_xcm::query_xcm_weight", "Error when querying XCM weight"); + FeePaymentError::WeightNotComputable + }) + } + + pub fn query_delivery_fees( + destination: VersionedLocation, + message: VersionedXcm<()>, + ) -> Result { + let result_version = destination.identify_version().max(message.identify_version()); + + let destination = + destination.try_into().map_err(|_| FeePaymentError::VersionedConversionFailed)?; + + let message = message.try_into().map_err(|_| FeePaymentError::VersionedConversionFailed)?; + + let (_, fees) = validate_send::(destination, message).map_err(|error| { + log::error!(target: "xcm::pallet_xcm::query_delivery_fees", "Error when querying delivery fees: {:?}", error); + FeePaymentError::Unroutable + })?; + + VersionedAssets::from(fees) + .into_version(result_version) + .map_err(|_| FeePaymentError::VersionedConversionFailed) + } + /// Create a new expectation of a query response with the querier being here. fn do_new_query( responder: impl Into, @@ -2387,6 +2496,48 @@ impl Pallet { Self::deposit_event(Event::FeesPaid { paying: location, fees: assets }); Ok(()) } + + /// Ensure the correctness of the state of this pallet. + /// + /// This should be valid before and after each state transition of this pallet. + /// + /// ## Invariants + /// + /// All entries stored in the `SupportedVersion` / `VersionNotifiers` / `VersionNotifyTargets` + /// need to be migrated to the `XCM_VERSION`. If they are not, then `CurrentMigration` has to be + /// set. + #[cfg(any(feature = "try-runtime", test))] + pub fn do_try_state() -> Result<(), TryRuntimeError> { + // if migration has been already scheduled, everything is ok and data will be eventually + // migrated + if CurrentMigration::::exists() { + return Ok(()) + } + + // if migration has NOT been scheduled yet, we need to check all operational data + for v in 0..XCM_VERSION { + ensure!( + SupportedVersion::::iter_prefix(v).next().is_none(), + TryRuntimeError::Other( + "`SupportedVersion` data should be migrated to the `XCM_VERSION`!`" + ) + ); + ensure!( + VersionNotifiers::::iter_prefix(v).next().is_none(), + TryRuntimeError::Other( + "`VersionNotifiers` data should be migrated to the `XCM_VERSION`!`" + ) + ); + ensure!( + VersionNotifyTargets::::iter_prefix(v).next().is_none(), + TryRuntimeError::Other( + "`VersionNotifyTargets` data should be migrated to the `XCM_VERSION`!`" + ) + ); + } + + Ok(()) + } } pub struct LockTicket { diff --git a/polkadot/xcm/pallet-xcm/src/migration.rs b/polkadot/xcm/pallet-xcm/src/migration.rs index 2793afcc910484948f7d3a611c88b2ca59beb766..b157e6b5c3d5f27d206b73a1b040ca5d7944b8f2 100644 --- a/polkadot/xcm/pallet-xcm/src/migration.rs +++ b/polkadot/xcm/pallet-xcm/src/migration.rs @@ -14,10 +14,12 @@ // You should have received a copy of the GNU General Public License // along with Polkadot. If not, see . -use crate::{Config, Pallet, VersionNotifyTargets}; +use crate::{ + pallet::CurrentMigration, Config, Pallet, VersionMigrationStage, VersionNotifyTargets, +}; use frame_support::{ pallet_prelude::*, - traits::{OnRuntimeUpgrade, StorageVersion}, + traits::{OnRuntimeUpgrade, StorageVersion, UncheckedOnRuntimeUpgrade}, weights::Weight, }; @@ -33,7 +35,7 @@ pub mod v1 { /// /// Use experimental [`MigrateToV1`] instead. pub struct VersionUncheckedMigrateToV1(sp_std::marker::PhantomData); - impl OnRuntimeUpgrade for VersionUncheckedMigrateToV1 { + impl UncheckedOnRuntimeUpgrade for VersionUncheckedMigrateToV1 { fn on_runtime_upgrade() -> Weight { let mut weight = T::DbWeight::get().reads(1); @@ -73,3 +75,16 @@ pub mod v1 { ::DbWeight, >; } + +/// When adding a new XCM version, we need to run this migration for `pallet_xcm` to ensure that all +/// previously stored data with subkey prefix `XCM_VERSION-1` (and below) are migrated to the +/// `XCM_VERSION`. +/// +/// NOTE: This migration can be permanently added to the runtime migrations. +pub struct MigrateToLatestXcmVersion(sp_std::marker::PhantomData); +impl OnRuntimeUpgrade for MigrateToLatestXcmVersion { + fn on_runtime_upgrade() -> Weight { + CurrentMigration::::put(VersionMigrationStage::default()); + T::DbWeight::get().writes(1) + } +} diff --git a/polkadot/xcm/pallet-xcm/src/mock.rs b/polkadot/xcm/pallet-xcm/src/mock.rs index 434dac1659b50085f4e4f863e77c0cbe1b38af68..2cc228476ba8e18dace2fc950d7253cba61cd8a4 100644 --- a/polkadot/xcm/pallet-xcm/src/mock.rs +++ b/polkadot/xcm/pallet-xcm/src/mock.rs @@ -30,13 +30,11 @@ use sp_core::H256; use sp_runtime::{traits::IdentityLookup, AccountId32, BuildStorage}; pub use sp_std::cell::RefCell; use xcm::prelude::*; -#[allow(deprecated)] -use xcm_builder::CurrencyAdapter as XcmCurrencyAdapter; use xcm_builder::{ AccountId32Aliases, AllowKnownQueryResponses, AllowSubscriptionsFrom, AllowTopLevelPaidExecutionFrom, Case, ChildParachainAsNative, ChildParachainConvertsVia, ChildSystemParachainAsSuperuser, DescribeAllTerminal, FixedRateOfFungible, FixedWeightBounds, - FrameTransactionalProcessor, FungiblesAdapter, HashedDescription, IsConcrete, + FrameTransactionalProcessor, FungibleAdapter, FungiblesAdapter, HashedDescription, IsConcrete, MatchedConvertedConcreteId, NoChecking, SignedAccountId32AsNative, SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit, XcmFeeManagerFromComponents, XcmFeeToAccount, }; @@ -174,7 +172,7 @@ impl SendXcm for TestSendXcm { msg: &mut Option>, ) -> SendResult<(Location, Xcm<()>)> { if FAIL_SEND_XCM.with(|q| *q.borrow()) { - return Err(SendError::Transport("Intentional send failure used in tests")) + return Err(SendError::Transport("Intentional send failure used in tests")); } let pair = (dest.take().unwrap(), msg.take().unwrap()); Ok((pair, Assets::new())) @@ -243,7 +241,7 @@ parameter_types! { pub const BlockHashCount: u64 = 250; } -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { type RuntimeOrigin = RuntimeOrigin; type RuntimeCall = RuntimeCall; @@ -363,6 +361,10 @@ parameter_types! { 0, [Parachain(FOREIGN_ASSET_RESERVE_PARA_ID)] ); + pub PaidParaForeignReserveLocation: Location = Location::new( + 0, + [Parachain(Para3000::get())] + ); pub ForeignAsset: Asset = Asset { fun: Fungible(10), id: AssetId(Location::new( @@ -370,6 +372,13 @@ parameter_types! { [Parachain(FOREIGN_ASSET_RESERVE_PARA_ID), FOREIGN_ASSET_INNER_JUNCTION], )), }; + pub PaidParaForeignAsset: Asset = Asset { + fun: Fungible(10), + id: AssetId(Location::new( + 0, + [Parachain(Para3000::get())], + )), + }; pub UsdcReserveLocation: Location = Location::new( 0, [Parachain(USDC_RESERVE_PARA_ID)] @@ -424,9 +433,8 @@ pub type ForeignAssetsConvertedConcreteId = MatchedConvertedConcreteId< JustTry, >; -#[allow(deprecated)] pub type AssetTransactors = ( - XcmCurrencyAdapter, SovereignAccountOf, AccountId, ()>, + FungibleAdapter, SovereignAccountOf, AccountId, ()>, FungiblesAdapter< AssetsPallet, ForeignAssetsConvertedConcreteId, @@ -453,6 +461,8 @@ parameter_types! { pub TrustedFilteredTeleport: (AssetFilter, Location) = (FilteredTeleportAsset::get().into(), FilteredTeleportLocation::get()); pub TeleportUsdtToForeign: (AssetFilter, Location) = (Usdt::get().into(), ForeignReserveLocation::get()); pub TrustedForeign: (AssetFilter, Location) = (ForeignAsset::get().into(), ForeignReserveLocation::get()); + pub TrustedPaidParaForeign: (AssetFilter, Location) = (PaidParaForeignAsset::get().into(), PaidParaForeignReserveLocation::get()); + pub TrustedUsdc: (AssetFilter, Location) = (Usdc::get().into(), UsdcReserveLocation::get()); pub const MaxInstructions: u32 = 100; pub const MaxAssetsIntoHolding: u32 = 64; @@ -486,7 +496,7 @@ impl xcm_executor::Config for XcmConfig { type XcmSender = XcmRouter; type AssetTransactor = AssetTransactors; type OriginConverter = LocalOriginConverter; - type IsReserve = (Case, Case); + type IsReserve = (Case, Case, Case); type IsTeleporter = ( Case, Case, @@ -516,6 +526,9 @@ impl xcm_executor::Config for XcmConfig { type SafeCallFilter = Everything; type Aliasers = Nothing; type TransactionalProcessor = FrameTransactionalProcessor; + type HrmpNewChannelOpenRequestHandler = (); + type HrmpChannelAcceptedHandler = (); + type HrmpChannelClosingHandler = (); } pub type LocalOriginToLocation = SignedToAccountId32; @@ -566,8 +579,30 @@ impl pallet_test_notifier::Config for Test { type RuntimeCall = RuntimeCall; } +#[cfg(feature = "runtime-benchmarks")] +pub struct TestDeliveryHelper; +#[cfg(feature = "runtime-benchmarks")] +impl xcm_builder::EnsureDelivery for TestDeliveryHelper { + fn ensure_successful_delivery( + origin_ref: &Location, + _dest: &Location, + _fee_reason: xcm_executor::traits::FeeReason, + ) -> (Option, Option) { + use xcm_executor::traits::ConvertLocation; + let account = SovereignAccountOf::convert_location(origin_ref).expect("Valid location"); + // Give the existential deposit at least + let balance = ExistentialDeposit::get(); + let _ = >::make_free_balance_be( + &account, balance, + ); + (None, None) + } +} + #[cfg(feature = "runtime-benchmarks")] impl super::benchmarking::Config for Test { + type DeliveryHelper = TestDeliveryHelper; + fn reachable_dest() -> Option { Some(Parachain(1000).into()) } @@ -635,6 +670,10 @@ impl super::benchmarking::Config for Test { }); Some((assets, fee_index as u32, dest, verify)) } + + fn get_asset() -> Asset { + Asset { id: AssetId(Location::here()), fun: Fungible(ExistentialDeposit::get()) } + } } pub(crate) fn last_event() -> RuntimeEvent { diff --git a/polkadot/xcm/pallet-xcm/src/tests/assets_transfer.rs b/polkadot/xcm/pallet-xcm/src/tests/assets_transfer.rs index 27be5cce145859a999c9e45ec2ca4aa32de3c641..7dc05c1cc70e69f7de32d26356eaacdf52d9debf 100644 --- a/polkadot/xcm/pallet-xcm/src/tests/assets_transfer.rs +++ b/polkadot/xcm/pallet-xcm/src/tests/assets_transfer.rs @@ -31,13 +31,17 @@ use sp_runtime::{traits::AccountIdConversion, DispatchError, ModuleError}; use xcm::prelude::*; use xcm_executor::traits::ConvertLocation; -// Helper function to deduplicate testing different teleport types. -fn do_test_and_verify_teleport_assets( - origin_location: Location, - expected_beneficiary: Location, - call: Call, - expected_weight_limit: WeightLimit, -) { +/// Test `limited_teleport_assets` +/// +/// Asserts that the sender's balance is decreased as a result of execution of +/// local effects. +#[test] +fn limited_teleport_assets_works() { + let origin_location: Location = AccountId32 { network: None, id: ALICE.into() }.into(); + let expected_beneficiary: Location = AccountId32 { network: None, id: BOB.into() }.into(); + let weight_limit = WeightLimit::Limited(Weight::from_parts(5000, 5000)); + let expected_weight_limit = weight_limit.clone(); + let balances = vec![ (ALICE, INITIAL_BALANCE), (ParaId::from(OTHER_PARA_ID).into_account_truncating(), INITIAL_BALANCE), @@ -47,7 +51,14 @@ fn do_test_and_verify_teleport_assets( let weight = BaseXcmWeight::get() * 2; assert_eq!(Balances::total_balance(&ALICE), INITIAL_BALANCE); // call extrinsic - call(); + assert_ok!(XcmPallet::limited_teleport_assets( + RuntimeOrigin::signed(ALICE), + Box::new(RelayLocation::get().into()), + Box::new(expected_beneficiary.clone().into()), + Box::new((Here, SEND_AMOUNT).into()), + 0, + weight_limit, + )); assert_eq!(Balances::total_balance(&ALICE), INITIAL_BALANCE - SEND_AMOUNT); assert_eq!( sent_xcm(), @@ -88,57 +99,6 @@ fn do_test_and_verify_teleport_assets( }); } -/// Test `teleport_assets` -/// -/// Asserts that the sender's balance is decreased as a result of execution of -/// local effects. -#[test] -fn teleport_assets_works() { - let origin_location: Location = AccountId32 { network: None, id: ALICE.into() }.into(); - let beneficiary: Location = AccountId32 { network: None, id: BOB.into() }.into(); - do_test_and_verify_teleport_assets( - origin_location.clone(), - beneficiary.clone(), - || { - assert_ok!(XcmPallet::teleport_assets( - RuntimeOrigin::signed(ALICE), - Box::new(RelayLocation::get().into()), - Box::new(beneficiary.into()), - Box::new((Here, SEND_AMOUNT).into()), - 0, - )); - }, - Unlimited, - ); -} - -/// Test `limited_teleport_assets` -/// -/// Asserts that the sender's balance is decreased as a result of execution of -/// local effects. -#[test] -fn limited_teleport_assets_works() { - let origin_location: Location = AccountId32 { network: None, id: ALICE.into() }.into(); - let beneficiary: Location = AccountId32 { network: None, id: BOB.into() }.into(); - let weight_limit = WeightLimit::Limited(Weight::from_parts(5000, 5000)); - let expected_weight_limit = weight_limit.clone(); - do_test_and_verify_teleport_assets( - origin_location.clone(), - beneficiary.clone(), - || { - assert_ok!(XcmPallet::limited_teleport_assets( - RuntimeOrigin::signed(ALICE), - Box::new(RelayLocation::get().into()), - Box::new(beneficiary.into()), - Box::new((Here, SEND_AMOUNT).into()), - 0, - weight_limit, - )); - }, - expected_weight_limit, - ); -} - /// `limited_teleport_assets` should fail for filtered assets #[test] fn limited_teleport_filtered_assets_disallowed() { @@ -184,12 +144,13 @@ fn reserve_transfer_assets_with_paid_router_works() { let dest: Location = Junction::AccountId32 { network: None, id: user_account.clone().into() }.into(); assert_eq!(Balances::total_balance(&user_account), INITIAL_BALANCE); - assert_ok!(XcmPallet::reserve_transfer_assets( + assert_ok!(XcmPallet::limited_reserve_transfer_assets( RuntimeOrigin::signed(user_account.clone()), Box::new(Parachain(paid_para_id).into()), Box::new(dest.clone().into()), Box::new((Here, SEND_AMOUNT).into()), 0, + Unlimited, )); // XCM_FEES_NOT_WAIVED_USER_ACCOUNT spent amount @@ -248,7 +209,7 @@ fn reserve_transfer_assets_with_paid_router_works() { pub(crate) fn set_up_foreign_asset( reserve_para_id: u32, inner_junction: Option, - benficiary: AccountId, + beneficiary: AccountId, initial_amount: u128, is_sufficient: bool, ) -> (Location, AccountId, Location) { @@ -276,7 +237,7 @@ pub(crate) fn set_up_foreign_asset( assert_ok!(AssetsPallet::mint( RuntimeOrigin::signed(BOB), foreign_asset_id_location.clone(), - benficiary, + beneficiary, initial_amount )); @@ -2604,3 +2565,174 @@ fn teleport_assets_using_destination_reserve_fee_disallowed() { expected_result, ); } + +/// Test `tested_call` transferring single asset using remote reserve. +/// +/// Transferring Para3000 asset (`Para3000` reserve) to +/// `OTHER_PARA_ID` (no teleport trust), therefore triggering remote reserve. +/// Using the same asset asset (Para3000 reserve) for fees. +/// +/// Asserts that the sender's balance is decreased and the beneficiary's balance +/// is increased. Verifies the correct message is sent and event is emitted. +/// +/// Verifies that XCM router fees (`SendXcm::validate` -> `Assets`) are withdrawn from correct +/// user account and deposited to a correct target account (`XcmFeesTargetAccount`). +/// Verifies `expected_result`. +fn remote_asset_reserve_and_remote_fee_reserve_paid_call( + tested_call: Call, + expected_result: DispatchResult, +) where + Call: FnOnce( + OriginFor, + Box, + Box, + Box, + u32, + WeightLimit, + ) -> DispatchResult, +{ + let weight = BaseXcmWeight::get() * 3; + let user_account = AccountId::from(XCM_FEES_NOT_WAIVED_USER_ACCOUNT); + let xcm_router_fee_amount = Para3000PaymentAmount::get(); + let paid_para_id = Para3000::get(); + let balances = vec![ + (user_account.clone(), INITIAL_BALANCE), + (ParaId::from(paid_para_id).into_account_truncating(), INITIAL_BALANCE), + (XcmFeesTargetAccount::get(), INITIAL_BALANCE), + ]; + let beneficiary: Location = Junction::AccountId32 { network: None, id: ALICE.into() }.into(); + new_test_ext_with_balances(balances).execute_with(|| { + // create sufficient foreign asset BLA + let foreign_initial_amount = 142; + let (reserve_location, _, foreign_asset_id_location) = set_up_foreign_asset( + paid_para_id, + None, + user_account.clone(), + foreign_initial_amount, + true, + ); + + // transfer destination is another chain that is not the reserve location + // the goal is to trigger the remoteReserve case + let dest = RelayLocation::get().pushed_with_interior(Parachain(OTHER_PARA_ID)).unwrap(); + + let transferred_asset: Assets = (foreign_asset_id_location.clone(), SEND_AMOUNT).into(); + + // balances checks before + assert_eq!( + AssetsPallet::balance(foreign_asset_id_location.clone(), user_account.clone()), + foreign_initial_amount + ); + assert_eq!(Balances::free_balance(user_account.clone()), INITIAL_BALANCE); + + // do the transfer + let result = tested_call( + RuntimeOrigin::signed(user_account.clone()), + Box::new(dest.clone().into()), + Box::new(beneficiary.clone().into()), + Box::new(transferred_asset.into()), + 0 as u32, + Unlimited, + ); + assert_eq!(result, expected_result); + if expected_result.is_err() { + // short-circuit here for tests where we expect failure + return; + } + + let mut last_events = last_events(7).into_iter(); + // asset events + // forceCreate + last_events.next().unwrap(); + // mint tokens + last_events.next().unwrap(); + // burn tokens + last_events.next().unwrap(); + // balance events + // burn delivery fee + last_events.next().unwrap(); + // mint delivery fee + last_events.next().unwrap(); + assert_eq!( + last_events.next().unwrap(), + RuntimeEvent::XcmPallet(crate::Event::Attempted { + outcome: Outcome::Complete { used: weight } + }) + ); + + // user account spent (transferred) amount + assert_eq!( + AssetsPallet::balance(foreign_asset_id_location.clone(), user_account.clone()), + foreign_initial_amount - SEND_AMOUNT + ); + + // user account spent delivery fees + assert_eq!(Balances::free_balance(user_account), INITIAL_BALANCE - xcm_router_fee_amount); + + // XcmFeesTargetAccount where should lend xcm_router_fee_amount + assert_eq!( + Balances::free_balance(XcmFeesTargetAccount::get()), + INITIAL_BALANCE + xcm_router_fee_amount + ); + + // Verify total and active issuance of foreign BLA have decreased (burned on + // reserve-withdraw) + let expected_issuance = foreign_initial_amount - SEND_AMOUNT; + assert_eq!( + AssetsPallet::total_issuance(foreign_asset_id_location.clone()), + expected_issuance + ); + assert_eq!( + AssetsPallet::active_issuance(foreign_asset_id_location.clone()), + expected_issuance + ); + + let context = UniversalLocation::get(); + let foreign_id_location_reanchored = + foreign_asset_id_location.reanchored(&dest, &context).unwrap(); + let dest_reanchored = dest.reanchored(&reserve_location, &context).unwrap(); + + // Verify sent XCM program + assert_eq!( + sent_xcm(), + vec![( + reserve_location, + // `assets` are burned on source and withdrawn from SA in remote reserve chain + Xcm(vec![ + WithdrawAsset((Location::here(), SEND_AMOUNT).into()), + ClearOrigin, + buy_execution((Location::here(), SEND_AMOUNT / 2)), + DepositReserveAsset { + assets: Wild(AllCounted(1)), + // final destination is `dest` as seen by `reserve` + dest: dest_reanchored, + // message sent onward to `dest` + xcm: Xcm(vec![ + buy_execution((foreign_id_location_reanchored, SEND_AMOUNT / 2)), + DepositAsset { assets: AllCounted(1).into(), beneficiary } + ]) + } + ]) + )] + ); + }); +} +/// Test `transfer_assets` with remote asset reserve and remote fee reserve. +#[test] +fn transfer_assets_with_remote_asset_reserve_and_remote_asset_fee_reserve_paid_works() { + let expected_result = Ok(()); + remote_asset_reserve_and_remote_fee_reserve_paid_call( + XcmPallet::transfer_assets, + expected_result, + ); +} +/// Test `limited_reserve_transfer_assets` with remote asset reserve and remote fee reserve. +#[test] +fn limited_reserve_transfer_assets_with_remote_asset_reserve_and_remote_asset_fee_reserve_paid_works( +) { + let expected_result = Ok(()); + remote_asset_reserve_and_remote_fee_reserve_paid_call( + XcmPallet::limited_reserve_transfer_assets, + expected_result, + ); +} diff --git a/polkadot/xcm/pallet-xcm/src/tests/mod.rs b/polkadot/xcm/pallet-xcm/src/tests/mod.rs index 5f9c86ed7b3f0bd99dc9064e1c53ef9872a799ce..1147635081a41db78927f5f1765210e315a0c92a 100644 --- a/polkadot/xcm/pallet-xcm/src/tests/mod.rs +++ b/polkadot/xcm/pallet-xcm/src/tests/mod.rs @@ -19,11 +19,13 @@ pub(crate) mod assets_transfer; use crate::{ - mock::*, AssetTraps, CurrentMigration, Error, LatestVersionedLocation, Queries, QueryStatus, - VersionDiscoveryQueue, VersionMigrationStage, VersionNotifiers, VersionNotifyTargets, + mock::*, pallet::SupportedVersion, AssetTraps, Config, CurrentMigration, Error, + LatestVersionedLocation, Pallet, Queries, QueryStatus, VersionDiscoveryQueue, + VersionMigrationStage, VersionNotifiers, VersionNotifyTargets, WeightInfo, }; +use codec::Encode; use frame_support::{ - assert_noop, assert_ok, + assert_err_ignore_postinfo, assert_noop, assert_ok, traits::{Currency, Hooks}, weights::Weight, }; @@ -303,11 +305,12 @@ fn send_works() { ]); let versioned_dest = Box::new(RelayLocation::get().into()); - let versioned_message = Box::new(VersionedXcm::from(message.clone())); - assert_ok!(XcmPallet::send( + let versioned_message = VersionedXcm::from(message.clone()); + let encoded_versioned_message = versioned_message.encode().try_into().unwrap(); + assert_ok!(XcmPallet::send_blob( RuntimeOrigin::signed(ALICE), versioned_dest, - versioned_message + encoded_versioned_message )); let sent_message = Xcm(Some(DescendOrigin(sender.clone().try_into().unwrap())) .into_iter() @@ -339,16 +342,16 @@ fn send_fails_when_xcm_router_blocks() { ]; new_test_ext_with_balances(balances).execute_with(|| { let sender: Location = Junction::AccountId32 { network: None, id: ALICE.into() }.into(); - let message = Xcm(vec![ + let message = Xcm::<()>(vec![ ReserveAssetDeposited((Parent, SEND_AMOUNT).into()), buy_execution((Parent, SEND_AMOUNT)), DepositAsset { assets: AllCounted(1).into(), beneficiary: sender }, ]); assert_noop!( - XcmPallet::send( + XcmPallet::send_blob( RuntimeOrigin::signed(ALICE), Box::new(Location::ancestor(8).into()), - Box::new(VersionedXcm::from(message.clone())), + VersionedXcm::from(message.clone()).encode().try_into().unwrap(), ), crate::Error::::SendFailure ); @@ -369,13 +372,16 @@ fn execute_withdraw_to_deposit_works() { let weight = BaseXcmWeight::get() * 3; let dest: Location = Junction::AccountId32 { network: None, id: BOB.into() }.into(); assert_eq!(Balances::total_balance(&ALICE), INITIAL_BALANCE); - assert_ok!(XcmPallet::execute( + assert_ok!(XcmPallet::execute_blob( RuntimeOrigin::signed(ALICE), - Box::new(VersionedXcm::from(Xcm(vec![ + VersionedXcm::from(Xcm::(vec![ WithdrawAsset((Here, SEND_AMOUNT).into()), buy_execution((Here, SEND_AMOUNT)), DepositAsset { assets: AllCounted(1).into(), beneficiary: dest }, - ]))), + ])) + .encode() + .try_into() + .unwrap(), weight )); assert_eq!(Balances::total_balance(&ALICE), INITIAL_BALANCE - SEND_AMOUNT); @@ -397,18 +403,21 @@ fn trapped_assets_can_be_claimed() { let weight = BaseXcmWeight::get() * 6; let dest: Location = Junction::AccountId32 { network: None, id: BOB.into() }.into(); - assert_ok!(XcmPallet::execute( + assert_ok!(XcmPallet::execute_blob( RuntimeOrigin::signed(ALICE), - Box::new(VersionedXcm::from(Xcm(vec![ + VersionedXcm::from(Xcm(vec![ WithdrawAsset((Here, SEND_AMOUNT).into()), buy_execution((Here, SEND_AMOUNT)), // Don't propagated the error into the result. - SetErrorHandler(Xcm(vec![ClearError])), + SetErrorHandler(Xcm::(vec![ClearError])), // This will make an error. Trap(0), // This would succeed, but we never get to it. DepositAsset { assets: AllCounted(1).into(), beneficiary: dest.clone() }, - ]))), + ])) + .encode() + .try_into() + .unwrap(), weight )); let source: Location = Junction::AccountId32 { network: None, id: ALICE.into() }.into(); @@ -435,13 +444,16 @@ fn trapped_assets_can_be_claimed() { assert_eq!(trapped, expected); let weight = BaseXcmWeight::get() * 3; - assert_ok!(XcmPallet::execute( + assert_ok!(XcmPallet::execute_blob( RuntimeOrigin::signed(ALICE), - Box::new(VersionedXcm::from(Xcm(vec![ + VersionedXcm::from(Xcm::(vec![ ClaimAsset { assets: (Here, SEND_AMOUNT).into(), ticket: Here.into() }, buy_execution((Here, SEND_AMOUNT)), DepositAsset { assets: AllCounted(1).into(), beneficiary: dest.clone() }, - ]))), + ])) + .encode() + .try_into() + .unwrap(), weight )); @@ -449,19 +461,73 @@ fn trapped_assets_can_be_claimed() { assert_eq!(Balances::total_balance(&BOB), INITIAL_BALANCE + SEND_AMOUNT); assert_eq!(AssetTraps::::iter().collect::>(), vec![]); - let weight = BaseXcmWeight::get() * 3; - assert_ok!(>::execute( + // Can't claim twice. + assert_err_ignore_postinfo!( + XcmPallet::execute_blob( + RuntimeOrigin::signed(ALICE), + VersionedXcm::from(Xcm::(vec![ + ClaimAsset { assets: (Here, SEND_AMOUNT).into(), ticket: Here.into() }, + buy_execution((Here, SEND_AMOUNT)), + DepositAsset { assets: AllCounted(1).into(), beneficiary: dest }, + ])) + .encode() + .try_into() + .unwrap(), + weight + ), + Error::::LocalExecutionIncomplete + ); + }); +} + +// Like `trapped_assets_can_be_claimed` but using the `claim_assets` extrinsic. +#[test] +fn claim_assets_works() { + let balances = vec![(ALICE, INITIAL_BALANCE)]; + new_test_ext_with_balances(balances).execute_with(|| { + // First trap some assets. + let trapping_program = + Xcm::::builder_unsafe().withdraw_asset((Here, SEND_AMOUNT)).build(); + // Even though assets are trapped, the extrinsic returns success. + assert_ok!(XcmPallet::execute_blob( RuntimeOrigin::signed(ALICE), - Box::new(VersionedXcm::from(Xcm(vec![ - ClaimAsset { assets: (Here, SEND_AMOUNT).into(), ticket: Here.into() }, - buy_execution((Here, SEND_AMOUNT)), - DepositAsset { assets: AllCounted(1).into(), beneficiary: dest }, - ]))), - weight + VersionedXcm::V4(trapping_program).encode().try_into().unwrap(), + BaseXcmWeight::get() * 2, + )); + assert_eq!(Balances::total_balance(&ALICE), INITIAL_BALANCE - SEND_AMOUNT); + + // Expected `AssetsTrapped` event info. + let source: Location = Junction::AccountId32 { network: None, id: ALICE.into() }.into(); + let versioned_assets = VersionedAssets::V4(Assets::from((Here, SEND_AMOUNT))); + let hash = BlakeTwo256::hash_of(&(source.clone(), versioned_assets.clone())); + + // Assets were indeed trapped. + assert_eq!( + last_events(2), + vec![ + RuntimeEvent::XcmPallet(crate::Event::AssetsTrapped { + hash, + origin: source, + assets: versioned_assets + }), + RuntimeEvent::XcmPallet(crate::Event::Attempted { + outcome: Outcome::Complete { used: BaseXcmWeight::get() * 1 } + }) + ], + ); + let trapped = AssetTraps::::iter().collect::>(); + assert_eq!(trapped, vec![(hash, 1)]); + + // Now claim them with the extrinsic. + assert_ok!(XcmPallet::claim_assets( + RuntimeOrigin::signed(ALICE), + Box::new(VersionedAssets::V4((Here, SEND_AMOUNT).into())), + Box::new(VersionedLocation::V4( + AccountId32 { network: None, id: ALICE.clone().into() }.into() + )), )); - let outcome = - Outcome::Incomplete { used: BaseXcmWeight::get(), error: XcmError::UnknownClaim }; - assert_eq!(last_event(), RuntimeEvent::XcmPallet(crate::Event::Attempted { outcome })); + assert_eq!(Balances::total_balance(&ALICE), INITIAL_BALANCE); + assert_eq!(AssetTraps::::iter().collect::>(), vec![]); }); } @@ -478,9 +544,9 @@ fn incomplete_execute_reverts_side_effects() { assert_eq!(Balances::total_balance(&ALICE), INITIAL_BALANCE); let amount_to_send = INITIAL_BALANCE - ExistentialDeposit::get(); let assets: Assets = (Here, amount_to_send).into(); - let result = XcmPallet::execute( + let result = XcmPallet::execute_blob( RuntimeOrigin::signed(ALICE), - Box::new(VersionedXcm::from(Xcm(vec![ + VersionedXcm::from(Xcm::(vec![ // Withdraw + BuyExec + Deposit should work WithdrawAsset(assets.clone()), buy_execution(assets.inner()[0].clone()), @@ -488,17 +554,23 @@ fn incomplete_execute_reverts_side_effects() { // Withdrawing once more will fail because of InsufficientBalance, and we expect to // revert the effects of the above instructions as well WithdrawAsset(assets), - ]))), + ])) + .encode() + .try_into() + .unwrap(), weight, ); // all effects are reverted and balances unchanged for either sender or receiver assert_eq!(Balances::total_balance(&ALICE), INITIAL_BALANCE); assert_eq!(Balances::total_balance(&BOB), INITIAL_BALANCE); + assert_eq!( result, Err(sp_runtime::DispatchErrorWithPostInfo { post_info: frame_support::dispatch::PostDispatchInfo { - actual_weight: None, + actual_weight: Some( + <::WeightInfo>::execute_blob() + weight + ), pays_fee: frame_support::dispatch::Pays::Yes, }, error: sp_runtime::DispatchError::Module(sp_runtime::ModuleError { @@ -1113,3 +1185,83 @@ fn get_and_wrap_version_works() { assert_eq!(VersionDiscoveryQueue::::get().into_inner(), vec![(remote_b.into(), 2)]); }) } + +#[test] +fn multistage_migration_works() { + new_test_ext_with_balances(vec![]).execute_with(|| { + // An entry from a previous runtime with v3 XCM. + let v3_location = VersionedLocation::V3(xcm::v3::Junction::Parachain(1001).into()); + let v3_version = xcm::v3::VERSION; + SupportedVersion::::insert(v3_version, v3_location.clone(), v3_version); + VersionNotifiers::::insert(v3_version, v3_location.clone(), 1); + VersionNotifyTargets::::insert( + v3_version, + v3_location, + (70, Weight::zero(), v3_version), + ); + // A version to advertise. + AdvertisedXcmVersion::set(4); + + // check `try-state` + assert!(Pallet::::do_try_state().is_err()); + + // closure simulates a multistage migration process + let migrate = |expected_cycle_count| { + // A runtime upgrade which alters the version does send notifications. + CurrentMigration::::put(VersionMigrationStage::default()); + let mut maybe_migration = CurrentMigration::::take(); + let mut counter = 0; + let mut weight_used = Weight::zero(); + while let Some(migration) = maybe_migration.take() { + counter += 1; + let (w, m) = XcmPallet::check_xcm_version_change(migration, Weight::zero()); + maybe_migration = m; + weight_used.saturating_accrue(w); + } + assert_eq!(counter, expected_cycle_count); + weight_used + }; + + // run migration for the first time + let _ = migrate(4); + + // check xcm sent + assert_eq!( + take_sent_xcm(), + vec![( + Parachain(1001).into(), + Xcm(vec![QueryResponse { + query_id: 70, + max_weight: Weight::zero(), + response: Response::Version(AdvertisedXcmVersion::get()), + querier: None, + }]) + ),] + ); + + // check migrated data + assert_eq!( + SupportedVersion::::iter().collect::>(), + vec![(XCM_VERSION, Parachain(1001).into_versioned(), v3_version),] + ); + assert_eq!( + VersionNotifiers::::iter().collect::>(), + vec![(XCM_VERSION, Parachain(1001).into_versioned(), 1),] + ); + assert_eq!( + VersionNotifyTargets::::iter().collect::>(), + vec![(XCM_VERSION, Parachain(1001).into_versioned(), (70, Weight::zero(), 4)),] + ); + + // run migration again to check it can run multiple time without any harm or double sending + // messages. + let weight_used = migrate(1); + assert_eq!(weight_used, 1_u8 * ::WeightInfo::already_notified_target()); + + // check no xcm sent + assert_eq!(take_sent_xcm(), vec![]); + + // check `try-state` + assert!(Pallet::::do_try_state().is_ok()); + }) +} diff --git a/polkadot/xcm/procedural/Cargo.toml b/polkadot/xcm/procedural/Cargo.toml index f87347f12dc29161bfe2ab71f5cce69530b94cfe..ca9fb351bd3cad1f805106e405cfdcc496c9d8a8 100644 --- a/polkadot/xcm/procedural/Cargo.toml +++ b/polkadot/xcm/procedural/Cargo.toml @@ -15,8 +15,8 @@ proc-macro = true [dependencies] proc-macro2 = "1.0.56" -quote = "1.0.28" -syn = "2.0.48" +quote = { workspace = true } +syn = { workspace = true } Inflector = "0.11.4" [dev-dependencies] diff --git a/polkadot/xcm/procedural/src/builder_pattern.rs b/polkadot/xcm/procedural/src/builder_pattern.rs index e58c51103497a23a0b97d7274deba1130bfaf28a..0a33d52580fca02166990c72258fa77bcfb21d45 100644 --- a/polkadot/xcm/procedural/src/builder_pattern.rs +++ b/polkadot/xcm/procedural/src/builder_pattern.rs @@ -107,7 +107,8 @@ fn generate_builder_raw_impl(name: &Ident, data_enum: &DataEnum) -> TokenStream2 .collect(); let arg_types: Vec<_> = fields.unnamed.iter().map(|field| &field.ty).collect(); quote! { - pub fn #method_name(mut self, #(#arg_names: #arg_types),*) -> Self { + pub fn #method_name(mut self, #(#arg_names: impl Into<#arg_types>),*) -> Self { + #(let #arg_names = #arg_names.into();)* self.instructions.push(#name::::#variant_name(#(#arg_names),*)); self } @@ -117,7 +118,8 @@ fn generate_builder_raw_impl(name: &Ident, data_enum: &DataEnum) -> TokenStream2 let arg_names: Vec<_> = fields.named.iter().map(|field| &field.ident).collect(); let arg_types: Vec<_> = fields.named.iter().map(|field| &field.ty).collect(); quote! { - pub fn #method_name(mut self, #(#arg_names: #arg_types),*) -> Self { + pub fn #method_name(mut self, #(#arg_names: impl Into<#arg_types>),*) -> Self { + #(let #arg_names = #arg_names.into();)* self.instructions.push(#name::::#variant_name { #(#arg_names),* }); self } @@ -188,8 +190,9 @@ fn generate_builder_impl(name: &Ident, data_enum: &DataEnum) -> Result = fields.unnamed.iter().map(|field| &field.ty).collect(); quote! { #(#docs)* - pub fn #method_name(self, #(#arg_names: #arg_types),*) -> XcmBuilder { + pub fn #method_name(self, #(#arg_names: impl Into<#arg_types>),*) -> XcmBuilder { let mut new_instructions = self.instructions; + #(let #arg_names = #arg_names.into();)* new_instructions.push(#name::::#variant_name(#(#arg_names),*)); XcmBuilder { instructions: new_instructions, @@ -203,8 +206,9 @@ fn generate_builder_impl(name: &Ident, data_enum: &DataEnum) -> Result = fields.named.iter().map(|field| &field.ty).collect(); quote! { #(#docs)* - pub fn #method_name(self, #(#arg_names: #arg_types),*) -> XcmBuilder { + pub fn #method_name(self, #(#arg_names: impl Into<#arg_types>),*) -> XcmBuilder { let mut new_instructions = self.instructions; + #(let #arg_names = #arg_names.into();)* new_instructions.push(#name::::#variant_name { #(#arg_names),* }); XcmBuilder { instructions: new_instructions, @@ -249,8 +253,9 @@ fn generate_builder_impl(name: &Ident, data_enum: &DataEnum) -> Result XcmBuilder { + pub fn #method_name(self, #(#arg_names: impl Into<#arg_types>),*) -> XcmBuilder { let mut new_instructions = self.instructions; + #(let #arg_names = #arg_names.into();)* new_instructions.push(#name::::#variant_name { #(#arg_names),* }); XcmBuilder { instructions: new_instructions, @@ -308,8 +313,9 @@ fn generate_builder_unpaid_impl(name: &Ident, data_enum: &DataEnum) -> Result XcmBuilder { #(#docs)* - pub fn #unpaid_execution_method_name(self, #(#arg_names: #arg_types),*) -> XcmBuilder { + pub fn #unpaid_execution_method_name(self, #(#arg_names: impl Into<#arg_types>),*) -> XcmBuilder { let mut new_instructions = self.instructions; + #(let #arg_names = #arg_names.into();)* new_instructions.push(#name::::#unpaid_execution_ident { #(#arg_names),* }); XcmBuilder { instructions: new_instructions, diff --git a/polkadot/xcm/procedural/tests/builder_pattern.rs b/polkadot/xcm/procedural/tests/builder_pattern.rs index a9a30611dc019e494db488bc6591a1dbe49d4561..96b16fb7e4565c2e3e891ccf8ee3ac2bedc68b0b 100644 --- a/polkadot/xcm/procedural/tests/builder_pattern.rs +++ b/polkadot/xcm/procedural/tests/builder_pattern.rs @@ -22,11 +22,11 @@ use xcm::latest::prelude::*; #[test] fn builder_pattern_works() { let asset: Asset = (Here, 100u128).into(); - let beneficiary: Location = AccountId32 { id: [0u8; 32], network: None }.into(); + let beneficiary: Location = [0u8; 32].into(); let message: Xcm<()> = Xcm::builder() - .receive_teleported_asset(asset.clone().into()) + .receive_teleported_asset(asset.clone()) .buy_execution(asset.clone(), Unlimited) - .deposit_asset(asset.clone().into(), beneficiary.clone()) + .deposit_asset(asset.clone(), beneficiary.clone()) .build(); assert_eq!( message, @@ -53,8 +53,8 @@ fn default_builder_requires_buy_execution() { // To be able to do that, we need to use the explicitly unpaid variant let message: Xcm<()> = Xcm::builder_unpaid() .unpaid_execution(Unlimited, None) - .withdraw_asset(asset.clone().into()) - .deposit_asset(asset.clone().into(), beneficiary.clone()) + .withdraw_asset(asset.clone()) + .deposit_asset(asset.clone(), beneficiary.clone()) .build(); // This works assert_eq!( message, @@ -68,8 +68,8 @@ fn default_builder_requires_buy_execution() { // The other option doesn't have any limits whatsoever, so it should // only be used when you really know what you're doing. let message: Xcm<()> = Xcm::builder_unsafe() - .withdraw_asset(asset.clone().into()) - .deposit_asset(asset.clone().into(), beneficiary.clone()) + .withdraw_asset(asset.clone()) + .deposit_asset(asset.clone(), beneficiary.clone()) .build(); assert_eq!( message, diff --git a/polkadot/xcm/src/lib.rs b/polkadot/xcm/src/lib.rs index 561d5175b419376449759a92e61e0a2f12ae0294..e836486e86e3068b82c3f3a5905836c7704e09f7 100644 --- a/polkadot/xcm/src/lib.rs +++ b/polkadot/xcm/src/lib.rs @@ -48,6 +48,9 @@ mod tests; /// Maximum nesting level for XCM decoding. pub const MAX_XCM_DECODE_DEPTH: u32 = 8; +/// Maximum encoded size. +/// See `decoding_respects_limit` test for more reasoning behind this value. +pub const MAX_XCM_ENCODED_SIZE: u32 = 12402; /// A version of XCM. pub type Version = u32; @@ -165,6 +168,15 @@ macro_rules! versioned_type { <$v3>::max_encoded_len() } } + impl IdentifyVersion for $n { + fn identify_version(&self) -> Version { + use $n::*; + match self { + V3(_) => v3::VERSION, + V4(_) => v4::VERSION, + } + } + } }; ($(#[$attr:meta])* pub enum $n:ident { @@ -287,6 +299,16 @@ macro_rules! versioned_type { <$v3>::max_encoded_len() } } + impl IdentifyVersion for $n { + fn identify_version(&self) -> Version { + use $n::*; + match self { + V2(_) => v2::VERSION, + V3(_) => v3::VERSION, + V4(_) => v4::VERSION, + } + } + } }; } @@ -424,6 +446,16 @@ impl IntoVersion for VersionedXcm { } } +impl IdentifyVersion for VersionedXcm { + fn identify_version(&self) -> Version { + match self { + Self::V2(_) => v2::VERSION, + Self::V3(_) => v3::VERSION, + Self::V4(_) => v4::VERSION, + } + } +} + impl From> for VersionedXcm { fn from(x: v2::Xcm) -> Self { VersionedXcm::V2(x) @@ -493,8 +525,14 @@ pub trait WrapVersion { ) -> Result, ()>; } +/// Used to get the version out of a versioned type. +// TODO(XCMv5): This could be `GetVersion` and we change the current one to `GetVersionFor`. +pub trait IdentifyVersion { + fn identify_version(&self) -> Version; +} + /// Check and return the `Version` that should be used for the `Xcm` datum for the destination -/// `MultiLocation`, which will interpret it. +/// `Location`, which will interpret it. pub trait GetVersion { fn get_version_for(dest: &latest::Location) -> Option; } @@ -572,9 +610,9 @@ pub type AlwaysLts = AlwaysV4; pub mod prelude { pub use super::{ latest::prelude::*, AlwaysLatest, AlwaysLts, AlwaysV2, AlwaysV3, AlwaysV4, GetVersion, - IntoVersion, Unsupported, Version as XcmVersion, VersionedAsset, VersionedAssetId, - VersionedAssets, VersionedInteriorLocation, VersionedLocation, VersionedResponse, - VersionedXcm, WrapVersion, + IdentifyVersion, IntoVersion, Unsupported, Version as XcmVersion, VersionedAsset, + VersionedAssetId, VersionedAssets, VersionedInteriorLocation, VersionedLocation, + VersionedResponse, VersionedXcm, WrapVersion, }; } diff --git a/polkadot/xcm/src/v2/mod.rs b/polkadot/xcm/src/v2/mod.rs index 188b7f0b5c9384b7395ed08b27c4c8378719be8f..347f3f2c29206222ca546b7d543409da83cbedcf 100644 --- a/polkadot/xcm/src/v2/mod.rs +++ b/polkadot/xcm/src/v2/mod.rs @@ -1134,7 +1134,10 @@ impl TryFrom> for Instruction Self::UnsubscribeVersion, - _ => return Err(()), + i => { + log::debug!(target: "xcm::v3tov2", "`{i:?}` not supported by v2"); + return Err(()); + }, }) } } diff --git a/polkadot/xcm/src/v2/multilocation.rs b/polkadot/xcm/src/v2/multilocation.rs index 60aa1f6ceadf0fefb991660393dc0cdc91f07700..ac98da8d08c910160a099e92eeef3eacd7e56513 100644 --- a/polkadot/xcm/src/v2/multilocation.rs +++ b/polkadot/xcm/src/v2/multilocation.rs @@ -176,7 +176,7 @@ impl MultiLocation { } /// Consumes `self` and returns a `MultiLocation` suffixed with `new`, or an `Err` with - /// theoriginal value of `self` in case of overflow. + /// the original value of `self` in case of overflow. pub fn pushed_with_interior(self, new: Junction) -> result::Result { match self.interior.pushed_with(new) { Ok(i) => Ok(MultiLocation { interior: i, parents: self.parents }), diff --git a/polkadot/xcm/src/v3/multilocation.rs b/polkadot/xcm/src/v3/multilocation.rs index c588b924ac70842b72678d141a67e4279563f30a..18fe01ec8fa7da6eb1db44ce961098c00a2ac13b 100644 --- a/polkadot/xcm/src/v3/multilocation.rs +++ b/polkadot/xcm/src/v3/multilocation.rs @@ -205,7 +205,7 @@ impl MultiLocation { } /// Consumes `self` and returns a `MultiLocation` suffixed with `new`, or an `Err` with - /// theoriginal value of `self` in case of overflow. + /// the original value of `self` in case of overflow. pub fn pushed_with_interior( self, new: impl Into, diff --git a/polkadot/xcm/src/v4/location.rs b/polkadot/xcm/src/v4/location.rs index db55c3d3034ce3f09b7f23c8acd8a69efbc6afc2..9275bfdb94923cd38de4d3690aafe70f3ab4b952 100644 --- a/polkadot/xcm/src/v4/location.rs +++ b/polkadot/xcm/src/v4/location.rs @@ -210,7 +210,7 @@ impl Location { } /// Consumes `self` and returns a `Location` suffixed with `new`, or an `Err` with - /// theoriginal value of `self` in case of overflow. + /// the original value of `self` in case of overflow. pub fn pushed_with_interior( self, new: impl Into, @@ -530,6 +530,13 @@ impl> From> for Location { } } +impl From<[u8; 32]> for Location { + fn from(bytes: [u8; 32]) -> Self { + let junction: Junction = bytes.into(); + junction.into() + } +} + xcm_procedural::impl_conversion_functions_for_location_v4!(); #[cfg(test)] diff --git a/polkadot/xcm/src/v4/mod.rs b/polkadot/xcm/src/v4/mod.rs index 30ee485589a28191e61fc351eda0f91d2773d589..6635408282e4849861a62be955e52d2fc4dd1b87 100644 --- a/polkadot/xcm/src/v4/mod.rs +++ b/polkadot/xcm/src/v4/mod.rs @@ -1488,7 +1488,21 @@ mod tests { let encoded = big_xcm.encode(); assert!(Xcm::<()>::decode(&mut &encoded[..]).is_err()); - let nested_xcm = Xcm::<()>(vec![ + let mut many_assets = Assets::new(); + for index in 0..MAX_ITEMS_IN_ASSETS { + many_assets.push((GeneralIndex(index as u128), 1u128).into()); + } + + let full_xcm_pass = + Xcm::<()>(vec![ + TransferAsset { assets: many_assets, beneficiary: Here.into() }; + MAX_INSTRUCTIONS_TO_DECODE as usize + ]); + let encoded = full_xcm_pass.encode(); + assert_eq!(encoded.len(), 12402); + assert!(Xcm::<()>::decode(&mut &encoded[..]).is_ok()); + + let nested_xcm_fail = Xcm::<()>(vec![ DepositReserveAsset { assets: All.into(), dest: Here.into(), @@ -1496,10 +1510,10 @@ mod tests { }; (MAX_INSTRUCTIONS_TO_DECODE / 2) as usize ]); - let encoded = nested_xcm.encode(); + let encoded = nested_xcm_fail.encode(); assert!(Xcm::<()>::decode(&mut &encoded[..]).is_err()); - let even_more_nested_xcm = Xcm::<()>(vec![SetAppendix(nested_xcm); 64]); + let even_more_nested_xcm = Xcm::<()>(vec![SetAppendix(nested_xcm_fail); 64]); let encoded = even_more_nested_xcm.encode(); assert_eq!(encoded.len(), 342530); // This should not decode since the limit is 100 diff --git a/polkadot/xcm/xcm-builder/Cargo.toml b/polkadot/xcm/xcm-builder/Cargo.toml index 30010fc2105b8f47a9a943dbd72ec9490cd49f7a..997ca99fb12c831ea63d7dbb199f2c029dabb495 100644 --- a/polkadot/xcm/xcm-builder/Cargo.toml +++ b/polkadot/xcm/xcm-builder/Cargo.toml @@ -12,7 +12,7 @@ workspace = true [dependencies] impl-trait-for-tuples = "0.2.1" parity-scale-codec = { version = "3.6.1", default-features = false, features = ["derive"] } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } xcm = { package = "staging-xcm", path = "..", default-features = false } xcm-executor = { package = "staging-xcm-executor", path = "../xcm-executor", default-features = false } sp-std = { path = "../../../substrate/primitives/std", default-features = false } @@ -23,7 +23,7 @@ sp-weights = { path = "../../../substrate/primitives/weights", default-features frame-support = { path = "../../../substrate/frame/support", default-features = false } frame-system = { path = "../../../substrate/frame/system", default-features = false } pallet-transaction-payment = { path = "../../../substrate/frame/transaction-payment", default-features = false } -log = { version = "0.4.17", default-features = false } +log = { workspace = true } # Polkadot dependencies polkadot-parachain-primitives = { path = "../../parachain", default-features = false } diff --git a/polkadot/xcm/xcm-builder/src/barriers.rs b/polkadot/xcm/xcm-builder/src/barriers.rs index 80411ab5a2246bf8c7ba96c215b685f5e90aadaf..b8923a4d5c6e88d9034536fa4dacf21c47e9108b 100644 --- a/polkadot/xcm/xcm-builder/src/barriers.rs +++ b/polkadot/xcm/xcm-builder/src/barriers.rs @@ -142,7 +142,7 @@ impl> ShouldExecute for AllowTopLevelPaidExecutionFrom /// In the above example, `AllowUnpaidExecutionFrom` appears once underneath /// `WithComputedOrigin`. This is in order to distinguish between messages which are notionally /// from a derivative location of `ParentLocation` but that just happened to be sent via -/// `ParentLocaction` rather than messages that were sent by the parent. +/// `ParentLocation` rather than messages that were sent by the parent. /// /// Similarly `AllowTopLevelPaidExecutionFrom` appears twice: once inside of `WithComputedOrigin` /// where we provide the list of origins which are derivative origins, and then secondly outside diff --git a/polkadot/xcm/xcm-builder/src/controller.rs b/polkadot/xcm/xcm-builder/src/controller.rs index 8ead18b5bd7fb4d64967123c13246ce60f46e437..6bdde2a967de9195f62fa59544fc3c254b51796b 100644 --- a/polkadot/xcm/xcm-builder/src/controller.rs +++ b/polkadot/xcm/xcm-builder/src/controller.rs @@ -18,7 +18,11 @@ //! Controller traits defined in this module are high-level traits that will rely on other traits //! from `xcm-executor` to perform their tasks. -use frame_support::pallet_prelude::DispatchError; +use frame_support::{ + dispatch::{DispatchErrorWithPostInfo, WithPostDispatchInfo}, + pallet_prelude::DispatchError, + parameter_types, BoundedVec, +}; use sp_std::boxed::Box; use xcm::prelude::*; pub use xcm_executor::traits::QueryHandler; @@ -38,8 +42,12 @@ impl Controller f /// Weight functions needed for [`ExecuteController`]. pub trait ExecuteControllerWeightInfo { - /// Weight for [`ExecuteController::execute`] - fn execute() -> Weight; + /// Weight for [`ExecuteController::execute_blob`] + fn execute_blob() -> Weight; +} + +parameter_types! { + pub const MaxXcmEncodedSize: u32 = xcm::MAX_XCM_ENCODED_SIZE; } /// Execute an XCM locally, for a given origin. @@ -52,24 +60,25 @@ pub trait ExecuteController { /// Weight information for ExecuteController functions. type WeightInfo: ExecuteControllerWeightInfo; - /// Attempt to execute an XCM locally, and return the outcome. + /// Attempt to execute an XCM locally, returns Ok with the weight consumed if the execution + /// complete successfully, Err otherwise. /// /// # Parameters /// /// - `origin`: the origin of the call. - /// - `message`: the XCM program to be executed. + /// - `msg`: the encoded XCM to be executed, should be decodable as a [`VersionedXcm`] /// - `max_weight`: the maximum weight that can be consumed by the execution. - fn execute( + fn execute_blob( origin: Origin, - message: Box>, + message: BoundedVec, max_weight: Weight, - ) -> Result; + ) -> Result; } /// Weight functions needed for [`SendController`]. pub trait SendControllerWeightInfo { - /// Weight for [`SendController::send`] - fn send() -> Weight; + /// Weight for [`SendController::send_blob`] + fn send_blob() -> Weight; } /// Send an XCM from a given origin. @@ -89,11 +98,11 @@ pub trait SendController { /// /// - `origin`: the origin of the call. /// - `dest`: the destination of the message. - /// - `msg`: the XCM to be sent. - fn send( + /// - `msg`: the encoded XCM to be sent, should be decodable as a [`VersionedXcm`] + fn send_blob( origin: Origin, dest: Box, - message: Box>, + message: BoundedVec, ) -> Result; } @@ -128,39 +137,40 @@ pub trait QueryController: QueryHandler { origin: Origin, timeout: Timeout, match_querier: VersionedLocation, - ) -> Result; + ) -> Result; } impl ExecuteController for () { type WeightInfo = (); - fn execute( + fn execute_blob( _origin: Origin, - _message: Box>, + _message: BoundedVec, _max_weight: Weight, - ) -> Result { - Ok(Outcome::Error { error: XcmError::Unimplemented }) + ) -> Result { + Err(DispatchError::Other("ExecuteController::execute_blob not implemented") + .with_weight(Weight::zero())) } } impl ExecuteControllerWeightInfo for () { - fn execute() -> Weight { + fn execute_blob() -> Weight { Weight::zero() } } impl SendController for () { type WeightInfo = (); - fn send( + fn send_blob( _origin: Origin, _dest: Box, - _message: Box>, + _message: BoundedVec, ) -> Result { Ok(Default::default()) } } impl SendControllerWeightInfo for () { - fn send() -> Weight { + fn send_blob() -> Weight { Weight::zero() } } @@ -181,7 +191,7 @@ impl QueryController for () { _origin: Origin, _timeout: Timeout, _match_querier: VersionedLocation, - ) -> Result { + ) -> Result { Ok(Default::default()) } } diff --git a/polkadot/xcm/xcm-builder/src/currency_adapter.rs b/polkadot/xcm/xcm-builder/src/currency_adapter.rs index fe26b7319bb18b2d4ad33774d389afd0f834eb50..24261ac06583c4ca284f52071a4ee80afae2a6ec 100644 --- a/polkadot/xcm/xcm-builder/src/currency_adapter.rs +++ b/polkadot/xcm/xcm-builder/src/currency_adapter.rs @@ -170,7 +170,7 @@ impl< } fn can_check_out(_dest: &Location, what: &Asset, _context: &XcmContext) -> Result { - log::trace!(target: "xcm::currency_adapter", "check_out dest: {:?}, what: {:?}", _dest, what); + log::trace!(target: "xcm::currency_adapter", "can_check_out dest: {:?}, what: {:?}", _dest, what); let amount = Matcher::matches_fungible(what).ok_or(Error::AssetNotHandled)?; match CheckedAccount::get() { Some((checked_account, MintLocation::Local)) => diff --git a/polkadot/xcm/xcm-builder/src/fungible_adapter.rs b/polkadot/xcm/xcm-builder/src/fungible_adapter.rs index 7bea8cdf957e169585c182d3a3489519ee2a14ed..21c828922b333e85e9332d16c768aef0d34cbd9f 100644 --- a/polkadot/xcm/xcm-builder/src/fungible_adapter.rs +++ b/polkadot/xcm/xcm-builder/src/fungible_adapter.rs @@ -151,7 +151,7 @@ impl< fn can_check_out(_dest: &Location, what: &Asset, _context: &XcmContext) -> XcmResult { log::trace!( target: "xcm::fungible_adapter", - "check_out dest: {:?}, what: {:?}", + "can_check_out dest: {:?}, what: {:?}", _dest, what ); @@ -204,7 +204,7 @@ impl< ) -> result::Result { log::trace!( target: "xcm::fungible_adapter", - "deposit_asset what: {:?}, who: {:?}", + "withdraw_asset what: {:?}, who: {:?}", what, who, ); let amount = Matcher::matches_fungible(what).ok_or(MatchError::AssetNotHandled)?; diff --git a/polkadot/xcm/xcm-builder/src/fungibles_adapter.rs b/polkadot/xcm/xcm-builder/src/fungibles_adapter.rs index 4574d5ed4c682c7bb62b6f20b6f9397dc37e4098..b4c418ebf1c9cf7d9d26540e998f966665993585 100644 --- a/polkadot/xcm/xcm-builder/src/fungibles_adapter.rs +++ b/polkadot/xcm/xcm-builder/src/fungibles_adapter.rs @@ -235,7 +235,7 @@ impl< fn can_check_out(_origin: &Location, what: &Asset, _context: &XcmContext) -> XcmResult { log::trace!( target: "xcm::fungibles_adapter", - "can_check_in origin: {:?}, what: {:?}", + "can_check_out origin: {:?}, what: {:?}", _origin, what ); // Check we handle this asset. diff --git a/polkadot/xcm/xcm-builder/src/lib.rs b/polkadot/xcm/xcm-builder/src/lib.rs index 42522c64d8a4da77cc676e6a338d9f019ef707a5..46d0ad227bfdf8e5e77188165fc259b0c1aec585 100644 --- a/polkadot/xcm/xcm-builder/src/lib.rs +++ b/polkadot/xcm/xcm-builder/src/lib.rs @@ -43,7 +43,7 @@ pub use barriers::{ mod controller; pub use controller::{ - Controller, ExecuteController, ExecuteControllerWeightInfo, QueryController, + Controller, ExecuteController, ExecuteControllerWeightInfo, MaxXcmEncodedSize, QueryController, QueryControllerWeightInfo, QueryHandler, SendController, SendControllerWeightInfo, }; @@ -117,7 +117,7 @@ mod process_xcm_message; pub use process_xcm_message::ProcessXcmMessage; mod routing; -pub use routing::{WithTopicSource, WithUniqueTopic}; +pub use routing::{EnsureDelivery, WithTopicSource, WithUniqueTopic}; mod transactional; pub use transactional::FrameTransactionalProcessor; diff --git a/polkadot/xcm/xcm-builder/src/pay.rs b/polkadot/xcm/xcm-builder/src/pay.rs index 6b466483cfad70e52e841b39ef44ebb7362b17cf..35b624b041539e3d89fdb98a56d0910d5033417f 100644 --- a/polkadot/xcm/xcm-builder/src/pay.rs +++ b/polkadot/xcm/xcm-builder/src/pay.rs @@ -88,7 +88,7 @@ impl< type Beneficiary = Beneficiary; type AssetKind = AssetKind; type Balance = u128; - type Id = Querier::QueryId; + type Id = QueryId; type Error = xcm::latest::Error; fn pay( diff --git a/polkadot/xcm/xcm-builder/src/routing.rs b/polkadot/xcm/xcm-builder/src/routing.rs index 9c0302baee06b81ec662bc3a0e25eb9308fc0a3a..529ef80c15ff11d3c0d2629aeb4fa9506cb37a28 100644 --- a/polkadot/xcm/xcm-builder/src/routing.rs +++ b/polkadot/xcm/xcm-builder/src/routing.rs @@ -20,6 +20,7 @@ use frame_system::unique; use parity_scale_codec::Encode; use sp_std::{marker::PhantomData, result::Result}; use xcm::prelude::*; +use xcm_executor::{traits::FeeReason, FeesMode}; /// Wrapper router which, if the message does not already end with a `SetTopic` instruction, /// appends one to the message filled with a universally unique ID. This ID is returned from a @@ -104,3 +105,37 @@ impl SendXcm for WithTopicSource (Option, Option); +} + +/// Tuple implementation for `EnsureDelivery`. +#[impl_trait_for_tuples::impl_for_tuples(30)] +impl EnsureDelivery for Tuple { + fn ensure_successful_delivery( + origin_ref: &Location, + dest: &Location, + fee_reason: FeeReason, + ) -> (Option, Option) { + for_tuples!( #( + // If the implementation returns something, we're done; if not, let others try. + match Tuple::ensure_successful_delivery(origin_ref, dest, fee_reason.clone()) { + r @ (Some(_), Some(_)) | r @ (Some(_), None) | r @ (None, Some(_)) => return r, + (None, None) => (), + } + )* ); + // doing nothing + (None, None) + } +} diff --git a/polkadot/xcm/xcm-builder/src/tests/barriers.rs b/polkadot/xcm/xcm-builder/src/tests/barriers.rs index 99a9dd5a6609fe59e5e5ac6af073d8031c41c14c..6516263f57a0936b45171ca262f4001b4315ee95 100644 --- a/polkadot/xcm/xcm-builder/src/tests/barriers.rs +++ b/polkadot/xcm/xcm-builder/src/tests/barriers.rs @@ -309,3 +309,62 @@ fn suspension_should_work() { ); assert_eq!(r, Ok(())); } + +#[test] +fn allow_subscriptions_from_should_work() { + // allow only parent + AllowSubsFrom::set(vec![Location::parent()]); + + let valid_xcm_1 = Xcm::(vec![SubscribeVersion { + query_id: 42, + max_response_weight: Weight::from_parts(5000, 5000), + }]); + let valid_xcm_2 = Xcm::(vec![UnsubscribeVersion]); + let invalid_xcm_1 = Xcm::(vec![ + SetAppendix(Xcm(vec![])), + SubscribeVersion { query_id: 42, max_response_weight: Weight::from_parts(5000, 5000) }, + ]); + let invalid_xcm_2 = Xcm::(vec![ + SubscribeVersion { query_id: 42, max_response_weight: Weight::from_parts(5000, 5000) }, + SetTopic([0; 32]), + ]); + + let test_data = vec![ + ( + valid_xcm_1.clone(), + Parachain(1).into_location(), + // not allowed origin + Err(ProcessMessageError::Unsupported), + ), + (valid_xcm_1, Location::parent(), Ok(())), + ( + valid_xcm_2.clone(), + Parachain(1).into_location(), + // not allowed origin + Err(ProcessMessageError::Unsupported), + ), + (valid_xcm_2, Location::parent(), Ok(())), + ( + invalid_xcm_1, + Location::parent(), + // invalid XCM + Err(ProcessMessageError::BadFormat), + ), + ( + invalid_xcm_2, + Location::parent(), + // invalid XCM + Err(ProcessMessageError::BadFormat), + ), + ]; + + for (mut message, origin, expected_result) in test_data { + let r = AllowSubscriptionsFrom::>::should_execute( + &origin, + message.inner_mut(), + Weight::from_parts(10, 10), + &mut props(Weight::zero()), + ); + assert_eq!(r, expected_result, "Failed for origin: {origin:?} and message: {message:?}"); + } +} diff --git a/polkadot/xcm/xcm-builder/src/tests/mock.rs b/polkadot/xcm/xcm-builder/src/tests/mock.rs index 4521d5e92a42ba3c370e0de6c05b1fa6da158ce6..3d03ab054248d907c89fe0f7a9d2fbb21896ace2 100644 --- a/polkadot/xcm/xcm-builder/src/tests/mock.rs +++ b/polkadot/xcm/xcm-builder/src/tests/mock.rs @@ -38,7 +38,7 @@ pub use sp_std::{ collections::{btree_map::BTreeMap, btree_set::BTreeSet}, fmt::Debug, }; -pub use xcm::latest::{prelude::*, Weight}; +pub use xcm::latest::{prelude::*, QueryId, Weight}; use xcm_executor::traits::{Properties, QueryHandler, QueryResponseStatus}; pub use xcm_executor::{ traits::{ @@ -414,7 +414,6 @@ pub struct TestQueryHandler(core::marker::PhantomData<(T, BlockN impl QueryHandler for TestQueryHandler { - type QueryId = u64; type BlockNumber = BlockNumber; type Error = XcmError; type UniversalLocation = T::UniversalLocation; @@ -423,7 +422,7 @@ impl QueryHandler responder: impl Into, _timeout: Self::BlockNumber, _match_querier: impl Into, - ) -> Self::QueryId { + ) -> QueryId { let query_id = 1; expect_response(query_id, responder.into()); query_id @@ -433,7 +432,7 @@ impl QueryHandler message: &mut Xcm<()>, responder: impl Into, timeout: Self::BlockNumber, - ) -> Result { + ) -> Result { let responder = responder.into(); let destination = Self::UniversalLocation::get() .invert_target(&responder) @@ -445,7 +444,7 @@ impl QueryHandler Ok(query_id) } - fn take_response(query_id: Self::QueryId) -> QueryResponseStatus { + fn take_response(query_id: QueryId) -> QueryResponseStatus { QUERIES .with(|q| { q.borrow().get(&query_id).and_then(|v| match v { @@ -460,7 +459,7 @@ impl QueryHandler } #[cfg(feature = "runtime-benchmarks")] - fn expect_response(_id: Self::QueryId, _response: xcm::latest::Response) { + fn expect_response(_id: QueryId, _response: xcm::latest::Response) { // Unnecessary since it's only a test implementation } } @@ -743,6 +742,9 @@ impl Config for TestConfig { type SafeCallFilter = Everything; type Aliasers = AliasForeignAccountId32; type TransactionalProcessor = (); + type HrmpNewChannelOpenRequestHandler = (); + type HrmpChannelAcceptedHandler = (); + type HrmpChannelClosingHandler = (); } pub fn fungible_multi_asset(location: Location, amount: u128) -> Asset { diff --git a/polkadot/xcm/xcm-builder/src/tests/mod.rs b/polkadot/xcm/xcm-builder/src/tests/mod.rs index e11caf6282be70314d4245a413194f41c7e1082f..63d254a1067582d3359c6a7dc1b27102bd1e45e7 100644 --- a/polkadot/xcm/xcm-builder/src/tests/mod.rs +++ b/polkadot/xcm/xcm-builder/src/tests/mod.rs @@ -36,6 +36,7 @@ mod locking; mod origins; mod pay; mod querying; +mod routing; mod transacting; mod version_subscriptions; mod weight; diff --git a/polkadot/xcm/xcm-builder/src/tests/origins.rs b/polkadot/xcm/xcm-builder/src/tests/origins.rs index c717d1e2af8a2f09e910dbf83fe51e6b821a6872..b6a1a9f1052a4757e7596927e10e1af73bd7b187 100644 --- a/polkadot/xcm/xcm-builder/src/tests/origins.rs +++ b/polkadot/xcm/xcm-builder/src/tests/origins.rs @@ -80,8 +80,8 @@ fn universal_origin_should_work() { fn export_message_should_work() { // Bridge chain (assumed to be Relay) lets Parachain #1 have message execution for free. AllowUnpaidFrom::set(vec![[Parachain(1)].into()]); - // Local parachain #1 issues a transfer asset on Polkadot Relay-chain, transfering 100 Planck to - // Polkadot parachain #2. + // Local parachain #1 issues a transfer asset on Polkadot Relay-chain, transferring 100 Planck + // to Polkadot parachain #2. let expected_message = Xcm(vec![TransferAsset { assets: (Here, 100u128).into(), beneficiary: Parachain(2).into(), diff --git a/polkadot/xcm/xcm-builder/src/tests/pay/mock.rs b/polkadot/xcm/xcm-builder/src/tests/pay/mock.rs index 9892c500f2eebb7cd4a3cfd88f86c6669cca4111..019113a12b2fb127142c9e59d00ef0faca84b688 100644 --- a/polkadot/xcm/xcm-builder/src/tests/pay/mock.rs +++ b/polkadot/xcm/xcm-builder/src/tests/pay/mock.rs @@ -49,7 +49,7 @@ construct_runtime!( } ); -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { type Block = Block; type AccountData = pallet_balances::AccountData; @@ -218,6 +218,9 @@ impl xcm_executor::Config for XcmConfig { type SafeCallFilter = Everything; type Aliasers = Nothing; type TransactionalProcessor = (); + type HrmpNewChannelOpenRequestHandler = (); + type HrmpChannelAcceptedHandler = (); + type HrmpChannelClosingHandler = (); } parameter_types! { diff --git a/polkadot/xcm/xcm-builder/src/tests/routing.rs b/polkadot/xcm/xcm-builder/src/tests/routing.rs new file mode 100644 index 0000000000000000000000000000000000000000..28117d647a086907dc490217d02d6cbd612c7b88 --- /dev/null +++ b/polkadot/xcm/xcm-builder/src/tests/routing.rs @@ -0,0 +1,95 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +use super::*; +use frame_support::{assert_ok, traits::Everything}; +use xcm_executor::traits::Properties; + +fn props() -> Properties { + Properties { weight_credit: Weight::zero(), message_id: None } +} + +#[test] +fn trailing_set_topic_as_id_with_unique_topic_should_work() { + type AllowSubscriptions = AllowSubscriptionsFrom; + + // check the validity of XCM for the `AllowSubscriptions` barrier + let valid_xcm = Xcm::<()>(vec![SubscribeVersion { + query_id: 42, + max_response_weight: Weight::from_parts(5000, 5000), + }]); + assert_eq!( + AllowSubscriptions::should_execute( + &Location::parent(), + valid_xcm.clone().inner_mut(), + Weight::from_parts(10, 10), + &mut props(), + ), + Ok(()) + ); + + // simulate sending `valid_xcm` with the `WithUniqueTopic` router + let mut sent_xcm = sp_io::TestExternalities::default().execute_with(|| { + assert_ok!(send_xcm::>(Location::parent(), valid_xcm,)); + sent_xcm() + }); + assert_eq!(1, sent_xcm.len()); + + // `sent_xcm` should contain `SubscribeVersion` and have `SetTopic` added + let mut sent_xcm = sent_xcm.remove(0).1; + let _ = sent_xcm + .0 + .matcher() + .assert_remaining_insts(2) + .expect("two instructions") + .match_next_inst(|instr| match instr { + SubscribeVersion { .. } => Ok(()), + _ => Err(ProcessMessageError::BadFormat), + }) + .expect("expected instruction `SubscribeVersion`") + .match_next_inst(|instr| match instr { + SetTopic(..) => Ok(()), + _ => Err(ProcessMessageError::BadFormat), + }) + .expect("expected instruction `SetTopic`"); + + // `sent_xcm` contains `SetTopic` and is now invalid for `AllowSubscriptions` + assert_eq!( + AllowSubscriptions::should_execute( + &Location::parent(), + sent_xcm.clone().inner_mut(), + Weight::from_parts(10, 10), + &mut props(), + ), + Err(ProcessMessageError::BadFormat) + ); + + // let's apply `TrailingSetTopicAsId` before `AllowSubscriptions` + let mut props = props(); + assert!(props.message_id.is_none()); + + // should pass, and the `message_id` is set + assert_eq!( + TrailingSetTopicAsId::::should_execute( + &Location::parent(), + sent_xcm.clone().inner_mut(), + Weight::from_parts(10, 10), + &mut props, + ), + Ok(()) + ); + assert!(props.message_id.is_some()); +} diff --git a/polkadot/xcm/xcm-builder/src/tests/version_subscriptions.rs b/polkadot/xcm/xcm-builder/src/tests/version_subscriptions.rs index e29e3a546615b3aa725d30418e2e173fe67db920..01047fde989f9720f410c9067bf3bffd3cac9880 100644 --- a/polkadot/xcm/xcm-builder/src/tests/version_subscriptions.rs +++ b/polkadot/xcm/xcm-builder/src/tests/version_subscriptions.rs @@ -27,16 +27,32 @@ fn simple_version_subscriptions_should_work() { ]); let mut hash = fake_message_hash(&message); let weight_limit = Weight::from_parts(20, 20); - let r = XcmExecutor::::prepare_and_execute( - origin, - message, - &mut hash, - weight_limit, - Weight::zero(), + + // this case fails because the origin is not allowed + assert_eq!( + XcmExecutor::::prepare_and_execute( + origin, + message.clone(), + &mut hash, + weight_limit, + Weight::zero(), + ), + Outcome::Error { error: XcmError::Barrier } + ); + + // this case fails because the additional `SetAppendix` instruction is not allowed in the + // `AllowSubscriptionsFrom` + assert_eq!( + XcmExecutor::::prepare_and_execute( + Parent, + message, + &mut hash, + weight_limit, + Weight::zero(), + ), + Outcome::Error { error: XcmError::Barrier } ); - assert_eq!(r, Outcome::Error { error: XcmError::Barrier }); - let origin = Parachain(1000); let message = Xcm::(vec![SubscribeVersion { query_id: 42, max_response_weight: Weight::from_parts(5000, 5000), diff --git a/polkadot/xcm/xcm-builder/src/weight.rs b/polkadot/xcm/xcm-builder/src/weight.rs index 6026218f55316ea950ae5482bb72bfda86c8f511..6141b0142eed00fa8fb3a3e834b71fae51cffe86 100644 --- a/polkadot/xcm/xcm-builder/src/weight.rs +++ b/polkadot/xcm/xcm-builder/src/weight.rs @@ -16,7 +16,10 @@ use frame_support::{ dispatch::GetDispatchInfo, - traits::{tokens::currency::Currency as CurrencyT, Get, OnUnbalanced as OnUnbalancedT}, + traits::{ + fungible::{Balanced, Credit, Inspect}, + Get, OnUnbalanced as OnUnbalancedT, + }, weights::{ constants::{WEIGHT_PROOF_SIZE_PER_MB, WEIGHT_REF_TIME_PER_SECOND}, WeightToFee as WeightToFeeT, @@ -193,23 +196,23 @@ impl, R: TakeRevenue> Drop for FixedRateOfFungible /// Weight trader which uses the configured `WeightToFee` to set the right price for weight and then /// places any weight bought into the right account. pub struct UsingComponents< - WeightToFee: WeightToFeeT, + WeightToFee: WeightToFeeT>::Balance>, AssetIdValue: Get, AccountId, - Currency: CurrencyT, - OnUnbalanced: OnUnbalancedT, + Fungible: Balanced + Inspect, + OnUnbalanced: OnUnbalancedT>, >( Weight, - Currency::Balance, - PhantomData<(WeightToFee, AssetIdValue, AccountId, Currency, OnUnbalanced)>, + Fungible::Balance, + PhantomData<(WeightToFee, AssetIdValue, AccountId, Fungible, OnUnbalanced)>, ); impl< - WeightToFee: WeightToFeeT, + WeightToFee: WeightToFeeT>::Balance>, AssetIdValue: Get, AccountId, - Currency: CurrencyT, - OnUnbalanced: OnUnbalancedT, - > WeightTrader for UsingComponents + Fungible: Balanced + Inspect, + OnUnbalanced: OnUnbalancedT>, + > WeightTrader for UsingComponents { fn new() -> Self { Self(Weight::zero(), Zero::zero(), PhantomData) @@ -247,14 +250,14 @@ impl< } } impl< - WeightToFee: WeightToFeeT, + WeightToFee: WeightToFeeT>::Balance>, AssetId: Get, AccountId, - Currency: CurrencyT, - OnUnbalanced: OnUnbalancedT, - > Drop for UsingComponents + Fungible: Balanced + Inspect, + OnUnbalanced: OnUnbalancedT>, + > Drop for UsingComponents { fn drop(&mut self) { - OnUnbalanced::on_unbalanced(Currency::issue(self.1)); + OnUnbalanced::on_unbalanced(Fungible::issue(self.1)); } } diff --git a/polkadot/xcm/xcm-builder/tests/mock/mod.rs b/polkadot/xcm/xcm-builder/tests/mock/mod.rs index 34508d7622c5f8a3e703cefa833ea6dafd900e56..f3cf5ab264902df83a40948fa3ad28c40571cd3f 100644 --- a/polkadot/xcm/xcm-builder/tests/mock/mod.rs +++ b/polkadot/xcm/xcm-builder/tests/mock/mod.rs @@ -32,14 +32,12 @@ use xcm_executor::XcmExecutor; use staging_xcm_builder as xcm_builder; -#[allow(deprecated)] -use xcm_builder::CurrencyAdapter as XcmCurrencyAdapter; use xcm_builder::{ AccountId32Aliases, AllowTopLevelPaidExecutionFrom, AllowUnpaidExecutionFrom, ChildParachainAsNative, ChildParachainConvertsVia, ChildSystemParachainAsSuperuser, - FixedRateOfFungible, FixedWeightBounds, IsChildSystemParachain, IsConcrete, MintLocation, - RespectSuspension, SignedAccountId32AsNative, SignedToAccountId32, SovereignSignedViaLocation, - TakeWeightCredit, + FixedRateOfFungible, FixedWeightBounds, FungibleAdapter, IsChildSystemParachain, IsConcrete, + MintLocation, RespectSuspension, SignedAccountId32AsNative, SignedToAccountId32, + SovereignSignedViaLocation, TakeWeightCredit, }; pub type AccountId = AccountId32; @@ -78,7 +76,7 @@ parameter_types! { pub const BlockHashCount: u64 = 250; } -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Runtime { type RuntimeOrigin = RuntimeOrigin; type RuntimeCall = RuntimeCall; @@ -146,14 +144,8 @@ parameter_types! { pub type SovereignAccountOf = (ChildParachainConvertsVia, AccountId32Aliases); -#[allow(deprecated)] -pub type LocalCurrencyAdapter = XcmCurrencyAdapter< - Balances, - IsConcrete, - SovereignAccountOf, - AccountId, - CheckAccount, ->; +pub type LocalCurrencyAdapter = + FungibleAdapter, SovereignAccountOf, AccountId, CheckAccount>; pub type LocalAssetTransactor = (LocalCurrencyAdapter,); @@ -212,6 +204,9 @@ impl xcm_executor::Config for XcmConfig { type SafeCallFilter = Everything; type Aliasers = Nothing; type TransactionalProcessor = (); + type HrmpNewChannelOpenRequestHandler = (); + type HrmpChannelAcceptedHandler = (); + type HrmpChannelClosingHandler = (); } pub type LocalOriginToLocation = SignedToAccountId32; diff --git a/polkadot/xcm/xcm-builder/tests/scenarios.rs b/polkadot/xcm/xcm-builder/tests/scenarios.rs index db37f85acdbbac2edfaa278d33ac7654b0efcee5..ee1aeffbb4e71d5c42cb92376395961d4d95de81 100644 --- a/polkadot/xcm/xcm-builder/tests/scenarios.rs +++ b/polkadot/xcm/xcm-builder/tests/scenarios.rs @@ -132,7 +132,7 @@ fn report_holding_works() { assets: AllCounted(1).into(), beneficiary: OnlyChild.into(), // invalid destination }, - // is not triggered becasue the deposit fails + // is not triggered because the deposit fails ReportHolding { response_info: response_info.clone(), assets: All.into() }, ]); let mut hash = fake_message_hash(&message); diff --git a/polkadot/xcm/xcm-executor/Cargo.toml b/polkadot/xcm/xcm-executor/Cargo.toml index 7ce4a1cc171ded3eba5ab6711d9dc307a0a2cc05..aebc768bb906fd38d372d6d735a9e6bc0390ae9b 100644 --- a/polkadot/xcm/xcm-executor/Cargo.toml +++ b/polkadot/xcm/xcm-executor/Cargo.toml @@ -13,7 +13,7 @@ workspace = true impl-trait-for-tuples = "0.2.2" environmental = { version = "1.1.4", default-features = false } parity-scale-codec = { version = "3.6.1", default-features = false, features = ["derive"] } -scale-info = { version = "2.5.0", default-features = false, features = ["derive", "serde"] } +scale-info = { version = "2.11.1", default-features = false, features = ["derive", "serde"] } xcm = { package = "staging-xcm", path = "..", default-features = false } sp-std = { path = "../../../substrate/primitives/std", default-features = false } sp-io = { path = "../../../substrate/primitives/io", default-features = false } @@ -22,7 +22,7 @@ sp-core = { path = "../../../substrate/primitives/core", default-features = fals sp-runtime = { path = "../../../substrate/primitives/runtime", default-features = false } sp-weights = { path = "../../../substrate/primitives/weights", default-features = false } frame-support = { path = "../../../substrate/frame/support", default-features = false } -log = { version = "0.4.17", default-features = false } +log = { workspace = true } frame-benchmarking = { path = "../../../substrate/frame/benchmarking", default-features = false, optional = true } [features] diff --git a/polkadot/xcm/xcm-executor/integration-tests/Cargo.toml b/polkadot/xcm/xcm-executor/integration-tests/Cargo.toml index cafe12dc587f883a31ac3539aced38e8de29a89e..9c9c53f0ee1ba497f044477ec857afb6774a1f05 100644 --- a/polkadot/xcm/xcm-executor/integration-tests/Cargo.toml +++ b/polkadot/xcm/xcm-executor/integration-tests/Cargo.toml @@ -14,12 +14,13 @@ workspace = true codec = { package = "parity-scale-codec", version = "3.6.1" } frame-support = { path = "../../../../substrate/frame/support", default-features = false } frame-system = { path = "../../../../substrate/frame/system" } -futures = "0.3.21" +futures = "0.3.30" pallet-transaction-payment = { path = "../../../../substrate/frame/transaction-payment" } pallet-xcm = { path = "../../pallet-xcm" } polkadot-test-client = { path = "../../../node/test/client" } polkadot-test-runtime = { path = "../../../runtime/test-runtime" } polkadot-test-service = { path = "../../../node/test/service" } +polkadot-service = { path = "../../../node/service" } sp-consensus = { path = "../../../../substrate/primitives/consensus/common" } sp-keyring = { path = "../../../../substrate/primitives/keyring" } sp-runtime = { path = "../../../../substrate/primitives/runtime", default-features = false } @@ -27,6 +28,7 @@ sp-state-machine = { path = "../../../../substrate/primitives/state-machine" } xcm = { package = "staging-xcm", path = "../..", default-features = false } xcm-executor = { package = "staging-xcm-executor", path = ".." } sp-tracing = { path = "../../../../substrate/primitives/tracing" } +sp-core = { path = "../../../../substrate/primitives/core" } [features] default = ["std"] diff --git a/polkadot/xcm/xcm-executor/integration-tests/src/lib.rs b/polkadot/xcm/xcm-executor/integration-tests/src/lib.rs index 79d6cb1c411b12da2a9f6b81a01b93a44c97ebe9..1d1ee40d092c6d251b200439971986b9e0d6abd7 100644 --- a/polkadot/xcm/xcm-executor/integration-tests/src/lib.rs +++ b/polkadot/xcm/xcm-executor/integration-tests/src/lib.rs @@ -19,12 +19,14 @@ use codec::Encode; use frame_support::{dispatch::GetDispatchInfo, weights::Weight}; +use polkadot_service::chain_spec::get_account_id_from_seed; use polkadot_test_client::{ BlockBuilderExt, ClientBlockImportExt, DefaultTestClientBuilderExt, InitPolkadotBlockBuilder, TestClientBuilder, TestClientBuilderExt, }; use polkadot_test_runtime::{pallet_test_notifier, xcm_config::XcmConfig}; use polkadot_test_service::construct_extrinsic; +use sp_core::sr25519; use sp_runtime::traits::Block; use sp_state_machine::InspectState; use xcm::{latest::prelude::*, VersionedResponse, VersionedXcm}; @@ -323,3 +325,84 @@ fn query_response_elicits_handler() { ))); }); } + +/// Simulates a cross-chain message from Parachain to Parachain through Relay Chain +/// that deposits assets into the reserve of the destination. +/// Regression test for `DepositReserveAsset` changes in +/// +#[test] +fn deposit_reserve_asset_works_for_any_xcm_sender() { + sp_tracing::try_init_simple(); + let mut client = TestClientBuilder::new().build(); + + // Init values for the simulated origin Parachain + let amount_to_send: u128 = 1_000_000_000_000; + let assets: Assets = (Parent, amount_to_send).into(); + let fee_asset_item = 0; + let max_assets = assets.len() as u32; + let fees = assets.get(fee_asset_item as usize).unwrap().clone(); + let weight_limit = Unlimited; + let reserve = Location::parent(); + let dest = Location::new(1, [Parachain(2000)]); + let beneficiary_id = get_account_id_from_seed::("Alice"); + let beneficiary = Location::new(0, [AccountId32 { network: None, id: beneficiary_id.into() }]); + + // spends up to half of fees for execution on reserve and other half for execution on + // destination + let fee1 = amount_to_send.saturating_div(2); + let fee2 = amount_to_send.saturating_sub(fee1); + let fees_half_1 = Asset::from((fees.id.clone(), Fungible(fee1))); + let fees_half_2 = Asset::from((fees.id.clone(), Fungible(fee2))); + + let reserve_context = ::UniversalLocation::get(); + // identifies fee item as seen by `reserve` - to be used at reserve chain + let reserve_fees = fees_half_1.reanchored(&reserve, &reserve_context).unwrap(); + // identifies fee item as seen by `dest` - to be used at destination chain + let dest_fees = fees_half_2.reanchored(&dest, &reserve_context).unwrap(); + // identifies assets as seen by `reserve` - to be used at reserve chain + let assets_reanchored = assets.reanchored(&reserve, &reserve_context).unwrap(); + // identifies `dest` as seen by `reserve` + let dest = dest.reanchored(&reserve, &reserve_context).unwrap(); + // xcm to be executed at dest + let xcm_on_dest = Xcm(vec![ + BuyExecution { fees: dest_fees, weight_limit: weight_limit.clone() }, + DepositAsset { assets: Wild(AllCounted(max_assets)), beneficiary }, + ]); + // xcm to be executed at reserve + let msg = Xcm(vec![ + WithdrawAsset(assets_reanchored), + ClearOrigin, + BuyExecution { fees: reserve_fees, weight_limit }, + DepositReserveAsset { assets: Wild(AllCounted(max_assets)), dest, xcm: xcm_on_dest }, + ]); + + let mut block_builder = client.init_polkadot_block_builder(); + + // Simulate execution of an incoming XCM message at the reserve chain + let execute = construct_extrinsic( + &client, + polkadot_test_runtime::RuntimeCall::Xcm(pallet_xcm::Call::execute { + message: Box::new(VersionedXcm::from(msg)), + max_weight: Weight::from_parts(1_000_000_000, 1024 * 1024), + }), + sp_keyring::Sr25519Keyring::Alice, + 0, + ); + + block_builder.push_polkadot_extrinsic(execute).expect("pushes extrinsic"); + + let block = block_builder.build().expect("Finalizes the block").block; + let block_hash = block.hash(); + + futures::executor::block_on(client.import(sp_consensus::BlockOrigin::Own, block)) + .expect("imports the block"); + + client.state_at(block_hash).expect("state should exist").inspect_state(|| { + assert!(polkadot_test_runtime::System::events().iter().any(|r| matches!( + r.event, + polkadot_test_runtime::RuntimeEvent::Xcm(pallet_xcm::Event::Attempted { + outcome: Outcome::Complete { .. } + }), + ))); + }); +} diff --git a/polkadot/xcm/xcm-executor/src/config.rs b/polkadot/xcm/xcm-executor/src/config.rs index ebe532a42fd396c64d64590bfb18e6778995bd4a..b296d32ca2adb6761f815aa74397211e3bc17d5f 100644 --- a/polkadot/xcm/xcm-executor/src/config.rs +++ b/polkadot/xcm/xcm-executor/src/config.rs @@ -16,7 +16,8 @@ use crate::traits::{ AssetExchange, AssetLock, CallDispatcher, ClaimAssets, ConvertOrigin, DropAssets, ExportXcm, - FeeManager, OnResponse, ProcessTransaction, ShouldExecute, TransactAsset, + FeeManager, HandleHrmpChannelAccepted, HandleHrmpChannelClosing, + HandleHrmpNewChannelOpenRequest, OnResponse, ProcessTransaction, ShouldExecute, TransactAsset, VersionChangeNotifier, WeightBounds, WeightTrader, }; use frame_support::{ @@ -114,4 +115,11 @@ pub trait Config { /// Transactional processor for XCM instructions. type TransactionalProcessor: ProcessTransaction; + + /// Allows optional logic execution for the `HrmpNewChannelOpenRequest` XCM notification. + type HrmpNewChannelOpenRequestHandler: HandleHrmpNewChannelOpenRequest; + /// Allows optional logic execution for the `HrmpChannelAccepted` XCM notification. + type HrmpChannelAcceptedHandler: HandleHrmpChannelAccepted; + /// Allows optional logic execution for the `HrmpChannelClosing` XCM notification. + type HrmpChannelClosingHandler: HandleHrmpChannelClosing; } diff --git a/polkadot/xcm/xcm-executor/src/lib.rs b/polkadot/xcm/xcm-executor/src/lib.rs index b26779f3ae9da206d76823027dc193dc771cc215..81b81fe6a17154c74e03ebbddf8bfd81e4f7181c 100644 --- a/polkadot/xcm/xcm-executor/src/lib.rs +++ b/polkadot/xcm/xcm-executor/src/lib.rs @@ -31,7 +31,8 @@ use xcm::latest::prelude::*; pub mod traits; use traits::{ validate_export, AssetExchange, AssetLock, CallDispatcher, ClaimAssets, ConvertOrigin, - DropAssets, Enact, ExportXcm, FeeManager, FeeReason, OnResponse, ProcessTransaction, + DropAssets, Enact, ExportXcm, FeeManager, FeeReason, HandleHrmpChannelAccepted, + HandleHrmpChannelClosing, HandleHrmpNewChannelOpenRequest, OnResponse, ProcessTransaction, Properties, ShouldExecute, TransactAsset, VersionChangeNotifier, WeightBounds, WeightTrader, XcmAssetTransfers, }; @@ -826,9 +827,9 @@ impl XcmExecutor { // be weighed let to_weigh = self.holding.saturating_take(assets.clone()); self.holding.subsume_assets(to_weigh.clone()); - + let to_weigh_reanchored = Self::reanchored(to_weigh, &dest, None); let mut message_to_weigh = - vec![ReserveAssetDeposited(to_weigh.into()), ClearOrigin]; + vec![ReserveAssetDeposited(to_weigh_reanchored), ClearOrigin]; message_to_weigh.extend(xcm.0.clone().into_iter()); let (_, fee) = validate_send::(dest.clone(), Xcm(message_to_weigh))?; @@ -1212,9 +1213,21 @@ impl XcmExecutor { ); Ok(()) }, - HrmpNewChannelOpenRequest { .. } => Err(XcmError::Unimplemented), - HrmpChannelAccepted { .. } => Err(XcmError::Unimplemented), - HrmpChannelClosing { .. } => Err(XcmError::Unimplemented), + HrmpNewChannelOpenRequest { sender, max_message_size, max_capacity } => + Config::TransactionalProcessor::process(|| { + Config::HrmpNewChannelOpenRequestHandler::handle( + sender, + max_message_size, + max_capacity, + ) + }), + HrmpChannelAccepted { recipient } => Config::TransactionalProcessor::process(|| { + Config::HrmpChannelAcceptedHandler::handle(recipient) + }), + HrmpChannelClosing { initiator, sender, recipient } => + Config::TransactionalProcessor::process(|| { + Config::HrmpChannelClosingHandler::handle(initiator, sender, recipient) + }), } } } diff --git a/polkadot/xcm/xcm-executor/src/traits/hrmp.rs b/polkadot/xcm/xcm-executor/src/traits/hrmp.rs new file mode 100644 index 0000000000000000000000000000000000000000..b6bbb9316d7537559e895b379b855bf10f0d303d --- /dev/null +++ b/polkadot/xcm/xcm-executor/src/traits/hrmp.rs @@ -0,0 +1,56 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +use xcm::latest::Result as XcmResult; + +/// Executes logic when a `HrmpNewChannelOpenRequest` XCM notification is received. +pub trait HandleHrmpNewChannelOpenRequest { + fn handle(sender: u32, max_message_size: u32, max_capacity: u32) -> XcmResult; +} + +/// Executes optional logic when a `HrmpChannelAccepted` XCM notification is received. +pub trait HandleHrmpChannelAccepted { + fn handle(recipient: u32) -> XcmResult; +} + +/// Executes optional logic when a `HrmpChannelClosing` XCM notification is received. +pub trait HandleHrmpChannelClosing { + fn handle(initiator: u32, sender: u32, recipient: u32) -> XcmResult; +} + +#[impl_trait_for_tuples::impl_for_tuples(30)] +impl HandleHrmpNewChannelOpenRequest for Tuple { + fn handle(sender: u32, max_message_size: u32, max_capacity: u32) -> XcmResult { + for_tuples!( #( Tuple::handle(sender, max_message_size, max_capacity)?; )* ); + Ok(()) + } +} + +#[impl_trait_for_tuples::impl_for_tuples(30)] +impl HandleHrmpChannelAccepted for Tuple { + fn handle(recipient: u32) -> XcmResult { + for_tuples!( #( Tuple::handle(recipient)?; )* ); + Ok(()) + } +} + +#[impl_trait_for_tuples::impl_for_tuples(30)] +impl HandleHrmpChannelClosing for Tuple { + fn handle(initiator: u32, sender: u32, recipient: u32) -> XcmResult { + for_tuples!( #( Tuple::handle(initiator, sender, recipient)?; )* ); + Ok(()) + } +} diff --git a/polkadot/xcm/xcm-executor/src/traits/mod.rs b/polkadot/xcm/xcm-executor/src/traits/mod.rs index b445e84d39120bd7970dbfff599a061f863ab2d9..aa3f0d26e3025781eacefcf4b6cfdfe140cb39a5 100644 --- a/polkadot/xcm/xcm-executor/src/traits/mod.rs +++ b/polkadot/xcm/xcm-executor/src/traits/mod.rs @@ -45,6 +45,10 @@ mod should_execute; pub use should_execute::{CheckSuspension, Properties, ShouldExecute}; mod transact_asset; pub use transact_asset::TransactAsset; +mod hrmp; +pub use hrmp::{ + HandleHrmpChannelAccepted, HandleHrmpChannelClosing, HandleHrmpNewChannelOpenRequest, +}; mod weight; #[deprecated = "Use `sp_runtime::traits::` instead"] pub use sp_runtime::traits::{Identity, TryConvertInto as JustTry}; diff --git a/polkadot/xcm/xcm-executor/src/traits/on_response.rs b/polkadot/xcm/xcm-executor/src/traits/on_response.rs index 952bd2d0040aca89f21d7a1eabbb6667ccb8a68c..1049bacdca5f9eee964cf810835c69b7ba1ba1ea 100644 --- a/polkadot/xcm/xcm-executor/src/traits/on_response.rs +++ b/polkadot/xcm/xcm-executor/src/traits/on_response.rs @@ -16,11 +16,8 @@ use crate::{Junctions::Here, Xcm}; use core::result; -use frame_support::{ - pallet_prelude::{Get, TypeInfo}, - parameter_types, -}; -use parity_scale_codec::{Decode, Encode, FullCodec, MaxEncodedLen}; +use frame_support::{pallet_prelude::Get, parameter_types}; +use parity_scale_codec::{Decode, Encode}; use sp_arithmetic::traits::Zero; use sp_std::fmt::Debug; use xcm::latest::{ @@ -115,15 +112,6 @@ pub enum QueryResponseStatus { /// Provides methods to expect responses from XCMs and query their status. pub trait QueryHandler { - type QueryId: From - + FullCodec - + MaxEncodedLen - + TypeInfo - + Clone - + Eq - + PartialEq - + Debug - + Copy; type BlockNumber: Zero + Encode; type Error; type UniversalLocation: Get; @@ -151,14 +139,14 @@ pub trait QueryHandler { message: &mut Xcm<()>, responder: impl Into, timeout: Self::BlockNumber, - ) -> result::Result; + ) -> result::Result; /// Attempt to remove and return the response of query with ID `query_id`. - fn take_response(id: Self::QueryId) -> QueryResponseStatus; + fn take_response(id: QueryId) -> QueryResponseStatus; /// Makes sure to expect a response with the given id. #[cfg(feature = "runtime-benchmarks")] - fn expect_response(id: Self::QueryId, response: Response); + fn expect_response(id: QueryId, response: Response); } parameter_types! { @@ -168,17 +156,16 @@ parameter_types! { impl QueryHandler for () { type BlockNumber = u64; type Error = (); - type QueryId = u64; type UniversalLocation = UniversalLocation; - fn take_response(_query_id: Self::QueryId) -> QueryResponseStatus { + fn take_response(_query_id: QueryId) -> QueryResponseStatus { QueryResponseStatus::NotFound } fn new_query( _responder: impl Into, _timeout: Self::BlockNumber, _match_querier: impl Into, - ) -> Self::QueryId { + ) -> QueryId { 0u64 } @@ -186,10 +173,10 @@ impl QueryHandler for () { _message: &mut Xcm<()>, _responder: impl Into, _timeout: Self::BlockNumber, - ) -> Result { + ) -> Result { Err(()) } #[cfg(feature = "runtime-benchmarks")] - fn expect_response(_id: Self::QueryId, _response: crate::Response) {} + fn expect_response(_id: QueryId, _response: crate::Response) {} } diff --git a/polkadot/xcm/xcm-executor/src/traits/should_execute.rs b/polkadot/xcm/xcm-executor/src/traits/should_execute.rs index 449e82b5a6e2c3ecaf43b35608222b88ae6c8bcc..e76d56bfe6164d16487f65ed79c1a1a58a9949fe 100644 --- a/polkadot/xcm/xcm-executor/src/traits/should_execute.rs +++ b/polkadot/xcm/xcm-executor/src/traits/should_execute.rs @@ -18,7 +18,7 @@ use frame_support::traits::ProcessMessageError; use sp_std::result::Result; use xcm::latest::{Instruction, Location, Weight, XcmHash}; -/// Properyies of an XCM message and its imminent execution. +/// Properties of an XCM message and its imminent execution. #[derive(Clone, Eq, PartialEq, Debug)] pub struct Properties { /// The amount of weight that the system has determined this @@ -33,9 +33,9 @@ pub struct Properties { /// Trait to determine whether the execution engine should actually execute a given XCM. /// /// Can be amalgamated into a tuple to have multiple trials. If any of the tuple elements returns -/// `Ok()`, the execution stops. Else, `Err(_)` is returned if all elements reject the message. +/// `Ok(())`, the execution stops. Else, `Err(_)` is returned if all elements reject the message. pub trait ShouldExecute { - /// Returns `true` if the given `message` may be executed. + /// Returns `Ok(())` if the given `message` may be executed. /// /// - `origin`: The origin (sender) of the message. /// - `instructions`: The message itself. diff --git a/polkadot/xcm/xcm-fee-payment-runtime-api/Cargo.toml b/polkadot/xcm/xcm-fee-payment-runtime-api/Cargo.toml new file mode 100644 index 0000000000000000000000000000000000000000..30c7c0bac14f7936d57ec5c86f94bc24ba17013f --- /dev/null +++ b/polkadot/xcm/xcm-fee-payment-runtime-api/Cargo.toml @@ -0,0 +1,40 @@ +[package] +name = "xcm-fee-payment-runtime-api" +version = "0.1.0" +authors.workspace = true +edition.workspace = true +license = "Apache-2.0" +repository.workspace = true +description = "XCM fee payment runtime API" + +[package.metadata.docs.rs] +targets = ["x86_64-unknown-linux-gnu"] + +[dependencies] +codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = [ + "derive", +] } + +sp-api = { path = "../../../substrate/primitives/api", default-features = false } +scale-info = { version = "2.11.1", default-features = false, features = [ + "derive", + "serde", +] } +sp-std = { path = "../../../substrate/primitives/std", default-features = false } +sp-runtime = { path = "../../../substrate/primitives/runtime", default-features = false } +sp-weights = { path = "../../../substrate/primitives/weights", default-features = false } +xcm = { package = "staging-xcm", path = "../", default-features = false } +frame-support = { path = "../../../substrate/frame/support", default-features = false } + +[features] +default = ["std"] +std = [ + "codec/std", + "frame-support/std", + "scale-info/std", + "sp-api/std", + "sp-runtime/std", + "sp-std/std", + "sp-weights/std", + "xcm/std", +] diff --git a/polkadot/xcm/xcm-fee-payment-runtime-api/src/lib.rs b/polkadot/xcm/xcm-fee-payment-runtime-api/src/lib.rs new file mode 100644 index 0000000000000000000000000000000000000000..20bf9236f1fbbb46ca50a1b42d6dc4e519a5ae1a --- /dev/null +++ b/polkadot/xcm/xcm-fee-payment-runtime-api/src/lib.rs @@ -0,0 +1,99 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +//! Runtime API definition for xcm transaction payment. + +#![cfg_attr(not(feature = "std"), no_std)] + +use codec::{Decode, Encode}; +use frame_support::pallet_prelude::TypeInfo; +use sp_std::vec::Vec; +use sp_weights::Weight; +use xcm::{Version, VersionedAssetId, VersionedAssets, VersionedLocation, VersionedXcm}; + +sp_api::decl_runtime_apis! { + /// A trait of XCM payment API. + /// + /// API provides functionality for obtaining: + /// + /// * the weight required to execute an XCM message, + /// * a list of acceptable `AssetId`s for message execution payment, + /// * the cost of the weight in the specified acceptable `AssetId`. + /// * the fees for an XCM message delivery. + /// + /// To determine the execution weight of the calls required for + /// [`xcm::latest::Instruction::Transact`] instruction, `TransactionPaymentCallApi` can be used. + pub trait XcmPaymentApi { + /// Returns a list of acceptable payment assets. + /// + /// # Arguments + /// + /// * `xcm_version`: Version. + fn query_acceptable_payment_assets(xcm_version: Version) -> Result, Error>; + + /// Returns a weight needed to execute a XCM. + /// + /// # Arguments + /// + /// * `message`: `VersionedXcm`. + fn query_xcm_weight(message: VersionedXcm<()>) -> Result; + + /// Converts a weight into a fee for the specified `AssetId`. + /// + /// # Arguments + /// + /// * `weight`: convertible `Weight`. + /// * `asset`: `VersionedAssetId`. + fn query_weight_to_asset_fee(weight: Weight, asset: VersionedAssetId) -> Result; + + /// Get delivery fees for sending a specific `message` to a `destination`. + /// These always come in a specific asset, defined by the chain. + /// + /// # Arguments + /// * `message`: The message that'll be sent, necessary because most delivery fees are based on the + /// size of the message. + /// * `destination`: The destination to send the message to. Different destinations may use + /// different senders that charge different fees. + fn query_delivery_fees(destination: VersionedLocation, message: VersionedXcm<()>) -> Result; + } +} + +#[derive(Copy, Clone, Encode, Decode, Eq, PartialEq, Debug, TypeInfo)] +pub enum Error { + /// An API part is unsupported. + #[codec(index = 0)] + Unimplemented, + + /// Converting a versioned data structure from one version to another failed. + #[codec(index = 1)] + VersionedConversionFailed, + + /// XCM message weight calculation failed. + #[codec(index = 2)] + WeightNotComputable, + + /// XCM version not able to be handled. + #[codec(index = 3)] + UnhandledXcmVersion, + + /// The given asset is not handled as a fee asset. + #[codec(index = 4)] + AssetNotFound, + + /// Destination is known to be unroutable. + #[codec(index = 5)] + Unroutable, +} diff --git a/polkadot/xcm/xcm-simulator/example/Cargo.toml b/polkadot/xcm/xcm-simulator/example/Cargo.toml index 9cb5b6b7eeb92e7cf6095d2e86ed9b05185165c4..0e13a10a14106c92d56d288d210b57f3888068b2 100644 --- a/polkadot/xcm/xcm-simulator/example/Cargo.toml +++ b/polkadot/xcm/xcm-simulator/example/Cargo.toml @@ -11,8 +11,8 @@ workspace = true [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1" } -scale-info = { version = "2.10.0", features = ["derive"] } -log = { version = "0.4.14", default-features = false } +scale-info = { version = "2.11.1", features = ["derive"] } +log = { workspace = true } frame-system = { path = "../../../../substrate/frame/system" } frame-support = { path = "../../../../substrate/frame/support" } diff --git a/polkadot/xcm/xcm-simulator/example/src/lib.rs b/polkadot/xcm/xcm-simulator/example/src/lib.rs index d134957fbc1c58a2fa59cfb73860d93d7ba74d5b..56e204bf5718164385e3da924f75ae98c2fcb075 100644 --- a/polkadot/xcm/xcm-simulator/example/src/lib.rs +++ b/polkadot/xcm/xcm-simulator/example/src/lib.rs @@ -250,12 +250,13 @@ mod tests { let withdraw_amount = 123; Relay::execute_with(|| { - assert_ok!(RelayChainPalletXcm::reserve_transfer_assets( + assert_ok!(RelayChainPalletXcm::limited_reserve_transfer_assets( relay_chain::RuntimeOrigin::signed(ALICE), Box::new(Parachain(1).into()), Box::new(AccountId32 { network: None, id: ALICE.into() }.into()), Box::new((Here, withdraw_amount).into()), 0, + Unlimited, )); assert_eq!( relay_chain::Balances::free_balance(&child_account_id(1)), @@ -424,7 +425,7 @@ mod tests { /// Scenario: /// The relay-chain transfers an NFT into a parachain's sovereign account, who then mints a - /// trustless-backed-derivated locally. + /// trustless-backed-derived locally. /// /// Asserts that the parachain accounts are updated as expected. #[test] @@ -479,7 +480,7 @@ mod tests { assert_ok!(ParachainPalletXcm::send_xcm(alice, Parent, message)); }); ParaA::execute_with(|| { - log::debug!(target: "xcm-exceutor", "Hello"); + log::debug!(target: "xcm-executor", "Hello"); assert_eq!( parachain::ForeignUniques::owner((Parent, GeneralIndex(2)).into(), 69u32.into()), Some(ALICE), diff --git a/polkadot/xcm/xcm-simulator/example/src/parachain.rs b/polkadot/xcm/xcm-simulator/example/src/parachain.rs index 64333b4d5815018381f86eca10199c0d90feb6e1..86401d756af3b7d86c34e394ae89c677684c0fb8 100644 --- a/polkadot/xcm/xcm-simulator/example/src/parachain.rs +++ b/polkadot/xcm/xcm-simulator/example/src/parachain.rs @@ -63,7 +63,7 @@ parameter_types! { pub const BlockHashCount: u64 = 250; } -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Runtime { type RuntimeOrigin = RuntimeOrigin; type RuntimeCall = RuntimeCall; @@ -251,6 +251,9 @@ impl Config for XcmConfig { type SafeCallFilter = Everything; type Aliasers = Nothing; type TransactionalProcessor = FrameTransactionalProcessor; + type HrmpNewChannelOpenRequestHandler = (); + type HrmpChannelAcceptedHandler = (); + type HrmpChannelClosingHandler = (); } #[frame_support::pallet] diff --git a/polkadot/xcm/xcm-simulator/example/src/relay_chain.rs b/polkadot/xcm/xcm-simulator/example/src/relay_chain.rs index 54c5657c00d7f6c38ade3aadaf38056504abcc76..286d0038e187a45504e9b1092fed4b152ffe9d3d 100644 --- a/polkadot/xcm/xcm-simulator/example/src/relay_chain.rs +++ b/polkadot/xcm/xcm-simulator/example/src/relay_chain.rs @@ -49,7 +49,7 @@ parameter_types! { pub const BlockHashCount: u64 = 250; } -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Runtime { type RuntimeOrigin = RuntimeOrigin; type RuntimeCall = RuntimeCall; @@ -198,6 +198,9 @@ impl Config for XcmConfig { type SafeCallFilter = Everything; type Aliasers = Nothing; type TransactionalProcessor = FrameTransactionalProcessor; + type HrmpNewChannelOpenRequestHandler = (); + type HrmpChannelAcceptedHandler = (); + type HrmpChannelClosingHandler = (); } pub type LocalOriginToLocation = SignedToAccountId32; @@ -272,6 +275,7 @@ impl pallet_message_queue::Config for Runtime { type HeapSize = MessageQueueHeapSize; type MaxStale = MessageQueueMaxStale; type ServiceWeight = MessageQueueServiceWeight; + type IdleMaxServiceWeight = (); type MessageProcessor = MessageProcessor; type QueueChangeHandler = (); type QueuePausedQuery = (); diff --git a/polkadot/xcm/xcm-simulator/fuzzer/Cargo.toml b/polkadot/xcm/xcm-simulator/fuzzer/Cargo.toml index 13b6e7b8652fbbb178071f429b286b6c5b8d64ac..ca794a07bfb0c73df251d49c2e08a970ea5cf994 100644 --- a/polkadot/xcm/xcm-simulator/fuzzer/Cargo.toml +++ b/polkadot/xcm/xcm-simulator/fuzzer/Cargo.toml @@ -14,10 +14,12 @@ workspace = true codec = { package = "parity-scale-codec", version = "3.6.1" } honggfuzz = "0.5.55" arbitrary = "1.3.2" -scale-info = { version = "2.10.0", features = ["derive"] } +scale-info = { version = "2.11.1", features = ["derive"] } frame-system = { path = "../../../../substrate/frame/system" } frame-support = { path = "../../../../substrate/frame/support" } +frame-executive = { path = "../../../../substrate/frame/executive" } +frame-try-runtime = { path = "../../../../substrate/frame/try-runtime" } pallet-balances = { path = "../../../../substrate/frame/balances" } pallet-message-queue = { path = "../../../../substrate/frame/message-queue" } sp-std = { path = "../../../../substrate/primitives/std" } @@ -35,6 +37,17 @@ polkadot-runtime-parachains = { path = "../../../runtime/parachains" } polkadot-parachain-primitives = { path = "../../../parachain" } [features] +try-runtime = [ + "frame-executive/try-runtime", + "frame-support/try-runtime", + "frame-system/try-runtime", + "frame-try-runtime/try-runtime", + "pallet-balances/try-runtime", + "pallet-message-queue/try-runtime", + "pallet-xcm/try-runtime", + "polkadot-runtime-parachains/try-runtime", + "sp-runtime/try-runtime", +] runtime-benchmarks = [ "frame-support/runtime-benchmarks", "frame-system/runtime-benchmarks", diff --git a/polkadot/xcm/xcm-simulator/fuzzer/README.md b/polkadot/xcm/xcm-simulator/fuzzer/README.md index 0b3fdd8ec776d5e78d37aa5b57e6c0762af21320..9c15ee881c1b6f5f9a1c30215a16e74abdda2b62 100644 --- a/polkadot/xcm/xcm-simulator/fuzzer/README.md +++ b/polkadot/xcm/xcm-simulator/fuzzer/README.md @@ -14,7 +14,7 @@ cargo install honggfuzz In this directory, run this command: ``` -cargo hfuzz run xcm-fuzzer +HFUZZ_BUILD_ARGS="--features=try-runtime" cargo hfuzz run xcm-fuzzer ``` ## Run a single input @@ -22,7 +22,7 @@ cargo hfuzz run xcm-fuzzer In this directory, run this command: ``` -cargo hfuzz run-debug xcm-fuzzer hfuzz_workspace/xcm-fuzzer/fuzzer_input_file +cargo run --features=try-runtime -- hfuzz_workspace/xcm-fuzzer/fuzzer_input_file ``` ## Generate coverage @@ -31,7 +31,7 @@ In this directory, run these four commands: ``` RUSTFLAGS="-Zprofile -Ccodegen-units=1 -Copt-level=0 -Clink-dead-code -Coverflow-checks=off -Zpanic_abort_tests -Cpanic=abort" \ -CARGO_INCREMENTAL=0 SKIP_WASM_BUILD=1 CARGO_HOME=./cargo cargo build +CARGO_INCREMENTAL=0 SKIP_WASM_BUILD=1 CARGO_HOME=./cargo cargo build --features=try-runtime ../../../target/debug/xcm-fuzzer hfuzz_workspace/xcm-fuzzer/input/ zip -0 ccov.zip `find ../../../target/ \( -name "*.gc*" -o -name "test-*.gc*" \) -print` grcov ccov.zip -s ../../../ -t html --llvm --branch --ignore-not-existing -o ./coverage diff --git a/polkadot/xcm/xcm-simulator/fuzzer/src/fuzz.rs b/polkadot/xcm/xcm-simulator/fuzzer/src/fuzz.rs index 7026d5467c8b9049eaa86f94e9cd927321d10d68..adf6cacd278b9f25a02f9199fbdabc0af3434414 100644 --- a/polkadot/xcm/xcm-simulator/fuzzer/src/fuzz.rs +++ b/polkadot/xcm/xcm-simulator/fuzzer/src/fuzz.rs @@ -23,7 +23,9 @@ use polkadot_parachain_primitives::primitives::Id as ParaId; use sp_runtime::{traits::AccountIdConversion, BuildStorage}; use xcm_simulator::{decl_test_network, decl_test_parachain, decl_test_relay_chain, TestExt}; -use frame_support::assert_ok; +#[cfg(feature = "try-runtime")] +use frame_support::traits::{TryState, TryStateSelect::All}; +use frame_support::{assert_ok, traits::IntegrityTest}; use xcm::{latest::prelude::*, MAX_XCM_DECODE_DEPTH}; use arbitrary::{Arbitrary, Error, Unstructured}; @@ -98,7 +100,7 @@ impl<'a> Arbitrary<'a> for XcmMessage { if let Ok(message) = DecodeLimit::decode_with_depth_limit(MAX_XCM_DECODE_DEPTH, &mut encoded_message) { - return Ok(XcmMessage { source, destination, message }) + return Ok(XcmMessage { source, destination, message }); } Err(Error::IncorrectFormat) } @@ -148,6 +150,21 @@ pub fn relay_ext() -> sp_io::TestExternalities { pub type RelayChainPalletXcm = pallet_xcm::Pallet; pub type ParachainPalletXcm = pallet_xcm::Pallet; +// We check XCM messages recursively for blocklisted messages +fn recursively_matches_blocklisted_messages(message: &Instruction<()>) -> bool { + match message { + DepositReserveAsset { xcm, .. } | + ExportMessage { xcm, .. } | + InitiateReserveWithdraw { xcm, .. } | + InitiateTeleport { xcm, .. } | + TransferReserveAsset { xcm, .. } | + SetErrorHandler(xcm) | + SetAppendix(xcm) => xcm.iter().any(recursively_matches_blocklisted_messages), + // The blocklisted message is the Transact instruction. + m => matches!(m, Transact { .. }), + } +} + fn run_input(xcm_messages: [XcmMessage; 5]) { MockNet::reset(); @@ -155,6 +172,11 @@ fn run_input(xcm_messages: [XcmMessage; 5]) { println!(); for xcm_message in xcm_messages { + if xcm_message.message.iter().any(recursively_matches_blocklisted_messages) { + println!(" skipping message\n"); + continue; + } + if xcm_message.source % 4 == 0 { // We get the destination for the message let parachain_id = (xcm_message.destination % 3) + 1; @@ -197,8 +219,22 @@ fn run_input(xcm_messages: [XcmMessage; 5]) { } #[cfg(not(fuzzing))] println!(); + // We run integrity tests and try_runtime invariants + [ParaA::execute_with, ParaB::execute_with, ParaC::execute_with].iter().for_each( + |execute_with| { + execute_with(|| { + #[cfg(feature = "try-runtime")] + parachain::AllPalletsWithSystem::try_state(Default::default(), All).unwrap(); + parachain::AllPalletsWithSystem::integrity_test(); + }); + }, + ); + Relay::execute_with(|| { + #[cfg(feature = "try-runtime")] + relay_chain::AllPalletsWithSystem::try_state(Default::default(), All).unwrap(); + relay_chain::AllPalletsWithSystem::integrity_test(); + }); } - Relay::execute_with(|| {}); } fn main() { diff --git a/polkadot/xcm/xcm-simulator/fuzzer/src/parachain.rs b/polkadot/xcm/xcm-simulator/fuzzer/src/parachain.rs index d8327c9b401d0ba67ec6cccb12e16ea70ee1ba3e..cadfc1e7200c075433ebf295982cc49f8a0d06b1 100644 --- a/polkadot/xcm/xcm-simulator/fuzzer/src/parachain.rs +++ b/polkadot/xcm/xcm-simulator/fuzzer/src/parachain.rs @@ -24,10 +24,11 @@ use frame_support::{ }; use frame_system::EnsureRoot; -use sp_core::{ConstU32, H256}; +use sp_core::ConstU32; use sp_runtime::{ - traits::{Hash, IdentityLookup}, - AccountId32, + generic, + traits::{AccountIdLookup, BlakeTwo256, Hash, IdentifyAccount, Verify}, + MultiAddress, MultiSignature, }; use sp_std::prelude::*; @@ -37,48 +38,37 @@ use polkadot_parachain_primitives::primitives::{ DmpMessageHandler, Id as ParaId, Sibling, XcmpMessageFormat, XcmpMessageHandler, }; use xcm::{latest::prelude::*, VersionedXcm}; -#[allow(deprecated)] -use xcm_builder::CurrencyAdapter as XcmCurrencyAdapter; use xcm_builder::{ AccountId32Aliases, AllowUnpaidExecutionFrom, EnsureXcmOrigin, FixedRateOfFungible, - FixedWeightBounds, FrameTransactionalProcessor, IsConcrete, NativeAsset, ParentIsPreset, - SiblingParachainConvertsVia, SignedAccountId32AsNative, SignedToAccountId32, + FixedWeightBounds, FrameTransactionalProcessor, FungibleAdapter, IsConcrete, NativeAsset, + ParentIsPreset, SiblingParachainConvertsVia, SignedAccountId32AsNative, SignedToAccountId32, SovereignSignedViaLocation, }; use xcm_executor::{Config, XcmExecutor}; -pub type AccountId = AccountId32; +pub type SignedExtra = (frame_system::CheckNonZeroSender,); + +pub type BlockNumber = u64; +pub type Address = MultiAddress; +pub type Header = generic::Header; +pub type UncheckedExtrinsic = + generic::UncheckedExtrinsic; +pub type Block = generic::Block; + +pub type Signature = MultiSignature; +pub type AccountId = <::Signer as IdentifyAccount>::AccountId; pub type Balance = u128; parameter_types! { - pub const BlockHashCount: u64 = 250; + pub const BlockHashCount: u32 = 250; } -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Runtime { - type RuntimeOrigin = RuntimeOrigin; - type RuntimeCall = RuntimeCall; - type Nonce = u64; - type Hash = H256; - type Hashing = ::sp_runtime::traits::BlakeTwo256; type AccountId = AccountId; - type Lookup = IdentityLookup; + type Lookup = AccountIdLookup; type Block = Block; - type RuntimeEvent = RuntimeEvent; - type BlockHashCount = BlockHashCount; - type BlockWeights = (); - type BlockLength = (); - type Version = (); - type PalletInfo = PalletInfo; type AccountData = pallet_balances::AccountData; - type OnNewAccount = (); - type OnKilledAccount = (); - type DbWeight = (); - type BaseCallFilter = Everything; - type SystemWeightInfo = (); - type SS58Prefix = (); - type OnSetCode = (); - type MaxConsumers = frame_support::traits::ConstU32<16>; } parameter_types! { @@ -133,9 +123,8 @@ parameter_types! { pub const MaxAssetsIntoHolding: u32 = 64; } -#[allow(deprecated)] pub type LocalAssetTransactor = - XcmCurrencyAdapter, LocationToAccountId, AccountId, ()>; + FungibleAdapter, LocationToAccountId, AccountId, ()>; pub type XcmRouter = super::ParachainXcmRouter; pub type Barrier = AllowUnpaidExecutionFrom; @@ -167,6 +156,9 @@ impl Config for XcmConfig { type SafeCallFilter = Everything; type Aliasers = Nothing; type TransactionalProcessor = FrameTransactionalProcessor; + type HrmpNewChannelOpenRequestHandler = (); + type HrmpChannelAcceptedHandler = (); + type HrmpChannelClosingHandler = (); } #[frame_support::pallet] @@ -356,8 +348,6 @@ impl pallet_xcm::Config for Runtime { type AdminOrigin = EnsureRoot; } -type Block = frame_system::mocking::MockBlock; - construct_runtime!( pub enum Runtime { diff --git a/polkadot/xcm/xcm-simulator/fuzzer/src/relay_chain.rs b/polkadot/xcm/xcm-simulator/fuzzer/src/relay_chain.rs index 7e42f558dd6e89cbac2e5f378e16d75fd07ffa78..6790b535d169220a3def3e4780af1aa1ef83e759 100644 --- a/polkadot/xcm/xcm-simulator/fuzzer/src/relay_chain.rs +++ b/polkadot/xcm/xcm-simulator/fuzzer/src/relay_chain.rs @@ -23,8 +23,12 @@ use frame_support::{ }; use frame_system::EnsureRoot; -use sp_core::{ConstU32, H256}; -use sp_runtime::{traits::IdentityLookup, AccountId32}; +use sp_core::ConstU32; +use sp_runtime::{ + generic, + traits::{BlakeTwo256, IdentifyAccount, Verify}, + MultiAddress, MultiSignature, +}; use polkadot_parachain_primitives::primitives::Id as ParaId; use polkadot_runtime_parachains::{ @@ -33,48 +37,37 @@ use polkadot_runtime_parachains::{ origin, shared, }; use xcm::latest::prelude::*; -#[allow(deprecated)] -use xcm_builder::CurrencyAdapter as XcmCurrencyAdapter; use xcm_builder::{ AccountId32Aliases, AllowUnpaidExecutionFrom, ChildParachainAsNative, ChildParachainConvertsVia, ChildSystemParachainAsSuperuser, FixedRateOfFungible, - FixedWeightBounds, FrameTransactionalProcessor, IsConcrete, SignedAccountId32AsNative, - SignedToAccountId32, SovereignSignedViaLocation, + FixedWeightBounds, FrameTransactionalProcessor, FungibleAdapter, IsConcrete, + SignedAccountId32AsNative, SignedToAccountId32, SovereignSignedViaLocation, }; use xcm_executor::{Config, XcmExecutor}; -pub type AccountId = AccountId32; +pub type SignedExtra = (frame_system::CheckNonZeroSender,); + +pub type BlockNumber = u64; +pub type Address = MultiAddress; +pub type Header = generic::Header; +pub type UncheckedExtrinsic = + generic::UncheckedExtrinsic; +pub type Block = generic::Block; + +pub type Signature = MultiSignature; +pub type AccountId = <::Signer as IdentifyAccount>::AccountId; pub type Balance = u128; parameter_types! { - pub const BlockHashCount: u64 = 250; + pub const BlockHashCount: u32 = 250; } -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Runtime { - type RuntimeOrigin = RuntimeOrigin; - type RuntimeCall = RuntimeCall; - type Nonce = u64; - type Hash = H256; - type Hashing = ::sp_runtime::traits::BlakeTwo256; type AccountId = AccountId; - type Lookup = IdentityLookup; + type Lookup = sp_runtime::traits::AccountIdLookup; type Block = Block; - type RuntimeEvent = RuntimeEvent; - type BlockHashCount = BlockHashCount; - type BlockWeights = (); - type BlockLength = (); - type Version = (); - type PalletInfo = PalletInfo; type AccountData = pallet_balances::AccountData; - type OnNewAccount = (); - type OnKilledAccount = (); - type DbWeight = (); - type BaseCallFilter = Everything; - type SystemWeightInfo = (); - type SS58Prefix = (); - type OnSetCode = (); - type MaxConsumers = ConstU32<16>; } parameter_types! { @@ -117,9 +110,8 @@ parameter_types! { pub type SovereignAccountOf = (ChildParachainConvertsVia, AccountId32Aliases); -#[allow(deprecated)] pub type LocalAssetTransactor = - XcmCurrencyAdapter, SovereignAccountOf, AccountId, ()>; + FungibleAdapter, SovereignAccountOf, AccountId, ()>; type LocalOriginConverter = ( SovereignSignedViaLocation, @@ -165,6 +157,9 @@ impl Config for XcmConfig { type SafeCallFilter = Everything; type Aliasers = Nothing; type TransactionalProcessor = FrameTransactionalProcessor; + type HrmpNewChannelOpenRequestHandler = (); + type HrmpChannelAcceptedHandler = (); + type HrmpChannelClosingHandler = (); } pub type LocalOriginToLocation = SignedToAccountId32; @@ -202,8 +197,6 @@ parameter_types! { impl origin::Config for Runtime {} -type Block = frame_system::mocking::MockBlock; - parameter_types! { /// Amount of weight that can be spent per block to service messages. pub MessageQueueServiceWeight: Weight = Weight::from_parts(1_000_000_000, 1_000_000); @@ -239,6 +232,7 @@ impl pallet_message_queue::Config for Runtime { type HeapSize = MessageQueueHeapSize; type MaxStale = MessageQueueMaxStale; type ServiceWeight = MessageQueueServiceWeight; + type IdleMaxServiceWeight = (); #[cfg(not(feature = "runtime-benchmarks"))] type MessageProcessor = MessageProcessor; #[cfg(feature = "runtime-benchmarks")] diff --git a/polkadot/zombienet_tests/elastic_scaling/0001-basic-3cores-6s-blocks.toml b/polkadot/zombienet_tests/elastic_scaling/0001-basic-3cores-6s-blocks.toml new file mode 100644 index 0000000000000000000000000000000000000000..db508e14dbaa5c443e30c6c50d9d835927055162 --- /dev/null +++ b/polkadot/zombienet_tests/elastic_scaling/0001-basic-3cores-6s-blocks.toml @@ -0,0 +1,42 @@ +[settings] +timeout = 1000 + +[relaychain.genesis.runtimeGenesis.patch.configuration.config.async_backing_params] + max_candidate_depth = 6 + allowed_ancestry_len = 2 + +[relaychain.genesis.runtimeGenesis.patch.configuration.config.scheduler_params] + max_validators_per_core = 1 + scheduling_lookahead = 2 + num_cores = 3 + +[relaychain.genesis.runtimeGenesis.patch.configuration.config.approval_voting_params] + needed_approvals = 3 + max_approval_coalesce_count = 5 + +[relaychain] +default_image = "{{ZOMBIENET_INTEGRATION_TEST_IMAGE}}" +chain = "rococo-local" +default_command = "polkadot" + + [relaychain.default_resources] + limits = { memory = "4G", cpu = "2" } + requests = { memory = "2G", cpu = "1" } + + [[relaychain.node_groups]] + name = "elastic-validator" + count = 5 + args = [ "-lparachain=debug,parachain::candidate-backing=trace,parachain::provisioner=trace,parachain::prospective-parachains=trace,runtime=debug"] + +{% for id in range(2000,2002) %} +[[parachains]] +id = {{id}} +addToGenesis = true + + [parachains.collator] + name = "some-parachain" + image = "{{COL_IMAGE}}" + command = "adder-collator" + args = ["-lparachain::collation-generation=trace,parachain::collator-protocol=trace,parachain=debug"] +{% endfor %} + diff --git a/polkadot/zombienet_tests/elastic_scaling/0001-basic-3cores-6s-blocks.zndsl b/polkadot/zombienet_tests/elastic_scaling/0001-basic-3cores-6s-blocks.zndsl new file mode 100644 index 0000000000000000000000000000000000000000..b9c002457549788c04673f291f54599757cd67d7 --- /dev/null +++ b/polkadot/zombienet_tests/elastic_scaling/0001-basic-3cores-6s-blocks.zndsl @@ -0,0 +1,28 @@ +Description: Test with adder collator using 3 cores and async backing +Network: ./0001-basic-3cores-6s-blocks.toml +Creds: config + +# Check authority status. +elastic-validator-0: reports node_roles is 4 +elastic-validator-1: reports node_roles is 4 +elastic-validator-2: reports node_roles is 4 +elastic-validator-3: reports node_roles is 4 +elastic-validator-4: reports node_roles is 4 + + +# Register 2 extra cores to this some-parachain. +elastic-validator-0: js-script ./assign-core.js with "2000,0" return is 0 within 600 seconds +elastic-validator-0: js-script ./assign-core.js with "2000,1" return is 0 within 600 seconds + +# Wait for 20 relay chain blocks +elastic-validator-0: reports substrate_block_height{status="best"} is at least 20 within 600 seconds + +# Non elastic parachain should progress normally +some-parachain-1: count of log lines containing "Parachain velocity: 1" is at least 9 within 20 seconds +# Sanity +some-parachain-1: count of log lines containing "Parachain velocity: 2" is 0 within 20 seconds + +# Parachain should progress 3 blocks per relay chain block ideally, however this measurement does +# `ceil()` on the actual velocity to account for CI overload. +some-parachain: count of log lines containing "Parachain velocity: 3" is at least 9 within 20 seconds + diff --git a/polkadot/zombienet_tests/elastic_scaling/0002-elastic-scaling-doesnt-break-parachains.toml b/polkadot/zombienet_tests/elastic_scaling/0002-elastic-scaling-doesnt-break-parachains.toml new file mode 100644 index 0000000000000000000000000000000000000000..9b3576eaa3c212bd9490095c12ae4bca65f6fa54 --- /dev/null +++ b/polkadot/zombienet_tests/elastic_scaling/0002-elastic-scaling-doesnt-break-parachains.toml @@ -0,0 +1,40 @@ +[settings] +timeout = 1000 +bootnode = true + +[relaychain.genesis.runtimeGenesis.patch.configuration.config] + needed_approvals = 4 + +[relaychain.genesis.runtimeGenesis.patch.configuration.config.scheduler_params] + max_validators_per_core = 2 + num_cores = 2 + +[relaychain] +default_image = "{{ZOMBIENET_INTEGRATION_TEST_IMAGE}}" +chain = "rococo-local" +default_command = "polkadot" + +[relaychain.default_resources] +limits = { memory = "4G", cpu = "2" } +requests = { memory = "2G", cpu = "1" } + + [[relaychain.nodes]] + name = "alice" + validator = "true" + + [[relaychain.node_groups]] + name = "validator" + count = 3 + args = [ "-lparachain=debug,runtime=debug"] + +[[parachains]] +id = 2000 +default_command = "polkadot-parachain" +add_to_genesis = false +register_para = true +onboard_as_parachain = false + + [parachains.collator] + name = "collator2000" + command = "polkadot-parachain" + args = [ "-lparachain=debug" ] diff --git a/polkadot/zombienet_tests/elastic_scaling/0002-elastic-scaling-doesnt-break-parachains.zndsl b/polkadot/zombienet_tests/elastic_scaling/0002-elastic-scaling-doesnt-break-parachains.zndsl new file mode 100644 index 0000000000000000000000000000000000000000..900a3befbc6fc56f5200e9399f5fe5b21eb7af40 --- /dev/null +++ b/polkadot/zombienet_tests/elastic_scaling/0002-elastic-scaling-doesnt-break-parachains.zndsl @@ -0,0 +1,20 @@ +Description: Test that a paraid acquiring multiple cores does not brick itself if ElasticScalingMVP feature is enabled in genesis +Network: ./0002-elastic-scaling-doesnt-break-parachains.toml +Creds: config + +# Check authority status. +validator: reports node_roles is 4 + +validator: reports substrate_block_height{status="finalized"} is at least 10 within 100 seconds + +# Ensure parachain was able to make progress. +validator: parachain 2000 block height is at least 10 within 200 seconds + +# Register the second core assigned to this parachain. +alice: js-script ./assign-core.js with "2000,0" return is 0 within 600 seconds +alice: js-script ./assign-core.js with "2000,1" return is 0 within 600 seconds + +validator: reports substrate_block_height{status="finalized"} is at least 35 within 100 seconds + +# Ensure parachain is now making progress. +validator: parachain 2000 block height is at least 30 within 200 seconds diff --git a/polkadot/zombienet_tests/elastic_scaling/assign-core.js b/polkadot/zombienet_tests/elastic_scaling/assign-core.js new file mode 100644 index 0000000000000000000000000000000000000000..2e5f9d8cfa58ae26ef058f334ad782f1fbd9eb9f --- /dev/null +++ b/polkadot/zombienet_tests/elastic_scaling/assign-core.js @@ -0,0 +1,41 @@ +async function run(nodeName, networkInfo, args) { + const { wsUri, userDefinedTypes } = networkInfo.nodesByName[nodeName]; + const api = await zombie.connect(wsUri, userDefinedTypes); + + let para = Number(args[0]); + let core = Number(args[1]); + console.log(`Assigning para ${para} to core ${core}`); + + await zombie.util.cryptoWaitReady(); + + // account to submit tx + const keyring = new zombie.Keyring({ type: "sr25519" }); + const alice = keyring.addFromUri("//Alice"); + + await new Promise(async (resolve, reject) => { + const unsub = await api.tx.sudo + .sudo(api.tx.coretime.assignCore(core, 0, [[{ task: para }, 57600]], null)) + .signAndSend(alice, ({ status, isError }) => { + if (status.isInBlock) { + console.log( + `Transaction included at blockhash ${status.asInBlock}`, + ); + } else if (status.isFinalized) { + console.log( + `Transaction finalized at blockHash ${status.asFinalized}`, + ); + unsub(); + return resolve(); + } else if (isError) { + console.log(`Transaction error`); + reject(`Transaction error`); + } + }); + }); + + + + return 0; +} + +module.exports = { run }; diff --git a/polkadot/zombienet_tests/functional/0002-parachains-disputes.toml b/polkadot/zombienet_tests/functional/0002-parachains-disputes.toml index f6bdfeb4877e1dbd5f293f8c0ec864f4f7f1b80d..2561661de1f8408b2ed2808f1f5e41b4286ce97e 100644 --- a/polkadot/zombienet_tests/functional/0002-parachains-disputes.toml +++ b/polkadot/zombienet_tests/functional/0002-parachains-disputes.toml @@ -2,9 +2,11 @@ timeout = 1000 [relaychain.genesis.runtimeGenesis.patch.configuration.config] - max_validators_per_core = 5 needed_approvals = 8 +[relaychain.genesis.runtimeGenesis.patch.configuration.config.scheduler_params] + max_validators_per_core = 5 + [relaychain.genesis.runtimeGenesis.patch.configuration.config.approval_voting_params] max_approval_coalesce_count = 5 diff --git a/polkadot/zombienet_tests/functional/0004-parachains-garbage-candidate.toml b/polkadot/zombienet_tests/functional/0004-parachains-garbage-candidate.toml index 5d6f299d46133e52c645bd128fbdcc8171490d4e..a2a2621f8426d2e8deb32f524d23e666ab1b5c00 100644 --- a/polkadot/zombienet_tests/functional/0004-parachains-garbage-candidate.toml +++ b/polkadot/zombienet_tests/functional/0004-parachains-garbage-candidate.toml @@ -2,8 +2,10 @@ timeout = 1000 bootnode = true -[relaychain.genesis.runtimeGenesis.patch.configuration.config] +[relaychain.genesis.runtimeGenesis.patch.configuration.config.scheduler_params] max_validators_per_core = 1 + +[relaychain.genesis.runtimeGenesis.patch.configuration.config] needed_approvals = 2 [relaychain] diff --git a/polkadot/zombienet_tests/functional/0005-parachains-disputes-past-session.toml b/polkadot/zombienet_tests/functional/0005-parachains-disputes-past-session.toml index e2fbec079b1a81ec50054a30ef89d049bb717482..a3bbc82e74ba6d9d5c442742afc2dd18f31c7305 100644 --- a/polkadot/zombienet_tests/functional/0005-parachains-disputes-past-session.toml +++ b/polkadot/zombienet_tests/functional/0005-parachains-disputes-past-session.toml @@ -3,8 +3,10 @@ timeout = 1000 bootnode = true [relaychain.genesis.runtimeGenesis.patch.configuration.config] - max_validators_per_core = 1 needed_approvals = 2 + +[relaychain.genesis.runtimeGenesis.patch.configuration.config.scheduler_params] + max_validators_per_core = 1 group_rotation_frequency = 2 [relaychain] diff --git a/polkadot/zombienet_tests/functional/0006-parachains-max-tranche0.toml b/polkadot/zombienet_tests/functional/0006-parachains-max-tranche0.toml index bef54cb8ca416fb3210849fb9801c44a31e846a4..858f87b9cfe52c10c9cff9885dbeb57b0dcba2f5 100644 --- a/polkadot/zombienet_tests/functional/0006-parachains-max-tranche0.toml +++ b/polkadot/zombienet_tests/functional/0006-parachains-max-tranche0.toml @@ -3,10 +3,12 @@ timeout = 1000 bootnode = true [relaychain.genesis.runtimeGenesis.patch.configuration.config] - max_validators_per_core = 1 needed_approvals = 7 relay_vrf_modulo_samples = 5 +[relaychain.genesis.runtimeGenesis.patch.configuration.config.scheduler_params] + max_validators_per_core = 1 + [relaychain] default_image = "{{ZOMBIENET_INTEGRATION_TEST_IMAGE}}" chain = "rococo-local" diff --git a/polkadot/zombienet_tests/functional/0007-dispute-freshly-finalized.toml b/polkadot/zombienet_tests/functional/0007-dispute-freshly-finalized.toml index 69eb0804d8cb70c58fbc70abdb091af3a197d2fb..573ccf961385fa2c721caa0bb67ed97b94deb5a1 100644 --- a/polkadot/zombienet_tests/functional/0007-dispute-freshly-finalized.toml +++ b/polkadot/zombienet_tests/functional/0007-dispute-freshly-finalized.toml @@ -2,9 +2,11 @@ timeout = 1000 [relaychain.genesis.runtimeGenesis.patch.configuration.config] - max_validators_per_core = 1 needed_approvals = 1 +[relaychain.genesis.runtimeGenesis.patch.configuration.config.scheduler_params] + max_validators_per_core = 1 + [relaychain] default_image = "{{ZOMBIENET_INTEGRATION_TEST_IMAGE}}" chain = "rococo-local" diff --git a/polkadot/zombienet_tests/functional/0007-dispute-freshly-finalized.zndsl b/polkadot/zombienet_tests/functional/0007-dispute-freshly-finalized.zndsl index 62d5a9768f9ebd0b6eee8e6ef92dae7735fbf791..d1ed0250d4da0a5576c8baa7bfd746f6562bf804 100644 --- a/polkadot/zombienet_tests/functional/0007-dispute-freshly-finalized.zndsl +++ b/polkadot/zombienet_tests/functional/0007-dispute-freshly-finalized.zndsl @@ -21,9 +21,9 @@ honest: reports polkadot_parachain_candidate_dispute_concluded{validity="valid"} honest: reports polkadot_parachain_candidate_dispute_concluded{validity="invalid"} is 0 within 100 seconds # Check lag - approval -honest: reports polkadot_parachain_approval_checking_finality_lag is 0 +honest: reports polkadot_parachain_approval_checking_finality_lag is lower than 2 # Check lag - dispute conclusion -honest: reports polkadot_parachain_disputes_finality_lag is 0 +honest: reports polkadot_parachain_disputes_finality_lag is lower than 2 diff --git a/polkadot/zombienet_tests/functional/0008-dispute-old-finalized.toml b/polkadot/zombienet_tests/functional/0008-dispute-old-finalized.toml index 1ea385c3a42ee8fdf89b7595151a98c26d9b011b..ea1c93a1403fb837b45a6da01d0920c516e43ae6 100644 --- a/polkadot/zombienet_tests/functional/0008-dispute-old-finalized.toml +++ b/polkadot/zombienet_tests/functional/0008-dispute-old-finalized.toml @@ -2,9 +2,11 @@ timeout = 1000 [relaychain.genesis.runtimeGenesis.patch.configuration.config] - max_validators_per_core = 1 needed_approvals = 1 +[relaychain.genesis.runtimeGenesis.patch.configuration.config.scheduler_params] + max_validators_per_core = 1 + [relaychain] default_image = "{{ZOMBIENET_INTEGRATION_TEST_IMAGE}}" chain = "rococo-local" diff --git a/polkadot/zombienet_tests/functional/0010-validator-disabling.toml b/polkadot/zombienet_tests/functional/0010-validator-disabling.toml index 6701d60d74d147d517fc55dd3f1253171f6b807f..c9d79c5f8f236918cf409fd684b7d0b8d9792d33 100644 --- a/polkadot/zombienet_tests/functional/0010-validator-disabling.toml +++ b/polkadot/zombienet_tests/functional/0010-validator-disabling.toml @@ -3,8 +3,10 @@ timeout = 1000 bootnode = true [relaychain.genesis.runtimeGenesis.patch.configuration.config] - max_validators_per_core = 1 needed_approvals = 2 + +[relaychain.genesis.runtimeGenesis.patch.configuration.config.scheduler_params] + max_validators_per_core = 1 group_rotation_frequency = 10 [relaychain] diff --git a/polkadot/zombienet_tests/functional/0011-async-backing-6-seconds-rate.toml b/polkadot/zombienet_tests/functional/0011-async-backing-6-seconds-rate.toml index 5a6832b149be21a48ca17fe6e84f75cfc3324ed0..b776622fdce33df2e9a78debc31ee3e62ae4805d 100644 --- a/polkadot/zombienet_tests/functional/0011-async-backing-6-seconds-rate.toml +++ b/polkadot/zombienet_tests/functional/0011-async-backing-6-seconds-rate.toml @@ -8,13 +8,16 @@ chain = "rococo-local" [relaychain.genesis.runtimeGenesis.patch.configuration.config] needed_approvals = 4 relay_vrf_modulo_samples = 6 - scheduling_lookahead = 2 - group_rotation_frequency = 4 [relaychain.genesis.runtimeGenesis.patch.configuration.config.async_backing_params] max_candidate_depth = 3 allowed_ancestry_len = 2 +[relaychain.genesis.runtimeGenesis.patch.configuration.config.scheduler_params] + lookahead = 2 + group_rotation_frequency = 4 + + [relaychain.default_resources] limits = { memory = "4G", cpu = "2" } requests = { memory = "2G", cpu = "1" } diff --git a/polkadot/zombienet_tests/misc/0001-paritydb.toml b/polkadot/zombienet_tests/misc/0001-paritydb.toml index 399f848d3ac49e7e9950617c170c13d5c63593dd..b3ce2081b1119ec237c1b3d6e14e1e4aed8322c5 100644 --- a/polkadot/zombienet_tests/misc/0001-paritydb.toml +++ b/polkadot/zombienet_tests/misc/0001-paritydb.toml @@ -3,9 +3,11 @@ timeout = 1000 bootnode = true [relaychain.genesis.runtimeGenesis.patch.configuration.config] - max_validators_per_core = 1 needed_approvals = 3 +[relaychain.genesis.runtimeGenesis.patch.configuration.config.scheduler_params] + max_validators_per_core = 1 + [relaychain] default_image = "{{ZOMBIENET_INTEGRATION_TEST_IMAGE}}" chain = "rococo-local" diff --git a/polkadot/zombienet_tests/misc/0001-paritydb.zndsl b/polkadot/zombienet_tests/misc/0001-paritydb.zndsl index 4a22311de764c1936be2f5812ffb32a7471b5f8e..e0260cb9fdde18882bd9e1cb1ec88a12cdb7a3b9 100644 --- a/polkadot/zombienet_tests/misc/0001-paritydb.zndsl +++ b/polkadot/zombienet_tests/misc/0001-paritydb.zndsl @@ -31,28 +31,28 @@ validator-0: parachain 2008 is registered validator-0: parachain 2009 is registered # Ensure parachains made some progress. -validator-0: parachain 2000 block height is at least 3 within 30 seconds -validator-0: parachain 2001 block height is at least 3 within 30 seconds -validator-0: parachain 2002 block height is at least 3 within 30 seconds -validator-0: parachain 2003 block height is at least 3 within 30 seconds -validator-0: parachain 2004 block height is at least 3 within 30 seconds -validator-0: parachain 2005 block height is at least 3 within 30 seconds -validator-0: parachain 2006 block height is at least 3 within 30 seconds -validator-0: parachain 2007 block height is at least 3 within 30 seconds -validator-0: parachain 2008 block height is at least 3 within 30 seconds -validator-0: parachain 2009 block height is at least 3 within 30 seconds +validator-0: parachain 2000 block height is at least 3 within 60 seconds +validator-0: parachain 2001 block height is at least 3 within 60 seconds +validator-0: parachain 2002 block height is at least 3 within 60 seconds +validator-0: parachain 2003 block height is at least 3 within 60 seconds +validator-0: parachain 2004 block height is at least 3 within 60 seconds +validator-0: parachain 2005 block height is at least 3 within 60 seconds +validator-0: parachain 2006 block height is at least 3 within 60 seconds +validator-0: parachain 2007 block height is at least 3 within 60 seconds +validator-0: parachain 2008 block height is at least 3 within 60 seconds +validator-0: parachain 2009 block height is at least 3 within 60 seconds # Check lag - approval -validator-0: reports polkadot_parachain_approval_checking_finality_lag is 0 -validator-1: reports polkadot_parachain_approval_checking_finality_lag is 0 -validator-2: reports polkadot_parachain_approval_checking_finality_lag is 0 -validator-3: reports polkadot_parachain_approval_checking_finality_lag is 0 -validator-4: reports polkadot_parachain_approval_checking_finality_lag is 0 -validator-5: reports polkadot_parachain_approval_checking_finality_lag is 0 -validator-6: reports polkadot_parachain_approval_checking_finality_lag is 0 -validator-7: reports polkadot_parachain_approval_checking_finality_lag is 0 -validator-8: reports polkadot_parachain_approval_checking_finality_lag is 0 -validator-9: reports polkadot_parachain_approval_checking_finality_lag is 0 +validator-0: reports polkadot_parachain_approval_checking_finality_lag <= 1 +validator-1: reports polkadot_parachain_approval_checking_finality_lag <= 1 +validator-2: reports polkadot_parachain_approval_checking_finality_lag <= 1 +validator-3: reports polkadot_parachain_approval_checking_finality_lag <= 1 +validator-4: reports polkadot_parachain_approval_checking_finality_lag <= 1 +validator-5: reports polkadot_parachain_approval_checking_finality_lag <= 1 +validator-6: reports polkadot_parachain_approval_checking_finality_lag <= 1 +validator-7: reports polkadot_parachain_approval_checking_finality_lag <= 1 +validator-8: reports polkadot_parachain_approval_checking_finality_lag <= 1 +validator-9: reports polkadot_parachain_approval_checking_finality_lag <= 1 # Check lag - dispute conclusion validator-0: reports polkadot_parachain_candidate_disputes_total is 0 diff --git a/polkadot/zombienet_tests/misc/0002-upgrade-node.zndsl b/polkadot/zombienet_tests/misc/0002-upgrade-node.zndsl index db0a60ac1df617e5c89dc6a1385c4c106c1ead05..5fe1b2ad2f1a7589a28f8b1b8da05d6f35d3d59b 100644 --- a/polkadot/zombienet_tests/misc/0002-upgrade-node.zndsl +++ b/polkadot/zombienet_tests/misc/0002-upgrade-node.zndsl @@ -10,9 +10,8 @@ dave: parachain 2001 block height is at least 10 within 200 seconds # POLKADOT_PR_ARTIFACTS_URL=https://gitlab.parity.io/parity/mirrors/polkadot/-/jobs/1842869/artifacts/raw/artifacts # with the version of polkadot you want to download. -# avg 30s in our infra -alice: run ./0002-download-polkadot-from-pr.sh with "{{POLKADOT_PR_ARTIFACTS_URL}}" within 60 seconds -bob: run ./0002-download-polkadot-from-pr.sh with "{{POLKADOT_PR_ARTIFACTS_URL}}" within 60 seconds +alice: run ./0002-download-polkadot-from-pr.sh with "{{POLKADOT_PR_ARTIFACTS_URL}}" within 240 seconds +bob: run ./0002-download-polkadot-from-pr.sh with "{{POLKADOT_PR_ARTIFACTS_URL}}" within 240 seconds # update the cmd to add the flag '--insecure-validator-i-know-what-i-do' # once the base image include the version with this flag we can remove this logic. alice: run ./0002-update-cmd.sh within 60 seconds diff --git a/prdoc/.template.prdoc b/prdoc/.template.prdoc index 097741f388c4f2be73c9aed9d2b1dcc7dde32cf2..03a458876dfaaab5f9bc2fe61ab349c0903988e1 100644 --- a/prdoc/.template.prdoc +++ b/prdoc/.template.prdoc @@ -4,7 +4,7 @@ title: ... doc: - - audience: Node Dev + - audience: ... description: | ... diff --git a/prdoc/1.10.0/pr_3190.prdoc b/prdoc/1.10.0/pr_3190.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..2f7a89a0b1aba611b10625f0d7833b3f3dfd4e6e --- /dev/null +++ b/prdoc/1.10.0/pr_3190.prdoc @@ -0,0 +1,17 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: Fix algorithmic complexity of the on-demand scheduler. + +doc: + - audience: Runtime Dev + description: | + Improves on demand performance by a significant factor. Previously, having many on-demand cores + would cause really poor blocktimes due to the fact that for each core the full order queue was + processed. This allows for increasing the max size of the on-demand queue if needed. + + At the same time, the spot price for on-demand is now checked prior to every order, ensuring + that economic backpressure will be applied. + +crates: + - name: polkadot-runtime-parachains diff --git a/prdoc/1.10.0/pr_3246.prdoc b/prdoc/1.10.0/pr_3246.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..19a823e502855e6190da1dd767c04b50027707db --- /dev/null +++ b/prdoc/1.10.0/pr_3246.prdoc @@ -0,0 +1,11 @@ +title: Try State Hook for Beefy. + +doc: + - audience: Runtime User + description: | + Invariants for storage items in the beefy pallet. Enforces the following Invariants: + 1. `Authorities` should not exceed the `MaxAuthorities` capacity. + 2. `NextAuthorities` should not exceed the `MaxAuthorities` capacity. + 3. `ValidatorSetId` must be present in `SetIdSession`. +crates: +- name: pallet-beefy diff --git a/prdoc/1.10.0/pr_3302.prdoc b/prdoc/1.10.0/pr_3302.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..cfd571430faaef40a79499db6cdff4bd5531bd25 --- /dev/null +++ b/prdoc/1.10.0/pr_3302.prdoc @@ -0,0 +1,24 @@ +title: Collator protocol changes for elastic scaling + +doc: + - audience: Node Dev + description: | + This PR introduces changes to the collator protocol to support elastic scaling. + Namely, a new variant added to the collation response to include parent head-data + along with the collation. Currently, the new variant is not being used. + - audience: Node Operator + description: | + Validators are required to upgrade to this version before collators in order to + support the elastic scaling of parachains. + +crates: + - name: polkadot-collator-protocol + bump: major + - name: polkadot-node-network-protocol + bump: major + - name: polkadot-node-subsystem-types + bump: major + - name: polkadot-node-collation-generation + bump: minor + - name: polkadot-node-core-prospective-parachains + bump: minor diff --git a/prdoc/1.10.0/pr_3341.prdoc b/prdoc/1.10.0/pr_3341.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..eb86f9f0d0a6a85717c4b9a8160e31377e33c6d0 --- /dev/null +++ b/prdoc/1.10.0/pr_3341.prdoc @@ -0,0 +1,16 @@ +title: "Fix `schedule_code_upgrade` when called by the owner/root" + +doc: + - audience: Runtime User + description: | + Fixes `schedule_code_upgrade` when being used by the owner/root. The call is used for + manually upgrading the validation code of a parachain on the relay chain. It was failing + before because the relay chain waited for the parachain to make progress. However, this + call is mostly used for when a parachain are bricked which means that they are not able + anymore to build any blocks. The fix is to schedule the validation code upgrade and then + to enact it at the scheduled block. The enacting happens now without requiring the parachain + to make any progress. + +crates: + - name: polkadot-runtime-common + - name: polkadot-runtime-parachains diff --git a/prdoc/1.10.0/pr_3350.prdoc b/prdoc/1.10.0/pr_3350.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..1171614d67f65e8d75a2d3b4f6545a87bfb0ac0e --- /dev/null +++ b/prdoc/1.10.0/pr_3350.prdoc @@ -0,0 +1,31 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: removed `pallet::getter` from Pallet AURA + +doc: + - audience: Runtime Dev + description: | + This PR removes all the declarations of macro `pallet::getter` in the Pallet AURA and replaces the use of storage getter functions authorities() & current_slot() with `StorageItem::get()` API across the crates as listed bellow. + The purpose is to discourage developers to use this macro, that is currently being removed and soon will be deprecated. + +crates: + - name: pallet-aura + - name: solochain-template-runtime + - name: cumulus-pallet-aura-ext + - name: parachain-template-runtime + - name: people-westend-runtime + - name: people-rococo-runtime + - name: bridge-hub-rococo-runtime + - name: bridge-hub-westend-runtime + - name: rococo-parachain-runtime + - name: penpal-runtime + - name: glutton-westend-runtime + - name: shell-runtime + - name: seedling-runtime + - name: collectives-westend-runtime + - name: asset-hub-rococo-runtime + - name: asset-hub-westend-runtime + - name: contracts-rococo-runtime + - name: coretime-westend-runtime + - name: coretime-rococo-runtime diff --git a/prdoc/1.10.0/pr_3438.prdoc b/prdoc/1.10.0/pr_3438.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..5f4a0e3d57af7a606d6c59dd049008dad03b944a --- /dev/null +++ b/prdoc/1.10.0/pr_3438.prdoc @@ -0,0 +1,13 @@ +title: "Pools: Make PermissionlessWithdraw the default claim permission" + +doc: + - audience: Runtime User + description: | + Makes permissionless withdrawing the default claim permission, giving any network participant + access to claim pool rewards on member's behalf, by default. + +crates: + - name: pallet-nomination-pools + bump: minor + - name: pallet-nomination-pools-benchmarking + bump: minor diff --git a/prdoc/1.10.0/pr_3471.prdoc b/prdoc/1.10.0/pr_3471.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..0c16587fc9086c6173e6917cdbf9c434599cdcd6 --- /dev/null +++ b/prdoc/1.10.0/pr_3471.prdoc @@ -0,0 +1,33 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: removed `pallet::getter` from cumulus pallets + +doc: + - audience: Runtime Dev + description: | + This PR removes all the `pallet::getter` usages from cumulus pallets, and updates depdendant runtimes accordingly. + The ParaId can be retrieved using `>::get()`. + For other storage items, the syntax `StorageItem::::get()` should be used instead. + +crates: + - name: cumulus-pallet-aura-ext + - name: pallet-collator-selection + - name: cumulus-pallet-parachain-system + - name: staging-parachain-info + - name: parachain-template-runtime + - name: asset-hub-rococo-runtime + - name: asset-hub-westend-runtime + - name: bridge-hub-rococo-runtime + - name: bridge-hub-westend-runtime + - name: collectives-westend-runtime + - name: contracts-rococo-runtime + - name: coretime-rococo-runtime + - name: coretime-westend-runtime + - name: glutton-westend-runtime + - name: people-rococo-runtime + - name: people-westend-runtime + - name: shell-runtime + - name: penpal-runtime + - name: rococo-parachain-runtime + diff --git a/prdoc/1.10.0/pr_3479.prdoc b/prdoc/1.10.0/pr_3479.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..1e44ce5646b92b5e893b33a56648100df45ac449 --- /dev/null +++ b/prdoc/1.10.0/pr_3479.prdoc @@ -0,0 +1,8 @@ +title: "Elastic scaling: runtime dependency tracking and enactment" + +doc: + - audience: Node Dev + description: | + Adds support in the inclusion and paras_inherent runtime modules for backing and including multiple candidates of the same para if they form a chain. + +crates: [ ] diff --git a/prdoc/1.10.0/pr_3521.prdoc b/prdoc/1.10.0/pr_3521.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..4ad3f03bf0c5eea885769285fd29ef76d3214111 --- /dev/null +++ b/prdoc/1.10.0/pr_3521.prdoc @@ -0,0 +1,12 @@ +title: Collator side changes for elastic scaling + +doc: + - audience: Node Dev + description: | + Parachain teams wishing to utilize the benefits of + elastic scaling will need to upgrade their collator + code to include these changes. + +crates: +- name: polkadot-collator-protocol + bump: minor diff --git a/prdoc/1.10.0/pr_3580.prdoc b/prdoc/1.10.0/pr_3580.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..042fcf7a1a849f3a704a6fe81506071dbc57df36 --- /dev/null +++ b/prdoc/1.10.0/pr_3580.prdoc @@ -0,0 +1,13 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: Expose `ClaimQueue` via a runtime api and consume it in `collation-generation` + +doc: + - audience: Node Dev + description: | + Creates a new runtime api exposing the `ClaimQueue` from `scheduler` pallet. Consume the api + in collation generation (if available) by getting what's scheduled on a core from the + `ClaimQueue` instead of from `next_up_on_available` (from `AvailabilityCores` runtime api). + +crates: [ ] diff --git a/prdoc/1.10.0/pr_3607.prdoc b/prdoc/1.10.0/pr_3607.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..1a69b25ad255ca1d2e2f717a75db763360e7f4fc --- /dev/null +++ b/prdoc/1.10.0/pr_3607.prdoc @@ -0,0 +1,26 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: "XCM fee payment API" + +doc: + - audience: Runtime Dev + description: | + A runtime API was added for estimating the fees required for XCM execution and delivery. + This is the basic building block needed for UIs to accurately estimate fees. + An example implementation is shown in the PR. Ideally it's simple to implement, you only need to call existing parts of your XCM config. + The API looks like so: + ```rust + fn query_acceptable_payment_assets(xcm_version: Version) -> Result, Error>; + fn query_xcm_weight(message: VersionedXcm) -> Result; + fn query_weight_to_asset_fee(weight: Weight, asset: VersionedAssetId) -> Result; + fn query_delivery_fees(destination: VersionedLocation, message: VersionedXcm<()>) -> Result; + ``` + The first three relate to XCM execution fees, given an XCM, you can query its weight, then which assets are acceptable for buying weight and convert weight to a number of those assets. + The last one takes in a destination and a message you want to send from the runtime you're executing this on, it will give you the delivery fees. + +crates: + - name: xcm-fee-payment-runtime-api + - name: rococo-runtime + - name: westend-runtime + diff --git a/prdoc/1.10.0/pr_3616.prdoc b/prdoc/1.10.0/pr_3616.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..fcf068dcd1739365f9cf04782efea3503327f3d4 --- /dev/null +++ b/prdoc/1.10.0/pr_3616.prdoc @@ -0,0 +1,28 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: "Benchmarking pallet V2 syntax extension: pov_mode attribute" + +doc: + - audience: Runtime Dev + description: | + Adds the `pov_mode` attribute from the V1 benchmarking syntax to the V2 syntax. This allows to + override the default PoV mode (`MaxEncodedLen`) to either `Measured` or `Ignored`. It can be + overridden for a whole benchmark, a key prefix of a specific key itself. + + Example syntax looks like this: + ```rust + #[benchmark(pov_mode = Measured { + Pallet: Measured, + Pallet::Storage: MaxEncodedLen, + })] + fn do_some() { + .. + } + ``` + +crates: + - name: frame-support-procedural + bump: minor + - name: frame-support + bump: minor diff --git a/prdoc/1.10.0/pr_3654.prdoc b/prdoc/1.10.0/pr_3654.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..de4a68d23569d130e5df0d0400edbe498e3875e4 --- /dev/null +++ b/prdoc/1.10.0/pr_3654.prdoc @@ -0,0 +1,14 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: Remove `experimental` feature from `pallet-aura` + +doc: + - audience: Runtime Dev + description: | + The `experimental` feature in `pallet-aura`, previously used to gate different experimental + changes, became redundant with the introduction of the async backing which relies on the + mentioned changes, therefore, it is removed. + +crates: + - name: pallet-aura diff --git a/prdoc/1.10.0/pr_3696.prdoc b/prdoc/1.10.0/pr_3696.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..f3371d1734adf3e9281a83f900950129817ccc46 --- /dev/null +++ b/prdoc/1.10.0/pr_3696.prdoc @@ -0,0 +1,17 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: Add HRMP notification handlers to the xcm-executor + +doc: + - audience: Runtime Dev + description: | + Adds optional HRMP notification handlers to the xcm-executor. These handlers are 3 new config types on the xcm-executor `Config` trait: + - `HrmpNewChannelOpenRequestHandler` + - `HrmpChannelAcceptedHandler` + - `HrmpChannelClosingHandler` + + The traits of these config types are implemented on tuples, and on `()` for the default case. + +crates: + - name: staging-xcm-executor diff --git a/prdoc/1.10.0/pr_3706.prdoc b/prdoc/1.10.0/pr_3706.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..edeb08241bed150f755052ccd3879f3a05e134a2 --- /dev/null +++ b/prdoc/1.10.0/pr_3706.prdoc @@ -0,0 +1,20 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: Extrinsic to restore corrupted staking ledgers + +doc: + - audience: Runtime User + description: | + This PR adds a new extrinsic `Call::restore_ledger ` gated by `StakingAdmin` origin that restores a corrupted staking ledger. This extrinsic will be used to recover ledgers that were affected by the issue discussed in https://github.com/paritytech/polkadot-sdk/issues/3245. + The extrinsic will re-write the storage items associated with a stash account provided as input parameter. The data used to reset the ledger can be either i) fetched on-chain or ii) partially/totally set by the input parameters of the call. + + Changes introduced: + - Adds `Call::restore_ledger ` extrinsic to recover a corrupted ledger; + - Adds trait `frame_support::traits::currency::InspectLockableCurrency` to allow external pallets to read current locks given an account and lock ID; + - Implements the `InspectLockableCurrency` in the pallet-balances. + - Adds staking locks try-runtime checks (https://github.com/paritytech/polkadot-sdk/issues/3751) + +crates: + - name: pallet-staking + - name: pallet-balances diff --git a/prdoc/1.10.0/pr_3714.prdoc b/prdoc/1.10.0/pr_3714.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..e276d0d2d3731c2cf626a54f4812b5167269bca6 --- /dev/null +++ b/prdoc/1.10.0/pr_3714.prdoc @@ -0,0 +1,10 @@ +title: Handle legacy lease swaps on coretime + +doc: + - audience: Runtime Dev + description: | + When a `registar::swap` extrinsic is executed it swaps two leases on the relay chain but the + broker chain never knows about this swap. This change notifies the broker chain via a XCM + message for a swap so that it can update its state. +crates: + - name: pallet-broker diff --git a/prdoc/1.10.0/pr_3718.prdoc b/prdoc/1.10.0/pr_3718.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..b2b24cc9704d9a7cb66bb63bf2c8483c4b1f4490 --- /dev/null +++ b/prdoc/1.10.0/pr_3718.prdoc @@ -0,0 +1,13 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: Deprecate scheduler traits v1 and v2 + +doc: + - audience: Runtime Dev + description: | + Add `#[deprecated]` attribute to scheduler traits v1 and v2 to deprecate old versions + +crates: + - name: frame-support + - name: pallet-scheduler diff --git a/prdoc/1.10.0/pr_3722.prdoc b/prdoc/1.10.0/pr_3722.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..7e2d7d38795b70213a4fb737a7c7cf4703035272 --- /dev/null +++ b/prdoc/1.10.0/pr_3722.prdoc @@ -0,0 +1,13 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: Fix kusama 0 backing rewards when entering active set + +doc: + - audience: Runtime Dev + description: | + This PR fixes getting 0 backing rewards the first session when + a node enters the active set. + +crates: + - name: pallet-authority-discovery diff --git a/prdoc/1.10.0/pr_3738.prdoc b/prdoc/1.10.0/pr_3738.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..cbf19b95c36a0bedf06584552250d4419c712e42 --- /dev/null +++ b/prdoc/1.10.0/pr_3738.prdoc @@ -0,0 +1,14 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: Removed `pallet::getter` usage from `pallet-alliance` + +doc: + - audience: Runtime Dev + description: | + This PR removes `pallet::getter` usage from `pallet-alliance`, and updates dependant code accordingly. + The syntax `StorageItem::::get()` should be used instead. + +crates: + - name: pallet-alliance + bump: major diff --git a/prdoc/1.10.0/pr_3740.prdoc b/prdoc/1.10.0/pr_3740.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..03df8ec5fea0282136ca9d5b1912f1257de7ed1e --- /dev/null +++ b/prdoc/1.10.0/pr_3740.prdoc @@ -0,0 +1,18 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: Removed `pallet::getter` usage from Beefy and MMR pallets + +doc: + - audience: Runtime Dev + description: | + This PR removes `pallet::getter` usage from `pallet-beefy`, `pallet-beefy-mmr` and `pallet-mmr`, and updates dependant code and runtimes accordingly. + The syntax `StorageItem::::get()` should be used instead. + +crates: + - name: pallet-beefy + - name: pallet-beefy-mmr + - name: pallet-mmr + - name: kitchensink-runtime + - name: rococo-runtime + - name: westend-runtime diff --git a/prdoc/1.10.0/pr_3749.prdoc b/prdoc/1.10.0/pr_3749.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..1ebde9670e0f374c8dd079f9d66ec84894b71f6b --- /dev/null +++ b/prdoc/1.10.0/pr_3749.prdoc @@ -0,0 +1,47 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: "pallet-xcm: deprecate execute and send in favor of execute_blob and send_blob" + +doc: + - audience: Runtime Dev + description: | + pallet-xcm's extrinsics `execute` and `send` have been marked as deprecated. + Please change their usage to the new `execute_blob` and `send_blob`. + The migration from the old extrinsic to the new is very simple. + If you have your message `xcm: VersionedXcm`, then instead of passing in + `Box::new(xcm)` to both `execute` and `send`, you would pass in + `xcm.encode().try_into()` and handle the potential error of its encoded length + being bigger than `MAX_XCM_ENCODED_SIZE`. + + pallet-contracts takes the XCM encoded now as well. It follows the same API as + `execute_blob` and `send_blob`. + - audience: Runtime User + description: | + pallet-xcm has a new pair of extrinsics, `execute_blob` and `send_blob`. + These are meant to be used instead of `execute` and `send`, which are now deprecated + and will be removed eventually. + These new extrinsics just require you to input the encoded XCM. + There's a new utility in PolkadotJS Apps for encoding XCMs you can use: + https://polkadot.js.org/apps/#/utilities/xcm + Just pass in the encoded XCM to the new extrinsics and you're done. + + pallet-contracts takes the XCM encoded now as well. It follows the same API as + `execute_blob` and `send_blob`. + +crates: +- name: pallet-xcm +- name: staging-xcm +- name: staging-xcm-builder +- name: pallet-contracts +- name: asset-hub-rococo-runtime +- name: asset-hub-westend-runtime +- name: bridge-hub-rococo-runtime +- name: bridge-hub-westend-runtime +- name: collectives-westend-runtime +- name: coretime-rococo-runtime +- name: coretime-westend-runtime +- name: people-rococo-runtime +- name: people-westend-runtime +- name: rococo-runtime +- name: westend-runtime diff --git a/prdoc/1.10.0/pr_3754.prdoc b/prdoc/1.10.0/pr_3754.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..94ea6d566088309cbad05d5eed3f248af716c3bc --- /dev/null +++ b/prdoc/1.10.0/pr_3754.prdoc @@ -0,0 +1,13 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: Migrates Westend to Runtime V2 + +doc: + - audience: Runtime Dev + description: | + This PR migrates Westend from `construct_runtime` to Runtime V2 + as introduced in https://github.com/paritytech/polkadot-sdk/pull/1378 + +crates: + - name: westend-runtime diff --git a/prdoc/1.10.0/pr_3761.prdoc b/prdoc/1.10.0/pr_3761.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..65b8c396fe3b62f6690a427e3e1ebaa1f7ee5204 --- /dev/null +++ b/prdoc/1.10.0/pr_3761.prdoc @@ -0,0 +1,25 @@ +title: "Snowbridge: Synchronize from Snowfork repository" + +doc: + - audience: Runtime Dev + description: | + This PR improves the beacon client to send the execution header along with the message as proof and removes the verification and storing of all execution headers. + If the AH sovereign account is depleted and relayer rewards cannot be paid, the message should still be processed. + +crates: +- name: snowbridge-pallet-ethereum-client + bump: minor +- name: snowbridge-pallet-inbound-queue + bump: minor +- name: snowbridge-beacon-primitives + bump: minor +- name: snowbridge-core + bump: minor +- name: snowbridge-runtime-test-common + bump: minor +- name: asset-hub-rococo-runtime + bump: minor +- name: bridge-hub-rococo-runtime + bump: minor +- name: bridge-hub-rococo-integration-tests + bump: minor diff --git a/prdoc/1.10.0/pr_3792.prdoc b/prdoc/1.10.0/pr_3792.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..cbcdc29a9c6e434403b5d2548a44eb468e6ba30e --- /dev/null +++ b/prdoc/1.10.0/pr_3792.prdoc @@ -0,0 +1,19 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: "[pallet-xcm] fix transport fees for remote reserve transfers" + +doc: + - audience: Runtime Dev + description: | + This PR fixes `pallet_xcm::transfer_assets` and + `pallet_xcm::limited_reserve_transfer_assets` extrinsics for transfers + that need to go through remote reserves. The fix is adding a + `SetFeesMode { jit_withdraw: true }` instruction before local execution of + `InitiateReserveWithdraw` so that delivery fees are correctly charged by + the xcm-executor. Without this change, a runtime that has implemented + delivery fees would not be able to execute remote reserve transfers using + these extrinsics. + +crates: + - name: pallet-xcm diff --git a/prdoc/1.10.0/pr_3795.prdoc b/prdoc/1.10.0/pr_3795.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..da01fcbec821cfb1ca391a374a8f166a05111be0 --- /dev/null +++ b/prdoc/1.10.0/pr_3795.prdoc @@ -0,0 +1,14 @@ +title: Enable collators to build on multiple cores + +doc: + - audience: Node Dev + description: | + Introduces a `CoreIndex` parameter in `SubmitCollationParams`. This enables + the collators to make use of potentially multiple cores assigned at some relay + chain block. This extra parameter is used by the collator protocol and collation + generation subsystems to forward the collation to the approapriate backing group. + +crates: +- name: polkadot-node-collation-generation +- name: polkadot-collator-protocol + bump: minor diff --git a/prdoc/1.10.0/pr_3808.prdoc b/prdoc/1.10.0/pr_3808.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..9b50f721df335891130f9ef63c0bf144792beebb --- /dev/null +++ b/prdoc/1.10.0/pr_3808.prdoc @@ -0,0 +1,20 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: Fix spelling mistakes in source code + +doc: + - audience: Node Operator + description: | + Some spelling mistakes in log output, error messages and tracing (prometheus/grafana) have been fixed. + - audience: Runtime Dev + description: | + Public crate changes: + - The public trait `RuntimeParameterStore` in `substrate/frame/support` had the associated type renamed from `AggregratedKeyValue` to `AggregatedKeyValue`. + - The public trait `AggregratedKeyValue` in `substrate/frame/support` was similarly renamed to `AggregatedKeyValue`. + - The public methods `test_versioning` and `test_versioning_register_only` of the `TestApi` trait in `substrate/primitives/runtime-interface/test-wasm` had the spelling of `versionning` changed to `versioning`. + - The public functions `read_trie_first_descendant_value` and `read_child_trie_first_descendant_value` in `substrate/primitives/trie` had the spelling of `descedant` changed to `descendant`. +crates: + - name: frame-support + - name: sp-runtime-interface-test-wasm + - name: sp-trie diff --git a/prdoc/1.10.0/pr_3817.prdoc b/prdoc/1.10.0/pr_3817.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..bf9d397122f9d98bf4853ed0895a74f764367e54 --- /dev/null +++ b/prdoc/1.10.0/pr_3817.prdoc @@ -0,0 +1,23 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: Parachain Runtime API Implementations into mod apis Refactoring + +doc: + - audience: Runtime Dev + description: | + This PR introduces a refactoring to the runtime API implementations within the parachain template project. The primary changes include enhancing the visibility of `RUNTIME_API_VERSIONS` to `pub` in `impl_runtime_apis.rs`, centralizing API implementations in a new `apis.rs` file, and streamlining `lib.rs`. These changes aim to improve project structure, maintainability, and readability. + + Key Changes: + - `RUNTIME_API_VERSIONS` is now publicly accessible, enhancing module-wide visibility. + - Introduction of `apis.rs` centralizes runtime API implementations, promoting a cleaner and more navigable project structure. + - The main runtime library file, `lib.rs`, has been updated to reflect these structural changes, removing redundant API implementations and simplifying runtime configuration by pointing `VERSION` to the newly exposed `RUNTIME_API_VERSIONS` from `apis.rs`. + + Motivations: + - **Improved Project Structure**: Centralizing API implementations offers a more organized and understandable project layout. + - **Enhanced Readability**: The refactoring efforts aim to declutter `lib.rs`, facilitating easier comprehension for new contributors. + +crates: + - name: sp-api-proc-macro + - name: parachain-template-node + - name: parachain-template-runtime diff --git a/prdoc/1.10.0/pr_3835.prdoc b/prdoc/1.10.0/pr_3835.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..d2f49f8fc1161da7f264ae2a55ebcfd462dcca27 --- /dev/null +++ b/prdoc/1.10.0/pr_3835.prdoc @@ -0,0 +1,54 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: "migrations: prevent accidentally using inner unversioned migration instead of `VersionedMigration`" + +doc: + - audience: Runtime Dev + description: | + Currently, it is possible to accidentally use inner unversioned migration instead of `VersionedMigration` + since both implement `OnRuntimeUpgrade`. With this change, we make it clear that `Inner` is not intended + to be used directly. It is achieved by bounding `Inner` to new trait `UncheckedOnRuntimeUpgrade`, which + has the same interface as `OnRuntimeUpgrade`, but can not be used directly for runtime upgrade migrations. + + This change will break all existing migrations passed to `VersionedMigration`. Developers should simply change + those migrations to implement `UncheckedOnRuntimeUpgrade` instead of `OnRuntimeUpgrade`. + + Example: + + ``` + --- a/path/to/migration.rs + +++ b/path/to/migration.rs + @@ -1,7 +1,7 @@ + -impl OnRuntimeUpgrade for MigrateVNToVM { + +impl UncheckedOnRuntimeUpgrade for MigrateVNToVM { + fn on_runtime_upgrade() -> Weight { + // Migration logic here + // Adjust the migration logic if necessary to align with the expectations + // of new `UncheckedOnRuntimeUpgrade` trait. + 0 + } + } + ``` + +crates: + - name: "pallet-example-single-block-migrations" + bump: "major" + - name: "pallet-xcm" + bump: "major" + - name: "pallet-grandpa" + bump: "major" + - name: "pallet-identity" + bump: "major" + - name: "pallet-nomination-pools" + bump: "major" + - name: "pallet-society" + bump: "major" + - name: "frame-support" + bump: "major" + - name: "pallet-uniques" + bump: "major" + - name: "polkadot-runtime-parachains" + bump: "major" + - name: "polkadot-runtime-common" + bump: "major" diff --git a/prdoc/1.10.0/pr_3844.prdoc b/prdoc/1.10.0/pr_3844.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..4705fd7fc89835231769df17d2ff01ee73d132c9 --- /dev/null +++ b/prdoc/1.10.0/pr_3844.prdoc @@ -0,0 +1,26 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: Add the ability for MessageQueue to process enqueued messages on idle + +doc: + - audience: Runtime Dev + description: | + Add the option to use remaining weight on idle for processing enqueued messages. + This will increase the chances of the messages enqueued during inherent extrinsics to be processed in the same block. + New config types is added on the message-queue `Config` trait: + - `IdleMaxServiceWeight` + + example: + ```rust + parameter_types! { + // The maximum weight to be used from remaining weight for processing enqueued messages on idle + pub const IdleMaxServiceWeight: Weight = Some(Weight); + } + + type IdleMaxServiceWeight = IdleMaxServiceWeight; // or `()` to not use this feature + ``` + +crates: + - name: pallet-message-queue + bump: major diff --git a/prdoc/1.10.0/pr_3849.prdoc b/prdoc/1.10.0/pr_3849.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..a1372b60ffc65150a7986d951a768b9e365b7f91 --- /dev/null +++ b/prdoc/1.10.0/pr_3849.prdoc @@ -0,0 +1,13 @@ +title: Unrequest a pre-image when it failed to execute + +doc: + - audience: Runtime User + description: | + When a referenda finished the proposal will be scheduled. When it is scheduled, + the pre-image is requested. The pre-image is unrequested after the proposal + was executed. However, if the proposal failed to execute it wasn't unrequested. + Thus, it could not be removed from the on-chain state. This issue is now solved + by ensuring to unrequest the pre-image when it failed to execute. + +crates: + - name: pallet-scheduler diff --git a/prdoc/1.10.0/pr_3850.prdoc b/prdoc/1.10.0/pr_3850.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..8f7ce16076e852853f6edc137b756c83f3a5d924 --- /dev/null +++ b/prdoc/1.10.0/pr_3850.prdoc @@ -0,0 +1,15 @@ +title: Detect incorrect pre-image length when submitting a referenda + +doc: + - audience: Runtime User + description: | + When submitting a referenda the `proposal` is passed as argument. + The `proposal` is most of the time a reference to a `pre-image` and + which also contains the length of the `pre-image`. This pull request + adds some logic to check that if the `pre-image` already exists and if + it exists, it ensures that the length is passed correctly. This prevents + that the referenda can not be executed because of a mismatch of this + length. + +crates: + - name: pallet-referenda diff --git a/prdoc/1.10.0/pr_3854.prdoc b/prdoc/1.10.0/pr_3854.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..cfc8e246d7e1fad7b736725a08e0ce465e224640 --- /dev/null +++ b/prdoc/1.10.0/pr_3854.prdoc @@ -0,0 +1,15 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: Export unified `ParachainHostFunctions` from `cumulus-client-service` + +doc: + - audience: Node Dev + description: | + Exports `ParachainHostFunctions` to have a bundled version of `SubstrateHostFunctions` and + `cumulus_primitives_proof_size_hostfunction::storage_proof_size::HostFunctions`. This increases discoverability and makes + it more obvious that they should be used together in parachain nodes. + +crates: + - name: cumulus-client-service + bump: minor diff --git a/prdoc/1.10.0/pr_3927.prdoc b/prdoc/1.10.0/pr_3927.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..a568636d0bd087030d94e67ee459df4993bc0046 --- /dev/null +++ b/prdoc/1.10.0/pr_3927.prdoc @@ -0,0 +1,13 @@ +title: "pallet-xcm: deprecate transfer extrinsics without weight limit" + +doc: + - audience: Runtime Dev + description: | + pallet-xcm's extrinsics `teleport_assets` and `reserve_transfer_assets` have been + marked as deprecated. Please change their usage to the `limited_teleport_assets` + and `limited_reserve_transfer_assets`, respectively; or use the generic/flexible + `transfer_assets` extrinsic. + +crates: +- name: pallet-xcm + bump: minor diff --git a/prdoc/1.10.0/pr_3950.prdoc b/prdoc/1.10.0/pr_3950.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..a333521898bfa30cffa5c934351e72fd005a5843 --- /dev/null +++ b/prdoc/1.10.0/pr_3950.prdoc @@ -0,0 +1,12 @@ +title: Add `ClaimQueue` wrapper + +doc: + - audience: Node Dev + description: | + Intoduces a new wrapper type: `ClaimQueueSnapshot`. It contains a snapshot of the `ClaimQueue` + at an arbitrary relay chain block. Two methods are exposed to allow access to the claims at + specific depths. + +crates: + - name: polkadot-node-subsystem-util + bump: minor diff --git a/prdoc/1.10.0/pr_3961.prdoc b/prdoc/1.10.0/pr_3961.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..82871ffdc1a4c28c8b121df837bdb4923baf75d1 --- /dev/null +++ b/prdoc/1.10.0/pr_3961.prdoc @@ -0,0 +1,10 @@ +title: Added support for coretime-kusama/polkadot and people-kusama/polkadot + +doc: + - audience: Node Operator + description: | + The support for running `coretime-kusama` and `people-kusama` collators with `polkadot-parachain-bin` have been added. + +crates: +- name: polkadot-parachain-bin + bump: minor diff --git a/prdoc/1.4.0/pr_1246.prdoc b/prdoc/1.4.0/pr_1246.prdoc index a4d270c45cb5915760ddfbd60e5e4b3b7c08cd4a..3b5c2017f22acfba25471595c50015ae14c3e5cd 100644 --- a/prdoc/1.4.0/pr_1246.prdoc +++ b/prdoc/1.4.0/pr_1246.prdoc @@ -11,7 +11,7 @@ migrations: description: "Messages from the DMP dispatch queue will be moved over to the MQ pallet via `on_initialize`. This happens over multiple blocks and emits a `Completed` event at the end. The pallet can be un-deployed and deleted afterwards. Note that the migration reverses the order of messages, which should be acceptable as a one-off." crates: - - name: cumulus_pallet_xcmp_queue + - name: cumulus-pallet-xcmp-queue note: Pallet config must be altered according to the MR description. host_functions: [] diff --git a/prdoc/1.6.0/pr_2689.prdoc b/prdoc/1.6.0/pr_2689.prdoc index 847c3e8026cef9dfdf63f044a1b773be85b12921..5d3081e3a4ce71d872c8eb8a96fda5b2e273b684 100644 --- a/prdoc/1.6.0/pr_2689.prdoc +++ b/prdoc/1.6.0/pr_2689.prdoc @@ -1,7 +1,7 @@ # Schema: Parity PR Documentation Schema (prdoc) # See doc at https://github.com/paritytech/prdoc -title: BEEFY: Support compatibility with Warp Sync - Allow Warp Sync for Validators +title: "BEEFY: Support compatibility with Warp Sync - Allow Warp Sync for Validators" doc: - audience: Node Operator diff --git a/prdoc/1.6.0/pr_2771.prdoc b/prdoc/1.6.0/pr_2771.prdoc index 1b49162e4392ba1ad1a77d61e5b2289474b0ffbe..50fb99556ecddf39adbcece77d9b83e5d98651b4 100644 --- a/prdoc/1.6.0/pr_2771.prdoc +++ b/prdoc/1.6.0/pr_2771.prdoc @@ -6,4 +6,4 @@ doc: Enable better req-response protocol versioning, by allowing for fallback requests on different protocols. crates: - - name: sc_network + - name: sc-network diff --git a/prdoc/pr_1222.prdoc b/prdoc/1.7.0/pr_1222.prdoc similarity index 100% rename from prdoc/pr_1222.prdoc rename to prdoc/1.7.0/pr_1222.prdoc diff --git a/prdoc/pr_1230.prdoc b/prdoc/1.7.0/pr_1230.prdoc similarity index 100% rename from prdoc/pr_1230.prdoc rename to prdoc/1.7.0/pr_1230.prdoc diff --git a/prdoc/pr_1296.prdoc b/prdoc/1.7.0/pr_1296.prdoc similarity index 100% rename from prdoc/pr_1296.prdoc rename to prdoc/1.7.0/pr_1296.prdoc diff --git a/prdoc/pr_1313.prdoc b/prdoc/1.7.0/pr_1313.prdoc similarity index 100% rename from prdoc/pr_1313.prdoc rename to prdoc/1.7.0/pr_1313.prdoc diff --git a/prdoc/pr_1845.prdoc b/prdoc/1.7.0/pr_1845.prdoc similarity index 100% rename from prdoc/pr_1845.prdoc rename to prdoc/1.7.0/pr_1845.prdoc diff --git a/prdoc/pr_1871.prdoc b/prdoc/1.7.0/pr_1871.prdoc similarity index 100% rename from prdoc/pr_1871.prdoc rename to prdoc/1.7.0/pr_1871.prdoc diff --git a/prdoc/pr_2125.prdoc b/prdoc/1.7.0/pr_2125.prdoc similarity index 100% rename from prdoc/pr_2125.prdoc rename to prdoc/1.7.0/pr_2125.prdoc diff --git a/prdoc/pr_2467.prdoc b/prdoc/1.7.0/pr_2467.prdoc similarity index 100% rename from prdoc/pr_2467.prdoc rename to prdoc/1.7.0/pr_2467.prdoc diff --git a/prdoc/pr_2477-use-clone-instead-of-fork-on-pvf.prdoc b/prdoc/1.7.0/pr_2477-use-clone-instead-of-fork-on-pvf.prdoc similarity index 100% rename from prdoc/pr_2477-use-clone-instead-of-fork-on-pvf.prdoc rename to prdoc/1.7.0/pr_2477-use-clone-instead-of-fork-on-pvf.prdoc diff --git a/prdoc/pr_2587.prdoc b/prdoc/1.7.0/pr_2587.prdoc similarity index 100% rename from prdoc/pr_2587.prdoc rename to prdoc/1.7.0/pr_2587.prdoc diff --git a/prdoc/pr_2657.prdoc b/prdoc/1.7.0/pr_2657.prdoc similarity index 100% rename from prdoc/pr_2657.prdoc rename to prdoc/1.7.0/pr_2657.prdoc diff --git a/prdoc/pr_2796.prdoc b/prdoc/1.7.0/pr_2796.prdoc similarity index 100% rename from prdoc/pr_2796.prdoc rename to prdoc/1.7.0/pr_2796.prdoc diff --git a/prdoc/pr_2826.prdoc b/prdoc/1.7.0/pr_2826.prdoc similarity index 100% rename from prdoc/pr_2826.prdoc rename to prdoc/1.7.0/pr_2826.prdoc diff --git a/prdoc/pr_2889.prdoc b/prdoc/1.7.0/pr_2889.prdoc similarity index 100% rename from prdoc/pr_2889.prdoc rename to prdoc/1.7.0/pr_2889.prdoc diff --git a/prdoc/pr_2920.prdoc b/prdoc/1.7.0/pr_2920.prdoc similarity index 100% rename from prdoc/pr_2920.prdoc rename to prdoc/1.7.0/pr_2920.prdoc diff --git a/prdoc/pr_2924.prdoc b/prdoc/1.7.0/pr_2924.prdoc similarity index 100% rename from prdoc/pr_2924.prdoc rename to prdoc/1.7.0/pr_2924.prdoc diff --git a/prdoc/pr_2942.prdoc b/prdoc/1.7.0/pr_2942.prdoc similarity index 100% rename from prdoc/pr_2942.prdoc rename to prdoc/1.7.0/pr_2942.prdoc diff --git a/prdoc/pr_2970.prdoc b/prdoc/1.7.0/pr_2970.prdoc similarity index 100% rename from prdoc/pr_2970.prdoc rename to prdoc/1.7.0/pr_2970.prdoc diff --git a/prdoc/pr_3001.prdoc b/prdoc/1.7.0/pr_3001.prdoc similarity index 100% rename from prdoc/pr_3001.prdoc rename to prdoc/1.7.0/pr_3001.prdoc diff --git a/prdoc/pr_3009.prdoc b/prdoc/1.7.0/pr_3009.prdoc similarity index 100% rename from prdoc/pr_3009.prdoc rename to prdoc/1.7.0/pr_3009.prdoc diff --git a/prdoc/pr_3020.prdoc b/prdoc/1.7.0/pr_3020.prdoc similarity index 100% rename from prdoc/pr_3020.prdoc rename to prdoc/1.7.0/pr_3020.prdoc diff --git a/prdoc/pr_3029.prdoc b/prdoc/1.7.0/pr_3029.prdoc similarity index 100% rename from prdoc/pr_3029.prdoc rename to prdoc/1.7.0/pr_3029.prdoc diff --git a/prdoc/pr_3040.prdoc b/prdoc/1.7.0/pr_3040.prdoc similarity index 100% rename from prdoc/pr_3040.prdoc rename to prdoc/1.7.0/pr_3040.prdoc diff --git a/prdoc/pr_3057.prdoc b/prdoc/1.7.0/pr_3057.prdoc similarity index 100% rename from prdoc/pr_3057.prdoc rename to prdoc/1.7.0/pr_3057.prdoc diff --git a/prdoc/pr_3061.prdoc b/prdoc/1.7.0/pr_3061.prdoc similarity index 100% rename from prdoc/pr_3061.prdoc rename to prdoc/1.7.0/pr_3061.prdoc diff --git a/prdoc/pr_3077.prdoc b/prdoc/1.7.0/pr_3077.prdoc similarity index 100% rename from prdoc/pr_3077.prdoc rename to prdoc/1.7.0/pr_3077.prdoc diff --git a/prdoc/pr_3108.prdoc b/prdoc/1.7.0/pr_3108.prdoc similarity index 100% rename from prdoc/pr_3108.prdoc rename to prdoc/1.7.0/pr_3108.prdoc diff --git a/prdoc/pr_3110.prdoc b/prdoc/1.7.0/pr_3110.prdoc similarity index 100% rename from prdoc/pr_3110.prdoc rename to prdoc/1.7.0/pr_3110.prdoc diff --git a/prdoc/pr_3156.prdoc b/prdoc/1.7.0/pr_3156.prdoc similarity index 100% rename from prdoc/pr_3156.prdoc rename to prdoc/1.7.0/pr_3156.prdoc diff --git a/prdoc/1.7.0/pr_3228.prdoc b/prdoc/1.7.0/pr_3228.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..42a4893af3620057bbb4351459f26bebdefe79f9 --- /dev/null +++ b/prdoc/1.7.0/pr_3228.prdoc @@ -0,0 +1,14 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: "[pallet_xcm] Forgotten migration to XCMv4 + added `try-state` to the `pallet_xcm`" + +doc: + - audience: Runtime Dev + description: | + The current release includes the new `XCMv4`, so the runtimes must incorporate + a migration `pallet_xcm::migration::MigrateToLatestXcmVersion` to ensure + proper data migration in `pallet_xcm`. + +crates: + - name: pallet-xcm diff --git a/prdoc/1.8.0/pr_1660.prdoc b/prdoc/1.8.0/pr_1660.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..dda38c9549595526bb438e9358ed792c6bc1406c --- /dev/null +++ b/prdoc/1.8.0/pr_1660.prdoc @@ -0,0 +1,12 @@ +title: Implements a percentage cap on staking rewards from era inflation + +doc: + - audience: Runtime Dev + description: | + The `pallet-staking` exposes a new perbill configuration, `MaxStakersRewards`, which caps the + amount of era inflation that is distributed to the stakers. The remainder of the era + inflation is minted directly into `T::RewardRemainder` account. This allows the runtime to be + configured to assign a minimum inflation value per era to a specific account (e.g. treasury). + +crates: + - name: pallet-staking diff --git a/prdoc/1.8.0/pr_2061.prdoc b/prdoc/1.8.0/pr_2061.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..07df11ca0543a5c90a60996f73e96b059a7e8fe4 --- /dev/null +++ b/prdoc/1.8.0/pr_2061.prdoc @@ -0,0 +1,14 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: Add Parameters Pallet + +doc: + - audience: Runtime Dev + description: | + Adds `pallet-parameters` that allows to have parameters for pallet configs that dynamically change at runtime. Allows to be permissioned on a per-key basis and is compatible with ORML macros. + +crates: + - name: "pallet-parameters" + - name: "frame-support" + - name: "frame-support-procedural" diff --git a/prdoc/1.8.0/pr_2290.prdoc b/prdoc/1.8.0/pr_2290.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..9f0476e9152641fa0bacd3e71af77ca92bcd142f --- /dev/null +++ b/prdoc/1.8.0/pr_2290.prdoc @@ -0,0 +1,10 @@ +title: im-online pallet offcain storage cleanup + +doc: + - audience: Runtime Dev + description: | + Adds a function `clear_offchain_storage` to `pallet-im-online`. This function can be used + after the pallet was removed to clear its offchain storage. + +crates: + - name: pallet-im-online diff --git a/prdoc/1.8.0/pr_2903.prdoc b/prdoc/1.8.0/pr_2903.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..dd22fa0eea3754436e1dca0a9657eb1be8fb8151 --- /dev/null +++ b/prdoc/1.8.0/pr_2903.prdoc @@ -0,0 +1,15 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: "Implement `ConversionToAssetBalance` in asset-rate" + +doc: + - audience: Runtime Dev + description: | + Implements the `ConversionToAssetBalance` trait to the asset-rate pallet. + + Previously only the `ConversionFromAssetBalance` trait was implemented, which would allow to convert an asset balance into the corresponding native balance. + + The `ConversionToAssetBalance` allows to use pallet-asset-rate, e.g., as a mechanism to charge XCM fees in an asset that is not the native. +crates: [ ] + diff --git a/prdoc/pr_2949-async-backing-on-all-testnet-system-chains.prdoc b/prdoc/1.8.0/pr_2949-async-backing-on-all-testnet-system-chains.prdoc similarity index 100% rename from prdoc/pr_2949-async-backing-on-all-testnet-system-chains.prdoc rename to prdoc/1.8.0/pr_2949-async-backing-on-all-testnet-system-chains.prdoc diff --git a/prdoc/1.8.0/pr_3007.prdoc b/prdoc/1.8.0/pr_3007.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..17870469a21988f46a8338599f53562e4cd9acff --- /dev/null +++ b/prdoc/1.8.0/pr_3007.prdoc @@ -0,0 +1,16 @@ +title: Try State Hook for Ranked Collective. + +doc: + - audience: Runtime User + description: | + Invariants for storage items in the ranked collective pallet. Enforces the following Invariants: + 1. Total number of `Members` in storage should be >= [`MemberIndex`] of a [`Rank`] in `MemberCount`. + 2. `Rank` in Members should be in `MemberCount`. + 3.`Sum` of `MemberCount` index should be the same as the sum of all the index attained for + rank possessed by `Members` + 4. `Member` in storage of `IdToIndex` should be the same as `Member` in `IndexToId`. + 5. `Rank` in `IdToIndex` should be the same as the the `Rank` in `IndexToId`. + 6. `Rank` of the member `who` in `IdToIndex` should be the same as the `Rank` of + the member `who` in `Members` +crates: +- name: pallet-ranked-collective diff --git a/prdoc/1.8.0/pr_3052.prdoc b/prdoc/1.8.0/pr_3052.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..09f3cf59e4da467e277aeb3d36c737cd8e6a2a85 --- /dev/null +++ b/prdoc/1.8.0/pr_3052.prdoc @@ -0,0 +1,15 @@ +title: "Fixes a scenario where a nomination pool's `TotalValueLocked` is out of sync due to staking's implicit withdraw" + +doc: + - audience: Runtime Dev + description: | + The nomination pools pallet `TotalValueLocked` may get out of sync if the staking pallet + does implicit withdrawal of unlocking chunks belonging to a bonded pool stash. This fix + is based on a new method on the `OnStakingUpdate` traits, `on_withdraw`, which allows the + nomination pools pallet to adjust the `TotalValueLocked` every time there is an implicit or + explicit withdrawal from a bonded pool's stash. + +crates: + - name: "pallet-nomination-pools" + - name: "pallet-staking" + - name: "sp-staking" diff --git a/prdoc/1.8.0/pr_3060.prdoc b/prdoc/1.8.0/pr_3060.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..4cd6674ebb2e91b03ed0f4c5d1626bae58c82286 --- /dev/null +++ b/prdoc/1.8.0/pr_3060.prdoc @@ -0,0 +1,15 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: Add retry mechanics to `pallet-scheduler` + +doc: + - audience: Runtime Dev + description: | + This PR adds retry mechanics to pallet-scheduler, as described in the issue above. + Users can now set a retry configuration for a task so that, in case its scheduled run fails, it will be retried after a number of blocks, for a specified number of times or until it succeeds. + If a retried task runs successfully before running out of retries, its remaining retry counter will be reset to the initial value. If a retried task runs out of retries, it will be removed from the schedule. + Tasks which need to be scheduled for a retry are still subject to weight metering and agenda space, same as a regular task. Periodic tasks will have their periodic schedule put on hold while the task is retrying. + +crates: + - name: pallet-scheduler diff --git a/prdoc/1.8.0/pr_3079.prdoc b/prdoc/1.8.0/pr_3079.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..c745c1ffbfe5775f205dc5510a637dbfd4e6f56c --- /dev/null +++ b/prdoc/1.8.0/pr_3079.prdoc @@ -0,0 +1,15 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: Implement transaction_unstable_broadcast and transaction_unstable_stop + +doc: + - audience: Node Dev + description: | + A new RPC class is added to handle transactions. The `transaction_unstable_broadcast` broadcasts + the provided transaction to the peers of the node, until the `transaction_unstable_stop` is called. + The APIs are marked as unstable and subject to change in the future. + To know if the transaction was added to the chain, users can decode the bodies of announced finalized blocks. + This is a low-level approach for `transactionWatch_unstable_submitAndWatch`. + +crates: [ ] diff --git a/prdoc/pr_3154.prdoc b/prdoc/1.8.0/pr_3154.prdoc similarity index 100% rename from prdoc/pr_3154.prdoc rename to prdoc/1.8.0/pr_3154.prdoc diff --git a/prdoc/1.8.0/pr_3160.prdoc b/prdoc/1.8.0/pr_3160.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..22305b6635aa505f4416b88d5b9f83ebc6163f28 --- /dev/null +++ b/prdoc/1.8.0/pr_3160.prdoc @@ -0,0 +1,12 @@ +title: "prospective-parachains: allow requesting a chain of backable candidates" + +topic: Node + +doc: + - audience: Node Dev + description: | + Enable requesting a chain of multiple backable candidates. Will be used by the provisioner + to build paras inherent data for elastic scaling. + +crates: + - name: polkadot-node-core-prospective-parachains diff --git a/prdoc/pr_3166.prdoc b/prdoc/1.8.0/pr_3166.prdoc similarity index 100% rename from prdoc/pr_3166.prdoc rename to prdoc/1.8.0/pr_3166.prdoc diff --git a/prdoc/1.8.0/pr_3184.prdoc b/prdoc/1.8.0/pr_3184.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..36ba92bcf5a79ac75934f4fa08e1e02d78b6175e --- /dev/null +++ b/prdoc/1.8.0/pr_3184.prdoc @@ -0,0 +1,10 @@ +title: "Contracts: Remove no longer enforced limits from the Schedule" + +doc: + - audience: Runtime Dev + description: | + The limits are no longer in use and do nothing. Every builder overwritting them + can just adapt their code to remove them without any consequence. + +crates: + - name: pallet-contracts diff --git a/prdoc/1.8.0/pr_3212.prdoc b/prdoc/1.8.0/pr_3212.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..a9de1e28cdfe2294948fb3c954b9b417c09d149b --- /dev/null +++ b/prdoc/1.8.0/pr_3212.prdoc @@ -0,0 +1,9 @@ +title: "Ranked collective introduce `Add` and `Remove` origins" + +doc: + - audience: Runtime Dev + description: | + Add two new origins to the ranked-collective pallet. One to add new members and one to remove members, named `AddOrigin` and `RemoveOrigin` respectively. + +crates: + - name: pallet-ranked-collective diff --git a/prdoc/1.8.0/pr_3225.prdoc b/prdoc/1.8.0/pr_3225.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..1dec40ccfbe96f5457aeea6235143b95f1ec9754 --- /dev/null +++ b/prdoc/1.8.0/pr_3225.prdoc @@ -0,0 +1,11 @@ +title: "Introduce submit_finality_proof_ex call to bridges GRANDPA pallet" + +doc: + - audience: Runtime Dev + description: | + New call has been added to pallet-bridge-grandpa: submit_finality_proof_ex. It should be + used instead of deprecated submit_finality_proof. submit_finality_proof will be removed + later. + +crates: + - name: "pallet-bridge-grandpa" diff --git a/prdoc/1.8.0/pr_3230.prdoc b/prdoc/1.8.0/pr_3230.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..e6d32f918d3911d691e90ff83fd6bc6695da4c25 --- /dev/null +++ b/prdoc/1.8.0/pr_3230.prdoc @@ -0,0 +1,19 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: rpc server remove prometheus metrics `substrate_rpc_requests_started/finished` and refactor WS ping/pongs. + +doc: + - audience: Node Operator + description: | + This PR updates the rpc server library to `jsonrpsee v0.22` to utilize new APIs. + + Breaking changes: + - Remove prometheus RPC metrics `substrate_rpc_requests_started` and `substrate_rpc_requests_finished`. + - The RPC server now disconnects inactive peers that didn't acknowledge WebSocket + pings more than three times in time. + + Added: + - Add prometheus RPC `substrate_rpc_sessions_time` to collect the duration for each WebSocket + session. +crates: [ ] diff --git a/prdoc/1.8.0/pr_3232.prdoc b/prdoc/1.8.0/pr_3232.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..c6a339931c6f56772e0fbaa3a4a8992e7b3050c9 --- /dev/null +++ b/prdoc/1.8.0/pr_3232.prdoc @@ -0,0 +1,13 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: Validate code when scheduling uprades + +doc: + - audience: Runtime User + description: | + Adds checks to ensure that the validation code is valid before scheduling + a code upgrade. + +crates: + - name: polkadot-runtime-parachains diff --git a/prdoc/1.8.0/pr_3243.prdoc b/prdoc/1.8.0/pr_3243.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..5bad985a2672453b56ee3828483d7035b71d4b79 --- /dev/null +++ b/prdoc/1.8.0/pr_3243.prdoc @@ -0,0 +1,13 @@ +title: Don't fail fast if the weight limit of a cross contract call is too big + +doc: + - audience: Runtime Dev + description: | + Cross contracts calls will now be executed even if the supplied weight + limit is bigger than the reamining weight. If the **actual** weight is too low + they will fail in the cross contract call and roll back. This is different from the + old behaviour where the limit for the cross contract call must be smaller than + the remaining weight. + +crates: + - name: pallet-contracts diff --git a/prdoc/1.8.0/pr_3244.prdoc b/prdoc/1.8.0/pr_3244.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..3d851c8afe0d2453a943caa1f0342d7ec76fe53c --- /dev/null +++ b/prdoc/1.8.0/pr_3244.prdoc @@ -0,0 +1,18 @@ +title: "Make the `benchmark pallet` command only require a Hasher" + +doc: + - audience: Node Dev + description: | + Currently the `benchmark pallet` command requires a `Block` type, while only using its hasher. + Now this is changed to only require the hasher. This means to use `HashingFor` in the + place where `Block` was required. + Example patch for your node with `cmd` being `BenchmarkCmd::Pallet(cmd)`: + + ```patch + - cmd.run::(config) + + cmd.run::, ()>(config) + ``` + +crates: + - name: sc-client-db + - name: frame-benchmarking-cli diff --git a/prdoc/1.8.0/pr_3272.prdoc b/prdoc/1.8.0/pr_3272.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..a03113cf9739b741a37c5d8b4fb41dd59ede0d9f --- /dev/null +++ b/prdoc/1.8.0/pr_3272.prdoc @@ -0,0 +1,11 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: Westend Coretime Runtime + +doc: + - audience: Runtime User + description: | + Add the Broker pallet to the Westend Coretime Chain runtime for the main functionality and sales to start. + +crates: [ ] diff --git a/prdoc/1.8.0/pr_3301.prdoc b/prdoc/1.8.0/pr_3301.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..19d1c5f1c18907cd1996603aade66990c358efeb --- /dev/null +++ b/prdoc/1.8.0/pr_3301.prdoc @@ -0,0 +1,11 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: rpc server add rate limiting. + +doc: + - audience: Node Operator + description: | + Add rate limiting for RPC server which can be utilized by the CLI `--rpc-rate-limit ` + The rate-limiting is disabled by default. +crates: [ ] diff --git a/prdoc/1.8.0/pr_3308.prdoc b/prdoc/1.8.0/pr_3308.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..386cbd6230b42144741f9a85490cddb009221ab2 --- /dev/null +++ b/prdoc/1.8.0/pr_3308.prdoc @@ -0,0 +1,14 @@ +title: "Parachains-Aura: Only produce once per slot" + +doc: + - audience: Node Dev + description: | + With the introduction of asynchronous backing the relay chain allows parachain to include blocks every 6 seconds. + The Cumulus Aura implementations, besides the lookahead collator, are building blocks when there is a free slot for + the parachain in the relay chain. Most parachains are still running with a 12s slot duration and not allowing + to build multiple blocks per slot. But, the block production logic will be triggered every 6s, resulting in error + logs like: "no space left for the block in the unincluded segment". This is solved by ensuring that we don't build + multiple blocks per slot. + +crates: + - name: "cumulus-client-consensus-aura" diff --git a/prdoc/1.8.0/pr_3319.prdoc b/prdoc/1.8.0/pr_3319.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..b84ec25a22eda2a561fb44eb1e732a3c36921418 --- /dev/null +++ b/prdoc/1.8.0/pr_3319.prdoc @@ -0,0 +1,11 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: Add Coretime to Westend + +doc: + - audience: Runtime User + description: | + Add the on demand and coretime assigners and migrate from legacy parachain auctions to coretime. + +crates: [ ] diff --git a/prdoc/1.8.0/pr_3325.prdoc b/prdoc/1.8.0/pr_3325.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..eb8126dc912520c049f44fb760bb759caf6336f9 --- /dev/null +++ b/prdoc/1.8.0/pr_3325.prdoc @@ -0,0 +1,10 @@ +title: "Ensure `TracksInfo` tracks are sorted by ID." + +doc: + - audience: Runtime Dev + description: | + Add a `integrity_check` function to trait `TracksInfo` and explicitly state that tracks must + always be sorted by ID. The referenda pallet now also uses this check in its `integrity_test`. + +crates: + - name: pallet-referenda diff --git a/prdoc/1.8.0/pr_3358.prdoc b/prdoc/1.8.0/pr_3358.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..b6a03b3872f4e7d24305dfd924ccb8424f6e39b2 --- /dev/null +++ b/prdoc/1.8.0/pr_3358.prdoc @@ -0,0 +1,11 @@ +title: Do not stall finality on spam disputes + +doc: + - audience: Node Operator + description: | + This PR fixes the issue that periodically caused + finality stalls on Kusama due to disputes happening + there in combination with disputes spam protection mechanism. + See: https://github.com/paritytech/polkadot-sdk/issues/3345 + +crates: [ ] diff --git a/prdoc/1.8.0/pr_3361.prdoc b/prdoc/1.8.0/pr_3361.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..65baa9e94a0e38a4af16bf6f69aab7526c4ad920 --- /dev/null +++ b/prdoc/1.8.0/pr_3361.prdoc @@ -0,0 +1,10 @@ +title: Fix double charge of host function weight + +doc: + - audience: Runtime Dev + description: | + Fixed a double charge which can lead to quadratic gas consumption of + the `call` and `instantiate` host functions. + +crates: + - name: pallet-contracts diff --git a/prdoc/1.8.0/pr_3364.prdoc b/prdoc/1.8.0/pr_3364.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..1e7a6a5278d730a71a0bf5a928815812d8576386 --- /dev/null +++ b/prdoc/1.8.0/pr_3364.prdoc @@ -0,0 +1,12 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: rpc server expose batch request configuration + +doc: + - audience: Node Operator + description: | + Add functionality to limit RPC batch requests by two new CLI options: + --rpc-disable-batch-request - disable batch requests on the server + --rpc-max-batch-request-len - limit batches to LEN on the server +crates: [ ] diff --git a/prdoc/1.8.0/pr_3370.prdoc b/prdoc/1.8.0/pr_3370.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..f40d3821b9fed3eae49803128a9ff61058cd5d02 --- /dev/null +++ b/prdoc/1.8.0/pr_3370.prdoc @@ -0,0 +1,13 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: "Remove `key` getter from pallet-sudo" + +doc: + - audience: Runtime Dev + description: | + Removed the `key` getter function from the sudo pallet. There is no replacement for getting + the key currently. + +crates: + - name: pallet-sudo diff --git a/prdoc/1.8.0/pr_3384.prdoc b/prdoc/1.8.0/pr_3384.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..c19464977582a37b11760c81491a7ea7cf3ebced --- /dev/null +++ b/prdoc/1.8.0/pr_3384.prdoc @@ -0,0 +1,14 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: "[pallet_contracts] stabilize `call_v2`, `instantiate_v2`, `lock_dependency` and `unlock_dependency`" + +doc: + - audience: Runtime Dev + description: | + These APIs are currently unstable and are being stabilized in this PR. + Note: `add_delegate_dependency` and `remove_delegate_dependency` have been renamed to `lock_dependency` and `unlock_dependency` respectively. + +crates: + - name: pallet-contracts-uapi + - name: pallet-contracts diff --git a/prdoc/1.8.0/pr_3395.prdoc b/prdoc/1.8.0/pr_3395.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..a10fb84fd7f56211602fadaf656a25ea5d382255 --- /dev/null +++ b/prdoc/1.8.0/pr_3395.prdoc @@ -0,0 +1,14 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: "`benchmarking-cli` `pallet` subcommand: refactor `--list` and add `--all` option" + +doc: + - audience: Node Dev + description: | + `pallet` subcommand's `--list` now accepts two values: "all" and "pallets". The former will list all available benchmarks, the latter will list only pallets. + Also adds `--all` to run all the available benchmarks and `--no-csv-header` to omit the csv-style header in the output. + NOTE: changes are backward compatible. + +crates: + - name: frame-benchmarking-cli diff --git a/prdoc/1.8.0/pr_3415.prdoc b/prdoc/1.8.0/pr_3415.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..c56a5d3ffaa129d4aba36e1e11905e9d72b936cb --- /dev/null +++ b/prdoc/1.8.0/pr_3415.prdoc @@ -0,0 +1,9 @@ +title: "[pallet-contracts] Add APIVersion to the config." + +doc: + - audience: Runtime Dev + description: | + Add `APIVersion` to the config to communicate the state of the Host functions exposed by the pallet. + +crates: + - name: pallet-contracts diff --git a/prdoc/1.8.0/pr_3435.prdoc b/prdoc/1.8.0/pr_3435.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..7d7896bff7d405a0a1dd34f09bc2aff0834b9ff2 --- /dev/null +++ b/prdoc/1.8.0/pr_3435.prdoc @@ -0,0 +1,16 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: Fix BEEFY-related gossip messages error logs + +doc: + - audience: Node Operator + description: | + Added logic to pump the gossip engine while waiting for other things + to make sure gossiped messages get consumed (practically discarded + until worker is fully initialized). + This fixes an issue where node operators saw error logs, and fixes + potential RAM bloat when BEEFY initialization takes a long time + (i.e. during clean sync). +crates: + - name: sc-consensus-beefy diff --git a/prdoc/1.8.0/pr_3477.prdoc b/prdoc/1.8.0/pr_3477.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..26e96d3635b14634ca523797d741ddaf224aa9ae --- /dev/null +++ b/prdoc/1.8.0/pr_3477.prdoc @@ -0,0 +1,11 @@ +title: Allow parachain which acquires multiple coretime cores to make progress + +doc: + - audience: Node Operator + description: | + Adds the needed changes so that parachains which acquire multiple coretime cores can still make progress. + Only one of the cores will be able to be occupied at a time. + Only works if the ElasticScalingMVP node feature is enabled in the runtime and the block author validator is + updated to include this change. + +crates: [ ] diff --git a/prdoc/1.9.0/pr_1378.prdoc b/prdoc/1.9.0/pr_1378.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..6533dcb663030718fdcd3ffc353b2ae8b2a92407 --- /dev/null +++ b/prdoc/1.9.0/pr_1378.prdoc @@ -0,0 +1,27 @@ +title: Construct Runtime V2 - An outer macro approach to define the runtime + +doc: + - audience: Runtime Dev + description: | + Introduces `#[frame_support::runtime]` that can be attached to a mod to define a runtime. The items + in this mod can be attached to the following attributes to define the key components of the runtime. + 1. `#[runtime::runtime]` attached to a struct defines the main runtime + 2. `#[runtime::derive]` attached to the runtime struct defines the types generated by the runtime + 3. `#[runtime::pallet_index]` must be attached to a pallet to define its index + 4. `#[runtime::disable_call]` can be optionally attached to a pallet to disable its calls + 5. `#[runtime::disable_unsigned]` can be optionally attached to a pallet to disable unsigned calls + 6. A pallet instance can be defined as `TemplateModule: pallet_template` + An optional attribute can be defined as `#[frame_support::runtime(legacy_ordering)]` to ensure that + the order of hooks is same as the order of pallets (and not based on the pallet_index). This is to support + legacy runtimes and should be avoided for new ones. + +migrations: + db: [] + + runtime: [] + +crates: + - name: frame-support + - name: frame-support-procedural + +host_functions: [] diff --git a/prdoc/1.9.0/pr_1554.prdoc b/prdoc/1.9.0/pr_1554.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..bfce7c5edafd9df39ff9235f18536591b1d47158 --- /dev/null +++ b/prdoc/1.9.0/pr_1554.prdoc @@ -0,0 +1,14 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: Runtime Upgrade ref docs and Single Block Migration example pallet + +doc: + - audience: Runtime Dev + description: | + `frame_support::traits::GetStorageVersion::current_storage_version` has been renamed `frame_support::traits::GetStorageVersion::in_code_storage_version`. + A simple find-replace is sufficient to handle this change. + +crates: + - name: "frame-support" + diff --git a/prdoc/1.9.0/pr_1781.prdoc b/prdoc/1.9.0/pr_1781.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..e3560842d15ab249539ac2de172dc5914e92cc19 --- /dev/null +++ b/prdoc/1.9.0/pr_1781.prdoc @@ -0,0 +1,45 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: "Multi-Block-Migrations, `poll` hook and new System Callbacks" + +doc: + - audience: Runtime Dev + description: | + The major things that this MR touches are: + + **Multi-Block-Migrations**: `pallet-migrations` is introduced that can be configured in the + `System` of a runtime to act as multi-block migrator. The `migrations` pallet then in turn + receives the list of MBMs as config parameter. The list of migrations can be an aggregated + tuple of `SteppedMigration` trait implementation. + It is paramount that the `migrations` pallet is configured in `System` once it is deployed. A + test is in place to double check this. + + To integrate this into your runtime, it is only necessary to change the return type of + `initialize_block` to `RuntimeExecutiveMode`. For extended info please see + https://github.com/paritytech/polkadot-sdk/pull/1781. + + **poll**: a new pallet hook named `poll` is added. This can be used for places where the code + that should be executed is not deadline critical. Runtime devs are advised to skim their usage + of `on_initialize` and `on_finalize` to see whether they can be replace with `poll`. `poll` is + not guaranteed to be called each block. In fact it will not be called when MBMs are ongoing. + + **System Callbacks**: The `system` pallet gets five new config items - all of which can be + safely set to `()` as default. They are: + - `SingleBlockMigrations`: replaces the `Executive` now for configuring migrations. + - `MultiBlockMigrator`: the `pallet-migrations` would be set here, if deployed. + - `PreInherents`: a hook that runs before any inherent. + - `PostInherents`: a hook to run between inherents and `poll`/MBM logic. + - `PostTransactions`: a hook to run after all transactions but before `on_idle`. + +crates: + - name: frame-executive + - name: frame-system + - name: frame-support + - name: frame-support-procedural + - name: pallet-migrations + - name: sc-basic-authorship + - name: sc-block-builder + - name: sp-api + - name: sp-api-proc-macro + - name: sp-runtime diff --git a/prdoc/1.9.0/pr_2393.prdoc b/prdoc/1.9.0/pr_2393.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..708d017fafd50d103c0470997c3a7571e0ff30c1 --- /dev/null +++ b/prdoc/1.9.0/pr_2393.prdoc @@ -0,0 +1,16 @@ +title: "[XCMP] Use the number of 'ready' pages in XCMP suspend logic" + +doc: + - audience: Runtime Dev + description: | + Semantics of the suspension logic in the XCMP queue pallet change from using the number of + total pages to the number of 'ready' pages. The number of ready pages is now also exposed by + the `MessageQueue` pallet to downstream via the queue `footprint`. + +crates: + - name: cumulus-pallet-xcmp-queue + bump: patch + - name: pallet-message-queue + bump: patch + - name: frame-support + bump: major diff --git a/prdoc/1.9.0/pr_3002.prdoc b/prdoc/1.9.0/pr_3002.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..511a07e39c47d5055bd161fda0e748f96e4a9997 --- /dev/null +++ b/prdoc/1.9.0/pr_3002.prdoc @@ -0,0 +1,29 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: PoV Reclaim Runtime Side +author: skunert +topic: runtime +doc: + - audience: Runtime Dev + description: | + Adds a mechanism to reclaim proof size weight. + 1. Introduces a new `SignedExtension` that reclaims the difference + between benchmarked proof size weight and actual consumed proof size weight. + 2. Introduces a manual mechanism, `StorageWeightReclaimer`, to reclaim excess storage weight for situations + that require manual weight management. The most prominent case is the `on_idle` hook. + 3. Adds the `storage_proof_size` host function to the PVF. Parachain nodes should add it to ensure compatibility. + + To enable proof size reclaiming, add the host `storage_proof_size` host function to the parachain node. Add the + `StorageWeightReclaim` `SignedExtension` to your runtime and enable proof recording during block import. + + +crates: + - name: "cumulus-primitives-storage-weight-reclaim" +host_functions: + - name: "storage_proof_size" + description: | + This host function is used to pass the current size of the storage proof to the runtime. + It was introduced before but becomes relevant now. + Note: This host function is intended to be used through `cumulus_primitives_storage_weight_reclaim::get_proof_size`. + Direct usage is not recommended. diff --git a/prdoc/1.9.0/pr_3187.prdoc b/prdoc/1.9.0/pr_3187.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..bda41142d86c8f9c1af8398e0cf21cdfeebebfa7 --- /dev/null +++ b/prdoc/1.9.0/pr_3187.prdoc @@ -0,0 +1,16 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: Retrying an execution on failed runtime construction + +doc: + - audience: Node Dev + description: | + If a runtime construction error happened during the execution request, then the artifact is re-prepared + and the execution request is retried at most once. See also the related issue. + +crates: + - name: polkadot-node-core-candidate-validation + - name: polkadot-node-core-pvf + - name: polkadot-node-core-pvf-execute-worker + - name: polkadot-node-core-pvf-common diff --git a/prdoc/1.9.0/pr_3231.prdoc b/prdoc/1.9.0/pr_3231.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..26e96d3635b14634ca523797d741ddaf224aa9ae --- /dev/null +++ b/prdoc/1.9.0/pr_3231.prdoc @@ -0,0 +1,11 @@ +title: Allow parachain which acquires multiple coretime cores to make progress + +doc: + - audience: Node Operator + description: | + Adds the needed changes so that parachains which acquire multiple coretime cores can still make progress. + Only one of the cores will be able to be occupied at a time. + Only works if the ElasticScalingMVP node feature is enabled in the runtime and the block author validator is + updated to include this change. + +crates: [ ] diff --git a/prdoc/1.9.0/pr_3233.prdoc b/prdoc/1.9.0/pr_3233.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..ed4e8cce31f75b4bd98f91f7d15ec3fae0761354 --- /dev/null +++ b/prdoc/1.9.0/pr_3233.prdoc @@ -0,0 +1,12 @@ +title: "provisioner: allow multiple cores assigned to the same para" + +topic: Node + +doc: + - audience: Node Dev + description: | + Enable supplying multiple backable candidates to the paras_inherent pallet for the same paraid. + +crates: + - name: polkadot-node-core-prospective-parachains + - name: polkadot-node-core-provisioner diff --git a/prdoc/1.9.0/pr_3324.prdoc b/prdoc/1.9.0/pr_3324.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..0425fbf317c8620125e9fe64f96a0eb99e4595f0 --- /dev/null +++ b/prdoc/1.9.0/pr_3324.prdoc @@ -0,0 +1,13 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: "Fix weight calculation and event emission in pallet-membership" + +doc: + - audience: Runtime Dev + description: | + Bug fix for the membership pallet to use correct weights. Also no event will be emitted + anymore when `change_key` is called with identical accounts. + +crates: + - name: pallet-membership diff --git a/prdoc/1.9.0/pr_3371.prdoc b/prdoc/1.9.0/pr_3371.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..605d540772f0b249962088463237dda2e6690d6c --- /dev/null +++ b/prdoc/1.9.0/pr_3371.prdoc @@ -0,0 +1,19 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: removed `pallet::getter` from example pallets + +doc: + - audience: Runtime Dev + description: | + This PR removes all the `pallet::getter` usages from the template pallets found in the Substrate and Cumulus template nodes, and from the Substrate example pallets. + The purpose is to discourage developers to use this macro, that is currently being removed and soon will be deprecated. + +crates: + - name: pallet-template + - name: pallet-parachain-template + - name: pallet-example-basic + - name: pallet-example-kitchensink + - name: pallet-example-offchain-worker + - name: pallet-example-split + diff --git a/prdoc/1.9.0/pr_3377.prdoc b/prdoc/1.9.0/pr_3377.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..8e5b3935512b1b2dd12836e940a5d95040df8cf2 --- /dev/null +++ b/prdoc/1.9.0/pr_3377.prdoc @@ -0,0 +1,14 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: Permissioned contract deployment + +doc: + - audience: Runtime Dev + description: | + This PR introduces two new config types that specify the origins allowed to + upload and instantiate contract code. However, this check is not enforced when + a contract instantiates another contract. + +crates: +- name: pallet-contracts diff --git a/prdoc/1.9.0/pr_3378.prdoc b/prdoc/1.9.0/pr_3378.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..2470fc158519e31e297a7cbefcae3bc54eb8f708 --- /dev/null +++ b/prdoc/1.9.0/pr_3378.prdoc @@ -0,0 +1,13 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: Remove deprecated GenesisConfig + +doc: + - audience: Runtime Dev + description: | + Removes deprecated type `GenesisConfig`, it was replaced by `RuntimeGenesisConfig` on May 24 of 2023. + The type `GenesisConfig` was deprecated on May 24 of 2023 [#14210](https://github.com/paritytech/substrate/pull/14210) + +crates: + - name: frame-support-procedural \ No newline at end of file diff --git a/prdoc/1.9.0/pr_3403.prdoc b/prdoc/1.9.0/pr_3403.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..086e769da3c39c4d3def42791c18a82948676386 --- /dev/null +++ b/prdoc/1.9.0/pr_3403.prdoc @@ -0,0 +1,22 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: "Add `claim_assets` extrinsic to `pallet-xcm`" + +doc: + - audience: Runtime User + description: | + There's a new extrinsic in `pallet-xcm` for claiming assets. + This means that if your assets ever get trapped while teleporting or doing reserve asset transfers, + you can easily claim them by calling this new extrinsic. + - audience: Runtime Dev + description: | + There's a new extrinsic in `pallet-xcm` that needs a new configuration item for its benchmarks. + It's a simple function in `pallet_xcm::benchmarking::Config`, `get_asset`, that returns a valid asset + handled by the AssetTransactor of the chain. + If you're already using `pallet-xcm-benchmarks`, then you already have this function there and can + just copy and paste it. + +crates: + - name: pallet-xcm + - name: staging-xcm diff --git a/prdoc/1.9.0/pr_3411.prdoc b/prdoc/1.9.0/pr_3411.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..d847d6756ac7f019cf12e4d9e7993ebeda1273ab --- /dev/null +++ b/prdoc/1.9.0/pr_3411.prdoc @@ -0,0 +1,11 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: add Encointer as trusted teleporter for Westend + +doc: + - audience: Runtime Dev + description: | + add Encointer as trusted teleporter for Westend with ParaId 1003 + +crates: [ ] diff --git a/prdoc/1.9.0/pr_3412.prdoc b/prdoc/1.9.0/pr_3412.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..1ee6edfeb837f81646d32633ed009d2cded4dcfe --- /dev/null +++ b/prdoc/1.9.0/pr_3412.prdoc @@ -0,0 +1,17 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: "[FRAME] Add genesis test and remove some checks" + +doc: + - audience: Runtime Dev + description: | + The construct_runtime macro now generates a test to assert that all `GenesisConfig`s of all + pallets can be build within the runtime. This ensures that the `BuildGenesisConfig` runtime + API works. + Further, some checks from a few pallets were removed to make this pass. + +crates: + - name: pallet-babe + - name: cumulus-pallet-aura-ext + - name: pallet-session diff --git a/prdoc/1.9.0/pr_3447.prdoc b/prdoc/1.9.0/pr_3447.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..1d8d4f409f77cf29247d35d196bccff390896881 --- /dev/null +++ b/prdoc/1.9.0/pr_3447.prdoc @@ -0,0 +1,13 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: Use generic hash for runtime wasm in resolve_state_version_from_wasm + +doc: + - audience: Node Dev + description: | + Changes the runtime hash algorithm used in resolve_state_version_from_wasm from DefaultHasher to a caller-provided + one (usually HashingFor). Fixes a bug where the runtime wasm was being compiled again when it was not + needed, because the hash did not match +crates: + - name: sc-chain-spec diff --git a/prdoc/1.9.0/pr_3453.prdoc b/prdoc/1.9.0/pr_3453.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..1f01440f722fb9984231f690a20c517b9d4bf0a1 --- /dev/null +++ b/prdoc/1.9.0/pr_3453.prdoc @@ -0,0 +1,13 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: "[pallet-nomination-pools]: `chill` is permissionless if depositor's stake is less than `min_nominator_bond`" + +doc: + - audience: Runtime Dev + description: | + Nomination pools currently have an issue whereby member funds cannot be unbonded if the depositor bonded amount is less than `MinNominatorBond`. + This PR makes the `chill` function permissionless if this condition is met. + Consequently, `nominate` function also checks for `depositor` to have at least `MinNominatorBond`, and returns `MinimumBondNotMet` error if not. +crates: + - name: pallet-nomination-pools diff --git a/prdoc/1.9.0/pr_3454.prdoc b/prdoc/1.9.0/pr_3454.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..7f564258f23a57f3784c2ee055176153f006734f --- /dev/null +++ b/prdoc/1.9.0/pr_3454.prdoc @@ -0,0 +1,19 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: "Introduce storage attr macro #[disable_try_decode_storage] and set it on System::Events and ParachainSystem::HostConfiguration" + +doc: + - audience: Runtime Dev + description: | + Allows marking storage items with \#[disable_try_decode_storage], which disables that storage item from being decoded + during try_decode_entire_state calls. + + Applied the attribute to System::Events to close https://github.com/paritytech/polkadot-sdk/issues/2560. + Applied the attribute to ParachainSystem::HostConfiguration to resolve periodic issues with it. + +crates: + - name: frame-support-procedural + - name: frame-system + - name: cumulus-pallet-parachain-system + diff --git a/prdoc/1.9.0/pr_3456.prdoc b/prdoc/1.9.0/pr_3456.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..c7327e17e57d74614fd1b593cc222faf4a87192d --- /dev/null +++ b/prdoc/1.9.0/pr_3456.prdoc @@ -0,0 +1,15 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: Removed `pallet::getter` usage from `pallet-collective` + +doc: + - audience: Runtime Dev + description: | + This PR removes `pallet::getter` usage from `pallet-collective`, and updates dependant code accordingly. + The syntax `StorageItem::::get()` should be used instead. + +crates: + - name: pallet-collective + - name: kitchensink-runtime + - name: collectives-westend-runtime diff --git a/prdoc/1.9.0/pr_3460.prdoc b/prdoc/1.9.0/pr_3460.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..1f16fe0890836dd25bfcaa75d5fc647688230dd8 --- /dev/null +++ b/prdoc/1.9.0/pr_3460.prdoc @@ -0,0 +1,26 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: Repot all templates + +doc: + - audience: Runtime Dev + description: | + This PR moves all templates into a single folder in the polkadot-sdk repo (`/templates`) and + unifies their crate names as well. Most notably, the crate name for what was formerly known + as `node-template` is no `solochain-template-node`. The other two crates in the template are + consequently called: `solochain-runtime-template` and `pallet-solochain-template`. + The other two template crate names follow a similar patter, just replacing `solochain` with + `parachain` or `minimal`. + + This PR is part of a bigger step toward automating the template repositories, see the + following: https://github.com/paritytech/polkadot-sdk/issues/3155 + +# the following crates are removed and renamed, although none are released. +crates: + - name: minimal-template-runtime # formerly called minimal-runtime + - name: minimal-template-node # formerly called minimal-node + - name: solochain-template-node # formerly called node-template + - name: solochain-template-runtime # formerly called node-template-runtime + - name: parachain-template-runtime # formerly called parachain-runtime + - name: parachain-template-runtime # formerly called parachain-node diff --git a/prdoc/1.9.0/pr_3491.prdoc b/prdoc/1.9.0/pr_3491.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..e36afb916a6226c3609b1e2eb8aacf6af8127d32 --- /dev/null +++ b/prdoc/1.9.0/pr_3491.prdoc @@ -0,0 +1,12 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: Remove Deprecated OldWeight + +doc: + - audience: Runtime Dev + description: | + Removed deprecated sp_weights::OldWeight type. Use [`weight_v2::Weight`] instead. + +crates: + - name: frame-support diff --git a/prdoc/1.9.0/pr_3504.prdoc b/prdoc/1.9.0/pr_3504.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..90a8ddd38b8f7f8159199ac6423ffee3dc645291 --- /dev/null +++ b/prdoc/1.9.0/pr_3504.prdoc @@ -0,0 +1,13 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: add prometheus label "is_rate_limited" to rpc calls + +doc: + - audience: Node Operator + description: | + This PR adds a label "is_rate_limited" to the prometheus metrics "substrate_rpc_calls_time" and "substrate_rpc_calls_finished" + than can be used to distinguish rate-limited RPC calls from other RPC calls. Because rate-limited RPC calls may take + tens of seconds. + +crates: [ ] diff --git a/prdoc/1.9.0/pr_3505.prdoc b/prdoc/1.9.0/pr_3505.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..b55972927c33002c918aa4b1cd147e9ee01a3e52 --- /dev/null +++ b/prdoc/1.9.0/pr_3505.prdoc @@ -0,0 +1,36 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: Removes `as [disambiguation_path]` from the required syntax in `derive_impl` + +doc: + - audience: Runtime Dev + description: | + This PR removes the need to specify `as [disambiguation_path]` for cases where the trait + definition resides within the same scope as default impl path. + + For example, in the following macro invocation + ```rust + #[derive_impl(frame_system::config_preludes::TestDefaultConfig)] + impl frame_system::Config for Runtime { + ... + } + ``` + the trait `DefaultConfig` lies within the `frame_system` scope and `TestDefaultConfig` impls + the `DefaultConfig` trait. + + Using this information, we can compute the disambiguation path internally, thus removing the + need of an explicit specification: + ```rust + #[derive_impl(frame_system::config_preludes::TestDefaultConfig)] + impl frame_system::Config for Runtime { + ... + } + ``` + + In cases where the trait lies outside this scope, we would still need to specify it explicitly, + but this should take care of most (if not all) uses of `derive_impl` within FRAME's context. + +crates: + - name: frame-support-procedural + - name: pallet-default-config-example diff --git a/prdoc/1.9.0/pr_3510.prdoc b/prdoc/1.9.0/pr_3510.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..6ee2f9a81f750ef0c64a2b8d8197e1e44d7e9f0c --- /dev/null +++ b/prdoc/1.9.0/pr_3510.prdoc @@ -0,0 +1,13 @@ +title: "Fix multi-collator parachain transition to async backing" + +doc: + - audience: Node Operator + description: | + The dynamic Aura slot duration, introduced in PR#3211, didn't take the block import pipeline + into account. The result was the parachain backed by multiple collators not being able to + keep producing blocks after its runtime was upgraded to support async backing, requiring to + restart all the collator nodes. This change fixes the issue, introducing the dynamic Aura + slot duration into the block import pipeline. + +crates: + - name: "polkadot-parachain-bin" diff --git a/prdoc/1.9.0/pr_3513.prdoc b/prdoc/1.9.0/pr_3513.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..a67975fad218ce2f4cc7f998883afea98b4652ac --- /dev/null +++ b/prdoc/1.9.0/pr_3513.prdoc @@ -0,0 +1,24 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: Fix call enum's metadata regression + +doc: + - audience: Runtime Dev + description: | + This PR fixes an issue where in the metadata of all FRAME-based chains, the documentation for + all extrinsic/call/transactions has been replaced by a single line saying "see Pallet::name". + + Many wallets display the metadata of transactions to the user before signing, and this bug + might have affected this process. + - audience: [Runtime User, Runtime Dev] + description: | + This PR fixes an issue where in the metadata of all FRAME-based chains, the documentation for + all extrinsic/call/transactions has been replaced by a single line saying "see Pallet::name". + + Many wallets display the metadata of transactions to the user before signing, and this bug + might have affected this process. + +crates: + - name: frame + - name: frame-support diff --git a/prdoc/1.9.0/pr_3523.prdoc b/prdoc/1.9.0/pr_3523.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..c31d9d096dc00797254f7946fd44984636cb1547 --- /dev/null +++ b/prdoc/1.9.0/pr_3523.prdoc @@ -0,0 +1,19 @@ +title: Fix crash of synced parachain node run with `--sync=warp` + +doc: + - audience: Node Operator + description: | + Fix crash of `SyncingEngine` when an already synced parachain node is run with `--sync=warp` + (issue https://github.com/paritytech/polkadot-sdk/issues/3496). + The issue manifests itself by errors in the logs: + ``` + [Parachain] Cannot set warp sync target block: no warp sync strategy is active. + [Parachain] Failed to set warp sync target block header, terminating `SyncingEngine`. + ``` + Followed by a stream of messages: + ``` + [Parachain] Protocol command streams have been shut down + ``` + +crates: + - name: sc-network-sync diff --git a/prdoc/1.9.0/pr_3532.prdoc b/prdoc/1.9.0/pr_3532.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..d47c8d1d49156aca4ac1b7683ee7fbd9d8e9e690 --- /dev/null +++ b/prdoc/1.9.0/pr_3532.prdoc @@ -0,0 +1,15 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: Remove deprecated `trait Store` + +doc: + - audience: Runtime Dev + description: | + The deprecated `trait Store` feature has been removed from the codebase. Please remove usages of `generate_store` + macro from your pallets and access the storage through generics. For example, + `::StoredRange::mutate` will need to be updated to `StoredRange::::mutate`. + +crates: + - name: frame-support + - name: frame \ No newline at end of file diff --git a/prdoc/1.9.0/pr_3540.prdoc b/prdoc/1.9.0/pr_3540.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..d0a91882b6bf4e357fde899c2d939ddb7de62f34 --- /dev/null +++ b/prdoc/1.9.0/pr_3540.prdoc @@ -0,0 +1,10 @@ +title: "[pallet-contracts] Only allow non-deterministic code to be uploaded with Determinism::Relaxed" + +doc: + - audience: Runtime Dev + description: | + The `upload_code` extrinsic, will now only allow non-deterministic code to be uploaded with the `Determinism::Relaxed` flag. + This prevent an attacker from uploading "deterministic" code with the `Determinism::Relaxed` flag, preventing the code to be instantiated for on-chain execution. + +crates: + - name: pallet-contracts diff --git a/prdoc/1.9.0/pr_3574.prdoc b/prdoc/1.9.0/pr_3574.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..99868ea8a132a6440b9daff0d9f7deaa329ca4b3 --- /dev/null +++ b/prdoc/1.9.0/pr_3574.prdoc @@ -0,0 +1,23 @@ +title: Generate test functions for each benchmark with benchmarking v2 + +doc: + - audience: Runtime Dev + description: | + This PR fixes an issue where using `impl_benchmark_test_suite` macro + within modules that use the benchmarking v2 macros (`#[benchmarks]` + and `#[instance_benchmarks]`) always produced a single test called + `test_benchmarks` instead of a separate benchmark test for every + benchmark (noted with the `#[benchmark]` macro). + + By using this macro from now on, new tests will be created named + `test_benchmark_{name}` where `name` is the name of the benchmark + function. Those tests will be nested inside the module intended for + benchmark functions. + + Also, when using `impl_benchmark_test_suite` inside the module, + the import of such marco will not be necessary, so any explicit + import of it will be marked as unused, the same way it works for + v1 macros so far. + +crates: + - name: frame-support-procedural diff --git a/prdoc/1.9.0/pr_3589.prdoc b/prdoc/1.9.0/pr_3589.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..98b9b1039ab49f1dc62580d56327bf7944ed3372 --- /dev/null +++ b/prdoc/1.9.0/pr_3589.prdoc @@ -0,0 +1,10 @@ +title: Removed `pallet::getter` usage from `pallet-im-online` + +doc: + - audience: Runtime Dev + description: | + This PR removes `pallet::getter` usage from `pallet-im-online`, and updates dependant code accordingly. + The syntax `StorageItem::::get()` should be used instead. + +crates: + - name: pallet-im-online diff --git a/prdoc/1.9.0/pr_3606.prdoc b/prdoc/1.9.0/pr_3606.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..18b71de9477ea516de2bcd5ecfab52a6a5479afb --- /dev/null +++ b/prdoc/1.9.0/pr_3606.prdoc @@ -0,0 +1,9 @@ +title: "[pallet_contracts] mark lock/unlock_delegate_dependency as stable" + +doc: + - audience: Runtime Dev + description: | + Lock and unlock delegate dependency are stable now, so we can mark them as such. + +crates: + - name: pallet-contracts diff --git a/prdoc/1.9.0/pr_3636.prdoc b/prdoc/1.9.0/pr_3636.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..934158ac1022dc14309696bea43492db8f7a0e88 --- /dev/null +++ b/prdoc/1.9.0/pr_3636.prdoc @@ -0,0 +1,15 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: "[pallet_broker] Fix `Linear::adapt_price` behavior at zero" + +doc: + - audience: Runtime Dev + description: | + This fixes the behaviour of `Linear` which is the default implementation of the `AdaptPrice` + trait in the broker pallet. Previously if cores were offered but not sold in only one sale, + the price would be set to zero and due to the logic being purely multiplicative, the price + would stay at 0 indefinitely. + +crates: + - name: pallet-broker diff --git a/prdoc/1.9.0/pr_3639.prdoc b/prdoc/1.9.0/pr_3639.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..46e3f6f4d76394ded0c7c76458e1a71148ea5cb4 --- /dev/null +++ b/prdoc/1.9.0/pr_3639.prdoc @@ -0,0 +1,19 @@ +title: Prevents staking controllers from becoming stashes of different ledgers; Ensures that no ledger in bad state is mutated. + +doc: + - audience: Runtime User + description: | + This PR introduces a fix to the staking logic which prevents an existing controller from bonding as a stash of another ledger, which + lead to staking ledger inconsistencies down the line. In addition, it adds a few (temporary) gates to prevent ledgers that are already + in a bad state from mutating its state. + + In summary: + * Checks if stash is already a controller when calling `Call::bond` and fails if that's the case; + * Ensures that all fetching ledgers from storage are done through the `StakingLedger` API; + * Ensures that a `Error::BadState` is returned if the ledger bonding is in a bad state. This prevents bad ledgers from mutating (e.g. + `bond_extra`, `set_controller`, etc) its state and avoid further data inconsistencies. + * Prevents stashes which are controllers or another ledger from calling `set_controller`, since that may lead to a bad state. + * Adds further try-state runtime checks that check if there are ledgers in a bad state based on their bonded metadata. + +crates: +- name: pallet-staking diff --git a/prdoc/1.9.0/pr_3643.prdoc b/prdoc/1.9.0/pr_3643.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..6e85af8d99a07f397ce03d4b7c936f7560f36c8f --- /dev/null +++ b/prdoc/1.9.0/pr_3643.prdoc @@ -0,0 +1,12 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: Fix weight refund for `pallet_collator_selection::set_candidacy_bond` + +doc: + - audience: Runtime Dev + description: | + This PR implements the weight refund of `pallet_collator_selection::set_candidacy_bond` to + account for no iterations over the candidate list when the candidacy bond is decreased. +crates: + - name: pallet-collator-selection diff --git a/prdoc/1.9.0/pr_3665.prdoc b/prdoc/1.9.0/pr_3665.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..67725d24d185502871baf41ba65b856449c4dfc3 --- /dev/null +++ b/prdoc/1.9.0/pr_3665.prdoc @@ -0,0 +1,11 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: Revert "FRAME Create TransactionExtension as a replacement for SignedExtension (#2280)" + +doc: + - audience: Runtime Dev + description: | + This PR reverts the PR which introduced `TransactionExtension` to replace `SignedExtension`. + +crates: [ ] diff --git a/prdoc/pr_2119.prdoc b/prdoc/pr_2119.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..d548b5af18a407cb5ecc23269029c6be1d2fd1ca --- /dev/null +++ b/prdoc/pr_2119.prdoc @@ -0,0 +1,16 @@ +title: "Add example pallet for Multi-Block-Migrations" + +doc: + - audience: Runtime Dev + description: | + - Add an example pallet to demonstrate Multi-Block-Migrations. + - Add a `MigrationId` to frame-support for more convenient identification or migrations. + - Add default config prelude for testing in pallet-migrations. + +crates: + - name: frame-support + bump: minor + - name: pallet-migrations + bump: minor + - name: kitchensink-runtime + bump: patch diff --git a/prdoc/pr_2292.prdoc b/prdoc/pr_2292.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..e4c50f7806baea41aa27d2ba0da647e514e7ba4d --- /dev/null +++ b/prdoc/pr_2292.prdoc @@ -0,0 +1,59 @@ +title: Migrate Fee Payment from Currency to fungible traits + +doc: + - audience: Runtime Dev + description: | + Deprecates the `CurrencyAdapter` and introduces `FungibleAdapter` + Deprecates `ToStakingPot` and replaces usage with `ResolveTo` + Updated `DealWithFees`, `ToAuthor`, `AssetsToBlockAuthor` to all use `fungible` traits + Updated runtime XCM Weight Traders to use `ResolveTo` + Updated runtime TransactionPayment pallets to use `FungibleAdapter` instead of `CurrencyAdapter` + + Runtime Migration Guide: + - Replace usage of `CurrencyAdapter` with `FungibleAdapter` + - Replace usage of `ToStakingPot` with `ResolveTo, Balances>` + +crates: + - name: pallet-collator-selection + bump: minor + - name: parachains-common + bump: major + - name: asset-hub-rococo-runtime + bump: major + - name: asset-hub-westend-runtime + bump: major + - name: bridge-hub-westend-runtime + bump: major + - name: bridge-hub-rococo-runtime + bump: major + - name: collectives-westend-runtime + bump: major + - name: contracts-rococo-runtime + bump: major + - name: coretime-rococo-runtime + bump: major + - name: coretime-westend-runtime + bump: major + - name: people-westend-runtime + bump: major + - name: people-rococo-runtime + bump: major + - name: polkadot-runtime-common + bump: major + - name: westend-runtime + bump: major + - name: rococo-runtime + bump: major + - name: staging-xcm-builder + bump: major + - name: kitchensink-runtime + bump: major + - name: pallet-transaction-payment + bump: minor + - name: minimal-template-runtime + bump: major + - name: parachain-template-runtime + bump: major + - name: solochain-template-runtime + bump: major + diff --git a/prdoc/pr_2714.prdoc b/prdoc/pr_2714.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..f5f6e61c656e35f12ea85a474f085787cc16ca56 --- /dev/null +++ b/prdoc/pr_2714.prdoc @@ -0,0 +1,23 @@ +title: GenesisConfig presets for runtime + +doc: + - audience: Runtime Dev + description: | + The runtime now can provide a number of predefined presets of `RuntimeGenesisConfig` struct. This presets are intended to be used in different deployments, e.g.: `local`, `staging`, etc, and should be included into the corresponding chain-specs. + Having `GenesisConfig` presets in runtime allows to fully decouple node from runtime types (the problem is described in #1984). + + Summary of changes: + - The `GenesisBuilder` API was adjusted to enable this functionality, + - (Breaking change) Old `create_default_config` method was removed, `build_config` was renamed to `build_state`. As a consequence a node won't be able to interact with genesis config for older runtimes. The cleanup was made for sake of API simplicity. + + - audience: Node Dev + description: | + The `ChainSpecBuilder` is extended with `with_genesis_config_preset_name` method which allows to build chain-spec using named preset provided by the runtime. + +crates: + - name: sp-genesis-builder + bump: minor + - name: staging-chain-spec-builder + bump: major + - name: sc-chain-spec + bump: major diff --git a/prdoc/pr_2944.prdoc b/prdoc/pr_2944.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..eafce7396c082e093d19c5b30ea1a2a8366b1c44 --- /dev/null +++ b/prdoc/pr_2944.prdoc @@ -0,0 +1,28 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: "Integrate litep2p into Polkadot SDK" + +doc: + - audience: Node Dev + description: | + litep2p is a libp2p-compatible P2P networking library. It supports all of the features of rust-libp2p + that are currently being utilized by Polkadot SDK and is a drop-in replacement for any node operator. + + For node developers, introduction of litep2p implies specifying the networking backend that Polkadot SDK + shall use for P2P networking. A new trait called `NetworkBackend` is introduced which is implemented + by both the libp2p and litep2p backends and which is used to initialize any networking-related code. + + - audience: Node Operator + description: | + litep2p is considered experimental and rust-libp2p will remain as the default networking backend + for Polkadot SDK but litep2p can be selected with `--network-backend litep2p`. + +crates: + - name: "sc-network" + - name: "sc-service" + - name: "minimal-template-node" + - name: "solochain-template-node" + - name: "staging-node-cli" + - name: "polkadot-service" + - name: "parachain-template-node" diff --git a/prdoc/pr_3485.prdoc b/prdoc/pr_3485.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..2add8867c4cdb8215fcfeb2e249572d110320aea --- /dev/null +++ b/prdoc/pr_3485.prdoc @@ -0,0 +1,20 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: "Broker: sale price runtime api" + +doc: + - audience: Runtime Dev + description: | + Defines a runtime api for `pallet-broker` for getting the current price + of a core in the ongoing sale. + + - audience: Runtime User + description: | + Defines a runtime api for `pallet-broker` for getting the current price + of a core in the ongoing sale. + +crates: + - name: pallet-broker + - name: coretime-rococo-runtime + - name: coretime-westend-runtime diff --git a/prdoc/pr_3512.prdoc b/prdoc/pr_3512.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..d44e1ca1e29698c71e6812c5ee1d9324eea28d83 --- /dev/null +++ b/prdoc/pr_3512.prdoc @@ -0,0 +1,47 @@ +title: "[FRAME] Introduce Runtime Omni Bencher" + +doc: + - audience: Node Dev + description: | + Introduces a new freestanding binary; the `frame-omni-bencher`. This can be used as alternative to the node-integrated `benchmark pallet` command. It currently only supports pallet benchmarking. + + The optional change to integrate this MR is in the node. The `run` function is now deprecated in favour or `run_with_spec`. This should be rather easy to integrate: + + ```patch + runner.sync_run(|config| cmd + - .run::, ReclaimHostFunctions>(config) + + .run_with_spec::, ReclaimHostFunctions>(Some(config.chain_spec)) + ) + ``` + + Additionally, a new `--runtime` CLI arg was introduced to the `benchmark pallet` command. It allows to generate the genesis state directly by the runtime, instead of using a spec file. + +crates: + - name: pallet-nis + bump: major + - name: frame-benchmarking-cli + bump: major + - name: polkadot-parachain-bin + bump: patch + - name: polkadot-cli + bump: patch + - name: polkadot-runtime-common + bump: patch + - name: polkadot-runtime-parachains + bump: patch + - name: rococo-runtime + bump: patch + - name: staging-node-cli + bump: patch + - name: kitchensink-runtime + bump: patch + - name: pallet-babe + bump: patch + - name: frame-benchmarking + bump: patch + - name: pallet-election-provider-multi-phase + bump: patch + - name: pallet-fast-unstake + bump: patch + - name: pallet-contracts + bump: patch diff --git a/prdoc/pr_3630.prdoc b/prdoc/pr_3630.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..67122761120d0754c993d0665c5422bfd1e2c190 --- /dev/null +++ b/prdoc/pr_3630.prdoc @@ -0,0 +1,12 @@ +title: "Use async backing enabled collator for all the parachains" + +doc: + - audience: Node Operator + description: | + Promotes all the parachains supported by `polkadot-parachain`, including all the systems + parachains, to use the async backing enabled lookahead Aura collator instead of the generic + one. + +crates: + - name: polkadot-parachain-bin + bump: major diff --git a/prdoc/pr_3660.prdoc b/prdoc/pr_3660.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..26245e5e795c74eebfe1b7f1f09cc3741830289b --- /dev/null +++ b/prdoc/pr_3660.prdoc @@ -0,0 +1,16 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: Removed `pallet::getter` usage from Polkadot Runtime pallets + +doc: + - audience: Runtime Dev + description: | + This PR removes all the `pallet::getter` usages from the Polkadot Runtime pallets, and updates dependant runtimes accordingly. + The syntax `StorageItem::::get()` should be used instead. + +crates: + - name: polkadot-runtime-common + - name: polkadot-runtime-parachains + - name: rococo-runtime + - name: westend-runtime diff --git a/prdoc/pr_3708.prdoc b/prdoc/pr_3708.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..6cb0ebd2c7f924182dc3b2bd0a582885f43c73ea --- /dev/null +++ b/prdoc/pr_3708.prdoc @@ -0,0 +1,31 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: XCM builder pattern automatically converts instruction parameters. + +doc: + - audience: Runtime Dev + description: | + Small quality of life improvement. + Previously, an XCM could be built like this: + ```rust + let xcm = Xcm::builder() + .withdraw_asset((Parent, 100u128).into()) + .buy_execution((Parent, 1u128).into()) + .deposit_asset(All.into(), AccountId32 { id: [0u8; 32], network: None }.into()) + .build(); + ``` + Now, it can be built like this: + ```rust + let xcm = Xcm::builder() + .withdraw_asset((Parent, 100u128)) + .buy_execution((Parent, 1u128)) + .deposit_asset(All, [0u8; 32]) + .build(); + ``` + +crates: +- name: "xcm-procedural" + bump: minor +- name: "staging-xcm" + bump: minor diff --git a/prdoc/pr_3789.prdoc b/prdoc/pr_3789.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..802334423b16e49d31e6fa7baf149b3c4eb49e28 --- /dev/null +++ b/prdoc/pr_3789.prdoc @@ -0,0 +1,12 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: "[pallet-contracts] Benchmarks improvements" + +doc: + - audience: Runtime Dev + description: Reuse wasmi module when validating the wasm code. +crates: +- name: pallet-contracts + bump: patch + diff --git a/prdoc/pr_3801.prdoc b/prdoc/pr_3801.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..b5c565ce4dadffdee040c0599e071dab98c19d8a --- /dev/null +++ b/prdoc/pr_3801.prdoc @@ -0,0 +1,10 @@ +title: "Remove `slot_duration` from `aura::collators::basic::Params`" + +doc: + - audience: Node Dev + description: | + Removes the `slot_duration` parameter from the `aura::collators::basic::Params`. + The `slot_duration` will now be fetched from the runtime using the `Aura` runtime api. + +crates: + - name: cumulus-client-consensus-aura diff --git a/prdoc/pr_3813.prdoc b/prdoc/pr_3813.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..66dfd70e1b174406f5e33d5f59fa96bf156885de --- /dev/null +++ b/prdoc/pr_3813.prdoc @@ -0,0 +1,14 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: Renames `frame` crate to `polkadot-sdk-frame` + +doc: + - audience: Runtime Dev + description: | + This PR renames `frame` crate to `polkadot-sdk-frame` as `frame` is not available on crates.io. + Please note that this crate can only be imported as `polkadot-sdk-frame` or `frame`. + +crates: + - name: polkadot-sdk-frame + bump: major diff --git a/prdoc/pr_3875.prdoc b/prdoc/pr_3875.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..59cc3792d395be186c95857b021130273413916c --- /dev/null +++ b/prdoc/pr_3875.prdoc @@ -0,0 +1,11 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: Fix Mermaid diagram rendering + +doc: + - audience: Runtime Dev + description: | + Fixes the rendering of some Mermaid diagrams in the documentation. + +crates: [ ] diff --git a/prdoc/pr_3915.prdoc b/prdoc/pr_3915.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..a236288c99fbf9962c049105a411be50bbd60a01 --- /dev/null +++ b/prdoc/pr_3915.prdoc @@ -0,0 +1,14 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: "[pallet-contracts] Weights update" + +doc: + - audience: Runtime Dev + description: | + Update Host functions benchmarks, instead of benchmarking the whole call extrinsic, this PR solely benchmark the execution of the Host function. + Previously, some benchmarks would overestimate the weight as both the parsing and execution of the contract were included in the benchmark. + +crates: +- name: pallet-contracts + bump: patch diff --git a/prdoc/pr_3930.prdoc b/prdoc/pr_3930.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..a5eebe375ceaec619e60b05b919de3a447f01634 --- /dev/null +++ b/prdoc/pr_3930.prdoc @@ -0,0 +1,30 @@ +title: "test runtimes: allow local origins to execute arbitrary XCMs" + +doc: + - audience: Runtime User + description: | + Allow arbitrary XCM execution for local origins on all test chains. + +crates: +- name: asset-hub-rococo-runtime + bump: minor +- name: bridge-hub-rococo-runtime + bump: minor +- name: bridge-hub-westend-runtime + bump: minor +- name: collectives-westend-runtime + bump: minor +- name: contracts-rococo-runtime + bump: minor +- name: coretime-rococo-runtime + bump: minor +- name: coretime-westend-runtime + bump: minor +- name: people-rococo-runtime + bump: minor +- name: people-westend-runtime + bump: minor +- name: penpal-runtime + bump: minor +- name: westend-runtime + bump: minor \ No newline at end of file diff --git a/prdoc/pr_3934.prdoc b/prdoc/pr_3934.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..69d8f70171ed3c0977e1ac4c007943570a1a1582 --- /dev/null +++ b/prdoc/pr_3934.prdoc @@ -0,0 +1,11 @@ +title: Update benchmarking macros + +doc: + - audience: Runtime Dev + description: | + Current benchmarking macro return a closure with the captured benchmarked code. + This could cause compilation issues when the benchmarked code has complex lifetime requirements. + This PR updates the existing macro by injecting the recoding parameter and invoking the start / stop method around the benchmarked block instead of returning a closure + +crates: [] + diff --git a/prdoc/pr_3953.prdoc b/prdoc/pr_3953.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..f52227924604481d0460e46a677cb7bb8d0e6565 --- /dev/null +++ b/prdoc/pr_3953.prdoc @@ -0,0 +1,19 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: Adapt RemoteExternalities and its related types to be used with generic hash parameters + +doc: + - audience: Node Dev + description: | + Modify `RemoteExternalities`, `Mode`, `OnlineConfig` and`Snapshot` to rely now on generic parameter, instead of `BlockT`. + Adjust in consequence their implementation to be compatible with types `Hash`, or if possible any generic. + Adapt Builder struct and implementation for these bounds. + +crates: +- name: frame-remote-externalities + bump: major +- name: pallet-state-trie-migration + bump: patch +- name: try-runtime-cli + bump: patch \ No newline at end of file diff --git a/prdoc/pr_3959.prdoc b/prdoc/pr_3959.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..33c82003b0e62b518e0b9c22b18434f31536dc16 --- /dev/null +++ b/prdoc/pr_3959.prdoc @@ -0,0 +1,14 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: Allow StakingAdmin to manage nomination pool configurations + +doc: + - audience: Runtime User + description: | + Adds a custom origin to Nomination pool configuration and allows StakingAdmin to be this origin in Westend. Other + runtimes could also set this origin to be the same that manages staking-pallet configurations. + +crates: + - name: pallet-nomination-pools + bump: major diff --git a/prdoc/pr_3976.prdoc b/prdoc/pr_3976.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..95afab6d424061890400d4fc8361f84eb9a790d5 --- /dev/null +++ b/prdoc/pr_3976.prdoc @@ -0,0 +1,14 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: Decrement total_deposit when clearing collection metadata + +doc: + - audience: Runtime Dev + description: Decrements total_deposit by the appropriate amount when collection metadata is cleared. + +crates: + - name: pallet-uniques + bump: patch + - name: pallet-nfts + bump: patch diff --git a/prdoc/pr_3979.prdoc b/prdoc/pr_3979.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..b092ae697ba87e011d3c194a6ffb1645a602c97d --- /dev/null +++ b/prdoc/pr_3979.prdoc @@ -0,0 +1,19 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: Deprecate `para_id()` from `CoreState` in polkadot primitives + +doc: + - audience: "Node Dev" + description: | + `CoreState`'s `para_id()` function is getting deprecated in favour of direct usage of the + `ClaimQueue`. This is the preferred approach because it provides a better view on what is + scheduled on each core. + +crates: + - name: polkadot-primitives + bump: minor + - name: polkadot-statement-distribution + bump: minor + - name: cumulus-client-consensus-aura + bump: minor diff --git a/prdoc/pr_3983.prdoc b/prdoc/pr_3983.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..755979f6c431f9bdebc68bc47d56ff6436d22446 --- /dev/null +++ b/prdoc/pr_3983.prdoc @@ -0,0 +1,20 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: Detect closed notification substreams instead of evicting all peers + +doc: + - audience: Node Operator + description: | + Replace eviction of all peers when syncing has completely stalled with a more granular + detection of notification substreams closed by remote peers. + + This change is expected to make the _reported_ peer count lower, as before this change + the number also included already closed substreams. Nevertheless, the currently reported + number should be seen as the real number of working connections. + +crates: + - name: sc-network-sync + bump: minor + - name: sc-network + bump: minor diff --git a/prdoc/pr_3997.prdoc b/prdoc/pr_3997.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..d5235cd627518f8e762095ae81c79d0b62cc1789 --- /dev/null +++ b/prdoc/pr_3997.prdoc @@ -0,0 +1,16 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: "[pallet-broker] Fix claim revenue behaviour for zero timeslices" + +doc: + - audience: Runtime Dev + description: | + Add a check in the `claim_revenue` broker call to ensure that max_timeslices > 0 and errors if + not. This mitigates an issue where an attacker could call claim_revenue for an existing region + that is owed a revenue, with max_timeslices set to 0 for free indefinitely, which would + represent an unbounded spam attack. + +crates: +- name: pallet-broker + bump: patch diff --git a/prdoc/pr_4015.prdoc b/prdoc/pr_4015.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..ede1731c4ab8b039424fb7bfc944401f4807dd4f --- /dev/null +++ b/prdoc/pr_4015.prdoc @@ -0,0 +1,14 @@ +title: Improve beefy networking code by forwarding data more directly + +doc: + - audience: Node Operator + description: | + Improve internal implementation of beefy to forward data directly to the + networking layer instead of first storing them internally. So, the + following error message should not appear again: + ``` + The number of unprocessed messages in channel `mpsc_beefy_gossip_validator` exceeded 100000. + ``` + +crates: + - name: sc-consensus-beefy diff --git a/prdoc/pr_4017.prdoc b/prdoc/pr_4017.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..9e83d5d1642a6404045fc341786fdbe566512bfb --- /dev/null +++ b/prdoc/pr_4017.prdoc @@ -0,0 +1,15 @@ +title: Complete removal of `TryRuntime` subcommand + +doc: + - audience: Node Operator + description: | + The deprecated `try-runtime` subcommand and `try-runtime-cli` crate has been completely removed. + If you are not already, you should be using the standalone CLI at https://github.com/paritytech/try-runtime-cli. + +crates: + - name: polkadot-parachain-bin + bump: patch + - name: polkadot-cli + bump: patch + - name: staging-node-cli + bump: patch diff --git a/prdoc/pr_4021.prdoc b/prdoc/pr_4021.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..1f3a2748d133dd053292fd72ca4eb1d6c59a3664 --- /dev/null +++ b/prdoc/pr_4021.prdoc @@ -0,0 +1,13 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: Improve log output for block imports + +doc: + - audience: Node Operator + description: | + Nodes now print the parent hash on import notification log messages. In addition, the emoji + of the log message indicates whether the block was imported as best block or not. "🏆" is used for + best blocks, "🆕" for other imported blocks. + +crates: [ ] diff --git a/prdoc/pr_4070.prdoc b/prdoc/pr_4070.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..a8f4f0f35053de80979ccbe9f1f45e9068025531 --- /dev/null +++ b/prdoc/pr_4070.prdoc @@ -0,0 +1,12 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: Avoid using `para_backing_state` if runtime doesn't support async backing + +doc: + - audience: Node Operator + description: | + Fixes https://github.com/paritytech/polkadot-sdk/issues/4067 which prevents collators to + upgrade to latest release (v1.10.0) + +crates: [ ] diff --git a/prdoc/pr_4072.prdoc b/prdoc/pr_4072.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..7195b99c9d5a4ca6aac012b4207885348d492367 --- /dev/null +++ b/prdoc/pr_4072.prdoc @@ -0,0 +1,10 @@ +title: "Amend chainspecs for people-westend and add IBP bootnodes" + +doc: + - audience: Node Operator + description: | + Fixes the people-westend chain spec. + +crates: + - name: polkadot-parachain-bin + bump: patch diff --git a/prdoc/schema_user.json b/prdoc/schema_user.json index 82215d51866b35895b5e840a8f3a900b161a9cf6..6b44b1b28dfb859dde52e46974a6ef1d06aa3722 100644 --- a/prdoc/schema_user.json +++ b/prdoc/schema_user.json @@ -3,9 +3,8 @@ "$id": "https://raw.githubusercontent.com/paritytech/prdoc/master/prdoc_schema_user.json", "version": { "major": 1, - "minor": 0, - "patch": 0, - "timestamp": 20230817152351 + "minor": 1, + "patch": 0 }, "title": "Polkadot SDK PRDoc Schema", "description": "JSON Schema definition for the Polkadot SDK PR documentation", @@ -99,6 +98,12 @@ "$defs": { "audience": { "description": "You may pick one or more audiences and address those users with appropriate documentation, information and warning related to the PR.", + "oneOf": [ + { "$ref": "#/$defs/audience_id" }, + { "$ref": "#/$defs/audience_ids" } + ] + }, + "audience_id": { "oneOf": [ {"const": "Node Dev", "title": "Node Dev", @@ -117,6 +122,13 @@ "description": "Anyone using the runtime. This can be a token holder or a dev writing a front end for a chain."} ] }, + "audience_ids": { + "type": "array", + "items": { + "$ref": "#/$defs/audience_id" + }, + "minItems": 2 + }, "crate": { "type": "object", "description": "You have the option here to provide a hint about a crate that has changed to help with the publishing of crates.", @@ -125,10 +137,16 @@ "name": { "type": "string" }, + "bump": { + "$ref": "#/$defs/semver_bump" + }, "note": { "type": "string" } - } + }, + "required": [ + "name" + ] }, "migration_db": { "type": "object", @@ -165,6 +183,26 @@ "description" ] }, + "semver_bump": { + "description": "The type of bump to apply to the crate version according to Cargo SemVer: https://doc.rust-lang.org/cargo/reference/semver.html. Please check docs/RELEASE.md for more information.", + "oneOf": [ + { + "const": "major", + "title": "Major", + "description": "A bump to the leftmost non-zero digit of the version number." + }, + { + "const": "minor", + "title": "Minor", + "description": "A bump to the second leftmost non-zero digit of the version number." + }, + { + "const": "patch", + "title": "Patch", + "description": "A bump to the third leftmost non-zero digit of the version number." + } + ] + }, "doc": { "type": "object", "description": "You have the the option to provide different description of your PR for different audiences.", @@ -184,7 +222,11 @@ "description": "Description of the change", "type": "string" } - } + }, + "required": [ + "audience", + "description" + ] }, "array_of_strings": { "description": "An array of strings that can be empty", diff --git a/scripts/bridges_update_subtree.sh b/scripts/bridges_update_subtree.sh deleted file mode 100755 index 5c5c7a322a163d5db9f7fa4e714c4951f296e1df..0000000000000000000000000000000000000000 --- a/scripts/bridges_update_subtree.sh +++ /dev/null @@ -1,85 +0,0 @@ -#!/bin/bash - -# A script to udpate bridges repo as subtree to Cumulus -# Usage: -# ./scripts/bridges_update_subtree.sh fetch -# ./scripts/bridges_update_subtree.sh patch -# ./scripts/bridges_update_subtree.sh merge - -set -e - -BRIDGES_BRANCH="${BRANCH:-polkadot-staging}" -BRIDGES_TARGET_DIR="${TARGET_DIR:-bridges}" - -function fetch() { - # the script is able to work only on clean git copy - [[ -z "$(git status --porcelain)" ]] || { - echo >&2 "The git copy must be clean (stash all your changes):"; - git status --porcelain - exit 1; - } - - local bridges_remote=$(git remote -v | grep "parity-bridges-common.git (fetch)" | head -n1 | awk '{print $1;}') - if [ -z "$bridges_remote" ]; then - echo "" - echo "Adding new remote: 'bridges' repo..." - echo "" - echo "... check your YubiKey ..." - git remote add -f bridges git@github.com:paritytech/parity-bridges-common.git - bridges_remote="bridges" - else - echo "" - echo "Fetching remote: '${bridges_remote}' repo..." - echo "" - echo "... check your YubiKey ..." - git fetch ${bridges_remote} --prune - fi - - echo "" - echo "Syncing/updating subtree with remote branch '${bridges_remote}/$BRIDGES_BRANCH' to target directory: '$BRIDGES_TARGET_DIR'" - echo "" - echo "... check your YubiKey ..." - git subtree pull --prefix=$BRIDGES_TARGET_DIR ${bridges_remote} $BRIDGES_BRANCH --squash -} - -function patch() { - echo "" - echo "Patching/removing unneeded stuff from subtree in target directory: '$BRIDGES_TARGET_DIR'" - $BRIDGES_TARGET_DIR/scripts/verify-pallets-build.sh --ignore-git-state --no-revert -} - -function merge() { - echo "" - echo "Merging stuff from subtree in target directory: '$BRIDGES_TARGET_DIR'" - - # stage all removed by patch: DU, MD, D, AD - only from subtree directory - git status -s | awk '$1 == "DU" || $1 == "D" || $1 == "MD" || $1 == "AD" {print $2}' | grep "^$BRIDGES_TARGET_DIR/" | xargs git rm -q --ignore-unmatch - - echo "" - echo "When all conflicts are resolved, do 'git merge --continue'" -} - -function amend() { - echo "" - echo "Amend stuff from subtree in target directory: '$BRIDGES_TARGET_DIR'" - git commit --amend -S -m "updating bridges subtree + remove extra folders" -} - -case "$1" in - fetch) - fetch - ;; - patch) - patch - ;; - merge) - merge - ;; - amend) - amend - ;; - all) - fetch - patch - ;; -esac diff --git a/scripts/release/build-changelogs.sh b/scripts/release/build-changelogs.sh index a9275f45a50c479d27ff3cfffcb5bd82f0b815cf..84054391936294adbd13340932f2ac5c458692aa 100755 --- a/scripts/release/build-changelogs.sh +++ b/scripts/release/build-changelogs.sh @@ -2,11 +2,16 @@ export PRODUCT=polkadot export VERSION=${VERSION:-1.5.0} +export ENGINE=${ENGINE:-docker} +export REF1=${REF1:-'HEAD'} +export REF2=${REF2} +export RUSTC_STABLE=${RUSTC_STABLE:-'1.0'} +export RUSTC_NIGHTLY=${RUSTC_NIGHTLY:-'1.0'} PROJECT_ROOT=`git rev-parse --show-toplevel` echo $PROJECT_ROOT -TMP=$(mktemp -d) +TMP=${TMP:-$(mktemp -d)} TEMPLATE_AUDIENCE="${PROJECT_ROOT}/scripts/release/templates/audience.md.tera" TEMPLATE_CHANGELOG="${PROJECT_ROOT}/scripts/release/templates/changelog.md.tera" @@ -21,7 +26,7 @@ OUTPUT="${TMP}/changelogs/$PRODUCT/$VERSION" echo -e "OUTPUT: \t\t$OUTPUT" mkdir -p $OUTPUT -prdoc load -d "$PROJECT_ROOT/prdoc/$VERSION" --json > $DATA_JSON +$ENGINE run --rm -v ${PROJECT_ROOT}:/repo paritytech/prdoc load -d "prdoc/$VERSION" --json > $DATA_JSON # ls -al $DATA_JSON cat $DATA_JSON | jq ' { "prdoc" : .}' > $CONTEXT_JSON @@ -48,7 +53,58 @@ for audience in "${audiences[@]}"; do echo "Processing audience: $audience ($audience_id)" export TARGET_AUDIENCE=$audience tera -t "${TEMPLATE_AUDIENCE}" --env --env-key env "${CONTEXT_JSON}" > "$OUTPUT/relnote_${audience_id}.md" + cat "$OUTPUT/relnote_${audience_id}.md" >> "$PROJECT_ROOT/scripts/release/templates/changelog.md" done # Show the files tree -s -h -c $OUTPUT/ + +ASSET_HUB_ROCOCO_DIGEST=${ASSET_HUB_ROCOCO_DIGEST:-"$PROJECT_ROOT/scripts/release/digests/asset-hub-rococo-srtool-digest.json"} +ASSET_HUB_WESTEND_DIGEST=${ASSET_HUB_WESTEND_DIGEST:-"$PROJECT_ROOT/scripts/release/digests/asset-hub-westend-srtool-digest.json"} +BRIDGE_HUB_ROCOCO_DIGEST=${BRIDGE_HUB_ROCOCO_DIGEST:-"$PROJECT_ROOT/scripts/release/digests/bridge-hub-rococo-srtool-digest.json"} +BRIDGE_HUB_WESTEND_DIGEST=${BRIDGE_HUB_WESTEND_DIGEST:-"$PROJECT_ROOT/scripts/release/digests/bridge-hub-westend-srtool-digest.json"} +COLLECTIVES_WESTEND_DIGEST=${COLLECTIVES_WESTEND_DIGEST:-"$PROJECT_ROOT/scripts/release/digests/collectives-westend-srtool-digest.json"} +CONTRACTS_ROCOCO_DIGEST=${CONTRACTS_ROCOCO_DIGEST:-"$PROJECT_ROOT/scripts/release/digests/contracts-rococo-srtool-digest.json"} +CORETIME_ROCOCO_DIGEST=${CORETIME_ROCOCO_DIGEST:-"$PROJECT_ROOT/scripts/release/digests/coretime-rococo-srtool-digest.json"} +CORETIME_WESTEND_DIGEST=${CORETIME_WESTEND_DIGEST:-"$PROJECT_ROOT/scripts/release/digests/coretime-westend-srtool-digest.json"} +GLUTTON_WESTEND_DIGEST=${GLUTTON_WESTEND_DIGEST:-"$PROJECT_ROOT/scripts/release/digests/glutton-westend-srtool-digest.json"} +PEOPLE_ROCOCO_DIGEST=${PEOPLE_ROCOCO_DIGEST:-"$PROJECT_ROOT/scripts/release/digests/people-rococo-srtool-digest.json"} +PEOPLE_WESTEND_DIGEST=${PEOPLE_WESTEND_DIGEST:-"$PROJECT_ROOT/scripts/release/digests/people-westend-srtool-digest.json"} +ROCOCO_DIGEST=${ROCOCO_DIGEST:-"$PROJECT_ROOT/scripts/release/digests/rococo-srtool-digest.json"} +WESTEND_DIGEST=${WESTEND_DIGEST:-"$PROJECT_ROOT/scripts/release/digests/westend-srtool-digest.json"} + +jq \ + --slurpfile srtool_asset_hub_rococo $ASSET_HUB_ROCOCO_DIGEST \ + --slurpfile srtool_asset_hub_westend $ASSET_HUB_WESTEND_DIGEST \ + --slurpfile srtool_bridge_hub_rococo $BRIDGE_HUB_ROCOCO_DIGEST \ + --slurpfile srtool_bridge_hub_westend $BRIDGE_HUB_WESTEND_DIGEST \ + --slurpfile srtool_collectives_westend $COLLECTIVES_WESTEND_DIGEST \ + --slurpfile srtool_contracts_rococo $CONTRACTS_ROCOCO_DIGEST \ + --slurpfile srtool_coretime_rococo $CORETIME_ROCOCO_DIGEST\ + --slurpfile srtool_coretime_westend $CORETIME_WESTEND_DIGEST \ + --slurpfile srtool_glutton_westend $GLUTTON_WESTEND_DIGEST \ + --slurpfile srtool_people_rococ $PEOPLE_ROCOCO_DIGEST \ + --slurpfile srtool_people_westend $PEOPLE_WESTEND_DIGEST \ + --slurpfile srtool_rococo $ROCOCO_DIGEST \ + --slurpfile srtool_westend $WESTEND_DIGEST \ + -n '{ + srtool: [ + { order: 10, name: "Westend", data: $srtool_westend[0] }, + { order: 11, name: "Westend AssetHub", data: $srtool_asset_hub_westend[0] }, + { order: 12, name: "Westend BridgeHub", data: $srtool_bridge_hub_westend[0] }, + { order: 13, name: "Westend Collectives", data: $srtool_collectives_westend[0] }, + { order: 14, name: "Westend Coretime", data: $srtool_coretime_westend[0] }, + { order: 15, name: "Westend Glutton", data: $srtool_glutton_westend[0] }, + { order: 16, name: "Westend People", data: $srtool_people_westend[0] }, + { order: 17, name: "Rococo", data: $srtool_rococo[0] }, + { order: 18, name: "Rococo AssetHub", data: $srtool_asset_hub_rococo[0] }, + { order: 19, name: "Rococo BridgeHub", data: $srtool_bridge_hub_rococo[0] }, + { order: 20, name: "Rococo Contracts", data: $srtool_contracts_rococo[0] }, + { order: 21, name: "Rococo Coretime", data: $srtool_coretime_rococo[0] }, + { order: 22, name: "Rococo People", data: $srtool_people_rococ[0] } + ] }' > "$PROJECT_ROOT/scripts/release/context.json" + +RELEASE_DIR="$PROJECT_ROOT/scripts/release/" +pushd $RELEASE_DIR >/dev/null +tera --env --env-key env --include-path templates --template templates/template.md.tera context.json > RELEASE_DRAFT.md +popd >/dev/null diff --git a/scripts/release/digests/.gitignore b/scripts/release/digests/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..a6c57f5fb2ffba0a6af4278619c2983394d237cc --- /dev/null +++ b/scripts/release/digests/.gitignore @@ -0,0 +1 @@ +*.json diff --git a/scripts/release/digests/.gitkeep b/scripts/release/digests/.gitkeep new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/scripts/release/templates/audience.md.tera b/scripts/release/templates/audience.md.tera index dc507053dd5a1fb0f56c788e0f2b02408ba8221c..0b47850e3a37026a5aa5562cd685cbca48bde6f0 100644 --- a/scripts/release/templates/audience.md.tera +++ b/scripts/release/templates/audience.md.tera @@ -1,11 +1,9 @@ -## Release {{ env.PRODUCT }} {{ env.VERSION }} - -Changelog for `{{ env.TARGET_AUDIENCE }}`. +### Changelog for `{{ env.TARGET_AUDIENCE }}` {% for file in prdoc -%} -#### PR #{{file.doc_filename.number}}: {{ file.content.title }} {% for doc_item in file.content.doc %} {%- if doc_item.audience == env.TARGET_AUDIENCE %} +#### [#{{file.doc_filename.number}}]: {{ file.content.title }} {{ doc_item.description }} {% endif -%} diff --git a/scripts/release/templates/changes.md.tera b/scripts/release/templates/changes.md.tera new file mode 100644 index 0000000000000000000000000000000000000000..d14a6f858607f5b8964c705f95d5e67c33b72a3d --- /dev/null +++ b/scripts/release/templates/changes.md.tera @@ -0,0 +1,4 @@ +{# This include generates the section showing the changes #} +## Changelog + +{% include "changelog.md" -%} diff --git a/scripts/release/templates/compiler.md.tera b/scripts/release/templates/compiler.md.tera new file mode 100644 index 0000000000000000000000000000000000000000..3195729eba5bc6c2448aaef9a9cee96cc7e86767 --- /dev/null +++ b/scripts/release/templates/compiler.md.tera @@ -0,0 +1,6 @@ +## Rust compiler versions + +This release was built and tested against the following versions of `rustc`. +Other versions may work. + +- Rust Stable: `{{ env.RUSTC_STABLE }}` diff --git a/scripts/release/templates/runtime.md.tera b/scripts/release/templates/runtime.md.tera new file mode 100644 index 0000000000000000000000000000000000000000..944b913368b36b37d12415588ccd3b6d32609da8 --- /dev/null +++ b/scripts/release/templates/runtime.md.tera @@ -0,0 +1,26 @@ +{# This macro shows one runtime #} +{%- macro runtime(runtime) -%} + +### {{ runtime.name | title }} + +{%- if runtime.data.runtimes.compressed.subwasm.compression.compressed %} +{%- set compressed = "Yes" %} +{%- else %} +{%- set compressed = "No" %} +{%- endif %} + +{%- set comp_ratio = 100 - (runtime.data.runtimes.compressed.subwasm.compression.size_compressed / +runtime.data.runtimes.compressed.subwasm.compression.size_decompressed *100) %} + +``` +🏋️ Runtime Size: {{ runtime.data.runtimes.compressed.subwasm.size | filesizeformat }} ({{ +runtime.data.runtimes.compressed.subwasm.size }} bytes) +🔥 Core Version: {{ runtime.data.runtimes.compressed.subwasm.core_version.specName }}-{{runtime.data.runtimes.compressed.subwasm.core_version.specVersion }} ({{runtime.data.runtimes.compressed.subwasm.core_version.implName }}-{{runtime.data.runtimes.compressed.subwasm.core_version.implVersion }}.tx{{runtime.data.runtimes.compressed.subwasm.core_version.transactionVersion }}.au{{runtime.data.runtimes.compressed.subwasm.core_version.authoringVersion }}) +🗜 Compressed: {{ compressed }}: {{ comp_ratio | round(method="ceil", precision=2) }}% +🎁 Metadata version: V{{ runtime.data.runtimes.compressed.subwasm.metadata_version }} +🗳️ system.setCode hash: {{ runtime.data.runtimes.compressed.subwasm.proposal_hash }} +🗳️ authorizeUpgrade hash: {{ runtime.data.runtimes.compressed.subwasm.parachain_authorize_upgrade_hash }} +🗳️ Blake2-256 hash: {{ runtime.data.runtimes.compressed.subwasm.blake2_256 }} +📦 IPFS: {{ runtime.data.runtimes.compressed.subwasm.ipfs_hash }} +``` +{%- endmacro runtime %} diff --git a/scripts/release/templates/runtimes.md.tera b/scripts/release/templates/runtimes.md.tera new file mode 100644 index 0000000000000000000000000000000000000000..0847382689fb5336eeedeb1fbb712d317797efcb --- /dev/null +++ b/scripts/release/templates/runtimes.md.tera @@ -0,0 +1,19 @@ +{# This include shows the list and details of the runtimes #} +{%- import "runtime.md.tera" as m_r -%} + +{# --- #} + +## Runtimes + +{% set rtm = srtool[0] -%} + +The information about the runtimes included in this release can be found below. +The runtimes have been built using [{{ rtm.data.gen }}](https://github.com/paritytech/srtool) and `{{ rtm.data.rustc }}`. + +{%- for runtime in srtool | sort(attribute="name") %} +{%- set HIDE_VAR = "HIDE_SRTOOL_" ~ runtime.name | upper %} +{%- if not env is containing(HIDE_VAR) %} + +{{ m_r::runtime(runtime=runtime) }} +{%- endif %} +{%- endfor %} diff --git a/scripts/release/templates/template.md.tera b/scripts/release/templates/template.md.tera new file mode 100644 index 0000000000000000000000000000000000000000..39bc1c74402173a04021c20b340be1239e77bb64 --- /dev/null +++ b/scripts/release/templates/template.md.tera @@ -0,0 +1,9 @@ +{# This is the entry point of the template -#} + +This release contains the changes from `{{ env.REF1 | replace(from="refs/tags/", to="") }}` to `{{ env.REF2 | replace(from="refs/tags/", to="") }}`. + +{% include "changes.md.tera" -%} + +{% include "compiler.md.tera" -%} + +{% include "runtimes.md.tera" -%} diff --git a/scripts/snowbridge_update_subtree.sh b/scripts/snowbridge_update_subtree.sh index 2276bb35469f1e13cd58085e36fa49069123bcef..c572eaa18faa8594d4457f5d87cd00dfb790292a 100755 --- a/scripts/snowbridge_update_subtree.sh +++ b/scripts/snowbridge_update_subtree.sh @@ -1,6 +1,6 @@ #!/bin/bash -# A script to udpate bridges repo as subtree to Cumulus +# A script to update bridges repo as subtree to Cumulus # Usage: # ./scripts/update_subtree_snowbridge.sh fetch # ./scripts/update_subtree_snowbridge.sh patch diff --git a/substrate/bin/minimal/node/Cargo.toml b/substrate/bin/minimal/node/Cargo.toml deleted file mode 100644 index 34476a72954dd31e98cbb56f266ebba447a46513..0000000000000000000000000000000000000000 --- a/substrate/bin/minimal/node/Cargo.toml +++ /dev/null @@ -1,60 +0,0 @@ -[package] -name = "minimal-node" -version = "4.0.0-dev" -description = "A fresh FRAME-based Substrate node, ready for hacking." -authors = ["Substrate DevHub "] -homepage = "https://substrate.io/" -edition = "2021" -license = "MIT-0" -publish = false -repository = "https://github.com/substrate-developer-hub/substrate-node-template/" -build = "build.rs" - -[lints] -workspace = true - -[package.metadata.docs.rs] -targets = ["x86_64-unknown-linux-gnu"] - -[[bin]] -name = "minimal-node" - -[dependencies] -clap = { version = "4.4.18", features = ["derive"] } -futures = { version = "0.3.21", features = ["thread-pool"] } -futures-timer = "3.0.1" -jsonrpsee = { version = "0.20.3", features = ["server"] } -serde_json = "1.0.111" - -sc-cli = { path = "../../../client/cli" } -sc-executor = { path = "../../../client/executor" } -sc-network = { path = "../../../client/network" } -sc-service = { path = "../../../client/service" } -sc-telemetry = { path = "../../../client/telemetry" } -sc-transaction-pool = { path = "../../../client/transaction-pool" } -sc-transaction-pool-api = { path = "../../../client/transaction-pool/api" } -sc-consensus = { path = "../../../client/consensus/common" } -sc-consensus-manual-seal = { path = "../../../client/consensus/manual-seal" } -sc-rpc-api = { path = "../../../client/rpc-api" } -sc-basic-authorship = { path = "../../../client/basic-authorship" } -sc-offchain = { path = "../../../client/offchain" } -sc-client-api = { path = "../../../client/api" } - -sp-timestamp = { path = "../../../primitives/timestamp" } -sp-keyring = { path = "../../../primitives/keyring" } -sp-api = { path = "../../../primitives/api" } -sp-blockchain = { path = "../../../primitives/blockchain" } -sp-block-builder = { path = "../../../primitives/block-builder" } -sp-io = { path = "../../../primitives/io" } -sp-runtime = { path = "../../../primitives/runtime" } - -substrate-frame-rpc-system = { path = "../../../utils/frame/rpc/system" } - -frame = { path = "../../../frame", features = ["experimental", "runtime"] } -runtime = { package = "minimal-runtime", path = "../runtime" } - -[build-dependencies] -substrate-build-script-utils = { path = "../../../utils/build-script-utils" } - -[features] -default = [] diff --git a/substrate/bin/minimal/runtime/Cargo.toml b/substrate/bin/minimal/runtime/Cargo.toml deleted file mode 100644 index 296106544bbfdbbb1f7f76b86d5c8ddefb54f917..0000000000000000000000000000000000000000 --- a/substrate/bin/minimal/runtime/Cargo.toml +++ /dev/null @@ -1,50 +0,0 @@ -[package] -name = "minimal-runtime" -version = "0.1.0" -authors.workspace = true -description = "A minimal Substrate example runtime" -edition.workspace = true -repository.workspace = true -license.workspace = true -publish = false - -[lints] -workspace = true - -[dependencies] -parity-scale-codec = { version = "3.0.0", default-features = false } -scale-info = { version = "2.6.0", default-features = false } - -# this is a frame-based runtime, thus importing `frame` with runtime feature enabled. -frame = { path = "../../../frame", default-features = false, features = ["experimental", "runtime"] } -frame-support = { path = "../../../frame/support", default-features = false } - -# pallets that we want to use -pallet-balances = { path = "../../../frame/balances", default-features = false } -pallet-sudo = { path = "../../../frame/sudo", default-features = false } -pallet-timestamp = { path = "../../../frame/timestamp", default-features = false } -pallet-transaction-payment = { path = "../../../frame/transaction-payment", default-features = false } -pallet-transaction-payment-rpc-runtime-api = { path = "../../../frame/transaction-payment/rpc/runtime-api", default-features = false } - -# genesis builder that allows us to interacto with runtime genesis config -sp-genesis-builder = { path = "../../../primitives/genesis-builder", default-features = false } - - -[build-dependencies] -substrate-wasm-builder = { path = "../../../utils/wasm-builder", optional = true } - -[features] -default = ["std"] -std = [ - "frame-support/std", - "frame/std", - "pallet-balances/std", - "pallet-sudo/std", - "pallet-timestamp/std", - "pallet-transaction-payment-rpc-runtime-api/std", - "pallet-transaction-payment/std", - "parity-scale-codec/std", - "scale-info/std", - "sp-genesis-builder/std", - "substrate-wasm-builder", -] diff --git a/substrate/bin/node-template/.editorconfig b/substrate/bin/node-template/.editorconfig deleted file mode 100644 index 5adac74ca24b3422222b2cb886b2a50cd22b6d1b..0000000000000000000000000000000000000000 --- a/substrate/bin/node-template/.editorconfig +++ /dev/null @@ -1,16 +0,0 @@ -root = true - -[*] -indent_style=space -indent_size=2 -tab_width=2 -end_of_line=lf -charset=utf-8 -trim_trailing_whitespace=true -insert_final_newline = true - -[*.{rs,toml}] -indent_style=tab -indent_size=tab -tab_width=4 -max_line_length=100 diff --git a/substrate/bin/node-template/.envrc b/substrate/bin/node-template/.envrc deleted file mode 100644 index 3550a30f2de389e537ee40ca5e64a77dc185c79b..0000000000000000000000000000000000000000 --- a/substrate/bin/node-template/.envrc +++ /dev/null @@ -1 +0,0 @@ -use flake diff --git a/substrate/bin/node-template/node/Cargo.toml b/substrate/bin/node-template/node/Cargo.toml deleted file mode 100644 index da601a665e9c33bf923bf1f3b32e630a5daeef39..0000000000000000000000000000000000000000 --- a/substrate/bin/node-template/node/Cargo.toml +++ /dev/null @@ -1,92 +0,0 @@ -[package] -name = "node-template" -version = "4.0.0-dev" -description = "A fresh FRAME-based Substrate node, ready for hacking." -authors = ["Substrate DevHub "] -homepage = "https://substrate.io/" -edition.workspace = true -license = "MIT-0" -publish = false -repository = "https://github.com/substrate-developer-hub/substrate-node-template/" -build = "build.rs" - -[lints] -workspace = true - -[package.metadata.docs.rs] -targets = ["x86_64-unknown-linux-gnu"] - -[[bin]] -name = "node-template" - -[dependencies] -clap = { version = "4.4.18", features = ["derive"] } -futures = { version = "0.3.21", features = ["thread-pool"] } -serde_json = "1.0.111" - -sc-cli = { path = "../../../client/cli" } -sp-core = { path = "../../../primitives/core" } -sc-executor = { path = "../../../client/executor" } -sc-network = { path = "../../../client/network" } -sc-service = { path = "../../../client/service" } -sc-telemetry = { path = "../../../client/telemetry" } -sc-transaction-pool = { path = "../../../client/transaction-pool" } -sc-transaction-pool-api = { path = "../../../client/transaction-pool/api" } -sc-offchain = { path = "../../../client/offchain" } -sc-consensus-aura = { path = "../../../client/consensus/aura" } -sp-consensus-aura = { path = "../../../primitives/consensus/aura" } -sc-consensus = { path = "../../../client/consensus/common" } -sc-consensus-grandpa = { path = "../../../client/consensus/grandpa" } -sp-consensus-grandpa = { path = "../../../primitives/consensus/grandpa" } -sc-client-api = { path = "../../../client/api" } -sp-runtime = { path = "../../../primitives/runtime" } -sp-io = { path = "../../../primitives/io" } -sp-timestamp = { path = "../../../primitives/timestamp" } -sp-inherents = { path = "../../../primitives/inherents" } -sp-keyring = { path = "../../../primitives/keyring" } -frame-system = { path = "../../../frame/system" } -pallet-transaction-payment = { path = "../../../frame/transaction-payment", default-features = false } - -# These dependencies are used for the node template's RPCs -jsonrpsee = { version = "0.20.3", features = ["server"] } -sp-api = { path = "../../../primitives/api" } -sc-rpc-api = { path = "../../../client/rpc-api" } -sp-blockchain = { path = "../../../primitives/blockchain" } -sp-block-builder = { path = "../../../primitives/block-builder" } -sc-basic-authorship = { path = "../../../client/basic-authorship" } -substrate-frame-rpc-system = { path = "../../../utils/frame/rpc/system" } -pallet-transaction-payment-rpc = { path = "../../../frame/transaction-payment/rpc" } - -# These dependencies are used for runtime benchmarking -frame-benchmarking = { path = "../../../frame/benchmarking" } -frame-benchmarking-cli = { path = "../../../utils/frame/benchmarking-cli" } - -# Local Dependencies -node-template-runtime = { path = "../runtime" } - -# CLI-specific dependencies -try-runtime-cli = { path = "../../../utils/frame/try-runtime/cli", optional = true } - -[build-dependencies] -substrate-build-script-utils = { path = "../../../utils/build-script-utils" } - -[features] -default = [] -# Dependencies that are only required if runtime benchmarking should be build. -runtime-benchmarks = [ - "frame-benchmarking-cli/runtime-benchmarks", - "frame-benchmarking/runtime-benchmarks", - "frame-system/runtime-benchmarks", - "node-template-runtime/runtime-benchmarks", - "sc-service/runtime-benchmarks", - "sp-runtime/runtime-benchmarks", -] -# Enable features that allow the runtime to be tried and debugged. Name might be subject to change -# in the near future. -try-runtime = [ - "frame-system/try-runtime", - "node-template-runtime/try-runtime", - "pallet-transaction-payment/try-runtime", - "sp-runtime/try-runtime", - "try-runtime-cli/try-runtime", -] diff --git a/substrate/bin/node-template/runtime/Cargo.toml b/substrate/bin/node-template/runtime/Cargo.toml deleted file mode 100644 index a7b93a230ca85dd0b400884b4788a50d24db0402..0000000000000000000000000000000000000000 --- a/substrate/bin/node-template/runtime/Cargo.toml +++ /dev/null @@ -1,125 +0,0 @@ -[package] -name = "node-template-runtime" -version = "4.0.0-dev" -description = "A fresh FRAME-based Substrate node, ready for hacking." -authors = ["Substrate DevHub "] -homepage = "https://substrate.io/" -edition.workspace = true -license = "MIT-0" -publish = false -repository = "https://github.com/substrate-developer-hub/substrate-node-template/" - -[lints] -workspace = true - -[package.metadata.docs.rs] -targets = ["x86_64-unknown-linux-gnu"] - -[dependencies] -codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } -scale-info = { version = "2.10.0", default-features = false, features = ["derive", "serde"] } - -pallet-aura = { path = "../../../frame/aura", default-features = false } -pallet-balances = { path = "../../../frame/balances", default-features = false } -frame-support = { path = "../../../frame/support", default-features = false } -pallet-grandpa = { path = "../../../frame/grandpa", default-features = false } -pallet-sudo = { path = "../../../frame/sudo", default-features = false } -frame-system = { path = "../../../frame/system", default-features = false } -frame-try-runtime = { path = "../../../frame/try-runtime", default-features = false, optional = true } -pallet-timestamp = { path = "../../../frame/timestamp", default-features = false } -pallet-transaction-payment = { path = "../../../frame/transaction-payment", default-features = false } -frame-executive = { path = "../../../frame/executive", default-features = false } -sp-api = { path = "../../../primitives/api", default-features = false } -sp-block-builder = { path = "../../../primitives/block-builder", default-features = false } -sp-consensus-aura = { path = "../../../primitives/consensus/aura", default-features = false, features = ["serde"] } -sp-consensus-grandpa = { path = "../../../primitives/consensus/grandpa", default-features = false, features = ["serde"] } -sp-core = { path = "../../../primitives/core", default-features = false, features = ["serde"] } -sp-inherents = { path = "../../../primitives/inherents", default-features = false } -sp-offchain = { path = "../../../primitives/offchain", default-features = false } -sp-runtime = { path = "../../../primitives/runtime", default-features = false, features = ["serde"] } -sp-session = { path = "../../../primitives/session", default-features = false } -sp-std = { path = "../../../primitives/std", default-features = false } -sp-storage = { path = "../../../primitives/storage", default-features = false } -sp-transaction-pool = { path = "../../../primitives/transaction-pool", default-features = false } -sp-version = { path = "../../../primitives/version", default-features = false, features = ["serde"] } -serde_json = { version = "1.0.111", default-features = false, features = ["alloc"] } -sp-genesis-builder = { default-features = false, path = "../../../primitives/genesis-builder" } - -# Used for the node template's RPCs -frame-system-rpc-runtime-api = { path = "../../../frame/system/rpc/runtime-api", default-features = false } -pallet-transaction-payment-rpc-runtime-api = { path = "../../../frame/transaction-payment/rpc/runtime-api", default-features = false } - -# Used for runtime benchmarking -frame-benchmarking = { path = "../../../frame/benchmarking", default-features = false, optional = true } -frame-system-benchmarking = { path = "../../../frame/system/benchmarking", default-features = false, optional = true } - -# Local Dependencies -pallet-template = { path = "../pallets/template", default-features = false } - -[build-dependencies] -substrate-wasm-builder = { path = "../../../utils/wasm-builder", optional = true } - -[features] -default = ["std"] -std = [ - "codec/std", - "frame-benchmarking?/std", - "frame-executive/std", - "frame-support/std", - "frame-system-benchmarking?/std", - "frame-system-rpc-runtime-api/std", - "frame-system/std", - "frame-try-runtime?/std", - "pallet-aura/std", - "pallet-balances/std", - "pallet-grandpa/std", - "pallet-sudo/std", - "pallet-template/std", - "pallet-timestamp/std", - "pallet-transaction-payment-rpc-runtime-api/std", - "pallet-transaction-payment/std", - "scale-info/std", - "serde_json/std", - "sp-api/std", - "sp-block-builder/std", - "sp-consensus-aura/std", - "sp-consensus-grandpa/std", - "sp-core/std", - "sp-genesis-builder/std", - "sp-inherents/std", - "sp-offchain/std", - "sp-runtime/std", - "sp-session/std", - "sp-std/std", - "sp-storage/std", - "sp-transaction-pool/std", - "sp-version/std", - "substrate-wasm-builder", -] -runtime-benchmarks = [ - "frame-benchmarking/runtime-benchmarks", - "frame-support/runtime-benchmarks", - "frame-system-benchmarking/runtime-benchmarks", - "frame-system/runtime-benchmarks", - "pallet-balances/runtime-benchmarks", - "pallet-grandpa/runtime-benchmarks", - "pallet-sudo/runtime-benchmarks", - "pallet-template/runtime-benchmarks", - "pallet-timestamp/runtime-benchmarks", - "sp-runtime/runtime-benchmarks", -] -try-runtime = [ - "frame-executive/try-runtime", - "frame-support/try-runtime", - "frame-system/try-runtime", - "frame-try-runtime/try-runtime", - "pallet-aura/try-runtime", - "pallet-balances/try-runtime", - "pallet-grandpa/try-runtime", - "pallet-sudo/try-runtime", - "pallet-template/try-runtime", - "pallet-timestamp/try-runtime", - "pallet-transaction-payment/try-runtime", - "sp-runtime/try-runtime", -] -experimental = ["pallet-aura/experimental"] diff --git a/substrate/bin/node/bench/Cargo.toml b/substrate/bin/node/bench/Cargo.toml index 42af802d716b7181b91310318137928896c6bd66..49485fe2a1b9b8017ec560adef2f0f2114b07b5d 100644 --- a/substrate/bin/node/bench/Cargo.toml +++ b/substrate/bin/node/bench/Cargo.toml @@ -16,16 +16,16 @@ workspace = true [dependencies] array-bytes = "6.1" -clap = { version = "4.4.18", features = ["derive"] } -log = "0.4.17" +clap = { version = "4.5.3", features = ["derive"] } +log = { workspace = true, default-features = true } node-primitives = { path = "../primitives" } node-testing = { path = "../testing" } kitchensink-runtime = { path = "../runtime" } sc-client-api = { path = "../../../client/api" } sp-runtime = { path = "../../../primitives/runtime" } sp-state-machine = { path = "../../../primitives/state-machine" } -serde = "1.0.195" -serde_json = "1.0.111" +serde = { workspace = true, default-features = true } +serde_json = { workspace = true, default-features = true } derive_more = { version = "0.99.17", default-features = false, features = ["display"] } kvdb = "0.13.0" kvdb-rocksdb = "0.19.0" @@ -44,4 +44,4 @@ lazy_static = "1.4.0" parity-db = "0.4.12" sc-transaction-pool = { path = "../../../client/transaction-pool" } sc-transaction-pool-api = { path = "../../../client/transaction-pool/api" } -futures = { version = "0.3.21", features = ["thread-pool"] } +futures = { version = "0.3.30", features = ["thread-pool"] } diff --git a/substrate/bin/node/cli/Cargo.toml b/substrate/bin/node/cli/Cargo.toml index 5dfe915b789d5e2e22b56d786513214e9c4e26a6..e6f754fa40b1b6e7cc8faba9e149ee726be3b85b 100644 --- a/substrate/bin/node/cli/Cargo.toml +++ b/substrate/bin/node/cli/Cargo.toml @@ -41,12 +41,12 @@ crate-type = ["cdylib", "rlib"] [dependencies] # third-party dependencies array-bytes = "6.1" -clap = { version = "4.4.18", features = ["derive"], optional = true } +clap = { version = "4.5.3", features = ["derive"], optional = true } codec = { package = "parity-scale-codec", version = "3.6.1" } -serde = { version = "1.0.195", features = ["derive"] } -jsonrpsee = { version = "0.20.3", features = ["server"] } -futures = "0.3.21" -log = "0.4.17" +serde = { features = ["derive"], workspace = true, default-features = true } +jsonrpsee = { version = "0.22", features = ["server"] } +futures = "0.3.30" +log = { workspace = true, default-features = true } rand = "0.8" # primitives @@ -58,6 +58,7 @@ sp-api = { path = "../../../primitives/api" } sp-core = { path = "../../../primitives/core" } sp-runtime = { path = "../../../primitives/runtime" } sp-timestamp = { path = "../../../primitives/timestamp" } +sp-genesis-builder = { path = "../../../primitives/genesis-builder" } sp-inherents = { path = "../../../primitives/inherents" } sp-keyring = { path = "../../../primitives/keyring" } sp-keystore = { path = "../../../primitives/keystore" } @@ -115,8 +116,7 @@ node-primitives = { path = "../primitives" } sc-cli = { path = "../../../client/cli", optional = true } frame-benchmarking-cli = { path = "../../../utils/frame/benchmarking-cli", optional = true } node-inspect = { package = "staging-node-inspect", path = "../inspect", optional = true } -try-runtime-cli = { path = "../../../utils/frame/try-runtime/cli", optional = true } -serde_json = "1.0.111" +serde_json = { workspace = true, default-features = true } [dev-dependencies] sc-keystore = { path = "../../../client/keystore" } @@ -129,7 +129,7 @@ sc-block-builder = { path = "../../../client/block-builder" } sp-tracing = { path = "../../../primitives/tracing" } sp-blockchain = { path = "../../../primitives/blockchain" } sp-crypto-hashing = { path = "../../../primitives/crypto/hashing" } -futures = "0.3.21" +futures = "0.3.30" tempfile = "3.1.0" assert_cmd = "2.0.2" nix = { version = "0.26.1", features = ["signal"] } @@ -159,19 +159,18 @@ sp-consensus-babe = { path = "../../../primitives/consensus/babe" } sp-externalities = { path = "../../../primitives/externalities" } sp-keyring = { path = "../../../primitives/keyring" } sp-runtime = { path = "../../../primitives/runtime" } -serde_json = "1.0.111" -scale-info = { version = "2.10.0", features = ["derive", "serde"] } +serde_json = { workspace = true, default-features = true } +scale-info = { version = "2.11.1", features = ["derive", "serde"] } sp-trie = { path = "../../../primitives/trie" } sp-state-machine = { path = "../../../primitives/state-machine" } [build-dependencies] -clap = { version = "4.4.18", optional = true } +clap = { version = "4.5.3", optional = true } clap_complete = { version = "4.0.2", optional = true } node-inspect = { package = "staging-node-inspect", path = "../inspect", optional = true } frame-benchmarking-cli = { path = "../../../utils/frame/benchmarking-cli", optional = true } substrate-build-script-utils = { path = "../../../utils/build-script-utils", optional = true } substrate-frame-cli = { path = "../../../utils/frame/frame-utilities-cli", optional = true } -try-runtime-cli = { path = "../../../utils/frame/try-runtime/cli", optional = true } sc-cli = { path = "../../../client/cli", optional = true } pallet-balances = { path = "../../../frame/balances" } sc-storage-monitor = { path = "../../../client/storage-monitor" } @@ -187,7 +186,6 @@ cli = [ "sc-service/rocksdb", "substrate-build-script-utils", "substrate-frame-cli", - "try-runtime-cli", ] runtime-benchmarks = [ "frame-benchmarking-cli/runtime-benchmarks", @@ -231,7 +229,6 @@ try-runtime = [ "pallet-treasury/try-runtime", "sp-runtime/try-runtime", "substrate-cli-test-utils/try-runtime", - "try-runtime-cli/try-runtime", ] [[bench]] diff --git a/substrate/bin/node/cli/benches/block_production.rs b/substrate/bin/node/cli/benches/block_production.rs index c17c12dfef13e49662fe1ed8c73a9499e00535ec..f60610873d8c5a3832c77864a2c93fed023998ea 100644 --- a/substrate/bin/node/cli/benches/block_production.rs +++ b/substrate/bin/node/cli/benches/block_production.rs @@ -28,7 +28,7 @@ use sc_consensus::{ use sc_service::{ config::{ BlocksPruning, DatabaseSource, KeystoreConfig, NetworkConfiguration, OffchainWorkerConfig, - PruningMode, WasmExecutionMethod, WasmtimeInstantiationStrategy, + PruningMode, RpcBatchRequestConfig, WasmExecutionMethod, WasmtimeInstantiationStrategy, }, BasePath, Configuration, Role, }; @@ -84,6 +84,8 @@ fn new_node(tokio_handle: Handle) -> node_cli::service::NewFullBase { rpc_max_subs_per_conn: Default::default(), rpc_port: 9944, rpc_message_buffer_capacity: Default::default(), + rpc_batch_config: RpcBatchRequestConfig::Unlimited, + rpc_rate_limit: None, prometheus_config: None, telemetry_endpoints: None, default_heap_pages: None, @@ -102,8 +104,13 @@ fn new_node(tokio_handle: Handle) -> node_cli::service::NewFullBase { wasm_runtime_overrides: None, }; - node_cli::service::new_full_base(config, None, false, |_, _| ()) - .expect("creating a full node doesn't fail") + node_cli::service::new_full_base::>( + config, + None, + false, + |_, _| (), + ) + .expect("creating a full node doesn't fail") } fn extrinsic_set_time(now: u64) -> OpaqueExtrinsic { @@ -143,7 +150,7 @@ fn prepare_benchmark(client: &FullClient) -> (usize, Vec) { let src = Sr25519Keyring::Alice.pair(); let dst: MultiAddress = Sr25519Keyring::Bob.to_account_id().into(); - // Add as many tranfer extrinsics as possible into a single block. + // Add as many transfer extrinsics as possible into a single block. for nonce in 0.. { let extrinsic: OpaqueExtrinsic = create_extrinsic( client, @@ -177,7 +184,7 @@ fn block_production(c: &mut Criterion) { let node = new_node(tokio_handle.clone()); let client = &*node.client; - // Buliding the very first block is around ~30x slower than any subsequent one, + // Building the very first block is around ~30x slower than any subsequent one, // so let's make sure it's built and imported before we benchmark anything. let mut block_builder = BlockBuilderBuilder::new(client) .on_parent_block(client.chain_info().best_hash) diff --git a/substrate/bin/node/cli/benches/transaction_pool.rs b/substrate/bin/node/cli/benches/transaction_pool.rs index 0d0d3a072d89dd18ddf0362bc4b73dab54f8df51..1906ae697e9007ece7539757dbd40d9f504007bd 100644 --- a/substrate/bin/node/cli/benches/transaction_pool.rs +++ b/substrate/bin/node/cli/benches/transaction_pool.rs @@ -26,7 +26,7 @@ use node_primitives::AccountId; use sc_service::{ config::{ BlocksPruning, DatabaseSource, KeystoreConfig, NetworkConfiguration, OffchainWorkerConfig, - PruningMode, TransactionPoolOptions, + PruningMode, RpcBatchRequestConfig, TransactionPoolOptions, }, BasePath, Configuration, Role, }; @@ -80,6 +80,8 @@ fn new_node(tokio_handle: Handle) -> node_cli::service::NewFullBase { rpc_max_subs_per_conn: Default::default(), rpc_port: 9944, rpc_message_buffer_capacity: Default::default(), + rpc_batch_config: RpcBatchRequestConfig::Unlimited, + rpc_rate_limit: None, prometheus_config: None, telemetry_endpoints: None, default_heap_pages: None, @@ -99,7 +101,13 @@ fn new_node(tokio_handle: Handle) -> node_cli::service::NewFullBase { }; tokio_handle.block_on(async move { - node_cli::service::new_full_base(config, None, false, |_, _| ()).expect("Creates node") + node_cli::service::new_full_base::>( + config, + None, + false, + |_, _| (), + ) + .expect("Creates node") }) } diff --git a/substrate/bin/node/cli/src/chain_spec.rs b/substrate/bin/node/cli/src/chain_spec.rs index b6e8fb8a14edfa22a4d221515185b2748bc733c7..d48d4a50f85f2672d5e65c639a6a0b200c06756c 100644 --- a/substrate/bin/node/cli/src/chain_spec.rs +++ b/substrate/bin/node/cli/src/chain_spec.rs @@ -513,7 +513,7 @@ pub(crate) mod tests { sc_service_test::connectivity(integration_test_config_with_two_authorities(), |config| { let NewFullBase { task_manager, client, network, sync, transaction_pool, .. } = - new_full_base(config, None, false, |_, _| ())?; + new_full_base::>(config, None, false, |_, _| ())?; Ok(sc_service_test::TestNetComponents::new( task_manager, client, diff --git a/substrate/bin/node/cli/src/cli.rs b/substrate/bin/node/cli/src/cli.rs index f3c0435fd32dcaa71f9f94b78dcae01ff07c8b81..1d1af6e03e9e6eb57055b416038ee97ba95f3e3a 100644 --- a/substrate/bin/node/cli/src/cli.rs +++ b/substrate/bin/node/cli/src/cli.rs @@ -49,7 +49,7 @@ pub struct Cli { /// Possible subcommands of the main binary. #[derive(Debug, clap::Subcommand)] pub enum Subcommand { - /// The custom inspect subcommmand for decoding blocks and extrinsics. + /// The custom inspect subcommand for decoding blocks and extrinsics. #[command( name = "inspect", about = "Decode given block or extrinsic using current native runtime." @@ -61,11 +61,6 @@ pub enum Subcommand { #[command(subcommand)] Benchmark(frame_benchmarking_cli::BenchmarkCmd), - /// Try-runtime has migrated to a standalone CLI - /// (). The subcommand exists as a stub and - /// deprecation notice. It will be removed entirely some time after Janurary 2024. - TryRuntime, - /// Key management cli utilities #[command(subcommand)] Key(sc_cli::KeySubcommand), diff --git a/substrate/bin/node/cli/src/command.rs b/substrate/bin/node/cli/src/command.rs index dc28705c2aea9323d0ce84ae901d0206fe513efe..d869b77e9122859550232136d3907e2f33a4eda3 100644 --- a/substrate/bin/node/cli/src/command.rs +++ b/substrate/bin/node/cli/src/command.rs @@ -28,6 +28,7 @@ use node_primitives::Block; use sc_cli::{Result, SubstrateCli}; use sc_service::PartialComponents; use sp_keyring::Sr25519Keyring; +use sp_runtime::traits::HashingFor; use std::sync::Arc; @@ -106,7 +107,7 @@ pub fn run() -> Result<()> { ) } - cmd.run::(config) + cmd.run_with_spec::, sp_statement_store::runtime_api::HostFunctions>(Some(config.chain_spec)) }, BenchmarkCmd::Block(cmd) => { // ensure that we keep the task manager alive @@ -220,12 +221,6 @@ pub fn run() -> Result<()> { Ok((cmd.run(client, backend, Some(aux_revert)), task_manager)) }) }, - #[cfg(feature = "try-runtime")] - Some(Subcommand::TryRuntime) => Err(try_runtime_cli::DEPRECATION_NOTICE.into()), - #[cfg(not(feature = "try-runtime"))] - Some(Subcommand::TryRuntime) => Err("TryRuntime wasn't enabled when building the node. \ - You can enable it with `--features try-runtime`." - .into()), Some(Subcommand::ChainInfo(cmd)) => { let runner = cli.create_runner(cmd)?; runner.sync_run(|config| cmd.run::(&config)) diff --git a/substrate/bin/node/cli/src/service.rs b/substrate/bin/node/cli/src/service.rs index 8f2aba6b44cd0a980771ec7d84eb383421551a6b..5dc1193daf8d67f6f9067eb42a161dab9242efed 100644 --- a/substrate/bin/node/cli/src/service.rs +++ b/substrate/bin/node/cli/src/service.rs @@ -29,7 +29,9 @@ use kitchensink_runtime::RuntimeApi; use node_primitives::Block; use sc_client_api::{Backend, BlockBackend}; use sc_consensus_babe::{self, SlotProportion}; -use sc_network::{event::Event, NetworkEventStream, NetworkService}; +use sc_network::{ + event::Event, service::traits::NetworkService, NetworkBackend, NetworkEventStream, +}; use sc_network_sync::{strategy::warp::WarpSyncParams, SyncingService}; use sc_service::{config::Configuration, error::Error as ServiceError, RpcHandlers, TaskManager}; use sc_statement_store::Store as StatementStore; @@ -53,7 +55,7 @@ pub type HostFunctions = ( frame_benchmarking::benchmarking::HostFunctions, ); -/// A specialized `WasmExecutor` intended to use accross substrate node. It provides all required +/// A specialized `WasmExecutor` intended to use across substrate node. It provides all required /// HostFunctions. pub type RuntimeExecutor = sc_executor::WasmExecutor; @@ -368,7 +370,7 @@ pub struct NewFullBase { /// The client instance of the node. pub client: Arc, /// The networking service of the node. - pub network: Arc::Hash>>, + pub network: Arc, /// The syncing service of the node. pub sync: Arc>, /// The transaction pool of the node. @@ -378,7 +380,7 @@ pub struct NewFullBase { } /// Creates a full service from the configuration. -pub fn new_full_base( +pub fn new_full_base::Hash>>( config: Configuration, mixnet_config: Option, disable_hardware_benchmarks: bool, @@ -420,14 +422,26 @@ pub fn new_full_base( (rpc_builder, import_setup, rpc_setup, mut telemetry, statement_store, mixnet_api_backend), } = new_partial(&config, mixnet_config.as_ref())?; + let metrics = N::register_notification_metrics( + config.prometheus_config.as_ref().map(|cfg| &cfg.registry), + ); let shared_voter_state = rpc_setup; let auth_disc_publish_non_global_ips = config.network.allow_non_globals_in_dht; - let mut net_config = sc_network::config::FullNetworkConfiguration::new(&config.network); + let auth_disc_public_addresses = config.network.public_addresses.clone(); + + let mut net_config = + sc_network::config::FullNetworkConfiguration::<_, _, N>::new(&config.network); + let genesis_hash = client.block_hash(0).ok().flatten().expect("Genesis block exists; qed"); + let peer_store_handle = net_config.peer_store_handle(); let grandpa_protocol_name = grandpa::protocol_standard_name(&genesis_hash, &config.chain_spec); let (grandpa_protocol_config, grandpa_notification_service) = - grandpa::grandpa_peers_set_config(grandpa_protocol_name.clone()); + grandpa::grandpa_peers_set_config::<_, N>( + grandpa_protocol_name.clone(), + metrics.clone(), + Arc::clone(&peer_store_handle), + ); net_config.add_notification_protocol(grandpa_protocol_config); let beefy_gossip_proto_name = @@ -435,7 +449,7 @@ pub fn new_full_base( // `beefy_on_demand_justifications_handler` is given to `beefy-gadget` task to be run, // while `beefy_req_resp_cfg` is added to `config.network.request_response_protocols`. let (beefy_on_demand_justifications_handler, beefy_req_resp_cfg) = - beefy::communication::request_response::BeefyJustifsRequestHandler::new( + beefy::communication::request_response::BeefyJustifsRequestHandler::new::<_, N>( &genesis_hash, config.chain_spec.fork_id(), client.clone(), @@ -443,23 +457,33 @@ pub fn new_full_base( ); let (beefy_notification_config, beefy_notification_service) = - beefy::communication::beefy_peers_set_config(beefy_gossip_proto_name.clone()); + beefy::communication::beefy_peers_set_config::<_, N>( + beefy_gossip_proto_name.clone(), + metrics.clone(), + Arc::clone(&peer_store_handle), + ); net_config.add_notification_protocol(beefy_notification_config); net_config.add_request_response_protocol(beefy_req_resp_cfg); let (statement_handler_proto, statement_config) = - sc_network_statement::StatementHandlerPrototype::new( + sc_network_statement::StatementHandlerPrototype::new::<_, _, N>( genesis_hash, config.chain_spec.fork_id(), + metrics.clone(), + Arc::clone(&peer_store_handle), ); net_config.add_notification_protocol(statement_config); let mixnet_protocol_name = sc_mixnet::protocol_name(genesis_hash.as_ref(), config.chain_spec.fork_id()); let mixnet_notification_service = mixnet_config.as_ref().map(|mixnet_config| { - let (config, notification_service) = - sc_mixnet::peers_set_config(mixnet_protocol_name.clone(), mixnet_config); + let (config, notification_service) = sc_mixnet::peers_set_config::<_, N>( + mixnet_protocol_name.clone(), + mixnet_config, + metrics.clone(), + Arc::clone(&peer_store_handle), + ); net_config.add_notification_protocol(config); notification_service }); @@ -481,6 +505,7 @@ pub fn new_full_base( block_announce_validator_builder: None, warp_sync_params: Some(WarpSyncParams::WithProvider(warp_sync)), block_relay: None, + metrics, })?; if let Some(mixnet_config) = mixnet_config { @@ -610,10 +635,11 @@ pub fn new_full_base( sc_authority_discovery::new_worker_and_service_with_config( sc_authority_discovery::WorkerConfig { publish_non_global_ips: auth_disc_publish_non_global_ips, + public_addresses: auth_disc_public_addresses, ..Default::default() }, client.clone(), - network.clone(), + Arc::new(network.clone()), Box::pin(dht_event_stream), authority_discovery_role, prometheus_registry.clone(), @@ -632,7 +658,7 @@ pub fn new_full_base( // beefy is enabled if its notification service exists let network_params = beefy::BeefyNetworkParams { - network: network.clone(), + network: Arc::new(network.clone()), sync: sync_service.clone(), gossip_protocol_name: beefy_gossip_proto_name, justifications_protocol_name: beefy_on_demand_justifications_handler.protocol_name(), @@ -650,6 +676,7 @@ pub fn new_full_base( prometheus_registry: prometheus_registry.clone(), links: beefy_links, on_demand_justifications_handler: beefy_on_demand_justifications_handler, + is_authority: role.is_authority(), }; let beefy_gadget = beefy::start_beefy_gadget::<_, _, _, _, _, _, _>(beefy_params); @@ -743,7 +770,7 @@ pub fn new_full_base( transaction_pool: Some(OffchainTransactionPoolFactory::new( transaction_pool.clone(), )), - network_provider: network.clone(), + network_provider: Arc::new(network.clone()), is_validator: role.is_authority(), enable_http_requests: true, custom_extensions: move |_| { @@ -770,8 +797,29 @@ pub fn new_full_base( pub fn new_full(config: Configuration, cli: Cli) -> Result { let mixnet_config = cli.mixnet_params.config(config.role.is_authority()); let database_path = config.database.path().map(Path::to_path_buf); - let task_manager = new_full_base(config, mixnet_config, cli.no_hardware_benchmarks, |_, _| ()) - .map(|NewFullBase { task_manager, .. }| task_manager)?; + + let task_manager = match config.network.network_backend { + sc_network::config::NetworkBackendType::Libp2p => { + let task_manager = new_full_base::>( + config, + mixnet_config, + cli.no_hardware_benchmarks, + |_, _| (), + ) + .map(|NewFullBase { task_manager, .. }| task_manager)?; + task_manager + }, + sc_network::config::NetworkBackendType::Litep2p => { + let task_manager = new_full_base::( + config, + mixnet_config, + cli.no_hardware_benchmarks, + |_, _| (), + ) + .map(|NewFullBase { task_manager, .. }| task_manager)?; + task_manager + }, + }; if let Some(database_path) = database_path { sc_storage_monitor::StorageMonitorService::try_spawn( @@ -848,7 +896,7 @@ mod tests { |config| { let mut setup_handles = None; let NewFullBase { task_manager, client, network, sync, transaction_pool, .. } = - new_full_base( + new_full_base::>( config, None, false, @@ -1026,7 +1074,12 @@ mod tests { crate::chain_spec::tests::integration_test_config_with_two_authorities(), |config| { let NewFullBase { task_manager, client, network, sync, transaction_pool, .. } = - new_full_base(config, None, false, |_, _| ())?; + new_full_base::>( + config, + None, + false, + |_, _| (), + )?; Ok(sc_service_test::TestNetComponents::new( task_manager, client, diff --git a/substrate/bin/node/cli/tests/basic.rs b/substrate/bin/node/cli/tests/basic.rs index 525ab2e39c1287edcf235fe3ac6381e3f0fc8e10..a9eea84d926000fafce766d3aa2889919ef5c376 100644 --- a/substrate/bin/node/cli/tests/basic.rs +++ b/substrate/bin/node/cli/tests/basic.rs @@ -838,10 +838,16 @@ fn should_import_block_with_test_client() { #[test] fn default_config_as_json_works() { let mut t = new_test_ext(compact_code_unwrap()); - let r = executor_call(&mut t, "GenesisBuilder_create_default_config", &vec![]) - .0 - .unwrap(); - let r = Vec::::decode(&mut &r[..]).unwrap(); + let r = executor_call( + &mut t, + "GenesisBuilder_get_preset", + &None::<&sp_genesis_builder::PresetId>.encode(), + ) + .0 + .unwrap(); + let r = Option::>::decode(&mut &r[..]) + .unwrap() + .expect("default config is there"); let json = String::from_utf8(r.into()).expect("returned value is json. qed."); let expected = include_str!("res/default_genesis_config.json").to_string(); diff --git a/substrate/bin/node/cli/tests/fees.rs b/substrate/bin/node/cli/tests/fees.rs index 8c7b3c873157770a8f156a019aa7e43e66460bae..69c96bf63a6d8d7b7c24746cdf5c3c48b526c12e 100644 --- a/substrate/bin/node/cli/tests/fees.rs +++ b/substrate/bin/node/cli/tests/fees.rs @@ -135,7 +135,7 @@ fn transaction_fee_is_correct() { // if weight of the cheapest weight would be 10^7, this would be 10^9, which is: // - 1 MILLICENTS in substrate node. // - 1 milli-dot based on current polkadot runtime. - // (this baed on assigning 0.1 CENT to the cheapest tx with `weight = 100`) + // (this based on assigning 0.1 CENT to the cheapest tx with `weight = 100`) let mut t = new_test_ext(compact_code_unwrap()); t.insert(>::hashed_key_for(alice()), new_account_info(100)); t.insert(>::hashed_key_for(bob()), new_account_info(10)); diff --git a/substrate/bin/node/cli/tests/res/default_genesis_config.json b/substrate/bin/node/cli/tests/res/default_genesis_config.json index 1465a6497cadb3d79f75910dc2e084c168559c62..e21fbb47da8c4619e0923c85bf3470828cd80b23 100644 --- a/substrate/bin/node/cli/tests/res/default_genesis_config.json +++ b/substrate/bin/node/cli/tests/res/default_genesis_config.json @@ -2,7 +2,13 @@ "system": {}, "babe": { "authorities": [], - "epochConfig": null + "epochConfig": { + "allowed_slots": "PrimaryAndSecondaryVRFSlots", + "c": [ + 1, + 4 + ] + } }, "indices": { "indices": [] diff --git a/substrate/bin/node/inspect/Cargo.toml b/substrate/bin/node/inspect/Cargo.toml index e703e312b51bb144cc1c2dd18b927d7d40908b3c..8453aa3cdeb18715afede5d93fb52f3c6b39be7e 100644 --- a/substrate/bin/node/inspect/Cargo.toml +++ b/substrate/bin/node/inspect/Cargo.toml @@ -15,9 +15,9 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -clap = { version = "4.4.18", features = ["derive"] } +clap = { version = "4.5.3", features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.6.1" } -thiserror = "1.0" +thiserror = { workspace = true } sc-cli = { path = "../../../client/cli" } sc-client-api = { path = "../../../client/api" } sc-service = { path = "../../../client/service", default-features = false } diff --git a/substrate/bin/node/rpc/Cargo.toml b/substrate/bin/node/rpc/Cargo.toml index 63a30965a160603094a1058b30dcd026ec18b6a0..894dbf0da85ca56d412087adf01fa12c7983ae7a 100644 --- a/substrate/bin/node/rpc/Cargo.toml +++ b/substrate/bin/node/rpc/Cargo.toml @@ -16,7 +16,7 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -jsonrpsee = { version = "0.20.3", features = ["server"] } +jsonrpsee = { version = "0.22", features = ["server"] } node-primitives = { path = "../primitives" } pallet-transaction-payment-rpc = { path = "../../../frame/transaction-payment/rpc" } mmr-rpc = { path = "../../../client/merkle-mountain-range/rpc" } diff --git a/substrate/bin/node/runtime/Cargo.toml b/substrate/bin/node/runtime/Cargo.toml index 4bb5fed2b09a210ff4915609b1b825746ed4f514..f4ed75b919642811ace4147076245c912a0e7d07 100644 --- a/substrate/bin/node/runtime/Cargo.toml +++ b/substrate/bin/node/runtime/Cargo.toml @@ -23,10 +23,10 @@ codec = { package = "parity-scale-codec", version = "3.6.1", default-features = "derive", "max-encoded-len", ] } -scale-info = { version = "2.10.0", default-features = false, features = ["derive", "serde"] } +scale-info = { version = "2.11.1", default-features = false, features = ["derive", "serde"] } static_assertions = "1.1.0" -log = { version = "0.4.17", default-features = false } -serde_json = { version = "1.0.111", default-features = false, features = ["alloc", "arbitrary_precision"] } +log = { workspace = true } +serde_json = { features = ["alloc", "arbitrary_precision"], workspace = true } # pallet-asset-conversion: turn on "num-traits" feature primitive-types = { version = "0.12.0", default-features = false, features = ["codec", "num-traits", "scale-info"] } @@ -58,7 +58,7 @@ sp-io = { path = "../../../primitives/io", default-features = false } frame-executive = { path = "../../../frame/executive", default-features = false } frame-benchmarking = { path = "../../../frame/benchmarking", default-features = false } frame-benchmarking-pallet-pov = { path = "../../../frame/benchmarking/pov", default-features = false } -frame-support = { path = "../../../frame/support", default-features = false, features = ["tuples-96"] } +frame-support = { path = "../../../frame/support", default-features = false, features = ["experimental", "tuples-96"] } frame-system = { path = "../../../frame/system", default-features = false } frame-system-benchmarking = { path = "../../../frame/system/benchmarking", default-features = false, optional = true } frame-election-provider-support = { path = "../../../frame/election-provider-support", default-features = false } @@ -88,6 +88,8 @@ pallet-election-provider-support-benchmarking = { path = "../../../frame/electio pallet-elections-phragmen = { path = "../../../frame/elections-phragmen", default-features = false } pallet-example-tasks = { path = "../../../frame/examples/tasks", default-features = false } pallet-fast-unstake = { path = "../../../frame/fast-unstake", default-features = false } +pallet-migrations = { path = "../../../frame/migrations", default-features = false } +pallet-example-mbm = { path = "../../../frame/examples/multi-block-migrations", default-features = false } pallet-nis = { path = "../../../frame/nis", default-features = false } pallet-grandpa = { path = "../../../frame/grandpa", default-features = false } pallet-im-online = { path = "../../../frame/im-online", default-features = false } @@ -142,6 +144,7 @@ pallet-vesting = { path = "../../../frame/vesting", default-features = false } pallet-whitelist = { path = "../../../frame/whitelist", default-features = false } pallet-tx-pause = { path = "../../../frame/tx-pause", default-features = false } pallet-safe-mode = { path = "../../../frame/safe-mode", default-features = false } +pallet-parameters = { path = "../../../frame/parameters", default-features = false } [build-dependencies] substrate-wasm-builder = { path = "../../../utils/wasm-builder", optional = true } @@ -186,6 +189,7 @@ std = [ "pallet-election-provider-multi-phase/std", "pallet-election-provider-support-benchmarking?/std", "pallet-elections-phragmen/std", + "pallet-example-mbm/std", "pallet-example-tasks/std", "pallet-fast-unstake/std", "pallet-glutton/std", @@ -197,6 +201,7 @@ std = [ "pallet-lottery/std", "pallet-membership/std", "pallet-message-queue/std", + "pallet-migrations/std", "pallet-mixnet/std", "pallet-mmr/std", "pallet-multisig/std", @@ -209,6 +214,7 @@ std = [ "pallet-nomination-pools/std", "pallet-offences-benchmarking?/std", "pallet-offences/std", + "pallet-parameters/std", "pallet-preimage/std", "pallet-proxy/std", "pallet-ranked-collective/std", @@ -290,6 +296,7 @@ runtime-benchmarks = [ "pallet-election-provider-multi-phase/runtime-benchmarks", "pallet-election-provider-support-benchmarking/runtime-benchmarks", "pallet-elections-phragmen/runtime-benchmarks", + "pallet-example-mbm/runtime-benchmarks", "pallet-example-tasks/runtime-benchmarks", "pallet-fast-unstake/runtime-benchmarks", "pallet-glutton/runtime-benchmarks", @@ -300,6 +307,7 @@ runtime-benchmarks = [ "pallet-lottery/runtime-benchmarks", "pallet-membership/runtime-benchmarks", "pallet-message-queue/runtime-benchmarks", + "pallet-migrations/runtime-benchmarks", "pallet-mixnet/runtime-benchmarks", "pallet-mmr/runtime-benchmarks", "pallet-multisig/runtime-benchmarks", @@ -310,6 +318,7 @@ runtime-benchmarks = [ "pallet-nomination-pools/runtime-benchmarks", "pallet-offences-benchmarking/runtime-benchmarks", "pallet-offences/runtime-benchmarks", + "pallet-parameters/runtime-benchmarks", "pallet-preimage/runtime-benchmarks", "pallet-proxy/runtime-benchmarks", "pallet-ranked-collective/runtime-benchmarks", @@ -367,6 +376,7 @@ try-runtime = [ "pallet-democracy/try-runtime", "pallet-election-provider-multi-phase/try-runtime", "pallet-elections-phragmen/try-runtime", + "pallet-example-mbm/try-runtime", "pallet-example-tasks/try-runtime", "pallet-fast-unstake/try-runtime", "pallet-glutton/try-runtime", @@ -378,6 +388,7 @@ try-runtime = [ "pallet-lottery/try-runtime", "pallet-membership/try-runtime", "pallet-message-queue/try-runtime", + "pallet-migrations/try-runtime", "pallet-mixnet/try-runtime", "pallet-mmr/try-runtime", "pallet-multisig/try-runtime", @@ -386,6 +397,7 @@ try-runtime = [ "pallet-nis/try-runtime", "pallet-nomination-pools/try-runtime", "pallet-offences/try-runtime", + "pallet-parameters/try-runtime", "pallet-preimage/try-runtime", "pallet-proxy/try-runtime", "pallet-ranked-collective/try-runtime", diff --git a/substrate/bin/node/runtime/src/impls.rs b/substrate/bin/node/runtime/src/impls.rs index 7ff52a758b3dd756dc4536df5928d3b2bb68a148..34f043b33a4edfe2d8cdbe154896e937826110ca 100644 --- a/substrate/bin/node/runtime/src/impls.rs +++ b/substrate/bin/node/runtime/src/impls.rs @@ -30,8 +30,8 @@ use pallet_identity::legacy::IdentityField; use sp_std::prelude::*; use crate::{ - AccountId, AllianceMotion, Assets, Authorship, Balances, Hash, NegativeImbalance, Runtime, - RuntimeCall, + AccountId, AllianceCollective, AllianceMotion, Assets, Authorship, Balances, Hash, + NegativeImbalance, Runtime, RuntimeCall, }; pub struct Author; @@ -107,7 +107,7 @@ impl ProposalProvider for AllianceProposalProvider } fn proposal_of(proposal_hash: Hash) -> Option { - AllianceMotion::proposal_of(proposal_hash) + pallet_collective::ProposalOf::::get(proposal_hash) } } @@ -276,7 +276,7 @@ mod multiplier_tests { let next = runtime_multiplier_update(fm); fm = next; if fm == min_multiplier() { - break + break; } iterations += 1; } diff --git a/substrate/bin/node/runtime/src/lib.rs b/substrate/bin/node/runtime/src/lib.rs index a39bb870fd8791d14ecb9d94badb0d08e14fad76..89f3dd892d4ca6cceaa1dffa645717bc405617b1 100644 --- a/substrate/bin/node/runtime/src/lib.rs +++ b/substrate/bin/node/runtime/src/lib.rs @@ -28,9 +28,10 @@ use frame_election_provider_support::{ onchain, BalancingConfig, ElectionDataProvider, SequentialPhragmen, VoteWeight, }; use frame_support::{ - construct_runtime, derive_impl, + derive_impl, dispatch::DispatchClass, - genesis_builder_helper::{build_config, create_default_config}, + dynamic_params::{dynamic_pallet_params, dynamic_params}, + genesis_builder_helper::{build_state, get_preset}, instances::{Instance1, Instance2}, ord_parameter_types, pallet_prelude::Get, @@ -44,9 +45,9 @@ use frame_support::{ GetSalary, PayFromAccount, }, AsEnsureOriginWithArg, ConstBool, ConstU128, ConstU16, ConstU32, Contains, Currency, - EitherOfDiverse, EqualPrivilegeOnly, Imbalance, InsideBoth, InstanceFilter, - KeyOwnerProofSystem, LinearStoragePrice, LockIdentifier, Nothing, OnUnbalanced, - WithdrawReasons, + EitherOfDiverse, EnsureOriginWithArg, EqualPrivilegeOnly, Imbalance, InsideBoth, + InstanceFilter, KeyOwnerProofSystem, LinearStoragePrice, LockIdentifier, Nothing, + OnUnbalanced, WithdrawReasons, }, weights::{ constants::{ @@ -70,6 +71,9 @@ use pallet_im_online::sr25519::AuthorityId as ImOnlineId; use pallet_nfts::PalletFeatures; use pallet_nis::WithMaximumOf; use pallet_session::historical as pallet_session_historical; +// Can't use `FungibleAdapter` here until Treasury pallet migrates to fungibles +// +#[allow(deprecated)] pub use pallet_transaction_payment::{CurrencyAdapter, Multiplier, TargetedFeeAdjustment}; use pallet_transaction_payment::{FeeDetails, RuntimeDispatchInfo}; use pallet_tx_pause::RuntimeCallNameOf; @@ -292,7 +296,7 @@ impl pallet_safe_mode::Config for Runtime { type WeightInfo = pallet_safe_mode::weights::SubstrateWeight; } -#[derive_impl(frame_system::config_preludes::SolochainDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::SolochainDefaultConfig)] impl frame_system::Config for Runtime { type BaseCallFilter = InsideBoth; type BlockWeights = RuntimeBlockWeights; @@ -309,6 +313,7 @@ impl frame_system::Config for Runtime { type SystemWeightInfo = frame_system::weights::SubstrateWeight; type SS58Prefix = ConstU16<42>; type MaxConsumers = ConstU32<16>; + type MultiBlockMigrator = MultiBlockMigrations; } impl pallet_insecure_randomness_collective_flip::Config for Runtime {} @@ -318,6 +323,8 @@ impl pallet_example_tasks::Config for Runtime { type WeightInfo = pallet_example_tasks::weights::SubstrateWeight; } +impl pallet_example_mbm::Config for Runtime {} + impl pallet_utility::Config for Runtime { type RuntimeEvent = RuntimeEvent; type RuntimeCall = RuntimeCall; @@ -457,9 +464,6 @@ impl pallet_glutton::Config for Runtime { } parameter_types! { - pub const PreimageBaseDeposit: Balance = 1 * DOLLARS; - // One cent: $10,000 / MB - pub const PreimageByteDeposit: Balance = 1 * CENTS; pub const PreimageHoldReason: RuntimeHoldReason = RuntimeHoldReason::Preimage(pallet_preimage::HoldReason::Preimage); } @@ -472,7 +476,11 @@ impl pallet_preimage::Config for Runtime { AccountId, Balances, PreimageHoldReason, - LinearStoragePrice, + LinearStoragePrice< + dynamic_params::storage::BaseDeposit, + dynamic_params::storage::ByteDeposit, + Balance, + >, >; } @@ -544,6 +552,9 @@ parameter_types! { pub MaximumMultiplier: Multiplier = Bounded::max_value(); } +// Can't use `FungibleAdapter` here until Treasury pallet migrates to fungibles +// +#[allow(deprecated)] impl pallet_transaction_payment::Config for Runtime { type RuntimeEvent = RuntimeEvent; type OnChargeTransaction = CurrencyAdapter; @@ -906,6 +917,10 @@ impl pallet_nomination_pools::Config for Runtime { type MaxUnbonding = ConstU32<8>; type PalletId = NominationPoolsPalletId; type MaxPointsToBalance = MaxPointsToBalance; + type AdminOrigin = EitherOfDiverse< + EnsureRoot, + pallet_collective::EnsureProportionAtLeast, + >; } parameter_types! { @@ -1013,6 +1028,8 @@ impl pallet_referenda::Config for Runtime { impl pallet_ranked_collective::Config for Runtime { type WeightInfo = pallet_ranked_collective::weights::SubstrateWeight; type RuntimeEvent = RuntimeEvent; + type AddOrigin = EnsureRoot; + type RemoveOrigin = Self::DemoteOrigin; type PromoteOrigin = EnsureRootWithSuccess>; type DemoteOrigin = EnsureRootWithSuccess>; type ExchangeOrigin = EnsureRootWithSuccess>; @@ -1298,6 +1315,7 @@ impl pallet_message_queue::Config for Runtime { type HeapSize = ConstU32<{ 64 * 1024 }>; type MaxStale = ConstU32<128>; type ServiceWeight = MessageQueueServiceWeight; + type IdleMaxServiceWeight = (); } parameter_types! { @@ -1324,9 +1342,6 @@ impl pallet_tips::Config for Runtime { } parameter_types! { - pub const DepositPerItem: Balance = deposit(1, 0); - pub const DepositPerByte: Balance = deposit(0, 1); - pub const DefaultDepositLimit: Balance = deposit(1024, 1024 * 1024); pub Schedule: pallet_contracts::Schedule = Default::default(); pub CodeHashLockupDepositPercent: Perbill = Perbill::from_percent(30); } @@ -1344,9 +1359,9 @@ impl pallet_contracts::Config for Runtime { /// change because that would break already deployed contracts. The `Call` structure itself /// is not allowed to change the indices of existing pallets, too. type CallFilter = Nothing; - type DepositPerItem = DepositPerItem; - type DepositPerByte = DepositPerByte; - type DefaultDepositLimit = DefaultDepositLimit; + type DepositPerItem = dynamic_params::contracts::DepositPerItem; + type DepositPerByte = dynamic_params::contracts::DepositPerByte; + type DefaultDepositLimit = dynamic_params::contracts::DefaultDepositLimit; type CallStack = [pallet_contracts::Frame; 5]; type WeightPrice = pallet_transaction_payment::Pallet; type WeightInfo = pallet_contracts::weights::SubstrateWeight; @@ -1356,6 +1371,8 @@ impl pallet_contracts::Config for Runtime { type MaxCodeLen = ConstU32<{ 123 * 1024 }>; type MaxStorageKeyLen = ConstU32<128>; type UnsafeUnstableInterface = ConstBool; + type UploadOrigin = EnsureSigned; + type InstantiateOrigin = EnsureSigned; type MaxDebugBufferLen = ConstU32<{ 2 * 1024 * 1024 }>; type RuntimeHoldReason = RuntimeHoldReason; #[cfg(not(feature = "runtime-benchmarks"))] @@ -1366,6 +1383,7 @@ impl pallet_contracts::Config for Runtime { type CodeHashLockupDepositPercent = CodeHashLockupDepositPercent; type Debug = (); type Environment = (); + type ApiVersion = (); type Xcm = (); } @@ -1745,6 +1763,25 @@ impl pallet_nis::Config for Runtime { type MaxIntakeWeight = MaxIntakeWeight; type ThawThrottle = ThawThrottle; type RuntimeHoldReason = RuntimeHoldReason; + #[cfg(feature = "runtime-benchmarks")] + type BenchmarkSetup = SetupAsset; +} + +#[cfg(feature = "runtime-benchmarks")] +pub struct SetupAsset; +#[cfg(feature = "runtime-benchmarks")] +impl pallet_nis::BenchmarkSetup for SetupAsset { + fn create_counterpart_asset() { + let owner = AccountId::from([0u8; 32]); + // this may or may not fail depending on if the chain spec or runtime genesis is used. + let _ = Assets::force_create( + RuntimeOrigin::root(), + 9u32.into(), + sp_runtime::MultiAddress::Id(owner), + true, + 1, + ); + } } parameter_types! { @@ -2005,6 +2042,25 @@ impl pallet_statement::Config for Runtime { type MaxAllowedBytes = MaxAllowedBytes; } +parameter_types! { + pub MbmServiceWeight: Weight = Perbill::from_percent(80) * RuntimeBlockWeights::get().max_block; +} + +impl pallet_migrations::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + #[cfg(not(feature = "runtime-benchmarks"))] + type Migrations = (); + // Benchmarks need mocked migrations to guarantee that they succeed. + #[cfg(feature = "runtime-benchmarks")] + type Migrations = pallet_migrations::mock_helpers::MockedMigrations; + type CursorMaxLen = ConstU32<65_536>; + type IdentifierMaxLen = ConstU32<256>; + type MigrationStatusHandler = (); + type FailedMigrationHandler = frame_support::migrations::FreezeChainOnFailedMigration; + type MaxServiceWeight = MbmServiceWeight; + type WeightInfo = pallet_migrations::weights::SubstrateWeight; +} + parameter_types! { pub const BrokerPalletId: PalletId = PalletId(*b"py/broke"); } @@ -2026,7 +2082,7 @@ pub struct CoretimeProvider; impl CoretimeInterface for CoretimeProvider { type AccountId = AccountId; type Balance = Balance; - type RealyChainBlockNumberProvider = System; + type RelayChainBlockNumberProvider = System; fn request_core_count(_count: CoreIndex) {} fn request_revenue_info_at(_when: u32) {} fn credit_account(_who: Self::AccountId, _amount: Self::Balance) {} @@ -2086,90 +2142,338 @@ impl pallet_mixnet::Config for Runtime { type MinMixnodes = ConstU32<7>; // Low to allow small testing networks } -construct_runtime!( - pub enum Runtime { - System: frame_system, - Utility: pallet_utility, - Babe: pallet_babe, - Timestamp: pallet_timestamp, - // Authorship must be before session in order to note author in the correct session and era - // for im-online and staking. - Authorship: pallet_authorship, - Indices: pallet_indices, - Balances: pallet_balances, - TransactionPayment: pallet_transaction_payment, - AssetTxPayment: pallet_asset_tx_payment, - AssetConversionTxPayment: pallet_asset_conversion_tx_payment, - ElectionProviderMultiPhase: pallet_election_provider_multi_phase, - Staking: pallet_staking, - Session: pallet_session, - Democracy: pallet_democracy, - Council: pallet_collective::, - TechnicalCommittee: pallet_collective::, - Elections: pallet_elections_phragmen, - TechnicalMembership: pallet_membership::, - Grandpa: pallet_grandpa, - Treasury: pallet_treasury, - AssetRate: pallet_asset_rate, - Contracts: pallet_contracts, - Sudo: pallet_sudo, - ImOnline: pallet_im_online, - AuthorityDiscovery: pallet_authority_discovery, - Offences: pallet_offences, - Historical: pallet_session_historical, - RandomnessCollectiveFlip: pallet_insecure_randomness_collective_flip, - Identity: pallet_identity, - Society: pallet_society, - Recovery: pallet_recovery, - Vesting: pallet_vesting, - Scheduler: pallet_scheduler, - Glutton: pallet_glutton, - Preimage: pallet_preimage, - Proxy: pallet_proxy, - Multisig: pallet_multisig, - Bounties: pallet_bounties, - Tips: pallet_tips, - Assets: pallet_assets::, - PoolAssets: pallet_assets::, - Beefy: pallet_beefy, - // MMR leaf construction must be after session in order to have a leaf's next_auth_set - // refer to block. See issue polkadot-fellows/runtimes#160 for details. - Mmr: pallet_mmr, - MmrLeaf: pallet_beefy_mmr, - Lottery: pallet_lottery, - Nis: pallet_nis, - Uniques: pallet_uniques, - Nfts: pallet_nfts, - NftFractionalization: pallet_nft_fractionalization, - Salary: pallet_salary, - CoreFellowship: pallet_core_fellowship, - TransactionStorage: pallet_transaction_storage, - VoterList: pallet_bags_list::, - StateTrieMigration: pallet_state_trie_migration, - ChildBounties: pallet_child_bounties, - Referenda: pallet_referenda, - Remark: pallet_remark, - RootTesting: pallet_root_testing, - ConvictionVoting: pallet_conviction_voting, - Whitelist: pallet_whitelist, - AllianceMotion: pallet_collective::, - Alliance: pallet_alliance, - NominationPools: pallet_nomination_pools, - RankedPolls: pallet_referenda::, - RankedCollective: pallet_ranked_collective, - AssetConversion: pallet_asset_conversion, - FastUnstake: pallet_fast_unstake, - MessageQueue: pallet_message_queue, - Pov: frame_benchmarking_pallet_pov, - TxPause: pallet_tx_pause, - SafeMode: pallet_safe_mode, - Statement: pallet_statement, - Broker: pallet_broker, - TasksExample: pallet_example_tasks, - Mixnet: pallet_mixnet, - SkipFeelessPayment: pallet_skip_feeless_payment, +/// Dynamic parameters that can be changed at runtime through the +/// `pallet_parameters::set_parameter`. +#[dynamic_params(RuntimeParameters, pallet_parameters::Parameters::)] +pub mod dynamic_params { + use super::*; + + #[dynamic_pallet_params] + #[codec(index = 0)] + pub mod storage { + /// Configures the base deposit of storing some data. + #[codec(index = 0)] + pub static BaseDeposit: Balance = 1 * DOLLARS; + + /// Configures the per-byte deposit of storing some data. + #[codec(index = 1)] + pub static ByteDeposit: Balance = 1 * CENTS; } -); + + #[dynamic_pallet_params] + #[codec(index = 1)] + pub mod contracts { + #[codec(index = 0)] + pub static DepositPerItem: Balance = deposit(1, 0); + + #[codec(index = 1)] + pub static DepositPerByte: Balance = deposit(0, 1); + + #[codec(index = 2)] + pub static DefaultDepositLimit: Balance = deposit(1024, 1024 * 1024); + } +} + +#[cfg(feature = "runtime-benchmarks")] +impl Default for RuntimeParameters { + fn default() -> Self { + RuntimeParameters::Storage(dynamic_params::storage::Parameters::BaseDeposit( + dynamic_params::storage::BaseDeposit, + Some(1 * DOLLARS), + )) + } +} + +pub struct DynamicParametersManagerOrigin; +impl EnsureOriginWithArg for DynamicParametersManagerOrigin { + type Success = (); + + fn try_origin( + origin: RuntimeOrigin, + key: &RuntimeParametersKey, + ) -> Result { + match key { + RuntimeParametersKey::Storage(_) => { + frame_system::ensure_root(origin.clone()).map_err(|_| origin)?; + return Ok(()) + }, + RuntimeParametersKey::Contract(_) => { + frame_system::ensure_root(origin.clone()).map_err(|_| origin)?; + return Ok(()) + }, + } + } + + #[cfg(feature = "runtime-benchmarks")] + fn try_successful_origin(_key: &RuntimeParametersKey) -> Result { + Ok(RuntimeOrigin::root()) + } +} + +impl pallet_parameters::Config for Runtime { + type RuntimeParameters = RuntimeParameters; + type RuntimeEvent = RuntimeEvent; + type AdminOrigin = DynamicParametersManagerOrigin; + type WeightInfo = (); +} + +#[frame_support::runtime] +mod runtime { + #[runtime::runtime] + #[runtime::derive( + RuntimeCall, + RuntimeEvent, + RuntimeError, + RuntimeOrigin, + RuntimeFreezeReason, + RuntimeHoldReason, + RuntimeSlashReason, + RuntimeLockId, + RuntimeTask + )] + pub struct Runtime; + + #[runtime::pallet_index(0)] + pub type System = frame_system; + + #[runtime::pallet_index(1)] + pub type Utility = pallet_utility; + + #[runtime::pallet_index(2)] + pub type Babe = pallet_babe; + + #[runtime::pallet_index(3)] + pub type Timestamp = pallet_timestamp; + + // Authorship must be before session in order to note author in the correct session and era + // for im-online and staking. + #[runtime::pallet_index(4)] + pub type Authorship = pallet_authorship; + + #[runtime::pallet_index(5)] + pub type Indices = pallet_indices; + + #[runtime::pallet_index(6)] + pub type Balances = pallet_balances; + + #[runtime::pallet_index(7)] + pub type TransactionPayment = pallet_transaction_payment; + + #[runtime::pallet_index(8)] + pub type AssetTxPayment = pallet_asset_tx_payment; + + #[runtime::pallet_index(9)] + pub type AssetConversionTxPayment = pallet_asset_conversion_tx_payment; + + #[runtime::pallet_index(10)] + pub type ElectionProviderMultiPhase = pallet_election_provider_multi_phase; + + #[runtime::pallet_index(11)] + pub type Staking = pallet_staking; + + #[runtime::pallet_index(12)] + pub type Session = pallet_session; + + #[runtime::pallet_index(13)] + pub type Democracy = pallet_democracy; + + #[runtime::pallet_index(14)] + pub type Council = pallet_collective; + + #[runtime::pallet_index(15)] + pub type TechnicalCommittee = pallet_collective; + + #[runtime::pallet_index(16)] + pub type Elections = pallet_elections_phragmen; + + #[runtime::pallet_index(17)] + pub type TechnicalMembership = pallet_membership; + + #[runtime::pallet_index(18)] + pub type Grandpa = pallet_grandpa; + + #[runtime::pallet_index(19)] + pub type Treasury = pallet_treasury; + + #[runtime::pallet_index(20)] + pub type AssetRate = pallet_asset_rate; + + #[runtime::pallet_index(21)] + pub type Contracts = pallet_contracts; + + #[runtime::pallet_index(22)] + pub type Sudo = pallet_sudo; + + #[runtime::pallet_index(23)] + pub type ImOnline = pallet_im_online; + + #[runtime::pallet_index(24)] + pub type AuthorityDiscovery = pallet_authority_discovery; + + #[runtime::pallet_index(25)] + pub type Offences = pallet_offences; + + #[runtime::pallet_index(26)] + pub type Historical = pallet_session_historical; + + #[runtime::pallet_index(27)] + pub type RandomnessCollectiveFlip = pallet_insecure_randomness_collective_flip; + + #[runtime::pallet_index(28)] + pub type Identity = pallet_identity; + + #[runtime::pallet_index(29)] + pub type Society = pallet_society; + + #[runtime::pallet_index(30)] + pub type Recovery = pallet_recovery; + + #[runtime::pallet_index(31)] + pub type Vesting = pallet_vesting; + + #[runtime::pallet_index(32)] + pub type Scheduler = pallet_scheduler; + + #[runtime::pallet_index(33)] + pub type Glutton = pallet_glutton; + + #[runtime::pallet_index(34)] + pub type Preimage = pallet_preimage; + + #[runtime::pallet_index(35)] + pub type Proxy = pallet_proxy; + + #[runtime::pallet_index(36)] + pub type Multisig = pallet_multisig; + + #[runtime::pallet_index(37)] + pub type Bounties = pallet_bounties; + + #[runtime::pallet_index(38)] + pub type Tips = pallet_tips; + + #[runtime::pallet_index(39)] + pub type Assets = pallet_assets; + + #[runtime::pallet_index(40)] + pub type PoolAssets = pallet_assets; + + #[runtime::pallet_index(41)] + pub type Beefy = pallet_beefy; + + // MMR leaf construction must be after session in order to have a leaf's next_auth_set + // refer to block. See issue polkadot-fellows/runtimes#160 for details. + #[runtime::pallet_index(42)] + pub type Mmr = pallet_mmr; + + #[runtime::pallet_index(43)] + pub type MmrLeaf = pallet_beefy_mmr; + + #[runtime::pallet_index(44)] + pub type Lottery = pallet_lottery; + + #[runtime::pallet_index(45)] + pub type Nis = pallet_nis; + + #[runtime::pallet_index(46)] + pub type Uniques = pallet_uniques; + + #[runtime::pallet_index(47)] + pub type Nfts = pallet_nfts; + + #[runtime::pallet_index(48)] + pub type NftFractionalization = pallet_nft_fractionalization; + + #[runtime::pallet_index(49)] + pub type Salary = pallet_salary; + + #[runtime::pallet_index(50)] + pub type CoreFellowship = pallet_core_fellowship; + + #[runtime::pallet_index(51)] + pub type TransactionStorage = pallet_transaction_storage; + + #[runtime::pallet_index(52)] + pub type VoterList = pallet_bags_list; + + #[runtime::pallet_index(53)] + pub type StateTrieMigration = pallet_state_trie_migration; + + #[runtime::pallet_index(54)] + pub type ChildBounties = pallet_child_bounties; + + #[runtime::pallet_index(55)] + pub type Referenda = pallet_referenda; + + #[runtime::pallet_index(56)] + pub type Remark = pallet_remark; + + #[runtime::pallet_index(57)] + pub type RootTesting = pallet_root_testing; + + #[runtime::pallet_index(58)] + pub type ConvictionVoting = pallet_conviction_voting; + + #[runtime::pallet_index(59)] + pub type Whitelist = pallet_whitelist; + + #[runtime::pallet_index(60)] + pub type AllianceMotion = pallet_collective; + + #[runtime::pallet_index(61)] + pub type Alliance = pallet_alliance; + + #[runtime::pallet_index(62)] + pub type NominationPools = pallet_nomination_pools; + + #[runtime::pallet_index(63)] + pub type RankedPolls = pallet_referenda; + + #[runtime::pallet_index(64)] + pub type RankedCollective = pallet_ranked_collective; + + #[runtime::pallet_index(65)] + pub type AssetConversion = pallet_asset_conversion; + + #[runtime::pallet_index(66)] + pub type FastUnstake = pallet_fast_unstake; + + #[runtime::pallet_index(67)] + pub type MessageQueue = pallet_message_queue; + + #[runtime::pallet_index(68)] + pub type Pov = frame_benchmarking_pallet_pov; + + #[runtime::pallet_index(69)] + pub type TxPause = pallet_tx_pause; + + #[runtime::pallet_index(70)] + pub type SafeMode = pallet_safe_mode; + + #[runtime::pallet_index(71)] + pub type Statement = pallet_statement; + + #[runtime::pallet_index(72)] + pub type MultiBlockMigrations = pallet_migrations; + + #[runtime::pallet_index(73)] + pub type Broker = pallet_broker; + + #[runtime::pallet_index(74)] + pub type TasksExample = pallet_example_tasks; + + #[runtime::pallet_index(75)] + pub type Mixnet = pallet_mixnet; + + #[runtime::pallet_index(76)] + pub type Parameters = pallet_parameters; + + #[runtime::pallet_index(77)] + pub type SkipFeelessPayment = pallet_skip_feeless_payment; + + #[runtime::pallet_index(78)] + pub type PalletExampleMbms = pallet_example_mbm; +} /// The address format for describing accounts. pub type Address = sp_runtime::MultiAddress; @@ -2286,6 +2590,7 @@ mod benches { [pallet_elections_phragmen, Elections] [pallet_fast_unstake, FastUnstake] [pallet_nis, Nis] + [pallet_parameters, Parameters] [pallet_grandpa, Grandpa] [pallet_identity, Identity] [pallet_im_online, ImOnline] @@ -2293,6 +2598,7 @@ mod benches { [pallet_lottery, Lottery] [pallet_membership, TechnicalMembership] [pallet_message_queue, MessageQueue] + [pallet_migrations, MultiBlockMigrations] [pallet_mmr, Mmr] [pallet_multisig, Multisig] [pallet_nomination_pools, NominationPoolsBench::] @@ -2325,6 +2631,7 @@ mod benches { [pallet_whitelist, Whitelist] [pallet_tx_pause, TxPause] [pallet_safe_mode, SafeMode] + [pallet_example_mbm, PalletExampleMbms] ); } @@ -2338,7 +2645,7 @@ impl_runtime_apis! { Executive::execute_block(block); } - fn initialize_block(header: &::Header) { + fn initialize_block(header: &::Header) -> sp_runtime::ExtrinsicInclusionMode { Executive::initialize_block(header) } } @@ -2708,7 +3015,7 @@ impl_runtime_apis! { #[api_version(3)] impl sp_consensus_beefy::BeefyApi for Runtime { fn beefy_genesis() -> Option { - Beefy::genesis_block() + pallet_beefy::GenesisBlock::::get() } fn validator_set() -> Option> { @@ -2747,11 +3054,11 @@ impl_runtime_apis! { BlockNumber, > for Runtime { fn mmr_root() -> Result { - Ok(Mmr::mmr_root()) + Ok(pallet_mmr::RootHash::::get()) } fn mmr_leaf_count() -> Result { - Ok(Mmr::mmr_leaves()) + Ok(pallet_mmr::NumberOfLeaves::::get()) } fn generate_proof( @@ -2909,12 +3216,16 @@ impl_runtime_apis! { } impl sp_genesis_builder::GenesisBuilder for Runtime { - fn create_default_config() -> Vec { - create_default_config::() + fn build_state(config: Vec) -> sp_genesis_builder::Result { + build_state::(config) + } + + fn get_preset(id: &Option) -> Option> { + get_preset::(id, |_| None) } - fn build_config(config: Vec) -> sp_genesis_builder::Result { - build_config::(config) + fn preset_names() -> Vec { + vec![] } } } diff --git a/substrate/bin/node/testing/Cargo.toml b/substrate/bin/node/testing/Cargo.toml index 9ca8b8ef7265e362de2ec8b2f482efe389d71dff..fa3f90193ba5d11325bfb068fa69780495ec8c90 100644 --- a/substrate/bin/node/testing/Cargo.toml +++ b/substrate/bin/node/testing/Cargo.toml @@ -18,8 +18,8 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1" } fs_extra = "1" -futures = "0.3.21" -log = "0.4.17" +futures = "0.3.30" +log = { workspace = true, default-features = true } tempfile = "3.1.0" frame-system = { path = "../../../frame/system" } node-cli = { package = "staging-node-cli", path = "../cli" } diff --git a/substrate/bin/node/testing/src/bench.rs b/substrate/bin/node/testing/src/bench.rs index df302a6453b9ffbef603afc36fc860a1535a7ca2..e5c2563905e9ea59901db1564f2b0f34f6bd4aec 100644 --- a/substrate/bin/node/testing/src/bench.rs +++ b/substrate/bin/node/testing/src/bench.rs @@ -84,7 +84,7 @@ impl BenchPair { /// Drop system cache. /// -/// Will panic if cache drop is impossbile. +/// Will panic if cache drop is impossible. pub fn drop_system_cache() { #[cfg(target_os = "windows")] { @@ -173,7 +173,7 @@ impl Clone for BenchDb { // We clear system cache after db clone but before any warmups. // This populates system cache with some data unrelated to actual - // data we will be quering further under benchmark (like what + // data we will be querying further under benchmark (like what // would have happened in real system that queries random entries // from database). drop_system_cache(); @@ -443,7 +443,7 @@ impl BenchDb { BlockContentIterator::new(content, &self.keyring, client) } - /// Get cliet for this database operations. + /// Get client for this database operations. pub fn client(&mut self) -> Client { let (client, _backend, _task_executor) = Self::bench_client(self.database_type, self.directory_guard.path(), &self.keyring); diff --git a/substrate/bin/node/testing/src/genesis.rs b/substrate/bin/node/testing/src/genesis.rs index 6ec21fbe09342d1f704a4ed1a6f79b6160c27a01..c79612d68444c8bd64ad18c3b0a74ceed176eff8 100644 --- a/substrate/bin/node/testing/src/genesis.rs +++ b/substrate/bin/node/testing/src/genesis.rs @@ -20,9 +20,8 @@ use crate::keyring::*; use kitchensink_runtime::{ - constants::currency::*, AccountId, AssetsConfig, BabeConfig, BalancesConfig, GluttonConfig, - GrandpaConfig, IndicesConfig, RuntimeGenesisConfig, SessionConfig, SocietyConfig, StakerStatus, - StakingConfig, BABE_GENESIS_EPOCH_CONFIG, + constants::currency::*, AccountId, AssetsConfig, BalancesConfig, IndicesConfig, + RuntimeGenesisConfig, SessionConfig, SocietyConfig, StakerStatus, StakingConfig, }; use sp_keyring::Ed25519Keyring; use sp_runtime::Perbill; @@ -47,7 +46,6 @@ pub fn config_endowed(extra_endowed: Vec) -> RuntimeGenesisConfig { endowed.extend(extra_endowed.into_iter().map(|endowed| (endowed, 100 * DOLLARS))); RuntimeGenesisConfig { - system: Default::default(), indices: IndicesConfig { indices: vec![] }, balances: BalancesConfig { balances: endowed }, session: SessionConfig { @@ -69,39 +67,8 @@ pub fn config_endowed(extra_endowed: Vec) -> RuntimeGenesisConfig { invulnerables: vec![alice(), bob(), charlie()], ..Default::default() }, - babe: BabeConfig { - authorities: vec![], - epoch_config: Some(BABE_GENESIS_EPOCH_CONFIG), - ..Default::default() - }, - grandpa: GrandpaConfig { authorities: vec![], _config: Default::default() }, - beefy: Default::default(), - im_online: Default::default(), - authority_discovery: Default::default(), - democracy: Default::default(), - council: Default::default(), - technical_committee: Default::default(), - technical_membership: Default::default(), - elections: Default::default(), - sudo: Default::default(), - treasury: Default::default(), society: SocietyConfig { pot: 0 }, - vesting: Default::default(), assets: AssetsConfig { assets: vec![(9, alice(), true, 1)], ..Default::default() }, - pool_assets: Default::default(), - transaction_storage: Default::default(), - transaction_payment: Default::default(), - alliance: Default::default(), - alliance_motion: Default::default(), - nomination_pools: Default::default(), - safe_mode: Default::default(), - tx_pause: Default::default(), - glutton: GluttonConfig { - compute: Default::default(), - storage: Default::default(), - trash_data_count: Default::default(), - ..Default::default() - }, - mixnet: Default::default(), + ..Default::default() } } diff --git a/substrate/bin/utils/chain-spec-builder/Cargo.toml b/substrate/bin/utils/chain-spec-builder/Cargo.toml index e39c98983800a72ed24ab64a0af07f70c2d7d48d..5c8a3ab4e89a55e5e61c371a41878ab8457ec12b 100644 --- a/substrate/bin/utils/chain-spec-builder/Cargo.toml +++ b/substrate/bin/utils/chain-spec-builder/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "staging-chain-spec-builder" -version = "2.0.0" +version = "3.0.0" authors.workspace = true edition.workspace = true build = "build.rs" @@ -23,8 +23,8 @@ name = "chain-spec-builder" crate-type = ["rlib"] [dependencies] -clap = { version = "4.4.18", features = ["derive"] } -log = "0.4.17" +clap = { version = "4.5.3", features = ["derive"] } +log = { workspace = true, default-features = true } sc-chain-spec = { path = "../../../client/chain-spec" } -serde_json = "1.0.111" +serde_json = { workspace = true, default-features = true } sp-tracing = { path = "../../../primitives/tracing" } diff --git a/substrate/bin/utils/chain-spec-builder/bin/main.rs b/substrate/bin/utils/chain-spec-builder/bin/main.rs index 986293179a91540a2b020aeb39d9285fefef4453..8d6425a46c770765cfe1f4cf60ba755b248f3a78 100644 --- a/substrate/bin/utils/chain-spec-builder/bin/main.rs +++ b/substrate/bin/utils/chain-spec-builder/bin/main.rs @@ -18,14 +18,24 @@ use chain_spec_builder::{ generate_chain_spec_for_runtime, ChainSpecBuilder, ChainSpecBuilderCmd, ConvertToRawCmd, - UpdateCodeCmd, VerifyCmd, + DisplayPresetCmd, ListPresetsCmd, UpdateCodeCmd, VerifyCmd, }; use clap::Parser; -use sc_chain_spec::{update_code_in_json_chain_spec, GenericChainSpec}; +use sc_chain_spec::{ + update_code_in_json_chain_spec, GenericChainSpec, GenesisConfigBuilderRuntimeCaller, +}; use staging_chain_spec_builder as chain_spec_builder; use std::fs; -fn main() -> Result<(), String> { +//avoid error message escaping +fn main() { + match inner_main() { + Err(e) => eprintln!("{}", format!("{e}")), + _ => {}, + } +} + +fn inner_main() -> Result<(), String> { sp_tracing::try_init_simple(); let builder = ChainSpecBuilder::parse(); @@ -71,6 +81,36 @@ fn main() -> Result<(), String> { let _ = serde_json::from_str::(&chain_spec.as_json(true)?) .map_err(|e| format!("Conversion to json failed: {e}"))?; }, + ChainSpecBuilderCmd::ListPresets(ListPresetsCmd { runtime_wasm_path }) => { + let code = fs::read(runtime_wasm_path.as_path()) + .map_err(|e| format!("wasm blob shall be readable {e}"))?; + let caller: GenesisConfigBuilderRuntimeCaller = + GenesisConfigBuilderRuntimeCaller::new(&code[..]); + let presets = caller + .preset_names() + .map_err(|e| format!("getting default config from runtime should work: {e}"))?; + let presets: Vec = presets + .into_iter() + .map(|preset| { + String::from( + TryInto::<&str>::try_into(&preset) + .unwrap_or_else(|_| "cannot display preset id") + .to_string(), + ) + }) + .collect(); + println!("{presets:#?}"); + }, + ChainSpecBuilderCmd::DisplayPreset(DisplayPresetCmd { runtime_wasm_path, preset_name }) => { + let code = fs::read(runtime_wasm_path.as_path()) + .map_err(|e| format!("wasm blob shall be readable {e}"))?; + let caller: GenesisConfigBuilderRuntimeCaller = + GenesisConfigBuilderRuntimeCaller::new(&code[..]); + let preset = caller + .get_named_preset(preset_name.as_ref()) + .map_err(|e| format!("getting default config from runtime should work: {e}"))?; + println!("{preset}"); + }, }; Ok(()) } diff --git a/substrate/bin/utils/chain-spec-builder/src/lib.rs b/substrate/bin/utils/chain-spec-builder/src/lib.rs index 8c78030c885484b7d1f9ba3213dbfa76faa36c52..7982da76227aeb70cc4683cc1887440cb2c0ecc0 100644 --- a/substrate/bin/utils/chain-spec-builder/src/lib.rs +++ b/substrate/bin/utils/chain-spec-builder/src/lib.rs @@ -28,51 +28,84 @@ //! See [`ChainSpecBuilderCmd`] for a list of available commands. //! //! ## Typical use-cases. -//! ##### Get default config from runtime. +//! ##### Generate chains-spec using default config from runtime. //! -//! Query the default genesis config from the provided `runtime.wasm` and use it in the chain -//! spec. The tool allows specifying where to write the chain spec, and optionally also where the -//! write the default genesis state config (which is `/dev/stdout` in the following example): -//! ```text -//! chain-spec-builder --chain_spec_path ./my_chain_spec.json create -r runtime.wasm default /dev/stdout +//! Query the default genesis config from the provided `runtime.wasm` and use it in the chain +//! spec. +//! ```bash +//! chain-spec-builder create -r runtime.wasm default //! ``` -//! -//! _Note:_ [`GenesisBuilder::create_default_config`][sp-genesis-builder-create] runtime function is +//! +//! _Note:_ [`GenesisBuilder::get_preset`][sp-genesis-builder-get-preset] runtime function is //! called. //! //! +//! ##### Display the runtime's default `GenesisConfig` +//! +//! Displays the content of the runtime's default `GenesisConfig` +//! ```bash +//! chain-spec-builder display-preset -r runtime.wasm +//! ``` +//! +//! _Note:_ [`GenesisBuilder::get_preset`][sp-genesis-builder-get-preset] runtime function is called. +//! +//! ##### Display the `GenesisConfig` preset with given name +//! +//! Displays the content of the `GenesisConfig` preset for given name +//! ```bash +//! chain-spec-builder display-preset -r runtime.wasm -p "staging" +//! ``` +//! +//! _Note:_ [`GenesisBuilder::get_preset`][sp-genesis-builder-get-preset] runtime function is called. +//! +//! ##### List the names of `GenesisConfig` presets provided by runtime. +//! +//! Displays the names of the presets of `GenesisConfigs` provided by runtime. +//! ```bash +//! chain-spec-builder list-presets -r runtime.wasm +//! ``` +//! +//! _Note:_ [`GenesisBuilder::preset_names`][sp-genesis-builder-list] runtime function is called. +//! +//! ##### Generate chain spec using runtime provided genesis config preset. +//! +//! Patch the runtime's default genesis config with the named preset provided by the runtime and generate the plain +//! version of chain spec: +//! ```bash +//! chain-spec-builder create -r runtime.wasm named-preset "staging" +//! ``` +//! +//! _Note:_ [`GenesisBuilder::get_preset`][sp-genesis-builder-get-preset] and [`GenesisBuilder::build_state`][sp-genesis-builder-build] runtime functions are called. +//! //! ##### Generate raw storage chain spec using genesis config patch. //! //! Patch the runtime's default genesis config with provided `patch.json` and generate raw //! storage (`-s`) version of chain spec: -//! //! ```bash //! chain-spec-builder create -s -r runtime.wasm patch patch.json //! ``` -//! -//! _Note:_ [`GenesisBuilder::build_config`][sp-genesis-builder-build] runtime function is called. +//! +//! _Note:_ [`GenesisBuilder::build_state`][sp-genesis-builder-build] runtime function is called. //! //! ##### Generate raw storage chain spec using full genesis config. //! //! Build the chain spec using provided full genesis config json file. No defaults will be used: -//! //! ```bash //! chain-spec-builder create -s -r runtime.wasm full full-genesis-config.json //! ``` -//! -//! _Note_: [`GenesisBuilder::build_config`][sp-genesis-builder-build] runtime function is called. +//! +//! _Note_: [`GenesisBuilder::build_state`][sp-genesis-builder-build] runtime function is called. //! //! ##### Generate human readable chain spec using provided genesis config patch. //! ```bash //! chain-spec-builder create -r runtime.wasm patch patch.json //! ``` -//! +//! //! ##### Generate human readable chain spec using provided full genesis config. -//! //! ```bash //! chain-spec-builder create -r runtime.wasm full full-genesis-config.json //! ``` -//! +//! //! ##### Extra tools. //! The `chain-spec-builder` provides also some extra utilities: [`VerifyCmd`], [`ConvertToRawCmd`], //! [`UpdateCodeCmd`]. @@ -80,8 +113,9 @@ //! [`sc-chain-spec`]: ../sc_chain_spec/index.html //! [`node-cli`]: ../node_cli/index.html //! [`sp-genesis-builder`]: ../sp_genesis_builder/index.html -//! [sp-genesis-builder-create]: ../sp_genesis_builder/trait.GenesisBuilder.html#method.create_default_config -//! [sp-genesis-builder-build]: ../sp_genesis_builder/trait.GenesisBuilder.html#method.build_config +//! [sp-genesis-builder-build]: ../sp_genesis_builder/trait.GenesisBuilder.html#method.build_state +//! [sp-genesis-builder-list]: ../sp_genesis_builder/trait.GenesisBuilder.html#method.preset_names +//! [sp-genesis-builder-get-preset]: ../sp_genesis_builder/trait.GenesisBuilder.html#method.get_preset use std::{fs, path::PathBuf}; @@ -107,6 +141,8 @@ pub enum ChainSpecBuilderCmd { Verify(VerifyCmd), UpdateCode(UpdateCodeCmd), ConvertToRaw(ConvertToRawCmd), + ListPresets(ListPresetsCmd), + DisplayPreset(DisplayPresetCmd), } /// Create a new chain spec by interacting with the provided runtime wasm blob. @@ -137,6 +173,7 @@ enum GenesisBuildAction { Patch(PatchCmd), Full(FullCmd), Default(DefaultCmd), + NamedPreset(NamedPresetCmd), } /// Patches the runtime's default genesis config with provided patch. @@ -157,10 +194,12 @@ struct FullCmd { /// default genesis config may not be valid. For some runtimes initial values should be added there /// (e.g. session keys, babe epoch). #[derive(Parser, Debug, Clone)] -struct DefaultCmd { - /// If provided stores the default genesis config json file at given path (in addition to - /// chain-spec). - default_config_path: Option, +struct DefaultCmd {} + +/// Uses named preset provided by runtime to build the chains spec. +#[derive(Parser, Debug, Clone)] +struct NamedPresetCmd { + preset_name: String, } /// Updates the code in the provided input chain spec. @@ -182,10 +221,29 @@ pub struct ConvertToRawCmd { pub input_chain_spec: PathBuf, } +/// Lists available presets +#[derive(Parser, Debug, Clone)] +pub struct ListPresetsCmd { + /// The path to runtime wasm blob. + #[arg(long, short)] + pub runtime_wasm_path: PathBuf, +} + +/// Displays given preset +#[derive(Parser, Debug, Clone)] +pub struct DisplayPresetCmd { + /// The path to runtime wasm blob. + #[arg(long, short)] + pub runtime_wasm_path: PathBuf, + /// Preset to be displayed. If none is given default will be displayed. + #[arg(long, short)] + pub preset_name: Option, +} + /// Verifies the provided input chain spec. /// /// Silently checks if given input chain spec can be converted to raw. It allows to check if all -/// RuntimeGenesisConfig fiels are properly initialized and if the json does not contain invalid +/// RuntimeGenesisConfig fields are properly initialized and if the json does not contain invalid /// fields. #[derive(Parser, Debug, Clone)] pub struct VerifyCmd { @@ -204,6 +262,8 @@ pub fn generate_chain_spec_for_runtime(cmd: &CreateCmd) -> Result + builder.with_genesis_config_preset_name(&preset_name), GenesisBuildAction::Patch(PatchCmd { ref patch_path }) => { let patch = fs::read(patch_path.as_path()) .map_err(|e| format!("patch file {patch_path:?} shall be readable: {e}"))?; @@ -218,16 +278,12 @@ pub fn generate_chain_spec_for_runtime(cmd: &CreateCmd) -> Result { + GenesisBuildAction::Default(DefaultCmd {}) => { let caller: GenesisConfigBuilderRuntimeCaller = GenesisConfigBuilderRuntimeCaller::new(&code[..]); let default_config = caller .get_default_config() .map_err(|e| format!("getting default config from runtime should work: {e}"))?; - default_config_path.clone().map(|path| { - fs::write(path.as_path(), serde_json::to_string_pretty(&default_config).unwrap()) - .map_err(|err| err.to_string()) - }); builder.with_genesis_config(default_config) }, }; diff --git a/substrate/bin/utils/subkey/Cargo.toml b/substrate/bin/utils/subkey/Cargo.toml index ac97428a7dfdb9cb9edad671cdf9698000091eca..8dc4bf254b2d44e1f6b5c96ca16a2e8586e0333c 100644 --- a/substrate/bin/utils/subkey/Cargo.toml +++ b/substrate/bin/utils/subkey/Cargo.toml @@ -20,5 +20,5 @@ path = "src/main.rs" name = "subkey" [dependencies] -clap = { version = "4.4.18", features = ["derive"] } +clap = { version = "4.5.3", features = ["derive"] } sc-cli = { path = "../../../client/cli" } diff --git a/substrate/bin/utils/subkey/README.md b/substrate/bin/utils/subkey/README.md index 3232c82958727555a44168351309b6039a708d89..fc1053e232d70d746cf315d203a51dfd09e8447c 100644 --- a/substrate/bin/utils/subkey/README.md +++ b/substrate/bin/utils/subkey/README.md @@ -77,7 +77,7 @@ below can be derived from those secrets. The output above also show the **public key** and the **Account ID**. Those are the independent from the network where you will use the key. -The **SS58 address** (or **Public Address**) of a new account is a reprensentation of the public keys of an account for +The **SS58 address** (or **Public Address**) of a new account is a representation of the public keys of an account for a given network (for instance Kusama or Polkadot). You can read more about the [SS58 format in the Substrate Docs](https://docs.substrate.io/reference/address-formats/) @@ -91,7 +91,7 @@ SS58 addresses are: ### Json output -`subkey` can calso generate the output as *json*. This is useful for automation. +`subkey` can also generate the output as *json*. This is useful for automation. command: @@ -143,7 +143,7 @@ Secret phrase `soup lyrics media market way crouch elevator put moon useful ques SS58 Address: 5He5pZpc7AJ8evPuab37vJF6KkFDqq9uDq2WXh877Qw6iaVC ``` -Using the `inspect` command (see more details below), we see that knowning only the **secret seed** is no longer +Using the `inspect` command (see more details below), we see that knowing only the **secret seed** is no longer sufficient to recover the account: ```bash diff --git a/substrate/bin/utils/subkey/src/lib.rs b/substrate/bin/utils/subkey/src/lib.rs index f3023acde4047a715c0756f26ef2e3944c8206da..33f28ef46a5e7805b2c00b047e413f049169f6ef 100644 --- a/substrate/bin/utils/subkey/src/lib.rs +++ b/substrate/bin/utils/subkey/src/lib.rs @@ -94,10 +94,10 @@ //! seed** (also called **Private Key**). Those 2 secrets are the pieces of information you MUST //! keep safe and secret. All the other information below can be derived from those secrets. //! -//! The output above also show the **public key** and the **Account ID**. Those are the independant +//! The output above also show the **public key** and the **Account ID**. Those are the independent //! from the network where you will use the key. //! -//! The **SS58 address** (or **Public Address**) of a new account is a reprensentation of the public +//! The **SS58 address** (or **Public Address**) of a new account is a representation of the public //! keys of an account for a given network (for instance Kusama or Polkadot). //! //! You can read more about the [SS58 format in the Substrate Docs](https://docs.substrate.io/reference/address-formats/) and see the list of reserved prefixes in the [SS58 Registry](https://github.com/paritytech/ss58-registry). @@ -110,7 +110,7 @@ //! //! ### Json output //! -//! `subkey` can calso generate the output as *json*. This is useful for automation. +//! `subkey` can also generate the output as *json*. This is useful for automation. //! //! command: //! @@ -163,7 +163,7 @@ //! SS58 Address: 5He5pZpc7AJ8evPuab37vJF6KkFDqq9uDq2WXh877Qw6iaVC //! ``` //! -//! Using the `inspect` command (see more details below), we see that knowning only the **secret +//! Using the `inspect` command (see more details below), we see that knowing only the **secret //! seed** is no longer sufficient to recover the account: //! //! ```bash @@ -184,7 +184,7 @@ //! //! ### Inspecting a key //! -//! If you have *some data* about a key, `subkey inpsect` will help you discover more information +//! If you have *some data* about a key, `subkey inspect` will help you discover more information //! about it. //! //! If you have **secrets** that you would like to verify for instance, you can use: diff --git a/substrate/client/allocator/Cargo.toml b/substrate/client/allocator/Cargo.toml index f882cda9081fd27c57f41e2b75b57ff8018e7f54..2c268b548ea9c32fabdc82226c77e82a7ef59cea 100644 --- a/substrate/client/allocator/Cargo.toml +++ b/substrate/client/allocator/Cargo.toml @@ -17,7 +17,7 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -log = "0.4.17" -thiserror = "1.0.48" +log = { workspace = true, default-features = true } +thiserror = { workspace = true } sp-core = { path = "../../primitives/core" } sp-wasm-interface = { path = "../../primitives/wasm-interface" } diff --git a/substrate/client/api/Cargo.toml b/substrate/client/api/Cargo.toml index 14aca6d9a2ee1631483df3e10a4dd1549670e0d0..fb650c5b532f2cbf841dc65e5f7f1a3c35dae733 100644 --- a/substrate/client/api/Cargo.toml +++ b/substrate/client/api/Cargo.toml @@ -21,8 +21,8 @@ codec = { package = "parity-scale-codec", version = "3.6.1", default-features = "derive", ] } fnv = "1.0.6" -futures = "0.3.21" -log = "0.4.17" +futures = "0.3.30" +log = { workspace = true, default-features = true } parking_lot = "0.12.1" prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../utils/prometheus" } sc-executor = { path = "../executor" } @@ -41,6 +41,6 @@ sp-storage = { path = "../../primitives/storage" } sp-trie = { path = "../../primitives/trie" } [dev-dependencies] -thiserror = "1.0.48" +thiserror = { workspace = true } sp-test-primitives = { path = "../../primitives/test-primitives" } substrate-test-runtime = { path = "../../test-utils/runtime" } diff --git a/substrate/client/api/src/client.rs b/substrate/client/api/src/client.rs index 46232c74539c6c230652a753b5fcd4b6761600d8..2de09840e4dfdc15e1f1d1acaa5f3e438de0caca 100644 --- a/substrate/client/api/src/client.rs +++ b/substrate/client/api/src/client.rs @@ -278,7 +278,7 @@ impl fmt::Display for UsageInfo { pub struct UnpinHandleInner { /// Hash of the block pinned by this handle hash: Block::Hash, - unpin_worker_sender: TracingUnboundedSender, + unpin_worker_sender: TracingUnboundedSender>, } impl Debug for UnpinHandleInner { @@ -291,7 +291,7 @@ impl UnpinHandleInner { /// Create a new [`UnpinHandleInner`] pub fn new( hash: Block::Hash, - unpin_worker_sender: TracingUnboundedSender, + unpin_worker_sender: TracingUnboundedSender>, ) -> Self { Self { hash, unpin_worker_sender } } @@ -299,12 +299,25 @@ impl UnpinHandleInner { impl Drop for UnpinHandleInner { fn drop(&mut self) { - if let Err(err) = self.unpin_worker_sender.unbounded_send(self.hash) { + if let Err(err) = + self.unpin_worker_sender.unbounded_send(UnpinWorkerMessage::Unpin(self.hash)) + { log::debug!(target: "db", "Unable to unpin block with hash: {}, error: {:?}", self.hash, err); }; } } +/// Message that signals notification-based pinning actions to the pinning-worker. +/// +/// When the notification is dropped, an `Unpin` message should be sent to the worker. +#[derive(Debug)] +pub enum UnpinWorkerMessage { + /// Should be sent when a import or finality notification is created. + AnnouncePin(Block::Hash), + /// Should be sent when a import or finality notification is dropped. + Unpin(Block::Hash), +} + /// Keeps a specific block pinned while the handle is alive. /// Once the last handle instance for a given block is dropped, the /// block is unpinned in the [`Backend`](crate::backend::Backend::unpin_block). @@ -315,7 +328,7 @@ impl UnpinHandle { /// Create a new [`UnpinHandle`] pub fn new( hash: Block::Hash, - unpin_worker_sender: TracingUnboundedSender, + unpin_worker_sender: TracingUnboundedSender>, ) -> UnpinHandle { UnpinHandle(Arc::new(UnpinHandleInner::new(hash, unpin_worker_sender))) } @@ -353,7 +366,7 @@ impl BlockImportNotification { header: Block::Header, is_new_best: bool, tree_route: Option>>, - unpin_worker_sender: TracingUnboundedSender, + unpin_worker_sender: TracingUnboundedSender>, ) -> Self { Self { hash, @@ -412,7 +425,7 @@ impl FinalityNotification { /// Create finality notification from finality summary. pub fn from_summary( mut summary: FinalizeSummary, - unpin_worker_sender: TracingUnboundedSender, + unpin_worker_sender: TracingUnboundedSender>, ) -> FinalityNotification { let hash = summary.finalized.pop().unwrap_or_default(); FinalityNotification { @@ -436,7 +449,7 @@ impl BlockImportNotification { /// Create finality notification from finality summary. pub fn from_summary( summary: ImportSummary, - unpin_worker_sender: TracingUnboundedSender, + unpin_worker_sender: TracingUnboundedSender>, ) -> BlockImportNotification { let hash = summary.hash; BlockImportNotification { diff --git a/substrate/client/authority-discovery/Cargo.toml b/substrate/client/authority-discovery/Cargo.toml index 4c8370233e9413d7a2c6476e58ca61dfc8f3dce6..0cf90ada8ac61bda63a12c5f3072017ccd067270 100644 --- a/substrate/client/authority-discovery/Cargo.toml +++ b/substrate/client/authority-discovery/Cargo.toml @@ -21,28 +21,27 @@ prost-build = "0.11" [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false } -futures = "0.3.21" +futures = "0.3.30" futures-timer = "3.0.1" ip_network = "0.4.1" libp2p = { version = "0.51.4", features = ["ed25519", "kad"] } -multihash = { version = "0.18.1", default-features = false, features = [ - "sha2", - "std", -] } -log = "0.4.17" +multihash = { version = "0.17.0", default-features = false, features = ["sha2", "std"] } +linked_hash_set = "0.1.4" +log = { workspace = true, default-features = true } prost = "0.12" rand = "0.8.5" -thiserror = "1.0" +thiserror = { workspace = true } prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../utils/prometheus" } sc-client-api = { path = "../api" } sc-network = { path = "../network" } +sc-network-types = { path = "../network/types" } sp-api = { path = "../../primitives/api" } sp-authority-discovery = { path = "../../primitives/authority-discovery" } sp-blockchain = { path = "../../primitives/blockchain" } sp-core = { path = "../../primitives/core" } sp-keystore = { path = "../../primitives/keystore" } sp-runtime = { path = "../../primitives/runtime" } -async-trait = "0.1.74" +async-trait = "0.1.79" multihash-codetable = { version = "0.1.1", features = [ "digest", "serde", diff --git a/substrate/client/authority-discovery/src/error.rs b/substrate/client/authority-discovery/src/error.rs index ca685115d49754d400afb2676db110549b53c73b..6f791237c2f229c3f94996e2a91c0c0de8800d0d 100644 --- a/substrate/client/authority-discovery/src/error.rs +++ b/substrate/client/authority-discovery/src/error.rs @@ -35,7 +35,7 @@ pub enum Error { VerifyingDhtPayload, #[error("Failed to hash the authority id to be used as a dht key.")] - HashingAuthorityId(#[from] libp2p::core::multiaddr::multihash::Error), + HashingAuthorityId(#[from] sc_network::multiaddr::multihash::Error), #[error("Failed calling into the Substrate runtime: {0}")] CallingRuntime(#[from] sp_blockchain::Error), @@ -53,10 +53,10 @@ pub enum Error { EncodingDecodingScale(#[from] codec::Error), #[error("Failed to parse a libp2p multi address.")] - ParsingMultiaddress(#[from] libp2p::core::multiaddr::Error), + ParsingMultiaddress(#[from] sc_network::multiaddr::Error), - #[error("Failed to parse a libp2p key.")] - ParsingLibp2pIdentity(#[from] libp2p::identity::DecodingError), + #[error("Failed to parse a libp2p key: {0}")] + ParsingLibp2pIdentity(String), #[error("Failed to sign: {0}.")] CannotSign(String), diff --git a/substrate/client/authority-discovery/src/interval.rs b/substrate/client/authority-discovery/src/interval.rs index 23c7ce266e3bf8c13485f78dac6d4bb848ef4612..0eee0d159cd86bc781aeed0f3c68f28a75c02f46 100644 --- a/substrate/client/authority-discovery/src/interval.rs +++ b/substrate/client/authority-discovery/src/interval.rs @@ -28,6 +28,7 @@ use std::{ /// /// Doubles interval duration on each tick until the configured maximum is reached. pub struct ExpIncInterval { + start: Duration, max: Duration, next: Duration, delay: Delay, @@ -37,14 +38,29 @@ impl ExpIncInterval { /// Create a new [`ExpIncInterval`]. pub fn new(start: Duration, max: Duration) -> Self { let delay = Delay::new(start); - Self { max, next: start * 2, delay } + Self { start, max, next: start * 2, delay } } - /// Fast forward the exponentially increasing interval to the configured maximum. + /// Fast forward the exponentially increasing interval to the configured maximum, if not already + /// set. pub fn set_to_max(&mut self) { + if self.next == self.max { + return; + } + self.next = self.max; self.delay = Delay::new(self.next); } + + /// Rewind the exponentially increasing interval to the configured start, if not already set. + pub fn set_to_start(&mut self) { + if self.next == self.start * 2 { + return; + } + + self.next = self.start * 2; + self.delay = Delay::new(self.start); + } } impl Stream for ExpIncInterval { diff --git a/substrate/client/authority-discovery/src/lib.rs b/substrate/client/authority-discovery/src/lib.rs index 6bb12804cada34d1b3f87b4249fc466fcf253a9a..e674c51571effe6c7d209c5eaaaad96da3b28a7a 100644 --- a/substrate/client/authority-discovery/src/lib.rs +++ b/substrate/client/authority-discovery/src/lib.rs @@ -40,8 +40,8 @@ use futures::{ Stream, }; -use libp2p::{Multiaddr, PeerId}; -use sc_network::event::DhtEvent; +use sc_network::{event::DhtEvent, Multiaddr}; +use sc_network_types::PeerId; use sp_authority_discovery::AuthorityId; use sp_blockchain::HeaderBackend; use sp_runtime::traits::Block as BlockT; @@ -80,6 +80,10 @@ pub struct WorkerConfig { /// Defaults to `true` to avoid the surprise factor. pub publish_non_global_ips: bool, + /// Public addresses set by the node operator to always publish first in the authority + /// discovery DHT record. + pub public_addresses: Vec, + /// Reject authority discovery records that are not signed by their network identity (PeerId) /// /// Defaults to `false` to provide compatibility with old versions @@ -104,6 +108,7 @@ impl Default for WorkerConfig { // `authority_discovery_dht_event_received`. max_query_interval: Duration::from_secs(10 * 60), publish_non_global_ips: true, + public_addresses: Vec::new(), strict_record_validation: false, } } @@ -112,16 +117,15 @@ impl Default for WorkerConfig { /// Create a new authority discovery [`Worker`] and [`Service`]. /// /// See the struct documentation of each for more details. -pub fn new_worker_and_service( +pub fn new_worker_and_service( client: Arc, - network: Arc, + network: Arc, dht_event_rx: DhtEventStream, role: Role, prometheus_registry: Option, -) -> (Worker, Service) +) -> (Worker, Service) where Block: BlockT + Unpin + 'static, - Network: NetworkProvider, Client: AuthorityDiscovery + Send + Sync + 'static + HeaderBackend, DhtEventStream: Stream + Unpin, { @@ -138,17 +142,16 @@ where /// Same as [`new_worker_and_service`] but with support for providing the `config`. /// /// When in doubt use [`new_worker_and_service`] as it will use the default configuration. -pub fn new_worker_and_service_with_config( +pub fn new_worker_and_service_with_config( config: WorkerConfig, client: Arc, - network: Arc, + network: Arc, dht_event_rx: DhtEventStream, role: Role, prometheus_registry: Option, -) -> (Worker, Service) +) -> (Worker, Service) where Block: BlockT + Unpin + 'static, - Network: NetworkProvider, Client: AuthorityDiscovery + 'static, DhtEventStream: Stream + Unpin, { diff --git a/substrate/client/authority-discovery/src/service.rs b/substrate/client/authority-discovery/src/service.rs index 89ae058d17f7adeac08c2faeec959694061a3ff0..60c7a2b990378f0c91a16854bdb815de8661c53a 100644 --- a/substrate/client/authority-discovery/src/service.rs +++ b/substrate/client/authority-discovery/src/service.rs @@ -25,7 +25,8 @@ use futures::{ SinkExt, }; -use libp2p::{Multiaddr, PeerId}; +use sc_network::Multiaddr; +use sc_network_types::PeerId; use sp_authority_discovery::AuthorityId; /// Service to interact with the [`crate::Worker`]. diff --git a/substrate/client/authority-discovery/src/tests.rs b/substrate/client/authority-discovery/src/tests.rs index 4fbc196c5ecd1bb4c4eafd3850a8e2754de91963..acfd0e61de01981e0bd9a69825b073e97d020322 100644 --- a/substrate/client/authority-discovery/src/tests.rs +++ b/substrate/client/authority-discovery/src/tests.rs @@ -25,13 +25,10 @@ use crate::{ }; use futures::{channel::mpsc::channel, executor::LocalPool, task::LocalSpawn}; -use libp2p::{ - core::multiaddr::{Multiaddr, Protocol}, - identity::ed25519, - PeerId, -}; +use libp2p::identity::ed25519; use std::{collections::HashSet, sync::Arc}; +use sc_network::{multiaddr::Protocol, Multiaddr, PeerId}; use sp_authority_discovery::AuthorityId; use sp_core::crypto::key_types; use sp_keystore::{testing::MemoryKeystore, Keystore}; @@ -78,7 +75,7 @@ fn get_addresses_and_authority_id() { ); assert_eq!( Some(HashSet::from([remote_authority_id])), - service.get_authority_ids_by_peer_id(remote_peer_id).await, + service.get_authority_ids_by_peer_id(remote_peer_id.into()).await, ); }); } @@ -100,7 +97,7 @@ fn cryptos_are_compatible() { let sp_core_signature = sp_core_secret.sign(message); // no error expected... assert!(sp_core::ed25519::Pair::verify( - &sp_core::ed25519::Signature::from_slice(&libp2p_signature).unwrap(), + &sp_core::ed25519::Signature::try_from(libp2p_signature.as_slice()).unwrap(), message, &sp_core_public )); diff --git a/substrate/client/authority-discovery/src/worker.rs b/substrate/client/authority-discovery/src/worker.rs index 6db25416dee78323a1531f5868be2601af3eaee0..53418d2d38c4a0ce0ab2c2b938b288360d2fdbbc 100644 --- a/substrate/client/authority-discovery/src/worker.rs +++ b/substrate/client/authority-discovery/src/worker.rs @@ -34,8 +34,8 @@ use futures::{channel::mpsc, future, stream::Fuse, FutureExt, Stream, StreamExt} use addr_cache::AddrCache; use codec::{Decode, Encode}; use ip_network::IpNetwork; -use libp2p::{core::multiaddr, identity::PublicKey, multihash::Multihash, Multiaddr, PeerId}; -use multihash_codetable::{Code, MultihashDigest}; +use linked_hash_set::LinkedHashSet; +use multihash::{Code, Multihash, MultihashDigest}; use log::{debug, error, log_enabled}; use prometheus_endpoint::{register, Counter, CounterVec, Gauge, Opts, U64}; @@ -43,8 +43,10 @@ use prost::Message; use rand::{seq::SliceRandom, thread_rng}; use sc_network::{ - event::DhtEvent, KademliaKey, NetworkDHTProvider, NetworkSigner, NetworkStateInfo, Signature, + event::DhtEvent, multiaddr, KademliaKey, Multiaddr, NetworkDHTProvider, NetworkSigner, + NetworkStateInfo, }; +use sc_network_types::PeerId; use sp_api::{ApiError, ProvideRuntimeApi}; use sp_authority_discovery::{ AuthorityDiscoveryApi, AuthorityId, AuthorityPair, AuthoritySignature, @@ -107,27 +109,38 @@ pub enum Role { /// network peerset. /// /// 5. Allow querying of the collected addresses via the [`crate::Service`]. -pub struct Worker { +pub struct Worker { /// Channel receiver for messages send by a [`crate::Service`]. from_service: Fuse>, client: Arc, - network: Arc, + network: Arc, /// Channel we receive Dht events on. dht_event_rx: DhtEventStream, /// Interval to be proactive, publishing own addresses. publish_interval: ExpIncInterval, + /// Pro-actively publish our own addresses at this interval, if the keys in the keystore /// have changed. publish_if_changed_interval: ExpIncInterval, + /// List of keys onto which addresses have been published at the latest publication. /// Used to check whether they have changed. latest_published_keys: HashSet, + /// List of the kademlia keys that have been published at the latest publication. + /// Used to associate DHT events with our published records. + latest_published_kad_keys: HashSet, + /// Same value as in the configuration. publish_non_global_ips: bool, + + /// Public addresses set by the node operator to always publish first in the authority + /// discovery DHT record. + public_addresses: LinkedHashSet, + /// Same value as in the configuration. strict_record_validation: bool, @@ -136,6 +149,7 @@ pub struct Worker { /// Queue of throttled lookups pending to be passed to the network. pending_lookups: Vec, + /// Set of in-flight lookups. in_flight_lookups: HashMap, @@ -179,10 +193,9 @@ where } } -impl Worker +impl Worker where Block: BlockT + Unpin + 'static, - Network: NetworkProvider, Client: AuthorityDiscovery + 'static, DhtEventStream: Stream + Unpin, { @@ -190,7 +203,7 @@ where pub(crate) fn new( from_service: mpsc::Receiver, client: Arc, - network: Arc, + network: Arc, dht_event_rx: DhtEventStream, role: Role, prometheus_registry: Option, @@ -224,6 +237,29 @@ where None => None, }; + let public_addresses = { + let local_peer_id: Multihash = network.local_peer_id().into(); + + config + .public_addresses + .into_iter() + .map(|mut address| { + if let Some(multiaddr::Protocol::P2p(peer_id)) = address.iter().last() { + if peer_id != local_peer_id { + error!( + target: LOG_TARGET, + "Discarding invalid local peer ID in public address {address}.", + ); + } + // Always discard `/p2p/...` protocol for proper address comparison (local + // peer id will be added before publishing). + address.pop(); + } + address + }) + .collect() + }; + Worker { from_service: from_service.fuse(), client, @@ -232,7 +268,9 @@ where publish_interval, publish_if_changed_interval, latest_published_keys: HashSet::new(), + latest_published_kad_keys: HashSet::new(), publish_non_global_ips: config.publish_non_global_ips, + public_addresses, strict_record_validation: config.strict_record_validation, query_interval, pending_lookups: Vec::new(), @@ -304,17 +342,39 @@ where } fn addresses_to_publish(&self) -> impl Iterator { - let peer_id: Multihash = self.network.local_peer_id().into(); + let local_peer_id = self.network.local_peer_id(); let publish_non_global_ips = self.publish_non_global_ips; - self.network - .external_addresses() + let addresses = self + .public_addresses + .clone() .into_iter() - .filter(move |a| { + .chain(self.network.external_addresses().into_iter().filter_map(|mut address| { + // Make sure the reported external address does not contain `/p2p/...` protocol. + if let Some(multiaddr::Protocol::P2p(peer_id)) = address.iter().last() { + if peer_id != *local_peer_id.as_ref() { + error!( + target: LOG_TARGET, + "Network returned external address '{address}' with peer id \ + not matching the local peer id '{local_peer_id}'.", + ); + debug_assert!(false); + } + address.pop(); + } + + if self.public_addresses.contains(&address) { + // Already added above. + None + } else { + Some(address) + } + })) + .filter(move |address| { if publish_non_global_ips { return true } - a.iter().all(|p| match p { + address.iter().all(|protocol| match protocol { // The `ip_network` library is used because its `is_global()` method is stable, // while `is_global()` in the standard library currently isn't. multiaddr::Protocol::Ip4(ip) if !IpNetwork::from(ip).is_global() => false, @@ -322,13 +382,18 @@ where _ => true, }) }) - .map(move |a| { - if a.iter().any(|p| matches!(p, multiaddr::Protocol::P2p(_))) { - a - } else { - a.with(multiaddr::Protocol::P2p(peer_id)) - } - }) + .collect::>(); + + debug!( + target: LOG_TARGET, + "Authority DHT record peer_id='{local_peer_id}' addresses='{addresses:?}'", + ); + + // The address must include the local peer id. + let local_peer_id: Multihash = local_peer_id.into(); + addresses + .into_iter() + .map(move |a| a.with(multiaddr::Protocol::P2p(local_peer_id))) } /// Publish own public addresses. @@ -341,13 +406,26 @@ where Role::Discover => return Ok(()), }; - let keys = Worker::::get_own_public_keys_within_authority_set( - key_store.clone(), - self.client.as_ref(), - ).await?.into_iter().collect::>(); + let keys = + Worker::::get_own_public_keys_within_authority_set( + key_store.clone(), + self.client.as_ref(), + ) + .await? + .into_iter() + .collect::>(); + + if only_if_changed { + // If the authority keys did not change and the `publish_if_changed_interval` was + // triggered then do nothing. + if keys == self.latest_published_keys { + return Ok(()) + } - if only_if_changed && keys == self.latest_published_keys { - return Ok(()) + // We have detected a change in the authority keys, reset the timers to + // publish and gather data faster. + self.publish_interval.set_to_start(); + self.query_interval.set_to_start(); } let addresses = serialize_addresses(self.addresses_to_publish()); @@ -360,7 +438,7 @@ where } let serialized_record = serialize_authority_record(addresses)?; - let peer_signature = sign_record_with_peer_id(&serialized_record, self.network.as_ref())?; + let peer_signature = sign_record_with_peer_id(&serialized_record, &self.network)?; let keys_vec = keys.iter().cloned().collect::>(); @@ -371,6 +449,8 @@ where keys_vec, )?; + self.latest_published_kad_keys = kv_pairs.iter().map(|(k, _)| k.clone()).collect(); + for (key, value) in kv_pairs.into_iter() { self.network.put_value(key, value); } @@ -472,6 +552,10 @@ where } }, DhtEvent::ValuePut(hash) => { + if !self.latest_published_kad_keys.contains(&hash) { + return; + } + // Fast forward the exponentially increasing interval to the configured maximum. In // case this was the first successful address publishing there is no need for a // timely retry. @@ -484,6 +568,11 @@ where debug!(target: LOG_TARGET, "Successfully put hash '{:?}' on Dht.", hash) }, DhtEvent::ValuePutFailed(hash) => { + if !self.latest_published_kad_keys.contains(&hash) { + // Not a value we have published or received multiple times. + return; + } + if let Some(metrics) = &self.metrics { metrics.dht_event_received.with_label_values(&["value_put_failed"]).inc(); } @@ -549,12 +638,15 @@ where // properly signed by the owner of the PeerId if let Some(peer_signature) = peer_signature { - let public_key = PublicKey::try_decode_protobuf(&peer_signature.public_key) - .map_err(Error::ParsingLibp2pIdentity)?; - let signature = Signature { public_key, bytes: peer_signature.signature }; - - if !signature.verify(record, &remote_peer_id) { - return Err(Error::VerifyingDhtPayload) + match self.network.verify( + remote_peer_id.into(), + &peer_signature.public_key, + &peer_signature.signature, + &record, + ) { + Ok(true) => {}, + Ok(false) => return Err(Error::VerifyingDhtPayload), + Err(error) => return Err(Error::ParsingLibp2pIdentity(error)), } } else if self.strict_record_validation { return Err(Error::MissingPeerIdSignature) @@ -616,9 +708,15 @@ where /// NetworkProvider provides [`Worker`] with all necessary hooks into the /// underlying Substrate networking. Using this trait abstraction instead of /// `sc_network::NetworkService` directly is necessary to unit test [`Worker`]. -pub trait NetworkProvider: NetworkDHTProvider + NetworkStateInfo + NetworkSigner {} +pub trait NetworkProvider: + NetworkDHTProvider + NetworkStateInfo + NetworkSigner + Send + Sync +{ +} -impl NetworkProvider for T where T: NetworkDHTProvider + NetworkStateInfo + NetworkSigner {} +impl NetworkProvider for T where + T: NetworkDHTProvider + NetworkStateInfo + NetworkSigner + Send + Sync +{ +} fn hash_authority_id(id: &[u8]) -> KademliaKey { KademliaKey::new(&Code::Sha2_256.digest(id).digest()) @@ -656,7 +754,7 @@ fn sign_record_with_peer_id( network: &impl NetworkSigner, ) -> Result { let signature = network - .sign_with_local_identity(serialized_record) + .sign_with_local_identity(serialized_record.to_vec()) .map_err(|e| Error::CannotSign(format!("{} (network packet)", e)))?; let public_key = signature.public_key.encode_protobuf(); let signature = signature.bytes; @@ -770,7 +868,7 @@ impl Metrics { // Helper functions for unit testing. #[cfg(test)] -impl Worker { +impl Worker { pub(crate) fn inject_addresses(&mut self, authority: AuthorityId, addresses: Vec) { self.addr_cache.insert(authority, addresses); } diff --git a/substrate/client/authority-discovery/src/worker/addr_cache.rs b/substrate/client/authority-discovery/src/worker/addr_cache.rs index 8084b7f0a6dff04edb525db0034c01ae2398219c..6e3b3c8af20190f3711aac72fbd5e7cf3eb493c7 100644 --- a/substrate/client/authority-discovery/src/worker/addr_cache.rs +++ b/substrate/client/authority-discovery/src/worker/addr_cache.rs @@ -16,10 +16,8 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -use libp2p::{ - core::multiaddr::{Multiaddr, Protocol}, - PeerId, -}; +use sc_network::{multiaddr::Protocol, Multiaddr}; +use sc_network_types::PeerId; use sp_authority_discovery::AuthorityId; use std::collections::{hash_map::Entry, HashMap, HashSet}; @@ -178,7 +176,7 @@ fn addresses_to_peer_ids(addresses: &HashSet) -> HashSet { mod tests { use super::*; - use libp2p::multihash::{self, Multihash}; + use multihash::{self, Multihash}; use quickcheck::{Arbitrary, Gen, QuickCheck, TestResult}; use sp_authority_discovery::{AuthorityId, AuthorityPair}; diff --git a/substrate/client/authority-discovery/src/worker/schema/tests.rs b/substrate/client/authority-discovery/src/worker/schema/tests.rs index c765e4e5384db483cd2e9c94156ff487c8410456..ef06ed7d336b0894f54511dfc87561a7b5d68d54 100644 --- a/substrate/client/authority-discovery/src/worker/schema/tests.rs +++ b/substrate/client/authority-discovery/src/worker/schema/tests.rs @@ -21,8 +21,9 @@ mod schema_v1 { } use super::*; -use libp2p::{identity::Keypair, multiaddr::Multiaddr, PeerId}; +use libp2p::identity::Keypair; use prost::Message; +use sc_network::{Multiaddr, PeerId}; #[test] fn v2_decodes_v1() { diff --git a/substrate/client/authority-discovery/src/worker/tests.rs b/substrate/client/authority-discovery/src/worker/tests.rs index c29120881940c1edac54b9e3ffc986f817e487ba..caeac56c54073e53026ec3f8c52c8e7f88958f2b 100644 --- a/substrate/client/authority-discovery/src/worker/tests.rs +++ b/substrate/client/authority-discovery/src/worker/tests.rs @@ -29,16 +29,11 @@ use futures::{ sink::SinkExt, task::LocalSpawn, }; -use libp2p::{ - core::multiaddr, - identity::{Keypair, SigningError}, - kad::record::Key as KademliaKey, - PeerId, -}; +use libp2p::{core::multiaddr, identity::SigningError, kad::record::Key as KademliaKey, PeerId}; use prometheus_endpoint::prometheus::default_registry; use sc_client_api::HeaderBackend; -use sc_network::Signature; +use sc_network::{service::signature::Keypair, Signature}; use sp_api::{ApiRef, ProvideRuntimeApi}; use sp_keystore::{testing::MemoryKeystore, Keystore}; use sp_runtime::traits::{Block as BlockT, NumberFor, Zero}; @@ -122,7 +117,7 @@ pub enum TestNetworkEvent { } pub struct TestNetwork { - peer_id: PeerId, + peer_id: sc_network_types::PeerId, identity: Keypair, external_addresses: Vec, // Whenever functions on `TestNetwork` are called, the function arguments are added to the @@ -158,10 +153,25 @@ impl Default for TestNetwork { impl NetworkSigner for TestNetwork { fn sign_with_local_identity( &self, - msg: impl AsRef<[u8]>, + msg: Vec, ) -> std::result::Result { Signature::sign_message(msg, &self.identity) } + + fn verify( + &self, + peer_id: sc_network_types::PeerId, + public_key: &Vec, + signature: &Vec, + message: &Vec, + ) -> std::result::Result { + let public_key = libp2p::identity::PublicKey::try_decode_protobuf(&public_key) + .map_err(|error| error.to_string())?; + let peer_id: PeerId = peer_id.into(); + let remote: libp2p::PeerId = public_key.to_peer_id(); + + Ok(peer_id == remote && public_key.verify(message, signature)) + } } impl NetworkDHTProvider for TestNetwork { @@ -182,8 +192,8 @@ impl NetworkDHTProvider for TestNetwork { } impl NetworkStateInfo for TestNetwork { - fn local_peer_id(&self) -> PeerId { - self.peer_id + fn local_peer_id(&self) -> sc_network_types::PeerId { + self.peer_id.into() } fn external_addresses(&self) -> Vec { @@ -202,10 +212,20 @@ struct TestSigner<'a> { impl<'a> NetworkSigner for TestSigner<'a> { fn sign_with_local_identity( &self, - msg: impl AsRef<[u8]>, + msg: Vec, ) -> std::result::Result { Signature::sign_message(msg, self.keypair) } + + fn verify( + &self, + _: sc_network_types::PeerId, + _: &Vec, + _: &Vec, + _: &Vec, + ) -> std::result::Result { + unimplemented!(); + } } fn build_dht_event( @@ -500,7 +520,6 @@ struct DhtValueFoundTester { pub local_worker: Option< Worker< TestApi, - TestNetwork, sp_runtime::generic::Block< sp_runtime::generic::Header, substrate_test_runtime_client::runtime::Extrinsic, @@ -716,12 +735,16 @@ fn addresses_to_publish_adds_p2p() { #[test] fn addresses_to_publish_respects_existing_p2p_protocol() { let (_dht_event_tx, dht_event_rx) = channel(1000); + let identity = Keypair::generate_ed25519(); + let peer_id = identity.public().to_peer_id(); + let external_address = "/ip6/2001:db8::/tcp/30333" + .parse::() + .unwrap() + .with(multiaddr::Protocol::P2p(peer_id.into())); let network: Arc = Arc::new(TestNetwork { - external_addresses: vec![ - "/ip6/2001:db8::/tcp/30333/p2p/QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSupNKC" - .parse() - .unwrap(), - ], + peer_id, + identity, + external_addresses: vec![external_address], ..Default::default() }); diff --git a/substrate/client/basic-authorship/Cargo.toml b/substrate/client/basic-authorship/Cargo.toml index 370f4a4adf5c17f57e4c036a7aaeed81e559a1da..4890b66c9b2f91ef13ea74fa9f66c797d0beb32c 100644 --- a/substrate/client/basic-authorship/Cargo.toml +++ b/substrate/client/basic-authorship/Cargo.toml @@ -17,9 +17,9 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1" } -futures = "0.3.21" +futures = "0.3.30" futures-timer = "3.0.1" -log = "0.4.17" +log = { workspace = true, default-features = true } prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../utils/prometheus" } sc-block-builder = { path = "../block-builder" } sc-proposer-metrics = { path = "../proposer-metrics" } diff --git a/substrate/client/basic-authorship/src/basic_authorship.rs b/substrate/client/basic-authorship/src/basic_authorship.rs index c07f3e639c3e15b572dbb470c1518b9ddfddae32..1519c76c42c0efab1fa59c7e53bed41c5e104f9b 100644 --- a/substrate/client/basic-authorship/src/basic_authorship.rs +++ b/substrate/client/basic-authorship/src/basic_authorship.rs @@ -38,7 +38,7 @@ use sp_core::traits::SpawnNamed; use sp_inherents::InherentData; use sp_runtime::{ traits::{BlakeTwo256, Block as BlockT, Hash as HashT, Header as HeaderT}, - Digest, Percent, SaturatedConversion, + Digest, ExtrinsicInclusionMode, Percent, SaturatedConversion, }; use std::{marker::PhantomData, pin::Pin, sync::Arc, time}; @@ -87,6 +87,22 @@ pub struct ProposerFactory { _phantom: PhantomData, } +impl Clone for ProposerFactory { + fn clone(&self) -> Self { + Self { + spawn_handle: self.spawn_handle.clone(), + client: self.client.clone(), + transaction_pool: self.transaction_pool.clone(), + metrics: self.metrics.clone(), + default_block_size_limit: self.default_block_size_limit, + soft_deadline_percent: self.soft_deadline_percent, + telemetry: self.telemetry.clone(), + include_proof_in_block_size_estimation: self.include_proof_in_block_size_estimation, + _phantom: self._phantom, + } + } +} + impl ProposerFactory { /// Create a new proposer factory. /// @@ -164,7 +180,7 @@ impl ProposerFactory { /// The soft deadline indicates where we should stop attempting to add transactions /// to the block, which exhaust resources. After soft deadline is reached, /// we switch to a fixed-amount mode, in which after we see `MAX_SKIPPED_TRANSACTIONS` - /// transactions which exhaust resrouces, we will conclude that the block is full. + /// transactions which exhaust resources, we will conclude that the block is full. /// /// Setting the value too low will significantly limit the amount of transactions /// we try in case they exhaust resources. Setting the value too high can @@ -319,11 +335,12 @@ where self.apply_inherents(&mut block_builder, inherent_data)?; - // TODO call `after_inherents` and check if we should apply extrinsincs here - // - - let end_reason = - self.apply_extrinsics(&mut block_builder, deadline, block_size_limit).await?; + let mode = block_builder.extrinsic_inclusion_mode(); + let end_reason = match mode { + ExtrinsicInclusionMode::AllExtrinsics => + self.apply_extrinsics(&mut block_builder, deadline, block_size_limit).await?, + ExtrinsicInclusionMode::OnlyInherents => EndProposingReason::TransactionForbidden, + }; let (block, storage_changes, proof) = block_builder.build()?.into_inner(); let block_took = block_timer.elapsed(); diff --git a/substrate/client/block-builder/src/lib.rs b/substrate/client/block-builder/src/lib.rs index 258e39d962b2de2397d85a54223c155e821ddfa3..2f22cd42591fc60bf1665d00a1c5b2b548ad3aea 100644 --- a/substrate/client/block-builder/src/lib.rs +++ b/substrate/client/block-builder/src/lib.rs @@ -37,7 +37,7 @@ use sp_core::traits::CallContext; use sp_runtime::{ legacy, traits::{Block as BlockT, Hash, HashingFor, Header as HeaderT, NumberFor, One}, - Digest, + Digest, ExtrinsicInclusionMode, }; use std::marker::PhantomData; @@ -198,10 +198,12 @@ pub struct BlockBuilder<'a, Block: BlockT, C: ProvideRuntimeApi + 'a> { extrinsics: Vec, api: ApiRef<'a, C::Api>, call_api_at: &'a C, + /// Version of the [`BlockBuilderApi`] runtime API. version: u32, parent_hash: Block::Hash, /// The estimated size of the block header. estimated_header_size: usize, + extrinsic_inclusion_mode: ExtrinsicInclusionMode, } impl<'a, Block, C> BlockBuilder<'a, Block, C> @@ -244,9 +246,19 @@ where api.set_call_context(CallContext::Onchain); - api.initialize_block(parent_hash, &header)?; + let core_version = api + .api_version::>(parent_hash)? + .ok_or_else(|| Error::VersionInvalid("Core".to_string()))?; - let version = api + let extrinsic_inclusion_mode = if core_version >= 5 { + api.initialize_block(parent_hash, &header)? + } else { + #[allow(deprecated)] + api.initialize_block_before_version_5(parent_hash, &header)?; + ExtrinsicInclusionMode::AllExtrinsics + }; + + let bb_version = api .api_version::>(parent_hash)? .ok_or_else(|| Error::VersionInvalid("BlockBuilderApi".to_string()))?; @@ -254,12 +266,18 @@ where parent_hash, extrinsics: Vec::new(), api, - version, + version: bb_version, estimated_header_size, call_api_at, + extrinsic_inclusion_mode, }) } + /// The extrinsic inclusion mode of the runtime for this block. + pub fn extrinsic_inclusion_mode(&self) -> ExtrinsicInclusionMode { + self.extrinsic_inclusion_mode + } + /// Push onto the block's list of extrinsics. /// /// This will ensure the extrinsic can be validly executed (by executing it). diff --git a/substrate/client/chain-spec/Cargo.toml b/substrate/client/chain-spec/Cargo.toml index 9ab12dc2ad55878714327e4c51c049c8d8da5396..84320f17d7cb92c8319d437d49f70f2967e8fda1 100644 --- a/substrate/client/chain-spec/Cargo.toml +++ b/substrate/client/chain-spec/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sc-chain-spec" -version = "27.0.0" +version = "28.0.0" authors.workspace = true edition.workspace = true license = "GPL-3.0-or-later WITH Classpath-exception-2.0" @@ -18,8 +18,8 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } memmap2 = "0.9.3" -serde = { version = "1.0.195", features = ["derive"] } -serde_json = "1.0.111" +serde = { features = ["derive"], workspace = true, default-features = true } +serde_json = { workspace = true, default-features = true } sc-client-api = { path = "../api" } sc-chain-spec-derive = { path = "derive" } sc-executor = { path = "../executor" } @@ -32,9 +32,10 @@ sp-crypto-hashing = { path = "../../primitives/crypto/hashing" } sp-genesis-builder = { path = "../../primitives/genesis-builder" } sp-runtime = { path = "../../primitives/runtime" } sp-state-machine = { path = "../../primitives/state-machine" } -log = { version = "0.4.17", default-features = false } +log = { workspace = true } +sp-tracing = { path = "../../primitives/tracing" } array-bytes = { version = "6.1" } -docify = "0.2.7" +docify = "0.2.8" [dev-dependencies] substrate-test-runtime = { path = "../../test-utils/runtime" } diff --git a/substrate/client/chain-spec/derive/Cargo.toml b/substrate/client/chain-spec/derive/Cargo.toml index 5e8e64e55513350d001e69755816e68536ac4592..521eee578ecae3b03cf86a3b4e3630bb7cd22f02 100644 --- a/substrate/client/chain-spec/derive/Cargo.toml +++ b/substrate/client/chain-spec/derive/Cargo.toml @@ -20,5 +20,5 @@ proc-macro = true [dependencies] proc-macro-crate = "3.0.0" proc-macro2 = "1.0.56" -quote = "1.0.28" -syn = "2.0.48" +quote = { workspace = true } +syn = { workspace = true } diff --git a/substrate/client/chain-spec/res/chain_spec_as_json_fails_with_invalid_config.err b/substrate/client/chain-spec/res/chain_spec_as_json_fails_with_invalid_config.err new file mode 100644 index 0000000000000000000000000000000000000000..c545b53b2bafea88af090236f825bbafe2baf8f8 --- /dev/null +++ b/substrate/client/chain-spec/res/chain_spec_as_json_fails_with_invalid_config.err @@ -0,0 +1,114 @@ +Invalid JSON blob: unknown field `babex`, expected one of `system`, `babe`, `substrateTest`, `balances` at line 3 column 9 for blob: +{ + "system": {}, + "babex": { + "authorities": [ + [ + "5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY", + 1 + ], + [ + "5FHneW46xGXgs5mUiveU4sbTyGBzmstUspZC92UhjJM694ty", + 1 + ], + [ + "5FLSigC9HGRKVhB9FiEo4Y3koPsNmBmLJbpXg2mp1hXcS59Y", + 1 + ] + ], + "epochConfig": { + "c": [ + 3, + 10 + ], + "allowed_slots": "PrimaryAndSecondaryPlainSlots" + } + }, + "substrateTest": { + "authorities": [ + "5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY", + "5FHneW46xGXgs5mUiveU4sbTyGBzmstUspZC92UhjJM694ty", + "5FLSigC9HGRKVhB9FiEo4Y3koPsNmBmLJbpXg2mp1hXcS59Y" + ] + }, + "balances": { + "balances": [ + [ + "5D34dL5prEUaGNQtPPZ3yN5Y6BnkfXunKXXz6fo7ZJbLwRRH", + 100000000000000000 + ], + [ + "5GBNeWRhZc2jXu7D55rBimKYDk8PGk8itRYFTPfC8RJLKG5o", + 100000000000000000 + ], + [ + "5Dfis6XL8J2P6JHUnUtArnFWndn62SydeP8ee8sG2ky9nfm9", + 100000000000000000 + ], + [ + "5F4H97f7nQovyrbiq4ZetaaviNwThSVcFobcA5aGab6167dK", + 100000000000000000 + ], + [ + "5DiDShBWa1fQx6gLzpf3SFBhMinCoyvHM1BWjPNsmXS8hkrW", + 100000000000000000 + ], + [ + "5EFb84yH9tpcFuiKUcsmdoF7xeeY3ajG1ZLQimxQoFt9HMKR", + 100000000000000000 + ], + [ + "5DZLHESsfGrJ5YzT3HuRPXsSNb589xQ4Unubh1mYLodzKdVY", + 100000000000000000 + ], + [ + "5GHJzqvG6tXnngCpG7B12qjUvbo5e4e9z8Xjidk3CQZHxTPZ", + 100000000000000000 + ], + [ + "5CUnSsgAyLND3bxxnfNhgWXSe9Wn676JzLpGLgyJv858qhoX", + 100000000000000000 + ], + [ + "5CVKn7HAZW1Ky4r7Vkgsr7VEW88C2sHgUNDiwHY9Ct2hjU8q", + 100000000000000000 + ], + [ + "5H673aukQ4PeDe1U2nuv1bi32xDEziimh3PZz7hDdYUB7TNz", + 100000000000000000 + ], + [ + "5HTe9L15LJryjUAt1jZXZCBPnzbbGnpvFwbjE3NwCWaAqovf", + 100000000000000000 + ], + [ + "5D7LFzGpMwHPyDBavkRbWSKWTtJhCaPPZ379wWLT23bJwXJz", + 100000000000000000 + ], + [ + "5CLepMARnEgtVR1EkUuJVUvKh97gzergpSxUU3yKGx1v6EwC", + 100000000000000000 + ], + [ + "5Chb2UhfvZpmjjEziHbFbotM4quX32ZscRV6QJBt1rUKzz51", + 100000000000000000 + ], + [ + "5HmRp3i3ZZk7xsAvbi8hyXVP6whSMnBJGebVC4FsiZVhx52e", + 100000000000000000 + ], + [ + "5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY", + 100000000000000000 + ], + [ + "5FHneW46xGXgs5mUiveU4sbTyGBzmstUspZC92UhjJM694ty", + 100000000000000000 + ], + [ + "5FLSigC9HGRKVhB9FiEo4Y3koPsNmBmLJbpXg2mp1hXcS59Y", + 100000000000000000 + ] + ] + } +} \ No newline at end of file diff --git a/substrate/client/chain-spec/res/substrate_test_runtime_from_named_preset.json b/substrate/client/chain-spec/res/substrate_test_runtime_from_named_preset.json new file mode 100644 index 0000000000000000000000000000000000000000..a98600a5577b2f5d16dc6fcf69b66f9c13f2bf5a --- /dev/null +++ b/substrate/client/chain-spec/res/substrate_test_runtime_from_named_preset.json @@ -0,0 +1,35 @@ +{ + "name": "TestName", + "id": "test_id", + "chainType": "Local", + "bootNodes": [], + "telemetryEndpoints": null, + "protocolId": null, + "properties": null, + "codeSubstitutes": {}, + "genesis": { + "runtimeGenesis": { + "patch": { + "balances": { + "balances": [ + [ + "5FHneW46xGXgs5mUiveU4sbTyGBzmstUspZC92UhjJM694ty", + 1000000000000000 + ], + [ + "5FLSigC9HGRKVhB9FiEo4Y3koPsNmBmLJbpXg2mp1hXcS59Y", + 1000000000000000 + ] + ] + }, + "substrateTest": { + "authorities": [ + "5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY", + "5CiPPseXPECbkjWCa6MnjNokrgYjMqmKndv2rSnekmSK2DjL" + ] + } + }, + "code": "0x0" + } + } +} diff --git a/substrate/client/chain-spec/src/chain_spec.rs b/substrate/client/chain-spec/src/chain_spec.rs index fe8fcfda216e1fa86215daf93add2aa6adc78bd9..a9cdce4bf95580f6c00cbf27b0330779e4f39a28 100644 --- a/substrate/client/chain-spec/src/chain_spec.rs +++ b/substrate/client/chain-spec/src/chain_spec.rs @@ -40,26 +40,37 @@ use std::{ sync::Arc, }; -#[derive(Serialize, Deserialize, Clone)] +#[derive(Serialize, Deserialize)] #[serde(rename_all = "camelCase")] -enum GenesisBuildAction { +enum GenesisBuildAction { Patch(json::Value), Full(json::Value), + NamedPreset(String, PhantomData), +} + +impl Clone for GenesisBuildAction { + fn clone(&self) -> Self { + match self { + Self::Patch(ref p) => Self::Patch(p.clone()), + Self::Full(ref f) => Self::Full(f.clone()), + Self::NamedPreset(ref p, _) => Self::NamedPreset(p.clone(), Default::default()), + } + } } #[allow(deprecated)] -enum GenesisSource { +enum GenesisSource { File(PathBuf), Binary(Cow<'static, [u8]>), /// factory function + code - //Factory and G type parameter shall be removed togheter with `ChainSpec::from_genesis` + //Factory and G type parameter shall be removed together with `ChainSpec::from_genesis` Factory(Arc G + Send + Sync>, Vec), Storage(Storage), /// build action + code - GenesisBuilderApi(GenesisBuildAction, Vec), + GenesisBuilderApi(GenesisBuildAction, Vec), } -impl Clone for GenesisSource { +impl Clone for GenesisSource { fn clone(&self) -> Self { match *self { Self::File(ref path) => Self::File(path.clone()), @@ -71,7 +82,7 @@ impl Clone for GenesisSource { } } -impl GenesisSource { +impl GenesisSource { fn resolve(&self) -> Result, String> { /// helper container for deserializing genesis from the JSON file (ChainSpec JSON file is /// also supported here) @@ -118,6 +129,13 @@ impl GenesisSource { json_blob: RuntimeGenesisConfigJson::Patch(patch.clone()), code: code.clone(), })), + Self::GenesisBuilderApi(GenesisBuildAction::NamedPreset(name, _), code) => { + let patch = RuntimeCaller::::new(&code[..]).get_named_preset(Some(name))?; + Ok(Genesis::RuntimeGenesis(RuntimeGenesisInner { + json_blob: RuntimeGenesisConfigJson::Patch(patch), + code: code.clone(), + })) + }, } } } @@ -264,7 +282,7 @@ struct RuntimeInnerWrapper { enum Genesis { /// (Deprecated) Contains the JSON representation of G (the native type representing the /// runtime's `RuntimeGenesisConfig` struct) (will be removed with `ChainSpec::from_genesis`) - /// without the runtime code. It is required to deserialize the legacy chainspecs genereted + /// without the runtime code. It is required to deserialize the legacy chainspecs generated /// with `ChainsSpec::from_genesis` method. Runtime(G), /// (Deprecated) Contains the JSON representation of G (the native type representing the @@ -276,13 +294,13 @@ enum Genesis { Raw(RawGenesis), /// State root hash of the genesis storage. StateRootHash(StorageData), - /// Represents the runtime genesis config in JSON format toghether with runtime code. + /// Represents the runtime genesis config in JSON format together with runtime code. RuntimeGenesis(RuntimeGenesisInner), } /// A configuration of a client. Does not include runtime storage initialization. /// Note: `genesis` field is ignored due to way how the chain specification is serialized into -/// JSON file. Refer to [`ChainSpecJsonContainer`], which flattens [`ClientSpec`] and denies uknown +/// JSON file. Refer to [`ChainSpecJsonContainer`], which flattens [`ClientSpec`] and denies unknown /// fields. #[derive(Serialize, Deserialize, Clone, Debug)] #[serde(rename_all = "camelCase")] @@ -331,13 +349,13 @@ pub struct ChainSpecBuilder { name: String, id: String, chain_type: ChainType, - genesis_build_action: GenesisBuildAction, + genesis_build_action: GenesisBuildAction, boot_nodes: Option>, telemetry_endpoints: Option, protocol_id: Option, fork_id: Option, properties: Option, - _genesis: PhantomData<(G, EHF)>, + _genesis: PhantomData, } impl ChainSpecBuilder { @@ -425,6 +443,13 @@ impl ChainSpecBuilder { self } + /// Sets the name of runtime-provided JSON patch for runtime's GenesisConfig. + pub fn with_genesis_config_preset_name(mut self, name: &str) -> Self { + self.genesis_build_action = + GenesisBuildAction::NamedPreset(name.to_string(), Default::default()); + self + } + /// Sets the full runtime's GenesisConfig JSON. pub fn with_genesis_config(mut self, config: json::Value) -> Self { self.genesis_build_action = GenesisBuildAction::Full(config); @@ -463,7 +488,7 @@ impl ChainSpecBuilder { /// runtime is using the non-standard host function during genesis state creation. pub struct ChainSpec { client_spec: ClientSpec, - genesis: GenesisSource, + genesis: GenesisSource, _host_functions: PhantomData, } @@ -508,7 +533,7 @@ impl ChainSpec { self.client_spec.fork_id.as_deref() } - /// Additional loosly-typed properties of the chain. + /// Additional loosely-typed properties of the chain. /// /// Returns an empty JSON object if 'properties' not defined in config pub fn properties(&self) -> Properties { @@ -1009,7 +1034,30 @@ mod tests { assert!(raw_chain_spec.is_ok()); } - #[docify::export] + #[test] + fn generate_chain_spec_with_named_preset_works() { + sp_tracing::try_init_simple(); + let output: ChainSpec<()> = ChainSpec::builder( + substrate_test_runtime::wasm_binary_unwrap().into(), + Default::default(), + ) + .with_name("TestName") + .with_id("test_id") + .with_chain_type(ChainType::Local) + .with_genesis_config_preset_name("staging") + .build(); + + let actual = output.as_json(false).unwrap(); + let expected = + from_str::(include_str!("../res/substrate_test_runtime_from_named_preset.json")) + .unwrap(); + + //wasm blob may change overtime so let's zero it. Also ensure it is there: + let actual = zeroize_code_key_in_json(false, actual.as_str()); + + assert_eq!(actual, expected); + } + #[test] fn generate_chain_spec_with_patch_works() { let output = ChainSpec::<()>::builder( @@ -1089,6 +1137,8 @@ mod tests { #[test] fn chain_spec_as_json_fails_with_invalid_config() { + let expected_error_message = + include_str!("../res/chain_spec_as_json_fails_with_invalid_config.err"); let j = include_str!("../../../test-utils/runtime/res/default_genesis_config_invalid_2.json"); let output = ChainSpec::<()>::builder( @@ -1101,10 +1151,9 @@ mod tests { .with_genesis_config(from_str(j).unwrap()) .build(); - assert_eq!( - output.as_json(true), - Err("Invalid JSON blob: unknown field `babex`, expected one of `system`, `babe`, `substrateTest`, `balances` at line 1 column 8".to_string()) - ); + let result = output.as_json(true); + + assert_eq!(result.err().unwrap(), expected_error_message); } #[test] @@ -1237,15 +1286,7 @@ mod tests { "TestName", "test", ChainType::Local, - move || substrate_test_runtime::RuntimeGenesisConfig { - babe: substrate_test_runtime::BabeConfig { - epoch_config: Some( - substrate_test_runtime::TEST_RUNTIME_BABE_EPOCH_CONFIGURATION, - ), - ..Default::default() - }, - ..Default::default() - }, + || Default::default(), Vec::new(), None, None, diff --git a/substrate/client/chain-spec/src/extension.rs b/substrate/client/chain-spec/src/extension.rs index f2939741535f730787846d2a641a2721f5cec9e5..d1f03539349686cf22b00b362907eb0c3f67f406 100644 --- a/substrate/client/chain-spec/src/extension.rs +++ b/substrate/client/chain-spec/src/extension.rs @@ -284,7 +284,7 @@ where } } -/// A subset of the `Extension` trait that only allows for quering extensions. +/// A subset of the `Extension` trait that only allows for querying extensions. pub trait GetExtension { /// Get an extension of specific type. fn get_any(&self, t: TypeId) -> &dyn Any; diff --git a/substrate/client/chain-spec/src/genesis_block.rs b/substrate/client/chain-spec/src/genesis_block.rs index 6aa156a620a7933034643f8a7bdbf8e0d617ad97..3c7b9f64dcd6bc0babff662747571f9d31853eec 100644 --- a/substrate/client/chain-spec/src/genesis_block.rs +++ b/substrate/client/chain-spec/src/genesis_block.rs @@ -18,23 +18,25 @@ //! Tool for creating the genesis block. -use std::{collections::hash_map::DefaultHasher, marker::PhantomData, sync::Arc}; +use std::{marker::PhantomData, sync::Arc}; +use codec::Encode; use sc_client_api::{backend::Backend, BlockImportOperation}; use sc_executor::RuntimeVersionOf; use sp_core::storage::{well_known_keys, StateVersion, Storage}; use sp_runtime::{ - traits::{Block as BlockT, Hash as HashT, Header as HeaderT, Zero}, + traits::{Block as BlockT, Hash as HashT, HashingFor, Header as HeaderT, Zero}, BuildStorage, }; /// Return the state version given the genesis storage and executor. -pub fn resolve_state_version_from_wasm( +pub fn resolve_state_version_from_wasm( storage: &Storage, executor: &E, ) -> sp_blockchain::Result where E: RuntimeVersionOf, + H: HashT, { if let Some(wasm) = storage.top.get(well_known_keys::CODE) { let mut ext = sp_state_machine::BasicExternalities::new_empty(); // just to read runtime version. @@ -43,12 +45,7 @@ where let runtime_code = sp_core::traits::RuntimeCode { code_fetcher: &code_fetcher, heap_pages: None, - hash: { - use std::hash::{Hash, Hasher}; - let mut state = DefaultHasher::new(); - wasm.hash(&mut state); - state.finish().to_le_bytes().to_vec() - }, + hash: ::hash(wasm).encode(), }; let runtime_version = RuntimeVersionOf::runtime_version(executor, &mut ext, &runtime_code) .map_err(|e| sp_blockchain::Error::VersionInvalid(e.to_string()))?; @@ -129,7 +126,8 @@ impl, E: RuntimeVersionOf> BuildGenesisBlock sp_blockchain::Result<(Block, Self::BlockImportOperation)> { let Self { genesis_storage, commit_genesis_state, backend, executor, _phantom } = self; - let genesis_state_version = resolve_state_version_from_wasm(&genesis_storage, &executor)?; + let genesis_state_version = + resolve_state_version_from_wasm::<_, HashingFor>(&genesis_storage, &executor)?; let mut op = backend.begin_operation()?; let state_root = op.set_genesis_state(genesis_storage, commit_genesis_state, genesis_state_version)?; diff --git a/substrate/client/chain-spec/src/genesis_config_builder.rs b/substrate/client/chain-spec/src/genesis_config_builder.rs index 8766dd5c5ad28c9263f7538d255e03a898244026..13a2f3c072f5ace38cd48eb0f2f4492b60474e5b 100644 --- a/substrate/client/chain-spec/src/genesis_config_builder.rs +++ b/substrate/client/chain-spec/src/genesis_config_builder.rs @@ -26,14 +26,14 @@ use sp_core::{ storage::Storage, traits::{CallContext, CodeExecutor, Externalities, FetchRuntimeCode, RuntimeCode}, }; -use sp_genesis_builder::Result as BuildResult; +use sp_genesis_builder::{PresetId, Result as BuildResult}; use sp_state_machine::BasicExternalities; use std::borrow::Cow; /// A utility that facilitates calling the GenesisBuilder API from the runtime wasm code blob. /// /// `EHF` type allows to specify the extended host function required for building runtime's genesis -/// config. The type will be compbined with default `sp_io::SubstrateHostFunctions`. +/// config. The type will be combined with default `sp_io::SubstrateHostFunctions`. pub struct GenesisConfigBuilderRuntimeCaller<'a, EHF = ()> where EHF: HostFunctions, @@ -81,60 +81,97 @@ where .0 } - /// Returns the default `GenesisConfig` provided by the `runtime`. + /// Returns a json representation of the default `RuntimeGenesisConfig` provided by the + /// `runtime`. /// - /// Calls [`GenesisBuilder::create_default_config`](sp_genesis_builder::GenesisBuilder::create_default_config) in the `runtime`. + /// Calls [`GenesisBuilder::get_preset`](sp_genesis_builder::GenesisBuilder::get_preset) in the + /// `runtime` with `None` argument. pub fn get_default_config(&self) -> core::result::Result { + self.get_named_preset(None) + } + + /// Returns a JSON blob representation of the builtin `GenesisConfig` identified by `id`. + /// + /// Calls [`GenesisBuilder::get_preset`](sp_genesis_builder::GenesisBuilder::get_preset) + /// provided by the `runtime`. + pub fn get_named_preset(&self, id: Option<&String>) -> core::result::Result { let mut t = BasicExternalities::new_empty(); let call_result = self - .call(&mut t, "GenesisBuilder_create_default_config", &[]) + .call(&mut t, "GenesisBuilder_get_preset", &id.encode()) .map_err(|e| format!("wasm call error {e}"))?; - let default_config = Vec::::decode(&mut &call_result[..]) + + let named_preset = Option::>::decode(&mut &call_result[..]) .map_err(|e| format!("scale codec error: {e}"))?; - Ok(from_slice(&default_config[..]).expect("returned value is json. qed.")) + + if let Some(named_preset) = named_preset { + Ok(from_slice(&named_preset[..]).expect("returned value is json. qed.")) + } else { + Err(format!("The preset with name {id:?} is not available.")) + } } - /// Build the given `GenesisConfig` and returns the genesis state. - /// - /// Calls [`GenesisBuilder::build_config`](sp_genesis_builder::GenesisBuilder::build_config) - /// provided by the `runtime`. + /// Calls [`sp_genesis_builder::GenesisBuilder::build_state`] provided by runtime. pub fn get_storage_for_config(&self, config: Value) -> core::result::Result { let mut ext = BasicExternalities::new_empty(); + let json_pretty_str = serde_json::to_string_pretty(&config) + .map_err(|e| format!("json to string failed: {e}"))?; + let call_result = self - .call(&mut ext, "GenesisBuilder_build_config", &config.to_string().encode()) + .call(&mut ext, "GenesisBuilder_build_state", &json_pretty_str.encode()) .map_err(|e| format!("wasm call error {e}"))?; BuildResult::decode(&mut &call_result[..]) - .map_err(|e| format!("scale codec error: {e}"))??; + .map_err(|e| format!("scale codec error: {e}"))? + .map_err(|e| format!("{e} for blob:\n{}", json_pretty_str))?; Ok(ext.into_storages()) } - /// Creates the genesis state by patching the default `GenesisConfig` and applying it. + /// Creates the genesis state by patching the default `RuntimeGenesisConfig`. /// - /// This function generates the `GenesisConfig` for the runtime by applying a provided JSON - /// patch. The patch modifies the default `GenesisConfig` allowing customization of the specific - /// keys. The resulting `GenesisConfig` is then deserialized from the patched JSON - /// representation and stored in the storage. + /// This function generates the `RuntimeGenesisConfig` for the runtime by applying a provided + /// JSON patch. The patch modifies the default `RuntimeGenesisConfig` allowing customization of + /// the specific keys. The resulting `RuntimeGenesisConfig` is then deserialized from the + /// patched JSON representation and stored in the storage. /// /// If the provided JSON patch is incorrect or the deserialization fails the error will be /// returned. /// - /// The patching process modifies the default `GenesisConfig` according to the following rules: + /// The patching process modifies the default `RuntimeGenesisConfig` according to the following + /// rules: /// 1. Existing keys in the default configuration will be overridden by the corresponding values /// in the patch. /// 2. If a key exists in the patch but not in the default configuration, it will be added to - /// the resulting `GenesisConfig`. + /// the resulting `RuntimeGenesisConfig`. /// 3. Keys in the default configuration that have null values in the patch will be removed from - /// the resulting `GenesisConfig`. This is helpful for changing enum variant value. + /// the resulting `RuntimeGenesisConfig`. This is helpful for changing enum variant value. /// - /// Please note that the patch may contain full `GenesisConfig`. + /// Please note that the patch may contain full `RuntimeGenesisConfig`. pub fn get_storage_for_patch(&self, patch: Value) -> core::result::Result { let mut config = self.get_default_config()?; crate::json_patch::merge(&mut config, patch); self.get_storage_for_config(config) } + + pub fn get_storage_for_named_preset( + &self, + name: Option<&String>, + ) -> core::result::Result { + self.get_storage_for_patch(self.get_named_preset(name)?) + } + + pub fn preset_names(&self) -> core::result::Result, String> { + let mut t = BasicExternalities::new_empty(); + let call_result = self + .call(&mut t, "GenesisBuilder_preset_names", &vec![]) + .map_err(|e| format!("wasm call error {e}"))?; + + let preset_names = Vec::::decode(&mut &call_result[..]) + .map_err(|e| format!("scale codec error: {e}"))?; + + Ok(preset_names) + } } #[cfg(test)] @@ -142,6 +179,17 @@ mod tests { use super::*; use serde_json::{from_str, json}; pub use sp_consensus_babe::{AllowedSlots, BabeEpochConfiguration}; + pub use sp_genesis_builder::PresetId; + + #[test] + fn list_presets_works() { + sp_tracing::try_init_simple(); + let presets = + ::new(substrate_test_runtime::wasm_binary_unwrap()) + .preset_names() + .unwrap(); + assert_eq!(presets, vec![PresetId::from("foobar"), PresetId::from("staging"),]); + } #[test] fn get_default_config_works() { @@ -149,7 +197,18 @@ mod tests { ::new(substrate_test_runtime::wasm_binary_unwrap()) .get_default_config() .unwrap(); - let expected = r#"{"system":{},"babe":{"authorities":[],"epochConfig":null},"substrateTest":{"authorities":[]},"balances":{"balances":[]}}"#; + let expected = r#"{"babe": {"authorities": [], "epochConfig": {"allowed_slots": "PrimaryAndSecondaryVRFSlots", "c": [1, 4]}}, "balances": {"balances": []}, "substrateTest": {"authorities": []}, "system": {}}"#; + assert_eq!(from_str::(expected).unwrap(), config); + } + + #[test] + fn get_named_preset_works() { + sp_tracing::try_init_simple(); + let config = + ::new(substrate_test_runtime::wasm_binary_unwrap()) + .get_named_preset(Some(&"foobar".to_string())) + .unwrap(); + let expected = r#"{"foo":"bar"}"#; assert_eq!(from_str::(expected).unwrap(), config); } diff --git a/substrate/client/chain-spec/src/lib.rs b/substrate/client/chain-spec/src/lib.rs index eab5f789f29a0589d68c3c0aa86952c75f112afa..abe01dafd92483fbede02eb6d95205b29bddacb5 100644 --- a/substrate/client/chain-spec/src/lib.rs +++ b/substrate/client/chain-spec/src/lib.rs @@ -140,7 +140,7 @@ //!
CommittedCandidateReceipt<H = Hash>
A JSON object that provides an explicit and comprehensive representation of the //! RuntimeGenesisConfig struct, which is generated by frame::runtime::prelude::construct_runtime macro (polkadot_sdk_frame::runtime::prelude::construct_runtime macro (example of generated struct). Must contain all the keys of //! the genesis config, no defaults will be used. @@ -181,7 +181,7 @@ //! the node needs to interact with the runtime. //! //! This interaction involves passing the runtime genesis config JSON blob to the runtime using the -//! [`sp_genesis_builder::GenesisBuilder::build_config`] function. During this operation, the +//! [`sp_genesis_builder::GenesisBuilder::build_state`] function. During this operation, the //! runtime converts the JSON representation of the genesis config into [`sp_io::storage`] items. It //! is a crucial step for computing the storage root hash, which is a key component in determining //! the genesis hash. @@ -325,7 +325,7 @@ mod chain_spec; mod extension; mod genesis_block; mod genesis_config_builder; -mod json_patch; +pub mod json_patch; pub use self::{ chain_spec::{ @@ -393,7 +393,7 @@ pub trait ChainSpec: BuildStorage + Send + Sync { fn protocol_id(&self) -> Option<&str>; /// Optional network fork identifier. `None` by default. fn fork_id(&self) -> Option<&str>; - /// Additional loosly-typed properties of the chain. + /// Additional loosely-typed properties of the chain. /// /// Returns an empty JSON object if 'properties' not defined in config fn properties(&self) -> Properties; diff --git a/substrate/client/cli/Cargo.toml b/substrate/client/cli/Cargo.toml index 2d9c2fa5ffbdd97e53bb2a246ceee69c013ea7c7..805d3ee117f4ac19b636550bea6a0845978defee 100644 --- a/substrate/client/cli/Cargo.toml +++ b/substrate/client/cli/Cargo.toml @@ -18,21 +18,22 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] array-bytes = "6.1" chrono = "0.4.31" -clap = { version = "4.4.18", features = ["derive", "string", "wrap_help"] } +clap = { version = "4.5.3", features = ["derive", "string", "wrap_help"] } fdlimit = "0.3.0" -futures = "0.3.21" +futures = "0.3.30" itertools = "0.10.3" libp2p-identity = { version = "0.1.3", features = ["ed25519", "peerid"] } -log = "0.4.17" +log = { workspace = true, default-features = true } names = { version = "0.14.0", default-features = false } parity-scale-codec = "3.6.1" rand = "0.8.5" regex = "1.6.0" rpassword = "7.0.0" -serde = "1.0.195" -serde_json = "1.0.111" -thiserror = "1.0.48" -bip39 = "2.0.0" +serde = { workspace = true, default-features = true } +serde_json = { workspace = true, default-features = true } +thiserror = { workspace = true } +# personal fork here as workaround for: https://github.com/rust-bitcoin/rust-bip39/pull/64 +bip39 = { package = "parity-bip39", version = "2.0.1", features = ["rand"] } tokio = { version = "1.22.0", features = ["parking_lot", "rt-multi-thread", "signal"] } sc-client-api = { path = "../api" } sc-client-db = { path = "../db", default-features = false } diff --git a/substrate/client/cli/src/arg_enums.rs b/substrate/client/cli/src/arg_enums.rs index 6872c28547fd06a0dbb38ec8bdb466d917b31763..8674cb782ecacff9569dcdd056a2232e9a826cc5 100644 --- a/substrate/client/cli/src/arg_enums.rs +++ b/substrate/client/cli/src/arg_enums.rs @@ -312,3 +312,23 @@ impl Into for SyncMode { } } } + +/// Network backend type. +#[derive(Debug, Clone, Copy, ValueEnum, PartialEq)] +#[value(rename_all = "lower")] +pub enum NetworkBackendType { + /// Use libp2p for P2P networking. + Libp2p, + + /// Use litep2p for P2P networking. + Litep2p, +} + +impl Into for NetworkBackendType { + fn into(self) -> sc_network::config::NetworkBackendType { + match self { + Self::Libp2p => sc_network::config::NetworkBackendType::Libp2p, + Self::Litep2p => sc_network::config::NetworkBackendType::Litep2p, + } + } +} diff --git a/substrate/client/cli/src/commands/build_spec_cmd.rs b/substrate/client/cli/src/commands/build_spec_cmd.rs index aa5314f9cf5a4c244d9ca26f343f158e94d00908..df8c6b7d0baac2d7ba77a22752925c37daf0b85a 100644 --- a/substrate/client/cli/src/commands/build_spec_cmd.rs +++ b/substrate/client/cli/src/commands/build_spec_cmd.rs @@ -67,7 +67,7 @@ impl BuildSpecCmd { let peer_id = keys.public().to_peer_id(); let addr = MultiaddrWithPeerId { multiaddr: build_multiaddr![Ip4([127, 0, 0, 1]), Tcp(30333u16)], - peer_id, + peer_id: peer_id.into(), }; spec.add_boot_node(addr) } diff --git a/substrate/client/cli/src/commands/generate.rs b/substrate/client/cli/src/commands/generate.rs index c465bcc85a47be16a5217677311499ce42573895..94769279e21940993785b2a4eeb6fed5d08ddeb6 100644 --- a/substrate/client/cli/src/commands/generate.rs +++ b/substrate/client/cli/src/commands/generate.rs @@ -64,7 +64,7 @@ impl GenerateCmd { let password = self.keystore_params.read_password()?; let output = self.output_scheme.output_type; - let phrase = mnemonic.word_iter().join(" "); + let phrase = mnemonic.words().join(" "); with_crypto_scheme!( self.crypto_scheme.scheme, diff --git a/substrate/client/cli/src/commands/run_cmd.rs b/substrate/client/cli/src/commands/run_cmd.rs index f7b0fc51049106306ccff6d0d8fedc4db48868a6..221c32affd5a91d680f23ed11eb5f7a9a4051da2 100644 --- a/substrate/client/cli/src/commands/run_cmd.rs +++ b/substrate/client/cli/src/commands/run_cmd.rs @@ -30,11 +30,14 @@ use crate::{ use clap::Parser; use regex::Regex; use sc_service::{ - config::{BasePath, PrometheusConfig, TransactionPoolOptions}, + config::{BasePath, PrometheusConfig, RpcBatchRequestConfig, TransactionPoolOptions}, ChainSpec, Role, }; use sc_telemetry::TelemetryEndpoints; -use std::net::{IpAddr, Ipv4Addr, SocketAddr}; +use std::{ + net::{IpAddr, Ipv4Addr, SocketAddr}, + num::NonZeroU32, +}; /// The `run` command used to run a node. #[derive(Debug, Clone, Parser)] @@ -59,7 +62,7 @@ pub struct RunCmd { /// Not all RPC methods are safe to be exposed publicly. /// /// Use an RPC proxy server to filter out dangerous methods. More details: - /// . + /// . /// /// Use `--unsafe-rpc-external` to suppress the warning if you understand the risks. #[arg(long)] @@ -82,6 +85,15 @@ pub struct RunCmd { )] pub rpc_methods: RpcMethods, + /// RPC rate limiting (calls/minute) for each connection. + /// + /// This is disabled by default. + /// + /// For example `--rpc-rate-limit 10` will maximum allow + /// 10 calls per minute per connection. + #[arg(long)] + pub rpc_rate_limit: Option, + /// Set the maximum RPC request payload size for both HTTP and WS in megabytes. #[arg(long, default_value_t = RPC_DEFAULT_MAX_REQUEST_SIZE_MB)] pub rpc_max_request_size: u32, @@ -113,6 +125,14 @@ pub struct RunCmd { #[arg(long, default_value_t = RPC_DEFAULT_MESSAGE_CAPACITY_PER_CONN)] pub rpc_message_buffer_capacity_per_connection: u32, + /// Disable RPC batch requests + #[arg(long, alias = "rpc_no_batch_requests", conflicts_with_all = &["rpc_max_batch_request_len"])] + pub rpc_disable_batch_requests: bool, + + /// Limit the max length per RPC batch request + #[arg(long, conflicts_with_all = &["rpc_disable_batch_requests"], value_name = "LEN")] + pub rpc_max_batch_request_len: Option, + /// Specify browser *origins* allowed to access the HTTP & WS RPC servers. /// /// A comma-separated list of origins (protocol://domain or special `null` @@ -399,6 +419,26 @@ impl CliConfiguration for RunCmd { Ok(self.rpc_max_subscriptions_per_connection) } + fn rpc_buffer_capacity_per_connection(&self) -> Result { + Ok(self.rpc_message_buffer_capacity_per_connection) + } + + fn rpc_batch_config(&self) -> Result { + let cfg = if self.rpc_disable_batch_requests { + RpcBatchRequestConfig::Disabled + } else if let Some(l) = self.rpc_max_batch_request_len { + RpcBatchRequestConfig::Limit(l) + } else { + RpcBatchRequestConfig::Unlimited + }; + + Ok(cfg) + } + + fn rpc_rate_limit(&self) -> Result> { + Ok(self.rpc_rate_limit) + } + fn transaction_pool(&self, is_dev: bool) -> Result { Ok(self.pool_config.transaction_pool(is_dev)) } diff --git a/substrate/client/cli/src/commands/vanity.rs b/substrate/client/cli/src/commands/vanity.rs index ce75161329893d281868c659bbc6656aa9ece194..330a59493efc9536cb1d78f2d97b40a11c94d4b0 100644 --- a/substrate/client/cli/src/commands/vanity.rs +++ b/substrate/client/cli/src/commands/vanity.rs @@ -51,7 +51,7 @@ pub struct VanityCmd { impl VanityCmd { /// Run the command pub fn run(&self) -> error::Result<()> { - let formated_seed = with_crypto_scheme!( + let formatted_seed = with_crypto_scheme!( self.crypto_scheme.scheme, generate_key( &self.pattern, @@ -62,7 +62,7 @@ impl VanityCmd { with_crypto_scheme!( self.crypto_scheme.scheme, print_from_uri( - &formated_seed, + &formatted_seed, None, self.network_scheme.network, self.output_scheme.output_type, diff --git a/substrate/client/cli/src/config.rs b/substrate/client/cli/src/config.rs index defcc4a8a69078513ffacf667e6de7a7dd67f6dd..5def9ce9b72620eb7942ac6ee68b16493f6b8053 100644 --- a/substrate/client/cli/src/config.rs +++ b/substrate/client/cli/src/config.rs @@ -28,12 +28,13 @@ use sc_service::{ config::{ BasePath, Configuration, DatabaseSource, KeystoreConfig, NetworkConfiguration, NodeKeyConfig, OffchainWorkerConfig, OutputFormat, PrometheusConfig, PruningMode, Role, - RpcMethods, TelemetryEndpoints, TransactionPoolOptions, WasmExecutionMethod, + RpcBatchRequestConfig, RpcMethods, TelemetryEndpoints, TransactionPoolOptions, + WasmExecutionMethod, }, BlocksPruning, ChainSpec, TracingReceiver, }; use sc_tracing::logging::LoggerBuilder; -use std::{net::SocketAddr, path::PathBuf}; +use std::{net::SocketAddr, num::NonZeroU32, path::PathBuf}; /// The maximum number of characters for a node name. pub(crate) const NODE_NAME_MAX_LENGTH: usize = 64; @@ -338,6 +339,16 @@ pub trait CliConfiguration: Sized { Ok(RPC_DEFAULT_MESSAGE_CAPACITY_PER_CONN) } + /// RPC server batch request configuration. + fn rpc_batch_config(&self) -> Result { + Ok(RpcBatchRequestConfig::Unlimited) + } + + /// RPC rate limit configuration. + fn rpc_rate_limit(&self) -> Result> { + Ok(None) + } + /// Get the prometheus configuration (`None` if disabled) /// /// By default this is `None`. @@ -510,6 +521,8 @@ pub trait CliConfiguration: Sized { rpc_max_subs_per_conn: self.rpc_max_subscriptions_per_connection()?, rpc_port: DCV::rpc_listen_port(), rpc_message_buffer_capacity: self.rpc_buffer_capacity_per_connection()?, + rpc_batch_config: self.rpc_batch_config()?, + rpc_rate_limit: self.rpc_rate_limit()?, prometheus_config: self .prometheus_config(DCV::prometheus_listen_port(), &chain_spec)?, telemetry_endpoints, diff --git a/substrate/client/cli/src/params/network_params.rs b/substrate/client/cli/src/params/network_params.rs index 12f19df2a68549be318bedf1cc86875a292ee86b..748b84a50d2ae1cc60a8b5195e14e17615bc865a 100644 --- a/substrate/client/cli/src/params/network_params.rs +++ b/substrate/client/cli/src/params/network_params.rs @@ -16,7 +16,10 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -use crate::{arg_enums::SyncMode, params::node_key_params::NodeKeyParams}; +use crate::{ + arg_enums::{NetworkBackendType, SyncMode}, + params::node_key_params::NodeKeyParams, +}; use clap::Args; use sc_network::{ config::{ @@ -166,6 +169,20 @@ pub struct NetworkParams { /// and observe block requests timing out. #[arg(long, value_name = "COUNT", default_value_t = 64)] pub max_blocks_per_request: u32, + + /// Network backend used for P2P networking. + /// + /// litep2p network backend is considered experimental and isn't as stable as the libp2p + /// network backend. + #[arg( + long, + value_enum, + value_name = "NETWORK_BACKEND", + default_value_t = NetworkBackendType::Libp2p, + ignore_case = true, + verbatim_doc_comment + )] + pub network_backend: NetworkBackendType, } impl NetworkParams { @@ -261,6 +278,7 @@ impl NetworkParams { yamux_window_size: None, ipfs_server: self.ipfs_server, sync_mode: self.sync.into(), + network_backend: self.network_backend.into(), } } } @@ -310,7 +328,7 @@ mod tests { } #[test] - fn sync_ingores_case() { + fn sync_ignores_case() { let params = Cli::try_parse_from(["", "--sync", "wArP"]).expect("Parses network params"); assert_eq!(SyncMode::Warp, params.network_params.sync); diff --git a/substrate/client/cli/src/runner.rs b/substrate/client/cli/src/runner.rs index e37c8ab0e55163f72a4ec79dbc3c8c221205ac84..4201a0f4062fb0063621d85dd02feb0deade24bc 100644 --- a/substrate/client/cli/src/runner.rs +++ b/substrate/client/cli/src/runner.rs @@ -271,6 +271,8 @@ mod tests { rpc_max_subs_per_conn: Default::default(), rpc_message_buffer_capacity: Default::default(), rpc_port: 9944, + rpc_batch_config: sc_service::config::RpcBatchRequestConfig::Unlimited, + rpc_rate_limit: None, prometheus_config: None, telemetry_endpoints: None, default_heap_pages: None, diff --git a/substrate/client/consensus/aura/Cargo.toml b/substrate/client/consensus/aura/Cargo.toml index 33f7d160d8131f2b7eaadd679c8f32c112c1646f..64e2d16cd913aaea5d2688087e90088e5ff46ab8 100644 --- a/substrate/client/consensus/aura/Cargo.toml +++ b/substrate/client/consensus/aura/Cargo.toml @@ -16,11 +16,11 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -async-trait = "0.1.74" +async-trait = "0.1.79" codec = { package = "parity-scale-codec", version = "3.6.1" } -futures = "0.3.21" -log = "0.4.17" -thiserror = "1.0" +futures = "0.3.30" +log = { workspace = true, default-features = true } +thiserror = { workspace = true } prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../../utils/prometheus" } sc-block-builder = { path = "../../block-builder" } sc-client-api = { path = "../../api" } diff --git a/substrate/client/consensus/aura/src/lib.rs b/substrate/client/consensus/aura/src/lib.rs index 1be7be8eeeaa60a75ae8b6ef95fd8cbbd5b3998e..e220aaac508df50c1c6d440cfe50ee3b4015d64a 100644 --- a/substrate/client/consensus/aura/src/lib.rs +++ b/substrate/client/consensus/aura/src/lib.rs @@ -82,7 +82,7 @@ pub enum CompatibilityMode { None, /// Call `initialize_block` before doing any runtime calls. /// - /// Previously the node would execute `initialize_block` before fetchting the authorities + /// Previously the node would execute `initialize_block` before fetching the authorities /// from the runtime. This behaviour changed in: /// /// By calling `initialize_block` before fetching the authorities, on a block that diff --git a/substrate/client/consensus/babe/Cargo.toml b/substrate/client/consensus/babe/Cargo.toml index 01c5d062d61db800bc2fbdc727aa6349963505a8..b001e3d117aa94c86e76484336b434f840ec3e69 100644 --- a/substrate/client/consensus/babe/Cargo.toml +++ b/substrate/client/consensus/babe/Cargo.toml @@ -17,15 +17,15 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -async-trait = "0.1.74" +async-trait = "0.1.79" codec = { package = "parity-scale-codec", version = "3.6.1", features = ["derive"] } -futures = "0.3.21" -log = "0.4.17" +futures = "0.3.30" +log = { workspace = true, default-features = true } num-bigint = "0.4.3" num-rational = "0.4.1" num-traits = "0.2.17" parking_lot = "0.12.1" -thiserror = "1.0" +thiserror = { workspace = true } fork-tree = { path = "../../../utils/fork-tree" } prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../../utils/prometheus" } sc-client-api = { path = "../../api" } @@ -54,4 +54,4 @@ sc-network-test = { path = "../../network/test" } sp-timestamp = { path = "../../../primitives/timestamp" } sp-tracing = { path = "../../../primitives/tracing" } substrate-test-runtime-client = { path = "../../../test-utils/runtime/client" } -tokio = "1.22.0" +tokio = "1.37" diff --git a/substrate/client/consensus/babe/rpc/Cargo.toml b/substrate/client/consensus/babe/rpc/Cargo.toml index 2ca029444d078754bdd954386d2104b02cc09e34..b2661bbde27e4a9d72d0140e241c1da1bcc0f2b2 100644 --- a/substrate/client/consensus/babe/rpc/Cargo.toml +++ b/substrate/client/consensus/babe/rpc/Cargo.toml @@ -16,10 +16,10 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -jsonrpsee = { version = "0.20.3", features = ["client-core", "macros", "server"] } -futures = "0.3.21" -serde = { version = "1.0.195", features = ["derive"] } -thiserror = "1.0" +jsonrpsee = { version = "0.22", features = ["client-core", "macros", "server"] } +futures = "0.3.30" +serde = { features = ["derive"], workspace = true, default-features = true } +thiserror = { workspace = true } sc-consensus-babe = { path = ".." } sc-consensus-epochs = { path = "../../epochs" } sc-rpc-api = { path = "../../../rpc-api" } @@ -33,8 +33,8 @@ sp-keystore = { path = "../../../../primitives/keystore" } sp-runtime = { path = "../../../../primitives/runtime" } [dev-dependencies] -serde_json = "1.0.111" -tokio = "1.22.0" +serde_json = { workspace = true, default-features = true } +tokio = "1.37" sc-consensus = { path = "../../common" } sc-keystore = { path = "../../../keystore" } sc-transaction-pool-api = { path = "../../../transaction-pool/api" } diff --git a/substrate/client/consensus/babe/rpc/src/lib.rs b/substrate/client/consensus/babe/rpc/src/lib.rs index 307b1f955ba2efa3a51302225d3d74e00e800538..a3e811baecffd6de1b9f94952be40d00d8b61de3 100644 --- a/substrate/client/consensus/babe/rpc/src/lib.rs +++ b/substrate/client/consensus/babe/rpc/src/lib.rs @@ -258,9 +258,9 @@ mod tests { let request = r#"{"jsonrpc":"2.0","method":"babe_epochAuthorship","params": [],"id":1}"#; let (response, _) = api.raw_json_request(request, 1).await.unwrap(); - let expected = r#"{"jsonrpc":"2.0","result":{"5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY":{"primary":[0],"secondary":[1,2,4],"secondary_vrf":[]}},"id":1}"#; + let expected = r#"{"jsonrpc":"2.0","result":{"5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY":{"primary":[0],"secondary":[],"secondary_vrf":[1,2,4]}},"id":1}"#; - assert_eq!(&response.result, expected); + assert_eq!(response, expected); } #[tokio::test] @@ -272,6 +272,6 @@ mod tests { let (response, _) = api.raw_json_request(request, 1).await.unwrap(); let expected = r#"{"jsonrpc":"2.0","error":{"code":-32601,"message":"RPC call is unsafe to be called externally"},"id":1}"#; - assert_eq!(&response.result, expected); + assert_eq!(response, expected); } } diff --git a/substrate/client/consensus/babe/src/authorship.rs b/substrate/client/consensus/babe/src/authorship.rs index 11f5233abc6b384ef034acaa1f26a1833aee124a..57ee706a04f6bfc80ff29b6e0bbf91a4874991b1 100644 --- a/substrate/client/consensus/babe/src/authorship.rs +++ b/substrate/client/consensus/babe/src/authorship.rs @@ -59,7 +59,7 @@ pub(super) fn calculate_primary_threshold( assert!(theta > 0.0, "authority with weight 0."); // NOTE: in the equation `p = 1 - (1 - c)^theta` the value of `p` is always - // capped by `c`. For all pratical purposes `c` should always be set to a + // capped by `c`. For all practical purposes `c` should always be set to a // value < 0.5, as such in the computations below we should never be near // edge cases like `0.999999`. diff --git a/substrate/client/consensus/babe/src/lib.rs b/substrate/client/consensus/babe/src/lib.rs index ccf72939631accae68c9e473cf30461c2fca65dc..d10bdd8c7e4c4d108b78ef3286f475ba85e16a8a 100644 --- a/substrate/client/consensus/babe/src/lib.rs +++ b/substrate/client/consensus/babe/src/lib.rs @@ -1418,7 +1418,7 @@ where // Skip babe logic if block already in chain or importing blocks during initial sync, // otherwise the check for epoch changes will error because trying to re-import an - // epoch change or because of missing epoch data in the tree, respectivelly. + // epoch change or because of missing epoch data in the tree, respectively. if info.block_gap.map_or(false, |(s, e)| s <= number && number <= e) || block_status == BlockStatus::InChain { diff --git a/substrate/client/consensus/babe/src/migration.rs b/substrate/client/consensus/babe/src/migration.rs index bec2d0a61f4b6d4f55236f69042bd764629b5f92..5f1ece3ec0e208306a935f269b47667cdb8b4863 100644 --- a/substrate/client/consensus/babe/src/migration.rs +++ b/substrate/client/consensus/babe/src/migration.rs @@ -64,7 +64,7 @@ impl EpochT for EpochV0 { // Implement From for Epoch impl EpochV0 { - /// Migrate the sturct to current epoch version. + /// Migrate the struct to current epoch version. pub fn migrate(self, config: &BabeConfiguration) -> Epoch { sp_consensus_babe::Epoch { epoch_index: self.epoch_index, diff --git a/substrate/client/consensus/beefy/Cargo.toml b/substrate/client/consensus/beefy/Cargo.toml index 3522697427875034ec330d31b80b22085c1f042b..7b61b3c6c01f39003d9212fcfc0ea4abc8963bd2 100644 --- a/substrate/client/consensus/beefy/Cargo.toml +++ b/substrate/client/consensus/beefy/Cargo.toml @@ -14,13 +14,13 @@ workspace = true [dependencies] array-bytes = "6.1" async-channel = "1.8.0" -async-trait = "0.1.74" +async-trait = "0.1.79" codec = { package = "parity-scale-codec", version = "3.6.1", features = ["derive"] } fnv = "1.0.6" -futures = "0.3" -log = "0.4" +futures = "0.3.30" +log = { workspace = true, default-features = true } parking_lot = "0.12.1" -thiserror = "1.0" +thiserror = { workspace = true } wasm-timer = "0.2.5" prometheus = { package = "substrate-prometheus-endpoint", path = "../../../utils/prometheus" } sc-client-api = { path = "../../api" } @@ -28,6 +28,7 @@ sc-consensus = { path = "../common" } sc-network = { path = "../../network" } sc-network-gossip = { path = "../../network-gossip" } sc-network-sync = { path = "../../network/sync" } +sc-network-types = { path = "../../network/types" } sc-utils = { path = "../../utils" } sp-api = { path = "../../../primitives/api" } sp-application-crypto = { path = "../../../primitives/application-crypto" } @@ -40,11 +41,11 @@ sp-crypto-hashing = { path = "../../../primitives/crypto/hashing" } sp-keystore = { path = "../../../primitives/keystore" } sp-mmr-primitives = { path = "../../../primitives/merkle-mountain-range" } sp-runtime = { path = "../../../primitives/runtime" } -tokio = "1.22.0" +tokio = "1.37" [dev-dependencies] -serde = "1.0.195" +serde = { workspace = true, default-features = true } tempfile = "3.1.0" sc-block-builder = { path = "../../block-builder" } sc-network-test = { path = "../../network/test" } @@ -52,3 +53,12 @@ sp-consensus-grandpa = { path = "../../../primitives/consensus/grandpa" } sp-keyring = { path = "../../../primitives/keyring" } sp-tracing = { path = "../../../primitives/tracing" } substrate-test-runtime-client = { path = "../../../test-utils/runtime/client" } + +[features] +# This feature adds BLS crypto primitives. It should not be used in production since +# the BLS implementation and interface may still be subject to significant change. +bls-experimental = [ + "sp-application-crypto/bls-experimental", + "sp-consensus-beefy/bls-experimental", + "sp-core/bls-experimental", +] diff --git a/substrate/client/consensus/beefy/README.md b/substrate/client/consensus/beefy/README.md index 13f88303a972ac35f2bbcb11a443619b603149a7..a7956cfcd42efab055ea7cc5d0efc14f54ea20ba 100644 --- a/substrate/client/consensus/beefy/README.md +++ b/substrate/client/consensus/beefy/README.md @@ -297,7 +297,7 @@ periodically on the global topic. Let's now dive into description of the message - Justification is considered worthwhile to gossip when: - It is for a recent (implementation specific) round or the latest mandatory round. - All signatures are valid and there is at least `2/3rd + 1` of them. - - Signatorees are part of the current validator set. + - Signatories are part of the current validator set. - Mandatory justifications should be announced periodically. ## Misbehavior diff --git a/substrate/client/consensus/beefy/rpc/Cargo.toml b/substrate/client/consensus/beefy/rpc/Cargo.toml index 496aefac113aeffbdc9ad361c2df9a8fc2c99856..e46fc4f4410a461f73f5e5fe791bd9b08fd98a99 100644 --- a/substrate/client/consensus/beefy/rpc/Cargo.toml +++ b/substrate/client/consensus/beefy/rpc/Cargo.toml @@ -13,12 +13,12 @@ workspace = true [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", features = ["derive"] } -futures = "0.3.21" -jsonrpsee = { version = "0.20.3", features = ["client-core", "macros", "server"] } -log = "0.4" +futures = "0.3.30" +jsonrpsee = { version = "0.22", features = ["client-core", "macros", "server"] } +log = { workspace = true, default-features = true } parking_lot = "0.12.1" -serde = { version = "1.0.195", features = ["derive"] } -thiserror = "1.0" +serde = { features = ["derive"], workspace = true, default-features = true } +thiserror = { workspace = true } sc-consensus-beefy = { path = ".." } sp-consensus-beefy = { path = "../../../../primitives/consensus/beefy" } sc-rpc = { path = "../../../rpc" } @@ -26,7 +26,7 @@ sp-core = { path = "../../../../primitives/core" } sp-runtime = { path = "../../../../primitives/runtime" } [dev-dependencies] -serde_json = "1.0.111" +serde_json = { workspace = true, default-features = true } sc-rpc = { path = "../../../rpc", features = ["test-helpers"] } substrate-test-runtime-client = { path = "../../../../test-utils/runtime/client" } tokio = { version = "1.22.0", features = ["macros"] } diff --git a/substrate/client/consensus/beefy/rpc/src/lib.rs b/substrate/client/consensus/beefy/rpc/src/lib.rs index 03c83e92716c7d860760af40a578f651b962d23d..f01baee2d6ece9a9d1dd36e1524a1d004e9b0401 100644 --- a/substrate/client/consensus/beefy/rpc/src/lib.rs +++ b/substrate/client/consensus/beefy/rpc/src/lib.rs @@ -184,10 +184,10 @@ mod tests { async fn uninitialized_rpc_handler() { let (rpc, _) = setup_io_handler(); let request = r#"{"jsonrpc":"2.0","method":"beefy_getFinalizedHead","params":[],"id":1}"#; - let expected_response = r#"{"jsonrpc":"2.0","error":{"code":1,"message":"BEEFY RPC endpoint not ready"},"id":1}"#.to_string(); + let expected_response = r#"{"jsonrpc":"2.0","error":{"code":1,"message":"BEEFY RPC endpoint not ready"},"id":1}"#; let (response, _) = rpc.raw_json_request(&request, 1).await.unwrap(); - assert_eq!(expected_response, response.result); + assert_eq!(expected_response, response); } #[tokio::test] @@ -205,20 +205,18 @@ mod tests { \"jsonrpc\":\"2.0\",\ \"result\":\"0x2f0039e93a27221fcf657fb877a1d4f60307106113e885096cb44a461cd0afbf\",\ \"id\":1\ - }" - .to_string(); + }"; let not_ready = "{\ \"jsonrpc\":\"2.0\",\ \"error\":{\"code\":1,\"message\":\"BEEFY RPC endpoint not ready\"},\ \"id\":1\ - }" - .to_string(); + }"; let deadline = std::time::Instant::now() + std::time::Duration::from_secs(2); while std::time::Instant::now() < deadline { let (response, _) = io.raw_json_request(request, 1).await.expect("RPC requests work"); - if response.result != not_ready { - assert_eq!(response.result, expected); + if response != not_ready { + assert_eq!(response, expected); // Success return } @@ -249,7 +247,7 @@ mod tests { .unwrap(); let expected = r#"{"jsonrpc":"2.0","result":false,"id":1}"#; - assert_eq!(response.result, expected); + assert_eq!(response, expected); } fn create_finality_proof() -> BeefyVersionedFinalityProof { diff --git a/substrate/client/consensus/beefy/src/aux_schema.rs b/substrate/client/consensus/beefy/src/aux_schema.rs index 944a00f8372fa8b0643dd4ddff8f8ce684e9f325..534f668ae69c2996064bef086e2958b23f48caf0 100644 --- a/substrate/client/consensus/beefy/src/aux_schema.rs +++ b/substrate/client/consensus/beefy/src/aux_schema.rs @@ -20,7 +20,7 @@ use crate::{error::Error, worker::PersistedState, LOG_TARGET}; use codec::{Decode, Encode}; -use log::{info, trace}; +use log::{debug, trace}; use sc_client_api::{backend::AuxStore, Backend}; use sp_runtime::traits::Block as BlockT; @@ -30,7 +30,7 @@ const WORKER_STATE_KEY: &[u8] = b"beefy_voter_state"; const CURRENT_VERSION: u32 = 4; pub(crate) fn write_current_version(backend: &BE) -> Result<(), Error> { - info!(target: LOG_TARGET, "🥩 write aux schema version {:?}", CURRENT_VERSION); + debug!(target: LOG_TARGET, "🥩 write aux schema version {:?}", CURRENT_VERSION); AuxStore::insert_aux(backend, &[(VERSION_KEY, CURRENT_VERSION.encode().as_slice())], &[]) .map_err(|e| Error::Backend(e.to_string())) } diff --git a/substrate/client/consensus/beefy/src/communication/gossip.rs b/substrate/client/consensus/beefy/src/communication/gossip.rs index 645a10b2a1d43f9bb879a799ac9625b2f623506c..947fe13856f476042858b1a5698aa5333b1d287b 100644 --- a/substrate/client/consensus/beefy/src/communication/gossip.rs +++ b/substrate/client/consensus/beefy/src/communication/gossip.rs @@ -18,21 +18,18 @@ use std::{collections::BTreeSet, sync::Arc, time::Duration}; -use sc_network::{PeerId, ReputationChange}; +use sc_network::{NetworkPeers, ReputationChange}; use sc_network_gossip::{MessageIntent, ValidationResult, Validator, ValidatorContext}; +use sc_network_types::PeerId; use sp_runtime::traits::{Block, Hash, Header, NumberFor}; use codec::{Decode, DecodeAll, Encode}; use log::{debug, trace}; use parking_lot::{Mutex, RwLock}; -use sc_utils::mpsc::{tracing_unbounded, TracingUnboundedReceiver, TracingUnboundedSender}; use wasm_timer::Instant; use crate::{ - communication::{ - benefit, cost, - peers::{KnownPeers, PeerReport}, - }, + communication::{benefit, cost, peers::KnownPeers}, justification::{ proof_block_num_and_set_id, verify_with_validator_set, BeefyVersionedFinalityProof, }, @@ -56,6 +53,8 @@ pub(super) enum Action { Keep(H, ReputationChange), // discard, applying cost/benefit to originator. Discard(ReputationChange), + // ignore, no cost/benefit applied to originator. + DiscardNoReport, } /// An outcome of examining a message. @@ -68,7 +67,7 @@ enum Consider { /// Message is from the future. Reject. RejectFuture, /// Message cannot be evaluated. Reject. - RejectOutOfScope, + CannotEvaluate, } /// BEEFY gossip message type that gets encoded and sent on the network. @@ -168,18 +167,14 @@ impl Filter { .as_ref() .map(|f| // only from current set and only [filter.start, filter.end] - if set_id < f.validator_set.id() { - Consider::RejectPast - } else if set_id > f.validator_set.id() { - Consider::RejectFuture - } else if round < f.start { + if set_id < f.validator_set.id() || round < f.start { Consider::RejectPast - } else if round > f.end { + } else if set_id > f.validator_set.id() || round > f.end { Consider::RejectFuture } else { Consider::Accept }) - .unwrap_or(Consider::RejectOutOfScope) + .unwrap_or(Consider::CannotEvaluate) } /// Return true if `round` is >= than `max(session_start, best_beefy)`, @@ -199,7 +194,7 @@ impl Filter { Consider::Accept } ) - .unwrap_or(Consider::RejectOutOfScope) + .unwrap_or(Consider::CannotEvaluate) } /// Add new _known_ `round` to the set of seen valid justifications. @@ -225,7 +220,7 @@ impl Filter { /// rejected/expired. /// ///All messaging is handled in a single BEEFY global topic. -pub(crate) struct GossipValidator +pub(crate) struct GossipValidator where B: Block, { @@ -234,26 +229,22 @@ where gossip_filter: RwLock>, next_rebroadcast: Mutex, known_peers: Arc>>, - report_sender: TracingUnboundedSender, + network: Arc, } -impl GossipValidator +impl GossipValidator where B: Block, { - pub(crate) fn new( - known_peers: Arc>>, - ) -> (GossipValidator, TracingUnboundedReceiver) { - let (tx, rx) = tracing_unbounded("mpsc_beefy_gossip_validator", 10_000); - let val = GossipValidator { + pub(crate) fn new(known_peers: Arc>>, network: Arc) -> Self { + Self { votes_topic: votes_topic::(), justifs_topic: proofs_topic::(), gossip_filter: RwLock::new(Filter::new()), next_rebroadcast: Mutex::new(Instant::now() + REBROADCAST_AFTER), known_peers, - report_sender: tx, - }; - (val, rx) + network, + } } /// Update gossip validator filter. @@ -267,9 +258,15 @@ where ); self.gossip_filter.write().update(filter); } +} +impl GossipValidator +where + B: Block, + N: NetworkPeers, +{ fn report(&self, who: PeerId, cost_benefit: ReputationChange) { - let _ = self.report_sender.unbounded_send(PeerReport { who, cost_benefit }); + self.network.report_peer(who, cost_benefit); } fn validate_vote( @@ -289,7 +286,9 @@ where match filter.consider_vote(round, set_id) { Consider::RejectPast => return Action::Discard(cost::OUTDATED_MESSAGE), Consider::RejectFuture => return Action::Discard(cost::FUTURE_MESSAGE), - Consider::RejectOutOfScope => return Action::Discard(cost::OUT_OF_SCOPE_MESSAGE), + // When we can't evaluate, it's our fault (e.g. filter not initialized yet), we + // discard the vote without punishing or rewarding the sending peer. + Consider::CannotEvaluate => return Action::DiscardNoReport, Consider::Accept => {}, } @@ -330,7 +329,9 @@ where match guard.consider_finality_proof(round, set_id) { Consider::RejectPast => return Action::Discard(cost::OUTDATED_MESSAGE), Consider::RejectFuture => return Action::Discard(cost::FUTURE_MESSAGE), - Consider::RejectOutOfScope => return Action::Discard(cost::OUT_OF_SCOPE_MESSAGE), + // When we can't evaluate, it's our fault (e.g. filter not initialized yet), we + // discard the proof without punishing or rewarding the sending peer. + Consider::CannotEvaluate => return Action::DiscardNoReport, Consider::Accept => {}, } @@ -357,7 +358,9 @@ where Action::Keep(self.justifs_topic, benefit::VALIDATED_PROOF) } }) - .unwrap_or(Action::Discard(cost::OUT_OF_SCOPE_MESSAGE)) + // When we can't evaluate, it's our fault (e.g. filter not initialized yet), we + // discard the proof without punishing or rewarding the sending peer. + .unwrap_or(Action::DiscardNoReport) }; if matches!(action, Action::Keep(_, _)) { self.gossip_filter.write().mark_round_as_proven(round); @@ -366,9 +369,10 @@ where } } -impl Validator for GossipValidator +impl Validator for GossipValidator where B: Block, + N: NetworkPeers + Send + Sync, { fn peer_disconnected(&self, _context: &mut dyn ValidatorContext, who: &PeerId) { self.known_peers.lock().remove(who); @@ -404,6 +408,7 @@ where self.report(*sender, cb); ValidationResult::Discard }, + Action::DiscardNoReport => ValidationResult::Discard, } } @@ -481,36 +486,133 @@ where #[cfg(test)] pub(crate) mod tests { use super::*; - use crate::keystore::BeefyKeystore; + use crate::{communication::peers::PeerReport, keystore::BeefyKeystore}; use sc_network_test::Block; use sp_application_crypto::key_types::BEEFY as BEEFY_KEY_TYPE; use sp_consensus_beefy::{ - ecdsa_crypto::Signature, known_payloads, Commitment, Keyring, MmrRootHash, Payload, - SignedCommitment, VoteMessage, + ecdsa_crypto::Signature, known_payloads, test_utils::Keyring, Commitment, MmrRootHash, + Payload, SignedCommitment, VoteMessage, }; use sp_keystore::{testing::MemoryKeystore, Keystore}; + pub(crate) struct TestNetwork { + report_sender: futures::channel::mpsc::UnboundedSender, + } + + impl TestNetwork { + pub fn new() -> (Self, futures::channel::mpsc::UnboundedReceiver) { + let (tx, rx) = futures::channel::mpsc::unbounded(); + + (Self { report_sender: tx }, rx) + } + } + + #[async_trait::async_trait] + impl NetworkPeers for TestNetwork { + fn set_authorized_peers(&self, _: std::collections::HashSet) { + unimplemented!() + } + + fn set_authorized_only(&self, _: bool) { + unimplemented!() + } + + fn add_known_address(&self, _: PeerId, _: sc_network::Multiaddr) { + unimplemented!() + } + + fn report_peer(&self, peer_id: PeerId, cost_benefit: ReputationChange) { + let _ = self.report_sender.unbounded_send(PeerReport { who: peer_id, cost_benefit }); + } + + fn peer_reputation(&self, _: &PeerId) -> i32 { + unimplemented!() + } + + fn disconnect_peer(&self, _: PeerId, _: sc_network::ProtocolName) { + unimplemented!() + } + + fn accept_unreserved_peers(&self) { + unimplemented!() + } + + fn deny_unreserved_peers(&self) { + unimplemented!() + } + + fn add_reserved_peer( + &self, + _: sc_network::config::MultiaddrWithPeerId, + ) -> Result<(), String> { + unimplemented!() + } + + fn remove_reserved_peer(&self, _: PeerId) { + unimplemented!() + } + + fn set_reserved_peers( + &self, + _: sc_network::ProtocolName, + _: std::collections::HashSet, + ) -> Result<(), String> { + unimplemented!() + } + + fn add_peers_to_reserved_set( + &self, + _: sc_network::ProtocolName, + _: std::collections::HashSet, + ) -> Result<(), String> { + unimplemented!() + } + + fn remove_peers_from_reserved_set( + &self, + _: sc_network::ProtocolName, + _: Vec, + ) -> Result<(), String> { + unimplemented!() + } + + fn sync_num_connected(&self) -> usize { + unimplemented!() + } + + fn peer_role(&self, _: PeerId, _: Vec) -> Option { + unimplemented!() + } + + async fn reserved_peers(&self) -> Result, ()> { + unimplemented!(); + } + } + struct TestContext; impl ValidatorContext for TestContext { fn broadcast_topic(&mut self, _topic: B::Hash, _force: bool) { - todo!() + unimplemented!() } fn broadcast_message(&mut self, _topic: B::Hash, _message: Vec, _force: bool) {} - fn send_message(&mut self, _who: &sc_network::PeerId, _message: Vec) { - todo!() + fn send_message(&mut self, _who: &sc_network_types::PeerId, _message: Vec) { + unimplemented!() } - fn send_topic(&mut self, _who: &sc_network::PeerId, _topic: B::Hash, _force: bool) { - todo!() + fn send_topic(&mut self, _who: &sc_network_types::PeerId, _topic: B::Hash, _force: bool) { + unimplemented!() } } - pub fn sign_commitment(who: &Keyring, commitment: &Commitment) -> Signature { + pub fn sign_commitment( + who: &Keyring, + commitment: &Commitment, + ) -> Signature { let store = MemoryKeystore::new(); store.ecdsa_generate_new(BEEFY_KEY_TYPE, Some(&who.to_seed())).unwrap(); - let beefy_keystore: BeefyKeystore = Some(store.into()).into(); + let beefy_keystore: BeefyKeystore = Some(store.into()).into(); beefy_keystore.sign(&who.public(), &commitment.encode()).unwrap() } @@ -538,7 +640,10 @@ pub(crate) mod tests { .validators() .iter() .map(|validator: &AuthorityId| { - Some(sign_commitment(&Keyring::from_public(validator).unwrap(), &commitment)) + Some(sign_commitment( + &Keyring::::from_public(validator).unwrap(), + &commitment, + )) }) .collect(); @@ -547,10 +652,15 @@ pub(crate) mod tests { #[test] fn should_validate_messages() { - let keys = vec![Keyring::Alice.public()]; + let keys = vec![Keyring::::Alice.public()]; let validator_set = ValidatorSet::::new(keys.clone(), 0).unwrap(); - let (gv, mut report_stream) = - GossipValidator::::new(Arc::new(Mutex::new(KnownPeers::new()))); + + let (network, mut report_stream) = TestNetwork::new(); + + let gv = GossipValidator::::new( + Arc::new(Mutex::new(KnownPeers::new())), + Arc::new(network), + ); let sender = PeerId::random(); let mut context = TestContext; @@ -563,7 +673,7 @@ pub(crate) mod tests { let mut expected_report = PeerReport { who: sender, cost_benefit: expected_cost }; let res = gv.validate(&mut context, &sender, bad_encoding); assert!(matches!(res, ValidationResult::Discard)); - assert_eq!(report_stream.try_recv().unwrap(), expected_report); + assert_eq!(report_stream.try_next().unwrap().unwrap(), expected_report); // verify votes validation @@ -573,15 +683,15 @@ pub(crate) mod tests { // filter not initialized let res = gv.validate(&mut context, &sender, &encoded); assert!(matches!(res, ValidationResult::Discard)); - expected_report.cost_benefit = cost::OUT_OF_SCOPE_MESSAGE; - assert_eq!(report_stream.try_recv().unwrap(), expected_report); + // nothing reported + assert!(report_stream.try_next().is_err()); gv.update_filter(GossipFilterCfg { start: 0, end: 10, validator_set: &validator_set }); // nothing in cache first time let res = gv.validate(&mut context, &sender, &encoded); assert!(matches!(res, ValidationResult::ProcessAndKeep(_))); expected_report.cost_benefit = benefit::VOTE_MESSAGE; - assert_eq!(report_stream.try_recv().unwrap(), expected_report); + assert_eq!(report_stream.try_next().unwrap().unwrap(), expected_report); // reject vote, voter not in validator set let mut bad_vote = vote.clone(); @@ -590,7 +700,7 @@ pub(crate) mod tests { let res = gv.validate(&mut context, &sender, &bad_vote); assert!(matches!(res, ValidationResult::Discard)); expected_report.cost_benefit = cost::UNKNOWN_VOTER; - assert_eq!(report_stream.try_recv().unwrap(), expected_report); + assert_eq!(report_stream.try_next().unwrap().unwrap(), expected_report); // reject if the round is not GRANDPA finalized gv.update_filter(GossipFilterCfg { start: 1, end: 2, validator_set: &validator_set }); @@ -600,7 +710,7 @@ pub(crate) mod tests { let res = gv.validate(&mut context, &sender, &encoded); assert!(matches!(res, ValidationResult::Discard)); expected_report.cost_benefit = cost::FUTURE_MESSAGE; - assert_eq!(report_stream.try_recv().unwrap(), expected_report); + assert_eq!(report_stream.try_next().unwrap().unwrap(), expected_report); // reject if the round is not live anymore gv.update_filter(GossipFilterCfg { start: 7, end: 10, validator_set: &validator_set }); @@ -610,7 +720,7 @@ pub(crate) mod tests { let res = gv.validate(&mut context, &sender, &encoded); assert!(matches!(res, ValidationResult::Discard)); expected_report.cost_benefit = cost::OUTDATED_MESSAGE; - assert_eq!(report_stream.try_recv().unwrap(), expected_report); + assert_eq!(report_stream.try_next().unwrap().unwrap(), expected_report); // now verify proofs validation @@ -620,7 +730,7 @@ pub(crate) mod tests { let res = gv.validate(&mut context, &sender, &encoded_proof); assert!(matches!(res, ValidationResult::Discard)); expected_report.cost_benefit = cost::OUTDATED_MESSAGE; - assert_eq!(report_stream.try_recv().unwrap(), expected_report); + assert_eq!(report_stream.try_next().unwrap().unwrap(), expected_report); // accept next proof with good set_id let proof = dummy_proof(7, &validator_set); @@ -628,7 +738,7 @@ pub(crate) mod tests { let res = gv.validate(&mut context, &sender, &encoded_proof); assert!(matches!(res, ValidationResult::ProcessAndKeep(_))); expected_report.cost_benefit = benefit::VALIDATED_PROOF; - assert_eq!(report_stream.try_recv().unwrap(), expected_report); + assert_eq!(report_stream.try_next().unwrap().unwrap(), expected_report); // accept future proof with good set_id let proof = dummy_proof(20, &validator_set); @@ -636,7 +746,7 @@ pub(crate) mod tests { let res = gv.validate(&mut context, &sender, &encoded_proof); assert!(matches!(res, ValidationResult::ProcessAndKeep(_))); expected_report.cost_benefit = benefit::VALIDATED_PROOF; - assert_eq!(report_stream.try_recv().unwrap(), expected_report); + assert_eq!(report_stream.try_next().unwrap().unwrap(), expected_report); // reject proof, future set_id let bad_validator_set = ValidatorSet::::new(keys, 1).unwrap(); @@ -645,7 +755,7 @@ pub(crate) mod tests { let res = gv.validate(&mut context, &sender, &encoded_proof); assert!(matches!(res, ValidationResult::Discard)); expected_report.cost_benefit = cost::FUTURE_MESSAGE; - assert_eq!(report_stream.try_recv().unwrap(), expected_report); + assert_eq!(report_stream.try_next().unwrap().unwrap(), expected_report); // reject proof, bad signatures (Bob instead of Alice) let bad_validator_set = @@ -656,16 +766,19 @@ pub(crate) mod tests { assert!(matches!(res, ValidationResult::Discard)); expected_report.cost_benefit = cost::INVALID_PROOF; expected_report.cost_benefit.value += cost::PER_SIGNATURE_CHECKED; - assert_eq!(report_stream.try_recv().unwrap(), expected_report); + assert_eq!(report_stream.try_next().unwrap().unwrap(), expected_report); } #[test] fn messages_allowed_and_expired() { let keys = vec![Keyring::Alice.public()]; let validator_set = ValidatorSet::::new(keys.clone(), 0).unwrap(); - let (gv, _) = GossipValidator::::new(Arc::new(Mutex::new(KnownPeers::new()))); + let gv = GossipValidator::::new( + Arc::new(Mutex::new(KnownPeers::new())), + Arc::new(TestNetwork::new().0), + ); gv.update_filter(GossipFilterCfg { start: 0, end: 10, validator_set: &validator_set }); - let sender = sc_network::PeerId::random(); + let sender = sc_network_types::PeerId::random(); let topic = Default::default(); let intent = MessageIntent::Broadcast; @@ -740,9 +853,12 @@ pub(crate) mod tests { fn messages_rebroadcast() { let keys = vec![Keyring::Alice.public()]; let validator_set = ValidatorSet::::new(keys.clone(), 0).unwrap(); - let (gv, _) = GossipValidator::::new(Arc::new(Mutex::new(KnownPeers::new()))); + let gv = GossipValidator::::new( + Arc::new(Mutex::new(KnownPeers::new())), + Arc::new(TestNetwork::new().0), + ); gv.update_filter(GossipFilterCfg { start: 0, end: 10, validator_set: &validator_set }); - let sender = sc_network::PeerId::random(); + let sender = sc_network_types::PeerId::random(); let topic = Default::default(); let vote = dummy_vote(1); diff --git a/substrate/client/consensus/beefy/src/communication/mod.rs b/substrate/client/consensus/beefy/src/communication/mod.rs index 3827559057dde856d201ebb9c9ff71a1d7d11f47..3c93368be3635a9f2b1fb7b03253ae66e1af1b39 100644 --- a/substrate/client/consensus/beefy/src/communication/mod.rs +++ b/substrate/client/consensus/beefy/src/communication/mod.rs @@ -65,17 +65,28 @@ pub(crate) mod beefy_protocol_name { /// Returns the configuration value to put in /// [`sc_network::config::FullNetworkConfiguration`]. /// For standard protocol name see [`beefy_protocol_name::gossip_protocol_name`]. -pub fn beefy_peers_set_config( +pub fn beefy_peers_set_config< + B: sp_runtime::traits::Block, + N: sc_network::NetworkBackend::Hash>, +>( gossip_protocol_name: sc_network::ProtocolName, -) -> (sc_network::config::NonDefaultSetConfig, Box) { - let (mut cfg, notification_service) = sc_network::config::NonDefaultSetConfig::new( + metrics: sc_network::service::NotificationMetrics, + peer_store_handle: std::sync::Arc, +) -> (N::NotificationProtocolConfig, Box) { + let (cfg, notification_service) = N::notification_config( gossip_protocol_name, Vec::new(), 1024 * 1024, None, - Default::default(), + sc_network::config::SetConfig { + in_peers: 25, + out_peers: 25, + reserved_nodes: Vec::new(), + non_reserved_mode: sc_network::config::NonReservedPeerMode::Accept, + }, + metrics, + peer_store_handle, ); - cfg.allow_non_reserved(25, 25); (cfg, notification_service) } @@ -90,8 +101,6 @@ mod cost { pub(super) const BAD_SIGNATURE: Rep = Rep::new(-100, "BEEFY: Bad signature"); // Message received with vote from voter not in validator set. pub(super) const UNKNOWN_VOTER: Rep = Rep::new(-150, "BEEFY: Unknown voter"); - // A message received that cannot be evaluated relative to our current state. - pub(super) const OUT_OF_SCOPE_MESSAGE: Rep = Rep::new(-500, "BEEFY: Out-of-scope message"); // Message containing invalid proof. pub(super) const INVALID_PROOF: Rep = Rep::new(-5000, "BEEFY: Invalid commit"); // Reputation cost per signature checked for invalid proof. @@ -101,7 +110,7 @@ mod cost { // On-demand request was refused by peer. pub(super) const REFUSAL_RESPONSE: Rep = Rep::new(-100, "BEEFY: Proof request refused"); // On-demand request for a proof that can't be found in the backend. - pub(super) const UNKOWN_PROOF_REQUEST: Rep = Rep::new(-150, "BEEFY: Unknown proof request"); + pub(super) const UNKNOWN_PROOF_REQUEST: Rep = Rep::new(-150, "BEEFY: Unknown proof request"); } // benefit scalars for reporting peers. diff --git a/substrate/client/consensus/beefy/src/communication/peers.rs b/substrate/client/consensus/beefy/src/communication/peers.rs index 8f2d5cc90a1d927b21cb0a0b6de8efee5a0d3a59..2d801aceaa8a76bf1c31820493bbd20b4f93f8da 100644 --- a/substrate/client/consensus/beefy/src/communication/peers.rs +++ b/substrate/client/consensus/beefy/src/communication/peers.rs @@ -18,7 +18,8 @@ //! Logic for keeping track of BEEFY peers. -use sc_network::{PeerId, ReputationChange}; +use sc_network::ReputationChange; +use sc_network_types::PeerId; use sp_runtime::traits::{Block, NumberFor, Zero}; use std::collections::{HashMap, VecDeque}; diff --git a/substrate/client/consensus/beefy/src/communication/request_response/incoming_requests_handler.rs b/substrate/client/consensus/beefy/src/communication/request_response/incoming_requests_handler.rs index d856e9748a101b4ad71a39957579c41c0c75aaf4..7893066a01e06c967893bdedbd25ad3c2da9c3bd 100644 --- a/substrate/client/consensus/beefy/src/communication/request_response/incoming_requests_handler.rs +++ b/substrate/client/consensus/beefy/src/communication/request_response/incoming_requests_handler.rs @@ -21,9 +21,10 @@ use futures::{channel::oneshot, StreamExt}; use log::{debug, trace}; use sc_client_api::BlockBackend; use sc_network::{ - config as netconfig, config::RequestResponseConfig, types::ProtocolName, PeerId, - ReputationChange, + config as netconfig, service::traits::RequestResponseConfig, types::ProtocolName, + NetworkBackend, ReputationChange, }; +use sc_network_types::PeerId; use sp_consensus_beefy::BEEFY_ENGINE_ID; use sp_runtime::traits::Block; use std::{marker::PhantomData, sync::Arc}; @@ -139,15 +140,15 @@ where Client: BlockBackend + Send + Sync, { /// Create a new [`BeefyJustifsRequestHandler`]. - pub fn new>( + pub fn new, Network: NetworkBackend::Hash>>( genesis_hash: Hash, fork_id: Option<&str>, client: Arc, prometheus_registry: Option, - ) -> (Self, RequestResponseConfig) { - let (request_receiver, config) = - on_demand_justifications_protocol_config(genesis_hash, fork_id); - let justif_protocol_name = config.name.clone(); + ) -> (Self, Network::RequestResponseProtocolConfig) { + let (request_receiver, config): (_, Network::RequestResponseProtocolConfig) = + on_demand_justifications_protocol_config::<_, _, Network>(genesis_hash, fork_id); + let justif_protocol_name = config.protocol_name().clone(); let metrics = register_metrics(prometheus_registry); ( Self { request_receiver, justif_protocol_name, client, metrics, _block: PhantomData }, @@ -170,7 +171,7 @@ where .flatten() .and_then(|hash| self.client.justifications(hash).ok().flatten()) .and_then(|justifs| justifs.get(BEEFY_ENGINE_ID).cloned()) - .ok_or_else(|| reputation_changes.push(cost::UNKOWN_PROOF_REQUEST)); + .ok_or_else(|| reputation_changes.push(cost::UNKNOWN_PROOF_REQUEST)); request .pending_response .send(netconfig::OutgoingResponse { diff --git a/substrate/client/consensus/beefy/src/communication/request_response/mod.rs b/substrate/client/consensus/beefy/src/communication/request_response/mod.rs index 4bad3b061c8e9e67d61685e8f59f24bf983faa83..3777d47719c57e65b664e37e612bbaa794effbf0 100644 --- a/substrate/client/consensus/beefy/src/communication/request_response/mod.rs +++ b/substrate/client/consensus/beefy/src/communication/request_response/mod.rs @@ -26,7 +26,8 @@ pub use incoming_requests_handler::BeefyJustifsRequestHandler; use std::time::Duration; use codec::{Decode, Encode, Error as CodecError}; -use sc_network::{config::RequestResponseConfig, PeerId}; +use sc_network::NetworkBackend; +use sc_network_types::PeerId; use sp_runtime::traits::{Block, NumberFor}; use crate::communication::{beefy_protocol_name::justifications_protocol_name, peers::PeerReport}; @@ -47,23 +48,27 @@ const BEEFY_SYNC_LOG_TARGET: &str = "beefy::sync"; /// `ProtocolConfig`. /// /// Consider using [`BeefyJustifsRequestHandler`] instead of this low-level function. -pub(crate) fn on_demand_justifications_protocol_config>( +pub(crate) fn on_demand_justifications_protocol_config< + Hash: AsRef<[u8]>, + B: Block, + Network: NetworkBackend::Hash>, +>( genesis_hash: Hash, fork_id: Option<&str>, -) -> (IncomingRequestReceiver, RequestResponseConfig) { +) -> (IncomingRequestReceiver, Network::RequestResponseProtocolConfig) { let name = justifications_protocol_name(genesis_hash, fork_id); let fallback_names = vec![]; let (tx, rx) = async_channel::bounded(JUSTIF_CHANNEL_SIZE); let rx = IncomingRequestReceiver::new(rx); - let cfg = RequestResponseConfig { + let cfg = Network::request_response_config( name, fallback_names, - max_request_size: 32, - max_response_size: MAX_RESPONSE_SIZE, + 32, + MAX_RESPONSE_SIZE, // We are connected to all validators: - request_timeout: JUSTIF_REQUEST_TIMEOUT, - inbound_queue: Some(tx), - }; + JUSTIF_REQUEST_TIMEOUT, + Some(tx), + ); (rx, cfg) } diff --git a/substrate/client/consensus/beefy/src/communication/request_response/outgoing_requests_engine.rs b/substrate/client/consensus/beefy/src/communication/request_response/outgoing_requests_engine.rs index 992b9fa08c093cfbb6bc65e83915997253c6c1dd..2ab072960900817155b42434f69f29236fcda54b 100644 --- a/substrate/client/consensus/beefy/src/communication/request_response/outgoing_requests_engine.rs +++ b/substrate/client/consensus/beefy/src/communication/request_response/outgoing_requests_engine.rs @@ -24,8 +24,9 @@ use log::{debug, warn}; use parking_lot::Mutex; use sc_network::{ request_responses::{IfDisconnected, RequestFailure}, - NetworkRequest, PeerId, ProtocolName, + NetworkRequest, ProtocolName, }; +use sc_network_types::PeerId; use sp_consensus_beefy::{ecdsa_crypto::AuthorityId, ValidatorSet}; use sp_runtime::traits::{Block, NumberFor}; use std::{collections::VecDeque, result::Result, sync::Arc}; diff --git a/substrate/client/consensus/beefy/src/import.rs b/substrate/client/consensus/beefy/src/import.rs index fc19ecc301422d74d5da5a289ed641810b1022f1..ed8ed68c4e8d0d378728ba87d1ffe726f6c4c11a 100644 --- a/substrate/client/consensus/beefy/src/import.rs +++ b/substrate/client/consensus/beefy/src/import.rs @@ -159,7 +159,7 @@ where // The proof is valid and the block is imported and final, we can import. debug!( target: LOG_TARGET, - "🥩 import justif {:?} for block number {:?}.", proof, number + "🥩 import justif {} for block number {:?}.", proof, number ); // Send the justification to the BEEFY voter for processing. self.justification_sender diff --git a/substrate/client/consensus/beefy/src/justification.rs b/substrate/client/consensus/beefy/src/justification.rs index 483184e2374a2b9239554e4ce2709cd7a294cb8c..7f1b9e5237c3970eb8cba4936debd18c77117288 100644 --- a/substrate/client/consensus/beefy/src/justification.rs +++ b/substrate/client/consensus/beefy/src/justification.rs @@ -76,7 +76,7 @@ pub(crate) fn verify_with_validator_set( .as_ref() .map(|sig| { signatures_checked += 1; - BeefyKeystore::verify(id, sig, &message[..]) + BeefyKeystore::verify(*id, sig, &message[..]) }) .unwrap_or(false) }) @@ -93,7 +93,8 @@ pub(crate) fn verify_with_validator_set( #[cfg(test)] pub(crate) mod tests { use sp_consensus_beefy::{ - known_payloads, Commitment, Keyring, Payload, SignedCommitment, VersionedFinalityProof, + known_payloads, test_utils::Keyring, Commitment, Payload, SignedCommitment, + VersionedFinalityProof, }; use substrate_test_runtime_client::runtime::Block; @@ -103,7 +104,7 @@ pub(crate) mod tests { pub(crate) fn new_finality_proof( block_num: NumberFor, validator_set: &ValidatorSet, - keys: &[Keyring], + keys: &[Keyring], ) -> BeefyVersionedFinalityProof { let commitment = Commitment { payload: Payload::from_single_entry(known_payloads::MMR_ROOT_ID, vec![]), @@ -174,7 +175,7 @@ pub(crate) mod tests { }; // change a signature to a different key *bad_signed_commitment.signatures.first_mut().unwrap() = - Some(Keyring::Dave.sign(&bad_signed_commitment.commitment.encode())); + Some(Keyring::::Dave.sign(&bad_signed_commitment.commitment.encode())); match verify_with_validator_set::(block_num, &validator_set, &bad_proof.into()) { Err((ConsensusError::InvalidJustification, 3)) => (), e => assert!(false, "Got unexpected {:?}", e), diff --git a/substrate/client/consensus/beefy/src/keystore.rs b/substrate/client/consensus/beefy/src/keystore.rs index 75c44de3324cee7b4f0cc4a08335640708952157..9582c2661c30b431a5934e2bcc592b4a56faf3b3 100644 --- a/substrate/client/consensus/beefy/src/keystore.rs +++ b/substrate/client/consensus/beefy/src/keystore.rs @@ -16,41 +16,45 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -use sp_application_crypto::{key_types::BEEFY as BEEFY_KEY_TYPE, RuntimeAppPublic}; +use sp_application_crypto::{key_types::BEEFY as BEEFY_KEY_TYPE, AppCrypto, RuntimeAppPublic}; +use sp_consensus_beefy::{AuthorityIdBound, BeefyAuthorityId, BeefySignatureHasher}; +use sp_core::ecdsa; +#[cfg(feature = "bls-experimental")] +use sp_core::ecdsa_bls377; use sp_crypto_hashing::keccak_256; use sp_keystore::KeystorePtr; +use codec::Decode; use log::warn; - -use sp_consensus_beefy::{ - ecdsa_crypto::{Public, Signature}, - BeefyAuthorityId, -}; +use std::marker::PhantomData; use crate::{error, LOG_TARGET}; -/// Hasher used for BEEFY signatures. -pub(crate) type BeefySignatureHasher = sp_runtime::traits::Keccak256; - /// A BEEFY specific keystore implemented as a `Newtype`. This is basically a /// wrapper around [`sp_keystore::Keystore`] and allows to customize /// common cryptographic functionality. -pub(crate) struct BeefyKeystore(Option); +pub(crate) struct BeefyKeystore( + Option, + PhantomData AuthorityId>, +); -impl BeefyKeystore { +impl BeefyKeystore { /// Check if the keystore contains a private key for one of the public keys /// contained in `keys`. A public key with a matching private key is known /// as a local authority id. /// /// Return the public key for which we also do have a private key. If no /// matching private key is found, `None` will be returned. - pub fn authority_id(&self, keys: &[Public]) -> Option { + pub fn authority_id(&self, keys: &[AuthorityId]) -> Option { let store = self.0.clone()?; // we do check for multiple private keys as a key store sanity check. - let public: Vec = keys + let public: Vec = keys .iter() - .filter(|k| store.has_keys(&[(k.to_raw_vec(), BEEFY_KEY_TYPE)])) + .filter(|k| { + store + .has_keys(&[(::to_raw_vec(k), BEEFY_KEY_TYPE)]) + }) .cloned() .collect(); @@ -71,55 +75,125 @@ impl BeefyKeystore { /// Note that `message` usually will be pre-hashed before being signed. /// /// Return the message signature or an error in case of failure. - pub fn sign(&self, public: &Public, message: &[u8]) -> Result { + pub fn sign( + &self, + public: &AuthorityId, + message: &[u8], + ) -> Result<::Signature, error::Error> { let store = self.0.clone().ok_or_else(|| error::Error::Keystore("no Keystore".into()))?; - let msg = keccak_256(message); - let public = public.as_ref(); - - let sig = store - .ecdsa_sign_prehashed(BEEFY_KEY_TYPE, public, &msg) - .map_err(|e| error::Error::Keystore(e.to_string()))? - .ok_or_else(|| error::Error::Signature("ecdsa_sign_prehashed() failed".to_string()))?; - - // check that `sig` has the expected result type - let sig = sig.clone().try_into().map_err(|_| { - error::Error::Signature(format!("invalid signature {:?} for key {:?}", sig, public)) + // ECDSA should use ecdsa_sign_prehashed since it needs to be hashed by keccak_256 instead + // of blake2. As such we need to deal with producing the signatures case-by-case + let signature_byte_array: Vec = match ::CRYPTO_ID { + ecdsa::CRYPTO_ID => { + let msg_hash = keccak_256(message); + let public: ecdsa::Public = ecdsa::Public::try_from(public.as_slice()).unwrap(); + + let sig = store + .ecdsa_sign_prehashed(BEEFY_KEY_TYPE, &public, &msg_hash) + .map_err(|e| error::Error::Keystore(e.to_string()))? + .ok_or_else(|| { + error::Error::Signature("ecdsa_sign_prehashed() failed".to_string()) + })?; + let sig_ref: &[u8] = sig.as_ref(); + sig_ref.to_vec() + }, + + #[cfg(feature = "bls-experimental")] + ecdsa_bls377::CRYPTO_ID => { + let public: ecdsa_bls377::Public = + ecdsa_bls377::Public::try_from(public.as_slice()).unwrap(); + let sig = store + .ecdsa_bls377_sign_with_keccak256(BEEFY_KEY_TYPE, &public, &message) + .map_err(|e| error::Error::Keystore(e.to_string()))? + .ok_or_else(|| error::Error::Signature("bls377_sign() failed".to_string()))?; + let sig_ref: &[u8] = sig.as_ref(); + sig_ref.to_vec() + }, + + _ => Err(error::Error::Keystore("key type is not supported by BEEFY Keystore".into()))?, + }; + + //check that `sig` has the expected result type + let signature = ::Signature::decode( + &mut signature_byte_array.as_slice(), + ) + .map_err(|_| { + error::Error::Signature(format!( + "invalid signature {:?} for key {:?}", + signature_byte_array, public + )) })?; - Ok(sig) + Ok(signature) } /// Returns a vector of [`sp_consensus_beefy::crypto::Public`] keys which are currently /// supported (i.e. found in the keystore). - pub fn public_keys(&self) -> Result, error::Error> { + pub fn public_keys(&self) -> Result, error::Error> { let store = self.0.clone().ok_or_else(|| error::Error::Keystore("no Keystore".into()))?; - let pk: Vec = - store.ecdsa_public_keys(BEEFY_KEY_TYPE).drain(..).map(Public::from).collect(); - - Ok(pk) + let pk = match ::CRYPTO_ID { + ecdsa::CRYPTO_ID => store + .ecdsa_public_keys(BEEFY_KEY_TYPE) + .drain(..) + .map(|pk| AuthorityId::try_from(pk.as_ref())) + .collect::, _>>() + .or_else(|_| { + Err(error::Error::Keystore( + "unable to convert public key into authority id".into(), + )) + }), + + #[cfg(feature = "bls-experimental")] + ecdsa_bls377::CRYPTO_ID => store + .ecdsa_bls377_public_keys(BEEFY_KEY_TYPE) + .drain(..) + .map(|pk| AuthorityId::try_from(pk.as_ref())) + .collect::, _>>() + .or_else(|_| { + Err(error::Error::Keystore( + "unable to convert public key into authority id".into(), + )) + }), + + _ => Err(error::Error::Keystore("key type is not supported by BEEFY Keystore".into())), + }; + + pk } /// Use the `public` key to verify that `sig` is a valid signature for `message`. /// /// Return `true` if the signature is authentic, `false` otherwise. - pub fn verify(public: &Public, sig: &Signature, message: &[u8]) -> bool { + pub fn verify( + public: &AuthorityId, + sig: &::Signature, + message: &[u8], + ) -> bool { BeefyAuthorityId::::verify(public, sig, message) } } -impl From> for BeefyKeystore { - fn from(store: Option) -> BeefyKeystore { - BeefyKeystore(store) +impl From> for BeefyKeystore +where + ::Signature: Send + Sync, +{ + fn from(store: Option) -> BeefyKeystore { + BeefyKeystore(store, PhantomData) } } #[cfg(test)] pub mod tests { - use sp_consensus_beefy::{ecdsa_crypto, Keyring}; - use sp_core::{ecdsa, Pair}; - use sp_keystore::testing::MemoryKeystore; + #[cfg(feature = "bls-experimental")] + use sp_consensus_beefy::ecdsa_bls_crypto; + use sp_consensus_beefy::{ + ecdsa_crypto, + test_utils::{BeefySignerAuthority, Keyring}, + }; + use sp_core::Pair as PairT; + use sp_keystore::{testing::MemoryKeystore, Keystore}; use super::*; use crate::error::Error; @@ -128,175 +202,292 @@ pub mod tests { MemoryKeystore::new().into() } - #[test] - fn verify_should_work() { - let msg = keccak_256(b"I am Alice!"); - let sig = Keyring::Alice.sign(b"I am Alice!"); - - assert!(ecdsa::Pair::verify_prehashed( - &sig.clone().into(), - &msg, - &Keyring::Alice.public().into(), + fn pair_verify_should_work< + AuthorityId: AuthorityIdBound + From<<::Pair as AppCrypto>::Public>, + >() + where + ::Signature: + Send + Sync + From<<::Pair as AppCrypto>::Signature>, + ::Pair: BeefySignerAuthority, + { + let msg = b"I am Alice!"; + let sig = Keyring::::Alice.sign(b"I am Alice!"); + + assert!(>::verify( + &Keyring::Alice.public(), + &sig, + &msg.as_slice(), )); // different public key -> fail - assert!(!ecdsa::Pair::verify_prehashed( - &sig.clone().into(), - &msg, - &Keyring::Bob.public().into(), + assert!(!>::verify( + &Keyring::Bob.public(), + &sig, + &msg.as_slice(), )); - let msg = keccak_256(b"I am not Alice!"); + let msg = b"I am not Alice!"; // different msg -> fail - assert!( - !ecdsa::Pair::verify_prehashed(&sig.into(), &msg, &Keyring::Alice.public().into(),) - ); + assert!(!>::verify( + &Keyring::Alice.public(), + &sig, + &msg.as_slice(), + )); + } + + /// Generate key pair in the given store using the provided seed + fn generate_in_store( + store: KeystorePtr, + key_type: sp_application_crypto::KeyTypeId, + owner: Option>, + ) -> AuthorityId + where + AuthorityId: + AuthorityIdBound + From<<::Pair as AppCrypto>::Public>, + ::Pair: BeefySignerAuthority, + ::Signature: + Send + Sync + From<<::Pair as AppCrypto>::Signature>, + { + let optional_seed: Option = owner.map(|owner| owner.to_seed()); + + match ::CRYPTO_ID { + ecdsa::CRYPTO_ID => { + let pk = store.ecdsa_generate_new(key_type, optional_seed.as_deref()).ok().unwrap(); + AuthorityId::decode(&mut pk.as_ref()).unwrap() + }, + #[cfg(feature = "bls-experimental")] + ecdsa_bls377::CRYPTO_ID => { + let pk = store + .ecdsa_bls377_generate_new(key_type, optional_seed.as_deref()) + .ok() + .unwrap(); + AuthorityId::decode(&mut pk.as_ref()).unwrap() + }, + _ => panic!("Requested CRYPTO_ID is not supported by the BEEFY Keyring"), + } } #[test] - fn pair_works() { - let want = ecdsa_crypto::Pair::from_string("//Alice", None) + fn pair_verify_should_work_ecdsa() { + pair_verify_should_work::(); + } + + #[cfg(feature = "bls-experimental")] + #[test] + fn pair_verify_should_work_ecdsa_n_bls() { + pair_verify_should_work::(); + } + + fn pair_works< + AuthorityId: AuthorityIdBound + From<<::Pair as AppCrypto>::Public>, + >() + where + ::Signature: + Send + Sync + From<<::Pair as AppCrypto>::Signature>, + ::Pair: BeefySignerAuthority, + { + let want = ::Pair::from_string("//Alice", None) .expect("Pair failed") .to_raw_vec(); - let got = Keyring::Alice.pair().to_raw_vec(); + let got = Keyring::::Alice.pair().to_raw_vec(); assert_eq!(want, got); - let want = ecdsa_crypto::Pair::from_string("//Bob", None) + let want = ::Pair::from_string("//Bob", None) .expect("Pair failed") .to_raw_vec(); - let got = Keyring::Bob.pair().to_raw_vec(); + let got = Keyring::::Bob.pair().to_raw_vec(); assert_eq!(want, got); - let want = ecdsa_crypto::Pair::from_string("//Charlie", None) + let want = ::Pair::from_string("//Charlie", None) .expect("Pair failed") .to_raw_vec(); - let got = Keyring::Charlie.pair().to_raw_vec(); + let got = Keyring::::Charlie.pair().to_raw_vec(); assert_eq!(want, got); - let want = ecdsa_crypto::Pair::from_string("//Dave", None) + let want = ::Pair::from_string("//Dave", None) .expect("Pair failed") .to_raw_vec(); - let got = Keyring::Dave.pair().to_raw_vec(); + let got = Keyring::::Dave.pair().to_raw_vec(); assert_eq!(want, got); - let want = ecdsa_crypto::Pair::from_string("//Eve", None) + let want = ::Pair::from_string("//Eve", None) .expect("Pair failed") .to_raw_vec(); - let got = Keyring::Eve.pair().to_raw_vec(); + let got = Keyring::::Eve.pair().to_raw_vec(); assert_eq!(want, got); - let want = ecdsa_crypto::Pair::from_string("//Ferdie", None) + let want = ::Pair::from_string("//Ferdie", None) .expect("Pair failed") .to_raw_vec(); - let got = Keyring::Ferdie.pair().to_raw_vec(); + let got = Keyring::::Ferdie.pair().to_raw_vec(); assert_eq!(want, got); - let want = ecdsa_crypto::Pair::from_string("//One", None) + let want = ::Pair::from_string("//One", None) .expect("Pair failed") .to_raw_vec(); - let got = Keyring::One.pair().to_raw_vec(); + let got = Keyring::::One.pair().to_raw_vec(); assert_eq!(want, got); - let want = ecdsa_crypto::Pair::from_string("//Two", None) + let want = ::Pair::from_string("//Two", None) .expect("Pair failed") .to_raw_vec(); - let got = Keyring::Two.pair().to_raw_vec(); + let got = Keyring::::Two.pair().to_raw_vec(); assert_eq!(want, got); } #[test] - fn authority_id_works() { + fn ecdsa_pair_works() { + pair_works::(); + } + + #[cfg(feature = "bls-experimental")] + #[test] + fn ecdsa_n_bls_pair_works() { + pair_works::(); + } + + fn authority_id_works< + AuthorityId: AuthorityIdBound + From<<::Pair as AppCrypto>::Public>, + >() + where + ::Signature: + Send + Sync + From<<::Pair as AppCrypto>::Signature>, + ::Pair: BeefySignerAuthority, + { let store = keystore(); - let alice: ecdsa_crypto::Public = store - .ecdsa_generate_new(BEEFY_KEY_TYPE, Some(&Keyring::Alice.to_seed())) - .ok() - .unwrap() - .into(); + generate_in_store::(store.clone(), BEEFY_KEY_TYPE, Some(Keyring::Alice)); + + let alice = Keyring::::Alice.public(); let bob = Keyring::Bob.public(); let charlie = Keyring::Charlie.public(); - let store: BeefyKeystore = Some(store).into(); + let beefy_store: BeefyKeystore = Some(store).into(); let mut keys = vec![bob, charlie]; - let id = store.authority_id(keys.as_slice()); + let id = beefy_store.authority_id(keys.as_slice()); assert!(id.is_none()); keys.push(alice.clone()); - let id = store.authority_id(keys.as_slice()).unwrap(); + let id = beefy_store.authority_id(keys.as_slice()).unwrap(); assert_eq!(id, alice); } #[test] - fn sign_works() { + fn authority_id_works_for_ecdsa() { + authority_id_works::(); + } + + #[cfg(feature = "bls-experimental")] + #[test] + fn authority_id_works_for_ecdsa_n_bls() { + authority_id_works::(); + } + + fn sign_works< + AuthorityId: AuthorityIdBound + From<<::Pair as AppCrypto>::Public>, + >() + where + ::Signature: + Send + Sync + From<<::Pair as AppCrypto>::Signature>, + ::Pair: BeefySignerAuthority, + { let store = keystore(); - let alice: ecdsa_crypto::Public = store - .ecdsa_generate_new(BEEFY_KEY_TYPE, Some(&Keyring::Alice.to_seed())) - .ok() - .unwrap() - .into(); + generate_in_store::(store.clone(), BEEFY_KEY_TYPE, Some(Keyring::Alice)); - let store: BeefyKeystore = Some(store).into(); + let alice = Keyring::Alice.public(); - let msg = b"are you involved or commited?"; + let store: BeefyKeystore = Some(store).into(); + + let msg = b"are you involved or committed?"; let sig1 = store.sign(&alice, msg).unwrap(); - let sig2 = Keyring::Alice.sign(msg); + let sig2 = Keyring::::Alice.sign(msg); assert_eq!(sig1, sig2); } #[test] - fn sign_error() { + fn sign_works_for_ecdsa() { + sign_works::(); + } + + #[cfg(feature = "bls-experimental")] + #[test] + fn sign_works_for_ecdsa_n_bls() { + sign_works::(); + } + + fn sign_error< + AuthorityId: AuthorityIdBound + From<<::Pair as AppCrypto>::Public>, + >( + expected_error_message: &str, + ) where + ::Signature: + Send + Sync + From<<::Pair as AppCrypto>::Signature>, + ::Pair: BeefySignerAuthority, + { let store = keystore(); - store - .ecdsa_generate_new(BEEFY_KEY_TYPE, Some(&Keyring::Bob.to_seed())) - .ok() - .unwrap(); + generate_in_store::(store.clone(), BEEFY_KEY_TYPE, Some(Keyring::Bob)); - let store: BeefyKeystore = Some(store).into(); + let store: BeefyKeystore = Some(store).into(); let alice = Keyring::Alice.public(); - let msg = b"are you involved or commited?"; + let msg = b"are you involved or committed?"; let sig = store.sign(&alice, msg).err().unwrap(); - let err = Error::Signature("ecdsa_sign_prehashed() failed".to_string()); + let err = Error::Signature(expected_error_message.to_string()); assert_eq!(sig, err); } + #[test] + fn sign_error_for_ecdsa() { + sign_error::("ecdsa_sign_prehashed() failed"); + } + + #[cfg(feature = "bls-experimental")] + #[test] + fn sign_error_for_ecdsa_n_bls() { + sign_error::("bls377_sign() failed"); + } + #[test] fn sign_no_keystore() { - let store: BeefyKeystore = None.into(); + let store: BeefyKeystore = None.into(); let alice = Keyring::Alice.public(); - let msg = b"are you involved or commited"; + let msg = b"are you involved or committed"; let sig = store.sign(&alice, msg).err().unwrap(); let err = Error::Keystore("no Keystore".to_string()); assert_eq!(sig, err); } - #[test] - fn verify_works() { + fn verify_works< + AuthorityId: AuthorityIdBound + From<<::Pair as AppCrypto>::Public>, + >() + where + ::Signature: + Send + Sync + From<<::Pair as AppCrypto>::Signature>, + ::Pair: BeefySignerAuthority, + { let store = keystore(); - let alice: ecdsa_crypto::Public = store - .ecdsa_generate_new(BEEFY_KEY_TYPE, Some(&Keyring::Alice.to_seed())) - .ok() - .unwrap() - .into(); + generate_in_store::(store.clone(), BEEFY_KEY_TYPE, Some(Keyring::Alice)); - let store: BeefyKeystore = Some(store).into(); + let store: BeefyKeystore = Some(store).into(); + + let alice = Keyring::Alice.public(); // `msg` and `sig` match - let msg = b"are you involved or commited?"; + let msg = b"are you involved or committed?"; let sig = store.sign(&alice, msg).unwrap(); assert!(BeefyKeystore::verify(&alice, &sig, msg)); @@ -305,32 +496,48 @@ pub mod tests { assert!(!BeefyKeystore::verify(&alice, &sig, msg)); } - // Note that we use keys with and without a seed for this test. #[test] - fn public_keys_works() { + fn verify_works_for_ecdsa() { + verify_works::(); + } + + #[cfg(feature = "bls-experimental")] + #[test] + + fn verify_works_for_ecdsa_n_bls() { + verify_works::(); + } + + // Note that we use keys with and without a seed for this test. + fn public_keys_works< + AuthorityId: AuthorityIdBound + From<<::Pair as AppCrypto>::Public>, + >() + where + ::Signature: + Send + Sync + From<<::Pair as AppCrypto>::Signature>, + ::Pair: BeefySignerAuthority, + { const TEST_TYPE: sp_application_crypto::KeyTypeId = sp_application_crypto::KeyTypeId(*b"test"); let store = keystore(); - let add_key = - |key_type, seed: Option<&str>| store.ecdsa_generate_new(key_type, seed).unwrap(); - // test keys - let _ = add_key(TEST_TYPE, Some(Keyring::Alice.to_seed().as_str())); - let _ = add_key(TEST_TYPE, Some(Keyring::Bob.to_seed().as_str())); - - let _ = add_key(TEST_TYPE, None); - let _ = add_key(TEST_TYPE, None); + let _ = generate_in_store::(store.clone(), TEST_TYPE, Some(Keyring::Alice)); + let _ = generate_in_store::(store.clone(), TEST_TYPE, Some(Keyring::Bob)); // BEEFY keys - let _ = add_key(BEEFY_KEY_TYPE, Some(Keyring::Dave.to_seed().as_str())); - let _ = add_key(BEEFY_KEY_TYPE, Some(Keyring::Eve.to_seed().as_str())); + let _ = + generate_in_store::(store.clone(), BEEFY_KEY_TYPE, Some(Keyring::Dave)); + let _ = generate_in_store::(store.clone(), BEEFY_KEY_TYPE, Some(Keyring::Eve)); + + let _ = generate_in_store::(store.clone(), TEST_TYPE, None); + let _ = generate_in_store::(store.clone(), TEST_TYPE, None); - let key1: ecdsa_crypto::Public = add_key(BEEFY_KEY_TYPE, None).into(); - let key2: ecdsa_crypto::Public = add_key(BEEFY_KEY_TYPE, None).into(); + let key1 = generate_in_store::(store.clone(), BEEFY_KEY_TYPE, None); + let key2 = generate_in_store::(store.clone(), BEEFY_KEY_TYPE, None); - let store: BeefyKeystore = Some(store).into(); + let store: BeefyKeystore = Some(store).into(); let keys = store.public_keys().ok().unwrap(); @@ -340,4 +547,16 @@ pub mod tests { assert!(keys.contains(&key1)); assert!(keys.contains(&key2)); } + + #[test] + fn public_keys_works_for_ecdsa_keystore() { + public_keys_works::(); + } + + #[cfg(feature = "bls-experimental")] + #[test] + + fn public_keys_works_for_ecdsa_n_bls() { + public_keys_works::(); + } } diff --git a/substrate/client/consensus/beefy/src/lib.rs b/substrate/client/consensus/beefy/src/lib.rs index 1f10d8099d836b55fab2b13a60dcc2faf0f37320..2637481fbf3e0375fbad46de64fcb1b67fdd4668 100644 --- a/substrate/client/consensus/beefy/src/lib.rs +++ b/substrate/client/consensus/beefy/src/lib.rs @@ -31,7 +31,7 @@ use crate::{ import::BeefyBlockImport, metrics::register_metrics, }; -use futures::{stream::Fuse, StreamExt}; +use futures::{stream::Fuse, FutureExt, StreamExt}; use log::{debug, error, info, warn}; use parking_lot::Mutex; use prometheus::Registry; @@ -40,17 +40,21 @@ use sc_consensus::BlockImport; use sc_network::{NetworkRequest, NotificationService, ProtocolName}; use sc_network_gossip::{GossipEngine, Network as GossipNetwork, Syncing as GossipSyncing}; use sp_api::ProvideRuntimeApi; -use sp_blockchain::{ - Backend as BlockchainBackend, Error as ClientError, HeaderBackend, Result as ClientResult, -}; +use sp_blockchain::{Backend as BlockchainBackend, HeaderBackend}; use sp_consensus::{Error as ConsensusError, SyncOracle}; use sp_consensus_beefy::{ - ecdsa_crypto::AuthorityId, BeefyApi, MmrRootHash, PayloadProvider, ValidatorSet, + ecdsa_crypto::AuthorityId, BeefyApi, ConsensusLog, MmrRootHash, PayloadProvider, ValidatorSet, + BEEFY_ENGINE_ID, }; use sp_keystore::KeystorePtr; use sp_mmr_primitives::MmrApi; use sp_runtime::traits::{Block, Header as HeaderT, NumberFor, Zero}; -use std::{collections::BTreeMap, marker::PhantomData, sync::Arc, time::Duration}; +use std::{ + collections::{BTreeMap, VecDeque}, + marker::PhantomData, + sync::Arc, + time::Duration, +}; mod aux_schema; mod error; @@ -63,9 +67,18 @@ pub mod communication; pub mod import; pub mod justification; +use crate::{ + communication::gossip::GossipValidator, + justification::BeefyVersionedFinalityProof, + keystore::BeefyKeystore, + metrics::VoterMetrics, + round::Rounds, + worker::{BeefyWorker, PersistedState}, +}; pub use communication::beefy_protocol_name::{ gossip_protocol_name, justifications_protocol_name as justifs_protocol_name, }; +use sp_runtime::generic::OpaqueDigestItemId; #[cfg(test)] mod tests; @@ -208,6 +221,259 @@ pub struct BeefyParams { pub links: BeefyVoterLinks, /// Handler for incoming BEEFY justifications requests from a remote peer. pub on_demand_justifications_handler: BeefyJustifsRequestHandler, + /// Whether running under "Authority" role. + pub is_authority: bool, +} +/// Helper object holding BEEFY worker communication/gossip components. +/// +/// These are created once, but will be reused if worker is restarted/reinitialized. +pub(crate) struct BeefyComms { + pub gossip_engine: GossipEngine, + pub gossip_validator: Arc>, + pub on_demand_justifications: OnDemandJustificationsEngine, +} + +/// Helper builder object for building [worker::BeefyWorker]. +/// +/// It has to do it in two steps: initialization and build, because the first step can sleep waiting +/// for certain chain and backend conditions, and while sleeping we still need to pump the +/// GossipEngine. Once initialization is done, the GossipEngine (and other pieces) are added to get +/// the complete [worker::BeefyWorker] object. +pub(crate) struct BeefyWorkerBuilder { + // utilities + backend: Arc, + runtime: Arc, + key_store: BeefyKeystore, + // voter metrics + metrics: Option, + persisted_state: PersistedState, +} + +impl BeefyWorkerBuilder +where + B: Block + codec::Codec, + BE: Backend, + R: ProvideRuntimeApi, + R::Api: BeefyApi, +{ + /// This will wait for the chain to enable BEEFY (if not yet enabled) and also wait for the + /// backend to sync all headers required by the voter to build a contiguous chain of mandatory + /// justifications. Then it builds the initial voter state using a combination of previously + /// persisted state in AUX DB and latest chain information/progress. + /// + /// Returns a sane `BeefyWorkerBuilder` that can build the `BeefyWorker`. + pub async fn async_initialize( + backend: Arc, + runtime: Arc, + key_store: BeefyKeystore, + metrics: Option, + min_block_delta: u32, + gossip_validator: Arc>, + finality_notifications: &mut Fuse>, + is_authority: bool, + ) -> Result { + // Wait for BEEFY pallet to be active before starting voter. + let (beefy_genesis, best_grandpa) = + wait_for_runtime_pallet(&*runtime, finality_notifications).await?; + + let persisted_state = Self::load_or_init_state( + beefy_genesis, + best_grandpa, + min_block_delta, + backend.clone(), + runtime.clone(), + &key_store, + &metrics, + is_authority, + ) + .await?; + // Update the gossip validator with the right starting round and set id. + persisted_state + .gossip_filter_config() + .map(|f| gossip_validator.update_filter(f))?; + + Ok(BeefyWorkerBuilder { backend, runtime, key_store, metrics, persisted_state }) + } + + /// Takes rest of missing pieces as params and builds the `BeefyWorker`. + pub fn build( + self, + payload_provider: P, + sync: Arc, + comms: BeefyComms, + links: BeefyVoterLinks, + pending_justifications: BTreeMap, BeefyVersionedFinalityProof>, + is_authority: bool, + ) -> BeefyWorker { + BeefyWorker { + backend: self.backend, + runtime: self.runtime, + key_store: self.key_store, + metrics: self.metrics, + persisted_state: self.persisted_state, + payload_provider, + sync, + comms, + links, + pending_justifications, + is_authority, + } + } + + // If no persisted state present, walk back the chain from first GRANDPA notification to either: + // - latest BEEFY finalized block, or if none found on the way, + // - BEEFY pallet genesis; + // Enqueue any BEEFY mandatory blocks (session boundaries) found on the way, for voter to + // finalize. + async fn init_state( + beefy_genesis: NumberFor, + best_grandpa: ::Header, + min_block_delta: u32, + backend: Arc, + runtime: Arc, + ) -> Result, Error> { + let blockchain = backend.blockchain(); + + let beefy_genesis = runtime + .runtime_api() + .beefy_genesis(best_grandpa.hash()) + .ok() + .flatten() + .filter(|genesis| *genesis == beefy_genesis) + .ok_or_else(|| Error::Backend("BEEFY pallet expected to be active.".into()))?; + // Walk back the imported blocks and initialize voter either, at the last block with + // a BEEFY justification, or at pallet genesis block; voter will resume from there. + let mut sessions = VecDeque::new(); + let mut header = best_grandpa.clone(); + let state = loop { + if let Some(true) = blockchain + .justifications(header.hash()) + .ok() + .flatten() + .map(|justifs| justifs.get(BEEFY_ENGINE_ID).is_some()) + { + debug!( + target: LOG_TARGET, + "🥩 Initialize BEEFY voter at last BEEFY finalized block: {:?}.", + *header.number() + ); + let best_beefy = *header.number(); + // If no session boundaries detected so far, just initialize new rounds here. + if sessions.is_empty() { + let active_set = + expect_validator_set(runtime.as_ref(), backend.as_ref(), &header).await?; + let mut rounds = Rounds::new(best_beefy, active_set); + // Mark the round as already finalized. + rounds.conclude(best_beefy); + sessions.push_front(rounds); + } + let state = PersistedState::checked_new( + best_grandpa, + best_beefy, + sessions, + min_block_delta, + beefy_genesis, + ) + .ok_or_else(|| Error::Backend("Invalid BEEFY chain".into()))?; + break state + } + + if *header.number() == beefy_genesis { + // We've reached BEEFY genesis, initialize voter here. + let genesis_set = + expect_validator_set(runtime.as_ref(), backend.as_ref(), &header).await?; + info!( + target: LOG_TARGET, + "🥩 Loading BEEFY voter state from genesis on what appears to be first startup. \ + Starting voting rounds at block {:?}, genesis validator set {:?}.", + beefy_genesis, + genesis_set, + ); + + sessions.push_front(Rounds::new(beefy_genesis, genesis_set)); + break PersistedState::checked_new( + best_grandpa, + Zero::zero(), + sessions, + min_block_delta, + beefy_genesis, + ) + .ok_or_else(|| Error::Backend("Invalid BEEFY chain".into()))? + } + + if let Some(active) = find_authorities_change::(&header) { + debug!( + target: LOG_TARGET, + "🥩 Marking block {:?} as BEEFY Mandatory.", + *header.number() + ); + sessions.push_front(Rounds::new(*header.number(), active)); + } + + // Move up the chain. + header = wait_for_parent_header(blockchain, header, HEADER_SYNC_DELAY).await?; + }; + + aux_schema::write_current_version(backend.as_ref())?; + aux_schema::write_voter_state(backend.as_ref(), &state)?; + Ok(state) + } + + async fn load_or_init_state( + beefy_genesis: NumberFor, + best_grandpa: ::Header, + min_block_delta: u32, + backend: Arc, + runtime: Arc, + key_store: &BeefyKeystore, + metrics: &Option, + is_authority: bool, + ) -> Result, Error> { + // Initialize voter state from AUX DB if compatible. + if let Some(mut state) = crate::aux_schema::load_persistent(backend.as_ref())? + // Verify state pallet genesis matches runtime. + .filter(|state| state.pallet_genesis() == beefy_genesis) + { + // Overwrite persisted state with current best GRANDPA block. + state.set_best_grandpa(best_grandpa.clone()); + // Overwrite persisted data with newly provided `min_block_delta`. + state.set_min_block_delta(min_block_delta); + debug!(target: LOG_TARGET, "🥩 Loading BEEFY voter state from db: {:?}.", state); + + // Make sure that all the headers that we need have been synced. + let mut new_sessions = vec![]; + let mut header = best_grandpa.clone(); + while *header.number() > state.best_beefy() { + if state.voting_oracle().can_add_session(*header.number()) { + if let Some(active) = find_authorities_change::(&header) { + new_sessions.push((active, *header.number())); + } + } + header = + wait_for_parent_header(backend.blockchain(), header, HEADER_SYNC_DELAY).await?; + } + + // Make sure we didn't miss any sessions during node restart. + for (validator_set, new_session_start) in new_sessions.drain(..).rev() { + debug!( + target: LOG_TARGET, + "🥩 Handling missed BEEFY session after node restart: {:?}.", + new_session_start + ); + state.init_session_at( + new_session_start, + validator_set, + key_store, + metrics, + is_authority, + ); + } + return Ok(state) + } + + // No valid voter-state persisted, re-initialize from pallet genesis. + Self::init_state(beefy_genesis, best_grandpa, min_block_delta, backend, runtime).await + } } /// Start the BEEFY gadget. @@ -236,6 +502,7 @@ pub async fn start_beefy_gadget( prometheus_registry, links, mut on_demand_justifications_handler, + is_authority, } = beefy_params; let BeefyNetworkParams { @@ -257,8 +524,8 @@ pub async fn start_beefy_gadget( let known_peers = Arc::new(Mutex::new(KnownPeers::new())); // Default votes filter is to discard everything. // Validator is updated later with correct starting round and set id. - let (gossip_validator, gossip_report_stream) = - communication::gossip::GossipValidator::new(known_peers.clone()); + let gossip_validator = + communication::gossip::GossipValidator::new(known_peers.clone(), network.clone()); let gossip_validator = Arc::new(gossip_validator); let gossip_engine = GossipEngine::new( network.clone(), @@ -277,67 +544,46 @@ pub async fn start_beefy_gadget( known_peers, prometheus_registry.clone(), ); - let mut beefy_comms = worker::BeefyComms { - gossip_engine, - gossip_validator, - gossip_report_stream, - on_demand_justifications, - }; + let mut beefy_comms = BeefyComms { gossip_engine, gossip_validator, on_demand_justifications }; // We re-create and re-run the worker in this loop in order to quickly reinit and resume after // select recoverable errors. loop { - // Wait for BEEFY pallet to be active before starting voter. - let (beefy_genesis, best_grandpa) = match wait_for_runtime_pallet( - &*runtime, - &mut beefy_comms.gossip_engine, - &mut finality_notifications, - ) - .await - { - Ok(res) => res, - Err(e) => { - error!(target: LOG_TARGET, "Error: {:?}. Terminating.", e); - return + // Make sure to pump gossip engine while waiting for initialization conditions. + let worker_builder = futures::select! { + builder_init_result = BeefyWorkerBuilder::async_initialize( + backend.clone(), + runtime.clone(), + key_store.clone().into(), + metrics.clone(), + min_block_delta, + beefy_comms.gossip_validator.clone(), + &mut finality_notifications, + is_authority, + ).fuse() => { + match builder_init_result { + Ok(builder) => builder, + Err(e) => { + error!(target: LOG_TARGET, "🥩 Error: {:?}. Terminating.", e); + return + }, + } }, - }; - - let mut worker_base = worker::BeefyWorkerBase { - backend: backend.clone(), - runtime: runtime.clone(), - key_store: key_store.clone().into(), - metrics: metrics.clone(), - _phantom: Default::default(), - }; - - let persisted_state = match worker_base - .load_or_init_state(beefy_genesis, best_grandpa, min_block_delta) - .await - { - Ok(state) => state, - Err(e) => { - error!(target: LOG_TARGET, "Error: {:?}. Terminating.", e); + // Pump gossip engine. + _ = &mut beefy_comms.gossip_engine => { + error!(target: LOG_TARGET, "🥩 Gossip engine has unexpectedly terminated."); return - }, + } }; - // Update the gossip validator with the right starting round and set id. - if let Err(e) = persisted_state - .gossip_filter_config() - .map(|f| beefy_comms.gossip_validator.update_filter(f)) - { - error!(target: LOG_TARGET, "Error: {:?}. Terminating.", e); - return - } - let worker = worker::BeefyWorker { - base: worker_base, - payload_provider: payload_provider.clone(), - sync: sync.clone(), - comms: beefy_comms, - links: links.clone(), - pending_justifications: BTreeMap::new(), - persisted_state, - }; + let worker = worker_builder.build( + payload_provider.clone(), + sync.clone(), + beefy_comms, + links.clone(), + BTreeMap::new(), + is_authority, + ); match futures::future::select( Box::pin(worker.run(&mut block_import_justif, &mut finality_notifications)), @@ -404,9 +650,8 @@ where /// Should be called only once during worker initialization. async fn wait_for_runtime_pallet( runtime: &R, - mut gossip_engine: &mut GossipEngine, finality: &mut Fuse>, -) -> ClientResult<(NumberFor, ::Header)> +) -> Result<(NumberFor, ::Header), Error> where B: Block, R: ProvideRuntimeApi, @@ -414,33 +659,24 @@ where { info!(target: LOG_TARGET, "🥩 BEEFY gadget waiting for BEEFY pallet to become available..."); loop { - futures::select! { - notif = finality.next() => { - let notif = match notif { - Some(notif) => notif, - None => break - }; - let at = notif.header.hash(); - if let Some(start) = runtime.runtime_api().beefy_genesis(at).ok().flatten() { - if *notif.header.number() >= start { - // Beefy pallet available, return header for best grandpa at the time. - info!( - target: LOG_TARGET, - "🥩 BEEFY pallet available: block {:?} beefy genesis {:?}", - notif.header.number(), start - ); - return Ok((start, notif.header)) - } - } - }, - _ = gossip_engine => { - break + let notif = finality.next().await.ok_or_else(|| { + let err_msg = "🥩 Finality stream has unexpectedly terminated.".into(); + error!(target: LOG_TARGET, "{}", err_msg); + Error::Backend(err_msg) + })?; + let at = notif.header.hash(); + if let Some(start) = runtime.runtime_api().beefy_genesis(at).ok().flatten() { + if *notif.header.number() >= start { + // Beefy pallet available, return header for best grandpa at the time. + info!( + target: LOG_TARGET, + "🥩 BEEFY pallet available: block {:?} beefy genesis {:?}", + notif.header.number(), start + ); + return Ok((start, notif.header)) } } } - let err_msg = "🥩 Gossip engine has unexpectedly terminated.".into(); - error!(target: LOG_TARGET, "{}", err_msg); - Err(ClientError::Backend(err_msg)) } /// Provides validator set active `at_header`. It tries to get it from state, otherwise falls @@ -460,17 +696,21 @@ where R::Api: BeefyApi, { let blockchain = backend.blockchain(); - // Walk up the chain looking for the validator set active at 'at_header'. Process both state and // header digests. - debug!(target: LOG_TARGET, "🥩 Trying to find validator set active at header: {:?}", at_header); + debug!( + target: LOG_TARGET, + "🥩 Trying to find validator set active at header(number {:?}, hash {:?})", + at_header.number(), + at_header.hash() + ); let mut header = at_header.clone(); loop { debug!(target: LOG_TARGET, "🥩 Looking for auth set change at block number: {:?}", *header.number()); if let Ok(Some(active)) = runtime.runtime_api().validator_set(header.hash()) { return Ok(active) } else { - match worker::find_authorities_change::(&header) { + match find_authorities_change::(&header) { Some(active) => return Ok(active), // Move up the chain. Ultimately we'll get it from chain genesis state, or error out // there. @@ -482,3 +722,18 @@ where } } } + +/// Scan the `header` digest log for a BEEFY validator set change. Return either the new +/// validator set or `None` in case no validator set change has been signaled. +pub(crate) fn find_authorities_change(header: &B::Header) -> Option> +where + B: Block, +{ + let id = OpaqueDigestItemId::Consensus(&BEEFY_ENGINE_ID); + + let filter = |log: ConsensusLog| match log { + ConsensusLog::AuthoritiesChange(validator_set) => Some(validator_set), + _ => None, + }; + header.digest().convert_first(|l| l.try_to(id).and_then(filter)) +} diff --git a/substrate/client/consensus/beefy/src/round.rs b/substrate/client/consensus/beefy/src/round.rs index 47414c60fdb5fc8fc94e60136481ebaefd4d7560..0045dc70c260ee43ca1137d7d7f92b097220aeaf 100644 --- a/substrate/client/consensus/beefy/src/round.rs +++ b/substrate/client/consensus/beefy/src/round.rs @@ -207,7 +207,7 @@ mod tests { use sc_network_test::Block; use sp_consensus_beefy::{ - known_payloads::MMR_ROOT_ID, Commitment, EquivocationProof, Keyring, Payload, + known_payloads::MMR_ROOT_ID, test_utils::Keyring, Commitment, EquivocationProof, Payload, SignedCommitment, ValidatorSet, VoteMessage, }; @@ -226,7 +226,7 @@ mod tests { #[test] fn round_tracker() { let mut rt = RoundTracker::default(); - let bob_vote = (Keyring::Bob.public(), Keyring::Bob.sign(b"I am committed")); + let bob_vote = (Keyring::Bob.public(), Keyring::::Bob.sign(b"I am committed")); let threshold = 2; // adding new vote allowed @@ -237,7 +237,8 @@ mod tests { // vote is not done assert!(!rt.is_done(threshold)); - let alice_vote = (Keyring::Alice.public(), Keyring::Alice.sign(b"I am committed")); + let alice_vote = + (Keyring::Alice.public(), Keyring::::Alice.sign(b"I am committed")); // adding new vote (self vote this time) allowed assert!(rt.add_vote(alice_vote)); @@ -271,7 +272,11 @@ mod tests { assert_eq!(42, rounds.validator_set_id()); assert_eq!(1, rounds.session_start()); assert_eq!( - &vec![Keyring::Alice.public(), Keyring::Bob.public(), Keyring::Charlie.public()], + &vec![ + Keyring::::Alice.public(), + Keyring::::Bob.public(), + Keyring::::Charlie.public() + ], rounds.validators() ); } @@ -301,7 +306,7 @@ mod tests { let mut vote = VoteMessage { id: Keyring::Alice.public(), commitment: commitment.clone(), - signature: Keyring::Alice.sign(b"I am committed"), + signature: Keyring::::Alice.sign(b"I am committed"), }; // add 1st good vote assert_eq!(rounds.add_vote(vote.clone()), VoteImportResult::Ok); @@ -310,26 +315,26 @@ mod tests { assert_eq!(rounds.add_vote(vote.clone()), VoteImportResult::Ok); vote.id = Keyring::Dave.public(); - vote.signature = Keyring::Dave.sign(b"I am committed"); + vote.signature = Keyring::::Dave.sign(b"I am committed"); // invalid vote (Dave is not a validator) assert_eq!(rounds.add_vote(vote.clone()), VoteImportResult::Invalid); vote.id = Keyring::Bob.public(); - vote.signature = Keyring::Bob.sign(b"I am committed"); + vote.signature = Keyring::::Bob.sign(b"I am committed"); // add 2nd good vote assert_eq!(rounds.add_vote(vote.clone()), VoteImportResult::Ok); vote.id = Keyring::Charlie.public(); - vote.signature = Keyring::Charlie.sign(b"I am committed"); + vote.signature = Keyring::::Charlie.sign(b"I am committed"); // add 3rd good vote -> round concluded -> signatures present assert_eq!( rounds.add_vote(vote.clone()), VoteImportResult::RoundConcluded(SignedCommitment { commitment, signatures: vec![ - Some(Keyring::Alice.sign(b"I am committed")), - Some(Keyring::Bob.sign(b"I am committed")), - Some(Keyring::Charlie.sign(b"I am committed")), + Some(Keyring::::Alice.sign(b"I am committed")), + Some(Keyring::::Bob.sign(b"I am committed")), + Some(Keyring::::Charlie.sign(b"I am committed")), None, ] }) @@ -337,7 +342,7 @@ mod tests { rounds.conclude(block_number); vote.id = Keyring::Eve.public(); - vote.signature = Keyring::Eve.sign(b"I am committed"); + vote.signature = Keyring::::Eve.sign(b"I am committed"); // Eve is a validator, but round was concluded, adding vote disallowed assert_eq!(rounds.add_vote(vote), VoteImportResult::Stale); } @@ -364,7 +369,7 @@ mod tests { let mut vote = VoteMessage { id: Keyring::Alice.public(), commitment, - signature: Keyring::Alice.sign(b"I am committed"), + signature: Keyring::::Alice.sign(b"I am committed"), }; // add vote for previous session, should fail assert_eq!(rounds.add_vote(vote.clone()), VoteImportResult::Stale); @@ -407,22 +412,22 @@ mod tests { let mut alice_vote = VoteMessage { id: Keyring::Alice.public(), commitment: commitment.clone(), - signature: Keyring::Alice.sign(b"I am committed"), + signature: Keyring::::Alice.sign(b"I am committed"), }; let mut bob_vote = VoteMessage { id: Keyring::Bob.public(), commitment: commitment.clone(), - signature: Keyring::Bob.sign(b"I am committed"), + signature: Keyring::::Bob.sign(b"I am committed"), }; let mut charlie_vote = VoteMessage { id: Keyring::Charlie.public(), commitment, - signature: Keyring::Charlie.sign(b"I am committed"), + signature: Keyring::::Charlie.sign(b"I am committed"), }; let expected_signatures = vec![ - Some(Keyring::Alice.sign(b"I am committed")), - Some(Keyring::Bob.sign(b"I am committed")), - Some(Keyring::Charlie.sign(b"I am committed")), + Some(Keyring::::Alice.sign(b"I am committed")), + Some(Keyring::::Bob.sign(b"I am committed")), + Some(Keyring::::Charlie.sign(b"I am committed")), ]; // round 1 - only 2 out of 3 vote @@ -484,7 +489,7 @@ mod tests { let alice_vote1 = VoteMessage { id: Keyring::Alice.public(), commitment: commitment1, - signature: Keyring::Alice.sign(b"I am committed"), + signature: Keyring::::Alice.sign(b"I am committed"), }; let mut alice_vote2 = alice_vote1.clone(); alice_vote2.commitment = commitment2; diff --git a/substrate/client/consensus/beefy/src/tests.rs b/substrate/client/consensus/beefy/src/tests.rs index 7e61e877c1ddac692c6ae5f7199cf5ff35752ff7..9b13d1da6d7da38b74864c9a750f515ef9472230 100644 --- a/substrate/client/consensus/beefy/src/tests.rs +++ b/substrate/client/consensus/beefy/src/tests.rs @@ -23,8 +23,9 @@ use crate::{ beefy_block_import_and_links, communication::{ gossip::{ - proofs_topic, tests::sign_commitment, votes_topic, GossipFilterCfg, GossipMessage, - GossipValidator, + proofs_topic, + tests::{sign_commitment, TestNetwork}, + votes_topic, GossipFilterCfg, GossipMessage, GossipValidator, }, request_response::{on_demand_justifications_protocol_config, BeefyJustifsRequestHandler}, }, @@ -32,8 +33,8 @@ use crate::{ gossip_protocol_name, justification::*, wait_for_runtime_pallet, - worker::{BeefyWorkerBase, PersistedState}, - BeefyRPCLinks, BeefyVoterLinks, KnownPeers, + worker::PersistedState, + BeefyRPCLinks, BeefyVoterLinks, BeefyWorkerBuilder, KnownPeers, }; use futures::{future, stream::FuturesUnordered, Future, FutureExt, StreamExt}; use parking_lot::Mutex; @@ -57,9 +58,10 @@ use sp_consensus_beefy::{ ecdsa_crypto::{AuthorityId, Signature}, known_payloads, mmr::{find_mmr_root_digest, MmrRootProvider}, - BeefyApi, Commitment, ConsensusLog, EquivocationProof, Keyring as BeefyKeyring, MmrRootHash, - OpaqueKeyOwnershipProof, Payload, SignedCommitment, ValidatorSet, ValidatorSetId, - VersionedFinalityProof, VoteMessage, BEEFY_ENGINE_ID, + test_utils::Keyring as BeefyKeyring, + BeefyApi, Commitment, ConsensusLog, EquivocationProof, MmrRootHash, OpaqueKeyOwnershipProof, + Payload, SignedCommitment, ValidatorSet, ValidatorSetId, VersionedFinalityProof, VoteMessage, + BEEFY_ENGINE_ID, }; use sp_core::H256; use sp_keystore::{testing::MemoryKeystore, Keystore, KeystorePtr}; @@ -123,7 +125,11 @@ impl BeefyTestNet { let mut net = BeefyTestNet { peers: Vec::with_capacity(n_authority), beefy_genesis }; for i in 0..n_authority { - let (rx, cfg) = on_demand_justifications_protocol_config(GENESIS_HASH, None); + let (rx, cfg) = on_demand_justifications_protocol_config::< + _, + Block, + sc_network::NetworkWorker<_, _>, + >(GENESIS_HASH, None); let justif_protocol_name = cfg.name.clone(); net.add_authority_peer(vec![cfg]); @@ -349,11 +355,11 @@ fn add_auth_change_digest(builder: &mut impl BlockBuilderExt, new_auth_set: Beef .unwrap(); } -pub(crate) fn make_beefy_ids(keys: &[BeefyKeyring]) -> Vec { - keys.iter().map(|&key| key.public().into()).collect() +pub(crate) fn make_beefy_ids(keys: &[BeefyKeyring]) -> Vec { + keys.iter().map(|key| key.public().into()).collect() } -pub(crate) fn create_beefy_keystore(authority: BeefyKeyring) -> KeystorePtr { +pub(crate) fn create_beefy_keystore(authority: &BeefyKeyring) -> KeystorePtr { let keystore = MemoryKeystore::new(); keystore .ecdsa_generate_new(BEEFY_KEY_TYPE, Some(&authority.to_seed())) @@ -367,33 +373,26 @@ async fn voter_init_setup( api: &TestApi, ) -> Result, Error> { let backend = net.peer(0).client().as_backend(); - let known_peers = Arc::new(Mutex::new(KnownPeers::new())); - let (gossip_validator, _) = GossipValidator::new(known_peers); - let gossip_validator = Arc::new(gossip_validator); - let mut gossip_engine = sc_network_gossip::GossipEngine::new( - net.peer(0).network_service().clone(), - net.peer(0).sync_service().clone(), - net.peer(0).take_notification_service(&beefy_gossip_proto_name()).unwrap(), - "/beefy/whatever", - gossip_validator, - None, - ); - let (beefy_genesis, best_grandpa) = - wait_for_runtime_pallet(api, &mut gossip_engine, finality).await.unwrap(); - let mut worker_base = BeefyWorkerBase { + let (beefy_genesis, best_grandpa) = wait_for_runtime_pallet(api, finality).await.unwrap(); + let key_store = None.into(); + let metrics = None; + BeefyWorkerBuilder::load_or_init_state( + beefy_genesis, + best_grandpa, + 1, backend, - runtime: Arc::new(api.clone()), - key_store: None.into(), - metrics: None, - _phantom: Default::default(), - }; - worker_base.load_or_init_state(beefy_genesis, best_grandpa, 1).await + Arc::new(api.clone()), + &key_store, + &metrics, + true, + ) + .await } // Spawns beefy voters. Returns a future to spawn on the runtime. fn initialize_beefy( net: &mut BeefyTestNet, - peers: Vec<(usize, &BeefyKeyring, Arc)>, + peers: Vec<(usize, &BeefyKeyring, Arc)>, min_block_delta: u32, ) -> impl Future where @@ -413,7 +412,7 @@ where for (peer_id, key, api) in peers.into_iter() { let peer = &net.peers[peer_id]; - let keystore = create_beefy_keystore(*key); + let keystore = create_beefy_keystore(key); let (_, _, peer_data) = net.make_block_import(peer.client().clone()); let PeerData { beefy_rpc_links, beefy_voter_links, .. } = peer_data; @@ -445,6 +444,7 @@ where min_block_delta, prometheus_registry: None, on_demand_justifications_handler: on_demand_justif_handler, + is_authority: true, }; let task = crate::start_beefy_gadget::<_, _, _, _, _, _, _>(beefy_params); @@ -471,7 +471,7 @@ async fn run_for(duration: Duration, net: &Arc>) { pub(crate) fn get_beefy_streams( net: &mut BeefyTestNet, // peer index and key - peers: impl Iterator, + peers: impl Iterator)>, ) -> (Vec>, Vec>>) { let mut best_block_streams = Vec::new(); @@ -569,7 +569,7 @@ async fn streams_empty_after_timeout( async fn finalize_block_and_wait_for_beefy( net: &Arc>, // peer index and key - peers: impl Iterator + Clone, + peers: impl Iterator)> + Clone, finalize_target: &H256, expected_beefy: &[u64], ) { @@ -1064,32 +1064,7 @@ async fn should_initialize_voter_at_custom_genesis() { net.peer(0).client().as_client().finalize_block(hashes[8], None).unwrap(); // load persistent state - nothing in DB, should init at genesis - // - // NOTE: code from `voter_init_setup()` is moved here because the new network event system - // doesn't allow creating a new `GossipEngine` as the notification handle is consumed by the - // first `GossipEngine` - let known_peers = Arc::new(Mutex::new(KnownPeers::new())); - let (gossip_validator, _) = GossipValidator::new(known_peers); - let gossip_validator = Arc::new(gossip_validator); - let mut gossip_engine = sc_network_gossip::GossipEngine::new( - net.peer(0).network_service().clone(), - net.peer(0).sync_service().clone(), - net.peer(0).take_notification_service(&beefy_gossip_proto_name()).unwrap(), - "/beefy/whatever", - gossip_validator, - None, - ); - let (beefy_genesis, best_grandpa) = - wait_for_runtime_pallet(&api, &mut gossip_engine, &mut finality).await.unwrap(); - let mut worker_base = BeefyWorkerBase { - backend: backend.clone(), - runtime: Arc::new(api), - key_store: None.into(), - metrics: None, - _phantom: Default::default(), - }; - let persisted_state = - worker_base.load_or_init_state(beefy_genesis, best_grandpa, 1).await.unwrap(); + let persisted_state = voter_init_setup(&mut net, &mut finality, &api).await.unwrap(); // Test initialization at session boundary. // verify voter initialized with single session starting at block `custom_pallet_genesis` (7) @@ -1119,18 +1094,7 @@ async fn should_initialize_voter_at_custom_genesis() { net.peer(0).client().as_client().finalize_block(hashes[10], None).unwrap(); // load persistent state - state preset in DB, but with different pallet genesis - // the network state persists and uses the old `GossipEngine` initialized for `peer(0)` - let (beefy_genesis, best_grandpa) = - wait_for_runtime_pallet(&api, &mut gossip_engine, &mut finality).await.unwrap(); - let mut worker_base = BeefyWorkerBase { - backend: backend.clone(), - runtime: Arc::new(api), - key_store: None.into(), - metrics: None, - _phantom: Default::default(), - }; - let new_persisted_state = - worker_base.load_or_init_state(beefy_genesis, best_grandpa, 1).await.unwrap(); + let new_persisted_state = voter_init_setup(&mut net, &mut finality, &api).await.unwrap(); // verify voter initialized with single session starting at block `new_pallet_genesis` (10) let sessions = new_persisted_state.voting_oracle().sessions(); @@ -1321,32 +1285,7 @@ async fn should_catch_up_when_loading_saved_voter_state() { let api = TestApi::with_validator_set(&validator_set); // load persistent state - nothing in DB, should init at genesis - // - // NOTE: code from `voter_init_setup()` is moved here because the new network event system - // doesn't allow creating a new `GossipEngine` as the notification handle is consumed by the - // first `GossipEngine` - let known_peers = Arc::new(Mutex::new(KnownPeers::new())); - let (gossip_validator, _) = GossipValidator::new(known_peers); - let gossip_validator = Arc::new(gossip_validator); - let mut gossip_engine = sc_network_gossip::GossipEngine::new( - net.peer(0).network_service().clone(), - net.peer(0).sync_service().clone(), - net.peer(0).take_notification_service(&beefy_gossip_proto_name()).unwrap(), - "/beefy/whatever", - gossip_validator, - None, - ); - let (beefy_genesis, best_grandpa) = - wait_for_runtime_pallet(&api, &mut gossip_engine, &mut finality).await.unwrap(); - let mut worker_base = BeefyWorkerBase { - backend: backend.clone(), - runtime: Arc::new(api.clone()), - key_store: None.into(), - metrics: None, - _phantom: Default::default(), - }; - let persisted_state = - worker_base.load_or_init_state(beefy_genesis, best_grandpa, 1).await.unwrap(); + let persisted_state = voter_init_setup(&mut net, &mut finality, &api).await.unwrap(); // Test initialization at session boundary. // verify voter initialized with two sessions starting at blocks 1 and 10 @@ -1373,18 +1312,7 @@ async fn should_catch_up_when_loading_saved_voter_state() { // finalize 25 without justifications net.peer(0).client().as_client().finalize_block(hashes[25], None).unwrap(); // load persistent state - state preset in DB - // the network state persists and uses the old `GossipEngine` initialized for `peer(0)` - let (beefy_genesis, best_grandpa) = - wait_for_runtime_pallet(&api, &mut gossip_engine, &mut finality).await.unwrap(); - let mut worker_base = BeefyWorkerBase { - backend: backend.clone(), - runtime: Arc::new(api), - key_store: None.into(), - metrics: None, - _phantom: Default::default(), - }; - let persisted_state = - worker_base.load_or_init_state(beefy_genesis, best_grandpa, 1).await.unwrap(); + let persisted_state = voter_init_setup(&mut net, &mut finality, &api).await.unwrap(); // Verify voter initialized with old sessions plus a new one starting at block 20. // There shouldn't be any duplicates. @@ -1527,7 +1455,7 @@ async fn gossipped_finality_proofs() { let charlie = &mut net.peers[2]; let known_peers = Arc::new(Mutex::new(KnownPeers::::new())); // Charlie will run just the gossip engine and not the full voter. - let (gossip_validator, _) = GossipValidator::new(known_peers); + let gossip_validator = GossipValidator::new(known_peers, Arc::new(TestNetwork::new().0)); let charlie_gossip_validator = Arc::new(gossip_validator); charlie_gossip_validator.update_filter(GossipFilterCfg:: { start: 1, diff --git a/substrate/client/consensus/beefy/src/worker.rs b/substrate/client/consensus/beefy/src/worker.rs index e67e3e0f76ad996c4666142bf28fead1aed200b6..05575ae01c3011e57c13d930a493cc57d7261a52 100644 --- a/substrate/client/consensus/beefy/src/worker.rs +++ b/substrate/client/consensus/beefy/src/worker.rs @@ -17,46 +17,41 @@ // along with this program. If not, see . use crate::{ - aux_schema, communication::{ - gossip::{proofs_topic, votes_topic, GossipFilterCfg, GossipMessage, GossipValidator}, - peers::PeerReport, - request_response::outgoing_requests_engine::{OnDemandJustificationsEngine, ResponseInfo}, + gossip::{proofs_topic, votes_topic, GossipFilterCfg, GossipMessage}, + request_response::outgoing_requests_engine::ResponseInfo, }, error::Error, - expect_validator_set, + find_authorities_change, justification::BeefyVersionedFinalityProof, - keystore::{BeefyKeystore, BeefySignatureHasher}, + keystore::BeefyKeystore, metric_inc, metric_set, metrics::VoterMetrics, round::{Rounds, VoteImportResult}, - wait_for_parent_header, BeefyVoterLinks, HEADER_SYNC_DELAY, LOG_TARGET, + BeefyComms, BeefyVoterLinks, LOG_TARGET, }; use codec::{Codec, Decode, DecodeAll, Encode}; use futures::{stream::Fuse, FutureExt, StreamExt}; -use log::{debug, error, info, log_enabled, trace, warn}; +use log::{debug, error, info, trace, warn}; use sc_client_api::{Backend, FinalityNotification, FinalityNotifications, HeaderBackend}; -use sc_network_gossip::GossipEngine; -use sc_utils::{mpsc::TracingUnboundedReceiver, notification::NotificationReceiver}; +use sc_utils::notification::NotificationReceiver; use sp_api::ProvideRuntimeApi; use sp_arithmetic::traits::{AtLeast32Bit, Saturating}; -use sp_blockchain::Backend as BlockchainBackend; use sp_consensus::SyncOracle; use sp_consensus_beefy::{ check_equivocation_proof, ecdsa_crypto::{AuthorityId, Signature}, - BeefyApi, Commitment, ConsensusLog, EquivocationProof, PayloadProvider, ValidatorSet, + BeefyApi, BeefySignatureHasher, Commitment, EquivocationProof, PayloadProvider, ValidatorSet, VersionedFinalityProof, VoteMessage, BEEFY_ENGINE_ID, }; use sp_runtime::{ - generic::{BlockId, OpaqueDigestItemId}, + generic::BlockId, traits::{Block, Header, NumberFor, Zero}, SaturatedConversion, }; use std::{ - collections::{BTreeMap, BTreeSet, VecDeque}, + collections::{BTreeMap, VecDeque}, fmt::Debug, - marker::PhantomData, sync::Arc, }; @@ -80,13 +75,13 @@ pub(crate) enum RoundAction { pub(crate) struct VoterOracle { /// Queue of known sessions. Keeps track of voting rounds (block numbers) within each session. /// - /// There are three voter states coresponding to three queue states: + /// There are three voter states corresponding to three queue states: /// 1. voter uninitialized: queue empty, /// 2. up-to-date - all mandatory blocks leading up to current GRANDPA finalized: queue has ONE /// element, the 'current session' where `mandatory_done == true`, /// 3. lagging behind GRANDPA: queue has [1, N] elements, where all `mandatory_done == false`. - /// In this state, everytime a session gets its mandatory block BEEFY finalized, it's popped - /// off the queue, eventually getting to state `2. up-to-date`. + /// In this state, every time a session gets its mandatory block BEEFY finalized, it's + /// popped off the queue, eventually getting to state `2. up-to-date`. sessions: VecDeque>, /// Min delta in block numbers between two blocks, BEEFY should vote on. min_block_delta: u32, @@ -180,8 +175,8 @@ impl VoterOracle { } } - // Check if an observed session can be added to the Oracle. - fn can_add_session(&self, session_start: NumberFor) -> bool { + /// Check if an observed session can be added to the Oracle. + pub fn can_add_session(&self, session_start: NumberFor) -> bool { let latest_known_session_start = self.sessions.back().map(|session| session.session_start()); Some(session_start) > latest_known_session_start @@ -319,229 +314,29 @@ impl PersistedState { self.voting_oracle.best_grandpa_block_header = best_grandpa; } + pub fn voting_oracle(&self) -> &VoterOracle { + &self.voting_oracle + } + pub(crate) fn gossip_filter_config(&self) -> Result, Error> { let (start, end) = self.voting_oracle.accepted_interval()?; let validator_set = self.voting_oracle.current_validator_set()?; Ok(GossipFilterCfg { start, end, validator_set }) } -} - -/// Helper object holding BEEFY worker communication/gossip components. -/// -/// These are created once, but will be reused if worker is restarted/reinitialized. -pub(crate) struct BeefyComms { - pub gossip_engine: GossipEngine, - pub gossip_validator: Arc>, - pub gossip_report_stream: TracingUnboundedReceiver, - pub on_demand_justifications: OnDemandJustificationsEngine, -} - -pub(crate) struct BeefyWorkerBase { - // utilities - pub backend: Arc, - pub runtime: Arc, - pub key_store: BeefyKeystore, - - /// BEEFY client metrics. - pub metrics: Option, - - pub _phantom: PhantomData, -} - -impl BeefyWorkerBase -where - B: Block + Codec, - BE: Backend, - R: ProvideRuntimeApi, - R::Api: BeefyApi, -{ - // If no persisted state present, walk back the chain from first GRANDPA notification to either: - // - latest BEEFY finalized block, or if none found on the way, - // - BEEFY pallet genesis; - // Enqueue any BEEFY mandatory blocks (session boundaries) found on the way, for voter to - // finalize. - async fn init_state( - &self, - beefy_genesis: NumberFor, - best_grandpa: ::Header, - min_block_delta: u32, - ) -> Result, Error> { - let blockchain = self.backend.blockchain(); - - let beefy_genesis = self - .runtime - .runtime_api() - .beefy_genesis(best_grandpa.hash()) - .ok() - .flatten() - .filter(|genesis| *genesis == beefy_genesis) - .ok_or_else(|| Error::Backend("BEEFY pallet expected to be active.".into()))?; - // Walk back the imported blocks and initialize voter either, at the last block with - // a BEEFY justification, or at pallet genesis block; voter will resume from there. - let mut sessions = VecDeque::new(); - let mut header = best_grandpa.clone(); - let state = loop { - if let Some(true) = blockchain - .justifications(header.hash()) - .ok() - .flatten() - .map(|justifs| justifs.get(BEEFY_ENGINE_ID).is_some()) - { - info!( - target: LOG_TARGET, - "🥩 Initialize BEEFY voter at last BEEFY finalized block: {:?}.", - *header.number() - ); - let best_beefy = *header.number(); - // If no session boundaries detected so far, just initialize new rounds here. - if sessions.is_empty() { - let active_set = - expect_validator_set(self.runtime.as_ref(), self.backend.as_ref(), &header) - .await?; - let mut rounds = Rounds::new(best_beefy, active_set); - // Mark the round as already finalized. - rounds.conclude(best_beefy); - sessions.push_front(rounds); - } - let state = PersistedState::checked_new( - best_grandpa, - best_beefy, - sessions, - min_block_delta, - beefy_genesis, - ) - .ok_or_else(|| Error::Backend("Invalid BEEFY chain".into()))?; - break state - } - - if *header.number() == beefy_genesis { - // We've reached BEEFY genesis, initialize voter here. - let genesis_set = - expect_validator_set(self.runtime.as_ref(), self.backend.as_ref(), &header) - .await?; - info!( - target: LOG_TARGET, - "🥩 Loading BEEFY voter state from genesis on what appears to be first startup. \ - Starting voting rounds at block {:?}, genesis validator set {:?}.", - beefy_genesis, - genesis_set, - ); - - sessions.push_front(Rounds::new(beefy_genesis, genesis_set)); - break PersistedState::checked_new( - best_grandpa, - Zero::zero(), - sessions, - min_block_delta, - beefy_genesis, - ) - .ok_or_else(|| Error::Backend("Invalid BEEFY chain".into()))? - } - - if let Some(active) = find_authorities_change::(&header) { - info!( - target: LOG_TARGET, - "🥩 Marking block {:?} as BEEFY Mandatory.", - *header.number() - ); - sessions.push_front(Rounds::new(*header.number(), active)); - } - - // Move up the chain. - header = wait_for_parent_header(blockchain, header, HEADER_SYNC_DELAY).await?; - }; - - aux_schema::write_current_version(self.backend.as_ref())?; - aux_schema::write_voter_state(self.backend.as_ref(), &state)?; - Ok(state) - } - - pub async fn load_or_init_state( - &mut self, - beefy_genesis: NumberFor, - best_grandpa: ::Header, - min_block_delta: u32, - ) -> Result, Error> { - // Initialize voter state from AUX DB if compatible. - if let Some(mut state) = crate::aux_schema::load_persistent(self.backend.as_ref())? - // Verify state pallet genesis matches runtime. - .filter(|state| state.pallet_genesis() == beefy_genesis) - { - // Overwrite persisted state with current best GRANDPA block. - state.set_best_grandpa(best_grandpa.clone()); - // Overwrite persisted data with newly provided `min_block_delta`. - state.set_min_block_delta(min_block_delta); - info!(target: LOG_TARGET, "🥩 Loading BEEFY voter state from db: {:?}.", state); - - // Make sure that all the headers that we need have been synced. - let mut new_sessions = vec![]; - let mut header = best_grandpa.clone(); - while *header.number() > state.best_beefy() { - if state.voting_oracle.can_add_session(*header.number()) { - if let Some(active) = find_authorities_change::(&header) { - new_sessions.push((active, *header.number())); - } - } - header = - wait_for_parent_header(self.backend.blockchain(), header, HEADER_SYNC_DELAY) - .await?; - } - - // Make sure we didn't miss any sessions during node restart. - for (validator_set, new_session_start) in new_sessions.drain(..).rev() { - info!( - target: LOG_TARGET, - "🥩 Handling missed BEEFY session after node restart: {:?}.", - new_session_start - ); - self.init_session_at(&mut state, validator_set, new_session_start); - } - return Ok(state) - } - - // No valid voter-state persisted, re-initialize from pallet genesis. - self.init_state(beefy_genesis, best_grandpa, min_block_delta).await - } - - /// Verify `active` validator set for `block` against the key store - /// - /// We want to make sure that we have _at least one_ key in our keystore that - /// is part of the validator set, that's because if there are no local keys - /// then we can't perform our job as a validator. - /// - /// Note that for a non-authority node there will be no keystore, and we will - /// return an error and don't check. The error can usually be ignored. - fn verify_validator_set( - &self, - block: &NumberFor, - active: &ValidatorSet, - ) -> Result<(), Error> { - let active: BTreeSet<&AuthorityId> = active.validators().iter().collect(); - - let public_keys = self.key_store.public_keys()?; - let store: BTreeSet<&AuthorityId> = public_keys.iter().collect(); - - if store.intersection(&active).count() == 0 { - let msg = "no authority public key found in store".to_string(); - debug!(target: LOG_TARGET, "🥩 for block {:?} {}", block, msg); - metric_inc!(self.metrics, beefy_no_authority_found_in_store); - Err(Error::Keystore(msg)) - } else { - Ok(()) - } - } /// Handle session changes by starting new voting round for mandatory blocks. - fn init_session_at( + pub fn init_session_at( &mut self, - persisted_state: &mut PersistedState, - validator_set: ValidatorSet, new_session_start: NumberFor, + validator_set: ValidatorSet, + key_store: &BeefyKeystore, + metrics: &Option, + is_authority: bool, ) { debug!(target: LOG_TARGET, "🥩 New active validator set: {:?}", validator_set); // BEEFY should finalize a mandatory block during each session. - if let Ok(active_session) = persisted_state.voting_oracle.active_rounds() { + if let Ok(active_session) = self.voting_oracle.active_rounds() { if !active_session.mandatory_done() { debug!( target: LOG_TARGET, @@ -549,20 +344,25 @@ where validator_set.id(), active_session.validator_set_id(), ); - metric_inc!(self.metrics, beefy_lagging_sessions); + metric_inc!(metrics, beefy_lagging_sessions); } } - if log_enabled!(target: LOG_TARGET, log::Level::Debug) { - // verify the new validator set - only do it if we're also logging the warning - let _ = self.verify_validator_set(&new_session_start, &validator_set); + // verify we have some BEEFY key available in keystore when role is authority. + if is_authority && key_store.public_keys().map_or(false, |k| k.is_empty()) { + error!( + target: LOG_TARGET, + "🥩 for session starting at block {:?} no BEEFY authority key found in store, \ + you must generate valid session keys \ + (https://wiki.polkadot.network/docs/maintain-guides-how-to-validate-polkadot#generating-the-session-keys)", + new_session_start, + ); + metric_inc!(metrics, beefy_no_authority_found_in_store); } let id = validator_set.id(); - persisted_state - .voting_oracle - .add_session(Rounds::new(new_session_start, validator_set)); - metric_set!(self.metrics, beefy_validator_set_id, id); + self.voting_oracle.add_session(Rounds::new(new_session_start, validator_set)); + metric_set!(metrics, beefy_validator_set_id, id); info!( target: LOG_TARGET, "🥩 New Rounds for validator set id: {:?} with session_start {:?}", @@ -573,15 +373,16 @@ where } /// A BEEFY worker/voter that follows the BEEFY protocol -pub(crate) struct BeefyWorker { - pub base: BeefyWorkerBase, - - // utils +pub(crate) struct BeefyWorker { + // utilities + pub backend: Arc, + pub runtime: Arc, + pub key_store: BeefyKeystore, pub payload_provider: P, pub sync: Arc, // communication (created once, but returned and reused if worker is restarted/reinitialized) - pub comms: BeefyComms, + pub comms: BeefyComms, // channels /// Links between the block importer, the background voter and the RPC layer. @@ -592,9 +393,13 @@ pub(crate) struct BeefyWorker { pub pending_justifications: BTreeMap, BeefyVersionedFinalityProof>, /// Persisted voter state. pub persisted_state: PersistedState, + /// BEEFY voter metrics + pub metrics: Option, + /// Node runs under "Authority" role. + pub is_authority: bool, } -impl BeefyWorker +impl BeefyWorker where B: Block + Codec, BE: Backend, @@ -622,24 +427,29 @@ where validator_set: ValidatorSet, new_session_start: NumberFor, ) { - self.base - .init_session_at(&mut self.persisted_state, validator_set, new_session_start); + self.persisted_state.init_session_at( + new_session_start, + validator_set, + &self.key_store, + &self.metrics, + self.is_authority, + ); } fn handle_finality_notification( &mut self, notification: &FinalityNotification, ) -> Result<(), Error> { + let header = ¬ification.header; debug!( target: LOG_TARGET, - "🥩 Finality notification: header {:?} tree_route {:?}", - notification.header, + "🥩 Finality notification: header(number {:?}, hash {:?}) tree_route {:?}", + header.number(), + header.hash(), notification.tree_route, ); - let header = ¬ification.header; - self.base - .runtime + self.runtime .runtime_api() .beefy_genesis(header.hash()) .ok() @@ -653,7 +463,7 @@ where self.persisted_state.set_best_grandpa(header.clone()); // Check all (newly) finalized blocks for new session(s). - let backend = self.base.backend.clone(); + let backend = self.backend.clone(); for header in notification .tree_route .iter() @@ -672,7 +482,7 @@ where } if new_session_added { - crate::aux_schema::write_voter_state(&*self.base.backend, &self.persisted_state) + crate::aux_schema::write_voter_state(&*self.backend, &self.persisted_state) .map_err(|e| Error::Backend(e.to_string()))?; } @@ -706,7 +516,7 @@ where true, ); }, - RoundAction::Drop => metric_inc!(self.base.metrics, beefy_stale_votes), + RoundAction::Drop => metric_inc!(self.metrics, beefy_stale_votes), RoundAction::Enqueue => error!(target: LOG_TARGET, "🥩 unexpected vote: {:?}.", vote), }; Ok(()) @@ -726,23 +536,23 @@ where match self.voting_oracle().triage_round(block_num)? { RoundAction::Process => { debug!(target: LOG_TARGET, "🥩 Process justification for round: {:?}.", block_num); - metric_inc!(self.base.metrics, beefy_imported_justifications); + metric_inc!(self.metrics, beefy_imported_justifications); self.finalize(justification)? }, RoundAction::Enqueue => { debug!(target: LOG_TARGET, "🥩 Buffer justification for round: {:?}.", block_num); if self.pending_justifications.len() < MAX_BUFFERED_JUSTIFICATIONS { self.pending_justifications.entry(block_num).or_insert(justification); - metric_inc!(self.base.metrics, beefy_buffered_justifications); + metric_inc!(self.metrics, beefy_buffered_justifications); } else { - metric_inc!(self.base.metrics, beefy_buffered_justifications_dropped); + metric_inc!(self.metrics, beefy_buffered_justifications_dropped); warn!( target: LOG_TARGET, "🥩 Buffer justification dropped for round: {:?}.", block_num ); } }, - RoundAction::Drop => metric_inc!(self.base.metrics, beefy_stale_justifications), + RoundAction::Drop => metric_inc!(self.metrics, beefy_stale_justifications), }; Ok(()) } @@ -757,14 +567,14 @@ where match rounds.add_vote(vote) { VoteImportResult::RoundConcluded(signed_commitment) => { let finality_proof = VersionedFinalityProof::V1(signed_commitment); - info!( + debug!( target: LOG_TARGET, "🥩 Round #{} concluded, finality_proof: {:?}.", block_number, finality_proof ); // We created the `finality_proof` and know to be valid. // New state is persisted after finalization. self.finalize(finality_proof.clone())?; - metric_inc!(self.base.metrics, beefy_good_votes_processed); + metric_inc!(self.metrics, beefy_good_votes_processed); return Ok(Some(finality_proof)) }, VoteImportResult::Ok => { @@ -775,20 +585,17 @@ where .map(|(mandatory_num, _)| mandatory_num == block_number) .unwrap_or(false) { - crate::aux_schema::write_voter_state( - &*self.base.backend, - &self.persisted_state, - ) - .map_err(|e| Error::Backend(e.to_string()))?; + crate::aux_schema::write_voter_state(&*self.backend, &self.persisted_state) + .map_err(|e| Error::Backend(e.to_string()))?; } - metric_inc!(self.base.metrics, beefy_good_votes_processed); + metric_inc!(self.metrics, beefy_good_votes_processed); }, VoteImportResult::Equivocation(proof) => { - metric_inc!(self.base.metrics, beefy_equivocation_votes); + metric_inc!(self.metrics, beefy_equivocation_votes); self.report_equivocation(proof)?; }, - VoteImportResult::Invalid => metric_inc!(self.base.metrics, beefy_invalid_votes), - VoteImportResult::Stale => metric_inc!(self.base.metrics, beefy_stale_votes), + VoteImportResult::Invalid => metric_inc!(self.metrics, beefy_invalid_votes), + VoteImportResult::Stale => metric_inc!(self.metrics, beefy_stale_votes), }; Ok(None) } @@ -815,15 +622,14 @@ where // Set new best BEEFY block number. self.persisted_state.set_best_beefy(block_num); - crate::aux_schema::write_voter_state(&*self.base.backend, &self.persisted_state) + crate::aux_schema::write_voter_state(&*self.backend, &self.persisted_state) .map_err(|e| Error::Backend(e.to_string()))?; - metric_set!(self.base.metrics, beefy_best_block, block_num); + metric_set!(self.metrics, beefy_best_block, block_num); self.comms.on_demand_justifications.cancel_requests_older_than(block_num); if let Err(e) = self - .base .backend .blockchain() .expect_block_hash_from_id(&BlockId::Number(block_num)) @@ -833,8 +639,7 @@ where .notify(|| Ok::<_, ()>(hash)) .expect("forwards closure result; the closure always returns Ok; qed."); - self.base - .backend + self.backend .append_justification(hash, (BEEFY_ENGINE_ID, finality_proof.encode())) }) { debug!( @@ -871,13 +676,13 @@ where for (num, justification) in justifs_to_process.into_iter() { debug!(target: LOG_TARGET, "🥩 Handle buffered justification for: {:?}.", num); - metric_inc!(self.base.metrics, beefy_imported_justifications); + metric_inc!(self.metrics, beefy_imported_justifications); if let Err(err) = self.finalize(justification) { error!(target: LOG_TARGET, "🥩 Error finalizing block: {}", err); } } metric_set!( - self.base.metrics, + self.metrics, beefy_buffered_justifications, self.pending_justifications.len() ); @@ -889,7 +694,7 @@ where fn try_to_vote(&mut self) -> Result<(), Error> { // Vote if there's now a new vote target. if let Some(target) = self.voting_oracle().voting_target() { - metric_set!(self.base.metrics, beefy_should_vote_on, target); + metric_set!(self.metrics, beefy_should_vote_on, target); if target > self.persisted_state.best_voted { self.do_vote(target)?; } @@ -909,7 +714,6 @@ where self.persisted_state.voting_oracle.best_grandpa_block_header.clone() } else { let hash = self - .base .backend .blockchain() .expect_block_hash_from_id(&BlockId::Number(target_number)) @@ -921,7 +725,7 @@ where Error::Backend(err_msg) })?; - self.base.backend.blockchain().expect_header(hash).map_err(|err| { + self.backend.blockchain().expect_header(hash).map_err(|err| { let err_msg = format!( "Couldn't get header for block #{:?} ({:?}) (error: {:?}), skipping vote..", target_number, hash, err @@ -941,7 +745,7 @@ where let rounds = self.persisted_state.voting_oracle.active_rounds_mut()?; let (validators, validator_set_id) = (rounds.validators(), rounds.validator_set_id()); - let authority_id = if let Some(id) = self.base.key_store.authority_id(validators) { + let authority_id = if let Some(id) = self.key_store.authority_id(validators) { debug!(target: LOG_TARGET, "🥩 Local authority id: {:?}", id); id } else { @@ -955,7 +759,7 @@ where let commitment = Commitment { payload, block_number: target_number, validator_set_id }; let encoded_commitment = commitment.encode(); - let signature = match self.base.key_store.sign(&authority_id, &encoded_commitment) { + let signature = match self.key_store.sign(&authority_id, &encoded_commitment) { Ok(sig) => sig, Err(err) => { warn!(target: LOG_TARGET, "🥩 Error signing commitment: {:?}", err); @@ -980,7 +784,7 @@ where .gossip_engine .gossip_message(proofs_topic::(), encoded_proof, true); } else { - metric_inc!(self.base.metrics, beefy_votes_sent); + metric_inc!(self.metrics, beefy_votes_sent); debug!(target: LOG_TARGET, "🥩 Sent vote message: {:?}", vote); let encoded_vote = GossipMessage::::Vote(vote).encode(); self.comms.gossip_engine.gossip_message(votes_topic::(), encoded_vote, false); @@ -988,8 +792,8 @@ where // Persist state after vote to avoid double voting in case of voter restarts. self.persisted_state.best_voted = target_number; - metric_set!(self.base.metrics, beefy_best_voted, target_number); - crate::aux_schema::write_voter_state(&*self.base.backend, &self.persisted_state) + metric_set!(self.metrics, beefy_best_voted, target_number); + crate::aux_schema::write_voter_state(&*self.backend, &self.persisted_state) .map_err(|e| Error::Backend(e.to_string())) } @@ -1022,7 +826,7 @@ where mut self, block_import_justif: &mut Fuse>>, finality_notifications: &mut Fuse>, - ) -> (Error, BeefyComms) { + ) -> (Error, BeefyComms) { info!( target: LOG_TARGET, "🥩 run BEEFY worker, best grandpa: #{:?}.", @@ -1091,11 +895,8 @@ where }, ResponseInfo::PeerReport(peer_report) => { self.comms.gossip_engine.report(peer_report.who, peer_report.cost_benefit); - continue; - }, - ResponseInfo::Pending => { - continue; }, + ResponseInfo::Pending => {}, } }, justif = block_import_justif.next() => { @@ -1130,13 +931,6 @@ where break Error::VotesGossipStreamTerminated; } }, - // Process peer reports. - report = self.comms.gossip_report_stream.next() => { - if let Some(PeerReport { who, cost_benefit }) = report { - self.comms.gossip_engine.report(who, cost_benefit); - } - continue; - }, } // Act on changed 'state'. @@ -1163,16 +957,15 @@ where if !check_equivocation_proof::<_, _, BeefySignatureHasher>(&proof) { debug!(target: LOG_TARGET, "🥩 Skip report for bad equivocation {:?}", proof); return Ok(()) - } else if let Some(local_id) = self.base.key_store.authority_id(validators) { + } else if let Some(local_id) = self.key_store.authority_id(validators) { if offender_id == local_id { - debug!(target: LOG_TARGET, "🥩 Skip equivocation report for own equivocation"); + warn!(target: LOG_TARGET, "🥩 Skip equivocation report for own equivocation"); return Ok(()) } } let number = *proof.round_number(); let hash = self - .base .backend .blockchain() .expect_block_hash_from_id(&BlockId::Number(number)) @@ -1183,7 +976,7 @@ where ); Error::Backend(err_msg) })?; - let runtime_api = self.base.runtime.runtime_api(); + let runtime_api = self.runtime.runtime_api(); // generate key ownership proof at that block let key_owner_proof = match runtime_api .generate_key_ownership_proof(hash, validator_set_id, offender_id) @@ -1200,7 +993,7 @@ where }; // submit equivocation report at **best** block - let best_block_hash = self.base.backend.blockchain().info().best_hash; + let best_block_hash = self.backend.blockchain().info().best_hash; runtime_api .submit_report_equivocation_unsigned_extrinsic(best_block_hash, proof, key_owner_proof) .map_err(Error::RuntimeApi)?; @@ -1209,21 +1002,6 @@ where } } -/// Scan the `header` digest log for a BEEFY validator set change. Return either the new -/// validator set or `None` in case no validator set change has been signaled. -pub(crate) fn find_authorities_change(header: &B::Header) -> Option> -where - B: Block, -{ - let id = OpaqueDigestItemId::Consensus(&BEEFY_ENGINE_ID); - - let filter = |log: ConsensusLog| match log { - ConsensusLog::AuthoritiesChange(validator_set) => Some(validator_set), - _ => None, - }; - header.digest().convert_first(|l| l.try_to(id).and_then(filter)) -} - /// Calculate next block number to vote on. /// /// Return `None` if there is no votable target yet. @@ -1234,7 +1012,7 @@ where // if the mandatory block (session_start) does not have a beefy justification yet, // we vote on it let target = if best_beefy < session_start { - debug!(target: LOG_TARGET, "🥩 vote target - mandatory block: #{:?}", session_start,); + debug!(target: LOG_TARGET, "🥩 vote target - mandatory block: #{:?}", session_start); session_start } else { let diff = best_grandpa.saturating_sub(best_beefy) + 1u32.into(); @@ -1264,7 +1042,11 @@ where pub(crate) mod tests { use super::*; use crate::{ - communication::notification::{BeefyBestBlockStream, BeefyVersionedFinalityProofStream}, + communication::{ + gossip::{tests::TestNetwork, GossipValidator}, + notification::{BeefyBestBlockStream, BeefyVersionedFinalityProofStream}, + request_response::outgoing_requests_engine::OnDemandJustificationsEngine, + }, tests::{ create_beefy_keystore, get_beefy_streams, make_beefy_ids, BeefyPeer, BeefyTestNet, TestApi, @@ -1274,12 +1056,16 @@ pub(crate) mod tests { use futures::{future::poll_fn, task::Poll}; use parking_lot::Mutex; use sc_client_api::{Backend as BackendT, HeaderBackend}; + use sc_network_gossip::GossipEngine; use sc_network_sync::SyncingService; use sc_network_test::TestNetFactory; use sp_blockchain::Backend as BlockchainBackendT; use sp_consensus_beefy::{ - generate_equivocation_proof, known_payloads, known_payloads::MMR_ROOT_ID, - mmr::MmrRootProvider, Keyring, Payload, SignedCommitment, + known_payloads, + known_payloads::MMR_ROOT_ID, + mmr::MmrRootProvider, + test_utils::{generate_equivocation_proof, Keyring}, + ConsensusLog, Payload, SignedCommitment, }; use sp_runtime::traits::{Header as HeaderT, One}; use substrate_test_runtime_client::{ @@ -1288,10 +1074,6 @@ pub(crate) mod tests { }; impl PersistedState { - pub fn voting_oracle(&self) -> &VoterOracle { - &self.voting_oracle - } - pub fn active_round(&self) -> Result<&Rounds, Error> { self.voting_oracle.active_rounds() } @@ -1309,7 +1091,7 @@ pub(crate) mod tests { fn create_beefy_worker( peer: &mut BeefyPeer, - key: &Keyring, + key: &Keyring, min_block_delta: u32, genesis_validator_set: ValidatorSet, ) -> BeefyWorker< @@ -1318,8 +1100,9 @@ pub(crate) mod tests { MmrRootProvider, TestApi, Arc>, + TestNetwork, > { - let keystore = create_beefy_keystore(*key); + let keystore = create_beefy_keystore(key); let (to_rpc_justif_sender, from_voter_justif_stream) = BeefyVersionedFinalityProofStream::::channel(); @@ -1347,7 +1130,8 @@ pub(crate) mod tests { .take_notification_service(&crate::tests::beefy_gossip_proto_name()) .unwrap(); let known_peers = Arc::new(Mutex::new(KnownPeers::new())); - let (gossip_validator, gossip_report_stream) = GossipValidator::new(known_peers.clone()); + let gossip_validator = + GossipValidator::new(known_peers.clone(), Arc::new(TestNetwork::new().0)); let gossip_validator = Arc::new(gossip_validator); let gossip_engine = GossipEngine::new( network.clone(), @@ -1380,26 +1164,19 @@ pub(crate) mod tests { ) .unwrap(); let payload_provider = MmrRootProvider::new(api.clone()); - let comms = BeefyComms { - gossip_engine, - gossip_validator, - gossip_report_stream, - on_demand_justifications, - }; + let comms = BeefyComms { gossip_engine, gossip_validator, on_demand_justifications }; BeefyWorker { - base: BeefyWorkerBase { - backend, - runtime: api, - key_store: Some(keystore).into(), - metrics, - _phantom: Default::default(), - }, + backend, + runtime: api, + key_store: Some(keystore).into(), + metrics, payload_provider, sync: Arc::new(sync), links, comms, pending_justifications: BTreeMap::new(), persisted_state, + is_authority: true, } } @@ -1663,29 +1440,6 @@ pub(crate) mod tests { assert_eq!(extracted, Some(validator_set)); } - #[tokio::test] - async fn keystore_vs_validator_set() { - let keys = &[Keyring::Alice]; - let validator_set = ValidatorSet::new(make_beefy_ids(keys), 0).unwrap(); - let mut net = BeefyTestNet::new(1); - let mut worker = create_beefy_worker(net.peer(0), &keys[0], 1, validator_set.clone()); - - // keystore doesn't contain other keys than validators' - assert_eq!(worker.base.verify_validator_set(&1, &validator_set), Ok(())); - - // unknown `Bob` key - let keys = &[Keyring::Bob]; - let validator_set = ValidatorSet::new(make_beefy_ids(keys), 0).unwrap(); - let err_msg = "no authority public key found in store".to_string(); - let expected = Err(Error::Keystore(err_msg)); - assert_eq!(worker.base.verify_validator_set(&1, &validator_set), expected); - - // worker has no keystore - worker.base.key_store = None.into(); - let expected_err = Err(Error::Keystore("no Keystore".into())); - assert_eq!(worker.base.verify_validator_set(&1, &validator_set), expected_err); - } - #[tokio::test] async fn should_finalize_correctly() { let keys = [Keyring::Alice]; @@ -1835,7 +1589,7 @@ pub(crate) mod tests { let mut net = BeefyTestNet::new(1); let mut worker = create_beefy_worker(net.peer(0), &keys[0], 1, validator_set.clone()); - worker.base.runtime = api_alice.clone(); + worker.runtime = api_alice.clone(); // let there be a block with num = 1: let _ = net.peer(0).push_blocks(1, false); diff --git a/substrate/client/consensus/common/Cargo.toml b/substrate/client/consensus/common/Cargo.toml index 16d3a4a1441ffcf0986ea9ee0418a770ded4a60d..6d642ec78fefa88692503152595f8548d715426c 100644 --- a/substrate/client/consensus/common/Cargo.toml +++ b/substrate/client/consensus/common/Cargo.toml @@ -6,7 +6,7 @@ edition.workspace = true license = "GPL-3.0-or-later WITH Classpath-exception-2.0" homepage = "https://substrate.io" repository.workspace = true -description = "Collection of common consensus specific imlementations for Substrate (client)" +description = "Collection of common consensus specific implementations for Substrate (client)" readme = "README.md" [lints] @@ -16,17 +16,17 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -async-trait = "0.1.74" -futures = { version = "0.3.21", features = ["thread-pool"] } +async-trait = "0.1.79" +futures = { version = "0.3.30", features = ["thread-pool"] } futures-timer = "3.0.1" -libp2p-identity = { version = "0.1.3", features = ["ed25519", "peerid"] } -log = "0.4.17" +log = { workspace = true, default-features = true } mockall = "0.11.3" parking_lot = "0.12.1" -serde = { version = "1.0", features = ["derive"] } -thiserror = "1.0.48" +serde = { features = ["derive"], workspace = true, default-features = true } +thiserror = { workspace = true } prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../../utils/prometheus" } sc-client-api = { path = "../../api" } +sc-network-types = { path = "../../network/types" } sc-utils = { path = "../../utils" } sp-api = { path = "../../../primitives/api" } sp-blockchain = { path = "../../../primitives/blockchain" } diff --git a/substrate/client/consensus/common/src/import_queue.rs b/substrate/client/consensus/common/src/import_queue.rs index 39d5bf8ed35d17468a8d8819a423f22a0d80667c..371465536c35a5feea5d6e157eb3ee8b019b94db 100644 --- a/substrate/client/consensus/common/src/import_queue.rs +++ b/substrate/client/consensus/common/src/import_queue.rs @@ -64,7 +64,7 @@ pub type BoxJustificationImport = Box + Send + Sync>; /// Maps to the RuntimeOrigin used by the network. -pub type RuntimeOrigin = libp2p_identity::PeerId; +pub type RuntimeOrigin = sc_network_types::PeerId; /// Block data used by the queue. #[derive(Debug, PartialEq, Eq, Clone)] @@ -133,7 +133,7 @@ pub trait ImportQueue: Send { /// Start asynchronous runner for import queue. /// /// Takes an object implementing [`Link`] which allows the import queue to - /// influece the synchronization process. + /// influence the synchronization process. async fn run(self, link: Box>); } diff --git a/substrate/client/consensus/common/src/import_queue/basic_queue.rs b/substrate/client/consensus/common/src/import_queue/basic_queue.rs index 1cc7ec26fd1930100ebe45f9c1e8ba643bd5be37..f4f618d1b31825e17987130b20a96c21e475b098 100644 --- a/substrate/client/consensus/common/src/import_queue/basic_queue.rs +++ b/substrate/client/consensus/common/src/import_queue/basic_queue.rs @@ -187,7 +187,7 @@ impl ImportQueue for BasicQueue { /// Start asynchronous runner for import queue. /// /// Takes an object implementing [`Link`] which allows the import queue to - /// influece the synchronization process. + /// influence the synchronization process. async fn run(mut self, mut link: Box>) { loop { if let Err(_) = self.result_port.next_action(&mut *link).await { @@ -198,7 +198,7 @@ impl ImportQueue for BasicQueue { } } -/// Messages destinated to the background worker. +/// Messages designated to the background worker. mod worker_messages { use super::*; @@ -632,7 +632,7 @@ mod tests { let hash = Hash::random(); finality_sender .unbounded_send(worker_messages::ImportJustification( - libp2p_identity::PeerId::random(), + sc_network_types::PeerId::random(), hash, 1, (*b"TEST", Vec::new()), diff --git a/substrate/client/consensus/epochs/src/lib.rs b/substrate/client/consensus/epochs/src/lib.rs index 29bb18e147c2b8aef2a172130e753bf0d2f7193d..bbc143b7bd302aec2f45f868c48ab9f7dd7ff58f 100644 --- a/substrate/client/consensus/epochs/src/lib.rs +++ b/substrate/client/consensus/epochs/src/lib.rs @@ -326,7 +326,7 @@ impl AsRef for IncrementedEpoch { /// /// The first epoch, epoch_0, is special cased by saying that it starts at /// slot number of the first block in the chain. When bootstrapping a chain, -/// there can be multiple competing block #1s, so we have to ensure that the overlayed +/// there can be multiple competing block #1s, so we have to ensure that the overlaid /// DAG doesn't get confused. /// /// The first block of every epoch should be producing a descriptor for the next @@ -655,7 +655,7 @@ where /// Revert to a specified block given its `hash` and `number`. /// This removes all the epoch changes information that were announced by - /// all the given block descendents. + /// all the given block descendants. pub fn revert>( &mut self, descendent_of_builder: D, diff --git a/substrate/client/consensus/grandpa/Cargo.toml b/substrate/client/consensus/grandpa/Cargo.toml index 3f7b48d9f2d0d2202170818d41d4730dcfb0bfa8..e59c17b0680374d7195e823514d02f807f6f3cbf 100644 --- a/substrate/client/consensus/grandpa/Cargo.toml +++ b/substrate/client/consensus/grandpa/Cargo.toml @@ -19,17 +19,17 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] ahash = "0.8.2" array-bytes = "6.1" -async-trait = "0.1.74" +async-trait = "0.1.79" dyn-clone = "1.0" finality-grandpa = { version = "0.16.2", features = ["derive-codec"] } -futures = "0.3.21" +futures = "0.3.30" futures-timer = "3.0.1" -log = "0.4.17" +log = { workspace = true, default-features = true } parity-scale-codec = { version = "3.6.1", features = ["derive"] } parking_lot = "0.12.1" rand = "0.8.5" -serde_json = "1.0.111" -thiserror = "1.0" +serde_json = { workspace = true, default-features = true } +thiserror = { workspace = true } fork-tree = { path = "../../../utils/fork-tree" } prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../../utils/prometheus" } sc-block-builder = { path = "../../block-builder" } @@ -41,6 +41,7 @@ sc-network = { path = "../../network" } sc-network-gossip = { path = "../../network-gossip" } sc-network-common = { path = "../../network/common" } sc-network-sync = { path = "../../network/sync" } +sc-network-types = { path = "../../network/types" } sc-telemetry = { path = "../../telemetry" } sc-utils = { path = "../../utils" } sp-api = { path = "../../../primitives/api" } @@ -57,8 +58,8 @@ sp-runtime = { path = "../../../primitives/runtime" } [dev-dependencies] assert_matches = "1.3.0" finality-grandpa = { version = "0.16.2", features = ["derive-codec", "test-helpers"] } -serde = "1.0.195" -tokio = "1.22.0" +serde = { workspace = true, default-features = true } +tokio = "1.37" sc-network = { path = "../../network" } sc-network-test = { path = "../../network/test" } sp-keyring = { path = "../../../primitives/keyring" } diff --git a/substrate/client/consensus/grandpa/rpc/Cargo.toml b/substrate/client/consensus/grandpa/rpc/Cargo.toml index ae9ab5d9d0794872c28f60f9694ee719c103d74e..0789a429ac416de70201e30e909d4f3dec7e4a66 100644 --- a/substrate/client/consensus/grandpa/rpc/Cargo.toml +++ b/substrate/client/consensus/grandpa/rpc/Cargo.toml @@ -14,12 +14,12 @@ workspace = true [dependencies] finality-grandpa = { version = "0.16.2", features = ["derive-codec"] } -futures = "0.3.16" -jsonrpsee = { version = "0.20.3", features = ["client-core", "macros", "server"] } -log = "0.4.8" +futures = "0.3.30" +jsonrpsee = { version = "0.22", features = ["client-core", "macros", "server"] } +log = { workspace = true, default-features = true } parity-scale-codec = { version = "3.6.1", features = ["derive"] } -serde = { version = "1.0.195", features = ["derive"] } -thiserror = "1.0" +serde = { features = ["derive"], workspace = true, default-features = true } +thiserror = { workspace = true } sc-client-api = { path = "../../../api" } sc-consensus-grandpa = { path = ".." } sc-rpc = { path = "../../../rpc" } diff --git a/substrate/client/consensus/grandpa/rpc/src/lib.rs b/substrate/client/consensus/grandpa/rpc/src/lib.rs index 878cefacc479a1a221f3631db574c9191e520824..0557eab93e2956b56956f50edea118c9c30cbd76 100644 --- a/substrate/client/consensus/grandpa/rpc/src/lib.rs +++ b/substrate/client/consensus/grandpa/rpc/src/lib.rs @@ -273,7 +273,7 @@ mod tests { let request = r#"{"jsonrpc":"2.0","method":"grandpa_roundState","params":[],"id":0}"#; let (response, _) = rpc.raw_json_request(&request, 1).await.unwrap(); - assert_eq!(expected_response, response.result); + assert_eq!(expected_response, response); } #[tokio::test] @@ -295,7 +295,7 @@ mod tests { let request = r#"{"jsonrpc":"2.0","method":"grandpa_roundState","params":[],"id":0}"#; let (response, _) = rpc.raw_json_request(&request, 1).await.unwrap(); - assert_eq!(expected_response, response.result); + assert_eq!(expected_response, response); } #[tokio::test] @@ -317,7 +317,7 @@ mod tests { .unwrap(); let expected = r#"{"jsonrpc":"2.0","result":false,"id":1}"#; - assert_eq!(response.result, expected); + assert_eq!(response, expected); } fn create_justification() -> GrandpaJustification { diff --git a/substrate/client/consensus/grandpa/src/communication/gossip.rs b/substrate/client/consensus/grandpa/src/communication/gossip.rs index 3a78b157d5b1bcb00b7ff83afb407a0015ed529f..88821faf0aba1a67ea65fe0e2a553e89eac40f47 100644 --- a/substrate/client/consensus/grandpa/src/communication/gossip.rs +++ b/substrate/client/consensus/grandpa/src/communication/gossip.rs @@ -90,9 +90,10 @@ use log::{debug, trace}; use parity_scale_codec::{Decode, DecodeAll, Encode}; use prometheus_endpoint::{register, CounterVec, Opts, PrometheusError, Registry, U64}; use rand::seq::SliceRandom; -use sc_network::{PeerId, ReputationChange}; +use sc_network::ReputationChange; use sc_network_common::role::ObservedRole; use sc_network_gossip::{MessageIntent, ValidatorContext}; +use sc_network_types::PeerId; use sc_telemetry::{telemetry, TelemetryHandle, CONSENSUS_DEBUG}; use sc_utils::mpsc::{tracing_unbounded, TracingUnboundedReceiver, TracingUnboundedSender}; use sp_consensus_grandpa::AuthorityId; diff --git a/substrate/client/consensus/grandpa/src/communication/mod.rs b/substrate/client/consensus/grandpa/src/communication/mod.rs index 5c7e1276297a988b3109ae650e121331f57f930d..cf78e1d4cf089a1097d662756bcf05f5528b48e0 100644 --- a/substrate/client/consensus/grandpa/src/communication/mod.rs +++ b/substrate/client/consensus/grandpa/src/communication/mod.rs @@ -222,13 +222,13 @@ pub(crate) struct NetworkBridge, S: Syncing> { neighbor_sender: periodic::NeighborPacketSender, /// `NeighborPacketWorker` processing packets sent through the `NeighborPacketSender`. - // `NetworkBridge` is required to be cloneable, thus one needs to be able to clone its + // `NetworkBridge` is required to be clonable, thus one needs to be able to clone its // children, thus one has to wrap `neighbor_packet_worker` with an `Arc` `Mutex`. neighbor_packet_worker: Arc>>, /// Receiver side of the peer report stream populated by the gossip validator, forwarded to the /// gossip engine. - // `NetworkBridge` is required to be cloneable, thus one needs to be able to clone its + // `NetworkBridge` is required to be clonable, thus one needs to be able to clone its // children, thus one has to wrap gossip_validator_report_stream with an `Arc` `Mutex`. Given // that it is just an `UnboundedReceiver`, one could also switch to a // multi-producer-*multi*-consumer channel implementation. @@ -488,7 +488,7 @@ impl, S: Syncing> NetworkBridge { /// connected to (NOTE: this assumption will change in the future #3629). pub(crate) fn set_sync_fork_request( &self, - peers: Vec, + peers: Vec, hash: B::Hash, number: NumberFor, ) { @@ -766,7 +766,7 @@ impl Sink> for OutgoingMessages { ) .ok_or_else(|| { Error::Signing(format!( - "Failed to sign GRANDPA vote for round {} targetting {:?}", + "Failed to sign GRANDPA vote for round {} targeting {:?}", self.round, target_hash )) })?; diff --git a/substrate/client/consensus/grandpa/src/communication/periodic.rs b/substrate/client/consensus/grandpa/src/communication/periodic.rs index daa752920287971ee986ae5c65fb995b52187495..70218ea33b4ed2d1fbe649ff04b7b9ca676d2a4d 100644 --- a/substrate/client/consensus/grandpa/src/communication/periodic.rs +++ b/substrate/client/consensus/grandpa/src/communication/periodic.rs @@ -27,7 +27,7 @@ use std::{ time::Duration, }; -use sc_network::PeerId; +use sc_network_types::PeerId; use sc_utils::mpsc::{tracing_unbounded, TracingUnboundedReceiver, TracingUnboundedSender}; use sp_runtime::traits::{Block as BlockT, NumberFor}; @@ -44,7 +44,7 @@ impl NeighborPacketSender { /// Send a neighbor packet for the background worker to gossip to peers. pub fn send( &self, - who: Vec, + who: Vec, neighbor_packet: NeighborPacket>, ) { if let Err(err) = self.0.unbounded_send((who, neighbor_packet)) { @@ -106,7 +106,7 @@ impl Stream for NeighborPacketWorker { // Make sure the underlying task is scheduled for wake-up. // - // Note: In case poll_unpin is called after the resetted delay fires again, this + // Note: In case poll_unpin is called after the reset delay fires again, this // will drop one tick. Deemed as very unlikely and also not critical. while this.delay.poll_unpin(cx).is_ready() {} diff --git a/substrate/client/consensus/grandpa/src/communication/tests.rs b/substrate/client/consensus/grandpa/src/communication/tests.rs index fe24fb3cb20ea055e8ebfe385a974f57af5e4396..40d901b2fec68449a29e6f4c2cf6ea03fa504a9e 100644 --- a/substrate/client/consensus/grandpa/src/communication/tests.rs +++ b/substrate/client/consensus/grandpa/src/communication/tests.rs @@ -30,14 +30,14 @@ use sc_network::{ event::Event as NetworkEvent, service::traits::{Direction, MessageSink, NotificationEvent, NotificationService}, types::ProtocolName, - Multiaddr, NetworkBlock, NetworkEventStream, NetworkNotification, NetworkPeers, - NetworkSyncForkRequest, NotificationSenderError, NotificationSenderT as NotificationSender, - PeerId, ReputationChange, + Multiaddr, NetworkBlock, NetworkEventStream, NetworkPeers, NetworkSyncForkRequest, + ReputationChange, }; use sc_network_common::role::{ObservedRole, Roles}; use sc_network_gossip::Validator; use sc_network_sync::{SyncEvent as SyncStreamEvent, SyncEventStream}; use sc_network_test::{Block, Hash}; +use sc_network_types::PeerId; use sc_utils::mpsc::{tracing_unbounded, TracingUnboundedReceiver, TracingUnboundedSender}; use sp_consensus_grandpa::AuthorityList; use sp_keyring::Ed25519Keyring; @@ -62,6 +62,7 @@ pub(crate) struct TestNetwork { sender: TracingUnboundedSender, } +#[async_trait::async_trait] impl NetworkPeers for TestNetwork { fn set_authorized_peers(&self, _peers: HashSet) { unimplemented!(); @@ -134,6 +135,10 @@ impl NetworkPeers for TestNetwork { .ok() .and_then(|role| Some(ObservedRole::from(role))) } + + async fn reserved_peers(&self) -> Result, ()> { + unimplemented!(); + } } impl NetworkEventStream for TestNetwork { @@ -147,24 +152,6 @@ impl NetworkEventStream for TestNetwork { } } -impl NetworkNotification for TestNetwork { - fn write_notification(&self, target: PeerId, _protocol: ProtocolName, message: Vec) { - let _ = self.sender.unbounded_send(Event::WriteNotification(target, message)); - } - - fn notification_sender( - &self, - _target: PeerId, - _protocol: ProtocolName, - ) -> Result, NotificationSenderError> { - unimplemented!(); - } - - fn set_notification_handshake(&self, _protocol: ProtocolName, _handshake: Vec) { - unimplemented!(); - } -} - impl NetworkBlock> for TestNetwork { fn announce_block(&self, hash: Hash, _data: Option>) { let _ = self.sender.unbounded_send(Event::Announce(hash)); @@ -185,12 +172,7 @@ impl sc_network_gossip::ValidatorContext for TestNetwork { fn broadcast_message(&mut self, _: Hash, _: Vec, _: bool) {} fn send_message(&mut self, who: &PeerId, data: Vec) { - ::write_notification( - self, - *who, - grandpa_protocol_name::NAME.into(), - data, - ); + let _ = self.sender.unbounded_send(Event::WriteNotification(*who, data)); } fn send_topic(&mut self, _: &PeerId, _: Hash, _: bool) {} @@ -241,13 +223,13 @@ impl NotificationService for TestNotificationService { } /// Send synchronous `notification` to `peer`. - fn send_sync_notification(&self, peer: &PeerId, notification: Vec) { + fn send_sync_notification(&mut self, peer: &PeerId, notification: Vec) { let _ = self.sender.unbounded_send(Event::WriteNotification(*peer, notification)); } /// Send asynchronous `notification` to `peer`, allowing sender to exercise backpressure. async fn send_async_notification( - &self, + &mut self, _peer: &PeerId, _notification: Vec, ) -> Result<(), sc_network::error::Error> { diff --git a/substrate/client/consensus/grandpa/src/lib.rs b/substrate/client/consensus/grandpa/src/lib.rs index b7cfc9f5b6019a5cea789dfcf385d7efc4e196e7..03452bd07c757fa9dac9b130a149aa264eb04834 100644 --- a/substrate/client/consensus/grandpa/src/lib.rs +++ b/substrate/client/consensus/grandpa/src/lib.rs @@ -67,7 +67,7 @@ use sc_client_api::{ BlockchainEvents, CallExecutor, ExecutorProvider, Finalizer, LockImportRun, StorageProvider, }; use sc_consensus::BlockImport; -use sc_network::{types::ProtocolName, NotificationService}; +use sc_network::{types::ProtocolName, NetworkBackend, NotificationService}; use sc_telemetry::{telemetry, TelemetryHandle, CONSENSUS_DEBUG, CONSENSUS_INFO}; use sc_transaction_pool_api::OffchainTransactionPoolFactory; use sc_utils::mpsc::{tracing_unbounded, TracingUnboundedReceiver}; @@ -343,7 +343,7 @@ pub(crate) trait BlockSyncRequester { /// connected to (NOTE: this assumption will change in the future #3629). fn set_sync_fork_request( &self, - peers: Vec, + peers: Vec, hash: Block::Hash, number: NumberFor, ); @@ -357,7 +357,7 @@ where { fn set_sync_fork_request( &self, - peers: Vec, + peers: Vec, hash: Block::Hash, number: NumberFor, ) { @@ -707,11 +707,13 @@ pub struct GrandpaParams { /// Returns the configuration value to put in /// [`sc_network::config::FullNetworkConfiguration`]. /// For standard protocol name see [`crate::protocol_standard_name`]. -pub fn grandpa_peers_set_config( +pub fn grandpa_peers_set_config::Hash>>( protocol_name: ProtocolName, -) -> (sc_network::config::NonDefaultSetConfig, Box) { + metrics: sc_network::service::NotificationMetrics, + peer_store_handle: Arc, +) -> (N::NotificationProtocolConfig, Box) { use communication::grandpa_protocol_name; - sc_network::config::NonDefaultSetConfig::new( + N::notification_config( protocol_name, grandpa_protocol_name::LEGACY_NAMES.iter().map(|&n| n.into()).collect(), // Notifications reach ~256kiB in size at the time of writing on Kusama and Polkadot. @@ -723,6 +725,8 @@ pub fn grandpa_peers_set_config( reserved_nodes: Vec::new(), non_reserved_mode: sc_network::config::NonReservedPeerMode::Deny, }, + metrics, + peer_store_handle, ) } diff --git a/substrate/client/consensus/grandpa/src/observer.rs b/substrate/client/consensus/grandpa/src/observer.rs index 608ff5e46a0e825a6b7480a29258574f121e4aa2..90ad63ac78f3bec75dcc2faa6ce810573dbb9a95 100644 --- a/substrate/client/consensus/grandpa/src/observer.rs +++ b/substrate/client/consensus/grandpa/src/observer.rs @@ -410,7 +410,7 @@ mod tests { communication::tests::{make_test_network, Event}, }; use assert_matches::assert_matches; - use sc_network::PeerId; + use sc_network_types::PeerId; use sc_utils::mpsc::tracing_unbounded; use sp_blockchain::HeaderBackend as _; use substrate_test_runtime_client::{TestClientBuilder, TestClientBuilderExt}; diff --git a/substrate/client/consensus/grandpa/src/tests.rs b/substrate/client/consensus/grandpa/src/tests.rs index 7e42c2d45c733b8cbc32a599680202399fadaed6..14708cc89e890bd3fe7963589010896f78bb6ab1 100644 --- a/substrate/client/consensus/grandpa/src/tests.rs +++ b/substrate/client/consensus/grandpa/src/tests.rs @@ -1805,7 +1805,7 @@ async fn grandpa_environment_checks_if_best_block_is_descendent_of_finality_targ ); // best block is higher than finality target and it's on the same fork, - // the best block passed to the voting rule should not be overriden + // the best block passed to the voting rule should not be overridden select_chain.set_best_chain(client.expect_header(hashof10_a).unwrap()); select_chain.set_finality_target(client.expect_header(hashof5_a).unwrap().hash()); voting_rule.set_expected_best_block(hashof10_a); @@ -1940,7 +1940,7 @@ async fn justification_with_equivocation() { precommits.push(precommit); } - // we create an equivocation for the 67th validator targetting blocks #1 and #2. + // we create an equivocation for the 67th validator targeting blocks #1 and #2. // this should be accounted as "voting for all blocks" and therefore block #3 will // have 67/100 votes, reaching finality threshold. { diff --git a/substrate/client/consensus/grandpa/src/until_imported.rs b/substrate/client/consensus/grandpa/src/until_imported.rs index 14f32ecc883662d9d690b75611657cef0aa797e6..4103ee5279251d648f9e97168b952c582237d433 100644 --- a/substrate/client/consensus/grandpa/src/until_imported.rs +++ b/substrate/client/consensus/grandpa/src/until_imported.rs @@ -632,7 +632,7 @@ mod tests { impl BlockSyncRequesterT for TestBlockSyncRequester { fn set_sync_fork_request( &self, - _peers: Vec, + _peers: Vec, hash: Hash, number: NumberFor, ) { @@ -1002,7 +1002,7 @@ mod tests { } #[test] - fn block_global_message_wait_completed_return_none_on_block_number_missmatch() { + fn block_global_message_wait_completed_return_none_on_block_number_mismatch() { let msg_inner = test_catch_up(); let waiting_block_1 = diff --git a/substrate/client/consensus/grandpa/src/voting_rule.rs b/substrate/client/consensus/grandpa/src/voting_rule.rs index e09780739c7353418a81488a25060eba0231ebfc..c37596d20f68625b21f443e16db3c03fc08357da 100644 --- a/substrate/client/consensus/grandpa/src/voting_rule.rs +++ b/substrate/client/consensus/grandpa/src/voting_rule.rs @@ -196,7 +196,7 @@ where target_header = backend .header(target_hash) .ok()? - .expect("Header known to exist due to the existence of one of its descendents; qed"); + .expect("Header known to exist due to the existence of one of its descendants; qed"); } } diff --git a/substrate/client/consensus/grandpa/src/warp_proof.rs b/substrate/client/consensus/grandpa/src/warp_proof.rs index 29111712ec382ec6758fddcfa670d4edd2a9a7eb..7169a424c14a7726efa9531b80ef13f829bc9529 100644 --- a/substrate/client/consensus/grandpa/src/warp_proof.rs +++ b/substrate/client/consensus/grandpa/src/warp_proof.rs @@ -249,7 +249,7 @@ impl> NetworkProvider: BlockNumberOps, { - /// Create a new istance for a given backend and authority set. + /// Create a new instance for a given backend and authority set. pub fn new( backend: Arc, authority_set: SharedAuthoritySet>, diff --git a/substrate/client/consensus/manual-seal/Cargo.toml b/substrate/client/consensus/manual-seal/Cargo.toml index 0094fb8780095b355e9fe621f90f9d090d1c5eec..1422d46105b22bd093de3260e3e13219aa2731a9 100644 --- a/substrate/client/consensus/manual-seal/Cargo.toml +++ b/substrate/client/consensus/manual-seal/Cargo.toml @@ -16,15 +16,15 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -jsonrpsee = { version = "0.20.3", features = ["client-core", "macros", "server"] } +jsonrpsee = { version = "0.22", features = ["client-core", "macros", "server"] } assert_matches = "1.3.0" -async-trait = "0.1.74" +async-trait = "0.1.79" codec = { package = "parity-scale-codec", version = "3.6.1" } -futures = "0.3.21" +futures = "0.3.30" futures-timer = "3.0.1" -log = "0.4.17" -serde = { version = "1.0", features = ["derive"] } -thiserror = "1.0" +log = { workspace = true, default-features = true } +serde = { features = ["derive"], workspace = true, default-features = true } +thiserror = { workspace = true } prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../../utils/prometheus" } sc-client-api = { path = "../../api" } sc-consensus = { path = "../common" } diff --git a/substrate/client/consensus/manual-seal/src/consensus/babe.rs b/substrate/client/consensus/manual-seal/src/consensus/babe.rs index 26fa81459808c39635a1970b0fef7b36774803a9..bc56ce0227142fee2c001c39ce8d31cd9e6fb9b5 100644 --- a/substrate/client/consensus/manual-seal/src/consensus/babe.rs +++ b/substrate/client/consensus/manual-seal/src/consensus/babe.rs @@ -82,7 +82,7 @@ pub struct BabeVerifier { } impl BabeVerifier { - /// create a nrew verifier + /// create a new verifier pub fn new(epoch_changes: SharedEpochChanges, client: Arc) -> BabeVerifier { BabeVerifier { epoch_changes, client } } diff --git a/substrate/client/consensus/manual-seal/src/lib.rs b/substrate/client/consensus/manual-seal/src/lib.rs index e3608f6716c2631e5079c08e59ef991903b12d73..c3d360f071974ab38c6f1d112c23d6705f937bd3 100644 --- a/substrate/client/consensus/manual-seal/src/lib.rs +++ b/substrate/client/consensus/manual-seal/src/lib.rs @@ -429,7 +429,9 @@ mod tests { sender, } }); - let future = run_manual_seal(ManualSealParams { + + // spawn the background authorship task + tokio::spawn(run_manual_seal(ManualSealParams { block_import: client.clone(), env, client: client.clone(), @@ -438,12 +440,8 @@ mod tests { select_chain, create_inherent_data_providers: |_, _| async { Ok(()) }, consensus_data_provider: None, - }); - std::thread::spawn(|| { - let rt = tokio::runtime::Runtime::new().unwrap(); - // spawn the background authorship task - rt.block_on(future); - }); + })); + // submit a transaction to pool. let result = pool.submit_one(genesis_hash, SOURCE, uxt(Alice, 0)).await; // assert that it was successfully imported @@ -469,7 +467,10 @@ mod tests { assert_eq!(client.header(created_block.hash).unwrap().unwrap().number, 1) } - #[tokio::test] + // TODO: enable once the flakiness is fixed + // See https://github.com/paritytech/polkadot-sdk/issues/3603 + //#[tokio::test] + #[allow(unused)] async fn instant_seal_delayed_finalize() { let builder = TestClientBuilder::new(); let (client, select_chain) = builder.build_with_longest_chain(); @@ -507,7 +508,8 @@ mod tests { } }); - let future_instant_seal = run_manual_seal(ManualSealParams { + // spawn the background authorship task + tokio::spawn(run_manual_seal(ManualSealParams { block_import: client.clone(), commands_stream, env, @@ -516,24 +518,16 @@ mod tests { select_chain, create_inherent_data_providers: |_, _| async { Ok(()) }, consensus_data_provider: None, - }); - std::thread::spawn(|| { - let rt = tokio::runtime::Runtime::new().unwrap(); - // spawn the background authorship task - rt.block_on(future_instant_seal); - }); + })); let delay_sec = 5; - let future_delayed_finalize = run_delayed_finalize(DelayedFinalizeParams { + + // spawn the background finality task + tokio::spawn(run_delayed_finalize(DelayedFinalizeParams { client: client.clone(), delay_sec, spawn_handle: spawner, - }); - std::thread::spawn(|| { - let rt = tokio::runtime::Runtime::new().unwrap(); - // spawn the background authorship task - rt.block_on(future_delayed_finalize); - }); + })); let mut finality_stream = client.finality_notification_stream(); // submit a transaction to pool. @@ -589,7 +583,9 @@ mod tests { // this test checks that blocks are created as soon as an engine command is sent over the // stream. let (mut sink, commands_stream) = futures::channel::mpsc::channel(1024); - let future = run_manual_seal(ManualSealParams { + + // spawn the background authorship task + tokio::spawn(run_manual_seal(ManualSealParams { block_import: client.clone(), env, client: client.clone(), @@ -598,12 +594,8 @@ mod tests { select_chain, consensus_data_provider: None, create_inherent_data_providers: |_, _| async { Ok(()) }, - }); - std::thread::spawn(|| { - let rt = tokio::runtime::Runtime::new().unwrap(); - // spawn the background authorship task - rt.block_on(future); - }); + })); + // submit a transaction to pool. let result = pool.submit_one(genesis_hash, SOURCE, uxt(Alice, 0)).await; // assert that it was successfully imported @@ -675,7 +667,9 @@ mod tests { // this test checks that blocks are created as soon as an engine command is sent over the // stream. let (mut sink, commands_stream) = futures::channel::mpsc::channel(1024); - let future = run_manual_seal(ManualSealParams { + + // spawn the background authorship task + tokio::spawn(run_manual_seal(ManualSealParams { block_import: client.clone(), env, client: client.clone(), @@ -684,12 +678,8 @@ mod tests { select_chain, consensus_data_provider: None, create_inherent_data_providers: |_, _| async { Ok(()) }, - }); - std::thread::spawn(|| { - let rt = tokio::runtime::Runtime::new().unwrap(); - // spawn the background authorship task - rt.block_on(future); - }); + })); + // submit a transaction to pool. let result = pool.submit_one(genesis_hash, SOURCE, uxt(Alice, 0)).await; // assert that it was successfully imported @@ -781,7 +771,9 @@ mod tests { let env = ProposerFactory::new(spawner.clone(), client.clone(), pool.clone(), None, None); let (mut sink, commands_stream) = futures::channel::mpsc::channel(1024); - let future = run_manual_seal(ManualSealParams { + + // spawn the background authorship task + tokio::spawn(run_manual_seal(ManualSealParams { block_import: client.clone(), env, client: client.clone(), @@ -791,11 +783,8 @@ mod tests { // use a provider that pushes some post digest data consensus_data_provider: Some(Box::new(TestDigestProvider { _client: client.clone() })), create_inherent_data_providers: |_, _| async { Ok(()) }, - }); - std::thread::spawn(|| { - let rt = tokio::runtime::Runtime::new().unwrap(); - rt.block_on(future); - }); + })); + let (tx, rx) = futures::channel::oneshot::channel(); sink.send(EngineCommand::SealNewBlock { parent_hash: None, diff --git a/substrate/client/consensus/pow/Cargo.toml b/substrate/client/consensus/pow/Cargo.toml index c59a6a271143264fa1e03dadc95302a4bc0ad67f..ecfa29aa194d424d35eba858a0b829fb58a610e3 100644 --- a/substrate/client/consensus/pow/Cargo.toml +++ b/substrate/client/consensus/pow/Cargo.toml @@ -16,13 +16,13 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -async-trait = "0.1.74" +async-trait = "0.1.79" codec = { package = "parity-scale-codec", version = "3.6.1", features = ["derive"] } -futures = "0.3.21" +futures = "0.3.30" futures-timer = "3.0.1" -log = "0.4.17" +log = { workspace = true, default-features = true } parking_lot = "0.12.1" -thiserror = "1.0" +thiserror = { workspace = true } prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../../utils/prometheus" } sc-client-api = { path = "../../api" } sc-consensus = { path = "../common" } diff --git a/substrate/client/consensus/slots/Cargo.toml b/substrate/client/consensus/slots/Cargo.toml index 8eed24532c9fd3649f6f8dd6dc9f9a4914579e2d..4ac6ce90713798d2cce4172f3544c6a116736a84 100644 --- a/substrate/client/consensus/slots/Cargo.toml +++ b/substrate/client/consensus/slots/Cargo.toml @@ -17,11 +17,11 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -async-trait = "0.1.74" +async-trait = "0.1.79" codec = { package = "parity-scale-codec", version = "3.6.1" } -futures = "0.3.21" +futures = "0.3.30" futures-timer = "3.0.1" -log = "0.4.17" +log = { workspace = true, default-features = true } sc-client-api = { path = "../../api" } sc-consensus = { path = "../common" } sc-telemetry = { path = "../../telemetry" } diff --git a/substrate/client/consensus/slots/src/lib.rs b/substrate/client/consensus/slots/src/lib.rs index 12636aae7a4412228ab1da5755c9f82669c469e5..d9d792005312503f48bb2d628235794952104ccd 100644 --- a/substrate/client/consensus/slots/src/lib.rs +++ b/substrate/client/consensus/slots/src/lib.rs @@ -555,7 +555,7 @@ impl SlotProportion { Self(inner.clamp(0.0, 1.0)) } - /// Returns the inner that is guaranted to be in the range `[0,1]`. + /// Returns the inner that is guaranteed to be in the range `[0,1]`. pub fn get(&self) -> f32 { self.0 } @@ -648,7 +648,7 @@ pub fn proposing_remaining_duration( } /// Calculate a slot duration lenience based on the number of missed slots from current -/// to parent. If the number of skipped slots is greated than 0 this method will apply +/// to parent. If the number of skipped slots is greater than 0 this method will apply /// an exponential backoff of at most `2^7 * slot_duration`, if no slots were skipped /// this method will return `None.` pub fn slot_lenience_exponential( @@ -680,7 +680,7 @@ pub fn slot_lenience_exponential( } /// Calculate a slot duration lenience based on the number of missed slots from current -/// to parent. If the number of skipped slots is greated than 0 this method will apply +/// to parent. If the number of skipped slots is greater than 0 this method will apply /// a linear backoff of at most `20 * slot_duration`, if no slots were skipped /// this method will return `None.` pub fn slot_lenience_linear( diff --git a/substrate/client/db/Cargo.toml b/substrate/client/db/Cargo.toml index ed7b4178f287a67c72946b9829b91d91c84bb442..57ee1a8ad3315036f44e5b560fb55fa3f31c97e5 100644 --- a/substrate/client/db/Cargo.toml +++ b/substrate/client/db/Cargo.toml @@ -24,7 +24,7 @@ kvdb = "0.13.0" kvdb-memorydb = "0.13.0" kvdb-rocksdb = { version = "0.19.0", optional = true } linked-hash-map = "0.5.4" -log = "0.4.17" +log = { workspace = true, default-features = true } parity-db = "0.4.12" parking_lot = "0.12.1" sc-client-api = { path = "../api" } diff --git a/substrate/client/db/src/bench.rs b/substrate/client/db/src/bench.rs index 03ad4817b53bcea2cb349d4d05c190bb239530fa..32503cf63c0ad7eeae1ab502d38b09aa210d9bc9 100644 --- a/substrate/client/db/src/bench.rs +++ b/substrate/client/db/src/bench.rs @@ -19,7 +19,7 @@ //! State backend that's useful for benchmarking use crate::{DbState, DbStateBuilder}; -use hash_db::{Hasher, Prefix}; +use hash_db::{Hasher as DbHasher, Prefix}; use kvdb::{DBTransaction, KeyValueDB}; use linked_hash_map::LinkedHashMap; use parking_lot::Mutex; @@ -27,10 +27,7 @@ use sp_core::{ hexdisplay::HexDisplay, storage::{ChildInfo, TrackedStorageKey}, }; -use sp_runtime::{ - traits::{Block as BlockT, HashingFor}, - StateVersion, Storage, -}; +use sp_runtime::{traits::Hash, StateVersion, Storage}; use sp_state_machine::{ backend::Backend as StateBackend, BackendTransaction, ChildStorageCollection, DBValue, IterArgs, StorageCollection, StorageIterator, StorageKey, StorageValue, @@ -45,16 +42,16 @@ use std::{ sync::Arc, }; -type State = DbState; +type State = DbState; -struct StorageDb { +struct StorageDb { db: Arc, - _block: std::marker::PhantomData, + _phantom: std::marker::PhantomData, } -impl sp_state_machine::Storage> for StorageDb { - fn get(&self, key: &Block::Hash, prefix: Prefix) -> Result, String> { - let prefixed_key = prefixed_key::>(key, prefix); +impl sp_state_machine::Storage for StorageDb { + fn get(&self, key: &Hasher::Output, prefix: Prefix) -> Result, String> { + let prefixed_key = prefixed_key::(key, prefix); self.db .get(0, &prefixed_key) .map_err(|e| format!("Database backend error: {:?}", e)) @@ -75,29 +72,29 @@ struct KeyTracker { } /// State that manages the backend database reference. Allows runtime to control the database. -pub struct BenchmarkingState { - root: Cell, - genesis_root: B::Hash, - state: RefCell>>, +pub struct BenchmarkingState { + root: Cell, + genesis_root: Hasher::Output, + state: RefCell>>, db: Cell>>, genesis: HashMap, (Vec, i32)>, record: Cell>>, key_tracker: Arc>, whitelist: RefCell>, - proof_recorder: Option>>, - proof_recorder_root: Cell, - shared_trie_cache: SharedTrieCache>, + proof_recorder: Option>, + proof_recorder_root: Cell, + shared_trie_cache: SharedTrieCache, } /// A raw iterator over the `BenchmarkingState`. -pub struct RawIter { - inner: as StateBackend>>::RawIter, +pub struct RawIter { + inner: as StateBackend>::RawIter, child_trie: Option>, key_tracker: Arc>, } -impl StorageIterator> for RawIter { - type Backend = BenchmarkingState; +impl StorageIterator for RawIter { + type Backend = BenchmarkingState; type Error = String; fn next_key(&mut self, backend: &Self::Backend) -> Option> { @@ -128,7 +125,7 @@ impl StorageIterator> for RawIter { } } -impl BenchmarkingState { +impl BenchmarkingState { /// Create a new instance that creates a database in a temporary dir. pub fn new( genesis: Storage, @@ -137,9 +134,9 @@ impl BenchmarkingState { enable_tracking: bool, ) -> Result { let state_version = sp_runtime::StateVersion::default(); - let mut root = B::Hash::default(); - let mut mdb = MemoryDB::>::default(); - sp_trie::trie_types::TrieDBMutBuilderV1::>::new(&mut mdb, &mut root).build(); + let mut root = Default::default(); + let mut mdb = MemoryDB::::default(); + sp_trie::trie_types::TrieDBMutBuilderV1::::new(&mut mdb, &mut root).build(); let mut state = BenchmarkingState { state: RefCell::new(None), @@ -169,7 +166,7 @@ impl BenchmarkingState { child_content.data.iter().map(|(k, v)| (k.as_ref(), Some(v.as_ref()))), ) }); - let (root, transaction): (B::Hash, _) = + let (root, transaction): (Hasher::Output, _) = state.state.borrow().as_ref().unwrap().full_storage_root( genesis.top.iter().map(|(k, v)| (k.as_ref(), Some(v.as_ref()))), child_delta, @@ -193,9 +190,9 @@ impl BenchmarkingState { recorder.reset(); self.proof_recorder_root.set(self.root.get()); } - let storage_db = Arc::new(StorageDb:: { db, _block: Default::default() }); + let storage_db = Arc::new(StorageDb:: { db, _phantom: Default::default() }); *self.state.borrow_mut() = Some( - DbStateBuilder::::new(storage_db, self.root.get()) + DbStateBuilder::::new(storage_db, self.root.get()) .with_optional_recorder(self.proof_recorder.clone()) .with_cache(self.shared_trie_cache.local_cache()) .build(), @@ -341,17 +338,17 @@ fn state_err() -> String { "State is not open".into() } -impl StateBackend> for BenchmarkingState { - type Error = as StateBackend>>::Error; - type TrieBackendStorage = as StateBackend>>::TrieBackendStorage; - type RawIter = RawIter; +impl StateBackend for BenchmarkingState { + type Error = as StateBackend>::Error; + type TrieBackendStorage = as StateBackend>::TrieBackendStorage; + type RawIter = RawIter; fn storage(&self, key: &[u8]) -> Result>, Self::Error> { self.add_read_key(None, key); self.state.borrow().as_ref().ok_or_else(state_err)?.storage(key) } - fn storage_hash(&self, key: &[u8]) -> Result, Self::Error> { + fn storage_hash(&self, key: &[u8]) -> Result, Self::Error> { self.add_read_key(None, key); self.state.borrow().as_ref().ok_or_else(state_err)?.storage_hash(key) } @@ -373,7 +370,7 @@ impl StateBackend> for BenchmarkingState { &self, child_info: &ChildInfo, key: &[u8], - ) -> Result, Self::Error> { + ) -> Result, Self::Error> { self.add_read_key(Some(child_info.storage_key()), key); self.state .borrow() @@ -385,7 +382,7 @@ impl StateBackend> for BenchmarkingState { fn closest_merkle_value( &self, key: &[u8], - ) -> Result>, Self::Error> { + ) -> Result>, Self::Error> { self.add_read_key(None, key); self.state.borrow().as_ref().ok_or_else(state_err)?.closest_merkle_value(key) } @@ -394,7 +391,7 @@ impl StateBackend> for BenchmarkingState { &self, child_info: &ChildInfo, key: &[u8], - ) -> Result>, Self::Error> { + ) -> Result>, Self::Error> { self.add_read_key(None, key); self.state .borrow() @@ -443,7 +440,7 @@ impl StateBackend> for BenchmarkingState { &self, delta: impl Iterator)>, state_version: StateVersion, - ) -> (B::Hash, BackendTransaction>) { + ) -> (Hasher::Output, BackendTransaction) { self.state .borrow() .as_ref() @@ -455,7 +452,7 @@ impl StateBackend> for BenchmarkingState { child_info: &ChildInfo, delta: impl Iterator)>, state_version: StateVersion, - ) -> (B::Hash, bool, BackendTransaction>) { + ) -> (Hasher::Output, bool, BackendTransaction) { self.state .borrow() .as_ref() @@ -479,8 +476,8 @@ impl StateBackend> for BenchmarkingState { fn commit( &self, - storage_root: as Hasher>::Out, - mut transaction: BackendTransaction>, + storage_root: ::Out, + mut transaction: BackendTransaction, main_storage_changes: StorageCollection, child_storage_changes: ChildStorageCollection, ) -> Result<(), Self::Error> { @@ -634,8 +631,7 @@ impl StateBackend> for BenchmarkingState { log::debug!(target: "benchmark", "Some proof size: {}", &proof_size); proof_size } else { - if let Some(size) = proof.encoded_compact_size::>(proof_recorder_root) - { + if let Some(size) = proof.encoded_compact_size::(proof_recorder_root) { size as u32 } else if proof_recorder_root == self.root.get() { log::debug!(target: "benchmark", "No changes - no proof"); @@ -654,7 +650,7 @@ impl StateBackend> for BenchmarkingState { } } -impl std::fmt::Debug for BenchmarkingState { +impl std::fmt::Debug for BenchmarkingState { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!(f, "Bench DB") } @@ -663,6 +659,7 @@ impl std::fmt::Debug for BenchmarkingState { #[cfg(test)] mod test { use crate::bench::BenchmarkingState; + use sp_runtime::traits::HashingFor; use sp_state_machine::backend::Backend as _; fn hex(hex: &str) -> Vec { @@ -681,7 +678,8 @@ mod test { ..sp_runtime::Storage::default() }; let bench_state = - BenchmarkingState::::new(storage, None, false, true).unwrap(); + BenchmarkingState::>::new(storage, None, false, true) + .unwrap(); assert_eq!(bench_state.read_write_count(), (0, 0, 0, 0)); assert_eq!(bench_state.keys(Default::default()).unwrap().count(), 1); @@ -690,9 +688,13 @@ mod test { #[test] fn read_to_main_and_child_tries() { - let bench_state = - BenchmarkingState::::new(Default::default(), None, false, true) - .unwrap(); + let bench_state = BenchmarkingState::>::new( + Default::default(), + None, + false, + true, + ) + .unwrap(); for _ in 0..2 { let child1 = sp_core::storage::ChildInfo::new_default(b"child1"); diff --git a/substrate/client/db/src/lib.rs b/substrate/client/db/src/lib.rs index 2d8622d5f12dcc798cbc4c46685df6b4a2a38658..0faa90dfc4f925db8776c6914fcf864813b790a5 100644 --- a/substrate/client/db/src/lib.rs +++ b/substrate/client/db/src/lib.rs @@ -101,14 +101,11 @@ pub use bench::BenchmarkingState; const CACHE_HEADERS: usize = 8; /// DB-backed patricia trie state, transaction type is an overlay of changes to commit. -pub type DbState = - sp_state_machine::TrieBackend>>, HashingFor>; +pub type DbState = sp_state_machine::TrieBackend>, H>; /// Builder for [`DbState`]. -pub type DbStateBuilder = sp_state_machine::TrieBackendBuilder< - Arc>>, - HashingFor, ->; +pub type DbStateBuilder = + sp_state_machine::TrieBackendBuilder>, Hasher>; /// Length of a [`DbHash`]. const DB_HASH_LEN: usize = 32; @@ -135,13 +132,17 @@ enum DbExtrinsic { /// It makes sure that the hash we are using stays pinned in storage /// until this structure is dropped. pub struct RefTrackingState { - state: DbState, + state: DbState>, storage: Arc>, parent_hash: Option, } impl RefTrackingState { - fn new(state: DbState, storage: Arc>, parent_hash: Option) -> Self { + fn new( + state: DbState>, + storage: Arc>, + parent_hash: Option, + ) -> Self { RefTrackingState { state, parent_hash, storage } } } @@ -162,12 +163,12 @@ impl std::fmt::Debug for RefTrackingState { /// A raw iterator over the `RefTrackingState`. pub struct RawIter { - inner: as StateBackend>>::RawIter, + inner: > as StateBackend>>::RawIter, } impl StorageIterator> for RawIter { type Backend = RefTrackingState; - type Error = as StateBackend>>::Error; + type Error = > as StateBackend>>::Error; fn next_key(&mut self, backend: &Self::Backend) -> Option> { self.inner.next_key(&backend.state) @@ -186,8 +187,9 @@ impl StorageIterator> for RawIter { } impl StateBackend> for RefTrackingState { - type Error = as StateBackend>>::Error; - type TrieBackendStorage = as StateBackend>>::TrieBackendStorage; + type Error = > as StateBackend>>::Error; + type TrieBackendStorage = + > as StateBackend>>::TrieBackendStorage; type RawIter = RawIter; fn storage(&self, key: &[u8]) -> Result>, Self::Error> { @@ -284,7 +286,8 @@ impl StateBackend> for RefTrackingState { } impl AsTrieBackend> for RefTrackingState { - type TrieBackendStorage = as StateBackend>>::TrieBackendStorage; + type TrieBackendStorage = + > as StateBackend>>::TrieBackendStorage; fn as_trie_backend( &self, @@ -1936,7 +1939,7 @@ impl Backend { fn empty_state(&self) -> RecordStatsState, Block> { let root = EmptyStorage::::new().0; // Empty trie - let db_state = DbStateBuilder::::new(self.storage.clone(), root) + let db_state = DbStateBuilder::>::new(self.storage.clone(), root) .with_optional_cache(self.shared_trie_cache.as_ref().map(|c| c.local_cache())) .build(); let state = RefTrackingState::new(db_state, self.storage.clone(), None); @@ -2428,9 +2431,12 @@ impl sc_client_api::backend::Backend for Backend { if hash == self.blockchain.meta.read().genesis_hash { if let Some(genesis_state) = &*self.genesis_state.read() { let root = genesis_state.root; - let db_state = DbStateBuilder::::new(genesis_state.clone(), root) - .with_optional_cache(self.shared_trie_cache.as_ref().map(|c| c.local_cache())) - .build(); + let db_state = + DbStateBuilder::>::new(genesis_state.clone(), root) + .with_optional_cache( + self.shared_trie_cache.as_ref().map(|c| c.local_cache()), + ) + .build(); let state = RefTrackingState::new(db_state, self.storage.clone(), None); return Ok(RecordStatsState::new(state, None, self.state_usage.clone())) @@ -2449,11 +2455,12 @@ impl sc_client_api::backend::Backend for Backend { self.storage.state_db.pin(&hash, hdr.number.saturated_into::(), hint) { let root = hdr.state_root; - let db_state = DbStateBuilder::::new(self.storage.clone(), root) - .with_optional_cache( - self.shared_trie_cache.as_ref().map(|c| c.local_cache()), - ) - .build(); + let db_state = + DbStateBuilder::>::new(self.storage.clone(), root) + .with_optional_cache( + self.shared_trie_cache.as_ref().map(|c| c.local_cache()), + ) + .build(); let state = RefTrackingState::new(db_state, self.storage.clone(), Some(hash)); Ok(RecordStatsState::new(state, Some(hash), self.state_usage.clone())) } else { @@ -2524,7 +2531,7 @@ impl sc_client_api::backend::Backend for Backend { self.storage.state_db.pin(&hash, number.saturated_into::(), hint).map_err( |_| { sp_blockchain::Error::UnknownBlock(format!( - "State already discarded for `{:?}`", + "Unable to pin: state already discarded for `{:?}`", hash )) }, diff --git a/substrate/client/db/src/pinned_blocks_cache.rs b/substrate/client/db/src/pinned_blocks_cache.rs index 46c9287fb19ac1361153dbb65f4f0b353170042f..ac4aad07765cfbaa4d9c66efa4b44730b0b0a04c 100644 --- a/substrate/client/db/src/pinned_blocks_cache.rs +++ b/substrate/client/db/src/pinned_blocks_cache.rs @@ -20,7 +20,7 @@ use schnellru::{Limiter, LruMap}; use sp_runtime::{traits::Block as BlockT, Justifications}; const LOG_TARGET: &str = "db::pin"; -const PINNING_CACHE_SIZE: usize = 1024; +const PINNING_CACHE_SIZE: usize = 2048; /// Entry for pinned blocks cache. struct PinnedBlockCacheEntry { diff --git a/substrate/client/db/src/upgrade.rs b/substrate/client/db/src/upgrade.rs index f1e503867dfc3e4a9ad3ddd5135f5d426e9c221c..475220d9991931e5ed03f1be9ba812bb5a6b1ad4 100644 --- a/substrate/client/db/src/upgrade.rs +++ b/substrate/client/db/src/upgrade.rs @@ -79,7 +79,7 @@ impl fmt::Display for UpgradeError { write!(f, "Database version comes from future version of the client: {}", version) }, UpgradeError::DecodingJustificationBlock => { - write!(f, "Decodoning justification block failed") + write!(f, "Decoding justification block failed") }, UpgradeError::Io(err) => write!(f, "Io error: {}", err), } diff --git a/substrate/client/db/src/utils.rs b/substrate/client/db/src/utils.rs index abf9c4629cee47e31d18a18c827212b48fe31511..b532e0d4666273648a7cef073a11ab21eb3a2554 100644 --- a/substrate/client/db/src/utils.rs +++ b/substrate/client/db/src/utils.rs @@ -338,7 +338,7 @@ fn open_kvdb_rocksdb( db_config.memory_budget = memory_budget; let db = kvdb_rocksdb::Database::open(&db_config, path)?; - // write database version only after the database is succesfully opened + // write database version only after the database is successfully opened crate::upgrade::update_version(path)?; Ok(sp_database::as_database(db)) } diff --git a/substrate/client/executor/Cargo.toml b/substrate/client/executor/Cargo.toml index 4e36de3c4f47c9f4f98f28d694ec3f23cbd81add..efe8cc3069ca8be4d797196cbbf6256d248d76a0 100644 --- a/substrate/client/executor/Cargo.toml +++ b/substrate/client/executor/Cargo.toml @@ -23,6 +23,7 @@ tracing = "0.1.29" codec = { package = "parity-scale-codec", version = "3.6.1" } sc-executor-common = { path = "common" } +sc-executor-polkavm = { path = "polkavm" } sc-executor-wasmtime = { path = "wasmtime" } sp-api = { path = "../../primitives/api" } sp-core = { path = "../../primitives/core" } @@ -46,11 +47,11 @@ sp-runtime = { path = "../../primitives/runtime" } sp-maybe-compressed-blob = { path = "../../primitives/maybe-compressed-blob" } sc-tracing = { path = "../tracing" } sp-tracing = { path = "../../primitives/tracing" } -tracing-subscriber = "0.2.19" +tracing-subscriber = { workspace = true } paste = "1.0" regex = "1.6.0" criterion = "0.4.0" -env_logger = "0.9" +env_logger = "0.11" num_cpus = "1.13.1" tempfile = "3.3.0" diff --git a/substrate/client/executor/common/Cargo.toml b/substrate/client/executor/common/Cargo.toml index 648fb9f0f5040d60d96defb07bc276e6e10cdc23..8ff34c3709a5e486fb9036a638788a532c6f296c 100644 --- a/substrate/client/executor/common/Cargo.toml +++ b/substrate/client/executor/common/Cargo.toml @@ -17,11 +17,12 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -thiserror = "1.0.48" +thiserror = { workspace = true } wasm-instrument = "0.4" sc-allocator = { path = "../../allocator" } sp-maybe-compressed-blob = { path = "../../../primitives/maybe-compressed-blob" } sp-wasm-interface = { path = "../../../primitives/wasm-interface" } +polkavm = { workspace = true } [features] default = [] diff --git a/substrate/client/executor/common/src/error.rs b/substrate/client/executor/common/src/error.rs index 2a0dc364b4103ebc53ee767300bf25cc7211fe8b..9d489eaae4200035b6e0ffc0b1bafb045b2ce2b7 100644 --- a/substrate/client/executor/common/src/error.rs +++ b/substrate/client/executor/common/src/error.rs @@ -145,11 +145,29 @@ pub enum WasmError { #[error("{0}")] Instantiation(String), - /// Other error happenend. + /// Other error happened. #[error("Other error happened while constructing the runtime: {0}")] Other(String), } +impl From for WasmError { + fn from(error: polkavm::ProgramParseError) -> Self { + WasmError::Other(error.to_string()) + } +} + +impl From for WasmError { + fn from(error: polkavm::Error) -> Self { + WasmError::Other(error.to_string()) + } +} + +impl From for Error { + fn from(error: polkavm::Error) -> Self { + Error::Other(error.to_string()) + } +} + /// An error message with an attached backtrace. #[derive(Debug)] pub struct MessageWithBacktrace { diff --git a/substrate/client/executor/common/src/lib.rs b/substrate/client/executor/common/src/lib.rs index 751801fb30da18e48e05daedbde644ad8699ce10..ff9fab2c8889fbbc9040740cd5f5a49f158d618c 100644 --- a/substrate/client/executor/common/src/lib.rs +++ b/substrate/client/executor/common/src/lib.rs @@ -25,3 +25,7 @@ pub mod error; pub mod runtime_blob; pub mod util; pub mod wasm_runtime; + +pub(crate) fn is_polkavm_enabled() -> bool { + std::env::var_os("SUBSTRATE_ENABLE_POLKAVM").map_or(false, |value| value == "1") +} diff --git a/substrate/client/executor/common/src/runtime_blob/runtime_blob.rs b/substrate/client/executor/common/src/runtime_blob/runtime_blob.rs index becf9e219b0b7a60f97bb08b4044897b143bd006..d689083b2f85cd7f3fc16f220c1b45a474dd87f5 100644 --- a/substrate/client/executor/common/src/runtime_blob/runtime_blob.rs +++ b/substrate/client/executor/common/src/runtime_blob/runtime_blob.rs @@ -17,23 +17,23 @@ // along with this program. If not, see . use crate::{error::WasmError, wasm_runtime::HeapAllocStrategy}; -use wasm_instrument::{ - export_mutable_globals, - parity_wasm::elements::{ - deserialize_buffer, serialize, ExportEntry, External, Internal, MemorySection, MemoryType, - Module, Section, - }, +use wasm_instrument::parity_wasm::elements::{ + deserialize_buffer, serialize, ExportEntry, External, Internal, MemorySection, MemoryType, + Module, Section, }; -/// A bunch of information collected from a WebAssembly module. +/// A program blob containing a Substrate runtime. #[derive(Clone)] -pub struct RuntimeBlob { - raw_module: Module, +pub struct RuntimeBlob(BlobKind); + +#[derive(Clone)] +enum BlobKind { + WebAssembly(Module), + PolkaVM(polkavm::ProgramBlob<'static>), } impl RuntimeBlob { - /// Create `RuntimeBlob` from the given wasm code. Will attempt to decompress the code before - /// deserializing it. + /// Create `RuntimeBlob` from the given WASM or PolkaVM compressed program blob. /// /// See [`sp_maybe_compressed_blob`] for details about decompression. pub fn uncompress_if_needed(wasm_code: &[u8]) -> Result { @@ -43,31 +43,26 @@ impl RuntimeBlob { Self::new(&wasm_code) } - /// Create `RuntimeBlob` from the given wasm code. + /// Create `RuntimeBlob` from the given WASM or PolkaVM program blob. /// - /// Returns `Err` if the wasm code cannot be deserialized. - pub fn new(wasm_code: &[u8]) -> Result { - let raw_module: Module = deserialize_buffer(wasm_code) - .map_err(|e| WasmError::Other(format!("cannot deserialize module: {:?}", e)))?; - Ok(Self { raw_module }) - } - - /// The number of globals defined in locally in this module. - pub fn declared_globals_count(&self) -> u32 { - self.raw_module - .global_section() - .map(|gs| gs.entries().len() as u32) - .unwrap_or(0) - } - - /// The number of imports of globals. - pub fn imported_globals_count(&self) -> u32 { - self.raw_module.import_section().map(|is| is.globals() as u32).unwrap_or(0) - } + /// Returns `Err` if the blob cannot be deserialized. + /// + /// Will only accept a PolkaVM program if the `SUBSTRATE_ENABLE_POLKAVM` environment + /// variable is set to `1`. + pub fn new(raw_blob: &[u8]) -> Result { + if raw_blob.starts_with(b"PVM\0") { + if crate::is_polkavm_enabled() { + return Ok(Self(BlobKind::PolkaVM( + polkavm::ProgramBlob::parse(raw_blob)?.into_owned(), + ))); + } else { + return Err(WasmError::Other("expected a WASM runtime blob, found a PolkaVM runtime blob; set the 'SUBSTRATE_ENABLE_POLKAVM' environment variable to enable the experimental PolkaVM-based executor".to_string())); + } + } - /// Perform an instrumentation that makes sure that the mutable globals are exported. - pub fn expose_mutable_globals(&mut self) { - export_mutable_globals(&mut self.raw_module, "exported_internal_global"); + let raw_module: Module = deserialize_buffer(raw_blob) + .map_err(|e| WasmError::Other(format!("cannot deserialize module: {:?}", e)))?; + Ok(Self(BlobKind::WebAssembly(raw_module))) } /// Run a pass that instrument this module so as to introduce a deterministic stack height @@ -80,26 +75,16 @@ impl RuntimeBlob { /// /// The stack cost of a function is computed based on how much locals there are and the maximum /// depth of the wasm operand stack. + /// + /// Only valid for WASM programs; will return an error if the blob is a PolkaVM program. pub fn inject_stack_depth_metering(self, stack_depth_limit: u32) -> Result { let injected_module = - wasm_instrument::inject_stack_limiter(self.raw_module, stack_depth_limit).map_err( - |e| WasmError::Other(format!("cannot inject the stack limiter: {:?}", e)), - )?; - - Ok(Self { raw_module: injected_module }) - } + wasm_instrument::inject_stack_limiter(self.into_webassembly_blob()?, stack_depth_limit) + .map_err(|e| { + WasmError::Other(format!("cannot inject the stack limiter: {:?}", e)) + })?; - /// Perform an instrumentation that makes sure that a specific function `entry_point` is - /// exported - pub fn entry_point_exists(&self, entry_point: &str) -> bool { - self.raw_module - .export_section() - .map(|e| { - e.entries().iter().any(|e| { - matches!(e.internal(), Internal::Function(_)) && e.field() == entry_point - }) - }) - .unwrap_or_default() + Ok(Self(BlobKind::WebAssembly(injected_module))) } /// Converts a WASM memory import into a memory section and exports it. @@ -107,8 +92,11 @@ impl RuntimeBlob { /// Does nothing if there's no memory import. /// /// May return an error in case the WASM module is invalid. + /// + /// Only valid for WASM programs; will return an error if the blob is a PolkaVM program. pub fn convert_memory_import_into_export(&mut self) -> Result<(), WasmError> { - let import_section = match self.raw_module.import_section_mut() { + let raw_module = self.as_webassembly_blob_mut()?; + let import_section = match raw_module.import_section_mut() { Some(import_section) => import_section, None => return Ok(()), }; @@ -124,7 +112,7 @@ impl RuntimeBlob { let memory_name = entry.field().to_owned(); import_entries.remove(index); - self.raw_module + raw_module .insert_section(Section::Memory(MemorySection::with_entries(vec![memory_ty]))) .map_err(|error| { WasmError::Other(format!( @@ -133,14 +121,14 @@ impl RuntimeBlob { )) })?; - if self.raw_module.export_section_mut().is_none() { + if raw_module.export_section_mut().is_none() { // A module without an export section is somewhat unrealistic, but let's do this // just in case to cover all of our bases. - self.raw_module + raw_module .insert_section(Section::Export(Default::default())) .expect("an export section can be always inserted if it doesn't exist; qed"); } - self.raw_module + raw_module .export_section_mut() .expect("export section already existed or we just added it above, so it always exists; qed") .entries_mut() @@ -156,12 +144,14 @@ impl RuntimeBlob { /// /// Will return an error in case there is no memory section present, /// or if the memory section is empty. + /// + /// Only valid for WASM programs; will return an error if the blob is a PolkaVM program. pub fn setup_memory_according_to_heap_alloc_strategy( &mut self, heap_alloc_strategy: HeapAllocStrategy, ) -> Result<(), WasmError> { - let memory_section = self - .raw_module + let raw_module = self.as_webassembly_blob_mut()?; + let memory_section = raw_module .memory_section_mut() .ok_or_else(|| WasmError::Other("no memory section found".into()))?; @@ -187,8 +177,11 @@ impl RuntimeBlob { /// Scans the wasm blob for the first section with the name that matches the given. Returns the /// contents of the custom section if found or `None` otherwise. + /// + /// Only valid for WASM programs; will return an error if the blob is a PolkaVM program. pub fn custom_section_contents(&self, section_name: &str) -> Option<&[u8]> { - self.raw_module + self.as_webassembly_blob() + .ok()? .custom_sections() .find(|cs| cs.name() == section_name) .map(|cs| cs.payload()) @@ -196,11 +189,45 @@ impl RuntimeBlob { /// Consumes this runtime blob and serializes it. pub fn serialize(self) -> Vec { - serialize(self.raw_module).expect("serializing into a vec should succeed; qed") + match self.0 { + BlobKind::WebAssembly(raw_module) => + serialize(raw_module).expect("serializing into a vec should succeed; qed"), + BlobKind::PolkaVM(ref blob) => blob.as_bytes().to_vec(), + } + } + + fn as_webassembly_blob(&self) -> Result<&Module, WasmError> { + match self.0 { + BlobKind::WebAssembly(ref raw_module) => Ok(raw_module), + BlobKind::PolkaVM(..) => Err(WasmError::Other( + "expected a WebAssembly program; found a PolkaVM program blob".into(), + )), + } } - /// Destructure this structure into the underlying parity-wasm Module. - pub fn into_inner(self) -> Module { - self.raw_module + fn as_webassembly_blob_mut(&mut self) -> Result<&mut Module, WasmError> { + match self.0 { + BlobKind::WebAssembly(ref mut raw_module) => Ok(raw_module), + BlobKind::PolkaVM(..) => Err(WasmError::Other( + "expected a WebAssembly program; found a PolkaVM program blob".into(), + )), + } + } + + fn into_webassembly_blob(self) -> Result { + match self.0 { + BlobKind::WebAssembly(raw_module) => Ok(raw_module), + BlobKind::PolkaVM(..) => Err(WasmError::Other( + "expected a WebAssembly program; found a PolkaVM program blob".into(), + )), + } + } + + /// Gets a reference to the inner PolkaVM program blob, if this is a PolkaVM program. + pub fn as_polkavm_blob(&self) -> Option<&polkavm::ProgramBlob> { + match self.0 { + BlobKind::WebAssembly(..) => None, + BlobKind::PolkaVM(ref blob) => Some(blob), + } } } diff --git a/substrate/client/executor/common/src/wasm_runtime.rs b/substrate/client/executor/common/src/wasm_runtime.rs index d8e142b9d55905e3e31d2247f5a48e8e2b0f987a..e8f429a3dbb2a0451769d427a81bdf5eaef492ff 100644 --- a/substrate/client/executor/common/src/wasm_runtime.rs +++ b/substrate/client/executor/common/src/wasm_runtime.rs @@ -19,7 +19,6 @@ //! Definitions for a wasm runtime. use crate::error::Error; -use sp_wasm_interface::Value; pub use sc_allocator::AllocationStats; @@ -30,46 +29,6 @@ pub const DEFAULT_HEAP_ALLOC_STRATEGY: HeapAllocStrategy = /// Default heap allocation pages. pub const DEFAULT_HEAP_ALLOC_PAGES: u32 = 2048; -/// A method to be used to find the entrypoint when calling into the runtime -/// -/// Contains variants on how to resolve wasm function that will be invoked. -pub enum InvokeMethod<'a> { - /// Call function exported with this name. - /// - /// Located function should have (u32, u32) -> u64 signature. - Export(&'a str), - /// Call a function found in the exported table found under the given index. - /// - /// Located function should have (u32, u32) -> u64 signature. - Table(u32), - /// Call function by reference from table through a wrapper. - /// - /// Invoked function (`dispatcher_ref`) function - /// should have (u32, u32, u32) -> u64 signature. - /// - /// `func` will be passed to the invoked function as a first argument. - TableWithWrapper { - /// Wrapper for the call. - /// - /// Function pointer, index into runtime exported table. - dispatcher_ref: u32, - /// Extra argument for dispatch. - /// - /// Common usage would be to use it as an actual wasm function pointer - /// that should be invoked, but can be used as any extra argument on the - /// callee side. - /// - /// This is typically generated and invoked by the runtime itself. - func: u32, - }, -} - -impl<'a> From<&'a str> for InvokeMethod<'a> { - fn from(val: &'a str) -> InvokeMethod<'a> { - InvokeMethod::Export(val) - } -} - /// A trait that defines an abstract WASM runtime module. /// /// This can be implemented by an execution engine. @@ -87,7 +46,7 @@ pub trait WasmInstance: Send { /// Before execution, instance is reset. /// /// Returns the encoded result on success. - fn call(&mut self, method: InvokeMethod, data: &[u8]) -> Result, Error> { + fn call(&mut self, method: &str, data: &[u8]) -> Result, Error> { self.call_with_allocation_stats(method, data).0 } @@ -98,7 +57,7 @@ pub trait WasmInstance: Send { /// Returns the encoded result on success. fn call_with_allocation_stats( &mut self, - method: InvokeMethod, + method: &str, data: &[u8], ) -> (Result, Error>, Option); @@ -110,11 +69,6 @@ pub trait WasmInstance: Send { fn call_export(&mut self, method: &str, data: &[u8]) -> Result, Error> { self.call(method.into(), data) } - - /// Get the value from a global with the given `name`. - /// - /// This method is only suitable for getting immutable globals. - fn get_global_const(&mut self, name: &str) -> Result, Error>; } /// Defines the heap pages allocation strategy the wasm runtime should use. diff --git a/substrate/client/executor/polkavm/Cargo.toml b/substrate/client/executor/polkavm/Cargo.toml new file mode 100644 index 0000000000000000000000000000000000000000..9d0eb8ccf0ee072c86195068a589309edd132ba4 --- /dev/null +++ b/substrate/client/executor/polkavm/Cargo.toml @@ -0,0 +1,23 @@ +[package] +name = "sc-executor-polkavm" +version = "0.29.0" +authors.workspace = true +edition.workspace = true +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" +homepage = "https://substrate.io" +repository.workspace = true +description = "PolkaVM executor for Substrate" +readme = "README.md" + +[lints] +workspace = true + +[package.metadata.docs.rs] +targets = ["x86_64-unknown-linux-gnu"] + +[dependencies] +log = { workspace = true } +polkavm = { workspace = true } + +sc-executor-common = { path = "../common" } +sp-wasm-interface = { path = "../../../primitives/wasm-interface" } diff --git a/substrate/client/executor/polkavm/README.md b/substrate/client/executor/polkavm/README.md new file mode 100644 index 0000000000000000000000000000000000000000..64fc2fa0c28485566fc60329ad8cfc0057112bc7 --- /dev/null +++ b/substrate/client/executor/polkavm/README.md @@ -0,0 +1 @@ +License: GPL-3.0-or-later WITH Classpath-exception-2.0 diff --git a/substrate/client/executor/polkavm/src/lib.rs b/substrate/client/executor/polkavm/src/lib.rs new file mode 100644 index 0000000000000000000000000000000000000000..1bd72eb33d309997832de5fca9250ca651090ce7 --- /dev/null +++ b/substrate/client/executor/polkavm/src/lib.rs @@ -0,0 +1,261 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +use polkavm::{Caller, Reg}; +use sc_executor_common::{ + error::{Error, WasmError}, + wasm_runtime::{AllocationStats, WasmInstance, WasmModule}, +}; +use sp_wasm_interface::{ + Function, FunctionContext, HostFunctions, Pointer, Value, ValueType, WordSize, +}; + +#[repr(transparent)] +pub struct InstancePre(polkavm::InstancePre<()>); + +#[repr(transparent)] +pub struct Instance(polkavm::Instance<()>); + +impl WasmModule for InstancePre { + fn new_instance(&self) -> Result, Error> { + Ok(Box::new(Instance(self.0.instantiate()?))) + } +} + +impl WasmInstance for Instance { + fn call_with_allocation_stats( + &mut self, + name: &str, + raw_data: &[u8], + ) -> (Result, Error>, Option) { + let Some(method_index) = self.0.module().lookup_export(name) else { + return ( + Err(format!("cannot call into the runtime: export not found: '{name}'").into()), + None, + ); + }; + + let Ok(raw_data_length) = u32::try_from(raw_data.len()) else { + return ( + Err(format!("cannot call runtime method '{name}': input payload is too big").into()), + None, + ); + }; + + // TODO: This will leak guest memory; find a better solution. + let mut state_args = polkavm::StateArgs::new(); + + // Make sure the memory is cleared... + state_args.reset_memory(true); + // ...and allocate space for the input payload. + state_args.sbrk(raw_data_length); + + match self.0.update_state(state_args) { + Ok(()) => {}, + Err(polkavm::ExecutionError::Trap(trap)) => { + return (Err(format!("call into the runtime method '{name}' failed: failed to prepare the guest's memory: {trap}").into()), None); + }, + Err(polkavm::ExecutionError::Error(error)) => { + return (Err(format!("call into the runtime method '{name}' failed: failed to prepare the guest's memory: {error}").into()), None); + }, + Err(polkavm::ExecutionError::OutOfGas) => unreachable!("gas metering is never enabled"), + } + + // Grab the address of where the guest's heap starts; that's where we've just allocated + // the memory for the input payload. + let data_pointer = self.0.module().memory_map().heap_base(); + + if let Err(error) = self.0.write_memory(data_pointer, raw_data) { + return (Err(format!("call into the runtime method '{name}': failed to write the input payload into guest memory: {error}").into()), None); + } + + let mut state = (); + let mut call_args = polkavm::CallArgs::new(&mut state, method_index); + call_args.args_untyped(&[data_pointer, raw_data_length]); + + match self.0.call(Default::default(), call_args) { + Ok(()) => {}, + Err(polkavm::ExecutionError::Trap(trap)) => { + return ( + Err(format!("call into the runtime method '{name}' failed: {trap}").into()), + None, + ); + }, + Err(polkavm::ExecutionError::Error(error)) => { + return ( + Err(format!("call into the runtime method '{name}' failed: {error}").into()), + None, + ); + }, + Err(polkavm::ExecutionError::OutOfGas) => unreachable!("gas metering is never enabled"), + } + + let result_pointer = self.0.get_reg(Reg::A0); + let result_length = self.0.get_reg(Reg::A1); + let output = match self.0.read_memory_into_vec(result_pointer, result_length) { + Ok(output) => output, + Err(error) => { + return (Err(format!("call into the runtime method '{name}' failed: failed to read the return payload: {error}").into()), None) + }, + }; + + (Ok(output), None) + } +} + +struct Context<'r, 'a>(&'r mut polkavm::Caller<'a, ()>); + +impl<'r, 'a> FunctionContext for Context<'r, 'a> { + fn read_memory_into( + &self, + address: Pointer, + dest: &mut [u8], + ) -> sp_wasm_interface::Result<()> { + self.0 + .read_memory_into_slice(u32::from(address), dest) + .map_err(|error| error.to_string()) + .map(|_| ()) + } + + fn write_memory(&mut self, address: Pointer, data: &[u8]) -> sp_wasm_interface::Result<()> { + self.0.write_memory(u32::from(address), data).map_err(|error| error.to_string()) + } + + fn allocate_memory(&mut self, size: WordSize) -> sp_wasm_interface::Result> { + let pointer = self.0.sbrk(0).expect("fetching the current heap pointer never fails"); + + // TODO: This will leak guest memory; find a better solution. + self.0.sbrk(size).ok_or_else(|| String::from("allocation failed"))?; + + Ok(Pointer::new(pointer)) + } + + fn deallocate_memory(&mut self, _ptr: Pointer) -> sp_wasm_interface::Result<()> { + // This is only used by the allocator host function, which is unused under PolkaVM. + unimplemented!("'deallocate_memory' is never used when running under PolkaVM"); + } + + fn register_panic_error_message(&mut self, _message: &str) { + unimplemented!("'register_panic_error_message' is never used when running under PolkaVM"); + } +} + +fn call_host_function( + caller: &mut Caller<()>, + function: &dyn Function, +) -> Result<(), polkavm::Trap> { + let mut args = [Value::I64(0); Reg::ARG_REGS.len()]; + let mut nth_reg = 0; + for (nth_arg, kind) in function.signature().args.iter().enumerate() { + match kind { + ValueType::I32 => { + args[nth_arg] = Value::I32(caller.get_reg(Reg::ARG_REGS[nth_reg]) as i32); + nth_reg += 1; + }, + ValueType::F32 => { + args[nth_arg] = Value::F32(caller.get_reg(Reg::ARG_REGS[nth_reg])); + nth_reg += 1; + }, + ValueType::I64 => { + let value_lo = caller.get_reg(Reg::ARG_REGS[nth_reg]); + nth_reg += 1; + + let value_hi = caller.get_reg(Reg::ARG_REGS[nth_reg]); + nth_reg += 1; + + args[nth_arg] = + Value::I64((u64::from(value_lo) | (u64::from(value_hi) << 32)) as i64); + }, + ValueType::F64 => { + let value_lo = caller.get_reg(Reg::ARG_REGS[nth_reg]); + nth_reg += 1; + + let value_hi = caller.get_reg(Reg::ARG_REGS[nth_reg]); + nth_reg += 1; + + args[nth_arg] = Value::F64(u64::from(value_lo) | (u64::from(value_hi) << 32)); + }, + } + } + + log::trace!( + "Calling host function: '{}', args = {:?}", + function.name(), + &args[..function.signature().args.len()] + ); + + let value = match function + .execute(&mut Context(caller), &mut args.into_iter().take(function.signature().args.len())) + { + Ok(value) => value, + Err(error) => { + log::warn!("Call into the host function '{}' failed: {error}", function.name()); + return Err(polkavm::Trap::default()); + }, + }; + + if let Some(value) = value { + match value { + Value::I32(value) => { + caller.set_reg(Reg::A0, value as u32); + }, + Value::F32(value) => { + caller.set_reg(Reg::A0, value); + }, + Value::I64(value) => { + caller.set_reg(Reg::A0, value as u32); + caller.set_reg(Reg::A1, (value >> 32) as u32); + }, + Value::F64(value) => { + caller.set_reg(Reg::A0, value as u32); + caller.set_reg(Reg::A1, (value >> 32) as u32); + }, + } + } + + Ok(()) +} + +pub fn create_runtime(blob: &polkavm::ProgramBlob) -> Result, WasmError> +where + H: HostFunctions, +{ + static ENGINE: std::sync::OnceLock> = + std::sync::OnceLock::new(); + + let engine = ENGINE.get_or_init(|| { + let config = polkavm::Config::from_env()?; + polkavm::Engine::new(&config) + }); + + let engine = match engine { + Ok(ref engine) => engine, + Err(ref error) => { + return Err(WasmError::Other(error.to_string())); + }, + }; + + let module = polkavm::Module::from_blob(&engine, &polkavm::ModuleConfig::default(), blob)?; + let mut linker = polkavm::Linker::new(&engine); + for function in H::host_functions() { + linker.func_new(function.name(), |mut caller| call_host_function(&mut caller, function))?; + } + + let instance_pre = linker.instantiate_pre(&module)?; + Ok(Box::new(InstancePre(instance_pre))) +} diff --git a/substrate/client/executor/runtime-test/src/lib.rs b/substrate/client/executor/runtime-test/src/lib.rs index ec9b2378d4d463b36fdd7370e013ab4de6849226..40683fbb664aadb6daf68595befcc68881322f05 100644 --- a/substrate/client/executor/runtime-test/src/lib.rs +++ b/substrate/client/executor/runtime-test/src/lib.rs @@ -181,7 +181,7 @@ sp_core::wasm_export_functions! { sig.copy_from_slice(&input[32..96]); let msg = b"all ok!"; - ed25519_verify(&ed25519::Signature(sig), &msg[..], &ed25519::Public(pubkey)) + ed25519_verify(&ed25519::Signature::from(sig), &msg[..], &ed25519::Public::from(pubkey)) } fn test_sr25519_verify(input: Vec) -> bool { @@ -192,7 +192,7 @@ sp_core::wasm_export_functions! { sig.copy_from_slice(&input[32..96]); let msg = b"all ok!"; - sr25519_verify(&sr25519::Signature(sig), &msg[..], &sr25519::Public(pubkey)) + sr25519_verify(&sr25519::Signature::from(sig), &msg[..], &sr25519::Public::from(pubkey)) } fn test_ordered_trie_root() -> Vec { diff --git a/substrate/client/executor/src/executor.rs b/substrate/client/executor/src/executor.rs index 499bb704b16990de49d2b3311c48fa8ee2c1813e..d56a3b389ef42868d0543303c5fbd63ea8d2d884 100644 --- a/substrate/client/executor/src/executor.rs +++ b/substrate/client/executor/src/executor.rs @@ -518,7 +518,7 @@ where runtime_code, ext, heap_alloc_strategy, - |_, mut instance, _onchain_version, mut ext| { + |_, mut instance, _on_chain_version, mut ext| { with_externalities_safe(&mut **ext, move || instance.call_export(method, data)) }, ); @@ -682,18 +682,18 @@ impl CodeExecutor for NativeElseWasmExecut runtime_code, ext, heap_alloc_strategy, - |_, mut instance, onchain_version, mut ext| { - let onchain_version = - onchain_version.ok_or_else(|| Error::ApiError("Unknown version".into()))?; + |_, mut instance, on_chain_version, mut ext| { + let on_chain_version = + on_chain_version.ok_or_else(|| Error::ApiError("Unknown version".into()))?; let can_call_with = - onchain_version.can_call_with(&self.native_version.runtime_version); + on_chain_version.can_call_with(&self.native_version.runtime_version); if use_native && can_call_with { tracing::trace!( target: "executor", native = %self.native_version.runtime_version, - chain = %onchain_version, + chain = %on_chain_version, "Request for native execution succeeded", ); @@ -705,7 +705,7 @@ impl CodeExecutor for NativeElseWasmExecut tracing::trace!( target: "executor", native = %self.native_version.runtime_version, - chain = %onchain_version, + chain = %on_chain_version, "Request for native execution failed", ); } diff --git a/substrate/client/executor/src/lib.rs b/substrate/client/executor/src/lib.rs index 25bad81938f383e66eb1e63fb1c8ddcbea3a387f..6b99f0a6ee03b303d2d97ce05040828e3248312b 100644 --- a/substrate/client/executor/src/lib.rs +++ b/substrate/client/executor/src/lib.rs @@ -29,7 +29,6 @@ //! wasm engine used, instance cache. #![warn(missing_docs)] -#![recursion_limit = "128"] #[macro_use] mod executor; diff --git a/substrate/client/executor/src/wasm_runtime.rs b/substrate/client/executor/src/wasm_runtime.rs index 501279a312cc09bdaada09b64895a1e6c5a2c87a..be8344ba79b7d78f8d49880ea73754788f33ff3e 100644 --- a/substrate/client/executor/src/wasm_runtime.rs +++ b/substrate/client/executor/src/wasm_runtime.rs @@ -297,6 +297,10 @@ pub fn create_wasm_runtime_with_code( where H: HostFunctions, { + if let Some(blob) = blob.as_polkavm_blob() { + return sc_executor_polkavm::create_runtime::(blob); + } + match wasm_method { WasmExecutionMethod::Compiled { instantiation_strategy } => sc_executor_wasmtime::create_runtime::( diff --git a/substrate/client/executor/wasmtime/Cargo.toml b/substrate/client/executor/wasmtime/Cargo.toml index 12e6647c69522f24d9e51b3b36c87a759311c955..f3fef4046914128dff2ad0904d445e89cba11c6a 100644 --- a/substrate/client/executor/wasmtime/Cargo.toml +++ b/substrate/client/executor/wasmtime/Cargo.toml @@ -16,7 +16,7 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -log = "0.4.17" +log = { workspace = true, default-features = true } cfg-if = "1.0" libc = "0.2.152" parking_lot = "0.12.1" @@ -30,7 +30,7 @@ wasmtime = { version = "8.0.1", default-features = false, features = [ "parallel-compilation", "pooling-allocator", ] } -anyhow = "1.0.68" +anyhow = "1.0.81" sc-allocator = { path = "../../allocator" } sc-executor-common = { path = "../common" } sp-runtime-interface = { path = "../../../primitives/runtime-interface" } diff --git a/substrate/client/executor/wasmtime/src/instance_wrapper.rs b/substrate/client/executor/wasmtime/src/instance_wrapper.rs index 8852532adbcaa40293f2d7dfd0a326572d3c1ca4..4f67d1df9c5f3193d508b408c48c5c1230de2b54 100644 --- a/substrate/client/executor/wasmtime/src/instance_wrapper.rs +++ b/substrate/client/executor/wasmtime/src/instance_wrapper.rs @@ -22,36 +22,12 @@ use std::sync::Arc; use crate::runtime::{InstanceCounter, ReleaseInstanceHandle, Store, StoreData}; -use sc_executor_common::{ - error::{Backtrace, Error, MessageWithBacktrace, Result, WasmError}, - wasm_runtime::InvokeMethod, -}; -use sp_wasm_interface::{Pointer, Value, WordSize}; -use wasmtime::{ - AsContext, AsContextMut, Engine, Extern, Instance, InstancePre, Memory, Table, Val, -}; - -/// Invoked entrypoint format. -pub enum EntryPointType { - /// Direct call. - /// - /// Call is made by providing only payload reference and length. - Direct { entrypoint: wasmtime::TypedFunc<(u32, u32), u64> }, - /// Indirect call. - /// - /// Call is made by providing payload reference and length, and extra argument - /// for advanced routing. - Wrapped { - /// The extra argument passed to the runtime. It is typically a wasm function pointer. - func: u32, - dispatcher: wasmtime::TypedFunc<(u32, u32, u32), u64>, - }, -} +use sc_executor_common::error::{Backtrace, Error, MessageWithBacktrace, Result, WasmError}; +use sp_wasm_interface::{Pointer, WordSize}; +use wasmtime::{AsContext, AsContextMut, Engine, Instance, InstancePre, Memory}; /// Wasm blob entry point. -pub struct EntryPoint { - call_type: EntryPointType, -} +pub struct EntryPoint(wasmtime::TypedFunc<(u32, u32), u64>); impl EntryPoint { /// Call this entry point. @@ -64,13 +40,7 @@ impl EntryPoint { let data_ptr = u32::from(data_ptr); let data_len = u32::from(data_len); - match self.call_type { - EntryPointType::Direct { ref entrypoint } => - entrypoint.call(&mut *store, (data_ptr, data_len)), - EntryPointType::Wrapped { func, ref dispatcher } => - dispatcher.call(&mut *store, (func, data_ptr, data_len)), - } - .map_err(|trap| { + self.0.call(&mut *store, (data_ptr, data_len)).map_err(|trap| { let host_state = store .data_mut() .host_state @@ -99,18 +69,7 @@ impl EntryPoint { let entrypoint = func .typed::<(u32, u32), u64>(ctx) .map_err(|_| "Invalid signature for direct entry point")?; - Ok(Self { call_type: EntryPointType::Direct { entrypoint } }) - } - - pub fn wrapped( - dispatcher: wasmtime::Func, - func: u32, - ctx: impl AsContext, - ) -> std::result::Result { - let dispatcher = dispatcher - .typed::<(u32, u32, u32), u64>(ctx) - .map_err(|_| "Invalid signature for wrapped entry point")?; - Ok(Self { call_type: EntryPointType::Wrapped { func, dispatcher } }) + Ok(Self(entrypoint)) } } @@ -178,10 +137,8 @@ impl InstanceWrapper { })?; let memory = get_linear_memory(&instance, &mut store)?; - let table = get_table(&instance, &mut store); store.data_mut().memory = Some(memory); - store.data_mut().table = table; Ok(InstanceWrapper { instance, store, _release_instance_handle }) } @@ -190,61 +147,17 @@ impl InstanceWrapper { /// /// An entrypoint must have a signature `(i32, i32) -> i64`, otherwise this function will return /// an error. - pub fn resolve_entrypoint(&mut self, method: InvokeMethod) -> Result { - Ok(match method { - InvokeMethod::Export(method) => { - // Resolve the requested method and verify that it has a proper signature. - let export = - self.instance.get_export(&mut self.store, method).ok_or_else(|| { - Error::from(format!("Exported method {} is not found", method)) - })?; - let func = export - .into_func() - .ok_or_else(|| Error::from(format!("Export {} is not a function", method)))?; - EntryPoint::direct(func, &self.store).map_err(|_| { - Error::from(format!("Exported function '{}' has invalid signature.", method)) - })? - }, - InvokeMethod::Table(func_ref) => { - let table = self - .instance - .get_table(&mut self.store, "__indirect_function_table") - .ok_or(Error::NoTable)?; - let val = table - .get(&mut self.store, func_ref) - .ok_or(Error::NoTableEntryWithIndex(func_ref))?; - let func = val - .funcref() - .ok_or(Error::TableElementIsNotAFunction(func_ref))? - .ok_or(Error::FunctionRefIsNull(func_ref))?; - - EntryPoint::direct(*func, &self.store).map_err(|_| { - Error::from(format!( - "Function @{} in exported table has invalid signature for direct call.", - func_ref, - )) - })? - }, - InvokeMethod::TableWithWrapper { dispatcher_ref, func } => { - let table = self - .instance - .get_table(&mut self.store, "__indirect_function_table") - .ok_or(Error::NoTable)?; - let val = table - .get(&mut self.store, dispatcher_ref) - .ok_or(Error::NoTableEntryWithIndex(dispatcher_ref))?; - let dispatcher = val - .funcref() - .ok_or(Error::TableElementIsNotAFunction(dispatcher_ref))? - .ok_or(Error::FunctionRefIsNull(dispatcher_ref))?; - - EntryPoint::wrapped(*dispatcher, func, &self.store).map_err(|_| { - Error::from(format!( - "Function @{} in exported table has invalid signature for wrapped call.", - dispatcher_ref, - )) - })? - }, + pub fn resolve_entrypoint(&mut self, method: &str) -> Result { + // Resolve the requested method and verify that it has a proper signature. + let export = self + .instance + .get_export(&mut self.store, method) + .ok_or_else(|| Error::from(format!("Exported method {} is not found", method)))?; + let func = export + .into_func() + .ok_or_else(|| Error::from(format!("Export {} is not a function", method)))?; + EntryPoint::direct(func, &self.store).map_err(|_| { + Error::from(format!("Exported function '{}' has invalid signature.", method)) }) } @@ -268,24 +181,6 @@ impl InstanceWrapper { Ok(heap_base as u32) } - - /// Get the value from a global with the given `name`. - pub fn get_global_val(&mut self, name: &str) -> Result> { - let global = match self.instance.get_export(&mut self.store, name) { - Some(global) => global, - None => return Ok(None), - }; - - let global = global.into_global().ok_or_else(|| format!("`{}` is not a global", name))?; - - match global.get(&mut self.store) { - Val::I32(val) => Ok(Some(Value::I32(val))), - Val::I64(val) => Ok(Some(Value::I64(val))), - Val::F32(val) => Ok(Some(Value::F32(val))), - Val::F64(val) => Ok(Some(Value::F64(val))), - _ => Err("Unknown value type".into()), - } - } } /// Extract linear memory instance from the given instance. @@ -301,15 +196,6 @@ fn get_linear_memory(instance: &Instance, ctx: impl AsContextMut) -> Result Option { - instance - .get_export(ctx, "__indirect_function_table") - .as_ref() - .cloned() - .and_then(Extern::into_table) -} - /// Functions related to memory. impl InstanceWrapper { pub(crate) fn store(&self) -> &Store { diff --git a/substrate/client/executor/wasmtime/src/runtime.rs b/substrate/client/executor/wasmtime/src/runtime.rs index ac88663f4e7915e49262ee8186bfaf7d92f6064d..286d134ecd1715cdd876e3412c37958acfc93b71 100644 --- a/substrate/client/executor/wasmtime/src/runtime.rs +++ b/substrate/client/executor/wasmtime/src/runtime.rs @@ -30,10 +30,10 @@ use sc_executor_common::{ error::{Error, Result, WasmError}, runtime_blob::RuntimeBlob, util::checked_range, - wasm_runtime::{HeapAllocStrategy, InvokeMethod, WasmInstance, WasmModule}, + wasm_runtime::{HeapAllocStrategy, WasmInstance, WasmModule}, }; use sp_runtime_interface::unpack_ptr_and_len; -use sp_wasm_interface::{HostFunctions, Pointer, Value, WordSize}; +use sp_wasm_interface::{HostFunctions, Pointer, WordSize}; use std::{ path::{Path, PathBuf}, sync::{ @@ -41,7 +41,7 @@ use std::{ Arc, }, }; -use wasmtime::{AsContext, Engine, Memory, Table}; +use wasmtime::{AsContext, Engine, Memory}; const MAX_INSTANCE_COUNT: u32 = 64; @@ -51,8 +51,6 @@ pub(crate) struct StoreData { pub(crate) host_state: Option, /// This will be always set once the store is initialized. pub(crate) memory: Option, - /// This will be set only if the runtime actually contains a table. - pub(crate) table: Option
, } impl StoreData { @@ -164,7 +162,7 @@ pub struct WasmtimeInstance { impl WasmtimeInstance { fn call_impl( &mut self, - method: InvokeMethod, + method: &str, data: &[u8], allocation_stats: &mut Option, ) -> Result> { @@ -184,20 +182,13 @@ impl WasmtimeInstance { impl WasmInstance for WasmtimeInstance { fn call_with_allocation_stats( &mut self, - method: InvokeMethod, + method: &str, data: &[u8], ) -> (Result>, Option) { let mut allocation_stats = None; let result = self.call_impl(method, data, &mut allocation_stats); (result, allocation_stats) } - - fn get_global_const(&mut self, name: &str) -> Result> { - match &mut self.strategy { - Strategy::RecreateInstance(ref mut instance_creator) => - instance_creator.instantiate()?.get_global_val(name), - } - } } /// Prepare a directory structure and a config file to enable wasmtime caching. @@ -471,7 +462,7 @@ pub struct Semantics { pub struct Config { /// The WebAssembly standard requires all imports of an instantiated module to be resolved, /// otherwise, the instantiation fails. If this option is set to `true`, then this behavior is - /// overriden and imports that are requested by the module and not provided by the host + /// overridden and imports that are requested by the module and not provided by the host /// functions will be resolved using stubs. These stubs will trap upon a call. pub allow_missing_func_imports: bool, diff --git a/substrate/client/executor/wasmtime/src/tests.rs b/substrate/client/executor/wasmtime/src/tests.rs index 1c06da1e3c142f58d4fa3ec64cf87577190218f8..f86a4275769401712622112c6a2c587d11e1adc4 100644 --- a/substrate/client/executor/wasmtime/src/tests.rs +++ b/substrate/client/executor/wasmtime/src/tests.rs @@ -254,7 +254,7 @@ fn test_nan_canonicalization(instantiation_strategy: InstantiationStrategy) { /// A NaN with canonical payload bits. const CANONICAL_NAN_BITS: u32 = 0x7fc00000; - /// A NaN value with an abitrary payload. + /// A NaN value with an arbitrary payload. const ARBITRARY_NAN_BITS: u32 = 0x7f812345; // This test works like this: we essentially do @@ -272,7 +272,7 @@ fn test_nan_canonicalization(instantiation_strategy: InstantiationStrategy) { // However, with the `canonicalize_nans` option turned on above, we expect that the output will // be a canonical NaN. // - // We exterpolate the results of this tests so that we assume that all intermediate computations + // We extrapolate the results of this tests so that we assume that all intermediate computations // that involve floats are sanitized and cannot produce a non-deterministic NaN. let params = (u32::to_le_bytes(ARBITRARY_NAN_BITS), u32::to_le_bytes(1)).encode(); diff --git a/substrate/client/informant/Cargo.toml b/substrate/client/informant/Cargo.toml index 0252e9a11572cc5f99cb30b513820e4c4f922473..191ef5f19f8df65b3c817129fe34c4db7438826d 100644 --- a/substrate/client/informant/Cargo.toml +++ b/substrate/client/informant/Cargo.toml @@ -17,9 +17,9 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] ansi_term = "0.12.1" -futures = "0.3.21" +futures = "0.3.30" futures-timer = "3.0.1" -log = "0.4.17" +log = { workspace = true, default-features = true } sc-client-api = { path = "../api" } sc-network-common = { path = "../network/common" } sc-network-sync = { path = "../network/sync" } diff --git a/substrate/client/informant/src/lib.rs b/substrate/client/informant/src/lib.rs index 7db80bb2d972591aae5944cd1cafd5cba876ecbc..af778529ffc58e13736352265b74856477f597eb 100644 --- a/substrate/client/informant/src/lib.rs +++ b/substrate/client/informant/src/lib.rs @@ -187,10 +187,12 @@ where last_blocks.pop_front(); } + let best_indicator = if n.is_new_best { "🏆" } else { "🆕" }; info!( target: "substrate", - "✨ Imported #{} ({})", + "{best_indicator} Imported #{} ({} → {})", format.print_with_color(Colour::White.bold(), n.header.number()), + n.header.parent_hash(), n.hash, ); } diff --git a/substrate/client/keystore/Cargo.toml b/substrate/client/keystore/Cargo.toml index dc6a0fe29a84876c5c117a199017d1e8bda81590..908e0aa8f38ced48facaf99d05c0d7771f03fa26 100644 --- a/substrate/client/keystore/Cargo.toml +++ b/substrate/client/keystore/Cargo.toml @@ -19,8 +19,8 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] array-bytes = "6.1" parking_lot = "0.12.1" -serde_json = "1.0.111" -thiserror = "1.0" +serde_json = { workspace = true, default-features = true } +thiserror = { workspace = true } sp-application-crypto = { path = "../../primitives/application-crypto" } sp-core = { path = "../../primitives/core" } sp-keystore = { path = "../../primitives/keystore" } diff --git a/substrate/client/keystore/src/local.rs b/substrate/client/keystore/src/local.rs index 3b29f435e2a942ffe96dd02a8009af4d33693995..8b922c11cbca990a0f4f87e4e3f25bbec2a55290 100644 --- a/substrate/client/keystore/src/local.rs +++ b/substrate/client/keystore/src/local.rs @@ -37,7 +37,7 @@ use sp_core::bandersnatch; } sp_keystore::bls_experimental_enabled! { -use sp_core::{bls377, bls381, ecdsa_bls377}; +use sp_core::{bls377, bls381, ecdsa_bls377, KeccakHasher}; } use crate::{Error, Result}; @@ -47,6 +47,13 @@ pub struct LocalKeystore(RwLock); impl LocalKeystore { /// Create a local keystore from filesystem. + /// + /// The keystore will be created at `path`. The keystore optionally supports to encrypt/decrypt + /// the keys in the keystore using `password`. + /// + /// NOTE: Even when passing a `password`, the keys on disk appear to look like normal secret + /// uris. However, without having the correct password the secret uri will not generate the + /// correct private key. See [`SecretUri`](sp_core::crypto::SecretUri) for more information. pub fn open>(path: T, password: Option) -> Result { let inner = KeystoreInner::open(path, password)?; Ok(Self(RwLock::new(inner))) @@ -136,6 +143,13 @@ impl LocalKeystore { } impl Keystore for LocalKeystore { + /// Insert a new secret key. + /// + /// WARNING: if the secret keypair has been manually generated using a password + /// (e.g. using methods such as [`sp_core::crypto::Pair::from_phrase`]) then such + /// a password must match the one used to open the keystore via [`LocalKeystore::open`]. + /// If the passwords doesn't match then the inserted key ends up being unusable under + /// the current keystore instance. fn insert( &self, key_type: KeyTypeId, @@ -391,6 +405,20 @@ impl Keystore for LocalKeystore { self.sign::(key_type, public, msg) } + fn ecdsa_bls377_sign_with_keccak256( + &self, + key_type: KeyTypeId, + public: &ecdsa_bls377::Public, + msg: &[u8], + ) -> std::result::Result, TraitError> { + let sig = self.0 + .read() + .key_pair_by_type::(public, key_type)? + .map(|pair| pair.sign_with_hasher::(msg)); + Ok(sig) + } + + } } diff --git a/substrate/client/merkle-mountain-range/Cargo.toml b/substrate/client/merkle-mountain-range/Cargo.toml index 201c179f302c729d4c4a5864dd44ed9bc0e2896e..46b7a1011c465f1aced062ba6978580a5f85c43c 100644 --- a/substrate/client/merkle-mountain-range/Cargo.toml +++ b/substrate/client/merkle-mountain-range/Cargo.toml @@ -15,8 +15,8 @@ workspace = true [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1" } -futures = "0.3" -log = "0.4" +futures = "0.3.30" +log = { workspace = true, default-features = true } sp-api = { path = "../../primitives/api" } sp-blockchain = { path = "../../primitives/blockchain" } sc-client-api = { path = "../api" } @@ -32,4 +32,4 @@ parking_lot = "0.12.1" sc-block-builder = { path = "../block-builder" } sp-tracing = { path = "../../primitives/tracing" } substrate-test-runtime-client = { path = "../../test-utils/runtime/client" } -tokio = "1.17.0" +tokio = "1.37" diff --git a/substrate/client/merkle-mountain-range/rpc/Cargo.toml b/substrate/client/merkle-mountain-range/rpc/Cargo.toml index 99467e5468f07c826bc18d05f91e193e27041298..9b391b76ea00b5e48700b7213afb691c149167ab 100644 --- a/substrate/client/merkle-mountain-range/rpc/Cargo.toml +++ b/substrate/client/merkle-mountain-range/rpc/Cargo.toml @@ -16,8 +16,8 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1" } -jsonrpsee = { version = "0.20.3", features = ["client-core", "macros", "server"] } -serde = { version = "1.0.195", features = ["derive"] } +jsonrpsee = { version = "0.22", features = ["client-core", "macros", "server"] } +serde = { features = ["derive"], workspace = true, default-features = true } sp-api = { path = "../../../primitives/api" } sp-blockchain = { path = "../../../primitives/blockchain" } sp-core = { path = "../../../primitives/core" } @@ -25,4 +25,4 @@ sp-mmr-primitives = { path = "../../../primitives/merkle-mountain-range" } sp-runtime = { path = "../../../primitives/runtime" } [dev-dependencies] -serde_json = "1.0.111" +serde_json = { workspace = true, default-features = true } diff --git a/substrate/client/mixnet/Cargo.toml b/substrate/client/mixnet/Cargo.toml index 280af81b86ef631b5c99588eef28f20471c65bc8..65b81bda4b08de83101a01880d1aaac1a358e1ad 100644 --- a/substrate/client/mixnet/Cargo.toml +++ b/substrate/client/mixnet/Cargo.toml @@ -21,15 +21,15 @@ arrayvec = "0.7.2" blake2 = "0.10.4" bytes = "1" codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } -futures = "0.3.25" +futures = "0.3.30" futures-timer = "3.0.2" -libp2p-identity = { version = "0.1.3", features = ["peerid"] } -log = "0.4.17" +log = { workspace = true, default-features = true } mixnet = "0.7.0" multiaddr = "0.17.1" parking_lot = "0.12.1" sc-client-api = { path = "../api" } sc-network = { path = "../network" } +sc-network-types = { path = "../network/types" } sc-transaction-pool-api = { path = "../transaction-pool/api" } sp-api = { path = "../../primitives/api" } sp-consensus = { path = "../../primitives/consensus/common" } @@ -37,4 +37,4 @@ sp-core = { path = "../../primitives/core" } sp-keystore = { path = "../../primitives/keystore" } sp-mixnet = { path = "../../primitives/mixnet" } sp-runtime = { path = "../../primitives/runtime" } -thiserror = "1.0" +thiserror = { workspace = true } diff --git a/substrate/client/mixnet/src/packet_dispatcher.rs b/substrate/client/mixnet/src/packet_dispatcher.rs index 420e0c68847d86cb3cb76db3908994da44c09cb6..a7093527a0d9e7e3caaa115ffeeee14ec475f80b 100644 --- a/substrate/client/mixnet/src/packet_dispatcher.rs +++ b/substrate/client/mixnet/src/packet_dispatcher.rs @@ -20,11 +20,11 @@ use super::peer_id::{from_core_peer_id, to_core_peer_id}; use arrayvec::ArrayVec; -use libp2p_identity::PeerId; use log::{debug, warn}; use mixnet::core::{AddressedPacket, NetworkStatus, Packet, PeerId as CorePeerId}; use parking_lot::Mutex; use sc_network::NotificationService; +use sc_network_types::PeerId; use std::{collections::HashMap, future::Future, sync::Arc}; const LOG_TARGET: &str = "mixnet"; diff --git a/substrate/client/mixnet/src/peer_id.rs b/substrate/client/mixnet/src/peer_id.rs index 7984da8c75be77e245cd88b06451d38f443f904d..c9c53a0093c7a63473cd3c5b2bbefa4e37dc1510 100644 --- a/substrate/client/mixnet/src/peer_id.rs +++ b/substrate/client/mixnet/src/peer_id.rs @@ -16,21 +16,15 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -use libp2p_identity::PeerId; use mixnet::core::PeerId as CorePeerId; +use sc_network_types::PeerId; /// Convert a libp2p [`PeerId`] into a mixnet core [`PeerId`](CorePeerId). /// /// This will succeed only if `peer_id` is an Ed25519 public key ("hashed" using the identity /// hasher). Returns `None` on failure. pub fn to_core_peer_id(peer_id: &PeerId) -> Option { - let hash = peer_id.as_ref(); - if hash.code() != 0 { - // Hash is not identity - return None - } - let public = libp2p_identity::PublicKey::try_decode_protobuf(hash.digest()).ok()?; - public.try_into_ed25519().ok().map(|public| public.to_bytes()) + peer_id.into_ed25519() } /// Convert a mixnet core [`PeerId`](CorePeerId) into a libp2p [`PeerId`]. @@ -38,7 +32,5 @@ pub fn to_core_peer_id(peer_id: &PeerId) -> Option { /// This will succeed only if `peer_id` represents a point on the Ed25519 curve. Returns `None` on /// failure. pub fn from_core_peer_id(core_peer_id: &CorePeerId) -> Option { - let public = libp2p_identity::ed25519::PublicKey::try_from_bytes(core_peer_id).ok()?; - let public: libp2p_identity::PublicKey = public.into(); - Some(public.into()) + PeerId::from_ed25519(core_peer_id) } diff --git a/substrate/client/mixnet/src/protocol.rs b/substrate/client/mixnet/src/protocol.rs index 955502a4856a9aa8f143baa1cee7323ed005a078..c3139fd235a7abb692301bf9db7dad59999e4648 100644 --- a/substrate/client/mixnet/src/protocol.rs +++ b/substrate/client/mixnet/src/protocol.rs @@ -19,9 +19,12 @@ use super::config::Config; use mixnet::core::PACKET_SIZE; use sc_network::{ - config::{NonDefaultSetConfig, NonReservedPeerMode, SetConfig}, - NotificationService, ProtocolName, + config::{NonReservedPeerMode, SetConfig}, + peer_store::PeerStoreProvider, + service::NotificationMetrics, + NetworkBackend, NotificationService, ProtocolName, }; +use sp_runtime::traits::Block as BlockT; /// Returns the protocol name to use for the mixnet controlled by the given chain. pub fn protocol_name(genesis_hash: &[u8], fork_id: Option<&str>) -> ProtocolName { @@ -34,26 +37,37 @@ pub fn protocol_name(genesis_hash: &[u8], fork_id: Option<&str>) -> ProtocolName } /// Returns the peers set configuration for the mixnet protocol. -pub fn peers_set_config( +pub fn peers_set_config::Hash>>( name: ProtocolName, config: &Config, -) -> (NonDefaultSetConfig, Box) { - let (mut set_config, service) = NonDefaultSetConfig::new( - name, - Vec::new(), - PACKET_SIZE as u64, - None, + metrics: NotificationMetrics, + peerstore_handle: std::sync::Arc, +) -> (Network::NotificationProtocolConfig, Box) { + let set_config = if config.substrate.num_gateway_slots != 0 { + // out_peers is always 0; we are only interested in connecting to mixnodes, which we do by + // setting them as reserved nodes + SetConfig { + in_peers: config.substrate.num_gateway_slots, + out_peers: 0, + reserved_nodes: Vec::new(), + non_reserved_mode: NonReservedPeerMode::Accept, + } + } else { SetConfig { in_peers: 0, out_peers: 0, reserved_nodes: Vec::new(), non_reserved_mode: NonReservedPeerMode::Deny, - }, - ); - if config.substrate.num_gateway_slots != 0 { - // out_peers is always 0; we are only interested in connecting to mixnodes, which we do by - // setting them as reserved nodes - set_config.allow_non_reserved(config.substrate.num_gateway_slots, 0); - } - (set_config, service) + } + }; + + Network::notification_config( + name, + Vec::new(), + PACKET_SIZE as u64, + None, + set_config, + metrics, + peerstore_handle, + ) } diff --git a/substrate/client/mixnet/src/run.rs b/substrate/client/mixnet/src/run.rs index 14d188df097721bc33c54199ce9ca7bd13c38cb2..5ed45a0e799ed7e8bb5ca030fcaa69b7515d427e 100644 --- a/substrate/client/mixnet/src/run.rs +++ b/substrate/client/mixnet/src/run.rs @@ -44,8 +44,8 @@ use mixnet::{ }; use sc_client_api::{BlockchainEvents, HeaderBackend}; use sc_network::{ - service::traits::{NotificationEvent, ValidationResult}, - NetworkNotification, NetworkPeers, NetworkStateInfo, NotificationService, ProtocolName, + service::traits::{NetworkService, NotificationEvent, ValidationResult}, + NetworkPeers, NetworkStateInfo, NotificationService, ProtocolName, }; use sc_transaction_pool_api::{ LocalTransactionPool, OffchainTransactionPoolFactory, TransactionPool, @@ -146,12 +146,12 @@ fn time_until(instant: Instant) -> Duration { /// Run the mixnet service. If `keystore` is `None`, the service will not attempt to register the /// local node as a mixnode, even if `config.register` is `true`. -pub async fn run( +pub async fn run( config: Config, mut api_backend: ApiBackend, client: Arc, sync: Arc, - network: Arc, + network: Arc, protocol_name: ProtocolName, transaction_pool: Arc

, keystore: Option, @@ -161,7 +161,6 @@ pub async fn run( C: BlockchainEvents + ProvideRuntimeApi + HeaderBackend, C::Api: MixnetApi, S: SyncOracle, - N: NetworkStateInfo + NetworkNotification + NetworkPeers, P: TransactionPool + LocalTransactionPool + 'static, { let local_peer_id = network.local_peer_id(); diff --git a/substrate/client/mixnet/src/sync_with_runtime.rs b/substrate/client/mixnet/src/sync_with_runtime.rs index f3be96025410dbbbf28cb24197a6e09ff436cae9..46c2334ceb46d8ef7966b666e480e83075a51703 100644 --- a/substrate/client/mixnet/src/sync_with_runtime.rs +++ b/substrate/client/mixnet/src/sync_with_runtime.rs @@ -20,13 +20,13 @@ //! runtime to the core mixnet state. It is called every time a block is finalised. use super::peer_id::from_core_peer_id; -use libp2p_identity::PeerId; use log::{debug, info}; use mixnet::core::{ Mixnet, Mixnode as CoreMixnode, MixnodesErr as CoreMixnodesErr, RelSessionIndex, SessionPhase as CoreSessionPhase, SessionStatus as CoreSessionStatus, }; use multiaddr::{multiaddr, Multiaddr, Protocol}; +use sc_network_types::PeerId; use sp_api::{ApiError, ApiRef}; use sp_mixnet::{ runtime_api::MixnetApi, diff --git a/substrate/client/network-gossip/Cargo.toml b/substrate/client/network-gossip/Cargo.toml index baf4def0b8e7d2fbfca34c17d6680d37b65fdf71..ad81381edea1800035a96b608681c5f3691d2d05 100644 --- a/substrate/client/network-gossip/Cargo.toml +++ b/substrate/client/network-gossip/Cargo.toml @@ -18,21 +18,22 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] ahash = "0.8.2" -futures = "0.3.21" +futures = "0.3.30" futures-timer = "3.0.1" libp2p = "0.51.4" -log = "0.4.17" +log = { workspace = true, default-features = true } schnellru = "0.2.1" tracing = "0.1.29" prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../utils/prometheus" } sc-network = { path = "../network" } sc-network-common = { path = "../network/common" } sc-network-sync = { path = "../network/sync" } +sc-network-types = { path = "../network/types" } sp-runtime = { path = "../../primitives/runtime" } [dev-dependencies] -tokio = "1.22.0" -async-trait = "0.1.74" +tokio = "1.37" +async-trait = "0.1.79" codec = { package = "parity-scale-codec", version = "3.0.0", features = ["derive"] } quickcheck = { version = "1.0.3", default-features = false } substrate-test-runtime-client = { path = "../../test-utils/runtime/client" } diff --git a/substrate/client/network-gossip/src/bridge.rs b/substrate/client/network-gossip/src/bridge.rs index 1d6a4bdd0c086996ed45a7074a1a51bcf34f12d9..cd344d9196d873b820c11246f1518e81a87f8683 100644 --- a/substrate/client/network-gossip/src/bridge.rs +++ b/substrate/client/network-gossip/src/bridge.rs @@ -32,9 +32,9 @@ use futures::{ channel::mpsc::{channel, Receiver, Sender}, prelude::*, }; -use libp2p::PeerId; use log::trace; use prometheus_endpoint::Registry; +use sc_network_types::PeerId; use sp_runtime::traits::Block as BlockT; use std::{ collections::{HashMap, VecDeque}, @@ -359,9 +359,7 @@ mod tests { use sc_network::{ config::MultiaddrWithPeerId, service::traits::{Direction, MessageSink, NotificationEvent}, - Event, NetworkBlock, NetworkEventStream, NetworkNotification, NetworkPeers, - NotificationSenderError, NotificationSenderT as NotificationSender, NotificationService, - Roles, + Event, NetworkBlock, NetworkEventStream, NetworkPeers, NotificationService, Roles, }; use sc_network_common::role::ObservedRole; use sc_network_sync::SyncEventStream; @@ -381,6 +379,7 @@ mod tests { #[derive(Clone, Default)] struct TestNetworkInner {} + #[async_trait::async_trait] impl NetworkPeers for TestNetwork { fn set_authorized_peers(&self, _peers: HashSet) { unimplemented!(); @@ -453,28 +452,14 @@ mod tests { .ok() .and_then(|role| Some(ObservedRole::from(role))) } - } - impl NetworkEventStream for TestNetwork { - fn event_stream(&self, _name: &'static str) -> Pin + Send>> { + async fn reserved_peers(&self) -> Result, ()> { unimplemented!(); } } - impl NetworkNotification for TestNetwork { - fn write_notification(&self, _target: PeerId, _protocol: ProtocolName, _message: Vec) { - unimplemented!(); - } - - fn notification_sender( - &self, - _target: PeerId, - _protocol: ProtocolName, - ) -> Result, NotificationSenderError> { - unimplemented!(); - } - - fn set_notification_handshake(&self, _protocol: ProtocolName, _handshake: Vec) { + impl NetworkEventStream for TestNetwork { + fn event_stream(&self, _name: &'static str) -> Pin + Send>> { unimplemented!(); } } @@ -544,12 +529,12 @@ mod tests { unimplemented!(); } - fn send_sync_notification(&self, _peer: &PeerId, _notification: Vec) { + fn send_sync_notification(&mut self, _peer: &PeerId, _notification: Vec) { unimplemented!(); } async fn send_async_notification( - &self, + &mut self, _peer: &PeerId, _notification: Vec, ) -> Result<(), sc_network::error::Error> { diff --git a/substrate/client/network-gossip/src/lib.rs b/substrate/client/network-gossip/src/lib.rs index a77141ec6f63b52cd04e8dd60a00243b49ec0570..e04ea2a91e7cbc59ae652dace7ede5398bedf01c 100644 --- a/substrate/client/network-gossip/src/lib.rs +++ b/substrate/client/network-gossip/src/lib.rs @@ -67,11 +67,9 @@ pub use self::{ validator::{DiscardAll, MessageIntent, ValidationResult, Validator, ValidatorContext}, }; -use libp2p::{multiaddr, PeerId}; -use sc_network::{ - types::ProtocolName, NetworkBlock, NetworkEventStream, NetworkNotification, NetworkPeers, -}; +use sc_network::{multiaddr, types::ProtocolName, NetworkBlock, NetworkEventStream, NetworkPeers}; use sc_network_sync::SyncEventStream; +use sc_network_types::PeerId; use sp_runtime::traits::{Block as BlockT, NumberFor}; use std::iter; @@ -80,7 +78,7 @@ mod state_machine; mod validator; /// Abstraction over a network. -pub trait Network: NetworkPeers + NetworkEventStream + NetworkNotification { +pub trait Network: NetworkPeers + NetworkEventStream { fn add_set_reserved(&self, who: PeerId, protocol: ProtocolName) { let addr = iter::once(multiaddr::Protocol::P2p(who.into())).collect::(); @@ -97,7 +95,7 @@ pub trait Network: NetworkPeers + NetworkEventStream + NetworkNotific } } -impl Network for T where T: NetworkPeers + NetworkEventStream + NetworkNotification {} +impl Network for T where T: NetworkPeers + NetworkEventStream {} /// Abstraction over the syncing subsystem. pub trait Syncing: SyncEventStream + NetworkBlock> {} diff --git a/substrate/client/network-gossip/src/state_machine.rs b/substrate/client/network-gossip/src/state_machine.rs index 069d7cdba16599b4b4da0965a5d8e4588478d633..016afa95eceaed228012641af0982e103c51eb64 100644 --- a/substrate/client/network-gossip/src/state_machine.rs +++ b/substrate/client/network-gossip/src/state_machine.rs @@ -19,7 +19,7 @@ use crate::{MessageIntent, Network, ValidationResult, Validator, ValidatorContext}; use ahash::AHashSet; -use libp2p::PeerId; +use sc_network_types::PeerId; use schnellru::{ByLength, LruMap}; use prometheus_endpoint::{register, Counter, PrometheusError, Registry, U64}; @@ -546,8 +546,7 @@ mod tests { use futures::prelude::*; use sc_network::{ config::MultiaddrWithPeerId, event::Event, service::traits::NotificationEvent, MessageSink, - NetworkBlock, NetworkEventStream, NetworkNotification, NetworkPeers, - NotificationSenderError, NotificationSenderT as NotificationSender, ReputationChange, + NetworkBlock, NetworkEventStream, NetworkPeers, ReputationChange, }; use sp_runtime::{ testing::{Block as RawBlock, ExtrinsicWrapper, H256}, @@ -608,6 +607,7 @@ mod tests { peer_reports: Vec<(PeerId, ReputationChange)>, } + #[async_trait::async_trait] impl NetworkPeers for NoOpNetwork { fn set_authorized_peers(&self, _peers: HashSet) { unimplemented!(); @@ -680,28 +680,14 @@ mod tests { fn peer_role(&self, _peer_id: PeerId, _handshake: Vec) -> Option { None } - } - impl NetworkEventStream for NoOpNetwork { - fn event_stream(&self, _name: &'static str) -> Pin + Send>> { + async fn reserved_peers(&self) -> Result, ()> { unimplemented!(); } } - impl NetworkNotification for NoOpNetwork { - fn write_notification(&self, _target: PeerId, _protocol: ProtocolName, _message: Vec) { - unimplemented!(); - } - - fn notification_sender( - &self, - _target: PeerId, - _protocol: ProtocolName, - ) -> Result, NotificationSenderError> { - unimplemented!(); - } - - fn set_notification_handshake(&self, _protocol: ProtocolName, _handshake: Vec) { + impl NetworkEventStream for NoOpNetwork { + fn event_stream(&self, _name: &'static str) -> Pin + Send>> { unimplemented!(); } } @@ -736,13 +722,13 @@ mod tests { } /// Send synchronous `notification` to `peer`. - fn send_sync_notification(&self, _peer: &PeerId, _notification: Vec) { + fn send_sync_notification(&mut self, _peer: &PeerId, _notification: Vec) { unimplemented!(); } /// Send asynchronous `notification` to `peer`, allowing sender to exercise backpressure. async fn send_async_notification( - &self, + &mut self, _peer: &PeerId, _notification: Vec, ) -> Result<(), sc_network::error::Error> { diff --git a/substrate/client/network-gossip/src/validator.rs b/substrate/client/network-gossip/src/validator.rs index 2272efba50652492178fe7cfa2c0bcbd731e9138..974c6d9e0cdc0e10e95ab59440241b908fcf2992 100644 --- a/substrate/client/network-gossip/src/validator.rs +++ b/substrate/client/network-gossip/src/validator.rs @@ -16,8 +16,8 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -use libp2p::PeerId; use sc_network_common::role::ObservedRole; +use sc_network_types::PeerId; use sp_runtime::traits::Block as BlockT; /// Validates consensus messages. diff --git a/substrate/client/network/Cargo.toml b/substrate/client/network/Cargo.toml index 167f112705be32a34bbdf062e0499d4c286c40fd..0879481a419930fae590e3ac68cde17f1ceb2207 100644 --- a/substrate/client/network/Cargo.toml +++ b/substrate/client/network/Cargo.toml @@ -16,43 +16,53 @@ workspace = true [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] +[build-dependencies] +prost-build = "0.11" + [dependencies] array-bytes = "6.1" async-channel = "1.8.0" -async-trait = "0.1" +async-trait = "0.1.79" asynchronous-codec = "0.6" bytes = "1" +cid = "0.9.0" codec = { package = "parity-scale-codec", version = "3.6.1", features = ["derive"] } either = "1.5.3" fnv = "1.0.6" -futures = "0.3.21" +futures = "0.3.30" futures-timer = "3.0.2" ip_network = "0.4.1" libp2p = { version = "0.51.4", features = ["dns", "identify", "kad", "macros", "mdns", "noise", "ping", "request-response", "tcp", "tokio", "websocket", "yamux"] } -linked_hash_set = "0.1.3" -log = "0.4.17" +linked_hash_set = "0.1.4" +log = { workspace = true, default-features = true } mockall = "0.11.3" parking_lot = "0.12.1" partial_sort = "0.2.0" pin-project = "1.0.12" rand = "0.8.5" -serde = { version = "1.0.195", features = ["derive"] } -serde_json = "1.0.111" +serde = { features = ["derive"], workspace = true, default-features = true } +serde_json = { workspace = true, default-features = true } smallvec = "1.11.0" -thiserror = "1.0" +thiserror = { workspace = true } tokio = { version = "1.22.0", features = ["macros", "sync"] } tokio-stream = "0.1.7" -unsigned-varint = { version = "0.7.1", features = ["asynchronous_codec", "futures"] } +unsigned-varint = { version = "0.7.2", features = ["asynchronous_codec", "futures"] } zeroize = "1.4.3" prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../utils/prometheus" } +prost = "0.11" sc-client-api = { path = "../api" } sc-network-common = { path = "common" } +sc-network-types = { path = "types" } sc-utils = { path = "../utils" } sp-arithmetic = { path = "../../primitives/arithmetic" } sp-blockchain = { path = "../../primitives/blockchain" } sp-core = { path = "../../primitives/core" } sp-runtime = { path = "../../primitives/runtime" } wasm-timer = "0.2" +litep2p = { git = "https://github.com/paritytech/litep2p", branch = "master" } +once_cell = "1.18.0" +void = "1.0.2" +schnellru = "0.2.1" [dev-dependencies] assert_matches = "1.3" @@ -63,8 +73,11 @@ tempfile = "3.1.0" tokio = { version = "1.22.0", features = ["macros"] } tokio-util = { version = "0.7.4", features = ["compat"] } tokio-test = "0.4.2" +sc-block-builder = { path = "../block-builder" } sc-network-light = { path = "light" } sc-network-sync = { path = "sync" } +sp-crypto-hashing = { path = "../../primitives/crypto/hashing" } +sp-consensus = { path = "../../primitives/consensus/common" } sp-test-primitives = { path = "../../primitives/test-primitives" } sp-tracing = { path = "../../primitives/tracing" } substrate-test-runtime = { path = "../../test-utils/runtime" } diff --git a/substrate/client/network/bitswap/Cargo.toml b/substrate/client/network/bitswap/Cargo.toml deleted file mode 100644 index 9982ef80cf6de65885e8089159bfb95fd5eafd73..0000000000000000000000000000000000000000 --- a/substrate/client/network/bitswap/Cargo.toml +++ /dev/null @@ -1,42 +0,0 @@ -[package] -description = "Substrate bitswap protocol" -name = "sc-network-bitswap" -version = "0.33.0" -license = "GPL-3.0-or-later WITH Classpath-exception-2.0" -authors.workspace = true -edition.workspace = true -homepage = "https://substrate.io" -repository.workspace = true -documentation = "https://docs.rs/sc-network-bitswap" - -[lints] -workspace = true - -[package.metadata.docs.rs] -targets = ["x86_64-unknown-linux-gnu"] - -[build-dependencies] -prost-build = "0.11" - -[dependencies] -async-channel = "1.8.0" -cid = "0.9.0" -futures = "0.3.21" -libp2p-identity = { version = "0.1.3", features = ["peerid"] } -log = "0.4.17" -prost = "0.12" -thiserror = "1.0" -unsigned-varint = { version = "0.7.1", features = ["asynchronous_codec", "futures"] } -sc-client-api = { path = "../../api" } -sc-network = { path = ".." } -sp-blockchain = { path = "../../../primitives/blockchain" } -sp-runtime = { path = "../../../primitives/runtime" } - -[dev-dependencies] -tokio = { version = "1.22.0", features = ["full"] } -sc-block-builder = { path = "../../block-builder" } -sc-consensus = { path = "../../consensus/common" } -sp-crypto-hashing = { path = "../../../primitives/crypto/hashing" } -sp-consensus = { path = "../../../primitives/consensus/common" } -substrate-test-runtime = { path = "../../../test-utils/runtime" } -substrate-test-runtime-client = { path = "../../../test-utils/runtime/client" } diff --git a/substrate/client/network/bitswap/build.rs b/substrate/client/network/build.rs similarity index 100% rename from substrate/client/network/bitswap/build.rs rename to substrate/client/network/build.rs diff --git a/substrate/client/network/common/Cargo.toml b/substrate/client/network/common/Cargo.toml index 7a6d904b74b1820234a8fd5f169a4283e5abefc4..4478693456f7e32bcab4cf6ce8a94a48a5e7c727 100644 --- a/substrate/client/network/common/Cargo.toml +++ b/substrate/client/network/common/Cargo.toml @@ -19,14 +19,15 @@ targets = ["x86_64-unknown-linux-gnu"] prost-build = "0.11" [dependencies] -async-trait = "0.1.74" +async-trait = "0.1.79" bitflags = "1.3.2" codec = { package = "parity-scale-codec", version = "3.6.1", features = [ "derive", ] } -futures = "0.3.21" +futures = "0.3.30" libp2p-identity = { version = "0.1.3", features = ["peerid"] } sc-consensus = { path = "../../consensus/common" } +sc-network-types = { path = "../types" } sp-consensus = { path = "../../../primitives/consensus/common" } sp-consensus-grandpa = { path = "../../../primitives/consensus/grandpa" } sp-runtime = { path = "../../../primitives/runtime" } diff --git a/substrate/client/network/light/Cargo.toml b/substrate/client/network/light/Cargo.toml index efefc6f18b6b70c847af334d4e99cbc0dda2a6b5..d75a2a908da54ceb7c27a3ba79e4ac6c0d2ba071 100644 --- a/substrate/client/network/light/Cargo.toml +++ b/substrate/client/network/light/Cargo.toml @@ -24,13 +24,13 @@ array-bytes = "6.1" codec = { package = "parity-scale-codec", version = "3.6.1", features = [ "derive", ] } -futures = "0.3.21" -libp2p-identity = { version = "0.1.3", features = ["peerid"] } -log = "0.4.16" +futures = "0.3.30" +log = { workspace = true, default-features = true } prost = "0.12" sp-blockchain = { path = "../../../primitives/blockchain" } sc-client-api = { path = "../../api" } +sc-network-types = { path = "../types" } sc-network = { path = ".." } sp-core = { path = "../../../primitives/core" } sp-runtime = { path = "../../../primitives/runtime" } -thiserror = "1.0" +thiserror = { workspace = true } diff --git a/substrate/client/network/light/src/light_client_requests.rs b/substrate/client/network/light/src/light_client_requests.rs index 4d2a301c00e6b491e204f008ca0393608e966933..e55ceb62d7cd80b26b8926c627f4407a918fc7aa 100644 --- a/substrate/client/network/light/src/light_client_requests.rs +++ b/substrate/client/network/light/src/light_client_requests.rs @@ -18,7 +18,8 @@ //! Helpers for outgoing and incoming light client requests. -use sc_network::{config::ProtocolId, request_responses::ProtocolConfig}; +use sc_network::{config::ProtocolId, request_responses::IncomingRequest, NetworkBackend}; +use sp_runtime::traits::Block; use std::time::Duration; @@ -40,20 +41,24 @@ fn generate_legacy_protocol_name(protocol_id: &ProtocolId) -> String { format!("/{}/light/2", protocol_id.as_ref()) } -/// Generates a [`ProtocolConfig`] for the light client request protocol, refusing incoming -/// requests. -pub fn generate_protocol_config>( +/// Generates a `RequestResponseProtocolConfig` for the light client request protocol, refusing +/// incoming requests. +pub fn generate_protocol_config< + Hash: AsRef<[u8]>, + B: Block, + N: NetworkBackend::Hash>, +>( protocol_id: &ProtocolId, genesis_hash: Hash, fork_id: Option<&str>, -) -> ProtocolConfig { - ProtocolConfig { - name: generate_protocol_name(genesis_hash, fork_id).into(), - fallback_names: std::iter::once(generate_legacy_protocol_name(protocol_id).into()) - .collect(), - max_request_size: 1 * 1024 * 1024, - max_response_size: 16 * 1024 * 1024, - request_timeout: Duration::from_secs(15), - inbound_queue: None, - } + inbound_queue: async_channel::Sender, +) -> N::RequestResponseProtocolConfig { + N::request_response_config( + generate_protocol_name(genesis_hash, fork_id).into(), + std::iter::once(generate_legacy_protocol_name(protocol_id).into()).collect(), + 1 * 1024 * 1024, + 16 * 1024 * 1024, + Duration::from_secs(15), + Some(inbound_queue), + ) } diff --git a/substrate/client/network/light/src/light_client_requests/handler.rs b/substrate/client/network/light/src/light_client_requests/handler.rs index 8f2bcc7384b33515412dc7ccdc7d695ce6db87da..49bdf7007e26126b21d6e63c386d151c5bbfd400 100644 --- a/substrate/client/network/light/src/light_client_requests/handler.rs +++ b/substrate/client/network/light/src/light_client_requests/handler.rs @@ -25,15 +25,15 @@ use crate::schema; use codec::{self, Decode, Encode}; use futures::prelude::*; -use libp2p_identity::PeerId; use log::{debug, trace}; use prost::Message; use sc_client_api::{BlockBackend, ProofProvider}; use sc_network::{ config::ProtocolId, - request_responses::{IncomingRequest, OutgoingResponse, ProtocolConfig}, - ReputationChange, + request_responses::{IncomingRequest, OutgoingResponse}, + NetworkBackend, ReputationChange, }; +use sc_network_types::PeerId; use sp_core::{ hexdisplay::HexDisplay, storage::{ChildInfo, ChildType, PrefixedStorageKey}, @@ -61,14 +61,14 @@ where Client: BlockBackend + ProofProvider + Send + Sync + 'static, { /// Create a new [`LightClientRequestHandler`]. - pub fn new( + pub fn new::Hash>>( protocol_id: &ProtocolId, fork_id: Option<&str>, client: Arc, - ) -> (Self, ProtocolConfig) { + ) -> (Self, N::RequestResponseProtocolConfig) { let (tx, request_receiver) = async_channel::bounded(MAX_LIGHT_REQUEST_QUEUE); - let mut protocol_config = super::generate_protocol_config( + let protocol_config = super::generate_protocol_config::<_, B, N>( protocol_id, client .block_hash(0u32.into()) @@ -76,8 +76,8 @@ where .flatten() .expect("Genesis block exists; qed"), fork_id, + tx, ); - protocol_config.inbound_queue = Some(tx); (Self { client, request_receiver, _block: PhantomData::default() }, protocol_config) } diff --git a/substrate/client/network/src/behaviour.rs b/substrate/client/network/src/behaviour.rs index 1f234683392f176d4e20f15ffed71b661daeed3f..833ff5d09e5eeac2fe6ba3ab74a2c499281a27e0 100644 --- a/substrate/client/network/src/behaviour.rs +++ b/substrate/client/network/src/behaviour.rs @@ -20,7 +20,7 @@ use crate::{ discovery::{DiscoveryBehaviour, DiscoveryConfig, DiscoveryOut}, event::DhtEvent, peer_info, - peer_store::PeerStoreHandle, + peer_store::PeerStoreProvider, protocol::{CustomMessageOutcome, NotificationsSink, Protocol}, protocol_controller::SetId, request_responses::{self, IfDisconnected, ProtocolConfig, RequestFailure}, @@ -173,7 +173,7 @@ impl Behaviour { local_public_key: PublicKey, disco_config: DiscoveryConfig, request_response_protocols: Vec, - peer_store_handle: PeerStoreHandle, + peer_store_handle: Arc, external_addresses: Arc>>, ) -> Result { Ok(Self { @@ -186,7 +186,7 @@ impl Behaviour { discovery: disco_config.finish(), request_responses: request_responses::RequestResponsesBehaviour::new( request_response_protocols.into_iter(), - Box::new(peer_store_handle), + peer_store_handle, )?, }) } diff --git a/substrate/client/network/bitswap/src/lib.rs b/substrate/client/network/src/bitswap/mod.rs similarity index 99% rename from substrate/client/network/bitswap/src/lib.rs rename to substrate/client/network/src/bitswap/mod.rs index 0586354d6a0dd4c576d4d326d04bacd69069bcb9..22f1973adcb2ece0b2fe751ef9c5e94b1bb1fd85 100644 --- a/substrate/client/network/bitswap/src/lib.rs +++ b/substrate/client/network/src/bitswap/mod.rs @@ -20,16 +20,17 @@ //! Only supports bitswap 1.2.0. //! CID is expected to reference 256-bit Blake2b transaction hash. +use crate::{ + request_responses::{IncomingRequest, OutgoingResponse, ProtocolConfig}, + types::ProtocolName, +}; + use cid::{self, Version}; use futures::StreamExt; -use libp2p_identity::PeerId; use log::{debug, error, trace}; use prost::Message; use sc_client_api::BlockBackend; -use sc_network::{ - request_responses::{IncomingRequest, OutgoingResponse, ProtocolConfig}, - types::ProtocolName, -}; +use sc_network_types::PeerId; use schema::bitswap::{ message::{wantlist::WantType, Block as MessageBlock, BlockPresence, BlockPresenceType}, Message as BitswapMessage, @@ -301,7 +302,7 @@ mod tests { use substrate_test_runtime_client::{self, prelude::*, TestClientBuilder}; #[tokio::test] - async fn undecodeable_message() { + async fn undecodable_message() { let client = substrate_test_runtime_client::new(); let (bitswap, config) = BitswapRequestHandler::new(Arc::new(client)); diff --git a/substrate/client/network/bitswap/src/schema.rs b/substrate/client/network/src/bitswap/schema.rs similarity index 100% rename from substrate/client/network/bitswap/src/schema.rs rename to substrate/client/network/src/bitswap/schema.rs diff --git a/substrate/client/network/src/config.rs b/substrate/client/network/src/config.rs index 24e96843c32d62187a666e1e7ee0a053c5af2482..e6cc9de56942700940da2644b2c5b57c0abd144d 100644 --- a/substrate/client/network/src/config.rs +++ b/substrate/client/network/src/config.rs @@ -23,21 +23,26 @@ pub use crate::{ discovery::DEFAULT_KADEMLIA_REPLICATION_FACTOR, + peer_store::PeerStoreProvider, protocol::{notification_service, NotificationsSink, ProtocolHandlePair}, request_responses::{ IncomingRequest, OutgoingResponse, ProtocolConfig as RequestResponseConfig, }, - service::traits::NotificationService, + service::{ + metrics::NotificationMetrics, + traits::{NotificationConfig, NotificationService, PeerStore}, + }, types::ProtocolName, }; pub use libp2p::{ build_multiaddr, identity::{self, ed25519, Keypair}, - multiaddr, Multiaddr, PeerId, + multiaddr, Multiaddr, }; +use sc_network_types::PeerId; -use crate::peer_store::PeerStoreHandle; +use crate::service::{ensure_addresses_consistent_with_transport, traits::NetworkBackend}; use codec::Encode; use prometheus_endpoint::Registry; use zeroize::Zeroize; @@ -61,6 +66,7 @@ use std::{ path::{Path, PathBuf}, pin::Pin, str::{self, FromStr}, + sync::Arc, }; /// Protocol name prefix, transmitted on the wire for legacy protocol names. @@ -99,7 +105,7 @@ impl fmt::Debug for ProtocolId { /// let (peer_id, addr) = parse_str_addr( /// "/ip4/198.51.100.19/tcp/30333/p2p/QmSk5HQbn6LhUwDiNMseVUjuRYhEtYj4aUZ6WfWoGURpdV" /// ).unwrap(); -/// assert_eq!(peer_id, "QmSk5HQbn6LhUwDiNMseVUjuRYhEtYj4aUZ6WfWoGURpdV".parse::().unwrap()); +/// assert_eq!(peer_id, "QmSk5HQbn6LhUwDiNMseVUjuRYhEtYj4aUZ6WfWoGURpdV".parse::().unwrap().into()); /// assert_eq!(addr, "/ip4/198.51.100.19/tcp/30333".parse::().unwrap()); /// ``` pub fn parse_str_addr(addr_str: &str) -> Result<(PeerId, Multiaddr), ParseErr> { @@ -569,6 +575,17 @@ impl NonDefaultSetConfig { } } +impl NotificationConfig for NonDefaultSetConfig { + fn set_config(&self) -> &SetConfig { + &self.set_config + } + + /// Get reference to protocol name. + fn protocol_name(&self) -> &ProtocolName { + &self.protocol_name + } +} + /// Network service configuration. #[derive(Clone, Debug)] pub struct NetworkConfiguration { @@ -655,6 +672,9 @@ pub struct NetworkConfiguration { /// a modification of the way the implementation works. Different nodes with different /// configured values remain compatible with each other. pub yamux_window_size: Option, + + /// Networking backend used for P2P communication. + pub network_backend: NetworkBackendType, } impl NetworkConfiguration { @@ -687,6 +707,7 @@ impl NetworkConfiguration { .expect("value is a constant; constant is non-zero; qed."), yamux_window_size: None, ipfs_server: false, + network_backend: NetworkBackendType::Libp2p, } } @@ -722,18 +743,15 @@ impl NetworkConfiguration { } /// Network initialization parameters. -pub struct Params { +pub struct Params> { /// Assigned role for our node (full, light, ...). pub role: Role, /// How to spawn background tasks. - pub executor: Box + Send>>) + Send>, + pub executor: Box + Send>>) + Send + Sync>, /// Network layer configuration. - pub network_config: FullNetworkConfiguration, - - /// Peer store with known nodes, peer reputations, etc. - pub peer_store: PeerStoreHandle, + pub network_config: FullNetworkConfiguration, /// Legacy name of the protocol to use on the wire. Should be different for each chain. pub protocol_id: ProtocolId, @@ -749,25 +767,43 @@ pub struct Params { pub metrics_registry: Option, /// Block announce protocol configuration - pub block_announce_config: NonDefaultSetConfig, + pub block_announce_config: N::NotificationProtocolConfig, + + /// Bitswap configuration, if the server has been enabled. + pub bitswap_config: Option, + + /// Notification metrics. + pub notification_metrics: NotificationMetrics, } /// Full network configuration. -pub struct FullNetworkConfiguration { +pub struct FullNetworkConfiguration> { /// Installed notification protocols. - pub(crate) notification_protocols: Vec, + pub(crate) notification_protocols: Vec, /// List of request-response protocols that the node supports. - pub(crate) request_response_protocols: Vec, + pub(crate) request_response_protocols: Vec, /// Network configuration. pub network_config: NetworkConfiguration, + + /// [`PeerStore`](crate::peer_store::PeerStore), + peer_store: Option, + + /// Handle to [`PeerStore`](crate::peer_store::PeerStore). + peer_store_handle: Arc, } -impl FullNetworkConfiguration { +impl> FullNetworkConfiguration { /// Create new [`FullNetworkConfiguration`]. pub fn new(network_config: &NetworkConfiguration) -> Self { + let bootnodes = network_config.boot_nodes.iter().map(|bootnode| bootnode.peer_id).collect(); + let peer_store = N::peer_store(bootnodes); + let peer_store_handle = peer_store.handle(); + Self { + peer_store: Some(peer_store), + peer_store_handle, notification_protocols: Vec::new(), request_response_protocols: Vec::new(), network_config: network_config.clone(), @@ -775,19 +811,131 @@ impl FullNetworkConfiguration { } /// Add a notification protocol. - pub fn add_notification_protocol(&mut self, config: NonDefaultSetConfig) { + pub fn add_notification_protocol(&mut self, config: N::NotificationProtocolConfig) { self.notification_protocols.push(config); } /// Get reference to installed notification protocols. - pub fn notification_protocols(&self) -> &Vec { + pub fn notification_protocols(&self) -> &Vec { &self.notification_protocols } /// Add a request-response protocol. - pub fn add_request_response_protocol(&mut self, config: RequestResponseConfig) { + pub fn add_request_response_protocol(&mut self, config: N::RequestResponseProtocolConfig) { self.request_response_protocols.push(config); } + + /// Get handle to [`PeerStore`]. + pub fn peer_store_handle(&self) -> Arc { + Arc::clone(&self.peer_store_handle) + } + + /// Take [`PeerStore`]. + /// + /// `PeerStore` is created when `FullNetworkConfig` is initialized so that `PeerStoreHandle`s + /// can be passed onto notification protocols. `PeerStore` itself should be started only once + /// and since technically it's not a libp2p task, it should be started with `SpawnHandle` in + /// `builder.rs` instead of using the libp2p/litep2p executor in the networking backend. This + /// function consumes `PeerStore` and starts its event loop in the appropriate place. + pub fn take_peer_store(&mut self) -> N::PeerStore { + self.peer_store + .take() + .expect("`PeerStore` can only be taken once when it's started; qed") + } + + /// Verify addresses are consistent with enabled transports. + pub fn sanity_check_addresses(&self) -> Result<(), crate::error::Error> { + ensure_addresses_consistent_with_transport( + self.network_config.listen_addresses.iter(), + &self.network_config.transport, + )?; + ensure_addresses_consistent_with_transport( + self.network_config.boot_nodes.iter().map(|x| &x.multiaddr), + &self.network_config.transport, + )?; + ensure_addresses_consistent_with_transport( + self.network_config + .default_peers_set + .reserved_nodes + .iter() + .map(|x| &x.multiaddr), + &self.network_config.transport, + )?; + + for notification_protocol in &self.notification_protocols { + ensure_addresses_consistent_with_transport( + notification_protocol.set_config().reserved_nodes.iter().map(|x| &x.multiaddr), + &self.network_config.transport, + )?; + } + ensure_addresses_consistent_with_transport( + self.network_config.public_addresses.iter(), + &self.network_config.transport, + )?; + + Ok(()) + } + + /// Check for duplicate bootnodes. + pub fn sanity_check_bootnodes(&self) -> Result<(), crate::error::Error> { + self.network_config.boot_nodes.iter().try_for_each(|bootnode| { + if let Some(other) = self + .network_config + .boot_nodes + .iter() + .filter(|o| o.multiaddr == bootnode.multiaddr) + .find(|o| o.peer_id != bootnode.peer_id) + { + Err(crate::error::Error::DuplicateBootnode { + address: bootnode.multiaddr.clone(), + first_id: bootnode.peer_id.into(), + second_id: other.peer_id.into(), + }) + } else { + Ok(()) + } + }) + } + + /// Collect all reserved nodes and bootnodes addresses. + pub fn known_addresses(&self) -> Vec<(PeerId, Multiaddr)> { + let mut addresses: Vec<_> = self + .network_config + .default_peers_set + .reserved_nodes + .iter() + .map(|reserved| (reserved.peer_id, reserved.multiaddr.clone())) + .chain(self.notification_protocols.iter().flat_map(|protocol| { + protocol + .set_config() + .reserved_nodes + .iter() + .map(|reserved| (reserved.peer_id, reserved.multiaddr.clone())) + })) + .chain( + self.network_config + .boot_nodes + .iter() + .map(|bootnode| (bootnode.peer_id, bootnode.multiaddr.clone())), + ) + .collect(); + + // Remove possible duplicates. + addresses.sort(); + addresses.dedup(); + + addresses + } +} + +/// Network backend type. +#[derive(Debug, Clone)] +pub enum NetworkBackendType { + /// Use libp2p for P2P networking. + Libp2p, + + /// Use litep2p for P2P networking. + Litep2p, } #[cfg(test)] diff --git a/substrate/client/network/src/discovery.rs b/substrate/client/network/src/discovery.rs index 77c26266aac4691cf36b440e6d06c792e57a311e..4e2121c5540d6c7c6d895e2756b266f6b5a945e8 100644 --- a/substrate/client/network/src/discovery.rs +++ b/substrate/client/network/src/discovery.rs @@ -72,6 +72,7 @@ use libp2p::{ }, PeerId, }; +use linked_hash_set::LinkedHashSet; use log::{debug, info, trace, warn}; use sp_core::hexdisplay::HexDisplay; use std::{ @@ -550,14 +551,20 @@ impl NetworkBehaviour for DiscoveryBehaviour { ) -> Result, ConnectionDenied> { let Some(peer_id) = maybe_peer else { return Ok(Vec::new()) }; - let mut list = self + // Collect addresses into [`LinkedHashSet`] to eliminate duplicate entries preserving the + // order of addresses. Give priority to `permanent_addresses` (used with reserved nodes) and + // `ephemeral_addresses` (used for addresses discovered from other sources, like authority + // discovery DHT records). + let mut list: LinkedHashSet<_> = self .permanent_addresses .iter() .filter_map(|(p, a)| (*p == peer_id).then_some(a.clone())) - .collect::>(); + .collect(); if let Some(ephemeral_addresses) = self.ephemeral_addresses.get(&peer_id) { - list.extend(ephemeral_addresses.clone()); + ephemeral_addresses.iter().for_each(|address| { + list.insert_if_absent(address.clone()); + }); } { @@ -583,12 +590,14 @@ impl NetworkBehaviour for DiscoveryBehaviour { }); } - list.extend(list_to_filter); + list_to_filter.into_iter().for_each(|address| { + list.insert_if_absent(address); + }); } trace!(target: "sub-libp2p", "Addresses of {:?}: {:?}", peer_id, list); - Ok(list) + Ok(list.into_iter().collect()) } fn on_swarm_event(&mut self, event: FromSwarm) { diff --git a/substrate/client/network/src/error.rs b/substrate/client/network/src/error.rs index 01e8356fb55355cd50633d0fe8d2f9f565957b23..b776e3e1ad9de8f84118f293f28ad00c88969ba0 100644 --- a/substrate/client/network/src/error.rs +++ b/substrate/client/network/src/error.rs @@ -77,6 +77,9 @@ pub enum Error { /// Connection closed. #[error("Connection closed")] ConnectionClosed, + /// Litep2p error. + #[error("Litep2p error: `{0}`")] + Litep2p(litep2p::Error), } // Make `Debug` use the `Display` implementation. diff --git a/substrate/client/network/src/lib.rs b/substrate/client/network/src/lib.rs index 4c39c57e8dfcad122f7a2ecf207bc0b877862b78..8f479825c8d77c7684333981d1763099b8a537c9 100644 --- a/substrate/client/network/src/lib.rs +++ b/substrate/client/network/src/lib.rs @@ -243,6 +243,8 @@ //! More precise usage details are still being worked on and will likely change in the future. mod behaviour; +mod bitswap; +mod litep2p; mod protocol; #[cfg(test)] @@ -262,27 +264,28 @@ pub mod transport; pub mod types; pub mod utils; +pub use crate::litep2p::Litep2pNetworkBackend; pub use event::{DhtEvent, Event}; #[doc(inline)] -pub use libp2p::{multiaddr, Multiaddr, PeerId}; pub use request_responses::{Config, IfDisconnected, RequestFailure}; pub use sc_network_common::{ role::{ObservedRole, Roles}, types::ReputationChange, }; pub use service::{ + metrics::NotificationMetrics, signature::Signature, traits::{ - KademliaKey, MessageSink, NetworkBlock, NetworkDHTProvider, NetworkEventStream, - NetworkNotification, NetworkPeers, NetworkRequest, NetworkSigner, NetworkStateInfo, - NetworkStatus, NetworkStatusProvider, NetworkSyncForkRequest, + KademliaKey, MessageSink, NetworkBackend, NetworkBlock, NetworkDHTProvider, + NetworkEventStream, NetworkPeers, NetworkRequest, NetworkSigner, NetworkStateInfo, + NetworkStatus, NetworkStatusProvider, NetworkSyncForkRequest, NotificationConfig, NotificationSender as NotificationSenderT, NotificationSenderError, NotificationSenderReady, NotificationService, }, DecodingError, Keypair, NetworkService, NetworkWorker, NotificationSender, OutboundFailure, PublicKey, }; -pub use types::ProtocolName; +pub use types::{multiaddr, Multiaddr, PeerId, ProtocolName}; /// The maximum allowed number of established connections per peer. /// diff --git a/substrate/client/network/src/litep2p/discovery.rs b/substrate/client/network/src/litep2p/discovery.rs new file mode 100644 index 0000000000000000000000000000000000000000..27f4d5473722186e986deef29bb8a9b3eb0aeaec --- /dev/null +++ b/substrate/client/network/src/litep2p/discovery.rs @@ -0,0 +1,528 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +//! libp2p-related discovery code for litep2p backend. + +use crate::{ + config::{NetworkConfiguration, ProtocolId}, + multiaddr::Protocol, + peer_store::PeerStoreProvider, + Multiaddr, +}; + +use array_bytes::bytes2hex; +use futures::{FutureExt, Stream}; +use futures_timer::Delay; +use ip_network::IpNetwork; +use libp2p::kad::record::Key as KademliaKey; +use litep2p::{ + protocol::{ + libp2p::{ + identify::{Config as IdentifyConfig, IdentifyEvent}, + kademlia::{ + Config as KademliaConfig, ConfigBuilder as KademliaConfigBuilder, KademliaEvent, + KademliaHandle, QueryId, Quorum, Record, RecordKey, + }, + ping::{Config as PingConfig, PingEvent}, + }, + mdns::{Config as MdnsConfig, MdnsEvent}, + }, + PeerId, ProtocolName, +}; +use parking_lot::RwLock; +use schnellru::{ByLength, LruMap}; + +use std::{ + cmp, + collections::{HashMap, HashSet, VecDeque}, + pin::Pin, + sync::Arc, + task::{Context, Poll}, + time::Duration, +}; + +/// Logging target for the file. +const LOG_TARGET: &str = "sub-libp2p::discovery"; + +/// Kademlia query interval. +const KADEMLIA_QUERY_INTERVAL: Duration = Duration::from_secs(5); + +/// mDNS query interval. +const MDNS_QUERY_INTERVAL: Duration = Duration::from_secs(30); + +/// Minimum number of confirmations received before an address is verified. +const MIN_ADDRESS_CONFIRMATIONS: usize = 5; + +/// Discovery events. +#[derive(Debug)] +pub enum DiscoveryEvent { + /// Ping RTT measured for peer. + Ping { + /// Remote peer ID. + peer: PeerId, + + /// Ping round-trip time. + rtt: Duration, + }, + + /// Peer identified over `/ipfs/identify/1.0.0` protocol. + Identified { + /// Peer ID. + peer: PeerId, + + /// Identify protocol version. + protocol_version: Option, + + /// Identify user agent version. + user_agent: Option, + + /// Observed address. + observed_address: Multiaddr, + + /// Listen addresses. + listen_addresses: Vec, + + /// Supported protocols. + supported_protocols: HashSet, + }, + + /// One or more addresses discovered. + Discovered { + /// Discovered addresses. + addresses: Vec, + }, + + /// Routing table has been updated. + RoutingTableUpdate { + /// Peers that were added to routing table. + peers: HashSet, + }, + + /// New external address discovered. + ExternalAddressDiscovered { + /// Discovered addresses. + address: Multiaddr, + }, + + /// Record was found from the DHT. + GetRecordSuccess { + /// Query ID. + query_id: QueryId, + + /// Record. + record: Record, + }, + + /// Record was successfully stored on the DHT. + PutRecordSuccess { + /// Query ID. + query_id: QueryId, + }, + + /// Query failed. + QueryFailed { + /// Query ID. + query_id: QueryId, + }, +} + +/// Discovery. +pub struct Discovery { + /// Ping event stream. + ping_event_stream: Box + Send + Unpin>, + + /// Identify event stream. + identify_event_stream: Box + Send + Unpin>, + + /// mDNS event stream, if enabled. + mdns_event_stream: Option + Send + Unpin>>, + + /// Kademlia handle. + kademlia_handle: KademliaHandle, + + /// `Peerstore` handle. + _peerstore_handle: Arc, + + /// Next Kademlia query for a random peer ID. + /// + /// If `None`, there is currently a query pending. + next_kad_query: Option, + + /// Active `FIND_NODE` query if it exists. + find_node_query_id: Option, + + /// Pending events. + pending_events: VecDeque, + + /// Allow non-global addresses in the DHT. + allow_non_global_addresses: bool, + + /// Protocols supported by the local node. + local_protocols: HashSet, + + /// Public addresses. + public_addresses: HashSet, + + /// Listen addresses. + listen_addresses: Arc>>, + + /// External address confirmations. + address_confirmations: LruMap, + + /// Delay to next `FIND_NODE` query. + duration_to_next_find_query: Duration, +} + +/// Legacy (fallback) Kademlia protocol name based on `protocol_id`. +fn legacy_kademlia_protocol_name(id: &ProtocolId) -> ProtocolName { + ProtocolName::from(format!("/{}/kad", id.as_ref())) +} + +/// Kademlia protocol name based on `genesis_hash` and `fork_id`. +fn kademlia_protocol_name>( + genesis_hash: Hash, + fork_id: Option<&str>, +) -> ProtocolName { + let genesis_hash_hex = bytes2hex("", genesis_hash.as_ref()); + let protocol = if let Some(fork_id) = fork_id { + format!("/{}/{}/kad", genesis_hash_hex, fork_id) + } else { + format!("/{}/kad", genesis_hash_hex) + }; + + ProtocolName::from(protocol) +} + +impl Discovery { + /// Create new [`Discovery`]. + /// + /// Enables `/ipfs/ping/1.0.0` and `/ipfs/identify/1.0.0` by default and starts + /// the mDNS peer discovery if it was enabled. + pub fn new + Clone>( + config: &NetworkConfiguration, + genesis_hash: Hash, + fork_id: Option<&str>, + protocol_id: &ProtocolId, + known_peers: HashMap>, + listen_addresses: Arc>>, + _peerstore_handle: Arc, + ) -> (Self, PingConfig, IdentifyConfig, KademliaConfig, Option) { + let (ping_config, ping_event_stream) = PingConfig::default(); + let user_agent = format!("{} ({})", config.client_version, config.node_name); + let (identify_config, identify_event_stream) = IdentifyConfig::new( + "/substrate/1.0".to_string(), + Some(user_agent), + config.public_addresses.clone(), + ); + + let (mdns_config, mdns_event_stream) = match config.transport { + crate::config::TransportConfig::Normal { enable_mdns, .. } => match enable_mdns { + true => { + let (mdns_config, mdns_event_stream) = MdnsConfig::new(MDNS_QUERY_INTERVAL); + (Some(mdns_config), Some(mdns_event_stream)) + }, + false => (None, None), + }, + _ => panic!("memory transport not supported"), + }; + + let (kademlia_config, kademlia_handle) = { + let protocol_names = vec![ + kademlia_protocol_name(genesis_hash.clone(), fork_id), + legacy_kademlia_protocol_name(protocol_id), + ]; + + KademliaConfigBuilder::new() + .with_known_peers(known_peers) + .with_protocol_names(protocol_names) + .build() + }; + + ( + Self { + ping_event_stream, + identify_event_stream, + mdns_event_stream, + kademlia_handle, + _peerstore_handle, + listen_addresses, + find_node_query_id: None, + pending_events: VecDeque::new(), + duration_to_next_find_query: Duration::from_secs(1), + address_confirmations: LruMap::new(ByLength::new(8)), + allow_non_global_addresses: config.allow_non_globals_in_dht, + public_addresses: config.public_addresses.iter().cloned().collect(), + next_kad_query: Some(Delay::new(KADEMLIA_QUERY_INTERVAL)), + local_protocols: HashSet::from_iter([ + kademlia_protocol_name(genesis_hash, fork_id), + legacy_kademlia_protocol_name(protocol_id), + ]), + }, + ping_config, + identify_config, + kademlia_config, + mdns_config, + ) + } + + /// Add known peer to `Kademlia`. + #[allow(unused)] + pub async fn add_known_peer(&mut self, peer: PeerId, addresses: Vec) { + self.kademlia_handle.add_known_peer(peer, addresses).await; + } + + /// Add self-reported addresses to routing table if `peer` supports + /// at least one of the locally supported DHT protocol. + pub async fn add_self_reported_address( + &mut self, + peer: PeerId, + supported_protocols: HashSet, + addresses: Vec, + ) { + if self.local_protocols.is_disjoint(&supported_protocols) { + return + } + + let addresses = addresses + .into_iter() + .filter_map(|address| { + if !self.allow_non_global_addresses && !Discovery::can_add_to_dht(&address) { + log::trace!( + target: LOG_TARGET, + "ignoring self-reported non-global address {address} from {peer}." + ); + + return None + } + + Some(address) + }) + .collect(); + + log::trace!( + target: LOG_TARGET, + "add self-reported addresses for {peer:?}: {addresses:?}", + ); + + self.kademlia_handle.add_known_peer(peer, addresses).await; + } + + /// Start Kademlia `GET_VALUE` query for `key`. + pub async fn get_value(&mut self, key: KademliaKey) -> QueryId { + self.kademlia_handle + .get_record(RecordKey::new(&key.to_vec()), Quorum::One) + .await + } + + /// Publish value on the DHT using Kademlia `PUT_VALUE`. + pub async fn put_value(&mut self, key: KademliaKey, value: Vec) -> QueryId { + self.kademlia_handle + .put_record(Record::new(RecordKey::new(&key.to_vec()), value)) + .await + } + + /// Check if the observed address is a known address. + fn is_known_address(known: &Multiaddr, observed: &Multiaddr) -> bool { + let mut known = known.iter(); + let mut observed = observed.iter(); + + loop { + match (known.next(), observed.next()) { + (None, None) => return true, + (None, Some(Protocol::P2p(_))) => return true, + (Some(Protocol::P2p(_)), None) => return true, + (known, observed) if known != observed => return false, + _ => {}, + } + } + } + + /// Can `address` be added to DHT. + fn can_add_to_dht(address: &Multiaddr) -> bool { + let ip = match address.iter().next() { + Some(Protocol::Ip4(ip)) => IpNetwork::from(ip), + Some(Protocol::Ip6(ip)) => IpNetwork::from(ip), + Some(Protocol::Dns(_)) | Some(Protocol::Dns4(_)) | Some(Protocol::Dns6(_)) => + return true, + _ => return false, + }; + + ip.is_global() + } + + /// Check if `address` can be considered a new external address. + fn is_new_external_address(&mut self, address: &Multiaddr) -> bool { + log::trace!(target: LOG_TARGET, "verify new external address: {address}"); + + // is the address one of our known addresses + if self + .listen_addresses + .read() + .iter() + .chain(self.public_addresses.iter()) + .any(|known_address| Discovery::is_known_address(&known_address, &address)) + { + return true + } + + match self.address_confirmations.get(address) { + Some(confirmations) => { + *confirmations += 1usize; + + if *confirmations >= MIN_ADDRESS_CONFIRMATIONS { + return true + } + }, + None => { + self.address_confirmations.insert(address.clone(), 1usize); + }, + } + + false + } +} + +impl Stream for Discovery { + type Item = DiscoveryEvent; + + fn poll_next(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { + let this = Pin::into_inner(self); + + if let Some(event) = this.pending_events.pop_front() { + return Poll::Ready(Some(event)) + } + + if let Some(mut delay) = this.next_kad_query.take() { + match delay.poll_unpin(cx) { + Poll::Pending => { + this.next_kad_query = Some(delay); + }, + Poll::Ready(()) => { + let peer = PeerId::random(); + + log::trace!(target: LOG_TARGET, "start next kademlia query for {peer:?}"); + + match this.kademlia_handle.try_find_node(peer) { + Ok(query_id) => { + this.find_node_query_id = Some(query_id); + }, + Err(()) => { + this.duration_to_next_find_query = cmp::min( + this.duration_to_next_find_query * 2, + Duration::from_secs(60), + ); + this.next_kad_query = + Some(Delay::new(this.duration_to_next_find_query)); + }, + } + }, + } + } + + match Pin::new(&mut this.kademlia_handle).poll_next(cx) { + Poll::Pending => {}, + Poll::Ready(None) => return Poll::Ready(None), + Poll::Ready(Some(KademliaEvent::FindNodeSuccess { peers, .. })) => { + // the addresses are already inserted into the DHT and in `TransportManager` so + // there is no need to add them again. The found peers must be registered to + // `Peerstore` so other protocols are aware of them through `Peerset`. + log::trace!(target: LOG_TARGET, "dht random walk yielded {} peers", peers.len()); + + this.next_kad_query = Some(Delay::new(KADEMLIA_QUERY_INTERVAL)); + + return Poll::Ready(Some(DiscoveryEvent::RoutingTableUpdate { + peers: peers.into_iter().map(|(peer, _)| peer).collect(), + })) + }, + Poll::Ready(Some(KademliaEvent::RoutingTableUpdate { peers })) => { + log::trace!(target: LOG_TARGET, "routing table update, discovered {} peers", peers.len()); + + return Poll::Ready(Some(DiscoveryEvent::RoutingTableUpdate { + peers: peers.into_iter().collect(), + })) + }, + Poll::Ready(Some(KademliaEvent::GetRecordSuccess { query_id, record })) => { + log::trace!( + target: LOG_TARGET, + "`GET_RECORD` succeeded for {query_id:?}: {record:?}", + ); + + return Poll::Ready(Some(DiscoveryEvent::GetRecordSuccess { query_id, record })); + }, + Poll::Ready(Some(KademliaEvent::PutRecordSucess { query_id, key: _ })) => + return Poll::Ready(Some(DiscoveryEvent::PutRecordSuccess { query_id })), + Poll::Ready(Some(KademliaEvent::QueryFailed { query_id })) => { + match this.find_node_query_id == Some(query_id) { + true => { + this.find_node_query_id = None; + this.duration_to_next_find_query = + cmp::min(this.duration_to_next_find_query * 2, Duration::from_secs(60)); + this.next_kad_query = Some(Delay::new(this.duration_to_next_find_query)); + }, + false => return Poll::Ready(Some(DiscoveryEvent::QueryFailed { query_id })), + } + }, + } + + match Pin::new(&mut this.identify_event_stream).poll_next(cx) { + Poll::Pending => {}, + Poll::Ready(None) => return Poll::Ready(None), + Poll::Ready(Some(IdentifyEvent::PeerIdentified { + peer, + protocol_version, + user_agent, + listen_addresses, + supported_protocols, + observed_address, + })) => { + if this.is_new_external_address(&observed_address) { + this.pending_events.push_back(DiscoveryEvent::ExternalAddressDiscovered { + address: observed_address.clone(), + }); + } + + return Poll::Ready(Some(DiscoveryEvent::Identified { + peer, + protocol_version, + user_agent, + listen_addresses, + observed_address, + supported_protocols, + })); + }, + } + + match Pin::new(&mut this.ping_event_stream).poll_next(cx) { + Poll::Pending => {}, + Poll::Ready(None) => return Poll::Ready(None), + Poll::Ready(Some(PingEvent::Ping { peer, ping })) => + return Poll::Ready(Some(DiscoveryEvent::Ping { peer, rtt: ping })), + } + + if let Some(ref mut mdns_event_stream) = &mut this.mdns_event_stream { + match Pin::new(mdns_event_stream).poll_next(cx) { + Poll::Pending => {}, + Poll::Ready(None) => return Poll::Ready(None), + Poll::Ready(Some(MdnsEvent::Discovered(addresses))) => + return Poll::Ready(Some(DiscoveryEvent::Discovered { addresses })), + } + } + + Poll::Pending + } +} diff --git a/substrate/client/network/src/litep2p/mod.rs b/substrate/client/network/src/litep2p/mod.rs new file mode 100644 index 0000000000000000000000000000000000000000..1137c73b56db8292fdee437ee3a656f38e789f51 --- /dev/null +++ b/substrate/client/network/src/litep2p/mod.rs @@ -0,0 +1,989 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +//! `NetworkBackend` implementation for `litep2p`. + +use crate::{ + config::{ + FullNetworkConfiguration, IncomingRequest, NodeKeyConfig, NotificationHandshake, Params, + SetConfig, TransportConfig, + }, + error::Error, + event::{DhtEvent, Event}, + litep2p::{ + discovery::{Discovery, DiscoveryEvent}, + peerstore::Peerstore, + service::{Litep2pNetworkService, NetworkServiceCommand}, + shim::{ + bitswap::BitswapServer, + notification::{ + config::{NotificationProtocolConfig, ProtocolControlHandle}, + peerset::PeersetCommand, + }, + request_response::{RequestResponseConfig, RequestResponseProtocol}, + }, + }, + multiaddr::{Multiaddr, Protocol}, + peer_store::PeerStoreProvider, + protocol, + service::{ + metrics::{register_without_sources, MetricSources, Metrics, NotificationMetrics}, + out_events, + traits::{BandwidthSink, NetworkBackend, NetworkService}, + }, + NetworkStatus, NotificationService, ProtocolName, +}; + +use codec::Encode; +use futures::StreamExt; +use libp2p::kad::RecordKey; +use litep2p::{ + config::ConfigBuilder, + crypto::ed25519::{Keypair, SecretKey}, + executor::Executor, + protocol::{ + libp2p::{bitswap::Config as BitswapConfig, kademlia::QueryId}, + request_response::ConfigBuilder as RequestResponseConfigBuilder, + }, + transport::{ + tcp::config::Config as TcpTransportConfig, + websocket::config::Config as WebSocketTransportConfig, Endpoint, + }, + types::ConnectionId, + Error as Litep2pError, Litep2p, Litep2pEvent, ProtocolName as Litep2pProtocolName, +}; +use parking_lot::RwLock; +use prometheus_endpoint::Registry; + +use sc_client_api::BlockBackend; +use sc_network_common::{role::Roles, ExHashT}; +use sc_network_types::PeerId; +use sc_utils::mpsc::{tracing_unbounded, TracingUnboundedReceiver}; +use sp_runtime::traits::Block as BlockT; + +use std::{ + cmp, + collections::{hash_map::Entry, HashMap, HashSet}, + fs, + future::Future, + io, iter, + pin::Pin, + sync::{ + atomic::{AtomicUsize, Ordering}, + Arc, + }, + time::{Duration, Instant}, +}; + +mod discovery; +mod peerstore; +mod service; +mod shim; + +/// Litep2p bandwidth sink. +struct Litep2pBandwidthSink { + sink: litep2p::BandwidthSink, +} + +impl BandwidthSink for Litep2pBandwidthSink { + fn total_inbound(&self) -> u64 { + self.sink.inbound() as u64 + } + + fn total_outbound(&self) -> u64 { + self.sink.outbound() as u64 + } +} + +/// Litep2p task executor. +struct Litep2pExecutor { + /// Executor. + executor: Box + Send>>) + Send + Sync>, +} + +impl Executor for Litep2pExecutor { + fn run(&self, future: Pin + Send>>) { + (self.executor)(future) + } + + fn run_with_name(&self, _: &'static str, future: Pin + Send>>) { + (self.executor)(future) + } +} + +/// Logging target for the file. +const LOG_TARGET: &str = "sub-libp2p"; + +/// Peer context. +struct ConnectionContext { + /// Peer endpoints. + endpoints: HashMap, + + /// Number of active connections. + num_connections: usize, +} + +/// Networking backend for `litep2p`. +pub struct Litep2pNetworkBackend { + /// Main `litep2p` object. + litep2p: Litep2p, + + /// `NetworkService` implementation for `Litep2pNetworkBackend`. + network_service: Arc, + + /// RX channel for receiving commands from `Litep2pNetworkService`. + cmd_rx: TracingUnboundedReceiver, + + /// `Peerset` handles to notification protocols. + peerset_handles: HashMap, + + /// Pending `GET_VALUE` queries. + pending_get_values: HashMap, + + /// Pending `PUT_VALUE` queries. + pending_put_values: HashMap, + + /// Discovery. + discovery: Discovery, + + /// Number of connected peers. + num_connected: Arc, + + /// Connected peers. + peers: HashMap, + + /// Peerstore. + peerstore_handle: Arc, + + /// Block announce protocol name. + block_announce_protocol: ProtocolName, + + /// Sender for DHT events. + event_streams: out_events::OutChannels, + + /// Prometheus metrics. + metrics: Option, + + /// External addresses. + external_addresses: Arc>>, +} + +impl Litep2pNetworkBackend { + /// From an iterator of multiaddress(es), parse and group all addresses of peers + /// so that litep2p can consume the information easily. + fn parse_addresses( + addresses: impl Iterator, + ) -> HashMap> { + addresses + .into_iter() + .filter_map(|address| match address.iter().next() { + Some( + Protocol::Dns(_) | + Protocol::Dns4(_) | + Protocol::Dns6(_) | + Protocol::Ip6(_) | + Protocol::Ip4(_), + ) => match address.iter().find(|protocol| std::matches!(protocol, Protocol::P2p(_))) + { + Some(Protocol::P2p(multihash)) => PeerId::from_multihash(multihash) + .map_or(None, |peer| Some((peer, Some(address)))), + _ => None, + }, + Some(Protocol::P2p(multihash)) => + PeerId::from_multihash(multihash).map_or(None, |peer| Some((peer, None))), + _ => None, + }) + .fold(HashMap::new(), |mut acc, (peer, maybe_address)| { + let entry = acc.entry(peer).or_default(); + maybe_address.map(|address| entry.push(address)); + + acc + }) + } + + /// Add new known addresses to `litep2p` and return the parsed peer IDs. + fn add_addresses(&mut self, peers: impl Iterator) -> HashSet { + Self::parse_addresses(peers.into_iter()) + .into_iter() + .filter_map(|(peer, addresses)| { + // `peers` contained multiaddress in the form `/p2p/` + if addresses.is_empty() { + return Some(peer) + } + + if self.litep2p.add_known_address(peer.into(), addresses.clone().into_iter()) == 0 { + log::warn!( + target: LOG_TARGET, + "couldn't add any addresses for {peer:?} and it won't be added as reserved peer", + ); + return None + } + + self.peerstore_handle.add_known_peer(peer); + Some(peer) + }) + .collect() + } +} + +impl Litep2pNetworkBackend { + /// Get `litep2p` keypair from `NodeKeyConfig`. + fn get_keypair(node_key: &NodeKeyConfig) -> Result<(Keypair, litep2p::PeerId), Error> { + let secret = libp2p::identity::Keypair::try_into_ed25519(node_key.clone().into_keypair()?) + .map_err(|error| { + log::error!(target: LOG_TARGET, "failed to convert to ed25519: {error:?}"); + Error::Io(io::ErrorKind::InvalidInput.into()) + })? + .secret(); + + let mut secret = secret.as_ref().iter().cloned().collect::>(); + let secret = SecretKey::from_bytes(&mut secret) + .map_err(|_| Error::Io(io::ErrorKind::InvalidInput.into()))?; + let local_identity = Keypair::from(secret); + let local_public = local_identity.public(); + let local_peer_id = local_public.to_peer_id(); + + Ok((local_identity, local_peer_id)) + } + + /// Configure transport protocols for `Litep2pNetworkBackend`. + fn configure_transport( + config: &FullNetworkConfiguration, + ) -> ConfigBuilder { + let _ = match config.network_config.transport { + TransportConfig::MemoryOnly => panic!("memory transport not supported"), + TransportConfig::Normal { .. } => false, + }; + let config_builder = ConfigBuilder::new(); + + // The yamux buffer size limit is configured to be equal to the maximum frame size + // of all protocols. 10 bytes are added to each limit for the length prefix that + // is not included in the upper layer protocols limit but is still present in the + // yamux buffer. These 10 bytes correspond to the maximum size required to encode + // a variable-length-encoding 64bits number. In other words, we make the + // assumption that no notification larger than 2^64 will ever be sent. + let yamux_maximum_buffer_size = { + let requests_max = config + .request_response_protocols + .iter() + .map(|cfg| usize::try_from(cfg.max_request_size).unwrap_or(usize::MAX)); + let responses_max = config + .request_response_protocols + .iter() + .map(|cfg| usize::try_from(cfg.max_response_size).unwrap_or(usize::MAX)); + let notifs_max = config + .notification_protocols + .iter() + .map(|cfg| usize::try_from(cfg.max_notification_size()).unwrap_or(usize::MAX)); + + // A "default" max is added to cover all the other protocols: ping, identify, + // kademlia, block announces, and transactions. + let default_max = cmp::max( + 1024 * 1024, + usize::try_from(protocol::BLOCK_ANNOUNCES_TRANSACTIONS_SUBSTREAM_SIZE) + .unwrap_or(usize::MAX), + ); + + iter::once(default_max) + .chain(requests_max) + .chain(responses_max) + .chain(notifs_max) + .max() + .expect("iterator known to always yield at least one element; qed") + .saturating_add(10) + }; + + let yamux_config = { + let mut yamux_config = litep2p::yamux::Config::default(); + // Enable proper flow-control: window updates are only sent when + // buffered data has been consumed. + yamux_config.set_window_update_mode(litep2p::yamux::WindowUpdateMode::OnRead); + yamux_config.set_max_buffer_size(yamux_maximum_buffer_size); + + if let Some(yamux_window_size) = config.network_config.yamux_window_size { + yamux_config.set_receive_window(yamux_window_size); + } + + yamux_config + }; + + let (tcp, websocket): (Vec>, Vec>) = config + .network_config + .listen_addresses + .iter() + .filter_map(|address| { + let mut iter = address.iter(); + + match iter.next() { + Some(Protocol::Ip4(_) | Protocol::Ip6(_)) => {}, + protocol => { + log::error!( + target: LOG_TARGET, + "unknown protocol {protocol:?}, ignoring {address:?}", + ); + + return None + }, + } + + match iter.next() { + Some(Protocol::Tcp(_)) => match iter.next() { + Some(Protocol::Ws(_) | Protocol::Wss(_)) => + Some((None, Some(address.clone()))), + Some(Protocol::P2p(_)) | None => Some((Some(address.clone()), None)), + protocol => { + log::error!( + target: LOG_TARGET, + "unknown protocol {protocol:?}, ignoring {address:?}", + ); + None + }, + }, + protocol => { + log::error!( + target: LOG_TARGET, + "unknown protocol {protocol:?}, ignoring {address:?}", + ); + None + }, + } + }) + .unzip(); + + config_builder + .with_websocket(WebSocketTransportConfig { + listen_addresses: websocket.into_iter().flatten().collect(), + yamux_config: yamux_config.clone(), + ..Default::default() + }) + .with_tcp(TcpTransportConfig { + listen_addresses: tcp.into_iter().flatten().collect(), + yamux_config, + ..Default::default() + }) + } +} + +#[async_trait::async_trait] +impl NetworkBackend for Litep2pNetworkBackend { + type NotificationProtocolConfig = NotificationProtocolConfig; + type RequestResponseProtocolConfig = RequestResponseConfig; + type NetworkService = Arc; + type PeerStore = Peerstore; + type BitswapConfig = BitswapConfig; + + fn new(mut params: Params) -> Result + where + Self: Sized, + { + let (keypair, local_peer_id) = + Self::get_keypair(¶ms.network_config.network_config.node_key)?; + let (cmd_tx, cmd_rx) = tracing_unbounded("mpsc_network_worker", 100_000); + + params.network_config.network_config.boot_nodes = params + .network_config + .network_config + .boot_nodes + .into_iter() + .filter(|boot_node| boot_node.peer_id != local_peer_id.into()) + .collect(); + params.network_config.network_config.default_peers_set.reserved_nodes = params + .network_config + .network_config + .default_peers_set + .reserved_nodes + .into_iter() + .filter(|reserved_node| { + if reserved_node.peer_id == local_peer_id.into() { + log::warn!( + target: LOG_TARGET, + "Local peer ID used in reserved node, ignoring: {reserved_node}", + ); + false + } else { + true + } + }) + .collect(); + + if let Some(path) = ¶ms.network_config.network_config.net_config_path { + fs::create_dir_all(path)?; + } + + log::info!(target: LOG_TARGET, "Local node identity is: {local_peer_id}"); + log::info!(target: LOG_TARGET, "Running litep2p network backend"); + + params.network_config.sanity_check_addresses()?; + params.network_config.sanity_check_bootnodes()?; + + let mut config_builder = + Self::configure_transport(¶ms.network_config).with_keypair(keypair.clone()); + let known_addresses = params.network_config.known_addresses(); + let peer_store_handle = params.network_config.peer_store_handle(); + let executor = Arc::new(Litep2pExecutor { executor: params.executor }); + + let FullNetworkConfiguration { + notification_protocols, + request_response_protocols, + network_config, + .. + } = params.network_config; + + // initialize notification protocols + // + // pass the protocol configuration to `Litep2pConfigBuilder` and save the TX channel + // to the protocol's `Peerset` together with the protocol name to allow other subsystems + // of Polkadot SDK to control connectivity of the notification protocol + let block_announce_protocol = params.block_announce_config.protocol_name().clone(); + let mut notif_protocols = HashMap::from_iter([( + params.block_announce_config.protocol_name().clone(), + params.block_announce_config.handle, + )]); + + // handshake for all but the syncing protocol is set to node role + config_builder = notification_protocols + .into_iter() + .fold(config_builder, |config_builder, mut config| { + config.config.set_handshake(Roles::from(¶ms.role).encode()); + notif_protocols.insert(config.protocol_name, config.handle); + + config_builder.with_notification_protocol(config.config) + }) + .with_notification_protocol(params.block_announce_config.config); + + // initialize request-response protocols + let metrics = match ¶ms.metrics_registry { + Some(registry) => Some(register_without_sources(registry)?), + None => None, + }; + + // create channels that are used to send request before initializing protocols so the + // senders can be passed onto all request-response protocols + // + // all protocols must have each others' senders so they can send the fallback request in + // case the main protocol is not supported by the remote peer and user specified a fallback + let (mut request_response_receivers, request_response_senders): ( + HashMap<_, _>, + HashMap<_, _>, + ) = request_response_protocols + .iter() + .map(|config| { + let (tx, rx) = tracing_unbounded("outbound-requests", 10_000); + ((config.protocol_name.clone(), rx), (config.protocol_name.clone(), tx)) + }) + .unzip(); + + config_builder = request_response_protocols.into_iter().fold( + config_builder, + |config_builder, config| { + let (protocol_config, handle) = RequestResponseConfigBuilder::new( + Litep2pProtocolName::from(config.protocol_name.clone()), + ) + .with_max_size(cmp::max(config.max_request_size, config.max_response_size) as usize) + .with_fallback_names(config.fallback_names.into_iter().map(From::from).collect()) + .with_timeout(config.request_timeout) + .build(); + + let protocol = RequestResponseProtocol::new( + config.protocol_name.clone(), + handle, + Arc::clone(&peer_store_handle), + config.inbound_queue, + request_response_receivers + .remove(&config.protocol_name) + .expect("receiver exists as it was just added and there are no duplicate protocols; qed"), + request_response_senders.clone(), + metrics.clone(), + ); + + executor.run(Box::pin(async move { + protocol.run().await; + })); + + config_builder.with_request_response_protocol(protocol_config) + }, + ); + + // collect known addresses + let known_addresses: HashMap> = + known_addresses.into_iter().fold(HashMap::new(), |mut acc, (peer, address)| { + let address = match address.iter().last() { + Some(Protocol::Ws(_) | Protocol::Wss(_) | Protocol::Tcp(_)) => + address.with(Protocol::P2p(peer.into())), + Some(Protocol::P2p(_)) => address, + _ => return acc, + }; + + acc.entry(peer.into()).or_default().push(address); + peer_store_handle.add_known_peer(peer); + + acc + }); + + // enable ipfs ping, identify and kademlia, and potentially mdns if user enabled it + let listen_addresses = Arc::new(Default::default()); + let (discovery, ping_config, identify_config, kademlia_config, maybe_mdns_config) = + Discovery::new( + &network_config, + params.genesis_hash, + params.fork_id.as_deref(), + ¶ms.protocol_id, + known_addresses.clone(), + Arc::clone(&listen_addresses), + Arc::clone(&peer_store_handle), + ); + + config_builder = config_builder + .with_known_addresses(known_addresses.clone().into_iter()) + .with_libp2p_ping(ping_config) + .with_libp2p_identify(identify_config) + .with_libp2p_kademlia(kademlia_config) + .with_executor(executor); + + if let Some(config) = maybe_mdns_config { + config_builder = config_builder.with_mdns(config); + } + + if let Some(config) = params.bitswap_config { + config_builder = config_builder.with_libp2p_bitswap(config); + } + + let litep2p = + Litep2p::new(config_builder.build()).map_err(|error| Error::Litep2p(error))?; + + let external_addresses: Arc>> = Arc::new(RwLock::new( + HashSet::from_iter(network_config.public_addresses.iter().cloned()), + )); + litep2p.listen_addresses().for_each(|address| { + log::debug!(target: LOG_TARGET, "listening on: {address}"); + + listen_addresses.write().insert(address.clone()); + }); + + let network_service = Arc::new(Litep2pNetworkService::new( + local_peer_id, + keypair.clone(), + cmd_tx, + Arc::clone(&peer_store_handle), + notif_protocols.clone(), + block_announce_protocol.clone(), + request_response_senders, + Arc::clone(&listen_addresses), + Arc::clone(&external_addresses), + )); + + // register rest of the metrics now that `Litep2p` has been created + let num_connected = Arc::new(Default::default()); + let bandwidth: Arc = + Arc::new(Litep2pBandwidthSink { sink: litep2p.bandwidth_sink() }); + + if let Some(registry) = ¶ms.metrics_registry { + MetricSources::register(registry, bandwidth, Arc::clone(&num_connected))?; + } + + Ok(Self { + network_service, + cmd_rx, + metrics, + peerset_handles: notif_protocols, + num_connected, + discovery, + pending_put_values: HashMap::new(), + pending_get_values: HashMap::new(), + peerstore_handle: peer_store_handle, + block_announce_protocol, + event_streams: out_events::OutChannels::new(None)?, + peers: HashMap::new(), + litep2p, + external_addresses, + }) + } + + fn network_service(&self) -> Arc { + Arc::clone(&self.network_service) + } + + fn peer_store(bootnodes: Vec) -> Self::PeerStore { + Peerstore::new(bootnodes) + } + + fn register_notification_metrics(registry: Option<&Registry>) -> NotificationMetrics { + NotificationMetrics::new(registry) + } + + /// Create Bitswap server. + fn bitswap_server( + client: Arc + Send + Sync>, + ) -> (Pin + Send>>, Self::BitswapConfig) { + BitswapServer::new(client) + } + + /// Create notification protocol configuration for `protocol`. + fn notification_config( + protocol_name: ProtocolName, + fallback_names: Vec, + max_notification_size: u64, + handshake: Option, + set_config: SetConfig, + metrics: NotificationMetrics, + peerstore_handle: Arc, + ) -> (Self::NotificationProtocolConfig, Box) { + Self::NotificationProtocolConfig::new( + protocol_name, + fallback_names, + max_notification_size as usize, + handshake, + set_config, + metrics, + peerstore_handle, + ) + } + + /// Create request-response protocol configuration. + fn request_response_config( + protocol_name: ProtocolName, + fallback_names: Vec, + max_request_size: u64, + max_response_size: u64, + request_timeout: Duration, + inbound_queue: Option>, + ) -> Self::RequestResponseProtocolConfig { + Self::RequestResponseProtocolConfig::new( + protocol_name, + fallback_names, + max_request_size, + max_response_size, + request_timeout, + inbound_queue, + ) + } + + /// Start [`Litep2pNetworkBackend`] event loop. + async fn run(mut self) { + log::debug!(target: LOG_TARGET, "starting litep2p network backend"); + + loop { + let num_connected_peers = self + .peerset_handles + .get(&self.block_announce_protocol) + .map_or(0usize, |handle| handle.connected_peers.load(Ordering::Relaxed)); + self.num_connected.store(num_connected_peers, Ordering::Relaxed); + + tokio::select! { + command = self.cmd_rx.next() => match command { + None => return, + Some(command) => match command { + NetworkServiceCommand::GetValue{ key } => { + let query_id = self.discovery.get_value(key.clone()).await; + self.pending_get_values.insert(query_id, (key, Instant::now())); + } + NetworkServiceCommand::PutValue { key, value } => { + let query_id = self.discovery.put_value(key.clone(), value).await; + self.pending_put_values.insert(query_id, (key, Instant::now())); + } + NetworkServiceCommand::EventStream { tx } => { + self.event_streams.push(tx); + } + NetworkServiceCommand::Status { tx } => { + let _ = tx.send(NetworkStatus { + num_connected_peers: self + .peerset_handles + .get(&self.block_announce_protocol) + .map_or(0usize, |handle| handle.connected_peers.load(Ordering::Relaxed)), + total_bytes_inbound: self.litep2p.bandwidth_sink().inbound() as u64, + total_bytes_outbound: self.litep2p.bandwidth_sink().outbound() as u64, + }); + } + NetworkServiceCommand::AddPeersToReservedSet { + protocol, + peers, + } => { + let peers = self.add_addresses(peers.into_iter()); + + match self.peerset_handles.get(&protocol) { + Some(handle) => { + let _ = handle.tx.unbounded_send(PeersetCommand::AddReservedPeers { peers }); + } + None => log::warn!(target: LOG_TARGET, "protocol {protocol} doens't exist"), + }; + } + NetworkServiceCommand::AddKnownAddress { peer, mut address } => { + if !address.iter().any(|protocol| std::matches!(protocol, Protocol::P2p(_))) { + address.push(Protocol::P2p(peer.into())); + } + + if self.litep2p.add_known_address(peer.into(), iter::once(address.clone())) == 0usize { + log::warn!( + target: LOG_TARGET, + "couldn't add known address ({address}) for {peer:?}, unsupported transport" + ); + } + }, + NetworkServiceCommand::SetReservedPeers { protocol, peers } => { + let peers = self.add_addresses(peers.into_iter()); + + match self.peerset_handles.get(&protocol) { + Some(handle) => { + let _ = handle.tx.unbounded_send(PeersetCommand::SetReservedPeers { peers }); + } + None => log::warn!(target: LOG_TARGET, "protocol {protocol} doens't exist"), + } + + }, + NetworkServiceCommand::DisconnectPeer { + protocol, + peer, + } => { + let Some(handle) = self.peerset_handles.get(&protocol) else { + log::warn!(target: LOG_TARGET, "protocol {protocol} doens't exist"); + continue + }; + + let _ = handle.tx.unbounded_send(PeersetCommand::DisconnectPeer { peer }); + } + NetworkServiceCommand::SetReservedOnly { + protocol, + reserved_only, + } => { + let Some(handle) = self.peerset_handles.get(&protocol) else { + log::warn!(target: LOG_TARGET, "protocol {protocol} doens't exist"); + continue + }; + + let _ = handle.tx.unbounded_send(PeersetCommand::SetReservedOnly { reserved_only }); + } + NetworkServiceCommand::RemoveReservedPeers { + protocol, + peers, + } => { + let Some(handle) = self.peerset_handles.get(&protocol) else { + log::warn!(target: LOG_TARGET, "protocol {protocol} doens't exist"); + continue + }; + + let _ = handle.tx.unbounded_send(PeersetCommand::RemoveReservedPeers { peers }); + } + } + }, + event = self.discovery.next() => match event { + None => return, + Some(DiscoveryEvent::Discovered { addresses }) => { + // if at least one address was added for the peer, report the peer to `Peerstore` + for (peer, addresses) in Litep2pNetworkBackend::parse_addresses(addresses.into_iter()) { + if self.litep2p.add_known_address(peer.into(), addresses.clone().into_iter()) > 0 { + self.peerstore_handle.add_known_peer(peer); + } + } + } + Some(DiscoveryEvent::RoutingTableUpdate { peers }) => { + for peer in peers { + self.peerstore_handle.add_known_peer(peer.into()); + } + } + Some(DiscoveryEvent::GetRecordSuccess { query_id, record }) => { + match self.pending_get_values.remove(&query_id) { + None => log::warn!( + target: LOG_TARGET, + "`GET_VALUE` succeeded for a non-existent query", + ), + Some((_key, started)) => { + log::trace!( + target: LOG_TARGET, + "`GET_VALUE` for {:?} ({query_id:?}) succeeded", + record.key, + ); + + self.event_streams.send(Event::Dht( + DhtEvent::ValueFound(vec![ + (libp2p::kad::RecordKey::new(&record.key), record.value) + ]) + )); + + if let Some(ref metrics) = self.metrics { + metrics + .kademlia_query_duration + .with_label_values(&["value-get"]) + .observe(started.elapsed().as_secs_f64()); + } + } + } + } + Some(DiscoveryEvent::PutRecordSuccess { query_id }) => { + match self.pending_put_values.remove(&query_id) { + None => log::warn!( + target: LOG_TARGET, + "`PUT_VALUE` succeeded for a non-existent query", + ), + Some((key, started)) => { + log::trace!( + target: LOG_TARGET, + "`PUT_VALUE` for {key:?} ({query_id:?}) succeeded", + ); + + if let Some(ref metrics) = self.metrics { + metrics + .kademlia_query_duration + .with_label_values(&["value-put"]) + .observe(started.elapsed().as_secs_f64()); + } + } + } + } + Some(DiscoveryEvent::QueryFailed { query_id }) => { + match self.pending_get_values.remove(&query_id) { + None => match self.pending_put_values.remove(&query_id) { + None => log::warn!( + target: LOG_TARGET, + "non-existent query failed ({query_id:?})", + ), + Some((key, started)) => { + log::debug!( + target: LOG_TARGET, + "`PUT_VALUE` ({query_id:?}) failed for key {key:?}", + ); + + self.event_streams.send(Event::Dht( + DhtEvent::ValuePutFailed(libp2p::kad::RecordKey::new(&key)) + )); + + if let Some(ref metrics) = self.metrics { + metrics + .kademlia_query_duration + .with_label_values(&["value-put-failed"]) + .observe(started.elapsed().as_secs_f64()); + } + } + } + Some((key, started)) => { + log::debug!( + target: LOG_TARGET, + "`GET_VALUE` ({query_id:?}) failed for key {key:?}", + ); + + self.event_streams.send(Event::Dht( + DhtEvent::ValueNotFound(libp2p::kad::RecordKey::new(&key)) + )); + + if let Some(ref metrics) = self.metrics { + metrics + .kademlia_query_duration + .with_label_values(&["value-get-failed"]) + .observe(started.elapsed().as_secs_f64()); + } + } + } + } + Some(DiscoveryEvent::Identified { peer, listen_addresses, supported_protocols, .. }) => { + self.discovery.add_self_reported_address(peer, supported_protocols, listen_addresses).await; + } + Some(DiscoveryEvent::ExternalAddressDiscovered { address }) => { + let mut addresses = self.external_addresses.write(); + + if addresses.insert(address.clone()) { + log::info!(target: LOG_TARGET, "discovered new external address for our node: {address}"); + } + } + Some(DiscoveryEvent::Ping { peer, rtt }) => { + log::trace!( + target: LOG_TARGET, + "ping time with {peer:?}: {rtt:?}", + ); + } + }, + event = self.litep2p.next_event() => match event { + Some(Litep2pEvent::ConnectionEstablished { peer, endpoint }) => { + let Some(metrics) = &self.metrics else { + continue; + }; + + let direction = match endpoint { + Endpoint::Dialer { .. } => "out", + Endpoint::Listener { .. } => "in", + }; + metrics.connections_opened_total.with_label_values(&[direction]).inc(); + + match self.peers.entry(peer) { + Entry::Vacant(entry) => { + entry.insert(ConnectionContext { + endpoints: HashMap::from_iter([(endpoint.connection_id(), endpoint)]), + num_connections: 1usize, + }); + metrics.distinct_peers_connections_opened_total.inc(); + } + Entry::Occupied(entry) => { + let entry = entry.into_mut(); + entry.num_connections += 1; + entry.endpoints.insert(endpoint.connection_id(), endpoint); + } + } + } + Some(Litep2pEvent::ConnectionClosed { peer, connection_id }) => { + let Some(metrics) = &self.metrics else { + continue; + }; + + let Some(context) = self.peers.get_mut(&peer) else { + log::debug!(target: LOG_TARGET, "unknown peer disconnected: {peer:?} ({connection_id:?})"); + continue + }; + + let direction = match context.endpoints.remove(&connection_id) { + None => { + log::debug!(target: LOG_TARGET, "connection {connection_id:?} doesn't exist for {peer:?} "); + continue + } + Some(endpoint) => { + context.num_connections -= 1; + + match endpoint { + Endpoint::Dialer { .. } => "out", + Endpoint::Listener { .. } => "in", + } + } + }; + + metrics.connections_closed_total.with_label_values(&[direction, "actively-closed"]).inc(); + + if context.num_connections == 0 { + self.peers.remove(&peer); + metrics.distinct_peers_connections_closed_total.inc(); + } + } + Some(Litep2pEvent::DialFailure { address, error }) => { + log::trace!( + target: LOG_TARGET, + "failed to dial peer at {address:?}: {error:?}", + ); + + let reason = match error { + Litep2pError::PeerIdMismatch(_, _) => "invalid-peer-id", + Litep2pError::Timeout | Litep2pError::TransportError(_) | + Litep2pError::IoError(_) | Litep2pError::WebSocket(_) => "transport-error", + _ => "other", + }; + + if let Some(metrics) = &self.metrics { + metrics.pending_connections_errors_total.with_label_values(&[reason]).inc(); + } + } + _ => {} + }, + } + } + } +} diff --git a/substrate/client/network/src/litep2p/peerstore.rs b/substrate/client/network/src/litep2p/peerstore.rs new file mode 100644 index 0000000000000000000000000000000000000000..dd377ea09af9b3c9769f06bdba8078a4fbc41a8e --- /dev/null +++ b/substrate/client/network/src/litep2p/peerstore.rs @@ -0,0 +1,391 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +//! `Peerstore` implementation for `litep2p`. +//! +//! `Peerstore` is responsible for storing information about remote peers +//! such as their addresses, reputations, supported protocols etc. + +use crate::{ + peer_store::{PeerStoreProvider, ProtocolHandle}, + service::traits::PeerStore, + ObservedRole, ReputationChange, +}; + +use parking_lot::Mutex; +use wasm_timer::Delay; + +use sc_network_types::PeerId; + +use std::{ + collections::{HashMap, HashSet}, + sync::Arc, + time::{Duration, Instant}, +}; + +/// Logging target for the file. +const LOG_TARGET: &str = "sub-libp2p::peerstore"; + +/// We don't accept nodes whose reputation is under this value. +pub const BANNED_THRESHOLD: i32 = 82 * (i32::MIN / 100); + +/// Relative decrement of a reputation value that is applied every second. I.e., for inverse +/// decrement of 50 we decrease absolute value of the reputation by 1/50. This corresponds to a +/// factor of `k = 0.98`. It takes ~ `ln(0.5) / ln(k)` seconds to reduce the reputation by half, +/// or 34.3 seconds for the values above. In this setup the maximum allowed absolute value of +/// `i32::MAX` becomes 0 in ~1100 seconds (actually less due to integer arithmetic). +const INVERSE_DECREMENT: i32 = 50; + +/// Amount of time between the moment we last updated the [`PeerStore`] entry and the moment we +/// remove it, once the reputation value reaches 0. +const FORGET_AFTER: Duration = Duration::from_secs(3600); + +/// Peer information. +#[derive(Debug, Clone, Copy)] +struct PeerInfo { + /// Reputation of the peer. + reputation: i32, + + /// Instant when the peer was last updated. + last_updated: Instant, + + /// Role of the peer, if known. + role: Option, +} + +impl Default for PeerInfo { + fn default() -> Self { + Self { reputation: 0i32, last_updated: Instant::now(), role: None } + } +} + +impl PeerInfo { + fn is_banned(&self) -> bool { + self.reputation < BANNED_THRESHOLD + } + + fn decay_reputation(&mut self, seconds_passed: u64) { + // Note that decaying the reputation value happens "on its own", + // so we don't do `bump_last_updated()`. + for _ in 0..seconds_passed { + let mut diff = self.reputation / INVERSE_DECREMENT; + if diff == 0 && self.reputation < 0 { + diff = -1; + } else if diff == 0 && self.reputation > 0 { + diff = 1; + } + + self.reputation = self.reputation.saturating_sub(diff); + + if self.reputation == 0 { + break + } + } + } +} + +#[derive(Debug, Default)] +pub struct PeerstoreHandleInner { + peers: HashMap, + protocols: Vec>, +} + +#[derive(Debug, Clone, Default)] +pub struct PeerstoreHandle(Arc>); + +impl PeerstoreHandle { + /// Add known peer to [`Peerstore`]. + pub fn add_known_peer(&self, peer: PeerId) { + self.0 + .lock() + .peers + .insert(peer, PeerInfo { reputation: 0i32, last_updated: Instant::now(), role: None }); + } + + pub fn peer_count(&self) -> usize { + self.0.lock().peers.len() + } + + fn progress_time(&self, seconds_passed: u64) { + if seconds_passed == 0 { + return + } + + let mut lock = self.0.lock(); + + // Drive reputation values towards 0. + lock.peers + .iter_mut() + .for_each(|(_, info)| info.decay_reputation(seconds_passed)); + + // Retain only entries with non-zero reputation values or not expired ones. + let now = Instant::now(); + lock.peers + .retain(|_, info| info.reputation != 0 || info.last_updated + FORGET_AFTER > now); + } +} + +impl PeerStoreProvider for PeerstoreHandle { + fn is_banned(&self, peer: &PeerId) -> bool { + self.0.lock().peers.get(peer).map_or(false, |info| info.is_banned()) + } + + /// Register a protocol handle to disconnect peers whose reputation drops below the threshold. + fn register_protocol(&self, protocol_handle: Arc) { + self.0.lock().protocols.push(protocol_handle); + } + + /// Report peer disconnection for reputation adjustment. + fn report_disconnect(&self, _peer: PeerId) { + unimplemented!(); + } + + /// Adjust peer reputation. + fn report_peer(&self, peer: PeerId, reputation_change: ReputationChange) { + let mut lock = self.0.lock(); + + log::trace!(target: LOG_TARGET, "report peer {reputation_change:?}"); + + match lock.peers.get_mut(&peer) { + Some(info) => { + info.reputation = info.reputation.saturating_add(reputation_change.value); + }, + None => { + lock.peers.insert( + peer, + PeerInfo { + reputation: reputation_change.value, + last_updated: Instant::now(), + role: None, + }, + ); + }, + } + + if lock + .peers + .get(&peer) + .expect("peer exist since it was just modified; qed") + .is_banned() + { + log::warn!(target: LOG_TARGET, "{peer:?} banned, disconnecting, reason: {}", reputation_change.reason); + + for sender in &lock.protocols { + sender.disconnect_peer(peer); + } + } + } + + /// Set peer role. + fn set_peer_role(&self, peer: &PeerId, role: ObservedRole) { + self.0.lock().peers.entry(*peer).or_default().role = Some(role); + } + + /// Get peer reputation. + fn peer_reputation(&self, peer: &PeerId) -> i32 { + self.0.lock().peers.get(peer).map_or(0i32, |info| info.reputation) + } + + /// Get peer role, if available. + fn peer_role(&self, peer: &PeerId) -> Option { + self.0.lock().peers.get(peer).and_then(|info| info.role) + } + + /// Get candidates with highest reputations for initiating outgoing connections. + fn outgoing_candidates(&self, count: usize, ignored: HashSet) -> Vec { + let handle = self.0.lock(); + + let mut candidates = handle + .peers + .iter() + .filter_map(|(peer, info)| { + (!ignored.contains(&peer) && !info.is_banned()).then_some((*peer, info.reputation)) + }) + .collect::>(); + candidates.sort_by(|(_, a), (_, b)| b.cmp(a)); + candidates + .into_iter() + .take(count) + .map(|(peer, _score)| peer) + .collect::>() + } + + /// Get the number of known peers. + /// + /// This number might not include some connected peers in rare cases when their reputation + /// was not updated for one hour, because their entries in [`PeerStore`] were dropped. + fn num_known_peers(&self) -> usize { + self.0.lock().peers.len() + } + + /// Add known peer. + fn add_known_peer(&self, peer: PeerId) { + self.0.lock().peers.entry(peer).or_default().last_updated = Instant::now(); + } +} + +/// `Peerstore` handle for testing. +/// +/// This instance of `Peerstore` is not shared between protocols. +#[cfg(test)] +pub fn peerstore_handle_test() -> PeerstoreHandle { + PeerstoreHandle(Arc::new(Mutex::new(Default::default()))) +} + +/// Peerstore implementation. +pub struct Peerstore { + /// Handle to `Peerstore`. + peerstore_handle: PeerstoreHandle, +} + +impl Peerstore { + /// Create new [`Peerstore`]. + pub fn new(bootnodes: Vec) -> Self { + let peerstore_handle = PeerstoreHandle(Arc::new(Mutex::new(Default::default()))); + + for bootnode in bootnodes { + peerstore_handle.add_known_peer(bootnode); + } + + Self { peerstore_handle } + } + + /// Create new [`Peerstore`] from a [`PeerstoreHandle`]. + pub fn from_handle(peerstore_handle: PeerstoreHandle, bootnodes: Vec) -> Self { + for bootnode in bootnodes { + peerstore_handle.add_known_peer(bootnode); + } + + Self { peerstore_handle } + } + + /// Get mutable reference to the underlying [`PeerstoreHandle`]. + pub fn handle(&mut self) -> &mut PeerstoreHandle { + &mut self.peerstore_handle + } + + /// Add known peer to [`Peerstore`]. + pub fn add_known_peer(&mut self, peer: PeerId) { + self.peerstore_handle.add_known_peer(peer); + } + + /// Start [`Peerstore`] event loop. + async fn run(self) { + let started = Instant::now(); + let mut latest_time_update = started; + + loop { + let now = Instant::now(); + // We basically do `(now - self.latest_update).as_secs()`, except that by the way we do + // it we know that we're not going to miss seconds because of rounding to integers. + let seconds_passed = { + let elapsed_latest = latest_time_update - started; + let elapsed_now = now - started; + latest_time_update = now; + elapsed_now.as_secs() - elapsed_latest.as_secs() + }; + + self.peerstore_handle.progress_time(seconds_passed); + let _ = Delay::new(Duration::from_secs(1)).await; + } + } +} + +#[async_trait::async_trait] +impl PeerStore for Peerstore { + /// Get handle to `PeerStore`. + fn handle(&self) -> Arc { + Arc::new(self.peerstore_handle.clone()) + } + + /// Start running `PeerStore` event loop. + async fn run(self) { + self.run().await; + } +} + +#[cfg(test)] +mod tests { + use super::PeerInfo; + + #[test] + fn decaying_zero_reputation_yields_zero() { + let mut peer_info = PeerInfo::default(); + assert_eq!(peer_info.reputation, 0); + + peer_info.decay_reputation(1); + assert_eq!(peer_info.reputation, 0); + + peer_info.decay_reputation(100_000); + assert_eq!(peer_info.reputation, 0); + } + + #[test] + fn decaying_positive_reputation_decreases_it() { + const INITIAL_REPUTATION: i32 = 100; + + let mut peer_info = PeerInfo::default(); + peer_info.reputation = INITIAL_REPUTATION; + + peer_info.decay_reputation(1); + assert!(peer_info.reputation >= 0); + assert!(peer_info.reputation < INITIAL_REPUTATION); + } + + #[test] + fn decaying_negative_reputation_increases_it() { + const INITIAL_REPUTATION: i32 = -100; + + let mut peer_info = PeerInfo::default(); + peer_info.reputation = INITIAL_REPUTATION; + + peer_info.decay_reputation(1); + assert!(peer_info.reputation <= 0); + assert!(peer_info.reputation > INITIAL_REPUTATION); + } + + #[test] + fn decaying_max_reputation_finally_yields_zero() { + const INITIAL_REPUTATION: i32 = i32::MAX; + const SECONDS: u64 = 1000; + + let mut peer_info = PeerInfo::default(); + peer_info.reputation = INITIAL_REPUTATION; + + peer_info.decay_reputation(SECONDS / 2); + assert!(peer_info.reputation > 0); + + peer_info.decay_reputation(SECONDS / 2); + assert_eq!(peer_info.reputation, 0); + } + + #[test] + fn decaying_min_reputation_finally_yields_zero() { + const INITIAL_REPUTATION: i32 = i32::MIN; + const SECONDS: u64 = 1000; + + let mut peer_info = PeerInfo::default(); + peer_info.reputation = INITIAL_REPUTATION; + + peer_info.decay_reputation(SECONDS / 2); + assert!(peer_info.reputation < 0); + + peer_info.decay_reputation(SECONDS / 2); + assert_eq!(peer_info.reputation, 0); + } +} diff --git a/substrate/client/network/src/litep2p/service.rs b/substrate/client/network/src/litep2p/service.rs new file mode 100644 index 0000000000000000000000000000000000000000..86f11aa6e142e2a1bdc161e7a92e34f5833cd1bb --- /dev/null +++ b/substrate/client/network/src/litep2p/service.rs @@ -0,0 +1,469 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +//! `NetworkService` implementation for `litep2p`. + +use crate::{ + config::MultiaddrWithPeerId, + litep2p::shim::{ + notification::{config::ProtocolControlHandle, peerset::PeersetCommand}, + request_response::OutboundRequest, + }, + multiaddr::Protocol, + network_state::NetworkState, + peer_store::PeerStoreProvider, + service::out_events, + Event, IfDisconnected, NetworkDHTProvider, NetworkEventStream, NetworkPeers, NetworkRequest, + NetworkSigner, NetworkStateInfo, NetworkStatus, NetworkStatusProvider, ProtocolName, + RequestFailure, Signature, +}; + +use codec::DecodeAll; +use futures::{channel::oneshot, stream::BoxStream}; +use libp2p::{identity::SigningError, kad::record::Key as KademliaKey, Multiaddr}; +use litep2p::crypto::ed25519::Keypair; +use parking_lot::RwLock; + +use sc_network_common::{ + role::{ObservedRole, Roles}, + types::ReputationChange, +}; +use sc_network_types::PeerId; +use sc_utils::mpsc::TracingUnboundedSender; + +use std::{ + collections::{HashMap, HashSet}, + sync::{atomic::Ordering, Arc}, +}; + +/// Logging target for the file. +const LOG_TARGET: &str = "sub-libp2p"; + +/// Commands sent by [`Litep2pNetworkService`] to +/// [`Litep2pNetworkBackend`](super::Litep2pNetworkBackend). +#[derive(Debug)] +pub enum NetworkServiceCommand { + /// Get value from DHT. + GetValue { + /// Record key. + key: KademliaKey, + }, + + /// Put value to DHT. + PutValue { + /// Record key. + key: KademliaKey, + + /// Record value. + value: Vec, + }, + + /// Query network status. + Status { + /// `oneshot::Sender` for sending the status. + tx: oneshot::Sender, + }, + + /// Add `peers` to `protocol`'s reserved set. + AddPeersToReservedSet { + /// Protocol. + protocol: ProtocolName, + + /// Reserved peers. + peers: HashSet, + }, + + /// Add known address for peer. + AddKnownAddress { + /// Peer ID. + peer: PeerId, + + /// Address. + address: Multiaddr, + }, + + /// Set reserved peers for `protocol`. + SetReservedPeers { + /// Protocol. + protocol: ProtocolName, + + /// Reserved peers. + peers: HashSet, + }, + + /// Disconnect peer from protocol. + DisconnectPeer { + /// Protocol. + protocol: ProtocolName, + + /// Peer ID. + peer: PeerId, + }, + + /// Set protocol to reserved only (true/false) mode. + SetReservedOnly { + /// Protocol. + protocol: ProtocolName, + + /// Reserved only? + reserved_only: bool, + }, + + /// Remove reserved peers from protocol. + RemoveReservedPeers { + /// Protocol. + protocol: ProtocolName, + + /// Peers to remove from the reserved set. + peers: HashSet, + }, + + /// Create event stream for DHT events. + EventStream { + /// Sender for the events. + tx: out_events::Sender, + }, +} + +/// `NetworkService` implementation for `litep2p`. +#[derive(Debug, Clone)] +pub struct Litep2pNetworkService { + /// Local peer ID. + local_peer_id: litep2p::PeerId, + + /// The `KeyPair` that defines the `PeerId` of the local node. + keypair: Keypair, + + /// TX channel for sending commands to [`Litep2pNetworkBackend`](super::Litep2pNetworkBackend). + cmd_tx: TracingUnboundedSender, + + /// Handle to `PeerStore`. + peer_store_handle: Arc, + + /// Peerset handles. + peerset_handles: HashMap, + + /// Name for the block announce protocol. + block_announce_protocol: ProtocolName, + + /// Installed request-response protocols. + request_response_protocols: HashMap>, + + /// Listen addresses. + listen_addresses: Arc>>, + + /// External addresses. + external_addresses: Arc>>, +} + +impl Litep2pNetworkService { + /// Create new [`Litep2pNetworkService`]. + pub fn new( + local_peer_id: litep2p::PeerId, + keypair: Keypair, + cmd_tx: TracingUnboundedSender, + peer_store_handle: Arc, + peerset_handles: HashMap, + block_announce_protocol: ProtocolName, + request_response_protocols: HashMap>, + listen_addresses: Arc>>, + external_addresses: Arc>>, + ) -> Self { + Self { + local_peer_id, + keypair, + cmd_tx, + peer_store_handle, + peerset_handles, + block_announce_protocol, + request_response_protocols, + listen_addresses, + external_addresses, + } + } +} + +impl NetworkSigner for Litep2pNetworkService { + fn sign_with_local_identity(&self, msg: Vec) -> Result { + let public_key = self.keypair.public(); + let bytes = self.keypair.sign(msg.as_ref()); + + Ok(Signature { + public_key: crate::service::signature::PublicKey::Litep2p( + litep2p::crypto::PublicKey::Ed25519(public_key), + ), + bytes, + }) + } + + fn verify( + &self, + peer: PeerId, + public_key: &Vec, + signature: &Vec, + message: &Vec, + ) -> Result { + let public_key = litep2p::crypto::PublicKey::from_protobuf_encoding(&public_key) + .map_err(|error| error.to_string())?; + let peer: litep2p::PeerId = peer.into(); + + Ok(peer == public_key.to_peer_id() && public_key.verify(message, signature)) + } +} + +impl NetworkDHTProvider for Litep2pNetworkService { + fn get_value(&self, key: &KademliaKey) { + let _ = self.cmd_tx.unbounded_send(NetworkServiceCommand::GetValue { key: key.clone() }); + } + + fn put_value(&self, key: KademliaKey, value: Vec) { + let _ = self.cmd_tx.unbounded_send(NetworkServiceCommand::PutValue { key, value }); + } +} + +#[async_trait::async_trait] +impl NetworkStatusProvider for Litep2pNetworkService { + async fn status(&self) -> Result { + let (tx, rx) = oneshot::channel(); + self.cmd_tx + .unbounded_send(NetworkServiceCommand::Status { tx }) + .map_err(|_| ())?; + + rx.await.map_err(|_| ()) + } + + async fn network_state(&self) -> Result { + Ok(NetworkState { + peer_id: self.local_peer_id.to_base58(), + listened_addresses: self.listen_addresses.read().iter().cloned().collect(), + external_addresses: self.external_addresses.read().iter().cloned().collect(), + connected_peers: HashMap::new(), + not_connected_peers: HashMap::new(), + // TODO: Check what info we can include here. + // Issue reference: https://github.com/paritytech/substrate/issues/14160. + peerset: serde_json::json!( + "Unimplemented. See https://github.com/paritytech/substrate/issues/14160." + ), + }) + } +} + +// Manual implementation to avoid extra boxing here +// TODO: functions modifying peerset state could be modified to call peerset directly if the +// `Multiaddr` only contains a `PeerId` +#[async_trait::async_trait] +impl NetworkPeers for Litep2pNetworkService { + fn set_authorized_peers(&self, peers: HashSet) { + let _ = self.cmd_tx.unbounded_send(NetworkServiceCommand::SetReservedPeers { + protocol: self.block_announce_protocol.clone(), + peers: peers + .into_iter() + .map(|peer| Multiaddr::empty().with(Protocol::P2p(peer.into()))) + .collect(), + }); + } + + fn set_authorized_only(&self, reserved_only: bool) { + let _ = self.cmd_tx.unbounded_send(NetworkServiceCommand::SetReservedOnly { + protocol: self.block_announce_protocol.clone(), + reserved_only, + }); + } + + fn add_known_address(&self, peer: PeerId, address: Multiaddr) { + let _ = self + .cmd_tx + .unbounded_send(NetworkServiceCommand::AddKnownAddress { peer, address }); + } + + fn peer_reputation(&self, peer_id: &PeerId) -> i32 { + self.peer_store_handle.peer_reputation(peer_id) + } + + fn report_peer(&self, peer: PeerId, cost_benefit: ReputationChange) { + self.peer_store_handle.report_peer(peer, cost_benefit); + } + + fn disconnect_peer(&self, peer: PeerId, protocol: ProtocolName) { + let _ = self + .cmd_tx + .unbounded_send(NetworkServiceCommand::DisconnectPeer { protocol, peer }); + } + + fn accept_unreserved_peers(&self) { + let _ = self.cmd_tx.unbounded_send(NetworkServiceCommand::SetReservedOnly { + protocol: self.block_announce_protocol.clone(), + reserved_only: false, + }); + } + + fn deny_unreserved_peers(&self) { + let _ = self.cmd_tx.unbounded_send(NetworkServiceCommand::SetReservedOnly { + protocol: self.block_announce_protocol.clone(), + reserved_only: true, + }); + } + + fn add_reserved_peer(&self, peer: MultiaddrWithPeerId) -> Result<(), String> { + let _ = self.cmd_tx.unbounded_send(NetworkServiceCommand::AddPeersToReservedSet { + protocol: self.block_announce_protocol.clone(), + peers: HashSet::from_iter([peer.concat()]), + }); + + Ok(()) + } + + fn remove_reserved_peer(&self, peer: PeerId) { + let _ = self.cmd_tx.unbounded_send(NetworkServiceCommand::RemoveReservedPeers { + protocol: self.block_announce_protocol.clone(), + peers: HashSet::from_iter([peer]), + }); + } + + fn set_reserved_peers( + &self, + protocol: ProtocolName, + peers: HashSet, + ) -> Result<(), String> { + let _ = self + .cmd_tx + .unbounded_send(NetworkServiceCommand::SetReservedPeers { protocol, peers }); + Ok(()) + } + + fn add_peers_to_reserved_set( + &self, + protocol: ProtocolName, + peers: HashSet, + ) -> Result<(), String> { + let _ = self + .cmd_tx + .unbounded_send(NetworkServiceCommand::AddPeersToReservedSet { protocol, peers }); + Ok(()) + } + + fn remove_peers_from_reserved_set( + &self, + protocol: ProtocolName, + peers: Vec, + ) -> Result<(), String> { + let _ = self.cmd_tx.unbounded_send(NetworkServiceCommand::RemoveReservedPeers { + protocol, + peers: peers.into_iter().map(From::from).collect(), + }); + + Ok(()) + } + + fn sync_num_connected(&self) -> usize { + self.peerset_handles + .get(&self.block_announce_protocol) + .map_or(0usize, |handle| handle.connected_peers.load(Ordering::Relaxed)) + } + + fn peer_role(&self, peer: PeerId, handshake: Vec) -> Option { + match Roles::decode_all(&mut &handshake[..]) { + Ok(role) => Some(role.into()), + Err(_) => { + log::debug!(target: LOG_TARGET, "handshake doesn't contain peer role: {handshake:?}"); + self.peer_store_handle.peer_role(&(peer.into())) + }, + } + } + + /// Get the list of reserved peers. + /// + /// Returns an error if the `NetworkWorker` is no longer running. + async fn reserved_peers(&self) -> Result, ()> { + let Some(handle) = self.peerset_handles.get(&self.block_announce_protocol) else { + return Err(()) + }; + let (tx, rx) = oneshot::channel(); + + handle + .tx + .unbounded_send(PeersetCommand::GetReservedPeers { tx }) + .map_err(|_| ())?; + + // the channel can only be closed if `Peerset` no longer exists + rx.await.map_err(|_| ()) + } +} + +impl NetworkEventStream for Litep2pNetworkService { + fn event_stream(&self, stream_name: &'static str) -> BoxStream<'static, Event> { + let (tx, rx) = out_events::channel(stream_name, 100_000); + let _ = self.cmd_tx.unbounded_send(NetworkServiceCommand::EventStream { tx }); + Box::pin(rx) + } +} + +impl NetworkStateInfo for Litep2pNetworkService { + fn external_addresses(&self) -> Vec { + self.external_addresses.read().iter().cloned().collect() + } + + fn listen_addresses(&self) -> Vec { + self.listen_addresses.read().iter().cloned().collect() + } + + fn local_peer_id(&self) -> PeerId { + self.local_peer_id.into() + } +} + +// Manual implementation to avoid extra boxing here +#[async_trait::async_trait] +impl NetworkRequest for Litep2pNetworkService { + async fn request( + &self, + _target: PeerId, + _protocol: ProtocolName, + _request: Vec, + _fallback_request: Option<(Vec, ProtocolName)>, + _connect: IfDisconnected, + ) -> Result<(Vec, ProtocolName), RequestFailure> { + unimplemented!(); + } + + fn start_request( + &self, + peer: PeerId, + protocol: ProtocolName, + request: Vec, + fallback_request: Option<(Vec, ProtocolName)>, + sender: oneshot::Sender, ProtocolName), RequestFailure>>, + connect: IfDisconnected, + ) { + match self.request_response_protocols.get(&protocol) { + Some(tx) => { + let _ = tx.unbounded_send(OutboundRequest::new( + peer, + request, + sender, + fallback_request, + connect, + )); + }, + None => log::warn!( + target: LOG_TARGET, + "{protocol} doesn't exist, cannot send request to {peer:?}" + ), + } + } +} diff --git a/substrate/client/network/src/litep2p/shim/bitswap.rs b/substrate/client/network/src/litep2p/shim/bitswap.rs new file mode 100644 index 0000000000000000000000000000000000000000..d347317ae9f98f09423053fb9d32bbac5314ba57 --- /dev/null +++ b/substrate/client/network/src/litep2p/shim/bitswap.rs @@ -0,0 +1,104 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +//! Shim for litep2p's Bitswap implementation to make it work with `sc-network`. + +use futures::StreamExt; +use litep2p::protocol::libp2p::bitswap::{ + BitswapEvent, BitswapHandle, BlockPresenceType, Config, ResponseType, WantType, +}; + +use sc_client_api::BlockBackend; +use sp_runtime::traits::Block as BlockT; + +use std::{future::Future, pin::Pin, sync::Arc}; + +/// Logging target for the file. +const LOG_TARGET: &str = "sub-libp2p::bitswap"; + +pub struct BitswapServer { + /// Bitswap handle. + handle: BitswapHandle, + + /// Blockchain client. + client: Arc + Send + Sync>, +} + +impl BitswapServer { + /// Create new [`BitswapServer`]. + pub fn new( + client: Arc + Send + Sync>, + ) -> (Pin + Send>>, Config) { + let (config, handle) = Config::new(); + let bitswap = Self { client, handle }; + + (Box::pin(async move { bitswap.run().await }), config) + } + + async fn run(mut self) { + log::debug!(target: LOG_TARGET, "starting bitswap server"); + + while let Some(event) = self.handle.next().await { + match event { + BitswapEvent::Request { peer, cids } => { + log::debug!(target: LOG_TARGET, "handle bitswap request from {peer:?} for {cids:?}"); + + let response: Vec = cids + .into_iter() + .map(|(cid, want_type)| { + let mut hash = Block::Hash::default(); + hash.as_mut().copy_from_slice(&cid.hash().digest()[0..32]); + let transaction = match self.client.indexed_transaction(hash) { + Ok(ex) => ex, + Err(error) => { + log::error!(target: LOG_TARGET, "error retrieving transaction {hash}: {error}"); + None + }, + }; + + match transaction { + Some(transaction) => { + log::trace!(target: LOG_TARGET, "found cid {cid:?}, hash {hash:?}"); + + match want_type { + WantType::Block => + ResponseType::Block { cid, block: transaction }, + _ => ResponseType::Presence { + cid, + presence: BlockPresenceType::Have, + }, + } + }, + None => { + log::trace!(target: LOG_TARGET, "missing cid {cid:?}, hash {hash:?}"); + + ResponseType::Presence { + cid, + presence: BlockPresenceType::DontHave, + } + }, + } + }) + .collect(); + + self.handle.send_response(peer, response).await; + }, + } + } + } +} diff --git a/substrate/client/network/src/litep2p/shim/mod.rs b/substrate/client/network/src/litep2p/shim/mod.rs new file mode 100644 index 0000000000000000000000000000000000000000..5eaf77ff0a4b4ab1e021528d26f1062135ef8a69 --- /dev/null +++ b/substrate/client/network/src/litep2p/shim/mod.rs @@ -0,0 +1,23 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +//! Shims for fitting `litep2p` APIs to `sc-network` APIs. + +pub(crate) mod bitswap; +pub(crate) mod notification; +pub(crate) mod request_response; diff --git a/substrate/client/network/src/litep2p/shim/notification/config.rs b/substrate/client/network/src/litep2p/shim/notification/config.rs new file mode 100644 index 0000000000000000000000000000000000000000..70e136da4ed998028032f475ac8bd7e481dc8b2a --- /dev/null +++ b/substrate/client/network/src/litep2p/shim/notification/config.rs @@ -0,0 +1,168 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +//! `litep2p` notification protocol configuration. + +use crate::{ + config::{MultiaddrWithPeerId, NonReservedPeerMode, NotificationHandshake, SetConfig}, + litep2p::shim::notification::{ + peerset::{Peerset, PeersetCommand}, + NotificationProtocol, + }, + peer_store::PeerStoreProvider, + service::{metrics::NotificationMetrics, traits::NotificationConfig}, + NotificationService, ProtocolName, +}; + +use litep2p::protocol::notification::{Config, ConfigBuilder}; + +use sc_utils::mpsc::TracingUnboundedSender; + +use std::sync::{atomic::AtomicUsize, Arc}; + +/// Handle for controlling the notification protocol. +#[derive(Debug, Clone)] +pub struct ProtocolControlHandle { + /// TX channel for sending commands to `Peerset` of the notification protocol. + pub tx: TracingUnboundedSender, + + /// Peers currently connected to this protocol. + pub connected_peers: Arc, +} + +impl ProtocolControlHandle { + /// Create new [`ProtocolControlHandle`]. + pub fn new( + tx: TracingUnboundedSender, + connected_peers: Arc, + ) -> Self { + Self { tx, connected_peers } + } +} + +/// Configuration for the notification protocol. +#[derive(Debug)] +pub struct NotificationProtocolConfig { + /// Name of the notifications protocols of this set. A substream on this set will be + /// considered established once this protocol is open. + pub protocol_name: ProtocolName, + + /// Maximum allowed size of single notifications. + max_notification_size: usize, + + /// Base configuration. + set_config: SetConfig, + + /// `litep2p` notification config. + pub config: Config, + + /// Handle for controlling the notification protocol. + pub handle: ProtocolControlHandle, +} + +impl NotificationProtocolConfig { + // Create new [`NotificationProtocolConfig`]. + pub fn new( + protocol_name: ProtocolName, + fallback_names: Vec, + max_notification_size: usize, + handshake: Option, + set_config: SetConfig, + metrics: NotificationMetrics, + peerstore_handle: Arc, + ) -> (Self, Box) { + // create `Peerset`/`Peerstore` handle for the protocol + let connected_peers = Arc::new(Default::default()); + let (peerset, peerset_tx) = Peerset::new( + protocol_name.clone(), + set_config.out_peers as usize, + set_config.in_peers as usize, + set_config.non_reserved_mode == NonReservedPeerMode::Deny, + set_config.reserved_nodes.iter().map(|address| address.peer_id).collect(), + Arc::clone(&connected_peers), + peerstore_handle, + ); + + // create `litep2p` notification protocol configuration for the protocol + // + // NOTE: currently only dummy value is given as the handshake as protocols (apart from + // syncing) are not configuring their own handshake and instead default to role being the + // handshake. As the time of writing this, most protocols are not aware of the role and + // that should be refactored in the future. + let (config, handle) = ConfigBuilder::new(protocol_name.clone().into()) + .with_handshake(handshake.map_or(vec![1], |handshake| (*handshake).to_vec())) + .with_max_size(max_notification_size as usize) + .with_auto_accept_inbound(true) + .with_fallback_names(fallback_names.into_iter().map(From::from).collect()) + .build(); + + // initialize the actual object implementing `NotificationService` and combine the + // `litep2p::NotificationHandle` with `Peerset` to implement a full and independent + // notification protocol runner + let protocol = NotificationProtocol::new(protocol_name.clone(), handle, peerset, metrics); + + ( + Self { + protocol_name, + max_notification_size, + set_config, + config, + handle: ProtocolControlHandle::new(peerset_tx, connected_peers), + }, + Box::new(protocol), + ) + } + + /// Get reference to protocol name. + pub fn protocol_name(&self) -> &ProtocolName { + &self.protocol_name + } + + /// Get reference to `SetConfig`. + pub fn set_config(&self) -> &SetConfig { + &self.set_config + } + + /// Modifies the configuration to allow non-reserved nodes. + pub fn allow_non_reserved(&mut self, in_peers: u32, out_peers: u32) { + self.set_config.in_peers = in_peers; + self.set_config.out_peers = out_peers; + self.set_config.non_reserved_mode = NonReservedPeerMode::Accept; + } + + /// Add a node to the list of reserved nodes. + pub fn add_reserved(&mut self, peer: MultiaddrWithPeerId) { + self.set_config.reserved_nodes.push(peer); + } + + /// Get maximum notification size. + pub fn max_notification_size(&self) -> usize { + self.max_notification_size + } +} + +impl NotificationConfig for NotificationProtocolConfig { + fn set_config(&self) -> &SetConfig { + &self.set_config + } + + /// Get reference to protocol name. + fn protocol_name(&self) -> &ProtocolName { + &self.protocol_name + } +} diff --git a/substrate/client/network/src/litep2p/shim/notification/mod.rs b/substrate/client/network/src/litep2p/shim/notification/mod.rs new file mode 100644 index 0000000000000000000000000000000000000000..8a320a00b000d4441c6e4b497d1b5cdcaaaff15c --- /dev/null +++ b/substrate/client/network/src/litep2p/shim/notification/mod.rs @@ -0,0 +1,374 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +//! Shim for `litep2p::NotificationHandle` to combine `Peerset`-like behavior +//! with `NotificationService`. + +use crate::{ + error::Error, + litep2p::shim::notification::peerset::{OpenResult, Peerset, PeersetNotificationCommand}, + service::{ + metrics::NotificationMetrics, + traits::{NotificationEvent as SubstrateNotificationEvent, ValidationResult}, + }, + MessageSink, NotificationService, ProtocolName, +}; + +use futures::{future::BoxFuture, stream::FuturesUnordered, StreamExt}; +use litep2p::protocol::notification::{ + NotificationEvent, NotificationHandle, NotificationSink, + ValidationResult as Litep2pValidationResult, +}; +use tokio::sync::oneshot; + +use sc_network_types::PeerId; + +use std::{collections::HashSet, fmt}; + +pub mod config; +pub mod peerset; + +#[cfg(test)] +mod tests; + +/// Logging target for the file. +const LOG_TARGET: &str = "sub-libp2p::notification"; + +/// Wrapper over `litep2p`'s notification sink. +pub struct Litep2pMessageSink { + /// Protocol. + protocol: ProtocolName, + + /// Remote peer ID. + peer: PeerId, + + /// Notification sink. + sink: NotificationSink, + + /// Notification metrics. + metrics: NotificationMetrics, +} + +impl Litep2pMessageSink { + /// Create new [`Litep2pMessageSink`]. + fn new( + peer: PeerId, + protocol: ProtocolName, + sink: NotificationSink, + metrics: NotificationMetrics, + ) -> Self { + Self { protocol, peer, sink, metrics } + } +} + +#[async_trait::async_trait] +impl MessageSink for Litep2pMessageSink { + /// Send synchronous `notification` to the peer associated with this [`MessageSink`]. + fn send_sync_notification(&self, notification: Vec) { + let size = notification.len(); + + match self.sink.send_sync_notification(notification) { + Ok(_) => self.metrics.register_notification_sent(&self.protocol, size), + Err(error) => log::trace!( + target: LOG_TARGET, + "{}: failed to send sync notification to {:?}: {error:?}", + self.protocol, + self.peer, + ), + } + } + + /// Send an asynchronous `notification` to to the peer associated with this [`MessageSink`], + /// allowing sender to exercise backpressure. + /// + /// Returns an error if the peer does not exist. + async fn send_async_notification(&self, notification: Vec) -> Result<(), Error> { + let size = notification.len(); + + match self.sink.send_async_notification(notification).await { + Ok(_) => { + self.metrics.register_notification_sent(&self.protocol, size); + Ok(()) + }, + Err(error) => { + log::trace!( + target: LOG_TARGET, + "{}: failed to send async notification to {:?}: {error:?}", + self.protocol, + self.peer, + ); + + Err(Error::Litep2p(error)) + }, + } + } +} + +/// Notification protocol implementation. +pub struct NotificationProtocol { + /// Protocol name. + protocol: ProtocolName, + + /// `litep2p` notification handle. + handle: NotificationHandle, + + /// Peerset for the notification protocol. + /// + /// Listens to peering-related events and either opens or closes substreams to remote peers. + peerset: Peerset, + + /// Pending validations for inbound substreams. + pending_validations: FuturesUnordered< + BoxFuture<'static, (PeerId, Result)>, + >, + + /// Pending cancels. + pending_cancels: HashSet, + + /// Notification metrics. + metrics: NotificationMetrics, +} + +impl fmt::Debug for NotificationProtocol { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_struct("NotificationProtocol") + .field("protocol", &self.protocol) + .field("handle", &self.handle) + .finish() + } +} + +impl NotificationProtocol { + /// Create new [`NotificationProtocol`]. + pub fn new( + protocol: ProtocolName, + handle: NotificationHandle, + peerset: Peerset, + metrics: NotificationMetrics, + ) -> Self { + Self { + protocol, + handle, + peerset, + metrics, + pending_cancels: HashSet::new(), + pending_validations: FuturesUnordered::new(), + } + } + + /// Handle `Peerset` command. + async fn on_peerset_command(&mut self, command: PeersetNotificationCommand) { + match command { + PeersetNotificationCommand::OpenSubstream { peers } => { + log::debug!(target: LOG_TARGET, "{}: open substreams to {peers:?}", self.protocol); + + let _ = self.handle.open_substream_batch(peers.into_iter().map(From::from)).await; + }, + PeersetNotificationCommand::CloseSubstream { peers } => { + log::debug!(target: LOG_TARGET, "{}: close substreams to {peers:?}", self.protocol); + + self.handle.close_substream_batch(peers.into_iter().map(From::from)).await; + }, + } + } +} + +#[async_trait::async_trait] +impl NotificationService for NotificationProtocol { + async fn open_substream(&mut self, _peer: PeerId) -> Result<(), ()> { + unimplemented!(); + } + + async fn close_substream(&mut self, _peer: PeerId) -> Result<(), ()> { + unimplemented!(); + } + + fn send_sync_notification(&mut self, peer: &PeerId, notification: Vec) { + let size = notification.len(); + + if let Ok(_) = self.handle.send_sync_notification(peer.into(), notification) { + self.metrics.register_notification_sent(&self.protocol, size); + } + } + + async fn send_async_notification( + &mut self, + peer: &PeerId, + notification: Vec, + ) -> Result<(), Error> { + let size = notification.len(); + + match self.handle.send_async_notification(peer.into(), notification).await { + Ok(_) => { + self.metrics.register_notification_sent(&self.protocol, size); + Ok(()) + }, + Err(_) => Err(Error::ChannelClosed), + } + } + + /// Set handshake for the notification protocol replacing the old handshake. + async fn set_handshake(&mut self, handshake: Vec) -> Result<(), ()> { + self.handle.set_handshake(handshake); + + Ok(()) + } + + /// Set handshake for the notification protocol replacing the old handshake. + /// + /// For `litep2p` this is identical to `NotificationService::set_handshake()` since `litep2p` + /// allows updating the handshake synchronously. + fn try_set_handshake(&mut self, handshake: Vec) -> Result<(), ()> { + self.handle.set_handshake(handshake); + + Ok(()) + } + + /// Make a copy of the object so it can be shared between protocol components + /// who wish to have access to the same underlying notification protocol. + fn clone(&mut self) -> Result, ()> { + unimplemented!("clonable `NotificationService` not supported by `litep2p`"); + } + + /// Get protocol name of the `NotificationService`. + fn protocol(&self) -> &ProtocolName { + &self.protocol + } + + /// Get message sink of the peer. + fn message_sink(&self, peer: &PeerId) -> Option> { + self.handle.notification_sink(peer.into()).map(|sink| { + let sink: Box = Box::new(Litep2pMessageSink::new( + *peer, + self.protocol.clone(), + sink, + self.metrics.clone(), + )); + sink + }) + } + + /// Get next event from the `Notifications` event stream. + async fn next_event(&mut self) -> Option { + loop { + tokio::select! { + biased; + + event = self.handle.next() => match event? { + NotificationEvent::ValidateSubstream { peer, handshake, .. } => { + if let ValidationResult::Reject = self.peerset.report_inbound_substream(peer.into()) { + self.handle.send_validation_result(peer, Litep2pValidationResult::Reject); + continue; + } + + let (tx, rx) = oneshot::channel(); + self.pending_validations.push(Box::pin(async move { (peer.into(), rx.await) })); + + log::trace!(target: LOG_TARGET, "{}: validate substream for {peer:?}", self.protocol); + + return Some(SubstrateNotificationEvent::ValidateInboundSubstream { + peer: peer.into(), + handshake, + result_tx: tx, + }); + } + NotificationEvent::NotificationStreamOpened { + peer, + fallback, + handshake, + direction, + .. + } => { + self.metrics.register_substream_opened(&self.protocol); + + match self.peerset.report_substream_opened(peer.into(), direction.into()) { + OpenResult::Reject => { + let _ = self.handle.close_substream_batch(vec![peer].into_iter().map(From::from)).await; + self.pending_cancels.insert(peer); + + continue + } + OpenResult::Accept { direction } => { + log::trace!(target: LOG_TARGET, "{}: substream opened for {peer:?}", self.protocol); + + return Some(SubstrateNotificationEvent::NotificationStreamOpened { + peer: peer.into(), + handshake, + direction, + negotiated_fallback: fallback.map(From::from), + }); + } + } + } + NotificationEvent::NotificationStreamClosed { + peer, + } => { + log::trace!(target: LOG_TARGET, "{}: substream closed for {peer:?}", self.protocol); + + self.metrics.register_substream_closed(&self.protocol); + self.peerset.report_substream_closed(peer.into()); + + if self.pending_cancels.remove(&peer) { + log::debug!( + target: LOG_TARGET, + "{}: substream closed to canceled peer ({peer:?})", + self.protocol + ); + continue + } + + return Some(SubstrateNotificationEvent::NotificationStreamClosed { peer: peer.into() }) + } + NotificationEvent::NotificationStreamOpenFailure { + peer, + error, + } => { + log::trace!(target: LOG_TARGET, "{}: open failure for {peer:?}", self.protocol); + self.peerset.report_substream_open_failure(peer.into(), error); + } + NotificationEvent::NotificationReceived { + peer, + notification, + } => { + self.metrics.register_notification_received(&self.protocol, notification.len()); + + if !self.pending_cancels.contains(&peer) { + return Some(SubstrateNotificationEvent::NotificationReceived { + peer: peer.into(), + notification: notification.to_vec(), + }); + } + } + }, + result = self.pending_validations.next(), if !self.pending_validations.is_empty() => { + let (peer, result) = result?; + let validation_result = match result { + Ok(ValidationResult::Accept) => Litep2pValidationResult::Accept, + _ => { + self.peerset.report_substream_rejected(peer); + Litep2pValidationResult::Reject + } + }; + + self.handle.send_validation_result(peer.into(), validation_result); + } + command = self.peerset.next() => self.on_peerset_command(command?).await, + } + } + } +} diff --git a/substrate/client/network/src/litep2p/shim/notification/peerset.rs b/substrate/client/network/src/litep2p/shim/notification/peerset.rs new file mode 100644 index 0000000000000000000000000000000000000000..2fd7920909e334c2f4756982bbd6937781dea4a7 --- /dev/null +++ b/substrate/client/network/src/litep2p/shim/notification/peerset.rs @@ -0,0 +1,1419 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +//! [`Peerset`] implementation for `litep2p`. +//! +//! [`Peerset`] is a separate but related component running alongside the notification protocol, +//! responsible for maintaining connectivity to remote peers. [`Peerset`] has an imperfect view of +//! the network as the notification protocol is behind an asynchronous channel. Based on this +//! imperfect view, it tries to connect to remote peers and disconnect peers that should be +//! disconnected from. +//! +//! [`Peerset`] knows of two types of peers: +//! - normal peers +//! - reserved peers +//! +//! Reserved peers are those which the [`Peerset`] should be connected at all times and it will make +//! an effort to do so by constantly checking that there are no disconnected reserved peers (except +//! banned) and if there are, it will open substreams to them. +//! +//! [`Peerset`] may also contain "slots", both inbound and outbound, which mark how many incoming +//! and outgoing connections it should maintain at all times. Peers for the inbound slots are filled +//! by remote peers opening inbound substreams towards the local node and peers for the outbound +//! slots are filled by querying the `Peerstore` which contains all peers known to `sc-network`. +//! Peers for outbound slots are selected in a decreasing order of reputation. + +use crate::{ + peer_store::{PeerStoreProvider, ProtocolHandle}, + service::traits::{self, ValidationResult}, + ProtocolName, ReputationChange as Reputation, +}; + +use futures::{channel::oneshot, future::BoxFuture, stream::FuturesUnordered, Stream, StreamExt}; +use futures_timer::Delay; +use litep2p::protocol::notification::NotificationError; + +use sc_network_types::PeerId; +use sc_utils::mpsc::{tracing_unbounded, TracingUnboundedReceiver, TracingUnboundedSender}; + +use std::{ + collections::{HashMap, HashSet}, + future::Future, + pin::Pin, + sync::{ + atomic::{AtomicUsize, Ordering}, + Arc, + }, + task::{Context, Poll}, + time::Duration, +}; + +/// Logging target for the file. +const LOG_TARGET: &str = "sub-libp2p::peerset"; + +/// Default backoff for connection re-attempts. +const DEFAULT_BACKOFF: Duration = Duration::from_secs(5); + +/// Open failure backoff. +const OPEN_FAILURE_BACKOFF: Duration = Duration::from_secs(5); + +/// Slot allocation frequency. +/// +/// How often should [`Peerset`] attempt to establish outbound connections. +const SLOT_ALLOCATION_FREQUENCY: Duration = Duration::from_secs(1); + +/// Reputation adjustment when a peer gets disconnected. +/// +/// Lessens the likelyhood of the peer getting selected for an outbound connection soon. +const DISCONNECT_ADJUSTMENT: Reputation = Reputation::new(-256, "Peer disconnected"); + +/// Reputation adjustment when a substream fails to open. +/// +/// Lessens the likelyhood of the peer getting selected for an outbound connection soon. +const OPEN_FAILURE_ADJUSTMENT: Reputation = Reputation::new(-1024, "Open failure"); + +/// Is the peer reserved? +#[derive(Debug, Copy, Clone, PartialEq, Eq)] +pub enum Reserved { + Yes, + No, +} + +impl From for Reserved { + fn from(value: bool) -> Reserved { + match value { + true => Reserved::Yes, + false => Reserved::No, + } + } +} + +impl From for bool { + fn from(value: Reserved) -> bool { + std::matches!(value, Reserved::Yes) + } +} + +#[derive(Debug, Copy, Clone, PartialEq, Eq)] +pub enum Direction { + /// Inbound substream. + Inbound(Reserved), + + /// Outbound substream. + Outbound(Reserved), +} + +impl From for traits::Direction { + fn from(direction: Direction) -> traits::Direction { + match direction { + Direction::Inbound(_) => traits::Direction::Inbound, + Direction::Outbound(_) => traits::Direction::Outbound, + } + } +} + +/// Open result for a fully-opened connection. +#[derive(PartialEq, Eq)] +pub enum OpenResult { + /// Accept the connection. + Accept { + /// Direction which [`Peerset`] considers to be correct. + direction: traits::Direction, + }, + + /// Reject the connection because it was canceled while it was opening. + Reject, +} + +/// Commands emitted by other subsystems of the blockchain to [`Peerset`]. +#[derive(Debug)] +pub enum PeersetCommand { + /// Set current reserved peer set. + /// + /// This command removes all reserved peers that are not in `peers`. + SetReservedPeers { + /// New reserved peer set. + peers: HashSet, + }, + + /// Add one or more reserved peers. + /// + /// This command doesn't remove any reserved peers but only add new peers. + AddReservedPeers { + /// Reserved peers to add. + peers: HashSet, + }, + + /// Remove reserved peers. + RemoveReservedPeers { + /// Reserved peers to remove. + peers: HashSet, + }, + + /// Set reserved-only mode to true/false. + SetReservedOnly { + /// Should the protocol only accept/establish connections to reserved peers. + reserved_only: bool, + }, + + /// Disconnect peer. + DisconnectPeer { + /// Peer ID. + peer: PeerId, + }, + + /// Get reserved peers. + GetReservedPeers { + /// `oneshot::Sender` for sending the current set of reserved peers. + tx: oneshot::Sender>, + }, +} + +/// Commands emitted by [`Peerset`] to the notification protocol. +#[derive(Debug)] +pub enum PeersetNotificationCommand { + /// Open substreams to one or more peers. + OpenSubstream { + /// Peer IDs. + peers: Vec, + }, + + /// Close substream to one or more peers. + CloseSubstream { + /// Peer IDs. + peers: Vec, + }, +} + +/// Peer state. +/// +/// Peer can be in 6 different state: +/// - disconnected +/// - connected +/// - connection is opening +/// - connection is closing +/// - connection is backed-off +/// - connection is canceled +/// +/// Opening and closing are separate states as litep2p guarantees to report when the substream is +/// either fully open or fully closed and the slot allocation for opening a substream is tied to a +/// state transition which moves the peer to [`PeerState::Opening`]. This is because it allows +/// reserving a slot for peer to prevent infinite outbound substreams. If the substream is opened +/// successfully, peer is moved to state [`PeerState::Connected`] but there is no modification to +/// the slot count as an outbound slot was already allocated for the peer. If the substream fails to +/// open, the event is reported by litep2p and [`Peerset::report_substream_open_failure()`] is +/// called which will decrease the outbound slot count. Similarly for inbound streams, the slot is +/// allocated in [`Peerset::report_inbound_substream()`] which will prevent `Peerset` from accepting +/// infinite inbound substreams. If the inbound substream fails to open and since [`Peerset`] was +/// notified of it, litep2p will report the open failure and the inbound slot count is once again +/// decreased in [`Peerset::report_substream_open_failure()`]. If the substream is opened +/// successfully, the slot count is not modified. +/// +/// Since closing a substream is not instantaneous, there is a separate [`PeerState::Closing`] +/// state which indicates that the substream is being closed but hasn't been closed by litep2p yet. +/// This state is used to prevent invalid state transitions where, for example, [`Peerset`] would +/// close a substream and then try to reopen it immediately. +/// +/// Irrespective of which side closed the substream (local/remote), the substream is chilled for a +/// small amount of time ([`DEFAULT_BACKOFF`]) and during this time no inbound or outbound +/// substreams are accepted/established. Any request to open an outbound substream while the peer +/// is backed-off is ignored. If the peer is a reserved peer, an outbound substream is not opened +/// for them immediately but after the back-off has expired, `Peerset` will attempt to open a +/// substream to the peer if it's still counted as a reserved peer. +/// +/// Disconnections and open failures will contribute negatively to the peer score to prevent it from +/// being selected for another outbound substream request soon after the failure/disconnection. The +/// reputation decays towards zero over time and eventually the peer will be as likely to be +/// selected for an outbound substream as any other freshly added peer. +/// +/// [`Peerset`] must also be able to handle the case where an outbound substream was opened to peer +/// and while it was opening, an inbound substream was received from that same peer. Since `litep2p` +/// is the source of truth of the actual state of the connection, [`Peerset`] must compensate for +/// this and if it happens that inbound substream is opened for a peer that was marked outbound, it +/// will attempt to allocate an inbound slot for the peer. If it fails to do so, the inbound +/// substream is rejected and the peer is marked as canceled. +/// +/// Since substream is not opened immediately, a peer can be disconnected even if the substream was +/// not yet open. This can happen, for example, when a peer has connected over the syncing protocol +/// and it was added to, e.g., GRANDPA's reserved peers, an outbound substream was opened +/// ([`PeerState::Opening`]) and then the peer disconnected. This state transition is handled by the +/// [`Peerset`] with `PeerState::Canceled` which indicates that should the substream open +/// successfully, it should be closed immediately and if the connection is opened successfully while +/// the peer was marked as canceled, the substream will be closed without notifying the protocol +/// about the substream. +#[derive(Debug, PartialEq, Eq)] +pub enum PeerState { + /// No active connection to peer. + Disconnected, + + /// Substream to peer was recently closed and the peer is currently backed off. + /// + /// Backoff only applies to outbound substreams. Inbound substream will not experience any sort + /// of "banning" even if the peer is backed off and an inbound substream for the peer is + /// received. + Backoff, + + /// Connection to peer is pending. + Opening { + /// Direction of the connection. + direction: Direction, + }, + + // Connected to peer. + Connected { + /// Is the peer inbound or outbound. + direction: Direction, + }, + + /// Substream was opened and while it was opening (no response had been heard from litep2p), + /// the substream was canceled by either calling `disconnect_peer()` or by removing peer + /// from the reserved set. + /// + /// After the opened substream is acknowledged by litep2p (open success/failure), the peer is + /// moved to [`PeerState::Backoff`] from which it will then be moved to + /// [`PeerState::Disconnected`]. + Canceled { + /// Is the peer inbound or outbound. + direction: Direction, + }, + + /// Connection to peer is closing. + /// + /// State implies that the substream was asked to be closed by the local node and litep2p is + /// closing the substream. No command modifying the connection state is accepted until the + /// state has been set to [`PeerState::Disconnected`]. + Closing { + /// Is the peer inbound or outbound. + direction: Direction, + }, +} + +/// `Peerset` implementation. +/// +/// `Peerset` allows other subsystems of the blockchain to modify the connection state +/// of the notification protocol by adding and removing reserved peers. +/// +/// `Peerset` is also responsible for maintaining the desired amount of peers the protocol is +/// connected to by establishing outbound connections and accepting/rejecting inbound connections. +#[derive(Debug)] +pub struct Peerset { + /// Protocol name. + protocol: ProtocolName, + + /// RX channel for receiving commands. + cmd_rx: TracingUnboundedReceiver, + + /// Maximum number of outbound peers. + max_out: usize, + + /// Current number of outbound peers. + num_out: usize, + + /// Maximum number of inbound peers. + max_in: usize, + + /// Current number of inbound peers. + num_in: usize, + + /// Only connect to/accept connections from reserved peers. + reserved_only: bool, + + /// Current reserved peer set. + reserved_peers: HashSet, + + /// Handle to `Peerstore`. + peerstore_handle: Arc, + + /// Peers. + peers: HashMap, + + /// Counter connected peers. + connected_peers: Arc, + + /// Pending backoffs for peers who recently disconnected. + pending_backoffs: FuturesUnordered>, + + /// Next time when [`Peerset`] should perform slot allocation. + next_slot_allocation: Delay, +} + +macro_rules! decrement_or_warn { + ($slot:expr, $protocol:expr, $peer:expr, $direction:expr) => {{ + match $slot.checked_sub(1) { + Some(value) => { + $slot = value; + } + None => { + log::warn!( + target: LOG_TARGET, + "{}: state mismatch, {:?} is not counted as part of {:?} slots", + $protocol, $peer, $direction + ); + debug_assert!(false); + } + } + }}; +} + +/// Handle to [`Peerset`], given to `Peerstore`. +#[derive(Debug)] +struct PeersetHandle { + /// TX channel for sending commands to [`Peerset`]. + tx: TracingUnboundedSender, +} + +impl ProtocolHandle for PeersetHandle { + /// Disconnect peer, as a result of a ban. + fn disconnect_peer(&self, peer: PeerId) { + let _ = self.tx.unbounded_send(PeersetCommand::DisconnectPeer { peer }); + } +} + +impl Peerset { + /// Create new [`Peerset`]. + pub fn new( + protocol: ProtocolName, + max_out: usize, + max_in: usize, + reserved_only: bool, + reserved_peers: HashSet, + connected_peers: Arc, + peerstore_handle: Arc, + ) -> (Self, TracingUnboundedSender) { + let (cmd_tx, cmd_rx) = tracing_unbounded("mpsc-peerset-protocol", 100_000); + let peers = reserved_peers + .iter() + .map(|peer| (*peer, PeerState::Disconnected)) + .collect::>(); + + // register protocol's command channel to `Peerstore` so it can issue disconnect commands + // if some connected peer gets banned. + peerstore_handle.register_protocol(Arc::new(PeersetHandle { tx: cmd_tx.clone() })); + + ( + Self { + protocol, + max_out, + num_out: 0usize, + max_in, + num_in: 0usize, + reserved_peers, + cmd_rx, + peerstore_handle, + reserved_only, + peers, + connected_peers, + pending_backoffs: FuturesUnordered::new(), + next_slot_allocation: Delay::new(SLOT_ALLOCATION_FREQUENCY), + }, + cmd_tx, + ) + } + + /// Report to [`Peerset`] that a substream was opened. + /// + /// Slot for the stream was "preallocated" when it was initiated (outbound) or accepted + /// (inbound) by the local node which is why this function doesn't allocate a slot for the peer. + /// + /// Returns `true` if the substream should be kept open and `false` if the substream had been + /// canceled while it was opening and litep2p should close the substream. + pub fn report_substream_opened( + &mut self, + peer: PeerId, + direction: traits::Direction, + ) -> OpenResult { + log::trace!( + target: LOG_TARGET, + "{}: substream opened to {peer:?}, direction {direction:?}, reserved peer {}", + self.protocol, + self.reserved_peers.contains(&peer), + ); + + let Some(state) = self.peers.get_mut(&peer) else { + log::warn!(target: LOG_TARGET, "{}: substream opened for unknown peer {peer:?}", self.protocol); + debug_assert!(false); + return OpenResult::Reject + }; + + match state { + PeerState::Opening { direction: substream_direction } => { + let real_direction: traits::Direction = (*substream_direction).into(); + + *state = PeerState::Connected { direction: *substream_direction }; + self.connected_peers.fetch_add(1usize, Ordering::Relaxed); + + return OpenResult::Accept { direction: real_direction } + }, + // litep2p doesn't support the ability to cancel an opening substream so if the + // substream was closed while it was opening, it was marked as canceled and if the + // substream opens succesfully, it will be closed + PeerState::Canceled { direction: substream_direction } => { + log::trace!( + target: LOG_TARGET, + "{}: substream to {peer:?} is canceled, issue disconnection request", + self.protocol, + ); + + self.connected_peers.fetch_add(1usize, Ordering::Relaxed); + *state = PeerState::Closing { direction: *substream_direction }; + + return OpenResult::Reject + }, + state => { + panic!("{}: invalid state for open substream {peer:?} {state:?}", self.protocol); + }, + } + } + + /// Report to [`Peerset`] that a substream was closed. + /// + /// If the peer was not a reserved peer, the inbound/outbound slot count is adjusted to account + /// for the disconnected peer. After the connection is closed, the peer is chilled for a + /// duration of [`DEFAULT_BACKOFF`] which prevens [`Peerset`] from establishing/accepting new + /// connections for that time period. + pub fn report_substream_closed(&mut self, peer: PeerId) { + log::trace!(target: LOG_TARGET, "{}: substream closed to {peer:?}", self.protocol); + + let Some(state) = self.peers.get_mut(&peer) else { + log::warn!(target: LOG_TARGET, "{}: substream closed for unknown peer {peer:?}", self.protocol); + debug_assert!(false); + return + }; + + match &state { + // close was initiated either by remote ([`PeerState::Connected`]) or local node + // ([`PeerState::Closing`]) and it was a non-reserved peer + PeerState::Connected { direction: Direction::Inbound(Reserved::No) } | + PeerState::Closing { direction: Direction::Inbound(Reserved::No) } => { + log::trace!( + target: LOG_TARGET, + "{}: inbound substream closed to non-reserved peer {peer:?}: {state:?}", + self.protocol, + ); + + decrement_or_warn!( + self.num_in, + peer, + self.protocol, + Direction::Inbound(Reserved::No) + ); + }, + // close was initiated either by remote ([`PeerState::Connected`]) or local node + // ([`PeerState::Closing`]) and it was a non-reserved peer + PeerState::Connected { direction: Direction::Outbound(Reserved::No) } | + PeerState::Closing { direction: Direction::Outbound(Reserved::No) } => { + log::trace!( + target: LOG_TARGET, + "{}: outbound substream closed to non-reserved peer {peer:?} {state:?}", + self.protocol, + ); + + decrement_or_warn!( + self.num_out, + peer, + self.protocol, + Direction::Outbound(Reserved::No) + ); + }, + // reserved peers don't require adjustments to slot counts + PeerState::Closing { .. } | PeerState::Connected { .. } => { + log::debug!(target: LOG_TARGET, "{}: reserved peer {peer:?} disconnected", self.protocol); + }, + state => { + log::warn!(target: LOG_TARGET, "{}: invalid state for disconnected peer {peer:?}: {state:?}", self.protocol); + debug_assert!(false); + }, + } + *state = PeerState::Backoff; + + self.connected_peers.fetch_sub(1usize, Ordering::Relaxed); + self.pending_backoffs.push(Box::pin(async move { + Delay::new(DEFAULT_BACKOFF).await; + (peer, DISCONNECT_ADJUSTMENT) + })); + } + + /// Report to [`Peerset`] that an inbound substream was opened and that it should validate it. + pub fn report_inbound_substream(&mut self, peer: PeerId) -> ValidationResult { + log::trace!(target: LOG_TARGET, "{}: inbound substream from {peer:?}", self.protocol); + + if self.peerstore_handle.is_banned(&peer) { + log::debug!( + target: LOG_TARGET, + "{}: rejecting banned peer {peer:?}", + self.protocol, + ); + + return ValidationResult::Reject; + } + + let state = self.peers.entry(peer).or_insert(PeerState::Disconnected); + let is_reserved_peer = self.reserved_peers.contains(&peer); + + match state { + // disconnected peers proceed directly to inbound slot allocation + PeerState::Disconnected => {}, + // peer is backed off but if it can be accepted (either a reserved peer or inbound slot + // available), accept the peer and then just ignore the back-off timer when it expires + PeerState::Backoff => + if !is_reserved_peer && self.num_in == self.max_in { + log::trace!( + target: LOG_TARGET, + "{}: ({peer:?}) is backed-off and cannot accept, reject inbound substream", + self.protocol, + ); + + return ValidationResult::Reject + }, + // `Peerset` had initiated an outbound substream but litep2p had received an inbound + // substream before the command to open the substream was received, meaning local and + // remote desired to open a connection at the same time. Since outbound substreams + // cannot be canceled with litep2p and the command has already been registered, accept + // the inbound peer since the local node had wished a connection to be opened either way + // but keep the direction of the substream as it was (outbound). + // + // litep2p doesn't care what `Peerset` considers the substream direction to be and since + // it's used for bookkeeping for substream counts, keeping the substream direction + // unmodified simplies the implementation a lot. The direction would otherwise be + // irrelevant for protocols but because `SyncingEngine` has a hack to reject excess + // inbound substreams, that system has to be kept working for the time being. Once that + // issue is fixed, this approach can be re-evaluated if need be. + PeerState::Opening { direction: Direction::Outbound(reserved) } => { + log::trace!( + target: LOG_TARGET, + "{}: inbound substream received for {peer:?} ({reserved:?}) that was marked outbound", + self.protocol, + ); + + return ValidationResult::Accept; + }, + PeerState::Canceled { direction } => { + log::trace!( + target: LOG_TARGET, + "{}: {peer:?} is canceled, rejecting substream", + self.protocol, + ); + + *state = PeerState::Canceled { direction: *direction }; + return ValidationResult::Reject + }, + state => { + log::warn!( + target: LOG_TARGET, + "{}: invalid state ({state:?}) for inbound substream, peer {peer:?}", + self.protocol + ); + debug_assert!(false); + return ValidationResult::Reject + }, + } + + if is_reserved_peer { + log::trace!( + target: LOG_TARGET, + "{}: {peer:?} accepting peer as reserved peer", + self.protocol, + ); + + *state = PeerState::Opening { direction: Direction::Inbound(is_reserved_peer.into()) }; + return ValidationResult::Accept + } + + if self.num_in < self.max_in { + log::trace!( + target: LOG_TARGET, + "{}: {peer:?} accepting peer as regular peer", + self.protocol, + ); + + self.num_in += 1; + + *state = PeerState::Opening { direction: Direction::Inbound(is_reserved_peer.into()) }; + return ValidationResult::Accept + } + + log::trace!( + target: LOG_TARGET, + "{}: reject {peer:?}, not a reserved peer and no free inbound slots", + self.protocol, + ); + + *state = PeerState::Disconnected; + return ValidationResult::Reject + } + + /// Report to [`Peerset`] that there was an error opening a substream. + pub fn report_substream_open_failure(&mut self, peer: PeerId, error: NotificationError) { + log::trace!( + target: LOG_TARGET, + "{}: failed to open substream to {peer:?}: {error:?}", + self.protocol, + ); + + match self.peers.get(&peer) { + Some(PeerState::Opening { direction: Direction::Outbound(Reserved::No) }) => { + decrement_or_warn!( + self.num_out, + self.protocol, + peer, + Direction::Outbound(Reserved::No) + ); + }, + Some(PeerState::Opening { direction: Direction::Inbound(Reserved::No) }) => { + decrement_or_warn!( + self.num_in, + self.protocol, + peer, + Direction::Inbound(Reserved::No) + ); + }, + Some(PeerState::Canceled { direction }) => match direction { + Direction::Inbound(Reserved::No) => { + decrement_or_warn!( + self.num_in, + self.protocol, + peer, + Direction::Inbound(Reserved::No) + ); + }, + Direction::Outbound(Reserved::No) => { + decrement_or_warn!( + self.num_out, + self.protocol, + peer, + Direction::Outbound(Reserved::No) + ); + }, + _ => {}, + }, + // reserved peers do not require change in the slot counts + Some(PeerState::Opening { direction: Direction::Inbound(Reserved::Yes) }) | + Some(PeerState::Opening { direction: Direction::Outbound(Reserved::Yes) }) => { + log::debug!( + target: LOG_TARGET, + "{}: substream open failure for reserved peer {peer:?}", + self.protocol, + ); + }, + state => { + log::debug!( + target: LOG_TARGET, + "{}: substream open failure for a unknown state: {state:?}", + self.protocol, + ); + + return; + }, + } + + self.peers.insert(peer, PeerState::Backoff); + self.pending_backoffs.push(Box::pin(async move { + Delay::new(OPEN_FAILURE_BACKOFF).await; + (peer, OPEN_FAILURE_ADJUSTMENT) + })); + } + + /// [`Peerset`] had accepted a peer but it was then rejected by the protocol. + pub fn report_substream_rejected(&mut self, peer: PeerId) { + log::trace!(target: LOG_TARGET, "{}: {peer:?} rejected by the protocol", self.protocol); + + match self.peers.remove(&peer) { + Some(PeerState::Opening { direction }) => match direction { + Direction::Inbound(Reserved::Yes) | Direction::Outbound(Reserved::Yes) => { + log::warn!( + target: LOG_TARGET, + "{}: reserved peer {peer:?} rejected by the protocol", + self.protocol, + ); + self.peers.insert(peer, PeerState::Disconnected); + }, + Direction::Inbound(Reserved::No) => { + decrement_or_warn!( + self.num_in, + peer, + self.protocol, + Direction::Inbound(Reserved::No) + ); + self.peers.insert(peer, PeerState::Disconnected); + }, + Direction::Outbound(Reserved::No) => { + decrement_or_warn!( + self.num_out, + peer, + self.protocol, + Direction::Outbound(Reserved::No) + ); + self.peers.insert(peer, PeerState::Disconnected); + }, + }, + Some(state @ PeerState::Canceled { .. }) => { + log::debug!( + target: LOG_TARGET, + "{}: substream to {peer:?} rejected by protocol but already canceled", + self.protocol, + ); + + self.peers.insert(peer, state); + }, + Some(state) => { + log::debug!( + target: LOG_TARGET, + "{}: {peer:?} rejected by the protocol but not opening anymore: {state:?}", + self.protocol, + ); + + self.peers.insert(peer, state); + }, + None => {}, + } + } + + /// Calculate how many of the connected peers were counted as normal inbound/outbound peers + /// which is needed to adjust slot counts when new reserved peers are added + fn calculate_slot_adjustment<'a>( + &'a mut self, + peers: impl Iterator, + ) -> (usize, usize) { + peers.fold((0, 0), |(mut inbound, mut outbound), peer| { + match self.peers.get_mut(peer) { + Some(PeerState::Disconnected | PeerState::Backoff) => {}, + Some( + PeerState::Opening { ref mut direction } | + PeerState::Connected { ref mut direction } | + PeerState::Canceled { ref mut direction } | + PeerState::Closing { ref mut direction }, + ) => { + *direction = match direction { + Direction::Inbound(Reserved::No) => { + inbound += 1; + Direction::Inbound(Reserved::Yes) + }, + Direction::Outbound(Reserved::No) => { + outbound += 1; + Direction::Outbound(Reserved::Yes) + }, + ref direction => **direction, + }; + }, + None => { + self.peers.insert(*peer, PeerState::Disconnected); + }, + } + + (inbound, outbound) + }) + } + + /// Get the number of inbound peers. + #[cfg(test)] + pub fn num_in(&self) -> usize { + self.num_in + } + + /// Get the number of outbound peers. + #[cfg(test)] + pub fn num_out(&self) -> usize { + self.num_out + } + + /// Get reference to known peers. + #[cfg(test)] + pub fn peers(&self) -> &HashMap { + &self.peers + } + + /// Get reference to reserved peers. + #[cfg(test)] + pub fn reserved_peers(&self) -> &HashSet { + &self.reserved_peers + } +} + +impl Stream for Peerset { + type Item = PeersetNotificationCommand; + + fn poll_next(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { + while let Poll::Ready(Some((peer, reputation))) = self.pending_backoffs.poll_next_unpin(cx) + { + log::trace!(target: LOG_TARGET, "{}: backoff expired for {peer:?}", self.protocol); + + if std::matches!(self.peers.get(&peer), None | Some(PeerState::Backoff)) { + self.peers.insert(peer, PeerState::Disconnected); + } + + self.peerstore_handle.report_peer(peer, reputation); + } + + if let Poll::Ready(Some(action)) = Pin::new(&mut self.cmd_rx).poll_next(cx) { + match action { + PeersetCommand::DisconnectPeer { peer } if !self.reserved_peers.contains(&peer) => + match self.peers.remove(&peer) { + Some(PeerState::Connected { direction }) => { + log::trace!( + target: LOG_TARGET, + "{}: close connection to {peer:?}, direction {direction:?}", + self.protocol, + ); + + self.peers.insert(peer, PeerState::Closing { direction }); + return Poll::Ready(Some(PeersetNotificationCommand::CloseSubstream { + peers: vec![peer], + })) + }, + Some(PeerState::Backoff) => { + log::trace!( + target: LOG_TARGET, + "{}: cannot disconnect {peer:?}, already backed-off", + self.protocol, + ); + + self.peers.insert(peer, PeerState::Backoff); + }, + // substream might have been opening but not yet fully open when the + // protocol or `Peerstore` request the connection to be closed + // + // if the substream opens successfully, close it immediately and mark the + // peer as `Disconnected` + Some(PeerState::Opening { direction }) => { + log::trace!( + target: LOG_TARGET, + "{}: canceling substream to disconnect peer {peer:?}", + self.protocol, + ); + + self.peers.insert(peer, PeerState::Canceled { direction }); + }, + // protocol had issued two disconnection requests in rapid succession and + // the substream hadn't closed before the second disconnection request was + // received, this is harmless and can be ignored. + Some(state @ PeerState::Closing { .. }) => { + log::trace!( + target: LOG_TARGET, + "{}: cannot disconnect {peer:?}, already closing ({state:?})", + self.protocol, + ); + + self.peers.insert(peer, state); + }, + // if peer is banned, e.g. due to genesis mismatch, `Peerstore` will issue a + // global disconnection request to all protocols, irrespective of the + // connectivity state. Peer isn't necessarily connected to all protocols at + // all times so this is a harmless state to be in if a disconnection request + // is received. + Some(state @ PeerState::Disconnected) => { + self.peers.insert(peer, state); + }, + // peer had an opening substream earlier which was canceled and then, + // e.g., the peer was banned which caused it to be disconnected again + Some(state @ PeerState::Canceled { .. }) => { + log::debug!( + target: LOG_TARGET, + "{}: cannot disconnect {peer:?}, already canceled ({state:?})", + self.protocol, + ); + + self.peers.insert(peer, state); + }, + // peer doesn't exist + // + // this can happen, for example, when peer connects over + // `/block-announces/1` and it has wrong genesis hash which initiates a ban + // for that peer. Since the ban is reported to all protocols but the peer + // mightn't have been registered to GRANDPA or transactions yet, the peer + // doesn't exist in their `Peerset`s and the error can just be ignored. + None => { + log::debug!(target: LOG_TARGET, "{}: {peer:?} doesn't exist", self.protocol); + }, + }, + PeersetCommand::DisconnectPeer { peer } => { + log::debug!( + target: LOG_TARGET, + "{}: ignoring disconnection request for reserved peer {peer}", + self.protocol, + ); + }, + // set new reserved peers for the protocol + // + // current reserved peers not in the new set are disconnected and the new reserved + // peers are scheduled for outbound substreams + PeersetCommand::SetReservedPeers { peers } => { + log::debug!(target: LOG_TARGET, "{}: set reserved peers {peers:?}", self.protocol); + + // reserved peers don't consume any slots so if there are any regular connected + // peers, inbound/outbound slot count must be adjusted to not account for these + // peers anymore + // + // calculate how many of the previously connected peers were counted as regular + // peers and substract these counts from `num_out`/`num_in` + let (in_peers, out_peers) = self.calculate_slot_adjustment(peers.iter()); + self.num_out -= out_peers; + self.num_in -= in_peers; + + // add all unknown peers to `self.peers` + peers.iter().for_each(|peer| { + if !self.peers.contains_key(peer) { + self.peers.insert(*peer, PeerState::Disconnected); + } + }); + + // collect all peers who are not in the new reserved set + let peers_to_remove = self + .peers + .iter() + .filter_map(|(peer, _)| (!peers.contains(peer)).then_some(*peer)) + .collect::>(); + + self.reserved_peers = peers; + + let peers = peers_to_remove + .into_iter() + .filter(|peer| { + match self.peers.remove(&peer) { + Some(PeerState::Connected { direction }) => { + log::trace!( + target: LOG_TARGET, + "{}: close connection to {peer:?}, direction {direction:?}", + self.protocol, + ); + + self.peers.insert(*peer, PeerState::Closing { direction }); + true + }, + // substream might have been opening but not yet fully open when + // the protocol request the reserved set to be changed + Some(PeerState::Opening { direction }) => { + log::trace!( + target: LOG_TARGET, + "{}: cancel substream to {peer:?}, direction {direction:?}", + self.protocol, + ); + + self.peers.insert(*peer, PeerState::Canceled { direction }); + false + }, + Some(state) => { + self.peers.insert(*peer, state); + false + }, + None => { + log::debug!(target: LOG_TARGET, "{}: {peer:?} doesn't exist", self.protocol); + debug_assert!(false); + false + }, + } + }) + .collect(); + + log::trace!( + target: LOG_TARGET, + "{}: close substreams to {peers:?}", + self.protocol, + ); + + return Poll::Ready(Some(PeersetNotificationCommand::CloseSubstream { peers })) + }, + PeersetCommand::AddReservedPeers { peers } => { + log::debug!(target: LOG_TARGET, "{}: add reserved peers {peers:?}", self.protocol); + + // reserved peers don't consume any slots so if there are any regular connected + // peers, inbound/outbound slot count must be adjusted to not account for these + // peers anymore + // + // calculate how many of the previously connected peers were counted as regular + // peers and substract these counts from `num_out`/`num_in` + let (in_peers, out_peers) = self.calculate_slot_adjustment(peers.iter()); + self.num_out -= out_peers; + self.num_in -= in_peers; + + let peers = peers + .iter() + .filter_map(|peer| { + if !self.reserved_peers.insert(*peer) { + log::warn!( + target: LOG_TARGET, + "{}: {peer:?} is already a reserved peer", + self.protocol, + ); + return None + } + + std::matches!( + self.peers.get_mut(peer), + None | Some(PeerState::Disconnected) + ) + .then(|| { + self.peers.insert( + *peer, + PeerState::Opening { + direction: Direction::Outbound(Reserved::Yes), + }, + ); + *peer + }) + }) + .collect(); + + log::debug!(target: LOG_TARGET, "{}: start connecting to {peers:?}", self.protocol); + + return Poll::Ready(Some(PeersetNotificationCommand::OpenSubstream { peers })) + }, + PeersetCommand::RemoveReservedPeers { peers } => { + log::debug!(target: LOG_TARGET, "{}: remove reserved peers {peers:?}", self.protocol); + + let peers_to_remove = peers + .iter() + .filter_map(|peer| { + if !self.reserved_peers.remove(peer) { + log::debug!( + target: LOG_TARGET, + "{}: {peer} is not a reserved peer", + self.protocol, + ); + return None + } + + match self.peers.remove(peer)? { + // peer might have already disconnected by the time request to + // disconnect them was received and the peer was backed off but + // it had no expired by the time the request to disconnect the + // peer was received + PeerState::Backoff => { + log::trace!( + target: LOG_TARGET, + "{}: cannot disconnect removed reserved peer {peer:?}, already backed-off", + self.protocol, + ); + + self.peers.insert(*peer, PeerState::Backoff); + None + }, + // if there is a rapid change in substream state, the peer may + // be canceled when the substream is asked to be closed. + // + // this can happen if substream is first opened and the very + // soon after canceled. The substream may not have had time to + // open yet and second open is ignored. If the substream is now + // closed again before it has had time to open, it will be in + // canceled state since `Peerset` is still waiting to hear + // either success/failure on the original substream it tried to + // cancel. + PeerState::Canceled { direction } => { + log::trace!( + target: LOG_TARGET, + "{}: cannot disconnect removed reserved peer {peer:?}, already canceled", + self.protocol, + ); + + self.peers.insert(*peer, PeerState::Canceled { direction }); + None + }, + // substream to the peer might have failed to open which caused + // the peer to be backed off + // + // the back-off might've expired by the time the peer was + // disconnected at which point the peer is already disconnected + // when the protocol asked the peer to be disconnected + PeerState::Disconnected => { + log::trace!( + target: LOG_TARGET, + "{}: cannot disconnect removed reserved peer {peer:?}, already disconnected", + self.protocol, + ); + + self.peers.insert(*peer, PeerState::Disconnected); + None + }, + // if a node disconnects, it's put into `PeerState::Closing` + // which indicates that `Peerset` wants the substream closed and + // has asked litep2p to close it but it hasn't yet received a + // confirmation. If the peer is added as a reserved peer while + // the substream is closing, the peer will remain in the closing + // state as `Peerset` can't do anything with the peer until it + // has heard from litep2p. It's possible that the peer is then + // removed from the reserved set before substream close event + // has been reported to `Peerset` (which the code below is + // handling) and it will once again be ignored until the close + // event is heard from litep2p. + PeerState::Closing { direction } => { + log::trace!( + target: LOG_TARGET, + "{}: cannot disconnect removed reserved peer {peer:?}, already closing", + self.protocol, + ); + + self.peers.insert(*peer, PeerState::Closing { direction }); + None + }, + // peer is currently connected as a reserved peer + // + // check if the peer can be accepted as a regular peer based on its + // substream direction and available slots + // + // if there are enough slots, the peer is just converted to + // a regular peer and the used slot count is increased and if the + // peer cannot be accepted, litep2p is asked to close the substream. + PeerState::Connected { direction } => match direction { + Direction::Inbound(_) => match self.num_in < self.max_in { + true => { + log::trace!( + target: LOG_TARGET, + "{}: {peer:?} converted to regular inbound peer (inbound open)", + self.protocol, + ); + + self.num_in += 1; + self.peers.insert( + *peer, + PeerState::Connected { + direction: Direction::Inbound(Reserved::No), + }, + ); + + None + }, + false => { + self.peers.insert( + *peer, + PeerState::Closing { + direction: Direction::Inbound(Reserved::Yes), + }, + ); + + Some(*peer) + }, + }, + Direction::Outbound(_) => match self.num_out < self.max_out { + true => { + log::trace!( + target: LOG_TARGET, + "{}: {peer:?} converted to regular outbound peer (outbound open)", + self.protocol, + ); + + self.num_out += 1; + self.peers.insert( + *peer, + PeerState::Connected { + direction: Direction::Outbound(Reserved::No), + }, + ); + + None + }, + false => { + self.peers.insert( + *peer, + PeerState::Closing { + direction: Direction::Outbound(Reserved::Yes), + }, + ); + + Some(*peer) + }, + }, + }, + PeerState::Opening { direction } => match direction { + Direction::Inbound(_) => match self.num_in < self.max_in { + true => { + log::trace!( + target: LOG_TARGET, + "{}: {peer:?} converted to regular inbound peer (inbound opening)", + self.protocol, + ); + + self.num_in += 1; + self.peers.insert( + *peer, + PeerState::Opening { + direction: Direction::Inbound(Reserved::No), + }, + ); + + None + }, + false => { + self.peers.insert( + *peer, + PeerState::Canceled { + direction: Direction::Inbound(Reserved::Yes), + }, + ); + + None + }, + }, + Direction::Outbound(_) => match self.num_out < self.max_out { + true => { + log::trace!( + target: LOG_TARGET, + "{}: {peer:?} converted to regular outbound peer (outbound opening)", + self.protocol, + ); + + self.num_out += 1; + self.peers.insert( + *peer, + PeerState::Opening { + direction: Direction::Outbound(Reserved::No), + }, + ); + + None + }, + false => { + self.peers.insert( + *peer, + PeerState::Canceled { + direction: Direction::Outbound(Reserved::Yes), + }, + ); + + None + }, + }, + }, + } + }) + .collect(); + + log::debug!( + target: LOG_TARGET, + "{}: close substreams to {peers_to_remove:?}", + self.protocol, + ); + + return Poll::Ready(Some(PeersetNotificationCommand::CloseSubstream { + peers: peers_to_remove, + })) + }, + PeersetCommand::SetReservedOnly { reserved_only } => { + log::debug!(target: LOG_TARGET, "{}: set reserved only mode to {reserved_only}", self.protocol); + + // update mode and if it's set to true, disconnect all non-reserved peers + self.reserved_only = reserved_only; + + if reserved_only { + let peers_to_remove = self + .peers + .iter() + .filter_map(|(peer, state)| { + (!self.reserved_peers.contains(peer) && + std::matches!(state, PeerState::Connected { .. })) + .then_some(*peer) + }) + .collect::>(); + + // set peers to correct states + + // peers who are connected are move to [`PeerState::Closing`] + // and peers who are already opening are moved to [`PeerState::Canceled`] + // and if the substream for them opens, it will be closed right after. + self.peers.iter_mut().for_each(|(_, state)| match state { + PeerState::Connected { direction } => { + *state = PeerState::Closing { direction: *direction }; + }, + // peer for whom a substream was opening are canceled and if the + // substream opens successfully, it will be closed immediately + PeerState::Opening { direction } => { + *state = PeerState::Canceled { direction: *direction }; + }, + _ => {}, + }); + + return Poll::Ready(Some(PeersetNotificationCommand::CloseSubstream { + peers: peers_to_remove, + })) + } + }, + PeersetCommand::GetReservedPeers { tx } => { + let _ = tx.send(self.reserved_peers.iter().cloned().collect()); + }, + } + } + + // periodically check if `Peerset` is currently not connected to some reserved peers + // it should be connected to + // + // also check if there are free outbound slots and if so, fetch peers with highest + // reputations from `Peerstore` and start opening substreams to these peers + if let Poll::Ready(()) = Pin::new(&mut self.next_slot_allocation).poll(cx) { + let mut connect_to = self + .peers + .iter() + .filter_map(|(peer, state)| { + (self.reserved_peers.contains(peer) && + std::matches!(state, PeerState::Disconnected) && + !self.peerstore_handle.is_banned(peer)) + .then_some(*peer) + }) + .collect::>(); + + connect_to.iter().for_each(|peer| { + self.peers.insert( + *peer, + PeerState::Opening { direction: Direction::Outbound(Reserved::Yes) }, + ); + }); + + // if the number of outbound peers is lower than the desired amount of outbound peers, + // query `PeerStore` and try to get a new outbound candidated. + if self.num_out < self.max_out && !self.reserved_only { + let ignore: HashSet = self + .peers + .iter() + .filter_map(|(peer, state)| { + (!std::matches!(state, PeerState::Disconnected)).then_some(*peer) + }) + .collect(); + + let peers: Vec<_> = + self.peerstore_handle.outgoing_candidates(self.max_out - self.num_out, ignore); + + if peers.len() > 0 { + peers.iter().for_each(|peer| { + self.peers.insert( + *peer, + PeerState::Opening { direction: Direction::Outbound(Reserved::No) }, + ); + }); + + self.num_out += peers.len(); + connect_to.extend(peers); + } + } + + // start timer for the next allocation and if there were peers which the `Peerset` + // wasn't connected but should be, send command to litep2p to start opening substreams. + self.next_slot_allocation = Delay::new(SLOT_ALLOCATION_FREQUENCY); + + if !connect_to.is_empty() { + log::trace!( + target: LOG_TARGET, + "{}: start connecting to peers {connect_to:?}", + self.protocol, + ); + + return Poll::Ready(Some(PeersetNotificationCommand::OpenSubstream { + peers: connect_to, + })) + } + } + + Poll::Pending + } +} diff --git a/substrate/client/network/src/litep2p/shim/notification/tests/fuzz.rs b/substrate/client/network/src/litep2p/shim/notification/tests/fuzz.rs new file mode 100644 index 0000000000000000000000000000000000000000..d0970e89cf3457f601269ff41583c6090f5043a4 --- /dev/null +++ b/substrate/client/network/src/litep2p/shim/notification/tests/fuzz.rs @@ -0,0 +1,384 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +//! Fuzz test emulates network events and peer connection handling by `Peerset` +//! and `PeerStore` to discover possible inconsistencies in peer management. + +use crate::{ + litep2p::{ + peerstore::Peerstore, + shim::notification::peerset::{ + OpenResult, Peerset, PeersetCommand, PeersetNotificationCommand, + }, + }, + service::traits::{Direction, PeerStore, ValidationResult}, + ProtocolName, +}; + +use futures::{FutureExt, StreamExt}; +use litep2p::protocol::notification::NotificationError; +use rand::{ + distributions::{Distribution, Uniform, WeightedIndex}, + seq::IteratorRandom, +}; + +use sc_network_common::types::ReputationChange; +use sc_network_types::PeerId; + +use std::{ + collections::{HashMap, HashSet}, + sync::Arc, +}; + +#[tokio::test] +#[cfg(debug_assertions)] +async fn run() { + sp_tracing::try_init_simple(); + + for _ in 0..50 { + test_once().await; + } +} + +#[cfg(debug_assertions)] +async fn test_once() { + // PRNG to use. + let mut rng = rand::thread_rng(); + + // peers that the peerset knows about. + let mut known_peers = HashSet::::new(); + + // peers that we have reserved. Always a subset of `known_peers`. + let mut reserved_peers = HashSet::::new(); + + // reserved only mode + let mut reserved_only = Uniform::new_inclusive(0, 10).sample(&mut rng) == 0; + + // Bootnodes for `PeerStore` initialization. + let bootnodes = (0..Uniform::new_inclusive(0, 4).sample(&mut rng)) + .map(|_| { + let id = PeerId::random(); + known_peers.insert(id); + id + }) + .collect(); + + let peerstore = Peerstore::new(bootnodes); + let peer_store_handle = peerstore.handle(); + + let (mut peerset, to_peerset) = Peerset::new( + ProtocolName::from("/notif/1"), + Uniform::new_inclusive(0, 25).sample(&mut rng), + Uniform::new_inclusive(0, 25).sample(&mut rng), + reserved_only, + (0..Uniform::new_inclusive(0, 2).sample(&mut rng)) + .map(|_| { + let id = PeerId::random(); + known_peers.insert(id); + reserved_peers.insert(id); + id + }) + .collect(), + Default::default(), + Arc::clone(&peer_store_handle), + ); + + tokio::spawn(peerstore.run()); + + // opening substreams + let mut opening = HashMap::::new(); + + // open substreams + let mut open = HashMap::::new(); + + // closing substreams + let mut closing = HashSet::::new(); + + // closed substreams + let mut closed = HashSet::::new(); + + // perform a certain number of actions while checking that the state is consistent. + // + // if we reach the end of the loop, the run has succeeded + let _ = tokio::task::spawn_blocking(move || { + // PRNG to use in `spawn_blocking` context. + let mut rng = rand::thread_rng(); + + for _ in 0..2500 { + // each of these weights corresponds to an action that we may perform + let action_weights = + [300, 110, 110, 110, 110, 90, 70, 30, 110, 110, 110, 110, 20, 110, 50, 110]; + + match WeightedIndex::new(&action_weights).unwrap().sample(&mut rng) { + 0 => match peerset.next().now_or_never() { + // open substreams to `peers` + Some(Some(PeersetNotificationCommand::OpenSubstream { peers })) => + for peer in peers { + opening.insert(peer, Direction::Outbound); + closed.remove(&peer); + + assert!(!closing.contains(&peer)); + assert!(!open.contains_key(&peer)); + }, + // close substreams to `peers` + Some(Some(PeersetNotificationCommand::CloseSubstream { peers })) => + for peer in peers { + assert!(closing.insert(peer)); + assert!(open.remove(&peer).is_some()); + assert!(!opening.contains_key(&peer)); + }, + Some(None) => panic!("peerset exited"), + None => {}, + }, + // get inbound connection from an unknown peer + 1 => { + let new_peer = PeerId::random(); + peer_store_handle.add_known_peer(new_peer); + + match peerset.report_inbound_substream(new_peer) { + ValidationResult::Accept => { + opening.insert(new_peer, Direction::Inbound); + }, + ValidationResult::Reject => {}, + } + }, + // substream opened successfully + // + // remove peer from `opening` (which contains its direction), report the open + // substream to `Peerset` and move peer state to `open`. + // + // if the substream was canceled while it was opening, move peer to `closing` + 2 => + if let Some(peer) = opening.keys().choose(&mut rng).copied() { + let direction = opening.remove(&peer).unwrap(); + match peerset.report_substream_opened(peer, direction) { + OpenResult::Accept { .. } => { + assert!(open.insert(peer, direction).is_none()); + }, + OpenResult::Reject => { + assert!(closing.insert(peer)); + }, + } + }, + // substream failed to open + 3 => + if let Some(peer) = opening.keys().choose(&mut rng).copied() { + let _ = opening.remove(&peer).unwrap(); + peerset.report_substream_open_failure(peer, NotificationError::Rejected); + }, + // substream was closed by remote peer + 4 => + if let Some(peer) = open.keys().choose(&mut rng).copied() { + let _ = open.remove(&peer).unwrap(); + peerset.report_substream_closed(peer); + assert!(closed.insert(peer)); + }, + // substream was closed by local node + 5 => + if let Some(peer) = closing.iter().choose(&mut rng).copied() { + assert!(closing.remove(&peer)); + assert!(closed.insert(peer)); + peerset.report_substream_closed(peer); + }, + // random connected peer was disconnected by the protocol + 6 => + if let Some(peer) = open.keys().choose(&mut rng).copied() { + to_peerset.unbounded_send(PeersetCommand::DisconnectPeer { peer }).unwrap(); + }, + // ban random peer + 7 => + if let Some(peer) = known_peers.iter().choose(&mut rng).copied() { + peer_store_handle.report_peer(peer, ReputationChange::new_fatal("")); + }, + // inbound substream is received for a peer that was considered + // outbound + 8 => { + let outbound_peers = opening + .iter() + .filter_map(|(peer, direction)| { + std::matches!(direction, Direction::Outbound).then_some(*peer) + }) + .collect::>(); + + if let Some(peer) = outbound_peers.iter().choose(&mut rng).copied() { + match peerset.report_inbound_substream(peer) { + ValidationResult::Accept => { + opening.insert(peer, Direction::Inbound); + }, + ValidationResult::Reject => {}, + } + } + }, + // set reserved peers + // + // choose peers from all available sets (open, opening, closing, closed) + some new + // peers + 9 => { + let num_open = Uniform::new_inclusive(0, open.len()).sample(&mut rng); + let num_opening = Uniform::new_inclusive(0, opening.len()).sample(&mut rng); + let num_closing = Uniform::new_inclusive(0, closing.len()).sample(&mut rng); + let num_closed = Uniform::new_inclusive(0, closed.len()).sample(&mut rng); + + let peers = open + .keys() + .copied() + .choose_multiple(&mut rng, num_open) + .into_iter() + .chain( + opening + .keys() + .copied() + .choose_multiple(&mut rng, num_opening) + .into_iter(), + ) + .chain( + closing + .iter() + .copied() + .choose_multiple(&mut rng, num_closing) + .into_iter(), + ) + .chain( + closed + .iter() + .copied() + .choose_multiple(&mut rng, num_closed) + .into_iter(), + ) + .chain((0..5).map(|_| { + let peer = PeerId::random(); + known_peers.insert(peer); + peer_store_handle.add_known_peer(peer); + peer + })) + .filter(|peer| !reserved_peers.contains(peer)) + .collect::>(); + + reserved_peers.extend(peers.clone().into_iter()); + to_peerset.unbounded_send(PeersetCommand::SetReservedPeers { peers }).unwrap(); + }, + // add reserved peers + 10 => { + let num_open = Uniform::new_inclusive(0, open.len()).sample(&mut rng); + let num_opening = Uniform::new_inclusive(0, opening.len()).sample(&mut rng); + let num_closing = Uniform::new_inclusive(0, closing.len()).sample(&mut rng); + let num_closed = Uniform::new_inclusive(0, closed.len()).sample(&mut rng); + + let peers = open + .keys() + .copied() + .choose_multiple(&mut rng, num_open) + .into_iter() + .chain( + opening + .keys() + .copied() + .choose_multiple(&mut rng, num_opening) + .into_iter(), + ) + .chain( + closing + .iter() + .copied() + .choose_multiple(&mut rng, num_closing) + .into_iter(), + ) + .chain( + closed + .iter() + .copied() + .choose_multiple(&mut rng, num_closed) + .into_iter(), + ) + .chain((0..5).map(|_| { + let peer = PeerId::random(); + known_peers.insert(peer); + peer_store_handle.add_known_peer(peer); + peer + })) + .filter(|peer| !reserved_peers.contains(peer)) + .collect::>(); + + reserved_peers.extend(peers.clone().into_iter()); + to_peerset.unbounded_send(PeersetCommand::AddReservedPeers { peers }).unwrap(); + }, + // remove reserved peers + 11 => { + let num_to_remove = + Uniform::new_inclusive(0, reserved_peers.len()).sample(&mut rng); + let peers = reserved_peers + .iter() + .copied() + .choose_multiple(&mut rng, num_to_remove) + .into_iter() + .collect::>(); + + peers.iter().for_each(|peer| { + assert!(reserved_peers.remove(peer)); + }); + + to_peerset + .unbounded_send(PeersetCommand::RemoveReservedPeers { peers }) + .unwrap(); + }, + // set reserved only + 12 => { + reserved_only = !reserved_only; + + let _ = to_peerset + .unbounded_send(PeersetCommand::SetReservedOnly { reserved_only }); + }, + // + // discover a new node. + 13 => { + let new_peer = PeerId::random(); + known_peers.insert(new_peer); + peer_store_handle.add_known_peer(new_peer); + }, + // protocol rejected a substream that was accepted by `Peerset` + 14 => { + let inbound_peers = opening + .iter() + .filter_map(|(peer, direction)| { + std::matches!(direction, Direction::Inbound).then_some(*peer) + }) + .collect::>(); + + if let Some(peer) = inbound_peers.iter().choose(&mut rng).copied() { + peerset.report_substream_rejected(peer); + opening.remove(&peer); + } + }, + // inbound substream received for a peer in `closed` + 15 => + if let Some(peer) = closed.iter().choose(&mut rng).copied() { + match peerset.report_inbound_substream(peer) { + ValidationResult::Accept => { + assert!(closed.remove(&peer)); + opening.insert(peer, Direction::Inbound); + }, + ValidationResult::Reject => {}, + } + }, + _ => unreachable!(), + } + } + }) + .await + .unwrap(); +} diff --git a/substrate/client/network/src/litep2p/shim/notification/tests/mod.rs b/substrate/client/network/src/litep2p/shim/notification/tests/mod.rs new file mode 100644 index 0000000000000000000000000000000000000000..a303862e7c7b48ec09a1dc846662654bd85bb3ae --- /dev/null +++ b/substrate/client/network/src/litep2p/shim/notification/tests/mod.rs @@ -0,0 +1,22 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +#[cfg(test)] +mod fuzz; +#[cfg(test)] +mod peerset; diff --git a/substrate/client/network/src/litep2p/shim/notification/tests/peerset.rs b/substrate/client/network/src/litep2p/shim/notification/tests/peerset.rs new file mode 100644 index 0000000000000000000000000000000000000000..4f7bfffaa1fc6cdf677188449dd67e97695ff614 --- /dev/null +++ b/substrate/client/network/src/litep2p/shim/notification/tests/peerset.rs @@ -0,0 +1,891 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +use crate::{ + litep2p::{ + peerstore::peerstore_handle_test, + shim::notification::peerset::{ + Direction, OpenResult, PeerState, Peerset, PeersetCommand, PeersetNotificationCommand, + Reserved, + }, + }, + service::traits::{self, ValidationResult}, + ProtocolName, +}; + +use futures::prelude::*; +use litep2p::protocol::notification::NotificationError; + +use sc_network_types::PeerId; + +use std::{ + collections::HashSet, + sync::{atomic::Ordering, Arc}, + task::Poll, +}; + +// outbound substream was initiated for a peer but an inbound substream from that same peer +// was receied while the `Peerset` was waiting for the outbound substream to be opened +// +// verify that the peer state is updated correctly +#[tokio::test] +async fn inbound_substream_for_outbound_peer() { + let peerstore_handle = Arc::new(peerstore_handle_test()); + let peers = (0..3) + .map(|_| { + let peer = PeerId::random(); + peerstore_handle.add_known_peer(peer); + peer + }) + .collect::>(); + let inbound_peer = *peers.iter().next().unwrap(); + + let (mut peerset, _to_peerset) = Peerset::new( + ProtocolName::from("/notif/1"), + 25, + 25, + false, + Default::default(), + Default::default(), + peerstore_handle, + ); + assert_eq!(peerset.num_in(), 0usize); + assert_eq!(peerset.num_out(), 0usize); + + match peerset.next().await { + Some(PeersetNotificationCommand::OpenSubstream { peers: out_peers }) => { + assert_eq!(out_peers.len(), 3usize); + assert_eq!(peerset.num_in(), 0usize); + assert_eq!(peerset.num_out(), 3usize); + assert_eq!( + peerset.peers().get(&inbound_peer), + Some(&PeerState::Opening { direction: Direction::Outbound(Reserved::No) }) + ); + }, + event => panic!("invalid event: {event:?}"), + } + + // inbound substream was received from peer who was marked outbound + // + // verify that the peer state and inbound/outbound counts are updated correctly + assert_eq!(peerset.report_inbound_substream(inbound_peer), ValidationResult::Accept); + assert_eq!(peerset.num_in(), 0usize); + assert_eq!(peerset.num_out(), 3usize); + assert_eq!( + peerset.peers().get(&inbound_peer), + Some(&PeerState::Opening { direction: Direction::Outbound(Reserved::No) }) + ); +} + +// substream was opening to peer but then it was canceled and before the substream +// was fully closed, the peer got banned +#[tokio::test] +async fn canceled_peer_gets_banned() { + sp_tracing::try_init_simple(); + + let peerstore_handle = Arc::new(peerstore_handle_test()); + let peers = HashSet::from_iter([PeerId::random(), PeerId::random(), PeerId::random()]); + + let (mut peerset, to_peerset) = Peerset::new( + ProtocolName::from("/notif/1"), + 0, + 0, + true, + peers.clone(), + Default::default(), + peerstore_handle, + ); + assert_eq!(peerset.num_in(), 0usize); + assert_eq!(peerset.num_out(), 0usize); + + match peerset.next().await { + Some(PeersetNotificationCommand::OpenSubstream { peers: out_peers }) => { + assert_eq!(peerset.num_in(), 0usize); + assert_eq!(peerset.num_out(), 0usize); + + for outbound_peer in &out_peers { + assert!(peers.contains(outbound_peer)); + assert_eq!( + peerset.peers().get(&outbound_peer), + Some(&PeerState::Opening { direction: Direction::Outbound(Reserved::Yes) }) + ); + } + }, + event => panic!("invalid event: {event:?}"), + } + + // remove all reserved peers + to_peerset + .unbounded_send(PeersetCommand::RemoveReservedPeers { peers: peers.clone() }) + .unwrap(); + + match peerset.next().await { + Some(PeersetNotificationCommand::CloseSubstream { peers: out_peers }) => { + assert!(out_peers.is_empty()); + }, + event => panic!("invalid event: {event:?}"), + } + + // verify all reserved peers are canceled + for (_, state) in peerset.peers() { + assert_eq!(state, &PeerState::Canceled { direction: Direction::Outbound(Reserved::Yes) }); + } +} + +#[tokio::test] +async fn peer_added_and_removed_from_peerset() { + sp_tracing::try_init_simple(); + + let peerstore_handle = Arc::new(peerstore_handle_test()); + let (mut peerset, to_peerset) = Peerset::new( + ProtocolName::from("/notif/1"), + 0, + 0, + true, + Default::default(), + Default::default(), + peerstore_handle, + ); + assert_eq!(peerset.num_in(), 0usize); + assert_eq!(peerset.num_out(), 0usize); + + // add peers to reserved set + let peers = HashSet::from_iter([PeerId::random(), PeerId::random(), PeerId::random()]); + to_peerset + .unbounded_send(PeersetCommand::AddReservedPeers { peers: peers.clone() }) + .unwrap(); + + match peerset.next().await { + Some(PeersetNotificationCommand::OpenSubstream { peers: out_peers }) => { + assert_eq!(peerset.num_in(), 0usize); + assert_eq!(peerset.num_out(), 0usize); + + for outbound_peer in &out_peers { + assert!(peers.contains(outbound_peer)); + assert!(peerset.reserved_peers().contains(outbound_peer)); + assert_eq!( + peerset.peers().get(&outbound_peer), + Some(&PeerState::Opening { direction: Direction::Outbound(Reserved::Yes) }) + ); + } + }, + event => panic!("invalid event: {event:?}"), + } + + // report that all substreams were opened + for peer in &peers { + assert!(std::matches!( + peerset.report_substream_opened(*peer, traits::Direction::Outbound), + OpenResult::Accept { .. } + )); + assert_eq!( + peerset.peers().get(peer), + Some(&PeerState::Connected { direction: Direction::Outbound(Reserved::Yes) }) + ); + } + + // remove all reserved peers + to_peerset + .unbounded_send(PeersetCommand::RemoveReservedPeers { peers: peers.clone() }) + .unwrap(); + + match peerset.next().await { + Some(PeersetNotificationCommand::CloseSubstream { peers: out_peers }) => { + assert!(!out_peers.is_empty()); + + for peer in &out_peers { + assert!(peers.contains(peer)); + assert!(!peerset.reserved_peers().contains(peer)); + assert_eq!( + peerset.peers().get(peer), + Some(&PeerState::Closing { direction: Direction::Outbound(Reserved::Yes) }), + ); + } + }, + event => panic!("invalid event: {event:?}"), + } + + // add the peers again and verify that the command is ignored because the substreams are closing + to_peerset + .unbounded_send(PeersetCommand::AddReservedPeers { peers: peers.clone() }) + .unwrap(); + + match peerset.next().await { + Some(PeersetNotificationCommand::OpenSubstream { peers: out_peers }) => { + assert!(out_peers.is_empty()); + + for peer in &peers { + assert!(peerset.reserved_peers().contains(peer)); + assert_eq!( + peerset.peers().get(peer), + Some(&PeerState::Closing { direction: Direction::Outbound(Reserved::Yes) }), + ); + } + }, + event => panic!("invalid event: {event:?}"), + } + + // remove the peers again and verify the state remains as `Closing` + to_peerset + .unbounded_send(PeersetCommand::RemoveReservedPeers { peers: peers.clone() }) + .unwrap(); + + match peerset.next().await { + Some(PeersetNotificationCommand::CloseSubstream { peers: out_peers }) => { + assert!(out_peers.is_empty()); + + for peer in &peers { + assert!(!peerset.reserved_peers().contains(peer)); + assert_eq!( + peerset.peers().get(peer), + Some(&PeerState::Closing { direction: Direction::Outbound(Reserved::Yes) }), + ); + } + }, + event => panic!("invalid event: {event:?}"), + } +} + +#[tokio::test] +async fn set_reserved_peers() { + sp_tracing::try_init_simple(); + + let reserved = HashSet::from_iter([PeerId::random(), PeerId::random(), PeerId::random()]); + let (mut peerset, to_peerset) = Peerset::new( + ProtocolName::from("/notif/1"), + 25, + 25, + true, + reserved.clone(), + Default::default(), + Arc::new(peerstore_handle_test()), + ); + assert_eq!(peerset.num_in(), 0usize); + assert_eq!(peerset.num_out(), 0usize); + + match peerset.next().await { + Some(PeersetNotificationCommand::OpenSubstream { peers: out_peers }) => { + assert_eq!(peerset.num_in(), 0usize); + assert_eq!(peerset.num_out(), 0usize); + + for outbound_peer in &out_peers { + assert!(reserved.contains(outbound_peer)); + assert!(peerset.reserved_peers().contains(outbound_peer)); + assert_eq!( + peerset.peers().get(&outbound_peer), + Some(&PeerState::Opening { direction: Direction::Outbound(Reserved::Yes) }) + ); + } + }, + event => panic!("invalid event: {event:?}"), + } + + // report that all substreams were opened + for peer in &reserved { + assert!(std::matches!( + peerset.report_substream_opened(*peer, traits::Direction::Outbound), + OpenResult::Accept { .. } + )); + assert_eq!( + peerset.peers().get(peer), + Some(&PeerState::Connected { direction: Direction::Outbound(Reserved::Yes) }) + ); + } + + // add a totally new set of reserved peers + let new_reserved_peers = + HashSet::from_iter([PeerId::random(), PeerId::random(), PeerId::random()]); + to_peerset + .unbounded_send(PeersetCommand::SetReservedPeers { peers: new_reserved_peers.clone() }) + .unwrap(); + + match peerset.next().await { + Some(PeersetNotificationCommand::CloseSubstream { peers: out_peers }) => { + assert!(!out_peers.is_empty()); + assert_eq!(out_peers.len(), 3); + + for peer in &out_peers { + assert!(reserved.contains(peer)); + assert!(!peerset.reserved_peers().contains(peer)); + assert_eq!( + peerset.peers().get(peer), + Some(&PeerState::Closing { direction: Direction::Outbound(Reserved::Yes) }), + ); + } + + for peer in &new_reserved_peers { + assert!(peerset.reserved_peers().contains(peer)); + } + }, + event => panic!("invalid event: {event:?}"), + } + + match peerset.next().await { + Some(PeersetNotificationCommand::OpenSubstream { peers: out_peers }) => { + assert!(!out_peers.is_empty()); + assert_eq!(out_peers.len(), 3); + + for peer in &new_reserved_peers { + assert!(peerset.reserved_peers().contains(peer)); + assert_eq!( + peerset.peers().get(peer), + Some(&PeerState::Opening { direction: Direction::Outbound(Reserved::Yes) }), + ); + } + }, + event => panic!("invalid event: {event:?}"), + } +} + +#[tokio::test] +async fn set_reserved_peers_one_peer_already_in_the_set() { + sp_tracing::try_init_simple(); + + let reserved = HashSet::from_iter([PeerId::random(), PeerId::random(), PeerId::random()]); + let common_peer = *reserved.iter().next().unwrap(); + let (mut peerset, to_peerset) = Peerset::new( + ProtocolName::from("/notif/1"), + 25, + 25, + true, + reserved.clone(), + Default::default(), + Arc::new(peerstore_handle_test()), + ); + assert_eq!(peerset.num_in(), 0usize); + assert_eq!(peerset.num_out(), 0usize); + + match peerset.next().await { + Some(PeersetNotificationCommand::OpenSubstream { peers: out_peers }) => { + assert_eq!(peerset.num_in(), 0usize); + assert_eq!(peerset.num_out(), 0usize); + + for outbound_peer in &out_peers { + assert!(reserved.contains(outbound_peer)); + assert!(peerset.reserved_peers().contains(outbound_peer)); + assert_eq!( + peerset.peers().get(&outbound_peer), + Some(&PeerState::Opening { direction: Direction::Outbound(Reserved::Yes) }) + ); + } + }, + event => panic!("invalid event: {event:?}"), + } + + // report that all substreams were opened + for peer in &reserved { + assert!(std::matches!( + peerset.report_substream_opened(*peer, traits::Direction::Outbound), + OpenResult::Accept { .. } + )); + assert_eq!( + peerset.peers().get(peer), + Some(&PeerState::Connected { direction: Direction::Outbound(Reserved::Yes) }) + ); + } + + // add a new set of reserved peers with one peer from the original set + let new_reserved_peers = HashSet::from_iter([PeerId::random(), PeerId::random(), common_peer]); + to_peerset + .unbounded_send(PeersetCommand::SetReservedPeers { peers: new_reserved_peers.clone() }) + .unwrap(); + + match peerset.next().await { + Some(PeersetNotificationCommand::CloseSubstream { peers: out_peers }) => { + assert_eq!(out_peers.len(), 2); + + for peer in &out_peers { + assert!(reserved.contains(peer)); + + if peer != &common_peer { + assert!(!peerset.reserved_peers().contains(peer)); + assert_eq!( + peerset.peers().get(peer), + Some(&PeerState::Closing { direction: Direction::Outbound(Reserved::Yes) }), + ); + } else { + panic!("common peer disconnected"); + } + } + + for peer in &new_reserved_peers { + assert!(peerset.reserved_peers().contains(peer)); + } + }, + event => panic!("invalid event: {event:?}"), + } + + // verify the `common_peer` peer between the reserved sets is still in the state `Open` + assert_eq!( + peerset.peers().get(&common_peer), + Some(&PeerState::Connected { direction: Direction::Outbound(Reserved::Yes) }) + ); + + match peerset.next().await { + Some(PeersetNotificationCommand::OpenSubstream { peers: out_peers }) => { + assert!(!out_peers.is_empty()); + assert_eq!(out_peers.len(), 2); + + for peer in &new_reserved_peers { + assert!(peerset.reserved_peers().contains(peer)); + + if peer != &common_peer { + assert_eq!( + peerset.peers().get(peer), + Some(&PeerState::Opening { direction: Direction::Outbound(Reserved::Yes) }), + ); + } + } + }, + event => panic!("invalid event: {event:?}"), + } +} + +#[tokio::test] +async fn add_reserved_peers_one_peer_already_in_the_set() { + sp_tracing::try_init_simple(); + + let peerstore_handle = Arc::new(peerstore_handle_test()); + let reserved = (0..3) + .map(|_| { + let peer = PeerId::random(); + peerstore_handle.add_known_peer(peer); + peer + }) + .collect::>(); + let common_peer = *reserved.iter().next().unwrap(); + let (mut peerset, to_peerset) = Peerset::new( + ProtocolName::from("/notif/1"), + 25, + 25, + true, + reserved.iter().cloned().collect(), + Default::default(), + peerstore_handle, + ); + assert_eq!(peerset.num_in(), 0usize); + assert_eq!(peerset.num_out(), 0usize); + + match peerset.next().await { + Some(PeersetNotificationCommand::OpenSubstream { peers: out_peers }) => { + assert_eq!(peerset.num_in(), 0usize); + assert_eq!(peerset.num_out(), 0usize); + assert_eq!(out_peers.len(), 3); + + for outbound_peer in &out_peers { + assert!(reserved.contains(outbound_peer)); + assert!(peerset.reserved_peers().contains(outbound_peer)); + assert_eq!( + peerset.peers().get(&outbound_peer), + Some(&PeerState::Opening { direction: Direction::Outbound(Reserved::Yes) }) + ); + } + }, + event => panic!("invalid event: {event:?}"), + } + + // report that all substreams were opened + for peer in &reserved { + assert!(std::matches!( + peerset.report_substream_opened(*peer, traits::Direction::Outbound), + OpenResult::Accept { .. } + )); + assert_eq!( + peerset.peers().get(peer), + Some(&PeerState::Connected { direction: Direction::Outbound(Reserved::Yes) }) + ); + } + + // add a new set of reserved peers with one peer from the original set + let new_reserved_peers = HashSet::from_iter([PeerId::random(), PeerId::random(), common_peer]); + to_peerset + .unbounded_send(PeersetCommand::AddReservedPeers { peers: new_reserved_peers.clone() }) + .unwrap(); + + match peerset.next().await { + Some(PeersetNotificationCommand::OpenSubstream { peers: out_peers }) => { + assert_eq!(out_peers.len(), 2); + assert!(!out_peers.iter().any(|peer| peer == &common_peer)); + + for peer in &out_peers { + assert!(!reserved.contains(peer)); + + if peer != &common_peer { + assert!(peerset.reserved_peers().contains(peer)); + assert_eq!( + peerset.peers().get(peer), + Some(&PeerState::Opening { direction: Direction::Outbound(Reserved::Yes) }), + ); + } + } + }, + event => panic!("invalid event: {event:?}"), + } + + // verify the `common_peer` peer between the reserved sets is still in the state `Open` + assert_eq!( + peerset.peers().get(&common_peer), + Some(&PeerState::Connected { direction: Direction::Outbound(Reserved::Yes) }) + ); +} + +#[tokio::test] +async fn opening_peer_gets_canceled_and_disconnected() { + sp_tracing::try_init_simple(); + + let peerstore_handle = Arc::new(peerstore_handle_test()); + let _known_peers = (0..1) + .map(|_| { + let peer = PeerId::random(); + peerstore_handle.add_known_peer(peer); + peer + }) + .collect::>(); + let num_connected = Arc::new(Default::default()); + let (mut peerset, to_peerset) = Peerset::new( + ProtocolName::from("/notif/1"), + 25, + 25, + false, + Default::default(), + Arc::clone(&num_connected), + peerstore_handle, + ); + assert_eq!(peerset.num_in(), 0); + assert_eq!(peerset.num_out(), 0); + + let peer = match peerset.next().await { + Some(PeersetNotificationCommand::OpenSubstream { peers: out_peers }) => { + assert_eq!(peerset.num_in(), 0); + assert_eq!(peerset.num_out(), 1); + assert_eq!(out_peers.len(), 1); + + for peer in &out_peers { + assert_eq!( + peerset.peers().get(&peer), + Some(&PeerState::Opening { direction: Direction::Outbound(Reserved::No) }) + ); + } + + out_peers[0] + }, + event => panic!("invalid event: {event:?}"), + }; + + // disconnect the now-opening peer + to_peerset.unbounded_send(PeersetCommand::DisconnectPeer { peer }).unwrap(); + + // poll `Peerset` to register the command and verify the peer is now in state `Canceled` + futures::future::poll_fn(|cx| match peerset.poll_next_unpin(cx) { + Poll::Pending => Poll::Ready(()), + _ => panic!("unexpected event"), + }) + .await; + + assert_eq!( + peerset.peers().get(&peer), + Some(&PeerState::Canceled { direction: Direction::Outbound(Reserved::No) }) + ); + assert_eq!(peerset.num_out(), 1); + + // report to `Peerset` that the substream was opened, verify that it gets closed + assert!(std::matches!( + peerset.report_substream_opened(peer, traits::Direction::Outbound), + OpenResult::Reject { .. } + )); + assert_eq!( + peerset.peers().get(&peer), + Some(&PeerState::Closing { direction: Direction::Outbound(Reserved::No) }) + ); + assert_eq!(num_connected.load(Ordering::SeqCst), 1); + assert_eq!(peerset.num_out(), 1); + + // report close event to `Peerset` and verify state + peerset.report_substream_closed(peer); + assert_eq!(peerset.num_out(), 0); + assert_eq!(num_connected.load(Ordering::SeqCst), 0); + assert_eq!(peerset.peers().get(&peer), Some(&PeerState::Backoff)); +} + +#[tokio::test] +async fn open_failure_for_canceled_peer() { + sp_tracing::try_init_simple(); + + let peerstore_handle = Arc::new(peerstore_handle_test()); + let _known_peers = (0..1) + .map(|_| { + let peer = PeerId::random(); + peerstore_handle.add_known_peer(peer); + peer + }) + .collect::>(); + let (mut peerset, to_peerset) = Peerset::new( + ProtocolName::from("/notif/1"), + 25, + 25, + false, + Default::default(), + Default::default(), + peerstore_handle, + ); + assert_eq!(peerset.num_in(), 0usize); + assert_eq!(peerset.num_out(), 0usize); + + let peer = match peerset.next().await { + Some(PeersetNotificationCommand::OpenSubstream { peers: out_peers }) => { + assert_eq!(peerset.num_in(), 0usize); + assert_eq!(peerset.num_out(), 1usize); + assert_eq!(out_peers.len(), 1); + + for peer in &out_peers { + assert_eq!( + peerset.peers().get(&peer), + Some(&PeerState::Opening { direction: Direction::Outbound(Reserved::No) }) + ); + } + + out_peers[0] + }, + event => panic!("invalid event: {event:?}"), + }; + + // disconnect the now-opening peer + to_peerset.unbounded_send(PeersetCommand::DisconnectPeer { peer }).unwrap(); + + // poll `Peerset` to register the command and verify the peer is now in state `Canceled` + futures::future::poll_fn(|cx| match peerset.poll_next_unpin(cx) { + Poll::Pending => Poll::Ready(()), + _ => panic!("unexpected event"), + }) + .await; + + assert_eq!( + peerset.peers().get(&peer), + Some(&PeerState::Canceled { direction: Direction::Outbound(Reserved::No) }) + ); + + // the substream failed to open, verify that peer state is now `Backoff` + // and that `Peerset` doesn't emit any events + peerset.report_substream_open_failure(peer, NotificationError::NoConnection); + assert_eq!(peerset.peers().get(&peer), Some(&PeerState::Backoff)); + + futures::future::poll_fn(|cx| match peerset.poll_next_unpin(cx) { + Poll::Pending => Poll::Ready(()), + _ => panic!("unexpected event"), + }) + .await; +} + +#[tokio::test] +async fn peer_disconnected_when_being_validated_then_rejected() { + sp_tracing::try_init_simple(); + + let peerstore_handle = Arc::new(peerstore_handle_test()); + let (mut peerset, _to_peerset) = Peerset::new( + ProtocolName::from("/notif/1"), + 25, + 25, + false, + Default::default(), + Default::default(), + peerstore_handle, + ); + assert_eq!(peerset.num_in(), 0usize); + assert_eq!(peerset.num_out(), 0usize); + + // inbound substream received + let peer = PeerId::random(); + assert_eq!(peerset.report_inbound_substream(peer), ValidationResult::Accept); + + // substream failed to open while it was being validated by the protocol + peerset.report_substream_open_failure(peer, NotificationError::NoConnection); + assert_eq!(peerset.peers().get(&peer), Some(&PeerState::Backoff)); + + // protocol rejected substream, verify + peerset.report_substream_rejected(peer); + assert_eq!(peerset.peers().get(&peer), Some(&PeerState::Backoff)); +} + +#[tokio::test] +async fn removed_reserved_peer_kept_due_to_free_slots() { + sp_tracing::try_init_simple(); + + let peerstore_handle = Arc::new(peerstore_handle_test()); + let peers = HashSet::from_iter([PeerId::random(), PeerId::random(), PeerId::random()]); + + let (mut peerset, to_peerset) = Peerset::new( + ProtocolName::from("/notif/1"), + 25, + 25, + true, + peers.clone(), + Default::default(), + peerstore_handle, + ); + assert_eq!(peerset.num_in(), 0usize); + assert_eq!(peerset.num_out(), 0usize); + + match peerset.next().await { + Some(PeersetNotificationCommand::OpenSubstream { peers: out_peers }) => { + assert_eq!(peerset.num_in(), 0usize); + assert_eq!(peerset.num_out(), 0usize); + + for outbound_peer in &out_peers { + assert!(peers.contains(outbound_peer)); + assert_eq!( + peerset.peers().get(&outbound_peer), + Some(&PeerState::Opening { direction: Direction::Outbound(Reserved::Yes) }) + ); + } + }, + event => panic!("invalid event: {event:?}"), + } + + // remove all reserved peers + to_peerset + .unbounded_send(PeersetCommand::RemoveReservedPeers { peers: peers.clone() }) + .unwrap(); + + match peerset.next().await { + Some(PeersetNotificationCommand::CloseSubstream { peers: out_peers }) => { + assert!(out_peers.is_empty()); + }, + event => panic!("invalid event: {event:?}"), + } + + // verify all reserved peers are canceled + for (_, state) in peerset.peers() { + assert_eq!(state, &PeerState::Opening { direction: Direction::Outbound(Reserved::No) }); + } + + assert_eq!(peerset.num_in(), 0usize); + assert_eq!(peerset.num_out(), 3usize); +} + +#[tokio::test] +async fn set_reserved_peers_but_available_slots() { + sp_tracing::try_init_simple(); + + let peerstore_handle = Arc::new(peerstore_handle_test()); + let known_peers = (0..3) + .map(|_| { + let peer = PeerId::random(); + peerstore_handle.add_known_peer(peer); + peer + }) + .collect::>(); + + // one peer is common across operations meaning an outbound substream will be opened to them + // when `Peerset` is polled (along with two random peers) and later on `SetReservedPeers` + // is called with the common peer and with two new random peers + let common_peer = *known_peers.iter().next().unwrap(); + let disconnected_peers = known_peers.iter().skip(1).copied().collect::>(); + assert_eq!(disconnected_peers.len(), 2); + + let (mut peerset, to_peerset) = Peerset::new( + ProtocolName::from("/notif/1"), + 25, + 25, + false, + Default::default(), + Default::default(), + peerstore_handle, + ); + assert_eq!(peerset.num_in(), 0usize); + assert_eq!(peerset.num_out(), 0usize); + + match peerset.next().await { + Some(PeersetNotificationCommand::OpenSubstream { peers: out_peers }) => { + assert_eq!(out_peers.len(), 3); + + for peer in &out_peers { + assert_eq!( + peerset.peers().get(&peer), + Some(&PeerState::Opening { direction: Direction::Outbound(Reserved::No) }) + ); + } + }, + event => panic!("invalid event: {event:?}"), + } + + // verify all three peers are counted as outbound peers + assert_eq!(peerset.num_in(), 0usize); + assert_eq!(peerset.num_out(), 3usize); + + // report that all substreams were opened + for peer in &known_peers { + assert!(std::matches!( + peerset.report_substream_opened(*peer, traits::Direction::Outbound), + OpenResult::Accept { .. } + )); + assert_eq!( + peerset.peers().get(peer), + Some(&PeerState::Connected { direction: Direction::Outbound(Reserved::No) }) + ); + } + + // set reserved peers with `common_peer` being one of them + let reserved_peers = HashSet::from_iter([common_peer, PeerId::random(), PeerId::random()]); + to_peerset + .unbounded_send(PeersetCommand::SetReservedPeers { peers: reserved_peers.clone() }) + .unwrap(); + + match peerset.next().await { + Some(PeersetNotificationCommand::CloseSubstream { peers: out_peers }) => { + assert_eq!(out_peers.len(), 2); + + for peer in &out_peers { + assert!(disconnected_peers.contains(peer)); + assert_eq!( + peerset.peers().get(peer), + Some(&PeerState::Closing { direction: Direction::Outbound(Reserved::No) }), + ); + } + }, + event => panic!("invalid event: {event:?}"), + } + + // verify that `Peerset` is aware of five peers, with two of them as outbound + // (the two disconnected peers) + assert_eq!(peerset.peers().len(), 5); + assert_eq!(peerset.num_in(), 0usize); + assert_eq!(peerset.num_out(), 2usize); + + match peerset.next().await { + Some(PeersetNotificationCommand::OpenSubstream { peers }) => { + assert_eq!(peers.len(), 2); + assert!(!peers.contains(&common_peer)); + + for peer in &peers { + assert!(reserved_peers.contains(peer)); + assert!(peerset.reserved_peers().contains(peer)); + assert_eq!( + peerset.peers().get(peer), + Some(&PeerState::Opening { direction: Direction::Outbound(Reserved::Yes) }), + ); + } + }, + event => panic!("invalid event: {event:?}"), + } + + assert_eq!(peerset.peers().len(), 5); + assert_eq!(peerset.num_in(), 0usize); + + // two substreams are closing still closing + assert_eq!(peerset.num_out(), 2usize); +} diff --git a/substrate/client/network/src/litep2p/shim/request_response/metrics.rs b/substrate/client/network/src/litep2p/shim/request_response/metrics.rs new file mode 100644 index 0000000000000000000000000000000000000000..b04b6ed92de48e312fcbb02268a4dcafc199b32d --- /dev/null +++ b/substrate/client/network/src/litep2p/shim/request_response/metrics.rs @@ -0,0 +1,78 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +//! Metrics for [`RequestResponseProtocol`](super::RequestResponseProtocol). + +use crate::{service::metrics::Metrics, types::ProtocolName}; + +use std::time::Duration; + +/// Request-response metrics. +pub struct RequestResponseMetrics { + /// Metrics. + metrics: Option, + + /// Protocol name. + protocol: ProtocolName, +} + +impl RequestResponseMetrics { + pub fn new(metrics: Option, protocol: ProtocolName) -> Self { + Self { metrics, protocol } + } + + /// Register inbound request failure to Prometheus + pub fn register_inbound_request_failure(&self, reason: &str) { + if let Some(metrics) = &self.metrics { + metrics + .requests_in_failure_total + .with_label_values(&[&self.protocol, reason]) + .inc(); + } + } + + /// Register inbound request success to Prometheus + pub fn register_inbound_request_success(&self, serve_time: Duration) { + if let Some(metrics) = &self.metrics { + metrics + .requests_in_success_total + .with_label_values(&[&self.protocol]) + .observe(serve_time.as_secs_f64()); + } + } + + /// Register inbound request failure to Prometheus + pub fn register_outbound_request_failure(&self, reason: &str) { + if let Some(metrics) = &self.metrics { + metrics + .requests_out_failure_total + .with_label_values(&[&self.protocol, reason]) + .inc(); + } + } + + /// Register inbound request success to Prometheus + pub fn register_outbound_request_success(&self, duration: Duration) { + if let Some(metrics) = &self.metrics { + metrics + .requests_out_success_total + .with_label_values(&[&self.protocol]) + .observe(duration.as_secs_f64()); + } + } +} diff --git a/substrate/client/network/src/litep2p/shim/request_response/mod.rs b/substrate/client/network/src/litep2p/shim/request_response/mod.rs new file mode 100644 index 0000000000000000000000000000000000000000..82d01c01236f215a5123c34128f9b550e7abd4e9 --- /dev/null +++ b/substrate/client/network/src/litep2p/shim/request_response/mod.rs @@ -0,0 +1,529 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +//! Shim for litep2p's request-response implementation to make it work with `sc_network`'s +//! request-response API. + +use crate::{ + litep2p::shim::request_response::metrics::RequestResponseMetrics, + peer_store::PeerStoreProvider, + request_responses::{IncomingRequest, OutgoingResponse}, + service::{metrics::Metrics, traits::RequestResponseConfig as RequestResponseConfigT}, + IfDisconnected, ProtocolName, RequestFailure, +}; + +use futures::{channel::oneshot, future::BoxFuture, stream::FuturesUnordered, StreamExt}; +use litep2p::{ + protocol::request_response::{ + DialOptions, RequestResponseError, RequestResponseEvent, RequestResponseHandle, + }, + types::RequestId, +}; + +use sc_network_types::PeerId; +use sc_utils::mpsc::{TracingUnboundedReceiver, TracingUnboundedSender}; + +use std::{ + collections::HashMap, + sync::Arc, + time::{Duration, Instant}, +}; + +mod metrics; + +#[cfg(test)] +mod tests; + +/// Logging target for the file. +const LOG_TARGET: &str = "sub-libp2p::request-response"; + +/// Type containing information related to an outbound request. +#[derive(Debug)] +pub struct OutboundRequest { + /// Peer ID. + peer: PeerId, + + /// Request. + request: Vec, + + /// Fallback request, if provided. + fallback_request: Option<(Vec, ProtocolName)>, + + /// `oneshot::Sender` for sending the received response, or failure. + sender: oneshot::Sender, ProtocolName), RequestFailure>>, + + /// What should the node do if `peer` is disconnected. + dial_behavior: IfDisconnected, +} + +impl OutboundRequest { + /// Create new [`OutboundRequest`]. + pub fn new( + peer: PeerId, + request: Vec, + sender: oneshot::Sender, ProtocolName), RequestFailure>>, + fallback_request: Option<(Vec, ProtocolName)>, + dial_behavior: IfDisconnected, + ) -> Self { + OutboundRequest { peer, request, sender, fallback_request, dial_behavior } + } +} + +/// Pending request. +struct PendingRequest { + tx: oneshot::Sender, ProtocolName), RequestFailure>>, + started: Instant, + fallback_request: Option<(Vec, ProtocolName)>, +} + +impl PendingRequest { + /// Create new [`PendingRequest`]. + fn new( + tx: oneshot::Sender, ProtocolName), RequestFailure>>, + started: Instant, + fallback_request: Option<(Vec, ProtocolName)>, + ) -> Self { + Self { tx, started, fallback_request } + } +} + +/// Request-response protocol configuration. +/// +/// See [`RequestResponseConfiguration`](crate::request_response::ProtocolConfig) for more details. +#[derive(Debug)] +pub struct RequestResponseConfig { + /// Name of the protocol on the wire. Should be something like `/foo/bar`. + pub protocol_name: ProtocolName, + + /// Fallback on the wire protocol names to support. + pub fallback_names: Vec, + + /// Maximum allowed size, in bytes, of a request. + pub max_request_size: u64, + + /// Maximum allowed size, in bytes, of a response. + pub max_response_size: u64, + + /// Duration after which emitted requests are considered timed out. + pub request_timeout: Duration, + + /// Channel on which the networking service will send incoming requests. + pub inbound_queue: Option>, +} + +impl RequestResponseConfig { + /// Create new [`RequestResponseConfig`]. + pub(crate) fn new( + protocol_name: ProtocolName, + fallback_names: Vec, + max_request_size: u64, + max_response_size: u64, + request_timeout: Duration, + inbound_queue: Option>, + ) -> Self { + Self { + protocol_name, + fallback_names, + max_request_size, + max_response_size, + request_timeout, + inbound_queue, + } + } +} + +impl RequestResponseConfigT for RequestResponseConfig { + fn protocol_name(&self) -> &ProtocolName { + &self.protocol_name + } +} + +/// Request-response protocol. +/// +/// This is slightly different from the `RequestResponsesBehaviour` in that it is protocol-specific, +/// meaning there is an instance of `RequestResponseProtocol` for each installed request-response +/// protocol and that instance deals only with the requests and responses of that protocol, nothing +/// else. It also differs from the other implementation by combining both inbound and outbound +/// requests under one instance so all request-response-related behavior of any given protocol is +/// handled through one instance of `RequestResponseProtocol`. +pub struct RequestResponseProtocol { + /// Protocol name. + protocol: ProtocolName, + + /// Handle to request-response protocol. + handle: RequestResponseHandle, + + /// Inbound queue for sending received requests to protocol implementation in Polkadot SDK. + inbound_queue: Option>, + + /// Handle to `Peerstore`. + peerstore_handle: Arc, + + /// Pending responses. + pending_inbound_responses: HashMap, + + /// Pending outbound responses. + pending_outbound_responses: FuturesUnordered< + BoxFuture<'static, (litep2p::PeerId, RequestId, Result, Instant)>, + >, + + /// RX channel for receiving info for outbound requests. + request_rx: TracingUnboundedReceiver, + + /// Map of supported request-response protocols which are used to support fallback requests. + /// + /// If negotiation for the main protocol fails and the request was sent with a fallback, + /// [`RequestResponseProtocol`] queries this map and sends the request that protocol for + /// processing. + request_tx: HashMap>, + + /// Metrics, if enabled. + metrics: RequestResponseMetrics, +} + +impl RequestResponseProtocol { + /// Create new [`RequestResponseProtocol`]. + pub fn new( + protocol: ProtocolName, + handle: RequestResponseHandle, + peerstore_handle: Arc, + inbound_queue: Option>, + request_rx: TracingUnboundedReceiver, + request_tx: HashMap>, + metrics: Option, + ) -> Self { + Self { + handle, + request_rx, + request_tx, + inbound_queue, + peerstore_handle, + protocol: protocol.clone(), + pending_inbound_responses: HashMap::new(), + pending_outbound_responses: FuturesUnordered::new(), + metrics: RequestResponseMetrics::new(metrics, protocol), + } + } + + /// Send `request` to `peer`. + async fn on_send_request( + &mut self, + peer: PeerId, + request: Vec, + fallback_request: Option<(Vec, ProtocolName)>, + tx: oneshot::Sender, ProtocolName), RequestFailure>>, + connect: IfDisconnected, + ) { + let dial_options = match connect { + IfDisconnected::TryConnect => DialOptions::Dial, + IfDisconnected::ImmediateError => DialOptions::Reject, + }; + + log::trace!( + target: LOG_TARGET, + "{}: send request to {:?} (fallback {:?}) (dial options: {:?})", + self.protocol, + peer, + fallback_request, + dial_options, + ); + + match self.handle.try_send_request(peer.into(), request, dial_options) { + Ok(request_id) => { + self.pending_inbound_responses + .insert(request_id, PendingRequest::new(tx, Instant::now(), fallback_request)); + }, + Err(error) => { + log::warn!( + target: LOG_TARGET, + "{}: failed to send request to {peer:?}: {error:?}", + self.protocol, + ); + + let _ = tx.send(Err(RequestFailure::Refused)); + self.metrics.register_inbound_request_failure(error.to_string().as_ref()); + }, + } + } + + /// Handle inbound request from `peer` + /// + /// If the protocol is configured outbound only, reject the request immediately. + fn on_inbound_request( + &mut self, + peer: litep2p::PeerId, + fallback: Option, + request_id: RequestId, + request: Vec, + ) { + let Some(inbound_queue) = &self.inbound_queue else { + log::trace!( + target: LOG_TARGET, + "{}: rejecting inbound request from {peer:?}, protocol configured as outbound only", + self.protocol, + ); + + self.handle.reject_request(request_id); + return; + }; + + log::trace!( + target: LOG_TARGET, + "{}: request received from {peer:?} ({fallback:?} {request_id:?}), request size {:?}", + self.protocol, + request.len(), + ); + let (tx, rx) = oneshot::channel(); + + match inbound_queue.try_send(IncomingRequest { + peer: peer.into(), + payload: request, + pending_response: tx, + }) { + Ok(_) => { + self.pending_outbound_responses.push(Box::pin(async move { + (peer, request_id, rx.await.map_err(|_| ()), Instant::now()) + })); + }, + Err(error) => { + log::trace!( + target: LOG_TARGET, + "{:?}: dropping request from {peer:?} ({request_id:?}), inbound queue full", + self.protocol, + ); + + self.handle.reject_request(request_id); + self.metrics.register_inbound_request_failure(error.to_string().as_ref()); + }, + } + } + + /// Handle received inbound response. + fn on_inbound_response( + &mut self, + peer: litep2p::PeerId, + request_id: RequestId, + fallback: Option, + response: Vec, + ) { + match self.pending_inbound_responses.remove(&request_id) { + None => log::warn!( + target: LOG_TARGET, + "{:?}: response received for {peer:?} but {request_id:?} doesn't exist", + self.protocol, + ), + Some(PendingRequest { tx, started, .. }) => { + log::trace!( + target: LOG_TARGET, + "{:?}: response received for {peer:?} ({request_id:?}), response size {:?}", + self.protocol, + response.len(), + ); + + let _ = tx.send(Ok(( + response, + fallback.map_or_else(|| self.protocol.clone(), Into::into), + ))); + self.metrics.register_outbound_request_success(started.elapsed()); + }, + } + } + + /// Handle failed outbound request. + fn on_request_failed( + &mut self, + peer: litep2p::PeerId, + request_id: RequestId, + error: RequestResponseError, + ) { + log::debug!( + target: LOG_TARGET, + "{:?}: request failed for {peer:?} ({request_id:?}): {error:?}", + self.protocol + ); + + let Some(PendingRequest { tx, fallback_request, .. }) = + self.pending_inbound_responses.remove(&request_id) + else { + log::warn!( + target: LOG_TARGET, + "{:?}: request failed for peer {peer:?} but {request_id:?} doesn't exist", + self.protocol, + ); + + return + }; + + let error = match error { + RequestResponseError::NotConnected => Some(RequestFailure::NotConnected), + RequestResponseError::Rejected | RequestResponseError::Timeout => + Some(RequestFailure::Refused), + RequestResponseError::Canceled => { + log::debug!( + target: LOG_TARGET, + "{}: request canceled by local node to {peer:?} ({request_id:?})", + self.protocol, + ); + None + }, + RequestResponseError::TooLargePayload => { + log::warn!( + target: LOG_TARGET, + "{}: tried to send too large request to {peer:?} ({request_id:?})", + self.protocol, + ); + Some(RequestFailure::Refused) + }, + RequestResponseError::UnsupportedProtocol => match fallback_request { + Some((request, protocol)) => match self.request_tx.get(&protocol) { + Some(sender) => { + log::debug!( + target: LOG_TARGET, + "{}: failed to negotiate protocol with {:?}, try fallback request: ({})", + self.protocol, + peer, + protocol, + ); + + let outbound_request = OutboundRequest::new( + peer.into(), + request, + tx, + None, + IfDisconnected::ImmediateError, + ); + + // since remote peer doesn't support the main protocol (`self.protocol`), + // try to send the request over a fallback protocol by creating a new + // `OutboundRequest` from the original data, now with the fallback request + // payload, and send it over to the (fallback) request handler like it was + // a normal request. + let _ = sender.unbounded_send(outbound_request); + + return; + }, + None => { + log::warn!( + target: LOG_TARGET, + "{}: fallback request provided but protocol ({}) doesn't exist (peer {:?})", + self.protocol, + protocol, + peer, + ); + + Some(RequestFailure::Refused) + }, + }, + None => Some(RequestFailure::Refused), + }, + }; + + if let Some(error) = error { + self.metrics.register_outbound_request_failure(error.to_string().as_ref()); + let _ = tx.send(Err(error)); + } + } + + /// Handle outbound response. + fn on_outbound_response( + &mut self, + peer: litep2p::PeerId, + request_id: RequestId, + response: OutgoingResponse, + started: Instant, + ) { + let OutgoingResponse { result, reputation_changes, sent_feedback } = response; + + for change in reputation_changes { + log::trace!(target: LOG_TARGET, "{}: report {peer:?}: {change:?}", self.protocol); + self.peerstore_handle.report_peer(peer.into(), change); + } + + match result { + Err(()) => { + log::debug!( + target: LOG_TARGET, + "{}: response rejected ({request_id:?}) for {peer:?}", + self.protocol, + ); + + self.handle.reject_request(request_id); + self.metrics.register_inbound_request_failure("rejected"); + }, + Ok(response) => { + log::trace!( + target: LOG_TARGET, + "{}: send response ({request_id:?}) to {peer:?}, response size {}", + self.protocol, + response.len(), + ); + + match sent_feedback { + None => self.handle.send_response(request_id, response), + Some(feedback) => + self.handle.send_response_with_feedback(request_id, response, feedback), + } + + self.metrics.register_inbound_request_success(started.elapsed()); + }, + } + } + + /// Start running event loop of the request-response protocol. + pub async fn run(mut self) { + loop { + tokio::select! { + event = self.handle.next() => match event { + None => return, + Some(RequestResponseEvent::RequestReceived { + peer, + fallback, + request_id, + request, + }) => self.on_inbound_request(peer, fallback, request_id, request), + Some(RequestResponseEvent::ResponseReceived { peer, request_id, fallback, response }) => { + self.on_inbound_response(peer, request_id, fallback, response); + }, + Some(RequestResponseEvent::RequestFailed { peer, request_id, error }) => { + self.on_request_failed(peer, request_id, error); + }, + }, + event = self.pending_outbound_responses.next(), if !self.pending_outbound_responses.is_empty() => match event { + None => return, + Some((peer, request_id, Err(()), _)) => { + log::debug!(target: LOG_TARGET, "{}: reject request ({request_id:?}) from {peer:?}", self.protocol); + + self.handle.reject_request(request_id); + self.metrics.register_inbound_request_failure("rejected"); + } + Some((peer, request_id, Ok(response), started)) => { + self.on_outbound_response(peer, request_id, response, started); + } + }, + event = self.request_rx.next() => match event { + None => return, + Some(outbound_request) => { + let OutboundRequest { peer, request, sender, dial_behavior, fallback_request } = outbound_request; + + self.on_send_request(peer, request, fallback_request, sender, dial_behavior).await; + } + } + } + } + } +} diff --git a/substrate/client/network/src/litep2p/shim/request_response/tests.rs b/substrate/client/network/src/litep2p/shim/request_response/tests.rs new file mode 100644 index 0000000000000000000000000000000000000000..e3e82aa395c58f96d4f8d4844057c39d349541c8 --- /dev/null +++ b/substrate/client/network/src/litep2p/shim/request_response/tests.rs @@ -0,0 +1,901 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +use crate::{ + litep2p::{ + peerstore::peerstore_handle_test, + shim::request_response::{OutboundRequest, RequestResponseProtocol}, + }, + request_responses::{IfDisconnected, IncomingRequest, OutgoingResponse}, + ProtocolName, RequestFailure, +}; + +use futures::{channel::oneshot, StreamExt}; +use litep2p::{ + config::ConfigBuilder as Litep2pConfigBuilder, + protocol::request_response::{ + ConfigBuilder, DialOptions, RequestResponseError, RequestResponseEvent, + RequestResponseHandle, + }, + transport::tcp::config::Config as TcpConfig, + Litep2p, Litep2pEvent, +}; + +use sc_network_types::PeerId; +use sc_utils::mpsc::tracing_unbounded; + +use std::{collections::HashMap, sync::Arc, task::Poll}; + +/// Create `litep2p` for testing. +async fn make_litep2p() -> (Litep2p, RequestResponseHandle) { + let (config, handle) = ConfigBuilder::new(litep2p::ProtocolName::from("/protocol/1")) + .with_max_size(1024) + .build(); + + ( + Litep2p::new( + Litep2pConfigBuilder::new() + .with_request_response_protocol(config) + .with_tcp(TcpConfig { + listen_addresses: vec![ + "/ip4/0.0.0.0/tcp/0".parse().unwrap(), + "/ip6/::/tcp/0".parse().unwrap(), + ], + ..Default::default() + }) + .build(), + ) + .unwrap(), + handle, + ) +} + +// connect two `litep2p` instances together +async fn connect_peers(litep2p1: &mut Litep2p, litep2p2: &mut Litep2p) { + let address = litep2p2.listen_addresses().next().unwrap().clone(); + litep2p1.dial_address(address).await.unwrap(); + + let mut litep2p1_connected = false; + let mut litep2p2_connected = false; + + loop { + tokio::select! { + event = litep2p1.next_event() => match event.unwrap() { + Litep2pEvent::ConnectionEstablished { .. } => { + litep2p1_connected = true; + } + _ => {}, + }, + event = litep2p2.next_event() => match event.unwrap() { + Litep2pEvent::ConnectionEstablished { .. } => { + litep2p2_connected = true; + } + _ => {}, + } + } + + if litep2p1_connected && litep2p2_connected { + break + } + } +} + +#[tokio::test] +async fn dial_failure() { + let (mut litep2p, handle) = make_litep2p().await; + let (tx, _rx) = async_channel::bounded(64); + let (outbound_tx, outbound_rx) = tracing_unbounded("outbound-request", 1000); + let senders = HashMap::from_iter([(ProtocolName::from("/protocol/1"), outbound_tx.clone())]); + + let protocol = RequestResponseProtocol::new( + ProtocolName::from("/protocol/1"), + handle, + Arc::new(peerstore_handle_test()), + Some(tx), + outbound_rx, + senders, + None, + ); + + tokio::spawn(protocol.run()); + tokio::spawn(async move { while let Some(_) = litep2p.next_event().await {} }); + + let peer = PeerId::random(); + let (result_tx, result_rx) = oneshot::channel(); + + outbound_tx + .unbounded_send(OutboundRequest { + peer, + request: vec![1, 2, 3, 4], + sender: result_tx, + fallback_request: None, + dial_behavior: IfDisconnected::TryConnect, + }) + .unwrap(); + + assert!(std::matches!(result_rx.await, Ok(Err(RequestFailure::Refused)))); +} + +#[tokio::test] +async fn send_request_to_disconnected_peer() { + let (mut litep2p, handle) = make_litep2p().await; + let (tx, _rx) = async_channel::bounded(64); + let (outbound_tx, outbound_rx) = tracing_unbounded("outbound-request", 1000); + let senders = HashMap::from_iter([(ProtocolName::from("/protocol/1"), outbound_tx.clone())]); + + let protocol = RequestResponseProtocol::new( + ProtocolName::from("/protocol/1"), + handle, + Arc::new(peerstore_handle_test()), + Some(tx), + outbound_rx, + senders, + None, + ); + + tokio::spawn(protocol.run()); + tokio::spawn(async move { while let Some(_) = litep2p.next_event().await {} }); + + let peer = PeerId::random(); + let (result_tx, result_rx) = oneshot::channel(); + + outbound_tx + .unbounded_send(OutboundRequest { + peer, + request: vec![1, 2, 3, 4], + sender: result_tx, + fallback_request: None, + dial_behavior: IfDisconnected::ImmediateError, + }) + .unwrap(); + + assert!(std::matches!(result_rx.await, Ok(Err(RequestFailure::NotConnected)))); +} + +#[tokio::test] +async fn send_request_to_disconnected_peer_and_dial() { + let (mut litep2p1, handle1) = make_litep2p().await; + let (mut litep2p2, handle2) = make_litep2p().await; + + let peer1 = *litep2p1.local_peer_id(); + let peer2 = *litep2p2.local_peer_id(); + + litep2p1.add_known_address( + peer2, + std::iter::once(litep2p2.listen_addresses().next().expect("listen address").clone()), + ); + + let (outbound_tx1, outbound_rx1) = tracing_unbounded("outbound-request", 1000); + let senders = HashMap::from_iter([(ProtocolName::from("/protocol/1"), outbound_tx1.clone())]); + let (tx1, _rx1) = async_channel::bounded(64); + + let protocol1 = RequestResponseProtocol::new( + ProtocolName::from("/protocol/1"), + handle1, + Arc::new(peerstore_handle_test()), + Some(tx1), + outbound_rx1, + senders, + None, + ); + + let (outbound_tx2, outbound_rx2) = tracing_unbounded("outbound-request", 1000); + let senders = HashMap::from_iter([(ProtocolName::from("/protocol/1"), outbound_tx2)]); + let (tx2, rx2) = async_channel::bounded(64); + + let protocol2 = RequestResponseProtocol::new( + ProtocolName::from("/protocol/1"), + handle2, + Arc::new(peerstore_handle_test()), + Some(tx2), + outbound_rx2, + senders, + None, + ); + + tokio::spawn(protocol1.run()); + tokio::spawn(protocol2.run()); + tokio::spawn(async move { while let Some(_) = litep2p1.next_event().await {} }); + tokio::spawn(async move { while let Some(_) = litep2p2.next_event().await {} }); + + let (result_tx, _result_rx) = oneshot::channel(); + outbound_tx1 + .unbounded_send(OutboundRequest { + peer: peer2.into(), + request: vec![1, 2, 3, 4], + sender: result_tx, + fallback_request: None, + dial_behavior: IfDisconnected::TryConnect, + }) + .unwrap(); + + match rx2.recv().await { + Ok(IncomingRequest { peer, payload, .. }) => { + assert_eq!(peer, Into::::into(peer1)); + assert_eq!(payload, vec![1, 2, 3, 4]); + }, + Err(error) => panic!("unexpected error: {error:?}"), + } +} + +#[tokio::test] +async fn too_many_inbound_requests() { + let (mut litep2p1, handle1) = make_litep2p().await; + let (mut litep2p2, mut handle2) = make_litep2p().await; + let peer1 = *litep2p1.local_peer_id(); + + connect_peers(&mut litep2p1, &mut litep2p2).await; + + let (outbound_tx, outbound_rx) = tracing_unbounded("outbound-request", 1000); + let senders = HashMap::from_iter([(ProtocolName::from("/protocol/1"), outbound_tx)]); + let (tx, _rx) = async_channel::bounded(4); + + let protocol = RequestResponseProtocol::new( + ProtocolName::from("/protocol/1"), + handle1, + Arc::new(peerstore_handle_test()), + Some(tx), + outbound_rx, + senders, + None, + ); + + tokio::spawn(protocol.run()); + tokio::spawn(async move { while let Some(_) = litep2p1.next_event().await {} }); + tokio::spawn(async move { while let Some(_) = litep2p2.next_event().await {} }); + + // send 5 request and verify that one of the requests will fail + for _ in 0..5 { + handle2 + .send_request(peer1, vec![1, 2, 3, 4], DialOptions::Reject) + .await + .unwrap(); + } + + // verify that one of the requests is rejected + match handle2.next().await { + Some(RequestResponseEvent::RequestFailed { peer, error, .. }) => { + assert_eq!(peer, peer1); + assert_eq!(error, RequestResponseError::Rejected); + }, + event => panic!("inavlid event: {event:?}"), + } + + // verify that no other events are read from the handle + futures::future::poll_fn(|cx| match handle2.poll_next_unpin(cx) { + Poll::Pending => Poll::Ready(()), + event => panic!("invalid event: {event:?}"), + }) + .await; +} + +#[tokio::test] +async fn feedback_works() { + let (mut litep2p1, handle1) = make_litep2p().await; + let (mut litep2p2, mut handle2) = make_litep2p().await; + + let peer1 = *litep2p1.local_peer_id(); + let peer2 = *litep2p2.local_peer_id(); + + connect_peers(&mut litep2p1, &mut litep2p2).await; + + let (outbound_tx, outbound_rx) = tracing_unbounded("outbound-request", 1000); + let senders = HashMap::from_iter([(ProtocolName::from("/protocol/1"), outbound_tx)]); + let (tx, rx) = async_channel::bounded(4); + + let protocol = RequestResponseProtocol::new( + ProtocolName::from("/protocol/1"), + handle1, + Arc::new(peerstore_handle_test()), + Some(tx), + outbound_rx, + senders, + None, + ); + + tokio::spawn(protocol.run()); + tokio::spawn(async move { while let Some(_) = litep2p1.next_event().await {} }); + tokio::spawn(async move { while let Some(_) = litep2p2.next_event().await {} }); + + let request_id = handle2 + .send_request(peer1, vec![1, 2, 3, 4], DialOptions::Reject) + .await + .unwrap(); + + let rx = match rx.recv().await { + Ok(IncomingRequest { peer, payload, pending_response }) => { + assert_eq!(peer, peer2.into()); + assert_eq!(payload, vec![1, 2, 3, 4]); + + let (tx, rx) = oneshot::channel(); + pending_response + .send(OutgoingResponse { + result: Ok(vec![5, 6, 7, 8]), + reputation_changes: Vec::new(), + sent_feedback: Some(tx), + }) + .unwrap(); + rx + }, + event => panic!("invalid event: {event:?}"), + }; + + match handle2.next().await { + Some(RequestResponseEvent::ResponseReceived { + peer, + request_id: received_id, + response, + .. + }) => { + assert_eq!(peer, peer1); + assert_eq!(request_id, received_id); + assert_eq!(response, vec![5, 6, 7, 8]); + assert!(rx.await.is_ok()); + }, + event => panic!("invalid event: {event:?}"), + } +} + +#[tokio::test] +async fn fallback_request_compatible_peers() { + // `litep2p1` supports both the new and the old protocol + let (mut litep2p1, handle1_1, handle1_2) = { + let (config1, handle1) = ConfigBuilder::new(litep2p::ProtocolName::from("/protocol/2")) + .with_max_size(1024) + .build(); + + let (config2, handle2) = ConfigBuilder::new(litep2p::ProtocolName::from("/protocol/1")) + .with_max_size(1024) + .build(); + ( + Litep2p::new( + Litep2pConfigBuilder::new() + .with_request_response_protocol(config1) + .with_request_response_protocol(config2) + .with_tcp(TcpConfig { + listen_addresses: vec![ + "/ip4/0.0.0.0/tcp/0".parse().unwrap(), + "/ip6/::/tcp/0".parse().unwrap(), + ], + ..Default::default() + }) + .build(), + ) + .unwrap(), + handle1, + handle2, + ) + }; + + // `litep2p2` supports only the new protocol + let (config2, handle2) = ConfigBuilder::new(litep2p::ProtocolName::from("/protocol/2")) + .with_max_size(1024) + .build(); + + let mut litep2p2 = Litep2p::new( + Litep2pConfigBuilder::new() + .with_request_response_protocol(config2) + .with_tcp(TcpConfig { + listen_addresses: vec![ + "/ip4/0.0.0.0/tcp/0".parse().unwrap(), + "/ip6/::/tcp/0".parse().unwrap(), + ], + ..Default::default() + }) + .build(), + ) + .unwrap(); + + let peer1 = *litep2p1.local_peer_id(); + let peer2 = *litep2p2.local_peer_id(); + + connect_peers(&mut litep2p1, &mut litep2p2).await; + + let (outbound_tx1, outbound_rx1) = tracing_unbounded("outbound-request", 1000); + let (outbound_tx_fallback, outbound_rx_fallback) = tracing_unbounded("outbound-request", 1000); + + let senders1 = HashMap::from_iter([ + (ProtocolName::from("/protocol/2"), outbound_tx1.clone()), + (ProtocolName::from("/protocol/1"), outbound_tx_fallback), + ]); + + let (tx1, _rx1) = async_channel::bounded(4); + let protocol1 = RequestResponseProtocol::new( + ProtocolName::from("/protocol/2"), + handle1_1, + Arc::new(peerstore_handle_test()), + Some(tx1), + outbound_rx1, + senders1.clone(), + None, + ); + + let (tx_fallback, _rx_fallback) = async_channel::bounded(4); + let protocol_fallback = RequestResponseProtocol::new( + ProtocolName::from("/protocol/1"), + handle1_2, + Arc::new(peerstore_handle_test()), + Some(tx_fallback), + outbound_rx_fallback, + senders1, + None, + ); + + let (outbound_tx2, outbound_rx2) = tracing_unbounded("outbound-request", 1000); + let senders2 = HashMap::from_iter([(ProtocolName::from("/protocol/2"), outbound_tx2)]); + + let (tx2, rx2) = async_channel::bounded(4); + let protocol2 = RequestResponseProtocol::new( + ProtocolName::from("/protocol/2"), + handle2, + Arc::new(peerstore_handle_test()), + Some(tx2), + outbound_rx2, + senders2, + None, + ); + + tokio::spawn(protocol1.run()); + tokio::spawn(protocol2.run()); + tokio::spawn(protocol_fallback.run()); + tokio::spawn(async move { while let Some(_) = litep2p1.next_event().await {} }); + tokio::spawn(async move { while let Some(_) = litep2p2.next_event().await {} }); + + let (result_tx, result_rx) = oneshot::channel(); + outbound_tx1 + .unbounded_send(OutboundRequest { + peer: peer2.into(), + request: vec![1, 2, 3, 4], + sender: result_tx, + fallback_request: Some((vec![1, 3, 3, 7], ProtocolName::from("/protocol/1"))), + dial_behavior: IfDisconnected::ImmediateError, + }) + .unwrap(); + + match rx2.recv().await { + Ok(IncomingRequest { peer, payload, pending_response }) => { + assert_eq!(peer, peer1.into()); + assert_eq!(payload, vec![1, 2, 3, 4]); + pending_response + .send(OutgoingResponse { + result: Ok(vec![5, 6, 7, 8]), + reputation_changes: Vec::new(), + sent_feedback: None, + }) + .unwrap(); + }, + event => panic!("invalid event: {event:?}"), + } + + match result_rx.await { + Ok(Ok((response, protocol))) => { + assert_eq!(response, vec![5, 6, 7, 8]); + assert_eq!(protocol, ProtocolName::from("/protocol/2")); + }, + event => panic!("invalid event: {event:?}"), + } +} + +#[tokio::test] +async fn fallback_request_old_peer_receives() { + sp_tracing::try_init_simple(); + + // `litep2p1` supports both the new and the old protocol + let (mut litep2p1, handle1_1, handle1_2) = { + let (config1, handle1) = ConfigBuilder::new(litep2p::ProtocolName::from("/protocol/2")) + .with_max_size(1024) + .build(); + + let (config2, handle2) = ConfigBuilder::new(litep2p::ProtocolName::from("/protocol/1")) + .with_max_size(1024) + .build(); + ( + Litep2p::new( + Litep2pConfigBuilder::new() + .with_request_response_protocol(config1) + .with_request_response_protocol(config2) + .with_tcp(TcpConfig { + listen_addresses: vec![ + "/ip4/0.0.0.0/tcp/0".parse().unwrap(), + "/ip6/::/tcp/0".parse().unwrap(), + ], + ..Default::default() + }) + .build(), + ) + .unwrap(), + handle1, + handle2, + ) + }; + + // `litep2p2` supports only the new protocol + let (config2, handle2) = ConfigBuilder::new(litep2p::ProtocolName::from("/protocol/1")) + .with_max_size(1024) + .build(); + + let mut litep2p2 = Litep2p::new( + Litep2pConfigBuilder::new() + .with_request_response_protocol(config2) + .with_tcp(TcpConfig { + listen_addresses: vec![ + "/ip4/0.0.0.0/tcp/0".parse().unwrap(), + "/ip6/::/tcp/0".parse().unwrap(), + ], + ..Default::default() + }) + .build(), + ) + .unwrap(); + + let peer1 = *litep2p1.local_peer_id(); + let peer2 = *litep2p2.local_peer_id(); + + connect_peers(&mut litep2p1, &mut litep2p2).await; + + let (outbound_tx1, outbound_rx1) = tracing_unbounded("outbound-request", 1000); + let (outbound_tx_fallback, outbound_rx_fallback) = tracing_unbounded("outbound-request", 1000); + + let senders1 = HashMap::from_iter([ + (ProtocolName::from("/protocol/2"), outbound_tx1.clone()), + (ProtocolName::from("/protocol/1"), outbound_tx_fallback), + ]); + + let (tx1, _rx1) = async_channel::bounded(4); + let protocol1 = RequestResponseProtocol::new( + ProtocolName::from("/protocol/2"), + handle1_1, + Arc::new(peerstore_handle_test()), + Some(tx1), + outbound_rx1, + senders1.clone(), + None, + ); + + let (tx_fallback, _rx_fallback) = async_channel::bounded(4); + let protocol_fallback = RequestResponseProtocol::new( + ProtocolName::from("/protocol/1"), + handle1_2, + Arc::new(peerstore_handle_test()), + Some(tx_fallback), + outbound_rx_fallback, + senders1, + None, + ); + + let (outbound_tx2, outbound_rx2) = tracing_unbounded("outbound-request", 1000); + let senders2 = HashMap::from_iter([(ProtocolName::from("/protocol/1"), outbound_tx2)]); + + let (tx2, rx2) = async_channel::bounded(4); + let protocol2 = RequestResponseProtocol::new( + ProtocolName::from("/protocol/1"), + handle2, + Arc::new(peerstore_handle_test()), + Some(tx2), + outbound_rx2, + senders2, + None, + ); + + tokio::spawn(protocol1.run()); + tokio::spawn(protocol2.run()); + tokio::spawn(protocol_fallback.run()); + tokio::spawn(async move { while let Some(_) = litep2p1.next_event().await {} }); + tokio::spawn(async move { while let Some(_) = litep2p2.next_event().await {} }); + + let (result_tx, result_rx) = oneshot::channel(); + outbound_tx1 + .unbounded_send(OutboundRequest { + peer: peer2.into(), + request: vec![1, 2, 3, 4], + sender: result_tx, + fallback_request: Some((vec![1, 3, 3, 7], ProtocolName::from("/protocol/1"))), + dial_behavior: IfDisconnected::ImmediateError, + }) + .unwrap(); + + match rx2.recv().await { + Ok(IncomingRequest { peer, payload, pending_response }) => { + assert_eq!(peer, peer1.into()); + assert_eq!(payload, vec![1, 3, 3, 7]); + pending_response + .send(OutgoingResponse { + result: Ok(vec![1, 3, 3, 8]), + reputation_changes: Vec::new(), + sent_feedback: None, + }) + .unwrap(); + }, + event => panic!("invalid event: {event:?}"), + } + + match result_rx.await { + Ok(Ok((response, protocol))) => { + assert_eq!(response, vec![1, 3, 3, 8]); + assert_eq!(protocol, ProtocolName::from("/protocol/1")); + }, + event => panic!("invalid event: {event:?}"), + } +} + +#[tokio::test] +async fn fallback_request_old_peer_sends() { + sp_tracing::try_init_simple(); + + // `litep2p1` supports both the new and the old protocol + let (mut litep2p1, handle1_1, handle1_2) = { + let (config1, handle1) = ConfigBuilder::new(litep2p::ProtocolName::from("/protocol/2")) + .with_max_size(1024) + .build(); + + let (config2, handle2) = ConfigBuilder::new(litep2p::ProtocolName::from("/protocol/1")) + .with_max_size(1024) + .build(); + ( + Litep2p::new( + Litep2pConfigBuilder::new() + .with_request_response_protocol(config1) + .with_request_response_protocol(config2) + .with_tcp(TcpConfig { + listen_addresses: vec![ + "/ip4/0.0.0.0/tcp/0".parse().unwrap(), + "/ip6/::/tcp/0".parse().unwrap(), + ], + ..Default::default() + }) + .build(), + ) + .unwrap(), + handle1, + handle2, + ) + }; + + // `litep2p2` supports only the new protocol + let (config2, handle2) = ConfigBuilder::new(litep2p::ProtocolName::from("/protocol/1")) + .with_max_size(1024) + .build(); + + let mut litep2p2 = Litep2p::new( + Litep2pConfigBuilder::new() + .with_request_response_protocol(config2) + .with_tcp(TcpConfig { + listen_addresses: vec![ + "/ip4/0.0.0.0/tcp/0".parse().unwrap(), + "/ip6/::/tcp/0".parse().unwrap(), + ], + ..Default::default() + }) + .build(), + ) + .unwrap(); + + let peer1 = *litep2p1.local_peer_id(); + let peer2 = *litep2p2.local_peer_id(); + + connect_peers(&mut litep2p1, &mut litep2p2).await; + + let (outbound_tx1, outbound_rx1) = tracing_unbounded("outbound-request", 1000); + let (outbound_tx_fallback, outbound_rx_fallback) = tracing_unbounded("outbound-request", 1000); + + let senders1 = HashMap::from_iter([ + (ProtocolName::from("/protocol/2"), outbound_tx1.clone()), + (ProtocolName::from("/protocol/1"), outbound_tx_fallback), + ]); + + let (tx1, _rx1) = async_channel::bounded(4); + let protocol1 = RequestResponseProtocol::new( + ProtocolName::from("/protocol/2"), + handle1_1, + Arc::new(peerstore_handle_test()), + Some(tx1), + outbound_rx1, + senders1.clone(), + None, + ); + + let (tx_fallback, rx_fallback) = async_channel::bounded(4); + let protocol_fallback = RequestResponseProtocol::new( + ProtocolName::from("/protocol/1"), + handle1_2, + Arc::new(peerstore_handle_test()), + Some(tx_fallback), + outbound_rx_fallback, + senders1, + None, + ); + + let (outbound_tx2, outbound_rx2) = tracing_unbounded("outbound-request", 1000); + let senders2 = HashMap::from_iter([(ProtocolName::from("/protocol/1"), outbound_tx2.clone())]); + + let (tx2, _rx2) = async_channel::bounded(4); + let protocol2 = RequestResponseProtocol::new( + ProtocolName::from("/protocol/1"), + handle2, + Arc::new(peerstore_handle_test()), + Some(tx2), + outbound_rx2, + senders2, + None, + ); + + tokio::spawn(protocol1.run()); + tokio::spawn(protocol2.run()); + tokio::spawn(protocol_fallback.run()); + tokio::spawn(async move { while let Some(_) = litep2p1.next_event().await {} }); + tokio::spawn(async move { while let Some(_) = litep2p2.next_event().await {} }); + + let (result_tx, result_rx) = oneshot::channel(); + outbound_tx2 + .unbounded_send(OutboundRequest { + peer: peer1.into(), + request: vec![1, 2, 3, 4], + sender: result_tx, + fallback_request: None, + dial_behavior: IfDisconnected::ImmediateError, + }) + .unwrap(); + + match rx_fallback.recv().await { + Ok(IncomingRequest { peer, payload, pending_response }) => { + assert_eq!(peer, peer2.into()); + assert_eq!(payload, vec![1, 2, 3, 4]); + pending_response + .send(OutgoingResponse { + result: Ok(vec![1, 3, 3, 8]), + reputation_changes: Vec::new(), + sent_feedback: None, + }) + .unwrap(); + }, + event => panic!("invalid event: {event:?}"), + } + + match result_rx.await { + Ok(Ok((response, protocol))) => { + assert_eq!(response, vec![1, 3, 3, 8]); + assert_eq!(protocol, ProtocolName::from("/protocol/1")); + }, + event => panic!("invalid event: {event:?}"), + } +} + +#[tokio::test] +async fn old_protocol_supported_but_no_fallback_provided() { + sp_tracing::try_init_simple(); + + // `litep2p1` supports both the new and the old protocol + let (mut litep2p1, handle1_1, handle1_2) = { + let (config1, handle1) = ConfigBuilder::new(litep2p::ProtocolName::from("/protocol/2")) + .with_max_size(1024) + .build(); + + let (config2, handle2) = ConfigBuilder::new(litep2p::ProtocolName::from("/protocol/1")) + .with_max_size(1024) + .build(); + ( + Litep2p::new( + Litep2pConfigBuilder::new() + .with_request_response_protocol(config1) + .with_request_response_protocol(config2) + .with_tcp(TcpConfig { + listen_addresses: vec![ + "/ip4/0.0.0.0/tcp/0".parse().unwrap(), + "/ip6/::/tcp/0".parse().unwrap(), + ], + ..Default::default() + }) + .build(), + ) + .unwrap(), + handle1, + handle2, + ) + }; + + // `litep2p2` supports only the old protocol + let (config2, handle2) = ConfigBuilder::new(litep2p::ProtocolName::from("/protocol/1")) + .with_max_size(1024) + .build(); + + let mut litep2p2 = Litep2p::new( + Litep2pConfigBuilder::new() + .with_request_response_protocol(config2) + .with_tcp(TcpConfig { + listen_addresses: vec![ + "/ip4/0.0.0.0/tcp/0".parse().unwrap(), + "/ip6/::/tcp/0".parse().unwrap(), + ], + ..Default::default() + }) + .build(), + ) + .unwrap(); + + let peer2 = *litep2p2.local_peer_id(); + + connect_peers(&mut litep2p1, &mut litep2p2).await; + + let (outbound_tx1, outbound_rx1) = tracing_unbounded("outbound-request", 1000); + let (outbound_tx_fallback, outbound_rx_fallback) = tracing_unbounded("outbound-request", 1000); + + let senders1 = HashMap::from_iter([ + (ProtocolName::from("/protocol/2"), outbound_tx1.clone()), + (ProtocolName::from("/protocol/1"), outbound_tx_fallback), + ]); + + let (tx1, _rx1) = async_channel::bounded(4); + let protocol1 = RequestResponseProtocol::new( + ProtocolName::from("/protocol/2"), + handle1_1, + Arc::new(peerstore_handle_test()), + Some(tx1), + outbound_rx1, + senders1.clone(), + None, + ); + + let (tx_fallback, _rx_fallback) = async_channel::bounded(4); + let protocol_fallback = RequestResponseProtocol::new( + ProtocolName::from("/protocol/1"), + handle1_2, + Arc::new(peerstore_handle_test()), + Some(tx_fallback), + outbound_rx_fallback, + senders1, + None, + ); + + let (outbound_tx2, outbound_rx2) = tracing_unbounded("outbound-request", 1000); + let senders2 = HashMap::from_iter([(ProtocolName::from("/protocol/1"), outbound_tx2)]); + + let (tx2, _rx2) = async_channel::bounded(4); + let protocol2 = RequestResponseProtocol::new( + ProtocolName::from("/protocol/1"), + handle2, + Arc::new(peerstore_handle_test()), + Some(tx2), + outbound_rx2, + senders2, + None, + ); + + tokio::spawn(protocol1.run()); + tokio::spawn(protocol2.run()); + tokio::spawn(protocol_fallback.run()); + tokio::spawn(async move { while let Some(_) = litep2p1.next_event().await {} }); + tokio::spawn(async move { while let Some(_) = litep2p2.next_event().await {} }); + + let (result_tx, result_rx) = oneshot::channel(); + outbound_tx1 + .unbounded_send(OutboundRequest { + peer: peer2.into(), + request: vec![1, 2, 3, 4], + sender: result_tx, + fallback_request: None, + dial_behavior: IfDisconnected::ImmediateError, + }) + .unwrap(); + + match result_rx.await { + Ok(Err(error)) => { + assert!(std::matches!(error, RequestFailure::Refused)); + }, + event => panic!("invalid event: {event:?}"), + } +} diff --git a/substrate/client/network/src/mock.rs b/substrate/client/network/src/mock.rs index 534b81189707163340f8887d16afb401a045dd24..f6c69227fda15241a84903328be03ef9f5ac4bc3 100644 --- a/substrate/client/network/src/mock.rs +++ b/substrate/client/network/src/mock.rs @@ -18,10 +18,15 @@ //! Mocked components for tests. -use crate::{peer_store::PeerStoreProvider, protocol_controller::ProtocolHandle, ReputationChange}; -use libp2p::PeerId; +use crate::{ + peer_store::{PeerStoreProvider, ProtocolHandle}, + ReputationChange, +}; + use sc_network_common::role::ObservedRole; -use std::collections::HashSet; +use sc_network_types::PeerId; + +use std::{collections::HashSet, sync::Arc}; /// No-op `PeerStore`. #[derive(Debug)] @@ -33,15 +38,15 @@ impl PeerStoreProvider for MockPeerStore { false } - fn register_protocol(&self, _protocol_handle: ProtocolHandle) { + fn register_protocol(&self, _protocol_handle: Arc) { // Make sure not to fail. } - fn report_disconnect(&mut self, _peer_id: PeerId) { + fn report_disconnect(&self, _peer_id: PeerId) { // Make sure not to fail. } - fn report_peer(&mut self, _peer_id: PeerId, _change: ReputationChange) { + fn report_peer(&self, _peer_id: PeerId, _change: ReputationChange) { // Make sure not to fail. } @@ -54,11 +59,19 @@ impl PeerStoreProvider for MockPeerStore { None } - fn set_peer_role(&mut self, _peer_id: &PeerId, _role: ObservedRole) { + fn set_peer_role(&self, _peer_id: &PeerId, _role: ObservedRole) { unimplemented!(); } - fn outgoing_candidates(&self, _count: usize, _ignored: HashSet<&PeerId>) -> Vec { + fn outgoing_candidates(&self, _count: usize, _ignored: HashSet) -> Vec { + unimplemented!() + } + + fn num_known_peers(&self) -> usize { + 0usize + } + + fn add_known_peer(&self, _peer_id: PeerId) { unimplemented!() } } diff --git a/substrate/client/network/src/peer_store.rs b/substrate/client/network/src/peer_store.rs index 4b28b8e7544031139f2906df7d109b24fafe9230..a4c739f1448e685aad34819b627333e4c250d957 100644 --- a/substrate/client/network/src/peer_store.rs +++ b/substrate/client/network/src/peer_store.rs @@ -19,7 +19,8 @@ //! [`PeerStore`] manages peer reputations and provides connection candidates to //! [`crate::protocol_controller::ProtocolController`]. -use libp2p::PeerId; +use crate::{service::traits::PeerStore as PeerStoreT, PeerId}; + use log::trace; use parking_lot::Mutex; use partial_sort::PartialSort; @@ -33,50 +34,74 @@ use std::{ }; use wasm_timer::Delay; -use crate::protocol_controller::ProtocolHandle; - /// Log target for this file. pub const LOG_TARGET: &str = "peerset"; /// We don't accept nodes whose reputation is under this value. -pub const BANNED_THRESHOLD: i32 = 82 * (i32::MIN / 100); +pub const BANNED_THRESHOLD: i32 = 71 * (i32::MIN / 100); /// Reputation change for a node when we get disconnected from it. const DISCONNECT_REPUTATION_CHANGE: i32 = -256; /// Relative decrement of a reputation value that is applied every second. I.e., for inverse -/// decrement of 50 we decrease absolute value of the reputation by 1/50. This corresponds to a -/// factor of `k = 0.98`. It takes ~ `ln(0.5) / ln(k)` seconds to reduce the reputation by half, -/// or 34.3 seconds for the values above. In this setup the maximum allowed absolute value of -/// `i32::MAX` becomes 0 in ~1100 seconds (actually less due to integer arithmetic). -const INVERSE_DECREMENT: i32 = 50; +/// decrement of 200 we decrease absolute value of the reputation by 1/200. +/// +/// This corresponds to a factor of `k = 0.955`, where k = 1 - 1 / INVERSE_DECREMENT. +/// +/// It takes ~ `ln(0.5) / ln(k)` seconds to reduce the reputation by half, or 138.63 seconds for the +/// values above. +/// +/// In this setup: +/// - `i32::MAX` becomes 0 in exactly 3544 seconds, or approximately 59 minutes +/// - `i32::MIN` becomes 0 in exactly 3544 seconds, or approximately 59 minutes +/// - `i32::MIN` escapes the banned threshold in 69 seconds +const INVERSE_DECREMENT: i32 = 200; /// Amount of time between the moment we last updated the [`PeerStore`] entry and the moment we /// remove it, once the reputation value reaches 0. const FORGET_AFTER: Duration = Duration::from_secs(3600); +/// Trait describing the required functionality from a `Peerset` handle. +pub trait ProtocolHandle: Debug + Send + Sync { + /// Disconnect peer. + fn disconnect_peer(&self, peer_id: sc_network_types::PeerId); +} + /// Trait providing peer reputation management and connection candidates. -pub trait PeerStoreProvider: Debug + Send { +pub trait PeerStoreProvider: Debug + Send + Sync { /// Check whether the peer is banned. - fn is_banned(&self, peer_id: &PeerId) -> bool; + fn is_banned(&self, peer_id: &sc_network_types::PeerId) -> bool; /// Register a protocol handle to disconnect peers whose reputation drops below the threshold. - fn register_protocol(&self, protocol_handle: ProtocolHandle); + fn register_protocol(&self, protocol_handle: Arc); /// Report peer disconnection for reputation adjustment. - fn report_disconnect(&mut self, peer_id: PeerId); + fn report_disconnect(&self, peer_id: sc_network_types::PeerId); /// Adjust peer reputation. - fn report_peer(&mut self, peer_id: PeerId, change: ReputationChange); + fn report_peer(&self, peer_id: sc_network_types::PeerId, change: ReputationChange); /// Set peer role. - fn set_peer_role(&mut self, peer_id: &PeerId, role: ObservedRole); + fn set_peer_role(&self, peer_id: &sc_network_types::PeerId, role: ObservedRole); /// Get peer reputation. - fn peer_reputation(&self, peer_id: &PeerId) -> i32; + fn peer_reputation(&self, peer_id: &sc_network_types::PeerId) -> i32; /// Get peer role, if available. - fn peer_role(&self, peer_id: &PeerId) -> Option; + fn peer_role(&self, peer_id: &sc_network_types::PeerId) -> Option; /// Get candidates with highest reputations for initiating outgoing connections. - fn outgoing_candidates(&self, count: usize, ignored: HashSet<&PeerId>) -> Vec; + fn outgoing_candidates( + &self, + count: usize, + ignored: HashSet, + ) -> Vec; + + /// Get the number of known peers. + /// + /// This number might not include some connected peers in rare cases when their reputation + /// was not updated for one hour, because their entries in [`PeerStore`] were dropped. + fn num_known_peers(&self) -> usize; + + /// Add known peer. + fn add_known_peer(&self, peer_id: sc_network_types::PeerId); } /// Actual implementation of peer reputations and connection candidates provider. @@ -86,51 +111,56 @@ pub struct PeerStoreHandle { } impl PeerStoreProvider for PeerStoreHandle { - fn is_banned(&self, peer_id: &PeerId) -> bool { - self.inner.lock().is_banned(peer_id) + fn is_banned(&self, peer_id: &sc_network_types::PeerId) -> bool { + self.inner.lock().is_banned(&peer_id.into()) } - fn register_protocol(&self, protocol_handle: ProtocolHandle) { + fn register_protocol(&self, protocol_handle: Arc) { self.inner.lock().register_protocol(protocol_handle); } - fn report_disconnect(&mut self, peer_id: PeerId) { - self.inner.lock().report_disconnect(peer_id) + fn report_disconnect(&self, peer_id: sc_network_types::PeerId) { + let mut inner = self.inner.lock(); + inner.report_disconnect(peer_id.into()) } - fn report_peer(&mut self, peer_id: PeerId, change: ReputationChange) { - self.inner.lock().report_peer(peer_id, change) + fn report_peer(&self, peer_id: sc_network_types::PeerId, change: ReputationChange) { + let mut inner = self.inner.lock(); + inner.report_peer(peer_id.into(), change) } - fn set_peer_role(&mut self, peer_id: &PeerId, role: ObservedRole) { - self.inner.lock().set_peer_role(peer_id, role) + fn set_peer_role(&self, peer_id: &sc_network_types::PeerId, role: ObservedRole) { + let mut inner = self.inner.lock(); + inner.set_peer_role(&peer_id.into(), role) } - fn peer_reputation(&self, peer_id: &PeerId) -> i32 { - self.inner.lock().peer_reputation(peer_id) + fn peer_reputation(&self, peer_id: &sc_network_types::PeerId) -> i32 { + self.inner.lock().peer_reputation(&peer_id.into()) } - fn peer_role(&self, peer_id: &PeerId) -> Option { - self.inner.lock().peer_role(peer_id) + fn peer_role(&self, peer_id: &sc_network_types::PeerId) -> Option { + self.inner.lock().peer_role(&peer_id.into()) } - fn outgoing_candidates(&self, count: usize, ignored: HashSet<&PeerId>) -> Vec { - self.inner.lock().outgoing_candidates(count, ignored) + fn outgoing_candidates( + &self, + count: usize, + ignored: HashSet, + ) -> Vec { + self.inner + .lock() + .outgoing_candidates(count, ignored.iter().map(|peer_id| (*peer_id).into()).collect()) + .iter() + .map(|peer_id| peer_id.into()) + .collect() } -} -impl PeerStoreHandle { - /// Get the number of known peers. - /// - /// This number might not include some connected peers in rare cases when their reputation - /// was not updated for one hour, because their entries in [`PeerStore`] were dropped. - pub fn num_known_peers(&self) -> usize { + fn num_known_peers(&self) -> usize { self.inner.lock().peers.len() } - /// Add known peer. - pub fn add_known_peer(&mut self, peer_id: PeerId) { - self.inner.lock().add_known_peer(peer_id); + fn add_known_peer(&self, peer_id: sc_network_types::PeerId) { + self.inner.lock().add_known_peer(peer_id.into()); } } @@ -210,7 +240,7 @@ impl PeerInfo { #[derive(Debug)] struct PeerStoreInner { peers: HashMap, - protocols: Vec, + protocols: Vec>, } impl PeerStoreInner { @@ -218,7 +248,7 @@ impl PeerStoreInner { self.peers.get(peer_id).map_or(false, |info| info.is_banned()) } - fn register_protocol(&mut self, protocol_handle: ProtocolHandle) { + fn register_protocol(&mut self, protocol_handle: Arc) { self.protocols.push(protocol_handle); } @@ -240,7 +270,7 @@ impl PeerStoreInner { peer_info.add_reputation(change.value); if peer_info.reputation < BANNED_THRESHOLD { - self.protocols.iter().for_each(|handle| handle.disconnect_peer(peer_id)); + self.protocols.iter().for_each(|handle| handle.disconnect_peer(peer_id.into())); log::warn!( target: LOG_TARGET, @@ -283,7 +313,7 @@ impl PeerStoreInner { self.peers.get(peer_id).map_or(None, |info| info.role) } - fn outgoing_candidates(&self, count: usize, ignored: HashSet<&PeerId>) -> Vec { + fn outgoing_candidates(&self, count: usize, ignored: HashSet) -> Vec { let mut candidates = self .peers .iter() @@ -378,6 +408,17 @@ impl PeerStore { } } +#[async_trait::async_trait] +impl PeerStoreT for PeerStore { + fn handle(&self) -> Arc { + Arc::new(self.handle()) + } + + async fn run(self) { + self.run().await; + } +} + #[cfg(test)] mod tests { use super::PeerInfo; @@ -421,7 +462,7 @@ mod tests { #[test] fn decaying_max_reputation_finally_yields_zero() { const INITIAL_REPUTATION: i32 = i32::MAX; - const SECONDS: u64 = 1000; + const SECONDS: u64 = 3544; let mut peer_info = PeerInfo::default(); peer_info.reputation = INITIAL_REPUTATION; @@ -436,7 +477,7 @@ mod tests { #[test] fn decaying_min_reputation_finally_yields_zero() { const INITIAL_REPUTATION: i32 = i32::MIN; - const SECONDS: u64 = 1000; + const SECONDS: u64 = 3544; let mut peer_info = PeerInfo::default(); peer_info.reputation = INITIAL_REPUTATION; diff --git a/substrate/client/network/src/protocol.rs b/substrate/client/network/src/protocol.rs index 73b1cd97279637380a24ebdfddcd3378aad819cb..2e57ff1b6a86f7512acd704c755692daeec51a0f 100644 --- a/substrate/client/network/src/protocol.rs +++ b/substrate/client/network/src/protocol.rs @@ -18,9 +18,9 @@ use crate::{ config, error, - peer_store::{PeerStoreHandle, PeerStoreProvider}, + peer_store::PeerStoreProvider, protocol_controller::{self, SetId}, - service::traits::Direction, + service::{metrics::NotificationMetrics, traits::Direction}, types::ProtocolName, }; @@ -36,14 +36,13 @@ use libp2p::{ use log::warn; use codec::DecodeAll; -use prometheus_endpoint::Registry; use sc_network_common::role::Roles; use sc_utils::mpsc::TracingUnboundedReceiver; use sp_runtime::traits::Block as BlockT; -use std::{collections::HashSet, iter, task::Poll}; +use std::{collections::HashSet, iter, sync::Arc, task::Poll}; -use notifications::{metrics, Notifications, NotificationsOut}; +use notifications::{Notifications, NotificationsOut}; pub(crate) use notifications::ProtocolHandle; @@ -69,7 +68,7 @@ pub struct Protocol { /// List of notifications protocols that have been registered. notification_protocols: Vec, /// Handle to `PeerStore`. - peer_store_handle: PeerStoreHandle, + peer_store_handle: Arc, /// Streams for peers whose handshake couldn't be determined. bad_handshake_streams: HashSet, sync_handle: ProtocolHandle, @@ -80,10 +79,10 @@ impl Protocol { /// Create a new instance. pub(crate) fn new( roles: Roles, - registry: &Option, + notification_metrics: NotificationMetrics, notification_protocols: Vec, block_announces_protocol: config::NonDefaultSetConfig, - peer_store_handle: PeerStoreHandle, + peer_store_handle: Arc, protocol_controller_handles: Vec, from_protocol_controllers: TracingUnboundedReceiver, ) -> error::Result<(Self, Vec)> { @@ -122,16 +121,15 @@ impl Protocol { })) .unzip(); - let metrics = registry.as_ref().and_then(|registry| metrics::register(®istry).ok()); handles.iter_mut().for_each(|handle| { - handle.set_metrics(metrics.clone()); + handle.set_metrics(notification_metrics.clone()); }); ( Notifications::new( protocol_controller_handles, from_protocol_controllers, - metrics, + notification_metrics, protocol_configs.into_iter(), ), installed_protocols, @@ -179,7 +177,7 @@ impl Protocol { fn role_available(&self, peer_id: &PeerId, handshake: &Vec) -> bool { match Roles::decode_all(&mut &handshake[..]) { Ok(_) => true, - Err(_) => self.peer_store_handle.peer_role(&peer_id).is_some(), + Err(_) => self.peer_store_handle.peer_role(&((*peer_id).into())).is_some(), } } } diff --git a/substrate/client/network/src/protocol/notifications.rs b/substrate/client/network/src/protocol/notifications.rs index 8becc1390e7d479b8386d17c03ca73adfc0b127e..10fa329097d1b662350d50aee9ddf77de0d09e21 100644 --- a/substrate/client/network/src/protocol/notifications.rs +++ b/substrate/client/network/src/protocol/notifications.rs @@ -25,7 +25,7 @@ pub use self::{ service::{notification_service, ProtocolHandlePair}, }; -pub(crate) use self::service::{metrics, ProtocolHandle}; +pub(crate) use self::service::ProtocolHandle; mod behaviour; mod handler; diff --git a/substrate/client/network/src/protocol/notifications/behaviour.rs b/substrate/client/network/src/protocol/notifications/behaviour.rs index 9ad41e376e824835cdb0be883b3c0f344218ed11..03ba437a66726caf6c284fc3863c4aca01118488 100644 --- a/substrate/client/network/src/protocol/notifications/behaviour.rs +++ b/substrate/client/network/src/protocol/notifications/behaviour.rs @@ -19,10 +19,13 @@ use crate::{ protocol::notifications::{ handler::{self, NotificationsSink, NotifsHandler, NotifsHandlerIn, NotifsHandlerOut}, - service::{metrics, NotificationCommand, ProtocolHandle, ValidationCallResult}, + service::{NotificationCommand, ProtocolHandle, ValidationCallResult}, }, protocol_controller::{self, IncomingIndex, Message, SetId}, - service::traits::{Direction, ValidationResult}, + service::{ + metrics::NotificationMetrics, + traits::{Direction, ValidationResult}, + }, types::ProtocolName, }; @@ -167,7 +170,7 @@ pub struct Notifications { pending_inbound_validations: FuturesUnordered, /// Metrics for notifications. - metrics: Option, + metrics: NotificationMetrics, } /// Configuration for a notifications protocol. @@ -404,7 +407,7 @@ impl Notifications { pub(crate) fn new( protocol_controller_handles: Vec, from_protocol_controllers: TracingUnboundedReceiver, - metrics: Option, + metrics: NotificationMetrics, notif_protocols: impl Iterator< Item = ( ProtocolConfig, @@ -1230,7 +1233,7 @@ impl NetworkBehaviour for Notifications { send_back_addr: remote_addr.clone(), }, self.notif_protocols.clone(), - self.metrics.clone(), + Some(self.metrics.clone()), )) } @@ -1245,7 +1248,7 @@ impl NetworkBehaviour for Notifications { peer, ConnectedPoint::Dialer { address: addr.clone(), role_override }, self.notif_protocols.clone(), - self.metrics.clone(), + Some(self.metrics.clone()), )) } @@ -2442,7 +2445,7 @@ mod tests { reserved_only: false, }, to_notifications, - Box::new(MockPeerStore {}), + Arc::new(MockPeerStore {}), ); let (notif_handle, command_stream) = protocol_handle_pair.split(); @@ -2450,7 +2453,7 @@ mod tests { Notifications::new( vec![handle], from_controller, - None, + NotificationMetrics::new(None), iter::once(( ProtocolConfig { name: "/foo".into(), @@ -2668,7 +2671,7 @@ mod tests { // // there is not straight-forward way of adding backoff to `PeerState::Disabled` // so manually adjust the value in order to progress on to the next stage. - // This modification together with `ConnectionClosed` will conver the peer + // This modification together with `ConnectionClosed` will convert the peer // state into `PeerState::Backoff`. if let Some(PeerState::Disabled { ref mut backoff_until, .. }) = notif.peers.get_mut(&(peer, set_id)) diff --git a/substrate/client/network/src/protocol/notifications/handler.rs b/substrate/client/network/src/protocol/notifications/handler.rs index 28662be29feede2ef67f150d6fa1b67ff313ae36..cb09583b73a2d32592fa6b70180779ba52c3de01 100644 --- a/substrate/client/network/src/protocol/notifications/handler.rs +++ b/substrate/client/network/src/protocol/notifications/handler.rs @@ -58,13 +58,11 @@ //! [`NotifsHandlerIn::Open`] has gotten an answer. use crate::{ - protocol::notifications::{ - service::metrics, - upgrade::{ - NotificationsIn, NotificationsInSubstream, NotificationsOut, NotificationsOutSubstream, - UpgradeCollec, - }, + protocol::notifications::upgrade::{ + NotificationsIn, NotificationsInSubstream, NotificationsOut, NotificationsOutSubstream, + UpgradeCollec, }, + service::metrics::NotificationMetrics, types::ProtocolName, }; @@ -131,7 +129,7 @@ pub struct NotifsHandler { >, /// Metrics. - metrics: Option>, + metrics: Option>, } impl NotifsHandler { @@ -140,7 +138,7 @@ impl NotifsHandler { peer_id: PeerId, endpoint: ConnectedPoint, protocols: Vec, - metrics: Option, + metrics: Option, ) -> Self { Self { protocols: protocols @@ -211,7 +209,7 @@ enum State { /// consequently trying to open the various notifications substreams. /// /// A [`NotifsHandlerOut::OpenResultOk`] or a [`NotifsHandlerOut::OpenResultErr`] event must - /// be emitted when transitionning to respectively [`State::Open`] or [`State::Closed`]. + /// be emitted when transitioning to respectively [`State::Open`] or [`State::Closed`]. Opening { /// Substream opened by the remote. If `Some`, has been accepted. in_substream: Option>, @@ -345,7 +343,7 @@ pub enum NotifsHandlerOut { #[derive(Debug, Clone)] pub struct NotificationsSink { inner: Arc, - metrics: Option>, + metrics: Option>, } impl NotificationsSink { @@ -372,7 +370,7 @@ impl NotificationsSink { } /// Get reference to metrics. - pub fn metrics(&self) -> &Option> { + pub fn metrics(&self) -> &Option> { &self.metrics } } @@ -799,6 +797,9 @@ impl ConnectionHandler for NotifsHandler { // performed before the code paths that can produce `Ready` (with some rare exceptions). // Importantly, however, the flush is performed *after* notifications are queued with // `Sink::start_send`. + // Note that we must call `poll_flush` on all substreams and not only on those we + // have called `Sink::start_send` on, because `NotificationsOutSubstream::poll_flush` + // also reports the substream termination (even if no data was written into it). for protocol_index in 0..self.protocols.len() { match &mut self.protocols[protocol_index].state { State::Open { out_substream: out_substream @ Some(_), .. } => { @@ -841,7 +842,7 @@ impl ConnectionHandler for NotifsHandler { State::OpenDesiredByRemote { in_substream, pending_opening } => match NotificationsInSubstream::poll_process(Pin::new(in_substream), cx) { Poll::Pending => {}, - Poll::Ready(Ok(void)) => match void {}, + Poll::Ready(Ok(())) => {}, Poll::Ready(Err(_)) => { self.protocols[protocol_index].state = State::Closed { pending_opening: *pending_opening }; @@ -857,7 +858,7 @@ impl ConnectionHandler for NotifsHandler { cx, ) { Poll::Pending => {}, - Poll::Ready(Ok(void)) => match void {}, + Poll::Ready(Ok(())) => {}, Poll::Ready(Err(_)) => *in_substream = None, }, } diff --git a/substrate/client/network/src/protocol/notifications/service/metrics.rs b/substrate/client/network/src/protocol/notifications/service/metrics.rs index 2a57d57c17576fde27be047d747c94fdd19e64e5..f24f73fc5567cfa64d5ed2d3600598d6d2416a1f 100644 --- a/substrate/client/network/src/protocol/notifications/service/metrics.rs +++ b/substrate/client/network/src/protocol/notifications/service/metrics.rs @@ -16,115 +16,40 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -use crate::types::ProtocolName; - -use prometheus_endpoint::{ - self as prometheus, CounterVec, HistogramOpts, HistogramVec, Opts, PrometheusError, Registry, - U64, -}; - -use std::sync::Arc; - -/// Notification metrics. -#[derive(Debug, Clone)] -pub struct Metrics { - // Total number of opened substreams. - pub notifications_streams_opened_total: CounterVec, - - /// Total number of closed substreams. - pub notifications_streams_closed_total: CounterVec, - - /// In/outbound notification sizes. - pub notifications_sizes: HistogramVec, -} - -impl Metrics { - fn register(registry: &Registry) -> Result { - Ok(Self { - notifications_sizes: prometheus::register( - HistogramVec::new( - HistogramOpts { - common_opts: Opts::new( - "substrate_sub_libp2p_notifications_sizes", - "Sizes of the notifications send to and received from all nodes", - ), - buckets: prometheus::exponential_buckets(64.0, 4.0, 8) - .expect("parameters are always valid values; qed"), - }, - &["direction", "protocol"], - )?, - registry, - )?, - notifications_streams_closed_total: prometheus::register( - CounterVec::new( - Opts::new( - "substrate_sub_libp2p_notifications_streams_closed_total", - "Total number of notification substreams that have been closed", - ), - &["protocol"], - )?, - registry, - )?, - notifications_streams_opened_total: prometheus::register( - CounterVec::new( - Opts::new( - "substrate_sub_libp2p_notifications_streams_opened_total", - "Total number of notification substreams that have been opened", - ), - &["protocol"], - )?, - registry, - )?, - }) - } -} - -/// Register metrics. -pub fn register(registry: &Registry) -> Result { - Metrics::register(registry) -} +use crate::{service::metrics::NotificationMetrics, types::ProtocolName}; /// Register opened substream to Prometheus. -pub fn register_substream_opened(metrics: &Option, protocol: &ProtocolName) { +pub fn register_substream_opened(metrics: &Option, protocol: &ProtocolName) { if let Some(metrics) = metrics { - metrics.notifications_streams_opened_total.with_label_values(&[&protocol]).inc(); + metrics.register_substream_opened(&protocol); } } /// Register closed substream to Prometheus. -pub fn register_substream_closed(metrics: &Option, protocol: &ProtocolName) { +pub fn register_substream_closed(metrics: &Option, protocol: &ProtocolName) { if let Some(metrics) = metrics { - metrics - .notifications_streams_closed_total - .with_label_values(&[&protocol[..]]) - .inc(); + metrics.register_substream_closed(&protocol); } } /// Register sent notification to Prometheus. pub fn register_notification_sent( - metrics: &Option>, + metrics: &Option>, protocol: &ProtocolName, size: usize, ) { if let Some(metrics) = metrics { - metrics - .notifications_sizes - .with_label_values(&["out", protocol]) - .observe(size as f64); + metrics.register_notification_sent(protocol, size); } } /// Register received notification to Prometheus. pub fn register_notification_received( - metrics: &Option, + metrics: &Option, protocol: &ProtocolName, size: usize, ) { if let Some(metrics) = metrics { - metrics - .notifications_sizes - .with_label_values(&["in", protocol]) - .observe(size as f64); + metrics.register_notification_received(protocol, size); } } diff --git a/substrate/client/network/src/protocol/notifications/service/mod.rs b/substrate/client/network/src/protocol/notifications/service/mod.rs index 62e6d88a3d5a6ae36b46728a37dc3ff5c31177db..15d289d170ee83e52476d4b5a1c5a10bde3274c8 100644 --- a/substrate/client/network/src/protocol/notifications/service/mod.rs +++ b/substrate/client/network/src/protocol/notifications/service/mod.rs @@ -21,17 +21,20 @@ use crate::{ error, protocol::notifications::handler::NotificationsSink, - service::traits::{ - Direction, MessageSink, NotificationEvent, NotificationService, ValidationResult, + service::{ + metrics::NotificationMetrics, + traits::{ + Direction, MessageSink, NotificationEvent, NotificationService, ValidationResult, + }, }, types::ProtocolName, + PeerId, }; use futures::{ stream::{FuturesUnordered, Stream}, StreamExt, }; -use libp2p::PeerId; use parking_lot::Mutex; use tokio::sync::{mpsc, oneshot}; use tokio_stream::wrappers::ReceiverStream; @@ -54,7 +57,7 @@ const COMMAND_QUEUE_SIZE: usize = 64; /// Type representing subscribers of a notification protocol. type Subscribers = Arc>>>; -/// Type represending a distributable message sink. +/// Type representing a distributable message sink. /// Detached message sink must carry the protocol name for registering metrics. /// /// See documentation for [`PeerContext`] for more details. @@ -66,7 +69,7 @@ impl MessageSink for NotificationSink { fn send_sync_notification(&self, notification: Vec) { let sink = self.lock(); - metrics::register_notification_sent(&sink.0.metrics(), &sink.1, notification.len()); + metrics::register_notification_sent(sink.0.metrics(), &sink.1, notification.len()); sink.0.send_sync_notification(notification); } @@ -87,7 +90,7 @@ impl MessageSink for NotificationSink { .map_err(|_| error::Error::ConnectionClosed)?; permit.send(notification).map_err(|_| error::Error::ChannelClosed).map(|res| { - metrics::register_notification_sent(&sink.0.metrics(), &sink.1, notification_len); + metrics::register_notification_sent(sink.0.metrics(), &sink.1, notification_len); res }) } @@ -175,11 +178,11 @@ pub enum NotificationCommand { /// and an additional, distributable `NotificationsSink` which the protocol may acquire /// if it wishes to send notifications through `NotificationsSink` directly. /// -/// The distributable `NoticationsSink` is wrapped in an `Arc>` to allow +/// The distributable `NotificationsSink` is wrapped in an `Arc>` to allow /// `NotificationsService` to swap the underlying sink in case it's replaced. #[derive(Debug, Clone)] struct PeerContext { - /// Sink for sending notificaitons. + /// Sink for sending notifications. sink: NotificationsSink, /// Distributable notification sink. @@ -220,20 +223,20 @@ impl NotificationHandle { #[async_trait::async_trait] impl NotificationService for NotificationHandle { /// Instruct `Notifications` to open a new substream for `peer`. - async fn open_substream(&mut self, _peer: PeerId) -> Result<(), ()> { + async fn open_substream(&mut self, _peer: sc_network_types::PeerId) -> Result<(), ()> { todo!("support for opening substreams not implemented yet"); } /// Instruct `Notifications` to close substream for `peer`. - async fn close_substream(&mut self, _peer: PeerId) -> Result<(), ()> { + async fn close_substream(&mut self, _peer: sc_network_types::PeerId) -> Result<(), ()> { todo!("support for closing substreams not implemented yet, call `NetworkService::disconnect_peer()` instead"); } /// Send synchronous `notification` to `peer`. - fn send_sync_notification(&self, peer: &PeerId, notification: Vec) { - if let Some(info) = self.peers.get(&peer) { + fn send_sync_notification(&mut self, peer: &sc_network_types::PeerId, notification: Vec) { + if let Some(info) = self.peers.get(&((*peer).into())) { metrics::register_notification_sent( - &info.sink.metrics(), + info.sink.metrics(), &self.protocol, notification.len(), ); @@ -244,12 +247,16 @@ impl NotificationService for NotificationHandle { /// Send asynchronous `notification` to `peer`, allowing sender to exercise backpressure. async fn send_async_notification( - &self, - peer: &PeerId, + &mut self, + peer: &sc_network_types::PeerId, notification: Vec, ) -> Result<(), error::Error> { let notification_len = notification.len(); - let sink = &self.peers.get(&peer).ok_or_else(|| error::Error::PeerDoesntExist(*peer))?.sink; + let sink = &self + .peers + .get(&peer.into()) + .ok_or_else(|| error::Error::PeerDoesntExist((*peer).into()))? + .sink; sink.reserve_notification() .await @@ -258,7 +265,7 @@ impl NotificationService for NotificationHandle { .map_err(|_| error::Error::ChannelClosed) .map(|res| { metrics::register_notification_sent( - &sink.metrics(), + sink.metrics(), &self.protocol, notification_len, ); @@ -288,7 +295,7 @@ impl NotificationService for NotificationHandle { match self.rx.next().await? { InnerNotificationEvent::ValidateInboundSubstream { peer, handshake, result_tx } => return Some(NotificationEvent::ValidateInboundSubstream { - peer, + peer: peer.into(), handshake, result_tx, }), @@ -307,7 +314,7 @@ impl NotificationService for NotificationHandle { }, ); return Some(NotificationEvent::NotificationStreamOpened { - peer, + peer: peer.into(), handshake, direction, negotiated_fallback, @@ -315,10 +322,13 @@ impl NotificationService for NotificationHandle { }, InnerNotificationEvent::NotificationStreamClosed { peer } => { self.peers.remove(&peer); - return Some(NotificationEvent::NotificationStreamClosed { peer }) + return Some(NotificationEvent::NotificationStreamClosed { peer: peer.into() }) }, InnerNotificationEvent::NotificationReceived { peer, notification } => - return Some(NotificationEvent::NotificationReceived { peer, notification }), + return Some(NotificationEvent::NotificationReceived { + peer: peer.into(), + notification, + }), InnerNotificationEvent::NotificationSinkReplaced { peer, sink } => { match self.peers.get_mut(&peer) { None => log::error!( @@ -338,7 +348,8 @@ impl NotificationService for NotificationHandle { // Clone [`NotificationService`] fn clone(&mut self) -> Result, ()> { let mut subscribers = self.subscribers.lock(); - let (event_tx, event_rx) = tracing_unbounded("mpsc-notification-to-protocol", 100_000); + + let (event_tx, event_rx) = tracing_unbounded(self.rx.name(), 100_000); subscribers.push(event_tx); Ok(Box::new(NotificationHandle { @@ -356,8 +367,8 @@ impl NotificationService for NotificationHandle { } /// Get message sink of the peer. - fn message_sink(&self, peer: &PeerId) -> Option> { - match self.peers.get(peer) { + fn message_sink(&self, peer: &sc_network_types::PeerId) -> Option> { + match self.peers.get(&peer.into()) { Some(context) => Some(Box::new(context.shared_sink.clone())), None => None, } @@ -416,7 +427,7 @@ pub(crate) struct ProtocolHandle { delegate_to_peerset: bool, /// Prometheus metrics. - metrics: Option, + metrics: Option, } pub(crate) enum ValidationCallResult { @@ -431,8 +442,8 @@ impl ProtocolHandle { } /// Set metrics. - pub fn set_metrics(&mut self, metrics: Option) { - self.metrics = metrics; + pub fn set_metrics(&mut self, metrics: NotificationMetrics) { + self.metrics = Some(metrics); } /// Delegate validation to `Peerset`. @@ -624,7 +635,9 @@ pub fn notification_service( protocol: ProtocolName, ) -> (ProtocolHandlePair, Box) { let (cmd_tx, cmd_rx) = mpsc::channel(COMMAND_QUEUE_SIZE); - let (event_tx, event_rx) = tracing_unbounded("mpsc-notification-to-protocol", 100_000); + + let (event_tx, event_rx) = + tracing_unbounded(metric_label_for_protocol(&protocol).leak(), 100_000); let subscribers = Arc::new(Mutex::new(vec![event_tx])); ( @@ -632,3 +645,14 @@ pub fn notification_service( Box::new(NotificationHandle::new(protocol.clone(), cmd_tx, event_rx, subscribers)), ) } + +// Decorates the mpsc-notification-to-protocol metric with the name of the protocol, +// to be able to distiguish between different protocols in dashboards. +fn metric_label_for_protocol(protocol: &ProtocolName) -> String { + let protocol_name = protocol.to_string(); + let keys = protocol_name.split("/").collect::>(); + keys.iter() + .rev() + .take(2) // Last two tokens give the protocol name and version + .fold("mpsc-notification-to-protocol".into(), |acc, val| format!("{}-{}", acc, val)) +} diff --git a/substrate/client/network/src/protocol/notifications/service/tests.rs b/substrate/client/network/src/protocol/notifications/service/tests.rs index 02ba9e1711c3856df095c8a31688e3388bf0bb00..f0157f6d28dd10d7382427b7464e4f478d912c03 100644 --- a/substrate/client/network/src/protocol/notifications/service/tests.rs +++ b/substrate/client/network/src/protocol/notifications/service/tests.rs @@ -38,7 +38,7 @@ async fn validate_and_accept_substream() { if let Some(NotificationEvent::ValidateInboundSubstream { peer, handshake, result_tx }) = notif.next_event().await { - assert_eq!(peer_id, peer); + assert_eq!(peer_id, peer.into()); assert_eq!(handshake, vec![1, 3, 3, 7]); let _ = result_tx.send(ValidationResult::Accept).unwrap(); } else { @@ -66,7 +66,7 @@ async fn substream_opened() { direction, }) = notif.next_event().await { - assert_eq!(peer_id, peer); + assert_eq!(peer_id, peer.into()); assert_eq!(negotiated_fallback, None); assert_eq!(handshake, vec![1, 3, 3, 7]); assert_eq!(direction, Direction::Inbound); @@ -92,7 +92,7 @@ async fn send_sync_notification() { if let Some(NotificationEvent::ValidateInboundSubstream { peer, handshake, result_tx }) = notif.next_event().await { - assert_eq!(peer_id, peer); + assert_eq!(peer_id, peer.into()); assert_eq!(handshake, vec![1, 3, 3, 7]); let _ = result_tx.send(ValidationResult::Accept).unwrap(); } else { @@ -112,7 +112,7 @@ async fn send_sync_notification() { direction, }) = notif.next_event().await { - assert_eq!(peer_id, peer); + assert_eq!(peer_id, peer.into()); assert_eq!(negotiated_fallback, None); assert_eq!(handshake, vec![1, 3, 3, 7]); assert_eq!(direction, Direction::Inbound); @@ -120,7 +120,7 @@ async fn send_sync_notification() { panic!("invalid event received"); } - notif.send_sync_notification(&peer_id, vec![1, 3, 3, 8]); + notif.send_sync_notification(&peer_id.into(), vec![1, 3, 3, 8]); assert_eq!( sync_rx.next().await, Some(NotificationsSinkMessage::Notification { message: vec![1, 3, 3, 8] }) @@ -144,7 +144,7 @@ async fn send_async_notification() { if let Some(NotificationEvent::ValidateInboundSubstream { peer, handshake, result_tx }) = notif.next_event().await { - assert_eq!(peer_id, peer); + assert_eq!(peer_id, peer.into()); assert_eq!(handshake, vec![1, 3, 3, 7]); let _ = result_tx.send(ValidationResult::Accept).unwrap(); } else { @@ -164,7 +164,7 @@ async fn send_async_notification() { direction, }) = notif.next_event().await { - assert_eq!(peer_id, peer); + assert_eq!(peer_id, peer.into()); assert_eq!(negotiated_fallback, None); assert_eq!(handshake, vec![1, 3, 3, 7]); assert_eq!(direction, Direction::Inbound); @@ -172,7 +172,7 @@ async fn send_async_notification() { panic!("invalid event received"); } - notif.send_async_notification(&peer_id, vec![1, 3, 3, 9]).await.unwrap(); + notif.send_async_notification(&peer_id.into(), vec![1, 3, 3, 9]).await.unwrap(); assert_eq!( async_rx.next().await, Some(NotificationsSinkMessage::Notification { message: vec![1, 3, 3, 9] }) @@ -181,24 +181,24 @@ async fn send_async_notification() { #[tokio::test] async fn send_sync_notification_to_non_existent_peer() { - let (proto, notif) = notification_service("/proto/1".into()); + let (proto, mut notif) = notification_service("/proto/1".into()); let (_sink, _, _sync_rx) = NotificationsSink::new(PeerId::random()); let (_handle, _stream) = proto.split(); let peer = PeerId::random(); // as per the original implementation, the call doesn't fail - notif.send_sync_notification(&peer, vec![1, 3, 3, 7]) + notif.send_sync_notification(&peer.into(), vec![1, 3, 3, 7]) } #[tokio::test] async fn send_async_notification_to_non_existent_peer() { - let (proto, notif) = notification_service("/proto/1".into()); + let (proto, mut notif) = notification_service("/proto/1".into()); let (_sink, _, _sync_rx) = NotificationsSink::new(PeerId::random()); let (_handle, _stream) = proto.split(); let peer = PeerId::random(); if let Err(error::Error::PeerDoesntExist(peer_id)) = - notif.send_async_notification(&peer, vec![1, 3, 3, 7]).await + notif.send_async_notification(&peer.into(), vec![1, 3, 3, 7]).await { assert_eq!(peer, peer_id); } else { @@ -223,7 +223,7 @@ async fn receive_notification() { if let Some(NotificationEvent::ValidateInboundSubstream { peer, handshake, result_tx }) = notif.next_event().await { - assert_eq!(peer_id, peer); + assert_eq!(peer_id, peer.into()); assert_eq!(handshake, vec![1, 3, 3, 7]); let _ = result_tx.send(ValidationResult::Accept).unwrap(); } else { @@ -243,7 +243,7 @@ async fn receive_notification() { direction, }) = notif.next_event().await { - assert_eq!(peer_id, peer); + assert_eq!(peer_id, peer.into()); assert_eq!(negotiated_fallback, None); assert_eq!(handshake, vec![1, 3, 3, 7]); assert_eq!(direction, Direction::Inbound); @@ -257,7 +257,7 @@ async fn receive_notification() { if let Some(NotificationEvent::NotificationReceived { peer, notification }) = notif.next_event().await { - assert_eq!(peer_id, peer); + assert_eq!(peer_id, peer.into()); assert_eq!(notification, vec![1, 3, 3, 8]); } else { panic!("invalid event received"); @@ -281,7 +281,7 @@ async fn backpressure_works() { if let Some(NotificationEvent::ValidateInboundSubstream { peer, handshake, result_tx }) = notif.next_event().await { - assert_eq!(peer_id, peer); + assert_eq!(peer_id, peer.into()); assert_eq!(handshake, vec![1, 3, 3, 7]); let _ = result_tx.send(ValidationResult::Accept).unwrap(); } else { @@ -301,7 +301,7 @@ async fn backpressure_works() { direction, }) = notif.next_event().await { - assert_eq!(peer_id, peer); + assert_eq!(peer_id, peer.into()); assert_eq!(negotiated_fallback, None); assert_eq!(handshake, vec![1, 3, 3, 7]); assert_eq!(direction, Direction::Inbound); @@ -311,12 +311,15 @@ async fn backpressure_works() { // fill the message buffer with messages for i in 0..=ASYNC_NOTIFICATIONS_BUFFER_SIZE { - assert!(futures::poll!(notif.send_async_notification(&peer_id, vec![1, 3, 3, i as u8])) - .is_ready()); + assert!(futures::poll!( + notif.send_async_notification(&peer_id.into(), vec![1, 3, 3, i as u8]) + ) + .is_ready()); } // try to send one more message and verify that the call blocks - assert!(futures::poll!(notif.send_async_notification(&peer_id, vec![1, 3, 3, 9])).is_pending()); + assert!(futures::poll!(notif.send_async_notification(&peer_id.into(), vec![1, 3, 3, 9])) + .is_pending()); // release one slot from the buffer for new message assert_eq!( @@ -325,7 +328,9 @@ async fn backpressure_works() { ); // verify that a message can be sent - assert!(futures::poll!(notif.send_async_notification(&peer_id, vec![1, 3, 3, 9])).is_ready()); + assert!( + futures::poll!(notif.send_async_notification(&peer_id.into(), vec![1, 3, 3, 9])).is_ready() + ); } #[tokio::test] @@ -345,7 +350,7 @@ async fn peer_disconnects_then_sync_notification_is_sent() { if let Some(NotificationEvent::ValidateInboundSubstream { peer, handshake, result_tx }) = notif.next_event().await { - assert_eq!(peer_id, peer); + assert_eq!(peer_id, peer.into()); assert_eq!(handshake, vec![1, 3, 3, 7]); let _ = result_tx.send(ValidationResult::Accept).unwrap(); } else { @@ -365,7 +370,7 @@ async fn peer_disconnects_then_sync_notification_is_sent() { direction, }) = notif.next_event().await { - assert_eq!(peer_id, peer); + assert_eq!(peer_id, peer.into()); assert_eq!(negotiated_fallback, None); assert_eq!(handshake, vec![1, 3, 3, 7]); assert_eq!(direction, Direction::Inbound); @@ -379,7 +384,7 @@ async fn peer_disconnects_then_sync_notification_is_sent() { drop(sync_rx); // as per documentation, error is not reported but the notification is silently dropped - notif.send_sync_notification(&peer_id, vec![1, 3, 3, 7]); + notif.send_sync_notification(&peer_id.into(), vec![1, 3, 3, 7]); } #[tokio::test] @@ -399,7 +404,7 @@ async fn peer_disconnects_then_async_notification_is_sent() { if let Some(NotificationEvent::ValidateInboundSubstream { peer, handshake, result_tx }) = notif.next_event().await { - assert_eq!(peer_id, peer); + assert_eq!(peer_id, peer.into()); assert_eq!(handshake, vec![1, 3, 3, 7]); let _ = result_tx.send(ValidationResult::Accept).unwrap(); } else { @@ -419,7 +424,7 @@ async fn peer_disconnects_then_async_notification_is_sent() { direction, }) = notif.next_event().await { - assert_eq!(peer_id, peer); + assert_eq!(peer_id, peer.into()); assert_eq!(negotiated_fallback, None); assert_eq!(handshake, vec![1, 3, 3, 7]); assert_eq!(direction, Direction::Inbound); @@ -434,10 +439,10 @@ async fn peer_disconnects_then_async_notification_is_sent() { // as per documentation, error is not reported but the notification is silently dropped if let Err(error::Error::ConnectionClosed) = - notif.send_async_notification(&peer_id, vec![1, 3, 3, 7]).await + notif.send_async_notification(&peer_id.into(), vec![1, 3, 3, 7]).await { } else { - panic!("invalid state after calling `send_async_notificatio()` on closed connection") + panic!("invalid state after calling `send_async_notification()` on closed connection") } } @@ -460,7 +465,7 @@ async fn cloned_service_opening_substream_works() { if let Some(NotificationEvent::ValidateInboundSubstream { peer, handshake, result_tx }) = notif1.next_event().await { - assert_eq!(peer_id, peer); + assert_eq!(peer_id, peer.into()); assert_eq!(handshake, vec![1, 3, 3, 7]); let _ = result_tx.send(ValidationResult::Accept).unwrap(); } else { @@ -475,7 +480,7 @@ async fn cloned_service_opening_substream_works() { if let Some(NotificationEvent::ValidateInboundSubstream { peer, handshake, result_tx }) = notif2.next_event().await { - assert_eq!(peer_id, peer); + assert_eq!(peer_id, peer.into()); assert_eq!(handshake, vec![1, 3, 3, 7]); result_tx.send(ValidationResult::Accept).unwrap(); } else { @@ -505,7 +510,7 @@ async fn cloned_service_one_service_rejects_substream() { if let Some(NotificationEvent::ValidateInboundSubstream { peer, handshake, result_tx }) = notif.next_event().await { - assert_eq!(peer_id, peer); + assert_eq!(peer_id, peer.into()); assert_eq!(handshake, vec![1, 3, 3, 7]); let _ = result_tx.send(ValidationResult::Accept).unwrap(); } else { @@ -519,7 +524,7 @@ async fn cloned_service_one_service_rejects_substream() { if let Some(NotificationEvent::ValidateInboundSubstream { peer, handshake, result_tx }) = notif3.next_event().await { - assert_eq!(peer_id, peer); + assert_eq!(peer_id, peer.into()); assert_eq!(handshake, vec![1, 3, 3, 7]); let _ = result_tx.send(ValidationResult::Reject).unwrap(); } else { @@ -549,7 +554,7 @@ async fn cloned_service_opening_substream_sending_and_receiving_notifications_wo if let Some(NotificationEvent::ValidateInboundSubstream { peer, handshake, result_tx }) = notif.next_event().await { - assert_eq!(peer_id, peer); + assert_eq!(peer_id, peer.into()); assert_eq!(handshake, vec![1, 3, 3, 7]); let _ = result_tx.send(ValidationResult::Accept).unwrap(); } else { @@ -571,7 +576,7 @@ async fn cloned_service_opening_substream_sending_and_receiving_notifications_wo direction, }) = notif.next_event().await { - assert_eq!(peer_id, peer); + assert_eq!(peer_id, peer.into()); assert_eq!(negotiated_fallback, None); assert_eq!(handshake, vec![1, 3, 3, 7]); assert_eq!(direction, Direction::Inbound); @@ -586,16 +591,16 @@ async fn cloned_service_opening_substream_sending_and_receiving_notifications_wo if let Some(NotificationEvent::NotificationReceived { peer, notification }) = notif.next_event().await { - assert_eq!(peer_id, peer); + assert_eq!(peer_id, peer.into()); assert_eq!(notification, vec![1, 3, 3, 8]); } else { panic!("invalid event received"); } } - for (i, notif) in vec![&mut notif1, &mut notif2, &mut notif3].iter().enumerate() { + for (i, notif) in vec![&mut notif1, &mut notif2, &mut notif3].iter_mut().enumerate() { // send notification from each service and verify peer receives it - notif.send_sync_notification(&peer_id, vec![1, 3, 3, i as u8]); + notif.send_sync_notification(&peer_id.into(), vec![1, 3, 3, i as u8]); assert_eq!( sync_rx.next().await, Some(NotificationsSinkMessage::Notification { message: vec![1, 3, 3, i as u8] }) @@ -608,7 +613,7 @@ async fn cloned_service_opening_substream_sending_and_receiving_notifications_wo for notif in vec![&mut notif1, &mut notif2, &mut notif3] { if let Some(NotificationEvent::NotificationStreamClosed { peer }) = notif.next_event().await { - assert_eq!(peer_id, peer); + assert_eq!(peer_id, peer.into()); } else { panic!("invalid event received"); } @@ -632,7 +637,7 @@ async fn sending_notifications_using_notifications_sink_works() { if let Some(NotificationEvent::ValidateInboundSubstream { peer, handshake, result_tx }) = notif.next_event().await { - assert_eq!(peer_id, peer); + assert_eq!(peer_id, peer.into()); assert_eq!(handshake, vec![1, 3, 3, 7]); let _ = result_tx.send(ValidationResult::Accept).unwrap(); } else { @@ -652,7 +657,7 @@ async fn sending_notifications_using_notifications_sink_works() { direction, }) = notif.next_event().await { - assert_eq!(peer_id, peer); + assert_eq!(peer_id, peer.into()); assert_eq!(negotiated_fallback, None); assert_eq!(handshake, vec![1, 3, 3, 7]); assert_eq!(direction, Direction::Inbound); @@ -661,7 +666,7 @@ async fn sending_notifications_using_notifications_sink_works() { } // get a copy of the notification sink and send a synchronous notification using. - let sink = notif.message_sink(&peer_id).unwrap(); + let sink = notif.message_sink(&peer_id.into()).unwrap(); sink.send_sync_notification(vec![1, 3, 3, 6]); // send an asynchronous notification using the acquired notifications sink. @@ -677,8 +682,8 @@ async fn sending_notifications_using_notifications_sink_works() { ); // send notifications using the stored notification sink as well. - notif.send_sync_notification(&peer_id, vec![1, 3, 3, 8]); - notif.send_async_notification(&peer_id, vec![1, 3, 3, 9]).await.unwrap(); + notif.send_sync_notification(&peer_id.into(), vec![1, 3, 3, 8]); + notif.send_async_notification(&peer_id.into(), vec![1, 3, 3, 9]).await.unwrap(); assert_eq!( sync_rx.next().await, @@ -693,7 +698,7 @@ async fn sending_notifications_using_notifications_sink_works() { #[test] fn try_to_get_notifications_sink_for_non_existent_peer() { let (_proto, notif) = notification_service("/proto/1".into()); - assert!(notif.message_sink(&PeerId::random()).is_none()); + assert!(notif.message_sink(&sc_network_types::PeerId::random()).is_none()); } #[tokio::test] @@ -713,7 +718,7 @@ async fn notification_sink_replaced() { if let Some(NotificationEvent::ValidateInboundSubstream { peer, handshake, result_tx }) = notif.next_event().await { - assert_eq!(peer_id, peer); + assert_eq!(peer_id, peer.into()); assert_eq!(handshake, vec![1, 3, 3, 7]); let _ = result_tx.send(ValidationResult::Accept).unwrap(); } else { @@ -733,7 +738,7 @@ async fn notification_sink_replaced() { direction, }) = notif.next_event().await { - assert_eq!(peer_id, peer); + assert_eq!(peer_id, peer.into()); assert_eq!(negotiated_fallback, None); assert_eq!(handshake, vec![1, 3, 3, 7]); assert_eq!(direction, Direction::Inbound); @@ -742,7 +747,7 @@ async fn notification_sink_replaced() { } // get a copy of the notification sink and send a synchronous notification using. - let sink = notif.message_sink(&peer_id).unwrap(); + let sink = notif.message_sink(&peer_id.into()).unwrap(); sink.send_sync_notification(vec![1, 3, 3, 6]); // send an asynchronous notification using the acquired notifications sink. @@ -758,8 +763,8 @@ async fn notification_sink_replaced() { ); // send notifications using the stored notification sink as well. - notif.send_sync_notification(&peer_id, vec![1, 3, 3, 8]); - notif.send_async_notification(&peer_id, vec![1, 3, 3, 9]).await.unwrap(); + notif.send_sync_notification(&peer_id.into(), vec![1, 3, 3, 8]); + notif.send_async_notification(&peer_id.into(), vec![1, 3, 3, 9]).await.unwrap(); assert_eq!( sync_rx.next().await, @@ -788,8 +793,8 @@ async fn notification_sink_replaced() { // verify that using the `NotificationService` API automatically results in using the correct // sink - notif.send_sync_notification(&peer_id, vec![1, 3, 3, 8]); - notif.send_async_notification(&peer_id, vec![1, 3, 3, 9]).await.unwrap(); + notif.send_sync_notification(&peer_id.into(), vec![1, 3, 3, 8]); + notif.send_async_notification(&peer_id.into(), vec![1, 3, 3, 9]).await.unwrap(); assert_eq!( new_sync_rx.next().await, diff --git a/substrate/client/network/src/protocol/notifications/tests.rs b/substrate/client/network/src/protocol/notifications/tests.rs index 0178bd75e8b7984e90b4408275a35abe1a4d2acc..a72b5b4a6748f0754279cef3f37dd37f601263dd 100644 --- a/substrate/client/network/src/protocol/notifications/tests.rs +++ b/substrate/client/network/src/protocol/notifications/tests.rs @@ -22,7 +22,10 @@ use crate::{ peer_store::PeerStore, protocol::notifications::{Notifications, NotificationsOut, ProtocolConfig}, protocol_controller::{ProtoSetConfig, ProtocolController, SetId}, - service::traits::{NotificationEvent, ValidationResult}, + service::{ + metrics::NotificationMetrics, + traits::{NotificationEvent, ValidationResult}, + }, }; use futures::{future::BoxFuture, prelude::*}; @@ -40,6 +43,7 @@ use sc_utils::mpsc::tracing_unbounded; use std::{ iter, pin::Pin, + sync::Arc, task::{Context, Poll}, time::Duration, }; @@ -91,7 +95,7 @@ fn build_nodes() -> (Swarm, Swarm) { reserved_only: false, }, to_notifications, - Box::new(peer_store.handle()), + Arc::new(peer_store.handle()), ); let (notif_handle, command_stream) = protocol_handle_pair.split(); @@ -99,7 +103,7 @@ fn build_nodes() -> (Swarm, Swarm) { inner: Notifications::new( vec![controller_handle], from_controller, - None, + NotificationMetrics::new(None), iter::once(( ProtocolConfig { name: "/foo".into(), diff --git a/substrate/client/network/src/protocol/notifications/upgrade/notifications.rs b/substrate/client/network/src/protocol/notifications/upgrade/notifications.rs index 4e1c033f33b68e551fbd98e9c06edcbdd7173b5c..c760b7a963fc156e29165792d7cf145240aa4506 100644 --- a/substrate/client/network/src/protocol/notifications/upgrade/notifications.rs +++ b/substrate/client/network/src/protocol/notifications/upgrade/notifications.rs @@ -44,7 +44,6 @@ use log::{error, warn}; use unsigned_varint::codec::UviBytes; use std::{ - convert::Infallible, io, mem, pin::Pin, task::{Context, Poll}, @@ -188,7 +187,7 @@ where } } -/// Yielded by the [`NotificationsIn`] after a successfuly upgrade. +/// Yielded by the [`NotificationsIn`] after a successfully upgrade. pub struct NotificationsInOpen { /// Handshake sent by the remote. pub handshake: Vec, @@ -223,10 +222,7 @@ where /// Equivalent to `Stream::poll_next`, except that it only drives the handshake and is /// guaranteed to not generate any notification. - pub fn poll_process( - self: Pin<&mut Self>, - cx: &mut Context, - ) -> Poll> { + pub fn poll_process(self: Pin<&mut Self>, cx: &mut Context) -> Poll> { let mut this = self.project(); loop { @@ -248,8 +244,10 @@ where }, NotificationsInSubstreamHandshake::Flush => { match Sink::poll_flush(this.socket.as_mut(), cx)? { - Poll::Ready(()) => - *this.handshake = NotificationsInSubstreamHandshake::Sent, + Poll::Ready(()) => { + *this.handshake = NotificationsInSubstreamHandshake::Sent; + return Poll::Ready(Ok(())); + }, Poll::Pending => { *this.handshake = NotificationsInSubstreamHandshake::Flush; return Poll::Pending @@ -262,7 +260,7 @@ where st @ NotificationsInSubstreamHandshake::ClosingInResponseToRemote | st @ NotificationsInSubstreamHandshake::BothSidesClosed => { *this.handshake = st; - return Poll::Pending + return Poll::Ready(Ok(())); }, } } @@ -415,7 +413,7 @@ where } } -/// Yielded by the [`NotificationsOut`] after a successfuly upgrade. +/// Yielded by the [`NotificationsOut`] after a successfully upgrade. pub struct NotificationsOutOpen { /// Handshake returned by the remote. pub handshake: Vec, @@ -445,6 +443,21 @@ where fn poll_flush(self: Pin<&mut Self>, cx: &mut Context) -> Poll> { let mut this = self.project(); + + // `Sink::poll_flush` does not expose stream closed error until we write something into + // the stream, so the code below makes sure we detect that the substream was closed + // even if we don't write anything into it. + match Stream::poll_next(this.socket.as_mut(), cx) { + Poll::Pending => {}, + Poll::Ready(Some(_)) => { + error!( + target: "sub-libp2p", + "Unexpected incoming data in `NotificationsOutSubstream`", + ); + }, + Poll::Ready(None) => return Poll::Ready(Err(NotificationsOutError::Terminated)), + } + Sink::poll_flush(this.socket.as_mut(), cx).map_err(NotificationsOutError::Io) } @@ -494,13 +507,19 @@ pub enum NotificationsOutError { /// I/O error on the substream. #[error(transparent)] Io(#[from] io::Error), + #[error("substream was closed/reset")] + Terminated, } #[cfg(test)] mod tests { - use super::{NotificationsIn, NotificationsInOpen, NotificationsOut, NotificationsOutOpen}; - use futures::{channel::oneshot, prelude::*}; + use super::{ + NotificationsIn, NotificationsInOpen, NotificationsOut, NotificationsOutError, + NotificationsOutOpen, + }; + use futures::{channel::oneshot, future, prelude::*}; use libp2p::core::upgrade; + use std::{pin::Pin, task::Poll}; use tokio::net::{TcpListener, TcpStream}; use tokio_util::compat::TokioAsyncReadCompatExt; @@ -693,4 +712,95 @@ mod tests { client.await.unwrap(); } + + #[tokio::test] + async fn send_handshake_without_polling_for_incoming_data() { + const PROTO_NAME: &str = "/test/proto/1"; + let (listener_addr_tx, listener_addr_rx) = oneshot::channel(); + + let client = tokio::spawn(async move { + let socket = TcpStream::connect(listener_addr_rx.await.unwrap()).await.unwrap(); + let NotificationsOutOpen { handshake, .. } = upgrade::apply_outbound( + socket.compat(), + NotificationsOut::new(PROTO_NAME, Vec::new(), &b"initial message"[..], 1024 * 1024), + upgrade::Version::V1, + ) + .await + .unwrap(); + + assert_eq!(handshake, b"hello world"); + }); + + let listener = TcpListener::bind("127.0.0.1:0").await.unwrap(); + listener_addr_tx.send(listener.local_addr().unwrap()).unwrap(); + + let (socket, _) = listener.accept().await.unwrap(); + let NotificationsInOpen { handshake, mut substream, .. } = upgrade::apply_inbound( + socket.compat(), + NotificationsIn::new(PROTO_NAME, Vec::new(), 1024 * 1024), + ) + .await + .unwrap(); + + assert_eq!(handshake, b"initial message"); + substream.send_handshake(&b"hello world"[..]); + + // Actually send the handshake. + future::poll_fn(|cx| Pin::new(&mut substream).poll_process(cx)).await.unwrap(); + + client.await.unwrap(); + } + + #[tokio::test] + async fn can_detect_dropped_out_substream_without_writing_data() { + const PROTO_NAME: &str = "/test/proto/1"; + let (listener_addr_tx, listener_addr_rx) = oneshot::channel(); + + let client = tokio::spawn(async move { + let socket = TcpStream::connect(listener_addr_rx.await.unwrap()).await.unwrap(); + let NotificationsOutOpen { handshake, mut substream, .. } = upgrade::apply_outbound( + socket.compat(), + NotificationsOut::new(PROTO_NAME, Vec::new(), &b"initial message"[..], 1024 * 1024), + upgrade::Version::V1, + ) + .await + .unwrap(); + + assert_eq!(handshake, b"hello world"); + + future::poll_fn(|cx| match Pin::new(&mut substream).poll_flush(cx) { + Poll::Pending => Poll::Pending, + Poll::Ready(Ok(())) => { + cx.waker().wake_by_ref(); + Poll::Pending + }, + Poll::Ready(Err(e)) => { + assert!(matches!(e, NotificationsOutError::Terminated)); + Poll::Ready(()) + }, + }) + .await; + }); + + let listener = TcpListener::bind("127.0.0.1:0").await.unwrap(); + listener_addr_tx.send(listener.local_addr().unwrap()).unwrap(); + + let (socket, _) = listener.accept().await.unwrap(); + let NotificationsInOpen { handshake, mut substream, .. } = upgrade::apply_inbound( + socket.compat(), + NotificationsIn::new(PROTO_NAME, Vec::new(), 1024 * 1024), + ) + .await + .unwrap(); + + assert_eq!(handshake, b"initial message"); + + // Send the handhsake. + substream.send_handshake(&b"hello world"[..]); + future::poll_fn(|cx| Pin::new(&mut substream).poll_process(cx)).await.unwrap(); + + drop(substream); + + client.await.unwrap(); + } } diff --git a/substrate/client/network/src/protocol_controller.rs b/substrate/client/network/src/protocol_controller.rs index 4c8f119baa203b3942f4156e2f92efb72007c77f..2c3e6744e328f3900790e747a3a8d998f4e6964e 100644 --- a/substrate/client/network/src/protocol_controller.rs +++ b/substrate/client/network/src/protocol_controller.rs @@ -41,19 +41,22 @@ //! Even though this does not guarantee that `ProtocolController` and `Notifications` have the same //! view of the peers' states at any given moment, the eventual consistency is maintained. +use crate::{ + peer_store::{PeerStoreProvider, ProtocolHandle as ProtocolHandleT}, + PeerId, +}; + use futures::{channel::oneshot, future::Either, FutureExt, StreamExt}; -use libp2p::PeerId; use log::{debug, error, trace, warn}; use sc_utils::mpsc::{tracing_unbounded, TracingUnboundedReceiver, TracingUnboundedSender}; use sp_arithmetic::traits::SaturatedConversion; use std::{ collections::{HashMap, HashSet}, + sync::Arc, time::{Duration, Instant}, }; use wasm_timer::Delay; -use crate::peer_store::PeerStoreProvider; - /// Log target for this file. pub const LOG_TARGET: &str = "peerset"; @@ -230,6 +233,12 @@ impl ProtocolHandle { } } +impl ProtocolHandleT for ProtocolHandle { + fn disconnect_peer(&self, peer_id: sc_network_types::PeerId) { + let _ = self.actions_tx.unbounded_send(Action::DisconnectPeer(peer_id.into())); + } +} + /// Direction of a connection #[derive(Clone, Copy, Debug)] enum Direction { @@ -289,7 +298,7 @@ pub struct ProtocolController { to_notifications: TracingUnboundedSender, /// `PeerStore` handle for checking peer reputation values and getting connection candidates /// with highest reputation. - peer_store: Box, + peer_store: Arc, } impl ProtocolController { @@ -298,12 +307,12 @@ impl ProtocolController { set_id: SetId, config: ProtoSetConfig, to_notifications: TracingUnboundedSender, - peer_store: Box, + peer_store: Arc, ) -> (ProtocolHandle, ProtocolController) { let (actions_tx, actions_rx) = tracing_unbounded("mpsc_api_protocol", 10_000); let (events_tx, events_rx) = tracing_unbounded("mpsc_notifications_protocol", 10_000); let handle = ProtocolHandle { actions_tx, events_tx }; - peer_store.register_protocol(handle.clone()); + peer_store.register_protocol(Arc::new(handle.clone())); let reserved_nodes = config.reserved_nodes.iter().map(|p| (*p, PeerState::NotConnected)).collect(); let controller = ProtocolController { @@ -445,12 +454,12 @@ impl ProtocolController { /// Report peer disconnect event to `PeerStore` for it to update peer's reputation accordingly. /// Should only be called if the remote node disconnected us, not the other way around. fn report_disconnect(&mut self, peer_id: PeerId) { - self.peer_store.report_disconnect(peer_id); + self.peer_store.report_disconnect(peer_id.into()); } - /// Ask `Peerset` if the peer has a reputation value not sufficent for connection with it. + /// Ask `Peerset` if the peer has a reputation value not sufficient for connection with it. fn is_banned(&self, peer_id: &PeerId) -> bool { - self.peer_store.is_banned(peer_id) + self.peer_store.is_banned(&peer_id.into()) } /// Add the peer to the set of reserved peers. [`ProtocolController`] will try to always @@ -665,7 +674,7 @@ impl ProtocolController { self.accept_connection(peer_id, incoming_index); }, PeerState::NotConnected => - if self.peer_store.is_banned(&peer_id) { + if self.peer_store.is_banned(&peer_id.into()) { self.reject_connection(peer_id, incoming_index); } else { *state = PeerState::Connected(Direction::Inbound); @@ -778,7 +787,7 @@ impl ProtocolController { self.reserved_nodes .iter_mut() .filter_map(|(peer_id, state)| { - (!state.is_connected() && !self.peer_store.is_banned(peer_id)).then(|| { + (!state.is_connected() && !self.peer_store.is_banned(&peer_id.into())).then(|| { *state = PeerState::Connected(Direction::Outbound); peer_id }) @@ -803,8 +812,11 @@ impl ProtocolController { let ignored = self .reserved_nodes .keys() - .collect::>() - .union(&self.nodes.keys().collect::>()) + .map(From::from) + .collect::>() + .union( + &self.nodes.keys().map(From::from).collect::>(), + ) .cloned() .collect(); @@ -813,16 +825,17 @@ impl ProtocolController { .outgoing_candidates(available_slots, ignored) .into_iter() .filter_map(|peer_id| { - (!self.reserved_nodes.contains_key(&peer_id) && !self.nodes.contains_key(&peer_id)) - .then_some(peer_id) - .or_else(|| { - error!( - target: LOG_TARGET, - "`PeerStore` returned a node we asked to ignore: {peer_id}.", - ); - debug_assert!(false, "`PeerStore` returned a node we asked to ignore."); - None - }) + (!self.reserved_nodes.contains_key(&peer_id.into()) && + !self.nodes.contains_key(&peer_id.into())) + .then_some(peer_id) + .or_else(|| { + error!( + target: LOG_TARGET, + "`PeerStore` returned a node we asked to ignore: {peer_id}.", + ); + debug_assert!(false, "`PeerStore` returned a node we asked to ignore."); + None + }) }) .collect::>(); @@ -836,8 +849,8 @@ impl ProtocolController { candidates.into_iter().take(available_slots).for_each(|peer_id| { self.num_out += 1; - self.nodes.insert(peer_id, Direction::Outbound); - self.start_connection(peer_id); + self.nodes.insert(peer_id.into(), Direction::Outbound); + self.start_connection(peer_id.into()); }) } } @@ -845,8 +858,10 @@ impl ProtocolController { #[cfg(test)] mod tests { use super::*; - use crate::{peer_store::PeerStoreProvider, ReputationChange}; - use libp2p::PeerId; + use crate::{ + peer_store::{PeerStoreProvider, ProtocolHandle as ProtocolHandleT}, + PeerId, ReputationChange, + }; use sc_network_common::role::ObservedRole; use sc_utils::mpsc::{tracing_unbounded, TryRecvError}; use std::collections::HashSet; @@ -856,14 +871,16 @@ mod tests { pub PeerStoreHandle {} impl PeerStoreProvider for PeerStoreHandle { - fn is_banned(&self, peer_id: &PeerId) -> bool; - fn register_protocol(&self, protocol_handle: ProtocolHandle); - fn report_disconnect(&mut self, peer_id: PeerId); - fn set_peer_role(&mut self, peer_id: &PeerId, role: ObservedRole); - fn report_peer(&mut self, peer_id: PeerId, change: ReputationChange); - fn peer_reputation(&self, peer_id: &PeerId) -> i32; - fn peer_role(&self, peer_id: &PeerId) -> Option; - fn outgoing_candidates<'a>(&self, count: usize, ignored: HashSet<&'a PeerId>) -> Vec; + fn is_banned(&self, peer_id: &sc_network_types::PeerId) -> bool; + fn register_protocol(&self, protocol_handle: Arc); + fn report_disconnect(&self, peer_id: sc_network_types::PeerId); + fn set_peer_role(&self, peer_id: &sc_network_types::PeerId, role: ObservedRole); + fn report_peer(&self, peer_id: sc_network_types::PeerId, change: ReputationChange); + fn peer_reputation(&self, peer_id: &sc_network_types::PeerId) -> i32; + fn peer_role(&self, peer_id: &sc_network_types::PeerId) -> Option; + fn outgoing_candidates(&self, count: usize, ignored: HashSet) -> Vec; + fn num_known_peers(&self) -> usize; + fn add_known_peer(&self, peer_id: sc_network_types::PeerId); } } @@ -887,7 +904,7 @@ mod tests { peer_store.expect_report_disconnect().times(2).return_const(()); let (_handle, mut controller) = - ProtocolController::new(SetId::from(0), config, tx, Box::new(peer_store)); + ProtocolController::new(SetId::from(0), config, tx, Arc::new(peer_store)); // Add second reserved node at runtime (this currently calls `alloc_slots` internally). controller.on_add_reserved_peer(reserved2); @@ -948,7 +965,7 @@ mod tests { peer_store.expect_is_banned().times(6).return_const(true); let (_handle, mut controller) = - ProtocolController::new(SetId::from(0), config, tx, Box::new(peer_store)); + ProtocolController::new(SetId::from(0), config, tx, Arc::new(peer_store)); // Add second reserved node at runtime (this currently calls `alloc_slots` internally). controller.on_add_reserved_peer(reserved2); @@ -1000,7 +1017,7 @@ mod tests { peer_store.expect_report_disconnect().times(2).return_const(()); let (_handle, mut controller) = - ProtocolController::new(SetId::from(0), config, tx, Box::new(peer_store)); + ProtocolController::new(SetId::from(0), config, tx, Arc::new(peer_store)); // Add second reserved node at runtime (this calls `alloc_slots` internally). controller.on_add_reserved_peer(reserved2); @@ -1042,7 +1059,7 @@ mod tests { fn nodes_supplied_by_peer_store_are_connected() { let peer1 = PeerId::random(); let peer2 = PeerId::random(); - let candidates = vec![peer1, peer2]; + let candidates = vec![peer1.into(), peer2.into()]; let config = ProtoSetConfig { in_peers: 0, @@ -1058,7 +1075,7 @@ mod tests { peer_store.expect_outgoing_candidates().once().return_const(candidates); let (_handle, mut controller) = - ProtocolController::new(SetId::from(0), config, tx, Box::new(peer_store)); + ProtocolController::new(SetId::from(0), config, tx, Arc::new(peer_store)); // Initiate connections. controller.alloc_slots(); @@ -1092,7 +1109,7 @@ mod tests { let reserved2 = PeerId::random(); let regular1 = PeerId::random(); let regular2 = PeerId::random(); - let outgoing_candidates = vec![regular1, regular2]; + let outgoing_candidates = vec![regular1.into(), regular2.into()]; let reserved_nodes = [reserved1, reserved2].iter().cloned().collect(); let config = @@ -1105,7 +1122,7 @@ mod tests { peer_store.expect_outgoing_candidates().once().return_const(outgoing_candidates); let (_handle, mut controller) = - ProtocolController::new(SetId::from(0), config, tx, Box::new(peer_store)); + ProtocolController::new(SetId::from(0), config, tx, Arc::new(peer_store)); // Initiate connections. controller.alloc_slots(); @@ -1128,8 +1145,8 @@ mod tests { let peer1 = PeerId::random(); let peer2 = PeerId::random(); let peer3 = PeerId::random(); - let candidates1 = vec![peer1, peer2]; - let candidates2 = vec![peer3]; + let candidates1 = vec![peer1.into(), peer2.into()]; + let candidates2 = vec![peer3.into()]; let config = ProtoSetConfig { in_peers: 0, @@ -1147,7 +1164,7 @@ mod tests { peer_store.expect_report_disconnect().times(2).return_const(()); let (_handle, mut controller) = - ProtocolController::new(SetId::from(0), config, tx, Box::new(peer_store)); + ProtocolController::new(SetId::from(0), config, tx, Arc::new(peer_store)); // Initiate connections. controller.alloc_slots(); @@ -1214,7 +1231,7 @@ mod tests { peer_store.expect_register_protocol().once().return_const(()); let (_handle, mut controller) = - ProtocolController::new(SetId::from(0), config, tx, Box::new(peer_store)); + ProtocolController::new(SetId::from(0), config, tx, Arc::new(peer_store)); // Initiate connections. controller.alloc_slots(); @@ -1240,7 +1257,7 @@ mod tests { peer_store.expect_register_protocol().once().return_const(()); let (_handle, mut controller) = - ProtocolController::new(SetId::from(0), config, tx, Box::new(peer_store)); + ProtocolController::new(SetId::from(0), config, tx, Arc::new(peer_store)); let peer = PeerId::random(); let incoming_index = IncomingIndex(1); @@ -1262,7 +1279,7 @@ mod tests { fn disabling_reserved_only_mode_allows_to_connect_to_peers() { let peer1 = PeerId::random(); let peer2 = PeerId::random(); - let candidates = vec![peer1, peer2]; + let candidates = vec![peer1.into(), peer2.into()]; let config = ProtoSetConfig { in_peers: 0, @@ -1278,7 +1295,7 @@ mod tests { peer_store.expect_outgoing_candidates().once().return_const(candidates); let (_handle, mut controller) = - ProtocolController::new(SetId::from(0), config, tx, Box::new(peer_store)); + ProtocolController::new(SetId::from(0), config, tx, Arc::new(peer_store)); // Initiate connections. controller.alloc_slots(); @@ -1309,7 +1326,7 @@ mod tests { let reserved2 = PeerId::random(); let regular1 = PeerId::random(); let regular2 = PeerId::random(); - let outgoing_candidates = vec![regular1]; + let outgoing_candidates = vec![regular1.into()]; let config = ProtoSetConfig { in_peers: 10, @@ -1325,7 +1342,7 @@ mod tests { peer_store.expect_outgoing_candidates().once().return_const(outgoing_candidates); let (_handle, mut controller) = - ProtocolController::new(SetId::from(0), config, tx, Box::new(peer_store)); + ProtocolController::new(SetId::from(0), config, tx, Arc::new(peer_store)); assert_eq!(controller.num_out, 0); assert_eq!(controller.num_in, 0); @@ -1383,7 +1400,7 @@ mod tests { peer_store.expect_register_protocol().once().return_const(()); let (_handle, mut controller) = - ProtocolController::new(SetId::from(0), config, tx, Box::new(peer_store)); + ProtocolController::new(SetId::from(0), config, tx, Arc::new(peer_store)); assert_eq!(controller.reserved_nodes.len(), 2); assert_eq!(controller.nodes.len(), 0); assert_eq!(controller.num_out, 0); @@ -1416,7 +1433,7 @@ mod tests { peer_store.expect_is_banned().times(2).return_const(false); let (_handle, mut controller) = - ProtocolController::new(SetId::from(0), config, tx, Box::new(peer_store)); + ProtocolController::new(SetId::from(0), config, tx, Arc::new(peer_store)); // Initiate connections. controller.alloc_slots(); @@ -1460,10 +1477,13 @@ mod tests { let mut peer_store = MockPeerStoreHandle::new(); peer_store.expect_register_protocol().once().return_const(()); peer_store.expect_is_banned().times(2).return_const(false); - peer_store.expect_outgoing_candidates().once().return_const(Vec::new()); + peer_store + .expect_outgoing_candidates() + .once() + .return_const(Vec::::new()); let (_handle, mut controller) = - ProtocolController::new(SetId::from(0), config, tx, Box::new(peer_store)); + ProtocolController::new(SetId::from(0), config, tx, Arc::new(peer_store)); // Connect `peer1` as inbound, `peer2` as outbound. controller.on_incoming_connection(peer1, IncomingIndex(1)); @@ -1493,7 +1513,7 @@ mod tests { fn regular_nodes_stop_occupying_slots_when_become_reserved() { let peer1 = PeerId::random(); let peer2 = PeerId::random(); - let outgoing_candidates = vec![peer1]; + let outgoing_candidates = vec![peer1.into()]; let config = ProtoSetConfig { in_peers: 10, @@ -1509,7 +1529,7 @@ mod tests { peer_store.expect_outgoing_candidates().once().return_const(outgoing_candidates); let (_handle, mut controller) = - ProtocolController::new(SetId::from(0), config, tx, Box::new(peer_store)); + ProtocolController::new(SetId::from(0), config, tx, Arc::new(peer_store)); // Connect `peer1` as outbound & `peer2` as inbound. controller.alloc_slots(); @@ -1535,7 +1555,7 @@ mod tests { fn disconnecting_regular_peers_work() { let peer1 = PeerId::random(); let peer2 = PeerId::random(); - let outgoing_candidates = vec![peer1]; + let outgoing_candidates = vec![peer1.into()]; let config = ProtoSetConfig { in_peers: 10, @@ -1551,7 +1571,7 @@ mod tests { peer_store.expect_outgoing_candidates().once().return_const(outgoing_candidates); let (_handle, mut controller) = - ProtocolController::new(SetId::from(0), config, tx, Box::new(peer_store)); + ProtocolController::new(SetId::from(0), config, tx, Arc::new(peer_store)); // Connect `peer1` as outbound & `peer2` as inbound. controller.alloc_slots(); @@ -1610,7 +1630,7 @@ mod tests { peer_store.expect_outgoing_candidates().once().return_const(Vec::new()); let (_handle, mut controller) = - ProtocolController::new(SetId::from(0), config, tx, Box::new(peer_store)); + ProtocolController::new(SetId::from(0), config, tx, Arc::new(peer_store)); // Connect `reserved1` as inbound & `reserved2` as outbound. controller.on_incoming_connection(reserved1, IncomingIndex(1)); @@ -1650,7 +1670,7 @@ mod tests { fn dropping_regular_peers_work() { let peer1 = PeerId::random(); let peer2 = PeerId::random(); - let outgoing_candidates = vec![peer1]; + let outgoing_candidates = vec![peer1.into()]; let config = ProtoSetConfig { in_peers: 10, @@ -1667,7 +1687,7 @@ mod tests { peer_store.expect_report_disconnect().times(2).return_const(()); let (_handle, mut controller) = - ProtocolController::new(SetId::from(0), config, tx, Box::new(peer_store)); + ProtocolController::new(SetId::from(0), config, tx, Arc::new(peer_store)); // Connect `peer1` as outbound & `peer2` as inbound. controller.alloc_slots(); @@ -1718,7 +1738,7 @@ mod tests { peer_store.expect_outgoing_candidates().once().return_const(Vec::new()); let (_handle, mut controller) = - ProtocolController::new(SetId::from(0), config, tx, Box::new(peer_store)); + ProtocolController::new(SetId::from(0), config, tx, Arc::new(peer_store)); // Connect `reserved1` as inbound & `reserved2` as outbound. controller.on_incoming_connection(reserved1, IncomingIndex(1)); @@ -1762,7 +1782,7 @@ mod tests { fn incoming_request_for_connected_regular_node_switches_it_to_inbound() { let regular1 = PeerId::random(); let regular2 = PeerId::random(); - let outgoing_candidates = vec![regular1]; + let outgoing_candidates = vec![regular1.into()]; let config = ProtoSetConfig { in_peers: 10, @@ -1778,7 +1798,7 @@ mod tests { peer_store.expect_outgoing_candidates().once().return_const(outgoing_candidates); let (_handle, mut controller) = - ProtocolController::new(SetId::from(0), config, tx, Box::new(peer_store)); + ProtocolController::new(SetId::from(0), config, tx, Arc::new(peer_store)); assert_eq!(controller.num_out, 0); assert_eq!(controller.num_in, 0); @@ -1814,7 +1834,7 @@ mod tests { fn incoming_request_for_connected_node_is_rejected_if_its_banned() { let regular1 = PeerId::random(); let regular2 = PeerId::random(); - let outgoing_candidates = vec![regular1]; + let outgoing_candidates = vec![regular1.into()]; let config = ProtoSetConfig { in_peers: 10, @@ -1831,7 +1851,7 @@ mod tests { peer_store.expect_outgoing_candidates().once().return_const(outgoing_candidates); let (_handle, mut controller) = - ProtocolController::new(SetId::from(0), config, tx, Box::new(peer_store)); + ProtocolController::new(SetId::from(0), config, tx, Arc::new(peer_store)); assert_eq!(controller.num_out, 0); assert_eq!(controller.num_in, 0); @@ -1867,7 +1887,7 @@ mod tests { fn incoming_request_for_connected_node_is_rejected_if_no_slots_available() { let regular1 = PeerId::random(); let regular2 = PeerId::random(); - let outgoing_candidates = vec![regular1]; + let outgoing_candidates = vec![regular1.into()]; let config = ProtoSetConfig { in_peers: 1, @@ -1883,7 +1903,7 @@ mod tests { peer_store.expect_outgoing_candidates().once().return_const(outgoing_candidates); let (_handle, mut controller) = - ProtocolController::new(SetId::from(0), config, tx, Box::new(peer_store)); + ProtocolController::new(SetId::from(0), config, tx, Arc::new(peer_store)); assert_eq!(controller.num_out, 0); assert_eq!(controller.num_in, 0); @@ -1935,7 +1955,7 @@ mod tests { peer_store.expect_is_banned().once().return_const(false); let (_handle, mut controller) = - ProtocolController::new(SetId::from(0), config, tx, Box::new(peer_store)); + ProtocolController::new(SetId::from(0), config, tx, Arc::new(peer_store)); // Connect `peer1` as inbound. controller.on_incoming_connection(peer1, IncomingIndex(1)); @@ -1965,7 +1985,7 @@ mod tests { peer_store.expect_is_banned().once().return_const(true); let (_handle, mut controller) = - ProtocolController::new(SetId::from(0), config, tx, Box::new(peer_store)); + ProtocolController::new(SetId::from(0), config, tx, Arc::new(peer_store)); // Incoming request. controller.on_incoming_connection(peer1, IncomingIndex(1)); @@ -1990,7 +2010,7 @@ mod tests { peer_store.expect_is_banned().once().return_const(true); let (_handle, mut controller) = - ProtocolController::new(SetId::from(0), config, tx, Box::new(peer_store)); + ProtocolController::new(SetId::from(0), config, tx, Arc::new(peer_store)); assert!(controller.reserved_nodes.contains_key(&reserved1)); // Incoming request. @@ -2017,10 +2037,10 @@ mod tests { peer_store.expect_outgoing_candidates().once().return_const(Vec::new()); let (_handle, mut controller) = - ProtocolController::new(SetId::from(0), config, tx, Box::new(peer_store)); + ProtocolController::new(SetId::from(0), config, tx, Arc::new(peer_store)); assert!(matches!(controller.reserved_nodes.get(&reserved1), Some(PeerState::NotConnected))); - // Initiate connectios + // Initiate connections controller.alloc_slots(); assert!(matches!(controller.reserved_nodes.get(&reserved1), Some(PeerState::NotConnected))); assert_eq!(rx.try_recv().unwrap_err(), TryRecvError::Empty); diff --git a/substrate/client/network/src/request_responses.rs b/substrate/client/network/src/request_responses.rs index 0cd1cf06bb33e5a04abe14c1ad9c2229baea82ab..fbf050a65713d1d66c361a1cde4e4a698089473d 100644 --- a/substrate/client/network/src/request_responses.rs +++ b/substrate/client/network/src/request_responses.rs @@ -36,6 +36,7 @@ use crate::{ peer_store::{PeerStoreProvider, BANNED_THRESHOLD}, + service::traits::RequestResponseConfig as RequestResponseConfigT, types::ProtocolName, ReputationChange, }; @@ -58,6 +59,7 @@ use std::{ io, iter, ops::Deref, pin::Pin, + sync::Arc, task::{Context, Poll}, time::{Duration, Instant}, }; @@ -129,11 +131,17 @@ pub struct ProtocolConfig { pub inbound_queue: Option>, } +impl RequestResponseConfigT for ProtocolConfig { + fn protocol_name(&self) -> &ProtocolName { + &self.name + } +} + /// A single request received by a peer on a request-response protocol. #[derive(Debug)] pub struct IncomingRequest { /// Who sent the request. - pub peer: PeerId, + pub peer: sc_network_types::PeerId, /// Request sent by the remote. Will always be smaller than /// [`ProtocolConfig::max_request_size`]. @@ -288,7 +296,7 @@ pub struct RequestResponsesBehaviour { send_feedback: HashMap>, /// Primarily used to get a reputation of a node. - peer_store: Box, + peer_store: Arc, } /// Generated by the response builder and waiting to be processed. @@ -305,7 +313,7 @@ impl RequestResponsesBehaviour { /// the same protocol is passed twice. pub fn new( list: impl Iterator, - peer_store: Box, + peer_store: Arc, ) -> Result { let mut protocols = HashMap::new(); for protocol in list { @@ -670,7 +678,7 @@ impl NetworkBehaviour for RequestResponsesBehaviour { self.pending_responses_arrival_time .insert((protocol.clone(), request_id).into(), Instant::now()); - let reputation = self.peer_store.peer_reputation(&peer); + let reputation = self.peer_store.peer_reputation(&peer.into()); if reputation < BANNED_THRESHOLD { log::debug!( @@ -694,7 +702,7 @@ impl NetworkBehaviour for RequestResponsesBehaviour { // because the latter allocates an extra slot for every cloned // sender. let _ = resp_builder.try_send(IncomingRequest { - peer, + peer: peer.into(), payload: request, pending_response: tx, }); @@ -1093,7 +1101,7 @@ mod tests { .multiplex(libp2p::yamux::Config::default()) .boxed(); - let behaviour = RequestResponsesBehaviour::new(list, Box::new(MockPeerStore {})).unwrap(); + let behaviour = RequestResponsesBehaviour::new(list, Arc::new(MockPeerStore {})).unwrap(); let runtime = tokio::runtime::Runtime::new().unwrap(); let mut swarm = SwarmBuilder::with_executor( diff --git a/substrate/client/network/bitswap/src/schema/bitswap.v1.2.0.proto b/substrate/client/network/src/schema/bitswap.v1.2.0.proto similarity index 100% rename from substrate/client/network/bitswap/src/schema/bitswap.v1.2.0.proto rename to substrate/client/network/src/schema/bitswap.v1.2.0.proto diff --git a/substrate/client/network/src/service.rs b/substrate/client/network/src/service.rs index 47e23337633ba39d2aaf78bafa5920448a211b78..807c5b5a80afa682ef07b9ba2326a528b5d1c8f5 100644 --- a/substrate/client/network/src/service.rs +++ b/substrate/client/network/src/service.rs @@ -29,29 +29,33 @@ use crate::{ behaviour::{self, Behaviour, BehaviourOut}, - config::{parse_addr, FullNetworkConfiguration, MultiaddrWithPeerId, Params, TransportConfig}, + bitswap::BitswapRequestHandler, + config::{ + parse_addr, FullNetworkConfiguration, IncomingRequest, MultiaddrWithPeerId, + NonDefaultSetConfig, NotificationHandshake, Params, SetConfig, TransportConfig, + }, discovery::DiscoveryConfig, error::Error, event::{DhtEvent, Event}, network_state::{ NetworkState, NotConnectedPeer as NetworkStateNotConnectedPeer, Peer as NetworkStatePeer, }, - peer_store::{PeerStoreHandle, PeerStoreProvider}, + peer_store::{PeerStore, PeerStoreProvider}, protocol::{self, NotifsHandlerError, Protocol, Ready}, protocol_controller::{self, ProtoSetConfig, ProtocolController, SetId}, - request_responses::{IfDisconnected, RequestFailure}, + request_responses::{IfDisconnected, ProtocolConfig as RequestResponseConfig, RequestFailure}, service::{ signature::{Signature, SigningError}, traits::{ - NetworkDHTProvider, NetworkEventStream, NetworkNotification, NetworkPeers, - NetworkRequest, NetworkSigner, NetworkStateInfo, NetworkStatus, NetworkStatusProvider, - NotificationSender as NotificationSenderT, NotificationSenderError, - NotificationSenderReady as NotificationSenderReadyT, + BandwidthSink, NetworkBackend, NetworkDHTProvider, NetworkEventStream, NetworkPeers, + NetworkRequest, NetworkService as NetworkServiceT, NetworkSigner, NetworkStateInfo, + NetworkStatus, NetworkStatusProvider, NotificationSender as NotificationSenderT, + NotificationSenderError, NotificationSenderReady as NotificationSenderReadyT, }, }, transport, types::ProtocolName, - ReputationChange, + Multiaddr, NotificationService, PeerId, ReputationChange, }; use codec::DecodeAll; @@ -69,12 +73,13 @@ use libp2p::{ AddressScore, ConnectionError, ConnectionId, ConnectionLimits, DialError, Executor, ListenError, NetworkBehaviour, Swarm, SwarmBuilder, SwarmEvent, THandlerErr, }, - Multiaddr, PeerId, }; use log::{debug, error, info, trace, warn}; use metrics::{Histogram, MetricSources, Metrics}; use parking_lot::Mutex; +use prometheus_endpoint::Registry; +use sc_client_api::BlockBackend; use sc_network_common::{ role::{ObservedRole, Roles}, ExHashT, @@ -94,18 +99,34 @@ use std::{ atomic::{AtomicUsize, Ordering}, Arc, }, + time::Duration, }; pub use behaviour::{InboundFailure, OutboundFailure, ResponseFailure}; pub use libp2p::identity::{DecodingError, Keypair, PublicKey}; +pub use metrics::NotificationMetrics; pub use protocol::NotificationsSink; -mod metrics; -mod out_events; +pub(crate) mod metrics; +pub(crate) mod out_events; pub mod signature; pub mod traits; +struct Libp2pBandwidthSink { + sink: Arc, +} + +impl BandwidthSink for Libp2pBandwidthSink { + fn total_inbound(&self) -> u64 { + self.sink.total_inbound() + } + + fn total_outbound(&self) -> u64 { + self.sink.total_outbound() + } +} + /// Substrate network service. Handles network IO and manages connectivity. pub struct NetworkService { /// Number of peers we're connected to. @@ -119,9 +140,7 @@ pub struct NetworkService { /// The `KeyPair` that defines the `PeerId` of the local node. local_identity: Keypair, /// Bandwidth logging system. Can be queried to know the average bandwidth consumed. - bandwidth: Arc, - /// Used to query and report reputation changes. - peer_store_handle: PeerStoreHandle, + bandwidth: Arc, /// Channel that sends messages to the actual worker. to_worker: TracingUnboundedSender, /// Protocol name -> `SetId` mapping for notification protocols. The map never changes after @@ -132,6 +151,8 @@ pub struct NetworkService { protocol_handles: Vec, /// Shortcut to sync protocol handle (`protocol_handles[0]`). sync_protocol_handle: protocol_controller::ProtocolHandle, + /// Handle to `PeerStore`. + peer_store_handle: Arc, /// Marker to pin the `H` generic. Serves no purpose except to not break backwards /// compatibility. _marker: PhantomData, @@ -139,6 +160,91 @@ pub struct NetworkService { _block: PhantomData, } +#[async_trait::async_trait] +impl NetworkBackend for NetworkWorker +where + B: BlockT + 'static, + H: ExHashT, +{ + type NotificationProtocolConfig = NonDefaultSetConfig; + type RequestResponseProtocolConfig = RequestResponseConfig; + type NetworkService = Arc>; + type PeerStore = PeerStore; + type BitswapConfig = RequestResponseConfig; + + fn new(params: Params) -> Result + where + Self: Sized, + { + NetworkWorker::new(params) + } + + /// Get handle to `NetworkService` of the `NetworkBackend`. + fn network_service(&self) -> Arc { + self.service.clone() + } + + /// Create `PeerStore`. + fn peer_store(bootnodes: Vec) -> Self::PeerStore { + PeerStore::new(bootnodes.into_iter().map(From::from).collect()) + } + + fn register_notification_metrics(registry: Option<&Registry>) -> NotificationMetrics { + NotificationMetrics::new(registry) + } + + fn bitswap_server( + client: Arc + Send + Sync>, + ) -> (Pin + Send>>, Self::BitswapConfig) { + let (handler, protocol_config) = BitswapRequestHandler::new(client.clone()); + + (Box::pin(async move { handler.run().await }), protocol_config) + } + + /// Create notification protocol configuration. + fn notification_config( + protocol_name: ProtocolName, + fallback_names: Vec, + max_notification_size: u64, + handshake: Option, + set_config: SetConfig, + _metrics: NotificationMetrics, + _peerstore_handle: Arc, + ) -> (Self::NotificationProtocolConfig, Box) { + NonDefaultSetConfig::new( + protocol_name, + fallback_names, + max_notification_size, + handshake, + set_config, + ) + } + + /// Create request-response protocol configuration. + fn request_response_config( + protocol_name: ProtocolName, + fallback_names: Vec, + max_request_size: u64, + max_response_size: u64, + request_timeout: Duration, + inbound_queue: Option>, + ) -> Self::RequestResponseProtocolConfig { + Self::RequestResponseProtocolConfig { + name: protocol_name, + fallback_names, + max_request_size, + max_response_size, + request_timeout, + inbound_queue, + } + } + + /// Start [`NetworkBackend`] event loop. + async fn run(mut self) { + self.run().await + } +} + impl NetworkWorker where B: BlockT + 'static, @@ -149,11 +255,13 @@ where /// Returns a `NetworkWorker` that implements `Future` and must be regularly polled in order /// for the network processing to advance. From it, you can extract a `NetworkService` using /// `worker.service()`. The `NetworkService` can be shared through the codebase. - pub fn new(params: Params) -> Result { + pub fn new(params: Params) -> Result { + let peer_store_handle = params.network_config.peer_store_handle(); let FullNetworkConfiguration { notification_protocols, request_response_protocols, mut network_config, + .. } = params.network_config; // Private and public keys configuration. @@ -164,14 +272,14 @@ where network_config.boot_nodes = network_config .boot_nodes .into_iter() - .filter(|boot_node| boot_node.peer_id != local_peer_id) + .filter(|boot_node| boot_node.peer_id != local_peer_id.into()) .collect(); network_config.default_peers_set.reserved_nodes = network_config .default_peers_set .reserved_nodes .into_iter() .filter(|reserved_node| { - if reserved_node.peer_id == local_peer_id { + if reserved_node.peer_id == local_peer_id.into() { warn!( target: "sub-libp2p", "Local peer ID used in reserved node, ignoring: {}", @@ -219,6 +327,7 @@ where "🏷 Local node identity is: {}", local_peer_id.to_base58(), ); + log::info!(target: "sub-libp2p", "Running libp2p network backend"); let (transport, bandwidth) = { let config_mem = match network_config.transport { @@ -284,7 +393,7 @@ where reserved_nodes: set_config .reserved_nodes .iter() - .map(|node| node.peer_id) + .map(|node| node.peer_id.into()) .collect(), reserved_only: set_config.non_reserved_mode.is_reserved_only(), }; @@ -293,7 +402,7 @@ where SetId::from(set_id), proto_set_config, to_notifications.clone(), - Box::new(params.peer_store.clone()), + Arc::clone(&peer_store_handle), ) }) .unzip(); @@ -354,8 +463,8 @@ where { Err(Error::DuplicateBootnode { address: bootnode.multiaddr.clone(), - first_id: bootnode.peer_id, - second_id: other.peer_id, + first_id: bootnode.peer_id.into(), + second_id: other.peer_id.into(), }) } else { Ok(()) @@ -367,7 +476,7 @@ where for bootnode in network_config.boot_nodes.iter() { boot_node_ids - .entry(bootnode.peer_id) + .entry(bootnode.peer_id.into()) .or_default() .push(bootnode.multiaddr.clone()); } @@ -379,10 +488,10 @@ where let (protocol, notif_protocol_handles) = Protocol::new( From::from(¶ms.role), - ¶ms.metrics_registry, + params.notification_metrics, notification_protocols, params.block_announce_config, - params.peer_store.clone(), + Arc::clone(&peer_store_handle), protocol_handles.clone(), from_protocol_controllers, )?; @@ -394,7 +503,12 @@ where let discovery_config = { let mut config = DiscoveryConfig::new(local_public.to_peer_id()); - config.with_permanent_addresses(known_addresses); + config.with_permanent_addresses( + known_addresses + .iter() + .map(|(peer, address)| (peer.into(), address.clone())) + .collect::>(), + ); config.discovery_limit(u64::from(network_config.default_peers_set.out_peers) + 15); config.with_kademlia( params.genesis_hash, @@ -433,7 +547,7 @@ where local_public, discovery_config, request_response_protocols, - params.peer_store.clone(), + Arc::clone(&peer_store_handle), external_addresses.clone(), ); @@ -474,7 +588,7 @@ where .per_connection_event_buffer_size(24) .max_negotiating_inbound_streams(2048); - (builder.build(), bandwidth) + (builder.build(), Arc::new(Libp2pBandwidthSink { sink: bandwidth })) }; // Initialize the metrics. @@ -518,7 +632,7 @@ where notification_protocol_ids, protocol_handles, sync_protocol_handle, - peer_store_handle: params.peer_store.clone(), + peer_store_handle: Arc::clone(&peer_store_handle), _marker: PhantomData, _block: Default::default(), }); @@ -533,7 +647,7 @@ where metrics, boot_node_ids, reported_invalid_boot_nodes: Default::default(), - peer_store_handle: params.peer_store, + peer_store_handle: Arc::clone(&peer_store_handle), notif_protocol_handles, _marker: Default::default(), _block: Default::default(), @@ -701,7 +815,7 @@ where /// Removes a `PeerId` from the list of reserved peers. pub fn remove_reserved_peer(&self, peer: PeerId) { - self.service.remove_reserved_peer(peer); + self.service.remove_reserved_peer(peer.into()); } /// Adds a `PeerId` and its `Multiaddr` as reserved. @@ -731,18 +845,6 @@ impl NetworkService { } } - /// Get the list of reserved peers. - /// - /// Returns an error if the `NetworkWorker` is no longer running. - pub async fn reserved_peers(&self) -> Result, ()> { - let (tx, rx) = oneshot::channel(); - - self.sync_protocol_handle.reserved_peers(tx); - - // The channel can only be closed if `ProtocolController` no longer exists. - rx.await.map_err(|_| ()) - } - /// Utility function to extract `PeerId` from each `Multiaddr` for peer set updates. /// /// Returns an `Err` if one of the given addresses is invalid or contains an @@ -788,8 +890,8 @@ where } /// Returns the local Peer ID. - fn local_peer_id(&self) -> PeerId { - self.local_peer_id + fn local_peer_id(&self) -> sc_network_types::PeerId { + self.local_peer_id.into() } } @@ -798,8 +900,29 @@ where B: sp_runtime::traits::Block, H: ExHashT, { - fn sign_with_local_identity(&self, msg: impl AsRef<[u8]>) -> Result { - Signature::sign_message(msg.as_ref(), &self.local_identity) + fn sign_with_local_identity(&self, msg: Vec) -> Result { + let public_key = self.local_identity.public(); + let bytes = self.local_identity.sign(msg.as_ref())?; + + Ok(Signature { + public_key: crate::service::signature::PublicKey::Libp2p(public_key), + bytes, + }) + } + + fn verify( + &self, + peer_id: sc_network_types::PeerId, + public_key: &Vec, + signature: &Vec, + message: &Vec, + ) -> Result { + let public_key = + PublicKey::try_decode_protobuf(&public_key).map_err(|error| error.to_string())?; + let peer_id: PeerId = peer_id.into(); + let remote: libp2p::PeerId = public_key.to_peer_id(); + + Ok(peer_id == remote && public_key.verify(message, signature)) } } @@ -844,39 +967,55 @@ where Err(_) => Err(()), } } + + async fn network_state(&self) -> Result { + let (tx, rx) = oneshot::channel(); + + let _ = self + .to_worker + .unbounded_send(ServiceToWorkerMsg::NetworkState { pending_response: tx }); + + match rx.await { + Ok(v) => v.map_err(|_| ()), + // The channel can only be closed if the network worker no longer exists. + Err(_) => Err(()), + } + } } +#[async_trait::async_trait] impl NetworkPeers for NetworkService where B: BlockT + 'static, H: ExHashT, { - fn set_authorized_peers(&self, peers: HashSet) { - self.sync_protocol_handle.set_reserved_peers(peers); + fn set_authorized_peers(&self, peers: HashSet) { + self.sync_protocol_handle + .set_reserved_peers(peers.iter().map(|peer| (*peer).into()).collect()); } fn set_authorized_only(&self, reserved_only: bool) { self.sync_protocol_handle.set_reserved_only(reserved_only); } - fn add_known_address(&self, peer_id: PeerId, addr: Multiaddr) { + fn add_known_address(&self, peer_id: sc_network_types::PeerId, addr: Multiaddr) { let _ = self .to_worker - .unbounded_send(ServiceToWorkerMsg::AddKnownAddress(peer_id, addr)); + .unbounded_send(ServiceToWorkerMsg::AddKnownAddress(peer_id.into(), addr)); } - fn report_peer(&self, peer_id: PeerId, cost_benefit: ReputationChange) { + fn report_peer(&self, peer_id: sc_network_types::PeerId, cost_benefit: ReputationChange) { self.peer_store_handle.clone().report_peer(peer_id, cost_benefit); } - fn peer_reputation(&self, peer_id: &PeerId) -> i32 { + fn peer_reputation(&self, peer_id: &sc_network_types::PeerId) -> i32 { self.peer_store_handle.peer_reputation(peer_id) } - fn disconnect_peer(&self, peer_id: PeerId, protocol: ProtocolName) { + fn disconnect_peer(&self, peer_id: sc_network_types::PeerId, protocol: ProtocolName) { let _ = self .to_worker - .unbounded_send(ServiceToWorkerMsg::DisconnectPeer(peer_id, protocol)); + .unbounded_send(ServiceToWorkerMsg::DisconnectPeer(peer_id.into(), protocol)); } fn accept_unreserved_peers(&self) { @@ -889,19 +1028,21 @@ where fn add_reserved_peer(&self, peer: MultiaddrWithPeerId) -> Result<(), String> { // Make sure the local peer ID is never added as a reserved peer. - if peer.peer_id == self.local_peer_id { + if peer.peer_id == self.local_peer_id.into() { return Err("Local peer ID cannot be added as a reserved peer.".to_string()) } - let _ = self - .to_worker - .unbounded_send(ServiceToWorkerMsg::AddKnownAddress(peer.peer_id, peer.multiaddr)); - self.sync_protocol_handle.add_reserved_peer(peer.peer_id); + let _ = self.to_worker.unbounded_send(ServiceToWorkerMsg::AddKnownAddress( + peer.peer_id.into(), + peer.multiaddr, + )); + self.sync_protocol_handle.add_reserved_peer(peer.peer_id.into()); + Ok(()) } - fn remove_reserved_peer(&self, peer_id: PeerId) { - self.sync_protocol_handle.remove_reserved_peer(peer_id); + fn remove_reserved_peer(&self, peer_id: sc_network_types::PeerId) { + self.sync_protocol_handle.remove_reserved_peer(peer_id.into()); } fn set_reserved_peers( @@ -915,7 +1056,8 @@ where let peers_addrs = self.split_multiaddr_and_peer_id(peers)?; - let mut peers: HashSet = HashSet::with_capacity(peers_addrs.len()); + let mut peers: HashSet = + HashSet::with_capacity(peers_addrs.len()); for (peer_id, addr) in peers_addrs.into_iter() { // Make sure the local peer ID is never added to the PSM. @@ -923,7 +1065,7 @@ where return Err("Local peer ID cannot be added as a reserved peer.".to_string()) } - peers.insert(peer_id); + peers.insert(peer_id.into()); if !addr.is_empty() { let _ = self @@ -932,7 +1074,8 @@ where } } - self.protocol_handles[usize::from(*set_id)].set_reserved_peers(peers); + self.protocol_handles[usize::from(*set_id)] + .set_reserved_peers(peers.iter().map(|peer| (*peer).into()).collect()); Ok(()) } @@ -972,7 +1115,7 @@ where fn remove_peers_from_reserved_set( &self, protocol: ProtocolName, - peers: Vec, + peers: Vec, ) -> Result<(), String> { let Some(set_id) = self.notification_protocol_ids.get(&protocol) else { return Err(format!( @@ -982,7 +1125,7 @@ where }; for peer_id in peers.into_iter() { - self.protocol_handles[usize::from(*set_id)].remove_reserved_peer(peer_id); + self.protocol_handles[usize::from(*set_id)].remove_reserved_peer(peer_id.into()); } Ok(()) @@ -992,15 +1135,33 @@ where self.num_connected.load(Ordering::Relaxed) } - fn peer_role(&self, peer_id: PeerId, handshake: Vec) -> Option { + fn peer_role( + &self, + peer_id: sc_network_types::PeerId, + handshake: Vec, + ) -> Option { match Roles::decode_all(&mut &handshake[..]) { Ok(role) => Some(role.into()), Err(_) => { log::debug!(target: "sub-libp2p", "handshake doesn't contain peer role: {handshake:?}"); - self.peer_store_handle.peer_role(&peer_id) + self.peer_store_handle.peer_role(&(peer_id.into())) }, } } + + /// Get the list of reserved peers. + /// + /// Returns an error if the `NetworkWorker` is no longer running. + async fn reserved_peers(&self) -> Result, ()> { + let (tx, rx) = oneshot::channel(); + + self.sync_protocol_handle.reserved_peers(tx); + + // The channel can only be closed if `ProtocolController` no longer exists. + rx.await + .map(|peers| peers.into_iter().map(From::from).collect()) + .map_err(|_| ()) + } } impl NetworkEventStream for NetworkService @@ -1015,28 +1176,6 @@ where } } -impl NetworkNotification for NetworkService -where - B: BlockT + 'static, - H: ExHashT, -{ - fn write_notification(&self, _target: PeerId, _protocol: ProtocolName, _message: Vec) { - unimplemented!(); - } - - fn notification_sender( - &self, - _target: PeerId, - _protocol: ProtocolName, - ) -> Result, NotificationSenderError> { - unimplemented!(); - } - - fn set_notification_handshake(&self, _protocol: ProtocolName, _handshake: Vec) { - unimplemented!(); - } -} - #[async_trait::async_trait] impl NetworkRequest for NetworkService where @@ -1045,7 +1184,7 @@ where { async fn request( &self, - target: PeerId, + target: sc_network_types::PeerId, protocol: ProtocolName, request: Vec, fallback_request: Option<(Vec, ProtocolName)>, @@ -1053,7 +1192,7 @@ where ) -> Result<(Vec, ProtocolName), RequestFailure> { let (tx, rx) = oneshot::channel(); - self.start_request(target, protocol, request, fallback_request, tx, connect); + self.start_request(target.into(), protocol, request, fallback_request, tx, connect); match rx.await { Ok(v) => v, @@ -1066,7 +1205,7 @@ where fn start_request( &self, - target: PeerId, + target: sc_network_types::PeerId, protocol: ProtocolName, request: Vec, fallback_request: Option<(Vec, ProtocolName)>, @@ -1074,7 +1213,7 @@ where connect: IfDisconnected, ) { let _ = self.to_worker.unbounded_send(ServiceToWorkerMsg::Request { - target, + target: target.into(), protocol: protocol.into(), request, fallback_request, @@ -1204,7 +1343,7 @@ where /// Boot nodes that we already have reported as invalid. reported_invalid_boot_nodes: HashSet, /// Peer reputation store handle. - peer_store_handle: PeerStoreHandle, + peer_store_handle: Arc, /// Notification protocol handles. notif_protocol_handles: Vec, /// Marker to pin the `H` generic. Serves no purpose except to not break backwards @@ -1394,7 +1533,7 @@ where }, SwarmEvent::Behaviour(BehaviourOut::ReputationChanges { peer, changes }) => { for change in changes { - self.peer_store_handle.report_peer(peer, change); + self.peer_store_handle.report_peer(peer.into(), change); } }, SwarmEvent::Behaviour(BehaviourOut::PeerIdentify { @@ -1417,10 +1556,10 @@ where .behaviour_mut() .add_self_reported_address_to_dht(&peer_id, &protocols, addr); } - self.peer_store_handle.add_known_peer(peer_id); + self.peer_store_handle.add_known_peer(peer_id.into()); }, SwarmEvent::Behaviour(BehaviourOut::Discovered(peer_id)) => { - self.peer_store_handle.add_known_peer(peer_id); + self.peer_store_handle.add_known_peer(peer_id.into()); }, SwarmEvent::Behaviour(BehaviourOut::RandomKademliaStarted) => { if let Some(metrics) = self.metrics.as_ref() { @@ -1720,7 +1859,7 @@ where { } -fn ensure_addresses_consistent_with_transport<'a>( +pub(crate) fn ensure_addresses_consistent_with_transport<'a>( addresses: impl Iterator, transport: &TransportConfig, ) -> Result<(), Error> { diff --git a/substrate/client/network/src/service/metrics.rs b/substrate/client/network/src/service/metrics.rs index c349fd98c76b02e9e7a60142c242061f8fec72fe..3b15b3e81d9c7adb5f337b2a67adf371b215e282 100644 --- a/substrate/client/network/src/service/metrics.rs +++ b/substrate/client/network/src/service/metrics.rs @@ -16,11 +16,13 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -use crate::transport::BandwidthSinks; +use crate::{service::traits::BandwidthSink, ProtocolName}; + use prometheus_endpoint::{ self as prometheus, Counter, CounterVec, Gauge, GaugeVec, HistogramOpts, MetricSource, Opts, PrometheusError, Registry, SourcedCounter, SourcedGauge, U64, }; + use std::{ str, sync::{ @@ -38,13 +40,30 @@ pub fn register(registry: &Registry, sources: MetricSources) -> Result Result { + Metrics::register(registry) +} + /// Predefined metric sources that are fed directly into prometheus. pub struct MetricSources { - pub bandwidth: Arc, + pub bandwidth: Arc, pub connected_peers: Arc, } +impl MetricSources { + pub fn register( + registry: &Registry, + bandwidth: Arc, + connected_peers: Arc, + ) -> Result<(), PrometheusError> { + BandwidthCounters::register(registry, bandwidth)?; + NumConnectedGauge::register(registry, connected_peers) + } +} + /// Dedicated metrics. +#[derive(Clone)] pub struct Metrics { // This list is ordered alphabetically pub connections_closed_total: CounterVec, @@ -208,12 +227,12 @@ impl Metrics { /// The bandwidth counter metric. #[derive(Clone)] -pub struct BandwidthCounters(Arc); +pub struct BandwidthCounters(Arc); impl BandwidthCounters { /// Registers the `BandwidthCounters` metric whose values are /// obtained from the given sinks. - fn register(registry: &Registry, sinks: Arc) -> Result<(), PrometheusError> { + fn register(registry: &Registry, sinks: Arc) -> Result<(), PrometheusError> { prometheus::register( SourcedCounter::new( &Opts::new("substrate_sub_libp2p_network_bytes_total", "Total bandwidth usage") @@ -263,3 +282,115 @@ impl MetricSource for NumConnectedGauge { set(&[], self.0.load(Ordering::Relaxed) as u64); } } + +/// Notification metrics. +/// +/// Wrapper over `Option` to make metrics reporting code cleaner. +#[derive(Debug, Clone)] +pub struct NotificationMetrics { + /// Metrics, if enabled. + metrics: Option, +} + +impl NotificationMetrics { + /// Create new [`NotificationMetrics`]. + pub fn new(registry: Option<&Registry>) -> NotificationMetrics { + let metrics = match registry { + Some(registry) => InnerNotificationMetrics::register(registry).ok(), + None => None, + }; + + Self { metrics } + } + + /// Register opened substream to Prometheus. + pub fn register_substream_opened(&self, protocol: &ProtocolName) { + if let Some(metrics) = &self.metrics { + metrics.notifications_streams_opened_total.with_label_values(&[&protocol]).inc(); + } + } + + /// Register closed substream to Prometheus. + pub fn register_substream_closed(&self, protocol: &ProtocolName) { + if let Some(metrics) = &self.metrics { + metrics + .notifications_streams_closed_total + .with_label_values(&[&protocol[..]]) + .inc(); + } + } + + /// Register sent notification to Prometheus. + pub fn register_notification_sent(&self, protocol: &ProtocolName, size: usize) { + if let Some(metrics) = &self.metrics { + metrics + .notifications_sizes + .with_label_values(&["out", protocol]) + .observe(size as f64); + } + } + + /// Register received notification to Prometheus. + pub fn register_notification_received(&self, protocol: &ProtocolName, size: usize) { + if let Some(metrics) = &self.metrics { + metrics + .notifications_sizes + .with_label_values(&["in", protocol]) + .observe(size as f64); + } + } +} + +/// Notification metrics. +#[derive(Debug, Clone)] +struct InnerNotificationMetrics { + // Total number of opened substreams. + pub notifications_streams_opened_total: CounterVec, + + /// Total number of closed substreams. + pub notifications_streams_closed_total: CounterVec, + + /// In/outbound notification sizes. + pub notifications_sizes: HistogramVec, +} + +impl InnerNotificationMetrics { + fn register(registry: &Registry) -> Result { + Ok(Self { + notifications_sizes: prometheus::register( + HistogramVec::new( + HistogramOpts { + common_opts: Opts::new( + "substrate_sub_libp2p_notifications_sizes", + "Sizes of the notifications send to and received from all nodes", + ), + buckets: prometheus::exponential_buckets(64.0, 4.0, 8) + .expect("parameters are always valid values; qed"), + }, + &["direction", "protocol"], + )?, + registry, + )?, + notifications_streams_closed_total: prometheus::register( + CounterVec::new( + Opts::new( + "substrate_sub_libp2p_notifications_streams_closed_total", + "Total number of notification substreams that have been closed", + ), + &["protocol"], + )?, + registry, + )?, + notifications_streams_opened_total: prometheus::register( + CounterVec::new( + Opts::new( + "substrate_sub_libp2p_notifications_streams_opened_total", + "Total number of notification substreams that have been opened", + ), + &["protocol"], + )?, + registry, + )?, + }) + } +} diff --git a/substrate/client/network/src/service/signature.rs b/substrate/client/network/src/service/signature.rs index 5b2ba6be8cf8dec5516af04375816a860f9abf9a..f673102514630b0f00a8431825e82e08fc32dea3 100644 --- a/substrate/client/network/src/service/signature.rs +++ b/substrate/client/network/src/service/signature.rs @@ -20,38 +20,94 @@ //! Signature-related code -use libp2p::{ - identity::{Keypair, PublicKey}, - PeerId, -}; - pub use libp2p::identity::SigningError; +/// Public key. +pub enum PublicKey { + /// Litep2p public key. + Libp2p(libp2p::identity::PublicKey), + + /// Libp2p public key. + Litep2p(litep2p::crypto::PublicKey), +} + +impl PublicKey { + /// Protobuf-encode [`PublicKey`]. + pub fn encode_protobuf(&self) -> Vec { + match self { + Self::Libp2p(public) => public.encode_protobuf(), + Self::Litep2p(public) => public.to_protobuf_encoding(), + } + } + + /// Get `PeerId` of the [`PublicKey`]. + pub fn to_peer_id(&self) -> sc_network_types::PeerId { + match self { + Self::Libp2p(public) => public.to_peer_id().into(), + Self::Litep2p(public) => public.to_peer_id().into(), + } + } +} + +/// Keypair. +pub enum Keypair { + /// Litep2p keypair. + Libp2p(libp2p::identity::Keypair), + + /// Libp2p keypair. + Litep2p(litep2p::crypto::ed25519::Keypair), +} + +impl Keypair { + /// Generate ed25519 keypair. + pub fn generate_ed25519() -> Self { + Keypair::Litep2p(litep2p::crypto::ed25519::Keypair::generate()) + } + + /// Get [`Keypair`]'s public key. + pub fn public(&self) -> PublicKey { + match self { + Keypair::Libp2p(keypair) => PublicKey::Libp2p(keypair.public()), + Keypair::Litep2p(keypair) => PublicKey::Litep2p(keypair.public().into()), + } + } +} + /// A result of signing a message with a network identity. Since `PeerId` is potentially a hash of a /// `PublicKey`, you need to reveal the `PublicKey` next to the signature, so the verifier can check /// if the signature was made by the entity that controls a given `PeerId`. pub struct Signature { /// The public key derived from the network identity that signed the message. pub public_key: PublicKey, + /// The actual signature made for the message signed. pub bytes: Vec, } impl Signature { + /// Create new [`Signature`]. + pub fn new(public_key: PublicKey, bytes: Vec) -> Self { + Self { public_key, bytes } + } + /// Create a signature for a message with a given network identity. pub fn sign_message( message: impl AsRef<[u8]>, keypair: &Keypair, ) -> Result { - let public_key = keypair.public(); - let bytes = keypair.sign(message.as_ref())?; - Ok(Self { public_key, bytes }) - } + match keypair { + Keypair::Libp2p(keypair) => { + let public_key = keypair.public(); + let bytes = keypair.sign(message.as_ref())?; + + Ok(Signature { public_key: PublicKey::Libp2p(public_key), bytes }) + }, + Keypair::Litep2p(keypair) => { + let public_key = keypair.public(); + let bytes = keypair.sign(message.as_ref()); - /// Verify whether the signature was made for the given message by the entity that controls the - /// given `PeerId`. - pub fn verify(&self, message: impl AsRef<[u8]>, peer_id: &PeerId) -> bool { - *peer_id == self.public_key.to_peer_id() && - self.public_key.verify(message.as_ref(), &self.bytes) + Ok(Signature { public_key: PublicKey::Litep2p(public_key.into()), bytes }) + }, + } } } diff --git a/substrate/client/network/src/service/traits.rs b/substrate/client/network/src/service/traits.rs index 74ddb986c247aa08c5227edc25164b035ac7b820..9bbaeb1026f9304d43d347893de5795fd0bb93b4 100644 --- a/substrate/client/network/src/service/traits.rs +++ b/substrate/client/network/src/service/traits.rs @@ -21,28 +21,165 @@ //! Traits defined by `sc-network`. use crate::{ - config::MultiaddrWithPeerId, - error, + config::{IncomingRequest, MultiaddrWithPeerId, NotificationHandshake, Params, SetConfig}, + error::{self, Error}, event::Event, + network_state::NetworkState, request_responses::{IfDisconnected, RequestFailure}, - service::signature::Signature, + service::{metrics::NotificationMetrics, signature::Signature, PeerStoreProvider}, types::ProtocolName, - ReputationChange, + Multiaddr, ReputationChange, }; use futures::{channel::oneshot, Stream}; -use libp2p::{Multiaddr, PeerId}; +use prometheus_endpoint::Registry; -use sc_network_common::role::ObservedRole; +use sc_client_api::BlockBackend; +use sc_network_common::{role::ObservedRole, ExHashT}; +use sc_network_types::PeerId; +use sp_runtime::traits::Block as BlockT; -use std::{collections::HashSet, fmt::Debug, future::Future, pin::Pin, sync::Arc}; +use std::{collections::HashSet, fmt::Debug, future::Future, pin::Pin, sync::Arc, time::Duration}; pub use libp2p::{identity::SigningError, kad::record::Key as KademliaKey}; +/// Supertrait defining the services provided by [`NetworkBackend`] service handle. +pub trait NetworkService: + NetworkSigner + + NetworkDHTProvider + + NetworkStatusProvider + + NetworkPeers + + NetworkEventStream + + NetworkStateInfo + + NetworkRequest + + Send + + Sync + + 'static +{ +} + +impl NetworkService for T where + T: NetworkSigner + + NetworkDHTProvider + + NetworkStatusProvider + + NetworkPeers + + NetworkEventStream + + NetworkStateInfo + + NetworkRequest + + Send + + Sync + + 'static +{ +} + +/// Trait defining the required functionality from a notification protocol configuration. +pub trait NotificationConfig: Debug { + /// Get access to the `SetConfig` of the notification protocol. + fn set_config(&self) -> &SetConfig; + + /// Get protocol name. + fn protocol_name(&self) -> &ProtocolName; +} + +/// Trait defining the required functionality from a request-response protocol configuration. +pub trait RequestResponseConfig: Debug { + /// Get protocol name. + fn protocol_name(&self) -> &ProtocolName; +} + +/// Trait defining required functionality from `PeerStore`. +#[async_trait::async_trait] +pub trait PeerStore { + /// Get handle to `PeerStore`. + fn handle(&self) -> Arc; + + /// Start running `PeerStore` event loop. + async fn run(self); +} + +/// Networking backend. +#[async_trait::async_trait] +pub trait NetworkBackend: Send + 'static { + /// Type representing notification protocol-related configuration. + type NotificationProtocolConfig: NotificationConfig; + + /// Type representing request-response protocol-related configuration. + type RequestResponseProtocolConfig: RequestResponseConfig; + + /// Type implementing `NetworkService` for the networking backend. + /// + /// `NetworkService` allows other subsystems of the blockchain to interact with `sc-network` + /// using `NetworkService`. + type NetworkService: NetworkService + Clone; + + /// Type implementing [`PeerStore`]. + type PeerStore: PeerStore; + + /// Bitswap config. + type BitswapConfig; + + /// Create new `NetworkBackend`. + fn new(params: Params) -> Result + where + Self: Sized; + + /// Get handle to `NetworkService` of the `NetworkBackend`. + fn network_service(&self) -> Arc; + + /// Create [`PeerStore`]. + fn peer_store(bootnodes: Vec) -> Self::PeerStore; + + /// Register metrics that are used by the notification protocols. + fn register_notification_metrics(registry: Option<&Registry>) -> NotificationMetrics; + + /// Create Bitswap server. + fn bitswap_server( + client: Arc + Send + Sync>, + ) -> (Pin + Send>>, Self::BitswapConfig); + + /// Create notification protocol configuration and an associated `NotificationService` + /// for the protocol. + fn notification_config( + protocol_name: ProtocolName, + fallback_names: Vec, + max_notification_size: u64, + handshake: Option, + set_config: SetConfig, + metrics: NotificationMetrics, + peerstore_handle: Arc, + ) -> (Self::NotificationProtocolConfig, Box); + + /// Create request-response protocol configuration. + fn request_response_config( + protocol_name: ProtocolName, + fallback_names: Vec, + max_request_size: u64, + max_response_size: u64, + request_timeout: Duration, + inbound_queue: Option>, + ) -> Self::RequestResponseProtocolConfig; + + /// Start [`NetworkBackend`] event loop. + async fn run(mut self); +} + /// Signer with network identity pub trait NetworkSigner { /// Signs the message with the `KeyPair` that defines the local [`PeerId`]. - fn sign_with_local_identity(&self, msg: impl AsRef<[u8]>) -> Result; + fn sign_with_local_identity(&self, msg: Vec) -> Result; + + /// Verify signature using peer's public key. + /// + /// `public_key` must be Protobuf-encoded ed25519 public key. + /// + /// Returns `Err(())` if public cannot be parsed into a valid ed25519 public key. + fn verify( + &self, + peer_id: sc_network_types::PeerId, + public_key: &Vec, + signature: &Vec, + message: &Vec, + ) -> Result; } impl NetworkSigner for Arc @@ -50,9 +187,19 @@ where T: ?Sized, T: NetworkSigner, { - fn sign_with_local_identity(&self, msg: impl AsRef<[u8]>) -> Result { + fn sign_with_local_identity(&self, msg: Vec) -> Result { T::sign_with_local_identity(self, msg) } + + fn verify( + &self, + peer_id: sc_network_types::PeerId, + public_key: &Vec, + signature: &Vec, + message: &Vec, + ) -> Result { + T::verify(self, peer_id, public_key, signature, message) + } } /// Provides access to the networking DHT. @@ -117,6 +264,11 @@ pub trait NetworkStatusProvider { /// /// Returns an error if the `NetworkWorker` is no longer running. async fn status(&self) -> Result; + + /// Get the network state. + /// + /// Returns an error if the `NetworkWorker` is no longer running. + async fn network_state(&self) -> Result; } // Manual implementation to avoid extra boxing here @@ -134,9 +286,20 @@ where { T::status(self) } + + fn network_state<'life0, 'async_trait>( + &'life0 self, + ) -> Pin> + Send + 'async_trait>> + where + 'life0: 'async_trait, + Self: 'async_trait, + { + T::network_state(self) + } } /// Provides low-level API for manipulating network peers. +#[async_trait::async_trait] pub trait NetworkPeers { /// Set authorized peers. /// @@ -237,9 +400,15 @@ pub trait NetworkPeers { /// decoded into a role, the role queried from `PeerStore` and if the role is not stored /// there either, `None` is returned and the peer should be discarded. fn peer_role(&self, peer_id: PeerId, handshake: Vec) -> Option; + + /// Get the list of reserved peers. + /// + /// Returns an error if the `NetworkWorker` is no longer running. + async fn reserved_peers(&self) -> Result, ()>; } // Manual implementation to avoid extra boxing here +#[async_trait::async_trait] impl NetworkPeers for Arc where T: ?Sized, @@ -316,6 +485,16 @@ where fn peer_role(&self, peer_id: PeerId, handshake: Vec) -> Option { T::peer_role(self, peer_id, handshake) } + + fn reserved_peers<'life0, 'async_trait>( + &'life0 self, + ) -> Pin, ()>> + Send + 'async_trait>> + where + 'life0: 'async_trait, + Self: 'async_trait, + { + T::reserved_peers(self) + } } /// Provides access to network-level event stream. @@ -389,15 +568,15 @@ pub trait NotificationSender: Send + Sync + 'static { -> Result, NotificationSenderError>; } -/// Error returned by [`NetworkNotification::notification_sender`]. +/// Error returned by the notification sink. #[derive(Debug, thiserror::Error)] pub enum NotificationSenderError { /// The notification receiver has been closed, usually because the underlying connection /// closed. /// /// Some of the notifications most recently sent may not have been received. However, - /// the peer may still be connected and a new `NotificationSender` for the same - /// protocol obtained from [`NetworkNotification::notification_sender`]. + /// the peer may still be connected and a new notification sink for the same + /// protocol obtained from [`NotificationService::message_sink()`]. #[error("The notification receiver has been closed")] Closed, /// Protocol name hasn't been registered. @@ -405,127 +584,6 @@ pub enum NotificationSenderError { BadProtocol, } -/// Provides ability to send network notifications. -pub trait NetworkNotification { - /// Appends a notification to the buffer of pending outgoing notifications with the given peer. - /// Has no effect if the notifications channel with this protocol name is not open. - /// - /// If the buffer of pending outgoing notifications with that peer is full, the notification - /// is silently dropped and the connection to the remote will start being shut down. This - /// happens if you call this method at a higher rate than the rate at which the peer processes - /// these notifications, or if the available network bandwidth is too low. - /// - /// For this reason, this method is considered soft-deprecated. You are encouraged to use - /// [`NetworkNotification::notification_sender`] instead. - /// - /// > **Note**: The reason why this is a no-op in the situation where we have no channel is - /// > that we don't guarantee message delivery anyway. Networking issues can cause - /// > connections to drop at any time, and higher-level logic shouldn't differentiate - /// > between the remote voluntarily closing a substream or a network error - /// > preventing the message from being delivered. - /// - /// The protocol must have been registered with - /// `crate::config::NetworkConfiguration::notifications_protocols`. - fn write_notification(&self, target: PeerId, protocol: ProtocolName, message: Vec); - - /// Obtains a [`NotificationSender`] for a connected peer, if it exists. - /// - /// A `NotificationSender` is scoped to a particular connection to the peer that holds - /// a receiver. With a `NotificationSender` at hand, sending a notification is done in two - /// steps: - /// - /// 1. [`NotificationSender::ready`] is used to wait for the sender to become ready - /// for another notification, yielding a [`NotificationSenderReady`] token. - /// 2. [`NotificationSenderReady::send`] enqueues the notification for sending. This operation - /// can only fail if the underlying notification substream or connection has suddenly closed. - /// - /// An error is returned by [`NotificationSenderReady::send`] if there exists no open - /// notifications substream with that combination of peer and protocol, or if the remote - /// has asked to close the notifications substream. If that happens, it is guaranteed that an - /// [`Event::NotificationStreamClosed`] has been generated on the stream returned by - /// [`NetworkEventStream::event_stream`]. - /// - /// If the remote requests to close the notifications substream, all notifications successfully - /// enqueued using [`NotificationSenderReady::send`] will finish being sent out before the - /// substream actually gets closed, but attempting to enqueue more notifications will now - /// return an error. It is however possible for the entire connection to be abruptly closed, - /// in which case enqueued notifications will be lost. - /// - /// The protocol must have been registered with - /// `crate::config::NetworkConfiguration::notifications_protocols`. - /// - /// # Usage - /// - /// This method returns a struct that allows waiting until there is space available in the - /// buffer of messages towards the given peer. If the peer processes notifications at a slower - /// rate than we send them, this buffer will quickly fill up. - /// - /// As such, you should never do something like this: - /// - /// ```ignore - /// // Do NOT do this - /// for peer in peers { - /// if let Ok(n) = network.notification_sender(peer, ...) { - /// if let Ok(s) = n.ready().await { - /// let _ = s.send(...); - /// } - /// } - /// } - /// ``` - /// - /// Doing so would slow down all peers to the rate of the slowest one. A malicious or - /// malfunctioning peer could intentionally process notifications at a very slow rate. - /// - /// Instead, you are encouraged to maintain your own buffer of notifications on top of the one - /// maintained by `sc-network`, and use `notification_sender` to progressively send out - /// elements from your buffer. If this additional buffer is full (which will happen at some - /// point if the peer is too slow to process notifications), appropriate measures can be taken, - /// such as removing non-critical notifications from the buffer or disconnecting the peer - /// using [`NetworkPeers::disconnect_peer`]. - /// - /// - /// Notifications Per-peer buffer - /// broadcast +-------> of notifications +--> `notification_sender` +--> Internet - /// ^ (not covered by - /// | sc-network) - /// + - /// Notifications should be dropped - /// if buffer is full - /// - /// - /// See also the `sc-network-gossip` crate for a higher-level way to send notifications. - fn notification_sender( - &self, - target: PeerId, - protocol: ProtocolName, - ) -> Result, NotificationSenderError>; - - /// Set handshake for the notification protocol. - fn set_notification_handshake(&self, protocol: ProtocolName, handshake: Vec); -} - -impl NetworkNotification for Arc -where - T: ?Sized, - T: NetworkNotification, -{ - fn write_notification(&self, target: PeerId, protocol: ProtocolName, message: Vec) { - T::write_notification(self, target, protocol, message) - } - - fn notification_sender( - &self, - target: PeerId, - protocol: ProtocolName, - ) -> Result, NotificationSenderError> { - T::notification_sender(self, target, protocol) - } - - fn set_notification_handshake(&self, protocol: ProtocolName, handshake: Vec) { - T::set_notification_handshake(self, protocol, handshake) - } -} - /// Provides ability to send network requests. #[async_trait::async_trait] pub trait NetworkRequest { @@ -662,6 +720,15 @@ pub enum Direction { Outbound, } +impl From for Direction { + fn from(direction: litep2p::protocol::notification::Direction) -> Self { + match direction { + litep2p::protocol::notification::Direction::Inbound => Direction::Inbound, + litep2p::protocol::notification::Direction::Outbound => Direction::Outbound, + } + } +} + impl Direction { /// Is the direction inbound. pub fn is_inbound(&self) -> bool { @@ -771,13 +838,13 @@ pub trait NotificationService: Debug + Send { async fn close_substream(&mut self, peer: PeerId) -> Result<(), ()>; /// Send synchronous `notification` to `peer`. - fn send_sync_notification(&self, peer: &PeerId, notification: Vec); + fn send_sync_notification(&mut self, peer: &PeerId, notification: Vec); /// Send asynchronous `notification` to `peer`, allowing sender to exercise backpressure. /// /// Returns an error if the peer doesn't exist. async fn send_async_notification( - &self, + &mut self, peer: &PeerId, notification: Vec, ) -> Result<(), error::Error>; @@ -827,3 +894,12 @@ pub trait MessageSink: Send + Sync { /// Returns an error if the peer does not exist. async fn send_async_notification(&self, notification: Vec) -> Result<(), error::Error>; } + +/// Trait defining the behavior of a bandwidth sink. +pub trait BandwidthSink: Send + Sync { + /// Get the number of bytes received. + fn total_inbound(&self) -> u64; + + /// Get the number of bytes sent. + fn total_outbound(&self) -> u64; +} diff --git a/substrate/client/network/src/types.rs b/substrate/client/network/src/types.rs index b0e32ae109149e2485c62d469c1b14624989ac03..25517599469e66294563575f1fbe69cc21240ceb 100644 --- a/substrate/client/network/src/types.rs +++ b/substrate/client/network/src/types.rs @@ -28,6 +28,8 @@ use std::{ sync::Arc, }; +pub use libp2p::{multiaddr, Multiaddr, PeerId}; + /// The protocol name transmitted on the wire. #[derive(Debug, Clone)] pub enum ProtocolName { @@ -98,6 +100,24 @@ impl upgrade::ProtocolName for ProtocolName { } } +impl From for litep2p::ProtocolName { + fn from(protocol: ProtocolName) -> Self { + match protocol { + ProtocolName::Static(inner) => litep2p::ProtocolName::from(inner), + ProtocolName::OnHeap(inner) => litep2p::ProtocolName::from(inner), + } + } +} + +impl From for ProtocolName { + fn from(protocol: litep2p::ProtocolName) -> Self { + match protocol { + litep2p::ProtocolName::Static(protocol) => ProtocolName::from(protocol), + litep2p::ProtocolName::Allocated(protocol) => ProtocolName::from(protocol), + } + } +} + #[cfg(test)] mod tests { use super::ProtocolName; diff --git a/substrate/client/network/statement/Cargo.toml b/substrate/client/network/statement/Cargo.toml index 0a0ce61527d1b349378fbd6f92d0cecde364d363..4ffe6d6e3aedf9154c073f63fa2ddbf4dda12c01 100644 --- a/substrate/client/network/statement/Cargo.toml +++ b/substrate/client/network/statement/Cargo.toml @@ -19,12 +19,14 @@ targets = ["x86_64-unknown-linux-gnu"] array-bytes = "6.1" async-channel = "1.8.0" codec = { package = "parity-scale-codec", version = "3.6.1", features = ["derive"] } -futures = "0.3.21" +futures = "0.3.30" libp2p = "0.51.4" -log = "0.4.17" +log = { workspace = true, default-features = true } prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../../utils/prometheus" } sc-network-common = { path = "../common" } sc-network-sync = { path = "../sync" } +sc-network-types = { path = "../types" } sc-network = { path = ".." } sp-consensus = { path = "../../../primitives/consensus/common" } +sp-runtime = { path = "../../../primitives/runtime" } sp-statement-store = { path = "../../../primitives/statement-store" } diff --git a/substrate/client/network/statement/src/lib.rs b/substrate/client/network/statement/src/lib.rs index 5187e681d83c48b09bea2476f8cfe8c8b6806a3c..df93788696e381b18e80cff73646bb1594636386 100644 --- a/substrate/client/network/statement/src/lib.rs +++ b/substrate/client/network/statement/src/lib.rs @@ -30,18 +30,23 @@ use crate::config::*; use codec::{Decode, Encode}; use futures::{channel::oneshot, prelude::*, stream::FuturesUnordered, FutureExt}; -use libp2p::{multiaddr, PeerId}; use prometheus_endpoint::{register, Counter, PrometheusError, Registry, U64}; use sc_network::{ - config::{NonDefaultSetConfig, NonReservedPeerMode, SetConfig}, - error, - service::traits::{NotificationEvent, NotificationService, ValidationResult}, + config::{NonReservedPeerMode, SetConfig}, + error, multiaddr, + peer_store::PeerStoreProvider, + service::{ + traits::{NotificationEvent, NotificationService, ValidationResult}, + NotificationMetrics, + }, types::ProtocolName, utils::{interval, LruHashSet}, - NetworkEventStream, NetworkNotification, NetworkPeers, + NetworkBackend, NetworkEventStream, NetworkPeers, }; use sc_network_common::role::ObservedRole; use sc_network_sync::{SyncEvent, SyncEventStream}; +use sc_network_types::PeerId; +use sp_runtime::traits::Block as BlockT; use sp_statement_store::{ Hash, NetworkPriority, Statement, StatementSource, StatementStore, SubmitResult, }; @@ -107,17 +112,23 @@ pub struct StatementHandlerPrototype { impl StatementHandlerPrototype { /// Create a new instance. - pub fn new>( + pub fn new< + Hash: AsRef<[u8]>, + Block: BlockT, + Net: NetworkBackend::Hash>, + >( genesis_hash: Hash, fork_id: Option<&str>, - ) -> (Self, NonDefaultSetConfig) { + metrics: NotificationMetrics, + peer_store_handle: Arc, + ) -> (Self, Net::NotificationProtocolConfig) { let genesis_hash = genesis_hash.as_ref(); let protocol_name = if let Some(fork_id) = fork_id { format!("/{}/{}/statement/1", array_bytes::bytes2hex("", genesis_hash), fork_id) } else { format!("/{}/statement/1", array_bytes::bytes2hex("", genesis_hash)) }; - let (config, notification_service) = NonDefaultSetConfig::new( + let (config, notification_service) = Net::notification_config( protocol_name.clone().into(), Vec::new(), MAX_STATEMENT_SIZE, @@ -128,6 +139,8 @@ impl StatementHandlerPrototype { reserved_nodes: Vec::new(), non_reserved_mode: NonReservedPeerMode::Deny, }, + metrics, + peer_store_handle, ); (Self { protocol_name: protocol_name.into(), notification_service }, config) @@ -138,7 +151,7 @@ impl StatementHandlerPrototype { /// Important: the statements handler is initially disabled and doesn't gossip statements. /// Gossiping is enabled when major syncing is done. pub fn build< - N: NetworkPeers + NetworkEventStream + NetworkNotification, + N: NetworkPeers + NetworkEventStream, S: SyncEventStream + sp_consensus::SyncOracle, >( self, @@ -201,7 +214,7 @@ impl StatementHandlerPrototype { /// Handler for statements. Call [`StatementHandler::run`] to start the processing. pub struct StatementHandler< - N: NetworkPeers + NetworkEventStream + NetworkNotification, + N: NetworkPeers + NetworkEventStream, S: SyncEventStream + sp_consensus::SyncOracle, > { protocol_name: ProtocolName, @@ -241,7 +254,7 @@ struct Peer { impl StatementHandler where - N: NetworkPeers + NetworkEventStream + NetworkNotification, + N: NetworkPeers + NetworkEventStream, S: SyncEventStream + sp_consensus::SyncOracle, { /// Turns the [`StatementHandler`] into a future that should run forever and not be @@ -459,8 +472,7 @@ where if !to_send.is_empty() { log::trace!(target: LOG_TARGET, "Sending {} statements to {}", to_send.len(), who); - self.network - .write_notification(*who, self.protocol_name.clone(), to_send.encode()); + self.notification_service.send_sync_notification(who, to_send.encode()); } } diff --git a/substrate/client/network/sync/Cargo.toml b/substrate/client/network/sync/Cargo.toml index f81b4ee77bdf4b4babbede1936d65c19bc784cb9..eb79973c2739a3bfd11477b4bbf0979249a741e6 100644 --- a/substrate/client/network/sync/Cargo.toml +++ b/substrate/client/network/sync/Cargo.toml @@ -21,17 +21,17 @@ prost-build = "0.11" [dependencies] array-bytes = "6.1" async-channel = "1.8.0" -async-trait = "0.1.74" +async-trait = "0.1.79" codec = { package = "parity-scale-codec", version = "3.6.1", features = ["derive"] } -futures = "0.3.21" +futures = "0.3.30" futures-timer = "3.0.2" libp2p = "0.51.4" -log = "0.4.17" +log = { workspace = true, default-features = true } mockall = "0.11.3" prost = "0.12" schnellru = "0.2.1" smallvec = "1.11.0" -thiserror = "1.0" +thiserror = { workspace = true } tokio-stream = "0.1.14" tokio = { version = "1.32.0", features = ["macros", "time"] } fork-tree = { path = "../../../utils/fork-tree" } @@ -40,6 +40,7 @@ sc-client-api = { path = "../../api" } sc-consensus = { path = "../../consensus/common" } sc-network = { path = ".." } sc-network-common = { path = "../common" } +sc-network-types = { path = "../types" } sc-utils = { path = "../../utils" } sp-arithmetic = { path = "../../../primitives/arithmetic" } sp-blockchain = { path = "../../../primitives/blockchain" } diff --git a/substrate/client/network/sync/src/block_announce_validator.rs b/substrate/client/network/sync/src/block_announce_validator.rs index 62c0d1c16e213736bc1abc0b45c24bce43701970..3c994dd69442a0a7b0f29820b8044f0308436c48 100644 --- a/substrate/client/network/sync/src/block_announce_validator.rs +++ b/substrate/client/network/sync/src/block_announce_validator.rs @@ -21,9 +21,9 @@ use crate::{futures_stream::FuturesStream, LOG_TARGET}; use futures::{stream::FusedStream, Future, FutureExt, Stream, StreamExt}; -use libp2p::PeerId; use log::{debug, error, trace, warn}; use sc_network_common::sync::message::BlockAnnounce; +use sc_network_types::PeerId; use sp_consensus::block_validation::Validation; use sp_runtime::traits::{Block as BlockT, Header, Zero}; use std::{ @@ -309,7 +309,7 @@ impl FusedStream for BlockAnnounceValidator { mod tests { use super::*; use crate::block_announce_validator::AllocateSlotForBlockAnnounceValidation; - use libp2p::PeerId; + use sc_network_types::PeerId; use sp_consensus::block_validation::DefaultBlockAnnounceValidator; use substrate_test_runtime_client::runtime::Block; diff --git a/substrate/client/network/sync/src/block_relay_protocol.rs b/substrate/client/network/sync/src/block_relay_protocol.rs index b4ef72a10c6b8fc54532ef38903eea70fcbfdae8..3c5b3739e8222395b896003af8bc72e9ea68b9e7 100644 --- a/substrate/client/network/sync/src/block_relay_protocol.rs +++ b/substrate/client/network/sync/src/block_relay_protocol.rs @@ -17,12 +17,9 @@ //! Block relay protocol related definitions. use futures::channel::oneshot; -use libp2p::PeerId; -use sc_network::{ - request_responses::{ProtocolConfig, RequestFailure}, - ProtocolName, -}; +use sc_network::{request_responses::RequestFailure, NetworkBackend, ProtocolName}; use sc_network_common::sync::message::{BlockData, BlockRequest}; +use sc_network_types::PeerId; use sp_runtime::traits::Block as BlockT; use std::sync::Arc; @@ -68,8 +65,8 @@ pub enum BlockResponseError { /// Block relay specific params for network creation, specified in /// ['sc_service::BuildNetworkParams']. -pub struct BlockRelayParams { +pub struct BlockRelayParams::Hash>> { pub server: Box>, pub downloader: Arc>, - pub request_response_config: ProtocolConfig, + pub request_response_config: N::RequestResponseProtocolConfig, } diff --git a/substrate/client/network/sync/src/block_request_handler.rs b/substrate/client/network/sync/src/block_request_handler.rs index 7dfa76278b8d11688cb1b8c167d19ce105ef610f..5aa374057a4a231144d39fc2c48818e906b5a245 100644 --- a/substrate/client/network/sync/src/block_request_handler.rs +++ b/substrate/client/network/sync/src/block_request_handler.rs @@ -29,24 +29,26 @@ use crate::{ use codec::{Decode, DecodeAll, Encode}; use futures::{channel::oneshot, stream::StreamExt}; -use libp2p::PeerId; use log::debug; use prost::Message; +use schnellru::{ByLength, LruMap}; + use sc_client_api::BlockBackend; use sc_network::{ config::ProtocolId, - request_responses::{ - IfDisconnected, IncomingRequest, OutgoingResponse, ProtocolConfig, RequestFailure, - }, + request_responses::{IfDisconnected, IncomingRequest, OutgoingResponse, RequestFailure}, + service::traits::RequestResponseConfig, types::ProtocolName, + NetworkBackend, }; use sc_network_common::sync::message::{BlockAttributes, BlockData, BlockRequest, FromBlock}; -use schnellru::{ByLength, LruMap}; +use sc_network_types::PeerId; use sp_blockchain::HeaderBackend; use sp_runtime::{ generic::BlockId, traits::{Block as BlockT, Header, One, Zero}, }; + use std::{ cmp::min, hash::{Hash, Hasher}, @@ -71,21 +73,26 @@ mod rep { Rep::new(-(1 << 10), "same small block request multiple times"); } -/// Generates a [`ProtocolConfig`] for the block request protocol, refusing incoming requests. -pub fn generate_protocol_config>( +/// Generates a `RequestResponseProtocolConfig` for the block request protocol, +/// refusing incoming requests. +pub fn generate_protocol_config< + Hash: AsRef<[u8]>, + B: BlockT, + N: NetworkBackend::Hash>, +>( protocol_id: &ProtocolId, genesis_hash: Hash, fork_id: Option<&str>, -) -> ProtocolConfig { - ProtocolConfig { - name: generate_protocol_name(genesis_hash, fork_id).into(), - fallback_names: std::iter::once(generate_legacy_protocol_name(protocol_id).into()) - .collect(), - max_request_size: 1024 * 1024, - max_response_size: 16 * 1024 * 1024, - request_timeout: Duration::from_secs(20), - inbound_queue: None, - } + inbound_queue: async_channel::Sender, +) -> N::RequestResponseProtocolConfig { + N::request_response_config( + generate_protocol_name(genesis_hash, fork_id).into(), + std::iter::once(generate_legacy_protocol_name(protocol_id).into()).collect(), + 1024 * 1024, + 16 * 1024 * 1024, + Duration::from_secs(20), + Some(inbound_queue), + ) } /// Generate the block protocol name from the genesis hash and fork id. @@ -154,19 +161,19 @@ where Client: HeaderBackend + BlockBackend + Send + Sync + 'static, { /// Create a new [`BlockRequestHandler`]. - pub fn new( + pub fn new::Hash>>( network: NetworkServiceHandle, protocol_id: &ProtocolId, fork_id: Option<&str>, client: Arc, num_peer_hint: usize, - ) -> BlockRelayParams { + ) -> BlockRelayParams { // Reserve enough request slots for one request per peer when we are at the maximum // number of peers. let capacity = std::cmp::max(num_peer_hint, 1); let (tx, request_receiver) = async_channel::bounded(capacity); - let mut protocol_config = generate_protocol_config( + let protocol_config = generate_protocol_config::<_, B, N>( protocol_id, client .block_hash(0u32.into()) @@ -174,15 +181,18 @@ where .flatten() .expect("Genesis block exists; qed"), fork_id, + tx, ); - protocol_config.inbound_queue = Some(tx); let capacity = ByLength::new(num_peer_hint.max(1) as u32 * 2); let seen_requests = LruMap::new(capacity); BlockRelayParams { server: Box::new(Self { client, request_receiver, seen_requests }), - downloader: Arc::new(FullBlockDownloader::new(protocol_config.name.clone(), network)), + downloader: Arc::new(FullBlockDownloader::new( + protocol_config.protocol_name().clone(), + network, + )), request_response_config: protocol_config, } } diff --git a/substrate/client/network/sync/src/blocks.rs b/substrate/client/network/sync/src/blocks.rs index 4988045a4786720771ad84d9bd3b3cb0aa96592a..af88c5245dcb0a4cddac6087abd07c073e97d241 100644 --- a/substrate/client/network/sync/src/blocks.rs +++ b/substrate/client/network/sync/src/blocks.rs @@ -17,9 +17,9 @@ // along with this program. If not, see . use crate::LOG_TARGET; -use libp2p::PeerId; use log::trace; use sc_network_common::sync::message; +use sc_network_types::PeerId; use sp_runtime::traits::{Block as BlockT, NumberFor, One}; use std::{ cmp, @@ -262,8 +262,8 @@ impl BlockCollection { #[cfg(test)] mod test { use super::{BlockCollection, BlockData, BlockRangeState}; - use libp2p::PeerId; use sc_network_common::sync::message; + use sc_network_types::PeerId; use sp_core::H256; use sp_runtime::testing::{Block as RawBlock, ExtrinsicWrapper}; diff --git a/substrate/client/network/sync/src/engine.rs b/substrate/client/network/sync/src/engine.rs index 7486c091ebf13d1fef6422ab193cebd2b4dd24f9..bb6e7a98a810d3f8fe83a72e79f21a94d44e5d27 100644 --- a/substrate/client/network/sync/src/engine.rs +++ b/substrate/client/network/sync/src/engine.rs @@ -33,7 +33,7 @@ use crate::{ }, strategy::{ warp::{EncodedProof, WarpProofRequest, WarpSyncParams}, - SyncingAction, SyncingConfig, SyncingStrategy, + StrategyKey, SyncingAction, SyncingConfig, SyncingStrategy, }, types::{ BadPeer, ExtendedPeerInfo, OpaqueStateRequest, OpaqueStateResponse, PeerRequest, SyncEvent, @@ -47,8 +47,8 @@ use futures::{ future::{BoxFuture, Fuse}, FutureExt, StreamExt, }; -use libp2p::{request_response::OutboundFailure, PeerId}; -use log::{debug, error, trace}; +use libp2p::request_response::OutboundFailure; +use log::{debug, error, trace, warn}; use prometheus_endpoint::{ register, Counter, Gauge, MetricSource, Opts, PrometheusError, Registry, SourcedGauge, U64, }; @@ -59,21 +59,22 @@ use tokio::time::{Interval, MissedTickBehavior}; use sc_client_api::{BlockBackend, HeaderBackend, ProofProvider}; use sc_consensus::{import_queue::ImportQueueService, IncomingBlock}; use sc_network::{ - config::{ - FullNetworkConfiguration, NonDefaultSetConfig, NonReservedPeerMode, NotificationHandshake, - ProtocolId, SetConfig, - }, - peer_store::{PeerStoreHandle, PeerStoreProvider}, + config::{FullNetworkConfiguration, NotificationHandshake, ProtocolId, SetConfig}, + peer_store::PeerStoreProvider, request_responses::{IfDisconnected, RequestFailure}, - service::traits::{Direction, NotificationEvent, ValidationResult}, + service::{ + traits::{Direction, NotificationConfig, NotificationEvent, ValidationResult}, + NotificationMetrics, + }, types::ProtocolName, utils::LruHashSet, - NotificationService, ReputationChange, + NetworkBackend, NotificationService, ReputationChange, }; use sc_network_common::{ role::Roles, sync::message::{BlockAnnounce, BlockAnnouncesHandshake, BlockRequest, BlockState}, }; +use sc_network_types::PeerId; use sc_utils::mpsc::{tracing_unbounded, TracingUnboundedReceiver, TracingUnboundedSender}; use sp_blockchain::{Error as ClientError, HeaderMetadata}; use sp_consensus::{block_validation::BlockAnnounceValidator, BlockOrigin}; @@ -90,7 +91,6 @@ use std::{ atomic::{AtomicBool, AtomicUsize, Ordering}, Arc, }, - time::{Duration, Instant}, }; /// Interval at which we perform time based maintenance @@ -99,23 +99,6 @@ const TICK_TIMEOUT: std::time::Duration = std::time::Duration::from_millis(1100) /// Maximum number of known block hashes to keep for a peer. const MAX_KNOWN_BLOCKS: usize = 1024; // ~32kb per peer + LruHashSet overhead -/// If the block announces stream to peer has been inactive for 30 seconds meaning local node -/// has not sent or received block announcements to/from the peer, report the node for inactivity, -/// disconnect it and attempt to establish connection to some other peer. -const INACTIVITY_EVICT_THRESHOLD: Duration = Duration::from_secs(30); - -/// When `SyncingEngine` is started, wait two minutes before actually staring to count peers as -/// evicted. -/// -/// Parachain collator may incorrectly get evicted because it's waiting to receive a number of -/// relaychain blocks before it can start creating parachain blocks. During this wait, -/// `SyncingEngine` still counts it as active and as the peer is not sending blocks, it may get -/// evicted if a block is not received within the first 30 secons since the peer connected. -/// -/// To prevent this from happening, define a threshold for how long `SyncingEngine` should wait -/// before it starts evicting peers. -const INITIAL_EVICTION_WAIT_PERIOD: Duration = Duration::from_secs(2 * 60); - /// Maximum allowed size for a block announce. const MAX_BLOCK_ANNOUNCE_SIZE: u64 = 1024 * 1024; @@ -125,8 +108,6 @@ mod rep { pub const GENESIS_MISMATCH: Rep = Rep::new_fatal("Genesis mismatch"); /// Peer send us a block announcement that failed at validation. pub const BAD_BLOCK_ANNOUNCEMENT: Rep = Rep::new(-(1 << 12), "Bad block announcement"); - /// Block announce substream with the peer has been inactive too long - pub const INACTIVE_SUBSTREAM: Rep = Rep::new(-(1 << 10), "Inactive block announce substream"); /// We received a message that failed to decode. pub const BAD_MESSAGE: Rep = Rep::new(-(1 << 12), "Bad message"); /// Peer is on unsupported protocol version. @@ -214,9 +195,6 @@ pub struct SyncingEngine { /// Syncing strategy. strategy: SyncingStrategy, - /// Syncing configuration for startegies. - syncing_config: SyncingConfig, - /// Blockchain client. client: Arc, @@ -292,17 +270,8 @@ pub struct SyncingEngine { /// Handle that is used to communicate with `sc_network::Notifications`. notification_service: Box, - /// When the syncing was started. - /// - /// Stored as an `Option` so once the initial wait has passed, `SyncingEngine` - /// can reset the peer timers and continue with the normal eviction process. - syncing_started: Option, - /// Handle to `PeerStore`. - peer_store_handle: PeerStoreHandle, - - /// Instant when the last notification was sent or received. - last_notification_io: Instant, + peer_store_handle: Arc, /// Pending responses pending_responses: PendingResponses, @@ -331,11 +300,12 @@ where + Sync + 'static, { - pub fn new( + pub fn new( roles: Roles, client: Arc, metrics_registry: Option<&Registry>, - net_config: &FullNetworkConfiguration, + network_metrics: NotificationMetrics, + net_config: &FullNetworkConfiguration::Hash, N>, protocol_id: ProtocolId, fork_id: &Option, block_announce_validator: Box + Send>, @@ -345,8 +315,11 @@ where block_downloader: Arc>, state_request_protocol_name: ProtocolName, warp_sync_protocol_name: Option, - peer_store_handle: PeerStoreHandle, - ) -> Result<(Self, SyncingService, NonDefaultSetConfig), ClientError> { + peer_store_handle: Arc, + ) -> Result<(Self, SyncingService, N::NotificationProtocolConfig), ClientError> + where + N: NetworkBackend::Hash>, + { let mode = net_config.network_config.sync_mode; let max_parallel_downloads = net_config.network_config.max_parallel_downloads; let max_blocks_per_request = @@ -414,20 +387,24 @@ where total.saturating_sub(net_config.network_config.default_peers_set_num_full) as usize }; - let (block_announce_config, notification_service) = Self::get_block_announce_proto_config( - protocol_id, - fork_id, - roles, - client.info().best_number, - client.info().best_hash, - client - .block_hash(Zero::zero()) - .ok() - .flatten() - .expect("Genesis block exists; qed"), - ); + let (block_announce_config, notification_service) = + Self::get_block_announce_proto_config::( + protocol_id, + fork_id, + roles, + client.info().best_number, + client.info().best_hash, + client + .block_hash(Zero::zero()) + .ok() + .flatten() + .expect("Genesis block exists; qed"), + &net_config.network_config.default_peers_set, + network_metrics, + Arc::clone(&peer_store_handle), + ); - // Split warp sync params into warp sync config and a channel to retreive target block + // Split warp sync params into warp sync config and a channel to retrieve target block // header. let (warp_sync_config, warp_sync_target_block_header_rx) = warp_sync_params.map_or((None, None), |params| { @@ -441,8 +418,7 @@ where .map_or(futures::future::pending().boxed().fuse(), |rx| rx.boxed().fuse()); // Initialize syncing strategy. - let strategy = - SyncingStrategy::new(syncing_config.clone(), client.clone(), warp_sync_config)?; + let strategy = SyncingStrategy::new(syncing_config, client.clone(), warp_sync_config)?; let block_announce_protocol_name = block_announce_config.protocol_name().clone(); let (tx, service_rx) = tracing_unbounded("mpsc_chain_sync", 100_000); @@ -471,7 +447,6 @@ where roles, client, strategy, - syncing_config, network_service, peers: HashMap::new(), block_announce_data_cache: LruMap::new(ByLength::new(cache_capacity)), @@ -495,9 +470,7 @@ where event_streams: Vec::new(), notification_service, tick_timeout, - syncing_started: None, peer_store_handle, - last_notification_io: Instant::now(), metrics: if let Some(r) = metrics_registry { match Metrics::register(r, is_major_syncing.clone()) { Ok(metrics) => Some(metrics), @@ -643,15 +616,12 @@ where data: Some(data.clone()), }; - self.last_notification_io = Instant::now(); let _ = self.notification_service.send_sync_notification(peer_id, message.encode()); } } } pub async fn run(mut self) { - self.syncing_started = Some(Instant::now()); - loop { tokio::select! { _ = self.tick_timeout.tick() => self.perform_periodic_actions(), @@ -661,8 +631,17 @@ where Some(event) => self.process_notification_event(event), None => return, }, - warp_target_block_header = &mut self.warp_sync_target_block_header_rx_fused => - self.pass_warp_sync_target_block_header(warp_target_block_header), + // TODO: setting of warp sync target block should be moved to the initialization of + // `SyncingEngine`, see https://github.com/paritytech/polkadot-sdk/issues/3537. + warp_target_block_header = &mut self.warp_sync_target_block_header_rx_fused => { + if let Err(_) = self.pass_warp_sync_target_block_header(warp_target_block_header) { + error!( + target: LOG_TARGET, + "Failed to set warp sync target block header, terminating `SyncingEngine`.", + ); + return + } + }, response_event = self.pending_responses.select_next_some() => self.process_response_event(response_event), validation_result = self.block_announce_validator.select_next_some() => @@ -675,48 +654,61 @@ where // Process actions requested by a syncing strategy. if let Err(e) = self.process_strategy_actions() { - error!("Terminating `SyncingEngine` due to fatal error: {e:?}"); + error!( + target: LOG_TARGET, + "Terminating `SyncingEngine` due to fatal error: {e:?}.", + ); return } } } fn process_strategy_actions(&mut self) -> Result<(), ClientError> { - for action in self.strategy.actions() { + for action in self.strategy.actions()? { match action { - SyncingAction::SendBlockRequest { peer_id, request } => { + SyncingAction::SendBlockRequest { peer_id, key, request } => { // Sending block request implies dropping obsolete pending response as we are // not interested in it anymore (see [`SyncingAction::SendBlockRequest`]). - // Furthermore, only one request at a time is allowed to any peer. - let removed = self.pending_responses.remove(&peer_id); - self.send_block_request(peer_id, request.clone()); - - trace!( - target: LOG_TARGET, - "Processed `ChainSyncAction::SendBlockRequest` to {} with {:?}, stale response removed: {}.", - peer_id, - request, - removed, - ) + let removed = self.pending_responses.remove(peer_id, key); + self.send_block_request(peer_id, key, request.clone()); + + if removed { + warn!( + target: LOG_TARGET, + "Processed `ChainSyncAction::SendBlockRequest` to {} from {:?} with {:?}. \ + Stale response removed!", + peer_id, + key, + request, + ) + } else { + trace!( + target: LOG_TARGET, + "Processed `ChainSyncAction::SendBlockRequest` to {} from {:?} with {:?}.", + peer_id, + key, + request, + ) + } }, - SyncingAction::CancelBlockRequest { peer_id } => { - let removed = self.pending_responses.remove(&peer_id); + SyncingAction::CancelRequest { peer_id, key } => { + let removed = self.pending_responses.remove(peer_id, key); trace!( target: LOG_TARGET, "Processed {action:?}, response removed: {removed}.", ); }, - SyncingAction::SendStateRequest { peer_id, request } => { - self.send_state_request(peer_id, request); + SyncingAction::SendStateRequest { peer_id, key, request } => { + self.send_state_request(peer_id, key, request); trace!( target: LOG_TARGET, - "Processed `ChainSyncAction::SendBlockRequest` to {peer_id}.", + "Processed `ChainSyncAction::SendStateRequest` to {peer_id}.", ); }, - SyncingAction::SendWarpProofRequest { peer_id, request } => { - self.send_warp_proof_request(peer_id, request.clone()); + SyncingAction::SendWarpProofRequest { peer_id, key, request } => { + self.send_warp_proof_request(peer_id, key, request.clone()); trace!( target: LOG_TARGET, @@ -726,7 +718,7 @@ where ); }, SyncingAction::DropPeer(BadPeer(peer_id, rep)) => { - self.pending_responses.remove(&peer_id); + self.pending_responses.remove_all(&peer_id); self.network_service .disconnect_peer(peer_id, self.block_announce_protocol_name.clone()); self.network_service.report_peer(peer_id, rep); @@ -753,20 +745,8 @@ where number, ) }, - SyncingAction::Finished => { - let connected_peers = self.peers.iter().filter_map(|(peer_id, peer)| { - peer.info.roles.is_full().then_some(( - *peer_id, - peer.info.best_hash, - peer.info.best_number, - )) - }); - self.strategy.switch_to_next( - self.syncing_config.clone(), - self.client.clone(), - connected_peers, - )?; - }, + // Nothing to do, this is handled internally by `SyncingStrategy`. + SyncingAction::Finished => {}, } } @@ -775,39 +755,6 @@ where fn perform_periodic_actions(&mut self) { self.report_metrics(); - - // if `SyncingEngine` has just started, don't evict seemingly inactive peers right away - // as they may not have produced blocks not because they've disconnected but because - // they're still waiting to receive enough relaychain blocks to start producing blocks. - if let Some(started) = self.syncing_started { - if started.elapsed() < INITIAL_EVICTION_WAIT_PERIOD { - return - } - - self.syncing_started = None; - self.last_notification_io = Instant::now(); - } - - // if syncing hasn't sent or received any blocks within `INACTIVITY_EVICT_THRESHOLD`, - // it means the local node has stalled and is connected to peers who either don't - // consider it connected or are also all stalled. In order to unstall the node, - // disconnect all peers and allow `ProtocolController` to establish new connections. - if self.last_notification_io.elapsed() > INACTIVITY_EVICT_THRESHOLD { - log::debug!( - target: LOG_TARGET, - "syncing has halted due to inactivity, evicting all peers", - ); - - for peer in self.peers.keys() { - self.network_service.report_peer(*peer, rep::INACTIVE_SUBSTREAM); - self.network_service - .disconnect_peer(*peer, self.block_announce_protocol_name.clone()); - } - - // after all the peers have been evicted, start timer again to prevent evicting - // new peers that join after the old peer have been evicted - self.last_notification_io = Instant::now(); - } } fn process_service_command(&mut self, command: ToServiceCommand) { @@ -942,29 +889,23 @@ where return }; - self.last_notification_io = Instant::now(); self.push_block_announce_validation(peer, announce); }, } } - fn pass_warp_sync_target_block_header(&mut self, header: Result) { + fn pass_warp_sync_target_block_header( + &mut self, + header: Result, + ) -> Result<(), ()> { match header { - Ok(header) => - if let SyncingStrategy::WarpSyncStrategy(warp_sync) = &mut self.strategy { - warp_sync.set_target_block(header); - } else { - error!( - target: LOG_TARGET, - "Cannot set warp sync target block: no warp sync strategy is active." - ); - debug_assert!(false); - }, + Ok(header) => self.strategy.set_warp_sync_target_block_header(header), Err(err) => { error!( target: LOG_TARGET, "Failed to get target block for warp sync. Error: {err:?}", ); + Err(()) }, } } @@ -1002,7 +943,7 @@ where } self.strategy.remove_peer(&peer_id); - self.pending_responses.remove(&peer_id); + self.pending_responses.remove_all(&peer_id); self.event_streams .retain(|stream| stream.unbounded_send(SyncEvent::PeerDisconnected(peer_id)).is_ok()); } @@ -1057,7 +998,7 @@ where // still be under validation. If the peer has different genesis than the // local node the validation fails but the peer cannot be reported in // `validate_connection()` as that is also called by - // `ValiateInboundSubstream` which means that the peer is still being + // `ValidateInboundSubstream` which means that the peer is still being // validated and banning the peer when handling that event would // result in peer getting dropped twice. // @@ -1167,7 +1108,7 @@ where Ok(()) } - fn send_block_request(&mut self, peer_id: PeerId, request: BlockRequest) { + fn send_block_request(&mut self, peer_id: PeerId, key: StrategyKey, request: BlockRequest) { if !self.peers.contains_key(&peer_id) { trace!(target: LOG_TARGET, "Cannot send block request to unknown peer {peer_id}"); debug_assert!(false); @@ -1178,12 +1119,18 @@ where self.pending_responses.insert( peer_id, + key, PeerRequest::Block(request.clone()), async move { downloader.download_blocks(peer_id, request).await }.boxed(), ); } - fn send_state_request(&mut self, peer_id: PeerId, request: OpaqueStateRequest) { + fn send_state_request( + &mut self, + peer_id: PeerId, + key: StrategyKey, + request: OpaqueStateRequest, + ) { if !self.peers.contains_key(&peer_id) { trace!(target: LOG_TARGET, "Cannot send state request to unknown peer {peer_id}"); debug_assert!(false); @@ -1192,7 +1139,7 @@ where let (tx, rx) = oneshot::channel(); - self.pending_responses.insert(peer_id, PeerRequest::State, rx.boxed()); + self.pending_responses.insert(peer_id, key, PeerRequest::State, rx.boxed()); match Self::encode_state_request(&request) { Ok(data) => { @@ -1213,7 +1160,12 @@ where } } - fn send_warp_proof_request(&mut self, peer_id: PeerId, request: WarpProofRequest) { + fn send_warp_proof_request( + &mut self, + peer_id: PeerId, + key: StrategyKey, + request: WarpProofRequest, + ) { if !self.peers.contains_key(&peer_id) { trace!(target: LOG_TARGET, "Cannot send warp proof request to unknown peer {peer_id}"); debug_assert!(false); @@ -1222,7 +1174,7 @@ where let (tx, rx) = oneshot::channel(); - self.pending_responses.insert(peer_id, PeerRequest::WarpProof, rx.boxed()); + self.pending_responses.insert(peer_id, key, PeerRequest::WarpProof, rx.boxed()); match &self.warp_sync_protocol_name { Some(name) => self.network_service.start_request( @@ -1259,14 +1211,14 @@ where } fn process_response_event(&mut self, response_event: ResponseEvent) { - let ResponseEvent { peer_id, request, response } = response_event; + let ResponseEvent { peer_id, key, request, response } = response_event; match response { Ok(Ok((resp, _))) => match request { PeerRequest::Block(req) => { match self.block_downloader.block_response_into_blocks(&req, resp) { Ok(blocks) => { - self.strategy.on_block_response(peer_id, req, blocks); + self.strategy.on_block_response(peer_id, key, req, blocks); }, Err(BlockResponseError::DecodeFailed(e)) => { debug!( @@ -1311,10 +1263,10 @@ where }, }; - self.strategy.on_state_response(peer_id, response); + self.strategy.on_state_response(peer_id, key, response); }, PeerRequest::WarpProof => { - self.strategy.on_warp_proof_response(&peer_id, EncodedProof(resp)); + self.strategy.on_warp_proof_response(&peer_id, key, EncodedProof(resp)); }, }, Ok(Err(e)) => { @@ -1374,14 +1326,17 @@ where } /// Get config for the block announcement protocol - fn get_block_announce_proto_config( + fn get_block_announce_proto_config::Hash>>( protocol_id: ProtocolId, fork_id: &Option, roles: Roles, best_number: NumberFor, best_hash: B::Hash, genesis_hash: B::Hash, - ) -> (NonDefaultSetConfig, Box) { + set_config: &SetConfig, + metrics: NotificationMetrics, + peer_store_handle: Arc, + ) -> (N::NotificationProtocolConfig, Box) { let block_announces_protocol = { let genesis_hash = genesis_hash.as_ref(); if let Some(ref fork_id) = fork_id { @@ -1395,7 +1350,7 @@ where } }; - NonDefaultSetConfig::new( + N::notification_config( block_announces_protocol.into(), iter::once(format!("/{}/block-announces/1", protocol_id.as_ref()).into()).collect(), MAX_BLOCK_ANNOUNCE_SIZE, @@ -1405,14 +1360,9 @@ where best_hash, genesis_hash, ))), - // NOTE: `set_config` will be ignored by `protocol.rs` as the block announcement - // protocol is still hardcoded into the peerset. - SetConfig { - in_peers: 0, - out_peers: 0, - reserved_nodes: Vec::new(), - non_reserved_mode: NonReservedPeerMode::Deny, - }, + set_config.clone(), + metrics, + peer_store_handle, ) } diff --git a/substrate/client/network/sync/src/extra_requests.rs b/substrate/client/network/sync/src/justification_requests.rs similarity index 98% rename from substrate/client/network/sync/src/extra_requests.rs rename to substrate/client/network/sync/src/justification_requests.rs index cd3008d270b1f8b87b186afa4566536216714769..2b50c85602d78bcbb04ce5ecb23882f81e184d81 100644 --- a/substrate/client/network/sync/src/extra_requests.rs +++ b/substrate/client/network/sync/src/justification_requests.rs @@ -16,14 +16,18 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . +//! Justification requests scheduling. [`ExtraRequests`] manages requesting justifications +//! from peers taking into account forks and their finalization (dropping pending requests +//! that don't make sense after one of the forks is finalized). + use crate::{ request_metrics::Metrics, strategy::chain_sync::{PeerSync, PeerSyncState}, LOG_TARGET, }; use fork_tree::ForkTree; -use libp2p::PeerId; use log::{debug, trace, warn}; +use sc_network_types::PeerId; use sp_blockchain::Error as ClientError; use sp_runtime::traits::{Block as BlockT, NumberFor, Zero}; use std::{ diff --git a/substrate/client/network/sync/src/lib.rs b/substrate/client/network/sync/src/lib.rs index 494e3b87aa95514d6377c413cdc8c850c0d06258..9f6c0f45d089ce415f9e8c0ae792de1d7a327407 100644 --- a/substrate/client/network/sync/src/lib.rs +++ b/substrate/client/network/sync/src/lib.rs @@ -23,12 +23,12 @@ pub use strategy::warp::{WarpSyncParams, WarpSyncPhase, WarpSyncProgress}; pub use types::{SyncEvent, SyncEventStream, SyncState, SyncStatus, SyncStatusProvider}; mod block_announce_validator; -mod extra_requests; mod futures_stream; +mod justification_requests; mod pending_responses; mod request_metrics; mod schema; -mod types; +pub mod types; pub mod block_relay_protocol; pub mod block_request_handler; diff --git a/substrate/client/network/sync/src/mock.rs b/substrate/client/network/sync/src/mock.rs index a4f5eb564c2cd341145d8623564f8cb04725bfbf..741fa7139583f0453d97810cba071fb37ee6e5ee 100644 --- a/substrate/client/network/sync/src/mock.rs +++ b/substrate/client/network/sync/src/mock.rs @@ -21,9 +21,9 @@ use crate::block_relay_protocol::{BlockDownloader as BlockDownloaderT, BlockResponseError}; use futures::channel::oneshot; -use libp2p::PeerId; use sc_network::{ProtocolName, RequestFailure}; use sc_network_common::sync::message::{BlockData, BlockRequest}; +use sc_network_types::PeerId; use sp_runtime::traits::Block as BlockT; mockall::mock! { diff --git a/substrate/client/network/sync/src/pending_responses.rs b/substrate/client/network/sync/src/pending_responses.rs index 21e409eb847fe600d07343cc22533af8cf5d8c36..7d2d598a2e061b5daa252dd12076cc0534bb44c8 100644 --- a/substrate/client/network/sync/src/pending_responses.rs +++ b/substrate/client/network/sync/src/pending_responses.rs @@ -19,16 +19,17 @@ //! [`PendingResponses`] is responsible for keeping track of pending responses and //! polling them. [`Stream`] implemented by [`PendingResponses`] never terminates. -use crate::{types::PeerRequest, LOG_TARGET}; +use crate::{strategy::StrategyKey, types::PeerRequest, LOG_TARGET}; use futures::{ channel::oneshot, future::BoxFuture, stream::{BoxStream, FusedStream, Stream}, FutureExt, StreamExt, }; -use libp2p::PeerId; use log::error; + use sc_network::{request_responses::RequestFailure, types::ProtocolName}; +use sc_network_types::PeerId; use sp_runtime::traits::Block as BlockT; use std::task::{Context, Poll, Waker}; use tokio_stream::StreamMap; @@ -42,6 +43,7 @@ type ResponseFuture = BoxFuture<'static, ResponseResult>; /// An event we receive once a pending response future resolves. pub(crate) struct ResponseEvent { pub peer_id: PeerId, + pub key: StrategyKey, pub request: PeerRequest, pub response: ResponseResult, } @@ -49,7 +51,8 @@ pub(crate) struct ResponseEvent { /// Stream taking care of polling pending responses. pub(crate) struct PendingResponses { /// Pending responses - pending_responses: StreamMap, ResponseResult)>>, + pending_responses: + StreamMap<(PeerId, StrategyKey), BoxStream<'static, (PeerRequest, ResponseResult)>>, /// Waker to implement never terminating stream waker: Option, } @@ -62,6 +65,7 @@ impl PendingResponses { pub fn insert( &mut self, peer_id: PeerId, + key: StrategyKey, request: PeerRequest, response_future: ResponseFuture, ) { @@ -70,7 +74,7 @@ impl PendingResponses { if self .pending_responses .insert( - peer_id, + (peer_id, key), Box::pin(async move { (request, response_future.await) }.into_stream()), ) .is_some() @@ -87,8 +91,20 @@ impl PendingResponses { } } - pub fn remove(&mut self, peer_id: &PeerId) -> bool { - self.pending_responses.remove(peer_id).is_some() + pub fn remove(&mut self, peer_id: PeerId, key: StrategyKey) -> bool { + self.pending_responses.remove(&(peer_id, key)).is_some() + } + + pub fn remove_all(&mut self, peer_id: &PeerId) { + let to_remove = self + .pending_responses + .keys() + .filter(|(peer, _key)| peer == peer_id) + .cloned() + .collect::>(); + to_remove.iter().for_each(|k| { + self.pending_responses.remove(k); + }); } pub fn len(&self) -> usize { @@ -104,13 +120,13 @@ impl Stream for PendingResponses { cx: &mut Context<'_>, ) -> Poll> { match self.pending_responses.poll_next_unpin(cx) { - Poll::Ready(Some((peer_id, (request, response)))) => { + Poll::Ready(Some(((peer_id, key), (request, response)))) => { // We need to manually remove the stream, because `StreamMap` doesn't know yet that // it's going to yield `None`, so may not remove it before the next request is made // to the same peer. - self.pending_responses.remove(&peer_id); + self.pending_responses.remove(&(peer_id, key)); - Poll::Ready(Some(ResponseEvent { peer_id, request, response })) + Poll::Ready(Some(ResponseEvent { peer_id, key, request, response })) }, Poll::Ready(None) | Poll::Pending => { self.waker = Some(cx.waker().clone()); diff --git a/substrate/client/network/sync/src/service/mock.rs b/substrate/client/network/sync/src/service/mock.rs index 420de8cd5fdcf8184e76c29f6beb16492021150e..2e7e12af53d5373f4335361a108cd3980c7c3dcb 100644 --- a/substrate/client/network/sync/src/service/mock.rs +++ b/substrate/client/network/sync/src/service/mock.rs @@ -17,17 +17,16 @@ // along with this program. If not, see . use futures::channel::oneshot; -use libp2p::{Multiaddr, PeerId}; use sc_consensus::{BlockImportError, BlockImportStatus}; use sc_network::{ config::MultiaddrWithPeerId, request_responses::{IfDisconnected, RequestFailure}, types::ProtocolName, - NetworkNotification, NetworkPeers, NetworkRequest, NetworkSyncForkRequest, - NotificationSenderError, NotificationSenderT, ReputationChange, + Multiaddr, NetworkPeers, NetworkRequest, NetworkSyncForkRequest, ReputationChange, }; use sc_network_common::role::ObservedRole; +use sc_network_types::PeerId; use sp_runtime::traits::{Block as BlockT, NumberFor}; use std::collections::HashSet; @@ -80,6 +79,7 @@ mockall::mock! { mockall::mock! { pub Network {} + #[async_trait::async_trait] impl NetworkPeers for Network { fn set_authorized_peers(&self, peers: HashSet); fn set_authorized_only(&self, reserved_only: bool); @@ -108,6 +108,7 @@ mockall::mock! { ) -> Result<(), String>; fn sync_num_connected(&self) -> usize; fn peer_role(&self, peer_id: PeerId, handshake: Vec) -> Option; + async fn reserved_peers(&self) -> Result, ()>; } #[async_trait::async_trait] @@ -130,14 +131,4 @@ mockall::mock! { connect: IfDisconnected, ); } - - impl NetworkNotification for Network { - fn write_notification(&self, target: PeerId, protocol: ProtocolName, message: Vec); - fn notification_sender( - &self, - target: PeerId, - protocol: ProtocolName, - ) -> Result, NotificationSenderError>; - fn set_notification_handshake(&self, protocol: ProtocolName, handshake: Vec); - } } diff --git a/substrate/client/network/sync/src/service/network.rs b/substrate/client/network/sync/src/service/network.rs index 07f28519afb2bb988931d71a5df63acf92a360c0..e848b5f62c1b8ab9309bf71029862f0548432097 100644 --- a/substrate/client/network/sync/src/service/network.rs +++ b/substrate/client/network/sync/src/service/network.rs @@ -17,21 +17,21 @@ // along with this program. If not, see . use futures::{channel::oneshot, StreamExt}; -use libp2p::PeerId; +use sc_network_types::PeerId; use sc_network::{ request_responses::{IfDisconnected, RequestFailure}, types::ProtocolName, - NetworkNotification, NetworkPeers, NetworkRequest, ReputationChange, + NetworkPeers, NetworkRequest, ReputationChange, }; use sc_utils::mpsc::{tracing_unbounded, TracingUnboundedReceiver, TracingUnboundedSender}; use std::sync::Arc; /// Network-related services required by `sc-network-sync` -pub trait Network: NetworkPeers + NetworkRequest + NetworkNotification {} +pub trait Network: NetworkPeers + NetworkRequest {} -impl Network for T where T: NetworkPeers + NetworkRequest + NetworkNotification {} +impl Network for T where T: NetworkPeers + NetworkRequest {} /// Network service provider for `ChainSync` /// @@ -57,12 +57,6 @@ pub enum ToServiceCommand { oneshot::Sender, ProtocolName), RequestFailure>>, IfDisconnected, ), - - /// Call `NetworkNotification::write_notification()` - WriteNotification(PeerId, ProtocolName, Vec), - - /// Call `NetworkNotification::set_notification_handshake()` - SetNotificationHandshake(ProtocolName, Vec), } /// Handle that is (temporarily) passed to `ChainSync` so it can @@ -101,20 +95,6 @@ impl NetworkServiceHandle { .tx .unbounded_send(ToServiceCommand::StartRequest(who, protocol, request, tx, connect)); } - - /// Send notification to peer - pub fn write_notification(&self, who: PeerId, protocol: ProtocolName, message: Vec) { - let _ = self - .tx - .unbounded_send(ToServiceCommand::WriteNotification(who, protocol, message)); - } - - /// Set handshake for the notification protocol. - pub fn set_notification_handshake(&self, protocol: ProtocolName, handshake: Vec) { - let _ = self - .tx - .unbounded_send(ToServiceCommand::SetNotificationHandshake(protocol, handshake)); - } } impl NetworkServiceProvider { @@ -135,10 +115,6 @@ impl NetworkServiceProvider { service.report_peer(peer, reputation_change), ToServiceCommand::StartRequest(peer, protocol, request, tx, connect) => service.start_request(peer, protocol, request, None, tx, connect), - ToServiceCommand::WriteNotification(peer, protocol, message) => - service.write_notification(peer, protocol, message), - ToServiceCommand::SetNotificationHandshake(protocol, handshake) => - service.set_notification_handshake(protocol, handshake), } } } diff --git a/substrate/client/network/sync/src/service/syncing_service.rs b/substrate/client/network/sync/src/service/syncing_service.rs index 92d649d65dc3a5e5fac70c5a1cc16ed4c825d400..f4bc58afd4fda16a825acba25d64fa319460a25b 100644 --- a/substrate/client/network/sync/src/service/syncing_service.rs +++ b/substrate/client/network/sync/src/service/syncing_service.rs @@ -19,7 +19,7 @@ use crate::types::{ExtendedPeerInfo, SyncEvent, SyncEventStream, SyncStatus, SyncStatusProvider}; use futures::{channel::oneshot, Stream}; -use libp2p::PeerId; +use sc_network_types::PeerId; use sc_consensus::{BlockImportError, BlockImportStatus, JustificationSyncLink, Link}; use sc_network::{NetworkBlock, NetworkSyncForkRequest}; diff --git a/substrate/client/network/sync/src/state_request_handler.rs b/substrate/client/network/sync/src/state_request_handler.rs index 6bd2389fb5d1b78b071fc8cad2b6d5a566369a05..0e713626ecaa3433d371ac762a62def0f0d6af03 100644 --- a/substrate/client/network/sync/src/state_request_handler.rs +++ b/substrate/client/network/sync/src/state_request_handler.rs @@ -24,15 +24,16 @@ use crate::{ use codec::{Decode, Encode}; use futures::{channel::oneshot, stream::StreamExt}; -use libp2p::PeerId; use log::{debug, trace}; use prost::Message; +use sc_network_types::PeerId; use schnellru::{ByLength, LruMap}; use sc_client_api::{BlockBackend, ProofProvider}; use sc_network::{ config::ProtocolId, - request_responses::{IncomingRequest, OutgoingResponse, ProtocolConfig}, + request_responses::{IncomingRequest, OutgoingResponse}, + NetworkBackend, }; use sp_runtime::traits::Block as BlockT; @@ -52,21 +53,26 @@ mod rep { pub const SAME_REQUEST: Rep = Rep::new(i32::MIN, "Same state request multiple times"); } -/// Generates a [`ProtocolConfig`] for the state request protocol, refusing incoming requests. -pub fn generate_protocol_config>( +/// Generates a `RequestResponseProtocolConfig` for the state request protocol, refusing incoming +/// requests. +pub fn generate_protocol_config< + Hash: AsRef<[u8]>, + B: BlockT, + N: NetworkBackend::Hash>, +>( protocol_id: &ProtocolId, genesis_hash: Hash, fork_id: Option<&str>, -) -> ProtocolConfig { - ProtocolConfig { - name: generate_protocol_name(genesis_hash, fork_id).into(), - fallback_names: std::iter::once(generate_legacy_protocol_name(protocol_id).into()) - .collect(), - max_request_size: 1024 * 1024, - max_response_size: 16 * 1024 * 1024, - request_timeout: Duration::from_secs(40), - inbound_queue: None, - } + inbound_queue: async_channel::Sender, +) -> N::RequestResponseProtocolConfig { + N::request_response_config( + generate_protocol_name(genesis_hash, fork_id).into(), + std::iter::once(generate_legacy_protocol_name(protocol_id).into()).collect(), + 1024 * 1024, + 16 * 1024 * 1024, + Duration::from_secs(40), + Some(inbound_queue), + ) } /// Generate the state protocol name from the genesis hash and fork id. @@ -125,18 +131,18 @@ where Client: BlockBackend + ProofProvider + Send + Sync + 'static, { /// Create a new [`StateRequestHandler`]. - pub fn new( + pub fn new::Hash>>( protocol_id: &ProtocolId, fork_id: Option<&str>, client: Arc, num_peer_hint: usize, - ) -> (Self, ProtocolConfig) { + ) -> (Self, N::RequestResponseProtocolConfig) { // Reserve enough request slots for one request per peer when we are at the maximum // number of peers. let capacity = std::cmp::max(num_peer_hint, 1); let (tx, request_receiver) = async_channel::bounded(capacity); - let mut protocol_config = generate_protocol_config( + let protocol_config = generate_protocol_config::<_, B, N>( protocol_id, client .block_hash(0u32.into()) @@ -144,8 +150,8 @@ where .flatten() .expect("Genesis block exists; qed"), fork_id, + tx, ); - protocol_config.inbound_queue = Some(tx); let capacity = ByLength::new(num_peer_hint.max(1) as u32 * 2); let seen_requests = LruMap::new(capacity); diff --git a/substrate/client/network/sync/src/strategy.rs b/substrate/client/network/sync/src/strategy.rs index dbfb4188ec3f346d784c39ca113f28e687230ccc..b7afcbdb3a789c7813b8fcd60374e11a2fc4de74 100644 --- a/substrate/client/network/sync/src/strategy.rs +++ b/substrate/client/network/sync/src/strategy.rs @@ -29,8 +29,7 @@ use crate::{ LOG_TARGET, }; use chain_sync::{ChainSync, ChainSyncAction, ChainSyncMode}; -use libp2p::PeerId; -use log::{error, info}; +use log::{debug, error, info, warn}; use prometheus_endpoint::Registry; use sc_client_api::{BlockBackend, ProofProvider}; use sc_consensus::{BlockImportError, BlockImportStatus, IncomingBlock}; @@ -38,14 +37,15 @@ use sc_network_common::sync::{ message::{BlockAnnounce, BlockData, BlockRequest}, SyncMode, }; +use sc_network_types::PeerId; use sp_blockchain::{Error as ClientError, HeaderBackend, HeaderMetadata}; use sp_consensus::BlockOrigin; use sp_runtime::{ - traits::{Block as BlockT, NumberFor}, + traits::{Block as BlockT, Header, NumberFor}, Justifications, }; use state::{StateStrategy, StateStrategyAction}; -use std::sync::Arc; +use std::{collections::HashMap, sync::Arc}; use warp::{EncodedProof, WarpProofRequest, WarpSync, WarpSyncAction, WarpSyncConfig}; /// Corresponding `ChainSync` mode. @@ -71,16 +71,27 @@ pub struct SyncingConfig { pub metrics_registry: Option, } +/// The key identifying a specific strategy for responses routing. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +pub enum StrategyKey { + /// Warp sync initiated this request. + Warp, + /// State sync initiated this request. + State, + /// `ChainSync` initiated this request. + ChainSync, +} + #[derive(Debug)] pub enum SyncingAction { /// Send block request to peer. Always implies dropping a stale block request to the same peer. - SendBlockRequest { peer_id: PeerId, request: BlockRequest }, - /// Drop stale block request. - CancelBlockRequest { peer_id: PeerId }, + SendBlockRequest { peer_id: PeerId, key: StrategyKey, request: BlockRequest }, /// Send state request to peer. - SendStateRequest { peer_id: PeerId, request: OpaqueStateRequest }, + SendStateRequest { peer_id: PeerId, key: StrategyKey, request: OpaqueStateRequest }, /// Send warp proof request to peer. - SendWarpProofRequest { peer_id: PeerId, request: WarpProofRequest }, + SendWarpProofRequest { peer_id: PeerId, key: StrategyKey, request: WarpProofRequest }, + /// Drop stale request. + CancelRequest { peer_id: PeerId, key: StrategyKey }, /// Peer misbehaved. Disconnect, report it and cancel any requests to it. DropPeer(BadPeer), /// Import blocks. @@ -92,15 +103,75 @@ pub enum SyncingAction { number: NumberFor, justifications: Justifications, }, - /// Syncing strategy has finished. + /// Strategy finished. Nothing to do, this is handled by `SyncingStrategy`. Finished, } +impl SyncingAction { + fn is_finished(&self) -> bool { + matches!(self, SyncingAction::Finished) + } +} + +impl From> for SyncingAction { + fn from(action: WarpSyncAction) -> Self { + match action { + WarpSyncAction::SendWarpProofRequest { peer_id, request } => + SyncingAction::SendWarpProofRequest { peer_id, key: StrategyKey::Warp, request }, + WarpSyncAction::SendBlockRequest { peer_id, request } => + SyncingAction::SendBlockRequest { peer_id, key: StrategyKey::Warp, request }, + WarpSyncAction::DropPeer(bad_peer) => SyncingAction::DropPeer(bad_peer), + WarpSyncAction::Finished => SyncingAction::Finished, + } + } +} + +impl From> for SyncingAction { + fn from(action: StateStrategyAction) -> Self { + match action { + StateStrategyAction::SendStateRequest { peer_id, request } => + SyncingAction::SendStateRequest { peer_id, key: StrategyKey::State, request }, + StateStrategyAction::DropPeer(bad_peer) => SyncingAction::DropPeer(bad_peer), + StateStrategyAction::ImportBlocks { origin, blocks } => + SyncingAction::ImportBlocks { origin, blocks }, + StateStrategyAction::Finished => SyncingAction::Finished, + } + } +} + +impl From> for SyncingAction { + fn from(action: ChainSyncAction) -> Self { + match action { + ChainSyncAction::SendBlockRequest { peer_id, request } => + SyncingAction::SendBlockRequest { peer_id, key: StrategyKey::ChainSync, request }, + ChainSyncAction::SendStateRequest { peer_id, request } => + SyncingAction::SendStateRequest { peer_id, key: StrategyKey::ChainSync, request }, + ChainSyncAction::CancelRequest { peer_id } => + SyncingAction::CancelRequest { peer_id, key: StrategyKey::ChainSync }, + ChainSyncAction::DropPeer(bad_peer) => SyncingAction::DropPeer(bad_peer), + ChainSyncAction::ImportBlocks { origin, blocks } => + SyncingAction::ImportBlocks { origin, blocks }, + ChainSyncAction::ImportJustifications { peer_id, hash, number, justifications } => + SyncingAction::ImportJustifications { peer_id, hash, number, justifications }, + } + } +} + /// Proxy to specific syncing strategies. -pub enum SyncingStrategy { - WarpSyncStrategy(WarpSync), - StateSyncStrategy(StateStrategy), - ChainSyncStrategy(ChainSync), +pub struct SyncingStrategy { + /// Initial syncing configuration. + config: SyncingConfig, + /// Client used by syncing strategies. + client: Arc, + /// Warp strategy. + warp: Option>, + /// State strategy. + state: Option>, + /// `ChainSync` strategy.` + chain_sync: Option>, + /// Connected peers and their best blocks used to seed a new strategy when switching to it in + /// [`SyncingStrategy::proceed_to_next`]. + peer_best_blocks: HashMap)>, } impl SyncingStrategy @@ -114,7 +185,7 @@ where + Sync + 'static, { - /// Initialize a new syncing startegy. + /// Initialize a new syncing strategy. pub fn new( config: SyncingConfig, client: Arc, @@ -123,37 +194,51 @@ where if let SyncMode::Warp = config.mode { let warp_sync_config = warp_sync_config .expect("Warp sync configuration must be supplied in warp sync mode."); - Ok(Self::WarpSyncStrategy(WarpSync::new(client.clone(), warp_sync_config))) + let warp_sync = WarpSync::new(client.clone(), warp_sync_config); + Ok(Self { + config, + client, + warp: Some(warp_sync), + state: None, + chain_sync: None, + peer_best_blocks: Default::default(), + }) } else { - Ok(Self::ChainSyncStrategy(ChainSync::new( + let chain_sync = ChainSync::new( chain_sync_mode(config.mode), client.clone(), config.max_parallel_downloads, config.max_blocks_per_request, - config.metrics_registry, - )?)) + config.metrics_registry.clone(), + std::iter::empty(), + )?; + Ok(Self { + config, + client, + warp: None, + state: None, + chain_sync: Some(chain_sync), + peer_best_blocks: Default::default(), + }) } } /// Notify that a new peer has connected. pub fn add_peer(&mut self, peer_id: PeerId, best_hash: B::Hash, best_number: NumberFor) { - match self { - SyncingStrategy::WarpSyncStrategy(strategy) => - strategy.add_peer(peer_id, best_hash, best_number), - SyncingStrategy::StateSyncStrategy(strategy) => - strategy.add_peer(peer_id, best_hash, best_number), - SyncingStrategy::ChainSyncStrategy(strategy) => - strategy.add_peer(peer_id, best_hash, best_number), - } + self.peer_best_blocks.insert(peer_id, (best_hash, best_number)); + + self.warp.as_mut().map(|s| s.add_peer(peer_id, best_hash, best_number)); + self.state.as_mut().map(|s| s.add_peer(peer_id, best_hash, best_number)); + self.chain_sync.as_mut().map(|s| s.add_peer(peer_id, best_hash, best_number)); } /// Notify that a peer has disconnected. pub fn remove_peer(&mut self, peer_id: &PeerId) { - match self { - SyncingStrategy::WarpSyncStrategy(strategy) => strategy.remove_peer(peer_id), - SyncingStrategy::StateSyncStrategy(strategy) => strategy.remove_peer(peer_id), - SyncingStrategy::ChainSyncStrategy(strategy) => strategy.remove_peer(peer_id), - } + self.warp.as_mut().map(|s| s.remove_peer(peer_id)); + self.state.as_mut().map(|s| s.remove_peer(peer_id)); + self.chain_sync.as_mut().map(|s| s.remove_peer(peer_id)); + + self.peer_best_blocks.remove(peer_id); } /// Submit a validated block announcement. @@ -165,14 +250,31 @@ where peer_id: PeerId, announce: &BlockAnnounce, ) -> Option<(B::Hash, NumberFor)> { - match self { - SyncingStrategy::WarpSyncStrategy(strategy) => - strategy.on_validated_block_announce(is_best, peer_id, announce), - SyncingStrategy::StateSyncStrategy(strategy) => - strategy.on_validated_block_announce(is_best, peer_id, announce), - SyncingStrategy::ChainSyncStrategy(strategy) => - strategy.on_validated_block_announce(is_best, peer_id, announce), + let new_best = if let Some(ref mut warp) = self.warp { + warp.on_validated_block_announce(is_best, peer_id, announce) + } else if let Some(ref mut state) = self.state { + state.on_validated_block_announce(is_best, peer_id, announce) + } else if let Some(ref mut chain_sync) = self.chain_sync { + chain_sync.on_validated_block_announce(is_best, peer_id, announce) + } else { + error!(target: LOG_TARGET, "No syncing strategy is active."); + debug_assert!(false); + Some((announce.header.hash(), *announce.header.number())) + }; + + if let Some(new_best) = new_best { + if let Some(best) = self.peer_best_blocks.get_mut(&peer_id) { + *best = new_best; + } else { + debug!( + target: LOG_TARGET, + "Cannot update `peer_best_blocks` as peer {peer_id} is not known to `Strategy` \ + (already disconnected?)", + ); + } } + + new_best } /// Configure an explicit fork sync request in case external code has detected that there is a @@ -183,40 +285,33 @@ where hash: &B::Hash, number: NumberFor, ) { - match self { - SyncingStrategy::WarpSyncStrategy(_) => {}, - SyncingStrategy::StateSyncStrategy(_) => {}, - SyncingStrategy::ChainSyncStrategy(strategy) => - strategy.set_sync_fork_request(peers, hash, number), + // Fork requests are only handled by `ChainSync`. + if let Some(ref mut chain_sync) = self.chain_sync { + chain_sync.set_sync_fork_request(peers.clone(), hash, number); } } /// Request extra justification. pub fn request_justification(&mut self, hash: &B::Hash, number: NumberFor) { - match self { - SyncingStrategy::WarpSyncStrategy(_) => {}, - SyncingStrategy::StateSyncStrategy(_) => {}, - SyncingStrategy::ChainSyncStrategy(strategy) => - strategy.request_justification(hash, number), + // Justifications can only be requested via `ChainSync`. + if let Some(ref mut chain_sync) = self.chain_sync { + chain_sync.request_justification(hash, number); } } /// Clear extra justification requests. pub fn clear_justification_requests(&mut self) { - match self { - SyncingStrategy::WarpSyncStrategy(_) => {}, - SyncingStrategy::StateSyncStrategy(_) => {}, - SyncingStrategy::ChainSyncStrategy(strategy) => strategy.clear_justification_requests(), + // Justification requests can only be cleared by `ChainSync`. + if let Some(ref mut chain_sync) = self.chain_sync { + chain_sync.clear_justification_requests(); } } /// Report a justification import (successful or not). pub fn on_justification_import(&mut self, hash: B::Hash, number: NumberFor, success: bool) { - match self { - SyncingStrategy::WarpSyncStrategy(_) => {}, - SyncingStrategy::StateSyncStrategy(_) => {}, - SyncingStrategy::ChainSyncStrategy(strategy) => - strategy.on_justification_import(hash, number, success), + // Only `ChainSync` is interested in justification import. + if let Some(ref mut chain_sync) = self.chain_sync { + chain_sync.on_justification_import(hash, number, success); } } @@ -224,36 +319,65 @@ where pub fn on_block_response( &mut self, peer_id: PeerId, + key: StrategyKey, request: BlockRequest, blocks: Vec>, ) { - match self { - SyncingStrategy::WarpSyncStrategy(strategy) => - strategy.on_block_response(peer_id, request, blocks), - SyncingStrategy::StateSyncStrategy(_) => {}, - SyncingStrategy::ChainSyncStrategy(strategy) => - strategy.on_block_response(peer_id, request, blocks), + if let (StrategyKey::Warp, Some(ref mut warp)) = (key, &mut self.warp) { + warp.on_block_response(peer_id, request, blocks); + } else if let (StrategyKey::ChainSync, Some(ref mut chain_sync)) = + (key, &mut self.chain_sync) + { + chain_sync.on_block_response(peer_id, request, blocks); + } else { + error!( + target: LOG_TARGET, + "`on_block_response()` called with unexpected key {key:?} \ + or corresponding strategy is not active.", + ); + debug_assert!(false); } } /// Process state response. - pub fn on_state_response(&mut self, peer_id: PeerId, response: OpaqueStateResponse) { - match self { - SyncingStrategy::WarpSyncStrategy(_) => {}, - SyncingStrategy::StateSyncStrategy(strategy) => - strategy.on_state_response(peer_id, response), - SyncingStrategy::ChainSyncStrategy(strategy) => - strategy.on_state_response(peer_id, response), + pub fn on_state_response( + &mut self, + peer_id: PeerId, + key: StrategyKey, + response: OpaqueStateResponse, + ) { + if let (StrategyKey::State, Some(ref mut state)) = (key, &mut self.state) { + state.on_state_response(peer_id, response); + } else if let (StrategyKey::ChainSync, Some(ref mut chain_sync)) = + (key, &mut self.chain_sync) + { + chain_sync.on_state_response(peer_id, response); + } else { + error!( + target: LOG_TARGET, + "`on_state_response()` called with unexpected key {key:?} \ + or corresponding strategy is not active.", + ); + debug_assert!(false); } } /// Process warp proof response. - pub fn on_warp_proof_response(&mut self, peer_id: &PeerId, response: EncodedProof) { - match self { - SyncingStrategy::WarpSyncStrategy(strategy) => - strategy.on_warp_proof_response(peer_id, response), - SyncingStrategy::StateSyncStrategy(_) => {}, - SyncingStrategy::ChainSyncStrategy(_) => {}, + pub fn on_warp_proof_response( + &mut self, + peer_id: &PeerId, + key: StrategyKey, + response: EncodedProof, + ) { + if let (StrategyKey::Warp, Some(ref mut warp)) = (key, &mut self.warp) { + warp.on_warp_proof_response(peer_id, response); + } else { + error!( + target: LOG_TARGET, + "`on_warp_proof_response()` called with unexpected key {key:?} \ + or warp strategy is not active", + ); + debug_assert!(false); } } @@ -264,226 +388,274 @@ where count: usize, results: Vec<(Result>, BlockImportError>, B::Hash)>, ) { - match self { - SyncingStrategy::WarpSyncStrategy(_) => {}, - SyncingStrategy::StateSyncStrategy(strategy) => - strategy.on_blocks_processed(imported, count, results), - SyncingStrategy::ChainSyncStrategy(strategy) => - strategy.on_blocks_processed(imported, count, results), + // Only `StateStrategy` and `ChainSync` are interested in block processing notifications. + if let Some(ref mut state) = self.state { + state.on_blocks_processed(imported, count, results); + } else if let Some(ref mut chain_sync) = self.chain_sync { + chain_sync.on_blocks_processed(imported, count, results); } } /// Notify a syncing strategy that a block has been finalized. pub fn on_block_finalized(&mut self, hash: &B::Hash, number: NumberFor) { - match self { - SyncingStrategy::WarpSyncStrategy(_) => {}, - SyncingStrategy::StateSyncStrategy(_) => {}, - SyncingStrategy::ChainSyncStrategy(strategy) => - strategy.on_block_finalized(hash, number), + // Only `ChainSync` is interested in block finalization notifications. + if let Some(ref mut chain_sync) = self.chain_sync { + chain_sync.on_block_finalized(hash, number); } } /// Inform sync about a new best imported block. pub fn update_chain_info(&mut self, best_hash: &B::Hash, best_number: NumberFor) { - match self { - SyncingStrategy::WarpSyncStrategy(_) => {}, - SyncingStrategy::StateSyncStrategy(_) => {}, - SyncingStrategy::ChainSyncStrategy(strategy) => - strategy.update_chain_info(best_hash, best_number), + // This is relevant to `ChainSync` only. + if let Some(ref mut chain_sync) = self.chain_sync { + chain_sync.update_chain_info(best_hash, best_number); } } // Are we in major sync mode? pub fn is_major_syncing(&self) -> bool { - match self { - SyncingStrategy::WarpSyncStrategy(_) => true, - SyncingStrategy::StateSyncStrategy(_) => true, - SyncingStrategy::ChainSyncStrategy(strategy) => - strategy.status().state.is_major_syncing(), - } + self.warp.is_some() || + self.state.is_some() || + match self.chain_sync { + Some(ref s) => s.status().state.is_major_syncing(), + None => unreachable!("At least one syncing strategy is active; qed"), + } } /// Get the number of peers known to the syncing strategy. pub fn num_peers(&self) -> usize { - match self { - SyncingStrategy::WarpSyncStrategy(strategy) => strategy.num_peers(), - SyncingStrategy::StateSyncStrategy(strategy) => strategy.num_peers(), - SyncingStrategy::ChainSyncStrategy(strategy) => strategy.num_peers(), - } + self.peer_best_blocks.len() } /// Returns the current sync status. pub fn status(&self) -> SyncStatus { - match self { - SyncingStrategy::WarpSyncStrategy(strategy) => strategy.status(), - SyncingStrategy::StateSyncStrategy(strategy) => strategy.status(), - SyncingStrategy::ChainSyncStrategy(strategy) => strategy.status(), + // This function presumes that strategies are executed serially and must be refactored + // once we have parallel strategies. + if let Some(ref warp) = self.warp { + warp.status() + } else if let Some(ref state) = self.state { + state.status() + } else if let Some(ref chain_sync) = self.chain_sync { + chain_sync.status() + } else { + unreachable!("At least one syncing strategy is always active; qed") } } /// Get the total number of downloaded blocks. pub fn num_downloaded_blocks(&self) -> usize { - match self { - SyncingStrategy::WarpSyncStrategy(_) => 0, - SyncingStrategy::StateSyncStrategy(_) => 0, - SyncingStrategy::ChainSyncStrategy(strategy) => strategy.num_downloaded_blocks(), - } + self.chain_sync + .as_ref() + .map_or(0, |chain_sync| chain_sync.num_downloaded_blocks()) } /// Get an estimate of the number of parallel sync requests. pub fn num_sync_requests(&self) -> usize { - match self { - SyncingStrategy::WarpSyncStrategy(_) => 0, - SyncingStrategy::StateSyncStrategy(_) => 0, - SyncingStrategy::ChainSyncStrategy(strategy) => strategy.num_sync_requests(), - } + self.chain_sync.as_ref().map_or(0, |chain_sync| chain_sync.num_sync_requests()) } /// Report Prometheus metrics pub fn report_metrics(&self) { - match self { - SyncingStrategy::WarpSyncStrategy(_) => {}, - SyncingStrategy::StateSyncStrategy(_) => {}, - SyncingStrategy::ChainSyncStrategy(strategy) => strategy.report_metrics(), + if let Some(ref chain_sync) = self.chain_sync { + chain_sync.report_metrics(); + } + } + + /// Let `WarpSync` know about target block header + pub fn set_warp_sync_target_block_header( + &mut self, + target_header: B::Header, + ) -> Result<(), ()> { + match self.config.mode { + SyncMode::Warp => match self.warp { + Some(ref mut warp) => { + warp.set_target_block(target_header); + Ok(()) + }, + None => { + // As mode is set to warp sync, but no warp sync strategy is active, this means + // that warp sync has already finished / was skipped. + warn!( + target: LOG_TARGET, + "Discarding warp sync target, as warp sync was seemingly skipped due \ + to node being (partially) synced.", + ); + Ok(()) + }, + }, + _ => { + error!( + target: LOG_TARGET, + "Cannot set warp sync target block: not in warp sync mode." + ); + debug_assert!(false); + Err(()) + }, } } /// Get actions that should be performed by the owner on the strategy's behalf #[must_use] - pub fn actions(&mut self) -> Box>> { - match self { - SyncingStrategy::WarpSyncStrategy(strategy) => - Box::new(strategy.actions().map(|action| match action { - WarpSyncAction::SendWarpProofRequest { peer_id, request } => - SyncingAction::SendWarpProofRequest { peer_id, request }, - WarpSyncAction::SendBlockRequest { peer_id, request } => - SyncingAction::SendBlockRequest { peer_id, request }, - WarpSyncAction::DropPeer(bad_peer) => SyncingAction::DropPeer(bad_peer), - WarpSyncAction::Finished => SyncingAction::Finished, - })), - SyncingStrategy::StateSyncStrategy(strategy) => - Box::new(strategy.actions().map(|action| match action { - StateStrategyAction::SendStateRequest { peer_id, request } => - SyncingAction::SendStateRequest { peer_id, request }, - StateStrategyAction::DropPeer(bad_peer) => SyncingAction::DropPeer(bad_peer), - StateStrategyAction::ImportBlocks { origin, blocks } => - SyncingAction::ImportBlocks { origin, blocks }, - StateStrategyAction::Finished => SyncingAction::Finished, - })), - SyncingStrategy::ChainSyncStrategy(strategy) => - Box::new(strategy.actions().map(|action| match action { - ChainSyncAction::SendBlockRequest { peer_id, request } => - SyncingAction::SendBlockRequest { peer_id, request }, - ChainSyncAction::CancelBlockRequest { peer_id } => - SyncingAction::CancelBlockRequest { peer_id }, - ChainSyncAction::SendStateRequest { peer_id, request } => - SyncingAction::SendStateRequest { peer_id, request }, - ChainSyncAction::DropPeer(bad_peer) => SyncingAction::DropPeer(bad_peer), - ChainSyncAction::ImportBlocks { origin, blocks } => - SyncingAction::ImportBlocks { origin, blocks }, - ChainSyncAction::ImportJustifications { - peer_id, - hash, - number, - justifications, - } => SyncingAction::ImportJustifications { - peer_id, - hash, - number, - justifications, - }, - })), + pub fn actions(&mut self) -> Result>, ClientError> { + // This function presumes that strategies are executed serially and must be refactored once + // we have parallel strategies. + let actions: Vec<_> = if let Some(ref mut warp) = self.warp { + warp.actions().map(Into::into).collect() + } else if let Some(ref mut state) = self.state { + state.actions().map(Into::into).collect() + } else if let Some(ref mut chain_sync) = self.chain_sync { + chain_sync.actions().map(Into::into).collect() + } else { + unreachable!("At least one syncing strategy is always active; qed") + }; + + if actions.iter().any(SyncingAction::is_finished) { + self.proceed_to_next()?; } + + Ok(actions) } - /// Switch to next strategy if the active one finished. - pub fn switch_to_next( - &mut self, - config: SyncingConfig, - client: Arc, - connected_peers: impl Iterator)>, - ) -> Result<(), ClientError> { - match self { - Self::WarpSyncStrategy(warp_sync) => { - match warp_sync.take_result() { - Some(res) => { - info!( - target: LOG_TARGET, - "Warp sync is complete, continuing with state sync." - ); - let state_sync = StateStrategy::new( - client, - res.target_header, - res.target_body, - res.target_justifications, - // skip proofs, only set to `true` in `FastUnsafe` sync mode - false, - connected_peers - .map(|(peer_id, _best_hash, best_number)| (peer_id, best_number)), - ); - - *self = Self::StateSyncStrategy(state_sync); - }, - None => { - error!( - target: LOG_TARGET, - "Warp sync failed. Falling back to full sync." - ); - let mut chain_sync = match ChainSync::new( - chain_sync_mode(config.mode), - client, - config.max_parallel_downloads, - config.max_blocks_per_request, - config.metrics_registry, - ) { - Ok(chain_sync) => chain_sync, - Err(e) => { - error!(target: LOG_TARGET, "Failed to start `ChainSync`."); - return Err(e) - }, - }; - // Let `ChainSync` know about connected peers. - connected_peers.into_iter().for_each( - |(peer_id, best_hash, best_number)| { - chain_sync.add_peer(peer_id, best_hash, best_number) - }, - ); - - *self = Self::ChainSyncStrategy(chain_sync); - }, - } - }, - Self::StateSyncStrategy(state_sync) => { - if state_sync.is_succeded() { - info!(target: LOG_TARGET, "State sync is complete, continuing with block sync."); - } else { - error!(target: LOG_TARGET, "State sync failed. Falling back to full sync."); - } - let mut chain_sync = match ChainSync::new( - chain_sync_mode(config.mode), - client, - config.max_parallel_downloads, - config.max_blocks_per_request, - config.metrics_registry, - ) { - Ok(chain_sync) => chain_sync, - Err(e) => { - error!(target: LOG_TARGET, "Failed to start `ChainSync`."); - return Err(e) - }, - }; - // Let `ChainSync` know about connected peers. - connected_peers.into_iter().for_each(|(peer_id, best_hash, best_number)| { - chain_sync.add_peer(peer_id, best_hash, best_number) - }); - - *self = Self::ChainSyncStrategy(chain_sync); - }, - Self::ChainSyncStrategy(_) => { - error!(target: LOG_TARGET, "`ChainSyncStrategy` is final startegy, cannot switch to next."); - debug_assert!(false); - }, + /// Proceed with the next strategy if the active one finished. + pub fn proceed_to_next(&mut self) -> Result<(), ClientError> { + // The strategies are switched as `WarpSync` -> `StateStrategy` -> `ChainSync`. + if let Some(ref mut warp) = self.warp { + match warp.take_result() { + Some(res) => { + info!( + target: LOG_TARGET, + "Warp sync is complete, continuing with state sync." + ); + let state_sync = StateStrategy::new( + self.client.clone(), + res.target_header, + res.target_body, + res.target_justifications, + false, + self.peer_best_blocks + .iter() + .map(|(peer_id, (_, best_number))| (*peer_id, *best_number)), + ); + + self.warp = None; + self.state = Some(state_sync); + Ok(()) + }, + None => { + error!( + target: LOG_TARGET, + "Warp sync failed. Continuing with full sync." + ); + let chain_sync = match ChainSync::new( + chain_sync_mode(self.config.mode), + self.client.clone(), + self.config.max_parallel_downloads, + self.config.max_blocks_per_request, + self.config.metrics_registry.clone(), + self.peer_best_blocks.iter().map(|(peer_id, (best_hash, best_number))| { + (*peer_id, *best_hash, *best_number) + }), + ) { + Ok(chain_sync) => chain_sync, + Err(e) => { + error!(target: LOG_TARGET, "Failed to start `ChainSync`."); + return Err(e) + }, + }; + + self.warp = None; + self.chain_sync = Some(chain_sync); + Ok(()) + }, + } + } else if let Some(state) = &self.state { + if state.is_succeeded() { + info!(target: LOG_TARGET, "State sync is complete, continuing with block sync."); + } else { + error!(target: LOG_TARGET, "State sync failed. Falling back to full sync."); + } + let chain_sync = match ChainSync::new( + chain_sync_mode(self.config.mode), + self.client.clone(), + self.config.max_parallel_downloads, + self.config.max_blocks_per_request, + self.config.metrics_registry.clone(), + self.peer_best_blocks.iter().map(|(peer_id, (best_hash, best_number))| { + (*peer_id, *best_hash, *best_number) + }), + ) { + Ok(chain_sync) => chain_sync, + Err(e) => { + error!(target: LOG_TARGET, "Failed to start `ChainSync`."); + return Err(e); + }, + }; + + self.state = None; + self.chain_sync = Some(chain_sync); + Ok(()) + } else { + unreachable!("Only warp & state strategies can finish; qed") } - Ok(()) + } +} + +#[cfg(test)] +mod test { + use super::*; + use futures::executor::block_on; + use sc_block_builder::BlockBuilderBuilder; + use substrate_test_runtime_client::{ + ClientBlockImportExt, ClientExt, DefaultTestClientBuilderExt, TestClientBuilder, + TestClientBuilderExt, + }; + + /// Regression test for crash when starting already synced parachain node with `--sync=warp`. + /// We must remove this after setting of warp sync target block is moved to initialization of + /// `SyncingEngine` (issue https://github.com/paritytech/polkadot-sdk/issues/3537). + #[test] + fn set_target_block_finished_warp_sync() { + // Populate database with finalized state. + let mut client = Arc::new(TestClientBuilder::new().build()); + let block = BlockBuilderBuilder::new(&*client) + .on_parent_block(client.chain_info().best_hash) + .with_parent_block_number(client.chain_info().best_number) + .build() + .unwrap() + .build() + .unwrap() + .block; + block_on(client.import(BlockOrigin::Own, block.clone())).unwrap(); + let just = (*b"TEST", Vec::new()); + client.finalize_block(block.hash(), Some(just)).unwrap(); + let target_block = BlockBuilderBuilder::new(&*client) + .on_parent_block(client.chain_info().best_hash) + .with_parent_block_number(client.chain_info().best_number) + .build() + .unwrap() + .build() + .unwrap() + .block; + + // Initialize syncing strategy. + let config = SyncingConfig { + mode: SyncMode::Warp, + max_parallel_downloads: 3, + max_blocks_per_request: 64, + metrics_registry: None, + }; + let mut strategy = + SyncingStrategy::new(config, client, Some(WarpSyncConfig::WaitForTarget)).unwrap(); + + // Warp sync instantly finishes as we have finalized state in DB. + let actions = strategy.actions().unwrap(); + assert_eq!(actions.len(), 1); + assert!(matches!(actions[0], SyncingAction::Finished)); + assert!(strategy.warp.is_none()); + + // Try setting the target block. We mustn't crash. + strategy + .set_warp_sync_target_block_header(target_block.header().clone()) + .unwrap(); } } diff --git a/substrate/client/network/sync/src/strategy/chain_sync.rs b/substrate/client/network/sync/src/strategy/chain_sync.rs index 62c260d582b5a75bf38c81b9c5b3f5e65df1e8a4..fcda25907927f71a9af849ee376a8aba07b98129 100644 --- a/substrate/client/network/sync/src/strategy/chain_sync.rs +++ b/substrate/client/network/sync/src/strategy/chain_sync.rs @@ -30,7 +30,7 @@ use crate::{ blocks::BlockCollection, - extra_requests::ExtraRequests, + justification_requests::ExtraRequests, schema::v1::StateResponse, strategy::{ state_sync::{ImportResult, StateSync, StateSyncProvider}, @@ -41,7 +41,6 @@ use crate::{ }; use codec::Encode; -use libp2p::PeerId; use log::{debug, error, info, trace, warn}; use prometheus_endpoint::{register, Gauge, GaugeVec, Opts, PrometheusError, Registry, U64}; use sc_client_api::{BlockBackend, ProofProvider}; @@ -49,6 +48,7 @@ use sc_consensus::{BlockImportError, BlockImportStatus, IncomingBlock}; use sc_network_common::sync::message::{ BlockAnnounce, BlockAttributes, BlockData, BlockRequest, BlockResponse, Direction, FromBlock, }; +use sc_network_types::PeerId; use sp_arithmetic::traits::Saturating; use sp_blockchain::{Error as ClientError, HeaderBackend, HeaderMetadata}; use sp_consensus::{BlockOrigin, BlockStatus}; @@ -117,7 +117,7 @@ mod rep { /// Reputation change for peers which send us a block with bad justifications. pub const BAD_JUSTIFICATION: Rep = Rep::new(-(1 << 16), "Bad justification"); - /// Reputation change when a peer sent us invlid ancestry result. + /// Reputation change when a peer sent us invalid ancestry result. pub const UNKNOWN_ANCESTOR: Rep = Rep::new(-(1 << 16), "DB Error"); /// Peer response data does not have requested bits. @@ -212,10 +212,10 @@ struct GapSync { pub enum ChainSyncAction { /// Send block request to peer. Always implies dropping a stale block request to the same peer. SendBlockRequest { peer_id: PeerId, request: BlockRequest }, - /// Drop stale block request. - CancelBlockRequest { peer_id: PeerId }, /// Send state request to peer. SendStateRequest { peer_id: PeerId, request: OpaqueStateRequest }, + /// Drop stale request. + CancelRequest { peer_id: PeerId }, /// Peer misbehaved. Disconnect, report it and cancel the block request to it. DropPeer(BadPeer), /// Import blocks. @@ -373,6 +373,7 @@ where max_parallel_downloads: u32, max_blocks_per_request: u32, metrics_registry: Option, + initial_peers: impl Iterator)>, ) -> Result { let mut sync = Self { client, @@ -405,6 +406,10 @@ where }; sync.reset_sync_start_point()?; + initial_peers.for_each(|(peer_id, best_hash, best_number)| { + sync.add_peer(peer_id, best_hash, best_number); + }); + Ok(sync) } @@ -1058,7 +1063,7 @@ where let peer = if let Some(peer) = self.peers.get_mut(&peer_id) { peer } else { - error!(target: LOG_TARGET, "💔 Called `on_validated_block_announce` with a bad peer ID"); + error!(target: LOG_TARGET, "💔 Called `on_validated_block_announce` with a bad peer ID {peer_id}"); return Some((hash, number)) }; @@ -1312,34 +1317,35 @@ where ); let old_peers = std::mem::take(&mut self.peers); - old_peers.into_iter().for_each(|(peer_id, mut p)| { - // peers that were downloading justifications - // should be kept in that state. - if let PeerSyncState::DownloadingJustification(_) = p.state { - // We make sure our commmon number is at least something we have. - trace!( - target: LOG_TARGET, - "Keeping peer {} after restart, updating common number from={} => to={} (our best).", - peer_id, - p.common_number, - self.best_queued_number, - ); - p.common_number = self.best_queued_number; - self.peers.insert(peer_id, p); - return + old_peers.into_iter().for_each(|(peer_id, mut peer_sync)| { + match peer_sync.state { + PeerSyncState::Available => { + self.add_peer(peer_id, peer_sync.best_hash, peer_sync.best_number); + }, + PeerSyncState::AncestorSearch { .. } | + PeerSyncState::DownloadingNew(_) | + PeerSyncState::DownloadingStale(_) | + PeerSyncState::DownloadingGap(_) | + PeerSyncState::DownloadingState => { + // Cancel a request first, as `add_peer` may generate a new request. + self.actions.push(ChainSyncAction::CancelRequest { peer_id }); + self.add_peer(peer_id, peer_sync.best_hash, peer_sync.best_number); + }, + PeerSyncState::DownloadingJustification(_) => { + // Peers that were downloading justifications + // should be kept in that state. + // We make sure our common number is at least something we have. + trace!( + target: LOG_TARGET, + "Keeping peer {} after restart, updating common number from={} => to={} (our best).", + peer_id, + peer_sync.common_number, + self.best_queued_number, + ); + peer_sync.common_number = self.best_queued_number; + self.peers.insert(peer_id, peer_sync); + }, } - - // handle peers that were in other states. - let action = match self.add_peer_inner(peer_id, p.best_hash, p.best_number) { - // since the request is not a justification, remove it from pending responses - Ok(None) => ChainSyncAction::CancelBlockRequest { peer_id }, - // update the request if the new one is available - Ok(Some(request)) => ChainSyncAction::SendBlockRequest { peer_id, request }, - // this implies that we need to drop pending response from the peer - Err(bad_peer) => ChainSyncAction::DropPeer(bad_peer), - }; - - self.actions.push(action); }); } diff --git a/substrate/client/network/sync/src/strategy/chain_sync/test.rs b/substrate/client/network/sync/src/strategy/chain_sync/test.rs index c89096bc6c9045ddb42eb7e5bb65485d7a90f851..cd955113542be598e18c94057d3ad056c95a6002 100644 --- a/substrate/client/network/sync/src/strategy/chain_sync/test.rs +++ b/substrate/client/network/sync/src/strategy/chain_sync/test.rs @@ -38,7 +38,9 @@ fn processes_empty_response_on_justification_request_for_unknown_block() { let client = Arc::new(TestClientBuilder::new().build()); let peer_id = PeerId::random(); - let mut sync = ChainSync::new(ChainSyncMode::Full, client.clone(), 1, 64, None).unwrap(); + let mut sync = + ChainSync::new(ChainSyncMode::Full, client.clone(), 1, 64, None, std::iter::empty()) + .unwrap(); let (a1_hash, a1_number) = { let a1 = BlockBuilderBuilder::new(&*client) @@ -91,7 +93,11 @@ fn processes_empty_response_on_justification_request_for_unknown_block() { fn restart_doesnt_affect_peers_downloading_finality_data() { let mut client = Arc::new(TestClientBuilder::new().build()); - let mut sync = ChainSync::new(ChainSyncMode::Full, client.clone(), 1, 64, None).unwrap(); + // we request max 8 blocks to always initiate block requests to both peers for the test to be + // deterministic + let mut sync = + ChainSync::new(ChainSyncMode::Full, client.clone(), 1, 8, None, std::iter::empty()) + .unwrap(); let peer_id1 = PeerId::random(); let peer_id2 = PeerId::random(); @@ -122,10 +128,13 @@ fn restart_doesnt_affect_peers_downloading_finality_data() { // we wil send block requests to these peers // for these blocks we don't know about - assert!(sync - .block_requests() - .into_iter() - .all(|(p, _)| { p == peer_id1 || p == peer_id2 })); + let actions = sync.actions().collect::>(); + assert_eq!(actions.len(), 2); + assert!(actions.iter().all(|action| match action { + ChainSyncAction::SendBlockRequest { peer_id, .. } => + peer_id == &peer_id1 || peer_id == &peer_id2, + _ => false, + })); // add a new peer at a known block sync.add_peer(peer_id3, b1_hash, b1_number); @@ -146,22 +155,29 @@ fn restart_doesnt_affect_peers_downloading_finality_data() { PeerSyncState::DownloadingJustification(b1_hash), ); - // clear old actions + // drop old actions let _ = sync.take_actions(); // we restart the sync state sync.restart(); - let actions = sync.take_actions().collect::>(); - // which should make us send out block requests to the first two peers - assert_eq!(actions.len(), 2); + // which should make us cancel and send out again block requests to the first two peers + let actions = sync.actions().collect::>(); + assert_eq!(actions.len(), 4); + let mut cancelled_first = HashSet::new(); assert!(actions.iter().all(|action| match action { - ChainSyncAction::SendBlockRequest { peer_id, .. } => - peer_id == &peer_id1 || peer_id == &peer_id2, + ChainSyncAction::CancelRequest { peer_id, .. } => { + cancelled_first.insert(peer_id); + peer_id == &peer_id1 || peer_id == &peer_id2 + }, + ChainSyncAction::SendBlockRequest { peer_id, .. } => { + assert!(cancelled_first.remove(peer_id)); + peer_id == &peer_id1 || peer_id == &peer_id2 + }, _ => false, })); - // peer 3 should be unaffected it was downloading finality data + // peer 3 should be unaffected as it was downloading finality data assert_eq!( sync.peers.get(&peer_id3).unwrap().state, PeerSyncState::DownloadingJustification(b1_hash), @@ -173,7 +189,7 @@ fn restart_doesnt_affect_peers_downloading_finality_data() { assert_eq!(sync.peers.get(&peer_id3).unwrap().common_number, 50); } -/// Send a block annoucnement for the given `header`. +/// Send a block announcement for the given `header`. fn send_block_announce(header: Header, peer_id: PeerId, sync: &mut ChainSync) { let announce = BlockAnnounce { header: header.clone(), @@ -262,7 +278,7 @@ fn unwrap_from_block_number(from: FromBlock) -> u64 { /// announcement from this node in its sync process. Meaning our common number didn't change. It /// is now expected that we start an ancestor search to find the common number. #[test] -fn do_ancestor_search_when_common_block_to_best_qeued_gap_is_to_big() { +fn do_ancestor_search_when_common_block_to_best_queued_gap_is_to_big() { sp_tracing::try_init_simple(); let blocks = { @@ -275,7 +291,9 @@ fn do_ancestor_search_when_common_block_to_best_qeued_gap_is_to_big() { let mut client = Arc::new(TestClientBuilder::new().build()); let info = client.info(); - let mut sync = ChainSync::new(ChainSyncMode::Full, client.clone(), 5, 64, None).unwrap(); + let mut sync = + ChainSync::new(ChainSyncMode::Full, client.clone(), 5, 64, None, std::iter::empty()) + .unwrap(); let peer_id1 = PeerId::random(); let peer_id2 = PeerId::random(); @@ -421,7 +439,9 @@ fn can_sync_huge_fork() { let info = client.info(); - let mut sync = ChainSync::new(ChainSyncMode::Full, client.clone(), 5, 64, None).unwrap(); + let mut sync = + ChainSync::new(ChainSyncMode::Full, client.clone(), 5, 64, None, std::iter::empty()) + .unwrap(); let finalized_block = blocks[MAX_BLOCKS_TO_LOOK_BACKWARDS as usize * 2 - 1].clone(); let just = (*b"TEST", Vec::new()); @@ -452,7 +472,7 @@ fn can_sync_huge_fork() { let actions = sync.take_actions().collect::>(); request = if actions.is_empty() { - // We found the ancenstor + // We found the ancestor break } else { assert_eq!(actions.len(), 1); @@ -554,7 +574,9 @@ fn syncs_fork_without_duplicate_requests() { let info = client.info(); - let mut sync = ChainSync::new(ChainSyncMode::Full, client.clone(), 5, 64, None).unwrap(); + let mut sync = + ChainSync::new(ChainSyncMode::Full, client.clone(), 5, 64, None, std::iter::empty()) + .unwrap(); let finalized_block = blocks[MAX_BLOCKS_TO_LOOK_BACKWARDS as usize * 2 - 1].clone(); let just = (*b"TEST", Vec::new()); @@ -585,7 +607,7 @@ fn syncs_fork_without_duplicate_requests() { let actions = sync.take_actions().collect::>(); request = if actions.is_empty() { - // We found the ancenstor + // We found the ancestor break } else { assert_eq!(actions.len(), 1); @@ -689,7 +711,9 @@ fn removes_target_fork_on_disconnect() { let mut client = Arc::new(TestClientBuilder::new().build()); let blocks = (0..3).map(|_| build_block(&mut client, None, false)).collect::>(); - let mut sync = ChainSync::new(ChainSyncMode::Full, client.clone(), 1, 64, None).unwrap(); + let mut sync = + ChainSync::new(ChainSyncMode::Full, client.clone(), 1, 64, None, std::iter::empty()) + .unwrap(); let peer_id1 = PeerId::random(); let common_block = blocks[1].clone(); @@ -714,7 +738,9 @@ fn can_import_response_with_missing_blocks() { let empty_client = Arc::new(TestClientBuilder::new().build()); - let mut sync = ChainSync::new(ChainSyncMode::Full, empty_client.clone(), 1, 64, None).unwrap(); + let mut sync = + ChainSync::new(ChainSyncMode::Full, empty_client.clone(), 1, 64, None, std::iter::empty()) + .unwrap(); let peer_id1 = PeerId::random(); let best_block = blocks[3].clone(); @@ -745,7 +771,9 @@ fn ancestor_search_repeat() { #[test] fn sync_restart_removes_block_but_not_justification_requests() { let mut client = Arc::new(TestClientBuilder::new().build()); - let mut sync = ChainSync::new(ChainSyncMode::Full, client.clone(), 1, 64, None).unwrap(); + let mut sync = + ChainSync::new(ChainSyncMode::Full, client.clone(), 1, 64, None, std::iter::empty()) + .unwrap(); let peers = vec![PeerId::random(), PeerId::random()]; @@ -813,7 +841,7 @@ fn sync_restart_removes_block_but_not_justification_requests() { let actions = sync.take_actions().collect::>(); for action in actions.iter() { match action { - ChainSyncAction::CancelBlockRequest { peer_id } => { + ChainSyncAction::CancelRequest { peer_id } => { pending_responses.remove(&peer_id); }, ChainSyncAction::SendBlockRequest { peer_id, .. } => { @@ -887,7 +915,9 @@ fn request_across_forks() { fork_blocks }; - let mut sync = ChainSync::new(ChainSyncMode::Full, client.clone(), 5, 64, None).unwrap(); + let mut sync = + ChainSync::new(ChainSyncMode::Full, client.clone(), 5, 64, None, std::iter::empty()) + .unwrap(); // Add the peers, all at the common ancestor 100. let common_block = blocks.last().unwrap(); diff --git a/substrate/client/network/sync/src/strategy/state.rs b/substrate/client/network/sync/src/strategy/state.rs index ae3f7b6005594d020dfc3f32602833586d16ed92..c21cb22e40bb10a3179ad159f4709742aaf777cc 100644 --- a/substrate/client/network/sync/src/strategy/state.rs +++ b/substrate/client/network/sync/src/strategy/state.rs @@ -24,11 +24,11 @@ use crate::{ types::{BadPeer, OpaqueStateRequest, OpaqueStateResponse, SyncState, SyncStatus}, LOG_TARGET, }; -use libp2p::PeerId; use log::{debug, error, trace}; use sc_client_api::ProofProvider; use sc_consensus::{BlockImportError, BlockImportStatus, IncomingBlock}; use sc_network_common::sync::message::BlockAnnounce; +use sc_network_types::PeerId; use sp_consensus::BlockOrigin; use sp_runtime::{ traits::{Block as BlockT, Header, NumberFor}, @@ -79,7 +79,7 @@ pub struct StateStrategy { state_sync: Box>, peers: HashMap>, actions: Vec>, - succeded: bool, + succeeded: bool, } impl StateStrategy { @@ -110,7 +110,7 @@ impl StateStrategy { )), peers, actions: Vec::new(), - succeded: false, + succeeded: false, } } @@ -129,7 +129,7 @@ impl StateStrategy { }) .collect(), actions: Vec::new(), - succeded: false, + succeeded: false, } } @@ -260,7 +260,7 @@ impl StateStrategy { "Failed to import target block with state: {e:?}." ); }); - self.succeded |= results.into_iter().any(|result| result.is_ok()); + self.succeeded |= results.into_iter().any(|result| result.is_ok()); self.actions.push(StateStrategyAction::Finished); } } @@ -330,11 +330,6 @@ impl StateStrategy { } } - /// Get the number of peers known to syncing. - pub fn num_peers(&self) -> usize { - self.peers.len() - } - /// Get actions that should be performed by the owner on [`WarpSync`]'s behalf #[must_use] pub fn actions(&mut self) -> impl Iterator> { @@ -347,10 +342,10 @@ impl StateStrategy { std::mem::take(&mut self.actions).into_iter() } - /// Check if state sync has succeded. + /// Check if state sync has succeeded. #[must_use] - pub fn is_succeded(&self) -> bool { - self.succeded + pub fn is_succeeded(&self) -> bool { + self.succeeded } } @@ -674,7 +669,7 @@ mod test { } #[test] - fn succesfully_importing_target_block_finishes_strategy() { + fn successfully_importing_target_block_finishes_strategy() { let target_hash = Hash::random(); let mut state_sync_provider = MockStateSync::::new(); state_sync_provider.expect_target_hash().return_const(target_hash); diff --git a/substrate/client/network/sync/src/strategy/warp.rs b/substrate/client/network/sync/src/strategy/warp.rs index 7935b5f29b68df1ac259e325e66522afd9f55e4c..754f1f52bfd2109e57455c32ba2ff303320b9b33 100644 --- a/substrate/client/network/sync/src/strategy/warp.rs +++ b/substrate/client/network/sync/src/strategy/warp.rs @@ -27,11 +27,11 @@ use crate::{ }; use codec::{Decode, Encode}; use futures::channel::oneshot; -use libp2p::PeerId; use log::{debug, error, trace}; use sc_network_common::sync::message::{ BlockAnnounce, BlockAttributes, BlockData, BlockRequest, Direction, FromBlock, }; +use sc_network_types::PeerId; use sp_blockchain::HeaderBackend; use sp_runtime::{ traits::{Block as BlockT, Header, NumberFor, Zero}, @@ -968,7 +968,7 @@ mod test { warp_sync.on_warp_proof_response(&request_peer_id, EncodedProof(Vec::new())); - // We only interested in alredy generated actions, not new requests. + // We only interested in already generated actions, not new requests. let actions = std::mem::take(&mut warp_sync.actions); assert_eq!(actions.len(), 1); assert!(matches!( diff --git a/substrate/client/network/sync/src/types.rs b/substrate/client/network/sync/src/types.rs index 4074b33eee1a90bdb2f5596ef82e76b254cf8751..e8b8c89003609e009f75b1e06bdaa87d900d24a2 100644 --- a/substrate/client/network/sync/src/types.rs +++ b/substrate/client/network/sync/src/types.rs @@ -21,10 +21,10 @@ use futures::Stream; use sc_network_common::{role::Roles, types::ReputationChange}; -use libp2p::PeerId; - use crate::strategy::{state_sync::StateSyncProgress, warp::WarpSyncProgress}; + use sc_network_common::sync::message::BlockRequest; +use sc_network_types::PeerId; use sp_runtime::traits::{Block as BlockT, NumberFor}; use std::{any::Any, fmt, fmt::Formatter, pin::Pin, sync::Arc}; diff --git a/substrate/client/network/sync/src/warp_request_handler.rs b/substrate/client/network/sync/src/warp_request_handler.rs index 39cf1c5d8067e154d0e414fc42069f1f7500b097..371b04ec9e4d50a009d1a62e372ebf471ed0e243 100644 --- a/substrate/client/network/sync/src/warp_request_handler.rs +++ b/substrate/client/network/sync/src/warp_request_handler.rs @@ -26,9 +26,8 @@ use crate::{ }; use sc_network::{ config::ProtocolId, - request_responses::{ - IncomingRequest, OutgoingResponse, ProtocolConfig as RequestResponseConfig, - }, + request_responses::{IncomingRequest, OutgoingResponse}, + NetworkBackend, }; use sp_runtime::traits::Block as BlockT; @@ -39,25 +38,29 @@ const MAX_RESPONSE_SIZE: u64 = 16 * 1024 * 1024; /// Incoming warp requests bounded queue size. const MAX_WARP_REQUEST_QUEUE: usize = 20; -/// Generates a [`RequestResponseConfig`] for the grandpa warp sync request protocol, refusing +/// Generates a `RequestResponseProtocolConfig` for the grandpa warp sync request protocol, refusing /// incoming requests. -pub fn generate_request_response_config>( +pub fn generate_request_response_config< + Hash: AsRef<[u8]>, + B: BlockT, + N: NetworkBackend::Hash>, +>( protocol_id: ProtocolId, genesis_hash: Hash, fork_id: Option<&str>, -) -> RequestResponseConfig { - RequestResponseConfig { - name: generate_protocol_name(genesis_hash, fork_id).into(), - fallback_names: std::iter::once(generate_legacy_protocol_name(protocol_id).into()) - .collect(), - max_request_size: 32, - max_response_size: MAX_RESPONSE_SIZE, - request_timeout: Duration::from_secs(10), - inbound_queue: None, - } + inbound_queue: async_channel::Sender, +) -> N::RequestResponseProtocolConfig { + N::request_response_config( + generate_protocol_name(genesis_hash, fork_id).into(), + std::iter::once(generate_legacy_protocol_name(protocol_id).into()).collect(), + 32, + MAX_RESPONSE_SIZE, + Duration::from_secs(10), + Some(inbound_queue), + ) } -/// Generate the grandpa warp sync protocol name from the genesi hash and fork id. +/// Generate the grandpa warp sync protocol name from the genesis hash and fork id. fn generate_protocol_name>(genesis_hash: Hash, fork_id: Option<&str>) -> String { let genesis_hash = genesis_hash.as_ref(); if let Some(fork_id) = fork_id { @@ -80,17 +83,20 @@ pub struct RequestHandler { impl RequestHandler { /// Create a new [`RequestHandler`]. - pub fn new>( + pub fn new, N: NetworkBackend::Hash>>( protocol_id: ProtocolId, genesis_hash: Hash, fork_id: Option<&str>, backend: Arc>, - ) -> (Self, RequestResponseConfig) { + ) -> (Self, N::RequestResponseProtocolConfig) { let (tx, request_receiver) = async_channel::bounded(MAX_WARP_REQUEST_QUEUE); - let mut request_response_config = - generate_request_response_config(protocol_id, genesis_hash, fork_id); - request_response_config.inbound_queue = Some(tx); + let request_response_config = generate_request_response_config::<_, TBlock, N>( + protocol_id, + genesis_hash, + fork_id, + tx, + ); (Self { backend, request_receiver }, request_response_config) } diff --git a/substrate/client/network/test/Cargo.toml b/substrate/client/network/test/Cargo.toml index dced6ed673057deb6959eb4b6fb001cff5be301a..f70e4847f59f32ee7418b370cb60339d3ff12ef7 100644 --- a/substrate/client/network/test/Cargo.toml +++ b/substrate/client/network/test/Cargo.toml @@ -16,12 +16,12 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -tokio = "1.22.0" -async-trait = "0.1.74" -futures = "0.3.21" +tokio = "1.37" +async-trait = "0.1.79" +futures = "0.3.30" futures-timer = "3.0.1" libp2p = "0.51.4" -log = "0.4.17" +log = { workspace = true, default-features = true } parking_lot = "0.12.1" rand = "0.8.5" sc-block-builder = { path = "../../block-builder" } @@ -29,6 +29,7 @@ sc-client-api = { path = "../../api" } sc-consensus = { path = "../../consensus/common" } sc-network = { path = ".." } sc-network-common = { path = "../common" } +sc-network-types = { path = "../types" } sc-utils = { path = "../../utils" } sc-network-light = { path = "../light" } sc-network-sync = { path = "../sync" } diff --git a/substrate/client/network/test/src/block_import.rs b/substrate/client/network/test/src/block_import.rs index 35795432b37f4d47904c50f6507a7e555ca798a4..690a579e0272bce6fc0123deb66e528635afb9a2 100644 --- a/substrate/client/network/test/src/block_import.rs +++ b/substrate/client/network/test/src/block_import.rs @@ -58,7 +58,7 @@ fn prepare_good_block() -> (TestClient, Hash, u64, PeerId, IncomingBlock) body: Some(Vec::new()), indexed_body: None, justifications, - origin: Some(peer_id), + origin: Some(peer_id.into()), allow_missing_state: false, import_existing: false, state: None, @@ -81,7 +81,7 @@ fn import_single_good_block_works() { &mut PassThroughVerifier::new(true), )) { Ok(BlockImportStatus::ImportedUnknown(ref num, ref aux, ref org)) - if *num == number && *aux == expected_aux && *org == Some(peer_id) => {}, + if *num == number && *aux == expected_aux && *org == Some(peer_id.into()) => {}, r @ _ => panic!("{:?}", r), } } @@ -110,7 +110,7 @@ fn import_single_good_block_without_header_fails() { block, &mut PassThroughVerifier::new(true), )) { - Err(BlockImportError::IncompleteHeader(ref org)) if *org == Some(peer_id) => {}, + Err(BlockImportError::IncompleteHeader(ref org)) if *org == Some(peer_id.into()) => {}, _ => panic!(), } } diff --git a/substrate/client/network/test/src/fuzz.rs b/substrate/client/network/test/src/fuzz.rs index 2e288accd80bc4f43214db8d4d7fc74611b82a2e..69d08d47d26a9ea4368ffdfea456711345d15d8b 100644 --- a/substrate/client/network/test/src/fuzz.rs +++ b/substrate/client/network/test/src/fuzz.rs @@ -20,7 +20,6 @@ //! and `PeerStore` to discover possible inconsistencies in peer management. use futures::prelude::*; -use libp2p::PeerId; use rand::{ distributions::{Distribution, Uniform, WeightedIndex}, seq::IteratorRandom, @@ -28,10 +27,13 @@ use rand::{ use sc_network::{ peer_store::{PeerStore, PeerStoreProvider}, protocol_controller::{IncomingIndex, Message, ProtoSetConfig, ProtocolController, SetId}, - ReputationChange, + PeerId, ReputationChange, }; use sc_utils::mpsc::tracing_unbounded; -use std::collections::{HashMap, HashSet}; +use std::{ + collections::{HashMap, HashSet}, + sync::Arc, +}; /// Peer events as observed by `Notifications` / fuzz test. #[derive(Debug, PartialEq, Eq, Hash, Clone, Copy)] @@ -141,7 +143,7 @@ async fn test_once() { .collect(); let peer_store = PeerStore::new(bootnodes); - let mut peer_store_handle = peer_store.handle(); + let peer_store_handle = peer_store.handle(); let (to_notifications, mut from_controller) = tracing_unbounded("test_to_notifications", 10_000); @@ -163,7 +165,7 @@ async fn test_once() { reserved_only: Uniform::new_inclusive(0, 10).sample(&mut rng) == 0, }, to_notifications, - Box::new(peer_store_handle.clone()), + Arc::new(peer_store_handle.clone()), ); tokio::spawn(peer_store.run()); @@ -319,14 +321,15 @@ async fn test_once() { 1 => { let new_id = PeerId::random(); known_nodes.insert(new_id, State::Disconnected); - peer_store_handle.add_known_peer(new_id); + peer_store_handle.add_known_peer(new_id.into()); }, // If we generate 2, adjust a random reputation. 2 => if let Some(id) = known_nodes.keys().choose(&mut rng) { let val = Uniform::new_inclusive(i32::MIN, i32::MAX).sample(&mut rng); - peer_store_handle.report_peer(*id, ReputationChange::new(val, "")); + let peer: sc_network_types::PeerId = id.into(); + peer_store_handle.report_peer(peer, ReputationChange::new(val, "")); }, // If we generate 3, disconnect from a random node. @@ -414,5 +417,6 @@ async fn test_once() { } } }) - .await; + .await + .unwrap(); } diff --git a/substrate/client/network/test/src/lib.rs b/substrate/client/network/test/src/lib.rs index aeed2985ace4821c4a5a7e54b3e73555e06fb11e..1dfe7d4454e9949f9ba9be08998363d77b5993a6 100644 --- a/substrate/client/network/test/src/lib.rs +++ b/substrate/client/network/test/src/lib.rs @@ -58,7 +58,7 @@ use sc_network::{ request_responses::ProtocolConfig as RequestResponseConfig, types::ProtocolName, Multiaddr, NetworkBlock, NetworkService, NetworkStateInfo, NetworkSyncForkRequest, - NetworkWorker, NotificationService, + NetworkWorker, NotificationMetrics, NotificationService, }; use sc_network_common::role::Roles; use sc_network_light::light_client_requests::handler::LightClientRequestHandler; @@ -248,7 +248,7 @@ where { /// Get this peer ID. pub fn id(&self) -> PeerId { - self.network.service().local_peer_id() + self.network.service().local_peer_id().into() } /// Returns true if we're major syncing. @@ -295,7 +295,11 @@ where hash: ::Hash, number: NumberFor, ) { - self.sync_service.set_sync_fork_request(peers, hash, number); + self.sync_service.set_sync_fork_request( + peers.into_iter().map(From::from).collect(), + hash, + number, + ); } /// Add blocks to the peer -- edit the block before adding @@ -829,7 +833,7 @@ pub trait TestNetFactory: Default + Sized + Send { let (chain_sync_network_provider, chain_sync_network_handle) = NetworkServiceProvider::new(); - let mut block_relay_params = BlockRequestHandler::new( + let mut block_relay_params = BlockRequestHandler::new::>( chain_sync_network_handle.clone(), &protocol_id, None, @@ -841,18 +845,24 @@ pub trait TestNetFactory: Default + Sized + Send { })); let state_request_protocol_config = { - let (handler, protocol_config) = - StateRequestHandler::new(&protocol_id, None, client.clone(), 50); + let (handler, protocol_config) = StateRequestHandler::new::>( + &protocol_id, + None, + client.clone(), + 50, + ); self.spawn_task(handler.run().boxed()); protocol_config }; - let light_client_request_protocol_config = { - let (handler, protocol_config) = - LightClientRequestHandler::new(&protocol_id, None, client.clone()); - self.spawn_task(handler.run().boxed()); - protocol_config - }; + let light_client_request_protocol_config = + { + let (handler, protocol_config) = LightClientRequestHandler::new::< + NetworkWorker<_, _>, + >(&protocol_id, None, client.clone()); + self.spawn_task(handler.run().boxed()); + protocol_config + }; let warp_sync = Arc::new(TestWarpSyncProvider(client.clone())); @@ -866,35 +876,45 @@ pub trait TestNetFactory: Default + Sized + Send { }; let warp_protocol_config = { - let (handler, protocol_config) = warp_request_handler::RequestHandler::new( - protocol_id.clone(), - client - .block_hash(0u32.into()) - .ok() - .flatten() - .expect("Genesis block exists; qed"), - None, - warp_sync.clone(), - ); + let (handler, protocol_config) = + warp_request_handler::RequestHandler::new::<_, NetworkWorker<_, _>>( + protocol_id.clone(), + client + .block_hash(0u32.into()) + .ok() + .flatten() + .expect("Genesis block exists; qed"), + None, + warp_sync.clone(), + ); self.spawn_task(handler.run().boxed()); protocol_config }; let peer_store = PeerStore::new( - network_config.boot_nodes.iter().map(|bootnode| bootnode.peer_id).collect(), + network_config + .boot_nodes + .iter() + .map(|bootnode| bootnode.peer_id.into()) + .collect(), ); - let peer_store_handle = peer_store.handle(); + let peer_store_handle = Arc::new(peer_store.handle()); self.spawn_task(peer_store.run().boxed()); let block_announce_validator = config .block_announce_validator .unwrap_or_else(|| Box::new(DefaultBlockAnnounceValidator)); + let metrics = as sc_network::NetworkBackend< + Block, + ::Hash, + >>::register_notification_metrics(None); let (engine, sync_service, block_announce_config) = sc_network_sync::engine::SyncingEngine::new( Roles::from(if config.is_authority { &Role::Authority } else { &Role::Full }), client.clone(), None, + metrics, &full_net_config, protocol_id.clone(), &fork_id, @@ -935,12 +955,13 @@ pub trait TestNetFactory: Default + Sized + Send { tokio::spawn(f); }), network_config: full_net_config, - peer_store: peer_store_handle, genesis_hash, protocol_id, fork_id, metrics_registry: None, block_announce_config, + bitswap_config: None, + notification_metrics: NotificationMetrics::new(None), }) .unwrap(); @@ -961,8 +982,10 @@ pub trait TestNetFactory: Default + Sized + Send { self.mut_peers(move |peers| { for peer in peers.iter_mut() { - peer.network - .add_known_address(network.service().local_peer_id(), listen_addr.clone()); + peer.network.add_known_address( + network.service().local_peer_id().into(), + listen_addr.clone(), + ); } let imported_blocks_stream = Box::pin(client.import_notification_stream().fuse()); diff --git a/substrate/client/network/test/src/service.rs b/substrate/client/network/test/src/service.rs index 800c0d4369c2cf3871e206af0321050375ba2ad9..150c1db7560e6d589e21e9aecb2add06fc57a47c 100644 --- a/substrate/client/network/test/src/service.rs +++ b/substrate/client/network/test/src/service.rs @@ -17,16 +17,15 @@ // along with this program. If not, see . use futures::prelude::*; -use libp2p::{Multiaddr, PeerId}; use sc_consensus::{ImportQueue, Link}; use sc_network::{ config::{self, FullNetworkConfiguration, MultiaddrWithPeerId, ProtocolId, TransportConfig}, event::Event, - peer_store::PeerStore, + peer_store::{PeerStore, PeerStoreProvider}, service::traits::{NotificationEvent, ValidationResult}, - NetworkEventStream, NetworkPeers, NetworkService, NetworkStateInfo, NetworkWorker, - NotificationService, + Multiaddr, NetworkEventStream, NetworkPeers, NetworkService, NetworkStateInfo, NetworkWorker, + NotificationMetrics, NotificationService, PeerId, }; use sc_network_common::role::Roles; use sc_network_light::light_client_requests::handler::LightClientRequestHandler; @@ -159,41 +158,54 @@ impl TestNetworkBuilder { let (chain_sync_network_provider, chain_sync_network_handle) = self.chain_sync_network.unwrap_or(NetworkServiceProvider::new()); - let mut block_relay_params = BlockRequestHandler::new( - chain_sync_network_handle.clone(), - &protocol_id, - None, - client.clone(), - 50, - ); + let mut block_relay_params = + BlockRequestHandler::new::< + NetworkWorker< + substrate_test_runtime_client::runtime::Block, + substrate_test_runtime_client::runtime::Hash, + >, + >(chain_sync_network_handle.clone(), &protocol_id, None, client.clone(), 50); tokio::spawn(Box::pin(async move { block_relay_params.server.run().await; })); let state_request_protocol_config = { - let (handler, protocol_config) = - StateRequestHandler::new(&protocol_id, None, client.clone(), 50); + let (handler, protocol_config) = StateRequestHandler::new::< + NetworkWorker< + substrate_test_runtime_client::runtime::Block, + substrate_test_runtime_client::runtime::Hash, + >, + >(&protocol_id, None, client.clone(), 50); tokio::spawn(handler.run().boxed()); protocol_config }; let light_client_request_protocol_config = { - let (handler, protocol_config) = - LightClientRequestHandler::new(&protocol_id, None, client.clone()); + let (handler, protocol_config) = LightClientRequestHandler::new::< + NetworkWorker< + substrate_test_runtime_client::runtime::Block, + substrate_test_runtime_client::runtime::Hash, + >, + >(&protocol_id, None, client.clone()); tokio::spawn(handler.run().boxed()); protocol_config }; let peer_store = PeerStore::new( - network_config.boot_nodes.iter().map(|bootnode| bootnode.peer_id).collect(), + network_config + .boot_nodes + .iter() + .map(|bootnode| bootnode.peer_id.into()) + .collect(), ); - let peer_store_handle = peer_store.handle(); + let peer_store_handle: Arc = Arc::new(peer_store.handle()); tokio::spawn(peer_store.run().boxed()); let (engine, chain_sync_service, block_announce_config) = SyncingEngine::new( Roles::from(&config::Role::Full), client.clone(), None, + NotificationMetrics::new(None), &full_net_config, protocol_id.clone(), &None, @@ -204,7 +216,7 @@ impl TestNetworkBuilder { block_relay_params.downloader, state_request_protocol_config.name.clone(), None, - peer_store_handle.clone(), + Arc::clone(&peer_store_handle), ) .unwrap(); let mut link = self.link.unwrap_or(Box::new(chain_sync_service.clone())); @@ -239,7 +251,11 @@ impl TestNetworkBuilder { let worker = NetworkWorker::< substrate_test_runtime_client::runtime::Block, substrate_test_runtime_client::runtime::Hash, - >::new(config::Params:: { + >::new(config::Params::< + substrate_test_runtime_client::runtime::Block, + substrate_test_runtime_client::runtime::Hash, + NetworkWorker<_, _>, + > { block_announce_config, role: config::Role::Full, executor: Box::new(|f| { @@ -247,10 +263,11 @@ impl TestNetworkBuilder { }), genesis_hash, network_config: full_net_config, - peer_store: peer_store_handle, protocol_id, fork_id, metrics_registry: None, + bitswap_config: None, + notification_metrics: NotificationMetrics::new(None), }) .unwrap(); @@ -670,7 +687,7 @@ async fn ensure_boot_node_addresses_consistent_with_transport_memory() { let listen_addr = config::build_multiaddr![Memory(rand::random::())]; let boot_node = MultiaddrWithPeerId { multiaddr: config::build_multiaddr![Ip4([127, 0, 0, 1]), Tcp(0_u16)], - peer_id: PeerId::random(), + peer_id: PeerId::random().into(), }; let _ = TestNetworkBuilder::new() @@ -696,7 +713,7 @@ async fn ensure_boot_node_addresses_consistent_with_transport_not_memory() { let listen_addr = config::build_multiaddr![Ip4([127, 0, 0, 1]), Tcp(0_u16)]; let boot_node = MultiaddrWithPeerId { multiaddr: config::build_multiaddr![Memory(rand::random::())], - peer_id: PeerId::random(), + peer_id: PeerId::random().into(), }; let _ = TestNetworkBuilder::new() @@ -721,7 +738,7 @@ async fn ensure_reserved_node_addresses_consistent_with_transport_memory() { let listen_addr = config::build_multiaddr![Memory(rand::random::())]; let reserved_node = MultiaddrWithPeerId { multiaddr: config::build_multiaddr![Ip4([127, 0, 0, 1]), Tcp(0_u16)], - peer_id: PeerId::random(), + peer_id: PeerId::random().into(), }; let _ = TestNetworkBuilder::new() @@ -750,7 +767,7 @@ async fn ensure_reserved_node_addresses_consistent_with_transport_not_memory() { let listen_addr = config::build_multiaddr![Ip4([127, 0, 0, 1]), Tcp(0_u16)]; let reserved_node = MultiaddrWithPeerId { multiaddr: config::build_multiaddr![Memory(rand::random::())], - peer_id: PeerId::random(), + peer_id: PeerId::random().into(), }; let _ = TestNetworkBuilder::new() diff --git a/substrate/client/network/test/src/sync.rs b/substrate/client/network/test/src/sync.rs index c025a8262f0e53e15200749f30ba22696930c52f..f1c1b7414303202346a35aaf335d162997b504c3 100644 --- a/substrate/client/network/test/src/sync.rs +++ b/substrate/client/network/test/src/sync.rs @@ -749,7 +749,7 @@ async fn sync_blocks_when_block_announce_validator_says_it_is_new_best() { } } -/// Waits for some time until the validation is successfull. +/// Waits for some time until the validation is successful. struct DeferredBlockAnnounceValidator; impl BlockAnnounceValidator for DeferredBlockAnnounceValidator { diff --git a/substrate/client/network/transactions/Cargo.toml b/substrate/client/network/transactions/Cargo.toml index 9e021059eb3da48eab08803a0b2b69819575d718..d74636d60a7da57edff1a14e003b623b252c94bc 100644 --- a/substrate/client/network/transactions/Cargo.toml +++ b/substrate/client/network/transactions/Cargo.toml @@ -18,13 +18,14 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] array-bytes = "6.1" codec = { package = "parity-scale-codec", version = "3.6.1", features = ["derive"] } -futures = "0.3.21" +futures = "0.3.30" libp2p = "0.51.4" -log = "0.4.17" +log = { workspace = true, default-features = true } prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../../utils/prometheus" } sc-network = { path = ".." } sc-network-common = { path = "../common" } sc-network-sync = { path = "../sync" } +sc-network-types = { path = "../types" } sc-utils = { path = "../../utils" } sp-runtime = { path = "../../../primitives/runtime" } sp-consensus = { path = "../../../primitives/consensus/common" } diff --git a/substrate/client/network/transactions/src/lib.rs b/substrate/client/network/transactions/src/lib.rs index b2299667448ca88ecda779a66b7b773605442357..3384aab5149dcb5b6127d75e744f010db950b5d1 100644 --- a/substrate/client/network/transactions/src/lib.rs +++ b/substrate/client/network/transactions/src/lib.rs @@ -30,20 +30,24 @@ use crate::config::*; use codec::{Decode, Encode}; use futures::{prelude::*, stream::FuturesUnordered}; -use libp2p::{multiaddr, PeerId}; use log::{debug, trace, warn}; use prometheus_endpoint::{register, Counter, PrometheusError, Registry, U64}; use sc_network::{ - config::{NonDefaultSetConfig, NonReservedPeerMode, ProtocolId, SetConfig}, - error, - service::traits::{NotificationEvent, NotificationService, ValidationResult}, + config::{NonReservedPeerMode, ProtocolId, SetConfig}, + error, multiaddr, + peer_store::PeerStoreProvider, + service::{ + traits::{NotificationEvent, NotificationService, ValidationResult}, + NotificationMetrics, + }, types::ProtocolName, utils::{interval, LruHashSet}, - NetworkEventStream, NetworkNotification, NetworkPeers, + NetworkBackend, NetworkEventStream, NetworkPeers, }; use sc_network_common::{role::ObservedRole, ExHashT}; use sc_network_sync::{SyncEvent, SyncEventStream}; +use sc_network_types::PeerId; use sc_utils::mpsc::{tracing_unbounded, TracingUnboundedReceiver, TracingUnboundedSender}; use sp_runtime::traits::Block as BlockT; @@ -61,6 +65,9 @@ pub mod config; /// A set of transactions. pub type Transactions = Vec; +/// Logging target for the file. +const LOG_TARGET: &str = "sync"; + mod rep { use sc_network::ReputationChange as Rep; /// Reputation change when a peer sends us any transaction. @@ -124,11 +131,17 @@ pub struct TransactionsHandlerPrototype { impl TransactionsHandlerPrototype { /// Create a new instance. - pub fn new>( + pub fn new< + Hash: AsRef<[u8]>, + Block: BlockT, + Net: NetworkBackend::Hash>, + >( protocol_id: ProtocolId, genesis_hash: Hash, fork_id: Option<&str>, - ) -> (Self, NonDefaultSetConfig) { + metrics: NotificationMetrics, + peer_store_handle: Arc, + ) -> (Self, Net::NotificationProtocolConfig) { let genesis_hash = genesis_hash.as_ref(); let protocol_name: ProtocolName = if let Some(fork_id) = fork_id { format!("/{}/{}/transactions/1", array_bytes::bytes2hex("", genesis_hash), fork_id) @@ -136,7 +149,7 @@ impl TransactionsHandlerPrototype { format!("/{}/transactions/1", array_bytes::bytes2hex("", genesis_hash)) } .into(); - let (config, notification_service) = NonDefaultSetConfig::new( + let (config, notification_service) = Net::notification_config( protocol_name.clone(), vec![format!("/{}/transactions/1", protocol_id.as_ref()).into()], MAX_TRANSACTIONS_SIZE, @@ -147,6 +160,8 @@ impl TransactionsHandlerPrototype { reserved_nodes: Vec::new(), non_reserved_mode: NonReservedPeerMode::Deny, }, + metrics, + peer_store_handle, ); (Self { protocol_name, notification_service }, config) @@ -160,7 +175,7 @@ impl TransactionsHandlerPrototype { pub fn build< B: BlockT + 'static, H: ExHashT, - N: NetworkPeers + NetworkEventStream + NetworkNotification, + N: NetworkPeers + NetworkEventStream, S: SyncEventStream + sp_consensus::SyncOracle, >( self, @@ -231,7 +246,7 @@ enum ToHandler { pub struct TransactionsHandler< B: BlockT + 'static, H: ExHashT, - N: NetworkPeers + NetworkEventStream + NetworkNotification, + N: NetworkPeers + NetworkEventStream, S: SyncEventStream + sp_consensus::SyncOracle, > { protocol_name: ProtocolName, @@ -272,7 +287,7 @@ impl TransactionsHandler where B: BlockT + 'static, H: ExHashT, - N: NetworkPeers + NetworkEventStream + NetworkNotification, + N: NetworkPeers + NetworkEventStream, S: SyncEventStream + sp_consensus::SyncOracle, { /// Turns the [`TransactionsHandler`] into a future that should run forever and not be @@ -369,7 +384,7 @@ where iter::once(addr).collect(), ); if let Err(err) = result { - log::error!(target: "sync", "Add reserved peer failed: {}", err); + log::error!(target: LOG_TARGET, "Add reserved peer failed: {}", err); } }, SyncEvent::PeerDisconnected(remote) => { @@ -378,7 +393,7 @@ where iter::once(remote).collect(), ); if let Err(err) = result { - log::error!(target: "sync", "Remove reserved peer failed: {}", err); + log::error!(target: LOG_TARGET, "Remove reserved peer failed: {}", err); } }, } @@ -388,16 +403,16 @@ where fn on_transactions(&mut self, who: PeerId, transactions: Transactions) { // Accept transactions only when node is not major syncing if self.sync.is_major_syncing() { - trace!(target: "sync", "{} Ignoring transactions while major syncing", who); + trace!(target: LOG_TARGET, "{} Ignoring transactions while major syncing", who); return } - trace!(target: "sync", "Received {} transactions from {}", transactions.len(), who); + trace!(target: LOG_TARGET, "Received {} transactions from {}", transactions.len(), who); if let Some(ref mut peer) = self.peers.get_mut(&who) { for t in transactions { if self.pending_transactions.len() > MAX_PENDING_TRANSACTIONS { debug!( - target: "sync", + target: LOG_TARGET, "Ignoring any further transactions that exceed `MAX_PENDING_TRANSACTIONS`({}) limit", MAX_PENDING_TRANSACTIONS, ); @@ -442,7 +457,7 @@ where return } - debug!(target: "sync", "Propagating transaction [{:?}]", hash); + debug!(target: LOG_TARGET, "Propagating transaction [{:?}]", hash); if let Some(transaction) = self.transaction_pool.transaction(hash) { let propagated_to = self.do_propagate_transactions(&[(hash.clone(), transaction)]); self.transaction_pool.on_broadcasted(propagated_to); @@ -506,7 +521,7 @@ where return } - debug!(target: "sync", "Propagating transactions"); + debug!(target: LOG_TARGET, "Propagating transactions"); let transactions = self.transaction_pool.transactions(); let propagated_to = self.do_propagate_transactions(&transactions); self.transaction_pool.on_broadcasted(propagated_to); diff --git a/substrate/client/network/types/Cargo.toml b/substrate/client/network/types/Cargo.toml new file mode 100644 index 0000000000000000000000000000000000000000..d8f03939ab96c303bd4ae862cd76df2ff77e0c91 --- /dev/null +++ b/substrate/client/network/types/Cargo.toml @@ -0,0 +1,19 @@ +[package] +description = "Substrate network types" +name = "sc-network-types" +version = "0.10.0-dev" +license = "GPL-3.0-or-later WITH Classpath-exception-2.0" +authors.workspace = true +edition.workspace = true +homepage = "https://substrate.io" +repository.workspace = true +documentation = "https://docs.rs/sc-network-types" + +[dependencies] +bs58 = "0.4.0" +libp2p-identity = { version = "0.1.3", features = ["ed25519", "peerid"] } +litep2p = { git = "https://github.com/paritytech/litep2p", branch = "master" } +multiaddr = "0.17.0" +multihash = { version = "0.17.0", default-features = false, features = ["identity", "multihash-impl", "sha2", "std"] } +rand = "0.8.5" +thiserror = "1.0.48" diff --git a/substrate/client/network/types/src/lib.rs b/substrate/client/network/types/src/lib.rs new file mode 100644 index 0000000000000000000000000000000000000000..9a126c48c7eab66ab39dd55a081a3a938aa16b92 --- /dev/null +++ b/substrate/client/network/types/src/lib.rs @@ -0,0 +1,18 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +mod peer_id; + +pub use peer_id::PeerId; diff --git a/substrate/client/network/types/src/peer_id.rs b/substrate/client/network/types/src/peer_id.rs new file mode 100644 index 0000000000000000000000000000000000000000..14ac4a1e9aae8028e6197327a9fe7eec633e40b4 --- /dev/null +++ b/substrate/client/network/types/src/peer_id.rs @@ -0,0 +1,248 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +use multiaddr::{Multiaddr, Protocol}; +use multihash::{Code, Error, Multihash}; +use rand::Rng; + +use std::{fmt, hash::Hash, str::FromStr}; + +/// Public keys with byte-lengths smaller than `MAX_INLINE_KEY_LENGTH` will be +/// automatically used as the peer id using an identity multihash. +const MAX_INLINE_KEY_LENGTH: usize = 42; + +/// Identifier of a peer of the network. +/// +/// The data is a CIDv0 compatible multihash of the protobuf encoded public key of the peer +/// as specified in [specs/peer-ids](https://github.com/libp2p/specs/blob/master/peer-ids/peer-ids.md). +#[derive(Clone, Copy, Eq, Hash, Ord, PartialEq, PartialOrd)] +pub struct PeerId { + multihash: Multihash, +} + +impl fmt::Debug for PeerId { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_tuple("PeerId").field(&self.to_base58()).finish() + } +} + +impl fmt::Display for PeerId { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + self.to_base58().fmt(f) + } +} + +impl PeerId { + /// Generate random peer ID. + pub fn random() -> PeerId { + let peer = rand::thread_rng().gen::<[u8; 32]>(); + PeerId { + multihash: Multihash::wrap(0x0, &peer).expect("The digest size is never too large"), + } + } + + /// Try to extract `PeerId` from `Multiaddr`. + pub fn try_from_multiaddr(address: &Multiaddr) -> Option { + match address.iter().find(|protocol| std::matches!(protocol, Protocol::P2p(_))) { + Some(Protocol::P2p(multihash)) => Some(Self { multihash }), + _ => None, + } + } + + /// Tries to turn a `Multihash` into a `PeerId`. + /// + /// If the multihash does not use a valid hashing algorithm for peer IDs, + /// or the hash value does not satisfy the constraints for a hashed + /// peer ID, it is returned as an `Err`. + pub fn from_multihash(multihash: Multihash) -> Result { + match Code::try_from(multihash.code()) { + Ok(Code::Sha2_256) => Ok(PeerId { multihash }), + Ok(Code::Identity) if multihash.digest().len() <= MAX_INLINE_KEY_LENGTH => + Ok(PeerId { multihash }), + _ => Err(multihash), + } + } + + /// Parses a `PeerId` from bytes. + pub fn from_bytes(data: &[u8]) -> Result { + PeerId::from_multihash(Multihash::from_bytes(data)?) + .map_err(|mh| Error::UnsupportedCode(mh.code())) + } + + /// Returns a raw bytes representation of this `PeerId`. + pub fn to_bytes(&self) -> Vec { + self.multihash.to_bytes() + } + + /// Returns a base-58 encoded string of this `PeerId`. + pub fn to_base58(&self) -> String { + bs58::encode(self.to_bytes()).into_string() + } + + /// Convert `PeerId` into ed25519 public key bytes. + pub fn into_ed25519(&self) -> Option<[u8; 32]> { + let hash = &self.multihash; + // https://www.ietf.org/archive/id/draft-multiformats-multihash-07.html#name-the-multihash-identifier-re + if hash.code() != 0 { + // Hash is not identity + return None + } + + let public = libp2p_identity::PublicKey::try_decode_protobuf(hash.digest()).ok()?; + public.try_into_ed25519().ok().map(|public| public.to_bytes()) + } + + /// Get `PeerId` from ed25519 public key bytes. + pub fn from_ed25519(bytes: &[u8; 32]) -> Option { + let public = libp2p_identity::ed25519::PublicKey::try_from_bytes(bytes).ok()?; + let public: libp2p_identity::PublicKey = public.into(); + let peer_id: libp2p_identity::PeerId = public.into(); + + Some(peer_id.into()) + } +} + +impl AsRef for PeerId { + fn as_ref(&self) -> &Multihash { + &self.multihash + } +} + +impl From for Multihash { + fn from(peer_id: PeerId) -> Self { + peer_id.multihash + } +} + +impl From for PeerId { + fn from(peer_id: libp2p_identity::PeerId) -> Self { + PeerId { multihash: Multihash::from_bytes(&peer_id.to_bytes()).expect("to succeed") } + } +} + +impl From for libp2p_identity::PeerId { + fn from(peer_id: PeerId) -> Self { + libp2p_identity::PeerId::from_bytes(&peer_id.to_bytes()).expect("to succeed") + } +} + +impl From<&libp2p_identity::PeerId> for PeerId { + fn from(peer_id: &libp2p_identity::PeerId) -> Self { + PeerId { multihash: Multihash::from_bytes(&peer_id.to_bytes()).expect("to succeed") } + } +} + +impl From<&PeerId> for libp2p_identity::PeerId { + fn from(peer_id: &PeerId) -> Self { + libp2p_identity::PeerId::from_bytes(&peer_id.to_bytes()).expect("to succeed") + } +} + +impl From for PeerId { + fn from(peer_id: litep2p::PeerId) -> Self { + PeerId { multihash: Multihash::from_bytes(&peer_id.to_bytes()).expect("to succeed") } + } +} + +impl From for litep2p::PeerId { + fn from(peer_id: PeerId) -> Self { + litep2p::PeerId::from_bytes(&peer_id.to_bytes()).expect("to succeed") + } +} + +impl From<&litep2p::PeerId> for PeerId { + fn from(peer_id: &litep2p::PeerId) -> Self { + PeerId { multihash: Multihash::from_bytes(&peer_id.to_bytes()).expect("to succeed") } + } +} + +impl From<&PeerId> for litep2p::PeerId { + fn from(peer_id: &PeerId) -> Self { + litep2p::PeerId::from_bytes(&peer_id.to_bytes()).expect("to succeed") + } +} + +/// Error when parsing a [`PeerId`] from string or bytes. +#[derive(Debug, thiserror::Error)] +pub enum ParseError { + #[error("base-58 decode error: {0}")] + B58(#[from] bs58::decode::Error), + #[error("unsupported multihash code '{0}'")] + UnsupportedCode(u64), + #[error("invalid multihash")] + InvalidMultihash(#[from] multihash::Error), +} + +impl FromStr for PeerId { + type Err = ParseError; + + #[inline] + fn from_str(s: &str) -> Result { + let bytes = bs58::decode(s).into_vec()?; + let peer_id = PeerId::from_bytes(&bytes)?; + + Ok(peer_id) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn extract_peer_id_from_multiaddr() { + { + let peer = PeerId::random(); + let address = "/ip4/198.51.100.19/tcp/30333" + .parse::() + .unwrap() + .with(Protocol::P2p(peer.into())); + + assert_eq!(PeerId::try_from_multiaddr(&address), Some(peer)); + } + + { + let peer = PeerId::random(); + assert_eq!( + PeerId::try_from_multiaddr(&Multiaddr::empty().with(Protocol::P2p(peer.into()))), + Some(peer) + ); + } + + { + assert!(PeerId::try_from_multiaddr( + &"/ip4/198.51.100.19/tcp/30333".parse::().unwrap() + ) + .is_none()); + } + } + + #[test] + fn from_ed25519() { + let keypair = litep2p::crypto::ed25519::Keypair::generate(); + let original_peer_id = litep2p::PeerId::from_public_key( + &litep2p::crypto::PublicKey::Ed25519(keypair.public()), + ); + + let peer_id: PeerId = original_peer_id.into(); + assert_eq!(original_peer_id.to_bytes(), peer_id.to_bytes()); + + let key = peer_id.into_ed25519().unwrap(); + assert_eq!(PeerId::from_ed25519(&key).unwrap(), original_peer_id.into()); + } +} diff --git a/substrate/client/offchain/Cargo.toml b/substrate/client/offchain/Cargo.toml index 520523712862d7e21775f5b10a22f20d205ecdba..b834241fe5a7e1b92b1683a92689b6d3de2a2995 100644 --- a/substrate/client/offchain/Cargo.toml +++ b/substrate/client/offchain/Cargo.toml @@ -20,13 +20,13 @@ array-bytes = "6.1" bytes = "1.1" codec = { package = "parity-scale-codec", version = "3.6.1", features = ["derive"] } fnv = "1.0.6" -futures = "0.3.21" +futures = "0.3.30" futures-timer = "3.0.2" hyper = { version = "0.14.16", features = ["http2", "stream"] } hyper-rustls = { version = "0.24.0", features = ["http2"] } libp2p = "0.51.4" num_cpus = "1.13" -once_cell = "1.8" +once_cell = "1.19" parking_lot = "0.12.1" rand = "0.8.5" threadpool = "1.7" @@ -34,6 +34,7 @@ tracing = "0.1.29" sc-client-api = { path = "../api" } sc-network = { path = "../network" } sc-network-common = { path = "../network/common" } +sc-network-types = { path = "../network/types" } sc-transaction-pool-api = { path = "../transaction-pool/api" } sc-utils = { path = "../utils" } sp-api = { path = "../../primitives/api" } @@ -42,11 +43,12 @@ sp-offchain = { path = "../../primitives/offchain" } sp-runtime = { path = "../../primitives/runtime" } sp-keystore = { path = "../../primitives/keystore" } sp-externalities = { path = "../../primitives/externalities" } -log = "0.4.17" +log = { workspace = true, default-features = true } [dev-dependencies] +async-trait = "0.1" lazy_static = "1.4.0" -tokio = "1.22.0" +tokio = "1.37" sc-block-builder = { path = "../block-builder" } sc-client-db = { path = "../db", default-features = true } sc-transaction-pool = { path = "../transaction-pool" } diff --git a/substrate/client/offchain/src/api.rs b/substrate/client/offchain/src/api.rs index 65e2f3ba64dbec30f5d5a944d5cb4f357c76e756..19ccdbcf498f4a7a53cc77cf1936da584238076d 100644 --- a/substrate/client/offchain/src/api.rs +++ b/substrate/client/offchain/src/api.rs @@ -22,7 +22,8 @@ use crate::NetworkProvider; use codec::{Decode, Encode}; use futures::Future; pub use http::SharedClient; -use libp2p::{Multiaddr, PeerId}; +use sc_network::Multiaddr; +use sc_network_types::PeerId; use sp_core::{ offchain::{ self, HttpError, HttpRequestId, HttpRequestStatus, OpaqueMultiaddr, OpaqueNetworkState, @@ -229,6 +230,7 @@ mod tests { pub(super) struct TestNetwork(); + #[async_trait::async_trait] impl NetworkPeers for TestNetwork { fn set_authorized_peers(&self, _peers: HashSet) { unimplemented!(); @@ -301,6 +303,10 @@ mod tests { fn peer_role(&self, _peer_id: PeerId, _handshake: Vec) -> Option { None } + + async fn reserved_peers(&self) -> Result, ()> { + unimplemented!(); + } } impl NetworkStateInfo for TestNetwork { diff --git a/substrate/client/offchain/src/api/http.rs b/substrate/client/offchain/src/api/http.rs index 7ca5e3fd13af788c7dee986202471a4ad2a9de6e..46f573341c57948539ef969f6f238923cd2fff22 100644 --- a/substrate/client/offchain/src/api/http.rs +++ b/substrate/client/offchain/src/api/http.rs @@ -604,7 +604,7 @@ enum WorkerToApi { /// because we don't want the `HttpApi` to have to drive the reading. /// Instead, reading an item from the channel will notify the worker task, which will push /// the next item. - /// Can also be used to send an error, in case an error happend on the HTTP socket. After + /// Can also be used to send an error, in case an error happened on the HTTP socket. After /// an error is sent, the channel will close. body: mpsc::Receiver>, }, diff --git a/substrate/client/offchain/src/lib.rs b/substrate/client/offchain/src/lib.rs index eb3436432f342f4de97a5325c7a14ea4ce167581..48d3b8f1393a430b8f07031775e4d83b063400b2 100644 --- a/substrate/client/offchain/src/lib.rs +++ b/substrate/client/offchain/src/lib.rs @@ -327,12 +327,12 @@ where mod tests { use super::*; use futures::executor::block_on; - use libp2p::{Multiaddr, PeerId}; use sc_block_builder::BlockBuilderBuilder; use sc_client_api::Backend as _; use sc_network::{ - config::MultiaddrWithPeerId, types::ProtocolName, ObservedRole, ReputationChange, + config::MultiaddrWithPeerId, types::ProtocolName, Multiaddr, ObservedRole, ReputationChange, }; + use sc_network_types::PeerId; use sc_transaction_pool::BasicPool; use sc_transaction_pool_api::{InPoolTransaction, TransactionPool}; use sp_consensus::BlockOrigin; @@ -361,6 +361,7 @@ mod tests { } } + #[async_trait::async_trait] impl NetworkPeers for TestNetwork { fn set_authorized_peers(&self, _peers: HashSet) { unimplemented!(); @@ -433,6 +434,10 @@ mod tests { fn peer_role(&self, _peer_id: PeerId, _handshake: Vec) -> Option { None } + + async fn reserved_peers(&self) -> Result, ()> { + unimplemented!(); + } } #[test] diff --git a/substrate/client/proposer-metrics/Cargo.toml b/substrate/client/proposer-metrics/Cargo.toml index 40fcc722010c96b1f8a380d61f0fab6f58b4a485..f560ce2d65e6e6336c7fa372618c858616ca134e 100644 --- a/substrate/client/proposer-metrics/Cargo.toml +++ b/substrate/client/proposer-metrics/Cargo.toml @@ -16,5 +16,5 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -log = "0.4.17" +log = { workspace = true, default-features = true } prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../utils/prometheus" } diff --git a/substrate/client/proposer-metrics/src/lib.rs b/substrate/client/proposer-metrics/src/lib.rs index 012e8ca769a96cb51141c5a13ca7ba04d76a8123..2856300cf8027b45bb0ef32b8781c533ae2e340c 100644 --- a/substrate/client/proposer-metrics/src/lib.rs +++ b/substrate/client/proposer-metrics/src/lib.rs @@ -44,11 +44,14 @@ impl MetricsLink { } /// The reason why proposing a block ended. +#[derive(Clone, Copy, PartialEq, Eq)] pub enum EndProposingReason { NoMoreTransactions, HitDeadline, HitBlockSizeLimit, HitBlockWeightLimit, + /// No transactions are allowed in the block. + TransactionForbidden, } /// Authorship metrics. @@ -112,6 +115,7 @@ impl Metrics { EndProposingReason::NoMoreTransactions => "no_more_transactions", EndProposingReason::HitBlockSizeLimit => "hit_block_size_limit", EndProposingReason::HitBlockWeightLimit => "hit_block_weight_limit", + EndProposingReason::TransactionForbidden => "transactions_forbidden", }; self.end_proposing_reason.with_label_values(&[reason]).inc(); diff --git a/substrate/client/rpc-api/Cargo.toml b/substrate/client/rpc-api/Cargo.toml index 8e781151ba8d83c14adbea03e06dfb94d4b46590..169714d22453d92276b02d949fa86e06862467b4 100644 --- a/substrate/client/rpc-api/Cargo.toml +++ b/substrate/client/rpc-api/Cargo.toml @@ -17,10 +17,10 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1" } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.195", features = ["derive"] } -serde_json = "1.0.111" -thiserror = "1.0" +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +serde = { features = ["derive"], workspace = true, default-features = true } +serde_json = { workspace = true, default-features = true } +thiserror = { workspace = true } sc-chain-spec = { path = "../chain-spec" } sc-mixnet = { path = "../mixnet" } sc-transaction-pool-api = { path = "../transaction-pool/api" } @@ -28,4 +28,4 @@ sp-core = { path = "../../primitives/core" } sp-rpc = { path = "../../primitives/rpc" } sp-runtime = { path = "../../primitives/runtime" } sp-version = { path = "../../primitives/version" } -jsonrpsee = { version = "0.20.3", features = ["client-core", "macros", "server"] } +jsonrpsee = { version = "0.22", features = ["client-core", "macros", "server"] } diff --git a/substrate/client/rpc-servers/Cargo.toml b/substrate/client/rpc-servers/Cargo.toml index b624a14e263ad935ecdcce03de0cf3d38c3c07ea..bc21b5b1582f95165ff6d529361c85a413fb915e 100644 --- a/substrate/client/rpc-servers/Cargo.toml +++ b/substrate/client/rpc-servers/Cargo.toml @@ -16,11 +16,14 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -jsonrpsee = { version = "0.20.3", features = ["server"] } -log = "0.4.17" -serde_json = "1.0.111" +jsonrpsee = { version = "0.22", features = ["server"] } +log = { workspace = true, default-features = true } +serde_json = { workspace = true, default-features = true } tokio = { version = "1.22.0", features = ["parking_lot"] } prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../utils/prometheus" } tower-http = { version = "0.4.0", features = ["cors"] } tower = { version = "0.4.13", features = ["util"] } http = "0.2.8" +hyper = "0.14.27" +futures = "0.3.30" +governor = "0.6.0" diff --git a/substrate/client/rpc-servers/src/lib.rs b/substrate/client/rpc-servers/src/lib.rs index 5d8da190f6277341d820bad65570f3eabe0e797e..ad4b444c7ff425ea84ba25e756d61854c3a4569e 100644 --- a/substrate/client/rpc-servers/src/lib.rs +++ b/substrate/client/rpc-servers/src/lib.rs @@ -22,21 +22,34 @@ pub mod middleware; -use std::{error::Error as StdError, net::SocketAddr, time::Duration}; +use std::{ + convert::Infallible, error::Error as StdError, net::SocketAddr, num::NonZeroU32, time::Duration, +}; use http::header::HeaderValue; +use hyper::{ + server::conn::AddrStream, + service::{make_service_fn, service_fn}, +}; use jsonrpsee::{ - server::middleware::{HostFilterLayer, ProxyGetRequestLayer}, - RpcModule, + server::{ + middleware::http::{HostFilterLayer, ProxyGetRequestLayer}, + stop_channel, ws, PingConfig, StopHandle, TowerServiceBuilder, + }, + Methods, RpcModule, }; use tokio::net::TcpListener; +use tower::Service; use tower_http::cors::{AllowOrigin, CorsLayer}; -pub use crate::middleware::RpcMetrics; -pub use jsonrpsee::core::{ - id_providers::{RandomIntegerIdProvider, RandomStringIdProvider}, - traits::IdProvider, +pub use jsonrpsee::{ + core::{ + id_providers::{RandomIntegerIdProvider, RandomStringIdProvider}, + traits::IdProvider, + }, + server::{middleware::rpc::RpcServiceBuilder, BatchRequestConfig}, }; +pub use middleware::{Metrics, MiddlewareLayer, RpcMetrics}; const MEGABYTE: u32 = 1024 * 1024; @@ -68,14 +81,31 @@ pub struct Config<'a, M: Send + Sync + 'static> { pub id_provider: Option>, /// Tokio runtime handle. pub tokio_handle: tokio::runtime::Handle, + /// Batch request config. + pub batch_config: BatchRequestConfig, + /// Rate limit calls per minute. + pub rate_limit: Option, +} + +#[derive(Debug, Clone)] +struct PerConnection { + methods: Methods, + stop_handle: StopHandle, + metrics: Option, + tokio_handle: tokio::runtime::Handle, + service_builder: TowerServiceBuilder, } /// Start RPC server listening on given address. -pub async fn start_server( +pub async fn start_server( config: Config<'_, M>, -) -> Result> { +) -> Result> +where + M: Send + Sync, +{ let Config { addrs, + batch_config, cors, max_payload_in_mb, max_payload_out_mb, @@ -86,13 +116,14 @@ pub async fn start_server( id_provider, tokio_handle, rpc_api, + rate_limit, } = config; let std_listener = TcpListener::bind(addrs.as_slice()).await?.into_std()?; let local_addr = std_listener.local_addr().ok(); let host_filter = hosts_filtering(cors.is_some(), local_addr); - let middleware = tower::ServiceBuilder::new() + let http_middleware = tower::ServiceBuilder::new() .option_layer(host_filter) // Proxy `GET /health` requests to internal `system_health` method. .layer(ProxyGetRequestLayer::new("/health", "system_health")?) @@ -103,10 +134,16 @@ pub async fn start_server( .max_response_body_size(max_payload_out_mb.saturating_mul(MEGABYTE)) .max_connections(max_connections) .max_subscriptions_per_connection(max_subs_per_conn) - .ping_interval(Duration::from_secs(30)) - .set_middleware(middleware) + .enable_ws_ping( + PingConfig::new() + .ping_interval(Duration::from_secs(30)) + .inactive_limit(Duration::from_secs(60)) + .max_failures(3), + ) + .set_http_middleware(http_middleware) .set_message_buffer_capacity(message_buffer_capacity) - .custom_tokio_runtime(tokio_handle); + .set_batch_request_config(batch_config) + .custom_tokio_runtime(tokio_handle.clone()); if let Some(provider) = id_provider { builder = builder.set_id_provider(provider); @@ -114,22 +151,81 @@ pub async fn start_server( builder = builder.set_id_provider(RandomStringIdProvider::new(16)); }; - let rpc_api = build_rpc_api(rpc_api); - let handle = if let Some(metrics) = metrics { - let server = builder.set_logger(metrics).build_from_tcp(std_listener)?; - server.start(rpc_api) - } else { - let server = builder.build_from_tcp(std_listener)?; - server.start(rpc_api) + let (stop_handle, server_handle) = stop_channel(); + let cfg = PerConnection { + methods: build_rpc_api(rpc_api).into(), + service_builder: builder.to_service_builder(), + metrics, + tokio_handle, + stop_handle: stop_handle.clone(), }; + let make_service = make_service_fn(move |_conn: &AddrStream| { + let cfg = cfg.clone(); + + async move { + let cfg = cfg.clone(); + + Ok::<_, Infallible>(service_fn(move |req| { + let PerConnection { service_builder, metrics, tokio_handle, stop_handle, methods } = + cfg.clone(); + + let is_websocket = ws::is_upgrade_request(&req); + let transport_label = if is_websocket { "ws" } else { "http" }; + + let middleware_layer = match (metrics, rate_limit) { + (None, None) => None, + (Some(metrics), None) => Some( + MiddlewareLayer::new().with_metrics(Metrics::new(metrics, transport_label)), + ), + (None, Some(rate_limit)) => + Some(MiddlewareLayer::new().with_rate_limit_per_minute(rate_limit)), + (Some(metrics), Some(rate_limit)) => Some( + MiddlewareLayer::new() + .with_metrics(Metrics::new(metrics, transport_label)) + .with_rate_limit_per_minute(rate_limit), + ), + }; + + let rpc_middleware = + RpcServiceBuilder::new().option_layer(middleware_layer.clone()); + + let mut svc = + service_builder.set_rpc_middleware(rpc_middleware).build(methods, stop_handle); + + async move { + if is_websocket { + let on_disconnect = svc.on_session_closed(); + + // Spawn a task to handle when the connection is closed. + tokio_handle.spawn(async move { + let now = std::time::Instant::now(); + middleware_layer.as_ref().map(|m| m.ws_connect()); + on_disconnect.await; + middleware_layer.as_ref().map(|m| m.ws_disconnect(now)); + }); + } + + svc.call(req).await + } + })) + } + }); + + let server = hyper::Server::from_tcp(std_listener)?.serve(make_service); + + tokio::spawn(async move { + let graceful = server.with_graceful_shutdown(async move { stop_handle.shutdown().await }); + let _ = graceful.await; + }); + log::info!( "Running JSON-RPC server: addr={}, allowed origins={}", local_addr.map_or_else(|| "unknown".to_string(), |a| a.to_string()), format_cors(cors) ); - Ok(handle) + Ok(server_handle) } fn hosts_filtering(enabled: bool, addr: Option) -> Option { diff --git a/substrate/client/rpc-servers/src/middleware.rs b/substrate/client/rpc-servers/src/middleware/metrics.rs similarity index 54% rename from substrate/client/rpc-servers/src/middleware.rs rename to substrate/client/rpc-servers/src/middleware/metrics.rs index fabb64eafa797189789611e01757aa7e5289b6b2..688c3c2a9fc42a8dddfcc2487b921ffca8616292 100644 --- a/substrate/client/rpc-servers/src/middleware.rs +++ b/substrate/client/rpc-servers/src/middleware/metrics.rs @@ -18,14 +18,13 @@ //! RPC middleware to collect prometheus metrics on RPC calls. -use jsonrpsee::server::logger::{ - HttpRequest, Logger, MethodKind, Params, SuccessOrError, TransportProtocol, -}; +use std::time::Instant; + +use jsonrpsee::{types::Request, MethodResponse}; use prometheus_endpoint::{ register, Counter, CounterVec, HistogramOpts, HistogramVec, Opts, PrometheusError, Registry, U64, }; -use std::net::SocketAddr; /// Histogram time buckets in microseconds. const HISTOGRAM_BUCKETS: [f64; 11] = [ @@ -46,10 +45,6 @@ const HISTOGRAM_BUCKETS: [f64; 11] = [ /// calls started/completed and their timings. #[derive(Debug, Clone)] pub struct RpcMetrics { - /// Number of RPC requests received since the server started. - requests_started: CounterVec, - /// Number of RPC requests completed since the server started. - requests_finished: CounterVec, /// Histogram over RPC execution times. calls_time: HistogramVec, /// Number of calls started. @@ -60,6 +55,8 @@ pub struct RpcMetrics { ws_sessions_opened: Option>, /// Number of Websocket sessions closed. ws_sessions_closed: Option>, + /// Histogram over RPC websocket sessions. + ws_sessions_time: HistogramVec, } impl RpcMetrics { @@ -67,26 +64,6 @@ impl RpcMetrics { pub fn new(metrics_registry: Option<&Registry>) -> Result, PrometheusError> { if let Some(metrics_registry) = metrics_registry { Ok(Some(Self { - requests_started: register( - CounterVec::new( - Opts::new( - "substrate_rpc_requests_started", - "Number of RPC requests (not calls) received by the server.", - ), - &["protocol"], - )?, - metrics_registry, - )?, - requests_finished: register( - CounterVec::new( - Opts::new( - "substrate_rpc_requests_finished", - "Number of RPC requests (not calls) processed by the server.", - ), - &["protocol"], - )?, - metrics_registry, - )?, calls_time: register( HistogramVec::new( HistogramOpts::new( @@ -94,7 +71,7 @@ impl RpcMetrics { "Total time [μs] of processed RPC calls", ) .buckets(HISTOGRAM_BUCKETS.to_vec()), - &["protocol", "method"], + &["protocol", "method", "is_rate_limited"], )?, metrics_registry, )?, @@ -114,7 +91,7 @@ impl RpcMetrics { "substrate_rpc_calls_finished", "Number of processed RPC calls (unique un-batched requests)", ), - &["protocol", "method", "is_error"], + &["protocol", "method", "is_error", "is_rate_limited"], )?, metrics_registry, )?, @@ -134,93 +111,117 @@ impl RpcMetrics { metrics_registry, )? .into(), + ws_sessions_time: register( + HistogramVec::new( + HistogramOpts::new( + "substrate_rpc_sessions_time", + "Total time [s] for each websocket session", + ) + .buckets(HISTOGRAM_BUCKETS.to_vec()), + &["protocol"], + )?, + metrics_registry, + )?, })) } else { Ok(None) } } -} - -impl Logger for RpcMetrics { - type Instant = std::time::Instant; - fn on_connect( - &self, - _remote_addr: SocketAddr, - _request: &HttpRequest, - transport: TransportProtocol, - ) { - if let TransportProtocol::WebSocket = transport { - self.ws_sessions_opened.as_ref().map(|counter| counter.inc()); - } + pub(crate) fn ws_connect(&self) { + self.ws_sessions_opened.as_ref().map(|counter| counter.inc()); } - fn on_request(&self, transport: TransportProtocol) -> Self::Instant { - let transport_label = transport_label_str(transport); - let now = std::time::Instant::now(); - self.requests_started.with_label_values(&[transport_label]).inc(); - now + pub(crate) fn ws_disconnect(&self, now: Instant) { + let micros = now.elapsed().as_secs(); + + self.ws_sessions_closed.as_ref().map(|counter| counter.inc()); + self.ws_sessions_time.with_label_values(&["ws"]).observe(micros as _); } - fn on_call(&self, name: &str, params: Params, kind: MethodKind, transport: TransportProtocol) { - let transport_label = transport_label_str(transport); + pub(crate) fn on_call(&self, req: &Request, transport_label: &'static str) { log::trace!( target: "rpc_metrics", - "[{}] on_call name={} params={:?} kind={}", - transport_label, - name, - params, - kind, + "[{transport_label}] on_call name={} params={:?}", + req.method_name(), + req.params(), ); - self.calls_started.with_label_values(&[transport_label, name]).inc(); + + self.calls_started + .with_label_values(&[transport_label, req.method_name()]) + .inc(); } - fn on_result( + pub(crate) fn on_response( &self, - name: &str, - success_or_error: SuccessOrError, - started_at: Self::Instant, - transport: TransportProtocol, + req: &Request, + rp: &MethodResponse, + is_rate_limited: bool, + transport_label: &'static str, + now: Instant, ) { - let transport_label = transport_label_str(transport); - let micros = started_at.elapsed().as_micros(); + log::trace!(target: "rpc_metrics", "[{transport_label}] on_response started_at={:?}", now); + log::trace!(target: "rpc_metrics::extra", "[{transport_label}] result={}", rp.as_result()); + + let micros = now.elapsed().as_micros(); log::debug!( target: "rpc_metrics", - "[{}] {} call took {} μs", - transport_label, - name, + "[{transport_label}] {} call took {} μs", + req.method_name(), micros, ); - self.calls_time.with_label_values(&[transport_label, name]).observe(micros as _); - + self.calls_time + .with_label_values(&[ + transport_label, + req.method_name(), + if is_rate_limited { "true" } else { "false" }, + ]) + .observe(micros as _); self.calls_finished .with_label_values(&[ transport_label, - name, + req.method_name(), // the label "is_error", so `success` should be regarded as false - // and vice-versa to be registrered correctly. - if success_or_error.is_success() { "false" } else { "true" }, + // and vice-versa to be registered correctly. + if rp.is_success() { "false" } else { "true" }, + if is_rate_limited { "true" } else { "false" }, ]) .inc(); } +} + +/// Metrics with transport label. +#[derive(Clone, Debug)] +pub struct Metrics { + pub(crate) inner: RpcMetrics, + pub(crate) transport_label: &'static str, +} - fn on_response(&self, result: &str, started_at: Self::Instant, transport: TransportProtocol) { - let transport_label = transport_label_str(transport); - log::trace!(target: "rpc_metrics", "[{}] on_response started_at={:?}", transport_label, started_at); - log::trace!(target: "rpc_metrics::extra", "[{}] result={:?}", transport_label, result); - self.requests_finished.with_label_values(&[transport_label]).inc(); +impl Metrics { + /// Create a new [`Metrics`]. + pub fn new(metrics: RpcMetrics, transport_label: &'static str) -> Self { + Self { inner: metrics, transport_label } } - fn on_disconnect(&self, _remote_addr: SocketAddr, transport: TransportProtocol) { - if let TransportProtocol::WebSocket = transport { - self.ws_sessions_closed.as_ref().map(|counter| counter.inc()); - } + pub(crate) fn ws_connect(&self) { + self.inner.ws_connect(); } -} -fn transport_label_str(t: TransportProtocol) -> &'static str { - match t { - TransportProtocol::Http => "http", - TransportProtocol::WebSocket => "ws", + pub(crate) fn ws_disconnect(&self, now: Instant) { + self.inner.ws_disconnect(now) + } + + pub(crate) fn on_call(&self, req: &Request) { + self.inner.on_call(req, self.transport_label) + } + + pub(crate) fn on_response( + &self, + req: &Request, + rp: &MethodResponse, + is_rate_limited: bool, + now: Instant, + ) { + self.inner.on_response(req, rp, is_rate_limited, self.transport_label, now) } } diff --git a/substrate/client/rpc-servers/src/middleware/mod.rs b/substrate/client/rpc-servers/src/middleware/mod.rs new file mode 100644 index 0000000000000000000000000000000000000000..88ed8b2f433580fa2d87f1a70eacc32019027f2a --- /dev/null +++ b/substrate/client/rpc-servers/src/middleware/mod.rs @@ -0,0 +1,148 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +//! JSON-RPC specific middleware. + +use std::{ + num::NonZeroU32, + time::{Duration, Instant}, +}; + +use futures::future::{BoxFuture, FutureExt}; +use governor::{clock::Clock, Jitter}; +use jsonrpsee::{ + server::middleware::rpc::RpcServiceT, + types::{ErrorObject, Id, Request}, + MethodResponse, +}; + +mod metrics; +mod rate_limit; + +pub use metrics::*; +pub use rate_limit::*; + +const MAX_JITTER: Duration = Duration::from_millis(50); +const MAX_RETRIES: usize = 10; + +/// JSON-RPC middleware layer. +#[derive(Debug, Clone, Default)] +pub struct MiddlewareLayer { + rate_limit: Option, + metrics: Option, +} + +impl MiddlewareLayer { + /// Create an empty MiddlewareLayer. + pub fn new() -> Self { + Self::default() + } + + /// Enable new rate limit middleware enforced per minute. + pub fn with_rate_limit_per_minute(self, n: NonZeroU32) -> Self { + Self { rate_limit: Some(RateLimit::per_minute(n)), metrics: self.metrics } + } + + /// Enable metrics middleware. + pub fn with_metrics(self, metrics: Metrics) -> Self { + Self { rate_limit: self.rate_limit, metrics: Some(metrics) } + } + + /// Register a new websocket connection. + pub fn ws_connect(&self) { + self.metrics.as_ref().map(|m| m.ws_connect()); + } + + /// Register that a websocket connection was closed. + pub fn ws_disconnect(&self, now: Instant) { + self.metrics.as_ref().map(|m| m.ws_disconnect(now)); + } +} + +impl tower::Layer for MiddlewareLayer { + type Service = Middleware; + + fn layer(&self, service: S) -> Self::Service { + Middleware { service, rate_limit: self.rate_limit.clone(), metrics: self.metrics.clone() } + } +} + +/// JSON-RPC middleware that handles metrics +/// and rate-limiting. +/// +/// These are part of the same middleware +/// because the metrics needs to know whether +/// a call was rate-limited or not because +/// it will impact the roundtrip for a call. +pub struct Middleware { + service: S, + rate_limit: Option, + metrics: Option, +} + +impl<'a, S> RpcServiceT<'a> for Middleware +where + S: Send + Sync + RpcServiceT<'a> + Clone + 'static, +{ + type Future = BoxFuture<'a, MethodResponse>; + + fn call(&self, req: Request<'a>) -> Self::Future { + let now = Instant::now(); + + self.metrics.as_ref().map(|m| m.on_call(&req)); + + let service = self.service.clone(); + let rate_limit = self.rate_limit.clone(); + let metrics = self.metrics.clone(); + + async move { + let mut is_rate_limited = false; + + if let Some(limit) = rate_limit.as_ref() { + let mut attempts = 0; + let jitter = Jitter::up_to(MAX_JITTER); + + loop { + if attempts >= MAX_RETRIES { + return reject_too_many_calls(req.id); + } + + if let Err(rejected) = limit.inner.check() { + tokio::time::sleep(jitter + rejected.wait_time_from(limit.clock.now())) + .await; + } else { + break; + } + + is_rate_limited = true; + attempts += 1; + } + } + + let rp = service.call(req.clone()).await; + metrics.as_ref().map(|m| m.on_response(&req, &rp, is_rate_limited, now)); + + rp + } + .boxed() + } +} + +fn reject_too_many_calls(id: Id) -> MethodResponse { + MethodResponse::error(id, ErrorObject::owned(-32999, "RPC rate limit exceeded", None::<()>)) +} diff --git a/substrate/client/rpc-servers/src/middleware/rate_limit.rs b/substrate/client/rpc-servers/src/middleware/rate_limit.rs new file mode 100644 index 0000000000000000000000000000000000000000..23335eb37686c30d6bf148a2fd38f75013aef606 --- /dev/null +++ b/substrate/client/rpc-servers/src/middleware/rate_limit.rs @@ -0,0 +1,47 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +//! RPC rate limit. + +use governor::{ + clock::{DefaultClock, QuantaClock}, + middleware::NoOpMiddleware, + state::{InMemoryState, NotKeyed}, + Quota, +}; +use std::{num::NonZeroU32, sync::Arc}; + +type RateLimitInner = governor::RateLimiter; + +/// Rate limit. +#[derive(Debug, Clone)] +pub struct RateLimit { + pub(crate) inner: Arc, + pub(crate) clock: QuantaClock, +} + +impl RateLimit { + /// Create a new `RateLimit` per minute. + pub fn per_minute(n: NonZeroU32) -> Self { + let clock = QuantaClock::default(); + Self { + inner: Arc::new(RateLimitInner::direct_with_clock(Quota::per_minute(n), &clock)), + clock, + } + } +} diff --git a/substrate/client/rpc-spec-v2/Cargo.toml b/substrate/client/rpc-spec-v2/Cargo.toml index 6d0e7e07848535d01cdc56214963105794a9c93f..e2612d914542ecd74758fadaa9ac3dc4b01bc7c1 100644 --- a/substrate/client/rpc-spec-v2/Cargo.toml +++ b/substrate/client/rpc-spec-v2/Cargo.toml @@ -16,7 +16,7 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -jsonrpsee = { version = "0.20.3", features = ["client-core", "macros", "server"] } +jsonrpsee = { version = "0.22", features = ["client-core", "macros", "server"] } # Internal chain structures for "chain_spec". sc-chain-spec = { path = "../chain-spec" } # Pool for submitting extrinsics required by "transaction" @@ -31,22 +31,25 @@ sc-client-api = { path = "../api" } sc-utils = { path = "../utils" } sc-rpc = { path = "../rpc" } codec = { package = "parity-scale-codec", version = "3.6.1" } -thiserror = "1.0" -serde = "1.0" +thiserror = { workspace = true } +serde = { workspace = true, default-features = true } hex = "0.4" -futures = "0.3.21" +futures = "0.3.30" parking_lot = "0.12.1" tokio-stream = { version = "0.1.14", features = ["sync"] } tokio = { version = "1.22.0", features = ["sync"] } array-bytes = "6.1" -log = "0.4.17" +log = { workspace = true, default-features = true } futures-util = { version = "0.3.30", default-features = false } +rand = "0.8.5" [dev-dependencies] -serde_json = "1.0.111" +jsonrpsee = { version = "0.22", features = ["server", "ws-client"] } +serde_json = { workspace = true, default-features = true } tokio = { version = "1.22.0", features = ["macros"] } substrate-test-runtime-client = { path = "../../test-utils/runtime/client" } substrate-test-runtime = { path = "../../test-utils/runtime" } +substrate-test-runtime-transaction-pool = { path = "../../test-utils/runtime/transaction-pool" } sp-consensus = { path = "../../primitives/consensus/common" } sp-externalities = { path = "../../primitives/externalities" } sp-maybe-compressed-blob = { path = "../../primitives/maybe-compressed-blob" } @@ -54,3 +57,4 @@ sc-block-builder = { path = "../block-builder" } sc-service = { path = "../service", features = ["test-helpers"] } assert_matches = "1.3.0" pretty_assertions = "1.2.1" +sc-transaction-pool = { path = "../transaction-pool" } diff --git a/substrate/client/rpc-spec-v2/src/archive/tests.rs b/substrate/client/rpc-spec-v2/src/archive/tests.rs index 09b2410eac6e875b9fd19433bc67b49b6e5da947..de71ed82a128845d98ef5b6f96e0896de1a71ef1 100644 --- a/substrate/client/rpc-spec-v2/src/archive/tests.rs +++ b/substrate/client/rpc-spec-v2/src/archive/tests.rs @@ -32,8 +32,7 @@ use super::{ use assert_matches::assert_matches; use codec::{Decode, Encode}; use jsonrpsee::{ - core::{EmptyServerParams as EmptyParams, Error}, - rpc_params, RpcModule, + core::EmptyServerParams as EmptyParams, rpc_params, MethodsError as Error, RpcModule, }; use sc_block_builder::BlockBuilderBuilder; use sc_client_api::ChildInfo; @@ -294,7 +293,7 @@ async fn archive_call() { ) .await .unwrap_err(); - assert_matches!(err, Error::Call(err) if err.code() == 3001 && err.message().contains("Invalid parameter")); + assert_matches!(err, Error::JsonRpc(err) if err.code() == 3001 && err.message().contains("Invalid parameter")); // Pass an invalid parameters that cannot be decode. let err = api @@ -305,7 +304,7 @@ async fn archive_call() { ) .await .unwrap_err(); - assert_matches!(err, Error::Call(err) if err.code() == 3001 && err.message().contains("Invalid parameter")); + assert_matches!(err, Error::JsonRpc(err) if err.code() == 3001 && err.message().contains("Invalid parameter")); // Invalid hash. let result: MethodResult = api @@ -436,7 +435,7 @@ async fn archive_storage_closest_merkle_value() { /// The core of this test. /// - /// Checks keys that are exact match, keys with descedant and keys that should not return + /// Checks keys that are exact match, keys with descendant and keys that should not return /// values. /// /// Returns (key, merkle value) pairs. @@ -460,7 +459,7 @@ async fn archive_storage_closest_merkle_value() { query_type: StorageQueryType::ClosestDescendantMerkleValue, pagination_start_key: None, }, - // Key with descedent. + // Key with descendant. PaginatedStorageQuery { key: hex_string(b":A"), query_type: StorageQueryType::ClosestDescendantMerkleValue, diff --git a/substrate/client/rpc-spec-v2/src/chain_head/api.rs b/substrate/client/rpc-spec-v2/src/chain_head/api.rs index 7c3b8d81c82aefbf14344524140005ad8cd0b479..3851adac2644d09b824383dba2e80d6877eff01a 100644 --- a/substrate/client/rpc-spec-v2/src/chain_head/api.rs +++ b/substrate/client/rpc-spec-v2/src/chain_head/api.rs @@ -26,8 +26,8 @@ use crate::{ }, common::events::StorageQuery, }; -use jsonrpsee::proc_macros::rpc; -use sp_rpc::list::ListOrValue; +use jsonrpsee::{proc_macros::rpc, server::ResponsePayload}; +pub use sp_rpc::list::ListOrValue; #[rpc(client, server)] pub trait ChainHeadApi { @@ -54,12 +54,12 @@ pub trait ChainHeadApi { /// # Unstable /// /// This method is unstable and subject to change in the future. - #[method(name = "chainHead_unstable_body", blocking)] - fn chain_head_unstable_body( + #[method(name = "chainHead_unstable_body", raw_method)] + async fn chain_head_unstable_body( &self, follow_subscription: String, hash: Hash, - ) -> Result; + ) -> ResponsePayload<'static, MethodResponse>; /// Retrieves the header of a pinned block. /// @@ -73,8 +73,8 @@ pub trait ChainHeadApi { /// # Unstable /// /// This method is unstable and subject to change in the future. - #[method(name = "chainHead_unstable_header", blocking)] - fn chain_head_unstable_header( + #[method(name = "chainHead_unstable_header", raw_method)] + async fn chain_head_unstable_header( &self, follow_subscription: String, hash: Hash, @@ -85,28 +85,28 @@ pub trait ChainHeadApi { /// # Unstable /// /// This method is unstable and subject to change in the future. - #[method(name = "chainHead_unstable_storage", blocking)] - fn chain_head_unstable_storage( + #[method(name = "chainHead_unstable_storage", raw_method)] + async fn chain_head_unstable_storage( &self, follow_subscription: String, hash: Hash, items: Vec>, child_trie: Option, - ) -> Result; + ) -> ResponsePayload<'static, MethodResponse>; /// Call into the Runtime API at a specified block's state. /// /// # Unstable /// /// This method is unstable and subject to change in the future. - #[method(name = "chainHead_unstable_call", blocking)] - fn chain_head_unstable_call( + #[method(name = "chainHead_unstable_call", raw_method)] + async fn chain_head_unstable_call( &self, follow_subscription: String, hash: Hash, function: String, call_parameters: String, - ) -> Result; + ) -> ResponsePayload<'static, MethodResponse>; /// Unpin a block or multiple blocks reported by the `follow` method. /// @@ -118,8 +118,8 @@ pub trait ChainHeadApi { /// # Unstable /// /// This method is unstable and subject to change in the future. - #[method(name = "chainHead_unstable_unpin", blocking)] - fn chain_head_unstable_unpin( + #[method(name = "chainHead_unstable_unpin", raw_method)] + async fn chain_head_unstable_unpin( &self, follow_subscription: String, hash_or_hashes: ListOrValue, @@ -131,8 +131,8 @@ pub trait ChainHeadApi { /// # Unstable /// /// This method is unstable and subject to change in the future. - #[method(name = "chainHead_unstable_continue", blocking)] - fn chain_head_unstable_continue( + #[method(name = "chainHead_unstable_continue", raw_method)] + async fn chain_head_unstable_continue( &self, follow_subscription: String, operation_id: String, @@ -145,8 +145,8 @@ pub trait ChainHeadApi { /// # Unstable /// /// This method is unstable and subject to change in the future. - #[method(name = "chainHead_unstable_stopOperation", blocking)] - fn chain_head_unstable_stop_operation( + #[method(name = "chainHead_unstable_stopOperation", raw_method)] + async fn chain_head_unstable_stop_operation( &self, follow_subscription: String, operation_id: String, diff --git a/substrate/client/rpc-spec-v2/src/chain_head/chain_head.rs b/substrate/client/rpc-spec-v2/src/chain_head/chain_head.rs index 0e207addcaeb71d4bedd9de2c2ba29d4f192640f..86d9a726d7bec371c157014adac0dfb1a926fb7e 100644 --- a/substrate/client/rpc-spec-v2/src/chain_head/chain_head.rs +++ b/substrate/client/rpc-spec-v2/src/chain_head/chain_head.rs @@ -34,9 +34,10 @@ use crate::{ hex_string, SubscriptionTaskExecutor, }; use codec::Encode; -use futures::future::FutureExt; +use futures::{channel::oneshot, future::FutureExt}; use jsonrpsee::{ - core::async_trait, types::SubscriptionId, PendingSubscriptionSink, SubscriptionSink, + core::async_trait, server::ResponsePayload, types::SubscriptionId, ConnectionDetails, + MethodResponseFuture, PendingSubscriptionSink, SubscriptionSink, }; use log::debug; use sc_client_api::{ @@ -61,9 +62,14 @@ pub struct ChainHeadConfig { pub subscription_max_pinned_duration: Duration, /// The maximum number of ongoing operations per subscription. pub subscription_max_ongoing_operations: usize, + /// Stop all subscriptions if the distance between the leaves and the current finalized + /// block is larger than this value. + pub max_lagging_distance: usize, /// The maximum number of items reported by the `chainHead_storage` before /// pagination is required. pub operation_max_storage_items: usize, + /// The maximum number of `chainHead_follow` subscriptions per connection. + pub max_follow_subscriptions_per_connection: usize, } /// Maximum pinned blocks across all connections. @@ -85,13 +91,22 @@ const MAX_ONGOING_OPERATIONS: usize = 16; /// before paginations is required. const MAX_STORAGE_ITER_ITEMS: usize = 5; +/// Stop all subscriptions if the distance between the leaves and the current finalized +/// block is larger than this value. +const MAX_LAGGING_DISTANCE: usize = 128; + +/// The maximum number of `chainHead_follow` subscriptions per connection. +const MAX_FOLLOW_SUBSCRIPTIONS_PER_CONNECTION: usize = 4; + impl Default for ChainHeadConfig { fn default() -> Self { ChainHeadConfig { global_max_pinned_blocks: MAX_PINNED_BLOCKS, subscription_max_pinned_duration: MAX_PINNED_DURATION, subscription_max_ongoing_operations: MAX_ONGOING_OPERATIONS, + max_lagging_distance: MAX_LAGGING_DISTANCE, operation_max_storage_items: MAX_STORAGE_ITER_ITEMS, + max_follow_subscriptions_per_connection: MAX_FOLLOW_SUBSCRIPTIONS_PER_CONNECTION, } } } @@ -105,10 +120,13 @@ pub struct ChainHead, Block: BlockT, Client> { /// Executor to spawn subscriptions. executor: SubscriptionTaskExecutor, /// Keep track of the pinned blocks for each subscription. - subscriptions: Arc>, + subscriptions: SubscriptionManagement, /// The maximum number of items reported by the `chainHead_storage` before /// pagination is required. operation_max_storage_items: usize, + /// Stop all subscriptions if the distance between the leaves and the current finalized + /// block is larger than this value. + max_lagging_distance: usize, /// Phantom member to pin the block type. _phantom: PhantomData, } @@ -125,13 +143,15 @@ impl, Block: BlockT, Client> ChainHead { client, backend: backend.clone(), executor, - subscriptions: Arc::new(SubscriptionManagement::new( + subscriptions: SubscriptionManagement::new( config.global_max_pinned_blocks, config.subscription_max_pinned_duration, config.subscription_max_ongoing_operations, + config.max_follow_subscriptions_per_connection, backend, - )), + ), operation_max_storage_items: config.operation_max_storage_items, + max_lagging_distance: config.max_lagging_distance, _phantom: PhantomData, } } @@ -179,17 +199,29 @@ where let subscriptions = self.subscriptions.clone(); let backend = self.backend.clone(); let client = self.client.clone(); + let max_lagging_distance = self.max_lagging_distance; let fut = async move { + // Ensure the current connection ID has enough space to accept a new subscription. + let connection_id = pending.connection_id(); + // The RAII `reserved_subscription` will clean up resources on drop: + // - free the reserved subscription for the connection ID. + // - remove the subscription ID from the subscription management. + let Some(mut reserved_subscription) = subscriptions.reserve_subscription(connection_id) + else { + pending.reject(ChainHeadRpcError::ReachedLimits).await; + return + }; + let Ok(sink) = pending.accept().await else { return }; let sub_id = read_subscription_id_as_string(&sink); - // Keep track of the subscription. - let Some(sub_data) = subscriptions.insert_subscription(sub_id.clone(), with_runtime) + let Some(sub_data) = + reserved_subscription.insert_subscription(sub_id.clone(), with_runtime) else { - // Inserting the subscription can only fail if the JsonRPSee - // generated a duplicate subscription ID. + // Inserting the subscription can only fail if the JsonRPSee generated a duplicate + // subscription ID. debug!(target: LOG_TARGET, "[follow][id={:?}] Subscription already accepted", sub_id); let msg = to_sub_message(&sink, &FollowEvent::::Stop); let _ = sink.send(msg).await; @@ -200,78 +232,121 @@ where let mut chain_head_follow = ChainHeadFollower::new( client, backend, - subscriptions.clone(), + subscriptions, with_runtime, sub_id.clone(), + max_lagging_distance, ); + let result = chain_head_follow.generate_events(sink, sub_data).await; + if let Err(SubscriptionManagementError::BlockDistanceTooLarge) = result { + debug!(target: LOG_TARGET, "[follow][id={:?}] All subscriptions are stopped", sub_id); + reserved_subscription.stop_all_subscriptions(); + } - chain_head_follow.generate_events(sink, sub_data).await; - - subscriptions.remove_subscription(&sub_id); debug!(target: LOG_TARGET, "[follow][id={:?}] Subscription removed", sub_id); }; self.executor.spawn("substrate-rpc-subscription", Some("rpc"), fut.boxed()); } - fn chain_head_unstable_body( + async fn chain_head_unstable_body( &self, + connection_details: ConnectionDetails, follow_subscription: String, hash: Block::Hash, - ) -> Result { - let mut block_guard = match self.subscriptions.lock_block(&follow_subscription, hash, 1) { - Ok(block) => block, - Err(SubscriptionManagementError::SubscriptionAbsent) | - Err(SubscriptionManagementError::ExceededLimits) => return Ok(MethodResponse::LimitReached), - Err(SubscriptionManagementError::BlockHashAbsent) => { - // Block is not part of the subscription. - return Err(ChainHeadRpcError::InvalidBlock.into()) - }, - Err(_) => return Err(ChainHeadRpcError::InvalidBlock.into()), - }; + ) -> ResponsePayload<'static, MethodResponse> { + if !self + .subscriptions + .contains_subscription(connection_details.id(), &follow_subscription) + { + // The spec says to return `LimitReached` if the follow subscription is invalid or + // stale. + return ResponsePayload::success(MethodResponse::LimitReached); + } - let operation_id = block_guard.operation().operation_id(); + let client = self.client.clone(); + let subscriptions = self.subscriptions.clone(); + let executor = self.executor.clone(); + + let result = spawn_blocking(&self.executor, async move { + let mut block_guard = match subscriptions.lock_block(&follow_subscription, hash, 1) { + Ok(block) => block, + Err(SubscriptionManagementError::SubscriptionAbsent) | + Err(SubscriptionManagementError::ExceededLimits) => + return ResponsePayload::success(MethodResponse::LimitReached), + Err(SubscriptionManagementError::BlockHashAbsent) => { + // Block is not part of the subscription. + return ResponsePayload::error(ChainHeadRpcError::InvalidBlock); + }, + Err(_) => return ResponsePayload::error(ChainHeadRpcError::InvalidBlock), + }; - let event = match self.client.block(hash) { - Ok(Some(signed_block)) => { - let extrinsics = signed_block - .block - .extrinsics() - .iter() - .map(|extrinsic| hex_string(&extrinsic.encode())) - .collect(); - FollowEvent::::OperationBodyDone(OperationBodyDone { + let operation_id = block_guard.operation().operation_id(); + + let event = match client.block(hash) { + Ok(Some(signed_block)) => { + let extrinsics = signed_block + .block + .extrinsics() + .iter() + .map(|extrinsic| hex_string(&extrinsic.encode())) + .collect(); + FollowEvent::::OperationBodyDone(OperationBodyDone { + operation_id: operation_id.clone(), + value: extrinsics, + }) + }, + Ok(None) => { + // The block's body was pruned. This subscription ID has become invalid. + debug!( + target: LOG_TARGET, + "[body][id={:?}] Stopping subscription because hash={:?} was pruned", + &follow_subscription, + hash + ); + subscriptions.remove_subscription(&follow_subscription); + return ResponsePayload::error(ChainHeadRpcError::InvalidBlock) + }, + Err(error) => FollowEvent::::OperationError(OperationError { operation_id: operation_id.clone(), - value: extrinsics, - }) - }, - Ok(None) => { - // The block's body was pruned. This subscription ID has become invalid. - debug!( - target: LOG_TARGET, - "[body][id={:?}] Stopping subscription because hash={:?} was pruned", - &follow_subscription, - hash - ); - self.subscriptions.remove_subscription(&follow_subscription); - return Err(ChainHeadRpcError::InvalidBlock.into()) - }, - Err(error) => FollowEvent::::OperationError(OperationError { - operation_id: operation_id.clone(), - error: error.to_string(), - }), - }; + error: error.to_string(), + }), + }; + + let (rp, rp_fut) = method_started_response(operation_id, None); + let fut = async move { + // Wait for the server to send out the response and if it produces an error no event + // should be generated. + if rp_fut.await.is_err() { + return; + } - let _ = block_guard.response_sender().unbounded_send(event); - Ok(MethodResponse::Started(MethodResponseStarted { operation_id, discarded_items: None })) + let _ = block_guard.response_sender().unbounded_send(event); + }; + executor.spawn_blocking("substrate-rpc-subscription", Some("rpc"), fut.boxed()); + + rp + }); + + result + .await + .unwrap_or_else(|_| ResponsePayload::success(MethodResponse::LimitReached)) } - fn chain_head_unstable_header( + async fn chain_head_unstable_header( &self, + connection_details: ConnectionDetails, follow_subscription: String, hash: Block::Hash, ) -> Result, ChainHeadRpcError> { - let _block_guard = match self.subscriptions.lock_block(&follow_subscription, hash, 1) { + if !self + .subscriptions + .contains_subscription(connection_details.id(), &follow_subscription) + { + return Ok(None); + } + + let block_guard = match self.subscriptions.lock_block(&follow_subscription, hash, 1) { Ok(block) => block, Err(SubscriptionManagementError::SubscriptionAbsent) | Err(SubscriptionManagementError::ExceededLimits) => return Ok(None), @@ -282,43 +357,68 @@ where Err(_) => return Err(ChainHeadRpcError::InvalidBlock.into()), }; - self.client - .header(hash) - .map(|opt_header| opt_header.map(|h| hex_string(&h.encode()))) - .map_err(|err| ChainHeadRpcError::InternalError(err.to_string())) + let client = self.client.clone(); + let result = spawn_blocking(&self.executor, async move { + let _block_guard = block_guard; + + client + .header(hash) + .map(|opt_header| opt_header.map(|h| hex_string(&h.encode()))) + .map_err(|err| ChainHeadRpcError::InternalError(err.to_string())) + }); + result.await.unwrap_or_else(|_| Ok(None)) } - fn chain_head_unstable_storage( + async fn chain_head_unstable_storage( &self, + connection_details: ConnectionDetails, follow_subscription: String, hash: Block::Hash, items: Vec>, child_trie: Option, - ) -> Result { + ) -> ResponsePayload<'static, MethodResponse> { + if !self + .subscriptions + .contains_subscription(connection_details.id(), &follow_subscription) + { + // The spec says to return `LimitReached` if the follow subscription is invalid or + // stale. + return ResponsePayload::success(MethodResponse::LimitReached); + } + // Gain control over parameter parsing and returned error. - let items = items + let items = match items .into_iter() .map(|query| { let key = StorageKey(parse_hex_param(query.key)?); Ok(StorageQuery { key, query_type: query.query_type }) }) - .collect::, ChainHeadRpcError>>()?; + .collect::, ChainHeadRpcError>>() + { + Ok(items) => items, + Err(err) => { + return ResponsePayload::error(err); + }, + }; - let child_trie = child_trie - .map(|child_trie| parse_hex_param(child_trie)) - .transpose()? - .map(ChildInfo::new_default_from_vec); + let child_trie = match child_trie.map(|child_trie| parse_hex_param(child_trie)).transpose() + { + Ok(c) => c.map(ChildInfo::new_default_from_vec), + Err(e) => return ResponsePayload::error(e), + }; let mut block_guard = match self.subscriptions.lock_block(&follow_subscription, hash, items.len()) { Ok(block) => block, Err(SubscriptionManagementError::SubscriptionAbsent) | - Err(SubscriptionManagementError::ExceededLimits) => return Ok(MethodResponse::LimitReached), + Err(SubscriptionManagementError::ExceededLimits) => { + return ResponsePayload::success(MethodResponse::LimitReached); + }, Err(SubscriptionManagementError::BlockHashAbsent) => { // Block is not part of the subscription. - return Err(ChainHeadRpcError::InvalidBlock.into()) + return ResponsePayload::error(ChainHeadRpcError::InvalidBlock) }, - Err(_) => return Err(ChainHeadRpcError::InvalidBlock.into()), + Err(_) => return ResponsePayload::error(ChainHeadRpcError::InvalidBlock), }; let mut storage_client = ChainHeadStorage::::new( @@ -334,79 +434,113 @@ where let mut items = items; items.truncate(num_operations); + let (rp, rp_fut) = method_started_response(operation_id, Some(discarded)); let fut = async move { + // Wait for the server to send out the response and if it produces an error no event + // should be generated. + if rp_fut.await.is_err() { + return; + } + storage_client.generate_events(block_guard, hash, items, child_trie).await; }; - self.executor .spawn_blocking("substrate-rpc-subscription", Some("rpc"), fut.boxed()); - Ok(MethodResponse::Started(MethodResponseStarted { - operation_id, - discarded_items: Some(discarded), - })) + + rp } - fn chain_head_unstable_call( + async fn chain_head_unstable_call( &self, + connection_details: ConnectionDetails, follow_subscription: String, hash: Block::Hash, function: String, call_parameters: String, - ) -> Result { - let call_parameters = Bytes::from(parse_hex_param(call_parameters)?); + ) -> ResponsePayload<'static, MethodResponse> { + let call_parameters = match parse_hex_param(call_parameters) { + Ok(hex) => Bytes::from(hex), + Err(err) => return ResponsePayload::error(err), + }; + + if !self + .subscriptions + .contains_subscription(connection_details.id(), &follow_subscription) + { + // The spec says to return `LimitReached` if the follow subscription is invalid or + // stale. + return ResponsePayload::success(MethodResponse::LimitReached); + } let mut block_guard = match self.subscriptions.lock_block(&follow_subscription, hash, 1) { Ok(block) => block, Err(SubscriptionManagementError::SubscriptionAbsent) | Err(SubscriptionManagementError::ExceededLimits) => { // Invalid invalid subscription ID. - return Ok(MethodResponse::LimitReached) + return ResponsePayload::success(MethodResponse::LimitReached) }, Err(SubscriptionManagementError::BlockHashAbsent) => { // Block is not part of the subscription. - return Err(ChainHeadRpcError::InvalidBlock.into()) + return ResponsePayload::error(ChainHeadRpcError::InvalidBlock) }, - Err(_) => return Err(ChainHeadRpcError::InvalidBlock.into()), + Err(_) => return ResponsePayload::error(ChainHeadRpcError::InvalidBlock), }; // Reject subscription if with_runtime is false. if !block_guard.has_runtime() { - return Err(ChainHeadRpcError::InvalidRuntimeCall( + return ResponsePayload::error(ChainHeadRpcError::InvalidRuntimeCall( "The runtime updates flag must be set".to_string(), - ) - .into()) + )); } let operation_id = block_guard.operation().operation_id(); - let event = self - .client - .executor() - .call(hash, &function, &call_parameters, CallContext::Offchain) - .map(|result| { - FollowEvent::::OperationCallDone(OperationCallDone { - operation_id: operation_id.clone(), - output: hex_string(&result), - }) - }) - .unwrap_or_else(|error| { - FollowEvent::::OperationError(OperationError { - operation_id: operation_id.clone(), - error: error.to_string(), + let client = self.client.clone(); + + let (rp, rp_fut) = method_started_response(operation_id.clone(), None); + let fut = async move { + // Wait for the server to send out the response and if it produces an error no event + // should be generated. + if rp_fut.await.is_err() { + return + } + + let event = client + .executor() + .call(hash, &function, &call_parameters, CallContext::Offchain) + .map(|result| { + FollowEvent::::OperationCallDone(OperationCallDone { + operation_id: operation_id.clone(), + output: hex_string(&result), + }) }) - }); + .unwrap_or_else(|error| { + FollowEvent::::OperationError(OperationError { + operation_id: operation_id.clone(), + error: error.to_string(), + }) + }); + + let _ = block_guard.response_sender().unbounded_send(event); + }; + self.executor + .spawn_blocking("substrate-rpc-subscription", Some("rpc"), fut.boxed()); - let _ = block_guard.response_sender().unbounded_send(event); - Ok(MethodResponse::Started(MethodResponseStarted { - operation_id: operation_id.clone(), - discarded_items: None, - })) + rp } - fn chain_head_unstable_unpin( + async fn chain_head_unstable_unpin( &self, + connection_details: ConnectionDetails, follow_subscription: String, hash_or_hashes: ListOrValue, ) -> Result<(), ChainHeadRpcError> { + if !self + .subscriptions + .contains_subscription(connection_details.id(), &follow_subscription) + { + return Ok(()); + } + let result = match hash_or_hashes { ListOrValue::Value(hash) => self.subscriptions.unpin_blocks(&follow_subscription, [hash]), @@ -424,15 +558,25 @@ where // Block is not part of the subscription. Err(ChainHeadRpcError::InvalidBlock) }, + Err(SubscriptionManagementError::DuplicateHashes) => + Err(ChainHeadRpcError::InvalidDuplicateHashes), Err(_) => Err(ChainHeadRpcError::InvalidBlock), } } - fn chain_head_unstable_continue( + async fn chain_head_unstable_continue( &self, + connection_details: ConnectionDetails, follow_subscription: String, operation_id: String, ) -> Result<(), ChainHeadRpcError> { + if !self + .subscriptions + .contains_subscription(connection_details.id(), &follow_subscription) + { + return Ok(()) + } + let Some(operation) = self.subscriptions.get_operation(&follow_subscription, &operation_id) else { return Ok(()) @@ -446,11 +590,19 @@ where } } - fn chain_head_unstable_stop_operation( + async fn chain_head_unstable_stop_operation( &self, + connection_details: ConnectionDetails, follow_subscription: String, operation_id: String, ) -> Result<(), ChainHeadRpcError> { + if !self + .subscriptions + .contains_subscription(connection_details.id(), &follow_subscription) + { + return Ok(()) + } + let Some(operation) = self.subscriptions.get_operation(&follow_subscription, &operation_id) else { return Ok(()) @@ -461,3 +613,34 @@ where Ok(()) } } + +fn method_started_response( + operation_id: String, + discarded_items: Option, +) -> (ResponsePayload<'static, MethodResponse>, MethodResponseFuture) { + let rp = MethodResponse::Started(MethodResponseStarted { operation_id, discarded_items }); + ResponsePayload::success(rp).notify_on_completion() +} + +/// Spawn a blocking future on the provided executor and return the result on a oneshot channel. +/// +/// This is a wrapper to extract the result of a `executor.spawn_blocking` future. +fn spawn_blocking( + executor: &SubscriptionTaskExecutor, + fut: impl std::future::Future + Send + 'static, +) -> oneshot::Receiver +where + R: Send + 'static, +{ + let (tx, rx) = oneshot::channel(); + + let blocking_fut = async move { + let result = fut.await; + // Send the result back on the channel. + let _ = tx.send(result); + }; + + executor.spawn_blocking("substrate-rpc-subscription", Some("rpc"), blocking_fut.boxed()); + + rx +} diff --git a/substrate/client/rpc-spec-v2/src/chain_head/chain_head_follow.rs b/substrate/client/rpc-spec-v2/src/chain_head/chain_head_follow.rs index e94374aebd912b40074c194f656a1951fb097510..0d87a45c07e295784bef4c946ef05d3641234ce4 100644 --- a/substrate/client/rpc-spec-v2/src/chain_head/chain_head_follow.rs +++ b/substrate/client/rpc-spec-v2/src/chain_head/chain_head_follow.rs @@ -41,8 +41,17 @@ use sp_api::CallApiAt; use sp_blockchain::{ Backend as BlockChainBackend, Error as BlockChainError, HeaderBackend, HeaderMetadata, Info, }; -use sp_runtime::traits::{Block as BlockT, Header as HeaderT, NumberFor}; -use std::{collections::HashSet, sync::Arc}; +use sp_runtime::{ + traits::{Block as BlockT, Header as HeaderT, NumberFor}, + SaturatedConversion, Saturating, +}; +use std::{ + collections::{HashSet, VecDeque}, + sync::Arc, +}; +/// The maximum number of finalized blocks provided by the +/// `Initialized` event. +const MAX_FINALIZED_BLOCKS: usize = 16; use super::subscription::InsertedSubscriptionData; @@ -53,13 +62,16 @@ pub struct ChainHeadFollower, Block: BlockT, Client> { /// Backend of the chain. backend: Arc, /// Subscriptions handle. - sub_handle: Arc>, + sub_handle: SubscriptionManagement, /// Subscription was started with the runtime updates flag. with_runtime: bool, /// Subscription ID. sub_id: String, /// The best reported block by this subscription. best_block_cache: Option, + /// Stop all subscriptions if the distance between the leaves and the current finalized + /// block is larger than this value. + max_lagging_distance: usize, } impl, Block: BlockT, Client> ChainHeadFollower { @@ -67,11 +79,20 @@ impl, Block: BlockT, Client> ChainHeadFollower, backend: Arc, - sub_handle: Arc>, + sub_handle: SubscriptionManagement, with_runtime: bool, sub_id: String, + max_lagging_distance: usize, ) -> Self { - Self { client, backend, sub_handle, with_runtime, sub_id, best_block_cache: None } + Self { + client, + backend, + sub_handle, + with_runtime, + sub_id, + best_block_cache: None, + max_lagging_distance, + } } } @@ -95,6 +116,8 @@ struct InitialBlocks { /// /// It is a tuple of (block hash, parent hash). finalized_block_descendants: Vec<(Block::Hash, Block::Hash)>, + /// Hashes of the last finalized blocks + finalized_block_hashes: VecDeque, /// Blocks that should not be reported as pruned by the `Finalized` event. /// /// Substrate database will perform the pruning of height N at @@ -177,17 +200,54 @@ where } } + /// Check the distance between the provided blocks does not exceed a + /// a reasonable range. + /// + /// When the blocks are too far apart (potentially millions of blocks): + /// - Tree route is expensive to calculate. + /// - The RPC layer will not be able to generate the `NewBlock` events for all blocks. + /// + /// This edge-case can happen for parachains where the relay chain syncs slower to + /// the head of the chain than the parachain node that is synced already. + fn distace_within_reason( + &self, + block: Block::Hash, + finalized: Block::Hash, + ) -> Result<(), SubscriptionManagementError> { + let Some(block_num) = self.client.number(block)? else { + return Err(SubscriptionManagementError::BlockHashAbsent) + }; + let Some(finalized_num) = self.client.number(finalized)? else { + return Err(SubscriptionManagementError::BlockHashAbsent) + }; + + let distance: usize = block_num.saturating_sub(finalized_num).saturated_into(); + if distance > self.max_lagging_distance { + return Err(SubscriptionManagementError::BlockDistanceTooLarge); + } + + Ok(()) + } + /// Get the in-memory blocks of the client, starting from the provided finalized hash. + /// + /// The reported blocks are pinned by this function. fn get_init_blocks_with_forks( &self, - startup_point: &StartupPoint, + finalized: Block::Hash, ) -> Result, SubscriptionManagementError> { let blockchain = self.backend.blockchain(); let leaves = blockchain.leaves()?; - let finalized = startup_point.finalized_hash; let mut pruned_forks = HashSet::new(); let mut finalized_block_descendants = Vec::new(); let mut unique_descendants = HashSet::new(); + + // Ensure all leaves are within a reasonable distance from the finalized block, + // before traversing the tree. + for leaf in &leaves { + self.distace_within_reason(*leaf, finalized)?; + } + for leaf in leaves { let tree_route = sp_blockchain::tree_route(blockchain, finalized, leaf)?; @@ -198,17 +258,47 @@ where // Ensure a `NewBlock` event is generated for all children of the // finalized block. Describe the tree route as (child_node, parent_node) // Note: the order of elements matters here. - let parents = std::iter::once(finalized).chain(blocks.clone()); + let mut parent = finalized; + for child in blocks { + let pair = (child, parent); - for pair in blocks.zip(parents) { if unique_descendants.insert(pair) { + // The finalized block is pinned below. + self.sub_handle.pin_block(&self.sub_id, child)?; finalized_block_descendants.push(pair); } + + parent = child; } } } - Ok(InitialBlocks { finalized_block_descendants, pruned_forks }) + let mut current_block = finalized; + // The header of the finalized block must not be pruned. + let Some(header) = blockchain.header(current_block)? else { + return Err(SubscriptionManagementError::BlockHeaderAbsent); + }; + + // Report at most `MAX_FINALIZED_BLOCKS`. Note: The node might not have that many blocks. + let mut finalized_block_hashes = VecDeque::with_capacity(MAX_FINALIZED_BLOCKS); + + // Pin the finalized block. + self.sub_handle.pin_block(&self.sub_id, current_block)?; + finalized_block_hashes.push_front(current_block); + current_block = *header.parent_hash(); + + for _ in 0..MAX_FINALIZED_BLOCKS - 1 { + let Ok(Some(header)) = blockchain.header(current_block) else { break }; + // Block cannot be reported if pinning fails. + if self.sub_handle.pin_block(&self.sub_id, current_block).is_err() { + break + }; + + finalized_block_hashes.push_front(current_block); + current_block = *header.parent_hash(); + } + + Ok(InitialBlocks { finalized_block_descendants, finalized_block_hashes, pruned_forks }) } /// Generate the initial events reported by the RPC `follow` method. @@ -220,18 +310,17 @@ where startup_point: &StartupPoint, ) -> Result<(Vec>, HashSet), SubscriptionManagementError> { - let init = self.get_init_blocks_with_forks(startup_point)?; + let init = self.get_init_blocks_with_forks(startup_point.finalized_hash)?; + // The initialized event is the first one sent. let initial_blocks = init.finalized_block_descendants; + let finalized_block_hashes = init.finalized_block_hashes; - // The initialized event is the first one sent. let finalized_block_hash = startup_point.finalized_hash; - self.sub_handle.pin_block(&self.sub_id, finalized_block_hash)?; - let finalized_block_runtime = self.generate_runtime_event(finalized_block_hash, None); let initialized_event = FollowEvent::Initialized(Initialized { - finalized_block_hash, + finalized_block_hashes: finalized_block_hashes.into(), finalized_block_runtime, with_runtime: self.with_runtime, }); @@ -240,8 +329,6 @@ where finalized_block_descendants.push(initialized_event); for (child, parent) in initial_blocks.into_iter() { - self.sub_handle.pin_block(&self.sub_id, child)?; - let new_runtime = self.generate_runtime_event(child, Some(parent)); let event = FollowEvent::NewBlock(NewBlock { @@ -505,11 +592,17 @@ where mut to_ignore: HashSet, sink: SubscriptionSink, rx_stop: oneshot::Receiver<()>, - ) where + ) -> Result<(), SubscriptionManagementError> + where EventStream: Stream> + Unpin, { let mut stream_item = stream.next(); - let mut stop_event = rx_stop; + + // The stop event can be triggered by the chainHead logic when the pinned + // block guarantee cannot be hold. Or when the client is disconnected. + let connection_closed = sink.closed(); + tokio::pin!(connection_closed); + let mut stop_event = futures_util::future::select(rx_stop, connection_closed); while let Either::Left((Some(event), next_stop_event)) = futures_util::future::select(stream_item, stop_event).await @@ -534,7 +627,7 @@ where ); let msg = to_sub_message(&sink, &FollowEvent::::Stop); let _ = sink.send(msg).await; - return + return Err(err) }, }; @@ -549,7 +642,8 @@ where let msg = to_sub_message(&sink, &FollowEvent::::Stop); let _ = sink.send(msg).await; - return + // No need to propagate this error further, the client disconnected. + return Ok(()) } } @@ -557,10 +651,13 @@ where stop_event = next_stop_event; } - // If we got here either the substrate streams have closed - // or the `Stop` receiver was triggered. + // If we got here either: + // - the substrate streams have closed + // - the `Stop` receiver was triggered internally (cannot hold the pinned block guarantee) + // - the client disconnected. let msg = to_sub_message(&sink, &FollowEvent::::Stop); let _ = sink.send(msg).await; + Ok(()) } /// Generate the block events for the `chainHead_follow` method. @@ -568,7 +665,7 @@ where &mut self, sink: SubscriptionSink, sub_data: InsertedSubscriptionData, - ) { + ) -> Result<(), SubscriptionManagementError> { // Register for the new block and finalized notifications. let stream_import = self .client @@ -596,7 +693,7 @@ where ); let msg = to_sub_message(&sink, &FollowEvent::::Stop); let _ = sink.send(msg).await; - return + return Err(err) }, }; @@ -606,6 +703,6 @@ where let stream = stream::once(futures::future::ready(initial)).chain(merged); self.submit_events(&startup_point, stream.boxed(), pruned_forks, sink, sub_data.rx_stop) - .await; + .await } } diff --git a/substrate/client/rpc-spec-v2/src/chain_head/error.rs b/substrate/client/rpc-spec-v2/src/chain_head/error.rs index bf290edb29eefd4a3dbe2316973ada8447cdd933..35604db0660091b3bc8ea7053e3ccd5391f9a32a 100644 --- a/substrate/client/rpc-spec-v2/src/chain_head/error.rs +++ b/substrate/client/rpc-spec-v2/src/chain_head/error.rs @@ -23,6 +23,9 @@ use jsonrpsee::types::error::ErrorObject; /// ChainHead RPC errors. #[derive(Debug, thiserror::Error)] pub enum Error { + /// Maximum number of chainHead_follow has been reached. + #[error("Maximum number of chainHead_follow has been reached")] + ReachedLimits, /// The provided block hash is invalid. #[error("Invalid block hash")] InvalidBlock, @@ -32,6 +35,9 @@ pub enum Error { /// Wait-for-continue event not generated. #[error("Wait for continue event was not generated for the subscription")] InvalidContinue, + /// Received duplicate hashes for the `chainHead_unpin` method. + #[error("Received duplicate hashes for the `chainHead_unpin` method")] + InvalidDuplicateHashes, /// Invalid parameter provided to the RPC method. #[error("Invalid parameter: {0}")] InvalidParam(String), @@ -43,12 +49,16 @@ pub enum Error { /// Errors for `chainHead` RPC module, as defined in /// . pub mod rpc_spec_v2 { + /// Maximum number of chainHead_follow has been reached. + pub const REACHED_LIMITS: i32 = -32800; /// The provided block hash is invalid. pub const INVALID_BLOCK_ERROR: i32 = -32801; /// The follow subscription was started with `withRuntime` set to `false`. pub const INVALID_RUNTIME_CALL: i32 = -32802; /// Wait-for-continue event not generated. pub const INVALID_CONTINUE: i32 = -32803; + /// Received duplicate hashes for the `chainHead_unpin` method. + pub const INVALID_DUPLICATE_HASHES: i32 = -32804; } /// General purpose errors, as defined in @@ -65,12 +75,16 @@ impl From for ErrorObject<'static> { let msg = e.to_string(); match e { + Error::ReachedLimits => + ErrorObject::owned(rpc_spec_v2::REACHED_LIMITS, msg, None::<()>), Error::InvalidBlock => ErrorObject::owned(rpc_spec_v2::INVALID_BLOCK_ERROR, msg, None::<()>), Error::InvalidRuntimeCall(_) => ErrorObject::owned(rpc_spec_v2::INVALID_RUNTIME_CALL, msg, None::<()>), Error::InvalidContinue => ErrorObject::owned(rpc_spec_v2::INVALID_CONTINUE, msg, None::<()>), + Error::InvalidDuplicateHashes => + ErrorObject::owned(rpc_spec_v2::INVALID_DUPLICATE_HASHES, msg, None::<()>), Error::InvalidParam(_) => ErrorObject::owned(json_rpc_spec::INVALID_PARAM_ERROR, msg, None::<()>), Error::InternalError(_) => diff --git a/substrate/client/rpc-spec-v2/src/chain_head/event.rs b/substrate/client/rpc-spec-v2/src/chain_head/event.rs index 560ab87eab405968e9b7348bfd37792307b87a8f..bd9863060910542b1fdd2785d69fc9bb3472879b 100644 --- a/substrate/client/rpc-spec-v2/src/chain_head/event.rs +++ b/substrate/client/rpc-spec-v2/src/chain_head/event.rs @@ -111,8 +111,8 @@ impl From for RuntimeEvent { #[derive(Debug, Clone, PartialEq, Deserialize)] #[serde(rename_all = "camelCase")] pub struct Initialized { - /// The hash of the latest finalized block. - pub finalized_block_hash: Hash, + /// The hash of the latest finalized blocks. + pub finalized_block_hashes: Vec, /// The runtime version of the finalized block. /// /// # Note @@ -135,12 +135,12 @@ impl Serialize for Initialized { { if self.with_runtime { let mut state = serializer.serialize_struct("Initialized", 2)?; - state.serialize_field("finalizedBlockHash", &self.finalized_block_hash)?; + state.serialize_field("finalizedBlockHashes", &self.finalized_block_hashes)?; state.serialize_field("finalizedBlockRuntime", &self.finalized_block_runtime)?; state.end() } else { let mut state = serializer.serialize_struct("Initialized", 1)?; - state.serialize_field("finalizedBlockHash", &self.finalized_block_hash)?; + state.serialize_field("finalizedBlockHashes", &self.finalized_block_hashes)?; state.end() } } @@ -315,7 +315,7 @@ pub enum FollowEvent { Stop, } -/// The method respose of `chainHead_body`, `chainHead_call` and `chainHead_storage`. +/// The method response of `chainHead_body`, `chainHead_call` and `chainHead_storage`. #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] #[serde(tag = "result")] @@ -348,13 +348,13 @@ mod tests { fn follow_initialized_event_no_updates() { // Runtime flag is false. let event: FollowEvent = FollowEvent::Initialized(Initialized { - finalized_block_hash: "0x1".into(), + finalized_block_hashes: vec!["0x1".into()], finalized_block_runtime: None, with_runtime: false, }); let ser = serde_json::to_string(&event).unwrap(); - let exp = r#"{"event":"initialized","finalizedBlockHash":"0x1"}"#; + let exp = r#"{"event":"initialized","finalizedBlockHashes":["0x1"]}"#; assert_eq!(ser, exp); let event_dec: FollowEvent = serde_json::from_str(exp).unwrap(); @@ -373,7 +373,7 @@ mod tests { let runtime_event = RuntimeEvent::Valid(RuntimeVersionEvent { spec: runtime.into() }); let mut initialized = Initialized { - finalized_block_hash: "0x1".into(), + finalized_block_hashes: vec!["0x1".into()], finalized_block_runtime: Some(runtime_event), with_runtime: true, }; @@ -381,7 +381,7 @@ mod tests { let ser = serde_json::to_string(&event).unwrap(); let exp = concat!( - r#"{"event":"initialized","finalizedBlockHash":"0x1","#, + r#"{"event":"initialized","finalizedBlockHashes":["0x1"],"#, r#""finalizedBlockRuntime":{"type":"valid","spec":{"specName":"ABC","implName":"Impl","#, r#""specVersion":1,"implVersion":0,"apis":{},"transactionVersion":0}}}"#, ); diff --git a/substrate/client/rpc-spec-v2/src/chain_head/mod.rs b/substrate/client/rpc-spec-v2/src/chain_head/mod.rs index 4cbbd00f64f31f04f44ff83f9e5980e7d22e7308..c9fe19aca2b1898da25e45019e1924256d732d9a 100644 --- a/substrate/client/rpc-spec-v2/src/chain_head/mod.rs +++ b/substrate/client/rpc-spec-v2/src/chain_head/mod.rs @@ -23,7 +23,7 @@ //! Methods are prefixed by `chainHead`. #[cfg(test)] -mod test_utils; +pub mod test_utils; #[cfg(test)] mod tests; diff --git a/substrate/client/rpc-spec-v2/src/chain_head/subscription/error.rs b/substrate/client/rpc-spec-v2/src/chain_head/subscription/error.rs index 38e8fd7384fcbd222bbfc385de602a834613c07d..91ce26db22a5f1291e86a6159c33761af4dec82f 100644 --- a/substrate/client/rpc-spec-v2/src/chain_head/subscription/error.rs +++ b/substrate/client/rpc-spec-v2/src/chain_head/subscription/error.rs @@ -38,6 +38,12 @@ pub enum SubscriptionManagementError { /// The specified subscription ID is not present. #[error("Subscription is absent")] SubscriptionAbsent, + /// The unpin method was called with duplicate hashes. + #[error("Duplicate hashes")] + DuplicateHashes, + /// The distance between the leaves and the current finalized block is too large. + #[error("Distance too large")] + BlockDistanceTooLarge, /// Custom error. #[error("Subscription error {0}")] Custom(String), @@ -52,7 +58,9 @@ impl PartialEq for SubscriptionManagementError { (Self::Blockchain(_), Self::Blockchain(_)) | (Self::BlockHashAbsent, Self::BlockHashAbsent) | (Self::BlockHeaderAbsent, Self::BlockHeaderAbsent) | - (Self::SubscriptionAbsent, Self::SubscriptionAbsent) => true, + (Self::SubscriptionAbsent, Self::SubscriptionAbsent) | + (Self::DuplicateHashes, Self::DuplicateHashes) => true, + (Self::BlockDistanceTooLarge, Self::BlockDistanceTooLarge) => true, (Self::Custom(lhs), Self::Custom(rhs)) => lhs == rhs, _ => false, } diff --git a/substrate/client/rpc-spec-v2/src/chain_head/subscription/inner.rs b/substrate/client/rpc-spec-v2/src/chain_head/subscription/inner.rs index 2b250f3dc2cf2d0b52a222256b314eefc035a310..0e5ccb91d39a61a76a850119590699d563d88df8 100644 --- a/substrate/client/rpc-spec-v2/src/chain_head/subscription/inner.rs +++ b/substrate/client/rpc-spec-v2/src/chain_head/subscription/inner.rs @@ -22,7 +22,7 @@ use sc_client_api::Backend; use sc_utils::mpsc::{tracing_unbounded, TracingUnboundedReceiver, TracingUnboundedSender}; use sp_runtime::traits::Block as BlockT; use std::{ - collections::{hash_map::Entry, HashMap}, + collections::{hash_map::Entry, HashMap, HashSet}, sync::{atomic::AtomicBool, Arc}, time::{Duration, Instant}, }; @@ -560,6 +560,7 @@ pub struct SubscriptionsInner> { max_ongoing_operations: usize, /// Map the subscription ID to internal details of the subscription. subs: HashMap>, + /// Backend pinning / unpinning blocks. /// /// The `Arc` is handled one level-above, but substrate exposes the backend as Arc. @@ -623,6 +624,15 @@ impl> SubscriptionsInner { } } + /// All active subscriptions are removed. + pub fn stop_all_subscriptions(&mut self) { + let to_remove: Vec<_> = self.subs.keys().map(|sub_id| sub_id.clone()).collect(); + + for sub_id in to_remove { + self.remove_subscription(&sub_id); + } + } + /// Ensure that a new block could be pinned. /// /// If the global number of blocks has been reached this method @@ -750,11 +760,27 @@ impl> SubscriptionsInner { } } + /// Ensure the provided hashes are unique. + fn ensure_hash_uniqueness( + hashes: impl IntoIterator + Clone, + ) -> Result<(), SubscriptionManagementError> { + let mut set = HashSet::new(); + hashes.into_iter().try_for_each(|hash| { + if !set.insert(hash) { + Err(SubscriptionManagementError::DuplicateHashes) + } else { + Ok(()) + } + }) + } + pub fn unpin_blocks( &mut self, sub_id: &str, hashes: impl IntoIterator + Clone, ) -> Result<(), SubscriptionManagementError> { + Self::ensure_hash_uniqueness(hashes.clone())?; + let Some(sub) = self.subs.get_mut(sub_id) else { return Err(SubscriptionManagementError::SubscriptionAbsent) }; @@ -862,6 +888,30 @@ mod tests { (backend, client) } + fn produce_blocks( + mut client: Arc>>, + num_blocks: usize, + ) -> Vec<::Hash> { + let mut blocks = Vec::with_capacity(num_blocks); + let mut parent_hash = client.chain_info().genesis_hash; + + for i in 0..num_blocks { + let block = BlockBuilderBuilder::new(&*client) + .on_parent_block(parent_hash) + .with_parent_block_number(i as u64) + .build() + .unwrap() + .build() + .unwrap() + .block; + parent_hash = block.header.hash(); + futures::executor::block_on(client.import(BlockOrigin::Own, block.clone())).unwrap(); + blocks.push(block.header.hash()); + } + + blocks + } + #[test] fn block_state_machine_register_unpin() { let mut state = BlockStateMachine::new(); @@ -985,6 +1035,49 @@ mod tests { assert!(block_state.is_none()); } + #[test] + fn unpin_duplicate_hashes() { + let (backend, client) = init_backend(); + + let hashes = produce_blocks(client, 3); + let (hash_1, hash_2, hash_3) = (hashes[0], hashes[1], hashes[2]); + + let mut subs = + SubscriptionsInner::new(10, Duration::from_secs(10), MAX_OPERATIONS_PER_SUB, backend); + let id_1 = "abc".to_string(); + let id_2 = "abcd".to_string(); + + // Pin all blocks for the first subscription. + let _stop = subs.insert_subscription(id_1.clone(), true).unwrap(); + assert_eq!(subs.pin_block(&id_1, hash_1).unwrap(), true); + assert_eq!(subs.pin_block(&id_1, hash_2).unwrap(), true); + assert_eq!(subs.pin_block(&id_1, hash_3).unwrap(), true); + + // Pin only block 2 for the second subscription. + let _stop = subs.insert_subscription(id_2.clone(), true).unwrap(); + assert_eq!(subs.pin_block(&id_2, hash_2).unwrap(), true); + + // Check reference count. + assert_eq!(*subs.global_blocks.get(&hash_1).unwrap(), 1); + assert_eq!(*subs.global_blocks.get(&hash_2).unwrap(), 2); + assert_eq!(*subs.global_blocks.get(&hash_3).unwrap(), 1); + + // Unpin the same block twice. + let err = subs.unpin_blocks(&id_1, vec![hash_1, hash_1, hash_2, hash_2]).unwrap_err(); + assert_eq!(err, SubscriptionManagementError::DuplicateHashes); + + // Check reference count must be unaltered. + assert_eq!(*subs.global_blocks.get(&hash_1).unwrap(), 1); + assert_eq!(*subs.global_blocks.get(&hash_2).unwrap(), 2); + assert_eq!(*subs.global_blocks.get(&hash_3).unwrap(), 1); + + // Unpin the blocks correctly. + subs.unpin_blocks(&id_1, vec![hash_1, hash_2]).unwrap(); + assert_eq!(subs.global_blocks.get(&hash_1), None); + assert_eq!(*subs.global_blocks.get(&hash_2).unwrap(), 1); + assert_eq!(*subs.global_blocks.get(&hash_3).unwrap(), 1); + } + #[test] fn subscription_lock_block() { let builder = TestClientBuilder::new(); @@ -1016,18 +1109,10 @@ mod tests { #[test] fn subscription_check_block() { - let (backend, mut client) = init_backend(); - - let block = BlockBuilderBuilder::new(&*client) - .on_parent_block(client.chain_info().genesis_hash) - .with_parent_block_number(0) - .build() - .unwrap() - .build() - .unwrap() - .block; - let hash = block.hash(); - futures::executor::block_on(client.import(BlockOrigin::Own, block.clone())).unwrap(); + let (backend, client) = init_backend(); + + let hashes = produce_blocks(client, 1); + let hash = hashes[0]; let mut subs = SubscriptionsInner::new(10, Duration::from_secs(10), MAX_OPERATIONS_PER_SUB, backend); @@ -1054,17 +1139,10 @@ mod tests { #[test] fn subscription_ref_count() { - let (backend, mut client) = init_backend(); - let block = BlockBuilderBuilder::new(&*client) - .on_parent_block(client.chain_info().genesis_hash) - .with_parent_block_number(0) - .build() - .unwrap() - .build() - .unwrap() - .block; - let hash = block.header.hash(); - futures::executor::block_on(client.import(BlockOrigin::Own, block.clone())).unwrap(); + let (backend, client) = init_backend(); + + let hashes = produce_blocks(client, 1); + let hash = hashes[0]; let mut subs = SubscriptionsInner::new(10, Duration::from_secs(10), MAX_OPERATIONS_PER_SUB, backend); @@ -1104,37 +1182,10 @@ mod tests { #[test] fn subscription_remove_subscription() { - let (backend, mut client) = init_backend(); - let block = BlockBuilderBuilder::new(&*client) - .on_parent_block(client.chain_info().genesis_hash) - .with_parent_block_number(0) - .build() - .unwrap() - .build() - .unwrap() - .block; - let hash_1 = block.header.hash(); - futures::executor::block_on(client.import(BlockOrigin::Own, block.clone())).unwrap(); - let block = BlockBuilderBuilder::new(&*client) - .on_parent_block(hash_1) - .with_parent_block_number(1) - .build() - .unwrap() - .build() - .unwrap() - .block; - let hash_2 = block.header.hash(); - futures::executor::block_on(client.import(BlockOrigin::Own, block.clone())).unwrap(); - let block = BlockBuilderBuilder::new(&*client) - .on_parent_block(hash_2) - .with_parent_block_number(2) - .build() - .unwrap() - .build() - .unwrap() - .block; - let hash_3 = block.header.hash(); - futures::executor::block_on(client.import(BlockOrigin::Own, block.clone())).unwrap(); + let (backend, client) = init_backend(); + + let hashes = produce_blocks(client, 3); + let (hash_1, hash_2, hash_3) = (hashes[0], hashes[1], hashes[2]); let mut subs = SubscriptionsInner::new(10, Duration::from_secs(10), MAX_OPERATIONS_PER_SUB, backend); @@ -1170,37 +1221,10 @@ mod tests { #[test] fn subscription_check_limits() { - let (backend, mut client) = init_backend(); - let block = BlockBuilderBuilder::new(&*client) - .on_parent_block(client.chain_info().genesis_hash) - .with_parent_block_number(0) - .build() - .unwrap() - .build() - .unwrap() - .block; - let hash_1 = block.header.hash(); - futures::executor::block_on(client.import(BlockOrigin::Own, block.clone())).unwrap(); - let block = BlockBuilderBuilder::new(&*client) - .on_parent_block(hash_1) - .with_parent_block_number(1) - .build() - .unwrap() - .build() - .unwrap() - .block; - let hash_2 = block.header.hash(); - futures::executor::block_on(client.import(BlockOrigin::Own, block.clone())).unwrap(); - let block = BlockBuilderBuilder::new(&*client) - .on_parent_block(hash_2) - .with_parent_block_number(2) - .build() - .unwrap() - .build() - .unwrap() - .block; - let hash_3 = block.header.hash(); - futures::executor::block_on(client.import(BlockOrigin::Own, block.clone())).unwrap(); + let (backend, client) = init_backend(); + + let hashes = produce_blocks(client, 3); + let (hash_1, hash_2, hash_3) = (hashes[0], hashes[1], hashes[2]); // Maximum number of pinned blocks is 2. let mut subs = @@ -1242,37 +1266,10 @@ mod tests { #[test] fn subscription_check_limits_with_duration() { - let (backend, mut client) = init_backend(); - let block = BlockBuilderBuilder::new(&*client) - .on_parent_block(client.chain_info().genesis_hash) - .with_parent_block_number(0) - .build() - .unwrap() - .build() - .unwrap() - .block; - let hash_1 = block.hash(); - futures::executor::block_on(client.import(BlockOrigin::Own, block.clone())).unwrap(); - let block = BlockBuilderBuilder::new(&*client) - .on_parent_block(hash_1) - .with_parent_block_number(1) - .build() - .unwrap() - .build() - .unwrap() - .block; - let hash_2 = block.header.hash(); - futures::executor::block_on(client.import(BlockOrigin::Own, block.clone())).unwrap(); - let block = BlockBuilderBuilder::new(&*client) - .on_parent_block(hash_2) - .with_parent_block_number(2) - .build() - .unwrap() - .build() - .unwrap() - .block; - let hash_3 = block.header.hash(); - futures::executor::block_on(client.import(BlockOrigin::Own, block.clone())).unwrap(); + let (backend, client) = init_backend(); + + let hashes = produce_blocks(client, 3); + let (hash_1, hash_2, hash_3) = (hashes[0], hashes[1], hashes[2]); // Maximum number of pinned blocks is 2 and maximum pin duration is 5 second. let mut subs = @@ -1369,4 +1366,90 @@ mod tests { let permit_three = ops.reserve_at_most(1).unwrap(); assert_eq!(permit_three.num_ops, 1); } + + #[test] + fn stop_all_subscriptions() { + let (backend, client) = init_backend(); + + let hashes = produce_blocks(client, 3); + let (hash_1, hash_2, hash_3) = (hashes[0], hashes[1], hashes[2]); + + let mut subs = + SubscriptionsInner::new(10, Duration::from_secs(10), MAX_OPERATIONS_PER_SUB, backend); + let id_1 = "abc".to_string(); + let id_2 = "abcd".to_string(); + + // Pin all blocks for the first subscription. + let _stop = subs.insert_subscription(id_1.clone(), true).unwrap(); + assert_eq!(subs.pin_block(&id_1, hash_1).unwrap(), true); + assert_eq!(subs.pin_block(&id_1, hash_2).unwrap(), true); + assert_eq!(subs.pin_block(&id_1, hash_3).unwrap(), true); + + // Pin only block 2 for the second subscription. + let _stop = subs.insert_subscription(id_2.clone(), true).unwrap(); + assert_eq!(subs.pin_block(&id_2, hash_2).unwrap(), true); + + // Check reference count. + assert_eq!(*subs.global_blocks.get(&hash_1).unwrap(), 1); + assert_eq!(*subs.global_blocks.get(&hash_2).unwrap(), 2); + assert_eq!(*subs.global_blocks.get(&hash_3).unwrap(), 1); + assert_eq!(subs.global_blocks.len(), 3); + + // Stop all active subscriptions. + subs.stop_all_subscriptions(); + assert!(subs.global_blocks.is_empty()); + } + + #[test] + fn reserved_subscription_cleans_resources() { + let builder = TestClientBuilder::new(); + let backend = builder.backend(); + let subs = Arc::new(parking_lot::RwLock::new(SubscriptionsInner::new( + 10, + Duration::from_secs(10), + MAX_OPERATIONS_PER_SUB, + backend, + ))); + + // Maximum 2 subscriptions per connection. + let rpc_connections = crate::common::connections::RpcConnections::new(2); + + let subscription_management = + crate::chain_head::subscription::SubscriptionManagement::_from_inner( + subs.clone(), + rpc_connections.clone(), + ); + + let reserved_sub_first = subscription_management.reserve_subscription(1).unwrap(); + let mut reserved_sub_second = subscription_management.reserve_subscription(1).unwrap(); + // Subscriptions reserved but not yet populated. + assert_eq!(subs.read().subs.len(), 0); + + // Cannot reserve anymore. + assert!(subscription_management.reserve_subscription(1).is_none()); + // Drop the first subscription. + drop(reserved_sub_first); + // Space is freed-up for the rpc connections. + let mut reserved_sub_first = subscription_management.reserve_subscription(1).unwrap(); + + // Insert subscriptions. + let _sub_data_first = + reserved_sub_first.insert_subscription("sub1".to_string(), true).unwrap(); + let _sub_data_second = + reserved_sub_second.insert_subscription("sub2".to_string(), true).unwrap(); + // Check we have 2 subscriptions under management. + assert_eq!(subs.read().subs.len(), 2); + + // Drop first reserved subscription. + drop(reserved_sub_first); + // Check that the subscription is removed. + assert_eq!(subs.read().subs.len(), 1); + // Space is freed-up for the rpc connections. + let reserved_sub_first = subscription_management.reserve_subscription(1).unwrap(); + + // Drop all subscriptions. + drop(reserved_sub_first); + drop(reserved_sub_second); + assert_eq!(subs.read().subs.len(), 0); + } } diff --git a/substrate/client/rpc-spec-v2/src/chain_head/subscription/mod.rs b/substrate/client/rpc-spec-v2/src/chain_head/subscription/mod.rs index c830e662da2e5c3499f86ae1ddc40bd3b6f4e40a..f266c9d8b34fc774e04a5825740204913851db82 100644 --- a/substrate/client/rpc-spec-v2/src/chain_head/subscription/mod.rs +++ b/substrate/client/rpc-spec-v2/src/chain_head/subscription/mod.rs @@ -16,6 +16,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . +use jsonrpsee::ConnectionId; use parking_lot::RwLock; use sc_client_api::Backend; use sp_runtime::traits::Block as BlockT; @@ -24,6 +25,11 @@ use std::{sync::Arc, time::Duration}; mod error; mod inner; +use crate::{ + chain_head::chain_head::LOG_TARGET, + common::connections::{RegisteredConnection, ReservedConnection, RpcConnections}, +}; + use self::inner::SubscriptionsInner; pub use self::inner::OperationState; @@ -34,7 +40,22 @@ pub use inner::{BlockGuard, InsertedSubscriptionData}; pub struct SubscriptionManagement> { /// Manage subscription by mapping the subscription ID /// to a set of block hashes. - inner: RwLock>, + inner: Arc>>, + + /// Ensures that chainHead methods can be called from a single connection context. + /// + /// For example, `chainHead_storage` cannot be called with a subscription ID that + /// was obtained from a different connection. + rpc_connections: RpcConnections, +} + +impl> Clone for SubscriptionManagement { + fn clone(&self) -> Self { + SubscriptionManagement { + inner: self.inner.clone(), + rpc_connections: self.rpc_connections.clone(), + } + } } impl> SubscriptionManagement { @@ -43,30 +64,55 @@ impl> SubscriptionManagement { global_max_pinned_blocks: usize, local_max_pin_duration: Duration, max_ongoing_operations: usize, + max_follow_subscriptions_per_connection: usize, backend: Arc, ) -> Self { SubscriptionManagement { - inner: RwLock::new(SubscriptionsInner::new( + inner: Arc::new(RwLock::new(SubscriptionsInner::new( global_max_pinned_blocks, local_max_pin_duration, max_ongoing_operations, backend, - )), + ))), + rpc_connections: RpcConnections::new(max_follow_subscriptions_per_connection), } } - /// Insert a new subscription ID. + /// Create a new instance from the inner state. /// - /// If the subscription was not previously inserted, returns the receiver that is - /// triggered upon the "Stop" event. Otherwise, if the subscription ID was already - /// inserted returns none. - pub fn insert_subscription( + /// # Note + /// + /// Used for testing. + #[cfg(test)] + pub(crate) fn _from_inner( + inner: Arc>>, + rpc_connections: RpcConnections, + ) -> Self { + SubscriptionManagement { inner, rpc_connections } + } + + /// Reserve space for a subscriptions. + /// + /// Fails if the connection ID is has reached the maximum number of active subscriptions. + pub fn reserve_subscription( &self, - sub_id: String, - runtime_updates: bool, - ) -> Option> { - let mut inner = self.inner.write(); - inner.insert_subscription(sub_id, runtime_updates) + connection_id: ConnectionId, + ) -> Option> { + let reserved_token = self.rpc_connections.reserve_space(connection_id)?; + + Some(ReservedSubscription { + state: ConnectionState::Reserved(reserved_token), + inner: self.inner.clone(), + }) + } + + /// Check if the given connection contains the given subscription. + pub fn contains_subscription( + &self, + connection_id: ConnectionId, + subscription_id: &str, + ) -> bool { + self.rpc_connections.contains_identifier(connection_id, subscription_id) } /// Remove the subscription ID with associated pinned blocks. @@ -136,3 +182,72 @@ impl> SubscriptionManagement { inner.get_operation(sub_id, operation_id) } } + +/// The state of the connection. +/// +/// The state starts in a [`ConnectionState::Reserved`] state and then transitions to +/// [`ConnectionState::Registered`] when the subscription is inserted. +enum ConnectionState { + Reserved(ReservedConnection), + Registered { _unregister_on_drop: RegisteredConnection, sub_id: String }, + Empty, +} + +/// RAII wrapper that removes the subscription from internal mappings and +/// gives back the reserved space for the connection. +pub struct ReservedSubscription> { + state: ConnectionState, + inner: Arc>>, +} + +impl> ReservedSubscription { + /// Insert a new subscription ID. + /// + /// If the subscription was not previously inserted, returns the receiver that is + /// triggered upon the "Stop" event. Otherwise, if the subscription ID was already + /// inserted returns none. + /// + /// # Note + /// + /// This method should be called only once. + pub fn insert_subscription( + &mut self, + sub_id: String, + runtime_updates: bool, + ) -> Option> { + match std::mem::replace(&mut self.state, ConnectionState::Empty) { + ConnectionState::Reserved(reserved) => { + let registered_token = reserved.register(sub_id.clone())?; + self.state = ConnectionState::Registered { + _unregister_on_drop: registered_token, + sub_id: sub_id.clone(), + }; + + let mut inner = self.inner.write(); + inner.insert_subscription(sub_id, runtime_updates) + }, + // Cannot insert multiple subscriptions into one single reserved space. + ConnectionState::Registered { .. } | ConnectionState::Empty => { + log::error!(target: LOG_TARGET, "Called insert_subscription on a connection that is not reserved"); + None + }, + } + } + + /// Stop all active subscriptions. + /// + /// For all active subscriptions, the internal data is discarded, blocks are unpinned and the + /// `Stop` event will be generated. + pub fn stop_all_subscriptions(&self) { + let mut inner = self.inner.write(); + inner.stop_all_subscriptions() + } +} + +impl> Drop for ReservedSubscription { + fn drop(&mut self) { + if let ConnectionState::Registered { sub_id, .. } = &self.state { + self.inner.write().remove_subscription(sub_id); + } + } +} diff --git a/substrate/client/rpc-spec-v2/src/chain_head/test_utils.rs b/substrate/client/rpc-spec-v2/src/chain_head/test_utils.rs index d63a98a5cb0d93b3633864bd3405ad38c2b6e799..ab5be1f24e5d85b1be51a0ad1b3d42c3dbcbf730 100644 --- a/substrate/client/rpc-spec-v2/src/chain_head/test_utils.rs +++ b/substrate/client/rpc-spec-v2/src/chain_head/test_utils.rs @@ -34,12 +34,13 @@ use sp_runtime::{ }; use sp_version::RuntimeVersion; use std::sync::Arc; -use substrate_test_runtime::{Block, Hash, Header}; +use substrate_test_runtime::{Block, Hash, Header, H256}; pub struct ChainHeadMockClient { client: Arc, import_sinks: Mutex>>>, finality_sinks: Mutex>>>, + best_block: Mutex>, } impl ChainHeadMockClient { @@ -48,6 +49,7 @@ impl ChainHeadMockClient { client, import_sinks: Default::default(), finality_sinks: Default::default(), + best_block: Default::default(), } } @@ -63,7 +65,7 @@ impl ChainHeadMockClient { BlockImportNotification::new(header.hash(), BlockOrigin::Own, header, true, None, sink); for sink in self.import_sinks.lock().iter_mut() { - sink.unbounded_send(notification.clone()).unwrap(); + let _ = sink.unbounded_send(notification.clone()); } } @@ -83,9 +85,14 @@ impl ChainHeadMockClient { let notification = FinalityNotification::from_summary(summary, sink); for sink in self.finality_sinks.lock().iter_mut() { - sink.unbounded_send(notification.clone()).unwrap(); + let _ = sink.unbounded_send(notification.clone()); } } + + /// Set the best block hash and number that is reported by the `info` method. + pub fn set_best_block(&self, hash: H256, number: u64) { + *self.best_block.lock() = Some((hash, number)); + } } // ChainHead calls `import_notification_stream` and `finality_notification_stream` in order to @@ -309,8 +316,10 @@ impl + Send + Sync> HeaderMetadata< } } -impl + Send + Sync> HeaderBackend +impl, Client: HeaderBackend + Send + Sync> HeaderBackend for ChainHeadMockClient +where + <::Header as HeaderT>::Number: From, { fn header( &self, @@ -320,7 +329,14 @@ impl + Send + Sync> HeaderBackend Info { - self.client.info() + let mut info = self.client.info(); + + if let Some((block_hash, block_num)) = self.best_block.lock().take() { + info.best_hash = block_hash; + info.best_number = block_num.into(); + } + + info } fn status(&self, hash: Block::Hash) -> sc_client_api::blockchain::Result { diff --git a/substrate/client/rpc-spec-v2/src/chain_head/tests.rs b/substrate/client/rpc-spec-v2/src/chain_head/tests.rs index 955a361e3eadb455891a68e8ec7e74e4a95c84e0..c2bff7c50d5ebd951596f15e9e7423a77b889c0b 100644 --- a/substrate/client/rpc-spec-v2/src/chain_head/tests.rs +++ b/substrate/client/rpc-spec-v2/src/chain_head/tests.rs @@ -17,7 +17,7 @@ // along with this program. If not, see . use crate::{ - chain_head::{event::MethodResponse, test_utils::ChainHeadMockClient}, + chain_head::{api::ChainHeadApiClient, event::MethodResponse, test_utils::ChainHeadMockClient}, common::events::{StorageQuery, StorageQueryType, StorageResultType}, hex_string, }; @@ -27,9 +27,12 @@ use assert_matches::assert_matches; use codec::{Decode, Encode}; use futures::Future; use jsonrpsee::{ - core::{error::Error, server::Subscription as RpcSubscription}, - rpc_params, RpcModule, + core::{ + client::Subscription as RpcClientSubscription, server::Subscription as RpcSubscription, + }, + rpc_params, MethodsError as Error, RpcModule, }; + use sc_block_builder::BlockBuilderBuilder; use sc_client_api::ChildInfo; use sc_service::client::new_in_mem; @@ -60,6 +63,9 @@ const MAX_PINNED_BLOCKS: usize = 32; const MAX_PINNED_SECS: u64 = 60; const MAX_OPERATIONS: usize = 16; const MAX_PAGINATION_LIMIT: usize = 5; +const MAX_LAGGING_DISTANCE: usize = 128; +const MAX_FOLLOW_SUBSCRIPTIONS_PER_CONNECTION: usize = 4; + const INVALID_HASH: [u8; 32] = [1; 32]; const KEY: &[u8] = b":mock"; const VALUE: &[u8] = b"hello world"; @@ -67,6 +73,36 @@ const CHILD_STORAGE_KEY: &[u8] = b"child"; const CHILD_VALUE: &[u8] = b"child value"; const DOES_NOT_PRODUCE_EVENTS_SECONDS: u64 = 10; +/// Start an RPC server with the chainHead module. +pub async fn run_server() -> std::net::SocketAddr { + let builder = TestClientBuilder::new(); + let backend = builder.backend(); + let client = Arc::new(builder.build()); + + let api = ChainHead::new( + client, + backend, + Arc::new(TaskExecutor::default()), + ChainHeadConfig { + global_max_pinned_blocks: MAX_PINNED_BLOCKS, + subscription_max_pinned_duration: Duration::from_secs(MAX_PINNED_SECS), + subscription_max_ongoing_operations: MAX_OPERATIONS, + operation_max_storage_items: MAX_PAGINATION_LIMIT, + max_follow_subscriptions_per_connection: 1, + max_lagging_distance: MAX_LAGGING_DISTANCE, + }, + ) + .into_rpc(); + + let server = jsonrpsee::server::ServerBuilder::default().build("127.0.0.1:0").await.unwrap(); + + let addr = server.local_addr().unwrap(); + let handle = server.start(api); + + tokio::spawn(handle.stopped()); + addr +} + async fn get_next_event(sub: &mut RpcSubscription) -> T { let (event, _sub_id) = tokio::time::timeout(std::time::Duration::from_secs(60), sub.next()) .await @@ -114,6 +150,8 @@ async fn setup_api() -> ( subscription_max_pinned_duration: Duration::from_secs(MAX_PINNED_SECS), subscription_max_ongoing_operations: MAX_OPERATIONS, operation_max_storage_items: MAX_PAGINATION_LIMIT, + max_lagging_distance: MAX_LAGGING_DISTANCE, + max_follow_subscriptions_per_connection: MAX_FOLLOW_SUBSCRIPTIONS_PER_CONNECTION, }, ) .into_rpc(); @@ -164,6 +202,9 @@ async fn follow_subscription_produces_blocks() { subscription_max_pinned_duration: Duration::from_secs(MAX_PINNED_SECS), subscription_max_ongoing_operations: MAX_OPERATIONS, operation_max_storage_items: MAX_PAGINATION_LIMIT, + + max_lagging_distance: MAX_LAGGING_DISTANCE, + max_follow_subscriptions_per_connection: MAX_FOLLOW_SUBSCRIPTIONS_PER_CONNECTION, }, ) .into_rpc(); @@ -174,7 +215,7 @@ async fn follow_subscription_produces_blocks() { // Initialized must always be reported first. let event: FollowEvent = get_next_event(&mut sub).await; let expected = FollowEvent::Initialized(Initialized { - finalized_block_hash: format!("{:?}", finalized_hash), + finalized_block_hashes: vec![format!("{:?}", finalized_hash)], finalized_block_runtime: None, with_runtime: false, }); @@ -232,6 +273,9 @@ async fn follow_with_runtime() { subscription_max_pinned_duration: Duration::from_secs(MAX_PINNED_SECS), subscription_max_ongoing_operations: MAX_OPERATIONS, operation_max_storage_items: MAX_PAGINATION_LIMIT, + + max_lagging_distance: MAX_LAGGING_DISTANCE, + max_follow_subscriptions_per_connection: MAX_FOLLOW_SUBSCRIPTIONS_PER_CONNECTION, }, ) .into_rpc(); @@ -243,12 +287,12 @@ async fn follow_with_runtime() { let event: FollowEvent = get_next_event(&mut sub).await; // it is basically json-encoded substrate_test_runtime_client::runtime::VERSION - let runtime_str = "{\"specName\":\"test\",\"implName\":\"parity-test\",\"authoringVersion\":0,\ - \"specVersion\":2,\"implVersion\":2,\"apis\":[[\"0xdf6acb689907609b\",4],\ + let runtime_str = "{\"specName\":\"test\",\"implName\":\"parity-test\",\"authoringVersion\":1,\ + \"specVersion\":2,\"implVersion\":2,\"apis\":[[\"0xdf6acb689907609b\",5],\ [\"0x37e397fc7c91f5e4\",2],[\"0xd2bc9897eed08f15\",3],[\"0x40fe3ad401f8959a\",6],\ [\"0xbc9d89904f5b923f\",1],[\"0xc6e9a76309f39b09\",2],[\"0xdd718d5cc53262d4\",1],\ [\"0xcbca25e39f142387\",2],[\"0xf78b278be53f454c\",2],[\"0xab3c0572291feb8b\",1],\ - [\"0xed99c5acb25eedf5\",3],[\"0xfbc577b9d747efd6\",1]],\"transactionVersion\":1,\"stateVersion\":0}"; + [\"0xed99c5acb25eedf5\",3],[\"0xfbc577b9d747efd6\",1]],\"transactionVersion\":1,\"stateVersion\":1}"; let runtime: RuntimeVersion = serde_json::from_str(runtime_str).unwrap(); @@ -256,7 +300,7 @@ async fn follow_with_runtime() { Some(RuntimeEvent::Valid(RuntimeVersionEvent { spec: runtime.clone().into() })); // Runtime must always be reported with the first event. let expected = FollowEvent::Initialized(Initialized { - finalized_block_hash: format!("{:?}", finalized_hash), + finalized_block_hashes: vec![format!("{:?}", finalized_hash)], finalized_block_runtime, with_runtime: false, }); @@ -359,7 +403,7 @@ async fn get_header() { .await .unwrap_err(); assert_matches!(err, - Error::Call(err) if err.code() == super::error::rpc_spec_v2::INVALID_BLOCK_ERROR && err.message() == "Invalid block hash" + Error::JsonRpc(ref err) if err.code() == super::error::rpc_spec_v2::INVALID_BLOCK_ERROR && err.message() == "Invalid block hash" ); // Obtain the valid header. @@ -388,7 +432,7 @@ async fn get_body() { .await .unwrap_err(); assert_matches!(err, - Error::Call(err) if err.code() == super::error::rpc_spec_v2::INVALID_BLOCK_ERROR && err.message() == "Invalid block hash" + Error::JsonRpc(ref err) if err.code() == super::error::rpc_spec_v2::INVALID_BLOCK_ERROR && err.message() == "Invalid block hash" ); // Valid call. @@ -473,7 +517,7 @@ async fn call_runtime() { .await .unwrap_err(); assert_matches!(err, - Error::Call(err) if err.code() == super::error::rpc_spec_v2::INVALID_BLOCK_ERROR && err.message() == "Invalid block hash" + Error::JsonRpc(ref err) if err.code() == super::error::rpc_spec_v2::INVALID_BLOCK_ERROR && err.message() == "Invalid block hash" ); // Pass an invalid parameters that cannot be decode. @@ -486,7 +530,7 @@ async fn call_runtime() { .await .unwrap_err(); assert_matches!(err, - Error::Call(err) if err.code() == super::error::json_rpc_spec::INVALID_PARAM_ERROR && err.message().contains("Invalid parameter") + Error::JsonRpc(err) if err.code() == super::error::json_rpc_spec::INVALID_PARAM_ERROR && err.message().contains("Invalid parameter") ); // Valid call. @@ -544,6 +588,9 @@ async fn call_runtime_without_flag() { subscription_max_pinned_duration: Duration::from_secs(MAX_PINNED_SECS), subscription_max_ongoing_operations: MAX_OPERATIONS, operation_max_storage_items: MAX_PAGINATION_LIMIT, + + max_lagging_distance: MAX_LAGGING_DISTANCE, + max_follow_subscriptions_per_connection: MAX_FOLLOW_SUBSCRIPTIONS_PER_CONNECTION, }, ) .into_rpc(); @@ -589,7 +636,7 @@ async fn call_runtime_without_flag() { .unwrap_err(); assert_matches!(err, - Error::Call(err) if err.code() == super::error::rpc_spec_v2::INVALID_RUNTIME_CALL && err.message().contains("subscription was started with `withRuntime` set to `false`") + Error::JsonRpc(ref err) if err.code() == super::error::rpc_spec_v2::INVALID_RUNTIME_CALL && err.message().contains("subscription was started with `withRuntime` set to `false`") ); } @@ -627,7 +674,7 @@ async fn get_storage_hash() { .await .unwrap_err(); assert_matches!(err, - Error::Call(err) if err.code() == super::error::rpc_spec_v2::INVALID_BLOCK_ERROR && err.message() == "Invalid block hash" + Error::JsonRpc(ref err) if err.code() == super::error::rpc_spec_v2::INVALID_BLOCK_ERROR && err.message() == "Invalid block hash" ); // Valid call without storage at the key. @@ -895,7 +942,7 @@ async fn get_storage_value() { .await .unwrap_err(); assert_matches!(err, - Error::Call(err) if err.code() == super::error::rpc_spec_v2::INVALID_BLOCK_ERROR && err.message() == "Invalid block hash" + Error::JsonRpc(ref err) if err.code() == super::error::rpc_spec_v2::INVALID_BLOCK_ERROR && err.message() == "Invalid block hash" ); // Valid call without storage at the key. @@ -1202,6 +1249,9 @@ async fn separate_operation_ids_for_subscriptions() { subscription_max_pinned_duration: Duration::from_secs(MAX_PINNED_SECS), subscription_max_ongoing_operations: MAX_OPERATIONS, operation_max_storage_items: MAX_PAGINATION_LIMIT, + + max_lagging_distance: MAX_LAGGING_DISTANCE, + max_follow_subscriptions_per_connection: MAX_FOLLOW_SUBSCRIPTIONS_PER_CONNECTION, }, ) .into_rpc(); @@ -1290,6 +1340,9 @@ async fn follow_generates_initial_blocks() { subscription_max_pinned_duration: Duration::from_secs(MAX_PINNED_SECS), subscription_max_ongoing_operations: MAX_OPERATIONS, operation_max_storage_items: MAX_PAGINATION_LIMIT, + + max_lagging_distance: MAX_LAGGING_DISTANCE, + max_follow_subscriptions_per_connection: MAX_FOLLOW_SUBSCRIPTIONS_PER_CONNECTION, }, ) .into_rpc(); @@ -1345,7 +1398,7 @@ async fn follow_generates_initial_blocks() { // Initialized must always be reported first. let event: FollowEvent = get_next_event(&mut sub).await; let expected = FollowEvent::Initialized(Initialized { - finalized_block_hash: format!("{:?}", finalized_hash), + finalized_block_hashes: vec![format!("{:?}", finalized_hash)], finalized_block_runtime: None, with_runtime: false, }); @@ -1445,6 +1498,9 @@ async fn follow_exceeding_pinned_blocks() { subscription_max_pinned_duration: Duration::from_secs(MAX_PINNED_SECS), subscription_max_ongoing_operations: MAX_OPERATIONS, operation_max_storage_items: MAX_PAGINATION_LIMIT, + + max_lagging_distance: MAX_LAGGING_DISTANCE, + max_follow_subscriptions_per_connection: MAX_FOLLOW_SUBSCRIPTIONS_PER_CONNECTION, }, ) .into_rpc(); @@ -1521,6 +1577,9 @@ async fn follow_with_unpin() { subscription_max_pinned_duration: Duration::from_secs(MAX_PINNED_SECS), subscription_max_ongoing_operations: MAX_OPERATIONS, operation_max_storage_items: MAX_PAGINATION_LIMIT, + + max_lagging_distance: MAX_LAGGING_DISTANCE, + max_follow_subscriptions_per_connection: MAX_FOLLOW_SUBSCRIPTIONS_PER_CONNECTION, }, ) .into_rpc(); @@ -1571,7 +1630,7 @@ async fn follow_with_unpin() { .await .unwrap_err(); assert_matches!(err, - Error::Call(err) if err.code() == super::error::rpc_spec_v2::INVALID_BLOCK_ERROR && err.message() == "Invalid block hash" + Error::JsonRpc(ref err) if err.code() == super::error::rpc_spec_v2::INVALID_BLOCK_ERROR && err.message() == "Invalid block hash" ); // To not exceed the number of pinned blocks, we need to unpin before the next import. @@ -1617,6 +1676,111 @@ async fn follow_with_unpin() { assert!(sub.next::>().await.is_none()); } +#[tokio::test] +async fn unpin_duplicate_hashes() { + let builder = TestClientBuilder::new(); + let backend = builder.backend(); + let mut client = Arc::new(builder.build()); + + let api = ChainHead::new( + client.clone(), + backend, + Arc::new(TaskExecutor::default()), + ChainHeadConfig { + global_max_pinned_blocks: 3, + subscription_max_pinned_duration: Duration::from_secs(MAX_PINNED_SECS), + subscription_max_ongoing_operations: MAX_OPERATIONS, + operation_max_storage_items: MAX_PAGINATION_LIMIT, + + max_lagging_distance: MAX_LAGGING_DISTANCE, + max_follow_subscriptions_per_connection: MAX_FOLLOW_SUBSCRIPTIONS_PER_CONNECTION, + }, + ) + .into_rpc(); + + let mut sub = api.subscribe_unbounded("chainHead_unstable_follow", [false]).await.unwrap(); + let sub_id = sub.subscription_id(); + let sub_id = serde_json::to_string(&sub_id).unwrap(); + + let block = BlockBuilderBuilder::new(&*client) + .on_parent_block(client.chain_info().genesis_hash) + .with_parent_block_number(0) + .build() + .unwrap() + .build() + .unwrap() + .block; + let block_hash = format!("{:?}", block.header.hash()); + client.import(BlockOrigin::Own, block.clone()).await.unwrap(); + + // Ensure the imported block is propagated and pinned for this subscription. + assert_matches!( + get_next_event::>(&mut sub).await, + FollowEvent::Initialized(_) + ); + assert_matches!( + get_next_event::>(&mut sub).await, + FollowEvent::NewBlock(_) + ); + assert_matches!( + get_next_event::>(&mut sub).await, + FollowEvent::BestBlockChanged(_) + ); + + // Try to unpin duplicate hashes. + let err = api + .call::<_, serde_json::Value>( + "chainHead_unstable_unpin", + rpc_params![&sub_id, vec![&block_hash, &block_hash]], + ) + .await + .unwrap_err(); + assert_matches!(err, + Error::JsonRpc(err) if err.code() == super::error::rpc_spec_v2::INVALID_DUPLICATE_HASHES && err.message() == "Received duplicate hashes for the `chainHead_unpin` method" + ); + + // Block tree: + // finalized_block -> block -> block2 + let block2 = BlockBuilderBuilder::new(&*client) + .on_parent_block(block.hash()) + .with_parent_block_number(1) + .build() + .unwrap() + .build() + .unwrap() + .block; + let block_hash_2 = format!("{:?}", block2.header.hash()); + client.import(BlockOrigin::Own, block2.clone()).await.unwrap(); + + assert_matches!( + get_next_event::>(&mut sub).await, + FollowEvent::NewBlock(_) + ); + + assert_matches!( + get_next_event::>(&mut sub).await, + FollowEvent::BestBlockChanged(_) + ); + + // Try to unpin duplicate hashes. + let err = api + .call::<_, serde_json::Value>( + "chainHead_unstable_unpin", + rpc_params![&sub_id, vec![&block_hash, &block_hash_2, &block_hash]], + ) + .await + .unwrap_err(); + assert_matches!(err, + Error::JsonRpc(err) if err.code() == super::error::rpc_spec_v2::INVALID_DUPLICATE_HASHES && err.message() == "Received duplicate hashes for the `chainHead_unpin` method" + ); + + // Can unpin blocks. + let _res: () = api + .call("chainHead_unstable_unpin", rpc_params![&sub_id, vec![&block_hash, &block_hash_2]]) + .await + .unwrap(); +} + #[tokio::test] async fn follow_with_multiple_unpin_hashes() { let builder = TestClientBuilder::new(); @@ -1632,6 +1796,9 @@ async fn follow_with_multiple_unpin_hashes() { subscription_max_pinned_duration: Duration::from_secs(MAX_PINNED_SECS), subscription_max_ongoing_operations: MAX_OPERATIONS, operation_max_storage_items: MAX_PAGINATION_LIMIT, + + max_lagging_distance: MAX_LAGGING_DISTANCE, + max_follow_subscriptions_per_connection: MAX_FOLLOW_SUBSCRIPTIONS_PER_CONNECTION, }, ) .into_rpc(); @@ -1720,7 +1887,7 @@ async fn follow_with_multiple_unpin_hashes() { .await .unwrap_err(); assert_matches!(err, - Error::Call(err) if err.code() == super::error::rpc_spec_v2::INVALID_BLOCK_ERROR && err.message() == "Invalid block hash" + Error::JsonRpc(ref err) if err.code() == super::error::rpc_spec_v2::INVALID_BLOCK_ERROR && err.message() == "Invalid block hash" ); let _res: () = api @@ -1737,7 +1904,7 @@ async fn follow_with_multiple_unpin_hashes() { .await .unwrap_err(); assert_matches!(err, - Error::Call(err) if err.code() == super::error::rpc_spec_v2::INVALID_BLOCK_ERROR && err.message() == "Invalid block hash" + Error::JsonRpc(ref err) if err.code() == super::error::rpc_spec_v2::INVALID_BLOCK_ERROR && err.message() == "Invalid block hash" ); // Unpin multiple blocks. @@ -1755,7 +1922,7 @@ async fn follow_with_multiple_unpin_hashes() { .await .unwrap_err(); assert_matches!(err, - Error::Call(err) if err.code() == super::error::rpc_spec_v2::INVALID_BLOCK_ERROR && err.message() == "Invalid block hash" + Error::JsonRpc(ref err) if err.code() == super::error::rpc_spec_v2::INVALID_BLOCK_ERROR && err.message() == "Invalid block hash" ); let err = api @@ -1766,7 +1933,7 @@ async fn follow_with_multiple_unpin_hashes() { .await .unwrap_err(); assert_matches!(err, - Error::Call(err) if err.code() == super::error::rpc_spec_v2::INVALID_BLOCK_ERROR && err.message() == "Invalid block hash" + Error::JsonRpc(ref err) if err.code() == super::error::rpc_spec_v2::INVALID_BLOCK_ERROR && err.message() == "Invalid block hash" ); } @@ -1785,6 +1952,9 @@ async fn follow_prune_best_block() { subscription_max_pinned_duration: Duration::from_secs(MAX_PINNED_SECS), subscription_max_ongoing_operations: MAX_OPERATIONS, operation_max_storage_items: MAX_PAGINATION_LIMIT, + + max_lagging_distance: MAX_LAGGING_DISTANCE, + max_follow_subscriptions_per_connection: MAX_FOLLOW_SUBSCRIPTIONS_PER_CONNECTION, }, ) .into_rpc(); @@ -1795,7 +1965,7 @@ async fn follow_prune_best_block() { // Initialized must always be reported first. let event: FollowEvent = get_next_event(&mut sub).await; let expected = FollowEvent::Initialized(Initialized { - finalized_block_hash: format!("{:?}", finalized_hash), + finalized_block_hashes: vec![format!("{:?}", finalized_hash)], finalized_block_runtime: None, with_runtime: false, }); @@ -1970,6 +2140,9 @@ async fn follow_forks_pruned_block() { subscription_max_pinned_duration: Duration::from_secs(MAX_PINNED_SECS), subscription_max_ongoing_operations: MAX_OPERATIONS, operation_max_storage_items: MAX_PAGINATION_LIMIT, + + max_lagging_distance: MAX_LAGGING_DISTANCE, + max_follow_subscriptions_per_connection: MAX_FOLLOW_SUBSCRIPTIONS_PER_CONNECTION, }, ) .into_rpc(); @@ -1980,6 +2153,7 @@ async fn follow_forks_pruned_block() { // ^^^ finalized // -> block 1 -> block 2_f -> block 3_f // + let finalized_hash = client.info().finalized_hash; let block_1 = BlockBuilderBuilder::new(&*client) .on_parent_block(client.chain_info().genesis_hash) @@ -1989,6 +2163,7 @@ async fn follow_forks_pruned_block() { .build() .unwrap() .block; + let block_1_hash = block_1.header.hash(); client.import(BlockOrigin::Own, block_1.clone()).await.unwrap(); let block_2 = BlockBuilderBuilder::new(&*client) @@ -1999,6 +2174,7 @@ async fn follow_forks_pruned_block() { .build() .unwrap() .block; + let block_2_hash = block_2.header.hash(); client.import(BlockOrigin::Own, block_2.clone()).await.unwrap(); let block_3 = BlockBuilderBuilder::new(&*client) @@ -2055,7 +2231,12 @@ async fn follow_forks_pruned_block() { // Initialized must always be reported first. let event: FollowEvent = get_next_event(&mut sub).await; let expected = FollowEvent::Initialized(Initialized { - finalized_block_hash: format!("{:?}", block_3_hash), + finalized_block_hashes: vec![ + format!("{:?}", finalized_hash), + format!("{:?}", block_1_hash), + format!("{:?}", block_2_hash), + format!("{:?}", block_3_hash), + ], finalized_block_runtime: None, with_runtime: false, }); @@ -2121,6 +2302,9 @@ async fn follow_report_multiple_pruned_block() { subscription_max_pinned_duration: Duration::from_secs(MAX_PINNED_SECS), subscription_max_ongoing_operations: MAX_OPERATIONS, operation_max_storage_items: MAX_PAGINATION_LIMIT, + + max_lagging_distance: MAX_LAGGING_DISTANCE, + max_follow_subscriptions_per_connection: MAX_FOLLOW_SUBSCRIPTIONS_PER_CONNECTION, }, ) .into_rpc(); @@ -2209,7 +2393,7 @@ async fn follow_report_multiple_pruned_block() { // Initialized must always be reported first. let event: FollowEvent = get_next_event(&mut sub).await; let expected = FollowEvent::Initialized(Initialized { - finalized_block_hash: format!("{:?}", finalized_hash), + finalized_block_hashes: vec![format!("{:?}", finalized_hash)], finalized_block_runtime: None, with_runtime: false, }); @@ -2366,6 +2550,9 @@ async fn pin_block_references() { subscription_max_pinned_duration: Duration::from_secs(MAX_PINNED_SECS), subscription_max_ongoing_operations: MAX_OPERATIONS, operation_max_storage_items: MAX_PAGINATION_LIMIT, + + max_lagging_distance: MAX_LAGGING_DISTANCE, + max_follow_subscriptions_per_connection: MAX_FOLLOW_SUBSCRIPTIONS_PER_CONNECTION, }, ) .into_rpc(); @@ -2503,6 +2690,9 @@ async fn follow_finalized_before_new_block() { subscription_max_pinned_duration: Duration::from_secs(MAX_PINNED_SECS), subscription_max_ongoing_operations: MAX_OPERATIONS, operation_max_storage_items: MAX_PAGINATION_LIMIT, + + max_lagging_distance: MAX_LAGGING_DISTANCE, + max_follow_subscriptions_per_connection: MAX_FOLLOW_SUBSCRIPTIONS_PER_CONNECTION, }, ) .into_rpc(); @@ -2531,7 +2721,7 @@ async fn follow_finalized_before_new_block() { let finalized_hash = client.info().finalized_hash; let event: FollowEvent = get_next_event(&mut sub).await; let expected = FollowEvent::Initialized(Initialized { - finalized_block_hash: format!("{:?}", finalized_hash), + finalized_block_hashes: vec![format!("{:?}", finalized_hash)], finalized_block_runtime: None, with_runtime: false, }); @@ -2617,6 +2807,9 @@ async fn ensure_operation_limits_works() { subscription_max_pinned_duration: Duration::from_secs(MAX_PINNED_SECS), subscription_max_ongoing_operations: 1, operation_max_storage_items: MAX_PAGINATION_LIMIT, + + max_lagging_distance: MAX_LAGGING_DISTANCE, + max_follow_subscriptions_per_connection: MAX_FOLLOW_SUBSCRIPTIONS_PER_CONNECTION, }, ) .into_rpc(); @@ -2677,7 +2870,7 @@ async fn ensure_operation_limits_works() { FollowEvent::OperationStorageDone(done) if done.operation_id == operation_id ); - // The storage is finished and capactiy must be released. + // The storage is finished and capacity must be released. let alice_id = AccountKeyring::Alice.to_account_id(); // Hex encoded scale encoded bytes representing the call parameters. let call_parameters = hex_string(&alice_id.encode()); @@ -2721,6 +2914,9 @@ async fn check_continue_operation() { subscription_max_pinned_duration: Duration::from_secs(MAX_PINNED_SECS), subscription_max_ongoing_operations: MAX_OPERATIONS, operation_max_storage_items: 1, + + max_lagging_distance: MAX_LAGGING_DISTANCE, + max_follow_subscriptions_per_connection: MAX_FOLLOW_SUBSCRIPTIONS_PER_CONNECTION, }, ) .into_rpc(); @@ -2903,6 +3099,9 @@ async fn stop_storage_operation() { subscription_max_pinned_duration: Duration::from_secs(MAX_PINNED_SECS), subscription_max_ongoing_operations: MAX_OPERATIONS, operation_max_storage_items: 1, + + max_lagging_distance: MAX_LAGGING_DISTANCE, + max_follow_subscriptions_per_connection: MAX_FOLLOW_SUBSCRIPTIONS_PER_CONNECTION, }, ) .into_rpc(); @@ -3004,7 +3203,7 @@ async fn storage_closest_merkle_value() { /// The core of this test. /// - /// Checks keys that are exact match, keys with descedant and keys that should not return + /// Checks keys that are exact match, keys with descendant and keys that should not return /// values. /// /// Returns (key, merkle value) pairs. @@ -3030,7 +3229,7 @@ async fn storage_closest_merkle_value() { key: hex_string(b":AAAB"), query_type: StorageQueryType::ClosestDescendantMerkleValue }, - // Key with descedent. + // Key with descendant. StorageQuery { key: hex_string(b":A"), query_type: StorageQueryType::ClosestDescendantMerkleValue @@ -3188,3 +3387,260 @@ async fn storage_closest_merkle_value() { merkle_values_rhs.get(&hex_string(b":AAAA")).unwrap() ); } + +#[tokio::test] +async fn chain_head_stop_all_subscriptions() { + let builder = TestClientBuilder::new(); + let backend = builder.backend(); + let mut client = Arc::new(builder.build()); + + // Configure the chainHead to stop all subscriptions on lagging distance of 5 blocks. + let api = ChainHead::new( + client.clone(), + backend, + Arc::new(TaskExecutor::default()), + ChainHeadConfig { + global_max_pinned_blocks: MAX_PINNED_BLOCKS, + subscription_max_pinned_duration: Duration::from_secs(MAX_PINNED_SECS), + subscription_max_ongoing_operations: MAX_OPERATIONS, + operation_max_storage_items: MAX_PAGINATION_LIMIT, + max_lagging_distance: 5, + max_follow_subscriptions_per_connection: MAX_FOLLOW_SUBSCRIPTIONS_PER_CONNECTION, + }, + ) + .into_rpc(); + + let mut sub = api.subscribe_unbounded("chainHead_unstable_follow", [true]).await.unwrap(); + + // Ensure the imported block is propagated and pinned for this subscription. + assert_matches!( + get_next_event::>(&mut sub).await, + FollowEvent::Initialized(_) + ); + + // Import 6 blocks in total to trigger the suspension distance. + let mut parent_hash = client.chain_info().genesis_hash; + for i in 0..6 { + let block = BlockBuilderBuilder::new(&*client) + .on_parent_block(parent_hash) + .with_parent_block_number(i) + .build() + .unwrap() + .build() + .unwrap() + .block; + + let hash = block.hash(); + parent_hash = hash; + client.import(BlockOrigin::Own, block.clone()).await.unwrap(); + + assert_matches!( + get_next_event::>(&mut sub).await, + FollowEvent::NewBlock(_) + ); + assert_matches!( + get_next_event::>(&mut sub).await, + FollowEvent::BestBlockChanged(_) + ); + } + + let mut second_sub = + api.subscribe_unbounded("chainHead_unstable_follow", [true]).await.unwrap(); + // Lagging detected, the stop event is delivered immediately. + assert_matches!( + get_next_event::>(&mut second_sub).await, + FollowEvent::Stop + ); + + // Ensure that all subscriptions are stopped. + assert_matches!(get_next_event::>(&mut sub).await, FollowEvent::Stop); + + // Other subscriptions cannot be started until the suspension period is over. + let mut sub = api.subscribe_unbounded("chainHead_unstable_follow", [true]).await.unwrap(); + // Should receive the stop event immediately. + assert_matches!(get_next_event::>(&mut sub).await, FollowEvent::Stop); + + // For the next subscription, lagging distance must be smaller. + client.finalize_block(parent_hash, None).unwrap(); + + let mut sub = api.subscribe_unbounded("chainHead_unstable_follow", [true]).await.unwrap(); + assert_matches!( + get_next_event::>(&mut sub).await, + FollowEvent::Initialized(_) + ); +} + +#[tokio::test] +async fn chain_head_single_connection_context() { + let server_addr = run_server().await; + let server_url = format!("ws://{}", server_addr); + let client = jsonrpsee::ws_client::WsClientBuilder::default() + .build(&server_url) + .await + .unwrap(); + // Calls cannot be made from a different connection context. + let second_client = jsonrpsee::ws_client::WsClientBuilder::default() + .build(&server_url) + .await + .unwrap(); + + let mut sub: RpcClientSubscription> = + ChainHeadApiClient::::chain_head_unstable_follow(&client, true) + .await + .unwrap(); + + let event = tokio::time::timeout(std::time::Duration::from_secs(60), sub.next()) + .await + .unwrap() + .unwrap() + .unwrap(); + let finalized_hash = match event { + FollowEvent::Initialized(init) => init.finalized_block_hashes.into_iter().last().unwrap(), + _ => panic!("Expected FollowEvent::Initialized"), + }; + + let first_sub_id = match sub.kind() { + jsonrpsee::core::client::SubscriptionKind::Subscription(id) => match id { + jsonrpsee::types::SubscriptionId::Num(num) => num.to_string(), + jsonrpsee::types::SubscriptionId::Str(s) => s.to_string(), + }, + _ => panic!("Unexpected subscription ID"), + }; + + // Trying to unpin from a different connection will have no effect. + let _response = ChainHeadApiClient::::chain_head_unstable_unpin( + &second_client, + first_sub_id.clone(), + crate::chain_head::api::ListOrValue::Value(finalized_hash.clone()), + ) + .await + .unwrap(); + + // Body can still be fetched from the first subscription. + let response: MethodResponse = ChainHeadApiClient::::chain_head_unstable_body( + &client, + first_sub_id.clone(), + finalized_hash.clone(), + ) + .await + .unwrap(); + assert_matches!(response, MethodResponse::Started(_started)); + + // Cannot make a call from a different connection context. + let response: MethodResponse = ChainHeadApiClient::::chain_head_unstable_body( + &second_client, + first_sub_id.clone(), + finalized_hash.clone(), + ) + .await + .unwrap(); + assert_matches!(response, MethodResponse::LimitReached); + + let response: Option = ChainHeadApiClient::::chain_head_unstable_header( + &client, + first_sub_id.clone(), + finalized_hash.clone(), + ) + .await + .unwrap(); + assert!(response.is_some()); + // Cannot make a call from a different connection context. + let response: Option = ChainHeadApiClient::::chain_head_unstable_header( + &second_client, + first_sub_id.clone(), + finalized_hash.clone(), + ) + .await + .unwrap(); + assert!(response.is_none()); + + let key = hex_string(&KEY); + let response: MethodResponse = ChainHeadApiClient::::chain_head_unstable_storage( + &client, + first_sub_id.clone(), + finalized_hash.clone(), + vec![StorageQuery { key: key.clone(), query_type: StorageQueryType::Hash }], + None, + ) + .await + .unwrap(); + assert_matches!(response, MethodResponse::Started(_started)); + // Cannot make a call from a different connection context. + let response: MethodResponse = ChainHeadApiClient::::chain_head_unstable_storage( + &second_client, + first_sub_id.clone(), + finalized_hash.clone(), + vec![StorageQuery { key: key.clone(), query_type: StorageQueryType::Hash }], + None, + ) + .await + .unwrap(); + assert_matches!(response, MethodResponse::LimitReached); + + let alice_id = AccountKeyring::Alice.to_account_id(); + // Hex encoded scale encoded bytes representing the call parameters. + let call_parameters = hex_string(&alice_id.encode()); + let response: MethodResponse = ChainHeadApiClient::::chain_head_unstable_call( + &client, + first_sub_id.clone(), + finalized_hash.clone(), + "AccountNonceApi_account_nonce".into(), + call_parameters.clone(), + ) + .await + .unwrap(); + assert_matches!(response, MethodResponse::Started(_started)); + // Cannot make a call from a different connection context. + let response: MethodResponse = ChainHeadApiClient::::chain_head_unstable_call( + &second_client, + first_sub_id.clone(), + finalized_hash.clone(), + "AccountNonceApi_account_nonce".into(), + call_parameters.clone(), + ) + .await + .unwrap(); + assert_matches!(response, MethodResponse::LimitReached); +} + +#[tokio::test] +async fn chain_head_limit_reached() { + let builder = TestClientBuilder::new(); + let backend = builder.backend(); + let client = Arc::new(builder.build()); + + // Maximum of 1 chainHead_follow subscription. + let api = ChainHead::new( + client.clone(), + backend, + Arc::new(TaskExecutor::default()), + ChainHeadConfig { + global_max_pinned_blocks: MAX_PINNED_BLOCKS, + subscription_max_pinned_duration: Duration::from_secs(MAX_PINNED_SECS), + subscription_max_ongoing_operations: MAX_OPERATIONS, + operation_max_storage_items: MAX_PAGINATION_LIMIT, + max_lagging_distance: MAX_LAGGING_DISTANCE, + max_follow_subscriptions_per_connection: 1, + }, + ) + .into_rpc(); + + let mut sub = api.subscribe_unbounded("chainHead_unstable_follow", [true]).await.unwrap(); + + // Initialized must always be reported first. + let _event: FollowEvent = get_next_event(&mut sub).await; + + let error = api.subscribe_unbounded("chainHead_unstable_follow", [true]).await.unwrap_err(); + assert!(error + .to_string() + .contains("Maximum number of chainHead_follow has been reached")); + + // After dropping the subscription, other subscriptions are allowed to be created. + drop(sub); + // Ensure the `chainHead_unfollow` is propagated to the server. + tokio::time::sleep(std::time::Duration::from_secs(5)).await; + + let mut sub = api.subscribe_unbounded("chainHead_unstable_follow", [true]).await.unwrap(); + // Initialized must always be reported first. + let _event: FollowEvent = get_next_event(&mut sub).await; +} diff --git a/substrate/client/rpc-spec-v2/src/common/connections.rs b/substrate/client/rpc-spec-v2/src/common/connections.rs new file mode 100644 index 0000000000000000000000000000000000000000..c16a80bf49db93853ca223ab632dbc544082ae44 --- /dev/null +++ b/substrate/client/rpc-spec-v2/src/common/connections.rs @@ -0,0 +1,262 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +use jsonrpsee::ConnectionId; +use parking_lot::Mutex; +use std::{ + collections::{HashMap, HashSet}, + sync::Arc, +}; + +/// Connection state which keeps track whether a connection exist and +/// the number of concurrent operations. +#[derive(Default, Clone)] +pub struct RpcConnections { + /// The number of identifiers that can be registered for each connection. + /// + /// # Example + /// + /// This is used to limit how many `chainHead_follow` subscriptions are active at one time. + capacity: usize, + /// Map the connecton ID to a set of identifiers. + data: Arc>>, +} + +#[derive(Default)] +struct ConnectionData { + /// The total number of identifiers for the given connection. + /// + /// An identifier for a connection might be: + /// - the subscription ID for chainHead_follow + /// - the operation ID for the transactionBroadcast API + /// - or simply how many times the transaction API has been called. + /// + /// # Note + /// + /// Because a pending subscription sink does not expose the future subscription ID, + /// we cannot register a subscription ID before the pending subscription is accepted. + /// This variable ensures that we have enough capacity to register an identifier, after + /// the subscription is accepted. Otherwise, a jsonrpc error object should be returned. + num_identifiers: usize, + /// Active registered identifiers for the given connection. + /// + /// # Note + /// + /// For chainHead, this represents the subscription ID. + /// For transactionBroadcast, this represents the operation ID. + /// For transaction, this is empty and the number of active calls is tracked by + /// [`Self::num_identifiers`]. + identifiers: HashSet, +} + +impl RpcConnections { + /// Constructs a new instance of [`RpcConnections`]. + pub fn new(capacity: usize) -> Self { + RpcConnections { capacity, data: Default::default() } + } + + /// Reserve space for a new connection identifier. + /// + /// If the number of active identifiers for the given connection exceeds the capacity, + /// returns None. + pub fn reserve_space(&self, connection_id: ConnectionId) -> Option { + let mut data = self.data.lock(); + + let entry = data.entry(connection_id).or_insert_with(ConnectionData::default); + if entry.num_identifiers >= self.capacity { + return None; + } + entry.num_identifiers = entry.num_identifiers.saturating_add(1); + + Some(ReservedConnection { connection_id, rpc_connections: Some(self.clone()) }) + } + + /// Gives back the reserved space before the connection identifier is registered. + /// + /// # Note + /// + /// This may happen if the pending subscription cannot be accepted (unlikely). + fn unreserve_space(&self, connection_id: ConnectionId) { + let mut data = self.data.lock(); + + let entry = data.entry(connection_id).or_insert_with(ConnectionData::default); + entry.num_identifiers = entry.num_identifiers.saturating_sub(1); + + if entry.num_identifiers == 0 { + data.remove(&connection_id); + } + } + + /// Register an identifier for the given connection. + /// + /// Users must call [`Self::reserve_space`] before calling this method to ensure enough + /// space is available. + /// + /// Returns true if the identifier was inserted successfully, false if the identifier was + /// already inserted or reached capacity. + fn register_identifier(&self, connection_id: ConnectionId, identifier: String) -> bool { + let mut data = self.data.lock(); + + let entry = data.entry(connection_id).or_insert_with(ConnectionData::default); + // Should be already checked `Self::reserve_space`. + if entry.identifiers.len() >= self.capacity { + return false; + } + + entry.identifiers.insert(identifier) + } + + /// Unregister an identifier for the given connection. + fn unregister_identifier(&self, connection_id: ConnectionId, identifier: &str) { + let mut data = self.data.lock(); + if let Some(connection_data) = data.get_mut(&connection_id) { + connection_data.identifiers.remove(identifier); + connection_data.num_identifiers = connection_data.num_identifiers.saturating_sub(1); + + if connection_data.num_identifiers == 0 { + data.remove(&connection_id); + } + } + } + + /// Check if the given connection contains the given identifier. + pub fn contains_identifier(&self, connection_id: ConnectionId, identifier: &str) -> bool { + let data = self.data.lock(); + data.get(&connection_id) + .map(|connection_data| connection_data.identifiers.contains(identifier)) + .unwrap_or(false) + } +} + +/// RAII wrapper that ensures the reserved space is given back if the object is +/// dropped before the identifier is registered. +pub struct ReservedConnection { + connection_id: ConnectionId, + rpc_connections: Option, +} + +impl ReservedConnection { + /// Register the identifier for the given connection. + pub fn register(mut self, identifier: String) -> Option { + let rpc_connections = self.rpc_connections.take()?; + + if rpc_connections.register_identifier(self.connection_id, identifier.clone()) { + Some(RegisteredConnection { + connection_id: self.connection_id, + identifier, + rpc_connections, + }) + } else { + None + } + } +} + +impl Drop for ReservedConnection { + fn drop(&mut self) { + if let Some(rpc_connections) = self.rpc_connections.take() { + rpc_connections.unreserve_space(self.connection_id); + } + } +} + +/// RAII wrapper that ensures the identifier is unregistered if the object is dropped. +pub struct RegisteredConnection { + connection_id: ConnectionId, + identifier: String, + rpc_connections: RpcConnections, +} + +impl Drop for RegisteredConnection { + fn drop(&mut self) { + self.rpc_connections.unregister_identifier(self.connection_id, &self.identifier); + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn reserve_space() { + let rpc_connections = RpcConnections::new(2); + let reserved = rpc_connections.reserve_space(1); + assert!(reserved.is_some()); + assert_eq!(1, rpc_connections.data.lock().get(&1).unwrap().num_identifiers); + assert_eq!(rpc_connections.data.lock().len(), 1); + + let reserved = reserved.unwrap(); + let registered = reserved.register("identifier1".to_string()).unwrap(); + assert!(rpc_connections.contains_identifier(1, "identifier1")); + assert_eq!(1, rpc_connections.data.lock().get(&1).unwrap().num_identifiers); + drop(registered); + + // Data is dropped. + assert!(rpc_connections.data.lock().get(&1).is_none()); + assert!(rpc_connections.data.lock().is_empty()); + // Checks can still happen. + assert!(!rpc_connections.contains_identifier(1, "identifier1")); + } + + #[test] + fn reserve_space_capacity_reached() { + let rpc_connections = RpcConnections::new(2); + + // Reserve identifier for connection 1. + let reserved = rpc_connections.reserve_space(1); + assert!(reserved.is_some()); + assert_eq!(1, rpc_connections.data.lock().get(&1).unwrap().num_identifiers); + + // Add identifier for connection 1. + let reserved = reserved.unwrap(); + let registered = reserved.register("identifier1".to_string()).unwrap(); + assert!(rpc_connections.contains_identifier(1, "identifier1")); + assert_eq!(1, rpc_connections.data.lock().get(&1).unwrap().num_identifiers); + + // Reserve identifier for connection 1 again. + let reserved = rpc_connections.reserve_space(1); + assert!(reserved.is_some()); + assert_eq!(2, rpc_connections.data.lock().get(&1).unwrap().num_identifiers); + + // Add identifier for connection 1 again. + let reserved = reserved.unwrap(); + let registered_second = reserved.register("identifier2".to_string()).unwrap(); + assert!(rpc_connections.contains_identifier(1, "identifier2")); + assert_eq!(2, rpc_connections.data.lock().get(&1).unwrap().num_identifiers); + + // Cannot reserve more identifiers. + let reserved = rpc_connections.reserve_space(1); + assert!(reserved.is_none()); + + // Drop the first identifier. + drop(registered); + assert_eq!(1, rpc_connections.data.lock().get(&1).unwrap().num_identifiers); + assert!(rpc_connections.contains_identifier(1, "identifier2")); + assert!(!rpc_connections.contains_identifier(1, "identifier1")); + + // Can reserve again after clearing the space. + let reserved = rpc_connections.reserve_space(1); + assert!(reserved.is_some()); + assert_eq!(2, rpc_connections.data.lock().get(&1).unwrap().num_identifiers); + + // Ensure data is cleared. + drop(reserved); + drop(registered_second); + assert!(rpc_connections.data.lock().get(&1).is_none()); + } +} diff --git a/substrate/client/rpc-spec-v2/src/common/mod.rs b/substrate/client/rpc-spec-v2/src/common/mod.rs index ac1af8fce3c9bc42a00fa747f62289aef0e04356..3167561d649a2f51f24b864ffa581df16b139202 100644 --- a/substrate/client/rpc-spec-v2/src/common/mod.rs +++ b/substrate/client/rpc-spec-v2/src/common/mod.rs @@ -13,5 +13,6 @@ //! Common types and functionality for the RPC-V2 spec. +pub mod connections; pub mod events; pub mod storage; diff --git a/substrate/client/rpc-spec-v2/src/transaction/api.rs b/substrate/client/rpc-spec-v2/src/transaction/api.rs index 53c83b662a35fdcb67a5e212307c6b5ec7c2a61f..33af9c9533388a1e4d5832a390c8eb96da756905 100644 --- a/substrate/client/rpc-spec-v2/src/transaction/api.rs +++ b/substrate/client/rpc-spec-v2/src/transaction/api.rs @@ -18,8 +18,8 @@ //! API trait for transactions. -use crate::transaction::event::TransactionEvent; -use jsonrpsee::proc_macros::rpc; +use crate::transaction::{error::ErrorBroadcast, event::TransactionEvent}; +use jsonrpsee::{core::RpcResult, proc_macros::rpc}; use sp_core::Bytes; #[rpc(client, server)] @@ -28,6 +28,10 @@ pub trait TransactionApi { /// /// See [`TransactionEvent`](crate::transaction::event::TransactionEvent) for details on /// transaction life cycle. + /// + /// # Unstable + /// + /// This method is unstable and subject to change in the future. #[subscription( name = "transactionWatch_unstable_submitAndWatch" => "transactionWatch_unstable_watchEvent", unsubscribe = "transactionWatch_unstable_unwatch", @@ -35,3 +39,22 @@ pub trait TransactionApi { )] fn submit_and_watch(&self, bytes: Bytes); } + +#[rpc(client, server)] +pub trait TransactionBroadcastApi { + /// Broadcast an extrinsic to the chain. + /// + /// # Unstable + /// + /// This method is unstable and subject to change in the future. + #[method(name = "transaction_unstable_broadcast")] + fn broadcast(&self, bytes: Bytes) -> RpcResult>; + + /// Broadcast an extrinsic to the chain. + /// + /// # Unstable + /// + /// This method is unstable and subject to change in the future. + #[method(name = "transaction_unstable_stop")] + fn stop_broadcast(&self, operation_id: String) -> Result<(), ErrorBroadcast>; +} diff --git a/substrate/client/rpc-spec-v2/src/transaction/error.rs b/substrate/client/rpc-spec-v2/src/transaction/error.rs index d2de07afd5955cd2d41148bab0119384b117bf42..116977af66001096ff7cb14775b768451833a866 100644 --- a/substrate/client/rpc-spec-v2/src/transaction/error.rs +++ b/substrate/client/rpc-spec-v2/src/transaction/error.rs @@ -21,6 +21,7 @@ //! Errors are interpreted as transaction events for subscriptions. use crate::transaction::event::{TransactionError, TransactionEvent}; +use jsonrpsee::types::error::ErrorObject; use sc_transaction_pool_api::error::Error as PoolError; use sp_runtime::transaction_validity::InvalidTransaction; @@ -98,3 +99,29 @@ impl From for TransactionEvent { } } } + +/// TransactionBroadcast error. +#[derive(Debug, thiserror::Error)] +pub enum ErrorBroadcast { + /// The provided operation ID is invalid. + #[error("Invalid operation id")] + InvalidOperationID, +} + +/// General purpose errors, as defined in +/// . +pub mod json_rpc_spec { + /// Invalid parameter error. + pub const INVALID_PARAM_ERROR: i32 = -32602; +} + +impl From for ErrorObject<'static> { + fn from(e: ErrorBroadcast) -> Self { + let msg = e.to_string(); + + match e { + ErrorBroadcast::InvalidOperationID => + ErrorObject::owned(json_rpc_spec::INVALID_PARAM_ERROR, msg, None::<()>), + } + } +} diff --git a/substrate/client/rpc-spec-v2/src/transaction/event.rs b/substrate/client/rpc-spec-v2/src/transaction/event.rs index 8b80fcda17beb22cece35c928f10d72175fa9458..882ac8490b07c00432c4296964b7f995329df3dc 100644 --- a/substrate/client/rpc-spec-v2/src/transaction/event.rs +++ b/substrate/client/rpc-spec-v2/src/transaction/event.rs @@ -20,23 +20,6 @@ use serde::{Deserialize, Serialize}; -/// The transaction was broadcasted to a number of peers. -/// -/// # Note -/// -/// The RPC does not guarantee that the peers have received the -/// transaction. -/// -/// When the number of peers is zero, the event guarantees that -/// shutting down the local node will lead to the transaction -/// not being included in the chain. -#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] -#[serde(rename_all = "camelCase")] -pub struct TransactionBroadcasted { - /// The number of peers the transaction was broadcasted to. - pub num_peers: usize, -} - /// The transaction was included in a block of the chain. #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] @@ -59,9 +42,6 @@ pub struct TransactionError { #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct TransactionDropped { - /// True if the transaction was broadcasted to other peers and - /// may still be included in the block. - pub broadcasted: bool, /// Reason of the event. pub error: String, } @@ -70,20 +50,17 @@ pub struct TransactionDropped { /// /// The status events can be grouped based on their kinds as: /// -/// 1. Runtime validated the transaction: +/// 1. Runtime validated the transaction and it entered the pool: /// - `Validated` /// -/// 2. Inside the `Ready` queue: -/// - `Broadcast` -/// -/// 3. Leaving the pool: +/// 2. Leaving the pool: /// - `BestChainBlockIncluded` /// - `Invalid` /// -/// 4. Block finalized: +/// 3. Block finalized: /// - `Finalized` /// -/// 5. At any time: +/// 4. At any time: /// - `Dropped` /// - `Error` /// @@ -101,8 +78,6 @@ pub struct TransactionDropped { pub enum TransactionEvent { /// The transaction was validated by the runtime. Validated, - /// The transaction was broadcasted to a number of peers. - Broadcasted(TransactionBroadcasted), /// The transaction was included in a best block of the chain. /// /// # Note @@ -159,7 +134,6 @@ enum TransactionEventBlockIR { #[serde(tag = "event")] enum TransactionEventNonBlockIR { Validated, - Broadcasted(TransactionBroadcasted), Error(TransactionError), Invalid(TransactionError), Dropped(TransactionDropped), @@ -186,8 +160,6 @@ impl From> for TransactionEventIR { match value { TransactionEvent::Validated => TransactionEventIR::NonBlock(TransactionEventNonBlockIR::Validated), - TransactionEvent::Broadcasted(event) => - TransactionEventIR::NonBlock(TransactionEventNonBlockIR::Broadcasted(event)), TransactionEvent::BestChainBlockIncluded(event) => TransactionEventIR::Block(TransactionEventBlockIR::BestChainBlockIncluded(event)), TransactionEvent::Finalized(event) => @@ -207,8 +179,6 @@ impl From> for TransactionEvent { match value { TransactionEventIR::NonBlock(status) => match status { TransactionEventNonBlockIR::Validated => TransactionEvent::Validated, - TransactionEventNonBlockIR::Broadcasted(event) => - TransactionEvent::Broadcasted(event), TransactionEventNonBlockIR::Error(event) => TransactionEvent::Error(event), TransactionEventNonBlockIR::Invalid(event) => TransactionEvent::Invalid(event), TransactionEventNonBlockIR::Dropped(event) => TransactionEvent::Dropped(event), @@ -239,19 +209,6 @@ mod tests { assert_eq!(event_dec, event); } - #[test] - fn broadcasted_event() { - let event: TransactionEvent<()> = - TransactionEvent::Broadcasted(TransactionBroadcasted { num_peers: 2 }); - let ser = serde_json::to_string(&event).unwrap(); - - let exp = r#"{"event":"broadcasted","numPeers":2}"#; - assert_eq!(ser, exp); - - let event_dec: TransactionEvent<()> = serde_json::from_str(exp).unwrap(); - assert_eq!(event_dec, event); - } - #[test] fn best_chain_event() { let event: TransactionEvent<()> = TransactionEvent::BestChainBlockIncluded(None); @@ -320,13 +277,11 @@ mod tests { #[test] fn dropped_event() { - let event: TransactionEvent<()> = TransactionEvent::Dropped(TransactionDropped { - broadcasted: true, - error: "abc".to_string(), - }); + let event: TransactionEvent<()> = + TransactionEvent::Dropped(TransactionDropped { error: "abc".to_string() }); let ser = serde_json::to_string(&event).unwrap(); - let exp = r#"{"event":"dropped","broadcasted":true,"error":"abc"}"#; + let exp = r#"{"event":"dropped","error":"abc"}"#; assert_eq!(ser, exp); let event_dec: TransactionEvent<()> = serde_json::from_str(exp).unwrap(); diff --git a/substrate/client/rpc-spec-v2/src/transaction/mod.rs b/substrate/client/rpc-spec-v2/src/transaction/mod.rs index 212912ba1c728feb5e01614a74fcab09ce5bc079..514ccf047dc28570c78543755577661a6a7791af 100644 --- a/substrate/client/rpc-spec-v2/src/transaction/mod.rs +++ b/substrate/client/rpc-spec-v2/src/transaction/mod.rs @@ -25,14 +25,16 @@ //! //! Methods are prefixed by `transaction`. +#[cfg(test)] +mod tests; + pub mod api; pub mod error; pub mod event; pub mod transaction; +pub mod transaction_broadcast; -pub use api::TransactionApiServer; -pub use event::{ - TransactionBlock, TransactionBroadcasted, TransactionDropped, TransactionError, - TransactionEvent, -}; +pub use api::{TransactionApiServer, TransactionBroadcastApiServer}; +pub use event::{TransactionBlock, TransactionDropped, TransactionError, TransactionEvent}; pub use transaction::Transaction; +pub use transaction_broadcast::TransactionBroadcast; diff --git a/substrate/client/rpc-spec-v2/src/transaction/tests/executor.rs b/substrate/client/rpc-spec-v2/src/transaction/tests/executor.rs new file mode 100644 index 0000000000000000000000000000000000000000..ff9aca79887c3f29025697f9f5832c914735e0d6 --- /dev/null +++ b/substrate/client/rpc-spec-v2/src/transaction/tests/executor.rs @@ -0,0 +1,100 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +use sp_core::{testing::TaskExecutor, traits::SpawnNamed}; +use std::sync::{atomic::AtomicUsize, Arc}; +use tokio::sync::mpsc; + +/// Wrap the `TaskExecutor` to know when the broadcast future is dropped. +#[derive(Clone)] +pub struct TaskExecutorBroadcast { + executor: TaskExecutor, + sender: mpsc::UnboundedSender<()>, + num_tasks: Arc, +} + +/// The channel that receives events when the broadcast futures are dropped. +pub type TaskExecutorRecv = mpsc::UnboundedReceiver<()>; + +/// The state of the `TaskExecutorBroadcast`. +pub struct TaskExecutorState { + pub recv: TaskExecutorRecv, + pub num_tasks: Arc, +} + +impl TaskExecutorState { + pub fn num_tasks(&self) -> usize { + self.num_tasks.load(std::sync::atomic::Ordering::Acquire) + } +} + +impl TaskExecutorBroadcast { + /// Construct a new `TaskExecutorBroadcast` and a receiver to know when the broadcast futures + /// are dropped. + pub fn new() -> (Self, TaskExecutorState) { + let (sender, recv) = mpsc::unbounded_channel(); + let num_tasks = Arc::new(AtomicUsize::new(0)); + + ( + Self { executor: TaskExecutor::new(), sender, num_tasks: num_tasks.clone() }, + TaskExecutorState { recv, num_tasks }, + ) + } +} + +impl SpawnNamed for TaskExecutorBroadcast { + fn spawn( + &self, + name: &'static str, + group: Option<&'static str>, + future: futures::future::BoxFuture<'static, ()>, + ) { + let sender = self.sender.clone(); + let num_tasks = self.num_tasks.clone(); + + let future = Box::pin(async move { + num_tasks.fetch_add(1, std::sync::atomic::Ordering::AcqRel); + future.await; + num_tasks.fetch_sub(1, std::sync::atomic::Ordering::AcqRel); + + let _ = sender.send(()); + }); + + self.executor.spawn(name, group, future) + } + + fn spawn_blocking( + &self, + name: &'static str, + group: Option<&'static str>, + future: futures::future::BoxFuture<'static, ()>, + ) { + let sender = self.sender.clone(); + let num_tasks = self.num_tasks.clone(); + + let future = Box::pin(async move { + num_tasks.fetch_add(1, std::sync::atomic::Ordering::AcqRel); + future.await; + num_tasks.fetch_sub(1, std::sync::atomic::Ordering::AcqRel); + + let _ = sender.send(()); + }); + + self.executor.spawn_blocking(name, group, future) + } +} diff --git a/substrate/client/rpc-spec-v2/src/transaction/tests/middleware_pool.rs b/substrate/client/rpc-spec-v2/src/transaction/tests/middleware_pool.rs new file mode 100644 index 0000000000000000000000000000000000000000..aa8ac572dec9d8d6de9212fcb94c97ce2b804da4 --- /dev/null +++ b/substrate/client/rpc-spec-v2/src/transaction/tests/middleware_pool.rs @@ -0,0 +1,187 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +use codec::Encode; +use futures::Future; +use sc_transaction_pool::BasicPool; +use sc_transaction_pool_api::{ + ImportNotificationStream, PoolFuture, PoolStatus, ReadyTransactions, TransactionFor, + TransactionPool, TransactionSource, TransactionStatusStreamFor, TxHash, +}; + +use crate::hex_string; +use futures::{FutureExt, StreamExt}; + +use sp_runtime::traits::{Block as BlockT, NumberFor}; +use std::{collections::HashMap, pin::Pin, sync::Arc}; +use substrate_test_runtime_transaction_pool::TestApi; +use tokio::sync::mpsc; + +pub type Block = substrate_test_runtime_client::runtime::Block; + +pub type TxTestPool = MiddlewarePool; +pub type TxStatusType = sc_transaction_pool_api::TransactionStatus< + sc_transaction_pool_api::TxHash, + sc_transaction_pool_api::BlockHash, +>; +pub type TxStatusTypeTest = TxStatusType; + +/// The type of the event that the middleware captures. +#[derive(Debug, PartialEq)] +pub enum MiddlewarePoolEvent { + TransactionStatus { + transaction: String, + status: sc_transaction_pool_api::TransactionStatus< + ::Hash, + ::Hash, + >, + }, + PoolError { + transaction: String, + err: String, + }, +} + +/// The channel that receives events when the broadcast futures are dropped. +pub type MiddlewarePoolRecv = mpsc::UnboundedReceiver; + +/// Add a middleware to the transaction pool. +/// +/// This wraps the `submit_and_watch` to gain access to the events. +pub struct MiddlewarePool { + pub inner_pool: Arc>, + /// Send the middleware events to the test. + sender: mpsc::UnboundedSender, +} + +impl MiddlewarePool { + /// Construct a new [`MiddlewarePool`]. + pub fn new(pool: Arc>) -> (Self, MiddlewarePoolRecv) { + let (sender, recv) = mpsc::unbounded_channel(); + (MiddlewarePool { inner_pool: pool, sender }, recv) + } +} + +impl TransactionPool for MiddlewarePool { + type Block = as TransactionPool>::Block; + type Hash = as TransactionPool>::Hash; + type InPoolTransaction = as TransactionPool>::InPoolTransaction; + type Error = as TransactionPool>::Error; + + fn submit_at( + &self, + at: ::Hash, + source: TransactionSource, + xts: Vec>, + ) -> PoolFuture, Self::Error>>, Self::Error> { + self.inner_pool.submit_at(at, source, xts) + } + + fn submit_one( + &self, + at: ::Hash, + source: TransactionSource, + xt: TransactionFor, + ) -> PoolFuture, Self::Error> { + self.inner_pool.submit_one(at, source, xt) + } + + fn submit_and_watch( + &self, + at: ::Hash, + source: TransactionSource, + xt: TransactionFor, + ) -> PoolFuture>>, Self::Error> { + let pool = self.inner_pool.clone(); + let sender = self.sender.clone(); + let transaction = hex_string(&xt.encode()); + + async move { + let watcher = match pool.submit_and_watch(at, source, xt).await { + Ok(watcher) => watcher, + Err(err) => { + let _ = sender.send(MiddlewarePoolEvent::PoolError { + transaction: transaction.clone(), + err: err.to_string(), + }); + return Err(err); + }, + }; + + let watcher = watcher.map(move |status| { + let sender = sender.clone(); + let transaction = transaction.clone(); + + let _ = sender.send(MiddlewarePoolEvent::TransactionStatus { + transaction, + status: status.clone(), + }); + + status + }); + + Ok(watcher.boxed()) + } + .boxed() + } + + fn remove_invalid(&self, hashes: &[TxHash]) -> Vec> { + self.inner_pool.remove_invalid(hashes) + } + + fn status(&self) -> PoolStatus { + self.inner_pool.status() + } + + fn import_notification_stream(&self) -> ImportNotificationStream> { + self.inner_pool.import_notification_stream() + } + + fn hash_of(&self, xt: &TransactionFor) -> TxHash { + self.inner_pool.hash_of(xt) + } + + fn on_broadcasted(&self, propagations: HashMap, Vec>) { + self.inner_pool.on_broadcasted(propagations) + } + + fn ready_transaction(&self, hash: &TxHash) -> Option> { + self.inner_pool.ready_transaction(hash) + } + + fn ready_at( + &self, + at: NumberFor, + ) -> Pin< + Box< + dyn Future< + Output = Box> + Send>, + > + Send, + >, + > { + self.inner_pool.ready_at(at) + } + + fn ready(&self) -> Box> + Send> { + self.inner_pool.ready() + } + + fn futures(&self) -> Vec { + self.inner_pool.futures() + } +} diff --git a/substrate/client/rpc-spec-v2/src/transaction/tests/mod.rs b/substrate/client/rpc-spec-v2/src/transaction/tests/mod.rs new file mode 100644 index 0000000000000000000000000000000000000000..e14603ddb755a7673f0cc15d1fde9b755573311a --- /dev/null +++ b/substrate/client/rpc-spec-v2/src/transaction/tests/mod.rs @@ -0,0 +1,25 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +mod executor; +mod middleware_pool; +#[macro_use] +mod setup; + +mod transaction_broadcast_tests; +mod transaction_tests; diff --git a/substrate/client/rpc-spec-v2/src/transaction/tests/setup.rs b/substrate/client/rpc-spec-v2/src/transaction/tests/setup.rs new file mode 100644 index 0000000000000000000000000000000000000000..4a15657a7f69e290e0d1cccdf7fc3082671a9ede --- /dev/null +++ b/substrate/client/rpc-spec-v2/src/transaction/tests/setup.rs @@ -0,0 +1,155 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +use crate::{ + chain_head::test_utils::ChainHeadMockClient, + transaction::{ + api::{TransactionApiServer, TransactionBroadcastApiServer}, + tests::executor::{TaskExecutorBroadcast, TaskExecutorState}, + Transaction as RpcTransaction, TransactionBroadcast as RpcTransactionBroadcast, + }, +}; +use futures::Future; +use jsonrpsee::RpcModule; +use sc_transaction_pool::*; +use std::{pin::Pin, sync::Arc}; +use substrate_test_runtime_client::{prelude::*, Client}; +use substrate_test_runtime_transaction_pool::TestApi; + +use crate::transaction::tests::middleware_pool::{MiddlewarePool, MiddlewarePoolRecv}; + +pub type Block = substrate_test_runtime_client::runtime::Block; + +/// Initial Alice account nonce. +pub const ALICE_NONCE: u64 = 209; + +fn create_basic_pool_with_genesis( + test_api: Arc, + options: Options, +) -> (BasicPool, Pin + Send>>) { + let genesis_hash = { + test_api + .chain() + .read() + .block_by_number + .get(&0) + .map(|blocks| blocks[0].0.header.hash()) + .expect("there is block 0. qed") + }; + BasicPool::new_test(test_api, genesis_hash, genesis_hash, options) +} + +fn maintained_pool( + options: Options, +) -> (BasicPool, Arc, futures::executor::ThreadPool) { + let api = Arc::new(TestApi::with_alice_nonce(ALICE_NONCE)); + let (pool, background_task) = create_basic_pool_with_genesis(api.clone(), options); + + let thread_pool = futures::executor::ThreadPool::new().unwrap(); + thread_pool.spawn_ok(background_task); + (pool, api, thread_pool) +} + +pub fn setup_api( + options: Options, +) -> ( + Arc, + Arc, + Arc>>, + RpcModule>>>, + TaskExecutorState, + MiddlewarePoolRecv, +) { + let (pool, api, _) = maintained_pool(options); + let (pool, pool_state) = MiddlewarePool::new(Arc::new(pool).clone()); + let pool = Arc::new(pool); + + let builder = TestClientBuilder::new(); + let client = Arc::new(builder.build()); + let client_mock = Arc::new(ChainHeadMockClient::new(client.clone())); + + let (task_executor, executor_recv) = TaskExecutorBroadcast::new(); + + let tx_api = + RpcTransactionBroadcast::new(client_mock.clone(), pool.clone(), Arc::new(task_executor)) + .into_rpc(); + + (api, pool, client_mock, tx_api, executor_recv, pool_state) +} + +pub fn setup_api_tx() -> ( + Arc, + Arc, + Arc>>, + RpcModule>>>, + TaskExecutorState, + MiddlewarePoolRecv, +) { + let (pool, api, _) = maintained_pool(Default::default()); + let (pool, pool_state) = MiddlewarePool::new(Arc::new(pool).clone()); + let pool = Arc::new(pool); + + let builder = TestClientBuilder::new(); + let client = Arc::new(builder.build()); + let client_mock = Arc::new(ChainHeadMockClient::new(client.clone())); + let (task_executor, executor_recv) = TaskExecutorBroadcast::new(); + + let tx_api = + RpcTransaction::new(client_mock.clone(), pool.clone(), Arc::new(task_executor)).into_rpc(); + + (api, pool, client_mock, tx_api, executor_recv, pool_state) +} + +/// Get the next event from the provided middleware in at most 5 seconds. +macro_rules! get_next_event { + ($middleware:expr) => { + tokio::time::timeout(std::time::Duration::from_secs(5), $middleware.recv()) + .await + .unwrap() + .unwrap() + }; +} + +/// Get the next event from the provided middleware in at most 5 seconds. +macro_rules! get_next_event_sub { + ($sub:expr) => { + tokio::time::timeout(std::time::Duration::from_secs(5), $sub.next()) + .await + .unwrap() + .unwrap() + .unwrap() + .0 + }; +} + +/// Collect the next number of transaction events from the provided middleware. +macro_rules! get_next_tx_events { + ($middleware:expr, $num:expr) => {{ + let mut events = std::collections::HashMap::new(); + for _ in 0..$num { + let event = get_next_event!($middleware); + match event { + crate::transaction::tests::middleware_pool::MiddlewarePoolEvent::TransactionStatus { transaction, status } => { + events.entry(transaction).or_insert_with(|| vec![]).push(status); + }, + other => panic!("Expected TransactionStatus, received {:?}", other), + }; + } + events + }}; +} diff --git a/substrate/client/rpc-spec-v2/src/transaction/tests/transaction_broadcast_tests.rs b/substrate/client/rpc-spec-v2/src/transaction/tests/transaction_broadcast_tests.rs new file mode 100644 index 0000000000000000000000000000000000000000..77a28968aedf8cfeefc7964ca29b972a856d618e --- /dev/null +++ b/substrate/client/rpc-spec-v2/src/transaction/tests/transaction_broadcast_tests.rs @@ -0,0 +1,523 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +use crate::{hex_string, transaction::error::json_rpc_spec}; +use assert_matches::assert_matches; +use codec::Encode; +use jsonrpsee::{rpc_params, MethodsError as Error}; +use sc_transaction_pool::{Options, PoolLimit}; +use sc_transaction_pool_api::{ChainEvent, MaintainedTransactionPool, TransactionPool}; +use std::sync::Arc; +use substrate_test_runtime_client::AccountKeyring::*; +use substrate_test_runtime_transaction_pool::uxt; + +// Test helpers. +use crate::transaction::tests::{ + middleware_pool::{MiddlewarePoolEvent, TxStatusTypeTest}, + setup::{setup_api, ALICE_NONCE}, +}; + +#[tokio::test] +async fn tx_broadcast_enters_pool() { + let (api, pool, client_mock, tx_api, mut exec_middleware, mut pool_middleware) = + setup_api(Default::default()); + + // Start at block 1. + let block_1_header = api.push_block(1, vec![], true); + + let uxt = uxt(Alice, ALICE_NONCE); + let xt = hex_string(&uxt.encode()); + + let operation_id: String = + tx_api.call("transaction_unstable_broadcast", rpc_params![&xt]).await.unwrap(); + + // Announce block 1 to `transaction_unstable_broadcast`. + client_mock.trigger_import_stream(block_1_header).await; + + // Ensure the tx propagated from `transaction_unstable_broadcast` to the transaction pool. + let event = get_next_event!(&mut pool_middleware); + assert_eq!( + event, + MiddlewarePoolEvent::TransactionStatus { + transaction: xt.clone(), + status: TxStatusTypeTest::Ready + } + ); + + assert_eq!(1, pool.inner_pool.status().ready); + assert_eq!(uxt.encode().len(), pool.inner_pool.status().ready_bytes); + + // Import block 2 with the transaction included. + let block_2_header = api.push_block(2, vec![uxt.clone()], true); + let block_2 = block_2_header.hash(); + + // Announce block 2 to the pool. + let event = ChainEvent::NewBestBlock { hash: block_2, tree_route: None }; + pool.inner_pool.maintain(event).await; + assert_eq!(0, pool.inner_pool.status().ready); + + let event = get_next_event!(&mut pool_middleware); + assert_eq!( + event, + MiddlewarePoolEvent::TransactionStatus { + transaction: xt.clone(), + status: TxStatusTypeTest::InBlock((block_2, 0)) + } + ); + + // The future broadcast awaits for the finalized status to be reached. + // Force the future to exit by calling stop. + let _: () = tx_api + .call("transaction_unstable_stop", rpc_params![&operation_id]) + .await + .unwrap(); + + // Ensure the broadcast future finishes. + let _ = get_next_event!(&mut exec_middleware.recv); + assert_eq!(0, exec_middleware.num_tasks()); +} + +#[tokio::test] +async fn tx_broadcast_invalid_tx() { + let (_, pool, _, tx_api, mut exec_middleware, _) = setup_api(Default::default()); + + // Invalid parameters. + let err = tx_api + .call::<_, serde_json::Value>("transaction_unstable_broadcast", [1u8]) + .await + .unwrap_err(); + assert_matches!(err, + Error::JsonRpc(err) if err.code() == json_rpc_spec::INVALID_PARAM_ERROR && err.message() == "Invalid params" + ); + + assert_eq!(0, pool.status().ready); + + // Invalid transaction that cannot be decoded. The broadcast silently exits. + let xt = "0xdeadbeef"; + let operation_id: String = + tx_api.call("transaction_unstable_broadcast", rpc_params![&xt]).await.unwrap(); + + assert_eq!(0, pool.status().ready); + + // Await the broadcast future to exit. + // Without this we'd be subject to races, where we try to call the stop before the tx is + // dropped. + let _ = get_next_event!(&mut exec_middleware.recv); + assert_eq!(0, exec_middleware.num_tasks()); + + // The broadcast future was dropped, and the operation is no longer active. + // When the operation is not active, either from the tx being finalized or a + // terminal error; the stop method should return an error. + let err = tx_api + .call::<_, serde_json::Value>("transaction_unstable_stop", rpc_params![&operation_id]) + .await + .unwrap_err(); + assert_matches!(err, + Error::JsonRpc(err) if err.code() == json_rpc_spec::INVALID_PARAM_ERROR && err.message() == "Invalid operation id" + ); +} + +#[tokio::test] +async fn tx_stop_with_invalid_operation_id() { + let (_, _, _, tx_api, _, _) = setup_api(Default::default()); + + // Make an invalid stop call. + let err = tx_api + .call::<_, serde_json::Value>("transaction_unstable_stop", ["invalid_operation_id"]) + .await + .unwrap_err(); + assert_matches!(err, + Error::JsonRpc(err) if err.code() == json_rpc_spec::INVALID_PARAM_ERROR && err.message() == "Invalid operation id" + ); +} + +#[tokio::test] +async fn tx_broadcast_resubmits_future_nonce_tx() { + let (api, pool, client_mock, tx_api, mut exec_middleware, mut pool_middleware) = + setup_api(Default::default()); + + // Start at block 1. + let block_1_header = api.push_block(1, vec![], true); + let block_1 = block_1_header.hash(); + + let current_uxt = uxt(Alice, ALICE_NONCE); + let current_xt = hex_string(¤t_uxt.encode()); + // This lives in the future. + let future_uxt = uxt(Alice, ALICE_NONCE + 1); + let future_xt = hex_string(&future_uxt.encode()); + + let future_operation_id: String = tx_api + .call("transaction_unstable_broadcast", rpc_params![&future_xt]) + .await + .unwrap(); + + // Announce block 1 to `transaction_unstable_broadcast`. + client_mock.trigger_import_stream(block_1_header).await; + + // Ensure the tx propagated from `transaction_unstable_broadcast` to the transaction pool. + let event = get_next_event!(&mut pool_middleware); + assert_eq!( + event, + MiddlewarePoolEvent::TransactionStatus { + transaction: future_xt.clone(), + status: TxStatusTypeTest::Future + } + ); + + let event = ChainEvent::NewBestBlock { hash: block_1, tree_route: None }; + pool.inner_pool.maintain(event).await; + assert_eq!(0, pool.inner_pool.status().ready); + // Ensure the tx is in the future. + assert_eq!(1, pool.inner_pool.status().future); + + let block_2_header = api.push_block(2, vec![], true); + let block_2 = block_2_header.hash(); + + let operation_id: String = tx_api + .call("transaction_unstable_broadcast", rpc_params![¤t_xt]) + .await + .unwrap(); + assert_ne!(future_operation_id, operation_id); + + // Announce block 2 to `transaction_unstable_broadcast`. + client_mock.trigger_import_stream(block_2_header).await; + + // Collect the events of both transactions. + let events = get_next_tx_events!(&mut pool_middleware, 2); + // Transactions entered the ready queue. + assert_eq!(events.get(¤t_xt).unwrap(), &vec![TxStatusTypeTest::Ready]); + assert_eq!(events.get(&future_xt).unwrap(), &vec![TxStatusTypeTest::Ready]); + + let event = ChainEvent::NewBestBlock { hash: block_2, tree_route: None }; + pool.inner_pool.maintain(event).await; + assert_eq!(2, pool.inner_pool.status().ready); + assert_eq!(0, pool.inner_pool.status().future); + + // Finalize transactions. + let block_3_header = api.push_block(3, vec![current_uxt, future_uxt], true); + let block_3 = block_3_header.hash(); + client_mock.trigger_import_stream(block_3_header).await; + + let event = ChainEvent::Finalized { hash: block_3, tree_route: Arc::from(vec![]) }; + pool.inner_pool.maintain(event).await; + assert_eq!(0, pool.inner_pool.status().ready); + assert_eq!(0, pool.inner_pool.status().future); + + let events = get_next_tx_events!(&mut pool_middleware, 4); + assert_eq!( + events.get(¤t_xt).unwrap(), + &vec![TxStatusTypeTest::InBlock((block_3, 0)), TxStatusTypeTest::Finalized((block_3, 0))] + ); + assert_eq!( + events.get(&future_xt).unwrap(), + &vec![TxStatusTypeTest::InBlock((block_3, 1)), TxStatusTypeTest::Finalized((block_3, 1))] + ); + + // Both broadcast futures must exit. + let _ = get_next_event!(&mut exec_middleware.recv); + let _ = get_next_event!(&mut exec_middleware.recv); + assert_eq!(0, exec_middleware.num_tasks()); +} + +/// This test is similar to `tx_broadcast_enters_pool` +/// However the last block is announced as finalized to force the +/// broadcast future to exit before the `stop` is called. +#[tokio::test] +async fn tx_broadcast_stop_after_broadcast_finishes() { + let (api, pool, client_mock, tx_api, mut exec_middleware, mut pool_middleware) = + setup_api(Default::default()); + + // Start at block 1. + let block_1_header = api.push_block(1, vec![], true); + + let uxt = uxt(Alice, ALICE_NONCE); + let xt = hex_string(&uxt.encode()); + + let operation_id: String = + tx_api.call("transaction_unstable_broadcast", rpc_params![&xt]).await.unwrap(); + + // Announce block 1 to `transaction_unstable_broadcast`. + client_mock.trigger_import_stream(block_1_header).await; + + // Ensure the tx propagated from `transaction_unstable_broadcast` to the transaction + // pool.inner_pool. + let event = get_next_event!(&mut pool_middleware); + assert_eq!( + event, + MiddlewarePoolEvent::TransactionStatus { + transaction: xt.clone(), + status: TxStatusTypeTest::Ready + } + ); + + assert_eq!(1, pool.inner_pool.status().ready); + assert_eq!(uxt.encode().len(), pool.inner_pool.status().ready_bytes); + + // Import block 2 with the transaction included. + let block_2_header = api.push_block(2, vec![uxt.clone()], true); + let block_2 = block_2_header.hash(); + + // Announce block 2 to the pool.inner_pool. + let event = ChainEvent::Finalized { hash: block_2, tree_route: Arc::from(vec![]) }; + pool.inner_pool.maintain(event).await; + + assert_eq!(0, pool.inner_pool.status().ready); + + let event = get_next_event!(&mut pool_middleware); + assert_eq!( + event, + MiddlewarePoolEvent::TransactionStatus { + transaction: xt.clone(), + status: TxStatusTypeTest::InBlock((block_2, 0)) + } + ); + + let event = get_next_event!(&mut pool_middleware); + assert_eq!( + event, + MiddlewarePoolEvent::TransactionStatus { + transaction: xt.clone(), + status: TxStatusTypeTest::Finalized((block_2, 0)) + } + ); + + // Ensure the broadcast future terminated properly. + let _ = get_next_event!(&mut exec_middleware.recv); + assert_eq!(0, exec_middleware.num_tasks()); + + // The operation ID is no longer valid, check that the broadcast future + // cleared out the inner state of the operation. + let err = tx_api + .call::<_, serde_json::Value>("transaction_unstable_stop", rpc_params![&operation_id]) + .await + .unwrap_err(); + assert_matches!(err, + Error::JsonRpc(err) if err.code() == json_rpc_spec::INVALID_PARAM_ERROR && err.message() == "Invalid operation id" + ); +} + +#[tokio::test] +async fn tx_broadcast_resubmits_invalid_tx() { + let limits = PoolLimit { count: 8192, total_bytes: 20 * 1024 * 1024 }; + let options = Options { + ready: limits.clone(), + future: limits, + reject_future_transactions: false, + // This ensures that a transaction is not banned. + ban_time: std::time::Duration::ZERO, + }; + + let (api, pool, client_mock, tx_api, mut exec_middleware, mut pool_middleware) = + setup_api(options); + + let uxt = uxt(Alice, ALICE_NONCE); + let xt = hex_string(&uxt.encode()); + let _operation_id: String = + tx_api.call("transaction_unstable_broadcast", rpc_params![&xt]).await.unwrap(); + + let block_1_header = api.push_block(1, vec![], true); + let block_1 = block_1_header.hash(); + // Announce block 1 to `transaction_unstable_broadcast`. + client_mock.trigger_import_stream(block_1_header).await; + + // Ensure the tx propagated from `transaction_unstable_broadcast` to the transaction pool. + let event = get_next_event!(&mut pool_middleware); + assert_eq!( + event, + MiddlewarePoolEvent::TransactionStatus { + transaction: xt.clone(), + status: TxStatusTypeTest::Ready, + } + ); + assert_eq!(1, pool.inner_pool.status().ready); + assert_eq!(uxt.encode().len(), pool.inner_pool.status().ready_bytes); + + // Mark the transaction as invalid from the API, causing a temporary ban. + api.add_invalid(&uxt); + + // Push an event to the pool to ensure the transaction is excluded. + let event = ChainEvent::NewBestBlock { hash: block_1, tree_route: None }; + pool.inner_pool.maintain(event).await; + assert_eq!(1, pool.inner_pool.status().ready); + + // Ensure the `transaction_unstable_broadcast` is aware of the invalid transaction. + let event = get_next_event!(&mut pool_middleware); + // Because we have received an `Invalid` status, we try to broadcast the transaction with the + // next announced block. + assert_eq!( + event, + MiddlewarePoolEvent::TransactionStatus { + transaction: xt.clone(), + status: TxStatusTypeTest::Invalid + } + ); + + // Import block 2. + let block_2_header = api.push_block(2, vec![], true); + client_mock.trigger_import_stream(block_2_header).await; + + // Ensure we propagate the temporary ban error to `submit_and_watch`. + // This ensures we'll loop again with the next announced block and try to resubmit the + // transaction. The transaction remains temporarily banned until the pool is maintained. + let event = get_next_event!(&mut pool_middleware); + assert_matches!(event, MiddlewarePoolEvent::PoolError { transaction, err } if transaction == xt && err.contains("Transaction temporarily Banned")); + + // Import block 3. + let block_3_header = api.push_block(3, vec![], true); + let block_3 = block_3_header.hash(); + // Remove the invalid transaction from the pool to allow it to pass through. + api.remove_invalid(&uxt); + let event = ChainEvent::NewBestBlock { hash: block_3, tree_route: None }; + // We have to maintain the pool to ensure the transaction is no longer invalid. + // This clears out the banned transactions. + pool.inner_pool.maintain(event).await; + assert_eq!(0, pool.inner_pool.status().ready); + + // Announce block to `transaction_unstable_broadcast`. + client_mock.trigger_import_stream(block_3_header).await; + + let event = get_next_event!(&mut pool_middleware); + assert_eq!( + event, + MiddlewarePoolEvent::TransactionStatus { + transaction: xt.clone(), + status: TxStatusTypeTest::Ready, + } + ); + assert_eq!(1, pool.inner_pool.status().ready); + + let block_4_header = api.push_block(4, vec![uxt], true); + let block_4 = block_4_header.hash(); + let event = ChainEvent::Finalized { hash: block_4, tree_route: Arc::from(vec![]) }; + pool.inner_pool.maintain(event).await; + + let event = get_next_event!(&mut pool_middleware); + assert_eq!( + event, + MiddlewarePoolEvent::TransactionStatus { + transaction: xt.clone(), + status: TxStatusTypeTest::InBlock((block_4, 0)), + } + ); + let event = get_next_event!(&mut pool_middleware); + assert_eq!( + event, + MiddlewarePoolEvent::TransactionStatus { + transaction: xt.clone(), + status: TxStatusTypeTest::Finalized((block_4, 0)), + } + ); + + // Ensure the broadcast future terminated properly. + let _ = get_next_event!(&mut exec_middleware.recv); + assert_eq!(0, exec_middleware.num_tasks()); +} + +/// This is similar to `tx_broadcast_resubmits_invalid_tx`. +/// However, it forces the tx to be resubmitted because of the pool +/// limits. Which is a different code path than the invalid tx. +#[tokio::test] +async fn tx_broadcast_resubmits_dropped_tx() { + let limits = PoolLimit { count: 1, total_bytes: 1000 }; + let options = Options { + ready: limits.clone(), + future: limits, + reject_future_transactions: false, + // This ensures that a transaction is not banned. + ban_time: std::time::Duration::ZERO, + }; + + let (api, pool, client_mock, tx_api, _, mut pool_middleware) = setup_api(options); + + let current_uxt = uxt(Alice, ALICE_NONCE); + let current_xt = hex_string(¤t_uxt.encode()); + // This lives in the future. + let future_uxt = uxt(Alice, ALICE_NONCE + 1); + let future_xt = hex_string(&future_uxt.encode()); + + // By default the `validate_transaction` mock uses priority 1 for + // transactions. Bump the priority to ensure other transactions + // are immediately dropped. + api.set_priority(¤t_uxt, 10); + + let current_operation_id: String = tx_api + .call("transaction_unstable_broadcast", rpc_params![¤t_xt]) + .await + .unwrap(); + + // Announce block 1 to `transaction_unstable_broadcast`. + let block_1_header = api.push_block(1, vec![], true); + let event = + ChainEvent::Finalized { hash: block_1_header.hash(), tree_route: Arc::from(vec![]) }; + pool.inner_pool.maintain(event).await; + client_mock.trigger_import_stream(block_1_header).await; + + let event = get_next_event!(&mut pool_middleware); + assert_eq!( + event, + MiddlewarePoolEvent::TransactionStatus { + transaction: current_xt.clone(), + status: TxStatusTypeTest::Ready, + } + ); + assert_eq!(1, pool.inner_pool.status().ready); + + // The future tx has priority 2, smaller than the current 10. + api.set_priority(&future_uxt, 2); + let future_operation_id: String = tx_api + .call("transaction_unstable_broadcast", rpc_params![&future_xt]) + .await + .unwrap(); + assert_ne!(current_operation_id, future_operation_id); + + let block_2_header = api.push_block(2, vec![], true); + let event = + ChainEvent::Finalized { hash: block_2_header.hash(), tree_route: Arc::from(vec![]) }; + pool.inner_pool.maintain(event).await; + client_mock.trigger_import_stream(block_2_header).await; + + // We must have at most 1 transaction in the pool, as per limits above. + assert_eq!(1, pool.inner_pool.status().ready); + + let event = get_next_event!(&mut pool_middleware); + assert_eq!( + event, + MiddlewarePoolEvent::PoolError { + transaction: future_xt.clone(), + err: "Transaction couldn't enter the pool because of the limit".into() + } + ); + + let block_3_header = api.push_block(3, vec![current_uxt], true); + let event = + ChainEvent::Finalized { hash: block_3_header.hash(), tree_route: Arc::from(vec![]) }; + pool.inner_pool.maintain(event).await; + client_mock.trigger_import_stream(block_3_header.clone()).await; + + // The first tx is in a finalized block; the future tx must enter the pool. + let events = get_next_tx_events!(&mut pool_middleware, 3); + assert_eq!( + events.get(¤t_xt).unwrap(), + &vec![ + TxStatusTypeTest::InBlock((block_3_header.hash(), 0)), + TxStatusTypeTest::Finalized((block_3_header.hash(), 0)) + ] + ); + // The dropped transaction was resubmitted. + assert_eq!(events.get(&future_xt).unwrap(), &vec![TxStatusTypeTest::Ready]); +} diff --git a/substrate/client/rpc-spec-v2/src/transaction/tests/transaction_tests.rs b/substrate/client/rpc-spec-v2/src/transaction/tests/transaction_tests.rs new file mode 100644 index 0000000000000000000000000000000000000000..c83bc948c437c99e767be09d4f351718140fcb89 --- /dev/null +++ b/substrate/client/rpc-spec-v2/src/transaction/tests/transaction_tests.rs @@ -0,0 +1,151 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +use crate::{ + hex_string, + transaction::{TransactionBlock, TransactionEvent}, +}; +use assert_matches::assert_matches; +use codec::Encode; +use jsonrpsee::rpc_params; +use sc_transaction_pool_api::{ChainEvent, MaintainedTransactionPool}; +use sp_core::H256; +use std::sync::Arc; +use substrate_test_runtime_client::AccountKeyring::*; +use substrate_test_runtime_transaction_pool::uxt; + +// Test helpers. +use crate::transaction::tests::setup::{setup_api_tx, ALICE_NONCE}; + +#[tokio::test] +async fn tx_invalid_bytes() { + let (_api, _pool, _client_mock, tx_api, _exec_middleware, _pool_middleware) = setup_api_tx(); + + // This should not rely on the tx pool state. + let mut sub = tx_api + .subscribe_unbounded("transactionWatch_unstable_submitAndWatch", rpc_params![&"0xdeadbeef"]) + .await + .unwrap(); + + let event: TransactionEvent = get_next_event_sub!(&mut sub); + assert_matches!(event, TransactionEvent::Invalid(_)); +} + +#[tokio::test] +async fn tx_in_finalized() { + let (api, pool, client, tx_api, _exec_middleware, _pool_middleware) = setup_api_tx(); + let block_1_header = api.push_block(1, vec![], true); + client.set_best_block(block_1_header.hash(), 1); + + let uxt = uxt(Alice, ALICE_NONCE); + let xt = hex_string(&uxt.encode()); + + let mut sub = tx_api + .subscribe_unbounded("transactionWatch_unstable_submitAndWatch", rpc_params![&xt]) + .await + .unwrap(); + + let event: TransactionEvent = get_next_event_sub!(&mut sub); + assert_eq!(event, TransactionEvent::Validated); + + // Import block 2 with the transaction included. + let block_2_header = api.push_block(2, vec![uxt.clone()], true); + let block_2 = block_2_header.hash(); + + // Announce block 2 to the pool. + let event = ChainEvent::NewBestBlock { hash: block_2, tree_route: None }; + pool.inner_pool.maintain(event).await; + let event = ChainEvent::Finalized { hash: block_2, tree_route: Arc::from(vec![]) }; + pool.inner_pool.maintain(event).await; + + let event: TransactionEvent = get_next_event_sub!(&mut sub); + assert_eq!( + event, + TransactionEvent::BestChainBlockIncluded(Some(TransactionBlock { + hash: block_2, + index: 0 + })) + ); + let event: TransactionEvent = get_next_event_sub!(&mut sub); + assert_eq!(event, TransactionEvent::Finalized(TransactionBlock { hash: block_2, index: 0 })); +} + +#[tokio::test] +async fn tx_with_pruned_best_block() { + let (api, pool, client, tx_api, _exec_middleware, _pool_middleware) = setup_api_tx(); + let block_1_header = api.push_block(1, vec![], true); + client.set_best_block(block_1_header.hash(), 1); + + let uxt = uxt(Alice, ALICE_NONCE); + let xt = hex_string(&uxt.encode()); + + let mut sub = tx_api + .subscribe_unbounded("transactionWatch_unstable_submitAndWatch", rpc_params![&xt]) + .await + .unwrap(); + + let event: TransactionEvent = get_next_event_sub!(&mut sub); + assert_eq!(event, TransactionEvent::Validated); + + // Import block 2 with the transaction included. + let block_2_header = api.push_block(2, vec![uxt.clone()], true); + let block_2 = block_2_header.hash(); + let event = ChainEvent::NewBestBlock { hash: block_2, tree_route: None }; + pool.inner_pool.maintain(event).await; + + let event: TransactionEvent = get_next_event_sub!(&mut sub); + assert_eq!( + event, + TransactionEvent::BestChainBlockIncluded(Some(TransactionBlock { + hash: block_2, + index: 0 + })) + ); + + // Import block 2 again without the transaction included. + let block_2_header = api.push_block(2, vec![], true); + let block_2 = block_2_header.hash(); + let event = ChainEvent::NewBestBlock { hash: block_2, tree_route: None }; + pool.inner_pool.maintain(event).await; + + let event: TransactionEvent = get_next_event_sub!(&mut sub); + assert_eq!(event, TransactionEvent::BestChainBlockIncluded(None)); + + let block_2_header = api.push_block(2, vec![uxt.clone()], true); + let block_2 = block_2_header.hash(); + let event = ChainEvent::NewBestBlock { hash: block_2, tree_route: None }; + pool.inner_pool.maintain(event).await; + + // The tx is validated again against the new block. + let event: TransactionEvent = get_next_event_sub!(&mut sub); + assert_eq!(event, TransactionEvent::Validated); + + let event: TransactionEvent = get_next_event_sub!(&mut sub); + assert_eq!( + event, + TransactionEvent::BestChainBlockIncluded(Some(TransactionBlock { + hash: block_2, + index: 0 + })) + ); + + let event = ChainEvent::Finalized { hash: block_2, tree_route: Arc::from(vec![]) }; + pool.inner_pool.maintain(event).await; + let event: TransactionEvent = get_next_event_sub!(&mut sub); + assert_eq!(event, TransactionEvent::Finalized(TransactionBlock { hash: block_2, index: 0 })); +} diff --git a/substrate/client/rpc-spec-v2/src/transaction/transaction.rs b/substrate/client/rpc-spec-v2/src/transaction/transaction.rs index b2cfa36c9c99f7bd3db5072e8adaabd1c6fed962..6a7c69b8f7d1e765d0ce64ff590e191e97935d30 100644 --- a/substrate/client/rpc-spec-v2/src/transaction/transaction.rs +++ b/substrate/client/rpc-spec-v2/src/transaction/transaction.rs @@ -22,28 +22,24 @@ use crate::{ transaction::{ api::TransactionApiServer, error::Error, - event::{ - TransactionBlock, TransactionBroadcasted, TransactionDropped, TransactionError, - TransactionEvent, - }, + event::{TransactionBlock, TransactionDropped, TransactionError, TransactionEvent}, }, SubscriptionTaskExecutor, }; -use jsonrpsee::{core::async_trait, types::error::ErrorObject, PendingSubscriptionSink}; +use codec::Decode; +use futures::{StreamExt, TryFutureExt}; +use jsonrpsee::{core::async_trait, PendingSubscriptionSink}; +use sc_rpc::utils::{pipe_from_stream, to_sub_message}; use sc_transaction_pool_api::{ error::IntoPoolError, BlockHash, TransactionFor, TransactionPool, TransactionSource, TransactionStatus, }; -use std::sync::Arc; - -use sc_rpc::utils::pipe_from_stream; -use sp_api::ProvideRuntimeApi; use sp_blockchain::HeaderBackend; use sp_core::Bytes; use sp_runtime::traits::Block as BlockT; +use std::sync::Arc; -use codec::Decode; -use futures::{StreamExt, TryFutureExt}; +pub(crate) const LOG_TARGET: &str = "rpc-spec-v2"; /// An API for transaction RPC calls. pub struct Transaction { @@ -69,37 +65,34 @@ impl Transaction { /// some unique transactions via RPC and have them included in the pool. const TX_SOURCE: TransactionSource = TransactionSource::External; -/// Extrinsic has an invalid format. -/// -/// # Note -/// -/// This is similar to the old `author` API error code. -const BAD_FORMAT: i32 = 1001; - #[async_trait] impl TransactionApiServer> for Transaction where Pool: TransactionPool + Sync + Send + 'static, Pool::Hash: Unpin, ::Hash: Unpin, - Client: HeaderBackend + ProvideRuntimeApi + Send + Sync + 'static, + Client: HeaderBackend + Send + Sync + 'static, { fn submit_and_watch(&self, pending: PendingSubscriptionSink, xt: Bytes) { let client = self.client.clone(); let pool = self.pool.clone(); let fut = async move { - // This is the only place where the RPC server can return an error for this - // subscription. Other defects must be signaled as events to the sink. let decoded_extrinsic = match TransactionFor::::decode(&mut &xt[..]) { Ok(decoded_extrinsic) => decoded_extrinsic, Err(e) => { - let err = ErrorObject::owned( - BAD_FORMAT, - format!("Extrinsic has invalid format: {}", e), - None::<()>, + log::debug!(target: LOG_TARGET, "Extrinsic bytes cannot be decoded: {:?}", e); + + let Ok(sink) = pending.accept().await else { return }; + + // The transaction is invalid. + let msg = to_sub_message( + &sink, + &TransactionEvent::Invalid::>(TransactionError { + error: "Extrinsic bytes cannot be decoded".into(), + }), ); - let _ = pending.reject(err).await; + let _ = sink.send(msg).await; return }, }; @@ -116,9 +109,7 @@ where match submit.await { Ok(stream) => { - let mut state = TransactionState::new(); - let stream = - stream.filter_map(move |event| async move { state.handle_event(event) }); + let stream = stream.filter_map(move |event| async move { handle_event(event) }); pipe_from_stream(pending, stream.boxed()).await; }, Err(err) => { @@ -134,66 +125,34 @@ where } } -/// The transaction's state that needs to be preserved between -/// multiple events generated by the transaction-pool. -/// -/// # Note -/// -/// In the future, the RPC server can submit only the last event when multiple -/// identical events happen in a row. -#[derive(Clone, Copy)] -struct TransactionState { - /// True if the transaction was previously broadcasted. - broadcasted: bool, -} - -impl TransactionState { - /// Construct a new [`TransactionState`]. - pub fn new() -> Self { - TransactionState { broadcasted: false } - } - - /// Handle events generated by the transaction-pool and convert them - /// to the new API expected state. - #[inline] - pub fn handle_event( - &mut self, - event: TransactionStatus, - ) -> Option> { - match event { - TransactionStatus::Ready | TransactionStatus::Future => - Some(TransactionEvent::::Validated), - TransactionStatus::Broadcast(peers) => { - // Set the broadcasted flag once if we submitted the transaction to - // at least one peer. - self.broadcasted = self.broadcasted || !peers.is_empty(); - - Some(TransactionEvent::Broadcasted(TransactionBroadcasted { - num_peers: peers.len(), - })) - }, - TransactionStatus::InBlock((hash, index)) => - Some(TransactionEvent::BestChainBlockIncluded(Some(TransactionBlock { - hash, - index, - }))), - TransactionStatus::Retracted(_) => Some(TransactionEvent::BestChainBlockIncluded(None)), - TransactionStatus::FinalityTimeout(_) => - Some(TransactionEvent::Dropped(TransactionDropped { - broadcasted: self.broadcasted, - error: "Maximum number of finality watchers has been reached".into(), - })), - TransactionStatus::Finalized((hash, index)) => - Some(TransactionEvent::Finalized(TransactionBlock { hash, index })), - TransactionStatus::Usurped(_) => Some(TransactionEvent::Invalid(TransactionError { - error: "Extrinsic was rendered invalid by another extrinsic".into(), - })), - TransactionStatus::Dropped => Some(TransactionEvent::Invalid(TransactionError { - error: "Extrinsic dropped from the pool due to exceeding limits".into(), - })), - TransactionStatus::Invalid => Some(TransactionEvent::Invalid(TransactionError { - error: "Extrinsic marked as invalid".into(), +/// Handle events generated by the transaction-pool and convert them +/// to the new API expected state. +#[inline] +pub fn handle_event( + event: TransactionStatus, +) -> Option> { + match event { + TransactionStatus::Ready | TransactionStatus::Future => + Some(TransactionEvent::::Validated), + TransactionStatus::InBlock((hash, index)) => + Some(TransactionEvent::BestChainBlockIncluded(Some(TransactionBlock { hash, index }))), + TransactionStatus::Retracted(_) => Some(TransactionEvent::BestChainBlockIncluded(None)), + TransactionStatus::FinalityTimeout(_) => + Some(TransactionEvent::Dropped(TransactionDropped { + error: "Maximum number of finality watchers has been reached".into(), })), - } + TransactionStatus::Finalized((hash, index)) => + Some(TransactionEvent::Finalized(TransactionBlock { hash, index })), + TransactionStatus::Usurped(_) => Some(TransactionEvent::Invalid(TransactionError { + error: "Extrinsic was rendered invalid by another extrinsic".into(), + })), + TransactionStatus::Dropped => Some(TransactionEvent::Dropped(TransactionDropped { + error: "Extrinsic dropped from the pool due to exceeding limits".into(), + })), + TransactionStatus::Invalid => Some(TransactionEvent::Invalid(TransactionError { + error: "Extrinsic marked as invalid".into(), + })), + // These are the events that are not supported by the new API. + TransactionStatus::Broadcast(_) => None, } } diff --git a/substrate/client/rpc-spec-v2/src/transaction/transaction_broadcast.rs b/substrate/client/rpc-spec-v2/src/transaction/transaction_broadcast.rs new file mode 100644 index 0000000000000000000000000000000000000000..6eaf50d6b2e2822d766f4f131f4bd6f1ba04d5cd --- /dev/null +++ b/substrate/client/rpc-spec-v2/src/transaction/transaction_broadcast.rs @@ -0,0 +1,251 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +//! API implementation for broadcasting transactions. + +use crate::{transaction::api::TransactionBroadcastApiServer, SubscriptionTaskExecutor}; +use codec::Decode; +use futures::{FutureExt, Stream, StreamExt}; +use futures_util::stream::AbortHandle; +use jsonrpsee::core::{async_trait, RpcResult}; +use parking_lot::RwLock; +use rand::{distributions::Alphanumeric, Rng}; +use sc_client_api::BlockchainEvents; +use sc_transaction_pool_api::{ + error::IntoPoolError, TransactionFor, TransactionPool, TransactionSource, +}; +use sp_blockchain::HeaderBackend; +use sp_core::Bytes; +use sp_runtime::traits::Block as BlockT; +use std::{collections::HashMap, sync::Arc}; + +use super::error::ErrorBroadcast; + +/// An API for transaction RPC calls. +pub struct TransactionBroadcast { + /// Substrate client. + client: Arc, + /// Transactions pool. + pool: Arc, + /// Executor to spawn subscriptions. + executor: SubscriptionTaskExecutor, + /// The broadcast operation IDs. + broadcast_ids: Arc>>, +} + +/// The state of a broadcast operation. +struct BroadcastState { + /// Handle to abort the running future that broadcasts the transaction. + handle: AbortHandle, +} + +impl TransactionBroadcast { + /// Creates a new [`TransactionBroadcast`]. + pub fn new(client: Arc, pool: Arc, executor: SubscriptionTaskExecutor) -> Self { + TransactionBroadcast { client, pool, executor, broadcast_ids: Default::default() } + } + + /// Generate an unique operation ID for the `transaction_broadcast` RPC method. + pub fn generate_unique_id(&self) -> String { + let generate_operation_id = || { + // The length of the operation ID. + const OPERATION_ID_LEN: usize = 16; + + rand::thread_rng() + .sample_iter(Alphanumeric) + .take(OPERATION_ID_LEN) + .map(char::from) + .collect::() + }; + + let mut id = generate_operation_id(); + + let broadcast_ids = self.broadcast_ids.read(); + + while broadcast_ids.contains_key(&id) { + id = generate_operation_id(); + } + + id + } +} + +/// Currently we treat all RPC transactions as externals. +/// +/// Possibly in the future we could allow opt-in for special treatment +/// of such transactions, so that the block authors can inject +/// some unique transactions via RPC and have them included in the pool. +const TX_SOURCE: TransactionSource = TransactionSource::External; + +#[async_trait] +impl TransactionBroadcastApiServer for TransactionBroadcast +where + Pool: TransactionPool + Sync + Send + 'static, + Pool::Error: IntoPoolError, + ::Hash: Unpin, + Client: HeaderBackend + BlockchainEvents + Send + Sync + 'static, +{ + fn broadcast(&self, bytes: Bytes) -> RpcResult> { + let pool = self.pool.clone(); + + // The unique ID of this operation. + let id = self.generate_unique_id(); + + let mut best_block_import_stream = + Box::pin(self.client.import_notification_stream().filter_map( + |notification| async move { notification.is_new_best.then_some(notification.hash) }, + )); + + let broadcast_transaction_fut = async move { + // There is nothing we could do with an extrinsic of invalid format. + let Ok(decoded_extrinsic) = TransactionFor::::decode(&mut &bytes[..]) else { + return; + }; + + // Flag to determine if the we should broadcast the transaction again. + let mut is_done = false; + + while !is_done { + // Wait for the last block to become available. + let Some(best_block_hash) = + last_stream_element(&mut best_block_import_stream).await + else { + return; + }; + + let mut stream = match pool + .submit_and_watch(best_block_hash, TX_SOURCE, decoded_extrinsic.clone()) + .await + { + Ok(stream) => stream, + // The transaction was not included to the pool. + Err(e) => { + let Ok(pool_err) = e.into_pool_error() else { return }; + + if pool_err.is_retriable() { + // Try to resubmit the transaction at a later block for + // recoverable errors. + continue + } else { + return; + } + }, + }; + + while let Some(event) = stream.next().await { + // Check if the transaction could be submitted again + // at a later time. + if event.is_retriable() { + break; + } + + // Stop if this is the final event of the transaction stream + // and the event is not retriable. + if event.is_final() { + is_done = true; + break; + } + } + } + }; + + // Convert the future into an abortable future, for easily terminating it from the + // `transaction_stop` method. + let (fut, handle) = futures::future::abortable(broadcast_transaction_fut); + let broadcast_ids = self.broadcast_ids.clone(); + let drop_id = id.clone(); + // The future expected by the executor must be `Future` instead of + // `Future>`. + let fut = fut.map(move |_| { + // Remove the entry from the broadcast IDs map. + broadcast_ids.write().remove(&drop_id); + }); + + // Keep track of this entry and the abortable handle. + { + let mut broadcast_ids = self.broadcast_ids.write(); + broadcast_ids.insert(id.clone(), BroadcastState { handle }); + } + + sc_rpc::utils::spawn_subscription_task(&self.executor, fut); + + Ok(Some(id)) + } + + fn stop_broadcast(&self, operation_id: String) -> Result<(), ErrorBroadcast> { + let mut broadcast_ids = self.broadcast_ids.write(); + + let Some(broadcast_state) = broadcast_ids.remove(&operation_id) else { + return Err(ErrorBroadcast::InvalidOperationID) + }; + + broadcast_state.handle.abort(); + + Ok(()) + } +} + +/// Returns the last element of the provided stream, or `None` if the stream is closed. +async fn last_stream_element(stream: &mut S) -> Option +where + S: Stream + Unpin, +{ + let Some(mut element) = stream.next().await else { return None }; + + // We are effectively polling the stream for the last available item at this time. + // The `now_or_never` returns `None` if the stream is `Pending`. + // + // If the stream contains `Hash0x1 Hash0x2 Hash0x3 Hash0x4`, we want only `Hash0x4`. + while let Some(next) = stream.next().now_or_never() { + let Some(next) = next else { + // Nothing to do if the stream terminated. + return None + }; + element = next; + } + + Some(element) +} + +#[cfg(test)] +mod tests { + use super::*; + use tokio_stream::wrappers::ReceiverStream; + + #[tokio::test] + async fn check_last_stream_element() { + let (tx, rx) = tokio::sync::mpsc::channel(16); + + let mut stream = ReceiverStream::new(rx); + // Check the stream with one element queued. + tx.send(1).await.unwrap(); + assert_eq!(last_stream_element(&mut stream).await, Some(1)); + + // Check the stream with multiple elements. + tx.send(1).await.unwrap(); + tx.send(2).await.unwrap(); + tx.send(3).await.unwrap(); + assert_eq!(last_stream_element(&mut stream).await, Some(3)); + + // Drop the stream with some elements + tx.send(1).await.unwrap(); + tx.send(2).await.unwrap(); + drop(tx); + assert_eq!(last_stream_element(&mut stream).await, None); + } +} diff --git a/substrate/client/rpc/Cargo.toml b/substrate/client/rpc/Cargo.toml index 6917eb0b551a98253c7908b353d8c40a581ff3b7..dff34215b025c26fa3e6f4fa2949dcd0d2e4203a 100644 --- a/substrate/client/rpc/Cargo.toml +++ b/substrate/client/rpc/Cargo.toml @@ -17,11 +17,11 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1" } -futures = "0.3.21" -jsonrpsee = { version = "0.20.3", features = ["server"] } -log = "0.4.17" +futures = "0.3.30" +jsonrpsee = { version = "0.22", features = ["server"] } +log = { workspace = true, default-features = true } parking_lot = "0.12.1" -serde_json = "1.0.111" +serde_json = { workspace = true, default-features = true } sc-block-builder = { path = "../block-builder" } sc-chain-spec = { path = "../chain-spec" } sc-client-api = { path = "../api" } @@ -40,10 +40,10 @@ sp-runtime = { path = "../../primitives/runtime" } sp-session = { path = "../../primitives/session" } sp-version = { path = "../../primitives/version" } sp-statement-store = { path = "../../primitives/statement-store" } -tokio = "1.22.0" +tokio = "1.37" [dev-dependencies] -env_logger = "0.9" +env_logger = "0.11" assert_matches = "1.3.0" sc-block-builder = { path = "../block-builder" } sc-network = { path = "../network" } @@ -51,7 +51,7 @@ sc-network-common = { path = "../network/common" } sc-transaction-pool = { path = "../transaction-pool" } sp-consensus = { path = "../../primitives/consensus/common" } sp-crypto-hashing = { path = "../../primitives/crypto/hashing" } -tokio = "1.22.0" +tokio = "1.37" sp-io = { path = "../../primitives/io" } substrate-test-runtime-client = { path = "../../test-utils/runtime/client" } pretty_assertions = "1.2.1" diff --git a/substrate/client/rpc/src/author/tests.rs b/substrate/client/rpc/src/author/tests.rs index 471016a015da124e839c65e54e73d58ad3ff22a4..937870eb53fd9b2ec4800c8eca343bb111560eef 100644 --- a/substrate/client/rpc/src/author/tests.rs +++ b/substrate/client/rpc/src/author/tests.rs @@ -21,10 +21,7 @@ use super::*; use crate::testing::{test_executor, timeout_secs}; use assert_matches::assert_matches; use codec::Encode; -use jsonrpsee::{ - core::{EmptyServerParams as EmptyParams, Error as RpcError}, - RpcModule, -}; +use jsonrpsee::{core::EmptyServerParams as EmptyParams, MethodsError as RpcError, RpcModule}; use sc_transaction_pool::{BasicPool, FullChainApi}; use sc_transaction_pool_api::TransactionStatus; use sp_core::{ @@ -103,7 +100,7 @@ async fn author_submit_transaction_should_not_cause_error() { assert_matches!( api.call::<_, H256>("author_submitExtrinsic", [xt]).await, - Err(RpcError::Call(err)) if err.message().contains("Already Imported") && err.code() == 1013 + Err(RpcError::JsonRpc(err)) if err.message().contains("Already Imported") && err.code() == 1013 ); } @@ -160,7 +157,7 @@ async fn author_should_return_watch_validation_error() { assert_matches!( failed_sub, - Err(RpcError::Call(err)) if err.message().contains("Invalid Transaction") && err.code() == 1010 + Err(RpcError::JsonRpc(err)) if err.message().contains("Invalid Transaction") && err.code() == 1010 ); } @@ -276,7 +273,7 @@ async fn author_has_session_keys() { assert_matches!( api.call::<_, bool>("author_hasSessionKeys", vec![Bytes::from(vec![1, 2, 3])]).await, - Err(RpcError::Call(err)) if err.message().contains("Session keys are not encoded correctly") + Err(RpcError::JsonRpc(err)) if err.message().contains("Session keys are not encoded correctly") ); } diff --git a/substrate/client/rpc/src/dev/tests.rs b/substrate/client/rpc/src/dev/tests.rs index 5eb4897056cc438cc06bc3332056681136f82a9e..e8f9ba4990d255789cda8c92c17f71cca924399f 100644 --- a/substrate/client/rpc/src/dev/tests.rs +++ b/substrate/client/rpc/src/dev/tests.rs @@ -100,7 +100,7 @@ async fn deny_unsafe_works() { let (resp, _) = api.raw_json_request(&request, 1).await.expect("Raw calls should succeed"); assert_eq!( - resp.result, + resp, r#"{"jsonrpc":"2.0","error":{"code":-32601,"message":"RPC call is unsafe to be called externally"},"id":1}"# ); } diff --git a/substrate/client/rpc/src/state/tests.rs b/substrate/client/rpc/src/state/tests.rs index 25a34faed9a66c2cedadedfc1b71a397f37c4131..dd866e671c5095dca9b5851111340a4e32f71e67 100644 --- a/substrate/client/rpc/src/state/tests.rs +++ b/substrate/client/rpc/src/state/tests.rs @@ -21,7 +21,7 @@ use super::*; use crate::testing::{test_executor, timeout_secs}; use assert_matches::assert_matches; use futures::executor; -use jsonrpsee::core::{EmptyServerParams as EmptyParams, Error as RpcError}; +use jsonrpsee::{core::EmptyServerParams as EmptyParams, MethodsError as RpcError}; use sc_block_builder::BlockBuilderBuilder; use sc_rpc_api::DenyUnsafe; use sp_consensus::BlockOrigin; @@ -475,7 +475,7 @@ async fn should_return_runtime_version() { // it is basically json-encoded substrate_test_runtime_client::runtime::VERSION let result = "{\"specName\":\"test\",\"implName\":\"parity-test\",\"authoringVersion\":1,\ - \"specVersion\":2,\"implVersion\":2,\"apis\":[[\"0xdf6acb689907609b\",4],\ + \"specVersion\":2,\"implVersion\":2,\"apis\":[[\"0xdf6acb689907609b\",5],\ [\"0x37e397fc7c91f5e4\",2],[\"0xd2bc9897eed08f15\",3],[\"0x40fe3ad401f8959a\",6],\ [\"0xbc9d89904f5b923f\",1],[\"0xc6e9a76309f39b09\",2],[\"0xdd718d5cc53262d4\",1],\ [\"0xcbca25e39f142387\",2],[\"0xf78b278be53f454c\",2],[\"0xab3c0572291feb8b\",1],\ @@ -525,7 +525,7 @@ async fn wildcard_storage_subscriptions_are_rpc_unsafe() { let api_rpc = api.into_rpc(); let err = api_rpc.subscribe_unbounded("state_subscribeStorage", EmptyParams::new()).await; - assert_matches!(err, Err(RpcError::Call(e)) if e.message() == "RPC call is unsafe to be called externally"); + assert_matches!(err, Err(RpcError::JsonRpc(e)) if e.message() == "RPC call is unsafe to be called externally"); } #[tokio::test] diff --git a/substrate/client/rpc/src/statement/mod.rs b/substrate/client/rpc/src/statement/mod.rs index b4f432bbbb0e3485a67447fb34669bf980602868..e99135aec38c6fb61dc667535b6fe9e0f458f6e3 100644 --- a/substrate/client/rpc/src/statement/mod.rs +++ b/substrate/client/rpc/src/statement/mod.rs @@ -89,7 +89,7 @@ impl StatementApiServer for StatementStore { fn submit(&self, encoded: Bytes) -> RpcResult<()> { let statement = Decode::decode(&mut &*encoded) - .map_err(|e| Error::StatementStore(format!("Eror decoding statement: {:?}", e)))?; + .map_err(|e| Error::StatementStore(format!("Error decoding statement: {:?}", e)))?; match self.store.submit(statement, StatementSource::Local) { SubmitResult::New(_) | SubmitResult::Known => Ok(()), // `KnownExpired` should not happen. Expired statements submitted with diff --git a/substrate/client/rpc/src/system/tests.rs b/substrate/client/rpc/src/system/tests.rs index 21d13ccfafaa7fc46d6726966f66aa14f96fc595..03967c63523c79610009b0edb4ac4e6618b99040 100644 --- a/substrate/client/rpc/src/system/tests.rs +++ b/substrate/client/rpc/src/system/tests.rs @@ -19,10 +19,7 @@ use super::{helpers::SyncState, *}; use assert_matches::assert_matches; use futures::prelude::*; -use jsonrpsee::{ - core::{EmptyServerParams as EmptyParams, Error as RpcError}, - RpcModule, -}; +use jsonrpsee::{core::EmptyServerParams as EmptyParams, MethodsError as RpcError, RpcModule}; use sc_network::{self, config::Role, PeerId}; use sc_rpc_api::system::helpers::PeerInfo; use sc_utils::mpsc::tracing_unbounded; @@ -311,7 +308,7 @@ async fn system_network_add_reserved() { let bad_peer_id = ["/ip4/198.51.100.19/tcp/30333"]; assert_matches!( api(None).call::<_, ()>("system_addReservedPeer", bad_peer_id).await, - Err(RpcError::Call(err)) if err.message().contains("Peer id is missing from the address") + Err(RpcError::JsonRpc(err)) if err.message().contains("Peer id is missing from the address") ); } @@ -327,7 +324,7 @@ async fn system_network_remove_reserved() { assert_matches!( api(None).call::<_, String>("system_removeReservedPeer", bad_peer_id).await, - Err(RpcError::Call(err)) if err.message().contains("base-58 decode error: provided string contained invalid character '/' at byte 0") + Err(RpcError::JsonRpc(err)) if err.message().contains("base-58 decode error: provided string contained invalid character '/' at byte 0") ); } #[tokio::test] diff --git a/substrate/client/rpc/src/utils.rs b/substrate/client/rpc/src/utils.rs index b5ae4a2b6bc7fed26be4faf7c6ae9383dfdabd5f..6ec48efef846c719db4e009b3a14926db0577d5f 100644 --- a/substrate/client/rpc/src/utils.rs +++ b/substrate/client/rpc/src/utils.rs @@ -80,7 +80,7 @@ where Either::Left((Ok(sink), _)) => break sink, Either::Right((Some(msg), f)) => { if buf.push_back(msg).is_err() { - log::warn!(target: "rpc", "Subscription::accept failed buffer limit={} exceed; dropping subscription", buf.max_cap); + log::warn!(target: "rpc", "Subscription::accept failed buffer limit={} exceeded; dropping subscription", buf.max_cap); return } accept_fut = f; @@ -125,7 +125,13 @@ async fn inner_pipe_from_stream( // New item from the stream Either::Right((Either::Right((Some(v), n)), c)) => { if buf.push_back(v).is_err() { - log::warn!(target: "rpc", "Subscription buffer limit={} exceed; dropping subscription", buf.max_cap); + log::warn!( + target: "rpc", + "Subscription buffer limit={} exceeded for subscription={} conn_id={}; dropping subscription", + buf.max_cap, + sink.method_name(), + sink.connection_id() + ); return } diff --git a/substrate/client/service/Cargo.toml b/substrate/client/service/Cargo.toml index 1c95112aa6b0e714eeb0ea4cc24c76a026bf60b4..b93196e86f1d3674b2894a21783e269831a27656 100644 --- a/substrate/client/service/Cargo.toml +++ b/substrate/client/service/Cargo.toml @@ -28,17 +28,17 @@ runtime-benchmarks = [ ] [dependencies] -jsonrpsee = { version = "0.20.3", features = ["server"] } -thiserror = "1.0.48" -futures = "0.3.21" +jsonrpsee = { version = "0.22", features = ["server"] } +thiserror = { workspace = true } +futures = "0.3.30" rand = "0.8.5" parking_lot = "0.12.1" -log = "0.4.17" +log = { workspace = true, default-features = true } futures-timer = "3.0.1" exit-future = "0.2.0" pin-project = "1.0.12" -serde = "1.0.195" -serde_json = "1.0.111" +serde = { workspace = true, default-features = true } +serde_json = { workspace = true, default-features = true } sc-keystore = { path = "../keystore" } sp-runtime = { path = "../../primitives/runtime" } sp-trie = { path = "../../primitives/trie" } @@ -54,10 +54,10 @@ sp-consensus = { path = "../../primitives/consensus/common" } sc-consensus = { path = "../consensus/common" } sp-storage = { path = "../../primitives/storage" } sc-network = { path = "../network" } -sc-network-bitswap = { path = "../network/bitswap" } sc-network-common = { path = "../network/common" } sc-network-light = { path = "../network/light" } sc-network-sync = { path = "../network/sync" } +sc-network-types = { path = "../network/types" } sc-network-transactions = { path = "../network/transactions" } sc-chain-spec = { path = "../chain-spec" } sc-client-api = { path = "../api" } @@ -79,11 +79,12 @@ sc-tracing = { path = "../tracing" } sc-sysinfo = { path = "../sysinfo" } tracing = "0.1.29" tracing-futures = { version = "0.2.4" } -async-trait = "0.1.74" +async-trait = "0.1.79" tokio = { version = "1.22.0", features = ["parking_lot", "rt-multi-thread", "time"] } tempfile = "3.1.0" directories = "5.0.1" static_init = "1.0.3" +schnellru = "0.2.1" [dev-dependencies] substrate-test-runtime-client = { path = "../../test-utils/runtime/client" } diff --git a/substrate/client/service/src/builder.rs b/substrate/client/service/src/builder.rs index 31d63c6a81d3a4df2e6eca32260a64f577712aa9..830f9884719dcf1fd1b024906f830b18a154a323 100644 --- a/substrate/client/service/src/builder.rs +++ b/substrate/client/service/src/builder.rs @@ -43,10 +43,12 @@ use sc_executor::{ use sc_keystore::LocalKeystore; use sc_network::{ config::{FullNetworkConfiguration, SyncMode}, - peer_store::PeerStore, - NetworkService, NetworkStateInfo, NetworkStatusProvider, + service::{ + traits::{PeerStore, RequestResponseConfig}, + NotificationMetrics, + }, + NetworkBackend, NetworkStateInfo, }; -use sc_network_bitswap::BitswapRequestHandler; use sc_network_common::role::Roles; use sc_network_light::light_client_requests::handler::LightClientRequestHandler; use sc_network_sync::{ @@ -64,7 +66,9 @@ use sc_rpc::{ DenyUnsafe, SubscriptionTaskExecutor, }; use sc_rpc_spec_v2::{ - archive::ArchiveApiServer, chain_head::ChainHeadApiServer, transaction::TransactionApiServer, + archive::ArchiveApiServer, + chain_head::ChainHeadApiServer, + transaction::{TransactionApiServer, TransactionBroadcastApiServer}, }; use sc_telemetry::{telemetry, ConnectionMessage, Telemetry, TelemetryHandle, SUBSTRATE_INFO}; use sc_transaction_pool_api::{MaintainedTransactionPool, TransactionPool}; @@ -340,19 +344,6 @@ where ) } -/// Shared network instance implementing a set of mandatory traits. -pub trait SpawnTaskNetwork: - NetworkStateInfo + NetworkStatusProvider + Send + Sync + 'static -{ -} - -impl SpawnTaskNetwork for T -where - Block: BlockT, - T: NetworkStateInfo + NetworkStatusProvider + Send + Sync + 'static, -{ -} - /// Parameters to pass into `build`. pub struct SpawnTasksParams<'a, TBl: BlockT, TCl, TExPool, TRpc, Backend> { /// The service configuration. @@ -371,7 +362,7 @@ pub struct SpawnTasksParams<'a, TBl: BlockT, TCl, TExPool, TRpc, Backend> { pub rpc_builder: Box Result, Error>>, /// A shared network instance. - pub network: Arc>, + pub network: Arc, /// A Sender for RPC requests. pub system_rpc_tx: TracingUnboundedSender>, /// Controller for transactions handlers @@ -653,6 +644,13 @@ where (chain, state, child_state) }; + let transaction_broadcast_rpc_v2 = sc_rpc_spec_v2::transaction::TransactionBroadcast::new( + client.clone(), + transaction_pool.clone(), + task_executor.clone(), + ) + .into_rpc(); + let transaction_v2 = sc_rpc_spec_v2::transaction::Transaction::new( client.clone(), transaction_pool.clone(), @@ -708,6 +706,9 @@ where // Part of the RPC v2 spec. rpc_api.merge(transaction_v2).map_err(|e| Error::Application(e.into()))?; + rpc_api + .merge(transaction_broadcast_rpc_v2) + .map_err(|e| Error::Application(e.into()))?; rpc_api.merge(chain_head_v2).map_err(|e| Error::Application(e.into()))?; // Part of the old RPC spec. @@ -724,11 +725,18 @@ where } /// Parameters to pass into `build_network`. -pub struct BuildNetworkParams<'a, TBl: BlockT, TExPool, TImpQu, TCl> { +pub struct BuildNetworkParams< + 'a, + TBl: BlockT, + TNet: NetworkBackend::Hash>, + TExPool, + TImpQu, + TCl, +> { /// The service configuration. pub config: &'a Configuration, /// Full network configuration. - pub net_config: FullNetworkConfiguration, + pub net_config: FullNetworkConfiguration::Hash, TNet>, /// A shared client returned by `new_full_parts`. pub client: Arc, /// A shared transaction pool. @@ -744,15 +752,17 @@ pub struct BuildNetworkParams<'a, TBl: BlockT, TExPool, TImpQu, TCl> { pub warp_sync_params: Option>, /// User specified block relay params. If not specified, the default /// block request handler will be used. - pub block_relay: Option>, + pub block_relay: Option>, + /// Metrics. + pub metrics: NotificationMetrics, } /// Build the network service, the network status sinks and an RPC sender. -pub fn build_network( - params: BuildNetworkParams, +pub fn build_network( + params: BuildNetworkParams, ) -> Result< ( - Arc::Hash>>, + Arc, TracingUnboundedSender>, sc_network_transactions::TransactionsHandlerController<::Hash>, NetworkStarter, @@ -773,6 +783,7 @@ where + 'static, TExPool: TransactionPool::Hash> + 'static, TImpQu: ImportQueue + 'static, + TNet: NetworkBackend::Hash>, { let BuildNetworkParams { config, @@ -784,6 +795,7 @@ where block_announce_validator_builder, warp_sync_params, block_relay, + metrics, } = params; if warp_sync_params.is_none() && config.network.sync_mode.is_warp() { @@ -818,7 +830,7 @@ where None => { // Custom protocol was not specified, use the default block handler. // Allow both outgoing and incoming requests. - let params = BlockRequestHandler::new( + let params = BlockRequestHandler::new::( chain_sync_network_handle.clone(), &protocol_id, config.chain_spec.fork_id(), @@ -837,13 +849,13 @@ where let num_peer_hint = net_config.network_config.default_peers_set_num_full as usize + net_config.network_config.default_peers_set.reserved_nodes.len(); // Allow both outgoing and incoming requests. - let (handler, protocol_config) = StateRequestHandler::new( + let (handler, protocol_config) = StateRequestHandler::new::( &protocol_id, config.chain_spec.fork_id(), client.clone(), num_peer_hint, ); - let config_name = protocol_config.name.clone(); + let config_name = protocol_config.protocol_name().clone(); spawn_handle.spawn("state-request-handler", Some("networking"), handler.run()); (protocol_config, config_name) @@ -852,13 +864,13 @@ where let (warp_sync_protocol_config, warp_request_protocol_name) = match warp_sync_params.as_ref() { Some(WarpSyncParams::WithProvider(warp_with_provider)) => { // Allow both outgoing and incoming requests. - let (handler, protocol_config) = WarpSyncRequestHandler::new( + let (handler, protocol_config) = WarpSyncRequestHandler::new::<_, TNet>( protocol_id.clone(), genesis_hash, config.chain_spec.fork_id(), warp_with_provider.clone(), ); - let config_name = protocol_config.name.clone(); + let config_name = protocol_config.protocol_name().clone(); spawn_handle.spawn("warp-sync-request-handler", Some("networking"), handler.run()); (Some(protocol_config), Some(config_name)) @@ -868,7 +880,7 @@ where let light_client_request_protocol_config = { // Allow both outgoing and incoming requests. - let (handler, protocol_config) = LightClientRequestHandler::new( + let (handler, protocol_config) = LightClientRequestHandler::new::( &protocol_id, config.chain_spec.fork_id(), client.clone(), @@ -886,30 +898,27 @@ where net_config.add_request_response_protocol(config); } - if config.network.ipfs_server { - let (handler, protocol_config) = BitswapRequestHandler::new(client.clone()); - spawn_handle.spawn("bitswap-request-handler", Some("networking"), handler.run()); - net_config.add_request_response_protocol(protocol_config); - } + let bitswap_config = config.network.ipfs_server.then(|| { + let (handler, config) = TNet::bitswap_server(client.clone()); + spawn_handle.spawn("bitswap-request-handler", Some("networking"), handler); + + config + }); // create transactions protocol and add it to the list of supported protocols of + let peer_store_handle = net_config.peer_store_handle(); let (transactions_handler_proto, transactions_config) = - sc_network_transactions::TransactionsHandlerPrototype::new( + sc_network_transactions::TransactionsHandlerPrototype::new::<_, TBl, TNet>( protocol_id.clone(), genesis_hash, config.chain_spec.fork_id(), + metrics.clone(), + Arc::clone(&peer_store_handle), ); net_config.add_notification_protocol(transactions_config); - // Create `PeerStore` and initialize it with bootnode peer ids. - let peer_store = PeerStore::new( - net_config - .network_config - .boot_nodes - .iter() - .map(|bootnode| bootnode.peer_id) - .collect(), - ); + // Start task for `PeerStore` + let peer_store = net_config.take_peer_store(); let peer_store_handle = peer_store.handle(); spawn_handle.spawn("peer-store", Some("networking"), peer_store.run()); @@ -917,6 +926,7 @@ where Roles::from(&config.role), client.clone(), config.prometheus_config.as_ref().map(|config| config.registry.clone()).as_ref(), + metrics.clone(), &net_config, protocol_id.clone(), &config.chain_spec.fork_id().map(ToOwned::to_owned), @@ -927,13 +937,13 @@ where block_downloader, state_request_protocol_name, warp_request_protocol_name, - peer_store_handle.clone(), + Arc::clone(&peer_store_handle), )?; let sync_service_import_queue = sync_service.clone(); let sync_service = Arc::new(sync_service); let genesis_hash = client.hash(Zero::zero()).ok().flatten().expect("Genesis block exists; qed"); - let network_params = sc_network::config::Params:: { + let network_params = sc_network::config::Params::::Hash, TNet> { role: config.role.clone(), executor: { let spawn_handle = Clone::clone(&spawn_handle); @@ -942,17 +952,18 @@ where }) }, network_config: net_config, - peer_store: peer_store_handle, genesis_hash, protocol_id: protocol_id.clone(), fork_id: config.chain_spec.fork_id().map(ToOwned::to_owned), metrics_registry: config.prometheus_config.as_ref().map(|config| config.registry.clone()), block_announce_config, + bitswap_config, + notification_metrics: metrics, }; let has_bootnodes = !network_params.network_config.network_config.boot_nodes.is_empty(); - let network_mut = sc_network::NetworkWorker::new(network_params)?; - let network = network_mut.service().clone(); + let network_mut = TNet::new(network_params)?; + let network = network_mut.network_service().clone(); let (tx_handler, tx_handler_controller) = transactions_handler_proto.build( network.clone(), @@ -960,12 +971,16 @@ where Arc::new(TransactionPoolAdapter { pool: transaction_pool, client: client.clone() }), config.prometheus_config.as_ref().map(|config| &config.registry), )?; - spawn_handle.spawn("network-transactions-handler", Some("networking"), tx_handler.run()); + spawn_handle.spawn_blocking( + "network-transactions-handler", + Some("networking"), + tx_handler.run(), + ); spawn_handle.spawn_blocking( "chain-sync-network-service-provider", Some("networking"), - chain_sync_network_provider.run(network.clone()), + chain_sync_network_provider.run(Arc::new(network.clone())), ); spawn_handle.spawn("import-queue", None, import_queue.run(Box::new(sync_service_import_queue))); spawn_handle.spawn_blocking("syncing", None, engine.run()); @@ -974,9 +989,9 @@ where spawn_handle.spawn( "system-rpc-handler", Some("networking"), - build_system_rpc_future( + build_system_rpc_future::<_, _, ::Hash>( config.role.clone(), - network_mut.service().clone(), + network_mut.network_service(), sync_service.clone(), client.clone(), system_rpc_rx, @@ -984,18 +999,22 @@ where ), ); - let future = - build_network_future(network_mut, client, sync_service.clone(), config.announce_block); + let future = build_network_future::<_, _, ::Hash, _>( + network_mut, + client, + sync_service.clone(), + config.announce_block, + ); // TODO: Normally, one is supposed to pass a list of notifications protocols supported by the // node through the `NetworkConfiguration` struct. But because this function doesn't know in // advance which components, such as GrandPa or Polkadot, will be plugged on top of the - // service, it is unfortunately not possible to do so without some deep refactoring. To bypass - // this problem, the `NetworkService` provides a `register_notifications_protocol` method that - // can be called even after the network has been initialized. However, we want to avoid the - // situation where `register_notifications_protocol` is called *after* the network actually - // connects to other peers. For this reason, we delay the process of the network future until - // the user calls `NetworkStarter::start_network`. + // service, it is unfortunately not possible to do so without some deep refactoring. To + // bypass this problem, the `NetworkService` provides a `register_notifications_protocol` + // method that can be called even after the network has been initialized. However, we want to + // avoid the situation where `register_notifications_protocol` is called *after* the network + // actually connects to other peers. For this reason, we delay the process of the network + // future until the user calls `NetworkStarter::start_network`. // // This entire hack should eventually be removed in favour of passing the list of protocols // through the configuration. diff --git a/substrate/client/service/src/chain_ops/import_blocks.rs b/substrate/client/service/src/chain_ops/import_blocks.rs index 34f7669d0106e2065c3b08f7816a002c9d1175ae..661fc09a8f19e55c38bec280b7ce399a8dbe2e29 100644 --- a/substrate/client/service/src/chain_ops/import_blocks.rs +++ b/substrate/client/service/src/chain_ops/import_blocks.rs @@ -73,7 +73,7 @@ where reader: CodecIoReader, }, Json { - // Nubmer of blocks we have decoded thus far. + // Number of blocks we have decoded thus far. read_block_count: u64, // Stream to the data, used for decoding new blocks. reader: StreamDeserializer<'static, JsonIoRead, SignedBlock>, diff --git a/substrate/client/service/src/client/client.rs b/substrate/client/service/src/client/client.rs index aa9c1b80a29a95bd77efbda35620c132b624bd9b..35e8b53a09cf2d802a0c4a873f7ecb8099764e83 100644 --- a/substrate/client/service/src/client/client.rs +++ b/substrate/client/service/src/client/client.rs @@ -19,8 +19,8 @@ //! Substrate Client use super::block_rules::{BlockRules, LookupResult as BlockLookupResult}; -use futures::{FutureExt, StreamExt}; -use log::{error, info, trace, warn}; +use crate::client::notification_pinning::NotificationPinningWorker; +use log::{debug, info, trace, warn}; use parking_lot::{Mutex, RwLock}; use prometheus_endpoint::Registry; use rand::Rng; @@ -38,7 +38,7 @@ use sc_client_api::{ execution_extensions::ExecutionExtensions, notifications::{StorageEventStream, StorageNotifications}, CallExecutor, ExecutorProvider, KeysIter, OnFinalityAction, OnImportAction, PairsIter, - ProofProvider, UsageProvider, + ProofProvider, UnpinWorkerMessage, UsageProvider, }; use sc_consensus::{ BlockCheckParams, BlockImportParams, ForkChoiceStrategy, ImportResult, StateAction, @@ -114,7 +114,7 @@ where block_rules: BlockRules, config: ClientConfig, telemetry: Option, - unpin_worker_sender: TracingUnboundedSender, + unpin_worker_sender: TracingUnboundedSender>, _phantom: PhantomData, } @@ -326,19 +326,35 @@ where // dropped, the block will be unpinned automatically. if let Some(ref notification) = finality_notification { if let Err(err) = self.backend.pin_block(notification.hash) { - error!( + debug!( "Unable to pin block for finality notification. hash: {}, Error: {}", notification.hash, err ); - }; + } else { + let _ = self + .unpin_worker_sender + .unbounded_send(UnpinWorkerMessage::AnnouncePin(notification.hash)) + .map_err(|e| { + log::error!( + "Unable to send AnnouncePin worker message for finality: {e}" + ) + }); + } } if let Some(ref notification) = import_notification { if let Err(err) = self.backend.pin_block(notification.hash) { - error!( + debug!( "Unable to pin block for import notification. hash: {}, Error: {}", notification.hash, err ); + } else { + let _ = self + .unpin_worker_sender + .unbounded_send(UnpinWorkerMessage::AnnouncePin(notification.hash)) + .map_err(|e| { + log::error!("Unable to send AnnouncePin worker message for import: {e}") + }); }; } @@ -416,25 +432,12 @@ where backend.commit_operation(op)?; } - let (unpin_worker_sender, mut rx) = - tracing_unbounded::("unpin-worker-channel", 10_000); - let task_backend = Arc::downgrade(&backend); - spawn_handle.spawn( - "unpin-worker", - None, - async move { - while let Some(message) = rx.next().await { - if let Some(backend) = task_backend.upgrade() { - backend.unpin_block(message); - } else { - log::debug!("Terminating unpin-worker, backend reference was dropped."); - return - } - } - log::debug!("Terminating unpin-worker, stream terminated.") - } - .boxed(), + let (unpin_worker_sender, rx) = tracing_unbounded::>( + "notification-pinning-worker-channel", + 10_000, ); + let unpin_worker = NotificationPinningWorker::new(rx, backend.clone()); + spawn_handle.spawn("notification-pinning-worker", None, Box::pin(unpin_worker.run())); Ok(Client { backend, @@ -675,8 +678,10 @@ where // This is use by fast sync for runtime version to be resolvable from // changes. - let state_version = - resolve_state_version_from_wasm(&storage, &self.executor)?; + let state_version = resolve_state_version_from_wasm::<_, HashingFor>( + &storage, + &self.executor, + )?; let state_root = operation.op.reset_storage(storage, state_version)?; if state_root != *import_headers.post().state_root() { // State root mismatch when importing state. This should not happen in diff --git a/substrate/client/service/src/client/mod.rs b/substrate/client/service/src/client/mod.rs index a13fd4317e1553d379ea068c516e74072d3c8c95..0703cc2b47d144d4e67418cfb9966cd1cd209392 100644 --- a/substrate/client/service/src/client/mod.rs +++ b/substrate/client/service/src/client/mod.rs @@ -47,6 +47,7 @@ mod block_rules; mod call_executor; mod client; +mod notification_pinning; mod wasm_override; mod wasm_substitutes; diff --git a/substrate/client/service/src/client/notification_pinning.rs b/substrate/client/service/src/client/notification_pinning.rs new file mode 100644 index 0000000000000000000000000000000000000000..80de91c02f1ae0273d42edc79d442aa312d09356 --- /dev/null +++ b/substrate/client/service/src/client/notification_pinning.rs @@ -0,0 +1,353 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +//! Notification pinning related logic. +//! +//! This file contains a worker that should be started when a new client instance is created. +//! The goal is to avoid pruning of blocks that have active notifications in the node. Every +//! recipient of notifications should receive the chance to act upon them. In addition, notification +//! listeners can hold onto a [`sc_client_api::UnpinHandle`] to keep a block pinned. Once the handle +//! is dropped, a message is sent and the worker unpins the respective block. +use std::{ + marker::PhantomData, + sync::{Arc, Weak}, +}; + +use futures::StreamExt; +use sc_client_api::{Backend, UnpinWorkerMessage}; + +use sc_utils::mpsc::TracingUnboundedReceiver; +use schnellru::Limiter; +use sp_runtime::traits::Block as BlockT; + +const LOG_TARGET: &str = "db::notification_pinning"; +const NOTIFICATION_PINNING_LIMIT: usize = 1024; + +/// A limiter which automatically unpins blocks that leave the data structure. +#[derive(Clone, Debug)] +struct UnpinningByLengthLimiter> { + max_length: usize, + backend: Weak, + _phantom: PhantomData, +} + +impl> UnpinningByLengthLimiter { + /// Creates a new length limiter with a given `max_length`. + pub fn new(max_length: usize, backend: Weak) -> UnpinningByLengthLimiter { + UnpinningByLengthLimiter { max_length, backend, _phantom: PhantomData::::default() } + } +} + +impl> Limiter + for UnpinningByLengthLimiter +{ + type KeyToInsert<'a> = Block::Hash; + type LinkType = usize; + + fn is_over_the_limit(&self, length: usize) -> bool { + length > self.max_length + } + + fn on_insert( + &mut self, + _length: usize, + key: Self::KeyToInsert<'_>, + value: u32, + ) -> Option<(Block::Hash, u32)> { + log::debug!(target: LOG_TARGET, "Pinning block based on notification. hash = {key}"); + if self.max_length > 0 { + Some((key, value)) + } else { + None + } + } + + fn on_replace( + &mut self, + _length: usize, + _old_key: &mut Block::Hash, + _new_key: Block::Hash, + _old_value: &mut u32, + _new_value: &mut u32, + ) -> bool { + true + } + + fn on_removed(&mut self, key: &mut Block::Hash, references: &mut u32) { + // If reference count was larger than 0 on removal, + // the item was removed due to capacity limitations. + // Since the cache should be large enough for pinned items, + // we want to know about these evictions. + if *references > 0 { + log::warn!( + target: LOG_TARGET, + "Notification block pinning limit reached. Unpinning block with hash = {key:?}" + ); + if let Some(backend) = self.backend.upgrade() { + (0..*references).for_each(|_| backend.unpin_block(*key)); + } + } else { + log::trace!( + target: LOG_TARGET, + "Unpinned block. hash = {key:?}", + ) + } + } + + fn on_cleared(&mut self) {} + + fn on_grow(&mut self, _new_memory_usage: usize) -> bool { + true + } +} + +/// Worker for the handling of notification pinning. +/// +/// It receives messages from a receiver and pins/unpins based on the incoming messages. +/// All notification related unpinning should go through this worker. If the maximum number of +/// notification pins is reached, the block from the oldest notification is unpinned. +pub struct NotificationPinningWorker> { + unpin_message_rx: TracingUnboundedReceiver>, + task_backend: Weak, + pinned_blocks: schnellru::LruMap>, +} + +impl> NotificationPinningWorker { + /// Creates a new `NotificationPinningWorker`. + pub fn new( + unpin_message_rx: TracingUnboundedReceiver>, + task_backend: Arc, + ) -> Self { + let pinned_blocks = + schnellru::LruMap::>::new( + UnpinningByLengthLimiter::new( + NOTIFICATION_PINNING_LIMIT, + Arc::downgrade(&task_backend), + ), + ); + Self { unpin_message_rx, task_backend: Arc::downgrade(&task_backend), pinned_blocks } + } + + fn handle_announce_message(&mut self, hash: Block::Hash) { + if let Some(entry) = self.pinned_blocks.get_or_insert(hash, Default::default) { + *entry = *entry + 1; + } + } + + fn handle_unpin_message(&mut self, hash: Block::Hash) -> Result<(), ()> { + if let Some(refcount) = self.pinned_blocks.peek_mut(&hash) { + *refcount = *refcount - 1; + if *refcount == 0 { + self.pinned_blocks.remove(&hash); + } + if let Some(backend) = self.task_backend.upgrade() { + log::debug!(target: LOG_TARGET, "Reducing pinning refcount for block hash = {hash:?}"); + backend.unpin_block(hash); + } else { + log::debug!(target: LOG_TARGET, "Terminating unpin-worker, backend reference was dropped."); + return Err(()) + } + } else { + log::debug!(target: LOG_TARGET, "Received unpin message for already unpinned block. hash = {hash:?}"); + } + Ok(()) + } + + /// Start working on the received messages. + /// + /// The worker maintains a map which keeps track of the pinned blocks and their reference count. + /// Depending upon the received message, it acts to pin/unpin the block. + pub async fn run(mut self) { + while let Some(message) = self.unpin_message_rx.next().await { + match message { + UnpinWorkerMessage::AnnouncePin(hash) => self.handle_announce_message(hash), + UnpinWorkerMessage::Unpin(hash) => + if self.handle_unpin_message(hash).is_err() { + return + }, + } + } + log::debug!(target: LOG_TARGET, "Terminating unpin-worker, stream terminated.") + } +} + +#[cfg(test)] +mod tests { + use std::sync::Arc; + + use sc_client_api::{Backend, UnpinWorkerMessage}; + use sc_utils::mpsc::{tracing_unbounded, TracingUnboundedReceiver}; + use sp_core::H256; + use sp_runtime::traits::Block as BlockT; + + type Block = substrate_test_runtime_client::runtime::Block; + + use super::{NotificationPinningWorker, UnpinningByLengthLimiter}; + + impl> NotificationPinningWorker { + fn new_with_limit( + unpin_message_rx: TracingUnboundedReceiver>, + task_backend: Arc, + limit: usize, + ) -> Self { + let pinned_blocks = + schnellru::LruMap::>::new( + UnpinningByLengthLimiter::new(limit, Arc::downgrade(&task_backend)), + ); + Self { unpin_message_rx, task_backend: Arc::downgrade(&task_backend), pinned_blocks } + } + + fn lru( + &self, + ) -> &schnellru::LruMap> { + &self.pinned_blocks + } + } + + #[test] + fn pinning_worker_handles_base_case() { + let (_tx, rx) = tracing_unbounded("testing", 1000); + + let backend = Arc::new(sc_client_api::in_mem::Backend::::new()); + + let hash = H256::random(); + + let mut worker = NotificationPinningWorker::new(rx, backend.clone()); + + // Block got pinned and unpin message should unpin in the backend. + let _ = backend.pin_block(hash); + assert_eq!(backend.pin_refs(&hash), Some(1)); + + worker.handle_announce_message(hash); + assert_eq!(worker.lru().len(), 1); + + let _ = worker.handle_unpin_message(hash); + + assert_eq!(backend.pin_refs(&hash), Some(0)); + assert!(worker.lru().is_empty()); + } + + #[test] + fn pinning_worker_handles_multiple_pins() { + let (_tx, rx) = tracing_unbounded("testing", 1000); + + let backend = Arc::new(sc_client_api::in_mem::Backend::::new()); + + let hash = H256::random(); + + let mut worker = NotificationPinningWorker::new(rx, backend.clone()); + // Block got pinned multiple times. + let _ = backend.pin_block(hash); + let _ = backend.pin_block(hash); + let _ = backend.pin_block(hash); + assert_eq!(backend.pin_refs(&hash), Some(3)); + + worker.handle_announce_message(hash); + worker.handle_announce_message(hash); + worker.handle_announce_message(hash); + assert_eq!(worker.lru().len(), 1); + + let _ = worker.handle_unpin_message(hash); + assert_eq!(backend.pin_refs(&hash), Some(2)); + let _ = worker.handle_unpin_message(hash); + assert_eq!(backend.pin_refs(&hash), Some(1)); + let _ = worker.handle_unpin_message(hash); + assert_eq!(backend.pin_refs(&hash), Some(0)); + assert!(worker.lru().is_empty()); + + let _ = worker.handle_unpin_message(hash); + assert_eq!(backend.pin_refs(&hash), Some(0)); + } + + #[test] + fn pinning_worker_handles_too_many_unpins() { + let (_tx, rx) = tracing_unbounded("testing", 1000); + + let backend = Arc::new(sc_client_api::in_mem::Backend::::new()); + + let hash = H256::random(); + let hash2 = H256::random(); + + let mut worker = NotificationPinningWorker::new(rx, backend.clone()); + // Block was announced once but unpinned multiple times. The worker should ignore the + // additional unpins. + let _ = backend.pin_block(hash); + let _ = backend.pin_block(hash); + let _ = backend.pin_block(hash); + assert_eq!(backend.pin_refs(&hash), Some(3)); + + worker.handle_announce_message(hash); + assert_eq!(worker.lru().len(), 1); + + let _ = worker.handle_unpin_message(hash); + assert_eq!(backend.pin_refs(&hash), Some(2)); + let _ = worker.handle_unpin_message(hash); + assert_eq!(backend.pin_refs(&hash), Some(2)); + assert!(worker.lru().is_empty()); + + let _ = worker.handle_unpin_message(hash2); + assert!(worker.lru().is_empty()); + assert_eq!(backend.pin_refs(&hash2), None); + } + + #[test] + fn pinning_worker_should_evict_when_limit_reached() { + let (_tx, rx) = tracing_unbounded("testing", 1000); + + let backend = Arc::new(sc_client_api::in_mem::Backend::::new()); + + let hash1 = H256::random(); + let hash2 = H256::random(); + let hash3 = H256::random(); + let hash4 = H256::random(); + + // Only two items fit into the cache. + let mut worker = NotificationPinningWorker::new_with_limit(rx, backend.clone(), 2); + + // Multiple blocks are announced but the cache size is too small. We expect that blocks + // are evicted by the cache and unpinned in the backend. + let _ = backend.pin_block(hash1); + let _ = backend.pin_block(hash2); + let _ = backend.pin_block(hash3); + assert_eq!(backend.pin_refs(&hash1), Some(1)); + assert_eq!(backend.pin_refs(&hash2), Some(1)); + assert_eq!(backend.pin_refs(&hash3), Some(1)); + + worker.handle_announce_message(hash1); + assert!(worker.lru().peek(&hash1).is_some()); + worker.handle_announce_message(hash2); + assert!(worker.lru().peek(&hash2).is_some()); + worker.handle_announce_message(hash3); + assert!(worker.lru().peek(&hash3).is_some()); + assert!(worker.lru().peek(&hash2).is_some()); + assert_eq!(worker.lru().len(), 2); + + // Hash 1 should have gotten unpinned, since its oldest. + assert_eq!(backend.pin_refs(&hash1), Some(0)); + assert_eq!(backend.pin_refs(&hash2), Some(1)); + assert_eq!(backend.pin_refs(&hash3), Some(1)); + + // Hash 2 is getting bumped. + worker.handle_announce_message(hash2); + assert_eq!(worker.lru().peek(&hash2), Some(&2)); + + // Since hash 2 was accessed, evict hash 3. + worker.handle_announce_message(hash4); + assert_eq!(worker.lru().peek(&hash3), None); + } +} diff --git a/substrate/client/service/src/config.rs b/substrate/client/service/src/config.rs index 3e68f5b58defc40b802b359e68b116a1fd734e15..59e307d7f93b529f37ab457dd6bfe0b312065444 100644 --- a/substrate/client/service/src/config.rs +++ b/substrate/client/service/src/config.rs @@ -18,6 +18,7 @@ //! Service configuration. +pub use jsonrpsee::server::BatchRequestConfig as RpcBatchRequestConfig; use prometheus_endpoint::Registry; use sc_chain_spec::ChainSpec; pub use sc_client_db::{BlocksPruning, Database, DatabaseSource, PruningMode}; @@ -39,6 +40,7 @@ use sp_core::crypto::SecretString; use std::{ io, iter, net::SocketAddr, + num::NonZeroU32, path::{Path, PathBuf}, }; use tempfile::TempDir; @@ -102,6 +104,10 @@ pub struct Configuration { pub rpc_port: u16, /// The number of messages the JSON-RPC server is allowed to keep in memory. pub rpc_message_buffer_capacity: u32, + /// JSON-RPC server batch config. + pub rpc_batch_config: RpcBatchRequestConfig, + /// RPC rate limit per minute. + pub rpc_rate_limit: Option, /// Prometheus endpoint configuration. `None` if disabled. pub prometheus_config: Option, /// Telemetry service URL. `None` if disabled. @@ -230,7 +236,7 @@ impl Configuration { ProtocolId::from(protocol_id_full) } - /// Returns true if the genesis state writting will be skipped while initializing the genesis + /// Returns true if the genesis state writing will be skipped while initializing the genesis /// block. pub fn no_genesis(&self) -> bool { matches!(self.network.sync_mode, SyncMode::LightState { .. } | SyncMode::Warp { .. }) diff --git a/substrate/client/service/src/lib.rs b/substrate/client/service/src/lib.rs index a76e1544bfbb9882f34e5a465f20b4671160fe87..e46cfab50a3ebdcb4e6eb8f746ec27751cd77847 100644 --- a/substrate/client/service/src/lib.rs +++ b/substrate/client/service/src/lib.rs @@ -38,13 +38,15 @@ use std::{collections::HashMap, net::SocketAddr}; use codec::{Decode, Encode}; use futures::{pin_mut, FutureExt, StreamExt}; -use jsonrpsee::{core::Error as JsonRpseeError, RpcModule}; +use jsonrpsee::RpcModule; use log::{debug, error, warn}; use sc_client_api::{blockchain::HeaderBackend, BlockBackend, BlockchainEvents, ProofProvider}; use sc_network::{ - config::MultiaddrWithPeerId, NetworkBlock, NetworkPeers, NetworkStateInfo, PeerId, + config::MultiaddrWithPeerId, service::traits::NetworkService, NetworkBackend, NetworkBlock, + NetworkPeers, NetworkStateInfo, }; use sc_network_sync::SyncingService; +use sc_network_types::PeerId; use sc_utils::mpsc::TracingUnboundedReceiver; use sp_blockchain::HeaderMetadata; use sp_consensus::SyncOracle; @@ -109,17 +111,14 @@ impl RpcHandlers { pub async fn rpc_query( &self, json_query: &str, - ) -> Result<(String, tokio::sync::mpsc::Receiver), JsonRpseeError> { + ) -> Result<(String, tokio::sync::mpsc::Receiver), serde_json::Error> { // Because `tokio::sync::mpsc::channel` is used under the hood // it will panic if it's set to usize::MAX. // // This limit is used to prevent panics and is large enough. const TOKIO_MPSC_MAX_SIZE: usize = tokio::sync::Semaphore::MAX_PERMITS; - self.0 - .raw_json_request(json_query, TOKIO_MPSC_MAX_SIZE) - .await - .map(|(method_res, recv)| (method_res.result, recv)) + self.0.raw_json_request(json_query, TOKIO_MPSC_MAX_SIZE).await } /// Provides access to the underlying `RpcModule` @@ -160,8 +159,9 @@ async fn build_network_future< + Sync + 'static, H: sc_network_common::ExHashT, + N: NetworkBackend::Hash>, >( - network: sc_network::NetworkWorker, + network: N, client: Arc, sync_service: Arc>, announce_imported_blocks: bool, @@ -228,7 +228,7 @@ pub async fn build_system_rpc_future< H: sc_network_common::ExHashT, >( role: Role, - network_service: Arc>, + network_service: Arc, sync_service: Arc>, client: Arc, mut rpc_rx: TracingUnboundedReceiver>, @@ -313,14 +313,12 @@ pub async fn build_system_rpc_future< }; }, sc_rpc::system::Request::NetworkReservedPeers(sender) => { - let reserved_peers = network_service.reserved_peers().await; - if let Ok(reserved_peers) = reserved_peers { - let reserved_peers = - reserved_peers.iter().map(|peer_id| peer_id.to_base58()).collect(); - let _ = sender.send(reserved_peers); - } else { - break - } + let Ok(reserved_peers) = network_service.reserved_peers().await else { + break; + }; + + let _ = + sender.send(reserved_peers.iter().map(|peer_id| peer_id.to_base58()).collect()); }, sc_rpc::system::Request::NodeRoles(sender) => { use sc_rpc::system::NodeRole; @@ -396,6 +394,7 @@ where let server_config = sc_rpc_server::Config { addrs: [addr, backup_addr], + batch_config: config.rpc_batch_config, max_connections: config.rpc_max_connections, max_payload_in_mb: config.rpc_max_request_size, max_payload_out_mb: config.rpc_max_response_size, @@ -406,6 +405,7 @@ where id_provider: rpc_id_provider, cors: config.rpc_cors.as_ref(), tokio_handle: config.tokio_handle.clone(), + rate_limit: config.rpc_rate_limit, }; // TODO: https://github.com/paritytech/substrate/issues/13773 diff --git a/substrate/client/service/test/Cargo.toml b/substrate/client/service/test/Cargo.toml index 625d8286396e7778dd7271db772d143550dc6b5e..2de984689badbacae254c7a596e996baa491dda5 100644 --- a/substrate/client/service/test/Cargo.toml +++ b/substrate/client/service/test/Cargo.toml @@ -18,8 +18,8 @@ targets = ["x86_64-unknown-linux-gnu"] async-channel = "1.8.0" array-bytes = "6.1" fdlimit = "0.3.0" -futures = "0.3.21" -log = "0.4.17" +futures = "0.3.30" +log = { workspace = true, default-features = true } parity-scale-codec = "3.6.1" parking_lot = "0.12.1" tempfile = "3.1.0" diff --git a/substrate/client/service/test/src/client/mod.rs b/substrate/client/service/test/src/client/mod.rs index ba83bec8276eb3b4f7b09ff9a5717343b3f5e59e..51dcc4966e58838a4055f59ff033e16010c1d585 100644 --- a/substrate/client/service/test/src/client/mod.rs +++ b/substrate/client/service/test/src/client/mod.rs @@ -2226,11 +2226,11 @@ fn reorg_triggers_a_notification_even_for_sources_that_should_not_trigger_notifi #[test] fn use_dalek_ext_works() { fn zero_ed_pub() -> sp_core::ed25519::Public { - sp_core::ed25519::Public([0u8; 32]) + sp_core::ed25519::Public::default() } fn zero_ed_sig() -> sp_core::ed25519::Signature { - sp_core::ed25519::Signature::from_raw([0u8; 64]) + sp_core::ed25519::Signature::default() } let mut client = TestClientBuilder::new().build(); diff --git a/substrate/client/service/test/src/lib.rs b/substrate/client/service/test/src/lib.rs index 9b88300bf53048502f2579891886f2832ba6d530..b9abd8446f7dd6b24f12813b6716d4697f2bdf19 100644 --- a/substrate/client/service/test/src/lib.rs +++ b/substrate/client/service/test/src/lib.rs @@ -29,7 +29,7 @@ use sc_network::{ use sc_network_sync::SyncingService; use sc_service::{ client::Client, - config::{BasePath, DatabaseSource, KeystoreConfig}, + config::{BasePath, DatabaseSource, KeystoreConfig, RpcBatchRequestConfig}, BlocksPruning, ChainSpecExtension, Configuration, Error, GenericChainSpec, Role, RuntimeGenesis, SpawnTaskHandle, TaskManager, }; @@ -73,9 +73,7 @@ pub trait TestNetNode: Clone + Future> + Send + 'stat fn client(&self) -> Arc>; fn transaction_pool(&self) -> Arc; - fn network( - &self, - ) -> Arc::Hash>>; + fn network(&self) -> Arc; fn sync(&self) -> &Arc>; fn spawn_handle(&self) -> SpawnTaskHandle; } @@ -84,7 +82,7 @@ pub struct TestNetComponents { task_manager: Arc>, client: Arc>, transaction_pool: Arc, - network: Arc::Hash>>, + network: Arc, sync: Arc>, } @@ -94,7 +92,7 @@ impl pub fn new( task_manager: TaskManager, client: Arc>, - network: Arc::Hash>>, + network: Arc, sync: Arc>, transaction_pool: Arc, ) -> Self { @@ -153,9 +151,7 @@ where fn transaction_pool(&self) -> Arc { self.transaction_pool.clone() } - fn network( - &self, - ) -> Arc::Hash>> { + fn network(&self) -> Arc { self.network.clone() } fn sync(&self) -> &Arc> { @@ -254,6 +250,8 @@ fn node_config< rpc_max_subs_per_conn: Default::default(), rpc_port: 9944, rpc_message_buffer_capacity: Default::default(), + rpc_batch_config: RpcBatchRequestConfig::Unlimited, + rpc_rate_limit: None, prometheus_config: None, telemetry_endpoints: None, default_heap_pages: None, diff --git a/substrate/client/state-db/Cargo.toml b/substrate/client/state-db/Cargo.toml index 3f86a0da88e4244573d43e19997ed6dadd05767f..400dda20c223443687292315b4974e5125570553 100644 --- a/substrate/client/state-db/Cargo.toml +++ b/substrate/client/state-db/Cargo.toml @@ -17,6 +17,6 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", features = ["derive"] } -log = "0.4.17" +log = { workspace = true, default-features = true } parking_lot = "0.12.1" sp-core = { path = "../../primitives/core" } diff --git a/substrate/client/state-db/src/lib.rs b/substrate/client/state-db/src/lib.rs index 41c231c31aafbc6453fa4343640c27b733174c28..6c37c87a611b1288c6aecc4b79b4a3e159e2b9dd 100644 --- a/substrate/client/state-db/src/lib.rs +++ b/substrate/client/state-db/src/lib.rs @@ -872,7 +872,7 @@ mod tests { fn check_stored_and_requested_mode_compatibility( mode_when_created: Option, mode_when_reopened: Option, - expected_effective_mode_when_reopenned: Result, + expected_effective_mode_when_reopened: Result, ) { let mut db = make_db(&[]); let (state_db_init, state_db) = @@ -883,7 +883,7 @@ mod tests { let state_db_reopen_result = StateDb::::open(db.clone(), mode_when_reopened, false, false); - if let Ok(expected_mode) = expected_effective_mode_when_reopenned { + if let Ok(expected_mode) = expected_effective_mode_when_reopened { let (state_db_init, state_db_reopened) = state_db_reopen_result.unwrap(); db.commit(&state_db_init); assert_eq!(state_db_reopened.pruning_mode(), expected_mode,) diff --git a/substrate/client/state-db/src/noncanonical.rs b/substrate/client/state-db/src/noncanonical.rs index bdbe8318371ce8239158f4f728a7313e107db879..4492a7bd077df02c6feb111051273742ef79604b 100644 --- a/substrate/client/state-db/src/noncanonical.rs +++ b/substrate/client/state-db/src/noncanonical.rs @@ -46,26 +46,26 @@ pub struct NonCanonicalOverlay { #[cfg_attr(test, derive(PartialEq, Debug))] struct OverlayLevel { blocks: Vec>, - used_indicies: u64, // Bitmask of available journal indicies. + used_indices: u64, // Bitmask of available journal indices. } impl OverlayLevel { fn push(&mut self, overlay: BlockOverlay) { - self.used_indicies |= 1 << overlay.journal_index; + self.used_indices |= 1 << overlay.journal_index; self.blocks.push(overlay) } fn available_index(&self) -> u64 { - self.used_indicies.trailing_ones() as u64 + self.used_indices.trailing_ones() as u64 } fn remove(&mut self, index: usize) -> BlockOverlay { - self.used_indicies &= !(1 << self.blocks[index].journal_index); + self.used_indices &= !(1 << self.blocks[index].journal_index); self.blocks.remove(index) } fn new() -> OverlayLevel { - OverlayLevel { blocks: Vec::new(), used_indicies: 0 } + OverlayLevel { blocks: Vec::new(), used_indices: 0 } } } diff --git a/substrate/client/statement-store/Cargo.toml b/substrate/client/statement-store/Cargo.toml index ed2292593790afbb61a20d588cda84c502189c7a..8ca6d11dbe0dc786929925a90a40b5035f2607be 100644 --- a/substrate/client/statement-store/Cargo.toml +++ b/substrate/client/statement-store/Cargo.toml @@ -16,7 +16,7 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -log = "0.4.17" +log = { workspace = true, default-features = true } parking_lot = "0.12.1" parity-db = "0.4.12" tokio = { version = "1.22.0", features = ["time"] } @@ -31,4 +31,4 @@ sc-keystore = { path = "../keystore" } [dev-dependencies] tempfile = "3.1.0" -env_logger = "0.9" +env_logger = "0.11" diff --git a/substrate/client/storage-monitor/Cargo.toml b/substrate/client/storage-monitor/Cargo.toml index f4db58d6bb0ce364fd6c9402f1e7aa00f897cca9..5248ebdf9a650ba2e1fd1a34f18dbbc0b16781fe 100644 --- a/substrate/client/storage-monitor/Cargo.toml +++ b/substrate/client/storage-monitor/Cargo.toml @@ -12,9 +12,9 @@ homepage = "https://substrate.io" workspace = true [dependencies] -clap = { version = "4.4.18", features = ["derive", "string"] } -log = "0.4.17" +clap = { version = "4.5.3", features = ["derive", "string"] } +log = { workspace = true, default-features = true } fs4 = "0.7.0" sp-core = { path = "../../primitives/core" } tokio = { version = "1.22.0", features = ["time"] } -thiserror = "1.0.48" +thiserror = { workspace = true } diff --git a/substrate/client/sync-state-rpc/Cargo.toml b/substrate/client/sync-state-rpc/Cargo.toml index 328ecd17f75b371311437c708a070f9f8137bc08..09dc611caa044debeabce4f15686465535f076ed 100644 --- a/substrate/client/sync-state-rpc/Cargo.toml +++ b/substrate/client/sync-state-rpc/Cargo.toml @@ -16,10 +16,10 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1" } -jsonrpsee = { version = "0.20.3", features = ["client-core", "macros", "server"] } -serde = { version = "1.0.195", features = ["derive"] } -serde_json = "1.0.111" -thiserror = "1.0.48" +jsonrpsee = { version = "0.22", features = ["client-core", "macros", "server"] } +serde = { features = ["derive"], workspace = true, default-features = true } +serde_json = { workspace = true, default-features = true } +thiserror = { workspace = true } sc-chain-spec = { path = "../chain-spec" } sc-client-api = { path = "../api" } sc-consensus-babe = { path = "../consensus/babe" } diff --git a/substrate/client/sysinfo/Cargo.toml b/substrate/client/sysinfo/Cargo.toml index c09fa41d4df478b135315aea28516ed259d65d55..32b7755c64b5046fcd31cb6e0d9ff2c1061ed57a 100644 --- a/substrate/client/sysinfo/Cargo.toml +++ b/substrate/client/sysinfo/Cargo.toml @@ -17,15 +17,15 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -futures = "0.3.19" +futures = "0.3.30" libc = "0.2" -log = "0.4.17" +log = { workspace = true, default-features = true } rand = "0.8.5" rand_pcg = "0.3.1" derive_more = "0.99" regex = "1" -serde = { version = "1.0.195", features = ["derive"] } -serde_json = "1.0.111" +serde = { features = ["derive"], workspace = true, default-features = true } +serde_json = { workspace = true, default-features = true } sc-telemetry = { path = "../telemetry" } sp-core = { path = "../../primitives/core" } sp-crypto-hashing = { path = "../../primitives/crypto/hashing" } diff --git a/substrate/client/telemetry/Cargo.toml b/substrate/client/telemetry/Cargo.toml index 3270a2e148dbfe5ac2a83ddf6f7fdc1ebb2c279b..0cce2acf6409c1a1a179d60d31b997469e8fd87e 100644 --- a/substrate/client/telemetry/Cargo.toml +++ b/substrate/client/telemetry/Cargo.toml @@ -18,14 +18,15 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] chrono = "0.4.31" -futures = "0.3.21" +futures = "0.3.30" libp2p = { version = "0.51.4", features = ["dns", "tcp", "tokio", "wasm-ext", "websocket"] } -log = "0.4.17" +log = { workspace = true, default-features = true } parking_lot = "0.12.1" pin-project = "1.0.12" sc-utils = { path = "../utils" } +sc-network = { path = "../network" } rand = "0.8.5" -serde = { version = "1.0.195", features = ["derive"] } -serde_json = "1.0.111" -thiserror = "1.0.48" +serde = { features = ["derive"], workspace = true, default-features = true } +serde_json = { workspace = true, default-features = true } +thiserror = { workspace = true } wasm-timer = "0.2.5" diff --git a/substrate/client/telemetry/src/endpoints.rs b/substrate/client/telemetry/src/endpoints.rs index a4f0d0f83d617c2108a0bd3130c2229db7c5b209..c7a60726a5656108dfb588d96c8ede33bb4de391 100644 --- a/substrate/client/telemetry/src/endpoints.rs +++ b/substrate/client/telemetry/src/endpoints.rs @@ -16,7 +16,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -use libp2p::Multiaddr; +use sc_network::{multiaddr, Multiaddr}; use serde::{Deserialize, Deserializer, Serialize}; /// List of telemetry servers we want to talk to. Contains the URL of the server, and the @@ -41,8 +41,8 @@ where impl TelemetryEndpoints { /// Create a `TelemetryEndpoints` based on a list of `(String, u8)`. - pub fn new(endpoints: Vec<(String, u8)>) -> Result { - let endpoints: Result, libp2p::multiaddr::Error> = + pub fn new(endpoints: Vec<(String, u8)>) -> Result { + let endpoints: Result, multiaddr::Error> = endpoints.iter().map(|e| Ok((url_to_multiaddr(&e.0)?, e.1))).collect(); endpoints.map(Self) } @@ -56,7 +56,7 @@ impl TelemetryEndpoints { } /// Parses a WebSocket URL into a libp2p `Multiaddr`. -fn url_to_multiaddr(url: &str) -> Result { +fn url_to_multiaddr(url: &str) -> Result { // First, assume that we have a `Multiaddr`. let parse_error = match url.parse() { Ok(ma) => return Ok(ma), @@ -64,7 +64,7 @@ fn url_to_multiaddr(url: &str) -> Result { }; // If not, try the `ws://path/url` format. - if let Ok(ma) = libp2p::multiaddr::from_url(url) { + if let Ok(ma) = multiaddr::from_url(url) { return Ok(ma) } @@ -75,8 +75,7 @@ fn url_to_multiaddr(url: &str) -> Result { #[cfg(test)] mod tests { - use super::{url_to_multiaddr, TelemetryEndpoints}; - use libp2p::Multiaddr; + use super::{url_to_multiaddr, Multiaddr, TelemetryEndpoints}; #[test] fn valid_endpoints() { diff --git a/substrate/client/telemetry/src/lib.rs b/substrate/client/telemetry/src/lib.rs index 113d8303a20f6fedcf8f3c75108896bbbb8f8756..f8a201e7611c2fa50a871e663e5f6c21f76ba07a 100644 --- a/substrate/client/telemetry/src/lib.rs +++ b/substrate/client/telemetry/src/lib.rs @@ -37,9 +37,9 @@ #![warn(missing_docs)] use futures::{channel::mpsc, prelude::*}; -use libp2p::Multiaddr; use log::{error, warn}; use parking_lot::Mutex; +use sc_network::Multiaddr; use sc_utils::mpsc::{tracing_unbounded, TracingUnboundedReceiver, TracingUnboundedSender}; use serde::Serialize; use std::{ @@ -413,7 +413,7 @@ impl Telemetry { .map_err(|_| Error::TelemetryWorkerDropped) } - /// Make a new cloneable handle to this [`Telemetry`]. This is used for reporting telemetries. + /// Make a new clonable handle to this [`Telemetry`]. This is used for reporting telemetries. pub fn handle(&self) -> TelemetryHandle { TelemetryHandle { message_sender: Arc::new(Mutex::new(self.message_sender.clone())), diff --git a/substrate/client/telemetry/src/node.rs b/substrate/client/telemetry/src/node.rs index 0bbdbfb622ef1ba478b62174d277e49ac836ff64..9b2443799d3deb23967973aa6670c6d92ea0bbfd 100644 --- a/substrate/client/telemetry/src/node.rs +++ b/substrate/client/telemetry/src/node.rs @@ -18,8 +18,9 @@ use crate::TelemetryPayload; use futures::{channel::mpsc, prelude::*}; -use libp2p::{core::transport::Transport, Multiaddr}; +use libp2p::core::transport::Transport; use rand::Rng as _; +use sc_network::Multiaddr; use std::{ fmt, mem, pin::Pin, diff --git a/substrate/client/tracing/Cargo.toml b/substrate/client/tracing/Cargo.toml index 9f0f5fb6936fe98df880b1c62188ef77f881802d..ba1a7c51ab8d837206551b5088f4a6a83640ed65 100644 --- a/substrate/client/tracing/Cargo.toml +++ b/substrate/client/tracing/Cargo.toml @@ -22,15 +22,15 @@ chrono = "0.4.31" codec = { package = "parity-scale-codec", version = "3.6.1" } lazy_static = "1.4.0" libc = "0.2.152" -log = { version = "0.4.17" } +log = { workspace = true, default-features = true } parking_lot = "0.12.1" regex = "1.6.0" rustc-hash = "1.1.0" -serde = "1.0.195" -thiserror = "1.0.48" +serde = { workspace = true, default-features = true } +thiserror = { workspace = true } tracing = "0.1.29" tracing-log = "0.1.3" -tracing-subscriber = { version = "0.2.25", features = ["parking_lot"] } +tracing-subscriber = { workspace = true, features = ["parking_lot"] } sc-client-api = { path = "../api" } sc-tracing-proc-macro = { path = "proc-macro" } sp-api = { path = "../../primitives/api" } @@ -42,6 +42,7 @@ sp-tracing = { path = "../../primitives/tracing" } [dev-dependencies] criterion = "0.4.0" +tracing-subscriber = { workspace = true, features = ["chrono", "parking_lot"] } [[bench]] name = "bench" diff --git a/substrate/client/tracing/benches/bench.rs b/substrate/client/tracing/benches/bench.rs index 1379023ddfa6c14c4ae33aa7bf869c5434191091..0f581f6471de7f1d2396f647bc99506db5805c83 100644 --- a/substrate/client/tracing/benches/bench.rs +++ b/substrate/client/tracing/benches/bench.rs @@ -16,7 +16,10 @@ // limitations under the License. use criterion::{criterion_group, criterion_main, Criterion}; -use tracing_subscriber::fmt::time::{ChronoLocal, FormatTime}; +use tracing_subscriber::fmt::{ + format, + time::{ChronoLocal, FormatTime}, +}; fn bench_fast_local_time(c: &mut Criterion) { c.bench_function("fast_local_time", |b| { @@ -24,7 +27,8 @@ fn bench_fast_local_time(c: &mut Criterion) { let t = sc_tracing::logging::FastLocalTime { with_fractional: true }; b.iter(|| { buffer.clear(); - t.format_time(&mut buffer).unwrap(); + let mut writer = format::Writer::new(&mut buffer); + t.format_time(&mut writer).unwrap(); }) }); } @@ -33,10 +37,11 @@ fn bench_fast_local_time(c: &mut Criterion) { fn bench_chrono_local(c: &mut Criterion) { c.bench_function("chrono_local", |b| { let mut buffer = String::new(); - let t = ChronoLocal::with_format("%Y-%m-%d %H:%M:%S%.3f".to_string()); + let t = ChronoLocal::new("%Y-%m-%d %H:%M:%S%.3f".to_string()); b.iter(|| { buffer.clear(); - t.format_time(&mut buffer).unwrap(); + let mut writer: format::Writer<'_> = format::Writer::new(&mut buffer); + t.format_time(&mut writer).unwrap(); }) }); } diff --git a/substrate/client/tracing/proc-macro/Cargo.toml b/substrate/client/tracing/proc-macro/Cargo.toml index 4a826d9f4fce07089a7c26e48621c2af6fb21e62..fec34aa0bca935e22f0f7d7faea17cac5d8f10bb 100644 --- a/substrate/client/tracing/proc-macro/Cargo.toml +++ b/substrate/client/tracing/proc-macro/Cargo.toml @@ -20,5 +20,5 @@ proc-macro = true [dependencies] proc-macro-crate = "3.0.0" proc-macro2 = "1.0.56" -quote = { version = "1.0.28", features = ["proc-macro"] } -syn = { version = "2.0.48", features = ["extra-traits", "full", "parsing", "proc-macro"] } +quote = { features = ["proc-macro"], workspace = true } +syn = { features = ["extra-traits", "full", "parsing", "proc-macro"], workspace = true } diff --git a/substrate/client/tracing/src/lib.rs b/substrate/client/tracing/src/lib.rs index 2107943cf6a5a9029e20ff2b9690155775bdbf83..ba4d1a15cc0cdf324ca6524c513f247bda6eb423 100644 --- a/substrate/client/tracing/src/lib.rs +++ b/substrate/client/tracing/src/lib.rs @@ -290,7 +290,7 @@ impl Layer for ProfilingLayer where S: Subscriber + for<'span> LookupSpan<'span>, { - fn new_span(&self, attrs: &Attributes<'_>, id: &Id, ctx: Context) { + fn on_new_span(&self, attrs: &Attributes<'_>, id: &Id, ctx: Context) { if let Some(span) = ctx.span(id) { let mut extension = span.extensions_mut(); let parent_id = attrs.parent().cloned().or_else(|| { diff --git a/substrate/client/tracing/src/logging/event_format.rs b/substrate/client/tracing/src/logging/event_format.rs index f4579f006c25d5510f8489a6dd337e08ee7eafa0..235d66cadc78a7a25358f24a40ffcfc1cb18e8ea 100644 --- a/substrate/client/tracing/src/logging/event_format.rs +++ b/substrate/client/tracing/src/logging/event_format.rs @@ -24,7 +24,7 @@ use tracing::{Event, Level, Subscriber}; use tracing_log::NormalizeEvent; use tracing_subscriber::{ field::RecordFields, - fmt::{time::FormatTime, FmtContext, FormatEvent, FormatFields}, + fmt::{format, time::FormatTime, FmtContext, FormatEvent, FormatFields}, layer::Context, registry::{LookupSpan, SpanRef}, }; @@ -52,20 +52,20 @@ where // NOTE: the following code took inspiration from tracing-subscriber // // https://github.com/tokio-rs/tracing/blob/2f59b32/tracing-subscriber/src/fmt/format/mod.rs#L449 - pub(crate) fn format_event_custom<'b, S, N>( + pub(crate) fn format_event_custom<'b, 'w, S, N>( &self, ctx: CustomFmtContext<'b, S, N>, - writer: &mut dyn fmt::Write, + writer: format::Writer<'w>, event: &Event, ) -> fmt::Result where S: Subscriber + for<'a> LookupSpan<'a>, N: for<'a> FormatFields<'a> + 'static, { - let writer = &mut ControlCodeSanitizer::new(!self.enable_color, writer); + let mut writer = &mut ControlCodeSanitizer::new(!self.enable_color, writer); let normalized_meta = event.normalized_metadata(); let meta = normalized_meta.as_ref().unwrap_or_else(|| event.metadata()); - time::write(&self.timer, writer, self.enable_color)?; + time::write(&self.timer, &mut format::Writer::new(&mut writer), self.enable_color)?; if self.display_level { let fmt_level = { FmtLevel::new(meta.level(), self.enable_color) }; @@ -108,7 +108,7 @@ where writer.sanitize = true; } - ctx.format_fields(writer, event)?; + ctx.format_fields(format::Writer::new(writer), event)?; writeln!(writer)?; writer.flush() @@ -127,7 +127,7 @@ where fn format_event( &self, ctx: &FmtContext, - writer: &mut dyn fmt::Write, + mut writer: format::Writer<'_>, event: &Event, ) -> fmt::Result { if self.dup_to_stdout && @@ -136,7 +136,8 @@ where event.metadata().level() == &Level::ERROR) { let mut out = String::new(); - self.format_event_custom(CustomFmtContext::FmtContext(ctx), &mut out, event)?; + let buf_writer = format::Writer::new(&mut out); + self.format_event_custom(CustomFmtContext::FmtContext(ctx), buf_writer, event)?; writer.write_str(&out)?; print!("{}", out); Ok(()) @@ -237,9 +238,13 @@ impl<'a> fmt::Display for FmtThreadName<'a> { mod time { use ansi_term::Style; use std::fmt; - use tracing_subscriber::fmt::time::FormatTime; + use tracing_subscriber::fmt::{format, time::FormatTime}; - pub(crate) fn write(timer: T, writer: &mut dyn fmt::Write, with_ansi: bool) -> fmt::Result + pub(crate) fn write( + timer: T, + writer: &mut format::Writer<'_>, + with_ansi: bool, + ) -> fmt::Result where T: FormatTime, { @@ -269,11 +274,7 @@ where S: Subscriber + for<'lookup> LookupSpan<'lookup>, N: for<'writer> FormatFields<'writer> + 'static, { - fn format_fields( - &self, - writer: &'a mut dyn fmt::Write, - fields: R, - ) -> fmt::Result { + fn format_fields(&self, writer: format::Writer<'_>, fields: R) -> fmt::Result { match self { CustomFmtContext::FmtContext(fmt_ctx) => fmt_ctx.format_fields(writer, fields), CustomFmtContext::ContextWithFormatFields(_ctx, fmt_fields) => @@ -312,7 +313,7 @@ where struct ControlCodeSanitizer<'a> { sanitize: bool, buffer: String, - inner_writer: &'a mut dyn fmt::Write, + inner_writer: format::Writer<'a>, } impl<'a> fmt::Write for ControlCodeSanitizer<'a> { @@ -342,7 +343,7 @@ fn strip_control_codes(input: &str) -> std::borrow::Cow { impl<'a> ControlCodeSanitizer<'a> { /// Creates a new instance. - fn new(sanitize: bool, inner_writer: &'a mut dyn fmt::Write) -> Self { + fn new(sanitize: bool, inner_writer: format::Writer<'a>) -> Self { Self { sanitize, inner_writer, buffer: String::new() } } diff --git a/substrate/client/tracing/src/logging/fast_local_time.rs b/substrate/client/tracing/src/logging/fast_local_time.rs index 7be7bec8364aaccc47a9a23ca1d35864ea5cee76..ac4d14d95699d9244bfbe509a5e3fc33f58c8eaa 100644 --- a/substrate/client/tracing/src/logging/fast_local_time.rs +++ b/substrate/client/tracing/src/logging/fast_local_time.rs @@ -18,7 +18,7 @@ use chrono::{Datelike, Timelike}; use std::{cell::RefCell, fmt::Write, time::SystemTime}; -use tracing_subscriber::fmt::time::FormatTime; +use tracing_subscriber::fmt::{format, time::FormatTime}; /// A structure which, when `Display`d, will print out the current local time. #[derive(Debug, Clone, Copy, Eq, PartialEq, Default)] @@ -76,7 +76,7 @@ thread_local! { } impl FormatTime for FastLocalTime { - fn format_time(&self, w: &mut dyn Write) -> std::fmt::Result { + fn format_time(&self, w: &mut format::Writer<'_>) -> std::fmt::Result { const TIMESTAMP_PARTIAL_LENGTH: usize = "0000-00-00 00:00:00".len(); let elapsed = SystemTime::now() @@ -128,8 +128,8 @@ impl FormatTime for FastLocalTime { } impl std::fmt::Display for FastLocalTime { - fn fmt(&self, w: &mut std::fmt::Formatter) -> std::fmt::Result { - self.format_time(w) + fn fmt(&self, mut w: &mut std::fmt::Formatter) -> std::fmt::Result { + self.format_time(&mut format::Writer::new(&mut w)) } } diff --git a/substrate/client/tracing/src/logging/layers/prefix_layer.rs b/substrate/client/tracing/src/logging/layers/prefix_layer.rs index fc444257bde04d7a8b2d03e2ed92ca5b6e79adcf..f73f06bb53207ac1eab76aa9af33c91664d08fc6 100644 --- a/substrate/client/tracing/src/logging/layers/prefix_layer.rs +++ b/substrate/client/tracing/src/logging/layers/prefix_layer.rs @@ -32,7 +32,7 @@ impl Layer for PrefixLayer where S: Subscriber + for<'a> LookupSpan<'a>, { - fn new_span(&self, attrs: &Attributes<'_>, id: &Id, ctx: Context<'_, S>) { + fn on_new_span(&self, attrs: &Attributes<'_>, id: &Id, ctx: Context<'_, S>) { let span = match ctx.span(id) { Some(span) => span, None => { diff --git a/substrate/client/tracing/src/logging/mod.rs b/substrate/client/tracing/src/logging/mod.rs index 403839390d655714e03dc794ad92cbed4044b6db..8b2ad9b598b5be905ccb97c15817f249022f2b78 100644 --- a/substrate/client/tracing/src/logging/mod.rs +++ b/substrate/client/tracing/src/logging/mod.rs @@ -104,7 +104,7 @@ fn prepare_subscriber( where N: for<'writer> FormatFields<'writer> + 'static, E: FormatEvent + 'static, - W: MakeWriter + 'static, + W: for<'writer> MakeWriter<'writer> + 'static, F: layer::Layer> + Send + Sync + 'static, FmtLayer: layer::Layer + Send + Sync + 'static, { diff --git a/substrate/client/tracing/src/logging/stderr_writer.rs b/substrate/client/tracing/src/logging/stderr_writer.rs index 80df2f1fe7cdfc4ada63f12eabe96eb8c18bfd19..481efd32e50b2b775090e01855fa6b79daabb8e5 100644 --- a/substrate/client/tracing/src/logging/stderr_writer.rs +++ b/substrate/client/tracing/src/logging/stderr_writer.rs @@ -148,7 +148,7 @@ impl Default for MakeStderrWriter { } } -impl tracing_subscriber::fmt::MakeWriter for MakeStderrWriter { +impl tracing_subscriber::fmt::MakeWriter<'_> for MakeStderrWriter { type Writer = StderrWriter; fn make_writer(&self) -> Self::Writer { diff --git a/substrate/client/transaction-pool/Cargo.toml b/substrate/client/transaction-pool/Cargo.toml index b491f7bcafdabc53b172ed18cebf6f49d078391c..e2a0b87eaabb79383299036f92f5b3899b1b4e04 100644 --- a/substrate/client/transaction-pool/Cargo.toml +++ b/substrate/client/transaction-pool/Cargo.toml @@ -16,15 +16,15 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -async-trait = "0.1.74" +async-trait = "0.1.79" codec = { package = "parity-scale-codec", version = "3.6.1" } -futures = "0.3.21" +futures = "0.3.30" futures-timer = "3.0.2" linked-hash-map = "0.5.4" -log = "0.4.17" +log = { workspace = true, default-features = true } parking_lot = "0.12.1" -serde = { version = "1.0.195", features = ["derive"] } -thiserror = "1.0.48" +serde = { features = ["derive"], workspace = true, default-features = true } +thiserror = { workspace = true } prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../utils/prometheus" } sc-client-api = { path = "../api" } sc-transaction-pool-api = { path = "api" } diff --git a/substrate/client/transaction-pool/README.md b/substrate/client/transaction-pool/README.md index b55dc6482d64eb5342e684a82989f0ab2732b784..7a53727d576103800375a99d0544b3b67efad79e 100644 --- a/substrate/client/transaction-pool/README.md +++ b/substrate/client/transaction-pool/README.md @@ -171,7 +171,7 @@ This parameter instructs the pool propagate/gossip a transaction to node peers. By default this should be `true`, however in some cases it might be undesirable to propagate transactions further. Examples might include heavy transactions produced by block authors in offchain workers (DoS) or risking being front -runned by someone else after finding some non trivial solution or equivocation, +ran by someone else after finding some non trivial solution or equivocation, etc. ### 'TransactionSource` diff --git a/substrate/client/transaction-pool/api/Cargo.toml b/substrate/client/transaction-pool/api/Cargo.toml index f5fba65a06839e61347372b80af1226e7be142af..1bb72ef55442216e321c564838a93a75a44f62eb 100644 --- a/substrate/client/transaction-pool/api/Cargo.toml +++ b/substrate/client/transaction-pool/api/Cargo.toml @@ -12,15 +12,15 @@ description = "Transaction pool client facing API." workspace = true [dependencies] -async-trait = "0.1.74" +async-trait = "0.1.79" codec = { package = "parity-scale-codec", version = "3.6.1" } -futures = "0.3.21" -log = "0.4.17" -serde = { version = "1.0.195", features = ["derive"] } -thiserror = "1.0.48" +futures = "0.3.30" +log = { workspace = true, default-features = true } +serde = { features = ["derive"], workspace = true, default-features = true } +thiserror = { workspace = true } sp-blockchain = { path = "../../../primitives/blockchain" } sp-core = { path = "../../../primitives/core", default-features = false } sp-runtime = { path = "../../../primitives/runtime", default-features = false } [dev-dependencies] -serde_json = "1.0.111" +serde_json = { workspace = true, default-features = true } diff --git a/substrate/client/transaction-pool/api/src/error.rs b/substrate/client/transaction-pool/api/src/error.rs index e521502f66fb1cbd3e85ef4b85ec9839d83e8d9f..d0744bfa3e192bcd5e6795ee96540c503c8ebec5 100644 --- a/substrate/client/transaction-pool/api/src/error.rs +++ b/substrate/client/transaction-pool/api/src/error.rs @@ -71,6 +71,30 @@ pub enum Error { RejectedFutureTransaction, } +impl Error { + /// Returns true if the transaction could be re-submitted to the pool in the future. + /// + /// For example, `Error::ImmediatelyDropped` is retriable, because the transaction + /// may enter the pool if there is space for it in the future. + pub fn is_retriable(&self) -> bool { + match self { + // An invalid transaction is temporarily banned, however it can + // become valid at a later time. + Error::TemporarilyBanned | + // The pool is full at the moment. + Error::ImmediatelyDropped | + // The block id is not known to the pool. + // The node might be lagging behind, or during a warp sync. + Error::InvalidBlockId(_) | + // The pool is configured to not accept future transactions. + Error::RejectedFutureTransaction => { + true + } + _ => false + } + } +} + /// Transaction pool error conversion. pub trait IntoPoolError: std::error::Error + Send + Sized + Sync { /// Try to extract original `Error` diff --git a/substrate/client/transaction-pool/api/src/lib.rs b/substrate/client/transaction-pool/api/src/lib.rs index a795917528f9cca0831068fc77dd346fd2390838..0a313c5b782d90f9dab5e3de326160c37cc8a45d 100644 --- a/substrate/client/transaction-pool/api/src/lib.rs +++ b/substrate/client/transaction-pool/api/src/lib.rs @@ -62,20 +62,27 @@ impl PoolStatus { /// /// The status events can be grouped based on their kinds as: /// 1. Entering/Moving within the pool: -/// - `Future` -/// - `Ready` +/// - [Future](TransactionStatus::Future) +/// - [Ready](TransactionStatus::Ready) /// 2. Inside `Ready` queue: -/// - `Broadcast` +/// - [Broadcast](TransactionStatus::Broadcast) /// 3. Leaving the pool: -/// - `InBlock` -/// - `Invalid` -/// - `Usurped` -/// - `Dropped` +/// - [InBlock](TransactionStatus::InBlock) +/// - [Invalid](TransactionStatus::Invalid) +/// - [Usurped](TransactionStatus::Usurped) +/// - [Dropped](TransactionStatus::Dropped) /// 4. Re-entering the pool: -/// - `Retracted` +/// - [Retracted](TransactionStatus::Retracted) /// 5. Block finalized: -/// - `Finalized` -/// - `FinalityTimeout` +/// - [Finalized](TransactionStatus::Finalized) +/// - [FinalityTimeout](TransactionStatus::FinalityTimeout) +/// +/// Transactions are first placed in either the `Ready` or `Future` queues of the transaction pool. +/// Substrate validates the transaction before it enters the pool. +/// +/// A transaction is placed in the `Future` queue if it will become valid at a future time. +/// For example, submitting a transaction with a higher account nonce than the current +/// expected nonce will place the transaction in the `Future` queue. /// /// The events will always be received in the order described above, however /// there might be cases where transactions alternate between `Future` and `Ready` @@ -88,19 +95,37 @@ impl PoolStatus { /// 1. Due to possible forks, the transaction that ends up being in included /// in one block, may later re-enter the pool or be marked as invalid. /// 2. Transaction `Dropped` at one point, may later re-enter the pool if some other -/// transactions are removed. +/// transactions are removed. A `Dropped` transaction may re-enter the pool only if it is +/// resubmitted. /// 3. `Invalid` transaction may become valid at some point in the future. /// (Note that runtimes are encouraged to use `UnknownValidity` to inform the pool about -/// such case). +/// such case). An `Invalid` transaction may re-enter the pool only if it is resubmitted. /// 4. `Retracted` transactions might be included in some next block. /// -/// The stream is considered finished only when either `Finalized` or `FinalityTimeout` -/// event is triggered. You are however free to unsubscribe from notifications at any point. -/// The first one will be emitted when the block, in which transaction was included gets -/// finalized. The `FinalityTimeout` event will be emitted when the block did not reach finality +/// The `FinalityTimeout` event will be emitted when the block did not reach finality /// within 512 blocks. This either indicates that finality is not available for your chain, /// or that finality gadget is lagging behind. If you choose to wait for finality longer, you can /// re-subscribe for a particular transaction hash manually again. +/// +/// ### Last Event +/// +/// The stream is considered finished when one of the following events happen: +/// - [Finalized](TransactionStatus::Finalized) +/// - [FinalityTimeout](TransactionStatus::FinalityTimeout) +/// - [Usurped](TransactionStatus::Usurped) +/// - [Invalid](TransactionStatus::Invalid) +/// - [Dropped](TransactionStatus::Dropped) +/// +/// See [`TransactionStatus::is_final`] for more details. +/// +/// ### Resubmit Transactions +/// +/// Users might resubmit the transaction at a later time for the following events: +/// - [FinalityTimeout](TransactionStatus::FinalityTimeout) +/// - [Invalid](TransactionStatus::Invalid) +/// - [Dropped](TransactionStatus::Dropped) +/// +/// See [`TransactionStatus::is_retriable`] for more details. #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub enum TransactionStatus { @@ -131,6 +156,38 @@ pub enum TransactionStatus { Invalid, } +impl TransactionStatus { + /// Returns true if this is the last event emitted by [`TransactionStatusStream`]. + pub fn is_final(&self) -> bool { + // The state must be kept in sync with `crate::graph::Sender`. + match self { + Self::Usurped(_) | + Self::Finalized(_) | + Self::FinalityTimeout(_) | + Self::Invalid | + Self::Dropped => true, + _ => false, + } + } + + /// Returns true if the transaction could be re-submitted to the pool in the future. + /// + /// For example, `TransactionStatus::Dropped` is retriable, because the transaction + /// may enter the pool if there is space for it in the future. + pub fn is_retriable(&self) -> bool { + match self { + // The number of finality watchers has been reached. + Self::FinalityTimeout(_) | + // An invalid transaction might be valid at a later time. + Self::Invalid | + // The transaction was dropped because of the limits of the pool. + // It can reenter the pool when other transactions are removed / finalized. + Self::Dropped => true, + _ => false, + } + } +} + /// The stream of transaction events. pub type TransactionStatusStream = dyn Stream> + Send; diff --git a/substrate/client/transaction-pool/src/lib.rs b/substrate/client/transaction-pool/src/lib.rs index faa3f455a580c8713ced21b14818da874fd972a7..64b301e6bf36f4f4fc88abf15a36c5b1ef30b04b 100644 --- a/substrate/client/transaction-pool/src/lib.rs +++ b/substrate/client/transaction-pool/src/lib.rs @@ -164,8 +164,9 @@ where pool_api: Arc, best_block_hash: Block::Hash, finalized_hash: Block::Hash, + options: graph::Options, ) -> (Self, Pin + Send>>) { - let pool = Arc::new(graph::Pool::new(Default::default(), true.into(), pool_api.clone())); + let pool = Arc::new(graph::Pool::new(options, true.into(), pool_api.clone())); let (revalidation_queue, background_task) = revalidation::RevalidationQueue::new_background( pool_api.clone(), pool.clone(), diff --git a/substrate/client/transaction-pool/tests/pool.rs b/substrate/client/transaction-pool/tests/pool.rs index 6b1a197440c11e69805465ed4c7195f07eaafc0f..49bd2203c12b48454844e1bc3ce09c2c446fc9b6 100644 --- a/substrate/client/transaction-pool/tests/pool.rs +++ b/substrate/client/transaction-pool/tests/pool.rs @@ -73,7 +73,7 @@ fn create_basic_pool_with_genesis( .map(|blocks| blocks[0].0.header.hash()) .expect("there is block 0. qed") }; - BasicPool::new_test(test_api, genesis_hash, genesis_hash) + BasicPool::new_test(test_api, genesis_hash, genesis_hash, Default::default()) } fn create_basic_pool(test_api: TestApi) -> BasicPool { @@ -994,11 +994,12 @@ fn import_notification_to_pool_maintain_works() { )), best_hash, finalized_hash, + Default::default(), ) .0, ); - // Prepare the extrisic, push it to the pool and check that it was added. + // Prepare the extrinsic, push it to the pool and check that it was added. let xt = uxt(Alice, 0); block_on(pool.submit_one( pool.api().block_id_to_hash(&BlockId::Number(0)).unwrap().unwrap(), diff --git a/substrate/client/utils/Cargo.toml b/substrate/client/utils/Cargo.toml index ec7b3d0eb0dcbbb23e5512b4d3cf582a4eb25e54..a101f4b3f3ad009a35c1cc061e4c9515b98e1419 100644 --- a/substrate/client/utils/Cargo.toml +++ b/substrate/client/utils/Cargo.toml @@ -14,10 +14,10 @@ workspace = true [dependencies] async-channel = "1.8.0" -futures = "0.3.21" +futures = "0.3.30" futures-timer = "3.0.2" lazy_static = "1.4.0" -log = "0.4" +log = { workspace = true, default-features = true } parking_lot = "0.12.1" prometheus = { version = "0.13.0", default-features = false } sp-arithmetic = { path = "../../primitives/arithmetic", default-features = false } diff --git a/substrate/client/utils/src/mpsc.rs b/substrate/client/utils/src/mpsc.rs index c24a5bd8904afc99109acf8f5c6fe5872b5d9874..91db7e1e7b011142f5b1089eb74a209a612cf4b9 100644 --- a/substrate/client/utils/src/mpsc.rs +++ b/substrate/client/utils/src/mpsc.rs @@ -86,7 +86,7 @@ pub fn tracing_unbounded( warning_fired: Arc::new(AtomicBool::new(false)), creation_backtrace: Arc::new(Backtrace::force_capture()), }; - let receiver = TracingUnboundedReceiver { inner: r, name }; + let receiver = TracingUnboundedReceiver { inner: r, name: name.into() }; (sender, receiver) } @@ -157,6 +157,11 @@ impl TracingUnboundedReceiver { pub fn len(&self) -> usize { self.inner.len() } + + /// The name of this receiver + pub fn name(&self) -> &'static str { + self.name + } } impl Drop for TracingUnboundedReceiver { diff --git a/substrate/client/utils/src/notification.rs b/substrate/client/utils/src/notification.rs index dabb85d613cc97e1a95133a5de130b505f5050e4..3f606aabe3a156071ad0fbfffc8c5c8fd55728e2 100644 --- a/substrate/client/utils/src/notification.rs +++ b/substrate/client/utils/src/notification.rs @@ -44,7 +44,7 @@ mod tests; /// and identify the mpsc channels. pub trait TracingKeyStr { /// Const `str` representing the "tracing key" used to tag and identify - /// the mpsc channels owned by the object implemeting this trait. + /// the mpsc channels owned by the object implementing this trait. const TRACING_KEY: &'static str; } diff --git a/substrate/frame/Cargo.toml b/substrate/frame/Cargo.toml index 9419eb15974b368cc706e9b7092f50e86149bb80..919d6d17ce8b128c03a28d9bf502919aba833176 100644 --- a/substrate/frame/Cargo.toml +++ b/substrate/frame/Cargo.toml @@ -1,6 +1,6 @@ [package] -name = "frame" -version = "0.0.1-dev" +name = "polkadot-sdk-frame" +version = "0.1.0" authors = ["Parity Technologies "] edition = "2021" license = "Apache-2.0" @@ -19,8 +19,12 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] # external deps -parity-scale-codec = { version = "3.2.2", default-features = false, features = ["derive"] } -scale-info = { version = "2.6.0", default-features = false, features = ["derive"] } +parity-scale-codec = { version = "3.2.2", default-features = false, features = [ + "derive", +] } +scale-info = { version = "2.11.1", default-features = false, features = [ + "derive", +] } # primitive deps, used for developing FRAME pallets. sp-runtime = { default-features = false, path = "../primitives/runtime" } @@ -47,9 +51,8 @@ sp-inherents = { default-features = false, path = "../primitives/inherents", opt frame-executive = { default-features = false, path = "../frame/executive", optional = true } frame-system-rpc-runtime-api = { default-features = false, path = "../frame/system/rpc/runtime-api", optional = true } -docify = "0.2.7" -simple-mermaid = { git = "https://github.com/kianenigma/simple-mermaid.git", rev = "e48b187bcfd5cc75111acd9d241f1bd36604344b", optional = true } -log = { version = "0.4.20", default-features = false } +docify = "0.2.8" +log = { workspace = true } [dev-dependencies] pallet-examples = { path = "./examples" } @@ -58,8 +61,6 @@ pallet-examples = { path = "./examples" } default = ["runtime", "std"] experimental = ["frame-support/experimental"] runtime = [ - "frame-executive", - "frame-system-rpc-runtime-api", "sp-api", "sp-block-builder", "sp-consensus-aura", @@ -69,6 +70,9 @@ runtime = [ "sp-session", "sp-transaction-pool", "sp-version", + + "frame-executive", + "frame-system-rpc-runtime-api", ] std = [ "frame-executive?/std", @@ -78,7 +82,6 @@ std = [ "log/std", "parity-scale-codec/std", "scale-info/std", - "simple-mermaid", "sp-api?/std", "sp-arithmetic/std", "sp-block-builder?/std", diff --git a/substrate/frame/alliance/Cargo.toml b/substrate/frame/alliance/Cargo.toml index 955f9e268c6f1e80c778a596d171f74260a08c8e..af1fcb296f6726983c654238dbc2d2161e4eec1a 100644 --- a/substrate/frame/alliance/Cargo.toml +++ b/substrate/frame/alliance/Cargo.toml @@ -17,10 +17,10 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] array-bytes = { version = "6.1", optional = true } -log = { version = "0.4.14", default-features = false } +log = { workspace = true } codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } sp-std = { path = "../../primitives/std", default-features = false } sp-core = { path = "../../primitives/core", default-features = false } diff --git a/substrate/frame/alliance/README.md b/substrate/frame/alliance/README.md index 9930008e2d63558a9f83d906da92ecbf29f11a7a..16335a98f59f67a06b9ed6f18fe2c41e43124a34 100644 --- a/substrate/frame/alliance/README.md +++ b/substrate/frame/alliance/README.md @@ -58,7 +58,7 @@ to update the Alliance's rule and make announcements. - `add_unscrupulous_items` - Add some items, either accounts or websites, to the list of unscrupulous items. - `remove_unscrupulous_items` - Remove some items from the list of unscrupulous items. -- `abdicate_fellow_status` - Abdicate one's voting rights, demoting themself to Ally. +- `abdicate_fellow_status` - Abdicate one's voting rights, demoting themselves to Ally. #### Root Calls diff --git a/substrate/frame/alliance/src/benchmarking.rs b/substrate/frame/alliance/src/benchmarking.rs index b69d0156ec4b04952e15c290a7765db553fab5c8..710c32a848dd152b4ae4cf02c1be87e295ae7da4 100644 --- a/substrate/frame/alliance/src/benchmarking.rs +++ b/substrate/frame/alliance/src/benchmarking.rs @@ -19,15 +19,14 @@ #![cfg(feature = "runtime-benchmarks")] -use sp_runtime::traits::{Bounded, Hash, StaticLookup}; -use sp_std::{ +use core::{ cmp, convert::{TryFrom, TryInto}, mem::size_of, - prelude::*, }; +use sp_runtime::traits::{Bounded, Hash, StaticLookup}; -use frame_benchmarking::{account, impl_benchmark_test_suite, v2::*, BenchmarkError}; +use frame_benchmarking::{account, v2::*, BenchmarkError}; use frame_support::traits::{EnsureOrigin, Get, UnfilteredDispatchable}; use frame_system::{pallet_prelude::BlockNumberFor, Pallet as System, RawOrigin as SystemOrigin}; @@ -506,8 +505,8 @@ mod benchmarks { assert_last_event::( Event::MembersInitialized { fellows: fellows.clone(), allies: allies.clone() }.into(), ); - assert_eq!(Alliance::::members(MemberRole::Fellow), fellows); - assert_eq!(Alliance::::members(MemberRole::Ally), allies); + assert_eq!(Members::::get(MemberRole::Fellow), fellows); + assert_eq!(Members::::get(MemberRole::Ally), allies); Ok(()) } @@ -564,7 +563,7 @@ mod benchmarks { { call.dispatch_bypass_filter(origin)?; } - assert_eq!(Alliance::::rule(), Some(rule.clone())); + assert_eq!(Rule::::get(), Some(rule.clone())); assert_last_event::(Event::NewRuleSet { rule }.into()); Ok(()) } @@ -584,7 +583,7 @@ mod benchmarks { call.dispatch_bypass_filter(origin)?; } - assert!(Alliance::::announcements().contains(&announcement)); + assert!(Announcements::::get().contains(&announcement)); assert_last_event::(Event::Announced { announcement }.into()); Ok(()) } @@ -607,7 +606,7 @@ mod benchmarks { call.dispatch_bypass_filter(origin)?; } - assert!(!Alliance::::announcements().contains(&announcement)); + assert!(!Announcements::::get().contains(&announcement)); assert_last_event::(Event::AnnouncementRemoved { announcement }.into()); Ok(()) } diff --git a/substrate/frame/alliance/src/lib.rs b/substrate/frame/alliance/src/lib.rs index d4703db68dbba34988516ba08b5efcebcb79e5e9..1f06241e9c83b088137547ec47372aa8e84142d7 100644 --- a/substrate/frame/alliance/src/lib.rs +++ b/substrate/frame/alliance/src/lib.rs @@ -442,24 +442,20 @@ pub mod pallet { /// The IPFS CID of the alliance rule. /// Fellows can propose a new rule with a super-majority. #[pallet::storage] - #[pallet::getter(fn rule)] pub type Rule, I: 'static = ()> = StorageValue<_, Cid, OptionQuery>; /// The current IPFS CIDs of any announcements. #[pallet::storage] - #[pallet::getter(fn announcements)] pub type Announcements, I: 'static = ()> = StorageValue<_, BoundedVec, ValueQuery>; /// Maps members to their candidacy deposit. #[pallet::storage] - #[pallet::getter(fn deposit_of)] pub type DepositOf, I: 'static = ()> = StorageMap<_, Blake2_128Concat, T::AccountId, BalanceOf, OptionQuery>; /// Maps member type to members of each type. #[pallet::storage] - #[pallet::getter(fn members)] pub type Members, I: 'static = ()> = StorageMap< _, Twox64Concat, @@ -471,20 +467,17 @@ pub mod pallet { /// A set of members who gave a retirement notice. They can retire after the end of retirement /// period stored as a future block number. #[pallet::storage] - #[pallet::getter(fn retiring_members)] pub type RetiringMembers, I: 'static = ()> = StorageMap<_, Blake2_128Concat, T::AccountId, BlockNumberFor, OptionQuery>; /// The current list of accounts deemed unscrupulous. These accounts non grata cannot submit /// candidacy. #[pallet::storage] - #[pallet::getter(fn unscrupulous_accounts)] pub type UnscrupulousAccounts, I: 'static = ()> = StorageValue<_, BoundedVec, ValueQuery>; /// The current list of websites deemed unscrupulous. #[pallet::storage] - #[pallet::getter(fn unscrupulous_websites)] pub type UnscrupulousWebsites, I: 'static = ()> = StorageValue<_, BoundedVec, T::MaxUnscrupulousItems>, ValueQuery>; @@ -505,10 +498,10 @@ pub mod pallet { proposal: Box<>::Proposal>, #[pallet::compact] length_bound: u32, ) -> DispatchResult { - let proposor = ensure_signed(origin)?; - ensure!(Self::has_voting_rights(&proposor), Error::::NoVotingRights); + let proposer = ensure_signed(origin)?; + ensure!(Self::has_voting_rights(&proposer), Error::::NoVotingRights); - T::ProposalProvider::propose_proposal(proposor, threshold, proposal, length_bound)?; + T::ProposalProvider::propose_proposal(proposer, threshold, proposal, length_bound)?; Ok(()) } diff --git a/substrate/frame/alliance/src/migration.rs b/substrate/frame/alliance/src/migration.rs index e3a44a7887e976cfa6c5d0cfd48c251348edb26b..b4ecc1819447dc68f6ede10611ba88b97a677b68 100644 --- a/substrate/frame/alliance/src/migration.rs +++ b/substrate/frame/alliance/src/migration.rs @@ -19,19 +19,19 @@ use crate::{Config, Pallet, Weight, LOG_TARGET}; use frame_support::{pallet_prelude::*, storage::migration, traits::OnRuntimeUpgrade}; use log; -/// The current storage version. +/// The in-code storage version. pub const STORAGE_VERSION: StorageVersion = StorageVersion::new(2); /// Wrapper for all migrations of this pallet. pub fn migrate, I: 'static>() -> Weight { - let onchain_version = Pallet::::on_chain_storage_version(); + let on_chain_version = Pallet::::on_chain_storage_version(); let mut weight: Weight = Weight::zero(); - if onchain_version < 1 { + if on_chain_version < 1 { weight = weight.saturating_add(v0_to_v1::migrate::()); } - if onchain_version < 2 { + if on_chain_version < 2 { weight = weight.saturating_add(v1_to_v2::migrate::()); } @@ -162,18 +162,18 @@ pub(crate) mod v1_to_v2 { #[cfg(test)] mod test { use super::*; - use crate::{mock::*, MemberRole}; + use crate::{mock::*, MemberRole, Members}; #[test] fn migration_v1_to_v2_works() { new_test_ext().execute_with(|| { assert_ok!(Alliance::join_alliance(RuntimeOrigin::signed(4))); - assert_eq!(Alliance::members(MemberRole::Ally), vec![4]); - assert_eq!(Alliance::members(MemberRole::Fellow), vec![1, 2, 3]); + assert_eq!(Members::::get(MemberRole::Ally), vec![4]); + assert_eq!(Members::::get(MemberRole::Fellow), vec![1, 2, 3]); v1_to_v2::migrate::(); - assert_eq!(Alliance::members(MemberRole::Fellow), vec![1, 2, 3, 4]); - assert_eq!(Alliance::members(MemberRole::Ally), vec![]); - assert_eq!(Alliance::members(MemberRole::Retiring), vec![]); + assert_eq!(Members::::get(MemberRole::Fellow), vec![1, 2, 3, 4]); + assert_eq!(Members::::get(MemberRole::Ally), vec![]); + assert_eq!(Members::::get(MemberRole::Retiring), vec![]); }); } } diff --git a/substrate/frame/alliance/src/mock.rs b/substrate/frame/alliance/src/mock.rs index 627dde81afa84926b719803466fd5c5e14d9bc47..b183e412bed779291ef2bf3d94c0790295420e02 100644 --- a/substrate/frame/alliance/src/mock.rs +++ b/substrate/frame/alliance/src/mock.rs @@ -17,13 +17,13 @@ //! Test utilities +use core::convert::{TryFrom, TryInto}; pub use sp_core::H256; use sp_runtime::traits::Hash; pub use sp_runtime::{ traits::{BlakeTwo256, IdentifyAccount, Lazy, Verify}, BuildStorage, }; -use sp_std::convert::{TryFrom, TryInto}; pub use frame_support::{ assert_noop, assert_ok, derive_impl, ord_parameter_types, parameter_types, @@ -48,7 +48,7 @@ parameter_types! { frame_system::limits::BlockWeights::simple_max(Weight::MAX); } -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { type Block = Block; type AccountData = pallet_balances::AccountData; @@ -208,7 +208,7 @@ impl ProposalProvider for AllianceProposalProvider } fn proposal_of(proposal_hash: H256) -> Option { - AllianceMotion::proposal_of(proposal_hash) + pallet_collective::ProposalOf::::get(proposal_hash) } } diff --git a/substrate/frame/alliance/src/tests.rs b/substrate/frame/alliance/src/tests.rs index 8011627b237af15e8d30379bf14afc2564421050..edb515b8115a57eeac4fdade7ca4831e43ff17f9 100644 --- a/substrate/frame/alliance/src/tests.rs +++ b/substrate/frame/alliance/src/tests.rs @@ -21,12 +21,12 @@ use frame_support::{assert_noop, assert_ok, error::BadOrigin}; use frame_system::{EventRecord, Phase}; use super::*; -use crate::mock::*; +use crate::{self as alliance, mock::*}; type AllianceMotionEvent = pallet_collective::Event; fn assert_powerless(user: RuntimeOrigin, user_is_member: bool) { - //vote / veto with a valid propsal + //vote / veto with a valid proposal let cid = test_cid(); let (proposal, _, _) = make_kick_member_proposal(42); @@ -118,7 +118,7 @@ fn disband_works() { // join alliance and reserve funds assert_eq!(Balances::free_balance(9), 1000 - id_deposit); assert_ok!(Alliance::join_alliance(RuntimeOrigin::signed(9))); - assert_eq!(Alliance::deposit_of(9), Some(expected_join_deposit)); + assert_eq!(alliance::DepositOf::::get(9), Some(expected_join_deposit)); assert_eq!(Balances::free_balance(9), 1000 - id_deposit - expected_join_deposit); assert!(Alliance::is_member_of(&9, MemberRole::Ally)); @@ -187,8 +187,8 @@ fn propose_works() { Box::new(proposal.clone()), proposal_len )); - assert_eq!(*AllianceMotion::proposals(), vec![hash]); - assert_eq!(AllianceMotion::proposal_of(&hash), Some(proposal)); + assert_eq!(*pallet_collective::Proposals::::get(), vec![hash]); + assert_eq!(pallet_collective::ProposalOf::::get(&hash), Some(proposal)); assert_eq!( System::events(), vec![EventRecord { @@ -314,7 +314,7 @@ fn set_rule_works() { new_test_ext().execute_with(|| { let cid = test_cid(); assert_ok!(Alliance::set_rule(RuntimeOrigin::signed(1), cid.clone())); - assert_eq!(Alliance::rule(), Some(cid.clone())); + assert_eq!(alliance::Rule::::get(), Some(cid.clone())); System::assert_last_event(mock::RuntimeEvent::Alliance(crate::Event::NewRuleSet { rule: cid, @@ -330,7 +330,7 @@ fn announce_works() { assert_noop!(Alliance::announce(RuntimeOrigin::signed(2), cid.clone()), BadOrigin); assert_ok!(Alliance::announce(RuntimeOrigin::signed(3), cid.clone())); - assert_eq!(Alliance::announcements(), vec![cid.clone()]); + assert_eq!(alliance::Announcements::::get(), vec![cid.clone()]); System::assert_last_event(mock::RuntimeEvent::Alliance(crate::Event::Announced { announcement: cid, @@ -343,7 +343,7 @@ fn remove_announcement_works() { new_test_ext().execute_with(|| { let cid = test_cid(); assert_ok!(Alliance::announce(RuntimeOrigin::signed(3), cid.clone())); - assert_eq!(Alliance::announcements(), vec![cid.clone()]); + assert_eq!(alliance::Announcements::::get(), vec![cid.clone()]); System::assert_last_event(mock::RuntimeEvent::Alliance(crate::Event::Announced { announcement: cid.clone(), })); @@ -351,7 +351,7 @@ fn remove_announcement_works() { System::set_block_number(2); assert_ok!(Alliance::remove_announcement(RuntimeOrigin::signed(3), cid.clone())); - assert_eq!(Alliance::announcements(), vec![]); + assert_eq!(alliance::Announcements::::get(), vec![]); System::assert_last_event(mock::RuntimeEvent::Alliance( crate::Event::AnnouncementRemoved { announcement: cid }, )); @@ -394,8 +394,8 @@ fn join_alliance_works() { // success to submit assert_ok!(Alliance::join_alliance(RuntimeOrigin::signed(4))); assert_eq!(Balances::free_balance(4), 1000 - id_deposit - join_deposit); - assert_eq!(Alliance::deposit_of(4), Some(25)); - assert_eq!(Alliance::members(MemberRole::Ally), vec![4]); + assert_eq!(alliance::DepositOf::::get(4), Some(25)); + assert_eq!(alliance::Members::::get(MemberRole::Ally), vec![4]); // check already member assert_noop!( @@ -449,8 +449,8 @@ fn nominate_ally_works() { // success to nominate assert_ok!(Alliance::nominate_ally(RuntimeOrigin::signed(1), 4)); - assert_eq!(Alliance::deposit_of(4), None); - assert_eq!(Alliance::members(MemberRole::Ally), vec![4]); + assert_eq!(alliance::DepositOf::::get(4), None); + assert_eq!(alliance::Members::::get(MemberRole::Ally), vec![4]); // check already member assert_noop!( @@ -482,12 +482,12 @@ fn elevate_ally_works() { ); assert_ok!(Alliance::join_alliance(RuntimeOrigin::signed(4))); - assert_eq!(Alliance::members(MemberRole::Ally), vec![4]); - assert_eq!(Alliance::members(MemberRole::Fellow), vec![1, 2, 3]); + assert_eq!(alliance::Members::::get(MemberRole::Ally), vec![4]); + assert_eq!(alliance::Members::::get(MemberRole::Fellow), vec![1, 2, 3]); assert_ok!(Alliance::elevate_ally(RuntimeOrigin::signed(2), 4)); - assert_eq!(Alliance::members(MemberRole::Ally), Vec::::new()); - assert_eq!(Alliance::members(MemberRole::Fellow), vec![1, 2, 3, 4]); + assert_eq!(alliance::Members::::get(MemberRole::Ally), Vec::::new()); + assert_eq!(alliance::Members::::get(MemberRole::Fellow), vec![1, 2, 3, 4]); }); } @@ -499,10 +499,10 @@ fn give_retirement_notice_work() { Error::::NotMember ); - assert_eq!(Alliance::members(MemberRole::Fellow), vec![1, 2, 3]); + assert_eq!(alliance::Members::::get(MemberRole::Fellow), vec![1, 2, 3]); assert_ok!(Alliance::give_retirement_notice(RuntimeOrigin::signed(3))); - assert_eq!(Alliance::members(MemberRole::Fellow), vec![1, 2]); - assert_eq!(Alliance::members(MemberRole::Retiring), vec![3]); + assert_eq!(alliance::Members::::get(MemberRole::Fellow), vec![1, 2]); + assert_eq!(alliance::Members::::get(MemberRole::Retiring), vec![3]); System::assert_last_event(mock::RuntimeEvent::Alliance( crate::Event::MemberRetirementPeriodStarted { member: (3) }, )); @@ -527,7 +527,7 @@ fn retire_works() { Error::::RetirementNoticeNotGiven ); - assert_eq!(Alliance::members(MemberRole::Fellow), vec![1, 2, 3]); + assert_eq!(alliance::Members::::get(MemberRole::Fellow), vec![1, 2, 3]); assert_ok!(Alliance::give_retirement_notice(RuntimeOrigin::signed(3))); assert_noop!( Alliance::retire(RuntimeOrigin::signed(3)), @@ -535,7 +535,7 @@ fn retire_works() { ); System::set_block_number(System::block_number() + RetirementPeriod::get()); assert_ok!(Alliance::retire(RuntimeOrigin::signed(3))); - assert_eq!(Alliance::members(MemberRole::Fellow), vec![1, 2]); + assert_eq!(alliance::Members::::get(MemberRole::Fellow), vec![1, 2]); System::assert_last_event(mock::RuntimeEvent::Alliance(crate::Event::MemberRetired { member: (3), unreserved: None, @@ -551,7 +551,7 @@ fn retire_works() { #[test] fn abdicate_works() { new_test_ext().execute_with(|| { - assert_eq!(Alliance::members(MemberRole::Fellow), vec![1, 2, 3]); + assert_eq!(alliance::Members::::get(MemberRole::Fellow), vec![1, 2, 3]); assert_ok!(Alliance::abdicate_fellow_status(RuntimeOrigin::signed(3))); System::assert_last_event(mock::RuntimeEvent::Alliance(crate::Event::FellowAbdicated { @@ -573,9 +573,9 @@ fn kick_member_works() { ); >::insert(2, 25); - assert_eq!(Alliance::members(MemberRole::Fellow), vec![1, 2, 3]); + assert_eq!(alliance::Members::::get(MemberRole::Fellow), vec![1, 2, 3]); assert_ok!(Alliance::kick_member(RuntimeOrigin::signed(2), 2)); - assert_eq!(Alliance::members(MemberRole::Fellow), vec![1, 3]); + assert_eq!(alliance::Members::::get(MemberRole::Fellow), vec![1, 3]); assert_eq!(>::get(2), None); System::assert_last_event(mock::RuntimeEvent::Alliance(crate::Event::MemberKicked { member: (2), @@ -596,8 +596,11 @@ fn add_unscrupulous_items_works() { UnscrupulousItem::Website("abc".as_bytes().to_vec().try_into().unwrap()) ] )); - assert_eq!(Alliance::unscrupulous_accounts().into_inner(), vec![3]); - assert_eq!(Alliance::unscrupulous_websites().into_inner(), vec!["abc".as_bytes().to_vec()]); + assert_eq!(alliance::UnscrupulousAccounts::::get().into_inner(), vec![3]); + assert_eq!( + alliance::UnscrupulousWebsites::::get().into_inner(), + vec!["abc".as_bytes().to_vec()] + ); assert_noop!( Alliance::add_unscrupulous_items( @@ -629,12 +632,12 @@ fn remove_unscrupulous_items_works() { RuntimeOrigin::signed(3), vec![UnscrupulousItem::AccountId(3)] )); - assert_eq!(Alliance::unscrupulous_accounts(), vec![3]); + assert_eq!(alliance::UnscrupulousAccounts::::get(), vec![3]); assert_ok!(Alliance::remove_unscrupulous_items( RuntimeOrigin::signed(3), vec![UnscrupulousItem::AccountId(3)] )); - assert_eq!(Alliance::unscrupulous_accounts(), Vec::::new()); + assert_eq!(alliance::UnscrupulousAccounts::::get(), Vec::::new()); }); } diff --git a/substrate/frame/alliance/src/weights.rs b/substrate/frame/alliance/src/weights.rs index b5bb50957207f6c75cbca0479d97127ffcca572a..0184ac91107c3706221201607b7f798f18003e55 100644 --- a/substrate/frame/alliance/src/weights.rs +++ b/substrate/frame/alliance/src/weights.rs @@ -15,16 +15,16 @@ // See the License for the specific language governing permissions and // limitations under the License. -//! Autogenerated weights for pallet_alliance +//! Autogenerated weights for `pallet_alliance` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-06-16, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-04-08, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-e8ezs4ez-project-145-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("dev"), DB CACHE: 1024 +//! HOSTNAME: `runner-anb7yjbi-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: `1024` // Executed Command: -// ./target/production/substrate +// ./target/production/substrate-node // benchmark // pallet // --chain=dev @@ -35,12 +35,11 @@ // --no-median-slopes // --no-min-squares // --extrinsic=* -// --execution=wasm // --wasm-execution=compiled // --heap-pages=4096 -// --output=./frame/alliance/src/weights.rs -// --header=./HEADER-APACHE2 -// --template=./.maintain/frame-weight-template.hbs +// --output=./substrate/frame/alliance/src/weights.rs +// --header=./substrate/HEADER-APACHE2 +// --template=./substrate/.maintain/frame-weight-template.hbs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -50,7 +49,7 @@ use frame_support::{traits::Get, weights::{Weight, constants::RocksDbWeight}}; use core::marker::PhantomData; -/// Weight functions needed for pallet_alliance. +/// Weight functions needed for `pallet_alliance`. pub trait WeightInfo { fn propose_proposed(b: u32, m: u32, p: u32, ) -> Weight; fn vote(m: u32, ) -> Weight; @@ -74,205 +73,209 @@ pub trait WeightInfo { fn abdicate_fellow_status() -> Weight; } -/// Weights for pallet_alliance using the Substrate node and recommended hardware. +/// Weights for `pallet_alliance` using the Substrate node and recommended hardware. pub struct SubstrateWeight(PhantomData); impl WeightInfo for SubstrateWeight { - /// Storage: Alliance Members (r:1 w:0) - /// Proof: Alliance Members (max_values: None, max_size: Some(3211), added: 5686, mode: MaxEncodedLen) - /// Storage: AllianceMotion ProposalOf (r:1 w:1) - /// Proof Skipped: AllianceMotion ProposalOf (max_values: None, max_size: None, mode: Measured) - /// Storage: AllianceMotion Proposals (r:1 w:1) - /// Proof Skipped: AllianceMotion Proposals (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: AllianceMotion ProposalCount (r:1 w:1) - /// Proof Skipped: AllianceMotion ProposalCount (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: AllianceMotion Voting (r:0 w:1) - /// Proof Skipped: AllianceMotion Voting (max_values: None, max_size: None, mode: Measured) + /// Storage: `Alliance::Members` (r:1 w:0) + /// Proof: `Alliance::Members` (`max_values`: None, `max_size`: Some(3211), added: 5686, mode: `MaxEncodedLen`) + /// Storage: `AllianceMotion::ProposalOf` (r:1 w:1) + /// Proof: `AllianceMotion::ProposalOf` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `AllianceMotion::Proposals` (r:1 w:1) + /// Proof: `AllianceMotion::Proposals` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `AllianceMotion::ProposalCount` (r:1 w:1) + /// Proof: `AllianceMotion::ProposalCount` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `AllianceMotion::Voting` (r:0 w:1) + /// Proof: `AllianceMotion::Voting` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `b` is `[1, 1024]`. /// The range of component `m` is `[2, 100]`. /// The range of component `p` is `[1, 100]`. fn propose_proposed(b: u32, m: u32, p: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `653 + m * (32 ±0) + p * (35 ±0)` + // Measured: `688 + m * (32 ±0) + p * (36 ±0)` // Estimated: `6676 + m * (32 ±0) + p * (36 ±0)` - // Minimum execution time: 36_908_000 picoseconds. - Weight::from_parts(39_040_304, 6676) - // Standard Error: 131 - .saturating_add(Weight::from_parts(781, 0).saturating_mul(b.into())) - // Standard Error: 1_375 - .saturating_add(Weight::from_parts(48_745, 0).saturating_mul(m.into())) - // Standard Error: 1_358 - .saturating_add(Weight::from_parts(148_047, 0).saturating_mul(p.into())) + // Minimum execution time: 31_545_000 picoseconds. + Weight::from_parts(33_432_774, 6676) + // Standard Error: 121 + .saturating_add(Weight::from_parts(232, 0).saturating_mul(b.into())) + // Standard Error: 1_263 + .saturating_add(Weight::from_parts(47_800, 0).saturating_mul(m.into())) + // Standard Error: 1_247 + .saturating_add(Weight::from_parts(188_655, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(4_u64)) .saturating_add(T::DbWeight::get().writes(4_u64)) .saturating_add(Weight::from_parts(0, 32).saturating_mul(m.into())) .saturating_add(Weight::from_parts(0, 36).saturating_mul(p.into())) } - /// Storage: Alliance Members (r:1 w:0) - /// Proof: Alliance Members (max_values: None, max_size: Some(3211), added: 5686, mode: MaxEncodedLen) - /// Storage: AllianceMotion Voting (r:1 w:1) - /// Proof Skipped: AllianceMotion Voting (max_values: None, max_size: None, mode: Measured) + /// Storage: `Alliance::Members` (r:1 w:0) + /// Proof: `Alliance::Members` (`max_values`: None, `max_size`: Some(3211), added: 5686, mode: `MaxEncodedLen`) + /// Storage: `AllianceMotion::Voting` (r:1 w:1) + /// Proof: `AllianceMotion::Voting` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `m` is `[5, 100]`. fn vote(m: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `1042 + m * (64 ±0)` + // Measured: `1147 + m * (64 ±0)` // Estimated: `6676 + m * (64 ±0)` - // Minimum execution time: 30_166_000 picoseconds. - Weight::from_parts(32_798_454, 6676) - // Standard Error: 1_432 - .saturating_add(Weight::from_parts(83_001, 0).saturating_mul(m.into())) + // Minimum execution time: 30_462_000 picoseconds. + Weight::from_parts(31_639_466, 6676) + // Standard Error: 980 + .saturating_add(Weight::from_parts(60_075, 0).saturating_mul(m.into())) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) .saturating_add(Weight::from_parts(0, 64).saturating_mul(m.into())) } - /// Storage: Alliance Members (r:1 w:0) - /// Proof: Alliance Members (max_values: None, max_size: Some(3211), added: 5686, mode: MaxEncodedLen) - /// Storage: AllianceMotion Voting (r:1 w:1) - /// Proof Skipped: AllianceMotion Voting (max_values: None, max_size: None, mode: Measured) - /// Storage: AllianceMotion Members (r:1 w:0) - /// Proof Skipped: AllianceMotion Members (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: AllianceMotion Proposals (r:1 w:1) - /// Proof Skipped: AllianceMotion Proposals (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: AllianceMotion ProposalOf (r:0 w:1) - /// Proof Skipped: AllianceMotion ProposalOf (max_values: None, max_size: None, mode: Measured) + /// Storage: `Alliance::Members` (r:1 w:0) + /// Proof: `Alliance::Members` (`max_values`: None, `max_size`: Some(3211), added: 5686, mode: `MaxEncodedLen`) + /// Storage: `AllianceMotion::Voting` (r:1 w:1) + /// Proof: `AllianceMotion::Voting` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `AllianceMotion::Members` (r:1 w:0) + /// Proof: `AllianceMotion::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `AllianceMotion::Proposals` (r:1 w:1) + /// Proof: `AllianceMotion::Proposals` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `AllianceMotion::ProposalOf` (r:0 w:1) + /// Proof: `AllianceMotion::ProposalOf` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `m` is `[4, 100]`. /// The range of component `p` is `[1, 100]`. fn close_early_disapproved(m: u32, p: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `576 + m * (96 ±0) + p * (36 ±0)` + // Measured: `674 + m * (96 ±0) + p * (36 ±0)` // Estimated: `6676 + m * (97 ±0) + p * (36 ±0)` - // Minimum execution time: 45_173_000 picoseconds. - Weight::from_parts(42_192_020, 6676) - // Standard Error: 1_456 - .saturating_add(Weight::from_parts(66_751, 0).saturating_mul(m.into())) - // Standard Error: 1_420 - .saturating_add(Weight::from_parts(158_161, 0).saturating_mul(p.into())) + // Minimum execution time: 40_765_000 picoseconds. + Weight::from_parts(37_690_472, 6676) + // Standard Error: 1_372 + .saturating_add(Weight::from_parts(69_441, 0).saturating_mul(m.into())) + // Standard Error: 1_338 + .saturating_add(Weight::from_parts(152_833, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(4_u64)) .saturating_add(T::DbWeight::get().writes(3_u64)) .saturating_add(Weight::from_parts(0, 97).saturating_mul(m.into())) .saturating_add(Weight::from_parts(0, 36).saturating_mul(p.into())) } - /// Storage: Alliance Members (r:1 w:0) - /// Proof: Alliance Members (max_values: None, max_size: Some(3211), added: 5686, mode: MaxEncodedLen) - /// Storage: AllianceMotion Voting (r:1 w:1) - /// Proof Skipped: AllianceMotion Voting (max_values: None, max_size: None, mode: Measured) - /// Storage: AllianceMotion Members (r:1 w:0) - /// Proof Skipped: AllianceMotion Members (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: AllianceMotion ProposalOf (r:1 w:1) - /// Proof Skipped: AllianceMotion ProposalOf (max_values: None, max_size: None, mode: Measured) - /// Storage: AllianceMotion Proposals (r:1 w:1) - /// Proof Skipped: AllianceMotion Proposals (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: `Alliance::Members` (r:1 w:0) + /// Proof: `Alliance::Members` (`max_values`: None, `max_size`: Some(3211), added: 5686, mode: `MaxEncodedLen`) + /// Storage: `AllianceMotion::Voting` (r:1 w:1) + /// Proof: `AllianceMotion::Voting` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `AllianceMotion::Members` (r:1 w:0) + /// Proof: `AllianceMotion::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `AllianceMotion::ProposalOf` (r:1 w:1) + /// Proof: `AllianceMotion::ProposalOf` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `SafeMode::EnteredUntil` (r:1 w:0) + /// Proof: `SafeMode::EnteredUntil` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `TxPause::PausedCalls` (r:1 w:0) + /// Proof: `TxPause::PausedCalls` (`max_values`: None, `max_size`: Some(532), added: 3007, mode: `MaxEncodedLen`) + /// Storage: `AllianceMotion::Proposals` (r:1 w:1) + /// Proof: `AllianceMotion::Proposals` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) /// The range of component `b` is `[1, 1024]`. /// The range of component `m` is `[4, 100]`. /// The range of component `p` is `[1, 100]`. fn close_early_approved(b: u32, m: u32, p: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `1087 + m * (96 ±0) + p * (39 ±0)` + // Measured: `1254 + m * (96 ±0) + p * (39 ±0)` // Estimated: `6676 + m * (97 ±0) + p * (40 ±0)` - // Minimum execution time: 58_290_000 picoseconds. - Weight::from_parts(54_924_919, 6676) - // Standard Error: 157 - .saturating_add(Weight::from_parts(464, 0).saturating_mul(b.into())) - // Standard Error: 1_665 - .saturating_add(Weight::from_parts(73_183, 0).saturating_mul(m.into())) - // Standard Error: 1_623 - .saturating_add(Weight::from_parts(168_318, 0).saturating_mul(p.into())) - .saturating_add(T::DbWeight::get().reads(5_u64)) + // Minimum execution time: 57_367_000 picoseconds. + Weight::from_parts(57_264_486, 6676) + // Standard Error: 141 + .saturating_add(Weight::from_parts(884, 0).saturating_mul(b.into())) + // Standard Error: 1_495 + .saturating_add(Weight::from_parts(57_869, 0).saturating_mul(m.into())) + // Standard Error: 1_458 + .saturating_add(Weight::from_parts(158_784, 0).saturating_mul(p.into())) + .saturating_add(T::DbWeight::get().reads(7_u64)) .saturating_add(T::DbWeight::get().writes(3_u64)) .saturating_add(Weight::from_parts(0, 97).saturating_mul(m.into())) .saturating_add(Weight::from_parts(0, 40).saturating_mul(p.into())) } - /// Storage: Alliance Members (r:1 w:0) - /// Proof: Alliance Members (max_values: None, max_size: Some(3211), added: 5686, mode: MaxEncodedLen) - /// Storage: AllianceMotion Voting (r:1 w:1) - /// Proof Skipped: AllianceMotion Voting (max_values: None, max_size: None, mode: Measured) - /// Storage: AllianceMotion Members (r:1 w:0) - /// Proof Skipped: AllianceMotion Members (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: AllianceMotion Prime (r:1 w:0) - /// Proof Skipped: AllianceMotion Prime (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: AllianceMotion Proposals (r:1 w:1) - /// Proof Skipped: AllianceMotion Proposals (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: AllianceMotion ProposalOf (r:0 w:1) - /// Proof Skipped: AllianceMotion ProposalOf (max_values: None, max_size: None, mode: Measured) + /// Storage: `Alliance::Members` (r:1 w:0) + /// Proof: `Alliance::Members` (`max_values`: None, `max_size`: Some(3211), added: 5686, mode: `MaxEncodedLen`) + /// Storage: `AllianceMotion::Voting` (r:1 w:1) + /// Proof: `AllianceMotion::Voting` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `AllianceMotion::Members` (r:1 w:0) + /// Proof: `AllianceMotion::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `AllianceMotion::Prime` (r:1 w:0) + /// Proof: `AllianceMotion::Prime` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `AllianceMotion::Proposals` (r:1 w:1) + /// Proof: `AllianceMotion::Proposals` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `AllianceMotion::ProposalOf` (r:0 w:1) + /// Proof: `AllianceMotion::ProposalOf` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `m` is `[2, 100]`. /// The range of component `p` is `[1, 100]`. fn close_disapproved(m: u32, p: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `577 + m * (96 ±0) + p * (36 ±0)` + // Measured: `675 + m * (96 ±0) + p * (36 ±0)` // Estimated: `6676 + m * (97 ±0) + p * (36 ±0)` - // Minimum execution time: 46_794_000 picoseconds. - Weight::from_parts(43_092_958, 6676) - // Standard Error: 1_273 - .saturating_add(Weight::from_parts(71_054, 0).saturating_mul(m.into())) - // Standard Error: 1_257 - .saturating_add(Weight::from_parts(152_820, 0).saturating_mul(p.into())) + // Minimum execution time: 41_253_000 picoseconds. + Weight::from_parts(37_550_833, 6676) + // Standard Error: 1_162 + .saturating_add(Weight::from_parts(77_359, 0).saturating_mul(m.into())) + // Standard Error: 1_148 + .saturating_add(Weight::from_parts(153_523, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(5_u64)) .saturating_add(T::DbWeight::get().writes(3_u64)) .saturating_add(Weight::from_parts(0, 97).saturating_mul(m.into())) .saturating_add(Weight::from_parts(0, 36).saturating_mul(p.into())) } - /// Storage: Alliance Members (r:1 w:0) - /// Proof: Alliance Members (max_values: None, max_size: Some(3211), added: 5686, mode: MaxEncodedLen) - /// Storage: AllianceMotion Voting (r:1 w:1) - /// Proof Skipped: AllianceMotion Voting (max_values: None, max_size: None, mode: Measured) - /// Storage: AllianceMotion Members (r:1 w:0) - /// Proof Skipped: AllianceMotion Members (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: AllianceMotion Prime (r:1 w:0) - /// Proof Skipped: AllianceMotion Prime (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: AllianceMotion Proposals (r:1 w:1) - /// Proof Skipped: AllianceMotion Proposals (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: AllianceMotion ProposalOf (r:0 w:1) - /// Proof Skipped: AllianceMotion ProposalOf (max_values: None, max_size: None, mode: Measured) + /// Storage: `Alliance::Members` (r:1 w:0) + /// Proof: `Alliance::Members` (`max_values`: None, `max_size`: Some(3211), added: 5686, mode: `MaxEncodedLen`) + /// Storage: `AllianceMotion::Voting` (r:1 w:1) + /// Proof: `AllianceMotion::Voting` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `AllianceMotion::Members` (r:1 w:0) + /// Proof: `AllianceMotion::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `AllianceMotion::Prime` (r:1 w:0) + /// Proof: `AllianceMotion::Prime` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `AllianceMotion::Proposals` (r:1 w:1) + /// Proof: `AllianceMotion::Proposals` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `AllianceMotion::ProposalOf` (r:0 w:1) + /// Proof: `AllianceMotion::ProposalOf` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `b` is `[1, 1024]`. /// The range of component `m` is `[5, 100]`. /// The range of component `p` is `[1, 100]`. fn close_approved(b: u32, m: u32, p: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `684 + m * (96 ±0) + p * (35 ±0)` + // Measured: `728 + m * (96 ±0) + p * (35 ±0)` // Estimated: `6676 + m * (97 ±0) + p * (36 ±0)` - // Minimum execution time: 47_338_000 picoseconds. - Weight::from_parts(41_257_479, 6676) - // Standard Error: 119 - .saturating_add(Weight::from_parts(1_019, 0).saturating_mul(b.into())) - // Standard Error: 1_277 - .saturating_add(Weight::from_parts(78_453, 0).saturating_mul(m.into())) - // Standard Error: 1_231 - .saturating_add(Weight::from_parts(150_991, 0).saturating_mul(p.into())) + // Minimum execution time: 42_385_000 picoseconds. + Weight::from_parts(37_222_159, 6676) + // Standard Error: 118 + .saturating_add(Weight::from_parts(1_743, 0).saturating_mul(b.into())) + // Standard Error: 1_268 + .saturating_add(Weight::from_parts(59_743, 0).saturating_mul(m.into())) + // Standard Error: 1_222 + .saturating_add(Weight::from_parts(159_606, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(5_u64)) .saturating_add(T::DbWeight::get().writes(3_u64)) .saturating_add(Weight::from_parts(0, 97).saturating_mul(m.into())) .saturating_add(Weight::from_parts(0, 36).saturating_mul(p.into())) } - /// Storage: Alliance Members (r:2 w:2) - /// Proof: Alliance Members (max_values: None, max_size: Some(3211), added: 5686, mode: MaxEncodedLen) - /// Storage: AllianceMotion Members (r:1 w:1) - /// Proof Skipped: AllianceMotion Members (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: `Alliance::Members` (r:2 w:2) + /// Proof: `Alliance::Members` (`max_values`: None, `max_size`: Some(3211), added: 5686, mode: `MaxEncodedLen`) + /// Storage: `AllianceMotion::Members` (r:1 w:1) + /// Proof: `AllianceMotion::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) /// The range of component `m` is `[1, 100]`. /// The range of component `z` is `[0, 100]`. fn init_members(m: u32, z: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `217` + // Measured: `284` // Estimated: `12362` - // Minimum execution time: 35_012_000 picoseconds. - Weight::from_parts(24_288_079, 12362) - // Standard Error: 878 - .saturating_add(Weight::from_parts(153_615, 0).saturating_mul(m.into())) - // Standard Error: 867 - .saturating_add(Weight::from_parts(129_307, 0).saturating_mul(z.into())) + // Minimum execution time: 31_184_000 picoseconds. + Weight::from_parts(22_860_208, 12362) + // Standard Error: 1_096 + .saturating_add(Weight::from_parts(129_834, 0).saturating_mul(m.into())) + // Standard Error: 1_083 + .saturating_add(Weight::from_parts(97_546, 0).saturating_mul(z.into())) .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(3_u64)) } - /// Storage: Alliance Members (r:2 w:2) - /// Proof: Alliance Members (max_values: None, max_size: Some(3211), added: 5686, mode: MaxEncodedLen) - /// Storage: AllianceMotion Proposals (r:1 w:0) - /// Proof Skipped: AllianceMotion Proposals (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Alliance DepositOf (r:200 w:50) - /// Proof: Alliance DepositOf (max_values: None, max_size: Some(64), added: 2539, mode: MaxEncodedLen) - /// Storage: System Account (r:50 w:50) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) - /// Storage: AllianceMotion Members (r:0 w:1) - /// Proof Skipped: AllianceMotion Members (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: AllianceMotion Prime (r:0 w:1) - /// Proof Skipped: AllianceMotion Prime (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: `Alliance::Members` (r:2 w:2) + /// Proof: `Alliance::Members` (`max_values`: None, `max_size`: Some(3211), added: 5686, mode: `MaxEncodedLen`) + /// Storage: `AllianceMotion::Proposals` (r:1 w:0) + /// Proof: `AllianceMotion::Proposals` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Alliance::DepositOf` (r:200 w:50) + /// Proof: `Alliance::DepositOf` (`max_values`: None, `max_size`: Some(64), added: 2539, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:50 w:50) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `AllianceMotion::Members` (r:0 w:1) + /// Proof: `AllianceMotion::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `AllianceMotion::Prime` (r:0 w:1) + /// Proof: `AllianceMotion::Prime` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) /// The range of component `x` is `[1, 100]`. /// The range of component `y` is `[0, 100]`. /// The range of component `z` is `[0, 50]`. @@ -280,14 +283,14 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `0 + x * (50 ±0) + y * (51 ±0) + z * (251 ±0)` // Estimated: `12362 + x * (2539 ±0) + y * (2539 ±0) + z * (2603 ±1)` - // Minimum execution time: 309_235_000 picoseconds. - Weight::from_parts(311_279_000, 12362) - // Standard Error: 26_510 - .saturating_add(Weight::from_parts(543_475, 0).saturating_mul(x.into())) - // Standard Error: 26_382 - .saturating_add(Weight::from_parts(603_169, 0).saturating_mul(y.into())) - // Standard Error: 52_716 - .saturating_add(Weight::from_parts(16_264_836, 0).saturating_mul(z.into())) + // Minimum execution time: 359_308_000 picoseconds. + Weight::from_parts(361_696_000, 12362) + // Standard Error: 30_917 + .saturating_add(Weight::from_parts(657_166, 0).saturating_mul(x.into())) + // Standard Error: 30_768 + .saturating_add(Weight::from_parts(670_249, 0).saturating_mul(y.into())) + // Standard Error: 61_480 + .saturating_add(Weight::from_parts(14_340_554, 0).saturating_mul(z.into())) .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(x.into()))) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(y.into()))) @@ -298,397 +301,401 @@ impl WeightInfo for SubstrateWeight { .saturating_add(Weight::from_parts(0, 2539).saturating_mul(y.into())) .saturating_add(Weight::from_parts(0, 2603).saturating_mul(z.into())) } - /// Storage: Alliance Rule (r:0 w:1) - /// Proof: Alliance Rule (max_values: Some(1), max_size: Some(87), added: 582, mode: MaxEncodedLen) + /// Storage: `Alliance::Rule` (r:0 w:1) + /// Proof: `Alliance::Rule` (`max_values`: Some(1), `max_size`: Some(87), added: 582, mode: `MaxEncodedLen`) fn set_rule() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 8_833_000 picoseconds. - Weight::from_parts(9_313_000, 0) + // Minimum execution time: 6_146_000 picoseconds. + Weight::from_parts(6_540_000, 0) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: Alliance Announcements (r:1 w:1) - /// Proof: Alliance Announcements (max_values: Some(1), max_size: Some(8702), added: 9197, mode: MaxEncodedLen) + /// Storage: `Alliance::Announcements` (r:1 w:1) + /// Proof: `Alliance::Announcements` (`max_values`: Some(1), `max_size`: Some(8702), added: 9197, mode: `MaxEncodedLen`) fn announce() -> Weight { // Proof Size summary in bytes: - // Measured: `246` + // Measured: `279` // Estimated: `10187` - // Minimum execution time: 12_231_000 picoseconds. - Weight::from_parts(12_761_000, 10187) + // Minimum execution time: 9_008_000 picoseconds. + Weight::from_parts(9_835_000, 10187) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: Alliance Announcements (r:1 w:1) - /// Proof: Alliance Announcements (max_values: Some(1), max_size: Some(8702), added: 9197, mode: MaxEncodedLen) + /// Storage: `Alliance::Announcements` (r:1 w:1) + /// Proof: `Alliance::Announcements` (`max_values`: Some(1), `max_size`: Some(8702), added: 9197, mode: `MaxEncodedLen`) fn remove_announcement() -> Weight { // Proof Size summary in bytes: - // Measured: `319` + // Measured: `352` // Estimated: `10187` - // Minimum execution time: 13_079_000 picoseconds. - Weight::from_parts(13_612_000, 10187) + // Minimum execution time: 10_308_000 picoseconds. + Weight::from_parts(10_602_000, 10187) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: Alliance Members (r:3 w:1) - /// Proof: Alliance Members (max_values: None, max_size: Some(3211), added: 5686, mode: MaxEncodedLen) - /// Storage: Alliance UnscrupulousAccounts (r:1 w:0) - /// Proof: Alliance UnscrupulousAccounts (max_values: Some(1), max_size: Some(3202), added: 3697, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) - /// Storage: Alliance DepositOf (r:0 w:1) - /// Proof: Alliance DepositOf (max_values: None, max_size: Some(64), added: 2539, mode: MaxEncodedLen) + /// Storage: `Alliance::Members` (r:3 w:1) + /// Proof: `Alliance::Members` (`max_values`: None, `max_size`: Some(3211), added: 5686, mode: `MaxEncodedLen`) + /// Storage: `Alliance::UnscrupulousAccounts` (r:1 w:0) + /// Proof: `Alliance::UnscrupulousAccounts` (`max_values`: Some(1), `max_size`: Some(3202), added: 3697, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `Alliance::DepositOf` (r:0 w:1) + /// Proof: `Alliance::DepositOf` (`max_values`: None, `max_size`: Some(64), added: 2539, mode: `MaxEncodedLen`) fn join_alliance() -> Weight { // Proof Size summary in bytes: - // Measured: `468` + // Measured: `501` // Estimated: `18048` - // Minimum execution time: 44_574_000 picoseconds. - Weight::from_parts(46_157_000, 18048) + // Minimum execution time: 40_731_000 picoseconds. + Weight::from_parts(42_453_000, 18048) .saturating_add(T::DbWeight::get().reads(5_u64)) .saturating_add(T::DbWeight::get().writes(3_u64)) } - /// Storage: Alliance Members (r:3 w:1) - /// Proof: Alliance Members (max_values: None, max_size: Some(3211), added: 5686, mode: MaxEncodedLen) - /// Storage: Alliance UnscrupulousAccounts (r:1 w:0) - /// Proof: Alliance UnscrupulousAccounts (max_values: Some(1), max_size: Some(3202), added: 3697, mode: MaxEncodedLen) + /// Storage: `Alliance::Members` (r:3 w:1) + /// Proof: `Alliance::Members` (`max_values`: None, `max_size`: Some(3211), added: 5686, mode: `MaxEncodedLen`) + /// Storage: `Alliance::UnscrupulousAccounts` (r:1 w:0) + /// Proof: `Alliance::UnscrupulousAccounts` (`max_values`: Some(1), `max_size`: Some(3202), added: 3697, mode: `MaxEncodedLen`) fn nominate_ally() -> Weight { // Proof Size summary in bytes: - // Measured: `367` + // Measured: `400` // Estimated: `18048` - // Minimum execution time: 26_114_000 picoseconds. - Weight::from_parts(27_069_000, 18048) + // Minimum execution time: 24_198_000 picoseconds. + Weight::from_parts(25_258_000, 18048) .saturating_add(T::DbWeight::get().reads(4_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: Alliance Members (r:2 w:2) - /// Proof: Alliance Members (max_values: None, max_size: Some(3211), added: 5686, mode: MaxEncodedLen) - /// Storage: AllianceMotion Proposals (r:1 w:0) - /// Proof Skipped: AllianceMotion Proposals (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: AllianceMotion Members (r:0 w:1) - /// Proof Skipped: AllianceMotion Members (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: AllianceMotion Prime (r:0 w:1) - /// Proof Skipped: AllianceMotion Prime (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: `Alliance::Members` (r:2 w:2) + /// Proof: `Alliance::Members` (`max_values`: None, `max_size`: Some(3211), added: 5686, mode: `MaxEncodedLen`) + /// Storage: `AllianceMotion::Proposals` (r:1 w:0) + /// Proof: `AllianceMotion::Proposals` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `AllianceMotion::Members` (r:0 w:1) + /// Proof: `AllianceMotion::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `AllianceMotion::Prime` (r:0 w:1) + /// Proof: `AllianceMotion::Prime` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) fn elevate_ally() -> Weight { // Proof Size summary in bytes: - // Measured: `443` + // Measured: `510` // Estimated: `12362` - // Minimum execution time: 25_882_000 picoseconds. - Weight::from_parts(26_923_000, 12362) + // Minimum execution time: 24_509_000 picoseconds. + Weight::from_parts(25_490_000, 12362) .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(4_u64)) } - /// Storage: Alliance Members (r:4 w:2) - /// Proof: Alliance Members (max_values: None, max_size: Some(3211), added: 5686, mode: MaxEncodedLen) - /// Storage: AllianceMotion Proposals (r:1 w:0) - /// Proof Skipped: AllianceMotion Proposals (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: AllianceMotion Members (r:0 w:1) - /// Proof Skipped: AllianceMotion Members (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: AllianceMotion Prime (r:0 w:1) - /// Proof Skipped: AllianceMotion Prime (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Alliance RetiringMembers (r:0 w:1) - /// Proof: Alliance RetiringMembers (max_values: None, max_size: Some(52), added: 2527, mode: MaxEncodedLen) + /// Storage: `Alliance::Members` (r:4 w:2) + /// Proof: `Alliance::Members` (`max_values`: None, `max_size`: Some(3211), added: 5686, mode: `MaxEncodedLen`) + /// Storage: `AllianceMotion::Proposals` (r:1 w:0) + /// Proof: `AllianceMotion::Proposals` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `AllianceMotion::Members` (r:0 w:1) + /// Proof: `AllianceMotion::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `AllianceMotion::Prime` (r:0 w:1) + /// Proof: `AllianceMotion::Prime` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Alliance::RetiringMembers` (r:0 w:1) + /// Proof: `Alliance::RetiringMembers` (`max_values`: None, `max_size`: Some(52), added: 2527, mode: `MaxEncodedLen`) fn give_retirement_notice() -> Weight { // Proof Size summary in bytes: - // Measured: `443` + // Measured: `510` // Estimated: `23734` - // Minimum execution time: 34_112_000 picoseconds. - Weight::from_parts(35_499_000, 23734) + // Minimum execution time: 30_889_000 picoseconds. + Weight::from_parts(31_930_000, 23734) .saturating_add(T::DbWeight::get().reads(5_u64)) .saturating_add(T::DbWeight::get().writes(5_u64)) } - /// Storage: Alliance RetiringMembers (r:1 w:1) - /// Proof: Alliance RetiringMembers (max_values: None, max_size: Some(52), added: 2527, mode: MaxEncodedLen) - /// Storage: Alliance Members (r:1 w:1) - /// Proof: Alliance Members (max_values: None, max_size: Some(3211), added: 5686, mode: MaxEncodedLen) - /// Storage: Alliance DepositOf (r:1 w:1) - /// Proof: Alliance DepositOf (max_values: None, max_size: Some(64), added: 2539, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: `Alliance::RetiringMembers` (r:1 w:1) + /// Proof: `Alliance::RetiringMembers` (`max_values`: None, `max_size`: Some(52), added: 2527, mode: `MaxEncodedLen`) + /// Storage: `Alliance::Members` (r:1 w:1) + /// Proof: `Alliance::Members` (`max_values`: None, `max_size`: Some(3211), added: 5686, mode: `MaxEncodedLen`) + /// Storage: `Alliance::DepositOf` (r:1 w:1) + /// Proof: `Alliance::DepositOf` (`max_values`: None, `max_size`: Some(64), added: 2539, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) fn retire() -> Weight { // Proof Size summary in bytes: - // Measured: `687` + // Measured: `720` // Estimated: `6676` - // Minimum execution time: 41_239_000 picoseconds. - Weight::from_parts(42_764_000, 6676) + // Minimum execution time: 38_363_000 picoseconds. + Weight::from_parts(39_428_000, 6676) .saturating_add(T::DbWeight::get().reads(4_u64)) .saturating_add(T::DbWeight::get().writes(4_u64)) } - /// Storage: Alliance Members (r:3 w:1) - /// Proof: Alliance Members (max_values: None, max_size: Some(3211), added: 5686, mode: MaxEncodedLen) - /// Storage: AllianceMotion Proposals (r:1 w:0) - /// Proof Skipped: AllianceMotion Proposals (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Alliance DepositOf (r:1 w:1) - /// Proof: Alliance DepositOf (max_values: None, max_size: Some(64), added: 2539, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) - /// Storage: AllianceMotion Members (r:0 w:1) - /// Proof Skipped: AllianceMotion Members (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: AllianceMotion Prime (r:0 w:1) - /// Proof Skipped: AllianceMotion Prime (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: `Alliance::Members` (r:3 w:1) + /// Proof: `Alliance::Members` (`max_values`: None, `max_size`: Some(3211), added: 5686, mode: `MaxEncodedLen`) + /// Storage: `AllianceMotion::Proposals` (r:1 w:0) + /// Proof: `AllianceMotion::Proposals` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Alliance::DepositOf` (r:1 w:1) + /// Proof: `Alliance::DepositOf` (`max_values`: None, `max_size`: Some(64), added: 2539, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `AllianceMotion::Members` (r:0 w:1) + /// Proof: `AllianceMotion::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `AllianceMotion::Prime` (r:0 w:1) + /// Proof: `AllianceMotion::Prime` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) fn kick_member() -> Weight { // Proof Size summary in bytes: - // Measured: `707` + // Measured: `774` // Estimated: `18048` - // Minimum execution time: 68_071_000 picoseconds. - Weight::from_parts(71_808_000, 18048) + // Minimum execution time: 60_717_000 picoseconds. + Weight::from_parts(61_785_000, 18048) .saturating_add(T::DbWeight::get().reads(6_u64)) .saturating_add(T::DbWeight::get().writes(5_u64)) } - /// Storage: Alliance UnscrupulousAccounts (r:1 w:1) - /// Proof: Alliance UnscrupulousAccounts (max_values: Some(1), max_size: Some(3202), added: 3697, mode: MaxEncodedLen) - /// Storage: Alliance UnscrupulousWebsites (r:1 w:1) - /// Proof: Alliance UnscrupulousWebsites (max_values: Some(1), max_size: Some(25702), added: 26197, mode: MaxEncodedLen) + /// Storage: `Alliance::UnscrupulousAccounts` (r:1 w:1) + /// Proof: `Alliance::UnscrupulousAccounts` (`max_values`: Some(1), `max_size`: Some(3202), added: 3697, mode: `MaxEncodedLen`) + /// Storage: `Alliance::UnscrupulousWebsites` (r:1 w:1) + /// Proof: `Alliance::UnscrupulousWebsites` (`max_values`: Some(1), `max_size`: Some(25702), added: 26197, mode: `MaxEncodedLen`) /// The range of component `n` is `[0, 100]`. /// The range of component `l` is `[0, 255]`. fn add_unscrupulous_items(n: u32, l: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `246` + // Measured: `279` // Estimated: `27187` - // Minimum execution time: 7_006_000 picoseconds. - Weight::from_parts(7_253_000, 27187) - // Standard Error: 3_403 - .saturating_add(Weight::from_parts(1_680_082, 0).saturating_mul(n.into())) - // Standard Error: 1_333 - .saturating_add(Weight::from_parts(72_943, 0).saturating_mul(l.into())) + // Minimum execution time: 5_393_000 picoseconds. + Weight::from_parts(5_577_000, 27187) + // Standard Error: 3_099 + .saturating_add(Weight::from_parts(1_043_175, 0).saturating_mul(n.into())) + // Standard Error: 1_213 + .saturating_add(Weight::from_parts(71_633, 0).saturating_mul(l.into())) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } - /// Storage: Alliance UnscrupulousAccounts (r:1 w:1) - /// Proof: Alliance UnscrupulousAccounts (max_values: Some(1), max_size: Some(3202), added: 3697, mode: MaxEncodedLen) - /// Storage: Alliance UnscrupulousWebsites (r:1 w:1) - /// Proof: Alliance UnscrupulousWebsites (max_values: Some(1), max_size: Some(25702), added: 26197, mode: MaxEncodedLen) + /// Storage: `Alliance::UnscrupulousAccounts` (r:1 w:1) + /// Proof: `Alliance::UnscrupulousAccounts` (`max_values`: Some(1), `max_size`: Some(3202), added: 3697, mode: `MaxEncodedLen`) + /// Storage: `Alliance::UnscrupulousWebsites` (r:1 w:1) + /// Proof: `Alliance::UnscrupulousWebsites` (`max_values`: Some(1), `max_size`: Some(25702), added: 26197, mode: `MaxEncodedLen`) /// The range of component `n` is `[0, 100]`. /// The range of component `l` is `[0, 255]`. fn remove_unscrupulous_items(n: u32, l: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `0 + l * (100 ±0) + n * (289 ±0)` // Estimated: `27187` - // Minimum execution time: 7_292_000 picoseconds. - Weight::from_parts(7_629_000, 27187) - // Standard Error: 176_225 - .saturating_add(Weight::from_parts(16_646_429, 0).saturating_mul(n.into())) - // Standard Error: 69_017 - .saturating_add(Weight::from_parts(310_978, 0).saturating_mul(l.into())) + // Minimum execution time: 5_318_000 picoseconds. + Weight::from_parts(5_581_000, 27187) + // Standard Error: 188_914 + .saturating_add(Weight::from_parts(17_878_267, 0).saturating_mul(n.into())) + // Standard Error: 73_987 + .saturating_add(Weight::from_parts(258_754, 0).saturating_mul(l.into())) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } - /// Storage: Alliance Members (r:3 w:2) - /// Proof: Alliance Members (max_values: None, max_size: Some(3211), added: 5686, mode: MaxEncodedLen) - /// Storage: AllianceMotion Proposals (r:1 w:0) - /// Proof Skipped: AllianceMotion Proposals (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: AllianceMotion Members (r:0 w:1) - /// Proof Skipped: AllianceMotion Members (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: AllianceMotion Prime (r:0 w:1) - /// Proof Skipped: AllianceMotion Prime (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: `Alliance::Members` (r:3 w:2) + /// Proof: `Alliance::Members` (`max_values`: None, `max_size`: Some(3211), added: 5686, mode: `MaxEncodedLen`) + /// Storage: `AllianceMotion::Proposals` (r:1 w:0) + /// Proof: `AllianceMotion::Proposals` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `AllianceMotion::Members` (r:0 w:1) + /// Proof: `AllianceMotion::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `AllianceMotion::Prime` (r:0 w:1) + /// Proof: `AllianceMotion::Prime` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) fn abdicate_fellow_status() -> Weight { // Proof Size summary in bytes: - // Measured: `443` + // Measured: `510` // Estimated: `18048` - // Minimum execution time: 31_798_000 picoseconds. - Weight::from_parts(33_463_000, 18048) + // Minimum execution time: 29_423_000 picoseconds. + Weight::from_parts(30_141_000, 18048) .saturating_add(T::DbWeight::get().reads(4_u64)) .saturating_add(T::DbWeight::get().writes(4_u64)) } } -// For backwards compatibility and tests +// For backwards compatibility and tests. impl WeightInfo for () { - /// Storage: Alliance Members (r:1 w:0) - /// Proof: Alliance Members (max_values: None, max_size: Some(3211), added: 5686, mode: MaxEncodedLen) - /// Storage: AllianceMotion ProposalOf (r:1 w:1) - /// Proof Skipped: AllianceMotion ProposalOf (max_values: None, max_size: None, mode: Measured) - /// Storage: AllianceMotion Proposals (r:1 w:1) - /// Proof Skipped: AllianceMotion Proposals (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: AllianceMotion ProposalCount (r:1 w:1) - /// Proof Skipped: AllianceMotion ProposalCount (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: AllianceMotion Voting (r:0 w:1) - /// Proof Skipped: AllianceMotion Voting (max_values: None, max_size: None, mode: Measured) + /// Storage: `Alliance::Members` (r:1 w:0) + /// Proof: `Alliance::Members` (`max_values`: None, `max_size`: Some(3211), added: 5686, mode: `MaxEncodedLen`) + /// Storage: `AllianceMotion::ProposalOf` (r:1 w:1) + /// Proof: `AllianceMotion::ProposalOf` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `AllianceMotion::Proposals` (r:1 w:1) + /// Proof: `AllianceMotion::Proposals` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `AllianceMotion::ProposalCount` (r:1 w:1) + /// Proof: `AllianceMotion::ProposalCount` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `AllianceMotion::Voting` (r:0 w:1) + /// Proof: `AllianceMotion::Voting` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `b` is `[1, 1024]`. /// The range of component `m` is `[2, 100]`. /// The range of component `p` is `[1, 100]`. fn propose_proposed(b: u32, m: u32, p: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `653 + m * (32 ±0) + p * (35 ±0)` + // Measured: `688 + m * (32 ±0) + p * (36 ±0)` // Estimated: `6676 + m * (32 ±0) + p * (36 ±0)` - // Minimum execution time: 36_908_000 picoseconds. - Weight::from_parts(39_040_304, 6676) - // Standard Error: 131 - .saturating_add(Weight::from_parts(781, 0).saturating_mul(b.into())) - // Standard Error: 1_375 - .saturating_add(Weight::from_parts(48_745, 0).saturating_mul(m.into())) - // Standard Error: 1_358 - .saturating_add(Weight::from_parts(148_047, 0).saturating_mul(p.into())) + // Minimum execution time: 31_545_000 picoseconds. + Weight::from_parts(33_432_774, 6676) + // Standard Error: 121 + .saturating_add(Weight::from_parts(232, 0).saturating_mul(b.into())) + // Standard Error: 1_263 + .saturating_add(Weight::from_parts(47_800, 0).saturating_mul(m.into())) + // Standard Error: 1_247 + .saturating_add(Weight::from_parts(188_655, 0).saturating_mul(p.into())) .saturating_add(RocksDbWeight::get().reads(4_u64)) .saturating_add(RocksDbWeight::get().writes(4_u64)) .saturating_add(Weight::from_parts(0, 32).saturating_mul(m.into())) .saturating_add(Weight::from_parts(0, 36).saturating_mul(p.into())) } - /// Storage: Alliance Members (r:1 w:0) - /// Proof: Alliance Members (max_values: None, max_size: Some(3211), added: 5686, mode: MaxEncodedLen) - /// Storage: AllianceMotion Voting (r:1 w:1) - /// Proof Skipped: AllianceMotion Voting (max_values: None, max_size: None, mode: Measured) + /// Storage: `Alliance::Members` (r:1 w:0) + /// Proof: `Alliance::Members` (`max_values`: None, `max_size`: Some(3211), added: 5686, mode: `MaxEncodedLen`) + /// Storage: `AllianceMotion::Voting` (r:1 w:1) + /// Proof: `AllianceMotion::Voting` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `m` is `[5, 100]`. fn vote(m: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `1042 + m * (64 ±0)` + // Measured: `1147 + m * (64 ±0)` // Estimated: `6676 + m * (64 ±0)` - // Minimum execution time: 30_166_000 picoseconds. - Weight::from_parts(32_798_454, 6676) - // Standard Error: 1_432 - .saturating_add(Weight::from_parts(83_001, 0).saturating_mul(m.into())) + // Minimum execution time: 30_462_000 picoseconds. + Weight::from_parts(31_639_466, 6676) + // Standard Error: 980 + .saturating_add(Weight::from_parts(60_075, 0).saturating_mul(m.into())) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) .saturating_add(Weight::from_parts(0, 64).saturating_mul(m.into())) } - /// Storage: Alliance Members (r:1 w:0) - /// Proof: Alliance Members (max_values: None, max_size: Some(3211), added: 5686, mode: MaxEncodedLen) - /// Storage: AllianceMotion Voting (r:1 w:1) - /// Proof Skipped: AllianceMotion Voting (max_values: None, max_size: None, mode: Measured) - /// Storage: AllianceMotion Members (r:1 w:0) - /// Proof Skipped: AllianceMotion Members (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: AllianceMotion Proposals (r:1 w:1) - /// Proof Skipped: AllianceMotion Proposals (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: AllianceMotion ProposalOf (r:0 w:1) - /// Proof Skipped: AllianceMotion ProposalOf (max_values: None, max_size: None, mode: Measured) + /// Storage: `Alliance::Members` (r:1 w:0) + /// Proof: `Alliance::Members` (`max_values`: None, `max_size`: Some(3211), added: 5686, mode: `MaxEncodedLen`) + /// Storage: `AllianceMotion::Voting` (r:1 w:1) + /// Proof: `AllianceMotion::Voting` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `AllianceMotion::Members` (r:1 w:0) + /// Proof: `AllianceMotion::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `AllianceMotion::Proposals` (r:1 w:1) + /// Proof: `AllianceMotion::Proposals` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `AllianceMotion::ProposalOf` (r:0 w:1) + /// Proof: `AllianceMotion::ProposalOf` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `m` is `[4, 100]`. /// The range of component `p` is `[1, 100]`. fn close_early_disapproved(m: u32, p: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `576 + m * (96 ±0) + p * (36 ±0)` + // Measured: `674 + m * (96 ±0) + p * (36 ±0)` // Estimated: `6676 + m * (97 ±0) + p * (36 ±0)` - // Minimum execution time: 45_173_000 picoseconds. - Weight::from_parts(42_192_020, 6676) - // Standard Error: 1_456 - .saturating_add(Weight::from_parts(66_751, 0).saturating_mul(m.into())) - // Standard Error: 1_420 - .saturating_add(Weight::from_parts(158_161, 0).saturating_mul(p.into())) + // Minimum execution time: 40_765_000 picoseconds. + Weight::from_parts(37_690_472, 6676) + // Standard Error: 1_372 + .saturating_add(Weight::from_parts(69_441, 0).saturating_mul(m.into())) + // Standard Error: 1_338 + .saturating_add(Weight::from_parts(152_833, 0).saturating_mul(p.into())) .saturating_add(RocksDbWeight::get().reads(4_u64)) .saturating_add(RocksDbWeight::get().writes(3_u64)) .saturating_add(Weight::from_parts(0, 97).saturating_mul(m.into())) .saturating_add(Weight::from_parts(0, 36).saturating_mul(p.into())) } - /// Storage: Alliance Members (r:1 w:0) - /// Proof: Alliance Members (max_values: None, max_size: Some(3211), added: 5686, mode: MaxEncodedLen) - /// Storage: AllianceMotion Voting (r:1 w:1) - /// Proof Skipped: AllianceMotion Voting (max_values: None, max_size: None, mode: Measured) - /// Storage: AllianceMotion Members (r:1 w:0) - /// Proof Skipped: AllianceMotion Members (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: AllianceMotion ProposalOf (r:1 w:1) - /// Proof Skipped: AllianceMotion ProposalOf (max_values: None, max_size: None, mode: Measured) - /// Storage: AllianceMotion Proposals (r:1 w:1) - /// Proof Skipped: AllianceMotion Proposals (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: `Alliance::Members` (r:1 w:0) + /// Proof: `Alliance::Members` (`max_values`: None, `max_size`: Some(3211), added: 5686, mode: `MaxEncodedLen`) + /// Storage: `AllianceMotion::Voting` (r:1 w:1) + /// Proof: `AllianceMotion::Voting` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `AllianceMotion::Members` (r:1 w:0) + /// Proof: `AllianceMotion::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `AllianceMotion::ProposalOf` (r:1 w:1) + /// Proof: `AllianceMotion::ProposalOf` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `SafeMode::EnteredUntil` (r:1 w:0) + /// Proof: `SafeMode::EnteredUntil` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `TxPause::PausedCalls` (r:1 w:0) + /// Proof: `TxPause::PausedCalls` (`max_values`: None, `max_size`: Some(532), added: 3007, mode: `MaxEncodedLen`) + /// Storage: `AllianceMotion::Proposals` (r:1 w:1) + /// Proof: `AllianceMotion::Proposals` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) /// The range of component `b` is `[1, 1024]`. /// The range of component `m` is `[4, 100]`. /// The range of component `p` is `[1, 100]`. fn close_early_approved(b: u32, m: u32, p: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `1087 + m * (96 ±0) + p * (39 ±0)` + // Measured: `1254 + m * (96 ±0) + p * (39 ±0)` // Estimated: `6676 + m * (97 ±0) + p * (40 ±0)` - // Minimum execution time: 58_290_000 picoseconds. - Weight::from_parts(54_924_919, 6676) - // Standard Error: 157 - .saturating_add(Weight::from_parts(464, 0).saturating_mul(b.into())) - // Standard Error: 1_665 - .saturating_add(Weight::from_parts(73_183, 0).saturating_mul(m.into())) - // Standard Error: 1_623 - .saturating_add(Weight::from_parts(168_318, 0).saturating_mul(p.into())) - .saturating_add(RocksDbWeight::get().reads(5_u64)) + // Minimum execution time: 57_367_000 picoseconds. + Weight::from_parts(57_264_486, 6676) + // Standard Error: 141 + .saturating_add(Weight::from_parts(884, 0).saturating_mul(b.into())) + // Standard Error: 1_495 + .saturating_add(Weight::from_parts(57_869, 0).saturating_mul(m.into())) + // Standard Error: 1_458 + .saturating_add(Weight::from_parts(158_784, 0).saturating_mul(p.into())) + .saturating_add(RocksDbWeight::get().reads(7_u64)) .saturating_add(RocksDbWeight::get().writes(3_u64)) .saturating_add(Weight::from_parts(0, 97).saturating_mul(m.into())) .saturating_add(Weight::from_parts(0, 40).saturating_mul(p.into())) } - /// Storage: Alliance Members (r:1 w:0) - /// Proof: Alliance Members (max_values: None, max_size: Some(3211), added: 5686, mode: MaxEncodedLen) - /// Storage: AllianceMotion Voting (r:1 w:1) - /// Proof Skipped: AllianceMotion Voting (max_values: None, max_size: None, mode: Measured) - /// Storage: AllianceMotion Members (r:1 w:0) - /// Proof Skipped: AllianceMotion Members (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: AllianceMotion Prime (r:1 w:0) - /// Proof Skipped: AllianceMotion Prime (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: AllianceMotion Proposals (r:1 w:1) - /// Proof Skipped: AllianceMotion Proposals (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: AllianceMotion ProposalOf (r:0 w:1) - /// Proof Skipped: AllianceMotion ProposalOf (max_values: None, max_size: None, mode: Measured) + /// Storage: `Alliance::Members` (r:1 w:0) + /// Proof: `Alliance::Members` (`max_values`: None, `max_size`: Some(3211), added: 5686, mode: `MaxEncodedLen`) + /// Storage: `AllianceMotion::Voting` (r:1 w:1) + /// Proof: `AllianceMotion::Voting` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `AllianceMotion::Members` (r:1 w:0) + /// Proof: `AllianceMotion::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `AllianceMotion::Prime` (r:1 w:0) + /// Proof: `AllianceMotion::Prime` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `AllianceMotion::Proposals` (r:1 w:1) + /// Proof: `AllianceMotion::Proposals` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `AllianceMotion::ProposalOf` (r:0 w:1) + /// Proof: `AllianceMotion::ProposalOf` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `m` is `[2, 100]`. /// The range of component `p` is `[1, 100]`. fn close_disapproved(m: u32, p: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `577 + m * (96 ±0) + p * (36 ±0)` + // Measured: `675 + m * (96 ±0) + p * (36 ±0)` // Estimated: `6676 + m * (97 ±0) + p * (36 ±0)` - // Minimum execution time: 46_794_000 picoseconds. - Weight::from_parts(43_092_958, 6676) - // Standard Error: 1_273 - .saturating_add(Weight::from_parts(71_054, 0).saturating_mul(m.into())) - // Standard Error: 1_257 - .saturating_add(Weight::from_parts(152_820, 0).saturating_mul(p.into())) + // Minimum execution time: 41_253_000 picoseconds. + Weight::from_parts(37_550_833, 6676) + // Standard Error: 1_162 + .saturating_add(Weight::from_parts(77_359, 0).saturating_mul(m.into())) + // Standard Error: 1_148 + .saturating_add(Weight::from_parts(153_523, 0).saturating_mul(p.into())) .saturating_add(RocksDbWeight::get().reads(5_u64)) .saturating_add(RocksDbWeight::get().writes(3_u64)) .saturating_add(Weight::from_parts(0, 97).saturating_mul(m.into())) .saturating_add(Weight::from_parts(0, 36).saturating_mul(p.into())) } - /// Storage: Alliance Members (r:1 w:0) - /// Proof: Alliance Members (max_values: None, max_size: Some(3211), added: 5686, mode: MaxEncodedLen) - /// Storage: AllianceMotion Voting (r:1 w:1) - /// Proof Skipped: AllianceMotion Voting (max_values: None, max_size: None, mode: Measured) - /// Storage: AllianceMotion Members (r:1 w:0) - /// Proof Skipped: AllianceMotion Members (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: AllianceMotion Prime (r:1 w:0) - /// Proof Skipped: AllianceMotion Prime (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: AllianceMotion Proposals (r:1 w:1) - /// Proof Skipped: AllianceMotion Proposals (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: AllianceMotion ProposalOf (r:0 w:1) - /// Proof Skipped: AllianceMotion ProposalOf (max_values: None, max_size: None, mode: Measured) + /// Storage: `Alliance::Members` (r:1 w:0) + /// Proof: `Alliance::Members` (`max_values`: None, `max_size`: Some(3211), added: 5686, mode: `MaxEncodedLen`) + /// Storage: `AllianceMotion::Voting` (r:1 w:1) + /// Proof: `AllianceMotion::Voting` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `AllianceMotion::Members` (r:1 w:0) + /// Proof: `AllianceMotion::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `AllianceMotion::Prime` (r:1 w:0) + /// Proof: `AllianceMotion::Prime` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `AllianceMotion::Proposals` (r:1 w:1) + /// Proof: `AllianceMotion::Proposals` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `AllianceMotion::ProposalOf` (r:0 w:1) + /// Proof: `AllianceMotion::ProposalOf` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `b` is `[1, 1024]`. /// The range of component `m` is `[5, 100]`. /// The range of component `p` is `[1, 100]`. fn close_approved(b: u32, m: u32, p: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `684 + m * (96 ±0) + p * (35 ±0)` + // Measured: `728 + m * (96 ±0) + p * (35 ±0)` // Estimated: `6676 + m * (97 ±0) + p * (36 ±0)` - // Minimum execution time: 47_338_000 picoseconds. - Weight::from_parts(41_257_479, 6676) - // Standard Error: 119 - .saturating_add(Weight::from_parts(1_019, 0).saturating_mul(b.into())) - // Standard Error: 1_277 - .saturating_add(Weight::from_parts(78_453, 0).saturating_mul(m.into())) - // Standard Error: 1_231 - .saturating_add(Weight::from_parts(150_991, 0).saturating_mul(p.into())) + // Minimum execution time: 42_385_000 picoseconds. + Weight::from_parts(37_222_159, 6676) + // Standard Error: 118 + .saturating_add(Weight::from_parts(1_743, 0).saturating_mul(b.into())) + // Standard Error: 1_268 + .saturating_add(Weight::from_parts(59_743, 0).saturating_mul(m.into())) + // Standard Error: 1_222 + .saturating_add(Weight::from_parts(159_606, 0).saturating_mul(p.into())) .saturating_add(RocksDbWeight::get().reads(5_u64)) .saturating_add(RocksDbWeight::get().writes(3_u64)) .saturating_add(Weight::from_parts(0, 97).saturating_mul(m.into())) .saturating_add(Weight::from_parts(0, 36).saturating_mul(p.into())) } - /// Storage: Alliance Members (r:2 w:2) - /// Proof: Alliance Members (max_values: None, max_size: Some(3211), added: 5686, mode: MaxEncodedLen) - /// Storage: AllianceMotion Members (r:1 w:1) - /// Proof Skipped: AllianceMotion Members (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: `Alliance::Members` (r:2 w:2) + /// Proof: `Alliance::Members` (`max_values`: None, `max_size`: Some(3211), added: 5686, mode: `MaxEncodedLen`) + /// Storage: `AllianceMotion::Members` (r:1 w:1) + /// Proof: `AllianceMotion::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) /// The range of component `m` is `[1, 100]`. /// The range of component `z` is `[0, 100]`. fn init_members(m: u32, z: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `217` + // Measured: `284` // Estimated: `12362` - // Minimum execution time: 35_012_000 picoseconds. - Weight::from_parts(24_288_079, 12362) - // Standard Error: 878 - .saturating_add(Weight::from_parts(153_615, 0).saturating_mul(m.into())) - // Standard Error: 867 - .saturating_add(Weight::from_parts(129_307, 0).saturating_mul(z.into())) + // Minimum execution time: 31_184_000 picoseconds. + Weight::from_parts(22_860_208, 12362) + // Standard Error: 1_096 + .saturating_add(Weight::from_parts(129_834, 0).saturating_mul(m.into())) + // Standard Error: 1_083 + .saturating_add(Weight::from_parts(97_546, 0).saturating_mul(z.into())) .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(3_u64)) } - /// Storage: Alliance Members (r:2 w:2) - /// Proof: Alliance Members (max_values: None, max_size: Some(3211), added: 5686, mode: MaxEncodedLen) - /// Storage: AllianceMotion Proposals (r:1 w:0) - /// Proof Skipped: AllianceMotion Proposals (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Alliance DepositOf (r:200 w:50) - /// Proof: Alliance DepositOf (max_values: None, max_size: Some(64), added: 2539, mode: MaxEncodedLen) - /// Storage: System Account (r:50 w:50) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) - /// Storage: AllianceMotion Members (r:0 w:1) - /// Proof Skipped: AllianceMotion Members (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: AllianceMotion Prime (r:0 w:1) - /// Proof Skipped: AllianceMotion Prime (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: `Alliance::Members` (r:2 w:2) + /// Proof: `Alliance::Members` (`max_values`: None, `max_size`: Some(3211), added: 5686, mode: `MaxEncodedLen`) + /// Storage: `AllianceMotion::Proposals` (r:1 w:0) + /// Proof: `AllianceMotion::Proposals` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Alliance::DepositOf` (r:200 w:50) + /// Proof: `Alliance::DepositOf` (`max_values`: None, `max_size`: Some(64), added: 2539, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:50 w:50) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `AllianceMotion::Members` (r:0 w:1) + /// Proof: `AllianceMotion::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `AllianceMotion::Prime` (r:0 w:1) + /// Proof: `AllianceMotion::Prime` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) /// The range of component `x` is `[1, 100]`. /// The range of component `y` is `[0, 100]`. /// The range of component `z` is `[0, 50]`. @@ -696,14 +703,14 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `0 + x * (50 ±0) + y * (51 ±0) + z * (251 ±0)` // Estimated: `12362 + x * (2539 ±0) + y * (2539 ±0) + z * (2603 ±1)` - // Minimum execution time: 309_235_000 picoseconds. - Weight::from_parts(311_279_000, 12362) - // Standard Error: 26_510 - .saturating_add(Weight::from_parts(543_475, 0).saturating_mul(x.into())) - // Standard Error: 26_382 - .saturating_add(Weight::from_parts(603_169, 0).saturating_mul(y.into())) - // Standard Error: 52_716 - .saturating_add(Weight::from_parts(16_264_836, 0).saturating_mul(z.into())) + // Minimum execution time: 359_308_000 picoseconds. + Weight::from_parts(361_696_000, 12362) + // Standard Error: 30_917 + .saturating_add(Weight::from_parts(657_166, 0).saturating_mul(x.into())) + // Standard Error: 30_768 + .saturating_add(Weight::from_parts(670_249, 0).saturating_mul(y.into())) + // Standard Error: 61_480 + .saturating_add(Weight::from_parts(14_340_554, 0).saturating_mul(z.into())) .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().reads((1_u64).saturating_mul(x.into()))) .saturating_add(RocksDbWeight::get().reads((1_u64).saturating_mul(y.into()))) @@ -714,194 +721,194 @@ impl WeightInfo for () { .saturating_add(Weight::from_parts(0, 2539).saturating_mul(y.into())) .saturating_add(Weight::from_parts(0, 2603).saturating_mul(z.into())) } - /// Storage: Alliance Rule (r:0 w:1) - /// Proof: Alliance Rule (max_values: Some(1), max_size: Some(87), added: 582, mode: MaxEncodedLen) + /// Storage: `Alliance::Rule` (r:0 w:1) + /// Proof: `Alliance::Rule` (`max_values`: Some(1), `max_size`: Some(87), added: 582, mode: `MaxEncodedLen`) fn set_rule() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 8_833_000 picoseconds. - Weight::from_parts(9_313_000, 0) + // Minimum execution time: 6_146_000 picoseconds. + Weight::from_parts(6_540_000, 0) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Alliance Announcements (r:1 w:1) - /// Proof: Alliance Announcements (max_values: Some(1), max_size: Some(8702), added: 9197, mode: MaxEncodedLen) + /// Storage: `Alliance::Announcements` (r:1 w:1) + /// Proof: `Alliance::Announcements` (`max_values`: Some(1), `max_size`: Some(8702), added: 9197, mode: `MaxEncodedLen`) fn announce() -> Weight { // Proof Size summary in bytes: - // Measured: `246` + // Measured: `279` // Estimated: `10187` - // Minimum execution time: 12_231_000 picoseconds. - Weight::from_parts(12_761_000, 10187) + // Minimum execution time: 9_008_000 picoseconds. + Weight::from_parts(9_835_000, 10187) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Alliance Announcements (r:1 w:1) - /// Proof: Alliance Announcements (max_values: Some(1), max_size: Some(8702), added: 9197, mode: MaxEncodedLen) + /// Storage: `Alliance::Announcements` (r:1 w:1) + /// Proof: `Alliance::Announcements` (`max_values`: Some(1), `max_size`: Some(8702), added: 9197, mode: `MaxEncodedLen`) fn remove_announcement() -> Weight { // Proof Size summary in bytes: - // Measured: `319` + // Measured: `352` // Estimated: `10187` - // Minimum execution time: 13_079_000 picoseconds. - Weight::from_parts(13_612_000, 10187) + // Minimum execution time: 10_308_000 picoseconds. + Weight::from_parts(10_602_000, 10187) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Alliance Members (r:3 w:1) - /// Proof: Alliance Members (max_values: None, max_size: Some(3211), added: 5686, mode: MaxEncodedLen) - /// Storage: Alliance UnscrupulousAccounts (r:1 w:0) - /// Proof: Alliance UnscrupulousAccounts (max_values: Some(1), max_size: Some(3202), added: 3697, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) - /// Storage: Alliance DepositOf (r:0 w:1) - /// Proof: Alliance DepositOf (max_values: None, max_size: Some(64), added: 2539, mode: MaxEncodedLen) + /// Storage: `Alliance::Members` (r:3 w:1) + /// Proof: `Alliance::Members` (`max_values`: None, `max_size`: Some(3211), added: 5686, mode: `MaxEncodedLen`) + /// Storage: `Alliance::UnscrupulousAccounts` (r:1 w:0) + /// Proof: `Alliance::UnscrupulousAccounts` (`max_values`: Some(1), `max_size`: Some(3202), added: 3697, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `Alliance::DepositOf` (r:0 w:1) + /// Proof: `Alliance::DepositOf` (`max_values`: None, `max_size`: Some(64), added: 2539, mode: `MaxEncodedLen`) fn join_alliance() -> Weight { // Proof Size summary in bytes: - // Measured: `468` + // Measured: `501` // Estimated: `18048` - // Minimum execution time: 44_574_000 picoseconds. - Weight::from_parts(46_157_000, 18048) + // Minimum execution time: 40_731_000 picoseconds. + Weight::from_parts(42_453_000, 18048) .saturating_add(RocksDbWeight::get().reads(5_u64)) .saturating_add(RocksDbWeight::get().writes(3_u64)) } - /// Storage: Alliance Members (r:3 w:1) - /// Proof: Alliance Members (max_values: None, max_size: Some(3211), added: 5686, mode: MaxEncodedLen) - /// Storage: Alliance UnscrupulousAccounts (r:1 w:0) - /// Proof: Alliance UnscrupulousAccounts (max_values: Some(1), max_size: Some(3202), added: 3697, mode: MaxEncodedLen) + /// Storage: `Alliance::Members` (r:3 w:1) + /// Proof: `Alliance::Members` (`max_values`: None, `max_size`: Some(3211), added: 5686, mode: `MaxEncodedLen`) + /// Storage: `Alliance::UnscrupulousAccounts` (r:1 w:0) + /// Proof: `Alliance::UnscrupulousAccounts` (`max_values`: Some(1), `max_size`: Some(3202), added: 3697, mode: `MaxEncodedLen`) fn nominate_ally() -> Weight { // Proof Size summary in bytes: - // Measured: `367` + // Measured: `400` // Estimated: `18048` - // Minimum execution time: 26_114_000 picoseconds. - Weight::from_parts(27_069_000, 18048) + // Minimum execution time: 24_198_000 picoseconds. + Weight::from_parts(25_258_000, 18048) .saturating_add(RocksDbWeight::get().reads(4_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Alliance Members (r:2 w:2) - /// Proof: Alliance Members (max_values: None, max_size: Some(3211), added: 5686, mode: MaxEncodedLen) - /// Storage: AllianceMotion Proposals (r:1 w:0) - /// Proof Skipped: AllianceMotion Proposals (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: AllianceMotion Members (r:0 w:1) - /// Proof Skipped: AllianceMotion Members (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: AllianceMotion Prime (r:0 w:1) - /// Proof Skipped: AllianceMotion Prime (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: `Alliance::Members` (r:2 w:2) + /// Proof: `Alliance::Members` (`max_values`: None, `max_size`: Some(3211), added: 5686, mode: `MaxEncodedLen`) + /// Storage: `AllianceMotion::Proposals` (r:1 w:0) + /// Proof: `AllianceMotion::Proposals` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `AllianceMotion::Members` (r:0 w:1) + /// Proof: `AllianceMotion::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `AllianceMotion::Prime` (r:0 w:1) + /// Proof: `AllianceMotion::Prime` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) fn elevate_ally() -> Weight { // Proof Size summary in bytes: - // Measured: `443` + // Measured: `510` // Estimated: `12362` - // Minimum execution time: 25_882_000 picoseconds. - Weight::from_parts(26_923_000, 12362) + // Minimum execution time: 24_509_000 picoseconds. + Weight::from_parts(25_490_000, 12362) .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(4_u64)) } - /// Storage: Alliance Members (r:4 w:2) - /// Proof: Alliance Members (max_values: None, max_size: Some(3211), added: 5686, mode: MaxEncodedLen) - /// Storage: AllianceMotion Proposals (r:1 w:0) - /// Proof Skipped: AllianceMotion Proposals (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: AllianceMotion Members (r:0 w:1) - /// Proof Skipped: AllianceMotion Members (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: AllianceMotion Prime (r:0 w:1) - /// Proof Skipped: AllianceMotion Prime (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Alliance RetiringMembers (r:0 w:1) - /// Proof: Alliance RetiringMembers (max_values: None, max_size: Some(52), added: 2527, mode: MaxEncodedLen) + /// Storage: `Alliance::Members` (r:4 w:2) + /// Proof: `Alliance::Members` (`max_values`: None, `max_size`: Some(3211), added: 5686, mode: `MaxEncodedLen`) + /// Storage: `AllianceMotion::Proposals` (r:1 w:0) + /// Proof: `AllianceMotion::Proposals` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `AllianceMotion::Members` (r:0 w:1) + /// Proof: `AllianceMotion::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `AllianceMotion::Prime` (r:0 w:1) + /// Proof: `AllianceMotion::Prime` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Alliance::RetiringMembers` (r:0 w:1) + /// Proof: `Alliance::RetiringMembers` (`max_values`: None, `max_size`: Some(52), added: 2527, mode: `MaxEncodedLen`) fn give_retirement_notice() -> Weight { // Proof Size summary in bytes: - // Measured: `443` + // Measured: `510` // Estimated: `23734` - // Minimum execution time: 34_112_000 picoseconds. - Weight::from_parts(35_499_000, 23734) + // Minimum execution time: 30_889_000 picoseconds. + Weight::from_parts(31_930_000, 23734) .saturating_add(RocksDbWeight::get().reads(5_u64)) .saturating_add(RocksDbWeight::get().writes(5_u64)) } - /// Storage: Alliance RetiringMembers (r:1 w:1) - /// Proof: Alliance RetiringMembers (max_values: None, max_size: Some(52), added: 2527, mode: MaxEncodedLen) - /// Storage: Alliance Members (r:1 w:1) - /// Proof: Alliance Members (max_values: None, max_size: Some(3211), added: 5686, mode: MaxEncodedLen) - /// Storage: Alliance DepositOf (r:1 w:1) - /// Proof: Alliance DepositOf (max_values: None, max_size: Some(64), added: 2539, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: `Alliance::RetiringMembers` (r:1 w:1) + /// Proof: `Alliance::RetiringMembers` (`max_values`: None, `max_size`: Some(52), added: 2527, mode: `MaxEncodedLen`) + /// Storage: `Alliance::Members` (r:1 w:1) + /// Proof: `Alliance::Members` (`max_values`: None, `max_size`: Some(3211), added: 5686, mode: `MaxEncodedLen`) + /// Storage: `Alliance::DepositOf` (r:1 w:1) + /// Proof: `Alliance::DepositOf` (`max_values`: None, `max_size`: Some(64), added: 2539, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) fn retire() -> Weight { // Proof Size summary in bytes: - // Measured: `687` + // Measured: `720` // Estimated: `6676` - // Minimum execution time: 41_239_000 picoseconds. - Weight::from_parts(42_764_000, 6676) + // Minimum execution time: 38_363_000 picoseconds. + Weight::from_parts(39_428_000, 6676) .saturating_add(RocksDbWeight::get().reads(4_u64)) .saturating_add(RocksDbWeight::get().writes(4_u64)) } - /// Storage: Alliance Members (r:3 w:1) - /// Proof: Alliance Members (max_values: None, max_size: Some(3211), added: 5686, mode: MaxEncodedLen) - /// Storage: AllianceMotion Proposals (r:1 w:0) - /// Proof Skipped: AllianceMotion Proposals (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Alliance DepositOf (r:1 w:1) - /// Proof: Alliance DepositOf (max_values: None, max_size: Some(64), added: 2539, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) - /// Storage: AllianceMotion Members (r:0 w:1) - /// Proof Skipped: AllianceMotion Members (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: AllianceMotion Prime (r:0 w:1) - /// Proof Skipped: AllianceMotion Prime (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: `Alliance::Members` (r:3 w:1) + /// Proof: `Alliance::Members` (`max_values`: None, `max_size`: Some(3211), added: 5686, mode: `MaxEncodedLen`) + /// Storage: `AllianceMotion::Proposals` (r:1 w:0) + /// Proof: `AllianceMotion::Proposals` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Alliance::DepositOf` (r:1 w:1) + /// Proof: `Alliance::DepositOf` (`max_values`: None, `max_size`: Some(64), added: 2539, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `AllianceMotion::Members` (r:0 w:1) + /// Proof: `AllianceMotion::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `AllianceMotion::Prime` (r:0 w:1) + /// Proof: `AllianceMotion::Prime` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) fn kick_member() -> Weight { // Proof Size summary in bytes: - // Measured: `707` + // Measured: `774` // Estimated: `18048` - // Minimum execution time: 68_071_000 picoseconds. - Weight::from_parts(71_808_000, 18048) + // Minimum execution time: 60_717_000 picoseconds. + Weight::from_parts(61_785_000, 18048) .saturating_add(RocksDbWeight::get().reads(6_u64)) .saturating_add(RocksDbWeight::get().writes(5_u64)) } - /// Storage: Alliance UnscrupulousAccounts (r:1 w:1) - /// Proof: Alliance UnscrupulousAccounts (max_values: Some(1), max_size: Some(3202), added: 3697, mode: MaxEncodedLen) - /// Storage: Alliance UnscrupulousWebsites (r:1 w:1) - /// Proof: Alliance UnscrupulousWebsites (max_values: Some(1), max_size: Some(25702), added: 26197, mode: MaxEncodedLen) + /// Storage: `Alliance::UnscrupulousAccounts` (r:1 w:1) + /// Proof: `Alliance::UnscrupulousAccounts` (`max_values`: Some(1), `max_size`: Some(3202), added: 3697, mode: `MaxEncodedLen`) + /// Storage: `Alliance::UnscrupulousWebsites` (r:1 w:1) + /// Proof: `Alliance::UnscrupulousWebsites` (`max_values`: Some(1), `max_size`: Some(25702), added: 26197, mode: `MaxEncodedLen`) /// The range of component `n` is `[0, 100]`. /// The range of component `l` is `[0, 255]`. fn add_unscrupulous_items(n: u32, l: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `246` + // Measured: `279` // Estimated: `27187` - // Minimum execution time: 7_006_000 picoseconds. - Weight::from_parts(7_253_000, 27187) - // Standard Error: 3_403 - .saturating_add(Weight::from_parts(1_680_082, 0).saturating_mul(n.into())) - // Standard Error: 1_333 - .saturating_add(Weight::from_parts(72_943, 0).saturating_mul(l.into())) + // Minimum execution time: 5_393_000 picoseconds. + Weight::from_parts(5_577_000, 27187) + // Standard Error: 3_099 + .saturating_add(Weight::from_parts(1_043_175, 0).saturating_mul(n.into())) + // Standard Error: 1_213 + .saturating_add(Weight::from_parts(71_633, 0).saturating_mul(l.into())) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } - /// Storage: Alliance UnscrupulousAccounts (r:1 w:1) - /// Proof: Alliance UnscrupulousAccounts (max_values: Some(1), max_size: Some(3202), added: 3697, mode: MaxEncodedLen) - /// Storage: Alliance UnscrupulousWebsites (r:1 w:1) - /// Proof: Alliance UnscrupulousWebsites (max_values: Some(1), max_size: Some(25702), added: 26197, mode: MaxEncodedLen) + /// Storage: `Alliance::UnscrupulousAccounts` (r:1 w:1) + /// Proof: `Alliance::UnscrupulousAccounts` (`max_values`: Some(1), `max_size`: Some(3202), added: 3697, mode: `MaxEncodedLen`) + /// Storage: `Alliance::UnscrupulousWebsites` (r:1 w:1) + /// Proof: `Alliance::UnscrupulousWebsites` (`max_values`: Some(1), `max_size`: Some(25702), added: 26197, mode: `MaxEncodedLen`) /// The range of component `n` is `[0, 100]`. /// The range of component `l` is `[0, 255]`. fn remove_unscrupulous_items(n: u32, l: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `0 + l * (100 ±0) + n * (289 ±0)` // Estimated: `27187` - // Minimum execution time: 7_292_000 picoseconds. - Weight::from_parts(7_629_000, 27187) - // Standard Error: 176_225 - .saturating_add(Weight::from_parts(16_646_429, 0).saturating_mul(n.into())) - // Standard Error: 69_017 - .saturating_add(Weight::from_parts(310_978, 0).saturating_mul(l.into())) + // Minimum execution time: 5_318_000 picoseconds. + Weight::from_parts(5_581_000, 27187) + // Standard Error: 188_914 + .saturating_add(Weight::from_parts(17_878_267, 0).saturating_mul(n.into())) + // Standard Error: 73_987 + .saturating_add(Weight::from_parts(258_754, 0).saturating_mul(l.into())) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } - /// Storage: Alliance Members (r:3 w:2) - /// Proof: Alliance Members (max_values: None, max_size: Some(3211), added: 5686, mode: MaxEncodedLen) - /// Storage: AllianceMotion Proposals (r:1 w:0) - /// Proof Skipped: AllianceMotion Proposals (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: AllianceMotion Members (r:0 w:1) - /// Proof Skipped: AllianceMotion Members (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: AllianceMotion Prime (r:0 w:1) - /// Proof Skipped: AllianceMotion Prime (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: `Alliance::Members` (r:3 w:2) + /// Proof: `Alliance::Members` (`max_values`: None, `max_size`: Some(3211), added: 5686, mode: `MaxEncodedLen`) + /// Storage: `AllianceMotion::Proposals` (r:1 w:0) + /// Proof: `AllianceMotion::Proposals` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `AllianceMotion::Members` (r:0 w:1) + /// Proof: `AllianceMotion::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `AllianceMotion::Prime` (r:0 w:1) + /// Proof: `AllianceMotion::Prime` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) fn abdicate_fellow_status() -> Weight { // Proof Size summary in bytes: - // Measured: `443` + // Measured: `510` // Estimated: `18048` - // Minimum execution time: 31_798_000 picoseconds. - Weight::from_parts(33_463_000, 18048) + // Minimum execution time: 29_423_000 picoseconds. + Weight::from_parts(30_141_000, 18048) .saturating_add(RocksDbWeight::get().reads(4_u64)) .saturating_add(RocksDbWeight::get().writes(4_u64)) } diff --git a/substrate/frame/asset-conversion/Cargo.toml b/substrate/frame/asset-conversion/Cargo.toml index 1f2db14dac2dbe39dc16ddc206af6eb18fc4ca45..1a8e8eea4849ad76f5185ccb6a76745db07d4513 100644 --- a/substrate/frame/asset-conversion/Cargo.toml +++ b/substrate/frame/asset-conversion/Cargo.toml @@ -20,7 +20,7 @@ codec = { package = "parity-scale-codec", version = "3.6.1", default-features = frame-support = { path = "../support", default-features = false } frame-system = { path = "../system", default-features = false } frame-benchmarking = { path = "../benchmarking", default-features = false, optional = true } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } sp-api = { path = "../../primitives/api", default-features = false } sp-core = { path = "../../primitives/core", default-features = false } sp-io = { path = "../../primitives/io", default-features = false } diff --git a/substrate/frame/asset-conversion/src/lib.rs b/substrate/frame/asset-conversion/src/lib.rs index f0695678fbddf07a4943c4ad0982ac95c4634866..0bf73e8809cfb3cb305716b8561846ff9a1ed631 100644 --- a/substrate/frame/asset-conversion/src/lib.rs +++ b/substrate/frame/asset-conversion/src/lib.rs @@ -40,7 +40,7 @@ //! non-native asset 1, you would pass in a path of `[DOT, 1]` or `[1, DOT]`. If you want to swap //! from non-native asset 1 to non-native asset 2, you would pass in a path of `[1, DOT, 2]`. //! -//! (For an example of configuring this pallet to use `MultiLocation` as an asset id, see the +//! (For an example of configuring this pallet to use `Location` as an asset id, see the //! cumulus repo). //! //! Here is an example `state_call` that asks for a quote of a pool of native versus asset 1: @@ -205,7 +205,7 @@ pub mod pallet { #[pallet::event] #[pallet::generate_deposit(pub(super) fn deposit_event)] pub enum Event { - /// A successful call of the `CretaPool` extrinsic will create this event. + /// A successful call of the `CreatePool` extrinsic will create this event. PoolCreated { /// The account that created the pool. creator: T::AccountId, @@ -413,6 +413,11 @@ pub mod pallet { /// Params `amount1_min`/`amount2_min` represent that. /// `mint_to` will be sent the liquidity tokens that represent this share of the pool. /// + /// NOTE: when encountering an incorrect exchange rate and non-withdrawable pool liquidity, + /// batch an atomic call with [`Pallet::add_liquidity`] and + /// [`Pallet::swap_exact_tokens_for_tokens`] or [`Pallet::swap_tokens_for_exact_tokens`] + /// calls to render the liquidity withdrawable and rectify the exchange rate. + /// /// Once liquidity is added, someone may successfully call /// [`Pallet::swap_exact_tokens_for_tokens`] successfully. #[pallet::call_index(1)] diff --git a/substrate/frame/asset-conversion/src/mock.rs b/substrate/frame/asset-conversion/src/mock.rs index dd1d26ff238deeac52d2c8089706bbc688586f14..4591b87c1867862e87a16e86c0d96a060bd1b7ff 100644 --- a/substrate/frame/asset-conversion/src/mock.rs +++ b/substrate/frame/asset-conversion/src/mock.rs @@ -19,6 +19,7 @@ use super::*; use crate as pallet_asset_conversion; +use core::default::Default; use frame_support::{ construct_runtime, derive_impl, instances::{Instance1, Instance2}, @@ -28,18 +29,16 @@ use frame_support::{ fungible::{NativeFromLeft, NativeOrWithId, UnionOf}, imbalance::ResolveAssetTo, }, - AsEnsureOriginWithArg, ConstU128, ConstU32, ConstU64, + AsEnsureOriginWithArg, ConstU128, ConstU32, }, PalletId, }; use frame_system::{EnsureSigned, EnsureSignedBy}; use sp_arithmetic::Permill; -use sp_core::H256; use sp_runtime::{ - traits::{AccountIdConversion, BlakeTwo256, IdentityLookup}, + traits::{AccountIdConversion, IdentityLookup}, BuildStorage, }; -use sp_std::default::Default; type Block = frame_system::mocking::MockBlock; @@ -54,31 +53,12 @@ construct_runtime!( } ); -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { - type BaseCallFilter = frame_support::traits::Everything; - type BlockWeights = (); - type BlockLength = (); - type RuntimeOrigin = RuntimeOrigin; - type RuntimeCall = RuntimeCall; - type Nonce = u64; - type Hash = H256; - type Hashing = BlakeTwo256; type AccountId = u128; type Lookup = IdentityLookup; type Block = Block; - type RuntimeEvent = RuntimeEvent; - type BlockHashCount = ConstU64<250>; - type DbWeight = (); - type Version = (); - type PalletInfo = PalletInfo; type AccountData = pallet_balances::AccountData; - type OnNewAccount = (); - type OnKilledAccount = (); - type SystemWeightInfo = (); - type SS58Prefix = (); - type OnSetCode = (); - type MaxConsumers = ConstU32<16>; } impl pallet_balances::Config for Test { diff --git a/substrate/frame/asset-conversion/src/types.rs b/substrate/frame/asset-conversion/src/types.rs index fd6d41a55b6139b74453861fd553f0d30d307146..5ee81c2012de226baf6aafbda0e2ec9a380cc1e2 100644 --- a/substrate/frame/asset-conversion/src/types.rs +++ b/substrate/frame/asset-conversion/src/types.rs @@ -17,8 +17,8 @@ use super::*; use codec::{Decode, Encode, MaxEncodedLen}; +use core::marker::PhantomData; use scale_info::TypeInfo; -use sp_std::marker::PhantomData; /// Represents a swap path with associated asset amounts indicating how much of the asset needs to /// be deposited to get the following asset's amount withdrawn (this is inclusive of fees). diff --git a/substrate/frame/asset-conversion/src/weights.rs b/substrate/frame/asset-conversion/src/weights.rs index a0e687f7a4168032c59daf8616249776a123c363..212f56073f942bc4964ea7af2a5dde80fed1a4a5 100644 --- a/substrate/frame/asset-conversion/src/weights.rs +++ b/substrate/frame/asset-conversion/src/weights.rs @@ -17,24 +17,28 @@ //! Autogenerated weights for `pallet_asset_conversion` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-10-30, STEPS: `5`, REPEAT: `2`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-04-08, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `cob`, CPU: `` +//! HOSTNAME: `runner-anb7yjbi-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: `1024` // Executed Command: -// ./target/debug/substrate-node +// ./target/production/substrate-node // benchmark // pallet // --chain=dev -// --steps=5 -// --repeat=2 -// --pallet=pallet-asset-conversion +// --steps=50 +// --repeat=20 +// --pallet=pallet_asset_conversion +// --no-storage-info +// --no-median-slopes +// --no-min-squares // --extrinsic=* // --wasm-execution=compiled // --heap-pages=4096 // --output=./substrate/frame/asset-conversion/src/weights.rs +// --header=./substrate/HEADER-APACHE2 // --template=./substrate/.maintain/frame-weight-template.hbs #![cfg_attr(rustfmt, rustfmt_skip)] @@ -59,11 +63,9 @@ pub struct SubstrateWeight(PhantomData); impl WeightInfo for SubstrateWeight { /// Storage: `AssetConversion::Pools` (r:1 w:1) /// Proof: `AssetConversion::Pools` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:2 w:2) + /// Storage: `System::Account` (r:1 w:1) /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - /// Storage: `Assets::Account` (r:2 w:2) - /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) - /// Storage: `Assets::Asset` (r:2 w:2) + /// Storage: `Assets::Asset` (r:2 w:0) /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) /// Storage: `AssetConversion::NextPoolAssetId` (r:1 w:1) /// Proof: `AssetConversion::NextPoolAssetId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) @@ -73,12 +75,12 @@ impl WeightInfo for SubstrateWeight { /// Proof: `PoolAssets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) fn create_pool() -> Weight { // Proof Size summary in bytes: - // Measured: `1081` + // Measured: `910` // Estimated: `6360` - // Minimum execution time: 1_576_000_000 picoseconds. - Weight::from_parts(1_668_000_000, 6360) - .saturating_add(T::DbWeight::get().reads(10_u64)) - .saturating_add(T::DbWeight::get().writes(10_u64)) + // Minimum execution time: 86_709_000 picoseconds. + Weight::from_parts(88_841_000, 6360) + .saturating_add(T::DbWeight::get().reads(7_u64)) + .saturating_add(T::DbWeight::get().writes(5_u64)) } /// Storage: `AssetConversion::Pools` (r:1 w:0) /// Proof: `AssetConversion::Pools` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`) @@ -86,18 +88,20 @@ impl WeightInfo for SubstrateWeight { /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) /// Storage: `Assets::Account` (r:4 w:4) /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) /// Storage: `PoolAssets::Asset` (r:1 w:1) /// Proof: `PoolAssets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) /// Storage: `PoolAssets::Account` (r:2 w:2) /// Proof: `PoolAssets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) fn add_liquidity() -> Weight { // Proof Size summary in bytes: - // Measured: `1761` + // Measured: `1507` // Estimated: `11426` - // Minimum execution time: 1_636_000_000 picoseconds. - Weight::from_parts(1_894_000_000, 11426) - .saturating_add(T::DbWeight::get().reads(10_u64)) - .saturating_add(T::DbWeight::get().writes(9_u64)) + // Minimum execution time: 148_672_000 picoseconds. + Weight::from_parts(151_824_000, 11426) + .saturating_add(T::DbWeight::get().reads(11_u64)) + .saturating_add(T::DbWeight::get().writes(10_u64)) } /// Storage: `AssetConversion::Pools` (r:1 w:0) /// Proof: `AssetConversion::Pools` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`) @@ -111,10 +115,10 @@ impl WeightInfo for SubstrateWeight { /// Proof: `PoolAssets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) fn remove_liquidity() -> Weight { // Proof Size summary in bytes: - // Measured: `1750` + // Measured: `1650` // Estimated: `11426` - // Minimum execution time: 1_507_000_000 picoseconds. - Weight::from_parts(1_524_000_000, 11426) + // Minimum execution time: 130_743_000 picoseconds. + Weight::from_parts(132_793_000, 11426) .saturating_add(T::DbWeight::get().reads(9_u64)) .saturating_add(T::DbWeight::get().writes(8_u64)) } @@ -125,12 +129,12 @@ impl WeightInfo for SubstrateWeight { /// The range of component `n` is `[2, 4]`. fn swap_exact_tokens_for_tokens(n: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `0 + n * (522 ±0)` + // Measured: `89 + n * (419 ±0)` // Estimated: `990 + n * (5218 ±0)` - // Minimum execution time: 937_000_000 picoseconds. - Weight::from_parts(941_000_000, 990) - // Standard Error: 40_863_477 - .saturating_add(Weight::from_parts(205_862_068, 0).saturating_mul(n.into())) + // Minimum execution time: 81_173_000 picoseconds. + Weight::from_parts(82_574_000, 990) + // Standard Error: 335_929 + .saturating_add(Weight::from_parts(11_607_291, 0).saturating_mul(n.into())) .saturating_add(T::DbWeight::get().reads((3_u64).saturating_mul(n.into()))) .saturating_add(T::DbWeight::get().writes((3_u64).saturating_mul(n.into()))) .saturating_add(Weight::from_parts(0, 5218).saturating_mul(n.into())) @@ -142,12 +146,12 @@ impl WeightInfo for SubstrateWeight { /// The range of component `n` is `[2, 4]`. fn swap_tokens_for_exact_tokens(n: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `0 + n * (522 ±0)` + // Measured: `89 + n * (419 ±0)` // Estimated: `990 + n * (5218 ±0)` - // Minimum execution time: 935_000_000 picoseconds. - Weight::from_parts(947_000_000, 990) - // Standard Error: 46_904_620 - .saturating_add(Weight::from_parts(218_275_862, 0).saturating_mul(n.into())) + // Minimum execution time: 80_562_000 picoseconds. + Weight::from_parts(82_501_000, 990) + // Standard Error: 329_460 + .saturating_add(Weight::from_parts(11_295_339, 0).saturating_mul(n.into())) .saturating_add(T::DbWeight::get().reads((3_u64).saturating_mul(n.into()))) .saturating_add(T::DbWeight::get().writes((3_u64).saturating_mul(n.into()))) .saturating_add(Weight::from_parts(0, 5218).saturating_mul(n.into())) @@ -158,11 +162,9 @@ impl WeightInfo for SubstrateWeight { impl WeightInfo for () { /// Storage: `AssetConversion::Pools` (r:1 w:1) /// Proof: `AssetConversion::Pools` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:2 w:2) + /// Storage: `System::Account` (r:1 w:1) /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - /// Storage: `Assets::Account` (r:2 w:2) - /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) - /// Storage: `Assets::Asset` (r:2 w:2) + /// Storage: `Assets::Asset` (r:2 w:0) /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) /// Storage: `AssetConversion::NextPoolAssetId` (r:1 w:1) /// Proof: `AssetConversion::NextPoolAssetId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) @@ -172,12 +174,12 @@ impl WeightInfo for () { /// Proof: `PoolAssets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) fn create_pool() -> Weight { // Proof Size summary in bytes: - // Measured: `1081` + // Measured: `910` // Estimated: `6360` - // Minimum execution time: 1_576_000_000 picoseconds. - Weight::from_parts(1_668_000_000, 6360) - .saturating_add(RocksDbWeight::get().reads(10_u64)) - .saturating_add(RocksDbWeight::get().writes(10_u64)) + // Minimum execution time: 86_709_000 picoseconds. + Weight::from_parts(88_841_000, 6360) + .saturating_add(RocksDbWeight::get().reads(7_u64)) + .saturating_add(RocksDbWeight::get().writes(5_u64)) } /// Storage: `AssetConversion::Pools` (r:1 w:0) /// Proof: `AssetConversion::Pools` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`) @@ -185,18 +187,20 @@ impl WeightInfo for () { /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) /// Storage: `Assets::Account` (r:4 w:4) /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) /// Storage: `PoolAssets::Asset` (r:1 w:1) /// Proof: `PoolAssets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) /// Storage: `PoolAssets::Account` (r:2 w:2) /// Proof: `PoolAssets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) fn add_liquidity() -> Weight { // Proof Size summary in bytes: - // Measured: `1761` + // Measured: `1507` // Estimated: `11426` - // Minimum execution time: 1_636_000_000 picoseconds. - Weight::from_parts(1_894_000_000, 11426) - .saturating_add(RocksDbWeight::get().reads(10_u64)) - .saturating_add(RocksDbWeight::get().writes(9_u64)) + // Minimum execution time: 148_672_000 picoseconds. + Weight::from_parts(151_824_000, 11426) + .saturating_add(RocksDbWeight::get().reads(11_u64)) + .saturating_add(RocksDbWeight::get().writes(10_u64)) } /// Storage: `AssetConversion::Pools` (r:1 w:0) /// Proof: `AssetConversion::Pools` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`) @@ -210,10 +214,10 @@ impl WeightInfo for () { /// Proof: `PoolAssets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) fn remove_liquidity() -> Weight { // Proof Size summary in bytes: - // Measured: `1750` + // Measured: `1650` // Estimated: `11426` - // Minimum execution time: 1_507_000_000 picoseconds. - Weight::from_parts(1_524_000_000, 11426) + // Minimum execution time: 130_743_000 picoseconds. + Weight::from_parts(132_793_000, 11426) .saturating_add(RocksDbWeight::get().reads(9_u64)) .saturating_add(RocksDbWeight::get().writes(8_u64)) } @@ -224,12 +228,12 @@ impl WeightInfo for () { /// The range of component `n` is `[2, 4]`. fn swap_exact_tokens_for_tokens(n: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `0 + n * (522 ±0)` + // Measured: `89 + n * (419 ±0)` // Estimated: `990 + n * (5218 ±0)` - // Minimum execution time: 937_000_000 picoseconds. - Weight::from_parts(941_000_000, 990) - // Standard Error: 40_863_477 - .saturating_add(Weight::from_parts(205_862_068, 0).saturating_mul(n.into())) + // Minimum execution time: 81_173_000 picoseconds. + Weight::from_parts(82_574_000, 990) + // Standard Error: 335_929 + .saturating_add(Weight::from_parts(11_607_291, 0).saturating_mul(n.into())) .saturating_add(RocksDbWeight::get().reads((3_u64).saturating_mul(n.into()))) .saturating_add(RocksDbWeight::get().writes((3_u64).saturating_mul(n.into()))) .saturating_add(Weight::from_parts(0, 5218).saturating_mul(n.into())) @@ -241,12 +245,12 @@ impl WeightInfo for () { /// The range of component `n` is `[2, 4]`. fn swap_tokens_for_exact_tokens(n: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `0 + n * (522 ±0)` + // Measured: `89 + n * (419 ±0)` // Estimated: `990 + n * (5218 ±0)` - // Minimum execution time: 935_000_000 picoseconds. - Weight::from_parts(947_000_000, 990) - // Standard Error: 46_904_620 - .saturating_add(Weight::from_parts(218_275_862, 0).saturating_mul(n.into())) + // Minimum execution time: 80_562_000 picoseconds. + Weight::from_parts(82_501_000, 990) + // Standard Error: 329_460 + .saturating_add(Weight::from_parts(11_295_339, 0).saturating_mul(n.into())) .saturating_add(RocksDbWeight::get().reads((3_u64).saturating_mul(n.into()))) .saturating_add(RocksDbWeight::get().writes((3_u64).saturating_mul(n.into()))) .saturating_add(Weight::from_parts(0, 5218).saturating_mul(n.into())) diff --git a/substrate/frame/asset-rate/Cargo.toml b/substrate/frame/asset-rate/Cargo.toml index 6e7bbf29fc43219dbe084afeb1254a0783510746..cd502148a8d8f116afcbcde8969490a454da81b7 100644 --- a/substrate/frame/asset-rate/Cargo.toml +++ b/substrate/frame/asset-rate/Cargo.toml @@ -18,7 +18,7 @@ targets = ["x86_64-unknown-linux-gnu"] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = [ "derive", ] } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } frame-benchmarking = { path = "../benchmarking", default-features = false, optional = true } frame-support = { path = "../support", default-features = false } frame-system = { path = "../system", default-features = false } diff --git a/substrate/frame/asset-rate/src/lib.rs b/substrate/frame/asset-rate/src/lib.rs index d4afca8b73c4b2978bbed954c05aee4e2a645ee5..69f8267a4f25fe2fa82113eb6d9673b05b4ab6aa 100644 --- a/substrate/frame/asset-rate/src/lib.rs +++ b/substrate/frame/asset-rate/src/lib.rs @@ -59,8 +59,14 @@ #![cfg_attr(not(feature = "std"), no_std)] -use frame_support::traits::{fungible::Inspect, tokens::ConversionFromAssetBalance}; -use sp_runtime::{traits::Zero, FixedPointNumber, FixedU128}; +use frame_support::traits::{ + fungible::Inspect, + tokens::{ConversionFromAssetBalance, ConversionToAssetBalance}, +}; +use sp_runtime::{ + traits::{CheckedDiv, Zero}, + FixedPointNumber, FixedU128, +}; use sp_std::boxed::Box; pub use pallet::*; @@ -106,7 +112,7 @@ pub mod pallet { /// The origin permissioned to remove an existing conversion rate for an asset. type RemoveOrigin: EnsureOrigin; - /// The origin permissioned to update an existiing conversion rate for an asset. + /// The origin permissioned to update an existing conversion rate for an asset. type UpdateOrigin: EnsureOrigin; /// The currency mechanism for this pallet. @@ -144,6 +150,8 @@ pub mod pallet { UnknownAssetKind, /// The given asset ID already has an assigned conversion rate and cannot be re-created. AlreadyExists, + /// Overflow ocurred when calculating the inverse rate. + Overflow, } #[pallet::call] @@ -246,3 +254,25 @@ where pallet::ConversionRateToNative::::set(asset_id.clone(), Some(1.into())); } } + +/// Exposes conversion of a native balance to an asset balance. +impl ConversionToAssetBalance, AssetKindOf, BalanceOf> for Pallet +where + T: Config, +{ + type Error = pallet::Error; + + fn to_asset_balance( + balance: BalanceOf, + asset_kind: AssetKindOf, + ) -> Result, pallet::Error> { + let rate = pallet::ConversionRateToNative::::get(asset_kind) + .ok_or(pallet::Error::::UnknownAssetKind.into())?; + + // We cannot use `saturating_div` here so we use `checked_div`. + Ok(FixedU128::from_u32(1) + .checked_div(&rate) + .ok_or(pallet::Error::::Overflow.into())? + .saturating_mul_int(balance)) + } +} diff --git a/substrate/frame/asset-rate/src/mock.rs b/substrate/frame/asset-rate/src/mock.rs index d6044e09ccd1c821b43bd54708f89cb5fd1e1ac9..d01996dab193d6d6e21a14efed7f14ff2ef8c931 100644 --- a/substrate/frame/asset-rate/src/mock.rs +++ b/substrate/frame/asset-rate/src/mock.rs @@ -18,15 +18,8 @@ //! The crate's mock. use crate as pallet_asset_rate; -use frame_support::{ - derive_impl, - traits::{ConstU16, ConstU64}, -}; -use sp_core::H256; -use sp_runtime::{ - traits::{BlakeTwo256, IdentityLookup}, - BuildStorage, -}; +use frame_support::{derive_impl, traits::ConstU64}; +use sp_runtime::BuildStorage; type Block = frame_system::mocking::MockBlock; @@ -39,31 +32,10 @@ frame_support::construct_runtime!( } ); -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { - type BaseCallFilter = frame_support::traits::Everything; - type BlockWeights = (); - type BlockLength = (); - type DbWeight = (); - type RuntimeOrigin = RuntimeOrigin; - type RuntimeCall = RuntimeCall; - type Nonce = u64; - type Hash = H256; - type Hashing = BlakeTwo256; - type AccountId = u64; - type Lookup = IdentityLookup; type Block = Block; - type RuntimeEvent = RuntimeEvent; - type BlockHashCount = ConstU64<250>; - type Version = (); - type PalletInfo = PalletInfo; type AccountData = pallet_balances::AccountData; - type OnNewAccount = (); - type OnKilledAccount = (); - type SystemWeightInfo = (); - type SS58Prefix = ConstU16<42>; - type OnSetCode = (); - type MaxConsumers = frame_support::traits::ConstU32<16>; } impl pallet_balances::Config for Test { diff --git a/substrate/frame/asset-rate/src/tests.rs b/substrate/frame/asset-rate/src/tests.rs index 452265476093b034256907e9d2a232c91041f772..fc7bf2f150311b638ba3a7bc939d6b62ba927cc0 100644 --- a/substrate/frame/asset-rate/src/tests.rs +++ b/substrate/frame/asset-rate/src/tests.rs @@ -131,12 +131,19 @@ fn convert_works() { FixedU128::from_float(2.51) )); - let conversion = , ::AssetKind, BalanceOf, >>::from_asset_balance(10, ASSET_ID); - assert_eq!(conversion.expect("Conversion rate exists for asset"), 25); + assert_eq!(conversion_from_asset.expect("Conversion rate exists for asset"), 25); + + let conversion_to_asset = , + ::AssetKind, + BalanceOf, + >>::to_asset_balance(25, ASSET_ID); + assert_eq!(conversion_to_asset.expect("Conversion rate exists for asset"), 9); }); } @@ -151,3 +158,21 @@ fn convert_unknown_throws() { assert!(conversion.is_err()); }); } + +#[test] +fn convert_overflow_throws() { + new_test_ext().execute_with(|| { + assert_ok!(AssetRate::create( + RuntimeOrigin::root(), + Box::new(ASSET_ID), + FixedU128::from_u32(0) + )); + + let conversion = , + ::AssetKind, + BalanceOf, + >>::to_asset_balance(10, ASSET_ID); + assert!(conversion.is_err()); + }); +} diff --git a/substrate/frame/asset-rate/src/weights.rs b/substrate/frame/asset-rate/src/weights.rs index 582e20e56d7dc7f40a0cbb3838622b309e8223d4..fb577b618b338593771f0b9d98fa17d4cffa1a9a 100644 --- a/substrate/frame/asset-rate/src/weights.rs +++ b/substrate/frame/asset-rate/src/weights.rs @@ -15,16 +15,16 @@ // See the License for the specific language governing permissions and // limitations under the License. -//! Autogenerated weights for pallet_asset_rate +//! Autogenerated weights for `pallet_asset_rate` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-06-16, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-04-08, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-e8ezs4ez-project-145-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("dev"), DB CACHE: 1024 +//! HOSTNAME: `runner-anb7yjbi-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: `1024` // Executed Command: -// ./target/production/substrate +// ./target/production/substrate-node // benchmark // pallet // --chain=dev @@ -35,12 +35,11 @@ // --no-median-slopes // --no-min-squares // --extrinsic=* -// --execution=wasm // --wasm-execution=compiled // --heap-pages=4096 -// --output=./frame/asset-rate/src/weights.rs -// --header=./HEADER-APACHE2 -// --template=./.maintain/frame-weight-template.hbs +// --output=./substrate/frame/asset-rate/src/weights.rs +// --header=./substrate/HEADER-APACHE2 +// --template=./substrate/.maintain/frame-weight-template.hbs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -50,83 +49,83 @@ use frame_support::{traits::Get, weights::{Weight, constants::RocksDbWeight}}; use core::marker::PhantomData; -/// Weight functions needed for pallet_asset_rate. +/// Weight functions needed for `pallet_asset_rate`. pub trait WeightInfo { fn create() -> Weight; fn update() -> Weight; fn remove() -> Weight; } -/// Weights for pallet_asset_rate using the Substrate node and recommended hardware. +/// Weights for `pallet_asset_rate` using the Substrate node and recommended hardware. pub struct SubstrateWeight(PhantomData); impl WeightInfo for SubstrateWeight { - /// Storage: AssetRate ConversionRateToNative (r:1 w:1) - /// Proof: AssetRate ConversionRateToNative (max_values: None, max_size: Some(36), added: 2511, mode: MaxEncodedLen) + /// Storage: `AssetRate::ConversionRateToNative` (r:1 w:1) + /// Proof: `AssetRate::ConversionRateToNative` (`max_values`: None, `max_size`: Some(36), added: 2511, mode: `MaxEncodedLen`) fn create() -> Weight { // Proof Size summary in bytes: // Measured: `76` // Estimated: `3501` - // Minimum execution time: 11_700_000 picoseconds. - Weight::from_parts(12_158_000, 3501) + // Minimum execution time: 9_816_000 picoseconds. + Weight::from_parts(10_076_000, 3501) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: AssetRate ConversionRateToNative (r:1 w:1) - /// Proof: AssetRate ConversionRateToNative (max_values: None, max_size: Some(36), added: 2511, mode: MaxEncodedLen) + /// Storage: `AssetRate::ConversionRateToNative` (r:1 w:1) + /// Proof: `AssetRate::ConversionRateToNative` (`max_values`: None, `max_size`: Some(36), added: 2511, mode: `MaxEncodedLen`) fn update() -> Weight { // Proof Size summary in bytes: // Measured: `137` // Estimated: `3501` - // Minimum execution time: 12_119_000 picoseconds. - Weight::from_parts(12_548_000, 3501) + // Minimum execution time: 10_164_000 picoseconds. + Weight::from_parts(10_598_000, 3501) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: AssetRate ConversionRateToNative (r:1 w:1) - /// Proof: AssetRate ConversionRateToNative (max_values: None, max_size: Some(36), added: 2511, mode: MaxEncodedLen) + /// Storage: `AssetRate::ConversionRateToNative` (r:1 w:1) + /// Proof: `AssetRate::ConversionRateToNative` (`max_values`: None, `max_size`: Some(36), added: 2511, mode: `MaxEncodedLen`) fn remove() -> Weight { // Proof Size summary in bytes: // Measured: `137` // Estimated: `3501` - // Minimum execution time: 12_541_000 picoseconds. - Weight::from_parts(12_956_000, 3501) + // Minimum execution time: 10_837_000 picoseconds. + Weight::from_parts(11_050_000, 3501) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } } -// For backwards compatibility and tests +// For backwards compatibility and tests. impl WeightInfo for () { - /// Storage: AssetRate ConversionRateToNative (r:1 w:1) - /// Proof: AssetRate ConversionRateToNative (max_values: None, max_size: Some(36), added: 2511, mode: MaxEncodedLen) + /// Storage: `AssetRate::ConversionRateToNative` (r:1 w:1) + /// Proof: `AssetRate::ConversionRateToNative` (`max_values`: None, `max_size`: Some(36), added: 2511, mode: `MaxEncodedLen`) fn create() -> Weight { // Proof Size summary in bytes: // Measured: `76` // Estimated: `3501` - // Minimum execution time: 11_700_000 picoseconds. - Weight::from_parts(12_158_000, 3501) + // Minimum execution time: 9_816_000 picoseconds. + Weight::from_parts(10_076_000, 3501) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: AssetRate ConversionRateToNative (r:1 w:1) - /// Proof: AssetRate ConversionRateToNative (max_values: None, max_size: Some(36), added: 2511, mode: MaxEncodedLen) + /// Storage: `AssetRate::ConversionRateToNative` (r:1 w:1) + /// Proof: `AssetRate::ConversionRateToNative` (`max_values`: None, `max_size`: Some(36), added: 2511, mode: `MaxEncodedLen`) fn update() -> Weight { // Proof Size summary in bytes: // Measured: `137` // Estimated: `3501` - // Minimum execution time: 12_119_000 picoseconds. - Weight::from_parts(12_548_000, 3501) + // Minimum execution time: 10_164_000 picoseconds. + Weight::from_parts(10_598_000, 3501) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: AssetRate ConversionRateToNative (r:1 w:1) - /// Proof: AssetRate ConversionRateToNative (max_values: None, max_size: Some(36), added: 2511, mode: MaxEncodedLen) + /// Storage: `AssetRate::ConversionRateToNative` (r:1 w:1) + /// Proof: `AssetRate::ConversionRateToNative` (`max_values`: None, `max_size`: Some(36), added: 2511, mode: `MaxEncodedLen`) fn remove() -> Weight { // Proof Size summary in bytes: // Measured: `137` // Estimated: `3501` - // Minimum execution time: 12_541_000 picoseconds. - Weight::from_parts(12_956_000, 3501) + // Minimum execution time: 10_837_000 picoseconds. + Weight::from_parts(11_050_000, 3501) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } diff --git a/substrate/frame/assets/Cargo.toml b/substrate/frame/assets/Cargo.toml index 6fe3a27236052d1139327a549f9276caa6730c3b..3b95750c14c8c9c78ad86442085580810e447f5a 100644 --- a/substrate/frame/assets/Cargo.toml +++ b/substrate/frame/assets/Cargo.toml @@ -17,8 +17,8 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false } -log = { version = "0.4.17", default-features = false } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +log = { workspace = true } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } sp-std = { path = "../../primitives/std", default-features = false } # Needed for various traits. In our case, `OnFinalize`. sp-runtime = { path = "../../primitives/runtime", default-features = false } diff --git a/substrate/frame/assets/src/extra_mutator.rs b/substrate/frame/assets/src/extra_mutator.rs index 2a44df5f0c661ffc83b0f9c0df68d14bcfa0bcab..e2f7742c694a3caf94e70e596f667bb7759bb2bb 100644 --- a/substrate/frame/assets/src/extra_mutator.rs +++ b/substrate/frame/assets/src/extra_mutator.rs @@ -38,7 +38,7 @@ impl, I: 'static> Drop for ExtraMutator { } } -impl, I: 'static> sp_std::ops::Deref for ExtraMutator { +impl, I: 'static> core::ops::Deref for ExtraMutator { type Target = T::Extra; fn deref(&self) -> &T::Extra { match self.pending { @@ -48,7 +48,7 @@ impl, I: 'static> sp_std::ops::Deref for ExtraMutator { } } -impl, I: 'static> sp_std::ops::DerefMut for ExtraMutator { +impl, I: 'static> core::ops::DerefMut for ExtraMutator { fn deref_mut(&mut self) -> &mut T::Extra { if self.pending.is_none() { self.pending = Some(self.original.clone()); @@ -60,7 +60,7 @@ impl, I: 'static> sp_std::ops::DerefMut for ExtraMutator { impl, I: 'static> ExtraMutator { pub(super) fn maybe_new( id: T::AssetId, - who: impl sp_std::borrow::Borrow, + who: impl core::borrow::Borrow, ) -> Option> { if let Some(a) = Account::::get(&id, who.borrow()) { Some(ExtraMutator:: { diff --git a/substrate/frame/assets/src/lib.rs b/substrate/frame/assets/src/lib.rs index cafe7bb1a3b53df4b48d2a1b9a45cdf14c18cea8..6891f04dfb51aae356a708112a7bba284e894be2 100644 --- a/substrate/frame/assets/src/lib.rs +++ b/substrate/frame/assets/src/lib.rs @@ -17,7 +17,15 @@ //! # Assets Pallet //! -//! A simple, secure module for dealing with fungible assets. +//! A simple, secure module for dealing with sets of assets implementing +//! [`fungible`](frame_support::traits::fungible) traits, via [`fungibles`] traits. +//! +//! The pallet makes heavy use of concepts such as Holds and Freezes from the +//! [`frame_support::traits::fungible`] traits, therefore you should read and understand those docs +//! as a prerequisite to understanding this pallet. +//! +//! See the [`frame_tokens`] reference docs for more information about the place of the +//! Assets pallet in FRAME. //! //! ## Overview //! @@ -133,6 +141,8 @@ //! //! * [`System`](../frame_system/index.html) //! * [`Support`](../frame_support/index.html) +//! +//! [`frame_tokens`]: ../polkadot_sdk_docs/reference_docs/frame_tokens/index.html // This recursion limit is needed because we have too many benchmarks and benchmarking will fail if // we add more without this limit. @@ -183,7 +193,7 @@ pub use weights::WeightInfo; type AccountIdLookupOf = <::Lookup as StaticLookup>::Source; const LOG_TARGET: &str = "runtime::assets"; -/// Trait with callbacks that are executed after successfull asset creation or destruction. +/// Trait with callbacks that are executed after successful asset creation or destruction. pub trait AssetsCallback { /// Indicates that asset with `id` was successfully created by the `owner` fn created(_id: &AssetId, _owner: &AccountId) -> Result<(), ()> { @@ -208,7 +218,7 @@ pub mod pallet { }; use frame_system::pallet_prelude::*; - /// The current storage version. + /// The in-code storage version. const STORAGE_VERSION: StorageVersion = StorageVersion::new(1); #[pallet::pallet] @@ -226,10 +236,42 @@ pub mod pallet { } } - #[pallet::config] + /// Default implementations of [`DefaultConfig`], which can be used to implement [`Config`]. + pub mod config_preludes { + use super::*; + use frame_support::{derive_impl, traits::ConstU64}; + pub struct TestDefaultConfig; + + #[derive_impl(frame_system::config_preludes::TestDefaultConfig, no_aggregated_types)] + impl frame_system::DefaultConfig for TestDefaultConfig {} + + #[frame_support::register_default_impl(TestDefaultConfig)] + impl DefaultConfig for TestDefaultConfig { + #[inject_runtime_type] + type RuntimeEvent = (); + type Balance = u64; + type RemoveItemsLimit = ConstU32<5>; + type AssetId = u32; + type AssetIdParameter = u32; + type AssetDeposit = ConstU64<1>; + type AssetAccountDeposit = ConstU64<10>; + type MetadataDepositBase = ConstU64<1>; + type MetadataDepositPerByte = ConstU64<1>; + type ApprovalDeposit = ConstU64<1>; + type StringLimit = ConstU32<50>; + type Extra = (); + type CallbackHandle = (); + type WeightInfo = (); + #[cfg(feature = "runtime-benchmarks")] + type BenchmarkHelper = (); + } + } + + #[pallet::config(with_default)] /// The module configuration trait. pub trait Config: frame_system::Config { /// The overarching event type. + #[pallet::no_default_bounds] type RuntimeEvent: From> + IsType<::RuntimeEvent>; @@ -262,10 +304,12 @@ pub mod pallet { type AssetIdParameter: Parameter + From + Into + MaxEncodedLen; /// The currency mechanism. + #[pallet::no_default] type Currency: ReservableCurrency; /// Standard asset class creation is only allowed if the origin attempting it and the /// asset class are in this set. + #[pallet::no_default] type CreateOrigin: EnsureOriginWithArg< Self::RuntimeOrigin, Self::AssetId, @@ -274,28 +318,34 @@ pub mod pallet { /// The origin which may forcibly create or destroy an asset or otherwise alter privileged /// attributes. + #[pallet::no_default] type ForceOrigin: EnsureOrigin; /// The basic amount of funds that must be reserved for an asset. #[pallet::constant] + #[pallet::no_default_bounds] type AssetDeposit: Get>; /// The amount of funds that must be reserved for a non-provider asset account to be /// maintained. #[pallet::constant] + #[pallet::no_default_bounds] type AssetAccountDeposit: Get>; /// The basic amount of funds that must be reserved when adding metadata to your asset. #[pallet::constant] + #[pallet::no_default_bounds] type MetadataDepositBase: Get>; /// The additional funds that must be reserved for the number of bytes you store in your /// metadata. #[pallet::constant] + #[pallet::no_default_bounds] type MetadataDepositPerByte: Get>; /// The amount of funds that must be reserved when creating a new approval. #[pallet::constant] + #[pallet::no_default_bounds] type ApprovalDeposit: Get>; /// The maximum length of a name or symbol stored on-chain. @@ -304,6 +354,7 @@ pub mod pallet { /// A hook to allow a per-asset, per-account minimum balance to be enforced. This must be /// respected in all permissionless operations. + #[pallet::no_default] type Freezer: FrozenBalance; /// Additional data to be stored with an account's asset balance. diff --git a/substrate/frame/assets/src/migration.rs b/substrate/frame/assets/src/migration.rs index efe77714c524d38e9dd822652e39762848fe5367..dd7c12293e80f410301bb47cca013ae4f013e72f 100644 --- a/substrate/frame/assets/src/migration.rs +++ b/substrate/frame/assets/src/migration.rs @@ -64,12 +64,12 @@ pub mod v1 { } } - pub struct MigrateToV1(sp_std::marker::PhantomData); + pub struct MigrateToV1(core::marker::PhantomData); impl OnRuntimeUpgrade for MigrateToV1 { fn on_runtime_upgrade() -> Weight { - let current_version = Pallet::::current_storage_version(); - let onchain_version = Pallet::::on_chain_storage_version(); - if onchain_version == 0 && current_version == 1 { + let in_code_version = Pallet::::in_code_storage_version(); + let on_chain_version = Pallet::::on_chain_storage_version(); + if on_chain_version == 0 && in_code_version == 1 { let mut translated = 0u64; Asset::::translate::< OldAssetDetails>, @@ -78,12 +78,12 @@ pub mod v1 { translated.saturating_inc(); Some(old_value.migrate_to_v1()) }); - current_version.put::>(); + in_code_version.put::>(); log::info!( target: LOG_TARGET, "Upgraded {} pools, storage to version {:?}", translated, - current_version + in_code_version ); T::DbWeight::get().reads_writes(translated + 1, translated + 1) } else { @@ -116,13 +116,13 @@ pub mod v1 { "the asset count before and after the migration should be the same" ); - let current_version = Pallet::::current_storage_version(); - let onchain_version = Pallet::::on_chain_storage_version(); + let in_code_version = Pallet::::in_code_storage_version(); + let on_chain_version = Pallet::::on_chain_storage_version(); - frame_support::ensure!(current_version == 1, "must_upgrade"); + frame_support::ensure!(in_code_version == 1, "must_upgrade"); ensure!( - current_version == onchain_version, - "after migration, the current_version and onchain_version should be the same" + in_code_version == on_chain_version, + "after migration, the in_code_version and on_chain_version should be the same" ); Asset::::iter().try_for_each(|(_id, asset)| -> Result<(), TryRuntimeError> { diff --git a/substrate/frame/assets/src/mock.rs b/substrate/frame/assets/src/mock.rs index 6dda08eaff8bb781fb7f29fc514f1672784de372..f6173a451fffaee41f66dc6f697a40cd68e3648b 100644 --- a/substrate/frame/assets/src/mock.rs +++ b/substrate/frame/assets/src/mock.rs @@ -25,12 +25,8 @@ use frame_support::{ construct_runtime, derive_impl, parameter_types, traits::{AsEnsureOriginWithArg, ConstU32, ConstU64}, }; -use sp_core::H256; use sp_io::storage; -use sp_runtime::{ - traits::{BlakeTwo256, IdentityLookup}, - BuildStorage, -}; +use sp_runtime::BuildStorage; type Block = frame_system::mocking::MockBlock; @@ -46,30 +42,10 @@ construct_runtime!( type AccountId = u64; type AssetId = u32; -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { - type BaseCallFilter = frame_support::traits::Everything; - type BlockWeights = (); - type BlockLength = (); - type RuntimeOrigin = RuntimeOrigin; - type RuntimeCall = RuntimeCall; - type Nonce = u64; - type Hash = H256; - type Hashing = BlakeTwo256; - type AccountId = AccountId; - type Lookup = IdentityLookup; type Block = Block; - type RuntimeEvent = RuntimeEvent; - type BlockHashCount = ConstU64<250>; - type DbWeight = (); - type Version = (); - type PalletInfo = PalletInfo; type AccountData = pallet_balances::AccountData; - type OnNewAccount = (); - type OnKilledAccount = (); - type SystemWeightInfo = (); - type SS58Prefix = (); - type OnSetCode = (); type MaxConsumers = ConstU32<3>; } @@ -132,27 +108,13 @@ impl AssetsCallbackHandle { } } +#[derive_impl(crate::config_preludes::TestDefaultConfig)] impl Config for Test { - type RuntimeEvent = RuntimeEvent; - type Balance = u64; - type AssetId = u32; - type AssetIdParameter = u32; type Currency = Balances; type CreateOrigin = AsEnsureOriginWithArg>; type ForceOrigin = frame_system::EnsureRoot; - type AssetDeposit = ConstU64<1>; - type AssetAccountDeposit = ConstU64<10>; - type MetadataDepositBase = ConstU64<1>; - type MetadataDepositPerByte = ConstU64<1>; - type ApprovalDeposit = ConstU64<1>; - type StringLimit = ConstU32<50>; type Freezer = TestFreezer; - type WeightInfo = (); type CallbackHandle = AssetsCallbackHandle; - type Extra = (); - type RemoveItemsLimit = ConstU32<5>; - #[cfg(feature = "runtime-benchmarks")] - type BenchmarkHelper = (); } use std::collections::HashMap; diff --git a/substrate/frame/assets/src/tests.rs b/substrate/frame/assets/src/tests.rs index e09648a51eccd09408b4549cc28315c8052d9ae5..c7021bcad531046c8881a8a9ef8932f4bd54c011 100644 --- a/substrate/frame/assets/src/tests.rs +++ b/substrate/frame/assets/src/tests.rs @@ -1453,7 +1453,7 @@ fn force_asset_status_should_work() { )); assert_eq!(Assets::balance(0, 1), 50); - // account can recieve assets for balance < min_balance + // account can receive assets for balance < min_balance assert_ok!(Assets::transfer(RuntimeOrigin::signed(2), 0, 1, 1)); assert_eq!(Assets::balance(0, 1), 51); diff --git a/substrate/frame/assets/src/types.rs b/substrate/frame/assets/src/types.rs index 67f9bf07f5e7e2dfe1edc1f0a8236d06cd56ef61..11edc7d3fcb585773bc2d49349948fd56299e7d3 100644 --- a/substrate/frame/assets/src/types.rs +++ b/substrate/frame/assets/src/types.rs @@ -123,7 +123,7 @@ where return None } if let ExistenceReason::DepositHeld(deposit) = - sp_std::mem::replace(self, ExistenceReason::DepositRefunded) + core::mem::replace(self, ExistenceReason::DepositRefunded) { Some(deposit) } else { @@ -136,7 +136,7 @@ where return None } if let ExistenceReason::DepositFrom(depositor, deposit) = - sp_std::mem::replace(self, ExistenceReason::DepositRefunded) + core::mem::replace(self, ExistenceReason::DepositRefunded) { Some((depositor, deposit)) } else { diff --git a/substrate/frame/assets/src/weights.rs b/substrate/frame/assets/src/weights.rs index f20f7e317cff7c32d280b2e6fa9eaa9aa0fdbd57..7886cd364d516b71840cc3f95bfcc2299b7c5d18 100644 --- a/substrate/frame/assets/src/weights.rs +++ b/substrate/frame/assets/src/weights.rs @@ -15,16 +15,16 @@ // See the License for the specific language governing permissions and // limitations under the License. -//! Autogenerated weights for pallet_assets +//! Autogenerated weights for `pallet_assets` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-06-16, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-04-08, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-e8ezs4ez-project-145-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("dev"), DB CACHE: 1024 +//! HOSTNAME: `runner-anb7yjbi-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: `1024` // Executed Command: -// ./target/production/substrate +// ./target/production/substrate-node // benchmark // pallet // --chain=dev @@ -35,12 +35,11 @@ // --no-median-slopes // --no-min-squares // --extrinsic=* -// --execution=wasm // --wasm-execution=compiled // --heap-pages=4096 -// --output=./frame/assets/src/weights.rs -// --header=./HEADER-APACHE2 -// --template=./.maintain/frame-weight-template.hbs +// --output=./substrate/frame/assets/src/weights.rs +// --header=./substrate/HEADER-APACHE2 +// --template=./substrate/.maintain/frame-weight-template.hbs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -50,7 +49,7 @@ use frame_support::{traits::Get, weights::{Weight, constants::RocksDbWeight}}; use core::marker::PhantomData; -/// Weight functions needed for pallet_assets. +/// Weight functions needed for `pallet_assets`. pub trait WeightInfo { fn create() -> Weight; fn force_create() -> Weight; @@ -86,882 +85,894 @@ pub trait WeightInfo { fn block() -> Weight; } -/// Weights for pallet_assets using the Substrate node and recommended hardware. +/// Weights for `pallet_assets` using the Substrate node and recommended hardware. pub struct SubstrateWeight(PhantomData); impl WeightInfo for SubstrateWeight { - /// Storage: Assets Asset (r:1 w:1) - /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: `Assets::Asset` (r:1 w:1) + /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) fn create() -> Weight { // Proof Size summary in bytes: // Measured: `293` // Estimated: `3675` - // Minimum execution time: 31_340_000 picoseconds. - Weight::from_parts(31_977_000, 3675) + // Minimum execution time: 26_165_000 picoseconds. + Weight::from_parts(26_838_000, 3675) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } - /// Storage: Assets Asset (r:1 w:1) - /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) + /// Storage: `Assets::Asset` (r:1 w:1) + /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) fn force_create() -> Weight { // Proof Size summary in bytes: // Measured: `153` // Estimated: `3675` - // Minimum execution time: 13_342_000 picoseconds. - Weight::from_parts(13_782_000, 3675) + // Minimum execution time: 11_152_000 picoseconds. + Weight::from_parts(11_624_000, 3675) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: Assets Asset (r:1 w:1) - /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) + /// Storage: `Assets::Asset` (r:1 w:1) + /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) fn start_destroy() -> Weight { // Proof Size summary in bytes: // Measured: `385` // Estimated: `3675` - // Minimum execution time: 14_437_000 picoseconds. - Weight::from_parts(14_833_000, 3675) + // Minimum execution time: 11_961_000 picoseconds. + Weight::from_parts(12_408_000, 3675) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: Assets Asset (r:1 w:1) - /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) - /// Storage: Assets Account (r:1001 w:1000) - /// Proof: Assets Account (max_values: None, max_size: Some(134), added: 2609, mode: MaxEncodedLen) - /// Storage: System Account (r:1000 w:1000) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: `Assets::Asset` (r:1 w:1) + /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) + /// Storage: `Assets::Account` (r:1001 w:1000) + /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1000 w:1000) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) /// The range of component `c` is `[0, 1000]`. fn destroy_accounts(c: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `0 + c * (208 ±0)` // Estimated: `3675 + c * (2609 ±0)` - // Minimum execution time: 18_728_000 picoseconds. - Weight::from_parts(18_982_000, 3675) - // Standard Error: 11_708 - .saturating_add(Weight::from_parts(14_363_570, 0).saturating_mul(c.into())) + // Minimum execution time: 15_815_000 picoseconds. + Weight::from_parts(16_370_000, 3675) + // Standard Error: 7_448 + .saturating_add(Weight::from_parts(13_217_179, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().reads((2_u64).saturating_mul(c.into()))) .saturating_add(T::DbWeight::get().writes(1_u64)) .saturating_add(T::DbWeight::get().writes((2_u64).saturating_mul(c.into()))) .saturating_add(Weight::from_parts(0, 2609).saturating_mul(c.into())) } - /// Storage: Assets Asset (r:1 w:1) - /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) - /// Storage: Assets Approvals (r:1001 w:1000) - /// Proof: Assets Approvals (max_values: None, max_size: Some(148), added: 2623, mode: MaxEncodedLen) + /// Storage: `Assets::Asset` (r:1 w:1) + /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) + /// Storage: `Assets::Approvals` (r:1001 w:1000) + /// Proof: `Assets::Approvals` (`max_values`: None, `max_size`: Some(148), added: 2623, mode: `MaxEncodedLen`) /// The range of component `a` is `[0, 1000]`. fn destroy_approvals(a: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `522 + a * (86 ±0)` // Estimated: `3675 + a * (2623 ±0)` - // Minimum execution time: 18_611_000 picoseconds. - Weight::from_parts(18_970_000, 3675) - // Standard Error: 13_224 - .saturating_add(Weight::from_parts(16_397_299, 0).saturating_mul(a.into())) + // Minimum execution time: 16_791_000 picoseconds. + Weight::from_parts(17_066_000, 3675) + // Standard Error: 7_163 + .saturating_add(Weight::from_parts(14_436_592, 0).saturating_mul(a.into())) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(a.into()))) .saturating_add(T::DbWeight::get().writes(1_u64)) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(a.into()))) .saturating_add(Weight::from_parts(0, 2623).saturating_mul(a.into())) } - /// Storage: Assets Asset (r:1 w:1) - /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) - /// Storage: Assets Metadata (r:1 w:0) - /// Proof: Assets Metadata (max_values: None, max_size: Some(140), added: 2615, mode: MaxEncodedLen) + /// Storage: `Assets::Asset` (r:1 w:1) + /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) + /// Storage: `Assets::Metadata` (r:1 w:0) + /// Proof: `Assets::Metadata` (`max_values`: None, `max_size`: Some(140), added: 2615, mode: `MaxEncodedLen`) fn finish_destroy() -> Weight { // Proof Size summary in bytes: // Measured: `351` // Estimated: `3675` - // Minimum execution time: 14_504_000 picoseconds. - Weight::from_parts(14_906_000, 3675) + // Minimum execution time: 12_769_000 picoseconds. + Weight::from_parts(13_097_000, 3675) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: Assets Asset (r:1 w:1) - /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) - /// Storage: Assets Account (r:1 w:1) - /// Proof: Assets Account (max_values: None, max_size: Some(134), added: 2609, mode: MaxEncodedLen) + /// Storage: `Assets::Asset` (r:1 w:1) + /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) + /// Storage: `Assets::Account` (r:1 w:1) + /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) fn mint() -> Weight { // Proof Size summary in bytes: // Measured: `351` // Estimated: `3675` - // Minimum execution time: 26_653_000 picoseconds. - Weight::from_parts(27_260_000, 3675) + // Minimum execution time: 22_539_000 picoseconds. + Weight::from_parts(23_273_000, 3675) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } - /// Storage: Assets Asset (r:1 w:1) - /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) - /// Storage: Assets Account (r:1 w:1) - /// Proof: Assets Account (max_values: None, max_size: Some(134), added: 2609, mode: MaxEncodedLen) + /// Storage: `Assets::Asset` (r:1 w:1) + /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) + /// Storage: `Assets::Account` (r:1 w:1) + /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) fn burn() -> Weight { // Proof Size summary in bytes: // Measured: `459` // Estimated: `3675` - // Minimum execution time: 33_625_000 picoseconds. - Weight::from_parts(34_474_000, 3675) + // Minimum execution time: 30_885_000 picoseconds. + Weight::from_parts(31_800_000, 3675) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } - /// Storage: Assets Asset (r:1 w:1) - /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) - /// Storage: Assets Account (r:2 w:2) - /// Proof: Assets Account (max_values: None, max_size: Some(134), added: 2609, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: `Assets::Asset` (r:1 w:1) + /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) + /// Storage: `Assets::Account` (r:2 w:2) + /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) fn transfer() -> Weight { // Proof Size summary in bytes: // Measured: `498` // Estimated: `6208` - // Minimum execution time: 47_609_000 picoseconds. - Weight::from_parts(48_476_000, 6208) + // Minimum execution time: 43_618_000 picoseconds. + Weight::from_parts(44_794_000, 6208) .saturating_add(T::DbWeight::get().reads(4_u64)) .saturating_add(T::DbWeight::get().writes(4_u64)) } - /// Storage: Assets Asset (r:1 w:1) - /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) - /// Storage: Assets Account (r:2 w:2) - /// Proof: Assets Account (max_values: None, max_size: Some(134), added: 2609, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: `Assets::Asset` (r:1 w:1) + /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) + /// Storage: `Assets::Account` (r:2 w:2) + /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) fn transfer_keep_alive() -> Weight { // Proof Size summary in bytes: // Measured: `498` // Estimated: `6208` - // Minimum execution time: 41_625_000 picoseconds. - Weight::from_parts(43_030_000, 6208) + // Minimum execution time: 39_174_000 picoseconds. + Weight::from_parts(40_059_000, 6208) .saturating_add(T::DbWeight::get().reads(4_u64)) .saturating_add(T::DbWeight::get().writes(4_u64)) } - /// Storage: Assets Asset (r:1 w:1) - /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) - /// Storage: Assets Account (r:2 w:2) - /// Proof: Assets Account (max_values: None, max_size: Some(134), added: 2609, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: `Assets::Asset` (r:1 w:1) + /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) + /// Storage: `Assets::Account` (r:2 w:2) + /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) fn force_transfer() -> Weight { // Proof Size summary in bytes: // Measured: `498` // Estimated: `6208` - // Minimum execution time: 47_661_000 picoseconds. - Weight::from_parts(48_469_000, 6208) + // Minimum execution time: 43_963_000 picoseconds. + Weight::from_parts(44_995_000, 6208) .saturating_add(T::DbWeight::get().reads(4_u64)) .saturating_add(T::DbWeight::get().writes(4_u64)) } - /// Storage: Assets Asset (r:1 w:0) - /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) - /// Storage: Assets Account (r:1 w:1) - /// Proof: Assets Account (max_values: None, max_size: Some(134), added: 2609, mode: MaxEncodedLen) + /// Storage: `Assets::Asset` (r:1 w:0) + /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) + /// Storage: `Assets::Account` (r:1 w:1) + /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) fn freeze() -> Weight { // Proof Size summary in bytes: // Measured: `459` // Estimated: `3675` - // Minimum execution time: 17_727_000 picoseconds. - Weight::from_parts(18_384_000, 3675) + // Minimum execution time: 15_853_000 picoseconds. + Weight::from_parts(16_414_000, 3675) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: Assets Asset (r:1 w:0) - /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) - /// Storage: Assets Account (r:1 w:1) - /// Proof: Assets Account (max_values: None, max_size: Some(134), added: 2609, mode: MaxEncodedLen) + /// Storage: `Assets::Asset` (r:1 w:0) + /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) + /// Storage: `Assets::Account` (r:1 w:1) + /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) fn thaw() -> Weight { // Proof Size summary in bytes: // Measured: `459` // Estimated: `3675` - // Minimum execution time: 17_657_000 picoseconds. - Weight::from_parts(18_282_000, 3675) + // Minimum execution time: 15_925_000 picoseconds. + Weight::from_parts(16_449_000, 3675) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: Assets Asset (r:1 w:1) - /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) + /// Storage: `Assets::Asset` (r:1 w:1) + /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) fn freeze_asset() -> Weight { // Proof Size summary in bytes: // Measured: `385` // Estimated: `3675` - // Minimum execution time: 13_743_000 picoseconds. - Weight::from_parts(14_193_000, 3675) + // Minimum execution time: 11_629_000 picoseconds. + Weight::from_parts(12_138_000, 3675) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: Assets Asset (r:1 w:1) - /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) + /// Storage: `Assets::Asset` (r:1 w:1) + /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) fn thaw_asset() -> Weight { // Proof Size summary in bytes: // Measured: `385` // Estimated: `3675` - // Minimum execution time: 13_653_000 picoseconds. - Weight::from_parts(14_263_000, 3675) + // Minimum execution time: 11_653_000 picoseconds. + Weight::from_parts(12_058_000, 3675) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: Assets Asset (r:1 w:1) - /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) - /// Storage: Assets Metadata (r:1 w:0) - /// Proof: Assets Metadata (max_values: None, max_size: Some(140), added: 2615, mode: MaxEncodedLen) + /// Storage: `Assets::Asset` (r:1 w:1) + /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) + /// Storage: `Assets::Metadata` (r:1 w:0) + /// Proof: `Assets::Metadata` (`max_values`: None, `max_size`: Some(140), added: 2615, mode: `MaxEncodedLen`) fn transfer_ownership() -> Weight { // Proof Size summary in bytes: // Measured: `351` // Estimated: `3675` - // Minimum execution time: 15_328_000 picoseconds. - Weight::from_parts(16_042_000, 3675) + // Minimum execution time: 13_292_000 picoseconds. + Weight::from_parts(13_686_000, 3675) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: Assets Asset (r:1 w:1) - /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) + /// Storage: `Assets::Asset` (r:1 w:1) + /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) fn set_team() -> Weight { // Proof Size summary in bytes: // Measured: `351` // Estimated: `3675` - // Minimum execution time: 14_097_000 picoseconds. - Weight::from_parts(14_641_000, 3675) + // Minimum execution time: 11_805_000 picoseconds. + Weight::from_parts(12_060_000, 3675) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: Assets Asset (r:1 w:0) - /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) - /// Storage: Assets Metadata (r:1 w:1) - /// Proof: Assets Metadata (max_values: None, max_size: Some(140), added: 2615, mode: MaxEncodedLen) + /// Storage: `Assets::Asset` (r:1 w:0) + /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) + /// Storage: `Assets::Metadata` (r:1 w:1) + /// Proof: `Assets::Metadata` (`max_values`: None, `max_size`: Some(140), added: 2615, mode: `MaxEncodedLen`) /// The range of component `n` is `[0, 50]`. /// The range of component `s` is `[0, 50]`. - fn set_metadata(_n: u32, _s: u32, ) -> Weight { + fn set_metadata(n: u32, s: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `351` // Estimated: `3675` - // Minimum execution time: 29_535_000 picoseconds. - Weight::from_parts(31_456_892, 3675) + // Minimum execution time: 26_289_000 picoseconds. + Weight::from_parts(27_543_545, 3675) + // Standard Error: 939 + .saturating_add(Weight::from_parts(4_967, 0).saturating_mul(n.into())) + // Standard Error: 939 + .saturating_add(Weight::from_parts(3_698, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: Assets Asset (r:1 w:0) - /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) - /// Storage: Assets Metadata (r:1 w:1) - /// Proof: Assets Metadata (max_values: None, max_size: Some(140), added: 2615, mode: MaxEncodedLen) + /// Storage: `Assets::Asset` (r:1 w:0) + /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) + /// Storage: `Assets::Metadata` (r:1 w:1) + /// Proof: `Assets::Metadata` (`max_values`: None, `max_size`: Some(140), added: 2615, mode: `MaxEncodedLen`) fn clear_metadata() -> Weight { // Proof Size summary in bytes: // Measured: `515` // Estimated: `3675` - // Minimum execution time: 30_680_000 picoseconds. - Weight::from_parts(31_930_000, 3675) + // Minimum execution time: 27_560_000 picoseconds. + Weight::from_parts(28_541_000, 3675) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: Assets Asset (r:1 w:0) - /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) - /// Storage: Assets Metadata (r:1 w:1) - /// Proof: Assets Metadata (max_values: None, max_size: Some(140), added: 2615, mode: MaxEncodedLen) + /// Storage: `Assets::Asset` (r:1 w:0) + /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) + /// Storage: `Assets::Metadata` (r:1 w:1) + /// Proof: `Assets::Metadata` (`max_values`: None, `max_size`: Some(140), added: 2615, mode: `MaxEncodedLen`) /// The range of component `n` is `[0, 50]`. /// The range of component `s` is `[0, 50]`. - fn force_set_metadata(_n: u32, s: u32, ) -> Weight { + fn force_set_metadata(n: u32, s: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `190` // Estimated: `3675` - // Minimum execution time: 14_660_000 picoseconds. - Weight::from_parts(15_718_387, 3675) - // Standard Error: 622 - .saturating_add(Weight::from_parts(2_640, 0).saturating_mul(s.into())) + // Minimum execution time: 12_378_000 picoseconds. + Weight::from_parts(13_057_891, 3675) + // Standard Error: 474 + .saturating_add(Weight::from_parts(1_831, 0).saturating_mul(n.into())) + // Standard Error: 474 + .saturating_add(Weight::from_parts(2_387, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: Assets Asset (r:1 w:0) - /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) - /// Storage: Assets Metadata (r:1 w:1) - /// Proof: Assets Metadata (max_values: None, max_size: Some(140), added: 2615, mode: MaxEncodedLen) + /// Storage: `Assets::Asset` (r:1 w:0) + /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) + /// Storage: `Assets::Metadata` (r:1 w:1) + /// Proof: `Assets::Metadata` (`max_values`: None, `max_size`: Some(140), added: 2615, mode: `MaxEncodedLen`) fn force_clear_metadata() -> Weight { // Proof Size summary in bytes: // Measured: `515` // Estimated: `3675` - // Minimum execution time: 30_853_000 picoseconds. - Weight::from_parts(31_483_000, 3675) + // Minimum execution time: 27_134_000 picoseconds. + Weight::from_parts(28_333_000, 3675) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: Assets Asset (r:1 w:1) - /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) + /// Storage: `Assets::Asset` (r:1 w:1) + /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) fn force_asset_status() -> Weight { // Proof Size summary in bytes: // Measured: `351` // Estimated: `3675` - // Minimum execution time: 13_632_000 picoseconds. - Weight::from_parts(14_077_000, 3675) + // Minimum execution time: 11_524_000 picoseconds. + Weight::from_parts(11_934_000, 3675) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: Assets Asset (r:1 w:1) - /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) - /// Storage: Assets Approvals (r:1 w:1) - /// Proof: Assets Approvals (max_values: None, max_size: Some(148), added: 2623, mode: MaxEncodedLen) + /// Storage: `Assets::Asset` (r:1 w:1) + /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) + /// Storage: `Assets::Approvals` (r:1 w:1) + /// Proof: `Assets::Approvals` (`max_values`: None, `max_size`: Some(148), added: 2623, mode: `MaxEncodedLen`) fn approve_transfer() -> Weight { // Proof Size summary in bytes: // Measured: `385` // Estimated: `3675` - // Minimum execution time: 33_780_000 picoseconds. - Weight::from_parts(34_533_000, 3675) + // Minimum execution time: 30_206_000 picoseconds. + Weight::from_parts(31_624_000, 3675) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } - /// Storage: Assets Asset (r:1 w:1) - /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) - /// Storage: Assets Approvals (r:1 w:1) - /// Proof: Assets Approvals (max_values: None, max_size: Some(148), added: 2623, mode: MaxEncodedLen) - /// Storage: Assets Account (r:2 w:2) - /// Proof: Assets Account (max_values: None, max_size: Some(134), added: 2609, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: `Assets::Asset` (r:1 w:1) + /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) + /// Storage: `Assets::Approvals` (r:1 w:1) + /// Proof: `Assets::Approvals` (`max_values`: None, `max_size`: Some(148), added: 2623, mode: `MaxEncodedLen`) + /// Storage: `Assets::Account` (r:2 w:2) + /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) fn transfer_approved() -> Weight { // Proof Size summary in bytes: // Measured: `668` // Estimated: `6208` - // Minimum execution time: 67_712_000 picoseconds. - Weight::from_parts(69_946_000, 6208) + // Minimum execution time: 64_074_000 picoseconds. + Weight::from_parts(66_145_000, 6208) .saturating_add(T::DbWeight::get().reads(5_u64)) .saturating_add(T::DbWeight::get().writes(5_u64)) } - /// Storage: Assets Asset (r:1 w:1) - /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) - /// Storage: Assets Approvals (r:1 w:1) - /// Proof: Assets Approvals (max_values: None, max_size: Some(148), added: 2623, mode: MaxEncodedLen) + /// Storage: `Assets::Asset` (r:1 w:1) + /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) + /// Storage: `Assets::Approvals` (r:1 w:1) + /// Proof: `Assets::Approvals` (`max_values`: None, `max_size`: Some(148), added: 2623, mode: `MaxEncodedLen`) fn cancel_approval() -> Weight { // Proof Size summary in bytes: // Measured: `555` // Estimated: `3675` - // Minimum execution time: 36_668_000 picoseconds. - Weight::from_parts(37_637_000, 3675) + // Minimum execution time: 32_790_000 picoseconds. + Weight::from_parts(33_634_000, 3675) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } - /// Storage: Assets Asset (r:1 w:1) - /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) - /// Storage: Assets Approvals (r:1 w:1) - /// Proof: Assets Approvals (max_values: None, max_size: Some(148), added: 2623, mode: MaxEncodedLen) + /// Storage: `Assets::Asset` (r:1 w:1) + /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) + /// Storage: `Assets::Approvals` (r:1 w:1) + /// Proof: `Assets::Approvals` (`max_values`: None, `max_size`: Some(148), added: 2623, mode: `MaxEncodedLen`) fn force_cancel_approval() -> Weight { // Proof Size summary in bytes: // Measured: `555` // Estimated: `3675` - // Minimum execution time: 36_685_000 picoseconds. - Weight::from_parts(37_950_000, 3675) + // Minimum execution time: 33_150_000 picoseconds. + Weight::from_parts(34_440_000, 3675) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } - /// Storage: Assets Asset (r:1 w:1) - /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) + /// Storage: `Assets::Asset` (r:1 w:1) + /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) fn set_min_balance() -> Weight { // Proof Size summary in bytes: // Measured: `351` // Estimated: `3675` - // Minimum execution time: 14_466_000 picoseconds. - Weight::from_parts(14_924_000, 3675) + // Minimum execution time: 12_365_000 picoseconds. + Weight::from_parts(12_870_000, 3675) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: Assets Account (r:1 w:1) - /// Proof: Assets Account (max_values: None, max_size: Some(134), added: 2609, mode: MaxEncodedLen) - /// Storage: Assets Asset (r:1 w:1) - /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: `Assets::Account` (r:1 w:1) + /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) + /// Storage: `Assets::Asset` (r:1 w:1) + /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) fn touch() -> Weight { // Proof Size summary in bytes: // Measured: `453` // Estimated: `3675` - // Minimum execution time: 34_874_000 picoseconds. - Weight::from_parts(36_330_000, 3675) + // Minimum execution time: 32_308_000 picoseconds. + Weight::from_parts(33_080_000, 3675) .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(3_u64)) } - /// Storage: Assets Account (r:1 w:1) - /// Proof: Assets Account (max_values: None, max_size: Some(134), added: 2609, mode: MaxEncodedLen) - /// Storage: Assets Asset (r:1 w:1) - /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) + /// Storage: `Assets::Account` (r:1 w:1) + /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) + /// Storage: `Assets::Asset` (r:1 w:1) + /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) fn touch_other() -> Weight { // Proof Size summary in bytes: // Measured: `351` // Estimated: `3675` - // Minimum execution time: 33_278_000 picoseconds. - Weight::from_parts(34_104_000, 3675) + // Minimum execution time: 29_870_000 picoseconds. + Weight::from_parts(30_562_000, 3675) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } - /// Storage: Assets Account (r:1 w:1) - /// Proof: Assets Account (max_values: None, max_size: Some(134), added: 2609, mode: MaxEncodedLen) - /// Storage: Assets Asset (r:1 w:1) - /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: `Assets::Account` (r:1 w:1) + /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) + /// Storage: `Assets::Asset` (r:1 w:1) + /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) fn refund() -> Weight { // Proof Size summary in bytes: // Measured: `579` // Estimated: `3675` - // Minimum execution time: 32_898_000 picoseconds. - Weight::from_parts(33_489_000, 3675) + // Minimum execution time: 31_980_000 picoseconds. + Weight::from_parts(33_747_000, 3675) .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(3_u64)) } - /// Storage: Assets Account (r:1 w:1) - /// Proof: Assets Account (max_values: None, max_size: Some(134), added: 2609, mode: MaxEncodedLen) - /// Storage: Assets Asset (r:1 w:1) - /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) + /// Storage: `Assets::Account` (r:1 w:1) + /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) + /// Storage: `Assets::Asset` (r:1 w:1) + /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) fn refund_other() -> Weight { // Proof Size summary in bytes: // Measured: `510` // Estimated: `3675` - // Minimum execution time: 31_243_000 picoseconds. - Weight::from_parts(31_909_000, 3675) + // Minimum execution time: 29_599_000 picoseconds. + Weight::from_parts(30_919_000, 3675) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } - /// Storage: Assets Asset (r:1 w:0) - /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) - /// Storage: Assets Account (r:1 w:1) - /// Proof: Assets Account (max_values: None, max_size: Some(134), added: 2609, mode: MaxEncodedLen) + /// Storage: `Assets::Asset` (r:1 w:0) + /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) + /// Storage: `Assets::Account` (r:1 w:1) + /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) fn block() -> Weight { // Proof Size summary in bytes: // Measured: `459` // Estimated: `3675` - // Minimum execution time: 17_692_000 picoseconds. - Weight::from_parts(18_253_000, 3675) + // Minimum execution time: 15_741_000 picoseconds. + Weight::from_parts(16_558_000, 3675) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } } -// For backwards compatibility and tests +// For backwards compatibility and tests. impl WeightInfo for () { - /// Storage: Assets Asset (r:1 w:1) - /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: `Assets::Asset` (r:1 w:1) + /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) fn create() -> Weight { // Proof Size summary in bytes: // Measured: `293` // Estimated: `3675` - // Minimum execution time: 31_340_000 picoseconds. - Weight::from_parts(31_977_000, 3675) + // Minimum execution time: 26_165_000 picoseconds. + Weight::from_parts(26_838_000, 3675) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } - /// Storage: Assets Asset (r:1 w:1) - /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) + /// Storage: `Assets::Asset` (r:1 w:1) + /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) fn force_create() -> Weight { // Proof Size summary in bytes: // Measured: `153` // Estimated: `3675` - // Minimum execution time: 13_342_000 picoseconds. - Weight::from_parts(13_782_000, 3675) + // Minimum execution time: 11_152_000 picoseconds. + Weight::from_parts(11_624_000, 3675) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Assets Asset (r:1 w:1) - /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) + /// Storage: `Assets::Asset` (r:1 w:1) + /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) fn start_destroy() -> Weight { // Proof Size summary in bytes: // Measured: `385` // Estimated: `3675` - // Minimum execution time: 14_437_000 picoseconds. - Weight::from_parts(14_833_000, 3675) + // Minimum execution time: 11_961_000 picoseconds. + Weight::from_parts(12_408_000, 3675) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Assets Asset (r:1 w:1) - /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) - /// Storage: Assets Account (r:1001 w:1000) - /// Proof: Assets Account (max_values: None, max_size: Some(134), added: 2609, mode: MaxEncodedLen) - /// Storage: System Account (r:1000 w:1000) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: `Assets::Asset` (r:1 w:1) + /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) + /// Storage: `Assets::Account` (r:1001 w:1000) + /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1000 w:1000) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) /// The range of component `c` is `[0, 1000]`. fn destroy_accounts(c: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `0 + c * (208 ±0)` // Estimated: `3675 + c * (2609 ±0)` - // Minimum execution time: 18_728_000 picoseconds. - Weight::from_parts(18_982_000, 3675) - // Standard Error: 11_708 - .saturating_add(Weight::from_parts(14_363_570, 0).saturating_mul(c.into())) + // Minimum execution time: 15_815_000 picoseconds. + Weight::from_parts(16_370_000, 3675) + // Standard Error: 7_448 + .saturating_add(Weight::from_parts(13_217_179, 0).saturating_mul(c.into())) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().reads((2_u64).saturating_mul(c.into()))) .saturating_add(RocksDbWeight::get().writes(1_u64)) .saturating_add(RocksDbWeight::get().writes((2_u64).saturating_mul(c.into()))) .saturating_add(Weight::from_parts(0, 2609).saturating_mul(c.into())) } - /// Storage: Assets Asset (r:1 w:1) - /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) - /// Storage: Assets Approvals (r:1001 w:1000) - /// Proof: Assets Approvals (max_values: None, max_size: Some(148), added: 2623, mode: MaxEncodedLen) + /// Storage: `Assets::Asset` (r:1 w:1) + /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) + /// Storage: `Assets::Approvals` (r:1001 w:1000) + /// Proof: `Assets::Approvals` (`max_values`: None, `max_size`: Some(148), added: 2623, mode: `MaxEncodedLen`) /// The range of component `a` is `[0, 1000]`. fn destroy_approvals(a: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `522 + a * (86 ±0)` // Estimated: `3675 + a * (2623 ±0)` - // Minimum execution time: 18_611_000 picoseconds. - Weight::from_parts(18_970_000, 3675) - // Standard Error: 13_224 - .saturating_add(Weight::from_parts(16_397_299, 0).saturating_mul(a.into())) + // Minimum execution time: 16_791_000 picoseconds. + Weight::from_parts(17_066_000, 3675) + // Standard Error: 7_163 + .saturating_add(Weight::from_parts(14_436_592, 0).saturating_mul(a.into())) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().reads((1_u64).saturating_mul(a.into()))) .saturating_add(RocksDbWeight::get().writes(1_u64)) .saturating_add(RocksDbWeight::get().writes((1_u64).saturating_mul(a.into()))) .saturating_add(Weight::from_parts(0, 2623).saturating_mul(a.into())) } - /// Storage: Assets Asset (r:1 w:1) - /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) - /// Storage: Assets Metadata (r:1 w:0) - /// Proof: Assets Metadata (max_values: None, max_size: Some(140), added: 2615, mode: MaxEncodedLen) + /// Storage: `Assets::Asset` (r:1 w:1) + /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) + /// Storage: `Assets::Metadata` (r:1 w:0) + /// Proof: `Assets::Metadata` (`max_values`: None, `max_size`: Some(140), added: 2615, mode: `MaxEncodedLen`) fn finish_destroy() -> Weight { // Proof Size summary in bytes: // Measured: `351` // Estimated: `3675` - // Minimum execution time: 14_504_000 picoseconds. - Weight::from_parts(14_906_000, 3675) + // Minimum execution time: 12_769_000 picoseconds. + Weight::from_parts(13_097_000, 3675) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Assets Asset (r:1 w:1) - /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) - /// Storage: Assets Account (r:1 w:1) - /// Proof: Assets Account (max_values: None, max_size: Some(134), added: 2609, mode: MaxEncodedLen) + /// Storage: `Assets::Asset` (r:1 w:1) + /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) + /// Storage: `Assets::Account` (r:1 w:1) + /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) fn mint() -> Weight { // Proof Size summary in bytes: // Measured: `351` // Estimated: `3675` - // Minimum execution time: 26_653_000 picoseconds. - Weight::from_parts(27_260_000, 3675) + // Minimum execution time: 22_539_000 picoseconds. + Weight::from_parts(23_273_000, 3675) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } - /// Storage: Assets Asset (r:1 w:1) - /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) - /// Storage: Assets Account (r:1 w:1) - /// Proof: Assets Account (max_values: None, max_size: Some(134), added: 2609, mode: MaxEncodedLen) + /// Storage: `Assets::Asset` (r:1 w:1) + /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) + /// Storage: `Assets::Account` (r:1 w:1) + /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) fn burn() -> Weight { // Proof Size summary in bytes: // Measured: `459` // Estimated: `3675` - // Minimum execution time: 33_625_000 picoseconds. - Weight::from_parts(34_474_000, 3675) + // Minimum execution time: 30_885_000 picoseconds. + Weight::from_parts(31_800_000, 3675) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } - /// Storage: Assets Asset (r:1 w:1) - /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) - /// Storage: Assets Account (r:2 w:2) - /// Proof: Assets Account (max_values: None, max_size: Some(134), added: 2609, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: `Assets::Asset` (r:1 w:1) + /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) + /// Storage: `Assets::Account` (r:2 w:2) + /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) fn transfer() -> Weight { // Proof Size summary in bytes: // Measured: `498` // Estimated: `6208` - // Minimum execution time: 47_609_000 picoseconds. - Weight::from_parts(48_476_000, 6208) + // Minimum execution time: 43_618_000 picoseconds. + Weight::from_parts(44_794_000, 6208) .saturating_add(RocksDbWeight::get().reads(4_u64)) .saturating_add(RocksDbWeight::get().writes(4_u64)) } - /// Storage: Assets Asset (r:1 w:1) - /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) - /// Storage: Assets Account (r:2 w:2) - /// Proof: Assets Account (max_values: None, max_size: Some(134), added: 2609, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: `Assets::Asset` (r:1 w:1) + /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) + /// Storage: `Assets::Account` (r:2 w:2) + /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) fn transfer_keep_alive() -> Weight { // Proof Size summary in bytes: // Measured: `498` // Estimated: `6208` - // Minimum execution time: 41_625_000 picoseconds. - Weight::from_parts(43_030_000, 6208) + // Minimum execution time: 39_174_000 picoseconds. + Weight::from_parts(40_059_000, 6208) .saturating_add(RocksDbWeight::get().reads(4_u64)) .saturating_add(RocksDbWeight::get().writes(4_u64)) } - /// Storage: Assets Asset (r:1 w:1) - /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) - /// Storage: Assets Account (r:2 w:2) - /// Proof: Assets Account (max_values: None, max_size: Some(134), added: 2609, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: `Assets::Asset` (r:1 w:1) + /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) + /// Storage: `Assets::Account` (r:2 w:2) + /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) fn force_transfer() -> Weight { // Proof Size summary in bytes: // Measured: `498` // Estimated: `6208` - // Minimum execution time: 47_661_000 picoseconds. - Weight::from_parts(48_469_000, 6208) + // Minimum execution time: 43_963_000 picoseconds. + Weight::from_parts(44_995_000, 6208) .saturating_add(RocksDbWeight::get().reads(4_u64)) .saturating_add(RocksDbWeight::get().writes(4_u64)) } - /// Storage: Assets Asset (r:1 w:0) - /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) - /// Storage: Assets Account (r:1 w:1) - /// Proof: Assets Account (max_values: None, max_size: Some(134), added: 2609, mode: MaxEncodedLen) + /// Storage: `Assets::Asset` (r:1 w:0) + /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) + /// Storage: `Assets::Account` (r:1 w:1) + /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) fn freeze() -> Weight { // Proof Size summary in bytes: // Measured: `459` // Estimated: `3675` - // Minimum execution time: 17_727_000 picoseconds. - Weight::from_parts(18_384_000, 3675) + // Minimum execution time: 15_853_000 picoseconds. + Weight::from_parts(16_414_000, 3675) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Assets Asset (r:1 w:0) - /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) - /// Storage: Assets Account (r:1 w:1) - /// Proof: Assets Account (max_values: None, max_size: Some(134), added: 2609, mode: MaxEncodedLen) + /// Storage: `Assets::Asset` (r:1 w:0) + /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) + /// Storage: `Assets::Account` (r:1 w:1) + /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) fn thaw() -> Weight { // Proof Size summary in bytes: // Measured: `459` // Estimated: `3675` - // Minimum execution time: 17_657_000 picoseconds. - Weight::from_parts(18_282_000, 3675) + // Minimum execution time: 15_925_000 picoseconds. + Weight::from_parts(16_449_000, 3675) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Assets Asset (r:1 w:1) - /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) + /// Storage: `Assets::Asset` (r:1 w:1) + /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) fn freeze_asset() -> Weight { // Proof Size summary in bytes: // Measured: `385` // Estimated: `3675` - // Minimum execution time: 13_743_000 picoseconds. - Weight::from_parts(14_193_000, 3675) + // Minimum execution time: 11_629_000 picoseconds. + Weight::from_parts(12_138_000, 3675) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Assets Asset (r:1 w:1) - /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) + /// Storage: `Assets::Asset` (r:1 w:1) + /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) fn thaw_asset() -> Weight { // Proof Size summary in bytes: // Measured: `385` // Estimated: `3675` - // Minimum execution time: 13_653_000 picoseconds. - Weight::from_parts(14_263_000, 3675) + // Minimum execution time: 11_653_000 picoseconds. + Weight::from_parts(12_058_000, 3675) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Assets Asset (r:1 w:1) - /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) - /// Storage: Assets Metadata (r:1 w:0) - /// Proof: Assets Metadata (max_values: None, max_size: Some(140), added: 2615, mode: MaxEncodedLen) + /// Storage: `Assets::Asset` (r:1 w:1) + /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) + /// Storage: `Assets::Metadata` (r:1 w:0) + /// Proof: `Assets::Metadata` (`max_values`: None, `max_size`: Some(140), added: 2615, mode: `MaxEncodedLen`) fn transfer_ownership() -> Weight { // Proof Size summary in bytes: // Measured: `351` // Estimated: `3675` - // Minimum execution time: 15_328_000 picoseconds. - Weight::from_parts(16_042_000, 3675) + // Minimum execution time: 13_292_000 picoseconds. + Weight::from_parts(13_686_000, 3675) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Assets Asset (r:1 w:1) - /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) + /// Storage: `Assets::Asset` (r:1 w:1) + /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) fn set_team() -> Weight { // Proof Size summary in bytes: // Measured: `351` // Estimated: `3675` - // Minimum execution time: 14_097_000 picoseconds. - Weight::from_parts(14_641_000, 3675) + // Minimum execution time: 11_805_000 picoseconds. + Weight::from_parts(12_060_000, 3675) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Assets Asset (r:1 w:0) - /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) - /// Storage: Assets Metadata (r:1 w:1) - /// Proof: Assets Metadata (max_values: None, max_size: Some(140), added: 2615, mode: MaxEncodedLen) + /// Storage: `Assets::Asset` (r:1 w:0) + /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) + /// Storage: `Assets::Metadata` (r:1 w:1) + /// Proof: `Assets::Metadata` (`max_values`: None, `max_size`: Some(140), added: 2615, mode: `MaxEncodedLen`) /// The range of component `n` is `[0, 50]`. /// The range of component `s` is `[0, 50]`. - fn set_metadata(_n: u32, _s: u32, ) -> Weight { + fn set_metadata(n: u32, s: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `351` // Estimated: `3675` - // Minimum execution time: 29_535_000 picoseconds. - Weight::from_parts(31_456_892, 3675) + // Minimum execution time: 26_289_000 picoseconds. + Weight::from_parts(27_543_545, 3675) + // Standard Error: 939 + .saturating_add(Weight::from_parts(4_967, 0).saturating_mul(n.into())) + // Standard Error: 939 + .saturating_add(Weight::from_parts(3_698, 0).saturating_mul(s.into())) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Assets Asset (r:1 w:0) - /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) - /// Storage: Assets Metadata (r:1 w:1) - /// Proof: Assets Metadata (max_values: None, max_size: Some(140), added: 2615, mode: MaxEncodedLen) + /// Storage: `Assets::Asset` (r:1 w:0) + /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) + /// Storage: `Assets::Metadata` (r:1 w:1) + /// Proof: `Assets::Metadata` (`max_values`: None, `max_size`: Some(140), added: 2615, mode: `MaxEncodedLen`) fn clear_metadata() -> Weight { // Proof Size summary in bytes: // Measured: `515` // Estimated: `3675` - // Minimum execution time: 30_680_000 picoseconds. - Weight::from_parts(31_930_000, 3675) + // Minimum execution time: 27_560_000 picoseconds. + Weight::from_parts(28_541_000, 3675) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Assets Asset (r:1 w:0) - /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) - /// Storage: Assets Metadata (r:1 w:1) - /// Proof: Assets Metadata (max_values: None, max_size: Some(140), added: 2615, mode: MaxEncodedLen) + /// Storage: `Assets::Asset` (r:1 w:0) + /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) + /// Storage: `Assets::Metadata` (r:1 w:1) + /// Proof: `Assets::Metadata` (`max_values`: None, `max_size`: Some(140), added: 2615, mode: `MaxEncodedLen`) /// The range of component `n` is `[0, 50]`. /// The range of component `s` is `[0, 50]`. - fn force_set_metadata(_n: u32, s: u32, ) -> Weight { + fn force_set_metadata(n: u32, s: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `190` // Estimated: `3675` - // Minimum execution time: 14_660_000 picoseconds. - Weight::from_parts(15_718_387, 3675) - // Standard Error: 622 - .saturating_add(Weight::from_parts(2_640, 0).saturating_mul(s.into())) + // Minimum execution time: 12_378_000 picoseconds. + Weight::from_parts(13_057_891, 3675) + // Standard Error: 474 + .saturating_add(Weight::from_parts(1_831, 0).saturating_mul(n.into())) + // Standard Error: 474 + .saturating_add(Weight::from_parts(2_387, 0).saturating_mul(s.into())) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Assets Asset (r:1 w:0) - /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) - /// Storage: Assets Metadata (r:1 w:1) - /// Proof: Assets Metadata (max_values: None, max_size: Some(140), added: 2615, mode: MaxEncodedLen) + /// Storage: `Assets::Asset` (r:1 w:0) + /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) + /// Storage: `Assets::Metadata` (r:1 w:1) + /// Proof: `Assets::Metadata` (`max_values`: None, `max_size`: Some(140), added: 2615, mode: `MaxEncodedLen`) fn force_clear_metadata() -> Weight { // Proof Size summary in bytes: // Measured: `515` // Estimated: `3675` - // Minimum execution time: 30_853_000 picoseconds. - Weight::from_parts(31_483_000, 3675) + // Minimum execution time: 27_134_000 picoseconds. + Weight::from_parts(28_333_000, 3675) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Assets Asset (r:1 w:1) - /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) + /// Storage: `Assets::Asset` (r:1 w:1) + /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) fn force_asset_status() -> Weight { // Proof Size summary in bytes: // Measured: `351` // Estimated: `3675` - // Minimum execution time: 13_632_000 picoseconds. - Weight::from_parts(14_077_000, 3675) + // Minimum execution time: 11_524_000 picoseconds. + Weight::from_parts(11_934_000, 3675) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Assets Asset (r:1 w:1) - /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) - /// Storage: Assets Approvals (r:1 w:1) - /// Proof: Assets Approvals (max_values: None, max_size: Some(148), added: 2623, mode: MaxEncodedLen) + /// Storage: `Assets::Asset` (r:1 w:1) + /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) + /// Storage: `Assets::Approvals` (r:1 w:1) + /// Proof: `Assets::Approvals` (`max_values`: None, `max_size`: Some(148), added: 2623, mode: `MaxEncodedLen`) fn approve_transfer() -> Weight { // Proof Size summary in bytes: // Measured: `385` // Estimated: `3675` - // Minimum execution time: 33_780_000 picoseconds. - Weight::from_parts(34_533_000, 3675) + // Minimum execution time: 30_206_000 picoseconds. + Weight::from_parts(31_624_000, 3675) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } - /// Storage: Assets Asset (r:1 w:1) - /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) - /// Storage: Assets Approvals (r:1 w:1) - /// Proof: Assets Approvals (max_values: None, max_size: Some(148), added: 2623, mode: MaxEncodedLen) - /// Storage: Assets Account (r:2 w:2) - /// Proof: Assets Account (max_values: None, max_size: Some(134), added: 2609, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: `Assets::Asset` (r:1 w:1) + /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) + /// Storage: `Assets::Approvals` (r:1 w:1) + /// Proof: `Assets::Approvals` (`max_values`: None, `max_size`: Some(148), added: 2623, mode: `MaxEncodedLen`) + /// Storage: `Assets::Account` (r:2 w:2) + /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) fn transfer_approved() -> Weight { // Proof Size summary in bytes: // Measured: `668` // Estimated: `6208` - // Minimum execution time: 67_712_000 picoseconds. - Weight::from_parts(69_946_000, 6208) + // Minimum execution time: 64_074_000 picoseconds. + Weight::from_parts(66_145_000, 6208) .saturating_add(RocksDbWeight::get().reads(5_u64)) .saturating_add(RocksDbWeight::get().writes(5_u64)) } - /// Storage: Assets Asset (r:1 w:1) - /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) - /// Storage: Assets Approvals (r:1 w:1) - /// Proof: Assets Approvals (max_values: None, max_size: Some(148), added: 2623, mode: MaxEncodedLen) + /// Storage: `Assets::Asset` (r:1 w:1) + /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) + /// Storage: `Assets::Approvals` (r:1 w:1) + /// Proof: `Assets::Approvals` (`max_values`: None, `max_size`: Some(148), added: 2623, mode: `MaxEncodedLen`) fn cancel_approval() -> Weight { // Proof Size summary in bytes: // Measured: `555` // Estimated: `3675` - // Minimum execution time: 36_668_000 picoseconds. - Weight::from_parts(37_637_000, 3675) + // Minimum execution time: 32_790_000 picoseconds. + Weight::from_parts(33_634_000, 3675) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } - /// Storage: Assets Asset (r:1 w:1) - /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) - /// Storage: Assets Approvals (r:1 w:1) - /// Proof: Assets Approvals (max_values: None, max_size: Some(148), added: 2623, mode: MaxEncodedLen) + /// Storage: `Assets::Asset` (r:1 w:1) + /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) + /// Storage: `Assets::Approvals` (r:1 w:1) + /// Proof: `Assets::Approvals` (`max_values`: None, `max_size`: Some(148), added: 2623, mode: `MaxEncodedLen`) fn force_cancel_approval() -> Weight { // Proof Size summary in bytes: // Measured: `555` // Estimated: `3675` - // Minimum execution time: 36_685_000 picoseconds. - Weight::from_parts(37_950_000, 3675) + // Minimum execution time: 33_150_000 picoseconds. + Weight::from_parts(34_440_000, 3675) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } - /// Storage: Assets Asset (r:1 w:1) - /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) + /// Storage: `Assets::Asset` (r:1 w:1) + /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) fn set_min_balance() -> Weight { // Proof Size summary in bytes: // Measured: `351` // Estimated: `3675` - // Minimum execution time: 14_466_000 picoseconds. - Weight::from_parts(14_924_000, 3675) + // Minimum execution time: 12_365_000 picoseconds. + Weight::from_parts(12_870_000, 3675) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Assets Account (r:1 w:1) - /// Proof: Assets Account (max_values: None, max_size: Some(134), added: 2609, mode: MaxEncodedLen) - /// Storage: Assets Asset (r:1 w:1) - /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: `Assets::Account` (r:1 w:1) + /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) + /// Storage: `Assets::Asset` (r:1 w:1) + /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) fn touch() -> Weight { // Proof Size summary in bytes: // Measured: `453` // Estimated: `3675` - // Minimum execution time: 34_874_000 picoseconds. - Weight::from_parts(36_330_000, 3675) + // Minimum execution time: 32_308_000 picoseconds. + Weight::from_parts(33_080_000, 3675) .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(3_u64)) } - /// Storage: Assets Account (r:1 w:1) - /// Proof: Assets Account (max_values: None, max_size: Some(134), added: 2609, mode: MaxEncodedLen) - /// Storage: Assets Asset (r:1 w:1) - /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) + /// Storage: `Assets::Account` (r:1 w:1) + /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) + /// Storage: `Assets::Asset` (r:1 w:1) + /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) fn touch_other() -> Weight { // Proof Size summary in bytes: // Measured: `351` // Estimated: `3675` - // Minimum execution time: 33_278_000 picoseconds. - Weight::from_parts(34_104_000, 3675) + // Minimum execution time: 29_870_000 picoseconds. + Weight::from_parts(30_562_000, 3675) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } - /// Storage: Assets Account (r:1 w:1) - /// Proof: Assets Account (max_values: None, max_size: Some(134), added: 2609, mode: MaxEncodedLen) - /// Storage: Assets Asset (r:1 w:1) - /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: `Assets::Account` (r:1 w:1) + /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) + /// Storage: `Assets::Asset` (r:1 w:1) + /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) fn refund() -> Weight { // Proof Size summary in bytes: // Measured: `579` // Estimated: `3675` - // Minimum execution time: 32_898_000 picoseconds. - Weight::from_parts(33_489_000, 3675) + // Minimum execution time: 31_980_000 picoseconds. + Weight::from_parts(33_747_000, 3675) .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(3_u64)) } - /// Storage: Assets Account (r:1 w:1) - /// Proof: Assets Account (max_values: None, max_size: Some(134), added: 2609, mode: MaxEncodedLen) - /// Storage: Assets Asset (r:1 w:1) - /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) + /// Storage: `Assets::Account` (r:1 w:1) + /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) + /// Storage: `Assets::Asset` (r:1 w:1) + /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) fn refund_other() -> Weight { // Proof Size summary in bytes: // Measured: `510` // Estimated: `3675` - // Minimum execution time: 31_243_000 picoseconds. - Weight::from_parts(31_909_000, 3675) + // Minimum execution time: 29_599_000 picoseconds. + Weight::from_parts(30_919_000, 3675) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } - /// Storage: Assets Asset (r:1 w:0) - /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) - /// Storage: Assets Account (r:1 w:1) - /// Proof: Assets Account (max_values: None, max_size: Some(134), added: 2609, mode: MaxEncodedLen) + /// Storage: `Assets::Asset` (r:1 w:0) + /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) + /// Storage: `Assets::Account` (r:1 w:1) + /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) fn block() -> Weight { // Proof Size summary in bytes: // Measured: `459` // Estimated: `3675` - // Minimum execution time: 17_692_000 picoseconds. - Weight::from_parts(18_253_000, 3675) + // Minimum execution time: 15_741_000 picoseconds. + Weight::from_parts(16_558_000, 3675) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } diff --git a/substrate/frame/atomic-swap/Cargo.toml b/substrate/frame/atomic-swap/Cargo.toml index 0283af1d1b06234479cb9f0ad3fe142ba386ccf1..c641071df902d0fa78f4794292bacd824f9712bb 100644 --- a/substrate/frame/atomic-swap/Cargo.toml +++ b/substrate/frame/atomic-swap/Cargo.toml @@ -17,7 +17,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } frame-support = { path = "../support", default-features = false } frame-system = { path = "../system", default-features = false } sp-core = { path = "../../primitives/core", default-features = false } diff --git a/substrate/frame/atomic-swap/src/lib.rs b/substrate/frame/atomic-swap/src/lib.rs index 8094c06030120c9a7583aed3f64dc2a5de7260d4..609903e67e3e56f7016a20772a996a41705839d7 100644 --- a/substrate/frame/atomic-swap/src/lib.rs +++ b/substrate/frame/atomic-swap/src/lib.rs @@ -43,6 +43,10 @@ mod tests; use codec::{Decode, Encode}; +use core::{ + marker::PhantomData, + ops::{Deref, DerefMut}, +}; use frame_support::{ dispatch::DispatchResult, pallet_prelude::MaxEncodedLen, @@ -54,11 +58,6 @@ use frame_system::pallet_prelude::BlockNumberFor; use scale_info::TypeInfo; use sp_io::hashing::blake2_256; use sp_runtime::RuntimeDebug; -use sp_std::{ - marker::PhantomData, - ops::{Deref, DerefMut}, - prelude::*, -}; /// Pending atomic swap operation. #[derive(Clone, Eq, PartialEq, RuntimeDebugNoBound, Encode, Decode, TypeInfo, MaxEncodedLen)] diff --git a/substrate/frame/atomic-swap/src/tests.rs b/substrate/frame/atomic-swap/src/tests.rs index 4a4b96f7aae05a874bc662848135fad1380e49c3..9f51f04208aaccca281398b0382718f2165d8a0e 100644 --- a/substrate/frame/atomic-swap/src/tests.rs +++ b/substrate/frame/atomic-swap/src/tests.rs @@ -24,11 +24,7 @@ use frame_support::{ derive_impl, traits::{ConstU32, ConstU64}, }; -use sp_core::H256; -use sp_runtime::{ - traits::{BlakeTwo256, IdentityLookup}, - BuildStorage, -}; +use sp_runtime::BuildStorage; type Block = frame_system::mocking::MockBlock; @@ -41,31 +37,10 @@ frame_support::construct_runtime!( } ); -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { - type BaseCallFilter = frame_support::traits::Everything; - type BlockWeights = (); - type BlockLength = (); - type DbWeight = (); - type RuntimeOrigin = RuntimeOrigin; - type Nonce = u64; - type Hash = H256; - type RuntimeCall = RuntimeCall; - type Hashing = BlakeTwo256; - type AccountId = u64; - type Lookup = IdentityLookup; type Block = Block; - type RuntimeEvent = RuntimeEvent; - type BlockHashCount = ConstU64<250>; - type Version = (); - type PalletInfo = PalletInfo; type AccountData = pallet_balances::AccountData; - type OnNewAccount = (); - type OnKilledAccount = (); - type SystemWeightInfo = (); - type SS58Prefix = (); - type OnSetCode = (); - type MaxConsumers = frame_support::traits::ConstU32<16>; } impl pallet_balances::Config for Test { diff --git a/substrate/frame/aura/Cargo.toml b/substrate/frame/aura/Cargo.toml index 7620d172ffc98934b066558a7399d4ff3a163985..92ff3a0c56589d204cabe9770281f34d30f1eca9 100644 --- a/substrate/frame/aura/Cargo.toml +++ b/substrate/frame/aura/Cargo.toml @@ -17,8 +17,8 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive", "max-encoded-len"] } -log = { version = "0.4.17", default-features = false } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +log = { workspace = true } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } frame-support = { path = "../support", default-features = false } frame-system = { path = "../system", default-features = false } pallet-timestamp = { path = "../timestamp", default-features = false } @@ -53,4 +53,3 @@ try-runtime = [ "pallet-timestamp/try-runtime", "sp-runtime/try-runtime", ] -experimental = [] diff --git a/substrate/frame/aura/src/lib.rs b/substrate/frame/aura/src/lib.rs index f7506db05d1d82f32a4ec27a20096bb2aaf7548a..3ca1444aaae9b61511a33ed6a9dc9075a2e8c864 100644 --- a/substrate/frame/aura/src/lib.rs +++ b/substrate/frame/aura/src/lib.rs @@ -66,9 +66,6 @@ const LOG_TARGET: &str = "runtime::aura"; /// /// This was the default behavior of the Aura pallet and may be used for /// backwards compatibility. -/// -/// Note that this type is likely not useful without the `experimental` -/// feature. pub struct MinimumPeriodTimesTwo(sp_std::marker::PhantomData); impl Get for MinimumPeriodTimesTwo { @@ -117,10 +114,7 @@ pub mod pallet { /// The effective value of this type should not change while the chain is running. /// /// For backwards compatibility either use [`MinimumPeriodTimesTwo`] or a const. - /// - /// This associated type is only present when compiled with the `experimental` - /// feature. - #[cfg(feature = "experimental")] + #[pallet::constant] type SlotDuration: Get<::Moment>; } @@ -168,16 +162,14 @@ pub mod pallet { /// The current authority set. #[pallet::storage] - #[pallet::getter(fn authorities)] - pub(super) type Authorities = + pub type Authorities = StorageValue<_, BoundedVec, ValueQuery>; /// The current slot of this block. /// /// This will be set in `on_initialize`. #[pallet::storage] - #[pallet::getter(fn current_slot)] - pub(super) type CurrentSlot = StorageValue<_, Slot, ValueQuery>; + pub type CurrentSlot = StorageValue<_, Slot, ValueQuery>; #[pallet::genesis_config] #[derive(frame_support::DefaultNoBound)] @@ -250,17 +242,7 @@ impl Pallet { /// Determine the Aura slot-duration based on the Timestamp module configuration. pub fn slot_duration() -> T::Moment { - #[cfg(feature = "experimental")] - { - T::SlotDuration::get() - } - - #[cfg(not(feature = "experimental"))] - { - // we double the minimum block-period so each author can always propose within - // the majority of its slot. - ::MinimumPeriod::get().saturating_mul(2u32.into()) - } + T::SlotDuration::get() } /// Ensure the correctness of the state of this pallet. @@ -335,7 +317,7 @@ impl OneSessionHandler for Pallet { // instant changes if changed { let next_authorities = validators.map(|(_, k)| k).collect::>(); - let last_authorities = Self::authorities(); + let last_authorities = Authorities::::get(); if last_authorities != next_authorities { if next_authorities.len() as u32 > T::MaxAuthorities::get() { log::warn!( @@ -391,7 +373,7 @@ impl> FindAuthor { let i = Inner::find_author(digests)?; - let validators = >::authorities(); + let validators = Authorities::::get(); validators.get(i as usize).cloned() } } @@ -401,7 +383,7 @@ pub type AuraAuthorId = FindAccountFromAuthorIndex>; impl IsMember for Pallet { fn is_member(authority_id: &T::AuthorityId) -> bool { - Self::authorities().iter().any(|id| id == authority_id) + Authorities::::get().iter().any(|id| id == authority_id) } } diff --git a/substrate/frame/aura/src/migrations.rs b/substrate/frame/aura/src/migrations.rs index b45e4eb7cb5c866920a72601b5db4baa22d16d87..727fe281aa38430a5cd246d0dfba098c36d578e1 100644 --- a/substrate/frame/aura/src/migrations.rs +++ b/substrate/frame/aura/src/migrations.rs @@ -19,7 +19,7 @@ use frame_support::{pallet_prelude::*, traits::Get, weights::Weight}; -struct __LastTimestamp(sp_std::marker::PhantomData); +struct __LastTimestamp(core::marker::PhantomData); impl frame_support::traits::StorageInstance for __LastTimestamp { fn pallet_prefix() -> &'static str { T::PalletPrefix::get() diff --git a/substrate/frame/aura/src/mock.rs b/substrate/frame/aura/src/mock.rs index d87fea8fc81ebcc9ccb2fb03875a4c45959b7057..786e6e2efafb5186cbb0228476c0003c74245039 100644 --- a/substrate/frame/aura/src/mock.rs +++ b/substrate/frame/aura/src/mock.rs @@ -25,8 +25,7 @@ use frame_support::{ traits::{ConstU32, ConstU64, DisabledValidators}, }; use sp_consensus_aura::{ed25519::AuthorityId, AuthorityIndex}; -use sp_core::H256; -use sp_runtime::{testing::UintAuthorityId, traits::IdentityLookup, BuildStorage}; +use sp_runtime::{testing::UintAuthorityId, BuildStorage}; type Block = frame_system::mocking::MockBlock; @@ -41,31 +40,9 @@ frame_support::construct_runtime!( } ); -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { - type BaseCallFilter = frame_support::traits::Everything; - type BlockWeights = (); - type BlockLength = (); - type DbWeight = (); - type RuntimeOrigin = RuntimeOrigin; - type Nonce = u64; - type RuntimeCall = RuntimeCall; - type Hash = H256; - type Hashing = ::sp_runtime::traits::BlakeTwo256; - type AccountId = u64; - type Lookup = IdentityLookup; type Block = Block; - type RuntimeEvent = RuntimeEvent; - type BlockHashCount = ConstU64<250>; - type Version = (); - type PalletInfo = PalletInfo; - type AccountData = (); - type OnNewAccount = (); - type OnKilledAccount = (); - type SystemWeightInfo = (); - type SS58Prefix = (); - type OnSetCode = (); - type MaxConsumers = frame_support::traits::ConstU32<16>; } impl pallet_timestamp::Config for Test { @@ -107,8 +84,6 @@ impl pallet_aura::Config for Test { type DisabledValidators = MockDisabledValidators; type MaxAuthorities = ConstU32<10>; type AllowMultipleBlocksPerSlot = AllowMultipleBlocksPerSlot; - - #[cfg(feature = "experimental")] type SlotDuration = ConstU64; } diff --git a/substrate/frame/aura/src/tests.rs b/substrate/frame/aura/src/tests.rs index b3a5e144fad8e300059159e61ad8412e84e38d2d..5374105a2f3b2f286e7ad9afa835a260d7a7520b 100644 --- a/substrate/frame/aura/src/tests.rs +++ b/substrate/frame/aura/src/tests.rs @@ -19,7 +19,8 @@ #![cfg(test)] -use crate::mock::{build_ext_and_execute_test, Aura, MockDisabledValidators, System}; +use super::pallet; +use crate::mock::{build_ext_and_execute_test, Aura, MockDisabledValidators, System, Test}; use codec::Encode; use frame_support::traits::OnInitialize; use sp_consensus_aura::{Slot, AURA_ENGINE_ID}; @@ -28,8 +29,8 @@ use sp_runtime::{Digest, DigestItem}; #[test] fn initial_values() { build_ext_and_execute_test(vec![0, 1, 2, 3], || { - assert_eq!(Aura::current_slot(), 0u64); - assert_eq!(Aura::authorities().len(), Aura::authorities_len()); + assert_eq!(pallet::CurrentSlot::::get(), 0u64); + assert_eq!(pallet::Authorities::::get().len(), Aura::authorities_len()); assert_eq!(Aura::authorities_len(), 4); }); } diff --git a/substrate/frame/authority-discovery/Cargo.toml b/substrate/frame/authority-discovery/Cargo.toml index 0922007e57e82df51d89500078b02164942b9f45..a7aba711a5686088241e4507e686683114641bf7 100644 --- a/substrate/frame/authority-discovery/Cargo.toml +++ b/substrate/frame/authority-discovery/Cargo.toml @@ -19,7 +19,7 @@ targets = ["x86_64-unknown-linux-gnu"] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = [ "derive", ] } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } frame-support = { path = "../support", default-features = false } frame-system = { path = "../system", default-features = false } pallet-session = { path = "../session", default-features = false, features = [ diff --git a/substrate/frame/authority-discovery/src/lib.rs b/substrate/frame/authority-discovery/src/lib.rs index 640c0c8759ebef6c390e9119fb1b96361bc34e25..ed9240d99e8d5bb2b814fe80e0211c601378651c 100644 --- a/substrate/frame/authority-discovery/src/lib.rs +++ b/substrate/frame/authority-discovery/src/lib.rs @@ -144,19 +144,21 @@ impl OneSessionHandler for Pallet { ); Keys::::put(bounded_keys); + } - let next_keys = queued_validators.map(|x| x.1).collect::>(); + // `changed` represents if queued_validators changed in the previous session not in the + // current one. + let next_keys = queued_validators.map(|x| x.1).collect::>(); - let next_bounded_keys = WeakBoundedVec::<_, T::MaxAuthorities>::force_from( - next_keys, - Some( - "Warning: The session has more queued validators than expected. \ - A runtime configuration adjustment may be needed.", - ), - ); + let next_bounded_keys = WeakBoundedVec::<_, T::MaxAuthorities>::force_from( + next_keys, + Some( + "Warning: The session has more queued validators than expected. \ + A runtime configuration adjustment may be needed.", + ), + ); - NextKeys::::put(next_bounded_keys); - } + NextKeys::::put(next_bounded_keys); } fn on_disabled(_i: u32) { @@ -168,13 +170,10 @@ impl OneSessionHandler for Pallet { mod tests { use super::*; use crate as pallet_authority_discovery; - use frame_support::{ - derive_impl, parameter_types, - traits::{ConstU32, ConstU64}, - }; + use frame_support::{derive_impl, parameter_types, traits::ConstU32}; use sp_application_crypto::Pair; use sp_authority_discovery::AuthorityPair; - use sp_core::{crypto::key_types, H256}; + use sp_core::crypto::key_types; use sp_io::TestExternalities; use sp_runtime::{ testing::UintAuthorityId, @@ -225,31 +224,11 @@ mod tests { pub const Offset: BlockNumber = 0; } - #[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] + #[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { - type BaseCallFilter = frame_support::traits::Everything; - type BlockWeights = (); - type BlockLength = (); - type DbWeight = (); - type RuntimeOrigin = RuntimeOrigin; - type Nonce = u64; - type RuntimeCall = RuntimeCall; - type Hash = H256; - type Hashing = ::sp_runtime::traits::BlakeTwo256; type AccountId = AuthorityId; type Lookup = IdentityLookup; type Block = Block; - type RuntimeEvent = RuntimeEvent; - type BlockHashCount = ConstU64<250>; - type Version = (); - type PalletInfo = PalletInfo; - type AccountData = (); - type OnNewAccount = (); - type OnKilledAccount = (); - type SystemWeightInfo = (); - type SS58Prefix = (); - type OnSetCode = (); - type MaxConsumers = ConstU32<16>; } pub struct TestSessionHandler; @@ -293,7 +272,7 @@ mod tests { .map(|id| (&account_id, id)) .collect::>(); - let mut third_authorities: Vec = vec![4, 5] + let third_authorities: Vec = vec![4, 5] .into_iter() .map(|i| AuthorityPair::from_seed_slice(vec![i; 32].as_ref()).unwrap().public()) .map(AuthorityId::from) @@ -305,6 +284,18 @@ mod tests { .map(|id| (&account_id, id)) .collect::>(); + let mut fourth_authorities: Vec = vec![6, 7] + .into_iter() + .map(|i| AuthorityPair::from_seed_slice(vec![i; 32].as_ref()).unwrap().public()) + .map(AuthorityId::from) + .collect(); + // Needed for `pallet_session::OneSessionHandler::on_new_session`. + let fourth_authorities_and_account_ids = fourth_authorities + .clone() + .into_iter() + .map(|id| (&account_id, id)) + .collect::>(); + // Build genesis. let mut t = frame_system::GenesisConfig::::default().build_storage().unwrap(); @@ -333,25 +324,33 @@ mod tests { third_authorities_and_account_ids.clone().into_iter(), ); let authorities_returned = AuthorityDiscovery::authorities(); + let mut first_and_third_authorities = first_authorities + .iter() + .chain(third_authorities.iter()) + .cloned() + .collect::>(); + first_and_third_authorities.sort(); + assert_eq!( - first_authorities, authorities_returned, + first_and_third_authorities, authorities_returned, "Expected authority set not to change as `changed` was set to false.", ); // When `changed` set to true, the authority set should be updated. AuthorityDiscovery::on_new_session( true, - second_authorities_and_account_ids.into_iter(), - third_authorities_and_account_ids.clone().into_iter(), + third_authorities_and_account_ids.into_iter(), + fourth_authorities_and_account_ids.clone().into_iter(), ); - let mut second_and_third_authorities = second_authorities + + let mut third_and_fourth_authorities = third_authorities .iter() - .chain(third_authorities.iter()) + .chain(fourth_authorities.iter()) .cloned() .collect::>(); - second_and_third_authorities.sort(); + third_and_fourth_authorities.sort(); assert_eq!( - second_and_third_authorities, + third_and_fourth_authorities, AuthorityDiscovery::authorities(), "Expected authority set to contain both the authorities of the new as well as the \ next session." @@ -360,12 +359,12 @@ mod tests { // With overlapping authority sets, `authorities()` should return a deduplicated set. AuthorityDiscovery::on_new_session( true, - third_authorities_and_account_ids.clone().into_iter(), - third_authorities_and_account_ids.clone().into_iter(), + fourth_authorities_and_account_ids.clone().into_iter(), + fourth_authorities_and_account_ids.clone().into_iter(), ); - third_authorities.sort(); + fourth_authorities.sort(); assert_eq!( - third_authorities, + fourth_authorities, AuthorityDiscovery::authorities(), "Expected authority set to be deduplicated." ); diff --git a/substrate/frame/authorship/Cargo.toml b/substrate/frame/authorship/Cargo.toml index 4b318f12519eacfbacbff9987b1490064b692b66..2bfd59a48e10e0cee249d62680e66d7ce426cc3f 100644 --- a/substrate/frame/authorship/Cargo.toml +++ b/substrate/frame/authorship/Cargo.toml @@ -20,7 +20,7 @@ codec = { package = "parity-scale-codec", version = "3.6.1", default-features = "derive", ] } impl-trait-for-tuples = "0.2.2" -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } frame-support = { path = "../support", default-features = false } frame-system = { path = "../system", default-features = false } sp-runtime = { path = "../../primitives/runtime", default-features = false } diff --git a/substrate/frame/authorship/src/lib.rs b/substrate/frame/authorship/src/lib.rs index 8b38a58d8e738d58dc0f7ff4565279034c3de099..d8f1baab23c8b11579c22a986dc65286f2e2508a 100644 --- a/substrate/frame/authorship/src/lib.rs +++ b/substrate/frame/authorship/src/lib.rs @@ -113,7 +113,7 @@ mod tests { } ); - #[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] + #[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { type Block = Block; } diff --git a/substrate/frame/babe/Cargo.toml b/substrate/frame/babe/Cargo.toml index 8f49faaa2d602bb9c8f8894e45f28d481adf2670..9f6ef2bc05ea18e96786bd59b697c0290fd2d398 100644 --- a/substrate/frame/babe/Cargo.toml +++ b/substrate/frame/babe/Cargo.toml @@ -17,8 +17,8 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } -log = { version = "0.4.17", default-features = false } -scale-info = { version = "2.10.0", default-features = false, features = ["derive", "serde"] } +log = { workspace = true } +scale-info = { version = "2.11.1", default-features = false, features = ["derive", "serde"] } frame-benchmarking = { path = "../benchmarking", default-features = false, optional = true } frame-support = { path = "../support", default-features = false } frame-system = { path = "../system", default-features = false } diff --git a/substrate/frame/babe/src/benchmarking.rs b/substrate/frame/babe/src/benchmarking.rs index 92f55665913e24b8f254cf0d1610bc87c737a6e4..6b0e31e84718f4311421eec18755d562c7b24db9 100644 --- a/substrate/frame/babe/src/benchmarking.rs +++ b/substrate/frame/babe/src/benchmarking.rs @@ -31,7 +31,7 @@ benchmarks! { // NOTE: generated with the test below `test_generate_equivocation_report_blob`. // the output is not deterministic since keys are generated randomly (and therefore // signature content changes). it should not affect the benchmark. - // with the current benchmark setup it is not possible to generate this programatically + // with the current benchmark setup it is not possible to generate this programmatically // from the benchmark setup. const EQUIVOCATION_PROOF_BLOB: [u8; 416] = [ 222, 241, 46, 66, 243, 228, 135, 233, 177, 64, 149, 170, 141, 92, 193, 106, 51, 73, 31, diff --git a/substrate/frame/babe/src/lib.rs b/substrate/frame/babe/src/lib.rs index a6e44390dbc534e15e3a1658513c6ce9fa25088e..686ba6ec2d6344cdd49cac44f352d5fd76c45c36 100644 --- a/substrate/frame/babe/src/lib.rs +++ b/substrate/frame/babe/src/lib.rs @@ -283,7 +283,7 @@ pub mod pallet { /// entropy was fixed (i.e. it was known to chain observers). Since epochs are defined in /// slots, which may be skipped, the block numbers may not line up with the slot numbers. #[pallet::storage] - pub(super) type EpochStart = + pub type EpochStart = StorageValue<_, (BlockNumberFor, BlockNumberFor), ValueQuery>; /// How late the current block is compared to its parent. @@ -323,7 +323,7 @@ pub mod pallet { #[pallet::genesis_config] pub struct GenesisConfig { pub authorities: Vec<(AuthorityId, BabeAuthorityWeight)>, - pub epoch_config: Option, + pub epoch_config: BabeEpochConfiguration, #[serde(skip)] pub _config: sp_std::marker::PhantomData, } @@ -333,9 +333,7 @@ pub mod pallet { fn build(&self) { SegmentIndex::::put(0); Pallet::::initialize_genesis_authorities(&self.authorities); - EpochConfig::::put( - self.epoch_config.clone().expect("epoch_config must not be None"), - ); + EpochConfig::::put(&self.epoch_config); } } diff --git a/substrate/frame/babe/src/mock.rs b/substrate/frame/babe/src/mock.rs index b693f4fce9bde662c8badee8f0e675648597ea58..ec54275278eb625d9648b9fd744a3f7aab0a646a 100644 --- a/substrate/frame/babe/src/mock.rs +++ b/substrate/frame/babe/src/mock.rs @@ -63,7 +63,7 @@ frame_support::construct_runtime!( } ); -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { type Block = Block; type AccountData = pallet_balances::AccountData; diff --git a/substrate/frame/babe/src/randomness.rs b/substrate/frame/babe/src/randomness.rs index d3d1bea2292da949dd1bac3aca20f6d33cb6d258..fd52981d2a1dd46c01e5706d1f8212b621c0b82c 100644 --- a/substrate/frame/babe/src/randomness.rs +++ b/substrate/frame/babe/src/randomness.rs @@ -51,7 +51,7 @@ use sp_runtime::traits::{Hash, One, Saturating}; /// /// Adversaries should not possess many block production slots towards the beginning or /// end of every epoch, but they possess some influence over when they possess more slots. -pub struct RandomnessFromTwoEpochsAgo(sp_std::marker::PhantomData); +pub struct RandomnessFromTwoEpochsAgo(core::marker::PhantomData); /// Randomness usable by on-chain code that **does not depend** upon finality and takes /// action based upon on-chain commitments made during the previous epoch. @@ -79,7 +79,7 @@ pub struct RandomnessFromTwoEpochsAgo(sp_std::marker::PhantomData); /// As an example usage, we determine parachain auctions ending times in Polkadot using /// `RandomnessFromOneEpochAgo` because it reduces bias from `ParentBlockRandomness` and /// does not require the extra finality delay of `RandomnessFromTwoEpochsAgo`. -pub struct RandomnessFromOneEpochAgo(sp_std::marker::PhantomData); +pub struct RandomnessFromOneEpochAgo(core::marker::PhantomData); /// Randomness produced semi-freshly with each block, but inherits limitations of /// `RandomnessFromTwoEpochsAgo` from which it derives. @@ -119,7 +119,7 @@ pub struct RandomnessFromOneEpochAgo(sp_std::marker::PhantomData); /// instead you are using this randomness externally, i.e. after block execution, then /// this randomness will be provided by the "current" block (this stems from the fact that /// we process VRF outputs on block execution finalization, i.e. `on_finalize`). -pub struct ParentBlockRandomness(sp_std::marker::PhantomData); +pub struct ParentBlockRandomness(core::marker::PhantomData); /// Randomness produced semi-freshly with each block, but inherits limitations of /// `RandomnessFromTwoEpochsAgo` from which it derives. @@ -128,7 +128,7 @@ pub struct ParentBlockRandomness(sp_std::marker::PhantomData); #[deprecated(note = "Should not be relied upon for correctness, \ will not provide fresh randomness for the current block. \ Please use `ParentBlockRandomness` instead.")] -pub struct CurrentBlockRandomness(sp_std::marker::PhantomData); +pub struct CurrentBlockRandomness(core::marker::PhantomData); impl RandomnessT> for RandomnessFromTwoEpochsAgo { fn random(subject: &[u8]) -> (T::Hash, BlockNumberFor) { diff --git a/substrate/frame/bags-list/Cargo.toml b/substrate/frame/bags-list/Cargo.toml index b8ab099a0694220b933758fbd96a6635216d572f..5deb504d0a4f2846748bd0fb4970cfbfdde41733 100644 --- a/substrate/frame/bags-list/Cargo.toml +++ b/substrate/frame/bags-list/Cargo.toml @@ -19,7 +19,7 @@ targets = ["x86_64-unknown-linux-gnu"] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = [ "derive", ] } -scale-info = { version = "2.10.0", default-features = false, features = [ +scale-info = { version = "2.11.1", default-features = false, features = [ "derive", ] } @@ -33,8 +33,8 @@ frame-system = { path = "../system", default-features = false } frame-election-provider-support = { path = "../election-provider-support", default-features = false } # third party -log = { version = "0.4.17", default-features = false } -docify = "0.2.7" +log = { workspace = true } +docify = "0.2.8" aquamarine = { version = "0.5.0" } # Optional imports for benchmarking diff --git a/substrate/frame/bags-list/remote-tests/Cargo.toml b/substrate/frame/bags-list/remote-tests/Cargo.toml index fb61a9867783a32084dc363f6ac18c76ed4f3e10..266355f5cabe19214643db024e641339acd60630 100644 --- a/substrate/frame/bags-list/remote-tests/Cargo.toml +++ b/substrate/frame/bags-list/remote-tests/Cargo.toml @@ -34,4 +34,4 @@ sp-std = { path = "../../../primitives/std" } remote-externalities = { package = "frame-remote-externalities", path = "../../../utils/frame/remote-externalities" } # others -log = "0.4.17" +log = { workspace = true, default-features = true } diff --git a/substrate/frame/bags-list/src/list/tests.rs b/substrate/frame/bags-list/src/list/tests.rs index fd4ad8f893af38aa29fe0573eb4c22d13be97037..cd39b083172670f0f8f7450ffc546b6fda187313 100644 --- a/substrate/frame/bags-list/src/list/tests.rs +++ b/substrate/frame/bags-list/src/list/tests.rs @@ -431,7 +431,7 @@ mod list { #[test] fn insert_at_unchecked_at_is_only_node() { // Note that this `insert_at_unchecked` test should fail post checks because node 42 does - // not get re-assigned the correct bagu pper. This is because `insert_at_unchecked` assumes + // not get re-assigned the correct bag upper. This is because `insert_at_unchecked` assumes // both nodes are already in the same bag with the correct bag upper. ExtBuilder::default().build_and_execute_no_post_check(|| { // given diff --git a/substrate/frame/bags-list/src/mock.rs b/substrate/frame/bags-list/src/mock.rs index 4282120983b1b366ef392eb1d6992876d0722ab8..ea677cb9e73e37b36cee813b372efe809b47375d 100644 --- a/substrate/frame/bags-list/src/mock.rs +++ b/substrate/frame/bags-list/src/mock.rs @@ -48,7 +48,7 @@ impl frame_election_provider_support::ScoreProvider for StakingMock { } } -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Runtime { type Block = Block; type AccountData = pallet_balances::AccountData; diff --git a/substrate/frame/bags-list/src/weights.rs b/substrate/frame/bags-list/src/weights.rs index d929c6bb95963c3eaee8ce0d16b127adcb64956e..8a5424881e97b2ebdb43de8a5d406d253098535b 100644 --- a/substrate/frame/bags-list/src/weights.rs +++ b/substrate/frame/bags-list/src/weights.rs @@ -15,16 +15,16 @@ // See the License for the specific language governing permissions and // limitations under the License. -//! Autogenerated weights for pallet_bags_list +//! Autogenerated weights for `pallet_bags_list` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-06-16, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-04-08, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-e8ezs4ez-project-145-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("dev"), DB CACHE: 1024 +//! HOSTNAME: `runner-anb7yjbi-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: `1024` // Executed Command: -// ./target/production/substrate +// ./target/production/substrate-node // benchmark // pallet // --chain=dev @@ -35,12 +35,11 @@ // --no-median-slopes // --no-min-squares // --extrinsic=* -// --execution=wasm // --wasm-execution=compiled // --heap-pages=4096 -// --output=./frame/bags-list/src/weights.rs -// --header=./HEADER-APACHE2 -// --template=./.maintain/frame-weight-template.hbs +// --output=./substrate/frame/bags-list/src/weights.rs +// --header=./substrate/HEADER-APACHE2 +// --template=./substrate/.maintain/frame-weight-template.hbs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -50,123 +49,123 @@ use frame_support::{traits::Get, weights::{Weight, constants::RocksDbWeight}}; use core::marker::PhantomData; -/// Weight functions needed for pallet_bags_list. +/// Weight functions needed for `pallet_bags_list`. pub trait WeightInfo { fn rebag_non_terminal() -> Weight; fn rebag_terminal() -> Weight; fn put_in_front_of() -> Weight; } -/// Weights for pallet_bags_list using the Substrate node and recommended hardware. +/// Weights for `pallet_bags_list` using the Substrate node and recommended hardware. pub struct SubstrateWeight(PhantomData); impl WeightInfo for SubstrateWeight { - /// Storage: Staking Bonded (r:1 w:0) - /// Proof: Staking Bonded (max_values: None, max_size: Some(72), added: 2547, mode: MaxEncodedLen) - /// Storage: Staking Ledger (r:1 w:0) - /// Proof: Staking Ledger (max_values: None, max_size: Some(1091), added: 3566, mode: MaxEncodedLen) - /// Storage: VoterList ListNodes (r:4 w:4) - /// Proof: VoterList ListNodes (max_values: None, max_size: Some(154), added: 2629, mode: MaxEncodedLen) - /// Storage: VoterList ListBags (r:1 w:1) - /// Proof: VoterList ListBags (max_values: None, max_size: Some(82), added: 2557, mode: MaxEncodedLen) + /// Storage: `Staking::Bonded` (r:1 w:0) + /// Proof: `Staking::Bonded` (`max_values`: None, `max_size`: Some(72), added: 2547, mode: `MaxEncodedLen`) + /// Storage: `Staking::Ledger` (r:1 w:0) + /// Proof: `Staking::Ledger` (`max_values`: None, `max_size`: Some(1091), added: 3566, mode: `MaxEncodedLen`) + /// Storage: `VoterList::ListNodes` (r:4 w:4) + /// Proof: `VoterList::ListNodes` (`max_values`: None, `max_size`: Some(154), added: 2629, mode: `MaxEncodedLen`) + /// Storage: `VoterList::ListBags` (r:1 w:1) + /// Proof: `VoterList::ListBags` (`max_values`: None, `max_size`: Some(82), added: 2557, mode: `MaxEncodedLen`) fn rebag_non_terminal() -> Weight { // Proof Size summary in bytes: - // Measured: `1724` + // Measured: `1719` // Estimated: `11506` - // Minimum execution time: 62_137_000 picoseconds. - Weight::from_parts(64_050_000, 11506) + // Minimum execution time: 60_062_000 picoseconds. + Weight::from_parts(62_341_000, 11506) .saturating_add(T::DbWeight::get().reads(7_u64)) .saturating_add(T::DbWeight::get().writes(5_u64)) } - /// Storage: Staking Bonded (r:1 w:0) - /// Proof: Staking Bonded (max_values: None, max_size: Some(72), added: 2547, mode: MaxEncodedLen) - /// Storage: Staking Ledger (r:1 w:0) - /// Proof: Staking Ledger (max_values: None, max_size: Some(1091), added: 3566, mode: MaxEncodedLen) - /// Storage: VoterList ListNodes (r:3 w:3) - /// Proof: VoterList ListNodes (max_values: None, max_size: Some(154), added: 2629, mode: MaxEncodedLen) - /// Storage: VoterList ListBags (r:2 w:2) - /// Proof: VoterList ListBags (max_values: None, max_size: Some(82), added: 2557, mode: MaxEncodedLen) + /// Storage: `Staking::Bonded` (r:1 w:0) + /// Proof: `Staking::Bonded` (`max_values`: None, `max_size`: Some(72), added: 2547, mode: `MaxEncodedLen`) + /// Storage: `Staking::Ledger` (r:1 w:0) + /// Proof: `Staking::Ledger` (`max_values`: None, `max_size`: Some(1091), added: 3566, mode: `MaxEncodedLen`) + /// Storage: `VoterList::ListNodes` (r:3 w:3) + /// Proof: `VoterList::ListNodes` (`max_values`: None, `max_size`: Some(154), added: 2629, mode: `MaxEncodedLen`) + /// Storage: `VoterList::ListBags` (r:2 w:2) + /// Proof: `VoterList::ListBags` (`max_values`: None, `max_size`: Some(82), added: 2557, mode: `MaxEncodedLen`) fn rebag_terminal() -> Weight { // Proof Size summary in bytes: - // Measured: `1618` + // Measured: `1613` // Estimated: `8877` - // Minimum execution time: 60_880_000 picoseconds. - Weight::from_parts(62_078_000, 8877) + // Minimum execution time: 57_585_000 picoseconds. + Weight::from_parts(59_480_000, 8877) .saturating_add(T::DbWeight::get().reads(7_u64)) .saturating_add(T::DbWeight::get().writes(5_u64)) } - /// Storage: VoterList ListNodes (r:4 w:4) - /// Proof: VoterList ListNodes (max_values: None, max_size: Some(154), added: 2629, mode: MaxEncodedLen) - /// Storage: Staking Bonded (r:2 w:0) - /// Proof: Staking Bonded (max_values: None, max_size: Some(72), added: 2547, mode: MaxEncodedLen) - /// Storage: Staking Ledger (r:2 w:0) - /// Proof: Staking Ledger (max_values: None, max_size: Some(1091), added: 3566, mode: MaxEncodedLen) - /// Storage: VoterList CounterForListNodes (r:1 w:1) - /// Proof: VoterList CounterForListNodes (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: VoterList ListBags (r:1 w:1) - /// Proof: VoterList ListBags (max_values: None, max_size: Some(82), added: 2557, mode: MaxEncodedLen) + /// Storage: `VoterList::ListNodes` (r:4 w:4) + /// Proof: `VoterList::ListNodes` (`max_values`: None, `max_size`: Some(154), added: 2629, mode: `MaxEncodedLen`) + /// Storage: `Staking::Bonded` (r:2 w:0) + /// Proof: `Staking::Bonded` (`max_values`: None, `max_size`: Some(72), added: 2547, mode: `MaxEncodedLen`) + /// Storage: `Staking::Ledger` (r:2 w:0) + /// Proof: `Staking::Ledger` (`max_values`: None, `max_size`: Some(1091), added: 3566, mode: `MaxEncodedLen`) + /// Storage: `VoterList::CounterForListNodes` (r:1 w:1) + /// Proof: `VoterList::CounterForListNodes` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `VoterList::ListBags` (r:1 w:1) + /// Proof: `VoterList::ListBags` (`max_values`: None, `max_size`: Some(82), added: 2557, mode: `MaxEncodedLen`) fn put_in_front_of() -> Weight { // Proof Size summary in bytes: - // Measured: `1930` + // Measured: `1925` // Estimated: `11506` - // Minimum execution time: 68_911_000 picoseconds. - Weight::from_parts(70_592_000, 11506) + // Minimum execution time: 69_552_000 picoseconds. + Weight::from_parts(71_211_000, 11506) .saturating_add(T::DbWeight::get().reads(10_u64)) .saturating_add(T::DbWeight::get().writes(6_u64)) } } -// For backwards compatibility and tests +// For backwards compatibility and tests. impl WeightInfo for () { - /// Storage: Staking Bonded (r:1 w:0) - /// Proof: Staking Bonded (max_values: None, max_size: Some(72), added: 2547, mode: MaxEncodedLen) - /// Storage: Staking Ledger (r:1 w:0) - /// Proof: Staking Ledger (max_values: None, max_size: Some(1091), added: 3566, mode: MaxEncodedLen) - /// Storage: VoterList ListNodes (r:4 w:4) - /// Proof: VoterList ListNodes (max_values: None, max_size: Some(154), added: 2629, mode: MaxEncodedLen) - /// Storage: VoterList ListBags (r:1 w:1) - /// Proof: VoterList ListBags (max_values: None, max_size: Some(82), added: 2557, mode: MaxEncodedLen) + /// Storage: `Staking::Bonded` (r:1 w:0) + /// Proof: `Staking::Bonded` (`max_values`: None, `max_size`: Some(72), added: 2547, mode: `MaxEncodedLen`) + /// Storage: `Staking::Ledger` (r:1 w:0) + /// Proof: `Staking::Ledger` (`max_values`: None, `max_size`: Some(1091), added: 3566, mode: `MaxEncodedLen`) + /// Storage: `VoterList::ListNodes` (r:4 w:4) + /// Proof: `VoterList::ListNodes` (`max_values`: None, `max_size`: Some(154), added: 2629, mode: `MaxEncodedLen`) + /// Storage: `VoterList::ListBags` (r:1 w:1) + /// Proof: `VoterList::ListBags` (`max_values`: None, `max_size`: Some(82), added: 2557, mode: `MaxEncodedLen`) fn rebag_non_terminal() -> Weight { // Proof Size summary in bytes: - // Measured: `1724` + // Measured: `1719` // Estimated: `11506` - // Minimum execution time: 62_137_000 picoseconds. - Weight::from_parts(64_050_000, 11506) + // Minimum execution time: 60_062_000 picoseconds. + Weight::from_parts(62_341_000, 11506) .saturating_add(RocksDbWeight::get().reads(7_u64)) .saturating_add(RocksDbWeight::get().writes(5_u64)) } - /// Storage: Staking Bonded (r:1 w:0) - /// Proof: Staking Bonded (max_values: None, max_size: Some(72), added: 2547, mode: MaxEncodedLen) - /// Storage: Staking Ledger (r:1 w:0) - /// Proof: Staking Ledger (max_values: None, max_size: Some(1091), added: 3566, mode: MaxEncodedLen) - /// Storage: VoterList ListNodes (r:3 w:3) - /// Proof: VoterList ListNodes (max_values: None, max_size: Some(154), added: 2629, mode: MaxEncodedLen) - /// Storage: VoterList ListBags (r:2 w:2) - /// Proof: VoterList ListBags (max_values: None, max_size: Some(82), added: 2557, mode: MaxEncodedLen) + /// Storage: `Staking::Bonded` (r:1 w:0) + /// Proof: `Staking::Bonded` (`max_values`: None, `max_size`: Some(72), added: 2547, mode: `MaxEncodedLen`) + /// Storage: `Staking::Ledger` (r:1 w:0) + /// Proof: `Staking::Ledger` (`max_values`: None, `max_size`: Some(1091), added: 3566, mode: `MaxEncodedLen`) + /// Storage: `VoterList::ListNodes` (r:3 w:3) + /// Proof: `VoterList::ListNodes` (`max_values`: None, `max_size`: Some(154), added: 2629, mode: `MaxEncodedLen`) + /// Storage: `VoterList::ListBags` (r:2 w:2) + /// Proof: `VoterList::ListBags` (`max_values`: None, `max_size`: Some(82), added: 2557, mode: `MaxEncodedLen`) fn rebag_terminal() -> Weight { // Proof Size summary in bytes: - // Measured: `1618` + // Measured: `1613` // Estimated: `8877` - // Minimum execution time: 60_880_000 picoseconds. - Weight::from_parts(62_078_000, 8877) + // Minimum execution time: 57_585_000 picoseconds. + Weight::from_parts(59_480_000, 8877) .saturating_add(RocksDbWeight::get().reads(7_u64)) .saturating_add(RocksDbWeight::get().writes(5_u64)) } - /// Storage: VoterList ListNodes (r:4 w:4) - /// Proof: VoterList ListNodes (max_values: None, max_size: Some(154), added: 2629, mode: MaxEncodedLen) - /// Storage: Staking Bonded (r:2 w:0) - /// Proof: Staking Bonded (max_values: None, max_size: Some(72), added: 2547, mode: MaxEncodedLen) - /// Storage: Staking Ledger (r:2 w:0) - /// Proof: Staking Ledger (max_values: None, max_size: Some(1091), added: 3566, mode: MaxEncodedLen) - /// Storage: VoterList CounterForListNodes (r:1 w:1) - /// Proof: VoterList CounterForListNodes (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: VoterList ListBags (r:1 w:1) - /// Proof: VoterList ListBags (max_values: None, max_size: Some(82), added: 2557, mode: MaxEncodedLen) + /// Storage: `VoterList::ListNodes` (r:4 w:4) + /// Proof: `VoterList::ListNodes` (`max_values`: None, `max_size`: Some(154), added: 2629, mode: `MaxEncodedLen`) + /// Storage: `Staking::Bonded` (r:2 w:0) + /// Proof: `Staking::Bonded` (`max_values`: None, `max_size`: Some(72), added: 2547, mode: `MaxEncodedLen`) + /// Storage: `Staking::Ledger` (r:2 w:0) + /// Proof: `Staking::Ledger` (`max_values`: None, `max_size`: Some(1091), added: 3566, mode: `MaxEncodedLen`) + /// Storage: `VoterList::CounterForListNodes` (r:1 w:1) + /// Proof: `VoterList::CounterForListNodes` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `VoterList::ListBags` (r:1 w:1) + /// Proof: `VoterList::ListBags` (`max_values`: None, `max_size`: Some(82), added: 2557, mode: `MaxEncodedLen`) fn put_in_front_of() -> Weight { // Proof Size summary in bytes: - // Measured: `1930` + // Measured: `1925` // Estimated: `11506` - // Minimum execution time: 68_911_000 picoseconds. - Weight::from_parts(70_592_000, 11506) + // Minimum execution time: 69_552_000 picoseconds. + Weight::from_parts(71_211_000, 11506) .saturating_add(RocksDbWeight::get().reads(10_u64)) .saturating_add(RocksDbWeight::get().writes(6_u64)) } diff --git a/substrate/frame/balances/Cargo.toml b/substrate/frame/balances/Cargo.toml index e47e916a274de8074b58692e36df47610efb186b..28eabdaf5062b4c7250bb5a03dc64debb2f37a8c 100644 --- a/substrate/frame/balances/Cargo.toml +++ b/substrate/frame/balances/Cargo.toml @@ -17,14 +17,14 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive", "max-encoded-len"] } -log = { version = "0.4.17", default-features = false } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +log = { workspace = true } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } frame-benchmarking = { path = "../benchmarking", default-features = false, optional = true } frame-support = { path = "../support", default-features = false } frame-system = { path = "../system", default-features = false } sp-runtime = { path = "../../primitives/runtime", default-features = false } sp-std = { path = "../../primitives/std", default-features = false } -docify = "0.2.6" +docify = "0.2.8" [dev-dependencies] pallet-transaction-payment = { path = "../transaction-payment" } diff --git a/substrate/frame/balances/src/impl_currency.rs b/substrate/frame/balances/src/impl_currency.rs index 1ac882ade70dfb92df8ae5bbe3897fa7799ae53f..d5fe9934e239e9e4c513e9e021686eec3ca757c3 100644 --- a/substrate/frame/balances/src/impl_currency.rs +++ b/substrate/frame/balances/src/impl_currency.rs @@ -28,8 +28,8 @@ use frame_support::{ tokens::{fungible, BalanceStatus as Status, Fortitude::Polite, Precision::BestEffort}, Currency, DefensiveSaturating, ExistenceRequirement, ExistenceRequirement::AllowDeath, - Get, Imbalance, LockIdentifier, LockableCurrency, NamedReservableCurrency, - ReservableCurrency, SignedImbalance, TryDrop, WithdrawReasons, + Get, Imbalance, InspectLockableCurrency, LockIdentifier, LockableCurrency, + NamedReservableCurrency, ReservableCurrency, SignedImbalance, TryDrop, WithdrawReasons, }, }; use frame_system::pallet_prelude::BlockNumberFor; @@ -918,3 +918,12 @@ where Self::update_locks(who, &locks[..]); } } + +impl, I: 'static> InspectLockableCurrency for Pallet { + fn balance_locked(id: LockIdentifier, who: &T::AccountId) -> Self::Balance { + Self::locks(who) + .into_iter() + .filter(|l| l.id == id) + .fold(Zero::zero(), |acc, l| acc + l.amount) + } +} diff --git a/substrate/frame/balances/src/lib.rs b/substrate/frame/balances/src/lib.rs index 7dd087eabd6343df653905856c078d3f6f2a3908..685b12499ac0ffb2a27d3f861232ab3dc09bf08f 100644 --- a/substrate/frame/balances/src/lib.rs +++ b/substrate/frame/balances/src/lib.rs @@ -17,11 +17,15 @@ //! # Balances Pallet //! -//! The Balances pallet provides functionality for handling accounts and balances. +//! The Balances pallet provides functionality for handling accounts and balances for a single +//! token. //! -//! - [`Config`] -//! - [`Call`] -//! - [`Pallet`] +//! It makes heavy use of concepts such as Holds and Freezes from the +//! [`frame_support::traits::fungible`] traits, therefore you should read and understand those docs +//! as a prerequisite to understanding this pallet. +//! +//! Also see the [`frame_tokens`] reference docs for higher level information regarding the +//! place of this palet in FRAME. //! //! ## Overview //! @@ -38,42 +42,30 @@ //! //! ### Terminology //! -//! - **Existential Deposit:** The minimum balance required to create or keep an account open. This -//! prevents "dust accounts" from filling storage. When the free plus the reserved balance (i.e. -//! the total balance) fall below this, then the account is said to be dead; and it loses its -//! functionality as well as any prior history and all information on it is removed from the -//! chain's state. No account should ever have a total balance that is strictly between 0 and the -//! existential deposit (exclusive). If this ever happens, it indicates either a bug in this -//! pallet or an erroneous raw mutation of storage. -//! -//! - **Total Issuance:** The total number of units in existence in a system. -//! //! - **Reaping an account:** The act of removing an account by resetting its nonce. Happens after -//! its total balance has become zero (or, strictly speaking, less than the Existential Deposit). -//! -//! - **Free Balance:** The portion of a balance that is not reserved. The free balance is the only -//! balance that matters for most operations. +//! its total balance has become less than the Existential Deposit. //! -//! - **Reserved Balance:** Reserved balance still belongs to the account holder, but is suspended. -//! Reserved balance can still be slashed, but only after all the free balance has been slashed. -//! -//! - **Imbalance:** A condition when some funds were credited or debited without equal and opposite -//! accounting (i.e. a difference between total issuance and account balances). Functions that -//! result in an imbalance will return an object of the `Imbalance` trait that can be managed within -//! your runtime logic. (If an imbalance is simply dropped, it should automatically maintain any -//! book-keeping such as total issuance.) +//! ### Implementations //! -//! - **Lock:** A freeze on a specified amount of an account's free balance until a specified block -//! number. Multiple locks always operate over the same funds, so they "overlay" rather than -//! "stack". +//! The Balances pallet provides implementations for the following [`fungible`] traits. If these +//! traits provide the functionality that you need, then you should avoid tight coupling with the +//! Balances pallet. //! -//! ### Implementations +//! - [`fungible::Inspect`] +//! - [`fungible::Mutate`] +//! - [`fungible::Unbalanced`] +//! - [`fungible::Balanced`] +//! - [`fungible::BalancedHold`] +//! - [`fungible::InspectHold`] +//! - [`fungible::MutateHold`] +//! - [`fungible::InspectFreeze`] +//! - [`fungible::MutateFreeze`] +//! - [`fungible::Imbalance`] //! -//! The Balances pallet provides implementations for the following traits. If these traits provide -//! the functionality that you need, then you can avoid coupling with the Balances pallet. +//! It also implements the following [`Currency`] related traits, however they are deprecated and +//! will eventually be removed. //! -//! - [`Currency`]: Functions for dealing with a -//! fungible assets system. +//! - [`Currency`]: Functions for dealing with a fungible assets system. //! - [`ReservableCurrency`] //! - [`NamedReservableCurrency`](frame_support::traits::NamedReservableCurrency): //! Functions for dealing with assets that can be reserved from an account. @@ -83,14 +75,6 @@ //! imbalances between total issuance in the system and account balances. Must be used when a //! function creates new funds (e.g. a reward) or destroys some funds (e.g. a system fee). //! -//! ## Interface -//! -//! ### Dispatchable Functions -//! -//! - `transfer_allow_death` - Transfer some liquid free balance to another account. -//! - `force_set_balance` - Set the balances of a given account. The origin of this call must be -//! root. -//! //! ## Usage //! //! The following examples show how to use the Balances pallet in your custom pallet. @@ -151,8 +135,11 @@ //! * Total issued balanced of all accounts should be less than `Config::Balance::max_value()`. //! * Existential Deposit is set to a value greater than zero. //! -//! Note, you may find the Balances pallet still functions with an ED of zero in some circumstances, -//! however this is not a configuration which is generally supported, nor will it be. +//! Note, you may find the Balances pallet still functions with an ED of zero when the +//! `insecure_zero_ed` cargo feature is enabled. However this is not a configuration which is +//! generally supported, nor will it be. +//! +//! [`frame_tokens`]: ../polkadot_sdk_docs/reference_docs/frame_tokens/index.html #![cfg_attr(not(feature = "std"), no_std)] mod benchmarking; @@ -219,7 +206,7 @@ pub mod pallet { pub struct TestDefaultConfig; - #[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig, no_aggregated_types)] + #[derive_impl(frame_system::config_preludes::TestDefaultConfig, no_aggregated_types)] impl frame_system::DefaultConfig for TestDefaultConfig {} #[frame_support::register_default_impl(TestDefaultConfig)] @@ -308,10 +295,14 @@ pub mod pallet { /// The maximum number of locks that should exist on an account. /// Not strictly enforced, but used for weight estimation. + /// + /// Use of locks is deprecated in favour of freezes. See `https://github.com/paritytech/substrate/pull/12951/` #[pallet::constant] type MaxLocks: Get; /// The maximum number of named reserves that can exist on an account. + /// + /// Use of reserves is deprecated in favour of holds. See `https://github.com/paritytech/substrate/pull/12951/` #[pallet::constant] type MaxReserves: Get; @@ -320,7 +311,7 @@ pub mod pallet { type MaxFreezes: Get; } - /// The current storage version. + /// The in-code storage version. const STORAGE_VERSION: frame_support::traits::StorageVersion = frame_support::traits::StorageVersion::new(1); @@ -455,6 +446,8 @@ pub mod pallet { /// Any liquidity locks on some account balances. /// NOTE: Should only be accessed when setting, changing and freeing a lock. + /// + /// Use of locks is deprecated in favour of freezes. See `https://github.com/paritytech/substrate/pull/12951/` #[pallet::storage] #[pallet::getter(fn locks)] pub type Locks, I: 'static = ()> = StorageMap< @@ -466,6 +459,8 @@ pub mod pallet { >; /// Named reserves on some account balances. + /// + /// Use of reserves is deprecated in favour of holds. See `https://github.com/paritytech/substrate/pull/12951/` #[pallet::storage] #[pallet::getter(fn reserves)] pub type Reserves, I: 'static = ()> = StorageMap< @@ -677,7 +672,7 @@ pub mod pallet { /// /// This will waive the transaction fee if at least all but 10% of the accounts needed to /// be upgraded. (We let some not have to be upgraded just in order to allow for the - /// possibililty of churn). + /// possibility of churn). #[pallet::call_index(6)] #[pallet::weight(T::WeightInfo::upgrade_accounts(who.len() as u32))] pub fn upgrade_accounts( @@ -905,14 +900,14 @@ pub mod pallet { Self::try_mutate_account(who, |a, _| -> Result { Ok(f(a)) }) } - /// Returns `true` when `who` has some providers or `insecure_zero_ed` feature is disnabled. + /// Returns `true` when `who` has some providers or `insecure_zero_ed` feature is disabled. /// Returns `false` otherwise. #[cfg(not(feature = "insecure_zero_ed"))] fn have_providers_or_no_zero_ed(_: &T::AccountId) -> bool { true } - /// Returns `true` when `who` has some providers or `insecure_zero_ed` feature is disnabled. + /// Returns `true` when `who` has some providers or `insecure_zero_ed` feature is disabled. /// Returns `false` otherwise. #[cfg(feature = "insecure_zero_ed")] fn have_providers_or_no_zero_ed(who: &T::AccountId) -> bool { diff --git a/substrate/frame/balances/src/migration.rs b/substrate/frame/balances/src/migration.rs index ba6819ec6e814da69807c8717a088df2451b6cb5..38d9c07ff7e002f6a7a57189b7ebce6830b52c75 100644 --- a/substrate/frame/balances/src/migration.rs +++ b/substrate/frame/balances/src/migration.rs @@ -22,9 +22,9 @@ use frame_support::{ }; fn migrate_v0_to_v1, I: 'static>(accounts: &[T::AccountId]) -> Weight { - let onchain_version = Pallet::::on_chain_storage_version(); + let on_chain_version = Pallet::::on_chain_storage_version(); - if onchain_version == 0 { + if on_chain_version == 0 { let total = accounts .iter() .map(|a| Pallet::::total_balance(a)) @@ -76,9 +76,9 @@ impl, A: Get>, I: 'static> OnRuntimeUpgrade pub struct ResetInactive(PhantomData<(T, I)>); impl, I: 'static> OnRuntimeUpgrade for ResetInactive { fn on_runtime_upgrade() -> Weight { - let onchain_version = Pallet::::on_chain_storage_version(); + let on_chain_version = Pallet::::on_chain_storage_version(); - if onchain_version == 1 { + if on_chain_version == 1 { // Remove the old `StorageVersion` type. frame_support::storage::unhashed::kill(&frame_support::storage::storage_prefix( Pallet::::name().as_bytes(), diff --git a/substrate/frame/balances/src/tests/currency_tests.rs b/substrate/frame/balances/src/tests/currency_tests.rs index 46a4c4caefc3d72ad45adf58243f3430344d4813..450b1a84aa878552cdd8e9bd38918099b7edb463 100644 --- a/substrate/frame/balances/src/tests/currency_tests.rs +++ b/substrate/frame/balances/src/tests/currency_tests.rs @@ -24,8 +24,8 @@ use frame_support::{ BalanceStatus::{Free, Reserved}, Currency, ExistenceRequirement::{self, AllowDeath, KeepAlive}, - Hooks, LockIdentifier, LockableCurrency, NamedReservableCurrency, ReservableCurrency, - WithdrawReasons, + Hooks, InspectLockableCurrency, LockIdentifier, LockableCurrency, NamedReservableCurrency, + ReservableCurrency, WithdrawReasons, }, StorageNoopGuard, }; @@ -88,6 +88,24 @@ fn basic_locking_should_work() { }); } +#[test] +fn inspect_lock_should_work() { + ExtBuilder::default() + .existential_deposit(1) + .monied(true) + .build_and_execute_with(|| { + Balances::set_lock(ID_1, &1, 10, WithdrawReasons::all()); + Balances::set_lock(ID_2, &1, 10, WithdrawReasons::all()); + Balances::set_lock(ID_1, &2, 20, WithdrawReasons::all()); + + assert_eq!(>::balance_locked(ID_1, &1), 10); + assert_eq!(>::balance_locked(ID_2, &1), 10); + assert_eq!(>::balance_locked(ID_1, &2), 20); + assert_eq!(>::balance_locked(ID_2, &2), 0); + assert_eq!(>::balance_locked(ID_1, &3), 0); + }) +} + #[test] fn account_should_be_reaped() { ExtBuilder::default() @@ -1024,7 +1042,7 @@ fn slash_consumed_slash_partial_works() { } #[test] -fn slash_on_non_existant_works() { +fn slash_on_non_existent_works() { ExtBuilder::default().existential_deposit(100).build_and_execute_with(|| { // Slash on non-existent account is okay. assert_eq!(Balances::slash(&12345, 1_300), (NegativeImbalance::new(0), 1300)); @@ -1071,7 +1089,7 @@ fn slash_reserved_overslash_does_not_touch_free_balance() { } #[test] -fn slash_reserved_on_non_existant_works() { +fn slash_reserved_on_non_existent_works() { ExtBuilder::default().existential_deposit(100).build_and_execute_with(|| { // Slash on non-existent account is okay. assert_eq!(Balances::slash_reserved(&12345, 1_300), (NegativeImbalance::new(0), 1300)); diff --git a/substrate/frame/balances/src/tests/mod.rs b/substrate/frame/balances/src/tests/mod.rs index 91452b292b56f90083c0f82aa3a1b361fb3d7baf..234fe6eaf2c3298183d55d646a8af6bad14153c1 100644 --- a/substrate/frame/balances/src/tests/mod.rs +++ b/substrate/frame/balances/src/tests/mod.rs @@ -26,18 +26,18 @@ use frame_support::{ dispatch::{DispatchInfo, GetDispatchInfo}, parameter_types, traits::{ - fungible, ConstU32, ConstU64, ConstU8, Imbalance as ImbalanceT, OnUnbalanced, - StorageMapShim, StoredMap, VariantCount, WhitelistedStorageKeys, + fungible, ConstU32, ConstU8, Imbalance as ImbalanceT, OnUnbalanced, StorageMapShim, + StoredMap, VariantCount, WhitelistedStorageKeys, }, weights::{IdentityFee, Weight}, }; use frame_system::{self as system, RawOrigin}; -use pallet_transaction_payment::{ChargeTransactionPayment, CurrencyAdapter, Multiplier}; +use pallet_transaction_payment::{ChargeTransactionPayment, FungibleAdapter, Multiplier}; use scale_info::TypeInfo; -use sp_core::{hexdisplay::HexDisplay, H256}; +use sp_core::hexdisplay::HexDisplay; use sp_io; use sp_runtime::{ - traits::{BadOrigin, IdentityLookup, SignedExtension, Zero}, + traits::{BadOrigin, SignedExtension, Zero}, ArithmeticError, BuildStorage, DispatchError, DispatchResult, FixedPointNumber, RuntimeDebug, TokenError, }; @@ -90,36 +90,16 @@ parameter_types! { pub static ExistentialDeposit: u64 = 1; } -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { - type BaseCallFilter = frame_support::traits::Everything; - type BlockWeights = BlockWeights; - type BlockLength = (); - type DbWeight = (); - type RuntimeOrigin = RuntimeOrigin; - type Nonce = u64; - type RuntimeCall = RuntimeCall; - type Hash = H256; - type Hashing = ::sp_runtime::traits::BlakeTwo256; - type AccountId = u64; - type Lookup = IdentityLookup; type Block = Block; - type RuntimeEvent = RuntimeEvent; - type BlockHashCount = ConstU64<250>; - type Version = (); - type PalletInfo = PalletInfo; type AccountData = super::AccountData; - type OnNewAccount = (); - type OnKilledAccount = (); - type SystemWeightInfo = (); - type SS58Prefix = (); - type OnSetCode = (); - type MaxConsumers = frame_support::traits::ConstU32<16>; } +#[derive_impl(pallet_transaction_payment::config_preludes::TestDefaultConfig)] impl pallet_transaction_payment::Config for Test { type RuntimeEvent = RuntimeEvent; - type OnChargeTransaction = CurrencyAdapter, ()>; + type OnChargeTransaction = FungibleAdapter, ()>; type OperationalFeeMultiplier = ConstU8<5>; type WeightToFee = IdentityFee; type LengthToFee = IdentityFee; diff --git a/substrate/frame/balances/src/tests/reentrancy_tests.rs b/substrate/frame/balances/src/tests/reentrancy_tests.rs index 1afbe82c7e2a7b2c9eec65e0ad2f34a23aa025a3..717f04978577f1d82f1c743cbac988a6820f90bc 100644 --- a/substrate/frame/balances/src/tests/reentrancy_tests.rs +++ b/substrate/frame/balances/src/tests/reentrancy_tests.rs @@ -44,7 +44,7 @@ fn transfer_dust_removal_tst1_should_work() { assert_eq!(Balances::free_balance(&2), 0); // As expected beneficiary account 3 - // received the transfered fund. + // received the transferred fund. assert_eq!(Balances::free_balance(&3), 450); // Dust balance is deposited to account 1 @@ -123,7 +123,7 @@ fn repatriating_reserved_balance_dust_removal_should_work() { // Reserve a value on account 2, // Such that free balance is lower than - // Exestintial deposit. + // Existential deposit. assert_ok!(Balances::transfer_allow_death(RuntimeOrigin::signed(2), 1, 450)); // Since free balance of account 2 is lower than diff --git a/substrate/frame/balances/src/weights.rs b/substrate/frame/balances/src/weights.rs index f875ea189ba1bce61b5fd6aec0c3aab54fb72bf2..f99fc45107614a96f223f4113e03ed6c6cab4041 100644 --- a/substrate/frame/balances/src/weights.rs +++ b/substrate/frame/balances/src/weights.rs @@ -17,26 +17,28 @@ //! Autogenerated weights for `pallet_balances` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2024-01-20, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-04-08, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-j8vvqcjr-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! HOSTNAME: `runner-anb7yjbi-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: `1024` // Executed Command: -// target/production/substrate-node +// ./target/production/substrate-node // benchmark // pallet +// --chain=dev // --steps=50 // --repeat=20 +// --pallet=pallet_balances +// --no-storage-info +// --no-median-slopes +// --no-min-squares // --extrinsic=* // --wasm-execution=compiled // --heap-pages=4096 -// --json-file=/builds/parity/mirrors/polkadot-sdk/.git/.artifacts/bench.json -// --pallet=pallet_balances -// --chain=dev -// --header=./substrate/HEADER-APACHE2 // --output=./substrate/frame/balances/src/weights.rs +// --header=./substrate/HEADER-APACHE2 // --template=./substrate/.maintain/frame-weight-template.hbs #![cfg_attr(rustfmt, rustfmt_skip)] @@ -69,8 +71,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 46_329_000 picoseconds. - Weight::from_parts(47_297_000, 3593) + // Minimum execution time: 50_062_000 picoseconds. + Weight::from_parts(51_214_000, 3593) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -80,8 +82,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 36_187_000 picoseconds. - Weight::from_parts(36_900_000, 3593) + // Minimum execution time: 39_700_000 picoseconds. + Weight::from_parts(40_754_000, 3593) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -91,8 +93,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `174` // Estimated: `3593` - // Minimum execution time: 13_498_000 picoseconds. - Weight::from_parts(14_143_000, 3593) + // Minimum execution time: 14_939_000 picoseconds. + Weight::from_parts(15_302_000, 3593) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -102,8 +104,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `174` // Estimated: `3593` - // Minimum execution time: 18_756_000 picoseconds. - Weight::from_parts(19_553_000, 3593) + // Minimum execution time: 20_516_000 picoseconds. + Weight::from_parts(21_179_000, 3593) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -113,8 +115,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `103` // Estimated: `6196` - // Minimum execution time: 47_826_000 picoseconds. - Weight::from_parts(48_834_000, 6196) + // Minimum execution time: 51_281_000 picoseconds. + Weight::from_parts(52_145_000, 6196) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } @@ -124,8 +126,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 44_621_000 picoseconds. - Weight::from_parts(45_151_000, 3593) + // Minimum execution time: 48_988_000 picoseconds. + Weight::from_parts(49_935_000, 3593) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -135,8 +137,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `174` // Estimated: `3593` - // Minimum execution time: 16_194_000 picoseconds. - Weight::from_parts(16_945_000, 3593) + // Minimum execution time: 17_594_000 picoseconds. + Weight::from_parts(18_232_000, 3593) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -147,10 +149,10 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `0 + u * (135 ±0)` // Estimated: `990 + u * (2603 ±0)` - // Minimum execution time: 15_782_000 picoseconds. - Weight::from_parts(16_118_000, 990) - // Standard Error: 10_499 - .saturating_add(Weight::from_parts(13_327_660, 0).saturating_mul(u.into())) + // Minimum execution time: 16_701_000 picoseconds. + Weight::from_parts(16_897_000, 990) + // Standard Error: 11_684 + .saturating_add(Weight::from_parts(14_375_201, 0).saturating_mul(u.into())) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(u.into()))) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(u.into()))) .saturating_add(Weight::from_parts(0, 2603).saturating_mul(u.into())) @@ -159,8 +161,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 6_157_000 picoseconds. - Weight::from_parts(6_507_000, 0) + // Minimum execution time: 6_692_000 picoseconds. + Weight::from_parts(7_140_000, 0) } } @@ -172,8 +174,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 46_329_000 picoseconds. - Weight::from_parts(47_297_000, 3593) + // Minimum execution time: 50_062_000 picoseconds. + Weight::from_parts(51_214_000, 3593) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -183,8 +185,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 36_187_000 picoseconds. - Weight::from_parts(36_900_000, 3593) + // Minimum execution time: 39_700_000 picoseconds. + Weight::from_parts(40_754_000, 3593) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -194,8 +196,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `174` // Estimated: `3593` - // Minimum execution time: 13_498_000 picoseconds. - Weight::from_parts(14_143_000, 3593) + // Minimum execution time: 14_939_000 picoseconds. + Weight::from_parts(15_302_000, 3593) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -205,8 +207,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `174` // Estimated: `3593` - // Minimum execution time: 18_756_000 picoseconds. - Weight::from_parts(19_553_000, 3593) + // Minimum execution time: 20_516_000 picoseconds. + Weight::from_parts(21_179_000, 3593) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -216,8 +218,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `103` // Estimated: `6196` - // Minimum execution time: 47_826_000 picoseconds. - Weight::from_parts(48_834_000, 6196) + // Minimum execution time: 51_281_000 picoseconds. + Weight::from_parts(52_145_000, 6196) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } @@ -227,8 +229,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 44_621_000 picoseconds. - Weight::from_parts(45_151_000, 3593) + // Minimum execution time: 48_988_000 picoseconds. + Weight::from_parts(49_935_000, 3593) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -238,8 +240,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `174` // Estimated: `3593` - // Minimum execution time: 16_194_000 picoseconds. - Weight::from_parts(16_945_000, 3593) + // Minimum execution time: 17_594_000 picoseconds. + Weight::from_parts(18_232_000, 3593) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -250,10 +252,10 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `0 + u * (135 ±0)` // Estimated: `990 + u * (2603 ±0)` - // Minimum execution time: 15_782_000 picoseconds. - Weight::from_parts(16_118_000, 990) - // Standard Error: 10_499 - .saturating_add(Weight::from_parts(13_327_660, 0).saturating_mul(u.into())) + // Minimum execution time: 16_701_000 picoseconds. + Weight::from_parts(16_897_000, 990) + // Standard Error: 11_684 + .saturating_add(Weight::from_parts(14_375_201, 0).saturating_mul(u.into())) .saturating_add(RocksDbWeight::get().reads((1_u64).saturating_mul(u.into()))) .saturating_add(RocksDbWeight::get().writes((1_u64).saturating_mul(u.into()))) .saturating_add(Weight::from_parts(0, 2603).saturating_mul(u.into())) @@ -262,7 +264,7 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 6_157_000 picoseconds. - Weight::from_parts(6_507_000, 0) + // Minimum execution time: 6_692_000 picoseconds. + Weight::from_parts(7_140_000, 0) } } diff --git a/substrate/frame/beefy-mmr/Cargo.toml b/substrate/frame/beefy-mmr/Cargo.toml index 250a6fb450ca730476ecdba5bc8d5e81a0490b62..8fcb8e1d559bea2c5082e49cc0002d15745639c0 100644 --- a/substrate/frame/beefy-mmr/Cargo.toml +++ b/substrate/frame/beefy-mmr/Cargo.toml @@ -14,9 +14,9 @@ workspace = true [dependencies] array-bytes = { version = "6.1", optional = true } codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } -log = { version = "0.4.17", default-features = false } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.195", optional = true } +log = { workspace = true } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +serde = { optional = true, workspace = true, default-features = true } binary-merkle-tree = { path = "../../utils/binary-merkle-tree", default-features = false } frame-support = { path = "../support", default-features = false } frame-system = { path = "../system", default-features = false } diff --git a/substrate/frame/beefy-mmr/src/lib.rs b/substrate/frame/beefy-mmr/src/lib.rs index fa3caba7977d31767253763aac1f1bbba5c7d67e..e423f1b342f2fc4faa9095c1cecf32556d0fd3cd 100644 --- a/substrate/frame/beefy-mmr/src/lib.rs +++ b/substrate/frame/beefy-mmr/src/lib.rs @@ -68,7 +68,7 @@ where ::BeefyId, >::MmrRoot(*root)), ); - >::deposit_log(digest); + frame_system::Pallet::::deposit_log(digest); } } @@ -126,7 +126,6 @@ pub mod pallet { /// Details of current BEEFY authority set. #[pallet::storage] - #[pallet::getter(fn beefy_authorities)] pub type BeefyAuthorities = StorageValue<_, BeefyAuthoritySet>, ValueQuery>; @@ -134,7 +133,6 @@ pub mod pallet { /// /// This storage entry is used as cache for calls to `update_beefy_next_authority_set`. #[pallet::storage] - #[pallet::getter(fn beefy_next_authorities)] pub type BeefyNextAuthorities = StorageValue<_, BeefyNextAuthoritySet>, ValueQuery>; } @@ -152,7 +150,7 @@ impl LeafDataProvider for Pallet { version: T::LeafVersion::get(), parent_number_and_hash: ParentNumberAndHash::::leaf_data(), leaf_extra: T::BeefyDataProvider::extra_data(), - beefy_next_authority_set: Pallet::::beefy_next_authorities(), + beefy_next_authority_set: BeefyNextAuthorities::::get(), } } } @@ -177,12 +175,12 @@ where impl Pallet { /// Return the currently active BEEFY authority set proof. pub fn authority_set_proof() -> BeefyAuthoritySet> { - Pallet::::beefy_authorities() + BeefyAuthorities::::get() } /// Return the next/queued BEEFY authority set proof. pub fn next_authority_set_proof() -> BeefyNextAuthoritySet> { - Pallet::::beefy_next_authorities() + BeefyNextAuthorities::::get() } /// Returns details of a BEEFY authority set. diff --git a/substrate/frame/beefy-mmr/src/mock.rs b/substrate/frame/beefy-mmr/src/mock.rs index 94149ac67765d79a378feb51d14c77649ea99bb0..9d1ece7a1d8ecf433f6d244e55fb1f6e6211e77e 100644 --- a/substrate/frame/beefy-mmr/src/mock.rs +++ b/substrate/frame/beefy-mmr/src/mock.rs @@ -57,7 +57,7 @@ construct_runtime!( } ); -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { type Block = Block; } diff --git a/substrate/frame/beefy-mmr/src/tests.rs b/substrate/frame/beefy-mmr/src/tests.rs index ec756f83dffa41b51245dea38affc3dda8b871b5..fac799bf64e430c0908602697cc8f97f0a8c76c6 100644 --- a/substrate/frame/beefy-mmr/src/tests.rs +++ b/substrate/frame/beefy-mmr/src/tests.rs @@ -107,7 +107,7 @@ fn should_contain_valid_leaf_data() { let mut ext = new_test_ext(vec![1, 2, 3, 4]); let parent_hash = ext.execute_with(|| { init_block(1); - >::parent_hash() + frame_system::Pallet::::parent_hash() }); let mmr_leaf = read_mmr_leaf(&mut ext, node_offchain_key(0, parent_hash)); @@ -132,7 +132,7 @@ fn should_contain_valid_leaf_data() { // build second block on top let parent_hash = ext.execute_with(|| { init_block(2); - >::parent_hash() + frame_system::Pallet::::parent_hash() }); let mmr_leaf = read_mmr_leaf(&mut ext, node_offchain_key(1, parent_hash)); diff --git a/substrate/frame/beefy/Cargo.toml b/substrate/frame/beefy/Cargo.toml index ba02cf1460d3ec32e8358169437ee0a2c93a5b39..f181f4d41cdcb2567654d21b0fefb88b507d6f69 100644 --- a/substrate/frame/beefy/Cargo.toml +++ b/substrate/frame/beefy/Cargo.toml @@ -13,9 +13,9 @@ workspace = true [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } -log = { version = "0.4.17", default-features = false } -scale-info = { version = "2.10.0", default-features = false, features = ["derive", "serde"] } -serde = { version = "1.0.195", optional = true } +log = { workspace = true } +scale-info = { version = "2.11.1", default-features = false, features = ["derive", "serde"] } +serde = { optional = true, workspace = true, default-features = true } frame-support = { path = "../support", default-features = false } frame-system = { path = "../system", default-features = false } pallet-authorship = { path = "../authorship", default-features = false } diff --git a/substrate/frame/beefy/src/equivocation.rs b/substrate/frame/beefy/src/equivocation.rs index 0a7ede327c9e672a6b455f724c6ed9852df21984..bbc6eae6af29d8b7beb41d903e6f9bf52af05763 100644 --- a/substrate/frame/beefy/src/equivocation.rs +++ b/substrate/frame/beefy/src/equivocation.rs @@ -190,7 +190,7 @@ where evidence: EquivocationEvidenceFor, ) -> Result<(), DispatchError> { let (equivocation_proof, key_owner_proof) = evidence; - let reporter = reporter.or_else(|| >::author()); + let reporter = reporter.or_else(|| pallet_authorship::Pallet::::author()); let offender = equivocation_proof.offender_id().clone(); // We check the equivocation within the context of its set id (and diff --git a/substrate/frame/beefy/src/lib.rs b/substrate/frame/beefy/src/lib.rs index 0760446753a688516a2c4ce75727ebb4b3cd06a8..09cd13ab70a4fc1089c794124fd8d7f6f24b7482 100644 --- a/substrate/frame/beefy/src/lib.rs +++ b/substrate/frame/beefy/src/lib.rs @@ -120,20 +120,17 @@ pub mod pallet { /// The current authorities set #[pallet::storage] - #[pallet::getter(fn authorities)] - pub(super) type Authorities = + pub type Authorities = StorageValue<_, BoundedVec, ValueQuery>; /// The current validator set id #[pallet::storage] - #[pallet::getter(fn validator_set_id)] - pub(super) type ValidatorSetId = + pub type ValidatorSetId = StorageValue<_, sp_consensus_beefy::ValidatorSetId, ValueQuery>; /// Authorities set scheduled to be used with the next session #[pallet::storage] - #[pallet::getter(fn next_authorities)] - pub(super) type NextAuthorities = + pub type NextAuthorities = StorageValue<_, BoundedVec, ValueQuery>; /// A mapping from BEEFY set ID to the index of the *most recent* session for which its @@ -147,17 +144,14 @@ pub mod pallet { /// /// TWOX-NOTE: `ValidatorSetId` is not under user control. #[pallet::storage] - #[pallet::getter(fn session_for_set)] - pub(super) type SetIdSession = + pub type SetIdSession = StorageMap<_, Twox64Concat, sp_consensus_beefy::ValidatorSetId, SessionIndex>; /// Block number where BEEFY consensus is enabled/started. /// By changing this (through privileged `set_new_genesis()`), BEEFY consensus is effectively /// restarted from the newly set block number. #[pallet::storage] - #[pallet::getter(fn genesis_block)] - pub(super) type GenesisBlock = - StorageValue<_, Option>, ValueQuery>; + pub type GenesisBlock = StorageValue<_, Option>, ValueQuery>; #[pallet::genesis_config] pub struct GenesisConfig { @@ -186,7 +180,7 @@ pub mod pallet { // we panic here as runtime maintainers can simply reconfigure genesis and restart // the chain easily .expect("Authorities vec too big"); - >::put(&self.genesis_block); + GenesisBlock::::put(&self.genesis_block); } } @@ -286,6 +280,14 @@ pub mod pallet { } } + #[pallet::hooks] + impl Hooks> for Pallet { + #[cfg(feature = "try-runtime")] + fn try_state(_n: BlockNumberFor) -> Result<(), sp_runtime::TryRuntimeError> { + Self::do_try_state() + } + } + #[pallet::validate_unsigned] impl ValidateUnsigned for Pallet { type Call = Call; @@ -300,11 +302,65 @@ pub mod pallet { } } +#[cfg(any(feature = "try-runtime", test))] +impl Pallet { + /// Ensure the correctness of the state of this pallet. + /// + /// This should be valid before or after each state transition of this pallet. + pub fn do_try_state() -> Result<(), sp_runtime::TryRuntimeError> { + Self::try_state_authorities()?; + Self::try_state_validators()?; + + Ok(()) + } + + /// # Invariants + /// + /// * `Authorities` should not exceed the `MaxAuthorities` capacity. + /// * `NextAuthorities` should not exceed the `MaxAuthorities` capacity. + fn try_state_authorities() -> Result<(), sp_runtime::TryRuntimeError> { + if let Some(authorities_len) = >::decode_len() { + ensure!( + authorities_len as u32 <= T::MaxAuthorities::get(), + "Authorities number exceeds what the pallet config allows." + ); + } else { + return Err(sp_runtime::TryRuntimeError::Other( + "Failed to decode length of authorities", + )); + } + + if let Some(next_authorities_len) = >::decode_len() { + ensure!( + next_authorities_len as u32 <= T::MaxAuthorities::get(), + "Next authorities number exceeds what the pallet config allows." + ); + } else { + return Err(sp_runtime::TryRuntimeError::Other( + "Failed to decode length of next authorities", + )); + } + Ok(()) + } + + /// # Invariants + /// + /// `ValidatorSetId` must be present in `SetIdSession` + fn try_state_validators() -> Result<(), sp_runtime::TryRuntimeError> { + let validator_set_id = >::get(); + ensure!( + SetIdSession::::get(validator_set_id).is_some(), + "Validator set id must be present in SetIdSession" + ); + Ok(()) + } +} + impl Pallet { /// Return the current active BEEFY validator set. pub fn validator_set() -> Option> { - let validators: BoundedVec = Self::authorities(); - let id: sp_consensus_beefy::ValidatorSetId = Self::validator_set_id(); + let validators: BoundedVec = Authorities::::get(); + let id: sp_consensus_beefy::ValidatorSetId = ValidatorSetId::::get(); ValidatorSet::::new(validators, id) } @@ -326,19 +382,19 @@ impl Pallet { new: BoundedVec, queued: BoundedVec, ) { - >::put(&new); + Authorities::::put(&new); - let new_id = Self::validator_set_id() + 1u64; - >::put(new_id); + let new_id = ValidatorSetId::::get() + 1u64; + ValidatorSetId::::put(new_id); - >::put(&queued); + NextAuthorities::::put(&queued); if let Some(validator_set) = ValidatorSet::::new(new, new_id) { let log = DigestItem::Consensus( BEEFY_ENGINE_ID, ConsensusLog::AuthoritiesChange(validator_set.clone()).encode(), ); - >::deposit_log(log); + frame_system::Pallet::::deposit_log(log); let next_id = new_id + 1; if let Some(next_validator_set) = ValidatorSet::::new(queued, next_id) { @@ -355,7 +411,7 @@ impl Pallet { return Ok(()) } - if !>::get().is_empty() { + if !Authorities::::get().is_empty() { return Err(()) } @@ -364,10 +420,10 @@ impl Pallet { .map_err(|_| ())?; let id = GENESIS_AUTHORITY_SET_ID; - >::put(bounded_authorities); - >::put(id); + Authorities::::put(bounded_authorities); + ValidatorSetId::::put(id); // Like `pallet_session`, initialize the next validator set as well. - >::put(bounded_authorities); + NextAuthorities::::put(bounded_authorities); if let Some(validator_set) = ValidatorSet::::new(authorities.clone(), id) { let next_id = id + 1; @@ -442,9 +498,9 @@ where // We want to have at least one BEEFY mandatory block per session. Self::change_authorities(bounded_next_authorities, bounded_next_queued_authorities); - let validator_set_id = Self::validator_set_id(); + let validator_set_id = ValidatorSetId::::get(); // Update the mapping for the new set id that corresponds to the latest session (i.e. now). - let session_index = >::current_index(); + let session_index = pallet_session::Pallet::::current_index(); SetIdSession::::insert(validator_set_id, &session_index); // Prune old entry if limit reached. let max_set_id_session_entries = T::MaxSetIdSessionEntries::get().max(1); @@ -459,13 +515,13 @@ where ConsensusLog::::OnDisabled(i as AuthorityIndex).encode(), ); - >::deposit_log(log); + frame_system::Pallet::::deposit_log(log); } } impl IsMember for Pallet { fn is_member(authority_id: &T::BeefyId) -> bool { - Self::authorities().iter().any(|id| id == authority_id) + Authorities::::get().iter().any(|id| id == authority_id) } } diff --git a/substrate/frame/beefy/src/mock.rs b/substrate/frame/beefy/src/mock.rs index 9cce479890a48f7753be76b809f13abc1baa045d..1c55adc8de4b7d87535367e1f934c9db171b4902 100644 --- a/substrate/frame/beefy/src/mock.rs +++ b/substrate/frame/beefy/src/mock.rs @@ -27,7 +27,6 @@ use frame_support::{ }; use pallet_session::historical as pallet_session_historical; use sp_core::{crypto::KeyTypeId, ConstU128}; -use sp_io::TestExternalities; use sp_runtime::{ app_crypto::ecdsa::Public, curve::PiecewiseLinear, impl_opaque_keys, testing::TestXt, traits::OpaqueKeys, BuildStorage, Perbill, @@ -62,7 +61,7 @@ construct_runtime!( } ); -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { type Block = Block; type AccountData = pallet_balances::AccountData; @@ -210,6 +209,73 @@ impl pallet_offences::Config for Test { type OnOffenceHandler = Staking; } +#[derive(Default)] +pub struct ExtBuilder { + authorities: Vec, +} + +impl ExtBuilder { + /// Add some AccountIds to insert into `List`. + #[cfg(test)] + pub(crate) fn add_authorities(mut self, ids: Vec) -> Self { + self.authorities = ids; + self + } + + pub fn build(self) -> sp_io::TestExternalities { + let mut t = frame_system::GenesisConfig::::default().build_storage().unwrap(); + + let balances: Vec<_> = + (0..self.authorities.len()).map(|i| (i as u64, 10_000_000)).collect(); + + pallet_balances::GenesisConfig:: { balances } + .assimilate_storage(&mut t) + .unwrap(); + + let session_keys: Vec<_> = self + .authorities + .iter() + .enumerate() + .map(|(i, k)| (i as u64, i as u64, MockSessionKeys { dummy: k.clone() })) + .collect(); + + BasicExternalities::execute_with_storage(&mut t, || { + for (ref id, ..) in &session_keys { + frame_system::Pallet::::inc_providers(id); + } + }); + + pallet_session::GenesisConfig:: { keys: session_keys } + .assimilate_storage(&mut t) + .unwrap(); + + // controllers are same as stash + let stakers: Vec<_> = (0..self.authorities.len()) + .map(|i| (i as u64, i as u64, 10_000, pallet_staking::StakerStatus::::Validator)) + .collect(); + + let staking_config = pallet_staking::GenesisConfig:: { + stakers, + validator_count: 2, + force_era: pallet_staking::Forcing::ForceNew, + minimum_validator_count: 0, + invulnerables: vec![], + ..Default::default() + }; + + staking_config.assimilate_storage(&mut t).unwrap(); + + t.into() + } + + pub fn build_and_execute(self, test: impl FnOnce() -> ()) { + self.build().execute_with(|| { + test(); + Beefy::do_try_state().expect("All invariants must hold after a test"); + }) + } +} + // Note, that we can't use `UintAuthorityId` here. Reason is that the implementation // of `to_public_key()` assumes, that a public key is 32 bytes long. This is true for // ed25519 and sr25519 but *not* for ecdsa. A compressed ecdsa public key is 33 bytes, @@ -226,54 +292,6 @@ pub fn mock_authorities(vec: Vec) -> Vec { vec.into_iter().map(|id| mock_beefy_id(id)).collect() } -pub fn new_test_ext(ids: Vec) -> TestExternalities { - new_test_ext_raw_authorities(mock_authorities(ids)) -} - -pub fn new_test_ext_raw_authorities(authorities: Vec) -> TestExternalities { - let mut t = frame_system::GenesisConfig::::default().build_storage().unwrap(); - - let balances: Vec<_> = (0..authorities.len()).map(|i| (i as u64, 10_000_000)).collect(); - - pallet_balances::GenesisConfig:: { balances } - .assimilate_storage(&mut t) - .unwrap(); - - let session_keys: Vec<_> = authorities - .iter() - .enumerate() - .map(|(i, k)| (i as u64, i as u64, MockSessionKeys { dummy: k.clone() })) - .collect(); - - BasicExternalities::execute_with_storage(&mut t, || { - for (ref id, ..) in &session_keys { - frame_system::Pallet::::inc_providers(id); - } - }); - - pallet_session::GenesisConfig:: { keys: session_keys } - .assimilate_storage(&mut t) - .unwrap(); - - // controllers are same as stash - let stakers: Vec<_> = (0..authorities.len()) - .map(|i| (i as u64, i as u64, 10_000, pallet_staking::StakerStatus::::Validator)) - .collect(); - - let staking_config = pallet_staking::GenesisConfig:: { - stakers, - validator_count: 2, - force_era: pallet_staking::Forcing::ForceNew, - minimum_validator_count: 0, - invulnerables: vec![], - ..Default::default() - }; - - staking_config.assimilate_storage(&mut t).unwrap(); - - t.into() -} - pub fn start_session(session_index: SessionIndex) { for i in Session::current_index()..session_index { System::on_finalize(System::block_number()); diff --git a/substrate/frame/beefy/src/tests.rs b/substrate/frame/beefy/src/tests.rs index bf5ae19510ce9320c7aac3b705db605db16ecebd..6a6aa245ce1f9051f7e310510c6110ce34f11bc9 100644 --- a/substrate/frame/beefy/src/tests.rs +++ b/substrate/frame/beefy/src/tests.rs @@ -15,23 +15,23 @@ // See the License for the specific language governing permissions and // limitations under the License. -use std::vec; - use codec::Encode; -use sp_consensus_beefy::{ - check_equivocation_proof, generate_equivocation_proof, known_payloads::MMR_ROOT_ID, - Keyring as BeefyKeyring, Payload, ValidatorSet, KEY_TYPE as BEEFY_KEY_TYPE, -}; - -use sp_runtime::DigestItem; +use std::vec; use frame_support::{ assert_err, assert_ok, dispatch::{GetDispatchInfo, Pays}, traits::{Currency, KeyOwnerProofSystem, OnInitialize}, }; +use sp_consensus_beefy::{ + check_equivocation_proof, + known_payloads::MMR_ROOT_ID, + test_utils::{generate_equivocation_proof, Keyring as BeefyKeyring}, + Payload, ValidatorSet, KEY_TYPE as BEEFY_KEY_TYPE, +}; +use sp_runtime::DigestItem; -use crate::{mock::*, Call, Config, Error, Weight, WeightInfo}; +use crate::{self as beefy, mock::*, Call, Config, Error, Weight, WeightInfo}; fn init_block(block: u64) { System::set_block_number(block); @@ -47,16 +47,16 @@ fn genesis_session_initializes_authorities() { let authorities = mock_authorities(vec![1, 2, 3, 4]); let want = authorities.clone(); - new_test_ext_raw_authorities(authorities).execute_with(|| { - let authorities = Beefy::authorities(); + ExtBuilder::default().add_authorities(authorities).build_and_execute(|| { + let authorities = beefy::Authorities::::get(); assert_eq!(authorities.len(), 4); assert_eq!(want[0], authorities[0]); assert_eq!(want[1], authorities[1]); - assert!(Beefy::validator_set_id() == 0); + assert!(beefy::ValidatorSetId::::get() == 0); - let next_authorities = Beefy::next_authorities(); + let next_authorities = beefy::NextAuthorities::::get(); assert_eq!(next_authorities.len(), 4); assert_eq!(want[0], next_authorities[0]); @@ -69,130 +69,140 @@ fn session_change_updates_authorities() { let authorities = mock_authorities(vec![1, 2, 3, 4]); let want_validators = authorities.clone(); - new_test_ext(vec![1, 2, 3, 4]).execute_with(|| { - assert!(0 == Beefy::validator_set_id()); + ExtBuilder::default() + .add_authorities(mock_authorities(vec![1, 2, 3, 4])) + .build_and_execute(|| { + assert!(0 == beefy::ValidatorSetId::::get()); - init_block(1); + init_block(1); - assert!(1 == Beefy::validator_set_id()); + assert!(1 == beefy::ValidatorSetId::::get()); - let want = beefy_log(ConsensusLog::AuthoritiesChange( - ValidatorSet::new(want_validators, 1).unwrap(), - )); + let want = beefy_log(ConsensusLog::AuthoritiesChange( + ValidatorSet::new(want_validators, 1).unwrap(), + )); - let log = System::digest().logs[0].clone(); - assert_eq!(want, log); + let log = System::digest().logs[0].clone(); + assert_eq!(want, log); - init_block(2); + init_block(2); - assert!(2 == Beefy::validator_set_id()); + assert!(2 == beefy::ValidatorSetId::::get()); - let want = beefy_log(ConsensusLog::AuthoritiesChange( - ValidatorSet::new(vec![mock_beefy_id(2), mock_beefy_id(4)], 2).unwrap(), - )); + let want = beefy_log(ConsensusLog::AuthoritiesChange( + ValidatorSet::new(vec![mock_beefy_id(2), mock_beefy_id(4)], 2).unwrap(), + )); - let log = System::digest().logs[1].clone(); - assert_eq!(want, log); - }); + let log = System::digest().logs[1].clone(); + assert_eq!(want, log); + }); } #[test] fn session_change_updates_next_authorities() { let want = vec![mock_beefy_id(1), mock_beefy_id(2), mock_beefy_id(3), mock_beefy_id(4)]; - new_test_ext(vec![1, 2, 3, 4]).execute_with(|| { - let next_authorities = Beefy::next_authorities(); + ExtBuilder::default() + .add_authorities(mock_authorities(vec![1, 2, 3, 4])) + .build_and_execute(|| { + let next_authorities = beefy::NextAuthorities::::get(); - assert_eq!(next_authorities.len(), 4); - assert_eq!(want[0], next_authorities[0]); - assert_eq!(want[1], next_authorities[1]); - assert_eq!(want[2], next_authorities[2]); - assert_eq!(want[3], next_authorities[3]); + assert_eq!(next_authorities.len(), 4); + assert_eq!(want[0], next_authorities[0]); + assert_eq!(want[1], next_authorities[1]); + assert_eq!(want[2], next_authorities[2]); + assert_eq!(want[3], next_authorities[3]); - init_block(1); + init_block(1); - let next_authorities = Beefy::next_authorities(); + let next_authorities = beefy::NextAuthorities::::get(); - assert_eq!(next_authorities.len(), 2); - assert_eq!(want[1], next_authorities[0]); - assert_eq!(want[3], next_authorities[1]); - }); + assert_eq!(next_authorities.len(), 2); + assert_eq!(want[1], next_authorities[0]); + assert_eq!(want[3], next_authorities[1]); + }); } #[test] fn validator_set_at_genesis() { let want = vec![mock_beefy_id(1), mock_beefy_id(2)]; - new_test_ext(vec![1, 2, 3, 4]).execute_with(|| { - let vs = Beefy::validator_set().unwrap(); + ExtBuilder::default() + .add_authorities(mock_authorities(vec![1, 2, 3, 4])) + .build_and_execute(|| { + let vs = Beefy::validator_set().unwrap(); - assert_eq!(vs.id(), 0u64); - assert_eq!(vs.validators()[0], want[0]); - assert_eq!(vs.validators()[1], want[1]); - }); + assert_eq!(vs.id(), 0u64); + assert_eq!(vs.validators()[0], want[0]); + assert_eq!(vs.validators()[1], want[1]); + }); } #[test] fn validator_set_updates_work() { let want = vec![mock_beefy_id(1), mock_beefy_id(2), mock_beefy_id(3), mock_beefy_id(4)]; - new_test_ext(vec![1, 2, 3, 4]).execute_with(|| { - let vs = Beefy::validator_set().unwrap(); - assert_eq!(vs.id(), 0u64); - assert_eq!(want[0], vs.validators()[0]); - assert_eq!(want[1], vs.validators()[1]); - assert_eq!(want[2], vs.validators()[2]); - assert_eq!(want[3], vs.validators()[3]); + ExtBuilder::default() + .add_authorities(mock_authorities(vec![1, 2, 3, 4])) + .build_and_execute(|| { + let vs = Beefy::validator_set().unwrap(); + assert_eq!(vs.id(), 0u64); + assert_eq!(want[0], vs.validators()[0]); + assert_eq!(want[1], vs.validators()[1]); + assert_eq!(want[2], vs.validators()[2]); + assert_eq!(want[3], vs.validators()[3]); - init_block(1); + init_block(1); - let vs = Beefy::validator_set().unwrap(); + let vs = Beefy::validator_set().unwrap(); - assert_eq!(vs.id(), 1u64); - assert_eq!(want[0], vs.validators()[0]); - assert_eq!(want[1], vs.validators()[1]); + assert_eq!(vs.id(), 1u64); + assert_eq!(want[0], vs.validators()[0]); + assert_eq!(want[1], vs.validators()[1]); - init_block(2); + init_block(2); - let vs = Beefy::validator_set().unwrap(); + let vs = Beefy::validator_set().unwrap(); - assert_eq!(vs.id(), 2u64); - assert_eq!(want[1], vs.validators()[0]); - assert_eq!(want[3], vs.validators()[1]); - }); + assert_eq!(vs.id(), 2u64); + assert_eq!(want[1], vs.validators()[0]); + assert_eq!(want[3], vs.validators()[1]); + }); } #[test] fn cleans_up_old_set_id_session_mappings() { - new_test_ext(vec![1, 2, 3, 4]).execute_with(|| { - let max_set_id_session_entries = MaxSetIdSessionEntries::get(); - - // we have 3 sessions per era - let era_limit = max_set_id_session_entries / 3; - // sanity check against division precision loss - assert_eq!(0, max_set_id_session_entries % 3); - // go through `max_set_id_session_entries` sessions - start_era(era_limit); - - // we should have a session id mapping for all the set ids from - // `max_set_id_session_entries` eras we have observed - for i in 1..=max_set_id_session_entries { - assert!(Beefy::session_for_set(i as u64).is_some()); - } + ExtBuilder::default() + .add_authorities(mock_authorities(vec![1, 2, 3, 4])) + .build_and_execute(|| { + let max_set_id_session_entries = MaxSetIdSessionEntries::get(); + + // we have 3 sessions per era + let era_limit = max_set_id_session_entries / 3; + // sanity check against division precision loss + assert_eq!(0, max_set_id_session_entries % 3); + // go through `max_set_id_session_entries` sessions + start_era(era_limit); + + // we should have a session id mapping for all the set ids from + // `max_set_id_session_entries` eras we have observed + for i in 1..=max_set_id_session_entries { + assert!(beefy::SetIdSession::::get(i as u64).is_some()); + } - // go through another `max_set_id_session_entries` sessions - start_era(era_limit * 2); + // go through another `max_set_id_session_entries` sessions + start_era(era_limit * 2); - // we should keep tracking the new mappings for new sessions - for i in max_set_id_session_entries + 1..=max_set_id_session_entries * 2 { - assert!(Beefy::session_for_set(i as u64).is_some()); - } + // we should keep tracking the new mappings for new sessions + for i in max_set_id_session_entries + 1..=max_set_id_session_entries * 2 { + assert!(beefy::SetIdSession::::get(i as u64).is_some()); + } - // but the old ones should have been pruned by now - for i in 1..=max_set_id_session_entries { - assert!(Beefy::session_for_set(i as u64).is_none()); - } - }); + // but the old ones should have been pruned by now + for i in 1..=max_set_id_session_entries { + assert!(beefy::SetIdSession::::get(i as u64).is_none()); + } + }); } /// Returns a list with 3 authorities with known keys: @@ -259,7 +269,7 @@ fn should_sign_and_verify() { fn report_equivocation_current_set_works() { let authorities = test_authorities(); - new_test_ext_raw_authorities(authorities).execute_with(|| { + ExtBuilder::default().add_authorities(authorities).build_and_execute(|| { assert_eq!(Staking::current_era(), Some(0)); assert_eq!(Session::current_index(), 0); @@ -339,7 +349,7 @@ fn report_equivocation_current_set_works() { fn report_equivocation_old_set_works() { let authorities = test_authorities(); - new_test_ext_raw_authorities(authorities).execute_with(|| { + ExtBuilder::default().add_authorities(authorities).build_and_execute(|| { start_era(1); let block_num = System::block_number(); @@ -422,7 +432,7 @@ fn report_equivocation_old_set_works() { fn report_equivocation_invalid_set_id() { let authorities = test_authorities(); - new_test_ext_raw_authorities(authorities).execute_with(|| { + ExtBuilder::default().add_authorities(authorities).build_and_execute(|| { start_era(1); let block_num = System::block_number(); @@ -460,7 +470,7 @@ fn report_equivocation_invalid_set_id() { fn report_equivocation_invalid_session() { let authorities = test_authorities(); - new_test_ext_raw_authorities(authorities).execute_with(|| { + ExtBuilder::default().add_authorities(authorities).build_and_execute(|| { start_era(1); let block_num = System::block_number(); @@ -503,7 +513,7 @@ fn report_equivocation_invalid_session() { fn report_equivocation_invalid_key_owner_proof() { let authorities = test_authorities(); - new_test_ext_raw_authorities(authorities).execute_with(|| { + ExtBuilder::default().add_authorities(authorities).build_and_execute(|| { start_era(1); let block_num = System::block_number(); @@ -551,7 +561,7 @@ fn report_equivocation_invalid_key_owner_proof() { fn report_equivocation_invalid_equivocation_proof() { let authorities = test_authorities(); - new_test_ext_raw_authorities(authorities).execute_with(|| { + ExtBuilder::default().add_authorities(authorities).build_and_execute(|| { start_era(1); let block_num = System::block_number(); @@ -624,7 +634,7 @@ fn report_equivocation_validate_unsigned_prevents_duplicates() { let authorities = test_authorities(); - new_test_ext_raw_authorities(authorities).execute_with(|| { + ExtBuilder::default().add_authorities(authorities).build_and_execute(|| { start_era(1); let block_num = System::block_number(); @@ -728,7 +738,7 @@ fn report_equivocation_has_valid_weight() { fn valid_equivocation_reports_dont_pay_fees() { let authorities = test_authorities(); - new_test_ext_raw_authorities(authorities).execute_with(|| { + ExtBuilder::default().add_authorities(authorities).build_and_execute(|| { start_era(1); let block_num = System::block_number(); @@ -796,7 +806,7 @@ fn valid_equivocation_reports_dont_pay_fees() { fn set_new_genesis_works() { let authorities = test_authorities(); - new_test_ext_raw_authorities(authorities).execute_with(|| { + ExtBuilder::default().add_authorities(authorities).build_and_execute(|| { start_era(1); let new_genesis_delay = 10u64; @@ -804,7 +814,7 @@ fn set_new_genesis_works() { assert_ok!(Beefy::set_new_genesis(RuntimeOrigin::root(), new_genesis_delay,)); let expected = System::block_number() + new_genesis_delay; // verify new genesis was set - assert_eq!(Beefy::genesis_block(), Some(expected)); + assert_eq!(beefy::GenesisBlock::::get(), Some(expected)); // setting delay < 1 should fail assert_err!( diff --git a/substrate/frame/benchmarking/Cargo.toml b/substrate/frame/benchmarking/Cargo.toml index 38c7bc2b905d37531f97906616f490ab4d4181a1..8210e8cfa626063a32b5528b5469f7029857299f 100644 --- a/substrate/frame/benchmarking/Cargo.toml +++ b/substrate/frame/benchmarking/Cargo.toml @@ -18,10 +18,10 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false } linregress = { version = "0.5.1", optional = true } -log = { version = "0.4.17", default-features = false } +log = { workspace = true } paste = "1.0" -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.195", optional = true } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +serde = { optional = true, workspace = true, default-features = true } frame-support = { path = "../support", default-features = false } frame-support-procedural = { path = "../support/procedural", default-features = false } frame-system = { path = "../system", default-features = false } diff --git a/substrate/frame/benchmarking/README.md b/substrate/frame/benchmarking/README.md index bf0bde2c3df5a5dcc85a6aa61f3c0af519bc3ccf..0b3680e1154664eda6050c75944af1391140bb61 100644 --- a/substrate/frame/benchmarking/README.md +++ b/substrate/frame/benchmarking/README.md @@ -177,8 +177,8 @@ requirements. The benchmarking CLI uses a Handlebars template to format the final output file. You can optionally pass the flag `--template` pointing to a custom template that can be used instead. Within the template, you have access to all the data provided by the `TemplateData` struct in the [benchmarking CLI -writer](../../utils/frame/benchmarking-cli/src/writer.rs). You can find the default template used -[here](../../utils/frame/benchmarking-cli/src/template.hbs). +writer](../../utils/frame/benchmarking-cli/src/pallet/writer.rs). You can find the default template used +[here](../../utils/frame/benchmarking-cli/src/pallet/template.hbs). There are some custom Handlebars helpers included with our output generation: diff --git a/substrate/frame/benchmarking/pov/Cargo.toml b/substrate/frame/benchmarking/pov/Cargo.toml index ce5daeb5b7b4c427e23eca59632f91507f571ae5..5d3aaa7890488018eb3715ed13845a7e3d130b50 100644 --- a/substrate/frame/benchmarking/pov/Cargo.toml +++ b/substrate/frame/benchmarking/pov/Cargo.toml @@ -16,7 +16,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } frame-benchmarking = { path = "..", default-features = false } frame-support = { path = "../../support", default-features = false } frame-system = { path = "../../system", default-features = false } diff --git a/substrate/frame/benchmarking/pov/src/benchmarking.rs b/substrate/frame/benchmarking/pov/src/benchmarking.rs index 84d81890b1756fcb8f86298526ffece69e74b22a..7e6aa8e6bf605859fe3cc6bf0cd0b4bd3d56ccc1 100644 --- a/substrate/frame/benchmarking/pov/src/benchmarking.rs +++ b/substrate/frame/benchmarking/pov/src/benchmarking.rs @@ -21,54 +21,78 @@ use super::*; +use frame_benchmarking::v2::*; use frame_support::traits::UnfilteredDispatchable; use frame_system::{Pallet as System, RawOrigin}; use sp_runtime::traits::Hash; -frame_benchmarking::benchmarks! { - storage_single_value_read { +#[benchmarks] +mod benchmarks { + use super::*; + + #[benchmark] + fn storage_single_value_read() { Value::::put(123); - }: { - assert_eq!(Value::::get(), Some(123)); + + #[block] + { + assert_eq!(Value::::get(), Some(123)); + } } - #[pov_mode = Ignored] - storage_single_value_ignored_read { + #[benchmark(pov_mode = Ignored)] + fn storage_single_value_ignored_read() { Value::::put(123); - }: { - assert_eq!(Value::::get(), Some(123)); + #[block] + { + assert_eq!(Value::::get(), Some(123)); + } } - #[pov_mode = MaxEncodedLen { + #[benchmark(pov_mode = MaxEncodedLen { Pov::Value2: Ignored - }] - storage_single_value_ignored_some_read { + })] + fn storage_single_value_ignored_some_read() { Value::::put(123); Value2::::put(123); - }: { - assert_eq!(Value::::get(), Some(123)); - assert_eq!(Value2::::get(), Some(123)); + + #[block] + { + assert_eq!(Value::::get(), Some(123)); + assert_eq!(Value2::::get(), Some(123)); + } } - storage_single_value_read_twice { + #[benchmark] + fn storage_single_value_read_twice() { Value::::put(123); - }: { - assert_eq!(Value::::get(), Some(123)); - assert_eq!(Value::::get(), Some(123)); + + #[block] + { + assert_eq!(Value::::get(), Some(123)); + assert_eq!(Value::::get(), Some(123)); + } } - storage_single_value_write { - }: { - Value::::put(123); - } verify { + #[benchmark] + fn storage_single_value_write() { + #[block] + { + Value::::put(123); + } + assert_eq!(Value::::get(), Some(123)); } - storage_single_value_kill { + #[benchmark] + fn storage_single_value_kill() { Value::::put(123); - }: { - Value::::kill(); - } verify { + + #[block] + { + Value::::kill(); + } + assert!(!Value::::exists()); } @@ -78,263 +102,297 @@ frame_benchmarking::benchmarks! { // created. Then the one value is read from the map. This demonstrates that the number of other // nodes in the Trie influences the proof size. The number of inserted nodes can be interpreted // as the number of `StorageMap`/`StorageValue` in the whole runtime. - #[pov_mode = Measured] - storage_1m_map_read_one_value_two_additional_layers { - (0..(1<<10)).for_each(|i| Map1M::::insert(i, i)); + #[benchmark(pov_mode = Measured)] + fn storage_1m_map_read_one_value_two_additional_layers() { + (0..(1 << 10)).for_each(|i| Map1M::::insert(i, i)); // Assume there are 16-256 other storage items. - (0..(1u32<<4)).for_each(|i| { + (0..(1u32 << 4)).for_each(|i| { let k = T::Hashing::hash(&i.to_be_bytes()); frame_support::storage::unhashed::put(k.as_ref(), &i); }); - }: { - assert_eq!(Map1M::::get(1<<9), Some(1<<9)); + + #[block] + { + assert_eq!(Map1M::::get(1 << 9), Some(1 << 9)); + } } - #[pov_mode = Measured] - storage_1m_map_read_one_value_three_additional_layers { - (0..(1<<10)).for_each(|i| Map1M::::insert(i, i)); + #[benchmark(pov_mode = Measured)] + fn storage_1m_map_read_one_value_three_additional_layers() { + (0..(1 << 10)).for_each(|i| Map1M::::insert(i, i)); // Assume there are 256-4096 other storage items. - (0..(1u32<<8)).for_each(|i| { + (0..(1u32 << 8)).for_each(|i| { let k = T::Hashing::hash(&i.to_be_bytes()); frame_support::storage::unhashed::put(k.as_ref(), &i); }); - }: { - assert_eq!(Map1M::::get(1<<9), Some(1<<9)); + + #[block] + { + assert_eq!(Map1M::::get(1 << 9), Some(1 << 9)); + } } - #[pov_mode = Measured] - storage_1m_map_read_one_value_four_additional_layers { - (0..(1<<10)).for_each(|i| Map1M::::insert(i, i)); + #[benchmark(pov_mode = Measured)] + fn storage_1m_map_read_one_value_four_additional_layers() { + (0..(1 << 10)).for_each(|i| Map1M::::insert(i, i)); // Assume there are 4096-65536 other storage items. - (0..(1u32<<12)).for_each(|i| { + (0..(1u32 << 12)).for_each(|i| { let k = T::Hashing::hash(&i.to_be_bytes()); frame_support::storage::unhashed::put(k.as_ref(), &i); }); - }: { - assert_eq!(Map1M::::get(1<<9), Some(1<<9)); + + #[block] + { + assert_eq!(Map1M::::get(1 << 9), Some(1 << 9)); + } } // Reads from both storage maps each `n` and `m` times. Should result in two linear components. - storage_map_read_per_component { - let n in 0 .. 100; - let m in 0 .. 100; + #[benchmark] + fn storage_map_read_per_component(n: Linear<0, 100>, m: Linear<0, 100>) { + (0..m * 10).for_each(|i| Map1M::::insert(i, i)); + (0..n * 10).for_each(|i| Map16M::::insert(i, i)); - (0..m*10).for_each(|i| Map1M::::insert(i, i)); - (0..n*10).for_each(|i| Map16M::::insert(i, i)); - }: { - (0..m).for_each(|i| - assert_eq!(Map1M::::get(i*10), Some(i*10))); - (0..n).for_each(|i| - assert_eq!(Map16M::::get(i*10), Some(i*10))); + #[block] + { + (0..m).for_each(|i| assert_eq!(Map1M::::get(i * 10), Some(i * 10))); + (0..n).for_each(|i| assert_eq!(Map16M::::get(i * 10), Some(i * 10))); + } } - #[pov_mode = MaxEncodedLen { + #[benchmark(pov_mode = MaxEncodedLen { Pov::Map1M: Ignored - }] - storage_map_read_per_component_one_ignored { - let n in 0 .. 100; - let m in 0 .. 100; + })] + fn storage_map_read_per_component_one_ignored(n: Linear<0, 100>, m: Linear<0, 100>) { + (0..m * 10).for_each(|i| Map1M::::insert(i, i)); + (0..n * 10).for_each(|i| Map16M::::insert(i, i)); - (0..m*10).for_each(|i| Map1M::::insert(i, i)); - (0..n*10).for_each(|i| Map16M::::insert(i, i)); - }: { - (0..m).for_each(|i| - assert_eq!(Map1M::::get(i*10), Some(i*10))); - (0..n).for_each(|i| - assert_eq!(Map16M::::get(i*10), Some(i*10))); + #[block] + { + (0..m).for_each(|i| assert_eq!(Map1M::::get(i * 10), Some(i * 10))); + (0..n).for_each(|i| assert_eq!(Map16M::::get(i * 10), Some(i * 10))); + } } // Reads the same value from a storage map. Should not result in a component. - storage_1m_map_one_entry_repeated_read { - let n in 0 .. 100; + #[benchmark] + fn storage_1m_map_one_entry_repeated_read(n: Linear<0, 100>) { Map1M::::insert(0, 0); - }: { - (0..n).for_each(|i| - assert_eq!(Map1M::::get(0), Some(0))); + + #[block] + { + (0..n).for_each(|_| assert_eq!(Map1M::::get(0), Some(0))); + } } // Reads the same values from a storage map. Should result in a `1x` linear component. - storage_1m_map_multiple_entry_repeated_read { - let n in 0 .. 100; + #[benchmark] + fn storage_1m_map_multiple_entry_repeated_read(n: Linear<0, 100>) { (0..n).for_each(|i| Map1M::::insert(i, i)); - }: { - (0..n).for_each(|i| { - // Reading the same value 10 times does nothing. - (0..10).for_each(|j| - assert_eq!(Map1M::::get(i), Some(i))); - }); + + #[block] + { + (0..n).for_each(|i| { + // Reading the same value 10 times does nothing. + (0..10).for_each(|_| assert_eq!(Map1M::::get(i), Some(i))); + }); + } } - storage_1m_double_map_read_per_component { - let n in 0 .. 1024; - (0..(1<<10)).for_each(|i| DoubleMap1M::::insert(i, i, i)); - }: { - (0..n).for_each(|i| - assert_eq!(DoubleMap1M::::get(i, i), Some(i))); + #[benchmark] + fn storage_1m_double_map_read_per_component(n: Linear<0, 1024>) { + (0..(1 << 10)).for_each(|i| DoubleMap1M::::insert(i, i, i)); + + #[block] + { + (0..n).for_each(|i| assert_eq!(DoubleMap1M::::get(i, i), Some(i))); + } } - storage_value_bounded_read { - }: { - assert!(BoundedValue::::get().is_none()); + #[benchmark] + fn storage_value_bounded_read() { + #[block] + { + assert!(BoundedValue::::get().is_none()); + } } // Reading unbounded values will produce no mathematical worst case PoV size for this component. - storage_value_unbounded_read { - }: { - assert!(UnboundedValue::::get().is_none()); + #[benchmark] + fn storage_value_unbounded_read() { + #[block] + { + assert!(UnboundedValue::::get().is_none()); + } } - #[pov_mode = Ignored] - storage_value_unbounded_ignored_read { - }: { - assert!(UnboundedValue::::get().is_none()); + #[benchmark(pov_mode = Ignored)] + fn storage_value_unbounded_ignored_read() { + #[block] + { + assert!(UnboundedValue::::get().is_none()); + } } // Same as above, but we still expect a mathematical worst case PoV size for the bounded one. - storage_value_bounded_and_unbounded_read { + #[benchmark] + fn storage_value_bounded_and_unbounded_read() { (0..1024).for_each(|i| Map1M::::insert(i, i)); - }: { - assert!(UnboundedValue::::get().is_none()); - assert!(BoundedValue::::get().is_none()); + #[block] + { + assert!(UnboundedValue::::get().is_none()); + assert!(BoundedValue::::get().is_none()); + } } - #[pov_mode = Measured] - measured_storage_value_read_linear_size { - let l in 0 .. 1<<22; + #[benchmark(pov_mode = Measured)] + fn measured_storage_value_read_linear_size(l: Linear<0, { 1 << 22 }>) { let v: sp_runtime::BoundedVec = sp_std::vec![0u8; l as usize].try_into().unwrap(); LargeValue::::put(&v); - }: { - assert!(LargeValue::::get().is_some()); + #[block] + { + assert!(LargeValue::::get().is_some()); + } } - #[pov_mode = MaxEncodedLen] - mel_storage_value_read_linear_size { - let l in 0 .. 1<<22; + #[benchmark(pov_mode = MaxEncodedLen)] + fn mel_storage_value_read_linear_size(l: Linear<0, { 1 << 22 }>) { let v: sp_runtime::BoundedVec = sp_std::vec![0u8; l as usize].try_into().unwrap(); LargeValue::::put(&v); - }: { - assert!(LargeValue::::get().is_some()); + #[block] + { + assert!(LargeValue::::get().is_some()); + } } - #[pov_mode = Measured] - measured_storage_double_value_read_linear_size { - let l in 0 .. 1<<22; + #[benchmark(pov_mode = Measured)] + fn measured_storage_double_value_read_linear_size(l: Linear<0, { 1 << 22 }>) { let v: sp_runtime::BoundedVec = sp_std::vec![0u8; l as usize].try_into().unwrap(); LargeValue::::put(&v); LargeValue2::::put(&v); - }: { - assert!(LargeValue::::get().is_some()); - assert!(LargeValue2::::get().is_some()); + #[block] + { + assert!(LargeValue::::get().is_some()); + assert!(LargeValue2::::get().is_some()); + } } - #[pov_mode = MaxEncodedLen] - mel_storage_double_value_read_linear_size { - let l in 0 .. 1<<22; + #[benchmark(pov_mode = MaxEncodedLen)] + fn mel_storage_double_value_read_linear_size(l: Linear<0, { 1 << 22 }>) { let v: sp_runtime::BoundedVec = sp_std::vec![0u8; l as usize].try_into().unwrap(); LargeValue::::put(&v); LargeValue2::::put(&v); - }: { - assert!(LargeValue::::get().is_some()); - assert!(LargeValue2::::get().is_some()); + #[block] + { + assert!(LargeValue::::get().is_some()); + assert!(LargeValue2::::get().is_some()); + } } - #[pov_mode = MaxEncodedLen { + #[benchmark(pov_mode = MaxEncodedLen { Pov::LargeValue2: Measured - }] - mel_mixed_storage_double_value_read_linear_size { - let l in 0 .. 1<<22; + })] + fn mel_mixed_storage_double_value_read_linear_size(l: Linear<0, { 1 << 22 }>) { let v: sp_runtime::BoundedVec = sp_std::vec![0u8; l as usize].try_into().unwrap(); LargeValue::::put(&v); LargeValue2::::put(&v); - }: { - assert!(LargeValue::::get().is_some()); - assert!(LargeValue2::::get().is_some()); + #[block] + { + assert!(LargeValue::::get().is_some()); + assert!(LargeValue2::::get().is_some()); + } } - #[pov_mode = Measured { + #[benchmark(pov_mode = Measured { Pov::LargeValue2: MaxEncodedLen - }] - measured_mixed_storage_double_value_read_linear_size { - let l in 0 .. 1<<22; + })] + fn measured_mixed_storage_double_value_read_linear_size(l: Linear<0, { 1 << 22 }>) { let v: sp_runtime::BoundedVec = sp_std::vec![0u8; l as usize].try_into().unwrap(); LargeValue::::put(&v); LargeValue2::::put(&v); - }: { - assert!(LargeValue::::get().is_some()); - assert!(LargeValue2::::get().is_some()); + #[block] + { + assert!(LargeValue::::get().is_some()); + assert!(LargeValue2::::get().is_some()); + } } - #[pov_mode = Measured] - storage_map_unbounded_both_measured_read { - let i in 0 .. 1000; - + #[benchmark(pov_mode = Measured)] + fn storage_map_unbounded_both_measured_read(i: Linear<0, 1000>) { UnboundedMap::::insert(i, sp_std::vec![0; i as usize]); UnboundedMap2::::insert(i, sp_std::vec![0; i as usize]); - }: { - assert!(UnboundedMap::::get(i).is_some()); - assert!(UnboundedMap2::::get(i).is_some()); + #[block] + { + assert!(UnboundedMap::::get(i).is_some()); + assert!(UnboundedMap2::::get(i).is_some()); + } } - #[pov_mode = MaxEncodedLen { + #[benchmark(pov_mode = MaxEncodedLen { Pov::UnboundedMap: Measured - }] - storage_map_partial_unbounded_read { - let i in 0 .. 1000; - + })] + fn storage_map_partial_unbounded_read(i: Linear<0, 1000>) { Map1M::::insert(i, 0); UnboundedMap::::insert(i, sp_std::vec![0; i as usize]); - }: { - assert!(Map1M::::get(i).is_some()); - assert!(UnboundedMap::::get(i).is_some()); + #[block] + { + assert!(Map1M::::get(i).is_some()); + assert!(UnboundedMap::::get(i).is_some()); + } } - #[pov_mode = MaxEncodedLen { + #[benchmark(pov_mode = MaxEncodedLen { Pov::UnboundedMap: Ignored - }] - storage_map_partial_unbounded_ignored_read { - let i in 0 .. 1000; - + })] + fn storage_map_partial_unbounded_ignored_read(i: Linear<0, 1000>) { Map1M::::insert(i, 0); UnboundedMap::::insert(i, sp_std::vec![0; i as usize]); - }: { - assert!(Map1M::::get(i).is_some()); - assert!(UnboundedMap::::get(i).is_some()); + #[block] + { + assert!(Map1M::::get(i).is_some()); + assert!(UnboundedMap::::get(i).is_some()); + } } // Emitting an event will not incur any PoV. - emit_event { + #[benchmark] + fn emit_event() { // Emit a single event. - let call = Call::::emit_event { }; - }: { call.dispatch_bypass_filter(RawOrigin::Root.into()).unwrap(); } - verify { + let call = Call::::emit_event {}; + #[block] + { + call.dispatch_bypass_filter(RawOrigin::Root.into()).unwrap(); + } assert_eq!(System::::events().len(), 1); } // A No-OP will not incur any PoV. - noop { - let call = Call::::noop { }; - }: { - call.dispatch_bypass_filter(RawOrigin::Root.into()).unwrap(); + #[benchmark] + fn noop() { + let call = Call::::noop {}; + #[block] + { + call.dispatch_bypass_filter(RawOrigin::Root.into()).unwrap(); + } } - storage_iteration { + #[benchmark] + fn storage_iteration() { for i in 0..65000 { UnboundedMapTwox::::insert(i, sp_std::vec![0; 64]); } - }: { - for (key, value) in UnboundedMapTwox::::iter() { - unsafe { - core::ptr::read_volatile(&key); - core::ptr::read_volatile(value.as_ptr()); + #[block] + { + for (key, value) in UnboundedMapTwox::::iter() { + unsafe { + core::ptr::read_volatile(&key); + core::ptr::read_volatile(value.as_ptr()); + } } } } - impl_benchmark_test_suite!( - Pallet, - mock::new_test_ext(), - mock::Test, - ); + impl_benchmark_test_suite!(Pallet, super::mock::new_test_ext(), super::mock::Test,); } #[cfg(test)] @@ -355,7 +413,7 @@ mod mock { } ); - #[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] + #[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { type BaseCallFilter = frame_support::traits::Everything; type BlockWeights = (); diff --git a/substrate/frame/benchmarking/pov/src/tests.rs b/substrate/frame/benchmarking/pov/src/tests.rs index 7fa2fb97dea1b2e710e62a1d9950abe617798ad9..cec42057454f687cde26652db3e6506a2ae80d13 100644 --- a/substrate/frame/benchmarking/pov/src/tests.rs +++ b/substrate/frame/benchmarking/pov/src/tests.rs @@ -175,7 +175,7 @@ mod mock { } ); - #[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] + #[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { type BaseCallFilter = frame_support::traits::Everything; type BlockWeights = (); diff --git a/substrate/frame/benchmarking/pov/src/weights.rs b/substrate/frame/benchmarking/pov/src/weights.rs index d84ac88c98f022d77a286c512f979eadb5c2d7a0..c4fc03d1dd937bba6ea0f83eec89c88704a6f31e 100644 --- a/substrate/frame/benchmarking/pov/src/weights.rs +++ b/substrate/frame/benchmarking/pov/src/weights.rs @@ -15,38 +15,36 @@ // See the License for the specific language governing permissions and // limitations under the License. -//! Autogenerated weights for frame_benchmarking_pallet_pov +//! Autogenerated weights for `frame_benchmarking_pallet_pov` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-04-12, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-03-08, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `i9`, CPU: `13th Gen Intel(R) Core(TM) i9-13900K` -//! EXECUTION: None, WASM-EXECUTION: Compiled, CHAIN: None, DB CACHE: 1024 +//! HOSTNAME: `Olivers-MBP`, CPU: `` +//! WASM-EXECUTION: `Compiled`, CHAIN: `None`, DB CACHE: `1024` // Executed Command: -// ./target/release/substrate +// target/release/substrate-node // benchmark // pallet -// --dev // --pallet // frame-benchmarking-pallet-pov // --extrinsic // -// --steps -// 50 -// --repeat -// 20 -// --template=.maintain/frame-weight-template.hbs -// --output=frame/benchmarking/pov/src/weights.rs +// --output +// substrate/frame/benchmarking/pov/src/weights.rs +// --template +// substrate/.maintain/frame-weight-template.hbs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] #![allow(unused_imports)] +#![allow(missing_docs)] use frame_support::{traits::Get, weights::{Weight, constants::RocksDbWeight}}; use core::marker::PhantomData; -/// Weight functions needed for frame_benchmarking_pallet_pov. +/// Weight functions needed for `frame_benchmarking_pallet_pov`. pub trait WeightInfo { fn storage_single_value_read() -> Weight; fn storage_single_value_ignored_read() -> Weight; @@ -80,361 +78,361 @@ pub trait WeightInfo { fn storage_iteration() -> Weight; } -/// Weights for frame_benchmarking_pallet_pov using the Substrate node and recommended hardware. +/// Weights for `frame_benchmarking_pallet_pov` using the Substrate node and recommended hardware. pub struct SubstrateWeight(PhantomData); impl WeightInfo for SubstrateWeight { - /// Storage: Pov Value (r:1 w:0) - /// Proof: Pov Value (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + /// Storage: `Pov::Value` (r:1 w:0) + /// Proof: `Pov::Value` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) fn storage_single_value_read() -> Weight { // Proof Size summary in bytes: // Measured: `136` // Estimated: `1489` - // Minimum execution time: 1_706_000 picoseconds. - Weight::from_parts(1_788_000, 1489) + // Minimum execution time: 3_000_000 picoseconds. + Weight::from_parts(3_000_000, 1489) .saturating_add(T::DbWeight::get().reads(1_u64)) } - /// Storage: Pov Value (r:1 w:0) - /// Proof: Pov Value (max_values: Some(1), max_size: Some(4), added: 499, mode: Ignored) + /// Storage: `Pov::Value` (r:1 w:0) + /// Proof: `Pov::Value` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `Ignored`) fn storage_single_value_ignored_read() -> Weight { // Proof Size summary in bytes: // Measured: `136` // Estimated: `0` - // Minimum execution time: 1_661_000 picoseconds. - Weight::from_parts(1_718_000, 0) + // Minimum execution time: 3_000_000 picoseconds. + Weight::from_parts(3_000_000, 0) .saturating_add(T::DbWeight::get().reads(1_u64)) } - /// Storage: Pov Value (r:1 w:0) - /// Proof: Pov Value (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: Pov Value2 (r:1 w:0) - /// Proof: Pov Value2 (max_values: Some(1), max_size: Some(4), added: 499, mode: Ignored) + /// Storage: `Pov::Value` (r:1 w:0) + /// Proof: `Pov::Value` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `Pov::Value2` (r:1 w:0) + /// Proof: `Pov::Value2` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `Ignored`) fn storage_single_value_ignored_some_read() -> Weight { // Proof Size summary in bytes: // Measured: `160` // Estimated: `1489` - // Minimum execution time: 2_226_000 picoseconds. - Weight::from_parts(2_365_000, 1489) + // Minimum execution time: 4_000_000 picoseconds. + Weight::from_parts(4_000_000, 1489) .saturating_add(T::DbWeight::get().reads(2_u64)) } - /// Storage: Pov Value (r:1 w:0) - /// Proof: Pov Value (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + /// Storage: `Pov::Value` (r:1 w:0) + /// Proof: `Pov::Value` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) fn storage_single_value_read_twice() -> Weight { // Proof Size summary in bytes: // Measured: `136` // Estimated: `1489` - // Minimum execution time: 1_785_000 picoseconds. - Weight::from_parts(1_980_000, 1489) + // Minimum execution time: 3_000_000 picoseconds. + Weight::from_parts(4_000_000, 1489) .saturating_add(T::DbWeight::get().reads(1_u64)) } - /// Storage: Pov Value (r:0 w:1) - /// Proof: Pov Value (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + /// Storage: `Pov::Value` (r:0 w:1) + /// Proof: `Pov::Value` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) fn storage_single_value_write() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 254_000 picoseconds. - Weight::from_parts(326_000, 0) + // Minimum execution time: 0_000 picoseconds. + Weight::from_parts(1_000_000, 0) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: Pov Value (r:0 w:1) - /// Proof: Pov Value (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + /// Storage: `Pov::Value` (r:0 w:1) + /// Proof: `Pov::Value` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) fn storage_single_value_kill() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 239_000 picoseconds. - Weight::from_parts(277_000, 0) + // Minimum execution time: 0_000 picoseconds. + Weight::from_parts(1_000_000, 0) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: Pov Map1M (r:1 w:0) - /// Proof: Pov Map1M (max_values: Some(1000000), max_size: Some(36), added: 2511, mode: Measured) + /// Storage: `Pov::Map1M` (r:1 w:0) + /// Proof: `Pov::Map1M` (`max_values`: Some(1000000), `max_size`: Some(36), added: 2511, mode: `Measured`) fn storage_1m_map_read_one_value_two_additional_layers() -> Weight { // Proof Size summary in bytes: // Measured: `1275` // Estimated: `4740` - // Minimum execution time: 4_760_000 picoseconds. - Weight::from_parts(5_051_000, 4740) + // Minimum execution time: 7_000_000 picoseconds. + Weight::from_parts(7_000_000, 4740) .saturating_add(T::DbWeight::get().reads(1_u64)) } - /// Storage: Pov Map1M (r:1 w:0) - /// Proof: Pov Map1M (max_values: Some(1000000), max_size: Some(36), added: 2511, mode: Measured) + /// Storage: `Pov::Map1M` (r:1 w:0) + /// Proof: `Pov::Map1M` (`max_values`: Some(1000000), `max_size`: Some(36), added: 2511, mode: `Measured`) fn storage_1m_map_read_one_value_three_additional_layers() -> Weight { // Proof Size summary in bytes: // Measured: `1544` // Estimated: `5009` - // Minimum execution time: 5_490_000 picoseconds. - Weight::from_parts(5_703_000, 5009) + // Minimum execution time: 8_000_000 picoseconds. + Weight::from_parts(8_000_000, 5009) .saturating_add(T::DbWeight::get().reads(1_u64)) } - /// Storage: Pov Map1M (r:1 w:0) - /// Proof: Pov Map1M (max_values: Some(1000000), max_size: Some(36), added: 2511, mode: Measured) + /// Storage: `Pov::Map1M` (r:1 w:0) + /// Proof: `Pov::Map1M` (`max_values`: Some(1000000), `max_size`: Some(36), added: 2511, mode: `Measured`) fn storage_1m_map_read_one_value_four_additional_layers() -> Weight { // Proof Size summary in bytes: // Measured: `2044` // Estimated: `5509` - // Minimum execution time: 6_397_000 picoseconds. - Weight::from_parts(7_084_000, 5509) + // Minimum execution time: 9_000_000 picoseconds. + Weight::from_parts(10_000_000, 5509) .saturating_add(T::DbWeight::get().reads(1_u64)) } - /// Storage: Pov Map1M (r:100 w:0) - /// Proof: Pov Map1M (max_values: Some(1000000), max_size: Some(36), added: 2511, mode: MaxEncodedLen) - /// Storage: Pov Map16M (r:100 w:0) - /// Proof: Pov Map16M (max_values: Some(16000000), max_size: Some(36), added: 3006, mode: MaxEncodedLen) + /// Storage: `Pov::Map1M` (r:100 w:0) + /// Proof: `Pov::Map1M` (`max_values`: Some(1000000), `max_size`: Some(36), added: 2511, mode: `MaxEncodedLen`) + /// Storage: `Pov::Map16M` (r:100 w:0) + /// Proof: `Pov::Map16M` (`max_values`: Some(16000000), `max_size`: Some(36), added: 3006, mode: `MaxEncodedLen`) /// The range of component `n` is `[0, 100]`. /// The range of component `m` is `[0, 100]`. fn storage_map_read_per_component(n: u32, m: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `515 + m * (188 ±0) + n * (188 ±0)` // Estimated: `990 + m * (2511 ±0) + n * (3006 ±0)` - // Minimum execution time: 181_481_000 picoseconds. - Weight::from_parts(129_275_141, 990) - // Standard Error: 13_049 - .saturating_add(Weight::from_parts(787_667, 0).saturating_mul(n.into())) - // Standard Error: 13_049 - .saturating_add(Weight::from_parts(830_378, 0).saturating_mul(m.into())) + // Minimum execution time: 342_000_000 picoseconds. + Weight::from_parts(179_688_624, 990) + // Standard Error: 26_526 + .saturating_add(Weight::from_parts(2_061_828, 0).saturating_mul(n.into())) + // Standard Error: 26_526 + .saturating_add(Weight::from_parts(1_825_923, 0).saturating_mul(m.into())) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(n.into()))) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(m.into()))) .saturating_add(Weight::from_parts(0, 2511).saturating_mul(m.into())) .saturating_add(Weight::from_parts(0, 3006).saturating_mul(n.into())) } - /// Storage: Pov Map1M (r:100 w:0) - /// Proof: Pov Map1M (max_values: Some(1000000), max_size: Some(36), added: 2511, mode: Ignored) - /// Storage: Pov Map16M (r:100 w:0) - /// Proof: Pov Map16M (max_values: Some(16000000), max_size: Some(36), added: 3006, mode: MaxEncodedLen) + /// Storage: `Pov::Map1M` (r:100 w:0) + /// Proof: `Pov::Map1M` (`max_values`: Some(1000000), `max_size`: Some(36), added: 2511, mode: `Ignored`) + /// Storage: `Pov::Map16M` (r:100 w:0) + /// Proof: `Pov::Map16M` (`max_values`: Some(16000000), `max_size`: Some(36), added: 3006, mode: `MaxEncodedLen`) /// The range of component `n` is `[0, 100]`. /// The range of component `m` is `[0, 100]`. fn storage_map_read_per_component_one_ignored(n: u32, m: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `515 + m * (188 ±0) + n * (188 ±0)` // Estimated: `1685 + m * (189 ±0) + n * (3006 ±0)` - // Minimum execution time: 181_925_000 picoseconds. - Weight::from_parts(134_416_814, 1685) - // Standard Error: 15_678 - .saturating_add(Weight::from_parts(827_168, 0).saturating_mul(n.into())) - // Standard Error: 15_678 - .saturating_add(Weight::from_parts(813_655, 0).saturating_mul(m.into())) + // Minimum execution time: 342_000_000 picoseconds. + Weight::from_parts(204_945_396, 1685) + // Standard Error: 25_217 + .saturating_add(Weight::from_parts(1_827_513, 0).saturating_mul(n.into())) + // Standard Error: 25_217 + .saturating_add(Weight::from_parts(1_661_271, 0).saturating_mul(m.into())) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(n.into()))) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(m.into()))) .saturating_add(Weight::from_parts(0, 189).saturating_mul(m.into())) .saturating_add(Weight::from_parts(0, 3006).saturating_mul(n.into())) } - /// Storage: Pov Map1M (r:1 w:0) - /// Proof: Pov Map1M (max_values: Some(1000000), max_size: Some(36), added: 2511, mode: MaxEncodedLen) + /// Storage: `Pov::Map1M` (r:1 w:0) + /// Proof: `Pov::Map1M` (`max_values`: Some(1000000), `max_size`: Some(36), added: 2511, mode: `MaxEncodedLen`) /// The range of component `n` is `[0, 100]`. fn storage_1m_map_one_entry_repeated_read(n: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `170` // Estimated: `3501` - // Minimum execution time: 20_000 picoseconds. - Weight::from_parts(2_006_399, 3501) - // Standard Error: 808 - .saturating_add(Weight::from_parts(263_609, 0).saturating_mul(n.into())) + // Minimum execution time: 0_000 picoseconds. + Weight::from_parts(3_387_064, 3501) + // Standard Error: 1_445 + .saturating_add(Weight::from_parts(1_143_678, 0).saturating_mul(n.into())) .saturating_add(T::DbWeight::get().reads(1_u64)) } - /// Storage: Pov Map1M (r:100 w:0) - /// Proof: Pov Map1M (max_values: Some(1000000), max_size: Some(36), added: 2511, mode: MaxEncodedLen) + /// Storage: `Pov::Map1M` (r:100 w:0) + /// Proof: `Pov::Map1M` (`max_values`: Some(1000000), `max_size`: Some(36), added: 2511, mode: `MaxEncodedLen`) /// The range of component `n` is `[0, 100]`. fn storage_1m_map_multiple_entry_repeated_read(n: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `147 + n * (40 ±0)` // Estimated: `990 + n * (2511 ±0)` - // Minimum execution time: 21_000 picoseconds. - Weight::from_parts(3_940_044, 990) - // Standard Error: 4_906 - .saturating_add(Weight::from_parts(3_454_882, 0).saturating_mul(n.into())) + // Minimum execution time: 0_000 picoseconds. + Weight::from_parts(1_323_684, 990) + // Standard Error: 10_546 + .saturating_add(Weight::from_parts(13_101_864, 0).saturating_mul(n.into())) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(n.into()))) .saturating_add(Weight::from_parts(0, 2511).saturating_mul(n.into())) } - /// Storage: Pov DoubleMap1M (r:1024 w:0) - /// Proof: Pov DoubleMap1M (max_values: Some(1000000), max_size: Some(68), added: 2543, mode: MaxEncodedLen) + /// Storage: `Pov::DoubleMap1M` (r:1024 w:0) + /// Proof: `Pov::DoubleMap1M` (`max_values`: Some(1000000), `max_size`: Some(68), added: 2543, mode: `MaxEncodedLen`) /// The range of component `n` is `[0, 1024]`. fn storage_1m_double_map_read_per_component(n: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `21938 + n * (57 ±0)` // Estimated: `990 + n * (2543 ±0)` - // Minimum execution time: 28_000 picoseconds. - Weight::from_parts(20_674_869, 990) - // Standard Error: 3_035 - .saturating_add(Weight::from_parts(1_995_730, 0).saturating_mul(n.into())) + // Minimum execution time: 0_000 picoseconds. + Weight::from_parts(39_703_963, 990) + // Standard Error: 10_589 + .saturating_add(Weight::from_parts(3_718_040, 0).saturating_mul(n.into())) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(n.into()))) .saturating_add(Weight::from_parts(0, 2543).saturating_mul(n.into())) } - /// Storage: Pov BoundedValue (r:1 w:0) - /// Proof: Pov BoundedValue (max_values: Some(1), max_size: Some(33), added: 528, mode: MaxEncodedLen) + /// Storage: `Pov::BoundedValue` (r:1 w:0) + /// Proof: `Pov::BoundedValue` (`max_values`: Some(1), `max_size`: Some(33), added: 528, mode: `MaxEncodedLen`) fn storage_value_bounded_read() -> Weight { // Proof Size summary in bytes: // Measured: `109` // Estimated: `1518` - // Minimum execution time: 1_091_000 picoseconds. - Weight::from_parts(1_181_000, 1518) + // Minimum execution time: 2_000_000 picoseconds. + Weight::from_parts(2_000_000, 1518) .saturating_add(T::DbWeight::get().reads(1_u64)) } - /// Storage: Pov UnboundedValue (r:1 w:0) - /// Proof Skipped: Pov UnboundedValue (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: `Pov::UnboundedValue` (r:1 w:0) + /// Proof: `Pov::UnboundedValue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) fn storage_value_unbounded_read() -> Weight { // Proof Size summary in bytes: // Measured: `109` // Estimated: `1594` - // Minimum execution time: 1_079_000 picoseconds. - Weight::from_parts(1_176_000, 1594) + // Minimum execution time: 2_000_000 picoseconds. + Weight::from_parts(2_000_000, 1594) .saturating_add(T::DbWeight::get().reads(1_u64)) } - /// Storage: Pov UnboundedValue (r:1 w:0) - /// Proof Skipped: Pov UnboundedValue (max_values: Some(1), max_size: None, mode: Ignored) + /// Storage: `Pov::UnboundedValue` (r:1 w:0) + /// Proof: `Pov::UnboundedValue` (`max_values`: Some(1), `max_size`: None, mode: `Ignored`) fn storage_value_unbounded_ignored_read() -> Weight { // Proof Size summary in bytes: // Measured: `109` // Estimated: `0` - // Minimum execution time: 1_101_000 picoseconds. - Weight::from_parts(1_160_000, 0) + // Minimum execution time: 2_000_000 picoseconds. + Weight::from_parts(2_000_000, 0) .saturating_add(T::DbWeight::get().reads(1_u64)) } - /// Storage: Pov UnboundedValue (r:1 w:0) - /// Proof Skipped: Pov UnboundedValue (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Pov BoundedValue (r:1 w:0) - /// Proof: Pov BoundedValue (max_values: Some(1), max_size: Some(33), added: 528, mode: MaxEncodedLen) + /// Storage: `Pov::UnboundedValue` (r:1 w:0) + /// Proof: `Pov::UnboundedValue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Pov::BoundedValue` (r:1 w:0) + /// Proof: `Pov::BoundedValue` (`max_values`: Some(1), `max_size`: Some(33), added: 528, mode: `MaxEncodedLen`) fn storage_value_bounded_and_unbounded_read() -> Weight { // Proof Size summary in bytes: // Measured: `147` // Estimated: `1632` - // Minimum execution time: 2_143_000 picoseconds. - Weight::from_parts(2_280_000, 1632) + // Minimum execution time: 3_000_000 picoseconds. + Weight::from_parts(5_000_000, 1632) .saturating_add(T::DbWeight::get().reads(2_u64)) } - /// Storage: Pov LargeValue (r:1 w:0) - /// Proof: Pov LargeValue (max_values: Some(1), max_size: Some(4194308), added: 4194803, mode: Measured) + /// Storage: `Pov::LargeValue` (r:1 w:0) + /// Proof: `Pov::LargeValue` (`max_values`: Some(1), `max_size`: Some(4194308), added: 4194803, mode: `Measured`) /// The range of component `l` is `[0, 4194304]`. fn measured_storage_value_read_linear_size(l: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `142 + l * (1 ±0)` // Estimated: `1626 + l * (1 ±0)` - // Minimum execution time: 1_665_000 picoseconds. - Weight::from_parts(1_725_000, 1626) - // Standard Error: 3 - .saturating_add(Weight::from_parts(376, 0).saturating_mul(l.into())) + // Minimum execution time: 3_000_000 picoseconds. + Weight::from_parts(3_000_000, 1626) + // Standard Error: 1 + .saturating_add(Weight::from_parts(393, 0).saturating_mul(l.into())) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(Weight::from_parts(0, 1).saturating_mul(l.into())) } - /// Storage: Pov LargeValue (r:1 w:0) - /// Proof: Pov LargeValue (max_values: Some(1), max_size: Some(4194308), added: 4194803, mode: MaxEncodedLen) + /// Storage: `Pov::LargeValue` (r:1 w:0) + /// Proof: `Pov::LargeValue` (`max_values`: Some(1), `max_size`: Some(4194308), added: 4194803, mode: `MaxEncodedLen`) /// The range of component `l` is `[0, 4194304]`. fn mel_storage_value_read_linear_size(l: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `142 + l * (1 ±0)` // Estimated: `4195793` - // Minimum execution time: 1_640_000 picoseconds. - Weight::from_parts(1_724_000, 4195793) - // Standard Error: 4 - .saturating_add(Weight::from_parts(395, 0).saturating_mul(l.into())) + // Minimum execution time: 3_000_000 picoseconds. + Weight::from_parts(3_000_000, 4195793) + // Standard Error: 1 + .saturating_add(Weight::from_parts(394, 0).saturating_mul(l.into())) .saturating_add(T::DbWeight::get().reads(1_u64)) } - /// Storage: Pov LargeValue (r:1 w:0) - /// Proof: Pov LargeValue (max_values: Some(1), max_size: Some(4194308), added: 4194803, mode: Measured) - /// Storage: Pov LargeValue2 (r:1 w:0) - /// Proof: Pov LargeValue2 (max_values: Some(1), max_size: Some(4194308), added: 4194803, mode: Measured) + /// Storage: `Pov::LargeValue` (r:1 w:0) + /// Proof: `Pov::LargeValue` (`max_values`: Some(1), `max_size`: Some(4194308), added: 4194803, mode: `Measured`) + /// Storage: `Pov::LargeValue2` (r:1 w:0) + /// Proof: `Pov::LargeValue2` (`max_values`: Some(1), `max_size`: Some(4194308), added: 4194803, mode: `Measured`) /// The range of component `l` is `[0, 4194304]`. fn measured_storage_double_value_read_linear_size(l: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `171 + l * (2 ±0)` // Estimated: `1655 + l * (2 ±0)` - // Minimum execution time: 2_263_000 picoseconds. - Weight::from_parts(2_358_000, 1655) - // Standard Error: 8 - .saturating_add(Weight::from_parts(737, 0).saturating_mul(l.into())) + // Minimum execution time: 4_000_000 picoseconds. + Weight::from_parts(4_000_000, 1655) + // Standard Error: 2 + .saturating_add(Weight::from_parts(655, 0).saturating_mul(l.into())) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(Weight::from_parts(0, 2).saturating_mul(l.into())) } - /// Storage: Pov LargeValue (r:1 w:0) - /// Proof: Pov LargeValue (max_values: Some(1), max_size: Some(4194308), added: 4194803, mode: MaxEncodedLen) - /// Storage: Pov LargeValue2 (r:1 w:0) - /// Proof: Pov LargeValue2 (max_values: Some(1), max_size: Some(4194308), added: 4194803, mode: MaxEncodedLen) + /// Storage: `Pov::LargeValue` (r:1 w:0) + /// Proof: `Pov::LargeValue` (`max_values`: Some(1), `max_size`: Some(4194308), added: 4194803, mode: `MaxEncodedLen`) + /// Storage: `Pov::LargeValue2` (r:1 w:0) + /// Proof: `Pov::LargeValue2` (`max_values`: Some(1), `max_size`: Some(4194308), added: 4194803, mode: `MaxEncodedLen`) /// The range of component `l` is `[0, 4194304]`. fn mel_storage_double_value_read_linear_size(l: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `171 + l * (2 ±0)` // Estimated: `4195793` - // Minimum execution time: 2_161_000 picoseconds. - Weight::from_parts(2_233_000, 4195793) - // Standard Error: 5 - .saturating_add(Weight::from_parts(639, 0).saturating_mul(l.into())) + // Minimum execution time: 4_000_000 picoseconds. + Weight::from_parts(4_000_000, 4195793) + // Standard Error: 2 + .saturating_add(Weight::from_parts(660, 0).saturating_mul(l.into())) .saturating_add(T::DbWeight::get().reads(2_u64)) } - /// Storage: Pov LargeValue (r:1 w:0) - /// Proof: Pov LargeValue (max_values: Some(1), max_size: Some(4194308), added: 4194803, mode: MaxEncodedLen) - /// Storage: Pov LargeValue2 (r:1 w:0) - /// Proof: Pov LargeValue2 (max_values: Some(1), max_size: Some(4194308), added: 4194803, mode: Measured) + /// Storage: `Pov::LargeValue` (r:1 w:0) + /// Proof: `Pov::LargeValue` (`max_values`: Some(1), `max_size`: Some(4194308), added: 4194803, mode: `MaxEncodedLen`) + /// Storage: `Pov::LargeValue2` (r:1 w:0) + /// Proof: `Pov::LargeValue2` (`max_values`: Some(1), `max_size`: Some(4194308), added: 4194803, mode: `Measured`) /// The range of component `l` is `[0, 4194304]`. fn mel_mixed_storage_double_value_read_linear_size(l: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `171 + l * (2 ±0)` // Estimated: `4195793 + l * (2 ±0)` - // Minimum execution time: 2_149_000 picoseconds. - Weight::from_parts(2_256_000, 4195793) - // Standard Error: 6 - .saturating_add(Weight::from_parts(677, 0).saturating_mul(l.into())) + // Minimum execution time: 4_000_000 picoseconds. + Weight::from_parts(4_000_000, 4195793) + // Standard Error: 4 + .saturating_add(Weight::from_parts(691, 0).saturating_mul(l.into())) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(Weight::from_parts(0, 2).saturating_mul(l.into())) } - /// Storage: Pov LargeValue (r:1 w:0) - /// Proof: Pov LargeValue (max_values: Some(1), max_size: Some(4194308), added: 4194803, mode: Measured) - /// Storage: Pov LargeValue2 (r:1 w:0) - /// Proof: Pov LargeValue2 (max_values: Some(1), max_size: Some(4194308), added: 4194803, mode: MaxEncodedLen) + /// Storage: `Pov::LargeValue` (r:1 w:0) + /// Proof: `Pov::LargeValue` (`max_values`: Some(1), `max_size`: Some(4194308), added: 4194803, mode: `Measured`) + /// Storage: `Pov::LargeValue2` (r:1 w:0) + /// Proof: `Pov::LargeValue2` (`max_values`: Some(1), `max_size`: Some(4194308), added: 4194803, mode: `MaxEncodedLen`) /// The range of component `l` is `[0, 4194304]`. fn measured_mixed_storage_double_value_read_linear_size(l: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `171 + l * (2 ±0)` // Estimated: `4195793 + l * (2 ±0)` - // Minimum execution time: 2_254_000 picoseconds. - Weight::from_parts(2_319_000, 4195793) - // Standard Error: 5 - .saturating_add(Weight::from_parts(664, 0).saturating_mul(l.into())) + // Minimum execution time: 4_000_000 picoseconds. + Weight::from_parts(4_000_000, 4195793) + // Standard Error: 4 + .saturating_add(Weight::from_parts(691, 0).saturating_mul(l.into())) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(Weight::from_parts(0, 2).saturating_mul(l.into())) } - /// Storage: Pov UnboundedMap (r:1 w:0) - /// Proof Skipped: Pov UnboundedMap (max_values: None, max_size: None, mode: Measured) - /// Storage: Pov UnboundedMap2 (r:1 w:0) - /// Proof Skipped: Pov UnboundedMap2 (max_values: None, max_size: None, mode: Measured) + /// Storage: `Pov::UnboundedMap` (r:1 w:0) + /// Proof: `Pov::UnboundedMap` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Pov::UnboundedMap2` (r:1 w:0) + /// Proof: `Pov::UnboundedMap2` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `i` is `[0, 1000]`. fn storage_map_unbounded_both_measured_read(i: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `229 + i * (8 ±0)` // Estimated: `3693 + i * (8 ±0)` - // Minimum execution time: 3_071_000 picoseconds. - Weight::from_parts(3_487_712, 3693) - // Standard Error: 26 - .saturating_add(Weight::from_parts(748, 0).saturating_mul(i.into())) + // Minimum execution time: 6_000_000 picoseconds. + Weight::from_parts(7_274_226, 3693) + // Standard Error: 280 + .saturating_add(Weight::from_parts(3_282, 0).saturating_mul(i.into())) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(Weight::from_parts(0, 8).saturating_mul(i.into())) } - /// Storage: Pov Map1M (r:1 w:0) - /// Proof: Pov Map1M (max_values: Some(1000000), max_size: Some(36), added: 2511, mode: MaxEncodedLen) - /// Storage: Pov UnboundedMap (r:1 w:0) - /// Proof Skipped: Pov UnboundedMap (max_values: None, max_size: None, mode: Measured) + /// Storage: `Pov::Map1M` (r:1 w:0) + /// Proof: `Pov::Map1M` (`max_values`: Some(1000000), `max_size`: Some(36), added: 2511, mode: `MaxEncodedLen`) + /// Storage: `Pov::UnboundedMap` (r:1 w:0) + /// Proof: `Pov::UnboundedMap` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `i` is `[0, 1000]`. fn storage_map_partial_unbounded_read(i: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `228 + i * (4 ±0)` // Estimated: `3692 + i * (4 ±0)` - // Minimum execution time: 3_150_000 picoseconds. - Weight::from_parts(3_582_963, 3692) - // Standard Error: 18 - .saturating_add(Weight::from_parts(380, 0).saturating_mul(i.into())) + // Minimum execution time: 7_000_000 picoseconds. + Weight::from_parts(7_507_333, 3692) + // Standard Error: 64 + .saturating_add(Weight::from_parts(982, 0).saturating_mul(i.into())) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(Weight::from_parts(0, 4).saturating_mul(i.into())) } - /// Storage: Pov Map1M (r:1 w:0) - /// Proof: Pov Map1M (max_values: Some(1000000), max_size: Some(36), added: 2511, mode: MaxEncodedLen) - /// Storage: Pov UnboundedMap (r:1 w:0) - /// Proof Skipped: Pov UnboundedMap (max_values: None, max_size: None, mode: Ignored) + /// Storage: `Pov::Map1M` (r:1 w:0) + /// Proof: `Pov::Map1M` (`max_values`: Some(1000000), `max_size`: Some(36), added: 2511, mode: `MaxEncodedLen`) + /// Storage: `Pov::UnboundedMap` (r:1 w:0) + /// Proof: `Pov::UnboundedMap` (`max_values`: None, `max_size`: None, mode: `Ignored`) /// The range of component `i` is `[0, 1000]`. fn storage_map_partial_unbounded_ignored_read(i: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `228 + i * (4 ±0)` // Estimated: `3501 + i * (4 ±0)` - // Minimum execution time: 3_092_000 picoseconds. - Weight::from_parts(3_595_328, 3501) - // Standard Error: 20 - .saturating_add(Weight::from_parts(243, 0).saturating_mul(i.into())) + // Minimum execution time: 6_000_000 picoseconds. + Weight::from_parts(7_285_011, 3501) + // Standard Error: 80 + .saturating_add(Weight::from_parts(1_395, 0).saturating_mul(i.into())) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(Weight::from_parts(0, 4).saturating_mul(i.into())) } @@ -442,382 +440,382 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_705_000 picoseconds. - Weight::from_parts(1_818_000, 0) + // Minimum execution time: 4_000_000 picoseconds. + Weight::from_parts(5_000_000, 0) } fn noop() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 533_000 picoseconds. - Weight::from_parts(587_000, 0) + // Minimum execution time: 2_000_000 picoseconds. + Weight::from_parts(2_000_000, 0) } - /// Storage: Pov UnboundedMapTwox (r:65001 w:0) - /// Proof Skipped: Pov UnboundedMapTwox (max_values: None, max_size: None, mode: Measured) + /// Storage: `Pov::UnboundedMapTwox` (r:65001 w:0) + /// Proof: `Pov::UnboundedMapTwox` (`max_values`: None, `max_size`: None, mode: `Measured`) fn storage_iteration() -> Weight { // Proof Size summary in bytes: // Measured: `17985289` // Estimated: `178863754` - // Minimum execution time: 118_753_057_000 picoseconds. - Weight::from_parts(121_396_503_000, 178863754) + // Minimum execution time: 218_275_000_000 picoseconds. + Weight::from_parts(222_603_000_000, 178863754) .saturating_add(T::DbWeight::get().reads(65001_u64)) } } -// For backwards compatibility and tests +// For backwards compatibility and tests. impl WeightInfo for () { - /// Storage: Pov Value (r:1 w:0) - /// Proof: Pov Value (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + /// Storage: `Pov::Value` (r:1 w:0) + /// Proof: `Pov::Value` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) fn storage_single_value_read() -> Weight { // Proof Size summary in bytes: // Measured: `136` // Estimated: `1489` - // Minimum execution time: 1_706_000 picoseconds. - Weight::from_parts(1_788_000, 1489) + // Minimum execution time: 3_000_000 picoseconds. + Weight::from_parts(3_000_000, 1489) .saturating_add(RocksDbWeight::get().reads(1_u64)) } - /// Storage: Pov Value (r:1 w:0) - /// Proof: Pov Value (max_values: Some(1), max_size: Some(4), added: 499, mode: Ignored) + /// Storage: `Pov::Value` (r:1 w:0) + /// Proof: `Pov::Value` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `Ignored`) fn storage_single_value_ignored_read() -> Weight { // Proof Size summary in bytes: // Measured: `136` // Estimated: `0` - // Minimum execution time: 1_661_000 picoseconds. - Weight::from_parts(1_718_000, 0) + // Minimum execution time: 3_000_000 picoseconds. + Weight::from_parts(3_000_000, 0) .saturating_add(RocksDbWeight::get().reads(1_u64)) } - /// Storage: Pov Value (r:1 w:0) - /// Proof: Pov Value (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: Pov Value2 (r:1 w:0) - /// Proof: Pov Value2 (max_values: Some(1), max_size: Some(4), added: 499, mode: Ignored) + /// Storage: `Pov::Value` (r:1 w:0) + /// Proof: `Pov::Value` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `Pov::Value2` (r:1 w:0) + /// Proof: `Pov::Value2` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `Ignored`) fn storage_single_value_ignored_some_read() -> Weight { // Proof Size summary in bytes: // Measured: `160` // Estimated: `1489` - // Minimum execution time: 2_226_000 picoseconds. - Weight::from_parts(2_365_000, 1489) + // Minimum execution time: 4_000_000 picoseconds. + Weight::from_parts(4_000_000, 1489) .saturating_add(RocksDbWeight::get().reads(2_u64)) } - /// Storage: Pov Value (r:1 w:0) - /// Proof: Pov Value (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + /// Storage: `Pov::Value` (r:1 w:0) + /// Proof: `Pov::Value` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) fn storage_single_value_read_twice() -> Weight { // Proof Size summary in bytes: // Measured: `136` // Estimated: `1489` - // Minimum execution time: 1_785_000 picoseconds. - Weight::from_parts(1_980_000, 1489) + // Minimum execution time: 3_000_000 picoseconds. + Weight::from_parts(4_000_000, 1489) .saturating_add(RocksDbWeight::get().reads(1_u64)) } - /// Storage: Pov Value (r:0 w:1) - /// Proof: Pov Value (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + /// Storage: `Pov::Value` (r:0 w:1) + /// Proof: `Pov::Value` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) fn storage_single_value_write() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 254_000 picoseconds. - Weight::from_parts(326_000, 0) + // Minimum execution time: 0_000 picoseconds. + Weight::from_parts(1_000_000, 0) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Pov Value (r:0 w:1) - /// Proof: Pov Value (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + /// Storage: `Pov::Value` (r:0 w:1) + /// Proof: `Pov::Value` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) fn storage_single_value_kill() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 239_000 picoseconds. - Weight::from_parts(277_000, 0) + // Minimum execution time: 0_000 picoseconds. + Weight::from_parts(1_000_000, 0) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Pov Map1M (r:1 w:0) - /// Proof: Pov Map1M (max_values: Some(1000000), max_size: Some(36), added: 2511, mode: Measured) + /// Storage: `Pov::Map1M` (r:1 w:0) + /// Proof: `Pov::Map1M` (`max_values`: Some(1000000), `max_size`: Some(36), added: 2511, mode: `Measured`) fn storage_1m_map_read_one_value_two_additional_layers() -> Weight { // Proof Size summary in bytes: // Measured: `1275` // Estimated: `4740` - // Minimum execution time: 4_760_000 picoseconds. - Weight::from_parts(5_051_000, 4740) + // Minimum execution time: 7_000_000 picoseconds. + Weight::from_parts(7_000_000, 4740) .saturating_add(RocksDbWeight::get().reads(1_u64)) } - /// Storage: Pov Map1M (r:1 w:0) - /// Proof: Pov Map1M (max_values: Some(1000000), max_size: Some(36), added: 2511, mode: Measured) + /// Storage: `Pov::Map1M` (r:1 w:0) + /// Proof: `Pov::Map1M` (`max_values`: Some(1000000), `max_size`: Some(36), added: 2511, mode: `Measured`) fn storage_1m_map_read_one_value_three_additional_layers() -> Weight { // Proof Size summary in bytes: // Measured: `1544` // Estimated: `5009` - // Minimum execution time: 5_490_000 picoseconds. - Weight::from_parts(5_703_000, 5009) + // Minimum execution time: 8_000_000 picoseconds. + Weight::from_parts(8_000_000, 5009) .saturating_add(RocksDbWeight::get().reads(1_u64)) } - /// Storage: Pov Map1M (r:1 w:0) - /// Proof: Pov Map1M (max_values: Some(1000000), max_size: Some(36), added: 2511, mode: Measured) + /// Storage: `Pov::Map1M` (r:1 w:0) + /// Proof: `Pov::Map1M` (`max_values`: Some(1000000), `max_size`: Some(36), added: 2511, mode: `Measured`) fn storage_1m_map_read_one_value_four_additional_layers() -> Weight { // Proof Size summary in bytes: // Measured: `2044` // Estimated: `5509` - // Minimum execution time: 6_397_000 picoseconds. - Weight::from_parts(7_084_000, 5509) + // Minimum execution time: 9_000_000 picoseconds. + Weight::from_parts(10_000_000, 5509) .saturating_add(RocksDbWeight::get().reads(1_u64)) } - /// Storage: Pov Map1M (r:100 w:0) - /// Proof: Pov Map1M (max_values: Some(1000000), max_size: Some(36), added: 2511, mode: MaxEncodedLen) - /// Storage: Pov Map16M (r:100 w:0) - /// Proof: Pov Map16M (max_values: Some(16000000), max_size: Some(36), added: 3006, mode: MaxEncodedLen) + /// Storage: `Pov::Map1M` (r:100 w:0) + /// Proof: `Pov::Map1M` (`max_values`: Some(1000000), `max_size`: Some(36), added: 2511, mode: `MaxEncodedLen`) + /// Storage: `Pov::Map16M` (r:100 w:0) + /// Proof: `Pov::Map16M` (`max_values`: Some(16000000), `max_size`: Some(36), added: 3006, mode: `MaxEncodedLen`) /// The range of component `n` is `[0, 100]`. /// The range of component `m` is `[0, 100]`. fn storage_map_read_per_component(n: u32, m: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `515 + m * (188 ±0) + n * (188 ±0)` // Estimated: `990 + m * (2511 ±0) + n * (3006 ±0)` - // Minimum execution time: 181_481_000 picoseconds. - Weight::from_parts(129_275_141, 990) - // Standard Error: 13_049 - .saturating_add(Weight::from_parts(787_667, 0).saturating_mul(n.into())) - // Standard Error: 13_049 - .saturating_add(Weight::from_parts(830_378, 0).saturating_mul(m.into())) + // Minimum execution time: 342_000_000 picoseconds. + Weight::from_parts(179_688_624, 990) + // Standard Error: 26_526 + .saturating_add(Weight::from_parts(2_061_828, 0).saturating_mul(n.into())) + // Standard Error: 26_526 + .saturating_add(Weight::from_parts(1_825_923, 0).saturating_mul(m.into())) .saturating_add(RocksDbWeight::get().reads((1_u64).saturating_mul(n.into()))) .saturating_add(RocksDbWeight::get().reads((1_u64).saturating_mul(m.into()))) .saturating_add(Weight::from_parts(0, 2511).saturating_mul(m.into())) .saturating_add(Weight::from_parts(0, 3006).saturating_mul(n.into())) } - /// Storage: Pov Map1M (r:100 w:0) - /// Proof: Pov Map1M (max_values: Some(1000000), max_size: Some(36), added: 2511, mode: Ignored) - /// Storage: Pov Map16M (r:100 w:0) - /// Proof: Pov Map16M (max_values: Some(16000000), max_size: Some(36), added: 3006, mode: MaxEncodedLen) + /// Storage: `Pov::Map1M` (r:100 w:0) + /// Proof: `Pov::Map1M` (`max_values`: Some(1000000), `max_size`: Some(36), added: 2511, mode: `Ignored`) + /// Storage: `Pov::Map16M` (r:100 w:0) + /// Proof: `Pov::Map16M` (`max_values`: Some(16000000), `max_size`: Some(36), added: 3006, mode: `MaxEncodedLen`) /// The range of component `n` is `[0, 100]`. /// The range of component `m` is `[0, 100]`. fn storage_map_read_per_component_one_ignored(n: u32, m: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `515 + m * (188 ±0) + n * (188 ±0)` // Estimated: `1685 + m * (189 ±0) + n * (3006 ±0)` - // Minimum execution time: 181_925_000 picoseconds. - Weight::from_parts(134_416_814, 1685) - // Standard Error: 15_678 - .saturating_add(Weight::from_parts(827_168, 0).saturating_mul(n.into())) - // Standard Error: 15_678 - .saturating_add(Weight::from_parts(813_655, 0).saturating_mul(m.into())) + // Minimum execution time: 342_000_000 picoseconds. + Weight::from_parts(204_945_396, 1685) + // Standard Error: 25_217 + .saturating_add(Weight::from_parts(1_827_513, 0).saturating_mul(n.into())) + // Standard Error: 25_217 + .saturating_add(Weight::from_parts(1_661_271, 0).saturating_mul(m.into())) .saturating_add(RocksDbWeight::get().reads((1_u64).saturating_mul(n.into()))) .saturating_add(RocksDbWeight::get().reads((1_u64).saturating_mul(m.into()))) .saturating_add(Weight::from_parts(0, 189).saturating_mul(m.into())) .saturating_add(Weight::from_parts(0, 3006).saturating_mul(n.into())) } - /// Storage: Pov Map1M (r:1 w:0) - /// Proof: Pov Map1M (max_values: Some(1000000), max_size: Some(36), added: 2511, mode: MaxEncodedLen) + /// Storage: `Pov::Map1M` (r:1 w:0) + /// Proof: `Pov::Map1M` (`max_values`: Some(1000000), `max_size`: Some(36), added: 2511, mode: `MaxEncodedLen`) /// The range of component `n` is `[0, 100]`. fn storage_1m_map_one_entry_repeated_read(n: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `170` // Estimated: `3501` - // Minimum execution time: 20_000 picoseconds. - Weight::from_parts(2_006_399, 3501) - // Standard Error: 808 - .saturating_add(Weight::from_parts(263_609, 0).saturating_mul(n.into())) + // Minimum execution time: 0_000 picoseconds. + Weight::from_parts(3_387_064, 3501) + // Standard Error: 1_445 + .saturating_add(Weight::from_parts(1_143_678, 0).saturating_mul(n.into())) .saturating_add(RocksDbWeight::get().reads(1_u64)) } - /// Storage: Pov Map1M (r:100 w:0) - /// Proof: Pov Map1M (max_values: Some(1000000), max_size: Some(36), added: 2511, mode: MaxEncodedLen) + /// Storage: `Pov::Map1M` (r:100 w:0) + /// Proof: `Pov::Map1M` (`max_values`: Some(1000000), `max_size`: Some(36), added: 2511, mode: `MaxEncodedLen`) /// The range of component `n` is `[0, 100]`. fn storage_1m_map_multiple_entry_repeated_read(n: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `147 + n * (40 ±0)` // Estimated: `990 + n * (2511 ±0)` - // Minimum execution time: 21_000 picoseconds. - Weight::from_parts(3_940_044, 990) - // Standard Error: 4_906 - .saturating_add(Weight::from_parts(3_454_882, 0).saturating_mul(n.into())) + // Minimum execution time: 0_000 picoseconds. + Weight::from_parts(1_323_684, 990) + // Standard Error: 10_546 + .saturating_add(Weight::from_parts(13_101_864, 0).saturating_mul(n.into())) .saturating_add(RocksDbWeight::get().reads((1_u64).saturating_mul(n.into()))) .saturating_add(Weight::from_parts(0, 2511).saturating_mul(n.into())) } - /// Storage: Pov DoubleMap1M (r:1024 w:0) - /// Proof: Pov DoubleMap1M (max_values: Some(1000000), max_size: Some(68), added: 2543, mode: MaxEncodedLen) + /// Storage: `Pov::DoubleMap1M` (r:1024 w:0) + /// Proof: `Pov::DoubleMap1M` (`max_values`: Some(1000000), `max_size`: Some(68), added: 2543, mode: `MaxEncodedLen`) /// The range of component `n` is `[0, 1024]`. fn storage_1m_double_map_read_per_component(n: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `21938 + n * (57 ±0)` // Estimated: `990 + n * (2543 ±0)` - // Minimum execution time: 28_000 picoseconds. - Weight::from_parts(20_674_869, 990) - // Standard Error: 3_035 - .saturating_add(Weight::from_parts(1_995_730, 0).saturating_mul(n.into())) + // Minimum execution time: 0_000 picoseconds. + Weight::from_parts(39_703_963, 990) + // Standard Error: 10_589 + .saturating_add(Weight::from_parts(3_718_040, 0).saturating_mul(n.into())) .saturating_add(RocksDbWeight::get().reads((1_u64).saturating_mul(n.into()))) .saturating_add(Weight::from_parts(0, 2543).saturating_mul(n.into())) } - /// Storage: Pov BoundedValue (r:1 w:0) - /// Proof: Pov BoundedValue (max_values: Some(1), max_size: Some(33), added: 528, mode: MaxEncodedLen) + /// Storage: `Pov::BoundedValue` (r:1 w:0) + /// Proof: `Pov::BoundedValue` (`max_values`: Some(1), `max_size`: Some(33), added: 528, mode: `MaxEncodedLen`) fn storage_value_bounded_read() -> Weight { // Proof Size summary in bytes: // Measured: `109` // Estimated: `1518` - // Minimum execution time: 1_091_000 picoseconds. - Weight::from_parts(1_181_000, 1518) + // Minimum execution time: 2_000_000 picoseconds. + Weight::from_parts(2_000_000, 1518) .saturating_add(RocksDbWeight::get().reads(1_u64)) } - /// Storage: Pov UnboundedValue (r:1 w:0) - /// Proof Skipped: Pov UnboundedValue (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: `Pov::UnboundedValue` (r:1 w:0) + /// Proof: `Pov::UnboundedValue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) fn storage_value_unbounded_read() -> Weight { // Proof Size summary in bytes: // Measured: `109` // Estimated: `1594` - // Minimum execution time: 1_079_000 picoseconds. - Weight::from_parts(1_176_000, 1594) + // Minimum execution time: 2_000_000 picoseconds. + Weight::from_parts(2_000_000, 1594) .saturating_add(RocksDbWeight::get().reads(1_u64)) } - /// Storage: Pov UnboundedValue (r:1 w:0) - /// Proof Skipped: Pov UnboundedValue (max_values: Some(1), max_size: None, mode: Ignored) + /// Storage: `Pov::UnboundedValue` (r:1 w:0) + /// Proof: `Pov::UnboundedValue` (`max_values`: Some(1), `max_size`: None, mode: `Ignored`) fn storage_value_unbounded_ignored_read() -> Weight { // Proof Size summary in bytes: // Measured: `109` // Estimated: `0` - // Minimum execution time: 1_101_000 picoseconds. - Weight::from_parts(1_160_000, 0) + // Minimum execution time: 2_000_000 picoseconds. + Weight::from_parts(2_000_000, 0) .saturating_add(RocksDbWeight::get().reads(1_u64)) } - /// Storage: Pov UnboundedValue (r:1 w:0) - /// Proof Skipped: Pov UnboundedValue (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Pov BoundedValue (r:1 w:0) - /// Proof: Pov BoundedValue (max_values: Some(1), max_size: Some(33), added: 528, mode: MaxEncodedLen) + /// Storage: `Pov::UnboundedValue` (r:1 w:0) + /// Proof: `Pov::UnboundedValue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Pov::BoundedValue` (r:1 w:0) + /// Proof: `Pov::BoundedValue` (`max_values`: Some(1), `max_size`: Some(33), added: 528, mode: `MaxEncodedLen`) fn storage_value_bounded_and_unbounded_read() -> Weight { // Proof Size summary in bytes: // Measured: `147` // Estimated: `1632` - // Minimum execution time: 2_143_000 picoseconds. - Weight::from_parts(2_280_000, 1632) + // Minimum execution time: 3_000_000 picoseconds. + Weight::from_parts(5_000_000, 1632) .saturating_add(RocksDbWeight::get().reads(2_u64)) } - /// Storage: Pov LargeValue (r:1 w:0) - /// Proof: Pov LargeValue (max_values: Some(1), max_size: Some(4194308), added: 4194803, mode: Measured) + /// Storage: `Pov::LargeValue` (r:1 w:0) + /// Proof: `Pov::LargeValue` (`max_values`: Some(1), `max_size`: Some(4194308), added: 4194803, mode: `Measured`) /// The range of component `l` is `[0, 4194304]`. fn measured_storage_value_read_linear_size(l: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `142 + l * (1 ±0)` // Estimated: `1626 + l * (1 ±0)` - // Minimum execution time: 1_665_000 picoseconds. - Weight::from_parts(1_725_000, 1626) - // Standard Error: 3 - .saturating_add(Weight::from_parts(376, 0).saturating_mul(l.into())) + // Minimum execution time: 3_000_000 picoseconds. + Weight::from_parts(3_000_000, 1626) + // Standard Error: 1 + .saturating_add(Weight::from_parts(393, 0).saturating_mul(l.into())) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(Weight::from_parts(0, 1).saturating_mul(l.into())) } - /// Storage: Pov LargeValue (r:1 w:0) - /// Proof: Pov LargeValue (max_values: Some(1), max_size: Some(4194308), added: 4194803, mode: MaxEncodedLen) + /// Storage: `Pov::LargeValue` (r:1 w:0) + /// Proof: `Pov::LargeValue` (`max_values`: Some(1), `max_size`: Some(4194308), added: 4194803, mode: `MaxEncodedLen`) /// The range of component `l` is `[0, 4194304]`. fn mel_storage_value_read_linear_size(l: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `142 + l * (1 ±0)` // Estimated: `4195793` - // Minimum execution time: 1_640_000 picoseconds. - Weight::from_parts(1_724_000, 4195793) - // Standard Error: 4 - .saturating_add(Weight::from_parts(395, 0).saturating_mul(l.into())) + // Minimum execution time: 3_000_000 picoseconds. + Weight::from_parts(3_000_000, 4195793) + // Standard Error: 1 + .saturating_add(Weight::from_parts(394, 0).saturating_mul(l.into())) .saturating_add(RocksDbWeight::get().reads(1_u64)) } - /// Storage: Pov LargeValue (r:1 w:0) - /// Proof: Pov LargeValue (max_values: Some(1), max_size: Some(4194308), added: 4194803, mode: Measured) - /// Storage: Pov LargeValue2 (r:1 w:0) - /// Proof: Pov LargeValue2 (max_values: Some(1), max_size: Some(4194308), added: 4194803, mode: Measured) + /// Storage: `Pov::LargeValue` (r:1 w:0) + /// Proof: `Pov::LargeValue` (`max_values`: Some(1), `max_size`: Some(4194308), added: 4194803, mode: `Measured`) + /// Storage: `Pov::LargeValue2` (r:1 w:0) + /// Proof: `Pov::LargeValue2` (`max_values`: Some(1), `max_size`: Some(4194308), added: 4194803, mode: `Measured`) /// The range of component `l` is `[0, 4194304]`. fn measured_storage_double_value_read_linear_size(l: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `171 + l * (2 ±0)` // Estimated: `1655 + l * (2 ±0)` - // Minimum execution time: 2_263_000 picoseconds. - Weight::from_parts(2_358_000, 1655) - // Standard Error: 8 - .saturating_add(Weight::from_parts(737, 0).saturating_mul(l.into())) + // Minimum execution time: 4_000_000 picoseconds. + Weight::from_parts(4_000_000, 1655) + // Standard Error: 2 + .saturating_add(Weight::from_parts(655, 0).saturating_mul(l.into())) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(Weight::from_parts(0, 2).saturating_mul(l.into())) } - /// Storage: Pov LargeValue (r:1 w:0) - /// Proof: Pov LargeValue (max_values: Some(1), max_size: Some(4194308), added: 4194803, mode: MaxEncodedLen) - /// Storage: Pov LargeValue2 (r:1 w:0) - /// Proof: Pov LargeValue2 (max_values: Some(1), max_size: Some(4194308), added: 4194803, mode: MaxEncodedLen) + /// Storage: `Pov::LargeValue` (r:1 w:0) + /// Proof: `Pov::LargeValue` (`max_values`: Some(1), `max_size`: Some(4194308), added: 4194803, mode: `MaxEncodedLen`) + /// Storage: `Pov::LargeValue2` (r:1 w:0) + /// Proof: `Pov::LargeValue2` (`max_values`: Some(1), `max_size`: Some(4194308), added: 4194803, mode: `MaxEncodedLen`) /// The range of component `l` is `[0, 4194304]`. fn mel_storage_double_value_read_linear_size(l: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `171 + l * (2 ±0)` // Estimated: `4195793` - // Minimum execution time: 2_161_000 picoseconds. - Weight::from_parts(2_233_000, 4195793) - // Standard Error: 5 - .saturating_add(Weight::from_parts(639, 0).saturating_mul(l.into())) + // Minimum execution time: 4_000_000 picoseconds. + Weight::from_parts(4_000_000, 4195793) + // Standard Error: 2 + .saturating_add(Weight::from_parts(660, 0).saturating_mul(l.into())) .saturating_add(RocksDbWeight::get().reads(2_u64)) } - /// Storage: Pov LargeValue (r:1 w:0) - /// Proof: Pov LargeValue (max_values: Some(1), max_size: Some(4194308), added: 4194803, mode: MaxEncodedLen) - /// Storage: Pov LargeValue2 (r:1 w:0) - /// Proof: Pov LargeValue2 (max_values: Some(1), max_size: Some(4194308), added: 4194803, mode: Measured) + /// Storage: `Pov::LargeValue` (r:1 w:0) + /// Proof: `Pov::LargeValue` (`max_values`: Some(1), `max_size`: Some(4194308), added: 4194803, mode: `MaxEncodedLen`) + /// Storage: `Pov::LargeValue2` (r:1 w:0) + /// Proof: `Pov::LargeValue2` (`max_values`: Some(1), `max_size`: Some(4194308), added: 4194803, mode: `Measured`) /// The range of component `l` is `[0, 4194304]`. fn mel_mixed_storage_double_value_read_linear_size(l: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `171 + l * (2 ±0)` // Estimated: `4195793 + l * (2 ±0)` - // Minimum execution time: 2_149_000 picoseconds. - Weight::from_parts(2_256_000, 4195793) - // Standard Error: 6 - .saturating_add(Weight::from_parts(677, 0).saturating_mul(l.into())) + // Minimum execution time: 4_000_000 picoseconds. + Weight::from_parts(4_000_000, 4195793) + // Standard Error: 4 + .saturating_add(Weight::from_parts(691, 0).saturating_mul(l.into())) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(Weight::from_parts(0, 2).saturating_mul(l.into())) } - /// Storage: Pov LargeValue (r:1 w:0) - /// Proof: Pov LargeValue (max_values: Some(1), max_size: Some(4194308), added: 4194803, mode: Measured) - /// Storage: Pov LargeValue2 (r:1 w:0) - /// Proof: Pov LargeValue2 (max_values: Some(1), max_size: Some(4194308), added: 4194803, mode: MaxEncodedLen) + /// Storage: `Pov::LargeValue` (r:1 w:0) + /// Proof: `Pov::LargeValue` (`max_values`: Some(1), `max_size`: Some(4194308), added: 4194803, mode: `Measured`) + /// Storage: `Pov::LargeValue2` (r:1 w:0) + /// Proof: `Pov::LargeValue2` (`max_values`: Some(1), `max_size`: Some(4194308), added: 4194803, mode: `MaxEncodedLen`) /// The range of component `l` is `[0, 4194304]`. fn measured_mixed_storage_double_value_read_linear_size(l: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `171 + l * (2 ±0)` // Estimated: `4195793 + l * (2 ±0)` - // Minimum execution time: 2_254_000 picoseconds. - Weight::from_parts(2_319_000, 4195793) - // Standard Error: 5 - .saturating_add(Weight::from_parts(664, 0).saturating_mul(l.into())) + // Minimum execution time: 4_000_000 picoseconds. + Weight::from_parts(4_000_000, 4195793) + // Standard Error: 4 + .saturating_add(Weight::from_parts(691, 0).saturating_mul(l.into())) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(Weight::from_parts(0, 2).saturating_mul(l.into())) } - /// Storage: Pov UnboundedMap (r:1 w:0) - /// Proof Skipped: Pov UnboundedMap (max_values: None, max_size: None, mode: Measured) - /// Storage: Pov UnboundedMap2 (r:1 w:0) - /// Proof Skipped: Pov UnboundedMap2 (max_values: None, max_size: None, mode: Measured) + /// Storage: `Pov::UnboundedMap` (r:1 w:0) + /// Proof: `Pov::UnboundedMap` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Pov::UnboundedMap2` (r:1 w:0) + /// Proof: `Pov::UnboundedMap2` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `i` is `[0, 1000]`. fn storage_map_unbounded_both_measured_read(i: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `229 + i * (8 ±0)` // Estimated: `3693 + i * (8 ±0)` - // Minimum execution time: 3_071_000 picoseconds. - Weight::from_parts(3_487_712, 3693) - // Standard Error: 26 - .saturating_add(Weight::from_parts(748, 0).saturating_mul(i.into())) + // Minimum execution time: 6_000_000 picoseconds. + Weight::from_parts(7_274_226, 3693) + // Standard Error: 280 + .saturating_add(Weight::from_parts(3_282, 0).saturating_mul(i.into())) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(Weight::from_parts(0, 8).saturating_mul(i.into())) } - /// Storage: Pov Map1M (r:1 w:0) - /// Proof: Pov Map1M (max_values: Some(1000000), max_size: Some(36), added: 2511, mode: MaxEncodedLen) - /// Storage: Pov UnboundedMap (r:1 w:0) - /// Proof Skipped: Pov UnboundedMap (max_values: None, max_size: None, mode: Measured) + /// Storage: `Pov::Map1M` (r:1 w:0) + /// Proof: `Pov::Map1M` (`max_values`: Some(1000000), `max_size`: Some(36), added: 2511, mode: `MaxEncodedLen`) + /// Storage: `Pov::UnboundedMap` (r:1 w:0) + /// Proof: `Pov::UnboundedMap` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `i` is `[0, 1000]`. fn storage_map_partial_unbounded_read(i: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `228 + i * (4 ±0)` // Estimated: `3692 + i * (4 ±0)` - // Minimum execution time: 3_150_000 picoseconds. - Weight::from_parts(3_582_963, 3692) - // Standard Error: 18 - .saturating_add(Weight::from_parts(380, 0).saturating_mul(i.into())) + // Minimum execution time: 7_000_000 picoseconds. + Weight::from_parts(7_507_333, 3692) + // Standard Error: 64 + .saturating_add(Weight::from_parts(982, 0).saturating_mul(i.into())) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(Weight::from_parts(0, 4).saturating_mul(i.into())) } - /// Storage: Pov Map1M (r:1 w:0) - /// Proof: Pov Map1M (max_values: Some(1000000), max_size: Some(36), added: 2511, mode: MaxEncodedLen) - /// Storage: Pov UnboundedMap (r:1 w:0) - /// Proof Skipped: Pov UnboundedMap (max_values: None, max_size: None, mode: Ignored) + /// Storage: `Pov::Map1M` (r:1 w:0) + /// Proof: `Pov::Map1M` (`max_values`: Some(1000000), `max_size`: Some(36), added: 2511, mode: `MaxEncodedLen`) + /// Storage: `Pov::UnboundedMap` (r:1 w:0) + /// Proof: `Pov::UnboundedMap` (`max_values`: None, `max_size`: None, mode: `Ignored`) /// The range of component `i` is `[0, 1000]`. fn storage_map_partial_unbounded_ignored_read(i: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `228 + i * (4 ±0)` // Estimated: `3501 + i * (4 ±0)` - // Minimum execution time: 3_092_000 picoseconds. - Weight::from_parts(3_595_328, 3501) - // Standard Error: 20 - .saturating_add(Weight::from_parts(243, 0).saturating_mul(i.into())) + // Minimum execution time: 6_000_000 picoseconds. + Weight::from_parts(7_285_011, 3501) + // Standard Error: 80 + .saturating_add(Weight::from_parts(1_395, 0).saturating_mul(i.into())) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(Weight::from_parts(0, 4).saturating_mul(i.into())) } @@ -825,24 +823,24 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_705_000 picoseconds. - Weight::from_parts(1_818_000, 0) + // Minimum execution time: 4_000_000 picoseconds. + Weight::from_parts(5_000_000, 0) } fn noop() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 533_000 picoseconds. - Weight::from_parts(587_000, 0) + // Minimum execution time: 2_000_000 picoseconds. + Weight::from_parts(2_000_000, 0) } - /// Storage: Pov UnboundedMapTwox (r:65001 w:0) - /// Proof Skipped: Pov UnboundedMapTwox (max_values: None, max_size: None, mode: Measured) + /// Storage: `Pov::UnboundedMapTwox` (r:65001 w:0) + /// Proof: `Pov::UnboundedMapTwox` (`max_values`: None, `max_size`: None, mode: `Measured`) fn storage_iteration() -> Weight { // Proof Size summary in bytes: // Measured: `17985289` // Estimated: `178863754` - // Minimum execution time: 118_753_057_000 picoseconds. - Weight::from_parts(121_396_503_000, 178863754) + // Minimum execution time: 218_275_000_000 picoseconds. + Weight::from_parts(222_603_000_000, 178863754) .saturating_add(RocksDbWeight::get().reads(65001_u64)) } } diff --git a/substrate/frame/benchmarking/src/analysis.rs b/substrate/frame/benchmarking/src/analysis.rs index 5fc3abb5a27f0f2c2bcaadc2c6e71fbd603c0470..987078ff79a8b432c1ca801ab79578cd2c27fc9d 100644 --- a/substrate/frame/benchmarking/src/analysis.rs +++ b/substrate/frame/benchmarking/src/analysis.rs @@ -41,7 +41,7 @@ pub enum BenchmarkSelector { /// Multiplies the value by 1000 and converts it into an u128. fn mul_1000_into_u128(value: f64) -> u128 { - // This is slighly more precise than the alternative of `(value * 1000.0) as u128`. + // This is slightly more precise than the alternative of `(value * 1000.0) as u128`. (value as u128) .saturating_mul(1000) .saturating_add((value.fract() * 1000.0) as u128) diff --git a/substrate/frame/benchmarking/src/baseline.rs b/substrate/frame/benchmarking/src/baseline.rs index 2fd3b634ae72d9c50d7d20ba14c625402e0b2565..e76d5aed7b8d3539810ec7c7cd2f83acb51479eb 100644 --- a/substrate/frame/benchmarking/src/baseline.rs +++ b/substrate/frame/benchmarking/src/baseline.rs @@ -125,7 +125,7 @@ pub mod mock { } ); - #[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] + #[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { type BaseCallFilter = frame_support::traits::Everything; type BlockWeights = (); diff --git a/substrate/frame/benchmarking/src/lib.rs b/substrate/frame/benchmarking/src/lib.rs index f79582d03e51caaaf395048fa224484b026d32f9..d4ee0abbecce5be341881d73004c59bf71d9db97 100644 --- a/substrate/frame/benchmarking/src/lib.rs +++ b/substrate/frame/benchmarking/src/lib.rs @@ -203,7 +203,7 @@ pub use v1::*; /// ## Where Clause /// /// Some pallets require a where clause specifying constraints on their generics to make -/// writing benchmarks feasible. To accomodate this situation, you can provide such a where +/// writing benchmarks feasible. To accommodate this situation, you can provide such a where /// clause as the (only) argument to the `#[benchmarks]` or `#[instance_benchmarks]` attribute /// macros. Below is an example of this taken from the `message-queue` pallet. /// diff --git a/substrate/frame/benchmarking/src/tests.rs b/substrate/frame/benchmarking/src/tests.rs index f47a3d9f96a9fded1702d9b6e36d6ceda14a7598..bcca5fe7c2f2a59fb81c6f4e52ee1f5e7f7c0da3 100644 --- a/substrate/frame/benchmarking/src/tests.rs +++ b/substrate/frame/benchmarking/src/tests.rs @@ -75,7 +75,7 @@ frame_support::construct_runtime!( } ); -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { type BaseCallFilter = frame_support::traits::Everything; type BlockWeights = (); @@ -262,15 +262,11 @@ mod benchmarks { let components = >::components(&selected); assert_eq!(components, vec![(BenchmarkParameter::b, 1, 1000)]); - let closure = >::instance( - &selected, - &[(BenchmarkParameter::b, 1)], - true, - ) - .expect("failed to create closure"); - new_test_ext().execute_with(|| { - assert_ok!(closure()); + assert_ok!(>::unit_test_instance( + &selected, + &[(BenchmarkParameter::b, 1)], + )); }); } @@ -281,15 +277,11 @@ mod benchmarks { let components = >::components(&selected); assert_eq!(components, vec![(BenchmarkParameter::b, 1, 1000)]); - let closure = >::instance( - &selected, - &[(BenchmarkParameter::b, 1)], - true, - ) - .expect("failed to create closure"); - new_test_ext().execute_with(|| { - assert_ok!(closure()); + assert_ok!(>::unit_test_instance( + &selected, + &[(BenchmarkParameter::b, 1)], + )); }); } @@ -300,14 +292,12 @@ mod benchmarks { let components = >::components(&selected); assert_eq!(components, vec![(BenchmarkParameter::x, 1, 10000)]); - let closure = >::instance( - &selected, - &[(BenchmarkParameter::x, 1)], - true, - ) - .expect("failed to create closure"); - - assert_ok!(closure()); + new_test_ext().execute_with(|| { + assert_ok!(>::unit_test_instance( + &selected, + &[(BenchmarkParameter::x, 1)], + )); + }); } #[test] @@ -315,29 +305,24 @@ mod benchmarks { // Check postcondition for benchmark `set_value` is valid. let selected = SelectedBenchmark::set_value; - let closure = >::instance( - &selected, - &[(BenchmarkParameter::b, 1)], - true, - ) - .expect("failed to create closure"); - new_test_ext().execute_with(|| { - assert_ok!(closure()); + assert_ok!(>::unit_test_instance( + &selected, + &[(BenchmarkParameter::b, 1)], + )); }); // Check postcondition for benchmark `bad_verify` is invalid. let selected = SelectedBenchmark::bad_verify; - let closure = >::instance( - &selected, - &[(BenchmarkParameter::x, 10000)], - true, - ) - .expect("failed to create closure"); - new_test_ext().execute_with(|| { - assert_err!(closure(), "You forgot to sort!"); + assert_err!( + >::unit_test_instance( + &selected, + &[(BenchmarkParameter::x, 10000)], + ), + "You forgot to sort!" + ); }); } @@ -345,15 +330,11 @@ mod benchmarks { fn benchmark_override_works() { let selected = SelectedBenchmark::override_benchmark; - let closure = >::instance( - &selected, - &[(BenchmarkParameter::b, 1)], - true, - ) - .expect("failed to create closure"); - new_test_ext().execute_with(|| { - let result = closure(); + let result = >::unit_test_instance( + &selected, + &[(BenchmarkParameter::b, 1)], + ); assert!(matches!(result, Err(BenchmarkError::Override(_)))); }); } diff --git a/substrate/frame/benchmarking/src/tests_instance.rs b/substrate/frame/benchmarking/src/tests_instance.rs index c28aa694a130b9d0c29b86a3b06166b11bed0f3a..d6e1cf99ef73f33820fbea31c8f31a560ec487b6 100644 --- a/substrate/frame/benchmarking/src/tests_instance.rs +++ b/substrate/frame/benchmarking/src/tests_instance.rs @@ -85,7 +85,7 @@ frame_support::construct_runtime!( } ); -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { type BaseCallFilter = frame_support::traits::Everything; type BlockWeights = (); diff --git a/substrate/frame/benchmarking/src/utils.rs b/substrate/frame/benchmarking/src/utils.rs index 0b07a94064eba9a44f4336be4c32b21692900526..60a1249574576e13bca3c66e2dc1971895ee163b 100644 --- a/substrate/frame/benchmarking/src/utils.rs +++ b/substrate/frame/benchmarking/src/utils.rs @@ -26,7 +26,7 @@ use scale_info::TypeInfo; use serde::{Deserialize, Serialize}; use sp_io::hashing::blake2_256; use sp_runtime::{traits::TrailingZeroInput, DispatchError}; -use sp_std::{prelude::Box, vec::Vec}; +use sp_std::vec::Vec; use sp_storage::TrackedStorageKey; /// An alphabet of possible parameters to use for benchmarking. @@ -370,6 +370,90 @@ pub trait Benchmarking { ) -> Result, BenchmarkError>; } +/// The recording trait used to mark the start and end of a benchmark. +pub trait Recording { + /// Start the benchmark. + fn start(&mut self) {} + + // Stop the benchmark. + fn stop(&mut self) {} +} + +/// A no-op recording, used for unit test. +struct NoopRecording; +impl Recording for NoopRecording {} + +/// A no-op recording, used for tests that should setup some state before running the benchmark. +struct TestRecording<'a> { + on_before_start: Option<&'a dyn Fn()>, +} + +impl<'a> TestRecording<'a> { + fn new(on_before_start: &'a dyn Fn()) -> Self { + Self { on_before_start: Some(on_before_start) } + } +} + +impl<'a> Recording for TestRecording<'a> { + fn start(&mut self) { + (self.on_before_start.take().expect("start called more than once"))(); + } +} + +/// Records the time and proof size of a single benchmark iteration. +pub struct BenchmarkRecording<'a> { + on_before_start: Option<&'a dyn Fn()>, + start_extrinsic: Option, + finish_extrinsic: Option, + start_pov: Option, + end_pov: Option, +} + +impl<'a> BenchmarkRecording<'a> { + pub fn new(on_before_start: &'a dyn Fn()) -> Self { + Self { + on_before_start: Some(on_before_start), + start_extrinsic: None, + finish_extrinsic: None, + start_pov: None, + end_pov: None, + } + } +} + +impl<'a> Recording for BenchmarkRecording<'a> { + fn start(&mut self) { + (self.on_before_start.take().expect("start called more than once"))(); + self.start_pov = crate::benchmarking::proof_size(); + self.start_extrinsic = Some(crate::benchmarking::current_time()); + } + + fn stop(&mut self) { + self.finish_extrinsic = Some(crate::benchmarking::current_time()); + self.end_pov = crate::benchmarking::proof_size(); + } +} + +impl<'a> BenchmarkRecording<'a> { + pub fn start_pov(&self) -> Option { + self.start_pov + } + + pub fn end_pov(&self) -> Option { + self.end_pov + } + + pub fn diff_pov(&self) -> Option { + self.start_pov.zip(self.end_pov).map(|(start, end)| end.saturating_sub(start)) + } + + pub fn elapsed_extrinsic(&self) -> Option { + self.start_extrinsic + .zip(self.finish_extrinsic) + .map(|(start, end)| end.saturating_sub(start)) + } +} + /// The required setup for creating a benchmark. /// /// Instance generic parameter is optional and can be used in order to capture unused generics for @@ -381,9 +465,27 @@ pub trait BenchmarkingSetup { /// Set up the storage, and prepare a closure to run the benchmark. fn instance( &self, + recording: &mut impl Recording, components: &[(BenchmarkParameter, u32)], verify: bool, - ) -> Result Result<(), BenchmarkError>>, BenchmarkError>; + ) -> Result<(), BenchmarkError>; + + /// Same as `instance` but passing a closure to run before the benchmark starts. + fn test_instance( + &self, + components: &[(BenchmarkParameter, u32)], + on_before_start: &dyn Fn(), + ) -> Result<(), BenchmarkError> { + return self.instance(&mut TestRecording::new(on_before_start), components, true); + } + + /// Same as `instance` but passing a no-op recording for unit tests. + fn unit_test_instance( + &self, + components: &[(BenchmarkParameter, u32)], + ) -> Result<(), BenchmarkError> { + return self.instance(&mut NoopRecording {}, components, true); + } } /// Grab an account, seeded by a name and index. diff --git a/substrate/frame/benchmarking/src/v1.rs b/substrate/frame/benchmarking/src/v1.rs index 4ad8cc0edd46ccf554493aac274ca79c679eb642..07778646237edc6f4f2fdb0151033dc8cd84aa5f 100644 --- a/substrate/frame/benchmarking/src/v1.rs +++ b/substrate/frame/benchmarking/src/v1.rs @@ -786,9 +786,10 @@ macro_rules! benchmark_backend { fn instance( &self, + recording: &mut impl $crate::Recording, components: &[($crate::BenchmarkParameter, u32)], verify: bool - ) -> Result<$crate::__private::Box Result<(), $crate::BenchmarkError>>, $crate::BenchmarkError> { + ) -> Result<(), $crate::BenchmarkError> { $( // Prepare instance let $param = components.iter() @@ -802,13 +803,14 @@ macro_rules! benchmark_backend { $( $param_instancer ; )* $( $post )* - Ok($crate::__private::Box::new(move || -> Result<(), $crate::BenchmarkError> { - $eval; - if verify { - $postcode; - } - Ok(()) - })) + recording.start(); + $eval; + recording.stop(); + + if verify { + $postcode; + } + Ok(()) } } }; @@ -850,8 +852,8 @@ macro_rules! impl_bench_name_tests { if !($extra) { let disabled = $crate::__private::vec![ $( stringify!($names_extra).as_ref() ),* ]; if disabled.contains(&stringify!($name)) { - $crate::__private::log::error!( - "INFO: extra benchmark skipped - {}", + $crate::__private::log::debug!( + "extra benchmark skipped - {}", stringify!($name), ); return (); @@ -874,21 +876,21 @@ macro_rules! impl_bench_name_tests { $crate::BenchmarkError::Override(_) => { // This is still considered a success condition. $crate::__private::log::error!( - "WARNING: benchmark error overrided - {}", + "benchmark error overridden - {}", stringify!($name), ); }, $crate::BenchmarkError::Skip => { // This is considered a success condition. - $crate::__private::log::error!( - "WARNING: benchmark error skipped - {}", + $crate::__private::log::debug!( + "benchmark skipped - {}", stringify!($name), ); }, $crate::BenchmarkError::Weightless => { // This is considered a success condition. - $crate::__private::log::error!( - "WARNING: benchmark weightless skipped - {}", + $crate::__private::log::debug!( + "benchmark weightless skipped - {}", stringify!($name), ); } @@ -960,14 +962,15 @@ macro_rules! selected_benchmark { fn instance( &self, + recording: &mut impl $crate::Recording, components: &[($crate::BenchmarkParameter, u32)], verify: bool - ) -> Result<$crate::__private::Box Result<(), $crate::BenchmarkError>>, $crate::BenchmarkError> { + ) -> Result<(), $crate::BenchmarkError> { match self { $( Self::$bench => < $bench as $crate::BenchmarkingSetup - >::instance(&$bench, components, verify), + >::instance(&$bench, recording, components, verify), )* } } @@ -1069,18 +1072,7 @@ macro_rules! impl_benchmark { $crate::benchmarking::set_whitelist(whitelist.clone()); let mut results: $crate::__private::Vec<$crate::BenchmarkResult> = $crate::__private::Vec::new(); - - // Always do at least one internal repeat... - for _ in 0 .. internal_repeats.max(1) { - // Always reset the state after the benchmark. - $crate::__private::defer!($crate::benchmarking::wipe_db()); - - // Set up the externalities environment for the setup we want to - // benchmark. - let closure_to_benchmark = < - SelectedBenchmark as $crate::BenchmarkingSetup - >::instance(&selected_benchmark, c, verify)?; - + let on_before_start = || { // Set the block number to at least 1 so events are deposited. if $crate::__private::Zero::is_zero(&frame_system::Pallet::::block_number()) { frame_system::Pallet::::set_block_number(1u32.into()); @@ -1098,6 +1090,12 @@ macro_rules! impl_benchmark { // Reset the read/write counter so we don't count operations in the setup process. $crate::benchmarking::reset_read_write_count(); + }; + + // Always do at least one internal repeat... + for _ in 0 .. internal_repeats.max(1) { + // Always reset the state after the benchmark. + $crate::__private::defer!($crate::benchmarking::wipe_db()); // Time the extrinsic logic. $crate::__private::log::trace!( @@ -1108,20 +1106,14 @@ macro_rules! impl_benchmark { verify ); - let start_pov = $crate::benchmarking::proof_size(); - let start_extrinsic = $crate::benchmarking::current_time(); - - closure_to_benchmark()?; - - let finish_extrinsic = $crate::benchmarking::current_time(); - let end_pov = $crate::benchmarking::proof_size(); + // Set up the externalities environment for the setup we want to + // benchmark. + let mut recording = $crate::BenchmarkRecording::new(&on_before_start); + >::instance(&selected_benchmark, &mut recording, c, verify)?; // Calculate the diff caused by the benchmark. - let elapsed_extrinsic = finish_extrinsic.saturating_sub(start_extrinsic); - let diff_pov = match (start_pov, end_pov) { - (Some(start), Some(end)) => end.saturating_sub(start), - _ => Default::default(), - }; + let elapsed_extrinsic = recording.elapsed_extrinsic().expect("elapsed time should be recorded"); + let diff_pov = recording.diff_pov().unwrap_or_default(); // Commit the changes to get proper write count $crate::benchmarking::commit_db(); @@ -1136,7 +1128,7 @@ macro_rules! impl_benchmark { ); $crate::__private::log::trace!( target: "benchmark", - "Proof sizes: before {:?} after {:?} diff {}", &start_pov, &end_pov, &diff_pov + "Proof sizes: before {:?} after {:?} diff {}", recording.start_pov(), recording.end_pov(), &diff_pov ); // Time the storage root recalculation. @@ -1230,18 +1222,15 @@ macro_rules! impl_benchmark_test { // Always reset the state after the benchmark. $crate::__private::defer!($crate::benchmarking::wipe_db()); - // Set up the benchmark, return execution + verification function. - let closure_to_verify = < - SelectedBenchmark as $crate::BenchmarkingSetup - >::instance(&selected_benchmark, &c, true)?; - - // Set the block number to at least 1 so events are deposited. - if $crate::__private::Zero::is_zero(&frame_system::Pallet::::block_number()) { - frame_system::Pallet::::set_block_number(1u32.into()); - } + let on_before_start = || { + // Set the block number to at least 1 so events are deposited. + if $crate::__private::Zero::is_zero(&frame_system::Pallet::::block_number()) { + frame_system::Pallet::::set_block_number(1u32.into()); + } + }; // Run execution + verification - closure_to_verify() + >::test_instance(&selected_benchmark, &c, &on_before_start) }; if components.is_empty() { @@ -1704,7 +1693,7 @@ macro_rules! impl_test_function { $crate::BenchmarkError::Override(_) => { // This is still considered a success condition. $crate::__private::log::error!( - "WARNING: benchmark error overrided - {}", + "WARNING: benchmark error overridden - {}", $crate::__private::str::from_utf8(benchmark_name) .expect("benchmark name is always a valid string!"), ); @@ -1851,7 +1840,7 @@ macro_rules! add_benchmark { Err($crate::BenchmarkError::Override(mut result)) => { // Insert override warning as the first storage key. $crate::__private::log::error!( - "WARNING: benchmark error overrided - {}", + "WARNING: benchmark error overridden - {}", $crate::__private::str::from_utf8(benchmark) .expect("benchmark name is always a valid string!") ); diff --git a/substrate/frame/benchmarking/src/weights.rs b/substrate/frame/benchmarking/src/weights.rs index 13d73e420cce256080d117e3bab56842d302b3a0..ea9ef6eb5c6d9d2895ffbcccb324e762d1eb6b1a 100644 --- a/substrate/frame/benchmarking/src/weights.rs +++ b/substrate/frame/benchmarking/src/weights.rs @@ -15,16 +15,16 @@ // See the License for the specific language governing permissions and // limitations under the License. -//! Autogenerated weights for frame_benchmarking +//! Autogenerated weights for `frame_benchmarking` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-06-16, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-04-08, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-e8ezs4ez-project-145-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("dev"), DB CACHE: 1024 +//! HOSTNAME: `runner-anb7yjbi-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: `1024` // Executed Command: -// ./target/production/substrate +// ./target/production/substrate-node // benchmark // pallet // --chain=dev @@ -35,12 +35,11 @@ // --no-median-slopes // --no-min-squares // --extrinsic=* -// --execution=wasm // --wasm-execution=compiled // --heap-pages=4096 -// --output=./frame/benchmarking/src/weights.rs -// --header=./HEADER-APACHE2 -// --template=./.maintain/frame-weight-template.hbs +// --output=./substrate/frame/benchmarking/src/weights.rs +// --header=./substrate/HEADER-APACHE2 +// --template=./substrate/.maintain/frame-weight-template.hbs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -50,7 +49,7 @@ use frame_support::{traits::Get, weights::{Weight, constants::RocksDbWeight}}; use core::marker::PhantomData; -/// Weight functions needed for frame_benchmarking. +/// Weight functions needed for `frame_benchmarking`. pub trait WeightInfo { fn addition(i: u32, ) -> Weight; fn subtraction(i: u32, ) -> Weight; @@ -60,7 +59,7 @@ pub trait WeightInfo { fn sr25519_verification(i: u32, ) -> Weight; } -/// Weights for frame_benchmarking using the Substrate node and recommended hardware. +/// Weights for `frame_benchmarking` using the Substrate node and recommended hardware. pub struct SubstrateWeight(PhantomData); impl WeightInfo for SubstrateWeight { /// The range of component `i` is `[0, 1000000]`. @@ -68,101 +67,101 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 147_000 picoseconds. - Weight::from_parts(185_656, 0) + // Minimum execution time: 132_000 picoseconds. + Weight::from_parts(160_546, 0) } /// The range of component `i` is `[0, 1000000]`. fn subtraction(_i: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 146_000 picoseconds. - Weight::from_parts(189_816, 0) + // Minimum execution time: 133_000 picoseconds. + Weight::from_parts(171_395, 0) } /// The range of component `i` is `[0, 1000000]`. fn multiplication(_i: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 148_000 picoseconds. - Weight::from_parts(202_367, 0) + // Minimum execution time: 126_000 picoseconds. + Weight::from_parts(166_417, 0) } /// The range of component `i` is `[0, 1000000]`. fn division(_i: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 143_000 picoseconds. - Weight::from_parts(189_693, 0) + // Minimum execution time: 131_000 picoseconds. + Weight::from_parts(166_348, 0) } fn hashing() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 24_167_071_000 picoseconds. - Weight::from_parts(24_391_749_000, 0) + // Minimum execution time: 26_583_601_000 picoseconds. + Weight::from_parts(26_795_212_000, 0) } /// The range of component `i` is `[0, 100]`. fn sr25519_verification(i: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 231_000 picoseconds. - Weight::from_parts(2_998_013, 0) - // Standard Error: 6_256 - .saturating_add(Weight::from_parts(55_456_705, 0).saturating_mul(i.into())) + // Minimum execution time: 158_000 picoseconds. + Weight::from_parts(5_277_102, 0) + // Standard Error: 6_279 + .saturating_add(Weight::from_parts(40_610_511, 0).saturating_mul(i.into())) } } -// For backwards compatibility and tests +// For backwards compatibility and tests. impl WeightInfo for () { /// The range of component `i` is `[0, 1000000]`. fn addition(_i: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 147_000 picoseconds. - Weight::from_parts(185_656, 0) + // Minimum execution time: 132_000 picoseconds. + Weight::from_parts(160_546, 0) } /// The range of component `i` is `[0, 1000000]`. fn subtraction(_i: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 146_000 picoseconds. - Weight::from_parts(189_816, 0) + // Minimum execution time: 133_000 picoseconds. + Weight::from_parts(171_395, 0) } /// The range of component `i` is `[0, 1000000]`. fn multiplication(_i: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 148_000 picoseconds. - Weight::from_parts(202_367, 0) + // Minimum execution time: 126_000 picoseconds. + Weight::from_parts(166_417, 0) } /// The range of component `i` is `[0, 1000000]`. fn division(_i: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 143_000 picoseconds. - Weight::from_parts(189_693, 0) + // Minimum execution time: 131_000 picoseconds. + Weight::from_parts(166_348, 0) } fn hashing() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 24_167_071_000 picoseconds. - Weight::from_parts(24_391_749_000, 0) + // Minimum execution time: 26_583_601_000 picoseconds. + Weight::from_parts(26_795_212_000, 0) } /// The range of component `i` is `[0, 100]`. fn sr25519_verification(i: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 231_000 picoseconds. - Weight::from_parts(2_998_013, 0) - // Standard Error: 6_256 - .saturating_add(Weight::from_parts(55_456_705, 0).saturating_mul(i.into())) + // Minimum execution time: 158_000 picoseconds. + Weight::from_parts(5_277_102, 0) + // Standard Error: 6_279 + .saturating_add(Weight::from_parts(40_610_511, 0).saturating_mul(i.into())) } } diff --git a/substrate/frame/bounties/Cargo.toml b/substrate/frame/bounties/Cargo.toml index df7c3c0cbe56098a03a87e462f71da07f4432f8f..3307e47e9818934d629ff1989aff08ff03de9acf 100644 --- a/substrate/frame/bounties/Cargo.toml +++ b/substrate/frame/bounties/Cargo.toml @@ -19,8 +19,8 @@ targets = ["x86_64-unknown-linux-gnu"] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = [ "derive", ] } -log = { version = "0.4.17", default-features = false } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +log = { workspace = true } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } frame-benchmarking = { path = "../benchmarking", default-features = false, optional = true } frame-support = { path = "../support", default-features = false } frame-system = { path = "../system", default-features = false } diff --git a/substrate/frame/bounties/src/migrations/v4.rs b/substrate/frame/bounties/src/migrations/v4.rs index 4e6ba934481628f8aeca3647711cec8a7ab0fd45..71cd4f76be6e2702a1b91a390faef3111fb1a46a 100644 --- a/substrate/frame/bounties/src/migrations/v4.rs +++ b/substrate/frame/bounties/src/migrations/v4.rs @@ -15,6 +15,7 @@ // See the License for the specific language governing permissions and // limitations under the License. +use core::str; use frame_support::{ storage::{generator::StorageValue, StoragePrefixedMap}, traits::{ @@ -25,7 +26,6 @@ use frame_support::{ }; use sp_core::hexdisplay::HexDisplay; use sp_io::{hashing::twox_128, storage}; -use sp_std::str; use crate as pallet_bounties; diff --git a/substrate/frame/bounties/src/tests.rs b/substrate/frame/bounties/src/tests.rs index b0e3c085e65df02413f121fc4c819c823822cfab..de747db53749902ad6164265e3cad139ddefa7da 100644 --- a/substrate/frame/bounties/src/tests.rs +++ b/substrate/frame/bounties/src/tests.rs @@ -31,9 +31,8 @@ use frame_support::{ PalletId, }; -use sp_core::H256; use sp_runtime::{ - traits::{BadOrigin, BlakeTwo256, IdentityLookup}, + traits::{BadOrigin, IdentityLookup}, BuildStorage, Perbill, Storage, }; @@ -59,31 +58,12 @@ parameter_types! { type Balance = u64; -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { - type BaseCallFilter = frame_support::traits::Everything; - type BlockWeights = (); - type BlockLength = (); - type DbWeight = (); - type RuntimeOrigin = RuntimeOrigin; - type Nonce = u64; - type RuntimeCall = RuntimeCall; - type Hash = H256; - type Hashing = BlakeTwo256; type AccountId = u128; // u64 is not enough to hold bytes used to generate bounty account type Lookup = IdentityLookup; type Block = Block; - type RuntimeEvent = RuntimeEvent; - type BlockHashCount = ConstU64<250>; - type Version = (); - type PalletInfo = PalletInfo; type AccountData = pallet_balances::AccountData; - type OnNewAccount = (); - type OnKilledAccount = (); - type SystemWeightInfo = (); - type SS58Prefix = (); - type OnSetCode = (); - type MaxConsumers = frame_support::traits::ConstU32<16>; } impl pallet_balances::Config for Test { diff --git a/substrate/frame/bounties/src/weights.rs b/substrate/frame/bounties/src/weights.rs index a172d15b56cc9a2a4686e3d6af61d9560635d5be..c9f551ec9bb2421098b13eaa7ea4beecbdf13d70 100644 --- a/substrate/frame/bounties/src/weights.rs +++ b/substrate/frame/bounties/src/weights.rs @@ -15,16 +15,16 @@ // See the License for the specific language governing permissions and // limitations under the License. -//! Autogenerated weights for pallet_bounties +//! Autogenerated weights for `pallet_bounties` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-06-16, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-04-08, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-e8ezs4ez-project-145-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("dev"), DB CACHE: 1024 +//! HOSTNAME: `runner-anb7yjbi-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: `1024` // Executed Command: -// ./target/production/substrate +// ./target/production/substrate-node // benchmark // pallet // --chain=dev @@ -35,12 +35,11 @@ // --no-median-slopes // --no-min-squares // --extrinsic=* -// --execution=wasm // --wasm-execution=compiled // --heap-pages=4096 -// --output=./frame/bounties/src/weights.rs -// --header=./HEADER-APACHE2 -// --template=./.maintain/frame-weight-template.hbs +// --output=./substrate/frame/bounties/src/weights.rs +// --header=./substrate/HEADER-APACHE2 +// --template=./substrate/.maintain/frame-weight-template.hbs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -50,7 +49,7 @@ use frame_support::{traits::Get, weights::{Weight, constants::RocksDbWeight}}; use core::marker::PhantomData; -/// Weight functions needed for pallet_bounties. +/// Weight functions needed for `pallet_bounties`. pub trait WeightInfo { fn propose_bounty(d: u32, ) -> Weight; fn approve_bounty() -> Weight; @@ -65,169 +64,169 @@ pub trait WeightInfo { fn spend_funds(b: u32, ) -> Weight; } -/// Weights for pallet_bounties using the Substrate node and recommended hardware. +/// Weights for `pallet_bounties` using the Substrate node and recommended hardware. pub struct SubstrateWeight(PhantomData); impl WeightInfo for SubstrateWeight { - /// Storage: Bounties BountyCount (r:1 w:1) - /// Proof: Bounties BountyCount (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) - /// Storage: Bounties BountyDescriptions (r:0 w:1) - /// Proof: Bounties BountyDescriptions (max_values: None, max_size: Some(314), added: 2789, mode: MaxEncodedLen) - /// Storage: Bounties Bounties (r:0 w:1) - /// Proof: Bounties Bounties (max_values: None, max_size: Some(177), added: 2652, mode: MaxEncodedLen) + /// Storage: `Bounties::BountyCount` (r:1 w:1) + /// Proof: `Bounties::BountyCount` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `Bounties::BountyDescriptions` (r:0 w:1) + /// Proof: `Bounties::BountyDescriptions` (`max_values`: None, `max_size`: Some(314), added: 2789, mode: `MaxEncodedLen`) + /// Storage: `Bounties::Bounties` (r:0 w:1) + /// Proof: `Bounties::Bounties` (`max_values`: None, `max_size`: Some(177), added: 2652, mode: `MaxEncodedLen`) /// The range of component `d` is `[0, 300]`. fn propose_bounty(d: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `276` + // Measured: `309` // Estimated: `3593` - // Minimum execution time: 29_384_000 picoseconds. - Weight::from_parts(30_820_018, 3593) - // Standard Error: 298 - .saturating_add(Weight::from_parts(2_920, 0).saturating_mul(d.into())) + // Minimum execution time: 25_206_000 picoseconds. + Weight::from_parts(26_925_800, 3593) + // Standard Error: 239 + .saturating_add(Weight::from_parts(501, 0).saturating_mul(d.into())) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(4_u64)) } - /// Storage: Bounties Bounties (r:1 w:1) - /// Proof: Bounties Bounties (max_values: None, max_size: Some(177), added: 2652, mode: MaxEncodedLen) - /// Storage: Bounties BountyApprovals (r:1 w:1) - /// Proof: Bounties BountyApprovals (max_values: Some(1), max_size: Some(402), added: 897, mode: MaxEncodedLen) + /// Storage: `Bounties::Bounties` (r:1 w:1) + /// Proof: `Bounties::Bounties` (`max_values`: None, `max_size`: Some(177), added: 2652, mode: `MaxEncodedLen`) + /// Storage: `Bounties::BountyApprovals` (r:1 w:1) + /// Proof: `Bounties::BountyApprovals` (`max_values`: Some(1), `max_size`: Some(402), added: 897, mode: `MaxEncodedLen`) fn approve_bounty() -> Weight { // Proof Size summary in bytes: - // Measured: `368` + // Measured: `401` // Estimated: `3642` - // Minimum execution time: 10_873_000 picoseconds. - Weight::from_parts(11_421_000, 3642) + // Minimum execution time: 13_150_000 picoseconds. + Weight::from_parts(13_708_000, 3642) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } - /// Storage: Bounties Bounties (r:1 w:1) - /// Proof: Bounties Bounties (max_values: None, max_size: Some(177), added: 2652, mode: MaxEncodedLen) + /// Storage: `Bounties::Bounties` (r:1 w:1) + /// Proof: `Bounties::Bounties` (`max_values`: None, `max_size`: Some(177), added: 2652, mode: `MaxEncodedLen`) fn propose_curator() -> Weight { // Proof Size summary in bytes: - // Measured: `388` + // Measured: `421` // Estimated: `3642` - // Minimum execution time: 9_181_000 picoseconds. - Weight::from_parts(9_726_000, 3642) + // Minimum execution time: 12_277_000 picoseconds. + Weight::from_parts(12_769_000, 3642) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: Bounties Bounties (r:1 w:1) - /// Proof: Bounties Bounties (max_values: None, max_size: Some(177), added: 2652, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: `Bounties::Bounties` (r:1 w:1) + /// Proof: `Bounties::Bounties` (`max_values`: None, `max_size`: Some(177), added: 2652, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) fn unassign_curator() -> Weight { // Proof Size summary in bytes: - // Measured: `564` + // Measured: `597` // Estimated: `3642` - // Minimum execution time: 30_257_000 picoseconds. - Weight::from_parts(30_751_000, 3642) + // Minimum execution time: 29_041_000 picoseconds. + Weight::from_parts(29_979_000, 3642) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } - /// Storage: Bounties Bounties (r:1 w:1) - /// Proof: Bounties Bounties (max_values: None, max_size: Some(177), added: 2652, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: `Bounties::Bounties` (r:1 w:1) + /// Proof: `Bounties::Bounties` (`max_values`: None, `max_size`: Some(177), added: 2652, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) fn accept_curator() -> Weight { // Proof Size summary in bytes: - // Measured: `560` + // Measured: `593` // Estimated: `3642` - // Minimum execution time: 27_850_000 picoseconds. - Weight::from_parts(28_821_000, 3642) + // Minimum execution time: 27_936_000 picoseconds. + Weight::from_parts(28_925_000, 3642) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } - /// Storage: Bounties Bounties (r:1 w:1) - /// Proof: Bounties Bounties (max_values: None, max_size: Some(177), added: 2652, mode: MaxEncodedLen) - /// Storage: ChildBounties ParentChildBounties (r:1 w:0) - /// Proof: ChildBounties ParentChildBounties (max_values: None, max_size: Some(16), added: 2491, mode: MaxEncodedLen) + /// Storage: `Bounties::Bounties` (r:1 w:1) + /// Proof: `Bounties::Bounties` (`max_values`: None, `max_size`: Some(177), added: 2652, mode: `MaxEncodedLen`) + /// Storage: `ChildBounties::ParentChildBounties` (r:1 w:0) + /// Proof: `ChildBounties::ParentChildBounties` (`max_values`: None, `max_size`: Some(16), added: 2491, mode: `MaxEncodedLen`) fn award_bounty() -> Weight { // Proof Size summary in bytes: - // Measured: `572` + // Measured: `605` // Estimated: `3642` - // Minimum execution time: 19_164_000 picoseconds. - Weight::from_parts(20_136_000, 3642) + // Minimum execution time: 16_759_000 picoseconds. + Weight::from_parts(17_699_000, 3642) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: Bounties Bounties (r:1 w:1) - /// Proof: Bounties Bounties (max_values: None, max_size: Some(177), added: 2652, mode: MaxEncodedLen) - /// Storage: System Account (r:3 w:3) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) - /// Storage: ChildBounties ChildrenCuratorFees (r:1 w:1) - /// Proof: ChildBounties ChildrenCuratorFees (max_values: None, max_size: Some(28), added: 2503, mode: MaxEncodedLen) - /// Storage: Bounties BountyDescriptions (r:0 w:1) - /// Proof: Bounties BountyDescriptions (max_values: None, max_size: Some(314), added: 2789, mode: MaxEncodedLen) + /// Storage: `Bounties::Bounties` (r:1 w:1) + /// Proof: `Bounties::Bounties` (`max_values`: None, `max_size`: Some(177), added: 2652, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:3 w:3) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `ChildBounties::ChildrenCuratorFees` (r:1 w:1) + /// Proof: `ChildBounties::ChildrenCuratorFees` (`max_values`: None, `max_size`: Some(28), added: 2503, mode: `MaxEncodedLen`) + /// Storage: `Bounties::BountyDescriptions` (r:0 w:1) + /// Proof: `Bounties::BountyDescriptions` (`max_values`: None, `max_size`: Some(314), added: 2789, mode: `MaxEncodedLen`) fn claim_bounty() -> Weight { // Proof Size summary in bytes: - // Measured: `936` + // Measured: `969` // Estimated: `8799` - // Minimum execution time: 120_235_000 picoseconds. - Weight::from_parts(121_673_000, 8799) + // Minimum execution time: 112_056_000 picoseconds. + Weight::from_parts(114_275_000, 8799) .saturating_add(T::DbWeight::get().reads(5_u64)) .saturating_add(T::DbWeight::get().writes(6_u64)) } - /// Storage: Bounties Bounties (r:1 w:1) - /// Proof: Bounties Bounties (max_values: None, max_size: Some(177), added: 2652, mode: MaxEncodedLen) - /// Storage: ChildBounties ParentChildBounties (r:1 w:0) - /// Proof: ChildBounties ParentChildBounties (max_values: None, max_size: Some(16), added: 2491, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) - /// Storage: Bounties BountyDescriptions (r:0 w:1) - /// Proof: Bounties BountyDescriptions (max_values: None, max_size: Some(314), added: 2789, mode: MaxEncodedLen) + /// Storage: `Bounties::Bounties` (r:1 w:1) + /// Proof: `Bounties::Bounties` (`max_values`: None, `max_size`: Some(177), added: 2652, mode: `MaxEncodedLen`) + /// Storage: `ChildBounties::ParentChildBounties` (r:1 w:0) + /// Proof: `ChildBounties::ParentChildBounties` (`max_values`: None, `max_size`: Some(16), added: 2491, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `Bounties::BountyDescriptions` (r:0 w:1) + /// Proof: `Bounties::BountyDescriptions` (`max_values`: None, `max_size`: Some(314), added: 2789, mode: `MaxEncodedLen`) fn close_bounty_proposed() -> Weight { // Proof Size summary in bytes: - // Measured: `616` + // Measured: `649` // Estimated: `3642` - // Minimum execution time: 35_713_000 picoseconds. - Weight::from_parts(37_174_000, 3642) + // Minimum execution time: 32_625_000 picoseconds. + Weight::from_parts(33_719_000, 3642) .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(3_u64)) } - /// Storage: Bounties Bounties (r:1 w:1) - /// Proof: Bounties Bounties (max_values: None, max_size: Some(177), added: 2652, mode: MaxEncodedLen) - /// Storage: ChildBounties ParentChildBounties (r:1 w:0) - /// Proof: ChildBounties ParentChildBounties (max_values: None, max_size: Some(16), added: 2491, mode: MaxEncodedLen) - /// Storage: System Account (r:2 w:2) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) - /// Storage: Bounties BountyDescriptions (r:0 w:1) - /// Proof: Bounties BountyDescriptions (max_values: None, max_size: Some(314), added: 2789, mode: MaxEncodedLen) + /// Storage: `Bounties::Bounties` (r:1 w:1) + /// Proof: `Bounties::Bounties` (`max_values`: None, `max_size`: Some(177), added: 2652, mode: `MaxEncodedLen`) + /// Storage: `ChildBounties::ParentChildBounties` (r:1 w:0) + /// Proof: `ChildBounties::ParentChildBounties` (`max_values`: None, `max_size`: Some(16), added: 2491, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:2 w:2) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `Bounties::BountyDescriptions` (r:0 w:1) + /// Proof: `Bounties::BountyDescriptions` (`max_values`: None, `max_size`: Some(314), added: 2789, mode: `MaxEncodedLen`) fn close_bounty_active() -> Weight { // Proof Size summary in bytes: - // Measured: `852` + // Measured: `885` // Estimated: `6196` - // Minimum execution time: 81_037_000 picoseconds. - Weight::from_parts(83_294_000, 6196) + // Minimum execution time: 76_895_000 picoseconds. + Weight::from_parts(79_161_000, 6196) .saturating_add(T::DbWeight::get().reads(4_u64)) .saturating_add(T::DbWeight::get().writes(4_u64)) } - /// Storage: Bounties Bounties (r:1 w:1) - /// Proof: Bounties Bounties (max_values: None, max_size: Some(177), added: 2652, mode: MaxEncodedLen) + /// Storage: `Bounties::Bounties` (r:1 w:1) + /// Proof: `Bounties::Bounties` (`max_values`: None, `max_size`: Some(177), added: 2652, mode: `MaxEncodedLen`) fn extend_bounty_expiry() -> Weight { // Proof Size summary in bytes: - // Measured: `424` + // Measured: `457` // Estimated: `3642` - // Minimum execution time: 15_348_000 picoseconds. - Weight::from_parts(15_776_000, 3642) + // Minimum execution time: 12_635_000 picoseconds. + Weight::from_parts(13_423_000, 3642) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: Bounties BountyApprovals (r:1 w:1) - /// Proof: Bounties BountyApprovals (max_values: Some(1), max_size: Some(402), added: 897, mode: MaxEncodedLen) - /// Storage: Bounties Bounties (r:100 w:100) - /// Proof: Bounties Bounties (max_values: None, max_size: Some(177), added: 2652, mode: MaxEncodedLen) - /// Storage: System Account (r:200 w:200) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: `Bounties::BountyApprovals` (r:1 w:1) + /// Proof: `Bounties::BountyApprovals` (`max_values`: Some(1), `max_size`: Some(402), added: 897, mode: `MaxEncodedLen`) + /// Storage: `Bounties::Bounties` (r:100 w:100) + /// Proof: `Bounties::Bounties` (`max_values`: None, `max_size`: Some(177), added: 2652, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:200 w:200) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) /// The range of component `b` is `[0, 100]`. fn spend_funds(b: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `4 + b * (297 ±0)` + // Measured: `37 + b * (297 ±0)` // Estimated: `1887 + b * (5206 ±0)` - // Minimum execution time: 5_082_000 picoseconds. - Weight::from_parts(5_126_000, 1887) - // Standard Error: 21_949 - .saturating_add(Weight::from_parts(42_635_308, 0).saturating_mul(b.into())) + // Minimum execution time: 2_840_000 picoseconds. + Weight::from_parts(6_076_743, 1887) + // Standard Error: 18_569 + .saturating_add(Weight::from_parts(34_771_846, 0).saturating_mul(b.into())) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().reads((3_u64).saturating_mul(b.into()))) .saturating_add(T::DbWeight::get().writes(1_u64)) @@ -236,168 +235,168 @@ impl WeightInfo for SubstrateWeight { } } -// For backwards compatibility and tests +// For backwards compatibility and tests. impl WeightInfo for () { - /// Storage: Bounties BountyCount (r:1 w:1) - /// Proof: Bounties BountyCount (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) - /// Storage: Bounties BountyDescriptions (r:0 w:1) - /// Proof: Bounties BountyDescriptions (max_values: None, max_size: Some(314), added: 2789, mode: MaxEncodedLen) - /// Storage: Bounties Bounties (r:0 w:1) - /// Proof: Bounties Bounties (max_values: None, max_size: Some(177), added: 2652, mode: MaxEncodedLen) + /// Storage: `Bounties::BountyCount` (r:1 w:1) + /// Proof: `Bounties::BountyCount` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `Bounties::BountyDescriptions` (r:0 w:1) + /// Proof: `Bounties::BountyDescriptions` (`max_values`: None, `max_size`: Some(314), added: 2789, mode: `MaxEncodedLen`) + /// Storage: `Bounties::Bounties` (r:0 w:1) + /// Proof: `Bounties::Bounties` (`max_values`: None, `max_size`: Some(177), added: 2652, mode: `MaxEncodedLen`) /// The range of component `d` is `[0, 300]`. fn propose_bounty(d: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `276` + // Measured: `309` // Estimated: `3593` - // Minimum execution time: 29_384_000 picoseconds. - Weight::from_parts(30_820_018, 3593) - // Standard Error: 298 - .saturating_add(Weight::from_parts(2_920, 0).saturating_mul(d.into())) + // Minimum execution time: 25_206_000 picoseconds. + Weight::from_parts(26_925_800, 3593) + // Standard Error: 239 + .saturating_add(Weight::from_parts(501, 0).saturating_mul(d.into())) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(4_u64)) } - /// Storage: Bounties Bounties (r:1 w:1) - /// Proof: Bounties Bounties (max_values: None, max_size: Some(177), added: 2652, mode: MaxEncodedLen) - /// Storage: Bounties BountyApprovals (r:1 w:1) - /// Proof: Bounties BountyApprovals (max_values: Some(1), max_size: Some(402), added: 897, mode: MaxEncodedLen) + /// Storage: `Bounties::Bounties` (r:1 w:1) + /// Proof: `Bounties::Bounties` (`max_values`: None, `max_size`: Some(177), added: 2652, mode: `MaxEncodedLen`) + /// Storage: `Bounties::BountyApprovals` (r:1 w:1) + /// Proof: `Bounties::BountyApprovals` (`max_values`: Some(1), `max_size`: Some(402), added: 897, mode: `MaxEncodedLen`) fn approve_bounty() -> Weight { // Proof Size summary in bytes: - // Measured: `368` + // Measured: `401` // Estimated: `3642` - // Minimum execution time: 10_873_000 picoseconds. - Weight::from_parts(11_421_000, 3642) + // Minimum execution time: 13_150_000 picoseconds. + Weight::from_parts(13_708_000, 3642) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } - /// Storage: Bounties Bounties (r:1 w:1) - /// Proof: Bounties Bounties (max_values: None, max_size: Some(177), added: 2652, mode: MaxEncodedLen) + /// Storage: `Bounties::Bounties` (r:1 w:1) + /// Proof: `Bounties::Bounties` (`max_values`: None, `max_size`: Some(177), added: 2652, mode: `MaxEncodedLen`) fn propose_curator() -> Weight { // Proof Size summary in bytes: - // Measured: `388` + // Measured: `421` // Estimated: `3642` - // Minimum execution time: 9_181_000 picoseconds. - Weight::from_parts(9_726_000, 3642) + // Minimum execution time: 12_277_000 picoseconds. + Weight::from_parts(12_769_000, 3642) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Bounties Bounties (r:1 w:1) - /// Proof: Bounties Bounties (max_values: None, max_size: Some(177), added: 2652, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: `Bounties::Bounties` (r:1 w:1) + /// Proof: `Bounties::Bounties` (`max_values`: None, `max_size`: Some(177), added: 2652, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) fn unassign_curator() -> Weight { // Proof Size summary in bytes: - // Measured: `564` + // Measured: `597` // Estimated: `3642` - // Minimum execution time: 30_257_000 picoseconds. - Weight::from_parts(30_751_000, 3642) + // Minimum execution time: 29_041_000 picoseconds. + Weight::from_parts(29_979_000, 3642) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } - /// Storage: Bounties Bounties (r:1 w:1) - /// Proof: Bounties Bounties (max_values: None, max_size: Some(177), added: 2652, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: `Bounties::Bounties` (r:1 w:1) + /// Proof: `Bounties::Bounties` (`max_values`: None, `max_size`: Some(177), added: 2652, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) fn accept_curator() -> Weight { // Proof Size summary in bytes: - // Measured: `560` + // Measured: `593` // Estimated: `3642` - // Minimum execution time: 27_850_000 picoseconds. - Weight::from_parts(28_821_000, 3642) + // Minimum execution time: 27_936_000 picoseconds. + Weight::from_parts(28_925_000, 3642) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } - /// Storage: Bounties Bounties (r:1 w:1) - /// Proof: Bounties Bounties (max_values: None, max_size: Some(177), added: 2652, mode: MaxEncodedLen) - /// Storage: ChildBounties ParentChildBounties (r:1 w:0) - /// Proof: ChildBounties ParentChildBounties (max_values: None, max_size: Some(16), added: 2491, mode: MaxEncodedLen) + /// Storage: `Bounties::Bounties` (r:1 w:1) + /// Proof: `Bounties::Bounties` (`max_values`: None, `max_size`: Some(177), added: 2652, mode: `MaxEncodedLen`) + /// Storage: `ChildBounties::ParentChildBounties` (r:1 w:0) + /// Proof: `ChildBounties::ParentChildBounties` (`max_values`: None, `max_size`: Some(16), added: 2491, mode: `MaxEncodedLen`) fn award_bounty() -> Weight { // Proof Size summary in bytes: - // Measured: `572` + // Measured: `605` // Estimated: `3642` - // Minimum execution time: 19_164_000 picoseconds. - Weight::from_parts(20_136_000, 3642) + // Minimum execution time: 16_759_000 picoseconds. + Weight::from_parts(17_699_000, 3642) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Bounties Bounties (r:1 w:1) - /// Proof: Bounties Bounties (max_values: None, max_size: Some(177), added: 2652, mode: MaxEncodedLen) - /// Storage: System Account (r:3 w:3) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) - /// Storage: ChildBounties ChildrenCuratorFees (r:1 w:1) - /// Proof: ChildBounties ChildrenCuratorFees (max_values: None, max_size: Some(28), added: 2503, mode: MaxEncodedLen) - /// Storage: Bounties BountyDescriptions (r:0 w:1) - /// Proof: Bounties BountyDescriptions (max_values: None, max_size: Some(314), added: 2789, mode: MaxEncodedLen) + /// Storage: `Bounties::Bounties` (r:1 w:1) + /// Proof: `Bounties::Bounties` (`max_values`: None, `max_size`: Some(177), added: 2652, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:3 w:3) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `ChildBounties::ChildrenCuratorFees` (r:1 w:1) + /// Proof: `ChildBounties::ChildrenCuratorFees` (`max_values`: None, `max_size`: Some(28), added: 2503, mode: `MaxEncodedLen`) + /// Storage: `Bounties::BountyDescriptions` (r:0 w:1) + /// Proof: `Bounties::BountyDescriptions` (`max_values`: None, `max_size`: Some(314), added: 2789, mode: `MaxEncodedLen`) fn claim_bounty() -> Weight { // Proof Size summary in bytes: - // Measured: `936` + // Measured: `969` // Estimated: `8799` - // Minimum execution time: 120_235_000 picoseconds. - Weight::from_parts(121_673_000, 8799) + // Minimum execution time: 112_056_000 picoseconds. + Weight::from_parts(114_275_000, 8799) .saturating_add(RocksDbWeight::get().reads(5_u64)) .saturating_add(RocksDbWeight::get().writes(6_u64)) } - /// Storage: Bounties Bounties (r:1 w:1) - /// Proof: Bounties Bounties (max_values: None, max_size: Some(177), added: 2652, mode: MaxEncodedLen) - /// Storage: ChildBounties ParentChildBounties (r:1 w:0) - /// Proof: ChildBounties ParentChildBounties (max_values: None, max_size: Some(16), added: 2491, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) - /// Storage: Bounties BountyDescriptions (r:0 w:1) - /// Proof: Bounties BountyDescriptions (max_values: None, max_size: Some(314), added: 2789, mode: MaxEncodedLen) + /// Storage: `Bounties::Bounties` (r:1 w:1) + /// Proof: `Bounties::Bounties` (`max_values`: None, `max_size`: Some(177), added: 2652, mode: `MaxEncodedLen`) + /// Storage: `ChildBounties::ParentChildBounties` (r:1 w:0) + /// Proof: `ChildBounties::ParentChildBounties` (`max_values`: None, `max_size`: Some(16), added: 2491, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `Bounties::BountyDescriptions` (r:0 w:1) + /// Proof: `Bounties::BountyDescriptions` (`max_values`: None, `max_size`: Some(314), added: 2789, mode: `MaxEncodedLen`) fn close_bounty_proposed() -> Weight { // Proof Size summary in bytes: - // Measured: `616` + // Measured: `649` // Estimated: `3642` - // Minimum execution time: 35_713_000 picoseconds. - Weight::from_parts(37_174_000, 3642) + // Minimum execution time: 32_625_000 picoseconds. + Weight::from_parts(33_719_000, 3642) .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(3_u64)) } - /// Storage: Bounties Bounties (r:1 w:1) - /// Proof: Bounties Bounties (max_values: None, max_size: Some(177), added: 2652, mode: MaxEncodedLen) - /// Storage: ChildBounties ParentChildBounties (r:1 w:0) - /// Proof: ChildBounties ParentChildBounties (max_values: None, max_size: Some(16), added: 2491, mode: MaxEncodedLen) - /// Storage: System Account (r:2 w:2) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) - /// Storage: Bounties BountyDescriptions (r:0 w:1) - /// Proof: Bounties BountyDescriptions (max_values: None, max_size: Some(314), added: 2789, mode: MaxEncodedLen) + /// Storage: `Bounties::Bounties` (r:1 w:1) + /// Proof: `Bounties::Bounties` (`max_values`: None, `max_size`: Some(177), added: 2652, mode: `MaxEncodedLen`) + /// Storage: `ChildBounties::ParentChildBounties` (r:1 w:0) + /// Proof: `ChildBounties::ParentChildBounties` (`max_values`: None, `max_size`: Some(16), added: 2491, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:2 w:2) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `Bounties::BountyDescriptions` (r:0 w:1) + /// Proof: `Bounties::BountyDescriptions` (`max_values`: None, `max_size`: Some(314), added: 2789, mode: `MaxEncodedLen`) fn close_bounty_active() -> Weight { // Proof Size summary in bytes: - // Measured: `852` + // Measured: `885` // Estimated: `6196` - // Minimum execution time: 81_037_000 picoseconds. - Weight::from_parts(83_294_000, 6196) + // Minimum execution time: 76_895_000 picoseconds. + Weight::from_parts(79_161_000, 6196) .saturating_add(RocksDbWeight::get().reads(4_u64)) .saturating_add(RocksDbWeight::get().writes(4_u64)) } - /// Storage: Bounties Bounties (r:1 w:1) - /// Proof: Bounties Bounties (max_values: None, max_size: Some(177), added: 2652, mode: MaxEncodedLen) + /// Storage: `Bounties::Bounties` (r:1 w:1) + /// Proof: `Bounties::Bounties` (`max_values`: None, `max_size`: Some(177), added: 2652, mode: `MaxEncodedLen`) fn extend_bounty_expiry() -> Weight { // Proof Size summary in bytes: - // Measured: `424` + // Measured: `457` // Estimated: `3642` - // Minimum execution time: 15_348_000 picoseconds. - Weight::from_parts(15_776_000, 3642) + // Minimum execution time: 12_635_000 picoseconds. + Weight::from_parts(13_423_000, 3642) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Bounties BountyApprovals (r:1 w:1) - /// Proof: Bounties BountyApprovals (max_values: Some(1), max_size: Some(402), added: 897, mode: MaxEncodedLen) - /// Storage: Bounties Bounties (r:100 w:100) - /// Proof: Bounties Bounties (max_values: None, max_size: Some(177), added: 2652, mode: MaxEncodedLen) - /// Storage: System Account (r:200 w:200) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: `Bounties::BountyApprovals` (r:1 w:1) + /// Proof: `Bounties::BountyApprovals` (`max_values`: Some(1), `max_size`: Some(402), added: 897, mode: `MaxEncodedLen`) + /// Storage: `Bounties::Bounties` (r:100 w:100) + /// Proof: `Bounties::Bounties` (`max_values`: None, `max_size`: Some(177), added: 2652, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:200 w:200) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) /// The range of component `b` is `[0, 100]`. fn spend_funds(b: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `4 + b * (297 ±0)` + // Measured: `37 + b * (297 ±0)` // Estimated: `1887 + b * (5206 ±0)` - // Minimum execution time: 5_082_000 picoseconds. - Weight::from_parts(5_126_000, 1887) - // Standard Error: 21_949 - .saturating_add(Weight::from_parts(42_635_308, 0).saturating_mul(b.into())) + // Minimum execution time: 2_840_000 picoseconds. + Weight::from_parts(6_076_743, 1887) + // Standard Error: 18_569 + .saturating_add(Weight::from_parts(34_771_846, 0).saturating_mul(b.into())) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().reads((3_u64).saturating_mul(b.into()))) .saturating_add(RocksDbWeight::get().writes(1_u64)) diff --git a/substrate/frame/broker/Cargo.toml b/substrate/frame/broker/Cargo.toml index 31f9a6b63178d42410c16a3354f43ec35fe00f3d..969f13e269de4208a220150d688a21ffcc0191f1 100644 --- a/substrate/frame/broker/Cargo.toml +++ b/substrate/frame/broker/Cargo.toml @@ -16,8 +16,9 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } bitvec = { version = "1.0.0", default-features = false } +sp-api = { path = "../../primitives/api", default-features = false } sp-std = { path = "../../primitives/std", default-features = false } sp-arithmetic = { path = "../../primitives/arithmetic", default-features = false } sp-core = { path = "../../primitives/core", default-features = false } @@ -39,6 +40,7 @@ std = [ "frame-support/std", "frame-system/std", "scale-info/std", + "sp-api/std", "sp-arithmetic/std", "sp-core/std", "sp-io/std", diff --git a/substrate/frame/broker/src/adapt_price.rs b/substrate/frame/broker/src/adapt_price.rs index 8266625687a23073a335bcab58db6ef7c33c8d80..fbcd7afdf0da059fb7023de3422f15b2344d5407 100644 --- a/substrate/frame/broker/src/adapt_price.rs +++ b/substrate/frame/broker/src/adapt_price.rs @@ -19,6 +19,7 @@ use crate::CoreIndex; use sp_arithmetic::{traits::One, FixedU64}; +use sp_runtime::Saturating; /// Type for determining how to set price. pub trait AdaptPrice { @@ -49,14 +50,24 @@ impl AdaptPrice for () { pub struct Linear; impl AdaptPrice for Linear { fn leadin_factor_at(when: FixedU64) -> FixedU64 { - FixedU64::from(2) - when + FixedU64::from(2).saturating_sub(when) } fn adapt_price(sold: CoreIndex, target: CoreIndex, limit: CoreIndex) -> FixedU64 { if sold <= target { - FixedU64::from_rational(sold.into(), target.into()) + // Range of [0.5, 1.0]. + FixedU64::from_rational(1, 2).saturating_add(FixedU64::from_rational( + sold.into(), + target.saturating_mul(2).into(), + )) } else { - FixedU64::one() + - FixedU64::from_rational((sold - target).into(), (limit - target).into()) + // Range of (1.0, 2]. + + // Unchecked math: In this branch we know that sold > target. The limit must be >= sold + // by construction, and thus target must be < limit. + FixedU64::one().saturating_add(FixedU64::from_rational( + (sold - target).into(), + (limit - target).into(), + )) } } } @@ -81,4 +92,23 @@ mod tests { } } } + + #[test] + fn linear_bound_check() { + // Using constraints from pallet implementation i.e. `limit >= sold`. + // Check extremes + let limit = 10; + let target = 5; + + // Maximally sold: `sold == limit` + assert_eq!(Linear::adapt_price(limit, target, limit), FixedU64::from_float(2.0)); + // Ideally sold: `sold == target` + assert_eq!(Linear::adapt_price(target, target, limit), FixedU64::one()); + // Minimally sold: `sold == 0` + assert_eq!(Linear::adapt_price(0, target, limit), FixedU64::from_float(0.5)); + // Optimistic target: `target == limit` + assert_eq!(Linear::adapt_price(limit, limit, limit), FixedU64::one()); + // Pessimistic target: `target == 0` + assert_eq!(Linear::adapt_price(limit, 0, limit), FixedU64::from_float(2.0)); + } } diff --git a/substrate/frame/broker/src/benchmarking.rs b/substrate/frame/broker/src/benchmarking.rs index 70f488e998cc8d2b06d26f2250ee8a585ab44add..98ac074ca91778cfd2538cc0e89f90ca79a62ad5 100644 --- a/substrate/frame/broker/src/benchmarking.rs +++ b/substrate/frame/broker/src/benchmarking.rs @@ -918,6 +918,23 @@ mod benches { Ok(()) } + #[benchmark] + fn swap_leases() -> Result<(), BenchmarkError> { + let admin_origin = + T::AdminOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; + + // Add two leases in `Leases` + let n = (T::MaxLeasedCores::get() / 2) as usize; + let mut leases = vec![LeaseRecordItem { task: 1, until: 10u32.into() }; n]; + leases.extend(vec![LeaseRecordItem { task: 2, until: 20u32.into() }; n]); + Leases::::put(BoundedVec::try_from(leases).unwrap()); + + #[extrinsic_call] + _(admin_origin as T::RuntimeOrigin, 1, 2); + + Ok(()) + } + // Implements a test for each benchmark. Execute with: // `cargo test -p pallet-broker --features runtime-benchmarks`. impl_benchmark_test_suite!(Pallet, crate::mock::new_test_ext(), crate::mock::Test); diff --git a/substrate/frame/broker/src/coretime_interface.rs b/substrate/frame/broker/src/coretime_interface.rs index 9e853e8f3fe0b1e2f76e3fac57b9ce0b8d03ab07..58efa7fa92bb0fa6c29a45375593f2246f5eaa8a 100644 --- a/substrate/frame/broker/src/coretime_interface.rs +++ b/substrate/frame/broker/src/coretime_interface.rs @@ -51,7 +51,7 @@ pub enum CoreAssignment { pub type RCBlockNumberOf = as BlockNumberProvider>::BlockNumber; /// Relay chain block number provider of `T` that implements [`CoretimeInterface`]. -pub type RCBlockNumberProviderOf = ::RealyChainBlockNumberProvider; +pub type RCBlockNumberProviderOf = ::RelayChainBlockNumberProvider; /// Type able to accept Coretime scheduling instructions and provide certain usage information. /// Generally implemented by the Relay-chain or some means of communicating with it. @@ -65,7 +65,7 @@ pub trait CoretimeInterface { type Balance: AtLeast32BitUnsigned; /// A provider for the relay chain block number. - type RealyChainBlockNumberProvider: BlockNumberProvider; + type RelayChainBlockNumberProvider: BlockNumberProvider; /// Requests the Relay-chain to alter the number of schedulable cores to `count`. Under normal /// operation, the Relay-chain SHOULD send a `notify_core_count(count)` message back. @@ -128,7 +128,7 @@ pub trait CoretimeInterface { impl CoretimeInterface for () { type AccountId = (); type Balance = u64; - type RealyChainBlockNumberProvider = (); + type RelayChainBlockNumberProvider = (); fn request_core_count(_count: CoreIndex) {} fn request_revenue_info_at(_when: RCBlockNumberOf) {} diff --git a/substrate/frame/broker/src/dispatchable_impls.rs b/substrate/frame/broker/src/dispatchable_impls.rs index f2451013251fba144270e4009bae8cb180653b2d..ef20bc8fb80b19eaddef8fa6011dac17ffa22609 100644 --- a/substrate/frame/broker/src/dispatchable_impls.rs +++ b/substrate/frame/broker/src/dispatchable_impls.rs @@ -105,8 +105,8 @@ impl Pallet { ) -> Result { let status = Status::::get().ok_or(Error::::Uninitialized)?; let mut sale = SaleInfo::::get().ok_or(Error::::NoSales)?; - ensure!(sale.first_core < status.core_count, Error::::Unavailable); - ensure!(sale.cores_sold < sale.cores_offered, Error::::SoldOut); + Self::ensure_cores_for_sale(&status, &sale)?; + let now = frame_system::Pallet::::block_number(); ensure!(now > sale.sale_start, Error::::TooEarly); let price = Self::sale_price(&sale, now); @@ -131,8 +131,7 @@ impl Pallet { let config = Configuration::::get().ok_or(Error::::Uninitialized)?; let status = Status::::get().ok_or(Error::::Uninitialized)?; let mut sale = SaleInfo::::get().ok_or(Error::::NoSales)?; - ensure!(sale.first_core < status.core_count, Error::::Unavailable); - ensure!(sale.cores_sold < sale.cores_offered, Error::::SoldOut); + Self::ensure_cores_for_sale(&status, &sale)?; let renewal_id = AllowedRenewalId { core, when: sale.region_begin }; let record = AllowedRenewals::::get(renewal_id).ok_or(Error::::NotAllowed)?; @@ -329,6 +328,7 @@ impl Pallet { mut region: RegionId, max_timeslices: Timeslice, ) -> DispatchResult { + ensure!(max_timeslices > 0, Error::::NoClaimTimeslices); let mut contribution = InstaPoolContribution::::take(region).ok_or(Error::::UnknownContribution)?; let contributed_parts = region.mask.count_ones(); @@ -437,4 +437,43 @@ impl Pallet { Self::deposit_event(Event::AllowedRenewalDropped { core, when }); Ok(()) } + + pub(crate) fn do_swap_leases(id: TaskId, other: TaskId) -> DispatchResult { + let mut id_leases_count = 0; + let mut other_leases_count = 0; + Leases::::mutate(|leases| { + leases.iter_mut().for_each(|lease| { + if lease.task == id { + lease.task = other; + id_leases_count += 1; + } else if lease.task == other { + lease.task = id; + other_leases_count += 1; + } + }) + }); + + Ok(()) + } + + pub(crate) fn ensure_cores_for_sale( + status: &StatusRecord, + sale: &SaleInfoRecordOf, + ) -> Result<(), DispatchError> { + ensure!(sale.first_core < status.core_count, Error::::Unavailable); + ensure!(sale.cores_sold < sale.cores_offered, Error::::SoldOut); + + Ok(()) + } + + /// If there is an ongoing sale returns the current price of a core. + pub fn current_price() -> Result, DispatchError> { + let status = Status::::get().ok_or(Error::::Uninitialized)?; + let sale = SaleInfo::::get().ok_or(Error::::NoSales)?; + + Self::ensure_cores_for_sale(&status, &sale)?; + + let now = frame_system::Pallet::::block_number(); + Ok(Self::sale_price(&sale, now)) + } } diff --git a/substrate/frame/broker/src/lib.rs b/substrate/frame/broker/src/lib.rs index a669463aa02d97e40c4221107bf15d1d3d3525bb..a39576b09013f7fef9893ff87ae093eae467af5d 100644 --- a/substrate/frame/broker/src/lib.rs +++ b/substrate/frame/broker/src/lib.rs @@ -36,6 +36,8 @@ mod tick_impls; mod types; mod utility_impls; +pub mod runtime_api; + pub mod weights; pub use weights::WeightInfo; @@ -132,7 +134,7 @@ pub mod pallet { pub type AllowedRenewals = StorageMap<_, Twox64Concat, AllowedRenewalId, AllowedRenewalRecordOf, OptionQuery>; - /// The current (unassigned) Regions. + /// The current (unassigned or provisionally assigend) Regions. #[pallet::storage] pub type Regions = StorageMap<_, Blake2_128Concat, RegionId, RegionRecordOf, OptionQuery>; @@ -474,6 +476,8 @@ pub mod pallet { AlreadyExpired, /// The configuration could not be applied because it is invalid. InvalidConfig, + /// The revenue must be claimed for 1 or more timeslices. + NoClaimTimeslices, } #[pallet::hooks] @@ -680,13 +684,12 @@ pub mod pallet { /// Claim the revenue owed from inclusion in the Instantaneous Coretime Pool. /// - /// - `origin`: Must be a Signed origin of the account which owns the Region `region_id`. + /// - `origin`: Must be a Signed origin. /// - `region_id`: The Region which was assigned to the Pool. - /// - `max_timeslices`: The maximum number of timeslices which should be processed. This may - /// effect the weight of the call but should be ideally made equivalant to the length of - /// the Region `region_id`. If it is less than this, then further dispatches will be - /// required with the `region_id` which makes up any remainders of the region to be - /// collected. + /// - `max_timeslices`: The maximum number of timeslices which should be processed. This + /// must be greater than 0. This may affect the weight of the call but should be ideally + /// made equivalent to the length of the Region `region_id`. If less, further dispatches + /// will be required with the same `region_id` to claim revenue for the remainder. #[pallet::call_index(12)] #[pallet::weight(T::WeightInfo::claim_revenue(*max_timeslices))] pub fn claim_revenue( @@ -786,5 +789,13 @@ pub mod pallet { Self::do_notify_core_count(core_count)?; Ok(()) } + + #[pallet::call_index(99)] + #[pallet::weight(T::WeightInfo::swap_leases())] + pub fn swap_leases(origin: OriginFor, id: TaskId, other: TaskId) -> DispatchResult { + T::AdminOrigin::ensure_origin_or_root(origin)?; + Self::do_swap_leases(id, other)?; + Ok(()) + } } } diff --git a/substrate/frame/broker/src/mock.rs b/substrate/frame/broker/src/mock.rs index 19c72340353c66d9bedf5d016e02dad7102116cb..c7205058c9720b15838de3684a33303a45cb8c68 100644 --- a/substrate/frame/broker/src/mock.rs +++ b/substrate/frame/broker/src/mock.rs @@ -47,7 +47,7 @@ frame_support::construct_runtime!( } ); -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { type Block = Block; } @@ -77,7 +77,7 @@ pub struct TestCoretimeProvider; impl CoretimeInterface for TestCoretimeProvider { type AccountId = u64; type Balance = u64; - type RealyChainBlockNumberProvider = System; + type RelayChainBlockNumberProvider = System; fn request_core_count(count: CoreIndex) { CoreCountInbox::::put(count); } diff --git a/substrate/frame/broker/src/runtime_api.rs b/substrate/frame/broker/src/runtime_api.rs new file mode 100644 index 0000000000000000000000000000000000000000..6faab615650386205b95e60b4ffc623e6510af64 --- /dev/null +++ b/substrate/frame/broker/src/runtime_api.rs @@ -0,0 +1,31 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Runtime API definition for the FRAME Broker pallet. + +use codec::Codec; +use sp_runtime::DispatchError; + +sp_api::decl_runtime_apis! { + pub trait BrokerApi + where + Balance: Codec + { + /// If there is an ongoing sale returns the current price of a core. + fn sale_price() -> Result; + } +} diff --git a/substrate/frame/broker/src/tests.rs b/substrate/frame/broker/src/tests.rs index e5efb70ae8d5a9a3ef4370592d2c2f1f461be228..0aacd7ef3696c600ed9546d66fc84fb851553ee6 100644 --- a/substrate/frame/broker/src/tests.rs +++ b/substrate/frame/broker/src/tests.rs @@ -372,6 +372,11 @@ fn instapool_payouts_work() { advance_to(11); assert_eq!(pot(), 14); assert_eq!(revenue(), 106); + + // Cannot claim for 0 timeslices. + assert_noop!(Broker::do_claim_revenue(region, 0), Error::::NoClaimTimeslices); + + // Revenue can be claimed. assert_ok!(Broker::do_claim_revenue(region, 100)); assert_eq!(pot(), 10); assert_eq!(balance(2), 4); @@ -863,6 +868,29 @@ fn cannot_set_expired_lease() { }); } +#[test] +fn short_leases_are_cleaned() { + TestExt::new().region_length(3).execute_with(|| { + assert_ok!(Broker::do_start_sales(200, 1)); + advance_to(2); + + // New leases are allowed to expire within this region given expiry > `current_timeslice`. + assert_noop!( + Broker::do_set_lease(1000, Broker::current_timeslice()), + Error::::AlreadyExpired + ); + assert_eq!(Leases::::get().len(), 0); + assert_ok!(Broker::do_set_lease(1000, Broker::current_timeslice().saturating_add(1))); + assert_eq!(Leases::::get().len(), 1); + + // But are cleaned up in the next rotate_sale. + let config = Configuration::::get().unwrap(); + let timeslice_period: u64 = ::TimeslicePeriod::get(); + advance_to(timeslice_period.saturating_mul(config.region_length.into())); + assert_eq!(Leases::::get().len(), 0); + }); +} + #[test] fn leases_are_limited() { TestExt::new().execute_with(|| { diff --git a/substrate/frame/broker/src/tick_impls.rs b/substrate/frame/broker/src/tick_impls.rs index 8b7860c8e3af6daaaa433d9b7d093c94f292a5a6..388370bce4d4b8045122c02ad758b62b4476fd15 100644 --- a/substrate/frame/broker/src/tick_impls.rs +++ b/substrate/frame/broker/src/tick_impls.rs @@ -216,7 +216,9 @@ impl Pallet { let assignment = CoreAssignment::Task(task); let schedule = BoundedVec::truncate_from(vec![ScheduleItem { mask, assignment }]); Workplan::::insert((region_begin, first_core), &schedule); - let expiring = until >= region_begin && until < region_end; + // Separate these to avoid missed expired leases hanging around forever. + let expired = until < region_end; + let expiring = until >= region_begin && expired; if expiring { // last time for this one - make it renewable. let renewal_id = AllowedRenewalId { core: first_core, when: region_end }; @@ -231,7 +233,7 @@ impl Pallet { Self::deposit_event(Event::LeaseEnding { when: region_end, task }); } first_core.saturating_inc(); - !expiring + !expired }); Leases::::put(&leases); diff --git a/substrate/frame/broker/src/types.rs b/substrate/frame/broker/src/types.rs index 7e9f351723a5d312fcd52dcf57d845ccea34a05a..e8119d29ef5d38e25060514d624713a6eedd11a8 100644 --- a/substrate/frame/broker/src/types.rs +++ b/substrate/frame/broker/src/types.rs @@ -55,7 +55,7 @@ pub enum Finality { pub struct RegionId { /// The timeslice at which this Region begins. pub begin: Timeslice, - /// The index of the Polakdot Core on which this Region will be scheduled. + /// The index of the Polkadot Core on which this Region will be scheduled. pub core: CoreIndex, /// The regularity parts in which this Region will be scheduled. pub mask: CoreMask, @@ -198,7 +198,7 @@ pub struct PoolIoRecord { /// The total change of the portion of the pool supplied by purchased Bulk Coretime, measured /// in Core Mask Bits. pub private: SignedCoreMaskBitCount, - /// The total change of the portion of the pool supplied by the Polkaot System, measured in + /// The total change of the portion of the pool supplied by the Polkadot System, measured in /// Core Mask Bits. pub system: SignedCoreMaskBitCount, } diff --git a/substrate/frame/broker/src/weights.rs b/substrate/frame/broker/src/weights.rs index a8f50eeee6e6ceaf284c1764a68411956753cfff..2aa1c282a41d8a98e6a0a824e5eaa150922b2356 100644 --- a/substrate/frame/broker/src/weights.rs +++ b/substrate/frame/broker/src/weights.rs @@ -17,26 +17,28 @@ //! Autogenerated weights for `pallet_broker` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-09-04, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-04-08, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-pzhd7p6z-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! HOSTNAME: `runner-anb7yjbi-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: `1024` // Executed Command: -// target/production/substrate-node +// ./target/production/substrate-node // benchmark // pallet +// --chain=dev // --steps=50 // --repeat=20 +// --pallet=pallet_broker +// --no-storage-info +// --no-median-slopes +// --no-min-squares // --extrinsic=* // --wasm-execution=compiled // --heap-pages=4096 -// --json-file=/builds/parity/mirrors/polkadot-sdk/.git/.artifacts/bench.json -// --pallet=pallet_broker -// --chain=dev -// --header=./substrate/HEADER-APACHE2 // --output=./substrate/frame/broker/src/weights.rs +// --header=./substrate/HEADER-APACHE2 // --template=./substrate/.maintain/frame-weight-template.hbs #![cfg_attr(rustfmt, rustfmt_skip)] @@ -76,6 +78,7 @@ pub trait WeightInfo { fn request_revenue_info_at() -> Weight; fn notify_core_count() -> Weight; fn do_tick_base() -> Weight; + fn swap_leases() -> Weight; } /// Weights for `pallet_broker` using the Substrate node and recommended hardware. @@ -87,8 +90,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_040_000 picoseconds. - Weight::from_parts(3_344_000, 0) + // Minimum execution time: 2_624_000 picoseconds. + Weight::from_parts(2_804_000, 0) .saturating_add(T::DbWeight::get().writes(1_u64)) } /// Storage: `Broker::Reservations` (r:1 w:1) @@ -97,8 +100,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `5016` // Estimated: `7496` - // Minimum execution time: 21_259_000 picoseconds. - Weight::from_parts(22_110_000, 7496) + // Minimum execution time: 18_451_000 picoseconds. + Weight::from_parts(18_853_000, 7496) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -108,8 +111,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `6218` // Estimated: `7496` - // Minimum execution time: 20_330_000 picoseconds. - Weight::from_parts(20_826_000, 7496) + // Minimum execution time: 16_899_000 picoseconds. + Weight::from_parts(17_645_000, 7496) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -119,8 +122,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `239` // Estimated: `1526` - // Minimum execution time: 13_411_000 picoseconds. - Weight::from_parts(13_960_000, 1526) + // Minimum execution time: 10_239_000 picoseconds. + Weight::from_parts(10_754_000, 1526) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -143,10 +146,10 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `6330` // Estimated: `8499` - // Minimum execution time: 57_770_000 picoseconds. - Weight::from_parts(61_047_512, 8499) - // Standard Error: 165 - .saturating_add(Weight::from_parts(3, 0).saturating_mul(n.into())) + // Minimum execution time: 51_250_000 picoseconds. + Weight::from_parts(54_643_012, 8499) + // Standard Error: 147 + .saturating_add(Weight::from_parts(18, 0).saturating_mul(n.into())) .saturating_add(T::DbWeight::get().reads(6_u64)) .saturating_add(T::DbWeight::get().writes(16_u64)) } @@ -162,10 +165,10 @@ impl WeightInfo for SubstrateWeight { /// Proof: `Broker::Regions` (`max_values`: None, `max_size`: Some(85), added: 2560, mode: `MaxEncodedLen`) fn purchase() -> Weight { // Proof Size summary in bytes: - // Measured: `568` - // Estimated: `2053` - // Minimum execution time: 51_196_000 picoseconds. - Weight::from_parts(52_382_000, 2053) + // Measured: `635` + // Estimated: `2120` + // Minimum execution time: 43_660_000 picoseconds. + Weight::from_parts(45_543_000, 2120) .saturating_add(T::DbWeight::get().reads(4_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } @@ -185,10 +188,10 @@ impl WeightInfo for SubstrateWeight { /// Proof: `Broker::Workplan` (`max_values`: None, `max_size`: Some(1216), added: 3691, mode: `MaxEncodedLen`) fn renew() -> Weight { // Proof Size summary in bytes: - // Measured: `686` + // Measured: `753` // Estimated: `4698` - // Minimum execution time: 71_636_000 picoseconds. - Weight::from_parts(73_679_000, 4698) + // Minimum execution time: 63_122_000 picoseconds. + Weight::from_parts(64_366_000, 4698) .saturating_add(T::DbWeight::get().reads(6_u64)) .saturating_add(T::DbWeight::get().writes(4_u64)) } @@ -198,8 +201,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `495` // Estimated: `3550` - // Minimum execution time: 19_182_000 picoseconds. - Weight::from_parts(19_775_000, 3550) + // Minimum execution time: 17_552_000 picoseconds. + Weight::from_parts(18_251_000, 3550) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -209,21 +212,21 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `495` // Estimated: `3550` - // Minimum execution time: 20_688_000 picoseconds. - Weight::from_parts(21_557_000, 3550) + // Minimum execution time: 18_551_000 picoseconds. + Weight::from_parts(19_727_000, 3550) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } - /// Storage: `Broker::Regions` (r:1 w:2) + /// Storage: `Broker::Regions` (r:1 w:3) /// Proof: `Broker::Regions` (`max_values`: None, `max_size`: Some(85), added: 2560, mode: `MaxEncodedLen`) fn interlace() -> Weight { // Proof Size summary in bytes: // Measured: `495` // Estimated: `3550` - // Minimum execution time: 21_190_000 picoseconds. - Weight::from_parts(22_215_000, 3550) + // Minimum execution time: 20_636_000 picoseconds. + Weight::from_parts(21_060_000, 3550) .saturating_add(T::DbWeight::get().reads(1_u64)) - .saturating_add(T::DbWeight::get().writes(2_u64)) + .saturating_add(T::DbWeight::get().writes(3_u64)) } /// Storage: `Broker::Configuration` (r:1 w:0) /// Proof: `Broker::Configuration` (`max_values`: Some(1), `max_size`: Some(31), added: 526, mode: `MaxEncodedLen`) @@ -237,8 +240,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `740` // Estimated: `4681` - // Minimum execution time: 34_591_000 picoseconds. - Weight::from_parts(36_227_000, 4681) + // Minimum execution time: 32_394_000 picoseconds. + Weight::from_parts(33_324_000, 4681) .saturating_add(T::DbWeight::get().reads(4_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } @@ -256,8 +259,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `775` // Estimated: `5996` - // Minimum execution time: 40_346_000 picoseconds. - Weight::from_parts(41_951_000, 5996) + // Minimum execution time: 38_128_000 picoseconds. + Weight::from_parts(39_274_000, 5996) .saturating_add(T::DbWeight::get().reads(5_u64)) .saturating_add(T::DbWeight::get().writes(5_u64)) } @@ -272,10 +275,10 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `859` // Estimated: `6196 + m * (2520 ±0)` - // Minimum execution time: 75_734_000 picoseconds. - Weight::from_parts(78_168_395, 6196) - // Standard Error: 63_180 - .saturating_add(Weight::from_parts(1_076_259, 0).saturating_mul(m.into())) + // Minimum execution time: 70_453_000 picoseconds. + Weight::from_parts(70_652_822, 6196) + // Standard Error: 75_524 + .saturating_add(Weight::from_parts(2_335_289, 0).saturating_mul(m.into())) .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(m.into()))) .saturating_add(T::DbWeight::get().writes(5_u64)) @@ -287,8 +290,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `103` // Estimated: `3593` - // Minimum execution time: 46_383_000 picoseconds. - Weight::from_parts(47_405_000, 3593) + // Minimum execution time: 43_945_000 picoseconds. + Weight::from_parts(45_249_000, 3593) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -300,8 +303,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `603` // Estimated: `3550` - // Minimum execution time: 30_994_000 picoseconds. - Weight::from_parts(31_979_000, 3550) + // Minimum execution time: 30_680_000 picoseconds. + Weight::from_parts(32_995_000, 3550) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -315,8 +318,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `601` // Estimated: `3533` - // Minimum execution time: 37_584_000 picoseconds. - Weight::from_parts(44_010_000, 3533) + // Minimum execution time: 48_053_000 picoseconds. + Weight::from_parts(51_364_000, 3533) .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -330,10 +333,10 @@ impl WeightInfo for SubstrateWeight { /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) fn drop_history() -> Weight { // Proof Size summary in bytes: - // Measured: `830` + // Measured: `995` // Estimated: `3593` - // Minimum execution time: 45_266_000 picoseconds. - Weight::from_parts(48_000_000, 3593) + // Minimum execution time: 57_372_000 picoseconds. + Weight::from_parts(59_466_000, 3593) .saturating_add(T::DbWeight::get().reads(4_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -343,34 +346,32 @@ impl WeightInfo for SubstrateWeight { /// Proof: `Broker::AllowedRenewals` (`max_values`: None, `max_size`: Some(1233), added: 3708, mode: `MaxEncodedLen`) fn drop_renewal() -> Weight { // Proof Size summary in bytes: - // Measured: `525` + // Measured: `661` // Estimated: `4698` - // Minimum execution time: 25_365_000 picoseconds. - Weight::from_parts(26_920_000, 4698) + // Minimum execution time: 27_768_000 picoseconds. + Weight::from_parts(29_000_000, 4698) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } /// The range of component `n` is `[0, 1000]`. - fn request_core_count(n: u32, ) -> Weight { + fn request_core_count(_n: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 6_519_000 picoseconds. - Weight::from_parts(7_098_698, 0) - // Standard Error: 20 - .saturating_add(Weight::from_parts(8, 0).saturating_mul(n.into())) + // Minimum execution time: 4_588_000 picoseconds. + Weight::from_parts(5_201_705, 0) } - /// Storage: UNKNOWN KEY `0x18194fcb5c1fcace44d2d0a004272614` (r:1 w:1) - /// Proof: UNKNOWN KEY `0x18194fcb5c1fcace44d2d0a004272614` (r:1 w:1) + /// Storage: `Broker::CoreCountInbox` (r:1 w:1) + /// Proof: `Broker::CoreCountInbox` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) /// The range of component `n` is `[0, 1000]`. fn process_core_count(n: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `98` - // Estimated: `3563` - // Minimum execution time: 7_608_000 picoseconds. - Weight::from_parts(8_157_815, 3563) - // Standard Error: 26 - .saturating_add(Weight::from_parts(48, 0).saturating_mul(n.into())) + // Measured: `404` + // Estimated: `1487` + // Minimum execution time: 6_889_000 picoseconds. + Weight::from_parts(7_380_363, 1487) + // Standard Error: 21 + .saturating_add(Weight::from_parts(63, 0).saturating_mul(n.into())) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -386,10 +387,10 @@ impl WeightInfo for SubstrateWeight { /// Proof: `System::Digest` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) fn process_revenue() -> Weight { // Proof Size summary in bytes: - // Measured: `905` - // Estimated: `4370` - // Minimum execution time: 59_993_000 picoseconds. - Weight::from_parts(61_752_000, 4370) + // Measured: `972` + // Estimated: `4437` + // Minimum execution time: 50_156_000 picoseconds. + Weight::from_parts(51_610_000, 4437) .saturating_add(T::DbWeight::get().reads(5_u64)) .saturating_add(T::DbWeight::get().writes(3_u64)) } @@ -408,10 +409,10 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `6281` // Estimated: `8499` - // Minimum execution time: 41_863_000 picoseconds. - Weight::from_parts(44_033_031, 8499) - // Standard Error: 116 - .saturating_add(Weight::from_parts(764, 0).saturating_mul(n.into())) + // Minimum execution time: 38_246_000 picoseconds. + Weight::from_parts(40_008_850, 8499) + // Standard Error: 94 + .saturating_add(Weight::from_parts(964, 0).saturating_mul(n.into())) .saturating_add(T::DbWeight::get().reads(5_u64)) .saturating_add(T::DbWeight::get().writes(15_u64)) } @@ -423,8 +424,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `180` // Estimated: `3493` - // Minimum execution time: 9_588_000 picoseconds. - Weight::from_parts(9_925_000, 3493) + // Minimum execution time: 7_962_000 picoseconds. + Weight::from_parts(8_313_000, 3493) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -436,8 +437,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `1423` // Estimated: `4681` - // Minimum execution time: 19_308_000 picoseconds. - Weight::from_parts(20_482_000, 4681) + // Minimum execution time: 17_457_000 picoseconds. + Weight::from_parts(18_387_000, 4681) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } @@ -445,28 +446,46 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 147_000 picoseconds. - Weight::from_parts(184_000, 0) + // Minimum execution time: 133_000 picoseconds. + Weight::from_parts(149_000, 0) } + /// Storage: `Broker::CoreCountInbox` (r:0 w:1) + /// Proof: `Broker::CoreCountInbox` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) fn notify_core_count() -> Weight { - T::DbWeight::get().reads_writes(1, 1) + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_407_000 picoseconds. + Weight::from_parts(2_634_000, 0) + .saturating_add(T::DbWeight::get().writes(1_u64)) } /// Storage: `Broker::Status` (r:1 w:1) /// Proof: `Broker::Status` (`max_values`: Some(1), `max_size`: Some(18), added: 513, mode: `MaxEncodedLen`) /// Storage: `Broker::Configuration` (r:1 w:0) /// Proof: `Broker::Configuration` (`max_values`: Some(1), `max_size`: Some(31), added: 526, mode: `MaxEncodedLen`) - /// Storage: UNKNOWN KEY `0x18194fcb5c1fcace44d2d0a004272614` (r:1 w:1) - /// Proof: UNKNOWN KEY `0x18194fcb5c1fcace44d2d0a004272614` (r:1 w:1) + /// Storage: `Broker::CoreCountInbox` (r:1 w:0) + /// Proof: `Broker::CoreCountInbox` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) /// Storage: UNKNOWN KEY `0xf308d869daf021a7724e69c557dd8dbe` (r:1 w:1) /// Proof: UNKNOWN KEY `0xf308d869daf021a7724e69c557dd8dbe` (r:1 w:1) fn do_tick_base() -> Weight { // Proof Size summary in bytes: - // Measured: `699` - // Estimated: `4164` - // Minimum execution time: 19_824_000 picoseconds. - Weight::from_parts(20_983_000, 4164) + // Measured: `603` + // Estimated: `4068` + // Minimum execution time: 13_043_000 picoseconds. + Weight::from_parts(13_541_000, 4068) .saturating_add(T::DbWeight::get().reads(4_u64)) - .saturating_add(T::DbWeight::get().writes(3_u64)) + .saturating_add(T::DbWeight::get().writes(2_u64)) + } + /// Storage: `Broker::Leases` (r:1 w:1) + /// Proof: `Broker::Leases` (`max_values`: Some(1), `max_size`: Some(41), added: 536, mode: `MaxEncodedLen`) + fn swap_leases() -> Weight { + // Proof Size summary in bytes: + // Measured: `239` + // Estimated: `1526` + // Minimum execution time: 6_606_000 picoseconds. + Weight::from_parts(6_964_000, 1526) + .saturating_add(T::DbWeight::get().reads(1_u64)) + .saturating_add(T::DbWeight::get().writes(1_u64)) } } @@ -478,8 +497,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_040_000 picoseconds. - Weight::from_parts(3_344_000, 0) + // Minimum execution time: 2_624_000 picoseconds. + Weight::from_parts(2_804_000, 0) .saturating_add(RocksDbWeight::get().writes(1_u64)) } /// Storage: `Broker::Reservations` (r:1 w:1) @@ -488,8 +507,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `5016` // Estimated: `7496` - // Minimum execution time: 21_259_000 picoseconds. - Weight::from_parts(22_110_000, 7496) + // Minimum execution time: 18_451_000 picoseconds. + Weight::from_parts(18_853_000, 7496) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -499,8 +518,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `6218` // Estimated: `7496` - // Minimum execution time: 20_330_000 picoseconds. - Weight::from_parts(20_826_000, 7496) + // Minimum execution time: 16_899_000 picoseconds. + Weight::from_parts(17_645_000, 7496) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -510,8 +529,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `239` // Estimated: `1526` - // Minimum execution time: 13_411_000 picoseconds. - Weight::from_parts(13_960_000, 1526) + // Minimum execution time: 10_239_000 picoseconds. + Weight::from_parts(10_754_000, 1526) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -534,10 +553,10 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `6330` // Estimated: `8499` - // Minimum execution time: 57_770_000 picoseconds. - Weight::from_parts(61_047_512, 8499) - // Standard Error: 165 - .saturating_add(Weight::from_parts(3, 0).saturating_mul(n.into())) + // Minimum execution time: 51_250_000 picoseconds. + Weight::from_parts(54_643_012, 8499) + // Standard Error: 147 + .saturating_add(Weight::from_parts(18, 0).saturating_mul(n.into())) .saturating_add(RocksDbWeight::get().reads(6_u64)) .saturating_add(RocksDbWeight::get().writes(16_u64)) } @@ -553,10 +572,10 @@ impl WeightInfo for () { /// Proof: `Broker::Regions` (`max_values`: None, `max_size`: Some(85), added: 2560, mode: `MaxEncodedLen`) fn purchase() -> Weight { // Proof Size summary in bytes: - // Measured: `568` - // Estimated: `2053` - // Minimum execution time: 51_196_000 picoseconds. - Weight::from_parts(52_382_000, 2053) + // Measured: `635` + // Estimated: `2120` + // Minimum execution time: 43_660_000 picoseconds. + Weight::from_parts(45_543_000, 2120) .saturating_add(RocksDbWeight::get().reads(4_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } @@ -576,10 +595,10 @@ impl WeightInfo for () { /// Proof: `Broker::Workplan` (`max_values`: None, `max_size`: Some(1216), added: 3691, mode: `MaxEncodedLen`) fn renew() -> Weight { // Proof Size summary in bytes: - // Measured: `686` + // Measured: `753` // Estimated: `4698` - // Minimum execution time: 71_636_000 picoseconds. - Weight::from_parts(73_679_000, 4698) + // Minimum execution time: 63_122_000 picoseconds. + Weight::from_parts(64_366_000, 4698) .saturating_add(RocksDbWeight::get().reads(6_u64)) .saturating_add(RocksDbWeight::get().writes(4_u64)) } @@ -589,8 +608,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `495` // Estimated: `3550` - // Minimum execution time: 19_182_000 picoseconds. - Weight::from_parts(19_775_000, 3550) + // Minimum execution time: 17_552_000 picoseconds. + Weight::from_parts(18_251_000, 3550) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -600,21 +619,21 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `495` // Estimated: `3550` - // Minimum execution time: 20_688_000 picoseconds. - Weight::from_parts(21_557_000, 3550) + // Minimum execution time: 18_551_000 picoseconds. + Weight::from_parts(19_727_000, 3550) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } - /// Storage: `Broker::Regions` (r:1 w:2) + /// Storage: `Broker::Regions` (r:1 w:3) /// Proof: `Broker::Regions` (`max_values`: None, `max_size`: Some(85), added: 2560, mode: `MaxEncodedLen`) fn interlace() -> Weight { // Proof Size summary in bytes: // Measured: `495` // Estimated: `3550` - // Minimum execution time: 21_190_000 picoseconds. - Weight::from_parts(22_215_000, 3550) + // Minimum execution time: 20_636_000 picoseconds. + Weight::from_parts(21_060_000, 3550) .saturating_add(RocksDbWeight::get().reads(1_u64)) - .saturating_add(RocksDbWeight::get().writes(2_u64)) + .saturating_add(RocksDbWeight::get().writes(3_u64)) } /// Storage: `Broker::Configuration` (r:1 w:0) /// Proof: `Broker::Configuration` (`max_values`: Some(1), `max_size`: Some(31), added: 526, mode: `MaxEncodedLen`) @@ -628,8 +647,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `740` // Estimated: `4681` - // Minimum execution time: 34_591_000 picoseconds. - Weight::from_parts(36_227_000, 4681) + // Minimum execution time: 32_394_000 picoseconds. + Weight::from_parts(33_324_000, 4681) .saturating_add(RocksDbWeight::get().reads(4_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } @@ -647,8 +666,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `775` // Estimated: `5996` - // Minimum execution time: 40_346_000 picoseconds. - Weight::from_parts(41_951_000, 5996) + // Minimum execution time: 38_128_000 picoseconds. + Weight::from_parts(39_274_000, 5996) .saturating_add(RocksDbWeight::get().reads(5_u64)) .saturating_add(RocksDbWeight::get().writes(5_u64)) } @@ -663,10 +682,10 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `859` // Estimated: `6196 + m * (2520 ±0)` - // Minimum execution time: 75_734_000 picoseconds. - Weight::from_parts(78_168_395, 6196) - // Standard Error: 63_180 - .saturating_add(Weight::from_parts(1_076_259, 0).saturating_mul(m.into())) + // Minimum execution time: 70_453_000 picoseconds. + Weight::from_parts(70_652_822, 6196) + // Standard Error: 75_524 + .saturating_add(Weight::from_parts(2_335_289, 0).saturating_mul(m.into())) .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().reads((1_u64).saturating_mul(m.into()))) .saturating_add(RocksDbWeight::get().writes(5_u64)) @@ -678,8 +697,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `103` // Estimated: `3593` - // Minimum execution time: 46_383_000 picoseconds. - Weight::from_parts(47_405_000, 3593) + // Minimum execution time: 43_945_000 picoseconds. + Weight::from_parts(45_249_000, 3593) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -691,8 +710,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `603` // Estimated: `3550` - // Minimum execution time: 30_994_000 picoseconds. - Weight::from_parts(31_979_000, 3550) + // Minimum execution time: 30_680_000 picoseconds. + Weight::from_parts(32_995_000, 3550) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -706,8 +725,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `601` // Estimated: `3533` - // Minimum execution time: 37_584_000 picoseconds. - Weight::from_parts(44_010_000, 3533) + // Minimum execution time: 48_053_000 picoseconds. + Weight::from_parts(51_364_000, 3533) .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -721,10 +740,10 @@ impl WeightInfo for () { /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) fn drop_history() -> Weight { // Proof Size summary in bytes: - // Measured: `830` + // Measured: `995` // Estimated: `3593` - // Minimum execution time: 45_266_000 picoseconds. - Weight::from_parts(48_000_000, 3593) + // Minimum execution time: 57_372_000 picoseconds. + Weight::from_parts(59_466_000, 3593) .saturating_add(RocksDbWeight::get().reads(4_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -734,34 +753,32 @@ impl WeightInfo for () { /// Proof: `Broker::AllowedRenewals` (`max_values`: None, `max_size`: Some(1233), added: 3708, mode: `MaxEncodedLen`) fn drop_renewal() -> Weight { // Proof Size summary in bytes: - // Measured: `525` + // Measured: `661` // Estimated: `4698` - // Minimum execution time: 25_365_000 picoseconds. - Weight::from_parts(26_920_000, 4698) + // Minimum execution time: 27_768_000 picoseconds. + Weight::from_parts(29_000_000, 4698) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } /// The range of component `n` is `[0, 1000]`. - fn request_core_count(n: u32, ) -> Weight { + fn request_core_count(_n: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 6_519_000 picoseconds. - Weight::from_parts(7_098_698, 0) - // Standard Error: 20 - .saturating_add(Weight::from_parts(8, 0).saturating_mul(n.into())) + // Minimum execution time: 4_588_000 picoseconds. + Weight::from_parts(5_201_705, 0) } - /// Storage: UNKNOWN KEY `0x18194fcb5c1fcace44d2d0a004272614` (r:1 w:1) - /// Proof: UNKNOWN KEY `0x18194fcb5c1fcace44d2d0a004272614` (r:1 w:1) + /// Storage: `Broker::CoreCountInbox` (r:1 w:1) + /// Proof: `Broker::CoreCountInbox` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) /// The range of component `n` is `[0, 1000]`. fn process_core_count(n: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `98` - // Estimated: `3563` - // Minimum execution time: 7_608_000 picoseconds. - Weight::from_parts(8_157_815, 3563) - // Standard Error: 26 - .saturating_add(Weight::from_parts(48, 0).saturating_mul(n.into())) + // Measured: `404` + // Estimated: `1487` + // Minimum execution time: 6_889_000 picoseconds. + Weight::from_parts(7_380_363, 1487) + // Standard Error: 21 + .saturating_add(Weight::from_parts(63, 0).saturating_mul(n.into())) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -777,10 +794,10 @@ impl WeightInfo for () { /// Proof: `System::Digest` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) fn process_revenue() -> Weight { // Proof Size summary in bytes: - // Measured: `905` - // Estimated: `4370` - // Minimum execution time: 59_993_000 picoseconds. - Weight::from_parts(61_752_000, 4370) + // Measured: `972` + // Estimated: `4437` + // Minimum execution time: 50_156_000 picoseconds. + Weight::from_parts(51_610_000, 4437) .saturating_add(RocksDbWeight::get().reads(5_u64)) .saturating_add(RocksDbWeight::get().writes(3_u64)) } @@ -799,10 +816,10 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `6281` // Estimated: `8499` - // Minimum execution time: 41_863_000 picoseconds. - Weight::from_parts(44_033_031, 8499) - // Standard Error: 116 - .saturating_add(Weight::from_parts(764, 0).saturating_mul(n.into())) + // Minimum execution time: 38_246_000 picoseconds. + Weight::from_parts(40_008_850, 8499) + // Standard Error: 94 + .saturating_add(Weight::from_parts(964, 0).saturating_mul(n.into())) .saturating_add(RocksDbWeight::get().reads(5_u64)) .saturating_add(RocksDbWeight::get().writes(15_u64)) } @@ -814,8 +831,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `180` // Estimated: `3493` - // Minimum execution time: 9_588_000 picoseconds. - Weight::from_parts(9_925_000, 3493) + // Minimum execution time: 7_962_000 picoseconds. + Weight::from_parts(8_313_000, 3493) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -827,8 +844,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `1423` // Estimated: `4681` - // Minimum execution time: 19_308_000 picoseconds. - Weight::from_parts(20_482_000, 4681) + // Minimum execution time: 17_457_000 picoseconds. + Weight::from_parts(18_387_000, 4681) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } @@ -836,28 +853,45 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 147_000 picoseconds. - Weight::from_parts(184_000, 0) + // Minimum execution time: 133_000 picoseconds. + Weight::from_parts(149_000, 0) } + /// Storage: `Broker::CoreCountInbox` (r:0 w:1) + /// Proof: `Broker::CoreCountInbox` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) fn notify_core_count() -> Weight { - RocksDbWeight::get().reads(1) - .saturating_add(RocksDbWeight::get().writes(1)) + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_407_000 picoseconds. + Weight::from_parts(2_634_000, 0) + .saturating_add(RocksDbWeight::get().writes(1_u64)) } /// Storage: `Broker::Status` (r:1 w:1) /// Proof: `Broker::Status` (`max_values`: Some(1), `max_size`: Some(18), added: 513, mode: `MaxEncodedLen`) /// Storage: `Broker::Configuration` (r:1 w:0) /// Proof: `Broker::Configuration` (`max_values`: Some(1), `max_size`: Some(31), added: 526, mode: `MaxEncodedLen`) - /// Storage: UNKNOWN KEY `0x18194fcb5c1fcace44d2d0a004272614` (r:1 w:1) - /// Proof: UNKNOWN KEY `0x18194fcb5c1fcace44d2d0a004272614` (r:1 w:1) + /// Storage: `Broker::CoreCountInbox` (r:1 w:0) + /// Proof: `Broker::CoreCountInbox` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) /// Storage: UNKNOWN KEY `0xf308d869daf021a7724e69c557dd8dbe` (r:1 w:1) /// Proof: UNKNOWN KEY `0xf308d869daf021a7724e69c557dd8dbe` (r:1 w:1) fn do_tick_base() -> Weight { // Proof Size summary in bytes: - // Measured: `699` - // Estimated: `4164` - // Minimum execution time: 19_824_000 picoseconds. - Weight::from_parts(20_983_000, 4164) + // Measured: `603` + // Estimated: `4068` + // Minimum execution time: 13_043_000 picoseconds. + Weight::from_parts(13_541_000, 4068) .saturating_add(RocksDbWeight::get().reads(4_u64)) - .saturating_add(RocksDbWeight::get().writes(3_u64)) + .saturating_add(RocksDbWeight::get().writes(2_u64)) + } + /// Storage: `Broker::Leases` (r:1 w:1) + /// Proof: `Broker::Leases` (`max_values`: Some(1), `max_size`: Some(41), added: 536, mode: `MaxEncodedLen`) + fn swap_leases() -> Weight { + // Proof Size summary in bytes: + // Measured: `239` + // Estimated: `1526` + // Minimum execution time: 6_606_000 picoseconds. + Weight::from_parts(6_964_000, 1526) + .saturating_add(RocksDbWeight::get().reads(1_u64)) + .saturating_add(RocksDbWeight::get().writes(1_u64)) } } diff --git a/substrate/frame/child-bounties/Cargo.toml b/substrate/frame/child-bounties/Cargo.toml index bcd8426c31645114230c03ca17fce6d67469c521..14a5e25e13da6a246e3935c90839a350bf773d2e 100644 --- a/substrate/frame/child-bounties/Cargo.toml +++ b/substrate/frame/child-bounties/Cargo.toml @@ -19,8 +19,8 @@ targets = ["x86_64-unknown-linux-gnu"] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = [ "derive", ] } -log = { version = "0.4.17", default-features = false } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +log = { workspace = true } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } frame-benchmarking = { path = "../benchmarking", default-features = false, optional = true } frame-support = { path = "../support", default-features = false } frame-system = { path = "../system", default-features = false } diff --git a/substrate/frame/child-bounties/src/tests.rs b/substrate/frame/child-bounties/src/tests.rs index d663b8d9961de87d14a202b393a9a4259f5bcdba..30601f821e4384827059ffc694ab0108a347bf8b 100644 --- a/substrate/frame/child-bounties/src/tests.rs +++ b/substrate/frame/child-bounties/src/tests.rs @@ -32,9 +32,8 @@ use frame_support::{ PalletId, }; -use sp_core::H256; use sp_runtime::{ - traits::{BadOrigin, BlakeTwo256, IdentityLookup}, + traits::{BadOrigin, IdentityLookup}, BuildStorage, Perbill, Permill, TokenError, }; @@ -62,31 +61,12 @@ parameter_types! { type Balance = u64; -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { - type BaseCallFilter = frame_support::traits::Everything; - type BlockWeights = (); - type BlockLength = (); - type DbWeight = (); - type RuntimeOrigin = RuntimeOrigin; - type Nonce = u64; - type RuntimeCall = RuntimeCall; - type Hash = H256; - type Hashing = BlakeTwo256; type AccountId = u128; type Lookup = IdentityLookup; type Block = Block; - type RuntimeEvent = RuntimeEvent; - type BlockHashCount = ConstU64<250>; - type Version = (); - type PalletInfo = PalletInfo; type AccountData = pallet_balances::AccountData; - type OnNewAccount = (); - type OnKilledAccount = (); - type SystemWeightInfo = (); - type SS58Prefix = (); - type OnSetCode = (); - type MaxConsumers = ConstU32<16>; } impl pallet_balances::Config for Test { diff --git a/substrate/frame/child-bounties/src/weights.rs b/substrate/frame/child-bounties/src/weights.rs index e4c1f238e88b7f94e177ab6005fca0beb3e91d1f..1c0583d58e02abc80b525cfab8e61e32a214e3d9 100644 --- a/substrate/frame/child-bounties/src/weights.rs +++ b/substrate/frame/child-bounties/src/weights.rs @@ -15,16 +15,16 @@ // See the License for the specific language governing permissions and // limitations under the License. -//! Autogenerated weights for pallet_child_bounties +//! Autogenerated weights for `pallet_child_bounties` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-06-16, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-04-08, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-e8ezs4ez-project-145-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("dev"), DB CACHE: 1024 +//! HOSTNAME: `runner-anb7yjbi-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: `1024` // Executed Command: -// ./target/production/substrate +// ./target/production/substrate-node // benchmark // pallet // --chain=dev @@ -35,12 +35,11 @@ // --no-median-slopes // --no-min-squares // --extrinsic=* -// --execution=wasm // --wasm-execution=compiled // --heap-pages=4096 -// --output=./frame/child-bounties/src/weights.rs -// --header=./HEADER-APACHE2 -// --template=./.maintain/frame-weight-template.hbs +// --output=./substrate/frame/child-bounties/src/weights.rs +// --header=./substrate/HEADER-APACHE2 +// --template=./substrate/.maintain/frame-weight-template.hbs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -50,7 +49,7 @@ use frame_support::{traits::Get, weights::{Weight, constants::RocksDbWeight}}; use core::marker::PhantomData; -/// Weight functions needed for pallet_child_bounties. +/// Weight functions needed for `pallet_child_bounties`. pub trait WeightInfo { fn add_child_bounty(d: u32, ) -> Weight; fn propose_curator() -> Weight; @@ -62,288 +61,288 @@ pub trait WeightInfo { fn close_child_bounty_active() -> Weight; } -/// Weights for pallet_child_bounties using the Substrate node and recommended hardware. +/// Weights for `pallet_child_bounties` using the Substrate node and recommended hardware. pub struct SubstrateWeight(PhantomData); impl WeightInfo for SubstrateWeight { - /// Storage: ChildBounties ParentChildBounties (r:1 w:1) - /// Proof: ChildBounties ParentChildBounties (max_values: None, max_size: Some(16), added: 2491, mode: MaxEncodedLen) - /// Storage: Bounties Bounties (r:1 w:0) - /// Proof: Bounties Bounties (max_values: None, max_size: Some(177), added: 2652, mode: MaxEncodedLen) - /// Storage: System Account (r:2 w:2) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) - /// Storage: ChildBounties ChildBountyCount (r:1 w:1) - /// Proof: ChildBounties ChildBountyCount (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: ChildBounties ChildBountyDescriptions (r:0 w:1) - /// Proof: ChildBounties ChildBountyDescriptions (max_values: None, max_size: Some(314), added: 2789, mode: MaxEncodedLen) - /// Storage: ChildBounties ChildBounties (r:0 w:1) - /// Proof: ChildBounties ChildBounties (max_values: None, max_size: Some(145), added: 2620, mode: MaxEncodedLen) + /// Storage: `ChildBounties::ParentChildBounties` (r:1 w:1) + /// Proof: `ChildBounties::ParentChildBounties` (`max_values`: None, `max_size`: Some(16), added: 2491, mode: `MaxEncodedLen`) + /// Storage: `Bounties::Bounties` (r:1 w:0) + /// Proof: `Bounties::Bounties` (`max_values`: None, `max_size`: Some(177), added: 2652, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:2 w:2) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `ChildBounties::ChildBountyCount` (r:1 w:1) + /// Proof: `ChildBounties::ChildBountyCount` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `ChildBounties::ChildBountyDescriptions` (r:0 w:1) + /// Proof: `ChildBounties::ChildBountyDescriptions` (`max_values`: None, `max_size`: Some(314), added: 2789, mode: `MaxEncodedLen`) + /// Storage: `ChildBounties::ChildBounties` (r:0 w:1) + /// Proof: `ChildBounties::ChildBounties` (`max_values`: None, `max_size`: Some(145), added: 2620, mode: `MaxEncodedLen`) /// The range of component `d` is `[0, 300]`. fn add_child_bounty(_d: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `712` + // Measured: `745` // Estimated: `6196` - // Minimum execution time: 69_805_000 picoseconds. - Weight::from_parts(73_216_717, 6196) + // Minimum execution time: 65_654_000 picoseconds. + Weight::from_parts(68_255_084, 6196) .saturating_add(T::DbWeight::get().reads(5_u64)) .saturating_add(T::DbWeight::get().writes(6_u64)) } - /// Storage: Bounties Bounties (r:1 w:0) - /// Proof: Bounties Bounties (max_values: None, max_size: Some(177), added: 2652, mode: MaxEncodedLen) - /// Storage: ChildBounties ChildBounties (r:1 w:1) - /// Proof: ChildBounties ChildBounties (max_values: None, max_size: Some(145), added: 2620, mode: MaxEncodedLen) - /// Storage: ChildBounties ChildrenCuratorFees (r:1 w:1) - /// Proof: ChildBounties ChildrenCuratorFees (max_values: None, max_size: Some(28), added: 2503, mode: MaxEncodedLen) + /// Storage: `Bounties::Bounties` (r:1 w:0) + /// Proof: `Bounties::Bounties` (`max_values`: None, `max_size`: Some(177), added: 2652, mode: `MaxEncodedLen`) + /// Storage: `ChildBounties::ChildBounties` (r:1 w:1) + /// Proof: `ChildBounties::ChildBounties` (`max_values`: None, `max_size`: Some(145), added: 2620, mode: `MaxEncodedLen`) + /// Storage: `ChildBounties::ChildrenCuratorFees` (r:1 w:1) + /// Proof: `ChildBounties::ChildrenCuratorFees` (`max_values`: None, `max_size`: Some(28), added: 2503, mode: `MaxEncodedLen`) fn propose_curator() -> Weight { // Proof Size summary in bytes: - // Measured: `766` + // Measured: `799` // Estimated: `3642` - // Minimum execution time: 18_190_000 picoseconds. - Weight::from_parts(18_932_000, 3642) + // Minimum execution time: 18_534_000 picoseconds. + Weight::from_parts(19_332_000, 3642) .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } - /// Storage: Bounties Bounties (r:1 w:0) - /// Proof: Bounties Bounties (max_values: None, max_size: Some(177), added: 2652, mode: MaxEncodedLen) - /// Storage: ChildBounties ChildBounties (r:1 w:1) - /// Proof: ChildBounties ChildBounties (max_values: None, max_size: Some(145), added: 2620, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: `Bounties::Bounties` (r:1 w:0) + /// Proof: `Bounties::Bounties` (`max_values`: None, `max_size`: Some(177), added: 2652, mode: `MaxEncodedLen`) + /// Storage: `ChildBounties::ChildBounties` (r:1 w:1) + /// Proof: `ChildBounties::ChildBounties` (`max_values`: None, `max_size`: Some(145), added: 2620, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) fn accept_curator() -> Weight { // Proof Size summary in bytes: - // Measured: `912` + // Measured: `945` // Estimated: `3642` - // Minimum execution time: 35_035_000 picoseconds. - Weight::from_parts(35_975_000, 3642) + // Minimum execution time: 33_212_000 picoseconds. + Weight::from_parts(35_407_000, 3642) .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } - /// Storage: ChildBounties ChildBounties (r:1 w:1) - /// Proof: ChildBounties ChildBounties (max_values: None, max_size: Some(145), added: 2620, mode: MaxEncodedLen) - /// Storage: Bounties Bounties (r:1 w:0) - /// Proof: Bounties Bounties (max_values: None, max_size: Some(177), added: 2652, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: `ChildBounties::ChildBounties` (r:1 w:1) + /// Proof: `ChildBounties::ChildBounties` (`max_values`: None, `max_size`: Some(145), added: 2620, mode: `MaxEncodedLen`) + /// Storage: `Bounties::Bounties` (r:1 w:0) + /// Proof: `Bounties::Bounties` (`max_values`: None, `max_size`: Some(177), added: 2652, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) fn unassign_curator() -> Weight { // Proof Size summary in bytes: - // Measured: `912` + // Measured: `945` // Estimated: `3642` - // Minimum execution time: 37_636_000 picoseconds. - Weight::from_parts(38_610_000, 3642) + // Minimum execution time: 35_510_000 picoseconds. + Weight::from_parts(36_345_000, 3642) .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } - /// Storage: Bounties Bounties (r:1 w:0) - /// Proof: Bounties Bounties (max_values: None, max_size: Some(177), added: 2652, mode: MaxEncodedLen) - /// Storage: ChildBounties ChildBounties (r:1 w:1) - /// Proof: ChildBounties ChildBounties (max_values: None, max_size: Some(145), added: 2620, mode: MaxEncodedLen) + /// Storage: `Bounties::Bounties` (r:1 w:0) + /// Proof: `Bounties::Bounties` (`max_values`: None, `max_size`: Some(177), added: 2652, mode: `MaxEncodedLen`) + /// Storage: `ChildBounties::ChildBounties` (r:1 w:1) + /// Proof: `ChildBounties::ChildBounties` (`max_values`: None, `max_size`: Some(145), added: 2620, mode: `MaxEncodedLen`) fn award_child_bounty() -> Weight { // Proof Size summary in bytes: - // Measured: `809` + // Measured: `842` // Estimated: `3642` - // Minimum execution time: 22_457_000 picoseconds. - Weight::from_parts(23_691_000, 3642) + // Minimum execution time: 19_085_000 picoseconds. + Weight::from_parts(20_094_000, 3642) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: ChildBounties ChildBounties (r:1 w:1) - /// Proof: ChildBounties ChildBounties (max_values: None, max_size: Some(145), added: 2620, mode: MaxEncodedLen) - /// Storage: System Account (r:3 w:3) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) - /// Storage: ChildBounties ParentChildBounties (r:1 w:1) - /// Proof: ChildBounties ParentChildBounties (max_values: None, max_size: Some(16), added: 2491, mode: MaxEncodedLen) - /// Storage: ChildBounties ChildBountyDescriptions (r:0 w:1) - /// Proof: ChildBounties ChildBountyDescriptions (max_values: None, max_size: Some(314), added: 2789, mode: MaxEncodedLen) + /// Storage: `ChildBounties::ChildBounties` (r:1 w:1) + /// Proof: `ChildBounties::ChildBounties` (`max_values`: None, `max_size`: Some(145), added: 2620, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:3 w:3) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `ChildBounties::ParentChildBounties` (r:1 w:1) + /// Proof: `ChildBounties::ParentChildBounties` (`max_values`: None, `max_size`: Some(16), added: 2491, mode: `MaxEncodedLen`) + /// Storage: `ChildBounties::ChildBountyDescriptions` (r:0 w:1) + /// Proof: `ChildBounties::ChildBountyDescriptions` (`max_values`: None, `max_size`: Some(314), added: 2789, mode: `MaxEncodedLen`) fn claim_child_bounty() -> Weight { // Proof Size summary in bytes: // Measured: `682` // Estimated: `8799` - // Minimum execution time: 118_272_000 picoseconds. - Weight::from_parts(121_646_000, 8799) + // Minimum execution time: 110_529_000 picoseconds. + Weight::from_parts(112_660_000, 8799) .saturating_add(T::DbWeight::get().reads(5_u64)) .saturating_add(T::DbWeight::get().writes(6_u64)) } - /// Storage: Bounties Bounties (r:1 w:0) - /// Proof: Bounties Bounties (max_values: None, max_size: Some(177), added: 2652, mode: MaxEncodedLen) - /// Storage: ChildBounties ChildBounties (r:1 w:1) - /// Proof: ChildBounties ChildBounties (max_values: None, max_size: Some(145), added: 2620, mode: MaxEncodedLen) - /// Storage: ChildBounties ChildrenCuratorFees (r:1 w:1) - /// Proof: ChildBounties ChildrenCuratorFees (max_values: None, max_size: Some(28), added: 2503, mode: MaxEncodedLen) - /// Storage: ChildBounties ParentChildBounties (r:1 w:1) - /// Proof: ChildBounties ParentChildBounties (max_values: None, max_size: Some(16), added: 2491, mode: MaxEncodedLen) - /// Storage: System Account (r:2 w:2) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) - /// Storage: ChildBounties ChildBountyDescriptions (r:0 w:1) - /// Proof: ChildBounties ChildBountyDescriptions (max_values: None, max_size: Some(314), added: 2789, mode: MaxEncodedLen) + /// Storage: `Bounties::Bounties` (r:1 w:0) + /// Proof: `Bounties::Bounties` (`max_values`: None, `max_size`: Some(177), added: 2652, mode: `MaxEncodedLen`) + /// Storage: `ChildBounties::ChildBounties` (r:1 w:1) + /// Proof: `ChildBounties::ChildBounties` (`max_values`: None, `max_size`: Some(145), added: 2620, mode: `MaxEncodedLen`) + /// Storage: `ChildBounties::ChildrenCuratorFees` (r:1 w:1) + /// Proof: `ChildBounties::ChildrenCuratorFees` (`max_values`: None, `max_size`: Some(28), added: 2503, mode: `MaxEncodedLen`) + /// Storage: `ChildBounties::ParentChildBounties` (r:1 w:1) + /// Proof: `ChildBounties::ParentChildBounties` (`max_values`: None, `max_size`: Some(16), added: 2491, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:2 w:2) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `ChildBounties::ChildBountyDescriptions` (r:0 w:1) + /// Proof: `ChildBounties::ChildBountyDescriptions` (`max_values`: None, `max_size`: Some(314), added: 2789, mode: `MaxEncodedLen`) fn close_child_bounty_added() -> Weight { // Proof Size summary in bytes: - // Measured: `1012` + // Measured: `1045` // Estimated: `6196` - // Minimum execution time: 75_717_000 picoseconds. - Weight::from_parts(77_837_000, 6196) + // Minimum execution time: 76_363_000 picoseconds. + Weight::from_parts(77_799_000, 6196) .saturating_add(T::DbWeight::get().reads(6_u64)) .saturating_add(T::DbWeight::get().writes(6_u64)) } - /// Storage: Bounties Bounties (r:1 w:0) - /// Proof: Bounties Bounties (max_values: None, max_size: Some(177), added: 2652, mode: MaxEncodedLen) - /// Storage: ChildBounties ChildBounties (r:1 w:1) - /// Proof: ChildBounties ChildBounties (max_values: None, max_size: Some(145), added: 2620, mode: MaxEncodedLen) - /// Storage: System Account (r:3 w:3) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) - /// Storage: ChildBounties ChildrenCuratorFees (r:1 w:1) - /// Proof: ChildBounties ChildrenCuratorFees (max_values: None, max_size: Some(28), added: 2503, mode: MaxEncodedLen) - /// Storage: ChildBounties ParentChildBounties (r:1 w:1) - /// Proof: ChildBounties ParentChildBounties (max_values: None, max_size: Some(16), added: 2491, mode: MaxEncodedLen) - /// Storage: ChildBounties ChildBountyDescriptions (r:0 w:1) - /// Proof: ChildBounties ChildBountyDescriptions (max_values: None, max_size: Some(314), added: 2789, mode: MaxEncodedLen) + /// Storage: `Bounties::Bounties` (r:1 w:0) + /// Proof: `Bounties::Bounties` (`max_values`: None, `max_size`: Some(177), added: 2652, mode: `MaxEncodedLen`) + /// Storage: `ChildBounties::ChildBounties` (r:1 w:1) + /// Proof: `ChildBounties::ChildBounties` (`max_values`: None, `max_size`: Some(145), added: 2620, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:3 w:3) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `ChildBounties::ChildrenCuratorFees` (r:1 w:1) + /// Proof: `ChildBounties::ChildrenCuratorFees` (`max_values`: None, `max_size`: Some(28), added: 2503, mode: `MaxEncodedLen`) + /// Storage: `ChildBounties::ParentChildBounties` (r:1 w:1) + /// Proof: `ChildBounties::ParentChildBounties` (`max_values`: None, `max_size`: Some(16), added: 2491, mode: `MaxEncodedLen`) + /// Storage: `ChildBounties::ChildBountyDescriptions` (r:0 w:1) + /// Proof: `ChildBounties::ChildBountyDescriptions` (`max_values`: None, `max_size`: Some(314), added: 2789, mode: `MaxEncodedLen`) fn close_child_bounty_active() -> Weight { // Proof Size summary in bytes: - // Measured: `1199` + // Measured: `1232` // Estimated: `8799` - // Minimum execution time: 94_215_000 picoseconds. - Weight::from_parts(97_017_000, 8799) + // Minimum execution time: 89_977_000 picoseconds. + Weight::from_parts(92_978_000, 8799) .saturating_add(T::DbWeight::get().reads(7_u64)) .saturating_add(T::DbWeight::get().writes(7_u64)) } } -// For backwards compatibility and tests +// For backwards compatibility and tests. impl WeightInfo for () { - /// Storage: ChildBounties ParentChildBounties (r:1 w:1) - /// Proof: ChildBounties ParentChildBounties (max_values: None, max_size: Some(16), added: 2491, mode: MaxEncodedLen) - /// Storage: Bounties Bounties (r:1 w:0) - /// Proof: Bounties Bounties (max_values: None, max_size: Some(177), added: 2652, mode: MaxEncodedLen) - /// Storage: System Account (r:2 w:2) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) - /// Storage: ChildBounties ChildBountyCount (r:1 w:1) - /// Proof: ChildBounties ChildBountyCount (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: ChildBounties ChildBountyDescriptions (r:0 w:1) - /// Proof: ChildBounties ChildBountyDescriptions (max_values: None, max_size: Some(314), added: 2789, mode: MaxEncodedLen) - /// Storage: ChildBounties ChildBounties (r:0 w:1) - /// Proof: ChildBounties ChildBounties (max_values: None, max_size: Some(145), added: 2620, mode: MaxEncodedLen) + /// Storage: `ChildBounties::ParentChildBounties` (r:1 w:1) + /// Proof: `ChildBounties::ParentChildBounties` (`max_values`: None, `max_size`: Some(16), added: 2491, mode: `MaxEncodedLen`) + /// Storage: `Bounties::Bounties` (r:1 w:0) + /// Proof: `Bounties::Bounties` (`max_values`: None, `max_size`: Some(177), added: 2652, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:2 w:2) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `ChildBounties::ChildBountyCount` (r:1 w:1) + /// Proof: `ChildBounties::ChildBountyCount` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `ChildBounties::ChildBountyDescriptions` (r:0 w:1) + /// Proof: `ChildBounties::ChildBountyDescriptions` (`max_values`: None, `max_size`: Some(314), added: 2789, mode: `MaxEncodedLen`) + /// Storage: `ChildBounties::ChildBounties` (r:0 w:1) + /// Proof: `ChildBounties::ChildBounties` (`max_values`: None, `max_size`: Some(145), added: 2620, mode: `MaxEncodedLen`) /// The range of component `d` is `[0, 300]`. fn add_child_bounty(_d: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `712` + // Measured: `745` // Estimated: `6196` - // Minimum execution time: 69_805_000 picoseconds. - Weight::from_parts(73_216_717, 6196) + // Minimum execution time: 65_654_000 picoseconds. + Weight::from_parts(68_255_084, 6196) .saturating_add(RocksDbWeight::get().reads(5_u64)) .saturating_add(RocksDbWeight::get().writes(6_u64)) } - /// Storage: Bounties Bounties (r:1 w:0) - /// Proof: Bounties Bounties (max_values: None, max_size: Some(177), added: 2652, mode: MaxEncodedLen) - /// Storage: ChildBounties ChildBounties (r:1 w:1) - /// Proof: ChildBounties ChildBounties (max_values: None, max_size: Some(145), added: 2620, mode: MaxEncodedLen) - /// Storage: ChildBounties ChildrenCuratorFees (r:1 w:1) - /// Proof: ChildBounties ChildrenCuratorFees (max_values: None, max_size: Some(28), added: 2503, mode: MaxEncodedLen) + /// Storage: `Bounties::Bounties` (r:1 w:0) + /// Proof: `Bounties::Bounties` (`max_values`: None, `max_size`: Some(177), added: 2652, mode: `MaxEncodedLen`) + /// Storage: `ChildBounties::ChildBounties` (r:1 w:1) + /// Proof: `ChildBounties::ChildBounties` (`max_values`: None, `max_size`: Some(145), added: 2620, mode: `MaxEncodedLen`) + /// Storage: `ChildBounties::ChildrenCuratorFees` (r:1 w:1) + /// Proof: `ChildBounties::ChildrenCuratorFees` (`max_values`: None, `max_size`: Some(28), added: 2503, mode: `MaxEncodedLen`) fn propose_curator() -> Weight { // Proof Size summary in bytes: - // Measured: `766` + // Measured: `799` // Estimated: `3642` - // Minimum execution time: 18_190_000 picoseconds. - Weight::from_parts(18_932_000, 3642) + // Minimum execution time: 18_534_000 picoseconds. + Weight::from_parts(19_332_000, 3642) .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } - /// Storage: Bounties Bounties (r:1 w:0) - /// Proof: Bounties Bounties (max_values: None, max_size: Some(177), added: 2652, mode: MaxEncodedLen) - /// Storage: ChildBounties ChildBounties (r:1 w:1) - /// Proof: ChildBounties ChildBounties (max_values: None, max_size: Some(145), added: 2620, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: `Bounties::Bounties` (r:1 w:0) + /// Proof: `Bounties::Bounties` (`max_values`: None, `max_size`: Some(177), added: 2652, mode: `MaxEncodedLen`) + /// Storage: `ChildBounties::ChildBounties` (r:1 w:1) + /// Proof: `ChildBounties::ChildBounties` (`max_values`: None, `max_size`: Some(145), added: 2620, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) fn accept_curator() -> Weight { // Proof Size summary in bytes: - // Measured: `912` + // Measured: `945` // Estimated: `3642` - // Minimum execution time: 35_035_000 picoseconds. - Weight::from_parts(35_975_000, 3642) + // Minimum execution time: 33_212_000 picoseconds. + Weight::from_parts(35_407_000, 3642) .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } - /// Storage: ChildBounties ChildBounties (r:1 w:1) - /// Proof: ChildBounties ChildBounties (max_values: None, max_size: Some(145), added: 2620, mode: MaxEncodedLen) - /// Storage: Bounties Bounties (r:1 w:0) - /// Proof: Bounties Bounties (max_values: None, max_size: Some(177), added: 2652, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: `ChildBounties::ChildBounties` (r:1 w:1) + /// Proof: `ChildBounties::ChildBounties` (`max_values`: None, `max_size`: Some(145), added: 2620, mode: `MaxEncodedLen`) + /// Storage: `Bounties::Bounties` (r:1 w:0) + /// Proof: `Bounties::Bounties` (`max_values`: None, `max_size`: Some(177), added: 2652, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) fn unassign_curator() -> Weight { // Proof Size summary in bytes: - // Measured: `912` + // Measured: `945` // Estimated: `3642` - // Minimum execution time: 37_636_000 picoseconds. - Weight::from_parts(38_610_000, 3642) + // Minimum execution time: 35_510_000 picoseconds. + Weight::from_parts(36_345_000, 3642) .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } - /// Storage: Bounties Bounties (r:1 w:0) - /// Proof: Bounties Bounties (max_values: None, max_size: Some(177), added: 2652, mode: MaxEncodedLen) - /// Storage: ChildBounties ChildBounties (r:1 w:1) - /// Proof: ChildBounties ChildBounties (max_values: None, max_size: Some(145), added: 2620, mode: MaxEncodedLen) + /// Storage: `Bounties::Bounties` (r:1 w:0) + /// Proof: `Bounties::Bounties` (`max_values`: None, `max_size`: Some(177), added: 2652, mode: `MaxEncodedLen`) + /// Storage: `ChildBounties::ChildBounties` (r:1 w:1) + /// Proof: `ChildBounties::ChildBounties` (`max_values`: None, `max_size`: Some(145), added: 2620, mode: `MaxEncodedLen`) fn award_child_bounty() -> Weight { // Proof Size summary in bytes: - // Measured: `809` + // Measured: `842` // Estimated: `3642` - // Minimum execution time: 22_457_000 picoseconds. - Weight::from_parts(23_691_000, 3642) + // Minimum execution time: 19_085_000 picoseconds. + Weight::from_parts(20_094_000, 3642) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: ChildBounties ChildBounties (r:1 w:1) - /// Proof: ChildBounties ChildBounties (max_values: None, max_size: Some(145), added: 2620, mode: MaxEncodedLen) - /// Storage: System Account (r:3 w:3) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) - /// Storage: ChildBounties ParentChildBounties (r:1 w:1) - /// Proof: ChildBounties ParentChildBounties (max_values: None, max_size: Some(16), added: 2491, mode: MaxEncodedLen) - /// Storage: ChildBounties ChildBountyDescriptions (r:0 w:1) - /// Proof: ChildBounties ChildBountyDescriptions (max_values: None, max_size: Some(314), added: 2789, mode: MaxEncodedLen) + /// Storage: `ChildBounties::ChildBounties` (r:1 w:1) + /// Proof: `ChildBounties::ChildBounties` (`max_values`: None, `max_size`: Some(145), added: 2620, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:3 w:3) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `ChildBounties::ParentChildBounties` (r:1 w:1) + /// Proof: `ChildBounties::ParentChildBounties` (`max_values`: None, `max_size`: Some(16), added: 2491, mode: `MaxEncodedLen`) + /// Storage: `ChildBounties::ChildBountyDescriptions` (r:0 w:1) + /// Proof: `ChildBounties::ChildBountyDescriptions` (`max_values`: None, `max_size`: Some(314), added: 2789, mode: `MaxEncodedLen`) fn claim_child_bounty() -> Weight { // Proof Size summary in bytes: // Measured: `682` // Estimated: `8799` - // Minimum execution time: 118_272_000 picoseconds. - Weight::from_parts(121_646_000, 8799) + // Minimum execution time: 110_529_000 picoseconds. + Weight::from_parts(112_660_000, 8799) .saturating_add(RocksDbWeight::get().reads(5_u64)) .saturating_add(RocksDbWeight::get().writes(6_u64)) } - /// Storage: Bounties Bounties (r:1 w:0) - /// Proof: Bounties Bounties (max_values: None, max_size: Some(177), added: 2652, mode: MaxEncodedLen) - /// Storage: ChildBounties ChildBounties (r:1 w:1) - /// Proof: ChildBounties ChildBounties (max_values: None, max_size: Some(145), added: 2620, mode: MaxEncodedLen) - /// Storage: ChildBounties ChildrenCuratorFees (r:1 w:1) - /// Proof: ChildBounties ChildrenCuratorFees (max_values: None, max_size: Some(28), added: 2503, mode: MaxEncodedLen) - /// Storage: ChildBounties ParentChildBounties (r:1 w:1) - /// Proof: ChildBounties ParentChildBounties (max_values: None, max_size: Some(16), added: 2491, mode: MaxEncodedLen) - /// Storage: System Account (r:2 w:2) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) - /// Storage: ChildBounties ChildBountyDescriptions (r:0 w:1) - /// Proof: ChildBounties ChildBountyDescriptions (max_values: None, max_size: Some(314), added: 2789, mode: MaxEncodedLen) + /// Storage: `Bounties::Bounties` (r:1 w:0) + /// Proof: `Bounties::Bounties` (`max_values`: None, `max_size`: Some(177), added: 2652, mode: `MaxEncodedLen`) + /// Storage: `ChildBounties::ChildBounties` (r:1 w:1) + /// Proof: `ChildBounties::ChildBounties` (`max_values`: None, `max_size`: Some(145), added: 2620, mode: `MaxEncodedLen`) + /// Storage: `ChildBounties::ChildrenCuratorFees` (r:1 w:1) + /// Proof: `ChildBounties::ChildrenCuratorFees` (`max_values`: None, `max_size`: Some(28), added: 2503, mode: `MaxEncodedLen`) + /// Storage: `ChildBounties::ParentChildBounties` (r:1 w:1) + /// Proof: `ChildBounties::ParentChildBounties` (`max_values`: None, `max_size`: Some(16), added: 2491, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:2 w:2) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `ChildBounties::ChildBountyDescriptions` (r:0 w:1) + /// Proof: `ChildBounties::ChildBountyDescriptions` (`max_values`: None, `max_size`: Some(314), added: 2789, mode: `MaxEncodedLen`) fn close_child_bounty_added() -> Weight { // Proof Size summary in bytes: - // Measured: `1012` + // Measured: `1045` // Estimated: `6196` - // Minimum execution time: 75_717_000 picoseconds. - Weight::from_parts(77_837_000, 6196) + // Minimum execution time: 76_363_000 picoseconds. + Weight::from_parts(77_799_000, 6196) .saturating_add(RocksDbWeight::get().reads(6_u64)) .saturating_add(RocksDbWeight::get().writes(6_u64)) } - /// Storage: Bounties Bounties (r:1 w:0) - /// Proof: Bounties Bounties (max_values: None, max_size: Some(177), added: 2652, mode: MaxEncodedLen) - /// Storage: ChildBounties ChildBounties (r:1 w:1) - /// Proof: ChildBounties ChildBounties (max_values: None, max_size: Some(145), added: 2620, mode: MaxEncodedLen) - /// Storage: System Account (r:3 w:3) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) - /// Storage: ChildBounties ChildrenCuratorFees (r:1 w:1) - /// Proof: ChildBounties ChildrenCuratorFees (max_values: None, max_size: Some(28), added: 2503, mode: MaxEncodedLen) - /// Storage: ChildBounties ParentChildBounties (r:1 w:1) - /// Proof: ChildBounties ParentChildBounties (max_values: None, max_size: Some(16), added: 2491, mode: MaxEncodedLen) - /// Storage: ChildBounties ChildBountyDescriptions (r:0 w:1) - /// Proof: ChildBounties ChildBountyDescriptions (max_values: None, max_size: Some(314), added: 2789, mode: MaxEncodedLen) + /// Storage: `Bounties::Bounties` (r:1 w:0) + /// Proof: `Bounties::Bounties` (`max_values`: None, `max_size`: Some(177), added: 2652, mode: `MaxEncodedLen`) + /// Storage: `ChildBounties::ChildBounties` (r:1 w:1) + /// Proof: `ChildBounties::ChildBounties` (`max_values`: None, `max_size`: Some(145), added: 2620, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:3 w:3) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `ChildBounties::ChildrenCuratorFees` (r:1 w:1) + /// Proof: `ChildBounties::ChildrenCuratorFees` (`max_values`: None, `max_size`: Some(28), added: 2503, mode: `MaxEncodedLen`) + /// Storage: `ChildBounties::ParentChildBounties` (r:1 w:1) + /// Proof: `ChildBounties::ParentChildBounties` (`max_values`: None, `max_size`: Some(16), added: 2491, mode: `MaxEncodedLen`) + /// Storage: `ChildBounties::ChildBountyDescriptions` (r:0 w:1) + /// Proof: `ChildBounties::ChildBountyDescriptions` (`max_values`: None, `max_size`: Some(314), added: 2789, mode: `MaxEncodedLen`) fn close_child_bounty_active() -> Weight { // Proof Size summary in bytes: - // Measured: `1199` + // Measured: `1232` // Estimated: `8799` - // Minimum execution time: 94_215_000 picoseconds. - Weight::from_parts(97_017_000, 8799) + // Minimum execution time: 89_977_000 picoseconds. + Weight::from_parts(92_978_000, 8799) .saturating_add(RocksDbWeight::get().reads(7_u64)) .saturating_add(RocksDbWeight::get().writes(7_u64)) } diff --git a/substrate/frame/collective/Cargo.toml b/substrate/frame/collective/Cargo.toml index 91bb36bb89ec79fa8a71b0a4a41888383aab5553..850390409abc9646afbdb058dd2392d9f35869aa 100644 --- a/substrate/frame/collective/Cargo.toml +++ b/substrate/frame/collective/Cargo.toml @@ -17,8 +17,8 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } -log = { version = "0.4.17", default-features = false } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +log = { workspace = true } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } frame-benchmarking = { path = "../benchmarking", default-features = false, optional = true } frame-support = { path = "../support", default-features = false } frame-system = { path = "../system", default-features = false } diff --git a/substrate/frame/collective/README.md b/substrate/frame/collective/README.md index 444927e51da22898c893b668328521606ba8a9a4..e860edbd484bb872bd241e13cf80f4928a278307 100644 --- a/substrate/frame/collective/README.md +++ b/substrate/frame/collective/README.md @@ -9,7 +9,7 @@ calculations, but enforces this neither in `set_members` nor in `change_members_ A "prime" member may be set to help determine the default vote behavior based on chain config. If `PrimeDefaultVote` is used, the prime vote acts as the default vote in case of any abstentions after the voting period. If `MoreThanMajorityThenPrimeDefaultVote` is used, then -abstentations will first follow the majority of the collective voting, and then the prime +abstentions will first follow the majority of the collective voting, and then the prime member. Voting happens through motions comprising a proposal (i.e. a dispatchable) plus a diff --git a/substrate/frame/collective/src/benchmarking.rs b/substrate/frame/collective/src/benchmarking.rs index 503d72510530903ba1676fe6630c326ef1a4f770..7b5df17b60a696a17b706dd01f05f2a01d3e787e 100644 --- a/substrate/frame/collective/src/benchmarking.rs +++ b/substrate/frame/collective/src/benchmarking.rs @@ -20,8 +20,8 @@ use super::*; use crate::Pallet as Collective; +use core::mem::size_of; use sp_runtime::traits::Bounded; -use sp_std::mem::size_of; use frame_benchmarking::v1::{account, benchmarks_instance_pallet, whitelisted_caller}; use frame_system::{ @@ -105,7 +105,7 @@ benchmarks_instance_pallet! { }: _(SystemOrigin::Root, new_members.clone(), new_members.last().cloned(), T::MaxMembers::get()) verify { new_members.sort(); - assert_eq!(Collective::::members(), new_members); + assert_eq!(Members::::get(), new_members); } execute { @@ -199,14 +199,14 @@ benchmarks_instance_pallet! { )?; } - assert_eq!(Collective::::proposals().len(), (p - 1) as usize); + assert_eq!(Proposals::::get().len(), (p - 1) as usize); let proposal: T::Proposal = SystemCall::::remark { remark: id_to_remark_data(p, b as usize) }.into(); }: propose(SystemOrigin::Signed(caller.clone()), threshold, Box::new(proposal.clone()), bytes_in_storage) verify { // New proposal is recorded - assert_eq!(Collective::::proposals().len(), p as usize); + assert_eq!(Proposals::::get().len(), p as usize); let proposal_hash = T::Hashing::hash_of(&proposal); assert_last_event::(Event::Proposed { account: caller, proposal_index: p - 1, proposal_hash, threshold }.into()); } @@ -269,7 +269,7 @@ benchmarks_instance_pallet! { approve, )?; - assert_eq!(Collective::::proposals().len(), p as usize); + assert_eq!(Proposals::::get().len(), p as usize); // Voter switches vote to nay, but does not kill the vote, just updates + inserts let approve = false; @@ -280,8 +280,8 @@ benchmarks_instance_pallet! { }: _(SystemOrigin::Signed(voter), last_hash, index, approve) verify { // All proposals exist and the last proposal has just been updated. - assert_eq!(Collective::::proposals().len(), p as usize); - let voting = Collective::::voting(&last_hash).ok_or("Proposal Missing")?; + assert_eq!(Proposals::::get().len(), p as usize); + let voting = Voting::::get(&last_hash).ok_or("Proposal Missing")?; assert_eq!(voting.ayes.len(), (m - 3) as usize); assert_eq!(voting.nays.len(), 1); } @@ -344,7 +344,7 @@ benchmarks_instance_pallet! { approve, )?; - assert_eq!(Collective::::proposals().len(), p as usize); + assert_eq!(Proposals::::get().len(), p as usize); // Voter switches vote to nay, which kills the vote let approve = false; @@ -361,7 +361,7 @@ benchmarks_instance_pallet! { }: close(SystemOrigin::Signed(voter), last_hash, index, Weight::MAX, bytes_in_storage) verify { // The last proposal is removed. - assert_eq!(Collective::::proposals().len(), (p - 1) as usize); + assert_eq!(Proposals::::get().len(), (p - 1) as usize); assert_last_event::(Event::Disapproved { proposal_hash: last_hash }.into()); } @@ -428,7 +428,7 @@ benchmarks_instance_pallet! { true, )?; - assert_eq!(Collective::::proposals().len(), p as usize); + assert_eq!(Proposals::::get().len(), p as usize); // Caller switches vote to aye, which passes the vote let index = p - 1; @@ -442,7 +442,7 @@ benchmarks_instance_pallet! { }: close(SystemOrigin::Signed(caller), last_hash, index, Weight::MAX, bytes_in_storage) verify { // The last proposal is removed. - assert_eq!(Collective::::proposals().len(), (p - 1) as usize); + assert_eq!(Proposals::::get().len(), (p - 1) as usize); assert_last_event::(Event::Executed { proposal_hash: last_hash, result: Ok(()) }.into()); } @@ -519,12 +519,12 @@ benchmarks_instance_pallet! { )?; System::::set_block_number(BlockNumberFor::::max_value()); - assert_eq!(Collective::::proposals().len(), p as usize); + assert_eq!(Proposals::::get().len(), p as usize); // Prime nay will close it as disapproved }: close(SystemOrigin::Signed(caller), last_hash, index, Weight::MAX, bytes_in_storage) verify { - assert_eq!(Collective::::proposals().len(), (p - 1) as usize); + assert_eq!(Proposals::::get().len(), (p - 1) as usize); assert_last_event::(Event::Disapproved { proposal_hash: last_hash }.into()); } @@ -591,12 +591,12 @@ benchmarks_instance_pallet! { // caller is prime, prime already votes aye by creating the proposal System::::set_block_number(BlockNumberFor::::max_value()); - assert_eq!(Collective::::proposals().len(), p as usize); + assert_eq!(Proposals::::get().len(), p as usize); // Prime aye will close it as approved }: close(SystemOrigin::Signed(caller), last_hash, p - 1, Weight::MAX, bytes_in_storage) verify { - assert_eq!(Collective::::proposals().len(), (p - 1) as usize); + assert_eq!(Proposals::::get().len(), (p - 1) as usize); assert_last_event::(Event::Executed { proposal_hash: last_hash, result: Ok(()) }.into()); } @@ -640,11 +640,11 @@ benchmarks_instance_pallet! { } System::::set_block_number(BlockNumberFor::::max_value()); - assert_eq!(Collective::::proposals().len(), p as usize); + assert_eq!(Proposals::::get().len(), p as usize); }: _(SystemOrigin::Root, last_hash) verify { - assert_eq!(Collective::::proposals().len(), (p - 1) as usize); + assert_eq!(Proposals::::get().len(), (p - 1) as usize); assert_last_event::(Event::Disapproved { proposal_hash: last_hash }.into()); } diff --git a/substrate/frame/collective/src/lib.rs b/substrate/frame/collective/src/lib.rs index 10f989e5c4cc6ef92c258c21455d8f227dcf3dbe..d0009d02f68c2f0d26e5847221c85ede39e9e633 100644 --- a/substrate/frame/collective/src/lib.rs +++ b/substrate/frame/collective/src/lib.rs @@ -40,7 +40,6 @@ //! If there are not, or if no prime is set, then the motion is dropped without being executed. #![cfg_attr(not(feature = "std"), no_std)] -#![recursion_limit = "128"] use codec::{Decode, Encode, MaxEncodedLen}; use scale_info::TypeInfo; @@ -177,7 +176,7 @@ pub mod pallet { use frame_support::pallet_prelude::*; use frame_system::pallet_prelude::*; - /// The current storage version. + /// The in-code storage version. const STORAGE_VERSION: StorageVersion = StorageVersion::new(4); #[pallet::pallet] @@ -262,36 +261,30 @@ pub mod pallet { /// The hashes of the active proposals. #[pallet::storage] - #[pallet::getter(fn proposals)] pub type Proposals, I: 'static = ()> = StorageValue<_, BoundedVec, ValueQuery>; /// Actual proposal for a given hash, if it's current. #[pallet::storage] - #[pallet::getter(fn proposal_of)] pub type ProposalOf, I: 'static = ()> = StorageMap<_, Identity, T::Hash, >::Proposal, OptionQuery>; /// Votes on a given proposal, if it is ongoing. #[pallet::storage] - #[pallet::getter(fn voting)] pub type Voting, I: 'static = ()> = StorageMap<_, Identity, T::Hash, Votes>, OptionQuery>; /// Proposals so far. #[pallet::storage] - #[pallet::getter(fn proposal_count)] pub type ProposalCount, I: 'static = ()> = StorageValue<_, u32, ValueQuery>; /// The current members of the collective. This is stored sorted (just by value). #[pallet::storage] - #[pallet::getter(fn members)] pub type Members, I: 'static = ()> = StorageValue<_, Vec, ValueQuery>; - /// The prime member that helps determine the default vote behavior in case of absentations. + /// The prime member that helps determine the default vote behavior in case of abstentions. #[pallet::storage] - #[pallet::getter(fn prime)] pub type Prime, I: 'static = ()> = StorageValue<_, T::AccountId, OptionQuery>; #[pallet::event] @@ -460,7 +453,7 @@ pub mod pallet { #[pallet::compact] length_bound: u32, ) -> DispatchResultWithPostInfo { let who = ensure_signed(origin)?; - let members = Self::members(); + let members = Members::::get(); ensure!(members.contains(&who), Error::::NotMember); let proposal_len = proposal.encoded_size(); ensure!(proposal_len <= length_bound as usize, Error::::WrongProposalLength); @@ -520,7 +513,7 @@ pub mod pallet { #[pallet::compact] length_bound: u32, ) -> DispatchResultWithPostInfo { let who = ensure_signed(origin)?; - let members = Self::members(); + let members = Members::::get(); ensure!(members.contains(&who), Error::::NotMember); if threshold < 2 { @@ -566,7 +559,7 @@ pub mod pallet { approve: bool, ) -> DispatchResultWithPostInfo { let who = ensure_signed(origin)?; - let members = Self::members(); + let members = Members::::get(); ensure!(members.contains(&who), Error::::NotMember); // Detects first vote of the member in the motion @@ -670,7 +663,7 @@ impl, I: 'static> Pallet { pub fn is_member(who: &T::AccountId) -> bool { // Note: The dispatchables *do not* use this to check membership so make sure // to update those if this is changed. - Self::members().contains(who) + Members::::get().contains(who) } /// Execute immediately when adding a new proposal. @@ -689,7 +682,7 @@ impl, I: 'static> Pallet { let proposal_hash = T::Hashing::hash_of(&proposal); ensure!(!>::contains_key(proposal_hash), Error::::DuplicateProposal); - let seats = Self::members().len() as MemberCount; + let seats = Members::::get().len() as MemberCount; let result = proposal.dispatch(RawOrigin::Members(1, seats).into()); Self::deposit_event(Event::Executed { proposal_hash, @@ -722,7 +715,7 @@ impl, I: 'static> Pallet { Ok(proposals.len()) })?; - let index = Self::proposal_count(); + let index = ProposalCount::::get(); >::mutate(|i| *i += 1); >::insert(proposal_hash, proposal); let votes = { @@ -748,7 +741,7 @@ impl, I: 'static> Pallet { index: ProposalIndex, approve: bool, ) -> Result { - let mut voting = Self::voting(&proposal).ok_or(Error::::ProposalMissing)?; + let mut voting = Voting::::get(&proposal).ok_or(Error::::ProposalMissing)?; ensure!(voting.index == index, Error::::WrongIndex); let position_yes = voting.ayes.iter().position(|a| a == &who); @@ -799,12 +792,12 @@ impl, I: 'static> Pallet { proposal_weight_bound: Weight, length_bound: u32, ) -> DispatchResultWithPostInfo { - let voting = Self::voting(&proposal_hash).ok_or(Error::::ProposalMissing)?; + let voting = Voting::::get(&proposal_hash).ok_or(Error::::ProposalMissing)?; ensure!(voting.index == index, Error::::WrongIndex); let mut no_votes = voting.nays.len() as MemberCount; let mut yes_votes = voting.ayes.len() as MemberCount; - let seats = Self::members().len() as MemberCount; + let seats = Members::::get().len() as MemberCount; let approved = yes_votes >= voting.threshold; let disapproved = seats.saturating_sub(no_votes) < voting.threshold; // Allow (dis-)approving the proposal as soon as there are enough votes. @@ -838,7 +831,7 @@ impl, I: 'static> Pallet { // Only allow actual closing of the proposal after the voting period has ended. ensure!(frame_system::Pallet::::block_number() >= voting.end, Error::::TooEarly); - let prime_vote = Self::prime().map(|who| voting.ayes.iter().any(|a| a == &who)); + let prime_vote = Prime::::get().map(|who| voting.ayes.iter().any(|a| a == &who)); // default voting strategy. let default = T::DefaultVote::default_vote(prime_vote, yes_votes, no_votes, seats); @@ -979,29 +972,28 @@ impl, I: 'static> Pallet { /// * The prime account must be a member of the collective. #[cfg(any(feature = "try-runtime", test))] fn do_try_state() -> Result<(), TryRuntimeError> { - Self::proposals() - .into_iter() - .try_for_each(|proposal| -> Result<(), TryRuntimeError> { + Proposals::::get().into_iter().try_for_each( + |proposal| -> Result<(), TryRuntimeError> { ensure!( - Self::proposal_of(proposal).is_some(), + ProposalOf::::get(proposal).is_some(), "Proposal hash from `Proposals` is not found inside the `ProposalOf` mapping." ); Ok(()) - })?; + }, + )?; ensure!( - Self::proposals().into_iter().count() <= Self::proposal_count() as usize, + Proposals::::get().into_iter().count() <= ProposalCount::::get() as usize, "The actual number of proposals is greater than `ProposalCount`" ); ensure!( - Self::proposals().into_iter().count() == >::iter_keys().count(), + Proposals::::get().into_iter().count() == >::iter_keys().count(), "Proposal count inside `Proposals` is not equal to the proposal count in `ProposalOf`" ); - Self::proposals() - .into_iter() - .try_for_each(|proposal| -> Result<(), TryRuntimeError> { - if let Some(votes) = Self::voting(proposal) { + Proposals::::get().into_iter().try_for_each( + |proposal| -> Result<(), TryRuntimeError> { + if let Some(votes) = Voting::::get(proposal) { let ayes = votes.ayes.len(); let nays = votes.nays.len(); @@ -1011,13 +1003,13 @@ impl, I: 'static> Pallet { ); } Ok(()) - })?; + }, + )?; let mut proposal_indices = vec![]; - Self::proposals() - .into_iter() - .try_for_each(|proposal| -> Result<(), TryRuntimeError> { - if let Some(votes) = Self::voting(proposal) { + Proposals::::get().into_iter().try_for_each( + |proposal| -> Result<(), TryRuntimeError> { + if let Some(votes) = Voting::::get(proposal) { let proposal_index = votes.index; ensure!( !proposal_indices.contains(&proposal_index), @@ -1026,12 +1018,13 @@ impl, I: 'static> Pallet { proposal_indices.push(proposal_index); } Ok(()) - })?; + }, + )?; >::iter_keys().try_for_each( |proposal_hash| -> Result<(), TryRuntimeError> { ensure!( - Self::proposals().contains(&proposal_hash), + Proposals::::get().contains(&proposal_hash), "`Proposals` doesn't contain the proposal hash from the `Voting` storage map." ); Ok(()) @@ -1039,17 +1032,17 @@ impl, I: 'static> Pallet { )?; ensure!( - Self::members().len() <= T::MaxMembers::get() as usize, + Members::::get().len() <= T::MaxMembers::get() as usize, "The member count is greater than `MaxMembers`." ); ensure!( - Self::members().windows(2).all(|members| members[0] <= members[1]), + Members::::get().windows(2).all(|members| members[0] <= members[1]), "The members are not sorted by value." ); - if let Some(prime) = Self::prime() { - ensure!(Self::members().contains(&prime), "Prime account is not a member."); + if let Some(prime) = Prime::::get() { + ensure!(Members::::get().contains(&prime), "Prime account is not a member."); } Ok(()) @@ -1083,7 +1076,7 @@ impl, I: 'static> ChangeMembers for Pallet { // remove accounts from all current voting in motions. let mut outgoing = outgoing.to_vec(); outgoing.sort(); - for h in Self::proposals().into_iter() { + for h in Proposals::::get().into_iter() { >::mutate(h, |v| { if let Some(mut votes) = v.take() { votes.ayes = votes diff --git a/substrate/frame/collective/src/tests.rs b/substrate/frame/collective/src/tests.rs index dbc3fbe69b3bf27b2151963979fc1d571d9bcc7c..5240dc215ff7b19b774dc32e2a33092e137d6d28 100644 --- a/substrate/frame/collective/src/tests.rs +++ b/substrate/frame/collective/src/tests.rs @@ -26,11 +26,7 @@ use frame_support::{ }; use frame_system::{EnsureRoot, EventRecord, Phase}; use sp_core::H256; -use sp_runtime::{ - testing::Header, - traits::{BlakeTwo256, IdentityLookup}, - BuildStorage, -}; +use sp_runtime::{testing::Header, traits::BlakeTwo256, BuildStorage}; pub type Block = sp_runtime::generic::Block; pub type UncheckedExtrinsic = sp_runtime::generic::UncheckedExtrinsic; @@ -91,31 +87,9 @@ parameter_types! { pub static MaxProposalWeight: Weight = default_max_proposal_weight(); } -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { - type BaseCallFilter = frame_support::traits::Everything; - type BlockWeights = BlockWeights; - type BlockLength = (); - type DbWeight = (); - type RuntimeOrigin = RuntimeOrigin; - type Nonce = u64; - type RuntimeCall = RuntimeCall; - type Hash = H256; - type Hashing = BlakeTwo256; - type AccountId = AccountId; - type Lookup = IdentityLookup; type Block = Block; - type RuntimeEvent = RuntimeEvent; - type BlockHashCount = ConstU64<250>; - type Version = (); - type PalletInfo = PalletInfo; - type AccountData = (); - type OnNewAccount = (); - type OnKilledAccount = (); - type SystemWeightInfo = (); - type SS58Prefix = (); - type OnSetCode = (); - type MaxConsumers = ConstU32<16>; } impl Config for Test { type RuntimeOrigin = RuntimeOrigin; @@ -219,8 +193,8 @@ fn default_max_proposal_weight() -> Weight { #[test] fn motions_basic_environment_works() { ExtBuilder::default().build_and_execute(|| { - assert_eq!(Collective::members(), vec![1, 2, 3]); - assert_eq!(*Collective::proposals(), Vec::::new()); + assert_eq!(Members::::get(), vec![1, 2, 3]); + assert_eq!(*Proposals::::get(), Vec::::new()); }); } @@ -231,7 +205,7 @@ fn initialize_members_sorts_members() { ExtBuilder::default() .set_collective_members(unsorted_members) .build_and_execute(|| { - assert_eq!(Collective::members(), expected_members); + assert_eq!(Members::::get(), expected_members); }); } @@ -245,8 +219,8 @@ fn set_members_with_prime_works() { Some(3), MaxMembers::get() )); - assert_eq!(Collective::members(), members.clone()); - assert_eq!(Collective::prime(), Some(3)); + assert_eq!(Members::::get(), members.clone()); + assert_eq!(Prime::::get(), Some(3)); assert_noop!( Collective::set_members(RuntimeOrigin::root(), members, Some(4), MaxMembers::get()), Error::::PrimeAccountNotMember @@ -658,12 +632,12 @@ fn removal_of_old_voters_votes_works() { assert_ok!(Collective::vote(RuntimeOrigin::signed(1), hash, 0, true)); assert_ok!(Collective::vote(RuntimeOrigin::signed(2), hash, 0, true)); assert_eq!( - Collective::voting(&hash), + Voting::::get(&hash), Some(Votes { index: 0, threshold: 3, ayes: vec![1, 2], nays: vec![], end }) ); Collective::change_members_sorted(&[4], &[1], &[2, 3, 4]); assert_eq!( - Collective::voting(&hash), + Voting::::get(&hash), Some(Votes { index: 0, threshold: 3, ayes: vec![2], nays: vec![], end }) ); @@ -679,12 +653,12 @@ fn removal_of_old_voters_votes_works() { assert_ok!(Collective::vote(RuntimeOrigin::signed(2), hash, 1, true)); assert_ok!(Collective::vote(RuntimeOrigin::signed(3), hash, 1, false)); assert_eq!( - Collective::voting(&hash), + Voting::::get(&hash), Some(Votes { index: 1, threshold: 2, ayes: vec![2], nays: vec![3], end }) ); Collective::change_members_sorted(&[], &[3], &[2, 4]); assert_eq!( - Collective::voting(&hash), + Voting::::get(&hash), Some(Votes { index: 1, threshold: 2, ayes: vec![2], nays: vec![], end }) ); }); @@ -706,7 +680,7 @@ fn removal_of_old_voters_votes_works_with_set_members() { assert_ok!(Collective::vote(RuntimeOrigin::signed(1), hash, 0, true)); assert_ok!(Collective::vote(RuntimeOrigin::signed(2), hash, 0, true)); assert_eq!( - Collective::voting(&hash), + Voting::::get(&hash), Some(Votes { index: 0, threshold: 3, ayes: vec![1, 2], nays: vec![], end }) ); assert_ok!(Collective::set_members( @@ -716,7 +690,7 @@ fn removal_of_old_voters_votes_works_with_set_members() { MaxMembers::get() )); assert_eq!( - Collective::voting(&hash), + Voting::::get(&hash), Some(Votes { index: 0, threshold: 3, ayes: vec![2], nays: vec![], end }) ); @@ -732,7 +706,7 @@ fn removal_of_old_voters_votes_works_with_set_members() { assert_ok!(Collective::vote(RuntimeOrigin::signed(2), hash, 1, true)); assert_ok!(Collective::vote(RuntimeOrigin::signed(3), hash, 1, false)); assert_eq!( - Collective::voting(&hash), + Voting::::get(&hash), Some(Votes { index: 1, threshold: 2, ayes: vec![2], nays: vec![3], end }) ); assert_ok!(Collective::set_members( @@ -742,7 +716,7 @@ fn removal_of_old_voters_votes_works_with_set_members() { MaxMembers::get() )); assert_eq!( - Collective::voting(&hash), + Voting::::get(&hash), Some(Votes { index: 1, threshold: 2, ayes: vec![2], nays: vec![], end }) ); }); @@ -761,10 +735,10 @@ fn propose_works() { Box::new(proposal.clone()), proposal_len )); - assert_eq!(*Collective::proposals(), vec![hash]); - assert_eq!(Collective::proposal_of(&hash), Some(proposal)); + assert_eq!(*Proposals::::get(), vec![hash]); + assert_eq!(ProposalOf::::get(&hash), Some(proposal)); assert_eq!( - Collective::voting(&hash), + Voting::::get(&hash), Some(Votes { index: 0, threshold: 3, ayes: vec![], nays: vec![], end }) ); @@ -924,13 +898,13 @@ fn motions_vote_after_works() { )); // Initially there a no votes when the motion is proposed. assert_eq!( - Collective::voting(&hash), + Voting::::get(&hash), Some(Votes { index: 0, threshold: 2, ayes: vec![], nays: vec![], end }) ); // Cast first aye vote. assert_ok!(Collective::vote(RuntimeOrigin::signed(1), hash, 0, true)); assert_eq!( - Collective::voting(&hash), + Voting::::get(&hash), Some(Votes { index: 0, threshold: 2, ayes: vec![1], nays: vec![], end }) ); // Try to cast a duplicate aye vote. @@ -941,7 +915,7 @@ fn motions_vote_after_works() { // Cast a nay vote. assert_ok!(Collective::vote(RuntimeOrigin::signed(1), hash, 0, false)); assert_eq!( - Collective::voting(&hash), + Voting::::get(&hash), Some(Votes { index: 0, threshold: 2, ayes: vec![], nays: vec![1], end }) ); // Try to cast a duplicate nay vote. @@ -992,7 +966,7 @@ fn motions_all_first_vote_free_works() { proposal_len, )); assert_eq!( - Collective::voting(&hash), + Voting::::get(&hash), Some(Votes { index: 0, threshold: 2, ayes: vec![], nays: vec![], end }) ); @@ -1021,7 +995,7 @@ fn motions_all_first_vote_free_works() { Collective::vote(RuntimeOrigin::signed(3), hash, 0, false); assert_eq!(vote_rval.unwrap().pays_fee, Pays::Yes); - // Test close() Extrincis | Check DispatchResultWithPostInfo with Pay Info + // Test close() Extrinsics | Check DispatchResultWithPostInfo with Pay Info let proposal_weight = proposal.get_dispatch_info().weight; let close_rval: DispatchResultWithPostInfo = @@ -1057,14 +1031,14 @@ fn motions_reproposing_disapproved_works() { proposal_weight, proposal_len )); - assert_eq!(*Collective::proposals(), vec![]); + assert_eq!(*Proposals::::get(), vec![]); assert_ok!(Collective::propose( RuntimeOrigin::signed(1), 2, Box::new(proposal.clone()), proposal_len )); - assert_eq!(*Collective::proposals(), vec![hash]); + assert_eq!(*Proposals::::get(), vec![hash]); }); } diff --git a/substrate/frame/collective/src/weights.rs b/substrate/frame/collective/src/weights.rs index eece6a006b8f2bda108645e3d8b165a37ad04335..cadfbfcbfbfbf0ef9fa3d9922df6a067791b1368 100644 --- a/substrate/frame/collective/src/weights.rs +++ b/substrate/frame/collective/src/weights.rs @@ -15,16 +15,16 @@ // See the License for the specific language governing permissions and // limitations under the License. -//! Autogenerated weights for pallet_collective +//! Autogenerated weights for `pallet_collective` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-06-16, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-04-08, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-e8ezs4ez-project-145-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("dev"), DB CACHE: 1024 +//! HOSTNAME: `runner-anb7yjbi-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: `1024` // Executed Command: -// ./target/production/substrate +// ./target/production/substrate-node // benchmark // pallet // --chain=dev @@ -35,12 +35,11 @@ // --no-median-slopes // --no-min-squares // --extrinsic=* -// --execution=wasm // --wasm-execution=compiled // --heap-pages=4096 -// --output=./frame/collective/src/weights.rs -// --header=./HEADER-APACHE2 -// --template=./.maintain/frame-weight-template.hbs +// --output=./substrate/frame/collective/src/weights.rs +// --header=./substrate/HEADER-APACHE2 +// --template=./substrate/.maintain/frame-weight-template.hbs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -50,7 +49,7 @@ use frame_support::{traits::Get, weights::{Weight, constants::RocksDbWeight}}; use core::marker::PhantomData; -/// Weight functions needed for pallet_collective. +/// Weight functions needed for `pallet_collective`. pub trait WeightInfo { fn set_members(m: u32, n: u32, p: u32, ) -> Weight; fn execute(b: u32, m: u32, ) -> Weight; @@ -64,30 +63,30 @@ pub trait WeightInfo { fn disapprove_proposal(p: u32, ) -> Weight; } -/// Weights for pallet_collective using the Substrate node and recommended hardware. +/// Weights for `pallet_collective` using the Substrate node and recommended hardware. pub struct SubstrateWeight(PhantomData); impl WeightInfo for SubstrateWeight { - /// Storage: Council Members (r:1 w:1) - /// Proof Skipped: Council Members (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Council Proposals (r:1 w:0) - /// Proof Skipped: Council Proposals (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Council Voting (r:100 w:100) - /// Proof Skipped: Council Voting (max_values: None, max_size: None, mode: Measured) - /// Storage: Council Prime (r:0 w:1) - /// Proof Skipped: Council Prime (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: `Council::Members` (r:1 w:1) + /// Proof: `Council::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Council::Proposals` (r:1 w:0) + /// Proof: `Council::Proposals` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Council::Voting` (r:100 w:100) + /// Proof: `Council::Voting` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Council::Prime` (r:0 w:1) + /// Proof: `Council::Prime` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) /// The range of component `m` is `[0, 100]`. /// The range of component `n` is `[0, 100]`. /// The range of component `p` is `[0, 100]`. fn set_members(m: u32, _n: u32, p: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `0 + m * (3232 ±0) + p * (3190 ±0)` - // Estimated: `15861 + m * (1967 ±24) + p * (4332 ±24)` - // Minimum execution time: 17_506_000 picoseconds. - Weight::from_parts(17_767_000, 15861) - // Standard Error: 60_220 - .saturating_add(Weight::from_parts(4_374_805, 0).saturating_mul(m.into())) - // Standard Error: 60_220 - .saturating_add(Weight::from_parts(8_398_316, 0).saturating_mul(p.into())) + // Estimated: `15894 + m * (1967 ±24) + p * (4332 ±24)` + // Minimum execution time: 15_780_000 picoseconds. + Weight::from_parts(16_193_000, 15894) + // Standard Error: 56_777 + .saturating_add(Weight::from_parts(4_269_920, 0).saturating_mul(m.into())) + // Standard Error: 56_777 + .saturating_add(Weight::from_parts(8_046_697, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(p.into()))) .saturating_add(T::DbWeight::get().writes(2_u64)) @@ -95,245 +94,261 @@ impl WeightInfo for SubstrateWeight { .saturating_add(Weight::from_parts(0, 1967).saturating_mul(m.into())) .saturating_add(Weight::from_parts(0, 4332).saturating_mul(p.into())) } - /// Storage: Council Members (r:1 w:0) - /// Proof Skipped: Council Members (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: `Council::Members` (r:1 w:0) + /// Proof: `Council::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `SafeMode::EnteredUntil` (r:1 w:0) + /// Proof: `SafeMode::EnteredUntil` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `TxPause::PausedCalls` (r:1 w:0) + /// Proof: `TxPause::PausedCalls` (`max_values`: None, `max_size`: Some(532), added: 3007, mode: `MaxEncodedLen`) /// The range of component `b` is `[2, 1024]`. /// The range of component `m` is `[1, 100]`. fn execute(b: u32, m: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `202 + m * (32 ±0)` - // Estimated: `1688 + m * (32 ±0)` - // Minimum execution time: 16_203_000 picoseconds. - Weight::from_parts(15_348_267, 1688) - // Standard Error: 37 - .saturating_add(Weight::from_parts(1_766, 0).saturating_mul(b.into())) - // Standard Error: 382 - .saturating_add(Weight::from_parts(15_765, 0).saturating_mul(m.into())) - .saturating_add(T::DbWeight::get().reads(1_u64)) + // Measured: `380 + m * (32 ±0)` + // Estimated: `3997 + m * (32 ±0)` + // Minimum execution time: 19_760_000 picoseconds. + Weight::from_parts(18_849_113, 3997) + // Standard Error: 48 + .saturating_add(Weight::from_parts(2_076, 0).saturating_mul(b.into())) + // Standard Error: 501 + .saturating_add(Weight::from_parts(17_171, 0).saturating_mul(m.into())) + .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(Weight::from_parts(0, 32).saturating_mul(m.into())) } - /// Storage: Council Members (r:1 w:0) - /// Proof Skipped: Council Members (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Council ProposalOf (r:1 w:0) - /// Proof Skipped: Council ProposalOf (max_values: None, max_size: None, mode: Measured) + /// Storage: `Council::Members` (r:1 w:0) + /// Proof: `Council::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Council::ProposalOf` (r:1 w:0) + /// Proof: `Council::ProposalOf` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `SafeMode::EnteredUntil` (r:1 w:0) + /// Proof: `SafeMode::EnteredUntil` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `TxPause::PausedCalls` (r:1 w:0) + /// Proof: `TxPause::PausedCalls` (`max_values`: None, `max_size`: Some(532), added: 3007, mode: `MaxEncodedLen`) /// The range of component `b` is `[2, 1024]`. /// The range of component `m` is `[1, 100]`. fn propose_execute(b: u32, m: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `202 + m * (32 ±0)` - // Estimated: `3668 + m * (32 ±0)` - // Minimum execution time: 18_642_000 picoseconds. - Weight::from_parts(17_708_609, 3668) - // Standard Error: 58 - .saturating_add(Weight::from_parts(2_285, 0).saturating_mul(b.into())) - // Standard Error: 598 - .saturating_add(Weight::from_parts(30_454, 0).saturating_mul(m.into())) - .saturating_add(T::DbWeight::get().reads(2_u64)) + // Measured: `380 + m * (32 ±0)` + // Estimated: `3997 + m * (32 ±0)` + // Minimum execution time: 21_535_000 picoseconds. + Weight::from_parts(20_564_012, 3997) + // Standard Error: 66 + .saturating_add(Weight::from_parts(2_252, 0).saturating_mul(b.into())) + // Standard Error: 689 + .saturating_add(Weight::from_parts(33_509, 0).saturating_mul(m.into())) + .saturating_add(T::DbWeight::get().reads(4_u64)) .saturating_add(Weight::from_parts(0, 32).saturating_mul(m.into())) } - /// Storage: Council Members (r:1 w:0) - /// Proof Skipped: Council Members (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Council ProposalOf (r:1 w:1) - /// Proof Skipped: Council ProposalOf (max_values: None, max_size: None, mode: Measured) - /// Storage: Council Proposals (r:1 w:1) - /// Proof Skipped: Council Proposals (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Council ProposalCount (r:1 w:1) - /// Proof Skipped: Council ProposalCount (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Council Voting (r:0 w:1) - /// Proof Skipped: Council Voting (max_values: None, max_size: None, mode: Measured) + /// Storage: `Council::Members` (r:1 w:0) + /// Proof: `Council::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Council::ProposalOf` (r:1 w:1) + /// Proof: `Council::ProposalOf` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Council::Proposals` (r:1 w:1) + /// Proof: `Council::Proposals` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Council::ProposalCount` (r:1 w:1) + /// Proof: `Council::ProposalCount` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Council::Voting` (r:0 w:1) + /// Proof: `Council::Voting` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `b` is `[2, 1024]`. /// The range of component `m` is `[2, 100]`. /// The range of component `p` is `[1, 100]`. fn propose_proposed(b: u32, m: u32, p: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `492 + m * (32 ±0) + p * (36 ±0)` - // Estimated: `3884 + m * (33 ±0) + p * (36 ±0)` - // Minimum execution time: 27_067_000 picoseconds. - Weight::from_parts(25_456_964, 3884) - // Standard Error: 112 - .saturating_add(Weight::from_parts(3_773, 0).saturating_mul(b.into())) - // Standard Error: 1_177 - .saturating_add(Weight::from_parts(32_783, 0).saturating_mul(m.into())) - // Standard Error: 1_162 - .saturating_add(Weight::from_parts(194_388, 0).saturating_mul(p.into())) + // Measured: `525 + m * (32 ±0) + p * (36 ±0)` + // Estimated: `3917 + m * (33 ±0) + p * (36 ±0)` + // Minimum execution time: 22_759_000 picoseconds. + Weight::from_parts(21_344_363, 3917) + // Standard Error: 121 + .saturating_add(Weight::from_parts(3_231, 0).saturating_mul(b.into())) + // Standard Error: 1_265 + .saturating_add(Weight::from_parts(31_197, 0).saturating_mul(m.into())) + // Standard Error: 1_249 + .saturating_add(Weight::from_parts(200_231, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(4_u64)) .saturating_add(T::DbWeight::get().writes(4_u64)) .saturating_add(Weight::from_parts(0, 33).saturating_mul(m.into())) .saturating_add(Weight::from_parts(0, 36).saturating_mul(p.into())) } - /// Storage: Council Members (r:1 w:0) - /// Proof Skipped: Council Members (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Council Voting (r:1 w:1) - /// Proof Skipped: Council Voting (max_values: None, max_size: None, mode: Measured) + /// Storage: `Council::Members` (r:1 w:0) + /// Proof: `Council::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Council::Voting` (r:1 w:1) + /// Proof: `Council::Voting` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `m` is `[5, 100]`. fn vote(m: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `941 + m * (64 ±0)` - // Estimated: `4405 + m * (64 ±0)` - // Minimum execution time: 26_055_000 picoseconds. - Weight::from_parts(27_251_907, 4405) - // Standard Error: 1_008 - .saturating_add(Weight::from_parts(65_947, 0).saturating_mul(m.into())) + // Measured: `974 + m * (64 ±0)` + // Estimated: `4438 + m * (64 ±0)` + // Minimum execution time: 22_935_000 picoseconds. + Weight::from_parts(23_694_302, 4438) + // Standard Error: 959 + .saturating_add(Weight::from_parts(57_721, 0).saturating_mul(m.into())) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) .saturating_add(Weight::from_parts(0, 64).saturating_mul(m.into())) } - /// Storage: Council Voting (r:1 w:1) - /// Proof Skipped: Council Voting (max_values: None, max_size: None, mode: Measured) - /// Storage: Council Members (r:1 w:0) - /// Proof Skipped: Council Members (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Council Proposals (r:1 w:1) - /// Proof Skipped: Council Proposals (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Council ProposalOf (r:0 w:1) - /// Proof Skipped: Council ProposalOf (max_values: None, max_size: None, mode: Measured) + /// Storage: `Council::Voting` (r:1 w:1) + /// Proof: `Council::Voting` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Council::Members` (r:1 w:0) + /// Proof: `Council::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Council::Proposals` (r:1 w:1) + /// Proof: `Council::Proposals` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Council::ProposalOf` (r:0 w:1) + /// Proof: `Council::ProposalOf` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `m` is `[4, 100]`. /// The range of component `p` is `[1, 100]`. fn close_early_disapproved(m: u32, p: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `530 + m * (64 ±0) + p * (36 ±0)` - // Estimated: `3975 + m * (65 ±0) + p * (36 ±0)` - // Minimum execution time: 28_363_000 picoseconds. - Weight::from_parts(28_733_464, 3975) - // Standard Error: 1_275 - .saturating_add(Weight::from_parts(43_236, 0).saturating_mul(m.into())) - // Standard Error: 1_244 - .saturating_add(Weight::from_parts(180_187, 0).saturating_mul(p.into())) + // Measured: `563 + m * (64 ±0) + p * (36 ±0)` + // Estimated: `4008 + m * (65 ±0) + p * (36 ±0)` + // Minimum execution time: 25_507_000 picoseconds. + Weight::from_parts(24_849_399, 4008) + // Standard Error: 1_089 + .saturating_add(Weight::from_parts(40_933, 0).saturating_mul(m.into())) + // Standard Error: 1_062 + .saturating_add(Weight::from_parts(198_325, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(3_u64)) .saturating_add(Weight::from_parts(0, 65).saturating_mul(m.into())) .saturating_add(Weight::from_parts(0, 36).saturating_mul(p.into())) } - /// Storage: Council Voting (r:1 w:1) - /// Proof Skipped: Council Voting (max_values: None, max_size: None, mode: Measured) - /// Storage: Council Members (r:1 w:0) - /// Proof Skipped: Council Members (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Council ProposalOf (r:1 w:1) - /// Proof Skipped: Council ProposalOf (max_values: None, max_size: None, mode: Measured) - /// Storage: Council Proposals (r:1 w:1) - /// Proof Skipped: Council Proposals (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: `Council::Voting` (r:1 w:1) + /// Proof: `Council::Voting` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Council::Members` (r:1 w:0) + /// Proof: `Council::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Council::ProposalOf` (r:1 w:1) + /// Proof: `Council::ProposalOf` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `SafeMode::EnteredUntil` (r:1 w:0) + /// Proof: `SafeMode::EnteredUntil` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `TxPause::PausedCalls` (r:1 w:0) + /// Proof: `TxPause::PausedCalls` (`max_values`: None, `max_size`: Some(532), added: 3007, mode: `MaxEncodedLen`) + /// Storage: `Council::Proposals` (r:1 w:1) + /// Proof: `Council::Proposals` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) /// The range of component `b` is `[2, 1024]`. /// The range of component `m` is `[4, 100]`. /// The range of component `p` is `[1, 100]`. fn close_early_approved(b: u32, m: u32, p: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `832 + b * (1 ±0) + m * (64 ±0) + p * (40 ±0)` - // Estimated: `4149 + b * (1 ±0) + m * (66 ±0) + p * (40 ±0)` - // Minimum execution time: 40_391_000 picoseconds. - Weight::from_parts(42_695_215, 4149) - // Standard Error: 167 - .saturating_add(Weight::from_parts(3_622, 0).saturating_mul(b.into())) - // Standard Error: 1_772 - .saturating_add(Weight::from_parts(33_830, 0).saturating_mul(m.into())) - // Standard Error: 1_727 - .saturating_add(Weight::from_parts(205_374, 0).saturating_mul(p.into())) - .saturating_add(T::DbWeight::get().reads(4_u64)) + // Measured: `1010 + b * (1 ±0) + m * (64 ±0) + p * (40 ±0)` + // Estimated: `4327 + b * (1 ±0) + m * (66 ±0) + p * (40 ±0)` + // Minimum execution time: 43_927_000 picoseconds. + Weight::from_parts(43_733_720, 4327) + // Standard Error: 157 + .saturating_add(Weight::from_parts(3_737, 0).saturating_mul(b.into())) + // Standard Error: 1_664 + .saturating_add(Weight::from_parts(31_334, 0).saturating_mul(m.into())) + // Standard Error: 1_622 + .saturating_add(Weight::from_parts(222_964, 0).saturating_mul(p.into())) + .saturating_add(T::DbWeight::get().reads(6_u64)) .saturating_add(T::DbWeight::get().writes(3_u64)) .saturating_add(Weight::from_parts(0, 1).saturating_mul(b.into())) .saturating_add(Weight::from_parts(0, 66).saturating_mul(m.into())) .saturating_add(Weight::from_parts(0, 40).saturating_mul(p.into())) } - /// Storage: Council Voting (r:1 w:1) - /// Proof Skipped: Council Voting (max_values: None, max_size: None, mode: Measured) - /// Storage: Council Members (r:1 w:0) - /// Proof Skipped: Council Members (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Council Prime (r:1 w:0) - /// Proof Skipped: Council Prime (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Council Proposals (r:1 w:1) - /// Proof Skipped: Council Proposals (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Council ProposalOf (r:0 w:1) - /// Proof Skipped: Council ProposalOf (max_values: None, max_size: None, mode: Measured) + /// Storage: `Council::Voting` (r:1 w:1) + /// Proof: `Council::Voting` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Council::Members` (r:1 w:0) + /// Proof: `Council::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Council::Prime` (r:1 w:0) + /// Proof: `Council::Prime` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Council::Proposals` (r:1 w:1) + /// Proof: `Council::Proposals` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Council::ProposalOf` (r:0 w:1) + /// Proof: `Council::ProposalOf` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `m` is `[4, 100]`. /// The range of component `p` is `[1, 100]`. fn close_disapproved(m: u32, p: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `550 + m * (64 ±0) + p * (36 ±0)` - // Estimated: `3995 + m * (65 ±0) + p * (36 ±0)` - // Minimum execution time: 31_368_000 picoseconds. - Weight::from_parts(32_141_835, 3995) - // Standard Error: 1_451 - .saturating_add(Weight::from_parts(36_372, 0).saturating_mul(m.into())) - // Standard Error: 1_415 - .saturating_add(Weight::from_parts(210_635, 0).saturating_mul(p.into())) + // Measured: `583 + m * (64 ±0) + p * (36 ±0)` + // Estimated: `4028 + m * (65 ±0) + p * (36 ±0)` + // Minimum execution time: 28_129_000 picoseconds. + Weight::from_parts(26_799_151, 4028) + // Standard Error: 1_325 + .saturating_add(Weight::from_parts(41_545, 0).saturating_mul(m.into())) + // Standard Error: 1_292 + .saturating_add(Weight::from_parts(224_499, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(4_u64)) .saturating_add(T::DbWeight::get().writes(3_u64)) .saturating_add(Weight::from_parts(0, 65).saturating_mul(m.into())) .saturating_add(Weight::from_parts(0, 36).saturating_mul(p.into())) } - /// Storage: Council Voting (r:1 w:1) - /// Proof Skipped: Council Voting (max_values: None, max_size: None, mode: Measured) - /// Storage: Council Members (r:1 w:0) - /// Proof Skipped: Council Members (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Council Prime (r:1 w:0) - /// Proof Skipped: Council Prime (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Council ProposalOf (r:1 w:1) - /// Proof Skipped: Council ProposalOf (max_values: None, max_size: None, mode: Measured) - /// Storage: Council Proposals (r:1 w:1) - /// Proof Skipped: Council Proposals (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: `Council::Voting` (r:1 w:1) + /// Proof: `Council::Voting` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Council::Members` (r:1 w:0) + /// Proof: `Council::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Council::Prime` (r:1 w:0) + /// Proof: `Council::Prime` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Council::ProposalOf` (r:1 w:1) + /// Proof: `Council::ProposalOf` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `SafeMode::EnteredUntil` (r:1 w:0) + /// Proof: `SafeMode::EnteredUntil` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `TxPause::PausedCalls` (r:1 w:0) + /// Proof: `TxPause::PausedCalls` (`max_values`: None, `max_size`: Some(532), added: 3007, mode: `MaxEncodedLen`) + /// Storage: `Council::Proposals` (r:1 w:1) + /// Proof: `Council::Proposals` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) /// The range of component `b` is `[2, 1024]`. /// The range of component `m` is `[4, 100]`. /// The range of component `p` is `[1, 100]`. fn close_approved(b: u32, m: u32, p: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `852 + b * (1 ±0) + m * (64 ±0) + p * (40 ±0)` - // Estimated: `4169 + b * (1 ±0) + m * (66 ±0) + p * (40 ±0)` - // Minimum execution time: 43_271_000 picoseconds. - Weight::from_parts(45_495_648, 4169) - // Standard Error: 174 - .saturating_add(Weight::from_parts(3_034, 0).saturating_mul(b.into())) - // Standard Error: 1_840 - .saturating_add(Weight::from_parts(42_209, 0).saturating_mul(m.into())) - // Standard Error: 1_793 - .saturating_add(Weight::from_parts(207_525, 0).saturating_mul(p.into())) - .saturating_add(T::DbWeight::get().reads(5_u64)) + // Measured: `1030 + b * (1 ±0) + m * (64 ±0) + p * (40 ±0)` + // Estimated: `4347 + b * (1 ±0) + m * (66 ±0) + p * (40 ±0)` + // Minimum execution time: 45_700_000 picoseconds. + Weight::from_parts(45_661_144, 4347) + // Standard Error: 149 + .saturating_add(Weight::from_parts(3_068, 0).saturating_mul(b.into())) + // Standard Error: 1_583 + .saturating_add(Weight::from_parts(36_426, 0).saturating_mul(m.into())) + // Standard Error: 1_543 + .saturating_add(Weight::from_parts(229_986, 0).saturating_mul(p.into())) + .saturating_add(T::DbWeight::get().reads(7_u64)) .saturating_add(T::DbWeight::get().writes(3_u64)) .saturating_add(Weight::from_parts(0, 1).saturating_mul(b.into())) .saturating_add(Weight::from_parts(0, 66).saturating_mul(m.into())) .saturating_add(Weight::from_parts(0, 40).saturating_mul(p.into())) } - /// Storage: Council Proposals (r:1 w:1) - /// Proof Skipped: Council Proposals (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Council Voting (r:0 w:1) - /// Proof Skipped: Council Voting (max_values: None, max_size: None, mode: Measured) - /// Storage: Council ProposalOf (r:0 w:1) - /// Proof Skipped: Council ProposalOf (max_values: None, max_size: None, mode: Measured) + /// Storage: `Council::Proposals` (r:1 w:1) + /// Proof: `Council::Proposals` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Council::Voting` (r:0 w:1) + /// Proof: `Council::Voting` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Council::ProposalOf` (r:0 w:1) + /// Proof: `Council::ProposalOf` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `p` is `[1, 100]`. fn disapprove_proposal(p: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `359 + p * (32 ±0)` - // Estimated: `1844 + p * (32 ±0)` - // Minimum execution time: 15_170_000 picoseconds. - Weight::from_parts(17_567_243, 1844) - // Standard Error: 1_430 - .saturating_add(Weight::from_parts(169_040, 0).saturating_mul(p.into())) + // Measured: `392 + p * (32 ±0)` + // Estimated: `1877 + p * (32 ±0)` + // Minimum execution time: 13_163_000 picoseconds. + Weight::from_parts(14_467_031, 1877) + // Standard Error: 1_073 + .saturating_add(Weight::from_parts(190_879, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(3_u64)) .saturating_add(Weight::from_parts(0, 32).saturating_mul(p.into())) } } -// For backwards compatibility and tests +// For backwards compatibility and tests. impl WeightInfo for () { - /// Storage: Council Members (r:1 w:1) - /// Proof Skipped: Council Members (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Council Proposals (r:1 w:0) - /// Proof Skipped: Council Proposals (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Council Voting (r:100 w:100) - /// Proof Skipped: Council Voting (max_values: None, max_size: None, mode: Measured) - /// Storage: Council Prime (r:0 w:1) - /// Proof Skipped: Council Prime (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: `Council::Members` (r:1 w:1) + /// Proof: `Council::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Council::Proposals` (r:1 w:0) + /// Proof: `Council::Proposals` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Council::Voting` (r:100 w:100) + /// Proof: `Council::Voting` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Council::Prime` (r:0 w:1) + /// Proof: `Council::Prime` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) /// The range of component `m` is `[0, 100]`. /// The range of component `n` is `[0, 100]`. /// The range of component `p` is `[0, 100]`. fn set_members(m: u32, _n: u32, p: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `0 + m * (3232 ±0) + p * (3190 ±0)` - // Estimated: `15861 + m * (1967 ±24) + p * (4332 ±24)` - // Minimum execution time: 17_506_000 picoseconds. - Weight::from_parts(17_767_000, 15861) - // Standard Error: 60_220 - .saturating_add(Weight::from_parts(4_374_805, 0).saturating_mul(m.into())) - // Standard Error: 60_220 - .saturating_add(Weight::from_parts(8_398_316, 0).saturating_mul(p.into())) + // Estimated: `15894 + m * (1967 ±24) + p * (4332 ±24)` + // Minimum execution time: 15_780_000 picoseconds. + Weight::from_parts(16_193_000, 15894) + // Standard Error: 56_777 + .saturating_add(Weight::from_parts(4_269_920, 0).saturating_mul(m.into())) + // Standard Error: 56_777 + .saturating_add(Weight::from_parts(8_046_697, 0).saturating_mul(p.into())) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().reads((1_u64).saturating_mul(p.into()))) .saturating_add(RocksDbWeight::get().writes(2_u64)) @@ -341,216 +356,232 @@ impl WeightInfo for () { .saturating_add(Weight::from_parts(0, 1967).saturating_mul(m.into())) .saturating_add(Weight::from_parts(0, 4332).saturating_mul(p.into())) } - /// Storage: Council Members (r:1 w:0) - /// Proof Skipped: Council Members (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: `Council::Members` (r:1 w:0) + /// Proof: `Council::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `SafeMode::EnteredUntil` (r:1 w:0) + /// Proof: `SafeMode::EnteredUntil` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `TxPause::PausedCalls` (r:1 w:0) + /// Proof: `TxPause::PausedCalls` (`max_values`: None, `max_size`: Some(532), added: 3007, mode: `MaxEncodedLen`) /// The range of component `b` is `[2, 1024]`. /// The range of component `m` is `[1, 100]`. fn execute(b: u32, m: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `202 + m * (32 ±0)` - // Estimated: `1688 + m * (32 ±0)` - // Minimum execution time: 16_203_000 picoseconds. - Weight::from_parts(15_348_267, 1688) - // Standard Error: 37 - .saturating_add(Weight::from_parts(1_766, 0).saturating_mul(b.into())) - // Standard Error: 382 - .saturating_add(Weight::from_parts(15_765, 0).saturating_mul(m.into())) - .saturating_add(RocksDbWeight::get().reads(1_u64)) + // Measured: `380 + m * (32 ±0)` + // Estimated: `3997 + m * (32 ±0)` + // Minimum execution time: 19_760_000 picoseconds. + Weight::from_parts(18_849_113, 3997) + // Standard Error: 48 + .saturating_add(Weight::from_parts(2_076, 0).saturating_mul(b.into())) + // Standard Error: 501 + .saturating_add(Weight::from_parts(17_171, 0).saturating_mul(m.into())) + .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(Weight::from_parts(0, 32).saturating_mul(m.into())) } - /// Storage: Council Members (r:1 w:0) - /// Proof Skipped: Council Members (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Council ProposalOf (r:1 w:0) - /// Proof Skipped: Council ProposalOf (max_values: None, max_size: None, mode: Measured) + /// Storage: `Council::Members` (r:1 w:0) + /// Proof: `Council::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Council::ProposalOf` (r:1 w:0) + /// Proof: `Council::ProposalOf` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `SafeMode::EnteredUntil` (r:1 w:0) + /// Proof: `SafeMode::EnteredUntil` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `TxPause::PausedCalls` (r:1 w:0) + /// Proof: `TxPause::PausedCalls` (`max_values`: None, `max_size`: Some(532), added: 3007, mode: `MaxEncodedLen`) /// The range of component `b` is `[2, 1024]`. /// The range of component `m` is `[1, 100]`. fn propose_execute(b: u32, m: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `202 + m * (32 ±0)` - // Estimated: `3668 + m * (32 ±0)` - // Minimum execution time: 18_642_000 picoseconds. - Weight::from_parts(17_708_609, 3668) - // Standard Error: 58 - .saturating_add(Weight::from_parts(2_285, 0).saturating_mul(b.into())) - // Standard Error: 598 - .saturating_add(Weight::from_parts(30_454, 0).saturating_mul(m.into())) - .saturating_add(RocksDbWeight::get().reads(2_u64)) + // Measured: `380 + m * (32 ±0)` + // Estimated: `3997 + m * (32 ±0)` + // Minimum execution time: 21_535_000 picoseconds. + Weight::from_parts(20_564_012, 3997) + // Standard Error: 66 + .saturating_add(Weight::from_parts(2_252, 0).saturating_mul(b.into())) + // Standard Error: 689 + .saturating_add(Weight::from_parts(33_509, 0).saturating_mul(m.into())) + .saturating_add(RocksDbWeight::get().reads(4_u64)) .saturating_add(Weight::from_parts(0, 32).saturating_mul(m.into())) } - /// Storage: Council Members (r:1 w:0) - /// Proof Skipped: Council Members (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Council ProposalOf (r:1 w:1) - /// Proof Skipped: Council ProposalOf (max_values: None, max_size: None, mode: Measured) - /// Storage: Council Proposals (r:1 w:1) - /// Proof Skipped: Council Proposals (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Council ProposalCount (r:1 w:1) - /// Proof Skipped: Council ProposalCount (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Council Voting (r:0 w:1) - /// Proof Skipped: Council Voting (max_values: None, max_size: None, mode: Measured) + /// Storage: `Council::Members` (r:1 w:0) + /// Proof: `Council::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Council::ProposalOf` (r:1 w:1) + /// Proof: `Council::ProposalOf` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Council::Proposals` (r:1 w:1) + /// Proof: `Council::Proposals` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Council::ProposalCount` (r:1 w:1) + /// Proof: `Council::ProposalCount` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Council::Voting` (r:0 w:1) + /// Proof: `Council::Voting` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `b` is `[2, 1024]`. /// The range of component `m` is `[2, 100]`. /// The range of component `p` is `[1, 100]`. fn propose_proposed(b: u32, m: u32, p: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `492 + m * (32 ±0) + p * (36 ±0)` - // Estimated: `3884 + m * (33 ±0) + p * (36 ±0)` - // Minimum execution time: 27_067_000 picoseconds. - Weight::from_parts(25_456_964, 3884) - // Standard Error: 112 - .saturating_add(Weight::from_parts(3_773, 0).saturating_mul(b.into())) - // Standard Error: 1_177 - .saturating_add(Weight::from_parts(32_783, 0).saturating_mul(m.into())) - // Standard Error: 1_162 - .saturating_add(Weight::from_parts(194_388, 0).saturating_mul(p.into())) + // Measured: `525 + m * (32 ±0) + p * (36 ±0)` + // Estimated: `3917 + m * (33 ±0) + p * (36 ±0)` + // Minimum execution time: 22_759_000 picoseconds. + Weight::from_parts(21_344_363, 3917) + // Standard Error: 121 + .saturating_add(Weight::from_parts(3_231, 0).saturating_mul(b.into())) + // Standard Error: 1_265 + .saturating_add(Weight::from_parts(31_197, 0).saturating_mul(m.into())) + // Standard Error: 1_249 + .saturating_add(Weight::from_parts(200_231, 0).saturating_mul(p.into())) .saturating_add(RocksDbWeight::get().reads(4_u64)) .saturating_add(RocksDbWeight::get().writes(4_u64)) .saturating_add(Weight::from_parts(0, 33).saturating_mul(m.into())) .saturating_add(Weight::from_parts(0, 36).saturating_mul(p.into())) } - /// Storage: Council Members (r:1 w:0) - /// Proof Skipped: Council Members (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Council Voting (r:1 w:1) - /// Proof Skipped: Council Voting (max_values: None, max_size: None, mode: Measured) + /// Storage: `Council::Members` (r:1 w:0) + /// Proof: `Council::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Council::Voting` (r:1 w:1) + /// Proof: `Council::Voting` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `m` is `[5, 100]`. fn vote(m: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `941 + m * (64 ±0)` - // Estimated: `4405 + m * (64 ±0)` - // Minimum execution time: 26_055_000 picoseconds. - Weight::from_parts(27_251_907, 4405) - // Standard Error: 1_008 - .saturating_add(Weight::from_parts(65_947, 0).saturating_mul(m.into())) + // Measured: `974 + m * (64 ±0)` + // Estimated: `4438 + m * (64 ±0)` + // Minimum execution time: 22_935_000 picoseconds. + Weight::from_parts(23_694_302, 4438) + // Standard Error: 959 + .saturating_add(Weight::from_parts(57_721, 0).saturating_mul(m.into())) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) .saturating_add(Weight::from_parts(0, 64).saturating_mul(m.into())) } - /// Storage: Council Voting (r:1 w:1) - /// Proof Skipped: Council Voting (max_values: None, max_size: None, mode: Measured) - /// Storage: Council Members (r:1 w:0) - /// Proof Skipped: Council Members (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Council Proposals (r:1 w:1) - /// Proof Skipped: Council Proposals (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Council ProposalOf (r:0 w:1) - /// Proof Skipped: Council ProposalOf (max_values: None, max_size: None, mode: Measured) + /// Storage: `Council::Voting` (r:1 w:1) + /// Proof: `Council::Voting` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Council::Members` (r:1 w:0) + /// Proof: `Council::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Council::Proposals` (r:1 w:1) + /// Proof: `Council::Proposals` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Council::ProposalOf` (r:0 w:1) + /// Proof: `Council::ProposalOf` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `m` is `[4, 100]`. /// The range of component `p` is `[1, 100]`. fn close_early_disapproved(m: u32, p: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `530 + m * (64 ±0) + p * (36 ±0)` - // Estimated: `3975 + m * (65 ±0) + p * (36 ±0)` - // Minimum execution time: 28_363_000 picoseconds. - Weight::from_parts(28_733_464, 3975) - // Standard Error: 1_275 - .saturating_add(Weight::from_parts(43_236, 0).saturating_mul(m.into())) - // Standard Error: 1_244 - .saturating_add(Weight::from_parts(180_187, 0).saturating_mul(p.into())) + // Measured: `563 + m * (64 ±0) + p * (36 ±0)` + // Estimated: `4008 + m * (65 ±0) + p * (36 ±0)` + // Minimum execution time: 25_507_000 picoseconds. + Weight::from_parts(24_849_399, 4008) + // Standard Error: 1_089 + .saturating_add(Weight::from_parts(40_933, 0).saturating_mul(m.into())) + // Standard Error: 1_062 + .saturating_add(Weight::from_parts(198_325, 0).saturating_mul(p.into())) .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(3_u64)) .saturating_add(Weight::from_parts(0, 65).saturating_mul(m.into())) .saturating_add(Weight::from_parts(0, 36).saturating_mul(p.into())) } - /// Storage: Council Voting (r:1 w:1) - /// Proof Skipped: Council Voting (max_values: None, max_size: None, mode: Measured) - /// Storage: Council Members (r:1 w:0) - /// Proof Skipped: Council Members (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Council ProposalOf (r:1 w:1) - /// Proof Skipped: Council ProposalOf (max_values: None, max_size: None, mode: Measured) - /// Storage: Council Proposals (r:1 w:1) - /// Proof Skipped: Council Proposals (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: `Council::Voting` (r:1 w:1) + /// Proof: `Council::Voting` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Council::Members` (r:1 w:0) + /// Proof: `Council::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Council::ProposalOf` (r:1 w:1) + /// Proof: `Council::ProposalOf` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `SafeMode::EnteredUntil` (r:1 w:0) + /// Proof: `SafeMode::EnteredUntil` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `TxPause::PausedCalls` (r:1 w:0) + /// Proof: `TxPause::PausedCalls` (`max_values`: None, `max_size`: Some(532), added: 3007, mode: `MaxEncodedLen`) + /// Storage: `Council::Proposals` (r:1 w:1) + /// Proof: `Council::Proposals` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) /// The range of component `b` is `[2, 1024]`. /// The range of component `m` is `[4, 100]`. /// The range of component `p` is `[1, 100]`. fn close_early_approved(b: u32, m: u32, p: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `832 + b * (1 ±0) + m * (64 ±0) + p * (40 ±0)` - // Estimated: `4149 + b * (1 ±0) + m * (66 ±0) + p * (40 ±0)` - // Minimum execution time: 40_391_000 picoseconds. - Weight::from_parts(42_695_215, 4149) - // Standard Error: 167 - .saturating_add(Weight::from_parts(3_622, 0).saturating_mul(b.into())) - // Standard Error: 1_772 - .saturating_add(Weight::from_parts(33_830, 0).saturating_mul(m.into())) - // Standard Error: 1_727 - .saturating_add(Weight::from_parts(205_374, 0).saturating_mul(p.into())) - .saturating_add(RocksDbWeight::get().reads(4_u64)) + // Measured: `1010 + b * (1 ±0) + m * (64 ±0) + p * (40 ±0)` + // Estimated: `4327 + b * (1 ±0) + m * (66 ±0) + p * (40 ±0)` + // Minimum execution time: 43_927_000 picoseconds. + Weight::from_parts(43_733_720, 4327) + // Standard Error: 157 + .saturating_add(Weight::from_parts(3_737, 0).saturating_mul(b.into())) + // Standard Error: 1_664 + .saturating_add(Weight::from_parts(31_334, 0).saturating_mul(m.into())) + // Standard Error: 1_622 + .saturating_add(Weight::from_parts(222_964, 0).saturating_mul(p.into())) + .saturating_add(RocksDbWeight::get().reads(6_u64)) .saturating_add(RocksDbWeight::get().writes(3_u64)) .saturating_add(Weight::from_parts(0, 1).saturating_mul(b.into())) .saturating_add(Weight::from_parts(0, 66).saturating_mul(m.into())) .saturating_add(Weight::from_parts(0, 40).saturating_mul(p.into())) } - /// Storage: Council Voting (r:1 w:1) - /// Proof Skipped: Council Voting (max_values: None, max_size: None, mode: Measured) - /// Storage: Council Members (r:1 w:0) - /// Proof Skipped: Council Members (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Council Prime (r:1 w:0) - /// Proof Skipped: Council Prime (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Council Proposals (r:1 w:1) - /// Proof Skipped: Council Proposals (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Council ProposalOf (r:0 w:1) - /// Proof Skipped: Council ProposalOf (max_values: None, max_size: None, mode: Measured) + /// Storage: `Council::Voting` (r:1 w:1) + /// Proof: `Council::Voting` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Council::Members` (r:1 w:0) + /// Proof: `Council::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Council::Prime` (r:1 w:0) + /// Proof: `Council::Prime` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Council::Proposals` (r:1 w:1) + /// Proof: `Council::Proposals` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Council::ProposalOf` (r:0 w:1) + /// Proof: `Council::ProposalOf` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `m` is `[4, 100]`. /// The range of component `p` is `[1, 100]`. fn close_disapproved(m: u32, p: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `550 + m * (64 ±0) + p * (36 ±0)` - // Estimated: `3995 + m * (65 ±0) + p * (36 ±0)` - // Minimum execution time: 31_368_000 picoseconds. - Weight::from_parts(32_141_835, 3995) - // Standard Error: 1_451 - .saturating_add(Weight::from_parts(36_372, 0).saturating_mul(m.into())) - // Standard Error: 1_415 - .saturating_add(Weight::from_parts(210_635, 0).saturating_mul(p.into())) + // Measured: `583 + m * (64 ±0) + p * (36 ±0)` + // Estimated: `4028 + m * (65 ±0) + p * (36 ±0)` + // Minimum execution time: 28_129_000 picoseconds. + Weight::from_parts(26_799_151, 4028) + // Standard Error: 1_325 + .saturating_add(Weight::from_parts(41_545, 0).saturating_mul(m.into())) + // Standard Error: 1_292 + .saturating_add(Weight::from_parts(224_499, 0).saturating_mul(p.into())) .saturating_add(RocksDbWeight::get().reads(4_u64)) .saturating_add(RocksDbWeight::get().writes(3_u64)) .saturating_add(Weight::from_parts(0, 65).saturating_mul(m.into())) .saturating_add(Weight::from_parts(0, 36).saturating_mul(p.into())) } - /// Storage: Council Voting (r:1 w:1) - /// Proof Skipped: Council Voting (max_values: None, max_size: None, mode: Measured) - /// Storage: Council Members (r:1 w:0) - /// Proof Skipped: Council Members (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Council Prime (r:1 w:0) - /// Proof Skipped: Council Prime (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Council ProposalOf (r:1 w:1) - /// Proof Skipped: Council ProposalOf (max_values: None, max_size: None, mode: Measured) - /// Storage: Council Proposals (r:1 w:1) - /// Proof Skipped: Council Proposals (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: `Council::Voting` (r:1 w:1) + /// Proof: `Council::Voting` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Council::Members` (r:1 w:0) + /// Proof: `Council::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Council::Prime` (r:1 w:0) + /// Proof: `Council::Prime` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Council::ProposalOf` (r:1 w:1) + /// Proof: `Council::ProposalOf` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `SafeMode::EnteredUntil` (r:1 w:0) + /// Proof: `SafeMode::EnteredUntil` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `TxPause::PausedCalls` (r:1 w:0) + /// Proof: `TxPause::PausedCalls` (`max_values`: None, `max_size`: Some(532), added: 3007, mode: `MaxEncodedLen`) + /// Storage: `Council::Proposals` (r:1 w:1) + /// Proof: `Council::Proposals` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) /// The range of component `b` is `[2, 1024]`. /// The range of component `m` is `[4, 100]`. /// The range of component `p` is `[1, 100]`. fn close_approved(b: u32, m: u32, p: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `852 + b * (1 ±0) + m * (64 ±0) + p * (40 ±0)` - // Estimated: `4169 + b * (1 ±0) + m * (66 ±0) + p * (40 ±0)` - // Minimum execution time: 43_271_000 picoseconds. - Weight::from_parts(45_495_648, 4169) - // Standard Error: 174 - .saturating_add(Weight::from_parts(3_034, 0).saturating_mul(b.into())) - // Standard Error: 1_840 - .saturating_add(Weight::from_parts(42_209, 0).saturating_mul(m.into())) - // Standard Error: 1_793 - .saturating_add(Weight::from_parts(207_525, 0).saturating_mul(p.into())) - .saturating_add(RocksDbWeight::get().reads(5_u64)) + // Measured: `1030 + b * (1 ±0) + m * (64 ±0) + p * (40 ±0)` + // Estimated: `4347 + b * (1 ±0) + m * (66 ±0) + p * (40 ±0)` + // Minimum execution time: 45_700_000 picoseconds. + Weight::from_parts(45_661_144, 4347) + // Standard Error: 149 + .saturating_add(Weight::from_parts(3_068, 0).saturating_mul(b.into())) + // Standard Error: 1_583 + .saturating_add(Weight::from_parts(36_426, 0).saturating_mul(m.into())) + // Standard Error: 1_543 + .saturating_add(Weight::from_parts(229_986, 0).saturating_mul(p.into())) + .saturating_add(RocksDbWeight::get().reads(7_u64)) .saturating_add(RocksDbWeight::get().writes(3_u64)) .saturating_add(Weight::from_parts(0, 1).saturating_mul(b.into())) .saturating_add(Weight::from_parts(0, 66).saturating_mul(m.into())) .saturating_add(Weight::from_parts(0, 40).saturating_mul(p.into())) } - /// Storage: Council Proposals (r:1 w:1) - /// Proof Skipped: Council Proposals (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Council Voting (r:0 w:1) - /// Proof Skipped: Council Voting (max_values: None, max_size: None, mode: Measured) - /// Storage: Council ProposalOf (r:0 w:1) - /// Proof Skipped: Council ProposalOf (max_values: None, max_size: None, mode: Measured) + /// Storage: `Council::Proposals` (r:1 w:1) + /// Proof: `Council::Proposals` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Council::Voting` (r:0 w:1) + /// Proof: `Council::Voting` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Council::ProposalOf` (r:0 w:1) + /// Proof: `Council::ProposalOf` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `p` is `[1, 100]`. fn disapprove_proposal(p: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `359 + p * (32 ±0)` - // Estimated: `1844 + p * (32 ±0)` - // Minimum execution time: 15_170_000 picoseconds. - Weight::from_parts(17_567_243, 1844) - // Standard Error: 1_430 - .saturating_add(Weight::from_parts(169_040, 0).saturating_mul(p.into())) + // Measured: `392 + p * (32 ±0)` + // Estimated: `1877 + p * (32 ±0)` + // Minimum execution time: 13_163_000 picoseconds. + Weight::from_parts(14_467_031, 1877) + // Standard Error: 1_073 + .saturating_add(Weight::from_parts(190_879, 0).saturating_mul(p.into())) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(3_u64)) .saturating_add(Weight::from_parts(0, 32).saturating_mul(p.into())) diff --git a/substrate/frame/contracts/CHANGELOG.md b/substrate/frame/contracts/CHANGELOG.md deleted file mode 100644 index aca94e5b149152d5c598102c633048baa17d1276..0000000000000000000000000000000000000000 --- a/substrate/frame/contracts/CHANGELOG.md +++ /dev/null @@ -1,116 +0,0 @@ -# Changelog - -All notable changes to this project will be documented in this file. - -The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), -and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - -The semantic versioning guarantees cover the interface to the Substrate runtime which -includes this pallet as a dependency. This module will also add storage migrations whenever -changes require it. Stability with regard to offchain tooling is explicitly excluded from -this guarantee: For example adding a new field to an in-storage data structure will require -changes to frontends to properly display it. However, those changes will still be regarded -as a minor version bump. - -The interface provided to smart contracts will adhere to semver with one exception: Even -major version bumps will be backwards compatible with regard to already deployed contracts. -In other words: Upgrading this pallet will not break pre-existing contracts. - -## [Unreleased] - -### Added - -- Forbid calling back to contracts after switching to runtime -[#13443](https://github.com/paritytech/substrate/pull/13443) - -- Allow contracts to dispatch calls into the runtime (**unstable**) -[#9276](https://github.com/paritytech/substrate/pull/9276) - -- New version of `seal_call` that offers more features. -[#8909](https://github.com/paritytech/substrate/pull/8909) - -- New `instantiate` RPC that allows clients to dry-run contract instantiation. -[#8451](https://github.com/paritytech/substrate/pull/8451) - -- New version of `seal_random` which exposes additional information. -[#8329](https://github.com/paritytech/substrate/pull/8329) - -### Changed - -- Replaced storage rent with automatic storage deposits -[#9669](https://github.com/paritytech/substrate/pull/9669) -[#10082](https://github.com/paritytech/substrate/pull/10082) - -- Replaced `seal_println` with the `seal_debug_message` API which allows outputting debug -messages to the console and RPC clients. -[#8773](https://github.com/paritytech/substrate/pull/8773) -[#9550](https://github.com/paritytech/substrate/pull/9550) - -- Make storage and fields of `Schedule` private to the crate. -[#8359](https://github.com/paritytech/substrate/pull/8359) - -### Fixed - -- Remove pre-charging which caused wrongly estimated weights -[#8976](https://github.com/paritytech/substrate/pull/8976) - -## [v3.0.0] 2021-02-25 - -This version constitutes the first release that brings any stability guarantees (see above). - -### Added - -- Emit an event when a contract terminates (self-destructs). -[#8014](https://github.com/paritytech/substrate/pull/8014) - -- Charge rent for code stored on the chain in addition to the already existing -rent that is paid for data storage. -[#7935](https://github.com/paritytech/substrate/pull/7935) - -- Allow the runtime to configure per storage item costs in addition -to the already existing per byte costs. -[#7819](https://github.com/paritytech/substrate/pull/7819) - -- Contracts are now deleted lazily so that the user who removes a contract -does not need to pay for the deletion of the contract storage. -[#7740](https://github.com/paritytech/substrate/pull/7740) - -- Allow runtime authors to define chain extensions in order to provide custom -functionality to contracts. -[#7548](https://github.com/paritytech/substrate/pull/7548) -[#8003](https://github.com/paritytech/substrate/pull/8003) - -- Proper weights which are fully automated by benchmarking. -[#6715](https://github.com/paritytech/substrate/pull/6715) -[#7017](https://github.com/paritytech/substrate/pull/7017) -[#7361](https://github.com/paritytech/substrate/pull/7361) - -### Changed - -- Collect the rent for one block during instantiation. -[#7847](https://github.com/paritytech/substrate/pull/7847) - -- Instantiation takes a `salt` argument to allow for easier instantion of the -same code by the same sender. -[#7482](https://github.com/paritytech/substrate/pull/7482) - -- Improve the information returned by the `contracts_call` RPC. -[#7468](https://github.com/paritytech/substrate/pull/7468) - -- Simplify the node configuration necessary to add this module. -[#7409](https://github.com/paritytech/substrate/pull/7409) - -### Fixed - -- Consider the code size of a contract in the weight that is charged for -loading a contract from storage. -[#8086](https://github.com/paritytech/substrate/pull/8086) - -- Fix possible overflow in storage size calculation -[#7885](https://github.com/paritytech/substrate/pull/7885) - -- Cap the surcharge reward that can be claimed. -[#7870](https://github.com/paritytech/substrate/pull/7870) - -- Fix a possible DoS vector where contracts could allocate too large buffers. -[#7818](https://github.com/paritytech/substrate/pull/7818) diff --git a/substrate/frame/contracts/Cargo.toml b/substrate/frame/contracts/Cargo.toml index de49983a4b3fa89309b939d03e76aa053c1fd16d..d963ac261d1940fc9fa4d88101df2ca35cf99c43 100644 --- a/substrate/frame/contracts/Cargo.toml +++ b/substrate/frame/contracts/Cargo.toml @@ -18,14 +18,15 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] +paste = { version = "1.0", default-features = false } bitflags = "1.3" codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = [ "derive", "max-encoded-len", ] } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -log = { version = "0.4", default-features = false } -serde = { version = "1", optional = true, features = ["derive"] } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +log = { workspace = true } +serde = { optional = true, features = ["derive"], workspace = true, default-features = true } smallvec = { version = "1", default-features = false, features = [ "const_generics", ] } @@ -57,7 +58,7 @@ xcm-builder = { package = "staging-xcm-builder", path = "../../../polkadot/xcm/x [dev-dependencies] array-bytes = "6.1" assert_matches = "1" -env_logger = "0.9" +env_logger = "0.11" pretty_assertions = "1" wat = "1" pallet-contracts-fixtures = { path = "./fixtures" } diff --git a/substrate/frame/contracts/README.md b/substrate/frame/contracts/README.md index 6e817292e66c50d5766d5406cca6c053a25c1362..09dc770300ca8491af062bbde9e820deccdd1341 100644 --- a/substrate/frame/contracts/README.md +++ b/substrate/frame/contracts/README.md @@ -59,7 +59,7 @@ In general, a contract execution needs to be deterministic so that all nodes com it. To that end we disallow any instructions that could cause indeterminism. Most notable are any floating point arithmetic. That said, sometimes contracts are executed off-chain and hence are not subject to consensus. If code is only executed by a single node and implicitly trusted by other actors is such a case. Trusted execution environments -come to mind. To that end we allow the execution of indeterminstic code for off-chain usages with the following +come to mind. To that end we allow the execution of indeterministic code for off-chain usages with the following constraints: 1. No contract can ever be instantiated from an indeterministic code. The only way to execute the code is to use a diff --git a/substrate/frame/contracts/benchmarks/README.md b/substrate/frame/contracts/benchmarks/README.md deleted file mode 100644 index e4441d6bab2c425a37639830f12ca303db30d1fa..0000000000000000000000000000000000000000 --- a/substrate/frame/contracts/benchmarks/README.md +++ /dev/null @@ -1,8 +0,0 @@ -# Benchmarks - -This directory contains real world ([ink!](https://use.ink), [solang](https://github.com/hyperledger/solang)) contracts -which are used in macro benchmarks. Those benchmarks are not used to determine weights but rather to compare different -contract languages and execution engines with larger wasm modules. - -Files in this directory are used by `#[extra]` benchmarks in `src/benchmarking`. The json files are for informational -purposes only and are not consumed by the benchmarks. diff --git a/substrate/frame/contracts/benchmarks/ink_erc20.json b/substrate/frame/contracts/benchmarks/ink_erc20.json deleted file mode 100644 index 390dd9b06cd4cd3ee57f83f64c9089508c68464d..0000000000000000000000000000000000000000 --- a/substrate/frame/contracts/benchmarks/ink_erc20.json +++ /dev/null @@ -1,819 +0,0 @@ -{ - "metadataVersion": "0.1.0", - "source": { - "hash": "0x6be8492017fe96b7a92bb39b4ede04b96effb8fcaf9237bfdccef7d9e732c760", - "language": "ink! 3.0.0-rc4", - "compiler": "rustc 1.56.0-nightly" - }, - "contract": { - "name": "erc20", - "version": "3.0.0-rc4", - "authors": [ - "Parity Technologies " - ] - }, - "spec": { - "constructors": [ - { - "args": [ - { - "name": "initial_supply", - "type": { - "displayName": [ - "Balance" - ], - "type": 1 - } - } - ], - "docs": [ - "Creates a new ERC-20 contract with the specified initial supply." - ], - "name": [ - "new" - ], - "selector": "0x9bae9d5e" - } - ], - "docs": [], - "events": [ - { - "args": [ - { - "docs": [], - "indexed": true, - "name": "from", - "type": { - "displayName": [ - "Option" - ], - "type": 15 - } - }, - { - "docs": [], - "indexed": true, - "name": "to", - "type": { - "displayName": [ - "Option" - ], - "type": 15 - } - }, - { - "docs": [], - "indexed": false, - "name": "value", - "type": { - "displayName": [ - "Balance" - ], - "type": 1 - } - } - ], - "docs": [ - " Event emitted when a token transfer occurs." - ], - "name": "Transfer" - }, - { - "args": [ - { - "docs": [], - "indexed": true, - "name": "owner", - "type": { - "displayName": [ - "AccountId" - ], - "type": 5 - } - }, - { - "docs": [], - "indexed": true, - "name": "spender", - "type": { - "displayName": [ - "AccountId" - ], - "type": 5 - } - }, - { - "docs": [], - "indexed": false, - "name": "value", - "type": { - "displayName": [ - "Balance" - ], - "type": 1 - } - } - ], - "docs": [ - " Event emitted when an approval occurs that `spender` is allowed to withdraw", - " up to the amount of `value` tokens from `owner`." - ], - "name": "Approval" - } - ], - "messages": [ - { - "args": [], - "docs": [ - " Returns the total token supply." - ], - "mutates": false, - "name": [ - "total_supply" - ], - "payable": false, - "returnType": { - "displayName": [ - "Balance" - ], - "type": 1 - }, - "selector": "0xdb6375a8" - }, - { - "args": [ - { - "name": "owner", - "type": { - "displayName": [ - "AccountId" - ], - "type": 5 - } - } - ], - "docs": [ - " Returns the account balance for the specified `owner`.", - "", - " Returns `0` if the account is non-existent." - ], - "mutates": false, - "name": [ - "balance_of" - ], - "payable": false, - "returnType": { - "displayName": [ - "Balance" - ], - "type": 1 - }, - "selector": "0x0f755a56" - }, - { - "args": [ - { - "name": "owner", - "type": { - "displayName": [ - "AccountId" - ], - "type": 5 - } - }, - { - "name": "spender", - "type": { - "displayName": [ - "AccountId" - ], - "type": 5 - } - } - ], - "docs": [ - " Returns the amount which `spender` is still allowed to withdraw from `owner`.", - "", - " Returns `0` if no allowance has been set `0`." - ], - "mutates": false, - "name": [ - "allowance" - ], - "payable": false, - "returnType": { - "displayName": [ - "Balance" - ], - "type": 1 - }, - "selector": "0x6a00165e" - }, - { - "args": [ - { - "name": "to", - "type": { - "displayName": [ - "AccountId" - ], - "type": 5 - } - }, - { - "name": "value", - "type": { - "displayName": [ - "Balance" - ], - "type": 1 - } - } - ], - "docs": [ - " Transfers `value` amount of tokens from the caller's account to account `to`.", - "", - " On success a `Transfer` event is emitted.", - "", - " # Errors", - "", - " Returns `InsufficientBalance` error if there are not enough tokens on", - " the caller's account balance." - ], - "mutates": true, - "name": [ - "transfer" - ], - "payable": false, - "returnType": { - "displayName": [ - "Result" - ], - "type": 12 - }, - "selector": "0x84a15da1" - }, - { - "args": [ - { - "name": "spender", - "type": { - "displayName": [ - "AccountId" - ], - "type": 5 - } - }, - { - "name": "value", - "type": { - "displayName": [ - "Balance" - ], - "type": 1 - } - } - ], - "docs": [ - " Allows `spender` to withdraw from the caller's account multiple times, up to", - " the `value` amount.", - "", - " If this function is called again it overwrites the current allowance with `value`.", - "", - " An `Approval` event is emitted." - ], - "mutates": true, - "name": [ - "approve" - ], - "payable": false, - "returnType": { - "displayName": [ - "Result" - ], - "type": 12 - }, - "selector": "0x681266a0" - }, - { - "args": [ - { - "name": "from", - "type": { - "displayName": [ - "AccountId" - ], - "type": 5 - } - }, - { - "name": "to", - "type": { - "displayName": [ - "AccountId" - ], - "type": 5 - } - }, - { - "name": "value", - "type": { - "displayName": [ - "Balance" - ], - "type": 1 - } - } - ], - "docs": [ - " Transfers `value` tokens on the behalf of `from` to the account `to`.", - "", - " This can be used to allow a contract to transfer tokens on ones behalf and/or", - " to charge fees in sub-currencies, for example.", - "", - " On success a `Transfer` event is emitted.", - "", - " # Errors", - "", - " Returns `InsufficientAllowance` error if there are not enough tokens allowed", - " for the caller to withdraw from `from`.", - "", - " Returns `InsufficientBalance` error if there are not enough tokens on", - " the account balance of `from`." - ], - "mutates": true, - "name": [ - "transfer_from" - ], - "payable": false, - "returnType": { - "displayName": [ - "Result" - ], - "type": 12 - }, - "selector": "0x0b396f18" - } - ] - }, - "storage": { - "struct": { - "fields": [ - { - "layout": { - "cell": { - "key": "0x0000000000000000000000000000000000000000000000000000000000000000", - "ty": 1 - } - }, - "name": "total_supply" - }, - { - "layout": { - "struct": { - "fields": [ - { - "layout": { - "struct": { - "fields": [ - { - "layout": { - "cell": { - "key": "0x0100000000000000000000000000000000000000000000000000000000000000", - "ty": 2 - } - }, - "name": "header" - }, - { - "layout": { - "struct": { - "fields": [ - { - "layout": { - "cell": { - "key": "0x0200000000000000000000000000000000000000000000000000000000000000", - "ty": 3 - } - }, - "name": "len" - }, - { - "layout": { - "array": { - "cellsPerElem": 1, - "layout": { - "cell": { - "key": "0x0200000001000000000000000000000000000000000000000000000000000000", - "ty": 4 - } - }, - "len": 4294967295, - "offset": "0x0300000000000000000000000000000000000000000000000000000000000000" - } - }, - "name": "elems" - } - ] - } - }, - "name": "entries" - } - ] - } - }, - "name": "keys" - }, - { - "layout": { - "hash": { - "layout": { - "cell": { - "key": "0x0300000001000000000000000000000000000000000000000000000000000000", - "ty": 9 - } - }, - "offset": "0x0200000001000000000000000000000000000000000000000000000000000000", - "strategy": { - "hasher": "Blake2x256", - "postfix": "", - "prefix": "0x696e6b20686173686d6170" - } - } - }, - "name": "values" - } - ] - } - }, - "name": "balances" - }, - { - "layout": { - "struct": { - "fields": [ - { - "layout": { - "struct": { - "fields": [ - { - "layout": { - "cell": { - "key": "0x0300000001000000000000000000000000000000000000000000000000000000", - "ty": 2 - } - }, - "name": "header" - }, - { - "layout": { - "struct": { - "fields": [ - { - "layout": { - "cell": { - "key": "0x0400000001000000000000000000000000000000000000000000000000000000", - "ty": 3 - } - }, - "name": "len" - }, - { - "layout": { - "array": { - "cellsPerElem": 1, - "layout": { - "cell": { - "key": "0x0400000002000000000000000000000000000000000000000000000000000000", - "ty": 10 - } - }, - "len": 4294967295, - "offset": "0x0500000001000000000000000000000000000000000000000000000000000000" - } - }, - "name": "elems" - } - ] - } - }, - "name": "entries" - } - ] - } - }, - "name": "keys" - }, - { - "layout": { - "hash": { - "layout": { - "cell": { - "key": "0x0500000002000000000000000000000000000000000000000000000000000000", - "ty": 9 - } - }, - "offset": "0x0400000002000000000000000000000000000000000000000000000000000000", - "strategy": { - "hasher": "Blake2x256", - "postfix": "", - "prefix": "0x696e6b20686173686d6170" - } - } - }, - "name": "values" - } - ] - } - }, - "name": "allowances" - } - ] - } - }, - "types": [ - { - "def": { - "primitive": "u128" - } - }, - { - "def": { - "composite": { - "fields": [ - { - "name": "last_vacant", - "type": 3, - "typeName": "Index" - }, - { - "name": "len", - "type": 3, - "typeName": "u32" - }, - { - "name": "len_entries", - "type": 3, - "typeName": "u32" - } - ] - } - }, - "path": [ - "ink_storage", - "collections", - "stash", - "Header" - ] - }, - { - "def": { - "primitive": "u32" - } - }, - { - "def": { - "variant": { - "variants": [ - { - "fields": [ - { - "type": 8, - "typeName": "VacantEntry" - } - ], - "name": "Vacant" - }, - { - "fields": [ - { - "type": 5, - "typeName": "T" - } - ], - "name": "Occupied" - } - ] - } - }, - "params": [ - 5 - ], - "path": [ - "ink_storage", - "collections", - "stash", - "Entry" - ] - }, - { - "def": { - "composite": { - "fields": [ - { - "type": 6, - "typeName": "[u8; 32]" - } - ] - } - }, - "path": [ - "ink_env", - "types", - "AccountId" - ] - }, - { - "def": { - "array": { - "len": 32, - "type": 7 - } - } - }, - { - "def": { - "primitive": "u8" - } - }, - { - "def": { - "composite": { - "fields": [ - { - "name": "next", - "type": 3, - "typeName": "Index" - }, - { - "name": "prev", - "type": 3, - "typeName": "Index" - } - ] - } - }, - "path": [ - "ink_storage", - "collections", - "stash", - "VacantEntry" - ] - }, - { - "def": { - "composite": { - "fields": [ - { - "name": "value", - "type": 1, - "typeName": "V" - }, - { - "name": "key_index", - "type": 3, - "typeName": "KeyIndex" - } - ] - } - }, - "params": [ - 1 - ], - "path": [ - "ink_storage", - "collections", - "hashmap", - "ValueEntry" - ] - }, - { - "def": { - "variant": { - "variants": [ - { - "fields": [ - { - "type": 8, - "typeName": "VacantEntry" - } - ], - "name": "Vacant" - }, - { - "fields": [ - { - "type": 11, - "typeName": "T" - } - ], - "name": "Occupied" - } - ] - } - }, - "params": [ - 11 - ], - "path": [ - "ink_storage", - "collections", - "stash", - "Entry" - ] - }, - { - "def": { - "tuple": [ - 5, - 5 - ] - } - }, - { - "def": { - "variant": { - "variants": [ - { - "fields": [ - { - "type": 13, - "typeName": "T" - } - ], - "name": "Ok" - }, - { - "fields": [ - { - "type": 14, - "typeName": "E" - } - ], - "name": "Err" - } - ] - } - }, - "params": [ - 13, - 14 - ], - "path": [ - "Result" - ] - }, - { - "def": { - "tuple": [] - } - }, - { - "def": { - "variant": { - "variants": [ - { - "discriminant": 0, - "name": "InsufficientBalance" - }, - { - "discriminant": 1, - "name": "InsufficientAllowance" - } - ] - } - }, - "path": [ - "erc20", - "erc20", - "Error" - ] - }, - { - "def": { - "variant": { - "variants": [ - { - "name": "None" - }, - { - "fields": [ - { - "type": 5, - "typeName": "T" - } - ], - "name": "Some" - } - ] - } - }, - "params": [ - 5 - ], - "path": [ - "Option" - ] - } - ] -} \ No newline at end of file diff --git a/substrate/frame/contracts/benchmarks/ink_erc20.wasm b/substrate/frame/contracts/benchmarks/ink_erc20.wasm deleted file mode 100644 index ffd522760a02dd8416f8ee04db02c32e2172b8ff..0000000000000000000000000000000000000000 Binary files a/substrate/frame/contracts/benchmarks/ink_erc20.wasm and /dev/null differ diff --git a/substrate/frame/contracts/benchmarks/ink_erc20_test.wasm b/substrate/frame/contracts/benchmarks/ink_erc20_test.wasm deleted file mode 100644 index f5d84552960a348db3935e457adc4b6fba249d17..0000000000000000000000000000000000000000 Binary files a/substrate/frame/contracts/benchmarks/ink_erc20_test.wasm and /dev/null differ diff --git a/substrate/frame/contracts/benchmarks/solang_erc20.json b/substrate/frame/contracts/benchmarks/solang_erc20.json deleted file mode 100644 index 9d8fd5ce70e70edb0fdb96439be847369e6ae7e0..0000000000000000000000000000000000000000 --- a/substrate/frame/contracts/benchmarks/solang_erc20.json +++ /dev/null @@ -1,581 +0,0 @@ -{ - "contract": { - "authors": [ - "unknown" - ], - "name": "ERC20PresetFixedSupply", - "version": "0.0.1" - }, - "metadataVersion": "0.1.0", - "source": { - "compiler": "solang 0.1.7", - "hash": "0x9c55e342566e89c741eb641eec3af796836da750fc930c55bccc0604a47ef700", - "language": "Solidity 0.1.7" - }, - "spec": { - "constructors": [ - { - "args": [ - { - "name": "name", - "type": { - "display_name": [ - "String" - ], - "type": 2 - } - }, - { - "name": "symbol", - "type": { - "display_name": [ - "String" - ], - "type": 2 - } - }, - { - "name": "initialSupply", - "type": { - "display_name": [ - "u256" - ], - "type": 1 - } - }, - { - "name": "owner", - "type": { - "display_name": [ - "AccountId" - ], - "type": 5 - } - } - ], - "docs": [ - "" - ], - "name": "new", - "selector": "0xa6f1f5e1" - } - ], - "events": [ - { - "args": [ - { - "indexed": true, - "name": "owner", - "type": { - "display_name": [ - "AccountId" - ], - "type": 5 - } - }, - { - "indexed": true, - "name": "spender", - "type": { - "display_name": [ - "AccountId" - ], - "type": 5 - } - }, - { - "indexed": false, - "name": "value", - "type": { - "display_name": [ - "u256" - ], - "type": 1 - } - } - ], - "docs": [ - "" - ], - "name": "Approval" - }, - { - "args": [ - { - "indexed": true, - "name": "from", - "type": { - "display_name": [ - "AccountId" - ], - "type": 5 - } - }, - { - "indexed": true, - "name": "to", - "type": { - "display_name": [ - "AccountId" - ], - "type": 5 - } - }, - { - "indexed": false, - "name": "value", - "type": { - "display_name": [ - "u256" - ], - "type": 1 - } - } - ], - "docs": [ - "" - ], - "name": "Transfer" - } - ], - "messages": [ - { - "args": [ - { - "name": "account", - "type": { - "display_name": [ - "AccountId" - ], - "type": 5 - } - }, - { - "name": "amount", - "type": { - "display_name": [ - "u256" - ], - "type": 1 - } - } - ], - "docs": [ - "" - ], - "mutates": true, - "name": "burnFrom", - "payable": false, - "return_type": null, - "selector": "0x0f1354f3" - }, - { - "args": [ - { - "name": "account", - "type": { - "display_name": [ - "AccountId" - ], - "type": 5 - } - } - ], - "docs": [ - "" - ], - "mutates": false, - "name": "balanceOf", - "payable": false, - "return_type": { - "display_name": [ - "u256" - ], - "type": 1 - }, - "selector": "0x6c7f1542" - }, - { - "args": [], - "docs": [ - "" - ], - "mutates": false, - "name": "totalSupply", - "payable": false, - "return_type": { - "display_name": [ - "u256" - ], - "type": 1 - }, - "selector": "0x18160ddd" - }, - { - "args": [], - "docs": [ - "" - ], - "mutates": false, - "name": "decimals", - "payable": false, - "return_type": { - "display_name": [ - "u8" - ], - "type": 3 - }, - "selector": "0x313ce567" - }, - { - "args": [ - { - "name": "owner", - "type": { - "display_name": [ - "AccountId" - ], - "type": 5 - } - }, - { - "name": "spender", - "type": { - "display_name": [ - "AccountId" - ], - "type": 5 - } - } - ], - "docs": [ - "" - ], - "mutates": false, - "name": "allowance", - "payable": false, - "return_type": { - "display_name": [ - "u256" - ], - "type": 1 - }, - "selector": "0xf2a9a8c7" - }, - { - "args": [], - "docs": [ - "" - ], - "mutates": false, - "name": "name", - "payable": false, - "return_type": { - "display_name": [ - "String" - ], - "type": 2 - }, - "selector": "0x06fdde03" - }, - { - "args": [ - { - "name": "spender", - "type": { - "display_name": [ - "AccountId" - ], - "type": 5 - } - }, - { - "name": "subtractedValue", - "type": { - "display_name": [ - "u256" - ], - "type": 1 - } - } - ], - "docs": [ - "" - ], - "mutates": true, - "name": "decreaseAllowance", - "payable": false, - "return_type": { - "display_name": [ - "bool" - ], - "type": 6 - }, - "selector": "0x4b76697b" - }, - { - "args": [ - { - "name": "sender", - "type": { - "display_name": [ - "AccountId" - ], - "type": 5 - } - }, - { - "name": "recipient", - "type": { - "display_name": [ - "AccountId" - ], - "type": 5 - } - }, - { - "name": "amount", - "type": { - "display_name": [ - "u256" - ], - "type": 1 - } - } - ], - "docs": [ - "" - ], - "mutates": true, - "name": "transferFrom", - "payable": false, - "return_type": { - "display_name": [ - "bool" - ], - "type": 6 - }, - "selector": "0x2fb840f5" - }, - { - "args": [], - "docs": [ - "" - ], - "mutates": false, - "name": "symbol", - "payable": false, - "return_type": { - "display_name": [ - "String" - ], - "type": 2 - }, - "selector": "0x95d89b41" - }, - { - "args": [ - { - "name": "spender", - "type": { - "display_name": [ - "AccountId" - ], - "type": 5 - } - }, - { - "name": "addedValue", - "type": { - "display_name": [ - "u256" - ], - "type": 1 - } - } - ], - "docs": [ - "" - ], - "mutates": true, - "name": "increaseAllowance", - "payable": false, - "return_type": { - "display_name": [ - "bool" - ], - "type": 6 - }, - "selector": "0xb936c899" - }, - { - "args": [ - { - "name": "recipient", - "type": { - "display_name": [ - "AccountId" - ], - "type": 5 - } - }, - { - "name": "amount", - "type": { - "display_name": [ - "u256" - ], - "type": 1 - } - } - ], - "docs": [ - "" - ], - "mutates": true, - "name": "transfer", - "payable": false, - "return_type": { - "display_name": [ - "bool" - ], - "type": 6 - }, - "selector": "0x6a467394" - }, - { - "args": [ - { - "name": "spender", - "type": { - "display_name": [ - "AccountId" - ], - "type": 5 - } - }, - { - "name": "amount", - "type": { - "display_name": [ - "u256" - ], - "type": 1 - } - } - ], - "docs": [ - "" - ], - "mutates": true, - "name": "approve", - "payable": false, - "return_type": { - "display_name": [ - "bool" - ], - "type": 6 - }, - "selector": "0x47144421" - }, - { - "args": [ - { - "name": "amount", - "type": { - "display_name": [ - "u256" - ], - "type": 1 - } - } - ], - "docs": [ - "" - ], - "mutates": true, - "name": "burn", - "payable": false, - "return_type": null, - "selector": "0x42966c68" - } - ] - }, - "storage": { - "struct": { - "fields": [ - { - "layout": { - "cell": { - "key": "0x0000000000000000000000000000000000000000000000000000000000000002", - "ty": 1 - } - }, - "name": "_totalSupply" - }, - { - "layout": { - "cell": { - "key": "0x0000000000000000000000000000000000000000000000000000000000000003", - "ty": 2 - } - }, - "name": "_name" - }, - { - "layout": { - "cell": { - "key": "0x0000000000000000000000000000000000000000000000000000000000000004", - "ty": 2 - } - }, - "name": "_symbol" - } - ] - } - }, - "types": [ - { - "def": { - "primitive": "u256" - } - }, - { - "def": { - "primitive": "str" - } - }, - { - "def": { - "primitive": "u8" - } - }, - { - "def": { - "array": { - "len": 32, - "type": 3 - } - } - }, - { - "def": { - "composite": { - "fields": [ - { - "type": 4 - } - ] - } - }, - "path": [ - "AccountId" - ] - }, - { - "def": { - "primitive": "bool" - } - } - ] -} diff --git a/substrate/frame/contracts/benchmarks/solang_erc20.wasm b/substrate/frame/contracts/benchmarks/solang_erc20.wasm deleted file mode 100644 index 0796085d33249b78871f4a336623444a0ef94e85..0000000000000000000000000000000000000000 Binary files a/substrate/frame/contracts/benchmarks/solang_erc20.wasm and /dev/null differ diff --git a/substrate/frame/contracts/fixtures/Cargo.toml b/substrate/frame/contracts/fixtures/Cargo.toml index 7fdf56a91fcc7c114b0cadd622e9d43e47088f33..8c93c6f16f66fa2c4a6955607fbd9797c0eda925 100644 --- a/substrate/frame/contracts/fixtures/Cargo.toml +++ b/substrate/frame/contracts/fixtures/Cargo.toml @@ -11,18 +11,17 @@ description = "Fixtures for testing contracts pallet." workspace = true [dependencies] -wat = "1" frame-system = { path = "../../system" } sp-runtime = { path = "../../../primitives/runtime" } -anyhow = "1.0.0" +anyhow = "1.0.81" [build-dependencies] parity-wasm = "0.45.0" tempfile = "3.8.1" toml = "0.8.2" twox-hash = "1.6.3" -polkavm-linker = { version = "0.5.0", optional = true } -anyhow = "1.0.0" +polkavm-linker = { workspace = true, optional = true } +anyhow = "1.0.81" [features] riscv = ["polkavm-linker"] diff --git a/substrate/frame/contracts/fixtures/build.rs b/substrate/frame/contracts/fixtures/build.rs index 12a7805294b673480b6a350b9f242a1de9830e56..19aff37c1601430011966768d54a475ef0bbc1d2 100644 --- a/substrate/frame/contracts/fixtures/build.rs +++ b/substrate/frame/contracts/fixtures/build.rs @@ -121,9 +121,11 @@ fn collect_entries(contracts_dir: &Path, out_dir: &Path) -> Vec { /// Create a `Cargo.toml` to compile the given contract entries. fn create_cargo_toml<'a>( fixtures_dir: &Path, + root_cargo_toml: &Path, entries: impl Iterator, output_dir: &Path, ) -> Result<()> { + let root_toml: toml::Value = toml::from_str(&fs::read_to_string(root_cargo_toml)?)?; let mut cargo_toml: toml::Value = toml::from_str(include_str!("./build/Cargo.toml"))?; let mut set_dep = |name, path| -> Result<()> { cargo_toml["dependencies"][name]["path"] = toml::Value::String( @@ -133,6 +135,8 @@ fn create_cargo_toml<'a>( }; set_dep("uapi", "../uapi")?; set_dep("common", "./contracts/common")?; + cargo_toml["dependencies"]["polkavm-derive"]["version"] = + root_toml["workspace"]["dependencies"]["polkavm-derive"].clone(); cargo_toml["bin"] = toml::Value::Array( entries @@ -324,6 +328,7 @@ fn main() -> Result<()> { let contracts_dir = fixtures_dir.join("contracts"); let out_dir: PathBuf = env::var("OUT_DIR")?.into(); let workspace_root = find_workspace_root(&fixtures_dir).expect("workspace root exists; qed"); + let root_cargo_toml = workspace_root.join("Cargo.toml"); let entries = collect_entries(&contracts_dir, &out_dir); if entries.is_empty() { @@ -333,7 +338,7 @@ fn main() -> Result<()> { let tmp_dir = tempfile::tempdir()?; let tmp_dir_path = tmp_dir.path(); - create_cargo_toml(&fixtures_dir, entries.iter(), tmp_dir.path())?; + create_cargo_toml(&fixtures_dir, &root_cargo_toml, entries.iter(), tmp_dir.path())?; invoke_cargo_fmt( &workspace_root.join(".rustfmt.toml"), entries.iter().map(|entry| &entry.path as _), diff --git a/substrate/frame/contracts/fixtures/build/Cargo.toml b/substrate/frame/contracts/fixtures/build/Cargo.toml index d524dbff1ce1b7af5d4dcf404f61154c5f2d1e6f..ba487a2bb5ca68f8533dec7ae32541dd0f429756 100644 --- a/substrate/frame/contracts/fixtures/build/Cargo.toml +++ b/substrate/frame/contracts/fixtures/build/Cargo.toml @@ -6,11 +6,11 @@ edition = "2021" # Binary targets are injected dynamically by the build script. [[bin]] -# local path are injected dynamically by the build script. +# All paths or versions are injected dynamically by the build script. [dependencies] uapi = { package = 'pallet-contracts-uapi', path = "", default-features = false } common = { package = 'pallet-contracts-fixtures-common', path = "" } -polkavm-derive = '0.5.0' +polkavm-derive = { version = "" } [profile.release] opt-level = 3 diff --git a/substrate/frame/contracts/fixtures/contracts/call.rs b/substrate/frame/contracts/fixtures/contracts/call.rs index f7d9d862d7465937f71afff998aecdaa9aa1f4bd..535745ffc0bc505c5cc29dc5959fe31a3e1fe509 100644 --- a/substrate/frame/contracts/fixtures/contracts/call.rs +++ b/substrate/frame/contracts/fixtures/contracts/call.rs @@ -35,11 +35,13 @@ pub extern "C" fn call() { ); // Call the callee - api::call_v1( + api::call_v2( uapi::CallFlags::empty(), callee_addr, - 0u64, // How much gas to devote for the execution. 0 = all. - &0u64.to_le_bytes(), // value transferred to the contract. + 0u64, // How much ref_time to devote for the execution. 0 = all. + 0u64, // How much proof_size to devote for the execution. 0 = all. + None, // No deposit limit. + &0u64.to_le_bytes(), // Value transferred to the contract. callee_input, None, ) diff --git a/substrate/frame/contracts/fixtures/contracts/call_return_code.rs b/substrate/frame/contracts/fixtures/contracts/call_return_code.rs index 1256588d3b58554edf5b1d00e98572681087f2c7..3d5a1073eaecaedabcf774e336abea48ab0b9001 100644 --- a/substrate/frame/contracts/fixtures/contracts/call_return_code.rs +++ b/substrate/frame/contracts/fixtures/contracts/call_return_code.rs @@ -38,11 +38,13 @@ pub extern "C" fn call() { ); // Call the callee - let err_code = match api::call_v1( + let err_code = match api::call_v2( uapi::CallFlags::empty(), callee_addr, - 0u64, // How much gas to devote for the execution. 0 = all. - &100u64.to_le_bytes(), // value transferred to the contract. + 0u64, // How much ref_time to devote for the execution. 0 = all. + 0u64, // How much proof_size to devote for the execution. 0 = all. + None, // No deposit limit. + &100u64.to_le_bytes(), // Value transferred to the contract. input, None, ) { diff --git a/substrate/frame/contracts/fixtures/contracts/call_runtime_and_call.rs b/substrate/frame/contracts/fixtures/contracts/call_runtime_and_call.rs index fdeb6097e732f9e7cc717f1144a51953c138e7f7..1321d36dc7efa17151cff67cfcd6162c91eecaa6 100644 --- a/substrate/frame/contracts/fixtures/contracts/call_runtime_and_call.rs +++ b/substrate/frame/contracts/fixtures/contracts/call_runtime_and_call.rs @@ -39,11 +39,13 @@ pub extern "C" fn call() { api::call_runtime(call).unwrap(); // Call the callee - api::call_v1( + api::call_v2( uapi::CallFlags::empty(), callee_addr, - 0u64, // How much gas to devote for the execution. 0 = all. - &0u64.to_le_bytes(), // value transferred to the contract. + 0u64, // How much ref_time to devote for the execution. 0 = all. + 0u64, // How much proof_size to devote for the execution. 0 = all. + None, // No deposit limit. + &0u64.to_le_bytes(), // Value transferred to the contract. callee_input, None, ) diff --git a/substrate/frame/contracts/fixtures/contracts/call_with_limit.rs b/substrate/frame/contracts/fixtures/contracts/call_with_limit.rs index 5e98aa614e95acad471a4146c492ca12cee90da8..f0851f32c75bc13d7b89c1bf366595ef1dbd57ca 100644 --- a/substrate/frame/contracts/fixtures/contracts/call_with_limit.rs +++ b/substrate/frame/contracts/fixtures/contracts/call_with_limit.rs @@ -31,12 +31,13 @@ pub extern "C" fn deploy() {} #[polkavm_derive::polkavm_export] pub extern "C" fn call() { input!( + 256, callee_addr: [u8; 32], ref_time: u64, proof_size: u64, + forwarded_input: [u8], ); - #[allow(deprecated)] api::call_v2( uapi::CallFlags::empty(), callee_addr, @@ -44,7 +45,7 @@ pub extern "C" fn call() { proof_size, None, // No deposit limit. &0u64.to_le_bytes(), // value transferred to the contract. - &[0u8; 0], // input data. + forwarded_input, None, ) .unwrap(); diff --git a/substrate/frame/contracts/fixtures/contracts/caller_contract.rs b/substrate/frame/contracts/fixtures/contracts/caller_contract.rs index c2629e9fa1971fea3da5a77f3c2d3bdfce3ce601..fffdb66a33d7979da3d81f53ec51e4308f5d355b 100644 --- a/substrate/frame/contracts/fixtures/contracts/caller_contract.rs +++ b/substrate/frame/contracts/fixtures/contracts/caller_contract.rs @@ -40,7 +40,6 @@ pub extern "C" fn call() { let reverted_input = [1u8, 34, 51, 68, 85, 102, 119]; // Fail to deploy the contract since it returns a non-zero exit status. - #[allow(deprecated)] let res = api::instantiate_v2( code_hash, 0u64, // How much ref_time weight to devote for the execution. 0 = all. @@ -55,7 +54,6 @@ pub extern "C" fn call() { assert!(matches!(res, Err(ReturnErrorCode::CalleeReverted))); // Fail to deploy the contract due to insufficient ref_time weight. - #[allow(deprecated)] let res = api::instantiate_v2( code_hash, 1u64, // too little ref_time weight 0u64, // How much proof_size weight to devote for the execution. 0 = all. @@ -65,7 +63,6 @@ pub extern "C" fn call() { assert!(matches!(res, Err(ReturnErrorCode::CalleeTrapped))); // Fail to deploy the contract due to insufficient proof_size weight. - #[allow(deprecated)] let res = api::instantiate_v2( code_hash, 0u64, // How much ref_time weight to devote for the execution. 0 = all. 1u64, // Too little proof_size weight @@ -78,7 +75,6 @@ pub extern "C" fn call() { let mut callee = [0u8; 32]; let callee = &mut &mut callee[..]; - #[allow(deprecated)] api::instantiate_v2( code_hash, 0u64, // How much ref_time weight to devote for the execution. 0 = all. @@ -94,7 +90,6 @@ pub extern "C" fn call() { assert_eq!(callee.len(), 32); // Call the new contract and expect it to return failing exit code. - #[allow(deprecated)] let res = api::call_v2( uapi::CallFlags::empty(), callee, @@ -108,11 +103,10 @@ pub extern "C" fn call() { assert!(matches!(res, Err(ReturnErrorCode::CalleeReverted))); // Fail to call the contract due to insufficient ref_time weight. - #[allow(deprecated)] let res = api::call_v2( uapi::CallFlags::empty(), callee, - 1u64, // too little ref_time weight + 1u64, // Too little ref_time weight. 0u64, // How much proof_size weight to devote for the execution. 0 = all. None, // No deposit limit. &value, @@ -122,7 +116,6 @@ pub extern "C" fn call() { assert!(matches!(res, Err(ReturnErrorCode::CalleeTrapped))); // Fail to call the contract due to insufficient proof_size weight. - #[allow(deprecated)] let res = api::call_v2( uapi::CallFlags::empty(), callee, @@ -137,7 +130,6 @@ pub extern "C" fn call() { // Call the contract successfully. let mut output = [0u8; 4]; - #[allow(deprecated)] api::call_v2( uapi::CallFlags::empty(), callee, diff --git a/substrate/frame/contracts/fixtures/contracts/caller_is_origin_n.rs b/substrate/frame/contracts/fixtures/contracts/caller_is_origin_n.rs new file mode 100644 index 0000000000000000000000000000000000000000..fd6f59802fa08408105070f37ae64569a32d38a7 --- /dev/null +++ b/substrate/frame/contracts/fixtures/contracts/caller_is_origin_n.rs @@ -0,0 +1,38 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! This fixture calls caller_is_origin `n` times. + +#![no_std] +#![no_main] + +use common::input; +use uapi::{HostFn, HostFnImpl as api}; + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn deploy() {} + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn call() { + input!(n: u32, ); + + for _ in 0..n { + let _ = api::caller_is_origin(); + } +} diff --git a/substrate/frame/contracts/fixtures/contracts/chain_extension_temp_storage.rs b/substrate/frame/contracts/fixtures/contracts/chain_extension_temp_storage.rs index 1ab08efb3c7ea49ee1e016cb6136b428e86075a3..2e15fb02a12ca5f0cd4bee944af062961d66e8b2 100644 --- a/substrate/frame/contracts/fixtures/contracts/chain_extension_temp_storage.rs +++ b/substrate/frame/contracts/fixtures/contracts/chain_extension_temp_storage.rs @@ -50,11 +50,13 @@ pub extern "C" fn call() { output!(addr, [0u8; 32], api::address,); // call self - api::call_v1( + api::call_v2( uapi::CallFlags::ALLOW_REENTRY, addr, - 0u64, // How much gas to devote for the execution. 0 = all. - &0u64.to_le_bytes(), // value transferred to the contract. + 0u64, // How much ref_time to devote for the execution. 0 = all. + 0u64, // How much proof_size to devote for the execution. 0 = all. + None, // No deposit limit. + &0u64.to_le_bytes(), // Value transferred to the contract. input, None, ) diff --git a/substrate/frame/contracts/fixtures/contracts/common/src/lib.rs b/substrate/frame/contracts/fixtures/contracts/common/src/lib.rs index 6904ab2f504caa0c9e0c2f031362c71db95249d5..80e1f543a7b53ba6585e0d8a453cacce02fdac3d 100644 --- a/substrate/frame/contracts/fixtures/contracts/common/src/lib.rs +++ b/substrate/frame/contracts/fixtures/contracts/common/src/lib.rs @@ -149,3 +149,13 @@ macro_rules! output { $host_fn($($arg,)* $output); }; } + +/// Similar to `output!` but unwraps the result. +#[macro_export] +macro_rules! unwrap_output { + ($output: ident, $buffer: expr, $host_fn:path, $($arg:expr),*) => { + let mut $output = $buffer; + let $output = &mut &mut $output[..]; + $host_fn($($arg,)* $output).unwrap(); + }; +} diff --git a/substrate/frame/contracts/fixtures/contracts/create_storage_and_call.rs b/substrate/frame/contracts/fixtures/contracts/create_storage_and_call.rs index 8b79dd87dffd2f35c2c597f95f4e442a855f69ea..f8ce0ff4fb84831fbf258f489d0bc6935784ff43 100644 --- a/substrate/frame/contracts/fixtures/contracts/create_storage_and_call.rs +++ b/substrate/frame/contracts/fixtures/contracts/create_storage_and_call.rs @@ -40,14 +40,13 @@ pub extern "C" fn call() { api::set_storage(buffer, &[1u8; 4]); // Call the callee - #[allow(deprecated)] api::call_v2( uapi::CallFlags::empty(), callee, 0u64, // How much ref_time weight to devote for the execution. 0 = all. 0u64, // How much proof_size weight to devote for the execution. 0 = all. Some(deposit_limit), - &0u64.to_le_bytes(), // value transferred to the contract. + &0u64.to_le_bytes(), // Value transferred to the contract. input, None, ) diff --git a/substrate/frame/contracts/fixtures/contracts/create_storage_and_instantiate.rs b/substrate/frame/contracts/fixtures/contracts/create_storage_and_instantiate.rs index c68d99eff821e86ecfa399fc6804f1e3a7b2649c..fa3b9000a7ed6bd3f5f094d39b5d025a995a8b4c 100644 --- a/substrate/frame/contracts/fixtures/contracts/create_storage_and_instantiate.rs +++ b/substrate/frame/contracts/fixtures/contracts/create_storage_and_instantiate.rs @@ -40,7 +40,6 @@ pub extern "C" fn call() { let mut address = [0u8; 32]; let address = &mut &mut address[..]; - #[allow(deprecated)] api::instantiate_v2( code_hash, 0u64, // How much ref_time weight to devote for the execution. 0 = all. diff --git a/substrate/frame/contracts/fixtures/contracts/destroy_and_transfer.rs b/substrate/frame/contracts/fixtures/contracts/destroy_and_transfer.rs index cfcfd60f21eef1c543e249832f74bd75e5c4a8d3..62fb63b56020455ea775e802b95daeacaefd3658 100644 --- a/substrate/frame/contracts/fixtures/contracts/destroy_and_transfer.rs +++ b/substrate/frame/contracts/fixtures/contracts/destroy_and_transfer.rs @@ -34,7 +34,6 @@ pub extern "C" fn deploy() { let address = &mut &mut address[..]; let salt = [71u8, 17u8]; - #[allow(deprecated)] api::instantiate_v2( code_hash, 0u64, // How much ref_time weight to devote for the execution. 0 = all. @@ -60,7 +59,6 @@ pub extern "C" fn call() { api::get_storage(&ADDRESS_KEY, callee_addr).unwrap(); // Calling the destination contract with non-empty input data should fail. - #[allow(deprecated)] let res = api::call_v2( uapi::CallFlags::empty(), callee_addr, @@ -74,7 +72,6 @@ pub extern "C" fn call() { assert!(matches!(res, Err(uapi::ReturnErrorCode::CalleeTrapped))); // Call the destination contract regularly, forcing it to self-destruct. - #[allow(deprecated)] api::call_v2( uapi::CallFlags::empty(), callee_addr, diff --git a/substrate/frame/contracts/fixtures/contracts/instantiate_return_code.rs b/substrate/frame/contracts/fixtures/contracts/instantiate_return_code.rs index 67cd739d85a6942a046cfaf7cc45301d6570600f..de194abe4840ac5fc67b83c1a377d114e65dfc01 100644 --- a/substrate/frame/contracts/fixtures/contracts/instantiate_return_code.rs +++ b/substrate/frame/contracts/fixtures/contracts/instantiate_return_code.rs @@ -31,7 +31,6 @@ pub extern "C" fn call() { input!(buffer, 36, code_hash: [u8; 32],); let input = &buffer[32..]; - #[allow(deprecated)] let err_code = match api::instantiate_v2( code_hash, 0u64, // How much ref_time weight to devote for the execution. 0 = all. diff --git a/substrate/frame/contracts/fixtures/contracts/add_remove_delegate_dependency.rs b/substrate/frame/contracts/fixtures/contracts/locking_delegate_dependency.rs similarity index 83% rename from substrate/frame/contracts/fixtures/contracts/add_remove_delegate_dependency.rs rename to substrate/frame/contracts/fixtures/contracts/locking_delegate_dependency.rs index 759ff7993740479f9e89b3c047eca27de74dbcc4..bb76c942aad18c511ab2e88bf1597101b307c2b4 100644 --- a/substrate/frame/contracts/fixtures/contracts/add_remove_delegate_dependency.rs +++ b/substrate/frame/contracts/fixtures/contracts/locking_delegate_dependency.rs @@ -15,7 +15,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -//! This contract tests the behavior of adding / removing delegate_dependencies when delegate +//! This contract tests the behavior of locking / unlocking delegate_dependencies when delegate //! calling into a contract. #![no_std] #![no_main] @@ -34,15 +34,13 @@ fn load_input(delegate_call: bool) { ); match action { - // 1 = Add delegate dependency + // 1 = Lock delegate dependency 1 => { - #[allow(deprecated)] - api::add_delegate_dependency(code_hash); + api::lock_delegate_dependency(code_hash); }, - // 2 = Remove delegate dependency + // 2 = Unlock delegate dependency 2 => { - #[allow(deprecated)] - api::remove_delegate_dependency(code_hash); + api::unlock_delegate_dependency(code_hash); }, // 3 = Terminate 3 => { diff --git a/substrate/frame/contracts/fixtures/contracts/multi_store.rs b/substrate/frame/contracts/fixtures/contracts/multi_store.rs index b83f3995a42b4905383f8629c04d25902e03374e..a78115f0148888d601893322fe04a4ae07fce269 100644 --- a/substrate/frame/contracts/fixtures/contracts/multi_store.rs +++ b/substrate/frame/contracts/fixtures/contracts/multi_store.rs @@ -15,7 +15,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -//! Does two stores to two seperate storage items +//! Does two stores to two separate storage items #![no_std] #![no_main] diff --git a/substrate/frame/contracts/fixtures/contracts/recurse.rs b/substrate/frame/contracts/fixtures/contracts/recurse.rs new file mode 100644 index 0000000000000000000000000000000000000000..b1ded608c2fc417323580257b74835a0aaee9aa3 --- /dev/null +++ b/substrate/frame/contracts/fixtures/contracts/recurse.rs @@ -0,0 +1,53 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! This fixture calls itself as many times as passed as argument. + +#![no_std] +#![no_main] + +use common::{input, output}; +use uapi::{HostFn, HostFnImpl as api}; + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn deploy() {} + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn call() { + input!(calls_left: u32, ); + + // own address + output!(addr, [0u8; 32], api::address,); + + if calls_left == 0 { + return + } + + api::call_v2( + uapi::CallFlags::ALLOW_REENTRY, + addr, + 0u64, // How much ref_time to devote for the execution. 0 = all. + 0u64, // How much deposit_limit to devote for the execution. 0 = all. + None, // No deposit limit. + &0u64.to_le_bytes(), // Value transferred to the contract. + &(calls_left - 1).to_le_bytes(), + None, + ) + .unwrap(); +} diff --git a/substrate/frame/contracts/fixtures/contracts/reentrance_count_call.rs b/substrate/frame/contracts/fixtures/contracts/reentrance_count_call.rs index 9812dce2e818d29a352927d2b47e301b06683dae..0acfe017f8df9094ef14aa9e6947b56e183d25be 100644 --- a/substrate/frame/contracts/fixtures/contracts/reentrance_count_call.rs +++ b/substrate/frame/contracts/fixtures/contracts/reentrance_count_call.rs @@ -42,11 +42,13 @@ pub extern "C" fn call() { if expected_reentrance_count != 5 { let count = (expected_reentrance_count + 1).to_le_bytes(); - api::call_v1( + api::call_v2( uapi::CallFlags::ALLOW_REENTRY, addr, - 0u64, // How much gas to devote for the execution. 0 = all. - &0u64.to_le_bytes(), // value transferred to the contract. + 0u64, // How much ref_time to devote for the execution. 0 = all. + 0u64, // How much proof_size to devote for the execution. 0 = all. + None, // No deposit limit. + &0u64.to_le_bytes(), // Value transferred to the contract. &count, None, ) diff --git a/substrate/frame/contracts/fixtures/contracts/return_with_data.rs b/substrate/frame/contracts/fixtures/contracts/return_with_data.rs index 5340f86fbfc589e1c0c3ca3c25c40c24a5276cd1..26f74edba5d0afdbd9fef8c88028a1e9f157da4c 100644 --- a/substrate/frame/contracts/fixtures/contracts/return_with_data.rs +++ b/substrate/frame/contracts/fixtures/contracts/return_with_data.rs @@ -38,6 +38,10 @@ pub extern "C" fn call() { output: [u8], ); + // Burn some PoV, clear_storage consumes some PoV as in order to clear the storage we need to we + // need to read its size first. + api::clear_storage_v1(b""); + let exit_status = uapi::ReturnFlags::from_bits(exit_status[0] as u32).unwrap(); api::return_value(exit_status, output); } diff --git a/substrate/frame/contracts/fixtures/contracts/self_destruct.rs b/substrate/frame/contracts/fixtures/contracts/self_destruct.rs index 94c3ac387a0a65228674efa93a477543b807661c..d3836d2d8c734214a67333dba9293067b4b5d9b1 100644 --- a/substrate/frame/contracts/fixtures/contracts/self_destruct.rs +++ b/substrate/frame/contracts/fixtures/contracts/self_destruct.rs @@ -37,10 +37,12 @@ pub extern "C" fn call() { if !input.is_empty() { output!(addr, [0u8; 32], api::address,); - api::call_v1( + api::call_v2( uapi::CallFlags::ALLOW_REENTRY, addr, - 0u64, // How much gas to devote for the execution. 0 = all. + 0u64, // How much ref_time to devote for the execution. 0 = all. + 0u64, // How much proof_size to devote for the execution. 0 = all. + None, // No deposit limit. &0u64.to_le_bytes(), // Value to transfer. &[0u8; 0], None, diff --git a/substrate/frame/contracts/fixtures/contracts/storage.rs b/substrate/frame/contracts/fixtures/contracts/storage.rs new file mode 100644 index 0000000000000000000000000000000000000000..6fa97224c7c88330b5fccad900c668d0aa7bdaae --- /dev/null +++ b/substrate/frame/contracts/fixtures/contracts/storage.rs @@ -0,0 +1,63 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! This contract tests the storage APIs. It sets and clears storage values using the different +//! versions of the storage APIs. +#![no_std] +#![no_main] + +use common::unwrap_output; +use uapi::{HostFn, HostFnImpl as api}; + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn deploy() {} + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn call() { + const KEY: [u8; 32] = [1u8; 32]; + const VALUE_1: [u8; 4] = [1u8; 4]; + const VALUE_2: [u8; 4] = [2u8; 4]; + const VALUE_3: [u8; 4] = [3u8; 4]; + + api::set_storage(&KEY, &VALUE_1); + assert_eq!(api::contains_storage(&KEY), Some(VALUE_1.len() as _)); + unwrap_output!(val, [0u8; 4], api::get_storage, &KEY); + assert_eq!(**val, VALUE_1); + + let existing = api::set_storage_v1(&KEY, &VALUE_2); + assert_eq!(existing, Some(VALUE_1.len() as _)); + unwrap_output!(val, [0u8; 4], api::get_storage, &KEY); + assert_eq!(**val, VALUE_2); + + api::clear_storage(&KEY); + assert_eq!(api::contains_storage(&KEY), None); + + let existing = api::set_storage_v2(&KEY, &VALUE_3); + assert_eq!(existing, None); + assert_eq!(api::contains_storage_v1(&KEY), Some(VALUE_1.len() as _)); + unwrap_output!(val, [0u8; 32], api::get_storage_v1, &KEY); + assert_eq!(**val, VALUE_3); + + api::clear_storage_v1(&KEY); + assert_eq!(api::contains_storage_v1(&KEY), None); + let existing = api::set_storage_v2(&KEY, &VALUE_3); + assert_eq!(existing, None); + unwrap_output!(val, [0u8; 32], api::take_storage, &KEY); + assert_eq!(**val, VALUE_3); +} diff --git a/substrate/frame/contracts/fixtures/contracts/xcm_execute.rs b/substrate/frame/contracts/fixtures/contracts/xcm_execute.rs index 09d0b6cf972815e093f066a506e3d06e5b447791..1d570ffead71845c77d664bf5b911bf66794e907 100644 --- a/substrate/frame/contracts/fixtures/contracts/xcm_execute.rs +++ b/substrate/frame/contracts/fixtures/contracts/xcm_execute.rs @@ -30,10 +30,11 @@ pub extern "C" fn deploy() {} pub extern "C" fn call() { input!(512, msg: [u8],); - let mut outcome = [0u8; 512]; - let outcome = &mut &mut outcome[..]; - #[allow(deprecated)] - api::xcm_execute(msg, outcome).unwrap(); - api::return_value(uapi::ReturnFlags::empty(), outcome); + let err_code = match api::xcm_execute(msg) { + Ok(_) => 0u32, + Err(code) => code as u32, + }; + + api::return_value(uapi::ReturnFlags::empty(), &err_code.to_le_bytes()); } diff --git a/substrate/frame/contracts/fixtures/data/invalid_contract_no_memory.wat b/substrate/frame/contracts/fixtures/data/invalid_contract_no_memory.wat deleted file mode 100644 index 0aeefbcb7ebfe27f55fb84de0f14a3c7ec12b05c..0000000000000000000000000000000000000000 --- a/substrate/frame/contracts/fixtures/data/invalid_contract_no_memory.wat +++ /dev/null @@ -1,5 +0,0 @@ -;; A valid contract which does nothing at all -(module - (func (export "deploy")) - (func (export "call")) -) diff --git a/substrate/frame/contracts/fixtures/data/invalid_module.wat b/substrate/frame/contracts/fixtures/data/invalid_module.wat deleted file mode 100644 index e4a72f74273f9350420f737e0974516b3e5c4132..0000000000000000000000000000000000000000 --- a/substrate/frame/contracts/fixtures/data/invalid_module.wat +++ /dev/null @@ -1,8 +0,0 @@ -;; An invalid module -(module - (func (export "deploy")) - (func (export "call") - ;; imbalanced stack - (i32.const 7) - ) -) diff --git a/substrate/frame/contracts/fixtures/data/run_out_of_gas_start_fn.wat b/substrate/frame/contracts/fixtures/data/run_out_of_gas_start_fn.wat deleted file mode 100644 index 6591d7ede78c20e0d19c7c60c183b4c58e98d2dc..0000000000000000000000000000000000000000 --- a/substrate/frame/contracts/fixtures/data/run_out_of_gas_start_fn.wat +++ /dev/null @@ -1,10 +0,0 @@ -(module - (import "env" "memory" (memory 1 1)) - (start $start) - (func $start - (loop $inf (br $inf)) ;; just run out of gas - (unreachable) - ) - (func (export "call")) - (func (export "deploy")) -) diff --git a/substrate/frame/contracts/fixtures/data/seal_input_noop.wat b/substrate/frame/contracts/fixtures/data/seal_input_noop.wat deleted file mode 100644 index 7b5a1e32af4d61ba8dfecdc978e5f4d3a09e1480..0000000000000000000000000000000000000000 --- a/substrate/frame/contracts/fixtures/data/seal_input_noop.wat +++ /dev/null @@ -1,14 +0,0 @@ -;; Everything prepared for the host function call, but no call is performed. -(module - (import "seal0" "seal_input" (func $seal_input (param i32 i32))) - (import "env" "memory" (memory 1 1)) - - ;; [0, 8) buffer to write input - - ;; [8, 12) size of the input buffer - (data (i32.const 8) "\04") - - (func (export "call")) - - (func (export "deploy")) -) diff --git a/substrate/frame/contracts/fixtures/data/seal_input_once.wat b/substrate/frame/contracts/fixtures/data/seal_input_once.wat deleted file mode 100644 index 919a03a9b6903df3ff4917347b9c40a2d260b8f1..0000000000000000000000000000000000000000 --- a/substrate/frame/contracts/fixtures/data/seal_input_once.wat +++ /dev/null @@ -1,22 +0,0 @@ -;; Stores a value of the passed size. The host function is called once. -(module - (import "seal0" "seal_input" (func $seal_input (param i32 i32))) - (import "env" "memory" (memory 1 1)) - - ;; [0, 8) buffer to write input - - ;; [8, 12) size of the input buffer - (data (i32.const 8) "\04") - - (func (export "call") - ;; instructions to consume engine fuel - (drop - (i32.const 42) - ) - - (call $seal_input (i32.const 0) (i32.const 8)) - - ) - - (func (export "deploy")) -) diff --git a/substrate/frame/contracts/fixtures/data/seal_input_twice.wat b/substrate/frame/contracts/fixtures/data/seal_input_twice.wat deleted file mode 100644 index 3a8be814efb045078494294961686931c4cd7ab4..0000000000000000000000000000000000000000 --- a/substrate/frame/contracts/fixtures/data/seal_input_twice.wat +++ /dev/null @@ -1,28 +0,0 @@ -;; Stores a value of the passed size. The host function is called twice. -(module - (import "seal0" "seal_input" (func $seal_input (param i32 i32))) - (import "env" "memory" (memory 1 1)) - - ;; [0, 8) buffer to write input - - ;; [8, 12) size of the input buffer - (data (i32.const 8) "\04") - - (func (export "call") - ;; instructions to consume engine fuel - (drop - (i32.const 42) - ) - - (call $seal_input (i32.const 0) (i32.const 8)) - - ;; instructions to consume engine fuel - (drop - (i32.const 42) - ) - - (call $seal_input (i32.const 0) (i32.const 8)) - ) - - (func (export "deploy")) -) diff --git a/substrate/frame/contracts/fixtures/src/lib.rs b/substrate/frame/contracts/fixtures/src/lib.rs index e0d9d4f8bd5b1512f7998d497adacf695c5092e1..56a8e2321c5c3cc2181cbfeb676700993e3f0a77 100644 --- a/substrate/frame/contracts/fixtures/src/lib.rs +++ b/substrate/frame/contracts/fixtures/src/lib.rs @@ -16,34 +16,7 @@ // limitations under the License. use sp_runtime::traits::Hash; -use std::{env::var, fs, path::PathBuf}; - -fn wat_root_dir() -> PathBuf { - match (var("CARGO_MANIFEST_DIR"), var("CARGO_PKG_NAME")) { - // When `CARGO_MANIFEST_DIR` is not set, Rust resolves relative paths from the root folder - (Err(_), _) => "substrate/frame/contracts/fixtures/data".into(), - (Ok(path), Ok(s)) if s == "pallet-contracts" => PathBuf::from(path).join("fixtures/data"), - (Ok(path), Ok(s)) if s == "pallet-contracts-mock-network" => - PathBuf::from(path).parent().unwrap().join("fixtures/data"), - (Ok(_), pkg_name) => panic!("Failed to resolve fixture dir for tests from {pkg_name:?}."), - } -} - -/// Load a given wasm module represented by a .wat file and returns a wasm binary contents along -/// with it's hash. -/// -/// The fixture files are located under the `fixtures/` directory. -fn legacy_compile_module( - fixture_name: &str, -) -> anyhow::Result<(Vec, ::Output)> -where - T: frame_system::Config, -{ - let fixture_path = wat_root_dir().join(format!("{fixture_name}.wat")); - let wasm_binary = wat::parse_file(fixture_path)?; - let code_hash = T::Hashing::hash(&wasm_binary); - Ok((wasm_binary, code_hash)) -} +use std::{fs, path::PathBuf}; /// Load a given wasm module and returns a wasm binary contents along with it's hash. /// Use the legacy compile_module as fallback, if the rust fixture does not exist yet. @@ -53,15 +26,11 @@ pub fn compile_module( where T: frame_system::Config, { - let out_dir: std::path::PathBuf = env!("OUT_DIR").into(); + let out_dir: PathBuf = env!("OUT_DIR").into(); let fixture_path = out_dir.join(format!("{fixture_name}.wasm")); - match fs::read(fixture_path) { - Ok(wasm_binary) => { - let code_hash = T::Hashing::hash(&wasm_binary); - Ok((wasm_binary, code_hash)) - }, - Err(_) => legacy_compile_module::(fixture_name), - } + let binary = fs::read(fixture_path)?; + let code_hash = T::Hashing::hash(&binary); + Ok((binary, code_hash)) } #[cfg(test)] diff --git a/substrate/frame/contracts/mock-network/Cargo.toml b/substrate/frame/contracts/mock-network/Cargo.toml index 0c4cd1356f4dfddb5c8b3e194131a1de89693e89..387c3ca39d049f7674541e24a36b300683326260 100644 --- a/substrate/frame/contracts/mock-network/Cargo.toml +++ b/substrate/frame/contracts/mock-network/Cargo.toml @@ -30,7 +30,7 @@ pallet-xcm = { path = "../../../../polkadot/xcm/pallet-xcm", default-features = polkadot-parachain-primitives = { path = "../../../../polkadot/parachain" } polkadot-primitives = { path = "../../../../polkadot/primitives" } polkadot-runtime-parachains = { path = "../../../../polkadot/runtime/parachains" } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } sp-api = { path = "../../../primitives/api", default-features = false } sp-core = { path = "../../../primitives/core", default-features = false } sp-io = { path = "../../../primitives/io", default-features = false } diff --git a/substrate/frame/contracts/mock-network/src/lib.rs b/substrate/frame/contracts/mock-network/src/lib.rs index eea9dde062c83172dbc106333f053657a7267cda..8a17a3f2fa781703f1393f2d69ca955384a080a2 100644 --- a/substrate/frame/contracts/mock-network/src/lib.rs +++ b/substrate/frame/contracts/mock-network/src/lib.rs @@ -26,7 +26,8 @@ use crate::primitives::{AccountId, UNITS}; use sp_runtime::BuildStorage; use xcm::latest::prelude::*; use xcm_executor::traits::ConvertLocation; -use xcm_simulator::{decl_test_network, decl_test_parachain, decl_test_relay_chain, TestExt}; +pub use xcm_simulator::TestExt; +use xcm_simulator::{decl_test_network, decl_test_parachain, decl_test_relay_chain}; // Accounts pub const ADMIN: sp_runtime::AccountId32 = sp_runtime::AccountId32::new([0u8; 32]); diff --git a/substrate/frame/contracts/mock-network/src/parachain.rs b/substrate/frame/contracts/mock-network/src/parachain.rs index 53839f1fca037e370a598efa490cd2f226ac5b10..d4ad47581d16740df732459b3faee2d0b02306b4 100644 --- a/substrate/frame/contracts/mock-network/src/parachain.rs +++ b/substrate/frame/contracts/mock-network/src/parachain.rs @@ -37,13 +37,11 @@ use sp_runtime::traits::{Get, IdentityLookup, MaybeEquivalence}; use sp_std::prelude::*; use xcm::latest::prelude::*; -#[allow(deprecated)] -use xcm_builder::CurrencyAdapter as XcmCurrencyAdapter; use xcm_builder::{ AccountId32Aliases, AllowExplicitUnpaidExecutionFrom, AllowTopLevelPaidExecutionFrom, ConvertedConcreteId, EnsureXcmOrigin, FixedRateOfFungible, FixedWeightBounds, - FrameTransactionalProcessor, FungiblesAdapter, IsConcrete, NativeAsset, NoChecking, - ParentAsSuperuser, ParentIsPreset, SignedAccountId32AsNative, SignedToAccountId32, + FrameTransactionalProcessor, FungibleAdapter, FungiblesAdapter, IsConcrete, NativeAsset, + NoChecking, ParentAsSuperuser, ParentIsPreset, SignedAccountId32AsNative, SignedToAccountId32, SovereignSignedViaLocation, WithComputedOrigin, }; use xcm_executor::{traits::JustTry, Config, XcmExecutor}; @@ -55,7 +53,7 @@ parameter_types! { pub const BlockHashCount: u64 = 250; } -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Runtime { type RuntimeOrigin = RuntimeOrigin; type RuntimeCall = RuntimeCall; @@ -184,9 +182,8 @@ pub fn estimate_fee_for_weight(weight: Weight) -> u128 { units_per_mb * (weight.proof_size() as u128) / (WEIGHT_PROOF_SIZE_PER_MB as u128) } -#[allow(deprecated)] pub type LocalBalancesTransactor = - XcmCurrencyAdapter, SovereignAccountOf, AccountId, ()>; + FungibleAdapter, SovereignAccountOf, AccountId, ()>; pub struct FromLocationToAsset(PhantomData<(Location, AssetId)>); impl MaybeEquivalence @@ -285,6 +282,9 @@ impl Config for XcmConfig { type SafeCallFilter = Everything; type Aliasers = Nothing; type TransactionalProcessor = FrameTransactionalProcessor; + type HrmpNewChannelOpenRequestHandler = (); + type HrmpChannelAcceptedHandler = (); + type HrmpChannelClosingHandler = (); } impl mock_msg_queue::Config for Runtime { diff --git a/substrate/frame/contracts/mock-network/src/parachain/contracts_config.rs b/substrate/frame/contracts/mock-network/src/parachain/contracts_config.rs index dadba394e26453366d0b90ce8ff18931ab00743f..3c06131dd6088a2b044b68cfbf3b4a918eb37e3e 100644 --- a/substrate/frame/contracts/mock-network/src/parachain/contracts_config.rs +++ b/substrate/frame/contracts/mock-network/src/parachain/contracts_config.rs @@ -25,7 +25,7 @@ use frame_support::{ traits::{ConstBool, ConstU32, Contains, Randomness}, weights::Weight, }; -use frame_system::pallet_prelude::BlockNumberFor; +use frame_system::{pallet_prelude::BlockNumberFor, EnsureSigned}; use pallet_xcm::BalanceOf; use sp_runtime::{traits::Convert, Perbill}; @@ -90,9 +90,12 @@ impl pallet_contracts::Config for Runtime { type Schedule = Schedule; type Time = super::Timestamp; type UnsafeUnstableInterface = ConstBool; + type UploadOrigin = EnsureSigned; + type InstantiateOrigin = EnsureSigned; type WeightInfo = (); type WeightPrice = Self; type Debug = (); type Environment = (); + type ApiVersion = (); type Xcm = pallet_xcm::Pallet; } diff --git a/substrate/frame/contracts/mock-network/src/relay_chain.rs b/substrate/frame/contracts/mock-network/src/relay_chain.rs index ce7e22dce2f0ccba24a6860408b0fc0c112eb3b9..470304ed357ec5594a2a66f795f838bc8be7740b 100644 --- a/substrate/frame/contracts/mock-network/src/relay_chain.rs +++ b/substrate/frame/contracts/mock-network/src/relay_chain.rs @@ -29,13 +29,11 @@ use sp_runtime::traits::IdentityLookup; use polkadot_parachain_primitives::primitives::Id as ParaId; use polkadot_runtime_parachains::{configuration, origin, shared}; use xcm::latest::prelude::*; -#[allow(deprecated)] -use xcm_builder::CurrencyAdapter as XcmCurrencyAdapter; use xcm_builder::{ AccountId32Aliases, AllowExplicitUnpaidExecutionFrom, AllowSubscriptionsFrom, AllowTopLevelPaidExecutionFrom, ChildParachainAsNative, ChildParachainConvertsVia, ChildSystemParachainAsSuperuser, DescribeAllTerminal, DescribeFamily, FixedRateOfFungible, - FixedWeightBounds, FrameTransactionalProcessor, HashedDescription, IsConcrete, + FixedWeightBounds, FrameTransactionalProcessor, FungibleAdapter, HashedDescription, IsConcrete, SignedAccountId32AsNative, SignedToAccountId32, SovereignSignedViaLocation, WithComputedOrigin, }; use xcm_executor::{Config, XcmExecutor}; @@ -49,7 +47,7 @@ parameter_types! { pub const BlockHashCount: u64 = 250; } -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Runtime { type RuntimeOrigin = RuntimeOrigin; type RuntimeCall = RuntimeCall; @@ -119,9 +117,8 @@ pub type SovereignAccountOf = ( ChildParachainConvertsVia, ); -#[allow(deprecated)] pub type LocalBalancesTransactor = - XcmCurrencyAdapter, SovereignAccountOf, AccountId, ()>; + FungibleAdapter, SovereignAccountOf, AccountId, ()>; pub type AssetTransactors = LocalBalancesTransactor; @@ -185,6 +182,9 @@ impl Config for XcmConfig { type SafeCallFilter = Everything; type Aliasers = Nothing; type TransactionalProcessor = FrameTransactionalProcessor; + type HrmpNewChannelOpenRequestHandler = (); + type HrmpChannelAcceptedHandler = (); + type HrmpChannelClosingHandler = (); } pub type LocalOriginToLocation = SignedToAccountId32; @@ -225,6 +225,7 @@ impl pallet_message_queue::Config for Runtime { type HeapSize = MessageQueueHeapSize; type MaxStale = MessageQueueMaxStale; type ServiceWeight = MessageQueueServiceWeight; + type IdleMaxServiceWeight = (); type MessageProcessor = MessageProcessor; type QueueChangeHandler = (); type WeightInfo = (); diff --git a/substrate/frame/contracts/mock-network/src/tests.rs b/substrate/frame/contracts/mock-network/src/tests.rs index c25373bcbe3aeaaad5d0ac7396e70ed61a4729c6..39aa9bebc0f5943627ae40a109dab357ae19dd07 100644 --- a/substrate/frame/contracts/mock-network/src/tests.rs +++ b/substrate/frame/contracts/mock-network/src/tests.rs @@ -21,21 +21,26 @@ use crate::{ primitives::{AccountId, CENTS}, relay_chain, MockNet, ParaA, ParachainBalances, Relay, ALICE, BOB, INITIAL_BALANCE, }; -use assert_matches::assert_matches; use codec::{Decode, Encode}; use frame_support::{ - assert_err, pallet_prelude::Weight, traits::{fungibles::Mutate, Currency}, }; use pallet_balances::{BalanceLock, Reasons}; use pallet_contracts::{Code, CollectEvents, DebugInfo, Determinism}; use pallet_contracts_fixtures::compile_module; +use pallet_contracts_uapi::ReturnErrorCode; use xcm::{v4::prelude::*, VersionedLocation, VersionedXcm}; use xcm_simulator::TestExt; type ParachainContracts = pallet_contracts::Pallet; +macro_rules! assert_return_code { + ( $x:expr , $y:expr $(,)? ) => {{ + assert_eq!(u32::from_le_bytes($x.data[..].try_into().unwrap()), $y as u32); + }}; +} + /// Instantiate the tests contract, and fund it with some balance and assets. fn instantiate_test_contract(name: &str) -> AccountId { let (wasm, _) = compile_module::(name).unwrap(); @@ -96,40 +101,43 @@ fn test_xcm_execute() { 0, Weight::MAX, None, - VersionedXcm::V4(message).encode(), + VersionedXcm::V4(message).encode().encode(), DebugInfo::UnsafeDebug, CollectEvents::UnsafeCollect, Determinism::Enforced, - ) - .result - .unwrap(); + ); - let mut data = &result.data[..]; - let outcome = Outcome::decode(&mut data).expect("Failed to decode xcm_execute Outcome"); - assert_matches!(outcome, Outcome::Complete { .. }); + assert_eq!(result.gas_consumed, result.gas_required); + assert_return_code!(&result.result.unwrap(), ReturnErrorCode::Success); // Check if the funds are subtracted from the account of Alice and added to the account of // Bob. let initial = INITIAL_BALANCE; - assert_eq!(parachain::Assets::balance(0, contract_addr), initial); assert_eq!(ParachainBalances::free_balance(BOB), initial + amount); + assert_eq!(ParachainBalances::free_balance(&contract_addr), initial - amount); }); } #[test] -fn test_xcm_execute_filtered_call() { +fn test_xcm_execute_incomplete() { MockNet::reset(); let contract_addr = instantiate_test_contract("xcm_execute"); + let amount = 10 * CENTS; + // Execute XCM instructions through the contract. ParaA::execute_with(|| { - // `remark` should be rejected, as it is not allowed by our CallFilter. - let call = parachain::RuntimeCall::System(frame_system::Call::remark { remark: vec![] }); - let message: Xcm = Xcm(vec![Transact { - origin_kind: OriginKind::Native, - require_weight_at_most: Weight::MAX, - call: call.encode().into(), - }]); + // The XCM used to transfer funds to Bob. + let message: Xcm<()> = Xcm(vec![ + WithdrawAsset(vec![(Here, amount).into()].into()), + // This will fail as the contract does not have enough balance to complete both + // withdrawals. + WithdrawAsset(vec![(Here, INITIAL_BALANCE).into()].into()), + DepositAsset { + assets: All.into(), + beneficiary: AccountId32 { network: None, id: BOB.clone().into() }.into(), + }, + ]); let result = ParachainContracts::bare_call( ALICE, @@ -137,13 +145,17 @@ fn test_xcm_execute_filtered_call() { 0, Weight::MAX, None, - VersionedXcm::V4(message).encode(), + VersionedXcm::V4(message).encode().encode(), DebugInfo::UnsafeDebug, CollectEvents::UnsafeCollect, Determinism::Enforced, ); - assert_err!(result.result, frame_system::Error::::CallFiltered); + assert_eq!(result.gas_consumed, result.gas_required); + assert_return_code!(&result.result.unwrap(), ReturnErrorCode::XcmExecutionFailed); + + assert_eq!(ParachainBalances::free_balance(BOB), INITIAL_BALANCE); + assert_eq!(ParachainBalances::free_balance(&contract_addr), INITIAL_BALANCE - amount); }); } @@ -178,21 +190,14 @@ fn test_xcm_execute_reentrant_call() { 0, Weight::MAX, None, - VersionedXcm::V4(message).encode(), + VersionedXcm::V4(message).encode().encode(), DebugInfo::UnsafeDebug, CollectEvents::UnsafeCollect, Determinism::Enforced, - ) - .result - .unwrap(); - - let mut data = &result.data[..]; - let outcome = Outcome::decode(&mut data).expect("Failed to decode xcm_execute Outcome"); - assert_matches!( - outcome, - Outcome::Incomplete { used: _, error: XcmError::ExpectationFalse } ); + assert_return_code!(&result.result.unwrap(), ReturnErrorCode::XcmExecutionFailed); + // Funds should not change hands as the XCM transact failed. assert_eq!(ParachainBalances::free_balance(BOB), INITIAL_BALANCE); }); @@ -221,7 +226,7 @@ fn test_xcm_send() { 0, Weight::MAX, None, - (dest, message).encode(), + (dest, message.encode()).encode(), DebugInfo::UnsafeDebug, CollectEvents::UnsafeCollect, Determinism::Enforced, diff --git a/substrate/frame/contracts/proc-macro/Cargo.toml b/substrate/frame/contracts/proc-macro/Cargo.toml index ed6175ee8cdfdf34fff9faa0ca00341c65191ee7..4080cd0442dbc516231dc983a3b6609a211523db 100644 --- a/substrate/frame/contracts/proc-macro/Cargo.toml +++ b/substrate/frame/contracts/proc-macro/Cargo.toml @@ -19,5 +19,5 @@ proc-macro = true [dependencies] proc-macro2 = "1.0.56" -quote = "1.0.28" -syn = { version = "2.0.48", features = ["full"] } +quote = { workspace = true } +syn = { features = ["full"], workspace = true } diff --git a/substrate/frame/contracts/proc-macro/src/lib.rs b/substrate/frame/contracts/proc-macro/src/lib.rs index 403db15ac2cbcf796280a29ba4c7a91e3047b21e..1794d09d5ad28e08bf9579bed4f311f469be832c 100644 --- a/substrate/frame/contracts/proc-macro/src/lib.rs +++ b/substrate/frame/contracts/proc-macro/src/lib.rs @@ -497,9 +497,14 @@ fn expand_docs(def: &EnvDef) -> TokenStream2 { fn expand_env(def: &EnvDef, docs: bool) -> TokenStream2 { let impls = expand_impls(def); let docs = docs.then_some(expand_docs(def)).unwrap_or(TokenStream2::new()); + let stable_api_count = def.host_funcs.iter().filter(|f| f.is_stable).count(); quote! { pub struct Env; + + #[cfg(test)] + pub const STABLE_API_COUNT: usize = #stable_api_count; + #impls /// Documentation of the API (host functions) available to contracts. /// @@ -638,37 +643,34 @@ fn expand_functions(def: &EnvDef, expand_blocks: bool, host_state: TokenStream2) }; let sync_gas_before = if expand_blocks { quote! { - // Gas left in the gas meter right before switching to engine execution. - let __gas_before__ = { - let engine_consumed_total = + // Write gas from wasmi into pallet-contracts before entering the host function. + let __gas_left_before__ = { + let executor_total = __caller__.fuel_consumed().expect("Fuel metering is enabled; qed"); - let gas_meter = __caller__.data_mut().ext().gas_meter_mut(); - gas_meter - .charge_fuel(engine_consumed_total) + __caller__ + .data_mut() + .ext() + .gas_meter_mut() + .sync_from_executor(executor_total) .map_err(TrapReason::from) .map_err(#into_host)? - .ref_time() }; } } else { quote! { } }; - // Gas left in the gas meter right after returning from engine execution. + // Write gas from pallet-contracts into wasmi after leaving the host function. let sync_gas_after = if expand_blocks { quote! { - let mut gas_after = __caller__.data_mut().ext().gas_meter().gas_left().ref_time(); - let mut host_consumed = __gas_before__.saturating_sub(gas_after); - // Possible undercharge of at max 1 fuel here, if host consumed less than `instruction_weights.base` - // Not a problem though, as soon as host accounts its spent gas properly. - let fuel_consumed = host_consumed - .checked_div(__caller__.data_mut().ext().schedule().instruction_weights.base as u64) - .ok_or(Error::::InvalidSchedule) - .map_err(TrapReason::from) - .map_err(#into_host)?; + let fuel_consumed = __caller__ + .data_mut() + .ext() + .gas_meter_mut() + .sync_to_executor(__gas_left_before__) + .map_err(TrapReason::from)?; __caller__ - .consume_fuel(fuel_consumed) - .map_err(|_| TrapReason::from(Error::::OutOfGas)) - .map_err(#into_host)?; + .consume_fuel(fuel_consumed.into()) + .map_err(|_| TrapReason::from(Error::::OutOfGas))?; } } else { quote! { } diff --git a/substrate/frame/contracts/src/benchmarking/call_builder.rs b/substrate/frame/contracts/src/benchmarking/call_builder.rs new file mode 100644 index 0000000000000000000000000000000000000000..285fe0052b4d95a200eaebd0a86fb77d729aacfd --- /dev/null +++ b/substrate/frame/contracts/src/benchmarking/call_builder.rs @@ -0,0 +1,170 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use crate::{ + benchmarking::{Contract, WasmModule}, + exec::Stack, + storage::meter::Meter, + wasm::Runtime, + BalanceOf, Config, DebugBufferVec, Determinism, ExecReturnValue, GasMeter, Origin, Schedule, + TypeInfo, WasmBlob, Weight, +}; +use codec::{Encode, HasCompact}; +use core::fmt::Debug; +use sp_core::Get; +use sp_std::prelude::*; + +type StackExt<'a, T> = Stack<'a, T, WasmBlob>; + +/// A prepared contract call ready to be executed. +pub struct PreparedCall<'a, T: Config> { + func: wasmi::Func, + store: wasmi::Store>>, +} + +impl<'a, T: Config> PreparedCall<'a, T> { + pub fn call(mut self) -> ExecReturnValue { + let result = self.func.call(&mut self.store, &[], &mut []); + WasmBlob::::process_result(self.store, result).unwrap() + } +} + +/// A builder used to prepare a contract call. +pub struct CallSetup { + contract: Contract, + dest: T::AccountId, + origin: Origin, + gas_meter: GasMeter, + storage_meter: Meter, + schedule: Schedule, + value: BalanceOf, + debug_message: Option>, + determinism: Determinism, + data: Vec, +} + +impl CallSetup +where + T: Config + pallet_balances::Config, + as HasCompact>::Type: Clone + Eq + PartialEq + Debug + TypeInfo + Encode, +{ + /// Setup a new call for the given module. + pub fn new(module: WasmModule) -> Self { + let contract = Contract::::new(module.clone(), vec![]).unwrap(); + let dest = contract.account_id.clone(); + let origin = Origin::from_account_id(contract.caller.clone()); + + let storage_meter = Meter::new(&origin, None, 0u32.into()).unwrap(); + + Self { + contract, + dest, + origin, + gas_meter: GasMeter::new(Weight::MAX), + storage_meter, + schedule: T::Schedule::get(), + value: 0u32.into(), + debug_message: None, + determinism: Determinism::Enforced, + data: vec![], + } + } + + /// Set the meter's storage deposit limit. + pub fn set_storage_deposit_limit(&mut self, balance: BalanceOf) { + self.storage_meter = Meter::new(&self.origin, Some(balance), 0u32.into()).unwrap(); + } + + /// Set the call's origin. + pub fn set_origin(&mut self, origin: Origin) { + self.origin = origin; + } + + /// Set the contract's balance. + pub fn set_balance(&mut self, value: BalanceOf) { + self.contract.set_balance(value); + } + + /// Set the call's input data. + pub fn set_data(&mut self, value: Vec) { + self.data = value; + } + + /// Set the debug message. + pub fn enable_debug_message(&mut self) { + self.debug_message = Some(Default::default()); + } + + /// Get the debug message. + pub fn debug_message(&self) -> Option> { + self.debug_message.clone() + } + + /// Get the call's input data. + pub fn data(&self) -> Vec { + self.data.clone() + } + + /// Get the call's contract. + pub fn contract(&self) -> Contract { + self.contract.clone() + } + + /// Build the call stack. + pub fn ext(&mut self) -> (StackExt<'_, T>, WasmBlob) { + StackExt::bench_new_call( + self.dest.clone(), + self.origin.clone(), + &mut self.gas_meter, + &mut self.storage_meter, + &self.schedule, + self.value, + self.debug_message.as_mut(), + self.determinism, + ) + } + + /// Prepare a call to the module. + pub fn prepare_call<'a>( + ext: &'a mut StackExt<'a, T>, + module: WasmBlob, + input: Vec, + ) -> PreparedCall<'a, T> { + let (func, store) = module.bench_prepare_call(ext, input); + PreparedCall { func, store } + } +} + +#[macro_export] +macro_rules! call_builder( + ($func: ident, $module:expr) => { + $crate::call_builder!($func, _contract, $module); + }; + ($func: ident, $contract: ident, $module:expr) => { + let mut setup = CallSetup::::new($module); + $crate::call_builder!($func, $contract, setup: setup); + }; + ($func:ident, setup: $setup: ident) => { + $crate::call_builder!($func, _contract, setup: $setup); + }; + ($func:ident, $contract: ident, setup: $setup: ident) => { + let data = $setup.data(); + let $contract = $setup.contract(); + let (mut ext, module) = $setup.ext(); + let $func = CallSetup::::prepare_call(&mut ext, module, data); + }; +); diff --git a/substrate/frame/contracts/src/benchmarking/code.rs b/substrate/frame/contracts/src/benchmarking/code.rs index 0b6ab6b3c0e1b99b2dfb34642568d29cc9dfdd91..b97cf168e26d4562e4f4a3b7f07ad243174e7a98 100644 --- a/substrate/frame/contracts/src/benchmarking/code.rs +++ b/substrate/frame/contracts/src/benchmarking/code.rs @@ -26,13 +26,13 @@ use crate::Config; use frame_support::traits::Get; -use sp_runtime::traits::Hash; +use sp_runtime::{traits::Hash, Saturating}; use sp_std::{borrow::ToOwned, prelude::*}; use wasm_instrument::parity_wasm::{ builder, elements::{ - self, BlockType, CustomSection, External, FuncBody, Instruction, Instructions, Local, - Module, Section, ValueType, + self, BlockType, CustomSection, FuncBody, Instruction, Instructions, Local, Section, + ValueType, }, }; @@ -164,7 +164,7 @@ impl From for WasmModule { // Grant access to linear memory. // Every contract module is required to have an imported memory. - // If no memory is specified in the passed ModuleDefenition, then + // If no memory is specified in the passed ModuleDefinition, then // default to (1, 1). let (init, max) = if let Some(memory) = &def.memory { (memory.min_pages, Some(memory.max_pages)) @@ -238,24 +238,6 @@ impl From for WasmModule { } impl WasmModule { - /// Uses the supplied wasm module. - pub fn from_code(code: &[u8]) -> Self { - let module = Module::from_bytes(code).unwrap(); - let limits = *module - .import_section() - .unwrap() - .entries() - .iter() - .find_map(|e| if let External::Memory(mem) = e.external() { Some(mem) } else { None }) - .unwrap() - .limits(); - let code = module.into_bytes().unwrap(); - let hash = T::Hashing::hash(&code); - let memory = - ImportedMemory { min_pages: limits.initial(), max_pages: limits.maximum().unwrap() }; - Self { code: code.into(), hash, memory: Some(memory) } - } - /// Creates a wasm module with an empty `call` and `deploy` function and nothing else. pub fn dummy() -> Self { ModuleDefinition::default().into() @@ -280,22 +262,25 @@ impl WasmModule { /// `instantiate_with_code` for different sizes of wasm modules. The generated module maximizes /// instrumentation runtime by nesting blocks as deeply as possible given the byte budget. /// `code_location`: Whether to place the code into `deploy` or `call`. - pub fn sized(target_bytes: u32, code_location: Location) -> Self { + pub fn sized(target_bytes: u32, code_location: Location, use_float: bool) -> Self { use self::elements::Instruction::{End, GetLocal, If, Return}; // Base size of a contract is 63 bytes and each expansion adds 6 bytes. // We do one expansion less to account for the code section and function body // size fields inside the binary wasm module representation which are leb128 encoded // and therefore grow in size when the contract grows. We are not allowed to overshoot // because of the maximum code size that is enforced by `instantiate_with_code`. - let expansions = (target_bytes.saturating_sub(63) / 6).saturating_sub(1); + let mut expansions = (target_bytes.saturating_sub(63) / 6).saturating_sub(1); const EXPANSION: [Instruction; 4] = [GetLocal(0), If(BlockType::NoResult), Return, End]; + let mut locals = vec![Local::new(1, ValueType::I32)]; + if use_float { + locals.push(Local::new(1, ValueType::F32)); + locals.push(Local::new(2, ValueType::F32)); + locals.push(Local::new(3, ValueType::F32)); + expansions.saturating_dec(); + } let mut module = ModuleDefinition { memory: Some(ImportedMemory::max::()), ..Default::default() }; - let body = Some(body::repeated_with_locals( - &[Local::new(1, ValueType::I32)], - expansions, - &EXPANSION, - )); + let body = Some(body::repeated_with_locals(&locals, expansions, &EXPANSION)); match code_location { Location::Call => module.call_body = body, Location::Deploy => module.deploy_body = body, diff --git a/substrate/frame/contracts/src/benchmarking/mod.rs b/substrate/frame/contracts/src/benchmarking/mod.rs index e387c28b6714c02d5ee5831cf5b5030bf90660d5..676fd320a17299b2eb2471d485afcd2775168175 100644 --- a/substrate/frame/contracts/src/benchmarking/mod.rs +++ b/substrate/frame/contracts/src/benchmarking/mod.rs @@ -16,12 +16,13 @@ // limitations under the License. //! Benchmarks for the contracts pallet - #![cfg(feature = "runtime-benchmarks")] +mod call_builder; mod code; mod sandbox; use self::{ + call_builder::CallSetup, code::{ body::{self, DynInstr::*}, DataSegment, ImportedFunction, ImportedMemory, Location, ModuleDefinition, WasmModule, @@ -29,19 +30,19 @@ use self::{ sandbox::Sandbox, }; use crate::{ - exec::{AccountIdOf, Key}, + exec::Key, migration::{ - codegen::LATEST_MIGRATION_VERSION, v09, v10, v11, v12, v13, v14, v15, MigrationStep, + codegen::LATEST_MIGRATION_VERSION, v09, v10, v11, v12, v13, v14, v15, v16, MigrationStep, }, Pallet as Contracts, *, }; use codec::{Encode, MaxEncodedLen}; -use frame_benchmarking::v1::{account, benchmarks, whitelisted_caller}; +use frame_benchmarking::v2::*; use frame_support::{ self, pallet_prelude::StorageVersion, traits::{fungible::InspectHold, Currency}, - weights::Weight, + weights::{Weight, WeightMeter}, }; use frame_system::RawOrigin; use pallet_balances; @@ -64,6 +65,7 @@ const API_BENCHMARK_RUNS: u32 = 1600; const INSTR_BENCHMARK_RUNS: u32 = 5000; /// An instantiated and deployed contract. +#[derive(Clone)] struct Contract { caller: T::AccountId, account_id: T::AccountId, @@ -184,190 +186,235 @@ fn caller_funding() -> BalanceOf { BalanceOf::::max_value() / 10_000u32.into() } -/// Load the specified contract file from disk by including it into the runtime. -/// -/// We need to load a different version of ink! contracts when the benchmark is run as -/// a test. This is because ink! contracts depend on the sizes of types that are defined -/// differently in the test environment. Solang is more lax in that regard. -macro_rules! load_benchmark { - ($name:expr) => {{ - #[cfg(not(test))] - { - include_bytes!(concat!("../../benchmarks/", $name, ".wasm")) - } - #[cfg(test)] - { - include_bytes!(concat!("../../benchmarks/", $name, "_test.wasm")) - } - }}; -} - -benchmarks! { - where_clause { where +#[benchmarks( + where as codec::HasCompact>::Type: Clone + Eq + PartialEq + sp_std::fmt::Debug + scale_info::TypeInfo + codec::Encode, T: Config + pallet_balances::Config, BalanceOf: From< as Currency>::Balance>, as Currency>::Balance: From>, - } +)] +mod benchmarks { + use super::*; // The base weight consumed on processing contracts deletion queue. - #[pov_mode = Measured] - on_process_deletion_queue_batch {}: { - ContractInfo::::process_deletion_queue_batch(Weight::MAX) + #[benchmark(pov_mode = Measured)] + fn on_process_deletion_queue_batch() { + #[block] + { + ContractInfo::::process_deletion_queue_batch(&mut WeightMeter::new()) + } } - #[skip_meta] - #[pov_mode = Measured] - on_initialize_per_trie_key { - let k in 0..1024; - let instance = Contract::::with_storage(WasmModule::dummy(), k, T::Schedule::get().limits.payload_len)?; + #[benchmark(skip_meta, pov_mode = Measured)] + fn on_initialize_per_trie_key(k: Linear<0, 1024>) -> Result<(), BenchmarkError> { + let instance = Contract::::with_storage( + WasmModule::dummy(), + k, + T::Schedule::get().limits.payload_len, + )?; instance.info()?.queue_trie_for_deletion(); - }: { - ContractInfo::::process_deletion_queue_batch(Weight::MAX) + + #[block] + { + ContractInfo::::process_deletion_queue_batch(&mut WeightMeter::new()) + } + + Ok(()) } // This benchmarks the v9 migration step (update codeStorage). - #[pov_mode = Measured] - v9_migration_step { - let c in 0 .. T::MaxCodeLen::get(); + #[benchmark(pov_mode = Measured)] + fn v9_migration_step(c: Linear<0, { T::MaxCodeLen::get() }>) { v09::store_old_dummy_code::(c as usize); let mut m = v09::Migration::::default(); - }: { - m.step(); + #[block] + { + m.step(&mut WeightMeter::new()); + } } // This benchmarks the v10 migration step (use dedicated deposit_account). - #[pov_mode = Measured] - v10_migration_step { - let contract = >::with_caller( - whitelisted_caller(), WasmModule::dummy(), vec![], - )?; - - v10::store_old_contract_info::>(contract.account_id.clone(), contract.info()?); + #[benchmark(pov_mode = Measured)] + fn v10_migration_step() -> Result<(), BenchmarkError> { + let contract = + >::with_caller(whitelisted_caller(), WasmModule::dummy(), vec![])?; + + v10::store_old_contract_info::>( + contract.account_id.clone(), + contract.info()?, + ); let mut m = v10::Migration::>::default(); - }: { - m.step(); + + #[block] + { + m.step(&mut WeightMeter::new()); + } + + Ok(()) } - // This benchmarks the v11 migration step (Don't rely on reserved balances keeping an account alive). - #[pov_mode = Measured] - v11_migration_step { - let k in 0 .. 1024; + // This benchmarks the v11 migration step (Don't rely on reserved balances keeping an account + // alive). + #[benchmark(pov_mode = Measured)] + fn v11_migration_step(k: Linear<0, 1024>) { v11::fill_old_queue::(k as usize); let mut m = v11::Migration::::default(); - }: { - m.step(); + + #[block] + { + m.step(&mut WeightMeter::new()); + } } // This benchmarks the v12 migration step (Move `OwnerInfo` to `CodeInfo`, // add `determinism` field to the latter, clear `CodeStorage` // and repay deposits). - #[pov_mode = Measured] - v12_migration_step { - let c in 0 .. T::MaxCodeLen::get(); - v12::store_old_dummy_code::< - T, - pallet_balances::Pallet - >(c as usize, account::("account", 0, 0)); + #[benchmark(pov_mode = Measured)] + fn v12_migration_step(c: Linear<0, { T::MaxCodeLen::get() }>) { + v12::store_old_dummy_code::>( + c as usize, + account::("account", 0, 0), + ); let mut m = v12::Migration::>::default(); - }: { - m.step(); + + #[block] + { + m.step(&mut WeightMeter::new()); + } } // This benchmarks the v13 migration step (Add delegate_dependencies field). - #[pov_mode = Measured] - v13_migration_step { - let contract = >::with_caller( - whitelisted_caller(), WasmModule::dummy(), vec![], - )?; + #[benchmark(pov_mode = Measured)] + fn v13_migration_step() -> Result<(), BenchmarkError> { + let contract = + >::with_caller(whitelisted_caller(), WasmModule::dummy(), vec![])?; v13::store_old_contract_info::(contract.account_id.clone(), contract.info()?); let mut m = v13::Migration::::default(); - }: { - m.step(); + + #[block] + { + m.step(&mut WeightMeter::new()); + } + Ok(()) } - // This benchmarks the v14 migration step (Move code owners' reserved balance to be held instead). - #[pov_mode = Measured] - v14_migration_step { + // This benchmarks the v14 migration step (Move code owners' reserved balance to be held + // instead). + #[benchmark(pov_mode = Measured)] + fn v14_migration_step() { let account = account::("account", 0, 0); T::Currency::set_balance(&account, caller_funding::()); v14::store_dummy_code::>(account); let mut m = v14::Migration::>::default(); - }: { - m.step(); + + #[block] + { + m.step(&mut WeightMeter::new()); + } } // This benchmarks the v15 migration step (remove deposit account). - #[pov_mode = Measured] - v15_migration_step { - let contract = >::with_caller( - whitelisted_caller(), WasmModule::dummy(), vec![], - )?; + #[benchmark(pov_mode = Measured)] + fn v15_migration_step() -> Result<(), BenchmarkError> { + let contract = + >::with_caller(whitelisted_caller(), WasmModule::dummy(), vec![])?; v15::store_old_contract_info::(contract.account_id.clone(), contract.info()?); let mut m = v15::Migration::::default(); - }: { - m.step(); + + #[block] + { + m.step(&mut WeightMeter::new()); + } + + Ok(()) + } + + // This benchmarks the v16 migration step (Remove ED from base_deposit). + #[benchmark(pov_mode = Measured)] + fn v16_migration_step() -> Result<(), BenchmarkError> { + let contract = + >::with_caller(whitelisted_caller(), WasmModule::dummy(), vec![])?; + + let info = contract.info()?; + let base_deposit = v16::store_old_contract_info::(contract.account_id.clone(), &info); + let mut m = v16::Migration::::default(); + + #[block] + { + m.step(&mut WeightMeter::new()); + } + let ed = Pallet::::min_balance(); + let info = v16::ContractInfoOf::::get(&contract.account_id).unwrap(); + assert_eq!(info.storage_base_deposit, base_deposit - ed); + Ok(()) } // This benchmarks the weight of executing Migration::migrate to execute a noop migration. - #[pov_mode = Measured] - migration_noop { + #[benchmark(pov_mode = Measured)] + fn migration_noop() { let version = LATEST_MIGRATION_VERSION; - assert_eq!(StorageVersion::get::>(), version); - }: { - Migration::::migrate(Weight::MAX) - } verify { + StorageVersion::new(version).put::>(); + #[block] + { + Migration::::migrate(&mut WeightMeter::new()); + } assert_eq!(StorageVersion::get::>(), version); } - // This benchmarks the weight of dispatching migrate to execute 1 `NoopMigraton` - #[pov_mode = Measured] - migrate { + // This benchmarks the weight of dispatching migrate to execute 1 `NoopMigration` + #[benchmark(pov_mode = Measured)] + fn migrate() { let latest_version = LATEST_MIGRATION_VERSION; StorageVersion::new(latest_version - 2).put::>(); - as frame_support::traits::OnRuntimeUpgrade>::on_runtime_upgrade(); - let caller: T::AccountId = whitelisted_caller(); - let origin = RawOrigin::Signed(caller.clone()); - }: _(origin, Weight::MAX) - verify { + as frame_support::traits::OnRuntimeUpgrade>::on_runtime_upgrade(); + + #[extrinsic_call] + _(RawOrigin::Signed(whitelisted_caller()), Weight::MAX); + assert_eq!(StorageVersion::get::>(), latest_version - 1); } - // This benchmarks the weight of running on_runtime_upgrade when there are no migration in progress. - #[pov_mode = Measured] - on_runtime_upgrade_noop { + // This benchmarks the weight of running on_runtime_upgrade when there are no migration in + // progress. + #[benchmark(pov_mode = Measured)] + fn on_runtime_upgrade_noop() { let latest_version = LATEST_MIGRATION_VERSION; - assert_eq!(StorageVersion::get::>(), latest_version); - }: { - as frame_support::traits::OnRuntimeUpgrade>::on_runtime_upgrade() - } verify { + StorageVersion::new(latest_version).put::>(); + #[block] + { + as frame_support::traits::OnRuntimeUpgrade>::on_runtime_upgrade(); + } assert!(MigrationInProgress::::get().is_none()); } - // This benchmarks the weight of running on_runtime_upgrade when there is a migration in progress. - #[pov_mode = Measured] - on_runtime_upgrade_in_progress { + // This benchmarks the weight of running on_runtime_upgrade when there is a migration in + // progress. + #[benchmark(pov_mode = Measured)] + fn on_runtime_upgrade_in_progress() { let latest_version = LATEST_MIGRATION_VERSION; StorageVersion::new(latest_version - 2).put::>(); let v = vec![42u8].try_into().ok(); MigrationInProgress::::set(v.clone()); - }: { - as frame_support::traits::OnRuntimeUpgrade>::on_runtime_upgrade() - } verify { + #[block] + { + as frame_support::traits::OnRuntimeUpgrade>::on_runtime_upgrade(); + } assert!(MigrationInProgress::::get().is_some()); assert_eq!(MigrationInProgress::::get(), v); } - // This benchmarks the weight of running on_runtime_upgrade when there is a migration to process. - #[pov_mode = Measured] - on_runtime_upgrade { + // This benchmarks the weight of running on_runtime_upgrade when there is a migration to + // process. + #[benchmark(pov_mode = Measured)] + fn on_runtime_upgrade() { let latest_version = LATEST_MIGRATION_VERSION; StorageVersion::new(latest_version - 2).put::>(); - }: { - as frame_support::traits::OnRuntimeUpgrade>::on_runtime_upgrade() - } verify { + #[block] + { + as frame_support::traits::OnRuntimeUpgrade>::on_runtime_upgrade(); + } assert!(MigrationInProgress::::get().is_some()); } @@ -375,17 +422,25 @@ benchmarks! { // the sandbox. This does **not** include the actual execution for which the gas meter // is responsible. This is achieved by generating all code to the `deploy` function // which is in the wasm module but not executed on `call`. - // The results are supposed to be used as `call_with_code_per_byte(c) - call_with_code_per_byte(0)`. - #[pov_mode = Measured] - call_with_code_per_byte { - let c in 0 .. T::MaxCodeLen::get(); + // The results are supposed to be used as `call_with_code_per_byte(c) - + // call_with_code_per_byte(0)`. + #[benchmark(pov_mode = Measured)] + fn call_with_code_per_byte( + c: Linear<0, { T::MaxCodeLen::get() }>, + ) -> Result<(), BenchmarkError> { let instance = Contract::::with_caller( - whitelisted_caller(), WasmModule::sized(c, Location::Deploy), vec![], + whitelisted_caller(), + WasmModule::sized(c, Location::Deploy, false), + vec![], )?; let value = Pallet::::min_balance(); - let origin = RawOrigin::Signed(instance.caller.clone()); let callee = instance.addr; - }: call(origin, callee, value, Weight::MAX, None, vec![]) + + #[extrinsic_call] + call(RawOrigin::Signed(instance.caller.clone()), callee, value, Weight::MAX, None, vec![]); + + Ok(()) + } // This constructs a contract that is maximal expensive to instrument. // It creates a maximum number of metering blocks per byte. @@ -397,24 +452,28 @@ benchmarks! { // `c`: Size of the code in bytes. // `i`: Size of the input in bytes. // `s`: Size of the salt in bytes. - #[pov_mode = Measured] - instantiate_with_code { - let c in 0 .. T::MaxCodeLen::get(); - let i in 0 .. code::max_pages::() * 64 * 1024; - let s in 0 .. code::max_pages::() * 64 * 1024; + #[benchmark(pov_mode = Measured)] + fn instantiate_with_code( + c: Linear<0, { T::MaxCodeLen::get() }>, + i: Linear<0, { code::max_pages::() * 64 * 1024 }>, + s: Linear<0, { code::max_pages::() * 64 * 1024 }>, + ) { let input = vec![42u8; i as usize]; let salt = vec![42u8; s as usize]; let value = Pallet::::min_balance(); let caller = whitelisted_caller(); T::Currency::set_balance(&caller, caller_funding::()); - let WasmModule { code, hash, .. } = WasmModule::::sized(c, Location::Call); + let WasmModule { code, hash, .. } = WasmModule::::sized(c, Location::Call, false); let origin = RawOrigin::Signed(caller.clone()); let addr = Contracts::::contract_address(&caller, &hash, &input, &salt); - }: _(origin, value, Weight::MAX, None, code, input, salt) - verify { - let deposit = T::Currency::balance_on_hold(&HoldReason::StorageDepositReserve.into(), &addr); + #[extrinsic_call] + _(origin, value, Weight::MAX, None, code, input, salt); + + let deposit = + T::Currency::balance_on_hold(&HoldReason::StorageDepositReserve.into(), &addr); // uploading the code reserves some balance in the callers account - let code_deposit = T::Currency::balance_on_hold(&HoldReason::CodeUploadDepositReserve.into(), &caller); + let code_deposit = + T::Currency::balance_on_hold(&HoldReason::CodeUploadDepositReserve.into(), &caller); assert_eq!( T::Currency::balance(&caller), caller_funding::() - value - deposit - code_deposit - Pallet::::min_balance(), @@ -426,22 +485,25 @@ benchmarks! { // Instantiate uses a dummy contract constructor to measure the overhead of the instantiate. // `i`: Size of the input in bytes. // `s`: Size of the salt in bytes. - #[pov_mode = Measured] - instantiate { - let i in 0 .. code::max_pages::() * 64 * 1024; - let s in 0 .. code::max_pages::() * 64 * 1024; + #[benchmark(pov_mode = Measured)] + fn instantiate( + i: Linear<0, { code::max_pages::() * 64 * 1024 }>, + s: Linear<0, { code::max_pages::() * 64 * 1024 }>, + ) -> Result<(), BenchmarkError> { let input = vec![42u8; i as usize]; let salt = vec![42u8; s as usize]; let value = Pallet::::min_balance(); let caller = whitelisted_caller(); T::Currency::set_balance(&caller, caller_funding::()); let WasmModule { code, hash, .. } = WasmModule::::dummy(); - let origin = RawOrigin::Signed(caller.clone()); let addr = Contracts::::contract_address(&caller, &hash, &input, &salt); Contracts::::store_code_raw(code, caller.clone())?; - }: _(origin, value, Weight::MAX, None, hash, input, salt) - verify { - let deposit = T::Currency::balance_on_hold(&HoldReason::StorageDepositReserve.into(), &addr); + + #[extrinsic_call] + _(RawOrigin::Signed(caller.clone()), value, Weight::MAX, None, hash, input, salt); + + let deposit = + T::Currency::balance_on_hold(&HoldReason::StorageDepositReserve.into(), &addr); // value was removed from the caller assert_eq!( T::Currency::balance(&caller), @@ -449,6 +511,8 @@ benchmarks! { ); // contract has the full value assert_eq!(T::Currency::balance(&addr), value + Pallet::::min_balance()); + + Ok(()) } // We just call a dummy contract to measure the overhead of the call extrinsic. @@ -458,19 +522,21 @@ benchmarks! { // part of `seal_input`. The costs for invoking a contract of a specific size are not part // of this benchmark because we cannot know the size of the contract when issuing a call // transaction. See `call_with_code_per_byte` for this. - #[pov_mode = Measured] - call { + #[benchmark(pov_mode = Measured)] + fn call() -> Result<(), BenchmarkError> { let data = vec![42u8; 1024]; - let instance = Contract::::with_caller( - whitelisted_caller(), WasmModule::dummy(), vec![], - )?; + let instance = + Contract::::with_caller(whitelisted_caller(), WasmModule::dummy(), vec![])?; let value = Pallet::::min_balance(); let origin = RawOrigin::Signed(instance.caller.clone()); let callee = instance.addr.clone(); let before = T::Currency::balance(&instance.account_id); - }: _(origin, callee, value, Weight::MAX, None, data) - verify { - let deposit = T::Currency::balance_on_hold(&HoldReason::StorageDepositReserve.into(), &instance.account_id); + #[extrinsic_call] + _(origin, callee, value, Weight::MAX, None, data); + let deposit = T::Currency::balance_on_hold( + &HoldReason::StorageDepositReserve.into(), + &instance.account_id, + ); // value and value transferred via call should be removed from the caller assert_eq!( T::Currency::balance(&instance.caller), @@ -480,75 +546,92 @@ benchmarks! { assert_eq!(T::Currency::balance(&instance.account_id), before + value); // contract should still exist instance.info()?; + + Ok(()) } // This constructs a contract that is maximal expensive to instrument. // It creates a maximum number of metering blocks per byte. // `c`: Size of the code in bytes. - #[pov_mode = Measured] - upload_code { - let c in 0 .. T::MaxCodeLen::get(); + #[benchmark(pov_mode = Measured)] + fn upload_code_determinism_enforced(c: Linear<0, { T::MaxCodeLen::get() }>) { let caller = whitelisted_caller(); T::Currency::set_balance(&caller, caller_funding::()); - let WasmModule { code, hash, .. } = WasmModule::::sized(c, Location::Call); + let WasmModule { code, hash, .. } = WasmModule::::sized(c, Location::Call, false); let origin = RawOrigin::Signed(caller.clone()); - }: _(origin, code, None, Determinism::Enforced) - verify { + #[extrinsic_call] + upload_code(origin, code, None, Determinism::Enforced); // uploading the code reserves some balance in the callers account assert!(T::Currency::total_balance_on_hold(&caller) > 0u32.into()); assert!(>::code_exists(&hash)); } + // Uploading code with [`Determinism::Relaxed`] should be more expensive than uploading code + // with [`Determinism::Enforced`], as we always try to save the code with + // [`Determinism::Enforced`] first. + #[benchmark(pov_mode = Measured)] + fn upload_code_determinism_relaxed(c: Linear<0, { T::MaxCodeLen::get() }>) { + let caller = whitelisted_caller(); + T::Currency::set_balance(&caller, caller_funding::()); + let WasmModule { code, hash, .. } = WasmModule::::sized(c, Location::Call, true); + let origin = RawOrigin::Signed(caller.clone()); + #[extrinsic_call] + upload_code(origin, code, None, Determinism::Relaxed); + assert!(T::Currency::total_balance_on_hold(&caller) > 0u32.into()); + assert!(>::code_exists(&hash)); + // Ensure that the benchmark follows the most expensive path, i.e., the code is saved with + assert_eq!(CodeInfoOf::::get(&hash).unwrap().determinism(), Determinism::Relaxed); + } + // Removing code does not depend on the size of the contract because all the information // needed to verify the removal claim (refcount, owner) is stored in a separate storage // item (`CodeInfoOf`). - #[pov_mode = Measured] - remove_code { + #[benchmark(pov_mode = Measured)] + fn remove_code() -> Result<(), BenchmarkError> { let caller = whitelisted_caller(); T::Currency::set_balance(&caller, caller_funding::()); let WasmModule { code, hash, .. } = WasmModule::::dummy(); let origin = RawOrigin::Signed(caller.clone()); - let uploaded = >::bare_upload_code(caller.clone(), code, None, Determinism::Enforced)?; + let uploaded = + >::bare_upload_code(caller.clone(), code, None, Determinism::Enforced)?; assert_eq!(uploaded.code_hash, hash); assert_eq!(uploaded.deposit, T::Currency::total_balance_on_hold(&caller)); assert!(>::code_exists(&hash)); - }: _(origin, hash) - verify { + #[extrinsic_call] + _(origin, hash); // removing the code should have unreserved the deposit assert_eq!(T::Currency::total_balance_on_hold(&caller), 0u32.into()); assert!(>::code_removed(&hash)); + Ok(()) } - #[pov_mode = Measured] - set_code { - let instance = >::with_caller( - whitelisted_caller(), WasmModule::dummy(), vec![], - )?; + #[benchmark(pov_mode = Measured)] + fn set_code() -> Result<(), BenchmarkError> { + let instance = + >::with_caller(whitelisted_caller(), WasmModule::dummy(), vec![])?; // we just add some bytes so that the code hash is different let WasmModule { code, hash, .. } = >::dummy_with_bytes(128); >::store_code_raw(code, instance.caller.clone())?; let callee = instance.addr.clone(); assert_ne!(instance.info()?.code_hash, hash); - }: _(RawOrigin::Root, callee, hash) - verify { + #[extrinsic_call] + _(RawOrigin::Root, callee, hash); assert_eq!(instance.info()?.code_hash, hash); + Ok(()) } - #[pov_mode = Measured] - seal_caller { - let r in 0 .. API_BENCHMARK_RUNS; - let instance = Contract::::new(WasmModule::getter( - "seal0", "seal_caller", r - ), vec![])?; - let origin = RawOrigin::Signed(instance.caller.clone()); - }: call(origin, instance.addr, 0u32.into(), Weight::MAX, None, vec![]) + #[benchmark(pov_mode = Measured)] + fn seal_caller(r: Linear<0, API_BENCHMARK_RUNS>) { + call_builder!(func, WasmModule::getter("seal0", "seal_caller", r)); + #[block] + { + func.call(); + } + } - #[pov_mode = Measured] - seal_is_contract { - let r in 0 .. API_BENCHMARK_RUNS; - let accounts = (0 .. r) - .map(|n| account::("account", n, 0)) - .collect::>(); + #[benchmark(pov_mode = Measured)] + fn seal_is_contract(r: Linear<0, API_BENCHMARK_RUNS>) { + let accounts = (0..r).map(|n| account::("account", n, 0)).collect::>(); let account_len = accounts.get(0).map(|i| i.encode().len()).unwrap_or(0); let accounts_bytes = accounts.iter().flat_map(|a| a.encode()).collect::>(); let code = WasmModule::::from(ModuleDefinition { @@ -559,38 +642,34 @@ benchmarks! { params: vec![ValueType::I32], return_type: Some(ValueType::I32), }], - data_segments: vec![ - DataSegment { - offset: 0, - value: accounts_bytes - }, - ], - call_body: Some(body::repeated_dyn(r, vec![ - Counter(0, account_len as u32), // address_ptr - Regular(Instruction::Call(0)), - Regular(Instruction::Drop), - ])), - .. Default::default() + data_segments: vec![DataSegment { offset: 0, value: accounts_bytes }], + call_body: Some(body::repeated_dyn( + r, + vec![ + Counter(0, account_len as u32), // address_ptr + Regular(Instruction::Call(0)), + Regular(Instruction::Drop), + ], + )), + ..Default::default() }); - let instance = Contract::::new(code, vec![])?; - let info = instance.info()?; + call_builder!(func, instance, code); + let info = instance.info().unwrap(); // every account would be a contract (worst case) for acc in accounts.iter() { >::insert(acc, info.clone()); } - let origin = RawOrigin::Signed(instance.caller.clone()); - }: call(origin, instance.addr, 0u32.into(), Weight::MAX, None, vec![]) + #[block] + { + func.call(); + } + } - #[pov_mode = Measured] - seal_code_hash { - let r in 0 .. API_BENCHMARK_RUNS; - let accounts = (0 .. r) - .map(|n| account::("account", n, 0)) - .collect::>(); + #[benchmark(pov_mode = Measured)] + fn seal_code_hash(r: Linear<0, API_BENCHMARK_RUNS>) { + let accounts = (0..r).map(|n| account::("account", n, 0)).collect::>(); let account_len = accounts.get(0).map(|i| i.encode().len()).unwrap_or(0); let accounts_bytes = accounts.iter().flat_map(|a| a.encode()).collect::>(); - let accounts_len = accounts_bytes.len(); - let pages = code::max_pages::(); let code = WasmModule::::from(ModuleDefinition { memory: Some(ImportedMemory::max::()), imported_functions: vec![ImportedFunction { @@ -604,41 +683,43 @@ benchmarks! { offset: 0, value: 32u32.to_le_bytes().to_vec(), // output length }, - DataSegment { - offset: 36, - value: accounts_bytes, - }, + DataSegment { offset: 36, value: accounts_bytes }, ], - call_body: Some(body::repeated_dyn(r, vec![ - Counter(36, account_len as u32), // address_ptr - Regular(Instruction::I32Const(4)), // ptr to output data - Regular(Instruction::I32Const(0)), // ptr to output length - Regular(Instruction::Call(0)), - Regular(Instruction::Drop), - ])), - .. Default::default() + call_body: Some(body::repeated_dyn( + r, + vec![ + Counter(36, account_len as u32), // address_ptr + Regular(Instruction::I32Const(4)), // ptr to output data + Regular(Instruction::I32Const(0)), // ptr to output length + Regular(Instruction::Call(0)), + Regular(Instruction::Drop), + ], + )), + ..Default::default() }); - let instance = Contract::::new(code, vec![])?; - let info = instance.info()?; + call_builder!(func, instance, code); + let info = instance.info().unwrap(); // every account would be a contract (worst case) for acc in accounts.iter() { >::insert(acc, info.clone()); } - let origin = RawOrigin::Signed(instance.caller.clone()); - }: call(origin, instance.addr, 0u32.into(), Weight::MAX, None, vec![]) - - #[pov_mode = Measured] - seal_own_code_hash { - let r in 0 .. API_BENCHMARK_RUNS; - let instance = Contract::::new(WasmModule::getter( - "seal0", "seal_own_code_hash", r - ), vec![])?; - let origin = RawOrigin::Signed(instance.caller.clone()); - }: call(origin, instance.addr, 0u32.into(), Weight::MAX, None, vec![]) + #[block] + { + func.call(); + } + } + + #[benchmark(pov_mode = Measured)] + fn seal_own_code_hash(r: Linear<0, API_BENCHMARK_RUNS>) { + call_builder!(func, WasmModule::getter("seal0", "seal_own_code_hash", r)); + #[block] + { + func.call(); + } + } - #[pov_mode = Measured] - seal_caller_is_origin { - let r in 0 .. API_BENCHMARK_RUNS; + #[benchmark(pov_mode = Measured)] + fn seal_caller_is_origin(r: Linear<0, API_BENCHMARK_RUNS>) { let code = WasmModule::::from(ModuleDefinition { memory: Some(ImportedMemory::max::()), imported_functions: vec![ImportedFunction { @@ -647,20 +728,18 @@ benchmarks! { params: vec![], return_type: Some(ValueType::I32), }], - call_body: Some(body::repeated(r, &[ - Instruction::Call(0), - Instruction::Drop, - ])), - .. Default::default() + call_body: Some(body::repeated(r, &[Instruction::Call(0), Instruction::Drop])), + ..Default::default() }); - let instance = Contract::::new(code, vec![])?; - let origin = RawOrigin::Signed(instance.caller.clone()); - }: call(origin, instance.addr, 0u32.into(), Weight::MAX, None, vec![]) - - #[pov_mode = Measured] - seal_caller_is_root { - let r in 0 .. API_BENCHMARK_RUNS; + call_builder!(func, code); + #[block] + { + func.call(); + } + } + #[benchmark(pov_mode = Measured)] + fn seal_caller_is_root(r: Linear<0, API_BENCHMARK_RUNS>) { let code = WasmModule::::from(ModuleDefinition { memory: Some(ImportedMemory::max::()), imported_functions: vec![ImportedFunction { @@ -669,82 +748,83 @@ benchmarks! { params: vec![], return_type: Some(ValueType::I32), }], - call_body: Some(body::repeated(r, &[ - Instruction::Call(0), - Instruction::Drop, - ])), - .. Default::default() + call_body: Some(body::repeated(r, &[Instruction::Call(0), Instruction::Drop])), + ..Default::default() }); - let instance = Contract::::new(code, vec![])?; - let origin = RawOrigin::Root; - }: call(origin, instance.addr, 0u32.into(), Weight::MAX, None, vec![]) - - #[pov_mode = Measured] - seal_address { - let r in 0 .. API_BENCHMARK_RUNS; - let instance = Contract::::new(WasmModule::getter( - "seal0", "seal_address", r - ), vec![])?; - let origin = RawOrigin::Signed(instance.caller.clone()); - }: call(origin, instance.addr, 0u32.into(), Weight::MAX, None, vec![]) - - #[pov_mode = Measured] - seal_gas_left { - let r in 0 .. API_BENCHMARK_RUNS; - let instance = Contract::::new(WasmModule::getter( - "seal1", "gas_left", r - ), vec![])?; - let origin = RawOrigin::Signed(instance.caller.clone()); - }: call(origin, instance.addr, 0u32.into(), Weight::MAX, None, vec![]) - - #[pov_mode = Measured] - seal_balance { - let r in 0 .. API_BENCHMARK_RUNS; - let instance = Contract::::new(WasmModule::getter( - "seal0", "seal_balance", r - ), vec![])?; - let origin = RawOrigin::Signed(instance.caller.clone()); - }: call(origin, instance.addr, 0u32.into(), Weight::MAX, None, vec![]) - - #[pov_mode = Measured] - seal_value_transferred { - let r in 0 .. API_BENCHMARK_RUNS; - let instance = Contract::::new(WasmModule::getter( - "seal0", "seal_value_transferred", r - ), vec![])?; - let origin = RawOrigin::Signed(instance.caller.clone()); - }: call(origin, instance.addr, 0u32.into(), Weight::MAX, None, vec![]) - - #[pov_mode = Measured] - seal_minimum_balance { - let r in 0 .. API_BENCHMARK_RUNS; - let instance = Contract::::new(WasmModule::getter( - "seal0", "seal_minimum_balance", r - ), vec![])?; - let origin = RawOrigin::Signed(instance.caller.clone()); - }: call(origin, instance.addr, 0u32.into(), Weight::MAX, None, vec![]) - - #[pov_mode = Measured] - seal_block_number { - let r in 0 .. API_BENCHMARK_RUNS; - let instance = Contract::::new(WasmModule::getter( - "seal0", "seal_block_number", r - ), vec![])?; - let origin = RawOrigin::Signed(instance.caller.clone()); - }: call(origin, instance.addr, 0u32.into(), Weight::MAX, None, vec![]) - - #[pov_mode = Measured] - seal_now { - let r in 0 .. API_BENCHMARK_RUNS; - let instance = Contract::::new(WasmModule::getter( - "seal0", "seal_now", r - ), vec![])?; - let origin = RawOrigin::Signed(instance.caller.clone()); - }: call(origin, instance.addr, 0u32.into(), Weight::MAX, None, vec![]) + let mut setup = CallSetup::::new(code); + setup.set_origin(Origin::Root); + call_builder!(func, setup: setup); + #[block] + { + func.call(); + } + } - #[pov_mode = Measured] - seal_weight_to_fee { - let r in 0 .. API_BENCHMARK_RUNS; + #[benchmark(pov_mode = Measured)] + fn seal_address(r: Linear<0, API_BENCHMARK_RUNS>) { + call_builder!(func, WasmModule::getter("seal0", "seal_address", r)); + #[block] + { + func.call(); + } + } + + #[benchmark(pov_mode = Measured)] + fn seal_gas_left(r: Linear<0, API_BENCHMARK_RUNS>) { + call_builder!(func, WasmModule::getter("seal1", "gas_left", r)); + #[block] + { + func.call(); + } + } + + #[benchmark(pov_mode = Measured)] + fn seal_balance(r: Linear<0, API_BENCHMARK_RUNS>) { + call_builder!(func, WasmModule::getter("seal0", "seal_balance", r)); + #[block] + { + func.call(); + } + } + + #[benchmark(pov_mode = Measured)] + fn seal_value_transferred(r: Linear<0, API_BENCHMARK_RUNS>) { + call_builder!(func, WasmModule::getter("seal0", "seal_value_transferred", r)); + #[block] + { + func.call(); + } + } + + #[benchmark(pov_mode = Measured)] + fn seal_minimum_balance(r: Linear<0, API_BENCHMARK_RUNS>) { + call_builder!(func, WasmModule::getter("seal0", "seal_minimum_balance", r)); + #[block] + { + func.call(); + } + } + + #[benchmark(pov_mode = Measured)] + fn seal_block_number(r: Linear<0, API_BENCHMARK_RUNS>) { + call_builder!(func, WasmModule::getter("seal0", "seal_block_number", r)); + #[block] + { + func.call(); + } + } + + #[benchmark(pov_mode = Measured)] + fn seal_now(r: Linear<0, API_BENCHMARK_RUNS>) { + call_builder!(func, WasmModule::getter("seal0", "seal_now", r)); + #[block] + { + func.call(); + } + } + + #[benchmark(pov_mode = Measured)] + fn seal_weight_to_fee(r: Linear<0, API_BENCHMARK_RUNS>) { let pages = code::max_pages::(); let code = WasmModule::::from(ModuleDefinition { memory: Some(ImportedMemory::max::()), @@ -758,22 +838,27 @@ benchmarks! { offset: 0, value: (pages * 64 * 1024 - 4).to_le_bytes().to_vec(), }], - call_body: Some(body::repeated(r, &[ - Instruction::I64Const(500_000), - Instruction::I64Const(300_000), - Instruction::I32Const(4), - Instruction::I32Const(0), - Instruction::Call(0), - ])), - .. Default::default() + call_body: Some(body::repeated( + r, + &[ + Instruction::I64Const(500_000), + Instruction::I64Const(300_000), + Instruction::I32Const(4), + Instruction::I32Const(0), + Instruction::Call(0), + ], + )), + ..Default::default() }); - let instance = Contract::::new(code, vec![])?; - let origin = RawOrigin::Signed(instance.caller.clone()); - }: call(origin, instance.addr, 0u32.into(), Weight::MAX, None, vec![]) + call_builder!(func, code); + #[block] + { + func.call(); + } + } - #[pov_mode = Measured] - seal_input { - let r in 0 .. API_BENCHMARK_RUNS; + #[benchmark(pov_mode = Measured)] + fn seal_input(r: Linear<0, API_BENCHMARK_RUNS>) { let code = WasmModule::::from(ModuleDefinition { memory: Some(ImportedMemory::max::()), imported_functions: vec![ImportedFunction { @@ -782,26 +867,29 @@ benchmarks! { params: vec![ValueType::I32, ValueType::I32], return_type: None, }], - data_segments: vec![ - DataSegment { - offset: 0, - value: 0u32.to_le_bytes().to_vec(), - }, - ], - call_body: Some(body::repeated(r, &[ - Instruction::I32Const(4), // ptr where to store output - Instruction::I32Const(0), // ptr to length - Instruction::Call(0), - ])), - .. Default::default() + data_segments: vec![DataSegment { offset: 0, value: 0u32.to_le_bytes().to_vec() }], + call_body: Some(body::repeated( + r, + &[ + Instruction::I32Const(4), // ptr where to store output + Instruction::I32Const(0), // ptr to length + Instruction::Call(0), + ], + )), + ..Default::default() }); - let instance = Contract::::new(code, vec![])?; - let origin = RawOrigin::Signed(instance.caller.clone()); - }: call(origin, instance.addr, 0u32.into(), Weight::MAX, None, vec![]) - #[pov_mode = Measured] - seal_input_per_byte { - let n in 0 .. code::max_pages::() * 64 * 1024; + call_builder!(func, code); + #[block] + { + func.call(); + } + } + + #[benchmark(pov_mode = Measured)] + fn seal_input_per_byte( + n: Linear<0, { code::max_pages::() * 64 * 1024 }>, + ) -> Result<(), BenchmarkError> { let buffer_size = code::max_pages::() * 64 * 1024 - 4; let code = WasmModule::::from(ModuleDefinition { memory: Some(ImportedMemory::max::()), @@ -811,31 +899,31 @@ benchmarks! { params: vec![ValueType::I32, ValueType::I32], return_type: None, }], - data_segments: vec![ - DataSegment { - offset: 0, - value: buffer_size.to_le_bytes().to_vec(), - }, - ], + data_segments: vec![DataSegment { + offset: 0, + value: buffer_size.to_le_bytes().to_vec(), + }], call_body: Some(body::plain(vec![ Instruction::I32Const(4), // ptr where to store output Instruction::I32Const(0), // ptr to length Instruction::Call(0), Instruction::End, ])), - .. Default::default() + ..Default::default() }); let instance = Contract::::new(code, vec![])?; let data = vec![42u8; n.min(buffer_size) as usize]; let origin = RawOrigin::Signed(instance.caller.clone()); - }: call(origin, instance.addr, 0u32.into(), Weight::MAX, None, data) + #[extrinsic_call] + call(origin, instance.addr, 0u32.into(), Weight::MAX, None, data); + Ok(()) + } // We cannot call `seal_return` multiple times. Therefore our weight determination is not // as precise as with other APIs. Because this function can only be called once per // contract it cannot be used as an attack vector. - #[pov_mode = Measured] - seal_return { - let r in 0 .. 1; + #[benchmark(pov_mode = Measured)] + fn seal_return(r: Linear<0, 1>) { let code = WasmModule::::from(ModuleDefinition { memory: Some(ImportedMemory::max::()), imported_functions: vec![ImportedFunction { @@ -844,21 +932,26 @@ benchmarks! { params: vec![ValueType::I32, ValueType::I32, ValueType::I32], return_type: None, }], - call_body: Some(body::repeated(r, &[ - Instruction::I32Const(0), // flags - Instruction::I32Const(0), // data_ptr - Instruction::I32Const(0), // data_len - Instruction::Call(0), - ])), - .. Default::default() + call_body: Some(body::repeated( + r, + &[ + Instruction::I32Const(0), // flags + Instruction::I32Const(0), // data_ptr + Instruction::I32Const(0), // data_len + Instruction::Call(0), + ], + )), + ..Default::default() }); - let instance = Contract::::new(code, vec![])?; - let origin = RawOrigin::Signed(instance.caller.clone()); - }: call(origin, instance.addr, 0u32.into(), Weight::MAX, None, vec![]) + call_builder!(func, code); + #[block] + { + func.call(); + } + } - #[pov_mode = Measured] - seal_return_per_byte { - let n in 0 .. code::max_pages::() * 64 * 1024; + #[benchmark(pov_mode = Measured)] + fn seal_return_per_byte(n: Linear<0, { code::max_pages::() * 64 * 1024 }>) { let code = WasmModule::::from(ModuleDefinition { memory: Some(ImportedMemory::max::()), imported_functions: vec![ImportedFunction { @@ -868,22 +961,24 @@ benchmarks! { return_type: None, }], call_body: Some(body::plain(vec![ - Instruction::I32Const(0), // flags - Instruction::I32Const(0), // data_ptr + Instruction::I32Const(0), // flags + Instruction::I32Const(0), // data_ptr Instruction::I32Const(n as i32), // data_len Instruction::Call(0), Instruction::End, ])), - .. Default::default() + ..Default::default() }); - let instance = Contract::::new(code, vec![])?; - let origin = RawOrigin::Signed(instance.caller.clone()); - }: call(origin, instance.addr, 0u32.into(), Weight::MAX, None, vec![]) + call_builder!(func, code); + #[block] + { + func.call(); + } + } // The same argument as for `seal_return` is true here. - #[pov_mode = Measured] - seal_terminate { - let r in 0 .. 1; + #[benchmark(pov_mode = Measured)] + fn seal_terminate(r: Linear<0, 1>) -> Result<(), BenchmarkError> { let beneficiary = account::("beneficiary", 0, 0); let beneficiary_bytes = beneficiary.encode(); let beneficiary_len = beneficiary_bytes.len(); @@ -913,52 +1008,77 @@ benchmarks! { }, ImportedFunction { module: "seal0", - name: "add_delegate_dependency", + name: "lock_delegate_dependency", params: vec![ValueType::I32], return_type: None, - } + }, ], data_segments: vec![ - DataSegment { - offset: 0, - value: beneficiary_bytes, - }, - DataSegment { - offset: beneficiary_len as u32, - value: code_hashes_bytes, - }, + DataSegment { offset: 0, value: beneficiary_bytes }, + DataSegment { offset: beneficiary_len as u32, value: code_hashes_bytes }, ], - deploy_body: Some(body::repeated_dyn(r, vec![ - Counter(beneficiary_len as u32, code_hash_len as u32), // code_hash_ptr - Regular(Instruction::Call(1)), - ])), - call_body: Some(body::repeated(r, &[ - Instruction::I32Const(0), // beneficiary_ptr - Instruction::I32Const(beneficiary_len as i32), // beneficiary_len - Instruction::Call(0), - ])), - .. Default::default() - }); + deploy_body: Some(body::repeated_dyn( + T::MaxDelegateDependencies::get(), + vec![ + Counter(beneficiary_len as u32, code_hash_len as u32), // code_hash_ptr + Regular(Instruction::Call(1)), + ], + )), + call_body: Some(body::repeated( + r, + &[ + Instruction::I32Const(0), // beneficiary_ptr + Instruction::I32Const(beneficiary_len as i32), // beneficiary_len + Instruction::Call(0), + ], + )), + ..Default::default() + }); let instance = Contract::::new(code, vec![])?; let origin = RawOrigin::Signed(instance.caller.clone()); assert_eq!(T::Currency::total_balance(&beneficiary), 0u32.into()); - assert_eq!(T::Currency::balance(&instance.account_id), Pallet::::min_balance() * 2u32.into()); - assert_ne!(T::Currency::balance_on_hold(&HoldReason::StorageDepositReserve.into(), &instance.account_id), 0u32.into()); - }: call(origin, instance.addr.clone(), 0u32.into(), Weight::MAX, None, vec![]) - verify { + assert_eq!( + T::Currency::balance(&instance.account_id), + Pallet::::min_balance() * 2u32.into() + ); + assert_ne!( + T::Currency::balance_on_hold( + &HoldReason::StorageDepositReserve.into(), + &instance.account_id + ), + 0u32.into() + ); + assert_eq!( + ContractInfoOf::::get(&instance.account_id) + .unwrap() + .delegate_dependencies_count() as u32, + T::MaxDelegateDependencies::get() + ); + #[extrinsic_call] + call(origin, instance.addr.clone(), 0u32.into(), Weight::MAX, None, vec![]); + if r > 0 { assert_eq!(T::Currency::total_balance(&instance.account_id), 0u32.into()); - assert_eq!(T::Currency::balance_on_hold(&HoldReason::StorageDepositReserve.into(), &instance.account_id), 0u32.into()); - assert_eq!(T::Currency::total_balance(&beneficiary), Pallet::::min_balance() * 2u32.into()); + assert_eq!( + T::Currency::balance_on_hold( + &HoldReason::StorageDepositReserve.into(), + &instance.account_id + ), + 0u32.into() + ); + assert_eq!( + T::Currency::total_balance(&beneficiary), + Pallet::::min_balance() * 2u32.into() + ); } + Ok(()) } // We benchmark only for the maximum subject length. We assume that this is some lowish // number (< 1 KB). Therefore we are not overcharging too much in case a smaller subject is // used. - #[pov_mode = Measured] - seal_random { - let r in 0 .. API_BENCHMARK_RUNS; + #[benchmark(pov_mode = Measured)] + fn seal_random(r: Linear<0, API_BENCHMARK_RUNS>) { let pages = code::max_pages::(); let subject_len = T::Schedule::get().limits.subject_len; assert!(subject_len < 1024); @@ -970,30 +1090,34 @@ benchmarks! { params: vec![ValueType::I32, ValueType::I32, ValueType::I32, ValueType::I32], return_type: None, }], - data_segments: vec![ - DataSegment { - offset: 0, - value: (pages * 64 * 1024 - subject_len - 4).to_le_bytes().to_vec(), - }, - ], - call_body: Some(body::repeated(r, &[ - Instruction::I32Const(4), // subject_ptr - Instruction::I32Const(subject_len as i32), // subject_len - Instruction::I32Const((subject_len + 4) as i32), // out_ptr - Instruction::I32Const(0), // out_len_ptr - Instruction::Call(0), - ])), - .. Default::default() + data_segments: vec![DataSegment { + offset: 0, + value: (pages * 64 * 1024 - subject_len - 4).to_le_bytes().to_vec(), + }], + call_body: Some(body::repeated( + r, + &[ + Instruction::I32Const(4), // subject_ptr + Instruction::I32Const(subject_len as i32), // subject_len + Instruction::I32Const((subject_len + 4) as i32), // out_ptr + Instruction::I32Const(0), // out_len_ptr + Instruction::Call(0), + ], + )), + ..Default::default() }); - let instance = Contract::::new(code, vec![])?; - let origin = RawOrigin::Signed(instance.caller.clone()); - }: call(origin, instance.addr, 0u32.into(), Weight::MAX, None, vec![]) + + call_builder!(func, code); + #[block] + { + func.call(); + } + } // Overhead of calling the function without any topic. // We benchmark for the worst case (largest event). - #[pov_mode = Measured] - seal_deposit_event { - let r in 0 .. API_BENCHMARK_RUNS; + #[benchmark(pov_mode = Measured)] + fn seal_deposit_event(r: Linear<0, API_BENCHMARK_RUNS>) { let code = WasmModule::::from(ModuleDefinition { memory: Some(ImportedMemory::max::()), imported_functions: vec![ImportedFunction { @@ -1002,26 +1126,34 @@ benchmarks! { params: vec![ValueType::I32, ValueType::I32, ValueType::I32, ValueType::I32], return_type: None, }], - call_body: Some(body::repeated(r, &[ - Instruction::I32Const(0), // topics_ptr - Instruction::I32Const(0), // topics_len - Instruction::I32Const(0), // data_ptr - Instruction::I32Const(0), // data_len - Instruction::Call(0), - ])), - .. Default::default() + call_body: Some(body::repeated( + r, + &[ + Instruction::I32Const(0), // topics_ptr + Instruction::I32Const(0), // topics_len + Instruction::I32Const(0), // data_ptr + Instruction::I32Const(0), // data_len + Instruction::Call(0), + ], + )), + ..Default::default() }); - let instance = Contract::::new(code, vec![])?; - let origin = RawOrigin::Signed(instance.caller.clone()); - }: call(origin, instance.addr, 0u32.into(), Weight::MAX, None, vec![]) + + call_builder!(func, code); + #[block] + { + func.call(); + } + } // Benchmark the overhead that topics generate. // `t`: Number of topics // `n`: Size of event payload in bytes - #[pov_mode = Measured] - seal_deposit_event_per_topic_and_byte { - let t in 0 .. T::Schedule::get().limits.event_topics; - let n in 0 .. T::Schedule::get().limits.payload_len; + #[benchmark(pov_mode = Measured)] + fn seal_deposit_event_per_topic_and_byte( + t: Linear<0, { T::Schedule::get().limits.event_topics }>, + n: Linear<0, { T::Schedule::get().limits.payload_len }>, + ) { let topics = (0..t).map(|i| T::Hashing::hash_of(&i)).collect::>().encode(); let topics_len = topics.len(); let code = WasmModule::::from(ModuleDefinition { @@ -1032,32 +1164,30 @@ benchmarks! { params: vec![ValueType::I32, ValueType::I32, ValueType::I32, ValueType::I32], return_type: None, }], - data_segments: vec![ - DataSegment { - offset: 0, - value: topics, - }, - ], + data_segments: vec![DataSegment { offset: 0, value: topics }], call_body: Some(body::plain(vec![ - Instruction::I32Const(0), // topics_ptr + Instruction::I32Const(0), // topics_ptr Instruction::I32Const(topics_len as i32), // topics_len - Instruction::I32Const(0), // data_ptr - Instruction::I32Const(n as i32), // data_len + Instruction::I32Const(0), // data_ptr + Instruction::I32Const(n as i32), // data_len Instruction::Call(0), Instruction::End, ])), - .. Default::default() + ..Default::default() }); - let instance = Contract::::new(code, vec![])?; - let origin = RawOrigin::Signed(instance.caller.clone()); - }: call(origin, instance.addr, 0u32.into(), Weight::MAX, None, vec![]) + + call_builder!(func, code); + #[block] + { + func.call(); + } + } // Benchmark debug_message call with zero input data. // Whereas this function is used in RPC mode only, it still should be secured // against an excessive use. - #[pov_mode = Measured] - seal_debug_message { - let r in 0 .. API_BENCHMARK_RUNS; + #[benchmark(pov_mode = Measured)] + fn seal_debug_message(r: Linear<0, API_BENCHMARK_RUNS>) -> Result<(), BenchmarkError> { let code = WasmModule::::from(ModuleDefinition { memory: Some(ImportedMemory { min_pages: 1, max_pages: 1 }), imported_functions: vec![ImportedFunction { @@ -1066,38 +1196,46 @@ benchmarks! { params: vec![ValueType::I32, ValueType::I32], return_type: Some(ValueType::I32), }], - call_body: Some(body::repeated(r, &[ - Instruction::I32Const(0), // value_ptr - Instruction::I32Const(0), // value_len - Instruction::Call(0), - Instruction::Drop, - ])), - .. Default::default() + call_body: Some(body::repeated( + r, + &[ + Instruction::I32Const(0), // value_ptr + Instruction::I32Const(0), // value_len + Instruction::Call(0), + Instruction::Drop, + ], + )), + ..Default::default() }); - let instance = Contract::::new(code, vec![])?; - }: { - >::bare_call( - instance.caller, - instance.account_id, - 0u32.into(), - Weight::MAX, - None, - vec![], - DebugInfo::UnsafeDebug, - CollectEvents::Skip, - Determinism::Enforced, - ) - .result?; + let mut setup = CallSetup::::new(code); + setup.enable_debug_message(); + call_builder!(func, setup: setup); + #[block] + { + func.call(); + } + Ok(()) } - seal_debug_message_per_byte { - // Vary size of input in bytes up to maximum allowed contract memory - // or maximum allowed debug buffer size, whichever is less. - let i in 0 .. (T::Schedule::get().limits.memory_pages * 64 * 1024).min(T::MaxDebugBufferLen::get()); + // Vary size of input in bytes up to maximum allowed contract memory + // or maximum allowed debug buffer size, whichever is less. + #[benchmark] + fn seal_debug_message_per_byte( + i: Linear< + 0, + { + (T::Schedule::get().limits.memory_pages * 64 * 1024) + .min(T::MaxDebugBufferLen::get()) + }, + >, + ) -> Result<(), BenchmarkError> { // We benchmark versus messages containing printable ASCII codes. // About 1Kb goes to the contract code instructions, // whereas all the space left we use for the initialization of the debug messages data. - let message = (0 .. T::MaxCodeLen::get() - 1024).zip((32..127).cycle()).map(|i| i.1).collect::>(); + let message = (0..T::MaxCodeLen::get() - 1024) + .zip((32..127).cycle()) + .map(|i| i.1) + .collect::>(); let code = WasmModule::::from(ModuleDefinition { memory: Some(ImportedMemory { min_pages: T::Schedule::get().limits.memory_pages, @@ -1108,15 +1246,10 @@ benchmarks! { name: "seal_debug_message", params: vec![ValueType::I32, ValueType::I32], return_type: Some(ValueType::I32), - }], - data_segments: vec![ - DataSegment { - offset: 0, - value: message, - }, - ], + }], + data_segments: vec![DataSegment { offset: 0, value: message }], call_body: Some(body::plain(vec![ - Instruction::I32Const(0), // value_ptr + Instruction::I32Const(0), // value_ptr Instruction::I32Const(i as i32), // value_len Instruction::Call(0), Instruction::Drop, @@ -1124,20 +1257,15 @@ benchmarks! { ])), ..Default::default() }); - let instance = Contract::::new(code, vec![])?; - }: { - >::bare_call( - instance.caller, - instance.account_id, - 0u32.into(), - Weight::MAX, - None, - vec![], - DebugInfo::UnsafeDebug, - CollectEvents::Skip, - Determinism::Enforced, - ) - .result?; + let mut setup = CallSetup::::new(code); + setup.enable_debug_message(); + call_builder!(func, setup: setup); + #[block] + { + func.call(); + } + assert_eq!(setup.debug_message().unwrap().len() as u32, i); + Ok(()) } // Only the overhead of calling the function itself with minimal arguments. @@ -1151,15 +1279,16 @@ benchmarks! { // // We need to use a smaller `r` because the keys are big and writing them all into the wasm // might exceed the code size. - #[skip_meta] - #[pov_mode = Measured] - seal_set_storage { - let r in 0 .. API_BENCHMARK_RUNS/2; + #[benchmark(skip_meta, pov_mode = Measured)] + fn seal_set_storage(r: Linear<0, { API_BENCHMARK_RUNS / 2 }>) -> Result<(), BenchmarkError> { let max_key_len = T::MaxStorageKeyLen::get(); - let keys = (0 .. r) - .map(|n| { let mut h = T::Hashing::hash_of(&n).as_ref().to_vec(); - h.resize(max_key_len.try_into().unwrap(), n.to_le_bytes()[0]); h }) - .collect::>(); + let keys = (0..r) + .map(|n| { + let mut h = T::Hashing::hash_of(&n).as_ref().to_vec(); + h.resize(max_key_len.try_into().unwrap(), n.to_le_bytes()[0]); + h + }) + .collect::>(); let keys_bytes = keys.iter().flatten().cloned().collect::>(); let code = WasmModule::::from(ModuleDefinition { memory: Some(ImportedMemory::max::()), @@ -1169,40 +1298,43 @@ benchmarks! { params: vec![ValueType::I32, ValueType::I32, ValueType::I32, ValueType::I32], return_type: Some(ValueType::I32), }], - data_segments: vec![ - DataSegment { - offset: 0, - value: keys_bytes, - }, - ], - call_body: Some(body::repeated_dyn(r, vec![ - Counter(0, max_key_len as u32), // key_ptr - Regular(Instruction::I32Const(max_key_len as i32)), // key_len - Regular(Instruction::I32Const(0)), // value_ptr - Regular(Instruction::I32Const(0)), // value_len - Regular(Instruction::Call(0)), - Regular(Instruction::Drop), - ])), - .. Default::default() + data_segments: vec![DataSegment { offset: 0, value: keys_bytes }], + call_body: Some(body::repeated_dyn( + r, + vec![ + Counter(0, max_key_len as u32), // key_ptr + Regular(Instruction::I32Const(max_key_len as i32)), // key_len + Regular(Instruction::I32Const(0)), // value_ptr + Regular(Instruction::I32Const(0)), // value_len + Regular(Instruction::Call(0)), + Regular(Instruction::Drop), + ], + )), + ..Default::default() }); - let instance = Contract::::new(code, vec![])?; + + call_builder!(func, instance, code); let info = instance.info()?; for key in keys { info.write( - &Key::::try_from_var(key).map_err(|e| "Key has wrong length")?, + &Key::::try_from_var(key).map_err(|_| "Key has wrong length")?, Some(vec![]), None, false, ) .map_err(|_| "Failed to write to storage during setup.")?; } - let origin = RawOrigin::Signed(instance.caller.clone()); - }: call(origin, instance.addr, 0u32.into(), Weight::MAX, None, vec![]) + #[block] + { + func.call(); + } + Ok(()) + } - #[skip_meta] - #[pov_mode = Measured] - seal_set_storage_per_new_byte { - let n in 0 .. T::Schedule::get().limits.payload_len; + #[benchmark(skip_meta, pov_mode = Measured)] + fn seal_set_storage_per_new_byte( + n: Linear<0, { T::Schedule::get().limits.payload_len }>, + ) -> Result<(), BenchmarkError> { let max_key_len = T::MaxStorageKeyLen::get(); let key = vec![0u8; max_key_len as usize]; let code = WasmModule::::from(ModuleDefinition { @@ -1213,39 +1345,38 @@ benchmarks! { params: vec![ValueType::I32, ValueType::I32, ValueType::I32, ValueType::I32], return_type: Some(ValueType::I32), }], - data_segments: vec![ - DataSegment { - offset: 0, - value: key.clone(), - }, - ], + data_segments: vec![DataSegment { offset: 0, value: key.clone() }], call_body: Some(body::plain(vec![ - Instruction::I32Const(0), // key_ptr + Instruction::I32Const(0), // key_ptr Instruction::I32Const(max_key_len as i32), // key_len - Instruction::I32Const(0), // value_ptr - Instruction::I32Const(n as i32), // value_len + Instruction::I32Const(0), // value_ptr + Instruction::I32Const(n as i32), // value_len Instruction::Call(0), Instruction::Drop, Instruction::End, ])), - .. Default::default() + ..Default::default() }); - let instance = Contract::::new(code, vec![])?; + call_builder!(func, instance, code); let info = instance.info()?; info.write( - &Key::::try_from_var(key).map_err(|e| "Key has wrong length")?, + &Key::::try_from_var(key).map_err(|_| "Key has wrong length")?, Some(vec![]), None, false, ) .map_err(|_| "Failed to write to storage during setup.")?; - let origin = RawOrigin::Signed(instance.caller.clone()); - }: call(origin, instance.addr, 0u32.into(), Weight::MAX, None, vec![]) + #[block] + { + func.call(); + } + Ok(()) + } - #[skip_meta] - #[pov_mode = Measured] - seal_set_storage_per_old_byte { - let n in 0 .. T::Schedule::get().limits.payload_len; + #[benchmark(skip_meta, pov_mode = Measured)] + fn seal_set_storage_per_old_byte( + n: Linear<0, { T::Schedule::get().limits.payload_len }>, + ) -> Result<(), BenchmarkError> { let max_key_len = T::MaxStorageKeyLen::get(); let key = vec![0u8; max_key_len as usize]; let code = WasmModule::::from(ModuleDefinition { @@ -1256,48 +1387,49 @@ benchmarks! { params: vec![ValueType::I32, ValueType::I32, ValueType::I32, ValueType::I32], return_type: Some(ValueType::I32), }], - data_segments: vec![ - DataSegment { - offset: 0, - value: key.clone(), - }, - ], + data_segments: vec![DataSegment { offset: 0, value: key.clone() }], call_body: Some(body::plain(vec![ - Instruction::I32Const(0), // key_ptr + Instruction::I32Const(0), // key_ptr Instruction::I32Const(max_key_len as i32), // key_len - Instruction::I32Const(0), // value_ptr - Instruction::I32Const(0), // value_len is 0 as testing vs pre-existing value len + Instruction::I32Const(0), // value_ptr + Instruction::I32Const(0), /* value_len is 0 as testing vs + * pre-existing value len */ Instruction::Call(0), Instruction::Drop, Instruction::End, ])), - .. Default::default() + ..Default::default() }); - let instance = Contract::::new(code, vec![])?; + call_builder!(func, instance, code); let info = instance.info()?; info.write( - &Key::::try_from_var(key).map_err(|e| "Key has wrong length")?, + &Key::::try_from_var(key).map_err(|_| "Key has wrong length")?, Some(vec![42u8; n as usize]), None, false, ) .map_err(|_| "Failed to write to storage during setup.")?; - let origin = RawOrigin::Signed(instance.caller.clone()); - }: call(origin, instance.addr, 0u32.into(), Weight::MAX, None, vec![]) + #[block] + { + func.call(); + } + Ok(()) + } // Similar to seal_set_storage. We store all the keys that we are about to // delete beforehand in order to prevent any optimizations that could occur when // deleting a non existing key. We generate keys of a maximum length, and have to // the amount of runs in order to make resulting contract code size less than MaxCodeLen. - #[skip_meta] - #[pov_mode = Measured] - seal_clear_storage { - let r in 0 .. API_BENCHMARK_RUNS/2; + #[benchmark(skip_meta, pov_mode = Measured)] + fn seal_clear_storage(r: Linear<0, { API_BENCHMARK_RUNS / 2 }>) -> Result<(), BenchmarkError> { let max_key_len = T::MaxStorageKeyLen::get(); - let keys = (0 .. r) - .map(|n| { let mut h = T::Hashing::hash_of(&n).as_ref().to_vec(); - h.resize(max_key_len.try_into().unwrap(), n.to_le_bytes()[0]); h }) - .collect::>(); + let keys = (0..r) + .map(|n| { + let mut h = T::Hashing::hash_of(&n).as_ref().to_vec(); + h.resize(max_key_len.try_into().unwrap(), n.to_le_bytes()[0]); + h + }) + .collect::>(); let key_bytes = keys.iter().flatten().cloned().collect::>(); let code = WasmModule::::from(ModuleDefinition { memory: Some(ImportedMemory::max::()), @@ -1307,25 +1439,23 @@ benchmarks! { params: vec![ValueType::I32, ValueType::I32], return_type: Some(ValueType::I32), }], - data_segments: vec![ - DataSegment { - offset: 0, - value: key_bytes, - }, - ], - call_body: Some(body::repeated_dyn(r, vec![ - Counter(0, max_key_len as u32), // key_ptr - Regular(Instruction::I32Const(max_key_len as i32)), // key_len - Regular(Instruction::Call(0)), - Regular(Instruction::Drop), - ])), - .. Default::default() + data_segments: vec![DataSegment { offset: 0, value: key_bytes }], + call_body: Some(body::repeated_dyn( + r, + vec![ + Counter(0, max_key_len as u32), // key_ptr + Regular(Instruction::I32Const(max_key_len as i32)), // key_len + Regular(Instruction::Call(0)), + Regular(Instruction::Drop), + ], + )), + ..Default::default() }); - let instance = Contract::::new(code, vec![])?; + call_builder!(func, instance, code); let info = instance.info()?; for key in keys { info.write( - &Key::::try_from_var(key).map_err(|e| "Key has wrong length")?, + &Key::::try_from_var(key).map_err(|_| "Key has wrong length")?, Some(vec![]), None, false, @@ -1333,13 +1463,17 @@ benchmarks! { .map_err(|_| "Failed to write to storage during setup.")?; } >::insert(&instance.account_id, info); - let origin = RawOrigin::Signed(instance.caller.clone()); - }: call(origin, instance.addr, 0u32.into(), Weight::MAX, None, vec![]) + #[block] + { + func.call(); + } + Ok(()) + } - #[skip_meta] - #[pov_mode = Measured] - seal_clear_storage_per_byte { - let n in 0 .. T::Schedule::get().limits.payload_len; + #[benchmark(skip_meta, pov_mode = Measured)] + fn seal_clear_storage_per_byte( + n: Linear<0, { T::Schedule::get().limits.payload_len }>, + ) -> Result<(), BenchmarkError> { let max_key_len = T::MaxStorageKeyLen::get(); let key = vec![0u8; max_key_len as usize]; let code = WasmModule::::from(ModuleDefinition { @@ -1350,43 +1484,44 @@ benchmarks! { params: vec![ValueType::I32, ValueType::I32], return_type: Some(ValueType::I32), }], - data_segments: vec![ - DataSegment { - offset: 0, - value: key.clone(), - }, - ], + data_segments: vec![DataSegment { offset: 0, value: key.clone() }], call_body: Some(body::plain(vec![ - Instruction::I32Const(0), // key_ptr + Instruction::I32Const(0), // key_ptr Instruction::I32Const(max_key_len as i32), // key_len Instruction::Call(0), Instruction::Drop, Instruction::End, ])), - .. Default::default() + ..Default::default() }); - let instance = Contract::::new(code, vec![])?; + call_builder!(func, instance, code); let info = instance.info()?; info.write( - &Key::::try_from_var(key).map_err(|e| "Key has wrong length")?, + &Key::::try_from_var(key).map_err(|_| "Key has wrong length")?, Some(vec![42u8; n as usize]), None, false, ) .map_err(|_| "Failed to write to storage during setup.")?; - let origin = RawOrigin::Signed(instance.caller.clone()); - }: call(origin, instance.addr, 0u32.into(), Weight::MAX, None, vec![]) + + #[block] + { + func.call(); + } + Ok(()) + } // We make sure that all storage accesses are to unique keys. - #[skip_meta] - #[pov_mode = Measured] - seal_get_storage { - let r in 0 .. API_BENCHMARK_RUNS/2; + #[benchmark(skip_meta, pov_mode = Measured)] + fn seal_get_storage(r: Linear<0, { API_BENCHMARK_RUNS / 2 }>) -> Result<(), BenchmarkError> { let max_key_len = T::MaxStorageKeyLen::get(); - let keys = (0 .. r) - .map(|n| { let mut h = T::Hashing::hash_of(&n).as_ref().to_vec(); - h.resize(max_key_len.try_into().unwrap(), n.to_le_bytes()[0]); h }) - .collect::>(); + let keys = (0..r) + .map(|n| { + let mut h = T::Hashing::hash_of(&n).as_ref().to_vec(); + h.resize(max_key_len.try_into().unwrap(), n.to_le_bytes()[0]); + h + }) + .collect::>(); let key_bytes = keys.iter().flatten().cloned().collect::>(); let key_bytes_len = key_bytes.len(); let code = WasmModule::::from(ModuleDefinition { @@ -1398,30 +1533,30 @@ benchmarks! { return_type: Some(ValueType::I32), }], data_segments: vec![ - DataSegment { - offset: 0, - value: key_bytes, - }, + DataSegment { offset: 0, value: key_bytes }, DataSegment { offset: key_bytes_len as u32, value: T::Schedule::get().limits.payload_len.to_le_bytes().into(), }, ], - call_body: Some(body::repeated_dyn(r, vec![ - Counter(0, max_key_len), // key_ptr - Regular(Instruction::I32Const(max_key_len as i32)), // key_len - Regular(Instruction::I32Const((key_bytes_len + 4) as i32)), // out_ptr - Regular(Instruction::I32Const(key_bytes_len as i32)), // out_len_ptr - Regular(Instruction::Call(0)), - Regular(Instruction::Drop), - ])), - .. Default::default() + call_body: Some(body::repeated_dyn( + r, + vec![ + Counter(0, max_key_len), // key_ptr + Regular(Instruction::I32Const(max_key_len as i32)), // key_len + Regular(Instruction::I32Const((key_bytes_len + 4) as i32)), // out_ptr + Regular(Instruction::I32Const(key_bytes_len as i32)), // out_len_ptr + Regular(Instruction::Call(0)), + Regular(Instruction::Drop), + ], + )), + ..Default::default() }); - let instance = Contract::::new(code, vec![])?; + call_builder!(func, instance, code); let info = instance.info()?; for key in keys { info.write( - &Key::::try_from_var(key).map_err(|e| "Key has wrong length")?, + &Key::::try_from_var(key).map_err(|_| "Key has wrong length")?, Some(vec![]), None, false, @@ -1429,13 +1564,17 @@ benchmarks! { .map_err(|_| "Failed to write to storage during setup.")?; } >::insert(&instance.account_id, info); - let origin = RawOrigin::Signed(instance.caller.clone()); - }: call(origin, instance.addr, 0u32.into(), Weight::MAX, None, vec![]) + #[block] + { + func.call(); + } + Ok(()) + } - #[skip_meta] - #[pov_mode = Measured] - seal_get_storage_per_byte { - let n in 0 .. T::Schedule::get().limits.payload_len; + #[benchmark(skip_meta, pov_mode = Measured)] + fn seal_get_storage_per_byte( + n: Linear<0, { T::Schedule::get().limits.payload_len }>, + ) -> Result<(), BenchmarkError> { let max_key_len = T::MaxStorageKeyLen::get(); let key = vec![0u8; max_key_len as usize]; let code = WasmModule::::from(ModuleDefinition { @@ -1447,51 +1586,55 @@ benchmarks! { return_type: Some(ValueType::I32), }], data_segments: vec![ - DataSegment { - offset: 0, - value: key.clone(), - }, + DataSegment { offset: 0, value: key.clone() }, DataSegment { offset: max_key_len, value: T::Schedule::get().limits.payload_len.to_le_bytes().into(), }, ], call_body: Some(body::plain(vec![ - Instruction::I32Const(0), // key_ptr - Instruction::I32Const(max_key_len as i32), // key_len + Instruction::I32Const(0), // key_ptr + Instruction::I32Const(max_key_len as i32), // key_len Instruction::I32Const((max_key_len + 4) as i32), // out_ptr - Instruction::I32Const(max_key_len as i32), // out_len_ptr + Instruction::I32Const(max_key_len as i32), // out_len_ptr Instruction::Call(0), Instruction::Drop, Instruction::End, ])), - .. Default::default() + ..Default::default() }); - let instance = Contract::::new(code, vec![])?; + call_builder!(func, instance, code); let info = instance.info()?; info.write( - &Key::::try_from_var(key).map_err(|e| "Key has wrong length")?, + &Key::::try_from_var(key).map_err(|_| "Key has wrong length")?, Some(vec![42u8; n as usize]), None, false, ) .map_err(|_| "Failed to write to storage during setup.")?; >::insert(&instance.account_id, info); - let origin = RawOrigin::Signed(instance.caller.clone()); - }: call(origin, instance.addr, 0u32.into(), Weight::MAX, None, vec![]) + #[block] + { + func.call(); + } + + Ok(()) + } // We make sure that all storage accesses are to unique keys. - #[skip_meta] - #[pov_mode = Measured] - seal_contains_storage { - let r in 0 .. API_BENCHMARK_RUNS/2; + #[benchmark(skip_meta, pov_mode = Measured)] + fn seal_contains_storage( + r: Linear<0, { API_BENCHMARK_RUNS / 2 }>, + ) -> Result<(), BenchmarkError> { let max_key_len = T::MaxStorageKeyLen::get(); - let keys = (0 .. r) - .map(|n| { let mut h = T::Hashing::hash_of(&n).as_ref().to_vec(); - h.resize(max_key_len.try_into().unwrap(), n.to_le_bytes()[0]); h }) - .collect::>(); + let keys = (0..r) + .map(|n| { + let mut h = T::Hashing::hash_of(&n).as_ref().to_vec(); + h.resize(max_key_len.try_into().unwrap(), n.to_le_bytes()[0]); + h + }) + .collect::>(); let key_bytes = keys.iter().flatten().cloned().collect::>(); - let key_bytes_len = key_bytes.len(); let code = WasmModule::::from(ModuleDefinition { memory: Some(ImportedMemory::max::()), imported_functions: vec![ImportedFunction { @@ -1500,25 +1643,23 @@ benchmarks! { params: vec![ValueType::I32, ValueType::I32], return_type: Some(ValueType::I32), }], - data_segments: vec![ - DataSegment { - offset: 0, - value: key_bytes, - }, - ], - call_body: Some(body::repeated_dyn(r, vec![ - Counter(0, max_key_len as u32), // key_ptr - Regular(Instruction::I32Const(max_key_len as i32)), // key_len - Regular(Instruction::Call(0)), - Regular(Instruction::Drop), - ])), - .. Default::default() + data_segments: vec![DataSegment { offset: 0, value: key_bytes }], + call_body: Some(body::repeated_dyn( + r, + vec![ + Counter(0, max_key_len as u32), // key_ptr + Regular(Instruction::I32Const(max_key_len as i32)), // key_len + Regular(Instruction::Call(0)), + Regular(Instruction::Drop), + ], + )), + ..Default::default() }); - let instance = Contract::::new(code, vec![])?; + call_builder!(func, instance, code); let info = instance.info()?; for key in keys { info.write( - &Key::::try_from_var(key).map_err(|e| "Key has wrong length")?, + &Key::::try_from_var(key).map_err(|_| "Key has wrong length")?, Some(vec![]), None, false, @@ -1526,13 +1667,17 @@ benchmarks! { .map_err(|_| "Failed to write to storage during setup.")?; } >::insert(&instance.account_id, info); - let origin = RawOrigin::Signed(instance.caller.clone()); - }: call(origin, instance.addr, 0u32.into(), Weight::MAX, None, vec![]) + #[block] + { + func.call(); + } + Ok(()) + } - #[skip_meta] - #[pov_mode = Measured] - seal_contains_storage_per_byte { - let n in 0 .. T::Schedule::get().limits.payload_len; + #[benchmark(skip_meta, pov_mode = Measured)] + fn seal_contains_storage_per_byte( + n: Linear<0, { T::Schedule::get().limits.payload_len }>, + ) -> Result<(), BenchmarkError> { let max_key_len = T::MaxStorageKeyLen::get(); let key = vec![0u8; max_key_len as usize]; let code = WasmModule::::from(ModuleDefinition { @@ -1543,43 +1688,43 @@ benchmarks! { params: vec![ValueType::I32, ValueType::I32], return_type: Some(ValueType::I32), }], - data_segments: vec![ - DataSegment { - offset: 0, - value: key.clone(), - }, - ], + data_segments: vec![DataSegment { offset: 0, value: key.clone() }], call_body: Some(body::plain(vec![ - Instruction::I32Const(0), // key_ptr + Instruction::I32Const(0), // key_ptr Instruction::I32Const(max_key_len as i32), // key_len Instruction::Call(0), Instruction::Drop, Instruction::End, ])), - .. Default::default() + ..Default::default() }); - let instance = Contract::::new(code, vec![])?; + call_builder!(func, instance, code); let info = instance.info()?; info.write( - &Key::::try_from_var(key).map_err(|e| "Key has wrong length")?, + &Key::::try_from_var(key).map_err(|_| "Key has wrong length")?, Some(vec![42u8; n as usize]), None, false, ) .map_err(|_| "Failed to write to storage during setup.")?; >::insert(&instance.account_id, info); - let origin = RawOrigin::Signed(instance.caller.clone()); - }: call(origin, instance.addr, 0u32.into(), Weight::MAX, None, vec![]) + #[block] + { + func.call(); + } + Ok(()) + } - #[skip_meta] - #[pov_mode = Measured] - seal_take_storage { - let r in 0 .. API_BENCHMARK_RUNS/2; + #[benchmark(skip_meta, pov_mode = Measured)] + fn seal_take_storage(r: Linear<0, { API_BENCHMARK_RUNS / 2 }>) -> Result<(), BenchmarkError> { let max_key_len = T::MaxStorageKeyLen::get(); - let keys = (0 .. r) - .map(|n| { let mut h = T::Hashing::hash_of(&n).as_ref().to_vec(); - h.resize(max_key_len.try_into().unwrap(), n.to_le_bytes()[0]); h }) - .collect::>(); + let keys = (0..r) + .map(|n| { + let mut h = T::Hashing::hash_of(&n).as_ref().to_vec(); + h.resize(max_key_len.try_into().unwrap(), n.to_le_bytes()[0]); + h + }) + .collect::>(); let key_bytes = keys.iter().flatten().cloned().collect::>(); let key_bytes_len = key_bytes.len(); let code = WasmModule::::from(ModuleDefinition { @@ -1591,30 +1736,30 @@ benchmarks! { return_type: Some(ValueType::I32), }], data_segments: vec![ - DataSegment { - offset: 0, - value: key_bytes, - }, + DataSegment { offset: 0, value: key_bytes }, DataSegment { offset: key_bytes_len as u32, value: T::Schedule::get().limits.payload_len.to_le_bytes().into(), }, ], - call_body: Some(body::repeated_dyn(r, vec![ - Counter(0, max_key_len as u32), // key_ptr - Regular(Instruction::I32Const(max_key_len as i32)), // key_len - Regular(Instruction::I32Const((key_bytes_len + 4) as i32)), // out_ptr - Regular(Instruction::I32Const(key_bytes_len as i32)), // out_len_ptr - Regular(Instruction::Call(0)), - Regular(Instruction::Drop), - ])), - .. Default::default() + call_body: Some(body::repeated_dyn( + r, + vec![ + Counter(0, max_key_len as u32), // key_ptr + Regular(Instruction::I32Const(max_key_len as i32)), // key_len + Regular(Instruction::I32Const((key_bytes_len + 4) as i32)), // out_ptr + Regular(Instruction::I32Const(key_bytes_len as i32)), // out_len_ptr + Regular(Instruction::Call(0)), + Regular(Instruction::Drop), + ], + )), + ..Default::default() }); - let instance = Contract::::new(code, vec![])?; + call_builder!(func, instance, code); let info = instance.info()?; for key in keys { info.write( - &Key::::try_from_var(key).map_err(|e| "Key has wrong length")?, + &Key::::try_from_var(key).map_err(|_| "Key has wrong length")?, Some(vec![]), None, false, @@ -1622,13 +1767,17 @@ benchmarks! { .map_err(|_| "Failed to write to storage during setup.")?; } >::insert(&instance.account_id, info); - let origin = RawOrigin::Signed(instance.caller.clone()); - }: call(origin, instance.addr, 0u32.into(), Weight::MAX, None, vec![]) + #[block] + { + func.call(); + } + Ok(()) + } - #[skip_meta] - #[pov_mode = Measured] - seal_take_storage_per_byte { - let n in 0 .. T::Schedule::get().limits.payload_len; + #[benchmark(skip_meta, pov_mode = Measured)] + fn seal_take_storage_per_byte( + n: Linear<0, { T::Schedule::get().limits.payload_len }>, + ) -> Result<(), BenchmarkError> { let max_key_len = T::MaxStorageKeyLen::get(); let key = vec![0u8; max_key_len as usize]; let code = WasmModule::::from(ModuleDefinition { @@ -1640,46 +1789,45 @@ benchmarks! { return_type: Some(ValueType::I32), }], data_segments: vec![ - DataSegment { - offset: 0, - value: key.clone(), - }, + DataSegment { offset: 0, value: key.clone() }, DataSegment { offset: max_key_len, value: T::Schedule::get().limits.payload_len.to_le_bytes().into(), }, ], call_body: Some(body::plain(vec![ - Instruction::I32Const(0), // key_ptr - Instruction::I32Const(max_key_len as i32), // key_len + Instruction::I32Const(0), // key_ptr + Instruction::I32Const(max_key_len as i32), // key_len Instruction::I32Const((max_key_len + 4) as i32), // out_ptr - Instruction::I32Const(max_key_len as i32), // out_len_ptr + Instruction::I32Const(max_key_len as i32), // out_len_ptr Instruction::Call(0), Instruction::Drop, Instruction::End, ])), - .. Default::default() + ..Default::default() }); - let instance = Contract::::new(code, vec![])?; + call_builder!(func, instance, code); let info = instance.info()?; info.write( - &Key::::try_from_var(key).map_err(|e| "Key has wrong length")?, + &Key::::try_from_var(key).map_err(|_| "Key has wrong length")?, Some(vec![42u8; n as usize]), None, false, ) .map_err(|_| "Failed to write to storage during setup.")?; >::insert(&instance.account_id, info); - let origin = RawOrigin::Signed(instance.caller.clone()); - }: call(origin, instance.addr, 0u32.into(), Weight::MAX, None, vec![]) + #[block] + { + func.call(); + } + Ok(()) + } // We transfer to unique accounts. - #[pov_mode = Measured] - seal_transfer { - let r in 0 .. API_BENCHMARK_RUNS; - let accounts = (0..r) - .map(|i| account::("receiver", i, 0)) - .collect::>(); + #[benchmark(pov_mode = Measured)] + fn seal_transfer(r: Linear<0, API_BENCHMARK_RUNS>) -> Result<(), BenchmarkError> { + let accounts = + (0..r).map(|i| account::("receiver", i, 0)).collect::>(); let account_len = accounts.get(0).map(|i| i.encode().len()).unwrap_or(0); let account_bytes = accounts.iter().flat_map(|x| x.encode()).collect(); let value = Pallet::::min_balance(); @@ -1695,44 +1843,46 @@ benchmarks! { return_type: Some(ValueType::I32), }], data_segments: vec![ - DataSegment { - offset: 0, - value: value_bytes, - }, - DataSegment { - offset: value_len as u32, - value: account_bytes, - }, + DataSegment { offset: 0, value: value_bytes }, + DataSegment { offset: value_len as u32, value: account_bytes }, ], - call_body: Some(body::repeated_dyn(r, vec![ - Counter(value_len as u32, account_len as u32), // account_ptr - Regular(Instruction::I32Const(account_len as i32)), // account_len - Regular(Instruction::I32Const(0)), // value_ptr - Regular(Instruction::I32Const(value_len as i32)), // value_len - Regular(Instruction::Call(0)), - Regular(Instruction::Drop), - ])), - .. Default::default() + call_body: Some(body::repeated_dyn( + r, + vec![ + Counter(value_len as u32, account_len as u32), // account_ptr + Regular(Instruction::I32Const(account_len as i32)), // account_len + Regular(Instruction::I32Const(0)), // value_ptr + Regular(Instruction::I32Const(value_len as i32)), // value_len + Regular(Instruction::Call(0)), + Regular(Instruction::Drop), + ], + )), + ..Default::default() }); - let instance = Contract::::new(code, vec![])?; - instance.set_balance(value * (r + 1).into()); - let origin = RawOrigin::Signed(instance.caller.clone()); + let mut setup = CallSetup::::new(code); + setup.set_balance(value * (r + 1).into()); + call_builder!(func, setup: setup); + for account in &accounts { assert_eq!(T::Currency::total_balance(account), 0u32.into()); } - }: call(origin, instance.addr, 0u32.into(), Weight::MAX, None, vec![]) - verify { + + #[block] + { + func.call(); + } + for account in &accounts { assert_eq!(T::Currency::total_balance(account), value); } + Ok(()) } // We call unique accounts. // - // This is a slow call: We redeuce the number of runs. - #[pov_mode = Measured] - seal_call { - let r in 0 .. API_BENCHMARK_RUNS / 2; + // This is a slow call: We reduce the number of runs. + #[benchmark(pov_mode = Measured)] + fn seal_call(r: Linear<0, { API_BENCHMARK_RUNS / 2 }>) -> Result<(), BenchmarkError> { let dummy_code = WasmModule::::dummy_with_bytes(0); let callees = (0..r) .map(|i| Contract::with_index(i + 1, dummy_code.clone(), vec![])) @@ -1745,7 +1895,7 @@ benchmarks! { // Set an own limit every 2nd call let own_limit = (u32::MAX - 100).into(); let deposits = (0..r) - .map(|i| if i % 2 == 0 { 0u32.into() } else { own_limit } ) + .map(|i| if i % 2 == 0 { 0u32.into() } else { own_limit }) .collect::>>(); let deposits_bytes: Vec = deposits.iter().flat_map(|i| i.encode()).collect(); let deposits_len = deposits_bytes.len() as u32; @@ -1771,43 +1921,42 @@ benchmarks! { return_type: Some(ValueType::I32), }], data_segments: vec![ - DataSegment { - offset: 0, - value: value_bytes, - }, - DataSegment { - offset: value_len, - value: deposits_bytes, - }, - DataSegment { - offset: callee_offset, - value: callee_bytes, - }, + DataSegment { offset: 0, value: value_bytes }, + DataSegment { offset: value_len, value: deposits_bytes }, + DataSegment { offset: callee_offset, value: callee_bytes }, ], - call_body: Some(body::repeated_dyn(r, vec![ - Regular(Instruction::I32Const(0)), // flags - Counter(callee_offset, callee_len as u32), // callee_ptr - Regular(Instruction::I64Const(0)), // ref_time weight - Regular(Instruction::I64Const(0)), // proof_size weight - Counter(value_len, deposit_len as u32), // deposit_limit_ptr - Regular(Instruction::I32Const(0)), // value_ptr - Regular(Instruction::I32Const(0)), // input_data_ptr - Regular(Instruction::I32Const(0)), // input_data_len - Regular(Instruction::I32Const(SENTINEL as i32)), // output_ptr - Regular(Instruction::I32Const(0)), // output_len_ptr - Regular(Instruction::Call(0)), - Regular(Instruction::Drop), - ])), - .. Default::default() + call_body: Some(body::repeated_dyn( + r, + vec![ + Regular(Instruction::I32Const(0)), // flags + Counter(callee_offset, callee_len as u32), // callee_ptr + Regular(Instruction::I64Const(0)), // ref_time weight + Regular(Instruction::I64Const(0)), // proof_size weight + Counter(value_len, deposit_len as u32), // deposit_limit_ptr + Regular(Instruction::I32Const(0)), // value_ptr + Regular(Instruction::I32Const(0)), // input_data_ptr + Regular(Instruction::I32Const(0)), // input_data_len + Regular(Instruction::I32Const(SENTINEL as i32)), // output_ptr + Regular(Instruction::I32Const(0)), // output_len_ptr + Regular(Instruction::Call(0)), + Regular(Instruction::Drop), + ], + )), + ..Default::default() }); - let instance = Contract::::new(code, vec![])?; - let origin = RawOrigin::Signed(instance.caller.clone()); - }: call(origin, instance.addr, 0u32.into(), Weight::MAX, Some(BalanceOf::::from(u32::MAX.into()).into()), vec![]) + let mut setup = CallSetup::::new(code); + setup.set_storage_deposit_limit(BalanceOf::::from(u32::MAX.into())); + call_builder!(func, setup: setup); + #[block] + { + func.call(); + } + Ok(()) + } - // This is a slow call: We redeuce the number of runs. - #[pov_mode = Measured] - seal_delegate_call { - let r in 0 .. API_BENCHMARK_RUNS / 2; + // This is a slow call: We reduce the number of runs. + #[benchmark(pov_mode = Measured)] + fn seal_delegate_call(r: Linear<0, { API_BENCHMARK_RUNS / 2 }>) -> Result<(), BenchmarkError> { let hashes = (0..r) .map(|i| { let code = WasmModule::::dummy_with_bytes(i); @@ -1819,7 +1968,6 @@ benchmarks! { .collect::, &'static str>>()?; let hash_len = hashes.get(0).map(|x| x.encode().len()).unwrap_or(0); let hashes_bytes = hashes.iter().flat_map(|x| x.encode()).collect::>(); - let hashes_len = hashes_bytes.len(); let hashes_offset = 0; let code = WasmModule::::from(ModuleDefinition { @@ -1837,33 +1985,35 @@ benchmarks! { ], return_type: Some(ValueType::I32), }], - data_segments: vec![ - DataSegment { - offset: hashes_offset as u32, - value: hashes_bytes, - }, - ], - call_body: Some(body::repeated_dyn(r, vec![ - Regular(Instruction::I32Const(0)), // flags - Counter(hashes_offset as u32, hash_len as u32), // code_hash_ptr - Regular(Instruction::I32Const(0)), // input_data_ptr - Regular(Instruction::I32Const(0)), // input_data_len - Regular(Instruction::I32Const(u32::max_value() as i32)), // output_ptr - Regular(Instruction::I32Const(0)), // output_len_ptr - Regular(Instruction::Call(0)), - Regular(Instruction::Drop), - ])), - .. Default::default() + data_segments: vec![DataSegment { offset: hashes_offset as u32, value: hashes_bytes }], + call_body: Some(body::repeated_dyn( + r, + vec![ + Regular(Instruction::I32Const(0)), // flags + Counter(hashes_offset as u32, hash_len as u32), // code_hash_ptr + Regular(Instruction::I32Const(0)), // input_data_ptr + Regular(Instruction::I32Const(0)), // input_data_len + Regular(Instruction::I32Const(u32::max_value() as i32)), // output_ptr + Regular(Instruction::I32Const(0)), // output_len_ptr + Regular(Instruction::Call(0)), + Regular(Instruction::Drop), + ], + )), + ..Default::default() }); - let instance = Contract::::new(code, vec![])?; - let callee = instance.addr.clone(); - let origin = RawOrigin::Signed(instance.caller); - }: call(origin, callee, 0u32.into(), Weight::MAX, None, vec![]) + call_builder!(func, code); + #[block] + { + func.call(); + } + Ok(()) + } - #[pov_mode = Measured] - seal_call_per_transfer_clone_byte { - let t in 0 .. 1; - let c in 0 .. code::max_pages::() * 64 * 1024; + #[benchmark(pov_mode = Measured)] + fn seal_call_per_transfer_clone_byte( + t: Linear<0, { 1 }>, + c: Linear<0, { code::max_pages::() * 64 * 1024 }>, + ) -> Result<(), BenchmarkError> { let callee = Contract::with_index(5, >::dummy(), vec![])?; let value: BalanceOf = t.into(); let value_bytes = value.encode(); @@ -1886,40 +2036,38 @@ benchmarks! { return_type: Some(ValueType::I32), }], data_segments: vec![ - DataSegment { - offset: 0, - value: value_bytes, - }, - DataSegment { - offset: value_len as u32, - value: callee.account_id.encode(), - }, + DataSegment { offset: 0, value: value_bytes }, + DataSegment { offset: value_len as u32, value: callee.account_id.encode() }, ], call_body: Some(body::plain(vec![ Instruction::I32Const(CallFlags::CLONE_INPUT.bits() as i32), // flags - Instruction::I32Const(value_len as i32), // callee_ptr - Instruction::I64Const(0), // gas - Instruction::I32Const(0), // value_ptr - Instruction::I32Const(0), // input_data_ptr - Instruction::I32Const(0), // input_data_len - Instruction::I32Const(SENTINEL as i32), // output_ptr - Instruction::I32Const(0), // output_len_ptr + Instruction::I32Const(value_len as i32), // callee_ptr + Instruction::I64Const(0), // gas + Instruction::I32Const(0), // value_ptr + Instruction::I32Const(0), // input_data_ptr + Instruction::I32Const(0), // input_data_len + Instruction::I32Const(SENTINEL as i32), // output_ptr + Instruction::I32Const(0), // output_len_ptr Instruction::Call(0), Instruction::Drop, Instruction::End, ])), - .. Default::default() + ..Default::default() }); - let instance = Contract::::new(code, vec![])?; - let origin = RawOrigin::Signed(instance.caller.clone()); - let bytes = vec![42; c as usize]; - }: call(origin, instance.addr, 0u32.into(), Weight::MAX, None, bytes) + let mut setup = CallSetup::::new(code); + setup.set_data(vec![42; c as usize]); + call_builder!(func, setup: setup); + #[block] + { + func.call(); + } + Ok(()) + } // We assume that every instantiate sends at least the minimum balance. // This is a slow call: we reduce the number of runs. - #[pov_mode = Measured] - seal_instantiate { - let r in 1 .. API_BENCHMARK_RUNS / 2; + #[benchmark(pov_mode = Measured)] + fn seal_instantiate(r: Linear<1, { API_BENCHMARK_RUNS / 2 }>) -> Result<(), BenchmarkError> { let hashes = (0..r) .map(|i| { let code = WasmModule::::from(ModuleDefinition { @@ -1931,7 +2079,7 @@ benchmarks! { Instruction::Drop, Instruction::End, ])), - .. Default::default() + ..Default::default() }); let caller = whitelisted_caller(); T::Currency::set_balance(&caller, caller_funding::()); @@ -1974,47 +2122,42 @@ benchmarks! { return_type: Some(ValueType::I32), }], data_segments: vec![ - DataSegment { - offset: 0, - value: value_bytes, - }, - DataSegment { - offset: hashes_offset as u32, - value: hashes_bytes, - }, + DataSegment { offset: 0, value: value_bytes }, + DataSegment { offset: hashes_offset as u32, value: hashes_bytes }, DataSegment { offset: addr_len_offset as u32, value: addr_len.to_le_bytes().into(), }, ], - call_body: Some(body::repeated_dyn(r, vec![ - Counter(hashes_offset as u32, hash_len as u32), // code_hash_ptr - Regular(Instruction::I64Const(0)), // ref_time weight - Regular(Instruction::I64Const(0)), // proof_size weight - Regular(Instruction::I32Const(SENTINEL as i32)), // deposit limit ptr: use parent's limit - Regular(Instruction::I32Const(0)), // value_ptr - Regular(Instruction::I32Const(0)), // input_data_ptr - Regular(Instruction::I32Const(0)), // input_data_len - Regular(Instruction::I32Const(addr_offset as i32)), // address_ptr - Regular(Instruction::I32Const(addr_len_offset as i32)), // address_len_ptr - Regular(Instruction::I32Const(SENTINEL as i32)), // output_ptr - Regular(Instruction::I32Const(0)), // output_len_ptr - Regular(Instruction::I32Const(0)), // salt_ptr - Regular(Instruction::I32Const(0)), // salt_len_ptr - Regular(Instruction::Call(0)), - Regular(Instruction::Drop), - ])), - .. Default::default() + call_body: Some(body::repeated_dyn( + r, + vec![ + Counter(hashes_offset as u32, hash_len as u32), // code_hash_ptr + Regular(Instruction::I64Const(0)), // ref_time weight + Regular(Instruction::I64Const(0)), // proof_size weight + Regular(Instruction::I32Const(SENTINEL as i32)), /* deposit limit ptr: use + * parent's limit */ + Regular(Instruction::I32Const(0)), // value_ptr + Regular(Instruction::I32Const(0)), // input_data_ptr + Regular(Instruction::I32Const(0)), // input_data_len + Regular(Instruction::I32Const(addr_offset as i32)), // address_ptr + Regular(Instruction::I32Const(addr_len_offset as i32)), // address_len_ptr + Regular(Instruction::I32Const(SENTINEL as i32)), // output_ptr + Regular(Instruction::I32Const(0)), // output_len_ptr + Regular(Instruction::I32Const(0)), // salt_ptr + Regular(Instruction::I32Const(0)), // salt_len_ptr + Regular(Instruction::Call(0)), + Regular(Instruction::Drop), + ], + )), + ..Default::default() }); - let instance = Contract::::new(code, vec![])?; - instance.set_balance((value + Pallet::::min_balance()) * (r + 1).into()); - let origin = RawOrigin::Signed(instance.caller.clone()); - let callee = instance.addr.clone(); + let mut setup = CallSetup::::new(code); + setup.set_balance((value + Pallet::::min_balance()) * (r + 1).into()); + call_builder!(func, instance, setup: setup); let addresses = hashes .iter() - .map(|hash| Contracts::::contract_address( - &instance.account_id, hash, &[], &[], - )) + .map(|hash| Contracts::::contract_address(&instance.account_id, hash, &[], &[])) .collect::>(); for addr in &addresses { @@ -2022,27 +2165,29 @@ benchmarks! { return Err("Expected that contract does not exist at this point.".into()); } } - }: call(origin, callee, 0u32.into(), Weight::MAX, None, vec![]) - verify { + #[block] + { + func.call(); + } for addr in &addresses { - ContractInfoOf::::get(&addr) - .ok_or("Contract should have been instantiated")?; + ContractInfoOf::::get(&addr).ok_or("Contract should have been instantiated")?; } + Ok(()) } - #[pov_mode = Measured] - seal_instantiate_per_transfer_input_salt_byte { - let t in 0 .. 1; - let i in 0 .. (code::max_pages::() - 1) * 64 * 1024; - let s in 0 .. (code::max_pages::() - 1) * 64 * 1024; + #[benchmark(pov_mode = Measured)] + fn seal_instantiate_per_transfer_input_salt_byte( + t: Linear<0, 1>, + i: Linear<0, { (code::max_pages::() - 1) * 64 * 1024 }>, + s: Linear<0, { (code::max_pages::() - 1) * 64 * 1024 }>, + ) -> Result<(), BenchmarkError> { let callee_code = WasmModule::::dummy(); - let hash = callee_code.hash; let hash_bytes = callee_code.hash.encode(); let hash_len = hash_bytes.len(); let caller = whitelisted_caller(); T::Currency::set_balance(&caller, caller_funding::()); Contracts::::store_code_raw(callee_code.code, caller)?; - let value: BalanceOf = t.into(); + let value: BalanceOf = t.into(); let value_bytes = value.encode(); let code = WasmModule::::from(ModuleDefinition { @@ -2066,27 +2211,21 @@ benchmarks! { return_type: Some(ValueType::I32), }], data_segments: vec![ - DataSegment { - offset: 0, - value: hash_bytes, - }, - DataSegment { - offset: hash_len as u32, - value: value_bytes, - }, + DataSegment { offset: 0, value: hash_bytes }, + DataSegment { offset: hash_len as u32, value: value_bytes }, ], call_body: Some(body::plain(vec![ - Instruction::I32Const(0 as i32), // code_hash_ptr - Instruction::I64Const(0), // gas + Instruction::I32Const(0 as i32), // code_hash_ptr + Instruction::I64Const(0), // gas Instruction::I32Const(hash_len as i32), // value_ptr - Instruction::I32Const(0 as i32), // input_data_ptr - Instruction::I32Const(i as i32), // input_data_len + Instruction::I32Const(0 as i32), // input_data_ptr + Instruction::I32Const(i as i32), // input_data_len Instruction::I32Const(SENTINEL as i32), // address_ptr - Instruction::I32Const(0), // address_len_ptr + Instruction::I32Const(0), // address_len_ptr Instruction::I32Const(SENTINEL as i32), // output_ptr - Instruction::I32Const(0), // output_len_ptr - Instruction::I32Const(0 as i32), // salt_ptr - Instruction::I32Const(s as i32), // salt_len + Instruction::I32Const(0), // output_len_ptr + Instruction::I32Const(0 as i32), // salt_ptr + Instruction::I32Const(s as i32), // salt_len Instruction::Call(0), Instruction::I32Eqz, Instruction::If(BlockType::NoResult), @@ -2096,105 +2235,111 @@ benchmarks! { Instruction::End, Instruction::End, ])), - .. Default::default() + ..Default::default() }); - let instance = Contract::::new(code, vec![])?; - instance.set_balance(value + (Pallet::::min_balance() * 2u32.into())); - let origin = RawOrigin::Signed(instance.caller.clone()); - }: call(origin, instance.addr, 0u32.into(), Weight::MAX, None, vec![]) + let mut setup = CallSetup::::new(code); + setup.set_balance(value + (Pallet::::min_balance() * 2u32.into())); + call_builder!(func, setup: setup); + #[block] + { + func.call(); + } + Ok(()) + } // Only the overhead of calling the function itself with minimal arguments. - #[pov_mode = Measured] - seal_hash_sha2_256 { - let r in 0 .. API_BENCHMARK_RUNS; - let instance = Contract::::new(WasmModule::hasher( - "seal_hash_sha2_256", r, 0, - ), vec![])?; - let origin = RawOrigin::Signed(instance.caller.clone()); - }: call(origin, instance.addr, 0u32.into(), Weight::MAX, None, vec![]) + #[benchmark(pov_mode = Measured)] + fn seal_hash_sha2_256(r: Linear<0, API_BENCHMARK_RUNS>) { + call_builder!(func, WasmModule::hasher("seal_hash_sha2_256", r, 0)); + #[block] + { + func.call(); + } + } // `n`: Input to hash in bytes - #[pov_mode = Measured] - seal_hash_sha2_256_per_byte { - let n in 0 .. code::max_pages::() * 64 * 1024; - let instance = Contract::::new(WasmModule::hasher( - "seal_hash_sha2_256", 1, n, - ), vec![])?; - let origin = RawOrigin::Signed(instance.caller.clone()); - }: call(origin, instance.addr, 0u32.into(), Weight::MAX, None, vec![]) + #[benchmark(pov_mode = Measured)] + fn seal_hash_sha2_256_per_byte(n: Linear<0, { code::max_pages::() * 64 * 1024 }>) { + call_builder!(func, WasmModule::hasher("seal_hash_sha2_256", 1, n)); + #[block] + { + func.call(); + } + } // Only the overhead of calling the function itself with minimal arguments. - #[pov_mode = Measured] - seal_hash_keccak_256 { - let r in 0 .. API_BENCHMARK_RUNS; - let instance = Contract::::new(WasmModule::hasher( - "seal_hash_keccak_256", r, 0, - ), vec![])?; - let origin = RawOrigin::Signed(instance.caller.clone()); - }: call(origin, instance.addr, 0u32.into(), Weight::MAX, None, vec![]) + #[benchmark(pov_mode = Measured)] + fn seal_hash_keccak_256(r: Linear<0, API_BENCHMARK_RUNS>) { + call_builder!(func, WasmModule::hasher("seal_hash_keccak_256", r, 0)); + #[block] + { + func.call(); + } + } // `n`: Input to hash in bytes - #[pov_mode = Measured] - seal_hash_keccak_256_per_byte { - let n in 0 .. code::max_pages::() * 64 * 1024; - let instance = Contract::::new(WasmModule::hasher( - "seal_hash_keccak_256", 1, n, - ), vec![])?; - let origin = RawOrigin::Signed(instance.caller.clone()); - }: call(origin, instance.addr, 0u32.into(), Weight::MAX, None, vec![]) + #[benchmark(pov_mode = Measured)] + fn seal_hash_keccak_256_per_byte(n: Linear<0, { code::max_pages::() * 64 * 1024 }>) { + call_builder!(func, WasmModule::hasher("seal_hash_keccak_256", 1, n)); + #[block] + { + func.call(); + } + } // Only the overhead of calling the function itself with minimal arguments. - #[pov_mode = Measured] - seal_hash_blake2_256 { - let r in 0 .. API_BENCHMARK_RUNS; - let instance = Contract::::new(WasmModule::hasher( - "seal_hash_blake2_256", r, 0, - ), vec![])?; - let origin = RawOrigin::Signed(instance.caller.clone()); - }: call(origin, instance.addr, 0u32.into(), Weight::MAX, None, vec![]) + #[benchmark(pov_mode = Measured)] + fn seal_hash_blake2_256(r: Linear<0, API_BENCHMARK_RUNS>) { + call_builder!(func, WasmModule::hasher("seal_hash_blake2_256", r, 0)); + #[block] + { + func.call(); + } + } // `n`: Input to hash in bytes - #[pov_mode = Measured] - seal_hash_blake2_256_per_byte { - let n in 0 .. code::max_pages::() * 64 * 1024; - let instance = Contract::::new(WasmModule::hasher( - "seal_hash_blake2_256", 1, n, - ), vec![])?; - let origin = RawOrigin::Signed(instance.caller.clone()); - }: call(origin, instance.addr, 0u32.into(), Weight::MAX, None, vec![]) + #[benchmark(pov_mode = Measured)] + fn seal_hash_blake2_256_per_byte(n: Linear<0, { code::max_pages::() * 64 * 1024 }>) { + call_builder!(func, WasmModule::hasher("seal_hash_blake2_256", 1, n)); + #[block] + { + func.call(); + } + } // Only the overhead of calling the function itself with minimal arguments. - #[pov_mode = Measured] - seal_hash_blake2_128 { - let r in 0 .. API_BENCHMARK_RUNS; - let instance = Contract::::new(WasmModule::hasher( - "seal_hash_blake2_128", r, 0, - ), vec![])?; - let origin = RawOrigin::Signed(instance.caller.clone()); - }: call(origin, instance.addr, 0u32.into(), Weight::MAX, None, vec![]) + #[benchmark(pov_mode = Measured)] + fn seal_hash_blake2_128(r: Linear<0, API_BENCHMARK_RUNS>) { + call_builder!(func, WasmModule::hasher("seal_hash_blake2_128", r, 0)); + #[block] + { + func.call(); + } + } // `n`: Input to hash in bytes - #[pov_mode = Measured] - seal_hash_blake2_128_per_byte { - let n in 0 .. code::max_pages::() * 64 * 1024; - let instance = Contract::::new(WasmModule::hasher( - "seal_hash_blake2_128", 1, n, - ), vec![])?; - let origin = RawOrigin::Signed(instance.caller.clone()); - }: call(origin, instance.addr, 0u32.into(), Weight::MAX, None, vec![]) + #[benchmark(pov_mode = Measured)] + fn seal_hash_blake2_128_per_byte(n: Linear<0, { code::max_pages::() * 64 * 1024 }>) { + call_builder!(func, WasmModule::hasher("seal_hash_blake2_128", 1, n)); + #[block] + { + func.call(); + } + } // `n`: Message input length to verify in bytes. - #[pov_mode = Measured] - seal_sr25519_verify_per_byte { - let n in 0 .. T::MaxCodeLen::get() - 255; // need some buffer so the code size does not - // exceed the max code size. - + // need some buffer so the code size does not exceed the max code size. + #[benchmark(pov_mode = Measured)] + fn seal_sr25519_verify_per_byte( + n: Linear<0, { T::MaxCodeLen::get() - 255 }>, + ) -> Result<(), BenchmarkError> { let message = (0..n).zip((32u8..127u8).cycle()).map(|(_, c)| c).collect::>(); let message_len = message.len() as i32; let key_type = sp_core::crypto::KeyTypeId(*b"code"); let pub_key = sp_io::crypto::sr25519_generate(key_type, None); - let sig = sp_io::crypto::sr25519_sign(key_type, &pub_key, &message).expect("Generates signature"); + let sig = + sp_io::crypto::sr25519_sign(key_type, &pub_key, &message).expect("Generates signature"); let sig = AsRef::<[u8; 64]>::as_ref(&sig).to_vec(); let code = WasmModule::::from(ModuleDefinition { @@ -2206,50 +2351,49 @@ benchmarks! { return_type: Some(ValueType::I32), }], data_segments: vec![ - DataSegment { - offset: 0, - value: sig, - }, - DataSegment { - offset: 64, - value: pub_key.to_vec(), - }, - DataSegment { - offset: 96, - value: message, - }, + DataSegment { offset: 0, value: sig }, + DataSegment { offset: 64, value: pub_key.to_vec() }, + DataSegment { offset: 96, value: message }, ], call_body: Some(body::plain(vec![ - Instruction::I32Const(0), // signature_ptr - Instruction::I32Const(64), // pub_key_ptr + Instruction::I32Const(0), // signature_ptr + Instruction::I32Const(64), // pub_key_ptr Instruction::I32Const(message_len), // message_len - Instruction::I32Const(96), // message_ptr + Instruction::I32Const(96), // message_ptr Instruction::Call(0), Instruction::Drop, Instruction::End, ])), - .. Default::default() + ..Default::default() }); - let instance = Contract::::new(code, vec![])?; - let origin = RawOrigin::Signed(instance.caller.clone()); - }: call(origin, instance.addr, 0u32.into(), Weight::MAX, None, vec![]) + call_builder!(func, code); + #[block] + { + func.call(); + } + Ok(()) + } // Only calling the function itself with valid arguments. // It generates different private keys and signatures for the message "Hello world". // This is a slow call: We reduce the number of runs. - #[pov_mode = Measured] - seal_sr25519_verify { - let r in 0 .. API_BENCHMARK_RUNS / 10; - + #[benchmark(pov_mode = Measured)] + fn seal_sr25519_verify( + r: Linear<0, { API_BENCHMARK_RUNS / 10 }>, + ) -> Result<(), BenchmarkError> { let message = b"Hello world".to_vec(); let message_len = message.len() as i32; let key_type = sp_core::crypto::KeyTypeId(*b"code"); let sig_params = (0..r) - .flat_map(|i| { + .flat_map(|_| { let pub_key = sp_io::crypto::sr25519_generate(key_type, None); - let sig = sp_io::crypto::sr25519_sign(key_type, &pub_key, &message).expect("Generates signature"); - let data: [u8; 96] = [AsRef::<[u8]>::as_ref(&sig), AsRef::<[u8]>::as_ref(&pub_key)].concat().try_into().unwrap(); + let sig = sp_io::crypto::sr25519_sign(key_type, &pub_key, &message) + .expect("Generates signature"); + let data: [u8; 96] = [AsRef::<[u8]>::as_ref(&sig), AsRef::<[u8]>::as_ref(&pub_key)] + .concat() + .try_into() + .unwrap(); data }) .collect::>(); @@ -2264,42 +2408,42 @@ benchmarks! { return_type: Some(ValueType::I32), }], data_segments: vec![ - DataSegment { - offset: 0, - value: sig_params - }, - DataSegment { - offset: sig_params_len as u32, - value: message, - }, + DataSegment { offset: 0, value: sig_params }, + DataSegment { offset: sig_params_len as u32, value: message }, ], - call_body: Some(body::repeated_dyn(r, vec![ - Counter(0, 96), // signature_ptr - Counter(64, 96), // pub_key_ptr - Regular(Instruction::I32Const(message_len)), // message_len - Regular(Instruction::I32Const(sig_params_len)), // message_ptr - Regular(Instruction::Call(0)), - Regular(Instruction::Drop), - ])), - .. Default::default() + call_body: Some(body::repeated_dyn( + r, + vec![ + Counter(0, 96), // signature_ptr + Counter(64, 96), // pub_key_ptr + Regular(Instruction::I32Const(message_len)), // message_len + Regular(Instruction::I32Const(sig_params_len)), // message_ptr + Regular(Instruction::Call(0)), + Regular(Instruction::Drop), + ], + )), + ..Default::default() }); - let instance = Contract::::new(code, vec![])?; - let origin = RawOrigin::Signed(instance.caller.clone()); - }: call(origin, instance.addr, 0u32.into(), Weight::MAX, None, vec![]) + call_builder!(func, code); + #[block] + { + func.call(); + } + Ok(()) + } // Only calling the function itself with valid arguments. // It generates different private keys and signatures for the message "Hello world". // This is a slow call: We reduce the number of runs. - #[pov_mode = Measured] - seal_ecdsa_recover { - let r in 0 .. API_BENCHMARK_RUNS / 10; - + #[benchmark(pov_mode = Measured)] + fn seal_ecdsa_recover(r: Linear<0, { API_BENCHMARK_RUNS / 10 }>) -> Result<(), BenchmarkError> { let message_hash = sp_io::hashing::blake2_256("Hello world".as_bytes()); let key_type = sp_core::crypto::KeyTypeId(*b"code"); let signatures = (0..r) - .map(|i| { + .map(|_| { let pub_key = sp_io::crypto::ecdsa_generate(key_type, None); - let sig = sp_io::crypto::ecdsa_sign_prehashed(key_type, &pub_key, &message_hash).expect("Generates signature"); + let sig = sp_io::crypto::ecdsa_sign_prehashed(key_type, &pub_key, &message_hash) + .expect("Generates signature"); AsRef::<[u8; 65]>::as_ref(&sig).to_vec() }) .collect::>(); @@ -2315,40 +2459,40 @@ benchmarks! { return_type: Some(ValueType::I32), }], data_segments: vec![ - DataSegment { - offset: 0, - value: message_hash[..].to_vec(), - }, - DataSegment { - offset: 32, - value: signatures, - }, + DataSegment { offset: 0, value: message_hash[..].to_vec() }, + DataSegment { offset: 32, value: signatures }, ], - call_body: Some(body::repeated_dyn(r, vec![ - Counter(32, 65), // signature_ptr - Regular(Instruction::I32Const(0)), // message_hash_ptr - Regular(Instruction::I32Const(signatures_bytes_len + 32)), // output_len_ptr - Regular(Instruction::Call(0)), - Regular(Instruction::Drop), - ])), - .. Default::default() + call_body: Some(body::repeated_dyn( + r, + vec![ + Counter(32, 65), // signature_ptr + Regular(Instruction::I32Const(0)), // message_hash_ptr + Regular(Instruction::I32Const(signatures_bytes_len + 32)), // output_len_ptr + Regular(Instruction::Call(0)), + Regular(Instruction::Drop), + ], + )), + ..Default::default() }); - let instance = Contract::::new(code, vec![])?; - let origin = RawOrigin::Signed(instance.caller.clone()); - }: call(origin, instance.addr, 0u32.into(), Weight::MAX, None, vec![]) + call_builder!(func, code); + #[block] + { + func.call(); + } + Ok(()) + } // Only calling the function itself for the list of // generated different ECDSA keys. - // This is a slow call: We redeuce the number of runs. - #[pov_mode = Measured] - seal_ecdsa_to_eth_address { - let r in 0 .. API_BENCHMARK_RUNS / 10; + // This is a slow call: We reduce the number of runs. + #[benchmark(pov_mode = Measured)] + fn seal_ecdsa_to_eth_address( + r: Linear<0, { API_BENCHMARK_RUNS / 10 }>, + ) -> Result<(), BenchmarkError> { let key_type = sp_core::crypto::KeyTypeId(*b"code"); let pub_keys_bytes = (0..r) - .flat_map(|_| { - sp_io::crypto::ecdsa_generate(key_type, None).0 - }) - .collect::>(); + .flat_map(|_| sp_io::crypto::ecdsa_generate(key_type, None).0) + .collect::>(); let pub_keys_bytes_len = pub_keys_bytes.len() as i32; let code = WasmModule::::from(ModuleDefinition { memory: Some(ImportedMemory::max::()), @@ -2358,27 +2502,28 @@ benchmarks! { params: vec![ValueType::I32, ValueType::I32], return_type: Some(ValueType::I32), }], - data_segments: vec![ - DataSegment { - offset: 0, - value: pub_keys_bytes, - }, - ], - call_body: Some(body::repeated_dyn(r, vec![ - Counter(0, 33), // pub_key_ptr - Regular(Instruction::I32Const(pub_keys_bytes_len)), // out_ptr - Regular(Instruction::Call(0)), - Regular(Instruction::Drop), - ])), - .. Default::default() + data_segments: vec![DataSegment { offset: 0, value: pub_keys_bytes }], + call_body: Some(body::repeated_dyn( + r, + vec![ + Counter(0, 33), // pub_key_ptr + Regular(Instruction::I32Const(pub_keys_bytes_len)), // out_ptr + Regular(Instruction::Call(0)), + Regular(Instruction::Drop), + ], + )), + ..Default::default() }); - let instance = Contract::::new(code, vec![])?; - let origin = RawOrigin::Signed(instance.caller.clone()); - }: call(origin, instance.addr, 0u32.into(), Weight::MAX, None, vec![]) + call_builder!(func, code); + #[block] + { + func.call(); + } + Ok(()) + } - #[pov_mode = Measured] - seal_set_code_hash { - let r in 0 .. API_BENCHMARK_RUNS; + #[benchmark(pov_mode = Measured)] + fn seal_set_code_hash(r: Linear<0, API_BENCHMARK_RUNS>) -> Result<(), BenchmarkError> { let code_hashes = (0..r) .map(|i| { let new_code = WasmModule::::dummy_with_bytes(i); @@ -2390,38 +2535,38 @@ benchmarks! { .collect::, &'static str>>()?; let code_hash_len = code_hashes.get(0).map(|x| x.encode().len()).unwrap_or(0); let code_hashes_bytes = code_hashes.iter().flat_map(|x| x.encode()).collect::>(); - let code_hashes_len = code_hashes_bytes.len(); let code = WasmModule::::from(ModuleDefinition { memory: Some(ImportedMemory::max::()), imported_functions: vec![ImportedFunction { module: "seal0", name: "seal_set_code_hash", - params: vec![ - ValueType::I32, - ], + params: vec![ValueType::I32], return_type: Some(ValueType::I32), }], - data_segments: vec![ - DataSegment { - offset: 0, - value: code_hashes_bytes, - }, - ], - call_body: Some(body::repeated_dyn(r, vec![ - Counter(0, code_hash_len as u32), // code_hash_ptr - Regular(Instruction::Call(0)), - Regular(Instruction::Drop), - ])), - .. Default::default() + data_segments: vec![DataSegment { offset: 0, value: code_hashes_bytes }], + call_body: Some(body::repeated_dyn( + r, + vec![ + Counter(0, code_hash_len as u32), // code_hash_ptr + Regular(Instruction::Call(0)), + Regular(Instruction::Drop), + ], + )), + ..Default::default() }); - let instance = Contract::::new(code, vec![])?; - let origin = RawOrigin::Signed(instance.caller.clone()); - }: call(origin, instance.addr, 0u32.into(), Weight::MAX, None, vec![]) + call_builder!(func, code); + #[block] + { + func.call(); + } + Ok(()) + } - #[pov_mode = Measured] - add_delegate_dependency { - let r in 0 .. T::MaxDelegateDependencies::get(); + #[benchmark(pov_mode = Measured)] + fn lock_delegate_dependency( + r: Linear<0, { T::MaxDelegateDependencies::get() }>, + ) -> Result<(), BenchmarkError> { let code_hashes = (0..r) .map(|i| { let new_code = WasmModule::::dummy_with_bytes(65 + i); @@ -2438,28 +2583,32 @@ benchmarks! { memory: Some(ImportedMemory::max::()), imported_functions: vec![ImportedFunction { module: "seal0", - name: "add_delegate_dependency", + name: "lock_delegate_dependency", params: vec![ValueType::I32], return_type: None, }], - data_segments: vec![ - DataSegment { - offset: 0, - value: code_hashes_bytes, - }, - ], - call_body: Some(body::repeated_dyn(r, vec![ - Counter(0, code_hash_len as u32), // code_hash_ptr - Regular(Instruction::Call(0)), - ])), - .. Default::default() + data_segments: vec![DataSegment { offset: 0, value: code_hashes_bytes }], + call_body: Some(body::repeated_dyn( + r, + vec![ + Counter(0, code_hash_len as u32), // code_hash_ptr + Regular(Instruction::Call(0)), + ], + )), + ..Default::default() }); - let instance = Contract::::new(code, vec![])?; - let origin = RawOrigin::Signed(instance.caller.clone()); - }: call(origin, instance.addr, 0u32.into(), Weight::MAX, None, vec![]) + call_builder!(func, code); + #[block] + { + func.call(); + } + Ok(()) + } - remove_delegate_dependency { - let r in 0 .. T::MaxDelegateDependencies::get(); + #[benchmark] + fn unlock_delegate_dependency( + r: Linear<0, { T::MaxDelegateDependencies::get() }>, + ) -> Result<(), BenchmarkError> { let code_hashes = (0..r) .map(|i| { let new_code = WasmModule::::dummy_with_bytes(65 + i); @@ -2475,40 +2624,47 @@ benchmarks! { let code = WasmModule::::from(ModuleDefinition { memory: Some(ImportedMemory::max::()), - imported_functions: vec![ImportedFunction { - module: "seal0", - name: "remove_delegate_dependency", - params: vec![ValueType::I32], - return_type: None, - }, ImportedFunction { - module: "seal0", - name: "add_delegate_dependency", - params: vec![ValueType::I32], - return_type: None - }], - data_segments: vec![ - DataSegment { - offset: 0, - value: code_hashes_bytes, + imported_functions: vec![ + ImportedFunction { + module: "seal0", + name: "unlock_delegate_dependency", + params: vec![ValueType::I32], + return_type: None, + }, + ImportedFunction { + module: "seal0", + name: "lock_delegate_dependency", + params: vec![ValueType::I32], + return_type: None, }, ], - deploy_body: Some(body::repeated_dyn(r, vec![ - Counter(0, code_hash_len as u32), // code_hash_ptr - Regular(Instruction::Call(1)), - ])), - call_body: Some(body::repeated_dyn(r, vec![ - Counter(0, code_hash_len as u32), // code_hash_ptr - Regular(Instruction::Call(0)), - ])), - .. Default::default() + data_segments: vec![DataSegment { offset: 0, value: code_hashes_bytes }], + deploy_body: Some(body::repeated_dyn( + r, + vec![ + Counter(0, code_hash_len as u32), // code_hash_ptr + Regular(Instruction::Call(1)), + ], + )), + call_body: Some(body::repeated_dyn( + r, + vec![ + Counter(0, code_hash_len as u32), // code_hash_ptr + Regular(Instruction::Call(0)), + ], + )), + ..Default::default() }); - let instance = Contract::::new(code, vec![])?; - let origin = RawOrigin::Signed(instance.caller.clone()); - }: call(origin, instance.addr, 0u32.into(), Weight::MAX, None, vec![]) + call_builder!(func, code); + #[block] + { + func.call(); + } + Ok(()) + } - #[pov_mode = Measured] - seal_reentrance_count { - let r in 0 .. API_BENCHMARK_RUNS; + #[benchmark(pov_mode = Measured)] + fn seal_reentrance_count(r: Linear<0, API_BENCHMARK_RUNS>) -> Result<(), BenchmarkError> { let code = WasmModule::::from(ModuleDefinition { memory: Some(ImportedMemory::max::()), imported_functions: vec![ImportedFunction { @@ -2517,19 +2673,20 @@ benchmarks! { params: vec![], return_type: Some(ValueType::I32), }], - call_body: Some(body::repeated(r, &[ - Instruction::Call(0), - Instruction::Drop, - ])), - .. Default::default() + call_body: Some(body::repeated(r, &[Instruction::Call(0), Instruction::Drop])), + ..Default::default() }); let instance = Contract::::new(code, vec![])?; let origin = RawOrigin::Signed(instance.caller.clone()); - }: call(origin, instance.addr, 0u32.into(), Weight::MAX, None, vec![]) + #[extrinsic_call] + call(origin, instance.addr, 0u32.into(), Weight::MAX, None, vec![]); + Ok(()) + } - #[pov_mode = Measured] - seal_account_reentrance_count { - let r in 0 .. API_BENCHMARK_RUNS; + #[benchmark(pov_mode = Measured)] + fn seal_account_reentrance_count( + r: Linear<0, API_BENCHMARK_RUNS>, + ) -> Result<(), BenchmarkError> { let dummy_code = WasmModule::::dummy_with_bytes(0); let accounts = (0..r) .map(|i| Contract::with_index(i + 1, dummy_code.clone(), vec![])) @@ -2544,26 +2701,27 @@ benchmarks! { params: vec![ValueType::I32], return_type: Some(ValueType::I32), }], - data_segments: vec![ - DataSegment { - offset: 0, - value: account_id_bytes, - }, - ], - call_body: Some(body::repeated_dyn(r, vec![ - Counter(0, account_id_len as u32), // account_ptr - Regular(Instruction::Call(0)), - Regular(Instruction::Drop), - ])), - .. Default::default() + data_segments: vec![DataSegment { offset: 0, value: account_id_bytes }], + call_body: Some(body::repeated_dyn( + r, + vec![ + Counter(0, account_id_len as u32), // account_ptr + Regular(Instruction::Call(0)), + Regular(Instruction::Drop), + ], + )), + ..Default::default() }); - let instance = Contract::::new(code, vec![])?; - let origin = RawOrigin::Signed(instance.caller.clone()); - }: call(origin, instance.addr, 0u32.into(), Weight::MAX, None, vec![]) + call_builder!(func, code); + #[block] + { + func.call(); + } + Ok(()) + } - #[pov_mode = Measured] - seal_instantiation_nonce { - let r in 0 .. API_BENCHMARK_RUNS; + #[benchmark(pov_mode = Measured)] + fn seal_instantiation_nonce(r: Linear<0, API_BENCHMARK_RUNS>) { let code = WasmModule::::from(ModuleDefinition { memory: Some(ImportedMemory::max::()), imported_functions: vec![ImportedFunction { @@ -2572,29 +2730,27 @@ benchmarks! { params: vec![], return_type: Some(ValueType::I64), }], - call_body: Some(body::repeated(r, &[ - Instruction::Call(0), - Instruction::Drop, - ])), - .. Default::default() + call_body: Some(body::repeated(r, &[Instruction::Call(0), Instruction::Drop])), + ..Default::default() }); - let instance = Contract::::new(code, vec![])?; - let origin = RawOrigin::Signed(instance.caller.clone()); - }: call(origin, instance.addr, 0u32.into(), Weight::MAX, None, vec![]) + call_builder!(func, code); + #[block] + { + func.call(); + } + } // We load `i64` values from random linear memory locations and store the loaded // values back into yet another random linear memory location. - // The random addresses are uniformely distributed across the entire span of the linear memory. + // The random addresses are uniformly distributed across the entire span of the linear memory. // We do this to enforce random memory accesses which are particularly expensive. // // The combination of this computation is our weight base `w_base`. - #[pov_mode = Ignored] - instr_i64_load_store { - let r in 0 .. INSTR_BENCHMARK_RUNS; - + #[benchmark(pov_mode = Ignored)] + fn instr_i64_load_store(r: Linear<0, INSTR_BENCHMARK_RUNS>) -> Result<(), BenchmarkError> { use rand::prelude::*; - // We do not need to be secure here. Fixed seed allows for determinstic results. + // We do not need to be secure here. Fixed seed allows for deterministic results. let mut rng = rand_pcg::Pcg32::seed_from_u64(8446744073709551615); let memory = ImportedMemory::max::(); @@ -2614,26 +2770,30 @@ benchmarks! { [ Instruction::I32Const(c0), // address for `i64.load_8s` Instruction::I64Load8S(0, 0), - Instruction::SetLocal(0), // temporarily store value loaded in `i64.load_8s` + Instruction::SetLocal(0), /* temporarily store value loaded in + * `i64.load_8s` */ Instruction::I32Const(c1), // address for `i64.store8` Instruction::GetLocal(0), // value to be stores in `i64.store8` Instruction::I64Store8(0, 0), ] - } + }, )), - .. Default::default() + ..Default::default() })); - }: { - sbox.invoke(); + #[block] + { + sbox.invoke(); + } + Ok(()) } // This is no benchmark. It merely exist to have an easy way to pretty print the currently // configured `Schedule` during benchmark development. Check the README on how to print this. - #[extra] - #[pov_mode = Ignored] - print_schedule { + #[benchmark(extra, pov_mode = Ignored)] + fn print_schedule() -> Result<(), BenchmarkError> { let max_weight = ::BlockWeights::get().max_block; - let (weight_per_key, key_budget) = ContractInfo::::deletion_budget(max_weight); + let (weight_per_key, key_budget) = + ContractInfo::::deletion_budget(&mut WeightMeter::with_limit(max_weight)); let schedule = T::Schedule::get(); log::info!(target: LOG_TARGET, " {schedule:#?} @@ -2641,91 +2801,15 @@ benchmarks! { Lazy deletion weight per key: {weight_per_key} Lazy deletion keys per block: {key_budget} "); - }: {} - - // Execute one erc20 transfer using the ink! erc20 example contract. - #[extra] - #[pov_mode = Measured] - ink_erc20_transfer { - let code = load_benchmark!("ink_erc20"); - let data = { - let new: ([u8; 4], BalanceOf) = ([0x9b, 0xae, 0x9d, 0x5e], 1000u32.into()); - new.encode() - }; - let instance = Contract::::new( - WasmModule::from_code(code), data, - )?; - let data = { - let transfer: ([u8; 4], AccountIdOf, BalanceOf) = ( - [0x84, 0xa1, 0x5d, 0xa1], - account::("receiver", 0, 0), - 1u32.into(), - ); - transfer.encode() - }; - }: { - >::bare_call( - instance.caller, - instance.account_id, - 0u32.into(), - Weight::MAX, - None, - data, - DebugInfo::Skip, - CollectEvents::Skip, - Determinism::Enforced, - ) - .result?; - } - - // Execute one erc20 transfer using the open zeppelin erc20 contract compiled with solang. - #[extra] - #[pov_mode = Measured] - solang_erc20_transfer { - let code = include_bytes!("../../benchmarks/solang_erc20.wasm"); - let caller = account::("instantiator", 0, 0); - let mut balance = [0u8; 32]; - balance[0] = 100; - let data = { - let new: ([u8; 4], &str, &str, [u8; 32], AccountIdOf) = ( - [0xa6, 0xf1, 0xf5, 0xe1], - "KSM", - "K", - balance, - caller.clone(), - ); - new.encode() - }; - let instance = Contract::::with_caller( - caller, WasmModule::from_code(code), data, - )?; - balance[0] = 1; - let data = { - let transfer: ([u8; 4], AccountIdOf, [u8; 32]) = ( - [0x6a, 0x46, 0x73, 0x94], - account::("receiver", 0, 0), - balance, - ); - transfer.encode() - }; - }: { - >::bare_call( - instance.caller, - instance.account_id, - 0u32.into(), - Weight::MAX, - None, - data, - DebugInfo::Skip, - CollectEvents::Skip, - Determinism::Enforced, - ) - .result?; + #[block] + {} + + Err(BenchmarkError::Skip) } impl_benchmark_test_suite!( Contracts, crate::tests::ExtBuilder::default().build(), crate::tests::Test, - ) + ); } diff --git a/substrate/frame/contracts/src/benchmarking/sandbox.rs b/substrate/frame/contracts/src/benchmarking/sandbox.rs index c3abbcad5f2b363bdda7ef2e7b5c38255220211e..308bf6873e49f9da09cbda151a0409cdcc2da08e 100644 --- a/substrate/frame/contracts/src/benchmarking/sandbox.rs +++ b/substrate/frame/contracts/src/benchmarking/sandbox.rs @@ -20,7 +20,8 @@ /// ! environment that provides the seal interface as imported functions. use super::{code::WasmModule, Config}; use crate::wasm::{ - AllowDeprecatedInterface, AllowUnstableInterface, Determinism, Environment, WasmBlob, + AllowDeprecatedInterface, AllowUnstableInterface, Determinism, Environment, LoadedModule, + LoadingMode, WasmBlob, }; use sp_core::Get; use wasmi::{errors::LinkerError, Func, Linker, StackLimits, Store}; @@ -42,12 +43,18 @@ impl From<&WasmModule> for Sandbox { /// Creates an instance from the supplied module. /// Sets the execution engine fuel level to `u64::MAX`. fn from(module: &WasmModule) -> Self { - let (mut store, _memory, instance) = WasmBlob::::instantiate::( + let contract = LoadedModule::new::( &module.code, + Determinism::Relaxed, + Some(StackLimits::default()), + LoadingMode::Checked, + ) + .expect("Failed to load Wasm module"); + + let (mut store, _memory, instance) = WasmBlob::::instantiate::( + contract, (), &::Schedule::get(), - Determinism::Relaxed, - StackLimits::default(), // We are testing with an empty environment anyways AllowDeprecatedInterface::No, ) diff --git a/substrate/frame/contracts/src/exec.rs b/substrate/frame/contracts/src/exec.rs index 2183d6b96cc5d4f84cbfa6777e0c1b0bbeec4f86..31cdadb4bb4373baee420b48cecfdd2b82862c42 100644 --- a/substrate/frame/contracts/src/exec.rs +++ b/substrate/frame/contracts/src/exec.rs @@ -287,6 +287,9 @@ pub trait Ext: sealing::Sealed { /// Returns `true` if debug message recording is enabled. Otherwise `false` is returned. fn append_debug_buffer(&mut self, msg: &str) -> bool; + /// Returns `true` if debug message recording is enabled. Otherwise `false` is returned. + fn debug_buffer_enabled(&self) -> bool; + /// Call some dispatchable and return the result. fn call_runtime(&self, call: ::RuntimeCall) -> DispatchResultWithPostInfo; @@ -345,20 +348,20 @@ pub trait Ext: sealing::Sealed { /// - [`Error::::MaxDelegateDependenciesReached`] /// - [`Error::::CannotAddSelfAsDelegateDependency`] /// - [`Error::::DelegateDependencyAlreadyExists`] - fn add_delegate_dependency( + fn lock_delegate_dependency( &mut self, code_hash: CodeHash, ) -> Result<(), DispatchError>; /// Removes a delegate dependency from [`ContractInfo`]'s `delegate_dependencies` field. /// - /// This is the counterpart of [`Self::add_delegate_dependency`]. It decreases the reference - /// count and refunds the deposit that was charged by [`Self::add_delegate_dependency`]. + /// This is the counterpart of [`Self::lock_delegate_dependency`]. It decreases the reference + /// count and refunds the deposit that was charged by [`Self::lock_delegate_dependency`]. /// /// # Errors /// /// - [`Error::::DelegateDependencyNotFound`] - fn remove_delegate_dependency( + fn unlock_delegate_dependency( &mut self, code_hash: &CodeHash, ) -> Result<(), DispatchError>; @@ -528,9 +531,9 @@ enum FrameArgs<'a, T: Config, E> { nonce: u64, /// The executable whose `deploy` function is run. executable: E, - /// A salt used in the contract address deriviation of the new contract. + /// A salt used in the contract address derivation of the new contract. salt: &'a [u8], - /// The input data is used in the contract address deriviation of the new contract. + /// The input data is used in the contract address derivation of the new contract. input_data: &'a [u8], }, } @@ -730,6 +733,30 @@ where stack.run(executable, input_data).map(|ret| (account_id, ret)) } + #[cfg(feature = "runtime-benchmarks")] + pub fn bench_new_call( + dest: T::AccountId, + origin: Origin, + gas_meter: &'a mut GasMeter, + storage_meter: &'a mut storage::meter::Meter, + schedule: &'a Schedule, + value: BalanceOf, + debug_message: Option<&'a mut DebugBufferVec>, + determinism: Determinism, + ) -> (Self, E) { + Self::new( + FrameArgs::Call { dest, cached_info: None, delegated_call: None }, + origin, + gas_meter, + storage_meter, + schedule, + value, + debug_message, + determinism, + ) + .unwrap() + } + /// Create a new call stack. fn new( args: FrameArgs, @@ -834,7 +861,7 @@ where contract_info: CachedContract::Cached(contract_info), account_id, entry_point, - nested_gas: gas_meter.nested(gas_limit)?, + nested_gas: gas_meter.nested(gas_limit), nested_storage: storage_meter.nested(deposit_limit), allows_reentry: true, }; @@ -1429,6 +1456,10 @@ where self.top_frame_mut().nested_storage.charge(diff) } + fn debug_buffer_enabled(&self) -> bool { + self.debug_message.is_some() + } + fn append_debug_buffer(&mut self, msg: &str) -> bool { if let Some(buffer) = &mut self.debug_message { buffer @@ -1459,14 +1490,14 @@ where fn sr25519_verify(&self, signature: &[u8; 64], message: &[u8], pub_key: &[u8; 32]) -> bool { sp_io::crypto::sr25519_verify( - &SR25519Signature(*signature), + &SR25519Signature::from(*signature), message, - &SR25519Public(*pub_key), + &SR25519Public::from(*pub_key), ) } fn ecdsa_to_eth_address(&self, pk: &[u8; 33]) -> Result<[u8; 20], ()> { - ECDSAPublic(*pk).to_eth_address() + ECDSAPublic::from(*pk).to_eth_address() } #[cfg(test)] @@ -1547,7 +1578,7 @@ where }); } - fn add_delegate_dependency( + fn lock_delegate_dependency( &mut self, code_hash: CodeHash, ) -> Result<(), DispatchError> { @@ -1558,7 +1589,7 @@ where let code_info = CodeInfoOf::::get(code_hash).ok_or(Error::::CodeNotFound)?; let deposit = T::CodeHashLockupDepositPercent::get().mul_ceil(code_info.deposit()); - info.add_delegate_dependency(code_hash, deposit)?; + info.lock_delegate_dependency(code_hash, deposit)?; Self::increment_refcount(code_hash)?; frame .nested_storage @@ -1566,14 +1597,14 @@ where Ok(()) } - fn remove_delegate_dependency( + fn unlock_delegate_dependency( &mut self, code_hash: &CodeHash, ) -> Result<(), DispatchError> { let frame = self.top_frame_mut(); let info = frame.contract_info.get(&frame.account_id); - let deposit = info.remove_delegate_dependency(code_hash)?; + let deposit = info.unlock_delegate_dependency(code_hash)?; Self::decrement_refcount(*code_hash); frame .nested_storage diff --git a/substrate/frame/contracts/src/gas.rs b/substrate/frame/contracts/src/gas.rs index 363ddfad975b1eb92c6a4ebcc23982f585eef08c..32fad2140f1463b454a3b8df1cb49b53e79e0c7b 100644 --- a/substrate/frame/contracts/src/gas.rs +++ b/substrate/frame/contracts/src/gas.rs @@ -16,14 +16,14 @@ // limitations under the License. use crate::{exec::ExecError, Config, Error}; +use core::marker::PhantomData; use frame_support::{ dispatch::{DispatchErrorWithPostInfo, DispatchResultWithPostInfo, PostDispatchInfo}, weights::Weight, DefaultNoBound, }; use sp_core::Get; -use sp_runtime::{traits::Zero, DispatchError}; -use sp_std::marker::PhantomData; +use sp_runtime::{traits::Zero, DispatchError, Saturating}; #[cfg(test)] use std::{any::Any, fmt::Debug}; @@ -37,6 +37,24 @@ impl ChargedAmount { } } +/// Used to capture the gas left before entering a host function. +/// +/// Has to be consumed in order to sync back the gas after leaving the host function. +#[must_use] +pub struct RefTimeLeft(u64); + +/// Resource that needs to be synced to the executor. +/// +/// Wrapped to make sure that the resource will be synced back the the executor. +#[must_use] +pub struct Syncable(u64); + +impl From for u64 { + fn from(from: Syncable) -> u64 { + from.0 + } +} + #[cfg(not(test))] pub trait TestAuxiliaries {} #[cfg(not(test))] @@ -63,6 +81,11 @@ pub trait Token: Copy + Clone + TestAuxiliaries { /// while calculating the amount. In this case it is ok to use saturating operations /// since on overflow they will return `max_value` which should consume all gas. fn weight(&self) -> Weight; + + /// Returns true if this token is expected to influence the lowest gas limit. + fn influence_lowest_gas_limit(&self) -> bool { + true + } } /// A wrapper around a type-erased trait object of what used to be a `Token`. @@ -79,8 +102,13 @@ pub struct GasMeter { gas_left: Weight, /// Due to `adjust_gas` and `nested` the `gas_left` can temporarily dip below its final value. gas_left_lowest: Weight, - /// Amount of fuel consumed by the engine from the last host function call. - engine_consumed: u64, + /// The amount of resources that was consumed by the execution engine. + /// + /// This should be equivalent to `self.gas_consumed().ref_time()` but expressed in whatever + /// unit the execution engine uses to track resource consumption. We have to track it + /// separately in order to avoid the loss of precision that happens when converting from + /// ref_time to the execution engine unit. + executor_consumed: u64, _phantom: PhantomData, #[cfg(test)] tokens: Vec, @@ -92,7 +120,7 @@ impl GasMeter { gas_limit, gas_left: gas_limit, gas_left_lowest: gas_limit, - engine_consumed: Default::default(), + executor_consumed: 0, _phantom: PhantomData, #[cfg(test)] tokens: Vec::new(), @@ -104,9 +132,7 @@ impl GasMeter { /// # Note /// /// Passing `0` as amount is interpreted as "all remaining gas". - pub fn nested(&mut self, amount: Weight) -> Result { - // NOTE that it is ok to allocate all available gas since it still ensured - // by `charge` that it doesn't reach zero. + pub fn nested(&mut self, amount: Weight) -> Self { let amount = Weight::from_parts( if amount.ref_time().is_zero() { self.gas_left().ref_time() @@ -118,33 +144,17 @@ impl GasMeter { } else { amount.proof_size() }, - ); - self.gas_left = self.gas_left.checked_sub(&amount).ok_or_else(|| >::OutOfGas)?; - Ok(GasMeter::new(amount)) + ) + .min(self.gas_left); + self.gas_left -= amount; + GasMeter::new(amount) } /// Absorb the remaining gas of a nested meter after we are done using it. pub fn absorb_nested(&mut self, nested: Self) { - if self.gas_left.ref_time().is_zero() { - // All of the remaining gas was inherited by the nested gas meter. When absorbing - // we can therefore safely inherit the lowest gas that the nested gas meter experienced - // as long as it is lower than the lowest gas that was experienced by the parent. - // We cannot call `self.gas_left_lowest()` here because in the state that this - // code is run the parent gas meter has `0` gas left. - *self.gas_left_lowest.ref_time_mut() = - nested.gas_left_lowest().ref_time().min(self.gas_left_lowest.ref_time()); - } else { - // The nested gas meter was created with a fixed amount that did not consume all of the - // parents (self) gas. The lowest gas that self will experience is when the nested - // gas was pre charged with the fixed amount. - *self.gas_left_lowest.ref_time_mut() = self.gas_left_lowest().ref_time(); - } - if self.gas_left.proof_size().is_zero() { - *self.gas_left_lowest.proof_size_mut() = - nested.gas_left_lowest().proof_size().min(self.gas_left_lowest.proof_size()); - } else { - *self.gas_left_lowest.proof_size_mut() = self.gas_left_lowest().proof_size(); - } + self.gas_left_lowest = (self.gas_left + nested.gas_limit) + .saturating_sub(nested.gas_required()) + .min(self.gas_left_lowest); self.gas_left += nested.gas_left; } @@ -178,37 +188,48 @@ impl GasMeter { /// This is when a maximum a priori amount was charged and then should be partially /// refunded to match the actual amount. pub fn adjust_gas>(&mut self, charged_amount: ChargedAmount, token: Tok) { - self.gas_left_lowest = self.gas_left_lowest(); + if token.influence_lowest_gas_limit() { + self.gas_left_lowest = self.gas_left_lowest(); + } let adjustment = charged_amount.0.saturating_sub(token.weight()); self.gas_left = self.gas_left.saturating_add(adjustment).min(self.gas_limit); } - /// This method is used for gas syncs with the engine. + /// Hand over the gas metering responsibility from the executor to this meter. /// - /// Updates internal `engine_comsumed` tracker of engine fuel consumption. + /// Needs to be called when entering a host function to update this meter with the + /// gas that was tracked by the executor. It tracks the latest seen total value + /// in order to compute the delta that needs to be charged. + pub fn sync_from_executor( + &mut self, + executor_total: u64, + ) -> Result { + let chargable_reftime = executor_total + .saturating_sub(self.executor_consumed) + .saturating_mul(u64::from(T::Schedule::get().instruction_weights.base)); + self.executor_consumed = executor_total; + self.gas_left + .checked_reduce(Weight::from_parts(chargable_reftime, 0)) + .ok_or_else(|| Error::::OutOfGas)?; + Ok(RefTimeLeft(self.gas_left.ref_time())) + } + + /// Hand over the gas metering responsibility from this meter to the executor. /// - /// Charges self with the `ref_time` Weight corresponding to wasmi fuel consumed on the engine - /// side since last sync. Passed value is scaled by multiplying it by the weight of a basic - /// operation, as such an operation in wasmi engine costs 1. + /// Needs to be called when leaving a host function in order to calculate how much + /// gas needs to be charged from the **executor**. It updates the last seen executor + /// total value so that it is correct when `sync_from_executor` is called the next time. /// - /// Returns the updated `gas_left` `Weight` value from the meter. - /// Normally this would never fail, as engine should fail first when out of gas. - pub fn charge_fuel(&mut self, wasmi_fuel_total: u64) -> Result { - // Take the part consumed since the last update. - let wasmi_fuel = wasmi_fuel_total.saturating_sub(self.engine_consumed); - if !wasmi_fuel.is_zero() { - self.engine_consumed = wasmi_fuel_total; - let reftime_consumed = - wasmi_fuel.saturating_mul(T::Schedule::get().instruction_weights.base as u64); - let ref_time_left = self - .gas_left - .ref_time() - .checked_sub(reftime_consumed) - .ok_or_else(|| Error::::OutOfGas)?; - - *(self.gas_left.ref_time_mut()) = ref_time_left; - } - Ok(self.gas_left) + /// It is important that this does **not** actually sync with the executor. That has + /// to be done by the caller. + pub fn sync_to_executor(&mut self, before: RefTimeLeft) -> Result { + let chargable_executor_resource = before + .0 + .saturating_sub(self.gas_left().ref_time()) + .checked_div(u64::from(T::Schedule::get().instruction_weights.base)) + .ok_or(Error::::InvalidSchedule)?; + self.executor_consumed.saturating_accrue(chargable_executor_resource); + Ok(Syncable(chargable_executor_resource)) } /// Returns the amount of gas that is required to run the same call. @@ -331,7 +352,7 @@ mod tests { assert!(gas_meter.charge(SimpleToken(1)).is_err()); } - // Make sure that the gas meter does not charge in case of overcharger + // Make sure that the gas meter does not charge in case of overcharge #[test] fn overcharge_does_not_charge() { let mut gas_meter = GasMeter::::new(Weight::from_parts(200, 0)); diff --git a/substrate/frame/contracts/src/lib.rs b/substrate/frame/contracts/src/lib.rs index 533085f2b874f6cc1d6c122fa6db5c8498c3db0c..73c70a7704e202845a6ce4edc361527b6c125fbe 100644 --- a/substrate/frame/contracts/src/lib.rs +++ b/substrate/frame/contracts/src/lib.rs @@ -123,7 +123,7 @@ use frame_support::{ fungible::{Inspect, Mutate, MutateHold}, ConstU32, Contains, Get, Randomness, Time, }, - weights::Weight, + weights::{Weight, WeightMeter}, BoundedVec, DefaultNoBound, RuntimeDebugNoBound, }; use frame_system::{ @@ -214,6 +214,27 @@ pub struct Environment { block_number: EnvironmentType>, } +/// Defines the current version of the HostFn APIs. +/// This is used to communicate the available APIs in pallet-contracts. +/// +/// The version is bumped any time a new HostFn is added or stabilized. +#[derive(Encode, Decode, TypeInfo)] +pub struct ApiVersion(u16); +impl Default for ApiVersion { + fn default() -> Self { + Self(2) + } +} + +#[test] +fn api_version_is_up_to_date() { + assert_eq!( + 109, + crate::wasm::STABLE_API_COUNT, + "Stable API count has changed. Bump the returned value of ApiVersion::default() and update the test." + ); +} + #[frame_support::pallet] pub mod pallet { use super::*; @@ -222,8 +243,8 @@ pub mod pallet { use frame_system::pallet_prelude::*; use sp_runtime::Perbill; - /// The current storage version. - pub(crate) const STORAGE_VERSION: StorageVersion = StorageVersion::new(15); + /// The in-code storage version. + pub(crate) const STORAGE_VERSION: StorageVersion = StorageVersion::new(16); #[pallet::pallet] #[pallet::storage_version(STORAGE_VERSION)] @@ -277,6 +298,9 @@ pub mod pallet { /// Therefore please make sure to be restrictive about which dispatchables are allowed /// in order to not introduce a new DoS vector like memory allocation patterns that can /// be exploited to drive the runtime into a panic. + /// + /// This filter does not apply to XCM transact calls. To impose restrictions on XCM transact + /// calls, you must configure them separately within the XCM pallet itself. type CallFilter: Contains<::RuntimeCall>; /// Used to answer contracts' queries regarding the current weight price. This is **not** @@ -325,7 +349,7 @@ pub mod pallet { type DepositPerItem: Get>; /// The percentage of the storage deposit that should be held for using a code hash. - /// Instantiating a contract, or calling [`chain_extension::Ext::add_delegate_dependency`] + /// Instantiating a contract, or calling [`chain_extension::Ext::lock_delegate_dependency`] /// protects the code from being removed. In order to prevent abuse these actions are /// protected with a percentage of the code deposit. #[pallet::constant] @@ -347,7 +371,7 @@ pub mod pallet { type MaxStorageKeyLen: Get; /// The maximum number of delegate_dependencies that a contract can lock with - /// [`chain_extension::Ext::add_delegate_dependency`]. + /// [`chain_extension::Ext::lock_delegate_dependency`]. #[pallet::constant] type MaxDelegateDependencies: Get; @@ -367,6 +391,24 @@ pub mod pallet { #[pallet::constant] type MaxDebugBufferLen: Get; + /// Origin allowed to upload code. + /// + /// By default, it is safe to set this to `EnsureSigned`, allowing anyone to upload contract + /// code. + type UploadOrigin: EnsureOrigin; + + /// Origin allowed to instantiate code. + /// + /// # Note + /// + /// This is not enforced when a contract instantiates another contract. The + /// [`Self::UploadOrigin`] should make sure that no code is deployed that does unwanted + /// instantiations. + /// + /// By default, it is safe to set this to `EnsureSigned`, allowing anyone to instantiate + /// contract code. + type InstantiateOrigin: EnsureOrigin; + /// Overarching hold reason. type RuntimeHoldReason: From; @@ -402,6 +444,12 @@ pub mod pallet { #[pallet::constant] type Environment: Get>; + /// The version of the HostFn APIs that are available in the runtime. + /// + /// Only valid value is `()`. + #[pallet::constant] + type ApiVersion: Get; + /// A type that exposes XCM APIs, allowing contracts to interact with other parachains, and /// execute XCM programs. type Xcm: xcm_builder::Controller< @@ -413,17 +461,15 @@ pub mod pallet { #[pallet::hooks] impl Hooks> for Pallet { - fn on_idle(_block: BlockNumberFor, mut remaining_weight: Weight) -> Weight { + fn on_idle(_block: BlockNumberFor, limit: Weight) -> Weight { use migration::MigrateResult::*; + let mut meter = WeightMeter::with_limit(limit); loop { - let (result, weight) = Migration::::migrate(remaining_weight); - remaining_weight.saturating_reduce(weight); - - match result { - // There is not enough weight to perform a migration, or make any progress, we - // just return the remaining weight. - NoMigrationPerformed | InProgress { steps_done: 0 } => return remaining_weight, + match Migration::::migrate(&mut meter) { + // There is not enough weight to perform a migration. + // We can't do anything more, so we return the used weight. + NoMigrationPerformed | InProgress { steps_done: 0 } => return meter.consumed(), // Migration is still in progress, we can start the next step. InProgress { .. } => continue, // Either no migration is in progress, or we are done with all migrations, we @@ -432,8 +478,8 @@ pub mod pallet { } } - ContractInfo::::process_deletion_queue_batch(remaining_weight) - .saturating_add(T::WeightInfo::on_process_deletion_queue_batch()) + ContractInfo::::process_deletion_queue_batch(&mut meter); + meter.consumed() } fn integrity_test() { @@ -609,8 +655,17 @@ pub mod pallet { /// To avoid this situation a constructor could employ access control so that it can /// only be instantiated by permissioned entities. The same is true when uploading /// through [`Self::instantiate_with_code`]. + /// + /// Use [`Determinism::Relaxed`] exclusively for non-deterministic code. If the uploaded + /// code is deterministic, specifying [`Determinism::Relaxed`] will be disregarded and + /// result in higher gas costs. #[pallet::call_index(3)] - #[pallet::weight(T::WeightInfo::upload_code(code.len() as u32))] + #[pallet::weight( + match determinism { + Determinism::Enforced => T::WeightInfo::upload_code_determinism_enforced(code.len() as u32), + Determinism::Relaxed => T::WeightInfo::upload_code_determinism_relaxed(code.len() as u32), + } + )] pub fn upload_code( origin: OriginFor, code: Vec, @@ -618,7 +673,7 @@ pub mod pallet { determinism: Determinism, ) -> DispatchResult { Migration::::ensure_migrated()?; - let origin = ensure_signed(origin)?; + let origin = T::UploadOrigin::ensure_origin(origin)?; Self::bare_upload_code(origin, code, storage_deposit_limit.map(Into::into), determinism) .map(|_| ()) } @@ -767,11 +822,17 @@ pub mod pallet { salt: Vec, ) -> DispatchResultWithPostInfo { Migration::::ensure_migrated()?; - let origin = ensure_signed(origin)?; + + // These two origins will usually be the same; however, we treat them as separate since + // it is possible for the `Success` value of `UploadOrigin` and `InstantiateOrigin` to + // differ. + let upload_origin = T::UploadOrigin::ensure_origin(origin.clone())?; + let instantiate_origin = T::InstantiateOrigin::ensure_origin(origin)?; + let code_len = code.len() as u32; let (module, upload_deposit) = Self::try_upload_code( - origin.clone(), + upload_origin, code, storage_deposit_limit.clone().map(Into::into), Determinism::Enforced, @@ -785,7 +846,7 @@ pub mod pallet { let data_len = data.len() as u32; let salt_len = salt.len() as u32; let common = CommonInput { - origin: Origin::from_account_id(origin), + origin: Origin::from_account_id(instantiate_origin), value, data, gas_limit, @@ -826,10 +887,11 @@ pub mod pallet { salt: Vec, ) -> DispatchResultWithPostInfo { Migration::::ensure_migrated()?; + let origin = T::InstantiateOrigin::ensure_origin(origin)?; let data_len = data.len() as u32; let salt_len = salt.len() as u32; let common = CommonInput { - origin: Origin::from_runtime_origin(origin)?, + origin: Origin::from_account_id(origin), value, data, gas_limit, @@ -860,18 +922,25 @@ pub mod pallet { ensure_signed(origin)?; let weight_limit = weight_limit.saturating_add(T::WeightInfo::migrate()); - let (result, weight) = Migration::::migrate(weight_limit); + let mut meter = WeightMeter::with_limit(weight_limit); + let result = Migration::::migrate(&mut meter); match result { - Completed => - Ok(PostDispatchInfo { actual_weight: Some(weight), pays_fee: Pays::No }), - InProgress { steps_done, .. } if steps_done > 0 => - Ok(PostDispatchInfo { actual_weight: Some(weight), pays_fee: Pays::No }), - InProgress { .. } => - Ok(PostDispatchInfo { actual_weight: Some(weight), pays_fee: Pays::Yes }), + Completed => Ok(PostDispatchInfo { + actual_weight: Some(meter.consumed()), + pays_fee: Pays::No, + }), + InProgress { steps_done, .. } if steps_done > 0 => Ok(PostDispatchInfo { + actual_weight: Some(meter.consumed()), + pays_fee: Pays::No, + }), + InProgress { .. } => Ok(PostDispatchInfo { + actual_weight: Some(meter.consumed()), + pays_fee: Pays::Yes, + }), NoMigrationInProgress | NoMigrationPerformed => { let err: DispatchError = >::NoMigrationPerformed.into(); - Err(err.with_weight(T::WeightInfo::migrate())) + Err(err.with_weight(meter.consumed())) }, } } @@ -1043,7 +1112,7 @@ pub mod pallet { /// A more detailed error can be found on the node console if debug messages are enabled /// by supplying `-lruntime::contracts=debug`. CodeRejected, - /// An indetermistic code was used in a context where this is not permitted. + /// An indeterministic code was used in a context where this is not permitted. Indeterministic, /// A pending migration needs to complete before the extrinsic can be called. MigrationInProgress, diff --git a/substrate/frame/contracts/src/migration.rs b/substrate/frame/contracts/src/migration.rs index 6d61cb6b1e1af158b9d4942efabc73267f8e44f7..c633ba9c2d50d6bf31da965cd6cd4638d048fb6b 100644 --- a/substrate/frame/contracts/src/migration.rs +++ b/substrate/frame/contracts/src/migration.rs @@ -64,6 +64,7 @@ pub mod v12; pub mod v13; pub mod v14; pub mod v15; +pub mod v16; include!(concat!(env!("OUT_DIR"), "/migration_codegen.rs")); use crate::{weights::WeightInfo, Config, Error, MigrationInProgress, Pallet, Weight, LOG_TARGET}; @@ -71,6 +72,7 @@ use codec::{Codec, Decode}; use frame_support::{ pallet_prelude::*, traits::{ConstU32, OnRuntimeUpgrade}, + weights::WeightMeter, }; use sp_runtime::Saturating; use sp_std::marker::PhantomData; @@ -112,8 +114,8 @@ pub trait MigrationStep: Codec + MaxEncodedLen + Default { /// Process one step of the migration. /// - /// Returns whether the migration is finished and the weight consumed. - fn step(&mut self) -> (IsFinished, Weight); + /// Returns whether the migration is finished. + fn step(&mut self, meter: &mut WeightMeter) -> IsFinished; /// Verify that the migration step fits into `Cursor`, and that `max_step_weight` is not greater /// than `max_block_weight`. @@ -161,9 +163,9 @@ impl MigrationStep for NoopMigration { fn max_step_weight() -> Weight { Weight::zero() } - fn step(&mut self) -> (IsFinished, Weight) { + fn step(&mut self, _meter: &mut WeightMeter) -> IsFinished { log::debug!(target: LOG_TARGET, "Noop migration for version {}", N); - (IsFinished::Yes, Weight::zero()) + IsFinished::Yes } } @@ -209,8 +211,8 @@ pub trait MigrateSequence: private::Sealed { Ok(()) } - /// Execute the migration step until the weight limit is reached. - fn steps(version: StorageVersion, cursor: &[u8], weight_left: &mut Weight) -> StepResult; + /// Execute the migration step until the available weight is consumed. + fn steps(version: StorageVersion, cursor: &[u8], meter: &mut WeightMeter) -> StepResult; /// Verify that the migration step fits into `Cursor`, and that `max_step_weight` is not greater /// than `max_block_weight`. @@ -235,18 +237,18 @@ pub struct Migration(PhantomData Migration { fn run_all_steps() -> Result<(), TryRuntimeError> { - let mut weight = Weight::zero(); + let mut meter = &mut WeightMeter::new(); let name = >::name(); loop { let in_progress_version = >::on_chain_storage_version() + 1; let state = T::Migrations::pre_upgrade_step(in_progress_version)?; - let (status, w) = Self::migrate(Weight::MAX); - weight.saturating_accrue(w); + let before = meter.consumed(); + let status = Self::migrate(&mut meter); log::info!( target: LOG_TARGET, "{name}: Migration step {:?} weight = {}", in_progress_version, - weight + meter.consumed() - before ); T::Migrations::post_upgrade_step(in_progress_version, state)?; if matches!(status, MigrateResult::Completed) { @@ -255,7 +257,7 @@ impl Migration { } let name = >::name(); - log::info!(target: LOG_TARGET, "{name}: Migration steps weight = {}", weight); + log::info!(target: LOG_TARGET, "{name}: Migration steps weight = {}", meter.consumed()); Ok(()) } } @@ -263,10 +265,10 @@ impl Migration { impl OnRuntimeUpgrade for Migration { fn on_runtime_upgrade() -> Weight { let name = >::name(); - let current_version = >::current_storage_version(); + let in_code_version = >::in_code_storage_version(); let on_chain_version = >::on_chain_storage_version(); - if on_chain_version == current_version { + if on_chain_version == in_code_version { log::warn!( target: LOG_TARGET, "{name}: No Migration performed storage_version = latest_version = {:?}", @@ -289,7 +291,7 @@ impl OnRuntimeUpgrade for Migration OnRuntimeUpgrade for Migration>::on_chain_storage_version(); - let current_version = >::current_storage_version(); + let in_code_version = >::in_code_storage_version(); - if on_chain_version == current_version { + if on_chain_version == in_code_version { return Ok(Default::default()) } log::debug!( target: LOG_TARGET, - "Requested migration of {} from {:?}(on-chain storage version) to {:?}(current storage version)", - >::name(), on_chain_version, current_version + "Requested migration of {} from {:?}(on-chain storage version) to {:?}(in-code storage version)", + >::name(), on_chain_version, in_code_version ); ensure!( - T::Migrations::is_upgrade_supported(on_chain_version, current_version), - "Unsupported upgrade: VERSION_RANGE should be (on-chain storage version + 1, current storage version)" + T::Migrations::is_upgrade_supported(on_chain_version, in_code_version), + "Unsupported upgrade: VERSION_RANGE should be (on-chain storage version + 1, in-code storage version)" ); Ok(Default::default()) @@ -384,19 +386,19 @@ impl Migration { T::Migrations::integrity_test(max_weight) } - /// Migrate - /// Return the weight used and whether or not a migration is in progress - pub(crate) fn migrate(weight_limit: Weight) -> (MigrateResult, Weight) { + /// Execute the multi-step migration. + /// Returns whether or not a migration is in progress + pub(crate) fn migrate(mut meter: &mut WeightMeter) -> MigrateResult { let name = >::name(); - let mut weight_left = weight_limit; - if weight_left.checked_reduce(T::WeightInfo::migrate()).is_none() { - return (MigrateResult::NoMigrationPerformed, Weight::zero()) + if meter.try_consume(T::WeightInfo::migrate()).is_err() { + return MigrateResult::NoMigrationPerformed } MigrationInProgress::::mutate_exists(|progress| { let Some(cursor_before) = progress.as_mut() else { - return (MigrateResult::NoMigrationInProgress, T::WeightInfo::migration_noop()) + meter.consume(T::WeightInfo::migration_noop()); + return MigrateResult::NoMigrationInProgress }; // if a migration is running it is always upgrading to the next version @@ -410,38 +412,36 @@ impl Migration { in_progress_version, ); - let result = match T::Migrations::steps( - in_progress_version, - cursor_before.as_ref(), - &mut weight_left, - ) { - StepResult::InProgress { cursor, steps_done } => { - *progress = Some(cursor); - MigrateResult::InProgress { steps_done } - }, - StepResult::Completed { steps_done } => { - in_progress_version.put::>(); - if >::current_storage_version() != in_progress_version { - log::info!( - target: LOG_TARGET, - "{name}: Next migration is {:?},", - in_progress_version + 1 - ); - *progress = Some(T::Migrations::new(in_progress_version + 1)); + let result = + match T::Migrations::steps(in_progress_version, cursor_before.as_ref(), &mut meter) + { + StepResult::InProgress { cursor, steps_done } => { + *progress = Some(cursor); MigrateResult::InProgress { steps_done } - } else { - log::info!( - target: LOG_TARGET, - "{name}: All migrations done. At version {:?},", - in_progress_version - ); - *progress = None; - MigrateResult::Completed - } - }, - }; + }, + StepResult::Completed { steps_done } => { + in_progress_version.put::>(); + if >::in_code_storage_version() != in_progress_version { + log::info!( + target: LOG_TARGET, + "{name}: Next migration is {:?},", + in_progress_version + 1 + ); + *progress = Some(T::Migrations::new(in_progress_version + 1)); + MigrateResult::InProgress { steps_done } + } else { + log::info!( + target: LOG_TARGET, + "{name}: All migrations done. At version {:?},", + in_progress_version + ); + *progress = None; + MigrateResult::Completed + } + }, + }; - (result, weight_limit.saturating_sub(weight_left)) + result }) } @@ -516,7 +516,7 @@ impl MigrateSequence for Tuple { invalid_version(version) } - fn steps(version: StorageVersion, mut cursor: &[u8], weight_left: &mut Weight) -> StepResult { + fn steps(version: StorageVersion, mut cursor: &[u8], meter: &mut WeightMeter) -> StepResult { for_tuples!( #( if version == Tuple::VERSION { @@ -524,11 +524,9 @@ impl MigrateSequence for Tuple { .expect(PROOF_DECODE); let max_weight = Tuple::max_step_weight(); let mut steps_done = 0; - while weight_left.all_gt(max_weight) { - let (finished, weight) = migration.step(); + while meter.can_consume(max_weight) { steps_done.saturating_accrue(1); - weight_left.saturating_reduce(weight); - if matches!(finished, IsFinished::Yes) { + if matches!(migration.step(meter), IsFinished::Yes) { return StepResult::Completed{ steps_done } } } @@ -567,13 +565,14 @@ mod test { fn max_step_weight() -> Weight { Weight::from_all(1) } - fn step(&mut self) -> (IsFinished, Weight) { + fn step(&mut self, meter: &mut WeightMeter) -> IsFinished { assert!(self.count != N); self.count += 1; + meter.consume(Weight::from_all(1)); if self.count == N { - (IsFinished::Yes, Weight::from_all(1)) + IsFinished::Yes } else { - (IsFinished::No, Weight::from_all(1)) + IsFinished::No } } } @@ -603,15 +602,15 @@ mod test { let version = StorageVersion::new(2); let mut cursor = Migrations::new(version); - let mut weight = Weight::from_all(2); - let result = Migrations::steps(version, &cursor, &mut weight); + let mut meter = WeightMeter::with_limit(Weight::from_all(1)); + let result = Migrations::steps(version, &cursor, &mut meter); cursor = vec![1u8, 0].try_into().unwrap(); assert_eq!(result, StepResult::InProgress { cursor: cursor.clone(), steps_done: 1 }); - assert_eq!(weight, Weight::from_all(1)); + assert_eq!(meter.consumed(), Weight::from_all(1)); - let mut weight = Weight::from_all(2); + let mut meter = WeightMeter::with_limit(Weight::from_all(1)); assert_eq!( - Migrations::steps(version, &cursor, &mut weight), + Migrations::steps(version, &cursor, &mut meter), StepResult::Completed { steps_done: 1 } ); } @@ -622,7 +621,10 @@ mod test { ExtBuilder::default().build().execute_with(|| { assert_eq!(StorageVersion::get::>(), LATEST_MIGRATION_VERSION); - assert_eq!(TestMigration::migrate(Weight::MAX).0, MigrateResult::NoMigrationInProgress) + assert_eq!( + TestMigration::migrate(&mut WeightMeter::new()), + MigrateResult::NoMigrationInProgress + ) }); } @@ -640,7 +642,7 @@ mod test { (LATEST_MIGRATION_VERSION - 1, MigrateResult::InProgress { steps_done: 1 }), (LATEST_MIGRATION_VERSION, MigrateResult::Completed), ] { - assert_eq!(TestMigration::migrate(Weight::MAX).0, status); + assert_eq!(TestMigration::migrate(&mut WeightMeter::new()), status); assert_eq!( >::on_chain_storage_version(), StorageVersion::new(version) @@ -648,7 +650,7 @@ mod test { } assert_eq!( - TestMigration::migrate(Weight::MAX).0, + TestMigration::migrate(&mut WeightMeter::new()), MigrateResult::NoMigrationInProgress ); assert_eq!(StorageVersion::get::>(), LATEST_MIGRATION_VERSION); diff --git a/substrate/frame/contracts/src/migration/v09.rs b/substrate/frame/contracts/src/migration/v09.rs index 98fcccc2c0becedccd4bd15eed98b36fd52662ee..7e84191910d9f244d8b3ec98439835f311fbfe10 100644 --- a/substrate/frame/contracts/src/migration/v09.rs +++ b/substrate/frame/contracts/src/migration/v09.rs @@ -23,12 +23,14 @@ use crate::{ CodeHash, Config, Determinism, Pallet, Weight, LOG_TARGET, }; use codec::{Decode, Encode}; -use frame_support::{pallet_prelude::*, storage_alias, DefaultNoBound, Identity}; +use frame_support::{ + pallet_prelude::*, storage_alias, weights::WeightMeter, DefaultNoBound, Identity, +}; #[cfg(feature = "try-runtime")] use sp_runtime::TryRuntimeError; use sp_std::prelude::*; -mod old { +mod v8 { use super::*; #[derive(Encode, Decode)] @@ -50,14 +52,14 @@ mod old { #[cfg(feature = "runtime-benchmarks")] pub fn store_old_dummy_code(len: usize) { use sp_runtime::traits::Hash; - let module = old::PrefabWasmModule { + let module = v8::PrefabWasmModule { instruction_weights_version: 0, initial: 0, maximum: 0, code: vec![42u8; len], }; let hash = T::Hashing::hash(&module.code); - old::CodeStorage::::insert(hash, module); + v8::CodeStorage::::insert(hash, module); } #[derive(Encode, Decode)] @@ -87,11 +89,11 @@ impl MigrationStep for Migration { T::WeightInfo::v9_migration_step(T::MaxCodeLen::get()) } - fn step(&mut self) -> (IsFinished, Weight) { + fn step(&mut self, meter: &mut WeightMeter) -> IsFinished { let mut iter = if let Some(last_key) = self.last_code_hash.take() { - old::CodeStorage::::iter_from(old::CodeStorage::::hashed_key_for(last_key)) + v8::CodeStorage::::iter_from(v8::CodeStorage::::hashed_key_for(last_key)) } else { - old::CodeStorage::::iter() + v8::CodeStorage::::iter() }; if let Some((key, old)) = iter.next() { @@ -106,16 +108,18 @@ impl MigrationStep for Migration { }; CodeStorage::::insert(key, module); self.last_code_hash = Some(key); - (IsFinished::No, T::WeightInfo::v9_migration_step(len)) + meter.consume(T::WeightInfo::v9_migration_step(len)); + IsFinished::No } else { log::debug!(target: LOG_TARGET, "No more contracts code to migrate"); - (IsFinished::Yes, T::WeightInfo::v9_migration_step(0)) + meter.consume(T::WeightInfo::v9_migration_step(0)); + IsFinished::Yes } } #[cfg(feature = "try-runtime")] fn pre_upgrade_step() -> Result, TryRuntimeError> { - let sample: Vec<_> = old::CodeStorage::::iter().take(100).collect(); + let sample: Vec<_> = v8::CodeStorage::::iter().take(100).collect(); log::debug!(target: LOG_TARGET, "Taking sample of {} contract codes", sample.len()); Ok(sample.encode()) @@ -123,7 +127,7 @@ impl MigrationStep for Migration { #[cfg(feature = "try-runtime")] fn post_upgrade_step(state: Vec) -> Result<(), TryRuntimeError> { - let sample = , old::PrefabWasmModule)> as Decode>::decode(&mut &state[..]) + let sample = , v8::PrefabWasmModule)> as Decode>::decode(&mut &state[..]) .expect("pre_upgrade_step provides a valid state; qed"); log::debug!(target: LOG_TARGET, "Validating sample of {} contract codes", sample.len()); @@ -131,7 +135,7 @@ impl MigrationStep for Migration { let module = CodeStorage::::get(&code_hash).unwrap(); ensure!( module.instruction_weights_version == old.instruction_weights_version, - "invalid isntruction weights version" + "invalid instruction weights version" ); ensure!(module.determinism == Determinism::Enforced, "invalid determinism"); ensure!(module.initial == old.initial, "invalid initial"); diff --git a/substrate/frame/contracts/src/migration/v10.rs b/substrate/frame/contracts/src/migration/v10.rs index 22fad38739e751c9b68dfb3151751e08331f5218..61632a1fd1bad99fd3f80972f2b1defddb6d4462 100644 --- a/substrate/frame/contracts/src/migration/v10.rs +++ b/substrate/frame/contracts/src/migration/v10.rs @@ -25,7 +25,10 @@ use crate::{ CodeHash, Config, Pallet, TrieId, Weight, LOG_TARGET, }; use codec::{Decode, Encode}; -use core::cmp::{max, min}; +use core::{ + cmp::{max, min}, + ops::Deref, +}; use frame_support::{ pallet_prelude::*, storage_alias, @@ -33,6 +36,7 @@ use frame_support::{ tokens::{fungible::Inspect, Fortitude::Polite, Preservation::Preserve}, ExistenceRequirement, ReservableCurrency, }, + weights::WeightMeter, DefaultNoBound, }; use sp_core::hexdisplay::HexDisplay; @@ -42,9 +46,9 @@ use sp_runtime::{ traits::{Hash, TrailingZeroInput, Zero}, Perbill, Saturating, }; -use sp_std::{ops::Deref, prelude::*}; +use sp_std::prelude::*; -mod old { +mod v9 { use super::*; pub type BalanceOf = ( ) where OldCurrency: ReservableCurrency<::AccountId> + 'static, { - let info = old::ContractInfo { + let info = v9::ContractInfo { trie_id: info.trie_id, code_hash: info.code_hash, storage_bytes: Default::default(), @@ -91,7 +95,7 @@ pub fn store_old_contract_info( storage_item_deposit: Default::default(), storage_base_deposit: Default::default(), }; - old::ContractInfoOf::::insert(account, info); + v9::ContractInfoOf::::insert(account, info); } #[derive(Encode, Decode, Clone, PartialEq, Eq, RuntimeDebugNoBound, TypeInfo, MaxEncodedLen)] @@ -117,9 +121,9 @@ where pub code_hash: CodeHash, storage_bytes: u32, storage_items: u32, - pub storage_byte_deposit: old::BalanceOf, - storage_item_deposit: old::BalanceOf, - storage_base_deposit: old::BalanceOf, + pub storage_byte_deposit: v9::BalanceOf, + storage_item_deposit: v9::BalanceOf, + storage_base_deposit: v9::BalanceOf, } #[derive(Encode, Decode, MaxEncodedLen, DefaultNoBound)] @@ -149,7 +153,7 @@ fn deposit_address( impl MigrationStep for Migration where OldCurrency: ReservableCurrency<::AccountId> - + Inspect<::AccountId, Balance = old::BalanceOf>, + + Inspect<::AccountId, Balance = v9::BalanceOf>, { const VERSION: u16 = 10; @@ -157,13 +161,13 @@ where T::WeightInfo::v10_migration_step() } - fn step(&mut self) -> (IsFinished, Weight) { + fn step(&mut self, meter: &mut WeightMeter) -> IsFinished { let mut iter = if let Some(last_account) = self.last_account.take() { - old::ContractInfoOf::::iter_from( - old::ContractInfoOf::::hashed_key_for(last_account), + v9::ContractInfoOf::::iter_from( + v9::ContractInfoOf::::hashed_key_for(last_account), ) } else { - old::ContractInfoOf::::iter() + v9::ContractInfoOf::::iter() }; if let Some((account, contract)) = iter.next() { @@ -264,16 +268,18 @@ where // Store last key for next migration step self.last_account = Some(account); - (IsFinished::No, T::WeightInfo::v10_migration_step()) + meter.consume(T::WeightInfo::v10_migration_step()); + IsFinished::No } else { log::debug!(target: LOG_TARGET, "Done Migrating contract info"); - (IsFinished::Yes, T::WeightInfo::v10_migration_step()) + meter.consume(T::WeightInfo::v10_migration_step()); + IsFinished::Yes } } #[cfg(feature = "try-runtime")] fn pre_upgrade_step() -> Result, TryRuntimeError> { - let sample: Vec<_> = old::ContractInfoOf::::iter().take(10).collect(); + let sample: Vec<_> = v9::ContractInfoOf::::iter().take(10).collect(); log::debug!(target: LOG_TARGET, "Taking sample of {} contracts", sample.len()); Ok(sample.encode()) @@ -281,7 +287,7 @@ where #[cfg(feature = "try-runtime")] fn post_upgrade_step(state: Vec) -> Result<(), TryRuntimeError> { - let sample = )> as Decode>::decode( + let sample = )> as Decode>::decode( &mut &state[..], ) .expect("pre_upgrade_step provides a valid state; qed"); diff --git a/substrate/frame/contracts/src/migration/v11.rs b/substrate/frame/contracts/src/migration/v11.rs index a5b11f6e08977fbbeb737bc2650ad318ddac97c8..9b4316162ca62a9a9d4e1c3f9b1a912f97122293 100644 --- a/substrate/frame/contracts/src/migration/v11.rs +++ b/substrate/frame/contracts/src/migration/v11.rs @@ -23,13 +23,12 @@ use crate::{ weights::WeightInfo, Config, Pallet, TrieId, Weight, LOG_TARGET, }; +use codec::{Decode, Encode}; +use frame_support::{pallet_prelude::*, storage_alias, weights::WeightMeter, DefaultNoBound}; #[cfg(feature = "try-runtime")] use sp_runtime::TryRuntimeError; - -use codec::{Decode, Encode}; -use frame_support::{pallet_prelude::*, storage_alias, DefaultNoBound}; use sp_std::{marker::PhantomData, prelude::*}; -mod old { +mod v10 { use super::*; #[derive(Encode, Decode, TypeInfo, MaxEncodedLen)] @@ -51,11 +50,11 @@ pub struct DeletionQueueManager { #[cfg(any(feature = "runtime-benchmarks", feature = "try-runtime"))] pub fn fill_old_queue(len: usize) { - let queue: Vec = - core::iter::repeat_with(|| old::DeletedContract { trie_id: Default::default() }) + let queue: Vec = + core::iter::repeat_with(|| v10::DeletedContract { trie_id: Default::default() }) .take(len) .collect(); - old::DeletionQueue::::set(Some(queue)); + v10::DeletionQueue::::set(Some(queue)); } #[storage_alias] @@ -79,9 +78,10 @@ impl MigrationStep for Migration { T::WeightInfo::v11_migration_step(128) } - fn step(&mut self) -> (IsFinished, Weight) { - let Some(old_queue) = old::DeletionQueue::::take() else { - return (IsFinished::Yes, Weight::zero()) + fn step(&mut self, meter: &mut WeightMeter) -> IsFinished { + let Some(old_queue) = v10::DeletionQueue::::take() else { + meter.consume(T::WeightInfo::v11_migration_step(0)); + return IsFinished::Yes }; let len = old_queue.len(); @@ -101,12 +101,13 @@ impl MigrationStep for Migration { >::set(queue); } - (IsFinished::Yes, T::WeightInfo::v11_migration_step(len as u32)) + meter.consume(T::WeightInfo::v11_migration_step(len as u32)); + IsFinished::Yes } #[cfg(feature = "try-runtime")] fn pre_upgrade_step() -> Result, TryRuntimeError> { - let old_queue = old::DeletionQueue::::take().unwrap_or_default(); + let old_queue = v10::DeletionQueue::::take().unwrap_or_default(); if old_queue.is_empty() { let len = 10u32; diff --git a/substrate/frame/contracts/src/migration/v12.rs b/substrate/frame/contracts/src/migration/v12.rs index 7dee31503101ba753b0e807d11621be711d4b58b..aad51a9edcab21ba408065ab5ddce75561f97f79 100644 --- a/substrate/frame/contracts/src/migration/v12.rs +++ b/substrate/frame/contracts/src/migration/v12.rs @@ -25,7 +25,8 @@ use crate::{ }; use codec::{Decode, Encode}; use frame_support::{ - pallet_prelude::*, storage_alias, traits::ReservableCurrency, DefaultNoBound, Identity, + pallet_prelude::*, storage_alias, traits::ReservableCurrency, weights::WeightMeter, + DefaultNoBound, Identity, }; use scale_info::prelude::format; use sp_core::hexdisplay::HexDisplay; @@ -34,7 +35,7 @@ use sp_runtime::TryRuntimeError; use sp_runtime::{traits::Zero, FixedPointNumber, FixedU128, Saturating}; use sp_std::prelude::*; -mod old { +mod v11 { use super::*; pub type BalanceOf = , #[codec(compact)] - deposit: old::BalanceOf, + deposit: v11::BalanceOf, #[codec(compact)] refcount: u64, determinism: Determinism, @@ -112,17 +113,17 @@ where let hash = T::Hashing::hash(&code); PristineCode::::insert(hash, code.clone()); - let module = old::PrefabWasmModule { + let module = v11::PrefabWasmModule { instruction_weights_version: Default::default(), initial: Default::default(), maximum: Default::default(), code, determinism: Determinism::Enforced, }; - old::CodeStorage::::insert(hash, module); + v11::CodeStorage::::insert(hash, module); - let info = old::OwnerInfo { owner: account, deposit: u32::MAX.into(), refcount: u64::MAX }; - old::OwnerInfoOf::::insert(hash, info); + let info = v11::OwnerInfo { owner: account, deposit: u32::MAX.into(), refcount: u64::MAX }; + v11::OwnerInfoOf::::insert(hash, info); } #[derive(Encode, Decode, MaxEncodedLen, DefaultNoBound)] @@ -146,18 +147,18 @@ where T::WeightInfo::v12_migration_step(T::MaxCodeLen::get()) } - fn step(&mut self) -> (IsFinished, Weight) { + fn step(&mut self, meter: &mut WeightMeter) -> IsFinished { let mut iter = if let Some(last_key) = self.last_code_hash.take() { - old::OwnerInfoOf::::iter_from( - old::OwnerInfoOf::::hashed_key_for(last_key), + v11::OwnerInfoOf::::iter_from( + v11::OwnerInfoOf::::hashed_key_for(last_key), ) } else { - old::OwnerInfoOf::::iter() + v11::OwnerInfoOf::::iter() }; if let Some((hash, old_info)) = iter.next() { log::debug!(target: LOG_TARGET, "Migrating OwnerInfo for code_hash {:?}", hash); - let module = old::CodeStorage::::take(hash) + let module = v11::CodeStorage::::take(hash) .expect(format!("No PrefabWasmModule found for code_hash: {:?}", hash).as_str()); let code_len = module.code.len(); @@ -184,7 +185,7 @@ where let bytes_before = module .encoded_size() .saturating_add(code_len) - .saturating_add(old::OwnerInfo::::max_encoded_len()) + .saturating_add(v11::OwnerInfo::::max_encoded_len()) as u32; let items_before = 3u32; let deposit_expected_before = price_per_byte @@ -230,10 +231,12 @@ where self.last_code_hash = Some(hash); - (IsFinished::No, T::WeightInfo::v12_migration_step(code_len as u32)) + meter.consume(T::WeightInfo::v12_migration_step(code_len as u32)); + IsFinished::No } else { log::debug!(target: LOG_TARGET, "No more OwnerInfo to migrate"); - (IsFinished::Yes, T::WeightInfo::v12_migration_step(0)) + meter.consume(T::WeightInfo::v12_migration_step(0)); + IsFinished::Yes } } @@ -241,10 +244,10 @@ where fn pre_upgrade_step() -> Result, TryRuntimeError> { let len = 100; log::debug!(target: LOG_TARGET, "Taking sample of {} OwnerInfo(s)", len); - let sample: Vec<_> = old::OwnerInfoOf::::iter() + let sample: Vec<_> = v11::OwnerInfoOf::::iter() .take(len) .map(|(k, v)| { - let module = old::CodeStorage::::get(k) + let module = v11::CodeStorage::::get(k) .expect("No PrefabWasmModule found for code_hash: {:?}"); let info: CodeInfo = CodeInfo { determinism: module.determinism, @@ -258,9 +261,9 @@ where .collect(); let storage: u32 = - old::CodeStorage::::iter().map(|(_k, v)| v.encoded_size() as u32).sum(); - let mut deposit: old::BalanceOf = Default::default(); - old::OwnerInfoOf::::iter().for_each(|(_k, v)| deposit += v.deposit); + v11::CodeStorage::::iter().map(|(_k, v)| v.encoded_size() as u32).sum(); + let mut deposit: v11::BalanceOf = Default::default(); + v11::OwnerInfoOf::::iter().for_each(|(_k, v)| deposit += v.deposit); Ok((sample, deposit, storage).encode()) } @@ -269,7 +272,7 @@ where fn post_upgrade_step(state: Vec) -> Result<(), TryRuntimeError> { let state = <( Vec<(CodeHash, CodeInfo)>, - old::BalanceOf, + v11::BalanceOf, u32, ) as Decode>::decode(&mut &state[..]) .unwrap(); @@ -283,7 +286,7 @@ where ensure!(info.refcount == old.refcount, "invalid refcount"); } - if let Some((k, _)) = old::CodeStorage::::iter().next() { + if let Some((k, _)) = v11::CodeStorage::::iter().next() { log::warn!( target: LOG_TARGET, "CodeStorage is still NOT empty, found code_hash: {:?}", @@ -292,7 +295,7 @@ where } else { log::debug!(target: LOG_TARGET, "CodeStorage is empty."); } - if let Some((k, _)) = old::OwnerInfoOf::::iter().next() { + if let Some((k, _)) = v11::OwnerInfoOf::::iter().next() { log::warn!( target: LOG_TARGET, "OwnerInfoOf is still NOT empty, found code_hash: {:?}", @@ -302,7 +305,7 @@ where log::debug!(target: LOG_TARGET, "OwnerInfoOf is empty."); } - let mut deposit: old::BalanceOf = Default::default(); + let mut deposit: v11::BalanceOf = Default::default(); let mut items = 0u32; let mut storage_info = 0u32; CodeInfoOf::::iter().for_each(|(_k, v)| { diff --git a/substrate/frame/contracts/src/migration/v13.rs b/substrate/frame/contracts/src/migration/v13.rs index dd2eb12eb62a5daf92cec8b5910c03f6d81ae0c0..6929bbce28e59f9032722b43b335a31da5cf485c 100644 --- a/substrate/frame/contracts/src/migration/v13.rs +++ b/substrate/frame/contracts/src/migration/v13.rs @@ -24,11 +24,11 @@ use crate::{ AccountIdOf, BalanceOf, CodeHash, Config, Pallet, TrieId, Weight, LOG_TARGET, }; use codec::{Decode, Encode}; -use frame_support::{pallet_prelude::*, storage_alias, DefaultNoBound}; +use frame_support::{pallet_prelude::*, storage_alias, weights::WeightMeter, DefaultNoBound}; use sp_runtime::BoundedBTreeMap; use sp_std::prelude::*; -mod old { +mod v12 { use super::*; #[derive(Encode, Decode, Clone, PartialEq, Eq, RuntimeDebug, TypeInfo, MaxEncodedLen)] @@ -59,7 +59,7 @@ pub fn store_old_contract_info(account: T::AccountId, info: crate::Co let entropy = (b"contract_depo_v1", account.clone()).using_encoded(T::Hashing::hash); let deposit_account = Decode::decode(&mut TrailingZeroInput::new(entropy.as_ref())) .expect("infinite length input; no invalid inputs for type; qed"); - let info = old::ContractInfo { + let info = v12::ContractInfo { trie_id: info.trie_id.clone(), deposit_account, code_hash: info.code_hash, @@ -69,7 +69,7 @@ pub fn store_old_contract_info(account: T::AccountId, info: crate::Co storage_item_deposit: Default::default(), storage_base_deposit: Default::default(), }; - old::ContractInfoOf::::insert(account, info); + v12::ContractInfoOf::::insert(account, info); } #[storage_alias] @@ -102,13 +102,13 @@ impl MigrationStep for Migration { T::WeightInfo::v13_migration_step() } - fn step(&mut self) -> (IsFinished, Weight) { + fn step(&mut self, meter: &mut WeightMeter) -> IsFinished { let mut iter = if let Some(last_account) = self.last_account.take() { - old::ContractInfoOf::::iter_from(old::ContractInfoOf::::hashed_key_for( + v12::ContractInfoOf::::iter_from(v12::ContractInfoOf::::hashed_key_for( last_account, )) } else { - old::ContractInfoOf::::iter() + v12::ContractInfoOf::::iter() }; if let Some((key, old)) = iter.next() { @@ -126,10 +126,12 @@ impl MigrationStep for Migration { }; ContractInfoOf::::insert(key.clone(), info); self.last_account = Some(key); - (IsFinished::No, T::WeightInfo::v13_migration_step()) + meter.consume(T::WeightInfo::v13_migration_step()); + IsFinished::No } else { log::debug!(target: LOG_TARGET, "No more contracts to migrate"); - (IsFinished::Yes, T::WeightInfo::v13_migration_step()) + meter.consume(T::WeightInfo::v13_migration_step()); + IsFinished::Yes } } } diff --git a/substrate/frame/contracts/src/migration/v14.rs b/substrate/frame/contracts/src/migration/v14.rs index 94534d05fdf889d05227149efd57ede584ecb013..017fd6d0c15b74cc8f4fe95d1faa23e91c3e6d5a 100644 --- a/substrate/frame/contracts/src/migration/v14.rs +++ b/substrate/frame/contracts/src/migration/v14.rs @@ -35,6 +35,7 @@ use frame_support::{ pallet_prelude::*, storage_alias, traits::{fungible::MutateHold, ReservableCurrency}, + weights::WeightMeter, DefaultNoBound, }; use sp_core::hexdisplay::HexDisplay; @@ -44,7 +45,7 @@ use sp_runtime::{traits::Zero, Saturating}; #[cfg(feature = "try-runtime")] use sp_std::collections::btree_map::BTreeMap; -mod old { +mod v13 { use super::*; pub type BalanceOf = , #[codec(compact)] - pub deposit: old::BalanceOf, + pub deposit: v13::BalanceOf, #[codec(compact)] pub refcount: u64, pub determinism: Determinism, @@ -86,14 +87,14 @@ where let code = vec![42u8; len as usize]; let hash = T::Hashing::hash(&code); - let info = old::CodeInfo { + let info = v13::CodeInfo { owner: account, deposit: 10_000u32.into(), refcount: u64::MAX, determinism: Determinism::Enforced, code_len: len, }; - old::CodeInfoOf::::insert(hash, info); + v13::CodeInfoOf::::insert(hash, info); } #[cfg(feature = "try-runtime")] @@ -105,9 +106,9 @@ where OldCurrency: ReservableCurrency<::AccountId>, { /// Total reserved balance as code upload deposit for the owner. - reserved: old::BalanceOf, + reserved: v13::BalanceOf, /// Total balance of the owner. - total: old::BalanceOf, + total: v13::BalanceOf, } #[derive(Encode, Decode, MaxEncodedLen, DefaultNoBound)] @@ -132,13 +133,13 @@ where T::WeightInfo::v14_migration_step() } - fn step(&mut self) -> (IsFinished, Weight) { + fn step(&mut self, meter: &mut WeightMeter) -> IsFinished { let mut iter = if let Some(last_hash) = self.last_code_hash.take() { - old::CodeInfoOf::::iter_from( - old::CodeInfoOf::::hashed_key_for(last_hash), + v13::CodeInfoOf::::iter_from( + v13::CodeInfoOf::::hashed_key_for(last_hash), ) } else { - old::CodeInfoOf::::iter() + v13::CodeInfoOf::::iter() }; if let Some((hash, code_info)) = iter.next() { @@ -185,16 +186,18 @@ where }); self.last_code_hash = Some(hash); - (IsFinished::No, T::WeightInfo::v14_migration_step()) + meter.consume(T::WeightInfo::v14_migration_step()); + IsFinished::No } else { log::debug!(target: LOG_TARGET, "No more code upload deposit to migrate"); - (IsFinished::Yes, T::WeightInfo::v14_migration_step()) + meter.consume(T::WeightInfo::v14_migration_step()); + IsFinished::Yes } } #[cfg(feature = "try-runtime")] fn pre_upgrade_step() -> Result, TryRuntimeError> { - let info: Vec<_> = old::CodeInfoOf::::iter().collect(); + let info: Vec<_> = v13::CodeInfoOf::::iter().collect(); let mut owner_balance_allocation = BTreeMap::, BalanceAllocation>::new(); diff --git a/substrate/frame/contracts/src/migration/v15.rs b/substrate/frame/contracts/src/migration/v15.rs index 180fe855ca66728ba18b17555363eeac11a340ba..3c700d1c0b021e1f4066d2c5993e39589924e6b7 100644 --- a/substrate/frame/contracts/src/migration/v15.rs +++ b/substrate/frame/contracts/src/migration/v15.rs @@ -36,6 +36,7 @@ use frame_support::{ fungible::{Mutate, MutateHold}, tokens::{fungible::Inspect, Fortitude, Preservation}, }, + weights::WeightMeter, BoundedBTreeMap, DefaultNoBound, }; use frame_system::Pallet as System; @@ -46,7 +47,7 @@ use sp_runtime::{traits::Zero, Saturating}; #[cfg(feature = "try-runtime")] use sp_std::vec::Vec; -mod old { +mod v14 { use super::*; #[derive( @@ -81,7 +82,7 @@ pub fn store_old_contract_info(account: T::AccountId, info: crate::Co let entropy = (b"contract_depo_v1", account.clone()).using_encoded(T::Hashing::hash); let deposit_account = Decode::decode(&mut TrailingZeroInput::new(entropy.as_ref())) .expect("infinite length input; no invalid inputs for type; qed"); - let info = old::ContractInfo { + let info = v14::ContractInfo { trie_id: info.trie_id.clone(), deposit_account, code_hash: info.code_hash, @@ -92,7 +93,7 @@ pub fn store_old_contract_info(account: T::AccountId, info: crate::Co storage_base_deposit: info.storage_base_deposit(), delegate_dependencies: info.delegate_dependencies().clone(), }; - old::ContractInfoOf::::insert(account, info); + v14::ContractInfoOf::::insert(account, info); } #[derive(Encode, Decode, CloneNoBound, PartialEq, Eq, RuntimeDebug, TypeInfo, MaxEncodedLen)] @@ -125,13 +126,13 @@ impl MigrationStep for Migration { T::WeightInfo::v15_migration_step() } - fn step(&mut self) -> (IsFinished, Weight) { + fn step(&mut self, meter: &mut WeightMeter) -> IsFinished { let mut iter = if let Some(last_account) = self.last_account.take() { - old::ContractInfoOf::::iter_from(old::ContractInfoOf::::hashed_key_for( + v14::ContractInfoOf::::iter_from(v14::ContractInfoOf::::hashed_key_for( last_account, )) } else { - old::ContractInfoOf::::iter() + v14::ContractInfoOf::::iter() }; if let Some((account, old_contract)) = iter.next() { @@ -234,20 +235,22 @@ impl MigrationStep for Migration { // Store last key for next migration step self.last_account = Some(account); - (IsFinished::No, T::WeightInfo::v15_migration_step()) + meter.consume(T::WeightInfo::v15_migration_step()); + IsFinished::No } else { log::info!(target: LOG_TARGET, "Done Migrating Storage Deposits."); - (IsFinished::Yes, T::WeightInfo::v15_migration_step()) + meter.consume(T::WeightInfo::v15_migration_step()); + IsFinished::Yes } } #[cfg(feature = "try-runtime")] fn pre_upgrade_step() -> Result, TryRuntimeError> { - let sample: Vec<_> = old::ContractInfoOf::::iter().take(100).collect(); + let sample: Vec<_> = v14::ContractInfoOf::::iter().take(100).collect(); log::debug!(target: LOG_TARGET, "Taking sample of {} contracts", sample.len()); - let state: Vec<(T::AccountId, old::ContractInfo, BalanceOf, BalanceOf)> = sample + let state: Vec<(T::AccountId, v14::ContractInfo, BalanceOf, BalanceOf)> = sample .iter() .map(|(account, contract)| { ( @@ -265,7 +268,7 @@ impl MigrationStep for Migration { #[cfg(feature = "try-runtime")] fn post_upgrade_step(state: Vec) -> Result<(), TryRuntimeError> { let sample = - , BalanceOf, BalanceOf)> as Decode>::decode( + , BalanceOf, BalanceOf)> as Decode>::decode( &mut &state[..], ) .expect("pre_upgrade_step provides a valid state; qed"); diff --git a/substrate/frame/contracts/src/migration/v16.rs b/substrate/frame/contracts/src/migration/v16.rs new file mode 100644 index 0000000000000000000000000000000000000000..74fbc997718d6fb6e13193c5735ea3aa074dfd79 --- /dev/null +++ b/substrate/frame/contracts/src/migration/v16.rs @@ -0,0 +1,107 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Remove ED from storage base deposit. +//! See . + +use crate::{ + migration::{IsFinished, MigrationStep}, + weights::WeightInfo, + BalanceOf, CodeHash, Config, Pallet, TrieId, Weight, WeightMeter, LOG_TARGET, +}; +use codec::{Decode, Encode}; +use frame_support::{pallet_prelude::*, storage_alias, DefaultNoBound}; +use sp_runtime::{BoundedBTreeMap, Saturating}; +use sp_std::prelude::*; + +#[cfg(feature = "runtime-benchmarks")] +pub fn store_old_contract_info( + account: T::AccountId, + info: &crate::ContractInfo, +) -> BalanceOf { + let storage_base_deposit = Pallet::::min_balance() + 1u32.into(); + ContractInfoOf::::insert( + account, + ContractInfo { + trie_id: info.trie_id.clone(), + code_hash: info.code_hash, + storage_bytes: Default::default(), + storage_items: Default::default(), + storage_byte_deposit: Default::default(), + storage_item_deposit: Default::default(), + storage_base_deposit, + delegate_dependencies: Default::default(), + }, + ); + + storage_base_deposit +} + +#[storage_alias] +pub type ContractInfoOf = + StorageMap, Twox64Concat, ::AccountId, ContractInfo>; + +#[derive(Encode, Decode, CloneNoBound, PartialEq, Eq, RuntimeDebug, TypeInfo, MaxEncodedLen)] +#[scale_info(skip_type_params(T))] +pub struct ContractInfo { + trie_id: TrieId, + code_hash: CodeHash, + storage_bytes: u32, + storage_items: u32, + storage_byte_deposit: BalanceOf, + storage_item_deposit: BalanceOf, + pub storage_base_deposit: BalanceOf, + delegate_dependencies: BoundedBTreeMap, BalanceOf, T::MaxDelegateDependencies>, +} + +#[derive(Encode, Decode, MaxEncodedLen, DefaultNoBound)] +pub struct Migration { + last_account: Option, +} + +impl MigrationStep for Migration { + const VERSION: u16 = 16; + + fn max_step_weight() -> Weight { + T::WeightInfo::v16_migration_step() + } + + fn step(&mut self, meter: &mut WeightMeter) -> IsFinished { + let mut iter = if let Some(last_account) = self.last_account.take() { + ContractInfoOf::::iter_keys_from(ContractInfoOf::::hashed_key_for(last_account)) + } else { + ContractInfoOf::::iter_keys() + }; + + if let Some(key) = iter.next() { + log::debug!(target: LOG_TARGET, "Migrating contract {:?}", key); + ContractInfoOf::::mutate(key.clone(), |info| { + let ed = Pallet::::min_balance(); + let mut updated_info = info.take().expect("Item exists; qed"); + updated_info.storage_base_deposit.saturating_reduce(ed); + *info = Some(updated_info); + }); + self.last_account = Some(key); + meter.consume(T::WeightInfo::v16_migration_step()); + IsFinished::No + } else { + log::debug!(target: LOG_TARGET, "No more contracts to migrate"); + meter.consume(T::WeightInfo::v16_migration_step()); + IsFinished::Yes + } + } +} diff --git a/substrate/frame/contracts/src/schedule.rs b/substrate/frame/contracts/src/schedule.rs index 51c7c0bd9dd1f0715fb1c5f9d78f4d9c6cfa1fb6..06a7c2005aa5e46e814d6eff192775ca63881fae 100644 --- a/substrate/frame/contracts/src/schedule.rs +++ b/substrate/frame/contracts/src/schedule.rs @@ -21,11 +21,11 @@ use crate::{weights::WeightInfo, Config}; use codec::{Decode, Encode}; +use core::marker::PhantomData; use frame_support::{weights::Weight, DefaultNoBound}; use scale_info::TypeInfo; #[cfg(feature = "std")] use serde::{Deserialize, Serialize}; -use sp_std::marker::PhantomData; /// Definition of the cost schedule and other parameterizations for the wasm vm. /// @@ -39,11 +39,7 @@ use sp_std::marker::PhantomData; /// fn create_schedule() -> Schedule { /// Schedule { /// limits: Limits { -/// globals: 3, -/// parameters: 3, /// memory_pages: 16, -/// table_size: 3, -/// br_table_size: 3, /// .. Default::default() /// }, /// instruction_weights: InstructionWeights { @@ -77,38 +73,9 @@ pub struct Limits { /// The maximum number of topics supported by an event. pub event_topics: u32, - /// Maximum number of globals a module is allowed to declare. - /// - /// Globals are not limited through the linear memory limit `memory_pages`. - pub globals: u32, - - /// Maximum number of locals a function can have. - /// - /// As wasm engine initializes each of the local, we need to limit their number to confine - /// execution costs. - pub locals: u32, - - /// Maximum numbers of parameters a function can have. - /// - /// Those need to be limited to prevent a potentially exploitable interaction with - /// the stack height instrumentation: The costs of executing the stack height - /// instrumentation for an indirectly called function scales linearly with the amount - /// of parameters of this function. Because the stack height instrumentation itself is - /// is not weight metered its costs must be static (via this limit) and included in - /// the costs of the instructions that cause them (call, call_indirect). - pub parameters: u32, - /// Maximum number of memory pages allowed for a contract. pub memory_pages: u32, - /// Maximum number of elements allowed in a table. - /// - /// Currently, the only type of element that is allowed in a table is funcref. - pub table_size: u32, - - /// Maximum number of elements that can appear as immediate value to the br_table instruction. - pub br_table_size: u32, - /// The maximum length of a subject in bytes used for PRNG generation. pub subject_len: u32, @@ -226,7 +193,7 @@ pub struct HostFnWeights { /// Weight of calling `seal_set_storage`. pub set_storage: Weight, - /// Weight per written byten of an item stored with `seal_set_storage`. + /// Weight per written byte of an item stored with `seal_set_storage`. pub set_storage_per_new_byte: Weight, /// Weight per overwritten byte of an item stored with `seal_set_storage`. @@ -331,11 +298,11 @@ pub struct HostFnWeights { /// Weight of calling `instantiation_nonce`. pub instantiation_nonce: Weight, - /// Weight of calling `add_delegate_dependency`. - pub add_delegate_dependency: Weight, + /// Weight of calling `lock_delegate_dependency`. + pub lock_delegate_dependency: Weight, - /// Weight of calling `remove_delegate_dependency`. - pub remove_delegate_dependency: Weight, + /// Weight of calling `unlock_delegate_dependency`. + pub unlock_delegate_dependency: Weight, /// The type parameter is used in the default implementation. #[codec(skip)] @@ -370,13 +337,7 @@ impl Default for Limits { fn default() -> Self { Self { event_topics: 4, - globals: 256, - locals: 1024, - parameters: 128, memory_pages: 16, - // 4k function pointers (This is in count not bytes). - table_size: 4096, - br_table_size: 256, subject_len: 32, payload_len: 16 * 1024, runtime_memory: 1024 * 1024 * 128, @@ -474,8 +435,8 @@ impl Default for HostFnWeights { reentrance_count: cost!(seal_reentrance_count), account_reentrance_count: cost!(seal_account_reentrance_count), instantiation_nonce: cost!(seal_instantiation_nonce), - add_delegate_dependency: cost!(add_delegate_dependency), - remove_delegate_dependency: cost!(remove_delegate_dependency), + lock_delegate_dependency: cost!(lock_delegate_dependency), + unlock_delegate_dependency: cost!(unlock_delegate_dependency), _phantom: PhantomData, } } diff --git a/substrate/frame/contracts/src/storage.rs b/substrate/frame/contracts/src/storage.rs index d4d261f4ec1ffcfc68c5245864b00ea2f47928ed..1e9739a1599eb8cc8137f2f0fabec8dd14d64b3a 100644 --- a/substrate/frame/contracts/src/storage.rs +++ b/substrate/frame/contracts/src/storage.rs @@ -23,12 +23,12 @@ use crate::{ exec::{AccountIdOf, Key}, weights::WeightInfo, BalanceOf, CodeHash, CodeInfo, Config, ContractInfoOf, DeletionQueue, DeletionQueueCounter, - Error, Pallet, TrieId, SENTINEL, + Error, TrieId, SENTINEL, }; use codec::{Decode, Encode, MaxEncodedLen}; use frame_support::{ storage::child::{self, ChildInfo}, - weights::Weight, + weights::{Weight, WeightMeter}, CloneNoBound, DefaultNoBound, }; use scale_info::TypeInfo; @@ -66,7 +66,7 @@ pub struct ContractInfo { storage_base_deposit: BalanceOf, /// Map of code hashes and deposit balances. /// - /// Tracks the code hash and deposit held for adding delegate dependencies. Dependencies added + /// Tracks the code hash and deposit held for locking delegate dependencies. Dependencies added /// to the map can not be removed from the chain state and can be safely used for delegate /// calls. delegate_dependencies: BoundedBTreeMap, BalanceOf, T::MaxDelegateDependencies>, @@ -108,6 +108,11 @@ impl ContractInfo { Ok(contract) } + /// Returns the number of locked delegate dependencies. + pub fn delegate_dependencies_count(&self) -> usize { + self.delegate_dependencies.len() + } + /// Associated child trie unique id is built from the hash part of the trie id. pub fn child_trie_info(&self) -> ChildInfo { ChildInfo::new_default(self.trie_id.as_ref()) @@ -120,9 +125,7 @@ impl ContractInfo { /// Same as [`Self::extra_deposit`] but including the base deposit. pub fn total_deposit(&self) -> BalanceOf { - self.extra_deposit() - .saturating_add(self.storage_base_deposit) - .saturating_sub(Pallet::::min_balance()) + self.extra_deposit().saturating_add(self.storage_base_deposit) } /// Returns the storage base deposit of the contract. @@ -208,7 +211,6 @@ impl ContractInfo { /// The base deposit is updated when the `code_hash` of the contract changes, as it depends on /// the deposit paid to upload the contract's code. pub fn update_base_deposit(&mut self, code_info: &CodeInfo) -> BalanceOf { - let ed = Pallet::::min_balance(); let info_deposit = Diff { bytes_added: self.encoded_size() as u32, items_added: 1, ..Default::default() } .update_contract::(None) @@ -219,11 +221,7 @@ impl ContractInfo { // to prevent abuse. let upload_deposit = T::CodeHashLockupDepositPercent::get().mul_ceil(code_info.deposit()); - // Instantiate needs to transfer at least the minimum balance in order to pull the - // contract's own account into existence, as the deposit itself does not contribute to the - // `ed`. - let deposit = info_deposit.saturating_add(upload_deposit).saturating_add(ed); - + let deposit = info_deposit.saturating_add(upload_deposit); self.storage_base_deposit = deposit; deposit } @@ -233,7 +231,7 @@ impl ContractInfo { /// /// Returns an error if the maximum number of delegate_dependencies is reached or if /// the delegate dependency already exists. - pub fn add_delegate_dependency( + pub fn lock_delegate_dependency( &mut self, code_hash: CodeHash, amount: BalanceOf, @@ -249,7 +247,7 @@ impl ContractInfo { /// dependency. /// /// Returns an error if the entry doesn't exist. - pub fn remove_delegate_dependency( + pub fn unlock_delegate_dependency( &mut self, code_hash: &CodeHash, ) -> Result, DispatchError> { @@ -274,14 +272,15 @@ impl ContractInfo { /// Calculates the weight that is necessary to remove one key from the trie and how many /// of those keys can be deleted from the deletion queue given the supplied weight limit. - pub fn deletion_budget(weight_limit: Weight) -> (Weight, u32) { + pub fn deletion_budget(meter: &WeightMeter) -> (Weight, u32) { let base_weight = T::WeightInfo::on_process_deletion_queue_batch(); let weight_per_key = T::WeightInfo::on_initialize_per_trie_key(1) - T::WeightInfo::on_initialize_per_trie_key(0); // `weight_per_key` being zero makes no sense and would constitute a failure to // benchmark properly. We opt for not removing any keys at all in this case. - let key_budget = weight_limit + let key_budget = meter + .limit() .saturating_sub(base_weight) .checked_div_per_component(&weight_per_key) .unwrap_or(0) as u32; @@ -290,24 +289,18 @@ impl ContractInfo { } /// Delete as many items from the deletion queue possible within the supplied weight limit. - /// - /// It returns the amount of weight used for that task. - pub fn process_deletion_queue_batch(weight_limit: Weight) -> Weight { - let mut queue = >::load(); + pub fn process_deletion_queue_batch(meter: &mut WeightMeter) { + if meter.try_consume(T::WeightInfo::on_process_deletion_queue_batch()).is_err() { + return + }; + let mut queue = >::load(); if queue.is_empty() { - return Weight::zero() - } - - let (weight_per_key, mut remaining_key_budget) = Self::deletion_budget(weight_limit); - - // We want to check whether we have enough weight to decode the queue before - // proceeding. Too little weight for decoding might happen during runtime upgrades - // which consume the whole block before the other `on_initialize` blocks are called. - if remaining_key_budget == 0 { - return weight_limit + return; } + let (weight_per_key, budget) = Self::deletion_budget(&meter); + let mut remaining_key_budget = budget; while remaining_key_budget > 0 { let Some(entry) = queue.next() else { break }; @@ -319,15 +312,19 @@ impl ContractInfo { match outcome { // This happens when our budget wasn't large enough to remove all keys. - KillStorageResult::SomeRemaining(_) => return weight_limit, + KillStorageResult::SomeRemaining(keys_removed) => { + remaining_key_budget.saturating_reduce(keys_removed); + break + }, KillStorageResult::AllRemoved(keys_removed) => { entry.remove(); - remaining_key_budget = remaining_key_budget.saturating_sub(keys_removed); + // charge at least one key even if none were removed. + remaining_key_budget = remaining_key_budget.saturating_sub(keys_removed.max(1)); }, }; } - weight_limit.saturating_sub(weight_per_key.saturating_mul(u64::from(remaining_key_budget))) + meter.consume(weight_per_key.saturating_mul(u64::from(budget - remaining_key_budget))) } /// Returns the code hash of the contract specified by `account` ID. diff --git a/substrate/frame/contracts/src/storage/meter.rs b/substrate/frame/contracts/src/storage/meter.rs index 495cbd90db5a2424e3a5303d7fce9ded7750314e..5db9a772ad82155348383153de04ef31bdcfe4cf 100644 --- a/substrate/frame/contracts/src/storage/meter.rs +++ b/substrate/frame/contracts/src/storage/meter.rs @@ -435,22 +435,12 @@ where contract: &T::AccountId, contract_info: &mut ContractInfo, code_info: &CodeInfo, - ) -> Result, DispatchError> { + ) -> Result<(), DispatchError> { debug_assert!(matches!(self.contract_state(), ContractState::Alive)); - let ed = Pallet::::min_balance(); - - let deposit = contract_info.update_base_deposit(&code_info); - if deposit > self.limit { - return Err(>::StorageDepositLimitExhausted.into()) - } - - let deposit = Deposit::Charge(deposit); - - // We do not increase `own_contribution` because this will be charged later when the - // contract execution does conclude and hence would lead to a double charge. - self.total_deposit = Deposit::Charge(ed); // We need to make sure that the contract's account exists. + let ed = Pallet::::min_balance(); + self.total_deposit = Deposit::Charge(ed); T::Currency::transfer(origin, contract, ed, Preservation::Preserve)?; // A consumer is added at account creation and removed it on termination, otherwise the @@ -458,9 +448,11 @@ where // With the consumer, a correct runtime cannot remove the account. System::::inc_consumers(contract)?; - self.charge_deposit(contract.clone(), deposit.saturating_sub(&Deposit::Charge(ed))); + let deposit = contract_info.update_base_deposit(&code_info); + let deposit = Deposit::Charge(deposit); - Ok(deposit) + self.charge_deposit(contract.clone(), deposit); + Ok(()) } /// Call to tell the meter that the currently executing contract was terminated. @@ -859,14 +851,14 @@ mod tests { let test_cases = vec![ ChargingTestCase { origin: Origin::::from_account_id(ALICE), - deposit: Deposit::Refund(107), + deposit: Deposit::Refund(108), expected: TestExt { limit_checks: vec![LimitCheck { origin: ALICE, limit: 1_000, min_leftover: 0 }], charges: vec![ Charge { origin: ALICE, contract: CHARLIE, - amount: Deposit::Refund(119), + amount: Deposit::Refund(120), state: ContractState::Terminated { beneficiary: CHARLIE }, }, Charge { @@ -915,7 +907,6 @@ mod tests { meter.absorb(nested0, &BOB, None); assert_eq!(meter.try_into_deposit(&test_case.origin).unwrap(), test_case.deposit); - assert_eq!(TestExtTestValue::get(), test_case.expected) } } diff --git a/substrate/frame/contracts/src/tests.rs b/substrate/frame/contracts/src/tests.rs index 5711d3ccc83a527fae49f4ea6397a5a4b5fe54a9..0b83358a7f56a134a938076aab5f20b5915f0826 100644 --- a/substrate/frame/contracts/src/tests.rs +++ b/substrate/frame/contracts/src/tests.rs @@ -15,6 +15,7 @@ // See the License for the specific language governing permissions and // limitations under the License. +mod builder; mod pallet_dummy; mod test_debug; @@ -33,18 +34,19 @@ use crate::{ primitives::CodeUploadReturnValue, storage::DeletionQueueManager, tests::test_utils::{get_contract, get_contract_checked}, - wasm::{Determinism, ReturnErrorCode as RuntimeReturnCode}, + wasm::{Determinism, LoadingMode, ReturnErrorCode as RuntimeReturnCode}, weights::WeightInfo, - BalanceOf, Code, CodeHash, CodeInfoOf, CollectEvents, Config, ContractInfo, ContractInfoOf, - DebugInfo, DefaultAddressGenerator, DeletionQueueCounter, Error, HoldReason, + Array, BalanceOf, Code, CodeHash, CodeInfoOf, CollectEvents, Config, ContractInfo, + ContractInfoOf, DebugInfo, DefaultAddressGenerator, DeletionQueueCounter, Error, HoldReason, MigrationInProgress, Origin, Pallet, PristineCode, Schedule, }; use assert_matches::assert_matches; -use codec::Encode; +use codec::{Decode, Encode}; use frame_support::{ assert_err, assert_err_ignore_postinfo, assert_err_with_weight, assert_noop, assert_ok, derive_impl, dispatch::{DispatchErrorWithPostInfo, PostDispatchInfo}, + pallet_prelude::EnsureOrigin, parameter_types, storage::child, traits::{ @@ -52,7 +54,7 @@ use frame_support::{ tokens::Preservation, ConstU32, ConstU64, Contains, OnIdle, OnInitialize, StorageVersion, }, - weights::{constants::WEIGHT_REF_TIME_PER_SECOND, Weight}, + weights::{constants::WEIGHT_REF_TIME_PER_SECOND, Weight, WeightMeter}, }; use frame_system::{EventRecord, Phase}; use pallet_contracts_fixtures::compile_module; @@ -217,8 +219,6 @@ impl ChainExtension for TestExtension { where E: Ext, { - use codec::Decode; - let func_id = env.func_id(); let id = env.ext_id() as u32 | func_id as u32; match func_id { @@ -332,31 +332,12 @@ parameter_types! { pub static ExistentialDeposit: u64 = 1; } -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { - type BaseCallFilter = frame_support::traits::Everything; - type BlockWeights = BlockWeights; - type BlockLength = (); - type DbWeight = (); - type RuntimeOrigin = RuntimeOrigin; - type Nonce = u64; - type Hash = H256; - type RuntimeCall = RuntimeCall; - type Hashing = BlakeTwo256; type AccountId = AccountId32; type Lookup = IdentityLookup; type Block = Block; - type RuntimeEvent = RuntimeEvent; - type BlockHashCount = ConstU64<250>; - type Version = (); - type PalletInfo = PalletInfo; type AccountData = pallet_balances::AccountData; - type OnNewAccount = (); - type OnKilledAccount = (); - type SystemWeightInfo = (); - type SS58Prefix = (); - type OnSetCode = (); - type MaxConsumers = frame_support::traits::ConstU32<16>; } impl pallet_insecure_randomness_collective_flip::Config for Test {} impl pallet_balances::Config for Test { @@ -455,6 +436,33 @@ impl Contains for TestFilter { } } +parameter_types! { + pub static UploadAccount: Option<::AccountId> = None; + pub static InstantiateAccount: Option<::AccountId> = None; +} + +pub struct EnsureAccount(sp_std::marker::PhantomData<(T, A)>); +impl>>> + EnsureOrigin<::RuntimeOrigin> for EnsureAccount +where + ::AccountId: From, +{ + type Success = T::AccountId; + + fn try_origin(o: T::RuntimeOrigin) -> Result { + let who = as EnsureOrigin<_>>::try_origin(o.clone())?; + if matches!(A::get(), Some(a) if who != a) { + return Err(o) + } + + Ok(who) + } + + #[cfg(feature = "runtime-benchmarks")] + fn try_successful_origin() -> Result { + Err(()) + } +} parameter_types! { pub static UnstableInterface: bool = true; } @@ -479,6 +487,8 @@ impl Config for Test { type MaxCodeLen = ConstU32<{ 123 * 1024 }>; type MaxStorageKeyLen = ConstU32<128>; type UnsafeUnstableInterface = UnstableInterface; + type UploadOrigin = EnsureAccount; + type InstantiateOrigin = EnsureAccount; type MaxDebugBufferLen = ConstU32<{ 2 * 1024 * 1024 }>; type RuntimeHoldReason = RuntimeHoldReason; type Migrations = crate::migration::codegen::BenchMigrations; @@ -486,6 +496,7 @@ impl Config for Test { type MaxDelegateDependencies = MaxDelegateDependencies; type Debug = TestDebug; type Environment = (); + type ApiVersion = (); type Xcm = (); } @@ -600,7 +611,7 @@ fn calling_plain_account_fails() { let base_cost = <::WeightInfo as WeightInfo>::call(); assert_eq!( - Contracts::call(RuntimeOrigin::signed(ALICE), BOB, 0, GAS_LIMIT, None, Vec::new()), + builder::call(BOB).build(), Err(DispatchErrorWithPostInfo { error: Error::::ContractNotFound.into(), post_info: PostDispatchInfo { @@ -658,32 +669,13 @@ fn migration_in_progress_works() { Contracts::set_code(RuntimeOrigin::signed(ALICE), BOB.clone(), code_hash), Error::::MigrationInProgress, ); + assert_err_ignore_postinfo!(builder::call(BOB).build(), Error::::MigrationInProgress); assert_err_ignore_postinfo!( - Contracts::call(RuntimeOrigin::signed(ALICE), BOB, 0, GAS_LIMIT, None, vec![],), - Error::::MigrationInProgress, - ); - assert_err_ignore_postinfo!( - Contracts::instantiate_with_code( - RuntimeOrigin::signed(ALICE), - 100_000, - GAS_LIMIT, - None, - wasm, - vec![], - vec![], - ), + builder::instantiate_with_code(wasm).value(100_000).build(), Error::::MigrationInProgress, ); assert_err_ignore_postinfo!( - Contracts::instantiate( - RuntimeOrigin::signed(ALICE), - 100_000, - GAS_LIMIT, - None, - code_hash, - vec![], - vec![], - ), + builder::instantiate(code_hash).value(100_000).build(), Error::::MigrationInProgress, ); }); @@ -711,20 +703,9 @@ fn instantiate_and_call_and_deposit_event() { initialize_block(2); // Check at the end to get hash on error easily - let addr = Contracts::bare_instantiate( - ALICE, - value, - GAS_LIMIT, - None, - Code::Existing(code_hash), - vec![], - vec![], - DebugInfo::Skip, - CollectEvents::Skip, - ) - .result - .unwrap() - .account_id; + let addr = builder::bare_instantiate(Code::Existing(code_hash)) + .value(value) + .build_and_unwrap_account_id(); assert!(ContractInfoOf::::contains_key(&addr)); assert_eq!( @@ -802,67 +783,26 @@ fn deposit_event_max_value_limit() { ExtBuilder::default().existential_deposit(50).build().execute_with(|| { // Create let _ = ::Currency::set_balance(&ALICE, 1_000_000); - let addr = Contracts::bare_instantiate( - ALICE, - 30_000, - GAS_LIMIT, - None, - Code::Upload(wasm), - vec![], - vec![], - DebugInfo::Skip, - CollectEvents::Skip, - ) - .result - .unwrap() - .account_id; + let addr = builder::bare_instantiate(Code::Upload(wasm)) + .value(30_000) + .build_and_unwrap_account_id(); // Call contract with allowed storage value. - assert_ok!(Contracts::call( - RuntimeOrigin::signed(ALICE), - addr.clone(), - 0, - GAS_LIMIT.set_ref_time(GAS_LIMIT.ref_time() * 2), // we are copying a huge buffer, - None, - ::Schedule::get().limits.payload_len.encode(), - )); + assert_ok!(builder::call(addr.clone()) + .gas_limit(GAS_LIMIT.set_ref_time(GAS_LIMIT.ref_time() * 2)) // we are copying a huge buffer, + .data(::Schedule::get().limits.payload_len.encode()) + .build()); // Call contract with too large a storage value. assert_err_ignore_postinfo!( - Contracts::call( - RuntimeOrigin::signed(ALICE), - addr, - 0, - GAS_LIMIT, - None, - (::Schedule::get().limits.payload_len + 1).encode(), - ), + builder::call(addr) + .data((::Schedule::get().limits.payload_len + 1).encode()) + .build(), Error::::ValueTooLarge, ); }); } -// Fail out of fuel (ref_time weight) inside the start function. -#[test] -fn run_out_of_fuel_start_fun() { - let (wasm, _code_hash) = compile_module::("run_out_of_gas_start_fn").unwrap(); - ExtBuilder::default().existential_deposit(50).build().execute_with(|| { - let _ = ::Currency::set_balance(&ALICE, 1_000_000); - assert_err_ignore_postinfo!( - Contracts::instantiate_with_code( - RuntimeOrigin::signed(ALICE), - 0, - Weight::from_parts(1_000_000_000_000, u64::MAX), - None, - wasm, - vec![], - vec![], - ), - Error::::OutOfGas, - ); - }); -} - // Fail out of fuel (ref_time weight) in the engine. #[test] fn run_out_of_fuel_engine() { @@ -871,32 +811,16 @@ fn run_out_of_fuel_engine() { let min_balance = Contracts::min_balance(); let _ = ::Currency::set_balance(&ALICE, 1_000_000); - let addr = Contracts::bare_instantiate( - ALICE, - 100 * min_balance, - GAS_LIMIT, - None, - Code::Upload(wasm), - vec![], - vec![], - DebugInfo::Skip, - CollectEvents::Skip, - ) - .result - .unwrap() - .account_id; + let addr = builder::bare_instantiate(Code::Upload(wasm)) + .value(100 * min_balance) + .build_and_unwrap_account_id(); // Call the contract with a fixed gas limit. It must run out of gas because it just // loops forever. assert_err_ignore_postinfo!( - Contracts::call( - RuntimeOrigin::signed(ALICE), - addr, // newly created account - 0, - Weight::from_parts(1_000_000_000_000, u64::MAX), - None, - vec![], - ), + builder::call(addr) + .gas_limit(Weight::from_parts(1_000_000_000_000, u64::MAX)) + .build(), Error::::OutOfGas, ); }); @@ -910,136 +834,41 @@ fn run_out_of_fuel_host() { let min_balance = Contracts::min_balance(); let _ = ::Currency::set_balance(&ALICE, 1000 * min_balance); - let addr = Contracts::bare_instantiate( - ALICE, - min_balance * 100, - GAS_LIMIT, - None, - Code::Upload(code), - vec![], - vec![], - DebugInfo::Skip, - CollectEvents::Skip, - ) - .result - .unwrap() - .account_id; + let addr = builder::bare_instantiate(Code::Upload(code)) + .value(min_balance * 100) + .build_and_unwrap_account_id(); let gas_limit = Weight::from_parts(u32::MAX as u64, GAS_LIMIT.proof_size()); // Use chain extension to charge more ref_time than it is available. - let result = Contracts::bare_call( - ALICE, - addr.clone(), - 0, - gas_limit, - None, - ExtensionInput { extension_id: 0, func_id: 2, extra: &u32::MAX.encode() }.into(), - DebugInfo::Skip, - CollectEvents::Skip, - Determinism::Enforced, - ) - .result; + let result = builder::bare_call(addr.clone()) + .gas_limit(gas_limit) + .data(ExtensionInput { extension_id: 0, func_id: 2, extra: &u32::MAX.encode() }.into()) + .build() + .result; assert_err!(result, >::OutOfGas); }); } #[test] fn gas_syncs_work() { - let (wasm0, _code_hash) = compile_module::("seal_input_noop").unwrap(); - let (wasm1, _code_hash) = compile_module::("seal_input_once").unwrap(); - let (wasm2, _code_hash) = compile_module::("seal_input_twice").unwrap(); + let (code, _code_hash) = compile_module::("caller_is_origin_n").unwrap(); ExtBuilder::default().existential_deposit(200).build().execute_with(|| { let _ = ::Currency::set_balance(&ALICE, 1_000_000); - // Instantiate noop contract. - let addr0 = Contracts::bare_instantiate( - ALICE, - 0, - GAS_LIMIT, - None, - Code::Upload(wasm0), - vec![], - vec![], - DebugInfo::Skip, - CollectEvents::Skip, - ) - .result - .unwrap() - .account_id; - - // Instantiate 1st contract. - let addr1 = Contracts::bare_instantiate( - ALICE, - 0, - GAS_LIMIT, - None, - Code::Upload(wasm1), - vec![], - vec![], - DebugInfo::Skip, - CollectEvents::Skip, - ) - .result - .unwrap() - .account_id; - - // Instantiate 2nd contract. - let addr2 = Contracts::bare_instantiate( - ALICE, - 0, - GAS_LIMIT, - None, - Code::Upload(wasm2), - vec![], - vec![], - DebugInfo::Skip, - CollectEvents::Skip, - ) - .result - .unwrap() - .account_id; - - let result = Contracts::bare_call( - ALICE, - addr0, - 0, - GAS_LIMIT, - None, - 1u8.to_le_bytes().to_vec(), - DebugInfo::Skip, - CollectEvents::Skip, - Determinism::Enforced, - ); + let addr = builder::bare_instantiate(Code::Upload(code)).build_and_unwrap_account_id(); + + let result = builder::bare_call(addr.clone()).data(0u32.encode()).build(); assert_ok!(result.result); let engine_consumed_noop = result.gas_consumed.ref_time(); - let result = Contracts::bare_call( - ALICE, - addr1, - 0, - GAS_LIMIT, - None, - 1u8.to_le_bytes().to_vec(), - DebugInfo::Skip, - CollectEvents::Skip, - Determinism::Enforced, - ); + let result = builder::bare_call(addr.clone()).data(1u32.encode()).build(); assert_ok!(result.result); let gas_consumed_once = result.gas_consumed.ref_time(); - let host_consumed_once = ::Schedule::get().host_fn_weights.input.ref_time(); + let host_consumed_once = + ::Schedule::get().host_fn_weights.caller_is_origin.ref_time(); let engine_consumed_once = gas_consumed_once - host_consumed_once - engine_consumed_noop; - let result = Contracts::bare_call( - ALICE, - addr2, - 0, - GAS_LIMIT, - None, - 1u8.to_le_bytes().to_vec(), - DebugInfo::Skip, - CollectEvents::Skip, - Determinism::Enforced, - ); + let result = builder::bare_call(addr).data(2u32.encode()).build(); assert_ok!(result.result); let gas_consumed_twice = result.gas_consumed.ref_time(); let host_consumed_twice = host_consumed_once * 2; @@ -1063,62 +892,42 @@ fn instantiate_unique_trie_id() { .unwrap(); // Instantiate the contract and store its trie id for later comparison. - let addr = Contracts::bare_instantiate( - ALICE, - 0, - GAS_LIMIT, - None, - Code::Existing(code_hash), - vec![], - vec![], - DebugInfo::Skip, - CollectEvents::Skip, - ) - .result - .unwrap() - .account_id; + let addr = + builder::bare_instantiate(Code::Existing(code_hash)).build_and_unwrap_account_id(); let trie_id = get_contract(&addr).trie_id; // Try to instantiate it again without termination should yield an error. assert_err_ignore_postinfo!( - Contracts::instantiate( - RuntimeOrigin::signed(ALICE), - 0, - GAS_LIMIT, - None, - code_hash, - vec![], - vec![], - ), + builder::instantiate(code_hash).build(), >::DuplicateContract, ); // Terminate the contract. - assert_ok!(Contracts::call( - RuntimeOrigin::signed(ALICE), - addr.clone(), - 0, - GAS_LIMIT, - None, - vec![] - )); + assert_ok!(builder::call(addr.clone()).build()); // Re-Instantiate after termination. - assert_ok!(Contracts::instantiate( - RuntimeOrigin::signed(ALICE), - 0, - GAS_LIMIT, - None, - code_hash, - vec![], - vec![], - )); + assert_ok!(builder::instantiate(code_hash).build()); // Trie ids shouldn't match or we might have a collision assert_ne!(trie_id, get_contract(&addr).trie_id); }); } +#[test] +fn storage_work() { + let (code, _code_hash) = compile_module::("storage").unwrap(); + + ExtBuilder::default().build().execute_with(|| { + let _ = ::Currency::set_balance(&ALICE, 1_000_000); + let min_balance = Contracts::min_balance(); + let addr = builder::bare_instantiate(Code::Upload(code)) + .value(min_balance * 100) + .build_and_unwrap_account_id(); + + builder::bare_call(addr).build_and_unwrap_result(); + }); +} + #[test] fn storage_max_value_limit() { let (wasm, _code_hash) = compile_module::("storage_size").unwrap(); @@ -1126,42 +935,22 @@ fn storage_max_value_limit() { ExtBuilder::default().existential_deposit(50).build().execute_with(|| { // Create let _ = ::Currency::set_balance(&ALICE, 1_000_000); - let addr = Contracts::bare_instantiate( - ALICE, - 30_000, - GAS_LIMIT, - None, - Code::Upload(wasm), - vec![], - vec![], - DebugInfo::Skip, - CollectEvents::Skip, - ) - .result - .unwrap() - .account_id; + let addr = builder::bare_instantiate(Code::Upload(wasm)) + .value(30_000) + .build_and_unwrap_account_id(); get_contract(&addr); // Call contract with allowed storage value. - assert_ok!(Contracts::call( - RuntimeOrigin::signed(ALICE), - addr.clone(), - 0, - GAS_LIMIT.set_ref_time(GAS_LIMIT.ref_time() * 2), // we are copying a huge buffer - None, - ::Schedule::get().limits.payload_len.encode(), - )); + assert_ok!(builder::call(addr.clone()) + .gas_limit(GAS_LIMIT.set_ref_time(GAS_LIMIT.ref_time() * 2)) // we are copying a huge buffer + .data(::Schedule::get().limits.payload_len.encode()) + .build()); // Call contract with too large a storage value. assert_err_ignore_postinfo!( - Contracts::call( - RuntimeOrigin::signed(ALICE), - addr, - 0, - GAS_LIMIT, - None, - (::Schedule::get().limits.payload_len + 1).encode(), - ), + builder::call(addr) + .data((::Schedule::get().limits.payload_len + 1).encode()) + .build(), Error::::ValueTooLarge, ); }); @@ -1177,20 +966,9 @@ fn deploy_and_call_other_contract() { // Create let _ = ::Currency::set_balance(&ALICE, 1_000_000); - let caller_addr = Contracts::bare_instantiate( - ALICE, - 100_000, - GAS_LIMIT, - None, - Code::Upload(caller_wasm), - vec![], - vec![], - DebugInfo::Skip, - CollectEvents::Skip, - ) - .result - .unwrap() - .account_id; + let caller_addr = builder::bare_instantiate(Code::Upload(caller_wasm)) + .value(100_000) + .build_and_unwrap_account_id(); Contracts::bare_upload_code(ALICE, callee_wasm, None, Determinism::Enforced).unwrap(); let callee_addr = Contracts::contract_address( @@ -1205,14 +983,9 @@ fn deploy_and_call_other_contract() { // Call BOB contract, which attempts to instantiate and call the callee contract and // makes various assertions on the results from those calls. - assert_ok!(Contracts::call( - RuntimeOrigin::signed(ALICE), - caller_addr.clone(), - 0, - GAS_LIMIT, - None, - callee_code_hash.as_ref().to_vec(), - )); + assert_ok!(builder::call(caller_addr.clone()) + .data(callee_code_hash.as_ref().to_vec()) + .build()); assert_eq!( System::events(), @@ -1311,20 +1084,9 @@ fn delegate_call() { let _ = ::Currency::set_balance(&ALICE, 1_000_000); // Instantiate the 'caller' - let caller_addr = Contracts::bare_instantiate( - ALICE, - 300_000, - GAS_LIMIT, - None, - Code::Upload(caller_wasm), - vec![], - vec![], - DebugInfo::Skip, - CollectEvents::Skip, - ) - .result - .unwrap() - .account_id; + let caller_addr = builder::bare_instantiate(Code::Upload(caller_wasm)) + .value(300_000) + .build_and_unwrap_account_id(); // Only upload 'callee' code assert_ok!(Contracts::upload_code( RuntimeOrigin::signed(ALICE), @@ -1333,15 +1095,25 @@ fn delegate_call() { Determinism::Enforced, )); - assert_ok!(Contracts::call( - RuntimeOrigin::signed(ALICE), - caller_addr.clone(), - 1337, - GAS_LIMIT, - None, - callee_code_hash.as_ref().to_vec(), - )); + assert_ok!(builder::call(caller_addr.clone()) + .value(1337) + .data(callee_code_hash.as_ref().to_vec()) + .build()); + }); +} + +#[test] +fn track_check_uncheck_module_call() { + let (wasm, code_hash) = compile_module::("dummy").unwrap(); + ExtBuilder::default().build().execute_with(|| { + let _ = ::Currency::set_balance(&ALICE, 1_000_000); + Contracts::bare_upload_code(ALICE, wasm, None, Determinism::Enforced).unwrap(); + builder::bare_instantiate(Code::Existing(code_hash)).build_and_unwrap_result(); }); + + // It should have recorded 1 `Checked` for the upload and 1 `Unchecked` for the instantiate. + let record = crate::wasm::tracker::LOADED_MODULE.with(|stack| stack.borrow().clone()); + assert_eq!(record, vec![LoadingMode::Checked, LoadingMode::Unchecked]); } #[test] @@ -1351,20 +1123,9 @@ fn transfer_expendable_cannot_kill_account() { let _ = ::Currency::set_balance(&ALICE, 1_000_000); // Instantiate the BOB contract. - let addr = Contracts::bare_instantiate( - ALICE, - 1_000, - GAS_LIMIT, - None, - Code::Upload(wasm), - vec![], - vec![], - DebugInfo::Skip, - CollectEvents::Skip, - ) - .result - .unwrap() - .account_id; + let addr = builder::bare_instantiate(Code::Upload(wasm)) + .value(1_000) + .build_and_unwrap_account_id(); // Check that the BOB contract has been instantiated. get_contract(&addr); @@ -1392,7 +1153,7 @@ fn transfer_expendable_cannot_kill_account() { } #[test] -fn cannot_self_destruct_through_draning() { +fn cannot_self_destruct_through_draining() { let (wasm, _code_hash) = compile_module::("drain").unwrap(); ExtBuilder::default().existential_deposit(200).build().execute_with(|| { let _ = ::Currency::set_balance(&ALICE, 1_000_000); @@ -1400,34 +1161,16 @@ fn cannot_self_destruct_through_draning() { let min_balance = Contracts::min_balance(); // Instantiate the BOB contract. - let addr = Contracts::bare_instantiate( - ALICE, - value, - GAS_LIMIT, - None, - Code::Upload(wasm), - vec![], - vec![], - DebugInfo::Skip, - CollectEvents::Skip, - ) - .result - .unwrap() - .account_id; + let addr = builder::bare_instantiate(Code::Upload(wasm)) + .value(value) + .build_and_unwrap_account_id(); // Check that the BOB contract has been instantiated. get_contract(&addr); // Call BOB which makes it send all funds to the zero address // The contract code asserts that the transfer fails with the correct error code - assert_ok!(Contracts::call( - RuntimeOrigin::signed(ALICE), - addr.clone(), - 0, - GAS_LIMIT, - None, - vec![] - )); + assert_ok!(builder::call(addr.clone()).build()); // Make sure the account wasn't remove by sending all free balance away. assert_eq!( @@ -1445,20 +1188,7 @@ fn cannot_self_destruct_through_storage_refund_after_price_change() { let min_balance = Contracts::min_balance(); // Instantiate the BOB contract. - let addr = Contracts::bare_instantiate( - ALICE, - 0, - GAS_LIMIT, - None, - Code::Upload(wasm), - vec![], - vec![], - DebugInfo::Skip, - CollectEvents::Skip, - ) - .result - .unwrap() - .account_id; + let addr = builder::bare_instantiate(Code::Upload(wasm)).build_and_unwrap_account_id(); let info_deposit = test_utils::contract_info_storage_deposit(&addr); @@ -1468,27 +1198,13 @@ fn cannot_self_destruct_through_storage_refund_after_price_change() { assert_eq!(::Currency::total_balance(&addr), info_deposit + min_balance); // Create 100 bytes of storage with a price of per byte and a single storage item of price 2 - assert_ok!(Contracts::call( - RuntimeOrigin::signed(ALICE), - addr.clone(), - 0, - GAS_LIMIT, - None, - 100u32.to_le_bytes().to_vec() - )); + assert_ok!(builder::call(addr.clone()).data(100u32.to_le_bytes().to_vec()).build()); assert_eq!(get_contract(&addr).total_deposit(), info_deposit + 102); // Increase the byte price and trigger a refund. This should not have any influence because // the removal is pro rata and exactly those 100 bytes should have been removed. DEPOSIT_PER_BYTE.with(|c| *c.borrow_mut() = 500); - assert_ok!(Contracts::call( - RuntimeOrigin::signed(ALICE), - addr.clone(), - 0, - GAS_LIMIT, - None, - 0u32.to_le_bytes().to_vec() - )); + assert_ok!(builder::call(addr.clone()).data(0u32.to_le_bytes().to_vec()).build()); // Make sure the account wasn't removed by the refund assert_eq!( @@ -1506,20 +1222,9 @@ fn cannot_self_destruct_while_live() { let _ = ::Currency::set_balance(&ALICE, 1_000_000); // Instantiate the BOB contract. - let addr = Contracts::bare_instantiate( - ALICE, - 100_000, - GAS_LIMIT, - None, - Code::Upload(wasm), - vec![], - vec![], - DebugInfo::Skip, - CollectEvents::Skip, - ) - .result - .unwrap() - .account_id; + let addr = builder::bare_instantiate(Code::Upload(wasm)) + .value(100_000) + .build_and_unwrap_account_id(); // Check that the BOB contract has been instantiated. get_contract(&addr); @@ -1527,14 +1232,7 @@ fn cannot_self_destruct_while_live() { // Call BOB with input data, forcing it make a recursive call to itself to // self-destruct, resulting in a trap. assert_err_ignore_postinfo!( - Contracts::call( - RuntimeOrigin::signed(ALICE), - addr.clone(), - 0, - GAS_LIMIT, - None, - vec![0], - ), + builder::call(addr.clone()).data(vec![0]).build(), Error::::ContractTrapped, ); @@ -1552,20 +1250,9 @@ fn self_destruct_works() { let min_balance = Contracts::min_balance(); // Instantiate the BOB contract. - let addr = Contracts::bare_instantiate( - ALICE, - 100_000, - GAS_LIMIT, - None, - Code::Upload(wasm), - vec![], - vec![], - DebugInfo::Skip, - CollectEvents::Skip, - ) - .result - .unwrap() - .account_id; + let addr = builder::bare_instantiate(Code::Upload(wasm)) + .value(100_000) + .build_and_unwrap_account_id(); // Check that the BOB contract has been instantiated. let _ = get_contract(&addr); @@ -1576,10 +1263,7 @@ fn self_destruct_works() { initialize_block(2); // Call BOB without input data which triggers termination. - assert_matches!( - Contracts::call(RuntimeOrigin::signed(ALICE), addr.clone(), 0, GAS_LIMIT, None, vec![],), - Ok(_) - ); + assert_matches!(builder::call(addr.clone()).build(), Ok(_)); // Check that code is still there but refcount dropped to zero. assert_refcount!(&code_hash, 0); @@ -1666,20 +1350,10 @@ fn destroy_contract_and_transfer_funds() { // This deploys the BOB contract, which in turn deploys the CHARLIE contract during // construction. - let addr_bob = Contracts::bare_instantiate( - ALICE, - 200_000, - GAS_LIMIT, - None, - Code::Upload(caller_wasm), - callee_code_hash.as_ref().to_vec(), - vec![], - DebugInfo::Skip, - CollectEvents::Skip, - ) - .result - .unwrap() - .account_id; + let addr_bob = builder::bare_instantiate(Code::Upload(caller_wasm)) + .value(200_000) + .data(callee_code_hash.as_ref().to_vec()) + .build_and_unwrap_account_id(); // Check that the CHARLIE contract has been instantiated. let addr_charlie = @@ -1687,14 +1361,7 @@ fn destroy_contract_and_transfer_funds() { get_contract(&addr_charlie); // Call BOB, which calls CHARLIE, forcing CHARLIE to self-destruct. - assert_ok!(Contracts::call( - RuntimeOrigin::signed(ALICE), - addr_bob, - 0, - GAS_LIMIT, - None, - addr_charlie.encode(), - )); + assert_ok!(builder::call(addr_bob).data(addr_charlie.encode()).build()); // Check that CHARLIE has moved on to the great beyond (ie. died). assert!(get_contract_checked(&addr_charlie).is_none()); @@ -1707,17 +1374,9 @@ fn cannot_self_destruct_in_constructor() { ExtBuilder::default().existential_deposit(50).build().execute_with(|| { let _ = ::Currency::set_balance(&ALICE, 1_000_000); - // Fail to instantiate the BOB because the contructor calls seal_terminate. + // Fail to instantiate the BOB because the constructor calls seal_terminate. assert_err_ignore_postinfo!( - Contracts::instantiate_with_code( - RuntimeOrigin::signed(ALICE), - 100_000, - GAS_LIMIT, - None, - wasm, - vec![], - vec![], - ), + builder::instantiate_with_code(wasm).value(100_000).build(), Error::::TerminatedInConstructor, ); }); @@ -1731,20 +1390,9 @@ fn crypto_hashes() { let _ = ::Currency::set_balance(&ALICE, 1_000_000); // Instantiate the CRYPTO_HASHES contract. - let addr = Contracts::bare_instantiate( - ALICE, - 100_000, - GAS_LIMIT, - None, - Code::Upload(wasm), - vec![], - vec![], - DebugInfo::Skip, - CollectEvents::Skip, - ) - .result - .unwrap() - .account_id; + let addr = builder::bare_instantiate(Code::Upload(wasm)) + .value(100_000) + .build_and_unwrap_account_id(); // Perform the call. let input = b"_DEAD_BEEF"; use sp_io::hashing::*; @@ -1766,19 +1414,7 @@ fn crypto_hashes() { // We offset data in the contract tables by 1. let mut params = vec![(n + 1) as u8]; params.extend_from_slice(input); - let result = >::bare_call( - ALICE, - addr.clone(), - 0, - GAS_LIMIT, - None, - params, - DebugInfo::Skip, - CollectEvents::Skip, - Determinism::Enforced, - ) - .result - .unwrap(); + let result = builder::bare_call(addr.clone()).data(params).build_and_unwrap_result(); assert!(!result.did_revert()); let expected = hash_fn(input.as_ref()); assert_eq!(&result.data[..*expected_size], &*expected); @@ -1793,36 +1429,13 @@ fn transfer_return_code() { let min_balance = Contracts::min_balance(); let _ = ::Currency::set_balance(&ALICE, 1000 * min_balance); - let addr = Contracts::bare_instantiate( - ALICE, - min_balance * 100, - GAS_LIMIT, - None, - Code::Upload(wasm), - vec![], - vec![], - DebugInfo::Skip, - CollectEvents::Skip, - ) - .result - .unwrap() - .account_id; + let addr = builder::bare_instantiate(Code::Upload(wasm)) + .value(min_balance * 100) + .build_and_unwrap_account_id(); // Contract has only the minimal balance so any transfer will fail. ::Currency::set_balance(&addr, min_balance); - let result = Contracts::bare_call( - ALICE, - addr.clone(), - 0, - GAS_LIMIT, - None, - vec![], - DebugInfo::Skip, - CollectEvents::Skip, - Determinism::Enforced, - ) - .result - .unwrap(); + let result = builder::bare_call(addr.clone()).build_and_unwrap_result(); assert_return_code!(result, RuntimeReturnCode::TransferFailed); }); } @@ -1836,113 +1449,60 @@ fn call_return_code() { let _ = ::Currency::set_balance(&ALICE, 1000 * min_balance); let _ = ::Currency::set_balance(&CHARLIE, 1000 * min_balance); - let addr_bob = Contracts::bare_instantiate( - ALICE, - min_balance * 100, - GAS_LIMIT, - None, - Code::Upload(caller_code), - vec![0], - vec![], - DebugInfo::Skip, - CollectEvents::Skip, - ) - .result - .unwrap() - .account_id; + let addr_bob = builder::bare_instantiate(Code::Upload(caller_code)) + .value(min_balance * 100) + .data(vec![0]) + .build_and_unwrap_account_id(); ::Currency::set_balance(&addr_bob, min_balance); // Contract calls into Django which is no valid contract - let result = Contracts::bare_call( - ALICE, - addr_bob.clone(), - 0, - GAS_LIMIT, - None, - AsRef::<[u8]>::as_ref(&DJANGO).to_vec(), - DebugInfo::Skip, - CollectEvents::Skip, - Determinism::Enforced, - ) - .result - .unwrap(); + let result = builder::bare_call(addr_bob.clone()) + .data(AsRef::<[u8]>::as_ref(&DJANGO).to_vec()) + .build_and_unwrap_result(); assert_return_code!(result, RuntimeReturnCode::NotCallable); - let addr_django = Contracts::bare_instantiate( - CHARLIE, - min_balance * 100, - GAS_LIMIT, - None, - Code::Upload(callee_code), - vec![0], - vec![], - DebugInfo::Skip, - CollectEvents::Skip, - ) - .result - .unwrap() - .account_id; + let addr_django = builder::bare_instantiate(Code::Upload(callee_code)) + .origin(CHARLIE) + .value(min_balance * 100) + .data(vec![0]) + .build_and_unwrap_account_id(); ::Currency::set_balance(&addr_django, min_balance); // Contract has only the minimal balance so any transfer will fail. - let result = Contracts::bare_call( - ALICE, - addr_bob.clone(), - 0, - GAS_LIMIT, - None, - AsRef::<[u8]>::as_ref(&addr_django) - .iter() - .chain(&0u32.to_le_bytes()) - .cloned() - .collect(), - DebugInfo::Skip, - CollectEvents::Skip, - Determinism::Enforced, - ) - .result - .unwrap(); + let result = builder::bare_call(addr_bob.clone()) + .data( + AsRef::<[u8]>::as_ref(&addr_django) + .iter() + .chain(&0u32.to_le_bytes()) + .cloned() + .collect(), + ) + .build_and_unwrap_result(); assert_return_code!(result, RuntimeReturnCode::TransferFailed); // Contract has enough balance but callee reverts because "1" is passed. ::Currency::set_balance(&addr_bob, min_balance + 1000); - let result = Contracts::bare_call( - ALICE, - addr_bob.clone(), - 0, - GAS_LIMIT, - None, - AsRef::<[u8]>::as_ref(&addr_django) - .iter() - .chain(&1u32.to_le_bytes()) - .cloned() - .collect(), - DebugInfo::Skip, - CollectEvents::Skip, - Determinism::Enforced, - ) - .result - .unwrap(); + let result = builder::bare_call(addr_bob.clone()) + .data( + AsRef::<[u8]>::as_ref(&addr_django) + .iter() + .chain(&1u32.to_le_bytes()) + .cloned() + .collect(), + ) + .build_and_unwrap_result(); assert_return_code!(result, RuntimeReturnCode::CalleeReverted); // Contract has enough balance but callee traps because "2" is passed. - let result = Contracts::bare_call( - ALICE, - addr_bob, - 0, - GAS_LIMIT, - None, - AsRef::<[u8]>::as_ref(&addr_django) - .iter() - .chain(&2u32.to_le_bytes()) - .cloned() - .collect(), - DebugInfo::Skip, - CollectEvents::Skip, - Determinism::Enforced, - ) - .result - .unwrap(); + let result = builder::bare_call(addr_bob) + .data( + AsRef::<[u8]>::as_ref(&addr_django) + .iter() + .chain(&2u32.to_le_bytes()) + .cloned() + .collect(), + ) + .build_and_unwrap_result(); assert_return_code!(result, RuntimeReturnCode::CalleeTrapped); }); } @@ -1957,95 +1517,34 @@ fn instantiate_return_code() { let _ = ::Currency::set_balance(&CHARLIE, 1000 * min_balance); let callee_hash = callee_hash.as_ref().to_vec(); - assert_ok!(Contracts::instantiate_with_code( - RuntimeOrigin::signed(ALICE), - min_balance * 100, - GAS_LIMIT, - None, - callee_code, - vec![], - vec![], - )); + assert_ok!(builder::instantiate_with_code(callee_code).value(min_balance * 100).build()); - let addr = Contracts::bare_instantiate( - ALICE, - min_balance * 100, - GAS_LIMIT, - None, - Code::Upload(caller_code), - vec![], - vec![], - DebugInfo::Skip, - CollectEvents::Skip, - ) - .result - .unwrap() - .account_id; + let addr = builder::bare_instantiate(Code::Upload(caller_code)) + .value(min_balance * 100) + .build_and_unwrap_account_id(); // Contract has only the minimal balance so any transfer will fail. ::Currency::set_balance(&addr, min_balance); - let result = Contracts::bare_call( - ALICE, - addr.clone(), - 0, - GAS_LIMIT, - None, - callee_hash.clone(), - DebugInfo::Skip, - CollectEvents::Skip, - Determinism::Enforced, - ) - .result - .unwrap(); + let result = builder::bare_call(addr.clone()) + .data(callee_hash.clone()) + .build_and_unwrap_result(); assert_return_code!(result, RuntimeReturnCode::TransferFailed); // Contract has enough balance but the passed code hash is invalid ::Currency::set_balance(&addr, min_balance + 10_000); - let result = Contracts::bare_call( - ALICE, - addr.clone(), - 0, - GAS_LIMIT, - None, - vec![0; 33], - DebugInfo::Skip, - CollectEvents::Skip, - Determinism::Enforced, - ) - .result - .unwrap(); + let result = builder::bare_call(addr.clone()).data(vec![0; 33]).build_and_unwrap_result(); assert_return_code!(result, RuntimeReturnCode::CodeNotFound); // Contract has enough balance but callee reverts because "1" is passed. - let result = Contracts::bare_call( - ALICE, - addr.clone(), - 0, - GAS_LIMIT, - None, - callee_hash.iter().chain(&1u32.to_le_bytes()).cloned().collect(), - DebugInfo::Skip, - CollectEvents::Skip, - Determinism::Enforced, - ) - .result - .unwrap(); + let result = builder::bare_call(addr.clone()) + .data(callee_hash.iter().chain(&1u32.to_le_bytes()).cloned().collect()) + .build_and_unwrap_result(); assert_return_code!(result, RuntimeReturnCode::CalleeReverted); // Contract has enough balance but callee traps because "2" is passed. - let result = Contracts::bare_call( - ALICE, - addr, - 0, - GAS_LIMIT, - None, - callee_hash.iter().chain(&2u32.to_le_bytes()).cloned().collect(), - DebugInfo::Skip, - CollectEvents::Skip, - Determinism::Enforced, - ) - .result - .unwrap(); + let result = builder::bare_call(addr) + .data(callee_hash.iter().chain(&2u32.to_le_bytes()).cloned().collect()) + .build_and_unwrap_result(); assert_return_code!(result, RuntimeReturnCode::CalleeTrapped); }); } @@ -2058,15 +1557,7 @@ fn disabled_chain_extension_wont_deploy() { let _ = ::Currency::set_balance(&ALICE, 1000 * min_balance); TestExtension::disable(); assert_err_ignore_postinfo!( - Contracts::instantiate_with_code( - RuntimeOrigin::signed(ALICE), - 3 * min_balance, - GAS_LIMIT, - None, - code, - vec![], - vec![], - ), + builder::instantiate_with_code(code).value(3 * min_balance).build(), >::CodeRejected, ); }); @@ -2078,23 +1569,12 @@ fn disabled_chain_extension_errors_on_call() { ExtBuilder::default().existential_deposit(50).build().execute_with(|| { let min_balance = Contracts::min_balance(); let _ = ::Currency::set_balance(&ALICE, 1000 * min_balance); - let addr = Contracts::bare_instantiate( - ALICE, - min_balance * 100, - GAS_LIMIT, - None, - Code::Upload(code), - vec![], - vec![], - DebugInfo::Skip, - CollectEvents::Skip, - ) - .result - .unwrap() - .account_id; + let addr = builder::bare_instantiate(Code::Upload(code)) + .value(min_balance * 100) + .build_and_unwrap_account_id(); TestExtension::disable(); assert_err_ignore_postinfo!( - Contracts::call(RuntimeOrigin::signed(ALICE), addr.clone(), 0, GAS_LIMIT, None, vec![],), + builder::call(addr.clone()).build(), Error::::CodeRejected, ); }); @@ -2106,141 +1586,61 @@ fn chain_extension_works() { ExtBuilder::default().existential_deposit(50).build().execute_with(|| { let min_balance = Contracts::min_balance(); let _ = ::Currency::set_balance(&ALICE, 1000 * min_balance); - let addr = Contracts::bare_instantiate( - ALICE, - min_balance * 100, - GAS_LIMIT, - None, - Code::Upload(code), - vec![], - vec![], - DebugInfo::Skip, - CollectEvents::Skip, - ) - .result - .unwrap() - .account_id; + let addr = builder::bare_instantiate(Code::Upload(code)) + .value(min_balance * 100) + .build_and_unwrap_account_id(); // 0 = read input buffer and pass it through as output let input: Vec = ExtensionInput { extension_id: 0, func_id: 0, extra: &[99] }.into(); - let result = Contracts::bare_call( - ALICE, - addr.clone(), - 0, - GAS_LIMIT, - None, - input.clone(), - DebugInfo::Skip, - CollectEvents::Skip, - Determinism::Enforced, - ); + let result = builder::bare_call(addr.clone()).data(input.clone()).build(); assert_eq!(TestExtension::last_seen_buffer(), input); assert_eq!(result.result.unwrap().data, input); // 1 = treat inputs as integer primitives and store the supplied integers - Contracts::bare_call( - ALICE, - addr.clone(), - 0, - GAS_LIMIT, - None, - ExtensionInput { extension_id: 0, func_id: 1, extra: &[] }.into(), - DebugInfo::Skip, - CollectEvents::Skip, - Determinism::Enforced, - ) - .result - .unwrap(); + builder::bare_call(addr.clone()) + .data(ExtensionInput { extension_id: 0, func_id: 1, extra: &[] }.into()) + .build_and_unwrap_result(); assert_eq!(TestExtension::last_seen_input_len(), 4); // 2 = charge some extra weight (amount supplied in the fifth byte) - let result = Contracts::bare_call( - ALICE, - addr.clone(), - 0, - GAS_LIMIT, - None, - ExtensionInput { extension_id: 0, func_id: 2, extra: &0u32.encode() }.into(), - DebugInfo::Skip, - CollectEvents::Skip, - Determinism::Enforced, - ); + let result = builder::bare_call(addr.clone()) + .data(ExtensionInput { extension_id: 0, func_id: 2, extra: &0u32.encode() }.into()) + .build(); assert_ok!(result.result); let gas_consumed = result.gas_consumed; - let result = Contracts::bare_call( - ALICE, - addr.clone(), - 0, - GAS_LIMIT, - None, - ExtensionInput { extension_id: 0, func_id: 2, extra: &42u32.encode() }.into(), - DebugInfo::Skip, - CollectEvents::Skip, - Determinism::Enforced, - ); + let result = builder::bare_call(addr.clone()) + .data(ExtensionInput { extension_id: 0, func_id: 2, extra: &42u32.encode() }.into()) + .build(); assert_ok!(result.result); assert_eq!(result.gas_consumed.ref_time(), gas_consumed.ref_time() + 42); - let result = Contracts::bare_call( - ALICE, - addr.clone(), - 0, - GAS_LIMIT, - None, - ExtensionInput { extension_id: 0, func_id: 2, extra: &95u32.encode() }.into(), - DebugInfo::Skip, - CollectEvents::Skip, - Determinism::Enforced, - ); + let result = builder::bare_call(addr.clone()) + .data(ExtensionInput { extension_id: 0, func_id: 2, extra: &95u32.encode() }.into()) + .build(); assert_ok!(result.result); assert_eq!(result.gas_consumed.ref_time(), gas_consumed.ref_time() + 95); // 3 = diverging chain extension call that sets flags to 0x1 and returns a fixed buffer - let result = Contracts::bare_call( - ALICE, - addr.clone(), - 0, - GAS_LIMIT, - None, - ExtensionInput { extension_id: 0, func_id: 3, extra: &[] }.into(), - DebugInfo::Skip, - CollectEvents::Skip, - Determinism::Enforced, - ) - .result - .unwrap(); + let result = builder::bare_call(addr.clone()) + .data(ExtensionInput { extension_id: 0, func_id: 3, extra: &[] }.into()) + .build_and_unwrap_result(); assert_eq!(result.flags, ReturnFlags::REVERT); assert_eq!(result.data, vec![42, 99]); // diverging to second chain extension that sets flags to 0x1 and returns a fixed buffer // We set the MSB part to 1 (instead of 0) which routes the request into the second // extension - let result = Contracts::bare_call( - ALICE, - addr.clone(), - 0, - GAS_LIMIT, - None, - ExtensionInput { extension_id: 1, func_id: 0, extra: &[] }.into(), - DebugInfo::Skip, - CollectEvents::Skip, - Determinism::Enforced, - ) - .result - .unwrap(); + let result = builder::bare_call(addr.clone()) + .data(ExtensionInput { extension_id: 1, func_id: 0, extra: &[] }.into()) + .build_and_unwrap_result(); assert_eq!(result.flags, ReturnFlags::REVERT); assert_eq!(result.data, vec![0x4B, 0x1D]); // Diverging to third chain extension that is disabled // We set the MSB part to 2 (instead of 0) which routes the request into the third extension assert_err_ignore_postinfo!( - Contracts::call( - RuntimeOrigin::signed(ALICE), - addr.clone(), - 0, - GAS_LIMIT, - None, - ExtensionInput { extension_id: 2, func_id: 0, extra: &[] }.into(), - ), + builder::call(addr.clone()) + .data(ExtensionInput { extension_id: 2, func_id: 0, extra: &[] }.into()) + .build(), Error::::NoChainExtension, ); }); @@ -2252,20 +1652,9 @@ fn chain_extension_temp_storage_works() { ExtBuilder::default().existential_deposit(50).build().execute_with(|| { let min_balance = Contracts::min_balance(); let _ = ::Currency::set_balance(&ALICE, 1000 * min_balance); - let addr = Contracts::bare_instantiate( - ALICE, - min_balance * 100, - GAS_LIMIT, - None, - Code::Upload(code), - vec![], - vec![], - DebugInfo::Skip, - CollectEvents::Skip, - ) - .result - .unwrap() - .account_id; + let addr = builder::bare_instantiate(Code::Upload(code)) + .value(min_balance * 100) + .build_and_unwrap_account_id(); // Call func 0 and func 1 back to back. let stop_recursion = 0u8; @@ -2276,20 +1665,7 @@ fn chain_extension_temp_storage_works() { .as_ref(), ); - assert_ok!( - Contracts::bare_call( - ALICE, - addr.clone(), - 0, - GAS_LIMIT, - None, - input.clone(), - DebugInfo::Skip, - CollectEvents::Skip, - Determinism::Enforced, - ) - .result - ); + assert_ok!(builder::bare_call(addr.clone()).data(input.clone()).build().result); }) } @@ -2300,20 +1676,9 @@ fn lazy_removal_works() { let min_balance = Contracts::min_balance(); let _ = ::Currency::set_balance(&ALICE, 1000 * min_balance); - let addr = Contracts::bare_instantiate( - ALICE, - min_balance * 100, - GAS_LIMIT, - None, - Code::Upload(code), - vec![], - vec![], - DebugInfo::Skip, - CollectEvents::Skip, - ) - .result - .unwrap() - .account_id; + let addr = builder::bare_instantiate(Code::Upload(code)) + .value(min_balance * 100) + .build_and_unwrap_account_id(); let info = get_contract(&addr); let trie = &info.child_trie_info(); @@ -2322,14 +1687,7 @@ fn lazy_removal_works() { child::put(trie, &[99], &42); // Terminate the contract - assert_ok!(Contracts::call( - RuntimeOrigin::signed(ALICE), - addr.clone(), - 0, - GAS_LIMIT, - None, - vec![] - )); + assert_ok!(builder::call(addr.clone()).build()); // Contract info should be gone assert!(!>::contains_key(&addr)); @@ -2354,20 +1712,10 @@ fn lazy_batch_removal_works() { let mut tries: Vec = vec![]; for i in 0..3u8 { - let addr = Contracts::bare_instantiate( - ALICE, - min_balance * 100, - GAS_LIMIT, - None, - Code::Upload(code.clone()), - vec![], - vec![i], - DebugInfo::Skip, - CollectEvents::Skip, - ) - .result - .unwrap() - .account_id; + let addr = builder::bare_instantiate(Code::Upload(code.clone())) + .value(min_balance * 100) + .salt(vec![i]) + .build_and_unwrap_account_id(); let info = get_contract(&addr); let trie = &info.child_trie_info(); @@ -2377,14 +1725,7 @@ fn lazy_batch_removal_works() { // Terminate the contract. Contract info should be gone, but value should be still there // as the lazy removal did not run, yet. - assert_ok!(Contracts::call( - RuntimeOrigin::signed(ALICE), - addr.clone(), - 0, - GAS_LIMIT, - None, - vec![] - )); + assert_ok!(builder::call(addr.clone()).build()); assert!(!>::contains_key(&addr)); assert_matches!(child::get(trie, &[99]), Some(42)); @@ -2408,8 +1749,8 @@ fn lazy_removal_partial_remove_works() { // We create a contract with some extra keys above the weight limit let extra_keys = 7u32; - let weight_limit = Weight::from_parts(5_000_000_000, 0); - let (_, max_keys) = ContractInfo::::deletion_budget(weight_limit); + let mut meter = WeightMeter::with_limit(Weight::from_parts(5_000_000_000, 100 * 1024)); + let (weight_per_key, max_keys) = ContractInfo::::deletion_budget(&meter); let vals: Vec<_> = (0..max_keys + extra_keys) .map(|i| (blake2_256(&i.encode()), (i as u32), (i as u32).encode())) .collect(); @@ -2420,20 +1761,9 @@ fn lazy_removal_partial_remove_works() { let min_balance = Contracts::min_balance(); let _ = ::Currency::set_balance(&ALICE, 1000 * min_balance); - let addr = Contracts::bare_instantiate( - ALICE, - min_balance * 100, - GAS_LIMIT, - None, - Code::Upload(code), - vec![], - vec![], - DebugInfo::Skip, - CollectEvents::Skip, - ) - .result - .unwrap() - .account_id; + let addr = builder::bare_instantiate(Code::Upload(code)) + .value(min_balance * 100) + .build_and_unwrap_account_id(); let info = get_contract(&addr); @@ -2444,14 +1774,7 @@ fn lazy_removal_partial_remove_works() { >::insert(&addr, info.clone()); // Terminate the contract - assert_ok!(Contracts::call( - RuntimeOrigin::signed(ALICE), - addr.clone(), - 0, - GAS_LIMIT, - None, - vec![] - )); + assert_ok!(builder::call(addr.clone()).build()); // Contract info should be gone assert!(!>::contains_key(&addr)); @@ -2472,10 +1795,10 @@ fn lazy_removal_partial_remove_works() { ext.execute_with(|| { // Run the lazy removal - let weight_used = ContractInfo::::process_deletion_queue_batch(weight_limit); + ContractInfo::::process_deletion_queue_batch(&mut meter); // Weight should be exhausted because we could not even delete all keys - assert_eq!(weight_used, weight_limit); + assert!(!meter.can_consume(weight_per_key)); let mut num_deleted = 0u32; let mut num_remaining = 0u32; @@ -2502,20 +1825,9 @@ fn lazy_removal_does_no_run_on_low_remaining_weight() { let min_balance = Contracts::min_balance(); let _ = ::Currency::set_balance(&ALICE, 1000 * min_balance); - let addr = Contracts::bare_instantiate( - ALICE, - min_balance * 100, - GAS_LIMIT, - None, - Code::Upload(code), - vec![], - vec![], - DebugInfo::Skip, - CollectEvents::Skip, - ) - .result - .unwrap() - .account_id; + let addr = builder::bare_instantiate(Code::Upload(code)) + .value(min_balance * 100) + .build_and_unwrap_account_id(); let info = get_contract(&addr); let trie = &info.child_trie_info(); @@ -2524,14 +1836,7 @@ fn lazy_removal_does_no_run_on_low_remaining_weight() { child::put(trie, &[99], &42); // Terminate the contract - assert_ok!(Contracts::call( - RuntimeOrigin::signed(ALICE), - addr.clone(), - 0, - GAS_LIMIT, - None, - vec![] - )); + assert_ok!(builder::call(addr.clone()).build()); // Contract info should be gone assert!(!>::contains_key(&addr)); @@ -2567,30 +1872,20 @@ fn lazy_removal_does_no_run_on_low_remaining_weight() { fn lazy_removal_does_not_use_all_weight() { let (code, _hash) = compile_module::("self_destruct").unwrap(); - let weight_limit = Weight::from_parts(5_000_000_000, 100 * 1024); + let mut meter = WeightMeter::with_limit(Weight::from_parts(5_000_000_000, 100 * 1024)); let mut ext = ExtBuilder::default().existential_deposit(50).build(); let (trie, vals, weight_per_key) = ext.execute_with(|| { let min_balance = Contracts::min_balance(); let _ = ::Currency::set_balance(&ALICE, 1000 * min_balance); - let addr = Contracts::bare_instantiate( - ALICE, - min_balance * 100, - GAS_LIMIT, - None, - Code::Upload(code), - vec![], - vec![], - DebugInfo::Skip, - CollectEvents::Skip, - ) - .result - .unwrap() - .account_id; + let addr = builder::bare_instantiate(Code::Upload(code)) + .value(min_balance * 100) + .build_and_unwrap_account_id(); let info = get_contract(&addr); - let (weight_per_key, max_keys) = ContractInfo::::deletion_budget(weight_limit); + let (weight_per_key, max_keys) = ContractInfo::::deletion_budget(&meter); + assert!(max_keys > 0); // We create a contract with one less storage item than we can remove within the limit let vals: Vec<_> = (0..max_keys - 1) @@ -2604,14 +1899,7 @@ fn lazy_removal_does_not_use_all_weight() { >::insert(&addr, info.clone()); // Terminate the contract - assert_ok!(Contracts::call( - RuntimeOrigin::signed(ALICE), - addr.clone(), - 0, - GAS_LIMIT, - None, - vec![] - )); + assert_ok!(builder::call(addr.clone()).build()); // Contract info should be gone assert!(!>::contains_key(&addr)); @@ -2632,10 +1920,10 @@ fn lazy_removal_does_not_use_all_weight() { ext.execute_with(|| { // Run the lazy removal - let weight_used = ContractInfo::::process_deletion_queue_batch(weight_limit); - - // We have one less key in our trie than our weight limit suffices for - assert_eq!(weight_used, weight_limit - weight_per_key); + ContractInfo::::process_deletion_queue_batch(&mut meter); + let base_weight = + <::WeightInfo as WeightInfo>::on_process_deletion_queue_batch(); + assert_eq!(meter.consumed(), weight_per_key.mul(vals.len() as _) + base_weight); // All the keys are removed for val in vals { @@ -2665,20 +1953,10 @@ fn deletion_queue_ring_buffer_overflow() { // add 3 contracts to the deletion queue for i in 0..3u8 { - let addr = Contracts::bare_instantiate( - ALICE, - min_balance * 100, - GAS_LIMIT, - None, - Code::Upload(code.clone()), - vec![], - vec![i], - DebugInfo::Skip, - CollectEvents::Skip, - ) - .result - .unwrap() - .account_id; + let addr = builder::bare_instantiate(Code::Upload(code.clone())) + .value(min_balance * 100) + .salt(vec![i]) + .build_and_unwrap_account_id(); let info = get_contract(&addr); let trie = &info.child_trie_info(); @@ -2688,14 +1966,7 @@ fn deletion_queue_ring_buffer_overflow() { // Terminate the contract. Contract info should be gone, but value should be still // there as the lazy removal did not run, yet. - assert_ok!(Contracts::call( - RuntimeOrigin::signed(ALICE), - addr.clone(), - 0, - GAS_LIMIT, - None, - vec![] - )); + assert_ok!(builder::call(addr.clone()).build()); assert!(!>::contains_key(&addr)); assert_matches!(child::get(trie, &[99]), Some(42)); @@ -2723,87 +1994,36 @@ fn refcounter() { let min_balance = Contracts::min_balance(); // Create two contracts with the same code and check that they do in fact share it. - let addr0 = Contracts::bare_instantiate( - ALICE, - min_balance * 100, - GAS_LIMIT, - None, - Code::Upload(wasm.clone()), - vec![], - vec![0], - DebugInfo::Skip, - CollectEvents::Skip, - ) - .result - .unwrap() - .account_id; - let addr1 = Contracts::bare_instantiate( - ALICE, - min_balance * 100, - GAS_LIMIT, - None, - Code::Upload(wasm.clone()), - vec![], - vec![1], - DebugInfo::Skip, - CollectEvents::Skip, - ) - .result - .unwrap() - .account_id; + let addr0 = builder::bare_instantiate(Code::Upload(wasm.clone())) + .value(min_balance * 100) + .salt(vec![0]) + .build_and_unwrap_account_id(); + let addr1 = builder::bare_instantiate(Code::Upload(wasm.clone())) + .value(min_balance * 100) + .salt(vec![1]) + .build_and_unwrap_account_id(); assert_refcount!(code_hash, 2); // Sharing should also work with the usual instantiate call - let addr2 = Contracts::bare_instantiate( - ALICE, - min_balance * 100, - GAS_LIMIT, - None, - Code::Existing(code_hash), - vec![], - vec![2], - DebugInfo::Skip, - CollectEvents::Skip, - ) - .result - .unwrap() - .account_id; + let addr2 = builder::bare_instantiate(Code::Existing(code_hash)) + .value(min_balance * 100) + .salt(vec![2]) + .build_and_unwrap_account_id(); assert_refcount!(code_hash, 3); // Terminating one contract should decrement the refcount - assert_ok!(Contracts::call( - RuntimeOrigin::signed(ALICE), - addr0, - 0, - GAS_LIMIT, - None, - vec![] - )); + assert_ok!(builder::call(addr0).build()); assert_refcount!(code_hash, 2); // remove another one - assert_ok!(Contracts::call( - RuntimeOrigin::signed(ALICE), - addr1, - 0, - GAS_LIMIT, - None, - vec![] - )); + assert_ok!(builder::call(addr1).build()); assert_refcount!(code_hash, 1); // Pristine code should still be there PristineCode::::get(code_hash).unwrap(); // remove the last contract - assert_ok!(Contracts::call( - RuntimeOrigin::signed(ALICE), - addr2, - 0, - GAS_LIMIT, - None, - vec![] - )); + assert_ok!(builder::call(addr2).build()); assert_refcount!(code_hash, 0); // refcount is `0` but code should still exists because it needs to be removed manually @@ -2817,31 +2037,10 @@ fn debug_message_works() { ExtBuilder::default().existential_deposit(50).build().execute_with(|| { let _ = ::Currency::set_balance(&ALICE, 1_000_000); - let addr = Contracts::bare_instantiate( - ALICE, - 30_000, - GAS_LIMIT, - None, - Code::Upload(wasm), - vec![], - vec![], - DebugInfo::Skip, - CollectEvents::Skip, - ) - .result - .unwrap() - .account_id; - let result = Contracts::bare_call( - ALICE, - addr, - 0, - GAS_LIMIT, - None, - vec![], - DebugInfo::UnsafeDebug, - CollectEvents::Skip, - Determinism::Enforced, - ); + let addr = builder::bare_instantiate(Code::Upload(wasm)) + .value(30_000) + .build_and_unwrap_account_id(); + let result = builder::bare_call(addr).debug(DebugInfo::UnsafeDebug).build(); assert_matches!(result.result, Ok(_)); assert_eq!(std::str::from_utf8(&result.debug_message).unwrap(), "Hello World!"); @@ -2854,32 +2053,11 @@ fn debug_message_logging_disabled() { ExtBuilder::default().existential_deposit(50).build().execute_with(|| { let _ = ::Currency::set_balance(&ALICE, 1_000_000); - let addr = Contracts::bare_instantiate( - ALICE, - 30_000, - GAS_LIMIT, - None, - Code::Upload(wasm), - vec![], - vec![], - DebugInfo::Skip, - CollectEvents::Skip, - ) - .result - .unwrap() - .account_id; + let addr = builder::bare_instantiate(Code::Upload(wasm)) + .value(30_000) + .build_and_unwrap_account_id(); // disable logging by passing `false` - let result = Contracts::bare_call( - ALICE, - addr.clone(), - 0, - GAS_LIMIT, - None, - vec![], - DebugInfo::Skip, - CollectEvents::Skip, - Determinism::Enforced, - ); + let result = builder::bare_call(addr.clone()).build(); assert_matches!(result.result, Ok(_)); // the dispatchables always run without debugging assert_ok!(Contracts::call(RuntimeOrigin::signed(ALICE), addr, 0, GAS_LIMIT, None, vec![])); @@ -2893,206 +2071,152 @@ fn debug_message_invalid_utf8() { ExtBuilder::default().existential_deposit(50).build().execute_with(|| { let _ = ::Currency::set_balance(&ALICE, 1_000_000); - let addr = Contracts::bare_instantiate( - ALICE, - 30_000, - GAS_LIMIT, - None, - Code::Upload(wasm), - vec![], - vec![], - DebugInfo::Skip, - CollectEvents::Skip, - ) - .result - .unwrap() - .account_id; - let result = Contracts::bare_call( - ALICE, - addr, - 0, - GAS_LIMIT, - None, - vec![], - DebugInfo::UnsafeDebug, - CollectEvents::Skip, - Determinism::Enforced, - ); + let addr = builder::bare_instantiate(Code::Upload(wasm)) + .value(30_000) + .build_and_unwrap_account_id(); + let result = builder::bare_call(addr).debug(DebugInfo::UnsafeDebug).build(); assert_ok!(result.result); assert!(result.debug_message.is_empty()); }); } #[test] -fn gas_estimation_nested_call_fixed_limit() { +fn gas_estimation_for_subcalls() { let (caller_code, _caller_hash) = compile_module::("call_with_limit").unwrap(); - let (callee_code, _callee_hash) = compile_module::("dummy").unwrap(); + let (call_runtime_code, _caller_hash) = compile_module::("call_runtime").unwrap(); + let (dummy_code, _callee_hash) = compile_module::("dummy").unwrap(); ExtBuilder::default().existential_deposit(50).build().execute_with(|| { let min_balance = Contracts::min_balance(); - let _ = ::Currency::set_balance(&ALICE, 1000 * min_balance); + let _ = ::Currency::set_balance(&ALICE, 2_000 * min_balance); - let addr_caller = Contracts::bare_instantiate( - ALICE, - min_balance * 100, - GAS_LIMIT, - None, - Code::Upload(caller_code), - vec![], - vec![0], - DebugInfo::Skip, - CollectEvents::Skip, - ) - .result - .unwrap() - .account_id; + let addr_caller = builder::bare_instantiate(Code::Upload(caller_code)) + .value(min_balance * 100) + .build_and_unwrap_account_id(); - let addr_callee = Contracts::bare_instantiate( - ALICE, - min_balance * 100, - GAS_LIMIT, - None, - Code::Upload(callee_code), - vec![], - vec![1], - DebugInfo::Skip, - CollectEvents::Skip, - ) - .result - .unwrap() - .account_id; + let addr_dummy = builder::bare_instantiate(Code::Upload(dummy_code)) + .value(min_balance * 100) + .build_and_unwrap_account_id(); - let input: Vec = AsRef::<[u8]>::as_ref(&addr_callee) - .iter() - .cloned() - .chain((GAS_LIMIT / 5).ref_time().to_le_bytes()) - .chain((GAS_LIMIT / 5).proof_size().to_le_bytes()) - .collect(); + let addr_call_runtime = builder::bare_instantiate(Code::Upload(call_runtime_code)) + .value(min_balance * 100) + .build_and_unwrap_account_id(); - // Call in order to determine the gas that is required for this call - let result = Contracts::bare_call( - ALICE, - addr_caller.clone(), - 0, + // Run the test for all of those weight limits for the subcall + let weights = [ + Weight::zero(), GAS_LIMIT, - None, - input.clone(), - DebugInfo::Skip, - CollectEvents::Skip, - Determinism::Enforced, - ); - assert_ok!(&result.result); + GAS_LIMIT * 2, + GAS_LIMIT / 5, + Weight::from_parts(0, GAS_LIMIT.proof_size()), + Weight::from_parts(GAS_LIMIT.ref_time(), 0), + ]; - // We have a subcall with a fixed gas limit. This constitutes precharging. - assert!(result.gas_required.all_gt(result.gas_consumed)); + // This call is passed to the sub call in order to create a large `required_weight` + let runtime_call = RuntimeCall::Dummy(pallet_dummy::Call::overestimate_pre_charge { + pre_charge: Weight::from_parts(10_000_000_000, 512 * 1024), + actual_weight: Weight::from_parts(1, 1), + }) + .encode(); - // Make the same call using the estimated gas. Should succeed. - assert_ok!( - Contracts::bare_call( - ALICE, - addr_caller.clone(), - 0, - result.gas_required, - Some(result.storage_deposit.charge_or_zero()), - input.clone(), - DebugInfo::Skip, - CollectEvents::Skip, - Determinism::Enforced, - ) - .result - ); + // Encodes which contract should be sub called with which input + let sub_calls: [(&[u8], Vec<_>, bool); 2] = [ + (addr_dummy.as_ref(), vec![], false), + (addr_call_runtime.as_ref(), runtime_call, true), + ]; - // Make the same call using proof_size but less than estimated. Should fail with OutOfGas. - let result = Contracts::bare_call( - ALICE, - addr_caller, - 0, - result.gas_required.sub_proof_size(1), - Some(result.storage_deposit.charge_or_zero()), - input, - DebugInfo::Skip, - CollectEvents::Skip, - Determinism::Enforced, - ) - .result; - assert_err!(result, >::OutOfGas); + for weight in weights { + for (sub_addr, sub_input, out_of_gas_in_subcall) in &sub_calls { + let input: Vec = sub_addr + .iter() + .cloned() + .chain(weight.ref_time().to_le_bytes()) + .chain(weight.proof_size().to_le_bytes()) + .chain(sub_input.clone()) + .collect(); + + // Call in order to determine the gas that is required for this call + let result = builder::bare_call(addr_caller.clone()).data(input.clone()).build(); + assert_ok!(&result.result); + + // If the out of gas happens in the subcall the caller contract + // will just trap. Otherwise we would need to forward an error + // code to signal that the sub contract ran out of gas. + let error: DispatchError = if *out_of_gas_in_subcall { + assert!(result.gas_required.all_gt(result.gas_consumed)); + >::ContractTrapped.into() + } else { + assert_eq!(result.gas_required, result.gas_consumed); + >::OutOfGas.into() + }; + + // Make the same call using the estimated gas. Should succeed. + assert_ok!( + builder::bare_call(addr_caller.clone()) + .gas_limit(result.gas_required) + .storage_deposit_limit(Some(result.storage_deposit.charge_or_zero())) + .data(input.clone()) + .build() + .result + ); + + // Check that it fails with too little ref_time + assert_err!( + builder::bare_call(addr_caller.clone()) + .gas_limit(result.gas_required.sub_ref_time(1)) + .storage_deposit_limit(Some(result.storage_deposit.charge_or_zero())) + .data(input.clone()) + .build() + .result, + error, + ); + + // Check that it fails with too little proof_size + assert_err!( + builder::bare_call(addr_caller.clone()) + .gas_limit(result.gas_required.sub_proof_size(1)) + .storage_deposit_limit(Some(result.storage_deposit.charge_or_zero())) + .data(input) + .build() + .result, + error, + ); + } + } }); } #[test] fn gas_estimation_call_runtime() { - use codec::Decode; let (caller_code, _caller_hash) = compile_module::("call_runtime").unwrap(); - let (callee_code, _callee_hash) = compile_module::("dummy").unwrap(); ExtBuilder::default().existential_deposit(50).build().execute_with(|| { let min_balance = Contracts::min_balance(); let _ = ::Currency::set_balance(&ALICE, 1000 * min_balance); let _ = ::Currency::set_balance(&CHARLIE, 1000 * min_balance); - let addr_caller = Contracts::bare_instantiate( - ALICE, - min_balance * 100, - GAS_LIMIT, - None, - Code::Upload(caller_code), - vec![], - vec![0], - DebugInfo::Skip, - CollectEvents::Skip, - ) - .result - .unwrap() - .account_id; - - Contracts::bare_instantiate( - ALICE, - min_balance * 100, - GAS_LIMIT, - None, - Code::Upload(callee_code), - vec![], - vec![1], - DebugInfo::Skip, - CollectEvents::Skip, - ) - .result - .unwrap(); + let addr_caller = builder::bare_instantiate(Code::Upload(caller_code)) + .value(min_balance * 100) + .salt(vec![0]) + .build_and_unwrap_account_id(); // Call something trivial with a huge gas limit so that we can observe the effects // of pre-charging. This should create a difference between consumed and required. let call = RuntimeCall::Dummy(pallet_dummy::Call::overestimate_pre_charge { - pre_charge: Weight::from_parts(10_000_000, 0), - actual_weight: Weight::from_parts(100, 0), + pre_charge: Weight::from_parts(10_000_000, 1_000), + actual_weight: Weight::from_parts(100, 100), }); - let result = Contracts::bare_call( - ALICE, - addr_caller.clone(), - 0, - GAS_LIMIT, - None, - call.encode(), - DebugInfo::Skip, - CollectEvents::Skip, - Determinism::Enforced, - ); + let result = builder::bare_call(addr_caller.clone()).data(call.encode()).build(); // contract encodes the result of the dispatch runtime let outcome = u32::decode(&mut result.result.unwrap().data.as_ref()).unwrap(); assert_eq!(outcome, 0); - assert!(result.gas_required.ref_time() > result.gas_consumed.ref_time()); + assert!(result.gas_required.all_gt(result.gas_consumed)); // Make the same call using the required gas. Should succeed. assert_ok!( - Contracts::bare_call( - ALICE, - addr_caller, - 0, - result.gas_required, - None, - call.encode(), - DebugInfo::Skip, - CollectEvents::Skip, - Determinism::Enforced, - ) - .result + builder::bare_call(addr_caller) + .gas_limit(result.gas_required) + .data(call.encode()) + .build() + .result ); }); } @@ -3106,35 +2230,15 @@ fn call_runtime_reentrancy_guarded() { let _ = ::Currency::set_balance(&ALICE, 1000 * min_balance); let _ = ::Currency::set_balance(&CHARLIE, 1000 * min_balance); - let addr_caller = Contracts::bare_instantiate( - ALICE, - min_balance * 100, - GAS_LIMIT, - None, - Code::Upload(caller_code), - vec![], - vec![0], - DebugInfo::Skip, - CollectEvents::Skip, - ) - .result - .unwrap() - .account_id; + let addr_caller = builder::bare_instantiate(Code::Upload(caller_code)) + .value(min_balance * 100) + .salt(vec![0]) + .build_and_unwrap_account_id(); - let addr_callee = Contracts::bare_instantiate( - ALICE, - min_balance * 100, - GAS_LIMIT, - None, - Code::Upload(callee_code), - vec![], - vec![1], - DebugInfo::Skip, - CollectEvents::Skip, - ) - .result - .unwrap() - .account_id; + let addr_callee = builder::bare_instantiate(Code::Upload(callee_code)) + .value(min_balance * 100) + .salt(vec![1]) + .build_and_unwrap_account_id(); // Call pallet_contracts call() dispatchable let call = RuntimeCall::Contracts(crate::Call::call { @@ -3147,19 +2251,9 @@ fn call_runtime_reentrancy_guarded() { // Call runtime to re-enter back to contracts engine by // calling dummy contract - let result = Contracts::bare_call( - ALICE, - addr_caller.clone(), - 0, - GAS_LIMIT, - None, - call.encode(), - DebugInfo::Skip, - CollectEvents::Skip, - Determinism::Enforced, - ) - .result - .unwrap(); + let result = builder::bare_call(addr_caller.clone()) + .data(call.encode()) + .build_and_unwrap_result(); // Call to runtime should fail because of the re-entrancy guard assert_return_code!(result, RuntimeReturnCode::CallRuntimeFailed); }); @@ -3173,20 +2267,9 @@ fn ecdsa_recover() { let _ = ::Currency::set_balance(&ALICE, 1_000_000); // Instantiate the ecdsa_recover contract. - let addr = Contracts::bare_instantiate( - ALICE, - 100_000, - GAS_LIMIT, - None, - Code::Upload(wasm), - vec![], - vec![], - DebugInfo::Skip, - CollectEvents::Skip, - ) - .result - .unwrap() - .account_id; + let addr = builder::bare_instantiate(Code::Upload(wasm)) + .value(100_000) + .build_and_unwrap_account_id(); #[rustfmt::skip] let signature: [u8; 65] = [ @@ -3211,19 +2294,7 @@ fn ecdsa_recover() { params.extend_from_slice(&signature); params.extend_from_slice(&message_hash); assert!(params.len() == 65 + 32); - let result = >::bare_call( - ALICE, - addr.clone(), - 0, - GAS_LIMIT, - None, - params, - DebugInfo::Skip, - CollectEvents::Skip, - Determinism::Enforced, - ) - .result - .unwrap(); + let result = builder::bare_call(addr.clone()).data(params).build_and_unwrap_result(); assert!(!result.did_revert()); assert_eq!(result.data, EXPECTED_COMPRESSED_PUBLIC_KEY); }) @@ -3236,17 +2307,10 @@ fn bare_instantiate_returns_events() { let min_balance = Contracts::min_balance(); let _ = ::Currency::set_balance(&ALICE, 1000 * min_balance); - let result = Contracts::bare_instantiate( - ALICE, - min_balance * 100, - GAS_LIMIT, - None, - Code::Upload(wasm), - vec![], - vec![], - DebugInfo::Skip, - CollectEvents::UnsafeCollect, - ); + let result = builder::bare_instantiate(Code::Upload(wasm)) + .value(min_balance * 100) + .collect_events(CollectEvents::UnsafeCollect) + .build(); let events = result.events.unwrap(); assert!(!events.is_empty()); @@ -3261,17 +2325,7 @@ fn bare_instantiate_does_not_return_events() { let min_balance = Contracts::min_balance(); let _ = ::Currency::set_balance(&ALICE, 1000 * min_balance); - let result = Contracts::bare_instantiate( - ALICE, - min_balance * 100, - GAS_LIMIT, - None, - Code::Upload(wasm), - vec![], - vec![], - DebugInfo::Skip, - CollectEvents::Skip, - ); + let result = builder::bare_instantiate(Code::Upload(wasm)).value(min_balance * 100).build(); let events = result.events; assert!(!System::events().is_empty()); @@ -3286,32 +2340,13 @@ fn bare_call_returns_events() { let min_balance = Contracts::min_balance(); let _ = ::Currency::set_balance(&ALICE, 1000 * min_balance); - let addr = Contracts::bare_instantiate( - ALICE, - min_balance * 100, - GAS_LIMIT, - None, - Code::Upload(wasm), - vec![], - vec![], - DebugInfo::Skip, - CollectEvents::Skip, - ) - .result - .unwrap() - .account_id; - - let result = Contracts::bare_call( - ALICE, - addr.clone(), - 0, - GAS_LIMIT, - None, - vec![], - DebugInfo::Skip, - CollectEvents::UnsafeCollect, - Determinism::Enforced, - ); + let addr = builder::bare_instantiate(Code::Upload(wasm)) + .value(min_balance * 100) + .build_and_unwrap_account_id(); + + let result = builder::bare_call(addr.clone()) + .collect_events(CollectEvents::UnsafeCollect) + .build(); let events = result.events.unwrap(); assert_return_code!(&result.result.unwrap(), RuntimeReturnCode::Success); @@ -3327,32 +2362,11 @@ fn bare_call_does_not_return_events() { let min_balance = Contracts::min_balance(); let _ = ::Currency::set_balance(&ALICE, 1000 * min_balance); - let addr = Contracts::bare_instantiate( - ALICE, - min_balance * 100, - GAS_LIMIT, - None, - Code::Upload(wasm), - vec![], - vec![], - DebugInfo::Skip, - CollectEvents::Skip, - ) - .result - .unwrap() - .account_id; - - let result = Contracts::bare_call( - ALICE, - addr.clone(), - 0, - GAS_LIMIT, - None, - vec![], - DebugInfo::Skip, - CollectEvents::Skip, - Determinism::Enforced, - ); + let addr = builder::bare_instantiate(Code::Upload(wasm)) + .value(min_balance * 100) + .build_and_unwrap_account_id(); + + let result = builder::bare_call(addr.clone()).build(); let events = result.events; assert_return_code!(&result.result.unwrap(), RuntimeReturnCode::Success); @@ -3369,20 +2383,9 @@ fn sr25519_verify() { let _ = ::Currency::set_balance(&ALICE, 1_000_000); // Instantiate the sr25519_verify contract. - let addr = Contracts::bare_instantiate( - ALICE, - 100_000, - GAS_LIMIT, - None, - Code::Upload(wasm), - vec![], - vec![], - DebugInfo::Skip, - CollectEvents::Skip, - ) - .result - .unwrap() - .account_id; + let addr = builder::bare_instantiate(Code::Upload(wasm)) + .value(100_000) + .build_and_unwrap_account_id(); let call_with = |message: &[u8; 11]| { // Alice's signature for "hello world" @@ -3406,19 +2409,7 @@ fn sr25519_verify() { params.extend_from_slice(&public_key); params.extend_from_slice(message); - >::bare_call( - ALICE, - addr.clone(), - 0, - GAS_LIMIT, - None, - params, - DebugInfo::Skip, - CollectEvents::Skip, - Determinism::Enforced, - ) - .result - .unwrap() + builder::bare_call(addr.clone()).data(params).build_and_unwrap_result() }; // verification should succeed for "hello world" @@ -3440,34 +2431,10 @@ fn failed_deposit_charge_should_roll_back_call() { let _ = ::Currency::set_balance(&ALICE, 1_000_000); // Instantiate both contracts. - let addr_caller = Contracts::bare_instantiate( - ALICE, - 0, - GAS_LIMIT, - None, - Code::Upload(wasm_caller.clone()), - vec![], - vec![], - DebugInfo::Skip, - CollectEvents::Skip, - ) - .result - .unwrap() - .account_id; - let addr_callee = Contracts::bare_instantiate( - ALICE, - 0, - GAS_LIMIT, - None, - Code::Upload(wasm_callee.clone()), - vec![], - vec![], - DebugInfo::Skip, - CollectEvents::Skip, - ) - .result - .unwrap() - .account_id; + let addr_caller = builder::bare_instantiate(Code::Upload(wasm_caller.clone())) + .build_and_unwrap_account_id(); + let addr_callee = builder::bare_instantiate(Code::Upload(wasm_callee.clone())) + .build_and_unwrap_account_id(); // Give caller proxy access to Alice. assert_ok!(Proxy::add_proxy(RuntimeOrigin::signed(ALICE), addr_caller.clone(), (), 0)); @@ -3691,15 +2658,7 @@ fn remove_code_in_use() { ExtBuilder::default().existential_deposit(100).build().execute_with(|| { let _ = ::Currency::set_balance(&ALICE, 1_000_000); - assert_ok!(Contracts::instantiate_with_code( - RuntimeOrigin::signed(ALICE), - 0, - GAS_LIMIT, - None, - wasm, - vec![], - vec![], - )); + assert_ok!(builder::instantiate_with_code(wasm).build()); // Drop previous events initialize_block(2); @@ -3743,20 +2702,7 @@ fn instantiate_with_zero_balance_works() { initialize_block(2); // Instantiate the BOB contract. - let addr = Contracts::bare_instantiate( - ALICE, - 0, - GAS_LIMIT, - None, - Code::Upload(wasm), - vec![], - vec![], - DebugInfo::Skip, - CollectEvents::Skip, - ) - .result - .unwrap() - .account_id; + let addr = builder::bare_instantiate(Code::Upload(wasm)).build_and_unwrap_account_id(); // Ensure the contract was stored and get expected deposit amount to be reserved. let deposit_expected = expected_deposit(ensure_stored(code_hash)); @@ -3840,20 +2786,9 @@ fn instantiate_with_below_existential_deposit_works() { initialize_block(2); // Instantiate the BOB contract. - let addr = Contracts::bare_instantiate( - ALICE, - value, - GAS_LIMIT, - None, - Code::Upload(wasm), - vec![], - vec![], - DebugInfo::Skip, - CollectEvents::Skip, - ) - .result - .unwrap() - .account_id; + let addr = builder::bare_instantiate(Code::Upload(wasm)) + .value(value) + .build_and_unwrap_account_id(); // Ensure the contract was stored and get expected deposit amount to be reserved. let deposit_expected = expected_deposit(ensure_stored(code_hash)); @@ -3939,20 +2874,7 @@ fn storage_deposit_works() { ExtBuilder::default().existential_deposit(200).build().execute_with(|| { let _ = ::Currency::set_balance(&ALICE, 1_000_000); - let addr = Contracts::bare_instantiate( - ALICE, - 0, - GAS_LIMIT, - None, - Code::Upload(wasm), - vec![], - vec![], - DebugInfo::Skip, - CollectEvents::Skip, - ) - .result - .unwrap() - .account_id; + let addr = builder::bare_instantiate(Code::Upload(wasm)).build_and_unwrap_account_id(); let mut deposit = test_utils::contract_info_storage_deposit(&addr); @@ -3960,41 +2882,23 @@ fn storage_deposit_works() { initialize_block(2); // Create storage - assert_ok!(Contracts::call( - RuntimeOrigin::signed(ALICE), - addr.clone(), - 42, - GAS_LIMIT, - None, - (1_000u32, 5_000u32).encode(), - )); + assert_ok!(builder::call(addr.clone()) + .value(42) + .data((1_000u32, 5_000u32).encode()) + .build()); // 4 is for creating 2 storage items let charged0 = 4 + 1_000 + 5_000; deposit += charged0; assert_eq!(get_contract(&addr).total_deposit(), deposit); // Add more storage (but also remove some) - assert_ok!(Contracts::call( - RuntimeOrigin::signed(ALICE), - addr.clone(), - 0, - GAS_LIMIT, - None, - (2_000u32, 4_900u32).encode(), - )); + assert_ok!(builder::call(addr.clone()).data((2_000u32, 4_900u32).encode()).build()); let charged1 = 1_000 - 100; deposit += charged1; assert_eq!(get_contract(&addr).total_deposit(), deposit); // Remove more storage (but also add some) - assert_ok!(Contracts::call( - RuntimeOrigin::signed(ALICE), - addr.clone(), - 0, - GAS_LIMIT, - None, - (2_100u32, 900u32).encode(), - )); + assert_ok!(builder::call(addr.clone()).data((2_100u32, 900u32).encode()).build()); // -1 for numeric instability let refunded0 = 4_000 - 100 - 1; deposit -= refunded0; @@ -4083,43 +2987,12 @@ fn storage_deposit_callee_works() { let min_balance = Contracts::min_balance(); // Create both contracts: Constructors do nothing. - let addr_caller = Contracts::bare_instantiate( - ALICE, - 0, - GAS_LIMIT, - None, - Code::Upload(wasm_caller), - vec![], - vec![], - DebugInfo::Skip, - CollectEvents::Skip, - ) - .result - .unwrap() - .account_id; - let addr_callee = Contracts::bare_instantiate( - ALICE, - 0, - GAS_LIMIT, - None, - Code::Upload(wasm_callee), - vec![], - vec![], - DebugInfo::Skip, - CollectEvents::Skip, - ) - .result - .unwrap() - .account_id; + let addr_caller = + builder::bare_instantiate(Code::Upload(wasm_caller)).build_and_unwrap_account_id(); + let addr_callee = + builder::bare_instantiate(Code::Upload(wasm_callee)).build_and_unwrap_account_id(); - assert_ok!(Contracts::call( - RuntimeOrigin::signed(ALICE), - addr_caller, - 0, - GAS_LIMIT, - None, - (100u32, &addr_callee).encode() - )); + assert_ok!(builder::call(addr_caller).data((100u32, &addr_callee).encode()).build()); let callee = get_contract(&addr_callee); let deposit = DepositPerByte::get() * 100 + DepositPerItem::get() * 1; @@ -4142,20 +3015,7 @@ fn set_code_extrinsic() { ExtBuilder::default().existential_deposit(100).build().execute_with(|| { let _ = ::Currency::set_balance(&ALICE, 1_000_000); - let addr = Contracts::bare_instantiate( - ALICE, - 0, - GAS_LIMIT, - None, - Code::Upload(wasm), - vec![], - vec![], - DebugInfo::Skip, - CollectEvents::Skip, - ) - .result - .unwrap() - .account_id; + let addr = builder::bare_instantiate(Code::Upload(wasm)).build_and_unwrap_account_id(); assert_ok!(Contracts::upload_code( RuntimeOrigin::signed(ALICE), @@ -4179,7 +3039,7 @@ fn set_code_extrinsic() { assert_eq!(get_contract(&addr).code_hash, code_hash); assert_refcount!(&code_hash, 1); assert_refcount!(&new_code_hash, 0); - assert_eq!(System::events(), vec![],); + assert_eq!(System::events(), vec![]); // contract must exist assert_noop!( @@ -4189,7 +3049,7 @@ fn set_code_extrinsic() { assert_eq!(get_contract(&addr).code_hash, code_hash); assert_refcount!(&code_hash, 1); assert_refcount!(&new_code_hash, 0); - assert_eq!(System::events(), vec![],); + assert_eq!(System::events(), vec![]); // new code hash must exist assert_noop!( @@ -4199,7 +3059,7 @@ fn set_code_extrinsic() { assert_eq!(get_contract(&addr).code_hash, code_hash); assert_refcount!(&code_hash, 1); assert_refcount!(&new_code_hash, 0); - assert_eq!(System::events(), vec![],); + assert_eq!(System::events(), vec![]); // successful call assert_ok!(Contracts::set_code(RuntimeOrigin::root(), addr.clone(), new_code_hash)); @@ -4229,20 +3089,9 @@ fn slash_cannot_kill_account() { let _ = ::Currency::set_balance(&ALICE, 1_000_000); let min_balance = Contracts::min_balance(); - let addr = Contracts::bare_instantiate( - ALICE, - value, - GAS_LIMIT, - None, - Code::Upload(wasm), - vec![], - vec![], - DebugInfo::Skip, - CollectEvents::Skip, - ) - .result - .unwrap() - .account_id; + let addr = builder::bare_instantiate(Code::Upload(wasm)) + .value(value) + .build_and_unwrap_account_id(); // Drop previous events initialize_block(2); @@ -4293,29 +3142,13 @@ fn contract_reverted() { // Calling extrinsic: revert leads to an error assert_err_ignore_postinfo!( - Contracts::instantiate( - RuntimeOrigin::signed(ALICE), - 0, - GAS_LIMIT, - None, - code_hash, - input.clone(), - vec![], - ), + builder::instantiate(code_hash).data(input.clone()).build(), >::ContractReverted, ); // Calling extrinsic: revert leads to an error assert_err_ignore_postinfo!( - Contracts::instantiate_with_code( - RuntimeOrigin::signed(ALICE), - 0, - GAS_LIMIT, - None, - wasm, - input.clone(), - vec![], - ), + builder::instantiate_with_code(wasm).data(input.clone()).build(), >::ContractReverted, ); @@ -4323,161 +3156,31 @@ fn contract_reverted() { // This is just a different way of transporting the error that allows the read out // the `data` which is only there on success. Obviously, the contract isn't // instantiated. - let result = Contracts::bare_instantiate( - ALICE, - 0, - GAS_LIMIT, - None, - Code::Existing(code_hash), - input.clone(), - vec![], - DebugInfo::Skip, - CollectEvents::Skip, - ) - .result - .unwrap(); + let result = builder::bare_instantiate(Code::Existing(code_hash)) + .data(input.clone()) + .build_and_unwrap_result(); assert_eq!(result.result.flags, flags); assert_eq!(result.result.data, buffer); assert!(!>::contains_key(result.account_id)); // Pass empty flags and therefore successfully instantiate the contract for later use. - let addr = Contracts::bare_instantiate( - ALICE, - 0, - GAS_LIMIT, - None, - Code::Existing(code_hash), - ReturnFlags::empty().bits().encode(), - vec![], - DebugInfo::Skip, - CollectEvents::Skip, - ) - .result - .unwrap() - .account_id; + let addr = builder::bare_instantiate(Code::Existing(code_hash)) + .data(ReturnFlags::empty().bits().encode()) + .build_and_unwrap_account_id(); // Calling extrinsic: revert leads to an error assert_err_ignore_postinfo!( - Contracts::call( - RuntimeOrigin::signed(ALICE), - addr.clone(), - 0, - GAS_LIMIT, - None, - input.clone() - ), + builder::call(addr.clone()).data(input.clone()).build(), >::ContractReverted, ); // Calling directly: revert leads to success but the flags indicate the error - let result = Contracts::bare_call( - ALICE, - addr.clone(), - 0, - GAS_LIMIT, - None, - input, - DebugInfo::Skip, - CollectEvents::Skip, - Determinism::Enforced, - ) - .result - .unwrap(); + let result = builder::bare_call(addr.clone()).data(input).build_and_unwrap_result(); assert_eq!(result.flags, flags); assert_eq!(result.data, buffer); }); } -#[test] -fn code_rejected_error_works() { - ExtBuilder::default().existential_deposit(200).build().execute_with(|| { - let _ = ::Currency::set_balance(&ALICE, 1_000_000); - - let (wasm, _) = compile_module::("invalid_module").unwrap(); - assert_noop!( - Contracts::upload_code( - RuntimeOrigin::signed(ALICE), - wasm.clone(), - None, - Determinism::Enforced - ), - >::CodeRejected, - ); - let result = Contracts::bare_instantiate( - ALICE, - 0, - GAS_LIMIT, - None, - Code::Upload(wasm), - vec![], - vec![], - DebugInfo::UnsafeDebug, - CollectEvents::Skip, - ); - assert_err!(result.result, >::CodeRejected); - assert_eq!( - std::str::from_utf8(&result.debug_message).unwrap(), - "Can't load the module into wasmi!" - ); - - let (wasm, _) = compile_module::("invalid_contract_no_call").unwrap(); - assert_noop!( - Contracts::upload_code( - RuntimeOrigin::signed(ALICE), - wasm.clone(), - None, - Determinism::Enforced - ), - >::CodeRejected, - ); - - let result = Contracts::bare_instantiate( - ALICE, - 0, - GAS_LIMIT, - None, - Code::Upload(wasm), - vec![], - vec![], - DebugInfo::UnsafeDebug, - CollectEvents::Skip, - ); - assert_err!(result.result, >::CodeRejected); - assert_eq!( - std::str::from_utf8(&result.debug_message).unwrap(), - "call function isn't exported" - ); - - let (wasm, _) = compile_module::("invalid_contract_no_memory").unwrap(); - assert_noop!( - Contracts::upload_code( - RuntimeOrigin::signed(ALICE), - wasm.clone(), - None, - Determinism::Enforced - ), - >::CodeRejected, - ); - - let result = Contracts::bare_instantiate( - ALICE, - 0, - GAS_LIMIT, - None, - Code::Upload(wasm), - vec![], - vec![], - DebugInfo::UnsafeDebug, - CollectEvents::Skip, - ); - assert_err!(result.result, >::CodeRejected); - assert_eq!( - std::str::from_utf8(&result.debug_message).unwrap(), - "No memory import found in the module" - ); - }); -} - #[test] fn set_code_hash() { let (wasm, code_hash) = compile_module::("set_code_hash").unwrap(); @@ -4487,20 +3190,9 @@ fn set_code_hash() { let _ = ::Currency::set_balance(&ALICE, 1_000_000); // Instantiate the 'caller' - let contract_addr = Contracts::bare_instantiate( - ALICE, - 300_000, - GAS_LIMIT, - None, - Code::Upload(wasm), - vec![], - vec![], - DebugInfo::Skip, - CollectEvents::Skip, - ) - .result - .unwrap() - .account_id; + let contract_addr = builder::bare_instantiate(Code::Upload(wasm)) + .value(300_000) + .build_and_unwrap_account_id(); // upload new code assert_ok!(Contracts::upload_code( RuntimeOrigin::signed(ALICE), @@ -4512,35 +3204,16 @@ fn set_code_hash() { System::reset_events(); // First call sets new code_hash and returns 1 - let result = Contracts::bare_call( - ALICE, - contract_addr.clone(), - 0, - GAS_LIMIT, - None, - new_code_hash.as_ref().to_vec(), - DebugInfo::UnsafeDebug, - CollectEvents::Skip, - Determinism::Enforced, - ) - .result - .unwrap(); + let result = builder::bare_call(contract_addr.clone()) + .data(new_code_hash.as_ref().to_vec()) + .debug(DebugInfo::UnsafeDebug) + .build_and_unwrap_result(); assert_return_code!(result, 1); // Second calls new contract code that returns 2 - let result = Contracts::bare_call( - ALICE, - contract_addr.clone(), - 0, - GAS_LIMIT, - None, - vec![], - DebugInfo::UnsafeDebug, - CollectEvents::Skip, - Determinism::Enforced, - ) - .result - .unwrap(); + let result = builder::bare_call(contract_addr.clone()) + .debug(DebugInfo::UnsafeDebug) + .build_and_unwrap_result(); assert_return_code!(result, 2); // Checking for the last event only @@ -4592,37 +3265,16 @@ fn storage_deposit_limit_is_enforced() { // Setting insufficient storage_deposit should fail. assert_err!( - Contracts::bare_instantiate( - ALICE, - 0, - GAS_LIMIT, - Some((2 * min_balance + 3 - 1).into()), /* expected deposit is 2 * ed + 3 for - * the call */ - Code::Upload(wasm.clone()), - vec![], - vec![], - DebugInfo::Skip, - CollectEvents::Skip, - ) - .result, + builder::bare_instantiate(Code::Upload(wasm.clone())) + // expected deposit is 2 * ed + 3 for the call + .storage_deposit_limit(Some((2 * min_balance + 3 - 1).into())) + .build() + .result, >::StorageDepositLimitExhausted, ); // Instantiate the BOB contract. - let addr = Contracts::bare_instantiate( - ALICE, - 0, - GAS_LIMIT, - None, - Code::Upload(wasm), - vec![], - vec![], - DebugInfo::Skip, - CollectEvents::Skip, - ) - .result - .unwrap() - .account_id; + let addr = builder::bare_instantiate(Code::Upload(wasm)).build_and_unwrap_account_id(); let info_deposit = test_utils::contract_info_storage_deposit(&addr); // Check that the BOB contract has been instantiated and has the minimum balance @@ -4633,14 +3285,10 @@ fn storage_deposit_limit_is_enforced() { // setting insufficient deposit limit, as it requires 3 Balance: // 2 for the item added + 1 for the new storage item. assert_err_ignore_postinfo!( - Contracts::call( - RuntimeOrigin::signed(ALICE), - addr.clone(), - 0, - GAS_LIMIT, - Some(codec::Compact(2)), - 1u32.to_le_bytes().to_vec() - ), + builder::call(addr.clone()) + .storage_deposit_limit(Some(codec::Compact(2))) + .data(1u32.to_le_bytes().to_vec()) + .build(), >::StorageDepositLimitExhausted, ); @@ -4651,26 +3299,12 @@ fn storage_deposit_limit_is_enforced() { // Create 1 byte of storage, should cost 3 Balance: // 2 for the item added + 1 for the new storage item. // Should pass as it fallbacks to DefaultDepositLimit. - assert_ok!(Contracts::call( - RuntimeOrigin::signed(ALICE), - addr.clone(), - 0, - GAS_LIMIT, - None, - 1u32.to_le_bytes().to_vec() - )); + assert_ok!(builder::call(addr.clone()).data(1u32.to_le_bytes().to_vec()).build()); // Use 4 more bytes of the storage for the same item, which requires 4 Balance. // Should fail as DefaultDepositLimit is 3 and hence isn't enough. assert_err_ignore_postinfo!( - Contracts::call( - RuntimeOrigin::signed(ALICE), - addr.clone(), - 0, - GAS_LIMIT, - None, - 5u32.to_le_bytes().to_vec() - ), + builder::call(addr.clone()).data(5u32.to_le_bytes().to_vec()).build(), >::StorageDepositLimitExhausted, ); }); @@ -4685,45 +3319,17 @@ fn deposit_limit_in_nested_calls() { let _ = ::Currency::set_balance(&ALICE, 1_000_000); // Create both contracts: Constructors do nothing. - let addr_caller = Contracts::bare_instantiate( - ALICE, - 0, - GAS_LIMIT, - None, - Code::Upload(wasm_caller), - vec![], - vec![], - DebugInfo::Skip, - CollectEvents::Skip, - ) - .result - .unwrap() - .account_id; - let addr_callee = Contracts::bare_instantiate( - ALICE, - 0, - GAS_LIMIT, - None, - Code::Upload(wasm_callee), - vec![], - vec![], - DebugInfo::Skip, - CollectEvents::Skip, - ) - .result - .unwrap() - .account_id; + let addr_caller = + builder::bare_instantiate(Code::Upload(wasm_caller)).build_and_unwrap_account_id(); + let addr_callee = + builder::bare_instantiate(Code::Upload(wasm_callee)).build_and_unwrap_account_id(); // Create 100 bytes of storage with a price of per byte // This is 100 Balance + 2 Balance for the item - assert_ok!(Contracts::call( - RuntimeOrigin::signed(ALICE), - addr_callee.clone(), - 0, - GAS_LIMIT, - Some(codec::Compact(102)), - 100u32.to_le_bytes().to_vec() - )); + assert_ok!(builder::call(addr_callee.clone()) + .storage_deposit_limit(Some(codec::Compact(102))) + .data(100u32.to_le_bytes().to_vec()) + .build()); // We do not remove any storage but add a storage item of 12 bytes in the caller // contract. This would cost 12 + 2 = 14 Balance. @@ -4731,14 +3337,10 @@ fn deposit_limit_in_nested_calls() { // This should fail as the specified parent's limit is less than the cost: 13 < // 14. assert_err_ignore_postinfo!( - Contracts::call( - RuntimeOrigin::signed(ALICE), - addr_caller.clone(), - 0, - GAS_LIMIT, - Some(codec::Compact(13)), - (100u32, &addr_callee, 0u64).encode(), - ), + builder::call(addr_caller.clone()) + .storage_deposit_limit(Some(codec::Compact(13))) + .data((100u32, &addr_callee, 0u64).encode()) + .build(), >::StorageDepositLimitExhausted, ); // Now we specify the parent's limit high enough to cover the caller's storage additions. @@ -4748,14 +3350,10 @@ fn deposit_limit_in_nested_calls() { // This should fail as the specified parent's limit is less than the cost: 14 // < 15. assert_err_ignore_postinfo!( - Contracts::call( - RuntimeOrigin::signed(ALICE), - addr_caller.clone(), - 0, - GAS_LIMIT, - Some(codec::Compact(14)), - (101u32, &addr_callee, 0u64).encode(), - ), + builder::call(addr_caller.clone()) + .storage_deposit_limit(Some(codec::Compact(14))) + .data((101u32, &addr_callee, 0u64).encode()) + .build(), >::StorageDepositLimitExhausted, ); @@ -4765,14 +3363,10 @@ fn deposit_limit_in_nested_calls() { // call should have a deposit limit of at least 2 Balance. The sub-call should be rolled // back, which is covered by the next test case. assert_err_ignore_postinfo!( - Contracts::call( - RuntimeOrigin::signed(ALICE), - addr_caller.clone(), - 0, - GAS_LIMIT, - Some(codec::Compact(16)), - (102u32, &addr_callee, 1u64).encode(), - ), + builder::call(addr_caller.clone()) + .storage_deposit_limit(Some(codec::Compact(16))) + .data((102u32, &addr_callee, 1u64).encode()) + .build(), >::StorageDepositLimitExhausted, ); @@ -4780,14 +3374,10 @@ fn deposit_limit_in_nested_calls() { // caller. Note that if previous sub-call wouldn't roll back, this call would pass making // the test case fail. We don't set a special limit for the nested call here. assert_err_ignore_postinfo!( - Contracts::call( - RuntimeOrigin::signed(ALICE), - addr_caller.clone(), - 0, - GAS_LIMIT, - Some(codec::Compact(0)), - (87u32, &addr_callee, 0u64).encode(), - ), + builder::call(addr_caller.clone()) + .storage_deposit_limit(Some(codec::Compact(0))) + .data((87u32, &addr_callee, 0u64).encode()) + .build(), >::StorageDepositLimitExhausted, ); @@ -4796,28 +3386,19 @@ fn deposit_limit_in_nested_calls() { // Require more than the sender's balance. // We don't set a special limit for the nested call. assert_err_ignore_postinfo!( - Contracts::call( - RuntimeOrigin::signed(ALICE), - addr_caller.clone(), - 0, - GAS_LIMIT, - None, - (1200u32, &addr_callee, 1u64).encode(), - ), + builder::call(addr_caller.clone()) + .data((1200u32, &addr_callee, 1u64).encode()) + .build(), >::StorageDepositLimitExhausted, ); // Same as above but allow for the additional deposit of 1 Balance in parent. // We set the special deposit limit of 1 Balance for the nested call, which isn't // enforced as callee frees up storage. This should pass. - assert_ok!(Contracts::call( - RuntimeOrigin::signed(ALICE), - addr_caller.clone(), - 0, - GAS_LIMIT, - Some(codec::Compact(1)), - (87u32, &addr_callee, 1u64).encode(), - )); + assert_ok!(builder::call(addr_caller.clone()) + .storage_deposit_limit(Some(codec::Compact(1))) + .data((87u32, &addr_callee, 1u64).encode()) + .build()); }); } @@ -4831,35 +3412,13 @@ fn deposit_limit_in_nested_instantiate() { let _ = ::Currency::set_balance(&ALICE, 1_000_000); let _ = ::Currency::set_balance(&BOB, 1_000_000); // Create caller contract - let addr_caller = Contracts::bare_instantiate( - ALICE, - 10_000u64, // this balance is later passed to the deployed contract - GAS_LIMIT, - None, - Code::Upload(wasm_caller), - vec![], - vec![], - DebugInfo::Skip, - CollectEvents::Skip, - ) - .result - .unwrap() - .account_id; + let addr_caller = builder::bare_instantiate(Code::Upload(wasm_caller)) + .value(10_000u64) // this balance is later passed to the deployed contract + .build_and_unwrap_account_id(); // Deploy a contract to get its occupied storage size - let addr = Contracts::bare_instantiate( - ALICE, - 0, - GAS_LIMIT, - None, - Code::Upload(wasm_callee), - vec![0, 0, 0, 0], - vec![], - DebugInfo::Skip, - CollectEvents::Skip, - ) - .result - .unwrap() - .account_id; + let addr = builder::bare_instantiate(Code::Upload(wasm_callee)) + .data(vec![0, 0, 0, 0]) + .build_and_unwrap_account_id(); let callee_info_len = ContractInfoOf::::get(&addr).unwrap().encoded_size() as u64; @@ -4875,14 +3434,11 @@ fn deposit_limit_in_nested_instantiate() { // Provided the limit is set to be 1 Balance less, // this call should fail on the return from the caller contract. assert_err_ignore_postinfo!( - Contracts::call( - RuntimeOrigin::signed(BOB), - addr_caller.clone(), - 0, - GAS_LIMIT, - Some(codec::Compact(callee_info_len + 2 + ED + 1)), - (0u32, &code_hash_callee, 0u64).encode(), - ), + builder::call(addr_caller.clone()) + .origin(RuntimeOrigin::signed(BOB)) + .storage_deposit_limit(Some(codec::Compact(callee_info_len + 2 + ED + 1))) + .data((0u32, &code_hash_callee, 0u64).encode()) + .build(), >::StorageDepositLimitExhausted, ); // The charges made on instantiation should be rolled back. @@ -4892,14 +3448,11 @@ fn deposit_limit_in_nested_instantiate() { // byte in the constructor. Hence +1 Balance to the limit is needed. This should fail on the // return from constructor. assert_err_ignore_postinfo!( - Contracts::call( - RuntimeOrigin::signed(BOB), - addr_caller.clone(), - 0, - GAS_LIMIT, - Some(codec::Compact(callee_info_len + 2 + ED + 2)), - (1u32, &code_hash_callee, 0u64).encode(), - ), + builder::call(addr_caller.clone()) + .origin(RuntimeOrigin::signed(BOB)) + .storage_deposit_limit(Some(codec::Compact(callee_info_len + 2 + ED + 2))) + .data((1u32, &code_hash_callee, 0u64).encode()) + .build(), >::StorageDepositLimitExhausted, ); // The charges made on the instantiation should be rolled back. @@ -4909,14 +3462,11 @@ fn deposit_limit_in_nested_instantiate() { // This should fail during the charging for the instantiation in // `RawMeter::charge_instantiate()` assert_err_ignore_postinfo!( - Contracts::call( - RuntimeOrigin::signed(BOB), - addr_caller.clone(), - 0, - GAS_LIMIT, - Some(codec::Compact(callee_info_len + 2 + ED + 2)), - (0u32, &code_hash_callee, callee_info_len + 2 + ED + 1).encode(), - ), + builder::call(addr_caller.clone()) + .origin(RuntimeOrigin::signed(BOB)) + .storage_deposit_limit(Some(codec::Compact(callee_info_len + 2 + ED + 2))) + .data((0u32, &code_hash_callee, callee_info_len + 2 + ED + 1).encode()) + .build(), >::StorageDepositLimitExhausted, ); // The charges made on the instantiation should be rolled back. @@ -4927,31 +3477,22 @@ fn deposit_limit_in_nested_instantiate() { // Now we set enough limit for the parent call, but insufficient limit for child // instantiate. This should fail right after the constructor execution. assert_err_ignore_postinfo!( - Contracts::call( - RuntimeOrigin::signed(BOB), - addr_caller.clone(), - 0, - GAS_LIMIT, - Some(codec::Compact(callee_info_len + 2 + ED + 3)), // enough parent limit - (1u32, &code_hash_callee, callee_info_len + 2 + ED + 2).encode(), - ), + builder::call(addr_caller.clone()) + .origin(RuntimeOrigin::signed(BOB)) + .storage_deposit_limit(Some(codec::Compact(callee_info_len + 2 + ED + 3))) // enough parent limit + .data((1u32, &code_hash_callee, callee_info_len + 2 + ED + 2).encode()) + .build(), >::StorageDepositLimitExhausted, ); // The charges made on the instantiation should be rolled back. assert_eq!(::Currency::free_balance(&BOB), 1_000_000); // Set enough deposit limit for the child instantiate. This should succeed. - let result = Contracts::bare_call( - BOB, - addr_caller.clone(), - 0, - GAS_LIMIT, - Some(codec::Compact(callee_info_len + 2 + ED + 4).into()), - (1u32, &code_hash_callee, callee_info_len + 2 + ED + 3).encode(), - DebugInfo::Skip, - CollectEvents::Skip, - Determinism::Enforced, - ); + let result = builder::bare_call(addr_caller.clone()) + .origin(BOB) + .storage_deposit_limit(Some(codec::Compact(callee_info_len + 2 + ED + 4).into())) + .data((1u32, &code_hash_callee, callee_info_len + 2 + ED + 3).encode()) + .build(); let returned = result.result.unwrap(); // All balance of the caller except ED has been transferred to the callee. @@ -4971,7 +3512,7 @@ fn deposit_limit_in_nested_instantiate() { 1_000_000 - (callee_info_len + 2 + ED + 3) ); // Check that deposit due to be charged still includes these 3 Balance - assert_eq!(result.storage_deposit.charge_or_zero(), (callee_info_len + 2 + ED + 3),) + assert_eq!(result.storage_deposit.charge_or_zero(), (callee_info_len + 2 + ED + 3)) }); } @@ -4985,20 +3526,7 @@ fn deposit_limit_honors_liquidity_restrictions() { let min_balance = Contracts::min_balance(); // Instantiate the BOB contract. - let addr = Contracts::bare_instantiate( - ALICE, - 0, - GAS_LIMIT, - None, - Code::Upload(wasm), - vec![], - vec![], - DebugInfo::Skip, - CollectEvents::Skip, - ) - .result - .unwrap() - .account_id; + let addr = builder::bare_instantiate(Code::Upload(wasm)).build_and_unwrap_account_id(); let info_deposit = test_utils::contract_info_storage_deposit(&addr); // Check that the contract has been instantiated and has the minimum balance @@ -5013,14 +3541,11 @@ fn deposit_limit_honors_liquidity_restrictions() { ) .unwrap(); assert_err_ignore_postinfo!( - Contracts::call( - RuntimeOrigin::signed(BOB), - addr.clone(), - 0, - GAS_LIMIT, - Some(codec::Compact(200)), - 100u32.to_le_bytes().to_vec() - ), + builder::call(addr.clone()) + .origin(RuntimeOrigin::signed(BOB)) + .storage_deposit_limit(Some(codec::Compact(200))) + .data(100u32.to_le_bytes().to_vec()) + .build(), >::StorageDepositNotEnoughFunds, ); assert_eq!(::Currency::free_balance(&BOB), min_balance); @@ -5036,20 +3561,7 @@ fn deposit_limit_honors_existential_deposit() { let min_balance = Contracts::min_balance(); // Instantiate the BOB contract. - let addr = Contracts::bare_instantiate( - ALICE, - 0, - GAS_LIMIT, - None, - Code::Upload(wasm), - vec![], - vec![], - DebugInfo::Skip, - CollectEvents::Skip, - ) - .result - .unwrap() - .account_id; + let addr = builder::bare_instantiate(Code::Upload(wasm)).build_and_unwrap_account_id(); let info_deposit = test_utils::contract_info_storage_deposit(&addr); @@ -5059,14 +3571,11 @@ fn deposit_limit_honors_existential_deposit() { // check that the deposit can't bring the account below the existential deposit assert_err_ignore_postinfo!( - Contracts::call( - RuntimeOrigin::signed(BOB), - addr.clone(), - 0, - GAS_LIMIT, - Some(codec::Compact(900)), - 100u32.to_le_bytes().to_vec() - ), + builder::call(addr.clone()) + .origin(RuntimeOrigin::signed(BOB)) + .storage_deposit_limit(Some(codec::Compact(900))) + .data(100u32.to_le_bytes().to_vec()) + .build(), >::StorageDepositNotEnoughFunds, ); assert_eq!(::Currency::free_balance(&BOB), 1_000); @@ -5082,20 +3591,7 @@ fn deposit_limit_honors_min_leftover() { let min_balance = Contracts::min_balance(); // Instantiate the BOB contract. - let addr = Contracts::bare_instantiate( - ALICE, - 0, - GAS_LIMIT, - None, - Code::Upload(wasm), - vec![], - vec![], - DebugInfo::Skip, - CollectEvents::Skip, - ) - .result - .unwrap() - .account_id; + let addr = builder::bare_instantiate(Code::Upload(wasm)).build_and_unwrap_account_id(); let info_deposit = test_utils::contract_info_storage_deposit(&addr); @@ -5106,20 +3602,38 @@ fn deposit_limit_honors_min_leftover() { // check that the minimum leftover (value send) is considered assert_err_ignore_postinfo!( - Contracts::call( - RuntimeOrigin::signed(BOB), - addr.clone(), - 400, - GAS_LIMIT, - Some(codec::Compact(500)), - 100u32.to_le_bytes().to_vec() - ), + builder::call(addr.clone()) + .origin(RuntimeOrigin::signed(BOB)) + .value(400) + .storage_deposit_limit(Some(codec::Compact(500))) + .data(100u32.to_le_bytes().to_vec()) + .build(), >::StorageDepositNotEnoughFunds, ); assert_eq!(::Currency::free_balance(&BOB), 1_000); }); } +#[test] +fn upload_should_enforce_deterministic_mode_when_possible() { + let upload = |fixture, determinism| { + let (wasm, code_hash) = compile_module::(fixture).unwrap(); + ExtBuilder::default() + .build() + .execute_with(|| -> Result { + let _ = ::Currency::set_balance(&ALICE, 1_000_000); + Contracts::bare_upload_code(ALICE, wasm, None, determinism)?; + let info = CodeInfoOf::::get(code_hash).unwrap(); + Ok(info.determinism()) + }) + }; + + assert_eq!(upload("dummy", Determinism::Enforced), Ok(Determinism::Enforced)); + assert_eq!(upload("dummy", Determinism::Relaxed), Ok(Determinism::Enforced)); + assert_eq!(upload("float_instruction", Determinism::Relaxed), Ok(Determinism::Relaxed)); + assert!(upload("float_instruction", Determinism::Enforced).is_err()); +} + #[test] fn cannot_instantiate_indeterministic_code() { let (wasm, code_hash) = compile_module::("float_instruction").unwrap(); @@ -5129,34 +3643,15 @@ fn cannot_instantiate_indeterministic_code() { // Try to instantiate directly from code assert_err_ignore_postinfo!( - Contracts::instantiate_with_code( - RuntimeOrigin::signed(ALICE), - 0, - GAS_LIMIT, - None, - wasm.clone(), - vec![], - vec![], - ), + builder::instantiate_with_code(wasm.clone()).build(), >::CodeRejected, ); assert_err!( - Contracts::bare_instantiate( - ALICE, - 0, - GAS_LIMIT, - None, - Code::Upload(wasm.clone()), - vec![], - vec![], - DebugInfo::Skip, - CollectEvents::Skip, - ) - .result, + builder::bare_instantiate(Code::Upload(wasm.clone())).build().result, >::CodeRejected, ); - // Try to upload a non deterministic code as deterministic + // Try to upload a non-deterministic code as deterministic assert_err!( Contracts::upload_code( RuntimeOrigin::signed(ALICE), @@ -5176,80 +3671,27 @@ fn cannot_instantiate_indeterministic_code() { )); assert_err_ignore_postinfo!( - Contracts::instantiate( - RuntimeOrigin::signed(ALICE), - 0, - GAS_LIMIT, - None, - code_hash, - vec![], - vec![], - ), + builder::instantiate(code_hash).build(), >::Indeterministic, ); assert_err!( - Contracts::bare_instantiate( - ALICE, - 0, - GAS_LIMIT, - None, - Code::Existing(code_hash), - vec![], - vec![], - DebugInfo::Skip, - CollectEvents::Skip, - ) - .result, + builder::bare_instantiate(Code::Existing(code_hash)).build().result, >::Indeterministic, ); // Deploy contract which instantiates another contract - let addr = Contracts::bare_instantiate( - ALICE, - 0, - GAS_LIMIT, - None, - Code::Upload(caller_wasm), - vec![], - vec![], - DebugInfo::Skip, - CollectEvents::Skip, - ) - .result - .unwrap() - .account_id; + let addr = + builder::bare_instantiate(Code::Upload(caller_wasm)).build_and_unwrap_account_id(); // Try to instantiate `code_hash` from another contract in deterministic mode assert_err!( - >::bare_call( - ALICE, - addr.clone(), - 0, - GAS_LIMIT, - None, - code_hash.encode(), - DebugInfo::Skip, - CollectEvents::Skip, - Determinism::Enforced, - ) - .result, + builder::bare_call(addr.clone()).data(code_hash.encode()).build().result, >::Indeterministic, ); - // Instantiations are not allowed even in non determinism mode + // Instantiations are not allowed even in non-determinism mode assert_err!( - >::bare_call( - ALICE, - addr.clone(), - 0, - GAS_LIMIT, - None, - code_hash.encode(), - DebugInfo::Skip, - CollectEvents::Skip, - Determinism::Relaxed, - ) - .result, + builder::bare_call(addr.clone()).data(code_hash.encode()).build().result, >::Indeterministic, ); }); @@ -5262,7 +3704,7 @@ fn cannot_set_code_indeterministic_code() { ExtBuilder::default().existential_deposit(200).build().execute_with(|| { let _ = ::Currency::set_balance(&ALICE, 1_000_000); - // Put the non deterministic contract on-chain + // Put the non-deterministic contract on-chain assert_ok!(Contracts::upload_code( RuntimeOrigin::signed(ALICE), wasm, @@ -5271,35 +3713,12 @@ fn cannot_set_code_indeterministic_code() { )); // Create the contract that will call `seal_set_code_hash` - let caller_addr = Contracts::bare_instantiate( - ALICE, - 0, - GAS_LIMIT, - None, - Code::Upload(caller_wasm), - vec![], - vec![], - DebugInfo::Skip, - CollectEvents::Skip, - ) - .result - .unwrap() - .account_id; + let caller_addr = + builder::bare_instantiate(Code::Upload(caller_wasm)).build_and_unwrap_account_id(); - // We do not allow to set the code hash to a non determinstic wasm + // We do not allow to set the code hash to a non-deterministic wasm assert_err!( - >::bare_call( - ALICE, - caller_addr.clone(), - 0, - GAS_LIMIT, - None, - code_hash.encode(), - DebugInfo::Skip, - CollectEvents::Skip, - Determinism::Relaxed, - ) - .result, + builder::bare_call(caller_addr.clone()).data(code_hash.encode()).build().result, >::Indeterministic, ); }); @@ -5312,7 +3731,7 @@ fn delegate_call_indeterministic_code() { ExtBuilder::default().existential_deposit(200).build().execute_with(|| { let _ = ::Currency::set_balance(&ALICE, 1_000_000); - // Put the non deterministic contract on-chain + // Put the non-deterministic contract on-chain assert_ok!(Contracts::upload_code( RuntimeOrigin::signed(ALICE), wasm, @@ -5321,111 +3740,62 @@ fn delegate_call_indeterministic_code() { )); // Create the contract that will call `seal_delegate_call` - let caller_addr = Contracts::bare_instantiate( - ALICE, - 0, - GAS_LIMIT, - None, - Code::Upload(caller_wasm), - vec![], - vec![], - DebugInfo::Skip, - CollectEvents::Skip, - ) - .result - .unwrap() - .account_id; + let caller_addr = + builder::bare_instantiate(Code::Upload(caller_wasm)).build_and_unwrap_account_id(); // The delegate call will fail in deterministic mode assert_err!( - >::bare_call( - ALICE, - caller_addr.clone(), - 0, - GAS_LIMIT, - None, - code_hash.encode(), - DebugInfo::Skip, - CollectEvents::Skip, - Determinism::Enforced, - ) - .result, + builder::bare_call(caller_addr.clone()).data(code_hash.encode()).build().result, >::Indeterministic, ); - // The delegate call will work on non deterministic mode + // The delegate call will work on non-deterministic mode assert_ok!( - >::bare_call( - ALICE, - caller_addr.clone(), - 0, - GAS_LIMIT, - None, - code_hash.encode(), - DebugInfo::Skip, - CollectEvents::Skip, - Determinism::Relaxed, - ) - .result + builder::bare_call(caller_addr.clone()) + .data(code_hash.encode()) + .determinism(Determinism::Relaxed) + .build() + .result ); }); } #[test] -fn add_remove_delegate_dependency_works() { +fn locking_delegate_dependency_works() { // set hash lock up deposit to 30%, to test deposit calculation. CODE_HASH_LOCKUP_DEPOSIT_PERCENT.with(|c| *c.borrow_mut() = Perbill::from_percent(30)); MAX_DELEGATE_DEPENDENCIES.with(|c| *c.borrow_mut() = 1); let (wasm_caller, self_code_hash) = - compile_module::("add_remove_delegate_dependency").unwrap(); + compile_module::("locking_delegate_dependency").unwrap(); let (wasm_callee, code_hash) = compile_module::("dummy").unwrap(); let (wasm_other, other_code_hash) = compile_module::("call").unwrap(); - // Define inputs with various actions to test adding / removing delegate_dependencies. + // Define inputs with various actions to test locking / unlocking delegate_dependencies. // See the contract for more details. let noop_input = (0u32, code_hash); - let add_delegate_dependency_input = (1u32, code_hash); - let remove_delegate_dependency_input = (2u32, code_hash); + let lock_delegate_dependency_input = (1u32, code_hash); + let unlock_delegate_dependency_input = (2u32, code_hash); let terminate_input = (3u32, code_hash); // Instantiate the caller contract with the given input. let instantiate = |input: &(u32, H256)| { - Contracts::bare_instantiate( - ALICE, - 0, - GAS_LIMIT, - None, - Code::Upload(wasm_caller.clone()), - input.encode(), - vec![], - DebugInfo::Skip, - CollectEvents::Skip, - ) + builder::bare_instantiate(Code::Upload(wasm_caller.clone())) + .data(input.encode()) + .build() }; // Call contract with the given input. let call = |addr_caller: &AccountId32, input: &(u32, H256)| { - >::bare_call( - ALICE, - addr_caller.clone(), - 0, - GAS_LIMIT, - None, - input.encode(), - DebugInfo::UnsafeDebug, - CollectEvents::Skip, - Determinism::Enforced, - ) + builder::bare_call(addr_caller.clone()).data(input.encode()).build() }; - const ED: u64 = 2000; ExtBuilder::default().existential_deposit(ED).build().execute_with(|| { let _ = Balances::set_balance(&ALICE, 1_000_000); - // Instantiate with add_delegate_dependency should fail since the code is not yet on chain. + // Instantiate with lock_delegate_dependency should fail since the code is not yet on chain. assert_err!( - instantiate(&add_delegate_dependency_input).result, + instantiate(&lock_delegate_dependency_input).result, Error::::CodeNotFound ); @@ -5435,7 +3805,7 @@ fn add_remove_delegate_dependency_works() { .unwrap(); // Instantiate should now work. - let addr_caller = instantiate(&add_delegate_dependency_input).result.unwrap().account_id; + let addr_caller = instantiate(&lock_delegate_dependency_input).result.unwrap().account_id; // There should be a dependency and a deposit. let contract = test_utils::get_contract(&addr_caller); @@ -5447,7 +3817,7 @@ fn add_remove_delegate_dependency_works() { &HoldReason::StorageDepositReserve.into(), &addr_caller ), - dependency_deposit + contract.storage_base_deposit() - ED + dependency_deposit + contract.storage_base_deposit() ); // Removing the code should fail, since we have added a dependency. @@ -5456,27 +3826,27 @@ fn add_remove_delegate_dependency_works() { >::CodeInUse ); - // Adding an already existing dependency should fail. + // Locking an already existing dependency should fail. assert_err!( - call(&addr_caller, &add_delegate_dependency_input).result, + call(&addr_caller, &lock_delegate_dependency_input).result, Error::::DelegateDependencyAlreadyExists ); - // Adding a dependency to self should fail. + // Locking self should fail. assert_err!( call(&addr_caller, &(1u32, self_code_hash)).result, Error::::CannotAddSelfAsDelegateDependency ); - // Adding more than the maximum allowed delegate_dependencies should fail. + // Locking more than the maximum allowed delegate_dependencies should fail. Contracts::bare_upload_code(ALICE, wasm_other, None, Determinism::Enforced).unwrap(); assert_err!( call(&addr_caller, &(1u32, other_code_hash)).result, Error::::MaxDelegateDependenciesReached ); - // Removing dependency should work. - assert_ok!(call(&addr_caller, &remove_delegate_dependency_input).result); + // Unlocking dependency should work. + assert_ok!(call(&addr_caller, &unlock_delegate_dependency_input).result); // Dependency should be removed, and deposit should be returned. let contract = test_utils::get_contract(&addr_caller); @@ -5486,23 +3856,23 @@ fn add_remove_delegate_dependency_works() { &HoldReason::StorageDepositReserve.into(), &addr_caller ), - contract.storage_base_deposit() - ED + contract.storage_base_deposit() ); - // Removing an unexisting dependency should fail. + // Removing a nonexistent dependency should fail. assert_err!( - call(&addr_caller, &remove_delegate_dependency_input).result, + call(&addr_caller, &unlock_delegate_dependency_input).result, Error::::DelegateDependencyNotFound ); - // Adding a dependency with a storage limit too low should fail. + // Locking a dependency with a storage limit too low should fail. DEFAULT_DEPOSIT_LIMIT.with(|c| *c.borrow_mut() = dependency_deposit - 1); assert_err!( - call(&addr_caller, &add_delegate_dependency_input).result, + call(&addr_caller, &lock_delegate_dependency_input).result, Error::::StorageDepositLimitExhausted ); - // Since we removed the dependency we should now be able to remove the code. + // Since we unlocked the dependency we should now be able to remove the code. assert_ok!(Contracts::remove_code(RuntimeOrigin::signed(ALICE), code_hash)); // Calling should fail since the delegated contract is not on chain anymore. @@ -5511,14 +3881,14 @@ fn add_remove_delegate_dependency_works() { // Restore initial deposit limit and add the dependency back. DEFAULT_DEPOSIT_LIMIT.with(|c| *c.borrow_mut() = 10_000_000); Contracts::bare_upload_code(ALICE, wasm_callee, None, Determinism::Enforced).unwrap(); - call(&addr_caller, &add_delegate_dependency_input).result.unwrap(); + call(&addr_caller, &lock_delegate_dependency_input).result.unwrap(); // Call terminate should work, and return the deposit. let balance_before = test_utils::get_balance(&ALICE); assert_ok!(call(&addr_caller, &terminate_input).result); assert_eq!( test_utils::get_balance(&ALICE), - balance_before + contract.storage_base_deposit() + dependency_deposit + ED + balance_before + contract.storage_base_deposit() + dependency_deposit ); // Terminate should also remove the dependency, so we can remove the code. @@ -5534,13 +3904,9 @@ fn native_dependency_deposit_works() { // Set hash lock up deposit to 30%, to test deposit calculation. CODE_HASH_LOCKUP_DEPOSIT_PERCENT.with(|c| *c.borrow_mut() = Perbill::from_percent(30)); - // Set a low existential deposit so that the base storage deposit is based on the contract - // storage deposit rather than the existential deposit. - const ED: u64 = 10; - // Test with both existing and uploaded code for code in [Code::Upload(wasm.clone()), Code::Existing(code_hash)] { - ExtBuilder::default().existential_deposit(ED).build().execute_with(|| { + ExtBuilder::default().build().execute_with(|| { let _ = Balances::set_balance(&ALICE, 1_000_000); let lockup_deposit_percent = CodeHashLockupDepositPercent::get(); @@ -5569,52 +3935,33 @@ fn native_dependency_deposit_works() { }; // Instantiate the set_code_hash contract. - let res = Contracts::bare_instantiate( - ALICE, - 0, - GAS_LIMIT, - None, - code, - vec![], - vec![], - DebugInfo::Skip, - CollectEvents::Skip, - ); + let res = builder::bare_instantiate(code).build(); let addr = res.result.unwrap().account_id; - let base_deposit = ED + test_utils::contract_info_storage_deposit(&addr); + let base_deposit = test_utils::contract_info_storage_deposit(&addr); let upload_deposit = test_utils::get_code_deposit(&code_hash); let extra_deposit = add_upload_deposit.then(|| upload_deposit).unwrap_or_default(); // Check initial storage_deposit - // The base deposit should be: ED + contract_info_storage_deposit + 30% * deposit + // The base deposit should be: contract_info_storage_deposit + 30% * deposit let deposit = extra_deposit + base_deposit + lockup_deposit_percent.mul_ceil(upload_deposit); - assert_eq!(res.storage_deposit.charge_or_zero(), deposit); + assert_eq!(res.storage_deposit.charge_or_zero(), deposit + Contracts::min_balance()); // call set_code_hash - >::bare_call( - ALICE, - addr.clone(), - 0, - GAS_LIMIT, - None, - dummy_code_hash.encode(), - DebugInfo::Skip, - CollectEvents::Skip, - Determinism::Enforced, - ) - .result - .unwrap(); + builder::bare_call(addr.clone()) + .data(dummy_code_hash.encode()) + .build_and_unwrap_result(); // Check updated storage_deposit let code_deposit = test_utils::get_code_deposit(&dummy_code_hash); let deposit = base_deposit + lockup_deposit_percent.mul_ceil(code_deposit); assert_eq!(test_utils::get_contract(&addr).storage_base_deposit(), deposit); + assert_eq!( test_utils::get_balance_on_hold(&HoldReason::StorageDepositReserve.into(), &addr), - deposit - ED + deposit ); }); } @@ -5627,37 +3974,17 @@ fn reentrance_count_works_with_call() { ExtBuilder::default().existential_deposit(100).build().execute_with(|| { let _ = ::Currency::set_balance(&ALICE, 1_000_000); - let contract_addr = Contracts::bare_instantiate( - ALICE, - 300_000, - GAS_LIMIT, - None, - Code::Upload(wasm), - vec![], - vec![], - DebugInfo::Skip, - CollectEvents::Skip, - ) - .result - .unwrap() - .account_id; + let contract_addr = builder::bare_instantiate(Code::Upload(wasm)) + .value(300_000) + .build_and_unwrap_account_id(); // passing reentrant count to the input let input = 0.encode(); - Contracts::bare_call( - ALICE, - contract_addr, - 0, - GAS_LIMIT, - None, - input, - DebugInfo::UnsafeDebug, - CollectEvents::Skip, - Determinism::Enforced, - ) - .result - .unwrap(); + builder::bare_call(contract_addr) + .data(input) + .debug(DebugInfo::UnsafeDebug) + .build_and_unwrap_result(); }); } @@ -5668,37 +3995,17 @@ fn reentrance_count_works_with_delegated_call() { ExtBuilder::default().existential_deposit(100).build().execute_with(|| { let _ = ::Currency::set_balance(&ALICE, 1_000_000); - let contract_addr = Contracts::bare_instantiate( - ALICE, - 300_000, - GAS_LIMIT, - None, - Code::Upload(wasm), - vec![], - vec![], - DebugInfo::Skip, - CollectEvents::Skip, - ) - .result - .unwrap() - .account_id; + let contract_addr = builder::bare_instantiate(Code::Upload(wasm)) + .value(300_000) + .build_and_unwrap_account_id(); // adding a callstack height to the input let input = (code_hash, 1).encode(); - Contracts::bare_call( - ALICE, - contract_addr.clone(), - 0, - GAS_LIMIT, - None, - input, - DebugInfo::UnsafeDebug, - CollectEvents::Skip, - Determinism::Enforced, - ) - .result - .unwrap(); + builder::bare_call(contract_addr.clone()) + .data(input) + .debug(DebugInfo::UnsafeDebug) + .build_and_unwrap_result(); }); } @@ -5711,63 +4018,23 @@ fn account_reentrance_count_works() { ExtBuilder::default().existential_deposit(100).build().execute_with(|| { let _ = ::Currency::set_balance(&ALICE, 1_000_000); - let contract_addr = Contracts::bare_instantiate( - ALICE, - 300_000, - GAS_LIMIT, - None, - Code::Upload(wasm), - vec![], - vec![], - DebugInfo::Skip, - CollectEvents::Skip, - ) - .result - .unwrap() - .account_id; + let contract_addr = builder::bare_instantiate(Code::Upload(wasm)) + .value(300_000) + .build_and_unwrap_account_id(); - let another_contract_addr = Contracts::bare_instantiate( - ALICE, - 300_000, - GAS_LIMIT, - None, - Code::Upload(wasm_reentrance_count), - vec![], - vec![], - DebugInfo::Skip, - CollectEvents::Skip, - ) - .result - .unwrap() - .account_id; - - let result1 = Contracts::bare_call( - ALICE, - contract_addr.clone(), - 0, - GAS_LIMIT, - None, - contract_addr.encode(), - DebugInfo::UnsafeDebug, - CollectEvents::Skip, - Determinism::Enforced, - ) - .result - .unwrap(); + let another_contract_addr = builder::bare_instantiate(Code::Upload(wasm_reentrance_count)) + .value(300_000) + .build_and_unwrap_account_id(); - let result2 = Contracts::bare_call( - ALICE, - contract_addr.clone(), - 0, - GAS_LIMIT, - None, - another_contract_addr.encode(), - DebugInfo::UnsafeDebug, - CollectEvents::Skip, - Determinism::Enforced, - ) - .result - .unwrap(); + let result1 = builder::bare_call(contract_addr.clone()) + .data(contract_addr.encode()) + .debug(DebugInfo::UnsafeDebug) + .build_and_unwrap_result(); + + let result2 = builder::bare_call(contract_addr.clone()) + .data(another_contract_addr.encode()) + .debug(DebugInfo::UnsafeDebug) + .build_and_unwrap_result(); assert_eq!(result1.data, 1.encode()); assert_eq!(result2.data, 0.encode()); @@ -5814,7 +4081,7 @@ fn signed_cannot_set_code() { fn none_cannot_call_code() { ExtBuilder::default().build().execute_with(|| { assert_noop!( - Contracts::call(RuntimeOrigin::none(), BOB, 0, GAS_LIMIT, None, Vec::new()), + builder::call(BOB).origin(RuntimeOrigin::none()).build(), DispatchError::BadOrigin, ); }); @@ -5827,30 +4094,10 @@ fn root_can_call() { ExtBuilder::default().existential_deposit(100).build().execute_with(|| { let _ = ::Currency::set_balance(&ALICE, 1_000_000); - let addr = Contracts::bare_instantiate( - ALICE, - 0, - GAS_LIMIT, - None, - Code::Upload(wasm), - vec![], - vec![], - DebugInfo::Skip, - CollectEvents::Skip, - ) - .result - .unwrap() - .account_id; + let addr = builder::bare_instantiate(Code::Upload(wasm)).build_and_unwrap_account_id(); // Call the contract. - assert_ok!(Contracts::call( - RuntimeOrigin::root(), - addr.clone(), - 0, - GAS_LIMIT, - None, - vec![] - )); + assert_ok!(builder::call(addr.clone()).origin(RuntimeOrigin::root()).build()); }); } @@ -5860,15 +4107,7 @@ fn root_cannot_instantiate_with_code() { ExtBuilder::default().build().execute_with(|| { assert_err_ignore_postinfo!( - Contracts::instantiate_with_code( - RuntimeOrigin::root(), - 0, - GAS_LIMIT, - None, - wasm, - vec![], - vec![], - ), + builder::instantiate_with_code(wasm).origin(RuntimeOrigin::root()).build(), DispatchError::BadOrigin ); }); @@ -5880,16 +4119,79 @@ fn root_cannot_instantiate() { ExtBuilder::default().build().execute_with(|| { assert_err_ignore_postinfo!( - Contracts::instantiate( + builder::instantiate(code_hash).origin(RuntimeOrigin::root()).build(), + DispatchError::BadOrigin + ); + }); +} + +#[test] +fn only_upload_origin_can_upload() { + let (wasm, _) = compile_module::("dummy").unwrap(); + UploadAccount::set(Some(ALICE)); + ExtBuilder::default().build().execute_with(|| { + let _ = Balances::set_balance(&ALICE, 1_000_000); + let _ = Balances::set_balance(&BOB, 1_000_000); + + assert_err!( + Contracts::upload_code( RuntimeOrigin::root(), - 0, - GAS_LIMIT, + wasm.clone(), None, - code_hash, - vec![], - vec![], + Determinism::Enforced, + ), + DispatchError::BadOrigin + ); + + assert_err!( + Contracts::upload_code( + RuntimeOrigin::signed(BOB), + wasm.clone(), + None, + Determinism::Enforced, ), - DispatchError::RootNotAllowed + DispatchError::BadOrigin + ); + + // Only alice is allowed to upload contract code. + assert_ok!(Contracts::upload_code( + RuntimeOrigin::signed(ALICE), + wasm.clone(), + None, + Determinism::Enforced, + )); + }); +} + +#[test] +fn only_instantiation_origin_can_instantiate() { + let (code, code_hash) = compile_module::("dummy").unwrap(); + InstantiateAccount::set(Some(ALICE)); + ExtBuilder::default().build().execute_with(|| { + let _ = Balances::set_balance(&ALICE, 1_000_000); + let _ = Balances::set_balance(&BOB, 1_000_000); + + assert_err_ignore_postinfo!( + builder::instantiate_with_code(code.clone()) + .origin(RuntimeOrigin::root()) + .build(), + DispatchError::BadOrigin + ); + + assert_err_ignore_postinfo!( + builder::instantiate_with_code(code.clone()) + .origin(RuntimeOrigin::signed(BOB)) + .build(), + DispatchError::BadOrigin + ); + + // Only Alice can instantiate + assert_ok!(builder::instantiate_with_code(code).build()); + + // Bob cannot instantiate with either `instantiate_with_code` or `instantiate`. + assert_err_ignore_postinfo!( + builder::instantiate(code_hash).origin(RuntimeOrigin::signed(BOB)).build(), + DispatchError::BadOrigin ); }); } @@ -5901,45 +4203,46 @@ fn balance_api_returns_free_balance() { let _ = ::Currency::set_balance(&ALICE, 1_000_000); // Instantiate the BOB contract without any extra balance. - let addr = Contracts::bare_instantiate( - ALICE, - 0, - GAS_LIMIT, - None, - Code::Upload(wasm.to_vec()), - vec![], - vec![], - DebugInfo::Skip, - CollectEvents::Skip, - ) - .result - .unwrap() - .account_id; + let addr = + builder::bare_instantiate(Code::Upload(wasm.to_vec())).build_and_unwrap_account_id(); let value = 0; // Call BOB which makes it call the balance runtime API. // The contract code asserts that the returned balance is 0. - assert_ok!(Contracts::call( - RuntimeOrigin::signed(ALICE), - addr.clone(), - value, - GAS_LIMIT, - None, - vec![] - )); + assert_ok!(builder::call(addr.clone()).value(value).build()); let value = 1; // Calling with value will trap the contract. assert_err_ignore_postinfo!( - Contracts::call( - RuntimeOrigin::signed(ALICE), - addr.clone(), - value, - GAS_LIMIT, - None, - vec![] - ), + builder::call(addr.clone()).value(value).build(), >::ContractTrapped ); }); } + +#[test] +fn gas_consumed_is_linear_for_nested_calls() { + let (code, _code_hash) = compile_module::("recurse").unwrap(); + ExtBuilder::default().existential_deposit(200).build().execute_with(|| { + let _ = ::Currency::set_balance(&ALICE, 1_000_000); + + let addr = builder::bare_instantiate(Code::Upload(code)).build_and_unwrap_account_id(); + + let max_call_depth = ::CallStack::size() as u32; + let [gas_0, gas_1, gas_2, gas_max] = { + [0u32, 1u32, 2u32, max_call_depth] + .iter() + .map(|i| { + let result = builder::bare_call(addr.clone()).data(i.encode()).build(); + assert_ok!(result.result); + result.gas_consumed + }) + .collect::>() + .try_into() + .unwrap() + }; + + let gas_per_recursion = gas_2.checked_sub(&gas_1).unwrap(); + assert_eq!(gas_max, gas_0 + gas_per_recursion * max_call_depth as u64); + }); +} diff --git a/substrate/frame/contracts/src/tests/builder.rs b/substrate/frame/contracts/src/tests/builder.rs new file mode 100644 index 0000000000000000000000000000000000000000..08d12503a290ad30a08c44daf73647e278b9a398 --- /dev/null +++ b/substrate/frame/contracts/src/tests/builder.rs @@ -0,0 +1,219 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use super::{AccountId32, Test, ALICE, GAS_LIMIT}; +use crate::{ + tests::RuntimeOrigin, AccountIdLookupOf, AccountIdOf, BalanceOf, Code, CodeHash, CollectEvents, + ContractExecResult, ContractInstantiateResult, DebugInfo, Determinism, EventRecordOf, + ExecReturnValue, OriginFor, Pallet, Weight, +}; +use codec::Compact; +use frame_support::pallet_prelude::DispatchResultWithPostInfo; +use paste::paste; + +/// Helper macro to generate a builder for contract API calls. +macro_rules! builder { + // Entry point to generate a builder for the given method. + ( + $method:ident($($field:ident: $type:ty,)*) -> $result:ty + ) => { + paste!{ + builder!([< $method:camel Builder >], $method($($field: $type,)* ) -> $result); + } + }; + // Generate the builder struct and its methods. + ( + $name:ident, + $method:ident( + $($field:ident: $type:ty,)* + ) -> $result:ty + ) => { + #[doc = concat!("A builder to construct a ", stringify!($method), " call")] + pub struct $name { + $($field: $type,)* + } + + #[allow(dead_code)] + impl $name + { + $( + #[doc = concat!("Set the ", stringify!($field))] + pub fn $field(mut self, value: $type) -> Self { + self.$field = value; + self + } + )* + + #[doc = concat!("Build the ", stringify!($method), " call")] + pub fn build(self) -> $result { + Pallet::::$method( + $(self.$field,)* + ) + } + } + } +} + +builder!( + instantiate_with_code( + origin: OriginFor, + value: BalanceOf, + gas_limit: Weight, + storage_deposit_limit: Option>>, + code: Vec, + data: Vec, + salt: Vec, + ) -> DispatchResultWithPostInfo +); + +builder!( + instantiate( + origin: OriginFor, + value: BalanceOf, + gas_limit: Weight, + storage_deposit_limit: Option>>, + code_hash: CodeHash, + data: Vec, + salt: Vec, + ) -> DispatchResultWithPostInfo +); + +builder!( + bare_instantiate( + origin: AccountIdOf, + value: BalanceOf, + gas_limit: Weight, + storage_deposit_limit: Option>, + code: Code>, + data: Vec, + salt: Vec, + debug: DebugInfo, + collect_events: CollectEvents, + ) -> ContractInstantiateResult, BalanceOf, EventRecordOf> +); + +builder!( + call( + origin: OriginFor, + dest: AccountIdLookupOf, + value: BalanceOf, + gas_limit: Weight, + storage_deposit_limit: Option>>, + data: Vec, + ) -> DispatchResultWithPostInfo +); + +builder!( + bare_call( + origin: AccountIdOf, + dest: AccountIdOf, + value: BalanceOf, + gas_limit: Weight, + storage_deposit_limit: Option>, + data: Vec, + debug: DebugInfo, + collect_events: CollectEvents, + determinism: Determinism, + ) -> ContractExecResult, EventRecordOf> +); + +/// Create a [`BareInstantiateBuilder`] with default values. +pub fn bare_instantiate(code: Code>) -> BareInstantiateBuilder { + BareInstantiateBuilder { + origin: ALICE, + value: 0, + gas_limit: GAS_LIMIT, + storage_deposit_limit: None, + code, + data: vec![], + salt: vec![], + debug: DebugInfo::Skip, + collect_events: CollectEvents::Skip, + } +} + +impl BareInstantiateBuilder { + /// Build the instantiate call and unwrap the result. + pub fn build_and_unwrap_result(self) -> crate::InstantiateReturnValue> { + self.build().result.unwrap() + } + + /// Build the instantiate call and unwrap the account id. + pub fn build_and_unwrap_account_id(self) -> AccountIdOf { + self.build().result.unwrap().account_id + } +} + +/// Create a [`BareCallBuilder`] with default values. +pub fn bare_call(dest: AccountId32) -> BareCallBuilder { + BareCallBuilder { + origin: ALICE, + dest, + value: 0, + gas_limit: GAS_LIMIT, + storage_deposit_limit: None, + data: vec![], + debug: DebugInfo::Skip, + collect_events: CollectEvents::Skip, + determinism: Determinism::Enforced, + } +} + +impl BareCallBuilder { + /// Build the call and unwrap the result. + pub fn build_and_unwrap_result(self) -> ExecReturnValue { + self.build().result.unwrap() + } +} + +/// Create an [`InstantiateWithCodeBuilder`] with default values. +pub fn instantiate_with_code(code: Vec) -> InstantiateWithCodeBuilder { + InstantiateWithCodeBuilder { + origin: RuntimeOrigin::signed(ALICE), + value: 0, + gas_limit: GAS_LIMIT, + storage_deposit_limit: None, + code, + data: vec![], + salt: vec![], + } +} + +/// Create an [`InstantiateBuilder`] with default values. +pub fn instantiate(code_hash: CodeHash) -> InstantiateBuilder { + InstantiateBuilder { + origin: RuntimeOrigin::signed(ALICE), + value: 0, + gas_limit: GAS_LIMIT, + storage_deposit_limit: None, + code_hash, + data: vec![], + salt: vec![], + } +} + +/// Create a [`CallBuilder`] with default values. +pub fn call(dest: AccountIdLookupOf) -> CallBuilder { + CallBuilder { + origin: RuntimeOrigin::signed(ALICE), + dest, + value: 0, + gas_limit: GAS_LIMIT, + storage_deposit_limit: None, + data: vec![], + } +} diff --git a/substrate/frame/contracts/src/wasm/mod.rs b/substrate/frame/contracts/src/wasm/mod.rs index d00ec2e47521b12c8082b5a0fd2001fbf5562948..8d7f928dba33d3cb3f221820d2b825e32997db75 100644 --- a/substrate/frame/contracts/src/wasm/mod.rs +++ b/substrate/frame/contracts/src/wasm/mod.rs @@ -24,20 +24,23 @@ mod runtime; #[cfg(doc)] pub use crate::wasm::runtime::api_doc; -pub use crate::wasm::runtime::{ - AllowDeprecatedInterface, AllowUnstableInterface, Environment, Runtime, RuntimeCosts, -}; - #[cfg(test)] -pub use tests::MockExt; +pub use { + crate::wasm::{prepare::tracker, runtime::ReturnErrorCode}, + runtime::STABLE_API_COUNT, + tests::MockExt, +}; -#[cfg(test)] -pub use crate::wasm::runtime::ReturnErrorCode; +pub use crate::wasm::{ + prepare::{LoadedModule, LoadingMode}, + runtime::{ + AllowDeprecatedInterface, AllowUnstableInterface, Environment, Runtime, RuntimeCosts, + }, +}; use crate::{ exec::{ExecResult, Executable, ExportedFunction, Ext}, gas::{GasMeter, Token}, - wasm::prepare::LoadedModule, weights::WeightInfo, AccountIdOf, BadOrigin, BalanceOf, CodeHash, CodeInfoOf, CodeVec, Config, Error, Event, HoldReason, Pallet, PristineCode, Schedule, Weight, LOG_TARGET, @@ -198,17 +201,14 @@ impl WasmBlob { /// When validating we pass `()` as `host_state`. Please note that such a dummy instance must /// **never** be called/executed, since it will panic the executor. pub fn instantiate( - code: &[u8], + contract: LoadedModule, host_state: H, schedule: &Schedule, - determinism: Determinism, - stack_limits: StackLimits, allow_deprecated: AllowDeprecatedInterface, ) -> Result<(Store, Memory, InstancePre), &'static str> where E: Environment, { - let contract = LoadedModule::new::(&code, determinism, Some(stack_limits))?; let mut store = Store::new(&contract.engine, host_state); let mut linker = Linker::new(&contract.engine); E::define( @@ -240,9 +240,10 @@ impl WasmBlob { .define("env", "memory", memory) .expect("We just created the Linker. It has no definitions with this name; qed"); - let instance = linker - .instantiate(&mut store, &contract.module) - .map_err(|_| "can't instantiate module with provided definitions")?; + let instance = linker.instantiate(&mut store, &contract.module).map_err(|err| { + log::debug!(target: LOG_TARGET, "failed to instantiate module: {:?}", err); + "can't instantiate module with provided definitions" + })?; Ok((store, memory, instance)) } @@ -313,6 +314,11 @@ impl CodeInfo { } } + /// Returns the determinism of the module. + pub fn determinism(&self) -> Determinism { + self.determinism + } + /// Returns reference count of the module. pub fn refcount(&self) -> u64 { self.refcount @@ -329,33 +335,66 @@ impl CodeInfo { } } -impl Executable for WasmBlob { - fn from_storage( - code_hash: CodeHash, - gas_meter: &mut GasMeter, - ) -> Result { - let code_info = >::get(code_hash).ok_or(Error::::CodeNotFound)?; - gas_meter.charge(CodeLoadToken(code_info.code_len))?; - let code = >::get(code_hash).ok_or(Error::::CodeNotFound)?; - Ok(Self { code, code_info, code_hash }) +use crate::{ExecError, ExecReturnValue}; +use wasmi::Func; +enum InstanceOrExecReturn<'a, E: Ext> { + Instance((Func, Store>)), + ExecReturn(ExecReturnValue), +} + +type PreExecResult<'a, E> = Result, ExecError>; + +impl WasmBlob { + /// Sync the frame's gas meter with the engine's one. + pub fn process_result>( + mut store: Store>, + result: Result<(), wasmi::Error>, + ) -> ExecResult { + let engine_consumed_total = store.fuel_consumed().expect("Fuel metering is enabled; qed"); + let gas_meter = store.data_mut().ext().gas_meter_mut(); + let _ = gas_meter.sync_from_executor(engine_consumed_total)?; + store.into_data().to_execution_result(result) } - fn execute>( + #[cfg(feature = "runtime-benchmarks")] + pub fn bench_prepare_call>( self, ext: &mut E, - function: &ExportedFunction, input_data: Vec, - ) -> ExecResult { + ) -> (Func, Store>) { + use InstanceOrExecReturn::*; + match Self::prepare_execute(self, Runtime::new(ext, input_data), &ExportedFunction::Call) + .expect("Benchmark should provide valid module") + { + Instance((func, store)) => (func, store), + ExecReturn(_) => panic!("Expected Instance"), + } + } + + fn prepare_execute<'a, E: Ext>( + self, + runtime: Runtime<'a, E>, + function: &'a ExportedFunction, + ) -> PreExecResult<'a, E> { let code = self.code.as_slice(); // Instantiate the Wasm module to the engine. - let runtime = Runtime::new(ext, input_data); let schedule = ::Schedule::get(); + + let contract = LoadedModule::new::( + &code, + self.code_info.determinism, + Some(StackLimits::default()), + LoadingMode::Unchecked, + ) + .map_err(|err| { + log::debug!(target: LOG_TARGET, "failed to create wasmi module: {err:?}"); + Error::::CodeRejected + })?; + let (mut store, memory, instance) = Self::instantiate::( - code, + contract, runtime, &schedule, - self.code_info.determinism, - StackLimits::default(), match function { ExportedFunction::Call => AllowDeprecatedInterface::Yes, ExportedFunction::Constructor => AllowDeprecatedInterface::No, @@ -381,15 +420,6 @@ impl Executable for WasmBlob { .add_fuel(fuel_limit) .expect("We've set up engine to fuel consuming mode; qed"); - // Sync this frame's gas meter with the engine's one. - let process_result = |mut store: Store>, result| { - let engine_consumed_total = - store.fuel_consumed().expect("Fuel metering is enabled; qed"); - let gas_meter = store.data_mut().ext().gas_meter_mut(); - gas_meter.charge_fuel(engine_consumed_total)?; - store.into_data().to_execution_result(result) - }; - // Start function should already see the correct refcount in case it will be ever inspected. if let &ExportedFunction::Constructor = function { E::increment_refcount(self.code_hash)?; @@ -408,10 +438,37 @@ impl Executable for WasmBlob { Error::::CodeRejected })?; - let result = exported_func.call(&mut store, &[], &mut []); - process_result(store, result) + Ok(InstanceOrExecReturn::Instance((exported_func, store))) }, - Err(err) => process_result(store, Err(err)), + Err(err) => Self::process_result(store, Err(err)).map(InstanceOrExecReturn::ExecReturn), + } + } +} + +impl Executable for WasmBlob { + fn from_storage( + code_hash: CodeHash, + gas_meter: &mut GasMeter, + ) -> Result { + let code_info = >::get(code_hash).ok_or(Error::::CodeNotFound)?; + gas_meter.charge(CodeLoadToken(code_info.code_len))?; + let code = >::get(code_hash).ok_or(Error::::CodeNotFound)?; + Ok(Self { code, code_info, code_hash }) + } + + fn execute>( + self, + ext: &mut E, + function: &ExportedFunction, + input_data: Vec, + ) -> ExecResult { + use InstanceOrExecReturn::*; + match Self::prepare_execute(self, Runtime::new(ext, input_data), function)? { + Instance((func, mut store)) => { + let result = func.call(&mut store, &[], &mut []); + Self::process_result(store, result) + }, + ExecReturn(exec_return) => Ok(exec_return), } } @@ -687,6 +744,10 @@ mod tests { &mut self.gas_meter } fn charge_storage(&mut self, _diff: &crate::storage::meter::Diff) {} + + fn debug_buffer_enabled(&self) -> bool { + true + } fn append_debug_buffer(&mut self, msg: &str) -> bool { self.debug_buffer.extend(msg.as_bytes()); true @@ -729,14 +790,14 @@ mod tests { Ok(()) } fn decrement_refcount(_code_hash: CodeHash) {} - fn add_delegate_dependency( + fn lock_delegate_dependency( &mut self, code: CodeHash, ) -> Result<(), DispatchError> { self.delegate_dependencies.borrow_mut().insert(code); Ok(()) } - fn remove_delegate_dependency( + fn unlock_delegate_dependency( &mut self, code: &CodeHash, ) -> Result<(), DispatchError> { @@ -1413,7 +1474,7 @@ mod tests { #[test] fn contract_ecdsa_to_eth_address() { - /// calls `seal_ecdsa_to_eth_address` for the contstant and ensures the result equals the + /// calls `seal_ecdsa_to_eth_address` for the constant and ensures the result equals the /// expected one. const CODE_ECDSA_TO_ETH_ADDRESS: &str = r#" (module @@ -1767,6 +1828,7 @@ mod tests { const CODE_GAS_LEFT: &str = r#" (module (import "seal1" "gas_left" (func $seal_gas_left (param i32 i32))) + (import "seal0" "clear_storage" (func $clear_storage (param i32))) (import "seal0" "seal_return" (func $seal_return (param i32 i32 i32))) (import "env" "memory" (memory 1 1)) @@ -1783,6 +1845,9 @@ mod tests { ) (func (export "call") + ;; Burn some PoV, clear_storage consumes some PoV as in order to clear the storage we need to we need to read its size first. + (call $clear_storage (i32.const 0)) + ;; This stores the weight left to the buffer (call $seal_gas_left (i32.const 0) (i32.const 20)) @@ -1794,6 +1859,9 @@ mod tests { ) ) + ;; Burn some PoV, clear_storage consumes some PoV as in order to clear the storage we need to we need to read its size first. + (call $clear_storage (i32.const 0)) + ;; Return weight left and its encoded value len (call $seal_return (i32.const 0) (i32.const 0) (i32.load (i32.const 20))) @@ -1817,17 +1885,6 @@ mod tests { assert!(weight_left.all_gt(actual_left), "gas_left must be greater than final"); } - /// Test that [`frame_support::weights::OldWeight`] en/decodes the same as our - /// [`crate::OldWeight`]. - #[test] - fn old_weight_decode() { - #![allow(deprecated)] - let sp = frame_support::weights::OldWeight(42).encode(); - let our = crate::OldWeight::decode(&mut &*sp).unwrap(); - - assert_eq!(our, 42); - } - const CODE_VALUE_TRANSFERRED: &str = r#" (module (import "seal0" "seal_value_transferred" (func $seal_value_transferred (param i32 i32))) @@ -3395,16 +3452,16 @@ mod tests { } #[test] - fn add_remove_delegate_dependency() { - const CODE_ADD_REMOVE_DELEGATE_DEPENDENCY: &str = r#" + fn lock_unlock_delegate_dependency() { + const CODE_LOCK_UNLOCK_DELEGATE_DEPENDENCY: &str = r#" (module - (import "seal0" "add_delegate_dependency" (func $add_delegate_dependency (param i32))) - (import "seal0" "remove_delegate_dependency" (func $remove_delegate_dependency (param i32))) + (import "seal0" "lock_delegate_dependency" (func $lock_delegate_dependency (param i32))) + (import "seal0" "unlock_delegate_dependency" (func $unlock_delegate_dependency (param i32))) (import "env" "memory" (memory 1 1)) (func (export "call") - (call $add_delegate_dependency (i32.const 0)) - (call $add_delegate_dependency (i32.const 32)) - (call $remove_delegate_dependency (i32.const 32)) + (call $lock_delegate_dependency (i32.const 0)) + (call $lock_delegate_dependency (i32.const 32)) + (call $unlock_delegate_dependency (i32.const 32)) ) (func (export "deploy")) @@ -3422,7 +3479,7 @@ mod tests { ) "#; let mut mock_ext = MockExt::default(); - assert_ok!(execute(&CODE_ADD_REMOVE_DELEGATE_DEPENDENCY, vec![], &mut mock_ext)); + assert_ok!(execute(&CODE_LOCK_UNLOCK_DELEGATE_DEPENDENCY, vec![], &mut mock_ext)); let delegate_dependencies: Vec<_> = mock_ext.delegate_dependencies.into_inner().into_iter().collect(); assert_eq!(delegate_dependencies.len(), 1); @@ -3444,4 +3501,22 @@ mod tests { runtime.read_sandbox_memory_as(&memory, 0u32).unwrap(); assert_eq!(decoded.into_inner(), data); } + + #[test] + fn run_out_of_gas_in_start_fn() { + const CODE: &str = r#" +(module + (import "env" "memory" (memory 1 1)) + (start $start) + (func $start + (loop $inf (br $inf)) ;; just run out of gas + (unreachable) + ) + (func (export "call")) + (func (export "deploy")) +) +"#; + let mut mock_ext = MockExt::default(); + assert_err!(execute(&CODE, vec![], &mut mock_ext), >::OutOfGas); + } } diff --git a/substrate/frame/contracts/src/wasm/prepare.rs b/substrate/frame/contracts/src/wasm/prepare.rs index dfe8c4f8f9b91fe5e7d73032282fe50effd51d38..0d9a12d8ae837b88a2be0b34d84129564b442562 100644 --- a/substrate/frame/contracts/src/wasm/prepare.rs +++ b/substrate/frame/contracts/src/wasm/prepare.rs @@ -48,6 +48,20 @@ pub struct LoadedModule { pub engine: Engine, } +#[derive(PartialEq, Debug, Clone)] +pub enum LoadingMode { + Checked, + Unchecked, +} + +#[cfg(test)] +pub mod tracker { + use sp_std::cell::RefCell; + thread_local! { + pub static LOADED_MODULE: RefCell> = RefCell::new(Vec::new()); + } +} + impl LoadedModule { /// Creates a new instance of `LoadedModule`. /// @@ -57,6 +71,7 @@ impl LoadedModule { code: &[u8], determinism: Determinism, stack_limits: Option, + _mode: LoadingMode, ) -> Result { // NOTE: wasmi does not support unstable WebAssembly features. The module is implicitly // checked for not having those ones when creating `wasmi::Module` below. @@ -79,7 +94,15 @@ impl LoadedModule { } let engine = Engine::new(&config); - let module = Module::new(&engine, code).map_err(|_| "Can't load the module into wasmi!")?; + + // TODO use Module::new_unchecked when validate_module is true once we are on wasmi@0.32 + let module = Module::new(&engine, code).map_err(|err| { + log::debug!(target: LOG_TARGET, "Module creation failed: {:?}", err); + "Can't load the module into wasmi!" + })?; + + #[cfg(test)] + tracker::LOADED_MODULE.with(|t| t.borrow_mut().push(_mode)); // Return a `LoadedModule` instance with // __valid__ module. @@ -220,20 +243,44 @@ impl LoadedModule { fn validate( code: &[u8], schedule: &Schedule, - determinism: Determinism, + determinism: &mut Determinism, ) -> Result<(), (DispatchError, &'static str)> where E: Environment<()>, T: Config, { - (|| { + let module = (|| { + // We don't actually ever execute this instance so we can get away with a minimal stack + // which reduces the amount of memory that needs to be zeroed. + let stack_limits = Some(StackLimits::new(1, 1, 0).expect("initial <= max; qed")); + // We check that the module is generally valid, // and does not have restricted WebAssembly features, here. - let contract_module = LoadedModule::new::(code, determinism, None)?; + let contract_module = match *determinism { + Determinism::Relaxed => + if let Ok(module) = LoadedModule::new::( + code, + Determinism::Enforced, + stack_limits, + LoadingMode::Checked, + ) { + *determinism = Determinism::Enforced; + module + } else { + LoadedModule::new::(code, Determinism::Relaxed, None, LoadingMode::Checked)? + }, + Determinism::Enforced => LoadedModule::new::( + code, + Determinism::Enforced, + stack_limits, + LoadingMode::Checked, + )?, + }; + // The we check that module satisfies constraints the pallet puts on contracts. contract_module.scan_exports()?; contract_module.scan_imports::(schedule)?; - Ok(()) + Ok(contract_module) })() .map_err(|msg: &str| { log::debug!(target: LOG_TARGET, "New code rejected on validation: {}", msg); @@ -244,22 +291,11 @@ where // // - It doesn't use any unknown imports. // - It doesn't explode the wasmi bytecode generation. - // - // We don't actually ever execute this instance so we can get away with a minimal stack which - // reduces the amount of memory that needs to be zeroed. - let stack_limits = StackLimits::new(1, 1, 0).expect("initial <= max; qed"); - WasmBlob::::instantiate::( - &code, - (), - schedule, - determinism, - stack_limits, - AllowDeprecatedInterface::No, - ) - .map_err(|err| { - log::debug!(target: LOG_TARGET, "{}", err); - (Error::::CodeRejected.into(), "New code rejected on wasmi instantiation!") - })?; + WasmBlob::::instantiate::(module, (), schedule, AllowDeprecatedInterface::No) + .map_err(|err| { + log::debug!(target: LOG_TARGET, "{err}"); + (Error::::CodeRejected.into(), "New code rejected on wasmi instantiation!") + })?; Ok(()) } @@ -276,13 +312,13 @@ pub fn prepare( code: CodeVec, schedule: &Schedule, owner: AccountIdOf, - determinism: Determinism, + mut determinism: Determinism, ) -> Result, (DispatchError, &'static str)> where E: Environment<()>, T: Config, { - validate::(code.as_ref(), schedule, determinism)?; + validate::(code.as_ref(), schedule, &mut determinism)?; // Calculate deposit for storing contract code and `code_info` in two different storage items. let code_len = code.len() as u32; @@ -312,7 +348,8 @@ pub mod benchmarking { owner: AccountIdOf, ) -> Result, DispatchError> { let determinism = Determinism::Enforced; - let contract_module = LoadedModule::new::(&code, determinism, None)?; + let contract_module = + LoadedModule::new::(&code, determinism, None, LoadingMode::Checked)?; let _ = contract_module.scan_imports::(schedule)?; let code: CodeVec = code.try_into().map_err(|_| >::CodeTooLarge)?; let code_info = CodeInfo { @@ -384,12 +421,7 @@ mod tests { let wasm = wat::parse_str($wat).unwrap().try_into().unwrap(); let schedule = Schedule { limits: Limits { - globals: 3, - locals: 3, - parameters: 3, memory_pages: 16, - table_size: 3, - br_table_size: 3, .. Default::default() }, .. Default::default() diff --git a/substrate/frame/contracts/src/wasm/runtime.rs b/substrate/frame/contracts/src/wasm/runtime.rs index 3af0d04a3ad1378aa6826382b8babc9d5bf90a5a..28a08ab0224ddf4603c881b50c9359d4a6f54d46 100644 --- a/substrate/frame/contracts/src/wasm/runtime.rs +++ b/substrate/frame/contracts/src/wasm/runtime.rs @@ -21,17 +21,12 @@ use crate::{ exec::{ExecError, ExecResult, Ext, Key, TopicOf}, gas::{ChargedAmount, Token}, primitives::ExecReturnValue, - schedule::HostFnWeights, BalanceOf, CodeHash, Config, DebugBufferVec, Error, SENTINEL, }; use codec::{Decode, DecodeLimit, Encode, MaxEncodedLen}; use frame_support::{ - dispatch::DispatchInfo, - ensure, - pallet_prelude::{DispatchResult, DispatchResultWithPostInfo}, - parameter_types, - traits::Get, - weights::Weight, + dispatch::DispatchInfo, ensure, pallet_prelude::DispatchResultWithPostInfo, parameter_types, + traits::Get, weights::Weight, }; use pallet_contracts_proc_macro::define_env; use pallet_contracts_uapi::{CallFlags, ReturnFlags}; @@ -42,9 +37,6 @@ use sp_runtime::{ }; use sp_std::{fmt, prelude::*}; use wasmi::{core::HostError, errors::LinkerError, Linker, Memory, Store}; -use xcm::VersionedXcm; - -type CallOf = ::RuntimeCall; /// The maximum nesting depth a contract can use when encoding types. const MAX_DECODE_NESTING: u32 = 256; @@ -235,6 +227,8 @@ pub enum RuntimeCosts { ChainExtension(Weight), /// Weight charged for calling into the runtime. CallRuntime(Weight), + /// Weight charged for calling xcm_execute. + CallXcmExecute(Weight), /// Weight of calling `seal_set_code_hash` SetCodeHash, /// Weight of calling `ecdsa_to_eth_address` @@ -244,17 +238,25 @@ pub enum RuntimeCosts { /// Weight of calling `account_reentrance_count` AccountEntranceCount, /// Weight of calling `instantiation_nonce` - InstantationNonce, - /// Weight of calling `add_delegate_dependency` - AddDelegateDependency, - /// Weight of calling `remove_delegate_dependency` - RemoveDelegateDependency, + InstantiationNonce, + /// Weight of calling `lock_delegate_dependency` + LockDelegateDependency, + /// Weight of calling `unlock_delegate_dependency` + UnlockDelegateDependency, } -impl RuntimeCosts { - fn token(&self, s: &HostFnWeights) -> RuntimeToken { +impl Token for RuntimeCosts { + fn influence_lowest_gas_limit(&self) -> bool { + match self { + &Self::CallXcmExecute(_) => false, + _ => true, + } + } + + fn weight(&self) -> Weight { + let s = T::Schedule::get().host_fn_weights; use self::RuntimeCosts::*; - let weight = match *self { + match *self { CopyFromContract(len) => s.return_per_byte.saturating_mul(len.into()), CopyToContract(len) => s.input_per_byte.saturating_mul(len.into()), Caller => s.caller, @@ -323,20 +325,14 @@ impl RuntimeCosts { Sr25519Verify(len) => s .sr25519_verify .saturating_add(s.sr25519_verify_per_byte.saturating_mul(len.into())), - ChainExtension(weight) => weight, - CallRuntime(weight) => weight, + ChainExtension(weight) | CallRuntime(weight) | CallXcmExecute(weight) => weight, SetCodeHash => s.set_code_hash, EcdsaToEthAddress => s.ecdsa_to_eth_address, ReentrantCount => s.reentrance_count, AccountEntranceCount => s.account_reentrance_count, - InstantationNonce => s.instantiation_nonce, - AddDelegateDependency => s.add_delegate_dependency, - RemoveDelegateDependency => s.remove_delegate_dependency, - }; - RuntimeToken { - #[cfg(test)] - _created_from: *self, - weight, + InstantiationNonce => s.instantiation_nonce, + LockDelegateDependency => s.lock_delegate_dependency, + UnlockDelegateDependency => s.unlock_delegate_dependency, } } } @@ -347,25 +343,10 @@ impl RuntimeCosts { /// a function won't work out. macro_rules! charge_gas { ($runtime:expr, $costs:expr) => {{ - let token = $costs.token(&$runtime.ext.schedule().host_fn_weights); - $runtime.ext.gas_meter_mut().charge(token) + $runtime.ext.gas_meter_mut().charge($costs) }}; } -#[cfg_attr(test, derive(Debug, PartialEq, Eq))] -#[derive(Copy, Clone)] -struct RuntimeToken { - #[cfg(test)] - _created_from: RuntimeCosts, - weight: Weight, -} - -impl Token for RuntimeToken { - fn weight(&self) -> Weight { - self.weight - } -} - /// The kind of call that should be performed. enum CallType { /// Execute another instantiated contract @@ -390,29 +371,6 @@ fn already_charged(_: u32) -> Option { None } -/// Ensure that the XCM program is executable, by checking that it does not contain any [`Transact`] -/// instruction with a call that is not allowed by the CallFilter. -fn ensure_executable(message: &VersionedXcm>) -> DispatchResult { - use frame_support::traits::Contains; - use xcm::prelude::{Transact, Xcm}; - - let mut message: Xcm> = - message.clone().try_into().map_err(|_| Error::::XCMDecodeFailed)?; - - message.iter_mut().try_for_each(|inst| -> DispatchResult { - let Transact { ref mut call, .. } = inst else { return Ok(()) }; - let call = call.ensure_decoded().map_err(|_| Error::::XCMDecodeFailed)?; - - if !::CallFilter::contains(call) { - return Err(frame_system::Error::::CallFiltered.into()) - } - - Ok(()) - })?; - - Ok(()) -} - /// Can only be used for one call. pub struct Runtime<'a, E: Ext + 'a> { ext: &'a mut E, @@ -506,28 +464,25 @@ impl<'a, E: Ext + 'a> Runtime<'a, E> { /// This is when a maximum a priori amount was charged and then should be partially /// refunded to match the actual amount. pub fn adjust_gas(&mut self, charged: ChargedAmount, actual_costs: RuntimeCosts) { - let token = actual_costs.token(&self.ext.schedule().host_fn_weights); - self.ext.gas_meter_mut().adjust_gas(charged, token); + self.ext.gas_meter_mut().adjust_gas(charged, actual_costs); } /// Charge, Run and adjust gas, for executing the given dispatchable. - fn call_dispatchable< - ErrorReturnCode: Get, - F: FnOnce(&mut Self) -> DispatchResultWithPostInfo, - >( + fn call_dispatchable>( &mut self, dispatch_info: DispatchInfo, - run: F, + runtime_cost: impl Fn(Weight) -> RuntimeCosts, + run: impl FnOnce(&mut Self) -> DispatchResultWithPostInfo, ) -> Result { use frame_support::dispatch::extract_actual_weight; - let charged = self.charge_gas(RuntimeCosts::CallRuntime(dispatch_info.weight))?; + let charged = self.charge_gas(runtime_cost(dispatch_info.weight))?; let result = run(self); let actual_weight = extract_actual_weight(&result, &dispatch_info); - self.adjust_gas(charged, RuntimeCosts::CallRuntime(actual_weight)); + self.adjust_gas(charged, runtime_cost(actual_weight)); match result { Ok(_) => Ok(ReturnErrorCode::Success), Err(e) => { - if self.ext.append_debug_buffer("") { + if self.ext.debug_buffer_enabled() { self.ext.append_debug_buffer("call failed with: "); self.ext.append_debug_buffer(e.into()); }; @@ -1002,7 +957,6 @@ impl<'a, E: Ext + 'a> Runtime<'a, E> { // for every function. #[define_env(doc)] pub mod env { - /// Set the value at the given key in the contract storage. /// See [`pallet_contracts_uapi::HostFn::set_storage`] #[prefixed_alias] @@ -1231,7 +1185,6 @@ pub mod env { /// Make a call to another contract. /// See [`pallet_contracts_uapi::HostFn::call_v2`]. #[version(2)] - #[unstable] fn call( ctx: _, memory: _, @@ -1368,7 +1321,6 @@ pub mod env { /// Instantiate a contract with the specified code hash. /// See [`pallet_contracts_uapi::HostFn::instantiate_v2`]. #[version(2)] - #[unstable] fn instantiate( ctx: _, memory: _, @@ -2113,9 +2065,11 @@ pub mod env { ctx.charge_gas(RuntimeCosts::CopyFromContract(call_len))?; let call: ::RuntimeCall = ctx.read_sandbox_memory_as_unbounded(memory, call_ptr, call_len)?; - ctx.call_dispatchable::(call.get_dispatch_info(), |ctx| { - ctx.ext.call_runtime(call) - }) + ctx.call_dispatchable::( + call.get_dispatch_info(), + RuntimeCosts::CallRuntime, + |ctx| ctx.ext.call_runtime(call), + ) } /// Execute an XCM program locally, using the contract's address as the origin. @@ -2126,35 +2080,32 @@ pub mod env { memory: _, msg_ptr: u32, msg_len: u32, - output_ptr: u32, ) -> Result { use frame_support::dispatch::DispatchInfo; - use xcm::VersionedXcm; use xcm_builder::{ExecuteController, ExecuteControllerWeightInfo}; ctx.charge_gas(RuntimeCosts::CopyFromContract(msg_len))?; - let message: VersionedXcm> = - ctx.read_sandbox_memory_as_unbounded(memory, msg_ptr, msg_len)?; + let message = ctx.read_sandbox_memory_as_unbounded(memory, msg_ptr, msg_len)?; let execute_weight = - <::Xcm as ExecuteController<_, _>>::WeightInfo::execute(); + <::Xcm as ExecuteController<_, _>>::WeightInfo::execute_blob(); let weight = ctx.ext.gas_meter().gas_left().max(execute_weight); let dispatch_info = DispatchInfo { weight, ..Default::default() }; - ensure_executable::(&message)?; - ctx.call_dispatchable::(dispatch_info, |ctx| { - let origin = crate::RawOrigin::Signed(ctx.ext.address().clone()).into(); - let outcome = <::Xcm>::execute( - origin, - Box::new(message), - weight.saturating_sub(execute_weight), - )?; + ctx.call_dispatchable::( + dispatch_info, + RuntimeCosts::CallXcmExecute, + |ctx| { + let origin = crate::RawOrigin::Signed(ctx.ext.address().clone()).into(); + let weight_used = <::Xcm>::execute_blob( + origin, + message, + weight.saturating_sub(execute_weight), + )?; - ctx.write_sandbox_memory(memory, output_ptr, &outcome.encode())?; - let pre_dispatch_weight = - <::Xcm as ExecuteController<_, _>>::WeightInfo::execute(); - Ok(Some(outcome.weight_used().saturating_add(pre_dispatch_weight)).into()) - }) + Ok(Some(weight_used.saturating_add(execute_weight)).into()) + }, + ) } /// Send an XCM program from the contract to the specified destination. @@ -2168,19 +2119,18 @@ pub mod env { msg_len: u32, output_ptr: u32, ) -> Result { - use xcm::{VersionedLocation, VersionedXcm}; + use xcm::VersionedLocation; use xcm_builder::{SendController, SendControllerWeightInfo}; ctx.charge_gas(RuntimeCosts::CopyFromContract(msg_len))?; let dest: VersionedLocation = ctx.read_sandbox_memory_as(memory, dest_ptr)?; - let message: VersionedXcm<()> = - ctx.read_sandbox_memory_as_unbounded(memory, msg_ptr, msg_len)?; - let weight = <::Xcm as SendController<_>>::WeightInfo::send(); + let message = ctx.read_sandbox_memory_as_unbounded(memory, msg_ptr, msg_len)?; + let weight = <::Xcm as SendController<_>>::WeightInfo::send_blob(); ctx.charge_gas(RuntimeCosts::CallRuntime(weight))?; let origin = crate::RawOrigin::Signed(ctx.ext.address().clone()).into(); - match <::Xcm>::send(origin, dest.into(), message.into()) { + match <::Xcm>::send_blob(origin, dest.into(), message) { Ok(message_id) => { ctx.write_sandbox_memory(memory, output_ptr, &message_id.encode())?; Ok(ReturnErrorCode::Success) @@ -2314,27 +2264,25 @@ pub mod env { /// Returns a nonce that is unique per contract instantiation. /// See [`pallet_contracts_uapi::HostFn::instantiation_nonce`]. fn instantiation_nonce(ctx: _, _memory: _) -> Result { - ctx.charge_gas(RuntimeCosts::InstantationNonce)?; + ctx.charge_gas(RuntimeCosts::InstantiationNonce)?; Ok(ctx.ext.nonce()) } /// Adds a new delegate dependency to the contract. - /// See [`pallet_contracts_uapi::HostFn::add_delegate_dependency`]. - #[unstable] - fn add_delegate_dependency(ctx: _, memory: _, code_hash_ptr: u32) -> Result<(), TrapReason> { - ctx.charge_gas(RuntimeCosts::AddDelegateDependency)?; + /// See [`pallet_contracts_uapi::HostFn::lock_delegate_dependency`]. + fn lock_delegate_dependency(ctx: _, memory: _, code_hash_ptr: u32) -> Result<(), TrapReason> { + ctx.charge_gas(RuntimeCosts::LockDelegateDependency)?; let code_hash = ctx.read_sandbox_memory_as(memory, code_hash_ptr)?; - ctx.ext.add_delegate_dependency(code_hash)?; + ctx.ext.lock_delegate_dependency(code_hash)?; Ok(()) } /// Removes the delegate dependency from the contract. - /// see [`pallet_contracts_uapi::HostFn::remove_delegate_dependency`]. - #[unstable] - fn remove_delegate_dependency(ctx: _, memory: _, code_hash_ptr: u32) -> Result<(), TrapReason> { - ctx.charge_gas(RuntimeCosts::RemoveDelegateDependency)?; + /// see [`pallet_contracts_uapi::HostFn::unlock_delegate_dependency`]. + fn unlock_delegate_dependency(ctx: _, memory: _, code_hash_ptr: u32) -> Result<(), TrapReason> { + ctx.charge_gas(RuntimeCosts::UnlockDelegateDependency)?; let code_hash = ctx.read_sandbox_memory_as(memory, code_hash_ptr)?; - ctx.ext.remove_delegate_dependency(&code_hash)?; + ctx.ext.unlock_delegate_dependency(&code_hash)?; Ok(()) } } diff --git a/substrate/frame/contracts/src/weights.rs b/substrate/frame/contracts/src/weights.rs index fa9df922a7cbb9711c7b1315cf680a30fc4c5ebb..ca7f58cf5b0cada995a268cc241b36a0599cb709 100644 --- a/substrate/frame/contracts/src/weights.rs +++ b/substrate/frame/contracts/src/weights.rs @@ -17,10 +17,10 @@ //! Autogenerated weights for `pallet_contracts` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2024-01-19, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-04-10, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-j8vvqcjr-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! HOSTNAME: `runner-anb7yjbi-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: `1024` // Executed Command: @@ -58,6 +58,7 @@ pub trait WeightInfo { fn v13_migration_step() -> Weight; fn v14_migration_step() -> Weight; fn v15_migration_step() -> Weight; + fn v16_migration_step() -> Weight; fn migration_noop() -> Weight; fn migrate() -> Weight; fn on_runtime_upgrade_noop() -> Weight; @@ -67,7 +68,8 @@ pub trait WeightInfo { fn instantiate_with_code(c: u32, i: u32, s: u32, ) -> Weight; fn instantiate(i: u32, s: u32, ) -> Weight; fn call() -> Weight; - fn upload_code(c: u32, ) -> Weight; + fn upload_code_determinism_enforced(c: u32, ) -> Weight; + fn upload_code_determinism_relaxed(c: u32, ) -> Weight; fn remove_code() -> Weight; fn set_code() -> Weight; fn seal_caller(r: u32, ) -> Weight; @@ -124,8 +126,8 @@ pub trait WeightInfo { fn seal_ecdsa_recover(r: u32, ) -> Weight; fn seal_ecdsa_to_eth_address(r: u32, ) -> Weight; fn seal_set_code_hash(r: u32, ) -> Weight; - fn add_delegate_dependency(r: u32, ) -> Weight; - fn remove_delegate_dependency(r: u32, ) -> Weight; + fn lock_delegate_dependency(r: u32, ) -> Weight; + fn unlock_delegate_dependency(r: u32, ) -> Weight; fn seal_reentrance_count(r: u32, ) -> Weight; fn seal_account_reentrance_count(r: u32, ) -> Weight; fn seal_instantiation_nonce(r: u32, ) -> Weight; @@ -141,8 +143,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `142` // Estimated: `1627` - // Minimum execution time: 1_997_000 picoseconds. - Weight::from_parts(2_130_000, 1627) + // Minimum execution time: 2_047_000 picoseconds. + Weight::from_parts(2_116_000, 1627) .saturating_add(T::DbWeight::get().reads(1_u64)) } /// Storage: `Skipped::Metadata` (r:0 w:0) @@ -152,10 +154,10 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `452 + k * (69 ±0)` // Estimated: `442 + k * (70 ±0)` - // Minimum execution time: 12_276_000 picoseconds. - Weight::from_parts(1_593_881, 442) - // Standard Error: 1_135 - .saturating_add(Weight::from_parts(1_109_302, 0).saturating_mul(k.into())) + // Minimum execution time: 12_474_000 picoseconds. + Weight::from_parts(12_767_000, 442) + // Standard Error: 1_081 + .saturating_add(Weight::from_parts(1_187_278, 0).saturating_mul(k.into())) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(k.into()))) .saturating_add(T::DbWeight::get().writes(2_u64)) @@ -169,10 +171,10 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `211 + c * (1 ±0)` // Estimated: `6149 + c * (1 ±0)` - // Minimum execution time: 8_176_000 picoseconds. - Weight::from_parts(8_555_388, 6149) + // Minimum execution time: 8_307_000 picoseconds. + Weight::from_parts(8_939_322, 6149) // Standard Error: 1 - .saturating_add(Weight::from_parts(1_184, 0).saturating_mul(c.into())) + .saturating_add(Weight::from_parts(1_190, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) .saturating_add(Weight::from_parts(0, 1).saturating_mul(c.into())) @@ -185,8 +187,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `510` // Estimated: `6450` - // Minimum execution time: 16_270_000 picoseconds. - Weight::from_parts(16_779_000, 6450) + // Minimum execution time: 16_915_000 picoseconds. + Weight::from_parts(17_638_000, 6450) .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -199,10 +201,10 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `171 + k * (1 ±0)` // Estimated: `3635 + k * (1 ±0)` - // Minimum execution time: 3_572_000 picoseconds. - Weight::from_parts(1_950_905, 3635) - // Standard Error: 1_597 - .saturating_add(Weight::from_parts(1_123_190, 0).saturating_mul(k.into())) + // Minimum execution time: 3_607_000 picoseconds. + Weight::from_parts(1_979_323, 3635) + // Standard Error: 1_018 + .saturating_add(Weight::from_parts(1_196_162, 0).saturating_mul(k.into())) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(k.into()))) @@ -212,6 +214,8 @@ impl WeightInfo for SubstrateWeight { /// Proof: UNKNOWN KEY `0x4342193e496fab7ec59d615ed0dc553053f13fd319a03c211337c76e0fe776df` (r:2 w:0) /// Storage: UNKNOWN KEY `0x4342193e496fab7ec59d615ed0dc553022fca90611ba8b7942f8bdb3b97f6580` (r:1 w:1) /// Proof: UNKNOWN KEY `0x4342193e496fab7ec59d615ed0dc553022fca90611ba8b7942f8bdb3b97f6580` (r:1 w:1) + /// Storage: `Parameters::Parameters` (r:2 w:0) + /// Proof: `Parameters::Parameters` (`max_values`: None, `max_size`: Some(36), added: 2511, mode: `Measured`) /// Storage: `System::Account` (r:1 w:0) /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) /// Storage: `Contracts::CodeInfoOf` (r:0 w:1) @@ -219,13 +223,13 @@ impl WeightInfo for SubstrateWeight { /// The range of component `c` is `[0, 125952]`. fn v12_migration_step(c: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `325 + c * (1 ±0)` - // Estimated: `6263 + c * (1 ±0)` - // Minimum execution time: 16_873_000 picoseconds. - Weight::from_parts(16_790_402, 6263) + // Measured: `328 + c * (1 ±0)` + // Estimated: `6266 + c * (1 ±0)` + // Minimum execution time: 21_056_000 picoseconds. + Weight::from_parts(21_633_895, 6266) // Standard Error: 1 - .saturating_add(Weight::from_parts(396, 0).saturating_mul(c.into())) - .saturating_add(T::DbWeight::get().reads(4_u64)) + .saturating_add(Weight::from_parts(390, 0).saturating_mul(c.into())) + .saturating_add(T::DbWeight::get().reads(6_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) .saturating_add(Weight::from_parts(0, 1).saturating_mul(c.into())) } @@ -235,8 +239,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `440` // Estimated: `6380` - // Minimum execution time: 11_904_000 picoseconds. - Weight::from_parts(12_785_000, 6380) + // Minimum execution time: 12_860_000 picoseconds. + Weight::from_parts(13_525_000, 6380) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -245,13 +249,13 @@ impl WeightInfo for SubstrateWeight { /// Storage: `System::Account` (r:1 w:1) /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) /// Storage: `Balances::Holds` (r:1 w:0) - /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(157), added: 2632, mode: `Measured`) + /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(193), added: 2668, mode: `Measured`) fn v14_migration_step() -> Weight { // Proof Size summary in bytes: // Measured: `352` // Estimated: `6292` - // Minimum execution time: 44_920_000 picoseconds. - Weight::from_parts(46_163_000, 6292) + // Minimum execution time: 46_926_000 picoseconds. + Weight::from_parts(47_828_000, 6292) .saturating_add(T::DbWeight::get().reads(4_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -263,19 +267,30 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `594` // Estimated: `6534` - // Minimum execution time: 53_864_000 picoseconds. - Weight::from_parts(55_139_000, 6534) + // Minimum execution time: 55_081_000 picoseconds. + Weight::from_parts(56_899_000, 6534) .saturating_add(T::DbWeight::get().reads(4_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } + /// Storage: `Contracts::ContractInfoOf` (r:2 w:1) + /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) + fn v16_migration_step() -> Weight { + // Proof Size summary in bytes: + // Measured: `409` + // Estimated: `6349` + // Minimum execution time: 12_595_000 picoseconds. + Weight::from_parts(13_059_000, 6349) + .saturating_add(T::DbWeight::get().reads(2_u64)) + .saturating_add(T::DbWeight::get().writes(1_u64)) + } /// Storage: `Contracts::MigrationInProgress` (r:1 w:1) /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) fn migration_noop() -> Weight { // Proof Size summary in bytes: // Measured: `142` // Estimated: `1627` - // Minimum execution time: 2_375_000 picoseconds. - Weight::from_parts(2_487_000, 1627) + // Minimum execution time: 2_480_000 picoseconds. + Weight::from_parts(2_663_000, 1627) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -287,8 +302,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `166` // Estimated: `3631` - // Minimum execution time: 11_580_000 picoseconds. - Weight::from_parts(11_980_000, 3631) + // Minimum execution time: 12_115_000 picoseconds. + Weight::from_parts(12_506_000, 3631) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } @@ -298,8 +313,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `142` // Estimated: `3607` - // Minimum execution time: 4_557_000 picoseconds. - Weight::from_parts(4_807_000, 3607) + // Minimum execution time: 4_757_000 picoseconds. + Weight::from_parts(5_082_000, 3607) .saturating_add(T::DbWeight::get().reads(1_u64)) } /// Storage: UNKNOWN KEY `0x4342193e496fab7ec59d615ed0dc55304e7b9012096b41c4eb3aaf947f6ea429` (r:1 w:0) @@ -310,8 +325,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `167` // Estimated: `3632` - // Minimum execution time: 6_253_000 picoseconds. - Weight::from_parts(6_479_000, 3632) + // Minimum execution time: 6_017_000 picoseconds. + Weight::from_parts(6_421_000, 3632) .saturating_add(T::DbWeight::get().reads(2_u64)) } /// Storage: UNKNOWN KEY `0x4342193e496fab7ec59d615ed0dc55304e7b9012096b41c4eb3aaf947f6ea429` (r:1 w:0) @@ -322,13 +337,15 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `142` // Estimated: `3607` - // Minimum execution time: 6_166_000 picoseconds. - Weight::from_parts(6_545_000, 3607) + // Minimum execution time: 6_238_000 picoseconds. + Weight::from_parts(6_587_000, 3607) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) + /// Storage: `Parameters::Parameters` (r:3 w:0) + /// Proof: `Parameters::Parameters` (`max_values`: None, `max_size`: Some(36), added: 2511, mode: `Measured`) /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) /// Storage: `Contracts::CodeInfoOf` (r:1 w:0) @@ -344,22 +361,24 @@ impl WeightInfo for SubstrateWeight { /// The range of component `c` is `[0, 125952]`. fn call_with_code_per_byte(c: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `801 + c * (1 ±0)` - // Estimated: `6739 + c * (1 ±0)` - // Minimum execution time: 282_232_000 picoseconds. - Weight::from_parts(266_148_573, 6739) - // Standard Error: 69 - .saturating_add(Weight::from_parts(34_592, 0).saturating_mul(c.into())) - .saturating_add(T::DbWeight::get().reads(8_u64)) + // Measured: `804 + c * (1 ±0)` + // Estimated: `9217 + c * (1 ±0)` + // Minimum execution time: 288_968_000 picoseconds. + Weight::from_parts(267_291_922, 9217) + // Standard Error: 78 + .saturating_add(Weight::from_parts(34_879, 0).saturating_mul(c.into())) + .saturating_add(T::DbWeight::get().reads(11_u64)) .saturating_add(T::DbWeight::get().writes(4_u64)) .saturating_add(Weight::from_parts(0, 1).saturating_mul(c.into())) } /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) + /// Storage: `Parameters::Parameters` (r:3 w:0) + /// Proof: `Parameters::Parameters` (`max_values`: None, `max_size`: Some(36), added: 2511, mode: `Measured`) /// Storage: `Contracts::CodeInfoOf` (r:1 w:1) /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) /// Storage: `Balances::Holds` (r:2 w:2) - /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(157), added: 2632, mode: `Measured`) + /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(193), added: 2668, mode: `Measured`) /// Storage: `System::EventTopics` (r:3 w:3) /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) /// Storage: `Contracts::Nonce` (r:1 w:1) @@ -377,17 +396,17 @@ impl WeightInfo for SubstrateWeight { /// The range of component `s` is `[0, 1048576]`. fn instantiate_with_code(c: u32, i: u32, s: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `323` - // Estimated: `8737` - // Minimum execution time: 3_760_879_000 picoseconds. - Weight::from_parts(794_812_431, 8737) - // Standard Error: 149 - .saturating_add(Weight::from_parts(101_881, 0).saturating_mul(c.into())) - // Standard Error: 18 - .saturating_add(Weight::from_parts(1_404, 0).saturating_mul(i.into())) - // Standard Error: 18 - .saturating_add(Weight::from_parts(1_544, 0).saturating_mul(s.into())) - .saturating_add(T::DbWeight::get().reads(11_u64)) + // Measured: `326` + // Estimated: `8740` + // Minimum execution time: 3_948_426_000 picoseconds. + Weight::from_parts(440_017_623, 8740) + // Standard Error: 555 + .saturating_add(Weight::from_parts(71_483, 0).saturating_mul(c.into())) + // Standard Error: 66 + .saturating_add(Weight::from_parts(1_831, 0).saturating_mul(i.into())) + // Standard Error: 66 + .saturating_add(Weight::from_parts(1_694, 0).saturating_mul(s.into())) + .saturating_add(T::DbWeight::get().reads(14_u64)) .saturating_add(T::DbWeight::get().writes(10_u64)) } /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) @@ -396,6 +415,8 @@ impl WeightInfo for SubstrateWeight { /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) /// Storage: `Contracts::PristineCode` (r:1 w:0) /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) + /// Storage: `Parameters::Parameters` (r:3 w:0) + /// Proof: `Parameters::Parameters` (`max_values`: None, `max_size`: Some(36), added: 2511, mode: `Measured`) /// Storage: `Contracts::Nonce` (r:1 w:1) /// Proof: `Contracts::Nonce` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) @@ -407,24 +428,26 @@ impl WeightInfo for SubstrateWeight { /// Storage: `System::EventTopics` (r:2 w:2) /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) /// Storage: `Balances::Holds` (r:1 w:1) - /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(157), added: 2632, mode: `Measured`) + /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(193), added: 2668, mode: `Measured`) /// The range of component `i` is `[0, 1048576]`. /// The range of component `s` is `[0, 1048576]`. fn instantiate(i: u32, s: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `560` - // Estimated: `6504` - // Minimum execution time: 1_953_162_000 picoseconds. - Weight::from_parts(374_252_840, 6504) - // Standard Error: 7 - .saturating_add(Weight::from_parts(1_630, 0).saturating_mul(i.into())) - // Standard Error: 7 - .saturating_add(Weight::from_parts(1_650, 0).saturating_mul(s.into())) - .saturating_add(T::DbWeight::get().reads(10_u64)) + // Measured: `563` + // Estimated: `8982` + // Minimum execution time: 2_011_037_000 picoseconds. + Weight::from_parts(2_047_025_000, 8982) + // Standard Error: 28 + .saturating_add(Weight::from_parts(968, 0).saturating_mul(i.into())) + // Standard Error: 28 + .saturating_add(Weight::from_parts(780, 0).saturating_mul(s.into())) + .saturating_add(T::DbWeight::get().reads(13_u64)) .saturating_add(T::DbWeight::get().writes(7_u64)) } /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) + /// Storage: `Parameters::Parameters` (r:3 w:0) + /// Proof: `Parameters::Parameters` (`max_values`: None, `max_size`: Some(36), added: 2511, mode: `Measured`) /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) /// Storage: `Contracts::CodeInfoOf` (r:1 w:0) @@ -439,33 +462,59 @@ impl WeightInfo for SubstrateWeight { /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) fn call() -> Weight { // Proof Size summary in bytes: - // Measured: `826` - // Estimated: `6766` - // Minimum execution time: 187_899_000 picoseconds. - Weight::from_parts(195_510_000, 6766) - .saturating_add(T::DbWeight::get().reads(8_u64)) + // Measured: `829` + // Estimated: `9244` + // Minimum execution time: 202_190_000 picoseconds. + Weight::from_parts(209_378_000, 9244) + .saturating_add(T::DbWeight::get().reads(11_u64)) .saturating_add(T::DbWeight::get().writes(4_u64)) } /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) + /// Storage: `Parameters::Parameters` (r:2 w:0) + /// Proof: `Parameters::Parameters` (`max_values`: None, `max_size`: Some(36), added: 2511, mode: `Measured`) /// Storage: `Contracts::CodeInfoOf` (r:1 w:1) /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) /// Storage: `Balances::Holds` (r:1 w:1) - /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(157), added: 2632, mode: `Measured`) + /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(193), added: 2668, mode: `Measured`) /// Storage: `System::EventTopics` (r:1 w:1) /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) /// Storage: `Contracts::PristineCode` (r:0 w:1) /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) /// The range of component `c` is `[0, 125952]`. - fn upload_code(c: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `142` - // Estimated: `3607` - // Minimum execution time: 254_800_000 picoseconds. - Weight::from_parts(285_603_050, 3607) - // Standard Error: 62 - .saturating_add(Weight::from_parts(66_212, 0).saturating_mul(c.into())) - .saturating_add(T::DbWeight::get().reads(4_u64)) + fn upload_code_determinism_enforced(c: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `145` + // Estimated: `6085` + // Minimum execution time: 271_161_000 picoseconds. + Weight::from_parts(279_218_977, 6085) + // Standard Error: 80 + .saturating_add(Weight::from_parts(33_973, 0).saturating_mul(c.into())) + .saturating_add(T::DbWeight::get().reads(6_u64)) + .saturating_add(T::DbWeight::get().writes(4_u64)) + } + /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) + /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) + /// Storage: `Parameters::Parameters` (r:2 w:0) + /// Proof: `Parameters::Parameters` (`max_values`: None, `max_size`: Some(36), added: 2511, mode: `Measured`) + /// Storage: `Contracts::CodeInfoOf` (r:1 w:1) + /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) + /// Storage: `Balances::Holds` (r:1 w:1) + /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(193), added: 2668, mode: `Measured`) + /// Storage: `System::EventTopics` (r:1 w:1) + /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Contracts::PristineCode` (r:0 w:1) + /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) + /// The range of component `c` is `[0, 125952]`. + fn upload_code_determinism_relaxed(c: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `145` + // Estimated: `6085` + // Minimum execution time: 273_684_000 picoseconds. + Weight::from_parts(284_348_722, 6085) + // Standard Error: 79 + .saturating_add(Weight::from_parts(34_205, 0).saturating_mul(c.into())) + .saturating_add(T::DbWeight::get().reads(6_u64)) .saturating_add(T::DbWeight::get().writes(4_u64)) } /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) @@ -473,7 +522,7 @@ impl WeightInfo for SubstrateWeight { /// Storage: `Contracts::CodeInfoOf` (r:1 w:1) /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) /// Storage: `Balances::Holds` (r:1 w:1) - /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(157), added: 2632, mode: `Measured`) + /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(193), added: 2668, mode: `Measured`) /// Storage: `System::EventTopics` (r:1 w:1) /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) /// Storage: `Contracts::PristineCode` (r:0 w:1) @@ -482,8 +531,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `315` // Estimated: `3780` - // Minimum execution time: 43_553_000 picoseconds. - Weight::from_parts(45_036_000, 3780) + // Minimum execution time: 45_150_000 picoseconds. + Weight::from_parts(46_780_000, 3780) .saturating_add(T::DbWeight::get().reads(4_u64)) .saturating_add(T::DbWeight::get().writes(4_u64)) } @@ -499,285 +548,181 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `552` // Estimated: `8967` - // Minimum execution time: 33_223_000 picoseconds. - Weight::from_parts(34_385_000, 8967) + // Minimum execution time: 34_738_000 picoseconds. + Weight::from_parts(35_918_000, 8967) .saturating_add(T::DbWeight::get().reads(7_u64)) .saturating_add(T::DbWeight::get().writes(6_u64)) } - /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) - /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) - /// Storage: `System::Account` (r:1 w:0) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) - /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) - /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) - /// Storage: `Contracts::CodeInfoOf` (r:1 w:0) - /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) - /// Storage: `Contracts::PristineCode` (r:1 w:0) - /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) - /// Storage: `Timestamp::Now` (r:1 w:0) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) - /// Storage: `System::EventTopics` (r:2 w:2) - /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `r` is `[0, 1600]`. fn seal_caller(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `866 + r * (6 ±0)` - // Estimated: `6806 + r * (6 ±0)` - // Minimum execution time: 254_213_000 picoseconds. - Weight::from_parts(273_464_980, 6806) - // Standard Error: 1_362 - .saturating_add(Weight::from_parts(322_619, 0).saturating_mul(r.into())) - .saturating_add(T::DbWeight::get().reads(8_u64)) - .saturating_add(T::DbWeight::get().writes(3_u64)) - .saturating_add(Weight::from_parts(0, 6).saturating_mul(r.into())) + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 9_094_000 picoseconds. + Weight::from_parts(10_253_702, 0) + // Standard Error: 223 + .saturating_add(Weight::from_parts(250_757, 0).saturating_mul(r.into())) } - /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) - /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) - /// Storage: `System::Account` (r:1 w:0) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) - /// Storage: `Contracts::ContractInfoOf` (r:1601 w:1) + /// Storage: `Contracts::ContractInfoOf` (r:1600 w:0) /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) - /// Storage: `Contracts::CodeInfoOf` (r:1 w:0) - /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) - /// Storage: `Contracts::PristineCode` (r:1 w:0) - /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) - /// Storage: `Timestamp::Now` (r:1 w:0) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) - /// Storage: `System::EventTopics` (r:2 w:2) - /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `r` is `[0, 1600]`. fn seal_is_contract(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `922 + r * (209 ±0)` - // Estimated: `6826 + r * (2684 ±0)` - // Minimum execution time: 250_273_000 picoseconds. - Weight::from_parts(122_072_782, 6826) - // Standard Error: 5_629 - .saturating_add(Weight::from_parts(3_490_256, 0).saturating_mul(r.into())) - .saturating_add(T::DbWeight::get().reads(8_u64)) + // Measured: `509 + r * (77 ±0)` + // Estimated: `1467 + r * (2552 ±0)` + // Minimum execution time: 9_102_000 picoseconds. + Weight::from_parts(9_238_000, 1467) + // Standard Error: 6_076 + .saturating_add(Weight::from_parts(3_293_012, 0).saturating_mul(r.into())) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(r.into()))) - .saturating_add(T::DbWeight::get().writes(3_u64)) - .saturating_add(Weight::from_parts(0, 2684).saturating_mul(r.into())) + .saturating_add(Weight::from_parts(0, 2552).saturating_mul(r.into())) } - /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) - /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) - /// Storage: `System::Account` (r:1 w:0) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) - /// Storage: `Contracts::ContractInfoOf` (r:1601 w:1) + /// Storage: `Contracts::ContractInfoOf` (r:1600 w:0) /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) - /// Storage: `Contracts::CodeInfoOf` (r:1 w:0) - /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) - /// Storage: `Contracts::PristineCode` (r:1 w:0) - /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) - /// Storage: `Timestamp::Now` (r:1 w:0) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) - /// Storage: `System::EventTopics` (r:2 w:2) - /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `r` is `[0, 1600]`. fn seal_code_hash(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `921 + r * (213 ±0)` - // Estimated: `6830 + r * (2688 ±0)` - // Minimum execution time: 255_187_000 picoseconds. - Weight::from_parts(118_082_505, 6830) - // Standard Error: 6_302 - .saturating_add(Weight::from_parts(4_246_968, 0).saturating_mul(r.into())) - .saturating_add(T::DbWeight::get().reads(8_u64)) + // Measured: `517 + r * (170 ±0)` + // Estimated: `1468 + r * (2645 ±0)` + // Minimum execution time: 9_255_000 picoseconds. + Weight::from_parts(9_406_000, 1468) + // Standard Error: 6_826 + .saturating_add(Weight::from_parts(4_205_039, 0).saturating_mul(r.into())) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(r.into()))) - .saturating_add(T::DbWeight::get().writes(3_u64)) - .saturating_add(Weight::from_parts(0, 2688).saturating_mul(r.into())) + .saturating_add(Weight::from_parts(0, 2645).saturating_mul(r.into())) } - /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) - /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) - /// Storage: `System::Account` (r:1 w:0) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) - /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) - /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) - /// Storage: `Contracts::CodeInfoOf` (r:1 w:0) - /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) - /// Storage: `Contracts::PristineCode` (r:1 w:0) - /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) - /// Storage: `Timestamp::Now` (r:1 w:0) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) - /// Storage: `System::EventTopics` (r:2 w:2) - /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `r` is `[0, 1600]`. fn seal_own_code_hash(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `873 + r * (6 ±0)` - // Estimated: `6815 + r * (6 ±0)` - // Minimum execution time: 256_833_000 picoseconds. - Weight::from_parts(273_330_216, 6815) - // Standard Error: 881 - .saturating_add(Weight::from_parts(400_105, 0).saturating_mul(r.into())) - .saturating_add(T::DbWeight::get().reads(8_u64)) - .saturating_add(T::DbWeight::get().writes(3_u64)) - .saturating_add(Weight::from_parts(0, 6).saturating_mul(r.into())) + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 9_388_000 picoseconds. + Weight::from_parts(9_322_209, 0) + // Standard Error: 269 + .saturating_add(Weight::from_parts(358_189, 0).saturating_mul(r.into())) } - /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) - /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) - /// Storage: `System::Account` (r:1 w:0) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) - /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) - /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) - /// Storage: `Contracts::CodeInfoOf` (r:1 w:0) - /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) - /// Storage: `Contracts::PristineCode` (r:1 w:0) - /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) - /// Storage: `Timestamp::Now` (r:1 w:0) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) - /// Storage: `System::EventTopics` (r:2 w:2) - /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `r` is `[0, 1600]`. fn seal_caller_is_origin(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `863 + r * (3 ±0)` - // Estimated: `6804 + r * (3 ±0)` - // Minimum execution time: 244_193_000 picoseconds. - Weight::from_parts(271_221_908, 6804) - // Standard Error: 442 - .saturating_add(Weight::from_parts(176_480, 0).saturating_mul(r.into())) - .saturating_add(T::DbWeight::get().reads(8_u64)) - .saturating_add(T::DbWeight::get().writes(3_u64)) - .saturating_add(Weight::from_parts(0, 3).saturating_mul(r.into())) + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 9_300_000 picoseconds. + Weight::from_parts(10_268_326, 0) + // Standard Error: 72 + .saturating_add(Weight::from_parts(104_650, 0).saturating_mul(r.into())) } - /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) - /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) - /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) - /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) - /// Storage: `Contracts::CodeInfoOf` (r:1 w:0) - /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) - /// Storage: `Contracts::PristineCode` (r:1 w:0) - /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) - /// Storage: `Timestamp::Now` (r:1 w:0) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) - /// Storage: `System::EventTopics` (r:2 w:2) - /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `r` is `[0, 1600]`. fn seal_caller_is_root(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `753 + r * (3 ±0)` - // Estimated: `6693 + r * (3 ±0)` - // Minimum execution time: 232_603_000 picoseconds. - Weight::from_parts(260_577_368, 6693) - // Standard Error: 365 - .saturating_add(Weight::from_parts(158_126, 0).saturating_mul(r.into())) - .saturating_add(T::DbWeight::get().reads(7_u64)) - .saturating_add(T::DbWeight::get().writes(3_u64)) - .saturating_add(Weight::from_parts(0, 3).saturating_mul(r.into())) + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 9_162_000 picoseconds. + Weight::from_parts(10_059_984, 0) + // Standard Error: 87 + .saturating_add(Weight::from_parts(87_627, 0).saturating_mul(r.into())) } - /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) - /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) - /// Storage: `System::Account` (r:1 w:0) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) - /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) - /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) - /// Storage: `Contracts::CodeInfoOf` (r:1 w:0) - /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) - /// Storage: `Contracts::PristineCode` (r:1 w:0) - /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) - /// Storage: `Timestamp::Now` (r:1 w:0) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) - /// Storage: `System::EventTopics` (r:2 w:2) - /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `r` is `[0, 1600]`. fn seal_address(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `867 + r * (6 ±0)` - // Estimated: `6807 + r * (6 ±0)` - // Minimum execution time: 247_564_000 picoseconds. - Weight::from_parts(275_108_914, 6807) - // Standard Error: 505 - .saturating_add(Weight::from_parts(315_065, 0).saturating_mul(r.into())) - .saturating_add(T::DbWeight::get().reads(8_u64)) - .saturating_add(T::DbWeight::get().writes(3_u64)) - .saturating_add(Weight::from_parts(0, 6).saturating_mul(r.into())) + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 9_193_000 picoseconds. + Weight::from_parts(10_160_715, 0) + // Standard Error: 152 + .saturating_add(Weight::from_parts(263_703, 0).saturating_mul(r.into())) } - /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) - /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) - /// Storage: `System::Account` (r:1 w:0) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) - /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) - /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) - /// Storage: `Contracts::CodeInfoOf` (r:1 w:0) - /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) - /// Storage: `Contracts::PristineCode` (r:1 w:0) - /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) - /// Storage: `Timestamp::Now` (r:1 w:0) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) - /// Storage: `System::EventTopics` (r:2 w:2) - /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `r` is `[0, 1600]`. fn seal_gas_left(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `863 + r * (6 ±0)` - // Estimated: `6806 + r * (6 ±0)` - // Minimum execution time: 258_799_000 picoseconds. - Weight::from_parts(274_338_256, 6806) - // Standard Error: 632 - .saturating_add(Weight::from_parts(355_032, 0).saturating_mul(r.into())) - .saturating_add(T::DbWeight::get().reads(8_u64)) - .saturating_add(T::DbWeight::get().writes(3_u64)) - .saturating_add(Weight::from_parts(0, 6).saturating_mul(r.into())) + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 9_109_000 picoseconds. + Weight::from_parts(9_766_924, 0) + // Standard Error: 212 + .saturating_add(Weight::from_parts(291_694, 0).saturating_mul(r.into())) } - /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) - /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) - /// Storage: `System::Account` (r:2 w:0) + /// Storage: `System::Account` (r:1 w:0) /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) - /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) - /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) - /// Storage: `Contracts::CodeInfoOf` (r:1 w:0) - /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) - /// Storage: `Contracts::PristineCode` (r:1 w:0) - /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) - /// Storage: `Timestamp::Now` (r:1 w:0) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) - /// Storage: `System::EventTopics` (r:2 w:2) - /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `r` is `[0, 1600]`. fn seal_balance(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `1007 + r * (6 ±0)` - // Estimated: `6931 + r * (6 ±0)` - // Minimum execution time: 253_335_000 picoseconds. - Weight::from_parts(273_013_859, 6931) - // Standard Error: 2_007 - .saturating_add(Weight::from_parts(1_540_735, 0).saturating_mul(r.into())) - .saturating_add(T::DbWeight::get().reads(9_u64)) - .saturating_add(T::DbWeight::get().writes(3_u64)) - .saturating_add(Weight::from_parts(0, 6).saturating_mul(r.into())) + // Measured: `140` + // Estimated: `3599` + // Minimum execution time: 9_463_000 picoseconds. + Weight::from_parts(9_541_000, 3599) + // Standard Error: 3_075 + .saturating_add(Weight::from_parts(1_606_043, 0).saturating_mul(r.into())) + .saturating_add(T::DbWeight::get().reads(1_u64)) } - /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) - /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) - /// Storage: `System::Account` (r:1 w:0) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) - /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) - /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) - /// Storage: `Contracts::CodeInfoOf` (r:1 w:0) - /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) - /// Storage: `Contracts::PristineCode` (r:1 w:0) - /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) - /// Storage: `Timestamp::Now` (r:1 w:0) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) - /// Storage: `System::EventTopics` (r:2 w:2) - /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `r` is `[0, 1600]`. fn seal_value_transferred(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `877 + r * (6 ±0)` - // Estimated: `6823 + r * (6 ±0)` - // Minimum execution time: 252_325_000 picoseconds. - Weight::from_parts(274_733_944, 6823) - // Standard Error: 603 - .saturating_add(Weight::from_parts(314_467, 0).saturating_mul(r.into())) - .saturating_add(T::DbWeight::get().reads(8_u64)) - .saturating_add(T::DbWeight::get().writes(3_u64)) - .saturating_add(Weight::from_parts(0, 6).saturating_mul(r.into())) + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 9_080_000 picoseconds. + Weight::from_parts(8_121_924, 0) + // Standard Error: 198 + .saturating_add(Weight::from_parts(247_527, 0).saturating_mul(r.into())) + } + /// The range of component `r` is `[0, 1600]`. + fn seal_minimum_balance(r: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 9_393_000 picoseconds. + Weight::from_parts(9_999_247, 0) + // Standard Error: 169 + .saturating_add(Weight::from_parts(244_563, 0).saturating_mul(r.into())) + } + /// The range of component `r` is `[0, 1600]`. + fn seal_block_number(r: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 9_236_000 picoseconds. + Weight::from_parts(9_561_435, 0) + // Standard Error: 195 + .saturating_add(Weight::from_parts(239_812, 0).saturating_mul(r.into())) + } + /// The range of component `r` is `[0, 1600]`. + fn seal_now(r: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 9_259_000 picoseconds. + Weight::from_parts(10_353_960, 0) + // Standard Error: 216 + .saturating_add(Weight::from_parts(243_754, 0).saturating_mul(r.into())) + } + /// Storage: `TransactionPayment::NextFeeMultiplier` (r:1 w:0) + /// Proof: `TransactionPayment::NextFeeMultiplier` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `Measured`) + /// The range of component `r` is `[0, 1600]`. + fn seal_weight_to_fee(r: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `67` + // Estimated: `1552` + // Minimum execution time: 9_145_000 picoseconds. + Weight::from_parts(16_524_937, 1552) + // Standard Error: 438 + .saturating_add(Weight::from_parts(666_821, 0).saturating_mul(r.into())) + .saturating_add(T::DbWeight::get().reads(1_u64)) + } + /// The range of component `r` is `[0, 1600]`. + fn seal_input(r: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 9_179_000 picoseconds. + Weight::from_parts(8_893_261, 0) + // Standard Error: 215 + .saturating_add(Weight::from_parts(175_586, 0).saturating_mul(r.into())) } /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) /// Storage: `System::Account` (r:1 w:0) /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) + /// Storage: `Parameters::Parameters` (r:3 w:0) + /// Proof: `Parameters::Parameters` (`max_values`: None, `max_size`: Some(36), added: 2511, mode: `Measured`) /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) /// Storage: `Contracts::CodeInfoOf` (r:1 w:0) @@ -788,426 +733,178 @@ impl WeightInfo for SubstrateWeight { /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) /// Storage: `System::EventTopics` (r:2 w:2) /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// The range of component `r` is `[0, 1600]`. - fn seal_minimum_balance(r: u32, ) -> Weight { + /// The range of component `n` is `[0, 1048576]`. + fn seal_input_per_byte(n: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `875 + r * (6 ±0)` - // Estimated: `6816 + r * (6 ±0)` - // Minimum execution time: 250_698_000 picoseconds. - Weight::from_parts(271_707_578, 6816) - // Standard Error: 952 - .saturating_add(Weight::from_parts(318_412, 0).saturating_mul(r.into())) - .saturating_add(T::DbWeight::get().reads(8_u64)) + // Measured: `872` + // Estimated: `9287` + // Minimum execution time: 259_315_000 picoseconds. + Weight::from_parts(137_461_362, 9287) + // Standard Error: 18 + .saturating_add(Weight::from_parts(1_388, 0).saturating_mul(n.into())) + .saturating_add(T::DbWeight::get().reads(11_u64)) .saturating_add(T::DbWeight::get().writes(3_u64)) - .saturating_add(Weight::from_parts(0, 6).saturating_mul(r.into())) + } + /// The range of component `r` is `[0, 1]`. + fn seal_return(r: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 8_919_000 picoseconds. + Weight::from_parts(9_465_187, 0) + // Standard Error: 32_481 + .saturating_add(Weight::from_parts(992_912, 0).saturating_mul(r.into())) + } + /// The range of component `n` is `[0, 1048576]`. + fn seal_return_per_byte(n: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 10_244_000 picoseconds. + Weight::from_parts(10_654_989, 0) + // Standard Error: 0 + .saturating_add(Weight::from_parts(315, 0).saturating_mul(n.into())) } /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) - /// Storage: `System::Account` (r:1 w:0) + /// Storage: `System::Account` (r:3 w:3) /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) + /// Storage: `Parameters::Parameters` (r:1 w:0) + /// Proof: `Parameters::Parameters` (`max_values`: None, `max_size`: Some(36), added: 2511, mode: `Measured`) /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) - /// Storage: `Contracts::CodeInfoOf` (r:1 w:0) + /// Storage: `Contracts::CodeInfoOf` (r:33 w:33) /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) /// Storage: `Contracts::PristineCode` (r:1 w:0) /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) /// Storage: `Timestamp::Now` (r:1 w:0) /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) - /// Storage: `System::EventTopics` (r:2 w:2) - /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// The range of component `r` is `[0, 1600]`. - fn seal_block_number(r: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `872 + r * (6 ±0)` - // Estimated: `6819 + r * (6 ±0)` - // Minimum execution time: 251_854_000 picoseconds. - Weight::from_parts(272_002_212, 6819) - // Standard Error: 622 - .saturating_add(Weight::from_parts(313_353, 0).saturating_mul(r.into())) - .saturating_add(T::DbWeight::get().reads(8_u64)) - .saturating_add(T::DbWeight::get().writes(3_u64)) - .saturating_add(Weight::from_parts(0, 6).saturating_mul(r.into())) - } - /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) - /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) - /// Storage: `System::Account` (r:1 w:0) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) - /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) - /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) - /// Storage: `Contracts::CodeInfoOf` (r:1 w:0) - /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) - /// Storage: `Contracts::PristineCode` (r:1 w:0) - /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) - /// Storage: `Timestamp::Now` (r:1 w:0) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) - /// Storage: `System::EventTopics` (r:2 w:2) - /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// The range of component `r` is `[0, 1600]`. - fn seal_now(r: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `863 + r * (6 ±0)` - // Estimated: `6804 + r * (6 ±0)` - // Minimum execution time: 252_010_000 picoseconds. - Weight::from_parts(270_387_000, 6804) - // Standard Error: 659 - .saturating_add(Weight::from_parts(325_856, 0).saturating_mul(r.into())) - .saturating_add(T::DbWeight::get().reads(8_u64)) - .saturating_add(T::DbWeight::get().writes(3_u64)) - .saturating_add(Weight::from_parts(0, 6).saturating_mul(r.into())) - } - /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) - /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) - /// Storage: `System::Account` (r:1 w:0) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) - /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) - /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) - /// Storage: `Contracts::CodeInfoOf` (r:1 w:0) - /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) - /// Storage: `Contracts::PristineCode` (r:1 w:0) - /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) - /// Storage: `Timestamp::Now` (r:1 w:0) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) - /// Storage: `TransactionPayment::NextFeeMultiplier` (r:1 w:0) - /// Proof: `TransactionPayment::NextFeeMultiplier` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `Measured`) - /// Storage: `System::EventTopics` (r:2 w:2) - /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// The range of component `r` is `[0, 1600]`. - fn seal_weight_to_fee(r: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `937 + r * (14 ±0)` - // Estimated: `6872 + r * (14 ±0)` - // Minimum execution time: 247_933_000 picoseconds. - Weight::from_parts(281_550_162, 6872) - // Standard Error: 660 - .saturating_add(Weight::from_parts(1_090_869, 0).saturating_mul(r.into())) - .saturating_add(T::DbWeight::get().reads(9_u64)) - .saturating_add(T::DbWeight::get().writes(3_u64)) - .saturating_add(Weight::from_parts(0, 14).saturating_mul(r.into())) - } - /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) - /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) - /// Storage: `System::Account` (r:1 w:0) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) - /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) - /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) - /// Storage: `Contracts::CodeInfoOf` (r:1 w:0) - /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) - /// Storage: `Contracts::PristineCode` (r:1 w:0) - /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) - /// Storage: `Timestamp::Now` (r:1 w:0) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) - /// Storage: `System::EventTopics` (r:2 w:2) - /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// The range of component `r` is `[0, 1600]`. - fn seal_input(r: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `865 + r * (6 ±0)` - // Estimated: `6807 + r * (6 ±0)` - // Minimum execution time: 251_158_000 picoseconds. - Weight::from_parts(274_623_152, 6807) - // Standard Error: 491 - .saturating_add(Weight::from_parts(263_916, 0).saturating_mul(r.into())) - .saturating_add(T::DbWeight::get().reads(8_u64)) - .saturating_add(T::DbWeight::get().writes(3_u64)) - .saturating_add(Weight::from_parts(0, 6).saturating_mul(r.into())) - } - /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) - /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) - /// Storage: `System::Account` (r:1 w:0) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) - /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) - /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) - /// Storage: `Contracts::CodeInfoOf` (r:1 w:0) - /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) - /// Storage: `Contracts::PristineCode` (r:1 w:0) - /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) - /// Storage: `Timestamp::Now` (r:1 w:0) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) - /// Storage: `System::EventTopics` (r:2 w:2) - /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// The range of component `n` is `[0, 1048576]`. - fn seal_input_per_byte(n: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `869` - // Estimated: `6809` - // Minimum execution time: 263_205_000 picoseconds. - Weight::from_parts(216_792_893, 6809) - // Standard Error: 23 - .saturating_add(Weight::from_parts(989, 0).saturating_mul(n.into())) - .saturating_add(T::DbWeight::get().reads(8_u64)) - .saturating_add(T::DbWeight::get().writes(3_u64)) - } - /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) - /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) - /// Storage: `System::Account` (r:1 w:0) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) - /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) - /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) - /// Storage: `Contracts::CodeInfoOf` (r:1 w:0) - /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) - /// Storage: `Contracts::PristineCode` (r:1 w:0) - /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) - /// Storage: `Timestamp::Now` (r:1 w:0) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) - /// Storage: `System::EventTopics` (r:2 w:2) - /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// The range of component `r` is `[0, 1]`. - fn seal_return(r: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `853 + r * (45 ±0)` - // Estimated: `6793 + r * (45 ±0)` - // Minimum execution time: 239_663_000 picoseconds. - Weight::from_parts(266_124_565, 6793) - .saturating_add(T::DbWeight::get().reads(8_u64)) - .saturating_add(T::DbWeight::get().writes(3_u64)) - .saturating_add(Weight::from_parts(0, 45).saturating_mul(r.into())) - } - /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) - /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) - /// Storage: `System::Account` (r:1 w:0) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) - /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) - /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) - /// Storage: `Contracts::CodeInfoOf` (r:1 w:0) - /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) - /// Storage: `Contracts::PristineCode` (r:1 w:0) - /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) - /// Storage: `Timestamp::Now` (r:1 w:0) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) - /// Storage: `System::EventTopics` (r:2 w:2) - /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// The range of component `n` is `[0, 1048576]`. - fn seal_return_per_byte(n: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `863` - // Estimated: `6810` - // Minimum execution time: 241_763_000 picoseconds. - Weight::from_parts(266_535_552, 6810) - // Standard Error: 0 - .saturating_add(Weight::from_parts(320, 0).saturating_mul(n.into())) - .saturating_add(T::DbWeight::get().reads(8_u64)) - .saturating_add(T::DbWeight::get().writes(3_u64)) - } - /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) - /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) - /// Storage: `System::Account` (r:3 w:3) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) - /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) - /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) - /// Storage: `Contracts::CodeInfoOf` (r:2 w:2) - /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) - /// Storage: `Contracts::PristineCode` (r:1 w:0) - /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) - /// Storage: `Timestamp::Now` (r:1 w:0) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) - /// Storage: `Contracts::DeletionQueueCounter` (r:1 w:1) - /// Proof: `Contracts::DeletionQueueCounter` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) - /// Storage: `System::EventTopics` (r:4 w:4) + /// Storage: `Contracts::DeletionQueueCounter` (r:1 w:1) + /// Proof: `Contracts::DeletionQueueCounter` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) + /// Storage: `System::EventTopics` (r:4 w:4) /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) /// Storage: `Balances::Holds` (r:1 w:1) - /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(157), added: 2632, mode: `Measured`) + /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(193), added: 2668, mode: `Measured`) /// Storage: `Contracts::DeletionQueue` (r:0 w:1) /// Proof: `Contracts::DeletionQueue` (`max_values`: None, `max_size`: Some(142), added: 2617, mode: `Measured`) /// The range of component `r` is `[0, 1]`. fn seal_terminate(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `2972 + r * (316 ±0)` - // Estimated: `8912 + r * (5266 ±0)` - // Minimum execution time: 265_888_000 picoseconds. - Weight::from_parts(291_232_232, 8912) - // Standard Error: 845_475 - .saturating_add(Weight::from_parts(104_398_867, 0).saturating_mul(r.into())) - .saturating_add(T::DbWeight::get().reads(8_u64)) - .saturating_add(T::DbWeight::get().reads((7_u64).saturating_mul(r.into()))) + // Measured: `4805 + r * (2121 ±0)` + // Estimated: `13220 + r * (81321 ±0)` + // Minimum execution time: 303_028_000 picoseconds. + Weight::from_parts(323_032_397, 13220) + // Standard Error: 848_406 + .saturating_add(Weight::from_parts(242_988_002, 0).saturating_mul(r.into())) + .saturating_add(T::DbWeight::get().reads(11_u64)) + .saturating_add(T::DbWeight::get().reads((36_u64).saturating_mul(r.into()))) .saturating_add(T::DbWeight::get().writes(3_u64)) - .saturating_add(T::DbWeight::get().writes((10_u64).saturating_mul(r.into()))) - .saturating_add(Weight::from_parts(0, 5266).saturating_mul(r.into())) + .saturating_add(T::DbWeight::get().writes((41_u64).saturating_mul(r.into()))) + .saturating_add(Weight::from_parts(0, 81321).saturating_mul(r.into())) } - /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) - /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) - /// Storage: `System::Account` (r:1 w:0) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) - /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) - /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) - /// Storage: `Contracts::CodeInfoOf` (r:1 w:0) - /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) - /// Storage: `Contracts::PristineCode` (r:1 w:0) - /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) - /// Storage: `Timestamp::Now` (r:1 w:0) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) /// Storage: `RandomnessCollectiveFlip::RandomMaterial` (r:1 w:0) /// Proof: `RandomnessCollectiveFlip::RandomMaterial` (`max_values`: Some(1), `max_size`: Some(2594), added: 3089, mode: `Measured`) - /// Storage: `System::EventTopics` (r:2 w:2) - /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `r` is `[0, 1600]`. fn seal_random(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `944 + r * (10 ±0)` - // Estimated: `6885 + r * (10 ±0)` - // Minimum execution time: 248_500_000 picoseconds. - Weight::from_parts(282_353_053, 6885) - // Standard Error: 1_144 - .saturating_add(Weight::from_parts(1_193_841, 0).saturating_mul(r.into())) - .saturating_add(T::DbWeight::get().reads(9_u64)) - .saturating_add(T::DbWeight::get().writes(3_u64)) - .saturating_add(Weight::from_parts(0, 10).saturating_mul(r.into())) + // Measured: `76` + // Estimated: `1561` + // Minimum execution time: 9_227_000 picoseconds. + Weight::from_parts(14_055_283, 1561) + // Standard Error: 758 + .saturating_add(Weight::from_parts(1_104_996, 0).saturating_mul(r.into())) + .saturating_add(T::DbWeight::get().reads(1_u64)) } - /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) - /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) - /// Storage: `System::Account` (r:1 w:0) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) - /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) - /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) - /// Storage: `Contracts::CodeInfoOf` (r:1 w:0) - /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) - /// Storage: `Contracts::PristineCode` (r:1 w:0) - /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) - /// Storage: `Timestamp::Now` (r:1 w:0) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) - /// Storage: `System::EventTopics` (r:2 w:2) - /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `r` is `[0, 1600]`. fn seal_deposit_event(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `863 + r * (10 ±0)` - // Estimated: `6805 + r * (10 ±0)` - // Minimum execution time: 248_130_000 picoseconds. - Weight::from_parts(279_583_178, 6805) - // Standard Error: 971 - .saturating_add(Weight::from_parts(1_987_941, 0).saturating_mul(r.into())) - .saturating_add(T::DbWeight::get().reads(8_u64)) - .saturating_add(T::DbWeight::get().writes(3_u64)) - .saturating_add(Weight::from_parts(0, 10).saturating_mul(r.into())) + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 9_483_000 picoseconds. + Weight::from_parts(20_453_059, 0) + // Standard Error: 3_271 + .saturating_add(Weight::from_parts(1_713_468, 0).saturating_mul(r.into())) } - /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) - /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) - /// Storage: `System::Account` (r:1 w:0) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) - /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) - /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) - /// Storage: `Contracts::CodeInfoOf` (r:1 w:0) - /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) - /// Storage: `Contracts::PristineCode` (r:1 w:0) - /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) - /// Storage: `Timestamp::Now` (r:1 w:0) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) - /// Storage: `System::EventTopics` (r:6 w:6) + /// Storage: `System::EventTopics` (r:4 w:4) /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `t` is `[0, 4]`. /// The range of component `n` is `[0, 16384]`. fn seal_deposit_event_per_topic_and_byte(t: u32, n: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `880 + t * (32 ±0)` - // Estimated: `6825 + t * (2508 ±0)` - // Minimum execution time: 258_594_000 picoseconds. - Weight::from_parts(276_734_422, 6825) - // Standard Error: 102_093 - .saturating_add(Weight::from_parts(2_559_383, 0).saturating_mul(t.into())) - // Standard Error: 28 - .saturating_add(Weight::from_parts(501, 0).saturating_mul(n.into())) - .saturating_add(T::DbWeight::get().reads(8_u64)) + // Measured: `0` + // Estimated: `990 + t * (2475 ±0)` + // Minimum execution time: 23_517_000 picoseconds. + Weight::from_parts(15_543_153, 990) + // Standard Error: 13_814 + .saturating_add(Weight::from_parts(2_357_255, 0).saturating_mul(t.into())) + // Standard Error: 3 + .saturating_add(Weight::from_parts(573, 0).saturating_mul(n.into())) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(t.into()))) - .saturating_add(T::DbWeight::get().writes(3_u64)) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(t.into()))) - .saturating_add(Weight::from_parts(0, 2508).saturating_mul(t.into())) + .saturating_add(Weight::from_parts(0, 2475).saturating_mul(t.into())) } - /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) - /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) - /// Storage: `System::Account` (r:1 w:0) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) - /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) - /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) - /// Storage: `Contracts::CodeInfoOf` (r:1 w:0) - /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) - /// Storage: `Contracts::PristineCode` (r:1 w:0) - /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) - /// Storage: `Timestamp::Now` (r:1 w:0) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) - /// Storage: `System::EventTopics` (r:2 w:2) - /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `r` is `[0, 1600]`. fn seal_debug_message(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `862 + r * (7 ±0)` - // Estimated: `6807 + r * (7 ±0)` - // Minimum execution time: 154_564_000 picoseconds. - Weight::from_parts(168_931_365, 6807) - // Standard Error: 349 - .saturating_add(Weight::from_parts(226_848, 0).saturating_mul(r.into())) - .saturating_add(T::DbWeight::get().reads(8_u64)) - .saturating_add(T::DbWeight::get().writes(3_u64)) - .saturating_add(Weight::from_parts(0, 7).saturating_mul(r.into())) + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 8_448_000 picoseconds. + Weight::from_parts(9_845_841, 0) + // Standard Error: 58 + .saturating_add(Weight::from_parts(105_442, 0).saturating_mul(r.into())) } - /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) - /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:0) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) - /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `MaxEncodedLen`) - /// Storage: `Contracts::CodeInfoOf` (r:1 w:0) - /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`) - /// Storage: `Contracts::PristineCode` (r:1 w:0) - /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `MaxEncodedLen`) - /// Storage: `Timestamp::Now` (r:1 w:0) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `MaxEncodedLen`) - /// Storage: `System::EventTopics` (r:2 w:2) - /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `i` is `[0, 1048576]`. fn seal_debug_message_per_byte(i: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `125813` - // Estimated: `131755` - // Minimum execution time: 394_382_000 picoseconds. - Weight::from_parts(376_780_500, 131755) - // Standard Error: 12 - .saturating_add(Weight::from_parts(1_026, 0).saturating_mul(i.into())) - .saturating_add(T::DbWeight::get().reads(8_u64)) - .saturating_add(T::DbWeight::get().writes(3_u64)) + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 10_869_000 picoseconds. + Weight::from_parts(11_024_000, 0) + // Standard Error: 8 + .saturating_add(Weight::from_parts(991, 0).saturating_mul(i.into())) } /// Storage: `Skipped::Metadata` (r:0 w:0) /// Proof: `Skipped::Metadata` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `r` is `[0, 800]`. fn seal_set_storage(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `924 + r * (292 ±0)` - // Estimated: `926 + r * (293 ±0)` - // Minimum execution time: 249_757_000 picoseconds. - Weight::from_parts(177_324_374, 926) - // Standard Error: 9_512 - .saturating_add(Weight::from_parts(6_176_717, 0).saturating_mul(r.into())) - .saturating_add(T::DbWeight::get().reads(8_u64)) + // Measured: `108 + r * (150 ±0)` + // Estimated: `105 + r * (151 ±0)` + // Minimum execution time: 9_119_000 picoseconds. + Weight::from_parts(9_270_000, 105) + // Standard Error: 8_960 + .saturating_add(Weight::from_parts(5_215_976, 0).saturating_mul(r.into())) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(r.into()))) - .saturating_add(T::DbWeight::get().writes(3_u64)) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(r.into()))) - .saturating_add(Weight::from_parts(0, 293).saturating_mul(r.into())) + .saturating_add(Weight::from_parts(0, 151).saturating_mul(r.into())) } /// Storage: `Skipped::Metadata` (r:0 w:0) /// Proof: `Skipped::Metadata` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `n` is `[0, 16384]`. fn seal_set_storage_per_new_byte(n: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `1447` - // Estimated: `1430` - // Minimum execution time: 267_564_000 picoseconds. - Weight::from_parts(328_701_080, 1430) - // Standard Error: 61 - .saturating_add(Weight::from_parts(576, 0).saturating_mul(n.into())) - .saturating_add(T::DbWeight::get().reads(12_u64)) - .saturating_add(T::DbWeight::get().writes(8_u64)) + // Measured: `245` + // Estimated: `245` + // Minimum execution time: 17_833_000 picoseconds. + Weight::from_parts(18_940_114, 245) + // Standard Error: 2 + .saturating_add(Weight::from_parts(316, 0).saturating_mul(n.into())) + .saturating_add(T::DbWeight::get().reads(1_u64)) + .saturating_add(T::DbWeight::get().writes(1_u64)) } /// Storage: `Skipped::Metadata` (r:0 w:0) /// Proof: `Skipped::Metadata` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `n` is `[0, 16384]`. fn seal_set_storage_per_old_byte(n: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `1253 + n * (1 ±0)` - // Estimated: `1253 + n * (1 ±0)` - // Minimum execution time: 266_347_000 picoseconds. - Weight::from_parts(289_824_718, 1253) - // Standard Error: 34 - .saturating_add(Weight::from_parts(184, 0).saturating_mul(n.into())) - .saturating_add(T::DbWeight::get().reads(9_u64)) - .saturating_add(T::DbWeight::get().writes(4_u64)) + // Measured: `248 + n * (1 ±0)` + // Estimated: `248 + n * (1 ±0)` + // Minimum execution time: 18_428_000 picoseconds. + Weight::from_parts(19_372_726, 248) + // Standard Error: 2 + .saturating_add(Weight::from_parts(85, 0).saturating_mul(n.into())) + .saturating_add(T::DbWeight::get().reads(1_u64)) + .saturating_add(T::DbWeight::get().writes(1_u64)) .saturating_add(Weight::from_parts(0, 1).saturating_mul(n.into())) } /// Storage: `Skipped::Metadata` (r:0 w:0) @@ -1215,31 +912,29 @@ impl WeightInfo for SubstrateWeight { /// The range of component `r` is `[0, 800]`. fn seal_clear_storage(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `921 + r * (288 ±0)` - // Estimated: `927 + r * (289 ±0)` - // Minimum execution time: 247_207_000 picoseconds. - Weight::from_parts(179_856_075, 927) - // Standard Error: 9_383 - .saturating_add(Weight::from_parts(6_053_198, 0).saturating_mul(r.into())) - .saturating_add(T::DbWeight::get().reads(8_u64)) + // Measured: `108 + r * (150 ±0)` + // Estimated: `105 + r * (151 ±0)` + // Minimum execution time: 9_335_000 picoseconds. + Weight::from_parts(9_459_000, 105) + // Standard Error: 9_156 + .saturating_add(Weight::from_parts(5_166_621, 0).saturating_mul(r.into())) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(r.into()))) - .saturating_add(T::DbWeight::get().writes(3_u64)) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(r.into()))) - .saturating_add(Weight::from_parts(0, 289).saturating_mul(r.into())) + .saturating_add(Weight::from_parts(0, 151).saturating_mul(r.into())) } /// Storage: `Skipped::Metadata` (r:0 w:0) /// Proof: `Skipped::Metadata` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `n` is `[0, 16384]`. fn seal_clear_storage_per_byte(n: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `1249 + n * (1 ±0)` - // Estimated: `1249 + n * (1 ±0)` - // Minimum execution time: 262_655_000 picoseconds. - Weight::from_parts(289_482_543, 1249) - // Standard Error: 35 - .saturating_add(Weight::from_parts(92, 0).saturating_mul(n.into())) - .saturating_add(T::DbWeight::get().reads(9_u64)) - .saturating_add(T::DbWeight::get().writes(4_u64)) + // Measured: `248 + n * (1 ±0)` + // Estimated: `248 + n * (1 ±0)` + // Minimum execution time: 18_308_000 picoseconds. + Weight::from_parts(19_421_433, 248) + // Standard Error: 2 + .saturating_add(Weight::from_parts(83, 0).saturating_mul(n.into())) + .saturating_add(T::DbWeight::get().reads(1_u64)) + .saturating_add(T::DbWeight::get().writes(1_u64)) .saturating_add(Weight::from_parts(0, 1).saturating_mul(n.into())) } /// Storage: `Skipped::Metadata` (r:0 w:0) @@ -1247,30 +942,27 @@ impl WeightInfo for SubstrateWeight { /// The range of component `r` is `[0, 800]`. fn seal_get_storage(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `921 + r * (296 ±0)` - // Estimated: `923 + r * (297 ±0)` - // Minimum execution time: 247_414_000 picoseconds. - Weight::from_parts(203_317_182, 923) - // Standard Error: 7_191 - .saturating_add(Weight::from_parts(4_925_154, 0).saturating_mul(r.into())) - .saturating_add(T::DbWeight::get().reads(8_u64)) + // Measured: `108 + r * (150 ±0)` + // Estimated: `105 + r * (151 ±0)` + // Minimum execution time: 9_184_000 picoseconds. + Weight::from_parts(9_245_000, 105) + // Standard Error: 8_442 + .saturating_add(Weight::from_parts(4_543_991, 0).saturating_mul(r.into())) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(r.into()))) - .saturating_add(T::DbWeight::get().writes(3_u64)) - .saturating_add(Weight::from_parts(0, 297).saturating_mul(r.into())) + .saturating_add(Weight::from_parts(0, 151).saturating_mul(r.into())) } /// Storage: `Skipped::Metadata` (r:0 w:0) /// Proof: `Skipped::Metadata` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `n` is `[0, 16384]`. fn seal_get_storage_per_byte(n: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `1265 + n * (1 ±0)` - // Estimated: `1265 + n * (1 ±0)` - // Minimum execution time: 258_910_000 picoseconds. - Weight::from_parts(283_086_514, 1265) - // Standard Error: 39 - .saturating_add(Weight::from_parts(980, 0).saturating_mul(n.into())) - .saturating_add(T::DbWeight::get().reads(9_u64)) - .saturating_add(T::DbWeight::get().writes(3_u64)) + // Measured: `248 + n * (1 ±0)` + // Estimated: `248 + n * (1 ±0)` + // Minimum execution time: 17_194_000 picoseconds. + Weight::from_parts(19_032_094, 248) + // Standard Error: 3 + .saturating_add(Weight::from_parts(590, 0).saturating_mul(n.into())) + .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(Weight::from_parts(0, 1).saturating_mul(n.into())) } /// Storage: `Skipped::Metadata` (r:0 w:0) @@ -1278,30 +970,27 @@ impl WeightInfo for SubstrateWeight { /// The range of component `r` is `[0, 800]`. fn seal_contains_storage(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `932 + r * (288 ±0)` - // Estimated: `929 + r * (289 ±0)` - // Minimum execution time: 252_410_000 picoseconds. - Weight::from_parts(201_227_879, 929) - // Standard Error: 6_899 - .saturating_add(Weight::from_parts(4_774_983, 0).saturating_mul(r.into())) - .saturating_add(T::DbWeight::get().reads(8_u64)) + // Measured: `108 + r * (150 ±0)` + // Estimated: `105 + r * (151 ±0)` + // Minimum execution time: 9_380_000 picoseconds. + Weight::from_parts(9_501_000, 105) + // Standard Error: 7_029 + .saturating_add(Weight::from_parts(4_406_690, 0).saturating_mul(r.into())) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(r.into()))) - .saturating_add(T::DbWeight::get().writes(3_u64)) - .saturating_add(Weight::from_parts(0, 289).saturating_mul(r.into())) + .saturating_add(Weight::from_parts(0, 151).saturating_mul(r.into())) } /// Storage: `Skipped::Metadata` (r:0 w:0) /// Proof: `Skipped::Metadata` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `n` is `[0, 16384]`. fn seal_contains_storage_per_byte(n: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `1252 + n * (1 ±0)` - // Estimated: `1252 + n * (1 ±0)` - // Minimum execution time: 259_053_000 picoseconds. - Weight::from_parts(283_392_084, 1252) - // Standard Error: 41 - .saturating_add(Weight::from_parts(213, 0).saturating_mul(n.into())) - .saturating_add(T::DbWeight::get().reads(9_u64)) - .saturating_add(T::DbWeight::get().writes(3_u64)) + // Measured: `248 + n * (1 ±0)` + // Estimated: `248 + n * (1 ±0)` + // Minimum execution time: 16_400_000 picoseconds. + Weight::from_parts(17_993_941, 248) + // Standard Error: 2 + .saturating_add(Weight::from_parts(68, 0).saturating_mul(n.into())) + .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(Weight::from_parts(0, 1).saturating_mul(n.into())) } /// Storage: `Skipped::Metadata` (r:0 w:0) @@ -1309,440 +998,365 @@ impl WeightInfo for SubstrateWeight { /// The range of component `r` is `[0, 800]`. fn seal_take_storage(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `914 + r * (296 ±0)` - // Estimated: `919 + r * (297 ±0)` - // Minimum execution time: 251_371_000 picoseconds. - Weight::from_parts(177_119_717, 919) - // Standard Error: 9_421 - .saturating_add(Weight::from_parts(6_226_005, 0).saturating_mul(r.into())) - .saturating_add(T::DbWeight::get().reads(8_u64)) + // Measured: `108 + r * (150 ±0)` + // Estimated: `105 + r * (151 ±0)` + // Minimum execution time: 9_109_000 picoseconds. + Weight::from_parts(9_265_000, 105) + // Standard Error: 8_733 + .saturating_add(Weight::from_parts(5_218_811, 0).saturating_mul(r.into())) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(r.into()))) - .saturating_add(T::DbWeight::get().writes(3_u64)) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(r.into()))) - .saturating_add(Weight::from_parts(0, 297).saturating_mul(r.into())) + .saturating_add(Weight::from_parts(0, 151).saturating_mul(r.into())) } /// Storage: `Skipped::Metadata` (r:0 w:0) /// Proof: `Skipped::Metadata` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `n` is `[0, 16384]`. fn seal_take_storage_per_byte(n: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `1266 + n * (1 ±0)` - // Estimated: `1266 + n * (1 ±0)` - // Minimum execution time: 263_350_000 picoseconds. - Weight::from_parts(284_323_917, 1266) - // Standard Error: 31 - .saturating_add(Weight::from_parts(921, 0).saturating_mul(n.into())) - .saturating_add(T::DbWeight::get().reads(9_u64)) - .saturating_add(T::DbWeight::get().writes(4_u64)) + // Measured: `248 + n * (1 ±0)` + // Estimated: `248 + n * (1 ±0)` + // Minimum execution time: 18_423_000 picoseconds. + Weight::from_parts(20_025_132, 248) + // Standard Error: 3 + .saturating_add(Weight::from_parts(628, 0).saturating_mul(n.into())) + .saturating_add(T::DbWeight::get().reads(1_u64)) + .saturating_add(T::DbWeight::get().writes(1_u64)) .saturating_add(Weight::from_parts(0, 1).saturating_mul(n.into())) } - /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) - /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) - /// Storage: `System::Account` (r:1602 w:1601) + /// Storage: `System::Account` (r:1601 w:1601) /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) - /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) - /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) - /// Storage: `Contracts::CodeInfoOf` (r:1 w:0) - /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) - /// Storage: `Contracts::PristineCode` (r:1 w:0) - /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) - /// Storage: `Timestamp::Now` (r:1 w:0) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) - /// Storage: `System::EventTopics` (r:2 w:2) - /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `r` is `[0, 1600]`. fn seal_transfer(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `1415 + r * (45 ±0)` - // Estimated: `7307 + r * (2520 ±0)` - // Minimum execution time: 248_701_000 picoseconds. - Weight::from_parts(17_811_969, 7307) - // Standard Error: 35_154 - .saturating_add(Weight::from_parts(31_809_738, 0).saturating_mul(r.into())) - .saturating_add(T::DbWeight::get().reads(9_u64)) + // Measured: `770` + // Estimated: `4221 + r * (2475 ±0)` + // Minimum execution time: 9_043_000 picoseconds. + Weight::from_parts(9_176_000, 4221) + // Standard Error: 12_901 + .saturating_add(Weight::from_parts(32_297_438, 0).saturating_mul(r.into())) + .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(r.into()))) - .saturating_add(T::DbWeight::get().writes(4_u64)) + .saturating_add(T::DbWeight::get().writes(1_u64)) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(r.into()))) - .saturating_add(Weight::from_parts(0, 2520).saturating_mul(r.into())) + .saturating_add(Weight::from_parts(0, 2475).saturating_mul(r.into())) } - /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) - /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) - /// Storage: `System::Account` (r:1 w:0) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) - /// Storage: `Contracts::ContractInfoOf` (r:801 w:801) + /// Storage: `Contracts::ContractInfoOf` (r:800 w:801) /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) - /// Storage: `Contracts::CodeInfoOf` (r:2 w:0) + /// Storage: `Contracts::CodeInfoOf` (r:1 w:0) /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) - /// Storage: `Contracts::PristineCode` (r:2 w:0) + /// Storage: `Contracts::PristineCode` (r:1 w:0) /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) - /// Storage: `Timestamp::Now` (r:1 w:0) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) - /// Storage: `System::EventTopics` (r:803 w:803) + /// Storage: `System::EventTopics` (r:801 w:801) /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Parameters::Parameters` (r:2 w:0) + /// Proof: `Parameters::Parameters` (`max_values`: None, `max_size`: Some(36), added: 2511, mode: `Measured`) /// The range of component `r` is `[0, 800]`. fn seal_call(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `1260 + r * (245 ±0)` - // Estimated: `9440 + r * (2721 ±0)` - // Minimum execution time: 247_335_000 picoseconds. - Weight::from_parts(264_025_000, 9440) - // Standard Error: 121_299 - .saturating_add(Weight::from_parts(234_770_827, 0).saturating_mul(r.into())) - .saturating_add(T::DbWeight::get().reads(11_u64)) + // Measured: `520 + r * (170 ±0)` + // Estimated: `6463 + r * (2646 ±0)` + // Minimum execution time: 9_299_000 picoseconds. + Weight::from_parts(9_427_000, 6463) + // Standard Error: 101_949 + .saturating_add(Weight::from_parts(244_143_691, 0).saturating_mul(r.into())) + .saturating_add(T::DbWeight::get().reads(5_u64)) .saturating_add(T::DbWeight::get().reads((2_u64).saturating_mul(r.into()))) - .saturating_add(T::DbWeight::get().writes(4_u64)) + .saturating_add(T::DbWeight::get().writes(2_u64)) .saturating_add(T::DbWeight::get().writes((2_u64).saturating_mul(r.into()))) - .saturating_add(Weight::from_parts(0, 2721).saturating_mul(r.into())) + .saturating_add(Weight::from_parts(0, 2646).saturating_mul(r.into())) } - /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) - /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) - /// Storage: `System::Account` (r:1 w:0) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) - /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) - /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) - /// Storage: `Contracts::CodeInfoOf` (r:736 w:0) + /// Storage: `Contracts::CodeInfoOf` (r:735 w:0) /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) - /// Storage: `Contracts::PristineCode` (r:736 w:0) + /// Storage: `Contracts::PristineCode` (r:735 w:0) /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) - /// Storage: `Timestamp::Now` (r:1 w:0) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) - /// Storage: `System::EventTopics` (r:737 w:737) + /// Storage: `System::EventTopics` (r:736 w:736) /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Parameters::Parameters` (r:2 w:0) + /// Proof: `Parameters::Parameters` (`max_values`: None, `max_size`: Some(36), added: 2511, mode: `Measured`) + /// Storage: `Contracts::ContractInfoOf` (r:0 w:1) + /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) /// The range of component `r` is `[0, 800]`. fn seal_delegate_call(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `0 + r * (576 ±0)` - // Estimated: `6812 + r * (2637 ±3)` - // Minimum execution time: 261_011_000 picoseconds. - Weight::from_parts(264_554_000, 6812) - // Standard Error: 104_415 - .saturating_add(Weight::from_parts(231_627_084, 0).saturating_mul(r.into())) - .saturating_add(T::DbWeight::get().reads(8_u64)) + // Measured: `0 + r * (527 ±0)` + // Estimated: `6447 + r * (2583 ±3)` + // Minimum execution time: 9_359_000 picoseconds. + Weight::from_parts(9_425_000, 6447) + // Standard Error: 193_938 + .saturating_add(Weight::from_parts(244_904_401, 0).saturating_mul(r.into())) .saturating_add(T::DbWeight::get().reads((3_u64).saturating_mul(r.into()))) - .saturating_add(T::DbWeight::get().writes(3_u64)) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(r.into()))) - .saturating_add(Weight::from_parts(0, 2637).saturating_mul(r.into())) + .saturating_add(Weight::from_parts(0, 2583).saturating_mul(r.into())) } - /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) - /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) - /// Storage: `System::Account` (r:3 w:2) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) - /// Storage: `Contracts::ContractInfoOf` (r:2 w:2) + /// Storage: `Contracts::ContractInfoOf` (r:1 w:2) /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) - /// Storage: `Contracts::CodeInfoOf` (r:2 w:0) + /// Storage: `Contracts::CodeInfoOf` (r:1 w:0) /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) - /// Storage: `Contracts::PristineCode` (r:2 w:0) + /// Storage: `Contracts::PristineCode` (r:1 w:0) /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) - /// Storage: `Timestamp::Now` (r:1 w:0) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) - /// Storage: `System::EventTopics` (r:4 w:4) + /// Storage: `System::Account` (r:2 w:2) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) + /// Storage: `System::EventTopics` (r:2 w:2) /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Parameters::Parameters` (r:2 w:0) + /// Proof: `Parameters::Parameters` (`max_values`: None, `max_size`: Some(36), added: 2511, mode: `Measured`) /// The range of component `t` is `[0, 1]`. /// The range of component `c` is `[0, 1048576]`. fn seal_call_per_transfer_clone_byte(t: u32, c: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `1307 + t * (277 ±0)` - // Estimated: `12197 + t * (5227 ±0)` - // Minimum execution time: 445_561_000 picoseconds. - Weight::from_parts(62_287_490, 12197) - // Standard Error: 11_797_697 - .saturating_add(Weight::from_parts(357_530_529, 0).saturating_mul(t.into())) - // Standard Error: 17 - .saturating_add(Weight::from_parts(970, 0).saturating_mul(c.into())) - .saturating_add(T::DbWeight::get().reads(13_u64)) + // Measured: `699 + t * (277 ±0)` + // Estimated: `6639 + t * (3458 ±0)` + // Minimum execution time: 214_588_000 picoseconds. + Weight::from_parts(129_214_481, 6639) + // Standard Error: 2_468_090 + .saturating_add(Weight::from_parts(32_514_739, 0).saturating_mul(t.into())) + // Standard Error: 3 + .saturating_add(Weight::from_parts(418, 0).saturating_mul(c.into())) + .saturating_add(T::DbWeight::get().reads(7_u64)) .saturating_add(T::DbWeight::get().reads((2_u64).saturating_mul(t.into()))) - .saturating_add(T::DbWeight::get().writes(6_u64)) + .saturating_add(T::DbWeight::get().writes(4_u64)) .saturating_add(T::DbWeight::get().writes((2_u64).saturating_mul(t.into()))) - .saturating_add(Weight::from_parts(0, 5227).saturating_mul(t.into())) + .saturating_add(Weight::from_parts(0, 3458).saturating_mul(t.into())) } - /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) - /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) - /// Storage: `System::Account` (r:802 w:802) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) - /// Storage: `Contracts::ContractInfoOf` (r:801 w:801) - /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) - /// Storage: `Contracts::CodeInfoOf` (r:801 w:800) + /// Storage: `Contracts::CodeInfoOf` (r:800 w:800) /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) - /// Storage: `Contracts::PristineCode` (r:801 w:0) + /// Storage: `Contracts::PristineCode` (r:800 w:0) /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) - /// Storage: `Timestamp::Now` (r:1 w:0) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) - /// Storage: `Contracts::Nonce` (r:1 w:1) + /// Storage: `Contracts::Nonce` (r:1 w:0) /// Proof: `Contracts::Nonce` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) - /// Storage: `System::EventTopics` (r:803 w:803) + /// Storage: `Contracts::ContractInfoOf` (r:800 w:801) + /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) + /// Storage: `Parameters::Parameters` (r:2 w:0) + /// Proof: `Parameters::Parameters` (`max_values`: None, `max_size`: Some(36), added: 2511, mode: `Measured`) + /// Storage: `System::Account` (r:802 w:802) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) + /// Storage: `System::EventTopics` (r:801 w:801) /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `Balances::Holds` (r:800 w:800) - /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(157), added: 2632, mode: `Measured`) /// The range of component `r` is `[1, 800]`. fn seal_instantiate(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `1278 + r * (255 ±0)` - // Estimated: `9620 + r * (2731 ±0)` - // Minimum execution time: 621_897_000 picoseconds. - Weight::from_parts(631_687_000, 9620) - // Standard Error: 215_241 - .saturating_add(Weight::from_parts(350_527_831, 0).saturating_mul(r.into())) - .saturating_add(T::DbWeight::get().reads(11_u64)) - .saturating_add(T::DbWeight::get().reads((6_u64).saturating_mul(r.into()))) - .saturating_add(T::DbWeight::get().writes(7_u64)) - .saturating_add(T::DbWeight::get().writes((5_u64).saturating_mul(r.into()))) - .saturating_add(Weight::from_parts(0, 2731).saturating_mul(r.into())) + // Measured: `1097 + r * (188 ±0)` + // Estimated: `6990 + r * (2664 ±0)` + // Minimum execution time: 352_925_000 picoseconds. + Weight::from_parts(355_487_000, 6990) + // Standard Error: 261_528 + .saturating_add(Weight::from_parts(337_897_187, 0).saturating_mul(r.into())) + .saturating_add(T::DbWeight::get().reads(6_u64)) + .saturating_add(T::DbWeight::get().reads((5_u64).saturating_mul(r.into()))) + .saturating_add(T::DbWeight::get().writes(4_u64)) + .saturating_add(T::DbWeight::get().writes((4_u64).saturating_mul(r.into()))) + .saturating_add(Weight::from_parts(0, 2664).saturating_mul(r.into())) } - /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) - /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) - /// Storage: `System::Account` (r:3 w:3) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) - /// Storage: `Contracts::ContractInfoOf` (r:2 w:2) - /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) - /// Storage: `Contracts::CodeInfoOf` (r:2 w:1) + /// Storage: `Contracts::CodeInfoOf` (r:1 w:1) /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) - /// Storage: `Contracts::PristineCode` (r:2 w:0) + /// Storage: `Contracts::PristineCode` (r:1 w:0) /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) - /// Storage: `Timestamp::Now` (r:1 w:0) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) - /// Storage: `Contracts::Nonce` (r:1 w:1) + /// Storage: `Contracts::Nonce` (r:1 w:0) /// Proof: `Contracts::Nonce` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) - /// Storage: `System::EventTopics` (r:4 w:4) + /// Storage: `Contracts::ContractInfoOf` (r:1 w:2) + /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) + /// Storage: `Parameters::Parameters` (r:2 w:0) + /// Proof: `Parameters::Parameters` (`max_values`: None, `max_size`: Some(36), added: 2511, mode: `Measured`) + /// Storage: `System::Account` (r:3 w:3) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) + /// Storage: `System::EventTopics` (r:2 w:2) /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `Balances::Holds` (r:1 w:1) - /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(157), added: 2632, mode: `Measured`) /// The range of component `t` is `[0, 1]`. /// The range of component `i` is `[0, 983040]`. /// The range of component `s` is `[0, 983040]`. fn seal_instantiate_per_transfer_input_salt_byte(t: u32, i: u32, s: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `1303 + t * (104 ±0)` - // Estimated: `12211 + t * (2549 ±1)` - // Minimum execution time: 2_181_184_000 picoseconds. - Weight::from_parts(1_194_190_111, 12211) - // Standard Error: 11_578_766 - .saturating_add(Weight::from_parts(6_361_884, 0).saturating_mul(t.into())) - // Standard Error: 18 - .saturating_add(Weight::from_parts(1_025, 0).saturating_mul(i.into())) - // Standard Error: 18 - .saturating_add(Weight::from_parts(1_158, 0).saturating_mul(s.into())) - .saturating_add(T::DbWeight::get().reads(16_u64)) + // Measured: `760 + t * (104 ±0)` + // Estimated: `6719 + t * (2549 ±1)` + // Minimum execution time: 1_870_832_000 picoseconds. + Weight::from_parts(949_110_245, 6719) + // Standard Error: 24 + .saturating_add(Weight::from_parts(1_084, 0).saturating_mul(i.into())) + // Standard Error: 24 + .saturating_add(Weight::from_parts(1_206, 0).saturating_mul(s.into())) + .saturating_add(T::DbWeight::get().reads(10_u64)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(t.into()))) - .saturating_add(T::DbWeight::get().writes(11_u64)) + .saturating_add(T::DbWeight::get().writes(7_u64)) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(t.into()))) .saturating_add(Weight::from_parts(0, 2549).saturating_mul(t.into())) } - /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) - /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) - /// Storage: `System::Account` (r:1 w:0) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) - /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) - /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) - /// Storage: `Contracts::CodeInfoOf` (r:1 w:0) - /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) - /// Storage: `Contracts::PristineCode` (r:1 w:0) - /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) - /// Storage: `Timestamp::Now` (r:1 w:0) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) - /// Storage: `System::EventTopics` (r:2 w:2) - /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `r` is `[0, 1600]`. fn seal_hash_sha2_256(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `862 + r * (8 ±0)` - // Estimated: `6801 + r * (8 ±0)` - // Minimum execution time: 241_609_000 picoseconds. - Weight::from_parts(268_716_874, 6801) - // Standard Error: 617 - .saturating_add(Weight::from_parts(377_753, 0).saturating_mul(r.into())) - .saturating_add(T::DbWeight::get().reads(8_u64)) - .saturating_add(T::DbWeight::get().writes(3_u64)) - .saturating_add(Weight::from_parts(0, 8).saturating_mul(r.into())) + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 9_142_000 picoseconds. + Weight::from_parts(9_787_220, 0) + // Standard Error: 236 + .saturating_add(Weight::from_parts(267_264, 0).saturating_mul(r.into())) } - /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) - /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) - /// Storage: `System::Account` (r:1 w:0) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) - /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) - /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) - /// Storage: `Contracts::CodeInfoOf` (r:1 w:0) - /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) - /// Storage: `Contracts::PristineCode` (r:1 w:0) - /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) - /// Storage: `Timestamp::Now` (r:1 w:0) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) - /// Storage: `System::EventTopics` (r:2 w:2) - /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `n` is `[0, 1048576]`. fn seal_hash_sha2_256_per_byte(n: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `870` - // Estimated: `6808` - // Minimum execution time: 261_296_000 picoseconds. - Weight::from_parts(255_531_654, 6808) + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 10_485_000 picoseconds. + Weight::from_parts(1_870_250, 0) // Standard Error: 1 - .saturating_add(Weight::from_parts(1_081, 0).saturating_mul(n.into())) - .saturating_add(T::DbWeight::get().reads(8_u64)) - .saturating_add(T::DbWeight::get().writes(3_u64)) + .saturating_add(Weight::from_parts(1_073, 0).saturating_mul(n.into())) } - /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) - /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) - /// Storage: `System::Account` (r:1 w:0) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) - /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) - /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) - /// Storage: `Contracts::CodeInfoOf` (r:1 w:0) - /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) - /// Storage: `Contracts::PristineCode` (r:1 w:0) - /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) - /// Storage: `Timestamp::Now` (r:1 w:0) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) - /// Storage: `System::EventTopics` (r:2 w:2) - /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `r` is `[0, 1600]`. fn seal_hash_keccak_256(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `864 + r * (8 ±0)` - // Estimated: `6806 + r * (8 ±0)` - // Minimum execution time: 243_583_000 picoseconds. - Weight::from_parts(270_025_058, 6806) - // Standard Error: 560 - .saturating_add(Weight::from_parts(767_519, 0).saturating_mul(r.into())) - .saturating_add(T::DbWeight::get().reads(8_u64)) - .saturating_add(T::DbWeight::get().writes(3_u64)) - .saturating_add(Weight::from_parts(0, 8).saturating_mul(r.into())) + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 9_005_000 picoseconds. + Weight::from_parts(8_943_937, 0) + // Standard Error: 1_385 + .saturating_add(Weight::from_parts(665_970, 0).saturating_mul(r.into())) } - /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) - /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) - /// Storage: `System::Account` (r:1 w:0) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) - /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) - /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) - /// Storage: `Contracts::CodeInfoOf` (r:1 w:0) - /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) - /// Storage: `Contracts::PristineCode` (r:1 w:0) - /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) - /// Storage: `Timestamp::Now` (r:1 w:0) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) - /// Storage: `System::EventTopics` (r:2 w:2) - /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `n` is `[0, 1048576]`. fn seal_hash_keccak_256_per_byte(n: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `872` - // Estimated: `6814` - // Minimum execution time: 253_798_000 picoseconds. - Weight::from_parts(265_542_351, 6814) - // Standard Error: 0 - .saturating_add(Weight::from_parts(3_343, 0).saturating_mul(n.into())) - .saturating_add(T::DbWeight::get().reads(8_u64)) - .saturating_add(T::DbWeight::get().writes(3_u64)) + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 10_965_000 picoseconds. + Weight::from_parts(11_749_746, 0) + // Standard Error: 6 + .saturating_add(Weight::from_parts(3_330, 0).saturating_mul(n.into())) } - /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) - /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) - /// Storage: `System::Account` (r:1 w:0) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) - /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) - /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) - /// Storage: `Contracts::CodeInfoOf` (r:1 w:0) - /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) - /// Storage: `Contracts::PristineCode` (r:1 w:0) - /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) - /// Storage: `Timestamp::Now` (r:1 w:0) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) - /// Storage: `System::EventTopics` (r:2 w:2) - /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `r` is `[0, 1600]`. fn seal_hash_blake2_256(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `864 + r * (8 ±0)` - // Estimated: `6808 + r * (8 ±0)` - // Minimum execution time: 247_332_000 picoseconds. - Weight::from_parts(269_183_656, 6808) - // Standard Error: 665 - .saturating_add(Weight::from_parts(443_386, 0).saturating_mul(r.into())) - .saturating_add(T::DbWeight::get().reads(8_u64)) - .saturating_add(T::DbWeight::get().writes(3_u64)) - .saturating_add(Weight::from_parts(0, 8).saturating_mul(r.into())) + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 10_400_000 picoseconds. + Weight::from_parts(13_857_546, 0) + // Standard Error: 246 + .saturating_add(Weight::from_parts(326_483, 0).saturating_mul(r.into())) } - /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) - /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) - /// Storage: `System::Account` (r:1 w:0) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) - /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) - /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) - /// Storage: `Contracts::CodeInfoOf` (r:1 w:0) - /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) - /// Storage: `Contracts::PristineCode` (r:1 w:0) - /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) - /// Storage: `Timestamp::Now` (r:1 w:0) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) - /// Storage: `System::EventTopics` (r:2 w:2) - /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `n` is `[0, 1048576]`. fn seal_hash_blake2_256_per_byte(n: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `872` - // Estimated: `6813` - // Minimum execution time: 250_855_000 picoseconds. - Weight::from_parts(258_752_975, 6813) - // Standard Error: 1 - .saturating_add(Weight::from_parts(1_202, 0).saturating_mul(n.into())) - .saturating_add(T::DbWeight::get().reads(8_u64)) - .saturating_add(T::DbWeight::get().writes(3_u64)) + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 10_064_000 picoseconds. + Weight::from_parts(1_885_873, 0) + // Standard Error: 0 + .saturating_add(Weight::from_parts(1_196, 0).saturating_mul(n.into())) } - /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) - /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) - /// Storage: `System::Account` (r:1 w:0) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) - /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) - /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) - /// Storage: `Contracts::CodeInfoOf` (r:1 w:0) - /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) - /// Storage: `Contracts::PristineCode` (r:1 w:0) - /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) - /// Storage: `Timestamp::Now` (r:1 w:0) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) - /// Storage: `System::EventTopics` (r:2 w:2) - /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `r` is `[0, 1600]`. fn seal_hash_blake2_128(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `864 + r * (8 ±0)` - // Estimated: `6805 + r * (8 ±0)` - // Minimum execution time: 240_733_000 picoseconds. - Weight::from_parts(269_134_358, 6805) - // Standard Error: 512 - .saturating_add(Weight::from_parts(440_043, 0).saturating_mul(r.into())) - .saturating_add(T::DbWeight::get().reads(8_u64)) - .saturating_add(T::DbWeight::get().writes(3_u64)) - .saturating_add(Weight::from_parts(0, 8).saturating_mul(r.into())) + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 9_068_000 picoseconds. + Weight::from_parts(17_169_362, 0) + // Standard Error: 1_580 + .saturating_add(Weight::from_parts(330_195, 0).saturating_mul(r.into())) } - /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) - /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) - /// Storage: `System::Account` (r:1 w:0) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) - /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) - /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) - /// Storage: `Contracts::CodeInfoOf` (r:1 w:0) - /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) - /// Storage: `Contracts::PristineCode` (r:1 w:0) - /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) - /// Storage: `Timestamp::Now` (r:1 w:0) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) - /// Storage: `System::EventTopics` (r:2 w:2) - /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `n` is `[0, 1048576]`. fn seal_hash_blake2_128_per_byte(n: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `872` - // Estimated: `6811` - // Minimum execution time: 247_377_000 picoseconds. - Weight::from_parts(261_077_322, 6811) + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 10_169_000 picoseconds. + Weight::from_parts(2_159_277, 0) // Standard Error: 0 - .saturating_add(Weight::from_parts(1_195, 0).saturating_mul(n.into())) - .saturating_add(T::DbWeight::get().reads(8_u64)) - .saturating_add(T::DbWeight::get().writes(3_u64)) + .saturating_add(Weight::from_parts(1_200, 0).saturating_mul(n.into())) + } + /// The range of component `n` is `[0, 125697]`. + fn seal_sr25519_verify_per_byte(n: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 53_863_000 picoseconds. + Weight::from_parts(54_902_157, 0) + // Standard Error: 9 + .saturating_add(Weight::from_parts(4_588, 0).saturating_mul(n.into())) + } + /// The range of component `r` is `[0, 160]`. + fn seal_sr25519_verify(r: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 9_107_000 picoseconds. + Weight::from_parts(24_115_247, 0) + // Standard Error: 7_427 + .saturating_add(Weight::from_parts(41_116_827, 0).saturating_mul(r.into())) + } + /// The range of component `r` is `[0, 160]`. + fn seal_ecdsa_recover(r: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 9_404_000 picoseconds. + Weight::from_parts(31_763_334, 0) + // Standard Error: 9_833 + .saturating_add(Weight::from_parts(45_529_880, 0).saturating_mul(r.into())) + } + /// The range of component `r` is `[0, 160]`. + fn seal_ecdsa_to_eth_address(r: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 11_409_000 picoseconds. + Weight::from_parts(15_072_835, 0) + // Standard Error: 4_591 + .saturating_add(Weight::from_parts(11_619_283, 0).saturating_mul(r.into())) + } + /// Storage: `Contracts::CodeInfoOf` (r:1536 w:1536) + /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) + /// Storage: `Contracts::PristineCode` (r:1535 w:0) + /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) + /// Storage: `Parameters::Parameters` (r:2 w:0) + /// Proof: `Parameters::Parameters` (`max_values`: None, `max_size`: Some(36), added: 2511, mode: `Measured`) + /// Storage: `System::EventTopics` (r:1537 w:1537) + /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// The range of component `r` is `[0, 1600]`. + fn seal_set_code_hash(r: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `0 + r * (926 ±0)` + // Estimated: `8969 + r * (3047 ±10)` + // Minimum execution time: 9_269_000 picoseconds. + Weight::from_parts(9_372_000, 8969) + // Standard Error: 61_354 + .saturating_add(Weight::from_parts(26_280_409, 0).saturating_mul(r.into())) + .saturating_add(T::DbWeight::get().reads((3_u64).saturating_mul(r.into()))) + .saturating_add(T::DbWeight::get().writes((2_u64).saturating_mul(r.into()))) + .saturating_add(Weight::from_parts(0, 3047).saturating_mul(r.into())) + } + /// Storage: `Contracts::CodeInfoOf` (r:32 w:32) + /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) + /// The range of component `r` is `[0, 32]`. + fn lock_delegate_dependency(r: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `274 + r * (78 ±0)` + // Estimated: `1265 + r * (2553 ±0)` + // Minimum execution time: 9_103_000 picoseconds. + Weight::from_parts(14_404_626, 1265) + // Standard Error: 9_343 + .saturating_add(Weight::from_parts(5_154_949, 0).saturating_mul(r.into())) + .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(r.into()))) + .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(r.into()))) + .saturating_add(Weight::from_parts(0, 2553).saturating_mul(r.into())) + } + /// Storage: `Contracts::CodeInfoOf` (r:32 w:32) + /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`) + /// The range of component `r` is `[0, 32]`. + fn unlock_delegate_dependency(r: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `275 + r * (78 ±0)` + // Estimated: `990 + r * (2568 ±0)` + // Minimum execution time: 9_219_000 picoseconds. + Weight::from_parts(14_085_456, 990) + // Standard Error: 11_206 + .saturating_add(Weight::from_parts(4_422_122, 0).saturating_mul(r.into())) + .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(r.into()))) + .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(r.into()))) + .saturating_add(Weight::from_parts(0, 2568).saturating_mul(r.into())) } /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) /// Storage: `System::Account` (r:1 w:0) /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) + /// Storage: `Parameters::Parameters` (r:3 w:0) + /// Proof: `Parameters::Parameters` (`max_values`: None, `max_size`: Some(36), added: 2511, mode: `Measured`) /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) /// Storage: `Contracts::CodeInfoOf` (r:1 w:0) @@ -1753,279 +1367,51 @@ impl WeightInfo for SubstrateWeight { /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) /// Storage: `System::EventTopics` (r:2 w:2) /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// The range of component `n` is `[0, 125697]`. - fn seal_sr25519_verify_per_byte(n: u32, ) -> Weight { + /// The range of component `r` is `[0, 1600]`. + fn seal_reentrance_count(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `997 + n * (1 ±0)` - // Estimated: `6934 + n * (1 ±0)` - // Minimum execution time: 307_337_000 picoseconds. - Weight::from_parts(326_710_473, 6934) - // Standard Error: 9 - .saturating_add(Weight::from_parts(5_765, 0).saturating_mul(n.into())) - .saturating_add(T::DbWeight::get().reads(8_u64)) - .saturating_add(T::DbWeight::get().writes(3_u64)) - .saturating_add(Weight::from_parts(0, 1).saturating_mul(n.into())) - } - /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) - /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) - /// Storage: `System::Account` (r:1 w:0) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) - /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) - /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) - /// Storage: `Contracts::CodeInfoOf` (r:1 w:0) - /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) - /// Storage: `Contracts::PristineCode` (r:1 w:0) - /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) - /// Storage: `Timestamp::Now` (r:1 w:0) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) - /// Storage: `System::EventTopics` (r:2 w:2) - /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// The range of component `r` is `[0, 160]`. - fn seal_sr25519_verify(r: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `805 + r * (112 ±0)` - // Estimated: `6748 + r * (112 ±0)` - // Minimum execution time: 245_432_000 picoseconds. - Weight::from_parts(294_206_377, 6748) - // Standard Error: 7_229 - .saturating_add(Weight::from_parts(41_480_485, 0).saturating_mul(r.into())) - .saturating_add(T::DbWeight::get().reads(8_u64)) - .saturating_add(T::DbWeight::get().writes(3_u64)) - .saturating_add(Weight::from_parts(0, 112).saturating_mul(r.into())) - } - /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) - /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) - /// Storage: `System::Account` (r:1 w:0) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) - /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) - /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) - /// Storage: `Contracts::CodeInfoOf` (r:1 w:0) - /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) - /// Storage: `Contracts::PristineCode` (r:1 w:0) - /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) - /// Storage: `Timestamp::Now` (r:1 w:0) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) - /// Storage: `System::EventTopics` (r:2 w:2) - /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// The range of component `r` is `[0, 160]`. - fn seal_ecdsa_recover(r: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `907 + r * (76 ±0)` - // Estimated: `6802 + r * (77 ±0)` - // Minimum execution time: 247_788_000 picoseconds. - Weight::from_parts(303_940_062, 6802) - // Standard Error: 10_671 - .saturating_add(Weight::from_parts(45_730_772, 0).saturating_mul(r.into())) - .saturating_add(T::DbWeight::get().reads(8_u64)) - .saturating_add(T::DbWeight::get().writes(3_u64)) - .saturating_add(Weight::from_parts(0, 77).saturating_mul(r.into())) - } - /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) - /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) - /// Storage: `System::Account` (r:1 w:0) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) - /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) - /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) - /// Storage: `Contracts::CodeInfoOf` (r:1 w:0) - /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) - /// Storage: `Contracts::PristineCode` (r:1 w:0) - /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) - /// Storage: `Timestamp::Now` (r:1 w:0) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) - /// Storage: `System::EventTopics` (r:2 w:2) - /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// The range of component `r` is `[0, 160]`. - fn seal_ecdsa_to_eth_address(r: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `877 + r * (42 ±0)` - // Estimated: `6816 + r * (42 ±0)` - // Minimum execution time: 248_825_000 picoseconds. - Weight::from_parts(286_832_225, 6816) - // Standard Error: 5_274 - .saturating_add(Weight::from_parts(11_889_262, 0).saturating_mul(r.into())) - .saturating_add(T::DbWeight::get().reads(8_u64)) - .saturating_add(T::DbWeight::get().writes(3_u64)) - .saturating_add(Weight::from_parts(0, 42).saturating_mul(r.into())) - } - /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) - /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) - /// Storage: `System::Account` (r:1 w:0) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) - /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) - /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) - /// Storage: `Contracts::CodeInfoOf` (r:1536 w:1536) - /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) - /// Storage: `Contracts::PristineCode` (r:1536 w:0) - /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) - /// Storage: `Timestamp::Now` (r:1 w:0) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) - /// Storage: `System::EventTopics` (r:1538 w:1538) - /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// The range of component `r` is `[0, 1600]`. - fn seal_set_code_hash(r: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `0 + r * (965 ±0)` - // Estimated: `6807 + r * (3090 ±7)` - // Minimum execution time: 244_982_000 picoseconds. - Weight::from_parts(265_297_000, 6807) - // Standard Error: 39_895 - .saturating_add(Weight::from_parts(22_435_888, 0).saturating_mul(r.into())) - .saturating_add(T::DbWeight::get().reads(8_u64)) - .saturating_add(T::DbWeight::get().reads((3_u64).saturating_mul(r.into()))) - .saturating_add(T::DbWeight::get().writes(3_u64)) - .saturating_add(T::DbWeight::get().writes((2_u64).saturating_mul(r.into()))) - .saturating_add(Weight::from_parts(0, 3090).saturating_mul(r.into())) - } - /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) - /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) - /// Storage: `System::Account` (r:1 w:0) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) - /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) - /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) - /// Storage: `Contracts::CodeInfoOf` (r:33 w:32) - /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) - /// Storage: `Contracts::PristineCode` (r:1 w:0) - /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) - /// Storage: `Timestamp::Now` (r:1 w:0) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) - /// Storage: `System::EventTopics` (r:2 w:2) - /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// The range of component `r` is `[0, 32]`. - fn add_delegate_dependency(r: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `928 + r * (131 ±0)` - // Estimated: `6878 + r * (2606 ±0)` - // Minimum execution time: 246_455_000 picoseconds. - Weight::from_parts(275_334_919, 6878) - // Standard Error: 20_911 - .saturating_add(Weight::from_parts(6_427_525, 0).saturating_mul(r.into())) - .saturating_add(T::DbWeight::get().reads(8_u64)) - .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(r.into()))) - .saturating_add(T::DbWeight::get().writes(3_u64)) - .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(r.into()))) - .saturating_add(Weight::from_parts(0, 2606).saturating_mul(r.into())) - } - /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) - /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:0) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) - /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `MaxEncodedLen`) - /// Storage: `Contracts::CodeInfoOf` (r:33 w:32) - /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`) - /// Storage: `Contracts::PristineCode` (r:1 w:0) - /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `MaxEncodedLen`) - /// Storage: `Timestamp::Now` (r:1 w:0) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `MaxEncodedLen`) - /// Storage: `System::EventTopics` (r:2 w:2) - /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// The range of component `r` is `[0, 32]`. - fn remove_delegate_dependency(r: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `969 + r * (183 ±0)` - // Estimated: `129453 + r * (2568 ±0)` - // Minimum execution time: 254_472_000 picoseconds. - Weight::from_parts(280_657_909, 129453) - // Standard Error: 20_131 - .saturating_add(Weight::from_parts(5_644_006, 0).saturating_mul(r.into())) - .saturating_add(T::DbWeight::get().reads(8_u64)) - .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(r.into()))) - .saturating_add(T::DbWeight::get().writes(3_u64)) - .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(r.into()))) - .saturating_add(Weight::from_parts(0, 2568).saturating_mul(r.into())) - } - /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) - /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) - /// Storage: `System::Account` (r:1 w:0) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) - /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) - /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) - /// Storage: `Contracts::CodeInfoOf` (r:1 w:0) - /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) - /// Storage: `Contracts::PristineCode` (r:1 w:0) - /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) - /// Storage: `Timestamp::Now` (r:1 w:0) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) - /// Storage: `System::EventTopics` (r:2 w:2) - /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// The range of component `r` is `[0, 1600]`. - fn seal_reentrance_count(r: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `858 + r * (3 ±0)` - // Estimated: `6804 + r * (3 ±0)` - // Minimum execution time: 250_535_000 picoseconds. - Weight::from_parts(270_318_376, 6804) - // Standard Error: 386 - .saturating_add(Weight::from_parts(174_627, 0).saturating_mul(r.into())) - .saturating_add(T::DbWeight::get().reads(8_u64)) + // Measured: `861 + r * (3 ±0)` + // Estimated: `9282 + r * (3 ±0)` + // Minimum execution time: 269_333_000 picoseconds. + Weight::from_parts(286_922_618, 9282) + // Standard Error: 443 + .saturating_add(Weight::from_parts(168_869, 0).saturating_mul(r.into())) + .saturating_add(T::DbWeight::get().reads(11_u64)) .saturating_add(T::DbWeight::get().writes(3_u64)) .saturating_add(Weight::from_parts(0, 3).saturating_mul(r.into())) } - /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) - /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) - /// Storage: `System::Account` (r:1 w:0) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) - /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) - /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) - /// Storage: `Contracts::CodeInfoOf` (r:1 w:0) - /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) - /// Storage: `Contracts::PristineCode` (r:1 w:0) - /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) - /// Storage: `Timestamp::Now` (r:1 w:0) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) - /// Storage: `System::EventTopics` (r:2 w:2) - /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `r` is `[0, 1600]`. fn seal_account_reentrance_count(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `2109 + r * (39 ±0)` - // Estimated: `7899 + r * (40 ±0)` - // Minimum execution time: 248_174_000 picoseconds. - Weight::from_parts(301_826_520, 7899) - // Standard Error: 801 - .saturating_add(Weight::from_parts(248_479, 0).saturating_mul(r.into())) - .saturating_add(T::DbWeight::get().reads(8_u64)) - .saturating_add(T::DbWeight::get().writes(3_u64)) - .saturating_add(Weight::from_parts(0, 40).saturating_mul(r.into())) + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 9_328_000 picoseconds. + Weight::from_parts(14_019_583, 0) + // Standard Error: 171 + .saturating_add(Weight::from_parts(88_751, 0).saturating_mul(r.into())) } - /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) - /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) - /// Storage: `System::Account` (r:1 w:0) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) - /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) - /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) - /// Storage: `Contracts::CodeInfoOf` (r:1 w:0) - /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) - /// Storage: `Contracts::PristineCode` (r:1 w:0) - /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) - /// Storage: `Timestamp::Now` (r:1 w:0) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) - /// Storage: `Contracts::Nonce` (r:1 w:1) + /// Storage: `Contracts::Nonce` (r:1 w:0) /// Proof: `Contracts::Nonce` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) - /// Storage: `System::EventTopics` (r:2 w:2) - /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `r` is `[0, 1600]`. fn seal_instantiation_nonce(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `861 + r * (3 ±0)` - // Estimated: `6801 + r * (3 ±0)` - // Minimum execution time: 246_540_000 picoseconds. - Weight::from_parts(268_913_509, 6801) - // Standard Error: 378 - .saturating_add(Weight::from_parts(154_950, 0).saturating_mul(r.into())) - .saturating_add(T::DbWeight::get().reads(9_u64)) - .saturating_add(T::DbWeight::get().writes(4_u64)) - .saturating_add(Weight::from_parts(0, 3).saturating_mul(r.into())) + // Measured: `219` + // Estimated: `1704` + // Minimum execution time: 9_267_000 picoseconds. + Weight::from_parts(15_304_284, 1704) + // Standard Error: 1_219 + .saturating_add(Weight::from_parts(74_696, 0).saturating_mul(r.into())) + .saturating_add(T::DbWeight::get().reads(1_u64)) } /// The range of component `r` is `[0, 5000]`. fn instr_i64_load_store(r: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_777_000 picoseconds. - Weight::from_parts(1_707_601, 0) - // Standard Error: 14 - .saturating_add(Weight::from_parts(15_392, 0).saturating_mul(r.into())) + // Minimum execution time: 911_000 picoseconds. + Weight::from_parts(449_666, 0) + // Standard Error: 26 + .saturating_add(Weight::from_parts(14_797, 0).saturating_mul(r.into())) } } @@ -2037,8 +1423,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `142` // Estimated: `1627` - // Minimum execution time: 1_997_000 picoseconds. - Weight::from_parts(2_130_000, 1627) + // Minimum execution time: 2_047_000 picoseconds. + Weight::from_parts(2_116_000, 1627) .saturating_add(RocksDbWeight::get().reads(1_u64)) } /// Storage: `Skipped::Metadata` (r:0 w:0) @@ -2048,10 +1434,10 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `452 + k * (69 ±0)` // Estimated: `442 + k * (70 ±0)` - // Minimum execution time: 12_276_000 picoseconds. - Weight::from_parts(1_593_881, 442) - // Standard Error: 1_135 - .saturating_add(Weight::from_parts(1_109_302, 0).saturating_mul(k.into())) + // Minimum execution time: 12_474_000 picoseconds. + Weight::from_parts(12_767_000, 442) + // Standard Error: 1_081 + .saturating_add(Weight::from_parts(1_187_278, 0).saturating_mul(k.into())) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().reads((1_u64).saturating_mul(k.into()))) .saturating_add(RocksDbWeight::get().writes(2_u64)) @@ -2065,10 +1451,10 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `211 + c * (1 ±0)` // Estimated: `6149 + c * (1 ±0)` - // Minimum execution time: 8_176_000 picoseconds. - Weight::from_parts(8_555_388, 6149) + // Minimum execution time: 8_307_000 picoseconds. + Weight::from_parts(8_939_322, 6149) // Standard Error: 1 - .saturating_add(Weight::from_parts(1_184, 0).saturating_mul(c.into())) + .saturating_add(Weight::from_parts(1_190, 0).saturating_mul(c.into())) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) .saturating_add(Weight::from_parts(0, 1).saturating_mul(c.into())) @@ -2081,8 +1467,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `510` // Estimated: `6450` - // Minimum execution time: 16_270_000 picoseconds. - Weight::from_parts(16_779_000, 6450) + // Minimum execution time: 16_915_000 picoseconds. + Weight::from_parts(17_638_000, 6450) .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -2095,10 +1481,10 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `171 + k * (1 ±0)` // Estimated: `3635 + k * (1 ±0)` - // Minimum execution time: 3_572_000 picoseconds. - Weight::from_parts(1_950_905, 3635) - // Standard Error: 1_597 - .saturating_add(Weight::from_parts(1_123_190, 0).saturating_mul(k.into())) + // Minimum execution time: 3_607_000 picoseconds. + Weight::from_parts(1_979_323, 3635) + // Standard Error: 1_018 + .saturating_add(Weight::from_parts(1_196_162, 0).saturating_mul(k.into())) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) .saturating_add(RocksDbWeight::get().writes((1_u64).saturating_mul(k.into()))) @@ -2108,6 +1494,8 @@ impl WeightInfo for () { /// Proof: UNKNOWN KEY `0x4342193e496fab7ec59d615ed0dc553053f13fd319a03c211337c76e0fe776df` (r:2 w:0) /// Storage: UNKNOWN KEY `0x4342193e496fab7ec59d615ed0dc553022fca90611ba8b7942f8bdb3b97f6580` (r:1 w:1) /// Proof: UNKNOWN KEY `0x4342193e496fab7ec59d615ed0dc553022fca90611ba8b7942f8bdb3b97f6580` (r:1 w:1) + /// Storage: `Parameters::Parameters` (r:2 w:0) + /// Proof: `Parameters::Parameters` (`max_values`: None, `max_size`: Some(36), added: 2511, mode: `Measured`) /// Storage: `System::Account` (r:1 w:0) /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) /// Storage: `Contracts::CodeInfoOf` (r:0 w:1) @@ -2115,13 +1503,13 @@ impl WeightInfo for () { /// The range of component `c` is `[0, 125952]`. fn v12_migration_step(c: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `325 + c * (1 ±0)` - // Estimated: `6263 + c * (1 ±0)` - // Minimum execution time: 16_873_000 picoseconds. - Weight::from_parts(16_790_402, 6263) + // Measured: `328 + c * (1 ±0)` + // Estimated: `6266 + c * (1 ±0)` + // Minimum execution time: 21_056_000 picoseconds. + Weight::from_parts(21_633_895, 6266) // Standard Error: 1 - .saturating_add(Weight::from_parts(396, 0).saturating_mul(c.into())) - .saturating_add(RocksDbWeight::get().reads(4_u64)) + .saturating_add(Weight::from_parts(390, 0).saturating_mul(c.into())) + .saturating_add(RocksDbWeight::get().reads(6_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) .saturating_add(Weight::from_parts(0, 1).saturating_mul(c.into())) } @@ -2131,8 +1519,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `440` // Estimated: `6380` - // Minimum execution time: 11_904_000 picoseconds. - Weight::from_parts(12_785_000, 6380) + // Minimum execution time: 12_860_000 picoseconds. + Weight::from_parts(13_525_000, 6380) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -2141,13 +1529,13 @@ impl WeightInfo for () { /// Storage: `System::Account` (r:1 w:1) /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) /// Storage: `Balances::Holds` (r:1 w:0) - /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(157), added: 2632, mode: `Measured`) + /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(193), added: 2668, mode: `Measured`) fn v14_migration_step() -> Weight { // Proof Size summary in bytes: // Measured: `352` // Estimated: `6292` - // Minimum execution time: 44_920_000 picoseconds. - Weight::from_parts(46_163_000, 6292) + // Minimum execution time: 46_926_000 picoseconds. + Weight::from_parts(47_828_000, 6292) .saturating_add(RocksDbWeight::get().reads(4_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -2159,19 +1547,30 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `594` // Estimated: `6534` - // Minimum execution time: 53_864_000 picoseconds. - Weight::from_parts(55_139_000, 6534) + // Minimum execution time: 55_081_000 picoseconds. + Weight::from_parts(56_899_000, 6534) .saturating_add(RocksDbWeight::get().reads(4_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } + /// Storage: `Contracts::ContractInfoOf` (r:2 w:1) + /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) + fn v16_migration_step() -> Weight { + // Proof Size summary in bytes: + // Measured: `409` + // Estimated: `6349` + // Minimum execution time: 12_595_000 picoseconds. + Weight::from_parts(13_059_000, 6349) + .saturating_add(RocksDbWeight::get().reads(2_u64)) + .saturating_add(RocksDbWeight::get().writes(1_u64)) + } /// Storage: `Contracts::MigrationInProgress` (r:1 w:1) /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) fn migration_noop() -> Weight { // Proof Size summary in bytes: // Measured: `142` // Estimated: `1627` - // Minimum execution time: 2_375_000 picoseconds. - Weight::from_parts(2_487_000, 1627) + // Minimum execution time: 2_480_000 picoseconds. + Weight::from_parts(2_663_000, 1627) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -2183,8 +1582,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `166` // Estimated: `3631` - // Minimum execution time: 11_580_000 picoseconds. - Weight::from_parts(11_980_000, 3631) + // Minimum execution time: 12_115_000 picoseconds. + Weight::from_parts(12_506_000, 3631) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } @@ -2194,8 +1593,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `142` // Estimated: `3607` - // Minimum execution time: 4_557_000 picoseconds. - Weight::from_parts(4_807_000, 3607) + // Minimum execution time: 4_757_000 picoseconds. + Weight::from_parts(5_082_000, 3607) .saturating_add(RocksDbWeight::get().reads(1_u64)) } /// Storage: UNKNOWN KEY `0x4342193e496fab7ec59d615ed0dc55304e7b9012096b41c4eb3aaf947f6ea429` (r:1 w:0) @@ -2206,8 +1605,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `167` // Estimated: `3632` - // Minimum execution time: 6_253_000 picoseconds. - Weight::from_parts(6_479_000, 3632) + // Minimum execution time: 6_017_000 picoseconds. + Weight::from_parts(6_421_000, 3632) .saturating_add(RocksDbWeight::get().reads(2_u64)) } /// Storage: UNKNOWN KEY `0x4342193e496fab7ec59d615ed0dc55304e7b9012096b41c4eb3aaf947f6ea429` (r:1 w:0) @@ -2218,13 +1617,15 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `142` // Estimated: `3607` - // Minimum execution time: 6_166_000 picoseconds. - Weight::from_parts(6_545_000, 3607) + // Minimum execution time: 6_238_000 picoseconds. + Weight::from_parts(6_587_000, 3607) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) + /// Storage: `Parameters::Parameters` (r:3 w:0) + /// Proof: `Parameters::Parameters` (`max_values`: None, `max_size`: Some(36), added: 2511, mode: `Measured`) /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) /// Storage: `Contracts::CodeInfoOf` (r:1 w:0) @@ -2240,22 +1641,24 @@ impl WeightInfo for () { /// The range of component `c` is `[0, 125952]`. fn call_with_code_per_byte(c: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `801 + c * (1 ±0)` - // Estimated: `6739 + c * (1 ±0)` - // Minimum execution time: 282_232_000 picoseconds. - Weight::from_parts(266_148_573, 6739) - // Standard Error: 69 - .saturating_add(Weight::from_parts(34_592, 0).saturating_mul(c.into())) - .saturating_add(RocksDbWeight::get().reads(8_u64)) + // Measured: `804 + c * (1 ±0)` + // Estimated: `9217 + c * (1 ±0)` + // Minimum execution time: 288_968_000 picoseconds. + Weight::from_parts(267_291_922, 9217) + // Standard Error: 78 + .saturating_add(Weight::from_parts(34_879, 0).saturating_mul(c.into())) + .saturating_add(RocksDbWeight::get().reads(11_u64)) .saturating_add(RocksDbWeight::get().writes(4_u64)) .saturating_add(Weight::from_parts(0, 1).saturating_mul(c.into())) } /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) + /// Storage: `Parameters::Parameters` (r:3 w:0) + /// Proof: `Parameters::Parameters` (`max_values`: None, `max_size`: Some(36), added: 2511, mode: `Measured`) /// Storage: `Contracts::CodeInfoOf` (r:1 w:1) /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) /// Storage: `Balances::Holds` (r:2 w:2) - /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(157), added: 2632, mode: `Measured`) + /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(193), added: 2668, mode: `Measured`) /// Storage: `System::EventTopics` (r:3 w:3) /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) /// Storage: `Contracts::Nonce` (r:1 w:1) @@ -2273,17 +1676,17 @@ impl WeightInfo for () { /// The range of component `s` is `[0, 1048576]`. fn instantiate_with_code(c: u32, i: u32, s: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `323` - // Estimated: `8737` - // Minimum execution time: 3_760_879_000 picoseconds. - Weight::from_parts(794_812_431, 8737) - // Standard Error: 149 - .saturating_add(Weight::from_parts(101_881, 0).saturating_mul(c.into())) - // Standard Error: 18 - .saturating_add(Weight::from_parts(1_404, 0).saturating_mul(i.into())) - // Standard Error: 18 - .saturating_add(Weight::from_parts(1_544, 0).saturating_mul(s.into())) - .saturating_add(RocksDbWeight::get().reads(11_u64)) + // Measured: `326` + // Estimated: `8740` + // Minimum execution time: 3_948_426_000 picoseconds. + Weight::from_parts(440_017_623, 8740) + // Standard Error: 555 + .saturating_add(Weight::from_parts(71_483, 0).saturating_mul(c.into())) + // Standard Error: 66 + .saturating_add(Weight::from_parts(1_831, 0).saturating_mul(i.into())) + // Standard Error: 66 + .saturating_add(Weight::from_parts(1_694, 0).saturating_mul(s.into())) + .saturating_add(RocksDbWeight::get().reads(14_u64)) .saturating_add(RocksDbWeight::get().writes(10_u64)) } /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) @@ -2292,6 +1695,8 @@ impl WeightInfo for () { /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) /// Storage: `Contracts::PristineCode` (r:1 w:0) /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) + /// Storage: `Parameters::Parameters` (r:3 w:0) + /// Proof: `Parameters::Parameters` (`max_values`: None, `max_size`: Some(36), added: 2511, mode: `Measured`) /// Storage: `Contracts::Nonce` (r:1 w:1) /// Proof: `Contracts::Nonce` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) @@ -2303,24 +1708,26 @@ impl WeightInfo for () { /// Storage: `System::EventTopics` (r:2 w:2) /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) /// Storage: `Balances::Holds` (r:1 w:1) - /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(157), added: 2632, mode: `Measured`) + /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(193), added: 2668, mode: `Measured`) /// The range of component `i` is `[0, 1048576]`. /// The range of component `s` is `[0, 1048576]`. fn instantiate(i: u32, s: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `560` - // Estimated: `6504` - // Minimum execution time: 1_953_162_000 picoseconds. - Weight::from_parts(374_252_840, 6504) - // Standard Error: 7 - .saturating_add(Weight::from_parts(1_630, 0).saturating_mul(i.into())) - // Standard Error: 7 - .saturating_add(Weight::from_parts(1_650, 0).saturating_mul(s.into())) - .saturating_add(RocksDbWeight::get().reads(10_u64)) + // Measured: `563` + // Estimated: `8982` + // Minimum execution time: 2_011_037_000 picoseconds. + Weight::from_parts(2_047_025_000, 8982) + // Standard Error: 28 + .saturating_add(Weight::from_parts(968, 0).saturating_mul(i.into())) + // Standard Error: 28 + .saturating_add(Weight::from_parts(780, 0).saturating_mul(s.into())) + .saturating_add(RocksDbWeight::get().reads(13_u64)) .saturating_add(RocksDbWeight::get().writes(7_u64)) } /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) + /// Storage: `Parameters::Parameters` (r:3 w:0) + /// Proof: `Parameters::Parameters` (`max_values`: None, `max_size`: Some(36), added: 2511, mode: `Measured`) /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) /// Storage: `Contracts::CodeInfoOf` (r:1 w:0) @@ -2335,41 +1742,67 @@ impl WeightInfo for () { /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) fn call() -> Weight { // Proof Size summary in bytes: - // Measured: `826` - // Estimated: `6766` - // Minimum execution time: 187_899_000 picoseconds. - Weight::from_parts(195_510_000, 6766) - .saturating_add(RocksDbWeight::get().reads(8_u64)) + // Measured: `829` + // Estimated: `9244` + // Minimum execution time: 202_190_000 picoseconds. + Weight::from_parts(209_378_000, 9244) + .saturating_add(RocksDbWeight::get().reads(11_u64)) .saturating_add(RocksDbWeight::get().writes(4_u64)) } /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) + /// Storage: `Parameters::Parameters` (r:2 w:0) + /// Proof: `Parameters::Parameters` (`max_values`: None, `max_size`: Some(36), added: 2511, mode: `Measured`) /// Storage: `Contracts::CodeInfoOf` (r:1 w:1) /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) /// Storage: `Balances::Holds` (r:1 w:1) - /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(157), added: 2632, mode: `Measured`) + /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(193), added: 2668, mode: `Measured`) /// Storage: `System::EventTopics` (r:1 w:1) /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) /// Storage: `Contracts::PristineCode` (r:0 w:1) /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) /// The range of component `c` is `[0, 125952]`. - fn upload_code(c: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `142` - // Estimated: `3607` - // Minimum execution time: 254_800_000 picoseconds. - Weight::from_parts(285_603_050, 3607) - // Standard Error: 62 - .saturating_add(Weight::from_parts(66_212, 0).saturating_mul(c.into())) - .saturating_add(RocksDbWeight::get().reads(4_u64)) + fn upload_code_determinism_enforced(c: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `145` + // Estimated: `6085` + // Minimum execution time: 271_161_000 picoseconds. + Weight::from_parts(279_218_977, 6085) + // Standard Error: 80 + .saturating_add(Weight::from_parts(33_973, 0).saturating_mul(c.into())) + .saturating_add(RocksDbWeight::get().reads(6_u64)) .saturating_add(RocksDbWeight::get().writes(4_u64)) } /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) + /// Storage: `Parameters::Parameters` (r:2 w:0) + /// Proof: `Parameters::Parameters` (`max_values`: None, `max_size`: Some(36), added: 2511, mode: `Measured`) /// Storage: `Contracts::CodeInfoOf` (r:1 w:1) /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) /// Storage: `Balances::Holds` (r:1 w:1) - /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(157), added: 2632, mode: `Measured`) + /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(193), added: 2668, mode: `Measured`) + /// Storage: `System::EventTopics` (r:1 w:1) + /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Contracts::PristineCode` (r:0 w:1) + /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) + /// The range of component `c` is `[0, 125952]`. + fn upload_code_determinism_relaxed(c: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `145` + // Estimated: `6085` + // Minimum execution time: 273_684_000 picoseconds. + Weight::from_parts(284_348_722, 6085) + // Standard Error: 79 + .saturating_add(Weight::from_parts(34_205, 0).saturating_mul(c.into())) + .saturating_add(RocksDbWeight::get().reads(6_u64)) + .saturating_add(RocksDbWeight::get().writes(4_u64)) + } + /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) + /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) + /// Storage: `Contracts::CodeInfoOf` (r:1 w:1) + /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) + /// Storage: `Balances::Holds` (r:1 w:1) + /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(193), added: 2668, mode: `Measured`) /// Storage: `System::EventTopics` (r:1 w:1) /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) /// Storage: `Contracts::PristineCode` (r:0 w:1) @@ -2378,8 +1811,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `315` // Estimated: `3780` - // Minimum execution time: 43_553_000 picoseconds. - Weight::from_parts(45_036_000, 3780) + // Minimum execution time: 45_150_000 picoseconds. + Weight::from_parts(46_780_000, 3780) .saturating_add(RocksDbWeight::get().reads(4_u64)) .saturating_add(RocksDbWeight::get().writes(4_u64)) } @@ -2395,448 +1828,181 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `552` // Estimated: `8967` - // Minimum execution time: 33_223_000 picoseconds. - Weight::from_parts(34_385_000, 8967) + // Minimum execution time: 34_738_000 picoseconds. + Weight::from_parts(35_918_000, 8967) .saturating_add(RocksDbWeight::get().reads(7_u64)) .saturating_add(RocksDbWeight::get().writes(6_u64)) } - /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) - /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) - /// Storage: `System::Account` (r:1 w:0) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) - /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) - /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) - /// Storage: `Contracts::CodeInfoOf` (r:1 w:0) - /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) - /// Storage: `Contracts::PristineCode` (r:1 w:0) - /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) - /// Storage: `Timestamp::Now` (r:1 w:0) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) - /// Storage: `System::EventTopics` (r:2 w:2) - /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `r` is `[0, 1600]`. fn seal_caller(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `866 + r * (6 ±0)` - // Estimated: `6806 + r * (6 ±0)` - // Minimum execution time: 254_213_000 picoseconds. - Weight::from_parts(273_464_980, 6806) - // Standard Error: 1_362 - .saturating_add(Weight::from_parts(322_619, 0).saturating_mul(r.into())) - .saturating_add(RocksDbWeight::get().reads(8_u64)) - .saturating_add(RocksDbWeight::get().writes(3_u64)) - .saturating_add(Weight::from_parts(0, 6).saturating_mul(r.into())) + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 9_094_000 picoseconds. + Weight::from_parts(10_253_702, 0) + // Standard Error: 223 + .saturating_add(Weight::from_parts(250_757, 0).saturating_mul(r.into())) } - /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) - /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) - /// Storage: `System::Account` (r:1 w:0) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) - /// Storage: `Contracts::ContractInfoOf` (r:1601 w:1) + /// Storage: `Contracts::ContractInfoOf` (r:1600 w:0) /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) - /// Storage: `Contracts::CodeInfoOf` (r:1 w:0) - /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) - /// Storage: `Contracts::PristineCode` (r:1 w:0) - /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) - /// Storage: `Timestamp::Now` (r:1 w:0) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) - /// Storage: `System::EventTopics` (r:2 w:2) - /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `r` is `[0, 1600]`. fn seal_is_contract(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `922 + r * (209 ±0)` - // Estimated: `6826 + r * (2684 ±0)` - // Minimum execution time: 250_273_000 picoseconds. - Weight::from_parts(122_072_782, 6826) - // Standard Error: 5_629 - .saturating_add(Weight::from_parts(3_490_256, 0).saturating_mul(r.into())) - .saturating_add(RocksDbWeight::get().reads(8_u64)) + // Measured: `509 + r * (77 ±0)` + // Estimated: `1467 + r * (2552 ±0)` + // Minimum execution time: 9_102_000 picoseconds. + Weight::from_parts(9_238_000, 1467) + // Standard Error: 6_076 + .saturating_add(Weight::from_parts(3_293_012, 0).saturating_mul(r.into())) .saturating_add(RocksDbWeight::get().reads((1_u64).saturating_mul(r.into()))) - .saturating_add(RocksDbWeight::get().writes(3_u64)) - .saturating_add(Weight::from_parts(0, 2684).saturating_mul(r.into())) + .saturating_add(Weight::from_parts(0, 2552).saturating_mul(r.into())) } - /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) - /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) - /// Storage: `System::Account` (r:1 w:0) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) - /// Storage: `Contracts::ContractInfoOf` (r:1601 w:1) + /// Storage: `Contracts::ContractInfoOf` (r:1600 w:0) /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) - /// Storage: `Contracts::CodeInfoOf` (r:1 w:0) - /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) - /// Storage: `Contracts::PristineCode` (r:1 w:0) - /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) - /// Storage: `Timestamp::Now` (r:1 w:0) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) - /// Storage: `System::EventTopics` (r:2 w:2) - /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `r` is `[0, 1600]`. fn seal_code_hash(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `921 + r * (213 ±0)` - // Estimated: `6830 + r * (2688 ±0)` - // Minimum execution time: 255_187_000 picoseconds. - Weight::from_parts(118_082_505, 6830) - // Standard Error: 6_302 - .saturating_add(Weight::from_parts(4_246_968, 0).saturating_mul(r.into())) - .saturating_add(RocksDbWeight::get().reads(8_u64)) + // Measured: `517 + r * (170 ±0)` + // Estimated: `1468 + r * (2645 ±0)` + // Minimum execution time: 9_255_000 picoseconds. + Weight::from_parts(9_406_000, 1468) + // Standard Error: 6_826 + .saturating_add(Weight::from_parts(4_205_039, 0).saturating_mul(r.into())) .saturating_add(RocksDbWeight::get().reads((1_u64).saturating_mul(r.into()))) - .saturating_add(RocksDbWeight::get().writes(3_u64)) - .saturating_add(Weight::from_parts(0, 2688).saturating_mul(r.into())) + .saturating_add(Weight::from_parts(0, 2645).saturating_mul(r.into())) } - /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) - /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) - /// Storage: `System::Account` (r:1 w:0) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) - /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) - /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) - /// Storage: `Contracts::CodeInfoOf` (r:1 w:0) - /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) - /// Storage: `Contracts::PristineCode` (r:1 w:0) - /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) - /// Storage: `Timestamp::Now` (r:1 w:0) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) - /// Storage: `System::EventTopics` (r:2 w:2) - /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `r` is `[0, 1600]`. fn seal_own_code_hash(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `873 + r * (6 ±0)` - // Estimated: `6815 + r * (6 ±0)` - // Minimum execution time: 256_833_000 picoseconds. - Weight::from_parts(273_330_216, 6815) - // Standard Error: 881 - .saturating_add(Weight::from_parts(400_105, 0).saturating_mul(r.into())) - .saturating_add(RocksDbWeight::get().reads(8_u64)) - .saturating_add(RocksDbWeight::get().writes(3_u64)) - .saturating_add(Weight::from_parts(0, 6).saturating_mul(r.into())) + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 9_388_000 picoseconds. + Weight::from_parts(9_322_209, 0) + // Standard Error: 269 + .saturating_add(Weight::from_parts(358_189, 0).saturating_mul(r.into())) } - /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) - /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) - /// Storage: `System::Account` (r:1 w:0) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) - /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) - /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) - /// Storage: `Contracts::CodeInfoOf` (r:1 w:0) - /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) - /// Storage: `Contracts::PristineCode` (r:1 w:0) - /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) - /// Storage: `Timestamp::Now` (r:1 w:0) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) - /// Storage: `System::EventTopics` (r:2 w:2) - /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `r` is `[0, 1600]`. fn seal_caller_is_origin(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `863 + r * (3 ±0)` - // Estimated: `6804 + r * (3 ±0)` - // Minimum execution time: 244_193_000 picoseconds. - Weight::from_parts(271_221_908, 6804) - // Standard Error: 442 - .saturating_add(Weight::from_parts(176_480, 0).saturating_mul(r.into())) - .saturating_add(RocksDbWeight::get().reads(8_u64)) - .saturating_add(RocksDbWeight::get().writes(3_u64)) - .saturating_add(Weight::from_parts(0, 3).saturating_mul(r.into())) + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 9_300_000 picoseconds. + Weight::from_parts(10_268_326, 0) + // Standard Error: 72 + .saturating_add(Weight::from_parts(104_650, 0).saturating_mul(r.into())) } - /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) - /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) - /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) - /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) - /// Storage: `Contracts::CodeInfoOf` (r:1 w:0) - /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) - /// Storage: `Contracts::PristineCode` (r:1 w:0) - /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) - /// Storage: `Timestamp::Now` (r:1 w:0) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) - /// Storage: `System::EventTopics` (r:2 w:2) - /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `r` is `[0, 1600]`. fn seal_caller_is_root(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `753 + r * (3 ±0)` - // Estimated: `6693 + r * (3 ±0)` - // Minimum execution time: 232_603_000 picoseconds. - Weight::from_parts(260_577_368, 6693) - // Standard Error: 365 - .saturating_add(Weight::from_parts(158_126, 0).saturating_mul(r.into())) - .saturating_add(RocksDbWeight::get().reads(7_u64)) - .saturating_add(RocksDbWeight::get().writes(3_u64)) - .saturating_add(Weight::from_parts(0, 3).saturating_mul(r.into())) + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 9_162_000 picoseconds. + Weight::from_parts(10_059_984, 0) + // Standard Error: 87 + .saturating_add(Weight::from_parts(87_627, 0).saturating_mul(r.into())) } - /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) - /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) - /// Storage: `System::Account` (r:1 w:0) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) - /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) - /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) - /// Storage: `Contracts::CodeInfoOf` (r:1 w:0) - /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) - /// Storage: `Contracts::PristineCode` (r:1 w:0) - /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) - /// Storage: `Timestamp::Now` (r:1 w:0) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) - /// Storage: `System::EventTopics` (r:2 w:2) - /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `r` is `[0, 1600]`. fn seal_address(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `867 + r * (6 ±0)` - // Estimated: `6807 + r * (6 ±0)` - // Minimum execution time: 247_564_000 picoseconds. - Weight::from_parts(275_108_914, 6807) - // Standard Error: 505 - .saturating_add(Weight::from_parts(315_065, 0).saturating_mul(r.into())) - .saturating_add(RocksDbWeight::get().reads(8_u64)) - .saturating_add(RocksDbWeight::get().writes(3_u64)) - .saturating_add(Weight::from_parts(0, 6).saturating_mul(r.into())) + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 9_193_000 picoseconds. + Weight::from_parts(10_160_715, 0) + // Standard Error: 152 + .saturating_add(Weight::from_parts(263_703, 0).saturating_mul(r.into())) } - /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) - /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) - /// Storage: `System::Account` (r:1 w:0) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) - /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) - /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) - /// Storage: `Contracts::CodeInfoOf` (r:1 w:0) - /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) - /// Storage: `Contracts::PristineCode` (r:1 w:0) - /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) - /// Storage: `Timestamp::Now` (r:1 w:0) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) - /// Storage: `System::EventTopics` (r:2 w:2) - /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `r` is `[0, 1600]`. fn seal_gas_left(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `863 + r * (6 ±0)` - // Estimated: `6806 + r * (6 ±0)` - // Minimum execution time: 258_799_000 picoseconds. - Weight::from_parts(274_338_256, 6806) - // Standard Error: 632 - .saturating_add(Weight::from_parts(355_032, 0).saturating_mul(r.into())) - .saturating_add(RocksDbWeight::get().reads(8_u64)) - .saturating_add(RocksDbWeight::get().writes(3_u64)) - .saturating_add(Weight::from_parts(0, 6).saturating_mul(r.into())) + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 9_109_000 picoseconds. + Weight::from_parts(9_766_924, 0) + // Standard Error: 212 + .saturating_add(Weight::from_parts(291_694, 0).saturating_mul(r.into())) } - /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) - /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) - /// Storage: `System::Account` (r:2 w:0) + /// Storage: `System::Account` (r:1 w:0) /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) - /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) - /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) - /// Storage: `Contracts::CodeInfoOf` (r:1 w:0) - /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) - /// Storage: `Contracts::PristineCode` (r:1 w:0) - /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) - /// Storage: `Timestamp::Now` (r:1 w:0) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) - /// Storage: `System::EventTopics` (r:2 w:2) - /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `r` is `[0, 1600]`. fn seal_balance(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `1007 + r * (6 ±0)` - // Estimated: `6931 + r * (6 ±0)` - // Minimum execution time: 253_335_000 picoseconds. - Weight::from_parts(273_013_859, 6931) - // Standard Error: 2_007 - .saturating_add(Weight::from_parts(1_540_735, 0).saturating_mul(r.into())) - .saturating_add(RocksDbWeight::get().reads(9_u64)) - .saturating_add(RocksDbWeight::get().writes(3_u64)) - .saturating_add(Weight::from_parts(0, 6).saturating_mul(r.into())) + // Measured: `140` + // Estimated: `3599` + // Minimum execution time: 9_463_000 picoseconds. + Weight::from_parts(9_541_000, 3599) + // Standard Error: 3_075 + .saturating_add(Weight::from_parts(1_606_043, 0).saturating_mul(r.into())) + .saturating_add(RocksDbWeight::get().reads(1_u64)) } - /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) - /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) - /// Storage: `System::Account` (r:1 w:0) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) - /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) - /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) - /// Storage: `Contracts::CodeInfoOf` (r:1 w:0) - /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) - /// Storage: `Contracts::PristineCode` (r:1 w:0) - /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) - /// Storage: `Timestamp::Now` (r:1 w:0) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) - /// Storage: `System::EventTopics` (r:2 w:2) - /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `r` is `[0, 1600]`. fn seal_value_transferred(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `877 + r * (6 ±0)` - // Estimated: `6823 + r * (6 ±0)` - // Minimum execution time: 252_325_000 picoseconds. - Weight::from_parts(274_733_944, 6823) - // Standard Error: 603 - .saturating_add(Weight::from_parts(314_467, 0).saturating_mul(r.into())) - .saturating_add(RocksDbWeight::get().reads(8_u64)) - .saturating_add(RocksDbWeight::get().writes(3_u64)) - .saturating_add(Weight::from_parts(0, 6).saturating_mul(r.into())) + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 9_080_000 picoseconds. + Weight::from_parts(8_121_924, 0) + // Standard Error: 198 + .saturating_add(Weight::from_parts(247_527, 0).saturating_mul(r.into())) } - /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) - /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) - /// Storage: `System::Account` (r:1 w:0) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) - /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) - /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) - /// Storage: `Contracts::CodeInfoOf` (r:1 w:0) - /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) - /// Storage: `Contracts::PristineCode` (r:1 w:0) - /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) - /// Storage: `Timestamp::Now` (r:1 w:0) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) - /// Storage: `System::EventTopics` (r:2 w:2) - /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `r` is `[0, 1600]`. fn seal_minimum_balance(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `875 + r * (6 ±0)` - // Estimated: `6816 + r * (6 ±0)` - // Minimum execution time: 250_698_000 picoseconds. - Weight::from_parts(271_707_578, 6816) - // Standard Error: 952 - .saturating_add(Weight::from_parts(318_412, 0).saturating_mul(r.into())) - .saturating_add(RocksDbWeight::get().reads(8_u64)) - .saturating_add(RocksDbWeight::get().writes(3_u64)) - .saturating_add(Weight::from_parts(0, 6).saturating_mul(r.into())) + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 9_393_000 picoseconds. + Weight::from_parts(9_999_247, 0) + // Standard Error: 169 + .saturating_add(Weight::from_parts(244_563, 0).saturating_mul(r.into())) } - /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) - /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) - /// Storage: `System::Account` (r:1 w:0) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) - /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) - /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) - /// Storage: `Contracts::CodeInfoOf` (r:1 w:0) - /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) - /// Storage: `Contracts::PristineCode` (r:1 w:0) - /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) - /// Storage: `Timestamp::Now` (r:1 w:0) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) - /// Storage: `System::EventTopics` (r:2 w:2) - /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `r` is `[0, 1600]`. fn seal_block_number(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `872 + r * (6 ±0)` - // Estimated: `6819 + r * (6 ±0)` - // Minimum execution time: 251_854_000 picoseconds. - Weight::from_parts(272_002_212, 6819) - // Standard Error: 622 - .saturating_add(Weight::from_parts(313_353, 0).saturating_mul(r.into())) - .saturating_add(RocksDbWeight::get().reads(8_u64)) - .saturating_add(RocksDbWeight::get().writes(3_u64)) - .saturating_add(Weight::from_parts(0, 6).saturating_mul(r.into())) + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 9_236_000 picoseconds. + Weight::from_parts(9_561_435, 0) + // Standard Error: 195 + .saturating_add(Weight::from_parts(239_812, 0).saturating_mul(r.into())) } - /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) - /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) - /// Storage: `System::Account` (r:1 w:0) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) - /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) - /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) - /// Storage: `Contracts::CodeInfoOf` (r:1 w:0) - /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) - /// Storage: `Contracts::PristineCode` (r:1 w:0) - /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) - /// Storage: `Timestamp::Now` (r:1 w:0) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) - /// Storage: `System::EventTopics` (r:2 w:2) - /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `r` is `[0, 1600]`. fn seal_now(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `863 + r * (6 ±0)` - // Estimated: `6804 + r * (6 ±0)` - // Minimum execution time: 252_010_000 picoseconds. - Weight::from_parts(270_387_000, 6804) - // Standard Error: 659 - .saturating_add(Weight::from_parts(325_856, 0).saturating_mul(r.into())) - .saturating_add(RocksDbWeight::get().reads(8_u64)) - .saturating_add(RocksDbWeight::get().writes(3_u64)) - .saturating_add(Weight::from_parts(0, 6).saturating_mul(r.into())) + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 9_259_000 picoseconds. + Weight::from_parts(10_353_960, 0) + // Standard Error: 216 + .saturating_add(Weight::from_parts(243_754, 0).saturating_mul(r.into())) } - /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) - /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) - /// Storage: `System::Account` (r:1 w:0) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) - /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) - /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) - /// Storage: `Contracts::CodeInfoOf` (r:1 w:0) - /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) - /// Storage: `Contracts::PristineCode` (r:1 w:0) - /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) - /// Storage: `Timestamp::Now` (r:1 w:0) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) /// Storage: `TransactionPayment::NextFeeMultiplier` (r:1 w:0) /// Proof: `TransactionPayment::NextFeeMultiplier` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `Measured`) - /// Storage: `System::EventTopics` (r:2 w:2) - /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `r` is `[0, 1600]`. fn seal_weight_to_fee(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `937 + r * (14 ±0)` - // Estimated: `6872 + r * (14 ±0)` - // Minimum execution time: 247_933_000 picoseconds. - Weight::from_parts(281_550_162, 6872) - // Standard Error: 660 - .saturating_add(Weight::from_parts(1_090_869, 0).saturating_mul(r.into())) - .saturating_add(RocksDbWeight::get().reads(9_u64)) - .saturating_add(RocksDbWeight::get().writes(3_u64)) - .saturating_add(Weight::from_parts(0, 14).saturating_mul(r.into())) - } - /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) - /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) - /// Storage: `System::Account` (r:1 w:0) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) - /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) - /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) - /// Storage: `Contracts::CodeInfoOf` (r:1 w:0) - /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) - /// Storage: `Contracts::PristineCode` (r:1 w:0) - /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) - /// Storage: `Timestamp::Now` (r:1 w:0) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) - /// Storage: `System::EventTopics` (r:2 w:2) - /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// The range of component `r` is `[0, 1600]`. - fn seal_input(r: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `865 + r * (6 ±0)` - // Estimated: `6807 + r * (6 ±0)` - // Minimum execution time: 251_158_000 picoseconds. - Weight::from_parts(274_623_152, 6807) - // Standard Error: 491 - .saturating_add(Weight::from_parts(263_916, 0).saturating_mul(r.into())) - .saturating_add(RocksDbWeight::get().reads(8_u64)) - .saturating_add(RocksDbWeight::get().writes(3_u64)) - .saturating_add(Weight::from_parts(0, 6).saturating_mul(r.into())) - } - /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) - /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) - /// Storage: `System::Account` (r:1 w:0) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) - /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) - /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) - /// Storage: `Contracts::CodeInfoOf` (r:1 w:0) - /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) - /// Storage: `Contracts::PristineCode` (r:1 w:0) - /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) - /// Storage: `Timestamp::Now` (r:1 w:0) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) - /// Storage: `System::EventTopics` (r:2 w:2) - /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// The range of component `n` is `[0, 1048576]`. - fn seal_input_per_byte(n: u32, ) -> Weight { + // Measured: `67` + // Estimated: `1552` + // Minimum execution time: 9_145_000 picoseconds. + Weight::from_parts(16_524_937, 1552) + // Standard Error: 438 + .saturating_add(Weight::from_parts(666_821, 0).saturating_mul(r.into())) + .saturating_add(RocksDbWeight::get().reads(1_u64)) + } + /// The range of component `r` is `[0, 1600]`. + fn seal_input(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `869` - // Estimated: `6809` - // Minimum execution time: 263_205_000 picoseconds. - Weight::from_parts(216_792_893, 6809) - // Standard Error: 23 - .saturating_add(Weight::from_parts(989, 0).saturating_mul(n.into())) - .saturating_add(RocksDbWeight::get().reads(8_u64)) - .saturating_add(RocksDbWeight::get().writes(3_u64)) + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 9_179_000 picoseconds. + Weight::from_parts(8_893_261, 0) + // Standard Error: 215 + .saturating_add(Weight::from_parts(175_586, 0).saturating_mul(r.into())) } /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) /// Storage: `System::Account` (r:1 w:0) /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) + /// Storage: `Parameters::Parameters` (r:3 w:0) + /// Proof: `Parameters::Parameters` (`max_values`: None, `max_size`: Some(36), added: 2511, mode: `Measured`) /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) /// Storage: `Contracts::CodeInfoOf` (r:1 w:0) @@ -2847,50 +2013,47 @@ impl WeightInfo for () { /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) /// Storage: `System::EventTopics` (r:2 w:2) /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// The range of component `n` is `[0, 1048576]`. + fn seal_input_per_byte(n: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `872` + // Estimated: `9287` + // Minimum execution time: 259_315_000 picoseconds. + Weight::from_parts(137_461_362, 9287) + // Standard Error: 18 + .saturating_add(Weight::from_parts(1_388, 0).saturating_mul(n.into())) + .saturating_add(RocksDbWeight::get().reads(11_u64)) + .saturating_add(RocksDbWeight::get().writes(3_u64)) + } /// The range of component `r` is `[0, 1]`. fn seal_return(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `853 + r * (45 ±0)` - // Estimated: `6793 + r * (45 ±0)` - // Minimum execution time: 239_663_000 picoseconds. - Weight::from_parts(266_124_565, 6793) - .saturating_add(RocksDbWeight::get().reads(8_u64)) - .saturating_add(RocksDbWeight::get().writes(3_u64)) - .saturating_add(Weight::from_parts(0, 45).saturating_mul(r.into())) + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 8_919_000 picoseconds. + Weight::from_parts(9_465_187, 0) + // Standard Error: 32_481 + .saturating_add(Weight::from_parts(992_912, 0).saturating_mul(r.into())) } - /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) - /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) - /// Storage: `System::Account` (r:1 w:0) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) - /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) - /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) - /// Storage: `Contracts::CodeInfoOf` (r:1 w:0) - /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) - /// Storage: `Contracts::PristineCode` (r:1 w:0) - /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) - /// Storage: `Timestamp::Now` (r:1 w:0) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) - /// Storage: `System::EventTopics` (r:2 w:2) - /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `n` is `[0, 1048576]`. fn seal_return_per_byte(n: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `863` - // Estimated: `6810` - // Minimum execution time: 241_763_000 picoseconds. - Weight::from_parts(266_535_552, 6810) + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 10_244_000 picoseconds. + Weight::from_parts(10_654_989, 0) // Standard Error: 0 - .saturating_add(Weight::from_parts(320, 0).saturating_mul(n.into())) - .saturating_add(RocksDbWeight::get().reads(8_u64)) - .saturating_add(RocksDbWeight::get().writes(3_u64)) + .saturating_add(Weight::from_parts(315, 0).saturating_mul(n.into())) } /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) /// Storage: `System::Account` (r:3 w:3) /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) + /// Storage: `Parameters::Parameters` (r:1 w:0) + /// Proof: `Parameters::Parameters` (`max_values`: None, `max_size`: Some(36), added: 2511, mode: `Measured`) /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) - /// Storage: `Contracts::CodeInfoOf` (r:2 w:2) + /// Storage: `Contracts::CodeInfoOf` (r:33 w:33) /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) /// Storage: `Contracts::PristineCode` (r:1 w:0) /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) @@ -2901,209 +2064,127 @@ impl WeightInfo for () { /// Storage: `System::EventTopics` (r:4 w:4) /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) /// Storage: `Balances::Holds` (r:1 w:1) - /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(157), added: 2632, mode: `Measured`) + /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(193), added: 2668, mode: `Measured`) /// Storage: `Contracts::DeletionQueue` (r:0 w:1) /// Proof: `Contracts::DeletionQueue` (`max_values`: None, `max_size`: Some(142), added: 2617, mode: `Measured`) /// The range of component `r` is `[0, 1]`. fn seal_terminate(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `2972 + r * (316 ±0)` - // Estimated: `8912 + r * (5266 ±0)` - // Minimum execution time: 265_888_000 picoseconds. - Weight::from_parts(291_232_232, 8912) - // Standard Error: 845_475 - .saturating_add(Weight::from_parts(104_398_867, 0).saturating_mul(r.into())) - .saturating_add(RocksDbWeight::get().reads(8_u64)) - .saturating_add(RocksDbWeight::get().reads((7_u64).saturating_mul(r.into()))) + // Measured: `4805 + r * (2121 ±0)` + // Estimated: `13220 + r * (81321 ±0)` + // Minimum execution time: 303_028_000 picoseconds. + Weight::from_parts(323_032_397, 13220) + // Standard Error: 848_406 + .saturating_add(Weight::from_parts(242_988_002, 0).saturating_mul(r.into())) + .saturating_add(RocksDbWeight::get().reads(11_u64)) + .saturating_add(RocksDbWeight::get().reads((36_u64).saturating_mul(r.into()))) .saturating_add(RocksDbWeight::get().writes(3_u64)) - .saturating_add(RocksDbWeight::get().writes((10_u64).saturating_mul(r.into()))) - .saturating_add(Weight::from_parts(0, 5266).saturating_mul(r.into())) + .saturating_add(RocksDbWeight::get().writes((41_u64).saturating_mul(r.into()))) + .saturating_add(Weight::from_parts(0, 81321).saturating_mul(r.into())) } - /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) - /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) - /// Storage: `System::Account` (r:1 w:0) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) - /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) - /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) - /// Storage: `Contracts::CodeInfoOf` (r:1 w:0) - /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) - /// Storage: `Contracts::PristineCode` (r:1 w:0) - /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) - /// Storage: `Timestamp::Now` (r:1 w:0) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) /// Storage: `RandomnessCollectiveFlip::RandomMaterial` (r:1 w:0) /// Proof: `RandomnessCollectiveFlip::RandomMaterial` (`max_values`: Some(1), `max_size`: Some(2594), added: 3089, mode: `Measured`) - /// Storage: `System::EventTopics` (r:2 w:2) - /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `r` is `[0, 1600]`. fn seal_random(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `944 + r * (10 ±0)` - // Estimated: `6885 + r * (10 ±0)` - // Minimum execution time: 248_500_000 picoseconds. - Weight::from_parts(282_353_053, 6885) - // Standard Error: 1_144 - .saturating_add(Weight::from_parts(1_193_841, 0).saturating_mul(r.into())) - .saturating_add(RocksDbWeight::get().reads(9_u64)) - .saturating_add(RocksDbWeight::get().writes(3_u64)) - .saturating_add(Weight::from_parts(0, 10).saturating_mul(r.into())) + // Measured: `76` + // Estimated: `1561` + // Minimum execution time: 9_227_000 picoseconds. + Weight::from_parts(14_055_283, 1561) + // Standard Error: 758 + .saturating_add(Weight::from_parts(1_104_996, 0).saturating_mul(r.into())) + .saturating_add(RocksDbWeight::get().reads(1_u64)) } - /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) - /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) - /// Storage: `System::Account` (r:1 w:0) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) - /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) - /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) - /// Storage: `Contracts::CodeInfoOf` (r:1 w:0) - /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) - /// Storage: `Contracts::PristineCode` (r:1 w:0) - /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) - /// Storage: `Timestamp::Now` (r:1 w:0) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) - /// Storage: `System::EventTopics` (r:2 w:2) - /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `r` is `[0, 1600]`. fn seal_deposit_event(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `863 + r * (10 ±0)` - // Estimated: `6805 + r * (10 ±0)` - // Minimum execution time: 248_130_000 picoseconds. - Weight::from_parts(279_583_178, 6805) - // Standard Error: 971 - .saturating_add(Weight::from_parts(1_987_941, 0).saturating_mul(r.into())) - .saturating_add(RocksDbWeight::get().reads(8_u64)) - .saturating_add(RocksDbWeight::get().writes(3_u64)) - .saturating_add(Weight::from_parts(0, 10).saturating_mul(r.into())) + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 9_483_000 picoseconds. + Weight::from_parts(20_453_059, 0) + // Standard Error: 3_271 + .saturating_add(Weight::from_parts(1_713_468, 0).saturating_mul(r.into())) } - /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) - /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) - /// Storage: `System::Account` (r:1 w:0) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) - /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) - /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) - /// Storage: `Contracts::CodeInfoOf` (r:1 w:0) - /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) - /// Storage: `Contracts::PristineCode` (r:1 w:0) - /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) - /// Storage: `Timestamp::Now` (r:1 w:0) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) - /// Storage: `System::EventTopics` (r:6 w:6) + /// Storage: `System::EventTopics` (r:4 w:4) /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `t` is `[0, 4]`. /// The range of component `n` is `[0, 16384]`. fn seal_deposit_event_per_topic_and_byte(t: u32, n: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `880 + t * (32 ±0)` - // Estimated: `6825 + t * (2508 ±0)` - // Minimum execution time: 258_594_000 picoseconds. - Weight::from_parts(276_734_422, 6825) - // Standard Error: 102_093 - .saturating_add(Weight::from_parts(2_559_383, 0).saturating_mul(t.into())) - // Standard Error: 28 - .saturating_add(Weight::from_parts(501, 0).saturating_mul(n.into())) - .saturating_add(RocksDbWeight::get().reads(8_u64)) + // Measured: `0` + // Estimated: `990 + t * (2475 ±0)` + // Minimum execution time: 23_517_000 picoseconds. + Weight::from_parts(15_543_153, 990) + // Standard Error: 13_814 + .saturating_add(Weight::from_parts(2_357_255, 0).saturating_mul(t.into())) + // Standard Error: 3 + .saturating_add(Weight::from_parts(573, 0).saturating_mul(n.into())) .saturating_add(RocksDbWeight::get().reads((1_u64).saturating_mul(t.into()))) - .saturating_add(RocksDbWeight::get().writes(3_u64)) .saturating_add(RocksDbWeight::get().writes((1_u64).saturating_mul(t.into()))) - .saturating_add(Weight::from_parts(0, 2508).saturating_mul(t.into())) + .saturating_add(Weight::from_parts(0, 2475).saturating_mul(t.into())) } - /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) - /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) - /// Storage: `System::Account` (r:1 w:0) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) - /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) - /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) - /// Storage: `Contracts::CodeInfoOf` (r:1 w:0) - /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) - /// Storage: `Contracts::PristineCode` (r:1 w:0) - /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) - /// Storage: `Timestamp::Now` (r:1 w:0) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) - /// Storage: `System::EventTopics` (r:2 w:2) - /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `r` is `[0, 1600]`. fn seal_debug_message(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `862 + r * (7 ±0)` - // Estimated: `6807 + r * (7 ±0)` - // Minimum execution time: 154_564_000 picoseconds. - Weight::from_parts(168_931_365, 6807) - // Standard Error: 349 - .saturating_add(Weight::from_parts(226_848, 0).saturating_mul(r.into())) - .saturating_add(RocksDbWeight::get().reads(8_u64)) - .saturating_add(RocksDbWeight::get().writes(3_u64)) - .saturating_add(Weight::from_parts(0, 7).saturating_mul(r.into())) + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 8_448_000 picoseconds. + Weight::from_parts(9_845_841, 0) + // Standard Error: 58 + .saturating_add(Weight::from_parts(105_442, 0).saturating_mul(r.into())) } - /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) - /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:0) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) - /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `MaxEncodedLen`) - /// Storage: `Contracts::CodeInfoOf` (r:1 w:0) - /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`) - /// Storage: `Contracts::PristineCode` (r:1 w:0) - /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `MaxEncodedLen`) - /// Storage: `Timestamp::Now` (r:1 w:0) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `MaxEncodedLen`) - /// Storage: `System::EventTopics` (r:2 w:2) - /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `i` is `[0, 1048576]`. fn seal_debug_message_per_byte(i: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `125813` - // Estimated: `131755` - // Minimum execution time: 394_382_000 picoseconds. - Weight::from_parts(376_780_500, 131755) - // Standard Error: 12 - .saturating_add(Weight::from_parts(1_026, 0).saturating_mul(i.into())) - .saturating_add(RocksDbWeight::get().reads(8_u64)) - .saturating_add(RocksDbWeight::get().writes(3_u64)) + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 10_869_000 picoseconds. + Weight::from_parts(11_024_000, 0) + // Standard Error: 8 + .saturating_add(Weight::from_parts(991, 0).saturating_mul(i.into())) } /// Storage: `Skipped::Metadata` (r:0 w:0) /// Proof: `Skipped::Metadata` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `r` is `[0, 800]`. fn seal_set_storage(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `924 + r * (292 ±0)` - // Estimated: `926 + r * (293 ±0)` - // Minimum execution time: 249_757_000 picoseconds. - Weight::from_parts(177_324_374, 926) - // Standard Error: 9_512 - .saturating_add(Weight::from_parts(6_176_717, 0).saturating_mul(r.into())) - .saturating_add(RocksDbWeight::get().reads(8_u64)) + // Measured: `108 + r * (150 ±0)` + // Estimated: `105 + r * (151 ±0)` + // Minimum execution time: 9_119_000 picoseconds. + Weight::from_parts(9_270_000, 105) + // Standard Error: 8_960 + .saturating_add(Weight::from_parts(5_215_976, 0).saturating_mul(r.into())) .saturating_add(RocksDbWeight::get().reads((1_u64).saturating_mul(r.into()))) - .saturating_add(RocksDbWeight::get().writes(3_u64)) .saturating_add(RocksDbWeight::get().writes((1_u64).saturating_mul(r.into()))) - .saturating_add(Weight::from_parts(0, 293).saturating_mul(r.into())) + .saturating_add(Weight::from_parts(0, 151).saturating_mul(r.into())) } /// Storage: `Skipped::Metadata` (r:0 w:0) /// Proof: `Skipped::Metadata` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `n` is `[0, 16384]`. fn seal_set_storage_per_new_byte(n: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `1447` - // Estimated: `1430` - // Minimum execution time: 267_564_000 picoseconds. - Weight::from_parts(328_701_080, 1430) - // Standard Error: 61 - .saturating_add(Weight::from_parts(576, 0).saturating_mul(n.into())) - .saturating_add(RocksDbWeight::get().reads(12_u64)) - .saturating_add(RocksDbWeight::get().writes(8_u64)) + // Measured: `245` + // Estimated: `245` + // Minimum execution time: 17_833_000 picoseconds. + Weight::from_parts(18_940_114, 245) + // Standard Error: 2 + .saturating_add(Weight::from_parts(316, 0).saturating_mul(n.into())) + .saturating_add(RocksDbWeight::get().reads(1_u64)) + .saturating_add(RocksDbWeight::get().writes(1_u64)) } /// Storage: `Skipped::Metadata` (r:0 w:0) /// Proof: `Skipped::Metadata` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `n` is `[0, 16384]`. fn seal_set_storage_per_old_byte(n: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `1253 + n * (1 ±0)` - // Estimated: `1253 + n * (1 ±0)` - // Minimum execution time: 266_347_000 picoseconds. - Weight::from_parts(289_824_718, 1253) - // Standard Error: 34 - .saturating_add(Weight::from_parts(184, 0).saturating_mul(n.into())) - .saturating_add(RocksDbWeight::get().reads(9_u64)) - .saturating_add(RocksDbWeight::get().writes(4_u64)) + // Measured: `248 + n * (1 ±0)` + // Estimated: `248 + n * (1 ±0)` + // Minimum execution time: 18_428_000 picoseconds. + Weight::from_parts(19_372_726, 248) + // Standard Error: 2 + .saturating_add(Weight::from_parts(85, 0).saturating_mul(n.into())) + .saturating_add(RocksDbWeight::get().reads(1_u64)) + .saturating_add(RocksDbWeight::get().writes(1_u64)) .saturating_add(Weight::from_parts(0, 1).saturating_mul(n.into())) } /// Storage: `Skipped::Metadata` (r:0 w:0) @@ -3111,31 +2192,29 @@ impl WeightInfo for () { /// The range of component `r` is `[0, 800]`. fn seal_clear_storage(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `921 + r * (288 ±0)` - // Estimated: `927 + r * (289 ±0)` - // Minimum execution time: 247_207_000 picoseconds. - Weight::from_parts(179_856_075, 927) - // Standard Error: 9_383 - .saturating_add(Weight::from_parts(6_053_198, 0).saturating_mul(r.into())) - .saturating_add(RocksDbWeight::get().reads(8_u64)) + // Measured: `108 + r * (150 ±0)` + // Estimated: `105 + r * (151 ±0)` + // Minimum execution time: 9_335_000 picoseconds. + Weight::from_parts(9_459_000, 105) + // Standard Error: 9_156 + .saturating_add(Weight::from_parts(5_166_621, 0).saturating_mul(r.into())) .saturating_add(RocksDbWeight::get().reads((1_u64).saturating_mul(r.into()))) - .saturating_add(RocksDbWeight::get().writes(3_u64)) .saturating_add(RocksDbWeight::get().writes((1_u64).saturating_mul(r.into()))) - .saturating_add(Weight::from_parts(0, 289).saturating_mul(r.into())) + .saturating_add(Weight::from_parts(0, 151).saturating_mul(r.into())) } /// Storage: `Skipped::Metadata` (r:0 w:0) /// Proof: `Skipped::Metadata` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `n` is `[0, 16384]`. fn seal_clear_storage_per_byte(n: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `1249 + n * (1 ±0)` - // Estimated: `1249 + n * (1 ±0)` - // Minimum execution time: 262_655_000 picoseconds. - Weight::from_parts(289_482_543, 1249) - // Standard Error: 35 - .saturating_add(Weight::from_parts(92, 0).saturating_mul(n.into())) - .saturating_add(RocksDbWeight::get().reads(9_u64)) - .saturating_add(RocksDbWeight::get().writes(4_u64)) + // Measured: `248 + n * (1 ±0)` + // Estimated: `248 + n * (1 ±0)` + // Minimum execution time: 18_308_000 picoseconds. + Weight::from_parts(19_421_433, 248) + // Standard Error: 2 + .saturating_add(Weight::from_parts(83, 0).saturating_mul(n.into())) + .saturating_add(RocksDbWeight::get().reads(1_u64)) + .saturating_add(RocksDbWeight::get().writes(1_u64)) .saturating_add(Weight::from_parts(0, 1).saturating_mul(n.into())) } /// Storage: `Skipped::Metadata` (r:0 w:0) @@ -3143,30 +2222,27 @@ impl WeightInfo for () { /// The range of component `r` is `[0, 800]`. fn seal_get_storage(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `921 + r * (296 ±0)` - // Estimated: `923 + r * (297 ±0)` - // Minimum execution time: 247_414_000 picoseconds. - Weight::from_parts(203_317_182, 923) - // Standard Error: 7_191 - .saturating_add(Weight::from_parts(4_925_154, 0).saturating_mul(r.into())) - .saturating_add(RocksDbWeight::get().reads(8_u64)) + // Measured: `108 + r * (150 ±0)` + // Estimated: `105 + r * (151 ±0)` + // Minimum execution time: 9_184_000 picoseconds. + Weight::from_parts(9_245_000, 105) + // Standard Error: 8_442 + .saturating_add(Weight::from_parts(4_543_991, 0).saturating_mul(r.into())) .saturating_add(RocksDbWeight::get().reads((1_u64).saturating_mul(r.into()))) - .saturating_add(RocksDbWeight::get().writes(3_u64)) - .saturating_add(Weight::from_parts(0, 297).saturating_mul(r.into())) + .saturating_add(Weight::from_parts(0, 151).saturating_mul(r.into())) } /// Storage: `Skipped::Metadata` (r:0 w:0) /// Proof: `Skipped::Metadata` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `n` is `[0, 16384]`. fn seal_get_storage_per_byte(n: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `1265 + n * (1 ±0)` - // Estimated: `1265 + n * (1 ±0)` - // Minimum execution time: 258_910_000 picoseconds. - Weight::from_parts(283_086_514, 1265) - // Standard Error: 39 - .saturating_add(Weight::from_parts(980, 0).saturating_mul(n.into())) - .saturating_add(RocksDbWeight::get().reads(9_u64)) - .saturating_add(RocksDbWeight::get().writes(3_u64)) + // Measured: `248 + n * (1 ±0)` + // Estimated: `248 + n * (1 ±0)` + // Minimum execution time: 17_194_000 picoseconds. + Weight::from_parts(19_032_094, 248) + // Standard Error: 3 + .saturating_add(Weight::from_parts(590, 0).saturating_mul(n.into())) + .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(Weight::from_parts(0, 1).saturating_mul(n.into())) } /// Storage: `Skipped::Metadata` (r:0 w:0) @@ -3174,30 +2250,27 @@ impl WeightInfo for () { /// The range of component `r` is `[0, 800]`. fn seal_contains_storage(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `932 + r * (288 ±0)` - // Estimated: `929 + r * (289 ±0)` - // Minimum execution time: 252_410_000 picoseconds. - Weight::from_parts(201_227_879, 929) - // Standard Error: 6_899 - .saturating_add(Weight::from_parts(4_774_983, 0).saturating_mul(r.into())) - .saturating_add(RocksDbWeight::get().reads(8_u64)) + // Measured: `108 + r * (150 ±0)` + // Estimated: `105 + r * (151 ±0)` + // Minimum execution time: 9_380_000 picoseconds. + Weight::from_parts(9_501_000, 105) + // Standard Error: 7_029 + .saturating_add(Weight::from_parts(4_406_690, 0).saturating_mul(r.into())) .saturating_add(RocksDbWeight::get().reads((1_u64).saturating_mul(r.into()))) - .saturating_add(RocksDbWeight::get().writes(3_u64)) - .saturating_add(Weight::from_parts(0, 289).saturating_mul(r.into())) + .saturating_add(Weight::from_parts(0, 151).saturating_mul(r.into())) } /// Storage: `Skipped::Metadata` (r:0 w:0) /// Proof: `Skipped::Metadata` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `n` is `[0, 16384]`. fn seal_contains_storage_per_byte(n: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `1252 + n * (1 ±0)` - // Estimated: `1252 + n * (1 ±0)` - // Minimum execution time: 259_053_000 picoseconds. - Weight::from_parts(283_392_084, 1252) - // Standard Error: 41 - .saturating_add(Weight::from_parts(213, 0).saturating_mul(n.into())) - .saturating_add(RocksDbWeight::get().reads(9_u64)) - .saturating_add(RocksDbWeight::get().writes(3_u64)) + // Measured: `248 + n * (1 ±0)` + // Estimated: `248 + n * (1 ±0)` + // Minimum execution time: 16_400_000 picoseconds. + Weight::from_parts(17_993_941, 248) + // Standard Error: 2 + .saturating_add(Weight::from_parts(68, 0).saturating_mul(n.into())) + .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(Weight::from_parts(0, 1).saturating_mul(n.into())) } /// Storage: `Skipped::Metadata` (r:0 w:0) @@ -3205,628 +2278,356 @@ impl WeightInfo for () { /// The range of component `r` is `[0, 800]`. fn seal_take_storage(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `914 + r * (296 ±0)` - // Estimated: `919 + r * (297 ±0)` - // Minimum execution time: 251_371_000 picoseconds. - Weight::from_parts(177_119_717, 919) - // Standard Error: 9_421 - .saturating_add(Weight::from_parts(6_226_005, 0).saturating_mul(r.into())) - .saturating_add(RocksDbWeight::get().reads(8_u64)) + // Measured: `108 + r * (150 ±0)` + // Estimated: `105 + r * (151 ±0)` + // Minimum execution time: 9_109_000 picoseconds. + Weight::from_parts(9_265_000, 105) + // Standard Error: 8_733 + .saturating_add(Weight::from_parts(5_218_811, 0).saturating_mul(r.into())) .saturating_add(RocksDbWeight::get().reads((1_u64).saturating_mul(r.into()))) - .saturating_add(RocksDbWeight::get().writes(3_u64)) .saturating_add(RocksDbWeight::get().writes((1_u64).saturating_mul(r.into()))) - .saturating_add(Weight::from_parts(0, 297).saturating_mul(r.into())) + .saturating_add(Weight::from_parts(0, 151).saturating_mul(r.into())) } /// Storage: `Skipped::Metadata` (r:0 w:0) /// Proof: `Skipped::Metadata` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `n` is `[0, 16384]`. fn seal_take_storage_per_byte(n: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `1266 + n * (1 ±0)` - // Estimated: `1266 + n * (1 ±0)` - // Minimum execution time: 263_350_000 picoseconds. - Weight::from_parts(284_323_917, 1266) - // Standard Error: 31 - .saturating_add(Weight::from_parts(921, 0).saturating_mul(n.into())) - .saturating_add(RocksDbWeight::get().reads(9_u64)) - .saturating_add(RocksDbWeight::get().writes(4_u64)) + // Measured: `248 + n * (1 ±0)` + // Estimated: `248 + n * (1 ±0)` + // Minimum execution time: 18_423_000 picoseconds. + Weight::from_parts(20_025_132, 248) + // Standard Error: 3 + .saturating_add(Weight::from_parts(628, 0).saturating_mul(n.into())) + .saturating_add(RocksDbWeight::get().reads(1_u64)) + .saturating_add(RocksDbWeight::get().writes(1_u64)) .saturating_add(Weight::from_parts(0, 1).saturating_mul(n.into())) } - /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) - /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) - /// Storage: `System::Account` (r:1602 w:1601) + /// Storage: `System::Account` (r:1601 w:1601) /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) - /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) - /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) - /// Storage: `Contracts::CodeInfoOf` (r:1 w:0) - /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) - /// Storage: `Contracts::PristineCode` (r:1 w:0) - /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) - /// Storage: `Timestamp::Now` (r:1 w:0) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) - /// Storage: `System::EventTopics` (r:2 w:2) - /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `r` is `[0, 1600]`. fn seal_transfer(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `1415 + r * (45 ±0)` - // Estimated: `7307 + r * (2520 ±0)` - // Minimum execution time: 248_701_000 picoseconds. - Weight::from_parts(17_811_969, 7307) - // Standard Error: 35_154 - .saturating_add(Weight::from_parts(31_809_738, 0).saturating_mul(r.into())) - .saturating_add(RocksDbWeight::get().reads(9_u64)) + // Measured: `770` + // Estimated: `4221 + r * (2475 ±0)` + // Minimum execution time: 9_043_000 picoseconds. + Weight::from_parts(9_176_000, 4221) + // Standard Error: 12_901 + .saturating_add(Weight::from_parts(32_297_438, 0).saturating_mul(r.into())) + .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().reads((1_u64).saturating_mul(r.into()))) - .saturating_add(RocksDbWeight::get().writes(4_u64)) + .saturating_add(RocksDbWeight::get().writes(1_u64)) .saturating_add(RocksDbWeight::get().writes((1_u64).saturating_mul(r.into()))) - .saturating_add(Weight::from_parts(0, 2520).saturating_mul(r.into())) + .saturating_add(Weight::from_parts(0, 2475).saturating_mul(r.into())) } - /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) - /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) - /// Storage: `System::Account` (r:1 w:0) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) - /// Storage: `Contracts::ContractInfoOf` (r:801 w:801) + /// Storage: `Contracts::ContractInfoOf` (r:800 w:801) /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) - /// Storage: `Contracts::CodeInfoOf` (r:2 w:0) + /// Storage: `Contracts::CodeInfoOf` (r:1 w:0) /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) - /// Storage: `Contracts::PristineCode` (r:2 w:0) + /// Storage: `Contracts::PristineCode` (r:1 w:0) /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) - /// Storage: `Timestamp::Now` (r:1 w:0) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) - /// Storage: `System::EventTopics` (r:803 w:803) + /// Storage: `System::EventTopics` (r:801 w:801) /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Parameters::Parameters` (r:2 w:0) + /// Proof: `Parameters::Parameters` (`max_values`: None, `max_size`: Some(36), added: 2511, mode: `Measured`) /// The range of component `r` is `[0, 800]`. fn seal_call(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `1260 + r * (245 ±0)` - // Estimated: `9440 + r * (2721 ±0)` - // Minimum execution time: 247_335_000 picoseconds. - Weight::from_parts(264_025_000, 9440) - // Standard Error: 121_299 - .saturating_add(Weight::from_parts(234_770_827, 0).saturating_mul(r.into())) - .saturating_add(RocksDbWeight::get().reads(11_u64)) + // Measured: `520 + r * (170 ±0)` + // Estimated: `6463 + r * (2646 ±0)` + // Minimum execution time: 9_299_000 picoseconds. + Weight::from_parts(9_427_000, 6463) + // Standard Error: 101_949 + .saturating_add(Weight::from_parts(244_143_691, 0).saturating_mul(r.into())) + .saturating_add(RocksDbWeight::get().reads(5_u64)) .saturating_add(RocksDbWeight::get().reads((2_u64).saturating_mul(r.into()))) - .saturating_add(RocksDbWeight::get().writes(4_u64)) + .saturating_add(RocksDbWeight::get().writes(2_u64)) .saturating_add(RocksDbWeight::get().writes((2_u64).saturating_mul(r.into()))) - .saturating_add(Weight::from_parts(0, 2721).saturating_mul(r.into())) + .saturating_add(Weight::from_parts(0, 2646).saturating_mul(r.into())) } - /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) - /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) - /// Storage: `System::Account` (r:1 w:0) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) - /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) - /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) - /// Storage: `Contracts::CodeInfoOf` (r:736 w:0) + /// Storage: `Contracts::CodeInfoOf` (r:735 w:0) /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) - /// Storage: `Contracts::PristineCode` (r:736 w:0) + /// Storage: `Contracts::PristineCode` (r:735 w:0) /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) - /// Storage: `Timestamp::Now` (r:1 w:0) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) - /// Storage: `System::EventTopics` (r:737 w:737) + /// Storage: `System::EventTopics` (r:736 w:736) /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Parameters::Parameters` (r:2 w:0) + /// Proof: `Parameters::Parameters` (`max_values`: None, `max_size`: Some(36), added: 2511, mode: `Measured`) + /// Storage: `Contracts::ContractInfoOf` (r:0 w:1) + /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) /// The range of component `r` is `[0, 800]`. fn seal_delegate_call(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `0 + r * (576 ±0)` - // Estimated: `6812 + r * (2637 ±3)` - // Minimum execution time: 261_011_000 picoseconds. - Weight::from_parts(264_554_000, 6812) - // Standard Error: 104_415 - .saturating_add(Weight::from_parts(231_627_084, 0).saturating_mul(r.into())) - .saturating_add(RocksDbWeight::get().reads(8_u64)) + // Measured: `0 + r * (527 ±0)` + // Estimated: `6447 + r * (2583 ±3)` + // Minimum execution time: 9_359_000 picoseconds. + Weight::from_parts(9_425_000, 6447) + // Standard Error: 193_938 + .saturating_add(Weight::from_parts(244_904_401, 0).saturating_mul(r.into())) .saturating_add(RocksDbWeight::get().reads((3_u64).saturating_mul(r.into()))) - .saturating_add(RocksDbWeight::get().writes(3_u64)) .saturating_add(RocksDbWeight::get().writes((1_u64).saturating_mul(r.into()))) - .saturating_add(Weight::from_parts(0, 2637).saturating_mul(r.into())) + .saturating_add(Weight::from_parts(0, 2583).saturating_mul(r.into())) } - /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) - /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) - /// Storage: `System::Account` (r:3 w:2) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) - /// Storage: `Contracts::ContractInfoOf` (r:2 w:2) + /// Storage: `Contracts::ContractInfoOf` (r:1 w:2) /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) - /// Storage: `Contracts::CodeInfoOf` (r:2 w:0) + /// Storage: `Contracts::CodeInfoOf` (r:1 w:0) /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) - /// Storage: `Contracts::PristineCode` (r:2 w:0) + /// Storage: `Contracts::PristineCode` (r:1 w:0) /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) - /// Storage: `Timestamp::Now` (r:1 w:0) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) - /// Storage: `System::EventTopics` (r:4 w:4) + /// Storage: `System::Account` (r:2 w:2) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) + /// Storage: `System::EventTopics` (r:2 w:2) /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Parameters::Parameters` (r:2 w:0) + /// Proof: `Parameters::Parameters` (`max_values`: None, `max_size`: Some(36), added: 2511, mode: `Measured`) /// The range of component `t` is `[0, 1]`. /// The range of component `c` is `[0, 1048576]`. fn seal_call_per_transfer_clone_byte(t: u32, c: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `1307 + t * (277 ±0)` - // Estimated: `12197 + t * (5227 ±0)` - // Minimum execution time: 445_561_000 picoseconds. - Weight::from_parts(62_287_490, 12197) - // Standard Error: 11_797_697 - .saturating_add(Weight::from_parts(357_530_529, 0).saturating_mul(t.into())) - // Standard Error: 17 - .saturating_add(Weight::from_parts(970, 0).saturating_mul(c.into())) - .saturating_add(RocksDbWeight::get().reads(13_u64)) + // Measured: `699 + t * (277 ±0)` + // Estimated: `6639 + t * (3458 ±0)` + // Minimum execution time: 214_588_000 picoseconds. + Weight::from_parts(129_214_481, 6639) + // Standard Error: 2_468_090 + .saturating_add(Weight::from_parts(32_514_739, 0).saturating_mul(t.into())) + // Standard Error: 3 + .saturating_add(Weight::from_parts(418, 0).saturating_mul(c.into())) + .saturating_add(RocksDbWeight::get().reads(7_u64)) .saturating_add(RocksDbWeight::get().reads((2_u64).saturating_mul(t.into()))) - .saturating_add(RocksDbWeight::get().writes(6_u64)) + .saturating_add(RocksDbWeight::get().writes(4_u64)) .saturating_add(RocksDbWeight::get().writes((2_u64).saturating_mul(t.into()))) - .saturating_add(Weight::from_parts(0, 5227).saturating_mul(t.into())) + .saturating_add(Weight::from_parts(0, 3458).saturating_mul(t.into())) } - /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) - /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) - /// Storage: `System::Account` (r:802 w:802) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) - /// Storage: `Contracts::ContractInfoOf` (r:801 w:801) - /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) - /// Storage: `Contracts::CodeInfoOf` (r:801 w:800) + /// Storage: `Contracts::CodeInfoOf` (r:800 w:800) /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) - /// Storage: `Contracts::PristineCode` (r:801 w:0) + /// Storage: `Contracts::PristineCode` (r:800 w:0) /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) - /// Storage: `Timestamp::Now` (r:1 w:0) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) - /// Storage: `Contracts::Nonce` (r:1 w:1) + /// Storage: `Contracts::Nonce` (r:1 w:0) /// Proof: `Contracts::Nonce` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) - /// Storage: `System::EventTopics` (r:803 w:803) + /// Storage: `Contracts::ContractInfoOf` (r:800 w:801) + /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) + /// Storage: `Parameters::Parameters` (r:2 w:0) + /// Proof: `Parameters::Parameters` (`max_values`: None, `max_size`: Some(36), added: 2511, mode: `Measured`) + /// Storage: `System::Account` (r:802 w:802) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) + /// Storage: `System::EventTopics` (r:801 w:801) /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `Balances::Holds` (r:800 w:800) - /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(157), added: 2632, mode: `Measured`) /// The range of component `r` is `[1, 800]`. fn seal_instantiate(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `1278 + r * (255 ±0)` - // Estimated: `9620 + r * (2731 ±0)` - // Minimum execution time: 621_897_000 picoseconds. - Weight::from_parts(631_687_000, 9620) - // Standard Error: 215_241 - .saturating_add(Weight::from_parts(350_527_831, 0).saturating_mul(r.into())) - .saturating_add(RocksDbWeight::get().reads(11_u64)) - .saturating_add(RocksDbWeight::get().reads((6_u64).saturating_mul(r.into()))) - .saturating_add(RocksDbWeight::get().writes(7_u64)) - .saturating_add(RocksDbWeight::get().writes((5_u64).saturating_mul(r.into()))) - .saturating_add(Weight::from_parts(0, 2731).saturating_mul(r.into())) + // Measured: `1097 + r * (188 ±0)` + // Estimated: `6990 + r * (2664 ±0)` + // Minimum execution time: 352_925_000 picoseconds. + Weight::from_parts(355_487_000, 6990) + // Standard Error: 261_528 + .saturating_add(Weight::from_parts(337_897_187, 0).saturating_mul(r.into())) + .saturating_add(RocksDbWeight::get().reads(6_u64)) + .saturating_add(RocksDbWeight::get().reads((5_u64).saturating_mul(r.into()))) + .saturating_add(RocksDbWeight::get().writes(4_u64)) + .saturating_add(RocksDbWeight::get().writes((4_u64).saturating_mul(r.into()))) + .saturating_add(Weight::from_parts(0, 2664).saturating_mul(r.into())) } - /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) - /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) - /// Storage: `System::Account` (r:3 w:3) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) - /// Storage: `Contracts::ContractInfoOf` (r:2 w:2) - /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) - /// Storage: `Contracts::CodeInfoOf` (r:2 w:1) + /// Storage: `Contracts::CodeInfoOf` (r:1 w:1) /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) - /// Storage: `Contracts::PristineCode` (r:2 w:0) + /// Storage: `Contracts::PristineCode` (r:1 w:0) /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) - /// Storage: `Timestamp::Now` (r:1 w:0) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) - /// Storage: `Contracts::Nonce` (r:1 w:1) + /// Storage: `Contracts::Nonce` (r:1 w:0) /// Proof: `Contracts::Nonce` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) - /// Storage: `System::EventTopics` (r:4 w:4) + /// Storage: `Contracts::ContractInfoOf` (r:1 w:2) + /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) + /// Storage: `Parameters::Parameters` (r:2 w:0) + /// Proof: `Parameters::Parameters` (`max_values`: None, `max_size`: Some(36), added: 2511, mode: `Measured`) + /// Storage: `System::Account` (r:3 w:3) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) + /// Storage: `System::EventTopics` (r:2 w:2) /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `Balances::Holds` (r:1 w:1) - /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(157), added: 2632, mode: `Measured`) /// The range of component `t` is `[0, 1]`. /// The range of component `i` is `[0, 983040]`. /// The range of component `s` is `[0, 983040]`. fn seal_instantiate_per_transfer_input_salt_byte(t: u32, i: u32, s: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `1303 + t * (104 ±0)` - // Estimated: `12211 + t * (2549 ±1)` - // Minimum execution time: 2_181_184_000 picoseconds. - Weight::from_parts(1_194_190_111, 12211) - // Standard Error: 11_578_766 - .saturating_add(Weight::from_parts(6_361_884, 0).saturating_mul(t.into())) - // Standard Error: 18 - .saturating_add(Weight::from_parts(1_025, 0).saturating_mul(i.into())) - // Standard Error: 18 - .saturating_add(Weight::from_parts(1_158, 0).saturating_mul(s.into())) - .saturating_add(RocksDbWeight::get().reads(16_u64)) + // Measured: `760 + t * (104 ±0)` + // Estimated: `6719 + t * (2549 ±1)` + // Minimum execution time: 1_870_832_000 picoseconds. + Weight::from_parts(949_110_245, 6719) + // Standard Error: 24 + .saturating_add(Weight::from_parts(1_084, 0).saturating_mul(i.into())) + // Standard Error: 24 + .saturating_add(Weight::from_parts(1_206, 0).saturating_mul(s.into())) + .saturating_add(RocksDbWeight::get().reads(10_u64)) .saturating_add(RocksDbWeight::get().reads((1_u64).saturating_mul(t.into()))) - .saturating_add(RocksDbWeight::get().writes(11_u64)) + .saturating_add(RocksDbWeight::get().writes(7_u64)) .saturating_add(RocksDbWeight::get().writes((1_u64).saturating_mul(t.into()))) - .saturating_add(Weight::from_parts(0, 2549).saturating_mul(t.into())) - } - /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) - /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) - /// Storage: `System::Account` (r:1 w:0) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) - /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) - /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) - /// Storage: `Contracts::CodeInfoOf` (r:1 w:0) - /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) - /// Storage: `Contracts::PristineCode` (r:1 w:0) - /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) - /// Storage: `Timestamp::Now` (r:1 w:0) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) - /// Storage: `System::EventTopics` (r:2 w:2) - /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// The range of component `r` is `[0, 1600]`. - fn seal_hash_sha2_256(r: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `862 + r * (8 ±0)` - // Estimated: `6801 + r * (8 ±0)` - // Minimum execution time: 241_609_000 picoseconds. - Weight::from_parts(268_716_874, 6801) - // Standard Error: 617 - .saturating_add(Weight::from_parts(377_753, 0).saturating_mul(r.into())) - .saturating_add(RocksDbWeight::get().reads(8_u64)) - .saturating_add(RocksDbWeight::get().writes(3_u64)) - .saturating_add(Weight::from_parts(0, 8).saturating_mul(r.into())) - } - /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) - /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) - /// Storage: `System::Account` (r:1 w:0) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) - /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) - /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) - /// Storage: `Contracts::CodeInfoOf` (r:1 w:0) - /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) - /// Storage: `Contracts::PristineCode` (r:1 w:0) - /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) - /// Storage: `Timestamp::Now` (r:1 w:0) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) - /// Storage: `System::EventTopics` (r:2 w:2) - /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) + .saturating_add(Weight::from_parts(0, 2549).saturating_mul(t.into())) + } + /// The range of component `r` is `[0, 1600]`. + fn seal_hash_sha2_256(r: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 9_142_000 picoseconds. + Weight::from_parts(9_787_220, 0) + // Standard Error: 236 + .saturating_add(Weight::from_parts(267_264, 0).saturating_mul(r.into())) + } /// The range of component `n` is `[0, 1048576]`. fn seal_hash_sha2_256_per_byte(n: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `870` - // Estimated: `6808` - // Minimum execution time: 261_296_000 picoseconds. - Weight::from_parts(255_531_654, 6808) + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 10_485_000 picoseconds. + Weight::from_parts(1_870_250, 0) // Standard Error: 1 - .saturating_add(Weight::from_parts(1_081, 0).saturating_mul(n.into())) - .saturating_add(RocksDbWeight::get().reads(8_u64)) - .saturating_add(RocksDbWeight::get().writes(3_u64)) + .saturating_add(Weight::from_parts(1_073, 0).saturating_mul(n.into())) } - /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) - /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) - /// Storage: `System::Account` (r:1 w:0) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) - /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) - /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) - /// Storage: `Contracts::CodeInfoOf` (r:1 w:0) - /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) - /// Storage: `Contracts::PristineCode` (r:1 w:0) - /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) - /// Storage: `Timestamp::Now` (r:1 w:0) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) - /// Storage: `System::EventTopics` (r:2 w:2) - /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `r` is `[0, 1600]`. fn seal_hash_keccak_256(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `864 + r * (8 ±0)` - // Estimated: `6806 + r * (8 ±0)` - // Minimum execution time: 243_583_000 picoseconds. - Weight::from_parts(270_025_058, 6806) - // Standard Error: 560 - .saturating_add(Weight::from_parts(767_519, 0).saturating_mul(r.into())) - .saturating_add(RocksDbWeight::get().reads(8_u64)) - .saturating_add(RocksDbWeight::get().writes(3_u64)) - .saturating_add(Weight::from_parts(0, 8).saturating_mul(r.into())) + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 9_005_000 picoseconds. + Weight::from_parts(8_943_937, 0) + // Standard Error: 1_385 + .saturating_add(Weight::from_parts(665_970, 0).saturating_mul(r.into())) } - /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) - /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) - /// Storage: `System::Account` (r:1 w:0) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) - /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) - /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) - /// Storage: `Contracts::CodeInfoOf` (r:1 w:0) - /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) - /// Storage: `Contracts::PristineCode` (r:1 w:0) - /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) - /// Storage: `Timestamp::Now` (r:1 w:0) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) - /// Storage: `System::EventTopics` (r:2 w:2) - /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `n` is `[0, 1048576]`. fn seal_hash_keccak_256_per_byte(n: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `872` - // Estimated: `6814` - // Minimum execution time: 253_798_000 picoseconds. - Weight::from_parts(265_542_351, 6814) - // Standard Error: 0 - .saturating_add(Weight::from_parts(3_343, 0).saturating_mul(n.into())) - .saturating_add(RocksDbWeight::get().reads(8_u64)) - .saturating_add(RocksDbWeight::get().writes(3_u64)) + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 10_965_000 picoseconds. + Weight::from_parts(11_749_746, 0) + // Standard Error: 6 + .saturating_add(Weight::from_parts(3_330, 0).saturating_mul(n.into())) } - /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) - /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) - /// Storage: `System::Account` (r:1 w:0) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) - /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) - /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) - /// Storage: `Contracts::CodeInfoOf` (r:1 w:0) - /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) - /// Storage: `Contracts::PristineCode` (r:1 w:0) - /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) - /// Storage: `Timestamp::Now` (r:1 w:0) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) - /// Storage: `System::EventTopics` (r:2 w:2) - /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `r` is `[0, 1600]`. fn seal_hash_blake2_256(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `864 + r * (8 ±0)` - // Estimated: `6808 + r * (8 ±0)` - // Minimum execution time: 247_332_000 picoseconds. - Weight::from_parts(269_183_656, 6808) - // Standard Error: 665 - .saturating_add(Weight::from_parts(443_386, 0).saturating_mul(r.into())) - .saturating_add(RocksDbWeight::get().reads(8_u64)) - .saturating_add(RocksDbWeight::get().writes(3_u64)) - .saturating_add(Weight::from_parts(0, 8).saturating_mul(r.into())) + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 10_400_000 picoseconds. + Weight::from_parts(13_857_546, 0) + // Standard Error: 246 + .saturating_add(Weight::from_parts(326_483, 0).saturating_mul(r.into())) } - /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) - /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) - /// Storage: `System::Account` (r:1 w:0) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) - /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) - /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) - /// Storage: `Contracts::CodeInfoOf` (r:1 w:0) - /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) - /// Storage: `Contracts::PristineCode` (r:1 w:0) - /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) - /// Storage: `Timestamp::Now` (r:1 w:0) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) - /// Storage: `System::EventTopics` (r:2 w:2) - /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `n` is `[0, 1048576]`. fn seal_hash_blake2_256_per_byte(n: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `872` - // Estimated: `6813` - // Minimum execution time: 250_855_000 picoseconds. - Weight::from_parts(258_752_975, 6813) - // Standard Error: 1 - .saturating_add(Weight::from_parts(1_202, 0).saturating_mul(n.into())) - .saturating_add(RocksDbWeight::get().reads(8_u64)) - .saturating_add(RocksDbWeight::get().writes(3_u64)) + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 10_064_000 picoseconds. + Weight::from_parts(1_885_873, 0) + // Standard Error: 0 + .saturating_add(Weight::from_parts(1_196, 0).saturating_mul(n.into())) } - /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) - /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) - /// Storage: `System::Account` (r:1 w:0) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) - /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) - /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) - /// Storage: `Contracts::CodeInfoOf` (r:1 w:0) - /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) - /// Storage: `Contracts::PristineCode` (r:1 w:0) - /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) - /// Storage: `Timestamp::Now` (r:1 w:0) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) - /// Storage: `System::EventTopics` (r:2 w:2) - /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `r` is `[0, 1600]`. fn seal_hash_blake2_128(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `864 + r * (8 ±0)` - // Estimated: `6805 + r * (8 ±0)` - // Minimum execution time: 240_733_000 picoseconds. - Weight::from_parts(269_134_358, 6805) - // Standard Error: 512 - .saturating_add(Weight::from_parts(440_043, 0).saturating_mul(r.into())) - .saturating_add(RocksDbWeight::get().reads(8_u64)) - .saturating_add(RocksDbWeight::get().writes(3_u64)) - .saturating_add(Weight::from_parts(0, 8).saturating_mul(r.into())) + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 9_068_000 picoseconds. + Weight::from_parts(17_169_362, 0) + // Standard Error: 1_580 + .saturating_add(Weight::from_parts(330_195, 0).saturating_mul(r.into())) } - /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) - /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) - /// Storage: `System::Account` (r:1 w:0) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) - /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) - /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) - /// Storage: `Contracts::CodeInfoOf` (r:1 w:0) - /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) - /// Storage: `Contracts::PristineCode` (r:1 w:0) - /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) - /// Storage: `Timestamp::Now` (r:1 w:0) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) - /// Storage: `System::EventTopics` (r:2 w:2) - /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `n` is `[0, 1048576]`. fn seal_hash_blake2_128_per_byte(n: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `872` - // Estimated: `6811` - // Minimum execution time: 247_377_000 picoseconds. - Weight::from_parts(261_077_322, 6811) + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 10_169_000 picoseconds. + Weight::from_parts(2_159_277, 0) // Standard Error: 0 - .saturating_add(Weight::from_parts(1_195, 0).saturating_mul(n.into())) - .saturating_add(RocksDbWeight::get().reads(8_u64)) - .saturating_add(RocksDbWeight::get().writes(3_u64)) + .saturating_add(Weight::from_parts(1_200, 0).saturating_mul(n.into())) } - /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) - /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) - /// Storage: `System::Account` (r:1 w:0) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) - /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) - /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) - /// Storage: `Contracts::CodeInfoOf` (r:1 w:0) - /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) - /// Storage: `Contracts::PristineCode` (r:1 w:0) - /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) - /// Storage: `Timestamp::Now` (r:1 w:0) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) - /// Storage: `System::EventTopics` (r:2 w:2) - /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `n` is `[0, 125697]`. fn seal_sr25519_verify_per_byte(n: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `997 + n * (1 ±0)` - // Estimated: `6934 + n * (1 ±0)` - // Minimum execution time: 307_337_000 picoseconds. - Weight::from_parts(326_710_473, 6934) + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 53_863_000 picoseconds. + Weight::from_parts(54_902_157, 0) // Standard Error: 9 - .saturating_add(Weight::from_parts(5_765, 0).saturating_mul(n.into())) - .saturating_add(RocksDbWeight::get().reads(8_u64)) - .saturating_add(RocksDbWeight::get().writes(3_u64)) - .saturating_add(Weight::from_parts(0, 1).saturating_mul(n.into())) + .saturating_add(Weight::from_parts(4_588, 0).saturating_mul(n.into())) } - /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) - /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) - /// Storage: `System::Account` (r:1 w:0) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) - /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) - /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) - /// Storage: `Contracts::CodeInfoOf` (r:1 w:0) - /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) - /// Storage: `Contracts::PristineCode` (r:1 w:0) - /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) - /// Storage: `Timestamp::Now` (r:1 w:0) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) - /// Storage: `System::EventTopics` (r:2 w:2) - /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `r` is `[0, 160]`. fn seal_sr25519_verify(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `805 + r * (112 ±0)` - // Estimated: `6748 + r * (112 ±0)` - // Minimum execution time: 245_432_000 picoseconds. - Weight::from_parts(294_206_377, 6748) - // Standard Error: 7_229 - .saturating_add(Weight::from_parts(41_480_485, 0).saturating_mul(r.into())) - .saturating_add(RocksDbWeight::get().reads(8_u64)) - .saturating_add(RocksDbWeight::get().writes(3_u64)) - .saturating_add(Weight::from_parts(0, 112).saturating_mul(r.into())) + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 9_107_000 picoseconds. + Weight::from_parts(24_115_247, 0) + // Standard Error: 7_427 + .saturating_add(Weight::from_parts(41_116_827, 0).saturating_mul(r.into())) } - /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) - /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) - /// Storage: `System::Account` (r:1 w:0) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) - /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) - /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) - /// Storage: `Contracts::CodeInfoOf` (r:1 w:0) - /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) - /// Storage: `Contracts::PristineCode` (r:1 w:0) - /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) - /// Storage: `Timestamp::Now` (r:1 w:0) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) - /// Storage: `System::EventTopics` (r:2 w:2) - /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `r` is `[0, 160]`. fn seal_ecdsa_recover(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `907 + r * (76 ±0)` - // Estimated: `6802 + r * (77 ±0)` - // Minimum execution time: 247_788_000 picoseconds. - Weight::from_parts(303_940_062, 6802) - // Standard Error: 10_671 - .saturating_add(Weight::from_parts(45_730_772, 0).saturating_mul(r.into())) - .saturating_add(RocksDbWeight::get().reads(8_u64)) - .saturating_add(RocksDbWeight::get().writes(3_u64)) - .saturating_add(Weight::from_parts(0, 77).saturating_mul(r.into())) + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 9_404_000 picoseconds. + Weight::from_parts(31_763_334, 0) + // Standard Error: 9_833 + .saturating_add(Weight::from_parts(45_529_880, 0).saturating_mul(r.into())) } - /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) - /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) - /// Storage: `System::Account` (r:1 w:0) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) - /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) - /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) - /// Storage: `Contracts::CodeInfoOf` (r:1 w:0) - /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) - /// Storage: `Contracts::PristineCode` (r:1 w:0) - /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) - /// Storage: `Timestamp::Now` (r:1 w:0) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) - /// Storage: `System::EventTopics` (r:2 w:2) - /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `r` is `[0, 160]`. fn seal_ecdsa_to_eth_address(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `877 + r * (42 ±0)` - // Estimated: `6816 + r * (42 ±0)` - // Minimum execution time: 248_825_000 picoseconds. - Weight::from_parts(286_832_225, 6816) - // Standard Error: 5_274 - .saturating_add(Weight::from_parts(11_889_262, 0).saturating_mul(r.into())) - .saturating_add(RocksDbWeight::get().reads(8_u64)) - .saturating_add(RocksDbWeight::get().writes(3_u64)) - .saturating_add(Weight::from_parts(0, 42).saturating_mul(r.into())) + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 11_409_000 picoseconds. + Weight::from_parts(15_072_835, 0) + // Standard Error: 4_591 + .saturating_add(Weight::from_parts(11_619_283, 0).saturating_mul(r.into())) } - /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) - /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) - /// Storage: `System::Account` (r:1 w:0) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) - /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) - /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) /// Storage: `Contracts::CodeInfoOf` (r:1536 w:1536) /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) - /// Storage: `Contracts::PristineCode` (r:1536 w:0) + /// Storage: `Contracts::PristineCode` (r:1535 w:0) /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) - /// Storage: `Timestamp::Now` (r:1 w:0) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) - /// Storage: `System::EventTopics` (r:1538 w:1538) + /// Storage: `Parameters::Parameters` (r:2 w:0) + /// Proof: `Parameters::Parameters` (`max_values`: None, `max_size`: Some(36), added: 2511, mode: `Measured`) + /// Storage: `System::EventTopics` (r:1537 w:1537) /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `r` is `[0, 1600]`. fn seal_set_code_hash(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `0 + r * (965 ±0)` - // Estimated: `6807 + r * (3090 ±7)` - // Minimum execution time: 244_982_000 picoseconds. - Weight::from_parts(265_297_000, 6807) - // Standard Error: 39_895 - .saturating_add(Weight::from_parts(22_435_888, 0).saturating_mul(r.into())) - .saturating_add(RocksDbWeight::get().reads(8_u64)) + // Measured: `0 + r * (926 ±0)` + // Estimated: `8969 + r * (3047 ±10)` + // Minimum execution time: 9_269_000 picoseconds. + Weight::from_parts(9_372_000, 8969) + // Standard Error: 61_354 + .saturating_add(Weight::from_parts(26_280_409, 0).saturating_mul(r.into())) .saturating_add(RocksDbWeight::get().reads((3_u64).saturating_mul(r.into()))) - .saturating_add(RocksDbWeight::get().writes(3_u64)) .saturating_add(RocksDbWeight::get().writes((2_u64).saturating_mul(r.into()))) - .saturating_add(Weight::from_parts(0, 3090).saturating_mul(r.into())) + .saturating_add(Weight::from_parts(0, 3047).saturating_mul(r.into())) } - /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) - /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) - /// Storage: `System::Account` (r:1 w:0) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) - /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) - /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) - /// Storage: `Contracts::CodeInfoOf` (r:33 w:32) + /// Storage: `Contracts::CodeInfoOf` (r:32 w:32) /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) - /// Storage: `Contracts::PristineCode` (r:1 w:0) - /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) - /// Storage: `Timestamp::Now` (r:1 w:0) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) - /// Storage: `System::EventTopics` (r:2 w:2) - /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `r` is `[0, 32]`. - fn add_delegate_dependency(r: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `928 + r * (131 ±0)` - // Estimated: `6878 + r * (2606 ±0)` - // Minimum execution time: 246_455_000 picoseconds. - Weight::from_parts(275_334_919, 6878) - // Standard Error: 20_911 - .saturating_add(Weight::from_parts(6_427_525, 0).saturating_mul(r.into())) - .saturating_add(RocksDbWeight::get().reads(8_u64)) + fn lock_delegate_dependency(r: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `274 + r * (78 ±0)` + // Estimated: `1265 + r * (2553 ±0)` + // Minimum execution time: 9_103_000 picoseconds. + Weight::from_parts(14_404_626, 1265) + // Standard Error: 9_343 + .saturating_add(Weight::from_parts(5_154_949, 0).saturating_mul(r.into())) .saturating_add(RocksDbWeight::get().reads((1_u64).saturating_mul(r.into()))) - .saturating_add(RocksDbWeight::get().writes(3_u64)) .saturating_add(RocksDbWeight::get().writes((1_u64).saturating_mul(r.into()))) - .saturating_add(Weight::from_parts(0, 2606).saturating_mul(r.into())) + .saturating_add(Weight::from_parts(0, 2553).saturating_mul(r.into())) } - /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) - /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:0) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) - /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `MaxEncodedLen`) - /// Storage: `Contracts::CodeInfoOf` (r:33 w:32) + /// Storage: `Contracts::CodeInfoOf` (r:32 w:32) /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`) - /// Storage: `Contracts::PristineCode` (r:1 w:0) - /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `MaxEncodedLen`) - /// Storage: `Timestamp::Now` (r:1 w:0) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `MaxEncodedLen`) - /// Storage: `System::EventTopics` (r:2 w:2) - /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `r` is `[0, 32]`. - fn remove_delegate_dependency(r: u32, ) -> Weight { - // Proof Size summary in bytes: - // Measured: `969 + r * (183 ±0)` - // Estimated: `129453 + r * (2568 ±0)` - // Minimum execution time: 254_472_000 picoseconds. - Weight::from_parts(280_657_909, 129453) - // Standard Error: 20_131 - .saturating_add(Weight::from_parts(5_644_006, 0).saturating_mul(r.into())) - .saturating_add(RocksDbWeight::get().reads(8_u64)) + fn unlock_delegate_dependency(r: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `275 + r * (78 ±0)` + // Estimated: `990 + r * (2568 ±0)` + // Minimum execution time: 9_219_000 picoseconds. + Weight::from_parts(14_085_456, 990) + // Standard Error: 11_206 + .saturating_add(Weight::from_parts(4_422_122, 0).saturating_mul(r.into())) .saturating_add(RocksDbWeight::get().reads((1_u64).saturating_mul(r.into()))) - .saturating_add(RocksDbWeight::get().writes(3_u64)) .saturating_add(RocksDbWeight::get().writes((1_u64).saturating_mul(r.into()))) .saturating_add(Weight::from_parts(0, 2568).saturating_mul(r.into())) } @@ -3834,6 +2635,8 @@ impl WeightInfo for () { /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) /// Storage: `System::Account` (r:1 w:0) /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) + /// Storage: `Parameters::Parameters` (r:3 w:0) + /// Proof: `Parameters::Parameters` (`max_values`: None, `max_size`: Some(36), added: 2511, mode: `Measured`) /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) /// Storage: `Contracts::CodeInfoOf` (r:1 w:0) @@ -3847,80 +2650,47 @@ impl WeightInfo for () { /// The range of component `r` is `[0, 1600]`. fn seal_reentrance_count(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `858 + r * (3 ±0)` - // Estimated: `6804 + r * (3 ±0)` - // Minimum execution time: 250_535_000 picoseconds. - Weight::from_parts(270_318_376, 6804) - // Standard Error: 386 - .saturating_add(Weight::from_parts(174_627, 0).saturating_mul(r.into())) - .saturating_add(RocksDbWeight::get().reads(8_u64)) + // Measured: `861 + r * (3 ±0)` + // Estimated: `9282 + r * (3 ±0)` + // Minimum execution time: 269_333_000 picoseconds. + Weight::from_parts(286_922_618, 9282) + // Standard Error: 443 + .saturating_add(Weight::from_parts(168_869, 0).saturating_mul(r.into())) + .saturating_add(RocksDbWeight::get().reads(11_u64)) .saturating_add(RocksDbWeight::get().writes(3_u64)) .saturating_add(Weight::from_parts(0, 3).saturating_mul(r.into())) } - /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) - /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) - /// Storage: `System::Account` (r:1 w:0) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) - /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) - /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) - /// Storage: `Contracts::CodeInfoOf` (r:1 w:0) - /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) - /// Storage: `Contracts::PristineCode` (r:1 w:0) - /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) - /// Storage: `Timestamp::Now` (r:1 w:0) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) - /// Storage: `System::EventTopics` (r:2 w:2) - /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `r` is `[0, 1600]`. fn seal_account_reentrance_count(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `2109 + r * (39 ±0)` - // Estimated: `7899 + r * (40 ±0)` - // Minimum execution time: 248_174_000 picoseconds. - Weight::from_parts(301_826_520, 7899) - // Standard Error: 801 - .saturating_add(Weight::from_parts(248_479, 0).saturating_mul(r.into())) - .saturating_add(RocksDbWeight::get().reads(8_u64)) - .saturating_add(RocksDbWeight::get().writes(3_u64)) - .saturating_add(Weight::from_parts(0, 40).saturating_mul(r.into())) + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 9_328_000 picoseconds. + Weight::from_parts(14_019_583, 0) + // Standard Error: 171 + .saturating_add(Weight::from_parts(88_751, 0).saturating_mul(r.into())) } - /// Storage: `Contracts::MigrationInProgress` (r:1 w:0) - /// Proof: `Contracts::MigrationInProgress` (`max_values`: Some(1), `max_size`: Some(1026), added: 1521, mode: `Measured`) - /// Storage: `System::Account` (r:1 w:0) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `Measured`) - /// Storage: `Contracts::ContractInfoOf` (r:1 w:1) - /// Proof: `Contracts::ContractInfoOf` (`max_values`: None, `max_size`: Some(1795), added: 4270, mode: `Measured`) - /// Storage: `Contracts::CodeInfoOf` (r:1 w:0) - /// Proof: `Contracts::CodeInfoOf` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `Measured`) - /// Storage: `Contracts::PristineCode` (r:1 w:0) - /// Proof: `Contracts::PristineCode` (`max_values`: None, `max_size`: Some(125988), added: 128463, mode: `Measured`) - /// Storage: `Timestamp::Now` (r:1 w:0) - /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) - /// Storage: `Contracts::Nonce` (r:1 w:1) + /// Storage: `Contracts::Nonce` (r:1 w:0) /// Proof: `Contracts::Nonce` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `Measured`) - /// Storage: `System::EventTopics` (r:2 w:2) - /// Proof: `System::EventTopics` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `r` is `[0, 1600]`. fn seal_instantiation_nonce(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `861 + r * (3 ±0)` - // Estimated: `6801 + r * (3 ±0)` - // Minimum execution time: 246_540_000 picoseconds. - Weight::from_parts(268_913_509, 6801) - // Standard Error: 378 - .saturating_add(Weight::from_parts(154_950, 0).saturating_mul(r.into())) - .saturating_add(RocksDbWeight::get().reads(9_u64)) - .saturating_add(RocksDbWeight::get().writes(4_u64)) - .saturating_add(Weight::from_parts(0, 3).saturating_mul(r.into())) + // Measured: `219` + // Estimated: `1704` + // Minimum execution time: 9_267_000 picoseconds. + Weight::from_parts(15_304_284, 1704) + // Standard Error: 1_219 + .saturating_add(Weight::from_parts(74_696, 0).saturating_mul(r.into())) + .saturating_add(RocksDbWeight::get().reads(1_u64)) } /// The range of component `r` is `[0, 5000]`. fn instr_i64_load_store(r: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_777_000 picoseconds. - Weight::from_parts(1_707_601, 0) - // Standard Error: 14 - .saturating_add(Weight::from_parts(15_392, 0).saturating_mul(r.into())) + // Minimum execution time: 911_000 picoseconds. + Weight::from_parts(449_666, 0) + // Standard Error: 26 + .saturating_add(Weight::from_parts(14_797, 0).saturating_mul(r.into())) } } diff --git a/substrate/frame/contracts/uapi/Cargo.toml b/substrate/frame/contracts/uapi/Cargo.toml index eb8a9c61820922ce51d4ece5ac54609e0d4fe435..d9a5ee14f0545a7481fcfd133887c74921659589 100644 --- a/substrate/frame/contracts/uapi/Cargo.toml +++ b/substrate/frame/contracts/uapi/Cargo.toml @@ -14,14 +14,17 @@ workspace = true [dependencies] paste = { version = "1.0", default-features = false } bitflags = "1.0" -scale-info = { version = "2.10.0", default-features = false, features = ["derive"], optional = true } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"], optional = true } scale = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = [ "derive", "max-encoded-len", ], optional = true } [target.'cfg(target_arch = "riscv32")'.dependencies] -polkavm-derive = '0.5.0' +polkavm-derive = { workspace = true } + +[package.metadata.docs.rs] +default-target = ["wasm32-unknown-unknown"] [features] default = ["scale"] diff --git a/substrate/frame/contracts/uapi/src/host.rs b/substrate/frame/contracts/uapi/src/host.rs index c8b9ae8b2def9e253fd6523c0ac15faf6fd36f29..459cb59bead94fc5af18fb43955621f0e72d7e75 100644 --- a/substrate/frame/contracts/uapi/src/host.rs +++ b/substrate/frame/contracts/uapi/src/host.rs @@ -93,7 +93,7 @@ pub trait HostFn { /// - `output`: A reference to the output data buffer to write the address. fn address(output: &mut &mut [u8]); - /// Adds a new delegate dependency to the contract. + /// Lock a new delegate dependency to the contract. /// /// Traps if the maximum number of delegate_dependencies is reached or if /// the delegate dependency already exists. @@ -102,10 +102,7 @@ pub trait HostFn { /// /// - `code_hash`: The code hash of the dependency. Should be decodable as an `T::Hash`. Traps /// otherwise. - #[deprecated( - note = "Unstable function. Behaviour can change without further notice. Use only for testing." - )] - fn add_delegate_dependency(code_hash: &[u8]); + fn lock_delegate_dependency(code_hash: &[u8]); /// Stores the *free* balance of the current account into the supplied buffer. /// @@ -142,6 +139,7 @@ pub trait HostFn { /// /// Equivalent to the newer [`Self::call_v2`] version but works with /// *ref_time* Weight only + #[deprecated(note = "Deprecated, use newer version instead")] fn call_v1( flags: CallFlags, callee: &[u8], @@ -178,14 +176,11 @@ pub trait HostFn { /// - [CalleeTrapped][`crate::ReturnErrorCode::CalleeTrapped] /// - [TransferFailed][`crate::ReturnErrorCode::TransferFailed] /// - [NotCallable][`crate::ReturnErrorCode::NotCallable] - #[deprecated( - note = "Unstable function. Behaviour can change without further notice. Use only for testing." - )] fn call_v2( flags: CallFlags, callee: &[u8], ref_time_limit: u64, - proof_time_limit: u64, + proof_size_limit: u64, deposit: Option<&[u8]>, value: &[u8], input_data: &[u8], @@ -480,6 +475,7 @@ pub trait HostFn { /// /// Equivalent to the newer [`Self::instantiate_v2`] version but works /// with *ref_time* Weight only. + #[deprecated(note = "Deprecated, use newer version instead")] fn instantiate_v1( code_hash: &[u8], gas: u64, @@ -524,9 +520,6 @@ pub trait HostFn { /// - [CalleeTrapped][`crate::ReturnErrorCode::CalleeTrapped] /// - [TransferFailed][`crate::ReturnErrorCode::TransferFailed] /// - [CodeNotFound][`crate::ReturnErrorCode::CodeNotFound] - #[deprecated( - note = "Unstable function. Behaviour can change without further notice. Use only for testing." - )] fn instantiate_v2( code_hash: &[u8], ref_time_limit: u64, @@ -602,10 +595,7 @@ pub trait HostFn { /// /// - `code_hash`: The code hash of the dependency. Should be decodable as an `T::Hash`. Traps /// otherwise. - #[deprecated( - note = "Unstable function. Behaviour can change without further notice. Use only for testing." - )] - fn remove_delegate_dependency(code_hash: &[u8]); + fn unlock_delegate_dependency(code_hash: &[u8]); /// Cease contract execution and save a data buffer as a result of the execution. /// @@ -792,7 +782,7 @@ pub trait HostFn { #[deprecated( note = "Unstable function. Behaviour can change without further notice. Use only for testing." )] - fn xcm_execute(msg: &[u8], output: &mut &mut [u8]) -> Result; + fn xcm_execute(msg: &[u8]) -> Result; /// Send an XCM program from the contract to the specified destination. /// This is equivalent to dispatching `pallet_xcm::send` through `call_runtime`, except that @@ -800,11 +790,10 @@ pub trait HostFn { /// /// # Parameters /// - /// - `dest`: The XCM destination, should be decodable as [VersionedMultiLocation](https://paritytech.github.io/polkadot-sdk/master/staging_xcm/enum.VersionedMultiLocation.html), + /// - `dest`: The XCM destination, should be decodable as [MultiLocation](https://paritytech.github.io/polkadot-sdk/master/staging_xcm/enum.VersionedLocation.html), /// traps otherwise. /// - `msg`: The message, should be decodable as a [VersionedXcm](https://paritytech.github.io/polkadot-sdk/master/staging_xcm/enum.VersionedXcm.html), /// traps otherwise. - /// - `output`: A reference to the output data buffer to write the [XcmHash](https://paritytech.github.io/polkadot-sdk/master/staging_xcm/v3/type.XcmHash.html) /// /// # Return /// diff --git a/substrate/frame/contracts/uapi/src/host/riscv32.rs b/substrate/frame/contracts/uapi/src/host/riscv32.rs index b1934cc469e4b5cf92d8bb861bbbe073415b1789..561ab28747df9e55d105d6db09f4776d5e453e28 100644 --- a/substrate/frame/contracts/uapi/src/host/riscv32.rs +++ b/substrate/frame/contracts/uapi/src/host/riscv32.rs @@ -130,7 +130,7 @@ impl HostFn for HostFnImpl { flags: CallFlags, callee: &[u8], ref_time_limit: u64, - proof_time_limit: u64, + proof_size_limit: u64, deposit: Option<&[u8]>, value: &[u8], input_data: &[u8], @@ -281,11 +281,11 @@ impl HostFn for HostFnImpl { todo!() } - fn add_delegate_dependency(code_hash: &[u8]) { + fn lock_delegate_dependency(code_hash: &[u8]) { todo!() } - fn remove_delegate_dependency(code_hash: &[u8]) { + fn unlock_delegate_dependency(code_hash: &[u8]) { todo!() } @@ -297,7 +297,7 @@ impl HostFn for HostFnImpl { todo!() } - fn xcm_execute(msg: &[u8], output: &mut &mut [u8]) -> Result { + fn xcm_execute(msg: &[u8]) -> Result { todo!() } diff --git a/substrate/frame/contracts/uapi/src/host/wasm32.rs b/substrate/frame/contracts/uapi/src/host/wasm32.rs index 77cf22891e2f5e325aeed102748603b6b3cb1143..cb5435bfc014ddd268b4b36c6dd86ce534be9042 100644 --- a/substrate/frame/contracts/uapi/src/host/wasm32.rs +++ b/substrate/frame/contracts/uapi/src/host/wasm32.rs @@ -23,7 +23,7 @@ mod sys { extern "C" { pub fn account_reentrance_count(account_ptr: *const u8) -> u32; - pub fn add_delegate_dependency(code_hash_ptr: *const u8); + pub fn lock_delegate_dependency(code_hash_ptr: *const u8); pub fn address(output_ptr: *mut u8, output_len_ptr: *mut u32); @@ -59,7 +59,7 @@ mod sys { pub fn caller_is_root() -> ReturnCode; - pub fn clear_storage(key_ptr: *const u8, key_len: u32) -> ReturnCode; + pub fn clear_storage(key_ptr: *const u8); pub fn code_hash( account_id_ptr: *const u8, @@ -67,7 +67,7 @@ mod sys { output_len_ptr: *mut u32, ) -> ReturnCode; - pub fn contains_storage(key_ptr: *const u8, key_len: u32) -> ReturnCode; + pub fn contains_storage(key_ptr: *const u8) -> ReturnCode; pub fn debug_message(str_ptr: *const u8, str_len: u32) -> ReturnCode; @@ -125,7 +125,7 @@ mod sys { pub fn reentrance_count() -> u32; - pub fn remove_delegate_dependency(code_hash_ptr: *const u8); + pub fn unlock_delegate_dependency(code_hash_ptr: *const u8); pub fn seal_return(flags: u32, data_ptr: *const u8, data_len: u32) -> !; @@ -160,7 +160,7 @@ mod sys { pub fn weight_to_fee(gas: u64, output_ptr: *mut u8, output_len_ptr: *mut u32); - pub fn xcm_execute(msg_ptr: *const u8, msg_len: u32, output_ptr: *mut u8) -> ReturnCode; + pub fn xcm_execute(msg_ptr: *const u8, msg_len: u32) -> ReturnCode; pub fn xcm_send( dest_ptr: *const u8, @@ -223,7 +223,7 @@ mod sys { pub fn weight_to_fee( ref_time_limit: u64, - proof_time_limit: u64, + proof_size_limit: u64, output_ptr: *mut u8, output_len_ptr: *mut u32, ); @@ -239,7 +239,7 @@ mod sys { flags: u32, callee_ptr: *const u8, ref_time_limit: u64, - proof_time_limit: u64, + proof_size_limit: u64, deposit_ptr: *const u8, transferred_value_ptr: *const u8, input_data_ptr: *const u8, @@ -251,7 +251,7 @@ mod sys { pub fn instantiate( code_hash_ptr: *const u8, ref_time_limit: u64, - proof_time_limit: u64, + proof_size_limit: u64, deposit_ptr: *const u8, value_ptr: *const u8, input_ptr: *const u8, @@ -301,6 +301,7 @@ macro_rules! impl_wrapper_for { unsafe { $( $mod )::*::$name(output.as_mut_ptr(), &mut output_len); } + extract_from_slice(output, output_len as usize) } } }; @@ -487,7 +488,7 @@ impl HostFn for HostFnImpl { flags: CallFlags, callee: &[u8], ref_time_limit: u64, - proof_time_limit: u64, + proof_size_limit: u64, deposit: Option<&[u8]>, value: &[u8], input_data: &[u8], @@ -501,7 +502,7 @@ impl HostFn for HostFnImpl { flags.bits(), callee.as_ptr(), ref_time_limit, - proof_time_limit, + proof_size_limit, deposit_ptr, value.as_ptr(), input_data.as_ptr(), @@ -598,7 +599,7 @@ impl HostFn for HostFnImpl { } fn clear_storage(key: &[u8]) { - unsafe { sys::clear_storage(key.as_ptr(), key.len() as u32) }; + unsafe { sys::clear_storage(key.as_ptr()) }; } fn clear_storage_v1(key: &[u8]) -> Option { @@ -655,7 +656,7 @@ impl HostFn for HostFnImpl { } fn contains_storage(key: &[u8]) -> Option { - let ret_code = unsafe { sys::contains_storage(key.as_ptr(), key.len() as u32) }; + let ret_code = unsafe { sys::contains_storage(key.as_ptr()) }; ret_code.into() } @@ -803,12 +804,12 @@ impl HostFn for HostFnImpl { unsafe { sys::account_reentrance_count(account.as_ptr()) } } - fn add_delegate_dependency(code_hash: &[u8]) { - unsafe { sys::add_delegate_dependency(code_hash.as_ptr()) } + fn lock_delegate_dependency(code_hash: &[u8]) { + unsafe { sys::lock_delegate_dependency(code_hash.as_ptr()) } } - fn remove_delegate_dependency(code_hash: &[u8]) { - unsafe { sys::remove_delegate_dependency(code_hash.as_ptr()) } + fn unlock_delegate_dependency(code_hash: &[u8]) { + unsafe { sys::unlock_delegate_dependency(code_hash.as_ptr()) } } fn instantiation_nonce() -> u64 { @@ -819,9 +820,8 @@ impl HostFn for HostFnImpl { unsafe { sys::reentrance_count() } } - fn xcm_execute(msg: &[u8], output: &mut &mut [u8]) -> Result { - let ret_code = - unsafe { sys::xcm_execute(msg.as_ptr(), msg.len() as _, output.as_mut_ptr()) }; + fn xcm_execute(msg: &[u8]) -> Result { + let ret_code = unsafe { sys::xcm_execute(msg.as_ptr(), msg.len() as _) }; ret_code.into() } diff --git a/substrate/frame/conviction-voting/Cargo.toml b/substrate/frame/conviction-voting/Cargo.toml index 28ef8cd32fb2b31147b23b32383991e583e8b642..ffb5122ed7f980a547e2d299f0a687641f0d9161 100644 --- a/substrate/frame/conviction-voting/Cargo.toml +++ b/substrate/frame/conviction-voting/Cargo.toml @@ -21,8 +21,8 @@ codec = { package = "parity-scale-codec", version = "3.6.1", default-features = "derive", "max-encoded-len", ] } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.195", features = ["derive"], optional = true } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +serde = { features = ["derive"], optional = true, workspace = true, default-features = true } frame-benchmarking = { path = "../benchmarking", default-features = false, optional = true } frame-support = { path = "../support", default-features = false } frame-system = { path = "../system", default-features = false } diff --git a/substrate/frame/conviction-voting/src/lib.rs b/substrate/frame/conviction-voting/src/lib.rs index 1d6fbaa38694233a6766410728bf8efec0671d0e..466fc70a619b649e4b1aade0002e506dde430a1e 100644 --- a/substrate/frame/conviction-voting/src/lib.rs +++ b/substrate/frame/conviction-voting/src/lib.rs @@ -185,7 +185,7 @@ pub mod pallet { /// The account is already delegating. AlreadyDelegating, /// The account currently has votes attached to it and the operation cannot succeed until - /// these are removed, either through `unvote` or `reap_vote`. + /// these are removed through `remove_vote`. AlreadyVoting, /// Too high a balance was provided that the account cannot afford. InsufficientFunds, @@ -231,8 +231,8 @@ pub mod pallet { /// /// The dispatch origin of this call must be _Signed_, and the signing account must either: /// - be delegating already; or - /// - have no voting activity (if there is, then it will need to be removed/consolidated - /// through `reap_vote` or `unvote`). + /// - have no voting activity (if there is, then it will need to be removed through + /// `remove_vote`). /// /// - `to`: The account whose voting the `target` account's voting power will follow. /// - `class`: The class of polls to delegate. To delegate multiple classes, multiple calls diff --git a/substrate/frame/conviction-voting/src/tests.rs b/substrate/frame/conviction-voting/src/tests.rs index b67290e7fec59d5fcac665a578fec10f7586b4f1..74baeace898b09084a20b5e8e431efb2973c149f 100644 --- a/substrate/frame/conviction-voting/src/tests.rs +++ b/substrate/frame/conviction-voting/src/tests.rs @@ -23,11 +23,7 @@ use frame_support::{ assert_noop, assert_ok, derive_impl, parameter_types, traits::{ConstU32, ConstU64, Contains, Polling, VoteTally}, }; -use sp_core::H256; -use sp_runtime::{ - traits::{BlakeTwo256, IdentityLookup}, - BuildStorage, -}; +use sp_runtime::BuildStorage; use super::*; use crate as pallet_conviction_voting; @@ -43,7 +39,7 @@ frame_support::construct_runtime!( } ); -// Test that a fitlered call can be dispatched. +// Test that a filtered call can be dispatched. pub struct BaseFilter; impl Contains for BaseFilter { fn contains(call: &RuntimeCall) -> bool { @@ -51,31 +47,10 @@ impl Contains for BaseFilter { } } -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { - type BaseCallFilter = BaseFilter; - type BlockWeights = (); - type BlockLength = (); - type DbWeight = (); - type RuntimeOrigin = RuntimeOrigin; - type Nonce = u64; - type RuntimeCall = RuntimeCall; - type Hash = H256; - type Hashing = BlakeTwo256; - type AccountId = u64; - type Lookup = IdentityLookup; type Block = Block; - type RuntimeEvent = RuntimeEvent; - type BlockHashCount = ConstU64<250>; - type Version = (); - type PalletInfo = PalletInfo; type AccountData = pallet_balances::AccountData; - type OnNewAccount = (); - type OnKilledAccount = (); - type SystemWeightInfo = (); - type SS58Prefix = (); - type OnSetCode = (); - type MaxConsumers = ConstU32<16>; } impl pallet_balances::Config for Test { diff --git a/substrate/frame/conviction-voting/src/weights.rs b/substrate/frame/conviction-voting/src/weights.rs index 225f5c2cadd6fc3d4cb1dc735cf164d92150327f..d8f3ffcb3be60f43ad4ccdb07752e74550f74877 100644 --- a/substrate/frame/conviction-voting/src/weights.rs +++ b/substrate/frame/conviction-voting/src/weights.rs @@ -15,16 +15,16 @@ // See the License for the specific language governing permissions and // limitations under the License. -//! Autogenerated weights for pallet_conviction_voting +//! Autogenerated weights for `pallet_conviction_voting` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-06-16, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-04-08, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-e8ezs4ez-project-145-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("dev"), DB CACHE: 1024 +//! HOSTNAME: `runner-anb7yjbi-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: `1024` // Executed Command: -// ./target/production/substrate +// ./target/production/substrate-node // benchmark // pallet // --chain=dev @@ -35,12 +35,11 @@ // --no-median-slopes // --no-min-squares // --extrinsic=* -// --execution=wasm // --wasm-execution=compiled // --heap-pages=4096 -// --output=./frame/conviction-voting/src/weights.rs -// --header=./HEADER-APACHE2 -// --template=./.maintain/frame-weight-template.hbs +// --output=./substrate/frame/conviction-voting/src/weights.rs +// --header=./substrate/HEADER-APACHE2 +// --template=./substrate/.maintain/frame-weight-template.hbs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -50,7 +49,7 @@ use frame_support::{traits::Get, weights::{Weight, constants::RocksDbWeight}}; use core::marker::PhantomData; -/// Weight functions needed for pallet_conviction_voting. +/// Weight functions needed for `pallet_conviction_voting`. pub trait WeightInfo { fn vote_new() -> Weight; fn vote_existing() -> Weight; @@ -61,280 +60,300 @@ pub trait WeightInfo { fn unlock() -> Weight; } -/// Weights for pallet_conviction_voting using the Substrate node and recommended hardware. +/// Weights for `pallet_conviction_voting` using the Substrate node and recommended hardware. pub struct SubstrateWeight(PhantomData); impl WeightInfo for SubstrateWeight { - /// Storage: Referenda ReferendumInfoFor (r:1 w:1) - /// Proof: Referenda ReferendumInfoFor (max_values: None, max_size: Some(366), added: 2841, mode: MaxEncodedLen) - /// Storage: ConvictionVoting VotingFor (r:1 w:1) - /// Proof: ConvictionVoting VotingFor (max_values: None, max_size: Some(27241), added: 29716, mode: MaxEncodedLen) - /// Storage: ConvictionVoting ClassLocksFor (r:1 w:1) - /// Proof: ConvictionVoting ClassLocksFor (max_values: None, max_size: Some(59), added: 2534, mode: MaxEncodedLen) - /// Storage: Balances Locks (r:1 w:1) - /// Proof: Balances Locks (max_values: None, max_size: Some(1299), added: 3774, mode: MaxEncodedLen) - /// Storage: Balances Freezes (r:1 w:0) - /// Proof: Balances Freezes (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen) - /// Storage: Scheduler Agenda (r:2 w:2) - /// Proof: Scheduler Agenda (max_values: None, max_size: Some(107022), added: 109497, mode: MaxEncodedLen) + /// Storage: `Referenda::ReferendumInfoFor` (r:1 w:1) + /// Proof: `Referenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(366), added: 2841, mode: `MaxEncodedLen`) + /// Storage: `ConvictionVoting::VotingFor` (r:1 w:1) + /// Proof: `ConvictionVoting::VotingFor` (`max_values`: None, `max_size`: Some(27241), added: 29716, mode: `MaxEncodedLen`) + /// Storage: `ConvictionVoting::ClassLocksFor` (r:1 w:1) + /// Proof: `ConvictionVoting::ClassLocksFor` (`max_values`: None, `max_size`: Some(59), added: 2534, mode: `MaxEncodedLen`) + /// Storage: `Balances::Locks` (r:1 w:1) + /// Proof: `Balances::Locks` (`max_values`: None, `max_size`: Some(1299), added: 3774, mode: `MaxEncodedLen`) + /// Storage: `Balances::Freezes` (r:1 w:0) + /// Proof: `Balances::Freezes` (`max_values`: None, `max_size`: Some(67), added: 2542, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Agenda` (r:2 w:2) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Retries` (r:0 w:1) + /// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`) fn vote_new() -> Weight { // Proof Size summary in bytes: - // Measured: `13074` + // Measured: `13141` // Estimated: `219984` - // Minimum execution time: 112_936_000 picoseconds. - Weight::from_parts(116_972_000, 219984) + // Minimum execution time: 114_422_000 picoseconds. + Weight::from_parts(118_642_000, 219984) .saturating_add(T::DbWeight::get().reads(7_u64)) - .saturating_add(T::DbWeight::get().writes(6_u64)) + .saturating_add(T::DbWeight::get().writes(7_u64)) } - /// Storage: Referenda ReferendumInfoFor (r:1 w:1) - /// Proof: Referenda ReferendumInfoFor (max_values: None, max_size: Some(366), added: 2841, mode: MaxEncodedLen) - /// Storage: ConvictionVoting VotingFor (r:1 w:1) - /// Proof: ConvictionVoting VotingFor (max_values: None, max_size: Some(27241), added: 29716, mode: MaxEncodedLen) - /// Storage: ConvictionVoting ClassLocksFor (r:1 w:1) - /// Proof: ConvictionVoting ClassLocksFor (max_values: None, max_size: Some(59), added: 2534, mode: MaxEncodedLen) - /// Storage: Balances Locks (r:1 w:1) - /// Proof: Balances Locks (max_values: None, max_size: Some(1299), added: 3774, mode: MaxEncodedLen) - /// Storage: Balances Freezes (r:1 w:0) - /// Proof: Balances Freezes (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen) - /// Storage: Scheduler Agenda (r:2 w:2) - /// Proof: Scheduler Agenda (max_values: None, max_size: Some(107022), added: 109497, mode: MaxEncodedLen) + /// Storage: `Referenda::ReferendumInfoFor` (r:1 w:1) + /// Proof: `Referenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(366), added: 2841, mode: `MaxEncodedLen`) + /// Storage: `ConvictionVoting::VotingFor` (r:1 w:1) + /// Proof: `ConvictionVoting::VotingFor` (`max_values`: None, `max_size`: Some(27241), added: 29716, mode: `MaxEncodedLen`) + /// Storage: `ConvictionVoting::ClassLocksFor` (r:1 w:1) + /// Proof: `ConvictionVoting::ClassLocksFor` (`max_values`: None, `max_size`: Some(59), added: 2534, mode: `MaxEncodedLen`) + /// Storage: `Balances::Locks` (r:1 w:1) + /// Proof: `Balances::Locks` (`max_values`: None, `max_size`: Some(1299), added: 3774, mode: `MaxEncodedLen`) + /// Storage: `Balances::Freezes` (r:1 w:0) + /// Proof: `Balances::Freezes` (`max_values`: None, `max_size`: Some(67), added: 2542, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Agenda` (r:2 w:2) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Retries` (r:0 w:1) + /// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`) fn vote_existing() -> Weight { // Proof Size summary in bytes: - // Measured: `20216` + // Measured: `20283` // Estimated: `219984` - // Minimum execution time: 291_971_000 picoseconds. - Weight::from_parts(301_738_000, 219984) + // Minimum execution time: 290_934_000 picoseconds. + Weight::from_parts(303_286_000, 219984) .saturating_add(T::DbWeight::get().reads(7_u64)) - .saturating_add(T::DbWeight::get().writes(6_u64)) + .saturating_add(T::DbWeight::get().writes(7_u64)) } - /// Storage: ConvictionVoting VotingFor (r:1 w:1) - /// Proof: ConvictionVoting VotingFor (max_values: None, max_size: Some(27241), added: 29716, mode: MaxEncodedLen) - /// Storage: Referenda ReferendumInfoFor (r:1 w:1) - /// Proof: Referenda ReferendumInfoFor (max_values: None, max_size: Some(366), added: 2841, mode: MaxEncodedLen) - /// Storage: Scheduler Agenda (r:2 w:2) - /// Proof: Scheduler Agenda (max_values: None, max_size: Some(107022), added: 109497, mode: MaxEncodedLen) + /// Storage: `ConvictionVoting::VotingFor` (r:1 w:1) + /// Proof: `ConvictionVoting::VotingFor` (`max_values`: None, `max_size`: Some(27241), added: 29716, mode: `MaxEncodedLen`) + /// Storage: `Referenda::ReferendumInfoFor` (r:1 w:1) + /// Proof: `Referenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(366), added: 2841, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Agenda` (r:2 w:2) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Retries` (r:0 w:1) + /// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`) fn remove_vote() -> Weight { // Proof Size summary in bytes: - // Measured: `19968` + // Measured: `20035` // Estimated: `219984` - // Minimum execution time: 262_582_000 picoseconds. - Weight::from_parts(270_955_000, 219984) + // Minimum execution time: 277_464_000 picoseconds. + Weight::from_parts(284_288_000, 219984) .saturating_add(T::DbWeight::get().reads(4_u64)) - .saturating_add(T::DbWeight::get().writes(4_u64)) + .saturating_add(T::DbWeight::get().writes(5_u64)) } - /// Storage: ConvictionVoting VotingFor (r:1 w:1) - /// Proof: ConvictionVoting VotingFor (max_values: None, max_size: Some(27241), added: 29716, mode: MaxEncodedLen) - /// Storage: Referenda ReferendumInfoFor (r:1 w:0) - /// Proof: Referenda ReferendumInfoFor (max_values: None, max_size: Some(366), added: 2841, mode: MaxEncodedLen) + /// Storage: `ConvictionVoting::VotingFor` (r:1 w:1) + /// Proof: `ConvictionVoting::VotingFor` (`max_values`: None, `max_size`: Some(27241), added: 29716, mode: `MaxEncodedLen`) + /// Storage: `Referenda::ReferendumInfoFor` (r:1 w:0) + /// Proof: `Referenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(366), added: 2841, mode: `MaxEncodedLen`) fn remove_other_vote() -> Weight { // Proof Size summary in bytes: - // Measured: `12675` + // Measured: `12742` // Estimated: `30706` - // Minimum execution time: 52_909_000 picoseconds. - Weight::from_parts(56_365_000, 30706) + // Minimum execution time: 54_538_000 picoseconds. + Weight::from_parts(55_758_000, 30706) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: ConvictionVoting VotingFor (r:2 w:2) - /// Proof: ConvictionVoting VotingFor (max_values: None, max_size: Some(27241), added: 29716, mode: MaxEncodedLen) - /// Storage: Referenda ReferendumInfoFor (r:1 w:1) - /// Proof: Referenda ReferendumInfoFor (max_values: None, max_size: Some(366), added: 2841, mode: MaxEncodedLen) - /// Storage: Scheduler Agenda (r:2 w:2) - /// Proof: Scheduler Agenda (max_values: None, max_size: Some(107022), added: 109497, mode: MaxEncodedLen) - /// Storage: ConvictionVoting ClassLocksFor (r:1 w:1) - /// Proof: ConvictionVoting ClassLocksFor (max_values: None, max_size: Some(59), added: 2534, mode: MaxEncodedLen) - /// Storage: Balances Locks (r:1 w:1) - /// Proof: Balances Locks (max_values: None, max_size: Some(1299), added: 3774, mode: MaxEncodedLen) - /// Storage: Balances Freezes (r:1 w:0) - /// Proof: Balances Freezes (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen) + /// Storage: `ConvictionVoting::VotingFor` (r:2 w:2) + /// Proof: `ConvictionVoting::VotingFor` (`max_values`: None, `max_size`: Some(27241), added: 29716, mode: `MaxEncodedLen`) + /// Storage: `Referenda::ReferendumInfoFor` (r:1 w:1) + /// Proof: `Referenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(366), added: 2841, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Agenda` (r:2 w:2) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`) + /// Storage: `ConvictionVoting::ClassLocksFor` (r:1 w:1) + /// Proof: `ConvictionVoting::ClassLocksFor` (`max_values`: None, `max_size`: Some(59), added: 2534, mode: `MaxEncodedLen`) + /// Storage: `Balances::Locks` (r:1 w:1) + /// Proof: `Balances::Locks` (`max_values`: None, `max_size`: Some(1299), added: 3774, mode: `MaxEncodedLen`) + /// Storage: `Balances::Freezes` (r:1 w:0) + /// Proof: `Balances::Freezes` (`max_values`: None, `max_size`: Some(67), added: 2542, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Retries` (r:0 w:1) + /// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`) /// The range of component `r` is `[0, 1]`. fn delegate(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `240 + r * (1627 ±0)` + // Measured: `306 + r * (1628 ±0)` // Estimated: `109992 + r * (109992 ±0)` - // Minimum execution time: 54_640_000 picoseconds. - Weight::from_parts(57_185_281, 109992) - // Standard Error: 193_362 - .saturating_add(Weight::from_parts(44_897_418, 0).saturating_mul(r.into())) + // Minimum execution time: 47_243_000 picoseconds. + Weight::from_parts(50_023_534, 109992) + // Standard Error: 228_993 + .saturating_add(Weight::from_parts(43_173_465, 0).saturating_mul(r.into())) .saturating_add(T::DbWeight::get().reads(5_u64)) .saturating_add(T::DbWeight::get().reads((3_u64).saturating_mul(r.into()))) .saturating_add(T::DbWeight::get().writes(4_u64)) - .saturating_add(T::DbWeight::get().writes((3_u64).saturating_mul(r.into()))) + .saturating_add(T::DbWeight::get().writes((4_u64).saturating_mul(r.into()))) .saturating_add(Weight::from_parts(0, 109992).saturating_mul(r.into())) } - /// Storage: ConvictionVoting VotingFor (r:2 w:2) - /// Proof: ConvictionVoting VotingFor (max_values: None, max_size: Some(27241), added: 29716, mode: MaxEncodedLen) - /// Storage: Referenda ReferendumInfoFor (r:1 w:1) - /// Proof: Referenda ReferendumInfoFor (max_values: None, max_size: Some(366), added: 2841, mode: MaxEncodedLen) - /// Storage: Scheduler Agenda (r:2 w:2) - /// Proof: Scheduler Agenda (max_values: None, max_size: Some(107022), added: 109497, mode: MaxEncodedLen) + /// Storage: `ConvictionVoting::VotingFor` (r:2 w:2) + /// Proof: `ConvictionVoting::VotingFor` (`max_values`: None, `max_size`: Some(27241), added: 29716, mode: `MaxEncodedLen`) + /// Storage: `Referenda::ReferendumInfoFor` (r:1 w:1) + /// Proof: `Referenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(366), added: 2841, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Agenda` (r:2 w:2) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Retries` (r:0 w:1) + /// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`) /// The range of component `r` is `[0, 1]`. fn undelegate(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `406 + r * (1376 ±0)` + // Measured: `472 + r * (1377 ±0)` // Estimated: `109992 + r * (109992 ±0)` - // Minimum execution time: 26_514_000 picoseconds. - Weight::from_parts(28_083_732, 109992) - // Standard Error: 104_905 - .saturating_add(Weight::from_parts(40_722_467, 0).saturating_mul(r.into())) + // Minimum execution time: 23_529_000 picoseconds. + Weight::from_parts(25_071_526, 109992) + // Standard Error: 138_190 + .saturating_add(Weight::from_parts(40_350_973, 0).saturating_mul(r.into())) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().reads((3_u64).saturating_mul(r.into()))) .saturating_add(T::DbWeight::get().writes(2_u64)) - .saturating_add(T::DbWeight::get().writes((3_u64).saturating_mul(r.into()))) + .saturating_add(T::DbWeight::get().writes((4_u64).saturating_mul(r.into()))) .saturating_add(Weight::from_parts(0, 109992).saturating_mul(r.into())) } - /// Storage: ConvictionVoting VotingFor (r:1 w:1) - /// Proof: ConvictionVoting VotingFor (max_values: None, max_size: Some(27241), added: 29716, mode: MaxEncodedLen) - /// Storage: ConvictionVoting ClassLocksFor (r:1 w:1) - /// Proof: ConvictionVoting ClassLocksFor (max_values: None, max_size: Some(59), added: 2534, mode: MaxEncodedLen) - /// Storage: Balances Locks (r:1 w:1) - /// Proof: Balances Locks (max_values: None, max_size: Some(1299), added: 3774, mode: MaxEncodedLen) - /// Storage: Balances Freezes (r:1 w:0) - /// Proof: Balances Freezes (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen) + /// Storage: `ConvictionVoting::VotingFor` (r:1 w:1) + /// Proof: `ConvictionVoting::VotingFor` (`max_values`: None, `max_size`: Some(27241), added: 29716, mode: `MaxEncodedLen`) + /// Storage: `ConvictionVoting::ClassLocksFor` (r:1 w:1) + /// Proof: `ConvictionVoting::ClassLocksFor` (`max_values`: None, `max_size`: Some(59), added: 2534, mode: `MaxEncodedLen`) + /// Storage: `Balances::Locks` (r:1 w:1) + /// Proof: `Balances::Locks` (`max_values`: None, `max_size`: Some(1299), added: 3774, mode: `MaxEncodedLen`) + /// Storage: `Balances::Freezes` (r:1 w:0) + /// Proof: `Balances::Freezes` (`max_values`: None, `max_size`: Some(67), added: 2542, mode: `MaxEncodedLen`) fn unlock() -> Weight { // Proof Size summary in bytes: - // Measured: `11734` + // Measured: `11800` // Estimated: `30706` - // Minimum execution time: 71_140_000 picoseconds. - Weight::from_parts(77_388_000, 30706) + // Minimum execution time: 69_473_000 picoseconds. + Weight::from_parts(71_519_000, 30706) .saturating_add(T::DbWeight::get().reads(4_u64)) .saturating_add(T::DbWeight::get().writes(3_u64)) } } -// For backwards compatibility and tests +// For backwards compatibility and tests. impl WeightInfo for () { - /// Storage: Referenda ReferendumInfoFor (r:1 w:1) - /// Proof: Referenda ReferendumInfoFor (max_values: None, max_size: Some(366), added: 2841, mode: MaxEncodedLen) - /// Storage: ConvictionVoting VotingFor (r:1 w:1) - /// Proof: ConvictionVoting VotingFor (max_values: None, max_size: Some(27241), added: 29716, mode: MaxEncodedLen) - /// Storage: ConvictionVoting ClassLocksFor (r:1 w:1) - /// Proof: ConvictionVoting ClassLocksFor (max_values: None, max_size: Some(59), added: 2534, mode: MaxEncodedLen) - /// Storage: Balances Locks (r:1 w:1) - /// Proof: Balances Locks (max_values: None, max_size: Some(1299), added: 3774, mode: MaxEncodedLen) - /// Storage: Balances Freezes (r:1 w:0) - /// Proof: Balances Freezes (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen) - /// Storage: Scheduler Agenda (r:2 w:2) - /// Proof: Scheduler Agenda (max_values: None, max_size: Some(107022), added: 109497, mode: MaxEncodedLen) + /// Storage: `Referenda::ReferendumInfoFor` (r:1 w:1) + /// Proof: `Referenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(366), added: 2841, mode: `MaxEncodedLen`) + /// Storage: `ConvictionVoting::VotingFor` (r:1 w:1) + /// Proof: `ConvictionVoting::VotingFor` (`max_values`: None, `max_size`: Some(27241), added: 29716, mode: `MaxEncodedLen`) + /// Storage: `ConvictionVoting::ClassLocksFor` (r:1 w:1) + /// Proof: `ConvictionVoting::ClassLocksFor` (`max_values`: None, `max_size`: Some(59), added: 2534, mode: `MaxEncodedLen`) + /// Storage: `Balances::Locks` (r:1 w:1) + /// Proof: `Balances::Locks` (`max_values`: None, `max_size`: Some(1299), added: 3774, mode: `MaxEncodedLen`) + /// Storage: `Balances::Freezes` (r:1 w:0) + /// Proof: `Balances::Freezes` (`max_values`: None, `max_size`: Some(67), added: 2542, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Agenda` (r:2 w:2) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Retries` (r:0 w:1) + /// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`) fn vote_new() -> Weight { // Proof Size summary in bytes: - // Measured: `13074` + // Measured: `13141` // Estimated: `219984` - // Minimum execution time: 112_936_000 picoseconds. - Weight::from_parts(116_972_000, 219984) + // Minimum execution time: 114_422_000 picoseconds. + Weight::from_parts(118_642_000, 219984) .saturating_add(RocksDbWeight::get().reads(7_u64)) - .saturating_add(RocksDbWeight::get().writes(6_u64)) + .saturating_add(RocksDbWeight::get().writes(7_u64)) } - /// Storage: Referenda ReferendumInfoFor (r:1 w:1) - /// Proof: Referenda ReferendumInfoFor (max_values: None, max_size: Some(366), added: 2841, mode: MaxEncodedLen) - /// Storage: ConvictionVoting VotingFor (r:1 w:1) - /// Proof: ConvictionVoting VotingFor (max_values: None, max_size: Some(27241), added: 29716, mode: MaxEncodedLen) - /// Storage: ConvictionVoting ClassLocksFor (r:1 w:1) - /// Proof: ConvictionVoting ClassLocksFor (max_values: None, max_size: Some(59), added: 2534, mode: MaxEncodedLen) - /// Storage: Balances Locks (r:1 w:1) - /// Proof: Balances Locks (max_values: None, max_size: Some(1299), added: 3774, mode: MaxEncodedLen) - /// Storage: Balances Freezes (r:1 w:0) - /// Proof: Balances Freezes (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen) - /// Storage: Scheduler Agenda (r:2 w:2) - /// Proof: Scheduler Agenda (max_values: None, max_size: Some(107022), added: 109497, mode: MaxEncodedLen) + /// Storage: `Referenda::ReferendumInfoFor` (r:1 w:1) + /// Proof: `Referenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(366), added: 2841, mode: `MaxEncodedLen`) + /// Storage: `ConvictionVoting::VotingFor` (r:1 w:1) + /// Proof: `ConvictionVoting::VotingFor` (`max_values`: None, `max_size`: Some(27241), added: 29716, mode: `MaxEncodedLen`) + /// Storage: `ConvictionVoting::ClassLocksFor` (r:1 w:1) + /// Proof: `ConvictionVoting::ClassLocksFor` (`max_values`: None, `max_size`: Some(59), added: 2534, mode: `MaxEncodedLen`) + /// Storage: `Balances::Locks` (r:1 w:1) + /// Proof: `Balances::Locks` (`max_values`: None, `max_size`: Some(1299), added: 3774, mode: `MaxEncodedLen`) + /// Storage: `Balances::Freezes` (r:1 w:0) + /// Proof: `Balances::Freezes` (`max_values`: None, `max_size`: Some(67), added: 2542, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Agenda` (r:2 w:2) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Retries` (r:0 w:1) + /// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`) fn vote_existing() -> Weight { // Proof Size summary in bytes: - // Measured: `20216` + // Measured: `20283` // Estimated: `219984` - // Minimum execution time: 291_971_000 picoseconds. - Weight::from_parts(301_738_000, 219984) + // Minimum execution time: 290_934_000 picoseconds. + Weight::from_parts(303_286_000, 219984) .saturating_add(RocksDbWeight::get().reads(7_u64)) - .saturating_add(RocksDbWeight::get().writes(6_u64)) + .saturating_add(RocksDbWeight::get().writes(7_u64)) } - /// Storage: ConvictionVoting VotingFor (r:1 w:1) - /// Proof: ConvictionVoting VotingFor (max_values: None, max_size: Some(27241), added: 29716, mode: MaxEncodedLen) - /// Storage: Referenda ReferendumInfoFor (r:1 w:1) - /// Proof: Referenda ReferendumInfoFor (max_values: None, max_size: Some(366), added: 2841, mode: MaxEncodedLen) - /// Storage: Scheduler Agenda (r:2 w:2) - /// Proof: Scheduler Agenda (max_values: None, max_size: Some(107022), added: 109497, mode: MaxEncodedLen) + /// Storage: `ConvictionVoting::VotingFor` (r:1 w:1) + /// Proof: `ConvictionVoting::VotingFor` (`max_values`: None, `max_size`: Some(27241), added: 29716, mode: `MaxEncodedLen`) + /// Storage: `Referenda::ReferendumInfoFor` (r:1 w:1) + /// Proof: `Referenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(366), added: 2841, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Agenda` (r:2 w:2) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Retries` (r:0 w:1) + /// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`) fn remove_vote() -> Weight { // Proof Size summary in bytes: - // Measured: `19968` + // Measured: `20035` // Estimated: `219984` - // Minimum execution time: 262_582_000 picoseconds. - Weight::from_parts(270_955_000, 219984) + // Minimum execution time: 277_464_000 picoseconds. + Weight::from_parts(284_288_000, 219984) .saturating_add(RocksDbWeight::get().reads(4_u64)) - .saturating_add(RocksDbWeight::get().writes(4_u64)) + .saturating_add(RocksDbWeight::get().writes(5_u64)) } - /// Storage: ConvictionVoting VotingFor (r:1 w:1) - /// Proof: ConvictionVoting VotingFor (max_values: None, max_size: Some(27241), added: 29716, mode: MaxEncodedLen) - /// Storage: Referenda ReferendumInfoFor (r:1 w:0) - /// Proof: Referenda ReferendumInfoFor (max_values: None, max_size: Some(366), added: 2841, mode: MaxEncodedLen) + /// Storage: `ConvictionVoting::VotingFor` (r:1 w:1) + /// Proof: `ConvictionVoting::VotingFor` (`max_values`: None, `max_size`: Some(27241), added: 29716, mode: `MaxEncodedLen`) + /// Storage: `Referenda::ReferendumInfoFor` (r:1 w:0) + /// Proof: `Referenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(366), added: 2841, mode: `MaxEncodedLen`) fn remove_other_vote() -> Weight { // Proof Size summary in bytes: - // Measured: `12675` + // Measured: `12742` // Estimated: `30706` - // Minimum execution time: 52_909_000 picoseconds. - Weight::from_parts(56_365_000, 30706) + // Minimum execution time: 54_538_000 picoseconds. + Weight::from_parts(55_758_000, 30706) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: ConvictionVoting VotingFor (r:2 w:2) - /// Proof: ConvictionVoting VotingFor (max_values: None, max_size: Some(27241), added: 29716, mode: MaxEncodedLen) - /// Storage: Referenda ReferendumInfoFor (r:1 w:1) - /// Proof: Referenda ReferendumInfoFor (max_values: None, max_size: Some(366), added: 2841, mode: MaxEncodedLen) - /// Storage: Scheduler Agenda (r:2 w:2) - /// Proof: Scheduler Agenda (max_values: None, max_size: Some(107022), added: 109497, mode: MaxEncodedLen) - /// Storage: ConvictionVoting ClassLocksFor (r:1 w:1) - /// Proof: ConvictionVoting ClassLocksFor (max_values: None, max_size: Some(59), added: 2534, mode: MaxEncodedLen) - /// Storage: Balances Locks (r:1 w:1) - /// Proof: Balances Locks (max_values: None, max_size: Some(1299), added: 3774, mode: MaxEncodedLen) - /// Storage: Balances Freezes (r:1 w:0) - /// Proof: Balances Freezes (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen) + /// Storage: `ConvictionVoting::VotingFor` (r:2 w:2) + /// Proof: `ConvictionVoting::VotingFor` (`max_values`: None, `max_size`: Some(27241), added: 29716, mode: `MaxEncodedLen`) + /// Storage: `Referenda::ReferendumInfoFor` (r:1 w:1) + /// Proof: `Referenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(366), added: 2841, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Agenda` (r:2 w:2) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`) + /// Storage: `ConvictionVoting::ClassLocksFor` (r:1 w:1) + /// Proof: `ConvictionVoting::ClassLocksFor` (`max_values`: None, `max_size`: Some(59), added: 2534, mode: `MaxEncodedLen`) + /// Storage: `Balances::Locks` (r:1 w:1) + /// Proof: `Balances::Locks` (`max_values`: None, `max_size`: Some(1299), added: 3774, mode: `MaxEncodedLen`) + /// Storage: `Balances::Freezes` (r:1 w:0) + /// Proof: `Balances::Freezes` (`max_values`: None, `max_size`: Some(67), added: 2542, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Retries` (r:0 w:1) + /// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`) /// The range of component `r` is `[0, 1]`. fn delegate(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `240 + r * (1627 ±0)` + // Measured: `306 + r * (1628 ±0)` // Estimated: `109992 + r * (109992 ±0)` - // Minimum execution time: 54_640_000 picoseconds. - Weight::from_parts(57_185_281, 109992) - // Standard Error: 193_362 - .saturating_add(Weight::from_parts(44_897_418, 0).saturating_mul(r.into())) + // Minimum execution time: 47_243_000 picoseconds. + Weight::from_parts(50_023_534, 109992) + // Standard Error: 228_993 + .saturating_add(Weight::from_parts(43_173_465, 0).saturating_mul(r.into())) .saturating_add(RocksDbWeight::get().reads(5_u64)) .saturating_add(RocksDbWeight::get().reads((3_u64).saturating_mul(r.into()))) .saturating_add(RocksDbWeight::get().writes(4_u64)) - .saturating_add(RocksDbWeight::get().writes((3_u64).saturating_mul(r.into()))) + .saturating_add(RocksDbWeight::get().writes((4_u64).saturating_mul(r.into()))) .saturating_add(Weight::from_parts(0, 109992).saturating_mul(r.into())) } - /// Storage: ConvictionVoting VotingFor (r:2 w:2) - /// Proof: ConvictionVoting VotingFor (max_values: None, max_size: Some(27241), added: 29716, mode: MaxEncodedLen) - /// Storage: Referenda ReferendumInfoFor (r:1 w:1) - /// Proof: Referenda ReferendumInfoFor (max_values: None, max_size: Some(366), added: 2841, mode: MaxEncodedLen) - /// Storage: Scheduler Agenda (r:2 w:2) - /// Proof: Scheduler Agenda (max_values: None, max_size: Some(107022), added: 109497, mode: MaxEncodedLen) + /// Storage: `ConvictionVoting::VotingFor` (r:2 w:2) + /// Proof: `ConvictionVoting::VotingFor` (`max_values`: None, `max_size`: Some(27241), added: 29716, mode: `MaxEncodedLen`) + /// Storage: `Referenda::ReferendumInfoFor` (r:1 w:1) + /// Proof: `Referenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(366), added: 2841, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Agenda` (r:2 w:2) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Retries` (r:0 w:1) + /// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`) /// The range of component `r` is `[0, 1]`. fn undelegate(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `406 + r * (1376 ±0)` + // Measured: `472 + r * (1377 ±0)` // Estimated: `109992 + r * (109992 ±0)` - // Minimum execution time: 26_514_000 picoseconds. - Weight::from_parts(28_083_732, 109992) - // Standard Error: 104_905 - .saturating_add(Weight::from_parts(40_722_467, 0).saturating_mul(r.into())) + // Minimum execution time: 23_529_000 picoseconds. + Weight::from_parts(25_071_526, 109992) + // Standard Error: 138_190 + .saturating_add(Weight::from_parts(40_350_973, 0).saturating_mul(r.into())) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().reads((3_u64).saturating_mul(r.into()))) .saturating_add(RocksDbWeight::get().writes(2_u64)) - .saturating_add(RocksDbWeight::get().writes((3_u64).saturating_mul(r.into()))) + .saturating_add(RocksDbWeight::get().writes((4_u64).saturating_mul(r.into()))) .saturating_add(Weight::from_parts(0, 109992).saturating_mul(r.into())) } - /// Storage: ConvictionVoting VotingFor (r:1 w:1) - /// Proof: ConvictionVoting VotingFor (max_values: None, max_size: Some(27241), added: 29716, mode: MaxEncodedLen) - /// Storage: ConvictionVoting ClassLocksFor (r:1 w:1) - /// Proof: ConvictionVoting ClassLocksFor (max_values: None, max_size: Some(59), added: 2534, mode: MaxEncodedLen) - /// Storage: Balances Locks (r:1 w:1) - /// Proof: Balances Locks (max_values: None, max_size: Some(1299), added: 3774, mode: MaxEncodedLen) - /// Storage: Balances Freezes (r:1 w:0) - /// Proof: Balances Freezes (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen) + /// Storage: `ConvictionVoting::VotingFor` (r:1 w:1) + /// Proof: `ConvictionVoting::VotingFor` (`max_values`: None, `max_size`: Some(27241), added: 29716, mode: `MaxEncodedLen`) + /// Storage: `ConvictionVoting::ClassLocksFor` (r:1 w:1) + /// Proof: `ConvictionVoting::ClassLocksFor` (`max_values`: None, `max_size`: Some(59), added: 2534, mode: `MaxEncodedLen`) + /// Storage: `Balances::Locks` (r:1 w:1) + /// Proof: `Balances::Locks` (`max_values`: None, `max_size`: Some(1299), added: 3774, mode: `MaxEncodedLen`) + /// Storage: `Balances::Freezes` (r:1 w:0) + /// Proof: `Balances::Freezes` (`max_values`: None, `max_size`: Some(67), added: 2542, mode: `MaxEncodedLen`) fn unlock() -> Weight { // Proof Size summary in bytes: - // Measured: `11734` + // Measured: `11800` // Estimated: `30706` - // Minimum execution time: 71_140_000 picoseconds. - Weight::from_parts(77_388_000, 30706) + // Minimum execution time: 69_473_000 picoseconds. + Weight::from_parts(71_519_000, 30706) .saturating_add(RocksDbWeight::get().reads(4_u64)) .saturating_add(RocksDbWeight::get().writes(3_u64)) } diff --git a/substrate/frame/core-fellowship/Cargo.toml b/substrate/frame/core-fellowship/Cargo.toml index 8e59725d317443f14e6a2a0c78dbcb17d001f101..b4258281b7010855bb1f81aae4bce1cd64fb774e 100644 --- a/substrate/frame/core-fellowship/Cargo.toml +++ b/substrate/frame/core-fellowship/Cargo.toml @@ -17,8 +17,8 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } -log = { version = "0.4.16", default-features = false } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +log = { workspace = true } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } frame-benchmarking = { path = "../benchmarking", default-features = false, optional = true } frame-support = { path = "../support", default-features = false } frame-system = { path = "../system", default-features = false } diff --git a/substrate/frame/core-fellowship/src/benchmarking.rs b/substrate/frame/core-fellowship/src/benchmarking.rs index ddde70bd7ce16ec1b2de7ef5899fec5a5213bb79..fd5453310be51a65dac808ee2f07737ca8915203 100644 --- a/substrate/frame/core-fellowship/src/benchmarking.rs +++ b/substrate/frame/core-fellowship/src/benchmarking.rs @@ -149,6 +149,11 @@ mod benchmarks { #[benchmark] fn promote() -> Result<(), BenchmarkError> { + // Ensure that the `min_promotion_period` wont get in our way. + let mut params = Params::::get(); + params.min_promotion_period = [Zero::zero(); RANK_COUNT]; + Params::::put(¶ms); + let member = make_member::(1)?; ensure_evidence::(&member)?; diff --git a/substrate/frame/core-fellowship/src/lib.rs b/substrate/frame/core-fellowship/src/lib.rs index e3924594321aa60c69efbdb6df61ee9f0b488205..afb188261fd448c2617189e0db71050d3d45234e 100644 --- a/substrate/frame/core-fellowship/src/lib.rs +++ b/substrate/frame/core-fellowship/src/lib.rs @@ -56,7 +56,6 @@ //! cannot be approved - they must proceed only to promotion prior to the offboard timeout elapsing. #![cfg_attr(not(feature = "std"), no_std)] -#![recursion_limit = "128"] use codec::{Decode, Encode, MaxEncodedLen}; use scale_info::TypeInfo; @@ -150,7 +149,8 @@ pub mod pallet { }; use frame_system::{ensure_root, pallet_prelude::*}; - const RANK_COUNT: usize = 9; + /// Number of available ranks. + pub(crate) const RANK_COUNT: usize = 9; #[pallet::pallet] pub struct Pallet(PhantomData<(T, I)>); diff --git a/substrate/frame/core-fellowship/src/tests/integration.rs b/substrate/frame/core-fellowship/src/tests/integration.rs index 57f9cad3dcb36335824577f2a850fbbb53013337..d3bbac158056e7edbbf1e08b255d63450fa1c5c0 100644 --- a/substrate/frame/core-fellowship/src/tests/integration.rs +++ b/substrate/frame/core-fellowship/src/tests/integration.rs @@ -27,7 +27,7 @@ use frame_system::EnsureSignedBy; use pallet_ranked_collective::{EnsureRanked, Geometric, Rank, TallyOf, Votes}; use sp_core::Get; use sp_runtime::{ - traits::{Convert, ReduceBy, TryMorphInto}, + traits::{Convert, ReduceBy, ReplaceWithDefault, TryMorphInto}, BuildStorage, DispatchError, }; type Class = Rank; @@ -51,7 +51,7 @@ parameter_types! { frame_system::limits::BlockWeights::simple_max(Weight::from_parts(1_000_000, u64::max_value())); } -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { type Block = Block; } @@ -137,12 +137,14 @@ impl pallet_ranked_collective::Config for Test { // Members can promote up to the rank of 2 below them. MapSuccess, ReduceBy>>, >; + type AddOrigin = MapSuccess>; type DemoteOrigin = EitherOf< // Root can demote arbitrarily. frame_system::EnsureRootWithSuccess>, // Members can demote up to the rank of 3 below them. MapSuccess, ReduceBy>>, >; + type RemoveOrigin = Self::DemoteOrigin; type ExchangeOrigin = EitherOf< // Root can exchange arbitrarily. frame_system::EnsureRootWithSuccess>, @@ -249,7 +251,7 @@ fn swap_exhaustive_works() { }); assert_eq!(root_add, root_swap); - // Ensure that we dont compare trivial stuff like `()` from a type error above. + // Ensure that we don't compare trivial stuff like `()` from a type error above. assert_eq!(root_add.len(), 32); }); } diff --git a/substrate/frame/core-fellowship/src/tests/unit.rs b/substrate/frame/core-fellowship/src/tests/unit.rs index 52a31e5e106f2172c1615c3052d4ede5f6bc9749..669517d61a4a963d3e021191ed3f9e561021b908 100644 --- a/substrate/frame/core-fellowship/src/tests/unit.rs +++ b/substrate/frame/core-fellowship/src/tests/unit.rs @@ -19,6 +19,7 @@ use std::collections::BTreeMap; +use core::cell::RefCell; use frame_support::{ assert_noop, assert_ok, derive_impl, ord_parameter_types, pallet_prelude::Weight, @@ -27,7 +28,6 @@ use frame_support::{ }; use frame_system::EnsureSignedBy; use sp_runtime::{traits::TryMorphInto, BuildStorage, DispatchError, DispatchResult}; -use sp_std::cell::RefCell; use crate as pallet_core_fellowship; use crate::*; @@ -47,7 +47,7 @@ parameter_types! { frame_system::limits::BlockWeights::simple_max(Weight::from_parts(1_000_000, u64::max_value())); } -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { type Block = Block; } diff --git a/substrate/frame/core-fellowship/src/weights.rs b/substrate/frame/core-fellowship/src/weights.rs index 8bbfd1a4dd81da2146994f668d722f1e8afa27b6..1e42335067a4a802942753940b2f5d6bbc5aef4f 100644 --- a/substrate/frame/core-fellowship/src/weights.rs +++ b/substrate/frame/core-fellowship/src/weights.rs @@ -15,16 +15,16 @@ // See the License for the specific language governing permissions and // limitations under the License. -//! Autogenerated weights for pallet_core_fellowship +//! Autogenerated weights for `pallet_core_fellowship` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-06-16, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-04-08, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-e8ezs4ez-project-145-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("dev"), DB CACHE: 1024 +//! HOSTNAME: `runner-anb7yjbi-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: `1024` // Executed Command: -// ./target/production/substrate +// ./target/production/substrate-node // benchmark // pallet // --chain=dev @@ -35,12 +35,11 @@ // --no-median-slopes // --no-min-squares // --extrinsic=* -// --execution=wasm // --wasm-execution=compiled // --heap-pages=4096 -// --output=./frame/core-fellowship/src/weights.rs -// --header=./HEADER-APACHE2 -// --template=./.maintain/frame-weight-template.hbs +// --output=./substrate/frame/core-fellowship/src/weights.rs +// --header=./substrate/HEADER-APACHE2 +// --template=./substrate/.maintain/frame-weight-template.hbs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -50,7 +49,7 @@ use frame_support::{traits::Get, weights::{Weight, constants::RocksDbWeight}}; use core::marker::PhantomData; -/// Weight functions needed for pallet_core_fellowship. +/// Weight functions needed for `pallet_core_fellowship`. pub trait WeightInfo { fn set_params() -> Weight; fn bump_offboard() -> Weight; @@ -64,336 +63,344 @@ pub trait WeightInfo { fn submit_evidence() -> Weight; } -/// Weights for pallet_core_fellowship using the Substrate node and recommended hardware. +/// Weights for `pallet_core_fellowship` using the Substrate node and recommended hardware. pub struct SubstrateWeight(PhantomData); impl WeightInfo for SubstrateWeight { - /// Storage: CoreFellowship Params (r:0 w:1) - /// Proof: CoreFellowship Params (max_values: Some(1), max_size: Some(364), added: 859, mode: MaxEncodedLen) + /// Storage: `CoreFellowship::Params` (r:0 w:1) + /// Proof: `CoreFellowship::Params` (`max_values`: Some(1), `max_size`: Some(364), added: 859, mode: `MaxEncodedLen`) fn set_params() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 9_454_000 picoseconds. - Weight::from_parts(9_804_000, 0) + // Minimum execution time: 6_836_000 picoseconds. + Weight::from_parts(7_057_000, 0) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: CoreFellowship Member (r:1 w:1) - /// Proof: CoreFellowship Member (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen) - /// Storage: RankedCollective Members (r:1 w:1) - /// Proof: RankedCollective Members (max_values: None, max_size: Some(42), added: 2517, mode: MaxEncodedLen) - /// Storage: CoreFellowship Params (r:1 w:0) - /// Proof: CoreFellowship Params (max_values: Some(1), max_size: Some(364), added: 859, mode: MaxEncodedLen) - /// Storage: RankedCollective MemberCount (r:1 w:1) - /// Proof: RankedCollective MemberCount (max_values: None, max_size: Some(14), added: 2489, mode: MaxEncodedLen) - /// Storage: RankedCollective IdToIndex (r:1 w:0) - /// Proof: RankedCollective IdToIndex (max_values: None, max_size: Some(54), added: 2529, mode: MaxEncodedLen) - /// Storage: CoreFellowship MemberEvidence (r:1 w:1) - /// Proof: CoreFellowship MemberEvidence (max_values: None, max_size: Some(16429), added: 18904, mode: MaxEncodedLen) + /// Storage: `CoreFellowship::Member` (r:1 w:1) + /// Proof: `CoreFellowship::Member` (`max_values`: None, `max_size`: Some(49), added: 2524, mode: `MaxEncodedLen`) + /// Storage: `RankedCollective::Members` (r:1 w:1) + /// Proof: `RankedCollective::Members` (`max_values`: None, `max_size`: Some(42), added: 2517, mode: `MaxEncodedLen`) + /// Storage: `CoreFellowship::Params` (r:1 w:0) + /// Proof: `CoreFellowship::Params` (`max_values`: Some(1), `max_size`: Some(364), added: 859, mode: `MaxEncodedLen`) + /// Storage: `RankedCollective::MemberCount` (r:1 w:1) + /// Proof: `RankedCollective::MemberCount` (`max_values`: None, `max_size`: Some(14), added: 2489, mode: `MaxEncodedLen`) + /// Storage: `RankedCollective::IdToIndex` (r:1 w:1) + /// Proof: `RankedCollective::IdToIndex` (`max_values`: None, `max_size`: Some(54), added: 2529, mode: `MaxEncodedLen`) + /// Storage: `CoreFellowship::MemberEvidence` (r:1 w:1) + /// Proof: `CoreFellowship::MemberEvidence` (`max_values`: None, `max_size`: Some(16429), added: 18904, mode: `MaxEncodedLen`) + /// Storage: `RankedCollective::IndexToId` (r:0 w:1) + /// Proof: `RankedCollective::IndexToId` (`max_values`: None, `max_size`: Some(54), added: 2529, mode: `MaxEncodedLen`) fn bump_offboard() -> Weight { // Proof Size summary in bytes: - // Measured: `16887` + // Measured: `17274` // Estimated: `19894` - // Minimum execution time: 58_489_000 picoseconds. - Weight::from_parts(60_202_000, 19894) + // Minimum execution time: 55_535_000 picoseconds. + Weight::from_parts(57_104_000, 19894) .saturating_add(T::DbWeight::get().reads(6_u64)) - .saturating_add(T::DbWeight::get().writes(4_u64)) + .saturating_add(T::DbWeight::get().writes(6_u64)) } - /// Storage: CoreFellowship Member (r:1 w:1) - /// Proof: CoreFellowship Member (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen) - /// Storage: RankedCollective Members (r:1 w:1) - /// Proof: RankedCollective Members (max_values: None, max_size: Some(42), added: 2517, mode: MaxEncodedLen) - /// Storage: CoreFellowship Params (r:1 w:0) - /// Proof: CoreFellowship Params (max_values: Some(1), max_size: Some(364), added: 859, mode: MaxEncodedLen) - /// Storage: RankedCollective MemberCount (r:1 w:1) - /// Proof: RankedCollective MemberCount (max_values: None, max_size: Some(14), added: 2489, mode: MaxEncodedLen) - /// Storage: RankedCollective IdToIndex (r:1 w:0) - /// Proof: RankedCollective IdToIndex (max_values: None, max_size: Some(54), added: 2529, mode: MaxEncodedLen) - /// Storage: CoreFellowship MemberEvidence (r:1 w:1) - /// Proof: CoreFellowship MemberEvidence (max_values: None, max_size: Some(16429), added: 18904, mode: MaxEncodedLen) + /// Storage: `CoreFellowship::Member` (r:1 w:1) + /// Proof: `CoreFellowship::Member` (`max_values`: None, `max_size`: Some(49), added: 2524, mode: `MaxEncodedLen`) + /// Storage: `RankedCollective::Members` (r:1 w:1) + /// Proof: `RankedCollective::Members` (`max_values`: None, `max_size`: Some(42), added: 2517, mode: `MaxEncodedLen`) + /// Storage: `CoreFellowship::Params` (r:1 w:0) + /// Proof: `CoreFellowship::Params` (`max_values`: Some(1), `max_size`: Some(364), added: 859, mode: `MaxEncodedLen`) + /// Storage: `RankedCollective::MemberCount` (r:1 w:1) + /// Proof: `RankedCollective::MemberCount` (`max_values`: None, `max_size`: Some(14), added: 2489, mode: `MaxEncodedLen`) + /// Storage: `RankedCollective::IdToIndex` (r:1 w:1) + /// Proof: `RankedCollective::IdToIndex` (`max_values`: None, `max_size`: Some(54), added: 2529, mode: `MaxEncodedLen`) + /// Storage: `CoreFellowship::MemberEvidence` (r:1 w:1) + /// Proof: `CoreFellowship::MemberEvidence` (`max_values`: None, `max_size`: Some(16429), added: 18904, mode: `MaxEncodedLen`) + /// Storage: `RankedCollective::IndexToId` (r:0 w:1) + /// Proof: `RankedCollective::IndexToId` (`max_values`: None, `max_size`: Some(54), added: 2529, mode: `MaxEncodedLen`) fn bump_demote() -> Weight { // Proof Size summary in bytes: - // Measured: `16997` + // Measured: `17384` // Estimated: `19894` - // Minimum execution time: 60_605_000 picoseconds. - Weight::from_parts(63_957_000, 19894) + // Minimum execution time: 59_111_000 picoseconds. + Weight::from_parts(61_394_000, 19894) .saturating_add(T::DbWeight::get().reads(6_u64)) - .saturating_add(T::DbWeight::get().writes(4_u64)) + .saturating_add(T::DbWeight::get().writes(6_u64)) } - /// Storage: RankedCollective Members (r:1 w:0) - /// Proof: RankedCollective Members (max_values: None, max_size: Some(42), added: 2517, mode: MaxEncodedLen) - /// Storage: CoreFellowship Member (r:1 w:1) - /// Proof: CoreFellowship Member (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen) + /// Storage: `RankedCollective::Members` (r:1 w:0) + /// Proof: `RankedCollective::Members` (`max_values`: None, `max_size`: Some(42), added: 2517, mode: `MaxEncodedLen`) + /// Storage: `CoreFellowship::Member` (r:1 w:1) + /// Proof: `CoreFellowship::Member` (`max_values`: None, `max_size`: Some(49), added: 2524, mode: `MaxEncodedLen`) fn set_active() -> Weight { // Proof Size summary in bytes: // Measured: `388` // Estimated: `3514` - // Minimum execution time: 17_816_000 picoseconds. - Weight::from_parts(18_524_000, 3514) + // Minimum execution time: 16_166_000 picoseconds. + Weight::from_parts(16_773_000, 3514) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: CoreFellowship Member (r:1 w:1) - /// Proof: CoreFellowship Member (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen) - /// Storage: RankedCollective Members (r:1 w:1) - /// Proof: RankedCollective Members (max_values: None, max_size: Some(42), added: 2517, mode: MaxEncodedLen) - /// Storage: RankedCollective MemberCount (r:1 w:1) - /// Proof: RankedCollective MemberCount (max_values: None, max_size: Some(14), added: 2489, mode: MaxEncodedLen) - /// Storage: RankedCollective IndexToId (r:0 w:1) - /// Proof: RankedCollective IndexToId (max_values: None, max_size: Some(54), added: 2529, mode: MaxEncodedLen) - /// Storage: RankedCollective IdToIndex (r:0 w:1) - /// Proof: RankedCollective IdToIndex (max_values: None, max_size: Some(54), added: 2529, mode: MaxEncodedLen) + /// Storage: `CoreFellowship::Member` (r:1 w:1) + /// Proof: `CoreFellowship::Member` (`max_values`: None, `max_size`: Some(49), added: 2524, mode: `MaxEncodedLen`) + /// Storage: `RankedCollective::Members` (r:1 w:1) + /// Proof: `RankedCollective::Members` (`max_values`: None, `max_size`: Some(42), added: 2517, mode: `MaxEncodedLen`) + /// Storage: `RankedCollective::MemberCount` (r:1 w:1) + /// Proof: `RankedCollective::MemberCount` (`max_values`: None, `max_size`: Some(14), added: 2489, mode: `MaxEncodedLen`) + /// Storage: `RankedCollective::IndexToId` (r:0 w:1) + /// Proof: `RankedCollective::IndexToId` (`max_values`: None, `max_size`: Some(54), added: 2529, mode: `MaxEncodedLen`) + /// Storage: `RankedCollective::IdToIndex` (r:0 w:1) + /// Proof: `RankedCollective::IdToIndex` (`max_values`: None, `max_size`: Some(54), added: 2529, mode: `MaxEncodedLen`) fn induct() -> Weight { // Proof Size summary in bytes: // Measured: `146` // Estimated: `3514` - // Minimum execution time: 27_249_000 picoseconds. - Weight::from_parts(28_049_000, 3514) + // Minimum execution time: 25_508_000 picoseconds. + Weight::from_parts(25_952_000, 3514) .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(5_u64)) } - /// Storage: RankedCollective Members (r:1 w:1) - /// Proof: RankedCollective Members (max_values: None, max_size: Some(42), added: 2517, mode: MaxEncodedLen) - /// Storage: CoreFellowship Member (r:1 w:1) - /// Proof: CoreFellowship Member (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen) - /// Storage: CoreFellowship Params (r:1 w:0) - /// Proof: CoreFellowship Params (max_values: Some(1), max_size: Some(364), added: 859, mode: MaxEncodedLen) - /// Storage: RankedCollective MemberCount (r:1 w:1) - /// Proof: RankedCollective MemberCount (max_values: None, max_size: Some(14), added: 2489, mode: MaxEncodedLen) - /// Storage: CoreFellowship MemberEvidence (r:1 w:1) - /// Proof: CoreFellowship MemberEvidence (max_values: None, max_size: Some(16429), added: 18904, mode: MaxEncodedLen) - /// Storage: RankedCollective IndexToId (r:0 w:1) - /// Proof: RankedCollective IndexToId (max_values: None, max_size: Some(54), added: 2529, mode: MaxEncodedLen) - /// Storage: RankedCollective IdToIndex (r:0 w:1) - /// Proof: RankedCollective IdToIndex (max_values: None, max_size: Some(54), added: 2529, mode: MaxEncodedLen) + /// Storage: `RankedCollective::Members` (r:1 w:1) + /// Proof: `RankedCollective::Members` (`max_values`: None, `max_size`: Some(42), added: 2517, mode: `MaxEncodedLen`) + /// Storage: `CoreFellowship::Member` (r:1 w:1) + /// Proof: `CoreFellowship::Member` (`max_values`: None, `max_size`: Some(49), added: 2524, mode: `MaxEncodedLen`) + /// Storage: `CoreFellowship::Params` (r:1 w:0) + /// Proof: `CoreFellowship::Params` (`max_values`: Some(1), `max_size`: Some(364), added: 859, mode: `MaxEncodedLen`) + /// Storage: `RankedCollective::MemberCount` (r:1 w:1) + /// Proof: `RankedCollective::MemberCount` (`max_values`: None, `max_size`: Some(14), added: 2489, mode: `MaxEncodedLen`) + /// Storage: `CoreFellowship::MemberEvidence` (r:1 w:1) + /// Proof: `CoreFellowship::MemberEvidence` (`max_values`: None, `max_size`: Some(16429), added: 18904, mode: `MaxEncodedLen`) + /// Storage: `RankedCollective::IndexToId` (r:0 w:1) + /// Proof: `RankedCollective::IndexToId` (`max_values`: None, `max_size`: Some(54), added: 2529, mode: `MaxEncodedLen`) + /// Storage: `RankedCollective::IdToIndex` (r:0 w:1) + /// Proof: `RankedCollective::IdToIndex` (`max_values`: None, `max_size`: Some(54), added: 2529, mode: `MaxEncodedLen`) fn promote() -> Weight { // Proof Size summary in bytes: - // Measured: `16865` + // Measured: `17252` // Estimated: `19894` - // Minimum execution time: 56_642_000 picoseconds. - Weight::from_parts(59_353_000, 19894) + // Minimum execution time: 51_102_000 picoseconds. + Weight::from_parts(53_302_000, 19894) .saturating_add(T::DbWeight::get().reads(5_u64)) .saturating_add(T::DbWeight::get().writes(6_u64)) } - /// Storage: RankedCollective Members (r:1 w:0) - /// Proof: RankedCollective Members (max_values: None, max_size: Some(42), added: 2517, mode: MaxEncodedLen) - /// Storage: CoreFellowship Member (r:1 w:1) - /// Proof: CoreFellowship Member (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen) - /// Storage: CoreFellowship MemberEvidence (r:0 w:1) - /// Proof: CoreFellowship MemberEvidence (max_values: None, max_size: Some(16429), added: 18904, mode: MaxEncodedLen) + /// Storage: `RankedCollective::Members` (r:1 w:0) + /// Proof: `RankedCollective::Members` (`max_values`: None, `max_size`: Some(42), added: 2517, mode: `MaxEncodedLen`) + /// Storage: `CoreFellowship::Member` (r:1 w:1) + /// Proof: `CoreFellowship::Member` (`max_values`: None, `max_size`: Some(49), added: 2524, mode: `MaxEncodedLen`) + /// Storage: `CoreFellowship::MemberEvidence` (r:0 w:1) + /// Proof: `CoreFellowship::MemberEvidence` (`max_values`: None, `max_size`: Some(16429), added: 18904, mode: `MaxEncodedLen`) fn offboard() -> Weight { // Proof Size summary in bytes: - // Measured: `359` + // Measured: `293` // Estimated: `3514` - // Minimum execution time: 17_459_000 picoseconds. - Weight::from_parts(18_033_000, 3514) + // Minimum execution time: 16_035_000 picoseconds. + Weight::from_parts(16_529_000, 3514) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } - /// Storage: CoreFellowship Member (r:1 w:1) - /// Proof: CoreFellowship Member (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen) - /// Storage: RankedCollective Members (r:1 w:0) - /// Proof: RankedCollective Members (max_values: None, max_size: Some(42), added: 2517, mode: MaxEncodedLen) + /// Storage: `CoreFellowship::Member` (r:1 w:1) + /// Proof: `CoreFellowship::Member` (`max_values`: None, `max_size`: Some(49), added: 2524, mode: `MaxEncodedLen`) + /// Storage: `RankedCollective::Members` (r:1 w:0) + /// Proof: `RankedCollective::Members` (`max_values`: None, `max_size`: Some(42), added: 2517, mode: `MaxEncodedLen`) fn import() -> Weight { // Proof Size summary in bytes: // Measured: `313` // Estimated: `3514` - // Minimum execution time: 16_728_000 picoseconds. - Weight::from_parts(17_263_000, 3514) + // Minimum execution time: 14_966_000 picoseconds. + Weight::from_parts(15_340_000, 3514) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: RankedCollective Members (r:1 w:0) - /// Proof: RankedCollective Members (max_values: None, max_size: Some(42), added: 2517, mode: MaxEncodedLen) - /// Storage: CoreFellowship Member (r:1 w:1) - /// Proof: CoreFellowship Member (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen) - /// Storage: CoreFellowship MemberEvidence (r:1 w:1) - /// Proof: CoreFellowship MemberEvidence (max_values: None, max_size: Some(16429), added: 18904, mode: MaxEncodedLen) + /// Storage: `RankedCollective::Members` (r:1 w:0) + /// Proof: `RankedCollective::Members` (`max_values`: None, `max_size`: Some(42), added: 2517, mode: `MaxEncodedLen`) + /// Storage: `CoreFellowship::Member` (r:1 w:1) + /// Proof: `CoreFellowship::Member` (`max_values`: None, `max_size`: Some(49), added: 2524, mode: `MaxEncodedLen`) + /// Storage: `CoreFellowship::MemberEvidence` (r:1 w:1) + /// Proof: `CoreFellowship::MemberEvidence` (`max_values`: None, `max_size`: Some(16429), added: 18904, mode: `MaxEncodedLen`) fn approve() -> Weight { // Proof Size summary in bytes: // Measured: `16843` // Estimated: `19894` - // Minimum execution time: 41_487_000 picoseconds. - Weight::from_parts(43_459_000, 19894) + // Minimum execution time: 35_137_000 picoseconds. + Weight::from_parts(36_285_000, 19894) .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } - /// Storage: CoreFellowship Member (r:1 w:0) - /// Proof: CoreFellowship Member (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen) - /// Storage: CoreFellowship MemberEvidence (r:1 w:1) - /// Proof: CoreFellowship MemberEvidence (max_values: None, max_size: Some(16429), added: 18904, mode: MaxEncodedLen) + /// Storage: `CoreFellowship::Member` (r:1 w:0) + /// Proof: `CoreFellowship::Member` (`max_values`: None, `max_size`: Some(49), added: 2524, mode: `MaxEncodedLen`) + /// Storage: `CoreFellowship::MemberEvidence` (r:1 w:1) + /// Proof: `CoreFellowship::MemberEvidence` (`max_values`: None, `max_size`: Some(16429), added: 18904, mode: `MaxEncodedLen`) fn submit_evidence() -> Weight { // Proof Size summary in bytes: // Measured: `79` // Estimated: `19894` - // Minimum execution time: 26_033_000 picoseconds. - Weight::from_parts(26_612_000, 19894) + // Minimum execution time: 24_307_000 picoseconds. + Weight::from_parts(25_426_000, 19894) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } } -// For backwards compatibility and tests +// For backwards compatibility and tests. impl WeightInfo for () { - /// Storage: CoreFellowship Params (r:0 w:1) - /// Proof: CoreFellowship Params (max_values: Some(1), max_size: Some(364), added: 859, mode: MaxEncodedLen) + /// Storage: `CoreFellowship::Params` (r:0 w:1) + /// Proof: `CoreFellowship::Params` (`max_values`: Some(1), `max_size`: Some(364), added: 859, mode: `MaxEncodedLen`) fn set_params() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 9_454_000 picoseconds. - Weight::from_parts(9_804_000, 0) + // Minimum execution time: 6_836_000 picoseconds. + Weight::from_parts(7_057_000, 0) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: CoreFellowship Member (r:1 w:1) - /// Proof: CoreFellowship Member (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen) - /// Storage: RankedCollective Members (r:1 w:1) - /// Proof: RankedCollective Members (max_values: None, max_size: Some(42), added: 2517, mode: MaxEncodedLen) - /// Storage: CoreFellowship Params (r:1 w:0) - /// Proof: CoreFellowship Params (max_values: Some(1), max_size: Some(364), added: 859, mode: MaxEncodedLen) - /// Storage: RankedCollective MemberCount (r:1 w:1) - /// Proof: RankedCollective MemberCount (max_values: None, max_size: Some(14), added: 2489, mode: MaxEncodedLen) - /// Storage: RankedCollective IdToIndex (r:1 w:0) - /// Proof: RankedCollective IdToIndex (max_values: None, max_size: Some(54), added: 2529, mode: MaxEncodedLen) - /// Storage: CoreFellowship MemberEvidence (r:1 w:1) - /// Proof: CoreFellowship MemberEvidence (max_values: None, max_size: Some(16429), added: 18904, mode: MaxEncodedLen) + /// Storage: `CoreFellowship::Member` (r:1 w:1) + /// Proof: `CoreFellowship::Member` (`max_values`: None, `max_size`: Some(49), added: 2524, mode: `MaxEncodedLen`) + /// Storage: `RankedCollective::Members` (r:1 w:1) + /// Proof: `RankedCollective::Members` (`max_values`: None, `max_size`: Some(42), added: 2517, mode: `MaxEncodedLen`) + /// Storage: `CoreFellowship::Params` (r:1 w:0) + /// Proof: `CoreFellowship::Params` (`max_values`: Some(1), `max_size`: Some(364), added: 859, mode: `MaxEncodedLen`) + /// Storage: `RankedCollective::MemberCount` (r:1 w:1) + /// Proof: `RankedCollective::MemberCount` (`max_values`: None, `max_size`: Some(14), added: 2489, mode: `MaxEncodedLen`) + /// Storage: `RankedCollective::IdToIndex` (r:1 w:1) + /// Proof: `RankedCollective::IdToIndex` (`max_values`: None, `max_size`: Some(54), added: 2529, mode: `MaxEncodedLen`) + /// Storage: `CoreFellowship::MemberEvidence` (r:1 w:1) + /// Proof: `CoreFellowship::MemberEvidence` (`max_values`: None, `max_size`: Some(16429), added: 18904, mode: `MaxEncodedLen`) + /// Storage: `RankedCollective::IndexToId` (r:0 w:1) + /// Proof: `RankedCollective::IndexToId` (`max_values`: None, `max_size`: Some(54), added: 2529, mode: `MaxEncodedLen`) fn bump_offboard() -> Weight { // Proof Size summary in bytes: - // Measured: `16887` + // Measured: `17274` // Estimated: `19894` - // Minimum execution time: 58_489_000 picoseconds. - Weight::from_parts(60_202_000, 19894) + // Minimum execution time: 55_535_000 picoseconds. + Weight::from_parts(57_104_000, 19894) .saturating_add(RocksDbWeight::get().reads(6_u64)) - .saturating_add(RocksDbWeight::get().writes(4_u64)) + .saturating_add(RocksDbWeight::get().writes(6_u64)) } - /// Storage: CoreFellowship Member (r:1 w:1) - /// Proof: CoreFellowship Member (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen) - /// Storage: RankedCollective Members (r:1 w:1) - /// Proof: RankedCollective Members (max_values: None, max_size: Some(42), added: 2517, mode: MaxEncodedLen) - /// Storage: CoreFellowship Params (r:1 w:0) - /// Proof: CoreFellowship Params (max_values: Some(1), max_size: Some(364), added: 859, mode: MaxEncodedLen) - /// Storage: RankedCollective MemberCount (r:1 w:1) - /// Proof: RankedCollective MemberCount (max_values: None, max_size: Some(14), added: 2489, mode: MaxEncodedLen) - /// Storage: RankedCollective IdToIndex (r:1 w:0) - /// Proof: RankedCollective IdToIndex (max_values: None, max_size: Some(54), added: 2529, mode: MaxEncodedLen) - /// Storage: CoreFellowship MemberEvidence (r:1 w:1) - /// Proof: CoreFellowship MemberEvidence (max_values: None, max_size: Some(16429), added: 18904, mode: MaxEncodedLen) + /// Storage: `CoreFellowship::Member` (r:1 w:1) + /// Proof: `CoreFellowship::Member` (`max_values`: None, `max_size`: Some(49), added: 2524, mode: `MaxEncodedLen`) + /// Storage: `RankedCollective::Members` (r:1 w:1) + /// Proof: `RankedCollective::Members` (`max_values`: None, `max_size`: Some(42), added: 2517, mode: `MaxEncodedLen`) + /// Storage: `CoreFellowship::Params` (r:1 w:0) + /// Proof: `CoreFellowship::Params` (`max_values`: Some(1), `max_size`: Some(364), added: 859, mode: `MaxEncodedLen`) + /// Storage: `RankedCollective::MemberCount` (r:1 w:1) + /// Proof: `RankedCollective::MemberCount` (`max_values`: None, `max_size`: Some(14), added: 2489, mode: `MaxEncodedLen`) + /// Storage: `RankedCollective::IdToIndex` (r:1 w:1) + /// Proof: `RankedCollective::IdToIndex` (`max_values`: None, `max_size`: Some(54), added: 2529, mode: `MaxEncodedLen`) + /// Storage: `CoreFellowship::MemberEvidence` (r:1 w:1) + /// Proof: `CoreFellowship::MemberEvidence` (`max_values`: None, `max_size`: Some(16429), added: 18904, mode: `MaxEncodedLen`) + /// Storage: `RankedCollective::IndexToId` (r:0 w:1) + /// Proof: `RankedCollective::IndexToId` (`max_values`: None, `max_size`: Some(54), added: 2529, mode: `MaxEncodedLen`) fn bump_demote() -> Weight { // Proof Size summary in bytes: - // Measured: `16997` + // Measured: `17384` // Estimated: `19894` - // Minimum execution time: 60_605_000 picoseconds. - Weight::from_parts(63_957_000, 19894) + // Minimum execution time: 59_111_000 picoseconds. + Weight::from_parts(61_394_000, 19894) .saturating_add(RocksDbWeight::get().reads(6_u64)) - .saturating_add(RocksDbWeight::get().writes(4_u64)) + .saturating_add(RocksDbWeight::get().writes(6_u64)) } - /// Storage: RankedCollective Members (r:1 w:0) - /// Proof: RankedCollective Members (max_values: None, max_size: Some(42), added: 2517, mode: MaxEncodedLen) - /// Storage: CoreFellowship Member (r:1 w:1) - /// Proof: CoreFellowship Member (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen) + /// Storage: `RankedCollective::Members` (r:1 w:0) + /// Proof: `RankedCollective::Members` (`max_values`: None, `max_size`: Some(42), added: 2517, mode: `MaxEncodedLen`) + /// Storage: `CoreFellowship::Member` (r:1 w:1) + /// Proof: `CoreFellowship::Member` (`max_values`: None, `max_size`: Some(49), added: 2524, mode: `MaxEncodedLen`) fn set_active() -> Weight { // Proof Size summary in bytes: // Measured: `388` // Estimated: `3514` - // Minimum execution time: 17_816_000 picoseconds. - Weight::from_parts(18_524_000, 3514) + // Minimum execution time: 16_166_000 picoseconds. + Weight::from_parts(16_773_000, 3514) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: CoreFellowship Member (r:1 w:1) - /// Proof: CoreFellowship Member (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen) - /// Storage: RankedCollective Members (r:1 w:1) - /// Proof: RankedCollective Members (max_values: None, max_size: Some(42), added: 2517, mode: MaxEncodedLen) - /// Storage: RankedCollective MemberCount (r:1 w:1) - /// Proof: RankedCollective MemberCount (max_values: None, max_size: Some(14), added: 2489, mode: MaxEncodedLen) - /// Storage: RankedCollective IndexToId (r:0 w:1) - /// Proof: RankedCollective IndexToId (max_values: None, max_size: Some(54), added: 2529, mode: MaxEncodedLen) - /// Storage: RankedCollective IdToIndex (r:0 w:1) - /// Proof: RankedCollective IdToIndex (max_values: None, max_size: Some(54), added: 2529, mode: MaxEncodedLen) + /// Storage: `CoreFellowship::Member` (r:1 w:1) + /// Proof: `CoreFellowship::Member` (`max_values`: None, `max_size`: Some(49), added: 2524, mode: `MaxEncodedLen`) + /// Storage: `RankedCollective::Members` (r:1 w:1) + /// Proof: `RankedCollective::Members` (`max_values`: None, `max_size`: Some(42), added: 2517, mode: `MaxEncodedLen`) + /// Storage: `RankedCollective::MemberCount` (r:1 w:1) + /// Proof: `RankedCollective::MemberCount` (`max_values`: None, `max_size`: Some(14), added: 2489, mode: `MaxEncodedLen`) + /// Storage: `RankedCollective::IndexToId` (r:0 w:1) + /// Proof: `RankedCollective::IndexToId` (`max_values`: None, `max_size`: Some(54), added: 2529, mode: `MaxEncodedLen`) + /// Storage: `RankedCollective::IdToIndex` (r:0 w:1) + /// Proof: `RankedCollective::IdToIndex` (`max_values`: None, `max_size`: Some(54), added: 2529, mode: `MaxEncodedLen`) fn induct() -> Weight { // Proof Size summary in bytes: // Measured: `146` // Estimated: `3514` - // Minimum execution time: 27_249_000 picoseconds. - Weight::from_parts(28_049_000, 3514) + // Minimum execution time: 25_508_000 picoseconds. + Weight::from_parts(25_952_000, 3514) .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(5_u64)) } - /// Storage: RankedCollective Members (r:1 w:1) - /// Proof: RankedCollective Members (max_values: None, max_size: Some(42), added: 2517, mode: MaxEncodedLen) - /// Storage: CoreFellowship Member (r:1 w:1) - /// Proof: CoreFellowship Member (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen) - /// Storage: CoreFellowship Params (r:1 w:0) - /// Proof: CoreFellowship Params (max_values: Some(1), max_size: Some(364), added: 859, mode: MaxEncodedLen) - /// Storage: RankedCollective MemberCount (r:1 w:1) - /// Proof: RankedCollective MemberCount (max_values: None, max_size: Some(14), added: 2489, mode: MaxEncodedLen) - /// Storage: CoreFellowship MemberEvidence (r:1 w:1) - /// Proof: CoreFellowship MemberEvidence (max_values: None, max_size: Some(16429), added: 18904, mode: MaxEncodedLen) - /// Storage: RankedCollective IndexToId (r:0 w:1) - /// Proof: RankedCollective IndexToId (max_values: None, max_size: Some(54), added: 2529, mode: MaxEncodedLen) - /// Storage: RankedCollective IdToIndex (r:0 w:1) - /// Proof: RankedCollective IdToIndex (max_values: None, max_size: Some(54), added: 2529, mode: MaxEncodedLen) + /// Storage: `RankedCollective::Members` (r:1 w:1) + /// Proof: `RankedCollective::Members` (`max_values`: None, `max_size`: Some(42), added: 2517, mode: `MaxEncodedLen`) + /// Storage: `CoreFellowship::Member` (r:1 w:1) + /// Proof: `CoreFellowship::Member` (`max_values`: None, `max_size`: Some(49), added: 2524, mode: `MaxEncodedLen`) + /// Storage: `CoreFellowship::Params` (r:1 w:0) + /// Proof: `CoreFellowship::Params` (`max_values`: Some(1), `max_size`: Some(364), added: 859, mode: `MaxEncodedLen`) + /// Storage: `RankedCollective::MemberCount` (r:1 w:1) + /// Proof: `RankedCollective::MemberCount` (`max_values`: None, `max_size`: Some(14), added: 2489, mode: `MaxEncodedLen`) + /// Storage: `CoreFellowship::MemberEvidence` (r:1 w:1) + /// Proof: `CoreFellowship::MemberEvidence` (`max_values`: None, `max_size`: Some(16429), added: 18904, mode: `MaxEncodedLen`) + /// Storage: `RankedCollective::IndexToId` (r:0 w:1) + /// Proof: `RankedCollective::IndexToId` (`max_values`: None, `max_size`: Some(54), added: 2529, mode: `MaxEncodedLen`) + /// Storage: `RankedCollective::IdToIndex` (r:0 w:1) + /// Proof: `RankedCollective::IdToIndex` (`max_values`: None, `max_size`: Some(54), added: 2529, mode: `MaxEncodedLen`) fn promote() -> Weight { // Proof Size summary in bytes: - // Measured: `16865` + // Measured: `17252` // Estimated: `19894` - // Minimum execution time: 56_642_000 picoseconds. - Weight::from_parts(59_353_000, 19894) + // Minimum execution time: 51_102_000 picoseconds. + Weight::from_parts(53_302_000, 19894) .saturating_add(RocksDbWeight::get().reads(5_u64)) .saturating_add(RocksDbWeight::get().writes(6_u64)) } - /// Storage: RankedCollective Members (r:1 w:0) - /// Proof: RankedCollective Members (max_values: None, max_size: Some(42), added: 2517, mode: MaxEncodedLen) - /// Storage: CoreFellowship Member (r:1 w:1) - /// Proof: CoreFellowship Member (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen) - /// Storage: CoreFellowship MemberEvidence (r:0 w:1) - /// Proof: CoreFellowship MemberEvidence (max_values: None, max_size: Some(16429), added: 18904, mode: MaxEncodedLen) + /// Storage: `RankedCollective::Members` (r:1 w:0) + /// Proof: `RankedCollective::Members` (`max_values`: None, `max_size`: Some(42), added: 2517, mode: `MaxEncodedLen`) + /// Storage: `CoreFellowship::Member` (r:1 w:1) + /// Proof: `CoreFellowship::Member` (`max_values`: None, `max_size`: Some(49), added: 2524, mode: `MaxEncodedLen`) + /// Storage: `CoreFellowship::MemberEvidence` (r:0 w:1) + /// Proof: `CoreFellowship::MemberEvidence` (`max_values`: None, `max_size`: Some(16429), added: 18904, mode: `MaxEncodedLen`) fn offboard() -> Weight { // Proof Size summary in bytes: - // Measured: `359` + // Measured: `293` // Estimated: `3514` - // Minimum execution time: 17_459_000 picoseconds. - Weight::from_parts(18_033_000, 3514) + // Minimum execution time: 16_035_000 picoseconds. + Weight::from_parts(16_529_000, 3514) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } - /// Storage: CoreFellowship Member (r:1 w:1) - /// Proof: CoreFellowship Member (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen) - /// Storage: RankedCollective Members (r:1 w:0) - /// Proof: RankedCollective Members (max_values: None, max_size: Some(42), added: 2517, mode: MaxEncodedLen) + /// Storage: `CoreFellowship::Member` (r:1 w:1) + /// Proof: `CoreFellowship::Member` (`max_values`: None, `max_size`: Some(49), added: 2524, mode: `MaxEncodedLen`) + /// Storage: `RankedCollective::Members` (r:1 w:0) + /// Proof: `RankedCollective::Members` (`max_values`: None, `max_size`: Some(42), added: 2517, mode: `MaxEncodedLen`) fn import() -> Weight { // Proof Size summary in bytes: // Measured: `313` // Estimated: `3514` - // Minimum execution time: 16_728_000 picoseconds. - Weight::from_parts(17_263_000, 3514) + // Minimum execution time: 14_966_000 picoseconds. + Weight::from_parts(15_340_000, 3514) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: RankedCollective Members (r:1 w:0) - /// Proof: RankedCollective Members (max_values: None, max_size: Some(42), added: 2517, mode: MaxEncodedLen) - /// Storage: CoreFellowship Member (r:1 w:1) - /// Proof: CoreFellowship Member (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen) - /// Storage: CoreFellowship MemberEvidence (r:1 w:1) - /// Proof: CoreFellowship MemberEvidence (max_values: None, max_size: Some(16429), added: 18904, mode: MaxEncodedLen) + /// Storage: `RankedCollective::Members` (r:1 w:0) + /// Proof: `RankedCollective::Members` (`max_values`: None, `max_size`: Some(42), added: 2517, mode: `MaxEncodedLen`) + /// Storage: `CoreFellowship::Member` (r:1 w:1) + /// Proof: `CoreFellowship::Member` (`max_values`: None, `max_size`: Some(49), added: 2524, mode: `MaxEncodedLen`) + /// Storage: `CoreFellowship::MemberEvidence` (r:1 w:1) + /// Proof: `CoreFellowship::MemberEvidence` (`max_values`: None, `max_size`: Some(16429), added: 18904, mode: `MaxEncodedLen`) fn approve() -> Weight { // Proof Size summary in bytes: // Measured: `16843` // Estimated: `19894` - // Minimum execution time: 41_487_000 picoseconds. - Weight::from_parts(43_459_000, 19894) + // Minimum execution time: 35_137_000 picoseconds. + Weight::from_parts(36_285_000, 19894) .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } - /// Storage: CoreFellowship Member (r:1 w:0) - /// Proof: CoreFellowship Member (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen) - /// Storage: CoreFellowship MemberEvidence (r:1 w:1) - /// Proof: CoreFellowship MemberEvidence (max_values: None, max_size: Some(16429), added: 18904, mode: MaxEncodedLen) + /// Storage: `CoreFellowship::Member` (r:1 w:0) + /// Proof: `CoreFellowship::Member` (`max_values`: None, `max_size`: Some(49), added: 2524, mode: `MaxEncodedLen`) + /// Storage: `CoreFellowship::MemberEvidence` (r:1 w:1) + /// Proof: `CoreFellowship::MemberEvidence` (`max_values`: None, `max_size`: Some(16429), added: 18904, mode: `MaxEncodedLen`) fn submit_evidence() -> Weight { // Proof Size summary in bytes: // Measured: `79` // Estimated: `19894` - // Minimum execution time: 26_033_000 picoseconds. - Weight::from_parts(26_612_000, 19894) + // Minimum execution time: 24_307_000 picoseconds. + Weight::from_parts(25_426_000, 19894) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } diff --git a/substrate/frame/democracy/Cargo.toml b/substrate/frame/democracy/Cargo.toml index 0ade0d58a6d91b44965a85b45efd5532c329ba68..edd2d742b5069a73212a291aaf440de40e96fd24 100644 --- a/substrate/frame/democracy/Cargo.toml +++ b/substrate/frame/democracy/Cargo.toml @@ -19,8 +19,8 @@ targets = ["x86_64-unknown-linux-gnu"] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = [ "derive", ] } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.195", features = ["derive"], optional = true } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +serde = { features = ["derive"], optional = true, workspace = true, default-features = true } frame-benchmarking = { path = "../benchmarking", default-features = false, optional = true } frame-support = { path = "../support", default-features = false } frame-system = { path = "../system", default-features = false } @@ -28,7 +28,7 @@ sp-io = { path = "../../primitives/io", default-features = false } sp-runtime = { path = "../../primitives/runtime", default-features = false } sp-std = { path = "../../primitives/std", default-features = false } sp-core = { path = "../../primitives/core", default-features = false } -log = { version = "0.4.17", default-features = false } +log = { workspace = true } [dev-dependencies] pallet-balances = { path = "../balances" } diff --git a/substrate/frame/democracy/src/conviction.rs b/substrate/frame/democracy/src/conviction.rs index d2f685f7d99efb79e12628ac38370fb69445a44d..54f4ff524f2a9be397a12eadb4bb0c9e88cbf501 100644 --- a/substrate/frame/democracy/src/conviction.rs +++ b/substrate/frame/democracy/src/conviction.rs @@ -19,12 +19,12 @@ use crate::types::Delegations; use codec::{Decode, Encode, MaxEncodedLen}; +use core::result::Result; use scale_info::TypeInfo; use sp_runtime::{ traits::{Bounded, CheckedDiv, CheckedMul, Zero}, RuntimeDebug, }; -use sp_std::{prelude::*, result::Result}; /// A value denoting the strength of conviction of a vote. #[derive( diff --git a/substrate/frame/democracy/src/lib.rs b/substrate/frame/democracy/src/lib.rs index 089556191cd14eee735d12976ba6b0ed471a4eac..f3d33a72f3ad1a088d4dc050d1e637acd162db7d 100644 --- a/substrate/frame/democracy/src/lib.rs +++ b/substrate/frame/democracy/src/lib.rs @@ -211,7 +211,7 @@ pub mod pallet { use frame_support::pallet_prelude::*; use frame_system::pallet_prelude::*; - /// The current storage version. + /// The in-code storage version. const STORAGE_VERSION: StorageVersion = StorageVersion::new(1); #[pallet::pallet] @@ -484,7 +484,7 @@ pub mod pallet { Blacklisted { proposal_hash: T::Hash }, /// An account has voted in a referendum Voted { voter: T::AccountId, ref_index: ReferendumIndex, vote: AccountVote> }, - /// An account has secconded a proposal + /// An account has seconded a proposal Seconded { seconder: T::AccountId, prop_index: PropIndex }, /// A proposal got canceled. ProposalCanceled { prop_index: PropIndex }, diff --git a/substrate/frame/democracy/src/migrations/unlock_and_unreserve_all_funds.rs b/substrate/frame/democracy/src/migrations/unlock_and_unreserve_all_funds.rs index 188c475f64d0ef3e55e6daf3f86f9423e93a4efa..1cb50a157b12bb5ea68fc870e870cda6536fd524 100644 --- a/substrate/frame/democracy/src/migrations/unlock_and_unreserve_all_funds.rs +++ b/substrate/frame/democracy/src/migrations/unlock_and_unreserve_all_funds.rs @@ -321,40 +321,40 @@ mod test { } #[test] - fn unreserve_works_for_depositer() { - let depositer_0 = 10; - let depositer_1 = 11; + fn unreserve_works_for_depositor() { + let depositor_0 = 10; + let depositor_1 = 11; let deposit = 25; - let depositer_0_initial_reserved = 0; - let depositer_1_initial_reserved = 15; + let depositor_0_initial_reserved = 0; + let depositor_1_initial_reserved = 15; let initial_balance = 100_000; new_test_ext().execute_with(|| { // Set up initial state. - ::Currency::make_free_balance_be(&depositer_0, initial_balance); - ::Currency::make_free_balance_be(&depositer_1, initial_balance); + ::Currency::make_free_balance_be(&depositor_0, initial_balance); + ::Currency::make_free_balance_be(&depositor_1, initial_balance); assert_ok!(::Currency::reserve( - &depositer_0, - depositer_0_initial_reserved + deposit + &depositor_0, + depositor_0_initial_reserved + deposit )); assert_ok!(::Currency::reserve( - &depositer_1, - depositer_1_initial_reserved + deposit + &depositor_1, + depositor_1_initial_reserved + deposit )); let depositors = BoundedVec::<_, ::MaxDeposits>::truncate_from(vec![ - depositer_0, - depositer_1, + depositor_0, + depositor_1, ]); DepositOf::::insert(0, (depositors, deposit)); // Sanity check: ensure initial reserved balance was set correctly. assert_eq!( - ::Currency::reserved_balance(&depositer_0), - depositer_0_initial_reserved + deposit + ::Currency::reserved_balance(&depositor_0), + depositor_0_initial_reserved + deposit ); assert_eq!( - ::Currency::reserved_balance(&depositer_1), - depositer_1_initial_reserved + deposit + ::Currency::reserved_balance(&depositor_1), + depositor_1_initial_reserved + deposit ); // Run the migration. @@ -365,12 +365,12 @@ mod test { // Assert the reserved balance was reduced by the expected amount. assert_eq!( - ::Currency::reserved_balance(&depositer_0), - depositer_0_initial_reserved + ::Currency::reserved_balance(&depositor_0), + depositor_0_initial_reserved ); assert_eq!( - ::Currency::reserved_balance(&depositer_1), - depositer_1_initial_reserved + ::Currency::reserved_balance(&depositor_1), + depositor_1_initial_reserved ); }); } diff --git a/substrate/frame/democracy/src/migrations/v1.rs b/substrate/frame/democracy/src/migrations/v1.rs index 64baea8f3af7039eb8a2422b48e897aaaa93a664..5e423b9ab6eff7d2a96f94416bdd425827869fba 100644 --- a/substrate/frame/democracy/src/migrations/v1.rs +++ b/substrate/frame/democracy/src/migrations/v1.rs @@ -54,7 +54,7 @@ pub mod v1 { use super::*; /// Migration for translating bare `Hash`es into `Bounded`s. - pub struct Migration(sp_std::marker::PhantomData); + pub struct Migration(core::marker::PhantomData); impl> OnRuntimeUpgrade for Migration { #[cfg(feature = "try-runtime")] diff --git a/substrate/frame/democracy/src/tests.rs b/substrate/frame/democracy/src/tests.rs index 8136fa5c4c97fedd7915ad77fb92e44bd68bb58e..e2946ba98156ad3480f85ae4e86ba4a2036ff59c 100644 --- a/substrate/frame/democracy/src/tests.rs +++ b/substrate/frame/democracy/src/tests.rs @@ -29,9 +29,8 @@ use frame_support::{ }; use frame_system::{EnsureRoot, EnsureSigned, EnsureSignedBy}; use pallet_balances::{BalanceLock, Error as BalancesError}; -use sp_core::H256; use sp_runtime::{ - traits::{BadOrigin, BlakeTwo256, Hash, IdentityLookup}, + traits::{BadOrigin, BlakeTwo256, Hash}, BuildStorage, Perbill, }; mod cancellation; @@ -63,7 +62,7 @@ frame_support::construct_runtime!( } ); -// Test that a fitlered call can be dispatched. +// Test that a filtered call can be dispatched. pub struct BaseFilter; impl Contains for BaseFilter { fn contains(call: &RuntimeCall) -> bool { @@ -78,31 +77,11 @@ parameter_types! { ); } -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { type BaseCallFilter = BaseFilter; - type BlockWeights = BlockWeights; - type BlockLength = (); - type DbWeight = (); - type RuntimeOrigin = RuntimeOrigin; - type Nonce = u64; - type RuntimeCall = RuntimeCall; - type Hash = H256; - type Hashing = BlakeTwo256; - type AccountId = u64; - type Lookup = IdentityLookup; type Block = Block; - type RuntimeEvent = RuntimeEvent; - type BlockHashCount = ConstU64<250>; - type Version = (); - type PalletInfo = PalletInfo; type AccountData = pallet_balances::AccountData; - type OnNewAccount = (); - type OnKilledAccount = (); - type SystemWeightInfo = (); - type SS58Prefix = (); - type OnSetCode = (); - type MaxConsumers = frame_support::traits::ConstU32<16>; } parameter_types! { pub MaximumSchedulerWeight: Weight = Perbill::from_percent(80) * BlockWeights::get().max_block; diff --git a/substrate/frame/democracy/src/tests/cancellation.rs b/substrate/frame/democracy/src/tests/cancellation.rs index 4384fe6a1641aa2f51723c70caeac7093dcb1951..b4c42f9c79053ad6db1641e7e431dc4be7661e9f 100644 --- a/substrate/frame/democracy/src/tests/cancellation.rs +++ b/substrate/frame/democracy/src/tests/cancellation.rs @@ -15,7 +15,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -//! The tests for cancelation functionality. +//! The tests for cancellation functionality. use super::*; diff --git a/substrate/frame/democracy/src/vote_threshold.rs b/substrate/frame/democracy/src/vote_threshold.rs index e8efa179ed8bf1ad68ac34aa2f19d90985143125..82d6ed178f13783f2e9495ce064378b3f8de5ecf 100644 --- a/substrate/frame/democracy/src/vote_threshold.rs +++ b/substrate/frame/democracy/src/vote_threshold.rs @@ -19,11 +19,11 @@ use crate::Tally; use codec::{Decode, Encode, MaxEncodedLen}; +use core::ops::{Add, Div, Mul, Rem}; use scale_info::TypeInfo; #[cfg(feature = "std")] use serde::{Deserialize, Serialize}; use sp_runtime::traits::{IntegerSquareRoot, Zero}; -use sp_std::ops::{Add, Div, Mul, Rem}; /// A means of determining if a vote is past pass threshold. #[derive( diff --git a/substrate/frame/democracy/src/weights.rs b/substrate/frame/democracy/src/weights.rs index 241f6c3cb38de2c270411cd2d39913f857bbe807..6eb82c631a2ae6d233a8419f18d8a2952a1fab8a 100644 --- a/substrate/frame/democracy/src/weights.rs +++ b/substrate/frame/democracy/src/weights.rs @@ -15,16 +15,16 @@ // See the License for the specific language governing permissions and // limitations under the License. -//! Autogenerated weights for pallet_democracy +//! Autogenerated weights for `pallet_democracy` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-06-16, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-04-08, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-e8ezs4ez-project-145-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("dev"), DB CACHE: 1024 +//! HOSTNAME: `runner-anb7yjbi-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: `1024` // Executed Command: -// ./target/production/substrate +// ./target/production/substrate-node // benchmark // pallet // --chain=dev @@ -35,12 +35,11 @@ // --no-median-slopes // --no-min-squares // --extrinsic=* -// --execution=wasm // --wasm-execution=compiled // --heap-pages=4096 -// --output=./frame/democracy/src/weights.rs -// --header=./HEADER-APACHE2 -// --template=./.maintain/frame-weight-template.hbs +// --output=./substrate/frame/democracy/src/weights.rs +// --header=./substrate/HEADER-APACHE2 +// --template=./substrate/.maintain/frame-weight-template.hbs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -50,7 +49,7 @@ use frame_support::{traits::Get, weights::{Weight, constants::RocksDbWeight}}; use core::marker::PhantomData; -/// Weight functions needed for pallet_democracy. +/// Weight functions needed for `pallet_democracy`. pub trait WeightInfo { fn propose() -> Weight; fn second() -> Weight; @@ -82,904 +81,916 @@ pub trait WeightInfo { fn clear_referendum_metadata() -> Weight; } -/// Weights for pallet_democracy using the Substrate node and recommended hardware. +/// Weights for `pallet_democracy` using the Substrate node and recommended hardware. pub struct SubstrateWeight(PhantomData); impl WeightInfo for SubstrateWeight { - /// Storage: Democracy PublicPropCount (r:1 w:1) - /// Proof: Democracy PublicPropCount (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: Democracy PublicProps (r:1 w:1) - /// Proof: Democracy PublicProps (max_values: Some(1), max_size: Some(16702), added: 17197, mode: MaxEncodedLen) - /// Storage: Democracy Blacklist (r:1 w:0) - /// Proof: Democracy Blacklist (max_values: None, max_size: Some(3238), added: 5713, mode: MaxEncodedLen) - /// Storage: Democracy DepositOf (r:0 w:1) - /// Proof: Democracy DepositOf (max_values: None, max_size: Some(3230), added: 5705, mode: MaxEncodedLen) + /// Storage: `Democracy::PublicPropCount` (r:1 w:1) + /// Proof: `Democracy::PublicPropCount` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `Democracy::PublicProps` (r:1 w:1) + /// Proof: `Democracy::PublicProps` (`max_values`: Some(1), `max_size`: Some(16702), added: 17197, mode: `MaxEncodedLen`) + /// Storage: `Democracy::Blacklist` (r:1 w:0) + /// Proof: `Democracy::Blacklist` (`max_values`: None, `max_size`: Some(3238), added: 5713, mode: `MaxEncodedLen`) + /// Storage: `Democracy::DepositOf` (r:0 w:1) + /// Proof: `Democracy::DepositOf` (`max_values`: None, `max_size`: Some(3230), added: 5705, mode: `MaxEncodedLen`) fn propose() -> Weight { // Proof Size summary in bytes: - // Measured: `4801` + // Measured: `4834` // Estimated: `18187` - // Minimum execution time: 49_339_000 picoseconds. - Weight::from_parts(50_942_000, 18187) + // Minimum execution time: 42_266_000 picoseconds. + Weight::from_parts(43_382_000, 18187) .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(3_u64)) } - /// Storage: Democracy DepositOf (r:1 w:1) - /// Proof: Democracy DepositOf (max_values: None, max_size: Some(3230), added: 5705, mode: MaxEncodedLen) + /// Storage: `Democracy::DepositOf` (r:1 w:1) + /// Proof: `Democracy::DepositOf` (`max_values`: None, `max_size`: Some(3230), added: 5705, mode: `MaxEncodedLen`) fn second() -> Weight { // Proof Size summary in bytes: - // Measured: `3556` + // Measured: `3589` // Estimated: `6695` - // Minimum execution time: 43_291_000 picoseconds. - Weight::from_parts(44_856_000, 6695) + // Minimum execution time: 37_765_000 picoseconds. + Weight::from_parts(38_679_000, 6695) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: Democracy ReferendumInfoOf (r:1 w:1) - /// Proof: Democracy ReferendumInfoOf (max_values: None, max_size: Some(201), added: 2676, mode: MaxEncodedLen) - /// Storage: Democracy VotingOf (r:1 w:1) - /// Proof: Democracy VotingOf (max_values: None, max_size: Some(3795), added: 6270, mode: MaxEncodedLen) - /// Storage: Balances Locks (r:1 w:1) - /// Proof: Balances Locks (max_values: None, max_size: Some(1299), added: 3774, mode: MaxEncodedLen) - /// Storage: Balances Freezes (r:1 w:0) - /// Proof: Balances Freezes (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen) + /// Storage: `Democracy::ReferendumInfoOf` (r:1 w:1) + /// Proof: `Democracy::ReferendumInfoOf` (`max_values`: None, `max_size`: Some(201), added: 2676, mode: `MaxEncodedLen`) + /// Storage: `Democracy::VotingOf` (r:1 w:1) + /// Proof: `Democracy::VotingOf` (`max_values`: None, `max_size`: Some(3795), added: 6270, mode: `MaxEncodedLen`) + /// Storage: `Balances::Locks` (r:1 w:1) + /// Proof: `Balances::Locks` (`max_values`: None, `max_size`: Some(1299), added: 3774, mode: `MaxEncodedLen`) + /// Storage: `Balances::Freezes` (r:1 w:0) + /// Proof: `Balances::Freezes` (`max_values`: None, `max_size`: Some(67), added: 2542, mode: `MaxEncodedLen`) fn vote_new() -> Weight { // Proof Size summary in bytes: - // Measured: `3470` + // Measured: `3503` // Estimated: `7260` - // Minimum execution time: 61_890_000 picoseconds. - Weight::from_parts(63_626_000, 7260) + // Minimum execution time: 56_200_000 picoseconds. + Weight::from_parts(57_320_000, 7260) .saturating_add(T::DbWeight::get().reads(4_u64)) .saturating_add(T::DbWeight::get().writes(3_u64)) } - /// Storage: Democracy ReferendumInfoOf (r:1 w:1) - /// Proof: Democracy ReferendumInfoOf (max_values: None, max_size: Some(201), added: 2676, mode: MaxEncodedLen) - /// Storage: Democracy VotingOf (r:1 w:1) - /// Proof: Democracy VotingOf (max_values: None, max_size: Some(3795), added: 6270, mode: MaxEncodedLen) - /// Storage: Balances Locks (r:1 w:1) - /// Proof: Balances Locks (max_values: None, max_size: Some(1299), added: 3774, mode: MaxEncodedLen) - /// Storage: Balances Freezes (r:1 w:0) - /// Proof: Balances Freezes (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen) + /// Storage: `Democracy::ReferendumInfoOf` (r:1 w:1) + /// Proof: `Democracy::ReferendumInfoOf` (`max_values`: None, `max_size`: Some(201), added: 2676, mode: `MaxEncodedLen`) + /// Storage: `Democracy::VotingOf` (r:1 w:1) + /// Proof: `Democracy::VotingOf` (`max_values`: None, `max_size`: Some(3795), added: 6270, mode: `MaxEncodedLen`) + /// Storage: `Balances::Locks` (r:1 w:1) + /// Proof: `Balances::Locks` (`max_values`: None, `max_size`: Some(1299), added: 3774, mode: `MaxEncodedLen`) + /// Storage: `Balances::Freezes` (r:1 w:0) + /// Proof: `Balances::Freezes` (`max_values`: None, `max_size`: Some(67), added: 2542, mode: `MaxEncodedLen`) fn vote_existing() -> Weight { // Proof Size summary in bytes: - // Measured: `3492` + // Measured: `3525` // Estimated: `7260` - // Minimum execution time: 67_802_000 picoseconds. - Weight::from_parts(69_132_000, 7260) + // Minimum execution time: 58_633_000 picoseconds. + Weight::from_parts(60_809_000, 7260) .saturating_add(T::DbWeight::get().reads(4_u64)) .saturating_add(T::DbWeight::get().writes(3_u64)) } - /// Storage: Democracy ReferendumInfoOf (r:1 w:1) - /// Proof: Democracy ReferendumInfoOf (max_values: None, max_size: Some(201), added: 2676, mode: MaxEncodedLen) - /// Storage: Democracy Cancellations (r:1 w:1) - /// Proof: Democracy Cancellations (max_values: None, max_size: Some(33), added: 2508, mode: MaxEncodedLen) - /// Storage: Democracy MetadataOf (r:1 w:1) - /// Proof: Democracy MetadataOf (max_values: None, max_size: Some(53), added: 2528, mode: MaxEncodedLen) + /// Storage: `Democracy::ReferendumInfoOf` (r:1 w:1) + /// Proof: `Democracy::ReferendumInfoOf` (`max_values`: None, `max_size`: Some(201), added: 2676, mode: `MaxEncodedLen`) + /// Storage: `Democracy::Cancellations` (r:1 w:1) + /// Proof: `Democracy::Cancellations` (`max_values`: None, `max_size`: Some(33), added: 2508, mode: `MaxEncodedLen`) + /// Storage: `Democracy::MetadataOf` (r:1 w:1) + /// Proof: `Democracy::MetadataOf` (`max_values`: None, `max_size`: Some(53), added: 2528, mode: `MaxEncodedLen`) fn emergency_cancel() -> Weight { // Proof Size summary in bytes: - // Measured: `366` + // Measured: `399` // Estimated: `3666` - // Minimum execution time: 25_757_000 picoseconds. - Weight::from_parts(27_226_000, 3666) + // Minimum execution time: 23_908_000 picoseconds. + Weight::from_parts(24_659_000, 3666) .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(3_u64)) } - /// Storage: Democracy PublicProps (r:1 w:1) - /// Proof: Democracy PublicProps (max_values: Some(1), max_size: Some(16702), added: 17197, mode: MaxEncodedLen) - /// Storage: Democracy DepositOf (r:1 w:1) - /// Proof: Democracy DepositOf (max_values: None, max_size: Some(3230), added: 5705, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) - /// Storage: Democracy MetadataOf (r:3 w:1) - /// Proof: Democracy MetadataOf (max_values: None, max_size: Some(53), added: 2528, mode: MaxEncodedLen) - /// Storage: Democracy NextExternal (r:1 w:1) - /// Proof: Democracy NextExternal (max_values: Some(1), max_size: Some(132), added: 627, mode: MaxEncodedLen) - /// Storage: Democracy ReferendumInfoOf (r:1 w:1) - /// Proof: Democracy ReferendumInfoOf (max_values: None, max_size: Some(201), added: 2676, mode: MaxEncodedLen) - /// Storage: Democracy Blacklist (r:0 w:1) - /// Proof: Democracy Blacklist (max_values: None, max_size: Some(3238), added: 5713, mode: MaxEncodedLen) + /// Storage: `Democracy::PublicProps` (r:1 w:1) + /// Proof: `Democracy::PublicProps` (`max_values`: Some(1), `max_size`: Some(16702), added: 17197, mode: `MaxEncodedLen`) + /// Storage: `Democracy::DepositOf` (r:1 w:1) + /// Proof: `Democracy::DepositOf` (`max_values`: None, `max_size`: Some(3230), added: 5705, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `Democracy::MetadataOf` (r:3 w:1) + /// Proof: `Democracy::MetadataOf` (`max_values`: None, `max_size`: Some(53), added: 2528, mode: `MaxEncodedLen`) + /// Storage: `Democracy::NextExternal` (r:1 w:1) + /// Proof: `Democracy::NextExternal` (`max_values`: Some(1), `max_size`: Some(132), added: 627, mode: `MaxEncodedLen`) + /// Storage: `Democracy::ReferendumInfoOf` (r:1 w:1) + /// Proof: `Democracy::ReferendumInfoOf` (`max_values`: None, `max_size`: Some(201), added: 2676, mode: `MaxEncodedLen`) + /// Storage: `Democracy::Blacklist` (r:0 w:1) + /// Proof: `Democracy::Blacklist` (`max_values`: None, `max_size`: Some(3238), added: 5713, mode: `MaxEncodedLen`) fn blacklist() -> Weight { // Proof Size summary in bytes: - // Measured: `5910` + // Measured: `5943` // Estimated: `18187` - // Minimum execution time: 113_060_000 picoseconds. - Weight::from_parts(114_813_000, 18187) + // Minimum execution time: 100_268_000 picoseconds. + Weight::from_parts(101_309_000, 18187) .saturating_add(T::DbWeight::get().reads(8_u64)) .saturating_add(T::DbWeight::get().writes(7_u64)) } - /// Storage: Democracy NextExternal (r:1 w:1) - /// Proof: Democracy NextExternal (max_values: Some(1), max_size: Some(132), added: 627, mode: MaxEncodedLen) - /// Storage: Democracy Blacklist (r:1 w:0) - /// Proof: Democracy Blacklist (max_values: None, max_size: Some(3238), added: 5713, mode: MaxEncodedLen) + /// Storage: `Democracy::NextExternal` (r:1 w:1) + /// Proof: `Democracy::NextExternal` (`max_values`: Some(1), `max_size`: Some(132), added: 627, mode: `MaxEncodedLen`) + /// Storage: `Democracy::Blacklist` (r:1 w:0) + /// Proof: `Democracy::Blacklist` (`max_values`: None, `max_size`: Some(3238), added: 5713, mode: `MaxEncodedLen`) fn external_propose() -> Weight { // Proof Size summary in bytes: - // Measured: `3416` + // Measured: `3449` // Estimated: `6703` - // Minimum execution time: 13_413_000 picoseconds. - Weight::from_parts(13_794_000, 6703) + // Minimum execution time: 12_143_000 picoseconds. + Weight::from_parts(12_843_000, 6703) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: Democracy NextExternal (r:0 w:1) - /// Proof: Democracy NextExternal (max_values: Some(1), max_size: Some(132), added: 627, mode: MaxEncodedLen) + /// Storage: `Democracy::NextExternal` (r:0 w:1) + /// Proof: `Democracy::NextExternal` (`max_values`: Some(1), `max_size`: Some(132), added: 627, mode: `MaxEncodedLen`) fn external_propose_majority() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_213_000 picoseconds. - Weight::from_parts(3_429_000, 0) + // Minimum execution time: 2_792_000 picoseconds. + Weight::from_parts(2_922_000, 0) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: Democracy NextExternal (r:0 w:1) - /// Proof: Democracy NextExternal (max_values: Some(1), max_size: Some(132), added: 627, mode: MaxEncodedLen) + /// Storage: `Democracy::NextExternal` (r:0 w:1) + /// Proof: `Democracy::NextExternal` (`max_values`: Some(1), `max_size`: Some(132), added: 627, mode: `MaxEncodedLen`) fn external_propose_default() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_280_000 picoseconds. - Weight::from_parts(3_389_000, 0) + // Minimum execution time: 2_792_000 picoseconds. + Weight::from_parts(2_953_000, 0) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: Democracy NextExternal (r:1 w:1) - /// Proof: Democracy NextExternal (max_values: Some(1), max_size: Some(132), added: 627, mode: MaxEncodedLen) - /// Storage: Democracy ReferendumCount (r:1 w:1) - /// Proof: Democracy ReferendumCount (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: Democracy MetadataOf (r:1 w:2) - /// Proof: Democracy MetadataOf (max_values: None, max_size: Some(53), added: 2528, mode: MaxEncodedLen) - /// Storage: Democracy ReferendumInfoOf (r:0 w:1) - /// Proof: Democracy ReferendumInfoOf (max_values: None, max_size: Some(201), added: 2676, mode: MaxEncodedLen) + /// Storage: `Democracy::NextExternal` (r:1 w:1) + /// Proof: `Democracy::NextExternal` (`max_values`: Some(1), `max_size`: Some(132), added: 627, mode: `MaxEncodedLen`) + /// Storage: `Democracy::ReferendumCount` (r:1 w:1) + /// Proof: `Democracy::ReferendumCount` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `Democracy::MetadataOf` (r:1 w:2) + /// Proof: `Democracy::MetadataOf` (`max_values`: None, `max_size`: Some(53), added: 2528, mode: `MaxEncodedLen`) + /// Storage: `Democracy::ReferendumInfoOf` (r:0 w:1) + /// Proof: `Democracy::ReferendumInfoOf` (`max_values`: None, `max_size`: Some(201), added: 2676, mode: `MaxEncodedLen`) fn fast_track() -> Weight { // Proof Size summary in bytes: - // Measured: `286` + // Measured: `319` // Estimated: `3518` - // Minimum execution time: 28_142_000 picoseconds. - Weight::from_parts(28_862_000, 3518) + // Minimum execution time: 23_948_000 picoseconds. + Weight::from_parts(24_773_000, 3518) .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(5_u64)) } - /// Storage: Democracy NextExternal (r:1 w:1) - /// Proof: Democracy NextExternal (max_values: Some(1), max_size: Some(132), added: 627, mode: MaxEncodedLen) - /// Storage: Democracy Blacklist (r:1 w:1) - /// Proof: Democracy Blacklist (max_values: None, max_size: Some(3238), added: 5713, mode: MaxEncodedLen) - /// Storage: Democracy MetadataOf (r:1 w:1) - /// Proof: Democracy MetadataOf (max_values: None, max_size: Some(53), added: 2528, mode: MaxEncodedLen) + /// Storage: `Democracy::NextExternal` (r:1 w:1) + /// Proof: `Democracy::NextExternal` (`max_values`: Some(1), `max_size`: Some(132), added: 627, mode: `MaxEncodedLen`) + /// Storage: `Democracy::Blacklist` (r:1 w:1) + /// Proof: `Democracy::Blacklist` (`max_values`: None, `max_size`: Some(3238), added: 5713, mode: `MaxEncodedLen`) + /// Storage: `Democracy::MetadataOf` (r:1 w:1) + /// Proof: `Democracy::MetadataOf` (`max_values`: None, `max_size`: Some(53), added: 2528, mode: `MaxEncodedLen`) fn veto_external() -> Weight { // Proof Size summary in bytes: - // Measured: `3519` + // Measured: `3552` // Estimated: `6703` - // Minimum execution time: 32_395_000 picoseconds. - Weight::from_parts(33_617_000, 6703) + // Minimum execution time: 27_233_000 picoseconds. + Weight::from_parts(28_327_000, 6703) .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(3_u64)) } - /// Storage: Democracy PublicProps (r:1 w:1) - /// Proof: Democracy PublicProps (max_values: Some(1), max_size: Some(16702), added: 17197, mode: MaxEncodedLen) - /// Storage: Democracy DepositOf (r:1 w:1) - /// Proof: Democracy DepositOf (max_values: None, max_size: Some(3230), added: 5705, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) - /// Storage: Democracy MetadataOf (r:1 w:1) - /// Proof: Democracy MetadataOf (max_values: None, max_size: Some(53), added: 2528, mode: MaxEncodedLen) + /// Storage: `Democracy::PublicProps` (r:1 w:1) + /// Proof: `Democracy::PublicProps` (`max_values`: Some(1), `max_size`: Some(16702), added: 17197, mode: `MaxEncodedLen`) + /// Storage: `Democracy::DepositOf` (r:1 w:1) + /// Proof: `Democracy::DepositOf` (`max_values`: None, `max_size`: Some(3230), added: 5705, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `Democracy::MetadataOf` (r:1 w:1) + /// Proof: `Democracy::MetadataOf` (`max_values`: None, `max_size`: Some(53), added: 2528, mode: `MaxEncodedLen`) fn cancel_proposal() -> Weight { // Proof Size summary in bytes: - // Measured: `5821` + // Measured: `5854` // Estimated: `18187` - // Minimum execution time: 92_255_000 picoseconds. - Weight::from_parts(93_704_000, 18187) + // Minimum execution time: 82_141_000 picoseconds. + Weight::from_parts(83_511_000, 18187) .saturating_add(T::DbWeight::get().reads(4_u64)) .saturating_add(T::DbWeight::get().writes(4_u64)) } - /// Storage: Democracy MetadataOf (r:1 w:1) - /// Proof: Democracy MetadataOf (max_values: None, max_size: Some(53), added: 2528, mode: MaxEncodedLen) - /// Storage: Democracy ReferendumInfoOf (r:0 w:1) - /// Proof: Democracy ReferendumInfoOf (max_values: None, max_size: Some(201), added: 2676, mode: MaxEncodedLen) + /// Storage: `Democracy::MetadataOf` (r:1 w:1) + /// Proof: `Democracy::MetadataOf` (`max_values`: None, `max_size`: Some(53), added: 2528, mode: `MaxEncodedLen`) + /// Storage: `Democracy::ReferendumInfoOf` (r:0 w:1) + /// Proof: `Democracy::ReferendumInfoOf` (`max_values`: None, `max_size`: Some(201), added: 2676, mode: `MaxEncodedLen`) fn cancel_referendum() -> Weight { // Proof Size summary in bytes: - // Measured: `271` + // Measured: `304` // Estimated: `3518` - // Minimum execution time: 19_623_000 picoseconds. - Weight::from_parts(20_545_000, 3518) + // Minimum execution time: 16_650_000 picoseconds. + Weight::from_parts(17_140_000, 3518) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } - /// Storage: Democracy LowestUnbaked (r:1 w:1) - /// Proof: Democracy LowestUnbaked (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: Democracy ReferendumCount (r:1 w:0) - /// Proof: Democracy ReferendumCount (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: Democracy ReferendumInfoOf (r:99 w:0) - /// Proof: Democracy ReferendumInfoOf (max_values: None, max_size: Some(201), added: 2676, mode: MaxEncodedLen) + /// Storage: `Democracy::LowestUnbaked` (r:1 w:1) + /// Proof: `Democracy::LowestUnbaked` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `Democracy::ReferendumCount` (r:1 w:0) + /// Proof: `Democracy::ReferendumCount` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `Democracy::ReferendumInfoOf` (r:99 w:0) + /// Proof: `Democracy::ReferendumInfoOf` (`max_values`: None, `max_size`: Some(201), added: 2676, mode: `MaxEncodedLen`) /// The range of component `r` is `[0, 99]`. fn on_initialize_base(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `244 + r * (86 ±0)` + // Measured: `277 + r * (86 ±0)` // Estimated: `1489 + r * (2676 ±0)` - // Minimum execution time: 7_032_000 picoseconds. - Weight::from_parts(7_931_421, 1489) - // Standard Error: 7_395 - .saturating_add(Weight::from_parts(3_236_964, 0).saturating_mul(r.into())) + // Minimum execution time: 5_308_000 picoseconds. + Weight::from_parts(6_320_667, 1489) + // Standard Error: 6_714 + .saturating_add(Weight::from_parts(3_307_440, 0).saturating_mul(r.into())) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(r.into()))) .saturating_add(T::DbWeight::get().writes(1_u64)) .saturating_add(Weight::from_parts(0, 2676).saturating_mul(r.into())) } - /// Storage: Democracy LowestUnbaked (r:1 w:1) - /// Proof: Democracy LowestUnbaked (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: Democracy ReferendumCount (r:1 w:0) - /// Proof: Democracy ReferendumCount (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: Democracy LastTabledWasExternal (r:1 w:0) - /// Proof: Democracy LastTabledWasExternal (max_values: Some(1), max_size: Some(1), added: 496, mode: MaxEncodedLen) - /// Storage: Democracy NextExternal (r:1 w:0) - /// Proof: Democracy NextExternal (max_values: Some(1), max_size: Some(132), added: 627, mode: MaxEncodedLen) - /// Storage: Democracy PublicProps (r:1 w:0) - /// Proof: Democracy PublicProps (max_values: Some(1), max_size: Some(16702), added: 17197, mode: MaxEncodedLen) - /// Storage: Democracy ReferendumInfoOf (r:99 w:0) - /// Proof: Democracy ReferendumInfoOf (max_values: None, max_size: Some(201), added: 2676, mode: MaxEncodedLen) + /// Storage: `Democracy::LowestUnbaked` (r:1 w:1) + /// Proof: `Democracy::LowestUnbaked` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `Democracy::ReferendumCount` (r:1 w:0) + /// Proof: `Democracy::ReferendumCount` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `Democracy::LastTabledWasExternal` (r:1 w:0) + /// Proof: `Democracy::LastTabledWasExternal` (`max_values`: Some(1), `max_size`: Some(1), added: 496, mode: `MaxEncodedLen`) + /// Storage: `Democracy::NextExternal` (r:1 w:0) + /// Proof: `Democracy::NextExternal` (`max_values`: Some(1), `max_size`: Some(132), added: 627, mode: `MaxEncodedLen`) + /// Storage: `Democracy::PublicProps` (r:1 w:0) + /// Proof: `Democracy::PublicProps` (`max_values`: Some(1), `max_size`: Some(16702), added: 17197, mode: `MaxEncodedLen`) + /// Storage: `Democracy::ReferendumInfoOf` (r:99 w:0) + /// Proof: `Democracy::ReferendumInfoOf` (`max_values`: None, `max_size`: Some(201), added: 2676, mode: `MaxEncodedLen`) /// The range of component `r` is `[0, 99]`. fn on_initialize_base_with_launch_period(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `244 + r * (86 ±0)` + // Measured: `277 + r * (86 ±0)` // Estimated: `18187 + r * (2676 ±0)` - // Minimum execution time: 10_524_000 picoseconds. - Weight::from_parts(10_369_064, 18187) - // Standard Error: 8_385 - .saturating_add(Weight::from_parts(3_242_334, 0).saturating_mul(r.into())) + // Minimum execution time: 8_287_000 picoseconds. + Weight::from_parts(7_834_729, 18187) + // Standard Error: 7_499 + .saturating_add(Weight::from_parts(3_333_021, 0).saturating_mul(r.into())) .saturating_add(T::DbWeight::get().reads(5_u64)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(r.into()))) .saturating_add(T::DbWeight::get().writes(1_u64)) .saturating_add(Weight::from_parts(0, 2676).saturating_mul(r.into())) } - /// Storage: Democracy VotingOf (r:3 w:3) - /// Proof: Democracy VotingOf (max_values: None, max_size: Some(3795), added: 6270, mode: MaxEncodedLen) - /// Storage: Democracy ReferendumInfoOf (r:99 w:99) - /// Proof: Democracy ReferendumInfoOf (max_values: None, max_size: Some(201), added: 2676, mode: MaxEncodedLen) - /// Storage: Balances Locks (r:1 w:1) - /// Proof: Balances Locks (max_values: None, max_size: Some(1299), added: 3774, mode: MaxEncodedLen) - /// Storage: Balances Freezes (r:1 w:0) - /// Proof: Balances Freezes (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen) + /// Storage: `Democracy::VotingOf` (r:3 w:3) + /// Proof: `Democracy::VotingOf` (`max_values`: None, `max_size`: Some(3795), added: 6270, mode: `MaxEncodedLen`) + /// Storage: `Democracy::ReferendumInfoOf` (r:99 w:99) + /// Proof: `Democracy::ReferendumInfoOf` (`max_values`: None, `max_size`: Some(201), added: 2676, mode: `MaxEncodedLen`) + /// Storage: `Balances::Locks` (r:1 w:1) + /// Proof: `Balances::Locks` (`max_values`: None, `max_size`: Some(1299), added: 3774, mode: `MaxEncodedLen`) + /// Storage: `Balances::Freezes` (r:1 w:0) + /// Proof: `Balances::Freezes` (`max_values`: None, `max_size`: Some(67), added: 2542, mode: `MaxEncodedLen`) /// The range of component `r` is `[0, 99]`. fn delegate(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `830 + r * (108 ±0)` + // Measured: `863 + r * (108 ±0)` // Estimated: `19800 + r * (2676 ±0)` - // Minimum execution time: 46_106_000 picoseconds. - Weight::from_parts(48_936_654, 19800) - // Standard Error: 8_879 - .saturating_add(Weight::from_parts(4_708_141, 0).saturating_mul(r.into())) + // Minimum execution time: 40_681_000 picoseconds. + Weight::from_parts(46_603_677, 19800) + // Standard Error: 7_453 + .saturating_add(Weight::from_parts(4_269_926, 0).saturating_mul(r.into())) .saturating_add(T::DbWeight::get().reads(5_u64)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(r.into()))) .saturating_add(T::DbWeight::get().writes(4_u64)) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(r.into()))) .saturating_add(Weight::from_parts(0, 2676).saturating_mul(r.into())) } - /// Storage: Democracy VotingOf (r:2 w:2) - /// Proof: Democracy VotingOf (max_values: None, max_size: Some(3795), added: 6270, mode: MaxEncodedLen) - /// Storage: Democracy ReferendumInfoOf (r:99 w:99) - /// Proof: Democracy ReferendumInfoOf (max_values: None, max_size: Some(201), added: 2676, mode: MaxEncodedLen) + /// Storage: `Democracy::VotingOf` (r:2 w:2) + /// Proof: `Democracy::VotingOf` (`max_values`: None, `max_size`: Some(3795), added: 6270, mode: `MaxEncodedLen`) + /// Storage: `Democracy::ReferendumInfoOf` (r:99 w:99) + /// Proof: `Democracy::ReferendumInfoOf` (`max_values`: None, `max_size`: Some(201), added: 2676, mode: `MaxEncodedLen`) /// The range of component `r` is `[0, 99]`. fn undelegate(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `493 + r * (108 ±0)` + // Measured: `526 + r * (108 ±0)` // Estimated: `13530 + r * (2676 ±0)` - // Minimum execution time: 21_078_000 picoseconds. - Weight::from_parts(22_732_737, 13530) - // Standard Error: 7_969 - .saturating_add(Weight::from_parts(4_626_458, 0).saturating_mul(r.into())) + // Minimum execution time: 18_176_000 picoseconds. + Weight::from_parts(19_473_041, 13530) + // Standard Error: 6_046 + .saturating_add(Weight::from_parts(4_259_914, 0).saturating_mul(r.into())) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(r.into()))) .saturating_add(T::DbWeight::get().writes(2_u64)) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(r.into()))) .saturating_add(Weight::from_parts(0, 2676).saturating_mul(r.into())) } - /// Storage: Democracy PublicProps (r:0 w:1) - /// Proof: Democracy PublicProps (max_values: Some(1), max_size: Some(16702), added: 17197, mode: MaxEncodedLen) + /// Storage: `Democracy::PublicProps` (r:0 w:1) + /// Proof: `Democracy::PublicProps` (`max_values`: Some(1), `max_size`: Some(16702), added: 17197, mode: `MaxEncodedLen`) fn clear_public_proposals() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_229_000 picoseconds. - Weight::from_parts(3_415_000, 0) + // Minimum execution time: 2_828_000 picoseconds. + Weight::from_parts(2_979_000, 0) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: Democracy VotingOf (r:1 w:1) - /// Proof: Democracy VotingOf (max_values: None, max_size: Some(3795), added: 6270, mode: MaxEncodedLen) - /// Storage: Balances Locks (r:1 w:1) - /// Proof: Balances Locks (max_values: None, max_size: Some(1299), added: 3774, mode: MaxEncodedLen) - /// Storage: Balances Freezes (r:1 w:0) - /// Proof: Balances Freezes (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: `Democracy::VotingOf` (r:1 w:1) + /// Proof: `Democracy::VotingOf` (`max_values`: None, `max_size`: Some(3795), added: 6270, mode: `MaxEncodedLen`) + /// Storage: `Balances::Locks` (r:1 w:1) + /// Proof: `Balances::Locks` (`max_values`: None, `max_size`: Some(1299), added: 3774, mode: `MaxEncodedLen`) + /// Storage: `Balances::Freezes` (r:1 w:0) + /// Proof: `Balances::Freezes` (`max_values`: None, `max_size`: Some(67), added: 2542, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) /// The range of component `r` is `[0, 99]`. fn unlock_remove(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `563` + // Measured: `596` // Estimated: `7260` - // Minimum execution time: 25_735_000 picoseconds. - Weight::from_parts(41_341_468, 7260) - // Standard Error: 3_727 - .saturating_add(Weight::from_parts(94_755, 0).saturating_mul(r.into())) + // Minimum execution time: 24_256_000 picoseconds. + Weight::from_parts(35_489_844, 7260) + // Standard Error: 2_809 + .saturating_add(Weight::from_parts(82_542, 0).saturating_mul(r.into())) .saturating_add(T::DbWeight::get().reads(4_u64)) .saturating_add(T::DbWeight::get().writes(3_u64)) } - /// Storage: Democracy VotingOf (r:1 w:1) - /// Proof: Democracy VotingOf (max_values: None, max_size: Some(3795), added: 6270, mode: MaxEncodedLen) - /// Storage: Balances Locks (r:1 w:1) - /// Proof: Balances Locks (max_values: None, max_size: Some(1299), added: 3774, mode: MaxEncodedLen) - /// Storage: Balances Freezes (r:1 w:0) - /// Proof: Balances Freezes (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: `Democracy::VotingOf` (r:1 w:1) + /// Proof: `Democracy::VotingOf` (`max_values`: None, `max_size`: Some(3795), added: 6270, mode: `MaxEncodedLen`) + /// Storage: `Balances::Locks` (r:1 w:1) + /// Proof: `Balances::Locks` (`max_values`: None, `max_size`: Some(1299), added: 3774, mode: `MaxEncodedLen`) + /// Storage: `Balances::Freezes` (r:1 w:0) + /// Proof: `Balances::Freezes` (`max_values`: None, `max_size`: Some(67), added: 2542, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) /// The range of component `r` is `[0, 99]`. fn unlock_set(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `564 + r * (22 ±0)` + // Measured: `597 + r * (22 ±0)` // Estimated: `7260` - // Minimum execution time: 36_233_000 picoseconds. - Weight::from_parts(39_836_017, 7260) - // Standard Error: 1_791 - .saturating_add(Weight::from_parts(132_158, 0).saturating_mul(r.into())) + // Minimum execution time: 32_306_000 picoseconds. + Weight::from_parts(35_288_926, 7260) + // Standard Error: 1_742 + .saturating_add(Weight::from_parts(118_566, 0).saturating_mul(r.into())) .saturating_add(T::DbWeight::get().reads(4_u64)) .saturating_add(T::DbWeight::get().writes(3_u64)) } - /// Storage: Democracy ReferendumInfoOf (r:1 w:1) - /// Proof: Democracy ReferendumInfoOf (max_values: None, max_size: Some(201), added: 2676, mode: MaxEncodedLen) - /// Storage: Democracy VotingOf (r:1 w:1) - /// Proof: Democracy VotingOf (max_values: None, max_size: Some(3795), added: 6270, mode: MaxEncodedLen) + /// Storage: `Democracy::ReferendumInfoOf` (r:1 w:1) + /// Proof: `Democracy::ReferendumInfoOf` (`max_values`: None, `max_size`: Some(201), added: 2676, mode: `MaxEncodedLen`) + /// Storage: `Democracy::VotingOf` (r:1 w:1) + /// Proof: `Democracy::VotingOf` (`max_values`: None, `max_size`: Some(3795), added: 6270, mode: `MaxEncodedLen`) /// The range of component `r` is `[1, 100]`. fn remove_vote(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `728 + r * (26 ±0)` + // Measured: `761 + r * (26 ±0)` // Estimated: `7260` - // Minimum execution time: 16_081_000 picoseconds. - Weight::from_parts(19_624_101, 7260) - // Standard Error: 1_639 - .saturating_add(Weight::from_parts(133_630, 0).saturating_mul(r.into())) + // Minimum execution time: 15_269_000 picoseconds. + Weight::from_parts(18_595_547, 7260) + // Standard Error: 1_952 + .saturating_add(Weight::from_parts(122_967, 0).saturating_mul(r.into())) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } - /// Storage: Democracy ReferendumInfoOf (r:1 w:1) - /// Proof: Democracy ReferendumInfoOf (max_values: None, max_size: Some(201), added: 2676, mode: MaxEncodedLen) - /// Storage: Democracy VotingOf (r:1 w:1) - /// Proof: Democracy VotingOf (max_values: None, max_size: Some(3795), added: 6270, mode: MaxEncodedLen) + /// Storage: `Democracy::ReferendumInfoOf` (r:1 w:1) + /// Proof: `Democracy::ReferendumInfoOf` (`max_values`: None, `max_size`: Some(201), added: 2676, mode: `MaxEncodedLen`) + /// Storage: `Democracy::VotingOf` (r:1 w:1) + /// Proof: `Democracy::VotingOf` (`max_values`: None, `max_size`: Some(3795), added: 6270, mode: `MaxEncodedLen`) /// The range of component `r` is `[1, 100]`. fn remove_other_vote(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `728 + r * (26 ±0)` + // Measured: `761 + r * (26 ±0)` // Estimated: `7260` - // Minimum execution time: 15_634_000 picoseconds. - Weight::from_parts(19_573_407, 7260) - // Standard Error: 1_790 - .saturating_add(Weight::from_parts(139_707, 0).saturating_mul(r.into())) + // Minimum execution time: 15_213_000 picoseconds. + Weight::from_parts(18_870_570, 7260) + // Standard Error: 1_802 + .saturating_add(Weight::from_parts(124_205, 0).saturating_mul(r.into())) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } - /// Storage: Democracy NextExternal (r:1 w:0) - /// Proof: Democracy NextExternal (max_values: Some(1), max_size: Some(132), added: 627, mode: MaxEncodedLen) - /// Storage: Preimage StatusFor (r:1 w:0) - /// Proof: Preimage StatusFor (max_values: None, max_size: Some(91), added: 2566, mode: MaxEncodedLen) - /// Storage: Democracy MetadataOf (r:0 w:1) - /// Proof: Democracy MetadataOf (max_values: None, max_size: Some(53), added: 2528, mode: MaxEncodedLen) + /// Storage: `Democracy::NextExternal` (r:1 w:0) + /// Proof: `Democracy::NextExternal` (`max_values`: Some(1), `max_size`: Some(132), added: 627, mode: `MaxEncodedLen`) + /// Storage: `Preimage::StatusFor` (r:1 w:0) + /// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) + /// Storage: `Preimage::RequestStatusFor` (r:1 w:0) + /// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) + /// Storage: `Democracy::MetadataOf` (r:0 w:1) + /// Proof: `Democracy::MetadataOf` (`max_values`: None, `max_size`: Some(53), added: 2528, mode: `MaxEncodedLen`) fn set_external_metadata() -> Weight { // Proof Size summary in bytes: - // Measured: `356` + // Measured: `456` // Estimated: `3556` - // Minimum execution time: 18_344_000 picoseconds. - Weight::from_parts(18_727_000, 3556) - .saturating_add(T::DbWeight::get().reads(2_u64)) + // Minimum execution time: 17_827_000 picoseconds. + Weight::from_parts(18_255_000, 3556) + .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: Democracy NextExternal (r:1 w:0) - /// Proof: Democracy NextExternal (max_values: Some(1), max_size: Some(132), added: 627, mode: MaxEncodedLen) - /// Storage: Democracy MetadataOf (r:1 w:1) - /// Proof: Democracy MetadataOf (max_values: None, max_size: Some(53), added: 2528, mode: MaxEncodedLen) + /// Storage: `Democracy::NextExternal` (r:1 w:0) + /// Proof: `Democracy::NextExternal` (`max_values`: Some(1), `max_size`: Some(132), added: 627, mode: `MaxEncodedLen`) + /// Storage: `Democracy::MetadataOf` (r:1 w:1) + /// Proof: `Democracy::MetadataOf` (`max_values`: None, `max_size`: Some(53), added: 2528, mode: `MaxEncodedLen`) fn clear_external_metadata() -> Weight { // Proof Size summary in bytes: - // Measured: `286` + // Measured: `319` // Estimated: `3518` - // Minimum execution time: 16_497_000 picoseconds. - Weight::from_parts(16_892_000, 3518) + // Minimum execution time: 14_205_000 picoseconds. + Weight::from_parts(14_631_000, 3518) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: Democracy PublicProps (r:1 w:0) - /// Proof: Democracy PublicProps (max_values: Some(1), max_size: Some(16702), added: 17197, mode: MaxEncodedLen) - /// Storage: Preimage StatusFor (r:1 w:0) - /// Proof: Preimage StatusFor (max_values: None, max_size: Some(91), added: 2566, mode: MaxEncodedLen) - /// Storage: Democracy MetadataOf (r:0 w:1) - /// Proof: Democracy MetadataOf (max_values: None, max_size: Some(53), added: 2528, mode: MaxEncodedLen) + /// Storage: `Democracy::PublicProps` (r:1 w:0) + /// Proof: `Democracy::PublicProps` (`max_values`: Some(1), `max_size`: Some(16702), added: 17197, mode: `MaxEncodedLen`) + /// Storage: `Preimage::StatusFor` (r:1 w:0) + /// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) + /// Storage: `Preimage::RequestStatusFor` (r:1 w:0) + /// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) + /// Storage: `Democracy::MetadataOf` (r:0 w:1) + /// Proof: `Democracy::MetadataOf` (`max_values`: None, `max_size`: Some(53), added: 2528, mode: `MaxEncodedLen`) fn set_proposal_metadata() -> Weight { // Proof Size summary in bytes: - // Measured: `4888` + // Measured: `4988` // Estimated: `18187` - // Minimum execution time: 39_517_000 picoseconds. - Weight::from_parts(40_632_000, 18187) - .saturating_add(T::DbWeight::get().reads(2_u64)) + // Minimum execution time: 40_868_000 picoseconds. + Weight::from_parts(41_688_000, 18187) + .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: Democracy PublicProps (r:1 w:0) - /// Proof: Democracy PublicProps (max_values: Some(1), max_size: Some(16702), added: 17197, mode: MaxEncodedLen) - /// Storage: Democracy MetadataOf (r:1 w:1) - /// Proof: Democracy MetadataOf (max_values: None, max_size: Some(53), added: 2528, mode: MaxEncodedLen) + /// Storage: `Democracy::PublicProps` (r:1 w:0) + /// Proof: `Democracy::PublicProps` (`max_values`: Some(1), `max_size`: Some(16702), added: 17197, mode: `MaxEncodedLen`) + /// Storage: `Democracy::MetadataOf` (r:1 w:1) + /// Proof: `Democracy::MetadataOf` (`max_values`: None, `max_size`: Some(53), added: 2528, mode: `MaxEncodedLen`) fn clear_proposal_metadata() -> Weight { // Proof Size summary in bytes: - // Measured: `4822` + // Measured: `4855` // Estimated: `18187` - // Minimum execution time: 37_108_000 picoseconds. - Weight::from_parts(37_599_000, 18187) + // Minimum execution time: 36_573_000 picoseconds. + Weight::from_parts(37_017_000, 18187) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: Preimage StatusFor (r:1 w:0) - /// Proof: Preimage StatusFor (max_values: None, max_size: Some(91), added: 2566, mode: MaxEncodedLen) - /// Storage: Democracy MetadataOf (r:0 w:1) - /// Proof: Democracy MetadataOf (max_values: None, max_size: Some(53), added: 2528, mode: MaxEncodedLen) + /// Storage: `Preimage::StatusFor` (r:1 w:0) + /// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) + /// Storage: `Preimage::RequestStatusFor` (r:1 w:0) + /// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) + /// Storage: `Democracy::MetadataOf` (r:0 w:1) + /// Proof: `Democracy::MetadataOf` (`max_values`: None, `max_size`: Some(53), added: 2528, mode: `MaxEncodedLen`) fn set_referendum_metadata() -> Weight { // Proof Size summary in bytes: - // Measured: `144` + // Measured: `211` // Estimated: `3556` - // Minimum execution time: 13_997_000 picoseconds. - Weight::from_parts(14_298_000, 3556) - .saturating_add(T::DbWeight::get().reads(1_u64)) + // Minimum execution time: 13_741_000 picoseconds. + Weight::from_parts(14_337_000, 3556) + .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: Democracy ReferendumInfoOf (r:1 w:0) - /// Proof: Democracy ReferendumInfoOf (max_values: None, max_size: Some(201), added: 2676, mode: MaxEncodedLen) - /// Storage: Democracy MetadataOf (r:1 w:1) - /// Proof: Democracy MetadataOf (max_values: None, max_size: Some(53), added: 2528, mode: MaxEncodedLen) + /// Storage: `Democracy::ReferendumInfoOf` (r:1 w:0) + /// Proof: `Democracy::ReferendumInfoOf` (`max_values`: None, `max_size`: Some(201), added: 2676, mode: `MaxEncodedLen`) + /// Storage: `Democracy::MetadataOf` (r:1 w:1) + /// Proof: `Democracy::MetadataOf` (`max_values`: None, `max_size`: Some(53), added: 2528, mode: `MaxEncodedLen`) fn clear_referendum_metadata() -> Weight { // Proof Size summary in bytes: - // Measured: `302` + // Measured: `335` // Estimated: `3666` - // Minimum execution time: 18_122_000 picoseconds. - Weight::from_parts(18_655_000, 3666) + // Minimum execution time: 16_358_000 picoseconds. + Weight::from_parts(17_157_000, 3666) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } } -// For backwards compatibility and tests +// For backwards compatibility and tests. impl WeightInfo for () { - /// Storage: Democracy PublicPropCount (r:1 w:1) - /// Proof: Democracy PublicPropCount (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: Democracy PublicProps (r:1 w:1) - /// Proof: Democracy PublicProps (max_values: Some(1), max_size: Some(16702), added: 17197, mode: MaxEncodedLen) - /// Storage: Democracy Blacklist (r:1 w:0) - /// Proof: Democracy Blacklist (max_values: None, max_size: Some(3238), added: 5713, mode: MaxEncodedLen) - /// Storage: Democracy DepositOf (r:0 w:1) - /// Proof: Democracy DepositOf (max_values: None, max_size: Some(3230), added: 5705, mode: MaxEncodedLen) + /// Storage: `Democracy::PublicPropCount` (r:1 w:1) + /// Proof: `Democracy::PublicPropCount` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `Democracy::PublicProps` (r:1 w:1) + /// Proof: `Democracy::PublicProps` (`max_values`: Some(1), `max_size`: Some(16702), added: 17197, mode: `MaxEncodedLen`) + /// Storage: `Democracy::Blacklist` (r:1 w:0) + /// Proof: `Democracy::Blacklist` (`max_values`: None, `max_size`: Some(3238), added: 5713, mode: `MaxEncodedLen`) + /// Storage: `Democracy::DepositOf` (r:0 w:1) + /// Proof: `Democracy::DepositOf` (`max_values`: None, `max_size`: Some(3230), added: 5705, mode: `MaxEncodedLen`) fn propose() -> Weight { // Proof Size summary in bytes: - // Measured: `4801` + // Measured: `4834` // Estimated: `18187` - // Minimum execution time: 49_339_000 picoseconds. - Weight::from_parts(50_942_000, 18187) + // Minimum execution time: 42_266_000 picoseconds. + Weight::from_parts(43_382_000, 18187) .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(3_u64)) } - /// Storage: Democracy DepositOf (r:1 w:1) - /// Proof: Democracy DepositOf (max_values: None, max_size: Some(3230), added: 5705, mode: MaxEncodedLen) + /// Storage: `Democracy::DepositOf` (r:1 w:1) + /// Proof: `Democracy::DepositOf` (`max_values`: None, `max_size`: Some(3230), added: 5705, mode: `MaxEncodedLen`) fn second() -> Weight { // Proof Size summary in bytes: - // Measured: `3556` + // Measured: `3589` // Estimated: `6695` - // Minimum execution time: 43_291_000 picoseconds. - Weight::from_parts(44_856_000, 6695) + // Minimum execution time: 37_765_000 picoseconds. + Weight::from_parts(38_679_000, 6695) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Democracy ReferendumInfoOf (r:1 w:1) - /// Proof: Democracy ReferendumInfoOf (max_values: None, max_size: Some(201), added: 2676, mode: MaxEncodedLen) - /// Storage: Democracy VotingOf (r:1 w:1) - /// Proof: Democracy VotingOf (max_values: None, max_size: Some(3795), added: 6270, mode: MaxEncodedLen) - /// Storage: Balances Locks (r:1 w:1) - /// Proof: Balances Locks (max_values: None, max_size: Some(1299), added: 3774, mode: MaxEncodedLen) - /// Storage: Balances Freezes (r:1 w:0) - /// Proof: Balances Freezes (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen) + /// Storage: `Democracy::ReferendumInfoOf` (r:1 w:1) + /// Proof: `Democracy::ReferendumInfoOf` (`max_values`: None, `max_size`: Some(201), added: 2676, mode: `MaxEncodedLen`) + /// Storage: `Democracy::VotingOf` (r:1 w:1) + /// Proof: `Democracy::VotingOf` (`max_values`: None, `max_size`: Some(3795), added: 6270, mode: `MaxEncodedLen`) + /// Storage: `Balances::Locks` (r:1 w:1) + /// Proof: `Balances::Locks` (`max_values`: None, `max_size`: Some(1299), added: 3774, mode: `MaxEncodedLen`) + /// Storage: `Balances::Freezes` (r:1 w:0) + /// Proof: `Balances::Freezes` (`max_values`: None, `max_size`: Some(67), added: 2542, mode: `MaxEncodedLen`) fn vote_new() -> Weight { // Proof Size summary in bytes: - // Measured: `3470` + // Measured: `3503` // Estimated: `7260` - // Minimum execution time: 61_890_000 picoseconds. - Weight::from_parts(63_626_000, 7260) + // Minimum execution time: 56_200_000 picoseconds. + Weight::from_parts(57_320_000, 7260) .saturating_add(RocksDbWeight::get().reads(4_u64)) .saturating_add(RocksDbWeight::get().writes(3_u64)) } - /// Storage: Democracy ReferendumInfoOf (r:1 w:1) - /// Proof: Democracy ReferendumInfoOf (max_values: None, max_size: Some(201), added: 2676, mode: MaxEncodedLen) - /// Storage: Democracy VotingOf (r:1 w:1) - /// Proof: Democracy VotingOf (max_values: None, max_size: Some(3795), added: 6270, mode: MaxEncodedLen) - /// Storage: Balances Locks (r:1 w:1) - /// Proof: Balances Locks (max_values: None, max_size: Some(1299), added: 3774, mode: MaxEncodedLen) - /// Storage: Balances Freezes (r:1 w:0) - /// Proof: Balances Freezes (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen) + /// Storage: `Democracy::ReferendumInfoOf` (r:1 w:1) + /// Proof: `Democracy::ReferendumInfoOf` (`max_values`: None, `max_size`: Some(201), added: 2676, mode: `MaxEncodedLen`) + /// Storage: `Democracy::VotingOf` (r:1 w:1) + /// Proof: `Democracy::VotingOf` (`max_values`: None, `max_size`: Some(3795), added: 6270, mode: `MaxEncodedLen`) + /// Storage: `Balances::Locks` (r:1 w:1) + /// Proof: `Balances::Locks` (`max_values`: None, `max_size`: Some(1299), added: 3774, mode: `MaxEncodedLen`) + /// Storage: `Balances::Freezes` (r:1 w:0) + /// Proof: `Balances::Freezes` (`max_values`: None, `max_size`: Some(67), added: 2542, mode: `MaxEncodedLen`) fn vote_existing() -> Weight { // Proof Size summary in bytes: - // Measured: `3492` + // Measured: `3525` // Estimated: `7260` - // Minimum execution time: 67_802_000 picoseconds. - Weight::from_parts(69_132_000, 7260) + // Minimum execution time: 58_633_000 picoseconds. + Weight::from_parts(60_809_000, 7260) .saturating_add(RocksDbWeight::get().reads(4_u64)) .saturating_add(RocksDbWeight::get().writes(3_u64)) } - /// Storage: Democracy ReferendumInfoOf (r:1 w:1) - /// Proof: Democracy ReferendumInfoOf (max_values: None, max_size: Some(201), added: 2676, mode: MaxEncodedLen) - /// Storage: Democracy Cancellations (r:1 w:1) - /// Proof: Democracy Cancellations (max_values: None, max_size: Some(33), added: 2508, mode: MaxEncodedLen) - /// Storage: Democracy MetadataOf (r:1 w:1) - /// Proof: Democracy MetadataOf (max_values: None, max_size: Some(53), added: 2528, mode: MaxEncodedLen) + /// Storage: `Democracy::ReferendumInfoOf` (r:1 w:1) + /// Proof: `Democracy::ReferendumInfoOf` (`max_values`: None, `max_size`: Some(201), added: 2676, mode: `MaxEncodedLen`) + /// Storage: `Democracy::Cancellations` (r:1 w:1) + /// Proof: `Democracy::Cancellations` (`max_values`: None, `max_size`: Some(33), added: 2508, mode: `MaxEncodedLen`) + /// Storage: `Democracy::MetadataOf` (r:1 w:1) + /// Proof: `Democracy::MetadataOf` (`max_values`: None, `max_size`: Some(53), added: 2528, mode: `MaxEncodedLen`) fn emergency_cancel() -> Weight { // Proof Size summary in bytes: - // Measured: `366` + // Measured: `399` // Estimated: `3666` - // Minimum execution time: 25_757_000 picoseconds. - Weight::from_parts(27_226_000, 3666) + // Minimum execution time: 23_908_000 picoseconds. + Weight::from_parts(24_659_000, 3666) .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(3_u64)) } - /// Storage: Democracy PublicProps (r:1 w:1) - /// Proof: Democracy PublicProps (max_values: Some(1), max_size: Some(16702), added: 17197, mode: MaxEncodedLen) - /// Storage: Democracy DepositOf (r:1 w:1) - /// Proof: Democracy DepositOf (max_values: None, max_size: Some(3230), added: 5705, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) - /// Storage: Democracy MetadataOf (r:3 w:1) - /// Proof: Democracy MetadataOf (max_values: None, max_size: Some(53), added: 2528, mode: MaxEncodedLen) - /// Storage: Democracy NextExternal (r:1 w:1) - /// Proof: Democracy NextExternal (max_values: Some(1), max_size: Some(132), added: 627, mode: MaxEncodedLen) - /// Storage: Democracy ReferendumInfoOf (r:1 w:1) - /// Proof: Democracy ReferendumInfoOf (max_values: None, max_size: Some(201), added: 2676, mode: MaxEncodedLen) - /// Storage: Democracy Blacklist (r:0 w:1) - /// Proof: Democracy Blacklist (max_values: None, max_size: Some(3238), added: 5713, mode: MaxEncodedLen) + /// Storage: `Democracy::PublicProps` (r:1 w:1) + /// Proof: `Democracy::PublicProps` (`max_values`: Some(1), `max_size`: Some(16702), added: 17197, mode: `MaxEncodedLen`) + /// Storage: `Democracy::DepositOf` (r:1 w:1) + /// Proof: `Democracy::DepositOf` (`max_values`: None, `max_size`: Some(3230), added: 5705, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `Democracy::MetadataOf` (r:3 w:1) + /// Proof: `Democracy::MetadataOf` (`max_values`: None, `max_size`: Some(53), added: 2528, mode: `MaxEncodedLen`) + /// Storage: `Democracy::NextExternal` (r:1 w:1) + /// Proof: `Democracy::NextExternal` (`max_values`: Some(1), `max_size`: Some(132), added: 627, mode: `MaxEncodedLen`) + /// Storage: `Democracy::ReferendumInfoOf` (r:1 w:1) + /// Proof: `Democracy::ReferendumInfoOf` (`max_values`: None, `max_size`: Some(201), added: 2676, mode: `MaxEncodedLen`) + /// Storage: `Democracy::Blacklist` (r:0 w:1) + /// Proof: `Democracy::Blacklist` (`max_values`: None, `max_size`: Some(3238), added: 5713, mode: `MaxEncodedLen`) fn blacklist() -> Weight { // Proof Size summary in bytes: - // Measured: `5910` + // Measured: `5943` // Estimated: `18187` - // Minimum execution time: 113_060_000 picoseconds. - Weight::from_parts(114_813_000, 18187) + // Minimum execution time: 100_268_000 picoseconds. + Weight::from_parts(101_309_000, 18187) .saturating_add(RocksDbWeight::get().reads(8_u64)) .saturating_add(RocksDbWeight::get().writes(7_u64)) } - /// Storage: Democracy NextExternal (r:1 w:1) - /// Proof: Democracy NextExternal (max_values: Some(1), max_size: Some(132), added: 627, mode: MaxEncodedLen) - /// Storage: Democracy Blacklist (r:1 w:0) - /// Proof: Democracy Blacklist (max_values: None, max_size: Some(3238), added: 5713, mode: MaxEncodedLen) + /// Storage: `Democracy::NextExternal` (r:1 w:1) + /// Proof: `Democracy::NextExternal` (`max_values`: Some(1), `max_size`: Some(132), added: 627, mode: `MaxEncodedLen`) + /// Storage: `Democracy::Blacklist` (r:1 w:0) + /// Proof: `Democracy::Blacklist` (`max_values`: None, `max_size`: Some(3238), added: 5713, mode: `MaxEncodedLen`) fn external_propose() -> Weight { // Proof Size summary in bytes: - // Measured: `3416` + // Measured: `3449` // Estimated: `6703` - // Minimum execution time: 13_413_000 picoseconds. - Weight::from_parts(13_794_000, 6703) + // Minimum execution time: 12_143_000 picoseconds. + Weight::from_parts(12_843_000, 6703) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Democracy NextExternal (r:0 w:1) - /// Proof: Democracy NextExternal (max_values: Some(1), max_size: Some(132), added: 627, mode: MaxEncodedLen) + /// Storage: `Democracy::NextExternal` (r:0 w:1) + /// Proof: `Democracy::NextExternal` (`max_values`: Some(1), `max_size`: Some(132), added: 627, mode: `MaxEncodedLen`) fn external_propose_majority() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_213_000 picoseconds. - Weight::from_parts(3_429_000, 0) + // Minimum execution time: 2_792_000 picoseconds. + Weight::from_parts(2_922_000, 0) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Democracy NextExternal (r:0 w:1) - /// Proof: Democracy NextExternal (max_values: Some(1), max_size: Some(132), added: 627, mode: MaxEncodedLen) + /// Storage: `Democracy::NextExternal` (r:0 w:1) + /// Proof: `Democracy::NextExternal` (`max_values`: Some(1), `max_size`: Some(132), added: 627, mode: `MaxEncodedLen`) fn external_propose_default() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_280_000 picoseconds. - Weight::from_parts(3_389_000, 0) + // Minimum execution time: 2_792_000 picoseconds. + Weight::from_parts(2_953_000, 0) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Democracy NextExternal (r:1 w:1) - /// Proof: Democracy NextExternal (max_values: Some(1), max_size: Some(132), added: 627, mode: MaxEncodedLen) - /// Storage: Democracy ReferendumCount (r:1 w:1) - /// Proof: Democracy ReferendumCount (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: Democracy MetadataOf (r:1 w:2) - /// Proof: Democracy MetadataOf (max_values: None, max_size: Some(53), added: 2528, mode: MaxEncodedLen) - /// Storage: Democracy ReferendumInfoOf (r:0 w:1) - /// Proof: Democracy ReferendumInfoOf (max_values: None, max_size: Some(201), added: 2676, mode: MaxEncodedLen) + /// Storage: `Democracy::NextExternal` (r:1 w:1) + /// Proof: `Democracy::NextExternal` (`max_values`: Some(1), `max_size`: Some(132), added: 627, mode: `MaxEncodedLen`) + /// Storage: `Democracy::ReferendumCount` (r:1 w:1) + /// Proof: `Democracy::ReferendumCount` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `Democracy::MetadataOf` (r:1 w:2) + /// Proof: `Democracy::MetadataOf` (`max_values`: None, `max_size`: Some(53), added: 2528, mode: `MaxEncodedLen`) + /// Storage: `Democracy::ReferendumInfoOf` (r:0 w:1) + /// Proof: `Democracy::ReferendumInfoOf` (`max_values`: None, `max_size`: Some(201), added: 2676, mode: `MaxEncodedLen`) fn fast_track() -> Weight { // Proof Size summary in bytes: - // Measured: `286` + // Measured: `319` // Estimated: `3518` - // Minimum execution time: 28_142_000 picoseconds. - Weight::from_parts(28_862_000, 3518) + // Minimum execution time: 23_948_000 picoseconds. + Weight::from_parts(24_773_000, 3518) .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(5_u64)) } - /// Storage: Democracy NextExternal (r:1 w:1) - /// Proof: Democracy NextExternal (max_values: Some(1), max_size: Some(132), added: 627, mode: MaxEncodedLen) - /// Storage: Democracy Blacklist (r:1 w:1) - /// Proof: Democracy Blacklist (max_values: None, max_size: Some(3238), added: 5713, mode: MaxEncodedLen) - /// Storage: Democracy MetadataOf (r:1 w:1) - /// Proof: Democracy MetadataOf (max_values: None, max_size: Some(53), added: 2528, mode: MaxEncodedLen) + /// Storage: `Democracy::NextExternal` (r:1 w:1) + /// Proof: `Democracy::NextExternal` (`max_values`: Some(1), `max_size`: Some(132), added: 627, mode: `MaxEncodedLen`) + /// Storage: `Democracy::Blacklist` (r:1 w:1) + /// Proof: `Democracy::Blacklist` (`max_values`: None, `max_size`: Some(3238), added: 5713, mode: `MaxEncodedLen`) + /// Storage: `Democracy::MetadataOf` (r:1 w:1) + /// Proof: `Democracy::MetadataOf` (`max_values`: None, `max_size`: Some(53), added: 2528, mode: `MaxEncodedLen`) fn veto_external() -> Weight { // Proof Size summary in bytes: - // Measured: `3519` + // Measured: `3552` // Estimated: `6703` - // Minimum execution time: 32_395_000 picoseconds. - Weight::from_parts(33_617_000, 6703) + // Minimum execution time: 27_233_000 picoseconds. + Weight::from_parts(28_327_000, 6703) .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(3_u64)) } - /// Storage: Democracy PublicProps (r:1 w:1) - /// Proof: Democracy PublicProps (max_values: Some(1), max_size: Some(16702), added: 17197, mode: MaxEncodedLen) - /// Storage: Democracy DepositOf (r:1 w:1) - /// Proof: Democracy DepositOf (max_values: None, max_size: Some(3230), added: 5705, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) - /// Storage: Democracy MetadataOf (r:1 w:1) - /// Proof: Democracy MetadataOf (max_values: None, max_size: Some(53), added: 2528, mode: MaxEncodedLen) + /// Storage: `Democracy::PublicProps` (r:1 w:1) + /// Proof: `Democracy::PublicProps` (`max_values`: Some(1), `max_size`: Some(16702), added: 17197, mode: `MaxEncodedLen`) + /// Storage: `Democracy::DepositOf` (r:1 w:1) + /// Proof: `Democracy::DepositOf` (`max_values`: None, `max_size`: Some(3230), added: 5705, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `Democracy::MetadataOf` (r:1 w:1) + /// Proof: `Democracy::MetadataOf` (`max_values`: None, `max_size`: Some(53), added: 2528, mode: `MaxEncodedLen`) fn cancel_proposal() -> Weight { // Proof Size summary in bytes: - // Measured: `5821` + // Measured: `5854` // Estimated: `18187` - // Minimum execution time: 92_255_000 picoseconds. - Weight::from_parts(93_704_000, 18187) + // Minimum execution time: 82_141_000 picoseconds. + Weight::from_parts(83_511_000, 18187) .saturating_add(RocksDbWeight::get().reads(4_u64)) .saturating_add(RocksDbWeight::get().writes(4_u64)) } - /// Storage: Democracy MetadataOf (r:1 w:1) - /// Proof: Democracy MetadataOf (max_values: None, max_size: Some(53), added: 2528, mode: MaxEncodedLen) - /// Storage: Democracy ReferendumInfoOf (r:0 w:1) - /// Proof: Democracy ReferendumInfoOf (max_values: None, max_size: Some(201), added: 2676, mode: MaxEncodedLen) + /// Storage: `Democracy::MetadataOf` (r:1 w:1) + /// Proof: `Democracy::MetadataOf` (`max_values`: None, `max_size`: Some(53), added: 2528, mode: `MaxEncodedLen`) + /// Storage: `Democracy::ReferendumInfoOf` (r:0 w:1) + /// Proof: `Democracy::ReferendumInfoOf` (`max_values`: None, `max_size`: Some(201), added: 2676, mode: `MaxEncodedLen`) fn cancel_referendum() -> Weight { // Proof Size summary in bytes: - // Measured: `271` + // Measured: `304` // Estimated: `3518` - // Minimum execution time: 19_623_000 picoseconds. - Weight::from_parts(20_545_000, 3518) + // Minimum execution time: 16_650_000 picoseconds. + Weight::from_parts(17_140_000, 3518) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } - /// Storage: Democracy LowestUnbaked (r:1 w:1) - /// Proof: Democracy LowestUnbaked (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: Democracy ReferendumCount (r:1 w:0) - /// Proof: Democracy ReferendumCount (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: Democracy ReferendumInfoOf (r:99 w:0) - /// Proof: Democracy ReferendumInfoOf (max_values: None, max_size: Some(201), added: 2676, mode: MaxEncodedLen) + /// Storage: `Democracy::LowestUnbaked` (r:1 w:1) + /// Proof: `Democracy::LowestUnbaked` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `Democracy::ReferendumCount` (r:1 w:0) + /// Proof: `Democracy::ReferendumCount` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `Democracy::ReferendumInfoOf` (r:99 w:0) + /// Proof: `Democracy::ReferendumInfoOf` (`max_values`: None, `max_size`: Some(201), added: 2676, mode: `MaxEncodedLen`) /// The range of component `r` is `[0, 99]`. fn on_initialize_base(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `244 + r * (86 ±0)` + // Measured: `277 + r * (86 ±0)` // Estimated: `1489 + r * (2676 ±0)` - // Minimum execution time: 7_032_000 picoseconds. - Weight::from_parts(7_931_421, 1489) - // Standard Error: 7_395 - .saturating_add(Weight::from_parts(3_236_964, 0).saturating_mul(r.into())) + // Minimum execution time: 5_308_000 picoseconds. + Weight::from_parts(6_320_667, 1489) + // Standard Error: 6_714 + .saturating_add(Weight::from_parts(3_307_440, 0).saturating_mul(r.into())) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().reads((1_u64).saturating_mul(r.into()))) .saturating_add(RocksDbWeight::get().writes(1_u64)) .saturating_add(Weight::from_parts(0, 2676).saturating_mul(r.into())) } - /// Storage: Democracy LowestUnbaked (r:1 w:1) - /// Proof: Democracy LowestUnbaked (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: Democracy ReferendumCount (r:1 w:0) - /// Proof: Democracy ReferendumCount (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: Democracy LastTabledWasExternal (r:1 w:0) - /// Proof: Democracy LastTabledWasExternal (max_values: Some(1), max_size: Some(1), added: 496, mode: MaxEncodedLen) - /// Storage: Democracy NextExternal (r:1 w:0) - /// Proof: Democracy NextExternal (max_values: Some(1), max_size: Some(132), added: 627, mode: MaxEncodedLen) - /// Storage: Democracy PublicProps (r:1 w:0) - /// Proof: Democracy PublicProps (max_values: Some(1), max_size: Some(16702), added: 17197, mode: MaxEncodedLen) - /// Storage: Democracy ReferendumInfoOf (r:99 w:0) - /// Proof: Democracy ReferendumInfoOf (max_values: None, max_size: Some(201), added: 2676, mode: MaxEncodedLen) + /// Storage: `Democracy::LowestUnbaked` (r:1 w:1) + /// Proof: `Democracy::LowestUnbaked` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `Democracy::ReferendumCount` (r:1 w:0) + /// Proof: `Democracy::ReferendumCount` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `Democracy::LastTabledWasExternal` (r:1 w:0) + /// Proof: `Democracy::LastTabledWasExternal` (`max_values`: Some(1), `max_size`: Some(1), added: 496, mode: `MaxEncodedLen`) + /// Storage: `Democracy::NextExternal` (r:1 w:0) + /// Proof: `Democracy::NextExternal` (`max_values`: Some(1), `max_size`: Some(132), added: 627, mode: `MaxEncodedLen`) + /// Storage: `Democracy::PublicProps` (r:1 w:0) + /// Proof: `Democracy::PublicProps` (`max_values`: Some(1), `max_size`: Some(16702), added: 17197, mode: `MaxEncodedLen`) + /// Storage: `Democracy::ReferendumInfoOf` (r:99 w:0) + /// Proof: `Democracy::ReferendumInfoOf` (`max_values`: None, `max_size`: Some(201), added: 2676, mode: `MaxEncodedLen`) /// The range of component `r` is `[0, 99]`. fn on_initialize_base_with_launch_period(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `244 + r * (86 ±0)` + // Measured: `277 + r * (86 ±0)` // Estimated: `18187 + r * (2676 ±0)` - // Minimum execution time: 10_524_000 picoseconds. - Weight::from_parts(10_369_064, 18187) - // Standard Error: 8_385 - .saturating_add(Weight::from_parts(3_242_334, 0).saturating_mul(r.into())) + // Minimum execution time: 8_287_000 picoseconds. + Weight::from_parts(7_834_729, 18187) + // Standard Error: 7_499 + .saturating_add(Weight::from_parts(3_333_021, 0).saturating_mul(r.into())) .saturating_add(RocksDbWeight::get().reads(5_u64)) .saturating_add(RocksDbWeight::get().reads((1_u64).saturating_mul(r.into()))) .saturating_add(RocksDbWeight::get().writes(1_u64)) .saturating_add(Weight::from_parts(0, 2676).saturating_mul(r.into())) } - /// Storage: Democracy VotingOf (r:3 w:3) - /// Proof: Democracy VotingOf (max_values: None, max_size: Some(3795), added: 6270, mode: MaxEncodedLen) - /// Storage: Democracy ReferendumInfoOf (r:99 w:99) - /// Proof: Democracy ReferendumInfoOf (max_values: None, max_size: Some(201), added: 2676, mode: MaxEncodedLen) - /// Storage: Balances Locks (r:1 w:1) - /// Proof: Balances Locks (max_values: None, max_size: Some(1299), added: 3774, mode: MaxEncodedLen) - /// Storage: Balances Freezes (r:1 w:0) - /// Proof: Balances Freezes (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen) + /// Storage: `Democracy::VotingOf` (r:3 w:3) + /// Proof: `Democracy::VotingOf` (`max_values`: None, `max_size`: Some(3795), added: 6270, mode: `MaxEncodedLen`) + /// Storage: `Democracy::ReferendumInfoOf` (r:99 w:99) + /// Proof: `Democracy::ReferendumInfoOf` (`max_values`: None, `max_size`: Some(201), added: 2676, mode: `MaxEncodedLen`) + /// Storage: `Balances::Locks` (r:1 w:1) + /// Proof: `Balances::Locks` (`max_values`: None, `max_size`: Some(1299), added: 3774, mode: `MaxEncodedLen`) + /// Storage: `Balances::Freezes` (r:1 w:0) + /// Proof: `Balances::Freezes` (`max_values`: None, `max_size`: Some(67), added: 2542, mode: `MaxEncodedLen`) /// The range of component `r` is `[0, 99]`. fn delegate(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `830 + r * (108 ±0)` + // Measured: `863 + r * (108 ±0)` // Estimated: `19800 + r * (2676 ±0)` - // Minimum execution time: 46_106_000 picoseconds. - Weight::from_parts(48_936_654, 19800) - // Standard Error: 8_879 - .saturating_add(Weight::from_parts(4_708_141, 0).saturating_mul(r.into())) + // Minimum execution time: 40_681_000 picoseconds. + Weight::from_parts(46_603_677, 19800) + // Standard Error: 7_453 + .saturating_add(Weight::from_parts(4_269_926, 0).saturating_mul(r.into())) .saturating_add(RocksDbWeight::get().reads(5_u64)) .saturating_add(RocksDbWeight::get().reads((1_u64).saturating_mul(r.into()))) .saturating_add(RocksDbWeight::get().writes(4_u64)) .saturating_add(RocksDbWeight::get().writes((1_u64).saturating_mul(r.into()))) .saturating_add(Weight::from_parts(0, 2676).saturating_mul(r.into())) } - /// Storage: Democracy VotingOf (r:2 w:2) - /// Proof: Democracy VotingOf (max_values: None, max_size: Some(3795), added: 6270, mode: MaxEncodedLen) - /// Storage: Democracy ReferendumInfoOf (r:99 w:99) - /// Proof: Democracy ReferendumInfoOf (max_values: None, max_size: Some(201), added: 2676, mode: MaxEncodedLen) + /// Storage: `Democracy::VotingOf` (r:2 w:2) + /// Proof: `Democracy::VotingOf` (`max_values`: None, `max_size`: Some(3795), added: 6270, mode: `MaxEncodedLen`) + /// Storage: `Democracy::ReferendumInfoOf` (r:99 w:99) + /// Proof: `Democracy::ReferendumInfoOf` (`max_values`: None, `max_size`: Some(201), added: 2676, mode: `MaxEncodedLen`) /// The range of component `r` is `[0, 99]`. fn undelegate(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `493 + r * (108 ±0)` + // Measured: `526 + r * (108 ±0)` // Estimated: `13530 + r * (2676 ±0)` - // Minimum execution time: 21_078_000 picoseconds. - Weight::from_parts(22_732_737, 13530) - // Standard Error: 7_969 - .saturating_add(Weight::from_parts(4_626_458, 0).saturating_mul(r.into())) + // Minimum execution time: 18_176_000 picoseconds. + Weight::from_parts(19_473_041, 13530) + // Standard Error: 6_046 + .saturating_add(Weight::from_parts(4_259_914, 0).saturating_mul(r.into())) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().reads((1_u64).saturating_mul(r.into()))) .saturating_add(RocksDbWeight::get().writes(2_u64)) .saturating_add(RocksDbWeight::get().writes((1_u64).saturating_mul(r.into()))) .saturating_add(Weight::from_parts(0, 2676).saturating_mul(r.into())) } - /// Storage: Democracy PublicProps (r:0 w:1) - /// Proof: Democracy PublicProps (max_values: Some(1), max_size: Some(16702), added: 17197, mode: MaxEncodedLen) + /// Storage: `Democracy::PublicProps` (r:0 w:1) + /// Proof: `Democracy::PublicProps` (`max_values`: Some(1), `max_size`: Some(16702), added: 17197, mode: `MaxEncodedLen`) fn clear_public_proposals() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_229_000 picoseconds. - Weight::from_parts(3_415_000, 0) + // Minimum execution time: 2_828_000 picoseconds. + Weight::from_parts(2_979_000, 0) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Democracy VotingOf (r:1 w:1) - /// Proof: Democracy VotingOf (max_values: None, max_size: Some(3795), added: 6270, mode: MaxEncodedLen) - /// Storage: Balances Locks (r:1 w:1) - /// Proof: Balances Locks (max_values: None, max_size: Some(1299), added: 3774, mode: MaxEncodedLen) - /// Storage: Balances Freezes (r:1 w:0) - /// Proof: Balances Freezes (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: `Democracy::VotingOf` (r:1 w:1) + /// Proof: `Democracy::VotingOf` (`max_values`: None, `max_size`: Some(3795), added: 6270, mode: `MaxEncodedLen`) + /// Storage: `Balances::Locks` (r:1 w:1) + /// Proof: `Balances::Locks` (`max_values`: None, `max_size`: Some(1299), added: 3774, mode: `MaxEncodedLen`) + /// Storage: `Balances::Freezes` (r:1 w:0) + /// Proof: `Balances::Freezes` (`max_values`: None, `max_size`: Some(67), added: 2542, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) /// The range of component `r` is `[0, 99]`. fn unlock_remove(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `563` + // Measured: `596` // Estimated: `7260` - // Minimum execution time: 25_735_000 picoseconds. - Weight::from_parts(41_341_468, 7260) - // Standard Error: 3_727 - .saturating_add(Weight::from_parts(94_755, 0).saturating_mul(r.into())) + // Minimum execution time: 24_256_000 picoseconds. + Weight::from_parts(35_489_844, 7260) + // Standard Error: 2_809 + .saturating_add(Weight::from_parts(82_542, 0).saturating_mul(r.into())) .saturating_add(RocksDbWeight::get().reads(4_u64)) .saturating_add(RocksDbWeight::get().writes(3_u64)) } - /// Storage: Democracy VotingOf (r:1 w:1) - /// Proof: Democracy VotingOf (max_values: None, max_size: Some(3795), added: 6270, mode: MaxEncodedLen) - /// Storage: Balances Locks (r:1 w:1) - /// Proof: Balances Locks (max_values: None, max_size: Some(1299), added: 3774, mode: MaxEncodedLen) - /// Storage: Balances Freezes (r:1 w:0) - /// Proof: Balances Freezes (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: `Democracy::VotingOf` (r:1 w:1) + /// Proof: `Democracy::VotingOf` (`max_values`: None, `max_size`: Some(3795), added: 6270, mode: `MaxEncodedLen`) + /// Storage: `Balances::Locks` (r:1 w:1) + /// Proof: `Balances::Locks` (`max_values`: None, `max_size`: Some(1299), added: 3774, mode: `MaxEncodedLen`) + /// Storage: `Balances::Freezes` (r:1 w:0) + /// Proof: `Balances::Freezes` (`max_values`: None, `max_size`: Some(67), added: 2542, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) /// The range of component `r` is `[0, 99]`. fn unlock_set(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `564 + r * (22 ±0)` + // Measured: `597 + r * (22 ±0)` // Estimated: `7260` - // Minimum execution time: 36_233_000 picoseconds. - Weight::from_parts(39_836_017, 7260) - // Standard Error: 1_791 - .saturating_add(Weight::from_parts(132_158, 0).saturating_mul(r.into())) + // Minimum execution time: 32_306_000 picoseconds. + Weight::from_parts(35_288_926, 7260) + // Standard Error: 1_742 + .saturating_add(Weight::from_parts(118_566, 0).saturating_mul(r.into())) .saturating_add(RocksDbWeight::get().reads(4_u64)) .saturating_add(RocksDbWeight::get().writes(3_u64)) } - /// Storage: Democracy ReferendumInfoOf (r:1 w:1) - /// Proof: Democracy ReferendumInfoOf (max_values: None, max_size: Some(201), added: 2676, mode: MaxEncodedLen) - /// Storage: Democracy VotingOf (r:1 w:1) - /// Proof: Democracy VotingOf (max_values: None, max_size: Some(3795), added: 6270, mode: MaxEncodedLen) + /// Storage: `Democracy::ReferendumInfoOf` (r:1 w:1) + /// Proof: `Democracy::ReferendumInfoOf` (`max_values`: None, `max_size`: Some(201), added: 2676, mode: `MaxEncodedLen`) + /// Storage: `Democracy::VotingOf` (r:1 w:1) + /// Proof: `Democracy::VotingOf` (`max_values`: None, `max_size`: Some(3795), added: 6270, mode: `MaxEncodedLen`) /// The range of component `r` is `[1, 100]`. fn remove_vote(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `728 + r * (26 ±0)` + // Measured: `761 + r * (26 ±0)` // Estimated: `7260` - // Minimum execution time: 16_081_000 picoseconds. - Weight::from_parts(19_624_101, 7260) - // Standard Error: 1_639 - .saturating_add(Weight::from_parts(133_630, 0).saturating_mul(r.into())) + // Minimum execution time: 15_269_000 picoseconds. + Weight::from_parts(18_595_547, 7260) + // Standard Error: 1_952 + .saturating_add(Weight::from_parts(122_967, 0).saturating_mul(r.into())) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } - /// Storage: Democracy ReferendumInfoOf (r:1 w:1) - /// Proof: Democracy ReferendumInfoOf (max_values: None, max_size: Some(201), added: 2676, mode: MaxEncodedLen) - /// Storage: Democracy VotingOf (r:1 w:1) - /// Proof: Democracy VotingOf (max_values: None, max_size: Some(3795), added: 6270, mode: MaxEncodedLen) + /// Storage: `Democracy::ReferendumInfoOf` (r:1 w:1) + /// Proof: `Democracy::ReferendumInfoOf` (`max_values`: None, `max_size`: Some(201), added: 2676, mode: `MaxEncodedLen`) + /// Storage: `Democracy::VotingOf` (r:1 w:1) + /// Proof: `Democracy::VotingOf` (`max_values`: None, `max_size`: Some(3795), added: 6270, mode: `MaxEncodedLen`) /// The range of component `r` is `[1, 100]`. fn remove_other_vote(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `728 + r * (26 ±0)` + // Measured: `761 + r * (26 ±0)` // Estimated: `7260` - // Minimum execution time: 15_634_000 picoseconds. - Weight::from_parts(19_573_407, 7260) - // Standard Error: 1_790 - .saturating_add(Weight::from_parts(139_707, 0).saturating_mul(r.into())) + // Minimum execution time: 15_213_000 picoseconds. + Weight::from_parts(18_870_570, 7260) + // Standard Error: 1_802 + .saturating_add(Weight::from_parts(124_205, 0).saturating_mul(r.into())) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } - /// Storage: Democracy NextExternal (r:1 w:0) - /// Proof: Democracy NextExternal (max_values: Some(1), max_size: Some(132), added: 627, mode: MaxEncodedLen) - /// Storage: Preimage StatusFor (r:1 w:0) - /// Proof: Preimage StatusFor (max_values: None, max_size: Some(91), added: 2566, mode: MaxEncodedLen) - /// Storage: Democracy MetadataOf (r:0 w:1) - /// Proof: Democracy MetadataOf (max_values: None, max_size: Some(53), added: 2528, mode: MaxEncodedLen) + /// Storage: `Democracy::NextExternal` (r:1 w:0) + /// Proof: `Democracy::NextExternal` (`max_values`: Some(1), `max_size`: Some(132), added: 627, mode: `MaxEncodedLen`) + /// Storage: `Preimage::StatusFor` (r:1 w:0) + /// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) + /// Storage: `Preimage::RequestStatusFor` (r:1 w:0) + /// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) + /// Storage: `Democracy::MetadataOf` (r:0 w:1) + /// Proof: `Democracy::MetadataOf` (`max_values`: None, `max_size`: Some(53), added: 2528, mode: `MaxEncodedLen`) fn set_external_metadata() -> Weight { // Proof Size summary in bytes: - // Measured: `356` + // Measured: `456` // Estimated: `3556` - // Minimum execution time: 18_344_000 picoseconds. - Weight::from_parts(18_727_000, 3556) - .saturating_add(RocksDbWeight::get().reads(2_u64)) + // Minimum execution time: 17_827_000 picoseconds. + Weight::from_parts(18_255_000, 3556) + .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Democracy NextExternal (r:1 w:0) - /// Proof: Democracy NextExternal (max_values: Some(1), max_size: Some(132), added: 627, mode: MaxEncodedLen) - /// Storage: Democracy MetadataOf (r:1 w:1) - /// Proof: Democracy MetadataOf (max_values: None, max_size: Some(53), added: 2528, mode: MaxEncodedLen) + /// Storage: `Democracy::NextExternal` (r:1 w:0) + /// Proof: `Democracy::NextExternal` (`max_values`: Some(1), `max_size`: Some(132), added: 627, mode: `MaxEncodedLen`) + /// Storage: `Democracy::MetadataOf` (r:1 w:1) + /// Proof: `Democracy::MetadataOf` (`max_values`: None, `max_size`: Some(53), added: 2528, mode: `MaxEncodedLen`) fn clear_external_metadata() -> Weight { // Proof Size summary in bytes: - // Measured: `286` + // Measured: `319` // Estimated: `3518` - // Minimum execution time: 16_497_000 picoseconds. - Weight::from_parts(16_892_000, 3518) + // Minimum execution time: 14_205_000 picoseconds. + Weight::from_parts(14_631_000, 3518) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Democracy PublicProps (r:1 w:0) - /// Proof: Democracy PublicProps (max_values: Some(1), max_size: Some(16702), added: 17197, mode: MaxEncodedLen) - /// Storage: Preimage StatusFor (r:1 w:0) - /// Proof: Preimage StatusFor (max_values: None, max_size: Some(91), added: 2566, mode: MaxEncodedLen) - /// Storage: Democracy MetadataOf (r:0 w:1) - /// Proof: Democracy MetadataOf (max_values: None, max_size: Some(53), added: 2528, mode: MaxEncodedLen) + /// Storage: `Democracy::PublicProps` (r:1 w:0) + /// Proof: `Democracy::PublicProps` (`max_values`: Some(1), `max_size`: Some(16702), added: 17197, mode: `MaxEncodedLen`) + /// Storage: `Preimage::StatusFor` (r:1 w:0) + /// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) + /// Storage: `Preimage::RequestStatusFor` (r:1 w:0) + /// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) + /// Storage: `Democracy::MetadataOf` (r:0 w:1) + /// Proof: `Democracy::MetadataOf` (`max_values`: None, `max_size`: Some(53), added: 2528, mode: `MaxEncodedLen`) fn set_proposal_metadata() -> Weight { // Proof Size summary in bytes: - // Measured: `4888` + // Measured: `4988` // Estimated: `18187` - // Minimum execution time: 39_517_000 picoseconds. - Weight::from_parts(40_632_000, 18187) - .saturating_add(RocksDbWeight::get().reads(2_u64)) + // Minimum execution time: 40_868_000 picoseconds. + Weight::from_parts(41_688_000, 18187) + .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Democracy PublicProps (r:1 w:0) - /// Proof: Democracy PublicProps (max_values: Some(1), max_size: Some(16702), added: 17197, mode: MaxEncodedLen) - /// Storage: Democracy MetadataOf (r:1 w:1) - /// Proof: Democracy MetadataOf (max_values: None, max_size: Some(53), added: 2528, mode: MaxEncodedLen) + /// Storage: `Democracy::PublicProps` (r:1 w:0) + /// Proof: `Democracy::PublicProps` (`max_values`: Some(1), `max_size`: Some(16702), added: 17197, mode: `MaxEncodedLen`) + /// Storage: `Democracy::MetadataOf` (r:1 w:1) + /// Proof: `Democracy::MetadataOf` (`max_values`: None, `max_size`: Some(53), added: 2528, mode: `MaxEncodedLen`) fn clear_proposal_metadata() -> Weight { // Proof Size summary in bytes: - // Measured: `4822` + // Measured: `4855` // Estimated: `18187` - // Minimum execution time: 37_108_000 picoseconds. - Weight::from_parts(37_599_000, 18187) + // Minimum execution time: 36_573_000 picoseconds. + Weight::from_parts(37_017_000, 18187) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Preimage StatusFor (r:1 w:0) - /// Proof: Preimage StatusFor (max_values: None, max_size: Some(91), added: 2566, mode: MaxEncodedLen) - /// Storage: Democracy MetadataOf (r:0 w:1) - /// Proof: Democracy MetadataOf (max_values: None, max_size: Some(53), added: 2528, mode: MaxEncodedLen) + /// Storage: `Preimage::StatusFor` (r:1 w:0) + /// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) + /// Storage: `Preimage::RequestStatusFor` (r:1 w:0) + /// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) + /// Storage: `Democracy::MetadataOf` (r:0 w:1) + /// Proof: `Democracy::MetadataOf` (`max_values`: None, `max_size`: Some(53), added: 2528, mode: `MaxEncodedLen`) fn set_referendum_metadata() -> Weight { // Proof Size summary in bytes: - // Measured: `144` + // Measured: `211` // Estimated: `3556` - // Minimum execution time: 13_997_000 picoseconds. - Weight::from_parts(14_298_000, 3556) - .saturating_add(RocksDbWeight::get().reads(1_u64)) + // Minimum execution time: 13_741_000 picoseconds. + Weight::from_parts(14_337_000, 3556) + .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Democracy ReferendumInfoOf (r:1 w:0) - /// Proof: Democracy ReferendumInfoOf (max_values: None, max_size: Some(201), added: 2676, mode: MaxEncodedLen) - /// Storage: Democracy MetadataOf (r:1 w:1) - /// Proof: Democracy MetadataOf (max_values: None, max_size: Some(53), added: 2528, mode: MaxEncodedLen) + /// Storage: `Democracy::ReferendumInfoOf` (r:1 w:0) + /// Proof: `Democracy::ReferendumInfoOf` (`max_values`: None, `max_size`: Some(201), added: 2676, mode: `MaxEncodedLen`) + /// Storage: `Democracy::MetadataOf` (r:1 w:1) + /// Proof: `Democracy::MetadataOf` (`max_values`: None, `max_size`: Some(53), added: 2528, mode: `MaxEncodedLen`) fn clear_referendum_metadata() -> Weight { // Proof Size summary in bytes: - // Measured: `302` + // Measured: `335` // Estimated: `3666` - // Minimum execution time: 18_122_000 picoseconds. - Weight::from_parts(18_655_000, 3666) + // Minimum execution time: 16_358_000 picoseconds. + Weight::from_parts(17_157_000, 3666) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } diff --git a/substrate/frame/election-provider-multi-phase/Cargo.toml b/substrate/frame/election-provider-multi-phase/Cargo.toml index 91bdb3c027ffb45a6ec5f4eca6b1f61ee454cdf6..2074b51f50f475f077f814593da74b31b5dba6e0 100644 --- a/substrate/frame/election-provider-multi-phase/Cargo.toml +++ b/substrate/frame/election-provider-multi-phase/Cargo.toml @@ -18,10 +18,10 @@ targets = ["x86_64-unknown-linux-gnu"] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = [ "derive", ] } -scale-info = { version = "2.10.0", default-features = false, features = [ +scale-info = { version = "2.11.1", default-features = false, features = [ "derive", ] } -log = { version = "0.4.17", default-features = false } +log = { workspace = true } frame-support = { path = "../support", default-features = false } frame-system = { path = "../system", default-features = false } @@ -38,7 +38,7 @@ frame-election-provider-support = { path = "../election-provider-support", defau frame-benchmarking = { path = "../benchmarking", default-features = false, optional = true } pallet-election-provider-support-benchmarking = { path = "../election-provider-support/benchmarking", default-features = false, optional = true } rand = { version = "0.8.5", default-features = false, features = ["alloc", "small_rng"], optional = true } -strum = { version = "0.24.1", default-features = false, features = ["derive"], optional = true } +strum = { version = "0.26.2", default-features = false, features = ["derive"], optional = true } [dev-dependencies] parking_lot = "0.12.1" diff --git a/substrate/frame/election-provider-multi-phase/src/benchmarking.rs b/substrate/frame/election-provider-multi-phase/src/benchmarking.rs index 4a2855f1361f2c7f098a023e74344e1062be7506..957ae51b8f1daf89eb47045c82ca09a6a64bdf93 100644 --- a/substrate/frame/election-provider-multi-phase/src/benchmarking.rs +++ b/substrate/frame/election-provider-multi-phase/src/benchmarking.rs @@ -496,7 +496,7 @@ frame_benchmarking::benchmarks! { let (_, stake, _) = voters[*idx]; stake }).unwrap_or_default(); - sp_std::cmp::Reverse(stake) + core::cmp::Reverse(stake) }); let mut index_assignments = assignments diff --git a/substrate/frame/election-provider-multi-phase/src/helpers.rs b/substrate/frame/election-provider-multi-phase/src/helpers.rs index 57d580e93016cf9be6e1dede6ebbeb95c1609826..a3f27fc18f07730ebbe9907ddd897a17ccb876e2 100644 --- a/substrate/frame/election-provider-multi-phase/src/helpers.rs +++ b/substrate/frame/election-provider-multi-phase/src/helpers.rs @@ -160,7 +160,7 @@ pub fn target_index_fn_linear( } /// Create a function that can map a voter index ([`SolutionVoterIndexOf`]) to the actual voter -/// account using a linearly indexible snapshot. +/// account using a linearly indexable snapshot. pub fn voter_at_fn( snapshot: &Vec>, ) -> impl Fn(SolutionVoterIndexOf) -> Option + '_ { @@ -172,7 +172,7 @@ pub fn voter_at_fn( } /// Create a function that can map a target index ([`SolutionTargetIndexOf`]) to the actual target -/// account using a linearly indexible snapshot. +/// account using a linearly indexable snapshot. pub fn target_at_fn( snapshot: &Vec, ) -> impl Fn(SolutionTargetIndexOf) -> Option + '_ { diff --git a/substrate/frame/election-provider-multi-phase/src/lib.rs b/substrate/frame/election-provider-multi-phase/src/lib.rs index 4f43f89abed222f963156c2f5afaebb8288bf45a..63b4c49cdfe47a882560d4cd076a4cb113b26b1d 100644 --- a/substrate/frame/election-provider-multi-phase/src/lib.rs +++ b/substrate/frame/election-provider-multi-phase/src/lib.rs @@ -586,10 +586,8 @@ pub mod pallet { type EstimateCallFee: EstimateCallFee, BalanceOf>; /// Duration of the unsigned phase. - #[pallet::constant] type UnsignedPhase: Get>; /// Duration of the signed phase. - #[pallet::constant] type SignedPhase: Get>; /// The minimum amount of improvement to the solution score that defines a solution as @@ -933,7 +931,7 @@ pub mod pallet { .expect(error_message); // Store the newly received solution. - log!(info, "queued unsigned solution with score {:?}", ready.score); + log!(debug, "queued unsigned solution with score {:?}", ready.score); let ejected_a_solution = >::exists(); >::put(ready); Self::deposit_event(Event::SolutionStored { @@ -1134,7 +1132,7 @@ pub mod pallet { /// A solution was stored with the given compute. /// /// The `origin` indicates the origin of the solution. If `origin` is `Some(AccountId)`, - /// the stored solution was submited in the signed phase by a miner with the `AccountId`. + /// the stored solution was submitted in the signed phase by a miner with the `AccountId`. /// Otherwise, the solution was stored either during the unsigned phase or by /// `T::ForceOrigin`. The `bool` is `true` when a previous solution was ejected to make /// room for this one. @@ -1192,7 +1190,7 @@ pub mod pallet { BoundNotMet, /// Submitted solution has too many winners TooManyWinners, - /// Sumission was prepared for a different round. + /// Submission was prepared for a different round. PreDispatchDifferentRound, } @@ -1343,7 +1341,7 @@ pub mod pallet { #[pallet::getter(fn minimum_untrusted_score)] pub type MinimumUntrustedScore = StorageValue<_, ElectionScore>; - /// The current storage version. + /// The in-code storage version. /// /// v1: https://github.com/paritytech/substrate/pull/12237/ const STORAGE_VERSION: StorageVersion = StorageVersion::new(1); diff --git a/substrate/frame/election-provider-multi-phase/src/migrations.rs b/substrate/frame/election-provider-multi-phase/src/migrations.rs index 50b821e6db6ae8c7a2cc68192f9dd8cb39e9f460..156f1c02e27cd23e3e37014650fdff66115cd18f 100644 --- a/substrate/frame/election-provider-multi-phase/src/migrations.rs +++ b/substrate/frame/election-provider-multi-phase/src/migrations.rs @@ -27,12 +27,12 @@ pub mod v1 { pub struct MigrateToV1(sp_std::marker::PhantomData); impl OnRuntimeUpgrade for MigrateToV1 { fn on_runtime_upgrade() -> Weight { - let current = Pallet::::current_storage_version(); + let current = Pallet::::in_code_storage_version(); let onchain = Pallet::::on_chain_storage_version(); log!( info, - "Running migration with current storage version {:?} / onchain {:?}", + "Running migration with in-code storage version {:?} / onchain {:?}", current, onchain ); diff --git a/substrate/frame/election-provider-multi-phase/src/mock.rs b/substrate/frame/election-provider-multi-phase/src/mock.rs index 18dcd7061c1fc35c7cc64134c33363b746e9baf8..92b87d92e99b16c959e9d719e91251da94fa7576 100644 --- a/substrate/frame/election-provider-multi-phase/src/mock.rs +++ b/substrate/frame/election-provider-multi-phase/src/mock.rs @@ -208,7 +208,7 @@ pub fn witness() -> SolutionOrSnapshotSize { .unwrap_or_default() } -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Runtime { type SS58Prefix = (); type BaseCallFilter = frame_support::traits::Everything; diff --git a/substrate/frame/election-provider-multi-phase/src/unsigned.rs b/substrate/frame/election-provider-multi-phase/src/unsigned.rs index 94348181334061a3c2de81b90742f53c4390ddc9..8b25815eca13ec72491bdb1cb9135a69c540001f 100644 --- a/substrate/frame/election-provider-multi-phase/src/unsigned.rs +++ b/substrate/frame/election-provider-multi-phase/src/unsigned.rs @@ -1445,7 +1445,7 @@ mod tests { ) .unwrap(); let solution = RawSolution { solution: raw, score, round: MultiPhase::round() }; - // 12 is not better than 12. We need score of atleast 13 to be accepted. + // 12 is not better than 12. We need score of at least 13 to be accepted. assert_eq!(solution.score.minimal_stake, 12); // submitting this will panic. assert_noop!( @@ -1483,7 +1483,7 @@ mod tests { )); // trial 4: a solution who's minimal stake is 17, i.e. 4 better than the last - // soluton. + // solution. let result = ElectionResult { winners: vec![(10, 12)], assignments: vec![ diff --git a/substrate/frame/election-provider-multi-phase/src/weights.rs b/substrate/frame/election-provider-multi-phase/src/weights.rs index be578fac8c435769de3b030a4c7fb20832786b83..1398ed047784e16080e1972252526064f778569c 100644 --- a/substrate/frame/election-provider-multi-phase/src/weights.rs +++ b/substrate/frame/election-provider-multi-phase/src/weights.rs @@ -15,16 +15,16 @@ // See the License for the specific language governing permissions and // limitations under the License. -//! Autogenerated weights for pallet_election_provider_multi_phase +//! Autogenerated weights for `pallet_election_provider_multi_phase` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-06-16, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-04-09, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-e8ezs4ez-project-145-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("dev"), DB CACHE: 1024 +//! HOSTNAME: `runner-anb7yjbi-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: `1024` // Executed Command: -// ./target/production/substrate +// ./target/production/substrate-node // benchmark // pallet // --chain=dev @@ -35,12 +35,11 @@ // --no-median-slopes // --no-min-squares // --extrinsic=* -// --execution=wasm // --wasm-execution=compiled // --heap-pages=4096 -// --output=./frame/election-provider-multi-phase/src/weights.rs -// --header=./HEADER-APACHE2 -// --template=./.maintain/frame-weight-template.hbs +// --output=./substrate/frame/election-provider-multi-phase/src/weights.rs +// --header=./substrate/HEADER-APACHE2 +// --template=./substrate/.maintain/frame-weight-template.hbs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -50,7 +49,7 @@ use frame_support::{traits::Get, weights::{Weight, constants::RocksDbWeight}}; use core::marker::PhantomData; -/// Weight functions needed for pallet_election_provider_multi_phase. +/// Weight functions needed for `pallet_election_provider_multi_phase`. pub trait WeightInfo { fn on_initialize_nothing() -> Weight; fn on_initialize_open_signed() -> Weight; @@ -64,169 +63,173 @@ pub trait WeightInfo { fn feasibility_check(v: u32, t: u32, a: u32, d: u32, ) -> Weight; } -/// Weights for pallet_election_provider_multi_phase using the Substrate node and recommended hardware. +/// Weights for `pallet_election_provider_multi_phase` using the Substrate node and recommended hardware. pub struct SubstrateWeight(PhantomData); impl WeightInfo for SubstrateWeight { - /// Storage: Staking CurrentEra (r:1 w:0) - /// Proof: Staking CurrentEra (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: Staking CurrentPlannedSession (r:1 w:0) - /// Proof: Staking CurrentPlannedSession (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: Staking ErasStartSessionIndex (r:1 w:0) - /// Proof: Staking ErasStartSessionIndex (max_values: None, max_size: Some(16), added: 2491, mode: MaxEncodedLen) - /// Storage: Babe EpochIndex (r:1 w:0) - /// Proof: Babe EpochIndex (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - /// Storage: Babe GenesisSlot (r:1 w:0) - /// Proof: Babe GenesisSlot (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - /// Storage: Babe CurrentSlot (r:1 w:0) - /// Proof: Babe CurrentSlot (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - /// Storage: Staking ForceEra (r:1 w:0) - /// Proof: Staking ForceEra (max_values: Some(1), max_size: Some(1), added: 496, mode: MaxEncodedLen) - /// Storage: ElectionProviderMultiPhase CurrentPhase (r:1 w:0) - /// Proof Skipped: ElectionProviderMultiPhase CurrentPhase (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: `Staking::CurrentEra` (r:1 w:0) + /// Proof: `Staking::CurrentEra` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `Staking::CurrentPlannedSession` (r:1 w:0) + /// Proof: `Staking::CurrentPlannedSession` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `Staking::ErasStartSessionIndex` (r:1 w:0) + /// Proof: `Staking::ErasStartSessionIndex` (`max_values`: None, `max_size`: Some(16), added: 2491, mode: `MaxEncodedLen`) + /// Storage: `Babe::EpochIndex` (r:1 w:0) + /// Proof: `Babe::EpochIndex` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `MaxEncodedLen`) + /// Storage: `Babe::GenesisSlot` (r:1 w:0) + /// Proof: `Babe::GenesisSlot` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `MaxEncodedLen`) + /// Storage: `Babe::CurrentSlot` (r:1 w:0) + /// Proof: `Babe::CurrentSlot` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `MaxEncodedLen`) + /// Storage: `Staking::ForceEra` (r:1 w:0) + /// Proof: `Staking::ForceEra` (`max_values`: Some(1), `max_size`: Some(1), added: 496, mode: `MaxEncodedLen`) + /// Storage: `ElectionProviderMultiPhase::CurrentPhase` (r:1 w:0) + /// Proof: `ElectionProviderMultiPhase::CurrentPhase` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) fn on_initialize_nothing() -> Weight { // Proof Size summary in bytes: - // Measured: `1028` + // Measured: `1061` // Estimated: `3481` - // Minimum execution time: 22_089_000 picoseconds. - Weight::from_parts(22_677_000, 3481) + // Minimum execution time: 19_436_000 picoseconds. + Weight::from_parts(20_138_000, 3481) .saturating_add(T::DbWeight::get().reads(8_u64)) } - /// Storage: ElectionProviderMultiPhase Round (r:1 w:0) - /// Proof Skipped: ElectionProviderMultiPhase Round (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ElectionProviderMultiPhase CurrentPhase (r:1 w:1) - /// Proof Skipped: ElectionProviderMultiPhase CurrentPhase (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: `ElectionProviderMultiPhase::Round` (r:1 w:0) + /// Proof: `ElectionProviderMultiPhase::Round` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ElectionProviderMultiPhase::CurrentPhase` (r:1 w:1) + /// Proof: `ElectionProviderMultiPhase::CurrentPhase` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) fn on_initialize_open_signed() -> Weight { // Proof Size summary in bytes: // Measured: `148` // Estimated: `1633` - // Minimum execution time: 11_986_000 picoseconds. - Weight::from_parts(12_445_000, 1633) + // Minimum execution time: 8_356_000 picoseconds. + Weight::from_parts(8_708_000, 1633) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: ElectionProviderMultiPhase Round (r:1 w:0) - /// Proof Skipped: ElectionProviderMultiPhase Round (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ElectionProviderMultiPhase CurrentPhase (r:1 w:1) - /// Proof Skipped: ElectionProviderMultiPhase CurrentPhase (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: `ElectionProviderMultiPhase::Round` (r:1 w:0) + /// Proof: `ElectionProviderMultiPhase::Round` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ElectionProviderMultiPhase::CurrentPhase` (r:1 w:1) + /// Proof: `ElectionProviderMultiPhase::CurrentPhase` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) fn on_initialize_open_unsigned() -> Weight { // Proof Size summary in bytes: // Measured: `148` // Estimated: `1633` - // Minimum execution time: 12_988_000 picoseconds. - Weight::from_parts(13_281_000, 1633) + // Minimum execution time: 9_088_000 picoseconds. + Weight::from_parts(9_382_000, 1633) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) - /// Storage: ElectionProviderMultiPhase QueuedSolution (r:0 w:1) - /// Proof Skipped: ElectionProviderMultiPhase QueuedSolution (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `ElectionProviderMultiPhase::QueuedSolution` (r:0 w:1) + /// Proof: `ElectionProviderMultiPhase::QueuedSolution` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) fn finalize_signed_phase_accept_solution() -> Weight { // Proof Size summary in bytes: // Measured: `174` // Estimated: `3593` - // Minimum execution time: 32_659_000 picoseconds. - Weight::from_parts(33_281_000, 3593) + // Minimum execution time: 25_899_000 picoseconds. + Weight::from_parts(26_456_000, 3593) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) fn finalize_signed_phase_reject_solution() -> Weight { // Proof Size summary in bytes: // Measured: `174` // Estimated: `3593` - // Minimum execution time: 22_471_000 picoseconds. - Weight::from_parts(23_046_000, 3593) + // Minimum execution time: 17_671_000 picoseconds. + Weight::from_parts(18_131_000, 3593) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: ElectionProviderMultiPhase SnapshotMetadata (r:0 w:1) - /// Proof Skipped: ElectionProviderMultiPhase SnapshotMetadata (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ElectionProviderMultiPhase DesiredTargets (r:0 w:1) - /// Proof Skipped: ElectionProviderMultiPhase DesiredTargets (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ElectionProviderMultiPhase Snapshot (r:0 w:1) - /// Proof Skipped: ElectionProviderMultiPhase Snapshot (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: `ElectionProviderMultiPhase::SnapshotMetadata` (r:0 w:1) + /// Proof: `ElectionProviderMultiPhase::SnapshotMetadata` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ElectionProviderMultiPhase::DesiredTargets` (r:0 w:1) + /// Proof: `ElectionProviderMultiPhase::DesiredTargets` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ElectionProviderMultiPhase::Snapshot` (r:0 w:1) + /// Proof: `ElectionProviderMultiPhase::Snapshot` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) /// The range of component `v` is `[1000, 2000]`. /// The range of component `t` is `[500, 1000]`. fn create_snapshot_internal(v: u32, _t: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 262_360_000 picoseconds. - Weight::from_parts(279_313_000, 0) - // Standard Error: 2_384 - .saturating_add(Weight::from_parts(176_415, 0).saturating_mul(v.into())) + // Minimum execution time: 251_900_000 picoseconds. + Weight::from_parts(257_174_000, 0) + // Standard Error: 1_606 + .saturating_add(Weight::from_parts(250_961, 0).saturating_mul(v.into())) .saturating_add(T::DbWeight::get().writes(3_u64)) } - /// Storage: ElectionProviderMultiPhase SignedSubmissionIndices (r:1 w:1) - /// Proof Skipped: ElectionProviderMultiPhase SignedSubmissionIndices (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ElectionProviderMultiPhase SignedSubmissionNextIndex (r:1 w:1) - /// Proof Skipped: ElectionProviderMultiPhase SignedSubmissionNextIndex (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ElectionProviderMultiPhase SnapshotMetadata (r:1 w:1) - /// Proof Skipped: ElectionProviderMultiPhase SnapshotMetadata (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ElectionProviderMultiPhase SignedSubmissionsMap (r:1 w:0) - /// Proof Skipped: ElectionProviderMultiPhase SignedSubmissionsMap (max_values: None, max_size: None, mode: Measured) - /// Storage: ElectionProviderMultiPhase QueuedSolution (r:1 w:1) - /// Proof Skipped: ElectionProviderMultiPhase QueuedSolution (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ElectionProviderMultiPhase Round (r:1 w:1) - /// Proof Skipped: ElectionProviderMultiPhase Round (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ElectionProviderMultiPhase CurrentPhase (r:1 w:1) - /// Proof Skipped: ElectionProviderMultiPhase CurrentPhase (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ElectionProviderMultiPhase DesiredTargets (r:0 w:1) - /// Proof Skipped: ElectionProviderMultiPhase DesiredTargets (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ElectionProviderMultiPhase Snapshot (r:0 w:1) - /// Proof Skipped: ElectionProviderMultiPhase Snapshot (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: `ElectionProviderMultiPhase::SignedSubmissionIndices` (r:1 w:1) + /// Proof: `ElectionProviderMultiPhase::SignedSubmissionIndices` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ElectionProviderMultiPhase::SignedSubmissionNextIndex` (r:1 w:1) + /// Proof: `ElectionProviderMultiPhase::SignedSubmissionNextIndex` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ElectionProviderMultiPhase::SnapshotMetadata` (r:1 w:1) + /// Proof: `ElectionProviderMultiPhase::SnapshotMetadata` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ElectionProviderMultiPhase::SignedSubmissionsMap` (r:1 w:0) + /// Proof: `ElectionProviderMultiPhase::SignedSubmissionsMap` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `ElectionProviderMultiPhase::QueuedSolution` (r:1 w:1) + /// Proof: `ElectionProviderMultiPhase::QueuedSolution` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ElectionProviderMultiPhase::Round` (r:1 w:1) + /// Proof: `ElectionProviderMultiPhase::Round` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ElectionProviderMultiPhase::CurrentPhase` (r:1 w:1) + /// Proof: `ElectionProviderMultiPhase::CurrentPhase` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ElectionProviderMultiPhase::DesiredTargets` (r:0 w:1) + /// Proof: `ElectionProviderMultiPhase::DesiredTargets` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ElectionProviderMultiPhase::Snapshot` (r:0 w:1) + /// Proof: `ElectionProviderMultiPhase::Snapshot` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) /// The range of component `a` is `[500, 800]`. /// The range of component `d` is `[200, 400]`. fn elect_queued(a: u32, d: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `371 + a * (768 ±0) + d * (48 ±0)` // Estimated: `3923 + a * (768 ±0) + d * (49 ±0)` - // Minimum execution time: 301_283_000 picoseconds. - Weight::from_parts(324_586_000, 3923) - // Standard Error: 4_763 - .saturating_add(Weight::from_parts(279_812, 0).saturating_mul(a.into())) + // Minimum execution time: 331_717_000 picoseconds. + Weight::from_parts(29_922_189, 3923) + // Standard Error: 9_972 + .saturating_add(Weight::from_parts(570_967, 0).saturating_mul(a.into())) + // Standard Error: 14_948 + .saturating_add(Weight::from_parts(159_043, 0).saturating_mul(d.into())) .saturating_add(T::DbWeight::get().reads(7_u64)) .saturating_add(T::DbWeight::get().writes(8_u64)) .saturating_add(Weight::from_parts(0, 768).saturating_mul(a.into())) .saturating_add(Weight::from_parts(0, 49).saturating_mul(d.into())) } - /// Storage: ElectionProviderMultiPhase CurrentPhase (r:1 w:0) - /// Proof Skipped: ElectionProviderMultiPhase CurrentPhase (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ElectionProviderMultiPhase SnapshotMetadata (r:1 w:0) - /// Proof Skipped: ElectionProviderMultiPhase SnapshotMetadata (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: TransactionPayment NextFeeMultiplier (r:1 w:0) - /// Proof: TransactionPayment NextFeeMultiplier (max_values: Some(1), max_size: Some(16), added: 511, mode: MaxEncodedLen) - /// Storage: ElectionProviderMultiPhase SignedSubmissionIndices (r:1 w:1) - /// Proof Skipped: ElectionProviderMultiPhase SignedSubmissionIndices (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ElectionProviderMultiPhase SignedSubmissionNextIndex (r:1 w:1) - /// Proof Skipped: ElectionProviderMultiPhase SignedSubmissionNextIndex (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ElectionProviderMultiPhase SignedSubmissionsMap (r:0 w:1) - /// Proof Skipped: ElectionProviderMultiPhase SignedSubmissionsMap (max_values: None, max_size: None, mode: Measured) + /// Storage: `ElectionProviderMultiPhase::CurrentPhase` (r:1 w:0) + /// Proof: `ElectionProviderMultiPhase::CurrentPhase` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ElectionProviderMultiPhase::Round` (r:1 w:0) + /// Proof: `ElectionProviderMultiPhase::Round` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ElectionProviderMultiPhase::SnapshotMetadata` (r:1 w:0) + /// Proof: `ElectionProviderMultiPhase::SnapshotMetadata` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ElectionProviderMultiPhase::SignedSubmissionIndices` (r:1 w:1) + /// Proof: `ElectionProviderMultiPhase::SignedSubmissionIndices` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ElectionProviderMultiPhase::SignedSubmissionNextIndex` (r:1 w:1) + /// Proof: `ElectionProviderMultiPhase::SignedSubmissionNextIndex` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `TransactionPayment::NextFeeMultiplier` (r:1 w:0) + /// Proof: `TransactionPayment::NextFeeMultiplier` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) + /// Storage: `ElectionProviderMultiPhase::SignedSubmissionsMap` (r:0 w:1) + /// Proof: `ElectionProviderMultiPhase::SignedSubmissionsMap` (`max_values`: None, `max_size`: None, mode: `Measured`) fn submit() -> Weight { // Proof Size summary in bytes: // Measured: `927` // Estimated: `2412` - // Minimum execution time: 52_276_000 picoseconds. - Weight::from_parts(53_846_000, 2412) - .saturating_add(T::DbWeight::get().reads(5_u64)) + // Minimum execution time: 44_129_000 picoseconds. + Weight::from_parts(46_420_000, 2412) + .saturating_add(T::DbWeight::get().reads(6_u64)) .saturating_add(T::DbWeight::get().writes(3_u64)) } - /// Storage: ElectionProviderMultiPhase CurrentPhase (r:1 w:0) - /// Proof Skipped: ElectionProviderMultiPhase CurrentPhase (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ElectionProviderMultiPhase Round (r:1 w:0) - /// Proof Skipped: ElectionProviderMultiPhase Round (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ElectionProviderMultiPhase DesiredTargets (r:1 w:0) - /// Proof Skipped: ElectionProviderMultiPhase DesiredTargets (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ElectionProviderMultiPhase QueuedSolution (r:1 w:1) - /// Proof Skipped: ElectionProviderMultiPhase QueuedSolution (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ElectionProviderMultiPhase SnapshotMetadata (r:1 w:0) - /// Proof Skipped: ElectionProviderMultiPhase SnapshotMetadata (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ElectionProviderMultiPhase Snapshot (r:1 w:0) - /// Proof Skipped: ElectionProviderMultiPhase Snapshot (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ElectionProviderMultiPhase MinimumUntrustedScore (r:1 w:0) - /// Proof Skipped: ElectionProviderMultiPhase MinimumUntrustedScore (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: `ElectionProviderMultiPhase::CurrentPhase` (r:1 w:0) + /// Proof: `ElectionProviderMultiPhase::CurrentPhase` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ElectionProviderMultiPhase::Round` (r:1 w:0) + /// Proof: `ElectionProviderMultiPhase::Round` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ElectionProviderMultiPhase::DesiredTargets` (r:1 w:0) + /// Proof: `ElectionProviderMultiPhase::DesiredTargets` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ElectionProviderMultiPhase::QueuedSolution` (r:1 w:1) + /// Proof: `ElectionProviderMultiPhase::QueuedSolution` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ElectionProviderMultiPhase::SnapshotMetadata` (r:1 w:0) + /// Proof: `ElectionProviderMultiPhase::SnapshotMetadata` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ElectionProviderMultiPhase::Snapshot` (r:1 w:0) + /// Proof: `ElectionProviderMultiPhase::Snapshot` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ElectionProviderMultiPhase::MinimumUntrustedScore` (r:1 w:0) + /// Proof: `ElectionProviderMultiPhase::MinimumUntrustedScore` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) /// The range of component `v` is `[1000, 2000]`. /// The range of component `t` is `[500, 1000]`. /// The range of component `a` is `[500, 800]`. @@ -235,25 +238,25 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `253 + t * (32 ±0) + v * (553 ±0)` // Estimated: `1738 + t * (32 ±0) + v * (553 ±0)` - // Minimum execution time: 5_448_459_000 picoseconds. - Weight::from_parts(5_525_622_000, 1738) - // Standard Error: 21_478 - .saturating_add(Weight::from_parts(256_345, 0).saturating_mul(v.into())) - // Standard Error: 63_648 - .saturating_add(Weight::from_parts(5_103_224, 0).saturating_mul(a.into())) + // Minimum execution time: 5_585_830_000 picoseconds. + Weight::from_parts(5_662_741_000, 1738) + // Standard Error: 17_454 + .saturating_add(Weight::from_parts(352_514, 0).saturating_mul(v.into())) + // Standard Error: 51_723 + .saturating_add(Weight::from_parts(4_182_087, 0).saturating_mul(a.into())) .saturating_add(T::DbWeight::get().reads(7_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) .saturating_add(Weight::from_parts(0, 32).saturating_mul(t.into())) .saturating_add(Weight::from_parts(0, 553).saturating_mul(v.into())) } - /// Storage: ElectionProviderMultiPhase DesiredTargets (r:1 w:0) - /// Proof Skipped: ElectionProviderMultiPhase DesiredTargets (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ElectionProviderMultiPhase Snapshot (r:1 w:0) - /// Proof Skipped: ElectionProviderMultiPhase Snapshot (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ElectionProviderMultiPhase Round (r:1 w:0) - /// Proof Skipped: ElectionProviderMultiPhase Round (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ElectionProviderMultiPhase MinimumUntrustedScore (r:1 w:0) - /// Proof Skipped: ElectionProviderMultiPhase MinimumUntrustedScore (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: `ElectionProviderMultiPhase::DesiredTargets` (r:1 w:0) + /// Proof: `ElectionProviderMultiPhase::DesiredTargets` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ElectionProviderMultiPhase::Snapshot` (r:1 w:0) + /// Proof: `ElectionProviderMultiPhase::Snapshot` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ElectionProviderMultiPhase::Round` (r:1 w:0) + /// Proof: `ElectionProviderMultiPhase::Round` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ElectionProviderMultiPhase::MinimumUntrustedScore` (r:1 w:0) + /// Proof: `ElectionProviderMultiPhase::MinimumUntrustedScore` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) /// The range of component `v` is `[1000, 2000]`. /// The range of component `t` is `[500, 1000]`. /// The range of component `a` is `[500, 800]`. @@ -262,180 +265,184 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `228 + t * (32 ±0) + v * (553 ±0)` // Estimated: `1713 + t * (32 ±0) + v * (553 ±0)` - // Minimum execution time: 4_724_399_000 picoseconds. - Weight::from_parts(4_886_472_000, 1713) - // Standard Error: 15_220 - .saturating_add(Weight::from_parts(365_569, 0).saturating_mul(v.into())) - // Standard Error: 45_104 - .saturating_add(Weight::from_parts(3_176_675, 0).saturating_mul(a.into())) + // Minimum execution time: 4_902_422_000 picoseconds. + Weight::from_parts(5_001_852_000, 1713) + // Standard Error: 15_536 + .saturating_add(Weight::from_parts(354_309, 0).saturating_mul(v.into())) + // Standard Error: 46_041 + .saturating_add(Weight::from_parts(3_090_094, 0).saturating_mul(a.into())) .saturating_add(T::DbWeight::get().reads(4_u64)) .saturating_add(Weight::from_parts(0, 32).saturating_mul(t.into())) .saturating_add(Weight::from_parts(0, 553).saturating_mul(v.into())) } } -// For backwards compatibility and tests +// For backwards compatibility and tests. impl WeightInfo for () { - /// Storage: Staking CurrentEra (r:1 w:0) - /// Proof: Staking CurrentEra (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: Staking CurrentPlannedSession (r:1 w:0) - /// Proof: Staking CurrentPlannedSession (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: Staking ErasStartSessionIndex (r:1 w:0) - /// Proof: Staking ErasStartSessionIndex (max_values: None, max_size: Some(16), added: 2491, mode: MaxEncodedLen) - /// Storage: Babe EpochIndex (r:1 w:0) - /// Proof: Babe EpochIndex (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - /// Storage: Babe GenesisSlot (r:1 w:0) - /// Proof: Babe GenesisSlot (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - /// Storage: Babe CurrentSlot (r:1 w:0) - /// Proof: Babe CurrentSlot (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - /// Storage: Staking ForceEra (r:1 w:0) - /// Proof: Staking ForceEra (max_values: Some(1), max_size: Some(1), added: 496, mode: MaxEncodedLen) - /// Storage: ElectionProviderMultiPhase CurrentPhase (r:1 w:0) - /// Proof Skipped: ElectionProviderMultiPhase CurrentPhase (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: `Staking::CurrentEra` (r:1 w:0) + /// Proof: `Staking::CurrentEra` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `Staking::CurrentPlannedSession` (r:1 w:0) + /// Proof: `Staking::CurrentPlannedSession` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `Staking::ErasStartSessionIndex` (r:1 w:0) + /// Proof: `Staking::ErasStartSessionIndex` (`max_values`: None, `max_size`: Some(16), added: 2491, mode: `MaxEncodedLen`) + /// Storage: `Babe::EpochIndex` (r:1 w:0) + /// Proof: `Babe::EpochIndex` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `MaxEncodedLen`) + /// Storage: `Babe::GenesisSlot` (r:1 w:0) + /// Proof: `Babe::GenesisSlot` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `MaxEncodedLen`) + /// Storage: `Babe::CurrentSlot` (r:1 w:0) + /// Proof: `Babe::CurrentSlot` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `MaxEncodedLen`) + /// Storage: `Staking::ForceEra` (r:1 w:0) + /// Proof: `Staking::ForceEra` (`max_values`: Some(1), `max_size`: Some(1), added: 496, mode: `MaxEncodedLen`) + /// Storage: `ElectionProviderMultiPhase::CurrentPhase` (r:1 w:0) + /// Proof: `ElectionProviderMultiPhase::CurrentPhase` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) fn on_initialize_nothing() -> Weight { // Proof Size summary in bytes: - // Measured: `1028` + // Measured: `1061` // Estimated: `3481` - // Minimum execution time: 22_089_000 picoseconds. - Weight::from_parts(22_677_000, 3481) + // Minimum execution time: 19_436_000 picoseconds. + Weight::from_parts(20_138_000, 3481) .saturating_add(RocksDbWeight::get().reads(8_u64)) } - /// Storage: ElectionProviderMultiPhase Round (r:1 w:0) - /// Proof Skipped: ElectionProviderMultiPhase Round (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ElectionProviderMultiPhase CurrentPhase (r:1 w:1) - /// Proof Skipped: ElectionProviderMultiPhase CurrentPhase (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: `ElectionProviderMultiPhase::Round` (r:1 w:0) + /// Proof: `ElectionProviderMultiPhase::Round` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ElectionProviderMultiPhase::CurrentPhase` (r:1 w:1) + /// Proof: `ElectionProviderMultiPhase::CurrentPhase` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) fn on_initialize_open_signed() -> Weight { // Proof Size summary in bytes: // Measured: `148` // Estimated: `1633` - // Minimum execution time: 11_986_000 picoseconds. - Weight::from_parts(12_445_000, 1633) + // Minimum execution time: 8_356_000 picoseconds. + Weight::from_parts(8_708_000, 1633) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: ElectionProviderMultiPhase Round (r:1 w:0) - /// Proof Skipped: ElectionProviderMultiPhase Round (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ElectionProviderMultiPhase CurrentPhase (r:1 w:1) - /// Proof Skipped: ElectionProviderMultiPhase CurrentPhase (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: `ElectionProviderMultiPhase::Round` (r:1 w:0) + /// Proof: `ElectionProviderMultiPhase::Round` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ElectionProviderMultiPhase::CurrentPhase` (r:1 w:1) + /// Proof: `ElectionProviderMultiPhase::CurrentPhase` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) fn on_initialize_open_unsigned() -> Weight { // Proof Size summary in bytes: // Measured: `148` // Estimated: `1633` - // Minimum execution time: 12_988_000 picoseconds. - Weight::from_parts(13_281_000, 1633) + // Minimum execution time: 9_088_000 picoseconds. + Weight::from_parts(9_382_000, 1633) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) - /// Storage: ElectionProviderMultiPhase QueuedSolution (r:0 w:1) - /// Proof Skipped: ElectionProviderMultiPhase QueuedSolution (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `ElectionProviderMultiPhase::QueuedSolution` (r:0 w:1) + /// Proof: `ElectionProviderMultiPhase::QueuedSolution` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) fn finalize_signed_phase_accept_solution() -> Weight { // Proof Size summary in bytes: // Measured: `174` // Estimated: `3593` - // Minimum execution time: 32_659_000 picoseconds. - Weight::from_parts(33_281_000, 3593) + // Minimum execution time: 25_899_000 picoseconds. + Weight::from_parts(26_456_000, 3593) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) fn finalize_signed_phase_reject_solution() -> Weight { // Proof Size summary in bytes: // Measured: `174` // Estimated: `3593` - // Minimum execution time: 22_471_000 picoseconds. - Weight::from_parts(23_046_000, 3593) + // Minimum execution time: 17_671_000 picoseconds. + Weight::from_parts(18_131_000, 3593) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: ElectionProviderMultiPhase SnapshotMetadata (r:0 w:1) - /// Proof Skipped: ElectionProviderMultiPhase SnapshotMetadata (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ElectionProviderMultiPhase DesiredTargets (r:0 w:1) - /// Proof Skipped: ElectionProviderMultiPhase DesiredTargets (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ElectionProviderMultiPhase Snapshot (r:0 w:1) - /// Proof Skipped: ElectionProviderMultiPhase Snapshot (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: `ElectionProviderMultiPhase::SnapshotMetadata` (r:0 w:1) + /// Proof: `ElectionProviderMultiPhase::SnapshotMetadata` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ElectionProviderMultiPhase::DesiredTargets` (r:0 w:1) + /// Proof: `ElectionProviderMultiPhase::DesiredTargets` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ElectionProviderMultiPhase::Snapshot` (r:0 w:1) + /// Proof: `ElectionProviderMultiPhase::Snapshot` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) /// The range of component `v` is `[1000, 2000]`. /// The range of component `t` is `[500, 1000]`. fn create_snapshot_internal(v: u32, _t: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 262_360_000 picoseconds. - Weight::from_parts(279_313_000, 0) - // Standard Error: 2_384 - .saturating_add(Weight::from_parts(176_415, 0).saturating_mul(v.into())) + // Minimum execution time: 251_900_000 picoseconds. + Weight::from_parts(257_174_000, 0) + // Standard Error: 1_606 + .saturating_add(Weight::from_parts(250_961, 0).saturating_mul(v.into())) .saturating_add(RocksDbWeight::get().writes(3_u64)) } - /// Storage: ElectionProviderMultiPhase SignedSubmissionIndices (r:1 w:1) - /// Proof Skipped: ElectionProviderMultiPhase SignedSubmissionIndices (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ElectionProviderMultiPhase SignedSubmissionNextIndex (r:1 w:1) - /// Proof Skipped: ElectionProviderMultiPhase SignedSubmissionNextIndex (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ElectionProviderMultiPhase SnapshotMetadata (r:1 w:1) - /// Proof Skipped: ElectionProviderMultiPhase SnapshotMetadata (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ElectionProviderMultiPhase SignedSubmissionsMap (r:1 w:0) - /// Proof Skipped: ElectionProviderMultiPhase SignedSubmissionsMap (max_values: None, max_size: None, mode: Measured) - /// Storage: ElectionProviderMultiPhase QueuedSolution (r:1 w:1) - /// Proof Skipped: ElectionProviderMultiPhase QueuedSolution (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ElectionProviderMultiPhase Round (r:1 w:1) - /// Proof Skipped: ElectionProviderMultiPhase Round (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ElectionProviderMultiPhase CurrentPhase (r:1 w:1) - /// Proof Skipped: ElectionProviderMultiPhase CurrentPhase (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ElectionProviderMultiPhase DesiredTargets (r:0 w:1) - /// Proof Skipped: ElectionProviderMultiPhase DesiredTargets (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ElectionProviderMultiPhase Snapshot (r:0 w:1) - /// Proof Skipped: ElectionProviderMultiPhase Snapshot (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: `ElectionProviderMultiPhase::SignedSubmissionIndices` (r:1 w:1) + /// Proof: `ElectionProviderMultiPhase::SignedSubmissionIndices` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ElectionProviderMultiPhase::SignedSubmissionNextIndex` (r:1 w:1) + /// Proof: `ElectionProviderMultiPhase::SignedSubmissionNextIndex` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ElectionProviderMultiPhase::SnapshotMetadata` (r:1 w:1) + /// Proof: `ElectionProviderMultiPhase::SnapshotMetadata` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ElectionProviderMultiPhase::SignedSubmissionsMap` (r:1 w:0) + /// Proof: `ElectionProviderMultiPhase::SignedSubmissionsMap` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `ElectionProviderMultiPhase::QueuedSolution` (r:1 w:1) + /// Proof: `ElectionProviderMultiPhase::QueuedSolution` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ElectionProviderMultiPhase::Round` (r:1 w:1) + /// Proof: `ElectionProviderMultiPhase::Round` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ElectionProviderMultiPhase::CurrentPhase` (r:1 w:1) + /// Proof: `ElectionProviderMultiPhase::CurrentPhase` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ElectionProviderMultiPhase::DesiredTargets` (r:0 w:1) + /// Proof: `ElectionProviderMultiPhase::DesiredTargets` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ElectionProviderMultiPhase::Snapshot` (r:0 w:1) + /// Proof: `ElectionProviderMultiPhase::Snapshot` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) /// The range of component `a` is `[500, 800]`. /// The range of component `d` is `[200, 400]`. fn elect_queued(a: u32, d: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `371 + a * (768 ±0) + d * (48 ±0)` // Estimated: `3923 + a * (768 ±0) + d * (49 ±0)` - // Minimum execution time: 301_283_000 picoseconds. - Weight::from_parts(324_586_000, 3923) - // Standard Error: 4_763 - .saturating_add(Weight::from_parts(279_812, 0).saturating_mul(a.into())) + // Minimum execution time: 331_717_000 picoseconds. + Weight::from_parts(29_922_189, 3923) + // Standard Error: 9_972 + .saturating_add(Weight::from_parts(570_967, 0).saturating_mul(a.into())) + // Standard Error: 14_948 + .saturating_add(Weight::from_parts(159_043, 0).saturating_mul(d.into())) .saturating_add(RocksDbWeight::get().reads(7_u64)) .saturating_add(RocksDbWeight::get().writes(8_u64)) .saturating_add(Weight::from_parts(0, 768).saturating_mul(a.into())) .saturating_add(Weight::from_parts(0, 49).saturating_mul(d.into())) } - /// Storage: ElectionProviderMultiPhase CurrentPhase (r:1 w:0) - /// Proof Skipped: ElectionProviderMultiPhase CurrentPhase (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ElectionProviderMultiPhase SnapshotMetadata (r:1 w:0) - /// Proof Skipped: ElectionProviderMultiPhase SnapshotMetadata (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: TransactionPayment NextFeeMultiplier (r:1 w:0) - /// Proof: TransactionPayment NextFeeMultiplier (max_values: Some(1), max_size: Some(16), added: 511, mode: MaxEncodedLen) - /// Storage: ElectionProviderMultiPhase SignedSubmissionIndices (r:1 w:1) - /// Proof Skipped: ElectionProviderMultiPhase SignedSubmissionIndices (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ElectionProviderMultiPhase SignedSubmissionNextIndex (r:1 w:1) - /// Proof Skipped: ElectionProviderMultiPhase SignedSubmissionNextIndex (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ElectionProviderMultiPhase SignedSubmissionsMap (r:0 w:1) - /// Proof Skipped: ElectionProviderMultiPhase SignedSubmissionsMap (max_values: None, max_size: None, mode: Measured) + /// Storage: `ElectionProviderMultiPhase::CurrentPhase` (r:1 w:0) + /// Proof: `ElectionProviderMultiPhase::CurrentPhase` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ElectionProviderMultiPhase::Round` (r:1 w:0) + /// Proof: `ElectionProviderMultiPhase::Round` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ElectionProviderMultiPhase::SnapshotMetadata` (r:1 w:0) + /// Proof: `ElectionProviderMultiPhase::SnapshotMetadata` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ElectionProviderMultiPhase::SignedSubmissionIndices` (r:1 w:1) + /// Proof: `ElectionProviderMultiPhase::SignedSubmissionIndices` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ElectionProviderMultiPhase::SignedSubmissionNextIndex` (r:1 w:1) + /// Proof: `ElectionProviderMultiPhase::SignedSubmissionNextIndex` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `TransactionPayment::NextFeeMultiplier` (r:1 w:0) + /// Proof: `TransactionPayment::NextFeeMultiplier` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) + /// Storage: `ElectionProviderMultiPhase::SignedSubmissionsMap` (r:0 w:1) + /// Proof: `ElectionProviderMultiPhase::SignedSubmissionsMap` (`max_values`: None, `max_size`: None, mode: `Measured`) fn submit() -> Weight { // Proof Size summary in bytes: // Measured: `927` // Estimated: `2412` - // Minimum execution time: 52_276_000 picoseconds. - Weight::from_parts(53_846_000, 2412) - .saturating_add(RocksDbWeight::get().reads(5_u64)) + // Minimum execution time: 44_129_000 picoseconds. + Weight::from_parts(46_420_000, 2412) + .saturating_add(RocksDbWeight::get().reads(6_u64)) .saturating_add(RocksDbWeight::get().writes(3_u64)) } - /// Storage: ElectionProviderMultiPhase CurrentPhase (r:1 w:0) - /// Proof Skipped: ElectionProviderMultiPhase CurrentPhase (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ElectionProviderMultiPhase Round (r:1 w:0) - /// Proof Skipped: ElectionProviderMultiPhase Round (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ElectionProviderMultiPhase DesiredTargets (r:1 w:0) - /// Proof Skipped: ElectionProviderMultiPhase DesiredTargets (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ElectionProviderMultiPhase QueuedSolution (r:1 w:1) - /// Proof Skipped: ElectionProviderMultiPhase QueuedSolution (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ElectionProviderMultiPhase SnapshotMetadata (r:1 w:0) - /// Proof Skipped: ElectionProviderMultiPhase SnapshotMetadata (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ElectionProviderMultiPhase Snapshot (r:1 w:0) - /// Proof Skipped: ElectionProviderMultiPhase Snapshot (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ElectionProviderMultiPhase MinimumUntrustedScore (r:1 w:0) - /// Proof Skipped: ElectionProviderMultiPhase MinimumUntrustedScore (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: `ElectionProviderMultiPhase::CurrentPhase` (r:1 w:0) + /// Proof: `ElectionProviderMultiPhase::CurrentPhase` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ElectionProviderMultiPhase::Round` (r:1 w:0) + /// Proof: `ElectionProviderMultiPhase::Round` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ElectionProviderMultiPhase::DesiredTargets` (r:1 w:0) + /// Proof: `ElectionProviderMultiPhase::DesiredTargets` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ElectionProviderMultiPhase::QueuedSolution` (r:1 w:1) + /// Proof: `ElectionProviderMultiPhase::QueuedSolution` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ElectionProviderMultiPhase::SnapshotMetadata` (r:1 w:0) + /// Proof: `ElectionProviderMultiPhase::SnapshotMetadata` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ElectionProviderMultiPhase::Snapshot` (r:1 w:0) + /// Proof: `ElectionProviderMultiPhase::Snapshot` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ElectionProviderMultiPhase::MinimumUntrustedScore` (r:1 w:0) + /// Proof: `ElectionProviderMultiPhase::MinimumUntrustedScore` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) /// The range of component `v` is `[1000, 2000]`. /// The range of component `t` is `[500, 1000]`. /// The range of component `a` is `[500, 800]`. @@ -444,25 +451,25 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `253 + t * (32 ±0) + v * (553 ±0)` // Estimated: `1738 + t * (32 ±0) + v * (553 ±0)` - // Minimum execution time: 5_448_459_000 picoseconds. - Weight::from_parts(5_525_622_000, 1738) - // Standard Error: 21_478 - .saturating_add(Weight::from_parts(256_345, 0).saturating_mul(v.into())) - // Standard Error: 63_648 - .saturating_add(Weight::from_parts(5_103_224, 0).saturating_mul(a.into())) + // Minimum execution time: 5_585_830_000 picoseconds. + Weight::from_parts(5_662_741_000, 1738) + // Standard Error: 17_454 + .saturating_add(Weight::from_parts(352_514, 0).saturating_mul(v.into())) + // Standard Error: 51_723 + .saturating_add(Weight::from_parts(4_182_087, 0).saturating_mul(a.into())) .saturating_add(RocksDbWeight::get().reads(7_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) .saturating_add(Weight::from_parts(0, 32).saturating_mul(t.into())) .saturating_add(Weight::from_parts(0, 553).saturating_mul(v.into())) } - /// Storage: ElectionProviderMultiPhase DesiredTargets (r:1 w:0) - /// Proof Skipped: ElectionProviderMultiPhase DesiredTargets (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ElectionProviderMultiPhase Snapshot (r:1 w:0) - /// Proof Skipped: ElectionProviderMultiPhase Snapshot (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ElectionProviderMultiPhase Round (r:1 w:0) - /// Proof Skipped: ElectionProviderMultiPhase Round (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ElectionProviderMultiPhase MinimumUntrustedScore (r:1 w:0) - /// Proof Skipped: ElectionProviderMultiPhase MinimumUntrustedScore (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: `ElectionProviderMultiPhase::DesiredTargets` (r:1 w:0) + /// Proof: `ElectionProviderMultiPhase::DesiredTargets` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ElectionProviderMultiPhase::Snapshot` (r:1 w:0) + /// Proof: `ElectionProviderMultiPhase::Snapshot` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ElectionProviderMultiPhase::Round` (r:1 w:0) + /// Proof: `ElectionProviderMultiPhase::Round` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ElectionProviderMultiPhase::MinimumUntrustedScore` (r:1 w:0) + /// Proof: `ElectionProviderMultiPhase::MinimumUntrustedScore` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) /// The range of component `v` is `[1000, 2000]`. /// The range of component `t` is `[500, 1000]`. /// The range of component `a` is `[500, 800]`. @@ -471,12 +478,12 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `228 + t * (32 ±0) + v * (553 ±0)` // Estimated: `1713 + t * (32 ±0) + v * (553 ±0)` - // Minimum execution time: 4_724_399_000 picoseconds. - Weight::from_parts(4_886_472_000, 1713) - // Standard Error: 15_220 - .saturating_add(Weight::from_parts(365_569, 0).saturating_mul(v.into())) - // Standard Error: 45_104 - .saturating_add(Weight::from_parts(3_176_675, 0).saturating_mul(a.into())) + // Minimum execution time: 4_902_422_000 picoseconds. + Weight::from_parts(5_001_852_000, 1713) + // Standard Error: 15_536 + .saturating_add(Weight::from_parts(354_309, 0).saturating_mul(v.into())) + // Standard Error: 46_041 + .saturating_add(Weight::from_parts(3_090_094, 0).saturating_mul(a.into())) .saturating_add(RocksDbWeight::get().reads(4_u64)) .saturating_add(Weight::from_parts(0, 32).saturating_mul(t.into())) .saturating_add(Weight::from_parts(0, 553).saturating_mul(v.into())) diff --git a/substrate/frame/election-provider-multi-phase/test-staking-e2e/Cargo.toml b/substrate/frame/election-provider-multi-phase/test-staking-e2e/Cargo.toml index 05c6a6d404629f8bdc5a9cdb1d2ccdb785972693..25c280921f8c7c8d3660c52555ae5e67093c1a9b 100644 --- a/substrate/frame/election-provider-multi-phase/test-staking-e2e/Cargo.toml +++ b/substrate/frame/election-provider-multi-phase/test-staking-e2e/Cargo.toml @@ -18,8 +18,8 @@ targets = ["x86_64-unknown-linux-gnu"] [dev-dependencies] parking_lot = "0.12.1" codec = { package = "parity-scale-codec", version = "3.6.1", features = ["derive"] } -scale-info = { version = "2.10.0", features = ["derive"] } -log = { version = "0.4.17", default-features = false } +scale-info = { version = "2.11.1", features = ["derive"] } +log = { workspace = true } sp-runtime = { path = "../../../primitives/runtime" } sp-io = { path = "../../../primitives/io" } @@ -35,7 +35,23 @@ frame-election-provider-support = { path = "../../election-provider-support" } pallet-election-provider-multi-phase = { path = ".." } pallet-staking = { path = "../../staking" } +pallet-nomination-pools = { path = "../../nomination-pools" } pallet-bags-list = { path = "../../bags-list" } pallet-balances = { path = "../../balances" } pallet-timestamp = { path = "../../timestamp" } pallet-session = { path = "../../session" } + +[features] +try-runtime = [ + "frame-election-provider-support/try-runtime", + "frame-support/try-runtime", + "frame-system/try-runtime", + "pallet-bags-list/try-runtime", + "pallet-balances/try-runtime", + "pallet-election-provider-multi-phase/try-runtime", + "pallet-nomination-pools/try-runtime", + "pallet-session/try-runtime", + "pallet-staking/try-runtime", + "pallet-timestamp/try-runtime", + "sp-runtime/try-runtime", +] diff --git a/substrate/frame/election-provider-multi-phase/test-staking-e2e/src/lib.rs b/substrate/frame/election-provider-multi-phase/test-staking-e2e/src/lib.rs index 1d3f4712b1d604988047f5643ddd86296f453878..83083c912094bc4b39287f5105021fe2e44a4bb0 100644 --- a/substrate/frame/election-provider-multi-phase/test-staking-e2e/src/lib.rs +++ b/substrate/frame/election-provider-multi-phase/test-staking-e2e/src/lib.rs @@ -53,9 +53,9 @@ fn log_current_time() { #[test] fn block_progression_works() { - let (mut ext, pool_state, _) = ExtBuilder::default().build_offchainify(); + let (ext, pool_state, _) = ExtBuilder::default().build_offchainify(); - ext.execute_with(|| { + execute_with(ext, || { assert_eq!(active_era(), 0); assert_eq!(Session::current_index(), 0); assert!(ElectionProviderMultiPhase::current_phase().is_off()); @@ -70,9 +70,9 @@ fn block_progression_works() { assert!(ElectionProviderMultiPhase::current_phase().is_signed()); }); - let (mut ext, pool_state, _) = ExtBuilder::default().build_offchainify(); + let (ext, pool_state, _) = ExtBuilder::default().build_offchainify(); - ext.execute_with(|| { + execute_with(ext, || { assert_eq!(active_era(), 0); assert_eq!(Session::current_index(), 0); assert!(ElectionProviderMultiPhase::current_phase().is_off()); @@ -93,12 +93,12 @@ fn offchainify_works() { let staking_builder = StakingExtBuilder::default(); let epm_builder = EpmExtBuilder::default(); - let (mut ext, pool_state, _) = ExtBuilder::default() + let (ext, pool_state, _) = ExtBuilder::default() .epm(epm_builder) .staking(staking_builder) .build_offchainify(); - ext.execute_with(|| { + execute_with(ext, || { // test ocw progression and solution queue if submission when unsigned phase submission is // not delayed. for _ in 0..100 { @@ -142,9 +142,9 @@ fn offchainify_works() { /// restarts. Note that in this test case, the emergency throttling is disabled. fn enters_emergency_phase_after_forcing_before_elect() { let epm_builder = EpmExtBuilder::default().disable_emergency_throttling(); - let (mut ext, pool_state, _) = ExtBuilder::default().epm(epm_builder).build_offchainify(); + let (ext, pool_state, _) = ExtBuilder::default().epm(epm_builder).build_offchainify(); - ext.execute_with(|| { + execute_with(ext, || { log!( trace, "current validators (staking): {:?}", @@ -208,17 +208,17 @@ fn enters_emergency_phase_after_forcing_before_elect() { /// active validators. Thus, slashing a percentage of the current validators that is lower than /// `OffendingValidatorsThreshold` will never force a new era. However, as the slashes progress, if /// the subsequent elections do not meet the minimum election untrusted score, the election will -/// fail and enter in emenergency mode. -fn continous_slashes_below_offending_threshold() { +/// fail and enter in emergency mode. +fn continuous_slashes_below_offending_threshold() { let staking_builder = StakingExtBuilder::default().validator_count(10); let epm_builder = EpmExtBuilder::default().disable_emergency_throttling(); - let (mut ext, pool_state, _) = ExtBuilder::default() + let (ext, pool_state, _) = ExtBuilder::default() .epm(epm_builder) .staking(staking_builder) .build_offchainify(); - ext.execute_with(|| { + execute_with(ext, || { assert_eq!(Session::validators().len(), 10); let mut active_validator_set = Session::validators(); @@ -271,12 +271,12 @@ fn set_validation_intention_after_chilled() { use frame_election_provider_support::SortedListProvider; use pallet_staking::{Event, Forcing, Nominators}; - let (mut ext, pool_state, _) = ExtBuilder::default() + let (ext, pool_state, _) = ExtBuilder::default() .epm(EpmExtBuilder::default()) .staking(StakingExtBuilder::default()) .build_offchainify(); - ext.execute_with(|| { + execute_with(ext, || { assert_eq!(active_era(), 0); // validator is part of the validator set. assert!(Session::validators().contains(&41)); @@ -323,7 +323,7 @@ fn set_validation_intention_after_chilled() { } #[test] -/// Active ledger balance may fall below ED if account chills before unbounding. +/// Active ledger balance may fall below ED if account chills before unbonding. /// /// Unbonding call fails if the remaining ledger's stash balance falls below the existential /// deposit. However, if the stash is chilled before unbonding, the ledger's active balance may @@ -334,10 +334,10 @@ fn set_validation_intention_after_chilled() { fn ledger_consistency_active_balance_below_ed() { use pallet_staking::{Error, Event}; - let (mut ext, pool_state, _) = + let (ext, pool_state, _) = ExtBuilder::default().staking(StakingExtBuilder::default()).build_offchainify(); - ext.execute_with(|| { + execute_with(ext, || { assert_eq!(Staking::ledger(11.into()).unwrap().active, 1000); // unbonding total of active stake fails because the active ledger balance would fall @@ -350,7 +350,7 @@ fn ledger_consistency_active_balance_below_ed() { // however, chilling works as expected. assert_ok!(Staking::chill(RuntimeOrigin::signed(11))); - // now unbonding the full active balance works, since remainer of the active balance is + // now unbonding the full active balance works, since remainder of the active balance is // not enforced to be below `MinNominatorBond` if the stash has been chilled. assert_ok!(Staking::unbond(RuntimeOrigin::signed(11), 1000)); @@ -387,3 +387,141 @@ fn ledger_consistency_active_balance_below_ed() { assert!(Staking::ledger(11.into()).is_err()); }); } + +#[test] +/// Automatic withdrawal of unlocking funds in staking propagates to the nomination pools and its +/// state correctly. +/// +/// The staking pallet may withdraw unlocking funds from a pool's bonded account without a pool +/// member or operator calling explicitly `Call::withdraw*`. This test verifies that the member's +/// are eventually paid and the `TotalValueLocked` is kept in sync in those cases. +fn automatic_unbonding_pools() { + use pallet_nomination_pools::TotalValueLocked; + + // closure to fetch the staking unlocking chunks of an account. + let unlocking_chunks_of = |account: AccountId| -> usize { + Staking::ledger(sp_staking::StakingAccount::Controller(account)) + .unwrap() + .unlocking + .len() + }; + + let (ext, pool_state, _) = ExtBuilder::default() + .pools(PoolsExtBuilder::default().max_unbonding(1)) + .staking(StakingExtBuilder::default().max_unlocking(1).bonding_duration(2)) + .build_offchainify(); + + execute_with(ext, || { + assert_eq!(::MaxUnlockingChunks::get(), 1); + assert_eq!(::BondingDuration::get(), 2); + assert_eq!(::MaxUnbonding::get(), 1); + + // init state of pool members. + let init_free_balance_2 = Balances::free_balance(2); + let init_free_balance_3 = Balances::free_balance(3); + + let pool_bonded_account = Pools::create_bonded_account(1); + + // creates a pool with 5 bonded, owned by 1. + assert_ok!(Pools::create(RuntimeOrigin::signed(1), 5, 1, 1, 1)); + assert_eq!(locked_amount_for(pool_bonded_account), 5); + + let init_tvl = TotalValueLocked::::get(); + + // 2 joins the pool. + assert_ok!(Pools::join(RuntimeOrigin::signed(2), 10, 1)); + assert_eq!(locked_amount_for(pool_bonded_account), 15); + + // 3 joins the pool. + assert_ok!(Pools::join(RuntimeOrigin::signed(3), 10, 1)); + assert_eq!(locked_amount_for(pool_bonded_account), 25); + + assert_eq!(TotalValueLocked::::get(), 25); + + // currently unlocking 0 chunks in the bonded pools ledger. + assert_eq!(unlocking_chunks_of(pool_bonded_account), 0); + + // unbond 2 from pool. + assert_ok!(Pools::unbond(RuntimeOrigin::signed(2), 2, 10)); + + // amount is still locked in the pool, needs to wait for unbonding period. + assert_eq!(locked_amount_for(pool_bonded_account), 25); + + // max chunks in the ledger are now filled up (`MaxUnlockingChunks == 1`). + assert_eq!(unlocking_chunks_of(pool_bonded_account), 1); + + // tries to unbond 3 from pool. it will fail since there are no unlocking chunks left + // available and the current in the queue haven't been there for more than bonding + // duration. + assert_err!( + Pools::unbond(RuntimeOrigin::signed(3), 3, 10), + pallet_staking::Error::::NoMoreChunks + ); + + assert_eq!(current_era(), 0); + + // progress over bonding duration. + for _ in 0..=::BondingDuration::get() { + start_next_active_era(pool_state.clone()).unwrap(); + } + assert_eq!(current_era(), 3); + System::reset_events(); + + let locked_before_withdraw_pool = locked_amount_for(pool_bonded_account); + assert_eq!(Balances::free_balance(pool_bonded_account), 26); + + // now unbonding 3 will work, although the pool's ledger still has the unlocking chunks + // filled up. + assert_ok!(Pools::unbond(RuntimeOrigin::signed(3), 3, 10)); + assert_eq!(unlocking_chunks_of(pool_bonded_account), 1); + + assert_eq!( + staking_events(), + [ + // auto-withdraw happened as expected to release 2's unbonding funds, but the funds + // were not transferred to 2 and stay in the pool's transferrable balance instead. + pallet_staking::Event::Withdrawn { stash: 7939698191839293293, amount: 10 }, + pallet_staking::Event::Unbonded { stash: 7939698191839293293, amount: 10 } + ] + ); + + // balance of the pool remains the same, it hasn't withdraw explicitly from the pool yet. + assert_eq!(Balances::free_balance(pool_bonded_account), 26); + // but the locked amount in the pool's account decreases due to the auto-withdraw: + assert_eq!(locked_before_withdraw_pool - 10, locked_amount_for(pool_bonded_account)); + + // TVL correctly updated. + assert_eq!(TotalValueLocked::::get(), 25 - 10); + + // however, note that the withdrawing from the pool still works for 2, the funds are taken + // from the pool's free balance. + assert_eq!(Balances::free_balance(pool_bonded_account), 26); + assert_ok!(Pools::withdraw_unbonded(RuntimeOrigin::signed(2), 2, 10)); + assert_eq!(Balances::free_balance(pool_bonded_account), 16); + + assert_eq!(Balances::free_balance(2), 20); + assert_eq!(TotalValueLocked::::get(), 15); + + // 3 cannot withdraw yet. + assert_err!( + Pools::withdraw_unbonded(RuntimeOrigin::signed(3), 3, 10), + pallet_nomination_pools::Error::::CannotWithdrawAny + ); + + // progress over bonding duration. + for _ in 0..=::BondingDuration::get() { + start_next_active_era(pool_state.clone()).unwrap(); + } + assert_eq!(current_era(), 6); + System::reset_events(); + + assert_ok!(Pools::withdraw_unbonded(RuntimeOrigin::signed(3), 3, 10)); + + // final conditions are the expected. + assert_eq!(Balances::free_balance(pool_bonded_account), 6); // 5 init bonded + ED + assert_eq!(Balances::free_balance(2), init_free_balance_2); + assert_eq!(Balances::free_balance(3), init_free_balance_3); + + assert_eq!(TotalValueLocked::::get(), init_tvl); + }); +} diff --git a/substrate/frame/election-provider-multi-phase/test-staking-e2e/src/mock.rs b/substrate/frame/election-provider-multi-phase/test-staking-e2e/src/mock.rs index 32633a0ed7d348f5ba0b83d047a33106e8b7cb93..a727e3bf816251495c2b5e9e32eb688e51c4e339 100644 --- a/substrate/frame/election-provider-multi-phase/test-staking-e2e/src/mock.rs +++ b/substrate/frame/election-provider-multi-phase/test-staking-e2e/src/mock.rs @@ -69,6 +69,7 @@ frame_support::construct_runtime!( System: frame_system, ElectionProviderMultiPhase: pallet_election_provider_multi_phase, Staking: pallet_staking, + Pools: pallet_nomination_pools, Balances: pallet_balances, BagsList: pallet_bags_list, Session: pallet_session, @@ -85,7 +86,7 @@ pub(crate) type VoterIndex = u16; pub(crate) type TargetIndex = u16; pub(crate) type Moment = u32; -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Runtime { type Block = Block; type AccountData = pallet_balances::AccountData; @@ -114,7 +115,7 @@ impl pallet_balances::Config for Runtime { type MaxFreezes = traits::ConstU32<1>; type RuntimeHoldReason = RuntimeHoldReason; type RuntimeFreezeReason = RuntimeFreezeReason; - type FreezeIdentifier = (); + type FreezeIdentifier = RuntimeFreezeReason; type WeightInfo = (); } @@ -166,7 +167,7 @@ parameter_types! { pub static SignedPhase: BlockNumber = 10; pub static UnsignedPhase: BlockNumber = 10; // we expect a minimum of 3 blocks in signed phase and unsigned phases before trying - // enetering in emergency phase after the election failed. + // entering in emergency phase after the election failed. pub static MinBlocksBeforeEmergency: BlockNumber = 3; pub static MaxActiveValidators: u32 = 1000; pub static OffchainRepeat: u32 = 5; @@ -233,7 +234,7 @@ const THRESHOLDS: [VoteWeight; 9] = [10, 20, 30, 40, 50, 60, 1_000, 2_000, 10_00 parameter_types! { pub static BagThresholds: &'static [sp_npos_elections::VoteWeight] = &THRESHOLDS; pub const SessionsPerEra: sp_staking::SessionIndex = 2; - pub const BondingDuration: sp_staking::EraIndex = 28; + pub static BondingDuration: sp_staking::EraIndex = 28; pub const SlashDeferDuration: sp_staking::EraIndex = 7; // 1/4 the bonding duration. pub const OffendingValidatorsThreshold: Perbill = Perbill::from_percent(40); pub HistoryDepth: u32 = 84; @@ -247,6 +248,46 @@ impl pallet_bags_list::Config for Runtime { type Score = VoteWeight; } +pub struct BalanceToU256; +impl sp_runtime::traits::Convert for BalanceToU256 { + fn convert(n: Balance) -> sp_core::U256 { + n.into() + } +} + +pub struct U256ToBalance; +impl sp_runtime::traits::Convert for U256ToBalance { + fn convert(n: sp_core::U256) -> Balance { + n.try_into().unwrap() + } +} + +parameter_types! { + pub const PoolsPalletId: frame_support::PalletId = frame_support::PalletId(*b"py/nopls"); + pub static MaxUnbonding: u32 = 8; +} + +impl pallet_nomination_pools::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type WeightInfo = (); + type Currency = Balances; + type RuntimeFreezeReason = RuntimeFreezeReason; + type RewardCounter = sp_runtime::FixedU128; + type BalanceToU256 = BalanceToU256; + type U256ToBalance = U256ToBalance; + type Staking = Staking; + type PostUnbondingPoolsWindow = ConstU32<2>; + type PalletId = PoolsPalletId; + type MaxMetadataLen = ConstU32<256>; + type MaxUnbonding = MaxUnbonding; + type MaxPointsToBalance = frame_support::traits::ConstU8<10>; + type AdminOrigin = frame_system::EnsureRoot; +} + +parameter_types! { + pub static MaxUnlockingChunks: u32 = 32; +} + /// Upper limit on the number of NPOS nominations. const MAX_QUOTA_NOMINATIONS: u32 = 16; @@ -273,10 +314,10 @@ impl pallet_staking::Config for Runtime { type VoterList = BagsList; type NominationsQuota = pallet_staking::FixedNominationsQuota; type TargetList = pallet_staking::UseValidatorsMap; - type MaxUnlockingChunks = ConstU32<32>; + type MaxUnlockingChunks = MaxUnlockingChunks; type MaxControllersInDeprecationBatch = ConstU32<100>; type HistoryDepth = HistoryDepth; - type EventListeners = (); + type EventListeners = Pools; type WeightInfo = pallet_staking::weights::SubstrateWeight; type BenchmarkingConfig = pallet_staking::TestBenchmarkingConfig; } @@ -394,6 +435,14 @@ impl StakingExtBuilder { self.validator_count = n; self } + pub fn max_unlocking(self, max: u32) -> Self { + ::set(max); + self + } + pub fn bonding_duration(self, eras: EraIndex) -> Self { + ::set(eras); + self + } } pub struct EpmExtBuilder {} @@ -417,6 +466,21 @@ impl EpmExtBuilder { } } +pub struct PoolsExtBuilder {} + +impl Default for PoolsExtBuilder { + fn default() -> Self { + PoolsExtBuilder {} + } +} + +impl PoolsExtBuilder { + pub fn max_unbonding(self, max: u32) -> Self { + ::set(max); + self + } +} + pub struct BalancesExtBuilder { balances: Vec<(AccountId, Balance)>, } @@ -464,6 +528,7 @@ pub struct ExtBuilder { staking_builder: StakingExtBuilder, epm_builder: EpmExtBuilder, balances_builder: BalancesExtBuilder, + pools_builder: PoolsExtBuilder, } impl Default for ExtBuilder { @@ -472,6 +537,7 @@ impl Default for ExtBuilder { staking_builder: StakingExtBuilder::default(), epm_builder: EpmExtBuilder::default(), balances_builder: BalancesExtBuilder::default(), + pools_builder: PoolsExtBuilder::default(), } } } @@ -548,6 +614,11 @@ impl ExtBuilder { self } + pub fn pools(mut self, builder: PoolsExtBuilder) -> Self { + self.pools_builder = builder; + self + } + pub fn balances(mut self, builder: BalancesExtBuilder) -> Self { self.balances_builder = builder; self @@ -567,20 +638,20 @@ impl ExtBuilder { (ext, pool_state, offchain_state) } +} - pub fn build_and_execute(self, test: impl FnOnce() -> ()) { - let mut ext = self.build(); - ext.execute_with(test); +pub(crate) fn execute_with(mut ext: sp_io::TestExternalities, test: impl FnOnce() -> ()) { + ext.execute_with(test); - #[cfg(feature = "try-runtime")] - ext.execute_with(|| { - let bn = System::block_number(); + #[cfg(feature = "try-runtime")] + ext.execute_with(|| { + let bn = System::block_number(); - assert_ok!(>::try_state(bn)); - assert_ok!(>::try_state(bn)); - assert_ok!(>::try_state(bn)); - }); - } + assert_ok!(>::try_state(bn)); + assert_ok!(>::try_state(bn)); + assert_ok!(>::try_state(bn)); + assert_ok!(>::try_state(bn)); + }); } // Progress to given block, triggering session and era changes as we progress and ensuring that @@ -591,7 +662,7 @@ pub fn roll_to(n: BlockNumber, delay_solution: bool) { Session::on_initialize(b); Timestamp::set_timestamp(System::block_number() * BLOCK_TIME + INIT_TIMESTAMP); - // TODO(gpestana): implement a realistic OCW worker insted of simulating it + // TODO(gpestana): implement a realistic OCW worker instead of simulating it // https://github.com/paritytech/substrate/issues/13589 // if there's no solution queued and the solution should not be delayed, try mining and // queue a solution. @@ -606,6 +677,7 @@ pub fn roll_to(n: BlockNumber, delay_solution: bool) { if b != n { Staking::on_finalize(System::block_number()); } + Pools::on_initialize(b); log_current_time(); } @@ -860,6 +932,11 @@ pub(crate) fn set_minimum_election_score( .map_err(|_| ()) } +pub(crate) fn locked_amount_for(account_id: AccountId) -> Balance { + let lock = pallet_balances::Locks::::get(account_id); + lock[0].amount +} + pub(crate) fn staking_events() -> Vec> { System::events() .into_iter() diff --git a/substrate/frame/election-provider-support/Cargo.toml b/substrate/frame/election-provider-support/Cargo.toml index b182b831ea0d12c8b791d43ab793337a408dbd26..0d9748ee34e56fa5d43f0e238d2d69eda548eaec 100644 --- a/substrate/frame/election-provider-support/Cargo.toml +++ b/substrate/frame/election-provider-support/Cargo.toml @@ -16,7 +16,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } frame-election-provider-solution-type = { path = "solution-type" } frame-support = { path = "../support", default-features = false } frame-system = { path = "../system", default-features = false } diff --git a/substrate/frame/election-provider-support/solution-type/Cargo.toml b/substrate/frame/election-provider-support/solution-type/Cargo.toml index 0b410364690305ecd90ad90ce7cbda57875d1982..09c6a492dd0d6ba498111fc2c8926212e7b35fc2 100644 --- a/substrate/frame/election-provider-support/solution-type/Cargo.toml +++ b/substrate/frame/election-provider-support/solution-type/Cargo.toml @@ -18,14 +18,14 @@ targets = ["x86_64-unknown-linux-gnu"] proc-macro = true [dependencies] -syn = { version = "2.0.48", features = ["full", "visit"] } -quote = "1.0.28" +syn = { features = ["full", "visit"], workspace = true } +quote = { workspace = true } proc-macro2 = "1.0.56" proc-macro-crate = "3.0.0" [dev-dependencies] parity-scale-codec = "3.6.1" -scale-info = "2.10.0" +scale-info = "2.11.1" sp-arithmetic = { path = "../../../primitives/arithmetic" } # used by generate_solution_type: frame-election-provider-support = { path = ".." } diff --git a/substrate/frame/election-provider-support/solution-type/fuzzer/Cargo.toml b/substrate/frame/election-provider-support/solution-type/fuzzer/Cargo.toml index 7200d207aeccf9c3b83202bce7ad61bfc4c289d5..1fb9e2387ed8de1be004faf876315c21eeac9696 100644 --- a/substrate/frame/election-provider-support/solution-type/fuzzer/Cargo.toml +++ b/substrate/frame/election-provider-support/solution-type/fuzzer/Cargo.toml @@ -16,12 +16,12 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -clap = { version = "4.4.18", features = ["derive"] } +clap = { version = "4.5.3", features = ["derive"] } honggfuzz = "0.5" rand = { version = "0.8", features = ["small_rng", "std"] } codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } frame-election-provider-solution-type = { path = ".." } frame-election-provider-support = { path = "../.." } sp-arithmetic = { path = "../../../../primitives/arithmetic" } diff --git a/substrate/frame/election-provider-support/src/bounds.rs b/substrate/frame/election-provider-support/src/bounds.rs index b9ae21e49ca70b3700ad43603fbac38f217f75de..6b2423b7fece6bfd1273bab51578bb32032dff31 100644 --- a/substrate/frame/election-provider-support/src/bounds.rs +++ b/substrate/frame/election-provider-support/src/bounds.rs @@ -62,7 +62,7 @@ use sp_runtime::traits::Zero; /// Encapsulates the counting of things that can be bounded in an election, such as voters, /// targets or anything else. /// -/// This struct is defined mostly to prevent callers from mistankingly using `CountBound` instead of +/// This struct is defined mostly to prevent callers from mistakenly using `CountBound` instead of /// `SizeBound` and vice-versa. #[derive(Clone, Copy, Debug, Eq, Ord, PartialEq, PartialOrd)] pub struct CountBound(pub u32); @@ -96,7 +96,7 @@ impl Zero for CountBound { /// logic and implementation, but it most likely will represent bytes in SCALE encoding in this /// context. /// -/// This struct is defined mostly to prevent callers from mistankingly using `CountBound` instead of +/// This struct is defined mostly to prevent callers from mistakenly using `CountBound` instead of /// `SizeBound` and vice-versa. #[derive(Clone, Copy, Debug, Eq, Ord, PartialEq, PartialOrd)] pub struct SizeBound(pub u32); diff --git a/substrate/frame/election-provider-support/src/onchain.rs b/substrate/frame/election-provider-support/src/onchain.rs index d937f42cb405f5726307be734db6b33a3f702d66..ee4f6992a085e677aeb8dc2cafbc5637c135ebfd 100644 --- a/substrate/frame/election-provider-support/src/onchain.rs +++ b/substrate/frame/election-provider-support/src/onchain.rs @@ -199,7 +199,7 @@ mod tests { } ); - #[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] + #[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Runtime { type SS58Prefix = (); type BaseCallFilter = frame_support::traits::Everything; diff --git a/substrate/frame/election-provider-support/src/tests.rs b/substrate/frame/election-provider-support/src/tests.rs index 73ce1427cf2f00883865a4b8c6cc5fad864d9c13..6e3deb9e38346629bbff92dfc708e9bbf5ad5a9d 100644 --- a/substrate/frame/election-provider-support/src/tests.rs +++ b/substrate/frame/election-provider-support/src/tests.rs @@ -29,7 +29,7 @@ mod solution_type { // these need to come from the same dev-dependency `frame-election-provider-support`, not from // the crate. use crate::{generate_solution_type, Assignment, Error as NposError, NposSolution}; - use sp_std::fmt::Debug; + use core::fmt::Debug; #[allow(dead_code)] mod __private { diff --git a/substrate/frame/election-provider-support/src/weights.rs b/substrate/frame/election-provider-support/src/weights.rs index addb6ad8d03069aecd6fda3b2725cdbc37e5ba5d..09b0cb108f7faa39bce20aaf9e4ae3dd9edcf4a5 100644 --- a/substrate/frame/election-provider-support/src/weights.rs +++ b/substrate/frame/election-provider-support/src/weights.rs @@ -41,7 +41,7 @@ #![allow(unused_imports)] use frame_support::{traits::Get, weights::{Weight, constants::RocksDbWeight}}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions needed for pallet_election_provider_support_benchmarking. pub trait WeightInfo { diff --git a/substrate/frame/elections-phragmen/Cargo.toml b/substrate/frame/elections-phragmen/Cargo.toml index 4f8c5638d4bf4825295bbd1ffe6909aebf4f9d55..81dc48476a065b60e41ce6f703317b77ae75b0fe 100644 --- a/substrate/frame/elections-phragmen/Cargo.toml +++ b/substrate/frame/elections-phragmen/Cargo.toml @@ -19,8 +19,8 @@ targets = ["x86_64-unknown-linux-gnu"] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = [ "derive", ] } -log = { version = "0.4.14", default-features = false } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +log = { workspace = true } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } frame-benchmarking = { path = "../benchmarking", default-features = false, optional = true } frame-support = { path = "../support", default-features = false } frame-system = { path = "../system", default-features = false } diff --git a/substrate/frame/elections-phragmen/src/lib.rs b/substrate/frame/elections-phragmen/src/lib.rs index 5d20a3cfcee2e72ace6b70adaee85e0ed1cdd7bf..b4be07030efbbf3d52405320830f86f524c9b0ad 100644 --- a/substrate/frame/elections-phragmen/src/lib.rs +++ b/substrate/frame/elections-phragmen/src/lib.rs @@ -188,7 +188,7 @@ pub mod pallet { use frame_support::pallet_prelude::*; use frame_system::pallet_prelude::*; - /// The current storage version. + /// The in-code storage version. const STORAGE_VERSION: StorageVersion = StorageVersion::new(4); #[pallet::pallet] @@ -1313,39 +1313,13 @@ mod tests { traits::{ConstU32, ConstU64, OnInitialize}, }; use frame_system::ensure_signed; - use sp_core::H256; - use sp_runtime::{ - testing::Header, - traits::{BlakeTwo256, IdentityLookup}, - BuildStorage, - }; + use sp_runtime::{testing::Header, BuildStorage}; use substrate_test_utils::assert_eq_uvec; - #[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] + #[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { - type BaseCallFilter = frame_support::traits::Everything; - type BlockWeights = (); - type BlockLength = (); - type DbWeight = (); - type RuntimeOrigin = RuntimeOrigin; - type Nonce = u64; - type RuntimeCall = RuntimeCall; - type Hash = H256; - type Hashing = BlakeTwo256; - type AccountId = u64; - type Lookup = IdentityLookup; type Block = Block; - type RuntimeEvent = RuntimeEvent; - type BlockHashCount = ConstU64<250>; - type Version = (); - type PalletInfo = PalletInfo; type AccountData = pallet_balances::AccountData; - type OnNewAccount = (); - type OnKilledAccount = (); - type SystemWeightInfo = (); - type SS58Prefix = (); - type OnSetCode = (); - type MaxConsumers = ConstU32<16>; } impl pallet_balances::Config for Test { diff --git a/substrate/frame/elections-phragmen/src/weights.rs b/substrate/frame/elections-phragmen/src/weights.rs index b7ed13dae9f734e524072bcd6ac5e116fca632bc..fb2e10f9f066348927a449b77a75020f333baf39 100644 --- a/substrate/frame/elections-phragmen/src/weights.rs +++ b/substrate/frame/elections-phragmen/src/weights.rs @@ -15,16 +15,16 @@ // See the License for the specific language governing permissions and // limitations under the License. -//! Autogenerated weights for pallet_elections_phragmen +//! Autogenerated weights for `pallet_elections_phragmen` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-06-16, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-04-09, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-e8ezs4ez-project-145-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("dev"), DB CACHE: 1024 +//! HOSTNAME: `runner-anb7yjbi-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: `1024` // Executed Command: -// ./target/production/substrate +// ./target/production/substrate-node // benchmark // pallet // --chain=dev @@ -35,12 +35,11 @@ // --no-median-slopes // --no-min-squares // --extrinsic=* -// --execution=wasm // --wasm-execution=compiled // --heap-pages=4096 -// --output=./frame/elections-phragmen/src/weights.rs -// --header=./HEADER-APACHE2 -// --template=./.maintain/frame-weight-template.hbs +// --output=./substrate/frame/elections-phragmen/src/weights.rs +// --header=./substrate/HEADER-APACHE2 +// --template=./substrate/.maintain/frame-weight-template.hbs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -50,7 +49,7 @@ use frame_support::{traits::Get, weights::{Weight, constants::RocksDbWeight}}; use core::marker::PhantomData; -/// Weight functions needed for pallet_elections_phragmen. +/// Weight functions needed for `pallet_elections_phragmen`. pub trait WeightInfo { fn vote_equal(v: u32, ) -> Weight; fn vote_more(v: u32, ) -> Weight; @@ -66,165 +65,165 @@ pub trait WeightInfo { fn election_phragmen(c: u32, v: u32, e: u32, ) -> Weight; } -/// Weights for pallet_elections_phragmen using the Substrate node and recommended hardware. +/// Weights for `pallet_elections_phragmen` using the Substrate node and recommended hardware. pub struct SubstrateWeight(PhantomData); impl WeightInfo for SubstrateWeight { - /// Storage: Elections Candidates (r:1 w:0) - /// Proof Skipped: Elections Candidates (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Elections Members (r:1 w:0) - /// Proof Skipped: Elections Members (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Elections RunnersUp (r:1 w:0) - /// Proof Skipped: Elections RunnersUp (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Elections Voting (r:1 w:1) - /// Proof Skipped: Elections Voting (max_values: None, max_size: None, mode: Measured) - /// Storage: Balances Locks (r:1 w:1) - /// Proof: Balances Locks (max_values: None, max_size: Some(1299), added: 3774, mode: MaxEncodedLen) - /// Storage: Balances Freezes (r:1 w:0) - /// Proof: Balances Freezes (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen) + /// Storage: `Elections::Candidates` (r:1 w:0) + /// Proof: `Elections::Candidates` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Elections::Members` (r:1 w:0) + /// Proof: `Elections::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Elections::RunnersUp` (r:1 w:0) + /// Proof: `Elections::RunnersUp` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Elections::Voting` (r:1 w:1) + /// Proof: `Elections::Voting` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Balances::Locks` (r:1 w:1) + /// Proof: `Balances::Locks` (`max_values`: None, `max_size`: Some(1299), added: 3774, mode: `MaxEncodedLen`) + /// Storage: `Balances::Freezes` (r:1 w:0) + /// Proof: `Balances::Freezes` (`max_values`: None, `max_size`: Some(67), added: 2542, mode: `MaxEncodedLen`) /// The range of component `v` is `[1, 16]`. fn vote_equal(v: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `403 + v * (80 ±0)` // Estimated: `4764 + v * (80 ±0)` - // Minimum execution time: 33_028_000 picoseconds. - Weight::from_parts(34_073_914, 4764) - // Standard Error: 3_474 - .saturating_add(Weight::from_parts(205_252, 0).saturating_mul(v.into())) + // Minimum execution time: 30_160_000 picoseconds. + Weight::from_parts(31_473_640, 4764) + // Standard Error: 3_581 + .saturating_add(Weight::from_parts(135_663, 0).saturating_mul(v.into())) .saturating_add(T::DbWeight::get().reads(6_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) .saturating_add(Weight::from_parts(0, 80).saturating_mul(v.into())) } - /// Storage: Elections Candidates (r:1 w:0) - /// Proof Skipped: Elections Candidates (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Elections Members (r:1 w:0) - /// Proof Skipped: Elections Members (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Elections RunnersUp (r:1 w:0) - /// Proof Skipped: Elections RunnersUp (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Elections Voting (r:1 w:1) - /// Proof Skipped: Elections Voting (max_values: None, max_size: None, mode: Measured) - /// Storage: Balances Locks (r:1 w:1) - /// Proof: Balances Locks (max_values: None, max_size: Some(1299), added: 3774, mode: MaxEncodedLen) - /// Storage: Balances Freezes (r:1 w:0) - /// Proof: Balances Freezes (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen) + /// Storage: `Elections::Candidates` (r:1 w:0) + /// Proof: `Elections::Candidates` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Elections::Members` (r:1 w:0) + /// Proof: `Elections::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Elections::RunnersUp` (r:1 w:0) + /// Proof: `Elections::RunnersUp` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Elections::Voting` (r:1 w:1) + /// Proof: `Elections::Voting` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Balances::Locks` (r:1 w:1) + /// Proof: `Balances::Locks` (`max_values`: None, `max_size`: Some(1299), added: 3774, mode: `MaxEncodedLen`) + /// Storage: `Balances::Freezes` (r:1 w:0) + /// Proof: `Balances::Freezes` (`max_values`: None, `max_size`: Some(67), added: 2542, mode: `MaxEncodedLen`) /// The range of component `v` is `[2, 16]`. fn vote_more(v: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `371 + v * (80 ±0)` // Estimated: `4764 + v * (80 ±0)` - // Minimum execution time: 45_725_000 picoseconds. - Weight::from_parts(47_169_586, 4764) - // Standard Error: 5_148 - .saturating_add(Weight::from_parts(213_742, 0).saturating_mul(v.into())) + // Minimum execution time: 41_429_000 picoseconds. + Weight::from_parts(42_684_714, 4764) + // Standard Error: 4_828 + .saturating_add(Weight::from_parts(173_254, 0).saturating_mul(v.into())) .saturating_add(T::DbWeight::get().reads(6_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) .saturating_add(Weight::from_parts(0, 80).saturating_mul(v.into())) } - /// Storage: Elections Candidates (r:1 w:0) - /// Proof Skipped: Elections Candidates (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Elections Members (r:1 w:0) - /// Proof Skipped: Elections Members (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Elections RunnersUp (r:1 w:0) - /// Proof Skipped: Elections RunnersUp (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Elections Voting (r:1 w:1) - /// Proof Skipped: Elections Voting (max_values: None, max_size: None, mode: Measured) - /// Storage: Balances Locks (r:1 w:1) - /// Proof: Balances Locks (max_values: None, max_size: Some(1299), added: 3774, mode: MaxEncodedLen) - /// Storage: Balances Freezes (r:1 w:0) - /// Proof: Balances Freezes (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen) + /// Storage: `Elections::Candidates` (r:1 w:0) + /// Proof: `Elections::Candidates` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Elections::Members` (r:1 w:0) + /// Proof: `Elections::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Elections::RunnersUp` (r:1 w:0) + /// Proof: `Elections::RunnersUp` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Elections::Voting` (r:1 w:1) + /// Proof: `Elections::Voting` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Balances::Locks` (r:1 w:1) + /// Proof: `Balances::Locks` (`max_values`: None, `max_size`: Some(1299), added: 3774, mode: `MaxEncodedLen`) + /// Storage: `Balances::Freezes` (r:1 w:0) + /// Proof: `Balances::Freezes` (`max_values`: None, `max_size`: Some(67), added: 2542, mode: `MaxEncodedLen`) /// The range of component `v` is `[2, 16]`. fn vote_less(v: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `403 + v * (80 ±0)` // Estimated: `4764 + v * (80 ±0)` - // Minimum execution time: 45_519_000 picoseconds. - Weight::from_parts(47_339_108, 4764) - // Standard Error: 5_501 - .saturating_add(Weight::from_parts(195_247, 0).saturating_mul(v.into())) + // Minimum execution time: 41_013_000 picoseconds. + Weight::from_parts(42_555_632, 4764) + // Standard Error: 4_627 + .saturating_add(Weight::from_parts(162_225, 0).saturating_mul(v.into())) .saturating_add(T::DbWeight::get().reads(6_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) .saturating_add(Weight::from_parts(0, 80).saturating_mul(v.into())) } - /// Storage: Elections Voting (r:1 w:1) - /// Proof Skipped: Elections Voting (max_values: None, max_size: None, mode: Measured) - /// Storage: Balances Locks (r:1 w:1) - /// Proof: Balances Locks (max_values: None, max_size: Some(1299), added: 3774, mode: MaxEncodedLen) - /// Storage: Balances Freezes (r:1 w:0) - /// Proof: Balances Freezes (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen) + /// Storage: `Elections::Voting` (r:1 w:1) + /// Proof: `Elections::Voting` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Balances::Locks` (r:1 w:1) + /// Proof: `Balances::Locks` (`max_values`: None, `max_size`: Some(1299), added: 3774, mode: `MaxEncodedLen`) + /// Storage: `Balances::Freezes` (r:1 w:0) + /// Proof: `Balances::Freezes` (`max_values`: None, `max_size`: Some(67), added: 2542, mode: `MaxEncodedLen`) fn remove_voter() -> Weight { // Proof Size summary in bytes: // Measured: `925` // Estimated: `4764` - // Minimum execution time: 50_386_000 picoseconds. - Weight::from_parts(51_378_000, 4764) + // Minimum execution time: 43_431_000 picoseconds. + Weight::from_parts(44_500_000, 4764) .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } - /// Storage: Elections Candidates (r:1 w:1) - /// Proof Skipped: Elections Candidates (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Elections Members (r:1 w:0) - /// Proof Skipped: Elections Members (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Elections RunnersUp (r:1 w:0) - /// Proof Skipped: Elections RunnersUp (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: `Elections::Candidates` (r:1 w:1) + /// Proof: `Elections::Candidates` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Elections::Members` (r:1 w:0) + /// Proof: `Elections::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Elections::RunnersUp` (r:1 w:0) + /// Proof: `Elections::RunnersUp` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) /// The range of component `c` is `[1, 64]`. fn submit_candidacy(c: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `1570 + c * (48 ±0)` // Estimated: `3055 + c * (48 ±0)` - // Minimum execution time: 38_987_000 picoseconds. - Weight::from_parts(41_302_276, 3055) - // Standard Error: 2_047 - .saturating_add(Weight::from_parts(125_200, 0).saturating_mul(c.into())) + // Minimum execution time: 34_520_000 picoseconds. + Weight::from_parts(35_911_881, 3055) + // Standard Error: 1_885 + .saturating_add(Weight::from_parts(123_837, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) .saturating_add(Weight::from_parts(0, 48).saturating_mul(c.into())) } - /// Storage: Elections Candidates (r:1 w:1) - /// Proof Skipped: Elections Candidates (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: `Elections::Candidates` (r:1 w:1) + /// Proof: `Elections::Candidates` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) /// The range of component `c` is `[1, 64]`. fn renounce_candidacy_candidate(c: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `285 + c * (48 ±0)` // Estimated: `1770 + c * (48 ±0)` - // Minimum execution time: 33_510_000 picoseconds. - Weight::from_parts(34_947_760, 1770) - // Standard Error: 1_781 - .saturating_add(Weight::from_parts(78_851, 0).saturating_mul(c.into())) + // Minimum execution time: 28_020_000 picoseconds. + Weight::from_parts(29_227_248, 1770) + // Standard Error: 1_202 + .saturating_add(Weight::from_parts(83_328, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) .saturating_add(Weight::from_parts(0, 48).saturating_mul(c.into())) } - /// Storage: Elections Members (r:1 w:1) - /// Proof Skipped: Elections Members (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Elections RunnersUp (r:1 w:1) - /// Proof Skipped: Elections RunnersUp (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Council Prime (r:1 w:1) - /// Proof Skipped: Council Prime (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Council Proposals (r:1 w:0) - /// Proof Skipped: Council Proposals (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Council Members (r:0 w:1) - /// Proof Skipped: Council Members (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: `Elections::Members` (r:1 w:1) + /// Proof: `Elections::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Elections::RunnersUp` (r:1 w:1) + /// Proof: `Elections::RunnersUp` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Council::Prime` (r:1 w:1) + /// Proof: `Council::Prime` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Council::Proposals` (r:1 w:0) + /// Proof: `Council::Proposals` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Council::Members` (r:0 w:1) + /// Proof: `Council::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) fn renounce_candidacy_members() -> Weight { // Proof Size summary in bytes: - // Measured: `1900` - // Estimated: `3385` - // Minimum execution time: 50_603_000 picoseconds. - Weight::from_parts(51_715_000, 3385) + // Measured: `1933` + // Estimated: `3418` + // Minimum execution time: 42_489_000 picoseconds. + Weight::from_parts(43_710_000, 3418) .saturating_add(T::DbWeight::get().reads(4_u64)) .saturating_add(T::DbWeight::get().writes(4_u64)) } - /// Storage: Elections RunnersUp (r:1 w:1) - /// Proof Skipped: Elections RunnersUp (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: `Elections::RunnersUp` (r:1 w:1) + /// Proof: `Elections::RunnersUp` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) fn renounce_candidacy_runners_up() -> Weight { // Proof Size summary in bytes: // Measured: `880` // Estimated: `2365` - // Minimum execution time: 33_441_000 picoseconds. - Weight::from_parts(34_812_000, 2365) + // Minimum execution time: 29_228_000 picoseconds. + Weight::from_parts(30_343_000, 2365) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: Benchmark Override (r:0 w:0) - /// Proof Skipped: Benchmark Override (max_values: None, max_size: None, mode: Measured) + /// Storage: `Benchmark::Override` (r:0 w:0) + /// Proof: `Benchmark::Override` (`max_values`: None, `max_size`: None, mode: `Measured`) fn remove_member_without_replacement() -> Weight { // Proof Size summary in bytes: // Measured: `0` @@ -232,87 +231,90 @@ impl WeightInfo for SubstrateWeight { // Minimum execution time: 2_000_000_000_000 picoseconds. Weight::from_parts(2_000_000_000_000, 0) } - /// Storage: Elections Members (r:1 w:1) - /// Proof Skipped: Elections Members (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) - /// Storage: Elections RunnersUp (r:1 w:1) - /// Proof Skipped: Elections RunnersUp (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Council Prime (r:1 w:1) - /// Proof Skipped: Council Prime (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Council Proposals (r:1 w:0) - /// Proof Skipped: Council Proposals (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Council Members (r:0 w:1) - /// Proof Skipped: Council Members (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: `Elections::Members` (r:1 w:1) + /// Proof: `Elections::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `Elections::RunnersUp` (r:1 w:1) + /// Proof: `Elections::RunnersUp` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Council::Prime` (r:1 w:1) + /// Proof: `Council::Prime` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Council::Proposals` (r:1 w:0) + /// Proof: `Council::Proposals` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Council::Members` (r:0 w:1) + /// Proof: `Council::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) fn remove_member_with_replacement() -> Weight { // Proof Size summary in bytes: - // Measured: `1900` + // Measured: `1933` // Estimated: `3593` - // Minimum execution time: 57_289_000 picoseconds. - Weight::from_parts(58_328_000, 3593) + // Minimum execution time: 46_909_000 picoseconds. + Weight::from_parts(47_907_000, 3593) .saturating_add(T::DbWeight::get().reads(5_u64)) .saturating_add(T::DbWeight::get().writes(5_u64)) } - /// Storage: Elections Voting (r:513 w:512) - /// Proof Skipped: Elections Voting (max_values: None, max_size: None, mode: Measured) - /// Storage: Elections Members (r:1 w:0) - /// Proof Skipped: Elections Members (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Elections RunnersUp (r:1 w:0) - /// Proof Skipped: Elections RunnersUp (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Elections Candidates (r:1 w:0) - /// Proof Skipped: Elections Candidates (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Balances Locks (r:512 w:512) - /// Proof: Balances Locks (max_values: None, max_size: Some(1299), added: 3774, mode: MaxEncodedLen) - /// Storage: Balances Freezes (r:512 w:0) - /// Proof: Balances Freezes (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen) - /// Storage: System Account (r:512 w:512) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: `Elections::Voting` (r:257 w:256) + /// Proof: `Elections::Voting` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Elections::Members` (r:1 w:0) + /// Proof: `Elections::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Elections::RunnersUp` (r:1 w:0) + /// Proof: `Elections::RunnersUp` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Elections::Candidates` (r:1 w:0) + /// Proof: `Elections::Candidates` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Balances::Locks` (r:256 w:256) + /// Proof: `Balances::Locks` (`max_values`: None, `max_size`: Some(1299), added: 3774, mode: `MaxEncodedLen`) + /// Storage: `Balances::Freezes` (r:256 w:0) + /// Proof: `Balances::Freezes` (`max_values`: None, `max_size`: Some(67), added: 2542, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:256 w:256) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) /// The range of component `v` is `[256, 512]`. /// The range of component `d` is `[0, 256]`. - fn clean_defunct_voters(v: u32, _d: u32, ) -> Weight { + fn clean_defunct_voters(v: u32, d: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `1149 + v * (811 ±0)` - // Estimated: `4621 + v * (3774 ±0)` - // Minimum execution time: 18_774_231_000 picoseconds. - Weight::from_parts(18_933_040_000, 4621) - // Standard Error: 301_534 - .saturating_add(Weight::from_parts(44_306_903, 0).saturating_mul(v.into())) + // Measured: `0 + d * (818 ±0) + v * (57 ±0)` + // Estimated: `24906 + d * (3774 ±0) + v * (24 ±0)` + // Minimum execution time: 5_175_000 picoseconds. + Weight::from_parts(5_797_000, 24906) + // Standard Error: 10_951 + .saturating_add(Weight::from_parts(39_675, 0).saturating_mul(v.into())) + // Standard Error: 23_850 + .saturating_add(Weight::from_parts(53_959_224, 0).saturating_mul(d.into())) .saturating_add(T::DbWeight::get().reads(4_u64)) - .saturating_add(T::DbWeight::get().reads((4_u64).saturating_mul(v.into()))) - .saturating_add(T::DbWeight::get().writes((3_u64).saturating_mul(v.into()))) - .saturating_add(Weight::from_parts(0, 3774).saturating_mul(v.into())) + .saturating_add(T::DbWeight::get().reads((4_u64).saturating_mul(d.into()))) + .saturating_add(T::DbWeight::get().writes((3_u64).saturating_mul(d.into()))) + .saturating_add(Weight::from_parts(0, 3774).saturating_mul(d.into())) + .saturating_add(Weight::from_parts(0, 24).saturating_mul(v.into())) } - /// Storage: Elections Candidates (r:1 w:1) - /// Proof Skipped: Elections Candidates (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Elections Members (r:1 w:1) - /// Proof Skipped: Elections Members (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Elections RunnersUp (r:1 w:1) - /// Proof Skipped: Elections RunnersUp (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Elections Voting (r:513 w:0) - /// Proof Skipped: Elections Voting (max_values: None, max_size: None, mode: Measured) - /// Storage: Council Proposals (r:1 w:0) - /// Proof Skipped: Council Proposals (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: System Account (r:44 w:44) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) - /// Storage: Elections ElectionRounds (r:1 w:1) - /// Proof Skipped: Elections ElectionRounds (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Council Members (r:0 w:1) - /// Proof Skipped: Council Members (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Council Prime (r:0 w:1) - /// Proof Skipped: Council Prime (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: `Elections::Candidates` (r:1 w:1) + /// Proof: `Elections::Candidates` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Elections::Members` (r:1 w:1) + /// Proof: `Elections::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Elections::RunnersUp` (r:1 w:1) + /// Proof: `Elections::RunnersUp` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Elections::Voting` (r:513 w:0) + /// Proof: `Elections::Voting` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Council::Proposals` (r:1 w:0) + /// Proof: `Council::Proposals` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `System::Account` (r:44 w:44) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `Elections::ElectionRounds` (r:1 w:1) + /// Proof: `Elections::ElectionRounds` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Council::Members` (r:0 w:1) + /// Proof: `Council::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Council::Prime` (r:0 w:1) + /// Proof: `Council::Prime` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) /// The range of component `c` is `[1, 64]`. /// The range of component `v` is `[1, 512]`. /// The range of component `e` is `[512, 8192]`. fn election_phragmen(c: u32, v: u32, e: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `0 + e * (28 ±0) + v * (606 ±0)` - // Estimated: `178887 + c * (2135 ±7) + e * (12 ±0) + v * (2653 ±6)` - // Minimum execution time: 1_281_877_000 picoseconds. - Weight::from_parts(1_288_147_000, 178887) - // Standard Error: 528_851 - .saturating_add(Weight::from_parts(17_761_407, 0).saturating_mul(v.into())) - // Standard Error: 33_932 - .saturating_add(Weight::from_parts(698_277, 0).saturating_mul(e.into())) + // Estimated: `178920 + c * (2135 ±7) + e * (12 ±0) + v * (2653 ±6)` + // Minimum execution time: 1_136_994_000 picoseconds. + Weight::from_parts(1_142_143_000, 178920) + // Standard Error: 595_387 + .saturating_add(Weight::from_parts(19_373_386, 0).saturating_mul(v.into())) + // Standard Error: 38_201 + .saturating_add(Weight::from_parts(797_696, 0).saturating_mul(e.into())) .saturating_add(T::DbWeight::get().reads(21_u64)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(c.into()))) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(v.into()))) @@ -324,164 +326,164 @@ impl WeightInfo for SubstrateWeight { } } -// For backwards compatibility and tests +// For backwards compatibility and tests. impl WeightInfo for () { - /// Storage: Elections Candidates (r:1 w:0) - /// Proof Skipped: Elections Candidates (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Elections Members (r:1 w:0) - /// Proof Skipped: Elections Members (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Elections RunnersUp (r:1 w:0) - /// Proof Skipped: Elections RunnersUp (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Elections Voting (r:1 w:1) - /// Proof Skipped: Elections Voting (max_values: None, max_size: None, mode: Measured) - /// Storage: Balances Locks (r:1 w:1) - /// Proof: Balances Locks (max_values: None, max_size: Some(1299), added: 3774, mode: MaxEncodedLen) - /// Storage: Balances Freezes (r:1 w:0) - /// Proof: Balances Freezes (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen) + /// Storage: `Elections::Candidates` (r:1 w:0) + /// Proof: `Elections::Candidates` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Elections::Members` (r:1 w:0) + /// Proof: `Elections::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Elections::RunnersUp` (r:1 w:0) + /// Proof: `Elections::RunnersUp` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Elections::Voting` (r:1 w:1) + /// Proof: `Elections::Voting` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Balances::Locks` (r:1 w:1) + /// Proof: `Balances::Locks` (`max_values`: None, `max_size`: Some(1299), added: 3774, mode: `MaxEncodedLen`) + /// Storage: `Balances::Freezes` (r:1 w:0) + /// Proof: `Balances::Freezes` (`max_values`: None, `max_size`: Some(67), added: 2542, mode: `MaxEncodedLen`) /// The range of component `v` is `[1, 16]`. fn vote_equal(v: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `403 + v * (80 ±0)` // Estimated: `4764 + v * (80 ±0)` - // Minimum execution time: 33_028_000 picoseconds. - Weight::from_parts(34_073_914, 4764) - // Standard Error: 3_474 - .saturating_add(Weight::from_parts(205_252, 0).saturating_mul(v.into())) + // Minimum execution time: 30_160_000 picoseconds. + Weight::from_parts(31_473_640, 4764) + // Standard Error: 3_581 + .saturating_add(Weight::from_parts(135_663, 0).saturating_mul(v.into())) .saturating_add(RocksDbWeight::get().reads(6_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) .saturating_add(Weight::from_parts(0, 80).saturating_mul(v.into())) } - /// Storage: Elections Candidates (r:1 w:0) - /// Proof Skipped: Elections Candidates (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Elections Members (r:1 w:0) - /// Proof Skipped: Elections Members (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Elections RunnersUp (r:1 w:0) - /// Proof Skipped: Elections RunnersUp (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Elections Voting (r:1 w:1) - /// Proof Skipped: Elections Voting (max_values: None, max_size: None, mode: Measured) - /// Storage: Balances Locks (r:1 w:1) - /// Proof: Balances Locks (max_values: None, max_size: Some(1299), added: 3774, mode: MaxEncodedLen) - /// Storage: Balances Freezes (r:1 w:0) - /// Proof: Balances Freezes (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen) + /// Storage: `Elections::Candidates` (r:1 w:0) + /// Proof: `Elections::Candidates` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Elections::Members` (r:1 w:0) + /// Proof: `Elections::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Elections::RunnersUp` (r:1 w:0) + /// Proof: `Elections::RunnersUp` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Elections::Voting` (r:1 w:1) + /// Proof: `Elections::Voting` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Balances::Locks` (r:1 w:1) + /// Proof: `Balances::Locks` (`max_values`: None, `max_size`: Some(1299), added: 3774, mode: `MaxEncodedLen`) + /// Storage: `Balances::Freezes` (r:1 w:0) + /// Proof: `Balances::Freezes` (`max_values`: None, `max_size`: Some(67), added: 2542, mode: `MaxEncodedLen`) /// The range of component `v` is `[2, 16]`. fn vote_more(v: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `371 + v * (80 ±0)` // Estimated: `4764 + v * (80 ±0)` - // Minimum execution time: 45_725_000 picoseconds. - Weight::from_parts(47_169_586, 4764) - // Standard Error: 5_148 - .saturating_add(Weight::from_parts(213_742, 0).saturating_mul(v.into())) + // Minimum execution time: 41_429_000 picoseconds. + Weight::from_parts(42_684_714, 4764) + // Standard Error: 4_828 + .saturating_add(Weight::from_parts(173_254, 0).saturating_mul(v.into())) .saturating_add(RocksDbWeight::get().reads(6_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) .saturating_add(Weight::from_parts(0, 80).saturating_mul(v.into())) } - /// Storage: Elections Candidates (r:1 w:0) - /// Proof Skipped: Elections Candidates (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Elections Members (r:1 w:0) - /// Proof Skipped: Elections Members (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Elections RunnersUp (r:1 w:0) - /// Proof Skipped: Elections RunnersUp (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Elections Voting (r:1 w:1) - /// Proof Skipped: Elections Voting (max_values: None, max_size: None, mode: Measured) - /// Storage: Balances Locks (r:1 w:1) - /// Proof: Balances Locks (max_values: None, max_size: Some(1299), added: 3774, mode: MaxEncodedLen) - /// Storage: Balances Freezes (r:1 w:0) - /// Proof: Balances Freezes (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen) + /// Storage: `Elections::Candidates` (r:1 w:0) + /// Proof: `Elections::Candidates` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Elections::Members` (r:1 w:0) + /// Proof: `Elections::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Elections::RunnersUp` (r:1 w:0) + /// Proof: `Elections::RunnersUp` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Elections::Voting` (r:1 w:1) + /// Proof: `Elections::Voting` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Balances::Locks` (r:1 w:1) + /// Proof: `Balances::Locks` (`max_values`: None, `max_size`: Some(1299), added: 3774, mode: `MaxEncodedLen`) + /// Storage: `Balances::Freezes` (r:1 w:0) + /// Proof: `Balances::Freezes` (`max_values`: None, `max_size`: Some(67), added: 2542, mode: `MaxEncodedLen`) /// The range of component `v` is `[2, 16]`. fn vote_less(v: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `403 + v * (80 ±0)` // Estimated: `4764 + v * (80 ±0)` - // Minimum execution time: 45_519_000 picoseconds. - Weight::from_parts(47_339_108, 4764) - // Standard Error: 5_501 - .saturating_add(Weight::from_parts(195_247, 0).saturating_mul(v.into())) + // Minimum execution time: 41_013_000 picoseconds. + Weight::from_parts(42_555_632, 4764) + // Standard Error: 4_627 + .saturating_add(Weight::from_parts(162_225, 0).saturating_mul(v.into())) .saturating_add(RocksDbWeight::get().reads(6_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) .saturating_add(Weight::from_parts(0, 80).saturating_mul(v.into())) } - /// Storage: Elections Voting (r:1 w:1) - /// Proof Skipped: Elections Voting (max_values: None, max_size: None, mode: Measured) - /// Storage: Balances Locks (r:1 w:1) - /// Proof: Balances Locks (max_values: None, max_size: Some(1299), added: 3774, mode: MaxEncodedLen) - /// Storage: Balances Freezes (r:1 w:0) - /// Proof: Balances Freezes (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen) + /// Storage: `Elections::Voting` (r:1 w:1) + /// Proof: `Elections::Voting` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Balances::Locks` (r:1 w:1) + /// Proof: `Balances::Locks` (`max_values`: None, `max_size`: Some(1299), added: 3774, mode: `MaxEncodedLen`) + /// Storage: `Balances::Freezes` (r:1 w:0) + /// Proof: `Balances::Freezes` (`max_values`: None, `max_size`: Some(67), added: 2542, mode: `MaxEncodedLen`) fn remove_voter() -> Weight { // Proof Size summary in bytes: // Measured: `925` // Estimated: `4764` - // Minimum execution time: 50_386_000 picoseconds. - Weight::from_parts(51_378_000, 4764) + // Minimum execution time: 43_431_000 picoseconds. + Weight::from_parts(44_500_000, 4764) .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } - /// Storage: Elections Candidates (r:1 w:1) - /// Proof Skipped: Elections Candidates (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Elections Members (r:1 w:0) - /// Proof Skipped: Elections Members (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Elections RunnersUp (r:1 w:0) - /// Proof Skipped: Elections RunnersUp (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: `Elections::Candidates` (r:1 w:1) + /// Proof: `Elections::Candidates` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Elections::Members` (r:1 w:0) + /// Proof: `Elections::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Elections::RunnersUp` (r:1 w:0) + /// Proof: `Elections::RunnersUp` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) /// The range of component `c` is `[1, 64]`. fn submit_candidacy(c: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `1570 + c * (48 ±0)` // Estimated: `3055 + c * (48 ±0)` - // Minimum execution time: 38_987_000 picoseconds. - Weight::from_parts(41_302_276, 3055) - // Standard Error: 2_047 - .saturating_add(Weight::from_parts(125_200, 0).saturating_mul(c.into())) + // Minimum execution time: 34_520_000 picoseconds. + Weight::from_parts(35_911_881, 3055) + // Standard Error: 1_885 + .saturating_add(Weight::from_parts(123_837, 0).saturating_mul(c.into())) .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) .saturating_add(Weight::from_parts(0, 48).saturating_mul(c.into())) } - /// Storage: Elections Candidates (r:1 w:1) - /// Proof Skipped: Elections Candidates (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: `Elections::Candidates` (r:1 w:1) + /// Proof: `Elections::Candidates` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) /// The range of component `c` is `[1, 64]`. fn renounce_candidacy_candidate(c: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `285 + c * (48 ±0)` // Estimated: `1770 + c * (48 ±0)` - // Minimum execution time: 33_510_000 picoseconds. - Weight::from_parts(34_947_760, 1770) - // Standard Error: 1_781 - .saturating_add(Weight::from_parts(78_851, 0).saturating_mul(c.into())) + // Minimum execution time: 28_020_000 picoseconds. + Weight::from_parts(29_227_248, 1770) + // Standard Error: 1_202 + .saturating_add(Weight::from_parts(83_328, 0).saturating_mul(c.into())) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) .saturating_add(Weight::from_parts(0, 48).saturating_mul(c.into())) } - /// Storage: Elections Members (r:1 w:1) - /// Proof Skipped: Elections Members (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Elections RunnersUp (r:1 w:1) - /// Proof Skipped: Elections RunnersUp (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Council Prime (r:1 w:1) - /// Proof Skipped: Council Prime (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Council Proposals (r:1 w:0) - /// Proof Skipped: Council Proposals (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Council Members (r:0 w:1) - /// Proof Skipped: Council Members (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: `Elections::Members` (r:1 w:1) + /// Proof: `Elections::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Elections::RunnersUp` (r:1 w:1) + /// Proof: `Elections::RunnersUp` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Council::Prime` (r:1 w:1) + /// Proof: `Council::Prime` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Council::Proposals` (r:1 w:0) + /// Proof: `Council::Proposals` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Council::Members` (r:0 w:1) + /// Proof: `Council::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) fn renounce_candidacy_members() -> Weight { // Proof Size summary in bytes: - // Measured: `1900` - // Estimated: `3385` - // Minimum execution time: 50_603_000 picoseconds. - Weight::from_parts(51_715_000, 3385) + // Measured: `1933` + // Estimated: `3418` + // Minimum execution time: 42_489_000 picoseconds. + Weight::from_parts(43_710_000, 3418) .saturating_add(RocksDbWeight::get().reads(4_u64)) .saturating_add(RocksDbWeight::get().writes(4_u64)) } - /// Storage: Elections RunnersUp (r:1 w:1) - /// Proof Skipped: Elections RunnersUp (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: `Elections::RunnersUp` (r:1 w:1) + /// Proof: `Elections::RunnersUp` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) fn renounce_candidacy_runners_up() -> Weight { // Proof Size summary in bytes: // Measured: `880` // Estimated: `2365` - // Minimum execution time: 33_441_000 picoseconds. - Weight::from_parts(34_812_000, 2365) + // Minimum execution time: 29_228_000 picoseconds. + Weight::from_parts(30_343_000, 2365) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Benchmark Override (r:0 w:0) - /// Proof Skipped: Benchmark Override (max_values: None, max_size: None, mode: Measured) + /// Storage: `Benchmark::Override` (r:0 w:0) + /// Proof: `Benchmark::Override` (`max_values`: None, `max_size`: None, mode: `Measured`) fn remove_member_without_replacement() -> Weight { // Proof Size summary in bytes: // Measured: `0` @@ -489,87 +491,90 @@ impl WeightInfo for () { // Minimum execution time: 2_000_000_000_000 picoseconds. Weight::from_parts(2_000_000_000_000, 0) } - /// Storage: Elections Members (r:1 w:1) - /// Proof Skipped: Elections Members (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) - /// Storage: Elections RunnersUp (r:1 w:1) - /// Proof Skipped: Elections RunnersUp (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Council Prime (r:1 w:1) - /// Proof Skipped: Council Prime (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Council Proposals (r:1 w:0) - /// Proof Skipped: Council Proposals (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Council Members (r:0 w:1) - /// Proof Skipped: Council Members (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: `Elections::Members` (r:1 w:1) + /// Proof: `Elections::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `Elections::RunnersUp` (r:1 w:1) + /// Proof: `Elections::RunnersUp` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Council::Prime` (r:1 w:1) + /// Proof: `Council::Prime` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Council::Proposals` (r:1 w:0) + /// Proof: `Council::Proposals` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Council::Members` (r:0 w:1) + /// Proof: `Council::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) fn remove_member_with_replacement() -> Weight { // Proof Size summary in bytes: - // Measured: `1900` + // Measured: `1933` // Estimated: `3593` - // Minimum execution time: 57_289_000 picoseconds. - Weight::from_parts(58_328_000, 3593) + // Minimum execution time: 46_909_000 picoseconds. + Weight::from_parts(47_907_000, 3593) .saturating_add(RocksDbWeight::get().reads(5_u64)) .saturating_add(RocksDbWeight::get().writes(5_u64)) } - /// Storage: Elections Voting (r:513 w:512) - /// Proof Skipped: Elections Voting (max_values: None, max_size: None, mode: Measured) - /// Storage: Elections Members (r:1 w:0) - /// Proof Skipped: Elections Members (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Elections RunnersUp (r:1 w:0) - /// Proof Skipped: Elections RunnersUp (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Elections Candidates (r:1 w:0) - /// Proof Skipped: Elections Candidates (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Balances Locks (r:512 w:512) - /// Proof: Balances Locks (max_values: None, max_size: Some(1299), added: 3774, mode: MaxEncodedLen) - /// Storage: Balances Freezes (r:512 w:0) - /// Proof: Balances Freezes (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen) - /// Storage: System Account (r:512 w:512) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: `Elections::Voting` (r:257 w:256) + /// Proof: `Elections::Voting` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Elections::Members` (r:1 w:0) + /// Proof: `Elections::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Elections::RunnersUp` (r:1 w:0) + /// Proof: `Elections::RunnersUp` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Elections::Candidates` (r:1 w:0) + /// Proof: `Elections::Candidates` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Balances::Locks` (r:256 w:256) + /// Proof: `Balances::Locks` (`max_values`: None, `max_size`: Some(1299), added: 3774, mode: `MaxEncodedLen`) + /// Storage: `Balances::Freezes` (r:256 w:0) + /// Proof: `Balances::Freezes` (`max_values`: None, `max_size`: Some(67), added: 2542, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:256 w:256) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) /// The range of component `v` is `[256, 512]`. /// The range of component `d` is `[0, 256]`. - fn clean_defunct_voters(v: u32, _d: u32, ) -> Weight { + fn clean_defunct_voters(v: u32, d: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `1149 + v * (811 ±0)` - // Estimated: `4621 + v * (3774 ±0)` - // Minimum execution time: 18_774_231_000 picoseconds. - Weight::from_parts(18_933_040_000, 4621) - // Standard Error: 301_534 - .saturating_add(Weight::from_parts(44_306_903, 0).saturating_mul(v.into())) + // Measured: `0 + d * (818 ±0) + v * (57 ±0)` + // Estimated: `24906 + d * (3774 ±0) + v * (24 ±0)` + // Minimum execution time: 5_175_000 picoseconds. + Weight::from_parts(5_797_000, 24906) + // Standard Error: 10_951 + .saturating_add(Weight::from_parts(39_675, 0).saturating_mul(v.into())) + // Standard Error: 23_850 + .saturating_add(Weight::from_parts(53_959_224, 0).saturating_mul(d.into())) .saturating_add(RocksDbWeight::get().reads(4_u64)) - .saturating_add(RocksDbWeight::get().reads((4_u64).saturating_mul(v.into()))) - .saturating_add(RocksDbWeight::get().writes((3_u64).saturating_mul(v.into()))) - .saturating_add(Weight::from_parts(0, 3774).saturating_mul(v.into())) + .saturating_add(RocksDbWeight::get().reads((4_u64).saturating_mul(d.into()))) + .saturating_add(RocksDbWeight::get().writes((3_u64).saturating_mul(d.into()))) + .saturating_add(Weight::from_parts(0, 3774).saturating_mul(d.into())) + .saturating_add(Weight::from_parts(0, 24).saturating_mul(v.into())) } - /// Storage: Elections Candidates (r:1 w:1) - /// Proof Skipped: Elections Candidates (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Elections Members (r:1 w:1) - /// Proof Skipped: Elections Members (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Elections RunnersUp (r:1 w:1) - /// Proof Skipped: Elections RunnersUp (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Elections Voting (r:513 w:0) - /// Proof Skipped: Elections Voting (max_values: None, max_size: None, mode: Measured) - /// Storage: Council Proposals (r:1 w:0) - /// Proof Skipped: Council Proposals (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: System Account (r:44 w:44) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) - /// Storage: Elections ElectionRounds (r:1 w:1) - /// Proof Skipped: Elections ElectionRounds (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Council Members (r:0 w:1) - /// Proof Skipped: Council Members (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Council Prime (r:0 w:1) - /// Proof Skipped: Council Prime (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: `Elections::Candidates` (r:1 w:1) + /// Proof: `Elections::Candidates` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Elections::Members` (r:1 w:1) + /// Proof: `Elections::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Elections::RunnersUp` (r:1 w:1) + /// Proof: `Elections::RunnersUp` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Elections::Voting` (r:513 w:0) + /// Proof: `Elections::Voting` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Council::Proposals` (r:1 w:0) + /// Proof: `Council::Proposals` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `System::Account` (r:44 w:44) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `Elections::ElectionRounds` (r:1 w:1) + /// Proof: `Elections::ElectionRounds` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Council::Members` (r:0 w:1) + /// Proof: `Council::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Council::Prime` (r:0 w:1) + /// Proof: `Council::Prime` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) /// The range of component `c` is `[1, 64]`. /// The range of component `v` is `[1, 512]`. /// The range of component `e` is `[512, 8192]`. fn election_phragmen(c: u32, v: u32, e: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `0 + e * (28 ±0) + v * (606 ±0)` - // Estimated: `178887 + c * (2135 ±7) + e * (12 ±0) + v * (2653 ±6)` - // Minimum execution time: 1_281_877_000 picoseconds. - Weight::from_parts(1_288_147_000, 178887) - // Standard Error: 528_851 - .saturating_add(Weight::from_parts(17_761_407, 0).saturating_mul(v.into())) - // Standard Error: 33_932 - .saturating_add(Weight::from_parts(698_277, 0).saturating_mul(e.into())) + // Estimated: `178920 + c * (2135 ±7) + e * (12 ±0) + v * (2653 ±6)` + // Minimum execution time: 1_136_994_000 picoseconds. + Weight::from_parts(1_142_143_000, 178920) + // Standard Error: 595_387 + .saturating_add(Weight::from_parts(19_373_386, 0).saturating_mul(v.into())) + // Standard Error: 38_201 + .saturating_add(Weight::from_parts(797_696, 0).saturating_mul(e.into())) .saturating_add(RocksDbWeight::get().reads(21_u64)) .saturating_add(RocksDbWeight::get().reads((1_u64).saturating_mul(c.into()))) .saturating_add(RocksDbWeight::get().reads((1_u64).saturating_mul(v.into()))) diff --git a/substrate/frame/examples/Cargo.toml b/substrate/frame/examples/Cargo.toml index eb6355edd312a1ff5f865c235ffd034f085a3027..45c7440eb89135eca98cf00a4aaf5d6ad2c094ca 100644 --- a/substrate/frame/examples/Cargo.toml +++ b/substrate/frame/examples/Cargo.toml @@ -23,6 +23,7 @@ pallet-example-frame-crate = { path = "frame-crate", default-features = false } pallet-example-kitchensink = { path = "kitchensink", default-features = false } pallet-example-offchain-worker = { path = "offchain-worker", default-features = false } pallet-example-split = { path = "split", default-features = false } +pallet-example-single-block-migrations = { path = "single-block-migrations", default-features = false } pallet-example-tasks = { path = "tasks", default-features = false } [features] @@ -34,6 +35,7 @@ std = [ "pallet-example-frame-crate/std", "pallet-example-kitchensink/std", "pallet-example-offchain-worker/std", + "pallet-example-single-block-migrations/std", "pallet-example-split/std", "pallet-example-tasks/std", ] @@ -43,6 +45,7 @@ try-runtime = [ "pallet-example-basic/try-runtime", "pallet-example-kitchensink/try-runtime", "pallet-example-offchain-worker/try-runtime", + "pallet-example-single-block-migrations/try-runtime", "pallet-example-split/try-runtime", "pallet-example-tasks/try-runtime", ] diff --git a/substrate/frame/examples/basic/Cargo.toml b/substrate/frame/examples/basic/Cargo.toml index 2be5aecb9681d990366f8d79bf6b6020069ffb99..43b37c6beba2c6c2545c4b6bc5191e40009065fa 100644 --- a/substrate/frame/examples/basic/Cargo.toml +++ b/substrate/frame/examples/basic/Cargo.toml @@ -17,8 +17,8 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false } -log = { version = "0.4.17", default-features = false } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +log = { workspace = true } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } frame-benchmarking = { path = "../../benchmarking", default-features = false, optional = true } frame-support = { path = "../../support", default-features = false } frame-system = { path = "../../system", default-features = false } diff --git a/substrate/frame/examples/basic/src/benchmarking.rs b/substrate/frame/examples/basic/src/benchmarking.rs index 4b2ebb41fbda1d6d8a0d12a65b32391510f1a488..65ca3089aba4247cae65932cd4bca9b68d520b75 100644 --- a/substrate/frame/examples/basic/src/benchmarking.rs +++ b/substrate/frame/examples/basic/src/benchmarking.rs @@ -48,7 +48,7 @@ mod benchmarks { set_dummy(RawOrigin::Root, value); // The execution phase is just running `set_dummy` extrinsic call // This is the optional benchmark verification phase, asserting certain states. - assert_eq!(Pallet::::dummy(), Some(value)) + assert_eq!(Dummy::::get(), Some(value)) } // An example method that returns a Result that can be called within a benchmark diff --git a/substrate/frame/examples/basic/src/lib.rs b/substrate/frame/examples/basic/src/lib.rs index 5eff74922cabfa8e10b747ba186b7974e81c49f4..12cadc969fd74288fc2ca99ac014fa98a603d56d 100644 --- a/substrate/frame/examples/basic/src/lib.rs +++ b/substrate/frame/examples/basic/src/lib.rs @@ -54,6 +54,7 @@ #![cfg_attr(not(feature = "std"), no_std)] use codec::{Decode, Encode}; +use core::marker::PhantomData; use frame_support::{ dispatch::{ClassifyDispatch, DispatchClass, DispatchResult, Pays, PaysFee, WeighData}, traits::IsSubType, @@ -68,7 +69,7 @@ use sp_runtime::{ InvalidTransaction, TransactionValidity, TransactionValidityError, ValidTransaction, }, }; -use sp_std::{marker::PhantomData, prelude::*}; +use sp_std::vec::Vec; // Re-export pallet items so that they can be accessed from the crate namespace. pub use pallet::*; @@ -285,9 +286,7 @@ pub mod pallet { let _sender = ensure_signed(origin)?; // Read the value of dummy from storage. - // let dummy = Self::dummy(); - // Will also work using the `::get` on the storage item type itself: - // let dummy = >::get(); + // let dummy = Dummy::::get(); // Calculate the new value. // let new_dummy = dummy.map_or(increase_by, |dummy| dummy + increase_by); @@ -380,20 +379,14 @@ pub mod pallet { // - `Foo::put(1); Foo::get()` returns `1`; // - `Foo::kill(); Foo::get()` returns `0` (u32::default()). #[pallet::storage] - // The getter attribute generate a function on `Pallet` placeholder: - // `fn getter_name() -> Type` for basic value items or - // `fn getter_name(key: KeyType) -> ValueType` for map items. - #[pallet::getter(fn dummy)] pub(super) type Dummy = StorageValue<_, T::Balance>; // A map that has enumerable entries. #[pallet::storage] - #[pallet::getter(fn bar)] pub(super) type Bar = StorageMap<_, Blake2_128Concat, T::AccountId, T::Balance>; // this one uses the query kind: `ValueQuery`, we'll demonstrate the usage of 'mutate' API. #[pallet::storage] - #[pallet::getter(fn foo)] pub(super) type Foo = StorageValue<_, T::Balance, ValueQuery>; #[pallet::storage] @@ -432,10 +425,10 @@ impl Pallet { fn accumulate_foo(origin: T::RuntimeOrigin, increase_by: T::Balance) -> DispatchResult { let _sender = ensure_signed(origin)?; - let prev = >::get(); + let prev = Foo::::get(); // Because Foo has 'default', the type of 'foo' in closure is the raw type instead of an // Option<> type. - let result = >::mutate(|foo| { + let result = Foo::::mutate(|foo| { *foo = foo.saturating_add(increase_by); *foo }); @@ -485,8 +478,8 @@ impl Pallet { #[scale_info(skip_type_params(T))] pub struct WatchDummy(PhantomData); -impl sp_std::fmt::Debug for WatchDummy { - fn fmt(&self, f: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result { +impl core::fmt::Debug for WatchDummy { + fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result { write!(f, "WatchDummy") } } @@ -501,7 +494,7 @@ where type AdditionalSigned = (); type Pre = (); - fn additional_signed(&self) -> sp_std::result::Result<(), TransactionValidityError> { + fn additional_signed(&self) -> core::result::Result<(), TransactionValidityError> { Ok(()) } diff --git a/substrate/frame/examples/basic/src/tests.rs b/substrate/frame/examples/basic/src/tests.rs index 9434ace35ffe35467a9c513d67f0450e5b6ade6e..de37bcf75569575b5eb42336424af2e3a917bf1d 100644 --- a/substrate/frame/examples/basic/src/tests.rs +++ b/substrate/frame/examples/basic/src/tests.rs @@ -45,7 +45,7 @@ frame_support::construct_runtime!( } ); -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { type BaseCallFilter = frame_support::traits::Everything; type BlockWeights = (); @@ -119,25 +119,25 @@ fn it_works_for_optional_value() { // Check that GenesisBuilder works properly. let val1 = 42; let val2 = 27; - assert_eq!(Example::dummy(), Some(val1)); + assert_eq!(Dummy::::get(), Some(val1)); // Check that accumulate works when we have Some value in Dummy already. assert_ok!(Example::accumulate_dummy(RuntimeOrigin::signed(1), val2)); - assert_eq!(Example::dummy(), Some(val1 + val2)); + assert_eq!(Dummy::::get(), Some(val1 + val2)); // Check that accumulate works when we Dummy has None in it. >::on_initialize(2); assert_ok!(Example::accumulate_dummy(RuntimeOrigin::signed(1), val1)); - assert_eq!(Example::dummy(), Some(val1 + val2 + val1)); + assert_eq!(Dummy::::get(), Some(val1 + val2 + val1)); }); } #[test] fn it_works_for_default_value() { new_test_ext().execute_with(|| { - assert_eq!(Example::foo(), 24); + assert_eq!(Foo::::get(), 24); assert_ok!(Example::accumulate_foo(RuntimeOrigin::signed(1), 1)); - assert_eq!(Example::foo(), 25); + assert_eq!(Foo::::get(), 25); }); } @@ -146,7 +146,7 @@ fn set_dummy_works() { new_test_ext().execute_with(|| { let test_val = 133; assert_ok!(Example::set_dummy(RuntimeOrigin::root(), test_val.into())); - assert_eq!(Example::dummy(), Some(test_val)); + assert_eq!(Dummy::::get(), Some(test_val)); }); } diff --git a/substrate/frame/examples/basic/src/weights.rs b/substrate/frame/examples/basic/src/weights.rs index def944054cce8a8b5230781385fd2427e8949603..dbb9170aa67e0565b91b9bf920435f27c188773d 100644 --- a/substrate/frame/examples/basic/src/weights.rs +++ b/substrate/frame/examples/basic/src/weights.rs @@ -42,7 +42,7 @@ #![allow(unused_imports)] use frame_support::{traits::Get, weights::{Weight, constants::RocksDbWeight}}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions needed for pallet_example_basic. pub trait WeightInfo { diff --git a/substrate/frame/examples/default-config/Cargo.toml b/substrate/frame/examples/default-config/Cargo.toml index 83d9ae79510da26280a2f150e70312d35eeb07fb..2aa062ee6c1a0765f9e20d955d1f312c06157966 100644 --- a/substrate/frame/examples/default-config/Cargo.toml +++ b/substrate/frame/examples/default-config/Cargo.toml @@ -17,8 +17,8 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false } -log = { version = "0.4.17", default-features = false } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +log = { workspace = true } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } frame-support = { path = "../../support", default-features = false } frame-system = { path = "../../system", default-features = false } diff --git a/substrate/frame/examples/default-config/src/lib.rs b/substrate/frame/examples/default-config/src/lib.rs index cd1653e6c764358165c8306d4810c1d4c9bea3b4..5b66c78e06283a2d9155dd76a653a7ca4649bbbf 100644 --- a/substrate/frame/examples/default-config/src/lib.rs +++ b/substrate/frame/examples/default-config/src/lib.rs @@ -87,12 +87,11 @@ pub mod pallet { // This will help use not need to disambiguate anything when using `derive_impl`. use super::*; use frame_support::derive_impl; - use frame_system::config_preludes::TestDefaultConfig as SystemTestDefaultConfig; /// A type providing default configurations for this pallet in testing environment. pub struct TestDefaultConfig; - #[derive_impl(SystemTestDefaultConfig as frame_system::DefaultConfig, no_aggregated_types)] + #[derive_impl(frame_system::config_preludes::TestDefaultConfig, no_aggregated_types)] impl frame_system::DefaultConfig for TestDefaultConfig {} #[frame_support::register_default_impl(TestDefaultConfig)] @@ -108,13 +107,13 @@ pub mod pallet { } /// A type providing default configurations for this pallet in another environment. Examples - /// could be a parachain, or a solo-chain. + /// could be a parachain, or a solochain. /// /// Appropriate derive for `frame_system::DefaultConfig` needs to be provided. In this /// example, we simple derive `frame_system::config_preludes::TestDefaultConfig` again. pub struct OtherDefaultConfig; - #[derive_impl(SystemTestDefaultConfig as frame_system::DefaultConfig, no_aggregated_types)] + #[derive_impl(frame_system::config_preludes::TestDefaultConfig, no_aggregated_types)] impl frame_system::DefaultConfig for OtherDefaultConfig {} #[frame_support::register_default_impl(OtherDefaultConfig)] @@ -149,7 +148,7 @@ pub mod tests { } ); - #[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] + #[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Runtime { // these items are defined by frame-system as `no_default`, so we must specify them here. type Block = Block; diff --git a/substrate/frame/examples/dev-mode/Cargo.toml b/substrate/frame/examples/dev-mode/Cargo.toml index f150f446446cf99da82f4a5535a8e8f031d54b73..71b97796ecddf89275c3594362d9ece122b7387f 100644 --- a/substrate/frame/examples/dev-mode/Cargo.toml +++ b/substrate/frame/examples/dev-mode/Cargo.toml @@ -17,8 +17,8 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false } -log = { version = "0.4.17", default-features = false } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +log = { workspace = true } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } frame-support = { path = "../../support", default-features = false } frame-system = { path = "../../system", default-features = false } pallet-balances = { path = "../../balances", default-features = false } diff --git a/substrate/frame/examples/dev-mode/src/tests.rs b/substrate/frame/examples/dev-mode/src/tests.rs index c13152533fdbb9bbbcf624ae9ed2c8fa9617242d..1c79b5f5fa6050758f5158bdcbede75e914eaf97 100644 --- a/substrate/frame/examples/dev-mode/src/tests.rs +++ b/substrate/frame/examples/dev-mode/src/tests.rs @@ -39,7 +39,7 @@ frame_support::construct_runtime!( } ); -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { type BaseCallFilter = frame_support::traits::Everything; type BlockWeights = (); diff --git a/substrate/frame/examples/frame-crate/Cargo.toml b/substrate/frame/examples/frame-crate/Cargo.toml index 93a46ba7b249cc806d2366e2bd1ee947b162157d..3a0e4f720f95ddd16bf012274cfee24add6f3883 100644 --- a/substrate/frame/examples/frame-crate/Cargo.toml +++ b/substrate/frame/examples/frame-crate/Cargo.toml @@ -17,9 +17,9 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false } -scale-info = { version = "2.5.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } -frame = { path = "../..", default-features = false, features = ["experimental", "runtime"] } +frame = { package = "polkadot-sdk-frame", path = "../..", default-features = false, features = ["experimental", "runtime"] } [features] diff --git a/substrate/frame/examples/frame-crate/src/lib.rs b/substrate/frame/examples/frame-crate/src/lib.rs index 7e286df1e32ced104d4f5e41a6cd63645770c117..781cba5658d778f991c990634ceff52838be559f 100644 --- a/substrate/frame/examples/frame-crate/src/lib.rs +++ b/substrate/frame/examples/frame-crate/src/lib.rs @@ -55,7 +55,7 @@ mod tests { } ); - #[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] + #[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Runtime { type Block = MockBlock; } diff --git a/substrate/frame/examples/kitchensink/Cargo.toml b/substrate/frame/examples/kitchensink/Cargo.toml index 4255ebb66b650efb77264b250396c0a05ba0763a..d8311897c6e1158f8a94520bfd1c6f2712aecbbc 100644 --- a/substrate/frame/examples/kitchensink/Cargo.toml +++ b/substrate/frame/examples/kitchensink/Cargo.toml @@ -17,10 +17,10 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false } -log = { version = "0.4.17", default-features = false } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +log = { workspace = true } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } -frame-support = { path = "../../support", default-features = false } +frame-support = { path = "../../support", default-features = false, features = ["experimental"] } frame-system = { path = "../../system", default-features = false } sp-io = { path = "../../../primitives/io", default-features = false } diff --git a/substrate/frame/examples/kitchensink/src/benchmarking.rs b/substrate/frame/examples/kitchensink/src/benchmarking.rs index 24da581fc967b8e8c8586bf3b41a4452a89a4dcd..5f1d378e06fe67ee3978124ce7b557ad39b89e0a 100644 --- a/substrate/frame/examples/kitchensink/src/benchmarking.rs +++ b/substrate/frame/examples/kitchensink/src/benchmarking.rs @@ -51,7 +51,7 @@ mod benchmarks { set_foo(RawOrigin::Root, value, 10u128); // The execution phase is just running `set_foo` extrinsic call // This is the optional benchmark verification phase, asserting certain states. - assert_eq!(Pallet::::foo(), Some(value)) + assert_eq!(Foo::::get(), Some(value)) } // This line generates test cases for benchmarking, and could be run by: diff --git a/substrate/frame/examples/kitchensink/src/lib.rs b/substrate/frame/examples/kitchensink/src/lib.rs index 18429bc967d7c1e1f7b181e708ca3a86ef6f251c..b7425b0c0846afc3e9488a490144a89e7b647301 100644 --- a/substrate/frame/examples/kitchensink/src/lib.rs +++ b/substrate/frame/examples/kitchensink/src/lib.rs @@ -125,7 +125,6 @@ pub mod pallet { #[pallet::storage] #[pallet::unbounded] // optional #[pallet::storage_prefix = "OtherFoo"] // optional - #[pallet::getter(fn foo)] // optional pub type Foo = StorageValue; #[pallet::type_value] diff --git a/substrate/frame/examples/kitchensink/src/tests.rs b/substrate/frame/examples/kitchensink/src/tests.rs index 7f62671893087119a4aff817689f54e5066d7384..1205fefc422983d2b6f621b601a96b786353f83a 100644 --- a/substrate/frame/examples/kitchensink/src/tests.rs +++ b/substrate/frame/examples/kitchensink/src/tests.rs @@ -37,7 +37,7 @@ frame_support::construct_runtime!( /// Using a default config for [`frame_system`] in tests. See `default-config` example for more /// details. -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { type Block = Block; type AccountData = pallet_balances::AccountData; diff --git a/substrate/frame/examples/multi-block-migrations/Cargo.toml b/substrate/frame/examples/multi-block-migrations/Cargo.toml new file mode 100644 index 0000000000000000000000000000000000000000..28eca8577154e85c7fbb0d22fca8aefb3c7d9237 --- /dev/null +++ b/substrate/frame/examples/multi-block-migrations/Cargo.toml @@ -0,0 +1,47 @@ +[package] +name = "pallet-example-mbm" +version = "0.1.0" +authors.workspace = true +edition.workspace = true +license = "Apache-2.0" +homepage = "https://substrate.io" +repository.workspace = true +description = "Example FRAME pallet for multi-block migrations" +publish = false + +[package.metadata.docs.rs] +targets = ["x86_64-unknown-linux-gnu"] + +[dependencies] +codec = { package = "parity-scale-codec", version = "3.6.5", default-features = false } +pallet-migrations = { path = "../../migrations", default-features = false } +frame-support = { path = "../../support", default-features = false } +frame-system = { path = "../../system", default-features = false } +frame-benchmarking = { path = "../../benchmarking", default-features = false, optional = true } +log = { version = "0.4.20", default-features = false } +scale-info = { version = "2.10.0", default-features = false } +sp-io = { path = "../../../primitives/io", default-features = false } + +[features] +default = ["std"] +std = [ + "codec/std", + "frame-benchmarking?/std", + "frame-support/std", + "frame-system/std", + "log/std", + "pallet-migrations/std", + "scale-info/std", + "sp-io/std", +] +runtime-benchmarks = [ + "frame-benchmarking/runtime-benchmarks", + "frame-support/runtime-benchmarks", + "frame-system/runtime-benchmarks", + "pallet-migrations/runtime-benchmarks", +] +try-runtime = [ + "frame-support/try-runtime", + "frame-system/try-runtime", + "pallet-migrations/try-runtime", +] diff --git a/substrate/frame/examples/multi-block-migrations/src/lib.rs b/substrate/frame/examples/multi-block-migrations/src/lib.rs new file mode 100644 index 0000000000000000000000000000000000000000..657c42b1662c8cd19f4b2f81b1e75d10ff9061d1 --- /dev/null +++ b/substrate/frame/examples/multi-block-migrations/src/lib.rs @@ -0,0 +1,87 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#![cfg_attr(not(feature = "std"), no_std)] + +//! # Multi-Block Migrations Example Pallet +//! +//! This pallet serves as a minimal example of a pallet that uses the [Multi-Block Migrations +//! Framework](frame_support::migrations). You can observe how to configure it in a runtime in the +//! `kitchensink-runtime` crate. +//! +//! ## Introduction and Purpose +//! +//! The primary purpose of this pallet is to demonstrate the concept of Multi-Block Migrations in +//! Substrate. It showcases the migration of values from in the +//! [`MyMap`](`pallet::MyMap`) storage map a `u32` to a `u64` data type using the +//! [`SteppedMigration`](`frame_support::migrations::SteppedMigration`) implementation from the +//! [`migrations::v1`] module. +//! +//! The [`MyMap`](`pallet::MyMap`) storage item is defined in this `pallet`, and is +//! aliased to [`v0::MyMap`](`migrations::v1::v0::MyMap`) in the [`migrations::v1`] +//! module. +//! +//! ## How to Read the Documentation +//! +//! To access and navigate this documentation in your browser, use the following command: +//! +//! - `cargo doc --package pallet-example-mbm --open` +//! +//! This documentation is organized to help you understand the pallet's components, features, and +//! migration process. +//! +//! ## Example Usage +//! +//! To use this pallet and understand multi-block migrations, you can refer to the +//! [`migrations::v1`] module, which contains a step-by-step migration example. +//! +//! ## Pallet Structure +//! +//! The pallet is structured as follows: +//! +//! - [`migrations`]: Contains migration-related modules and migration logic. +//! - [`v1`](`migrations::v1`): Demonstrates the migration process for changing the data type in +//! the storage map. +//! - [`pallet`]: Defines the pallet configuration and storage items. +//! +//! ## Migration Safety +//! +//! When working with migrations, it's crucial to ensure the safety of your migrations. The +//! preferred tool to test migrations is +//! [`try-runtime-cli`](https://github.com/paritytech/try-runtime-cli). Support will be added to +//! dry-run MBMs once they are stable +//! (tracked: ). + +pub mod migrations; +mod mock; + +pub use pallet::*; + +#[frame_support::pallet] +pub mod pallet { + use frame_support::{pallet_prelude::StorageMap, Blake2_128Concat}; + + #[pallet::pallet] + pub struct Pallet(_); + + #[pallet::config] + pub trait Config: frame_system::Config {} + + /// Define a storage item to illustrate multi-block migrations. + #[pallet::storage] + pub type MyMap = StorageMap<_, Blake2_128Concat, u32, u64>; +} diff --git a/substrate/frame/support/test/tests/pallet_ui/duplicate_store_attr.rs b/substrate/frame/examples/multi-block-migrations/src/migrations/mod.rs similarity index 53% rename from substrate/frame/support/test/tests/pallet_ui/duplicate_store_attr.rs rename to substrate/frame/examples/multi-block-migrations/src/migrations/mod.rs index 334fd8a46af2e14ef175acfbbdbc6a895b890595..fa6e1f202cb2f24f92960eacfdde1ab9d031738e 100644 --- a/substrate/frame/support/test/tests/pallet_ui/duplicate_store_attr.rs +++ b/substrate/frame/examples/multi-block-migrations/src/migrations/mod.rs @@ -15,28 +15,15 @@ // See the License for the specific language governing permissions and // limitations under the License. -#[frame_support::pallet] -mod pallet { - use frame_support::pallet_prelude::Hooks; - use frame_system::pallet_prelude::BlockNumberFor; - use frame_support::pallet_prelude::StorageValue; - - #[pallet::config] - pub trait Config: frame_system::Config {} - - #[pallet::pallet] - #[pallet::generate_store(trait Store)] - #[pallet::generate_store(trait Store)] - pub struct Pallet(core::marker::PhantomData); - - #[pallet::hooks] - impl Hooks> for Pallet {} - - #[pallet::call] - impl Pallet {} - - #[pallet::storage] - type Foo = StorageValue<_, u8>; -} - -fn main() {} +/// # Multi-Block Migrations Module +/// +/// This module showcases a simple use of the multi-block migrations framework. +pub mod v1; + +/// A unique identifier across all pallets. +/// +/// This constant represents a unique identifier for the migrations of this pallet. +/// It helps differentiate migrations for this pallet from those of others. Note that we don't +/// directly pull the crate name from the environment, since that would change if the crate were +/// ever to be renamed and could cause historic migrations to run again. +pub const PALLET_MIGRATIONS_ID: &[u8; 18] = b"pallet-example-mbm"; diff --git a/substrate/frame/examples/multi-block-migrations/src/migrations/v1/benchmarks.rs b/substrate/frame/examples/multi-block-migrations/src/migrations/v1/benchmarks.rs new file mode 100644 index 0000000000000000000000000000000000000000..d14da2b705b6a0ee0a273015e3808f34d8eefbc5 --- /dev/null +++ b/substrate/frame/examples/multi-block-migrations/src/migrations/v1/benchmarks.rs @@ -0,0 +1,54 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Benchmark the multi-block-migration. + +#![cfg(feature = "runtime-benchmarks")] + +use crate::{ + migrations::{ + v1, + v1::{weights, weights::WeightInfo}, + }, + Config, Pallet, +}; +use frame_benchmarking::v2::*; +use frame_support::{migrations::SteppedMigration, weights::WeightMeter}; + +#[benchmarks] +mod benches { + use super::*; + + /// Benchmark a single step of the `v1::LazyMigrationV1` migration. + #[benchmark] + fn step() { + v1::v0::MyMap::::insert(0, 0); + let mut meter = WeightMeter::new(); + + #[block] + { + v1::LazyMigrationV1::>::step(None, &mut meter).unwrap(); + } + + // Check that the new storage is decodable: + assert_eq!(crate::MyMap::::get(0), Some(0)); + // uses twice the weight once for migration and then for checking if there is another key. + assert_eq!(meter.consumed(), weights::SubstrateWeight::::step() * 2); + } + + impl_benchmark_test_suite!(Pallet, crate::mock::new_test_ext(), crate::mock::Runtime); +} diff --git a/substrate/frame/examples/multi-block-migrations/src/migrations/v1/mod.rs b/substrate/frame/examples/multi-block-migrations/src/migrations/v1/mod.rs new file mode 100644 index 0000000000000000000000000000000000000000..2016b03de45e53e94a77e29a87f4cb70f8e17e9b --- /dev/null +++ b/substrate/frame/examples/multi-block-migrations/src/migrations/v1/mod.rs @@ -0,0 +1,118 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! # Multi-Block Migration v1 +//! +//! This module showcases a simple migration that iterates over the values in the +//! [`v0::MyMap`](`crate::migrations::v1::v0::MyMap`) storage map, transforms them, +//! and inserts them into the [`MyMap`](`crate::pallet::MyMap`) storage map. + +use super::PALLET_MIGRATIONS_ID; +use crate::pallet::{Config, MyMap}; +use frame_support::{ + migrations::{MigrationId, SteppedMigration, SteppedMigrationError}, + pallet_prelude::PhantomData, + weights::WeightMeter, +}; + +mod benchmarks; +mod tests; +pub mod weights; + +/// Module containing the OLD (v0) storage items. +/// +/// Before running this migration, the storage alias defined here represents the +/// `on_chain` storage. +// This module is public only for the purposes of linking it in the documentation. It is not +// intended to be used by any other code. +pub mod v0 { + use super::Config; + use crate::pallet::Pallet; + use frame_support::{storage_alias, Blake2_128Concat}; + + #[storage_alias] + /// The storage item that is being migrated from. + pub type MyMap = StorageMap, Blake2_128Concat, u32, u32>; +} + +/// Migrates the items of the [`crate::MyMap`] map from `u32` to `u64`. +/// +/// The `step` function will be called once per block. It is very important that this function +/// *never* panics and never uses more weight than it got in its meter. The migrations should also +/// try to make maximal progress per step, so that the total time it takes to migrate stays low. +pub struct LazyMigrationV1(PhantomData<(T, W)>); +impl SteppedMigration for LazyMigrationV1 { + type Cursor = u32; + // Without the explicit length here the construction of the ID would not be infallible. + type Identifier = MigrationId<18>; + + /// The identifier of this migration. Which should be globally unique. + fn id() -> Self::Identifier { + MigrationId { pallet_id: *PALLET_MIGRATIONS_ID, version_from: 0, version_to: 1 } + } + + /// The actual logic of the migration. + /// + /// This function is called repeatedly until it returns `Ok(None)`, indicating that the + /// migration is complete. Ideally, the migration should be designed in such a way that each + /// step consumes as much weight as possible. However, this is simplified to perform one stored + /// value mutation per block. + fn step( + mut cursor: Option, + meter: &mut WeightMeter, + ) -> Result, SteppedMigrationError> { + let required = W::step(); + // If there is not enough weight for a single step, return an error. This case can be + // problematic if it is the first migration that ran in this block. But there is nothing + // that we can do about it here. + if meter.remaining().any_lt(required) { + return Err(SteppedMigrationError::InsufficientWeight { required }); + } + + // We loop here to do as much progress as possible per step. + loop { + if meter.try_consume(required).is_err() { + break; + } + + let mut iter = if let Some(last_key) = cursor { + // If a cursor is provided, start iterating from the stored value + // corresponding to the last key processed in the previous step. + // Note that this only works if the old and the new map use the same way to hash + // storage keys. + v0::MyMap::::iter_from(v0::MyMap::::hashed_key_for(last_key)) + } else { + // If no cursor is provided, start iterating from the beginning. + v0::MyMap::::iter() + }; + + // If there's a next item in the iterator, perform the migration. + if let Some((last_key, value)) = iter.next() { + // Migrate the inner value: u32 -> u64. + let value = value as u64; + // We can just insert here since the old and the new map share the same key-space. + // Otherwise it would have to invert the concat hash function and re-hash it. + MyMap::::insert(last_key, value); + cursor = Some(last_key) // Return the processed key as the new cursor. + } else { + cursor = None; // Signal that the migration is complete (no more items to process). + break + } + } + Ok(cursor) + } +} diff --git a/substrate/frame/examples/multi-block-migrations/src/migrations/v1/tests.rs b/substrate/frame/examples/multi-block-migrations/src/migrations/v1/tests.rs new file mode 100644 index 0000000000000000000000000000000000000000..838ba29a621247593a13f472082238bde1075e40 --- /dev/null +++ b/substrate/frame/examples/multi-block-migrations/src/migrations/v1/tests.rs @@ -0,0 +1,70 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#![cfg(all(test, not(feature = "runtime-benchmarks")))] + +use crate::{ + migrations::{ + v1, + v1::{weights, weights::WeightInfo as _}, + }, + mock::{ + new_test_ext, run_to_block, AllPalletsWithSystem, MigratorServiceWeight, Runtime as T, + System, + }, +}; +use frame_support::traits::OnRuntimeUpgrade; +use pallet_migrations::WeightInfo as _; + +#[test] +fn lazy_migration_works() { + new_test_ext().execute_with(|| { + frame_support::__private::sp_tracing::try_init_simple(); + // Insert some values into the old storage map. + for i in 0..1024 { + v1::v0::MyMap::::insert(i, i); + } + + // Give it enough weight do do exactly 16 iterations: + let limit = ::WeightInfo::progress_mbms_none() + + pallet_migrations::Pallet::::exec_migration_max_weight() + + weights::SubstrateWeight::::step() * 16; + MigratorServiceWeight::set(&limit); + + System::set_block_number(1); + AllPalletsWithSystem::on_runtime_upgrade(); // onboard MBMs + + let mut last_decodable = 0; + for block in 2..=65 { + run_to_block(block); + let mut decodable = 0; + for i in 0..1024 { + if crate::MyMap::::get(i).is_some() { + decodable += 1; + } + } + + assert_eq!(decodable, last_decodable + 16); + last_decodable = decodable; + } + + // Check that everything is decodable now: + for i in 0..1024 { + assert_eq!(crate::MyMap::::get(i), Some(i as u64)); + } + }); +} diff --git a/substrate/frame/examples/multi-block-migrations/src/migrations/v1/weights.rs b/substrate/frame/examples/multi-block-migrations/src/migrations/v1/weights.rs new file mode 100644 index 0000000000000000000000000000000000000000..6a5cf2ac59365460c3f556457ea618e7f7696f7b --- /dev/null +++ b/substrate/frame/examples/multi-block-migrations/src/migrations/v1/weights.rs @@ -0,0 +1,84 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Autogenerated weights for `pallet_example_mbm` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-03-26, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `Olivers-MBP`, CPU: `` +//! WASM-EXECUTION: `Compiled`, CHAIN: `None`, DB CACHE: `1024` + +// Executed Command: +// polkadot-omni-bencher +// v1 +// benchmark +// pallet +// --runtime +// target/release/wbuild/kitchensink-runtime/kitchensink_runtime.compact.compressed.wasm +// --pallet +// pallet_example_mbm +// --extrinsic +// +// --template +// substrate/.maintain/frame-weight-template.hbs +// --output +// substrate/frame/examples/multi-block-migrations/src/migrations/weights.rs + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] +#![allow(missing_docs)] + +use frame_support::{traits::Get, weights::{Weight, constants::RocksDbWeight}}; +use core::marker::PhantomData; + +/// Weight functions needed for `pallet_example_mbm`. +pub trait WeightInfo { + fn step() -> Weight; +} + +/// Weights for `pallet_example_mbm` using the Substrate node and recommended hardware. +pub struct SubstrateWeight(PhantomData); +impl WeightInfo for SubstrateWeight { + /// Storage: `PalletExampleMbms::MyMap` (r:2 w:1) + /// Proof: `PalletExampleMbms::MyMap` (`max_values`: None, `max_size`: Some(28), added: 2503, mode: `MaxEncodedLen`) + fn step() -> Weight { + // Proof Size summary in bytes: + // Measured: `28` + // Estimated: `5996` + // Minimum execution time: 6_000_000 picoseconds. + Weight::from_parts(8_000_000, 5996) + .saturating_add(T::DbWeight::get().reads(2_u64)) + .saturating_add(T::DbWeight::get().writes(1_u64)) + } +} + +// For backwards compatibility and tests. +impl WeightInfo for () { + /// Storage: `PalletExampleMbms::MyMap` (r:2 w:1) + /// Proof: `PalletExampleMbms::MyMap` (`max_values`: None, `max_size`: Some(28), added: 2503, mode: `MaxEncodedLen`) + fn step() -> Weight { + // Proof Size summary in bytes: + // Measured: `28` + // Estimated: `5996` + // Minimum execution time: 6_000_000 picoseconds. + Weight::from_parts(8_000_000, 5996) + .saturating_add(RocksDbWeight::get().reads(2_u64)) + .saturating_add(RocksDbWeight::get().writes(1_u64)) + } +} diff --git a/substrate/frame/examples/multi-block-migrations/src/mock.rs b/substrate/frame/examples/multi-block-migrations/src/mock.rs new file mode 100644 index 0000000000000000000000000000000000000000..9da1d2051fa1f42666755e701b77c671791c6392 --- /dev/null +++ b/substrate/frame/examples/multi-block-migrations/src/mock.rs @@ -0,0 +1,93 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#![cfg(test)] + +//! # Mock runtime for testing Multi-Block-Migrations +//! +//! This runtime is for testing only and should *never* be used in production. Please see the +//! comments on the specific config items. The core part of this runtime is the +//! [`pallet_migrations::Config`] implementation, where you define the migrations you want to run +//! using the [`Migrations`] type. + +use frame_support::{ + construct_runtime, derive_impl, + migrations::MultiStepMigrator, + pallet_prelude::Weight, + traits::{OnFinalize, OnInitialize}, +}; + +type Block = frame_system::mocking::MockBlock; + +impl crate::Config for Runtime {} + +frame_support::parameter_types! { + pub storage MigratorServiceWeight: Weight = Weight::from_parts(100, 100); // do not use in prod +} + +#[derive_impl(pallet_migrations::config_preludes::TestDefaultConfig)] +impl pallet_migrations::Config for Runtime { + // Here we inject the actual MBMs. Currently there is just one, but it accepts a tuple. + // + // # Example + // ```ignore + // type Migrations = (v1::Migration, v2::Migration, v3::Migration); + // ``` + #[cfg(not(feature = "runtime-benchmarks"))] + type Migrations = ( + crate::migrations::v1::LazyMigrationV1< + Runtime, + crate::migrations::v1::weights::SubstrateWeight, + >, + ); + #[cfg(feature = "runtime-benchmarks")] + type Migrations = pallet_migrations::mock_helpers::MockedMigrations; + type MaxServiceWeight = MigratorServiceWeight; +} + +#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +impl frame_system::Config for Runtime { + type Block = Block; + type MultiBlockMigrator = Migrator; +} + +// Construct the runtime using the `construct_runtime` macro, specifying the pallet_migrations. +construct_runtime! { + pub struct Runtime + { + System: frame_system, + Pallet: crate, + Migrator: pallet_migrations, + } +} + +pub fn new_test_ext() -> sp_io::TestExternalities { + sp_io::TestExternalities::new(Default::default()) +} + +#[allow(dead_code)] +pub fn run_to_block(n: u64) { + assert!(System::block_number() < n); + while System::block_number() < n { + let b = System::block_number(); + AllPalletsWithSystem::on_finalize(b); + // Done by Executive: + ::MultiBlockMigrator::step(); + System::set_block_number(b + 1); + AllPalletsWithSystem::on_initialize(b + 1); + } +} diff --git a/substrate/frame/examples/offchain-worker/Cargo.toml b/substrate/frame/examples/offchain-worker/Cargo.toml index cc337707a2962120eb035d355c328705381a152d..468af0345cae71d97afea4c9ce02f2ab2491e5db 100644 --- a/substrate/frame/examples/offchain-worker/Cargo.toml +++ b/substrate/frame/examples/offchain-worker/Cargo.toml @@ -18,8 +18,8 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false } lite-json = { version = "0.2.0", default-features = false } -log = { version = "0.4.17", default-features = false } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +log = { workspace = true } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } frame-support = { path = "../../support", default-features = false } frame-system = { path = "../../system", default-features = false } sp-core = { path = "../../../primitives/core", default-features = false } diff --git a/substrate/frame/examples/offchain-worker/src/lib.rs b/substrate/frame/examples/offchain-worker/src/lib.rs index 6c1fa6ea8ec42dbee21875a0610b3724aadff802..0a90e896188ebe111baafd46b265d7e8d8790d9e 100644 --- a/substrate/frame/examples/offchain-worker/src/lib.rs +++ b/substrate/frame/examples/offchain-worker/src/lib.rs @@ -332,7 +332,6 @@ pub mod pallet { /// /// This is used to calculate average price, should have bounded size. #[pallet::storage] - #[pallet::getter(fn prices)] pub(super) type Prices = StorageValue<_, BoundedVec, ValueQuery>; /// Defines the block when next unsigned transaction will be accepted. @@ -341,7 +340,6 @@ pub mod pallet { /// we only allow one transaction every `T::UnsignedInterval` blocks. /// This storage entry defines when new transaction is going to be accepted. #[pallet::storage] - #[pallet::getter(fn next_unsigned_at)] pub(super) type NextUnsignedAt = StorageValue<_, BlockNumberFor, ValueQuery>; } @@ -479,7 +477,7 @@ impl Pallet { ) -> Result<(), &'static str> { // Make sure we don't fetch the price if unsigned transaction is going to be rejected // anyway. - let next_unsigned_at = >::get(); + let next_unsigned_at = NextUnsignedAt::::get(); if next_unsigned_at > block_number { return Err("Too early to send unsigned transaction") } @@ -497,7 +495,7 @@ impl Pallet { // Here we showcase two ways to send an unsigned transaction / unsigned payload (raw) // // By default unsigned transactions are disallowed, so we need to whitelist this case - // by writing `UnsignedValidator`. Note that it's EXTREMELY important to carefuly + // by writing `UnsignedValidator`. Note that it's EXTREMELY important to carefully // implement unsigned validation logic, as any mistakes can lead to opening DoS or spam // attack vectors. See validation logic docs for more details. // @@ -513,7 +511,7 @@ impl Pallet { ) -> Result<(), &'static str> { // Make sure we don't fetch the price if unsigned transaction is going to be rejected // anyway. - let next_unsigned_at = >::get(); + let next_unsigned_at = NextUnsignedAt::::get(); if next_unsigned_at > block_number { return Err("Too early to send unsigned transaction") } @@ -543,7 +541,7 @@ impl Pallet { ) -> Result<(), &'static str> { // Make sure we don't fetch the price if unsigned transaction is going to be rejected // anyway. - let next_unsigned_at = >::get(); + let next_unsigned_at = NextUnsignedAt::::get(); if next_unsigned_at > block_number { return Err("Too early to send unsigned transaction") } @@ -664,7 +662,7 @@ impl Pallet { /// Calculate current average price. fn average_price() -> Option { - let prices = >::get(); + let prices = Prices::::get(); if prices.is_empty() { None } else { @@ -677,7 +675,7 @@ impl Pallet { new_price: &u32, ) -> TransactionValidity { // Now let's check if the transaction has any chance to succeed. - let next_unsigned_at = >::get(); + let next_unsigned_at = NextUnsignedAt::::get(); if &next_unsigned_at > block_number { return InvalidTransaction::Stale.into() } diff --git a/substrate/frame/examples/offchain-worker/src/tests.rs b/substrate/frame/examples/offchain-worker/src/tests.rs index ea37a2da493d69ae6550c8d999fe2eb9dcfefad1..3525b3b67edf1569f00600e1e210e426c5f858dc 100644 --- a/substrate/frame/examples/offchain-worker/src/tests.rs +++ b/substrate/frame/examples/offchain-worker/src/tests.rs @@ -46,7 +46,7 @@ frame_support::construct_runtime!( } ); -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { type BaseCallFilter = frame_support::traits::Everything; type BlockWeights = (); diff --git a/substrate/frame/examples/single-block-migrations/Cargo.toml b/substrate/frame/examples/single-block-migrations/Cargo.toml new file mode 100644 index 0000000000000000000000000000000000000000..b1d560a85f3ff59de2ab6560223f7b7657f2b27a --- /dev/null +++ b/substrate/frame/examples/single-block-migrations/Cargo.toml @@ -0,0 +1,61 @@ +[package] +name = "pallet-example-single-block-migrations" +version = "0.0.1" +authors.workspace = true +edition.workspace = true +license = "MIT-0" +homepage = "https://substrate.io" +repository.workspace = true +description = "FRAME example pallet demonstrating best-practices for writing storage migrations." +publish = false + +[package.metadata.docs.rs] +targets = ["x86_64-unknown-linux-gnu"] + +[dependencies] +docify = "0.2.8" +log = { version = "0.4.21", default-features = false } +codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +frame-support = { path = "../../support", default-features = false } +frame-executive = { path = "../../executive", default-features = false } +frame-system = { path = "../../system", default-features = false } +frame-try-runtime = { path = "../../try-runtime", default-features = false, optional = true } +pallet-balances = { path = "../../balances", default-features = false } +sp-std = { path = "../../../primitives/std", default-features = false } +sp-runtime = { path = "../../../primitives/runtime", default-features = false } +sp-core = { path = "../../../primitives/core", default-features = false } +sp-io = { path = "../../../primitives/io", default-features = false } +sp-version = { path = "../../../primitives/version", default-features = false } + +[features] +default = ["std"] +std = [ + "codec/std", + "frame-executive/std", + "frame-support/std", + "frame-system/std", + "frame-try-runtime/std", + "log/std", + "pallet-balances/std", + "scale-info/std", + "sp-core/std", + "sp-io/std", + "sp-runtime/std", + "sp-std/std", + "sp-version/std", +] +runtime-benchmarks = [ + "frame-support/runtime-benchmarks", + "frame-system/runtime-benchmarks", + "pallet-balances/runtime-benchmarks", + "sp-runtime/runtime-benchmarks", +] +try-runtime = [ + "frame-executive/try-runtime", + "frame-support/try-runtime", + "frame-system/try-runtime", + "frame-try-runtime/try-runtime", + "pallet-balances/try-runtime", + "sp-runtime/try-runtime", +] diff --git a/substrate/frame/examples/single-block-migrations/src/lib.rs b/substrate/frame/examples/single-block-migrations/src/lib.rs new file mode 100644 index 0000000000000000000000000000000000000000..411537aa8c65f0c1462336cd6705a2a900bc230a --- /dev/null +++ b/substrate/frame/examples/single-block-migrations/src/lib.rs @@ -0,0 +1,213 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! # Single Block Migration Example Pallet +//! +//! An example pallet demonstrating best-practices for writing single-block migrations in the +//! context of upgrading pallet storage. +//! +//! ## Forewarning +//! +//! Single block migrations **MUST** execute in a single block, therefore when executed on a +//! parachain are only appropriate when guaranteed to not exceed block weight limits. If a +//! parachain submits a block that exceeds the block weight limit it will **brick the chain**! +//! +//! If weight is a concern or you are not sure which type of migration to use, you should probably +//! use a multi-block migration. +//! +//! TODO: Link above to multi-block migration example. +//! +//! ## Pallet Overview +//! +//! This example pallet contains a single storage item [`Value`](pallet::Value), which may be set by +//! any signed origin by calling the [`set_value`](crate::Call::set_value) extrinsic. +//! +//! For the purposes of this exercise, we imagine that in [`StorageVersion`] V0 of this pallet +//! [`Value`](pallet::Value) is a `u32`, and this what is currently stored on-chain. +//! +//! ```ignore +//! // (Old) Storage Version V0 representation of `Value` +//! #[pallet::storage] +//! pub type Value = StorageValue<_, u32>; +//! ``` +//! +//! In [`StorageVersion`] V1 of the pallet a new struct [`CurrentAndPreviousValue`] is introduced: +#![doc = docify::embed!("src/lib.rs", CurrentAndPreviousValue)] +//! and [`Value`](pallet::Value) is updated to store this new struct instead of a `u32`: +#![doc = docify::embed!("src/lib.rs", Value)] +//! +//! In StorageVersion V1 of the pallet when [`set_value`](crate::Call::set_value) is called, the +//! new value is stored in the `current` field of [`CurrentAndPreviousValue`], and the previous +//! value (if it exists) is stored in the `previous` field. +#![doc = docify::embed!("src/lib.rs", pallet_calls)] +//! +//! ## Why a migration is necessary +//! +//! Without a migration, there will be a discrepancy between the on-chain storage for [`Value`] (in +//! V0 it is a `u32`) and the current storage for [`Value`] (in V1 it was changed to a +//! [`CurrentAndPreviousValue`] struct). +//! +//! The on-chain storage for [`Value`] would be a `u32` but the runtime would try to read it as a +//! [`CurrentAndPreviousValue`]. This would result in unacceptable undefined behavior. +//! +//! ## Adding a migration module +//! +//! Writing a pallets migrations in a separate module is strongly recommended. +//! +//! Here's how the migration module is defined for this pallet: +//! +//! ```text +//! substrate/frame/examples/single-block-migrations/src/ +//! ├── lib.rs <-- pallet definition +//! ├── Cargo.toml <-- pallet manifest +//! └── migrations/ +//! ├── mod.rs <-- migrations module definition +//! └── v1.rs <-- migration logic for the V0 to V1 transition +//! ``` +//! +//! This structure allows keeping migration logic separate from the pallet logic and +//! easily adding new migrations in the future. +//! +//! ## Writing the Migration +//! +//! All code related to the migration can be found under +//! [`v1.rs`](migrations::v1). +//! +//! See the migration source code for detailed comments. +//! +//! Here's a brief overview of modules and types defined in `v1.rs`: +//! +//! ### `mod v0` +//! +//! Here we define a [`storage_alias`](frame_support::storage_alias) for the old v0 [`Value`] +//! format. +//! +//! This allows reading the old v0 value from storage during the migration. +//! +//! ### `InnerMigrateV0ToV1` +//! +//! Here we define our raw migration logic, +//! `InnerMigrateV0ToV1` which implements the [`UncheckedOnRuntimeUpgrade`] trait. +//! +//! #### Why [`UncheckedOnRuntimeUpgrade`]? +//! +//! Otherwise, we would have two implementations of [`OnRuntimeUpgrade`] which could be confusing, +//! and may lead to accidentally using the wrong one. +//! +//! #### Standalone Struct or Pallet Hook? +//! +//! Note that the storage migration logic is attached to a standalone struct implementing +//! [`UncheckedOnRuntimeUpgrade`], rather than implementing the +//! [`Hooks::on_runtime_upgrade`](frame_support::traits::Hooks::on_runtime_upgrade) hook directly on +//! the pallet. The pallet hook is better suited for special types of logic that need to execute on +//! every runtime upgrade, but not so much for one-off storage migrations. +//! +//! ### `MigrateV0ToV1` +//! +//! Here, `InnerMigrateV0ToV1` is wrapped in a +//! [`VersionedMigration`] to define +//! [`MigrateV0ToV1`](crate::migrations::v1::MigrateV0ToV1), which may be used +//! in runtimes. +//! +//! Using [`VersionedMigration`] ensures that +//! - The migration only runs once when the on-chain storage version is `0` +//! - The on-chain storage version is updated to `1` after the migration executes +//! - Reads and writes from checking and setting the on-chain storage version are accounted for in +//! the final [`Weight`](frame_support::weights::Weight) +//! +//! ### `mod test` +//! +//! Here basic unit tests are defined for the migration. +//! +//! When writing migration tests, don't forget to check: +//! - `on_runtime_upgrade` returns the expected weight +//! - `post_upgrade` succeeds when given the bytes returned by `pre_upgrade` +//! - Pallet storage is in the expected state after the migration +//! +//! [`VersionedMigration`]: frame_support::migrations::VersionedMigration +//! [`GetStorageVersion`]: frame_support::traits::GetStorageVersion +//! [`OnRuntimeUpgrade`]: frame_support::traits::OnRuntimeUpgrade +//! [`UncheckedOnRuntimeUpgrade`]: frame_support::traits::UncheckedOnRuntimeUpgrade +//! [`MigrateV0ToV1`]: crate::migrations::v1::MigrateV0ToV1 + +// We make sure this pallet uses `no_std` for compiling to Wasm. +#![cfg_attr(not(feature = "std"), no_std)] +// allow non-camel-case names for storage version V0 value +#![allow(non_camel_case_types)] + +// Re-export pallet items so that they can be accessed from the crate namespace. +pub use pallet::*; + +// Export migrations so they may be used in the runtime. +pub mod migrations; +#[doc(hidden)] +mod mock; +use codec::{Decode, Encode, MaxEncodedLen}; +use frame_support::traits::StorageVersion; +use sp_runtime::RuntimeDebug; + +/// Example struct holding the most recently set [`u32`] and the +/// second most recently set [`u32`] (if one existed). +#[docify::export] +#[derive( + Clone, Eq, PartialEq, Encode, Decode, RuntimeDebug, scale_info::TypeInfo, MaxEncodedLen, +)] +pub struct CurrentAndPreviousValue { + /// The most recently set value. + pub current: u32, + /// The previous value, if one existed. + pub previous: Option, +} + +// Pallet for demonstrating storage migrations. +#[frame_support::pallet(dev_mode)] +pub mod pallet { + use super::*; + use frame_support::pallet_prelude::*; + use frame_system::pallet_prelude::*; + + /// Define the current [`StorageVersion`] of the pallet. + const STORAGE_VERSION: StorageVersion = StorageVersion::new(1); + + #[pallet::pallet] + #[pallet::storage_version(STORAGE_VERSION)] + pub struct Pallet(_); + + #[pallet::config] + pub trait Config: frame_system::Config {} + + /// [`StorageVersion`] V1 of [`Value`]. + /// + /// Currently used. + #[docify::export] + #[pallet::storage] + pub type Value = StorageValue<_, CurrentAndPreviousValue>; + + #[docify::export(pallet_calls)] + #[pallet::call] + impl Pallet { + pub fn set_value(origin: OriginFor, value: u32) -> DispatchResult { + ensure_signed(origin)?; + + let previous = Value::::get().map(|v| v.current); + let new_struct = CurrentAndPreviousValue { current: value, previous }; + >::put(new_struct); + + Ok(()) + } + } +} diff --git a/substrate/frame/examples/single-block-migrations/src/migrations/mod.rs b/substrate/frame/examples/single-block-migrations/src/migrations/mod.rs new file mode 100644 index 0000000000000000000000000000000000000000..80a33f69941aa1a49563971ab0c9e13a88ecda19 --- /dev/null +++ b/substrate/frame/examples/single-block-migrations/src/migrations/mod.rs @@ -0,0 +1,20 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/// Module containing all logic associated with the example migration from +/// [`StorageVersion`](frame_support::traits::StorageVersion) V0 to V1. +pub mod v1; diff --git a/substrate/frame/examples/single-block-migrations/src/migrations/v1.rs b/substrate/frame/examples/single-block-migrations/src/migrations/v1.rs new file mode 100644 index 0000000000000000000000000000000000000000..18ef4e72cc4f5ce938abf03d5eaea3039ec0b030 --- /dev/null +++ b/substrate/frame/examples/single-block-migrations/src/migrations/v1.rs @@ -0,0 +1,196 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use frame_support::{ + storage_alias, + traits::{Get, UncheckedOnRuntimeUpgrade}, +}; + +#[cfg(feature = "try-runtime")] +use sp_std::vec::Vec; + +/// Collection of storage item formats from the previous storage version. +/// +/// Required so we can read values in the v0 storage format during the migration. +mod v0 { + use super::*; + + /// V0 type for [`crate::Value`]. + #[storage_alias] + pub type Value = StorageValue, u32>; +} + +/// Implements [`UncheckedOnRuntimeUpgrade`], migrating the state of this pallet from V0 to V1. +/// +/// In V0 of the template [`crate::Value`] is just a `u32`. In V1, it has been upgraded to +/// contain the struct [`crate::CurrentAndPreviousValue`]. +/// +/// In this migration, update the on-chain storage for the pallet to reflect the new storage +/// layout. +pub struct InnerMigrateV0ToV1(sp_std::marker::PhantomData); + +impl UncheckedOnRuntimeUpgrade for InnerMigrateV0ToV1 { + /// Return the existing [`crate::Value`] so we can check that it was correctly set in + /// `InnerMigrateV0ToV1::post_upgrade`. + #[cfg(feature = "try-runtime")] + fn pre_upgrade() -> Result, sp_runtime::TryRuntimeError> { + use codec::Encode; + + // Access the old value using the `storage_alias` type + let old_value = v0::Value::::get(); + // Return it as an encoded `Vec` + Ok(old_value.encode()) + } + + /// Migrate the storage from V0 to V1. + /// + /// - If the value doesn't exist, there is nothing to do. + /// - If the value exists, it is read and then written back to storage inside a + /// [`crate::CurrentAndPreviousValue`]. + fn on_runtime_upgrade() -> frame_support::weights::Weight { + // Read the old value from storage + if let Some(old_value) = v0::Value::::take() { + // Write the new value to storage + let new = crate::CurrentAndPreviousValue { current: old_value, previous: None }; + crate::Value::::put(new); + // One read for the old value, one write for the new value + T::DbWeight::get().reads_writes(1, 1) + } else { + // One read for trying to access the old value + T::DbWeight::get().reads(1) + } + } + + /// Verifies the storage was migrated correctly. + /// + /// - If there was no old value, the new value should not be set. + /// - If there was an old value, the new value should be a [`crate::CurrentAndPreviousValue`]. + #[cfg(feature = "try-runtime")] + fn post_upgrade(state: Vec) -> Result<(), sp_runtime::TryRuntimeError> { + use codec::Decode; + use frame_support::ensure; + + let maybe_old_value = Option::::decode(&mut &state[..]).map_err(|_| { + sp_runtime::TryRuntimeError::Other("Failed to decode old value from storage") + })?; + + match maybe_old_value { + Some(old_value) => { + let expected_new_value = + crate::CurrentAndPreviousValue { current: old_value, previous: None }; + let actual_new_value = crate::Value::::get(); + + ensure!(actual_new_value.is_some(), "New value not set"); + ensure!( + actual_new_value == Some(expected_new_value), + "New value not set correctly" + ); + }, + None => { + ensure!(crate::Value::::get().is_none(), "New value unexpectedly set"); + }, + }; + Ok(()) + } +} + +/// [`UncheckedOnRuntimeUpgrade`] implementation [`InnerMigrateV0ToV1`] wrapped in a +/// [`VersionedMigration`](frame_support::migrations::VersionedMigration), which ensures that: +/// - The migration only runs once when the on-chain storage version is 0 +/// - The on-chain storage version is updated to `1` after the migration executes +/// - Reads/Writes from checking/settings the on-chain storage version are accounted for +pub type MigrateV0ToV1 = frame_support::migrations::VersionedMigration< + 0, // The migration will only execute when the on-chain storage version is 0 + 1, // The on-chain storage version will be set to 1 after the migration is complete + InnerMigrateV0ToV1, + crate::pallet::Pallet, + ::DbWeight, +>; + +/// Tests for our migration. +/// +/// When writing migration tests, it is important to check: +/// 1. `on_runtime_upgrade` returns the expected weight +/// 2. `post_upgrade` succeeds when given the bytes returned by `pre_upgrade` +/// 3. The storage is in the expected state after the migration +#[cfg(any(all(feature = "try-runtime", test), doc))] +mod test { + use self::InnerMigrateV0ToV1; + use super::*; + use crate::mock::{new_test_ext, MockRuntime}; + use frame_support::assert_ok; + + #[test] + fn handles_no_existing_value() { + new_test_ext().execute_with(|| { + // By default, no value should be set. Verify this assumption. + assert!(crate::Value::::get().is_none()); + assert!(v0::Value::::get().is_none()); + + // Get the pre_upgrade bytes + let bytes = match InnerMigrateV0ToV1::::pre_upgrade() { + Ok(bytes) => bytes, + Err(e) => panic!("pre_upgrade failed: {:?}", e), + }; + + // Execute the migration + let weight = InnerMigrateV0ToV1::::on_runtime_upgrade(); + + // Verify post_upgrade succeeds + assert_ok!(InnerMigrateV0ToV1::::post_upgrade(bytes)); + + // The weight should be just 1 read for trying to access the old value. + assert_eq!(weight, ::DbWeight::get().reads(1)); + + // After the migration, no value should have been set. + assert!(crate::Value::::get().is_none()); + }) + } + + #[test] + fn handles_existing_value() { + new_test_ext().execute_with(|| { + // Set up an initial value + let initial_value = 42; + v0::Value::::put(initial_value); + + // Get the pre_upgrade bytes + let bytes = match InnerMigrateV0ToV1::::pre_upgrade() { + Ok(bytes) => bytes, + Err(e) => panic!("pre_upgrade failed: {:?}", e), + }; + + // Execute the migration + let weight = InnerMigrateV0ToV1::::on_runtime_upgrade(); + + // Verify post_upgrade succeeds + assert_ok!(InnerMigrateV0ToV1::::post_upgrade(bytes)); + + // The weight used should be 1 read for the old value, and 1 write for the new + // value. + assert_eq!( + weight, + ::DbWeight::get().reads_writes(1, 1) + ); + + // After the migration, the new value should be set as the `current` value. + let expected_new_value = + crate::CurrentAndPreviousValue { current: initial_value, previous: None }; + assert_eq!(crate::Value::::get(), Some(expected_new_value)); + }) + } +} diff --git a/substrate/frame/examples/single-block-migrations/src/mock.rs b/substrate/frame/examples/single-block-migrations/src/mock.rs new file mode 100644 index 0000000000000000000000000000000000000000..68594cc4ad727a18f97b5d8b55381d36d1e7aeed --- /dev/null +++ b/substrate/frame/examples/single-block-migrations/src/mock.rs @@ -0,0 +1,69 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#![cfg(any(all(feature = "try-runtime", test), doc))] + +use crate::*; +use frame_support::{derive_impl, traits::ConstU64, weights::constants::ParityDbWeight}; + +// Re-export crate as its pallet name for construct_runtime. +use crate as pallet_example_storage_migration; + +type Block = frame_system::mocking::MockBlock; + +// For testing the pallet, we construct a mock runtime. +frame_support::construct_runtime!( + pub struct MockRuntime { + System: frame_system::{Pallet, Call, Config, Storage, Event}, + Balances: pallet_balances::{Pallet, Call, Storage, Config, Event}, + Example: pallet_example_storage_migration::{Pallet, Call, Storage}, + } +); + +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] +impl frame_system::Config for MockRuntime { + type Block = Block; + type AccountData = pallet_balances::AccountData; + type DbWeight = ParityDbWeight; +} + +impl pallet_balances::Config for MockRuntime { + type RuntimeHoldReason = RuntimeHoldReason; + type RuntimeFreezeReason = RuntimeFreezeReason; + type MaxLocks = (); + type MaxReserves = (); + type ReserveIdentifier = [u8; 8]; + type Balance = u64; + type DustRemoval = (); + type RuntimeEvent = RuntimeEvent; + type ExistentialDeposit = ConstU64<1>; + type AccountStore = System; + type WeightInfo = (); + type FreezeIdentifier = (); + type MaxFreezes = (); +} + +impl Config for MockRuntime {} + +pub fn new_test_ext() -> sp_io::TestExternalities { + use sp_runtime::BuildStorage; + + let t = RuntimeGenesisConfig { system: Default::default(), balances: Default::default() } + .build_storage() + .unwrap(); + t.into() +} diff --git a/substrate/frame/examples/split/Cargo.toml b/substrate/frame/examples/split/Cargo.toml index 733ca92b820d6b8a4230f7c8868494ec0410656e..1ef3521e06063cf15679e248c6b46ae27a14e946 100644 --- a/substrate/frame/examples/split/Cargo.toml +++ b/substrate/frame/examples/split/Cargo.toml @@ -6,7 +6,7 @@ edition.workspace = true license = "MIT-0" homepage = "https://substrate.io" repository.workspace = true -description = "FRAME example splitted pallet" +description = "FRAME example split pallet" readme = "README.md" [lints] @@ -17,8 +17,8 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.2.2", default-features = false } -log = { version = "0.4.17", default-features = false } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +log = { workspace = true } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } frame-support = { path = "../../support", default-features = false } frame-system = { path = "../../system", default-features = false } diff --git a/substrate/frame/examples/split/src/lib.rs b/substrate/frame/examples/split/src/lib.rs index 74d2e0cc24b7bf5789da19f2657c5e7d2514bbfe..5245d90e390cff1ccab79ecc279fe57188cde030 100644 --- a/substrate/frame/examples/split/src/lib.rs +++ b/substrate/frame/examples/split/src/lib.rs @@ -107,7 +107,7 @@ pub mod pallet { let _who = ensure_signed(origin)?; // Read a value from storage. - match >::get() { + match Something::::get() { // Return an error if the value has not been set. None => return Err(Error::::NoneValue.into()), Some(old) => { diff --git a/substrate/frame/examples/split/src/mock.rs b/substrate/frame/examples/split/src/mock.rs index caab4f1ae902f9be5bee10d324af96304db3a63f..5bf414ee24133c6ca86ed3ff6708e0b2e4f252ee 100644 --- a/substrate/frame/examples/split/src/mock.rs +++ b/substrate/frame/examples/split/src/mock.rs @@ -31,7 +31,7 @@ frame_support::construct_runtime!( /// Using a default config for [`frame_system`] in tests. See `default-config` example for more /// details. -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { type Block = Block; } diff --git a/substrate/frame/examples/src/lib.rs b/substrate/frame/examples/src/lib.rs index f38bbe52dc114900e4b497cb17da6deb4406512c..dee23a41379fc8b732252b9fe4db39bf809699fd 100644 --- a/substrate/frame/examples/src/lib.rs +++ b/substrate/frame/examples/src/lib.rs @@ -43,6 +43,9 @@ //! - [`pallet_example_frame_crate`]: Example pallet showcasing how one can be //! built using only the `frame` umbrella crate. //! +//! - [`pallet_example_single_block_migrations`]: An example pallet demonstrating best-practices for +//! writing storage migrations. +//! //! - [`pallet_example_tasks`]: This pallet demonstrates the use of `Tasks` to execute service work. //! //! **Tip**: Use `cargo doc --package --open` to view each pallet's documentation. diff --git a/substrate/frame/examples/tasks/Cargo.toml b/substrate/frame/examples/tasks/Cargo.toml index f6850b53c030262d49b59205c1dec22923f1a38d..3f59d57ea0f202729f11ac549daa828424343671 100644 --- a/substrate/frame/examples/tasks/Cargo.toml +++ b/substrate/frame/examples/tasks/Cargo.toml @@ -5,7 +5,7 @@ authors.workspace = true edition.workspace = true license.workspace = true repository.workspace = true -description = "Pallet to demonstrate the usage of Tasks to recongnize and execute service work" +description = "Pallet to demonstrate the usage of Tasks to recognize and execute service work" [lints] workspace = true @@ -15,8 +15,8 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false } -log = { version = "0.4.17", default-features = false } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +log = { workspace = true } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } frame-support = { path = "../../support", default-features = false } frame-system = { path = "../../system", default-features = false } diff --git a/substrate/frame/examples/tasks/src/mock.rs b/substrate/frame/examples/tasks/src/mock.rs index 5ad104b0dfae4f32945182e2e79773ba3f470d9a..76ac9e76bff8a79dbedfd6f6a4746a452a685eba 100644 --- a/substrate/frame/examples/tasks/src/mock.rs +++ b/substrate/frame/examples/tasks/src/mock.rs @@ -32,7 +32,7 @@ frame_support::construct_runtime!( } ); -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Runtime { type Block = Block; } diff --git a/substrate/frame/executive/Cargo.toml b/substrate/frame/executive/Cargo.toml index 7c72fc77be90a12c055329b3e71c07bfb0167bc1..95de7c3f3d1f086a39a8f12af6c8a851eff3fa4d 100644 --- a/substrate/frame/executive/Cargo.toml +++ b/substrate/frame/executive/Cargo.toml @@ -16,11 +16,12 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] +aquamarine = "0.3.2" codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = [ "derive", ] } -log = { version = "0.4.17", default-features = false } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +log = { workspace = true } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } frame-support = { path = "../support", default-features = false } frame-system = { path = "../system", default-features = false } frame-try-runtime = { path = "../try-runtime", default-features = false, optional = true } @@ -44,6 +45,7 @@ default = ["std"] with-tracing = ["sp-tracing/with-tracing"] std = [ "codec/std", + "frame-support/experimental", "frame-support/std", "frame-system/std", "frame-try-runtime/std", diff --git a/substrate/frame/executive/src/lib.rs b/substrate/frame/executive/src/lib.rs index 48ff675f8082ddd0e7779c946b32dde66b171078..3028eaf318e0881c1b6f4d4ea6ac17adfe99a75f 100644 --- a/substrate/frame/executive/src/lib.rs +++ b/substrate/frame/executive/src/lib.rs @@ -15,6 +15,8 @@ // See the License for the specific language governing permissions and // limitations under the License. +#![cfg_attr(not(feature = "std"), no_std)] + //! # Executive Module //! //! The Executive module acts as the orchestration layer for the runtime. It dispatches incoming @@ -35,6 +37,8 @@ //! - Finalize a block. //! - Start an off-chain worker. //! +//! The flow of their application in a block is explained in the [block flowchart](block_flowchart). +//! //! ### Implementations //! //! The Executive module provides the following implementations: @@ -114,17 +118,51 @@ //! pub type Executive = executive::Executive; //! ``` -#![cfg_attr(not(feature = "std"), no_std)] +#[cfg(doc)] +#[cfg_attr(doc, aquamarine::aquamarine)] +/// # Block Execution +/// +/// These are the steps of block execution as done by [`Executive::execute_block`]. A block is +/// invalid if any of them fail. +/// +/// ```mermaid +/// flowchart TD +/// Executive::execute_block --> on_runtime_upgrade +/// on_runtime_upgrade --> System::initialize +/// Executive::initialize_block --> System::initialize +/// System::initialize --> on_initialize +/// on_initialize --> PreInherents[System::PreInherents] +/// PreInherents --> Inherents[Apply Inherents] +/// Inherents --> PostInherents[System::PostInherents] +/// PostInherents --> Check{MBM ongoing?} +/// Check -->|No| poll +/// Check -->|Yes| post_transactions_2[System::PostTransaction] +/// post_transactions_2 --> Step[MBMs::step] +/// Step --> on_finalize +/// poll --> transactions[Apply Transactions] +/// transactions --> post_transactions_1[System::PostTransaction] +/// post_transactions_1 --> CheckIdle{Weight remaining?} +/// CheckIdle -->|Yes| on_idle +/// CheckIdle -->|No| on_finalize +/// on_idle --> on_finalize +/// ``` +pub mod block_flowchart {} + +#[cfg(test)] +mod tests; use codec::{Codec, Encode}; use frame_support::{ + defensive_assert, dispatch::{DispatchClass, DispatchInfo, GetDispatchInfo, PostDispatchInfo}, + migrations::MultiStepMigrator, pallet_prelude::InvalidTransaction, traits::{ BeforeAllRuntimeMigrations, EnsureInherentsAreFirst, ExecuteBlock, OffchainWorker, - OnFinalize, OnIdle, OnInitialize, OnRuntimeUpgrade, + OnFinalize, OnIdle, OnInitialize, OnPoll, OnRuntimeUpgrade, PostInherents, + PostTransactions, PreInherents, }, - weights::Weight, + weights::{Weight, WeightMeter}, }; use frame_system::pallet_prelude::BlockNumberFor; use sp_runtime::{ @@ -134,7 +172,7 @@ use sp_runtime::{ ValidateUnsigned, Zero, }, transaction_validity::{TransactionSource, TransactionValidity}, - ApplyExtrinsicResult, + ApplyExtrinsicResult, ExtrinsicInclusionMode, }; use sp_std::{marker::PhantomData, prelude::*}; @@ -198,7 +236,8 @@ impl< + OnInitialize> + OnIdle> + OnFinalize> - + OffchainWorker>, + + OffchainWorker> + + OnPoll>, COnRuntimeUpgrade: OnRuntimeUpgrade, > ExecuteBlock for Executive @@ -237,6 +276,7 @@ impl< + OnIdle> + OnFinalize> + OffchainWorker> + + OnPoll> + TryState> + TryDecodeEntireStorage, COnRuntimeUpgrade: OnRuntimeUpgrade, @@ -272,36 +312,50 @@ where select, ); - Self::initialize_block(block.header()); - Self::initial_checks(&block); - + let mode = Self::initialize_block(block.header()); + let num_inherents = Self::initial_checks(&block) as usize; let (header, extrinsics) = block.deconstruct(); + // Check if there are any forbidden non-inherents in the block. + if mode == ExtrinsicInclusionMode::OnlyInherents && extrinsics.len() > num_inherents { + return Err("Only inherents allowed".into()) + } + let try_apply_extrinsic = |uxt: Block::Extrinsic| -> ApplyExtrinsicResult { sp_io::init_tracing(); let encoded = uxt.encode(); let encoded_len = encoded.len(); + let is_inherent = System::is_inherent(&uxt); // skip signature verification. let xt = if signature_check { uxt.check(&Default::default()) } else { uxt.unchecked_into_checked_i_know_what_i_am_doing(&Default::default()) }?; - >::note_extrinsic(encoded); let dispatch_info = xt.get_dispatch_info(); + if !is_inherent && !>::inherents_applied() { + Self::inherents_applied(); + } + + >::note_extrinsic(encoded); let r = Applyable::apply::(xt, &dispatch_info, encoded_len)?; + if r.is_err() && dispatch_info.class == DispatchClass::Mandatory { + return Err(InvalidTransaction::BadMandatory.into()) + } + >::note_applied_extrinsic(&r, dispatch_info); Ok(r.map(|_| ()).map_err(|e| e.error)) }; - for e in extrinsics { + // Apply extrinsics: + for e in extrinsics.iter() { if let Err(err) = try_apply_extrinsic(e.clone()) { log::error!( - target: LOG_TARGET, "executing transaction {:?} failed due to {:?}. Aborting the rest of the block execution.", + target: LOG_TARGET, "transaction {:?} failed due to {:?}. Aborting the rest of the block execution.", e, err, ); @@ -309,9 +363,17 @@ where } } + // In this case there were no transactions to trigger this state transition: + if !>::inherents_applied() { + Self::inherents_applied(); + } + // post-extrinsics book-keeping >::note_finished_extrinsics(); - Self::idle_and_finalize_hook(*header.number()); + ::PostTransactions::post_transactions(); + + Self::on_idle_hook(*header.number()); + Self::on_finalize_hook(*header.number()); // run the try-state checks of all pallets, ensuring they don't alter any state. let _guard = frame_support::StorageNoopGuard::default(); @@ -449,7 +511,8 @@ impl< + OnInitialize> + OnIdle> + OnFinalize> - + OffchainWorker>, + + OffchainWorker> + + OnPoll>, COnRuntimeUpgrade: OnRuntimeUpgrade, > Executive where @@ -464,16 +527,36 @@ where pub fn execute_on_runtime_upgrade() -> Weight { let before_all_weight = ::before_all_runtime_migrations(); - <(COnRuntimeUpgrade, AllPalletsWithSystem) as OnRuntimeUpgrade>::on_runtime_upgrade() - .saturating_add(before_all_weight) + + let runtime_upgrade_weight = <( + COnRuntimeUpgrade, + ::SingleBlockMigrations, + // We want to run the migrations before we call into the pallets as they may + // access any state that would then not be migrated. + AllPalletsWithSystem, + ) as OnRuntimeUpgrade>::on_runtime_upgrade(); + + before_all_weight.saturating_add(runtime_upgrade_weight) } /// Start the execution of a particular block. - pub fn initialize_block(header: &frame_system::pallet_prelude::HeaderFor) { + pub fn initialize_block( + header: &frame_system::pallet_prelude::HeaderFor, + ) -> ExtrinsicInclusionMode { sp_io::init_tracing(); sp_tracing::enter_span!(sp_tracing::Level::TRACE, "init_block"); let digests = Self::extract_pre_digest(header); Self::initialize_block_impl(header.number(), header.parent_hash(), &digests); + + Self::extrinsic_mode() + } + + fn extrinsic_mode() -> ExtrinsicInclusionMode { + if ::MultiBlockMigrator::ongoing() { + ExtrinsicInclusionMode::OnlyInherents + } else { + ExtrinsicInclusionMode::AllExtrinsics + } } fn extract_pre_digest(header: &frame_system::pallet_prelude::HeaderFor) -> Digest { @@ -519,6 +602,7 @@ where ); frame_system::Pallet::::note_finished_initialize(); + ::PreInherents::pre_inherents(); } /// Returns if the runtime has been upgraded, based on [`frame_system::LastRuntimeUpgrade`]. @@ -529,7 +613,8 @@ where last.map(|v| v.was_upgraded(¤t)).unwrap_or(true) } - fn initial_checks(block: &Block) { + /// Returns the number of inherents in the block. + fn initial_checks(block: &Block) -> u32 { sp_tracing::enter_span!(sp_tracing::Level::TRACE, "initial_checks"); let header = block.header(); @@ -542,8 +627,9 @@ where "Parent hash should be valid.", ); - if let Err(i) = System::ensure_inherents_are_first(block) { - panic!("Invalid inherent position for extrinsic at index {}", i); + match System::ensure_inherents_are_first(block) { + Ok(num) => num, + Err(i) => panic!("Invalid inherent position for extrinsic at index {}", i), } } @@ -552,53 +638,90 @@ where sp_io::init_tracing(); sp_tracing::within_span! { sp_tracing::info_span!("execute_block", ?block); + // Execute `on_runtime_upgrade` and `on_initialize`. + let mode = Self::initialize_block(block.header()); + let num_inherents = Self::initial_checks(&block) as usize; + let (header, extrinsics) = block.deconstruct(); + let num_extrinsics = extrinsics.len(); - Self::initialize_block(block.header()); + if mode == ExtrinsicInclusionMode::OnlyInherents && num_extrinsics > num_inherents { + // Invalid block + panic!("Only inherents are allowed in this block") + } - // any initial checks - Self::initial_checks(&block); + Self::apply_extrinsics(extrinsics.into_iter()); - // execute extrinsics - let (header, extrinsics) = block.deconstruct(); - Self::execute_extrinsics_with_book_keeping(extrinsics, *header.number()); + // In this case there were no transactions to trigger this state transition: + if !>::inherents_applied() { + defensive_assert!(num_inherents == num_extrinsics); + Self::inherents_applied(); + } - // any final checks + >::note_finished_extrinsics(); + ::PostTransactions::post_transactions(); + + Self::on_idle_hook(*header.number()); + Self::on_finalize_hook(*header.number()); Self::final_checks(&header); } } - /// Execute given extrinsics and take care of post-extrinsics book-keeping. - fn execute_extrinsics_with_book_keeping( - extrinsics: Vec, - block_number: NumberFor, - ) { + /// Logic that runs directly after inherent application. + /// + /// It advances the Multi-Block-Migrations or runs the `on_poll` hook. + pub fn inherents_applied() { + >::note_inherents_applied(); + ::PostInherents::post_inherents(); + + if ::MultiBlockMigrator::ongoing() { + let used_weight = ::MultiBlockMigrator::step(); + >::register_extra_weight_unchecked( + used_weight, + DispatchClass::Mandatory, + ); + } else { + let block_number = >::block_number(); + Self::on_poll_hook(block_number); + } + } + + /// Execute given extrinsics. + fn apply_extrinsics(extrinsics: impl Iterator) { extrinsics.into_iter().for_each(|e| { if let Err(e) = Self::apply_extrinsic(e) { let err: &'static str = e.into(); panic!("{}", err) } }); - - // post-extrinsics book-keeping - >::note_finished_extrinsics(); - - Self::idle_and_finalize_hook(block_number); } /// Finalize the block - it is up the caller to ensure that all header fields are valid /// except state-root. + // Note: Only used by the block builder - not Executive itself. pub fn finalize_block() -> frame_system::pallet_prelude::HeaderFor { sp_io::init_tracing(); sp_tracing::enter_span!(sp_tracing::Level::TRACE, "finalize_block"); - >::note_finished_extrinsics(); - let block_number = >::block_number(); - Self::idle_and_finalize_hook(block_number); + // In this case there were no transactions to trigger this state transition: + if !>::inherents_applied() { + Self::inherents_applied(); + } + >::note_finished_extrinsics(); + ::PostTransactions::post_transactions(); + let block_number = >::block_number(); + Self::on_idle_hook(block_number); + Self::on_finalize_hook(block_number); >::finalize() } - fn idle_and_finalize_hook(block_number: NumberFor) { + /// Run the `on_idle` hook of all pallet, but only if there is weight remaining and there are no + /// ongoing MBMs. + fn on_idle_hook(block_number: NumberFor) { + if ::MultiBlockMigrator::ongoing() { + return + } + let weight = >::block_weight(); let max_weight = >::get().max_block; let remaining_weight = max_weight.saturating_sub(weight.total()); @@ -613,7 +736,33 @@ where DispatchClass::Mandatory, ); } + } + + fn on_poll_hook(block_number: NumberFor) { + defensive_assert!( + !::MultiBlockMigrator::ongoing(), + "on_poll should not be called during migrations" + ); + let weight = >::block_weight(); + let max_weight = >::get().max_block; + let remaining = max_weight.saturating_sub(weight.total()); + + if remaining.all_gt(Weight::zero()) { + let mut meter = WeightMeter::with_limit(remaining); + >>::on_poll( + block_number, + &mut meter, + ); + >::register_extra_weight_unchecked( + meter.consumed(), + DispatchClass::Mandatory, + ); + } + } + + /// Run the `on_finalize` hook of all pallet. + fn on_finalize_hook(block_number: NumberFor) { >>::on_finalize(block_number); } @@ -627,8 +776,18 @@ where let encoded_len = encoded.len(); sp_tracing::enter_span!(sp_tracing::info_span!("apply_extrinsic", ext=?sp_core::hexdisplay::HexDisplay::from(&encoded))); + + // We use the dedicated `is_inherent` check here, since just relying on `Mandatory` dispatch + // class does not capture optional inherents. + let is_inherent = System::is_inherent(&uxt); + // Verify that the signature is good. let xt = uxt.check(&Default::default())?; + let dispatch_info = xt.get_dispatch_info(); + + if !is_inherent && !>::inherents_applied() { + Self::inherents_applied(); + } // We don't need to make sure to `note_extrinsic` only after we know it's going to be // executed to prevent it from leaking in storage since at this point, it will either @@ -637,8 +796,6 @@ where // AUDIT: Under no circumstances may this function panic from here onwards. - // Decode parameters and dispatch - let dispatch_info = xt.get_dispatch_info(); let r = Applyable::apply::(xt, &dispatch_info, encoded_len)?; // Mandatory(inherents) are not allowed to fail. @@ -745,956 +902,3 @@ where ) } } - -#[cfg(test)] -mod tests { - use super::*; - - use sp_core::H256; - use sp_runtime::{ - generic::{DigestItem, Era}, - testing::{Block, Digest, Header}, - traits::{BlakeTwo256, Block as BlockT, Header as HeaderT, IdentityLookup}, - transaction_validity::{ - InvalidTransaction, TransactionValidityError, UnknownTransaction, ValidTransaction, - }, - BuildStorage, DispatchError, - }; - - use frame_support::{ - assert_err, derive_impl, parameter_types, - traits::{fungible, ConstU32, ConstU64, ConstU8, Currency}, - weights::{ConstantMultiplier, IdentityFee, RuntimeDbWeight, Weight, WeightToFee}, - }; - use frame_system::{ChainContext, LastRuntimeUpgrade, LastRuntimeUpgradeInfo}; - use pallet_balances::Call as BalancesCall; - use pallet_transaction_payment::CurrencyAdapter; - - const TEST_KEY: &[u8] = b":test:key:"; - - #[frame_support::pallet(dev_mode)] - mod custom { - use frame_support::pallet_prelude::*; - use frame_system::pallet_prelude::*; - - #[pallet::pallet] - pub struct Pallet(_); - - #[pallet::config] - pub trait Config: frame_system::Config {} - - #[pallet::hooks] - impl Hooks> for Pallet { - // module hooks. - // one with block number arg and one without - fn on_initialize(n: BlockNumberFor) -> Weight { - println!("on_initialize({})", n); - Weight::from_parts(175, 0) - } - - fn on_idle(n: BlockNumberFor, remaining_weight: Weight) -> Weight { - println!("on_idle{}, {})", n, remaining_weight); - Weight::from_parts(175, 0) - } - - fn on_finalize(n: BlockNumberFor) { - println!("on_finalize({})", n); - } - - fn on_runtime_upgrade() -> Weight { - sp_io::storage::set(super::TEST_KEY, "module".as_bytes()); - Weight::from_parts(200, 0) - } - - fn offchain_worker(n: BlockNumberFor) { - assert_eq!(BlockNumberFor::::from(1u32), n); - } - } - - #[pallet::call] - impl Pallet { - pub fn some_function(origin: OriginFor) -> DispatchResult { - // NOTE: does not make any different. - frame_system::ensure_signed(origin)?; - Ok(()) - } - - #[pallet::weight((200, DispatchClass::Operational))] - pub fn some_root_operation(origin: OriginFor) -> DispatchResult { - frame_system::ensure_root(origin)?; - Ok(()) - } - - pub fn some_unsigned_message(origin: OriginFor) -> DispatchResult { - frame_system::ensure_none(origin)?; - Ok(()) - } - - pub fn allowed_unsigned(origin: OriginFor) -> DispatchResult { - frame_system::ensure_root(origin)?; - Ok(()) - } - - pub fn unallowed_unsigned(origin: OriginFor) -> DispatchResult { - frame_system::ensure_root(origin)?; - Ok(()) - } - - #[pallet::weight((0, DispatchClass::Mandatory))] - pub fn inherent_call(origin: OriginFor) -> DispatchResult { - frame_system::ensure_none(origin)?; - Ok(()) - } - - pub fn calculate_storage_root(_origin: OriginFor) -> DispatchResult { - let root = sp_io::storage::root(sp_runtime::StateVersion::V1); - sp_io::storage::set("storage_root".as_bytes(), &root); - Ok(()) - } - } - - #[pallet::inherent] - impl ProvideInherent for Pallet { - type Call = Call; - - type Error = sp_inherents::MakeFatalError<()>; - - const INHERENT_IDENTIFIER: [u8; 8] = *b"test1234"; - - fn create_inherent(_data: &InherentData) -> Option { - None - } - - fn is_inherent(call: &Self::Call) -> bool { - *call == Call::::inherent_call {} - } - } - - #[pallet::validate_unsigned] - impl ValidateUnsigned for Pallet { - type Call = Call; - - // Inherent call is accepted for being dispatched - fn pre_dispatch(call: &Self::Call) -> Result<(), TransactionValidityError> { - match call { - Call::allowed_unsigned { .. } => Ok(()), - Call::inherent_call { .. } => Ok(()), - _ => Err(UnknownTransaction::NoUnsignedValidator.into()), - } - } - - // Inherent call is not validated as unsigned - fn validate_unsigned( - _source: TransactionSource, - call: &Self::Call, - ) -> TransactionValidity { - match call { - Call::allowed_unsigned { .. } => Ok(Default::default()), - _ => UnknownTransaction::NoUnsignedValidator.into(), - } - } - } - } - - frame_support::construct_runtime!( - pub enum Runtime { - System: frame_system, - Balances: pallet_balances, - TransactionPayment: pallet_transaction_payment, - Custom: custom, - } - ); - - parameter_types! { - pub BlockWeights: frame_system::limits::BlockWeights = - frame_system::limits::BlockWeights::builder() - .base_block(Weight::from_parts(10, 0)) - .for_class(DispatchClass::all(), |weights| weights.base_extrinsic = Weight::from_parts(5, 0)) - .for_class(DispatchClass::non_mandatory(), |weights| weights.max_total = Weight::from_parts(1024, u64::MAX).into()) - .build_or_panic(); - pub const DbWeight: RuntimeDbWeight = RuntimeDbWeight { - read: 10, - write: 100, - }; - } - #[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] - impl frame_system::Config for Runtime { - type BaseCallFilter = frame_support::traits::Everything; - type BlockWeights = BlockWeights; - type BlockLength = (); - type DbWeight = (); - type RuntimeOrigin = RuntimeOrigin; - type Nonce = u64; - type RuntimeCall = RuntimeCall; - type Hash = sp_core::H256; - type Hashing = BlakeTwo256; - type AccountId = u64; - type Lookup = IdentityLookup; - type Block = TestBlock; - type RuntimeEvent = RuntimeEvent; - type BlockHashCount = ConstU64<250>; - type Version = RuntimeVersion; - type PalletInfo = PalletInfo; - type AccountData = pallet_balances::AccountData; - type OnNewAccount = (); - type OnKilledAccount = (); - type SystemWeightInfo = (); - type SS58Prefix = (); - type OnSetCode = (); - type MaxConsumers = ConstU32<16>; - } - - type Balance = u64; - impl pallet_balances::Config for Runtime { - type Balance = Balance; - type RuntimeEvent = RuntimeEvent; - type DustRemoval = (); - type ExistentialDeposit = ConstU64<1>; - type AccountStore = System; - type MaxLocks = (); - type MaxReserves = (); - type ReserveIdentifier = [u8; 8]; - type WeightInfo = (); - type FreezeIdentifier = (); - type MaxFreezes = ConstU32<1>; - type RuntimeHoldReason = (); - type RuntimeFreezeReason = (); - } - - parameter_types! { - pub const TransactionByteFee: Balance = 0; - } - impl pallet_transaction_payment::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type OnChargeTransaction = CurrencyAdapter; - type OperationalFeeMultiplier = ConstU8<5>; - type WeightToFee = IdentityFee; - type LengthToFee = ConstantMultiplier; - type FeeMultiplierUpdate = (); - } - impl custom::Config for Runtime {} - - pub struct RuntimeVersion; - impl frame_support::traits::Get for RuntimeVersion { - fn get() -> sp_version::RuntimeVersion { - RuntimeVersionTestValues::get().clone() - } - } - - parameter_types! { - pub static RuntimeVersionTestValues: sp_version::RuntimeVersion = - Default::default(); - } - - type SignedExtra = ( - frame_system::CheckEra, - frame_system::CheckNonce, - frame_system::CheckWeight, - pallet_transaction_payment::ChargeTransactionPayment, - ); - type TestXt = sp_runtime::testing::TestXt; - type TestBlock = Block; - - // Will contain `true` when the custom runtime logic was called. - const CUSTOM_ON_RUNTIME_KEY: &[u8] = b":custom:on_runtime"; - - struct CustomOnRuntimeUpgrade; - impl OnRuntimeUpgrade for CustomOnRuntimeUpgrade { - fn on_runtime_upgrade() -> Weight { - sp_io::storage::set(TEST_KEY, "custom_upgrade".as_bytes()); - sp_io::storage::set(CUSTOM_ON_RUNTIME_KEY, &true.encode()); - System::deposit_event(frame_system::Event::CodeUpdated); - - assert_eq!(0, System::last_runtime_upgrade_spec_version()); - - Weight::from_parts(100, 0) - } - } - - type Executive = super::Executive< - Runtime, - Block, - ChainContext, - Runtime, - AllPalletsWithSystem, - CustomOnRuntimeUpgrade, - >; - - fn extra(nonce: u64, fee: Balance) -> SignedExtra { - ( - frame_system::CheckEra::from(Era::Immortal), - frame_system::CheckNonce::from(nonce), - frame_system::CheckWeight::new(), - pallet_transaction_payment::ChargeTransactionPayment::from(fee), - ) - } - - fn sign_extra(who: u64, nonce: u64, fee: Balance) -> Option<(u64, SignedExtra)> { - Some((who, extra(nonce, fee))) - } - - fn call_transfer(dest: u64, value: u64) -> RuntimeCall { - RuntimeCall::Balances(BalancesCall::transfer_allow_death { dest, value }) - } - - #[test] - fn balance_transfer_dispatch_works() { - let mut t = frame_system::GenesisConfig::::default().build_storage().unwrap(); - pallet_balances::GenesisConfig:: { balances: vec![(1, 211)] } - .assimilate_storage(&mut t) - .unwrap(); - let xt = TestXt::new(call_transfer(2, 69), sign_extra(1, 0, 0)); - let weight = xt.get_dispatch_info().weight + - ::BlockWeights::get() - .get(DispatchClass::Normal) - .base_extrinsic; - let fee: Balance = - ::WeightToFee::weight_to_fee(&weight); - let mut t = sp_io::TestExternalities::new(t); - t.execute_with(|| { - Executive::initialize_block(&Header::new( - 1, - H256::default(), - H256::default(), - [69u8; 32].into(), - Digest::default(), - )); - let r = Executive::apply_extrinsic(xt); - assert!(r.is_ok()); - assert_eq!(>::total_balance(&1), 142 - fee); - assert_eq!(>::total_balance(&2), 69); - }); - } - - fn new_test_ext(balance_factor: Balance) -> sp_io::TestExternalities { - let mut t = frame_system::GenesisConfig::::default().build_storage().unwrap(); - pallet_balances::GenesisConfig:: { balances: vec![(1, 111 * balance_factor)] } - .assimilate_storage(&mut t) - .unwrap(); - t.into() - } - - fn new_test_ext_v0(balance_factor: Balance) -> sp_io::TestExternalities { - let mut t = frame_system::GenesisConfig::::default().build_storage().unwrap(); - pallet_balances::GenesisConfig:: { balances: vec![(1, 111 * balance_factor)] } - .assimilate_storage(&mut t) - .unwrap(); - (t, sp_runtime::StateVersion::V0).into() - } - - #[test] - fn block_import_works() { - block_import_works_inner( - new_test_ext_v0(1), - array_bytes::hex_n_into_unchecked( - "65e953676859e7a33245908af7ad3637d6861eb90416d433d485e95e2dd174a1", - ), - ); - block_import_works_inner( - new_test_ext(1), - array_bytes::hex_n_into_unchecked( - "5a19b3d6fdb7241836349fdcbe2d9df4d4f945b949d979e31ad50bff1cbcd1c2", - ), - ); - } - fn block_import_works_inner(mut ext: sp_io::TestExternalities, state_root: H256) { - ext.execute_with(|| { - Executive::execute_block(Block { - header: Header { - parent_hash: [69u8; 32].into(), - number: 1, - state_root, - extrinsics_root: array_bytes::hex_n_into_unchecked( - "03170a2e7597b7b7e3d84c05391d139a62b157e78786d8c082f29dcf4c111314", - ), - digest: Digest { logs: vec![] }, - }, - extrinsics: vec![], - }); - }); - } - - #[test] - #[should_panic] - fn block_import_of_bad_state_root_fails() { - new_test_ext(1).execute_with(|| { - Executive::execute_block(Block { - header: Header { - parent_hash: [69u8; 32].into(), - number: 1, - state_root: [0u8; 32].into(), - extrinsics_root: array_bytes::hex_n_into_unchecked( - "03170a2e7597b7b7e3d84c05391d139a62b157e78786d8c082f29dcf4c111314", - ), - digest: Digest { logs: vec![] }, - }, - extrinsics: vec![], - }); - }); - } - - #[test] - #[should_panic] - fn block_import_of_bad_extrinsic_root_fails() { - new_test_ext(1).execute_with(|| { - Executive::execute_block(Block { - header: Header { - parent_hash: [69u8; 32].into(), - number: 1, - state_root: array_bytes::hex_n_into_unchecked( - "75e7d8f360d375bbe91bcf8019c01ab6362448b4a89e3b329717eb9d910340e5", - ), - extrinsics_root: [0u8; 32].into(), - digest: Digest { logs: vec![] }, - }, - extrinsics: vec![], - }); - }); - } - - #[test] - fn bad_extrinsic_not_inserted() { - let mut t = new_test_ext(1); - // bad nonce check! - let xt = TestXt::new(call_transfer(33, 69), sign_extra(1, 30, 0)); - t.execute_with(|| { - Executive::initialize_block(&Header::new( - 1, - H256::default(), - H256::default(), - [69u8; 32].into(), - Digest::default(), - )); - assert_err!( - Executive::apply_extrinsic(xt), - TransactionValidityError::Invalid(InvalidTransaction::Future) - ); - assert_eq!(>::extrinsic_index(), Some(0)); - }); - } - - #[test] - fn block_weight_limit_enforced() { - let mut t = new_test_ext(10000); - // given: TestXt uses the encoded len as fixed Len: - let xt = TestXt::new( - RuntimeCall::Balances(BalancesCall::transfer_allow_death { dest: 33, value: 0 }), - sign_extra(1, 0, 0), - ); - let encoded = xt.encode(); - let encoded_len = encoded.len() as u64; - // on_initialize weight + base block execution weight - let block_weights = ::BlockWeights::get(); - let base_block_weight = Weight::from_parts(175, 0) + block_weights.base_block; - let limit = block_weights.get(DispatchClass::Normal).max_total.unwrap() - base_block_weight; - let num_to_exhaust_block = limit.ref_time() / (encoded_len + 5); - t.execute_with(|| { - Executive::initialize_block(&Header::new( - 1, - H256::default(), - H256::default(), - [69u8; 32].into(), - Digest::default(), - )); - // Base block execution weight + `on_initialize` weight from the custom module. - assert_eq!(>::block_weight().total(), base_block_weight); - - for nonce in 0..=num_to_exhaust_block { - let xt = TestXt::new( - RuntimeCall::Balances(BalancesCall::transfer_allow_death { - dest: 33, - value: 0, - }), - sign_extra(1, nonce.into(), 0), - ); - let res = Executive::apply_extrinsic(xt); - if nonce != num_to_exhaust_block { - assert!(res.is_ok()); - assert_eq!( - >::block_weight().total(), - //--------------------- on_initialize + block_execution + extrinsic_base weight - Weight::from_parts((encoded_len + 5) * (nonce + 1), 0) + base_block_weight, - ); - assert_eq!( - >::extrinsic_index(), - Some(nonce as u32 + 1) - ); - } else { - assert_eq!(res, Err(InvalidTransaction::ExhaustsResources.into())); - } - } - }); - } - - #[test] - fn block_weight_and_size_is_stored_per_tx() { - let xt = TestXt::new( - RuntimeCall::Balances(BalancesCall::transfer_allow_death { dest: 33, value: 0 }), - sign_extra(1, 0, 0), - ); - let x1 = TestXt::new( - RuntimeCall::Balances(BalancesCall::transfer_allow_death { dest: 33, value: 0 }), - sign_extra(1, 1, 0), - ); - let x2 = TestXt::new( - RuntimeCall::Balances(BalancesCall::transfer_allow_death { dest: 33, value: 0 }), - sign_extra(1, 2, 0), - ); - let len = xt.clone().encode().len() as u32; - let mut t = new_test_ext(1); - t.execute_with(|| { - // Block execution weight + on_initialize weight from custom module - let base_block_weight = Weight::from_parts(175, 0) + - ::BlockWeights::get().base_block; - - Executive::initialize_block(&Header::new( - 1, - H256::default(), - H256::default(), - [69u8; 32].into(), - Digest::default(), - )); - - assert_eq!(>::block_weight().total(), base_block_weight); - assert_eq!(>::all_extrinsics_len(), 0); - - assert!(Executive::apply_extrinsic(xt.clone()).unwrap().is_ok()); - assert!(Executive::apply_extrinsic(x1.clone()).unwrap().is_ok()); - assert!(Executive::apply_extrinsic(x2.clone()).unwrap().is_ok()); - - // default weight for `TestXt` == encoded length. - let extrinsic_weight = Weight::from_parts(len as u64, 0) + - ::BlockWeights::get() - .get(DispatchClass::Normal) - .base_extrinsic; - assert_eq!( - >::block_weight().total(), - base_block_weight + 3u64 * extrinsic_weight, - ); - assert_eq!(>::all_extrinsics_len(), 3 * len); - - let _ = >::finalize(); - // All extrinsics length cleaned on `System::finalize` - assert_eq!(>::all_extrinsics_len(), 0); - - // New Block - Executive::initialize_block(&Header::new( - 2, - H256::default(), - H256::default(), - [69u8; 32].into(), - Digest::default(), - )); - - // Block weight cleaned up on `System::initialize` - assert_eq!(>::block_weight().total(), base_block_weight); - }); - } - - #[test] - fn validate_unsigned() { - let valid = TestXt::new(RuntimeCall::Custom(custom::Call::allowed_unsigned {}), None); - let invalid = TestXt::new(RuntimeCall::Custom(custom::Call::unallowed_unsigned {}), None); - let mut t = new_test_ext(1); - - t.execute_with(|| { - assert_eq!( - Executive::validate_transaction( - TransactionSource::InBlock, - valid.clone(), - Default::default(), - ), - Ok(ValidTransaction::default()), - ); - assert_eq!( - Executive::validate_transaction( - TransactionSource::InBlock, - invalid.clone(), - Default::default(), - ), - Err(TransactionValidityError::Unknown(UnknownTransaction::NoUnsignedValidator)), - ); - assert_eq!(Executive::apply_extrinsic(valid), Ok(Err(DispatchError::BadOrigin))); - assert_eq!( - Executive::apply_extrinsic(invalid), - Err(TransactionValidityError::Unknown(UnknownTransaction::NoUnsignedValidator)) - ); - }); - } - - #[test] - fn can_not_pay_for_tx_fee_on_full_lock() { - let mut t = new_test_ext(1); - t.execute_with(|| { - as fungible::MutateFreeze>::set_freeze( - &(), - &1, - 110, - ) - .unwrap(); - let xt = TestXt::new( - RuntimeCall::System(frame_system::Call::remark { remark: vec![1u8] }), - sign_extra(1, 0, 0), - ); - Executive::initialize_block(&Header::new( - 1, - H256::default(), - H256::default(), - [69u8; 32].into(), - Digest::default(), - )); - - assert_eq!(Executive::apply_extrinsic(xt), Err(InvalidTransaction::Payment.into()),); - assert_eq!(>::total_balance(&1), 111); - }); - } - - #[test] - fn block_hooks_weight_is_stored() { - new_test_ext(1).execute_with(|| { - Executive::initialize_block(&Header::new_from_number(1)); - Executive::finalize_block(); - // NOTE: might need updates over time if new weights are introduced. - // For now it only accounts for the base block execution weight and - // the `on_initialize` weight defined in the custom test module. - assert_eq!( - >::block_weight().total(), - Weight::from_parts(175 + 175 + 10, 0) - ); - }) - } - - #[test] - fn runtime_upgraded_should_work() { - new_test_ext(1).execute_with(|| { - RuntimeVersionTestValues::mutate(|v| *v = Default::default()); - // It should be added at genesis - assert!(LastRuntimeUpgrade::::exists()); - assert!(!Executive::runtime_upgraded()); - - RuntimeVersionTestValues::mutate(|v| { - *v = sp_version::RuntimeVersion { spec_version: 1, ..Default::default() } - }); - assert!(Executive::runtime_upgraded()); - - RuntimeVersionTestValues::mutate(|v| { - *v = sp_version::RuntimeVersion { - spec_version: 1, - spec_name: "test".into(), - ..Default::default() - } - }); - assert!(Executive::runtime_upgraded()); - - RuntimeVersionTestValues::mutate(|v| { - *v = sp_version::RuntimeVersion { - spec_version: 0, - impl_version: 2, - ..Default::default() - } - }); - assert!(!Executive::runtime_upgraded()); - - LastRuntimeUpgrade::::take(); - assert!(Executive::runtime_upgraded()); - }) - } - - #[test] - fn last_runtime_upgrade_was_upgraded_works() { - let test_data = vec![ - (0, "", 1, "", true), - (1, "", 1, "", false), - (1, "", 1, "test", true), - (1, "", 0, "", false), - (1, "", 0, "test", true), - ]; - - for (spec_version, spec_name, c_spec_version, c_spec_name, result) in test_data { - let current = sp_version::RuntimeVersion { - spec_version: c_spec_version, - spec_name: c_spec_name.into(), - ..Default::default() - }; - - let last = LastRuntimeUpgradeInfo { - spec_version: spec_version.into(), - spec_name: spec_name.into(), - }; - - assert_eq!(result, last.was_upgraded(¤t)); - } - } - - #[test] - fn custom_runtime_upgrade_is_called_before_modules() { - new_test_ext(1).execute_with(|| { - // Make sure `on_runtime_upgrade` is called. - RuntimeVersionTestValues::mutate(|v| { - *v = sp_version::RuntimeVersion { spec_version: 1, ..Default::default() } - }); - - Executive::initialize_block(&Header::new( - 1, - H256::default(), - H256::default(), - [69u8; 32].into(), - Digest::default(), - )); - - assert_eq!(&sp_io::storage::get(TEST_KEY).unwrap()[..], *b"module"); - assert_eq!(sp_io::storage::get(CUSTOM_ON_RUNTIME_KEY).unwrap(), true.encode()); - assert_eq!( - Some(RuntimeVersionTestValues::get().into()), - LastRuntimeUpgrade::::get(), - ) - }); - } - - #[test] - fn event_from_runtime_upgrade_is_included() { - new_test_ext(1).execute_with(|| { - // Make sure `on_runtime_upgrade` is called. - RuntimeVersionTestValues::mutate(|v| { - *v = sp_version::RuntimeVersion { spec_version: 1, ..Default::default() } - }); - - // set block number to non zero so events are not excluded - System::set_block_number(1); - - Executive::initialize_block(&Header::new( - 2, - H256::default(), - H256::default(), - [69u8; 32].into(), - Digest::default(), - )); - - System::assert_last_event(frame_system::Event::::CodeUpdated.into()); - }); - } - - /// Regression test that ensures that the custom on runtime upgrade is called when executive is - /// used through the `ExecuteBlock` trait. - #[test] - fn custom_runtime_upgrade_is_called_when_using_execute_block_trait() { - let xt = TestXt::new( - RuntimeCall::Balances(BalancesCall::transfer_allow_death { dest: 33, value: 0 }), - sign_extra(1, 0, 0), - ); - - let header = new_test_ext(1).execute_with(|| { - // Make sure `on_runtime_upgrade` is called. - RuntimeVersionTestValues::mutate(|v| { - *v = sp_version::RuntimeVersion { spec_version: 1, ..Default::default() } - }); - - // Let's build some fake block. - Executive::initialize_block(&Header::new( - 1, - H256::default(), - H256::default(), - [69u8; 32].into(), - Digest::default(), - )); - - Executive::apply_extrinsic(xt.clone()).unwrap().unwrap(); - - Executive::finalize_block() - }); - - // Reset to get the correct new genesis below. - RuntimeVersionTestValues::mutate(|v| { - *v = sp_version::RuntimeVersion { spec_version: 0, ..Default::default() } - }); - - new_test_ext(1).execute_with(|| { - // Make sure `on_runtime_upgrade` is called. - RuntimeVersionTestValues::mutate(|v| { - *v = sp_version::RuntimeVersion { spec_version: 1, ..Default::default() } - }); - - >>::execute_block(Block::new(header, vec![xt])); - - assert_eq!(&sp_io::storage::get(TEST_KEY).unwrap()[..], *b"module"); - assert_eq!(sp_io::storage::get(CUSTOM_ON_RUNTIME_KEY).unwrap(), true.encode()); - }); - } - - #[test] - fn all_weights_are_recorded_correctly() { - // Reset to get the correct new genesis below. - RuntimeVersionTestValues::take(); - - new_test_ext(1).execute_with(|| { - // Make sure `on_runtime_upgrade` is called for maximum complexity - RuntimeVersionTestValues::mutate(|v| { - *v = sp_version::RuntimeVersion { spec_version: 1, ..Default::default() } - }); - - let block_number = 1; - - Executive::initialize_block(&Header::new( - block_number, - H256::default(), - H256::default(), - [69u8; 32].into(), - Digest::default(), - )); - - // Reset the last runtime upgrade info, to make the second call to `on_runtime_upgrade` - // succeed. - LastRuntimeUpgrade::::take(); - - // All weights that show up in the `initialize_block_impl` - let custom_runtime_upgrade_weight = CustomOnRuntimeUpgrade::on_runtime_upgrade(); - let runtime_upgrade_weight = - ::on_runtime_upgrade(); - let on_initialize_weight = - >::on_initialize(block_number); - let base_block_weight = - ::BlockWeights::get().base_block; - - // Weights are recorded correctly - assert_eq!( - frame_system::Pallet::::block_weight().total(), - custom_runtime_upgrade_weight + - runtime_upgrade_weight + - on_initialize_weight + base_block_weight, - ); - }); - } - - #[test] - fn offchain_worker_works_as_expected() { - new_test_ext(1).execute_with(|| { - let parent_hash = sp_core::H256::from([69u8; 32]); - let mut digest = Digest::default(); - digest.push(DigestItem::Seal([1, 2, 3, 4], vec![5, 6, 7, 8])); - - let header = - Header::new(1, H256::default(), H256::default(), parent_hash, digest.clone()); - - Executive::offchain_worker(&header); - - assert_eq!(digest, System::digest()); - assert_eq!(parent_hash, System::block_hash(0)); - assert_eq!(header.hash(), System::block_hash(1)); - }); - } - - #[test] - fn calculating_storage_root_twice_works() { - let call = RuntimeCall::Custom(custom::Call::calculate_storage_root {}); - let xt = TestXt::new(call, sign_extra(1, 0, 0)); - - let header = new_test_ext(1).execute_with(|| { - // Let's build some fake block. - Executive::initialize_block(&Header::new( - 1, - H256::default(), - H256::default(), - [69u8; 32].into(), - Digest::default(), - )); - - Executive::apply_extrinsic(xt.clone()).unwrap().unwrap(); - - Executive::finalize_block() - }); - - new_test_ext(1).execute_with(|| { - Executive::execute_block(Block::new(header, vec![xt])); - }); - } - - #[test] - #[should_panic(expected = "Invalid inherent position for extrinsic at index 1")] - fn invalid_inherent_position_fail() { - let xt1 = TestXt::new( - RuntimeCall::Balances(BalancesCall::transfer_allow_death { dest: 33, value: 0 }), - sign_extra(1, 0, 0), - ); - let xt2 = TestXt::new(RuntimeCall::Custom(custom::Call::inherent_call {}), None); - - let header = new_test_ext(1).execute_with(|| { - // Let's build some fake block. - Executive::initialize_block(&Header::new( - 1, - H256::default(), - H256::default(), - [69u8; 32].into(), - Digest::default(), - )); - - Executive::apply_extrinsic(xt1.clone()).unwrap().unwrap(); - Executive::apply_extrinsic(xt2.clone()).unwrap().unwrap(); - - Executive::finalize_block() - }); - - new_test_ext(1).execute_with(|| { - Executive::execute_block(Block::new(header, vec![xt1, xt2])); - }); - } - - #[test] - fn valid_inherents_position_works() { - let xt1 = TestXt::new(RuntimeCall::Custom(custom::Call::inherent_call {}), None); - let xt2 = TestXt::new(call_transfer(33, 0), sign_extra(1, 0, 0)); - - let header = new_test_ext(1).execute_with(|| { - // Let's build some fake block. - Executive::initialize_block(&Header::new( - 1, - H256::default(), - H256::default(), - [69u8; 32].into(), - Digest::default(), - )); - - Executive::apply_extrinsic(xt1.clone()).unwrap().unwrap(); - Executive::apply_extrinsic(xt2.clone()).unwrap().unwrap(); - - Executive::finalize_block() - }); - - new_test_ext(1).execute_with(|| { - Executive::execute_block(Block::new(header, vec![xt1, xt2])); - }); - } - - #[test] - #[should_panic(expected = "A call was labelled as mandatory, but resulted in an Error.")] - fn invalid_inherents_fail_block_execution() { - let xt1 = - TestXt::new(RuntimeCall::Custom(custom::Call::inherent_call {}), sign_extra(1, 0, 0)); - - new_test_ext(1).execute_with(|| { - Executive::execute_block(Block::new( - Header::new( - 1, - H256::default(), - H256::default(), - [69u8; 32].into(), - Digest::default(), - ), - vec![xt1], - )); - }); - } - - // Inherents are created by the runtime and don't need to be validated. - #[test] - fn inherents_fail_validate_block() { - let xt1 = TestXt::new(RuntimeCall::Custom(custom::Call::inherent_call {}), None); - - new_test_ext(1).execute_with(|| { - assert_eq!( - Executive::validate_transaction(TransactionSource::External, xt1, H256::random()) - .unwrap_err(), - InvalidTransaction::MandatoryValidation.into() - ); - }) - } -} diff --git a/substrate/frame/executive/src/tests.rs b/substrate/frame/executive/src/tests.rs new file mode 100644 index 0000000000000000000000000000000000000000..e3721f7b6dcbac24be073515d78fbf0f1d2658b8 --- /dev/null +++ b/substrate/frame/executive/src/tests.rs @@ -0,0 +1,1389 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Test the `frame-executive` crate. + +use super::*; + +use pallet_transaction_payment::FungibleAdapter; +use sp_core::H256; +use sp_runtime::{ + generic::{DigestItem, Era}, + testing::{Block, Digest, Header}, + traits::{Block as BlockT, Header as HeaderT}, + transaction_validity::{ + InvalidTransaction, TransactionValidityError, UnknownTransaction, ValidTransaction, + }, + BuildStorage, DispatchError, +}; + +use frame_support::{ + assert_err, assert_ok, derive_impl, + migrations::MultiStepMigrator, + pallet_prelude::*, + parameter_types, + traits::{fungible, ConstU8, Currency, IsInherent}, + weights::{ConstantMultiplier, IdentityFee, RuntimeDbWeight, Weight, WeightMeter, WeightToFee}, +}; +use frame_system::{pallet_prelude::*, ChainContext, LastRuntimeUpgrade, LastRuntimeUpgradeInfo}; +use pallet_balances::Call as BalancesCall; + +const TEST_KEY: &[u8] = b":test:key:"; + +#[frame_support::pallet(dev_mode)] +mod custom { + use super::*; + + #[pallet::pallet] + pub struct Pallet(_); + + #[pallet::config] + pub trait Config: frame_system::Config {} + + #[pallet::hooks] + impl Hooks> for Pallet { + // module hooks. + // one with block number arg and one without + fn on_initialize(_: BlockNumberFor) -> Weight { + Weight::from_parts(175, 0) + } + + fn on_idle(_: BlockNumberFor, _: Weight) -> Weight { + Weight::from_parts(175, 0) + } + + fn on_poll(_: BlockNumberFor, _: &mut WeightMeter) {} + + fn on_finalize(_: BlockNumberFor) {} + + fn on_runtime_upgrade() -> Weight { + sp_io::storage::set(super::TEST_KEY, "module".as_bytes()); + Weight::from_parts(200, 0) + } + + fn offchain_worker(n: BlockNumberFor) { + assert_eq!(BlockNumberFor::::from(1u32), n); + } + } + + #[pallet::call] + impl Pallet { + pub fn some_function(origin: OriginFor) -> DispatchResult { + // NOTE: does not make any difference. + frame_system::ensure_signed(origin)?; + Ok(()) + } + + #[pallet::weight((200, DispatchClass::Operational))] + pub fn some_root_operation(origin: OriginFor) -> DispatchResult { + frame_system::ensure_root(origin)?; + Ok(()) + } + + pub fn some_unsigned_message(origin: OriginFor) -> DispatchResult { + frame_system::ensure_none(origin)?; + Ok(()) + } + + pub fn allowed_unsigned(origin: OriginFor) -> DispatchResult { + frame_system::ensure_root(origin)?; + Ok(()) + } + + pub fn unallowed_unsigned(origin: OriginFor) -> DispatchResult { + frame_system::ensure_root(origin)?; + Ok(()) + } + + #[pallet::weight((0, DispatchClass::Mandatory))] + pub fn inherent(origin: OriginFor) -> DispatchResult { + frame_system::ensure_none(origin)?; + Ok(()) + } + + pub fn calculate_storage_root(_origin: OriginFor) -> DispatchResult { + let root = sp_io::storage::root(sp_runtime::StateVersion::V1); + sp_io::storage::set("storage_root".as_bytes(), &root); + Ok(()) + } + } + + #[pallet::inherent] + impl ProvideInherent for Pallet { + type Call = Call; + + type Error = sp_inherents::MakeFatalError<()>; + + const INHERENT_IDENTIFIER: [u8; 8] = *b"test1234"; + + fn create_inherent(_data: &InherentData) -> Option { + None + } + + fn is_inherent(call: &Self::Call) -> bool { + *call == Call::::inherent {} + } + } + + #[pallet::validate_unsigned] + impl ValidateUnsigned for Pallet { + type Call = Call; + + // Inherent call is accepted for being dispatched + fn pre_dispatch(call: &Self::Call) -> Result<(), TransactionValidityError> { + match call { + Call::allowed_unsigned { .. } => Ok(()), + Call::inherent { .. } => Ok(()), + _ => Err(UnknownTransaction::NoUnsignedValidator.into()), + } + } + + // Inherent call is not validated as unsigned + fn validate_unsigned(_source: TransactionSource, call: &Self::Call) -> TransactionValidity { + match call { + Call::allowed_unsigned { .. } => Ok(Default::default()), + _ => UnknownTransaction::NoUnsignedValidator.into(), + } + } + } +} + +#[frame_support::pallet(dev_mode)] +mod custom2 { + use super::*; + + #[pallet::pallet] + pub struct Pallet(_); + + #[pallet::config] + pub trait Config: frame_system::Config {} + + #[pallet::hooks] + impl Hooks> for Pallet { + // module hooks. + // one with block number arg and one without + fn on_initialize(_: BlockNumberFor) -> Weight { + assert!( + !MockedSystemCallbacks::pre_inherent_called(), + "Pre inherent hook goes after on_initialize" + ); + + Weight::from_parts(0, 0) + } + + fn on_idle(_: BlockNumberFor, _: Weight) -> Weight { + assert!( + MockedSystemCallbacks::post_transactions_called(), + "Post transactions hook goes before after on_idle" + ); + Weight::from_parts(0, 0) + } + + fn on_finalize(_: BlockNumberFor) { + assert!( + MockedSystemCallbacks::post_transactions_called(), + "Post transactions hook goes before after on_finalize" + ); + } + + fn on_runtime_upgrade() -> Weight { + sp_io::storage::set(super::TEST_KEY, "module".as_bytes()); + Weight::from_parts(0, 0) + } + } + + #[pallet::call] + impl Pallet { + pub fn allowed_unsigned(origin: OriginFor) -> DispatchResult { + frame_system::ensure_root(origin)?; + Ok(()) + } + + pub fn some_call(_: OriginFor) -> DispatchResult { + assert!(MockedSystemCallbacks::post_inherent_called()); + assert!(!MockedSystemCallbacks::post_transactions_called()); + assert!(System::inherents_applied()); + + Ok(()) + } + + #[pallet::weight({0})] + pub fn optional_inherent(origin: OriginFor) -> DispatchResult { + frame_system::ensure_none(origin)?; + + assert!(MockedSystemCallbacks::pre_inherent_called()); + assert!(!MockedSystemCallbacks::post_inherent_called(), "Should not already be called"); + assert!(!System::inherents_applied()); + + Ok(()) + } + + #[pallet::weight((0, DispatchClass::Mandatory))] + pub fn inherent(origin: OriginFor) -> DispatchResult { + frame_system::ensure_none(origin)?; + + assert!(MockedSystemCallbacks::pre_inherent_called()); + assert!(!MockedSystemCallbacks::post_inherent_called(), "Should not already be called"); + assert!(!System::inherents_applied()); + + Ok(()) + } + } + + #[pallet::inherent] + impl ProvideInherent for Pallet { + type Call = Call; + + type Error = sp_inherents::MakeFatalError<()>; + + const INHERENT_IDENTIFIER: [u8; 8] = *b"test1235"; + + fn create_inherent(_data: &InherentData) -> Option { + None + } + + fn is_inherent(call: &Self::Call) -> bool { + matches!(call, Call::::inherent {} | Call::::optional_inherent {}) + } + } + + #[pallet::validate_unsigned] + impl ValidateUnsigned for Pallet { + type Call = Call; + + // Inherent call is accepted for being dispatched + fn pre_dispatch(call: &Self::Call) -> Result<(), TransactionValidityError> { + match call { + Call::allowed_unsigned { .. } | + Call::optional_inherent { .. } | + Call::inherent { .. } => Ok(()), + _ => Err(UnknownTransaction::NoUnsignedValidator.into()), + } + } + + // Inherent call is not validated as unsigned + fn validate_unsigned(_source: TransactionSource, call: &Self::Call) -> TransactionValidity { + match call { + Call::allowed_unsigned { .. } => Ok(Default::default()), + _ => UnknownTransaction::NoUnsignedValidator.into(), + } + } + } +} + +frame_support::construct_runtime!( + pub struct Runtime + { + System: frame_system::{Pallet, Call, Config, Storage, Event}, + Balances: pallet_balances::{Pallet, Call, Storage, Config, Event}, + TransactionPayment: pallet_transaction_payment::{Pallet, Storage, Event}, + Custom: custom::{Pallet, Call, ValidateUnsigned, Inherent}, + Custom2: custom2::{Pallet, Call, ValidateUnsigned, Inherent}, + } +); + +parameter_types! { + pub BlockWeights: frame_system::limits::BlockWeights = + frame_system::limits::BlockWeights::builder() + .base_block(Weight::from_parts(10, 0)) + .for_class(DispatchClass::all(), |weights| weights.base_extrinsic = Weight::from_parts(5, 0)) + .for_class(DispatchClass::non_mandatory(), |weights| weights.max_total = Weight::from_parts(1024, u64::MAX).into()) + .build_or_panic(); + pub const DbWeight: RuntimeDbWeight = RuntimeDbWeight { + read: 10, + write: 100, + }; +} + +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] +impl frame_system::Config for Runtime { + type BlockWeights = BlockWeights; + type RuntimeOrigin = RuntimeOrigin; + type Nonce = u64; + type RuntimeCall = RuntimeCall; + type Block = TestBlock; + type RuntimeEvent = RuntimeEvent; + type Version = RuntimeVersion; + type AccountData = pallet_balances::AccountData; + type PreInherents = MockedSystemCallbacks; + type PostInherents = MockedSystemCallbacks; + type PostTransactions = MockedSystemCallbacks; + type MultiBlockMigrator = MockedModeGetter; +} + +type Balance = u64; + +#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] +impl pallet_balances::Config for Runtime { + type Balance = Balance; + type AccountStore = System; +} + +parameter_types! { + pub const TransactionByteFee: Balance = 0; +} +impl pallet_transaction_payment::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type OnChargeTransaction = FungibleAdapter; + type OperationalFeeMultiplier = ConstU8<5>; + type WeightToFee = IdentityFee; + type LengthToFee = ConstantMultiplier; + type FeeMultiplierUpdate = (); +} + +impl custom::Config for Runtime {} +impl custom2::Config for Runtime {} + +pub struct RuntimeVersion; +impl frame_support::traits::Get for RuntimeVersion { + fn get() -> sp_version::RuntimeVersion { + RuntimeVersionTestValues::get().clone() + } +} + +parameter_types! { + pub static RuntimeVersionTestValues: sp_version::RuntimeVersion = + Default::default(); +} + +type SignedExtra = ( + frame_system::CheckEra, + frame_system::CheckNonce, + frame_system::CheckWeight, + pallet_transaction_payment::ChargeTransactionPayment, +); +type TestXt = sp_runtime::testing::TestXt; +type TestBlock = Block; + +// Will contain `true` when the custom runtime logic was called. +const CUSTOM_ON_RUNTIME_KEY: &[u8] = b":custom:on_runtime"; + +struct CustomOnRuntimeUpgrade; +impl OnRuntimeUpgrade for CustomOnRuntimeUpgrade { + fn on_runtime_upgrade() -> Weight { + sp_io::storage::set(TEST_KEY, "custom_upgrade".as_bytes()); + sp_io::storage::set(CUSTOM_ON_RUNTIME_KEY, &true.encode()); + System::deposit_event(frame_system::Event::CodeUpdated); + + assert_eq!(0, System::last_runtime_upgrade_spec_version()); + + Weight::from_parts(100, 0) + } +} + +type Executive = super::Executive< + Runtime, + Block, + ChainContext, + Runtime, + AllPalletsWithSystem, + CustomOnRuntimeUpgrade, +>; + +parameter_types! { + pub static SystemCallbacksCalled: u32 = 0; +} + +pub struct MockedSystemCallbacks; +impl PreInherents for MockedSystemCallbacks { + fn pre_inherents() { + assert_eq!(SystemCallbacksCalled::get(), 0); + SystemCallbacksCalled::set(1); + // Change the storage to modify the root hash: + frame_support::storage::unhashed::put(b":pre_inherent", b"0"); + } +} + +impl PostInherents for MockedSystemCallbacks { + fn post_inherents() { + assert_eq!(SystemCallbacksCalled::get(), 1); + SystemCallbacksCalled::set(2); + // Change the storage to modify the root hash: + frame_support::storage::unhashed::put(b":post_inherent", b"0"); + } +} + +impl PostTransactions for MockedSystemCallbacks { + fn post_transactions() { + assert_eq!(SystemCallbacksCalled::get(), 2); + SystemCallbacksCalled::set(3); + // Change the storage to modify the root hash: + frame_support::storage::unhashed::put(b":post_transaction", b"0"); + } +} + +impl MockedSystemCallbacks { + fn pre_inherent_called() -> bool { + SystemCallbacksCalled::get() >= 1 + } + + fn post_inherent_called() -> bool { + SystemCallbacksCalled::get() >= 2 + } + + fn post_transactions_called() -> bool { + SystemCallbacksCalled::get() >= 3 + } + + fn reset() { + SystemCallbacksCalled::set(0); + frame_support::storage::unhashed::kill(b":pre_inherent"); + frame_support::storage::unhashed::kill(b":post_inherent"); + frame_support::storage::unhashed::kill(b":post_transaction"); + } +} + +parameter_types! { + pub static MbmActive: bool = false; +} + +pub struct MockedModeGetter; +impl MultiStepMigrator for MockedModeGetter { + fn ongoing() -> bool { + MbmActive::get() + } + + fn step() -> Weight { + Weight::zero() + } +} + +fn extra(nonce: u64, fee: Balance) -> SignedExtra { + ( + frame_system::CheckEra::from(Era::Immortal), + frame_system::CheckNonce::from(nonce), + frame_system::CheckWeight::new(), + pallet_transaction_payment::ChargeTransactionPayment::from(fee), + ) +} + +fn sign_extra(who: u64, nonce: u64, fee: Balance) -> Option<(u64, SignedExtra)> { + Some((who, extra(nonce, fee))) +} + +fn call_transfer(dest: u64, value: u64) -> RuntimeCall { + RuntimeCall::Balances(BalancesCall::transfer_allow_death { dest, value }) +} + +#[test] +fn balance_transfer_dispatch_works() { + let mut t = frame_system::GenesisConfig::::default().build_storage().unwrap(); + pallet_balances::GenesisConfig:: { balances: vec![(1, 211)] } + .assimilate_storage(&mut t) + .unwrap(); + let xt = TestXt::new(call_transfer(2, 69), sign_extra(1, 0, 0)); + let weight = xt.get_dispatch_info().weight + + ::BlockWeights::get() + .get(DispatchClass::Normal) + .base_extrinsic; + let fee: Balance = + ::WeightToFee::weight_to_fee(&weight); + let mut t = sp_io::TestExternalities::new(t); + t.execute_with(|| { + Executive::initialize_block(&Header::new_from_number(1)); + let r = Executive::apply_extrinsic(xt); + assert!(r.is_ok()); + assert_eq!(>::total_balance(&1), 142 - fee); + assert_eq!(>::total_balance(&2), 69); + }); +} + +fn new_test_ext(balance_factor: Balance) -> sp_io::TestExternalities { + let mut t = frame_system::GenesisConfig::::default().build_storage().unwrap(); + pallet_balances::GenesisConfig:: { balances: vec![(1, 111 * balance_factor)] } + .assimilate_storage(&mut t) + .unwrap(); + let mut ext: sp_io::TestExternalities = t.into(); + ext.execute_with(|| { + SystemCallbacksCalled::set(0); + }); + ext +} + +fn new_test_ext_v0(balance_factor: Balance) -> sp_io::TestExternalities { + let mut t = frame_system::GenesisConfig::::default().build_storage().unwrap(); + pallet_balances::GenesisConfig:: { balances: vec![(1, 111 * balance_factor)] } + .assimilate_storage(&mut t) + .unwrap(); + (t, sp_runtime::StateVersion::V0).into() +} + +#[test] +fn block_import_works() { + block_import_works_inner( + new_test_ext_v0(1), + array_bytes::hex_n_into_unchecked( + "4826d3bdf87dbbc883d2ab274cbe272f58ed94a904619b59953e48294d1142d2", + ), + ); + block_import_works_inner( + new_test_ext(1), + array_bytes::hex_n_into_unchecked( + "d6b465f5a50c9f8d5a6edc0f01d285a6b19030f097d3aaf1649b7be81649f118", + ), + ); +} +fn block_import_works_inner(mut ext: sp_io::TestExternalities, state_root: H256) { + ext.execute_with(|| { + Executive::execute_block(Block { + header: Header { + parent_hash: [69u8; 32].into(), + number: 1, + state_root, + extrinsics_root: array_bytes::hex_n_into_unchecked( + "03170a2e7597b7b7e3d84c05391d139a62b157e78786d8c082f29dcf4c111314", + ), + digest: Digest { logs: vec![] }, + }, + extrinsics: vec![], + }); + }); +} + +#[test] +#[should_panic] +fn block_import_of_bad_state_root_fails() { + new_test_ext(1).execute_with(|| { + Executive::execute_block(Block { + header: Header { + parent_hash: [69u8; 32].into(), + number: 1, + state_root: [0u8; 32].into(), + extrinsics_root: array_bytes::hex_n_into_unchecked( + "03170a2e7597b7b7e3d84c05391d139a62b157e78786d8c082f29dcf4c111314", + ), + digest: Digest { logs: vec![] }, + }, + extrinsics: vec![], + }); + }); +} + +#[test] +#[should_panic] +fn block_import_of_bad_extrinsic_root_fails() { + new_test_ext(1).execute_with(|| { + Executive::execute_block(Block { + header: Header { + parent_hash: [69u8; 32].into(), + number: 1, + state_root: array_bytes::hex_n_into_unchecked( + "75e7d8f360d375bbe91bcf8019c01ab6362448b4a89e3b329717eb9d910340e5", + ), + extrinsics_root: [0u8; 32].into(), + digest: Digest { logs: vec![] }, + }, + extrinsics: vec![], + }); + }); +} + +#[test] +fn bad_extrinsic_not_inserted() { + let mut t = new_test_ext(1); + // bad nonce check! + let xt = TestXt::new(call_transfer(33, 69), sign_extra(1, 30, 0)); + t.execute_with(|| { + Executive::initialize_block(&Header::new_from_number(1)); + assert_err!( + Executive::apply_extrinsic(xt), + TransactionValidityError::Invalid(InvalidTransaction::Future) + ); + assert_eq!(>::extrinsic_index(), Some(0)); + }); +} + +#[test] +fn block_weight_limit_enforced() { + let mut t = new_test_ext(10000); + // given: TestXt uses the encoded len as fixed Len: + let xt = TestXt::new( + RuntimeCall::Balances(BalancesCall::transfer_allow_death { dest: 33, value: 0 }), + sign_extra(1, 0, 0), + ); + let encoded = xt.encode(); + let encoded_len = encoded.len() as u64; + // on_initialize weight + base block execution weight + let block_weights = ::BlockWeights::get(); + let base_block_weight = Weight::from_parts(175, 0) + block_weights.base_block; + let limit = block_weights.get(DispatchClass::Normal).max_total.unwrap() - base_block_weight; + let num_to_exhaust_block = limit.ref_time() / (encoded_len + 5); + t.execute_with(|| { + Executive::initialize_block(&Header::new_from_number(1)); + // Base block execution weight + `on_initialize` weight from the custom module. + assert_eq!(>::block_weight().total(), base_block_weight); + + for nonce in 0..=num_to_exhaust_block { + let xt = TestXt::new( + RuntimeCall::Balances(BalancesCall::transfer_allow_death { dest: 33, value: 0 }), + sign_extra(1, nonce.into(), 0), + ); + let res = Executive::apply_extrinsic(xt); + if nonce != num_to_exhaust_block { + assert!(res.is_ok()); + assert_eq!( + >::block_weight().total(), + //--------------------- on_initialize + block_execution + extrinsic_base weight + Weight::from_parts((encoded_len + 5) * (nonce + 1), 0) + base_block_weight, + ); + assert_eq!( + >::extrinsic_index(), + Some(nonce as u32 + 1) + ); + } else { + assert_eq!(res, Err(InvalidTransaction::ExhaustsResources.into())); + } + } + }); +} + +#[test] +fn block_weight_and_size_is_stored_per_tx() { + let xt = TestXt::new( + RuntimeCall::Balances(BalancesCall::transfer_allow_death { dest: 33, value: 0 }), + sign_extra(1, 0, 0), + ); + let x1 = TestXt::new( + RuntimeCall::Balances(BalancesCall::transfer_allow_death { dest: 33, value: 0 }), + sign_extra(1, 1, 0), + ); + let x2 = TestXt::new( + RuntimeCall::Balances(BalancesCall::transfer_allow_death { dest: 33, value: 0 }), + sign_extra(1, 2, 0), + ); + let len = xt.clone().encode().len() as u32; + let mut t = new_test_ext(1); + t.execute_with(|| { + // Block execution weight + on_initialize weight from custom module + let base_block_weight = Weight::from_parts(175, 0) + + ::BlockWeights::get().base_block; + + Executive::initialize_block(&Header::new_from_number(1)); + + assert_eq!(>::block_weight().total(), base_block_weight); + assert_eq!(>::all_extrinsics_len(), 0); + + assert!(Executive::apply_extrinsic(xt.clone()).unwrap().is_ok()); + assert!(Executive::apply_extrinsic(x1.clone()).unwrap().is_ok()); + assert!(Executive::apply_extrinsic(x2.clone()).unwrap().is_ok()); + + // default weight for `TestXt` == encoded length. + let extrinsic_weight = Weight::from_parts(len as u64, 0) + + ::BlockWeights::get() + .get(DispatchClass::Normal) + .base_extrinsic; + assert_eq!( + >::block_weight().total(), + base_block_weight + 3u64 * extrinsic_weight, + ); + assert_eq!(>::all_extrinsics_len(), 3 * len); + + let _ = >::finalize(); + // All extrinsics length cleaned on `System::finalize` + assert_eq!(>::all_extrinsics_len(), 0); + + // Reset to a new block. + SystemCallbacksCalled::take(); + Executive::initialize_block(&Header::new_from_number(2)); + + // Block weight cleaned up on `System::initialize` + assert_eq!(>::block_weight().total(), base_block_weight); + }); +} + +#[test] +fn validate_unsigned() { + let valid = TestXt::new(RuntimeCall::Custom(custom::Call::allowed_unsigned {}), None); + let invalid = TestXt::new(RuntimeCall::Custom(custom::Call::unallowed_unsigned {}), None); + let mut t = new_test_ext(1); + + t.execute_with(|| { + assert_eq!( + Executive::validate_transaction( + TransactionSource::InBlock, + valid.clone(), + Default::default(), + ), + Ok(ValidTransaction::default()), + ); + assert_eq!( + Executive::validate_transaction( + TransactionSource::InBlock, + invalid.clone(), + Default::default(), + ), + Err(TransactionValidityError::Unknown(UnknownTransaction::NoUnsignedValidator)), + ); + // Need to initialize the block before applying extrinsics for the `MockedSystemCallbacks` + // check. + Executive::initialize_block(&Header::new_from_number(1)); + assert_eq!(Executive::apply_extrinsic(valid), Ok(Err(DispatchError::BadOrigin))); + assert_eq!( + Executive::apply_extrinsic(invalid), + Err(TransactionValidityError::Unknown(UnknownTransaction::NoUnsignedValidator)) + ); + }); +} + +#[test] +fn can_not_pay_for_tx_fee_on_full_lock() { + let mut t = new_test_ext(1); + t.execute_with(|| { + as fungible::MutateFreeze>::set_freeze(&(), &1, 110) + .unwrap(); + let xt = TestXt::new( + RuntimeCall::System(frame_system::Call::remark { remark: vec![1u8] }), + sign_extra(1, 0, 0), + ); + Executive::initialize_block(&Header::new_from_number(1)); + + assert_eq!(Executive::apply_extrinsic(xt), Err(InvalidTransaction::Payment.into()),); + assert_eq!(>::total_balance(&1), 111); + }); +} + +#[test] +fn block_hooks_weight_is_stored() { + new_test_ext(1).execute_with(|| { + Executive::initialize_block(&Header::new_from_number(1)); + Executive::finalize_block(); + // NOTE: might need updates over time if new weights are introduced. + // For now it only accounts for the base block execution weight and + // the `on_initialize` weight defined in the custom test module. + assert_eq!( + >::block_weight().total(), + Weight::from_parts(175 + 175 + 10, 0) + ); + }) +} + +#[test] +fn runtime_upgraded_should_work() { + new_test_ext(1).execute_with(|| { + RuntimeVersionTestValues::mutate(|v| *v = Default::default()); + // It should be added at genesis + assert!(LastRuntimeUpgrade::::exists()); + assert!(!Executive::runtime_upgraded()); + + RuntimeVersionTestValues::mutate(|v| { + *v = sp_version::RuntimeVersion { spec_version: 1, ..Default::default() } + }); + assert!(Executive::runtime_upgraded()); + + RuntimeVersionTestValues::mutate(|v| { + *v = sp_version::RuntimeVersion { + spec_version: 1, + spec_name: "test".into(), + ..Default::default() + } + }); + assert!(Executive::runtime_upgraded()); + + RuntimeVersionTestValues::mutate(|v| { + *v = sp_version::RuntimeVersion { + spec_version: 0, + impl_version: 2, + ..Default::default() + } + }); + assert!(!Executive::runtime_upgraded()); + + LastRuntimeUpgrade::::take(); + assert!(Executive::runtime_upgraded()); + }) +} + +#[test] +fn last_runtime_upgrade_was_upgraded_works() { + let test_data = vec![ + (0, "", 1, "", true), + (1, "", 1, "", false), + (1, "", 1, "test", true), + (1, "", 0, "", false), + (1, "", 0, "test", true), + ]; + + for (spec_version, spec_name, c_spec_version, c_spec_name, result) in test_data { + let current = sp_version::RuntimeVersion { + spec_version: c_spec_version, + spec_name: c_spec_name.into(), + ..Default::default() + }; + + let last = LastRuntimeUpgradeInfo { + spec_version: spec_version.into(), + spec_name: spec_name.into(), + }; + + assert_eq!(result, last.was_upgraded(¤t)); + } +} + +#[test] +fn custom_runtime_upgrade_is_called_before_modules() { + new_test_ext(1).execute_with(|| { + // Make sure `on_runtime_upgrade` is called. + RuntimeVersionTestValues::mutate(|v| { + *v = sp_version::RuntimeVersion { spec_version: 1, ..Default::default() } + }); + + Executive::initialize_block(&Header::new_from_number(1)); + + assert_eq!(&sp_io::storage::get(TEST_KEY).unwrap()[..], *b"module"); + assert_eq!(sp_io::storage::get(CUSTOM_ON_RUNTIME_KEY).unwrap(), true.encode()); + assert_eq!( + Some(RuntimeVersionTestValues::get().into()), + LastRuntimeUpgrade::::get(), + ) + }); +} + +#[test] +fn event_from_runtime_upgrade_is_included() { + new_test_ext(1).execute_with(|| { + // Make sure `on_runtime_upgrade` is called. + RuntimeVersionTestValues::mutate(|v| { + *v = sp_version::RuntimeVersion { spec_version: 1, ..Default::default() } + }); + + // set block number to non zero so events are not excluded + System::set_block_number(1); + + Executive::initialize_block(&Header::new_from_number(2)); + System::assert_last_event(frame_system::Event::::CodeUpdated.into()); + }); +} + +/// Regression test that ensures that the custom on runtime upgrade is called when executive is +/// used through the `ExecuteBlock` trait. +#[test] +fn custom_runtime_upgrade_is_called_when_using_execute_block_trait() { + let xt = TestXt::new( + RuntimeCall::Balances(BalancesCall::transfer_allow_death { dest: 33, value: 0 }), + sign_extra(1, 0, 0), + ); + + let header = new_test_ext(1).execute_with(|| { + // Make sure `on_runtime_upgrade` is called. + RuntimeVersionTestValues::mutate(|v| { + *v = sp_version::RuntimeVersion { spec_version: 1, ..Default::default() } + }); + + // Let's build some fake block. + Executive::initialize_block(&Header::new_from_number(1)); + + Executive::apply_extrinsic(xt.clone()).unwrap().unwrap(); + + Executive::finalize_block() + }); + + // Reset to get the correct new genesis below. + RuntimeVersionTestValues::mutate(|v| { + *v = sp_version::RuntimeVersion { spec_version: 0, ..Default::default() } + }); + + new_test_ext(1).execute_with(|| { + // Make sure `on_runtime_upgrade` is called. + RuntimeVersionTestValues::mutate(|v| { + *v = sp_version::RuntimeVersion { spec_version: 1, ..Default::default() } + }); + + >>::execute_block(Block::new(header, vec![xt])); + + assert_eq!(&sp_io::storage::get(TEST_KEY).unwrap()[..], *b"module"); + assert_eq!(sp_io::storage::get(CUSTOM_ON_RUNTIME_KEY).unwrap(), true.encode()); + }); +} + +#[test] +fn all_weights_are_recorded_correctly() { + // Reset to get the correct new genesis below. + RuntimeVersionTestValues::take(); + + new_test_ext(1).execute_with(|| { + // Make sure `on_runtime_upgrade` is called for maximum complexity + RuntimeVersionTestValues::mutate(|v| { + *v = sp_version::RuntimeVersion { spec_version: 1, ..Default::default() } + }); + + let block_number = 1; + + Executive::initialize_block(&Header::new_from_number(block_number)); + + // Reset the last runtime upgrade info, to make the second call to `on_runtime_upgrade` + // succeed. + LastRuntimeUpgrade::::take(); + MockedSystemCallbacks::reset(); + + // All weights that show up in the `initialize_block_impl` + let custom_runtime_upgrade_weight = CustomOnRuntimeUpgrade::on_runtime_upgrade(); + let runtime_upgrade_weight = + ::on_runtime_upgrade(); + let on_initialize_weight = + >::on_initialize(block_number); + let base_block_weight = ::BlockWeights::get().base_block; + + // Weights are recorded correctly + assert_eq!( + frame_system::Pallet::::block_weight().total(), + custom_runtime_upgrade_weight + + runtime_upgrade_weight + + on_initialize_weight + + base_block_weight, + ); + }); +} + +#[test] +fn offchain_worker_works_as_expected() { + new_test_ext(1).execute_with(|| { + let parent_hash = sp_core::H256::from([69u8; 32]); + let mut digest = Digest::default(); + digest.push(DigestItem::Seal([1, 2, 3, 4], vec![5, 6, 7, 8])); + + let header = Header::new(1, H256::default(), H256::default(), parent_hash, digest.clone()); + + Executive::offchain_worker(&header); + + assert_eq!(digest, System::digest()); + assert_eq!(parent_hash, System::block_hash(0)); + assert_eq!(header.hash(), System::block_hash(1)); + }); +} + +#[test] +fn calculating_storage_root_twice_works() { + let call = RuntimeCall::Custom(custom::Call::calculate_storage_root {}); + let xt = TestXt::new(call, sign_extra(1, 0, 0)); + + let header = new_test_ext(1).execute_with(|| { + // Let's build some fake block. + Executive::initialize_block(&Header::new_from_number(1)); + + Executive::apply_extrinsic(xt.clone()).unwrap().unwrap(); + + Executive::finalize_block() + }); + + new_test_ext(1).execute_with(|| { + Executive::execute_block(Block::new(header, vec![xt])); + }); +} + +#[test] +#[should_panic(expected = "Invalid inherent position for extrinsic at index 1")] +fn invalid_inherent_position_fail() { + let xt1 = TestXt::new( + RuntimeCall::Balances(BalancesCall::transfer_allow_death { dest: 33, value: 0 }), + sign_extra(1, 0, 0), + ); + let xt2 = TestXt::new(RuntimeCall::Custom(custom::Call::inherent {}), None); + + let header = new_test_ext(1).execute_with(|| { + // Let's build some fake block. + Executive::initialize_block(&Header::new_from_number(1)); + + Executive::apply_extrinsic(xt1.clone()).unwrap().unwrap(); + Executive::apply_extrinsic(xt2.clone()).unwrap().unwrap(); + + Executive::finalize_block() + }); + + new_test_ext(1).execute_with(|| { + Executive::execute_block(Block::new(header, vec![xt1, xt2])); + }); +} + +#[test] +fn valid_inherents_position_works() { + let xt1 = TestXt::new(RuntimeCall::Custom(custom::Call::inherent {}), None); + let xt2 = TestXt::new(call_transfer(33, 0), sign_extra(1, 0, 0)); + + let header = new_test_ext(1).execute_with(|| { + // Let's build some fake block. + Executive::initialize_block(&Header::new_from_number(1)); + + Executive::apply_extrinsic(xt1.clone()).unwrap().unwrap(); + Executive::apply_extrinsic(xt2.clone()).unwrap().unwrap(); + + Executive::finalize_block() + }); + + new_test_ext(1).execute_with(|| { + Executive::execute_block(Block::new(header, vec![xt1, xt2])); + }); +} + +#[test] +#[should_panic(expected = "A call was labelled as mandatory, but resulted in an Error.")] +fn invalid_inherents_fail_block_execution() { + let xt1 = TestXt::new(RuntimeCall::Custom(custom::Call::inherent {}), sign_extra(1, 0, 0)); + + new_test_ext(1).execute_with(|| { + Executive::execute_block(Block::new( + Header::new(1, H256::default(), H256::default(), [69u8; 32].into(), Digest::default()), + vec![xt1], + )); + }); +} + +// Inherents are created by the runtime and don't need to be validated. +#[test] +fn inherents_fail_validate_block() { + let xt1 = TestXt::new(RuntimeCall::Custom(custom::Call::inherent {}), None); + + new_test_ext(1).execute_with(|| { + assert_eq!( + Executive::validate_transaction(TransactionSource::External, xt1, H256::random()) + .unwrap_err(), + InvalidTransaction::MandatoryValidation.into() + ); + }) +} + +/// Inherents still work while `initialize_block` forbids transactions. +#[test] +fn inherents_ok_while_exts_forbidden_works() { + let xt1 = TestXt::new(RuntimeCall::Custom(custom::Call::inherent {}), None); + + let header = new_test_ext(1).execute_with(|| { + Executive::initialize_block(&Header::new_from_number(1)); + + Executive::apply_extrinsic(xt1.clone()).unwrap().unwrap(); + // This is not applied: + Executive::finalize_block() + }); + + new_test_ext(1).execute_with(|| { + // Tell `initialize_block` to forbid extrinsics: + Executive::execute_block(Block::new(header, vec![xt1])); + }); +} + +/// Refuses to import blocks with transactions during `OnlyInherents` mode. +#[test] +#[should_panic = "Only inherents are allowed in this block"] +fn transactions_in_only_inherents_block_errors() { + let xt1 = TestXt::new(RuntimeCall::Custom(custom::Call::inherent {}), None); + let xt2 = TestXt::new(call_transfer(33, 0), sign_extra(1, 0, 0)); + + let header = new_test_ext(1).execute_with(|| { + Executive::initialize_block(&Header::new_from_number(1)); + + Executive::apply_extrinsic(xt1.clone()).unwrap().unwrap(); + Executive::apply_extrinsic(xt2.clone()).unwrap().unwrap(); + + Executive::finalize_block() + }); + + new_test_ext(1).execute_with(|| { + MbmActive::set(true); + Executive::execute_block(Block::new(header, vec![xt1, xt2])); + }); +} + +/// Same as above but no error. +#[test] +fn transactions_in_normal_block_works() { + let xt1 = TestXt::new(RuntimeCall::Custom(custom::Call::inherent {}), None); + let xt2 = TestXt::new(call_transfer(33, 0), sign_extra(1, 0, 0)); + + let header = new_test_ext(1).execute_with(|| { + Executive::initialize_block(&Header::new_from_number(1)); + + Executive::apply_extrinsic(xt1.clone()).unwrap().unwrap(); + Executive::apply_extrinsic(xt2.clone()).unwrap().unwrap(); + + Executive::finalize_block() + }); + + new_test_ext(1).execute_with(|| { + // Tell `initialize_block` to forbid extrinsics: + Executive::execute_block(Block::new(header, vec![xt1, xt2])); + }); +} + +#[test] +#[cfg(feature = "try-runtime")] +fn try_execute_block_works() { + let xt1 = TestXt::new(RuntimeCall::Custom(custom::Call::inherent {}), None); + let xt2 = TestXt::new(call_transfer(33, 0), sign_extra(1, 0, 0)); + + let header = new_test_ext(1).execute_with(|| { + Executive::initialize_block(&Header::new_from_number(1)); + + Executive::apply_extrinsic(xt1.clone()).unwrap().unwrap(); + Executive::apply_extrinsic(xt2.clone()).unwrap().unwrap(); + + Executive::finalize_block() + }); + + new_test_ext(1).execute_with(|| { + Executive::try_execute_block( + Block::new(header, vec![xt1, xt2]), + true, + true, + frame_try_runtime::TryStateSelect::All, + ) + .unwrap(); + }); +} + +/// Same as `extrinsic_while_exts_forbidden_errors` but using the try-runtime function. +#[test] +#[cfg(feature = "try-runtime")] +#[should_panic = "Only inherents allowed"] +fn try_execute_tx_forbidden_errors() { + let xt1 = TestXt::new(RuntimeCall::Custom(custom::Call::inherent {}), None); + let xt2 = TestXt::new(call_transfer(33, 0), sign_extra(1, 0, 0)); + + let header = new_test_ext(1).execute_with(|| { + // Let's build some fake block. + Executive::initialize_block(&Header::new_from_number(1)); + + Executive::apply_extrinsic(xt1.clone()).unwrap().unwrap(); + Executive::apply_extrinsic(xt2.clone()).unwrap().unwrap(); + + Executive::finalize_block() + }); + + new_test_ext(1).execute_with(|| { + MbmActive::set(true); + Executive::try_execute_block( + Block::new(header, vec![xt1, xt2]), + true, + true, + frame_try_runtime::TryStateSelect::All, + ) + .unwrap(); + }); +} + +/// Check that `ensure_inherents_are_first` reports the correct indices. +#[test] +fn ensure_inherents_are_first_works() { + let in1 = TestXt::new(RuntimeCall::Custom(custom::Call::inherent {}), None); + let in2 = TestXt::new(RuntimeCall::Custom2(custom2::Call::inherent {}), None); + let xt2 = TestXt::new(call_transfer(33, 0), sign_extra(1, 0, 0)); + + // Mocked empty header: + let header = new_test_ext(1).execute_with(|| { + Executive::initialize_block(&Header::new_from_number(1)); + Executive::finalize_block() + }); + + new_test_ext(1).execute_with(|| { + assert_ok!(Runtime::ensure_inherents_are_first(&Block::new(header.clone(), vec![]),), 0); + assert_ok!( + Runtime::ensure_inherents_are_first(&Block::new(header.clone(), vec![xt2.clone()]),), + 0 + ); + assert_ok!( + Runtime::ensure_inherents_are_first(&Block::new(header.clone(), vec![in1.clone()])), + 1 + ); + assert_ok!( + Runtime::ensure_inherents_are_first(&Block::new( + header.clone(), + vec![in1.clone(), xt2.clone()] + ),), + 1 + ); + assert_ok!( + Runtime::ensure_inherents_are_first(&Block::new( + header.clone(), + vec![in2.clone(), in1.clone(), xt2.clone()] + ),), + 2 + ); + + assert_eq!( + Runtime::ensure_inherents_are_first(&Block::new( + header.clone(), + vec![xt2.clone(), in1.clone()] + ),), + Err(1) + ); + assert_eq!( + Runtime::ensure_inherents_are_first(&Block::new( + header.clone(), + vec![xt2.clone(), xt2.clone(), in1.clone()] + ),), + Err(2) + ); + assert_eq!( + Runtime::ensure_inherents_are_first(&Block::new( + header.clone(), + vec![xt2.clone(), xt2.clone(), xt2.clone(), in2.clone()] + ),), + Err(3) + ); + }); +} + +/// Check that block execution rejects blocks with transactions in them while MBMs are active and +/// also that all the system callbacks are called correctly. +#[test] +fn callbacks_in_block_execution_works() { + callbacks_in_block_execution_works_inner(false); + callbacks_in_block_execution_works_inner(true); +} + +fn callbacks_in_block_execution_works_inner(mbms_active: bool) { + MbmActive::set(mbms_active); + + for (n_in, n_tx) in (0..10usize).zip(0..10usize) { + let mut extrinsics = Vec::new(); + + let header = new_test_ext(10).execute_with(|| { + MockedSystemCallbacks::reset(); + Executive::initialize_block(&Header::new_from_number(1)); + assert_eq!(SystemCallbacksCalled::get(), 1); + + for i in 0..n_in { + let xt = if i % 2 == 0 { + TestXt::new(RuntimeCall::Custom(custom::Call::inherent {}), None) + } else { + TestXt::new(RuntimeCall::Custom2(custom2::Call::optional_inherent {}), None) + }; + Executive::apply_extrinsic(xt.clone()).unwrap().unwrap(); + extrinsics.push(xt); + } + + for t in 0..n_tx { + let xt = TestXt::new( + RuntimeCall::Custom2(custom2::Call::some_call {}), + sign_extra(1, t as u64, 0), + ); + // Extrinsics can be applied even when MBMs are active. Only the `execute_block` + // will reject it. + Executive::apply_extrinsic(xt.clone()).unwrap().unwrap(); + extrinsics.push(xt); + } + + Executive::finalize_block() + }); + assert_eq!(SystemCallbacksCalled::get(), 3); + + new_test_ext(10).execute_with(|| { + let header = std::panic::catch_unwind(|| { + Executive::execute_block(Block::new(header, extrinsics)); + }); + + match header { + Err(e) => { + let err = e.downcast::<&str>().unwrap(); + assert_eq!(*err, "Only inherents are allowed in this block"); + assert!( + MbmActive::get() && n_tx > 0, + "Transactions should be rejected when MBMs are active" + ); + }, + Ok(_) => { + assert_eq!(SystemCallbacksCalled::get(), 3); + assert!( + !MbmActive::get() || n_tx == 0, + "MBMs should be deactivated after finalization" + ); + }, + } + }); + } +} + +#[test] +fn post_inherent_called_after_all_inherents() { + let in1 = TestXt::new(RuntimeCall::Custom2(custom2::Call::inherent {}), None); + let xt1 = TestXt::new(RuntimeCall::Custom2(custom2::Call::some_call {}), sign_extra(1, 0, 0)); + + let header = new_test_ext(1).execute_with(|| { + // Let's build some fake block. + Executive::initialize_block(&Header::new_from_number(1)); + + Executive::apply_extrinsic(in1.clone()).unwrap().unwrap(); + Executive::apply_extrinsic(xt1.clone()).unwrap().unwrap(); + + Executive::finalize_block() + }); + + #[cfg(feature = "try-runtime")] + new_test_ext(1).execute_with(|| { + Executive::try_execute_block( + Block::new(header.clone(), vec![in1.clone(), xt1.clone()]), + true, + true, + frame_try_runtime::TryStateSelect::All, + ) + .unwrap(); + assert!(MockedSystemCallbacks::post_transactions_called()); + }); + + new_test_ext(1).execute_with(|| { + MockedSystemCallbacks::reset(); + Executive::execute_block(Block::new(header, vec![in1, xt1])); + assert!(MockedSystemCallbacks::post_transactions_called()); + }); +} + +/// Regression test for AppSec finding #40. +#[test] +fn post_inherent_called_after_all_optional_inherents() { + let in1 = TestXt::new(RuntimeCall::Custom2(custom2::Call::optional_inherent {}), None); + let xt1 = TestXt::new(RuntimeCall::Custom2(custom2::Call::some_call {}), sign_extra(1, 0, 0)); + + let header = new_test_ext(1).execute_with(|| { + // Let's build some fake block. + Executive::initialize_block(&Header::new_from_number(1)); + + Executive::apply_extrinsic(in1.clone()).unwrap().unwrap(); + Executive::apply_extrinsic(xt1.clone()).unwrap().unwrap(); + + Executive::finalize_block() + }); + + #[cfg(feature = "try-runtime")] + new_test_ext(1).execute_with(|| { + Executive::try_execute_block( + Block::new(header.clone(), vec![in1.clone(), xt1.clone()]), + true, + true, + frame_try_runtime::TryStateSelect::All, + ) + .unwrap(); + assert!(MockedSystemCallbacks::post_transactions_called()); + }); + + new_test_ext(1).execute_with(|| { + MockedSystemCallbacks::reset(); + Executive::execute_block(Block::new(header, vec![in1, xt1])); + assert!(MockedSystemCallbacks::post_transactions_called()); + }); +} + +#[test] +fn is_inherent_works() { + let ext = TestXt::new(RuntimeCall::Custom2(custom2::Call::inherent {}), None); + assert!(Runtime::is_inherent(&ext)); + let ext = TestXt::new(RuntimeCall::Custom2(custom2::Call::optional_inherent {}), None); + assert!(Runtime::is_inherent(&ext)); + + let ext = TestXt::new(call_transfer(33, 0), sign_extra(1, 0, 0)); + assert!(!Runtime::is_inherent(&ext)); + + let ext = TestXt::new(RuntimeCall::Custom2(custom2::Call::allowed_unsigned {}), None); + assert!(!Runtime::is_inherent(&ext), "Unsigned ext are not automatically inherents"); +} diff --git a/substrate/frame/fast-unstake/Cargo.toml b/substrate/frame/fast-unstake/Cargo.toml index 5d0a5410f8db0e32daf44b9523cd8b85614325ab..f05f22f764164ce15704a9200c78e65b2867c908 100644 --- a/substrate/frame/fast-unstake/Cargo.toml +++ b/substrate/frame/fast-unstake/Cargo.toml @@ -16,8 +16,8 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false } -log = { version = "0.4.17", default-features = false } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +log = { workspace = true } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } frame-support = { path = "../support", default-features = false } frame-system = { path = "../system", default-features = false } @@ -30,7 +30,7 @@ frame-election-provider-support = { path = "../election-provider-support", defau frame-benchmarking = { path = "../benchmarking", default-features = false, optional = true } -docify = "0.2.7" +docify = "0.2.8" [dev-dependencies] pallet-staking-reward-curve = { path = "../staking/reward-curve" } diff --git a/substrate/frame/fast-unstake/src/lib.rs b/substrate/frame/fast-unstake/src/lib.rs index 04a50543bcc9f2b74c84f74dbe1615bda9f47b55..8ba306201310e220afdb4cf8cb0d92a043bcafa6 100644 --- a/substrate/frame/fast-unstake/src/lib.rs +++ b/substrate/frame/fast-unstake/src/lib.rs @@ -560,7 +560,7 @@ pub mod pallet { if !remaining.is_zero() { Self::halt("not enough balance to unreserve"); } else { - log!(info, "unstaked {:?}, outcome: {:?}", stash, result); + log!(debug, "unstaked {:?}, outcome: {:?}", stash, result); Self::deposit_event(Event::::Unstaked { stash, result }); } }; diff --git a/substrate/frame/fast-unstake/src/migrations.rs b/substrate/frame/fast-unstake/src/migrations.rs index 564388407045e0ae86b87c7823f3f07c5613e012..97ad86bfff42bf6ee1e258f5663d9bb53144373c 100644 --- a/substrate/frame/fast-unstake/src/migrations.rs +++ b/substrate/frame/fast-unstake/src/migrations.rs @@ -33,12 +33,12 @@ pub mod v1 { pub struct MigrateToV1(sp_std::marker::PhantomData); impl OnRuntimeUpgrade for MigrateToV1 { fn on_runtime_upgrade() -> Weight { - let current = Pallet::::current_storage_version(); + let current = Pallet::::in_code_storage_version(); let onchain = Pallet::::on_chain_storage_version(); log!( info, - "Running migration with current storage version {:?} / onchain {:?}", + "Running migration with in-code storage version {:?} / onchain {:?}", current, onchain ); diff --git a/substrate/frame/fast-unstake/src/mock.rs b/substrate/frame/fast-unstake/src/mock.rs index 78d881965a5531dea8a56a2f94015cf39afa2d90..b731cb822f336d6dd2da8e0d5ca501090909a31a 100644 --- a/substrate/frame/fast-unstake/src/mock.rs +++ b/substrate/frame/fast-unstake/src/mock.rs @@ -43,7 +43,7 @@ parameter_types! { ); } -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Runtime { type Block = Block; type AccountData = pallet_balances::AccountData; diff --git a/substrate/frame/fast-unstake/src/tests.rs b/substrate/frame/fast-unstake/src/tests.rs index b19fe3b8c463ba54571d471b0672d8b7f7d88426..77128872f285f379237153290e394f3a461226e8 100644 --- a/substrate/frame/fast-unstake/src/tests.rs +++ b/substrate/frame/fast-unstake/src/tests.rs @@ -110,7 +110,7 @@ fn cannot_register_if_head() { stashes: bounded_vec![(1, Deposit::get())], checked: bounded_vec![], }); - // Controller attempts to regsiter + // Controller attempts to register assert_noop!( FastUnstake::register_fast_unstake(RuntimeOrigin::signed(1)), Error::::AlreadyHead diff --git a/substrate/frame/fast-unstake/src/weights.rs b/substrate/frame/fast-unstake/src/weights.rs index 9c25a409f74099fc4d13158f99fae9036b34eff8..dc875e93229ef78a1000243cd7f177a53df7ec0b 100644 --- a/substrate/frame/fast-unstake/src/weights.rs +++ b/substrate/frame/fast-unstake/src/weights.rs @@ -15,16 +15,16 @@ // See the License for the specific language governing permissions and // limitations under the License. -//! Autogenerated weights for pallet_fast_unstake +//! Autogenerated weights for `pallet_fast_unstake` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-06-16, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-04-09, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-e8ezs4ez-project-145-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("dev"), DB CACHE: 1024 +//! HOSTNAME: `runner-anb7yjbi-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: `1024` // Executed Command: -// ./target/production/substrate +// ./target/production/substrate-node // benchmark // pallet // --chain=dev @@ -35,12 +35,11 @@ // --no-median-slopes // --no-min-squares // --extrinsic=* -// --execution=wasm // --wasm-execution=compiled // --heap-pages=4096 -// --output=./frame/fast-unstake/src/weights.rs -// --header=./HEADER-APACHE2 -// --template=./.maintain/frame-weight-template.hbs +// --output=./substrate/frame/fast-unstake/src/weights.rs +// --header=./substrate/HEADER-APACHE2 +// --template=./substrate/.maintain/frame-weight-template.hbs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -50,7 +49,7 @@ use frame_support::{traits::Get, weights::{Weight, constants::RocksDbWeight}}; use core::marker::PhantomData; -/// Weight functions needed for pallet_fast_unstake. +/// Weight functions needed for `pallet_fast_unstake`. pub trait WeightInfo { fn on_idle_unstake(b: u32, ) -> Weight; fn on_idle_check(v: u32, b: u32, ) -> Weight; @@ -59,301 +58,309 @@ pub trait WeightInfo { fn control() -> Weight; } -/// Weights for pallet_fast_unstake using the Substrate node and recommended hardware. +/// Weights for `pallet_fast_unstake` using the Substrate node and recommended hardware. pub struct SubstrateWeight(PhantomData); impl WeightInfo for SubstrateWeight { - /// Storage: FastUnstake ErasToCheckPerBlock (r:1 w:0) - /// Proof: FastUnstake ErasToCheckPerBlock (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: Staking ValidatorCount (r:1 w:0) - /// Proof: Staking ValidatorCount (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: FastUnstake Head (r:1 w:1) - /// Proof: FastUnstake Head (max_values: Some(1), max_size: Some(5768), added: 6263, mode: MaxEncodedLen) - /// Storage: FastUnstake CounterForQueue (r:1 w:0) - /// Proof: FastUnstake CounterForQueue (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: ElectionProviderMultiPhase CurrentPhase (r:1 w:0) - /// Proof Skipped: ElectionProviderMultiPhase CurrentPhase (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Staking CurrentEra (r:1 w:0) - /// Proof: Staking CurrentEra (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: Staking SlashingSpans (r:64 w:0) - /// Proof Skipped: Staking SlashingSpans (max_values: None, max_size: None, mode: Measured) - /// Storage: Staking Bonded (r:64 w:64) - /// Proof: Staking Bonded (max_values: None, max_size: Some(72), added: 2547, mode: MaxEncodedLen) - /// Storage: Staking Validators (r:64 w:0) - /// Proof: Staking Validators (max_values: None, max_size: Some(45), added: 2520, mode: MaxEncodedLen) - /// Storage: Staking Nominators (r:64 w:0) - /// Proof: Staking Nominators (max_values: None, max_size: Some(558), added: 3033, mode: MaxEncodedLen) - /// Storage: System Account (r:64 w:64) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) - /// Storage: Balances Locks (r:64 w:64) - /// Proof: Balances Locks (max_values: None, max_size: Some(1299), added: 3774, mode: MaxEncodedLen) - /// Storage: Balances Freezes (r:64 w:0) - /// Proof: Balances Freezes (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen) - /// Storage: Staking Ledger (r:0 w:64) - /// Proof: Staking Ledger (max_values: None, max_size: Some(1091), added: 3566, mode: MaxEncodedLen) - /// Storage: Staking Payee (r:0 w:64) - /// Proof: Staking Payee (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + /// Storage: `FastUnstake::ErasToCheckPerBlock` (r:1 w:0) + /// Proof: `FastUnstake::ErasToCheckPerBlock` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `Staking::ValidatorCount` (r:1 w:0) + /// Proof: `Staking::ValidatorCount` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `FastUnstake::Head` (r:1 w:1) + /// Proof: `FastUnstake::Head` (`max_values`: Some(1), `max_size`: Some(5768), added: 6263, mode: `MaxEncodedLen`) + /// Storage: `FastUnstake::CounterForQueue` (r:1 w:0) + /// Proof: `FastUnstake::CounterForQueue` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `ElectionProviderMultiPhase::CurrentPhase` (r:1 w:0) + /// Proof: `ElectionProviderMultiPhase::CurrentPhase` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Staking::CurrentEra` (r:1 w:0) + /// Proof: `Staking::CurrentEra` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `Staking::SlashingSpans` (r:64 w:0) + /// Proof: `Staking::SlashingSpans` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Staking::Bonded` (r:64 w:64) + /// Proof: `Staking::Bonded` (`max_values`: None, `max_size`: Some(72), added: 2547, mode: `MaxEncodedLen`) + /// Storage: `Staking::Ledger` (r:64 w:64) + /// Proof: `Staking::Ledger` (`max_values`: None, `max_size`: Some(1091), added: 3566, mode: `MaxEncodedLen`) + /// Storage: `Balances::Locks` (r:64 w:64) + /// Proof: `Balances::Locks` (`max_values`: None, `max_size`: Some(1299), added: 3774, mode: `MaxEncodedLen`) + /// Storage: `Balances::Freezes` (r:64 w:0) + /// Proof: `Balances::Freezes` (`max_values`: None, `max_size`: Some(67), added: 2542, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:64 w:64) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `Staking::Validators` (r:64 w:0) + /// Proof: `Staking::Validators` (`max_values`: None, `max_size`: Some(45), added: 2520, mode: `MaxEncodedLen`) + /// Storage: `Staking::Nominators` (r:64 w:0) + /// Proof: `Staking::Nominators` (`max_values`: None, `max_size`: Some(558), added: 3033, mode: `MaxEncodedLen`) + /// Storage: `Staking::Payee` (r:0 w:64) + /// Proof: `Staking::Payee` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) /// The range of component `b` is `[1, 64]`. fn on_idle_unstake(b: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `1378 + b * (343 ±0)` + // Measured: `1475 + b * (452 ±0)` // Estimated: `7253 + b * (3774 ±0)` - // Minimum execution time: 92_847_000 picoseconds. - Weight::from_parts(42_300_813, 7253) - // Standard Error: 40_514 - .saturating_add(Weight::from_parts(58_412_402, 0).saturating_mul(b.into())) + // Minimum execution time: 84_536_000 picoseconds. + Weight::from_parts(41_949_894, 7253) + // Standard Error: 28_494 + .saturating_add(Weight::from_parts(52_945_820, 0).saturating_mul(b.into())) .saturating_add(T::DbWeight::get().reads(6_u64)) - .saturating_add(T::DbWeight::get().reads((7_u64).saturating_mul(b.into()))) + .saturating_add(T::DbWeight::get().reads((8_u64).saturating_mul(b.into()))) .saturating_add(T::DbWeight::get().writes(1_u64)) .saturating_add(T::DbWeight::get().writes((5_u64).saturating_mul(b.into()))) .saturating_add(Weight::from_parts(0, 3774).saturating_mul(b.into())) } - /// Storage: FastUnstake ErasToCheckPerBlock (r:1 w:0) - /// Proof: FastUnstake ErasToCheckPerBlock (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: Staking ValidatorCount (r:1 w:0) - /// Proof: Staking ValidatorCount (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: FastUnstake Head (r:1 w:1) - /// Proof: FastUnstake Head (max_values: Some(1), max_size: Some(5768), added: 6263, mode: MaxEncodedLen) - /// Storage: FastUnstake CounterForQueue (r:1 w:0) - /// Proof: FastUnstake CounterForQueue (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: ElectionProviderMultiPhase CurrentPhase (r:1 w:0) - /// Proof Skipped: ElectionProviderMultiPhase CurrentPhase (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Staking CurrentEra (r:1 w:0) - /// Proof: Staking CurrentEra (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: Staking ErasStakers (r:257 w:0) - /// Proof Skipped: Staking ErasStakers (max_values: None, max_size: None, mode: Measured) + /// Storage: `FastUnstake::ErasToCheckPerBlock` (r:1 w:0) + /// Proof: `FastUnstake::ErasToCheckPerBlock` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `Staking::ValidatorCount` (r:1 w:0) + /// Proof: `Staking::ValidatorCount` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `FastUnstake::Head` (r:1 w:1) + /// Proof: `FastUnstake::Head` (`max_values`: Some(1), `max_size`: Some(5768), added: 6263, mode: `MaxEncodedLen`) + /// Storage: `FastUnstake::CounterForQueue` (r:1 w:0) + /// Proof: `FastUnstake::CounterForQueue` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `ElectionProviderMultiPhase::CurrentPhase` (r:1 w:0) + /// Proof: `ElectionProviderMultiPhase::CurrentPhase` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Staking::CurrentEra` (r:1 w:0) + /// Proof: `Staking::CurrentEra` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `Staking::ErasStakers` (r:1 w:0) + /// Proof: `Staking::ErasStakers` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Staking::ErasStakersPaged` (r:257 w:0) + /// Proof: `Staking::ErasStakersPaged` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `v` is `[1, 256]`. /// The range of component `b` is `[1, 64]`. fn on_idle_check(v: u32, b: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `1546 + b * (48 ±0) + v * (10037 ±0)` - // Estimated: `7253 + b * (49 ±0) + v * (12513 ±0)` - // Minimum execution time: 1_685_784_000 picoseconds. - Weight::from_parts(1_693_370_000, 7253) - // Standard Error: 13_295_842 - .saturating_add(Weight::from_parts(425_349_148, 0).saturating_mul(v.into())) - // Standard Error: 53_198_180 - .saturating_add(Weight::from_parts(1_673_328_444, 0).saturating_mul(b.into())) - .saturating_add(T::DbWeight::get().reads(7_u64)) + // Measured: `1879 + b * (55 ±0) + v * (10055 ±0)` + // Estimated: `7253 + b * (56 ±0) + v * (12531 ±0)` + // Minimum execution time: 1_745_807_000 picoseconds. + Weight::from_parts(1_757_648_000, 7253) + // Standard Error: 12_994_693 + .saturating_add(Weight::from_parts(416_410_247, 0).saturating_mul(v.into())) + // Standard Error: 51_993_247 + .saturating_add(Weight::from_parts(1_654_551_441, 0).saturating_mul(b.into())) + .saturating_add(T::DbWeight::get().reads(8_u64)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(v.into()))) .saturating_add(T::DbWeight::get().writes(1_u64)) - .saturating_add(Weight::from_parts(0, 49).saturating_mul(b.into())) - .saturating_add(Weight::from_parts(0, 12513).saturating_mul(v.into())) + .saturating_add(Weight::from_parts(0, 56).saturating_mul(b.into())) + .saturating_add(Weight::from_parts(0, 12531).saturating_mul(v.into())) } - /// Storage: FastUnstake ErasToCheckPerBlock (r:1 w:0) - /// Proof: FastUnstake ErasToCheckPerBlock (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: Staking Ledger (r:1 w:1) - /// Proof: Staking Ledger (max_values: None, max_size: Some(1091), added: 3566, mode: MaxEncodedLen) - /// Storage: FastUnstake Queue (r:1 w:1) - /// Proof: FastUnstake Queue (max_values: None, max_size: Some(56), added: 2531, mode: MaxEncodedLen) - /// Storage: FastUnstake Head (r:1 w:0) - /// Proof: FastUnstake Head (max_values: Some(1), max_size: Some(5768), added: 6263, mode: MaxEncodedLen) - /// Storage: Staking Bonded (r:1 w:0) - /// Proof: Staking Bonded (max_values: None, max_size: Some(72), added: 2547, mode: MaxEncodedLen) - /// Storage: Staking Validators (r:1 w:0) - /// Proof: Staking Validators (max_values: None, max_size: Some(45), added: 2520, mode: MaxEncodedLen) - /// Storage: Staking Nominators (r:1 w:1) - /// Proof: Staking Nominators (max_values: None, max_size: Some(558), added: 3033, mode: MaxEncodedLen) - /// Storage: Staking CounterForNominators (r:1 w:1) - /// Proof: Staking CounterForNominators (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: VoterList ListNodes (r:1 w:1) - /// Proof: VoterList ListNodes (max_values: None, max_size: Some(154), added: 2629, mode: MaxEncodedLen) - /// Storage: VoterList ListBags (r:1 w:1) - /// Proof: VoterList ListBags (max_values: None, max_size: Some(82), added: 2557, mode: MaxEncodedLen) - /// Storage: VoterList CounterForListNodes (r:1 w:1) - /// Proof: VoterList CounterForListNodes (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: Staking CurrentEra (r:1 w:0) - /// Proof: Staking CurrentEra (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: Balances Locks (r:1 w:1) - /// Proof: Balances Locks (max_values: None, max_size: Some(1299), added: 3774, mode: MaxEncodedLen) - /// Storage: Balances Freezes (r:1 w:0) - /// Proof: Balances Freezes (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen) - /// Storage: FastUnstake CounterForQueue (r:1 w:1) - /// Proof: FastUnstake CounterForQueue (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + /// Storage: `FastUnstake::ErasToCheckPerBlock` (r:1 w:0) + /// Proof: `FastUnstake::ErasToCheckPerBlock` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `Staking::Ledger` (r:1 w:1) + /// Proof: `Staking::Ledger` (`max_values`: None, `max_size`: Some(1091), added: 3566, mode: `MaxEncodedLen`) + /// Storage: `Staking::Bonded` (r:1 w:0) + /// Proof: `Staking::Bonded` (`max_values`: None, `max_size`: Some(72), added: 2547, mode: `MaxEncodedLen`) + /// Storage: `FastUnstake::Queue` (r:1 w:1) + /// Proof: `FastUnstake::Queue` (`max_values`: None, `max_size`: Some(56), added: 2531, mode: `MaxEncodedLen`) + /// Storage: `FastUnstake::Head` (r:1 w:0) + /// Proof: `FastUnstake::Head` (`max_values`: Some(1), `max_size`: Some(5768), added: 6263, mode: `MaxEncodedLen`) + /// Storage: `Staking::Validators` (r:1 w:0) + /// Proof: `Staking::Validators` (`max_values`: None, `max_size`: Some(45), added: 2520, mode: `MaxEncodedLen`) + /// Storage: `Staking::Nominators` (r:1 w:1) + /// Proof: `Staking::Nominators` (`max_values`: None, `max_size`: Some(558), added: 3033, mode: `MaxEncodedLen`) + /// Storage: `Staking::CounterForNominators` (r:1 w:1) + /// Proof: `Staking::CounterForNominators` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `VoterList::ListNodes` (r:1 w:1) + /// Proof: `VoterList::ListNodes` (`max_values`: None, `max_size`: Some(154), added: 2629, mode: `MaxEncodedLen`) + /// Storage: `VoterList::ListBags` (r:1 w:1) + /// Proof: `VoterList::ListBags` (`max_values`: None, `max_size`: Some(82), added: 2557, mode: `MaxEncodedLen`) + /// Storage: `VoterList::CounterForListNodes` (r:1 w:1) + /// Proof: `VoterList::CounterForListNodes` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `Staking::CurrentEra` (r:1 w:0) + /// Proof: `Staking::CurrentEra` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `Balances::Locks` (r:1 w:1) + /// Proof: `Balances::Locks` (`max_values`: None, `max_size`: Some(1299), added: 3774, mode: `MaxEncodedLen`) + /// Storage: `Balances::Freezes` (r:1 w:0) + /// Proof: `Balances::Freezes` (`max_values`: None, `max_size`: Some(67), added: 2542, mode: `MaxEncodedLen`) + /// Storage: `FastUnstake::CounterForQueue` (r:1 w:1) + /// Proof: `FastUnstake::CounterForQueue` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) fn register_fast_unstake() -> Weight { // Proof Size summary in bytes: - // Measured: `1964` + // Measured: `1955` // Estimated: `7253` - // Minimum execution time: 125_512_000 picoseconds. - Weight::from_parts(129_562_000, 7253) + // Minimum execution time: 136_437_000 picoseconds. + Weight::from_parts(138_827_000, 7253) .saturating_add(T::DbWeight::get().reads(15_u64)) .saturating_add(T::DbWeight::get().writes(9_u64)) } - /// Storage: FastUnstake ErasToCheckPerBlock (r:1 w:0) - /// Proof: FastUnstake ErasToCheckPerBlock (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: Staking Ledger (r:1 w:0) - /// Proof: Staking Ledger (max_values: None, max_size: Some(1091), added: 3566, mode: MaxEncodedLen) - /// Storage: FastUnstake Queue (r:1 w:1) - /// Proof: FastUnstake Queue (max_values: None, max_size: Some(56), added: 2531, mode: MaxEncodedLen) - /// Storage: FastUnstake Head (r:1 w:0) - /// Proof: FastUnstake Head (max_values: Some(1), max_size: Some(5768), added: 6263, mode: MaxEncodedLen) - /// Storage: FastUnstake CounterForQueue (r:1 w:1) - /// Proof: FastUnstake CounterForQueue (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + /// Storage: `FastUnstake::ErasToCheckPerBlock` (r:1 w:0) + /// Proof: `FastUnstake::ErasToCheckPerBlock` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `Staking::Ledger` (r:1 w:0) + /// Proof: `Staking::Ledger` (`max_values`: None, `max_size`: Some(1091), added: 3566, mode: `MaxEncodedLen`) + /// Storage: `Staking::Bonded` (r:1 w:0) + /// Proof: `Staking::Bonded` (`max_values`: None, `max_size`: Some(72), added: 2547, mode: `MaxEncodedLen`) + /// Storage: `FastUnstake::Queue` (r:1 w:1) + /// Proof: `FastUnstake::Queue` (`max_values`: None, `max_size`: Some(56), added: 2531, mode: `MaxEncodedLen`) + /// Storage: `FastUnstake::Head` (r:1 w:0) + /// Proof: `FastUnstake::Head` (`max_values`: Some(1), `max_size`: Some(5768), added: 6263, mode: `MaxEncodedLen`) + /// Storage: `FastUnstake::CounterForQueue` (r:1 w:1) + /// Proof: `FastUnstake::CounterForQueue` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) fn deregister() -> Weight { // Proof Size summary in bytes: - // Measured: `1223` + // Measured: `1350` // Estimated: `7253` - // Minimum execution time: 43_943_000 picoseconds. - Weight::from_parts(45_842_000, 7253) - .saturating_add(T::DbWeight::get().reads(5_u64)) + // Minimum execution time: 45_337_000 picoseconds. + Weight::from_parts(47_359_000, 7253) + .saturating_add(T::DbWeight::get().reads(6_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } - /// Storage: FastUnstake ErasToCheckPerBlock (r:0 w:1) - /// Proof: FastUnstake ErasToCheckPerBlock (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + /// Storage: `FastUnstake::ErasToCheckPerBlock` (r:0 w:1) + /// Proof: `FastUnstake::ErasToCheckPerBlock` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) fn control() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_677_000 picoseconds. - Weight::from_parts(2_849_000, 0) + // Minimum execution time: 2_258_000 picoseconds. + Weight::from_parts(2_406_000, 0) .saturating_add(T::DbWeight::get().writes(1_u64)) } } -// For backwards compatibility and tests +// For backwards compatibility and tests. impl WeightInfo for () { - /// Storage: FastUnstake ErasToCheckPerBlock (r:1 w:0) - /// Proof: FastUnstake ErasToCheckPerBlock (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: Staking ValidatorCount (r:1 w:0) - /// Proof: Staking ValidatorCount (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: FastUnstake Head (r:1 w:1) - /// Proof: FastUnstake Head (max_values: Some(1), max_size: Some(5768), added: 6263, mode: MaxEncodedLen) - /// Storage: FastUnstake CounterForQueue (r:1 w:0) - /// Proof: FastUnstake CounterForQueue (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: ElectionProviderMultiPhase CurrentPhase (r:1 w:0) - /// Proof Skipped: ElectionProviderMultiPhase CurrentPhase (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Staking CurrentEra (r:1 w:0) - /// Proof: Staking CurrentEra (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: Staking SlashingSpans (r:64 w:0) - /// Proof Skipped: Staking SlashingSpans (max_values: None, max_size: None, mode: Measured) - /// Storage: Staking Bonded (r:64 w:64) - /// Proof: Staking Bonded (max_values: None, max_size: Some(72), added: 2547, mode: MaxEncodedLen) - /// Storage: Staking Validators (r:64 w:0) - /// Proof: Staking Validators (max_values: None, max_size: Some(45), added: 2520, mode: MaxEncodedLen) - /// Storage: Staking Nominators (r:64 w:0) - /// Proof: Staking Nominators (max_values: None, max_size: Some(558), added: 3033, mode: MaxEncodedLen) - /// Storage: System Account (r:64 w:64) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) - /// Storage: Balances Locks (r:64 w:64) - /// Proof: Balances Locks (max_values: None, max_size: Some(1299), added: 3774, mode: MaxEncodedLen) - /// Storage: Balances Freezes (r:64 w:0) - /// Proof: Balances Freezes (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen) - /// Storage: Staking Ledger (r:0 w:64) - /// Proof: Staking Ledger (max_values: None, max_size: Some(1091), added: 3566, mode: MaxEncodedLen) - /// Storage: Staking Payee (r:0 w:64) - /// Proof: Staking Payee (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + /// Storage: `FastUnstake::ErasToCheckPerBlock` (r:1 w:0) + /// Proof: `FastUnstake::ErasToCheckPerBlock` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `Staking::ValidatorCount` (r:1 w:0) + /// Proof: `Staking::ValidatorCount` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `FastUnstake::Head` (r:1 w:1) + /// Proof: `FastUnstake::Head` (`max_values`: Some(1), `max_size`: Some(5768), added: 6263, mode: `MaxEncodedLen`) + /// Storage: `FastUnstake::CounterForQueue` (r:1 w:0) + /// Proof: `FastUnstake::CounterForQueue` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `ElectionProviderMultiPhase::CurrentPhase` (r:1 w:0) + /// Proof: `ElectionProviderMultiPhase::CurrentPhase` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Staking::CurrentEra` (r:1 w:0) + /// Proof: `Staking::CurrentEra` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `Staking::SlashingSpans` (r:64 w:0) + /// Proof: `Staking::SlashingSpans` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Staking::Bonded` (r:64 w:64) + /// Proof: `Staking::Bonded` (`max_values`: None, `max_size`: Some(72), added: 2547, mode: `MaxEncodedLen`) + /// Storage: `Staking::Ledger` (r:64 w:64) + /// Proof: `Staking::Ledger` (`max_values`: None, `max_size`: Some(1091), added: 3566, mode: `MaxEncodedLen`) + /// Storage: `Balances::Locks` (r:64 w:64) + /// Proof: `Balances::Locks` (`max_values`: None, `max_size`: Some(1299), added: 3774, mode: `MaxEncodedLen`) + /// Storage: `Balances::Freezes` (r:64 w:0) + /// Proof: `Balances::Freezes` (`max_values`: None, `max_size`: Some(67), added: 2542, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:64 w:64) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `Staking::Validators` (r:64 w:0) + /// Proof: `Staking::Validators` (`max_values`: None, `max_size`: Some(45), added: 2520, mode: `MaxEncodedLen`) + /// Storage: `Staking::Nominators` (r:64 w:0) + /// Proof: `Staking::Nominators` (`max_values`: None, `max_size`: Some(558), added: 3033, mode: `MaxEncodedLen`) + /// Storage: `Staking::Payee` (r:0 w:64) + /// Proof: `Staking::Payee` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) /// The range of component `b` is `[1, 64]`. fn on_idle_unstake(b: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `1378 + b * (343 ±0)` + // Measured: `1475 + b * (452 ±0)` // Estimated: `7253 + b * (3774 ±0)` - // Minimum execution time: 92_847_000 picoseconds. - Weight::from_parts(42_300_813, 7253) - // Standard Error: 40_514 - .saturating_add(Weight::from_parts(58_412_402, 0).saturating_mul(b.into())) + // Minimum execution time: 84_536_000 picoseconds. + Weight::from_parts(41_949_894, 7253) + // Standard Error: 28_494 + .saturating_add(Weight::from_parts(52_945_820, 0).saturating_mul(b.into())) .saturating_add(RocksDbWeight::get().reads(6_u64)) - .saturating_add(RocksDbWeight::get().reads((7_u64).saturating_mul(b.into()))) + .saturating_add(RocksDbWeight::get().reads((8_u64).saturating_mul(b.into()))) .saturating_add(RocksDbWeight::get().writes(1_u64)) .saturating_add(RocksDbWeight::get().writes((5_u64).saturating_mul(b.into()))) .saturating_add(Weight::from_parts(0, 3774).saturating_mul(b.into())) } - /// Storage: FastUnstake ErasToCheckPerBlock (r:1 w:0) - /// Proof: FastUnstake ErasToCheckPerBlock (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: Staking ValidatorCount (r:1 w:0) - /// Proof: Staking ValidatorCount (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: FastUnstake Head (r:1 w:1) - /// Proof: FastUnstake Head (max_values: Some(1), max_size: Some(5768), added: 6263, mode: MaxEncodedLen) - /// Storage: FastUnstake CounterForQueue (r:1 w:0) - /// Proof: FastUnstake CounterForQueue (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: ElectionProviderMultiPhase CurrentPhase (r:1 w:0) - /// Proof Skipped: ElectionProviderMultiPhase CurrentPhase (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Staking CurrentEra (r:1 w:0) - /// Proof: Staking CurrentEra (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: Staking ErasStakers (r:257 w:0) - /// Proof Skipped: Staking ErasStakers (max_values: None, max_size: None, mode: Measured) + /// Storage: `FastUnstake::ErasToCheckPerBlock` (r:1 w:0) + /// Proof: `FastUnstake::ErasToCheckPerBlock` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `Staking::ValidatorCount` (r:1 w:0) + /// Proof: `Staking::ValidatorCount` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `FastUnstake::Head` (r:1 w:1) + /// Proof: `FastUnstake::Head` (`max_values`: Some(1), `max_size`: Some(5768), added: 6263, mode: `MaxEncodedLen`) + /// Storage: `FastUnstake::CounterForQueue` (r:1 w:0) + /// Proof: `FastUnstake::CounterForQueue` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `ElectionProviderMultiPhase::CurrentPhase` (r:1 w:0) + /// Proof: `ElectionProviderMultiPhase::CurrentPhase` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Staking::CurrentEra` (r:1 w:0) + /// Proof: `Staking::CurrentEra` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `Staking::ErasStakers` (r:1 w:0) + /// Proof: `Staking::ErasStakers` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Staking::ErasStakersPaged` (r:257 w:0) + /// Proof: `Staking::ErasStakersPaged` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `v` is `[1, 256]`. /// The range of component `b` is `[1, 64]`. fn on_idle_check(v: u32, b: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `1546 + b * (48 ±0) + v * (10037 ±0)` - // Estimated: `7253 + b * (49 ±0) + v * (12513 ±0)` - // Minimum execution time: 1_685_784_000 picoseconds. - Weight::from_parts(1_693_370_000, 7253) - // Standard Error: 13_295_842 - .saturating_add(Weight::from_parts(425_349_148, 0).saturating_mul(v.into())) - // Standard Error: 53_198_180 - .saturating_add(Weight::from_parts(1_673_328_444, 0).saturating_mul(b.into())) - .saturating_add(RocksDbWeight::get().reads(7_u64)) + // Measured: `1879 + b * (55 ±0) + v * (10055 ±0)` + // Estimated: `7253 + b * (56 ±0) + v * (12531 ±0)` + // Minimum execution time: 1_745_807_000 picoseconds. + Weight::from_parts(1_757_648_000, 7253) + // Standard Error: 12_994_693 + .saturating_add(Weight::from_parts(416_410_247, 0).saturating_mul(v.into())) + // Standard Error: 51_993_247 + .saturating_add(Weight::from_parts(1_654_551_441, 0).saturating_mul(b.into())) + .saturating_add(RocksDbWeight::get().reads(8_u64)) .saturating_add(RocksDbWeight::get().reads((1_u64).saturating_mul(v.into()))) .saturating_add(RocksDbWeight::get().writes(1_u64)) - .saturating_add(Weight::from_parts(0, 49).saturating_mul(b.into())) - .saturating_add(Weight::from_parts(0, 12513).saturating_mul(v.into())) + .saturating_add(Weight::from_parts(0, 56).saturating_mul(b.into())) + .saturating_add(Weight::from_parts(0, 12531).saturating_mul(v.into())) } - /// Storage: FastUnstake ErasToCheckPerBlock (r:1 w:0) - /// Proof: FastUnstake ErasToCheckPerBlock (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: Staking Ledger (r:1 w:1) - /// Proof: Staking Ledger (max_values: None, max_size: Some(1091), added: 3566, mode: MaxEncodedLen) - /// Storage: FastUnstake Queue (r:1 w:1) - /// Proof: FastUnstake Queue (max_values: None, max_size: Some(56), added: 2531, mode: MaxEncodedLen) - /// Storage: FastUnstake Head (r:1 w:0) - /// Proof: FastUnstake Head (max_values: Some(1), max_size: Some(5768), added: 6263, mode: MaxEncodedLen) - /// Storage: Staking Bonded (r:1 w:0) - /// Proof: Staking Bonded (max_values: None, max_size: Some(72), added: 2547, mode: MaxEncodedLen) - /// Storage: Staking Validators (r:1 w:0) - /// Proof: Staking Validators (max_values: None, max_size: Some(45), added: 2520, mode: MaxEncodedLen) - /// Storage: Staking Nominators (r:1 w:1) - /// Proof: Staking Nominators (max_values: None, max_size: Some(558), added: 3033, mode: MaxEncodedLen) - /// Storage: Staking CounterForNominators (r:1 w:1) - /// Proof: Staking CounterForNominators (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: VoterList ListNodes (r:1 w:1) - /// Proof: VoterList ListNodes (max_values: None, max_size: Some(154), added: 2629, mode: MaxEncodedLen) - /// Storage: VoterList ListBags (r:1 w:1) - /// Proof: VoterList ListBags (max_values: None, max_size: Some(82), added: 2557, mode: MaxEncodedLen) - /// Storage: VoterList CounterForListNodes (r:1 w:1) - /// Proof: VoterList CounterForListNodes (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: Staking CurrentEra (r:1 w:0) - /// Proof: Staking CurrentEra (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: Balances Locks (r:1 w:1) - /// Proof: Balances Locks (max_values: None, max_size: Some(1299), added: 3774, mode: MaxEncodedLen) - /// Storage: Balances Freezes (r:1 w:0) - /// Proof: Balances Freezes (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen) - /// Storage: FastUnstake CounterForQueue (r:1 w:1) - /// Proof: FastUnstake CounterForQueue (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + /// Storage: `FastUnstake::ErasToCheckPerBlock` (r:1 w:0) + /// Proof: `FastUnstake::ErasToCheckPerBlock` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `Staking::Ledger` (r:1 w:1) + /// Proof: `Staking::Ledger` (`max_values`: None, `max_size`: Some(1091), added: 3566, mode: `MaxEncodedLen`) + /// Storage: `Staking::Bonded` (r:1 w:0) + /// Proof: `Staking::Bonded` (`max_values`: None, `max_size`: Some(72), added: 2547, mode: `MaxEncodedLen`) + /// Storage: `FastUnstake::Queue` (r:1 w:1) + /// Proof: `FastUnstake::Queue` (`max_values`: None, `max_size`: Some(56), added: 2531, mode: `MaxEncodedLen`) + /// Storage: `FastUnstake::Head` (r:1 w:0) + /// Proof: `FastUnstake::Head` (`max_values`: Some(1), `max_size`: Some(5768), added: 6263, mode: `MaxEncodedLen`) + /// Storage: `Staking::Validators` (r:1 w:0) + /// Proof: `Staking::Validators` (`max_values`: None, `max_size`: Some(45), added: 2520, mode: `MaxEncodedLen`) + /// Storage: `Staking::Nominators` (r:1 w:1) + /// Proof: `Staking::Nominators` (`max_values`: None, `max_size`: Some(558), added: 3033, mode: `MaxEncodedLen`) + /// Storage: `Staking::CounterForNominators` (r:1 w:1) + /// Proof: `Staking::CounterForNominators` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `VoterList::ListNodes` (r:1 w:1) + /// Proof: `VoterList::ListNodes` (`max_values`: None, `max_size`: Some(154), added: 2629, mode: `MaxEncodedLen`) + /// Storage: `VoterList::ListBags` (r:1 w:1) + /// Proof: `VoterList::ListBags` (`max_values`: None, `max_size`: Some(82), added: 2557, mode: `MaxEncodedLen`) + /// Storage: `VoterList::CounterForListNodes` (r:1 w:1) + /// Proof: `VoterList::CounterForListNodes` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `Staking::CurrentEra` (r:1 w:0) + /// Proof: `Staking::CurrentEra` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `Balances::Locks` (r:1 w:1) + /// Proof: `Balances::Locks` (`max_values`: None, `max_size`: Some(1299), added: 3774, mode: `MaxEncodedLen`) + /// Storage: `Balances::Freezes` (r:1 w:0) + /// Proof: `Balances::Freezes` (`max_values`: None, `max_size`: Some(67), added: 2542, mode: `MaxEncodedLen`) + /// Storage: `FastUnstake::CounterForQueue` (r:1 w:1) + /// Proof: `FastUnstake::CounterForQueue` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) fn register_fast_unstake() -> Weight { // Proof Size summary in bytes: - // Measured: `1964` + // Measured: `1955` // Estimated: `7253` - // Minimum execution time: 125_512_000 picoseconds. - Weight::from_parts(129_562_000, 7253) + // Minimum execution time: 136_437_000 picoseconds. + Weight::from_parts(138_827_000, 7253) .saturating_add(RocksDbWeight::get().reads(15_u64)) .saturating_add(RocksDbWeight::get().writes(9_u64)) } - /// Storage: FastUnstake ErasToCheckPerBlock (r:1 w:0) - /// Proof: FastUnstake ErasToCheckPerBlock (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: Staking Ledger (r:1 w:0) - /// Proof: Staking Ledger (max_values: None, max_size: Some(1091), added: 3566, mode: MaxEncodedLen) - /// Storage: FastUnstake Queue (r:1 w:1) - /// Proof: FastUnstake Queue (max_values: None, max_size: Some(56), added: 2531, mode: MaxEncodedLen) - /// Storage: FastUnstake Head (r:1 w:0) - /// Proof: FastUnstake Head (max_values: Some(1), max_size: Some(5768), added: 6263, mode: MaxEncodedLen) - /// Storage: FastUnstake CounterForQueue (r:1 w:1) - /// Proof: FastUnstake CounterForQueue (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + /// Storage: `FastUnstake::ErasToCheckPerBlock` (r:1 w:0) + /// Proof: `FastUnstake::ErasToCheckPerBlock` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `Staking::Ledger` (r:1 w:0) + /// Proof: `Staking::Ledger` (`max_values`: None, `max_size`: Some(1091), added: 3566, mode: `MaxEncodedLen`) + /// Storage: `Staking::Bonded` (r:1 w:0) + /// Proof: `Staking::Bonded` (`max_values`: None, `max_size`: Some(72), added: 2547, mode: `MaxEncodedLen`) + /// Storage: `FastUnstake::Queue` (r:1 w:1) + /// Proof: `FastUnstake::Queue` (`max_values`: None, `max_size`: Some(56), added: 2531, mode: `MaxEncodedLen`) + /// Storage: `FastUnstake::Head` (r:1 w:0) + /// Proof: `FastUnstake::Head` (`max_values`: Some(1), `max_size`: Some(5768), added: 6263, mode: `MaxEncodedLen`) + /// Storage: `FastUnstake::CounterForQueue` (r:1 w:1) + /// Proof: `FastUnstake::CounterForQueue` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) fn deregister() -> Weight { // Proof Size summary in bytes: - // Measured: `1223` + // Measured: `1350` // Estimated: `7253` - // Minimum execution time: 43_943_000 picoseconds. - Weight::from_parts(45_842_000, 7253) - .saturating_add(RocksDbWeight::get().reads(5_u64)) + // Minimum execution time: 45_337_000 picoseconds. + Weight::from_parts(47_359_000, 7253) + .saturating_add(RocksDbWeight::get().reads(6_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } - /// Storage: FastUnstake ErasToCheckPerBlock (r:0 w:1) - /// Proof: FastUnstake ErasToCheckPerBlock (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + /// Storage: `FastUnstake::ErasToCheckPerBlock` (r:0 w:1) + /// Proof: `FastUnstake::ErasToCheckPerBlock` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) fn control() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_677_000 picoseconds. - Weight::from_parts(2_849_000, 0) + // Minimum execution time: 2_258_000 picoseconds. + Weight::from_parts(2_406_000, 0) .saturating_add(RocksDbWeight::get().writes(1_u64)) } } diff --git a/substrate/frame/glutton/Cargo.toml b/substrate/frame/glutton/Cargo.toml index b9543e7f47c041202767ae35be932721417f52ce..5ce010f1c2622fbbefa053bf1bb45383e853af4c 100644 --- a/substrate/frame/glutton/Cargo.toml +++ b/substrate/frame/glutton/Cargo.toml @@ -18,8 +18,8 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] blake2 = { version = "0.10.4", default-features = false } codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -log = { version = "0.4.14", default-features = false } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +log = { workspace = true } frame-benchmarking = { path = "../benchmarking", default-features = false, optional = true } frame-support = { path = "../support", default-features = false } frame-system = { path = "../system", default-features = false } diff --git a/substrate/frame/glutton/src/benchmarking.rs b/substrate/frame/glutton/src/benchmarking.rs index fa93c7ccc82901608b7be9808118103064d010ee..0b1309e6330465580d4b2829efc3d2de33e53fd1 100644 --- a/substrate/frame/glutton/src/benchmarking.rs +++ b/substrate/frame/glutton/src/benchmarking.rs @@ -85,7 +85,7 @@ benchmarks! { empty_on_idle { }: { - // Enough weight do do nothing. + // Enough weight to do nothing. Glutton::::on_idle(System::::block_number(), T::WeightInfo::empty_on_idle()); } diff --git a/substrate/frame/glutton/src/mock.rs b/substrate/frame/glutton/src/mock.rs index 26863811e29a76b1f8b3249050287e90c39a713b..132ef5cfbcbbabb077b7968cc0ae1451bcd06bc7 100644 --- a/substrate/frame/glutton/src/mock.rs +++ b/substrate/frame/glutton/src/mock.rs @@ -18,15 +18,8 @@ use super::*; use crate as pallet_glutton; -use frame_support::{ - assert_ok, derive_impl, - traits::{ConstU32, ConstU64}, -}; -use sp_core::H256; -use sp_runtime::{ - traits::{BlakeTwo256, IdentityLookup}, - BuildStorage, -}; +use frame_support::{assert_ok, derive_impl}; +use sp_runtime::BuildStorage; type Block = frame_system::mocking::MockBlock; @@ -38,31 +31,9 @@ frame_support::construct_runtime!( } ); -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { - type BaseCallFilter = frame_support::traits::Everything; - type BlockWeights = (); - type BlockLength = (); - type DbWeight = (); - type RuntimeOrigin = RuntimeOrigin; - type Nonce = u64; - type Hash = H256; - type RuntimeCall = RuntimeCall; - type Hashing = BlakeTwo256; - type AccountId = u64; - type Lookup = IdentityLookup; type Block = Block; - type RuntimeEvent = RuntimeEvent; - type BlockHashCount = ConstU64<250>; - type Version = (); - type PalletInfo = PalletInfo; - type AccountData = pallet_balances::AccountData; - type OnNewAccount = (); - type OnKilledAccount = (); - type SystemWeightInfo = (); - type SS58Prefix = (); - type OnSetCode = (); - type MaxConsumers = ConstU32<16>; } impl Config for Test { diff --git a/substrate/frame/glutton/src/weights.rs b/substrate/frame/glutton/src/weights.rs index cbc0fb022f510889e66a403f1624c025faa5a7f8..d9e6ebd9d8a9b1f31fa72eddb88558582a9f6872 100644 --- a/substrate/frame/glutton/src/weights.rs +++ b/substrate/frame/glutton/src/weights.rs @@ -15,16 +15,16 @@ // See the License for the specific language governing permissions and // limitations under the License. -//! Autogenerated weights for pallet_glutton +//! Autogenerated weights for `pallet_glutton` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-06-16, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-04-09, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-e8ezs4ez-project-145-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("dev"), DB CACHE: 1024 +//! HOSTNAME: `runner-anb7yjbi-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: `1024` // Executed Command: -// ./target/production/substrate +// ./target/production/substrate-node // benchmark // pallet // --chain=dev @@ -35,12 +35,11 @@ // --no-median-slopes // --no-min-squares // --extrinsic=* -// --execution=wasm // --wasm-execution=compiled // --heap-pages=4096 -// --output=./frame/glutton/src/weights.rs -// --header=./HEADER-APACHE2 -// --template=./.maintain/frame-weight-template.hbs +// --output=./substrate/frame/glutton/src/weights.rs +// --header=./substrate/HEADER-APACHE2 +// --template=./substrate/.maintain/frame-weight-template.hbs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -50,7 +49,7 @@ use frame_support::{traits::Get, weights::{Weight, constants::RocksDbWeight}}; use core::marker::PhantomData; -/// Weight functions needed for pallet_glutton. +/// Weight functions needed for `pallet_glutton`. pub trait WeightInfo { fn initialize_pallet_grow(n: u32, ) -> Weight; fn initialize_pallet_shrink(n: u32, ) -> Weight; @@ -63,39 +62,39 @@ pub trait WeightInfo { fn set_storage() -> Weight; } -/// Weights for pallet_glutton using the Substrate node and recommended hardware. +/// Weights for `pallet_glutton` using the Substrate node and recommended hardware. pub struct SubstrateWeight(PhantomData); impl WeightInfo for SubstrateWeight { - /// Storage: Glutton TrashDataCount (r:1 w:1) - /// Proof: Glutton TrashDataCount (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: Glutton TrashData (r:0 w:1000) - /// Proof: Glutton TrashData (max_values: Some(65000), max_size: Some(1036), added: 3016, mode: MaxEncodedLen) + /// Storage: `Glutton::TrashDataCount` (r:1 w:1) + /// Proof: `Glutton::TrashDataCount` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `Glutton::TrashData` (r:0 w:1000) + /// Proof: `Glutton::TrashData` (`max_values`: Some(65000), `max_size`: Some(1036), added: 3016, mode: `MaxEncodedLen`) /// The range of component `n` is `[0, 1000]`. fn initialize_pallet_grow(n: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `86` // Estimated: `1489` - // Minimum execution time: 11_488_000 picoseconds. - Weight::from_parts(93_073_710, 1489) - // Standard Error: 22_390 - .saturating_add(Weight::from_parts(9_572_012, 0).saturating_mul(n.into())) + // Minimum execution time: 8_453_000 picoseconds. + Weight::from_parts(5_470_386, 1489) + // Standard Error: 4_723 + .saturating_add(Weight::from_parts(10_418_732, 0).saturating_mul(n.into())) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(n.into()))) } - /// Storage: Glutton TrashDataCount (r:1 w:1) - /// Proof: Glutton TrashDataCount (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: Glutton TrashData (r:0 w:1000) - /// Proof: Glutton TrashData (max_values: Some(65000), max_size: Some(1036), added: 3016, mode: MaxEncodedLen) + /// Storage: `Glutton::TrashDataCount` (r:1 w:1) + /// Proof: `Glutton::TrashDataCount` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `Glutton::TrashData` (r:0 w:1000) + /// Proof: `Glutton::TrashData` (`max_values`: Some(65000), `max_size`: Some(1036), added: 3016, mode: `MaxEncodedLen`) /// The range of component `n` is `[0, 1000]`. fn initialize_pallet_shrink(n: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `119` // Estimated: `1489` - // Minimum execution time: 11_378_000 picoseconds. - Weight::from_parts(5_591_508, 1489) - // Standard Error: 1_592 - .saturating_add(Weight::from_parts(1_163_758, 0).saturating_mul(n.into())) + // Minimum execution time: 8_646_000 picoseconds. + Weight::from_parts(7_948_965, 1489) + // Standard Error: 2_154 + .saturating_add(Weight::from_parts(1_197_352, 0).saturating_mul(n.into())) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(n.into()))) @@ -105,119 +104,119 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 669_000 picoseconds. - Weight::from_parts(990_745, 0) - // Standard Error: 10 - .saturating_add(Weight::from_parts(105_224, 0).saturating_mul(i.into())) + // Minimum execution time: 643_000 picoseconds. + Weight::from_parts(4_035_744, 0) + // Standard Error: 14 + .saturating_add(Weight::from_parts(105_406, 0).saturating_mul(i.into())) } - /// Storage: Glutton TrashData (r:5000 w:0) - /// Proof: Glutton TrashData (max_values: Some(65000), max_size: Some(1036), added: 3016, mode: MaxEncodedLen) + /// Storage: `Glutton::TrashData` (r:5000 w:0) + /// Proof: `Glutton::TrashData` (`max_values`: Some(65000), `max_size`: Some(1036), added: 3016, mode: `MaxEncodedLen`) /// The range of component `i` is `[0, 5000]`. fn waste_proof_size_some(i: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `119114 + i * (1022 ±0)` // Estimated: `990 + i * (3016 ±0)` - // Minimum execution time: 435_000 picoseconds. - Weight::from_parts(66_547_542, 990) - // Standard Error: 4_557 - .saturating_add(Weight::from_parts(5_851_324, 0).saturating_mul(i.into())) + // Minimum execution time: 228_000 picoseconds. + Weight::from_parts(62_060_711, 990) + // Standard Error: 5_638 + .saturating_add(Weight::from_parts(5_970_065, 0).saturating_mul(i.into())) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(i.into()))) .saturating_add(Weight::from_parts(0, 3016).saturating_mul(i.into())) } - /// Storage: Glutton Storage (r:1 w:0) - /// Proof: Glutton Storage (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - /// Storage: Glutton Compute (r:1 w:0) - /// Proof: Glutton Compute (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - /// Storage: Glutton TrashData (r:1737 w:0) - /// Proof: Glutton TrashData (max_values: Some(65000), max_size: Some(1036), added: 3016, mode: MaxEncodedLen) + /// Storage: `Glutton::Storage` (r:1 w:0) + /// Proof: `Glutton::Storage` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `MaxEncodedLen`) + /// Storage: `Glutton::Compute` (r:1 w:0) + /// Proof: `Glutton::Compute` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `MaxEncodedLen`) + /// Storage: `Glutton::TrashData` (r:1737 w:0) + /// Proof: `Glutton::TrashData` (`max_values`: Some(65000), `max_size`: Some(1036), added: 3016, mode: `MaxEncodedLen`) fn on_idle_high_proof_waste() -> Weight { // Proof Size summary in bytes: // Measured: `1900497` // Estimated: `5239782` - // Minimum execution time: 67_699_845_000 picoseconds. - Weight::from_parts(67_893_204_000, 5239782) + // Minimum execution time: 57_557_511_000 picoseconds. + Weight::from_parts(57_644_868_000, 5239782) .saturating_add(T::DbWeight::get().reads(1739_u64)) } - /// Storage: Glutton Storage (r:1 w:0) - /// Proof: Glutton Storage (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - /// Storage: Glutton Compute (r:1 w:0) - /// Proof: Glutton Compute (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - /// Storage: Glutton TrashData (r:5 w:0) - /// Proof: Glutton TrashData (max_values: Some(65000), max_size: Some(1036), added: 3016, mode: MaxEncodedLen) + /// Storage: `Glutton::Storage` (r:1 w:0) + /// Proof: `Glutton::Storage` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `MaxEncodedLen`) + /// Storage: `Glutton::Compute` (r:1 w:0) + /// Proof: `Glutton::Compute` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `MaxEncodedLen`) + /// Storage: `Glutton::TrashData` (r:5 w:0) + /// Proof: `Glutton::TrashData` (`max_values`: Some(65000), `max_size`: Some(1036), added: 3016, mode: `MaxEncodedLen`) fn on_idle_low_proof_waste() -> Weight { // Proof Size summary in bytes: // Measured: `9547` // Estimated: `16070` - // Minimum execution time: 122_297_527_000 picoseconds. - Weight::from_parts(122_394_818_000, 16070) + // Minimum execution time: 101_362_469_000 picoseconds. + Weight::from_parts(101_583_065_000, 16070) .saturating_add(T::DbWeight::get().reads(7_u64)) } - /// Storage: Glutton Storage (r:1 w:0) - /// Proof: Glutton Storage (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - /// Storage: Glutton Compute (r:1 w:0) - /// Proof: Glutton Compute (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) + /// Storage: `Glutton::Storage` (r:1 w:0) + /// Proof: `Glutton::Storage` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `MaxEncodedLen`) + /// Storage: `Glutton::Compute` (r:1 w:0) + /// Proof: `Glutton::Compute` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `MaxEncodedLen`) fn empty_on_idle() -> Weight { // Proof Size summary in bytes: // Measured: `86` // Estimated: `1493` - // Minimum execution time: 5_882_000 picoseconds. - Weight::from_parts(6_138_000, 1493) + // Minimum execution time: 5_118_000 picoseconds. + Weight::from_parts(5_320_000, 1493) .saturating_add(T::DbWeight::get().reads(2_u64)) } - /// Storage: Glutton Compute (r:0 w:1) - /// Proof: Glutton Compute (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) + /// Storage: `Glutton::Compute` (r:0 w:1) + /// Proof: `Glutton::Compute` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `MaxEncodedLen`) fn set_compute() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_830_000 picoseconds. - Weight::from_parts(8_366_000, 0) + // Minimum execution time: 5_925_000 picoseconds. + Weight::from_parts(6_193_000, 0) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: Glutton Storage (r:0 w:1) - /// Proof: Glutton Storage (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) + /// Storage: `Glutton::Storage` (r:0 w:1) + /// Proof: `Glutton::Storage` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `MaxEncodedLen`) fn set_storage() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_933_000 picoseconds. - Weight::from_parts(8_213_000, 0) + // Minimum execution time: 5_912_000 picoseconds. + Weight::from_parts(6_170_000, 0) .saturating_add(T::DbWeight::get().writes(1_u64)) } } -// For backwards compatibility and tests +// For backwards compatibility and tests. impl WeightInfo for () { - /// Storage: Glutton TrashDataCount (r:1 w:1) - /// Proof: Glutton TrashDataCount (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: Glutton TrashData (r:0 w:1000) - /// Proof: Glutton TrashData (max_values: Some(65000), max_size: Some(1036), added: 3016, mode: MaxEncodedLen) + /// Storage: `Glutton::TrashDataCount` (r:1 w:1) + /// Proof: `Glutton::TrashDataCount` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `Glutton::TrashData` (r:0 w:1000) + /// Proof: `Glutton::TrashData` (`max_values`: Some(65000), `max_size`: Some(1036), added: 3016, mode: `MaxEncodedLen`) /// The range of component `n` is `[0, 1000]`. fn initialize_pallet_grow(n: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `86` // Estimated: `1489` - // Minimum execution time: 11_488_000 picoseconds. - Weight::from_parts(93_073_710, 1489) - // Standard Error: 22_390 - .saturating_add(Weight::from_parts(9_572_012, 0).saturating_mul(n.into())) + // Minimum execution time: 8_453_000 picoseconds. + Weight::from_parts(5_470_386, 1489) + // Standard Error: 4_723 + .saturating_add(Weight::from_parts(10_418_732, 0).saturating_mul(n.into())) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) .saturating_add(RocksDbWeight::get().writes((1_u64).saturating_mul(n.into()))) } - /// Storage: Glutton TrashDataCount (r:1 w:1) - /// Proof: Glutton TrashDataCount (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: Glutton TrashData (r:0 w:1000) - /// Proof: Glutton TrashData (max_values: Some(65000), max_size: Some(1036), added: 3016, mode: MaxEncodedLen) + /// Storage: `Glutton::TrashDataCount` (r:1 w:1) + /// Proof: `Glutton::TrashDataCount` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `Glutton::TrashData` (r:0 w:1000) + /// Proof: `Glutton::TrashData` (`max_values`: Some(65000), `max_size`: Some(1036), added: 3016, mode: `MaxEncodedLen`) /// The range of component `n` is `[0, 1000]`. fn initialize_pallet_shrink(n: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `119` // Estimated: `1489` - // Minimum execution time: 11_378_000 picoseconds. - Weight::from_parts(5_591_508, 1489) - // Standard Error: 1_592 - .saturating_add(Weight::from_parts(1_163_758, 0).saturating_mul(n.into())) + // Minimum execution time: 8_646_000 picoseconds. + Weight::from_parts(7_948_965, 1489) + // Standard Error: 2_154 + .saturating_add(Weight::from_parts(1_197_352, 0).saturating_mul(n.into())) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) .saturating_add(RocksDbWeight::get().writes((1_u64).saturating_mul(n.into()))) @@ -227,83 +226,83 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 669_000 picoseconds. - Weight::from_parts(990_745, 0) - // Standard Error: 10 - .saturating_add(Weight::from_parts(105_224, 0).saturating_mul(i.into())) + // Minimum execution time: 643_000 picoseconds. + Weight::from_parts(4_035_744, 0) + // Standard Error: 14 + .saturating_add(Weight::from_parts(105_406, 0).saturating_mul(i.into())) } - /// Storage: Glutton TrashData (r:5000 w:0) - /// Proof: Glutton TrashData (max_values: Some(65000), max_size: Some(1036), added: 3016, mode: MaxEncodedLen) + /// Storage: `Glutton::TrashData` (r:5000 w:0) + /// Proof: `Glutton::TrashData` (`max_values`: Some(65000), `max_size`: Some(1036), added: 3016, mode: `MaxEncodedLen`) /// The range of component `i` is `[0, 5000]`. fn waste_proof_size_some(i: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `119114 + i * (1022 ±0)` // Estimated: `990 + i * (3016 ±0)` - // Minimum execution time: 435_000 picoseconds. - Weight::from_parts(66_547_542, 990) - // Standard Error: 4_557 - .saturating_add(Weight::from_parts(5_851_324, 0).saturating_mul(i.into())) + // Minimum execution time: 228_000 picoseconds. + Weight::from_parts(62_060_711, 990) + // Standard Error: 5_638 + .saturating_add(Weight::from_parts(5_970_065, 0).saturating_mul(i.into())) .saturating_add(RocksDbWeight::get().reads((1_u64).saturating_mul(i.into()))) .saturating_add(Weight::from_parts(0, 3016).saturating_mul(i.into())) } - /// Storage: Glutton Storage (r:1 w:0) - /// Proof: Glutton Storage (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - /// Storage: Glutton Compute (r:1 w:0) - /// Proof: Glutton Compute (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - /// Storage: Glutton TrashData (r:1737 w:0) - /// Proof: Glutton TrashData (max_values: Some(65000), max_size: Some(1036), added: 3016, mode: MaxEncodedLen) + /// Storage: `Glutton::Storage` (r:1 w:0) + /// Proof: `Glutton::Storage` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `MaxEncodedLen`) + /// Storage: `Glutton::Compute` (r:1 w:0) + /// Proof: `Glutton::Compute` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `MaxEncodedLen`) + /// Storage: `Glutton::TrashData` (r:1737 w:0) + /// Proof: `Glutton::TrashData` (`max_values`: Some(65000), `max_size`: Some(1036), added: 3016, mode: `MaxEncodedLen`) fn on_idle_high_proof_waste() -> Weight { // Proof Size summary in bytes: // Measured: `1900497` // Estimated: `5239782` - // Minimum execution time: 67_699_845_000 picoseconds. - Weight::from_parts(67_893_204_000, 5239782) + // Minimum execution time: 57_557_511_000 picoseconds. + Weight::from_parts(57_644_868_000, 5239782) .saturating_add(RocksDbWeight::get().reads(1739_u64)) } - /// Storage: Glutton Storage (r:1 w:0) - /// Proof: Glutton Storage (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - /// Storage: Glutton Compute (r:1 w:0) - /// Proof: Glutton Compute (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - /// Storage: Glutton TrashData (r:5 w:0) - /// Proof: Glutton TrashData (max_values: Some(65000), max_size: Some(1036), added: 3016, mode: MaxEncodedLen) + /// Storage: `Glutton::Storage` (r:1 w:0) + /// Proof: `Glutton::Storage` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `MaxEncodedLen`) + /// Storage: `Glutton::Compute` (r:1 w:0) + /// Proof: `Glutton::Compute` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `MaxEncodedLen`) + /// Storage: `Glutton::TrashData` (r:5 w:0) + /// Proof: `Glutton::TrashData` (`max_values`: Some(65000), `max_size`: Some(1036), added: 3016, mode: `MaxEncodedLen`) fn on_idle_low_proof_waste() -> Weight { // Proof Size summary in bytes: // Measured: `9547` // Estimated: `16070` - // Minimum execution time: 122_297_527_000 picoseconds. - Weight::from_parts(122_394_818_000, 16070) + // Minimum execution time: 101_362_469_000 picoseconds. + Weight::from_parts(101_583_065_000, 16070) .saturating_add(RocksDbWeight::get().reads(7_u64)) } - /// Storage: Glutton Storage (r:1 w:0) - /// Proof: Glutton Storage (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - /// Storage: Glutton Compute (r:1 w:0) - /// Proof: Glutton Compute (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) + /// Storage: `Glutton::Storage` (r:1 w:0) + /// Proof: `Glutton::Storage` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `MaxEncodedLen`) + /// Storage: `Glutton::Compute` (r:1 w:0) + /// Proof: `Glutton::Compute` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `MaxEncodedLen`) fn empty_on_idle() -> Weight { // Proof Size summary in bytes: // Measured: `86` // Estimated: `1493` - // Minimum execution time: 5_882_000 picoseconds. - Weight::from_parts(6_138_000, 1493) + // Minimum execution time: 5_118_000 picoseconds. + Weight::from_parts(5_320_000, 1493) .saturating_add(RocksDbWeight::get().reads(2_u64)) } - /// Storage: Glutton Compute (r:0 w:1) - /// Proof: Glutton Compute (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) + /// Storage: `Glutton::Compute` (r:0 w:1) + /// Proof: `Glutton::Compute` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `MaxEncodedLen`) fn set_compute() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_830_000 picoseconds. - Weight::from_parts(8_366_000, 0) + // Minimum execution time: 5_925_000 picoseconds. + Weight::from_parts(6_193_000, 0) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Glutton Storage (r:0 w:1) - /// Proof: Glutton Storage (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) + /// Storage: `Glutton::Storage` (r:0 w:1) + /// Proof: `Glutton::Storage` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `MaxEncodedLen`) fn set_storage() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_933_000 picoseconds. - Weight::from_parts(8_213_000, 0) + // Minimum execution time: 5_912_000 picoseconds. + Weight::from_parts(6_170_000, 0) .saturating_add(RocksDbWeight::get().writes(1_u64)) } } diff --git a/substrate/frame/grandpa/Cargo.toml b/substrate/frame/grandpa/Cargo.toml index 3775ccdac1dc2cddaa59f995d51eae76b4495028..f4dd92129f38aeb76a1df8afd21494102eb68bd9 100644 --- a/substrate/frame/grandpa/Cargo.toml +++ b/substrate/frame/grandpa/Cargo.toml @@ -17,8 +17,8 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } -log = { version = "0.4.17", default-features = false } -scale-info = { version = "2.10.0", default-features = false, features = ["derive", "serde"] } +log = { workspace = true } +scale-info = { version = "2.11.1", default-features = false, features = ["derive", "serde"] } frame-benchmarking = { path = "../benchmarking", default-features = false, optional = true } frame-support = { path = "../support", default-features = false } frame-system = { path = "../system", default-features = false } diff --git a/substrate/frame/grandpa/src/benchmarking.rs b/substrate/frame/grandpa/src/benchmarking.rs index 7a87f0c4b07881864aefd8eb5aad55ea41fc713d..c89592b3b3590cc6c99b2a9e546eb7a280e843c5 100644 --- a/substrate/frame/grandpa/src/benchmarking.rs +++ b/substrate/frame/grandpa/src/benchmarking.rs @@ -29,7 +29,7 @@ benchmarks! { // NOTE: generated with the test below `test_generate_equivocation_report_blob`. // the output should be deterministic since the keys we use are static. // with the current benchmark setup it is not possible to generate this - // programatically from the benchmark setup. + // programmatically from the benchmark setup. const EQUIVOCATION_PROOF_BLOB: [u8; 257] = [ 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 136, 220, 52, 23, 213, 5, 142, 196, 180, 80, 62, 12, 18, 234, 26, 10, 137, 190, 32, diff --git a/substrate/frame/grandpa/src/lib.rs b/substrate/frame/grandpa/src/lib.rs index 0b9f2b3582792e9d93695d34656912a8d70a131f..90bcd8721dfa1f6d091edc34da883c2172d9f6ca 100644 --- a/substrate/frame/grandpa/src/lib.rs +++ b/substrate/frame/grandpa/src/lib.rs @@ -73,7 +73,7 @@ pub mod pallet { use frame_support::{dispatch::DispatchResult, pallet_prelude::*}; use frame_system::pallet_prelude::*; - /// The current storage version. + /// The in-code storage version. const STORAGE_VERSION: StorageVersion = StorageVersion::new(5); #[pallet::pallet] diff --git a/substrate/frame/grandpa/src/migrations.rs b/substrate/frame/grandpa/src/migrations.rs index 3a484eb60d284c3988a1c2e1fad49bdc10d03b6a..9d0522c3a6e7281d206d4d7e606a22362a801f49 100644 --- a/substrate/frame/grandpa/src/migrations.rs +++ b/substrate/frame/grandpa/src/migrations.rs @@ -35,7 +35,7 @@ mod v5; /// This migration should be added with a runtime upgrade that introduces the /// `MaxSetIdSessionEntries` constant to the pallet (although it could also be /// done later on). -pub struct CleanupSetIdSessionMap(sp_std::marker::PhantomData); +pub struct CleanupSetIdSessionMap(core::marker::PhantomData); impl OnRuntimeUpgrade for CleanupSetIdSessionMap { fn on_runtime_upgrade() -> Weight { // NOTE: since this migration will loop over all stale entries in the diff --git a/substrate/frame/grandpa/src/migrations/v5.rs b/substrate/frame/grandpa/src/migrations/v5.rs index 24cfc34104b5f31cca70f93bc53309ee954a2d42..a0865a3f2bf9a8b6be340065b8b4658c97d5050a 100644 --- a/substrate/frame/grandpa/src/migrations/v5.rs +++ b/substrate/frame/grandpa/src/migrations/v5.rs @@ -20,7 +20,7 @@ use codec::Decode; use frame_support::{ migrations::VersionedMigration, storage, - traits::{Get, OnRuntimeUpgrade}, + traits::{Get, UncheckedOnRuntimeUpgrade}, weights::Weight, }; use sp_consensus_grandpa::AuthorityList; @@ -36,9 +36,9 @@ fn load_authority_list() -> AuthorityList { } /// Actual implementation of [`MigrateV4ToV5`]. -pub struct MigrateImpl(PhantomData); +pub struct UncheckedMigrateImpl(PhantomData); -impl OnRuntimeUpgrade for MigrateImpl { +impl UncheckedOnRuntimeUpgrade for UncheckedMigrateImpl { #[cfg(feature = "try-runtime")] fn pre_upgrade() -> Result, sp_runtime::TryRuntimeError> { use codec::Encode; @@ -92,5 +92,10 @@ impl OnRuntimeUpgrade for MigrateImpl { /// Migrate the storage from V4 to V5. /// /// Switches from `GRANDPA_AUTHORITIES_KEY` to a normal FRAME storage item. -pub type MigrateV4ToV5 = - VersionedMigration<4, 5, MigrateImpl, Pallet, ::DbWeight>; +pub type MigrateV4ToV5 = VersionedMigration< + 4, + 5, + UncheckedMigrateImpl, + Pallet, + ::DbWeight, +>; diff --git a/substrate/frame/grandpa/src/mock.rs b/substrate/frame/grandpa/src/mock.rs index 990a820d3a94addac60a0d47699064df6470d812..4a21da655e5b3d4b219caed097619fa3268eca57 100644 --- a/substrate/frame/grandpa/src/mock.rs +++ b/substrate/frame/grandpa/src/mock.rs @@ -38,7 +38,7 @@ use sp_runtime::{ curve::PiecewiseLinear, impl_opaque_keys, testing::{TestXt, UintAuthorityId}, - traits::{IdentityLookup, OpaqueKeys}, + traits::OpaqueKeys, BuildStorage, DigestItem, Perbill, }; use sp_staking::{EraIndex, SessionIndex}; @@ -66,31 +66,10 @@ impl_opaque_keys! { } } -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { - type BaseCallFilter = frame_support::traits::Everything; - type BlockWeights = (); - type BlockLength = (); - type DbWeight = (); - type RuntimeOrigin = RuntimeOrigin; - type Nonce = u64; - type RuntimeCall = RuntimeCall; - type Hash = H256; - type Hashing = sp_runtime::traits::BlakeTwo256; - type AccountId = u64; - type Lookup = IdentityLookup; type Block = Block; - type RuntimeEvent = RuntimeEvent; - type BlockHashCount = ConstU64<250>; - type Version = (); - type PalletInfo = PalletInfo; type AccountData = pallet_balances::AccountData; - type OnNewAccount = (); - type OnKilledAccount = (); - type SystemWeightInfo = (); - type SS58Prefix = (); - type OnSetCode = (); - type MaxConsumers = frame_support::traits::ConstU32<16>; } impl frame_system::offchain::SendTransactionTypes for Test diff --git a/substrate/frame/grandpa/src/tests.rs b/substrate/frame/grandpa/src/tests.rs index 993d72af6d41062a24362bbbdaf394cb651dd2c7..8b12d63adaadb27c3835f29d8345bd6e6a5b6997 100644 --- a/substrate/frame/grandpa/src/tests.rs +++ b/substrate/frame/grandpa/src/tests.rs @@ -634,7 +634,7 @@ fn report_equivocation_invalid_equivocation_proof() { (1, H256::zero(), 10, &equivocation_keyring), )); - // votes targetting different rounds, there is no equivocation. + // votes targeting different rounds, there is no equivocation. assert_invalid_equivocation_proof(generate_equivocation_proof( set_id, (1, H256::random(), 10, &equivocation_keyring), diff --git a/substrate/frame/identity/Cargo.toml b/substrate/frame/identity/Cargo.toml index ba1fd500f707566743ea4aa3c3b80ddd4a9d167b..8c0052004ae3d595f3d1f0bef75d92584d3c3ff5 100644 --- a/substrate/frame/identity/Cargo.toml +++ b/substrate/frame/identity/Cargo.toml @@ -18,8 +18,8 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive", "max-encoded-len"] } enumflags2 = { version = "0.7.7" } -log = { version = "0.4.17", default-features = false } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +log = { workspace = true } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } frame-benchmarking = { path = "../benchmarking", default-features = false, optional = true } frame-support = { path = "../support", default-features = false } frame-system = { path = "../system", default-features = false } diff --git a/substrate/frame/identity/src/benchmarking.rs b/substrate/frame/identity/src/benchmarking.rs index fe2fb0b048933c13425c0127b752bf773e00bea2..cdcdb9522615d0439f4d8370551d73b710edc685 100644 --- a/substrate/frame/identity/src/benchmarking.rs +++ b/substrate/frame/identity/src/benchmarking.rs @@ -23,9 +23,7 @@ use super::*; use crate::Pallet as Identity; use codec::Encode; -use frame_benchmarking::{ - account, impl_benchmark_test_suite, v2::*, whitelisted_caller, BenchmarkError, -}; +use frame_benchmarking::{account, v2::*, whitelisted_caller, BenchmarkError}; use frame_support::{ assert_ok, ensure, traits::{EnsureOrigin, Get, OnFinalize, OnInitialize}, @@ -673,10 +671,10 @@ mod benchmarks { let username = bounded_username::(bench_username(), bench_suffix()); Identity::::queue_acceptance(&caller, username.clone()); - let expected_exiration = + let expected_expiration = frame_system::Pallet::::block_number() + T::PendingUsernameExpiration::get(); - run_to_block::(expected_exiration + One::one()); + run_to_block::(expected_expiration + One::one()); #[extrinsic_call] _(RawOrigin::Signed(caller.clone()), username); diff --git a/substrate/frame/identity/src/lib.rs b/substrate/frame/identity/src/lib.rs index 78d59180b3f2f8ca684dc52d9e218de8914575b8..4a977880b3150cf9ffa7e2b4032e258483a6d242 100644 --- a/substrate/frame/identity/src/lib.rs +++ b/substrate/frame/identity/src/lib.rs @@ -161,7 +161,7 @@ pub mod pallet { /// Structure holding information about an identity. type IdentityInformation: IdentityInformationProvider; - /// Maxmimum number of registrars allowed in the system. Needed to bound the complexity + /// Maximum number of registrars allowed in the system. Needed to bound the complexity /// of, e.g., updating judgements. #[pallet::constant] type MaxRegistrars: Get; diff --git a/substrate/frame/identity/src/migration.rs b/substrate/frame/identity/src/migration.rs index 88ac08d1bf5648e2640a2a248fb8d56113ef3c3a..8725bfd39df1409516c84d12e78b9d0f4bb03fc3 100644 --- a/substrate/frame/identity/src/migration.rs +++ b/substrate/frame/identity/src/migration.rs @@ -16,7 +16,9 @@ //! Storage migrations for the Identity pallet. use super::*; -use frame_support::{migrations::VersionedMigration, pallet_prelude::*, traits::OnRuntimeUpgrade}; +use frame_support::{ + migrations::VersionedMigration, pallet_prelude::*, traits::UncheckedOnRuntimeUpgrade, +}; #[cfg(feature = "try-runtime")] use codec::{Decode, Encode}; @@ -66,7 +68,7 @@ pub mod v1 { /// prevent stalling a parachain by accumulating too much weight in the migration. To have an /// unlimited migration (e.g. in a chain without PoV limits), set this to `u64::MAX`. pub struct VersionUncheckedMigrateV0ToV1(PhantomData); - impl OnRuntimeUpgrade for VersionUncheckedMigrateV0ToV1 { + impl UncheckedOnRuntimeUpgrade for VersionUncheckedMigrateV0ToV1 { #[cfg(feature = "try-runtime")] fn pre_upgrade() -> Result, TryRuntimeError> { let identities = v0::IdentityOf::::iter().count(); diff --git a/substrate/frame/identity/src/tests.rs b/substrate/frame/identity/src/tests.rs index 5c9304ca8c13d9eac1ed1f6e8a90d8ba0b5493f1..0a9464256ce3fbf7bf84d0a463b9c00ad87bef29 100644 --- a/substrate/frame/identity/src/tests.rs +++ b/substrate/frame/identity/src/tests.rs @@ -53,31 +53,12 @@ frame_support::construct_runtime!( } ); -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { - type BaseCallFilter = frame_support::traits::Everything; - type BlockWeights = (); - type BlockLength = (); - type RuntimeOrigin = RuntimeOrigin; - type Nonce = u64; - type Hash = H256; - type RuntimeCall = RuntimeCall; - type Hashing = BlakeTwo256; type AccountId = AccountId; type Lookup = IdentityLookup; type Block = Block; - type RuntimeEvent = RuntimeEvent; - type BlockHashCount = ConstU64<250>; - type DbWeight = (); - type Version = (); - type PalletInfo = PalletInfo; type AccountData = pallet_balances::AccountData; - type OnNewAccount = (); - type OnKilledAccount = (); - type SystemWeightInfo = (); - type SS58Prefix = (); - type OnSetCode = (); - type MaxConsumers = ConstU32<16>; } impl pallet_balances::Config for Test { diff --git a/substrate/frame/identity/src/weights.rs b/substrate/frame/identity/src/weights.rs index 1feb8252c845383ff8a31f2f992e6cf6b3c0001d..008d5465bb4f3ef75df96dcc8d6687f92f6697d5 100644 --- a/substrate/frame/identity/src/weights.rs +++ b/substrate/frame/identity/src/weights.rs @@ -15,16 +15,16 @@ // See the License for the specific language governing permissions and // limitations under the License. -//! Autogenerated weights for pallet_identity +//! Autogenerated weights for `pallet_identity` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-06-16, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-04-09, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-e8ezs4ez-project-145-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("dev"), DB CACHE: 1024 +//! HOSTNAME: `runner-anb7yjbi-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: `1024` // Executed Command: -// ./target/production/substrate +// ./target/production/substrate-node // benchmark // pallet // --chain=dev @@ -35,12 +35,11 @@ // --no-median-slopes // --no-min-squares // --extrinsic=* -// --execution=wasm // --wasm-execution=compiled // --heap-pages=4096 -// --output=./frame/identity/src/weights.rs -// --header=./HEADER-APACHE2 -// --template=./.maintain/frame-weight-template.hbs +// --output=./substrate/frame/identity/src/weights.rs +// --header=./substrate/HEADER-APACHE2 +// --template=./substrate/.maintain/frame-weight-template.hbs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -50,7 +49,7 @@ use frame_support::{traits::Get, weights::{Weight, constants::RocksDbWeight}}; use core::marker::PhantomData; -/// Weight functions needed for pallet_identity. +/// Weight functions needed for `pallet_identity`. pub trait WeightInfo { fn add_registrar(r: u32, ) -> Weight; fn set_identity(r: u32, ) -> Weight; @@ -77,278 +76,278 @@ pub trait WeightInfo { fn remove_dangling_username() -> Weight; } -/// Weights for pallet_identity using the Substrate node and recommended hardware. +/// Weights for `pallet_identity` using the Substrate node and recommended hardware. pub struct SubstrateWeight(PhantomData); impl WeightInfo for SubstrateWeight { - /// Storage: Identity Registrars (r:1 w:1) - /// Proof: Identity Registrars (max_values: Some(1), max_size: Some(1141), added: 1636, mode: MaxEncodedLen) + /// Storage: `Identity::Registrars` (r:1 w:1) + /// Proof: `Identity::Registrars` (`max_values`: Some(1), `max_size`: Some(1141), added: 1636, mode: `MaxEncodedLen`) /// The range of component `r` is `[1, 19]`. fn add_registrar(r: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `32 + r * (57 ±0)` // Estimated: `2626` - // Minimum execution time: 11_683_000 picoseconds. - Weight::from_parts(12_515_830, 2626) - // Standard Error: 2_154 - .saturating_add(Weight::from_parts(147_919, 0).saturating_mul(r.into())) + // Minimum execution time: 8_696_000 picoseconds. + Weight::from_parts(9_620_793, 2626) + // Standard Error: 1_909 + .saturating_add(Weight::from_parts(94_977, 0).saturating_mul(r.into())) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: Identity IdentityOf (r:1 w:1) - /// Proof: Identity IdentityOf (max_values: None, max_size: Some(7538), added: 10013, mode: MaxEncodedLen) + /// Storage: `Identity::IdentityOf` (r:1 w:1) + /// Proof: `Identity::IdentityOf` (`max_values`: None, `max_size`: Some(7572), added: 10047, mode: `MaxEncodedLen`) /// The range of component `r` is `[1, 20]`. fn set_identity(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `442 + r * (5 ±0)` - // Estimated: `11003` - // Minimum execution time: 32_949_000 picoseconds. - Weight::from_parts(31_329_634, 11003) - // Standard Error: 4_496 - .saturating_add(Weight::from_parts(203_570, 0).saturating_mul(r.into())) + // Measured: `6978 + r * (5 ±0)` + // Estimated: `11037` + // Minimum execution time: 110_950_000 picoseconds. + Weight::from_parts(112_705_139, 11037) + // Standard Error: 6_475 + .saturating_add(Weight::from_parts(212_737, 0).saturating_mul(r.into())) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: Identity IdentityOf (r:1 w:0) - /// Proof: Identity IdentityOf (max_values: None, max_size: Some(7538), added: 10013, mode: MaxEncodedLen) - /// Storage: Identity SubsOf (r:1 w:1) - /// Proof: Identity SubsOf (max_values: None, max_size: Some(3258), added: 5733, mode: MaxEncodedLen) - /// Storage: Identity SuperOf (r:100 w:100) - /// Proof: Identity SuperOf (max_values: None, max_size: Some(114), added: 2589, mode: MaxEncodedLen) + /// Storage: `Identity::IdentityOf` (r:1 w:0) + /// Proof: `Identity::IdentityOf` (`max_values`: None, `max_size`: Some(7572), added: 10047, mode: `MaxEncodedLen`) + /// Storage: `Identity::SubsOf` (r:1 w:1) + /// Proof: `Identity::SubsOf` (`max_values`: None, `max_size`: Some(3258), added: 5733, mode: `MaxEncodedLen`) + /// Storage: `Identity::SuperOf` (r:100 w:100) + /// Proof: `Identity::SuperOf` (`max_values`: None, `max_size`: Some(114), added: 2589, mode: `MaxEncodedLen`) /// The range of component `s` is `[0, 100]`. fn set_subs_new(s: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `101` - // Estimated: `11003 + s * (2589 ±0)` - // Minimum execution time: 9_157_000 picoseconds. - Weight::from_parts(24_917_444, 11003) - // Standard Error: 4_554 - .saturating_add(Weight::from_parts(3_279_868, 0).saturating_mul(s.into())) + // Estimated: `11037 + s * (2589 ±0)` + // Minimum execution time: 9_440_000 picoseconds. + Weight::from_parts(23_266_871, 11037) + // Standard Error: 10_640 + .saturating_add(Weight::from_parts(3_663_971, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(s.into()))) .saturating_add(T::DbWeight::get().writes(1_u64)) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(s.into()))) .saturating_add(Weight::from_parts(0, 2589).saturating_mul(s.into())) } - /// Storage: Identity IdentityOf (r:1 w:0) - /// Proof: Identity IdentityOf (max_values: None, max_size: Some(7538), added: 10013, mode: MaxEncodedLen) - /// Storage: Identity SubsOf (r:1 w:1) - /// Proof: Identity SubsOf (max_values: None, max_size: Some(3258), added: 5733, mode: MaxEncodedLen) - /// Storage: Identity SuperOf (r:0 w:100) - /// Proof: Identity SuperOf (max_values: None, max_size: Some(114), added: 2589, mode: MaxEncodedLen) + /// Storage: `Identity::IdentityOf` (r:1 w:0) + /// Proof: `Identity::IdentityOf` (`max_values`: None, `max_size`: Some(7572), added: 10047, mode: `MaxEncodedLen`) + /// Storage: `Identity::SubsOf` (r:1 w:1) + /// Proof: `Identity::SubsOf` (`max_values`: None, `max_size`: Some(3258), added: 5733, mode: `MaxEncodedLen`) + /// Storage: `Identity::SuperOf` (r:0 w:100) + /// Proof: `Identity::SuperOf` (`max_values`: None, `max_size`: Some(114), added: 2589, mode: `MaxEncodedLen`) /// The range of component `p` is `[0, 100]`. fn set_subs_old(p: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `194 + p * (32 ±0)` - // Estimated: `11003` - // Minimum execution time: 9_240_000 picoseconds. - Weight::from_parts(23_326_035, 11003) - // Standard Error: 3_664 - .saturating_add(Weight::from_parts(1_439_873, 0).saturating_mul(p.into())) + // Estimated: `11037` + // Minimum execution time: 9_588_000 picoseconds. + Weight::from_parts(22_403_362, 11037) + // Standard Error: 3_359 + .saturating_add(Weight::from_parts(1_557_280, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(p.into()))) } - /// Storage: Identity SubsOf (r:1 w:1) - /// Proof: Identity SubsOf (max_values: None, max_size: Some(3258), added: 5733, mode: MaxEncodedLen) - /// Storage: Identity IdentityOf (r:1 w:1) - /// Proof: Identity IdentityOf (max_values: None, max_size: Some(7538), added: 10013, mode: MaxEncodedLen) - /// Storage: Identity SuperOf (r:0 w:100) - /// Proof: Identity SuperOf (max_values: None, max_size: Some(114), added: 2589, mode: MaxEncodedLen) + /// Storage: `Identity::SubsOf` (r:1 w:1) + /// Proof: `Identity::SubsOf` (`max_values`: None, `max_size`: Some(3258), added: 5733, mode: `MaxEncodedLen`) + /// Storage: `Identity::IdentityOf` (r:1 w:1) + /// Proof: `Identity::IdentityOf` (`max_values`: None, `max_size`: Some(7572), added: 10047, mode: `MaxEncodedLen`) + /// Storage: `Identity::SuperOf` (r:0 w:100) + /// Proof: `Identity::SuperOf` (`max_values`: None, `max_size`: Some(114), added: 2589, mode: `MaxEncodedLen`) /// The range of component `r` is `[1, 20]`. /// The range of component `s` is `[0, 100]`. fn clear_identity(r: u32, s: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `469 + r * (5 ±0) + s * (32 ±0) + x * (66 ±0)` - // Estimated: `11003` - // Minimum execution time: 55_687_000 picoseconds. - Weight::from_parts(30_695_182, 11003) - // Standard Error: 9_921 - .saturating_add(Weight::from_parts(162_357, 0).saturating_mul(r.into())) - // Standard Error: 1_937 - .saturating_add(Weight::from_parts(1_427_998, 0).saturating_mul(s.into())) + // Measured: `7070 + r * (5 ±0) + s * (32 ±0)` + // Estimated: `11037` + // Minimum execution time: 55_387_000 picoseconds. + Weight::from_parts(52_575_769, 11037) + // Standard Error: 17_705 + .saturating_add(Weight::from_parts(268_160, 0).saturating_mul(r.into())) + // Standard Error: 3_454 + .saturating_add(Weight::from_parts(1_576_194, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(s.into()))) } - /// Storage: Identity Registrars (r:1 w:0) - /// Proof: Identity Registrars (max_values: Some(1), max_size: Some(1141), added: 1636, mode: MaxEncodedLen) - /// Storage: Identity IdentityOf (r:1 w:1) - /// Proof: Identity IdentityOf (max_values: None, max_size: Some(7538), added: 10013, mode: MaxEncodedLen) + /// Storage: `Identity::Registrars` (r:1 w:0) + /// Proof: `Identity::Registrars` (`max_values`: Some(1), `max_size`: Some(1141), added: 1636, mode: `MaxEncodedLen`) + /// Storage: `Identity::IdentityOf` (r:1 w:1) + /// Proof: `Identity::IdentityOf` (`max_values`: None, `max_size`: Some(7572), added: 10047, mode: `MaxEncodedLen`) /// The range of component `r` is `[1, 20]`. fn request_judgement(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `367 + r * (57 ±0) + x * (66 ±0)` - // Estimated: `11003` - // Minimum execution time: 34_876_000 picoseconds. - Weight::from_parts(32_207_018, 11003) - // Standard Error: 5_247 - .saturating_add(Weight::from_parts(249_156, 0).saturating_mul(r.into())) + // Measured: `6968 + r * (57 ±0)` + // Estimated: `11037` + // Minimum execution time: 78_243_000 picoseconds. + Weight::from_parts(80_404_226, 11037) + // Standard Error: 5_153 + .saturating_add(Weight::from_parts(149_799, 0).saturating_mul(r.into())) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: Identity IdentityOf (r:1 w:1) - /// Proof: Identity IdentityOf (max_values: None, max_size: Some(7538), added: 10013, mode: MaxEncodedLen) + /// Storage: `Identity::IdentityOf` (r:1 w:1) + /// Proof: `Identity::IdentityOf` (`max_values`: None, `max_size`: Some(7572), added: 10047, mode: `MaxEncodedLen`) /// The range of component `r` is `[1, 20]`. fn cancel_request(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `398 + x * (66 ±0)` - // Estimated: `11003` - // Minimum execution time: 30_689_000 picoseconds. - Weight::from_parts(31_967_170, 11003) - // Standard Error: 5_387 - .saturating_add(Weight::from_parts(42_676, 0).saturating_mul(r.into())) + // Measured: `6999` + // Estimated: `11037` + // Minimum execution time: 73_360_000 picoseconds. + Weight::from_parts(76_216_374, 11037) + // Standard Error: 15_603 + .saturating_add(Weight::from_parts(189_080, 0).saturating_mul(r.into())) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: Identity Registrars (r:1 w:1) - /// Proof: Identity Registrars (max_values: Some(1), max_size: Some(1141), added: 1636, mode: MaxEncodedLen) + /// Storage: `Identity::Registrars` (r:1 w:1) + /// Proof: `Identity::Registrars` (`max_values`: Some(1), `max_size`: Some(1141), added: 1636, mode: `MaxEncodedLen`) /// The range of component `r` is `[1, 19]`. fn set_fee(r: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `89 + r * (57 ±0)` // Estimated: `2626` - // Minimum execution time: 7_357_000 picoseconds. - Weight::from_parts(7_932_950, 2626) - // Standard Error: 1_804 - .saturating_add(Weight::from_parts(132_653, 0).saturating_mul(r.into())) + // Minimum execution time: 6_287_000 picoseconds. + Weight::from_parts(6_721_854, 2626) + // Standard Error: 1_488 + .saturating_add(Weight::from_parts(96_288, 0).saturating_mul(r.into())) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: Identity Registrars (r:1 w:1) - /// Proof: Identity Registrars (max_values: Some(1), max_size: Some(1141), added: 1636, mode: MaxEncodedLen) + /// Storage: `Identity::Registrars` (r:1 w:1) + /// Proof: `Identity::Registrars` (`max_values`: Some(1), `max_size`: Some(1141), added: 1636, mode: `MaxEncodedLen`) /// The range of component `r` is `[1, 19]`. fn set_account_id(r: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `89 + r * (57 ±0)` // Estimated: `2626` - // Minimum execution time: 7_437_000 picoseconds. - Weight::from_parts(8_051_889, 2626) - // Standard Error: 1_997 - .saturating_add(Weight::from_parts(129_592, 0).saturating_mul(r.into())) + // Minimum execution time: 6_441_000 picoseconds. + Weight::from_parts(6_864_863, 2626) + // Standard Error: 1_403 + .saturating_add(Weight::from_parts(85_123, 0).saturating_mul(r.into())) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: Identity Registrars (r:1 w:1) - /// Proof: Identity Registrars (max_values: Some(1), max_size: Some(1141), added: 1636, mode: MaxEncodedLen) + /// Storage: `Identity::Registrars` (r:1 w:1) + /// Proof: `Identity::Registrars` (`max_values`: Some(1), `max_size`: Some(1141), added: 1636, mode: `MaxEncodedLen`) /// The range of component `r` is `[1, 19]`. fn set_fields(r: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `89 + r * (57 ±0)` // Estimated: `2626` - // Minimum execution time: 7_385_000 picoseconds. - Weight::from_parts(7_911_589, 2626) - // Standard Error: 1_791 - .saturating_add(Weight::from_parts(125_788, 0).saturating_mul(r.into())) + // Minimum execution time: 6_249_000 picoseconds. + Weight::from_parts(6_658_251, 2626) + // Standard Error: 1_443 + .saturating_add(Weight::from_parts(92_586, 0).saturating_mul(r.into())) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: Identity Registrars (r:1 w:0) - /// Proof: Identity Registrars (max_values: Some(1), max_size: Some(1141), added: 1636, mode: MaxEncodedLen) - /// Storage: Identity IdentityOf (r:1 w:1) - /// Proof: Identity IdentityOf (max_values: None, max_size: Some(7538), added: 10013, mode: MaxEncodedLen) + /// Storage: `Identity::Registrars` (r:1 w:0) + /// Proof: `Identity::Registrars` (`max_values`: Some(1), `max_size`: Some(1141), added: 1636, mode: `MaxEncodedLen`) + /// Storage: `Identity::IdentityOf` (r:1 w:1) + /// Proof: `Identity::IdentityOf` (`max_values`: None, `max_size`: Some(7572), added: 10047, mode: `MaxEncodedLen`) /// The range of component `r` is `[1, 19]`. fn provide_judgement(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `445 + r * (57 ±0) + x * (66 ±0)` - // Estimated: `11003` - // Minimum execution time: 24_073_000 picoseconds. - Weight::from_parts(17_817_684, 11003) - // Standard Error: 8_612 - .saturating_add(Weight::from_parts(406_251, 0).saturating_mul(r.into())) + // Measured: `7046 + r * (57 ±0)` + // Estimated: `11037` + // Minimum execution time: 97_969_000 picoseconds. + Weight::from_parts(101_366_385, 11037) + // Standard Error: 19_594 + .saturating_add(Weight::from_parts(103_251, 0).saturating_mul(r.into())) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: Identity SubsOf (r:1 w:1) - /// Proof: Identity SubsOf (max_values: None, max_size: Some(3258), added: 5733, mode: MaxEncodedLen) - /// Storage: Identity IdentityOf (r:1 w:1) - /// Proof: Identity IdentityOf (max_values: None, max_size: Some(7538), added: 10013, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) - /// Storage: Identity SuperOf (r:0 w:100) - /// Proof: Identity SuperOf (max_values: None, max_size: Some(114), added: 2589, mode: MaxEncodedLen) + /// Storage: `Identity::SubsOf` (r:1 w:1) + /// Proof: `Identity::SubsOf` (`max_values`: None, `max_size`: Some(3258), added: 5733, mode: `MaxEncodedLen`) + /// Storage: `Identity::IdentityOf` (r:1 w:1) + /// Proof: `Identity::IdentityOf` (`max_values`: None, `max_size`: Some(7572), added: 10047, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `Identity::SuperOf` (r:0 w:100) + /// Proof: `Identity::SuperOf` (`max_values`: None, `max_size`: Some(114), added: 2589, mode: `MaxEncodedLen`) /// The range of component `r` is `[1, 20]`. /// The range of component `s` is `[0, 100]`. fn kill_identity(r: u32, s: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `676 + r * (5 ±0) + s * (32 ±0) + x * (66 ±0)` - // Estimated: `11003` - // Minimum execution time: 73_981_000 picoseconds. - Weight::from_parts(51_684_057, 11003) - // Standard Error: 12_662 - .saturating_add(Weight::from_parts(145_285, 0).saturating_mul(r.into())) - // Standard Error: 2_472 - .saturating_add(Weight::from_parts(1_421_039, 0).saturating_mul(s.into())) + // Measured: `7277 + r * (5 ±0) + s * (32 ±0)` + // Estimated: `11037` + // Minimum execution time: 73_785_000 picoseconds. + Weight::from_parts(73_606_063, 11037) + // Standard Error: 26_433 + .saturating_add(Weight::from_parts(230_018, 0).saturating_mul(r.into())) + // Standard Error: 5_157 + .saturating_add(Weight::from_parts(1_483_326, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(3_u64)) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(s.into()))) } - /// Storage: Identity IdentityOf (r:1 w:0) - /// Proof: Identity IdentityOf (max_values: None, max_size: Some(7538), added: 10013, mode: MaxEncodedLen) - /// Storage: Identity SuperOf (r:1 w:1) - /// Proof: Identity SuperOf (max_values: None, max_size: Some(114), added: 2589, mode: MaxEncodedLen) - /// Storage: Identity SubsOf (r:1 w:1) - /// Proof: Identity SubsOf (max_values: None, max_size: Some(3258), added: 5733, mode: MaxEncodedLen) + /// Storage: `Identity::IdentityOf` (r:1 w:0) + /// Proof: `Identity::IdentityOf` (`max_values`: None, `max_size`: Some(7572), added: 10047, mode: `MaxEncodedLen`) + /// Storage: `Identity::SuperOf` (r:1 w:1) + /// Proof: `Identity::SuperOf` (`max_values`: None, `max_size`: Some(114), added: 2589, mode: `MaxEncodedLen`) + /// Storage: `Identity::SubsOf` (r:1 w:1) + /// Proof: `Identity::SubsOf` (`max_values`: None, `max_size`: Some(3258), added: 5733, mode: `MaxEncodedLen`) /// The range of component `s` is `[0, 99]`. fn add_sub(s: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `475 + s * (36 ±0)` - // Estimated: `11003` - // Minimum execution time: 29_367_000 picoseconds. - Weight::from_parts(34_214_998, 11003) - // Standard Error: 1_522 - .saturating_add(Weight::from_parts(114_551, 0).saturating_mul(s.into())) + // Estimated: `11037` + // Minimum execution time: 27_304_000 picoseconds. + Weight::from_parts(31_677_329, 11037) + // Standard Error: 1_388 + .saturating_add(Weight::from_parts(102_193, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } - /// Storage: Identity IdentityOf (r:1 w:0) - /// Proof: Identity IdentityOf (max_values: None, max_size: Some(7538), added: 10013, mode: MaxEncodedLen) - /// Storage: Identity SuperOf (r:1 w:1) - /// Proof: Identity SuperOf (max_values: None, max_size: Some(114), added: 2589, mode: MaxEncodedLen) + /// Storage: `Identity::IdentityOf` (r:1 w:0) + /// Proof: `Identity::IdentityOf` (`max_values`: None, `max_size`: Some(7572), added: 10047, mode: `MaxEncodedLen`) + /// Storage: `Identity::SuperOf` (r:1 w:1) + /// Proof: `Identity::SuperOf` (`max_values`: None, `max_size`: Some(114), added: 2589, mode: `MaxEncodedLen`) /// The range of component `s` is `[1, 100]`. fn rename_sub(s: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `591 + s * (3 ±0)` - // Estimated: `11003` - // Minimum execution time: 12_384_000 picoseconds. - Weight::from_parts(14_417_903, 11003) - // Standard Error: 539 - .saturating_add(Weight::from_parts(38_371, 0).saturating_mul(s.into())) + // Estimated: `11037` + // Minimum execution time: 12_925_000 picoseconds. + Weight::from_parts(14_756_477, 11037) + // Standard Error: 646 + .saturating_add(Weight::from_parts(36_734, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: Identity IdentityOf (r:1 w:0) - /// Proof: Identity IdentityOf (max_values: None, max_size: Some(7538), added: 10013, mode: MaxEncodedLen) - /// Storage: Identity SuperOf (r:1 w:1) - /// Proof: Identity SuperOf (max_values: None, max_size: Some(114), added: 2589, mode: MaxEncodedLen) - /// Storage: Identity SubsOf (r:1 w:1) - /// Proof: Identity SubsOf (max_values: None, max_size: Some(3258), added: 5733, mode: MaxEncodedLen) + /// Storage: `Identity::IdentityOf` (r:1 w:0) + /// Proof: `Identity::IdentityOf` (`max_values`: None, `max_size`: Some(7572), added: 10047, mode: `MaxEncodedLen`) + /// Storage: `Identity::SuperOf` (r:1 w:1) + /// Proof: `Identity::SuperOf` (`max_values`: None, `max_size`: Some(114), added: 2589, mode: `MaxEncodedLen`) + /// Storage: `Identity::SubsOf` (r:1 w:1) + /// Proof: `Identity::SubsOf` (`max_values`: None, `max_size`: Some(3258), added: 5733, mode: `MaxEncodedLen`) /// The range of component `s` is `[1, 100]`. fn remove_sub(s: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `638 + s * (35 ±0)` - // Estimated: `11003` - // Minimum execution time: 33_327_000 picoseconds. - Weight::from_parts(36_208_941, 11003) - // Standard Error: 1_240 - .saturating_add(Weight::from_parts(105_805, 0).saturating_mul(s.into())) + // Estimated: `11037` + // Minimum execution time: 30_475_000 picoseconds. + Weight::from_parts(33_821_774, 11037) + // Standard Error: 1_012 + .saturating_add(Weight::from_parts(87_704, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } - /// Storage: Identity SuperOf (r:1 w:1) - /// Proof: Identity SuperOf (max_values: None, max_size: Some(114), added: 2589, mode: MaxEncodedLen) - /// Storage: Identity SubsOf (r:1 w:1) - /// Proof: Identity SubsOf (max_values: None, max_size: Some(3258), added: 5733, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:0) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: `Identity::SuperOf` (r:1 w:1) + /// Proof: `Identity::SuperOf` (`max_values`: None, `max_size`: Some(114), added: 2589, mode: `MaxEncodedLen`) + /// Storage: `Identity::SubsOf` (r:1 w:1) + /// Proof: `Identity::SubsOf` (`max_values`: None, `max_size`: Some(3258), added: 5733, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:0) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) /// The range of component `s` is `[0, 99]`. fn quit_sub(s: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `704 + s * (37 ±0)` // Estimated: `6723` - // Minimum execution time: 23_764_000 picoseconds. - Weight::from_parts(26_407_731, 6723) - // Standard Error: 1_025 - .saturating_add(Weight::from_parts(101_112, 0).saturating_mul(s.into())) + // Minimum execution time: 22_841_000 picoseconds. + Weight::from_parts(25_781_412, 6723) + // Standard Error: 1_145 + .saturating_add(Weight::from_parts(84_692, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } @@ -358,367 +357,363 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 13_873_000 picoseconds. - Weight::from_parts(13_873_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - .saturating_add(T::DbWeight::get().writes(1)) + // Minimum execution time: 6_983_000 picoseconds. + Weight::from_parts(7_388_000, 0) + .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: `Identity::UsernameAuthorities` (r:0 w:1) + /// Storage: `Identity::UsernameAuthorities` (r:1 w:1) /// Proof: `Identity::UsernameAuthorities` (`max_values`: None, `max_size`: Some(52), added: 2527, mode: `MaxEncodedLen`) fn remove_username_authority() -> Weight { // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 10_653_000 picoseconds. - Weight::from_parts(10_653_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - .saturating_add(T::DbWeight::get().writes(1)) + // Measured: `80` + // Estimated: `3517` + // Minimum execution time: 9_717_000 picoseconds. + Weight::from_parts(10_322_000, 3517) + .saturating_add(T::DbWeight::get().reads(1_u64)) + .saturating_add(T::DbWeight::get().writes(1_u64)) } /// Storage: `Identity::UsernameAuthorities` (r:1 w:1) /// Proof: `Identity::UsernameAuthorities` (`max_values`: None, `max_size`: Some(52), added: 2527, mode: `MaxEncodedLen`) /// Storage: `Identity::AccountOfUsername` (r:1 w:1) - /// Proof: `Identity::AccountOfUsername` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) + /// Proof: `Identity::AccountOfUsername` (`max_values`: None, `max_size`: Some(81), added: 2556, mode: `MaxEncodedLen`) + /// Storage: `Identity::PendingUsernames` (r:1 w:0) + /// Proof: `Identity::PendingUsernames` (`max_values`: None, `max_size`: Some(85), added: 2560, mode: `MaxEncodedLen`) /// Storage: `Identity::IdentityOf` (r:1 w:1) /// Proof: `Identity::IdentityOf` (`max_values`: None, `max_size`: Some(7572), added: 10047, mode: `MaxEncodedLen`) fn set_username_for() -> Weight { // Proof Size summary in bytes: // Measured: `80` // Estimated: `11037` - // Minimum execution time: 75_928_000 picoseconds. - Weight::from_parts(75_928_000, 0) - .saturating_add(Weight::from_parts(0, 11037)) - .saturating_add(T::DbWeight::get().reads(3)) - .saturating_add(T::DbWeight::get().writes(3)) + // Minimum execution time: 70_714_000 picoseconds. + Weight::from_parts(74_990_000, 11037) + .saturating_add(T::DbWeight::get().reads(4_u64)) + .saturating_add(T::DbWeight::get().writes(3_u64)) } /// Storage: `Identity::PendingUsernames` (r:1 w:1) - /// Proof: `Identity::PendingUsernames` (`max_values`: None, `max_size`: Some(77), added: 2552, mode: `MaxEncodedLen`) + /// Proof: `Identity::PendingUsernames` (`max_values`: None, `max_size`: Some(85), added: 2560, mode: `MaxEncodedLen`) /// Storage: `Identity::IdentityOf` (r:1 w:1) /// Proof: `Identity::IdentityOf` (`max_values`: None, `max_size`: Some(7572), added: 10047, mode: `MaxEncodedLen`) /// Storage: `Identity::AccountOfUsername` (r:0 w:1) - /// Proof: `Identity::AccountOfUsername` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) + /// Proof: `Identity::AccountOfUsername` (`max_values`: None, `max_size`: Some(81), added: 2556, mode: `MaxEncodedLen`) fn accept_username() -> Weight { // Proof Size summary in bytes: - // Measured: `106` + // Measured: `115` // Estimated: `11037` - // Minimum execution time: 38_157_000 picoseconds. - Weight::from_parts(38_157_000, 0) - .saturating_add(Weight::from_parts(0, 11037)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(3)) + // Minimum execution time: 21_996_000 picoseconds. + Weight::from_parts(22_611_000, 11037) + .saturating_add(T::DbWeight::get().reads(2_u64)) + .saturating_add(T::DbWeight::get().writes(3_u64)) } /// Storage: `Identity::PendingUsernames` (r:1 w:1) - /// Proof: `Identity::PendingUsernames` (`max_values`: None, `max_size`: Some(77), added: 2552, mode: `MaxEncodedLen`) + /// Proof: `Identity::PendingUsernames` (`max_values`: None, `max_size`: Some(85), added: 2560, mode: `MaxEncodedLen`) fn remove_expired_approval() -> Weight { // Proof Size summary in bytes: - // Measured: `106` - // Estimated: `3542` - // Minimum execution time: 46_821_000 picoseconds. - Weight::from_parts(46_821_000, 0) - .saturating_add(Weight::from_parts(0, 3542)) - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)) + // Measured: `115` + // Estimated: `3550` + // Minimum execution time: 16_880_000 picoseconds. + Weight::from_parts(28_371_000, 3550) + .saturating_add(T::DbWeight::get().reads(1_u64)) + .saturating_add(T::DbWeight::get().writes(1_u64)) } /// Storage: `Identity::AccountOfUsername` (r:1 w:0) - /// Proof: `Identity::AccountOfUsername` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) + /// Proof: `Identity::AccountOfUsername` (`max_values`: None, `max_size`: Some(81), added: 2556, mode: `MaxEncodedLen`) /// Storage: `Identity::IdentityOf` (r:1 w:1) /// Proof: `Identity::IdentityOf` (`max_values`: None, `max_size`: Some(7572), added: 10047, mode: `MaxEncodedLen`) fn set_primary_username() -> Weight { // Proof Size summary in bytes: - // Measured: `247` + // Measured: `257` // Estimated: `11037` - // Minimum execution time: 22_515_000 picoseconds. - Weight::from_parts(22_515_000, 0) - .saturating_add(Weight::from_parts(0, 11037)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) + // Minimum execution time: 16_771_000 picoseconds. + Weight::from_parts(17_333_000, 11037) + .saturating_add(T::DbWeight::get().reads(2_u64)) + .saturating_add(T::DbWeight::get().writes(1_u64)) } /// Storage: `Identity::AccountOfUsername` (r:1 w:1) - /// Proof: `Identity::AccountOfUsername` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) + /// Proof: `Identity::AccountOfUsername` (`max_values`: None, `max_size`: Some(81), added: 2556, mode: `MaxEncodedLen`) /// Storage: `Identity::IdentityOf` (r:1 w:0) /// Proof: `Identity::IdentityOf` (`max_values`: None, `max_size`: Some(7572), added: 10047, mode: `MaxEncodedLen`) fn remove_dangling_username() -> Weight { // Proof Size summary in bytes: - // Measured: `126` + // Measured: `98` // Estimated: `11037` - // Minimum execution time: 15_997_000 picoseconds. - Weight::from_parts(15_997_000, 0) - .saturating_add(Weight::from_parts(0, 11037)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(1)) + // Minimum execution time: 12_017_000 picoseconds. + Weight::from_parts(12_389_000, 11037) + .saturating_add(T::DbWeight::get().reads(2_u64)) + .saturating_add(T::DbWeight::get().writes(1_u64)) } } -// For backwards compatibility and tests +// For backwards compatibility and tests. impl WeightInfo for () { - /// Storage: Identity Registrars (r:1 w:1) - /// Proof: Identity Registrars (max_values: Some(1), max_size: Some(1141), added: 1636, mode: MaxEncodedLen) + /// Storage: `Identity::Registrars` (r:1 w:1) + /// Proof: `Identity::Registrars` (`max_values`: Some(1), `max_size`: Some(1141), added: 1636, mode: `MaxEncodedLen`) /// The range of component `r` is `[1, 19]`. fn add_registrar(r: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `32 + r * (57 ±0)` // Estimated: `2626` - // Minimum execution time: 11_683_000 picoseconds. - Weight::from_parts(12_515_830, 2626) - // Standard Error: 2_154 - .saturating_add(Weight::from_parts(147_919, 0).saturating_mul(r.into())) + // Minimum execution time: 8_696_000 picoseconds. + Weight::from_parts(9_620_793, 2626) + // Standard Error: 1_909 + .saturating_add(Weight::from_parts(94_977, 0).saturating_mul(r.into())) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Identity IdentityOf (r:1 w:1) - /// Proof: Identity IdentityOf (max_values: None, max_size: Some(7538), added: 10013, mode: MaxEncodedLen) + /// Storage: `Identity::IdentityOf` (r:1 w:1) + /// Proof: `Identity::IdentityOf` (`max_values`: None, `max_size`: Some(7572), added: 10047, mode: `MaxEncodedLen`) /// The range of component `r` is `[1, 20]`. fn set_identity(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `442 + r * (5 ±0)` - // Estimated: `11003` - // Minimum execution time: 32_949_000 picoseconds. - Weight::from_parts(31_329_634, 11003) - // Standard Error: 4_496 - .saturating_add(Weight::from_parts(203_570, 0).saturating_mul(r.into())) + // Measured: `6978 + r * (5 ±0)` + // Estimated: `11037` + // Minimum execution time: 110_950_000 picoseconds. + Weight::from_parts(112_705_139, 11037) + // Standard Error: 6_475 + .saturating_add(Weight::from_parts(212_737, 0).saturating_mul(r.into())) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Identity IdentityOf (r:1 w:0) - /// Proof: Identity IdentityOf (max_values: None, max_size: Some(7538), added: 10013, mode: MaxEncodedLen) - /// Storage: Identity SubsOf (r:1 w:1) - /// Proof: Identity SubsOf (max_values: None, max_size: Some(3258), added: 5733, mode: MaxEncodedLen) - /// Storage: Identity SuperOf (r:100 w:100) - /// Proof: Identity SuperOf (max_values: None, max_size: Some(114), added: 2589, mode: MaxEncodedLen) + /// Storage: `Identity::IdentityOf` (r:1 w:0) + /// Proof: `Identity::IdentityOf` (`max_values`: None, `max_size`: Some(7572), added: 10047, mode: `MaxEncodedLen`) + /// Storage: `Identity::SubsOf` (r:1 w:1) + /// Proof: `Identity::SubsOf` (`max_values`: None, `max_size`: Some(3258), added: 5733, mode: `MaxEncodedLen`) + /// Storage: `Identity::SuperOf` (r:100 w:100) + /// Proof: `Identity::SuperOf` (`max_values`: None, `max_size`: Some(114), added: 2589, mode: `MaxEncodedLen`) /// The range of component `s` is `[0, 100]`. fn set_subs_new(s: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `101` - // Estimated: `11003 + s * (2589 ±0)` - // Minimum execution time: 9_157_000 picoseconds. - Weight::from_parts(24_917_444, 11003) - // Standard Error: 4_554 - .saturating_add(Weight::from_parts(3_279_868, 0).saturating_mul(s.into())) + // Estimated: `11037 + s * (2589 ±0)` + // Minimum execution time: 9_440_000 picoseconds. + Weight::from_parts(23_266_871, 11037) + // Standard Error: 10_640 + .saturating_add(Weight::from_parts(3_663_971, 0).saturating_mul(s.into())) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().reads((1_u64).saturating_mul(s.into()))) .saturating_add(RocksDbWeight::get().writes(1_u64)) .saturating_add(RocksDbWeight::get().writes((1_u64).saturating_mul(s.into()))) .saturating_add(Weight::from_parts(0, 2589).saturating_mul(s.into())) } - /// Storage: Identity IdentityOf (r:1 w:0) - /// Proof: Identity IdentityOf (max_values: None, max_size: Some(7538), added: 10013, mode: MaxEncodedLen) - /// Storage: Identity SubsOf (r:1 w:1) - /// Proof: Identity SubsOf (max_values: None, max_size: Some(3258), added: 5733, mode: MaxEncodedLen) - /// Storage: Identity SuperOf (r:0 w:100) - /// Proof: Identity SuperOf (max_values: None, max_size: Some(114), added: 2589, mode: MaxEncodedLen) + /// Storage: `Identity::IdentityOf` (r:1 w:0) + /// Proof: `Identity::IdentityOf` (`max_values`: None, `max_size`: Some(7572), added: 10047, mode: `MaxEncodedLen`) + /// Storage: `Identity::SubsOf` (r:1 w:1) + /// Proof: `Identity::SubsOf` (`max_values`: None, `max_size`: Some(3258), added: 5733, mode: `MaxEncodedLen`) + /// Storage: `Identity::SuperOf` (r:0 w:100) + /// Proof: `Identity::SuperOf` (`max_values`: None, `max_size`: Some(114), added: 2589, mode: `MaxEncodedLen`) /// The range of component `p` is `[0, 100]`. fn set_subs_old(p: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `194 + p * (32 ±0)` - // Estimated: `11003` - // Minimum execution time: 9_240_000 picoseconds. - Weight::from_parts(23_326_035, 11003) - // Standard Error: 3_664 - .saturating_add(Weight::from_parts(1_439_873, 0).saturating_mul(p.into())) + // Estimated: `11037` + // Minimum execution time: 9_588_000 picoseconds. + Weight::from_parts(22_403_362, 11037) + // Standard Error: 3_359 + .saturating_add(Weight::from_parts(1_557_280, 0).saturating_mul(p.into())) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) .saturating_add(RocksDbWeight::get().writes((1_u64).saturating_mul(p.into()))) } - /// Storage: Identity SubsOf (r:1 w:1) - /// Proof: Identity SubsOf (max_values: None, max_size: Some(3258), added: 5733, mode: MaxEncodedLen) - /// Storage: Identity IdentityOf (r:1 w:1) - /// Proof: Identity IdentityOf (max_values: None, max_size: Some(7538), added: 10013, mode: MaxEncodedLen) - /// Storage: Identity SuperOf (r:0 w:100) - /// Proof: Identity SuperOf (max_values: None, max_size: Some(114), added: 2589, mode: MaxEncodedLen) + /// Storage: `Identity::SubsOf` (r:1 w:1) + /// Proof: `Identity::SubsOf` (`max_values`: None, `max_size`: Some(3258), added: 5733, mode: `MaxEncodedLen`) + /// Storage: `Identity::IdentityOf` (r:1 w:1) + /// Proof: `Identity::IdentityOf` (`max_values`: None, `max_size`: Some(7572), added: 10047, mode: `MaxEncodedLen`) + /// Storage: `Identity::SuperOf` (r:0 w:100) + /// Proof: `Identity::SuperOf` (`max_values`: None, `max_size`: Some(114), added: 2589, mode: `MaxEncodedLen`) /// The range of component `r` is `[1, 20]`. /// The range of component `s` is `[0, 100]`. fn clear_identity(r: u32, s: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `469 + r * (5 ±0) + s * (32 ±0) + x * (66 ±0)` - // Estimated: `11003` - // Minimum execution time: 55_687_000 picoseconds. - Weight::from_parts(30_695_182, 11003) - // Standard Error: 9_921 - .saturating_add(Weight::from_parts(162_357, 0).saturating_mul(r.into())) - // Standard Error: 1_937 - .saturating_add(Weight::from_parts(1_427_998, 0).saturating_mul(s.into())) + // Measured: `7070 + r * (5 ±0) + s * (32 ±0)` + // Estimated: `11037` + // Minimum execution time: 55_387_000 picoseconds. + Weight::from_parts(52_575_769, 11037) + // Standard Error: 17_705 + .saturating_add(Weight::from_parts(268_160, 0).saturating_mul(r.into())) + // Standard Error: 3_454 + .saturating_add(Weight::from_parts(1_576_194, 0).saturating_mul(s.into())) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) .saturating_add(RocksDbWeight::get().writes((1_u64).saturating_mul(s.into()))) } - /// Storage: Identity Registrars (r:1 w:0) - /// Proof: Identity Registrars (max_values: Some(1), max_size: Some(1141), added: 1636, mode: MaxEncodedLen) - /// Storage: Identity IdentityOf (r:1 w:1) - /// Proof: Identity IdentityOf (max_values: None, max_size: Some(7538), added: 10013, mode: MaxEncodedLen) + /// Storage: `Identity::Registrars` (r:1 w:0) + /// Proof: `Identity::Registrars` (`max_values`: Some(1), `max_size`: Some(1141), added: 1636, mode: `MaxEncodedLen`) + /// Storage: `Identity::IdentityOf` (r:1 w:1) + /// Proof: `Identity::IdentityOf` (`max_values`: None, `max_size`: Some(7572), added: 10047, mode: `MaxEncodedLen`) /// The range of component `r` is `[1, 20]`. fn request_judgement(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `367 + r * (57 ±0) + x * (66 ±0)` - // Estimated: `11003` - // Minimum execution time: 34_876_000 picoseconds. - Weight::from_parts(32_207_018, 11003) - // Standard Error: 5_247 - .saturating_add(Weight::from_parts(249_156, 0).saturating_mul(r.into())) + // Measured: `6968 + r * (57 ±0)` + // Estimated: `11037` + // Minimum execution time: 78_243_000 picoseconds. + Weight::from_parts(80_404_226, 11037) + // Standard Error: 5_153 + .saturating_add(Weight::from_parts(149_799, 0).saturating_mul(r.into())) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Identity IdentityOf (r:1 w:1) - /// Proof: Identity IdentityOf (max_values: None, max_size: Some(7538), added: 10013, mode: MaxEncodedLen) + /// Storage: `Identity::IdentityOf` (r:1 w:1) + /// Proof: `Identity::IdentityOf` (`max_values`: None, `max_size`: Some(7572), added: 10047, mode: `MaxEncodedLen`) /// The range of component `r` is `[1, 20]`. fn cancel_request(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `398 + x * (66 ±0)` - // Estimated: `11003` - // Minimum execution time: 30_689_000 picoseconds. - Weight::from_parts(31_967_170, 11003) - // Standard Error: 5_387 - .saturating_add(Weight::from_parts(42_676, 0).saturating_mul(r.into())) + // Measured: `6999` + // Estimated: `11037` + // Minimum execution time: 73_360_000 picoseconds. + Weight::from_parts(76_216_374, 11037) + // Standard Error: 15_603 + .saturating_add(Weight::from_parts(189_080, 0).saturating_mul(r.into())) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Identity Registrars (r:1 w:1) - /// Proof: Identity Registrars (max_values: Some(1), max_size: Some(1141), added: 1636, mode: MaxEncodedLen) + /// Storage: `Identity::Registrars` (r:1 w:1) + /// Proof: `Identity::Registrars` (`max_values`: Some(1), `max_size`: Some(1141), added: 1636, mode: `MaxEncodedLen`) /// The range of component `r` is `[1, 19]`. fn set_fee(r: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `89 + r * (57 ±0)` // Estimated: `2626` - // Minimum execution time: 7_357_000 picoseconds. - Weight::from_parts(7_932_950, 2626) - // Standard Error: 1_804 - .saturating_add(Weight::from_parts(132_653, 0).saturating_mul(r.into())) + // Minimum execution time: 6_287_000 picoseconds. + Weight::from_parts(6_721_854, 2626) + // Standard Error: 1_488 + .saturating_add(Weight::from_parts(96_288, 0).saturating_mul(r.into())) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Identity Registrars (r:1 w:1) - /// Proof: Identity Registrars (max_values: Some(1), max_size: Some(1141), added: 1636, mode: MaxEncodedLen) + /// Storage: `Identity::Registrars` (r:1 w:1) + /// Proof: `Identity::Registrars` (`max_values`: Some(1), `max_size`: Some(1141), added: 1636, mode: `MaxEncodedLen`) /// The range of component `r` is `[1, 19]`. fn set_account_id(r: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `89 + r * (57 ±0)` // Estimated: `2626` - // Minimum execution time: 7_437_000 picoseconds. - Weight::from_parts(8_051_889, 2626) - // Standard Error: 1_997 - .saturating_add(Weight::from_parts(129_592, 0).saturating_mul(r.into())) + // Minimum execution time: 6_441_000 picoseconds. + Weight::from_parts(6_864_863, 2626) + // Standard Error: 1_403 + .saturating_add(Weight::from_parts(85_123, 0).saturating_mul(r.into())) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Identity Registrars (r:1 w:1) - /// Proof: Identity Registrars (max_values: Some(1), max_size: Some(1141), added: 1636, mode: MaxEncodedLen) + /// Storage: `Identity::Registrars` (r:1 w:1) + /// Proof: `Identity::Registrars` (`max_values`: Some(1), `max_size`: Some(1141), added: 1636, mode: `MaxEncodedLen`) /// The range of component `r` is `[1, 19]`. fn set_fields(r: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `89 + r * (57 ±0)` // Estimated: `2626` - // Minimum execution time: 7_385_000 picoseconds. - Weight::from_parts(7_911_589, 2626) - // Standard Error: 1_791 - .saturating_add(Weight::from_parts(125_788, 0).saturating_mul(r.into())) + // Minimum execution time: 6_249_000 picoseconds. + Weight::from_parts(6_658_251, 2626) + // Standard Error: 1_443 + .saturating_add(Weight::from_parts(92_586, 0).saturating_mul(r.into())) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Identity Registrars (r:1 w:0) - /// Proof: Identity Registrars (max_values: Some(1), max_size: Some(1141), added: 1636, mode: MaxEncodedLen) - /// Storage: Identity IdentityOf (r:1 w:1) - /// Proof: Identity IdentityOf (max_values: None, max_size: Some(7538), added: 10013, mode: MaxEncodedLen) + /// Storage: `Identity::Registrars` (r:1 w:0) + /// Proof: `Identity::Registrars` (`max_values`: Some(1), `max_size`: Some(1141), added: 1636, mode: `MaxEncodedLen`) + /// Storage: `Identity::IdentityOf` (r:1 w:1) + /// Proof: `Identity::IdentityOf` (`max_values`: None, `max_size`: Some(7572), added: 10047, mode: `MaxEncodedLen`) /// The range of component `r` is `[1, 19]`. fn provide_judgement(r: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `445 + r * (57 ±0) + x * (66 ±0)` - // Estimated: `11003` - // Minimum execution time: 24_073_000 picoseconds. - Weight::from_parts(17_817_684, 11003) - // Standard Error: 8_612 - .saturating_add(Weight::from_parts(406_251, 0).saturating_mul(r.into())) + // Measured: `7046 + r * (57 ±0)` + // Estimated: `11037` + // Minimum execution time: 97_969_000 picoseconds. + Weight::from_parts(101_366_385, 11037) + // Standard Error: 19_594 + .saturating_add(Weight::from_parts(103_251, 0).saturating_mul(r.into())) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Identity SubsOf (r:1 w:1) - /// Proof: Identity SubsOf (max_values: None, max_size: Some(3258), added: 5733, mode: MaxEncodedLen) - /// Storage: Identity IdentityOf (r:1 w:1) - /// Proof: Identity IdentityOf (max_values: None, max_size: Some(7538), added: 10013, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) - /// Storage: Identity SuperOf (r:0 w:100) - /// Proof: Identity SuperOf (max_values: None, max_size: Some(114), added: 2589, mode: MaxEncodedLen) + /// Storage: `Identity::SubsOf` (r:1 w:1) + /// Proof: `Identity::SubsOf` (`max_values`: None, `max_size`: Some(3258), added: 5733, mode: `MaxEncodedLen`) + /// Storage: `Identity::IdentityOf` (r:1 w:1) + /// Proof: `Identity::IdentityOf` (`max_values`: None, `max_size`: Some(7572), added: 10047, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `Identity::SuperOf` (r:0 w:100) + /// Proof: `Identity::SuperOf` (`max_values`: None, `max_size`: Some(114), added: 2589, mode: `MaxEncodedLen`) /// The range of component `r` is `[1, 20]`. /// The range of component `s` is `[0, 100]`. fn kill_identity(r: u32, s: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `676 + r * (5 ±0) + s * (32 ±0) + x * (66 ±0)` - // Estimated: `11003` - // Minimum execution time: 73_981_000 picoseconds. - Weight::from_parts(51_684_057, 11003) - // Standard Error: 12_662 - .saturating_add(Weight::from_parts(145_285, 0).saturating_mul(r.into())) - // Standard Error: 2_472 - .saturating_add(Weight::from_parts(1_421_039, 0).saturating_mul(s.into())) + // Measured: `7277 + r * (5 ±0) + s * (32 ±0)` + // Estimated: `11037` + // Minimum execution time: 73_785_000 picoseconds. + Weight::from_parts(73_606_063, 11037) + // Standard Error: 26_433 + .saturating_add(Weight::from_parts(230_018, 0).saturating_mul(r.into())) + // Standard Error: 5_157 + .saturating_add(Weight::from_parts(1_483_326, 0).saturating_mul(s.into())) .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(3_u64)) .saturating_add(RocksDbWeight::get().writes((1_u64).saturating_mul(s.into()))) } - /// Storage: Identity IdentityOf (r:1 w:0) - /// Proof: Identity IdentityOf (max_values: None, max_size: Some(7538), added: 10013, mode: MaxEncodedLen) - /// Storage: Identity SuperOf (r:1 w:1) - /// Proof: Identity SuperOf (max_values: None, max_size: Some(114), added: 2589, mode: MaxEncodedLen) - /// Storage: Identity SubsOf (r:1 w:1) - /// Proof: Identity SubsOf (max_values: None, max_size: Some(3258), added: 5733, mode: MaxEncodedLen) + /// Storage: `Identity::IdentityOf` (r:1 w:0) + /// Proof: `Identity::IdentityOf` (`max_values`: None, `max_size`: Some(7572), added: 10047, mode: `MaxEncodedLen`) + /// Storage: `Identity::SuperOf` (r:1 w:1) + /// Proof: `Identity::SuperOf` (`max_values`: None, `max_size`: Some(114), added: 2589, mode: `MaxEncodedLen`) + /// Storage: `Identity::SubsOf` (r:1 w:1) + /// Proof: `Identity::SubsOf` (`max_values`: None, `max_size`: Some(3258), added: 5733, mode: `MaxEncodedLen`) /// The range of component `s` is `[0, 99]`. fn add_sub(s: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `475 + s * (36 ±0)` - // Estimated: `11003` - // Minimum execution time: 29_367_000 picoseconds. - Weight::from_parts(34_214_998, 11003) - // Standard Error: 1_522 - .saturating_add(Weight::from_parts(114_551, 0).saturating_mul(s.into())) + // Estimated: `11037` + // Minimum execution time: 27_304_000 picoseconds. + Weight::from_parts(31_677_329, 11037) + // Standard Error: 1_388 + .saturating_add(Weight::from_parts(102_193, 0).saturating_mul(s.into())) .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } - /// Storage: Identity IdentityOf (r:1 w:0) - /// Proof: Identity IdentityOf (max_values: None, max_size: Some(7538), added: 10013, mode: MaxEncodedLen) - /// Storage: Identity SuperOf (r:1 w:1) - /// Proof: Identity SuperOf (max_values: None, max_size: Some(114), added: 2589, mode: MaxEncodedLen) + /// Storage: `Identity::IdentityOf` (r:1 w:0) + /// Proof: `Identity::IdentityOf` (`max_values`: None, `max_size`: Some(7572), added: 10047, mode: `MaxEncodedLen`) + /// Storage: `Identity::SuperOf` (r:1 w:1) + /// Proof: `Identity::SuperOf` (`max_values`: None, `max_size`: Some(114), added: 2589, mode: `MaxEncodedLen`) /// The range of component `s` is `[1, 100]`. fn rename_sub(s: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `591 + s * (3 ±0)` - // Estimated: `11003` - // Minimum execution time: 12_384_000 picoseconds. - Weight::from_parts(14_417_903, 11003) - // Standard Error: 539 - .saturating_add(Weight::from_parts(38_371, 0).saturating_mul(s.into())) + // Estimated: `11037` + // Minimum execution time: 12_925_000 picoseconds. + Weight::from_parts(14_756_477, 11037) + // Standard Error: 646 + .saturating_add(Weight::from_parts(36_734, 0).saturating_mul(s.into())) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Identity IdentityOf (r:1 w:0) - /// Proof: Identity IdentityOf (max_values: None, max_size: Some(7538), added: 10013, mode: MaxEncodedLen) - /// Storage: Identity SuperOf (r:1 w:1) - /// Proof: Identity SuperOf (max_values: None, max_size: Some(114), added: 2589, mode: MaxEncodedLen) - /// Storage: Identity SubsOf (r:1 w:1) - /// Proof: Identity SubsOf (max_values: None, max_size: Some(3258), added: 5733, mode: MaxEncodedLen) + /// Storage: `Identity::IdentityOf` (r:1 w:0) + /// Proof: `Identity::IdentityOf` (`max_values`: None, `max_size`: Some(7572), added: 10047, mode: `MaxEncodedLen`) + /// Storage: `Identity::SuperOf` (r:1 w:1) + /// Proof: `Identity::SuperOf` (`max_values`: None, `max_size`: Some(114), added: 2589, mode: `MaxEncodedLen`) + /// Storage: `Identity::SubsOf` (r:1 w:1) + /// Proof: `Identity::SubsOf` (`max_values`: None, `max_size`: Some(3258), added: 5733, mode: `MaxEncodedLen`) /// The range of component `s` is `[1, 100]`. fn remove_sub(s: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `638 + s * (35 ±0)` - // Estimated: `11003` - // Minimum execution time: 33_327_000 picoseconds. - Weight::from_parts(36_208_941, 11003) - // Standard Error: 1_240 - .saturating_add(Weight::from_parts(105_805, 0).saturating_mul(s.into())) + // Estimated: `11037` + // Minimum execution time: 30_475_000 picoseconds. + Weight::from_parts(33_821_774, 11037) + // Standard Error: 1_012 + .saturating_add(Weight::from_parts(87_704, 0).saturating_mul(s.into())) .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } - /// Storage: Identity SuperOf (r:1 w:1) - /// Proof: Identity SuperOf (max_values: None, max_size: Some(114), added: 2589, mode: MaxEncodedLen) - /// Storage: Identity SubsOf (r:1 w:1) - /// Proof: Identity SubsOf (max_values: None, max_size: Some(3258), added: 5733, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:0) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: `Identity::SuperOf` (r:1 w:1) + /// Proof: `Identity::SuperOf` (`max_values`: None, `max_size`: Some(114), added: 2589, mode: `MaxEncodedLen`) + /// Storage: `Identity::SubsOf` (r:1 w:1) + /// Proof: `Identity::SubsOf` (`max_values`: None, `max_size`: Some(3258), added: 5733, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:0) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) /// The range of component `s` is `[0, 99]`. fn quit_sub(s: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `704 + s * (37 ±0)` // Estimated: `6723` - // Minimum execution time: 23_764_000 picoseconds. - Weight::from_parts(26_407_731, 6723) - // Standard Error: 1_025 - .saturating_add(Weight::from_parts(101_112, 0).saturating_mul(s.into())) + // Minimum execution time: 22_841_000 picoseconds. + Weight::from_parts(25_781_412, 6723) + // Standard Error: 1_145 + .saturating_add(Weight::from_parts(84_692, 0).saturating_mul(s.into())) .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } @@ -728,92 +723,88 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 13_873_000 picoseconds. - Weight::from_parts(13_873_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - .saturating_add(RocksDbWeight::get().writes(1)) + // Minimum execution time: 6_983_000 picoseconds. + Weight::from_parts(7_388_000, 0) + .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: `Identity::UsernameAuthorities` (r:0 w:1) + /// Storage: `Identity::UsernameAuthorities` (r:1 w:1) /// Proof: `Identity::UsernameAuthorities` (`max_values`: None, `max_size`: Some(52), added: 2527, mode: `MaxEncodedLen`) fn remove_username_authority() -> Weight { // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 10_653_000 picoseconds. - Weight::from_parts(10_653_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - .saturating_add(RocksDbWeight::get().writes(1)) + // Measured: `80` + // Estimated: `3517` + // Minimum execution time: 9_717_000 picoseconds. + Weight::from_parts(10_322_000, 3517) + .saturating_add(RocksDbWeight::get().reads(1_u64)) + .saturating_add(RocksDbWeight::get().writes(1_u64)) } /// Storage: `Identity::UsernameAuthorities` (r:1 w:1) /// Proof: `Identity::UsernameAuthorities` (`max_values`: None, `max_size`: Some(52), added: 2527, mode: `MaxEncodedLen`) /// Storage: `Identity::AccountOfUsername` (r:1 w:1) - /// Proof: `Identity::AccountOfUsername` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) + /// Proof: `Identity::AccountOfUsername` (`max_values`: None, `max_size`: Some(81), added: 2556, mode: `MaxEncodedLen`) + /// Storage: `Identity::PendingUsernames` (r:1 w:0) + /// Proof: `Identity::PendingUsernames` (`max_values`: None, `max_size`: Some(85), added: 2560, mode: `MaxEncodedLen`) /// Storage: `Identity::IdentityOf` (r:1 w:1) /// Proof: `Identity::IdentityOf` (`max_values`: None, `max_size`: Some(7572), added: 10047, mode: `MaxEncodedLen`) fn set_username_for() -> Weight { // Proof Size summary in bytes: // Measured: `80` // Estimated: `11037` - // Minimum execution time: 75_928_000 picoseconds. - Weight::from_parts(75_928_000, 0) - .saturating_add(Weight::from_parts(0, 11037)) - .saturating_add(RocksDbWeight::get().reads(3)) - .saturating_add(RocksDbWeight::get().writes(3)) + // Minimum execution time: 70_714_000 picoseconds. + Weight::from_parts(74_990_000, 11037) + .saturating_add(RocksDbWeight::get().reads(4_u64)) + .saturating_add(RocksDbWeight::get().writes(3_u64)) } /// Storage: `Identity::PendingUsernames` (r:1 w:1) - /// Proof: `Identity::PendingUsernames` (`max_values`: None, `max_size`: Some(77), added: 2552, mode: `MaxEncodedLen`) + /// Proof: `Identity::PendingUsernames` (`max_values`: None, `max_size`: Some(85), added: 2560, mode: `MaxEncodedLen`) /// Storage: `Identity::IdentityOf` (r:1 w:1) /// Proof: `Identity::IdentityOf` (`max_values`: None, `max_size`: Some(7572), added: 10047, mode: `MaxEncodedLen`) /// Storage: `Identity::AccountOfUsername` (r:0 w:1) - /// Proof: `Identity::AccountOfUsername` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) + /// Proof: `Identity::AccountOfUsername` (`max_values`: None, `max_size`: Some(81), added: 2556, mode: `MaxEncodedLen`) fn accept_username() -> Weight { // Proof Size summary in bytes: - // Measured: `106` + // Measured: `115` // Estimated: `11037` - // Minimum execution time: 38_157_000 picoseconds. - Weight::from_parts(38_157_000, 0) - .saturating_add(Weight::from_parts(0, 11037)) - .saturating_add(RocksDbWeight::get().reads(2)) - .saturating_add(RocksDbWeight::get().writes(3)) + // Minimum execution time: 21_996_000 picoseconds. + Weight::from_parts(22_611_000, 11037) + .saturating_add(RocksDbWeight::get().reads(2_u64)) + .saturating_add(RocksDbWeight::get().writes(3_u64)) } /// Storage: `Identity::PendingUsernames` (r:1 w:1) - /// Proof: `Identity::PendingUsernames` (`max_values`: None, `max_size`: Some(77), added: 2552, mode: `MaxEncodedLen`) + /// Proof: `Identity::PendingUsernames` (`max_values`: None, `max_size`: Some(85), added: 2560, mode: `MaxEncodedLen`) fn remove_expired_approval() -> Weight { // Proof Size summary in bytes: - // Measured: `106` - // Estimated: `3542` - // Minimum execution time: 46_821_000 picoseconds. - Weight::from_parts(46_821_000, 0) - .saturating_add(Weight::from_parts(0, 3542)) - .saturating_add(RocksDbWeight::get().reads(1)) - .saturating_add(RocksDbWeight::get().writes(1)) + // Measured: `115` + // Estimated: `3550` + // Minimum execution time: 16_880_000 picoseconds. + Weight::from_parts(28_371_000, 3550) + .saturating_add(RocksDbWeight::get().reads(1_u64)) + .saturating_add(RocksDbWeight::get().writes(1_u64)) } /// Storage: `Identity::AccountOfUsername` (r:1 w:0) - /// Proof: `Identity::AccountOfUsername` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) + /// Proof: `Identity::AccountOfUsername` (`max_values`: None, `max_size`: Some(81), added: 2556, mode: `MaxEncodedLen`) /// Storage: `Identity::IdentityOf` (r:1 w:1) /// Proof: `Identity::IdentityOf` (`max_values`: None, `max_size`: Some(7572), added: 10047, mode: `MaxEncodedLen`) fn set_primary_username() -> Weight { // Proof Size summary in bytes: - // Measured: `247` + // Measured: `257` // Estimated: `11037` - // Minimum execution time: 22_515_000 picoseconds. - Weight::from_parts(22_515_000, 0) - .saturating_add(Weight::from_parts(0, 11037)) - .saturating_add(RocksDbWeight::get().reads(2)) - .saturating_add(RocksDbWeight::get().writes(1)) + // Minimum execution time: 16_771_000 picoseconds. + Weight::from_parts(17_333_000, 11037) + .saturating_add(RocksDbWeight::get().reads(2_u64)) + .saturating_add(RocksDbWeight::get().writes(1_u64)) } /// Storage: `Identity::AccountOfUsername` (r:1 w:1) - /// Proof: `Identity::AccountOfUsername` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) + /// Proof: `Identity::AccountOfUsername` (`max_values`: None, `max_size`: Some(81), added: 2556, mode: `MaxEncodedLen`) /// Storage: `Identity::IdentityOf` (r:1 w:0) /// Proof: `Identity::IdentityOf` (`max_values`: None, `max_size`: Some(7572), added: 10047, mode: `MaxEncodedLen`) fn remove_dangling_username() -> Weight { // Proof Size summary in bytes: - // Measured: `126` + // Measured: `98` // Estimated: `11037` - // Minimum execution time: 15_997_000 picoseconds. - Weight::from_parts(15_997_000, 0) - .saturating_add(Weight::from_parts(0, 11037)) - .saturating_add(RocksDbWeight::get().reads(2)) - .saturating_add(RocksDbWeight::get().writes(1)) + // Minimum execution time: 12_017_000 picoseconds. + Weight::from_parts(12_389_000, 11037) + .saturating_add(RocksDbWeight::get().reads(2_u64)) + .saturating_add(RocksDbWeight::get().writes(1_u64)) } } diff --git a/substrate/frame/im-online/Cargo.toml b/substrate/frame/im-online/Cargo.toml index 04c35908c535513f1c0aa0b5741f36281a01646b..46b416f0f9a8d72a12aa12f9d8eeb99aaf4c1c2a 100644 --- a/substrate/frame/im-online/Cargo.toml +++ b/substrate/frame/im-online/Cargo.toml @@ -17,8 +17,8 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } -log = { version = "0.4.17", default-features = false } -scale-info = { version = "2.10.0", default-features = false, features = ["derive", "serde"] } +log = { workspace = true } +scale-info = { version = "2.11.1", default-features = false, features = ["derive", "serde"] } frame-benchmarking = { path = "../benchmarking", default-features = false, optional = true } frame-support = { path = "../support", default-features = false } frame-system = { path = "../system", default-features = false } diff --git a/substrate/frame/im-online/src/lib.rs b/substrate/frame/im-online/src/lib.rs index 1de89dd00c8121c64a19f8b45f24fc6500126dce..239b47834d1f8b1625a186e4a8f90e9861bfa303 100644 --- a/substrate/frame/im-online/src/lib.rs +++ b/substrate/frame/im-online/src/lib.rs @@ -251,7 +251,7 @@ type OffchainResult = Result>>; pub mod pallet { use super::*; - /// The current storage version. + /// The in-code storage version. const STORAGE_VERSION: StorageVersion = StorageVersion::new(1); #[pallet::pallet] @@ -338,26 +338,22 @@ pub mod pallet { /// progress estimate from `NextSessionRotation`, as those estimates should be /// more accurate then the value we calculate for `HeartbeatAfter`. #[pallet::storage] - #[pallet::getter(fn heartbeat_after)] - pub(super) type HeartbeatAfter = StorageValue<_, BlockNumberFor, ValueQuery>; + pub type HeartbeatAfter = StorageValue<_, BlockNumberFor, ValueQuery>; /// The current set of keys that may issue a heartbeat. #[pallet::storage] - #[pallet::getter(fn keys)] - pub(super) type Keys = + pub type Keys = StorageValue<_, WeakBoundedVec, ValueQuery>; /// For each session index, we keep a mapping of `SessionIndex` and `AuthIndex`. #[pallet::storage] - #[pallet::getter(fn received_heartbeats)] - pub(super) type ReceivedHeartbeats = + pub type ReceivedHeartbeats = StorageDoubleMap<_, Twox64Concat, SessionIndex, Twox64Concat, AuthIndex, bool>; /// For each session index, we keep a mapping of `ValidatorId` to the /// number of blocks authored by the given authority. #[pallet::storage] - #[pallet::getter(fn authored_blocks)] - pub(super) type AuthoredBlocks = StorageDoubleMap< + pub type AuthoredBlocks = StorageDoubleMap< _, Twox64Concat, SessionIndex, diff --git a/substrate/frame/im-online/src/migration.rs b/substrate/frame/im-online/src/migration.rs index 84652965972e3aecbdd8edba67cb3f5f1b33e49c..754a2e672e6cfaec32ed0e44c9af54469fddbb04 100644 --- a/substrate/frame/im-online/src/migration.rs +++ b/substrate/frame/im-online/src/migration.rs @@ -56,7 +56,7 @@ pub mod v1 { use super::*; /// Simple migration that replaces `ReceivedHeartbeats` values with `true`. - pub struct Migration(sp_std::marker::PhantomData); + pub struct Migration(core::marker::PhantomData); impl OnRuntimeUpgrade for Migration { #[cfg(feature = "try-runtime")] @@ -72,7 +72,7 @@ pub mod v1 { if StorageVersion::get::>() != 0 { log::warn!( target: TARGET, - "Skipping migration because current storage version is not 0" + "Skipping migration because in-code storage version is not 0" ); return weight } @@ -116,6 +116,21 @@ pub mod v1 { } } +/// Clears the pallet's offchain storage. +/// +/// Must be put in `OffchainWorkerApi::offchain_worker` after +/// the pallet was removed. +pub fn clear_offchain_storage(validator_set_size: u32) { + (0..validator_set_size).for_each(|idx| { + let key = { + let mut key = DB_PREFIX.to_vec(); + key.extend(idx.encode()); + key + }; + sp_runtime::offchain::storage::StorageValueRef::persistent(&key).clear(); + }); +} + #[cfg(all(feature = "try-runtime", test))] mod test { use super::*; diff --git a/substrate/frame/im-online/src/mock.rs b/substrate/frame/im-online/src/mock.rs index 9dad148b10fa1b0942e93f1c5d183264ab282f05..cc448dc1ae10bcc80a4389348b5969042bc02caf 100644 --- a/substrate/frame/im-online/src/mock.rs +++ b/substrate/frame/im-online/src/mock.rs @@ -112,7 +112,7 @@ pub fn new_test_ext() -> sp_io::TestExternalities { result } -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Runtime { type BaseCallFilter = frame_support::traits::Everything; type BlockWeights = (); diff --git a/substrate/frame/im-online/src/tests.rs b/substrate/frame/im-online/src/tests.rs index 79036760c2d427c2895163b150f3806bf17222f2..f9959593494a0b94c4093f4c06f0e45c1e3e4f59 100644 --- a/substrate/frame/im-online/src/tests.rs +++ b/substrate/frame/im-online/src/tests.rs @@ -26,10 +26,7 @@ use sp_core::offchain::{ testing::{TestOffchainExt, TestTransactionPoolExt}, OffchainDbExt, OffchainWorkerExt, TransactionPoolExt, }; -use sp_runtime::{ - testing::UintAuthorityId, - transaction_validity::{InvalidTransaction, TransactionValidityError}, -}; +use sp_runtime::testing::UintAuthorityId; #[test] fn test_unresponsiveness_slash_fraction() { @@ -267,14 +264,14 @@ fn should_cleanup_received_heartbeats_on_session_end() { let _ = heartbeat(1, 2, 0, 1.into(), Session::validators()).unwrap(); // the heartbeat is stored - assert!(!ImOnline::received_heartbeats(&2, &0).is_none()); + assert!(!super::pallet::ReceivedHeartbeats::::get(2, 0).is_none()); advance_session(); // after the session has ended we have already processed the heartbeat // message, so any messages received on the previous session should have // been pruned. - assert!(ImOnline::received_heartbeats(&2, &0).is_none()); + assert!(super::pallet::ReceivedHeartbeats::::get(2, 0).is_none()); }); } @@ -419,7 +416,7 @@ fn should_handle_non_linear_session_progress() { Session::rotate_session(); - // if we don't have valid results for the current session progres then + // if we don't have valid results for the current session progress then // we'll fallback to `HeartbeatAfter` and only heartbeat on block 5. MockCurrentSessionProgress::mutate(|p| *p = Some(None)); assert_eq!(ImOnline::send_heartbeats(2).err(), Some(OffchainErr::TooEarly)); diff --git a/substrate/frame/im-online/src/weights.rs b/substrate/frame/im-online/src/weights.rs index c3db02af2578209d9ab97a777ef4a7447d45b738..105a36fb209fe40af3450dc03bd3ad51686613fd 100644 --- a/substrate/frame/im-online/src/weights.rs +++ b/substrate/frame/im-online/src/weights.rs @@ -15,16 +15,16 @@ // See the License for the specific language governing permissions and // limitations under the License. -//! Autogenerated weights for pallet_im_online +//! Autogenerated weights for `pallet_im_online` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-06-16, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-04-09, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-e8ezs4ez-project-145-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("dev"), DB CACHE: 1024 +//! HOSTNAME: `runner-anb7yjbi-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: `1024` // Executed Command: -// ./target/production/substrate +// ./target/production/substrate-node // benchmark // pallet // --chain=dev @@ -35,12 +35,11 @@ // --no-median-slopes // --no-min-squares // --extrinsic=* -// --execution=wasm // --wasm-execution=compiled // --heap-pages=4096 -// --output=./frame/im-online/src/weights.rs -// --header=./HEADER-APACHE2 -// --template=./.maintain/frame-weight-template.hbs +// --output=./substrate/frame/im-online/src/weights.rs +// --header=./substrate/HEADER-APACHE2 +// --template=./substrate/.maintain/frame-weight-template.hbs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -50,60 +49,60 @@ use frame_support::{traits::Get, weights::{Weight, constants::RocksDbWeight}}; use core::marker::PhantomData; -/// Weight functions needed for pallet_im_online. +/// Weight functions needed for `pallet_im_online`. pub trait WeightInfo { fn validate_unsigned_and_then_heartbeat(k: u32, ) -> Weight; } -/// Weights for pallet_im_online using the Substrate node and recommended hardware. +/// Weights for `pallet_im_online` using the Substrate node and recommended hardware. pub struct SubstrateWeight(PhantomData); impl WeightInfo for SubstrateWeight { - /// Storage: Session Validators (r:1 w:0) - /// Proof Skipped: Session Validators (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Session CurrentIndex (r:1 w:0) - /// Proof Skipped: Session CurrentIndex (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ImOnline Keys (r:1 w:0) - /// Proof: ImOnline Keys (max_values: Some(1), max_size: Some(320002), added: 320497, mode: MaxEncodedLen) - /// Storage: ImOnline ReceivedHeartbeats (r:1 w:1) - /// Proof: ImOnline ReceivedHeartbeats (max_values: None, max_size: Some(25), added: 2500, mode: MaxEncodedLen) - /// Storage: ImOnline AuthoredBlocks (r:1 w:0) - /// Proof: ImOnline AuthoredBlocks (max_values: None, max_size: Some(56), added: 2531, mode: MaxEncodedLen) + /// Storage: `Session::Validators` (r:1 w:0) + /// Proof: `Session::Validators` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Session::CurrentIndex` (r:1 w:0) + /// Proof: `Session::CurrentIndex` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ImOnline::Keys` (r:1 w:0) + /// Proof: `ImOnline::Keys` (`max_values`: Some(1), `max_size`: Some(320002), added: 320497, mode: `MaxEncodedLen`) + /// Storage: `ImOnline::ReceivedHeartbeats` (r:1 w:1) + /// Proof: `ImOnline::ReceivedHeartbeats` (`max_values`: None, `max_size`: Some(25), added: 2500, mode: `MaxEncodedLen`) + /// Storage: `ImOnline::AuthoredBlocks` (r:1 w:0) + /// Proof: `ImOnline::AuthoredBlocks` (`max_values`: None, `max_size`: Some(56), added: 2531, mode: `MaxEncodedLen`) /// The range of component `k` is `[1, 1000]`. fn validate_unsigned_and_then_heartbeat(k: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `295 + k * (32 ±0)` + // Measured: `327 + k * (32 ±0)` // Estimated: `321487 + k * (1761 ±0)` - // Minimum execution time: 80_568_000 picoseconds. - Weight::from_parts(95_175_595, 321487) - // Standard Error: 627 - .saturating_add(Weight::from_parts(39_094, 0).saturating_mul(k.into())) + // Minimum execution time: 64_011_000 picoseconds. + Weight::from_parts(80_632_380, 321487) + // Standard Error: 676 + .saturating_add(Weight::from_parts(34_921, 0).saturating_mul(k.into())) .saturating_add(T::DbWeight::get().reads(4_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) .saturating_add(Weight::from_parts(0, 1761).saturating_mul(k.into())) } } -// For backwards compatibility and tests +// For backwards compatibility and tests. impl WeightInfo for () { - /// Storage: Session Validators (r:1 w:0) - /// Proof Skipped: Session Validators (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Session CurrentIndex (r:1 w:0) - /// Proof Skipped: Session CurrentIndex (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: ImOnline Keys (r:1 w:0) - /// Proof: ImOnline Keys (max_values: Some(1), max_size: Some(320002), added: 320497, mode: MaxEncodedLen) - /// Storage: ImOnline ReceivedHeartbeats (r:1 w:1) - /// Proof: ImOnline ReceivedHeartbeats (max_values: None, max_size: Some(25), added: 2500, mode: MaxEncodedLen) - /// Storage: ImOnline AuthoredBlocks (r:1 w:0) - /// Proof: ImOnline AuthoredBlocks (max_values: None, max_size: Some(56), added: 2531, mode: MaxEncodedLen) + /// Storage: `Session::Validators` (r:1 w:0) + /// Proof: `Session::Validators` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Session::CurrentIndex` (r:1 w:0) + /// Proof: `Session::CurrentIndex` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ImOnline::Keys` (r:1 w:0) + /// Proof: `ImOnline::Keys` (`max_values`: Some(1), `max_size`: Some(320002), added: 320497, mode: `MaxEncodedLen`) + /// Storage: `ImOnline::ReceivedHeartbeats` (r:1 w:1) + /// Proof: `ImOnline::ReceivedHeartbeats` (`max_values`: None, `max_size`: Some(25), added: 2500, mode: `MaxEncodedLen`) + /// Storage: `ImOnline::AuthoredBlocks` (r:1 w:0) + /// Proof: `ImOnline::AuthoredBlocks` (`max_values`: None, `max_size`: Some(56), added: 2531, mode: `MaxEncodedLen`) /// The range of component `k` is `[1, 1000]`. fn validate_unsigned_and_then_heartbeat(k: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `295 + k * (32 ±0)` + // Measured: `327 + k * (32 ±0)` // Estimated: `321487 + k * (1761 ±0)` - // Minimum execution time: 80_568_000 picoseconds. - Weight::from_parts(95_175_595, 321487) - // Standard Error: 627 - .saturating_add(Weight::from_parts(39_094, 0).saturating_mul(k.into())) + // Minimum execution time: 64_011_000 picoseconds. + Weight::from_parts(80_632_380, 321487) + // Standard Error: 676 + .saturating_add(Weight::from_parts(34_921, 0).saturating_mul(k.into())) .saturating_add(RocksDbWeight::get().reads(4_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) .saturating_add(Weight::from_parts(0, 1761).saturating_mul(k.into())) diff --git a/substrate/frame/indices/Cargo.toml b/substrate/frame/indices/Cargo.toml index f810ea36a707fa0c47a8fbb51c523f9ad65fea90..7b14bf358f1ef3e929e8e6be67f33a54b3590928 100644 --- a/substrate/frame/indices/Cargo.toml +++ b/substrate/frame/indices/Cargo.toml @@ -17,7 +17,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } frame-benchmarking = { path = "../benchmarking", default-features = false, optional = true } frame-support = { path = "../support", default-features = false } frame-system = { path = "../system", default-features = false } diff --git a/substrate/frame/indices/src/mock.rs b/substrate/frame/indices/src/mock.rs index 5cf82305178d419d0542d283db914eb8dc481aa7..9f8bf8c3758832d203d088616b4cb5247a116805 100644 --- a/substrate/frame/indices/src/mock.rs +++ b/substrate/frame/indices/src/mock.rs @@ -38,7 +38,7 @@ frame_support::construct_runtime!( } ); -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { type BaseCallFilter = frame_support::traits::Everything; type BlockWeights = (); diff --git a/substrate/frame/indices/src/weights.rs b/substrate/frame/indices/src/weights.rs index d081cc738b1dbe6c1991b30ccb454307e4ca19ab..e1bc90c9b12840b4561731e964ab16adb58ddf92 100644 --- a/substrate/frame/indices/src/weights.rs +++ b/substrate/frame/indices/src/weights.rs @@ -15,16 +15,16 @@ // See the License for the specific language governing permissions and // limitations under the License. -//! Autogenerated weights for pallet_indices +//! Autogenerated weights for `pallet_indices` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-06-16, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-04-09, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-e8ezs4ez-project-145-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("dev"), DB CACHE: 1024 +//! HOSTNAME: `runner-anb7yjbi-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: `1024` // Executed Command: -// ./target/production/substrate +// ./target/production/substrate-node // benchmark // pallet // --chain=dev @@ -35,12 +35,11 @@ // --no-median-slopes // --no-min-squares // --extrinsic=* -// --execution=wasm // --wasm-execution=compiled // --heap-pages=4096 -// --output=./frame/indices/src/weights.rs -// --header=./HEADER-APACHE2 -// --template=./.maintain/frame-weight-template.hbs +// --output=./substrate/frame/indices/src/weights.rs +// --header=./substrate/HEADER-APACHE2 +// --template=./substrate/.maintain/frame-weight-template.hbs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -50,7 +49,7 @@ use frame_support::{traits::Get, weights::{Weight, constants::RocksDbWeight}}; use core::marker::PhantomData; -/// Weight functions needed for pallet_indices. +/// Weight functions needed for `pallet_indices`. pub trait WeightInfo { fn claim() -> Weight; fn transfer() -> Weight; @@ -59,128 +58,128 @@ pub trait WeightInfo { fn freeze() -> Weight; } -/// Weights for pallet_indices using the Substrate node and recommended hardware. +/// Weights for `pallet_indices` using the Substrate node and recommended hardware. pub struct SubstrateWeight(PhantomData); impl WeightInfo for SubstrateWeight { - /// Storage: Indices Accounts (r:1 w:1) - /// Proof: Indices Accounts (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) + /// Storage: `Indices::Accounts` (r:1 w:1) + /// Proof: `Indices::Accounts` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) fn claim() -> Weight { // Proof Size summary in bytes: // Measured: `76` // Estimated: `3534` - // Minimum execution time: 25_491_000 picoseconds. - Weight::from_parts(26_456_000, 3534) + // Minimum execution time: 22_026_000 picoseconds. + Weight::from_parts(22_522_000, 3534) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: Indices Accounts (r:1 w:1) - /// Proof: Indices Accounts (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: `Indices::Accounts` (r:1 w:1) + /// Proof: `Indices::Accounts` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) fn transfer() -> Weight { // Proof Size summary in bytes: // Measured: `275` // Estimated: `3593` - // Minimum execution time: 38_027_000 picoseconds. - Weight::from_parts(38_749_000, 3593) + // Minimum execution time: 34_160_000 picoseconds. + Weight::from_parts(35_138_000, 3593) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } - /// Storage: Indices Accounts (r:1 w:1) - /// Proof: Indices Accounts (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) + /// Storage: `Indices::Accounts` (r:1 w:1) + /// Proof: `Indices::Accounts` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) fn free() -> Weight { // Proof Size summary in bytes: // Measured: `172` // Estimated: `3534` - // Minimum execution time: 26_652_000 picoseconds. - Weight::from_parts(27_273_000, 3534) + // Minimum execution time: 23_736_000 picoseconds. + Weight::from_parts(24_247_000, 3534) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: Indices Accounts (r:1 w:1) - /// Proof: Indices Accounts (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: `Indices::Accounts` (r:1 w:1) + /// Proof: `Indices::Accounts` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) fn force_transfer() -> Weight { // Proof Size summary in bytes: // Measured: `275` // Estimated: `3593` - // Minimum execution time: 29_464_000 picoseconds. - Weight::from_parts(30_959_000, 3593) + // Minimum execution time: 25_810_000 picoseconds. + Weight::from_parts(26_335_000, 3593) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } - /// Storage: Indices Accounts (r:1 w:1) - /// Proof: Indices Accounts (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) + /// Storage: `Indices::Accounts` (r:1 w:1) + /// Proof: `Indices::Accounts` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) fn freeze() -> Weight { // Proof Size summary in bytes: // Measured: `172` // Estimated: `3534` - // Minimum execution time: 29_015_000 picoseconds. - Weight::from_parts(29_714_000, 3534) + // Minimum execution time: 24_502_000 picoseconds. + Weight::from_parts(25_425_000, 3534) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } } -// For backwards compatibility and tests +// For backwards compatibility and tests. impl WeightInfo for () { - /// Storage: Indices Accounts (r:1 w:1) - /// Proof: Indices Accounts (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) + /// Storage: `Indices::Accounts` (r:1 w:1) + /// Proof: `Indices::Accounts` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) fn claim() -> Weight { // Proof Size summary in bytes: // Measured: `76` // Estimated: `3534` - // Minimum execution time: 25_491_000 picoseconds. - Weight::from_parts(26_456_000, 3534) + // Minimum execution time: 22_026_000 picoseconds. + Weight::from_parts(22_522_000, 3534) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Indices Accounts (r:1 w:1) - /// Proof: Indices Accounts (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: `Indices::Accounts` (r:1 w:1) + /// Proof: `Indices::Accounts` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) fn transfer() -> Weight { // Proof Size summary in bytes: // Measured: `275` // Estimated: `3593` - // Minimum execution time: 38_027_000 picoseconds. - Weight::from_parts(38_749_000, 3593) + // Minimum execution time: 34_160_000 picoseconds. + Weight::from_parts(35_138_000, 3593) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } - /// Storage: Indices Accounts (r:1 w:1) - /// Proof: Indices Accounts (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) + /// Storage: `Indices::Accounts` (r:1 w:1) + /// Proof: `Indices::Accounts` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) fn free() -> Weight { // Proof Size summary in bytes: // Measured: `172` // Estimated: `3534` - // Minimum execution time: 26_652_000 picoseconds. - Weight::from_parts(27_273_000, 3534) + // Minimum execution time: 23_736_000 picoseconds. + Weight::from_parts(24_247_000, 3534) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Indices Accounts (r:1 w:1) - /// Proof: Indices Accounts (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: `Indices::Accounts` (r:1 w:1) + /// Proof: `Indices::Accounts` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) fn force_transfer() -> Weight { // Proof Size summary in bytes: // Measured: `275` // Estimated: `3593` - // Minimum execution time: 29_464_000 picoseconds. - Weight::from_parts(30_959_000, 3593) + // Minimum execution time: 25_810_000 picoseconds. + Weight::from_parts(26_335_000, 3593) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } - /// Storage: Indices Accounts (r:1 w:1) - /// Proof: Indices Accounts (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) + /// Storage: `Indices::Accounts` (r:1 w:1) + /// Proof: `Indices::Accounts` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) fn freeze() -> Weight { // Proof Size summary in bytes: // Measured: `172` // Estimated: `3534` - // Minimum execution time: 29_015_000 picoseconds. - Weight::from_parts(29_714_000, 3534) + // Minimum execution time: 24_502_000 picoseconds. + Weight::from_parts(25_425_000, 3534) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } diff --git a/substrate/frame/insecure-randomness-collective-flip/Cargo.toml b/substrate/frame/insecure-randomness-collective-flip/Cargo.toml index f26bfa95bfd0628f5f5e4a81979d3611102e0847..f4d65d9e560a51afe6211ca2889a95eb864a42f3 100644 --- a/substrate/frame/insecure-randomness-collective-flip/Cargo.toml +++ b/substrate/frame/insecure-randomness-collective-flip/Cargo.toml @@ -18,7 +18,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } safe-mix = { version = "1.0", default-features = false } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } frame-support = { path = "../support", default-features = false } frame-system = { path = "../system", default-features = false } sp-runtime = { path = "../../primitives/runtime", default-features = false } diff --git a/substrate/frame/insecure-randomness-collective-flip/src/lib.rs b/substrate/frame/insecure-randomness-collective-flip/src/lib.rs index 00f1055f6f271c9ef21b914a499c652161f551f1..bdb089a14200c679b4ad9d5c5404fffbf8d19a8e 100644 --- a/substrate/frame/insecure-randomness-collective-flip/src/lib.rs +++ b/substrate/frame/insecure-randomness-collective-flip/src/lib.rs @@ -163,14 +163,11 @@ mod tests { use crate as pallet_insecure_randomness_collective_flip; use sp_core::H256; - use sp_runtime::{ - traits::{BlakeTwo256, Header as _, IdentityLookup}, - BuildStorage, - }; + use sp_runtime::{traits::Header as _, BuildStorage}; use frame_support::{ derive_impl, parameter_types, - traits::{ConstU32, ConstU64, OnInitialize, Randomness}, + traits::{OnInitialize, Randomness}, }; use frame_system::limits; @@ -189,31 +186,9 @@ mod tests { ::max(2 * 1024); } - #[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] + #[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { - type BaseCallFilter = frame_support::traits::Everything; - type BlockWeights = (); - type BlockLength = BlockLength; - type DbWeight = (); - type RuntimeOrigin = RuntimeOrigin; - type Nonce = u64; - type RuntimeCall = RuntimeCall; - type Hash = H256; - type Hashing = BlakeTwo256; - type AccountId = u64; - type Lookup = IdentityLookup; type Block = Block; - type RuntimeEvent = RuntimeEvent; - type BlockHashCount = ConstU64<250>; - type Version = (); - type PalletInfo = PalletInfo; - type AccountData = (); - type OnNewAccount = (); - type OnKilledAccount = (); - type SystemWeightInfo = (); - type SS58Prefix = (); - type OnSetCode = (); - type MaxConsumers = ConstU32<16>; } impl pallet_insecure_randomness_collective_flip::Config for Test {} diff --git a/substrate/frame/lottery/Cargo.toml b/substrate/frame/lottery/Cargo.toml index 3930ff32fc915dd87c12ad59d0a22b7dce1764b8..5f79704445f964eae544f0c8678f08f86ab85213 100644 --- a/substrate/frame/lottery/Cargo.toml +++ b/substrate/frame/lottery/Cargo.toml @@ -18,7 +18,7 @@ targets = ["x86_64-unknown-linux-gnu"] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = [ "derive", ] } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } frame-benchmarking = { path = "../benchmarking", default-features = false, optional = true } frame-support = { path = "../support", default-features = false } frame-system = { path = "../system", default-features = false } diff --git a/substrate/frame/lottery/src/benchmarking.rs b/substrate/frame/lottery/src/benchmarking.rs index 1510d250dbeaf6814a35f1262f08ba727b340ee2..123b425b976f3b5b2842e748498513611dca5bc2 100644 --- a/substrate/frame/lottery/src/benchmarking.rs +++ b/substrate/frame/lottery/src/benchmarking.rs @@ -23,7 +23,6 @@ use super::*; use crate::Pallet as Lottery; use frame_benchmarking::{ - impl_benchmark_test_suite, v1::{account, whitelisted_caller, BenchmarkError}, v2::*, }; diff --git a/substrate/frame/lottery/src/mock.rs b/substrate/frame/lottery/src/mock.rs index 0b73bba61355a283785ec95ecfa744174f279af0..596e1a9d837d16486e8a2017b0ab679a02bc2dd6 100644 --- a/substrate/frame/lottery/src/mock.rs +++ b/substrate/frame/lottery/src/mock.rs @@ -26,11 +26,7 @@ use frame_support::{ }; use frame_support_test::TestRandomness; use frame_system::EnsureRoot; -use sp_core::H256; -use sp_runtime::{ - traits::{BlakeTwo256, IdentityLookup}, - BuildStorage, Perbill, -}; +use sp_runtime::{BuildStorage, Perbill}; type Block = frame_system::mocking::MockBlock; @@ -47,31 +43,10 @@ parameter_types! { pub const AvailableBlockRatio: Perbill = Perbill::one(); } -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { - type BaseCallFilter = frame_support::traits::Everything; - type BlockWeights = (); - type BlockLength = (); - type DbWeight = (); - type RuntimeOrigin = RuntimeOrigin; - type Nonce = u64; - type RuntimeCall = RuntimeCall; - type Hash = H256; - type Hashing = BlakeTwo256; - type AccountId = u64; - type Lookup = IdentityLookup; type Block = Block; - type RuntimeEvent = RuntimeEvent; - type BlockHashCount = ConstU64<250>; - type Version = (); - type PalletInfo = PalletInfo; type AccountData = pallet_balances::AccountData; - type OnNewAccount = (); - type OnKilledAccount = (); - type SystemWeightInfo = (); - type SS58Prefix = (); - type OnSetCode = (); - type MaxConsumers = ConstU32<16>; } impl pallet_balances::Config for Test { diff --git a/substrate/frame/lottery/src/weights.rs b/substrate/frame/lottery/src/weights.rs index 3b4e562375345befa93f431145a2aff776ec7517..0ab7f64509cdec181da5abff26c94a364d689ccb 100644 --- a/substrate/frame/lottery/src/weights.rs +++ b/substrate/frame/lottery/src/weights.rs @@ -15,16 +15,16 @@ // See the License for the specific language governing permissions and // limitations under the License. -//! Autogenerated weights for pallet_lottery +//! Autogenerated weights for `pallet_lottery` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-06-16, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-04-09, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-e8ezs4ez-project-145-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("dev"), DB CACHE: 1024 +//! HOSTNAME: `runner-anb7yjbi-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: `1024` // Executed Command: -// ./target/production/substrate +// ./target/production/substrate-node // benchmark // pallet // --chain=dev @@ -35,12 +35,11 @@ // --no-median-slopes // --no-min-squares // --extrinsic=* -// --execution=wasm // --wasm-execution=compiled // --heap-pages=4096 -// --output=./frame/lottery/src/weights.rs -// --header=./HEADER-APACHE2 -// --template=./.maintain/frame-weight-template.hbs +// --output=./substrate/frame/lottery/src/weights.rs +// --header=./substrate/HEADER-APACHE2 +// --template=./substrate/.maintain/frame-weight-template.hbs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -50,7 +49,7 @@ use frame_support::{traits::Get, weights::{Weight, constants::RocksDbWeight}}; use core::marker::PhantomData; -/// Weight functions needed for pallet_lottery. +/// Weight functions needed for `pallet_lottery`. pub trait WeightInfo { fn buy_ticket() -> Weight; fn set_calls(n: u32, ) -> Weight; @@ -60,214 +59,222 @@ pub trait WeightInfo { fn on_initialize_repeat() -> Weight; } -/// Weights for pallet_lottery using the Substrate node and recommended hardware. +/// Weights for `pallet_lottery` using the Substrate node and recommended hardware. pub struct SubstrateWeight(PhantomData); impl WeightInfo for SubstrateWeight { - /// Storage: Lottery Lottery (r:1 w:0) - /// Proof: Lottery Lottery (max_values: Some(1), max_size: Some(29), added: 524, mode: MaxEncodedLen) - /// Storage: Lottery CallIndices (r:1 w:0) - /// Proof: Lottery CallIndices (max_values: Some(1), max_size: Some(21), added: 516, mode: MaxEncodedLen) - /// Storage: Lottery TicketsCount (r:1 w:1) - /// Proof: Lottery TicketsCount (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: Lottery Participants (r:1 w:1) - /// Proof: Lottery Participants (max_values: None, max_size: Some(65), added: 2540, mode: MaxEncodedLen) - /// Storage: Lottery LotteryIndex (r:1 w:0) - /// Proof: Lottery LotteryIndex (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) - /// Storage: Lottery Tickets (r:0 w:1) - /// Proof: Lottery Tickets (max_values: None, max_size: Some(44), added: 2519, mode: MaxEncodedLen) + /// Storage: `SafeMode::EnteredUntil` (r:1 w:0) + /// Proof: `SafeMode::EnteredUntil` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `TxPause::PausedCalls` (r:1 w:0) + /// Proof: `TxPause::PausedCalls` (`max_values`: None, `max_size`: Some(532), added: 3007, mode: `MaxEncodedLen`) + /// Storage: `Lottery::Lottery` (r:1 w:0) + /// Proof: `Lottery::Lottery` (`max_values`: Some(1), `max_size`: Some(29), added: 524, mode: `MaxEncodedLen`) + /// Storage: `Lottery::CallIndices` (r:1 w:0) + /// Proof: `Lottery::CallIndices` (`max_values`: Some(1), `max_size`: Some(21), added: 516, mode: `MaxEncodedLen`) + /// Storage: `Lottery::TicketsCount` (r:1 w:1) + /// Proof: `Lottery::TicketsCount` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `Lottery::Participants` (r:1 w:1) + /// Proof: `Lottery::Participants` (`max_values`: None, `max_size`: Some(65), added: 2540, mode: `MaxEncodedLen`) + /// Storage: `Lottery::LotteryIndex` (r:1 w:0) + /// Proof: `Lottery::LotteryIndex` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `Lottery::Tickets` (r:0 w:1) + /// Proof: `Lottery::Tickets` (`max_values`: None, `max_size`: Some(44), added: 2519, mode: `MaxEncodedLen`) fn buy_ticket() -> Weight { // Proof Size summary in bytes: - // Measured: `452` - // Estimated: `3593` - // Minimum execution time: 60_298_000 picoseconds. - Weight::from_parts(62_058_000, 3593) - .saturating_add(T::DbWeight::get().reads(6_u64)) + // Measured: `492` + // Estimated: `3997` + // Minimum execution time: 60_979_000 picoseconds. + Weight::from_parts(63_452_000, 3997) + .saturating_add(T::DbWeight::get().reads(8_u64)) .saturating_add(T::DbWeight::get().writes(4_u64)) } - /// Storage: Lottery CallIndices (r:0 w:1) - /// Proof: Lottery CallIndices (max_values: Some(1), max_size: Some(21), added: 516, mode: MaxEncodedLen) + /// Storage: `Lottery::CallIndices` (r:0 w:1) + /// Proof: `Lottery::CallIndices` (`max_values`: Some(1), `max_size`: Some(21), added: 516, mode: `MaxEncodedLen`) /// The range of component `n` is `[0, 10]`. fn set_calls(n: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_291_000 picoseconds. - Weight::from_parts(8_178_186, 0) - // Standard Error: 3_048 - .saturating_add(Weight::from_parts(330_871, 0).saturating_mul(n.into())) + // Minimum execution time: 5_245_000 picoseconds. + Weight::from_parts(6_113_777, 0) + // Standard Error: 3_280 + .saturating_add(Weight::from_parts(349_366, 0).saturating_mul(n.into())) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: Lottery Lottery (r:1 w:1) - /// Proof: Lottery Lottery (max_values: Some(1), max_size: Some(29), added: 524, mode: MaxEncodedLen) - /// Storage: Lottery LotteryIndex (r:1 w:1) - /// Proof: Lottery LotteryIndex (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: `Lottery::Lottery` (r:1 w:1) + /// Proof: `Lottery::Lottery` (`max_values`: Some(1), `max_size`: Some(29), added: 524, mode: `MaxEncodedLen`) + /// Storage: `Lottery::LotteryIndex` (r:1 w:1) + /// Proof: `Lottery::LotteryIndex` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) fn start_lottery() -> Weight { // Proof Size summary in bytes: - // Measured: `161` + // Measured: `194` // Estimated: `3593` - // Minimum execution time: 36_741_000 picoseconds. - Weight::from_parts(38_288_000, 3593) + // Minimum execution time: 29_131_000 picoseconds. + Weight::from_parts(29_722_000, 3593) .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(3_u64)) } - /// Storage: Lottery Lottery (r:1 w:1) - /// Proof: Lottery Lottery (max_values: Some(1), max_size: Some(29), added: 524, mode: MaxEncodedLen) + /// Storage: `Lottery::Lottery` (r:1 w:1) + /// Proof: `Lottery::Lottery` (`max_values`: Some(1), `max_size`: Some(29), added: 524, mode: `MaxEncodedLen`) fn stop_repeat() -> Weight { // Proof Size summary in bytes: - // Measured: `219` + // Measured: `252` // Estimated: `1514` - // Minimum execution time: 7_270_000 picoseconds. - Weight::from_parts(7_578_000, 1514) + // Minimum execution time: 6_413_000 picoseconds. + Weight::from_parts(6_702_000, 1514) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: RandomnessCollectiveFlip RandomMaterial (r:1 w:0) - /// Proof: RandomnessCollectiveFlip RandomMaterial (max_values: Some(1), max_size: Some(2594), added: 3089, mode: MaxEncodedLen) - /// Storage: Lottery Lottery (r:1 w:1) - /// Proof: Lottery Lottery (max_values: Some(1), max_size: Some(29), added: 524, mode: MaxEncodedLen) - /// Storage: System Account (r:2 w:2) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) - /// Storage: Lottery TicketsCount (r:1 w:1) - /// Proof: Lottery TicketsCount (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: Lottery Tickets (r:1 w:0) - /// Proof: Lottery Tickets (max_values: None, max_size: Some(44), added: 2519, mode: MaxEncodedLen) + /// Storage: `RandomnessCollectiveFlip::RandomMaterial` (r:1 w:0) + /// Proof: `RandomnessCollectiveFlip::RandomMaterial` (`max_values`: Some(1), `max_size`: Some(2594), added: 3089, mode: `MaxEncodedLen`) + /// Storage: `Lottery::Lottery` (r:1 w:1) + /// Proof: `Lottery::Lottery` (`max_values`: Some(1), `max_size`: Some(29), added: 524, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:2 w:2) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `Lottery::TicketsCount` (r:1 w:1) + /// Proof: `Lottery::TicketsCount` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `Lottery::Tickets` (r:1 w:0) + /// Proof: `Lottery::Tickets` (`max_values`: None, `max_size`: Some(44), added: 2519, mode: `MaxEncodedLen`) fn on_initialize_end() -> Weight { // Proof Size summary in bytes: - // Measured: `558` + // Measured: `591` // Estimated: `6196` - // Minimum execution time: 76_611_000 picoseconds. - Weight::from_parts(78_107_000, 6196) + // Minimum execution time: 65_913_000 picoseconds. + Weight::from_parts(66_864_000, 6196) .saturating_add(T::DbWeight::get().reads(6_u64)) .saturating_add(T::DbWeight::get().writes(4_u64)) } - /// Storage: RandomnessCollectiveFlip RandomMaterial (r:1 w:0) - /// Proof: RandomnessCollectiveFlip RandomMaterial (max_values: Some(1), max_size: Some(2594), added: 3089, mode: MaxEncodedLen) - /// Storage: Lottery Lottery (r:1 w:1) - /// Proof: Lottery Lottery (max_values: Some(1), max_size: Some(29), added: 524, mode: MaxEncodedLen) - /// Storage: System Account (r:2 w:2) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) - /// Storage: Lottery TicketsCount (r:1 w:1) - /// Proof: Lottery TicketsCount (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: Lottery Tickets (r:1 w:0) - /// Proof: Lottery Tickets (max_values: None, max_size: Some(44), added: 2519, mode: MaxEncodedLen) - /// Storage: Lottery LotteryIndex (r:1 w:1) - /// Proof: Lottery LotteryIndex (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + /// Storage: `RandomnessCollectiveFlip::RandomMaterial` (r:1 w:0) + /// Proof: `RandomnessCollectiveFlip::RandomMaterial` (`max_values`: Some(1), `max_size`: Some(2594), added: 3089, mode: `MaxEncodedLen`) + /// Storage: `Lottery::Lottery` (r:1 w:1) + /// Proof: `Lottery::Lottery` (`max_values`: Some(1), `max_size`: Some(29), added: 524, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:2 w:2) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `Lottery::TicketsCount` (r:1 w:1) + /// Proof: `Lottery::TicketsCount` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `Lottery::Tickets` (r:1 w:0) + /// Proof: `Lottery::Tickets` (`max_values`: None, `max_size`: Some(44), added: 2519, mode: `MaxEncodedLen`) + /// Storage: `Lottery::LotteryIndex` (r:1 w:1) + /// Proof: `Lottery::LotteryIndex` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) fn on_initialize_repeat() -> Weight { // Proof Size summary in bytes: - // Measured: `558` + // Measured: `591` // Estimated: `6196` - // Minimum execution time: 78_731_000 picoseconds. - Weight::from_parts(80_248_000, 6196) + // Minimum execution time: 66_950_000 picoseconds. + Weight::from_parts(68_405_000, 6196) .saturating_add(T::DbWeight::get().reads(7_u64)) .saturating_add(T::DbWeight::get().writes(5_u64)) } } -// For backwards compatibility and tests +// For backwards compatibility and tests. impl WeightInfo for () { - /// Storage: Lottery Lottery (r:1 w:0) - /// Proof: Lottery Lottery (max_values: Some(1), max_size: Some(29), added: 524, mode: MaxEncodedLen) - /// Storage: Lottery CallIndices (r:1 w:0) - /// Proof: Lottery CallIndices (max_values: Some(1), max_size: Some(21), added: 516, mode: MaxEncodedLen) - /// Storage: Lottery TicketsCount (r:1 w:1) - /// Proof: Lottery TicketsCount (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: Lottery Participants (r:1 w:1) - /// Proof: Lottery Participants (max_values: None, max_size: Some(65), added: 2540, mode: MaxEncodedLen) - /// Storage: Lottery LotteryIndex (r:1 w:0) - /// Proof: Lottery LotteryIndex (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) - /// Storage: Lottery Tickets (r:0 w:1) - /// Proof: Lottery Tickets (max_values: None, max_size: Some(44), added: 2519, mode: MaxEncodedLen) + /// Storage: `SafeMode::EnteredUntil` (r:1 w:0) + /// Proof: `SafeMode::EnteredUntil` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `TxPause::PausedCalls` (r:1 w:0) + /// Proof: `TxPause::PausedCalls` (`max_values`: None, `max_size`: Some(532), added: 3007, mode: `MaxEncodedLen`) + /// Storage: `Lottery::Lottery` (r:1 w:0) + /// Proof: `Lottery::Lottery` (`max_values`: Some(1), `max_size`: Some(29), added: 524, mode: `MaxEncodedLen`) + /// Storage: `Lottery::CallIndices` (r:1 w:0) + /// Proof: `Lottery::CallIndices` (`max_values`: Some(1), `max_size`: Some(21), added: 516, mode: `MaxEncodedLen`) + /// Storage: `Lottery::TicketsCount` (r:1 w:1) + /// Proof: `Lottery::TicketsCount` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `Lottery::Participants` (r:1 w:1) + /// Proof: `Lottery::Participants` (`max_values`: None, `max_size`: Some(65), added: 2540, mode: `MaxEncodedLen`) + /// Storage: `Lottery::LotteryIndex` (r:1 w:0) + /// Proof: `Lottery::LotteryIndex` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `Lottery::Tickets` (r:0 w:1) + /// Proof: `Lottery::Tickets` (`max_values`: None, `max_size`: Some(44), added: 2519, mode: `MaxEncodedLen`) fn buy_ticket() -> Weight { // Proof Size summary in bytes: - // Measured: `452` - // Estimated: `3593` - // Minimum execution time: 60_298_000 picoseconds. - Weight::from_parts(62_058_000, 3593) - .saturating_add(RocksDbWeight::get().reads(6_u64)) + // Measured: `492` + // Estimated: `3997` + // Minimum execution time: 60_979_000 picoseconds. + Weight::from_parts(63_452_000, 3997) + .saturating_add(RocksDbWeight::get().reads(8_u64)) .saturating_add(RocksDbWeight::get().writes(4_u64)) } - /// Storage: Lottery CallIndices (r:0 w:1) - /// Proof: Lottery CallIndices (max_values: Some(1), max_size: Some(21), added: 516, mode: MaxEncodedLen) + /// Storage: `Lottery::CallIndices` (r:0 w:1) + /// Proof: `Lottery::CallIndices` (`max_values`: Some(1), `max_size`: Some(21), added: 516, mode: `MaxEncodedLen`) /// The range of component `n` is `[0, 10]`. fn set_calls(n: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_291_000 picoseconds. - Weight::from_parts(8_178_186, 0) - // Standard Error: 3_048 - .saturating_add(Weight::from_parts(330_871, 0).saturating_mul(n.into())) + // Minimum execution time: 5_245_000 picoseconds. + Weight::from_parts(6_113_777, 0) + // Standard Error: 3_280 + .saturating_add(Weight::from_parts(349_366, 0).saturating_mul(n.into())) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Lottery Lottery (r:1 w:1) - /// Proof: Lottery Lottery (max_values: Some(1), max_size: Some(29), added: 524, mode: MaxEncodedLen) - /// Storage: Lottery LotteryIndex (r:1 w:1) - /// Proof: Lottery LotteryIndex (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: `Lottery::Lottery` (r:1 w:1) + /// Proof: `Lottery::Lottery` (`max_values`: Some(1), `max_size`: Some(29), added: 524, mode: `MaxEncodedLen`) + /// Storage: `Lottery::LotteryIndex` (r:1 w:1) + /// Proof: `Lottery::LotteryIndex` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) fn start_lottery() -> Weight { // Proof Size summary in bytes: - // Measured: `161` + // Measured: `194` // Estimated: `3593` - // Minimum execution time: 36_741_000 picoseconds. - Weight::from_parts(38_288_000, 3593) + // Minimum execution time: 29_131_000 picoseconds. + Weight::from_parts(29_722_000, 3593) .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(3_u64)) } - /// Storage: Lottery Lottery (r:1 w:1) - /// Proof: Lottery Lottery (max_values: Some(1), max_size: Some(29), added: 524, mode: MaxEncodedLen) + /// Storage: `Lottery::Lottery` (r:1 w:1) + /// Proof: `Lottery::Lottery` (`max_values`: Some(1), `max_size`: Some(29), added: 524, mode: `MaxEncodedLen`) fn stop_repeat() -> Weight { // Proof Size summary in bytes: - // Measured: `219` + // Measured: `252` // Estimated: `1514` - // Minimum execution time: 7_270_000 picoseconds. - Weight::from_parts(7_578_000, 1514) + // Minimum execution time: 6_413_000 picoseconds. + Weight::from_parts(6_702_000, 1514) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: RandomnessCollectiveFlip RandomMaterial (r:1 w:0) - /// Proof: RandomnessCollectiveFlip RandomMaterial (max_values: Some(1), max_size: Some(2594), added: 3089, mode: MaxEncodedLen) - /// Storage: Lottery Lottery (r:1 w:1) - /// Proof: Lottery Lottery (max_values: Some(1), max_size: Some(29), added: 524, mode: MaxEncodedLen) - /// Storage: System Account (r:2 w:2) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) - /// Storage: Lottery TicketsCount (r:1 w:1) - /// Proof: Lottery TicketsCount (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: Lottery Tickets (r:1 w:0) - /// Proof: Lottery Tickets (max_values: None, max_size: Some(44), added: 2519, mode: MaxEncodedLen) + /// Storage: `RandomnessCollectiveFlip::RandomMaterial` (r:1 w:0) + /// Proof: `RandomnessCollectiveFlip::RandomMaterial` (`max_values`: Some(1), `max_size`: Some(2594), added: 3089, mode: `MaxEncodedLen`) + /// Storage: `Lottery::Lottery` (r:1 w:1) + /// Proof: `Lottery::Lottery` (`max_values`: Some(1), `max_size`: Some(29), added: 524, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:2 w:2) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `Lottery::TicketsCount` (r:1 w:1) + /// Proof: `Lottery::TicketsCount` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `Lottery::Tickets` (r:1 w:0) + /// Proof: `Lottery::Tickets` (`max_values`: None, `max_size`: Some(44), added: 2519, mode: `MaxEncodedLen`) fn on_initialize_end() -> Weight { // Proof Size summary in bytes: - // Measured: `558` + // Measured: `591` // Estimated: `6196` - // Minimum execution time: 76_611_000 picoseconds. - Weight::from_parts(78_107_000, 6196) + // Minimum execution time: 65_913_000 picoseconds. + Weight::from_parts(66_864_000, 6196) .saturating_add(RocksDbWeight::get().reads(6_u64)) .saturating_add(RocksDbWeight::get().writes(4_u64)) } - /// Storage: RandomnessCollectiveFlip RandomMaterial (r:1 w:0) - /// Proof: RandomnessCollectiveFlip RandomMaterial (max_values: Some(1), max_size: Some(2594), added: 3089, mode: MaxEncodedLen) - /// Storage: Lottery Lottery (r:1 w:1) - /// Proof: Lottery Lottery (max_values: Some(1), max_size: Some(29), added: 524, mode: MaxEncodedLen) - /// Storage: System Account (r:2 w:2) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) - /// Storage: Lottery TicketsCount (r:1 w:1) - /// Proof: Lottery TicketsCount (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: Lottery Tickets (r:1 w:0) - /// Proof: Lottery Tickets (max_values: None, max_size: Some(44), added: 2519, mode: MaxEncodedLen) - /// Storage: Lottery LotteryIndex (r:1 w:1) - /// Proof: Lottery LotteryIndex (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + /// Storage: `RandomnessCollectiveFlip::RandomMaterial` (r:1 w:0) + /// Proof: `RandomnessCollectiveFlip::RandomMaterial` (`max_values`: Some(1), `max_size`: Some(2594), added: 3089, mode: `MaxEncodedLen`) + /// Storage: `Lottery::Lottery` (r:1 w:1) + /// Proof: `Lottery::Lottery` (`max_values`: Some(1), `max_size`: Some(29), added: 524, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:2 w:2) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `Lottery::TicketsCount` (r:1 w:1) + /// Proof: `Lottery::TicketsCount` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `Lottery::Tickets` (r:1 w:0) + /// Proof: `Lottery::Tickets` (`max_values`: None, `max_size`: Some(44), added: 2519, mode: `MaxEncodedLen`) + /// Storage: `Lottery::LotteryIndex` (r:1 w:1) + /// Proof: `Lottery::LotteryIndex` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) fn on_initialize_repeat() -> Weight { // Proof Size summary in bytes: - // Measured: `558` + // Measured: `591` // Estimated: `6196` - // Minimum execution time: 78_731_000 picoseconds. - Weight::from_parts(80_248_000, 6196) + // Minimum execution time: 66_950_000 picoseconds. + Weight::from_parts(68_405_000, 6196) .saturating_add(RocksDbWeight::get().reads(7_u64)) .saturating_add(RocksDbWeight::get().writes(5_u64)) } diff --git a/substrate/frame/membership/Cargo.toml b/substrate/frame/membership/Cargo.toml index 658bf67f12f2c67d9abe84984437ce98c4373958..6f67db0ae709901f30c2339c40fd6d3399b06606 100644 --- a/substrate/frame/membership/Cargo.toml +++ b/substrate/frame/membership/Cargo.toml @@ -17,8 +17,8 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false } -log = { version = "0.4.17", default-features = false } -scale-info = { version = "2.10.0", default-features = false, features = ["derive", "serde"] } +log = { workspace = true } +scale-info = { version = "2.11.1", default-features = false, features = ["derive", "serde"] } frame-benchmarking = { path = "../benchmarking", default-features = false, optional = true } frame-support = { path = "../support", default-features = false } frame-system = { path = "../system", default-features = false } diff --git a/substrate/frame/membership/src/lib.rs b/substrate/frame/membership/src/lib.rs index 0e03c097d1233e5b253fbf3be86faf44b065f145..aa6be6497eea697235f71c2927b1adf6044052bd 100644 --- a/substrate/frame/membership/src/lib.rs +++ b/substrate/frame/membership/src/lib.rs @@ -27,7 +27,7 @@ use frame_support::{ traits::{ChangeMembers, Contains, Get, InitializeMembers, SortedMembers}, BoundedVec, }; -use sp_runtime::traits::StaticLookup; +use sp_runtime::traits::{StaticLookup, UniqueSaturatedInto}; use sp_std::prelude::*; pub mod migrations; @@ -46,7 +46,7 @@ pub mod pallet { use frame_support::pallet_prelude::*; use frame_system::pallet_prelude::*; - /// The current storage version. + /// The in-code storage version. const STORAGE_VERSION: StorageVersion = StorageVersion::new(4); #[pallet::pallet] @@ -163,12 +163,16 @@ pub mod pallet { /// /// May only be called from `T::AddOrigin`. #[pallet::call_index(0)] - #[pallet::weight({50_000_000})] - pub fn add_member(origin: OriginFor, who: AccountIdLookupOf) -> DispatchResult { + #[pallet::weight(T::WeightInfo::add_member(T::MaxMembers::get()))] + pub fn add_member( + origin: OriginFor, + who: AccountIdLookupOf, + ) -> DispatchResultWithPostInfo { T::AddOrigin::ensure_origin(origin)?; let who = T::Lookup::lookup(who)?; let mut members = >::get(); + let init_length = members.len(); let location = members.binary_search(&who).err().ok_or(Error::::AlreadyMember)?; members .try_insert(location, who.clone()) @@ -179,19 +183,24 @@ pub mod pallet { T::MembershipChanged::change_members_sorted(&[who], &[], &members[..]); Self::deposit_event(Event::MemberAdded); - Ok(()) + + Ok(Some(T::WeightInfo::add_member(init_length as u32)).into()) } /// Remove a member `who` from the set. /// /// May only be called from `T::RemoveOrigin`. #[pallet::call_index(1)] - #[pallet::weight({50_000_000})] - pub fn remove_member(origin: OriginFor, who: AccountIdLookupOf) -> DispatchResult { + #[pallet::weight(T::WeightInfo::remove_member(T::MaxMembers::get()))] + pub fn remove_member( + origin: OriginFor, + who: AccountIdLookupOf, + ) -> DispatchResultWithPostInfo { T::RemoveOrigin::ensure_origin(origin)?; let who = T::Lookup::lookup(who)?; let mut members = >::get(); + let init_length = members.len(); let location = members.binary_search(&who).ok().ok_or(Error::::NotMember)?; members.remove(location); @@ -201,7 +210,7 @@ pub mod pallet { Self::rejig_prime(&members); Self::deposit_event(Event::MemberRemoved); - Ok(()) + Ok(Some(T::WeightInfo::remove_member(init_length as u32)).into()) } /// Swap out one member `remove` for another `add`. @@ -210,18 +219,18 @@ pub mod pallet { /// /// Prime membership is *not* passed from `remove` to `add`, if extant. #[pallet::call_index(2)] - #[pallet::weight({50_000_000})] + #[pallet::weight(T::WeightInfo::swap_member(T::MaxMembers::get()))] pub fn swap_member( origin: OriginFor, remove: AccountIdLookupOf, add: AccountIdLookupOf, - ) -> DispatchResult { + ) -> DispatchResultWithPostInfo { T::SwapOrigin::ensure_origin(origin)?; let remove = T::Lookup::lookup(remove)?; let add = T::Lookup::lookup(add)?; if remove == add { - return Ok(()) + return Ok(().into()); } let mut members = >::get(); @@ -236,7 +245,7 @@ pub mod pallet { Self::rejig_prime(&members); Self::deposit_event(Event::MembersSwapped); - Ok(()) + Ok(Some(T::WeightInfo::swap_member(members.len() as u32)).into()) } /// Change the membership to a new set, disregarding the existing membership. Be nice and @@ -244,7 +253,7 @@ pub mod pallet { /// /// May only be called from `T::ResetOrigin`. #[pallet::call_index(3)] - #[pallet::weight({50_000_000})] + #[pallet::weight(T::WeightInfo::reset_members(members.len().unique_saturated_into()))] pub fn reset_members(origin: OriginFor, members: Vec) -> DispatchResult { T::ResetOrigin::ensure_origin(origin)?; @@ -267,56 +276,65 @@ pub mod pallet { /// /// Prime membership is passed from the origin account to `new`, if extant. #[pallet::call_index(4)] - #[pallet::weight({50_000_000})] - pub fn change_key(origin: OriginFor, new: AccountIdLookupOf) -> DispatchResult { + #[pallet::weight(T::WeightInfo::change_key(T::MaxMembers::get()))] + pub fn change_key( + origin: OriginFor, + new: AccountIdLookupOf, + ) -> DispatchResultWithPostInfo { let remove = ensure_signed(origin)?; let new = T::Lookup::lookup(new)?; - if remove != new { - let mut members = >::get(); - let location = - members.binary_search(&remove).ok().ok_or(Error::::NotMember)?; - let _ = members.binary_search(&new).err().ok_or(Error::::AlreadyMember)?; - members[location] = new.clone(); - members.sort(); - - >::put(&members); - - T::MembershipChanged::change_members_sorted( - &[new.clone()], - &[remove.clone()], - &members[..], - ); - - if Prime::::get() == Some(remove) { - Prime::::put(&new); - T::MembershipChanged::set_prime(Some(new)); - } + if remove == new { + return Ok(().into()); + } + + let mut members = >::get(); + let members_length = members.len() as u32; + let location = members.binary_search(&remove).ok().ok_or(Error::::NotMember)?; + let _ = members.binary_search(&new).err().ok_or(Error::::AlreadyMember)?; + members[location] = new.clone(); + members.sort(); + + >::put(&members); + + T::MembershipChanged::change_members_sorted( + &[new.clone()], + &[remove.clone()], + &members[..], + ); + + if Prime::::get() == Some(remove) { + Prime::::put(&new); + T::MembershipChanged::set_prime(Some(new)); } Self::deposit_event(Event::KeyChanged); - Ok(()) + Ok(Some(T::WeightInfo::change_key(members_length)).into()) } /// Set the prime member. Must be a current member. /// /// May only be called from `T::PrimeOrigin`. #[pallet::call_index(5)] - #[pallet::weight({50_000_000})] - pub fn set_prime(origin: OriginFor, who: AccountIdLookupOf) -> DispatchResult { + #[pallet::weight(T::WeightInfo::set_prime(T::MaxMembers::get()))] + pub fn set_prime( + origin: OriginFor, + who: AccountIdLookupOf, + ) -> DispatchResultWithPostInfo { T::PrimeOrigin::ensure_origin(origin)?; let who = T::Lookup::lookup(who)?; - Self::members().binary_search(&who).ok().ok_or(Error::::NotMember)?; + let members = Self::members(); + members.binary_search(&who).ok().ok_or(Error::::NotMember)?; Prime::::put(&who); T::MembershipChanged::set_prime(Some(who)); - Ok(()) + Ok(Some(T::WeightInfo::set_prime(members.len() as u32)).into()) } /// Remove the prime member if it exists. /// /// May only be called from `T::PrimeOrigin`. #[pallet::call_index(6)] - #[pallet::weight({50_000_000})] + #[pallet::weight(T::WeightInfo::clear_prime())] pub fn clear_prime(origin: OriginFor) -> DispatchResult { T::PrimeOrigin::ensure_origin(origin)?; Prime::::kill(); @@ -351,6 +369,18 @@ impl, I: 'static> SortedMembers for Pallet { fn count() -> usize { Members::::decode_len().unwrap_or(0) } + + #[cfg(feature = "runtime-benchmarks")] + fn add(new_member: &T::AccountId) { + use frame_support::{assert_ok, traits::EnsureOrigin}; + let new_member_lookup = T::Lookup::unlookup(new_member.clone()); + + if let Ok(origin) = T::AddOrigin::try_successful_origin() { + assert_ok!(Pallet::::add_member(origin, new_member_lookup,)); + } else { + log::error!(target: LOG_TARGET, "Failed to add `{new_member:?}` in `SortedMembers::add`.") + } + } } #[cfg(feature = "runtime-benchmarks")] @@ -442,7 +472,7 @@ mod benchmark { } // er keep the prime common between incoming and outgoing to make sure it is rejigged. - reset_member { + reset_members { let m in 1 .. T::MaxMembers::get(); let members = (1..m+1).map(|i| account("member", i, SEED)).collect::>(); @@ -500,8 +530,7 @@ mod benchmark { } clear_prime { - let m in 1 .. T::MaxMembers::get(); - let members = (0..m).map(|i| account("member", i, SEED)).collect::>(); + let members = (0..T::MaxMembers::get()).map(|i| account("member", i, SEED)).collect::>(); let prime = members.last().cloned().unwrap(); set_members::(members, None); }: { @@ -523,16 +552,12 @@ mod tests { use super::*; use crate as pallet_membership; - use sp_core::H256; - use sp_runtime::{ - bounded_vec, - traits::{BadOrigin, BlakeTwo256, IdentityLookup}, - BuildStorage, - }; + use sp_runtime::{bounded_vec, traits::BadOrigin, BuildStorage}; use frame_support::{ - assert_noop, assert_ok, derive_impl, ord_parameter_types, parameter_types, - traits::{ConstU32, ConstU64, StorageVersion}, + assert_noop, assert_ok, assert_storage_noop, derive_impl, ord_parameter_types, + parameter_types, + traits::{ConstU32, StorageVersion}, }; use frame_system::EnsureSignedBy; @@ -551,31 +576,9 @@ mod tests { pub static Prime: Option = None; } - #[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] + #[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { - type BaseCallFilter = frame_support::traits::Everything; - type BlockWeights = (); - type BlockLength = (); - type DbWeight = (); - type RuntimeOrigin = RuntimeOrigin; - type Nonce = u64; - type Hash = H256; - type RuntimeCall = RuntimeCall; - type Hashing = BlakeTwo256; - type AccountId = u64; - type Lookup = IdentityLookup; type Block = Block; - type RuntimeEvent = RuntimeEvent; - type BlockHashCount = ConstU64<250>; - type Version = (); - type PalletInfo = PalletInfo; - type AccountData = (); - type OnNewAccount = (); - type OnKilledAccount = (); - type SystemWeightInfo = (); - type SS58Prefix = (); - type OnSetCode = (); - type MaxConsumers = ConstU32<16>; } ord_parameter_types! { pub const One: u64 = 1; @@ -743,6 +746,17 @@ mod tests { }); } + #[test] + fn swap_member_with_identical_arguments_changes_nothing() { + new_test_ext().execute_with(|| { + assert_storage_noop!(assert_ok!(Membership::swap_member( + RuntimeOrigin::signed(3), + 10, + 10 + ))); + }); + } + #[test] fn change_key_works() { new_test_ext().execute_with(|| { @@ -772,6 +786,13 @@ mod tests { }); } + #[test] + fn change_key_with_same_caller_as_argument_changes_nothing() { + new_test_ext().execute_with(|| { + assert_storage_noop!(assert_ok!(Membership::change_key(RuntimeOrigin::signed(10), 10))); + }); + } + #[test] fn reset_members_works() { new_test_ext().execute_with(|| { diff --git a/substrate/frame/membership/src/weights.rs b/substrate/frame/membership/src/weights.rs index 18ea7fcb315a3134747743f1a913856d084e5ad6..10e9c9afa5828c10565bfae7be2058e7bd56cc27 100644 --- a/substrate/frame/membership/src/weights.rs +++ b/substrate/frame/membership/src/weights.rs @@ -15,16 +15,16 @@ // See the License for the specific language governing permissions and // limitations under the License. -//! Autogenerated weights for pallet_membership +//! Autogenerated weights for `pallet_membership` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-06-16, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-04-09, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-e8ezs4ez-project-145-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("dev"), DB CACHE: 1024 +//! HOSTNAME: `runner-anb7yjbi-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: `1024` // Executed Command: -// ./target/production/substrate +// ./target/production/substrate-node // benchmark // pallet // --chain=dev @@ -35,12 +35,11 @@ // --no-median-slopes // --no-min-squares // --extrinsic=* -// --execution=wasm // --wasm-execution=compiled // --heap-pages=4096 -// --output=./frame/membership/src/weights.rs -// --header=./HEADER-APACHE2 -// --template=./.maintain/frame-weight-template.hbs +// --output=./substrate/frame/membership/src/weights.rs +// --header=./substrate/HEADER-APACHE2 +// --template=./substrate/.maintain/frame-weight-template.hbs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -50,316 +49,310 @@ use frame_support::{traits::Get, weights::{Weight, constants::RocksDbWeight}}; use core::marker::PhantomData; -/// Weight functions needed for pallet_membership. +/// Weight functions needed for `pallet_membership`. pub trait WeightInfo { fn add_member(m: u32, ) -> Weight; fn remove_member(m: u32, ) -> Weight; fn swap_member(m: u32, ) -> Weight; - fn reset_member(m: u32, ) -> Weight; + fn reset_members(m: u32, ) -> Weight; fn change_key(m: u32, ) -> Weight; fn set_prime(m: u32, ) -> Weight; - fn clear_prime(m: u32, ) -> Weight; + fn clear_prime() -> Weight; } -/// Weights for pallet_membership using the Substrate node and recommended hardware. +/// Weights for `pallet_membership` using the Substrate node and recommended hardware. pub struct SubstrateWeight(PhantomData); impl WeightInfo for SubstrateWeight { - /// Storage: TechnicalMembership Members (r:1 w:1) - /// Proof: TechnicalMembership Members (max_values: Some(1), max_size: Some(3202), added: 3697, mode: MaxEncodedLen) - /// Storage: TechnicalCommittee Proposals (r:1 w:0) - /// Proof Skipped: TechnicalCommittee Proposals (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: TechnicalCommittee Members (r:0 w:1) - /// Proof Skipped: TechnicalCommittee Members (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: TechnicalCommittee Prime (r:0 w:1) - /// Proof Skipped: TechnicalCommittee Prime (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: `TechnicalMembership::Members` (r:1 w:1) + /// Proof: `TechnicalMembership::Members` (`max_values`: Some(1), `max_size`: Some(3202), added: 3697, mode: `MaxEncodedLen`) + /// Storage: `TechnicalCommittee::Proposals` (r:1 w:0) + /// Proof: `TechnicalCommittee::Proposals` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `TechnicalCommittee::Members` (r:0 w:1) + /// Proof: `TechnicalCommittee::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `TechnicalCommittee::Prime` (r:0 w:1) + /// Proof: `TechnicalCommittee::Prime` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) /// The range of component `m` is `[1, 99]`. fn add_member(m: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `208 + m * (64 ±0)` + // Measured: `207 + m * (64 ±0)` // Estimated: `4687 + m * (64 ±0)` - // Minimum execution time: 17_040_000 picoseconds. - Weight::from_parts(18_344_571, 4687) - // Standard Error: 847 - .saturating_add(Weight::from_parts(50_842, 0).saturating_mul(m.into())) + // Minimum execution time: 12_827_000 picoseconds. + Weight::from_parts(13_743_651, 4687) + // Standard Error: 622 + .saturating_add(Weight::from_parts(35_417, 0).saturating_mul(m.into())) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(3_u64)) .saturating_add(Weight::from_parts(0, 64).saturating_mul(m.into())) } - /// Storage: TechnicalMembership Members (r:1 w:1) - /// Proof: TechnicalMembership Members (max_values: Some(1), max_size: Some(3202), added: 3697, mode: MaxEncodedLen) - /// Storage: TechnicalCommittee Proposals (r:1 w:0) - /// Proof Skipped: TechnicalCommittee Proposals (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: TechnicalMembership Prime (r:1 w:0) - /// Proof: TechnicalMembership Prime (max_values: Some(1), max_size: Some(32), added: 527, mode: MaxEncodedLen) - /// Storage: TechnicalCommittee Members (r:0 w:1) - /// Proof Skipped: TechnicalCommittee Members (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: TechnicalCommittee Prime (r:0 w:1) - /// Proof Skipped: TechnicalCommittee Prime (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: `TechnicalMembership::Members` (r:1 w:1) + /// Proof: `TechnicalMembership::Members` (`max_values`: Some(1), `max_size`: Some(3202), added: 3697, mode: `MaxEncodedLen`) + /// Storage: `TechnicalCommittee::Proposals` (r:1 w:0) + /// Proof: `TechnicalCommittee::Proposals` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `TechnicalMembership::Prime` (r:1 w:0) + /// Proof: `TechnicalMembership::Prime` (`max_values`: Some(1), `max_size`: Some(32), added: 527, mode: `MaxEncodedLen`) + /// Storage: `TechnicalCommittee::Members` (r:0 w:1) + /// Proof: `TechnicalCommittee::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `TechnicalCommittee::Prime` (r:0 w:1) + /// Proof: `TechnicalCommittee::Prime` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) /// The range of component `m` is `[2, 100]`. fn remove_member(m: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `312 + m * (64 ±0)` + // Measured: `311 + m * (64 ±0)` // Estimated: `4687 + m * (64 ±0)` - // Minimum execution time: 20_088_000 picoseconds. - Weight::from_parts(21_271_384, 4687) - // Standard Error: 786 - .saturating_add(Weight::from_parts(44_806, 0).saturating_mul(m.into())) + // Minimum execution time: 15_197_000 picoseconds. + Weight::from_parts(16_172_409, 4687) + // Standard Error: 650 + .saturating_add(Weight::from_parts(35_790, 0).saturating_mul(m.into())) .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(3_u64)) .saturating_add(Weight::from_parts(0, 64).saturating_mul(m.into())) } - /// Storage: TechnicalMembership Members (r:1 w:1) - /// Proof: TechnicalMembership Members (max_values: Some(1), max_size: Some(3202), added: 3697, mode: MaxEncodedLen) - /// Storage: TechnicalCommittee Proposals (r:1 w:0) - /// Proof Skipped: TechnicalCommittee Proposals (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: TechnicalMembership Prime (r:1 w:0) - /// Proof: TechnicalMembership Prime (max_values: Some(1), max_size: Some(32), added: 527, mode: MaxEncodedLen) - /// Storage: TechnicalCommittee Members (r:0 w:1) - /// Proof Skipped: TechnicalCommittee Members (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: TechnicalCommittee Prime (r:0 w:1) - /// Proof Skipped: TechnicalCommittee Prime (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: `TechnicalMembership::Members` (r:1 w:1) + /// Proof: `TechnicalMembership::Members` (`max_values`: Some(1), `max_size`: Some(3202), added: 3697, mode: `MaxEncodedLen`) + /// Storage: `TechnicalCommittee::Proposals` (r:1 w:0) + /// Proof: `TechnicalCommittee::Proposals` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `TechnicalMembership::Prime` (r:1 w:0) + /// Proof: `TechnicalMembership::Prime` (`max_values`: Some(1), `max_size`: Some(32), added: 527, mode: `MaxEncodedLen`) + /// Storage: `TechnicalCommittee::Members` (r:0 w:1) + /// Proof: `TechnicalCommittee::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `TechnicalCommittee::Prime` (r:0 w:1) + /// Proof: `TechnicalCommittee::Prime` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) /// The range of component `m` is `[2, 100]`. fn swap_member(m: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `312 + m * (64 ±0)` + // Measured: `311 + m * (64 ±0)` // Estimated: `4687 + m * (64 ±0)` - // Minimum execution time: 20_308_000 picoseconds. - Weight::from_parts(21_469_843, 4687) - // Standard Error: 782 - .saturating_add(Weight::from_parts(56_893, 0).saturating_mul(m.into())) + // Minimum execution time: 15_558_000 picoseconds. + Weight::from_parts(16_370_827, 4687) + // Standard Error: 603 + .saturating_add(Weight::from_parts(45_739, 0).saturating_mul(m.into())) .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(3_u64)) .saturating_add(Weight::from_parts(0, 64).saturating_mul(m.into())) } - /// Storage: TechnicalMembership Members (r:1 w:1) - /// Proof: TechnicalMembership Members (max_values: Some(1), max_size: Some(3202), added: 3697, mode: MaxEncodedLen) - /// Storage: TechnicalCommittee Proposals (r:1 w:0) - /// Proof Skipped: TechnicalCommittee Proposals (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: TechnicalMembership Prime (r:1 w:0) - /// Proof: TechnicalMembership Prime (max_values: Some(1), max_size: Some(32), added: 527, mode: MaxEncodedLen) - /// Storage: TechnicalCommittee Members (r:0 w:1) - /// Proof Skipped: TechnicalCommittee Members (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: TechnicalCommittee Prime (r:0 w:1) - /// Proof Skipped: TechnicalCommittee Prime (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: `TechnicalMembership::Members` (r:1 w:1) + /// Proof: `TechnicalMembership::Members` (`max_values`: Some(1), `max_size`: Some(3202), added: 3697, mode: `MaxEncodedLen`) + /// Storage: `TechnicalCommittee::Proposals` (r:1 w:0) + /// Proof: `TechnicalCommittee::Proposals` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `TechnicalMembership::Prime` (r:1 w:0) + /// Proof: `TechnicalMembership::Prime` (`max_values`: Some(1), `max_size`: Some(32), added: 527, mode: `MaxEncodedLen`) + /// Storage: `TechnicalCommittee::Members` (r:0 w:1) + /// Proof: `TechnicalCommittee::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `TechnicalCommittee::Prime` (r:0 w:1) + /// Proof: `TechnicalCommittee::Prime` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) /// The range of component `m` is `[1, 100]`. - fn reset_member(m: u32, ) -> Weight { + fn reset_members(m: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `312 + m * (64 ±0)` + // Measured: `311 + m * (64 ±0)` // Estimated: `4687 + m * (64 ±0)` - // Minimum execution time: 19_464_000 picoseconds. - Weight::from_parts(21_223_702, 4687) - // Standard Error: 1_068 - .saturating_add(Weight::from_parts(165_438, 0).saturating_mul(m.into())) + // Minimum execution time: 15_086_000 picoseconds. + Weight::from_parts(16_444_101, 4687) + // Standard Error: 967 + .saturating_add(Weight::from_parts(143_947, 0).saturating_mul(m.into())) .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(3_u64)) .saturating_add(Weight::from_parts(0, 64).saturating_mul(m.into())) } - /// Storage: TechnicalMembership Members (r:1 w:1) - /// Proof: TechnicalMembership Members (max_values: Some(1), max_size: Some(3202), added: 3697, mode: MaxEncodedLen) - /// Storage: TechnicalCommittee Proposals (r:1 w:0) - /// Proof Skipped: TechnicalCommittee Proposals (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: TechnicalMembership Prime (r:1 w:1) - /// Proof: TechnicalMembership Prime (max_values: Some(1), max_size: Some(32), added: 527, mode: MaxEncodedLen) - /// Storage: TechnicalCommittee Members (r:0 w:1) - /// Proof Skipped: TechnicalCommittee Members (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: TechnicalCommittee Prime (r:0 w:1) - /// Proof Skipped: TechnicalCommittee Prime (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: `TechnicalMembership::Members` (r:1 w:1) + /// Proof: `TechnicalMembership::Members` (`max_values`: Some(1), `max_size`: Some(3202), added: 3697, mode: `MaxEncodedLen`) + /// Storage: `TechnicalCommittee::Proposals` (r:1 w:0) + /// Proof: `TechnicalCommittee::Proposals` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `TechnicalMembership::Prime` (r:1 w:1) + /// Proof: `TechnicalMembership::Prime` (`max_values`: Some(1), `max_size`: Some(32), added: 527, mode: `MaxEncodedLen`) + /// Storage: `TechnicalCommittee::Members` (r:0 w:1) + /// Proof: `TechnicalCommittee::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `TechnicalCommittee::Prime` (r:0 w:1) + /// Proof: `TechnicalCommittee::Prime` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) /// The range of component `m` is `[1, 100]`. fn change_key(m: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `312 + m * (64 ±0)` + // Measured: `311 + m * (64 ±0)` // Estimated: `4687 + m * (64 ±0)` - // Minimum execution time: 20_965_000 picoseconds. - Weight::from_parts(22_551_007, 4687) - // Standard Error: 860 - .saturating_add(Weight::from_parts(52_397, 0).saturating_mul(m.into())) + // Minimum execution time: 16_146_000 picoseconds. + Weight::from_parts(17_269_755, 4687) + // Standard Error: 660 + .saturating_add(Weight::from_parts(42_082, 0).saturating_mul(m.into())) .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(4_u64)) .saturating_add(Weight::from_parts(0, 64).saturating_mul(m.into())) } - /// Storage: TechnicalMembership Members (r:1 w:0) - /// Proof: TechnicalMembership Members (max_values: Some(1), max_size: Some(3202), added: 3697, mode: MaxEncodedLen) - /// Storage: TechnicalMembership Prime (r:0 w:1) - /// Proof: TechnicalMembership Prime (max_values: Some(1), max_size: Some(32), added: 527, mode: MaxEncodedLen) - /// Storage: TechnicalCommittee Prime (r:0 w:1) - /// Proof Skipped: TechnicalCommittee Prime (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: `TechnicalMembership::Members` (r:1 w:0) + /// Proof: `TechnicalMembership::Members` (`max_values`: Some(1), `max_size`: Some(3202), added: 3697, mode: `MaxEncodedLen`) + /// Storage: `TechnicalMembership::Prime` (r:0 w:1) + /// Proof: `TechnicalMembership::Prime` (`max_values`: Some(1), `max_size`: Some(32), added: 527, mode: `MaxEncodedLen`) + /// Storage: `TechnicalCommittee::Prime` (r:0 w:1) + /// Proof: `TechnicalCommittee::Prime` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) /// The range of component `m` is `[1, 100]`. fn set_prime(m: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `32 + m * (32 ±0)` + // Measured: `31 + m * (32 ±0)` // Estimated: `4687 + m * (32 ±0)` - // Minimum execution time: 7_481_000 picoseconds. - Weight::from_parts(7_959_053, 4687) - // Standard Error: 364 - .saturating_add(Weight::from_parts(18_653, 0).saturating_mul(m.into())) + // Minimum execution time: 5_937_000 picoseconds. + Weight::from_parts(6_501_085, 4687) + // Standard Error: 323 + .saturating_add(Weight::from_parts(18_285, 0).saturating_mul(m.into())) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) .saturating_add(Weight::from_parts(0, 32).saturating_mul(m.into())) } - /// Storage: TechnicalMembership Prime (r:0 w:1) - /// Proof: TechnicalMembership Prime (max_values: Some(1), max_size: Some(32), added: 527, mode: MaxEncodedLen) - /// Storage: TechnicalCommittee Prime (r:0 w:1) - /// Proof Skipped: TechnicalCommittee Prime (max_values: Some(1), max_size: None, mode: Measured) - /// The range of component `m` is `[1, 100]`. - fn clear_prime(m: u32, ) -> Weight { + /// Storage: `TechnicalMembership::Prime` (r:0 w:1) + /// Proof: `TechnicalMembership::Prime` (`max_values`: Some(1), `max_size`: Some(32), added: 527, mode: `MaxEncodedLen`) + /// Storage: `TechnicalCommittee::Prime` (r:0 w:1) + /// Proof: `TechnicalCommittee::Prime` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + fn clear_prime() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_373_000 picoseconds. - Weight::from_parts(3_750_452, 0) - // Standard Error: 142 - .saturating_add(Weight::from_parts(505, 0).saturating_mul(m.into())) + // Minimum execution time: 2_533_000 picoseconds. + Weight::from_parts(2_807_000, 0) .saturating_add(T::DbWeight::get().writes(2_u64)) } } -// For backwards compatibility and tests +// For backwards compatibility and tests. impl WeightInfo for () { - /// Storage: TechnicalMembership Members (r:1 w:1) - /// Proof: TechnicalMembership Members (max_values: Some(1), max_size: Some(3202), added: 3697, mode: MaxEncodedLen) - /// Storage: TechnicalCommittee Proposals (r:1 w:0) - /// Proof Skipped: TechnicalCommittee Proposals (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: TechnicalCommittee Members (r:0 w:1) - /// Proof Skipped: TechnicalCommittee Members (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: TechnicalCommittee Prime (r:0 w:1) - /// Proof Skipped: TechnicalCommittee Prime (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: `TechnicalMembership::Members` (r:1 w:1) + /// Proof: `TechnicalMembership::Members` (`max_values`: Some(1), `max_size`: Some(3202), added: 3697, mode: `MaxEncodedLen`) + /// Storage: `TechnicalCommittee::Proposals` (r:1 w:0) + /// Proof: `TechnicalCommittee::Proposals` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `TechnicalCommittee::Members` (r:0 w:1) + /// Proof: `TechnicalCommittee::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `TechnicalCommittee::Prime` (r:0 w:1) + /// Proof: `TechnicalCommittee::Prime` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) /// The range of component `m` is `[1, 99]`. fn add_member(m: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `208 + m * (64 ±0)` + // Measured: `207 + m * (64 ±0)` // Estimated: `4687 + m * (64 ±0)` - // Minimum execution time: 17_040_000 picoseconds. - Weight::from_parts(18_344_571, 4687) - // Standard Error: 847 - .saturating_add(Weight::from_parts(50_842, 0).saturating_mul(m.into())) + // Minimum execution time: 12_827_000 picoseconds. + Weight::from_parts(13_743_651, 4687) + // Standard Error: 622 + .saturating_add(Weight::from_parts(35_417, 0).saturating_mul(m.into())) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(3_u64)) .saturating_add(Weight::from_parts(0, 64).saturating_mul(m.into())) } - /// Storage: TechnicalMembership Members (r:1 w:1) - /// Proof: TechnicalMembership Members (max_values: Some(1), max_size: Some(3202), added: 3697, mode: MaxEncodedLen) - /// Storage: TechnicalCommittee Proposals (r:1 w:0) - /// Proof Skipped: TechnicalCommittee Proposals (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: TechnicalMembership Prime (r:1 w:0) - /// Proof: TechnicalMembership Prime (max_values: Some(1), max_size: Some(32), added: 527, mode: MaxEncodedLen) - /// Storage: TechnicalCommittee Members (r:0 w:1) - /// Proof Skipped: TechnicalCommittee Members (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: TechnicalCommittee Prime (r:0 w:1) - /// Proof Skipped: TechnicalCommittee Prime (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: `TechnicalMembership::Members` (r:1 w:1) + /// Proof: `TechnicalMembership::Members` (`max_values`: Some(1), `max_size`: Some(3202), added: 3697, mode: `MaxEncodedLen`) + /// Storage: `TechnicalCommittee::Proposals` (r:1 w:0) + /// Proof: `TechnicalCommittee::Proposals` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `TechnicalMembership::Prime` (r:1 w:0) + /// Proof: `TechnicalMembership::Prime` (`max_values`: Some(1), `max_size`: Some(32), added: 527, mode: `MaxEncodedLen`) + /// Storage: `TechnicalCommittee::Members` (r:0 w:1) + /// Proof: `TechnicalCommittee::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `TechnicalCommittee::Prime` (r:0 w:1) + /// Proof: `TechnicalCommittee::Prime` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) /// The range of component `m` is `[2, 100]`. fn remove_member(m: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `312 + m * (64 ±0)` + // Measured: `311 + m * (64 ±0)` // Estimated: `4687 + m * (64 ±0)` - // Minimum execution time: 20_088_000 picoseconds. - Weight::from_parts(21_271_384, 4687) - // Standard Error: 786 - .saturating_add(Weight::from_parts(44_806, 0).saturating_mul(m.into())) + // Minimum execution time: 15_197_000 picoseconds. + Weight::from_parts(16_172_409, 4687) + // Standard Error: 650 + .saturating_add(Weight::from_parts(35_790, 0).saturating_mul(m.into())) .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(3_u64)) .saturating_add(Weight::from_parts(0, 64).saturating_mul(m.into())) } - /// Storage: TechnicalMembership Members (r:1 w:1) - /// Proof: TechnicalMembership Members (max_values: Some(1), max_size: Some(3202), added: 3697, mode: MaxEncodedLen) - /// Storage: TechnicalCommittee Proposals (r:1 w:0) - /// Proof Skipped: TechnicalCommittee Proposals (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: TechnicalMembership Prime (r:1 w:0) - /// Proof: TechnicalMembership Prime (max_values: Some(1), max_size: Some(32), added: 527, mode: MaxEncodedLen) - /// Storage: TechnicalCommittee Members (r:0 w:1) - /// Proof Skipped: TechnicalCommittee Members (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: TechnicalCommittee Prime (r:0 w:1) - /// Proof Skipped: TechnicalCommittee Prime (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: `TechnicalMembership::Members` (r:1 w:1) + /// Proof: `TechnicalMembership::Members` (`max_values`: Some(1), `max_size`: Some(3202), added: 3697, mode: `MaxEncodedLen`) + /// Storage: `TechnicalCommittee::Proposals` (r:1 w:0) + /// Proof: `TechnicalCommittee::Proposals` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `TechnicalMembership::Prime` (r:1 w:0) + /// Proof: `TechnicalMembership::Prime` (`max_values`: Some(1), `max_size`: Some(32), added: 527, mode: `MaxEncodedLen`) + /// Storage: `TechnicalCommittee::Members` (r:0 w:1) + /// Proof: `TechnicalCommittee::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `TechnicalCommittee::Prime` (r:0 w:1) + /// Proof: `TechnicalCommittee::Prime` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) /// The range of component `m` is `[2, 100]`. fn swap_member(m: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `312 + m * (64 ±0)` + // Measured: `311 + m * (64 ±0)` // Estimated: `4687 + m * (64 ±0)` - // Minimum execution time: 20_308_000 picoseconds. - Weight::from_parts(21_469_843, 4687) - // Standard Error: 782 - .saturating_add(Weight::from_parts(56_893, 0).saturating_mul(m.into())) + // Minimum execution time: 15_558_000 picoseconds. + Weight::from_parts(16_370_827, 4687) + // Standard Error: 603 + .saturating_add(Weight::from_parts(45_739, 0).saturating_mul(m.into())) .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(3_u64)) .saturating_add(Weight::from_parts(0, 64).saturating_mul(m.into())) } - /// Storage: TechnicalMembership Members (r:1 w:1) - /// Proof: TechnicalMembership Members (max_values: Some(1), max_size: Some(3202), added: 3697, mode: MaxEncodedLen) - /// Storage: TechnicalCommittee Proposals (r:1 w:0) - /// Proof Skipped: TechnicalCommittee Proposals (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: TechnicalMembership Prime (r:1 w:0) - /// Proof: TechnicalMembership Prime (max_values: Some(1), max_size: Some(32), added: 527, mode: MaxEncodedLen) - /// Storage: TechnicalCommittee Members (r:0 w:1) - /// Proof Skipped: TechnicalCommittee Members (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: TechnicalCommittee Prime (r:0 w:1) - /// Proof Skipped: TechnicalCommittee Prime (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: `TechnicalMembership::Members` (r:1 w:1) + /// Proof: `TechnicalMembership::Members` (`max_values`: Some(1), `max_size`: Some(3202), added: 3697, mode: `MaxEncodedLen`) + /// Storage: `TechnicalCommittee::Proposals` (r:1 w:0) + /// Proof: `TechnicalCommittee::Proposals` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `TechnicalMembership::Prime` (r:1 w:0) + /// Proof: `TechnicalMembership::Prime` (`max_values`: Some(1), `max_size`: Some(32), added: 527, mode: `MaxEncodedLen`) + /// Storage: `TechnicalCommittee::Members` (r:0 w:1) + /// Proof: `TechnicalCommittee::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `TechnicalCommittee::Prime` (r:0 w:1) + /// Proof: `TechnicalCommittee::Prime` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) /// The range of component `m` is `[1, 100]`. - fn reset_member(m: u32, ) -> Weight { + fn reset_members(m: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `312 + m * (64 ±0)` + // Measured: `311 + m * (64 ±0)` // Estimated: `4687 + m * (64 ±0)` - // Minimum execution time: 19_464_000 picoseconds. - Weight::from_parts(21_223_702, 4687) - // Standard Error: 1_068 - .saturating_add(Weight::from_parts(165_438, 0).saturating_mul(m.into())) + // Minimum execution time: 15_086_000 picoseconds. + Weight::from_parts(16_444_101, 4687) + // Standard Error: 967 + .saturating_add(Weight::from_parts(143_947, 0).saturating_mul(m.into())) .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(3_u64)) .saturating_add(Weight::from_parts(0, 64).saturating_mul(m.into())) } - /// Storage: TechnicalMembership Members (r:1 w:1) - /// Proof: TechnicalMembership Members (max_values: Some(1), max_size: Some(3202), added: 3697, mode: MaxEncodedLen) - /// Storage: TechnicalCommittee Proposals (r:1 w:0) - /// Proof Skipped: TechnicalCommittee Proposals (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: TechnicalMembership Prime (r:1 w:1) - /// Proof: TechnicalMembership Prime (max_values: Some(1), max_size: Some(32), added: 527, mode: MaxEncodedLen) - /// Storage: TechnicalCommittee Members (r:0 w:1) - /// Proof Skipped: TechnicalCommittee Members (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: TechnicalCommittee Prime (r:0 w:1) - /// Proof Skipped: TechnicalCommittee Prime (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: `TechnicalMembership::Members` (r:1 w:1) + /// Proof: `TechnicalMembership::Members` (`max_values`: Some(1), `max_size`: Some(3202), added: 3697, mode: `MaxEncodedLen`) + /// Storage: `TechnicalCommittee::Proposals` (r:1 w:0) + /// Proof: `TechnicalCommittee::Proposals` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `TechnicalMembership::Prime` (r:1 w:1) + /// Proof: `TechnicalMembership::Prime` (`max_values`: Some(1), `max_size`: Some(32), added: 527, mode: `MaxEncodedLen`) + /// Storage: `TechnicalCommittee::Members` (r:0 w:1) + /// Proof: `TechnicalCommittee::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `TechnicalCommittee::Prime` (r:0 w:1) + /// Proof: `TechnicalCommittee::Prime` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) /// The range of component `m` is `[1, 100]`. fn change_key(m: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `312 + m * (64 ±0)` + // Measured: `311 + m * (64 ±0)` // Estimated: `4687 + m * (64 ±0)` - // Minimum execution time: 20_965_000 picoseconds. - Weight::from_parts(22_551_007, 4687) - // Standard Error: 860 - .saturating_add(Weight::from_parts(52_397, 0).saturating_mul(m.into())) + // Minimum execution time: 16_146_000 picoseconds. + Weight::from_parts(17_269_755, 4687) + // Standard Error: 660 + .saturating_add(Weight::from_parts(42_082, 0).saturating_mul(m.into())) .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(4_u64)) .saturating_add(Weight::from_parts(0, 64).saturating_mul(m.into())) } - /// Storage: TechnicalMembership Members (r:1 w:0) - /// Proof: TechnicalMembership Members (max_values: Some(1), max_size: Some(3202), added: 3697, mode: MaxEncodedLen) - /// Storage: TechnicalMembership Prime (r:0 w:1) - /// Proof: TechnicalMembership Prime (max_values: Some(1), max_size: Some(32), added: 527, mode: MaxEncodedLen) - /// Storage: TechnicalCommittee Prime (r:0 w:1) - /// Proof Skipped: TechnicalCommittee Prime (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: `TechnicalMembership::Members` (r:1 w:0) + /// Proof: `TechnicalMembership::Members` (`max_values`: Some(1), `max_size`: Some(3202), added: 3697, mode: `MaxEncodedLen`) + /// Storage: `TechnicalMembership::Prime` (r:0 w:1) + /// Proof: `TechnicalMembership::Prime` (`max_values`: Some(1), `max_size`: Some(32), added: 527, mode: `MaxEncodedLen`) + /// Storage: `TechnicalCommittee::Prime` (r:0 w:1) + /// Proof: `TechnicalCommittee::Prime` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) /// The range of component `m` is `[1, 100]`. fn set_prime(m: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `32 + m * (32 ±0)` + // Measured: `31 + m * (32 ±0)` // Estimated: `4687 + m * (32 ±0)` - // Minimum execution time: 7_481_000 picoseconds. - Weight::from_parts(7_959_053, 4687) - // Standard Error: 364 - .saturating_add(Weight::from_parts(18_653, 0).saturating_mul(m.into())) + // Minimum execution time: 5_937_000 picoseconds. + Weight::from_parts(6_501_085, 4687) + // Standard Error: 323 + .saturating_add(Weight::from_parts(18_285, 0).saturating_mul(m.into())) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) .saturating_add(Weight::from_parts(0, 32).saturating_mul(m.into())) } - /// Storage: TechnicalMembership Prime (r:0 w:1) - /// Proof: TechnicalMembership Prime (max_values: Some(1), max_size: Some(32), added: 527, mode: MaxEncodedLen) - /// Storage: TechnicalCommittee Prime (r:0 w:1) - /// Proof Skipped: TechnicalCommittee Prime (max_values: Some(1), max_size: None, mode: Measured) - /// The range of component `m` is `[1, 100]`. - fn clear_prime(m: u32, ) -> Weight { + /// Storage: `TechnicalMembership::Prime` (r:0 w:1) + /// Proof: `TechnicalMembership::Prime` (`max_values`: Some(1), `max_size`: Some(32), added: 527, mode: `MaxEncodedLen`) + /// Storage: `TechnicalCommittee::Prime` (r:0 w:1) + /// Proof: `TechnicalCommittee::Prime` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + fn clear_prime() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_373_000 picoseconds. - Weight::from_parts(3_750_452, 0) - // Standard Error: 142 - .saturating_add(Weight::from_parts(505, 0).saturating_mul(m.into())) + // Minimum execution time: 2_533_000 picoseconds. + Weight::from_parts(2_807_000, 0) .saturating_add(RocksDbWeight::get().writes(2_u64)) } } diff --git a/substrate/frame/merkle-mountain-range/Cargo.toml b/substrate/frame/merkle-mountain-range/Cargo.toml index 607fa340e9695ea1f66145e27e7ba0ac3183908d..6dc919e16505a164e84c0e5e5b6c4f299b2da955 100644 --- a/substrate/frame/merkle-mountain-range/Cargo.toml +++ b/substrate/frame/merkle-mountain-range/Cargo.toml @@ -16,8 +16,8 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false } -log = { version = "0.4.17", default-features = false } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +log = { workspace = true } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } frame-benchmarking = { path = "../benchmarking", default-features = false, optional = true } frame-support = { path = "../support", default-features = false } frame-system = { path = "../system", default-features = false } @@ -29,7 +29,7 @@ sp-std = { path = "../../primitives/std", default-features = false } [dev-dependencies] array-bytes = "6.1" -env_logger = "0.9" +env_logger = "0.11" itertools = "0.10.3" [features] diff --git a/substrate/frame/merkle-mountain-range/src/lib.rs b/substrate/frame/merkle-mountain-range/src/lib.rs index 664f4bc73901b39f852e9fccf5685b48e402ec4b..7b6edb37b7f7bc8608a417aa9eff6f0713edf9df 100644 --- a/substrate/frame/merkle-mountain-range/src/lib.rs +++ b/substrate/frame/merkle-mountain-range/src/lib.rs @@ -89,7 +89,7 @@ mod tests; /// is not available (since the block is not finished yet), /// we use the `parent_hash` here along with parent block number. pub struct ParentNumberAndHash { - _phanthom: sp_std::marker::PhantomData, + _phantom: sp_std::marker::PhantomData, } impl LeafDataProvider for ParentNumberAndHash { @@ -183,7 +183,6 @@ pub mod pallet { /// Latest MMR Root hash. #[pallet::storage] - #[pallet::getter(fn mmr_root_hash)] pub type RootHash, I: 'static = ()> = StorageValue<_, HashOf, ValueQuery>; /// Current size of the MMR (number of leaves). @@ -204,7 +203,7 @@ pub mod pallet { impl, I: 'static> Hooks> for Pallet { fn on_initialize(_n: BlockNumberFor) -> Weight { use primitives::LeafDataProvider; - let leaves = Self::mmr_leaves(); + let leaves = NumberOfLeaves::::get(); let peaks_before = sp_mmr_primitives::utils::NodesUtils::new(leaves).number_of_peaks(); let data = T::LeafData::leaf_data(); @@ -225,8 +224,8 @@ pub mod pallet { }; >::on_new_root(&root); - >::put(leaves); - >::put(root); + NumberOfLeaves::::put(leaves); + RootHash::::put(root); let peaks_after = sp_mmr_primitives::utils::NodesUtils::new(leaves).number_of_peaks(); @@ -301,7 +300,7 @@ impl, I: 'static> Pallet { { let first_mmr_block = utils::first_mmr_block_num::>( >::block_number(), - Self::mmr_leaves(), + NumberOfLeaves::::get(), )?; utils::block_num_to_leaf_index::>(block_num, first_mmr_block) @@ -341,7 +340,7 @@ impl, I: 'static> Pallet { /// Return the on-chain MMR root hash. pub fn mmr_root() -> HashOf { - Self::mmr_root_hash() + RootHash::::get() } /// Verify MMR proof for given `leaves`. @@ -354,7 +353,7 @@ impl, I: 'static> Pallet { leaves: Vec>, proof: primitives::Proof>, ) -> Result<(), primitives::Error> { - if proof.leaf_count > Self::mmr_leaves() || + if proof.leaf_count > NumberOfLeaves::::get() || proof.leaf_count == 0 || (proof.items.len().saturating_add(leaves.len())) as u64 > proof.leaf_count { diff --git a/substrate/frame/merkle-mountain-range/src/mmr/mod.rs b/substrate/frame/merkle-mountain-range/src/mmr/mod.rs index 536faa68e4e9f05f8d11941bb5cd81fe48e1948f..93fefe910e45df386d0464b455e6f55c44aaa8e0 100644 --- a/substrate/frame/merkle-mountain-range/src/mmr/mod.rs +++ b/substrate/frame/merkle-mountain-range/src/mmr/mod.rs @@ -30,7 +30,7 @@ pub type NodeOf = Node<>::Hashing, L>; pub type Node = DataOrHash; /// Default Merging & Hashing behavior for MMR. -pub struct Hasher(sp_std::marker::PhantomData<(H, L)>); +pub struct Hasher(core::marker::PhantomData<(H, L)>); impl mmr_lib::Merge for Hasher { type Item = Node; diff --git a/substrate/frame/merkle-mountain-range/src/mmr/storage.rs b/substrate/frame/merkle-mountain-range/src/mmr/storage.rs index 03039be83ac1a13383313f7bc09c175705e6d02a..96a20c3445eedea0bfa3d02e99ed07022d30da80 100644 --- a/substrate/frame/merkle-mountain-range/src/mmr/storage.rs +++ b/substrate/frame/merkle-mountain-range/src/mmr/storage.rs @@ -111,7 +111,7 @@ where L: primitives::FullLeaf, { fn get_elem(&self, pos: NodeIndex) -> mmr_lib::Result>> { - Ok(>::get(pos).map(Node::Hash)) + Ok(Nodes::::get(pos).map(Node::Hash)) } fn append(&mut self, pos: NodeIndex, elems: Vec>) -> mmr_lib::Result<()> { @@ -147,7 +147,7 @@ where for elem in elems { // On-chain we are going to only store new peaks. if peaks_to_store.next_if_eq(&node_index).is_some() { - >::insert(node_index, elem.hash()); + Nodes::::insert(node_index, elem.hash()); } // We are storing full node off-chain (using indexing API). Self::store_to_offchain(node_index, parent_hash, &elem); @@ -164,7 +164,7 @@ where // And remove all remaining items from `peaks_before` collection. for pos in peaks_to_prune { - >::remove(pos); + Nodes::::remove(pos); } Ok(()) diff --git a/substrate/frame/merkle-mountain-range/src/mock.rs b/substrate/frame/merkle-mountain-range/src/mock.rs index b3b5127db024ffd9687d14d20d702ccc86647815..212012a052a027cd0582b90e3a29a409980c4e66 100644 --- a/substrate/frame/merkle-mountain-range/src/mock.rs +++ b/substrate/frame/merkle-mountain-range/src/mock.rs @@ -33,7 +33,7 @@ frame_support::construct_runtime!( } ); -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { type Block = Block; } diff --git a/substrate/frame/merkle-mountain-range/src/tests.rs b/substrate/frame/merkle-mountain-range/src/tests.rs index 429df75182eeeefb3411d5eb6aeb8c9b62968186..88de7511c9f280b6996419f07ac1f5c458d8a395 100644 --- a/substrate/frame/merkle-mountain-range/src/tests.rs +++ b/substrate/frame/merkle-mountain-range/src/tests.rs @@ -608,9 +608,9 @@ fn verification_should_be_stateless() { let mut ext = new_test_ext(); let (root_6, root_7) = ext.execute_with(|| { add_blocks(6); - let root_6 = crate::Pallet::::mmr_root_hash(); + let root_6 = crate::Pallet::::mmr_root(); add_blocks(1); - let root_7 = crate::Pallet::::mmr_root_hash(); + let root_7 = crate::Pallet::::mmr_root(); (root_6, root_7) }); ext.persist_offchain_overlay(); @@ -656,9 +656,9 @@ fn should_verify_batch_proof_statelessly() { let mut ext = new_test_ext(); let (root_6, root_7) = ext.execute_with(|| { add_blocks(6); - let root_6 = crate::Pallet::::mmr_root_hash(); + let root_6 = crate::Pallet::::mmr_root(); add_blocks(1); - let root_7 = crate::Pallet::::mmr_root_hash(); + let root_7 = crate::Pallet::::mmr_root(); (root_6, root_7) }); ext.persist_offchain_overlay(); diff --git a/substrate/frame/message-queue/Cargo.toml b/substrate/frame/message-queue/Cargo.toml index c2ecf4452627d36a4fdac3cf05d9758bb6a47701..f263c41831beab8f77aa04522e6cec40d75af703 100644 --- a/substrate/frame/message-queue/Cargo.toml +++ b/substrate/frame/message-queue/Cargo.toml @@ -13,9 +13,9 @@ workspace = true [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.195", optional = true, features = ["derive"] } -log = { version = "0.4.17", default-features = false } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +serde = { optional = true, features = ["derive"], workspace = true, default-features = true } +log = { workspace = true } environmental = { version = "1.1.4", default-features = false } sp-core = { path = "../../primitives/core", default-features = false } diff --git a/substrate/frame/message-queue/src/integration_test.rs b/substrate/frame/message-queue/src/integration_test.rs index aa6f019d650df0f2d97be7b3584dba706eb686f7..14b8d2217eb2b3908377014feb90c73588c79eff 100644 --- a/substrate/frame/message-queue/src/integration_test.rs +++ b/substrate/frame/message-queue/src/integration_test.rs @@ -37,14 +37,9 @@ use crate::{ }; use crate as pallet_message_queue; -use frame_support::{ - derive_impl, parameter_types, - traits::{ConstU32, ConstU64}, -}; +use frame_support::{derive_impl, parameter_types}; use rand::{rngs::StdRng, Rng, SeedableRng}; use rand_distr::Pareto; -use sp_core::H256; -use sp_runtime::traits::{BlakeTwo256, IdentityLookup}; use std::collections::{BTreeMap, BTreeSet}; type Block = frame_system::mocking::MockBlock; @@ -57,31 +52,9 @@ frame_support::construct_runtime!( } ); -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { - type BaseCallFilter = frame_support::traits::Everything; - type BlockWeights = (); - type BlockLength = (); - type DbWeight = (); - type RuntimeOrigin = RuntimeOrigin; - type Nonce = u64; - type Hash = H256; - type RuntimeCall = RuntimeCall; - type Hashing = BlakeTwo256; - type AccountId = u64; - type Lookup = IdentityLookup; type Block = Block; - type RuntimeEvent = RuntimeEvent; - type BlockHashCount = ConstU64<250>; - type Version = (); - type PalletInfo = PalletInfo; - type AccountData = (); - type OnNewAccount = (); - type OnKilledAccount = (); - type SystemWeightInfo = (); - type SS58Prefix = (); - type OnSetCode = (); - type MaxConsumers = ConstU32<16>; } parameter_types! { @@ -100,6 +73,7 @@ impl Config for Test { type HeapSize = HeapSize; type MaxStale = MaxStale; type ServiceWeight = ServiceWeight; + type IdleMaxServiceWeight = (); } /// Simulates heavy usage by enqueueing and processing large amounts of messages. @@ -357,6 +331,11 @@ fn process_some_messages(num_msgs: u32) { ServiceWeight::set(Some(weight)); let consumed = next_block(); + for origin in BookStateFor::::iter_keys() { + let fp = MessageQueue::footprint(origin); + assert_eq!(fp.pages, fp.ready_pages); + } + assert_eq!(consumed, weight, "\n{}", MessageQueue::debug_info()); assert_eq!(NumMessagesProcessed::take(), num_msgs as usize); } diff --git a/substrate/frame/message-queue/src/lib.rs b/substrate/frame/message-queue/src/lib.rs index 07eb0041985342522a113339769b98f834ef4a17..ec85c785f79eb6eea628d9a8df6db0667d2bf70e 100644 --- a/substrate/frame/message-queue/src/lib.rs +++ b/substrate/frame/message-queue/src/lib.rs @@ -208,8 +208,9 @@ use frame_support::{ defensive, pallet_prelude::*, traits::{ - Defensive, DefensiveTruncateFrom, EnqueueMessage, ExecuteOverweightError, Footprint, - ProcessMessage, ProcessMessageError, QueueFootprint, QueuePausedQuery, ServiceQueues, + Defensive, DefensiveSaturating, DefensiveTruncateFrom, EnqueueMessage, + ExecuteOverweightError, Footprint, ProcessMessage, ProcessMessageError, QueueFootprint, + QueuePausedQuery, ServiceQueues, }, BoundedSlice, CloneNoBound, DefaultNoBound, }; @@ -442,6 +443,7 @@ impl From> for QueueFootprint { fn from(book: BookState) -> Self { QueueFootprint { pages: book.count, + ready_pages: book.end.defensive_saturating_sub(book.begin), storage: Footprint { count: book.message_count, size: book.size }, } } @@ -523,12 +525,21 @@ pub mod pallet { type MaxStale: Get; /// The amount of weight (if any) which should be provided to the message queue for - /// servicing enqueued items. + /// servicing enqueued items `on_initialize`. /// /// This may be legitimately `None` in the case that you will call - /// `ServiceQueues::service_queues` manually. + /// `ServiceQueues::service_queues` manually or set [`Self::IdleMaxServiceWeight`] to have + /// it run in `on_idle`. #[pallet::constant] type ServiceWeight: Get>; + + /// The maximum amount of weight (if any) to be used from remaining weight `on_idle` which + /// should be provided to the message queue for servicing enqueued items `on_idle`. + /// Useful for parachains to process messages at the same block they are received. + /// + /// If `None`, it will not call `ServiceQueues::service_queues` in `on_idle`. + #[pallet::constant] + type IdleMaxServiceWeight: Get>; } #[pallet::event] @@ -641,6 +652,15 @@ pub mod pallet { } } + fn on_idle(_n: BlockNumberFor, remaining_weight: Weight) -> Weight { + if let Some(weight_limit) = T::IdleMaxServiceWeight::get() { + // Make use of the remaining weight to process enqueued messages. + Self::service_queues(weight_limit.min(remaining_weight)) + } else { + Weight::zero() + } + } + #[cfg(feature = "try-runtime")] fn try_state(_: BlockNumberFor) -> Result<(), sp_runtime::TryRuntimeError> { Self::do_try_state() @@ -1281,6 +1301,9 @@ impl Pallet { ensure!(book.message_count < 1 << 30, "Likely overflow or corruption"); ensure!(book.size < 1 << 30, "Likely overflow or corruption"); ensure!(book.count < 1 << 30, "Likely overflow or corruption"); + + let fp: QueueFootprint = book.into(); + ensure!(fp.ready_pages <= fp.pages, "There cannot be more ready than total pages"); } //loop around this origin @@ -1455,7 +1478,7 @@ impl Pallet { /// Run a closure that errors on re-entrance. Meant to be used by anything that services queues. pub(crate) fn with_service_mutex R, R>(f: F) -> Result { - // Holds the singelton token instance. + // Holds the singleton token instance. environmental::environmental!(token: Option<()>); token::using_once(&mut Some(()), || { diff --git a/substrate/frame/message-queue/src/mock.rs b/substrate/frame/message-queue/src/mock.rs index f1067ed961e8adfd0b206a480a6d76bda32428a2..1281de6b0a66f37e265071b390981138b30dad2e 100644 --- a/substrate/frame/message-queue/src/mock.rs +++ b/substrate/frame/message-queue/src/mock.rs @@ -23,15 +23,8 @@ pub use super::mock_helpers::*; use super::*; use crate as pallet_message_queue; -use frame_support::{ - derive_impl, parameter_types, - traits::{ConstU32, ConstU64}, -}; -use sp_core::H256; -use sp_runtime::{ - traits::{BlakeTwo256, IdentityLookup}, - BuildStorage, -}; +use frame_support::{derive_impl, parameter_types}; +use sp_runtime::BuildStorage; use sp_std::collections::btree_map::BTreeMap; type Block = frame_system::mocking::MockBlock; @@ -44,31 +37,9 @@ frame_support::construct_runtime!( } ); -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { - type BaseCallFilter = frame_support::traits::Everything; - type BlockWeights = (); - type BlockLength = (); - type DbWeight = (); - type RuntimeOrigin = RuntimeOrigin; - type Nonce = u64; - type Hash = H256; - type RuntimeCall = RuntimeCall; - type Hashing = BlakeTwo256; - type AccountId = u64; - type Lookup = IdentityLookup; type Block = Block; - type RuntimeEvent = RuntimeEvent; - type BlockHashCount = ConstU64<250>; - type Version = (); - type PalletInfo = PalletInfo; - type AccountData = (); - type OnNewAccount = (); - type OnKilledAccount = (); - type SystemWeightInfo = (); - type SS58Prefix = (); - type OnSetCode = (); - type MaxConsumers = ConstU32<16>; } parameter_types! { pub const HeapSize: u32 = 24; @@ -85,6 +56,7 @@ impl Config for Test { type HeapSize = HeapSize; type MaxStale = MaxStale; type ServiceWeight = ServiceWeight; + type IdleMaxServiceWeight = ServiceWeight; } /// Mocked `WeightInfo` impl with allows to set the weight per call. @@ -384,8 +356,8 @@ pub fn num_overweight_enqueued_events() -> u32 { .count() as u32 } -pub fn fp(pages: u32, count: u64, size: u64) -> QueueFootprint { - QueueFootprint { storage: Footprint { count, size }, pages } +pub fn fp(pages: u32, ready_pages: u32, count: u64, size: u64) -> QueueFootprint { + QueueFootprint { storage: Footprint { count, size }, pages, ready_pages } } /// A random seed that can be overwritten with `MQ_SEED`. diff --git a/substrate/frame/message-queue/src/tests.rs b/substrate/frame/message-queue/src/tests.rs index 86a8b79fe8bd01fc5f906ef42e22339c669e57b5..d6788847d57173da6a7a06740daf55946f15b15f 100644 --- a/substrate/frame/message-queue/src/tests.rs +++ b/substrate/frame/message-queue/src/tests.rs @@ -90,7 +90,7 @@ fn queue_priority_retains() { MessageQueue::enqueue_message(msg("d"), Everywhere(2)); assert_ring(&[Everywhere(1), Everywhere(2), Everywhere(3)]); // service head is 1, it will process a, leaving service head at 2. it also processes b but - // doees not empty queue 2, so service head will end at 2. + // does not empty queue 2, so service head will end at 2. assert_eq!(MessageQueue::service_queues(2.into_weight()), 2.into_weight()); assert_eq!( MessagesProcessed::take(), @@ -1064,13 +1064,13 @@ fn footprint_num_pages_works() { MessageQueue::enqueue_message(msg("weight=2"), Here); MessageQueue::enqueue_message(msg("weight=3"), Here); - assert_eq!(MessageQueue::footprint(Here), fp(2, 2, 16)); + assert_eq!(MessageQueue::footprint(Here), fp(2, 2, 2, 16)); // Mark the messages as overweight. assert_eq!(MessageQueue::service_queues(1.into_weight()), 0.into_weight()); assert_eq!(System::events().len(), 2); - // Overweight does not change the footprint. - assert_eq!(MessageQueue::footprint(Here), fp(2, 2, 16)); + // `ready_pages` decreases but `page` count does not. + assert_eq!(MessageQueue::footprint(Here), fp(2, 0, 2, 16)); // Now execute the second message. assert_eq!( @@ -1078,7 +1078,7 @@ fn footprint_num_pages_works() { .unwrap(), 3.into_weight() ); - assert_eq!(MessageQueue::footprint(Here), fp(1, 1, 8)); + assert_eq!(MessageQueue::footprint(Here), fp(1, 0, 1, 8)); // And the first one: assert_eq!( ::execute_overweight(2.into_weight(), (Here, 0, 0)) @@ -1086,6 +1086,11 @@ fn footprint_num_pages_works() { 2.into_weight() ); assert_eq!(MessageQueue::footprint(Here), Default::default()); + assert_eq!(MessageQueue::footprint(Here), fp(0, 0, 0, 0)); + + // `ready_pages` and normal `pages` increases again: + MessageQueue::enqueue_message(msg("weight=3"), Here); + assert_eq!(MessageQueue::footprint(Here), fp(1, 1, 1, 8)); }) } @@ -1833,3 +1838,45 @@ fn with_service_mutex_works() { with_service_mutex(|| called = 3).unwrap(); assert_eq!(called, 3); } + +#[test] +fn process_enqueued_on_idle() { + use MessageOrigin::*; + build_and_execute::(|| { + // Some messages enqueued on previous block. + MessageQueue::enqueue_messages(vec![msg("a"), msg("ab"), msg("abc")].into_iter(), Here); + assert_eq!(BookStateFor::::iter().count(), 1); + + // Process enqueued messages from previous block. + Pallet::::on_initialize(1); + assert_eq!( + MessagesProcessed::take(), + vec![(b"a".to_vec(), Here), (b"ab".to_vec(), Here), (b"abc".to_vec(), Here),] + ); + + MessageQueue::enqueue_messages(vec![msg("x"), msg("xy"), msg("xyz")].into_iter(), There); + assert_eq!(BookStateFor::::iter().count(), 2); + + // Enough weight to process on idle. + Pallet::::on_idle(1, Weight::from_parts(100, 100)); + assert_eq!( + MessagesProcessed::take(), + vec![(b"x".to_vec(), There), (b"xy".to_vec(), There), (b"xyz".to_vec(), There)] + ); + }) +} + +#[test] +fn process_enqueued_on_idle_requires_enough_weight() { + use MessageOrigin::*; + build_and_execute::(|| { + Pallet::::on_initialize(1); + + MessageQueue::enqueue_messages(vec![msg("x"), msg("xy"), msg("xyz")].into_iter(), There); + assert_eq!(BookStateFor::::iter().count(), 1); + + // Not enough weight to process on idle. + Pallet::::on_idle(1, Weight::from_parts(0, 0)); + assert_eq!(MessagesProcessed::take(), vec![]); + }) +} diff --git a/substrate/frame/message-queue/src/weights.rs b/substrate/frame/message-queue/src/weights.rs index e86f23e274ff246aa9f557626e06a42a4930154c..46fd52194bf275a2bcb0f7a9f0afcacce12422f6 100644 --- a/substrate/frame/message-queue/src/weights.rs +++ b/substrate/frame/message-queue/src/weights.rs @@ -15,16 +15,16 @@ // See the License for the specific language governing permissions and // limitations under the License. -//! Autogenerated weights for pallet_message_queue +//! Autogenerated weights for `pallet_message_queue` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-06-16, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-04-09, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-e8ezs4ez-project-145-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("dev"), DB CACHE: 1024 +//! HOSTNAME: `runner-anb7yjbi-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: `1024` // Executed Command: -// ./target/production/substrate +// ./target/production/substrate-node // benchmark // pallet // --chain=dev @@ -35,12 +35,11 @@ // --no-median-slopes // --no-min-squares // --extrinsic=* -// --execution=wasm // --wasm-execution=compiled // --heap-pages=4096 -// --output=./frame/message-queue/src/weights.rs -// --header=./HEADER-APACHE2 -// --template=./.maintain/frame-weight-template.hbs +// --output=./substrate/frame/message-queue/src/weights.rs +// --header=./substrate/HEADER-APACHE2 +// --template=./substrate/.maintain/frame-weight-template.hbs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -50,7 +49,7 @@ use frame_support::{traits::Get, weights::{Weight, constants::RocksDbWeight}}; use core::marker::PhantomData; -/// Weight functions needed for pallet_message_queue. +/// Weight functions needed for `pallet_message_queue`. pub trait WeightInfo { fn ready_ring_knit() -> Weight; fn ready_ring_unknit() -> Weight; @@ -64,246 +63,256 @@ pub trait WeightInfo { fn execute_overweight_page_updated() -> Weight; } -/// Weights for pallet_message_queue using the Substrate node and recommended hardware. +/// Weights for `pallet_message_queue` using the Substrate node and recommended hardware. pub struct SubstrateWeight(PhantomData); impl WeightInfo for SubstrateWeight { - /// Storage: MessageQueue ServiceHead (r:1 w:0) - /// Proof: MessageQueue ServiceHead (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: MessageQueue BookStateFor (r:2 w:2) - /// Proof: MessageQueue BookStateFor (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen) + /// Storage: `MessageQueue::ServiceHead` (r:1 w:0) + /// Proof: `MessageQueue::ServiceHead` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `MessageQueue::BookStateFor` (r:2 w:2) + /// Proof: `MessageQueue::BookStateFor` (`max_values`: None, `max_size`: Some(49), added: 2524, mode: `MaxEncodedLen`) fn ready_ring_knit() -> Weight { // Proof Size summary in bytes: - // Measured: `267` + // Measured: `301` // Estimated: `6038` - // Minimum execution time: 12_025_000 picoseconds. - Weight::from_parts(12_597_000, 6038) + // Minimum execution time: 11_674_000 picoseconds. + Weight::from_parts(12_105_000, 6038) .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } - /// Storage: MessageQueue BookStateFor (r:2 w:2) - /// Proof: MessageQueue BookStateFor (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen) - /// Storage: MessageQueue ServiceHead (r:1 w:1) - /// Proof: MessageQueue ServiceHead (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + /// Storage: `MessageQueue::BookStateFor` (r:2 w:2) + /// Proof: `MessageQueue::BookStateFor` (`max_values`: None, `max_size`: Some(49), added: 2524, mode: `MaxEncodedLen`) + /// Storage: `MessageQueue::ServiceHead` (r:1 w:1) + /// Proof: `MessageQueue::ServiceHead` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) fn ready_ring_unknit() -> Weight { // Proof Size summary in bytes: - // Measured: `267` + // Measured: `301` // Estimated: `6038` - // Minimum execution time: 11_563_000 picoseconds. - Weight::from_parts(11_785_000, 6038) + // Minimum execution time: 10_262_000 picoseconds. + Weight::from_parts(10_654_000, 6038) .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(3_u64)) } - /// Storage: MessageQueue BookStateFor (r:1 w:1) - /// Proof: MessageQueue BookStateFor (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen) + /// Storage: `MessageQueue::BookStateFor` (r:1 w:1) + /// Proof: `MessageQueue::BookStateFor` (`max_values`: None, `max_size`: Some(49), added: 2524, mode: `MaxEncodedLen`) fn service_queue_base() -> Weight { // Proof Size summary in bytes: // Measured: `76` // Estimated: `3514` - // Minimum execution time: 4_467_000 picoseconds. - Weight::from_parts(4_655_000, 3514) + // Minimum execution time: 4_363_000 picoseconds. + Weight::from_parts(4_589_000, 3514) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: MessageQueue Pages (r:1 w:1) - /// Proof: MessageQueue Pages (max_values: None, max_size: Some(65584), added: 68059, mode: MaxEncodedLen) + /// Storage: `MessageQueue::Pages` (r:1 w:1) + /// Proof: `MessageQueue::Pages` (`max_values`: None, `max_size`: Some(65584), added: 68059, mode: `MaxEncodedLen`) fn service_page_base_completion() -> Weight { // Proof Size summary in bytes: // Measured: `147` // Estimated: `69049` - // Minimum execution time: 6_103_000 picoseconds. - Weight::from_parts(6_254_000, 69049) + // Minimum execution time: 6_220_000 picoseconds. + Weight::from_parts(6_622_000, 69049) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: MessageQueue Pages (r:1 w:1) - /// Proof: MessageQueue Pages (max_values: None, max_size: Some(65584), added: 68059, mode: MaxEncodedLen) + /// Storage: `MessageQueue::Pages` (r:1 w:1) + /// Proof: `MessageQueue::Pages` (`max_values`: None, `max_size`: Some(65584), added: 68059, mode: `MaxEncodedLen`) fn service_page_base_no_completion() -> Weight { // Proof Size summary in bytes: // Measured: `147` // Estimated: `69049` - // Minimum execution time: 6_320_000 picoseconds. - Weight::from_parts(6_565_000, 69049) + // Minimum execution time: 6_342_000 picoseconds. + Weight::from_parts(6_727_000, 69049) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } + /// Storage: `MessageQueue::BookStateFor` (r:0 w:1) + /// Proof: `MessageQueue::BookStateFor` (`max_values`: None, `max_size`: Some(49), added: 2524, mode: `MaxEncodedLen`) + /// Storage: `MessageQueue::Pages` (r:0 w:1) + /// Proof: `MessageQueue::Pages` (`max_values`: None, `max_size`: Some(65584), added: 68059, mode: `MaxEncodedLen`) fn service_page_item() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 66_062_000 picoseconds. - Weight::from_parts(66_371_000, 0) + // Minimum execution time: 112_729_000 picoseconds. + Weight::from_parts(114_076_000, 0) + .saturating_add(T::DbWeight::get().writes(2_u64)) } - /// Storage: MessageQueue ServiceHead (r:1 w:1) - /// Proof: MessageQueue ServiceHead (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: MessageQueue BookStateFor (r:1 w:0) - /// Proof: MessageQueue BookStateFor (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen) + /// Storage: `MessageQueue::ServiceHead` (r:1 w:1) + /// Proof: `MessageQueue::ServiceHead` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `MessageQueue::BookStateFor` (r:1 w:0) + /// Proof: `MessageQueue::BookStateFor` (`max_values`: None, `max_size`: Some(49), added: 2524, mode: `MaxEncodedLen`) fn bump_service_head() -> Weight { // Proof Size summary in bytes: - // Measured: `174` + // Measured: `246` // Estimated: `3514` - // Minimum execution time: 6_788_000 picoseconds. - Weight::from_parts(7_176_000, 3514) + // Minimum execution time: 6_836_000 picoseconds. + Weight::from_parts(6_986_000, 3514) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: MessageQueue BookStateFor (r:1 w:1) - /// Proof: MessageQueue BookStateFor (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen) - /// Storage: MessageQueue Pages (r:1 w:1) - /// Proof: MessageQueue Pages (max_values: None, max_size: Some(65584), added: 68059, mode: MaxEncodedLen) + /// Storage: `MessageQueue::BookStateFor` (r:1 w:1) + /// Proof: `MessageQueue::BookStateFor` (`max_values`: None, `max_size`: Some(49), added: 2524, mode: `MaxEncodedLen`) + /// Storage: `MessageQueue::Pages` (r:1 w:1) + /// Proof: `MessageQueue::Pages` (`max_values`: None, `max_size`: Some(65584), added: 68059, mode: `MaxEncodedLen`) fn reap_page() -> Weight { // Proof Size summary in bytes: // Measured: `65744` // Estimated: `69049` - // Minimum execution time: 52_865_000 picoseconds. - Weight::from_parts(54_398_000, 69049) + // Minimum execution time: 50_733_000 picoseconds. + Weight::from_parts(51_649_000, 69049) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } - /// Storage: MessageQueue BookStateFor (r:1 w:1) - /// Proof: MessageQueue BookStateFor (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen) - /// Storage: MessageQueue Pages (r:1 w:1) - /// Proof: MessageQueue Pages (max_values: None, max_size: Some(65584), added: 68059, mode: MaxEncodedLen) + /// Storage: `MessageQueue::BookStateFor` (r:1 w:1) + /// Proof: `MessageQueue::BookStateFor` (`max_values`: None, `max_size`: Some(49), added: 2524, mode: `MaxEncodedLen`) + /// Storage: `MessageQueue::Pages` (r:1 w:1) + /// Proof: `MessageQueue::Pages` (`max_values`: None, `max_size`: Some(65584), added: 68059, mode: `MaxEncodedLen`) fn execute_overweight_page_removed() -> Weight { // Proof Size summary in bytes: // Measured: `65744` // Estimated: `69049` - // Minimum execution time: 69_168_000 picoseconds. - Weight::from_parts(70_560_000, 69049) + // Minimum execution time: 67_335_000 picoseconds. + Weight::from_parts(68_347_000, 69049) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } - /// Storage: MessageQueue BookStateFor (r:1 w:1) - /// Proof: MessageQueue BookStateFor (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen) - /// Storage: MessageQueue Pages (r:1 w:1) - /// Proof: MessageQueue Pages (max_values: None, max_size: Some(65584), added: 68059, mode: MaxEncodedLen) + /// Storage: `MessageQueue::BookStateFor` (r:1 w:1) + /// Proof: `MessageQueue::BookStateFor` (`max_values`: None, `max_size`: Some(49), added: 2524, mode: `MaxEncodedLen`) + /// Storage: `MessageQueue::Pages` (r:1 w:1) + /// Proof: `MessageQueue::Pages` (`max_values`: None, `max_size`: Some(65584), added: 68059, mode: `MaxEncodedLen`) fn execute_overweight_page_updated() -> Weight { // Proof Size summary in bytes: // Measured: `65744` // Estimated: `69049` - // Minimum execution time: 80_947_000 picoseconds. - Weight::from_parts(82_715_000, 69049) + // Minimum execution time: 77_610_000 picoseconds. + Weight::from_parts(80_338_000, 69049) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } } -// For backwards compatibility and tests +// For backwards compatibility and tests. impl WeightInfo for () { - /// Storage: MessageQueue ServiceHead (r:1 w:0) - /// Proof: MessageQueue ServiceHead (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: MessageQueue BookStateFor (r:2 w:2) - /// Proof: MessageQueue BookStateFor (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen) + /// Storage: `MessageQueue::ServiceHead` (r:1 w:0) + /// Proof: `MessageQueue::ServiceHead` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `MessageQueue::BookStateFor` (r:2 w:2) + /// Proof: `MessageQueue::BookStateFor` (`max_values`: None, `max_size`: Some(49), added: 2524, mode: `MaxEncodedLen`) fn ready_ring_knit() -> Weight { // Proof Size summary in bytes: - // Measured: `267` + // Measured: `301` // Estimated: `6038` - // Minimum execution time: 12_025_000 picoseconds. - Weight::from_parts(12_597_000, 6038) + // Minimum execution time: 11_674_000 picoseconds. + Weight::from_parts(12_105_000, 6038) .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } - /// Storage: MessageQueue BookStateFor (r:2 w:2) - /// Proof: MessageQueue BookStateFor (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen) - /// Storage: MessageQueue ServiceHead (r:1 w:1) - /// Proof: MessageQueue ServiceHead (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + /// Storage: `MessageQueue::BookStateFor` (r:2 w:2) + /// Proof: `MessageQueue::BookStateFor` (`max_values`: None, `max_size`: Some(49), added: 2524, mode: `MaxEncodedLen`) + /// Storage: `MessageQueue::ServiceHead` (r:1 w:1) + /// Proof: `MessageQueue::ServiceHead` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) fn ready_ring_unknit() -> Weight { // Proof Size summary in bytes: - // Measured: `267` + // Measured: `301` // Estimated: `6038` - // Minimum execution time: 11_563_000 picoseconds. - Weight::from_parts(11_785_000, 6038) + // Minimum execution time: 10_262_000 picoseconds. + Weight::from_parts(10_654_000, 6038) .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(3_u64)) } - /// Storage: MessageQueue BookStateFor (r:1 w:1) - /// Proof: MessageQueue BookStateFor (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen) + /// Storage: `MessageQueue::BookStateFor` (r:1 w:1) + /// Proof: `MessageQueue::BookStateFor` (`max_values`: None, `max_size`: Some(49), added: 2524, mode: `MaxEncodedLen`) fn service_queue_base() -> Weight { // Proof Size summary in bytes: // Measured: `76` // Estimated: `3514` - // Minimum execution time: 4_467_000 picoseconds. - Weight::from_parts(4_655_000, 3514) + // Minimum execution time: 4_363_000 picoseconds. + Weight::from_parts(4_589_000, 3514) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: MessageQueue Pages (r:1 w:1) - /// Proof: MessageQueue Pages (max_values: None, max_size: Some(65584), added: 68059, mode: MaxEncodedLen) + /// Storage: `MessageQueue::Pages` (r:1 w:1) + /// Proof: `MessageQueue::Pages` (`max_values`: None, `max_size`: Some(65584), added: 68059, mode: `MaxEncodedLen`) fn service_page_base_completion() -> Weight { // Proof Size summary in bytes: // Measured: `147` // Estimated: `69049` - // Minimum execution time: 6_103_000 picoseconds. - Weight::from_parts(6_254_000, 69049) + // Minimum execution time: 6_220_000 picoseconds. + Weight::from_parts(6_622_000, 69049) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: MessageQueue Pages (r:1 w:1) - /// Proof: MessageQueue Pages (max_values: None, max_size: Some(65584), added: 68059, mode: MaxEncodedLen) + /// Storage: `MessageQueue::Pages` (r:1 w:1) + /// Proof: `MessageQueue::Pages` (`max_values`: None, `max_size`: Some(65584), added: 68059, mode: `MaxEncodedLen`) fn service_page_base_no_completion() -> Weight { // Proof Size summary in bytes: // Measured: `147` // Estimated: `69049` - // Minimum execution time: 6_320_000 picoseconds. - Weight::from_parts(6_565_000, 69049) + // Minimum execution time: 6_342_000 picoseconds. + Weight::from_parts(6_727_000, 69049) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } + /// Storage: `MessageQueue::BookStateFor` (r:0 w:1) + /// Proof: `MessageQueue::BookStateFor` (`max_values`: None, `max_size`: Some(49), added: 2524, mode: `MaxEncodedLen`) + /// Storage: `MessageQueue::Pages` (r:0 w:1) + /// Proof: `MessageQueue::Pages` (`max_values`: None, `max_size`: Some(65584), added: 68059, mode: `MaxEncodedLen`) fn service_page_item() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 66_062_000 picoseconds. - Weight::from_parts(66_371_000, 0) + // Minimum execution time: 112_729_000 picoseconds. + Weight::from_parts(114_076_000, 0) + .saturating_add(RocksDbWeight::get().writes(2_u64)) } - /// Storage: MessageQueue ServiceHead (r:1 w:1) - /// Proof: MessageQueue ServiceHead (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: MessageQueue BookStateFor (r:1 w:0) - /// Proof: MessageQueue BookStateFor (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen) + /// Storage: `MessageQueue::ServiceHead` (r:1 w:1) + /// Proof: `MessageQueue::ServiceHead` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `MessageQueue::BookStateFor` (r:1 w:0) + /// Proof: `MessageQueue::BookStateFor` (`max_values`: None, `max_size`: Some(49), added: 2524, mode: `MaxEncodedLen`) fn bump_service_head() -> Weight { // Proof Size summary in bytes: - // Measured: `174` + // Measured: `246` // Estimated: `3514` - // Minimum execution time: 6_788_000 picoseconds. - Weight::from_parts(7_176_000, 3514) + // Minimum execution time: 6_836_000 picoseconds. + Weight::from_parts(6_986_000, 3514) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: MessageQueue BookStateFor (r:1 w:1) - /// Proof: MessageQueue BookStateFor (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen) - /// Storage: MessageQueue Pages (r:1 w:1) - /// Proof: MessageQueue Pages (max_values: None, max_size: Some(65584), added: 68059, mode: MaxEncodedLen) + /// Storage: `MessageQueue::BookStateFor` (r:1 w:1) + /// Proof: `MessageQueue::BookStateFor` (`max_values`: None, `max_size`: Some(49), added: 2524, mode: `MaxEncodedLen`) + /// Storage: `MessageQueue::Pages` (r:1 w:1) + /// Proof: `MessageQueue::Pages` (`max_values`: None, `max_size`: Some(65584), added: 68059, mode: `MaxEncodedLen`) fn reap_page() -> Weight { // Proof Size summary in bytes: // Measured: `65744` // Estimated: `69049` - // Minimum execution time: 52_865_000 picoseconds. - Weight::from_parts(54_398_000, 69049) + // Minimum execution time: 50_733_000 picoseconds. + Weight::from_parts(51_649_000, 69049) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } - /// Storage: MessageQueue BookStateFor (r:1 w:1) - /// Proof: MessageQueue BookStateFor (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen) - /// Storage: MessageQueue Pages (r:1 w:1) - /// Proof: MessageQueue Pages (max_values: None, max_size: Some(65584), added: 68059, mode: MaxEncodedLen) + /// Storage: `MessageQueue::BookStateFor` (r:1 w:1) + /// Proof: `MessageQueue::BookStateFor` (`max_values`: None, `max_size`: Some(49), added: 2524, mode: `MaxEncodedLen`) + /// Storage: `MessageQueue::Pages` (r:1 w:1) + /// Proof: `MessageQueue::Pages` (`max_values`: None, `max_size`: Some(65584), added: 68059, mode: `MaxEncodedLen`) fn execute_overweight_page_removed() -> Weight { // Proof Size summary in bytes: // Measured: `65744` // Estimated: `69049` - // Minimum execution time: 69_168_000 picoseconds. - Weight::from_parts(70_560_000, 69049) + // Minimum execution time: 67_335_000 picoseconds. + Weight::from_parts(68_347_000, 69049) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } - /// Storage: MessageQueue BookStateFor (r:1 w:1) - /// Proof: MessageQueue BookStateFor (max_values: None, max_size: Some(49), added: 2524, mode: MaxEncodedLen) - /// Storage: MessageQueue Pages (r:1 w:1) - /// Proof: MessageQueue Pages (max_values: None, max_size: Some(65584), added: 68059, mode: MaxEncodedLen) + /// Storage: `MessageQueue::BookStateFor` (r:1 w:1) + /// Proof: `MessageQueue::BookStateFor` (`max_values`: None, `max_size`: Some(49), added: 2524, mode: `MaxEncodedLen`) + /// Storage: `MessageQueue::Pages` (r:1 w:1) + /// Proof: `MessageQueue::Pages` (`max_values`: None, `max_size`: Some(65584), added: 68059, mode: `MaxEncodedLen`) fn execute_overweight_page_updated() -> Weight { // Proof Size summary in bytes: // Measured: `65744` // Estimated: `69049` - // Minimum execution time: 80_947_000 picoseconds. - Weight::from_parts(82_715_000, 69049) + // Minimum execution time: 77_610_000 picoseconds. + Weight::from_parts(80_338_000, 69049) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } diff --git a/substrate/frame/migrations/Cargo.toml b/substrate/frame/migrations/Cargo.toml new file mode 100644 index 0000000000000000000000000000000000000000..4726ac5c521e7395a29d374ab195a4a5a2147ff5 --- /dev/null +++ b/substrate/frame/migrations/Cargo.toml @@ -0,0 +1,64 @@ +[package] +name = "pallet-migrations" +version = "1.0.0" +description = "FRAME pallet to execute multi-block migrations." +authors.workspace = true +edition.workspace = true +license.workspace = true +repository.workspace = true + +[package.metadata.docs.rs] +targets = ["x86_64-unknown-linux-gnu"] + +[dependencies] +codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } +docify = "0.2.8" +impl-trait-for-tuples = "0.2.2" +log = "0.4.21" +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } + +frame-benchmarking = { default-features = false, optional = true, path = "../benchmarking" } +frame-support = { default-features = false, path = "../support" } +frame-system = { default-features = false, path = "../system" } +sp-core = { path = "../../primitives/core", default-features = false } +sp-std = { path = "../../primitives/std", default-features = false } +sp-runtime = { path = "../../primitives/runtime", default-features = false } + +[dev-dependencies] +frame-executive = { path = "../executive" } +sp-api = { path = "../../primitives/api", features = ["std"] } +sp-block-builder = { path = "../../primitives/block-builder", features = ["std"] } +sp-io = { path = "../../primitives/io", features = ["std"] } +sp-tracing = { path = "../../primitives/tracing", features = ["std"] } +sp-version = { path = "../../primitives/version", features = ["std"] } + +pretty_assertions = "1.3.0" + +[features] +default = ["std"] + +std = [ + "codec/std", + "frame-benchmarking?/std", + "frame-support/std", + "frame-system/std", + "log/std", + "scale-info/std", + "sp-core/std", + "sp-runtime/std", + "sp-std/std", +] + +runtime-benchmarks = [ + "frame-benchmarking/runtime-benchmarks", + "frame-support/runtime-benchmarks", + "frame-system/runtime-benchmarks", + "sp-runtime/runtime-benchmarks", +] + +try-runtime = [ + "frame-executive/try-runtime", + "frame-support/try-runtime", + "frame-system/try-runtime", + "sp-runtime/try-runtime", +] diff --git a/substrate/frame/migrations/src/benchmarking.rs b/substrate/frame/migrations/src/benchmarking.rs new file mode 100644 index 0000000000000000000000000000000000000000..8ad1fa50d14985842051c9ac6fb3f95e30bdb030 --- /dev/null +++ b/substrate/frame/migrations/src/benchmarking.rs @@ -0,0 +1,222 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#![cfg(feature = "runtime-benchmarks")] + +use super::*; + +use frame_benchmarking::{v2::*, BenchmarkError}; +use frame_system::{Pallet as System, RawOrigin}; +use sp_runtime::traits::One; + +fn assert_last_event(generic_event: ::RuntimeEvent) { + frame_system::Pallet::::assert_last_event(generic_event.into()); +} + +#[benchmarks] +mod benches { + use super::*; + use frame_support::traits::Hooks; + + #[benchmark] + fn onboard_new_mbms() { + T::Migrations::set_fail_after(0); // Should not be called anyway. + assert!(!Cursor::::exists()); + + #[block] + { + Pallet::::onboard_new_mbms(); + } + + assert_last_event::(Event::UpgradeStarted { migrations: 1 }.into()); + } + + #[benchmark] + fn progress_mbms_none() { + T::Migrations::set_fail_after(0); // Should not be called anyway. + assert!(!Cursor::::exists()); + + #[block] + { + Pallet::::progress_mbms(One::one()); + } + } + + /// All migrations completed. + #[benchmark] + fn exec_migration_completed() -> Result<(), BenchmarkError> { + T::Migrations::set_fail_after(0); // Should not be called anyway. + assert_eq!(T::Migrations::len(), 1, "Setup failed"); + let c = ActiveCursor { index: 1, inner_cursor: None, started_at: 0u32.into() }; + let mut meter = WeightMeter::with_limit(T::MaxServiceWeight::get()); + System::::set_block_number(1u32.into()); + + #[block] + { + Pallet::::exec_migration(c, false, &mut meter); + } + + assert_last_event::(Event::UpgradeCompleted {}.into()); + + Ok(()) + } + + /// No migration runs since it is skipped as historic. + #[benchmark] + fn exec_migration_skipped_historic() -> Result<(), BenchmarkError> { + T::Migrations::set_fail_after(0); // Should not be called anyway. + assert_eq!(T::Migrations::len(), 1, "Setup failed"); + let c = ActiveCursor { index: 0, inner_cursor: None, started_at: 0u32.into() }; + + let id: IdentifierOf = T::Migrations::nth_id(0).unwrap().try_into().unwrap(); + Historic::::insert(id, ()); + + let mut meter = WeightMeter::with_limit(T::MaxServiceWeight::get()); + System::::set_block_number(1u32.into()); + + #[block] + { + Pallet::::exec_migration(c, false, &mut meter); + } + + assert_last_event::(Event::MigrationSkipped { index: 0 }.into()); + + Ok(()) + } + + /// Advance a migration by one step. + #[benchmark] + fn exec_migration_advance() -> Result<(), BenchmarkError> { + T::Migrations::set_success_after(1); + assert_eq!(T::Migrations::len(), 1, "Setup failed"); + let c = ActiveCursor { index: 0, inner_cursor: None, started_at: 0u32.into() }; + let mut meter = WeightMeter::with_limit(T::MaxServiceWeight::get()); + System::::set_block_number(1u32.into()); + + #[block] + { + Pallet::::exec_migration(c, false, &mut meter); + } + + assert_last_event::(Event::MigrationAdvanced { index: 0, took: One::one() }.into()); + + Ok(()) + } + + /// Successfully complete a migration. + #[benchmark] + fn exec_migration_complete() -> Result<(), BenchmarkError> { + T::Migrations::set_success_after(0); + assert_eq!(T::Migrations::len(), 1, "Setup failed"); + let c = ActiveCursor { index: 0, inner_cursor: None, started_at: 0u32.into() }; + let mut meter = WeightMeter::with_limit(T::MaxServiceWeight::get()); + System::::set_block_number(1u32.into()); + + #[block] + { + Pallet::::exec_migration(c, false, &mut meter); + } + + assert_last_event::(Event::MigrationCompleted { index: 0, took: One::one() }.into()); + + Ok(()) + } + + #[benchmark] + fn exec_migration_fail() -> Result<(), BenchmarkError> { + T::Migrations::set_fail_after(0); + assert_eq!(T::Migrations::len(), 1, "Setup failed"); + let c = ActiveCursor { index: 0, inner_cursor: None, started_at: 0u32.into() }; + let mut meter = WeightMeter::with_limit(T::MaxServiceWeight::get()); + System::::set_block_number(1u32.into()); + + #[block] + { + Pallet::::exec_migration(c, false, &mut meter); + } + + assert_last_event::(Event::UpgradeFailed {}.into()); + + Ok(()) + } + + #[benchmark] + fn on_init_loop() { + T::Migrations::set_fail_after(0); // Should not be called anyway. + System::::set_block_number(1u32.into()); + Pallet::::on_runtime_upgrade(); + + #[block] + { + Pallet::::on_initialize(1u32.into()); + } + } + + #[benchmark] + fn force_set_cursor() { + #[extrinsic_call] + _(RawOrigin::Root, Some(cursor::())); + } + + #[benchmark] + fn force_set_active_cursor() { + #[extrinsic_call] + _(RawOrigin::Root, 0, None, None); + } + + #[benchmark] + fn force_onboard_mbms() { + #[extrinsic_call] + _(RawOrigin::Root); + } + + #[benchmark] + fn clear_historic(n: Linear<0, { DEFAULT_HISTORIC_BATCH_CLEAR_SIZE * 2 }>) { + let id_max_len = ::IdentifierMaxLen::get(); + assert!(id_max_len >= 4, "Precondition violated"); + + for i in 0..DEFAULT_HISTORIC_BATCH_CLEAR_SIZE * 2 { + let id = IdentifierOf::::truncate_from( + i.encode().into_iter().cycle().take(id_max_len as usize).collect::>(), + ); + + Historic::::insert(&id, ()); + } + + #[extrinsic_call] + _( + RawOrigin::Root, + HistoricCleanupSelector::Wildcard { limit: n.into(), previous_cursor: None }, + ); + } + + fn cursor() -> CursorOf { + // Note: The weight of a function can depend on the weight of reading the `inner_cursor`. + // `Cursor` is a user provided type. Now instead of requiring something like `Cursor: + // From`, we instead rely on the fact that it is MEL and the PoV benchmarking will + // therefore already take the MEL bound, even when the cursor in storage is `None`. + MigrationCursor::Active(ActiveCursor { + index: u32::MAX, + inner_cursor: None, + started_at: 0u32.into(), + }) + } + + // Implements a test for each benchmark. Execute with: + // `cargo test -p pallet-migrations --features runtime-benchmarks`. + impl_benchmark_test_suite!(Pallet, crate::mock::new_test_ext(), crate::mock::Test); +} diff --git a/substrate/frame/migrations/src/lib.rs b/substrate/frame/migrations/src/lib.rs new file mode 100644 index 0000000000000000000000000000000000000000..649bc314a12b5fb96816201028c98f5416e542a9 --- /dev/null +++ b/substrate/frame/migrations/src/lib.rs @@ -0,0 +1,788 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#![deny(missing_docs)] +#![deny(rustdoc::broken_intra_doc_links)] + +//! # `pallet-migrations` +//! +//! Provides multi block migrations for FRAME runtimes. +//! +//! ## Overview +//! +//! The pallet takes care of executing a batch of multi-step migrations over multiple blocks. The +//! process starts on each runtime upgrade. Normal and operational transactions are paused while +//! migrations are on-going. +//! +//! ### Example +//! +//! This example demonstrates a simple mocked walk through of a basic success scenario. The pallet +//! is configured with two migrations: one succeeding after just one step, and the second one +//! succeeding after two steps. A runtime upgrade is then enacted and the block number is advanced +//! until all migrations finish executing. Afterwards, the recorded historic migrations are +//! checked and events are asserted. +#![doc = docify::embed!("src/tests.rs", simple_works)] +//! +//! ## Pallet API +//! +//! See the [`pallet`] module for more information about the interfaces this pallet exposes, +//! including its configuration trait, dispatchables, storage items, events and errors. +//! +//! Otherwise noteworthy API of this pallet include its implementation of the +//! [`MultiStepMigrator`] trait. This must be plugged into +//! [`frame_system::Config::MultiBlockMigrator`] for proper function. +//! +//! The API contains some calls for emergency management. They are all prefixed with `force_` and +//! should normally not be needed. Pay special attention prior to using them. +//! +//! ### Design Goals +//! +//! 1. Must automatically execute migrations over multiple blocks. +//! 2. Must expose information about whether migrations are ongoing. +//! 3. Must respect pessimistic weight bounds of migrations. +//! 4. Must execute migrations in order. Skipping is not allowed; migrations are run on a +//! all-or-nothing basis. +//! 5. Must prevent re-execution of past migrations. +//! 6. Must provide transactional storage semantics for migrations. +//! 7. Must guarantee progress. +//! +//! ### Design +//! +//! Migrations are provided to the pallet through the associated type [`Config::Migrations`] of type +//! [`SteppedMigrations`]. This allows multiple migrations to be aggregated through a tuple. It +//! simplifies the trait bounds since all associated types of the trait must be provided by the +//! pallet. The actual progress of the pallet is stored in the [`Cursor`] storage item. This can +//! either be [`MigrationCursor::Active`] or [`MigrationCursor::Stuck`]. In the active case it +//! points to the currently active migration and stores its inner cursor. The inner cursor can then +//! be used by the migration to store its inner state and advance. Each time when the migration +//! returns `Some(cursor)`, it signals the pallet that it is not done yet. +//! The cursor is reset on each runtime upgrade. This ensures that it starts to execute at the +//! first migration in the vector. The pallets cursor is only ever incremented or set to `Stuck` +//! once it encounters an error (Goal 4). Once in the stuck state, the pallet will stay stuck until +//! it is fixed through manual governance intervention. +//! As soon as the cursor of the pallet becomes `Some(_)`; [`MultiStepMigrator::ongoing`] returns +//! `true` (Goal 2). This can be used by upstream code to possibly pause transactions. +//! In `on_initialize` the pallet will load the current migration and check whether it was already +//! executed in the past by checking for membership of its ID in the [`Historic`] set. Historic +//! migrations are skipped without causing an error. Each successfully executed migration is added +//! to this set (Goal 5). +//! This proceeds until no more migrations remain. At that point, the event `UpgradeCompleted` is +//! emitted (Goal 1). +//! The execution of each migration happens by calling [`SteppedMigration::transactional_step`]. +//! This function wraps the inner `step` function into a transactional layer to allow rollback in +//! the error case (Goal 6). +//! Weight limits must be checked by the migration itself. The pallet provides a [`WeightMeter`] for +//! that purpose. The pallet may return [`SteppedMigrationError::InsufficientWeight`] at any point. +//! In that scenario, one of two things will happen: if that migration was exclusively executed +//! in this block, and therefore required more than the maximum amount of weight possible, the +//! process becomes `Stuck`. Otherwise, one re-attempt is executed with the same logic in the next +//! block (Goal 3). Progress through the migrations is guaranteed by providing a timeout for each +//! migration via [`SteppedMigration::max_steps`]. The pallet **ONLY** guarantees progress if this +//! is set to sensible limits (Goal 7). +//! +//! ### Scenario: Governance cleanup +//! +//! Every now and then, governance can make use of the [`clear_historic`][Pallet::clear_historic] +//! call. This ensures that no old migrations pile up in the [`Historic`] set. This can be done very +//! rarely, since the storage should not grow quickly and the lookup weight does not suffer much. +//! Another possibility would be to have a synchronous single-block migration perpetually deployed +//! that cleans them up before the MBMs start. +//! +//! ### Scenario: Successful upgrade +//! +//! The standard procedure for a successful runtime upgrade can look like this: +//! 1. Migrations are configured in the `Migrations` config item. All migrations expose +//! [`max_steps`][SteppedMigration::max_steps], are error tolerant, check their weight bounds and +//! have a unique identifier. +//! 2. The runtime upgrade is enacted. An `UpgradeStarted` event is +//! followed by lots of `MigrationAdvanced` and `MigrationCompleted` events. Finally +//! `UpgradeCompleted` is emitted. +//! 3. Cleanup as described in the governance scenario be executed at any time after the migrations +//! completed. +//! +//! ### Advice: Failed upgrades +//! +//! Failed upgrades cannot be recovered from automatically and require governance intervention. Set +//! up monitoring for `UpgradeFailed` events to be made aware of any failures. The hook +//! [`FailedMigrationHandler::failed`] should be setup in a way that it allows governance to act, +//! but still prevent other transactions from interacting with the inconsistent storage state. Note +//! that this is paramount, since the inconsistent state might contain a faulty balance amount or +//! similar that could cause great harm if user transactions don't remain suspended. One way to +//! implement this would be to use the `SafeMode` or `TxPause` pallets that can prevent most user +//! interactions but still allow a whitelisted set of governance calls. +//! +//! ### Remark: Failed migrations +//! +//! Failed migrations are not added to the `Historic` set. This means that an erroneous +//! migration must be removed and fixed manually. This already applies, even before considering the +//! historic set. +//! +//! ### Remark: Transactional processing +//! +//! You can see the transactional semantics for migration steps as mostly useless, since in the +//! stuck case the state is already messed up. This just prevents it from becoming even more messed +//! up, but doesn't prevent it in the first place. + +#![cfg_attr(not(feature = "std"), no_std)] + +mod benchmarking; +mod mock; +pub mod mock_helpers; +mod tests; +pub mod weights; + +pub use pallet::*; +pub use weights::WeightInfo; + +use codec::{Decode, Encode, MaxEncodedLen}; +use core::ops::ControlFlow; +use frame_support::{ + defensive, defensive_assert, + migrations::*, + traits::Get, + weights::{Weight, WeightMeter}, + BoundedVec, +}; +use frame_system::{pallet_prelude::BlockNumberFor, Pallet as System}; +use sp_runtime::Saturating; +use sp_std::vec::Vec; + +/// Points to the next migration to execute. +#[derive(Debug, Clone, Eq, PartialEq, Encode, Decode, scale_info::TypeInfo, MaxEncodedLen)] +pub enum MigrationCursor { + /// Points to the currently active migration and its inner cursor. + Active(ActiveCursor), + + /// Migration got stuck and cannot proceed. This is bad. + Stuck, +} + +impl MigrationCursor { + /// Try to return self as an [`ActiveCursor`]. + pub fn as_active(&self) -> Option<&ActiveCursor> { + match self { + MigrationCursor::Active(active) => Some(active), + MigrationCursor::Stuck => None, + } + } +} + +impl From> + for MigrationCursor +{ + fn from(active: ActiveCursor) -> Self { + MigrationCursor::Active(active) + } +} + +/// Points to the currently active migration and its inner cursor. +#[derive(Debug, Clone, Eq, PartialEq, Encode, Decode, scale_info::TypeInfo, MaxEncodedLen)] +pub struct ActiveCursor { + /// The index of the migration in the MBM tuple. + pub index: u32, + /// The cursor of the migration that is referenced by `index`. + pub inner_cursor: Option, + /// The block number that the migration started at. + /// + /// This is used to calculate how many blocks it took. + pub started_at: BlockNumber, +} + +impl ActiveCursor { + /// Advance the overarching cursor to the next migration. + pub(crate) fn goto_next_migration(&mut self, current_block: BlockNumber) { + self.index.saturating_inc(); + self.inner_cursor = None; + self.started_at = current_block; + } +} + +/// How to clear the records of historic migrations. +#[derive(Debug, Clone, Eq, PartialEq, Encode, Decode, scale_info::TypeInfo)] +pub enum HistoricCleanupSelector { + /// Clear exactly these entries. + /// + /// This is the advised way of doing it. + Specific(Vec), + + /// Clear up to this many entries + Wildcard { + /// How many should be cleared in this call at most. + limit: Option, + /// The cursor that was emitted from any previous `HistoricCleared`. + /// + /// Does not need to be passed when clearing the first batch. + previous_cursor: Option>, + }, +} + +/// The default number of entries that should be cleared by a `HistoricCleanupSelector::Wildcard`. +/// +/// The caller can explicitly specify a higher amount. Benchmarks are run with twice this value. +const DEFAULT_HISTORIC_BATCH_CLEAR_SIZE: u32 = 128; + +impl HistoricCleanupSelector { + /// The maximal number of entries that this will remove. + /// + /// Needed for weight calculation. + pub fn limit(&self) -> u32 { + match self { + Self::Specific(ids) => ids.len() as u32, + Self::Wildcard { limit, .. } => limit.unwrap_or(DEFAULT_HISTORIC_BATCH_CLEAR_SIZE), + } + } +} + +/// Convenience alias for [`MigrationCursor`]. +pub type CursorOf = MigrationCursor, BlockNumberFor>; + +/// Convenience alias for the raw inner cursor of a migration. +pub type RawCursorOf = BoundedVec::CursorMaxLen>; + +/// Convenience alias for the identifier of a migration. +pub type IdentifierOf = BoundedVec::IdentifierMaxLen>; + +/// Convenience alias for [`ActiveCursor`]. +pub type ActiveCursorOf = ActiveCursor, BlockNumberFor>; + +/// Trait for a tuple of No-OP migrations with one element. +pub trait MockedMigrations: SteppedMigrations { + /// The migration should fail after `n` steps. + fn set_fail_after(n: u32); + /// The migration should succeed after `n` steps. + fn set_success_after(n: u32); +} + +#[frame_support::pallet] +pub mod pallet { + use super::*; + use frame_support::pallet_prelude::*; + use frame_system::pallet_prelude::*; + + #[pallet::pallet] + pub struct Pallet(_); + + #[pallet::config(with_default)] + pub trait Config: frame_system::Config { + /// The overarching event type of the runtime. + #[pallet::no_default_bounds] + type RuntimeEvent: From> + IsType<::RuntimeEvent>; + + /// All the multi-block migrations to run. + /// + /// Should only be updated in a runtime-upgrade once all the old migrations have completed. + /// (Check that [`Cursor`] is `None`). + #[cfg(not(feature = "runtime-benchmarks"))] + #[pallet::no_default] + type Migrations: SteppedMigrations; + + /// Mocked migrations for benchmarking only. + /// + /// Should be configured to [`crate::mock_helpers::MockedMigrations`] in benchmarks. + #[cfg(feature = "runtime-benchmarks")] + #[pallet::no_default] + type Migrations: MockedMigrations; + + /// The maximal length of an encoded cursor. + /// + /// A good default needs to selected such that no migration will ever have a cursor with MEL + /// above this limit. This is statically checked in `integrity_test`. + #[pallet::constant] + type CursorMaxLen: Get; + + /// The maximal length of an encoded identifier. + /// + /// A good default needs to selected such that no migration will ever have an identifier + /// with MEL above this limit. This is statically checked in `integrity_test`. + #[pallet::constant] + type IdentifierMaxLen: Get; + + /// Notifications for status updates of a runtime upgrade. + /// + /// Could be used to pause XCM etc. + type MigrationStatusHandler: MigrationStatusHandler; + + /// Handler for failed migrations. + type FailedMigrationHandler: FailedMigrationHandler; + + /// The maximum weight to spend each block to execute migrations. + type MaxServiceWeight: Get; + + /// Weight information for the calls and functions of this pallet. + type WeightInfo: WeightInfo; + } + + /// Default implementations of [`DefaultConfig`], which can be used to implement [`Config`]. + pub mod config_preludes { + use super::{inject_runtime_type, DefaultConfig}; + use frame_support::{ + derive_impl, + migrations::FreezeChainOnFailedMigration, + pallet_prelude::{ConstU32, *}, + }; + use frame_system::limits::BlockWeights; + + /// Provides a viable default config that can be used with + /// [`derive_impl`](`frame_support::derive_impl`) to derive a testing pallet config + /// based on this one. + /// + /// See `Test` in the `default-config` example pallet's `test.rs` for an example of + /// a downstream user of this particular `TestDefaultConfig` + pub struct TestDefaultConfig; + + frame_support::parameter_types! { + /// Maximal weight per block that can be spent on migrations in tests. + pub TestMaxServiceWeight: Weight = <::BlockWeights as Get>::get().max_block.div(2); + } + + #[derive_impl(frame_system::config_preludes::TestDefaultConfig, no_aggregated_types)] + impl frame_system::DefaultConfig for TestDefaultConfig {} + + #[frame_support::register_default_impl(TestDefaultConfig)] + impl DefaultConfig for TestDefaultConfig { + #[inject_runtime_type] + type RuntimeEvent = (); + type CursorMaxLen = ConstU32<{ 1 << 16 }>; + type IdentifierMaxLen = ConstU32<{ 256 }>; + type MigrationStatusHandler = (); + type FailedMigrationHandler = FreezeChainOnFailedMigration; + type MaxServiceWeight = TestMaxServiceWeight; + type WeightInfo = (); + } + } + + /// The currently active migration to run and its cursor. + /// + /// `None` indicates that no migration is running. + #[pallet::storage] + pub type Cursor = StorageValue<_, CursorOf, OptionQuery>; + + /// Set of all successfully executed migrations. + /// + /// This is used as blacklist, to not re-execute migrations that have not been removed from the + /// codebase yet. Governance can regularly clear this out via `clear_historic`. + #[pallet::storage] + pub type Historic = StorageMap<_, Twox64Concat, IdentifierOf, (), OptionQuery>; + + #[pallet::event] + #[pallet::generate_deposit(pub(super) fn deposit_event)] + pub enum Event { + /// A Runtime upgrade started. + /// + /// Its end is indicated by `UpgradeCompleted` or `UpgradeFailed`. + UpgradeStarted { + /// The number of migrations that this upgrade contains. + /// + /// This can be used to design a progress indicator in combination with counting the + /// `MigrationCompleted` and `MigrationSkipped` events. + migrations: u32, + }, + /// The current runtime upgrade completed. + /// + /// This implies that all of its migrations completed successfully as well. + UpgradeCompleted, + /// Runtime upgrade failed. + /// + /// This is very bad and will require governance intervention. + UpgradeFailed, + /// A migration was skipped since it was already executed in the past. + MigrationSkipped { + /// The index of the skipped migration within the [`Config::Migrations`] list. + index: u32, + }, + /// A migration progressed. + MigrationAdvanced { + /// The index of the migration within the [`Config::Migrations`] list. + index: u32, + /// The number of blocks that this migration took so far. + took: BlockNumberFor, + }, + /// A Migration completed. + MigrationCompleted { + /// The index of the migration within the [`Config::Migrations`] list. + index: u32, + /// The number of blocks that this migration took so far. + took: BlockNumberFor, + }, + /// A Migration failed. + /// + /// This implies that the whole upgrade failed and governance intervention is required. + MigrationFailed { + /// The index of the migration within the [`Config::Migrations`] list. + index: u32, + /// The number of blocks that this migration took so far. + took: BlockNumberFor, + }, + /// The set of historical migrations has been cleared. + HistoricCleared { + /// Should be passed to `clear_historic` in a successive call. + next_cursor: Option>, + }, + } + + #[pallet::error] + pub enum Error { + /// The operation cannot complete since some MBMs are ongoing. + Ongoing, + } + + #[pallet::hooks] + impl Hooks> for Pallet { + fn on_runtime_upgrade() -> Weight { + Self::onboard_new_mbms() + } + + #[cfg(feature = "std")] + fn integrity_test() { + // Check that the migrations tuple is legit. + frame_support::assert_ok!(T::Migrations::integrity_test()); + + // Very important! Ensure that the pallet is configured in `System::Config`. + { + assert!(!Cursor::::exists(), "Externalities storage should be clean"); + assert!(!::MultiBlockMigrator::ongoing()); + + Cursor::::put(MigrationCursor::Stuck); + assert!(::MultiBlockMigrator::ongoing()); + + Cursor::::kill(); + } + + // The per-block service weight is sane. + { + let want = T::MaxServiceWeight::get(); + let max = ::BlockWeights::get().max_block; + + assert!(want.all_lte(max), "Service weight is larger than a block: {want} > {max}"); + } + + // Cursor MEL + { + let mel = T::Migrations::cursor_max_encoded_len(); + let max_mel = T::CursorMaxLen::get() as usize; + assert!( + mel <= max_mel, + "A Cursor is not guaranteed to fit into the storage: {mel} > {max_mel}", + ); + } + + // Identifier MEL + { + let mel = T::Migrations::identifier_max_encoded_len(); + let max_mel = T::IdentifierMaxLen::get() as usize; + assert!( + mel <= max_mel, + "An Identifier is not guaranteed to fit into the storage: {mel} > {max_mel}", + ); + } + } + } + + #[pallet::call(weight = T::WeightInfo)] + impl Pallet { + /// Allows root to set a cursor to forcefully start, stop or forward the migration process. + /// + /// Should normally not be needed and is only in place as emergency measure. Note that + /// restarting the migration process in this manner will not call the + /// [`MigrationStatusHandler::started`] hook or emit an `UpgradeStarted` event. + #[pallet::call_index(0)] + pub fn force_set_cursor( + origin: OriginFor, + cursor: Option>, + ) -> DispatchResult { + ensure_root(origin)?; + + Cursor::::set(cursor); + + Ok(()) + } + + /// Allows root to set an active cursor to forcefully start/forward the migration process. + /// + /// This is an edge-case version of [`Self::force_set_cursor`] that allows to set the + /// `started_at` value to the next block number. Otherwise this would not be possible, since + /// `force_set_cursor` takes an absolute block number. Setting `started_at` to `None` + /// indicates that the current block number plus one should be used. + #[pallet::call_index(1)] + pub fn force_set_active_cursor( + origin: OriginFor, + index: u32, + inner_cursor: Option>, + started_at: Option>, + ) -> DispatchResult { + ensure_root(origin)?; + + let started_at = started_at.unwrap_or( + System::::block_number().saturating_add(sp_runtime::traits::One::one()), + ); + Cursor::::put(MigrationCursor::Active(ActiveCursor { + index, + inner_cursor, + started_at, + })); + + Ok(()) + } + + /// Forces the onboarding of the migrations. + /// + /// This process happens automatically on a runtime upgrade. It is in place as an emergency + /// measurement. The cursor needs to be `None` for this to succeed. + #[pallet::call_index(2)] + pub fn force_onboard_mbms(origin: OriginFor) -> DispatchResult { + ensure_root(origin)?; + + ensure!(!Cursor::::exists(), Error::::Ongoing); + Self::onboard_new_mbms(); + + Ok(()) + } + + /// Clears the `Historic` set. + /// + /// `map_cursor` must be set to the last value that was returned by the + /// `HistoricCleared` event. The first time `None` can be used. `limit` must be chosen in a + /// way that will result in a sensible weight. + #[pallet::call_index(3)] + #[pallet::weight(T::WeightInfo::clear_historic(selector.limit()))] + pub fn clear_historic( + origin: OriginFor, + selector: HistoricCleanupSelector>, + ) -> DispatchResult { + ensure_root(origin)?; + + match &selector { + HistoricCleanupSelector::Specific(ids) => { + for id in ids { + Historic::::remove(id); + } + Self::deposit_event(Event::HistoricCleared { next_cursor: None }); + }, + HistoricCleanupSelector::Wildcard { previous_cursor, .. } => { + let next = Historic::::clear(selector.limit(), previous_cursor.as_deref()); + Self::deposit_event(Event::HistoricCleared { next_cursor: next.maybe_cursor }); + }, + } + + Ok(()) + } + } +} + +impl Pallet { + /// Onboard all new Multi-Block-Migrations and start the process of executing them. + /// + /// Should only be called once all previous migrations completed. + fn onboard_new_mbms() -> Weight { + if let Some(cursor) = Cursor::::get() { + log::error!("Ongoing migrations interrupted - chain stuck"); + + let maybe_index = cursor.as_active().map(|c| c.index); + Self::upgrade_failed(maybe_index); + return T::WeightInfo::onboard_new_mbms() + } + + let migrations = T::Migrations::len(); + log::debug!("Onboarding {migrations} new MBM migrations"); + + if migrations > 0 { + // Set the cursor to the first migration: + Cursor::::set(Some( + ActiveCursor { + index: 0, + inner_cursor: None, + started_at: System::::block_number(), + } + .into(), + )); + Self::deposit_event(Event::UpgradeStarted { migrations }); + T::MigrationStatusHandler::started(); + } + + T::WeightInfo::onboard_new_mbms() + } + + /// Tries to make progress on the Multi-Block-Migrations process. + fn progress_mbms(n: BlockNumberFor) -> Weight { + let mut meter = WeightMeter::with_limit(T::MaxServiceWeight::get()); + meter.consume(T::WeightInfo::progress_mbms_none()); + + let mut cursor = match Cursor::::get() { + None => { + log::trace!("[Block {n:?}] Waiting for cursor to become `Some`."); + return meter.consumed() + }, + Some(MigrationCursor::Active(cursor)) => { + log::debug!("Progressing MBM #{}", cursor.index); + cursor + }, + Some(MigrationCursor::Stuck) => { + log::error!("Migration stuck. Governance intervention required."); + return meter.consumed() + }, + }; + debug_assert!(Self::ongoing()); + + // The limit here is a defensive measure to prevent an infinite loop. It expresses that we + // allow no more than 8 MBMs to finish in a single block. This should be harmless, since we + // generally expect *Multi*-Block-Migrations to take *multiple* blocks. + for i in 0..8 { + match Self::exec_migration(cursor, i == 0, &mut meter) { + None => return meter.consumed(), + Some(ControlFlow::Continue(next_cursor)) => { + cursor = next_cursor; + }, + Some(ControlFlow::Break(last_cursor)) => { + cursor = last_cursor; + break + }, + } + } + + Cursor::::set(Some(cursor.into())); + + meter.consumed() + } + + /// Try to make progress on the current migration. + /// + /// Returns whether processing should continue or break for this block. The return value means: + /// - `None`: The migration process is completely finished. + /// - `ControlFlow::Break`: Continue in the *next* block with the given cursor. + /// - `ControlFlow::Continue`: Continue in the *current* block with the given cursor. + fn exec_migration( + mut cursor: ActiveCursorOf, + is_first: bool, + meter: &mut WeightMeter, + ) -> Option, ActiveCursorOf>> { + // The differences between the single branches' weights is not that big. And since we do + // only one step per block, we can just use the maximum instead of more precise accounting. + if meter.try_consume(Self::exec_migration_max_weight()).is_err() { + defensive_assert!(!is_first, "There should be enough weight to do this at least once"); + return Some(ControlFlow::Break(cursor)) + } + + let Some(id) = T::Migrations::nth_id(cursor.index) else { + // No more migrations in the tuple - we are done. + defensive_assert!(cursor.index == T::Migrations::len(), "Inconsistent MBMs tuple"); + Self::deposit_event(Event::UpgradeCompleted); + Cursor::::kill(); + T::MigrationStatusHandler::completed(); + return None; + }; + + let Ok(bounded_id): Result, _> = id.try_into() else { + defensive!("integrity_test ensures that all identifiers' MEL bounds fit into CursorMaxLen; qed."); + Self::upgrade_failed(Some(cursor.index)); + return None + }; + + if Historic::::contains_key(&bounded_id) { + Self::deposit_event(Event::MigrationSkipped { index: cursor.index }); + cursor.goto_next_migration(System::::block_number()); + return Some(ControlFlow::Continue(cursor)) + } + + let max_steps = T::Migrations::nth_max_steps(cursor.index); + let next_cursor = T::Migrations::nth_transactional_step( + cursor.index, + cursor.inner_cursor.clone().map(|c| c.into_inner()), + meter, + ); + let Some((max_steps, next_cursor)) = max_steps.zip(next_cursor) else { + defensive!("integrity_test ensures that the tuple is valid; qed"); + Self::upgrade_failed(Some(cursor.index)); + return None + }; + + let took = System::::block_number().saturating_sub(cursor.started_at); + match next_cursor { + Ok(Some(next_cursor)) => { + let Ok(bound_next_cursor) = next_cursor.try_into() else { + defensive!("The integrity check ensures that all cursors' MEL bound fits into CursorMaxLen; qed"); + Self::upgrade_failed(Some(cursor.index)); + return None + }; + + Self::deposit_event(Event::MigrationAdvanced { index: cursor.index, took }); + cursor.inner_cursor = Some(bound_next_cursor); + + if max_steps.map_or(false, |max| took > max.into()) { + Self::deposit_event(Event::MigrationFailed { index: cursor.index, took }); + Self::upgrade_failed(Some(cursor.index)); + None + } else { + // A migration cannot progress more than one step per block, we therefore break. + Some(ControlFlow::Break(cursor)) + } + }, + Ok(None) => { + // A migration is done when it returns cursor `None`. + Self::deposit_event(Event::MigrationCompleted { index: cursor.index, took }); + Historic::::insert(&bounded_id, ()); + cursor.goto_next_migration(System::::block_number()); + Some(ControlFlow::Continue(cursor)) + }, + Err(SteppedMigrationError::InsufficientWeight { required }) => { + if is_first || required.any_gt(meter.limit()) { + Self::deposit_event(Event::MigrationFailed { index: cursor.index, took }); + Self::upgrade_failed(Some(cursor.index)); + None + } else { + // Retry and hope that there is more weight in the next block. + Some(ControlFlow::Break(cursor)) + } + }, + Err(SteppedMigrationError::InvalidCursor | SteppedMigrationError::Failed) => { + Self::deposit_event(Event::MigrationFailed { index: cursor.index, took }); + Self::upgrade_failed(Some(cursor.index)); + None + }, + } + } + + /// Fail the current runtime upgrade, caused by `migration`. + fn upgrade_failed(migration: Option) { + use FailedMigrationHandling::*; + Self::deposit_event(Event::UpgradeFailed); + + match T::FailedMigrationHandler::failed(migration) { + KeepStuck => Cursor::::set(Some(MigrationCursor::Stuck)), + ForceUnstuck => Cursor::::kill(), + Ignore => {}, + } + } + + /// The maximal weight of calling the private `Self::exec_migration` function. + pub fn exec_migration_max_weight() -> Weight { + T::WeightInfo::exec_migration_complete() + .max(T::WeightInfo::exec_migration_completed()) + .max(T::WeightInfo::exec_migration_skipped_historic()) + .max(T::WeightInfo::exec_migration_advance()) + .max(T::WeightInfo::exec_migration_fail()) + } +} + +impl MultiStepMigrator for Pallet { + fn ongoing() -> bool { + Cursor::::exists() + } + + fn step() -> Weight { + Self::progress_mbms(System::::block_number()) + } +} diff --git a/substrate/frame/migrations/src/mock.rs b/substrate/frame/migrations/src/mock.rs new file mode 100644 index 0000000000000000000000000000000000000000..48ff175f8137860823589122060f158f53e4c4fd --- /dev/null +++ b/substrate/frame/migrations/src/mock.rs @@ -0,0 +1,162 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Mocked runtime for testing the migrations pallet. + +#![cfg(test)] + +use crate::{mock_helpers::*, Event, Historic}; + +use frame_support::{ + derive_impl, + migrations::*, + traits::{OnFinalize, OnInitialize}, + weights::Weight, +}; +use frame_system::EventRecord; +use sp_core::H256; + +type Block = frame_system::mocking::MockBlock; + +// Configure a mock runtime to test the pallet. +frame_support::construct_runtime!( + pub enum Test { + System: frame_system, + Migrations: crate, + } +); + +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] +impl frame_system::Config for Test { + type Block = Block; + type PalletInfo = PalletInfo; + type MultiBlockMigrator = Migrations; +} + +frame_support::parameter_types! { + pub const MaxServiceWeight: Weight = Weight::MAX.div(10); +} + +#[derive_impl(crate::config_preludes::TestDefaultConfig)] +impl crate::Config for Test { + #[cfg(feature = "runtime-benchmarks")] + type Migrations = crate::mock_helpers::MockedMigrations; + #[cfg(not(feature = "runtime-benchmarks"))] + type Migrations = MockedMigrations; + type MigrationStatusHandler = MockedMigrationStatusHandler; + type FailedMigrationHandler = MockedFailedMigrationHandler; +} + +frame_support::parameter_types! { + /// The number of started upgrades. + pub static UpgradesStarted: u32 = 0; + /// The number of completed upgrades. + pub static UpgradesCompleted: u32 = 0; + /// The migrations that failed. + pub static UpgradesFailed: Vec> = vec![]; + /// Return value of [`MockedFailedMigrationHandler::failed`]. + pub static FailedUpgradeResponse: FailedMigrationHandling = FailedMigrationHandling::KeepStuck; +} + +/// Records all started and completed upgrades in `UpgradesStarted` and `UpgradesCompleted`. +pub struct MockedMigrationStatusHandler; +impl MigrationStatusHandler for MockedMigrationStatusHandler { + fn started() { + log::info!("MigrationStatusHandler started"); + UpgradesStarted::mutate(|v| *v += 1); + } + + fn completed() { + log::info!("MigrationStatusHandler completed"); + UpgradesCompleted::mutate(|v| *v += 1); + } +} + +/// Records all failed upgrades in `UpgradesFailed`. +pub struct MockedFailedMigrationHandler; +impl FailedMigrationHandler for MockedFailedMigrationHandler { + fn failed(migration: Option) -> FailedMigrationHandling { + UpgradesFailed::mutate(|v| v.push(migration)); + let res = FailedUpgradeResponse::get(); + log::error!("FailedMigrationHandler failed at: {migration:?}, handling as {res:?}"); + res + } +} + +/// Returns the number of `(started, completed, failed)` upgrades and resets their numbers. +pub fn upgrades_started_completed_failed() -> (u32, u32, u32) { + (UpgradesStarted::take(), UpgradesCompleted::take(), UpgradesFailed::take().len() as u32) +} + +/// Build genesis storage according to the mock runtime. +pub fn new_test_ext() -> sp_io::TestExternalities { + sp_io::TestExternalities::new(Default::default()) +} + +/// Run this closure in test externalities. +pub fn test_closure(f: impl FnOnce() -> R) -> R { + let mut ext = new_test_ext(); + ext.execute_with(f) +} + +pub fn run_to_block(n: u32) { + while System::block_number() < n as u64 { + log::debug!("Block {}", System::block_number()); + System::set_block_number(System::block_number() + 1); + System::on_initialize(System::block_number()); + Migrations::on_initialize(System::block_number()); + // Executive calls this: + ::step(); + + Migrations::on_finalize(System::block_number()); + System::on_finalize(System::block_number()); + } +} + +/// Returns the historic migrations, sorted by their identifier. +pub fn historic() -> Vec { + let mut historic = Historic::::iter_keys().collect::>(); + historic.sort(); + historic +} + +// Traits to make using events less insufferable: +pub trait IntoRecord { + fn into_record(self) -> EventRecord<::RuntimeEvent, H256>; +} + +impl IntoRecord for Event { + fn into_record(self) -> EventRecord<::RuntimeEvent, H256> { + let re: ::RuntimeEvent = self.into(); + EventRecord { phase: frame_system::Phase::Initialization, event: re, topics: vec![] } + } +} + +pub trait IntoRecords { + fn into_records(self) -> Vec::RuntimeEvent, H256>>; +} + +impl IntoRecords for Vec { + fn into_records(self) -> Vec::RuntimeEvent, H256>> { + self.into_iter().map(|e| e.into_record()).collect() + } +} + +pub fn assert_events(events: Vec) { + pretty_assertions::assert_eq!(events.into_records(), System::events()); + System::reset_events(); +} diff --git a/substrate/frame/migrations/src/mock_helpers.rs b/substrate/frame/migrations/src/mock_helpers.rs new file mode 100644 index 0000000000000000000000000000000000000000..d230417d12e6c5691f3538c36c1c6b632544cec9 --- /dev/null +++ b/substrate/frame/migrations/src/mock_helpers.rs @@ -0,0 +1,142 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Test helpers for internal and external usage. + +#![allow(missing_docs)] + +use codec::{Decode, Encode}; +use frame_support::{ + migrations::*, + weights::{Weight, WeightMeter}, +}; +use sp_core::ConstU32; +use sp_runtime::BoundedVec; +use sp_std::{vec, vec::Vec}; + +/// Opaque identifier of a migration. +pub type MockedIdentifier = BoundedVec>; + +/// How a mocked migration should behave. +#[derive(Debug, Clone, Copy, Encode, Decode)] +pub enum MockedMigrationKind { + /// Succeed after its number of steps elapsed. + SucceedAfter, + /// Fail after its number of steps elapsed. + FailAfter, + /// Never terminate. + TimeoutAfter, + /// Cause an [`SteppedMigrationError::InsufficientWeight`] error after its number of steps + /// elapsed. + HighWeightAfter(Weight), +} +use MockedMigrationKind::*; // C style + +/// Creates a migration identifier with a specific `kind` and `steps`. +pub fn mocked_id(kind: MockedMigrationKind, steps: u32) -> MockedIdentifier { + (b"MockedMigration", kind, steps).encode().try_into().unwrap() +} + +frame_support::parameter_types! { + /// The configs for the migrations to run. + storage MIGRATIONS: Vec<(MockedMigrationKind, u32)> = vec![]; +} + +/// Allows to set the migrations to run at runtime instead of compile-time. +/// +/// It achieves this by using the storage to store the migrations to run. +pub struct MockedMigrations; +impl SteppedMigrations for MockedMigrations { + fn len() -> u32 { + MIGRATIONS::get().len() as u32 + } + + fn nth_id(n: u32) -> Option> { + let k = MIGRATIONS::get().get(n as usize).copied(); + k.map(|(kind, steps)| mocked_id(kind, steps).into_inner()) + } + + fn nth_step( + n: u32, + cursor: Option>, + _meter: &mut WeightMeter, + ) -> Option>, SteppedMigrationError>> { + let (kind, steps) = MIGRATIONS::get()[n as usize]; + + let mut count: u32 = + cursor.as_ref().and_then(|c| Decode::decode(&mut &c[..]).ok()).unwrap_or(0); + log::debug!("MockedMigration: Step {count} vs max {steps}"); + if count != steps || matches!(kind, TimeoutAfter) { + count += 1; + return Some(Ok(Some(count.encode()))) + } + + Some(match kind { + SucceedAfter => { + log::debug!("MockedMigration: Succeeded after {} steps", count); + Ok(None) + }, + HighWeightAfter(required) => { + log::debug!("MockedMigration: Not enough weight after {} steps", count); + Err(SteppedMigrationError::InsufficientWeight { required }) + }, + FailAfter => { + log::debug!("MockedMigration: Failed after {} steps", count); + Err(SteppedMigrationError::Failed) + }, + TimeoutAfter => unreachable!(), + }) + } + + fn nth_transactional_step( + n: u32, + cursor: Option>, + meter: &mut WeightMeter, + ) -> Option>, SteppedMigrationError>> { + // This is a hack but should be fine. We don't need it in testing. + Self::nth_step(n, cursor, meter) + } + + fn nth_max_steps(n: u32) -> Option> { + MIGRATIONS::get().get(n as usize).map(|(_, s)| Some(*s)) + } + + fn cursor_max_encoded_len() -> usize { + 65_536 + } + + fn identifier_max_encoded_len() -> usize { + 256 + } +} + +impl MockedMigrations { + /// Set the migrations to run. + pub fn set(migrations: Vec<(MockedMigrationKind, u32)>) { + MIGRATIONS::set(&migrations); + } +} + +impl crate::MockedMigrations for MockedMigrations { + fn set_fail_after(steps: u32) { + MIGRATIONS::set(&vec![(FailAfter, steps)]); + } + + fn set_success_after(steps: u32) { + MIGRATIONS::set(&vec![(SucceedAfter, steps)]); + } +} diff --git a/substrate/frame/migrations/src/tests.rs b/substrate/frame/migrations/src/tests.rs new file mode 100644 index 0000000000000000000000000000000000000000..9c9043d37a62e5f1df3d12da979b68251621c9d0 --- /dev/null +++ b/substrate/frame/migrations/src/tests.rs @@ -0,0 +1,335 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#![cfg(test)] + +use crate::{ + mock::{Test as T, *}, + mock_helpers::{MockedMigrationKind::*, *}, + Cursor, Event, FailedMigrationHandling, MigrationCursor, +}; +use frame_support::{pallet_prelude::Weight, traits::OnRuntimeUpgrade}; + +#[docify::export] +#[test] +fn simple_works() { + use Event::*; + test_closure(|| { + // Add three migrations, each taking one block longer than the previous. + MockedMigrations::set(vec![(SucceedAfter, 0), (SucceedAfter, 1), (SucceedAfter, 2)]); + + System::set_block_number(1); + Migrations::on_runtime_upgrade(); + run_to_block(10); + + // Check that the executed migrations are recorded in `Historical`. + assert_eq!( + historic(), + vec![ + mocked_id(SucceedAfter, 0), + mocked_id(SucceedAfter, 1), + mocked_id(SucceedAfter, 2), + ] + ); + + // Check that we got all events. + assert_events(vec![ + UpgradeStarted { migrations: 3 }, + MigrationCompleted { index: 0, took: 1 }, + MigrationAdvanced { index: 1, took: 0 }, + MigrationCompleted { index: 1, took: 1 }, + MigrationAdvanced { index: 2, took: 0 }, + MigrationAdvanced { index: 2, took: 1 }, + MigrationCompleted { index: 2, took: 2 }, + UpgradeCompleted, + ]); + }); +} + +#[test] +fn failing_migration_sets_cursor_to_stuck() { + test_closure(|| { + FailedUpgradeResponse::set(FailedMigrationHandling::KeepStuck); + MockedMigrations::set(vec![(FailAfter, 2)]); + + System::set_block_number(1); + Migrations::on_runtime_upgrade(); + run_to_block(10); + + // Failed migrations are not recorded in `Historical`. + assert!(historic().is_empty()); + // Check that we got all events. + assert_events(vec![ + Event::UpgradeStarted { migrations: 1 }, + Event::MigrationAdvanced { index: 0, took: 1 }, + Event::MigrationAdvanced { index: 0, took: 2 }, + Event::MigrationFailed { index: 0, took: 3 }, + Event::UpgradeFailed, + ]); + + // Check that the handler was called correctly. + assert_eq!(UpgradesStarted::take(), 1); + assert_eq!(UpgradesCompleted::take(), 0); + assert_eq!(UpgradesFailed::take(), vec![Some(0)]); + + assert_eq!(Cursor::::get(), Some(MigrationCursor::Stuck), "Must stuck the chain"); + }); +} + +#[test] +fn failing_migration_force_unstuck_works() { + test_closure(|| { + FailedUpgradeResponse::set(FailedMigrationHandling::ForceUnstuck); + MockedMigrations::set(vec![(FailAfter, 2)]); + + System::set_block_number(1); + Migrations::on_runtime_upgrade(); + run_to_block(10); + + // Failed migrations are not recorded in `Historical`. + assert!(historic().is_empty()); + // Check that we got all events. + assert_events(vec![ + Event::UpgradeStarted { migrations: 1 }, + Event::MigrationAdvanced { index: 0, took: 1 }, + Event::MigrationAdvanced { index: 0, took: 2 }, + Event::MigrationFailed { index: 0, took: 3 }, + Event::UpgradeFailed, + ]); + + // Check that the handler was called correctly. + assert_eq!(UpgradesStarted::take(), 1); + assert_eq!(UpgradesCompleted::take(), 0); + assert_eq!(UpgradesFailed::take(), vec![Some(0)]); + + assert!(Cursor::::get().is_none(), "Must unstuck the chain"); + }); +} + +/// A migration that reports not getting enough weight errors if it is the first one to run in that +/// block. +#[test] +fn high_weight_migration_singular_fails() { + test_closure(|| { + MockedMigrations::set(vec![(HighWeightAfter(Weight::zero()), 2)]); + + System::set_block_number(1); + Migrations::on_runtime_upgrade(); + run_to_block(10); + + // Failed migrations are not recorded in `Historical`. + assert!(historic().is_empty()); + // Check that we got all events. + assert_events(vec![ + Event::UpgradeStarted { migrations: 1 }, + Event::MigrationAdvanced { index: 0, took: 1 }, + Event::MigrationAdvanced { index: 0, took: 2 }, + Event::MigrationFailed { index: 0, took: 3 }, + Event::UpgradeFailed, + ]); + + // Check that the handler was called correctly. + assert_eq!(upgrades_started_completed_failed(), (1, 0, 1)); + assert_eq!(Cursor::::get(), Some(MigrationCursor::Stuck)); + }); +} + +/// A migration that reports of not getting enough weight is retried once, if it is not the first +/// one to run in a block. +#[test] +fn high_weight_migration_retries_once() { + test_closure(|| { + MockedMigrations::set(vec![(SucceedAfter, 0), (HighWeightAfter(Weight::zero()), 0)]); + + System::set_block_number(1); + Migrations::on_runtime_upgrade(); + run_to_block(10); + + assert_eq!(historic(), vec![mocked_id(SucceedAfter, 0)]); + // Check that we got all events. + assert_events::>(vec![ + Event::UpgradeStarted { migrations: 2 }, + Event::MigrationCompleted { index: 0, took: 1 }, + // `took=1` means that it was retried once. + Event::MigrationFailed { index: 1, took: 1 }, + Event::UpgradeFailed, + ]); + + // Check that the handler was called correctly. + assert_eq!(upgrades_started_completed_failed(), (1, 0, 1)); + assert_eq!(Cursor::::get(), Some(MigrationCursor::Stuck)); + }); +} + +/// If a migration uses more weight than the limit, then it will not retry but fail even when it is +/// not the first one in the block. +// Note: Same as `high_weight_migration_retries_once` but with different required weight for the +// migration. +#[test] +fn high_weight_migration_permanently_overweight_fails() { + test_closure(|| { + MockedMigrations::set(vec![(SucceedAfter, 0), (HighWeightAfter(Weight::MAX), 0)]); + + System::set_block_number(1); + Migrations::on_runtime_upgrade(); + run_to_block(10); + + assert_eq!(historic(), vec![mocked_id(SucceedAfter, 0)]); + // Check that we got all events. + assert_events::>(vec![ + Event::UpgradeStarted { migrations: 2 }, + Event::MigrationCompleted { index: 0, took: 1 }, + // `blocks=0` means that it was not retried. + Event::MigrationFailed { index: 1, took: 0 }, + Event::UpgradeFailed, + ]); + + // Check that the handler was called correctly. + assert_eq!(upgrades_started_completed_failed(), (1, 0, 1)); + assert_eq!(Cursor::::get(), Some(MigrationCursor::Stuck)); + }); +} + +#[test] +fn historic_skipping_works() { + test_closure(|| { + MockedMigrations::set(vec![ + (SucceedAfter, 0), + (SucceedAfter, 0), // duplicate + (SucceedAfter, 1), + (SucceedAfter, 2), + (SucceedAfter, 1), // duplicate + ]); + + System::set_block_number(1); + Migrations::on_runtime_upgrade(); + run_to_block(10); + + // Just three historical ones, since two were added twice. + assert_eq!( + historic(), + vec![ + mocked_id(SucceedAfter, 0), + mocked_id(SucceedAfter, 1), + mocked_id(SucceedAfter, 2), + ] + ); + // Events received. + assert_events(vec![ + Event::UpgradeStarted { migrations: 5 }, + Event::MigrationCompleted { index: 0, took: 1 }, + Event::MigrationSkipped { index: 1 }, + Event::MigrationAdvanced { index: 2, took: 0 }, + Event::MigrationCompleted { index: 2, took: 1 }, + Event::MigrationAdvanced { index: 3, took: 0 }, + Event::MigrationAdvanced { index: 3, took: 1 }, + Event::MigrationCompleted { index: 3, took: 2 }, + Event::MigrationSkipped { index: 4 }, + Event::UpgradeCompleted, + ]); + assert_eq!(upgrades_started_completed_failed(), (1, 1, 0)); + + // Now go for another upgrade; just to make sure that it wont execute again. + System::reset_events(); + Migrations::on_runtime_upgrade(); + run_to_block(20); + + // Same historical ones as before. + assert_eq!( + historic(), + vec![ + mocked_id(SucceedAfter, 0), + mocked_id(SucceedAfter, 1), + mocked_id(SucceedAfter, 2), + ] + ); + + // Everything got skipped. + assert_events(vec![ + Event::UpgradeStarted { migrations: 5 }, + Event::MigrationSkipped { index: 0 }, + Event::MigrationSkipped { index: 1 }, + Event::MigrationSkipped { index: 2 }, + Event::MigrationSkipped { index: 3 }, + Event::MigrationSkipped { index: 4 }, + Event::UpgradeCompleted, + ]); + assert_eq!(upgrades_started_completed_failed(), (1, 1, 0)); + }); +} + +/// When another upgrade happens while a migration is still running, it should set the cursor to +/// stuck. +#[test] +fn upgrade_fails_when_migration_active() { + test_closure(|| { + MockedMigrations::set(vec![(SucceedAfter, 10)]); + + System::set_block_number(1); + Migrations::on_runtime_upgrade(); + run_to_block(3); + + // Events received. + assert_events(vec![ + Event::UpgradeStarted { migrations: 1 }, + Event::MigrationAdvanced { index: 0, took: 1 }, + Event::MigrationAdvanced { index: 0, took: 2 }, + ]); + assert_eq!(upgrades_started_completed_failed(), (1, 0, 0)); + + // Upgrade again. + Migrations::on_runtime_upgrade(); + // -- Defensive path -- + assert_eq!(Cursor::::get(), Some(MigrationCursor::Stuck)); + assert_events(vec![Event::UpgradeFailed]); + assert_eq!(upgrades_started_completed_failed(), (0, 0, 1)); + }); +} + +#[test] +fn migration_timeout_errors() { + test_closure(|| { + MockedMigrations::set(vec![(TimeoutAfter, 3)]); + + System::set_block_number(1); + Migrations::on_runtime_upgrade(); + run_to_block(5); + + // Times out after taking more than 3 steps. + assert_events(vec![ + Event::UpgradeStarted { migrations: 1 }, + Event::MigrationAdvanced { index: 0, took: 1 }, + Event::MigrationAdvanced { index: 0, took: 2 }, + Event::MigrationAdvanced { index: 0, took: 3 }, + Event::MigrationAdvanced { index: 0, took: 4 }, + Event::MigrationFailed { index: 0, took: 4 }, + Event::UpgradeFailed, + ]); + assert_eq!(upgrades_started_completed_failed(), (1, 0, 1)); + + // Failed migrations are not black-listed. + assert!(historic().is_empty()); + assert_eq!(Cursor::::get(), Some(MigrationCursor::Stuck)); + + Migrations::on_runtime_upgrade(); + run_to_block(6); + + assert_events(vec![Event::UpgradeFailed]); + assert_eq!(Cursor::::get(), Some(MigrationCursor::Stuck)); + assert_eq!(upgrades_started_completed_failed(), (0, 0, 1)); + }); +} diff --git a/substrate/frame/migrations/src/weights.rs b/substrate/frame/migrations/src/weights.rs new file mode 100644 index 0000000000000000000000000000000000000000..6f5ac97153764b49a554fb2d66b3c73b118fe6ad --- /dev/null +++ b/substrate/frame/migrations/src/weights.rs @@ -0,0 +1,361 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Autogenerated weights for `pallet_migrations` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-04-09, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `runner-anb7yjbi-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: `1024` + +// Executed Command: +// ./target/production/substrate-node +// benchmark +// pallet +// --chain=dev +// --steps=50 +// --repeat=20 +// --pallet=pallet_migrations +// --no-storage-info +// --no-median-slopes +// --no-min-squares +// --extrinsic=* +// --wasm-execution=compiled +// --heap-pages=4096 +// --output=./substrate/frame/migrations/src/weights.rs +// --header=./substrate/HEADER-APACHE2 +// --template=./substrate/.maintain/frame-weight-template.hbs + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] +#![allow(missing_docs)] + +use frame_support::{traits::Get, weights::{Weight, constants::RocksDbWeight}}; +use core::marker::PhantomData; + +/// Weight functions needed for `pallet_migrations`. +pub trait WeightInfo { + fn onboard_new_mbms() -> Weight; + fn progress_mbms_none() -> Weight; + fn exec_migration_completed() -> Weight; + fn exec_migration_skipped_historic() -> Weight; + fn exec_migration_advance() -> Weight; + fn exec_migration_complete() -> Weight; + fn exec_migration_fail() -> Weight; + fn on_init_loop() -> Weight; + fn force_set_cursor() -> Weight; + fn force_set_active_cursor() -> Weight; + fn force_onboard_mbms() -> Weight; + fn clear_historic(n: u32, ) -> Weight; +} + +/// Weights for `pallet_migrations` using the Substrate node and recommended hardware. +pub struct SubstrateWeight(PhantomData); +impl WeightInfo for SubstrateWeight { + /// Storage: `MultiBlockMigrations::Cursor` (r:1 w:1) + /// Proof: `MultiBlockMigrations::Cursor` (`max_values`: Some(1), `max_size`: Some(65550), added: 66045, mode: `MaxEncodedLen`) + /// Storage: UNKNOWN KEY `0x583359fe0e84d953a9dd84e8addb08a5` (r:1 w:0) + /// Proof: UNKNOWN KEY `0x583359fe0e84d953a9dd84e8addb08a5` (r:1 w:0) + fn onboard_new_mbms() -> Weight { + // Proof Size summary in bytes: + // Measured: `276` + // Estimated: `67035` + // Minimum execution time: 7_762_000 picoseconds. + Weight::from_parts(8_100_000, 67035) + .saturating_add(T::DbWeight::get().reads(2_u64)) + .saturating_add(T::DbWeight::get().writes(1_u64)) + } + /// Storage: `MultiBlockMigrations::Cursor` (r:1 w:0) + /// Proof: `MultiBlockMigrations::Cursor` (`max_values`: Some(1), `max_size`: Some(65550), added: 66045, mode: `MaxEncodedLen`) + fn progress_mbms_none() -> Weight { + // Proof Size summary in bytes: + // Measured: `142` + // Estimated: `67035` + // Minimum execution time: 2_077_000 picoseconds. + Weight::from_parts(2_138_000, 67035) + .saturating_add(T::DbWeight::get().reads(1_u64)) + } + /// Storage: UNKNOWN KEY `0x583359fe0e84d953a9dd84e8addb08a5` (r:1 w:0) + /// Proof: UNKNOWN KEY `0x583359fe0e84d953a9dd84e8addb08a5` (r:1 w:0) + /// Storage: `MultiBlockMigrations::Cursor` (r:0 w:1) + /// Proof: `MultiBlockMigrations::Cursor` (`max_values`: Some(1), `max_size`: Some(65550), added: 66045, mode: `MaxEncodedLen`) + fn exec_migration_completed() -> Weight { + // Proof Size summary in bytes: + // Measured: `134` + // Estimated: `3599` + // Minimum execution time: 5_868_000 picoseconds. + Weight::from_parts(6_143_000, 3599) + .saturating_add(T::DbWeight::get().reads(1_u64)) + .saturating_add(T::DbWeight::get().writes(1_u64)) + } + /// Storage: UNKNOWN KEY `0x583359fe0e84d953a9dd84e8addb08a5` (r:1 w:0) + /// Proof: UNKNOWN KEY `0x583359fe0e84d953a9dd84e8addb08a5` (r:1 w:0) + /// Storage: `MultiBlockMigrations::Historic` (r:1 w:0) + /// Proof: `MultiBlockMigrations::Historic` (`max_values`: None, `max_size`: Some(266), added: 2741, mode: `MaxEncodedLen`) + fn exec_migration_skipped_historic() -> Weight { + // Proof Size summary in bytes: + // Measured: `330` + // Estimated: `3795` + // Minimum execution time: 10_283_000 picoseconds. + Weight::from_parts(10_964_000, 3795) + .saturating_add(T::DbWeight::get().reads(2_u64)) + } + /// Storage: UNKNOWN KEY `0x583359fe0e84d953a9dd84e8addb08a5` (r:1 w:0) + /// Proof: UNKNOWN KEY `0x583359fe0e84d953a9dd84e8addb08a5` (r:1 w:0) + /// Storage: `MultiBlockMigrations::Historic` (r:1 w:0) + /// Proof: `MultiBlockMigrations::Historic` (`max_values`: None, `max_size`: Some(266), added: 2741, mode: `MaxEncodedLen`) + fn exec_migration_advance() -> Weight { + // Proof Size summary in bytes: + // Measured: `276` + // Estimated: `3741` + // Minimum execution time: 9_900_000 picoseconds. + Weight::from_parts(10_396_000, 3741) + .saturating_add(T::DbWeight::get().reads(2_u64)) + } + /// Storage: UNKNOWN KEY `0x583359fe0e84d953a9dd84e8addb08a5` (r:1 w:0) + /// Proof: UNKNOWN KEY `0x583359fe0e84d953a9dd84e8addb08a5` (r:1 w:0) + /// Storage: `MultiBlockMigrations::Historic` (r:1 w:1) + /// Proof: `MultiBlockMigrations::Historic` (`max_values`: None, `max_size`: Some(266), added: 2741, mode: `MaxEncodedLen`) + fn exec_migration_complete() -> Weight { + // Proof Size summary in bytes: + // Measured: `276` + // Estimated: `3741` + // Minimum execution time: 11_411_000 picoseconds. + Weight::from_parts(11_956_000, 3741) + .saturating_add(T::DbWeight::get().reads(2_u64)) + .saturating_add(T::DbWeight::get().writes(1_u64)) + } + /// Storage: UNKNOWN KEY `0x583359fe0e84d953a9dd84e8addb08a5` (r:1 w:0) + /// Proof: UNKNOWN KEY `0x583359fe0e84d953a9dd84e8addb08a5` (r:1 w:0) + /// Storage: `MultiBlockMigrations::Historic` (r:1 w:0) + /// Proof: `MultiBlockMigrations::Historic` (`max_values`: None, `max_size`: Some(266), added: 2741, mode: `MaxEncodedLen`) + /// Storage: `MultiBlockMigrations::Cursor` (r:0 w:1) + /// Proof: `MultiBlockMigrations::Cursor` (`max_values`: Some(1), `max_size`: Some(65550), added: 66045, mode: `MaxEncodedLen`) + fn exec_migration_fail() -> Weight { + // Proof Size summary in bytes: + // Measured: `276` + // Estimated: `3741` + // Minimum execution time: 12_398_000 picoseconds. + Weight::from_parts(12_910_000, 3741) + .saturating_add(T::DbWeight::get().reads(2_u64)) + .saturating_add(T::DbWeight::get().writes(1_u64)) + } + fn on_init_loop() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 166_000 picoseconds. + Weight::from_parts(193_000, 0) + } + /// Storage: `MultiBlockMigrations::Cursor` (r:0 w:1) + /// Proof: `MultiBlockMigrations::Cursor` (`max_values`: Some(1), `max_size`: Some(65550), added: 66045, mode: `MaxEncodedLen`) + fn force_set_cursor() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_686_000 picoseconds. + Weight::from_parts(2_859_000, 0) + .saturating_add(T::DbWeight::get().writes(1_u64)) + } + /// Storage: `MultiBlockMigrations::Cursor` (r:0 w:1) + /// Proof: `MultiBlockMigrations::Cursor` (`max_values`: Some(1), `max_size`: Some(65550), added: 66045, mode: `MaxEncodedLen`) + fn force_set_active_cursor() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 3_070_000 picoseconds. + Weight::from_parts(3_250_000, 0) + .saturating_add(T::DbWeight::get().writes(1_u64)) + } + /// Storage: `MultiBlockMigrations::Cursor` (r:1 w:0) + /// Proof: `MultiBlockMigrations::Cursor` (`max_values`: Some(1), `max_size`: Some(65550), added: 66045, mode: `MaxEncodedLen`) + /// Storage: UNKNOWN KEY `0x583359fe0e84d953a9dd84e8addb08a5` (r:1 w:0) + /// Proof: UNKNOWN KEY `0x583359fe0e84d953a9dd84e8addb08a5` (r:1 w:0) + fn force_onboard_mbms() -> Weight { + // Proof Size summary in bytes: + // Measured: `251` + // Estimated: `67035` + // Minimum execution time: 5_901_000 picoseconds. + Weight::from_parts(6_320_000, 67035) + .saturating_add(T::DbWeight::get().reads(2_u64)) + } + /// Storage: `MultiBlockMigrations::Historic` (r:256 w:256) + /// Proof: `MultiBlockMigrations::Historic` (`max_values`: None, `max_size`: Some(266), added: 2741, mode: `MaxEncodedLen`) + /// The range of component `n` is `[0, 256]`. + fn clear_historic(n: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `1122 + n * (271 ±0)` + // Estimated: `3834 + n * (2740 ±0)` + // Minimum execution time: 15_952_000 picoseconds. + Weight::from_parts(14_358_665, 3834) + // Standard Error: 3_358 + .saturating_add(Weight::from_parts(1_323_674, 0).saturating_mul(n.into())) + .saturating_add(T::DbWeight::get().reads(1_u64)) + .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(n.into()))) + .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(n.into()))) + .saturating_add(Weight::from_parts(0, 2740).saturating_mul(n.into())) + } +} + +// For backwards compatibility and tests. +impl WeightInfo for () { + /// Storage: `MultiBlockMigrations::Cursor` (r:1 w:1) + /// Proof: `MultiBlockMigrations::Cursor` (`max_values`: Some(1), `max_size`: Some(65550), added: 66045, mode: `MaxEncodedLen`) + /// Storage: UNKNOWN KEY `0x583359fe0e84d953a9dd84e8addb08a5` (r:1 w:0) + /// Proof: UNKNOWN KEY `0x583359fe0e84d953a9dd84e8addb08a5` (r:1 w:0) + fn onboard_new_mbms() -> Weight { + // Proof Size summary in bytes: + // Measured: `276` + // Estimated: `67035` + // Minimum execution time: 7_762_000 picoseconds. + Weight::from_parts(8_100_000, 67035) + .saturating_add(RocksDbWeight::get().reads(2_u64)) + .saturating_add(RocksDbWeight::get().writes(1_u64)) + } + /// Storage: `MultiBlockMigrations::Cursor` (r:1 w:0) + /// Proof: `MultiBlockMigrations::Cursor` (`max_values`: Some(1), `max_size`: Some(65550), added: 66045, mode: `MaxEncodedLen`) + fn progress_mbms_none() -> Weight { + // Proof Size summary in bytes: + // Measured: `142` + // Estimated: `67035` + // Minimum execution time: 2_077_000 picoseconds. + Weight::from_parts(2_138_000, 67035) + .saturating_add(RocksDbWeight::get().reads(1_u64)) + } + /// Storage: UNKNOWN KEY `0x583359fe0e84d953a9dd84e8addb08a5` (r:1 w:0) + /// Proof: UNKNOWN KEY `0x583359fe0e84d953a9dd84e8addb08a5` (r:1 w:0) + /// Storage: `MultiBlockMigrations::Cursor` (r:0 w:1) + /// Proof: `MultiBlockMigrations::Cursor` (`max_values`: Some(1), `max_size`: Some(65550), added: 66045, mode: `MaxEncodedLen`) + fn exec_migration_completed() -> Weight { + // Proof Size summary in bytes: + // Measured: `134` + // Estimated: `3599` + // Minimum execution time: 5_868_000 picoseconds. + Weight::from_parts(6_143_000, 3599) + .saturating_add(RocksDbWeight::get().reads(1_u64)) + .saturating_add(RocksDbWeight::get().writes(1_u64)) + } + /// Storage: UNKNOWN KEY `0x583359fe0e84d953a9dd84e8addb08a5` (r:1 w:0) + /// Proof: UNKNOWN KEY `0x583359fe0e84d953a9dd84e8addb08a5` (r:1 w:0) + /// Storage: `MultiBlockMigrations::Historic` (r:1 w:0) + /// Proof: `MultiBlockMigrations::Historic` (`max_values`: None, `max_size`: Some(266), added: 2741, mode: `MaxEncodedLen`) + fn exec_migration_skipped_historic() -> Weight { + // Proof Size summary in bytes: + // Measured: `330` + // Estimated: `3795` + // Minimum execution time: 10_283_000 picoseconds. + Weight::from_parts(10_964_000, 3795) + .saturating_add(RocksDbWeight::get().reads(2_u64)) + } + /// Storage: UNKNOWN KEY `0x583359fe0e84d953a9dd84e8addb08a5` (r:1 w:0) + /// Proof: UNKNOWN KEY `0x583359fe0e84d953a9dd84e8addb08a5` (r:1 w:0) + /// Storage: `MultiBlockMigrations::Historic` (r:1 w:0) + /// Proof: `MultiBlockMigrations::Historic` (`max_values`: None, `max_size`: Some(266), added: 2741, mode: `MaxEncodedLen`) + fn exec_migration_advance() -> Weight { + // Proof Size summary in bytes: + // Measured: `276` + // Estimated: `3741` + // Minimum execution time: 9_900_000 picoseconds. + Weight::from_parts(10_396_000, 3741) + .saturating_add(RocksDbWeight::get().reads(2_u64)) + } + /// Storage: UNKNOWN KEY `0x583359fe0e84d953a9dd84e8addb08a5` (r:1 w:0) + /// Proof: UNKNOWN KEY `0x583359fe0e84d953a9dd84e8addb08a5` (r:1 w:0) + /// Storage: `MultiBlockMigrations::Historic` (r:1 w:1) + /// Proof: `MultiBlockMigrations::Historic` (`max_values`: None, `max_size`: Some(266), added: 2741, mode: `MaxEncodedLen`) + fn exec_migration_complete() -> Weight { + // Proof Size summary in bytes: + // Measured: `276` + // Estimated: `3741` + // Minimum execution time: 11_411_000 picoseconds. + Weight::from_parts(11_956_000, 3741) + .saturating_add(RocksDbWeight::get().reads(2_u64)) + .saturating_add(RocksDbWeight::get().writes(1_u64)) + } + /// Storage: UNKNOWN KEY `0x583359fe0e84d953a9dd84e8addb08a5` (r:1 w:0) + /// Proof: UNKNOWN KEY `0x583359fe0e84d953a9dd84e8addb08a5` (r:1 w:0) + /// Storage: `MultiBlockMigrations::Historic` (r:1 w:0) + /// Proof: `MultiBlockMigrations::Historic` (`max_values`: None, `max_size`: Some(266), added: 2741, mode: `MaxEncodedLen`) + /// Storage: `MultiBlockMigrations::Cursor` (r:0 w:1) + /// Proof: `MultiBlockMigrations::Cursor` (`max_values`: Some(1), `max_size`: Some(65550), added: 66045, mode: `MaxEncodedLen`) + fn exec_migration_fail() -> Weight { + // Proof Size summary in bytes: + // Measured: `276` + // Estimated: `3741` + // Minimum execution time: 12_398_000 picoseconds. + Weight::from_parts(12_910_000, 3741) + .saturating_add(RocksDbWeight::get().reads(2_u64)) + .saturating_add(RocksDbWeight::get().writes(1_u64)) + } + fn on_init_loop() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 166_000 picoseconds. + Weight::from_parts(193_000, 0) + } + /// Storage: `MultiBlockMigrations::Cursor` (r:0 w:1) + /// Proof: `MultiBlockMigrations::Cursor` (`max_values`: Some(1), `max_size`: Some(65550), added: 66045, mode: `MaxEncodedLen`) + fn force_set_cursor() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_686_000 picoseconds. + Weight::from_parts(2_859_000, 0) + .saturating_add(RocksDbWeight::get().writes(1_u64)) + } + /// Storage: `MultiBlockMigrations::Cursor` (r:0 w:1) + /// Proof: `MultiBlockMigrations::Cursor` (`max_values`: Some(1), `max_size`: Some(65550), added: 66045, mode: `MaxEncodedLen`) + fn force_set_active_cursor() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 3_070_000 picoseconds. + Weight::from_parts(3_250_000, 0) + .saturating_add(RocksDbWeight::get().writes(1_u64)) + } + /// Storage: `MultiBlockMigrations::Cursor` (r:1 w:0) + /// Proof: `MultiBlockMigrations::Cursor` (`max_values`: Some(1), `max_size`: Some(65550), added: 66045, mode: `MaxEncodedLen`) + /// Storage: UNKNOWN KEY `0x583359fe0e84d953a9dd84e8addb08a5` (r:1 w:0) + /// Proof: UNKNOWN KEY `0x583359fe0e84d953a9dd84e8addb08a5` (r:1 w:0) + fn force_onboard_mbms() -> Weight { + // Proof Size summary in bytes: + // Measured: `251` + // Estimated: `67035` + // Minimum execution time: 5_901_000 picoseconds. + Weight::from_parts(6_320_000, 67035) + .saturating_add(RocksDbWeight::get().reads(2_u64)) + } + /// Storage: `MultiBlockMigrations::Historic` (r:256 w:256) + /// Proof: `MultiBlockMigrations::Historic` (`max_values`: None, `max_size`: Some(266), added: 2741, mode: `MaxEncodedLen`) + /// The range of component `n` is `[0, 256]`. + fn clear_historic(n: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `1122 + n * (271 ±0)` + // Estimated: `3834 + n * (2740 ±0)` + // Minimum execution time: 15_952_000 picoseconds. + Weight::from_parts(14_358_665, 3834) + // Standard Error: 3_358 + .saturating_add(Weight::from_parts(1_323_674, 0).saturating_mul(n.into())) + .saturating_add(RocksDbWeight::get().reads(1_u64)) + .saturating_add(RocksDbWeight::get().reads((1_u64).saturating_mul(n.into()))) + .saturating_add(RocksDbWeight::get().writes((1_u64).saturating_mul(n.into()))) + .saturating_add(Weight::from_parts(0, 2740).saturating_mul(n.into())) + } +} diff --git a/substrate/frame/mixnet/Cargo.toml b/substrate/frame/mixnet/Cargo.toml index cb00b38890ea48498eab31da2ff29cbc970ccddf..6a4ef5c29ac8b0afe770e51e802f39ca0409eb72 100644 --- a/substrate/frame/mixnet/Cargo.toml +++ b/substrate/frame/mixnet/Cargo.toml @@ -20,9 +20,9 @@ codec = { package = "parity-scale-codec", version = "3.6.1", default-features = frame-benchmarking = { default-features = false, optional = true, path = "../benchmarking" } frame-support = { default-features = false, path = "../support" } frame-system = { default-features = false, path = "../system" } -log = { version = "0.4.17", default-features = false } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.195", default-features = false, features = ["derive"] } +log = { workspace = true } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +serde = { features = ["derive"], workspace = true } sp-application-crypto = { default-features = false, path = "../../primitives/application-crypto" } sp-arithmetic = { default-features = false, path = "../../primitives/arithmetic" } sp-io = { default-features = false, path = "../../primitives/io" } diff --git a/substrate/frame/multisig/Cargo.toml b/substrate/frame/multisig/Cargo.toml index aefdbe855a3c4b6cee4330b14c4e3d958ddccd2b..2437acbc2e231b8d9c12fef4e2089e0110193be4 100644 --- a/substrate/frame/multisig/Cargo.toml +++ b/substrate/frame/multisig/Cargo.toml @@ -17,7 +17,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } frame-benchmarking = { path = "../benchmarking", default-features = false, optional = true } frame-support = { path = "../support", default-features = false } frame-system = { path = "../system", default-features = false } @@ -26,7 +26,7 @@ sp-runtime = { path = "../../primitives/runtime", default-features = false } sp-std = { path = "../../primitives/std", default-features = false } # third party -log = { version = "0.4.17", default-features = false } +log = { workspace = true } [dev-dependencies] pallet-balances = { path = "../balances" } diff --git a/substrate/frame/multisig/src/lib.rs b/substrate/frame/multisig/src/lib.rs index e4426c64b4125fe267a1e30a42a7196274b05e4e..a83b78e316f500ddc9c615420c2ac627b90ee7e9 100644 --- a/substrate/frame/multisig/src/lib.rs +++ b/substrate/frame/multisig/src/lib.rs @@ -168,7 +168,7 @@ pub mod pallet { type WeightInfo: WeightInfo; } - /// The current storage version. + /// The in-code storage version. const STORAGE_VERSION: StorageVersion = StorageVersion::new(1); #[pallet::pallet] diff --git a/substrate/frame/multisig/src/migrations.rs b/substrate/frame/multisig/src/migrations.rs index 330613bb3dfda94224b223a2f3f1fdf6735179b0..e6402600d0d368783e30f43e0afc3adad4d0a1ba 100644 --- a/substrate/frame/multisig/src/migrations.rs +++ b/substrate/frame/multisig/src/migrations.rs @@ -39,7 +39,7 @@ pub mod v1 { (OpaqueCall, ::AccountId, BalanceOf), >; - pub struct MigrateToV1(sp_std::marker::PhantomData); + pub struct MigrateToV1(core::marker::PhantomData); impl OnRuntimeUpgrade for MigrateToV1 { #[cfg(feature = "try-runtime")] fn pre_upgrade() -> Result, sp_runtime::TryRuntimeError> { @@ -51,7 +51,7 @@ pub mod v1 { fn on_runtime_upgrade() -> Weight { use sp_runtime::Saturating; - let current = Pallet::::current_storage_version(); + let current = Pallet::::in_code_storage_version(); let onchain = Pallet::::on_chain_storage_version(); if onchain > 0 { diff --git a/substrate/frame/multisig/src/tests.rs b/substrate/frame/multisig/src/tests.rs index 887c7f8bebc47a8c7d4f9b5b4defb560874cfab6..0d73e3db66153f6c5fe16dd4974567c3584a2372 100644 --- a/substrate/frame/multisig/src/tests.rs +++ b/substrate/frame/multisig/src/tests.rs @@ -38,7 +38,7 @@ frame_support::construct_runtime!( } ); -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { type Block = Block; type BlockHashCount = ConstU32<250>; @@ -47,7 +47,7 @@ impl frame_system::Config for Test { type BaseCallFilter = TestBaseCallFilter; } -#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig as pallet_balances::DefaultConfig)] +#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] impl pallet_balances::Config for Test { type ReserveIdentifier = [u8; 8]; type AccountStore = System; diff --git a/substrate/frame/multisig/src/weights.rs b/substrate/frame/multisig/src/weights.rs index 7b87d258d383d43aaf8ef8aaddc0546c60b5813e..ac1c1b23b0302a886ea53e4b1effb875f267b996 100644 --- a/substrate/frame/multisig/src/weights.rs +++ b/substrate/frame/multisig/src/weights.rs @@ -15,16 +15,16 @@ // See the License for the specific language governing permissions and // limitations under the License. -//! Autogenerated weights for pallet_multisig +//! Autogenerated weights for `pallet_multisig` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-06-16, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-04-09, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-e8ezs4ez-project-145-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("dev"), DB CACHE: 1024 +//! HOSTNAME: `runner-anb7yjbi-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: `1024` // Executed Command: -// ./target/production/substrate +// ./target/production/substrate-node // benchmark // pallet // --chain=dev @@ -35,12 +35,11 @@ // --no-median-slopes // --no-min-squares // --extrinsic=* -// --execution=wasm // --wasm-execution=compiled // --heap-pages=4096 -// --output=./frame/multisig/src/weights.rs -// --header=./HEADER-APACHE2 -// --template=./.maintain/frame-weight-template.hbs +// --output=./substrate/frame/multisig/src/weights.rs +// --header=./substrate/HEADER-APACHE2 +// --template=./substrate/.maintain/frame-weight-template.hbs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -50,7 +49,7 @@ use frame_support::{traits::Get, weights::{Weight, constants::RocksDbWeight}}; use core::marker::PhantomData; -/// Weight functions needed for pallet_multisig. +/// Weight functions needed for `pallet_multisig`. pub trait WeightInfo { fn as_multi_threshold_1(z: u32, ) -> Weight; fn as_multi_create(s: u32, z: u32, ) -> Weight; @@ -61,220 +60,238 @@ pub trait WeightInfo { fn cancel_as_multi(s: u32, ) -> Weight; } -/// Weights for pallet_multisig using the Substrate node and recommended hardware. +/// Weights for `pallet_multisig` using the Substrate node and recommended hardware. pub struct SubstrateWeight(PhantomData); impl WeightInfo for SubstrateWeight { + /// Storage: `SafeMode::EnteredUntil` (r:1 w:0) + /// Proof: `SafeMode::EnteredUntil` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `TxPause::PausedCalls` (r:1 w:0) + /// Proof: `TxPause::PausedCalls` (`max_values`: None, `max_size`: Some(532), added: 3007, mode: `MaxEncodedLen`) /// The range of component `z` is `[0, 10000]`. fn as_multi_threshold_1(z: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 13_452_000 picoseconds. - Weight::from_parts(14_425_869, 0) + // Measured: `145` + // Estimated: `3997` + // Minimum execution time: 20_302_000 picoseconds. + Weight::from_parts(21_362_808, 3997) // Standard Error: 4 - .saturating_add(Weight::from_parts(493, 0).saturating_mul(z.into())) + .saturating_add(Weight::from_parts(432, 0).saturating_mul(z.into())) + .saturating_add(T::DbWeight::get().reads(2_u64)) } - /// Storage: Multisig Multisigs (r:1 w:1) - /// Proof: Multisig Multisigs (max_values: None, max_size: Some(3346), added: 5821, mode: MaxEncodedLen) + /// Storage: `Multisig::Multisigs` (r:1 w:1) + /// Proof: `Multisig::Multisigs` (`max_values`: None, `max_size`: Some(3346), added: 5821, mode: `MaxEncodedLen`) /// The range of component `s` is `[2, 100]`. /// The range of component `z` is `[0, 10000]`. fn as_multi_create(s: u32, z: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `301 + s * (2 ±0)` // Estimated: `6811` - // Minimum execution time: 46_012_000 picoseconds. - Weight::from_parts(34_797_344, 6811) - // Standard Error: 833 - .saturating_add(Weight::from_parts(127_671, 0).saturating_mul(s.into())) - // Standard Error: 8 - .saturating_add(Weight::from_parts(1_498, 0).saturating_mul(z.into())) + // Minimum execution time: 41_140_000 picoseconds. + Weight::from_parts(31_518_927, 6811) + // Standard Error: 754 + .saturating_add(Weight::from_parts(115_804, 0).saturating_mul(s.into())) + // Standard Error: 7 + .saturating_add(Weight::from_parts(1_442, 0).saturating_mul(z.into())) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: Multisig Multisigs (r:1 w:1) - /// Proof: Multisig Multisigs (max_values: None, max_size: Some(3346), added: 5821, mode: MaxEncodedLen) + /// Storage: `Multisig::Multisigs` (r:1 w:1) + /// Proof: `Multisig::Multisigs` (`max_values`: None, `max_size`: Some(3346), added: 5821, mode: `MaxEncodedLen`) /// The range of component `s` is `[3, 100]`. /// The range of component `z` is `[0, 10000]`. fn as_multi_approve(s: u32, z: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `320` // Estimated: `6811` - // Minimum execution time: 29_834_000 picoseconds. - Weight::from_parts(20_189_154, 6811) - // Standard Error: 637 - .saturating_add(Weight::from_parts(110_080, 0).saturating_mul(s.into())) - // Standard Error: 6 - .saturating_add(Weight::from_parts(1_483, 0).saturating_mul(z.into())) + // Minimum execution time: 27_375_000 picoseconds. + Weight::from_parts(17_806_361, 6811) + // Standard Error: 501 + .saturating_add(Weight::from_parts(107_042, 0).saturating_mul(s.into())) + // Standard Error: 4 + .saturating_add(Weight::from_parts(1_491, 0).saturating_mul(z.into())) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: Multisig Multisigs (r:1 w:1) - /// Proof: Multisig Multisigs (max_values: None, max_size: Some(3346), added: 5821, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: `Multisig::Multisigs` (r:1 w:1) + /// Proof: `Multisig::Multisigs` (`max_values`: None, `max_size`: Some(3346), added: 5821, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `SafeMode::EnteredUntil` (r:1 w:0) + /// Proof: `SafeMode::EnteredUntil` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `TxPause::PausedCalls` (r:1 w:0) + /// Proof: `TxPause::PausedCalls` (`max_values`: None, `max_size`: Some(532), added: 3007, mode: `MaxEncodedLen`) /// The range of component `s` is `[2, 100]`. /// The range of component `z` is `[0, 10000]`. fn as_multi_complete(s: u32, z: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `426 + s * (33 ±0)` + // Measured: `571 + s * (33 ±0)` // Estimated: `6811` - // Minimum execution time: 51_464_000 picoseconds. - Weight::from_parts(39_246_644, 6811) - // Standard Error: 1_251 - .saturating_add(Weight::from_parts(143_313, 0).saturating_mul(s.into())) - // Standard Error: 12 - .saturating_add(Weight::from_parts(1_523, 0).saturating_mul(z.into())) - .saturating_add(T::DbWeight::get().reads(2_u64)) + // Minimum execution time: 54_427_000 picoseconds. + Weight::from_parts(43_677_970, 6811) + // Standard Error: 1_342 + .saturating_add(Weight::from_parts(154_697, 0).saturating_mul(s.into())) + // Standard Error: 13 + .saturating_add(Weight::from_parts(1_534, 0).saturating_mul(z.into())) + .saturating_add(T::DbWeight::get().reads(4_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } - /// Storage: Multisig Multisigs (r:1 w:1) - /// Proof: Multisig Multisigs (max_values: None, max_size: Some(3346), added: 5821, mode: MaxEncodedLen) + /// Storage: `Multisig::Multisigs` (r:1 w:1) + /// Proof: `Multisig::Multisigs` (`max_values`: None, `max_size`: Some(3346), added: 5821, mode: `MaxEncodedLen`) /// The range of component `s` is `[2, 100]`. fn approve_as_multi_create(s: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `301 + s * (2 ±0)` // Estimated: `6811` - // Minimum execution time: 33_275_000 picoseconds. - Weight::from_parts(34_073_221, 6811) - // Standard Error: 1_163 - .saturating_add(Weight::from_parts(124_815, 0).saturating_mul(s.into())) + // Minimum execution time: 29_102_000 picoseconds. + Weight::from_parts(30_317_105, 6811) + // Standard Error: 903 + .saturating_add(Weight::from_parts(109_792, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: Multisig Multisigs (r:1 w:1) - /// Proof: Multisig Multisigs (max_values: None, max_size: Some(3346), added: 5821, mode: MaxEncodedLen) + /// Storage: `Multisig::Multisigs` (r:1 w:1) + /// Proof: `Multisig::Multisigs` (`max_values`: None, `max_size`: Some(3346), added: 5821, mode: `MaxEncodedLen`) /// The range of component `s` is `[2, 100]`. fn approve_as_multi_approve(s: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `320` // Estimated: `6811` - // Minimum execution time: 18_411_000 picoseconds. - Weight::from_parts(19_431_787, 6811) - // Standard Error: 694 - .saturating_add(Weight::from_parts(107_220, 0).saturating_mul(s.into())) + // Minimum execution time: 16_300_000 picoseconds. + Weight::from_parts(17_358_877, 6811) + // Standard Error: 522 + .saturating_add(Weight::from_parts(99_194, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: Multisig Multisigs (r:1 w:1) - /// Proof: Multisig Multisigs (max_values: None, max_size: Some(3346), added: 5821, mode: MaxEncodedLen) + /// Storage: `Multisig::Multisigs` (r:1 w:1) + /// Proof: `Multisig::Multisigs` (`max_values`: None, `max_size`: Some(3346), added: 5821, mode: `MaxEncodedLen`) /// The range of component `s` is `[2, 100]`. fn cancel_as_multi(s: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `492 + s * (1 ±0)` // Estimated: `6811` - // Minimum execution time: 33_985_000 picoseconds. - Weight::from_parts(35_547_970, 6811) - // Standard Error: 1_135 - .saturating_add(Weight::from_parts(116_537, 0).saturating_mul(s.into())) + // Minimum execution time: 30_147_000 picoseconds. + Weight::from_parts(32_003_421, 6811) + // Standard Error: 1_077 + .saturating_add(Weight::from_parts(108_567, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } } -// For backwards compatibility and tests +// For backwards compatibility and tests. impl WeightInfo for () { + /// Storage: `SafeMode::EnteredUntil` (r:1 w:0) + /// Proof: `SafeMode::EnteredUntil` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `TxPause::PausedCalls` (r:1 w:0) + /// Proof: `TxPause::PausedCalls` (`max_values`: None, `max_size`: Some(532), added: 3007, mode: `MaxEncodedLen`) /// The range of component `z` is `[0, 10000]`. fn as_multi_threshold_1(z: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 13_452_000 picoseconds. - Weight::from_parts(14_425_869, 0) + // Measured: `145` + // Estimated: `3997` + // Minimum execution time: 20_302_000 picoseconds. + Weight::from_parts(21_362_808, 3997) // Standard Error: 4 - .saturating_add(Weight::from_parts(493, 0).saturating_mul(z.into())) + .saturating_add(Weight::from_parts(432, 0).saturating_mul(z.into())) + .saturating_add(RocksDbWeight::get().reads(2_u64)) } - /// Storage: Multisig Multisigs (r:1 w:1) - /// Proof: Multisig Multisigs (max_values: None, max_size: Some(3346), added: 5821, mode: MaxEncodedLen) + /// Storage: `Multisig::Multisigs` (r:1 w:1) + /// Proof: `Multisig::Multisigs` (`max_values`: None, `max_size`: Some(3346), added: 5821, mode: `MaxEncodedLen`) /// The range of component `s` is `[2, 100]`. /// The range of component `z` is `[0, 10000]`. fn as_multi_create(s: u32, z: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `301 + s * (2 ±0)` // Estimated: `6811` - // Minimum execution time: 46_012_000 picoseconds. - Weight::from_parts(34_797_344, 6811) - // Standard Error: 833 - .saturating_add(Weight::from_parts(127_671, 0).saturating_mul(s.into())) - // Standard Error: 8 - .saturating_add(Weight::from_parts(1_498, 0).saturating_mul(z.into())) + // Minimum execution time: 41_140_000 picoseconds. + Weight::from_parts(31_518_927, 6811) + // Standard Error: 754 + .saturating_add(Weight::from_parts(115_804, 0).saturating_mul(s.into())) + // Standard Error: 7 + .saturating_add(Weight::from_parts(1_442, 0).saturating_mul(z.into())) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Multisig Multisigs (r:1 w:1) - /// Proof: Multisig Multisigs (max_values: None, max_size: Some(3346), added: 5821, mode: MaxEncodedLen) + /// Storage: `Multisig::Multisigs` (r:1 w:1) + /// Proof: `Multisig::Multisigs` (`max_values`: None, `max_size`: Some(3346), added: 5821, mode: `MaxEncodedLen`) /// The range of component `s` is `[3, 100]`. /// The range of component `z` is `[0, 10000]`. fn as_multi_approve(s: u32, z: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `320` // Estimated: `6811` - // Minimum execution time: 29_834_000 picoseconds. - Weight::from_parts(20_189_154, 6811) - // Standard Error: 637 - .saturating_add(Weight::from_parts(110_080, 0).saturating_mul(s.into())) - // Standard Error: 6 - .saturating_add(Weight::from_parts(1_483, 0).saturating_mul(z.into())) + // Minimum execution time: 27_375_000 picoseconds. + Weight::from_parts(17_806_361, 6811) + // Standard Error: 501 + .saturating_add(Weight::from_parts(107_042, 0).saturating_mul(s.into())) + // Standard Error: 4 + .saturating_add(Weight::from_parts(1_491, 0).saturating_mul(z.into())) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Multisig Multisigs (r:1 w:1) - /// Proof: Multisig Multisigs (max_values: None, max_size: Some(3346), added: 5821, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: `Multisig::Multisigs` (r:1 w:1) + /// Proof: `Multisig::Multisigs` (`max_values`: None, `max_size`: Some(3346), added: 5821, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `SafeMode::EnteredUntil` (r:1 w:0) + /// Proof: `SafeMode::EnteredUntil` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `TxPause::PausedCalls` (r:1 w:0) + /// Proof: `TxPause::PausedCalls` (`max_values`: None, `max_size`: Some(532), added: 3007, mode: `MaxEncodedLen`) /// The range of component `s` is `[2, 100]`. /// The range of component `z` is `[0, 10000]`. fn as_multi_complete(s: u32, z: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `426 + s * (33 ±0)` + // Measured: `571 + s * (33 ±0)` // Estimated: `6811` - // Minimum execution time: 51_464_000 picoseconds. - Weight::from_parts(39_246_644, 6811) - // Standard Error: 1_251 - .saturating_add(Weight::from_parts(143_313, 0).saturating_mul(s.into())) - // Standard Error: 12 - .saturating_add(Weight::from_parts(1_523, 0).saturating_mul(z.into())) - .saturating_add(RocksDbWeight::get().reads(2_u64)) + // Minimum execution time: 54_427_000 picoseconds. + Weight::from_parts(43_677_970, 6811) + // Standard Error: 1_342 + .saturating_add(Weight::from_parts(154_697, 0).saturating_mul(s.into())) + // Standard Error: 13 + .saturating_add(Weight::from_parts(1_534, 0).saturating_mul(z.into())) + .saturating_add(RocksDbWeight::get().reads(4_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } - /// Storage: Multisig Multisigs (r:1 w:1) - /// Proof: Multisig Multisigs (max_values: None, max_size: Some(3346), added: 5821, mode: MaxEncodedLen) + /// Storage: `Multisig::Multisigs` (r:1 w:1) + /// Proof: `Multisig::Multisigs` (`max_values`: None, `max_size`: Some(3346), added: 5821, mode: `MaxEncodedLen`) /// The range of component `s` is `[2, 100]`. fn approve_as_multi_create(s: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `301 + s * (2 ±0)` // Estimated: `6811` - // Minimum execution time: 33_275_000 picoseconds. - Weight::from_parts(34_073_221, 6811) - // Standard Error: 1_163 - .saturating_add(Weight::from_parts(124_815, 0).saturating_mul(s.into())) + // Minimum execution time: 29_102_000 picoseconds. + Weight::from_parts(30_317_105, 6811) + // Standard Error: 903 + .saturating_add(Weight::from_parts(109_792, 0).saturating_mul(s.into())) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Multisig Multisigs (r:1 w:1) - /// Proof: Multisig Multisigs (max_values: None, max_size: Some(3346), added: 5821, mode: MaxEncodedLen) + /// Storage: `Multisig::Multisigs` (r:1 w:1) + /// Proof: `Multisig::Multisigs` (`max_values`: None, `max_size`: Some(3346), added: 5821, mode: `MaxEncodedLen`) /// The range of component `s` is `[2, 100]`. fn approve_as_multi_approve(s: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `320` // Estimated: `6811` - // Minimum execution time: 18_411_000 picoseconds. - Weight::from_parts(19_431_787, 6811) - // Standard Error: 694 - .saturating_add(Weight::from_parts(107_220, 0).saturating_mul(s.into())) + // Minimum execution time: 16_300_000 picoseconds. + Weight::from_parts(17_358_877, 6811) + // Standard Error: 522 + .saturating_add(Weight::from_parts(99_194, 0).saturating_mul(s.into())) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Multisig Multisigs (r:1 w:1) - /// Proof: Multisig Multisigs (max_values: None, max_size: Some(3346), added: 5821, mode: MaxEncodedLen) + /// Storage: `Multisig::Multisigs` (r:1 w:1) + /// Proof: `Multisig::Multisigs` (`max_values`: None, `max_size`: Some(3346), added: 5821, mode: `MaxEncodedLen`) /// The range of component `s` is `[2, 100]`. fn cancel_as_multi(s: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `492 + s * (1 ±0)` // Estimated: `6811` - // Minimum execution time: 33_985_000 picoseconds. - Weight::from_parts(35_547_970, 6811) - // Standard Error: 1_135 - .saturating_add(Weight::from_parts(116_537, 0).saturating_mul(s.into())) + // Minimum execution time: 30_147_000 picoseconds. + Weight::from_parts(32_003_421, 6811) + // Standard Error: 1_077 + .saturating_add(Weight::from_parts(108_567, 0).saturating_mul(s.into())) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } diff --git a/substrate/frame/nft-fractionalization/Cargo.toml b/substrate/frame/nft-fractionalization/Cargo.toml index a55bcab533d8ee05476ac6fdc0520129e6525771..b5a929468f7dc734ac3efb394b8a99475bb00a41 100644 --- a/substrate/frame/nft-fractionalization/Cargo.toml +++ b/substrate/frame/nft-fractionalization/Cargo.toml @@ -17,8 +17,8 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false } -log = { version = "0.4.17", default-features = false } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +log = { workspace = true } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } frame-benchmarking = { path = "../benchmarking", default-features = false, optional = true } frame-support = { path = "../support", default-features = false } frame-system = { path = "../system", default-features = false } diff --git a/substrate/frame/nft-fractionalization/src/mock.rs b/substrate/frame/nft-fractionalization/src/mock.rs index 40cce96d55073cd70f5368e575e12f3635bcdb24..82a608816260041d6887af80334b423de1c4f744 100644 --- a/substrate/frame/nft-fractionalization/src/mock.rs +++ b/substrate/frame/nft-fractionalization/src/mock.rs @@ -27,9 +27,8 @@ use frame_support::{ }; use frame_system::EnsureSigned; use pallet_nfts::PalletFeatures; -use sp_core::H256; use sp_runtime::{ - traits::{BlakeTwo256, IdentifyAccount, IdentityLookup, Verify}, + traits::{IdentifyAccount, IdentityLookup, Verify}, BuildStorage, MultiSignature, }; @@ -50,31 +49,12 @@ construct_runtime!( } ); -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { - type BaseCallFilter = frame_support::traits::Everything; - type BlockWeights = (); - type BlockLength = (); - type RuntimeOrigin = RuntimeOrigin; - type RuntimeCall = RuntimeCall; - type Nonce = u64; - type Hash = H256; - type Hashing = BlakeTwo256; type AccountId = AccountId; type Lookup = IdentityLookup; type Block = Block; - type RuntimeEvent = RuntimeEvent; - type BlockHashCount = ConstU64<250>; - type DbWeight = (); - type Version = (); - type PalletInfo = PalletInfo; type AccountData = pallet_balances::AccountData; - type OnNewAccount = (); - type OnKilledAccount = (); - type SystemWeightInfo = (); - type SS58Prefix = (); - type OnSetCode = (); - type MaxConsumers = ConstU32<16>; } impl pallet_balances::Config for Test { diff --git a/substrate/frame/nft-fractionalization/src/weights.rs b/substrate/frame/nft-fractionalization/src/weights.rs index ebb4aa0fbcfba2df71b6b7ecb9368540ef8b9ffa..bee6484d856e5b1c1babf2b407a36c3bca327ca6 100644 --- a/substrate/frame/nft-fractionalization/src/weights.rs +++ b/substrate/frame/nft-fractionalization/src/weights.rs @@ -15,16 +15,16 @@ // See the License for the specific language governing permissions and // limitations under the License. -//! Autogenerated weights for pallet_nft_fractionalization +//! Autogenerated weights for `pallet_nft_fractionalization` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-06-16, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-04-09, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-e8ezs4ez-project-145-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("dev"), DB CACHE: 1024 +//! HOSTNAME: `runner-anb7yjbi-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: `1024` // Executed Command: -// ./target/production/substrate +// ./target/production/substrate-node // benchmark // pallet // --chain=dev @@ -35,12 +35,11 @@ // --no-median-slopes // --no-min-squares // --extrinsic=* -// --execution=wasm // --wasm-execution=compiled // --heap-pages=4096 -// --output=./frame/nft-fractionalization/src/weights.rs -// --header=./HEADER-APACHE2 -// --template=./.maintain/frame-weight-template.hbs +// --output=./substrate/frame/nft-fractionalization/src/weights.rs +// --header=./substrate/HEADER-APACHE2 +// --template=./substrate/.maintain/frame-weight-template.hbs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -50,136 +49,136 @@ use frame_support::{traits::Get, weights::{Weight, constants::RocksDbWeight}}; use core::marker::PhantomData; -/// Weight functions needed for pallet_nft_fractionalization. +/// Weight functions needed for `pallet_nft_fractionalization`. pub trait WeightInfo { fn fractionalize() -> Weight; fn unify() -> Weight; } -/// Weights for pallet_nft_fractionalization using the Substrate node and recommended hardware. +/// Weights for `pallet_nft_fractionalization` using the Substrate node and recommended hardware. pub struct SubstrateWeight(PhantomData); impl WeightInfo for SubstrateWeight { - /// Storage: Nfts Item (r:1 w:0) - /// Proof: Nfts Item (max_values: None, max_size: Some(861), added: 3336, mode: MaxEncodedLen) - /// Storage: Balances Holds (r:1 w:1) - /// Proof: Balances Holds (max_values: None, max_size: Some(85), added: 2560, mode: MaxEncodedLen) - /// Storage: Nfts Collection (r:1 w:1) - /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) - /// Storage: Nfts Attribute (r:1 w:1) - /// Proof: Nfts Attribute (max_values: None, max_size: Some(446), added: 2921, mode: MaxEncodedLen) - /// Storage: Assets Asset (r:1 w:1) - /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) - /// Storage: Assets Account (r:1 w:1) - /// Proof: Assets Account (max_values: None, max_size: Some(134), added: 2609, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) - /// Storage: Assets Metadata (r:1 w:1) - /// Proof: Assets Metadata (max_values: None, max_size: Some(140), added: 2615, mode: MaxEncodedLen) - /// Storage: NftFractionalization NftToAsset (r:0 w:1) - /// Proof: NftFractionalization NftToAsset (max_values: None, max_size: Some(92), added: 2567, mode: MaxEncodedLen) + /// Storage: `Nfts::Item` (r:1 w:0) + /// Proof: `Nfts::Item` (`max_values`: None, `max_size`: Some(861), added: 3336, mode: `MaxEncodedLen`) + /// Storage: `Balances::Holds` (r:1 w:1) + /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(193), added: 2668, mode: `MaxEncodedLen`) + /// Storage: `Nfts::Attribute` (r:1 w:1) + /// Proof: `Nfts::Attribute` (`max_values`: None, `max_size`: Some(479), added: 2954, mode: `MaxEncodedLen`) + /// Storage: `Nfts::Collection` (r:1 w:1) + /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) + /// Storage: `Assets::Asset` (r:1 w:1) + /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) + /// Storage: `Assets::Account` (r:1 w:1) + /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `Assets::Metadata` (r:1 w:1) + /// Proof: `Assets::Metadata` (`max_values`: None, `max_size`: Some(140), added: 2615, mode: `MaxEncodedLen`) + /// Storage: `NftFractionalization::NftToAsset` (r:0 w:1) + /// Proof: `NftFractionalization::NftToAsset` (`max_values`: None, `max_size`: Some(92), added: 2567, mode: `MaxEncodedLen`) fn fractionalize() -> Weight { // Proof Size summary in bytes: // Measured: `609` // Estimated: `4326` - // Minimum execution time: 187_416_000 picoseconds. - Weight::from_parts(191_131_000, 4326) + // Minimum execution time: 174_545_000 picoseconds. + Weight::from_parts(177_765_000, 4326) .saturating_add(T::DbWeight::get().reads(8_u64)) .saturating_add(T::DbWeight::get().writes(8_u64)) } - /// Storage: NftFractionalization NftToAsset (r:1 w:1) - /// Proof: NftFractionalization NftToAsset (max_values: None, max_size: Some(92), added: 2567, mode: MaxEncodedLen) - /// Storage: Assets Asset (r:1 w:1) - /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) - /// Storage: Assets Account (r:1 w:1) - /// Proof: Assets Account (max_values: None, max_size: Some(134), added: 2609, mode: MaxEncodedLen) - /// Storage: Nfts Attribute (r:1 w:1) - /// Proof: Nfts Attribute (max_values: None, max_size: Some(446), added: 2921, mode: MaxEncodedLen) - /// Storage: Nfts Collection (r:1 w:1) - /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) - /// Storage: Nfts CollectionConfigOf (r:1 w:0) - /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - /// Storage: Nfts ItemConfigOf (r:1 w:0) - /// Proof: Nfts ItemConfigOf (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) - /// Storage: Nfts Item (r:1 w:1) - /// Proof: Nfts Item (max_values: None, max_size: Some(861), added: 3336, mode: MaxEncodedLen) - /// Storage: Balances Holds (r:1 w:1) - /// Proof: Balances Holds (max_values: None, max_size: Some(85), added: 2560, mode: MaxEncodedLen) - /// Storage: Nfts Account (r:0 w:1) - /// Proof: Nfts Account (max_values: None, max_size: Some(88), added: 2563, mode: MaxEncodedLen) - /// Storage: Nfts ItemPriceOf (r:0 w:1) - /// Proof: Nfts ItemPriceOf (max_values: None, max_size: Some(89), added: 2564, mode: MaxEncodedLen) - /// Storage: Nfts PendingSwapOf (r:0 w:1) - /// Proof: Nfts PendingSwapOf (max_values: None, max_size: Some(71), added: 2546, mode: MaxEncodedLen) + /// Storage: `NftFractionalization::NftToAsset` (r:1 w:1) + /// Proof: `NftFractionalization::NftToAsset` (`max_values`: None, `max_size`: Some(92), added: 2567, mode: `MaxEncodedLen`) + /// Storage: `Assets::Asset` (r:1 w:1) + /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) + /// Storage: `Assets::Account` (r:1 w:1) + /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) + /// Storage: `Nfts::Attribute` (r:1 w:1) + /// Proof: `Nfts::Attribute` (`max_values`: None, `max_size`: Some(479), added: 2954, mode: `MaxEncodedLen`) + /// Storage: `Nfts::Collection` (r:1 w:1) + /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) + /// Storage: `Nfts::CollectionConfigOf` (r:1 w:0) + /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) + /// Storage: `Nfts::ItemConfigOf` (r:1 w:0) + /// Proof: `Nfts::ItemConfigOf` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) + /// Storage: `Nfts::Item` (r:1 w:1) + /// Proof: `Nfts::Item` (`max_values`: None, `max_size`: Some(861), added: 3336, mode: `MaxEncodedLen`) + /// Storage: `Balances::Holds` (r:1 w:1) + /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(193), added: 2668, mode: `MaxEncodedLen`) + /// Storage: `Nfts::Account` (r:0 w:1) + /// Proof: `Nfts::Account` (`max_values`: None, `max_size`: Some(88), added: 2563, mode: `MaxEncodedLen`) + /// Storage: `Nfts::ItemPriceOf` (r:0 w:1) + /// Proof: `Nfts::ItemPriceOf` (`max_values`: None, `max_size`: Some(89), added: 2564, mode: `MaxEncodedLen`) + /// Storage: `Nfts::PendingSwapOf` (r:0 w:1) + /// Proof: `Nfts::PendingSwapOf` (`max_values`: None, `max_size`: Some(71), added: 2546, mode: `MaxEncodedLen`) fn unify() -> Weight { // Proof Size summary in bytes: // Measured: `1422` // Estimated: `4326` - // Minimum execution time: 134_159_000 picoseconds. - Weight::from_parts(136_621_000, 4326) + // Minimum execution time: 128_211_000 picoseconds. + Weight::from_parts(131_545_000, 4326) .saturating_add(T::DbWeight::get().reads(9_u64)) .saturating_add(T::DbWeight::get().writes(10_u64)) } } -// For backwards compatibility and tests +// For backwards compatibility and tests. impl WeightInfo for () { - /// Storage: Nfts Item (r:1 w:0) - /// Proof: Nfts Item (max_values: None, max_size: Some(861), added: 3336, mode: MaxEncodedLen) - /// Storage: Balances Holds (r:1 w:1) - /// Proof: Balances Holds (max_values: None, max_size: Some(85), added: 2560, mode: MaxEncodedLen) - /// Storage: Nfts Collection (r:1 w:1) - /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) - /// Storage: Nfts Attribute (r:1 w:1) - /// Proof: Nfts Attribute (max_values: None, max_size: Some(446), added: 2921, mode: MaxEncodedLen) - /// Storage: Assets Asset (r:1 w:1) - /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) - /// Storage: Assets Account (r:1 w:1) - /// Proof: Assets Account (max_values: None, max_size: Some(134), added: 2609, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) - /// Storage: Assets Metadata (r:1 w:1) - /// Proof: Assets Metadata (max_values: None, max_size: Some(140), added: 2615, mode: MaxEncodedLen) - /// Storage: NftFractionalization NftToAsset (r:0 w:1) - /// Proof: NftFractionalization NftToAsset (max_values: None, max_size: Some(92), added: 2567, mode: MaxEncodedLen) + /// Storage: `Nfts::Item` (r:1 w:0) + /// Proof: `Nfts::Item` (`max_values`: None, `max_size`: Some(861), added: 3336, mode: `MaxEncodedLen`) + /// Storage: `Balances::Holds` (r:1 w:1) + /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(193), added: 2668, mode: `MaxEncodedLen`) + /// Storage: `Nfts::Attribute` (r:1 w:1) + /// Proof: `Nfts::Attribute` (`max_values`: None, `max_size`: Some(479), added: 2954, mode: `MaxEncodedLen`) + /// Storage: `Nfts::Collection` (r:1 w:1) + /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) + /// Storage: `Assets::Asset` (r:1 w:1) + /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) + /// Storage: `Assets::Account` (r:1 w:1) + /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `Assets::Metadata` (r:1 w:1) + /// Proof: `Assets::Metadata` (`max_values`: None, `max_size`: Some(140), added: 2615, mode: `MaxEncodedLen`) + /// Storage: `NftFractionalization::NftToAsset` (r:0 w:1) + /// Proof: `NftFractionalization::NftToAsset` (`max_values`: None, `max_size`: Some(92), added: 2567, mode: `MaxEncodedLen`) fn fractionalize() -> Weight { // Proof Size summary in bytes: // Measured: `609` // Estimated: `4326` - // Minimum execution time: 187_416_000 picoseconds. - Weight::from_parts(191_131_000, 4326) + // Minimum execution time: 174_545_000 picoseconds. + Weight::from_parts(177_765_000, 4326) .saturating_add(RocksDbWeight::get().reads(8_u64)) .saturating_add(RocksDbWeight::get().writes(8_u64)) } - /// Storage: NftFractionalization NftToAsset (r:1 w:1) - /// Proof: NftFractionalization NftToAsset (max_values: None, max_size: Some(92), added: 2567, mode: MaxEncodedLen) - /// Storage: Assets Asset (r:1 w:1) - /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) - /// Storage: Assets Account (r:1 w:1) - /// Proof: Assets Account (max_values: None, max_size: Some(134), added: 2609, mode: MaxEncodedLen) - /// Storage: Nfts Attribute (r:1 w:1) - /// Proof: Nfts Attribute (max_values: None, max_size: Some(446), added: 2921, mode: MaxEncodedLen) - /// Storage: Nfts Collection (r:1 w:1) - /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) - /// Storage: Nfts CollectionConfigOf (r:1 w:0) - /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - /// Storage: Nfts ItemConfigOf (r:1 w:0) - /// Proof: Nfts ItemConfigOf (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) - /// Storage: Nfts Item (r:1 w:1) - /// Proof: Nfts Item (max_values: None, max_size: Some(861), added: 3336, mode: MaxEncodedLen) - /// Storage: Balances Holds (r:1 w:1) - /// Proof: Balances Holds (max_values: None, max_size: Some(85), added: 2560, mode: MaxEncodedLen) - /// Storage: Nfts Account (r:0 w:1) - /// Proof: Nfts Account (max_values: None, max_size: Some(88), added: 2563, mode: MaxEncodedLen) - /// Storage: Nfts ItemPriceOf (r:0 w:1) - /// Proof: Nfts ItemPriceOf (max_values: None, max_size: Some(89), added: 2564, mode: MaxEncodedLen) - /// Storage: Nfts PendingSwapOf (r:0 w:1) - /// Proof: Nfts PendingSwapOf (max_values: None, max_size: Some(71), added: 2546, mode: MaxEncodedLen) + /// Storage: `NftFractionalization::NftToAsset` (r:1 w:1) + /// Proof: `NftFractionalization::NftToAsset` (`max_values`: None, `max_size`: Some(92), added: 2567, mode: `MaxEncodedLen`) + /// Storage: `Assets::Asset` (r:1 w:1) + /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) + /// Storage: `Assets::Account` (r:1 w:1) + /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) + /// Storage: `Nfts::Attribute` (r:1 w:1) + /// Proof: `Nfts::Attribute` (`max_values`: None, `max_size`: Some(479), added: 2954, mode: `MaxEncodedLen`) + /// Storage: `Nfts::Collection` (r:1 w:1) + /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) + /// Storage: `Nfts::CollectionConfigOf` (r:1 w:0) + /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) + /// Storage: `Nfts::ItemConfigOf` (r:1 w:0) + /// Proof: `Nfts::ItemConfigOf` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) + /// Storage: `Nfts::Item` (r:1 w:1) + /// Proof: `Nfts::Item` (`max_values`: None, `max_size`: Some(861), added: 3336, mode: `MaxEncodedLen`) + /// Storage: `Balances::Holds` (r:1 w:1) + /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(193), added: 2668, mode: `MaxEncodedLen`) + /// Storage: `Nfts::Account` (r:0 w:1) + /// Proof: `Nfts::Account` (`max_values`: None, `max_size`: Some(88), added: 2563, mode: `MaxEncodedLen`) + /// Storage: `Nfts::ItemPriceOf` (r:0 w:1) + /// Proof: `Nfts::ItemPriceOf` (`max_values`: None, `max_size`: Some(89), added: 2564, mode: `MaxEncodedLen`) + /// Storage: `Nfts::PendingSwapOf` (r:0 w:1) + /// Proof: `Nfts::PendingSwapOf` (`max_values`: None, `max_size`: Some(71), added: 2546, mode: `MaxEncodedLen`) fn unify() -> Weight { // Proof Size summary in bytes: // Measured: `1422` // Estimated: `4326` - // Minimum execution time: 134_159_000 picoseconds. - Weight::from_parts(136_621_000, 4326) + // Minimum execution time: 128_211_000 picoseconds. + Weight::from_parts(131_545_000, 4326) .saturating_add(RocksDbWeight::get().reads(9_u64)) .saturating_add(RocksDbWeight::get().writes(10_u64)) } diff --git a/substrate/frame/nfts/Cargo.toml b/substrate/frame/nfts/Cargo.toml index d92a9c0b44ed00ed127808a011586e162b1e473e..4f818ea3e08c52e741124f42463f3b9ecc3ae9c9 100644 --- a/substrate/frame/nfts/Cargo.toml +++ b/substrate/frame/nfts/Cargo.toml @@ -18,8 +18,8 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false } enumflags2 = { version = "0.7.7" } -log = { version = "0.4.17", default-features = false } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +log = { workspace = true } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } frame-benchmarking = { path = "../benchmarking", default-features = false, optional = true } frame-support = { path = "../support", default-features = false } frame-system = { path = "../system", default-features = false } diff --git a/substrate/frame/nfts/src/features/metadata.rs b/substrate/frame/nfts/src/features/metadata.rs index e177f39bb8b813f5f3698bca7c70abd1e0660fa5..85edd294d50b7d82e578afc0014ce9890ffe903c 100644 --- a/substrate/frame/nfts/src/features/metadata.rs +++ b/substrate/frame/nfts/src/features/metadata.rs @@ -247,7 +247,7 @@ impl, I: 'static> Pallet { ); } - let details = + let mut details = Collection::::get(&collection).ok_or(Error::::UnknownCollection)?; let collection_config = Self::get_collection_config(&collection)?; @@ -260,6 +260,8 @@ impl, I: 'static> Pallet { CollectionMetadataOf::::try_mutate_exists(collection, |metadata| { let deposit = metadata.take().ok_or(Error::::UnknownCollection)?.deposit; T::Currency::unreserve(&details.owner, deposit); + details.owner_deposit.saturating_reduce(deposit); + Collection::::insert(&collection, details); Self::deposit_event(Event::CollectionMetadataCleared { collection }); Ok(()) }) diff --git a/substrate/frame/nfts/src/lib.rs b/substrate/frame/nfts/src/lib.rs index a7d505e2e397dbca5f547ed9ed1a7c3cc4235aa5..615720268fed611bbf7effa1f4b71eca0df4a7e7 100644 --- a/substrate/frame/nfts/src/lib.rs +++ b/substrate/frame/nfts/src/lib.rs @@ -76,7 +76,7 @@ pub mod pallet { use frame_support::{pallet_prelude::*, traits::ExistenceRequirement}; use frame_system::pallet_prelude::*; - /// The current storage version. + /// The in-code storage version. const STORAGE_VERSION: StorageVersion = StorageVersion::new(1); #[pallet::pallet] @@ -874,8 +874,8 @@ pub mod pallet { ), ); Self::deposit_event(Event::PalletAttributeSet { - collection, - item: Some(item), + collection: collection_id, + item: Some(owned_item), attribute: pallet_attribute, value: attribute_value, }); diff --git a/substrate/frame/nfts/src/macros.rs b/substrate/frame/nfts/src/macros.rs index 1a601ce0927fa2f4c3cfae880d91e892e83d62fd..d313c8785b27149977badb4be7cefcdef8f8180e 100644 --- a/substrate/frame/nfts/src/macros.rs +++ b/substrate/frame/nfts/src/macros.rs @@ -42,7 +42,7 @@ macro_rules! impl_codec_bitflags { impl Decode for $wrapper { fn decode( input: &mut I, - ) -> sp_std::result::Result { + ) -> ::core::result::Result { let field = <$size>::decode(input)?; Ok(Self(BitFlags::from_bits(field as $size).map_err(|_| "invalid value")?)) } diff --git a/substrate/frame/nfts/src/migration.rs b/substrate/frame/nfts/src/migration.rs index 94635a96aeba991fb458f2cc7830922060727dd7..8f82e092262fb2d63cf1dda563afb0dd11c6f6ac 100644 --- a/substrate/frame/nfts/src/migration.rs +++ b/substrate/frame/nfts/src/migration.rs @@ -51,20 +51,20 @@ pub mod v1 { } /// A migration utility to update the storage version from v0 to v1 for the pallet. - pub struct MigrateToV1(sp_std::marker::PhantomData); + pub struct MigrateToV1(core::marker::PhantomData); impl OnRuntimeUpgrade for MigrateToV1 { fn on_runtime_upgrade() -> Weight { - let current_version = Pallet::::current_storage_version(); - let onchain_version = Pallet::::on_chain_storage_version(); + let in_code_version = Pallet::::in_code_storage_version(); + let on_chain_version = Pallet::::on_chain_storage_version(); log::info!( target: LOG_TARGET, - "Running migration with current storage version {:?} / onchain {:?}", - current_version, - onchain_version + "Running migration with in-code storage version {:?} / onchain {:?}", + in_code_version, + on_chain_version ); - if onchain_version == 0 && current_version == 1 { + if on_chain_version == 0 && in_code_version == 1 { let mut translated = 0u64; let mut configs_iterated = 0u64; Collection::::translate::< @@ -77,13 +77,13 @@ pub mod v1 { Some(old_value.migrate_to_v1(item_configs)) }); - current_version.put::>(); + in_code_version.put::>(); log::info!( target: LOG_TARGET, "Upgraded {} records, storage to version {:?}", translated, - current_version + in_code_version ); T::DbWeight::get().reads_writes(translated + configs_iterated + 1, translated + 1) } else { diff --git a/substrate/frame/nfts/src/mock.rs b/substrate/frame/nfts/src/mock.rs index ac6d0d757325d25981910354b58374a24838f3f5..51cfd5f244bcdb14fcdb1f66cff245df9030185f 100644 --- a/substrate/frame/nfts/src/mock.rs +++ b/substrate/frame/nfts/src/mock.rs @@ -24,10 +24,9 @@ use frame_support::{ construct_runtime, derive_impl, parameter_types, traits::{AsEnsureOriginWithArg, ConstU32, ConstU64}, }; -use sp_core::H256; use sp_keystore::{testing::MemoryKeystore, KeystoreExt}; use sp_runtime::{ - traits::{BlakeTwo256, IdentifyAccount, IdentityLookup, Verify}, + traits::{IdentifyAccount, IdentityLookup, Verify}, BuildStorage, MultiSignature, }; @@ -46,31 +45,12 @@ pub type Signature = MultiSignature; pub type AccountPublic = ::Signer; pub type AccountId = ::AccountId; -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { - type BaseCallFilter = frame_support::traits::Everything; - type BlockWeights = (); - type BlockLength = (); - type RuntimeOrigin = RuntimeOrigin; - type RuntimeCall = RuntimeCall; - type Nonce = u64; - type Hash = H256; - type Hashing = BlakeTwo256; type AccountId = AccountId; type Lookup = IdentityLookup; type Block = Block; - type RuntimeEvent = RuntimeEvent; - type BlockHashCount = ConstU64<250>; - type DbWeight = (); - type Version = (); - type PalletInfo = PalletInfo; type AccountData = pallet_balances::AccountData; - type OnNewAccount = (); - type OnKilledAccount = (); - type SystemWeightInfo = (); - type SS58Prefix = (); - type OnSetCode = (); - type MaxConsumers = ConstU32<16>; } impl pallet_balances::Config for Test { diff --git a/substrate/frame/nfts/src/tests.rs b/substrate/frame/nfts/src/tests.rs index 9e521537534fab31c4626c21ecf06e3df366c01b..4d23aca64ceb1ca604cc69b0918e47bfb0ea0eea 100644 --- a/substrate/frame/nfts/src/tests.rs +++ b/substrate/frame/nfts/src/tests.rs @@ -440,6 +440,12 @@ fn mint_should_work() { account(2), Some(MintWitness { owned_item: Some(43), ..Default::default() }) )); + assert!(events().contains(&Event::::PalletAttributeSet { + collection: 0, + item: Some(43), + attribute: PalletAttributes::<::CollectionId>::UsedToClaim(1), + value: Nfts::construct_attribute_value(vec![]).unwrap(), + })); // can't mint twice assert_noop!( @@ -3829,3 +3835,44 @@ fn basic_create_collection_with_id_should_work() { ); }); } + +#[test] +fn clear_collection_metadata_works() { + new_test_ext().execute_with(|| { + // Start with an account with 100 tokens, 10 of which are reserved + Balances::make_free_balance_be(&account(1), 100); + Balances::reserve(&account(1), 10).unwrap(); + + // Creating a collection increases owner deposit by 2 + assert_ok!(Nfts::create( + RuntimeOrigin::signed(account(1)), + account(1), + collection_config_with_all_settings_enabled() + )); + assert_eq!(Collection::::get(0).unwrap().owner_deposit, 2); + assert_eq!(Balances::reserved_balance(&account(1)), 12); + + // Setting collection metadata increases owner deposit by 10 + assert_ok!(Nfts::set_collection_metadata( + RuntimeOrigin::signed(account(1)), + 0, + bvec![0, 0, 0, 0, 0, 0, 0, 0, 0], + )); + assert_eq!(Collection::::get(0).unwrap().owner_deposit, 12); + assert_eq!(Balances::reserved_balance(&account(1)), 22); + + // Clearing collection metadata decreases owner deposit by 10 + assert_ok!(Nfts::clear_collection_metadata(RuntimeOrigin::signed(account(1)), 0)); + assert_eq!(Collection::::get(0).unwrap().owner_deposit, 2); + assert_eq!(Balances::reserved_balance(&account(1)), 12); + + // Destroying the collection removes it from storage + assert_ok!(Nfts::destroy( + RuntimeOrigin::signed(account(1)), + 0, + DestroyWitness { item_configs: 0, item_metadatas: 0, attributes: 0 } + )); + assert_eq!(Collection::::get(0), None); + assert_eq!(Balances::reserved_balance(&account(1)), 10); + }); +} diff --git a/substrate/frame/nfts/src/weights.rs b/substrate/frame/nfts/src/weights.rs index 6b8c577bb12e5d19bf5751d2a5019d60aea743b0..c5fb60a2206f084406095a3005437fcdb22188ee 100644 --- a/substrate/frame/nfts/src/weights.rs +++ b/substrate/frame/nfts/src/weights.rs @@ -15,16 +15,16 @@ // See the License for the specific language governing permissions and // limitations under the License. -//! Autogenerated weights for pallet_nfts +//! Autogenerated weights for `pallet_nfts` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-06-16, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-04-09, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-e8ezs4ez-project-145-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("dev"), DB CACHE: 1024 +//! HOSTNAME: `runner-anb7yjbi-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: `1024` // Executed Command: -// ./target/production/substrate +// ./target/production/substrate-node // benchmark // pallet // --chain=dev @@ -37,9 +37,9 @@ // --extrinsic=* // --wasm-execution=compiled // --heap-pages=4096 -// --output=./frame/nfts/src/weights.rs -// --header=./HEADER-APACHE2 -// --template=./.maintain/frame-weight-template.hbs +// --output=./substrate/frame/nfts/src/weights.rs +// --header=./substrate/HEADER-APACHE2 +// --template=./substrate/.maintain/frame-weight-template.hbs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -49,7 +49,7 @@ use frame_support::{traits::Get, weights::{Weight, constants::RocksDbWeight}}; use core::marker::PhantomData; -/// Weight functions needed for pallet_nfts. +/// Weight functions needed for `pallet_nfts`. pub trait WeightInfo { fn create() -> Weight; fn force_create() -> Weight; @@ -92,564 +92,568 @@ pub trait WeightInfo { fn set_attributes_pre_signed(n: u32, ) -> Weight; } -/// Weights for pallet_nfts using the Substrate node and recommended hardware. +/// Weights for `pallet_nfts` using the Substrate node and recommended hardware. pub struct SubstrateWeight(PhantomData); impl WeightInfo for SubstrateWeight { - /// Storage: Nfts NextCollectionId (r:1 w:1) - /// Proof: Nfts NextCollectionId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: Nfts Collection (r:1 w:1) - /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) - /// Storage: Nfts CollectionRoleOf (r:0 w:1) - /// Proof: Nfts CollectionRoleOf (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) - /// Storage: Nfts CollectionConfigOf (r:0 w:1) - /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - /// Storage: Nfts CollectionAccount (r:0 w:1) - /// Proof: Nfts CollectionAccount (max_values: None, max_size: Some(68), added: 2543, mode: MaxEncodedLen) + /// Storage: `Nfts::NextCollectionId` (r:1 w:1) + /// Proof: `Nfts::NextCollectionId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `Nfts::Collection` (r:1 w:1) + /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) + /// Storage: `Nfts::CollectionRoleOf` (r:0 w:1) + /// Proof: `Nfts::CollectionRoleOf` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) + /// Storage: `Nfts::CollectionConfigOf` (r:0 w:1) + /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) + /// Storage: `Nfts::CollectionAccount` (r:0 w:1) + /// Proof: `Nfts::CollectionAccount` (`max_values`: None, `max_size`: Some(68), added: 2543, mode: `MaxEncodedLen`) fn create() -> Weight { // Proof Size summary in bytes: // Measured: `216` // Estimated: `3549` - // Minimum execution time: 40_489_000 picoseconds. - Weight::from_parts(41_320_000, 3549) + // Minimum execution time: 34_863_000 picoseconds. + Weight::from_parts(36_679_000, 3549) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(5_u64)) } - /// Storage: Nfts NextCollectionId (r:1 w:1) - /// Proof: Nfts NextCollectionId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: Nfts Collection (r:1 w:1) - /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) - /// Storage: Nfts CollectionRoleOf (r:0 w:1) - /// Proof: Nfts CollectionRoleOf (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) - /// Storage: Nfts CollectionConfigOf (r:0 w:1) - /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - /// Storage: Nfts CollectionAccount (r:0 w:1) - /// Proof: Nfts CollectionAccount (max_values: None, max_size: Some(68), added: 2543, mode: MaxEncodedLen) + /// Storage: `Nfts::NextCollectionId` (r:1 w:1) + /// Proof: `Nfts::NextCollectionId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `Nfts::Collection` (r:1 w:1) + /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) + /// Storage: `Nfts::CollectionRoleOf` (r:0 w:1) + /// Proof: `Nfts::CollectionRoleOf` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) + /// Storage: `Nfts::CollectionConfigOf` (r:0 w:1) + /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) + /// Storage: `Nfts::CollectionAccount` (r:0 w:1) + /// Proof: `Nfts::CollectionAccount` (`max_values`: None, `max_size`: Some(68), added: 2543, mode: `MaxEncodedLen`) fn force_create() -> Weight { // Proof Size summary in bytes: // Measured: `76` // Estimated: `3549` - // Minimum execution time: 23_257_000 picoseconds. - Weight::from_parts(23_770_000, 3549) + // Minimum execution time: 19_631_000 picoseconds. + Weight::from_parts(20_384_000, 3549) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(5_u64)) } - /// Storage: Nfts Collection (r:1 w:1) - /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) - /// Storage: Nfts ItemMetadataOf (r:1 w:0) - /// Proof: Nfts ItemMetadataOf (max_values: None, max_size: Some(140), added: 2615, mode: MaxEncodedLen) - /// Storage: Nfts CollectionRoleOf (r:1 w:1) - /// Proof: Nfts CollectionRoleOf (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) - /// Storage: Nfts Attribute (r:1001 w:1000) - /// Proof: Nfts Attribute (max_values: None, max_size: Some(446), added: 2921, mode: MaxEncodedLen) - /// Storage: Nfts ItemConfigOf (r:1000 w:1000) - /// Proof: Nfts ItemConfigOf (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) - /// Storage: Nfts CollectionMetadataOf (r:0 w:1) - /// Proof: Nfts CollectionMetadataOf (max_values: None, max_size: Some(87), added: 2562, mode: MaxEncodedLen) - /// Storage: Nfts CollectionConfigOf (r:0 w:1) - /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - /// Storage: Nfts CollectionAccount (r:0 w:1) - /// Proof: Nfts CollectionAccount (max_values: None, max_size: Some(68), added: 2543, mode: MaxEncodedLen) + /// Storage: `Nfts::Collection` (r:1 w:1) + /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) + /// Storage: `Nfts::ItemMetadataOf` (r:1 w:0) + /// Proof: `Nfts::ItemMetadataOf` (`max_values`: None, `max_size`: Some(347), added: 2822, mode: `MaxEncodedLen`) + /// Storage: `Nfts::CollectionRoleOf` (r:1 w:1) + /// Proof: `Nfts::CollectionRoleOf` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) + /// Storage: `Nfts::Attribute` (r:1001 w:1000) + /// Proof: `Nfts::Attribute` (`max_values`: None, `max_size`: Some(479), added: 2954, mode: `MaxEncodedLen`) + /// Storage: `Nfts::ItemConfigOf` (r:1000 w:1000) + /// Proof: `Nfts::ItemConfigOf` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) + /// Storage: `Nfts::CollectionMetadataOf` (r:0 w:1) + /// Proof: `Nfts::CollectionMetadataOf` (`max_values`: None, `max_size`: Some(294), added: 2769, mode: `MaxEncodedLen`) + /// Storage: `Nfts::CollectionConfigOf` (r:0 w:1) + /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) + /// Storage: `Nfts::CollectionAccount` (r:0 w:1) + /// Proof: `Nfts::CollectionAccount` (`max_values`: None, `max_size`: Some(68), added: 2543, mode: `MaxEncodedLen`) /// The range of component `m` is `[0, 1000]`. /// The range of component `c` is `[0, 1000]`. /// The range of component `a` is `[0, 1000]`. fn destroy(_m: u32, _c: u32, a: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `32220 + a * (332 ±0)` - // Estimated: `2523990 + a * (2921 ±0)` - // Minimum execution time: 1_310_198_000 picoseconds. - Weight::from_parts(1_479_261_043, 2523990) - // Standard Error: 4_415 - .saturating_add(Weight::from_parts(6_016_212, 0).saturating_mul(a.into())) + // Measured: `32204 + a * (366 ±0)` + // Estimated: `2523990 + a * (2954 ±0)` + // Minimum execution time: 1_282_083_000 picoseconds. + Weight::from_parts(1_249_191_963, 2523990) + // Standard Error: 4_719 + .saturating_add(Weight::from_parts(6_470_227, 0).saturating_mul(a.into())) .saturating_add(T::DbWeight::get().reads(1004_u64)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(a.into()))) .saturating_add(T::DbWeight::get().writes(1005_u64)) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(a.into()))) - .saturating_add(Weight::from_parts(0, 2921).saturating_mul(a.into())) - } - /// Storage: Nfts CollectionConfigOf (r:1 w:0) - /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - /// Storage: Nfts Item (r:1 w:1) - /// Proof: Nfts Item (max_values: None, max_size: Some(861), added: 3336, mode: MaxEncodedLen) - /// Storage: Nfts Collection (r:1 w:1) - /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) - /// Storage: Nfts CollectionRoleOf (r:1 w:0) - /// Proof: Nfts CollectionRoleOf (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) - /// Storage: Nfts ItemConfigOf (r:1 w:1) - /// Proof: Nfts ItemConfigOf (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) - /// Storage: Nfts Account (r:0 w:1) - /// Proof: Nfts Account (max_values: None, max_size: Some(88), added: 2563, mode: MaxEncodedLen) + .saturating_add(Weight::from_parts(0, 2954).saturating_mul(a.into())) + } + /// Storage: `Nfts::CollectionConfigOf` (r:1 w:0) + /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) + /// Storage: `Nfts::Item` (r:1 w:1) + /// Proof: `Nfts::Item` (`max_values`: None, `max_size`: Some(861), added: 3336, mode: `MaxEncodedLen`) + /// Storage: `Nfts::Collection` (r:1 w:1) + /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) + /// Storage: `Nfts::CollectionRoleOf` (r:1 w:0) + /// Proof: `Nfts::CollectionRoleOf` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) + /// Storage: `Nfts::ItemConfigOf` (r:1 w:1) + /// Proof: `Nfts::ItemConfigOf` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) + /// Storage: `Nfts::Account` (r:0 w:1) + /// Proof: `Nfts::Account` (`max_values`: None, `max_size`: Some(88), added: 2563, mode: `MaxEncodedLen`) fn mint() -> Weight { // Proof Size summary in bytes: // Measured: `455` // Estimated: `4326` - // Minimum execution time: 51_910_000 picoseconds. - Weight::from_parts(53_441_000, 4326) + // Minimum execution time: 49_055_000 picoseconds. + Weight::from_parts(50_592_000, 4326) .saturating_add(T::DbWeight::get().reads(5_u64)) .saturating_add(T::DbWeight::get().writes(4_u64)) } - /// Storage: Nfts CollectionRoleOf (r:1 w:0) - /// Proof: Nfts CollectionRoleOf (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) - /// Storage: Nfts Item (r:1 w:1) - /// Proof: Nfts Item (max_values: None, max_size: Some(861), added: 3336, mode: MaxEncodedLen) - /// Storage: Nfts Collection (r:1 w:1) - /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) - /// Storage: Nfts CollectionConfigOf (r:1 w:0) - /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - /// Storage: Nfts ItemConfigOf (r:1 w:1) - /// Proof: Nfts ItemConfigOf (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) - /// Storage: Nfts Account (r:0 w:1) - /// Proof: Nfts Account (max_values: None, max_size: Some(88), added: 2563, mode: MaxEncodedLen) + /// Storage: `Nfts::CollectionRoleOf` (r:1 w:0) + /// Proof: `Nfts::CollectionRoleOf` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) + /// Storage: `Nfts::Item` (r:1 w:1) + /// Proof: `Nfts::Item` (`max_values`: None, `max_size`: Some(861), added: 3336, mode: `MaxEncodedLen`) + /// Storage: `Nfts::Collection` (r:1 w:1) + /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) + /// Storage: `Nfts::CollectionConfigOf` (r:1 w:0) + /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) + /// Storage: `Nfts::ItemConfigOf` (r:1 w:1) + /// Proof: `Nfts::ItemConfigOf` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) + /// Storage: `Nfts::Account` (r:0 w:1) + /// Proof: `Nfts::Account` (`max_values`: None, `max_size`: Some(88), added: 2563, mode: `MaxEncodedLen`) fn force_mint() -> Weight { // Proof Size summary in bytes: // Measured: `455` // Estimated: `4326` - // Minimum execution time: 50_168_000 picoseconds. - Weight::from_parts(51_380_000, 4326) + // Minimum execution time: 47_102_000 picoseconds. + Weight::from_parts(48_772_000, 4326) .saturating_add(T::DbWeight::get().reads(5_u64)) .saturating_add(T::DbWeight::get().writes(4_u64)) } - /// Storage: Nfts ItemConfigOf (r:1 w:1) - /// Proof: Nfts ItemConfigOf (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) - /// Storage: Nfts Collection (r:1 w:1) - /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) - /// Storage: Nfts Item (r:1 w:1) - /// Proof: Nfts Item (max_values: None, max_size: Some(861), added: 3336, mode: MaxEncodedLen) - /// Storage: Nfts ItemMetadataOf (r:1 w:0) - /// Proof: Nfts ItemMetadataOf (max_values: None, max_size: Some(140), added: 2615, mode: MaxEncodedLen) - /// Storage: Nfts Account (r:0 w:1) - /// Proof: Nfts Account (max_values: None, max_size: Some(88), added: 2563, mode: MaxEncodedLen) - /// Storage: Nfts ItemPriceOf (r:0 w:1) - /// Proof: Nfts ItemPriceOf (max_values: None, max_size: Some(89), added: 2564, mode: MaxEncodedLen) - /// Storage: Nfts ItemAttributesApprovalsOf (r:0 w:1) - /// Proof: Nfts ItemAttributesApprovalsOf (max_values: None, max_size: Some(681), added: 3156, mode: MaxEncodedLen) - /// Storage: Nfts PendingSwapOf (r:0 w:1) - /// Proof: Nfts PendingSwapOf (max_values: None, max_size: Some(71), added: 2546, mode: MaxEncodedLen) + /// Storage: `Nfts::Attribute` (r:1 w:0) + /// Proof: `Nfts::Attribute` (`max_values`: None, `max_size`: Some(479), added: 2954, mode: `MaxEncodedLen`) + /// Storage: `Nfts::ItemConfigOf` (r:1 w:1) + /// Proof: `Nfts::ItemConfigOf` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) + /// Storage: `Nfts::Collection` (r:1 w:1) + /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) + /// Storage: `Nfts::Item` (r:1 w:1) + /// Proof: `Nfts::Item` (`max_values`: None, `max_size`: Some(861), added: 3336, mode: `MaxEncodedLen`) + /// Storage: `Nfts::ItemMetadataOf` (r:1 w:0) + /// Proof: `Nfts::ItemMetadataOf` (`max_values`: None, `max_size`: Some(347), added: 2822, mode: `MaxEncodedLen`) + /// Storage: `Nfts::Account` (r:0 w:1) + /// Proof: `Nfts::Account` (`max_values`: None, `max_size`: Some(88), added: 2563, mode: `MaxEncodedLen`) + /// Storage: `Nfts::ItemPriceOf` (r:0 w:1) + /// Proof: `Nfts::ItemPriceOf` (`max_values`: None, `max_size`: Some(89), added: 2564, mode: `MaxEncodedLen`) + /// Storage: `Nfts::ItemAttributesApprovalsOf` (r:0 w:1) + /// Proof: `Nfts::ItemAttributesApprovalsOf` (`max_values`: None, `max_size`: Some(681), added: 3156, mode: `MaxEncodedLen`) + /// Storage: `Nfts::PendingSwapOf` (r:0 w:1) + /// Proof: `Nfts::PendingSwapOf` (`max_values`: None, `max_size`: Some(71), added: 2546, mode: `MaxEncodedLen`) fn burn() -> Weight { // Proof Size summary in bytes: // Measured: `564` // Estimated: `4326` - // Minimum execution time: 50_738_000 picoseconds. - Weight::from_parts(51_850_000, 4326) - .saturating_add(T::DbWeight::get().reads(4_u64)) + // Minimum execution time: 52_968_000 picoseconds. + Weight::from_parts(55_136_000, 4326) + .saturating_add(T::DbWeight::get().reads(5_u64)) .saturating_add(T::DbWeight::get().writes(7_u64)) } - /// Storage: Nfts Collection (r:1 w:0) - /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) - /// Storage: Nfts Attribute (r:1 w:0) - /// Proof: Nfts Attribute (max_values: None, max_size: Some(446), added: 2921, mode: MaxEncodedLen) - /// Storage: Nfts CollectionConfigOf (r:1 w:0) - /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - /// Storage: Nfts ItemConfigOf (r:1 w:0) - /// Proof: Nfts ItemConfigOf (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) - /// Storage: Nfts Item (r:1 w:1) - /// Proof: Nfts Item (max_values: None, max_size: Some(861), added: 3336, mode: MaxEncodedLen) - /// Storage: Nfts Account (r:0 w:2) - /// Proof: Nfts Account (max_values: None, max_size: Some(88), added: 2563, mode: MaxEncodedLen) - /// Storage: Nfts ItemPriceOf (r:0 w:1) - /// Proof: Nfts ItemPriceOf (max_values: None, max_size: Some(89), added: 2564, mode: MaxEncodedLen) - /// Storage: Nfts PendingSwapOf (r:0 w:1) - /// Proof: Nfts PendingSwapOf (max_values: None, max_size: Some(71), added: 2546, mode: MaxEncodedLen) + /// Storage: `Nfts::Collection` (r:1 w:0) + /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) + /// Storage: `Nfts::Attribute` (r:1 w:0) + /// Proof: `Nfts::Attribute` (`max_values`: None, `max_size`: Some(479), added: 2954, mode: `MaxEncodedLen`) + /// Storage: `Nfts::CollectionConfigOf` (r:1 w:0) + /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) + /// Storage: `Nfts::ItemConfigOf` (r:1 w:0) + /// Proof: `Nfts::ItemConfigOf` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) + /// Storage: `Nfts::Item` (r:1 w:1) + /// Proof: `Nfts::Item` (`max_values`: None, `max_size`: Some(861), added: 3336, mode: `MaxEncodedLen`) + /// Storage: `Nfts::Account` (r:0 w:2) + /// Proof: `Nfts::Account` (`max_values`: None, `max_size`: Some(88), added: 2563, mode: `MaxEncodedLen`) + /// Storage: `Nfts::ItemPriceOf` (r:0 w:1) + /// Proof: `Nfts::ItemPriceOf` (`max_values`: None, `max_size`: Some(89), added: 2564, mode: `MaxEncodedLen`) + /// Storage: `Nfts::PendingSwapOf` (r:0 w:1) + /// Proof: `Nfts::PendingSwapOf` (`max_values`: None, `max_size`: Some(71), added: 2546, mode: `MaxEncodedLen`) fn transfer() -> Weight { // Proof Size summary in bytes: // Measured: `593` // Estimated: `4326` - // Minimum execution time: 41_055_000 picoseconds. - Weight::from_parts(42_336_000, 4326) + // Minimum execution time: 41_140_000 picoseconds. + Weight::from_parts(43_288_000, 4326) .saturating_add(T::DbWeight::get().reads(5_u64)) .saturating_add(T::DbWeight::get().writes(5_u64)) } - /// Storage: Nfts Collection (r:1 w:0) - /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) - /// Storage: Nfts CollectionConfigOf (r:1 w:0) - /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - /// Storage: Nfts Item (r:5000 w:5000) - /// Proof: Nfts Item (max_values: None, max_size: Some(861), added: 3336, mode: MaxEncodedLen) + /// Storage: `Nfts::Collection` (r:1 w:0) + /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) + /// Storage: `Nfts::CollectionConfigOf` (r:1 w:0) + /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) + /// Storage: `Nfts::Item` (r:5000 w:5000) + /// Proof: `Nfts::Item` (`max_values`: None, `max_size`: Some(861), added: 3336, mode: `MaxEncodedLen`) /// The range of component `i` is `[0, 5000]`. fn redeposit(i: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `763 + i * (108 ±0)` // Estimated: `3549 + i * (3336 ±0)` - // Minimum execution time: 15_688_000 picoseconds. - Weight::from_parts(15_921_000, 3549) - // Standard Error: 14_827 - .saturating_add(Weight::from_parts(17_105_395, 0).saturating_mul(i.into())) + // Minimum execution time: 14_433_000 picoseconds. + Weight::from_parts(14_664_000, 3549) + // Standard Error: 23_078 + .saturating_add(Weight::from_parts(15_911_377, 0).saturating_mul(i.into())) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(i.into()))) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(i.into()))) .saturating_add(Weight::from_parts(0, 3336).saturating_mul(i.into())) } - /// Storage: Nfts CollectionRoleOf (r:1 w:0) - /// Proof: Nfts CollectionRoleOf (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) - /// Storage: Nfts ItemConfigOf (r:1 w:1) - /// Proof: Nfts ItemConfigOf (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) + /// Storage: `Nfts::CollectionRoleOf` (r:1 w:0) + /// Proof: `Nfts::CollectionRoleOf` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) + /// Storage: `Nfts::ItemConfigOf` (r:1 w:1) + /// Proof: `Nfts::ItemConfigOf` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) fn lock_item_transfer() -> Weight { // Proof Size summary in bytes: // Measured: `435` // Estimated: `3534` - // Minimum execution time: 19_981_000 picoseconds. - Weight::from_parts(20_676_000, 3534) + // Minimum execution time: 18_307_000 picoseconds. + Weight::from_parts(18_966_000, 3534) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: Nfts CollectionRoleOf (r:1 w:0) - /// Proof: Nfts CollectionRoleOf (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) - /// Storage: Nfts ItemConfigOf (r:1 w:1) - /// Proof: Nfts ItemConfigOf (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) + /// Storage: `Nfts::CollectionRoleOf` (r:1 w:0) + /// Proof: `Nfts::CollectionRoleOf` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) + /// Storage: `Nfts::ItemConfigOf` (r:1 w:1) + /// Proof: `Nfts::ItemConfigOf` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) fn unlock_item_transfer() -> Weight { // Proof Size summary in bytes: // Measured: `435` // Estimated: `3534` - // Minimum execution time: 19_911_000 picoseconds. - Weight::from_parts(20_612_000, 3534) + // Minimum execution time: 18_078_000 picoseconds. + Weight::from_parts(18_593_000, 3534) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: Nfts Collection (r:1 w:0) - /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) - /// Storage: Nfts CollectionConfigOf (r:1 w:1) - /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + /// Storage: `Nfts::Collection` (r:1 w:0) + /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) + /// Storage: `Nfts::CollectionConfigOf` (r:1 w:1) + /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) fn lock_collection() -> Weight { // Proof Size summary in bytes: // Measured: `340` // Estimated: `3549` - // Minimum execution time: 16_441_000 picoseconds. - Weight::from_parts(16_890_000, 3549) + // Minimum execution time: 15_175_000 picoseconds. + Weight::from_parts(15_762_000, 3549) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: Nfts OwnershipAcceptance (r:1 w:1) - /// Proof: Nfts OwnershipAcceptance (max_values: None, max_size: Some(52), added: 2527, mode: MaxEncodedLen) - /// Storage: Nfts Collection (r:1 w:1) - /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) - /// Storage: Nfts CollectionAccount (r:0 w:2) - /// Proof: Nfts CollectionAccount (max_values: None, max_size: Some(68), added: 2543, mode: MaxEncodedLen) + /// Storage: `Nfts::OwnershipAcceptance` (r:1 w:1) + /// Proof: `Nfts::OwnershipAcceptance` (`max_values`: None, `max_size`: Some(52), added: 2527, mode: `MaxEncodedLen`) + /// Storage: `Nfts::Collection` (r:1 w:1) + /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `Nfts::CollectionAccount` (r:0 w:2) + /// Proof: `Nfts::CollectionAccount` (`max_values`: None, `max_size`: Some(68), added: 2543, mode: `MaxEncodedLen`) fn transfer_ownership() -> Weight { // Proof Size summary in bytes: - // Measured: `388` - // Estimated: `3549` - // Minimum execution time: 22_610_000 picoseconds. - Weight::from_parts(23_422_000, 3549) - .saturating_add(T::DbWeight::get().reads(2_u64)) - .saturating_add(T::DbWeight::get().writes(4_u64)) + // Measured: `562` + // Estimated: `3593` + // Minimum execution time: 26_164_000 picoseconds. + Weight::from_parts(27_117_000, 3593) + .saturating_add(T::DbWeight::get().reads(3_u64)) + .saturating_add(T::DbWeight::get().writes(5_u64)) } - /// Storage: Nfts Collection (r:1 w:1) - /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) - /// Storage: Nfts CollectionRoleOf (r:2 w:4) - /// Proof: Nfts CollectionRoleOf (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) + /// Storage: `Nfts::Collection` (r:1 w:1) + /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) + /// Storage: `Nfts::CollectionRoleOf` (r:2 w:4) + /// Proof: `Nfts::CollectionRoleOf` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) fn set_team() -> Weight { // Proof Size summary in bytes: // Measured: `369` // Estimated: `6078` - // Minimum execution time: 39_739_000 picoseconds. - Weight::from_parts(41_306_000, 6078) + // Minimum execution time: 38_523_000 picoseconds. + Weight::from_parts(39_486_000, 6078) .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(5_u64)) } - /// Storage: Nfts Collection (r:1 w:1) - /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) - /// Storage: Nfts CollectionAccount (r:0 w:2) - /// Proof: Nfts CollectionAccount (max_values: None, max_size: Some(68), added: 2543, mode: MaxEncodedLen) + /// Storage: `Nfts::Collection` (r:1 w:1) + /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) + /// Storage: `Nfts::CollectionAccount` (r:0 w:2) + /// Proof: `Nfts::CollectionAccount` (`max_values`: None, `max_size`: Some(68), added: 2543, mode: `MaxEncodedLen`) fn force_collection_owner() -> Weight { // Proof Size summary in bytes: // Measured: `311` // Estimated: `3549` - // Minimum execution time: 17_685_000 picoseconds. - Weight::from_parts(18_258_000, 3549) + // Minimum execution time: 15_733_000 picoseconds. + Weight::from_parts(16_227_000, 3549) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(3_u64)) } - /// Storage: Nfts Collection (r:1 w:0) - /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) - /// Storage: Nfts CollectionConfigOf (r:0 w:1) - /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + /// Storage: `Nfts::Collection` (r:1 w:0) + /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) + /// Storage: `Nfts::CollectionConfigOf` (r:0 w:1) + /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) fn force_collection_config() -> Weight { // Proof Size summary in bytes: // Measured: `276` // Estimated: `3549` - // Minimum execution time: 13_734_000 picoseconds. - Weight::from_parts(14_337_000, 3549) + // Minimum execution time: 12_042_000 picoseconds. + Weight::from_parts(12_690_000, 3549) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: Nfts CollectionRoleOf (r:1 w:0) - /// Proof: Nfts CollectionRoleOf (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) - /// Storage: Nfts ItemConfigOf (r:1 w:1) - /// Proof: Nfts ItemConfigOf (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) + /// Storage: `Nfts::CollectionRoleOf` (r:1 w:0) + /// Proof: `Nfts::CollectionRoleOf` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) + /// Storage: `Nfts::ItemConfigOf` (r:1 w:1) + /// Proof: `Nfts::ItemConfigOf` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) fn lock_item_properties() -> Weight { // Proof Size summary in bytes: // Measured: `435` // Estimated: `3534` - // Minimum execution time: 19_269_000 picoseconds. - Weight::from_parts(19_859_000, 3534) + // Minimum execution time: 17_165_000 picoseconds. + Weight::from_parts(17_769_000, 3534) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: Nfts Collection (r:1 w:1) - /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) - /// Storage: Nfts CollectionRoleOf (r:1 w:0) - /// Proof: Nfts CollectionRoleOf (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) - /// Storage: Nfts CollectionConfigOf (r:1 w:0) - /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - /// Storage: Nfts ItemConfigOf (r:1 w:0) - /// Proof: Nfts ItemConfigOf (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) - /// Storage: Nfts Attribute (r:1 w:1) - /// Proof: Nfts Attribute (max_values: None, max_size: Some(446), added: 2921, mode: MaxEncodedLen) + /// Storage: `Nfts::Collection` (r:1 w:1) + /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) + /// Storage: `Nfts::CollectionRoleOf` (r:1 w:0) + /// Proof: `Nfts::CollectionRoleOf` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) + /// Storage: `Nfts::CollectionConfigOf` (r:1 w:0) + /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) + /// Storage: `Nfts::ItemConfigOf` (r:1 w:0) + /// Proof: `Nfts::ItemConfigOf` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) + /// Storage: `Nfts::Attribute` (r:1 w:1) + /// Proof: `Nfts::Attribute` (`max_values`: None, `max_size`: Some(479), added: 2954, mode: `MaxEncodedLen`) fn set_attribute() -> Weight { // Proof Size summary in bytes: // Measured: `539` - // Estimated: `3911` - // Minimum execution time: 51_540_000 picoseconds. - Weight::from_parts(52_663_000, 3911) + // Estimated: `3944` + // Minimum execution time: 48_862_000 picoseconds. + Weight::from_parts(50_584_000, 3944) .saturating_add(T::DbWeight::get().reads(5_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } - /// Storage: Nfts Collection (r:1 w:1) - /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) - /// Storage: Nfts Attribute (r:1 w:1) - /// Proof: Nfts Attribute (max_values: None, max_size: Some(446), added: 2921, mode: MaxEncodedLen) + /// Storage: `Nfts::Collection` (r:1 w:1) + /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) + /// Storage: `Nfts::Attribute` (r:1 w:1) + /// Proof: `Nfts::Attribute` (`max_values`: None, `max_size`: Some(479), added: 2954, mode: `MaxEncodedLen`) fn force_set_attribute() -> Weight { // Proof Size summary in bytes: // Measured: `344` - // Estimated: `3911` - // Minimum execution time: 26_529_000 picoseconds. - Weight::from_parts(27_305_000, 3911) + // Estimated: `3944` + // Minimum execution time: 24_665_000 picoseconds. + Weight::from_parts(25_465_000, 3944) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } - /// Storage: Nfts Attribute (r:1 w:1) - /// Proof: Nfts Attribute (max_values: None, max_size: Some(446), added: 2921, mode: MaxEncodedLen) - /// Storage: Nfts CollectionRoleOf (r:1 w:0) - /// Proof: Nfts CollectionRoleOf (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) - /// Storage: Nfts ItemConfigOf (r:1 w:0) - /// Proof: Nfts ItemConfigOf (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) - /// Storage: Nfts Collection (r:1 w:1) - /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) + /// Storage: `Nfts::Attribute` (r:1 w:1) + /// Proof: `Nfts::Attribute` (`max_values`: None, `max_size`: Some(479), added: 2954, mode: `MaxEncodedLen`) + /// Storage: `Nfts::CollectionRoleOf` (r:1 w:0) + /// Proof: `Nfts::CollectionRoleOf` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) + /// Storage: `Nfts::ItemConfigOf` (r:1 w:0) + /// Proof: `Nfts::ItemConfigOf` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) + /// Storage: `Nfts::Collection` (r:1 w:1) + /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) fn clear_attribute() -> Weight { // Proof Size summary in bytes: - // Measured: `950` - // Estimated: `3911` - // Minimum execution time: 46_951_000 picoseconds. - Weight::from_parts(48_481_000, 3911) + // Measured: `983` + // Estimated: `3944` + // Minimum execution time: 44_617_000 picoseconds. + Weight::from_parts(46_458_000, 3944) .saturating_add(T::DbWeight::get().reads(4_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } - /// Storage: Nfts Item (r:1 w:0) - /// Proof: Nfts Item (max_values: None, max_size: Some(861), added: 3336, mode: MaxEncodedLen) - /// Storage: Nfts ItemAttributesApprovalsOf (r:1 w:1) - /// Proof: Nfts ItemAttributesApprovalsOf (max_values: None, max_size: Some(681), added: 3156, mode: MaxEncodedLen) + /// Storage: `Nfts::Item` (r:1 w:0) + /// Proof: `Nfts::Item` (`max_values`: None, `max_size`: Some(861), added: 3336, mode: `MaxEncodedLen`) + /// Storage: `Nfts::ItemAttributesApprovalsOf` (r:1 w:1) + /// Proof: `Nfts::ItemAttributesApprovalsOf` (`max_values`: None, `max_size`: Some(681), added: 3156, mode: `MaxEncodedLen`) fn approve_item_attributes() -> Weight { // Proof Size summary in bytes: // Measured: `381` // Estimated: `4326` - // Minimum execution time: 17_222_000 picoseconds. - Weight::from_parts(17_819_000, 4326) + // Minimum execution time: 15_710_000 picoseconds. + Weight::from_parts(16_191_000, 4326) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: Nfts Item (r:1 w:0) - /// Proof: Nfts Item (max_values: None, max_size: Some(861), added: 3336, mode: MaxEncodedLen) - /// Storage: Nfts ItemAttributesApprovalsOf (r:1 w:1) - /// Proof: Nfts ItemAttributesApprovalsOf (max_values: None, max_size: Some(681), added: 3156, mode: MaxEncodedLen) - /// Storage: Nfts Attribute (r:1001 w:1000) - /// Proof: Nfts Attribute (max_values: None, max_size: Some(446), added: 2921, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: `Nfts::Item` (r:1 w:0) + /// Proof: `Nfts::Item` (`max_values`: None, `max_size`: Some(861), added: 3336, mode: `MaxEncodedLen`) + /// Storage: `Nfts::ItemAttributesApprovalsOf` (r:1 w:1) + /// Proof: `Nfts::ItemAttributesApprovalsOf` (`max_values`: None, `max_size`: Some(681), added: 3156, mode: `MaxEncodedLen`) + /// Storage: `Nfts::Attribute` (r:1001 w:1000) + /// Proof: `Nfts::Attribute` (`max_values`: None, `max_size`: Some(479), added: 2954, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) /// The range of component `n` is `[0, 1000]`. fn cancel_item_attributes_approval(n: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `837 + n * (364 ±0)` - // Estimated: `4326 + n * (2921 ±0)` - // Minimum execution time: 26_185_000 picoseconds. - Weight::from_parts(27_038_000, 4326) - // Standard Error: 2_378 - .saturating_add(Weight::from_parts(6_067_888, 0).saturating_mul(n.into())) + // Measured: `831 + n * (398 ±0)` + // Estimated: `4326 + n * (2954 ±0)` + // Minimum execution time: 24_447_000 picoseconds. + Weight::from_parts(25_144_000, 4326) + // Standard Error: 4_872 + .saturating_add(Weight::from_parts(6_523_101, 0).saturating_mul(n.into())) .saturating_add(T::DbWeight::get().reads(4_u64)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(n.into()))) .saturating_add(T::DbWeight::get().writes(2_u64)) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(n.into()))) - .saturating_add(Weight::from_parts(0, 2921).saturating_mul(n.into())) - } - /// Storage: Nfts CollectionRoleOf (r:1 w:0) - /// Proof: Nfts CollectionRoleOf (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) - /// Storage: Nfts Collection (r:1 w:1) - /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) - /// Storage: Nfts ItemConfigOf (r:1 w:0) - /// Proof: Nfts ItemConfigOf (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) - /// Storage: Nfts CollectionConfigOf (r:1 w:0) - /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - /// Storage: Nfts ItemMetadataOf (r:1 w:1) - /// Proof: Nfts ItemMetadataOf (max_values: None, max_size: Some(140), added: 2615, mode: MaxEncodedLen) + .saturating_add(Weight::from_parts(0, 2954).saturating_mul(n.into())) + } + /// Storage: `Nfts::CollectionRoleOf` (r:1 w:0) + /// Proof: `Nfts::CollectionRoleOf` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) + /// Storage: `Nfts::Collection` (r:1 w:1) + /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) + /// Storage: `Nfts::ItemConfigOf` (r:1 w:0) + /// Proof: `Nfts::ItemConfigOf` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) + /// Storage: `Nfts::CollectionConfigOf` (r:1 w:0) + /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) + /// Storage: `Nfts::ItemMetadataOf` (r:1 w:1) + /// Proof: `Nfts::ItemMetadataOf` (`max_values`: None, `max_size`: Some(347), added: 2822, mode: `MaxEncodedLen`) fn set_metadata() -> Weight { // Proof Size summary in bytes: // Measured: `539` - // Estimated: `3605` - // Minimum execution time: 42_120_000 picoseconds. - Weight::from_parts(43_627_000, 3605) + // Estimated: `3812` + // Minimum execution time: 39_990_000 picoseconds. + Weight::from_parts(41_098_000, 3812) .saturating_add(T::DbWeight::get().reads(5_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } - /// Storage: Nfts CollectionRoleOf (r:1 w:0) - /// Proof: Nfts CollectionRoleOf (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) - /// Storage: Nfts ItemMetadataOf (r:1 w:1) - /// Proof: Nfts ItemMetadataOf (max_values: None, max_size: Some(140), added: 2615, mode: MaxEncodedLen) - /// Storage: Nfts Collection (r:1 w:1) - /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) - /// Storage: Nfts ItemConfigOf (r:1 w:0) - /// Proof: Nfts ItemConfigOf (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) + /// Storage: `Nfts::CollectionRoleOf` (r:1 w:0) + /// Proof: `Nfts::CollectionRoleOf` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) + /// Storage: `Nfts::ItemMetadataOf` (r:1 w:1) + /// Proof: `Nfts::ItemMetadataOf` (`max_values`: None, `max_size`: Some(347), added: 2822, mode: `MaxEncodedLen`) + /// Storage: `Nfts::Collection` (r:1 w:1) + /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) + /// Storage: `Nfts::ItemConfigOf` (r:1 w:0) + /// Proof: `Nfts::ItemConfigOf` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) fn clear_metadata() -> Weight { // Proof Size summary in bytes: - // Measured: `642` - // Estimated: `3605` - // Minimum execution time: 40_732_000 picoseconds. - Weight::from_parts(42_760_000, 3605) + // Measured: `849` + // Estimated: `3812` + // Minimum execution time: 38_030_000 picoseconds. + Weight::from_parts(39_842_000, 3812) .saturating_add(T::DbWeight::get().reads(4_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } - /// Storage: Nfts CollectionRoleOf (r:1 w:0) - /// Proof: Nfts CollectionRoleOf (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) - /// Storage: Nfts CollectionConfigOf (r:1 w:0) - /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - /// Storage: Nfts Collection (r:1 w:1) - /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) - /// Storage: Nfts CollectionMetadataOf (r:1 w:1) - /// Proof: Nfts CollectionMetadataOf (max_values: None, max_size: Some(87), added: 2562, mode: MaxEncodedLen) + /// Storage: `Nfts::CollectionRoleOf` (r:1 w:0) + /// Proof: `Nfts::CollectionRoleOf` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) + /// Storage: `Nfts::CollectionConfigOf` (r:1 w:0) + /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) + /// Storage: `Nfts::Collection` (r:1 w:1) + /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) + /// Storage: `Nfts::CollectionMetadataOf` (r:1 w:1) + /// Proof: `Nfts::CollectionMetadataOf` (`max_values`: None, `max_size`: Some(294), added: 2769, mode: `MaxEncodedLen`) fn set_collection_metadata() -> Weight { // Proof Size summary in bytes: // Measured: `398` - // Estimated: `3552` - // Minimum execution time: 39_443_000 picoseconds. - Weight::from_parts(40_482_000, 3552) + // Estimated: `3759` + // Minimum execution time: 36_778_000 picoseconds. + Weight::from_parts(38_088_000, 3759) .saturating_add(T::DbWeight::get().reads(4_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } - /// Storage: Nfts CollectionRoleOf (r:1 w:0) - /// Proof: Nfts CollectionRoleOf (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) - /// Storage: Nfts Collection (r:1 w:0) - /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) - /// Storage: Nfts CollectionConfigOf (r:1 w:0) - /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - /// Storage: Nfts CollectionMetadataOf (r:1 w:1) - /// Proof: Nfts CollectionMetadataOf (max_values: None, max_size: Some(87), added: 2562, mode: MaxEncodedLen) + /// Storage: `Nfts::CollectionRoleOf` (r:1 w:0) + /// Proof: `Nfts::CollectionRoleOf` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) + /// Storage: `Nfts::Collection` (r:1 w:1) + /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) + /// Storage: `Nfts::CollectionConfigOf` (r:1 w:0) + /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) + /// Storage: `Nfts::CollectionMetadataOf` (r:1 w:1) + /// Proof: `Nfts::CollectionMetadataOf` (`max_values`: None, `max_size`: Some(294), added: 2769, mode: `MaxEncodedLen`) fn clear_collection_metadata() -> Weight { // Proof Size summary in bytes: - // Measured: `509` - // Estimated: `3552` - // Minimum execution time: 37_676_000 picoseconds. - Weight::from_parts(39_527_000, 3552) + // Measured: `716` + // Estimated: `3759` + // Minimum execution time: 36_887_000 picoseconds. + Weight::from_parts(38_406_000, 3759) .saturating_add(T::DbWeight::get().reads(4_u64)) - .saturating_add(T::DbWeight::get().writes(1_u64)) + .saturating_add(T::DbWeight::get().writes(2_u64)) } - /// Storage: Nfts Item (r:1 w:1) - /// Proof: Nfts Item (max_values: None, max_size: Some(861), added: 3336, mode: MaxEncodedLen) - /// Storage: Nfts CollectionConfigOf (r:1 w:0) - /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + /// Storage: `Nfts::Item` (r:1 w:1) + /// Proof: `Nfts::Item` (`max_values`: None, `max_size`: Some(861), added: 3336, mode: `MaxEncodedLen`) + /// Storage: `Nfts::CollectionConfigOf` (r:1 w:0) + /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) fn approve_transfer() -> Weight { // Proof Size summary in bytes: // Measured: `410` // Estimated: `4326` - // Minimum execution time: 20_787_000 picoseconds. - Weight::from_parts(21_315_000, 4326) + // Minimum execution time: 18_734_000 picoseconds. + Weight::from_parts(19_267_000, 4326) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: Nfts Item (r:1 w:1) - /// Proof: Nfts Item (max_values: None, max_size: Some(861), added: 3336, mode: MaxEncodedLen) + /// Storage: `Nfts::Item` (r:1 w:1) + /// Proof: `Nfts::Item` (`max_values`: None, `max_size`: Some(861), added: 3336, mode: `MaxEncodedLen`) fn cancel_approval() -> Weight { // Proof Size summary in bytes: // Measured: `418` // Estimated: `4326` - // Minimum execution time: 18_200_000 picoseconds. - Weight::from_parts(19_064_000, 4326) + // Minimum execution time: 16_080_000 picoseconds. + Weight::from_parts(16_603_000, 4326) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: Nfts Item (r:1 w:1) - /// Proof: Nfts Item (max_values: None, max_size: Some(861), added: 3336, mode: MaxEncodedLen) + /// Storage: `Nfts::Item` (r:1 w:1) + /// Proof: `Nfts::Item` (`max_values`: None, `max_size`: Some(861), added: 3336, mode: `MaxEncodedLen`) fn clear_all_transfer_approvals() -> Weight { // Proof Size summary in bytes: // Measured: `418` // Estimated: `4326` - // Minimum execution time: 17_128_000 picoseconds. - Weight::from_parts(17_952_000, 4326) + // Minimum execution time: 15_013_000 picoseconds. + Weight::from_parts(15_607_000, 4326) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: Nfts OwnershipAcceptance (r:1 w:1) - /// Proof: Nfts OwnershipAcceptance (max_values: None, max_size: Some(52), added: 2527, mode: MaxEncodedLen) + /// Storage: `Nfts::OwnershipAcceptance` (r:1 w:1) + /// Proof: `Nfts::OwnershipAcceptance` (`max_values`: None, `max_size`: Some(52), added: 2527, mode: `MaxEncodedLen`) fn set_accept_ownership() -> Weight { // Proof Size summary in bytes: // Measured: `76` // Estimated: `3517` - // Minimum execution time: 14_667_000 picoseconds. - Weight::from_parts(15_262_000, 3517) + // Minimum execution time: 13_077_000 picoseconds. + Weight::from_parts(13_635_000, 3517) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: Nfts CollectionConfigOf (r:1 w:1) - /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - /// Storage: Nfts Collection (r:1 w:0) - /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) + /// Storage: `Nfts::CollectionConfigOf` (r:1 w:1) + /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) + /// Storage: `Nfts::Collection` (r:1 w:0) + /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) fn set_collection_max_supply() -> Weight { // Proof Size summary in bytes: // Measured: `340` // Estimated: `3549` - // Minimum execution time: 18_435_000 picoseconds. - Weight::from_parts(18_775_000, 3549) + // Minimum execution time: 17_146_000 picoseconds. + Weight::from_parts(17_453_000, 3549) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: Nfts CollectionRoleOf (r:1 w:0) - /// Proof: Nfts CollectionRoleOf (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) - /// Storage: Nfts CollectionConfigOf (r:1 w:1) - /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + /// Storage: `Nfts::CollectionRoleOf` (r:1 w:0) + /// Proof: `Nfts::CollectionRoleOf` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) + /// Storage: `Nfts::CollectionConfigOf` (r:1 w:1) + /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) fn update_mint_settings() -> Weight { // Proof Size summary in bytes: // Measured: `323` // Estimated: `3538` - // Minimum execution time: 18_125_000 picoseconds. - Weight::from_parts(18_415_000, 3538) + // Minimum execution time: 16_102_000 picoseconds. + Weight::from_parts(16_629_000, 3538) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: Nfts Item (r:1 w:0) - /// Proof: Nfts Item (max_values: None, max_size: Some(861), added: 3336, mode: MaxEncodedLen) - /// Storage: Nfts CollectionConfigOf (r:1 w:0) - /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - /// Storage: Nfts ItemConfigOf (r:1 w:0) - /// Proof: Nfts ItemConfigOf (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) - /// Storage: Nfts ItemPriceOf (r:0 w:1) - /// Proof: Nfts ItemPriceOf (max_values: None, max_size: Some(89), added: 2564, mode: MaxEncodedLen) + /// Storage: `Nfts::Item` (r:1 w:0) + /// Proof: `Nfts::Item` (`max_values`: None, `max_size`: Some(861), added: 3336, mode: `MaxEncodedLen`) + /// Storage: `Nfts::CollectionConfigOf` (r:1 w:0) + /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) + /// Storage: `Nfts::ItemConfigOf` (r:1 w:0) + /// Proof: `Nfts::ItemConfigOf` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) + /// Storage: `Nfts::ItemPriceOf` (r:0 w:1) + /// Proof: `Nfts::ItemPriceOf` (`max_values`: None, `max_size`: Some(89), added: 2564, mode: `MaxEncodedLen`) fn set_price() -> Weight { // Proof Size summary in bytes: // Measured: `518` // Estimated: `4326` - // Minimum execution time: 23_237_000 picoseconds. - Weight::from_parts(24_128_000, 4326) + // Minimum execution time: 22_118_000 picoseconds. + Weight::from_parts(22_849_000, 4326) .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: Nfts Item (r:1 w:1) - /// Proof: Nfts Item (max_values: None, max_size: Some(861), added: 3336, mode: MaxEncodedLen) - /// Storage: Nfts ItemPriceOf (r:1 w:1) - /// Proof: Nfts ItemPriceOf (max_values: None, max_size: Some(89), added: 2564, mode: MaxEncodedLen) - /// Storage: Nfts Collection (r:1 w:0) - /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) - /// Storage: Nfts Attribute (r:1 w:0) - /// Proof: Nfts Attribute (max_values: None, max_size: Some(446), added: 2921, mode: MaxEncodedLen) - /// Storage: Nfts CollectionConfigOf (r:1 w:0) - /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - /// Storage: Nfts ItemConfigOf (r:1 w:0) - /// Proof: Nfts ItemConfigOf (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) - /// Storage: Nfts Account (r:0 w:2) - /// Proof: Nfts Account (max_values: None, max_size: Some(88), added: 2563, mode: MaxEncodedLen) - /// Storage: Nfts PendingSwapOf (r:0 w:1) - /// Proof: Nfts PendingSwapOf (max_values: None, max_size: Some(71), added: 2546, mode: MaxEncodedLen) + /// Storage: `Nfts::Item` (r:1 w:1) + /// Proof: `Nfts::Item` (`max_values`: None, `max_size`: Some(861), added: 3336, mode: `MaxEncodedLen`) + /// Storage: `Nfts::ItemPriceOf` (r:1 w:1) + /// Proof: `Nfts::ItemPriceOf` (`max_values`: None, `max_size`: Some(89), added: 2564, mode: `MaxEncodedLen`) + /// Storage: `Nfts::Collection` (r:1 w:0) + /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) + /// Storage: `Nfts::Attribute` (r:1 w:0) + /// Proof: `Nfts::Attribute` (`max_values`: None, `max_size`: Some(479), added: 2954, mode: `MaxEncodedLen`) + /// Storage: `Nfts::CollectionConfigOf` (r:1 w:0) + /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) + /// Storage: `Nfts::ItemConfigOf` (r:1 w:0) + /// Proof: `Nfts::ItemConfigOf` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) + /// Storage: `Nfts::Account` (r:0 w:2) + /// Proof: `Nfts::Account` (`max_values`: None, `max_size`: Some(88), added: 2563, mode: `MaxEncodedLen`) + /// Storage: `Nfts::PendingSwapOf` (r:0 w:1) + /// Proof: `Nfts::PendingSwapOf` (`max_values`: None, `max_size`: Some(71), added: 2546, mode: `MaxEncodedLen`) fn buy_item() -> Weight { // Proof Size summary in bytes: // Measured: `705` // Estimated: `4326` - // Minimum execution time: 53_291_000 picoseconds. - Weight::from_parts(54_614_000, 4326) + // Minimum execution time: 50_369_000 picoseconds. + Weight::from_parts(51_816_000, 4326) .saturating_add(T::DbWeight::get().reads(6_u64)) .saturating_add(T::DbWeight::get().writes(5_u64)) } @@ -658,681 +662,685 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_192_000 picoseconds. - Weight::from_parts(4_039_901, 0) - // Standard Error: 10_309 - .saturating_add(Weight::from_parts(3_934_017, 0).saturating_mul(n.into())) - } - /// Storage: Nfts Item (r:2 w:0) - /// Proof: Nfts Item (max_values: None, max_size: Some(861), added: 3336, mode: MaxEncodedLen) - /// Storage: Nfts PendingSwapOf (r:0 w:1) - /// Proof: Nfts PendingSwapOf (max_values: None, max_size: Some(71), added: 2546, mode: MaxEncodedLen) + // Minimum execution time: 2_203_000 picoseconds. + Weight::from_parts(3_710_869, 0) + // Standard Error: 8_094 + .saturating_add(Weight::from_parts(2_201_869, 0).saturating_mul(n.into())) + } + /// Storage: `Nfts::Item` (r:2 w:0) + /// Proof: `Nfts::Item` (`max_values`: None, `max_size`: Some(861), added: 3336, mode: `MaxEncodedLen`) + /// Storage: `Nfts::PendingSwapOf` (r:0 w:1) + /// Proof: `Nfts::PendingSwapOf` (`max_values`: None, `max_size`: Some(71), added: 2546, mode: `MaxEncodedLen`) fn create_swap() -> Weight { // Proof Size summary in bytes: // Measured: `494` // Estimated: `7662` - // Minimum execution time: 21_011_000 picoseconds. - Weight::from_parts(22_065_000, 7662) + // Minimum execution time: 18_893_000 picoseconds. + Weight::from_parts(19_506_000, 7662) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: Nfts PendingSwapOf (r:1 w:1) - /// Proof: Nfts PendingSwapOf (max_values: None, max_size: Some(71), added: 2546, mode: MaxEncodedLen) - /// Storage: Nfts Item (r:1 w:0) - /// Proof: Nfts Item (max_values: None, max_size: Some(861), added: 3336, mode: MaxEncodedLen) + /// Storage: `Nfts::PendingSwapOf` (r:1 w:1) + /// Proof: `Nfts::PendingSwapOf` (`max_values`: None, `max_size`: Some(71), added: 2546, mode: `MaxEncodedLen`) + /// Storage: `Nfts::Item` (r:1 w:0) + /// Proof: `Nfts::Item` (`max_values`: None, `max_size`: Some(861), added: 3336, mode: `MaxEncodedLen`) fn cancel_swap() -> Weight { // Proof Size summary in bytes: // Measured: `513` // Estimated: `4326` - // Minimum execution time: 21_423_000 picoseconds. - Weight::from_parts(21_743_000, 4326) + // Minimum execution time: 19_086_000 picoseconds. + Weight::from_parts(19_609_000, 4326) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: Nfts Item (r:2 w:2) - /// Proof: Nfts Item (max_values: None, max_size: Some(861), added: 3336, mode: MaxEncodedLen) - /// Storage: Nfts PendingSwapOf (r:1 w:2) - /// Proof: Nfts PendingSwapOf (max_values: None, max_size: Some(71), added: 2546, mode: MaxEncodedLen) - /// Storage: Nfts Collection (r:1 w:0) - /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) - /// Storage: Nfts Attribute (r:2 w:0) - /// Proof: Nfts Attribute (max_values: None, max_size: Some(446), added: 2921, mode: MaxEncodedLen) - /// Storage: Nfts CollectionConfigOf (r:1 w:0) - /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - /// Storage: Nfts ItemConfigOf (r:2 w:0) - /// Proof: Nfts ItemConfigOf (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) - /// Storage: Nfts Account (r:0 w:4) - /// Proof: Nfts Account (max_values: None, max_size: Some(88), added: 2563, mode: MaxEncodedLen) - /// Storage: Nfts ItemPriceOf (r:0 w:2) - /// Proof: Nfts ItemPriceOf (max_values: None, max_size: Some(89), added: 2564, mode: MaxEncodedLen) + /// Storage: `Nfts::Item` (r:2 w:2) + /// Proof: `Nfts::Item` (`max_values`: None, `max_size`: Some(861), added: 3336, mode: `MaxEncodedLen`) + /// Storage: `Nfts::PendingSwapOf` (r:1 w:2) + /// Proof: `Nfts::PendingSwapOf` (`max_values`: None, `max_size`: Some(71), added: 2546, mode: `MaxEncodedLen`) + /// Storage: `Nfts::Collection` (r:1 w:0) + /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) + /// Storage: `Nfts::Attribute` (r:2 w:0) + /// Proof: `Nfts::Attribute` (`max_values`: None, `max_size`: Some(479), added: 2954, mode: `MaxEncodedLen`) + /// Storage: `Nfts::CollectionConfigOf` (r:1 w:0) + /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) + /// Storage: `Nfts::ItemConfigOf` (r:2 w:0) + /// Proof: `Nfts::ItemConfigOf` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) + /// Storage: `Nfts::Account` (r:0 w:4) + /// Proof: `Nfts::Account` (`max_values`: None, `max_size`: Some(88), added: 2563, mode: `MaxEncodedLen`) + /// Storage: `Nfts::ItemPriceOf` (r:0 w:2) + /// Proof: `Nfts::ItemPriceOf` (`max_values`: None, `max_size`: Some(89), added: 2564, mode: `MaxEncodedLen`) fn claim_swap() -> Weight { // Proof Size summary in bytes: // Measured: `834` // Estimated: `7662` - // Minimum execution time: 86_059_000 picoseconds. - Weight::from_parts(88_401_000, 7662) + // Minimum execution time: 84_103_000 picoseconds. + Weight::from_parts(85_325_000, 7662) .saturating_add(T::DbWeight::get().reads(9_u64)) .saturating_add(T::DbWeight::get().writes(10_u64)) } - /// Storage: Nfts CollectionRoleOf (r:2 w:0) - /// Proof: Nfts CollectionRoleOf (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) - /// Storage: Nfts CollectionConfigOf (r:1 w:0) - /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - /// Storage: Nfts Item (r:1 w:1) - /// Proof: Nfts Item (max_values: None, max_size: Some(861), added: 3336, mode: MaxEncodedLen) - /// Storage: Nfts Collection (r:1 w:1) - /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) - /// Storage: Nfts ItemConfigOf (r:1 w:1) - /// Proof: Nfts ItemConfigOf (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) - /// Storage: Nfts Attribute (r:10 w:10) - /// Proof: Nfts Attribute (max_values: None, max_size: Some(446), added: 2921, mode: MaxEncodedLen) - /// Storage: Nfts ItemMetadataOf (r:1 w:1) - /// Proof: Nfts ItemMetadataOf (max_values: None, max_size: Some(140), added: 2615, mode: MaxEncodedLen) - /// Storage: Nfts Account (r:0 w:1) - /// Proof: Nfts Account (max_values: None, max_size: Some(88), added: 2563, mode: MaxEncodedLen) + /// Storage: `Nfts::CollectionRoleOf` (r:2 w:0) + /// Proof: `Nfts::CollectionRoleOf` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) + /// Storage: `Nfts::CollectionConfigOf` (r:1 w:0) + /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) + /// Storage: `Nfts::Item` (r:1 w:1) + /// Proof: `Nfts::Item` (`max_values`: None, `max_size`: Some(861), added: 3336, mode: `MaxEncodedLen`) + /// Storage: `Nfts::Collection` (r:1 w:1) + /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) + /// Storage: `Nfts::ItemConfigOf` (r:1 w:1) + /// Proof: `Nfts::ItemConfigOf` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `Nfts::Attribute` (r:10 w:10) + /// Proof: `Nfts::Attribute` (`max_values`: None, `max_size`: Some(479), added: 2954, mode: `MaxEncodedLen`) + /// Storage: `Nfts::ItemMetadataOf` (r:1 w:1) + /// Proof: `Nfts::ItemMetadataOf` (`max_values`: None, `max_size`: Some(347), added: 2822, mode: `MaxEncodedLen`) + /// Storage: `Nfts::Account` (r:0 w:1) + /// Proof: `Nfts::Account` (`max_values`: None, `max_size`: Some(88), added: 2563, mode: `MaxEncodedLen`) /// The range of component `n` is `[0, 10]`. fn mint_pre_signed(n: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `629` - // Estimated: `6078 + n * (2921 ±0)` - // Minimum execution time: 146_746_000 picoseconds. - Weight::from_parts(152_885_862, 6078) - // Standard Error: 40_442 - .saturating_add(Weight::from_parts(32_887_800, 0).saturating_mul(n.into())) + // Estimated: `6078 + n * (2954 ±0)` + // Minimum execution time: 128_363_000 picoseconds. + Weight::from_parts(139_474_918, 6078) + // Standard Error: 79_252 + .saturating_add(Weight::from_parts(31_384_027, 0).saturating_mul(n.into())) .saturating_add(T::DbWeight::get().reads(8_u64)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(n.into()))) .saturating_add(T::DbWeight::get().writes(6_u64)) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(n.into()))) - .saturating_add(Weight::from_parts(0, 2921).saturating_mul(n.into())) - } - /// Storage: Nfts Item (r:1 w:0) - /// Proof: Nfts Item (max_values: None, max_size: Some(861), added: 3336, mode: MaxEncodedLen) - /// Storage: Nfts ItemAttributesApprovalsOf (r:1 w:1) - /// Proof: Nfts ItemAttributesApprovalsOf (max_values: None, max_size: Some(681), added: 3156, mode: MaxEncodedLen) - /// Storage: Nfts CollectionConfigOf (r:1 w:0) - /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - /// Storage: Nfts Collection (r:1 w:1) - /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) - /// Storage: Nfts Attribute (r:10 w:10) - /// Proof: Nfts Attribute (max_values: None, max_size: Some(446), added: 2921, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + .saturating_add(Weight::from_parts(0, 2954).saturating_mul(n.into())) + } + /// Storage: `Nfts::Item` (r:1 w:0) + /// Proof: `Nfts::Item` (`max_values`: None, `max_size`: Some(861), added: 3336, mode: `MaxEncodedLen`) + /// Storage: `Nfts::ItemAttributesApprovalsOf` (r:1 w:1) + /// Proof: `Nfts::ItemAttributesApprovalsOf` (`max_values`: None, `max_size`: Some(681), added: 3156, mode: `MaxEncodedLen`) + /// Storage: `Nfts::CollectionConfigOf` (r:1 w:0) + /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) + /// Storage: `Nfts::Collection` (r:1 w:1) + /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) + /// Storage: `Nfts::Attribute` (r:10 w:10) + /// Proof: `Nfts::Attribute` (`max_values`: None, `max_size`: Some(479), added: 2954, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) /// The range of component `n` is `[0, 10]`. fn set_attributes_pre_signed(n: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `659` - // Estimated: `4326 + n * (2921 ±0)` - // Minimum execution time: 83_960_000 picoseconds. - Weight::from_parts(98_609_885, 4326) - // Standard Error: 85_991 - .saturating_add(Weight::from_parts(32_633_495, 0).saturating_mul(n.into())) + // Estimated: `4326 + n * (2954 ±0)` + // Minimum execution time: 66_688_000 picoseconds. + Weight::from_parts(79_208_379, 4326) + // Standard Error: 74_020 + .saturating_add(Weight::from_parts(31_028_221, 0).saturating_mul(n.into())) .saturating_add(T::DbWeight::get().reads(4_u64)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(n.into()))) .saturating_add(T::DbWeight::get().writes(2_u64)) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(n.into()))) - .saturating_add(Weight::from_parts(0, 2921).saturating_mul(n.into())) + .saturating_add(Weight::from_parts(0, 2954).saturating_mul(n.into())) } } -// For backwards compatibility and tests +// For backwards compatibility and tests. impl WeightInfo for () { - /// Storage: Nfts NextCollectionId (r:1 w:1) - /// Proof: Nfts NextCollectionId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: Nfts Collection (r:1 w:1) - /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) - /// Storage: Nfts CollectionRoleOf (r:0 w:1) - /// Proof: Nfts CollectionRoleOf (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) - /// Storage: Nfts CollectionConfigOf (r:0 w:1) - /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - /// Storage: Nfts CollectionAccount (r:0 w:1) - /// Proof: Nfts CollectionAccount (max_values: None, max_size: Some(68), added: 2543, mode: MaxEncodedLen) + /// Storage: `Nfts::NextCollectionId` (r:1 w:1) + /// Proof: `Nfts::NextCollectionId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `Nfts::Collection` (r:1 w:1) + /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) + /// Storage: `Nfts::CollectionRoleOf` (r:0 w:1) + /// Proof: `Nfts::CollectionRoleOf` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) + /// Storage: `Nfts::CollectionConfigOf` (r:0 w:1) + /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) + /// Storage: `Nfts::CollectionAccount` (r:0 w:1) + /// Proof: `Nfts::CollectionAccount` (`max_values`: None, `max_size`: Some(68), added: 2543, mode: `MaxEncodedLen`) fn create() -> Weight { // Proof Size summary in bytes: // Measured: `216` // Estimated: `3549` - // Minimum execution time: 40_489_000 picoseconds. - Weight::from_parts(41_320_000, 3549) + // Minimum execution time: 34_863_000 picoseconds. + Weight::from_parts(36_679_000, 3549) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(5_u64)) } - /// Storage: Nfts NextCollectionId (r:1 w:1) - /// Proof: Nfts NextCollectionId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: Nfts Collection (r:1 w:1) - /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) - /// Storage: Nfts CollectionRoleOf (r:0 w:1) - /// Proof: Nfts CollectionRoleOf (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) - /// Storage: Nfts CollectionConfigOf (r:0 w:1) - /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - /// Storage: Nfts CollectionAccount (r:0 w:1) - /// Proof: Nfts CollectionAccount (max_values: None, max_size: Some(68), added: 2543, mode: MaxEncodedLen) + /// Storage: `Nfts::NextCollectionId` (r:1 w:1) + /// Proof: `Nfts::NextCollectionId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `Nfts::Collection` (r:1 w:1) + /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) + /// Storage: `Nfts::CollectionRoleOf` (r:0 w:1) + /// Proof: `Nfts::CollectionRoleOf` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) + /// Storage: `Nfts::CollectionConfigOf` (r:0 w:1) + /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) + /// Storage: `Nfts::CollectionAccount` (r:0 w:1) + /// Proof: `Nfts::CollectionAccount` (`max_values`: None, `max_size`: Some(68), added: 2543, mode: `MaxEncodedLen`) fn force_create() -> Weight { // Proof Size summary in bytes: // Measured: `76` // Estimated: `3549` - // Minimum execution time: 23_257_000 picoseconds. - Weight::from_parts(23_770_000, 3549) + // Minimum execution time: 19_631_000 picoseconds. + Weight::from_parts(20_384_000, 3549) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(5_u64)) } - /// Storage: Nfts Collection (r:1 w:1) - /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) - /// Storage: Nfts ItemMetadataOf (r:1 w:0) - /// Proof: Nfts ItemMetadataOf (max_values: None, max_size: Some(140), added: 2615, mode: MaxEncodedLen) - /// Storage: Nfts CollectionRoleOf (r:1 w:1) - /// Proof: Nfts CollectionRoleOf (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) - /// Storage: Nfts Attribute (r:1001 w:1000) - /// Proof: Nfts Attribute (max_values: None, max_size: Some(446), added: 2921, mode: MaxEncodedLen) - /// Storage: Nfts ItemConfigOf (r:1000 w:1000) - /// Proof: Nfts ItemConfigOf (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) - /// Storage: Nfts CollectionMetadataOf (r:0 w:1) - /// Proof: Nfts CollectionMetadataOf (max_values: None, max_size: Some(87), added: 2562, mode: MaxEncodedLen) - /// Storage: Nfts CollectionConfigOf (r:0 w:1) - /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - /// Storage: Nfts CollectionAccount (r:0 w:1) - /// Proof: Nfts CollectionAccount (max_values: None, max_size: Some(68), added: 2543, mode: MaxEncodedLen) + /// Storage: `Nfts::Collection` (r:1 w:1) + /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) + /// Storage: `Nfts::ItemMetadataOf` (r:1 w:0) + /// Proof: `Nfts::ItemMetadataOf` (`max_values`: None, `max_size`: Some(347), added: 2822, mode: `MaxEncodedLen`) + /// Storage: `Nfts::CollectionRoleOf` (r:1 w:1) + /// Proof: `Nfts::CollectionRoleOf` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) + /// Storage: `Nfts::Attribute` (r:1001 w:1000) + /// Proof: `Nfts::Attribute` (`max_values`: None, `max_size`: Some(479), added: 2954, mode: `MaxEncodedLen`) + /// Storage: `Nfts::ItemConfigOf` (r:1000 w:1000) + /// Proof: `Nfts::ItemConfigOf` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) + /// Storage: `Nfts::CollectionMetadataOf` (r:0 w:1) + /// Proof: `Nfts::CollectionMetadataOf` (`max_values`: None, `max_size`: Some(294), added: 2769, mode: `MaxEncodedLen`) + /// Storage: `Nfts::CollectionConfigOf` (r:0 w:1) + /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) + /// Storage: `Nfts::CollectionAccount` (r:0 w:1) + /// Proof: `Nfts::CollectionAccount` (`max_values`: None, `max_size`: Some(68), added: 2543, mode: `MaxEncodedLen`) /// The range of component `m` is `[0, 1000]`. /// The range of component `c` is `[0, 1000]`. /// The range of component `a` is `[0, 1000]`. fn destroy(_m: u32, _c: u32, a: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `32220 + a * (332 ±0)` - // Estimated: `2523990 + a * (2921 ±0)` - // Minimum execution time: 1_310_198_000 picoseconds. - Weight::from_parts(1_479_261_043, 2523990) - // Standard Error: 4_415 - .saturating_add(Weight::from_parts(6_016_212, 0).saturating_mul(a.into())) + // Measured: `32204 + a * (366 ±0)` + // Estimated: `2523990 + a * (2954 ±0)` + // Minimum execution time: 1_282_083_000 picoseconds. + Weight::from_parts(1_249_191_963, 2523990) + // Standard Error: 4_719 + .saturating_add(Weight::from_parts(6_470_227, 0).saturating_mul(a.into())) .saturating_add(RocksDbWeight::get().reads(1004_u64)) .saturating_add(RocksDbWeight::get().reads((1_u64).saturating_mul(a.into()))) .saturating_add(RocksDbWeight::get().writes(1005_u64)) .saturating_add(RocksDbWeight::get().writes((1_u64).saturating_mul(a.into()))) - .saturating_add(Weight::from_parts(0, 2921).saturating_mul(a.into())) - } - /// Storage: Nfts CollectionConfigOf (r:1 w:0) - /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - /// Storage: Nfts Item (r:1 w:1) - /// Proof: Nfts Item (max_values: None, max_size: Some(861), added: 3336, mode: MaxEncodedLen) - /// Storage: Nfts Collection (r:1 w:1) - /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) - /// Storage: Nfts CollectionRoleOf (r:1 w:0) - /// Proof: Nfts CollectionRoleOf (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) - /// Storage: Nfts ItemConfigOf (r:1 w:1) - /// Proof: Nfts ItemConfigOf (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) - /// Storage: Nfts Account (r:0 w:1) - /// Proof: Nfts Account (max_values: None, max_size: Some(88), added: 2563, mode: MaxEncodedLen) + .saturating_add(Weight::from_parts(0, 2954).saturating_mul(a.into())) + } + /// Storage: `Nfts::CollectionConfigOf` (r:1 w:0) + /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) + /// Storage: `Nfts::Item` (r:1 w:1) + /// Proof: `Nfts::Item` (`max_values`: None, `max_size`: Some(861), added: 3336, mode: `MaxEncodedLen`) + /// Storage: `Nfts::Collection` (r:1 w:1) + /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) + /// Storage: `Nfts::CollectionRoleOf` (r:1 w:0) + /// Proof: `Nfts::CollectionRoleOf` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) + /// Storage: `Nfts::ItemConfigOf` (r:1 w:1) + /// Proof: `Nfts::ItemConfigOf` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) + /// Storage: `Nfts::Account` (r:0 w:1) + /// Proof: `Nfts::Account` (`max_values`: None, `max_size`: Some(88), added: 2563, mode: `MaxEncodedLen`) fn mint() -> Weight { // Proof Size summary in bytes: // Measured: `455` // Estimated: `4326` - // Minimum execution time: 51_910_000 picoseconds. - Weight::from_parts(53_441_000, 4326) + // Minimum execution time: 49_055_000 picoseconds. + Weight::from_parts(50_592_000, 4326) .saturating_add(RocksDbWeight::get().reads(5_u64)) .saturating_add(RocksDbWeight::get().writes(4_u64)) } - /// Storage: Nfts CollectionRoleOf (r:1 w:0) - /// Proof: Nfts CollectionRoleOf (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) - /// Storage: Nfts Item (r:1 w:1) - /// Proof: Nfts Item (max_values: None, max_size: Some(861), added: 3336, mode: MaxEncodedLen) - /// Storage: Nfts Collection (r:1 w:1) - /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) - /// Storage: Nfts CollectionConfigOf (r:1 w:0) - /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - /// Storage: Nfts ItemConfigOf (r:1 w:1) - /// Proof: Nfts ItemConfigOf (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) - /// Storage: Nfts Account (r:0 w:1) - /// Proof: Nfts Account (max_values: None, max_size: Some(88), added: 2563, mode: MaxEncodedLen) + /// Storage: `Nfts::CollectionRoleOf` (r:1 w:0) + /// Proof: `Nfts::CollectionRoleOf` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) + /// Storage: `Nfts::Item` (r:1 w:1) + /// Proof: `Nfts::Item` (`max_values`: None, `max_size`: Some(861), added: 3336, mode: `MaxEncodedLen`) + /// Storage: `Nfts::Collection` (r:1 w:1) + /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) + /// Storage: `Nfts::CollectionConfigOf` (r:1 w:0) + /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) + /// Storage: `Nfts::ItemConfigOf` (r:1 w:1) + /// Proof: `Nfts::ItemConfigOf` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) + /// Storage: `Nfts::Account` (r:0 w:1) + /// Proof: `Nfts::Account` (`max_values`: None, `max_size`: Some(88), added: 2563, mode: `MaxEncodedLen`) fn force_mint() -> Weight { // Proof Size summary in bytes: // Measured: `455` // Estimated: `4326` - // Minimum execution time: 50_168_000 picoseconds. - Weight::from_parts(51_380_000, 4326) + // Minimum execution time: 47_102_000 picoseconds. + Weight::from_parts(48_772_000, 4326) .saturating_add(RocksDbWeight::get().reads(5_u64)) .saturating_add(RocksDbWeight::get().writes(4_u64)) } - /// Storage: Nfts ItemConfigOf (r:1 w:1) - /// Proof: Nfts ItemConfigOf (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) - /// Storage: Nfts Collection (r:1 w:1) - /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) - /// Storage: Nfts Item (r:1 w:1) - /// Proof: Nfts Item (max_values: None, max_size: Some(861), added: 3336, mode: MaxEncodedLen) - /// Storage: Nfts ItemMetadataOf (r:1 w:0) - /// Proof: Nfts ItemMetadataOf (max_values: None, max_size: Some(140), added: 2615, mode: MaxEncodedLen) - /// Storage: Nfts Account (r:0 w:1) - /// Proof: Nfts Account (max_values: None, max_size: Some(88), added: 2563, mode: MaxEncodedLen) - /// Storage: Nfts ItemPriceOf (r:0 w:1) - /// Proof: Nfts ItemPriceOf (max_values: None, max_size: Some(89), added: 2564, mode: MaxEncodedLen) - /// Storage: Nfts ItemAttributesApprovalsOf (r:0 w:1) - /// Proof: Nfts ItemAttributesApprovalsOf (max_values: None, max_size: Some(681), added: 3156, mode: MaxEncodedLen) - /// Storage: Nfts PendingSwapOf (r:0 w:1) - /// Proof: Nfts PendingSwapOf (max_values: None, max_size: Some(71), added: 2546, mode: MaxEncodedLen) + /// Storage: `Nfts::Attribute` (r:1 w:0) + /// Proof: `Nfts::Attribute` (`max_values`: None, `max_size`: Some(479), added: 2954, mode: `MaxEncodedLen`) + /// Storage: `Nfts::ItemConfigOf` (r:1 w:1) + /// Proof: `Nfts::ItemConfigOf` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) + /// Storage: `Nfts::Collection` (r:1 w:1) + /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) + /// Storage: `Nfts::Item` (r:1 w:1) + /// Proof: `Nfts::Item` (`max_values`: None, `max_size`: Some(861), added: 3336, mode: `MaxEncodedLen`) + /// Storage: `Nfts::ItemMetadataOf` (r:1 w:0) + /// Proof: `Nfts::ItemMetadataOf` (`max_values`: None, `max_size`: Some(347), added: 2822, mode: `MaxEncodedLen`) + /// Storage: `Nfts::Account` (r:0 w:1) + /// Proof: `Nfts::Account` (`max_values`: None, `max_size`: Some(88), added: 2563, mode: `MaxEncodedLen`) + /// Storage: `Nfts::ItemPriceOf` (r:0 w:1) + /// Proof: `Nfts::ItemPriceOf` (`max_values`: None, `max_size`: Some(89), added: 2564, mode: `MaxEncodedLen`) + /// Storage: `Nfts::ItemAttributesApprovalsOf` (r:0 w:1) + /// Proof: `Nfts::ItemAttributesApprovalsOf` (`max_values`: None, `max_size`: Some(681), added: 3156, mode: `MaxEncodedLen`) + /// Storage: `Nfts::PendingSwapOf` (r:0 w:1) + /// Proof: `Nfts::PendingSwapOf` (`max_values`: None, `max_size`: Some(71), added: 2546, mode: `MaxEncodedLen`) fn burn() -> Weight { // Proof Size summary in bytes: // Measured: `564` // Estimated: `4326` - // Minimum execution time: 50_738_000 picoseconds. - Weight::from_parts(51_850_000, 4326) - .saturating_add(RocksDbWeight::get().reads(4_u64)) + // Minimum execution time: 52_968_000 picoseconds. + Weight::from_parts(55_136_000, 4326) + .saturating_add(RocksDbWeight::get().reads(5_u64)) .saturating_add(RocksDbWeight::get().writes(7_u64)) } - /// Storage: Nfts Collection (r:1 w:0) - /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) - /// Storage: Nfts Attribute (r:1 w:0) - /// Proof: Nfts Attribute (max_values: None, max_size: Some(446), added: 2921, mode: MaxEncodedLen) - /// Storage: Nfts CollectionConfigOf (r:1 w:0) - /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - /// Storage: Nfts ItemConfigOf (r:1 w:0) - /// Proof: Nfts ItemConfigOf (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) - /// Storage: Nfts Item (r:1 w:1) - /// Proof: Nfts Item (max_values: None, max_size: Some(861), added: 3336, mode: MaxEncodedLen) - /// Storage: Nfts Account (r:0 w:2) - /// Proof: Nfts Account (max_values: None, max_size: Some(88), added: 2563, mode: MaxEncodedLen) - /// Storage: Nfts ItemPriceOf (r:0 w:1) - /// Proof: Nfts ItemPriceOf (max_values: None, max_size: Some(89), added: 2564, mode: MaxEncodedLen) - /// Storage: Nfts PendingSwapOf (r:0 w:1) - /// Proof: Nfts PendingSwapOf (max_values: None, max_size: Some(71), added: 2546, mode: MaxEncodedLen) + /// Storage: `Nfts::Collection` (r:1 w:0) + /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) + /// Storage: `Nfts::Attribute` (r:1 w:0) + /// Proof: `Nfts::Attribute` (`max_values`: None, `max_size`: Some(479), added: 2954, mode: `MaxEncodedLen`) + /// Storage: `Nfts::CollectionConfigOf` (r:1 w:0) + /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) + /// Storage: `Nfts::ItemConfigOf` (r:1 w:0) + /// Proof: `Nfts::ItemConfigOf` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) + /// Storage: `Nfts::Item` (r:1 w:1) + /// Proof: `Nfts::Item` (`max_values`: None, `max_size`: Some(861), added: 3336, mode: `MaxEncodedLen`) + /// Storage: `Nfts::Account` (r:0 w:2) + /// Proof: `Nfts::Account` (`max_values`: None, `max_size`: Some(88), added: 2563, mode: `MaxEncodedLen`) + /// Storage: `Nfts::ItemPriceOf` (r:0 w:1) + /// Proof: `Nfts::ItemPriceOf` (`max_values`: None, `max_size`: Some(89), added: 2564, mode: `MaxEncodedLen`) + /// Storage: `Nfts::PendingSwapOf` (r:0 w:1) + /// Proof: `Nfts::PendingSwapOf` (`max_values`: None, `max_size`: Some(71), added: 2546, mode: `MaxEncodedLen`) fn transfer() -> Weight { // Proof Size summary in bytes: // Measured: `593` // Estimated: `4326` - // Minimum execution time: 41_055_000 picoseconds. - Weight::from_parts(42_336_000, 4326) + // Minimum execution time: 41_140_000 picoseconds. + Weight::from_parts(43_288_000, 4326) .saturating_add(RocksDbWeight::get().reads(5_u64)) .saturating_add(RocksDbWeight::get().writes(5_u64)) } - /// Storage: Nfts Collection (r:1 w:0) - /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) - /// Storage: Nfts CollectionConfigOf (r:1 w:0) - /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - /// Storage: Nfts Item (r:5000 w:5000) - /// Proof: Nfts Item (max_values: None, max_size: Some(861), added: 3336, mode: MaxEncodedLen) + /// Storage: `Nfts::Collection` (r:1 w:0) + /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) + /// Storage: `Nfts::CollectionConfigOf` (r:1 w:0) + /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) + /// Storage: `Nfts::Item` (r:5000 w:5000) + /// Proof: `Nfts::Item` (`max_values`: None, `max_size`: Some(861), added: 3336, mode: `MaxEncodedLen`) /// The range of component `i` is `[0, 5000]`. fn redeposit(i: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `763 + i * (108 ±0)` // Estimated: `3549 + i * (3336 ±0)` - // Minimum execution time: 15_688_000 picoseconds. - Weight::from_parts(15_921_000, 3549) - // Standard Error: 14_827 - .saturating_add(Weight::from_parts(17_105_395, 0).saturating_mul(i.into())) + // Minimum execution time: 14_433_000 picoseconds. + Weight::from_parts(14_664_000, 3549) + // Standard Error: 23_078 + .saturating_add(Weight::from_parts(15_911_377, 0).saturating_mul(i.into())) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().reads((1_u64).saturating_mul(i.into()))) .saturating_add(RocksDbWeight::get().writes((1_u64).saturating_mul(i.into()))) .saturating_add(Weight::from_parts(0, 3336).saturating_mul(i.into())) } - /// Storage: Nfts CollectionRoleOf (r:1 w:0) - /// Proof: Nfts CollectionRoleOf (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) - /// Storage: Nfts ItemConfigOf (r:1 w:1) - /// Proof: Nfts ItemConfigOf (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) + /// Storage: `Nfts::CollectionRoleOf` (r:1 w:0) + /// Proof: `Nfts::CollectionRoleOf` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) + /// Storage: `Nfts::ItemConfigOf` (r:1 w:1) + /// Proof: `Nfts::ItemConfigOf` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) fn lock_item_transfer() -> Weight { // Proof Size summary in bytes: // Measured: `435` // Estimated: `3534` - // Minimum execution time: 19_981_000 picoseconds. - Weight::from_parts(20_676_000, 3534) + // Minimum execution time: 18_307_000 picoseconds. + Weight::from_parts(18_966_000, 3534) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Nfts CollectionRoleOf (r:1 w:0) - /// Proof: Nfts CollectionRoleOf (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) - /// Storage: Nfts ItemConfigOf (r:1 w:1) - /// Proof: Nfts ItemConfigOf (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) + /// Storage: `Nfts::CollectionRoleOf` (r:1 w:0) + /// Proof: `Nfts::CollectionRoleOf` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) + /// Storage: `Nfts::ItemConfigOf` (r:1 w:1) + /// Proof: `Nfts::ItemConfigOf` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) fn unlock_item_transfer() -> Weight { // Proof Size summary in bytes: // Measured: `435` // Estimated: `3534` - // Minimum execution time: 19_911_000 picoseconds. - Weight::from_parts(20_612_000, 3534) + // Minimum execution time: 18_078_000 picoseconds. + Weight::from_parts(18_593_000, 3534) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Nfts Collection (r:1 w:0) - /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) - /// Storage: Nfts CollectionConfigOf (r:1 w:1) - /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + /// Storage: `Nfts::Collection` (r:1 w:0) + /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) + /// Storage: `Nfts::CollectionConfigOf` (r:1 w:1) + /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) fn lock_collection() -> Weight { // Proof Size summary in bytes: // Measured: `340` // Estimated: `3549` - // Minimum execution time: 16_441_000 picoseconds. - Weight::from_parts(16_890_000, 3549) + // Minimum execution time: 15_175_000 picoseconds. + Weight::from_parts(15_762_000, 3549) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Nfts OwnershipAcceptance (r:1 w:1) - /// Proof: Nfts OwnershipAcceptance (max_values: None, max_size: Some(52), added: 2527, mode: MaxEncodedLen) - /// Storage: Nfts Collection (r:1 w:1) - /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) - /// Storage: Nfts CollectionAccount (r:0 w:2) - /// Proof: Nfts CollectionAccount (max_values: None, max_size: Some(68), added: 2543, mode: MaxEncodedLen) + /// Storage: `Nfts::OwnershipAcceptance` (r:1 w:1) + /// Proof: `Nfts::OwnershipAcceptance` (`max_values`: None, `max_size`: Some(52), added: 2527, mode: `MaxEncodedLen`) + /// Storage: `Nfts::Collection` (r:1 w:1) + /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `Nfts::CollectionAccount` (r:0 w:2) + /// Proof: `Nfts::CollectionAccount` (`max_values`: None, `max_size`: Some(68), added: 2543, mode: `MaxEncodedLen`) fn transfer_ownership() -> Weight { // Proof Size summary in bytes: - // Measured: `388` - // Estimated: `3549` - // Minimum execution time: 22_610_000 picoseconds. - Weight::from_parts(23_422_000, 3549) - .saturating_add(RocksDbWeight::get().reads(2_u64)) - .saturating_add(RocksDbWeight::get().writes(4_u64)) + // Measured: `562` + // Estimated: `3593` + // Minimum execution time: 26_164_000 picoseconds. + Weight::from_parts(27_117_000, 3593) + .saturating_add(RocksDbWeight::get().reads(3_u64)) + .saturating_add(RocksDbWeight::get().writes(5_u64)) } - /// Storage: Nfts Collection (r:1 w:1) - /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) - /// Storage: Nfts CollectionRoleOf (r:2 w:4) - /// Proof: Nfts CollectionRoleOf (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) + /// Storage: `Nfts::Collection` (r:1 w:1) + /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) + /// Storage: `Nfts::CollectionRoleOf` (r:2 w:4) + /// Proof: `Nfts::CollectionRoleOf` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) fn set_team() -> Weight { // Proof Size summary in bytes: // Measured: `369` // Estimated: `6078` - // Minimum execution time: 39_739_000 picoseconds. - Weight::from_parts(41_306_000, 6078) + // Minimum execution time: 38_523_000 picoseconds. + Weight::from_parts(39_486_000, 6078) .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(5_u64)) } - /// Storage: Nfts Collection (r:1 w:1) - /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) - /// Storage: Nfts CollectionAccount (r:0 w:2) - /// Proof: Nfts CollectionAccount (max_values: None, max_size: Some(68), added: 2543, mode: MaxEncodedLen) + /// Storage: `Nfts::Collection` (r:1 w:1) + /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) + /// Storage: `Nfts::CollectionAccount` (r:0 w:2) + /// Proof: `Nfts::CollectionAccount` (`max_values`: None, `max_size`: Some(68), added: 2543, mode: `MaxEncodedLen`) fn force_collection_owner() -> Weight { // Proof Size summary in bytes: // Measured: `311` // Estimated: `3549` - // Minimum execution time: 17_685_000 picoseconds. - Weight::from_parts(18_258_000, 3549) + // Minimum execution time: 15_733_000 picoseconds. + Weight::from_parts(16_227_000, 3549) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(3_u64)) } - /// Storage: Nfts Collection (r:1 w:0) - /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) - /// Storage: Nfts CollectionConfigOf (r:0 w:1) - /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + /// Storage: `Nfts::Collection` (r:1 w:0) + /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) + /// Storage: `Nfts::CollectionConfigOf` (r:0 w:1) + /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) fn force_collection_config() -> Weight { // Proof Size summary in bytes: // Measured: `276` // Estimated: `3549` - // Minimum execution time: 13_734_000 picoseconds. - Weight::from_parts(14_337_000, 3549) + // Minimum execution time: 12_042_000 picoseconds. + Weight::from_parts(12_690_000, 3549) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Nfts CollectionRoleOf (r:1 w:0) - /// Proof: Nfts CollectionRoleOf (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) - /// Storage: Nfts ItemConfigOf (r:1 w:1) - /// Proof: Nfts ItemConfigOf (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) + /// Storage: `Nfts::CollectionRoleOf` (r:1 w:0) + /// Proof: `Nfts::CollectionRoleOf` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) + /// Storage: `Nfts::ItemConfigOf` (r:1 w:1) + /// Proof: `Nfts::ItemConfigOf` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) fn lock_item_properties() -> Weight { // Proof Size summary in bytes: // Measured: `435` // Estimated: `3534` - // Minimum execution time: 19_269_000 picoseconds. - Weight::from_parts(19_859_000, 3534) + // Minimum execution time: 17_165_000 picoseconds. + Weight::from_parts(17_769_000, 3534) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Nfts Collection (r:1 w:1) - /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) - /// Storage: Nfts CollectionRoleOf (r:1 w:0) - /// Proof: Nfts CollectionRoleOf (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) - /// Storage: Nfts CollectionConfigOf (r:1 w:0) - /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - /// Storage: Nfts ItemConfigOf (r:1 w:0) - /// Proof: Nfts ItemConfigOf (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) - /// Storage: Nfts Attribute (r:1 w:1) - /// Proof: Nfts Attribute (max_values: None, max_size: Some(446), added: 2921, mode: MaxEncodedLen) + /// Storage: `Nfts::Collection` (r:1 w:1) + /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) + /// Storage: `Nfts::CollectionRoleOf` (r:1 w:0) + /// Proof: `Nfts::CollectionRoleOf` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) + /// Storage: `Nfts::CollectionConfigOf` (r:1 w:0) + /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) + /// Storage: `Nfts::ItemConfigOf` (r:1 w:0) + /// Proof: `Nfts::ItemConfigOf` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) + /// Storage: `Nfts::Attribute` (r:1 w:1) + /// Proof: `Nfts::Attribute` (`max_values`: None, `max_size`: Some(479), added: 2954, mode: `MaxEncodedLen`) fn set_attribute() -> Weight { // Proof Size summary in bytes: // Measured: `539` - // Estimated: `3911` - // Minimum execution time: 51_540_000 picoseconds. - Weight::from_parts(52_663_000, 3911) + // Estimated: `3944` + // Minimum execution time: 48_862_000 picoseconds. + Weight::from_parts(50_584_000, 3944) .saturating_add(RocksDbWeight::get().reads(5_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } - /// Storage: Nfts Collection (r:1 w:1) - /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) - /// Storage: Nfts Attribute (r:1 w:1) - /// Proof: Nfts Attribute (max_values: None, max_size: Some(446), added: 2921, mode: MaxEncodedLen) + /// Storage: `Nfts::Collection` (r:1 w:1) + /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) + /// Storage: `Nfts::Attribute` (r:1 w:1) + /// Proof: `Nfts::Attribute` (`max_values`: None, `max_size`: Some(479), added: 2954, mode: `MaxEncodedLen`) fn force_set_attribute() -> Weight { // Proof Size summary in bytes: // Measured: `344` - // Estimated: `3911` - // Minimum execution time: 26_529_000 picoseconds. - Weight::from_parts(27_305_000, 3911) + // Estimated: `3944` + // Minimum execution time: 24_665_000 picoseconds. + Weight::from_parts(25_465_000, 3944) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } - /// Storage: Nfts Attribute (r:1 w:1) - /// Proof: Nfts Attribute (max_values: None, max_size: Some(446), added: 2921, mode: MaxEncodedLen) - /// Storage: Nfts CollectionRoleOf (r:1 w:0) - /// Proof: Nfts CollectionRoleOf (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) - /// Storage: Nfts ItemConfigOf (r:1 w:0) - /// Proof: Nfts ItemConfigOf (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) - /// Storage: Nfts Collection (r:1 w:1) - /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) + /// Storage: `Nfts::Attribute` (r:1 w:1) + /// Proof: `Nfts::Attribute` (`max_values`: None, `max_size`: Some(479), added: 2954, mode: `MaxEncodedLen`) + /// Storage: `Nfts::CollectionRoleOf` (r:1 w:0) + /// Proof: `Nfts::CollectionRoleOf` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) + /// Storage: `Nfts::ItemConfigOf` (r:1 w:0) + /// Proof: `Nfts::ItemConfigOf` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) + /// Storage: `Nfts::Collection` (r:1 w:1) + /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) fn clear_attribute() -> Weight { // Proof Size summary in bytes: - // Measured: `950` - // Estimated: `3911` - // Minimum execution time: 46_951_000 picoseconds. - Weight::from_parts(48_481_000, 3911) + // Measured: `983` + // Estimated: `3944` + // Minimum execution time: 44_617_000 picoseconds. + Weight::from_parts(46_458_000, 3944) .saturating_add(RocksDbWeight::get().reads(4_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } - /// Storage: Nfts Item (r:1 w:0) - /// Proof: Nfts Item (max_values: None, max_size: Some(861), added: 3336, mode: MaxEncodedLen) - /// Storage: Nfts ItemAttributesApprovalsOf (r:1 w:1) - /// Proof: Nfts ItemAttributesApprovalsOf (max_values: None, max_size: Some(681), added: 3156, mode: MaxEncodedLen) + /// Storage: `Nfts::Item` (r:1 w:0) + /// Proof: `Nfts::Item` (`max_values`: None, `max_size`: Some(861), added: 3336, mode: `MaxEncodedLen`) + /// Storage: `Nfts::ItemAttributesApprovalsOf` (r:1 w:1) + /// Proof: `Nfts::ItemAttributesApprovalsOf` (`max_values`: None, `max_size`: Some(681), added: 3156, mode: `MaxEncodedLen`) fn approve_item_attributes() -> Weight { // Proof Size summary in bytes: // Measured: `381` // Estimated: `4326` - // Minimum execution time: 17_222_000 picoseconds. - Weight::from_parts(17_819_000, 4326) + // Minimum execution time: 15_710_000 picoseconds. + Weight::from_parts(16_191_000, 4326) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Nfts Item (r:1 w:0) - /// Proof: Nfts Item (max_values: None, max_size: Some(861), added: 3336, mode: MaxEncodedLen) - /// Storage: Nfts ItemAttributesApprovalsOf (r:1 w:1) - /// Proof: Nfts ItemAttributesApprovalsOf (max_values: None, max_size: Some(681), added: 3156, mode: MaxEncodedLen) - /// Storage: Nfts Attribute (r:1001 w:1000) - /// Proof: Nfts Attribute (max_values: None, max_size: Some(446), added: 2921, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: `Nfts::Item` (r:1 w:0) + /// Proof: `Nfts::Item` (`max_values`: None, `max_size`: Some(861), added: 3336, mode: `MaxEncodedLen`) + /// Storage: `Nfts::ItemAttributesApprovalsOf` (r:1 w:1) + /// Proof: `Nfts::ItemAttributesApprovalsOf` (`max_values`: None, `max_size`: Some(681), added: 3156, mode: `MaxEncodedLen`) + /// Storage: `Nfts::Attribute` (r:1001 w:1000) + /// Proof: `Nfts::Attribute` (`max_values`: None, `max_size`: Some(479), added: 2954, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) /// The range of component `n` is `[0, 1000]`. fn cancel_item_attributes_approval(n: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `837 + n * (364 ±0)` - // Estimated: `4326 + n * (2921 ±0)` - // Minimum execution time: 26_185_000 picoseconds. - Weight::from_parts(27_038_000, 4326) - // Standard Error: 2_378 - .saturating_add(Weight::from_parts(6_067_888, 0).saturating_mul(n.into())) + // Measured: `831 + n * (398 ±0)` + // Estimated: `4326 + n * (2954 ±0)` + // Minimum execution time: 24_447_000 picoseconds. + Weight::from_parts(25_144_000, 4326) + // Standard Error: 4_872 + .saturating_add(Weight::from_parts(6_523_101, 0).saturating_mul(n.into())) .saturating_add(RocksDbWeight::get().reads(4_u64)) .saturating_add(RocksDbWeight::get().reads((1_u64).saturating_mul(n.into()))) .saturating_add(RocksDbWeight::get().writes(2_u64)) .saturating_add(RocksDbWeight::get().writes((1_u64).saturating_mul(n.into()))) - .saturating_add(Weight::from_parts(0, 2921).saturating_mul(n.into())) - } - /// Storage: Nfts CollectionRoleOf (r:1 w:0) - /// Proof: Nfts CollectionRoleOf (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) - /// Storage: Nfts Collection (r:1 w:1) - /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) - /// Storage: Nfts ItemConfigOf (r:1 w:0) - /// Proof: Nfts ItemConfigOf (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) - /// Storage: Nfts CollectionConfigOf (r:1 w:0) - /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - /// Storage: Nfts ItemMetadataOf (r:1 w:1) - /// Proof: Nfts ItemMetadataOf (max_values: None, max_size: Some(140), added: 2615, mode: MaxEncodedLen) + .saturating_add(Weight::from_parts(0, 2954).saturating_mul(n.into())) + } + /// Storage: `Nfts::CollectionRoleOf` (r:1 w:0) + /// Proof: `Nfts::CollectionRoleOf` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) + /// Storage: `Nfts::Collection` (r:1 w:1) + /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) + /// Storage: `Nfts::ItemConfigOf` (r:1 w:0) + /// Proof: `Nfts::ItemConfigOf` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) + /// Storage: `Nfts::CollectionConfigOf` (r:1 w:0) + /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) + /// Storage: `Nfts::ItemMetadataOf` (r:1 w:1) + /// Proof: `Nfts::ItemMetadataOf` (`max_values`: None, `max_size`: Some(347), added: 2822, mode: `MaxEncodedLen`) fn set_metadata() -> Weight { // Proof Size summary in bytes: // Measured: `539` - // Estimated: `3605` - // Minimum execution time: 42_120_000 picoseconds. - Weight::from_parts(43_627_000, 3605) + // Estimated: `3812` + // Minimum execution time: 39_990_000 picoseconds. + Weight::from_parts(41_098_000, 3812) .saturating_add(RocksDbWeight::get().reads(5_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } - /// Storage: Nfts CollectionRoleOf (r:1 w:0) - /// Proof: Nfts CollectionRoleOf (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) - /// Storage: Nfts ItemMetadataOf (r:1 w:1) - /// Proof: Nfts ItemMetadataOf (max_values: None, max_size: Some(140), added: 2615, mode: MaxEncodedLen) - /// Storage: Nfts Collection (r:1 w:1) - /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) - /// Storage: Nfts ItemConfigOf (r:1 w:0) - /// Proof: Nfts ItemConfigOf (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) + /// Storage: `Nfts::CollectionRoleOf` (r:1 w:0) + /// Proof: `Nfts::CollectionRoleOf` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) + /// Storage: `Nfts::ItemMetadataOf` (r:1 w:1) + /// Proof: `Nfts::ItemMetadataOf` (`max_values`: None, `max_size`: Some(347), added: 2822, mode: `MaxEncodedLen`) + /// Storage: `Nfts::Collection` (r:1 w:1) + /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) + /// Storage: `Nfts::ItemConfigOf` (r:1 w:0) + /// Proof: `Nfts::ItemConfigOf` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) fn clear_metadata() -> Weight { // Proof Size summary in bytes: - // Measured: `642` - // Estimated: `3605` - // Minimum execution time: 40_732_000 picoseconds. - Weight::from_parts(42_760_000, 3605) + // Measured: `849` + // Estimated: `3812` + // Minimum execution time: 38_030_000 picoseconds. + Weight::from_parts(39_842_000, 3812) .saturating_add(RocksDbWeight::get().reads(4_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } - /// Storage: Nfts CollectionRoleOf (r:1 w:0) - /// Proof: Nfts CollectionRoleOf (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) - /// Storage: Nfts CollectionConfigOf (r:1 w:0) - /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - /// Storage: Nfts Collection (r:1 w:1) - /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) - /// Storage: Nfts CollectionMetadataOf (r:1 w:1) - /// Proof: Nfts CollectionMetadataOf (max_values: None, max_size: Some(87), added: 2562, mode: MaxEncodedLen) + /// Storage: `Nfts::CollectionRoleOf` (r:1 w:0) + /// Proof: `Nfts::CollectionRoleOf` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) + /// Storage: `Nfts::CollectionConfigOf` (r:1 w:0) + /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) + /// Storage: `Nfts::Collection` (r:1 w:1) + /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) + /// Storage: `Nfts::CollectionMetadataOf` (r:1 w:1) + /// Proof: `Nfts::CollectionMetadataOf` (`max_values`: None, `max_size`: Some(294), added: 2769, mode: `MaxEncodedLen`) fn set_collection_metadata() -> Weight { // Proof Size summary in bytes: // Measured: `398` - // Estimated: `3552` - // Minimum execution time: 39_443_000 picoseconds. - Weight::from_parts(40_482_000, 3552) + // Estimated: `3759` + // Minimum execution time: 36_778_000 picoseconds. + Weight::from_parts(38_088_000, 3759) .saturating_add(RocksDbWeight::get().reads(4_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } - /// Storage: Nfts CollectionRoleOf (r:1 w:0) - /// Proof: Nfts CollectionRoleOf (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) - /// Storage: Nfts Collection (r:1 w:0) - /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) - /// Storage: Nfts CollectionConfigOf (r:1 w:0) - /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - /// Storage: Nfts CollectionMetadataOf (r:1 w:1) - /// Proof: Nfts CollectionMetadataOf (max_values: None, max_size: Some(87), added: 2562, mode: MaxEncodedLen) + /// Storage: `Nfts::CollectionRoleOf` (r:1 w:0) + /// Proof: `Nfts::CollectionRoleOf` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) + /// Storage: `Nfts::Collection` (r:1 w:1) + /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) + /// Storage: `Nfts::CollectionConfigOf` (r:1 w:0) + /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) + /// Storage: `Nfts::CollectionMetadataOf` (r:1 w:1) + /// Proof: `Nfts::CollectionMetadataOf` (`max_values`: None, `max_size`: Some(294), added: 2769, mode: `MaxEncodedLen`) fn clear_collection_metadata() -> Weight { // Proof Size summary in bytes: - // Measured: `509` - // Estimated: `3552` - // Minimum execution time: 37_676_000 picoseconds. - Weight::from_parts(39_527_000, 3552) + // Measured: `716` + // Estimated: `3759` + // Minimum execution time: 36_887_000 picoseconds. + Weight::from_parts(38_406_000, 3759) .saturating_add(RocksDbWeight::get().reads(4_u64)) - .saturating_add(RocksDbWeight::get().writes(1_u64)) + .saturating_add(RocksDbWeight::get().writes(2_u64)) } - /// Storage: Nfts Item (r:1 w:1) - /// Proof: Nfts Item (max_values: None, max_size: Some(861), added: 3336, mode: MaxEncodedLen) - /// Storage: Nfts CollectionConfigOf (r:1 w:0) - /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + /// Storage: `Nfts::Item` (r:1 w:1) + /// Proof: `Nfts::Item` (`max_values`: None, `max_size`: Some(861), added: 3336, mode: `MaxEncodedLen`) + /// Storage: `Nfts::CollectionConfigOf` (r:1 w:0) + /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) fn approve_transfer() -> Weight { // Proof Size summary in bytes: // Measured: `410` // Estimated: `4326` - // Minimum execution time: 20_787_000 picoseconds. - Weight::from_parts(21_315_000, 4326) + // Minimum execution time: 18_734_000 picoseconds. + Weight::from_parts(19_267_000, 4326) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Nfts Item (r:1 w:1) - /// Proof: Nfts Item (max_values: None, max_size: Some(861), added: 3336, mode: MaxEncodedLen) + /// Storage: `Nfts::Item` (r:1 w:1) + /// Proof: `Nfts::Item` (`max_values`: None, `max_size`: Some(861), added: 3336, mode: `MaxEncodedLen`) fn cancel_approval() -> Weight { // Proof Size summary in bytes: // Measured: `418` // Estimated: `4326` - // Minimum execution time: 18_200_000 picoseconds. - Weight::from_parts(19_064_000, 4326) + // Minimum execution time: 16_080_000 picoseconds. + Weight::from_parts(16_603_000, 4326) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Nfts Item (r:1 w:1) - /// Proof: Nfts Item (max_values: None, max_size: Some(861), added: 3336, mode: MaxEncodedLen) + /// Storage: `Nfts::Item` (r:1 w:1) + /// Proof: `Nfts::Item` (`max_values`: None, `max_size`: Some(861), added: 3336, mode: `MaxEncodedLen`) fn clear_all_transfer_approvals() -> Weight { // Proof Size summary in bytes: // Measured: `418` // Estimated: `4326` - // Minimum execution time: 17_128_000 picoseconds. - Weight::from_parts(17_952_000, 4326) + // Minimum execution time: 15_013_000 picoseconds. + Weight::from_parts(15_607_000, 4326) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Nfts OwnershipAcceptance (r:1 w:1) - /// Proof: Nfts OwnershipAcceptance (max_values: None, max_size: Some(52), added: 2527, mode: MaxEncodedLen) + /// Storage: `Nfts::OwnershipAcceptance` (r:1 w:1) + /// Proof: `Nfts::OwnershipAcceptance` (`max_values`: None, `max_size`: Some(52), added: 2527, mode: `MaxEncodedLen`) fn set_accept_ownership() -> Weight { // Proof Size summary in bytes: // Measured: `76` // Estimated: `3517` - // Minimum execution time: 14_667_000 picoseconds. - Weight::from_parts(15_262_000, 3517) + // Minimum execution time: 13_077_000 picoseconds. + Weight::from_parts(13_635_000, 3517) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Nfts CollectionConfigOf (r:1 w:1) - /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - /// Storage: Nfts Collection (r:1 w:0) - /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) + /// Storage: `Nfts::CollectionConfigOf` (r:1 w:1) + /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) + /// Storage: `Nfts::Collection` (r:1 w:0) + /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) fn set_collection_max_supply() -> Weight { // Proof Size summary in bytes: // Measured: `340` // Estimated: `3549` - // Minimum execution time: 18_435_000 picoseconds. - Weight::from_parts(18_775_000, 3549) + // Minimum execution time: 17_146_000 picoseconds. + Weight::from_parts(17_453_000, 3549) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Nfts CollectionRoleOf (r:1 w:0) - /// Proof: Nfts CollectionRoleOf (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) - /// Storage: Nfts CollectionConfigOf (r:1 w:1) - /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) + /// Storage: `Nfts::CollectionRoleOf` (r:1 w:0) + /// Proof: `Nfts::CollectionRoleOf` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) + /// Storage: `Nfts::CollectionConfigOf` (r:1 w:1) + /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) fn update_mint_settings() -> Weight { // Proof Size summary in bytes: // Measured: `323` // Estimated: `3538` - // Minimum execution time: 18_125_000 picoseconds. - Weight::from_parts(18_415_000, 3538) + // Minimum execution time: 16_102_000 picoseconds. + Weight::from_parts(16_629_000, 3538) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Nfts Item (r:1 w:0) - /// Proof: Nfts Item (max_values: None, max_size: Some(861), added: 3336, mode: MaxEncodedLen) - /// Storage: Nfts CollectionConfigOf (r:1 w:0) - /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - /// Storage: Nfts ItemConfigOf (r:1 w:0) - /// Proof: Nfts ItemConfigOf (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) - /// Storage: Nfts ItemPriceOf (r:0 w:1) - /// Proof: Nfts ItemPriceOf (max_values: None, max_size: Some(89), added: 2564, mode: MaxEncodedLen) + /// Storage: `Nfts::Item` (r:1 w:0) + /// Proof: `Nfts::Item` (`max_values`: None, `max_size`: Some(861), added: 3336, mode: `MaxEncodedLen`) + /// Storage: `Nfts::CollectionConfigOf` (r:1 w:0) + /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) + /// Storage: `Nfts::ItemConfigOf` (r:1 w:0) + /// Proof: `Nfts::ItemConfigOf` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) + /// Storage: `Nfts::ItemPriceOf` (r:0 w:1) + /// Proof: `Nfts::ItemPriceOf` (`max_values`: None, `max_size`: Some(89), added: 2564, mode: `MaxEncodedLen`) fn set_price() -> Weight { // Proof Size summary in bytes: // Measured: `518` // Estimated: `4326` - // Minimum execution time: 23_237_000 picoseconds. - Weight::from_parts(24_128_000, 4326) + // Minimum execution time: 22_118_000 picoseconds. + Weight::from_parts(22_849_000, 4326) .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Nfts Item (r:1 w:1) - /// Proof: Nfts Item (max_values: None, max_size: Some(861), added: 3336, mode: MaxEncodedLen) - /// Storage: Nfts ItemPriceOf (r:1 w:1) - /// Proof: Nfts ItemPriceOf (max_values: None, max_size: Some(89), added: 2564, mode: MaxEncodedLen) - /// Storage: Nfts Collection (r:1 w:0) - /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) - /// Storage: Nfts Attribute (r:1 w:0) - /// Proof: Nfts Attribute (max_values: None, max_size: Some(446), added: 2921, mode: MaxEncodedLen) - /// Storage: Nfts CollectionConfigOf (r:1 w:0) - /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - /// Storage: Nfts ItemConfigOf (r:1 w:0) - /// Proof: Nfts ItemConfigOf (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) - /// Storage: Nfts Account (r:0 w:2) - /// Proof: Nfts Account (max_values: None, max_size: Some(88), added: 2563, mode: MaxEncodedLen) - /// Storage: Nfts PendingSwapOf (r:0 w:1) - /// Proof: Nfts PendingSwapOf (max_values: None, max_size: Some(71), added: 2546, mode: MaxEncodedLen) + /// Storage: `Nfts::Item` (r:1 w:1) + /// Proof: `Nfts::Item` (`max_values`: None, `max_size`: Some(861), added: 3336, mode: `MaxEncodedLen`) + /// Storage: `Nfts::ItemPriceOf` (r:1 w:1) + /// Proof: `Nfts::ItemPriceOf` (`max_values`: None, `max_size`: Some(89), added: 2564, mode: `MaxEncodedLen`) + /// Storage: `Nfts::Collection` (r:1 w:0) + /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) + /// Storage: `Nfts::Attribute` (r:1 w:0) + /// Proof: `Nfts::Attribute` (`max_values`: None, `max_size`: Some(479), added: 2954, mode: `MaxEncodedLen`) + /// Storage: `Nfts::CollectionConfigOf` (r:1 w:0) + /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) + /// Storage: `Nfts::ItemConfigOf` (r:1 w:0) + /// Proof: `Nfts::ItemConfigOf` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) + /// Storage: `Nfts::Account` (r:0 w:2) + /// Proof: `Nfts::Account` (`max_values`: None, `max_size`: Some(88), added: 2563, mode: `MaxEncodedLen`) + /// Storage: `Nfts::PendingSwapOf` (r:0 w:1) + /// Proof: `Nfts::PendingSwapOf` (`max_values`: None, `max_size`: Some(71), added: 2546, mode: `MaxEncodedLen`) fn buy_item() -> Weight { // Proof Size summary in bytes: // Measured: `705` // Estimated: `4326` - // Minimum execution time: 53_291_000 picoseconds. - Weight::from_parts(54_614_000, 4326) + // Minimum execution time: 50_369_000 picoseconds. + Weight::from_parts(51_816_000, 4326) .saturating_add(RocksDbWeight::get().reads(6_u64)) .saturating_add(RocksDbWeight::get().writes(5_u64)) } @@ -1341,120 +1349,120 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_192_000 picoseconds. - Weight::from_parts(4_039_901, 0) - // Standard Error: 10_309 - .saturating_add(Weight::from_parts(3_934_017, 0).saturating_mul(n.into())) - } - /// Storage: Nfts Item (r:2 w:0) - /// Proof: Nfts Item (max_values: None, max_size: Some(861), added: 3336, mode: MaxEncodedLen) - /// Storage: Nfts PendingSwapOf (r:0 w:1) - /// Proof: Nfts PendingSwapOf (max_values: None, max_size: Some(71), added: 2546, mode: MaxEncodedLen) + // Minimum execution time: 2_203_000 picoseconds. + Weight::from_parts(3_710_869, 0) + // Standard Error: 8_094 + .saturating_add(Weight::from_parts(2_201_869, 0).saturating_mul(n.into())) + } + /// Storage: `Nfts::Item` (r:2 w:0) + /// Proof: `Nfts::Item` (`max_values`: None, `max_size`: Some(861), added: 3336, mode: `MaxEncodedLen`) + /// Storage: `Nfts::PendingSwapOf` (r:0 w:1) + /// Proof: `Nfts::PendingSwapOf` (`max_values`: None, `max_size`: Some(71), added: 2546, mode: `MaxEncodedLen`) fn create_swap() -> Weight { // Proof Size summary in bytes: // Measured: `494` // Estimated: `7662` - // Minimum execution time: 21_011_000 picoseconds. - Weight::from_parts(22_065_000, 7662) + // Minimum execution time: 18_893_000 picoseconds. + Weight::from_parts(19_506_000, 7662) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Nfts PendingSwapOf (r:1 w:1) - /// Proof: Nfts PendingSwapOf (max_values: None, max_size: Some(71), added: 2546, mode: MaxEncodedLen) - /// Storage: Nfts Item (r:1 w:0) - /// Proof: Nfts Item (max_values: None, max_size: Some(861), added: 3336, mode: MaxEncodedLen) + /// Storage: `Nfts::PendingSwapOf` (r:1 w:1) + /// Proof: `Nfts::PendingSwapOf` (`max_values`: None, `max_size`: Some(71), added: 2546, mode: `MaxEncodedLen`) + /// Storage: `Nfts::Item` (r:1 w:0) + /// Proof: `Nfts::Item` (`max_values`: None, `max_size`: Some(861), added: 3336, mode: `MaxEncodedLen`) fn cancel_swap() -> Weight { // Proof Size summary in bytes: // Measured: `513` // Estimated: `4326` - // Minimum execution time: 21_423_000 picoseconds. - Weight::from_parts(21_743_000, 4326) + // Minimum execution time: 19_086_000 picoseconds. + Weight::from_parts(19_609_000, 4326) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Nfts Item (r:2 w:2) - /// Proof: Nfts Item (max_values: None, max_size: Some(861), added: 3336, mode: MaxEncodedLen) - /// Storage: Nfts PendingSwapOf (r:1 w:2) - /// Proof: Nfts PendingSwapOf (max_values: None, max_size: Some(71), added: 2546, mode: MaxEncodedLen) - /// Storage: Nfts Collection (r:1 w:0) - /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) - /// Storage: Nfts Attribute (r:2 w:0) - /// Proof: Nfts Attribute (max_values: None, max_size: Some(446), added: 2921, mode: MaxEncodedLen) - /// Storage: Nfts CollectionConfigOf (r:1 w:0) - /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - /// Storage: Nfts ItemConfigOf (r:2 w:0) - /// Proof: Nfts ItemConfigOf (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) - /// Storage: Nfts Account (r:0 w:4) - /// Proof: Nfts Account (max_values: None, max_size: Some(88), added: 2563, mode: MaxEncodedLen) - /// Storage: Nfts ItemPriceOf (r:0 w:2) - /// Proof: Nfts ItemPriceOf (max_values: None, max_size: Some(89), added: 2564, mode: MaxEncodedLen) + /// Storage: `Nfts::Item` (r:2 w:2) + /// Proof: `Nfts::Item` (`max_values`: None, `max_size`: Some(861), added: 3336, mode: `MaxEncodedLen`) + /// Storage: `Nfts::PendingSwapOf` (r:1 w:2) + /// Proof: `Nfts::PendingSwapOf` (`max_values`: None, `max_size`: Some(71), added: 2546, mode: `MaxEncodedLen`) + /// Storage: `Nfts::Collection` (r:1 w:0) + /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) + /// Storage: `Nfts::Attribute` (r:2 w:0) + /// Proof: `Nfts::Attribute` (`max_values`: None, `max_size`: Some(479), added: 2954, mode: `MaxEncodedLen`) + /// Storage: `Nfts::CollectionConfigOf` (r:1 w:0) + /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) + /// Storage: `Nfts::ItemConfigOf` (r:2 w:0) + /// Proof: `Nfts::ItemConfigOf` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) + /// Storage: `Nfts::Account` (r:0 w:4) + /// Proof: `Nfts::Account` (`max_values`: None, `max_size`: Some(88), added: 2563, mode: `MaxEncodedLen`) + /// Storage: `Nfts::ItemPriceOf` (r:0 w:2) + /// Proof: `Nfts::ItemPriceOf` (`max_values`: None, `max_size`: Some(89), added: 2564, mode: `MaxEncodedLen`) fn claim_swap() -> Weight { // Proof Size summary in bytes: // Measured: `834` // Estimated: `7662` - // Minimum execution time: 86_059_000 picoseconds. - Weight::from_parts(88_401_000, 7662) + // Minimum execution time: 84_103_000 picoseconds. + Weight::from_parts(85_325_000, 7662) .saturating_add(RocksDbWeight::get().reads(9_u64)) .saturating_add(RocksDbWeight::get().writes(10_u64)) } - /// Storage: Nfts CollectionRoleOf (r:2 w:0) - /// Proof: Nfts CollectionRoleOf (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) - /// Storage: Nfts CollectionConfigOf (r:1 w:0) - /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - /// Storage: Nfts Item (r:1 w:1) - /// Proof: Nfts Item (max_values: None, max_size: Some(861), added: 3336, mode: MaxEncodedLen) - /// Storage: Nfts Collection (r:1 w:1) - /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) - /// Storage: Nfts ItemConfigOf (r:1 w:1) - /// Proof: Nfts ItemConfigOf (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) - /// Storage: Nfts Attribute (r:10 w:10) - /// Proof: Nfts Attribute (max_values: None, max_size: Some(446), added: 2921, mode: MaxEncodedLen) - /// Storage: Nfts ItemMetadataOf (r:1 w:1) - /// Proof: Nfts ItemMetadataOf (max_values: None, max_size: Some(140), added: 2615, mode: MaxEncodedLen) - /// Storage: Nfts Account (r:0 w:1) - /// Proof: Nfts Account (max_values: None, max_size: Some(88), added: 2563, mode: MaxEncodedLen) + /// Storage: `Nfts::CollectionRoleOf` (r:2 w:0) + /// Proof: `Nfts::CollectionRoleOf` (`max_values`: None, `max_size`: Some(69), added: 2544, mode: `MaxEncodedLen`) + /// Storage: `Nfts::CollectionConfigOf` (r:1 w:0) + /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) + /// Storage: `Nfts::Item` (r:1 w:1) + /// Proof: `Nfts::Item` (`max_values`: None, `max_size`: Some(861), added: 3336, mode: `MaxEncodedLen`) + /// Storage: `Nfts::Collection` (r:1 w:1) + /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) + /// Storage: `Nfts::ItemConfigOf` (r:1 w:1) + /// Proof: `Nfts::ItemConfigOf` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `Nfts::Attribute` (r:10 w:10) + /// Proof: `Nfts::Attribute` (`max_values`: None, `max_size`: Some(479), added: 2954, mode: `MaxEncodedLen`) + /// Storage: `Nfts::ItemMetadataOf` (r:1 w:1) + /// Proof: `Nfts::ItemMetadataOf` (`max_values`: None, `max_size`: Some(347), added: 2822, mode: `MaxEncodedLen`) + /// Storage: `Nfts::Account` (r:0 w:1) + /// Proof: `Nfts::Account` (`max_values`: None, `max_size`: Some(88), added: 2563, mode: `MaxEncodedLen`) /// The range of component `n` is `[0, 10]`. fn mint_pre_signed(n: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `629` - // Estimated: `6078 + n * (2921 ±0)` - // Minimum execution time: 146_746_000 picoseconds. - Weight::from_parts(152_885_862, 6078) - // Standard Error: 40_442 - .saturating_add(Weight::from_parts(32_887_800, 0).saturating_mul(n.into())) + // Estimated: `6078 + n * (2954 ±0)` + // Minimum execution time: 128_363_000 picoseconds. + Weight::from_parts(139_474_918, 6078) + // Standard Error: 79_252 + .saturating_add(Weight::from_parts(31_384_027, 0).saturating_mul(n.into())) .saturating_add(RocksDbWeight::get().reads(8_u64)) .saturating_add(RocksDbWeight::get().reads((1_u64).saturating_mul(n.into()))) .saturating_add(RocksDbWeight::get().writes(6_u64)) .saturating_add(RocksDbWeight::get().writes((1_u64).saturating_mul(n.into()))) - .saturating_add(Weight::from_parts(0, 2921).saturating_mul(n.into())) - } - /// Storage: Nfts Item (r:1 w:0) - /// Proof: Nfts Item (max_values: None, max_size: Some(861), added: 3336, mode: MaxEncodedLen) - /// Storage: Nfts ItemAttributesApprovalsOf (r:1 w:1) - /// Proof: Nfts ItemAttributesApprovalsOf (max_values: None, max_size: Some(681), added: 3156, mode: MaxEncodedLen) - /// Storage: Nfts CollectionConfigOf (r:1 w:0) - /// Proof: Nfts CollectionConfigOf (max_values: None, max_size: Some(73), added: 2548, mode: MaxEncodedLen) - /// Storage: Nfts Collection (r:1 w:1) - /// Proof: Nfts Collection (max_values: None, max_size: Some(84), added: 2559, mode: MaxEncodedLen) - /// Storage: Nfts Attribute (r:10 w:10) - /// Proof: Nfts Attribute (max_values: None, max_size: Some(446), added: 2921, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + .saturating_add(Weight::from_parts(0, 2954).saturating_mul(n.into())) + } + /// Storage: `Nfts::Item` (r:1 w:0) + /// Proof: `Nfts::Item` (`max_values`: None, `max_size`: Some(861), added: 3336, mode: `MaxEncodedLen`) + /// Storage: `Nfts::ItemAttributesApprovalsOf` (r:1 w:1) + /// Proof: `Nfts::ItemAttributesApprovalsOf` (`max_values`: None, `max_size`: Some(681), added: 3156, mode: `MaxEncodedLen`) + /// Storage: `Nfts::CollectionConfigOf` (r:1 w:0) + /// Proof: `Nfts::CollectionConfigOf` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) + /// Storage: `Nfts::Collection` (r:1 w:1) + /// Proof: `Nfts::Collection` (`max_values`: None, `max_size`: Some(84), added: 2559, mode: `MaxEncodedLen`) + /// Storage: `Nfts::Attribute` (r:10 w:10) + /// Proof: `Nfts::Attribute` (`max_values`: None, `max_size`: Some(479), added: 2954, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) /// The range of component `n` is `[0, 10]`. fn set_attributes_pre_signed(n: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `659` - // Estimated: `4326 + n * (2921 ±0)` - // Minimum execution time: 83_960_000 picoseconds. - Weight::from_parts(98_609_885, 4326) - // Standard Error: 85_991 - .saturating_add(Weight::from_parts(32_633_495, 0).saturating_mul(n.into())) + // Estimated: `4326 + n * (2954 ±0)` + // Minimum execution time: 66_688_000 picoseconds. + Weight::from_parts(79_208_379, 4326) + // Standard Error: 74_020 + .saturating_add(Weight::from_parts(31_028_221, 0).saturating_mul(n.into())) .saturating_add(RocksDbWeight::get().reads(4_u64)) .saturating_add(RocksDbWeight::get().reads((1_u64).saturating_mul(n.into()))) .saturating_add(RocksDbWeight::get().writes(2_u64)) .saturating_add(RocksDbWeight::get().writes((1_u64).saturating_mul(n.into()))) - .saturating_add(Weight::from_parts(0, 2921).saturating_mul(n.into())) + .saturating_add(Weight::from_parts(0, 2954).saturating_mul(n.into())) } } diff --git a/substrate/frame/nis/Cargo.toml b/substrate/frame/nis/Cargo.toml index 025daa07b0c5314011b325570781474356209d02..d0ba74a9273152dcac8e541ee8be8a41d1a5b584 100644 --- a/substrate/frame/nis/Cargo.toml +++ b/substrate/frame/nis/Cargo.toml @@ -17,7 +17,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } frame-benchmarking = { path = "../benchmarking", default-features = false, optional = true } frame-support = { path = "../support", default-features = false } frame-system = { path = "../system", default-features = false } diff --git a/substrate/frame/nis/README.md b/substrate/frame/nis/README.md index 032df7d01868f8643284985985fc98b3f6ccc0ac..8a1a30f17e18a20168e81995e2b64e2f87603968 100644 --- a/substrate/frame/nis/README.md +++ b/substrate/frame/nis/README.md @@ -1,5 +1,5 @@ # NIS Module -Provides a non-interactiove variant of staking. +Provides a non-interactive variant of staking. License: Apache-2.0 diff --git a/substrate/frame/nis/src/benchmarking.rs b/substrate/frame/nis/src/benchmarking.rs index 0cc9e7421d0e664235e9d697fac20c69d88727a7..f6a83b78d518126fcb423d9e3fce5331b1557a31 100644 --- a/substrate/frame/nis/src/benchmarking.rs +++ b/substrate/frame/nis/src/benchmarking.rs @@ -106,6 +106,7 @@ benchmarks! { } fund_deficit { + T::BenchmarkSetup::create_counterpart_asset(); let origin = T::FundOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; let caller: T::AccountId = whitelisted_caller(); @@ -126,6 +127,7 @@ benchmarks! { } communify { + T::BenchmarkSetup::create_counterpart_asset(); let caller: T::AccountId = whitelisted_caller(); let bid = T::MinBid::get().max(One::one()) * 100u32.into(); let ed = T::Currency::minimum_balance(); @@ -139,6 +141,7 @@ benchmarks! { } privatize { + T::BenchmarkSetup::create_counterpart_asset(); let caller: T::AccountId = whitelisted_caller(); let bid = T::MinBid::get().max(One::one()); let ed = T::Currency::minimum_balance(); @@ -153,6 +156,7 @@ benchmarks! { } thaw_private { + T::BenchmarkSetup::create_counterpart_asset(); let whale: T::AccountId = account("whale", 0, SEED); let caller: T::AccountId = whitelisted_caller(); let bid = T::MinBid::get().max(One::one()); @@ -170,6 +174,7 @@ benchmarks! { } thaw_communal { + T::BenchmarkSetup::create_counterpart_asset(); let whale: T::AccountId = account("whale", 0, SEED); let caller: T::AccountId = whitelisted_caller(); let bid = T::MinBid::get().max(One::one()); diff --git a/substrate/frame/nis/src/lib.rs b/substrate/frame/nis/src/lib.rs index 5e547b63e5474ea36bdcbdb699200f162ca3ac2e..63287f6a1802104df4f03982f92b82010a65924b 100644 --- a/substrate/frame/nis/src/lib.rs +++ b/substrate/frame/nis/src/lib.rs @@ -155,6 +155,18 @@ impl Convert for NoCounterpart { } } +/// Setup the empty genesis state for benchmarking. +pub trait BenchmarkSetup { + /// Create the counterpart asset. Should panic on error. + /// + /// This is called prior to assuming that a counterpart balance exists. + fn create_counterpart_asset(); +} + +impl BenchmarkSetup for () { + fn create_counterpart_asset() {} +} + #[frame_support::pallet] pub mod pallet { use super::{FunInspect, FunMutate}; @@ -297,6 +309,10 @@ pub mod pallet { /// The maximum proportion which may be thawed and the period over which it is reset. #[pallet::constant] type ThawThrottle: Get<(Perquintill, BlockNumberFor)>; + + /// Setup the state for benchmarking. + #[cfg(feature = "runtime-benchmarks")] + type BenchmarkSetup: crate::BenchmarkSetup; } #[pallet::pallet] @@ -426,7 +442,7 @@ pub mod pallet { }, /// An automatic funding of the deficit was made. Funded { deficit: BalanceOf }, - /// A receipt was transfered. + /// A receipt was transferred. Transferred { from: T::AccountId, to: T::AccountId, index: ReceiptIndex }, } @@ -457,7 +473,7 @@ pub mod pallet { AlreadyFunded, /// The thaw throttle has been reached for this period. Throttled, - /// The operation would result in a receipt worth an insignficant value. + /// The operation would result in a receipt worth an insignificant value. MakesDust, /// The receipt is already communal. AlreadyCommunal, diff --git a/substrate/frame/nis/src/mock.rs b/substrate/frame/nis/src/mock.rs index 98b653635caf23b0225df697b8c7629f49447623..f3320a306df738e26cedfff8d57affd2076bee4d 100644 --- a/substrate/frame/nis/src/mock.rs +++ b/substrate/frame/nis/src/mock.rs @@ -21,19 +21,13 @@ use crate::{self as pallet_nis, Perquintill, WithMaximumOf}; use frame_support::{ derive_impl, ord_parameter_types, parameter_types, - traits::{ - fungible::Inspect, ConstU16, ConstU32, ConstU64, Everything, OnFinalize, OnInitialize, - StorageMapShim, - }, + traits::{fungible::Inspect, ConstU32, ConstU64, OnFinalize, OnInitialize, StorageMapShim}, weights::Weight, PalletId, }; use pallet_balances::{Instance1, Instance2}; -use sp_core::{ConstU128, H256}; -use sp_runtime::{ - traits::{BlakeTwo256, IdentityLookup}, - BuildStorage, -}; +use sp_core::ConstU128; +use sp_runtime::BuildStorage; type Block = frame_system::mocking::MockBlock; @@ -50,31 +44,10 @@ frame_support::construct_runtime!( } ); -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { - type BaseCallFilter = Everything; - type BlockWeights = (); - type BlockLength = (); - type RuntimeOrigin = RuntimeOrigin; - type RuntimeCall = RuntimeCall; - type Nonce = u64; - type Hash = H256; - type Hashing = BlakeTwo256; - type AccountId = u64; - type Lookup = IdentityLookup; type Block = Block; - type RuntimeEvent = RuntimeEvent; - type BlockHashCount = ConstU64<250>; - type DbWeight = (); - type Version = (); - type PalletInfo = PalletInfo; type AccountData = pallet_balances::AccountData; - type OnNewAccount = (); - type OnKilledAccount = (); - type SystemWeightInfo = (); - type SS58Prefix = ConstU16<42>; - type OnSetCode = (); - type MaxConsumers = ConstU32<16>; } impl pallet_balances::Config for Test { @@ -148,6 +121,8 @@ impl pallet_nis::Config for Test { type MinReceipt = MinReceipt; type ThawThrottle = ThawThrottle; type RuntimeHoldReason = RuntimeHoldReason; + #[cfg(feature = "runtime-benchmarks")] + type BenchmarkSetup = (); } // This function basically just builds a genesis storage key/value store according to diff --git a/substrate/frame/nis/src/tests.rs b/substrate/frame/nis/src/tests.rs index 7350da97dc60a65747dc6b195510781ea149b73b..01724999ae7e9fb346f940be776e8b1273ea98f4 100644 --- a/substrate/frame/nis/src/tests.rs +++ b/substrate/frame/nis/src/tests.rs @@ -414,7 +414,7 @@ fn thaw_respects_transfers() { assert_eq!(Balances::reserved_balance(&1), 0); assert_eq!(Balances::reserved_balance(&2), 40); - // Transfering the receipt... + // Transferring the receipt... assert_noop!(Nis::thaw_private(signed(1), 0, None), Error::::NotOwner); // ...and thawing is possible. diff --git a/substrate/frame/nis/src/weights.rs b/substrate/frame/nis/src/weights.rs index cba2f0049055b8f3e69aeba7d7d572ba19030801..a2411c1e39a66d94980c7025d4bbb2300eea325b 100644 --- a/substrate/frame/nis/src/weights.rs +++ b/substrate/frame/nis/src/weights.rs @@ -15,16 +15,16 @@ // See the License for the specific language governing permissions and // limitations under the License. -//! Autogenerated weights for pallet_nis +//! Autogenerated weights for `pallet_nis` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-06-16, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-04-09, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-e8ezs4ez-project-145-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("dev"), DB CACHE: 1024 +//! HOSTNAME: `runner-anb7yjbi-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: `1024` // Executed Command: -// ./target/production/substrate +// ./target/production/substrate-node // benchmark // pallet // --chain=dev @@ -35,12 +35,11 @@ // --no-median-slopes // --no-min-squares // --extrinsic=* -// --execution=wasm // --wasm-execution=compiled // --heap-pages=4096 -// --output=./frame/nis/src/weights.rs -// --header=./HEADER-APACHE2 -// --template=./.maintain/frame-weight-template.hbs +// --output=./substrate/frame/nis/src/weights.rs +// --header=./substrate/HEADER-APACHE2 +// --template=./substrate/.maintain/frame-weight-template.hbs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -50,7 +49,7 @@ use frame_support::{traits::Get, weights::{Weight, constants::RocksDbWeight}}; use core::marker::PhantomData; -/// Weight functions needed for pallet_nis. +/// Weight functions needed for `pallet_nis`. pub trait WeightInfo { fn place_bid(l: u32, ) -> Weight; fn place_bid_max() -> Weight; @@ -65,367 +64,367 @@ pub trait WeightInfo { fn process_bid() -> Weight; } -/// Weights for pallet_nis using the Substrate node and recommended hardware. +/// Weights for `pallet_nis` using the Substrate node and recommended hardware. pub struct SubstrateWeight(PhantomData); impl WeightInfo for SubstrateWeight { - /// Storage: Nis Queues (r:1 w:1) - /// Proof: Nis Queues (max_values: None, max_size: Some(48022), added: 50497, mode: MaxEncodedLen) - /// Storage: Balances Holds (r:1 w:1) - /// Proof: Balances Holds (max_values: None, max_size: Some(85), added: 2560, mode: MaxEncodedLen) - /// Storage: Nis QueueTotals (r:1 w:1) - /// Proof: Nis QueueTotals (max_values: Some(1), max_size: Some(6002), added: 6497, mode: MaxEncodedLen) + /// Storage: `Nis::Queues` (r:1 w:1) + /// Proof: `Nis::Queues` (`max_values`: None, `max_size`: Some(48022), added: 50497, mode: `MaxEncodedLen`) + /// Storage: `Balances::Holds` (r:1 w:1) + /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(193), added: 2668, mode: `MaxEncodedLen`) + /// Storage: `Nis::QueueTotals` (r:1 w:1) + /// Proof: `Nis::QueueTotals` (`max_values`: Some(1), `max_size`: Some(6002), added: 6497, mode: `MaxEncodedLen`) /// The range of component `l` is `[0, 999]`. fn place_bid(l: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `6176 + l * (48 ±0)` + // Measured: `6210 + l * (48 ±0)` // Estimated: `51487` - // Minimum execution time: 49_410_000 picoseconds. - Weight::from_parts(57_832_282, 51487) - // Standard Error: 288 - .saturating_add(Weight::from_parts(51_621, 0).saturating_mul(l.into())) + // Minimum execution time: 47_065_000 picoseconds. + Weight::from_parts(52_894_557, 51487) + // Standard Error: 275 + .saturating_add(Weight::from_parts(48_441, 0).saturating_mul(l.into())) .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(3_u64)) } - /// Storage: Nis Queues (r:1 w:1) - /// Proof: Nis Queues (max_values: None, max_size: Some(48022), added: 50497, mode: MaxEncodedLen) - /// Storage: Balances Holds (r:1 w:1) - /// Proof: Balances Holds (max_values: None, max_size: Some(85), added: 2560, mode: MaxEncodedLen) - /// Storage: Nis QueueTotals (r:1 w:1) - /// Proof: Nis QueueTotals (max_values: Some(1), max_size: Some(6002), added: 6497, mode: MaxEncodedLen) + /// Storage: `Nis::Queues` (r:1 w:1) + /// Proof: `Nis::Queues` (`max_values`: None, `max_size`: Some(48022), added: 50497, mode: `MaxEncodedLen`) + /// Storage: `Balances::Holds` (r:1 w:1) + /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(193), added: 2668, mode: `MaxEncodedLen`) + /// Storage: `Nis::QueueTotals` (r:1 w:1) + /// Proof: `Nis::QueueTotals` (`max_values`: Some(1), `max_size`: Some(6002), added: 6497, mode: `MaxEncodedLen`) fn place_bid_max() -> Weight { // Proof Size summary in bytes: - // Measured: `54178` + // Measured: `54212` // Estimated: `51487` - // Minimum execution time: 119_696_000 picoseconds. - Weight::from_parts(121_838_000, 51487) + // Minimum execution time: 111_930_000 picoseconds. + Weight::from_parts(114_966_000, 51487) .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(3_u64)) } - /// Storage: Nis Queues (r:1 w:1) - /// Proof: Nis Queues (max_values: None, max_size: Some(48022), added: 50497, mode: MaxEncodedLen) - /// Storage: Balances Holds (r:1 w:1) - /// Proof: Balances Holds (max_values: None, max_size: Some(85), added: 2560, mode: MaxEncodedLen) - /// Storage: Nis QueueTotals (r:1 w:1) - /// Proof: Nis QueueTotals (max_values: Some(1), max_size: Some(6002), added: 6497, mode: MaxEncodedLen) + /// Storage: `Nis::Queues` (r:1 w:1) + /// Proof: `Nis::Queues` (`max_values`: None, `max_size`: Some(48022), added: 50497, mode: `MaxEncodedLen`) + /// Storage: `Balances::Holds` (r:1 w:1) + /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(193), added: 2668, mode: `MaxEncodedLen`) + /// Storage: `Nis::QueueTotals` (r:1 w:1) + /// Proof: `Nis::QueueTotals` (`max_values`: Some(1), `max_size`: Some(6002), added: 6497, mode: `MaxEncodedLen`) /// The range of component `l` is `[1, 1000]`. fn retract_bid(l: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `6176 + l * (48 ±0)` + // Measured: `6210 + l * (48 ±0)` // Estimated: `51487` - // Minimum execution time: 50_843_000 picoseconds. - Weight::from_parts(54_237_365, 51487) - // Standard Error: 243 - .saturating_add(Weight::from_parts(67_732, 0).saturating_mul(l.into())) + // Minimum execution time: 47_726_000 picoseconds. + Weight::from_parts(48_162_043, 51487) + // Standard Error: 187 + .saturating_add(Weight::from_parts(38_372, 0).saturating_mul(l.into())) .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(3_u64)) } - /// Storage: Nis Summary (r:1 w:0) - /// Proof: Nis Summary (max_values: Some(1), max_size: Some(40), added: 535, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: `Nis::Summary` (r:1 w:0) + /// Proof: `Nis::Summary` (`max_values`: Some(1), `max_size`: Some(40), added: 535, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) fn fund_deficit() -> Weight { // Proof Size summary in bytes: - // Measured: `191` + // Measured: `225` // Estimated: `3593` - // Minimum execution time: 40_752_000 picoseconds. - Weight::from_parts(41_899_000, 3593) + // Minimum execution time: 31_194_000 picoseconds. + Weight::from_parts(32_922_000, 3593) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: Nis Receipts (r:1 w:1) - /// Proof: Nis Receipts (max_values: None, max_size: Some(81), added: 2556, mode: MaxEncodedLen) - /// Storage: Balances Holds (r:1 w:1) - /// Proof: Balances Holds (max_values: None, max_size: Some(85), added: 2560, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) - /// Storage: Nis Summary (r:1 w:1) - /// Proof: Nis Summary (max_values: Some(1), max_size: Some(40), added: 535, mode: MaxEncodedLen) - /// Storage: Assets Asset (r:1 w:1) - /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) - /// Storage: Assets Account (r:1 w:1) - /// Proof: Assets Account (max_values: None, max_size: Some(134), added: 2609, mode: MaxEncodedLen) + /// Storage: `Nis::Receipts` (r:1 w:1) + /// Proof: `Nis::Receipts` (`max_values`: None, `max_size`: Some(81), added: 2556, mode: `MaxEncodedLen`) + /// Storage: `Balances::Holds` (r:1 w:1) + /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(193), added: 2668, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `Nis::Summary` (r:1 w:1) + /// Proof: `Nis::Summary` (`max_values`: Some(1), `max_size`: Some(40), added: 535, mode: `MaxEncodedLen`) + /// Storage: `Assets::Asset` (r:1 w:1) + /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) + /// Storage: `Assets::Account` (r:1 w:1) + /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) fn communify() -> Weight { // Proof Size summary in bytes: - // Measured: `668` + // Measured: `702` // Estimated: `3675` - // Minimum execution time: 79_779_000 picoseconds. - Weight::from_parts(82_478_000, 3675) + // Minimum execution time: 73_288_000 picoseconds. + Weight::from_parts(76_192_000, 3675) .saturating_add(T::DbWeight::get().reads(6_u64)) .saturating_add(T::DbWeight::get().writes(6_u64)) } - /// Storage: Nis Receipts (r:1 w:1) - /// Proof: Nis Receipts (max_values: None, max_size: Some(81), added: 2556, mode: MaxEncodedLen) - /// Storage: Nis Summary (r:1 w:1) - /// Proof: Nis Summary (max_values: Some(1), max_size: Some(40), added: 535, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) - /// Storage: Assets Asset (r:1 w:1) - /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) - /// Storage: Assets Account (r:1 w:1) - /// Proof: Assets Account (max_values: None, max_size: Some(134), added: 2609, mode: MaxEncodedLen) - /// Storage: Balances Holds (r:1 w:1) - /// Proof: Balances Holds (max_values: None, max_size: Some(85), added: 2560, mode: MaxEncodedLen) + /// Storage: `Nis::Receipts` (r:1 w:1) + /// Proof: `Nis::Receipts` (`max_values`: None, `max_size`: Some(81), added: 2556, mode: `MaxEncodedLen`) + /// Storage: `Nis::Summary` (r:1 w:1) + /// Proof: `Nis::Summary` (`max_values`: Some(1), `max_size`: Some(40), added: 535, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `Assets::Asset` (r:1 w:1) + /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) + /// Storage: `Assets::Account` (r:1 w:1) + /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) + /// Storage: `Balances::Holds` (r:1 w:1) + /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(193), added: 2668, mode: `MaxEncodedLen`) fn privatize() -> Weight { // Proof Size summary in bytes: - // Measured: `829` + // Measured: `863` // Estimated: `3675` - // Minimum execution time: 99_588_000 picoseconds. - Weight::from_parts(102_340_000, 3675) + // Minimum execution time: 94_307_000 picoseconds. + Weight::from_parts(96_561_000, 3675) .saturating_add(T::DbWeight::get().reads(6_u64)) .saturating_add(T::DbWeight::get().writes(6_u64)) } - /// Storage: Nis Receipts (r:1 w:1) - /// Proof: Nis Receipts (max_values: None, max_size: Some(81), added: 2556, mode: MaxEncodedLen) - /// Storage: Nis Summary (r:1 w:1) - /// Proof: Nis Summary (max_values: Some(1), max_size: Some(40), added: 535, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:0) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) - /// Storage: Balances Holds (r:1 w:1) - /// Proof: Balances Holds (max_values: None, max_size: Some(85), added: 2560, mode: MaxEncodedLen) + /// Storage: `Nis::Receipts` (r:1 w:1) + /// Proof: `Nis::Receipts` (`max_values`: None, `max_size`: Some(81), added: 2556, mode: `MaxEncodedLen`) + /// Storage: `Nis::Summary` (r:1 w:1) + /// Proof: `Nis::Summary` (`max_values`: Some(1), `max_size`: Some(40), added: 535, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:0) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `Balances::Holds` (r:1 w:1) + /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(193), added: 2668, mode: `MaxEncodedLen`) fn thaw_private() -> Weight { // Proof Size summary in bytes: - // Measured: `354` - // Estimated: `3593` - // Minimum execution time: 53_094_000 picoseconds. - Weight::from_parts(54_543_000, 3593) + // Measured: `388` + // Estimated: `3658` + // Minimum execution time: 49_873_000 picoseconds. + Weight::from_parts(51_361_000, 3658) .saturating_add(T::DbWeight::get().reads(4_u64)) .saturating_add(T::DbWeight::get().writes(3_u64)) } - /// Storage: Nis Receipts (r:1 w:1) - /// Proof: Nis Receipts (max_values: None, max_size: Some(81), added: 2556, mode: MaxEncodedLen) - /// Storage: Nis Summary (r:1 w:1) - /// Proof: Nis Summary (max_values: Some(1), max_size: Some(40), added: 535, mode: MaxEncodedLen) - /// Storage: Assets Asset (r:1 w:1) - /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) - /// Storage: Assets Account (r:1 w:1) - /// Proof: Assets Account (max_values: None, max_size: Some(134), added: 2609, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: `Nis::Receipts` (r:1 w:1) + /// Proof: `Nis::Receipts` (`max_values`: None, `max_size`: Some(81), added: 2556, mode: `MaxEncodedLen`) + /// Storage: `Nis::Summary` (r:1 w:1) + /// Proof: `Nis::Summary` (`max_values`: Some(1), `max_size`: Some(40), added: 535, mode: `MaxEncodedLen`) + /// Storage: `Assets::Asset` (r:1 w:1) + /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) + /// Storage: `Assets::Account` (r:1 w:1) + /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) fn thaw_communal() -> Weight { // Proof Size summary in bytes: - // Measured: `773` + // Measured: `807` // Estimated: `3675` - // Minimum execution time: 107_248_000 picoseconds. - Weight::from_parts(109_923_000, 3675) + // Minimum execution time: 96_884_000 picoseconds. + Weight::from_parts(98_867_000, 3675) .saturating_add(T::DbWeight::get().reads(5_u64)) .saturating_add(T::DbWeight::get().writes(5_u64)) } - /// Storage: Nis Summary (r:1 w:1) - /// Proof: Nis Summary (max_values: Some(1), max_size: Some(40), added: 535, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:0) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) - /// Storage: Nis QueueTotals (r:1 w:1) - /// Proof: Nis QueueTotals (max_values: Some(1), max_size: Some(6002), added: 6497, mode: MaxEncodedLen) + /// Storage: `Nis::Summary` (r:1 w:1) + /// Proof: `Nis::Summary` (`max_values`: Some(1), `max_size`: Some(40), added: 535, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:0) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `Nis::QueueTotals` (r:1 w:1) + /// Proof: `Nis::QueueTotals` (`max_values`: Some(1), `max_size`: Some(6002), added: 6497, mode: `MaxEncodedLen`) fn process_queues() -> Weight { // Proof Size summary in bytes: - // Measured: `6624` + // Measured: `6658` // Estimated: `7487` - // Minimum execution time: 27_169_000 picoseconds. - Weight::from_parts(29_201_000, 7487) + // Minimum execution time: 21_019_000 picoseconds. + Weight::from_parts(22_057_000, 7487) .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } - /// Storage: Nis Queues (r:1 w:1) - /// Proof: Nis Queues (max_values: None, max_size: Some(48022), added: 50497, mode: MaxEncodedLen) + /// Storage: `Nis::Queues` (r:1 w:1) + /// Proof: `Nis::Queues` (`max_values`: None, `max_size`: Some(48022), added: 50497, mode: `MaxEncodedLen`) fn process_queue() -> Weight { // Proof Size summary in bytes: - // Measured: `42` + // Measured: `76` // Estimated: `51487` - // Minimum execution time: 4_540_000 picoseconds. - Weight::from_parts(4_699_000, 51487) + // Minimum execution time: 4_746_000 picoseconds. + Weight::from_parts(4_953_000, 51487) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: Nis Receipts (r:0 w:1) - /// Proof: Nis Receipts (max_values: None, max_size: Some(81), added: 2556, mode: MaxEncodedLen) + /// Storage: `Nis::Receipts` (r:0 w:1) + /// Proof: `Nis::Receipts` (`max_values`: None, `max_size`: Some(81), added: 2556, mode: `MaxEncodedLen`) fn process_bid() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_085_000 picoseconds. - Weight::from_parts(7_336_000, 0) + // Minimum execution time: 4_836_000 picoseconds. + Weight::from_parts(5_093_000, 0) .saturating_add(T::DbWeight::get().writes(1_u64)) } } -// For backwards compatibility and tests +// For backwards compatibility and tests. impl WeightInfo for () { - /// Storage: Nis Queues (r:1 w:1) - /// Proof: Nis Queues (max_values: None, max_size: Some(48022), added: 50497, mode: MaxEncodedLen) - /// Storage: Balances Holds (r:1 w:1) - /// Proof: Balances Holds (max_values: None, max_size: Some(85), added: 2560, mode: MaxEncodedLen) - /// Storage: Nis QueueTotals (r:1 w:1) - /// Proof: Nis QueueTotals (max_values: Some(1), max_size: Some(6002), added: 6497, mode: MaxEncodedLen) + /// Storage: `Nis::Queues` (r:1 w:1) + /// Proof: `Nis::Queues` (`max_values`: None, `max_size`: Some(48022), added: 50497, mode: `MaxEncodedLen`) + /// Storage: `Balances::Holds` (r:1 w:1) + /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(193), added: 2668, mode: `MaxEncodedLen`) + /// Storage: `Nis::QueueTotals` (r:1 w:1) + /// Proof: `Nis::QueueTotals` (`max_values`: Some(1), `max_size`: Some(6002), added: 6497, mode: `MaxEncodedLen`) /// The range of component `l` is `[0, 999]`. fn place_bid(l: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `6176 + l * (48 ±0)` + // Measured: `6210 + l * (48 ±0)` // Estimated: `51487` - // Minimum execution time: 49_410_000 picoseconds. - Weight::from_parts(57_832_282, 51487) - // Standard Error: 288 - .saturating_add(Weight::from_parts(51_621, 0).saturating_mul(l.into())) + // Minimum execution time: 47_065_000 picoseconds. + Weight::from_parts(52_894_557, 51487) + // Standard Error: 275 + .saturating_add(Weight::from_parts(48_441, 0).saturating_mul(l.into())) .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(3_u64)) } - /// Storage: Nis Queues (r:1 w:1) - /// Proof: Nis Queues (max_values: None, max_size: Some(48022), added: 50497, mode: MaxEncodedLen) - /// Storage: Balances Holds (r:1 w:1) - /// Proof: Balances Holds (max_values: None, max_size: Some(85), added: 2560, mode: MaxEncodedLen) - /// Storage: Nis QueueTotals (r:1 w:1) - /// Proof: Nis QueueTotals (max_values: Some(1), max_size: Some(6002), added: 6497, mode: MaxEncodedLen) + /// Storage: `Nis::Queues` (r:1 w:1) + /// Proof: `Nis::Queues` (`max_values`: None, `max_size`: Some(48022), added: 50497, mode: `MaxEncodedLen`) + /// Storage: `Balances::Holds` (r:1 w:1) + /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(193), added: 2668, mode: `MaxEncodedLen`) + /// Storage: `Nis::QueueTotals` (r:1 w:1) + /// Proof: `Nis::QueueTotals` (`max_values`: Some(1), `max_size`: Some(6002), added: 6497, mode: `MaxEncodedLen`) fn place_bid_max() -> Weight { // Proof Size summary in bytes: - // Measured: `54178` + // Measured: `54212` // Estimated: `51487` - // Minimum execution time: 119_696_000 picoseconds. - Weight::from_parts(121_838_000, 51487) + // Minimum execution time: 111_930_000 picoseconds. + Weight::from_parts(114_966_000, 51487) .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(3_u64)) } - /// Storage: Nis Queues (r:1 w:1) - /// Proof: Nis Queues (max_values: None, max_size: Some(48022), added: 50497, mode: MaxEncodedLen) - /// Storage: Balances Holds (r:1 w:1) - /// Proof: Balances Holds (max_values: None, max_size: Some(85), added: 2560, mode: MaxEncodedLen) - /// Storage: Nis QueueTotals (r:1 w:1) - /// Proof: Nis QueueTotals (max_values: Some(1), max_size: Some(6002), added: 6497, mode: MaxEncodedLen) + /// Storage: `Nis::Queues` (r:1 w:1) + /// Proof: `Nis::Queues` (`max_values`: None, `max_size`: Some(48022), added: 50497, mode: `MaxEncodedLen`) + /// Storage: `Balances::Holds` (r:1 w:1) + /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(193), added: 2668, mode: `MaxEncodedLen`) + /// Storage: `Nis::QueueTotals` (r:1 w:1) + /// Proof: `Nis::QueueTotals` (`max_values`: Some(1), `max_size`: Some(6002), added: 6497, mode: `MaxEncodedLen`) /// The range of component `l` is `[1, 1000]`. fn retract_bid(l: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `6176 + l * (48 ±0)` + // Measured: `6210 + l * (48 ±0)` // Estimated: `51487` - // Minimum execution time: 50_843_000 picoseconds. - Weight::from_parts(54_237_365, 51487) - // Standard Error: 243 - .saturating_add(Weight::from_parts(67_732, 0).saturating_mul(l.into())) + // Minimum execution time: 47_726_000 picoseconds. + Weight::from_parts(48_162_043, 51487) + // Standard Error: 187 + .saturating_add(Weight::from_parts(38_372, 0).saturating_mul(l.into())) .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(3_u64)) } - /// Storage: Nis Summary (r:1 w:0) - /// Proof: Nis Summary (max_values: Some(1), max_size: Some(40), added: 535, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: `Nis::Summary` (r:1 w:0) + /// Proof: `Nis::Summary` (`max_values`: Some(1), `max_size`: Some(40), added: 535, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) fn fund_deficit() -> Weight { // Proof Size summary in bytes: - // Measured: `191` + // Measured: `225` // Estimated: `3593` - // Minimum execution time: 40_752_000 picoseconds. - Weight::from_parts(41_899_000, 3593) + // Minimum execution time: 31_194_000 picoseconds. + Weight::from_parts(32_922_000, 3593) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Nis Receipts (r:1 w:1) - /// Proof: Nis Receipts (max_values: None, max_size: Some(81), added: 2556, mode: MaxEncodedLen) - /// Storage: Balances Holds (r:1 w:1) - /// Proof: Balances Holds (max_values: None, max_size: Some(85), added: 2560, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) - /// Storage: Nis Summary (r:1 w:1) - /// Proof: Nis Summary (max_values: Some(1), max_size: Some(40), added: 535, mode: MaxEncodedLen) - /// Storage: Assets Asset (r:1 w:1) - /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) - /// Storage: Assets Account (r:1 w:1) - /// Proof: Assets Account (max_values: None, max_size: Some(134), added: 2609, mode: MaxEncodedLen) + /// Storage: `Nis::Receipts` (r:1 w:1) + /// Proof: `Nis::Receipts` (`max_values`: None, `max_size`: Some(81), added: 2556, mode: `MaxEncodedLen`) + /// Storage: `Balances::Holds` (r:1 w:1) + /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(193), added: 2668, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `Nis::Summary` (r:1 w:1) + /// Proof: `Nis::Summary` (`max_values`: Some(1), `max_size`: Some(40), added: 535, mode: `MaxEncodedLen`) + /// Storage: `Assets::Asset` (r:1 w:1) + /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) + /// Storage: `Assets::Account` (r:1 w:1) + /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) fn communify() -> Weight { // Proof Size summary in bytes: - // Measured: `668` + // Measured: `702` // Estimated: `3675` - // Minimum execution time: 79_779_000 picoseconds. - Weight::from_parts(82_478_000, 3675) + // Minimum execution time: 73_288_000 picoseconds. + Weight::from_parts(76_192_000, 3675) .saturating_add(RocksDbWeight::get().reads(6_u64)) .saturating_add(RocksDbWeight::get().writes(6_u64)) } - /// Storage: Nis Receipts (r:1 w:1) - /// Proof: Nis Receipts (max_values: None, max_size: Some(81), added: 2556, mode: MaxEncodedLen) - /// Storage: Nis Summary (r:1 w:1) - /// Proof: Nis Summary (max_values: Some(1), max_size: Some(40), added: 535, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) - /// Storage: Assets Asset (r:1 w:1) - /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) - /// Storage: Assets Account (r:1 w:1) - /// Proof: Assets Account (max_values: None, max_size: Some(134), added: 2609, mode: MaxEncodedLen) - /// Storage: Balances Holds (r:1 w:1) - /// Proof: Balances Holds (max_values: None, max_size: Some(85), added: 2560, mode: MaxEncodedLen) + /// Storage: `Nis::Receipts` (r:1 w:1) + /// Proof: `Nis::Receipts` (`max_values`: None, `max_size`: Some(81), added: 2556, mode: `MaxEncodedLen`) + /// Storage: `Nis::Summary` (r:1 w:1) + /// Proof: `Nis::Summary` (`max_values`: Some(1), `max_size`: Some(40), added: 535, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `Assets::Asset` (r:1 w:1) + /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) + /// Storage: `Assets::Account` (r:1 w:1) + /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) + /// Storage: `Balances::Holds` (r:1 w:1) + /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(193), added: 2668, mode: `MaxEncodedLen`) fn privatize() -> Weight { // Proof Size summary in bytes: - // Measured: `829` + // Measured: `863` // Estimated: `3675` - // Minimum execution time: 99_588_000 picoseconds. - Weight::from_parts(102_340_000, 3675) + // Minimum execution time: 94_307_000 picoseconds. + Weight::from_parts(96_561_000, 3675) .saturating_add(RocksDbWeight::get().reads(6_u64)) .saturating_add(RocksDbWeight::get().writes(6_u64)) } - /// Storage: Nis Receipts (r:1 w:1) - /// Proof: Nis Receipts (max_values: None, max_size: Some(81), added: 2556, mode: MaxEncodedLen) - /// Storage: Nis Summary (r:1 w:1) - /// Proof: Nis Summary (max_values: Some(1), max_size: Some(40), added: 535, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:0) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) - /// Storage: Balances Holds (r:1 w:1) - /// Proof: Balances Holds (max_values: None, max_size: Some(85), added: 2560, mode: MaxEncodedLen) + /// Storage: `Nis::Receipts` (r:1 w:1) + /// Proof: `Nis::Receipts` (`max_values`: None, `max_size`: Some(81), added: 2556, mode: `MaxEncodedLen`) + /// Storage: `Nis::Summary` (r:1 w:1) + /// Proof: `Nis::Summary` (`max_values`: Some(1), `max_size`: Some(40), added: 535, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:0) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `Balances::Holds` (r:1 w:1) + /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(193), added: 2668, mode: `MaxEncodedLen`) fn thaw_private() -> Weight { // Proof Size summary in bytes: - // Measured: `354` - // Estimated: `3593` - // Minimum execution time: 53_094_000 picoseconds. - Weight::from_parts(54_543_000, 3593) + // Measured: `388` + // Estimated: `3658` + // Minimum execution time: 49_873_000 picoseconds. + Weight::from_parts(51_361_000, 3658) .saturating_add(RocksDbWeight::get().reads(4_u64)) .saturating_add(RocksDbWeight::get().writes(3_u64)) } - /// Storage: Nis Receipts (r:1 w:1) - /// Proof: Nis Receipts (max_values: None, max_size: Some(81), added: 2556, mode: MaxEncodedLen) - /// Storage: Nis Summary (r:1 w:1) - /// Proof: Nis Summary (max_values: Some(1), max_size: Some(40), added: 535, mode: MaxEncodedLen) - /// Storage: Assets Asset (r:1 w:1) - /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) - /// Storage: Assets Account (r:1 w:1) - /// Proof: Assets Account (max_values: None, max_size: Some(134), added: 2609, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: `Nis::Receipts` (r:1 w:1) + /// Proof: `Nis::Receipts` (`max_values`: None, `max_size`: Some(81), added: 2556, mode: `MaxEncodedLen`) + /// Storage: `Nis::Summary` (r:1 w:1) + /// Proof: `Nis::Summary` (`max_values`: Some(1), `max_size`: Some(40), added: 535, mode: `MaxEncodedLen`) + /// Storage: `Assets::Asset` (r:1 w:1) + /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) + /// Storage: `Assets::Account` (r:1 w:1) + /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) fn thaw_communal() -> Weight { // Proof Size summary in bytes: - // Measured: `773` + // Measured: `807` // Estimated: `3675` - // Minimum execution time: 107_248_000 picoseconds. - Weight::from_parts(109_923_000, 3675) + // Minimum execution time: 96_884_000 picoseconds. + Weight::from_parts(98_867_000, 3675) .saturating_add(RocksDbWeight::get().reads(5_u64)) .saturating_add(RocksDbWeight::get().writes(5_u64)) } - /// Storage: Nis Summary (r:1 w:1) - /// Proof: Nis Summary (max_values: Some(1), max_size: Some(40), added: 535, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:0) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) - /// Storage: Nis QueueTotals (r:1 w:1) - /// Proof: Nis QueueTotals (max_values: Some(1), max_size: Some(6002), added: 6497, mode: MaxEncodedLen) + /// Storage: `Nis::Summary` (r:1 w:1) + /// Proof: `Nis::Summary` (`max_values`: Some(1), `max_size`: Some(40), added: 535, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:0) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `Nis::QueueTotals` (r:1 w:1) + /// Proof: `Nis::QueueTotals` (`max_values`: Some(1), `max_size`: Some(6002), added: 6497, mode: `MaxEncodedLen`) fn process_queues() -> Weight { // Proof Size summary in bytes: - // Measured: `6624` + // Measured: `6658` // Estimated: `7487` - // Minimum execution time: 27_169_000 picoseconds. - Weight::from_parts(29_201_000, 7487) + // Minimum execution time: 21_019_000 picoseconds. + Weight::from_parts(22_057_000, 7487) .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } - /// Storage: Nis Queues (r:1 w:1) - /// Proof: Nis Queues (max_values: None, max_size: Some(48022), added: 50497, mode: MaxEncodedLen) + /// Storage: `Nis::Queues` (r:1 w:1) + /// Proof: `Nis::Queues` (`max_values`: None, `max_size`: Some(48022), added: 50497, mode: `MaxEncodedLen`) fn process_queue() -> Weight { // Proof Size summary in bytes: - // Measured: `42` + // Measured: `76` // Estimated: `51487` - // Minimum execution time: 4_540_000 picoseconds. - Weight::from_parts(4_699_000, 51487) + // Minimum execution time: 4_746_000 picoseconds. + Weight::from_parts(4_953_000, 51487) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Nis Receipts (r:0 w:1) - /// Proof: Nis Receipts (max_values: None, max_size: Some(81), added: 2556, mode: MaxEncodedLen) + /// Storage: `Nis::Receipts` (r:0 w:1) + /// Proof: `Nis::Receipts` (`max_values`: None, `max_size`: Some(81), added: 2556, mode: `MaxEncodedLen`) fn process_bid() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_085_000 picoseconds. - Weight::from_parts(7_336_000, 0) + // Minimum execution time: 4_836_000 picoseconds. + Weight::from_parts(5_093_000, 0) .saturating_add(RocksDbWeight::get().writes(1_u64)) } } diff --git a/substrate/frame/node-authorization/Cargo.toml b/substrate/frame/node-authorization/Cargo.toml index ac139853cdbd322c7aaba6743077186ebaf4ebc0..63376163cdcb78baa03a266189d3e52ee13466a7 100644 --- a/substrate/frame/node-authorization/Cargo.toml +++ b/substrate/frame/node-authorization/Cargo.toml @@ -16,8 +16,8 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } -log = { version = "0.4.17", default-features = false } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +log = { workspace = true } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } frame-support = { path = "../support", default-features = false } frame-system = { path = "../system", default-features = false } sp-core = { path = "../../primitives/core", default-features = false } diff --git a/substrate/frame/node-authorization/src/lib.rs b/substrate/frame/node-authorization/src/lib.rs index 8a823d29f2355bc6b3cbf4fe8e25906448f2888b..9019a863ad8124fdb8aacac6a8e532d860861730 100644 --- a/substrate/frame/node-authorization/src/lib.rs +++ b/substrate/frame/node-authorization/src/lib.rs @@ -18,7 +18,7 @@ //! # Node authorization pallet //! //! This pallet manages a configurable set of nodes for a permissioned network. -//! Each node is dentified by a PeerId (i.e. `Vec`). It provides two ways to +//! Each node is identified by a PeerId (i.e. `Vec`). It provides two ways to //! authorize a node, //! //! - a set of well known nodes across different organizations in which the @@ -102,7 +102,7 @@ pub mod pallet { #[pallet::getter(fn owners)] pub type Owners = StorageMap<_, Blake2_128Concat, PeerId, T::AccountId>; - /// The additional adapative connections of each node. + /// The additional adaptive connections of each node. #[pallet::storage] #[pallet::getter(fn additional_connection)] pub type AdditionalConnections = @@ -161,7 +161,7 @@ pub mod pallet { NotClaimed, /// You are not the owner of the node. NotOwner, - /// No permisson to perform specific operation. + /// No permission to perform specific operation. PermissionDenied, } @@ -377,7 +377,7 @@ pub mod pallet { /// Add additional connections to a given node. /// /// - `node`: identifier of the node. - /// - `connections`: additonal nodes from which the connections are allowed. + /// - `connections`: additional nodes from which the connections are allowed. #[pallet::call_index(7)] #[pallet::weight(T::WeightInfo::add_connections())] pub fn add_connections( @@ -412,7 +412,7 @@ pub mod pallet { /// Remove additional connections of a given node. /// /// - `node`: identifier of the node. - /// - `connections`: additonal nodes from which the connections are not allowed anymore. + /// - `connections`: additional nodes from which the connections are not allowed anymore. #[pallet::call_index(8)] #[pallet::weight(T::WeightInfo::remove_connections())] pub fn remove_connections( diff --git a/substrate/frame/node-authorization/src/mock.rs b/substrate/frame/node-authorization/src/mock.rs index bd648de2b243c781c6db8c7e9375add8ee07dcf4..656d2bfa39ad3d4b2ac22c135691c66dd9079b4a 100644 --- a/substrate/frame/node-authorization/src/mock.rs +++ b/substrate/frame/node-authorization/src/mock.rs @@ -20,16 +20,9 @@ use super::*; use crate as pallet_node_authorization; -use frame_support::{ - derive_impl, ord_parameter_types, - traits::{ConstU32, ConstU64}, -}; +use frame_support::{derive_impl, ord_parameter_types, traits::ConstU32}; use frame_system::EnsureSignedBy; -use sp_core::H256; -use sp_runtime::{ - traits::{BlakeTwo256, IdentityLookup}, - BuildStorage, -}; +use sp_runtime::BuildStorage; type Block = frame_system::mocking::MockBlock; @@ -41,31 +34,9 @@ frame_support::construct_runtime!( } ); -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { - type BaseCallFilter = frame_support::traits::Everything; - type DbWeight = (); - type BlockWeights = (); - type BlockLength = (); - type RuntimeOrigin = RuntimeOrigin; - type Nonce = u64; - type Hash = H256; - type RuntimeCall = RuntimeCall; - type Hashing = BlakeTwo256; - type AccountId = u64; - type Lookup = IdentityLookup; type Block = Block; - type RuntimeEvent = RuntimeEvent; - type BlockHashCount = ConstU64<250>; - type Version = (); - type PalletInfo = PalletInfo; - type AccountData = (); - type OnNewAccount = (); - type OnKilledAccount = (); - type SystemWeightInfo = (); - type SS58Prefix = (); - type OnSetCode = (); - type MaxConsumers = ConstU32<16>; } ord_parameter_types! { diff --git a/substrate/frame/node-authorization/src/weights.rs b/substrate/frame/node-authorization/src/weights.rs index a4529c845c7c0e4b15a542cdaa07fc01e5279efe..881eeaf7a4c090573eab463494fd9a6846ae4b40 100644 --- a/substrate/frame/node-authorization/src/weights.rs +++ b/substrate/frame/node-authorization/src/weights.rs @@ -22,7 +22,7 @@ #![allow(unused_imports)] use frame_support::{traits::Get, weights::{Weight, constants::RocksDbWeight}}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; pub trait WeightInfo { fn add_well_known_node() -> Weight; diff --git a/substrate/frame/nomination-pools/Cargo.toml b/substrate/frame/nomination-pools/Cargo.toml index cac092c98dc400815ef3a8b221b43e6a948be888..55e9ef6fbd3382f65f2d4be3cfdb5eed1b318345 100644 --- a/substrate/frame/nomination-pools/Cargo.toml +++ b/substrate/frame/nomination-pools/Cargo.toml @@ -19,7 +19,7 @@ targets = ["x86_64-unknown-linux-gnu"] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = [ "derive", ] } -scale-info = { version = "2.10.0", default-features = false, features = [ +scale-info = { version = "2.11.1", default-features = false, features = [ "derive", ] } @@ -31,7 +31,7 @@ sp-std = { path = "../../primitives/std", default-features = false } sp-staking = { path = "../../primitives/staking", default-features = false } sp-core = { path = "../../primitives/core", default-features = false } sp-io = { path = "../../primitives/io", default-features = false } -log = { version = "0.4.0", default-features = false } +log = { workspace = true } # Optional: use for testing and/or fuzzing pallet-balances = { path = "../balances", optional = true } diff --git a/substrate/frame/nomination-pools/benchmarking/Cargo.toml b/substrate/frame/nomination-pools/benchmarking/Cargo.toml index 3693ad1866dd4ca0dfeb5d25d9844a3c0b28c111..4985d7acbec92f8258f32338bc348981922c53a9 100644 --- a/substrate/frame/nomination-pools/benchmarking/Cargo.toml +++ b/substrate/frame/nomination-pools/benchmarking/Cargo.toml @@ -18,7 +18,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] # parity codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } # FRAME frame-benchmarking = { path = "../../benchmarking", default-features = false } diff --git a/substrate/frame/nomination-pools/benchmarking/src/lib.rs b/substrate/frame/nomination-pools/benchmarking/src/lib.rs index 48d7dae29ef03f9e6615df19d0092f662ce3cda2..f7df173ec04eab4c681757ec21d01654b9fff9a6 100644 --- a/substrate/frame/nomination-pools/benchmarking/src/lib.rs +++ b/substrate/frame/nomination-pools/benchmarking/src/lib.rs @@ -795,9 +795,9 @@ frame_benchmarking::benchmarks! { T::Staking::active_stake(&pool_account).unwrap(), min_create_bond + min_join_bond ); - }:_(RuntimeOrigin::Signed(joiner.clone()), ClaimPermission::PermissionlessAll) + }:_(RuntimeOrigin::Signed(joiner.clone()), ClaimPermission::Permissioned) verify { - assert_eq!(ClaimPermissions::::get(joiner), ClaimPermission::PermissionlessAll); + assert_eq!(ClaimPermissions::::get(joiner), ClaimPermission::Permissioned); } claim_commission { diff --git a/substrate/frame/nomination-pools/benchmarking/src/mock.rs b/substrate/frame/nomination-pools/benchmarking/src/mock.rs index 4e57c00849f2d54a140deb36d7b60109aa59e9c9..a59f8f3f40e7f6e67ca3163edb56b43257fdc6ee 100644 --- a/substrate/frame/nomination-pools/benchmarking/src/mock.rs +++ b/substrate/frame/nomination-pools/benchmarking/src/mock.rs @@ -28,7 +28,7 @@ type Nonce = u32; type BlockNumber = u64; type Balance = u128; -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Runtime { type BaseCallFilter = frame_support::traits::Everything; type BlockWeights = (); @@ -172,6 +172,7 @@ impl pallet_nomination_pools::Config for Runtime { type MaxUnbonding = ConstU32<8>; type PalletId = PoolsPalletId; type MaxPointsToBalance = MaxPointsToBalance; + type AdminOrigin = frame_system::EnsureRoot; } impl crate::Config for Runtime {} diff --git a/substrate/frame/nomination-pools/fuzzer/Cargo.toml b/substrate/frame/nomination-pools/fuzzer/Cargo.toml index 52f49b28457c26c3c247dd4c137565cd9564dcc8..c0d63a2685937a10e6a53288403099bc78ed1fa9 100644 --- a/substrate/frame/nomination-pools/fuzzer/Cargo.toml +++ b/substrate/frame/nomination-pools/fuzzer/Cargo.toml @@ -29,7 +29,7 @@ sp-io = { path = "../../../primitives/io" } sp-tracing = { path = "../../../primitives/tracing" } rand = { version = "0.8.5", features = ["small_rng"] } -log = "0.4.17" +log = { workspace = true, default-features = true } [[bin]] name = "call" diff --git a/substrate/frame/nomination-pools/src/lib.rs b/substrate/frame/nomination-pools/src/lib.rs index c2653d8bdabcc5a0bcc9378bd300252faf829ff6..0fdb7e3eff5ccca340a5b26f00010e0240377e03 100644 --- a/substrate/frame/nomination-pools/src/lib.rs +++ b/substrate/frame/nomination-pools/src/lib.rs @@ -451,7 +451,7 @@ enum AccountType { /// The permission a pool member can set for other accounts to claim rewards on their behalf. #[derive(Encode, Decode, MaxEncodedLen, Clone, Copy, Debug, PartialEq, Eq, TypeInfo)] pub enum ClaimPermission { - /// Only the pool member themself can claim their rewards. + /// Only the pool member themselves can claim their rewards. Permissioned, /// Anyone can compound rewards on a pool member's behalf. PermissionlessCompound, @@ -461,22 +461,26 @@ pub enum ClaimPermission { PermissionlessAll, } +impl Default for ClaimPermission { + fn default() -> Self { + Self::PermissionlessWithdraw + } +} + impl ClaimPermission { + /// Permissionless compounding of pool rewards is allowed if the current permission is + /// `PermissionlessCompound`, or permissionless. fn can_bond_extra(&self) -> bool { matches!(self, ClaimPermission::PermissionlessAll | ClaimPermission::PermissionlessCompound) } + /// Permissionless payout claiming is allowed if the current permission is + /// `PermissionlessWithdraw`, or permissionless. fn can_claim_payout(&self) -> bool { matches!(self, ClaimPermission::PermissionlessAll | ClaimPermission::PermissionlessWithdraw) } } -impl Default for ClaimPermission { - fn default() -> Self { - Self::Permissioned - } -} - /// A member in a pool. #[derive( Encode, @@ -1293,27 +1297,6 @@ impl BondedPool { }); }; } - - /// Withdraw all the funds that are already unlocked from staking for the - /// [`BondedPool::bonded_account`]. - /// - /// Also reduces the [`TotalValueLocked`] by the difference of the - /// [`T::Staking::total_stake`] of the [`BondedPool::bonded_account`] that might occur by - /// [`T::Staking::withdraw_unbonded`]. - /// - /// Returns the result of [`T::Staking::withdraw_unbonded`] - fn withdraw_from_staking(&self, num_slashing_spans: u32) -> Result { - let bonded_account = self.bonded_account(); - - let prev_total = T::Staking::total_stake(&bonded_account.clone()).unwrap_or_default(); - let outcome = T::Staking::withdraw_unbonded(bonded_account.clone(), num_slashing_spans); - let diff = prev_total - .defensive_saturating_sub(T::Staking::total_stake(&bonded_account).unwrap_or_default()); - TotalValueLocked::::mutate(|tvl| { - tvl.saturating_reduce(diff); - }); - outcome - } } /// A reward pool. @@ -1597,7 +1580,7 @@ pub mod pallet { use frame_system::{ensure_signed, pallet_prelude::*}; use sp_runtime::Perbill; - /// The current storage version. + /// The in-code storage version. const STORAGE_VERSION: StorageVersion = StorageVersion::new(8); #[pallet::pallet] @@ -1674,6 +1657,9 @@ pub mod pallet { /// The maximum length, in bytes, that a pools metadata maybe. type MaxMetadataLen: Get; + + /// The origin that can manage pool configurations. + type AdminOrigin: EnsureOrigin; } /// The sum of funds across all pools. @@ -1733,7 +1719,7 @@ pub mod pallet { CountedStorageMap<_, Twox64Concat, PoolId, BondedPoolInner>; /// Reward pools. This is where there rewards for each pool accumulate. When a members payout is - /// claimed, the balance comes out fo the reward pool. Keyed by the bonded pools account. + /// claimed, the balance comes out of the reward pool. Keyed by the bonded pools account. #[pallet::storage] pub type RewardPools = CountedStorageMap<_, Twox64Concat, PoolId, RewardPool>; @@ -1753,8 +1739,8 @@ pub mod pallet { /// A reverse lookup from the pool's account id to its id. /// - /// This is only used for slashing. In all other instances, the pool id is used, and the - /// accounts are deterministically derived from it. + /// This is only used for slashing and on automatic withdraw update. In all other instances, the + /// pool id is used, and the accounts are deterministically derived from it. #[pallet::storage] pub type ReversePoolIdLookup = CountedStorageMap<_, Twox64Concat, T::AccountId, PoolId, OptionQuery>; @@ -2087,7 +2073,7 @@ pub mod pallet { /// The member will earn rewards pro rata based on the members stake vs the sum of the /// members in the pools stake. Rewards do not "expire". /// - /// See `claim_payout_other` to caim rewards on bahalf of some `other` pool member. + /// See `claim_payout_other` to claim rewards on behalf of some `other` pool member. #[pallet::call_index(2)] #[pallet::weight(T::WeightInfo::claim_payout())] pub fn claim_payout(origin: OriginFor) -> DispatchResult { @@ -2223,7 +2209,7 @@ pub mod pallet { // For now we only allow a pool to withdraw unbonded if its not destroying. If the pool // is destroying then `withdraw_unbonded` can be used. ensure!(pool.state != PoolState::Destroying, Error::::NotDestroying); - pool.withdraw_from_staking(num_slashing_spans)?; + T::Staking::withdraw_unbonded(pool.bonded_account(), num_slashing_spans)?; Ok(()) } @@ -2275,7 +2261,8 @@ pub mod pallet { // Before calculating the `balance_to_unbond`, we call withdraw unbonded to ensure the // `transferrable_balance` is correct. - let stash_killed = bonded_pool.withdraw_from_staking(num_slashing_spans)?; + let stash_killed = + T::Staking::withdraw_unbonded(bonded_pool.bonded_account(), num_slashing_spans)?; // defensive-only: the depositor puts enough funds into the stash so that it will only // be destroyed when they are leaving. @@ -2421,6 +2408,11 @@ pub mod pallet { /// /// This directly forward the call to the staking pallet, on behalf of the pool bonded /// account. + /// + /// # Note + /// + /// In addition to a `root` or `nominator` role of `origin`, pool's depositor needs to have + /// at least `depositor_min_bond` in the pool to start nominating. #[pallet::call_index(8)] #[pallet::weight(T::WeightInfo::nominate(validators.len() as u32))] pub fn nominate( @@ -2431,6 +2423,16 @@ pub mod pallet { let who = ensure_signed(origin)?; let bonded_pool = BondedPool::::get(pool_id).ok_or(Error::::PoolNotFound)?; ensure!(bonded_pool.can_nominate(&who), Error::::NotNominator); + + let depositor_points = PoolMembers::::get(&bonded_pool.roles.depositor) + .ok_or(Error::::PoolMemberNotFound)? + .active_points(); + + ensure!( + bonded_pool.points_to_balance(depositor_points) >= Self::depositor_min_bond(), + Error::::MinimumBondNotMet + ); + T::Staking::nominate(&bonded_pool.bonded_account(), validators) } @@ -2496,7 +2498,7 @@ pub mod pallet { } /// Update configurations for the nomination pools. The origin for this call must be - /// Root. + /// [`Config::AdminOrigin`]. /// /// # Arguments /// @@ -2517,7 +2519,7 @@ pub mod pallet { max_members_per_pool: ConfigOp, global_max_commission: ConfigOp, ) -> DispatchResult { - ensure_root(origin)?; + T::AdminOrigin::ensure_origin(origin)?; macro_rules! config_op_exp { ($storage:ty, $op:ident) => { @@ -2593,17 +2595,37 @@ pub mod pallet { /// Chill on behalf of the pool. /// - /// The dispatch origin of this call must be signed by the pool nominator or the pool + /// The dispatch origin of this call can be signed by the pool nominator or the pool /// root role, same as [`Pallet::nominate`]. /// + /// Under certain conditions, this call can be dispatched permissionlessly (i.e. by any + /// account). + /// + /// # Conditions for a permissionless dispatch: + /// * When pool depositor has less than `MinNominatorBond` staked, otherwise pool members + /// are unable to unbond. + /// + /// # Conditions for permissioned dispatch: + /// * The caller has a nominator or root role of the pool. /// This directly forward the call to the staking pallet, on behalf of the pool bonded /// account. #[pallet::call_index(13)] #[pallet::weight(T::WeightInfo::chill())] pub fn chill(origin: OriginFor, pool_id: PoolId) -> DispatchResult { let who = ensure_signed(origin)?; + let bonded_pool = BondedPool::::get(pool_id).ok_or(Error::::PoolNotFound)?; - ensure!(bonded_pool.can_nominate(&who), Error::::NotNominator); + + let depositor_points = PoolMembers::::get(&bonded_pool.roles.depositor) + .ok_or(Error::::PoolMemberNotFound)? + .active_points(); + + if bonded_pool.points_to_balance(depositor_points) >= + T::Staking::minimum_nominator_bond() + { + ensure!(bonded_pool.can_nominate(&who), Error::::NotNominator); + } + T::Staking::chill(&bonded_pool.bonded_account()) } @@ -2615,7 +2637,7 @@ pub mod pallet { /// /// In the case of `origin != other`, `origin` can only bond extra pending rewards of /// `other` members assuming set_claim_permission for the given member is - /// `PermissionlessAll` or `PermissionlessCompound`. + /// `PermissionlessCompound` or `PermissionlessAll`. #[pallet::call_index(14)] #[pallet::weight( T::WeightInfo::bond_extra_transfer() @@ -2633,15 +2655,10 @@ pub mod pallet { /// Allows a pool member to set a claim permission to allow or disallow permissionless /// bonding and withdrawing. /// - /// By default, this is `Permissioned`, which implies only the pool member themselves can - /// claim their pending rewards. If a pool member wishes so, they can set this to - /// `PermissionlessAll` to allow any account to claim their rewards and bond extra to the - /// pool. - /// /// # Arguments /// /// * `origin` - Member of a pool. - /// * `actor` - Account to claim reward. // improve this + /// * `permission` - The permission to be applied. #[pallet::call_index(15)] #[pallet::weight(T::DbWeight::get().reads_writes(1, 1))] pub fn set_claim_permission( @@ -2651,16 +2668,18 @@ pub mod pallet { let who = ensure_signed(origin)?; ensure!(PoolMembers::::contains_key(&who), Error::::PoolMemberNotFound); + ClaimPermissions::::mutate(who, |source| { *source = permission; }); + Ok(()) } /// `origin` can claim payouts on some pool member `other`'s behalf. /// - /// Pool member `other` must have a `PermissionlessAll` or `PermissionlessWithdraw` in order - /// for this call to be successful. + /// Pool member `other` must have a `PermissionlessWithdraw` or `PermissionlessAll` claim + /// permission for this call to be successful. #[pallet::call_index(16)] #[pallet::weight(T::WeightInfo::claim_payout())] pub fn claim_payout_other(origin: OriginFor, other: T::AccountId) -> DispatchResult { @@ -2782,7 +2801,7 @@ pub mod pallet { /// Set or remove a pool's commission claim permission. /// /// Determines who can claim the pool's pending commission. Only the `Root` role of the pool - /// is able to conifigure commission claim permissions. + /// is able to configure commission claim permissions. #[pallet::call_index(22)] #[pallet::weight(T::WeightInfo::set_commission_claim_permission())] pub fn set_commission_claim_permission( @@ -2821,7 +2840,7 @@ pub mod pallet { assert!( T::Staking::bonding_duration() < TotalUnbondingPools::::get(), "There must be more unbonding pools then the bonding duration / - so a slash can be applied to relevant unboding pools. (We assume / + so a slash can be applied to relevant unbonding pools. (We assume / the bonding duration > slash deffer duration.", ); } @@ -3628,4 +3647,14 @@ impl sp_staking::OnStakingUpdate> for Pall } Self::deposit_event(Event::::PoolSlashed { pool_id, balance: slashed_bonded }); } + + /// Reduces the overall `TotalValueLocked` if a withdrawal happened for a pool involved in the + /// staking withdraw. + fn on_withdraw(pool_account: &T::AccountId, amount: BalanceOf) { + if ReversePoolIdLookup::::get(pool_account).is_some() { + TotalValueLocked::::mutate(|tvl| { + tvl.saturating_reduce(amount); + }); + } + } } diff --git a/substrate/frame/nomination-pools/src/migration.rs b/substrate/frame/nomination-pools/src/migration.rs index 559baf76e4c64c5893d44c15d3505a9083ed76db..796b310862afcb8b897d4dafd66395e33e1970fb 100644 --- a/substrate/frame/nomination-pools/src/migration.rs +++ b/substrate/frame/nomination-pools/src/migration.rs @@ -17,7 +17,7 @@ use super::*; use crate::log; -use frame_support::traits::OnRuntimeUpgrade; +use frame_support::traits::{OnRuntimeUpgrade, UncheckedOnRuntimeUpgrade}; use sp_std::{collections::btree_map::BTreeMap, vec::Vec}; #[cfg(feature = "try-runtime")] @@ -56,6 +56,59 @@ pub mod versioned { >; } +pub mod unversioned { + use super::*; + + /// Checks and updates `TotalValueLocked` if out of sync. + pub struct TotalValueLockedSync(sp_std::marker::PhantomData); + impl OnRuntimeUpgrade for TotalValueLockedSync { + #[cfg(feature = "try-runtime")] + fn pre_upgrade() -> Result, TryRuntimeError> { + Ok(Vec::new()) + } + + fn on_runtime_upgrade() -> Weight { + let migrated = BondedPools::::count(); + + // recalculate the `TotalValueLocked` to compare with the current on-chain TVL which may + // be out of sync. + let tvl: BalanceOf = helpers::calculate_tvl_by_total_stake::(); + let onchain_tvl = TotalValueLocked::::get(); + + let writes = if tvl != onchain_tvl { + TotalValueLocked::::set(tvl); + + log!( + info, + "on-chain TVL was out of sync, update. Old: {:?}, new: {:?}", + onchain_tvl, + tvl + ); + + // writes: onchain version + set total value locked. + 2 + } else { + log!(info, "on-chain TVL was OK: {:?}", tvl); + + // writes: onchain version write. + 1 + }; + + // reads: migrated * (BondedPools + Staking::total_stake) + count + onchain + // version + // + // writes: current version + (maybe) TVL + T::DbWeight::get() + .reads_writes(migrated.saturating_mul(2).saturating_add(2).into(), writes) + } + + #[cfg(feature = "try-runtime")] + fn post_upgrade(_: Vec) -> Result<(), TryRuntimeError> { + Ok(()) + } + } +} + pub mod v8 { use super::{v7::V7BondedPoolInner, *}; @@ -79,7 +132,7 @@ pub mod v8 { } pub struct VersionUncheckedMigrateV7ToV8(sp_std::marker::PhantomData); - impl OnRuntimeUpgrade for VersionUncheckedMigrateV7ToV8 { + impl UncheckedOnRuntimeUpgrade for VersionUncheckedMigrateV7ToV8 { #[cfg(feature = "try-runtime")] fn pre_upgrade() -> Result, TryRuntimeError> { Ok(Vec::new()) @@ -146,6 +199,7 @@ pub(crate) mod v7 { } impl V7BondedPool { + #[allow(dead_code)] fn bonded_account(&self) -> T::AccountId { Pallet::::create_bonded_account(self.id) } @@ -157,26 +211,12 @@ pub(crate) mod v7 { CountedStorageMap, Twox64Concat, PoolId, V7BondedPoolInner>; pub struct VersionUncheckedMigrateV6ToV7(sp_std::marker::PhantomData); - impl VersionUncheckedMigrateV6ToV7 { - fn calculate_tvl_by_total_stake() -> BalanceOf { - BondedPools::::iter() - .map(|(id, inner)| { - T::Staking::total_stake( - &V7BondedPool { id, inner: inner.clone() }.bonded_account(), - ) - .unwrap_or_default() - }) - .reduce(|acc, total_balance| acc + total_balance) - .unwrap_or_default() - } - } - - impl OnRuntimeUpgrade for VersionUncheckedMigrateV6ToV7 { + impl UncheckedOnRuntimeUpgrade for VersionUncheckedMigrateV6ToV7 { fn on_runtime_upgrade() -> Weight { let migrated = BondedPools::::count(); // The TVL should be the sum of all the funds that are actively staked and in the // unbonding process of the account of each pool. - let tvl: BalanceOf = Self::calculate_tvl_by_total_stake(); + let tvl: BalanceOf = helpers::calculate_tvl_by_total_stake::(); TotalValueLocked::::set(tvl); @@ -198,7 +238,7 @@ pub(crate) mod v7 { fn post_upgrade(_data: Vec) -> Result<(), TryRuntimeError> { // check that the `TotalValueLocked` written is actually the sum of `total_stake` of the // `BondedPools`` - let tvl: BalanceOf = Self::calculate_tvl_by_total_stake(); + let tvl: BalanceOf = helpers::calculate_tvl_by_total_stake::(); ensure!( TotalValueLocked::::get() == tvl, "TVL written is not equal to `Staking::total_stake` of all `BondedPools`." @@ -242,7 +282,7 @@ mod v6 { }) } } - impl OnRuntimeUpgrade for MigrateToV6 { + impl UncheckedOnRuntimeUpgrade for MigrateToV6 { fn on_runtime_upgrade() -> Weight { let mut success = 0u64; let mut fail = 0u64; @@ -302,25 +342,25 @@ pub mod v5 { pub struct MigrateToV5(sp_std::marker::PhantomData); impl OnRuntimeUpgrade for MigrateToV5 { fn on_runtime_upgrade() -> Weight { - let current = Pallet::::current_storage_version(); + let in_code = Pallet::::in_code_storage_version(); let onchain = Pallet::::on_chain_storage_version(); log!( info, - "Running migration with current storage version {:?} / onchain {:?}", - current, + "Running migration with in-code storage version {:?} / onchain {:?}", + in_code, onchain ); - if current == 5 && onchain == 4 { + if in_code == 5 && onchain == 4 { let mut translated = 0u64; RewardPools::::translate::, _>(|_id, old_value| { translated.saturating_inc(); Some(old_value.migrate_to_v5()) }); - current.put::>(); - log!(info, "Upgraded {} pools, storage to version {:?}", translated, current); + in_code.put::>(); + log!(info, "Upgraded {} pools, storage to version {:?}", translated, in_code); // reads: translated + onchain version. // writes: translated + current.put. @@ -458,12 +498,12 @@ pub mod v4 { #[allow(deprecated)] impl> OnRuntimeUpgrade for MigrateToV4 { fn on_runtime_upgrade() -> Weight { - let current = Pallet::::current_storage_version(); + let current = Pallet::::in_code_storage_version(); let onchain = Pallet::::on_chain_storage_version(); log!( info, - "Running migration with current storage version {:?} / onchain {:?}", + "Running migration with in-code storage version {:?} / onchain {:?}", current, onchain ); @@ -539,13 +579,13 @@ pub mod v3 { pub struct MigrateToV3(sp_std::marker::PhantomData); impl OnRuntimeUpgrade for MigrateToV3 { fn on_runtime_upgrade() -> Weight { - let current = Pallet::::current_storage_version(); + let current = Pallet::::in_code_storage_version(); let onchain = Pallet::::on_chain_storage_version(); if onchain == 2 { log!( info, - "Running migration with current storage version {:?} / onchain {:?}", + "Running migration with in-code storage version {:?} / onchain {:?}", current, onchain ); @@ -819,12 +859,12 @@ pub mod v2 { impl OnRuntimeUpgrade for MigrateToV2 { fn on_runtime_upgrade() -> Weight { - let current = Pallet::::current_storage_version(); + let current = Pallet::::in_code_storage_version(); let onchain = Pallet::::on_chain_storage_version(); log!( info, - "Running migration with current storage version {:?} / onchain {:?}", + "Running migration with in-code storage version {:?} / onchain {:?}", current, onchain ); @@ -936,12 +976,12 @@ pub mod v1 { pub struct MigrateToV1(sp_std::marker::PhantomData); impl OnRuntimeUpgrade for MigrateToV1 { fn on_runtime_upgrade() -> Weight { - let current = Pallet::::current_storage_version(); + let current = Pallet::::in_code_storage_version(); let onchain = Pallet::::on_chain_storage_version(); log!( info, - "Running migration with current storage version {:?} / onchain {:?}", + "Running migration with in-code storage version {:?} / onchain {:?}", current, onchain ); @@ -977,3 +1017,17 @@ pub mod v1 { } } } + +mod helpers { + use super::*; + + pub(crate) fn calculate_tvl_by_total_stake() -> BalanceOf { + BondedPools::::iter() + .map(|(id, inner)| { + T::Staking::total_stake(&BondedPool { id, inner: inner.clone() }.bonded_account()) + .unwrap_or_default() + }) + .reduce(|acc, total_balance| acc + total_balance) + .unwrap_or_default() + } +} diff --git a/substrate/frame/nomination-pools/src/mock.rs b/substrate/frame/nomination-pools/src/mock.rs index 84c41a15b201052cd03b3c67fff4cb0c8980a92f..b9301a400953e0c4f9c7589b3f74241d094c597f 100644 --- a/substrate/frame/nomination-pools/src/mock.rs +++ b/substrate/frame/nomination-pools/src/mock.rs @@ -17,8 +17,11 @@ use super::*; use crate::{self as pools}; -use frame_support::{assert_ok, derive_impl, parameter_types, traits::fungible::Mutate, PalletId}; -use frame_system::RawOrigin; +use frame_support::{ + assert_ok, derive_impl, ord_parameter_types, parameter_types, traits::fungible::Mutate, + PalletId, +}; +use frame_system::{EnsureSignedBy, RawOrigin}; use sp_runtime::{BuildStorage, FixedU128}; use sp_staking::{OnStakingUpdate, Stake}; @@ -134,11 +137,24 @@ impl sp_staking::StakingInterface for StakingMock { fn withdraw_unbonded(who: Self::AccountId, _: u32) -> Result { let mut unbonding_map = UnbondingBalanceMap::get(); + + // closure to calculate the current unlocking funds across all eras/accounts. + let unlocking = |pair: &Vec<(EraIndex, Balance)>| -> Balance { + pair.iter() + .try_fold(Zero::zero(), |acc: Balance, (_at, amount)| acc.checked_add(*amount)) + .unwrap() + }; + let staker_map = unbonding_map.get_mut(&who).ok_or("Nothing to unbond")?; + let unlocking_before = unlocking(&staker_map); let current_era = Self::current_era(); + staker_map.retain(|(unlocking_at, _amount)| *unlocking_at > current_era); + // if there was a withdrawal, notify the pallet. + Pools::on_withdraw(&who, unlocking_before.saturating_sub(unlocking(&staker_map))); + UnbondingBalanceMap::set(&unbonding_map); Ok(UnbondingBalanceMap::get().is_empty() && BondedBalanceMap::get().is_empty()) } @@ -209,7 +225,7 @@ impl sp_staking::StakingInterface for StakingMock { } } -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Runtime { type SS58Prefix = (); type BaseCallFilter = frame_support::traits::Everything; @@ -276,6 +292,11 @@ parameter_types! { pub static CheckLevel: u8 = 255; pub const PoolsPalletId: PalletId = PalletId(*b"py/nopls"); } + +ord_parameter_types! { + pub const Admin: u128 = 42; +} + impl pools::Config for Runtime { type RuntimeEvent = RuntimeEvent; type WeightInfo = (); @@ -290,6 +311,7 @@ impl pools::Config for Runtime { type MaxMetadataLen = MaxMetadataLen; type MaxUnbonding = MaxUnbonding; type MaxPointsToBalance = frame_support::traits::ConstU8<10>; + type AdminOrigin = EnsureSignedBy; } type Block = frame_system::mocking::MockBlock; diff --git a/substrate/frame/nomination-pools/src/tests.rs b/substrate/frame/nomination-pools/src/tests.rs index 47f48ba98b7fdbba57b5e827e95b811f5adacacb..f6ef1e6eaac217816e410bc85a837f30bda179f4 100644 --- a/substrate/frame/nomination-pools/src/tests.rs +++ b/substrate/frame/nomination-pools/src/tests.rs @@ -19,11 +19,15 @@ use super::*; use crate::{mock::*, Event}; use frame_support::{assert_err, assert_noop, assert_ok, assert_storage_noop}; use pallet_balances::Event as BEvent; -use sp_runtime::{bounded_btree_map, traits::Dispatchable, FixedU128}; +use sp_runtime::{ + bounded_btree_map, + traits::{BadOrigin, Dispatchable}, + FixedU128, +}; macro_rules! unbonding_pools_with_era { ($($k:expr => $v:expr),* $(,)?) => {{ - use sp_std::iter::{Iterator, IntoIterator}; + use ::core::iter::{Iterator, IntoIterator}; let not_bounded: BTreeMap<_, _> = Iterator::collect(IntoIterator::into_iter([$(($k, $v),)*])); BoundedBTreeMap::, TotalUnbondingPools>::try_from(not_bounded).unwrap() }}; @@ -2441,16 +2445,10 @@ mod claim_payout { // given assert_eq!(Currency::free_balance(&10), 35); - // Permissioned by default - assert_noop!( - Pools::claim_payout_other(RuntimeOrigin::signed(80), 10), - Error::::DoesNotHavePermission - ); + // when - assert_ok!(Pools::set_claim_permission( - RuntimeOrigin::signed(10), - ClaimPermission::PermissionlessWithdraw - )); + // NOTE: Claim permission of `PermissionlessWithdraw` allows payout claiming as default, + // so a claim permission does not need to be set for non-pool members prior to claiming. assert_ok!(Pools::claim_payout_other(RuntimeOrigin::signed(80), 10)); // then @@ -2489,7 +2487,6 @@ mod unbond { ); // Make permissionless - assert_eq!(ClaimPermissions::::get(10), ClaimPermission::Permissioned); assert_ok!(Pools::set_claim_permission( RuntimeOrigin::signed(20), ClaimPermission::PermissionlessAll @@ -4563,12 +4560,11 @@ mod withdraw_unbonded { CurrentEra::set(1); assert_eq!(PoolMembers::::get(20).unwrap().points, 20); - assert_ok!(Pools::set_claim_permission( - RuntimeOrigin::signed(20), - ClaimPermission::PermissionlessAll - )); assert_ok!(Pools::unbond(RuntimeOrigin::signed(20), 20, 20)); - assert_eq!(ClaimPermissions::::get(20), ClaimPermission::PermissionlessAll); + assert_eq!( + ClaimPermissions::::get(20), + ClaimPermission::PermissionlessWithdraw + ); assert_eq!( pool_events_since_last_call(), @@ -4792,7 +4788,7 @@ mod create { } #[test] -fn set_claimable_actor_works() { +fn set_claim_permission_works() { ExtBuilder::default().build_and_execute(|| { // Given Currency::set_balance(&11, ExistentialDeposit::get() + 2); @@ -4811,22 +4807,19 @@ fn set_claimable_actor_works() { ] ); - // Make permissionless - assert_eq!(ClaimPermissions::::get(11), ClaimPermission::Permissioned); + // Make permissioned + assert_eq!(ClaimPermissions::::get(11), ClaimPermission::PermissionlessWithdraw); assert_noop!( - Pools::set_claim_permission( - RuntimeOrigin::signed(12), - ClaimPermission::PermissionlessAll - ), + Pools::set_claim_permission(RuntimeOrigin::signed(12), ClaimPermission::Permissioned), Error::::PoolMemberNotFound ); assert_ok!(Pools::set_claim_permission( RuntimeOrigin::signed(11), - ClaimPermission::PermissionlessAll + ClaimPermission::Permissioned )); // then - assert_eq!(ClaimPermissions::::get(11), ClaimPermission::PermissionlessAll); + assert_eq!(ClaimPermissions::::get(11), ClaimPermission::Permissioned); }); } @@ -4848,6 +4841,18 @@ mod nominate { Error::::NotNominator ); + // if `depositor` stake is less than the `MinimumNominatorBond`, they can't nominate + StakingMinBond::set(20); + + // Can't nominate if depositor's stake is less than the `MinimumNominatorBond` + assert_noop!( + Pools::nominate(RuntimeOrigin::signed(900), 1, vec![21]), + Error::::MinimumBondNotMet + ); + + // restore `MinimumNominatorBond` + StakingMinBond::set(10); + // Root can nominate assert_ok!(Pools::nominate(RuntimeOrigin::signed(900), 1, vec![21])); assert_eq!(Nominations::get().unwrap(), vec![21]); @@ -4995,9 +5000,23 @@ mod set_configs { #[test] fn set_configs_works() { ExtBuilder::default().build_and_execute(|| { - // Setting works + // only admin origin can set configs + assert_noop!( + Pools::set_configs( + RuntimeOrigin::signed(20), + ConfigOp::Set(1 as Balance), + ConfigOp::Set(2 as Balance), + ConfigOp::Set(3u32), + ConfigOp::Set(4u32), + ConfigOp::Set(5u32), + ConfigOp::Set(Perbill::from_percent(6)) + ), + BadOrigin + ); + + // Setting works by Admin (42) assert_ok!(Pools::set_configs( - RuntimeOrigin::root(), + RuntimeOrigin::signed(42), ConfigOp::Set(1 as Balance), ConfigOp::Set(2 as Balance), ConfigOp::Set(3u32), @@ -5014,7 +5033,7 @@ mod set_configs { // Noop does nothing assert_storage_noop!(assert_ok!(Pools::set_configs( - RuntimeOrigin::root(), + RuntimeOrigin::signed(42), ConfigOp::Noop, ConfigOp::Noop, ConfigOp::Noop, @@ -5025,7 +5044,7 @@ mod set_configs { // Removing works assert_ok!(Pools::set_configs( - RuntimeOrigin::root(), + RuntimeOrigin::signed(42), ConfigOp::Remove, ConfigOp::Remove, ConfigOp::Remove, @@ -5212,7 +5231,7 @@ mod bond_extra { assert_ok!(Pools::set_claim_permission( RuntimeOrigin::signed(10), - ClaimPermission::PermissionlessAll + ClaimPermission::PermissionlessCompound )); assert_ok!(Pools::bond_extra_other(RuntimeOrigin::signed(50), 10, BondExtra::Rewards)); assert_eq!(Currency::free_balance(&default_reward_account()), 7); @@ -7338,3 +7357,33 @@ mod slash { }); } } + +mod chill { + use super::*; + + #[test] + fn chill_works() { + ExtBuilder::default().build_and_execute(|| { + // only nominator or root can chill + assert_noop!( + Pools::chill(RuntimeOrigin::signed(10), 1), + Error::::NotNominator + ); + + // root can chill and re-nominate + assert_ok!(Pools::chill(RuntimeOrigin::signed(900), 1)); + assert_ok!(Pools::nominate(RuntimeOrigin::signed(900), 1, vec![31])); + + // nominator can chill and re-nominate + assert_ok!(Pools::chill(RuntimeOrigin::signed(901), 1)); + assert_ok!(Pools::nominate(RuntimeOrigin::signed(901), 1, vec![31])); + + // if `depositor` stake is less than the `MinimumNominatorBond`, then this call + // becomes permissionless; + StakingMinBond::set(20); + + // any account can chill + assert_ok!(Pools::chill(RuntimeOrigin::signed(10), 1)); + }) + } +} diff --git a/substrate/frame/nomination-pools/src/weights.rs b/substrate/frame/nomination-pools/src/weights.rs index 047a17c3f9a278ac9564562edf318f13ecc2f7ca..57ea8dc388f6869c8f4f2be761816cced9758e19 100644 --- a/substrate/frame/nomination-pools/src/weights.rs +++ b/substrate/frame/nomination-pools/src/weights.rs @@ -17,26 +17,28 @@ //! Autogenerated weights for `pallet_nomination_pools` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-11-23, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-04-09, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-yprdrvc7-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! HOSTNAME: `runner-anb7yjbi-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: `1024` // Executed Command: -// target/production/substrate-node +// ./target/production/substrate-node // benchmark // pallet +// --chain=dev // --steps=50 // --repeat=20 +// --pallet=pallet_nomination_pools +// --no-storage-info +// --no-median-slopes +// --no-min-squares // --extrinsic=* // --wasm-execution=compiled // --heap-pages=4096 -// --json-file=/builds/parity/mirrors/polkadot-sdk/.git/.artifacts/bench.json -// --pallet=pallet_nomination_pools -// --chain=dev -// --header=./substrate/HEADER-APACHE2 // --output=./substrate/frame/nomination-pools/src/weights.rs +// --header=./substrate/HEADER-APACHE2 // --template=./substrate/.maintain/frame-weight-template.hbs #![cfg_attr(rustfmt, rustfmt_skip)] @@ -112,8 +114,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `3425` // Estimated: `8877` - // Minimum execution time: 184_295_000 picoseconds. - Weight::from_parts(188_860_000, 8877) + // Minimum execution time: 201_783_000 picoseconds. + Weight::from_parts(206_014_000, 8877) .saturating_add(T::DbWeight::get().reads(20_u64)) .saturating_add(T::DbWeight::get().writes(13_u64)) } @@ -145,8 +147,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `3435` // Estimated: `8877` - // Minimum execution time: 188_777_000 picoseconds. - Weight::from_parts(192_646_000, 8877) + // Minimum execution time: 204_124_000 picoseconds. + Weight::from_parts(207_910_000, 8877) .saturating_add(T::DbWeight::get().reads(17_u64)) .saturating_add(T::DbWeight::get().writes(13_u64)) } @@ -180,8 +182,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `3500` // Estimated: `8877` - // Minimum execution time: 221_728_000 picoseconds. - Weight::from_parts(227_569_000, 8877) + // Minimum execution time: 240_342_000 picoseconds. + Weight::from_parts(245_735_000, 8877) .saturating_add(T::DbWeight::get().reads(18_u64)) .saturating_add(T::DbWeight::get().writes(14_u64)) } @@ -201,8 +203,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `1172` // Estimated: `3719` - // Minimum execution time: 75_310_000 picoseconds. - Weight::from_parts(77_709_000, 3719) + // Minimum execution time: 81_054_000 picoseconds. + Weight::from_parts(83_324_000, 3719) .saturating_add(T::DbWeight::get().reads(6_u64)) .saturating_add(T::DbWeight::get().writes(4_u64)) } @@ -242,8 +244,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `3622` // Estimated: `27847` - // Minimum execution time: 170_656_000 picoseconds. - Weight::from_parts(174_950_000, 27847) + // Minimum execution time: 188_835_000 picoseconds. + Weight::from_parts(192_565_000, 27847) .saturating_add(T::DbWeight::get().reads(20_u64)) .saturating_add(T::DbWeight::get().writes(13_u64)) } @@ -259,18 +261,20 @@ impl WeightInfo for SubstrateWeight { /// Proof: `Balances::Locks` (`max_values`: None, `max_size`: Some(1299), added: 3774, mode: `MaxEncodedLen`) /// Storage: `Balances::Freezes` (r:1 w:0) /// Proof: `Balances::Freezes` (`max_values`: None, `max_size`: Some(67), added: 2542, mode: `MaxEncodedLen`) + /// Storage: `NominationPools::ReversePoolIdLookup` (r:1 w:0) + /// Proof: `NominationPools::ReversePoolIdLookup` (`max_values`: None, `max_size`: Some(44), added: 2519, mode: `MaxEncodedLen`) /// Storage: `NominationPools::TotalValueLocked` (r:1 w:1) /// Proof: `NominationPools::TotalValueLocked` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) /// The range of component `s` is `[0, 100]`. fn pool_withdraw_unbonded(s: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `1817` + // Measured: `1848` // Estimated: `4764` - // Minimum execution time: 68_866_000 picoseconds. - Weight::from_parts(72_312_887, 4764) - // Standard Error: 1_635 - .saturating_add(Weight::from_parts(41_679, 0).saturating_mul(s.into())) - .saturating_add(T::DbWeight::get().reads(7_u64)) + // Minimum execution time: 73_556_000 picoseconds. + Weight::from_parts(76_075_881, 4764) + // Standard Error: 1_419 + .saturating_add(Weight::from_parts(54_476, 0).saturating_mul(s.into())) + .saturating_add(T::DbWeight::get().reads(8_u64)) .saturating_add(T::DbWeight::get().writes(3_u64)) } /// Storage: `NominationPools::PoolMembers` (r:1 w:1) @@ -291,6 +295,8 @@ impl WeightInfo for SubstrateWeight { /// Proof: `Balances::Freezes` (`max_values`: None, `max_size`: Some(67), added: 2542, mode: `MaxEncodedLen`) /// Storage: `System::Account` (r:1 w:1) /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `NominationPools::ReversePoolIdLookup` (r:1 w:0) + /// Proof: `NominationPools::ReversePoolIdLookup` (`max_values`: None, `max_size`: Some(44), added: 2519, mode: `MaxEncodedLen`) /// Storage: `NominationPools::TotalValueLocked` (r:1 w:1) /// Proof: `NominationPools::TotalValueLocked` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) /// Storage: `NominationPools::CounterForPoolMembers` (r:1 w:1) @@ -300,13 +306,13 @@ impl WeightInfo for SubstrateWeight { /// The range of component `s` is `[0, 100]`. fn withdraw_unbonded_update(s: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `2207` + // Measured: `2238` // Estimated: `27847` - // Minimum execution time: 131_383_000 picoseconds. - Weight::from_parts(136_595_971, 27847) - // Standard Error: 2_715 - .saturating_add(Weight::from_parts(52_351, 0).saturating_mul(s.into())) - .saturating_add(T::DbWeight::get().reads(11_u64)) + // Minimum execution time: 144_177_000 picoseconds. + Weight::from_parts(148_686_524, 27847) + // Standard Error: 2_475 + .saturating_add(Weight::from_parts(77_460, 0).saturating_mul(s.into())) + .saturating_add(T::DbWeight::get().reads(12_u64)) .saturating_add(T::DbWeight::get().writes(9_u64)) } /// Storage: `NominationPools::PoolMembers` (r:1 w:1) @@ -333,12 +339,12 @@ impl WeightInfo for SubstrateWeight { /// Proof: `Staking::Validators` (`max_values`: None, `max_size`: Some(45), added: 2520, mode: `MaxEncodedLen`) /// Storage: `Staking::Nominators` (r:1 w:0) /// Proof: `Staking::Nominators` (`max_values`: None, `max_size`: Some(558), added: 3033, mode: `MaxEncodedLen`) + /// Storage: `NominationPools::ReversePoolIdLookup` (r:1 w:1) + /// Proof: `NominationPools::ReversePoolIdLookup` (`max_values`: None, `max_size`: Some(44), added: 2519, mode: `MaxEncodedLen`) /// Storage: `NominationPools::TotalValueLocked` (r:1 w:1) /// Proof: `NominationPools::TotalValueLocked` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) /// Storage: `NominationPools::CounterForPoolMembers` (r:1 w:1) /// Proof: `NominationPools::CounterForPoolMembers` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - /// Storage: `NominationPools::ReversePoolIdLookup` (r:1 w:1) - /// Proof: `NominationPools::ReversePoolIdLookup` (`max_values`: None, `max_size`: Some(44), added: 2519, mode: `MaxEncodedLen`) /// Storage: `NominationPools::CounterForReversePoolIdLookup` (r:1 w:1) /// Proof: `NominationPools::CounterForReversePoolIdLookup` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) /// Storage: `NominationPools::RewardPools` (r:1 w:1) @@ -356,12 +362,14 @@ impl WeightInfo for SubstrateWeight { /// Storage: `NominationPools::ClaimPermissions` (r:0 w:1) /// Proof: `NominationPools::ClaimPermissions` (`max_values`: None, `max_size`: Some(41), added: 2516, mode: `MaxEncodedLen`) /// The range of component `s` is `[0, 100]`. - fn withdraw_unbonded_kill(_s: u32, ) -> Weight { + fn withdraw_unbonded_kill(s: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `2525` // Estimated: `27847` - // Minimum execution time: 233_314_000 picoseconds. - Weight::from_parts(241_694_316, 27847) + // Minimum execution time: 255_957_000 picoseconds. + Weight::from_parts(264_206_788, 27847) + // Standard Error: 4_229 + .saturating_add(Weight::from_parts(3_064, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(24_u64)) .saturating_add(T::DbWeight::get().writes(20_u64)) } @@ -389,6 +397,8 @@ impl WeightInfo for SubstrateWeight { /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) /// Storage: `Staking::Bonded` (r:1 w:1) /// Proof: `Staking::Bonded` (`max_values`: None, `max_size`: Some(72), added: 2547, mode: `MaxEncodedLen`) + /// Storage: `Staking::Ledger` (r:1 w:1) + /// Proof: `Staking::Ledger` (`max_values`: None, `max_size`: Some(1091), added: 3566, mode: `MaxEncodedLen`) /// Storage: `Balances::Locks` (r:2 w:1) /// Proof: `Balances::Locks` (`max_values`: None, `max_size`: Some(1299), added: 3774, mode: `MaxEncodedLen`) /// Storage: `Balances::Freezes` (r:2 w:1) @@ -405,27 +415,31 @@ impl WeightInfo for SubstrateWeight { /// Proof: `NominationPools::CounterForReversePoolIdLookup` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) /// Storage: `NominationPools::BondedPools` (r:1 w:1) /// Proof: `NominationPools::BondedPools` (`max_values`: None, `max_size`: Some(254), added: 2729, mode: `MaxEncodedLen`) - /// Storage: `Staking::Ledger` (r:0 w:1) - /// Proof: `Staking::Ledger` (`max_values`: None, `max_size`: Some(1091), added: 3566, mode: `MaxEncodedLen`) /// Storage: `Staking::Payee` (r:0 w:1) /// Proof: `Staking::Payee` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) fn create() -> Weight { // Proof Size summary in bytes: - // Measured: `1169` + // Measured: `1284` // Estimated: `8538` - // Minimum execution time: 171_465_000 picoseconds. - Weight::from_parts(176_478_000, 8538) - .saturating_add(T::DbWeight::get().reads(23_u64)) + // Minimum execution time: 193_527_000 picoseconds. + Weight::from_parts(197_140_000, 8538) + .saturating_add(T::DbWeight::get().reads(24_u64)) .saturating_add(T::DbWeight::get().writes(17_u64)) } /// Storage: `NominationPools::BondedPools` (r:1 w:0) /// Proof: `NominationPools::BondedPools` (`max_values`: None, `max_size`: Some(254), added: 2729, mode: `MaxEncodedLen`) + /// Storage: `NominationPools::PoolMembers` (r:1 w:0) + /// Proof: `NominationPools::PoolMembers` (`max_values`: None, `max_size`: Some(237), added: 2712, mode: `MaxEncodedLen`) /// Storage: `Staking::Bonded` (r:1 w:0) /// Proof: `Staking::Bonded` (`max_values`: None, `max_size`: Some(72), added: 2547, mode: `MaxEncodedLen`) /// Storage: `Staking::Ledger` (r:1 w:0) /// Proof: `Staking::Ledger` (`max_values`: None, `max_size`: Some(1091), added: 3566, mode: `MaxEncodedLen`) /// Storage: `Staking::MinNominatorBond` (r:1 w:0) /// Proof: `Staking::MinNominatorBond` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) + /// Storage: `NominationPools::MinCreateBond` (r:1 w:0) + /// Proof: `NominationPools::MinCreateBond` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) + /// Storage: `NominationPools::MinJoinBond` (r:1 w:0) + /// Proof: `NominationPools::MinJoinBond` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) /// Storage: `Staking::Nominators` (r:1 w:1) /// Proof: `Staking::Nominators` (`max_values`: None, `max_size`: Some(558), added: 3033, mode: `MaxEncodedLen`) /// Storage: `Staking::MaxNominatorsCount` (r:1 w:0) @@ -445,13 +459,13 @@ impl WeightInfo for SubstrateWeight { /// The range of component `n` is `[1, 16]`. fn nominate(n: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `1808` + // Measured: `1976` // Estimated: `4556 + n * (2520 ±0)` - // Minimum execution time: 63_588_000 picoseconds. - Weight::from_parts(64_930_584, 4556) - // Standard Error: 9_167 - .saturating_add(Weight::from_parts(1_595_779, 0).saturating_mul(n.into())) - .saturating_add(T::DbWeight::get().reads(12_u64)) + // Minimum execution time: 86_054_000 picoseconds. + Weight::from_parts(88_743_932, 4556) + // Standard Error: 12_699 + .saturating_add(Weight::from_parts(1_829_097, 0).saturating_mul(n.into())) + .saturating_add(T::DbWeight::get().reads(15_u64)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(n.into()))) .saturating_add(T::DbWeight::get().writes(5_u64)) .saturating_add(Weight::from_parts(0, 2520).saturating_mul(n.into())) @@ -466,8 +480,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `1434` // Estimated: `4556` - // Minimum execution time: 32_899_000 picoseconds. - Weight::from_parts(33_955_000, 4556) + // Minimum execution time: 34_544_000 picoseconds. + Weight::from_parts(35_910_000, 4556) .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -482,10 +496,10 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `532` // Estimated: `3735` - // Minimum execution time: 13_778_000 picoseconds. - Weight::from_parts(14_770_006, 3735) - // Standard Error: 151 - .saturating_add(Weight::from_parts(1_900, 0).saturating_mul(n.into())) + // Minimum execution time: 14_111_000 picoseconds. + Weight::from_parts(15_204_218, 3735) + // Standard Error: 226 + .saturating_add(Weight::from_parts(1_291, 0).saturating_mul(n.into())) .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } @@ -505,8 +519,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_550_000 picoseconds. - Weight::from_parts(4_935_000, 0) + // Minimum execution time: 4_524_000 picoseconds. + Weight::from_parts(4_882_000, 0) .saturating_add(T::DbWeight::get().writes(6_u64)) } /// Storage: `NominationPools::BondedPools` (r:1 w:1) @@ -515,17 +529,21 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `532` // Estimated: `3719` - // Minimum execution time: 16_759_000 picoseconds. - Weight::from_parts(17_346_000, 3719) + // Minimum execution time: 17_975_000 picoseconds. + Weight::from_parts(18_549_000, 3719) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } /// Storage: `NominationPools::BondedPools` (r:1 w:0) /// Proof: `NominationPools::BondedPools` (`max_values`: None, `max_size`: Some(254), added: 2729, mode: `MaxEncodedLen`) + /// Storage: `NominationPools::PoolMembers` (r:1 w:0) + /// Proof: `NominationPools::PoolMembers` (`max_values`: None, `max_size`: Some(237), added: 2712, mode: `MaxEncodedLen`) /// Storage: `Staking::Bonded` (r:1 w:0) /// Proof: `Staking::Bonded` (`max_values`: None, `max_size`: Some(72), added: 2547, mode: `MaxEncodedLen`) /// Storage: `Staking::Ledger` (r:1 w:0) /// Proof: `Staking::Ledger` (`max_values`: None, `max_size`: Some(1091), added: 3566, mode: `MaxEncodedLen`) + /// Storage: `Staking::MinNominatorBond` (r:1 w:0) + /// Proof: `Staking::MinNominatorBond` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) /// Storage: `Staking::Validators` (r:1 w:0) /// Proof: `Staking::Validators` (`max_values`: None, `max_size`: Some(45), added: 2520, mode: `MaxEncodedLen`) /// Storage: `Staking::Nominators` (r:1 w:1) @@ -540,11 +558,11 @@ impl WeightInfo for SubstrateWeight { /// Proof: `VoterList::CounterForListNodes` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) fn chill() -> Weight { // Proof Size summary in bytes: - // Measured: `1971` + // Measured: `2143` // Estimated: `4556` - // Minimum execution time: 61_970_000 picoseconds. - Weight::from_parts(63_738_000, 4556) - .saturating_add(T::DbWeight::get().reads(9_u64)) + // Minimum execution time: 81_574_000 picoseconds. + Weight::from_parts(83_519_000, 4556) + .saturating_add(T::DbWeight::get().reads(11_u64)) .saturating_add(T::DbWeight::get().writes(5_u64)) } /// Storage: `NominationPools::BondedPools` (r:1 w:1) @@ -559,8 +577,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `804` // Estimated: `3719` - // Minimum execution time: 31_950_000 picoseconds. - Weight::from_parts(33_190_000, 3719) + // Minimum execution time: 35_015_000 picoseconds. + Weight::from_parts(36_159_000, 3719) .saturating_add(T::DbWeight::get().reads(4_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } @@ -572,8 +590,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `572` // Estimated: `3719` - // Minimum execution time: 16_807_000 picoseconds. - Weight::from_parts(17_733_000, 3719) + // Minimum execution time: 17_775_000 picoseconds. + Weight::from_parts(18_358_000, 3719) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -583,8 +601,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `532` // Estimated: `3719` - // Minimum execution time: 16_710_000 picoseconds. - Weight::from_parts(17_563_000, 3719) + // Minimum execution time: 16_997_000 picoseconds. + Weight::from_parts(18_041_000, 3719) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -594,8 +612,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `532` // Estimated: `3719` - // Minimum execution time: 16_493_000 picoseconds. - Weight::from_parts(17_022_000, 3719) + // Minimum execution time: 17_000_000 picoseconds. + Weight::from_parts(17_807_000, 3719) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -607,8 +625,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `542` // Estimated: `3702` - // Minimum execution time: 14_248_000 picoseconds. - Weight::from_parts(15_095_000, 3702) + // Minimum execution time: 14_803_000 picoseconds. + Weight::from_parts(15_401_000, 3702) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -624,8 +642,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `1002` // Estimated: `3719` - // Minimum execution time: 61_969_000 picoseconds. - Weight::from_parts(63_965_000, 3719) + // Minimum execution time: 69_759_000 picoseconds. + Weight::from_parts(71_985_000, 3719) .saturating_add(T::DbWeight::get().reads(4_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } @@ -641,8 +659,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `901` // Estimated: `4764` - // Minimum execution time: 65_462_000 picoseconds. - Weight::from_parts(67_250_000, 4764) + // Minimum execution time: 73_829_000 picoseconds. + Weight::from_parts(75_966_000, 4764) .saturating_add(T::DbWeight::get().reads(4_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } @@ -686,8 +704,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `3425` // Estimated: `8877` - // Minimum execution time: 184_295_000 picoseconds. - Weight::from_parts(188_860_000, 8877) + // Minimum execution time: 201_783_000 picoseconds. + Weight::from_parts(206_014_000, 8877) .saturating_add(RocksDbWeight::get().reads(20_u64)) .saturating_add(RocksDbWeight::get().writes(13_u64)) } @@ -719,8 +737,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `3435` // Estimated: `8877` - // Minimum execution time: 188_777_000 picoseconds. - Weight::from_parts(192_646_000, 8877) + // Minimum execution time: 204_124_000 picoseconds. + Weight::from_parts(207_910_000, 8877) .saturating_add(RocksDbWeight::get().reads(17_u64)) .saturating_add(RocksDbWeight::get().writes(13_u64)) } @@ -754,8 +772,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `3500` // Estimated: `8877` - // Minimum execution time: 221_728_000 picoseconds. - Weight::from_parts(227_569_000, 8877) + // Minimum execution time: 240_342_000 picoseconds. + Weight::from_parts(245_735_000, 8877) .saturating_add(RocksDbWeight::get().reads(18_u64)) .saturating_add(RocksDbWeight::get().writes(14_u64)) } @@ -775,8 +793,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `1172` // Estimated: `3719` - // Minimum execution time: 75_310_000 picoseconds. - Weight::from_parts(77_709_000, 3719) + // Minimum execution time: 81_054_000 picoseconds. + Weight::from_parts(83_324_000, 3719) .saturating_add(RocksDbWeight::get().reads(6_u64)) .saturating_add(RocksDbWeight::get().writes(4_u64)) } @@ -816,8 +834,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `3622` // Estimated: `27847` - // Minimum execution time: 170_656_000 picoseconds. - Weight::from_parts(174_950_000, 27847) + // Minimum execution time: 188_835_000 picoseconds. + Weight::from_parts(192_565_000, 27847) .saturating_add(RocksDbWeight::get().reads(20_u64)) .saturating_add(RocksDbWeight::get().writes(13_u64)) } @@ -833,18 +851,20 @@ impl WeightInfo for () { /// Proof: `Balances::Locks` (`max_values`: None, `max_size`: Some(1299), added: 3774, mode: `MaxEncodedLen`) /// Storage: `Balances::Freezes` (r:1 w:0) /// Proof: `Balances::Freezes` (`max_values`: None, `max_size`: Some(67), added: 2542, mode: `MaxEncodedLen`) + /// Storage: `NominationPools::ReversePoolIdLookup` (r:1 w:0) + /// Proof: `NominationPools::ReversePoolIdLookup` (`max_values`: None, `max_size`: Some(44), added: 2519, mode: `MaxEncodedLen`) /// Storage: `NominationPools::TotalValueLocked` (r:1 w:1) /// Proof: `NominationPools::TotalValueLocked` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) /// The range of component `s` is `[0, 100]`. fn pool_withdraw_unbonded(s: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `1817` + // Measured: `1848` // Estimated: `4764` - // Minimum execution time: 68_866_000 picoseconds. - Weight::from_parts(72_312_887, 4764) - // Standard Error: 1_635 - .saturating_add(Weight::from_parts(41_679, 0).saturating_mul(s.into())) - .saturating_add(RocksDbWeight::get().reads(7_u64)) + // Minimum execution time: 73_556_000 picoseconds. + Weight::from_parts(76_075_881, 4764) + // Standard Error: 1_419 + .saturating_add(Weight::from_parts(54_476, 0).saturating_mul(s.into())) + .saturating_add(RocksDbWeight::get().reads(8_u64)) .saturating_add(RocksDbWeight::get().writes(3_u64)) } /// Storage: `NominationPools::PoolMembers` (r:1 w:1) @@ -865,6 +885,8 @@ impl WeightInfo for () { /// Proof: `Balances::Freezes` (`max_values`: None, `max_size`: Some(67), added: 2542, mode: `MaxEncodedLen`) /// Storage: `System::Account` (r:1 w:1) /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `NominationPools::ReversePoolIdLookup` (r:1 w:0) + /// Proof: `NominationPools::ReversePoolIdLookup` (`max_values`: None, `max_size`: Some(44), added: 2519, mode: `MaxEncodedLen`) /// Storage: `NominationPools::TotalValueLocked` (r:1 w:1) /// Proof: `NominationPools::TotalValueLocked` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) /// Storage: `NominationPools::CounterForPoolMembers` (r:1 w:1) @@ -874,13 +896,13 @@ impl WeightInfo for () { /// The range of component `s` is `[0, 100]`. fn withdraw_unbonded_update(s: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `2207` + // Measured: `2238` // Estimated: `27847` - // Minimum execution time: 131_383_000 picoseconds. - Weight::from_parts(136_595_971, 27847) - // Standard Error: 2_715 - .saturating_add(Weight::from_parts(52_351, 0).saturating_mul(s.into())) - .saturating_add(RocksDbWeight::get().reads(11_u64)) + // Minimum execution time: 144_177_000 picoseconds. + Weight::from_parts(148_686_524, 27847) + // Standard Error: 2_475 + .saturating_add(Weight::from_parts(77_460, 0).saturating_mul(s.into())) + .saturating_add(RocksDbWeight::get().reads(12_u64)) .saturating_add(RocksDbWeight::get().writes(9_u64)) } /// Storage: `NominationPools::PoolMembers` (r:1 w:1) @@ -907,12 +929,12 @@ impl WeightInfo for () { /// Proof: `Staking::Validators` (`max_values`: None, `max_size`: Some(45), added: 2520, mode: `MaxEncodedLen`) /// Storage: `Staking::Nominators` (r:1 w:0) /// Proof: `Staking::Nominators` (`max_values`: None, `max_size`: Some(558), added: 3033, mode: `MaxEncodedLen`) + /// Storage: `NominationPools::ReversePoolIdLookup` (r:1 w:1) + /// Proof: `NominationPools::ReversePoolIdLookup` (`max_values`: None, `max_size`: Some(44), added: 2519, mode: `MaxEncodedLen`) /// Storage: `NominationPools::TotalValueLocked` (r:1 w:1) /// Proof: `NominationPools::TotalValueLocked` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) /// Storage: `NominationPools::CounterForPoolMembers` (r:1 w:1) /// Proof: `NominationPools::CounterForPoolMembers` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - /// Storage: `NominationPools::ReversePoolIdLookup` (r:1 w:1) - /// Proof: `NominationPools::ReversePoolIdLookup` (`max_values`: None, `max_size`: Some(44), added: 2519, mode: `MaxEncodedLen`) /// Storage: `NominationPools::CounterForReversePoolIdLookup` (r:1 w:1) /// Proof: `NominationPools::CounterForReversePoolIdLookup` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) /// Storage: `NominationPools::RewardPools` (r:1 w:1) @@ -930,12 +952,14 @@ impl WeightInfo for () { /// Storage: `NominationPools::ClaimPermissions` (r:0 w:1) /// Proof: `NominationPools::ClaimPermissions` (`max_values`: None, `max_size`: Some(41), added: 2516, mode: `MaxEncodedLen`) /// The range of component `s` is `[0, 100]`. - fn withdraw_unbonded_kill(_s: u32, ) -> Weight { + fn withdraw_unbonded_kill(s: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `2525` // Estimated: `27847` - // Minimum execution time: 233_314_000 picoseconds. - Weight::from_parts(241_694_316, 27847) + // Minimum execution time: 255_957_000 picoseconds. + Weight::from_parts(264_206_788, 27847) + // Standard Error: 4_229 + .saturating_add(Weight::from_parts(3_064, 0).saturating_mul(s.into())) .saturating_add(RocksDbWeight::get().reads(24_u64)) .saturating_add(RocksDbWeight::get().writes(20_u64)) } @@ -963,6 +987,8 @@ impl WeightInfo for () { /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) /// Storage: `Staking::Bonded` (r:1 w:1) /// Proof: `Staking::Bonded` (`max_values`: None, `max_size`: Some(72), added: 2547, mode: `MaxEncodedLen`) + /// Storage: `Staking::Ledger` (r:1 w:1) + /// Proof: `Staking::Ledger` (`max_values`: None, `max_size`: Some(1091), added: 3566, mode: `MaxEncodedLen`) /// Storage: `Balances::Locks` (r:2 w:1) /// Proof: `Balances::Locks` (`max_values`: None, `max_size`: Some(1299), added: 3774, mode: `MaxEncodedLen`) /// Storage: `Balances::Freezes` (r:2 w:1) @@ -979,27 +1005,31 @@ impl WeightInfo for () { /// Proof: `NominationPools::CounterForReversePoolIdLookup` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) /// Storage: `NominationPools::BondedPools` (r:1 w:1) /// Proof: `NominationPools::BondedPools` (`max_values`: None, `max_size`: Some(254), added: 2729, mode: `MaxEncodedLen`) - /// Storage: `Staking::Ledger` (r:0 w:1) - /// Proof: `Staking::Ledger` (`max_values`: None, `max_size`: Some(1091), added: 3566, mode: `MaxEncodedLen`) /// Storage: `Staking::Payee` (r:0 w:1) /// Proof: `Staking::Payee` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) fn create() -> Weight { // Proof Size summary in bytes: - // Measured: `1169` + // Measured: `1284` // Estimated: `8538` - // Minimum execution time: 171_465_000 picoseconds. - Weight::from_parts(176_478_000, 8538) - .saturating_add(RocksDbWeight::get().reads(23_u64)) + // Minimum execution time: 193_527_000 picoseconds. + Weight::from_parts(197_140_000, 8538) + .saturating_add(RocksDbWeight::get().reads(24_u64)) .saturating_add(RocksDbWeight::get().writes(17_u64)) } /// Storage: `NominationPools::BondedPools` (r:1 w:0) /// Proof: `NominationPools::BondedPools` (`max_values`: None, `max_size`: Some(254), added: 2729, mode: `MaxEncodedLen`) + /// Storage: `NominationPools::PoolMembers` (r:1 w:0) + /// Proof: `NominationPools::PoolMembers` (`max_values`: None, `max_size`: Some(237), added: 2712, mode: `MaxEncodedLen`) /// Storage: `Staking::Bonded` (r:1 w:0) /// Proof: `Staking::Bonded` (`max_values`: None, `max_size`: Some(72), added: 2547, mode: `MaxEncodedLen`) /// Storage: `Staking::Ledger` (r:1 w:0) /// Proof: `Staking::Ledger` (`max_values`: None, `max_size`: Some(1091), added: 3566, mode: `MaxEncodedLen`) /// Storage: `Staking::MinNominatorBond` (r:1 w:0) /// Proof: `Staking::MinNominatorBond` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) + /// Storage: `NominationPools::MinCreateBond` (r:1 w:0) + /// Proof: `NominationPools::MinCreateBond` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) + /// Storage: `NominationPools::MinJoinBond` (r:1 w:0) + /// Proof: `NominationPools::MinJoinBond` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) /// Storage: `Staking::Nominators` (r:1 w:1) /// Proof: `Staking::Nominators` (`max_values`: None, `max_size`: Some(558), added: 3033, mode: `MaxEncodedLen`) /// Storage: `Staking::MaxNominatorsCount` (r:1 w:0) @@ -1019,13 +1049,13 @@ impl WeightInfo for () { /// The range of component `n` is `[1, 16]`. fn nominate(n: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `1808` + // Measured: `1976` // Estimated: `4556 + n * (2520 ±0)` - // Minimum execution time: 63_588_000 picoseconds. - Weight::from_parts(64_930_584, 4556) - // Standard Error: 9_167 - .saturating_add(Weight::from_parts(1_595_779, 0).saturating_mul(n.into())) - .saturating_add(RocksDbWeight::get().reads(12_u64)) + // Minimum execution time: 86_054_000 picoseconds. + Weight::from_parts(88_743_932, 4556) + // Standard Error: 12_699 + .saturating_add(Weight::from_parts(1_829_097, 0).saturating_mul(n.into())) + .saturating_add(RocksDbWeight::get().reads(15_u64)) .saturating_add(RocksDbWeight::get().reads((1_u64).saturating_mul(n.into()))) .saturating_add(RocksDbWeight::get().writes(5_u64)) .saturating_add(Weight::from_parts(0, 2520).saturating_mul(n.into())) @@ -1040,8 +1070,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `1434` // Estimated: `4556` - // Minimum execution time: 32_899_000 picoseconds. - Weight::from_parts(33_955_000, 4556) + // Minimum execution time: 34_544_000 picoseconds. + Weight::from_parts(35_910_000, 4556) .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -1056,10 +1086,10 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `532` // Estimated: `3735` - // Minimum execution time: 13_778_000 picoseconds. - Weight::from_parts(14_770_006, 3735) - // Standard Error: 151 - .saturating_add(Weight::from_parts(1_900, 0).saturating_mul(n.into())) + // Minimum execution time: 14_111_000 picoseconds. + Weight::from_parts(15_204_218, 3735) + // Standard Error: 226 + .saturating_add(Weight::from_parts(1_291, 0).saturating_mul(n.into())) .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } @@ -1079,8 +1109,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_550_000 picoseconds. - Weight::from_parts(4_935_000, 0) + // Minimum execution time: 4_524_000 picoseconds. + Weight::from_parts(4_882_000, 0) .saturating_add(RocksDbWeight::get().writes(6_u64)) } /// Storage: `NominationPools::BondedPools` (r:1 w:1) @@ -1089,17 +1119,21 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `532` // Estimated: `3719` - // Minimum execution time: 16_759_000 picoseconds. - Weight::from_parts(17_346_000, 3719) + // Minimum execution time: 17_975_000 picoseconds. + Weight::from_parts(18_549_000, 3719) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } /// Storage: `NominationPools::BondedPools` (r:1 w:0) /// Proof: `NominationPools::BondedPools` (`max_values`: None, `max_size`: Some(254), added: 2729, mode: `MaxEncodedLen`) + /// Storage: `NominationPools::PoolMembers` (r:1 w:0) + /// Proof: `NominationPools::PoolMembers` (`max_values`: None, `max_size`: Some(237), added: 2712, mode: `MaxEncodedLen`) /// Storage: `Staking::Bonded` (r:1 w:0) /// Proof: `Staking::Bonded` (`max_values`: None, `max_size`: Some(72), added: 2547, mode: `MaxEncodedLen`) /// Storage: `Staking::Ledger` (r:1 w:0) /// Proof: `Staking::Ledger` (`max_values`: None, `max_size`: Some(1091), added: 3566, mode: `MaxEncodedLen`) + /// Storage: `Staking::MinNominatorBond` (r:1 w:0) + /// Proof: `Staking::MinNominatorBond` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) /// Storage: `Staking::Validators` (r:1 w:0) /// Proof: `Staking::Validators` (`max_values`: None, `max_size`: Some(45), added: 2520, mode: `MaxEncodedLen`) /// Storage: `Staking::Nominators` (r:1 w:1) @@ -1114,11 +1148,11 @@ impl WeightInfo for () { /// Proof: `VoterList::CounterForListNodes` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) fn chill() -> Weight { // Proof Size summary in bytes: - // Measured: `1971` + // Measured: `2143` // Estimated: `4556` - // Minimum execution time: 61_970_000 picoseconds. - Weight::from_parts(63_738_000, 4556) - .saturating_add(RocksDbWeight::get().reads(9_u64)) + // Minimum execution time: 81_574_000 picoseconds. + Weight::from_parts(83_519_000, 4556) + .saturating_add(RocksDbWeight::get().reads(11_u64)) .saturating_add(RocksDbWeight::get().writes(5_u64)) } /// Storage: `NominationPools::BondedPools` (r:1 w:1) @@ -1133,8 +1167,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `804` // Estimated: `3719` - // Minimum execution time: 31_950_000 picoseconds. - Weight::from_parts(33_190_000, 3719) + // Minimum execution time: 35_015_000 picoseconds. + Weight::from_parts(36_159_000, 3719) .saturating_add(RocksDbWeight::get().reads(4_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } @@ -1146,8 +1180,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `572` // Estimated: `3719` - // Minimum execution time: 16_807_000 picoseconds. - Weight::from_parts(17_733_000, 3719) + // Minimum execution time: 17_775_000 picoseconds. + Weight::from_parts(18_358_000, 3719) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -1157,8 +1191,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `532` // Estimated: `3719` - // Minimum execution time: 16_710_000 picoseconds. - Weight::from_parts(17_563_000, 3719) + // Minimum execution time: 16_997_000 picoseconds. + Weight::from_parts(18_041_000, 3719) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -1168,8 +1202,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `532` // Estimated: `3719` - // Minimum execution time: 16_493_000 picoseconds. - Weight::from_parts(17_022_000, 3719) + // Minimum execution time: 17_000_000 picoseconds. + Weight::from_parts(17_807_000, 3719) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -1181,8 +1215,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `542` // Estimated: `3702` - // Minimum execution time: 14_248_000 picoseconds. - Weight::from_parts(15_095_000, 3702) + // Minimum execution time: 14_803_000 picoseconds. + Weight::from_parts(15_401_000, 3702) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -1198,8 +1232,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `1002` // Estimated: `3719` - // Minimum execution time: 61_969_000 picoseconds. - Weight::from_parts(63_965_000, 3719) + // Minimum execution time: 69_759_000 picoseconds. + Weight::from_parts(71_985_000, 3719) .saturating_add(RocksDbWeight::get().reads(4_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } @@ -1215,8 +1249,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `901` // Estimated: `4764` - // Minimum execution time: 65_462_000 picoseconds. - Weight::from_parts(67_250_000, 4764) + // Minimum execution time: 73_829_000 picoseconds. + Weight::from_parts(75_966_000, 4764) .saturating_add(RocksDbWeight::get().reads(4_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } diff --git a/substrate/frame/nomination-pools/test-staking/Cargo.toml b/substrate/frame/nomination-pools/test-staking/Cargo.toml index 845535ae04f567bbe5fa4c4c7f22854b077176b5..130a27752bf37768d34bcbc1012f51524c2df277 100644 --- a/substrate/frame/nomination-pools/test-staking/Cargo.toml +++ b/substrate/frame/nomination-pools/test-staking/Cargo.toml @@ -17,7 +17,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dev-dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", features = ["derive"] } -scale-info = { version = "2.10.0", features = ["derive"] } +scale-info = { version = "2.11.1", features = ["derive"] } sp-runtime = { path = "../../../primitives/runtime" } sp-io = { path = "../../../primitives/io" } @@ -37,4 +37,4 @@ pallet-staking-reward-curve = { path = "../../staking/reward-curve" } pallet-nomination-pools = { path = ".." } sp-tracing = { path = "../../../primitives/tracing" } -log = { version = "0.4.0" } +log = { workspace = true, default-features = true } diff --git a/substrate/frame/nomination-pools/test-staking/src/lib.rs b/substrate/frame/nomination-pools/test-staking/src/lib.rs index 865b7a71e68840d00b42c7cf11e6916c8debf5ad..d84e09e32ba353267e3a2629a372bd189137454d 100644 --- a/substrate/frame/nomination-pools/test-staking/src/lib.rs +++ b/substrate/frame/nomination-pools/test-staking/src/lib.rs @@ -22,10 +22,12 @@ mod mock; use frame_support::{assert_noop, assert_ok, traits::Currency}; use mock::*; use pallet_nomination_pools::{ - BondedPools, Error as PoolsError, Event as PoolsEvent, LastPoolId, PoolMember, PoolMembers, - PoolState, + BondExtra, BondedPools, Error as PoolsError, Event as PoolsEvent, LastPoolId, PoolMember, + PoolMembers, PoolState, +}; +use pallet_staking::{ + CurrentEra, Error as StakingError, Event as StakingEvent, Payee, RewardDestination, }; -use pallet_staking::{CurrentEra, Event as StakingEvent, Payee, RewardDestination}; use sp_runtime::{bounded_btree_map, traits::Zero}; #[test] @@ -191,6 +193,131 @@ fn pool_lifecycle_e2e() { }) } +#[test] +fn pool_chill_e2e() { + new_test_ext().execute_with(|| { + assert_eq!(Balances::minimum_balance(), 5); + assert_eq!(Staking::current_era(), None); + + // create the pool, we know this has id 1. + assert_ok!(Pools::create(RuntimeOrigin::signed(10), 50, 10, 10, 10)); + assert_eq!(LastPoolId::::get(), 1); + + // have the pool nominate. + assert_ok!(Pools::nominate(RuntimeOrigin::signed(10), 1, vec![1, 2, 3])); + + assert_eq!( + staking_events_since_last_call(), + vec![StakingEvent::Bonded { stash: POOL1_BONDED, amount: 50 }] + ); + assert_eq!( + pool_events_since_last_call(), + vec![ + PoolsEvent::Created { depositor: 10, pool_id: 1 }, + PoolsEvent::Bonded { member: 10, pool_id: 1, bonded: 50, joined: true }, + ] + ); + + // have two members join + assert_ok!(Pools::join(RuntimeOrigin::signed(20), 10, 1)); + assert_ok!(Pools::join(RuntimeOrigin::signed(21), 10, 1)); + + assert_eq!( + staking_events_since_last_call(), + vec![ + StakingEvent::Bonded { stash: POOL1_BONDED, amount: 10 }, + StakingEvent::Bonded { stash: POOL1_BONDED, amount: 10 }, + ] + ); + assert_eq!( + pool_events_since_last_call(), + vec![ + PoolsEvent::Bonded { member: 20, pool_id: 1, bonded: 10, joined: true }, + PoolsEvent::Bonded { member: 21, pool_id: 1, bonded: 10, joined: true }, + ] + ); + + // in case depositor does not have more than `MinNominatorBond` staked, we can end up in + // situation where a member unbonding would cause pool balance to drop below + // `MinNominatorBond` and hence not allowed. This can happen if the `MinNominatorBond` is + // increased after the pool is created. + assert_ok!(Staking::set_staking_configs( + RuntimeOrigin::root(), + pallet_staking::ConfigOp::Set(55), // minimum nominator bond + pallet_staking::ConfigOp::Noop, + pallet_staking::ConfigOp::Noop, + pallet_staking::ConfigOp::Noop, + pallet_staking::ConfigOp::Noop, + pallet_staking::ConfigOp::Noop, + pallet_staking::ConfigOp::Noop, + )); + + // members can unbond as long as total stake of the pool is above min nominator bond + assert_ok!(Pools::unbond(RuntimeOrigin::signed(20), 20, 10),); + assert_eq!(PoolMembers::::get(20).unwrap().unbonding_eras.len(), 1); + assert_eq!(PoolMembers::::get(20).unwrap().points, 0); + + // this member cannot unbond since it will cause `pool stake < MinNominatorBond` + assert_noop!( + Pools::unbond(RuntimeOrigin::signed(21), 21, 10), + StakingError::::InsufficientBond, + ); + + // members can call `chill` permissionlessly now + assert_ok!(Pools::chill(RuntimeOrigin::signed(20), 1)); + + // now another member can unbond. + assert_ok!(Pools::unbond(RuntimeOrigin::signed(21), 21, 10)); + assert_eq!(PoolMembers::::get(21).unwrap().unbonding_eras.len(), 1); + assert_eq!(PoolMembers::::get(21).unwrap().points, 0); + + // nominator can not resume nomination until depositor have enough stake + assert_noop!( + Pools::nominate(RuntimeOrigin::signed(10), 1, vec![1, 2, 3]), + PoolsError::::MinimumBondNotMet, + ); + + // other members joining pool does not affect the depositor's ability to resume nomination + assert_ok!(Pools::join(RuntimeOrigin::signed(22), 10, 1)); + + assert_noop!( + Pools::nominate(RuntimeOrigin::signed(10), 1, vec![1, 2, 3]), + PoolsError::::MinimumBondNotMet, + ); + + // depositor can bond extra stake + assert_ok!(Pools::bond_extra(RuntimeOrigin::signed(10), BondExtra::FreeBalance(10))); + + // `chill` can not be called permissionlessly anymore + assert_noop!( + Pools::chill(RuntimeOrigin::signed(20), 1), + PoolsError::::NotNominator, + ); + + // now nominator can resume nomination + assert_ok!(Pools::nominate(RuntimeOrigin::signed(10), 1, vec![1, 2, 3])); + + // skip to make the unbonding period end. + CurrentEra::::set(Some(BondingDuration::get())); + + // members can now withdraw. + assert_ok!(Pools::withdraw_unbonded(RuntimeOrigin::signed(20), 20, 0)); + assert_ok!(Pools::withdraw_unbonded(RuntimeOrigin::signed(21), 21, 0)); + + assert_eq!( + staking_events_since_last_call(), + vec![ + StakingEvent::Unbonded { stash: POOL1_BONDED, amount: 10 }, + StakingEvent::Chilled { stash: POOL1_BONDED }, + StakingEvent::Unbonded { stash: POOL1_BONDED, amount: 10 }, + StakingEvent::Bonded { stash: POOL1_BONDED, amount: 10 }, // other member bonding + StakingEvent::Bonded { stash: POOL1_BONDED, amount: 10 }, // depositor bond extra + StakingEvent::Withdrawn { stash: POOL1_BONDED, amount: 20 }, + ] + ); + }) +} + #[test] fn pool_slash_e2e() { new_test_ext().execute_with(|| { @@ -286,7 +413,7 @@ fn pool_slash_e2e() { ] ); - // At this point, 20 are safe from slash, 30 are unlocking but vulnerable to slash, and and + // At this point, 20 are safe from slash, 30 are unlocking but vulnerable to slash, and // another 30 are active and vulnerable to slash. Let's slash half of them. pallet_staking::slashing::do_slash::( &POOL1_BONDED, diff --git a/substrate/frame/nomination-pools/test-staking/src/mock.rs b/substrate/frame/nomination-pools/test-staking/src/mock.rs index d1b50b9f7aed0573b8351ff34d4f68eecf66c02c..2ec47e0d164558defb0e70d260def626406680e7 100644 --- a/substrate/frame/nomination-pools/test-staking/src/mock.rs +++ b/substrate/frame/nomination-pools/test-staking/src/mock.rs @@ -38,7 +38,7 @@ pub(crate) type T = Runtime; pub(crate) const POOL1_BONDED: AccountId = 20318131474730217858575332831085u128; pub(crate) const POOL1_REWARD: AccountId = 20397359637244482196168876781421u128; -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Runtime { type BaseCallFilter = frame_support::traits::Everything; type BlockWeights = (); @@ -186,6 +186,7 @@ impl pallet_nomination_pools::Config for Runtime { type MaxUnbonding = ConstU32<8>; type MaxPointsToBalance = ConstU8<10>; type PalletId = PoolsPalletId; + type AdminOrigin = frame_system::EnsureRoot; } type Block = frame_system::mocking::MockBlock; @@ -236,6 +237,7 @@ pub fn new_test_ext() -> sp_io::TestExternalities { pallet_staking::ConfigOp::Noop, pallet_staking::ConfigOp::Noop, pallet_staking::ConfigOp::Noop, + pallet_staking::ConfigOp::Noop, )); }); diff --git a/substrate/frame/offences/Cargo.toml b/substrate/frame/offences/Cargo.toml index 73842c696af294adb729c7621e239fe7dcd7e4d8..f8efc88bafc1aa3ec4bceb9150d62268499d62b3 100644 --- a/substrate/frame/offences/Cargo.toml +++ b/substrate/frame/offences/Cargo.toml @@ -17,9 +17,9 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } -log = { version = "0.4.17", default-features = false } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.195", optional = true } +log = { workspace = true } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +serde = { optional = true, workspace = true, default-features = true } frame-support = { path = "../support", default-features = false } frame-system = { path = "../system", default-features = false } pallet-balances = { path = "../balances", default-features = false } diff --git a/substrate/frame/offences/benchmarking/Cargo.toml b/substrate/frame/offences/benchmarking/Cargo.toml index fc3fb076f1f9ecf4652cfa64f3daa7ca1e5d4478..07905a1e0aa42d2aa859046b595569e275fe778a 100644 --- a/substrate/frame/offences/benchmarking/Cargo.toml +++ b/substrate/frame/offences/benchmarking/Cargo.toml @@ -17,7 +17,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } frame-benchmarking = { path = "../../benchmarking", default-features = false } frame-election-provider-support = { path = "../../election-provider-support", default-features = false } frame-support = { path = "../../support", default-features = false } @@ -32,7 +32,7 @@ pallet-staking = { path = "../../staking", default-features = false } sp-runtime = { path = "../../../primitives/runtime", default-features = false } sp-staking = { path = "../../../primitives/staking", default-features = false } sp-std = { path = "../../../primitives/std", default-features = false } -log = { version = "0.4.17", default-features = false } +log = { workspace = true } [dev-dependencies] pallet-staking-reward-curve = { path = "../../staking/reward-curve" } diff --git a/substrate/frame/offences/benchmarking/src/mock.rs b/substrate/frame/offences/benchmarking/src/mock.rs index 01ad8d64f100672dc36929d28af22e41f8a88c60..ea2e9e93ed68aabf1b30de0a1cbe5a235acdbcad 100644 --- a/substrate/frame/offences/benchmarking/src/mock.rs +++ b/substrate/frame/offences/benchmarking/src/mock.rs @@ -40,7 +40,7 @@ type AccountId = u64; type Nonce = u32; type Balance = u64; -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { type BaseCallFilter = frame_support::traits::Everything; type BlockWeights = (); diff --git a/substrate/frame/offences/src/mock.rs b/substrate/frame/offences/src/mock.rs index d97be99def1cccb3a0dbd5762b552d20000034d2..31d5f805f3e4894407cd245db8bd7856d73c57cc 100644 --- a/substrate/frame/offences/src/mock.rs +++ b/substrate/frame/offences/src/mock.rs @@ -74,7 +74,7 @@ frame_support::construct_runtime!( } ); -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Runtime { type BaseCallFilter = frame_support::traits::Everything; type BlockWeights = (); diff --git a/substrate/frame/offences/src/tests.rs b/substrate/frame/offences/src/tests.rs index d525c7c3ab1d920e07273f26168d3711517e5827..4897b78f3e4d37ccabaad6a5fa1b3c6acbac45b2 100644 --- a/substrate/frame/offences/src/tests.rs +++ b/substrate/frame/offences/src/tests.rs @@ -204,7 +204,7 @@ fn reports_if_an_offence_is_dup() { assert_eq!(Offences::report_offence(vec![], test_offence.clone()), Ok(())); // creating a new offence for the same authorities on the next slot - // should be considered a new offence and thefore not known + // should be considered a new offence and therefore not known let test_offence_next_slot = offence(time_slot + 1, vec![0, 1]); assert!(!>::is_known_offence( &test_offence_next_slot.offenders, diff --git a/substrate/frame/paged-list/Cargo.toml b/substrate/frame/paged-list/Cargo.toml index 6a2af120f32a914452fd67279a18f8cabe54025b..26f3d7e48ced011697194abe734f87bee84756ee 100644 --- a/substrate/frame/paged-list/Cargo.toml +++ b/substrate/frame/paged-list/Cargo.toml @@ -16,8 +16,8 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } -docify = "0.2.7" -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +docify = "0.2.8" +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } frame-benchmarking = { path = "../benchmarking", default-features = false, optional = true } frame-support = { path = "../support", default-features = false } diff --git a/substrate/frame/paged-list/src/mock.rs b/substrate/frame/paged-list/src/mock.rs index 37bdc4f157cb9861eb0e387f7b0954c4068fa13d..5d06170aae7f991ae1e0b77c530272cbd5ef14dd 100644 --- a/substrate/frame/paged-list/src/mock.rs +++ b/substrate/frame/paged-list/src/mock.rs @@ -41,7 +41,7 @@ frame_support::construct_runtime!( } ); -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { type BaseCallFilter = frame_support::traits::Everything; type BlockWeights = (); diff --git a/substrate/frame/paged-list/src/paged_list.rs b/substrate/frame/paged-list/src/paged_list.rs index 75467f3ceeb582e04c8e02eb7629637358a760e1..eecc728cd62a1dcd29c4db1d48a642102421be9c 100644 --- a/substrate/frame/paged-list/src/paged_list.rs +++ b/substrate/frame/paged-list/src/paged_list.rs @@ -190,7 +190,7 @@ impl Page { let values = sp_io::storage::get(&key) .and_then(|raw| sp_std::vec::Vec::::decode(&mut &raw[..]).ok())?; if values.is_empty() { - // Dont create empty pages. + // Don't create empty pages. return None } let values = values.into_iter().skip(value_index as usize); diff --git a/substrate/frame/parameters/Cargo.toml b/substrate/frame/parameters/Cargo.toml new file mode 100644 index 0000000000000000000000000000000000000000..b718b391019a701194678e819a1c823371e15231 --- /dev/null +++ b/substrate/frame/parameters/Cargo.toml @@ -0,0 +1,57 @@ +[package] +name = "pallet-parameters" +description = "Pallet to store and configure parameters." +repository.workspace = true +license = "Apache-2.0" +version = "0.1.0" +authors = ["Acala Developers", "Parity Technologies "] +edition.workspace = true + +[dependencies] +codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["max-encoded-len"] } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +paste = { version = "1.0.14", default-features = false } +serde = { features = ["derive"], optional = true, workspace = true, default-features = true } +docify = "0.2.8" + +frame-support = { path = "../support", default-features = false, features = ["experimental"] } +frame-system = { path = "../system", default-features = false } +sp-core = { path = "../../primitives/core", default-features = false } +sp-runtime = { path = "../../primitives/runtime", default-features = false } +sp-std = { path = "../../primitives/std", default-features = false } +frame-benchmarking = { path = "../benchmarking", default-features = false, optional = true } + +[dev-dependencies] +sp-core = { path = "../../primitives/core", features = ["std"] } +sp-io = { path = "../../primitives/io", features = ["std"] } +pallet-example-basic = { path = "../examples/basic", features = ["std"] } +pallet-balances = { path = "../balances", features = ["std"] } + +[features] +default = ["std"] +std = [ + "codec/std", + "frame-benchmarking?/std", + "frame-support/std", + "frame-system/std", + "scale-info/std", + "serde", + "sp-core/std", + "sp-runtime/std", + "sp-std/std", +] +runtime-benchmarks = [ + "frame-benchmarking/runtime-benchmarks", + "frame-support/runtime-benchmarks", + "frame-system/runtime-benchmarks", + "pallet-balances/runtime-benchmarks", + "pallet-example-basic/runtime-benchmarks", + "sp-runtime/runtime-benchmarks", +] +try-runtime = [ + "frame-support/try-runtime", + "frame-system/try-runtime", + "pallet-balances/try-runtime", + "pallet-example-basic/try-runtime", + "sp-runtime/try-runtime", +] diff --git a/substrate/frame/parameters/src/benchmarking.rs b/substrate/frame/parameters/src/benchmarking.rs new file mode 100644 index 0000000000000000000000000000000000000000..1f22e026cbca07b236c4680570a3312d8c4b85e5 --- /dev/null +++ b/substrate/frame/parameters/src/benchmarking.rs @@ -0,0 +1,51 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Parameters pallet benchmarking. + +#![cfg(feature = "runtime-benchmarks")] + +use super::*; +#[cfg(test)] +use crate::Pallet as Parameters; + +use frame_benchmarking::v2::*; + +#[benchmarks(where T::RuntimeParameters: Default)] +mod benchmarks { + use super::*; + + #[benchmark] + fn set_parameter() -> Result<(), BenchmarkError> { + let kv = T::RuntimeParameters::default(); + let k = kv.clone().into_parts().0; + + let origin = + T::AdminOrigin::try_successful_origin(&k).map_err(|_| BenchmarkError::Weightless)?; + + #[extrinsic_call] + _(origin as T::RuntimeOrigin, kv); + + Ok(()) + } + + impl_benchmark_test_suite! { + Parameters, + crate::tests::mock::new_test_ext(), + crate::tests::mock::Runtime, + } +} diff --git a/substrate/frame/parameters/src/lib.rs b/substrate/frame/parameters/src/lib.rs new file mode 100644 index 0000000000000000000000000000000000000000..55a6f1ff91ded0222e2596c4ded133a5a5bc0719 --- /dev/null +++ b/substrate/frame/parameters/src/lib.rs @@ -0,0 +1,270 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#![cfg_attr(not(feature = "std"), no_std)] +#![deny(missing_docs)] +// Need to enable this one since we document feature-gated stuff. +#![allow(rustdoc::broken_intra_doc_links)] + +//! # **⚠️ WARNING ⚠️** +//! +//!
+//! THIS CRATE IS NOT AUDITED AND SHOULD NOT BE USED IN PRODUCTION. +//!
+//! +//! # Parameters +//! +//! Allows to update configuration parameters at runtime. +//! +//! ## Pallet API +//! +//! This pallet exposes two APIs; one *inbound* side to update parameters, and one *outbound* side +//! to access said parameters. Parameters themselves are defined in the runtime config and will be +//! aggregated into an enum. Each parameter is addressed by a `key` and can have a default value. +//! This is not done by the pallet but through the [`frame_support::dynamic_params::dynamic_params`] +//! macro or alternatives. +//! +//! Note that this is incurring one storage read per access. This should not be a problem in most +//! cases but must be considered in weight-restrained code. +//! +//! ### Inbound +//! +//! The inbound side solely consists of the [`Pallet::set_parameter`] extrinsic to update the value +//! of a parameter. Each parameter can have their own admin origin as given by the +//! [`Config::AdminOrigin`]. +//! +//! ### Outbound +//! +//! The outbound side is runtime facing for the most part. More general, it provides a `Get` +//! implementation and can be used in every spot where that is accepted. Two macros are in place: +//! [`frame_support::dynamic_params::define_parameters` and +//! [`frame_support::dynamic_params:dynamic_pallet_params`] to define and expose parameters in a +//! typed manner. +//! +//! See the [`pallet`] module for more information about the interfaces this pallet exposes, +//! including its configuration trait, dispatchables, storage items, events and errors. +//! +//! ## Overview +//! +//! This pallet is a good fit for updating parameters without a runtime upgrade. It is very handy to +//! not require a runtime upgrade for a simple parameter change since runtime upgrades require a lot +//! of diligence and always bear risks. It seems overkill to update the whole runtime for a simple +//! parameter change. This pallet allows for fine-grained control over who can update what. +//! The only down-side is that it trades off performance with convenience and should therefore only +//! be used in places where that is proven to be uncritical. Values that are rarely accessed but +//! change often would be a perfect fit. +//! +//! ### Example Configuration +//! +//! Here is an example of how to define some parameters, including their default values: +#![doc = docify::embed!("src/tests/mock.rs", dynamic_params)] +//! +//! A permissioned origin can be define on a per-key basis like this: +#![doc = docify::embed!("src/tests/mock.rs", custom_origin)] +//! +//! The pallet will also require a default value for benchmarking. Ideally this is the variant with +//! the longest encoded length. Although in either case the PoV benchmarking will take the worst +//! case over the whole enum. +#![doc = docify::embed!("src/tests/mock.rs", benchmarking_default)] +//! +//! Now the aggregated parameter needs to be injected into the pallet config: +#![doc = docify::embed!("src/tests/mock.rs", impl_config)] +//! +//! As last step, the parameters can now be used in other pallets 🙌 +#![doc = docify::embed!("src/tests/mock.rs", usage)] +//! +//! ### Examples Usage +//! +//! Now to demonstrate how the values can be updated: +#![doc = docify::embed!("src/tests/unit.rs", set_parameters_example)] +//! +//! ## Low Level / Implementation Details +//! +//! The pallet stores the parameters in a storage map and implements the matching `Get` for +//! each `Key` type. The `Get` then accesses the `Parameters` map to retrieve the value. An event is +//! emitted every time that a value was updated. It is even emitted when the value is changed to the +//! same. +//! +//! The key and value types themselves are defined by macros and aggregated into a runtime wide +//! enum. This enum is then injected into the pallet. This allows it to be used without any changes +//! to the pallet that the parameter will be utilized by. +//! +//! ### Design Goals +//! +//! 1. Easy to update without runtime upgrade. +//! 2. Exposes metadata and docs for user convenience. +//! 3. Can be permissioned on a per-key base. +//! +//! ### Design +//! +//! 1. Everything is done at runtime without the need for `const` values. `Get` allows for this - +//! which is coincidentally an upside and a downside. 2. The types are defined through macros, which +//! allows to expose metadata and docs. 3. Access control is done through the `EnsureOriginWithArg` +//! trait, that allows to pass data along to the origin check. It gets passed in the key. The +//! implementor can then match on the key and the origin to decide whether the origin is +//! permissioned to set the value. + +use frame_support::pallet_prelude::*; +use frame_system::pallet_prelude::*; + +use frame_support::traits::{ + dynamic_params::{AggregatedKeyValue, IntoKey, Key, RuntimeParameterStore, TryIntoKey}, + EnsureOriginWithArg, +}; + +mod benchmarking; +#[cfg(test)] +mod tests; +mod weights; + +pub use pallet::*; +pub use weights::WeightInfo; + +/// The key type of a parameter. +type KeyOf = <::RuntimeParameters as AggregatedKeyValue>::Key; + +/// The value type of a parameter. +type ValueOf = <::RuntimeParameters as AggregatedKeyValue>::Value; + +#[frame_support::pallet] +pub mod pallet { + use super::*; + + #[pallet::config(with_default)] + pub trait Config: frame_system::Config { + /// The overarching event type. + #[pallet::no_default_bounds] + type RuntimeEvent: From> + IsType<::RuntimeEvent>; + + /// The overarching KV type of the parameters. + /// + /// Usually created by [`frame_support::dynamic_params`] or equivalent. + #[pallet::no_default_bounds] + type RuntimeParameters: AggregatedKeyValue; + + /// The origin which may update a parameter. + /// + /// The key of the parameter is passed in as second argument to allow for fine grained + /// control. + #[pallet::no_default_bounds] + type AdminOrigin: EnsureOriginWithArg>; + + /// Weight information for extrinsics in this module. + type WeightInfo: WeightInfo; + } + + #[pallet::event] + #[pallet::generate_deposit(pub(crate) fn deposit_event)] + pub enum Event { + /// A Parameter was set. + /// + /// Is also emitted when the value was not changed. + Updated { + /// The key that was updated. + key: ::Key, + /// The old value before this call. + old_value: Option<::Value>, + /// The new value after this call. + new_value: Option<::Value>, + }, + } + + /// Stored parameters. + #[pallet::storage] + pub type Parameters = + StorageMap<_, Blake2_128Concat, KeyOf, ValueOf, OptionQuery>; + + #[pallet::pallet] + pub struct Pallet(_); + + #[pallet::call] + impl Pallet { + /// Set the value of a parameter. + /// + /// The dispatch origin of this call must be `AdminOrigin` for the given `key`. Values be + /// deleted by setting them to `None`. + #[pallet::call_index(0)] + #[pallet::weight(T::WeightInfo::set_parameter())] + pub fn set_parameter( + origin: OriginFor, + key_value: T::RuntimeParameters, + ) -> DispatchResult { + let (key, new) = key_value.into_parts(); + T::AdminOrigin::ensure_origin(origin, &key)?; + + let mut old = None; + Parameters::::mutate(&key, |v| { + old = v.clone(); + *v = new.clone(); + }); + + Self::deposit_event(Event::Updated { key, old_value: old, new_value: new }); + + Ok(()) + } + } + /// Default implementations of [`DefaultConfig`], which can be used to implement [`Config`]. + pub mod config_preludes { + use super::*; + use frame_support::derive_impl; + + /// A configuration for testing. + pub struct TestDefaultConfig; + + #[derive_impl(frame_system::config_preludes::TestDefaultConfig, no_aggregated_types)] + impl frame_system::DefaultConfig for TestDefaultConfig {} + + #[frame_support::register_default_impl(TestDefaultConfig)] + impl DefaultConfig for TestDefaultConfig { + #[inject_runtime_type] + type RuntimeEvent = (); + #[inject_runtime_type] + type RuntimeParameters = (); + + type AdminOrigin = frame_support::traits::AsEnsureOriginWithArg< + frame_system::EnsureRoot, + >; + + type WeightInfo = (); + } + } +} + +impl RuntimeParameterStore for Pallet { + type AggregatedKeyValue = T::RuntimeParameters; + + fn get(key: K) -> Option + where + KV: AggregatedKeyValue, + K: Key + Into<::Key>, + ::Key: IntoKey< + <::AggregatedKeyValue as AggregatedKeyValue>::Key, + >, + <::AggregatedKeyValue as AggregatedKeyValue>::Value: + TryIntoKey<::Value>, + ::Value: TryInto, + { + let key: ::Key = key.into(); + let val = Parameters::::get(key.into_key()); + val.and_then(|v| { + let val: ::Value = v.try_into_key().ok()?; + let val: K::WrappedValue = val.try_into().ok()?; + let val = val.into(); + Some(val) + }) + } +} diff --git a/substrate/frame/parameters/src/tests/mock.rs b/substrate/frame/parameters/src/tests/mock.rs new file mode 100644 index 0000000000000000000000000000000000000000..4c7dda639a9ae762c94b355174e7e4ca59869afe --- /dev/null +++ b/substrate/frame/parameters/src/tests/mock.rs @@ -0,0 +1,152 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#![cfg(any(test, feature = "runtime-benchmarks"))] + +//! Mock runtime that configures the `pallet_example_basic` to use dynamic params for testing. + +use frame_support::{ + construct_runtime, derive_impl, + dynamic_params::{dynamic_pallet_params, dynamic_params}, + traits::EnsureOriginWithArg, +}; + +use crate as pallet_parameters; +use crate::*; + +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] +impl frame_system::Config for Runtime { + type Block = frame_system::mocking::MockBlock; + type AccountData = pallet_balances::AccountData<::Balance>; +} + +#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] +impl pallet_balances::Config for Runtime { + type ReserveIdentifier = [u8; 8]; + type AccountStore = System; +} + +#[docify::export] +#[dynamic_params(RuntimeParameters, pallet_parameters::Parameters::)] +pub mod dynamic_params { + use super::*; + + #[dynamic_pallet_params] + #[codec(index = 3)] + pub mod pallet1 { + #[codec(index = 0)] + pub static Key1: u64 = 0; + #[codec(index = 1)] + pub static Key2: u32 = 1; + #[codec(index = 2)] + pub static Key3: u128 = 2; + } + + #[dynamic_pallet_params] + #[codec(index = 1)] + pub mod pallet2 { + #[codec(index = 2)] + pub static Key1: u64 = 0; + #[codec(index = 1)] + pub static Key2: u32 = 2; + #[codec(index = 0)] + pub static Key3: u128 = 4; + } +} + +#[docify::export(benchmarking_default)] +#[cfg(feature = "runtime-benchmarks")] +impl Default for RuntimeParameters { + fn default() -> Self { + RuntimeParameters::Pallet1(dynamic_params::pallet1::Parameters::Key1( + dynamic_params::pallet1::Key1, + Some(123), + )) + } +} + +#[docify::export] +mod custom_origin { + use super::*; + pub struct ParamsManager; + + impl EnsureOriginWithArg for ParamsManager { + type Success = (); + + fn try_origin( + origin: RuntimeOrigin, + key: &RuntimeParametersKey, + ) -> Result { + // Account 123 is allowed to set parameters in benchmarking only: + #[cfg(feature = "runtime-benchmarks")] + if ensure_signed(origin.clone()).map_or(false, |acc| acc == 123) { + return Ok(()); + } + + match key { + RuntimeParametersKey::Pallet1(_) => ensure_root(origin.clone()), + RuntimeParametersKey::Pallet2(_) => ensure_signed(origin.clone()).map(|_| ()), + } + .map_err(|_| origin) + } + + #[cfg(feature = "runtime-benchmarks")] + fn try_successful_origin(_key: &RuntimeParametersKey) -> Result { + Ok(RuntimeOrigin::signed(123)) + } + } +} + +#[docify::export(impl_config)] +#[derive_impl(pallet_parameters::config_preludes::TestDefaultConfig)] +impl Config for Runtime { + type AdminOrigin = custom_origin::ParamsManager; + // RuntimeParameters is injected by the `derive_impl` macro. + // RuntimeEvent is injected by the `derive_impl` macro. + // WeightInfo is injected by the `derive_impl` macro. +} + +#[docify::export(usage)] +impl pallet_example_basic::Config for Runtime { + // Use the dynamic key in the pallet config: + type MagicNumber = dynamic_params::pallet1::Key1; + + type RuntimeEvent = RuntimeEvent; + type WeightInfo = (); +} + +construct_runtime!( + pub enum Runtime { + System: frame_system, + PalletParameters: crate, + Example: pallet_example_basic, + Balances: pallet_balances, + } +); + +pub fn new_test_ext() -> sp_io::TestExternalities { + let mut ext = sp_io::TestExternalities::new(Default::default()); + ext.execute_with(|| System::set_block_number(1)); + ext +} + +pub(crate) fn assert_last_event(generic_event: RuntimeEvent) { + let events = frame_system::Pallet::::events(); + // compare to the last event record + let frame_system::EventRecord { event, .. } = &events.last().expect("Event expected"); + assert_eq!(event, &generic_event); +} diff --git a/substrate/utils/frame/try-runtime/cli/src/commands/mod.rs b/substrate/frame/parameters/src/tests/mod.rs similarity index 82% rename from substrate/utils/frame/try-runtime/cli/src/commands/mod.rs rename to substrate/frame/parameters/src/tests/mod.rs index 37902e676e3db3d7714dda9a522ec3220ab9ad3a..0a2d16906aadd394c5facb8c2bdbf45195574246 100644 --- a/substrate/utils/frame/try-runtime/cli/src/commands/mod.rs +++ b/substrate/frame/parameters/src/tests/mod.rs @@ -15,9 +15,6 @@ // See the License for the specific language governing permissions and // limitations under the License. -pub mod create_snapshot; -pub mod execute_block; -pub mod fast_forward; -pub mod follow_chain; -pub mod offchain_worker; -pub mod on_runtime_upgrade; +pub(crate) mod mock; +mod test_renamed; +mod unit; diff --git a/substrate/frame/parameters/src/tests/test_renamed.rs b/substrate/frame/parameters/src/tests/test_renamed.rs new file mode 100644 index 0000000000000000000000000000000000000000..cfc870fbe1096aeeab930d548e6455427962d62a --- /dev/null +++ b/substrate/frame/parameters/src/tests/test_renamed.rs @@ -0,0 +1,168 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#![cfg(any(test, feature = "runtime-benchmarks"))] + +//! Tests that the runtime params can be renamed. + +use frame_support::{ + assert_noop, assert_ok, construct_runtime, derive_impl, + dynamic_params::{dynamic_pallet_params, dynamic_params}, + traits::AsEnsureOriginWithArg, +}; +use frame_system::EnsureRoot; + +use crate as pallet_parameters; +use crate::*; +use dynamic_params::*; +use RuntimeParametersRenamed::*; + +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] +impl frame_system::Config for Runtime { + type Block = frame_system::mocking::MockBlock; + type AccountData = pallet_balances::AccountData<::Balance>; +} + +#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] +impl pallet_balances::Config for Runtime { + type ReserveIdentifier = [u8; 8]; + type AccountStore = System; +} + +#[dynamic_params(RuntimeParametersRenamed, pallet_parameters::Parameters::)] +pub mod dynamic_params { + use super::*; + + #[dynamic_pallet_params] + #[codec(index = 3)] + pub mod pallet1 { + #[codec(index = 0)] + pub static Key1: u64 = 0; + #[codec(index = 1)] + pub static Key2: u32 = 1; + #[codec(index = 2)] + pub static Key3: u128 = 2; + } + + #[dynamic_pallet_params] + #[codec(index = 1)] + pub mod pallet2 { + #[codec(index = 2)] + pub static Key1: u64 = 0; + #[codec(index = 1)] + pub static Key2: u32 = 2; + #[codec(index = 0)] + pub static Key3: u128 = 4; + } +} + +#[cfg(feature = "runtime-benchmarks")] +impl Default for RuntimeParametersRenamed { + fn default() -> Self { + RuntimeParametersRenamed::Pallet1(dynamic_params::pallet1::Parameters::Key1( + dynamic_params::pallet1::Key1, + Some(123), + )) + } +} + +#[derive_impl(pallet_parameters::config_preludes::TestDefaultConfig)] +impl Config for Runtime { + type AdminOrigin = AsEnsureOriginWithArg>; + type RuntimeParameters = RuntimeParametersRenamed; + // RuntimeEvent is injected by the `derive_impl` macro. + // WeightInfo is injected by the `derive_impl` macro. +} + +impl pallet_example_basic::Config for Runtime { + // Use the dynamic key in the pallet config: + type MagicNumber = dynamic_params::pallet1::Key1; + + type RuntimeEvent = RuntimeEvent; + type WeightInfo = (); +} + +construct_runtime!( + pub enum Runtime { + System: frame_system, + PalletParameters: crate, + Example: pallet_example_basic, + Balances: pallet_balances, + } +); + +pub fn new_test_ext() -> sp_io::TestExternalities { + let mut ext = sp_io::TestExternalities::new(Default::default()); + ext.execute_with(|| System::set_block_number(1)); + ext +} + +pub(crate) fn assert_last_event(generic_event: RuntimeEvent) { + let events = frame_system::Pallet::::events(); + // compare to the last event record + let frame_system::EventRecord { event, .. } = &events.last().expect("Event expected"); + assert_eq!(event, &generic_event); +} + +#[test] +fn set_parameters_example() { + new_test_ext().execute_with(|| { + assert_eq!(pallet1::Key3::get(), 2, "Default works"); + + // This gets rejected since the origin is not root. + assert_noop!( + PalletParameters::set_parameter( + RuntimeOrigin::signed(1), + Pallet1(pallet1::Parameters::Key3(pallet1::Key3, Some(123))), + ), + DispatchError::BadOrigin + ); + + assert_ok!(PalletParameters::set_parameter( + RuntimeOrigin::root(), + Pallet1(pallet1::Parameters::Key3(pallet1::Key3, Some(123))), + )); + + assert_eq!(pallet1::Key3::get(), 123, "Update works"); + assert_last_event( + crate::Event::Updated { + key: RuntimeParametersRenamedKey::Pallet1(pallet1::ParametersKey::Key3( + pallet1::Key3, + )), + old_value: None, + new_value: Some(RuntimeParametersRenamedValue::Pallet1( + pallet1::ParametersValue::Key3(123), + )), + } + .into(), + ); + }); +} + +#[test] +fn get_through_external_pallet_works() { + new_test_ext().execute_with(|| { + assert_eq!(::MagicNumber::get(), 0); + + assert_ok!(PalletParameters::set_parameter( + RuntimeOrigin::root(), + Pallet1(pallet1::Parameters::Key1(pallet1::Key1, Some(123))), + )); + + assert_eq!(::MagicNumber::get(), 123); + }); +} diff --git a/substrate/frame/parameters/src/tests/unit.rs b/substrate/frame/parameters/src/tests/unit.rs new file mode 100644 index 0000000000000000000000000000000000000000..d811a83564657d75759f652a849402f2b912422f --- /dev/null +++ b/substrate/frame/parameters/src/tests/unit.rs @@ -0,0 +1,311 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Unit tests for the parameters pallet. + +#![cfg(test)] + +use crate::tests::mock::{ + assert_last_event, dynamic_params::*, new_test_ext, PalletParameters, Runtime, + RuntimeOrigin as Origin, RuntimeParameters, RuntimeParameters::*, RuntimeParametersKey, + RuntimeParametersValue, +}; +use codec::Encode; +use frame_support::{assert_noop, assert_ok, traits::dynamic_params::AggregatedKeyValue}; +use sp_core::Get; +use sp_runtime::DispatchError; + +#[docify::export] +#[test] +fn set_parameters_example() { + new_test_ext().execute_with(|| { + assert_eq!(pallet1::Key3::get(), 2, "Default works"); + + // This gets rejected since the origin is not root. + assert_noop!( + PalletParameters::set_parameter( + Origin::signed(1), + Pallet1(pallet1::Parameters::Key3(pallet1::Key3, Some(123))), + ), + DispatchError::BadOrigin + ); + + assert_ok!(PalletParameters::set_parameter( + Origin::root(), + Pallet1(pallet1::Parameters::Key3(pallet1::Key3, Some(123))), + )); + + assert_eq!(pallet1::Key3::get(), 123, "Update works"); + assert_last_event( + crate::Event::Updated { + key: RuntimeParametersKey::Pallet1(pallet1::ParametersKey::Key3(pallet1::Key3)), + old_value: None, + new_value: Some(RuntimeParametersValue::Pallet1(pallet1::ParametersValue::Key3( + 123, + ))), + } + .into(), + ); + }); +} + +#[test] +fn set_parameters_same_is_noop() { + new_test_ext().execute_with(|| { + assert_ok!(PalletParameters::set_parameter( + Origin::root(), + Pallet1(pallet1::Parameters::Key3(pallet1::Key3, Some(123))), + )); + + assert_ok!(PalletParameters::set_parameter( + Origin::root(), + Pallet1(pallet1::Parameters::Key3(pallet1::Key3, Some(123))), + )); + + assert_eq!(pallet1::Key3::get(), 123, "Update works"); + }); +} + +#[test] +fn set_parameters_twice_works() { + new_test_ext().execute_with(|| { + assert_ok!(PalletParameters::set_parameter( + Origin::root(), + Pallet1(pallet1::Parameters::Key3(pallet1::Key3, Some(123))), + )); + + assert_ok!(PalletParameters::set_parameter( + Origin::root(), + Pallet1(pallet1::Parameters::Key3(pallet1::Key3, Some(432))), + )); + + assert_eq!(pallet1::Key3::get(), 432, "Update works"); + }); +} + +#[test] +fn set_parameters_removing_restores_default_works() { + new_test_ext().execute_with(|| { + assert_ok!(PalletParameters::set_parameter( + Origin::root(), + Pallet1(pallet1::Parameters::Key3(pallet1::Key3, Some(123))), + )); + + assert_eq!(pallet1::Key3::get(), 123, "Update works"); + assert!( + crate::Parameters::::contains_key(RuntimeParametersKey::Pallet1( + pallet1::ParametersKey::Key3(pallet1::Key3) + )), + "Key inserted" + ); + + // Removing the value restores the default. + assert_ok!(PalletParameters::set_parameter( + Origin::root(), + Pallet1(pallet1::Parameters::Key3(pallet1::Key3, None)), + )); + + assert_eq!(pallet1::Key3::get(), 2, "Default restored"); + assert!( + !crate::Parameters::::contains_key(RuntimeParametersKey::Pallet1( + pallet1::ParametersKey::Key3(pallet1::Key3) + )), + "Key removed" + ); + }); +} + +#[test] +fn set_parameters_to_default_emits_events_works() { + new_test_ext().execute_with(|| { + assert_eq!(pallet1::Key3::get(), 2); + assert_ok!(PalletParameters::set_parameter( + Origin::root(), + Pallet1(pallet1::Parameters::Key3(pallet1::Key3, Some(2))), + )); + assert_eq!(pallet1::Key3::get(), 2); + + assert!( + crate::Parameters::::contains_key(RuntimeParametersKey::Pallet1( + pallet1::ParametersKey::Key3(pallet1::Key3) + )), + "Key inserted" + ); + assert_last_event( + crate::Event::Updated { + key: RuntimeParametersKey::Pallet1(pallet1::ParametersKey::Key3(pallet1::Key3)), + old_value: None, + new_value: Some(RuntimeParametersValue::Pallet1(pallet1::ParametersValue::Key3(2))), + } + .into(), + ); + + // It will also emit a second event: + assert_ok!(PalletParameters::set_parameter( + Origin::root(), + Pallet1(pallet1::Parameters::Key3(pallet1::Key3, Some(2))), + )); + assert_eq!(frame_system::Pallet::::events().len(), 2); + }); +} + +#[test] +fn set_parameters_wrong_origin_errors() { + new_test_ext().execute_with(|| { + // Pallet1 is root origin only: + assert_ok!(PalletParameters::set_parameter( + Origin::root(), + Pallet1(pallet1::Parameters::Key3(pallet1::Key3, Some(123))), + )); + + assert_noop!( + PalletParameters::set_parameter( + Origin::signed(1), + Pallet1(pallet1::Parameters::Key3(pallet1::Key3, Some(432))), + ), + DispatchError::BadOrigin + ); + + // Pallet2 is signed origin only: + assert_ok!(PalletParameters::set_parameter( + Origin::signed(1), + Pallet2(pallet2::Parameters::Key3(pallet2::Key3, Some(123))), + )); + + assert_noop!( + PalletParameters::set_parameter( + Origin::root(), + Pallet2(pallet2::Parameters::Key3(pallet2::Key3, Some(432))), + ), + DispatchError::BadOrigin + ); + }); +} + +#[test] +fn get_through_external_pallet_works() { + new_test_ext().execute_with(|| { + assert_eq!(::MagicNumber::get(), 0); + + assert_ok!(PalletParameters::set_parameter( + Origin::root(), + Pallet1(pallet1::Parameters::Key1(pallet1::Key1, Some(123))), + )); + + assert_eq!(::MagicNumber::get(), 123); + }); +} + +#[test] +fn test_define_parameters_key_convert() { + let key1 = pallet1::Key1; + let parameter_key: pallet1::ParametersKey = key1.clone().into(); + let key1_2: pallet1::Key1 = parameter_key.clone().try_into().unwrap(); + + assert_eq!(key1, key1_2); + assert_eq!(parameter_key, pallet1::ParametersKey::Key1(key1)); + + let key2 = pallet1::Key2; + let parameter_key: pallet1::ParametersKey = key2.clone().into(); + let key2_2: pallet1::Key2 = parameter_key.clone().try_into().unwrap(); + + assert_eq!(key2, key2_2); + assert_eq!(parameter_key, pallet1::ParametersKey::Key2(key2)); +} + +#[test] +fn test_define_parameters_value_convert() { + let value1 = pallet1::Key1Value(1); + let parameter_value: pallet1::ParametersValue = value1.clone().into(); + let value1_2: pallet1::Key1Value = parameter_value.clone().try_into().unwrap(); + + assert_eq!(value1, value1_2); + assert_eq!(parameter_value, pallet1::ParametersValue::Key1(1)); + + let value2 = pallet1::Key2Value(2); + let parameter_value: pallet1::ParametersValue = value2.clone().into(); + let value2_2: pallet1::Key2Value = parameter_value.clone().try_into().unwrap(); + + assert_eq!(value2, value2_2); + assert_eq!(parameter_value, pallet1::ParametersValue::Key2(2)); +} + +#[test] +fn test_define_parameters_aggregrated_key_value() { + let kv1 = pallet1::Parameters::Key1(pallet1::Key1, None); + let (key1, value1) = kv1.clone().into_parts(); + + assert_eq!(key1, pallet1::ParametersKey::Key1(pallet1::Key1)); + assert_eq!(value1, None); + + let kv2 = pallet1::Parameters::Key2(pallet1::Key2, Some(2)); + let (key2, value2) = kv2.clone().into_parts(); + + assert_eq!(key2, pallet1::ParametersKey::Key2(pallet1::Key2)); + assert_eq!(value2, Some(pallet1::ParametersValue::Key2(2))); +} + +#[test] +fn test_define_aggregrated_parameters_key_convert() { + use codec::Encode; + + let key1 = pallet1::Key1; + let parameter_key: pallet1::ParametersKey = key1.clone().into(); + let runtime_key: RuntimeParametersKey = parameter_key.clone().into(); + + assert_eq!(runtime_key, RuntimeParametersKey::Pallet1(pallet1::ParametersKey::Key1(key1))); + assert_eq!(runtime_key.encode(), vec![3, 0]); + + let key2 = pallet2::Key2; + let parameter_key: pallet2::ParametersKey = key2.clone().into(); + let runtime_key: RuntimeParametersKey = parameter_key.clone().into(); + + assert_eq!(runtime_key, RuntimeParametersKey::Pallet2(pallet2::ParametersKey::Key2(key2))); + assert_eq!(runtime_key.encode(), vec![1, 1]); +} + +#[test] +fn test_define_aggregrated_parameters_aggregrated_key_value() { + let kv1 = RuntimeParameters::Pallet1(pallet1::Parameters::Key1(pallet1::Key1, None)); + let (key1, value1) = kv1.clone().into_parts(); + + assert_eq!(key1, RuntimeParametersKey::Pallet1(pallet1::ParametersKey::Key1(pallet1::Key1))); + assert_eq!(value1, None); + + let kv2 = RuntimeParameters::Pallet2(pallet2::Parameters::Key2(pallet2::Key2, Some(2))); + let (key2, value2) = kv2.clone().into_parts(); + + assert_eq!(key2, RuntimeParametersKey::Pallet2(pallet2::ParametersKey::Key2(pallet2::Key2))); + assert_eq!(value2, Some(RuntimeParametersValue::Pallet2(pallet2::ParametersValue::Key2(2)))); +} + +#[test] +fn codec_index_works() { + let enc = RuntimeParametersKey::Pallet1(pallet1::ParametersKey::Key1(pallet1::Key1)).encode(); + assert_eq!(enc, vec![3, 0]); + let enc = RuntimeParametersKey::Pallet1(pallet1::ParametersKey::Key2(pallet1::Key2)).encode(); + assert_eq!(enc, vec![3, 1]); + let enc = RuntimeParametersKey::Pallet1(pallet1::ParametersKey::Key3(pallet1::Key3)).encode(); + assert_eq!(enc, vec![3, 2]); + + let enc = RuntimeParametersKey::Pallet2(pallet2::ParametersKey::Key1(pallet2::Key1)).encode(); + assert_eq!(enc, vec![1, 2]); + let enc = RuntimeParametersKey::Pallet2(pallet2::ParametersKey::Key2(pallet2::Key2)).encode(); + assert_eq!(enc, vec![1, 1]); + let enc = RuntimeParametersKey::Pallet2(pallet2::ParametersKey::Key3(pallet2::Key3)).encode(); + assert_eq!(enc, vec![1, 0]); +} diff --git a/substrate/frame/parameters/src/weights.rs b/substrate/frame/parameters/src/weights.rs new file mode 100644 index 0000000000000000000000000000000000000000..6510db9ebce5bcabe89fe750d4cd9bcaeb5e3dc7 --- /dev/null +++ b/substrate/frame/parameters/src/weights.rs @@ -0,0 +1,86 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Autogenerated weights for `pallet_parameters` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-04-09, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `runner-anb7yjbi-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: `1024` + +// Executed Command: +// ./target/production/substrate-node +// benchmark +// pallet +// --chain=dev +// --steps=50 +// --repeat=20 +// --pallet=pallet_parameters +// --no-storage-info +// --no-median-slopes +// --no-min-squares +// --extrinsic=* +// --wasm-execution=compiled +// --heap-pages=4096 +// --output=./substrate/frame/parameters/src/weights.rs +// --header=./substrate/HEADER-APACHE2 +// --template=./substrate/.maintain/frame-weight-template.hbs + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] +#![allow(missing_docs)] + +use frame_support::{traits::Get, weights::{Weight, constants::RocksDbWeight}}; +use core::marker::PhantomData; + +/// Weight functions needed for `pallet_parameters`. +pub trait WeightInfo { + fn set_parameter() -> Weight; +} + +/// Weights for `pallet_parameters` using the Substrate node and recommended hardware. +pub struct SubstrateWeight(PhantomData); +impl WeightInfo for SubstrateWeight { + /// Storage: `Parameters::Parameters` (r:1 w:1) + /// Proof: `Parameters::Parameters` (`max_values`: None, `max_size`: Some(36), added: 2511, mode: `MaxEncodedLen`) + fn set_parameter() -> Weight { + // Proof Size summary in bytes: + // Measured: `3` + // Estimated: `3501` + // Minimum execution time: 8_360_000 picoseconds. + Weight::from_parts(8_568_000, 3501) + .saturating_add(T::DbWeight::get().reads(1_u64)) + .saturating_add(T::DbWeight::get().writes(1_u64)) + } +} + +// For backwards compatibility and tests. +impl WeightInfo for () { + /// Storage: `Parameters::Parameters` (r:1 w:1) + /// Proof: `Parameters::Parameters` (`max_values`: None, `max_size`: Some(36), added: 2511, mode: `MaxEncodedLen`) + fn set_parameter() -> Weight { + // Proof Size summary in bytes: + // Measured: `3` + // Estimated: `3501` + // Minimum execution time: 8_360_000 picoseconds. + Weight::from_parts(8_568_000, 3501) + .saturating_add(RocksDbWeight::get().reads(1_u64)) + .saturating_add(RocksDbWeight::get().writes(1_u64)) + } +} diff --git a/substrate/frame/preimage/Cargo.toml b/substrate/frame/preimage/Cargo.toml index 5951663d291423bc5b41213531578d816bc0de4e..d67fc7bead04c4dc01aca6494d823c786d69715c 100644 --- a/substrate/frame/preimage/Cargo.toml +++ b/substrate/frame/preimage/Cargo.toml @@ -13,7 +13,7 @@ workspace = true [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } frame-benchmarking = { path = "../benchmarking", default-features = false, optional = true } frame-support = { path = "../support", default-features = false } frame-system = { path = "../system", default-features = false } @@ -21,7 +21,7 @@ sp-core = { path = "../../primitives/core", default-features = false, optional = sp-io = { path = "../../primitives/io", default-features = false } sp-runtime = { path = "../../primitives/runtime", default-features = false } sp-std = { path = "../../primitives/std", default-features = false } -log = { version = "0.4.17", default-features = false } +log = { workspace = true } [dev-dependencies] pallet-balances = { path = "../balances" } diff --git a/substrate/frame/preimage/src/lib.rs b/substrate/frame/preimage/src/lib.rs index e344bdfe2d8feff5a25ed686d7301f462fa41189..4e474685166631ba41eed644d3754a332a290663 100644 --- a/substrate/frame/preimage/src/lib.rs +++ b/substrate/frame/preimage/src/lib.rs @@ -102,7 +102,7 @@ pub const MAX_HASH_UPGRADE_BULK_COUNT: u32 = 1024; pub mod pallet { use super::*; - /// The current storage version. + /// The in-code storage version. const STORAGE_VERSION: StorageVersion = StorageVersion::new(1); #[pallet::config] diff --git a/substrate/frame/preimage/src/mock.rs b/substrate/frame/preimage/src/mock.rs index 60ffecbb448059a375b0778dbfd3d38a3f88c846..903c34596aebacfd7116f1b172d54f9ed26f6426 100644 --- a/substrate/frame/preimage/src/mock.rs +++ b/substrate/frame/preimage/src/mock.rs @@ -22,13 +22,12 @@ use super::*; use crate as pallet_preimage; use frame_support::{ derive_impl, ord_parameter_types, parameter_types, - traits::{fungible::HoldConsideration, ConstU32, ConstU64, Everything}, - weights::constants::RocksDbWeight, + traits::{fungible::HoldConsideration, ConstU32, ConstU64}, }; use frame_system::EnsureSignedBy; use sp_core::H256; use sp_runtime::{ - traits::{BlakeTwo256, Convert, IdentityLookup}, + traits::{BlakeTwo256, Convert}, BuildStorage, }; @@ -43,31 +42,10 @@ frame_support::construct_runtime!( } ); -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { - type BaseCallFilter = Everything; - type BlockWeights = (); - type BlockLength = (); - type DbWeight = RocksDbWeight; - type RuntimeOrigin = RuntimeOrigin; - type RuntimeCall = RuntimeCall; - type Nonce = u64; - type Hash = H256; - type Hashing = BlakeTwo256; - type AccountId = u64; - type Lookup = IdentityLookup; type Block = Block; - type RuntimeEvent = RuntimeEvent; - type BlockHashCount = ConstU64<250>; - type Version = (); - type PalletInfo = PalletInfo; type AccountData = pallet_balances::AccountData; - type OnNewAccount = (); - type OnKilledAccount = (); - type SystemWeightInfo = (); - type SS58Prefix = (); - type OnSetCode = (); - type MaxConsumers = ConstU32<16>; } impl pallet_balances::Config for Test { diff --git a/substrate/frame/preimage/src/weights.rs b/substrate/frame/preimage/src/weights.rs index c11ab74c1e551a0fcdd6e239a657ab5df0809aad..4e389e3a7340720420fb3d956c40fdc994f45c9c 100644 --- a/substrate/frame/preimage/src/weights.rs +++ b/substrate/frame/preimage/src/weights.rs @@ -17,26 +17,28 @@ //! Autogenerated weights for `pallet_preimage` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-09-06, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-04-09, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-mia4uyug-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! HOSTNAME: `runner-anb7yjbi-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: `1024` // Executed Command: -// target/production/substrate-node +// ./target/production/substrate-node // benchmark // pallet +// --chain=dev // --steps=50 // --repeat=20 +// --pallet=pallet_preimage +// --no-storage-info +// --no-median-slopes +// --no-min-squares // --extrinsic=* // --wasm-execution=compiled // --heap-pages=4096 -// --json-file=/builds/parity/mirrors/polkadot-sdk/.git/.artifacts/bench.json -// --pallet=pallet_preimage -// --chain=dev -// --header=./substrate/HEADER-APACHE2 // --output=./substrate/frame/preimage/src/weights.rs +// --header=./substrate/HEADER-APACHE2 // --template=./substrate/.maintain/frame-weight-template.hbs #![cfg_attr(rustfmt, rustfmt_skip)] @@ -70,200 +72,209 @@ impl WeightInfo for SubstrateWeight { /// Storage: `Preimage::StatusFor` (r:1 w:0) /// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) /// Storage: `Preimage::RequestStatusFor` (r:1 w:1) - /// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(75), added: 2550, mode: `MaxEncodedLen`) + /// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) + /// Storage: `Parameters::Parameters` (r:2 w:0) + /// Proof: `Parameters::Parameters` (`max_values`: None, `max_size`: Some(36), added: 2511, mode: `MaxEncodedLen`) + /// Storage: `Balances::Holds` (r:1 w:1) + /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(193), added: 2668, mode: `MaxEncodedLen`) /// Storage: `Preimage::PreimageFor` (r:0 w:1) /// Proof: `Preimage::PreimageFor` (`max_values`: None, `max_size`: Some(4194344), added: 4196819, mode: `MaxEncodedLen`) /// The range of component `s` is `[0, 4194304]`. fn note_preimage(s: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `42` - // Estimated: `3556` - // Minimum execution time: 15_936_000 picoseconds. - Weight::from_parts(16_271_000, 3556) + // Measured: `112` + // Estimated: `6012` + // Minimum execution time: 52_531_000 picoseconds. + Weight::from_parts(53_245_000, 6012) // Standard Error: 1 - .saturating_add(Weight::from_parts(1_916, 0).saturating_mul(s.into())) - .saturating_add(T::DbWeight::get().reads(2_u64)) - .saturating_add(T::DbWeight::get().writes(2_u64)) + .saturating_add(Weight::from_parts(1_744, 0).saturating_mul(s.into())) + .saturating_add(T::DbWeight::get().reads(5_u64)) + .saturating_add(T::DbWeight::get().writes(3_u64)) } /// Storage: `Preimage::StatusFor` (r:1 w:0) /// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) /// Storage: `Preimage::RequestStatusFor` (r:1 w:1) - /// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(75), added: 2550, mode: `MaxEncodedLen`) + /// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) /// Storage: `Preimage::PreimageFor` (r:0 w:1) /// Proof: `Preimage::PreimageFor` (`max_values`: None, `max_size`: Some(4194344), added: 4196819, mode: `MaxEncodedLen`) /// The range of component `s` is `[0, 4194304]`. fn note_requested_preimage(s: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `106` + // Measured: `173` // Estimated: `3556` - // Minimum execution time: 16_468_000 picoseconds. - Weight::from_parts(17_031_000, 3556) + // Minimum execution time: 15_601_000 picoseconds. + Weight::from_parts(15_871_000, 3556) // Standard Error: 2 - .saturating_add(Weight::from_parts(1_948, 0).saturating_mul(s.into())) + .saturating_add(Weight::from_parts(1_836, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } /// Storage: `Preimage::StatusFor` (r:1 w:0) /// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) /// Storage: `Preimage::RequestStatusFor` (r:1 w:1) - /// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(75), added: 2550, mode: `MaxEncodedLen`) + /// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) /// Storage: `Preimage::PreimageFor` (r:0 w:1) /// Proof: `Preimage::PreimageFor` (`max_values`: None, `max_size`: Some(4194344), added: 4196819, mode: `MaxEncodedLen`) /// The range of component `s` is `[0, 4194304]`. fn note_no_deposit_preimage(s: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `106` + // Measured: `173` // Estimated: `3556` - // Minimum execution time: 16_342_000 picoseconds. - Weight::from_parts(16_535_000, 3556) - // Standard Error: 1 - .saturating_add(Weight::from_parts(1_906, 0).saturating_mul(s.into())) + // Minimum execution time: 15_614_000 picoseconds. + Weight::from_parts(15_934_000, 3556) + // Standard Error: 2 + .saturating_add(Weight::from_parts(1_832, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } /// Storage: `Preimage::StatusFor` (r:1 w:0) /// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) /// Storage: `Preimage::RequestStatusFor` (r:1 w:1) - /// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(75), added: 2550, mode: `MaxEncodedLen`) + /// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) + /// Storage: `Balances::Holds` (r:1 w:1) + /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(193), added: 2668, mode: `MaxEncodedLen`) /// Storage: `Preimage::PreimageFor` (r:0 w:1) /// Proof: `Preimage::PreimageFor` (`max_values`: None, `max_size`: Some(4194344), added: 4196819, mode: `MaxEncodedLen`) fn unnote_preimage() -> Weight { // Proof Size summary in bytes: - // Measured: `172` - // Estimated: `3556` - // Minimum execution time: 31_047_000 picoseconds. - Weight::from_parts(34_099_000, 3556) - .saturating_add(T::DbWeight::get().reads(2_u64)) - .saturating_add(T::DbWeight::get().writes(2_u64)) + // Measured: `311` + // Estimated: `3658` + // Minimum execution time: 53_001_000 picoseconds. + Weight::from_parts(55_866_000, 3658) + .saturating_add(T::DbWeight::get().reads(3_u64)) + .saturating_add(T::DbWeight::get().writes(3_u64)) } /// Storage: `Preimage::StatusFor` (r:1 w:0) /// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) /// Storage: `Preimage::RequestStatusFor` (r:1 w:1) - /// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(75), added: 2550, mode: `MaxEncodedLen`) + /// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) /// Storage: `Preimage::PreimageFor` (r:0 w:1) /// Proof: `Preimage::PreimageFor` (`max_values`: None, `max_size`: Some(4194344), added: 4196819, mode: `MaxEncodedLen`) fn unnote_no_deposit_preimage() -> Weight { // Proof Size summary in bytes: - // Measured: `144` + // Measured: `211` // Estimated: `3556` - // Minimum execution time: 32_559_000 picoseconds. - Weight::from_parts(36_677_000, 3556) + // Minimum execution time: 26_901_000 picoseconds. + Weight::from_parts(28_079_000, 3556) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } /// Storage: `Preimage::StatusFor` (r:1 w:0) /// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) /// Storage: `Preimage::RequestStatusFor` (r:1 w:1) - /// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(75), added: 2550, mode: `MaxEncodedLen`) + /// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) fn request_preimage() -> Weight { // Proof Size summary in bytes: - // Measured: `172` + // Measured: `255` // Estimated: `3556` - // Minimum execution time: 27_887_000 picoseconds. - Weight::from_parts(30_303_000, 3556) + // Minimum execution time: 21_716_000 picoseconds. + Weight::from_parts(25_318_000, 3556) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } /// Storage: `Preimage::StatusFor` (r:1 w:0) /// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) /// Storage: `Preimage::RequestStatusFor` (r:1 w:1) - /// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(75), added: 2550, mode: `MaxEncodedLen`) + /// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) fn request_no_deposit_preimage() -> Weight { // Proof Size summary in bytes: - // Measured: `144` + // Measured: `211` // Estimated: `3556` - // Minimum execution time: 17_256_000 picoseconds. - Weight::from_parts(19_481_000, 3556) + // Minimum execution time: 13_890_000 picoseconds. + Weight::from_parts(14_744_000, 3556) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } /// Storage: `Preimage::StatusFor` (r:1 w:0) /// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) /// Storage: `Preimage::RequestStatusFor` (r:1 w:1) - /// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(75), added: 2550, mode: `MaxEncodedLen`) + /// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) fn request_unnoted_preimage() -> Weight { // Proof Size summary in bytes: - // Measured: `42` + // Measured: `109` // Estimated: `3556` - // Minimum execution time: 22_344_000 picoseconds. - Weight::from_parts(23_868_000, 3556) + // Minimum execution time: 14_192_000 picoseconds. + Weight::from_parts(15_113_000, 3556) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } /// Storage: `Preimage::StatusFor` (r:1 w:0) /// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) /// Storage: `Preimage::RequestStatusFor` (r:1 w:1) - /// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(75), added: 2550, mode: `MaxEncodedLen`) + /// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) fn request_requested_preimage() -> Weight { // Proof Size summary in bytes: - // Measured: `106` + // Measured: `173` // Estimated: `3556` - // Minimum execution time: 10_542_000 picoseconds. - Weight::from_parts(11_571_000, 3556) + // Minimum execution time: 9_909_000 picoseconds. + Weight::from_parts(10_134_000, 3556) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } /// Storage: `Preimage::StatusFor` (r:1 w:0) /// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) /// Storage: `Preimage::RequestStatusFor` (r:1 w:1) - /// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(75), added: 2550, mode: `MaxEncodedLen`) + /// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) /// Storage: `Preimage::PreimageFor` (r:0 w:1) /// Proof: `Preimage::PreimageFor` (`max_values`: None, `max_size`: Some(4194344), added: 4196819, mode: `MaxEncodedLen`) fn unrequest_preimage() -> Weight { // Proof Size summary in bytes: - // Measured: `144` + // Measured: `211` // Estimated: `3556` - // Minimum execution time: 29_054_000 picoseconds. - Weight::from_parts(32_996_000, 3556) + // Minimum execution time: 21_725_000 picoseconds. + Weight::from_parts(24_058_000, 3556) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } /// Storage: `Preimage::StatusFor` (r:1 w:0) /// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) /// Storage: `Preimage::RequestStatusFor` (r:1 w:1) - /// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(75), added: 2550, mode: `MaxEncodedLen`) + /// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) fn unrequest_unnoted_preimage() -> Weight { // Proof Size summary in bytes: - // Measured: `106` + // Measured: `173` // Estimated: `3556` - // Minimum execution time: 10_775_000 picoseconds. - Weight::from_parts(11_937_000, 3556) + // Minimum execution time: 9_854_000 picoseconds. + Weight::from_parts(10_175_000, 3556) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } /// Storage: `Preimage::StatusFor` (r:1 w:0) /// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) /// Storage: `Preimage::RequestStatusFor` (r:1 w:1) - /// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(75), added: 2550, mode: `MaxEncodedLen`) + /// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) fn unrequest_multi_referenced_preimage() -> Weight { // Proof Size summary in bytes: - // Measured: `106` + // Measured: `173` // Estimated: `3556` - // Minimum execution time: 10_696_000 picoseconds. - Weight::from_parts(11_717_000, 3556) + // Minimum execution time: 10_143_000 picoseconds. + Weight::from_parts(10_539_000, 3556) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: `Preimage::StatusFor` (r:1024 w:1024) + /// Storage: `Preimage::StatusFor` (r:1023 w:1023) /// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) + /// Storage: `System::Account` (r:1023 w:1023) /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - /// Storage: `Preimage::RequestStatusFor` (r:0 w:1024) - /// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(75), added: 2550, mode: `MaxEncodedLen`) - /// The range of component `n` is `[0, 1024]`. + /// Storage: `Parameters::Parameters` (r:2 w:0) + /// Proof: `Parameters::Parameters` (`max_values`: None, `max_size`: Some(36), added: 2511, mode: `MaxEncodedLen`) + /// Storage: `Balances::Holds` (r:1023 w:1023) + /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(193), added: 2668, mode: `MaxEncodedLen`) + /// Storage: `Preimage::RequestStatusFor` (r:0 w:1023) + /// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) + /// The range of component `n` is `[1, 1024]`. fn ensure_updated(n: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `193 + n * (91 ±0)` - // Estimated: `3593 + n * (2566 ±0)` - // Minimum execution time: 2_452_000 picoseconds. - Weight::from_parts(2_641_000, 3593) - // Standard Error: 19_797 - .saturating_add(Weight::from_parts(15_620_946, 0).saturating_mul(n.into())) - .saturating_add(T::DbWeight::get().reads(1_u64)) - .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(n.into()))) - .saturating_add(T::DbWeight::get().writes(1_u64)) - .saturating_add(T::DbWeight::get().writes((2_u64).saturating_mul(n.into()))) - .saturating_add(Weight::from_parts(0, 2566).saturating_mul(n.into())) + // Measured: `0 + n * (227 ±0)` + // Estimated: `6012 + n * (2668 ±0)` + // Minimum execution time: 59_384_000 picoseconds. + Weight::from_parts(60_000_000, 6012) + // Standard Error: 39_890 + .saturating_add(Weight::from_parts(56_317_686, 0).saturating_mul(n.into())) + .saturating_add(T::DbWeight::get().reads(2_u64)) + .saturating_add(T::DbWeight::get().reads((3_u64).saturating_mul(n.into()))) + .saturating_add(T::DbWeight::get().writes((4_u64).saturating_mul(n.into()))) + .saturating_add(Weight::from_parts(0, 2668).saturating_mul(n.into())) } } @@ -272,199 +283,208 @@ impl WeightInfo for () { /// Storage: `Preimage::StatusFor` (r:1 w:0) /// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) /// Storage: `Preimage::RequestStatusFor` (r:1 w:1) - /// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(75), added: 2550, mode: `MaxEncodedLen`) + /// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) + /// Storage: `Parameters::Parameters` (r:2 w:0) + /// Proof: `Parameters::Parameters` (`max_values`: None, `max_size`: Some(36), added: 2511, mode: `MaxEncodedLen`) + /// Storage: `Balances::Holds` (r:1 w:1) + /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(193), added: 2668, mode: `MaxEncodedLen`) /// Storage: `Preimage::PreimageFor` (r:0 w:1) /// Proof: `Preimage::PreimageFor` (`max_values`: None, `max_size`: Some(4194344), added: 4196819, mode: `MaxEncodedLen`) /// The range of component `s` is `[0, 4194304]`. fn note_preimage(s: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `42` - // Estimated: `3556` - // Minimum execution time: 15_936_000 picoseconds. - Weight::from_parts(16_271_000, 3556) + // Measured: `112` + // Estimated: `6012` + // Minimum execution time: 52_531_000 picoseconds. + Weight::from_parts(53_245_000, 6012) // Standard Error: 1 - .saturating_add(Weight::from_parts(1_916, 0).saturating_mul(s.into())) - .saturating_add(RocksDbWeight::get().reads(2_u64)) - .saturating_add(RocksDbWeight::get().writes(2_u64)) + .saturating_add(Weight::from_parts(1_744, 0).saturating_mul(s.into())) + .saturating_add(RocksDbWeight::get().reads(5_u64)) + .saturating_add(RocksDbWeight::get().writes(3_u64)) } /// Storage: `Preimage::StatusFor` (r:1 w:0) /// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) /// Storage: `Preimage::RequestStatusFor` (r:1 w:1) - /// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(75), added: 2550, mode: `MaxEncodedLen`) + /// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) /// Storage: `Preimage::PreimageFor` (r:0 w:1) /// Proof: `Preimage::PreimageFor` (`max_values`: None, `max_size`: Some(4194344), added: 4196819, mode: `MaxEncodedLen`) /// The range of component `s` is `[0, 4194304]`. fn note_requested_preimage(s: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `106` + // Measured: `173` // Estimated: `3556` - // Minimum execution time: 16_468_000 picoseconds. - Weight::from_parts(17_031_000, 3556) + // Minimum execution time: 15_601_000 picoseconds. + Weight::from_parts(15_871_000, 3556) // Standard Error: 2 - .saturating_add(Weight::from_parts(1_948, 0).saturating_mul(s.into())) + .saturating_add(Weight::from_parts(1_836, 0).saturating_mul(s.into())) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } /// Storage: `Preimage::StatusFor` (r:1 w:0) /// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) /// Storage: `Preimage::RequestStatusFor` (r:1 w:1) - /// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(75), added: 2550, mode: `MaxEncodedLen`) + /// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) /// Storage: `Preimage::PreimageFor` (r:0 w:1) /// Proof: `Preimage::PreimageFor` (`max_values`: None, `max_size`: Some(4194344), added: 4196819, mode: `MaxEncodedLen`) /// The range of component `s` is `[0, 4194304]`. fn note_no_deposit_preimage(s: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `106` + // Measured: `173` // Estimated: `3556` - // Minimum execution time: 16_342_000 picoseconds. - Weight::from_parts(16_535_000, 3556) - // Standard Error: 1 - .saturating_add(Weight::from_parts(1_906, 0).saturating_mul(s.into())) + // Minimum execution time: 15_614_000 picoseconds. + Weight::from_parts(15_934_000, 3556) + // Standard Error: 2 + .saturating_add(Weight::from_parts(1_832, 0).saturating_mul(s.into())) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } /// Storage: `Preimage::StatusFor` (r:1 w:0) /// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) /// Storage: `Preimage::RequestStatusFor` (r:1 w:1) - /// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(75), added: 2550, mode: `MaxEncodedLen`) + /// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) + /// Storage: `Balances::Holds` (r:1 w:1) + /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(193), added: 2668, mode: `MaxEncodedLen`) /// Storage: `Preimage::PreimageFor` (r:0 w:1) /// Proof: `Preimage::PreimageFor` (`max_values`: None, `max_size`: Some(4194344), added: 4196819, mode: `MaxEncodedLen`) fn unnote_preimage() -> Weight { // Proof Size summary in bytes: - // Measured: `172` - // Estimated: `3556` - // Minimum execution time: 31_047_000 picoseconds. - Weight::from_parts(34_099_000, 3556) - .saturating_add(RocksDbWeight::get().reads(2_u64)) - .saturating_add(RocksDbWeight::get().writes(2_u64)) + // Measured: `311` + // Estimated: `3658` + // Minimum execution time: 53_001_000 picoseconds. + Weight::from_parts(55_866_000, 3658) + .saturating_add(RocksDbWeight::get().reads(3_u64)) + .saturating_add(RocksDbWeight::get().writes(3_u64)) } /// Storage: `Preimage::StatusFor` (r:1 w:0) /// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) /// Storage: `Preimage::RequestStatusFor` (r:1 w:1) - /// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(75), added: 2550, mode: `MaxEncodedLen`) + /// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) /// Storage: `Preimage::PreimageFor` (r:0 w:1) /// Proof: `Preimage::PreimageFor` (`max_values`: None, `max_size`: Some(4194344), added: 4196819, mode: `MaxEncodedLen`) fn unnote_no_deposit_preimage() -> Weight { // Proof Size summary in bytes: - // Measured: `144` + // Measured: `211` // Estimated: `3556` - // Minimum execution time: 32_559_000 picoseconds. - Weight::from_parts(36_677_000, 3556) + // Minimum execution time: 26_901_000 picoseconds. + Weight::from_parts(28_079_000, 3556) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } /// Storage: `Preimage::StatusFor` (r:1 w:0) /// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) /// Storage: `Preimage::RequestStatusFor` (r:1 w:1) - /// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(75), added: 2550, mode: `MaxEncodedLen`) + /// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) fn request_preimage() -> Weight { // Proof Size summary in bytes: - // Measured: `172` + // Measured: `255` // Estimated: `3556` - // Minimum execution time: 27_887_000 picoseconds. - Weight::from_parts(30_303_000, 3556) + // Minimum execution time: 21_716_000 picoseconds. + Weight::from_parts(25_318_000, 3556) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } /// Storage: `Preimage::StatusFor` (r:1 w:0) /// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) /// Storage: `Preimage::RequestStatusFor` (r:1 w:1) - /// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(75), added: 2550, mode: `MaxEncodedLen`) + /// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) fn request_no_deposit_preimage() -> Weight { // Proof Size summary in bytes: - // Measured: `144` + // Measured: `211` // Estimated: `3556` - // Minimum execution time: 17_256_000 picoseconds. - Weight::from_parts(19_481_000, 3556) + // Minimum execution time: 13_890_000 picoseconds. + Weight::from_parts(14_744_000, 3556) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } /// Storage: `Preimage::StatusFor` (r:1 w:0) /// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) /// Storage: `Preimage::RequestStatusFor` (r:1 w:1) - /// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(75), added: 2550, mode: `MaxEncodedLen`) + /// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) fn request_unnoted_preimage() -> Weight { // Proof Size summary in bytes: - // Measured: `42` + // Measured: `109` // Estimated: `3556` - // Minimum execution time: 22_344_000 picoseconds. - Weight::from_parts(23_868_000, 3556) + // Minimum execution time: 14_192_000 picoseconds. + Weight::from_parts(15_113_000, 3556) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } /// Storage: `Preimage::StatusFor` (r:1 w:0) /// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) /// Storage: `Preimage::RequestStatusFor` (r:1 w:1) - /// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(75), added: 2550, mode: `MaxEncodedLen`) + /// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) fn request_requested_preimage() -> Weight { // Proof Size summary in bytes: - // Measured: `106` + // Measured: `173` // Estimated: `3556` - // Minimum execution time: 10_542_000 picoseconds. - Weight::from_parts(11_571_000, 3556) + // Minimum execution time: 9_909_000 picoseconds. + Weight::from_parts(10_134_000, 3556) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } /// Storage: `Preimage::StatusFor` (r:1 w:0) /// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) /// Storage: `Preimage::RequestStatusFor` (r:1 w:1) - /// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(75), added: 2550, mode: `MaxEncodedLen`) + /// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) /// Storage: `Preimage::PreimageFor` (r:0 w:1) /// Proof: `Preimage::PreimageFor` (`max_values`: None, `max_size`: Some(4194344), added: 4196819, mode: `MaxEncodedLen`) fn unrequest_preimage() -> Weight { // Proof Size summary in bytes: - // Measured: `144` + // Measured: `211` // Estimated: `3556` - // Minimum execution time: 29_054_000 picoseconds. - Weight::from_parts(32_996_000, 3556) + // Minimum execution time: 21_725_000 picoseconds. + Weight::from_parts(24_058_000, 3556) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } /// Storage: `Preimage::StatusFor` (r:1 w:0) /// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) /// Storage: `Preimage::RequestStatusFor` (r:1 w:1) - /// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(75), added: 2550, mode: `MaxEncodedLen`) + /// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) fn unrequest_unnoted_preimage() -> Weight { // Proof Size summary in bytes: - // Measured: `106` + // Measured: `173` // Estimated: `3556` - // Minimum execution time: 10_775_000 picoseconds. - Weight::from_parts(11_937_000, 3556) + // Minimum execution time: 9_854_000 picoseconds. + Weight::from_parts(10_175_000, 3556) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } /// Storage: `Preimage::StatusFor` (r:1 w:0) /// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) /// Storage: `Preimage::RequestStatusFor` (r:1 w:1) - /// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(75), added: 2550, mode: `MaxEncodedLen`) + /// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) fn unrequest_multi_referenced_preimage() -> Weight { // Proof Size summary in bytes: - // Measured: `106` + // Measured: `173` // Estimated: `3556` - // Minimum execution time: 10_696_000 picoseconds. - Weight::from_parts(11_717_000, 3556) + // Minimum execution time: 10_143_000 picoseconds. + Weight::from_parts(10_539_000, 3556) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: `Preimage::StatusFor` (r:1024 w:1024) + /// Storage: `Preimage::StatusFor` (r:1023 w:1023) /// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) + /// Storage: `System::Account` (r:1023 w:1023) /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - /// Storage: `Preimage::RequestStatusFor` (r:0 w:1024) - /// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(75), added: 2550, mode: `MaxEncodedLen`) - /// The range of component `n` is `[0, 1024]`. + /// Storage: `Parameters::Parameters` (r:2 w:0) + /// Proof: `Parameters::Parameters` (`max_values`: None, `max_size`: Some(36), added: 2511, mode: `MaxEncodedLen`) + /// Storage: `Balances::Holds` (r:1023 w:1023) + /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(193), added: 2668, mode: `MaxEncodedLen`) + /// Storage: `Preimage::RequestStatusFor` (r:0 w:1023) + /// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) + /// The range of component `n` is `[1, 1024]`. fn ensure_updated(n: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `193 + n * (91 ±0)` - // Estimated: `3593 + n * (2566 ±0)` - // Minimum execution time: 2_452_000 picoseconds. - Weight::from_parts(2_641_000, 3593) - // Standard Error: 19_797 - .saturating_add(Weight::from_parts(15_620_946, 0).saturating_mul(n.into())) - .saturating_add(RocksDbWeight::get().reads(1_u64)) - .saturating_add(RocksDbWeight::get().reads((1_u64).saturating_mul(n.into()))) - .saturating_add(RocksDbWeight::get().writes(1_u64)) - .saturating_add(RocksDbWeight::get().writes((2_u64).saturating_mul(n.into()))) - .saturating_add(Weight::from_parts(0, 2566).saturating_mul(n.into())) + // Measured: `0 + n * (227 ±0)` + // Estimated: `6012 + n * (2668 ±0)` + // Minimum execution time: 59_384_000 picoseconds. + Weight::from_parts(60_000_000, 6012) + // Standard Error: 39_890 + .saturating_add(Weight::from_parts(56_317_686, 0).saturating_mul(n.into())) + .saturating_add(RocksDbWeight::get().reads(2_u64)) + .saturating_add(RocksDbWeight::get().reads((3_u64).saturating_mul(n.into()))) + .saturating_add(RocksDbWeight::get().writes((4_u64).saturating_mul(n.into()))) + .saturating_add(Weight::from_parts(0, 2668).saturating_mul(n.into())) } } diff --git a/substrate/frame/proxy/Cargo.toml b/substrate/frame/proxy/Cargo.toml index 17930079afd226da977d4796f4bb29ef690f9d3b..0a3b39e471d429f6bc5cfdec203aa085d8f6144e 100644 --- a/substrate/frame/proxy/Cargo.toml +++ b/substrate/frame/proxy/Cargo.toml @@ -17,7 +17,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["max-encoded-len"] } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } frame-benchmarking = { path = "../benchmarking", default-features = false, optional = true } frame-support = { path = "../support", default-features = false } frame-system = { path = "../system", default-features = false } diff --git a/substrate/frame/proxy/src/lib.rs b/substrate/frame/proxy/src/lib.rs index 4d4da0433afa015a6c33e8ee68e1e1c90851ce97..2b3fac5f59e4b1fd48f92bffc314cdbad5ec9c22 100644 --- a/substrate/frame/proxy/src/lib.rs +++ b/substrate/frame/proxy/src/lib.rs @@ -119,7 +119,7 @@ pub mod pallet { /// The currency mechanism. type Currency: ReservableCurrency; - /// A kind of proxy; specified with the proxy and passed in to the `IsProxyable` fitler. + /// A kind of proxy; specified with the proxy and passed in to the `IsProxyable` filter. /// The instance filter determines whether a given call may be proxied under this type. /// /// IMPORTANT: `Default` must be provided and MUST BE the the *most permissive* value. diff --git a/substrate/frame/proxy/src/tests.rs b/substrate/frame/proxy/src/tests.rs index 67a662e01b2bf4345b8fff1501a63b0f7ed68e99..3ed61fbedaaa93ca3bbf9976a7303195537ae671 100644 --- a/substrate/frame/proxy/src/tests.rs +++ b/substrate/frame/proxy/src/tests.rs @@ -42,14 +42,14 @@ frame_support::construct_runtime!( } ); -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { type Block = Block; type BaseCallFilter = BaseFilter; type AccountData = pallet_balances::AccountData; } -#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig as pallet_balances::DefaultConfig)] +#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] impl pallet_balances::Config for Test { type ReserveIdentifier = [u8; 8]; type AccountStore = System; diff --git a/substrate/frame/proxy/src/weights.rs b/substrate/frame/proxy/src/weights.rs index f30fe73d27ae665fca89761585226d906fd5112c..3093298e3e54ee79120e1086bd7342f7fe56c799 100644 --- a/substrate/frame/proxy/src/weights.rs +++ b/substrate/frame/proxy/src/weights.rs @@ -15,16 +15,16 @@ // See the License for the specific language governing permissions and // limitations under the License. -//! Autogenerated weights for pallet_proxy +//! Autogenerated weights for `pallet_proxy` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-06-16, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-04-09, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-e8ezs4ez-project-145-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("dev"), DB CACHE: 1024 +//! HOSTNAME: `runner-anb7yjbi-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: `1024` // Executed Command: -// ./target/production/substrate +// ./target/production/substrate-node // benchmark // pallet // --chain=dev @@ -35,12 +35,11 @@ // --no-median-slopes // --no-min-squares // --extrinsic=* -// --execution=wasm // --wasm-execution=compiled // --heap-pages=4096 -// --output=./frame/proxy/src/weights.rs -// --header=./HEADER-APACHE2 -// --template=./.maintain/frame-weight-template.hbs +// --output=./substrate/frame/proxy/src/weights.rs +// --header=./substrate/HEADER-APACHE2 +// --template=./substrate/.maintain/frame-weight-template.hbs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -50,7 +49,7 @@ use frame_support::{traits::Get, weights::{Weight, constants::RocksDbWeight}}; use core::marker::PhantomData; -/// Weight functions needed for pallet_proxy. +/// Weight functions needed for `pallet_proxy`. pub trait WeightInfo { fn proxy(p: u32, ) -> Weight; fn proxy_announced(a: u32, p: u32, ) -> Weight; @@ -64,336 +63,352 @@ pub trait WeightInfo { fn kill_pure(p: u32, ) -> Weight; } -/// Weights for pallet_proxy using the Substrate node and recommended hardware. +/// Weights for `pallet_proxy` using the Substrate node and recommended hardware. pub struct SubstrateWeight(PhantomData); impl WeightInfo for SubstrateWeight { - /// Storage: Proxy Proxies (r:1 w:0) - /// Proof: Proxy Proxies (max_values: None, max_size: Some(1241), added: 3716, mode: MaxEncodedLen) + /// Storage: `Proxy::Proxies` (r:1 w:0) + /// Proof: `Proxy::Proxies` (`max_values`: None, `max_size`: Some(1241), added: 3716, mode: `MaxEncodedLen`) + /// Storage: `SafeMode::EnteredUntil` (r:1 w:0) + /// Proof: `SafeMode::EnteredUntil` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `TxPause::PausedCalls` (r:1 w:0) + /// Proof: `TxPause::PausedCalls` (`max_values`: None, `max_size`: Some(532), added: 3007, mode: `MaxEncodedLen`) /// The range of component `p` is `[1, 31]`. fn proxy(p: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `161 + p * (37 ±0)` + // Measured: `306 + p * (37 ±0)` // Estimated: `4706` - // Minimum execution time: 15_182_000 picoseconds. - Weight::from_parts(15_919_146, 4706) - // Standard Error: 1_586 - .saturating_add(Weight::from_parts(31_768, 0).saturating_mul(p.into())) - .saturating_add(T::DbWeight::get().reads(1_u64)) + // Minimum execution time: 18_280_000 picoseconds. + Weight::from_parts(19_655_145, 4706) + // Standard Error: 2_345 + .saturating_add(Weight::from_parts(36_306, 0).saturating_mul(p.into())) + .saturating_add(T::DbWeight::get().reads(3_u64)) } - /// Storage: Proxy Proxies (r:1 w:0) - /// Proof: Proxy Proxies (max_values: None, max_size: Some(1241), added: 3716, mode: MaxEncodedLen) - /// Storage: Proxy Announcements (r:1 w:1) - /// Proof: Proxy Announcements (max_values: None, max_size: Some(2233), added: 4708, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: `Proxy::Proxies` (r:1 w:0) + /// Proof: `Proxy::Proxies` (`max_values`: None, `max_size`: Some(1241), added: 3716, mode: `MaxEncodedLen`) + /// Storage: `Proxy::Announcements` (r:1 w:1) + /// Proof: `Proxy::Announcements` (`max_values`: None, `max_size`: Some(2233), added: 4708, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `SafeMode::EnteredUntil` (r:1 w:0) + /// Proof: `SafeMode::EnteredUntil` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `TxPause::PausedCalls` (r:1 w:0) + /// Proof: `TxPause::PausedCalls` (`max_values`: None, `max_size`: Some(532), added: 3007, mode: `MaxEncodedLen`) /// The range of component `a` is `[0, 31]`. /// The range of component `p` is `[1, 31]`. fn proxy_announced(a: u32, p: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `488 + a * (68 ±0) + p * (37 ±0)` + // Measured: `633 + a * (68 ±0) + p * (37 ±0)` // Estimated: `5698` - // Minimum execution time: 40_256_000 picoseconds. - Weight::from_parts(40_373_648, 5698) - // Standard Error: 3_978 - .saturating_add(Weight::from_parts(166_936, 0).saturating_mul(a.into())) - // Standard Error: 4_110 - .saturating_add(Weight::from_parts(54_329, 0).saturating_mul(p.into())) - .saturating_add(T::DbWeight::get().reads(3_u64)) + // Minimum execution time: 41_789_000 picoseconds. + Weight::from_parts(41_812_078, 5698) + // Standard Error: 3_694 + .saturating_add(Weight::from_parts(163_029, 0).saturating_mul(a.into())) + // Standard Error: 3_817 + .saturating_add(Weight::from_parts(79_539, 0).saturating_mul(p.into())) + .saturating_add(T::DbWeight::get().reads(5_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } - /// Storage: Proxy Announcements (r:1 w:1) - /// Proof: Proxy Announcements (max_values: None, max_size: Some(2233), added: 4708, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: `Proxy::Announcements` (r:1 w:1) + /// Proof: `Proxy::Announcements` (`max_values`: None, `max_size`: Some(2233), added: 4708, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) /// The range of component `a` is `[0, 31]`. /// The range of component `p` is `[1, 31]`. fn remove_announcement(a: u32, p: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `403 + a * (68 ±0)` // Estimated: `5698` - // Minimum execution time: 25_040_000 picoseconds. - Weight::from_parts(25_112_188, 5698) - // Standard Error: 2_143 - .saturating_add(Weight::from_parts(189_027, 0).saturating_mul(a.into())) - // Standard Error: 2_214 - .saturating_add(Weight::from_parts(26_683, 0).saturating_mul(p.into())) + // Minimum execution time: 22_475_000 picoseconds. + Weight::from_parts(22_666_821, 5698) + // Standard Error: 1_797 + .saturating_add(Weight::from_parts(170_629, 0).saturating_mul(a.into())) + // Standard Error: 1_857 + .saturating_add(Weight::from_parts(18_799, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } - /// Storage: Proxy Announcements (r:1 w:1) - /// Proof: Proxy Announcements (max_values: None, max_size: Some(2233), added: 4708, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: `Proxy::Announcements` (r:1 w:1) + /// Proof: `Proxy::Announcements` (`max_values`: None, `max_size`: Some(2233), added: 4708, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) /// The range of component `a` is `[0, 31]`. /// The range of component `p` is `[1, 31]`. fn reject_announcement(a: u32, p: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `403 + a * (68 ±0)` // Estimated: `5698` - // Minimum execution time: 24_884_000 picoseconds. - Weight::from_parts(25_359_291, 5698) - // Standard Error: 2_019 - .saturating_add(Weight::from_parts(181_470, 0).saturating_mul(a.into())) - // Standard Error: 2_086 - .saturating_add(Weight::from_parts(17_725, 0).saturating_mul(p.into())) + // Minimum execution time: 22_326_000 picoseconds. + Weight::from_parts(22_654_227, 5698) + // Standard Error: 1_859 + .saturating_add(Weight::from_parts(168_822, 0).saturating_mul(a.into())) + // Standard Error: 1_921 + .saturating_add(Weight::from_parts(21_839, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } - /// Storage: Proxy Proxies (r:1 w:0) - /// Proof: Proxy Proxies (max_values: None, max_size: Some(1241), added: 3716, mode: MaxEncodedLen) - /// Storage: Proxy Announcements (r:1 w:1) - /// Proof: Proxy Announcements (max_values: None, max_size: Some(2233), added: 4708, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: `Proxy::Proxies` (r:1 w:0) + /// Proof: `Proxy::Proxies` (`max_values`: None, `max_size`: Some(1241), added: 3716, mode: `MaxEncodedLen`) + /// Storage: `Proxy::Announcements` (r:1 w:1) + /// Proof: `Proxy::Announcements` (`max_values`: None, `max_size`: Some(2233), added: 4708, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) /// The range of component `a` is `[0, 31]`. /// The range of component `p` is `[1, 31]`. fn announce(a: u32, p: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `420 + a * (68 ±0) + p * (37 ±0)` // Estimated: `5698` - // Minimum execution time: 35_039_000 picoseconds. - Weight::from_parts(36_727_868, 5698) - // Standard Error: 4_463 - .saturating_add(Weight::from_parts(167_060, 0).saturating_mul(a.into())) - // Standard Error: 4_611 - .saturating_add(Weight::from_parts(59_836, 0).saturating_mul(p.into())) + // Minimum execution time: 31_551_000 picoseconds. + Weight::from_parts(32_205_445, 5698) + // Standard Error: 4_089 + .saturating_add(Weight::from_parts(167_596, 0).saturating_mul(a.into())) + // Standard Error: 4_225 + .saturating_add(Weight::from_parts(67_833, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } - /// Storage: Proxy Proxies (r:1 w:1) - /// Proof: Proxy Proxies (max_values: None, max_size: Some(1241), added: 3716, mode: MaxEncodedLen) + /// Storage: `Proxy::Proxies` (r:1 w:1) + /// Proof: `Proxy::Proxies` (`max_values`: None, `max_size`: Some(1241), added: 3716, mode: `MaxEncodedLen`) /// The range of component `p` is `[1, 31]`. fn add_proxy(p: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `161 + p * (37 ±0)` // Estimated: `4706` - // Minimum execution time: 25_697_000 picoseconds. - Weight::from_parts(26_611_090, 4706) - // Standard Error: 2_306 - .saturating_add(Weight::from_parts(85_165, 0).saturating_mul(p.into())) + // Minimum execution time: 21_495_000 picoseconds. + Weight::from_parts(22_358_457, 4706) + // Standard Error: 1_606 + .saturating_add(Weight::from_parts(64_322, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: Proxy Proxies (r:1 w:1) - /// Proof: Proxy Proxies (max_values: None, max_size: Some(1241), added: 3716, mode: MaxEncodedLen) + /// Storage: `Proxy::Proxies` (r:1 w:1) + /// Proof: `Proxy::Proxies` (`max_values`: None, `max_size`: Some(1241), added: 3716, mode: `MaxEncodedLen`) /// The range of component `p` is `[1, 31]`. fn remove_proxy(p: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `161 + p * (37 ±0)` // Estimated: `4706` - // Minimum execution time: 25_638_000 picoseconds. - Weight::from_parts(26_904_510, 4706) - // Standard Error: 2_669 - .saturating_add(Weight::from_parts(61_668, 0).saturating_mul(p.into())) + // Minimum execution time: 21_495_000 picoseconds. + Weight::from_parts(22_579_308, 4706) + // Standard Error: 2_571 + .saturating_add(Weight::from_parts(62_404, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: Proxy Proxies (r:1 w:1) - /// Proof: Proxy Proxies (max_values: None, max_size: Some(1241), added: 3716, mode: MaxEncodedLen) + /// Storage: `Proxy::Proxies` (r:1 w:1) + /// Proof: `Proxy::Proxies` (`max_values`: None, `max_size`: Some(1241), added: 3716, mode: `MaxEncodedLen`) /// The range of component `p` is `[1, 31]`. fn remove_proxies(p: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `161 + p * (37 ±0)` // Estimated: `4706` - // Minimum execution time: 22_737_000 picoseconds. - Weight::from_parts(23_618_441, 4706) - // Standard Error: 1_729 - .saturating_add(Weight::from_parts(44_009, 0).saturating_mul(p.into())) + // Minimum execution time: 20_541_000 picoseconds. + Weight::from_parts(21_456_750, 4706) + // Standard Error: 1_697 + .saturating_add(Weight::from_parts(45_387, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: Proxy Proxies (r:1 w:1) - /// Proof: Proxy Proxies (max_values: None, max_size: Some(1241), added: 3716, mode: MaxEncodedLen) + /// Storage: `Proxy::Proxies` (r:1 w:1) + /// Proof: `Proxy::Proxies` (`max_values`: None, `max_size`: Some(1241), added: 3716, mode: `MaxEncodedLen`) /// The range of component `p` is `[1, 31]`. fn create_pure(p: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `173` // Estimated: `4706` - // Minimum execution time: 27_364_000 picoseconds. - Weight::from_parts(28_632_271, 4706) - // Standard Error: 1_613 - .saturating_add(Weight::from_parts(2_453, 0).saturating_mul(p.into())) + // Minimum execution time: 22_809_000 picoseconds. + Weight::from_parts(23_878_644, 4706) + // Standard Error: 1_600 + .saturating_add(Weight::from_parts(10_149, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: Proxy Proxies (r:1 w:1) - /// Proof: Proxy Proxies (max_values: None, max_size: Some(1241), added: 3716, mode: MaxEncodedLen) + /// Storage: `Proxy::Proxies` (r:1 w:1) + /// Proof: `Proxy::Proxies` (`max_values`: None, `max_size`: Some(1241), added: 3716, mode: `MaxEncodedLen`) /// The range of component `p` is `[0, 30]`. fn kill_pure(p: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `198 + p * (37 ±0)` // Estimated: `4706` - // Minimum execution time: 23_552_000 picoseconds. - Weight::from_parts(24_874_553, 4706) - // Standard Error: 1_919 - .saturating_add(Weight::from_parts(38_799, 0).saturating_mul(p.into())) + // Minimum execution time: 20_993_000 picoseconds. + Weight::from_parts(22_067_418, 4706) + // Standard Error: 1_673 + .saturating_add(Weight::from_parts(52_703, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } } -// For backwards compatibility and tests +// For backwards compatibility and tests. impl WeightInfo for () { - /// Storage: Proxy Proxies (r:1 w:0) - /// Proof: Proxy Proxies (max_values: None, max_size: Some(1241), added: 3716, mode: MaxEncodedLen) + /// Storage: `Proxy::Proxies` (r:1 w:0) + /// Proof: `Proxy::Proxies` (`max_values`: None, `max_size`: Some(1241), added: 3716, mode: `MaxEncodedLen`) + /// Storage: `SafeMode::EnteredUntil` (r:1 w:0) + /// Proof: `SafeMode::EnteredUntil` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `TxPause::PausedCalls` (r:1 w:0) + /// Proof: `TxPause::PausedCalls` (`max_values`: None, `max_size`: Some(532), added: 3007, mode: `MaxEncodedLen`) /// The range of component `p` is `[1, 31]`. fn proxy(p: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `161 + p * (37 ±0)` + // Measured: `306 + p * (37 ±0)` // Estimated: `4706` - // Minimum execution time: 15_182_000 picoseconds. - Weight::from_parts(15_919_146, 4706) - // Standard Error: 1_586 - .saturating_add(Weight::from_parts(31_768, 0).saturating_mul(p.into())) - .saturating_add(RocksDbWeight::get().reads(1_u64)) + // Minimum execution time: 18_280_000 picoseconds. + Weight::from_parts(19_655_145, 4706) + // Standard Error: 2_345 + .saturating_add(Weight::from_parts(36_306, 0).saturating_mul(p.into())) + .saturating_add(RocksDbWeight::get().reads(3_u64)) } - /// Storage: Proxy Proxies (r:1 w:0) - /// Proof: Proxy Proxies (max_values: None, max_size: Some(1241), added: 3716, mode: MaxEncodedLen) - /// Storage: Proxy Announcements (r:1 w:1) - /// Proof: Proxy Announcements (max_values: None, max_size: Some(2233), added: 4708, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: `Proxy::Proxies` (r:1 w:0) + /// Proof: `Proxy::Proxies` (`max_values`: None, `max_size`: Some(1241), added: 3716, mode: `MaxEncodedLen`) + /// Storage: `Proxy::Announcements` (r:1 w:1) + /// Proof: `Proxy::Announcements` (`max_values`: None, `max_size`: Some(2233), added: 4708, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `SafeMode::EnteredUntil` (r:1 w:0) + /// Proof: `SafeMode::EnteredUntil` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `TxPause::PausedCalls` (r:1 w:0) + /// Proof: `TxPause::PausedCalls` (`max_values`: None, `max_size`: Some(532), added: 3007, mode: `MaxEncodedLen`) /// The range of component `a` is `[0, 31]`. /// The range of component `p` is `[1, 31]`. fn proxy_announced(a: u32, p: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `488 + a * (68 ±0) + p * (37 ±0)` + // Measured: `633 + a * (68 ±0) + p * (37 ±0)` // Estimated: `5698` - // Minimum execution time: 40_256_000 picoseconds. - Weight::from_parts(40_373_648, 5698) - // Standard Error: 3_978 - .saturating_add(Weight::from_parts(166_936, 0).saturating_mul(a.into())) - // Standard Error: 4_110 - .saturating_add(Weight::from_parts(54_329, 0).saturating_mul(p.into())) - .saturating_add(RocksDbWeight::get().reads(3_u64)) + // Minimum execution time: 41_789_000 picoseconds. + Weight::from_parts(41_812_078, 5698) + // Standard Error: 3_694 + .saturating_add(Weight::from_parts(163_029, 0).saturating_mul(a.into())) + // Standard Error: 3_817 + .saturating_add(Weight::from_parts(79_539, 0).saturating_mul(p.into())) + .saturating_add(RocksDbWeight::get().reads(5_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } - /// Storage: Proxy Announcements (r:1 w:1) - /// Proof: Proxy Announcements (max_values: None, max_size: Some(2233), added: 4708, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: `Proxy::Announcements` (r:1 w:1) + /// Proof: `Proxy::Announcements` (`max_values`: None, `max_size`: Some(2233), added: 4708, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) /// The range of component `a` is `[0, 31]`. /// The range of component `p` is `[1, 31]`. fn remove_announcement(a: u32, p: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `403 + a * (68 ±0)` // Estimated: `5698` - // Minimum execution time: 25_040_000 picoseconds. - Weight::from_parts(25_112_188, 5698) - // Standard Error: 2_143 - .saturating_add(Weight::from_parts(189_027, 0).saturating_mul(a.into())) - // Standard Error: 2_214 - .saturating_add(Weight::from_parts(26_683, 0).saturating_mul(p.into())) + // Minimum execution time: 22_475_000 picoseconds. + Weight::from_parts(22_666_821, 5698) + // Standard Error: 1_797 + .saturating_add(Weight::from_parts(170_629, 0).saturating_mul(a.into())) + // Standard Error: 1_857 + .saturating_add(Weight::from_parts(18_799, 0).saturating_mul(p.into())) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } - /// Storage: Proxy Announcements (r:1 w:1) - /// Proof: Proxy Announcements (max_values: None, max_size: Some(2233), added: 4708, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: `Proxy::Announcements` (r:1 w:1) + /// Proof: `Proxy::Announcements` (`max_values`: None, `max_size`: Some(2233), added: 4708, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) /// The range of component `a` is `[0, 31]`. /// The range of component `p` is `[1, 31]`. fn reject_announcement(a: u32, p: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `403 + a * (68 ±0)` // Estimated: `5698` - // Minimum execution time: 24_884_000 picoseconds. - Weight::from_parts(25_359_291, 5698) - // Standard Error: 2_019 - .saturating_add(Weight::from_parts(181_470, 0).saturating_mul(a.into())) - // Standard Error: 2_086 - .saturating_add(Weight::from_parts(17_725, 0).saturating_mul(p.into())) + // Minimum execution time: 22_326_000 picoseconds. + Weight::from_parts(22_654_227, 5698) + // Standard Error: 1_859 + .saturating_add(Weight::from_parts(168_822, 0).saturating_mul(a.into())) + // Standard Error: 1_921 + .saturating_add(Weight::from_parts(21_839, 0).saturating_mul(p.into())) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } - /// Storage: Proxy Proxies (r:1 w:0) - /// Proof: Proxy Proxies (max_values: None, max_size: Some(1241), added: 3716, mode: MaxEncodedLen) - /// Storage: Proxy Announcements (r:1 w:1) - /// Proof: Proxy Announcements (max_values: None, max_size: Some(2233), added: 4708, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: `Proxy::Proxies` (r:1 w:0) + /// Proof: `Proxy::Proxies` (`max_values`: None, `max_size`: Some(1241), added: 3716, mode: `MaxEncodedLen`) + /// Storage: `Proxy::Announcements` (r:1 w:1) + /// Proof: `Proxy::Announcements` (`max_values`: None, `max_size`: Some(2233), added: 4708, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) /// The range of component `a` is `[0, 31]`. /// The range of component `p` is `[1, 31]`. fn announce(a: u32, p: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `420 + a * (68 ±0) + p * (37 ±0)` // Estimated: `5698` - // Minimum execution time: 35_039_000 picoseconds. - Weight::from_parts(36_727_868, 5698) - // Standard Error: 4_463 - .saturating_add(Weight::from_parts(167_060, 0).saturating_mul(a.into())) - // Standard Error: 4_611 - .saturating_add(Weight::from_parts(59_836, 0).saturating_mul(p.into())) + // Minimum execution time: 31_551_000 picoseconds. + Weight::from_parts(32_205_445, 5698) + // Standard Error: 4_089 + .saturating_add(Weight::from_parts(167_596, 0).saturating_mul(a.into())) + // Standard Error: 4_225 + .saturating_add(Weight::from_parts(67_833, 0).saturating_mul(p.into())) .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } - /// Storage: Proxy Proxies (r:1 w:1) - /// Proof: Proxy Proxies (max_values: None, max_size: Some(1241), added: 3716, mode: MaxEncodedLen) + /// Storage: `Proxy::Proxies` (r:1 w:1) + /// Proof: `Proxy::Proxies` (`max_values`: None, `max_size`: Some(1241), added: 3716, mode: `MaxEncodedLen`) /// The range of component `p` is `[1, 31]`. fn add_proxy(p: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `161 + p * (37 ±0)` // Estimated: `4706` - // Minimum execution time: 25_697_000 picoseconds. - Weight::from_parts(26_611_090, 4706) - // Standard Error: 2_306 - .saturating_add(Weight::from_parts(85_165, 0).saturating_mul(p.into())) + // Minimum execution time: 21_495_000 picoseconds. + Weight::from_parts(22_358_457, 4706) + // Standard Error: 1_606 + .saturating_add(Weight::from_parts(64_322, 0).saturating_mul(p.into())) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Proxy Proxies (r:1 w:1) - /// Proof: Proxy Proxies (max_values: None, max_size: Some(1241), added: 3716, mode: MaxEncodedLen) + /// Storage: `Proxy::Proxies` (r:1 w:1) + /// Proof: `Proxy::Proxies` (`max_values`: None, `max_size`: Some(1241), added: 3716, mode: `MaxEncodedLen`) /// The range of component `p` is `[1, 31]`. fn remove_proxy(p: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `161 + p * (37 ±0)` // Estimated: `4706` - // Minimum execution time: 25_638_000 picoseconds. - Weight::from_parts(26_904_510, 4706) - // Standard Error: 2_669 - .saturating_add(Weight::from_parts(61_668, 0).saturating_mul(p.into())) + // Minimum execution time: 21_495_000 picoseconds. + Weight::from_parts(22_579_308, 4706) + // Standard Error: 2_571 + .saturating_add(Weight::from_parts(62_404, 0).saturating_mul(p.into())) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Proxy Proxies (r:1 w:1) - /// Proof: Proxy Proxies (max_values: None, max_size: Some(1241), added: 3716, mode: MaxEncodedLen) + /// Storage: `Proxy::Proxies` (r:1 w:1) + /// Proof: `Proxy::Proxies` (`max_values`: None, `max_size`: Some(1241), added: 3716, mode: `MaxEncodedLen`) /// The range of component `p` is `[1, 31]`. fn remove_proxies(p: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `161 + p * (37 ±0)` // Estimated: `4706` - // Minimum execution time: 22_737_000 picoseconds. - Weight::from_parts(23_618_441, 4706) - // Standard Error: 1_729 - .saturating_add(Weight::from_parts(44_009, 0).saturating_mul(p.into())) + // Minimum execution time: 20_541_000 picoseconds. + Weight::from_parts(21_456_750, 4706) + // Standard Error: 1_697 + .saturating_add(Weight::from_parts(45_387, 0).saturating_mul(p.into())) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Proxy Proxies (r:1 w:1) - /// Proof: Proxy Proxies (max_values: None, max_size: Some(1241), added: 3716, mode: MaxEncodedLen) + /// Storage: `Proxy::Proxies` (r:1 w:1) + /// Proof: `Proxy::Proxies` (`max_values`: None, `max_size`: Some(1241), added: 3716, mode: `MaxEncodedLen`) /// The range of component `p` is `[1, 31]`. fn create_pure(p: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `173` // Estimated: `4706` - // Minimum execution time: 27_364_000 picoseconds. - Weight::from_parts(28_632_271, 4706) - // Standard Error: 1_613 - .saturating_add(Weight::from_parts(2_453, 0).saturating_mul(p.into())) + // Minimum execution time: 22_809_000 picoseconds. + Weight::from_parts(23_878_644, 4706) + // Standard Error: 1_600 + .saturating_add(Weight::from_parts(10_149, 0).saturating_mul(p.into())) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Proxy Proxies (r:1 w:1) - /// Proof: Proxy Proxies (max_values: None, max_size: Some(1241), added: 3716, mode: MaxEncodedLen) + /// Storage: `Proxy::Proxies` (r:1 w:1) + /// Proof: `Proxy::Proxies` (`max_values`: None, `max_size`: Some(1241), added: 3716, mode: `MaxEncodedLen`) /// The range of component `p` is `[0, 30]`. fn kill_pure(p: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `198 + p * (37 ±0)` // Estimated: `4706` - // Minimum execution time: 23_552_000 picoseconds. - Weight::from_parts(24_874_553, 4706) - // Standard Error: 1_919 - .saturating_add(Weight::from_parts(38_799, 0).saturating_mul(p.into())) + // Minimum execution time: 20_993_000 picoseconds. + Weight::from_parts(22_067_418, 4706) + // Standard Error: 1_673 + .saturating_add(Weight::from_parts(52_703, 0).saturating_mul(p.into())) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } diff --git a/substrate/frame/ranked-collective/Cargo.toml b/substrate/frame/ranked-collective/Cargo.toml index 62e01df372bdef15e9f2ee3e43ce4dc5a06044eb..0a6595807750388d3a99016276f69d57772bbba7 100644 --- a/substrate/frame/ranked-collective/Cargo.toml +++ b/substrate/frame/ranked-collective/Cargo.toml @@ -17,8 +17,8 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } -log = { version = "0.4.16", default-features = false } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +log = { workspace = true } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } frame-benchmarking = { path = "../benchmarking", default-features = false, optional = true } frame-support = { path = "../support", default-features = false } frame-system = { path = "../system", default-features = false } diff --git a/substrate/frame/ranked-collective/src/benchmarking.rs b/substrate/frame/ranked-collective/src/benchmarking.rs index 332d8292e53f1c8bd936a3fd19e9bd59f52d884b..462f55a238d2a867f900e4653369e5fa9368d874 100644 --- a/substrate/frame/ranked-collective/src/benchmarking.rs +++ b/substrate/frame/ranked-collective/src/benchmarking.rs @@ -41,8 +41,8 @@ fn make_member, I: 'static>(rank: Rank) -> T::AccountId { let who = account::("member", MemberCount::::get(0), SEED); let who_lookup = T::Lookup::unlookup(who.clone()); assert_ok!(Pallet::::add_member( - T::PromoteOrigin::try_successful_origin() - .expect("PromoteOrigin has no successful origin required for the benchmark"), + T::AddOrigin::try_successful_origin() + .expect("AddOrigin has no successful origin required for the benchmark"), who_lookup.clone(), )); for _ in 0..rank { @@ -60,7 +60,7 @@ benchmarks_instance_pallet! { let who = account::("member", 0, SEED); let who_lookup = T::Lookup::unlookup(who.clone()); let origin = - T::PromoteOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; + T::AddOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; let call = Call::::add_member { who: who_lookup }; }: { call.dispatch_bypass_filter(origin)? } verify { @@ -77,7 +77,7 @@ benchmarks_instance_pallet! { let last = make_member::(rank); let last_index = (0..=rank).map(|r| IdToIndex::::get(r, &last).unwrap()).collect::>(); let origin = - T::DemoteOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; + T::RemoveOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; let call = Call::::remove_member { who: who_lookup, min_rank: rank }; }: { call.dispatch_bypass_filter(origin)? } verify { @@ -125,23 +125,11 @@ benchmarks_instance_pallet! { } vote { - let caller: T::AccountId = whitelisted_caller(); - let caller_lookup = T::Lookup::unlookup(caller.clone()); - assert_ok!(Pallet::::add_member( - T::PromoteOrigin::try_successful_origin() - .expect("PromoteOrigin has no successful origin required for the benchmark"), - caller_lookup.clone(), - )); - // Create a poll let class = T::Polls::classes().into_iter().next().unwrap(); let rank = T::MinRankOfClass::convert(class.clone()); - for _ in 0..rank { - assert_ok!(Pallet::::promote_member( - T::PromoteOrigin::try_successful_origin() - .expect("PromoteOrigin has no successful origin required for the benchmark"), - caller_lookup.clone(), - )); - } + + let caller = make_member::(rank); + let caller_lookup = T::Lookup::unlookup(caller.clone()); let poll = T::Polls::create_ongoing(class).expect("Must always be able to create a poll for rank 0"); @@ -193,5 +181,5 @@ benchmarks_instance_pallet! { assert_has_event::(Event::MemberExchanged { who, new_who }.into()); } - impl_benchmark_test_suite!(RankedCollective, crate::tests::new_test_ext(), crate::tests::Test); + impl_benchmark_test_suite!(RankedCollective, crate::tests::ExtBuilder::default().build(), crate::tests::Test); } diff --git a/substrate/frame/ranked-collective/src/lib.rs b/substrate/frame/ranked-collective/src/lib.rs index d0303fee0b3670adcb723ba652ec8b8b50919afa..ceaf03de211008ee49bf4a4a1fc961bf8825971a 100644 --- a/substrate/frame/ranked-collective/src/lib.rs +++ b/substrate/frame/ranked-collective/src/lib.rs @@ -39,7 +39,6 @@ //! least a particular rank. #![cfg_attr(not(feature = "std"), no_std)] -#![recursion_limit = "128"] use codec::{Decode, Encode, MaxEncodedLen}; use scale_info::TypeInfo; @@ -393,12 +392,20 @@ pub mod pallet { type RuntimeEvent: From> + IsType<::RuntimeEvent>; - /// The origin required to add or promote a mmember. The success value indicates the + /// The origin required to add a member. + type AddOrigin: EnsureOrigin; + + /// The origin required to remove a member. + /// + /// The success value indicates the maximum rank *from which* the removal may be. + type RemoveOrigin: EnsureOrigin; + + /// The origin required to promote a member. The success value indicates the /// maximum rank *to which* the promotion may be. type PromoteOrigin: EnsureOrigin; - /// The origin required to demote or remove a member. The success value indicates the - /// maximum rank *from which* the demotion/removal may be. + /// The origin required to demote a member. The success value indicates the + /// maximum rank *from which* the demotion may be. type DemoteOrigin: EnsureOrigin; /// The origin that can swap the account of a member. @@ -510,22 +517,21 @@ pub mod pallet { impl, I: 'static> Pallet { /// Introduce a new member. /// - /// - `origin`: Must be the `AdminOrigin`. + /// - `origin`: Must be the `AddOrigin`. /// - `who`: Account of non-member which will become a member. - /// - `rank`: The rank to give the new member. /// /// Weight: `O(1)` #[pallet::call_index(0)] #[pallet::weight(T::WeightInfo::add_member())] pub fn add_member(origin: OriginFor, who: AccountIdLookupOf) -> DispatchResult { - let _ = T::PromoteOrigin::ensure_origin(origin)?; + T::AddOrigin::ensure_origin(origin)?; let who = T::Lookup::lookup(who)?; Self::do_add_member(who, true) } /// Increment the rank of an existing member by one. /// - /// - `origin`: Must be the `AdminOrigin`. + /// - `origin`: Must be the `PromoteOrigin`. /// - `who`: Account of existing member. /// /// Weight: `O(1)` @@ -540,7 +546,7 @@ pub mod pallet { /// Decrement the rank of an existing member by one. If the member is already at rank zero, /// then they are removed entirely. /// - /// - `origin`: Must be the `AdminOrigin`. + /// - `origin`: Must be the `DemoteOrigin`. /// - `who`: Account of existing member of rank greater than zero. /// /// Weight: `O(1)`, less if the member's index is highest in its rank. @@ -554,7 +560,7 @@ pub mod pallet { /// Remove the member entirely. /// - /// - `origin`: Must be the `AdminOrigin`. + /// - `origin`: Must be the `RemoveOrigin`. /// - `who`: Account of existing member of rank greater than zero. /// - `min_rank`: The rank of the member or greater. /// @@ -566,7 +572,7 @@ pub mod pallet { who: AccountIdLookupOf, min_rank: Rank, ) -> DispatchResultWithPostInfo { - let max_rank = T::DemoteOrigin::ensure_origin(origin)?; + let max_rank = T::RemoveOrigin::ensure_origin(origin)?; let who = T::Lookup::lookup(who)?; let MemberRecord { rank, .. } = Self::ensure_member(&who)?; ensure!(min_rank >= rank, Error::::InvalidWitness); @@ -709,6 +715,14 @@ pub mod pallet { } } + #[pallet::hooks] + impl, I: 'static> Hooks> for Pallet { + #[cfg(feature = "try-runtime")] + fn try_state(_n: BlockNumberFor) -> Result<(), sp_runtime::TryRuntimeError> { + Self::do_try_state() + } + } + impl, I: 'static> Pallet { fn ensure_member(who: &T::AccountId) -> Result { Members::::get(who).ok_or(Error::::NotMember.into()) @@ -840,6 +854,132 @@ pub mod pallet { } } + #[cfg(any(feature = "try-runtime", test))] + impl, I: 'static> Pallet { + /// Ensure the correctness of the state of this pallet. + pub fn do_try_state() -> Result<(), sp_runtime::TryRuntimeError> { + Self::try_state_members()?; + Self::try_state_index()?; + + Ok(()) + } + + /// ### Invariants of Member storage items + /// + /// Total number of [`Members`] in storage should be >= [`MemberIndex`] of a [`Rank`] in + /// [`MemberCount`]. + /// [`Rank`] in Members should be in [`MemberCount`] + /// [`Sum`] of [`MemberCount`] index should be the same as the sum of all the index attained + /// for rank possessed by [`Members`] + fn try_state_members() -> Result<(), sp_runtime::TryRuntimeError> { + MemberCount::::iter().try_for_each(|(_, member_index)| -> DispatchResult { + let total_members = Members::::iter().count(); + ensure!( + total_members as u32 >= member_index, + "Total count of `Members` should be greater than or equal to the number of `MemberIndex` of a particular `Rank` in `MemberCount`." + ); + + Ok(()) + })?; + + let mut sum_of_member_rank_indexes = 0; + Members::::iter().try_for_each(|(_, member_record)| -> DispatchResult { + ensure!( + Self::is_rank_in_member_count(member_record.rank.into()), + "`Rank` in Members should be in `MemberCount`" + ); + + sum_of_member_rank_indexes += Self::determine_index_of_a_rank(member_record.rank); + + Ok(()) + })?; + + let sum_of_all_member_count_indexes = + MemberCount::::iter_values().fold(0, |sum, index| sum + index); + ensure!( + sum_of_all_member_count_indexes == sum_of_member_rank_indexes as u32, + "Sum of `MemberCount` index should be the same as the sum of all the index attained for rank possessed by `Members`" + ); + Ok(()) + } + + /// ### Invariants of Index storage items + /// [`Member`] in storage of [`IdToIndex`] should be the same as [`Member`] in [`IndexToId`] + /// [`Rank`] in [`IdToIndex`] should be the same as the the [`Rank`] in [`IndexToId`] + /// [`Rank`] of the member [`who`] in [`IdToIndex`] should be the same as the [`Rank`] of + /// the member [`who`] in [`Members`] + fn try_state_index() -> Result<(), sp_runtime::TryRuntimeError> { + IdToIndex::::iter().try_for_each( + |(rank, who, member_index)| -> DispatchResult { + let who_from_index = IndexToId::::get(rank, member_index).unwrap(); + ensure!( + who == who_from_index, + "`Member` in storage of `IdToIndex` should be the same as `Member` in `IndexToId`." + ); + + ensure!( + Self::is_rank_in_index_to_id_storage(rank.into()), + "`Rank` in `IdToIndex` should be the same as the `Rank` in `IndexToId`" + ); + Ok(()) + }, + )?; + + Members::::iter().try_for_each(|(who, member_record)| -> DispatchResult { + ensure!( + Self::is_who_rank_in_id_to_index_storage(who, member_record.rank), + "`Rank` of the member `who` in `IdToIndex` should be the same as the `Rank` of the member `who` in `Members`" + ); + + Ok(()) + })?; + + Ok(()) + } + + /// Checks if a rank is part of the `MemberCount` + fn is_rank_in_member_count(rank: u32) -> bool { + for (r, _) in MemberCount::::iter() { + if r as u32 == rank { + return true; + } + } + + return false; + } + + /// Checks if a rank is the same as the rank `IndexToId` + fn is_rank_in_index_to_id_storage(rank: u32) -> bool { + for (r, _, _) in IndexToId::::iter() { + if r as u32 == rank { + return true; + } + } + + return false; + } + + /// Checks if a member(who) rank is the same as the rank of a member(who) in `IdToIndex` + fn is_who_rank_in_id_to_index_storage(who: T::AccountId, rank: u16) -> bool { + for (rank_, who_, _) in IdToIndex::::iter() { + if who == who_ && rank == rank_ { + return true; + } + } + + return false; + } + + /// Determines the total index for a rank + fn determine_index_of_a_rank(rank: u16) -> u16 { + let mut sum = 0; + for _ in 0..rank + 1 { + sum += 1; + } + sum + } + } + impl, I: 'static> RankedMembers for Pallet { type AccountId = T::AccountId; type Rank = Rank; diff --git a/substrate/frame/ranked-collective/src/tests.rs b/substrate/frame/ranked-collective/src/tests.rs index 58e21ded358147fe7b7546be2df9cced94fde089..ad8b7d2a8018bb0566f9b851cf64433791a1c1ce 100644 --- a/substrate/frame/ranked-collective/src/tests.rs +++ b/substrate/frame/ranked-collective/src/tests.rs @@ -26,7 +26,10 @@ use frame_support::{ traits::{ConstU16, EitherOf, MapSuccess, Polling}, }; use sp_core::Get; -use sp_runtime::{traits::ReduceBy, BuildStorage}; +use sp_runtime::{ + traits::{ReduceBy, ReplaceWithDefault}, + BuildStorage, +}; use super::*; use crate as pallet_ranked_collective; @@ -42,7 +45,7 @@ frame_support::construct_runtime!( } ); -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { type Block = Block; } @@ -152,6 +155,8 @@ parameter_types! { impl Config for Test { type WeightInfo = (); type RuntimeEvent = RuntimeEvent; + type AddOrigin = MapSuccess>; + type RemoveOrigin = Self::DemoteOrigin; type PromoteOrigin = EitherOf< // Root can promote arbitrarily. frame_system::EnsureRootWithSuccess>, @@ -178,11 +183,28 @@ impl Config for Test { type BenchmarkSetup = (); } -pub fn new_test_ext() -> sp_io::TestExternalities { - let t = frame_system::GenesisConfig::::default().build_storage().unwrap(); - let mut ext = sp_io::TestExternalities::new(t); - ext.execute_with(|| System::set_block_number(1)); - ext +pub struct ExtBuilder {} + +impl Default for ExtBuilder { + fn default() -> Self { + Self {} + } +} + +impl ExtBuilder { + pub fn build(self) -> sp_io::TestExternalities { + let t = frame_system::GenesisConfig::::default().build_storage().unwrap(); + let mut ext = sp_io::TestExternalities::new(t); + ext.execute_with(|| System::set_block_number(1)); + ext + } + + pub fn build_and_execute(self, test: impl FnOnce() -> ()) { + self.build().execute_with(|| { + test(); + Club::do_try_state().expect("All invariants must hold after a test"); + }) + } } fn next_block() { @@ -220,14 +242,14 @@ fn completed_poll_should_panic() { #[test] fn basic_stuff() { - new_test_ext().execute_with(|| { + ExtBuilder::default().build_and_execute(|| { assert_eq!(tally(3), Tally::from_parts(0, 0, 0)); }); } #[test] fn member_lifecycle_works() { - new_test_ext().execute_with(|| { + ExtBuilder::default().build_and_execute(|| { assert_ok!(Club::add_member(RuntimeOrigin::root(), 1)); assert_ok!(Club::promote_member(RuntimeOrigin::root(), 1)); assert_ok!(Club::demote_member(RuntimeOrigin::root(), 1)); @@ -239,7 +261,7 @@ fn member_lifecycle_works() { #[test] fn add_remove_works() { - new_test_ext().execute_with(|| { + ExtBuilder::default().build_and_execute(|| { assert_noop!(Club::add_member(RuntimeOrigin::signed(1), 1), DispatchError::BadOrigin); assert_ok!(Club::add_member(RuntimeOrigin::root(), 1)); assert_eq!(member_count(0), 1); @@ -269,7 +291,7 @@ fn add_remove_works() { #[test] fn promote_demote_works() { - new_test_ext().execute_with(|| { + ExtBuilder::default().build_and_execute(|| { assert_noop!(Club::add_member(RuntimeOrigin::signed(1), 1), DispatchError::BadOrigin); assert_ok!(Club::add_member(RuntimeOrigin::root(), 1)); assert_eq!(member_count(0), 1); @@ -300,7 +322,7 @@ fn promote_demote_works() { #[test] fn promote_demote_by_rank_works() { - new_test_ext().execute_with(|| { + ExtBuilder::default().build_and_execute(|| { assert_ok!(Club::add_member(RuntimeOrigin::root(), 1)); for _ in 0..7 { assert_ok!(Club::promote_member(RuntimeOrigin::root(), 1)); @@ -367,7 +389,7 @@ fn promote_demote_by_rank_works() { #[test] fn voting_works() { - new_test_ext().execute_with(|| { + ExtBuilder::default().build_and_execute(|| { assert_ok!(Club::add_member(RuntimeOrigin::root(), 0)); assert_ok!(Club::add_member(RuntimeOrigin::root(), 1)); assert_ok!(Club::promote_member(RuntimeOrigin::root(), 1)); @@ -401,7 +423,7 @@ fn voting_works() { #[test] fn cleanup_works() { - new_test_ext().execute_with(|| { + ExtBuilder::default().build_and_execute(|| { assert_ok!(Club::add_member(RuntimeOrigin::root(), 1)); assert_ok!(Club::promote_member(RuntimeOrigin::root(), 1)); assert_ok!(Club::add_member(RuntimeOrigin::root(), 2)); @@ -428,7 +450,7 @@ fn cleanup_works() { #[test] fn remove_member_cleanup_works() { - new_test_ext().execute_with(|| { + ExtBuilder::default().build_and_execute(|| { assert_ok!(Club::add_member(RuntimeOrigin::root(), 1)); assert_ok!(Club::promote_member(RuntimeOrigin::root(), 1)); assert_ok!(Club::add_member(RuntimeOrigin::root(), 2)); @@ -454,7 +476,7 @@ fn remove_member_cleanup_works() { #[test] fn ensure_ranked_works() { - new_test_ext().execute_with(|| { + ExtBuilder::default().build_and_execute(|| { assert_ok!(Club::add_member(RuntimeOrigin::root(), 1)); assert_ok!(Club::promote_member(RuntimeOrigin::root(), 1)); assert_ok!(Club::add_member(RuntimeOrigin::root(), 2)); @@ -523,7 +545,7 @@ fn ensure_ranked_works() { #[test] fn do_add_member_to_rank_works() { - new_test_ext().execute_with(|| { + ExtBuilder::default().build_and_execute(|| { let max_rank = 9u16; assert_ok!(Club::do_add_member_to_rank(69, max_rank / 2, true)); assert_ok!(Club::do_add_member_to_rank(1337, max_rank, true)); @@ -540,7 +562,7 @@ fn do_add_member_to_rank_works() { #[test] fn tally_support_correct() { - new_test_ext().execute_with(|| { + ExtBuilder::default().build_and_execute(|| { // add members, // rank 1: accounts 1, 2, 3 // rank 2: accounts 2, 3 @@ -580,7 +602,7 @@ fn tally_support_correct() { #[test] fn exchange_member_works() { - new_test_ext().execute_with(|| { + ExtBuilder::default().build_and_execute(|| { assert_ok!(Club::add_member(RuntimeOrigin::root(), 1)); assert_eq!(member_count(0), 1); @@ -608,7 +630,7 @@ fn exchange_member_works() { #[test] fn exchange_member_same_noops() { - new_test_ext().execute_with(|| { + ExtBuilder::default().build_and_execute(|| { assert_ok!(Club::add_member(RuntimeOrigin::root(), 1)); assert_ok!(Club::promote_member(RuntimeOrigin::root(), 1)); assert_ok!(Club::add_member(RuntimeOrigin::root(), 2)); diff --git a/substrate/frame/ranked-collective/src/weights.rs b/substrate/frame/ranked-collective/src/weights.rs index 4ff0c3337d503fd66de4400ca40631cfcca300d9..e728635f2e721a5711106e60b4734104a6696d2a 100644 --- a/substrate/frame/ranked-collective/src/weights.rs +++ b/substrate/frame/ranked-collective/src/weights.rs @@ -15,16 +15,16 @@ // See the License for the specific language governing permissions and // limitations under the License. -//! Autogenerated weights for pallet_ranked_collective +//! Autogenerated weights for `pallet_ranked_collective` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-06-16, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-04-09, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-e8ezs4ez-project-145-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("dev"), DB CACHE: 1024 +//! HOSTNAME: `runner-anb7yjbi-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: `1024` // Executed Command: -// ./target/production/substrate +// ./target/production/substrate-node // benchmark // pallet // --chain=dev @@ -35,12 +35,11 @@ // --no-median-slopes // --no-min-squares // --extrinsic=* -// --execution=wasm // --wasm-execution=compiled // --heap-pages=4096 -// --output=./frame/ranked-collective/src/weights.rs -// --header=./HEADER-APACHE2 -// --template=./.maintain/frame-weight-template.hbs +// --output=./substrate/frame/ranked-collective/src/weights.rs +// --header=./substrate/HEADER-APACHE2 +// --template=./substrate/.maintain/frame-weight-template.hbs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -50,7 +49,7 @@ use frame_support::{traits::Get, weights::{Weight, constants::RocksDbWeight}}; use core::marker::PhantomData; -/// Weight functions needed for pallet_ranked_collective. +/// Weight functions needed for `pallet_ranked_collective`. pub trait WeightInfo { fn add_member() -> Weight; fn remove_member(r: u32, ) -> Weight; @@ -61,283 +60,295 @@ pub trait WeightInfo { fn exchange_member() -> Weight; } -/// Weights for pallet_ranked_collective using the Substrate node and recommended hardware. +/// Weights for `pallet_ranked_collective` using the Substrate node and recommended hardware. pub struct SubstrateWeight(PhantomData); impl WeightInfo for SubstrateWeight { - /// Storage: RankedCollective Members (r:1 w:1) - /// Proof: RankedCollective Members (max_values: None, max_size: Some(42), added: 2517, mode: MaxEncodedLen) - /// Storage: RankedCollective MemberCount (r:1 w:1) - /// Proof: RankedCollective MemberCount (max_values: None, max_size: Some(14), added: 2489, mode: MaxEncodedLen) - /// Storage: RankedCollective IndexToId (r:0 w:1) - /// Proof: RankedCollective IndexToId (max_values: None, max_size: Some(54), added: 2529, mode: MaxEncodedLen) - /// Storage: RankedCollective IdToIndex (r:0 w:1) - /// Proof: RankedCollective IdToIndex (max_values: None, max_size: Some(54), added: 2529, mode: MaxEncodedLen) + /// Storage: `RankedCollective::Members` (r:1 w:1) + /// Proof: `RankedCollective::Members` (`max_values`: None, `max_size`: Some(42), added: 2517, mode: `MaxEncodedLen`) + /// Storage: `RankedCollective::MemberCount` (r:1 w:1) + /// Proof: `RankedCollective::MemberCount` (`max_values`: None, `max_size`: Some(14), added: 2489, mode: `MaxEncodedLen`) + /// Storage: `RankedCollective::IndexToId` (r:0 w:1) + /// Proof: `RankedCollective::IndexToId` (`max_values`: None, `max_size`: Some(54), added: 2529, mode: `MaxEncodedLen`) + /// Storage: `RankedCollective::IdToIndex` (r:0 w:1) + /// Proof: `RankedCollective::IdToIndex` (`max_values`: None, `max_size`: Some(54), added: 2529, mode: `MaxEncodedLen`) fn add_member() -> Weight { // Proof Size summary in bytes: // Measured: `142` // Estimated: `3507` - // Minimum execution time: 17_245_000 picoseconds. - Weight::from_parts(17_930_000, 3507) + // Minimum execution time: 15_440_000 picoseconds. + Weight::from_parts(15_990_000, 3507) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(4_u64)) } - /// Storage: RankedCollective Members (r:1 w:1) - /// Proof: RankedCollective Members (max_values: None, max_size: Some(42), added: 2517, mode: MaxEncodedLen) - /// Storage: RankedCollective MemberCount (r:11 w:11) - /// Proof: RankedCollective MemberCount (max_values: None, max_size: Some(14), added: 2489, mode: MaxEncodedLen) - /// Storage: RankedCollective IdToIndex (r:11 w:11) - /// Proof: RankedCollective IdToIndex (max_values: None, max_size: Some(54), added: 2529, mode: MaxEncodedLen) - /// Storage: RankedCollective IndexToId (r:11 w:11) - /// Proof: RankedCollective IndexToId (max_values: None, max_size: Some(54), added: 2529, mode: MaxEncodedLen) + /// Storage: `RankedCollective::Members` (r:1 w:1) + /// Proof: `RankedCollective::Members` (`max_values`: None, `max_size`: Some(42), added: 2517, mode: `MaxEncodedLen`) + /// Storage: `RankedCollective::MemberCount` (r:11 w:11) + /// Proof: `RankedCollective::MemberCount` (`max_values`: None, `max_size`: Some(14), added: 2489, mode: `MaxEncodedLen`) + /// Storage: `RankedCollective::IdToIndex` (r:11 w:22) + /// Proof: `RankedCollective::IdToIndex` (`max_values`: None, `max_size`: Some(54), added: 2529, mode: `MaxEncodedLen`) + /// Storage: `RankedCollective::IndexToId` (r:11 w:22) + /// Proof: `RankedCollective::IndexToId` (`max_values`: None, `max_size`: Some(54), added: 2529, mode: `MaxEncodedLen`) /// The range of component `r` is `[0, 10]`. fn remove_member(r: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `616 + r * (281 ±0)` // Estimated: `3519 + r * (2529 ±0)` - // Minimum execution time: 29_534_000 picoseconds. - Weight::from_parts(32_847_495, 3519) - // Standard Error: 24_211 - .saturating_add(Weight::from_parts(13_949_639, 0).saturating_mul(r.into())) + // Minimum execution time: 30_171_000 picoseconds. + Weight::from_parts(33_395_037, 3519) + // Standard Error: 21_741 + .saturating_add(Weight::from_parts(16_589_950, 0).saturating_mul(r.into())) .saturating_add(T::DbWeight::get().reads(4_u64)) .saturating_add(T::DbWeight::get().reads((3_u64).saturating_mul(r.into()))) - .saturating_add(T::DbWeight::get().writes(4_u64)) - .saturating_add(T::DbWeight::get().writes((3_u64).saturating_mul(r.into()))) + .saturating_add(T::DbWeight::get().writes(6_u64)) + .saturating_add(T::DbWeight::get().writes((5_u64).saturating_mul(r.into()))) .saturating_add(Weight::from_parts(0, 2529).saturating_mul(r.into())) } - /// Storage: RankedCollective Members (r:1 w:1) - /// Proof: RankedCollective Members (max_values: None, max_size: Some(42), added: 2517, mode: MaxEncodedLen) - /// Storage: RankedCollective MemberCount (r:1 w:1) - /// Proof: RankedCollective MemberCount (max_values: None, max_size: Some(14), added: 2489, mode: MaxEncodedLen) - /// Storage: RankedCollective IndexToId (r:0 w:1) - /// Proof: RankedCollective IndexToId (max_values: None, max_size: Some(54), added: 2529, mode: MaxEncodedLen) - /// Storage: RankedCollective IdToIndex (r:0 w:1) - /// Proof: RankedCollective IdToIndex (max_values: None, max_size: Some(54), added: 2529, mode: MaxEncodedLen) + /// Storage: `RankedCollective::Members` (r:1 w:1) + /// Proof: `RankedCollective::Members` (`max_values`: None, `max_size`: Some(42), added: 2517, mode: `MaxEncodedLen`) + /// Storage: `RankedCollective::MemberCount` (r:1 w:1) + /// Proof: `RankedCollective::MemberCount` (`max_values`: None, `max_size`: Some(14), added: 2489, mode: `MaxEncodedLen`) + /// Storage: `RankedCollective::IndexToId` (r:0 w:1) + /// Proof: `RankedCollective::IndexToId` (`max_values`: None, `max_size`: Some(54), added: 2529, mode: `MaxEncodedLen`) + /// Storage: `RankedCollective::IdToIndex` (r:0 w:1) + /// Proof: `RankedCollective::IdToIndex` (`max_values`: None, `max_size`: Some(54), added: 2529, mode: `MaxEncodedLen`) /// The range of component `r` is `[0, 10]`. fn promote_member(r: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `314 + r * (17 ±0)` // Estimated: `3507` - // Minimum execution time: 20_333_000 picoseconds. - Weight::from_parts(21_592_224, 3507) - // Standard Error: 6_423 - .saturating_add(Weight::from_parts(321_314, 0).saturating_mul(r.into())) + // Minimum execution time: 18_597_000 picoseconds. + Weight::from_parts(19_774_947, 3507) + // Standard Error: 5_735 + .saturating_add(Weight::from_parts(339_013, 0).saturating_mul(r.into())) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(4_u64)) } - /// Storage: RankedCollective Members (r:1 w:1) - /// Proof: RankedCollective Members (max_values: None, max_size: Some(42), added: 2517, mode: MaxEncodedLen) - /// Storage: RankedCollective MemberCount (r:1 w:1) - /// Proof: RankedCollective MemberCount (max_values: None, max_size: Some(14), added: 2489, mode: MaxEncodedLen) - /// Storage: RankedCollective IdToIndex (r:1 w:1) - /// Proof: RankedCollective IdToIndex (max_values: None, max_size: Some(54), added: 2529, mode: MaxEncodedLen) - /// Storage: RankedCollective IndexToId (r:1 w:1) - /// Proof: RankedCollective IndexToId (max_values: None, max_size: Some(54), added: 2529, mode: MaxEncodedLen) + /// Storage: `RankedCollective::Members` (r:1 w:1) + /// Proof: `RankedCollective::Members` (`max_values`: None, `max_size`: Some(42), added: 2517, mode: `MaxEncodedLen`) + /// Storage: `RankedCollective::MemberCount` (r:1 w:1) + /// Proof: `RankedCollective::MemberCount` (`max_values`: None, `max_size`: Some(14), added: 2489, mode: `MaxEncodedLen`) + /// Storage: `RankedCollective::IdToIndex` (r:1 w:2) + /// Proof: `RankedCollective::IdToIndex` (`max_values`: None, `max_size`: Some(54), added: 2529, mode: `MaxEncodedLen`) + /// Storage: `RankedCollective::IndexToId` (r:1 w:2) + /// Proof: `RankedCollective::IndexToId` (`max_values`: None, `max_size`: Some(54), added: 2529, mode: `MaxEncodedLen`) /// The range of component `r` is `[0, 10]`. fn demote_member(r: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `632 + r * (72 ±0)` // Estimated: `3519` - // Minimum execution time: 29_446_000 picoseconds. - Weight::from_parts(32_447_715, 3519) - // Standard Error: 28_791 - .saturating_add(Weight::from_parts(822_890, 0).saturating_mul(r.into())) + // Minimum execution time: 29_670_000 picoseconds. + Weight::from_parts(33_022_564, 3519) + // Standard Error: 28_521 + .saturating_add(Weight::from_parts(817_563, 0).saturating_mul(r.into())) .saturating_add(T::DbWeight::get().reads(4_u64)) - .saturating_add(T::DbWeight::get().writes(4_u64)) + .saturating_add(T::DbWeight::get().writes(6_u64)) } - /// Storage: RankedCollective Members (r:1 w:0) - /// Proof: RankedCollective Members (max_values: None, max_size: Some(42), added: 2517, mode: MaxEncodedLen) - /// Storage: RankedPolls ReferendumInfoFor (r:1 w:1) - /// Proof: RankedPolls ReferendumInfoFor (max_values: None, max_size: Some(330), added: 2805, mode: MaxEncodedLen) - /// Storage: RankedCollective Voting (r:1 w:1) - /// Proof: RankedCollective Voting (max_values: None, max_size: Some(65), added: 2540, mode: MaxEncodedLen) - /// Storage: Scheduler Agenda (r:2 w:2) - /// Proof: Scheduler Agenda (max_values: None, max_size: Some(107022), added: 109497, mode: MaxEncodedLen) + /// Storage: `RankedCollective::Members` (r:1 w:0) + /// Proof: `RankedCollective::Members` (`max_values`: None, `max_size`: Some(42), added: 2517, mode: `MaxEncodedLen`) + /// Storage: `RankedPolls::ReferendumInfoFor` (r:1 w:1) + /// Proof: `RankedPolls::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(330), added: 2805, mode: `MaxEncodedLen`) + /// Storage: `RankedCollective::Voting` (r:1 w:1) + /// Proof: `RankedCollective::Voting` (`max_values`: None, `max_size`: Some(65), added: 2540, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Agenda` (r:2 w:2) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Retries` (r:0 w:1) + /// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`) fn vote() -> Weight { // Proof Size summary in bytes: // Measured: `628` // Estimated: `219984` - // Minimum execution time: 45_474_000 picoseconds. - Weight::from_parts(47_228_000, 219984) + // Minimum execution time: 42_072_000 picoseconds. + Weight::from_parts(43_360_000, 219984) .saturating_add(T::DbWeight::get().reads(5_u64)) - .saturating_add(T::DbWeight::get().writes(4_u64)) + .saturating_add(T::DbWeight::get().writes(5_u64)) } - /// Storage: RankedPolls ReferendumInfoFor (r:1 w:0) - /// Proof: RankedPolls ReferendumInfoFor (max_values: None, max_size: Some(330), added: 2805, mode: MaxEncodedLen) - /// Storage: RankedCollective VotingCleanup (r:1 w:0) - /// Proof: RankedCollective VotingCleanup (max_values: None, max_size: Some(114), added: 2589, mode: MaxEncodedLen) - /// Storage: RankedCollective Voting (r:100 w:100) - /// Proof: RankedCollective Voting (max_values: None, max_size: Some(65), added: 2540, mode: MaxEncodedLen) + /// Storage: `RankedPolls::ReferendumInfoFor` (r:1 w:0) + /// Proof: `RankedPolls::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(330), added: 2805, mode: `MaxEncodedLen`) + /// Storage: `RankedCollective::VotingCleanup` (r:1 w:0) + /// Proof: `RankedCollective::VotingCleanup` (`max_values`: None, `max_size`: Some(114), added: 2589, mode: `MaxEncodedLen`) + /// Storage: `RankedCollective::Voting` (r:100 w:100) + /// Proof: `RankedCollective::Voting` (`max_values`: None, `max_size`: Some(65), added: 2540, mode: `MaxEncodedLen`) /// The range of component `n` is `[0, 100]`. fn cleanup_poll(n: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `462 + n * (50 ±0)` // Estimated: `3795 + n * (2540 ±0)` - // Minimum execution time: 13_903_000 picoseconds. - Weight::from_parts(18_209_102, 3795) - // Standard Error: 2_556 - .saturating_add(Weight::from_parts(1_237_454, 0).saturating_mul(n.into())) + // Minimum execution time: 14_338_000 picoseconds. + Weight::from_parts(18_144_424, 3795) + // Standard Error: 2_482 + .saturating_add(Weight::from_parts(1_200_576, 0).saturating_mul(n.into())) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(n.into()))) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(n.into()))) .saturating_add(Weight::from_parts(0, 2540).saturating_mul(n.into())) } - /// Storage: `RankedCollective::Members` (r:2 w:2) /// Proof: `RankedCollective::Members` (`max_values`: None, `max_size`: Some(42), added: 2517, mode: `MaxEncodedLen`) /// Storage: `RankedCollective::MemberCount` (r:2 w:2) /// Proof: `RankedCollective::MemberCount` (`max_values`: None, `max_size`: Some(14), added: 2489, mode: `MaxEncodedLen`) - /// Storage: `RankedCollective::IdToIndex` (r:2 w:2) + /// Storage: `RankedCollective::IdToIndex` (r:2 w:4) /// Proof: `RankedCollective::IdToIndex` (`max_values`: None, `max_size`: Some(54), added: 2529, mode: `MaxEncodedLen`) + /// Storage: `CoreFellowship::Member` (r:2 w:2) + /// Proof: `CoreFellowship::Member` (`max_values`: None, `max_size`: Some(49), added: 2524, mode: `MaxEncodedLen`) + /// Storage: `CoreFellowship::MemberEvidence` (r:1 w:0) + /// Proof: `CoreFellowship::MemberEvidence` (`max_values`: None, `max_size`: Some(16429), added: 18904, mode: `MaxEncodedLen`) + /// Storage: `Salary::Claimant` (r:2 w:2) + /// Proof: `Salary::Claimant` (`max_values`: None, `max_size`: Some(78), added: 2553, mode: `MaxEncodedLen`) /// Storage: `RankedCollective::IndexToId` (r:0 w:2) /// Proof: `RankedCollective::IndexToId` (`max_values`: None, `max_size`: Some(54), added: 2529, mode: `MaxEncodedLen`) fn exchange_member() -> Weight { // Proof Size summary in bytes: - // Measured: `437` - // Estimated: `6048` - // Minimum execution time: 138_000_000 picoseconds. - Weight::from_parts(141_000_000, 0) - .saturating_add(Weight::from_parts(0, 6048)) - .saturating_add(T::DbWeight::get().reads(6)) - .saturating_add(T::DbWeight::get().writes(8)) + // Measured: `625` + // Estimated: `19894` + // Minimum execution time: 73_317_000 picoseconds. + Weight::from_parts(75_103_000, 19894) + .saturating_add(T::DbWeight::get().reads(11_u64)) + .saturating_add(T::DbWeight::get().writes(14_u64)) } } -// For backwards compatibility and tests +// For backwards compatibility and tests. impl WeightInfo for () { - /// Storage: RankedCollective Members (r:1 w:1) - /// Proof: RankedCollective Members (max_values: None, max_size: Some(42), added: 2517, mode: MaxEncodedLen) - /// Storage: RankedCollective MemberCount (r:1 w:1) - /// Proof: RankedCollective MemberCount (max_values: None, max_size: Some(14), added: 2489, mode: MaxEncodedLen) - /// Storage: RankedCollective IndexToId (r:0 w:1) - /// Proof: RankedCollective IndexToId (max_values: None, max_size: Some(54), added: 2529, mode: MaxEncodedLen) - /// Storage: RankedCollective IdToIndex (r:0 w:1) - /// Proof: RankedCollective IdToIndex (max_values: None, max_size: Some(54), added: 2529, mode: MaxEncodedLen) + /// Storage: `RankedCollective::Members` (r:1 w:1) + /// Proof: `RankedCollective::Members` (`max_values`: None, `max_size`: Some(42), added: 2517, mode: `MaxEncodedLen`) + /// Storage: `RankedCollective::MemberCount` (r:1 w:1) + /// Proof: `RankedCollective::MemberCount` (`max_values`: None, `max_size`: Some(14), added: 2489, mode: `MaxEncodedLen`) + /// Storage: `RankedCollective::IndexToId` (r:0 w:1) + /// Proof: `RankedCollective::IndexToId` (`max_values`: None, `max_size`: Some(54), added: 2529, mode: `MaxEncodedLen`) + /// Storage: `RankedCollective::IdToIndex` (r:0 w:1) + /// Proof: `RankedCollective::IdToIndex` (`max_values`: None, `max_size`: Some(54), added: 2529, mode: `MaxEncodedLen`) fn add_member() -> Weight { // Proof Size summary in bytes: // Measured: `142` // Estimated: `3507` - // Minimum execution time: 17_245_000 picoseconds. - Weight::from_parts(17_930_000, 3507) + // Minimum execution time: 15_440_000 picoseconds. + Weight::from_parts(15_990_000, 3507) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(4_u64)) } - /// Storage: RankedCollective Members (r:1 w:1) - /// Proof: RankedCollective Members (max_values: None, max_size: Some(42), added: 2517, mode: MaxEncodedLen) - /// Storage: RankedCollective MemberCount (r:11 w:11) - /// Proof: RankedCollective MemberCount (max_values: None, max_size: Some(14), added: 2489, mode: MaxEncodedLen) - /// Storage: RankedCollective IdToIndex (r:11 w:11) - /// Proof: RankedCollective IdToIndex (max_values: None, max_size: Some(54), added: 2529, mode: MaxEncodedLen) - /// Storage: RankedCollective IndexToId (r:11 w:11) - /// Proof: RankedCollective IndexToId (max_values: None, max_size: Some(54), added: 2529, mode: MaxEncodedLen) + /// Storage: `RankedCollective::Members` (r:1 w:1) + /// Proof: `RankedCollective::Members` (`max_values`: None, `max_size`: Some(42), added: 2517, mode: `MaxEncodedLen`) + /// Storage: `RankedCollective::MemberCount` (r:11 w:11) + /// Proof: `RankedCollective::MemberCount` (`max_values`: None, `max_size`: Some(14), added: 2489, mode: `MaxEncodedLen`) + /// Storage: `RankedCollective::IdToIndex` (r:11 w:22) + /// Proof: `RankedCollective::IdToIndex` (`max_values`: None, `max_size`: Some(54), added: 2529, mode: `MaxEncodedLen`) + /// Storage: `RankedCollective::IndexToId` (r:11 w:22) + /// Proof: `RankedCollective::IndexToId` (`max_values`: None, `max_size`: Some(54), added: 2529, mode: `MaxEncodedLen`) /// The range of component `r` is `[0, 10]`. fn remove_member(r: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `616 + r * (281 ±0)` // Estimated: `3519 + r * (2529 ±0)` - // Minimum execution time: 29_534_000 picoseconds. - Weight::from_parts(32_847_495, 3519) - // Standard Error: 24_211 - .saturating_add(Weight::from_parts(13_949_639, 0).saturating_mul(r.into())) + // Minimum execution time: 30_171_000 picoseconds. + Weight::from_parts(33_395_037, 3519) + // Standard Error: 21_741 + .saturating_add(Weight::from_parts(16_589_950, 0).saturating_mul(r.into())) .saturating_add(RocksDbWeight::get().reads(4_u64)) .saturating_add(RocksDbWeight::get().reads((3_u64).saturating_mul(r.into()))) - .saturating_add(RocksDbWeight::get().writes(4_u64)) - .saturating_add(RocksDbWeight::get().writes((3_u64).saturating_mul(r.into()))) + .saturating_add(RocksDbWeight::get().writes(6_u64)) + .saturating_add(RocksDbWeight::get().writes((5_u64).saturating_mul(r.into()))) .saturating_add(Weight::from_parts(0, 2529).saturating_mul(r.into())) } - /// Storage: RankedCollective Members (r:1 w:1) - /// Proof: RankedCollective Members (max_values: None, max_size: Some(42), added: 2517, mode: MaxEncodedLen) - /// Storage: RankedCollective MemberCount (r:1 w:1) - /// Proof: RankedCollective MemberCount (max_values: None, max_size: Some(14), added: 2489, mode: MaxEncodedLen) - /// Storage: RankedCollective IndexToId (r:0 w:1) - /// Proof: RankedCollective IndexToId (max_values: None, max_size: Some(54), added: 2529, mode: MaxEncodedLen) - /// Storage: RankedCollective IdToIndex (r:0 w:1) - /// Proof: RankedCollective IdToIndex (max_values: None, max_size: Some(54), added: 2529, mode: MaxEncodedLen) + /// Storage: `RankedCollective::Members` (r:1 w:1) + /// Proof: `RankedCollective::Members` (`max_values`: None, `max_size`: Some(42), added: 2517, mode: `MaxEncodedLen`) + /// Storage: `RankedCollective::MemberCount` (r:1 w:1) + /// Proof: `RankedCollective::MemberCount` (`max_values`: None, `max_size`: Some(14), added: 2489, mode: `MaxEncodedLen`) + /// Storage: `RankedCollective::IndexToId` (r:0 w:1) + /// Proof: `RankedCollective::IndexToId` (`max_values`: None, `max_size`: Some(54), added: 2529, mode: `MaxEncodedLen`) + /// Storage: `RankedCollective::IdToIndex` (r:0 w:1) + /// Proof: `RankedCollective::IdToIndex` (`max_values`: None, `max_size`: Some(54), added: 2529, mode: `MaxEncodedLen`) /// The range of component `r` is `[0, 10]`. fn promote_member(r: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `314 + r * (17 ±0)` // Estimated: `3507` - // Minimum execution time: 20_333_000 picoseconds. - Weight::from_parts(21_592_224, 3507) - // Standard Error: 6_423 - .saturating_add(Weight::from_parts(321_314, 0).saturating_mul(r.into())) + // Minimum execution time: 18_597_000 picoseconds. + Weight::from_parts(19_774_947, 3507) + // Standard Error: 5_735 + .saturating_add(Weight::from_parts(339_013, 0).saturating_mul(r.into())) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(4_u64)) } - /// Storage: RankedCollective Members (r:1 w:1) - /// Proof: RankedCollective Members (max_values: None, max_size: Some(42), added: 2517, mode: MaxEncodedLen) - /// Storage: RankedCollective MemberCount (r:1 w:1) - /// Proof: RankedCollective MemberCount (max_values: None, max_size: Some(14), added: 2489, mode: MaxEncodedLen) - /// Storage: RankedCollective IdToIndex (r:1 w:1) - /// Proof: RankedCollective IdToIndex (max_values: None, max_size: Some(54), added: 2529, mode: MaxEncodedLen) - /// Storage: RankedCollective IndexToId (r:1 w:1) - /// Proof: RankedCollective IndexToId (max_values: None, max_size: Some(54), added: 2529, mode: MaxEncodedLen) + /// Storage: `RankedCollective::Members` (r:1 w:1) + /// Proof: `RankedCollective::Members` (`max_values`: None, `max_size`: Some(42), added: 2517, mode: `MaxEncodedLen`) + /// Storage: `RankedCollective::MemberCount` (r:1 w:1) + /// Proof: `RankedCollective::MemberCount` (`max_values`: None, `max_size`: Some(14), added: 2489, mode: `MaxEncodedLen`) + /// Storage: `RankedCollective::IdToIndex` (r:1 w:2) + /// Proof: `RankedCollective::IdToIndex` (`max_values`: None, `max_size`: Some(54), added: 2529, mode: `MaxEncodedLen`) + /// Storage: `RankedCollective::IndexToId` (r:1 w:2) + /// Proof: `RankedCollective::IndexToId` (`max_values`: None, `max_size`: Some(54), added: 2529, mode: `MaxEncodedLen`) /// The range of component `r` is `[0, 10]`. fn demote_member(r: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `632 + r * (72 ±0)` // Estimated: `3519` - // Minimum execution time: 29_446_000 picoseconds. - Weight::from_parts(32_447_715, 3519) - // Standard Error: 28_791 - .saturating_add(Weight::from_parts(822_890, 0).saturating_mul(r.into())) + // Minimum execution time: 29_670_000 picoseconds. + Weight::from_parts(33_022_564, 3519) + // Standard Error: 28_521 + .saturating_add(Weight::from_parts(817_563, 0).saturating_mul(r.into())) .saturating_add(RocksDbWeight::get().reads(4_u64)) - .saturating_add(RocksDbWeight::get().writes(4_u64)) + .saturating_add(RocksDbWeight::get().writes(6_u64)) } - /// Storage: RankedCollective Members (r:1 w:0) - /// Proof: RankedCollective Members (max_values: None, max_size: Some(42), added: 2517, mode: MaxEncodedLen) - /// Storage: RankedPolls ReferendumInfoFor (r:1 w:1) - /// Proof: RankedPolls ReferendumInfoFor (max_values: None, max_size: Some(330), added: 2805, mode: MaxEncodedLen) - /// Storage: RankedCollective Voting (r:1 w:1) - /// Proof: RankedCollective Voting (max_values: None, max_size: Some(65), added: 2540, mode: MaxEncodedLen) - /// Storage: Scheduler Agenda (r:2 w:2) - /// Proof: Scheduler Agenda (max_values: None, max_size: Some(107022), added: 109497, mode: MaxEncodedLen) + /// Storage: `RankedCollective::Members` (r:1 w:0) + /// Proof: `RankedCollective::Members` (`max_values`: None, `max_size`: Some(42), added: 2517, mode: `MaxEncodedLen`) + /// Storage: `RankedPolls::ReferendumInfoFor` (r:1 w:1) + /// Proof: `RankedPolls::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(330), added: 2805, mode: `MaxEncodedLen`) + /// Storage: `RankedCollective::Voting` (r:1 w:1) + /// Proof: `RankedCollective::Voting` (`max_values`: None, `max_size`: Some(65), added: 2540, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Agenda` (r:2 w:2) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Retries` (r:0 w:1) + /// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`) fn vote() -> Weight { // Proof Size summary in bytes: // Measured: `628` // Estimated: `219984` - // Minimum execution time: 45_474_000 picoseconds. - Weight::from_parts(47_228_000, 219984) + // Minimum execution time: 42_072_000 picoseconds. + Weight::from_parts(43_360_000, 219984) .saturating_add(RocksDbWeight::get().reads(5_u64)) - .saturating_add(RocksDbWeight::get().writes(4_u64)) + .saturating_add(RocksDbWeight::get().writes(5_u64)) } - /// Storage: RankedPolls ReferendumInfoFor (r:1 w:0) - /// Proof: RankedPolls ReferendumInfoFor (max_values: None, max_size: Some(330), added: 2805, mode: MaxEncodedLen) - /// Storage: RankedCollective VotingCleanup (r:1 w:0) - /// Proof: RankedCollective VotingCleanup (max_values: None, max_size: Some(114), added: 2589, mode: MaxEncodedLen) - /// Storage: RankedCollective Voting (r:100 w:100) - /// Proof: RankedCollective Voting (max_values: None, max_size: Some(65), added: 2540, mode: MaxEncodedLen) + /// Storage: `RankedPolls::ReferendumInfoFor` (r:1 w:0) + /// Proof: `RankedPolls::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(330), added: 2805, mode: `MaxEncodedLen`) + /// Storage: `RankedCollective::VotingCleanup` (r:1 w:0) + /// Proof: `RankedCollective::VotingCleanup` (`max_values`: None, `max_size`: Some(114), added: 2589, mode: `MaxEncodedLen`) + /// Storage: `RankedCollective::Voting` (r:100 w:100) + /// Proof: `RankedCollective::Voting` (`max_values`: None, `max_size`: Some(65), added: 2540, mode: `MaxEncodedLen`) /// The range of component `n` is `[0, 100]`. fn cleanup_poll(n: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `462 + n * (50 ±0)` // Estimated: `3795 + n * (2540 ±0)` - // Minimum execution time: 13_903_000 picoseconds. - Weight::from_parts(18_209_102, 3795) - // Standard Error: 2_556 - .saturating_add(Weight::from_parts(1_237_454, 0).saturating_mul(n.into())) + // Minimum execution time: 14_338_000 picoseconds. + Weight::from_parts(18_144_424, 3795) + // Standard Error: 2_482 + .saturating_add(Weight::from_parts(1_200_576, 0).saturating_mul(n.into())) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().reads((1_u64).saturating_mul(n.into()))) .saturating_add(RocksDbWeight::get().writes((1_u64).saturating_mul(n.into()))) .saturating_add(Weight::from_parts(0, 2540).saturating_mul(n.into())) } - /// Storage: `RankedCollective::Members` (r:2 w:2) /// Proof: `RankedCollective::Members` (`max_values`: None, `max_size`: Some(42), added: 2517, mode: `MaxEncodedLen`) /// Storage: `RankedCollective::MemberCount` (r:2 w:2) /// Proof: `RankedCollective::MemberCount` (`max_values`: None, `max_size`: Some(14), added: 2489, mode: `MaxEncodedLen`) - /// Storage: `RankedCollective::IdToIndex` (r:2 w:2) + /// Storage: `RankedCollective::IdToIndex` (r:2 w:4) /// Proof: `RankedCollective::IdToIndex` (`max_values`: None, `max_size`: Some(54), added: 2529, mode: `MaxEncodedLen`) + /// Storage: `CoreFellowship::Member` (r:2 w:2) + /// Proof: `CoreFellowship::Member` (`max_values`: None, `max_size`: Some(49), added: 2524, mode: `MaxEncodedLen`) + /// Storage: `CoreFellowship::MemberEvidence` (r:1 w:0) + /// Proof: `CoreFellowship::MemberEvidence` (`max_values`: None, `max_size`: Some(16429), added: 18904, mode: `MaxEncodedLen`) + /// Storage: `Salary::Claimant` (r:2 w:2) + /// Proof: `Salary::Claimant` (`max_values`: None, `max_size`: Some(78), added: 2553, mode: `MaxEncodedLen`) /// Storage: `RankedCollective::IndexToId` (r:0 w:2) /// Proof: `RankedCollective::IndexToId` (`max_values`: None, `max_size`: Some(54), added: 2529, mode: `MaxEncodedLen`) fn exchange_member() -> Weight { // Proof Size summary in bytes: - // Measured: `437` - // Estimated: `6048` - // Minimum execution time: 138_000_000 picoseconds. - Weight::from_parts(141_000_000, 0) - .saturating_add(Weight::from_parts(0, 6048)) - .saturating_add(RocksDbWeight::get().reads(6)) - .saturating_add(RocksDbWeight::get().writes(8)) + // Measured: `625` + // Estimated: `19894` + // Minimum execution time: 73_317_000 picoseconds. + Weight::from_parts(75_103_000, 19894) + .saturating_add(RocksDbWeight::get().reads(11_u64)) + .saturating_add(RocksDbWeight::get().writes(14_u64)) } } diff --git a/substrate/frame/recovery/Cargo.toml b/substrate/frame/recovery/Cargo.toml index 421c799513731d06daf9ae704a940819443405bd..43608de37fc3c08ecb9a266388c2b2b8b07d0255 100644 --- a/substrate/frame/recovery/Cargo.toml +++ b/substrate/frame/recovery/Cargo.toml @@ -17,7 +17,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } frame-benchmarking = { path = "../benchmarking", default-features = false, optional = true } frame-support = { path = "../support", default-features = false } frame-system = { path = "../system", default-features = false } diff --git a/substrate/frame/recovery/src/mock.rs b/substrate/frame/recovery/src/mock.rs index ba7958f7dd460af9c6d7f3831c73d41f363268a2..bec7e02c128bbfc2c9975d881ac5210cd31aa56f 100644 --- a/substrate/frame/recovery/src/mock.rs +++ b/substrate/frame/recovery/src/mock.rs @@ -22,13 +22,9 @@ use super::*; use crate as recovery; use frame_support::{ derive_impl, parameter_types, - traits::{ConstU32, ConstU64, OnFinalize, OnInitialize}, -}; -use sp_core::H256; -use sp_runtime::{ - traits::{BlakeTwo256, IdentityLookup}, - BuildStorage, + traits::{OnFinalize, OnInitialize}, }; +use sp_runtime::BuildStorage; type Block = frame_system::mocking::MockBlock; @@ -41,31 +37,10 @@ frame_support::construct_runtime!( } ); -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { - type BaseCallFilter = frame_support::traits::Everything; - type BlockWeights = (); - type BlockLength = (); - type DbWeight = (); - type RuntimeOrigin = RuntimeOrigin; - type RuntimeCall = RuntimeCall; - type Nonce = u64; - type Hash = H256; - type Hashing = BlakeTwo256; - type AccountId = u64; - type Lookup = IdentityLookup; type Block = Block; - type RuntimeEvent = RuntimeEvent; - type BlockHashCount = ConstU64<250>; - type Version = (); - type PalletInfo = PalletInfo; type AccountData = pallet_balances::AccountData; - type OnNewAccount = (); - type OnKilledAccount = (); - type SystemWeightInfo = (); - type SS58Prefix = (); - type OnSetCode = (); - type MaxConsumers = ConstU32<16>; } parameter_types! { diff --git a/substrate/frame/recovery/src/weights.rs b/substrate/frame/recovery/src/weights.rs index 84b19ae694eec1107b9229c1894646cb8368bc0d..e38ad0461afd6dbf92763460be806b661cc64501 100644 --- a/substrate/frame/recovery/src/weights.rs +++ b/substrate/frame/recovery/src/weights.rs @@ -15,16 +15,16 @@ // See the License for the specific language governing permissions and // limitations under the License. -//! Autogenerated weights for pallet_recovery +//! Autogenerated weights for `pallet_recovery` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-06-16, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-04-09, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-e8ezs4ez-project-145-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("dev"), DB CACHE: 1024 +//! HOSTNAME: `runner-anb7yjbi-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: `1024` // Executed Command: -// ./target/production/substrate +// ./target/production/substrate-node // benchmark // pallet // --chain=dev @@ -35,12 +35,11 @@ // --no-median-slopes // --no-min-squares // --extrinsic=* -// --execution=wasm // --wasm-execution=compiled // --heap-pages=4096 -// --output=./frame/recovery/src/weights.rs -// --header=./HEADER-APACHE2 -// --template=./.maintain/frame-weight-template.hbs +// --output=./substrate/frame/recovery/src/weights.rs +// --header=./substrate/HEADER-APACHE2 +// --template=./substrate/.maintain/frame-weight-template.hbs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -50,7 +49,7 @@ use frame_support::{traits::Get, weights::{Weight, constants::RocksDbWeight}}; use core::marker::PhantomData; -/// Weight functions needed for pallet_recovery. +/// Weight functions needed for `pallet_recovery`. pub trait WeightInfo { fn as_recovered() -> Weight; fn set_recovered() -> Weight; @@ -63,258 +62,266 @@ pub trait WeightInfo { fn cancel_recovered() -> Weight; } -/// Weights for pallet_recovery using the Substrate node and recommended hardware. +/// Weights for `pallet_recovery` using the Substrate node and recommended hardware. pub struct SubstrateWeight(PhantomData); impl WeightInfo for SubstrateWeight { - /// Storage: Recovery Proxy (r:1 w:0) - /// Proof: Recovery Proxy (max_values: None, max_size: Some(80), added: 2555, mode: MaxEncodedLen) + /// Storage: `Recovery::Proxy` (r:1 w:0) + /// Proof: `Recovery::Proxy` (`max_values`: None, `max_size`: Some(80), added: 2555, mode: `MaxEncodedLen`) + /// Storage: `SafeMode::EnteredUntil` (r:1 w:0) + /// Proof: `SafeMode::EnteredUntil` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `TxPause::PausedCalls` (r:1 w:0) + /// Proof: `TxPause::PausedCalls` (`max_values`: None, `max_size`: Some(532), added: 3007, mode: `MaxEncodedLen`) fn as_recovered() -> Weight { // Proof Size summary in bytes: - // Measured: `281` - // Estimated: `3545` - // Minimum execution time: 9_360_000 picoseconds. - Weight::from_parts(9_773_000, 3545) - .saturating_add(T::DbWeight::get().reads(1_u64)) + // Measured: `497` + // Estimated: `3997` + // Minimum execution time: 15_318_000 picoseconds. + Weight::from_parts(15_767_000, 3997) + .saturating_add(T::DbWeight::get().reads(3_u64)) } - /// Storage: Recovery Proxy (r:0 w:1) - /// Proof: Recovery Proxy (max_values: None, max_size: Some(80), added: 2555, mode: MaxEncodedLen) + /// Storage: `Recovery::Proxy` (r:0 w:1) + /// Proof: `Recovery::Proxy` (`max_values`: None, `max_size`: Some(80), added: 2555, mode: `MaxEncodedLen`) fn set_recovered() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 9_146_000 picoseconds. - Weight::from_parts(9_507_000, 0) + // Minimum execution time: 7_153_000 picoseconds. + Weight::from_parts(7_578_000, 0) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: Recovery Recoverable (r:1 w:1) - /// Proof: Recovery Recoverable (max_values: None, max_size: Some(351), added: 2826, mode: MaxEncodedLen) + /// Storage: `Recovery::Recoverable` (r:1 w:1) + /// Proof: `Recovery::Recoverable` (`max_values`: None, `max_size`: Some(351), added: 2826, mode: `MaxEncodedLen`) /// The range of component `n` is `[1, 9]`. fn create_recovery(n: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `175` + // Measured: `246` // Estimated: `3816` - // Minimum execution time: 26_472_000 picoseconds. - Weight::from_parts(27_917_651, 3816) - // Standard Error: 7_129 - .saturating_add(Weight::from_parts(59_239, 0).saturating_mul(n.into())) + // Minimum execution time: 23_303_000 picoseconds. + Weight::from_parts(24_725_158, 3816) + // Standard Error: 5_723 + .saturating_add(Weight::from_parts(13_638, 0).saturating_mul(n.into())) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: Recovery Recoverable (r:1 w:0) - /// Proof: Recovery Recoverable (max_values: None, max_size: Some(351), added: 2826, mode: MaxEncodedLen) - /// Storage: Recovery ActiveRecoveries (r:1 w:1) - /// Proof: Recovery ActiveRecoveries (max_values: None, max_size: Some(389), added: 2864, mode: MaxEncodedLen) + /// Storage: `Recovery::Recoverable` (r:1 w:0) + /// Proof: `Recovery::Recoverable` (`max_values`: None, `max_size`: Some(351), added: 2826, mode: `MaxEncodedLen`) + /// Storage: `Recovery::ActiveRecoveries` (r:1 w:1) + /// Proof: `Recovery::ActiveRecoveries` (`max_values`: None, `max_size`: Some(389), added: 2864, mode: `MaxEncodedLen`) fn initiate_recovery() -> Weight { // Proof Size summary in bytes: - // Measured: `272` + // Measured: `343` // Estimated: `3854` - // Minimum execution time: 29_618_000 picoseconds. - Weight::from_parts(30_192_000, 3854) + // Minimum execution time: 26_914_000 picoseconds. + Weight::from_parts(28_041_000, 3854) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: Recovery Recoverable (r:1 w:0) - /// Proof: Recovery Recoverable (max_values: None, max_size: Some(351), added: 2826, mode: MaxEncodedLen) - /// Storage: Recovery ActiveRecoveries (r:1 w:1) - /// Proof: Recovery ActiveRecoveries (max_values: None, max_size: Some(389), added: 2864, mode: MaxEncodedLen) + /// Storage: `Recovery::Recoverable` (r:1 w:0) + /// Proof: `Recovery::Recoverable` (`max_values`: None, `max_size`: Some(351), added: 2826, mode: `MaxEncodedLen`) + /// Storage: `Recovery::ActiveRecoveries` (r:1 w:1) + /// Proof: `Recovery::ActiveRecoveries` (`max_values`: None, `max_size`: Some(389), added: 2864, mode: `MaxEncodedLen`) /// The range of component `n` is `[1, 9]`. fn vouch_recovery(n: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `360 + n * (64 ±0)` + // Measured: `431 + n * (64 ±0)` // Estimated: `3854` - // Minimum execution time: 19_464_000 picoseconds. - Weight::from_parts(20_642_522, 3854) - // Standard Error: 5_974 - .saturating_add(Weight::from_parts(142_308, 0).saturating_mul(n.into())) + // Minimum execution time: 17_695_000 picoseconds. + Weight::from_parts(18_591_642, 3854) + // Standard Error: 5_582 + .saturating_add(Weight::from_parts(188_668, 0).saturating_mul(n.into())) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: Recovery Recoverable (r:1 w:0) - /// Proof: Recovery Recoverable (max_values: None, max_size: Some(351), added: 2826, mode: MaxEncodedLen) - /// Storage: Recovery ActiveRecoveries (r:1 w:0) - /// Proof: Recovery ActiveRecoveries (max_values: None, max_size: Some(389), added: 2864, mode: MaxEncodedLen) - /// Storage: Recovery Proxy (r:1 w:1) - /// Proof: Recovery Proxy (max_values: None, max_size: Some(80), added: 2555, mode: MaxEncodedLen) + /// Storage: `Recovery::Recoverable` (r:1 w:0) + /// Proof: `Recovery::Recoverable` (`max_values`: None, `max_size`: Some(351), added: 2826, mode: `MaxEncodedLen`) + /// Storage: `Recovery::ActiveRecoveries` (r:1 w:0) + /// Proof: `Recovery::ActiveRecoveries` (`max_values`: None, `max_size`: Some(389), added: 2864, mode: `MaxEncodedLen`) + /// Storage: `Recovery::Proxy` (r:1 w:1) + /// Proof: `Recovery::Proxy` (`max_values`: None, `max_size`: Some(80), added: 2555, mode: `MaxEncodedLen`) /// The range of component `n` is `[1, 9]`. fn claim_recovery(n: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `392 + n * (64 ±0)` + // Measured: `463 + n * (64 ±0)` // Estimated: `3854` - // Minimum execution time: 23_656_000 picoseconds. - Weight::from_parts(24_903_269, 3854) - // Standard Error: 5_771 - .saturating_add(Weight::from_parts(117_343, 0).saturating_mul(n.into())) + // Minimum execution time: 22_580_000 picoseconds. + Weight::from_parts(23_526_020, 3854) + // Standard Error: 6_604 + .saturating_add(Weight::from_parts(134_340, 0).saturating_mul(n.into())) .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: Recovery ActiveRecoveries (r:1 w:1) - /// Proof: Recovery ActiveRecoveries (max_values: None, max_size: Some(389), added: 2864, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: `Recovery::ActiveRecoveries` (r:1 w:1) + /// Proof: `Recovery::ActiveRecoveries` (`max_values`: None, `max_size`: Some(389), added: 2864, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) /// The range of component `n` is `[1, 9]`. fn close_recovery(n: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `513 + n * (32 ±0)` + // Measured: `584 + n * (32 ±0)` // Estimated: `3854` - // Minimum execution time: 34_866_000 picoseconds. - Weight::from_parts(36_368_748, 3854) - // Standard Error: 6_600 - .saturating_add(Weight::from_parts(118_610, 0).saturating_mul(n.into())) + // Minimum execution time: 32_017_000 picoseconds. + Weight::from_parts(33_401_086, 3854) + // Standard Error: 6_498 + .saturating_add(Weight::from_parts(95_507, 0).saturating_mul(n.into())) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } - /// Storage: Recovery ActiveRecoveries (r:1 w:0) - /// Proof: Recovery ActiveRecoveries (max_values: None, max_size: Some(389), added: 2864, mode: MaxEncodedLen) - /// Storage: Recovery Recoverable (r:1 w:1) - /// Proof: Recovery Recoverable (max_values: None, max_size: Some(351), added: 2826, mode: MaxEncodedLen) + /// Storage: `Recovery::ActiveRecoveries` (r:1 w:0) + /// Proof: `Recovery::ActiveRecoveries` (`max_values`: None, `max_size`: Some(389), added: 2864, mode: `MaxEncodedLen`) + /// Storage: `Recovery::Recoverable` (r:1 w:1) + /// Proof: `Recovery::Recoverable` (`max_values`: None, `max_size`: Some(351), added: 2826, mode: `MaxEncodedLen`) /// The range of component `n` is `[1, 9]`. fn remove_recovery(n: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `270 + n * (32 ±0)` + // Measured: `341 + n * (32 ±0)` // Estimated: `3854` - // Minimum execution time: 31_405_000 picoseconds. - Weight::from_parts(32_552_838, 3854) - // Standard Error: 8_043 - .saturating_add(Weight::from_parts(171_605, 0).saturating_mul(n.into())) + // Minimum execution time: 28_641_000 picoseconds. + Weight::from_parts(30_230_511, 3854) + // Standard Error: 7_058 + .saturating_add(Weight::from_parts(61_004, 0).saturating_mul(n.into())) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: Recovery Proxy (r:1 w:1) - /// Proof: Recovery Proxy (max_values: None, max_size: Some(80), added: 2555, mode: MaxEncodedLen) + /// Storage: `Recovery::Proxy` (r:1 w:1) + /// Proof: `Recovery::Proxy` (`max_values`: None, `max_size`: Some(80), added: 2555, mode: `MaxEncodedLen`) fn cancel_recovered() -> Weight { // Proof Size summary in bytes: - // Measured: `281` + // Measured: `352` // Estimated: `3545` - // Minimum execution time: 11_530_000 picoseconds. - Weight::from_parts(11_851_000, 3545) + // Minimum execution time: 11_767_000 picoseconds. + Weight::from_parts(12_275_000, 3545) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } } -// For backwards compatibility and tests +// For backwards compatibility and tests. impl WeightInfo for () { - /// Storage: Recovery Proxy (r:1 w:0) - /// Proof: Recovery Proxy (max_values: None, max_size: Some(80), added: 2555, mode: MaxEncodedLen) + /// Storage: `Recovery::Proxy` (r:1 w:0) + /// Proof: `Recovery::Proxy` (`max_values`: None, `max_size`: Some(80), added: 2555, mode: `MaxEncodedLen`) + /// Storage: `SafeMode::EnteredUntil` (r:1 w:0) + /// Proof: `SafeMode::EnteredUntil` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `TxPause::PausedCalls` (r:1 w:0) + /// Proof: `TxPause::PausedCalls` (`max_values`: None, `max_size`: Some(532), added: 3007, mode: `MaxEncodedLen`) fn as_recovered() -> Weight { // Proof Size summary in bytes: - // Measured: `281` - // Estimated: `3545` - // Minimum execution time: 9_360_000 picoseconds. - Weight::from_parts(9_773_000, 3545) - .saturating_add(RocksDbWeight::get().reads(1_u64)) + // Measured: `497` + // Estimated: `3997` + // Minimum execution time: 15_318_000 picoseconds. + Weight::from_parts(15_767_000, 3997) + .saturating_add(RocksDbWeight::get().reads(3_u64)) } - /// Storage: Recovery Proxy (r:0 w:1) - /// Proof: Recovery Proxy (max_values: None, max_size: Some(80), added: 2555, mode: MaxEncodedLen) + /// Storage: `Recovery::Proxy` (r:0 w:1) + /// Proof: `Recovery::Proxy` (`max_values`: None, `max_size`: Some(80), added: 2555, mode: `MaxEncodedLen`) fn set_recovered() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 9_146_000 picoseconds. - Weight::from_parts(9_507_000, 0) + // Minimum execution time: 7_153_000 picoseconds. + Weight::from_parts(7_578_000, 0) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Recovery Recoverable (r:1 w:1) - /// Proof: Recovery Recoverable (max_values: None, max_size: Some(351), added: 2826, mode: MaxEncodedLen) + /// Storage: `Recovery::Recoverable` (r:1 w:1) + /// Proof: `Recovery::Recoverable` (`max_values`: None, `max_size`: Some(351), added: 2826, mode: `MaxEncodedLen`) /// The range of component `n` is `[1, 9]`. fn create_recovery(n: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `175` + // Measured: `246` // Estimated: `3816` - // Minimum execution time: 26_472_000 picoseconds. - Weight::from_parts(27_917_651, 3816) - // Standard Error: 7_129 - .saturating_add(Weight::from_parts(59_239, 0).saturating_mul(n.into())) + // Minimum execution time: 23_303_000 picoseconds. + Weight::from_parts(24_725_158, 3816) + // Standard Error: 5_723 + .saturating_add(Weight::from_parts(13_638, 0).saturating_mul(n.into())) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Recovery Recoverable (r:1 w:0) - /// Proof: Recovery Recoverable (max_values: None, max_size: Some(351), added: 2826, mode: MaxEncodedLen) - /// Storage: Recovery ActiveRecoveries (r:1 w:1) - /// Proof: Recovery ActiveRecoveries (max_values: None, max_size: Some(389), added: 2864, mode: MaxEncodedLen) + /// Storage: `Recovery::Recoverable` (r:1 w:0) + /// Proof: `Recovery::Recoverable` (`max_values`: None, `max_size`: Some(351), added: 2826, mode: `MaxEncodedLen`) + /// Storage: `Recovery::ActiveRecoveries` (r:1 w:1) + /// Proof: `Recovery::ActiveRecoveries` (`max_values`: None, `max_size`: Some(389), added: 2864, mode: `MaxEncodedLen`) fn initiate_recovery() -> Weight { // Proof Size summary in bytes: - // Measured: `272` + // Measured: `343` // Estimated: `3854` - // Minimum execution time: 29_618_000 picoseconds. - Weight::from_parts(30_192_000, 3854) + // Minimum execution time: 26_914_000 picoseconds. + Weight::from_parts(28_041_000, 3854) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Recovery Recoverable (r:1 w:0) - /// Proof: Recovery Recoverable (max_values: None, max_size: Some(351), added: 2826, mode: MaxEncodedLen) - /// Storage: Recovery ActiveRecoveries (r:1 w:1) - /// Proof: Recovery ActiveRecoveries (max_values: None, max_size: Some(389), added: 2864, mode: MaxEncodedLen) + /// Storage: `Recovery::Recoverable` (r:1 w:0) + /// Proof: `Recovery::Recoverable` (`max_values`: None, `max_size`: Some(351), added: 2826, mode: `MaxEncodedLen`) + /// Storage: `Recovery::ActiveRecoveries` (r:1 w:1) + /// Proof: `Recovery::ActiveRecoveries` (`max_values`: None, `max_size`: Some(389), added: 2864, mode: `MaxEncodedLen`) /// The range of component `n` is `[1, 9]`. fn vouch_recovery(n: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `360 + n * (64 ±0)` + // Measured: `431 + n * (64 ±0)` // Estimated: `3854` - // Minimum execution time: 19_464_000 picoseconds. - Weight::from_parts(20_642_522, 3854) - // Standard Error: 5_974 - .saturating_add(Weight::from_parts(142_308, 0).saturating_mul(n.into())) + // Minimum execution time: 17_695_000 picoseconds. + Weight::from_parts(18_591_642, 3854) + // Standard Error: 5_582 + .saturating_add(Weight::from_parts(188_668, 0).saturating_mul(n.into())) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Recovery Recoverable (r:1 w:0) - /// Proof: Recovery Recoverable (max_values: None, max_size: Some(351), added: 2826, mode: MaxEncodedLen) - /// Storage: Recovery ActiveRecoveries (r:1 w:0) - /// Proof: Recovery ActiveRecoveries (max_values: None, max_size: Some(389), added: 2864, mode: MaxEncodedLen) - /// Storage: Recovery Proxy (r:1 w:1) - /// Proof: Recovery Proxy (max_values: None, max_size: Some(80), added: 2555, mode: MaxEncodedLen) + /// Storage: `Recovery::Recoverable` (r:1 w:0) + /// Proof: `Recovery::Recoverable` (`max_values`: None, `max_size`: Some(351), added: 2826, mode: `MaxEncodedLen`) + /// Storage: `Recovery::ActiveRecoveries` (r:1 w:0) + /// Proof: `Recovery::ActiveRecoveries` (`max_values`: None, `max_size`: Some(389), added: 2864, mode: `MaxEncodedLen`) + /// Storage: `Recovery::Proxy` (r:1 w:1) + /// Proof: `Recovery::Proxy` (`max_values`: None, `max_size`: Some(80), added: 2555, mode: `MaxEncodedLen`) /// The range of component `n` is `[1, 9]`. fn claim_recovery(n: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `392 + n * (64 ±0)` + // Measured: `463 + n * (64 ±0)` // Estimated: `3854` - // Minimum execution time: 23_656_000 picoseconds. - Weight::from_parts(24_903_269, 3854) - // Standard Error: 5_771 - .saturating_add(Weight::from_parts(117_343, 0).saturating_mul(n.into())) + // Minimum execution time: 22_580_000 picoseconds. + Weight::from_parts(23_526_020, 3854) + // Standard Error: 6_604 + .saturating_add(Weight::from_parts(134_340, 0).saturating_mul(n.into())) .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Recovery ActiveRecoveries (r:1 w:1) - /// Proof: Recovery ActiveRecoveries (max_values: None, max_size: Some(389), added: 2864, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: `Recovery::ActiveRecoveries` (r:1 w:1) + /// Proof: `Recovery::ActiveRecoveries` (`max_values`: None, `max_size`: Some(389), added: 2864, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) /// The range of component `n` is `[1, 9]`. fn close_recovery(n: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `513 + n * (32 ±0)` + // Measured: `584 + n * (32 ±0)` // Estimated: `3854` - // Minimum execution time: 34_866_000 picoseconds. - Weight::from_parts(36_368_748, 3854) - // Standard Error: 6_600 - .saturating_add(Weight::from_parts(118_610, 0).saturating_mul(n.into())) + // Minimum execution time: 32_017_000 picoseconds. + Weight::from_parts(33_401_086, 3854) + // Standard Error: 6_498 + .saturating_add(Weight::from_parts(95_507, 0).saturating_mul(n.into())) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } - /// Storage: Recovery ActiveRecoveries (r:1 w:0) - /// Proof: Recovery ActiveRecoveries (max_values: None, max_size: Some(389), added: 2864, mode: MaxEncodedLen) - /// Storage: Recovery Recoverable (r:1 w:1) - /// Proof: Recovery Recoverable (max_values: None, max_size: Some(351), added: 2826, mode: MaxEncodedLen) + /// Storage: `Recovery::ActiveRecoveries` (r:1 w:0) + /// Proof: `Recovery::ActiveRecoveries` (`max_values`: None, `max_size`: Some(389), added: 2864, mode: `MaxEncodedLen`) + /// Storage: `Recovery::Recoverable` (r:1 w:1) + /// Proof: `Recovery::Recoverable` (`max_values`: None, `max_size`: Some(351), added: 2826, mode: `MaxEncodedLen`) /// The range of component `n` is `[1, 9]`. fn remove_recovery(n: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `270 + n * (32 ±0)` + // Measured: `341 + n * (32 ±0)` // Estimated: `3854` - // Minimum execution time: 31_405_000 picoseconds. - Weight::from_parts(32_552_838, 3854) - // Standard Error: 8_043 - .saturating_add(Weight::from_parts(171_605, 0).saturating_mul(n.into())) + // Minimum execution time: 28_641_000 picoseconds. + Weight::from_parts(30_230_511, 3854) + // Standard Error: 7_058 + .saturating_add(Weight::from_parts(61_004, 0).saturating_mul(n.into())) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Recovery Proxy (r:1 w:1) - /// Proof: Recovery Proxy (max_values: None, max_size: Some(80), added: 2555, mode: MaxEncodedLen) + /// Storage: `Recovery::Proxy` (r:1 w:1) + /// Proof: `Recovery::Proxy` (`max_values`: None, `max_size`: Some(80), added: 2555, mode: `MaxEncodedLen`) fn cancel_recovered() -> Weight { // Proof Size summary in bytes: - // Measured: `281` + // Measured: `352` // Estimated: `3545` - // Minimum execution time: 11_530_000 picoseconds. - Weight::from_parts(11_851_000, 3545) + // Minimum execution time: 11_767_000 picoseconds. + Weight::from_parts(12_275_000, 3545) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } diff --git a/substrate/frame/referenda/Cargo.toml b/substrate/frame/referenda/Cargo.toml index 0f8a92ff72a6ebb7094e6dca9634f853346f2e6c..f4e0171443aa5181e13866edf07a98e6d1b0bf8e 100644 --- a/substrate/frame/referenda/Cargo.toml +++ b/substrate/frame/referenda/Cargo.toml @@ -20,8 +20,8 @@ assert_matches = { version = "1.5", optional = true } codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = [ "derive", ] } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.195", features = ["derive"], optional = true } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +serde = { features = ["derive"], optional = true, workspace = true, default-features = true } sp-arithmetic = { path = "../../primitives/arithmetic", default-features = false } frame-benchmarking = { path = "../benchmarking", default-features = false, optional = true } frame-support = { path = "../support", default-features = false } @@ -29,7 +29,7 @@ frame-system = { path = "../system", default-features = false } sp-io = { path = "../../primitives/io", default-features = false } sp-runtime = { path = "../../primitives/runtime", default-features = false } sp-std = { path = "../../primitives/std", default-features = false } -log = { version = "0.4.17", default-features = false } +log = { workspace = true } [dev-dependencies] assert_matches = { version = "1.5" } diff --git a/substrate/frame/referenda/src/lib.rs b/substrate/frame/referenda/src/lib.rs index 8912f9ad217371846fc193f495ff1e49b0d18f00..fbe27e1a4784733f517bb6ee3259ebdc4b1075b3 100644 --- a/substrate/frame/referenda/src/lib.rs +++ b/substrate/frame/referenda/src/lib.rs @@ -143,7 +143,7 @@ pub mod pallet { use frame_support::{pallet_prelude::*, traits::EnsureOriginWithArg}; use frame_system::pallet_prelude::*; - /// The current storage version. + /// The in-code storage version. const STORAGE_VERSION: StorageVersion = StorageVersion::new(1); #[pallet::pallet] @@ -424,6 +424,8 @@ pub mod pallet { BadStatus, /// The preimage does not exist. PreimageNotExist, + /// The preimage is stored with a different length than the one provided. + PreimageStoredWithDifferentLength, } #[pallet::hooks] @@ -433,6 +435,11 @@ pub mod pallet { Self::do_try_state()?; Ok(()) } + + #[cfg(any(feature = "std", test))] + fn integrity_test() { + T::Tracks::check_integrity().expect("Static tracks configuration is valid."); + } } #[pallet::call] @@ -457,6 +464,16 @@ pub mod pallet { let proposal_origin = *proposal_origin; let who = T::SubmitOrigin::ensure_origin(origin, &proposal_origin)?; + // If the pre-image is already stored, ensure that it has the same length as given in + // `proposal`. + if let (Some(preimage_len), Some(proposal_len)) = + (proposal.lookup_hash().and_then(|h| T::Preimages::len(&h)), proposal.lookup_len()) + { + if preimage_len != proposal_len { + return Err(Error::::PreimageStoredWithDifferentLength.into()) + } + } + let track = T::Tracks::track_for(&proposal_origin).map_err(|_| Error::::NoTrack)?; let submission_deposit = Self::take_deposit(who, T::SubmissionDeposit::get())?; diff --git a/substrate/frame/referenda/src/migration.rs b/substrate/frame/referenda/src/migration.rs index a80897242eec67aad194f8deaf1cd6527533eab9..631eb7340e567e8115e1755d513980fb148700c5 100644 --- a/substrate/frame/referenda/src/migration.rs +++ b/substrate/frame/referenda/src/migration.rs @@ -109,16 +109,16 @@ pub mod v1 { } fn on_runtime_upgrade() -> Weight { - let current_version = Pallet::::current_storage_version(); - let onchain_version = Pallet::::on_chain_storage_version(); + let in_code_version = Pallet::::in_code_storage_version(); + let on_chain_version = Pallet::::on_chain_storage_version(); let mut weight = T::DbWeight::get().reads(1); log::info!( target: TARGET, - "running migration with current storage version {:?} / onchain {:?}.", - current_version, - onchain_version + "running migration with in-code storage version {:?} / onchain {:?}.", + in_code_version, + on_chain_version ); - if onchain_version != 0 { + if on_chain_version != 0 { log::warn!(target: TARGET, "skipping migration from v0 to v1."); return weight } @@ -149,8 +149,8 @@ pub mod v1 { #[cfg(feature = "try-runtime")] fn post_upgrade(state: Vec) -> Result<(), TryRuntimeError> { - let onchain_version = Pallet::::on_chain_storage_version(); - ensure!(onchain_version == 1, "must upgrade from version 0 to 1."); + let on_chain_version = Pallet::::on_chain_storage_version(); + ensure!(on_chain_version == 1, "must upgrade from version 0 to 1."); let pre_referendum_count: u32 = Decode::decode(&mut &state[..]) .expect("failed to decode the state from pre-upgrade."); let post_referendum_count = ReferendumInfoFor::::iter().count() as u32; diff --git a/substrate/frame/referenda/src/mock.rs b/substrate/frame/referenda/src/mock.rs index d9f9042fefc9fd9104feea2637224ad496b04590..135476d7cb1373ea1e7d3164e9df9d5b9dfc36ee 100644 --- a/substrate/frame/referenda/src/mock.rs +++ b/substrate/frame/referenda/src/mock.rs @@ -29,9 +29,8 @@ use frame_support::{ weights::Weight, }; use frame_system::{EnsureRoot, EnsureSignedBy}; -use sp_core::H256; use sp_runtime::{ - traits::{BlakeTwo256, Hash, IdentityLookup}, + traits::{BlakeTwo256, Hash}, BuildStorage, DispatchResult, Perbill, }; @@ -59,31 +58,11 @@ impl Contains for BaseFilter { parameter_types! { pub MaxWeight: Weight = Weight::from_parts(2_000_000_000_000, u64::MAX); } -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { type BaseCallFilter = BaseFilter; - type BlockWeights = (); - type BlockLength = (); - type DbWeight = (); - type RuntimeOrigin = RuntimeOrigin; - type Nonce = u64; - type RuntimeCall = RuntimeCall; - type Hash = H256; - type Hashing = BlakeTwo256; - type AccountId = u64; - type Lookup = IdentityLookup; type Block = Block; - type RuntimeEvent = RuntimeEvent; - type BlockHashCount = ConstU64<250>; - type Version = (); - type PalletInfo = PalletInfo; type AccountData = pallet_balances::AccountData; - type OnNewAccount = (); - type OnKilledAccount = (); - type SystemWeightInfo = (); - type SS58Prefix = (); - type OnSetCode = (); - type MaxConsumers = ConstU32<16>; } impl pallet_preimage::Config for Test { type RuntimeEvent = RuntimeEvent; diff --git a/substrate/frame/referenda/src/tests.rs b/substrate/frame/referenda/src/tests.rs index 8f51136de0bfdb48df1a43e47dd0de63f7a0e21d..52251fcbdbeed0ec5b8830e87a2a4c66bb265e39 100644 --- a/substrate/frame/referenda/src/tests.rs +++ b/substrate/frame/referenda/src/tests.rs @@ -666,3 +666,19 @@ fn clear_metadata_works() { })); }); } + +#[test] +fn detects_incorrect_len() { + ExtBuilder::default().build_and_execute(|| { + let hash = note_preimage(1); + assert_noop!( + Referenda::submit( + RuntimeOrigin::signed(1), + Box::new(RawOrigin::Root.into()), + frame_support::traits::Bounded::Lookup { hash, len: 3 }, + DispatchTime::At(1), + ), + Error::::PreimageStoredWithDifferentLength + ); + }); +} diff --git a/substrate/frame/referenda/src/types.rs b/substrate/frame/referenda/src/types.rs index 8d6a13ef27c981b3996425b18062e2ef04a2f68b..b3c583322cce384bae7e2a9340071d5af6b2f455 100644 --- a/substrate/frame/referenda/src/types.rs +++ b/substrate/frame/referenda/src/types.rs @@ -19,6 +19,7 @@ use super::*; use codec::{Decode, Encode, EncodeLike, MaxEncodedLen}; +use core::fmt::Debug; use frame_support::{ traits::{schedule::v3::Anon, Bounded}, Parameter, @@ -26,7 +27,6 @@ use frame_support::{ use scale_info::TypeInfo; use sp_arithmetic::{Rounding::*, SignedRounding::*}; use sp_runtime::{FixedI64, PerThing, RuntimeDebug}; -use sp_std::fmt::Debug; pub type BalanceOf = <>::Currency as Currency<::AccountId>>::Balance; @@ -144,7 +144,10 @@ pub trait TracksInfo { /// The origin type from which a track is implied. type RuntimeOrigin; - /// Return the array of known tracks and their information. + /// Sorted array of known tracks and their information. + /// + /// The array MUST be sorted by `Id`. Consumers of this trait are advised to assert + /// [`Self::check_integrity`] prior to any use. fn tracks() -> &'static [(Self::Id, TrackInfo)]; /// Determine the voting track for the given `origin`. @@ -152,7 +155,23 @@ pub trait TracksInfo { /// Return the track info for track `id`, by default this just looks it up in `Self::tracks()`. fn info(id: Self::Id) -> Option<&'static TrackInfo> { - Self::tracks().iter().find(|x| x.0 == id).map(|x| &x.1) + let tracks = Self::tracks(); + let maybe_index = tracks.binary_search_by_key(&id, |t| t.0).ok()?; + + tracks.get(maybe_index).map(|(_, info)| info) + } + + /// Check assumptions about the static data that this trait provides. + fn check_integrity() -> Result<(), &'static str> + where + Balance: 'static, + Moment: 'static, + { + if Self::tracks().windows(2).all(|w| w[0].0 < w[1].0) { + Ok(()) + } else { + Err("The tracks that were returned by `tracks` were not sorted by `Id`") + } } } @@ -670,4 +689,72 @@ mod tests { assert_eq!(c.delay(pc(30).less_epsilon()), pc(100)); assert_eq!(c.delay(pc(0)), pc(100)); } + + #[test] + fn tracks_integrity_check_detects_unsorted() { + use crate::mock::RuntimeOrigin; + + pub struct BadTracksInfo; + impl TracksInfo for BadTracksInfo { + type Id = u8; + type RuntimeOrigin = ::PalletsOrigin; + fn tracks() -> &'static [(Self::Id, TrackInfo)] { + static DATA: [(u8, TrackInfo); 2] = [ + ( + 1u8, + TrackInfo { + name: "root", + max_deciding: 1, + decision_deposit: 10, + prepare_period: 4, + decision_period: 4, + confirm_period: 2, + min_enactment_period: 4, + min_approval: Curve::LinearDecreasing { + length: Perbill::from_percent(100), + floor: Perbill::from_percent(50), + ceil: Perbill::from_percent(100), + }, + min_support: Curve::LinearDecreasing { + length: Perbill::from_percent(100), + floor: Perbill::from_percent(0), + ceil: Perbill::from_percent(100), + }, + }, + ), + ( + 0u8, + TrackInfo { + name: "none", + max_deciding: 3, + decision_deposit: 1, + prepare_period: 2, + decision_period: 2, + confirm_period: 1, + min_enactment_period: 2, + min_approval: Curve::LinearDecreasing { + length: Perbill::from_percent(100), + floor: Perbill::from_percent(95), + ceil: Perbill::from_percent(100), + }, + min_support: Curve::LinearDecreasing { + length: Perbill::from_percent(100), + floor: Perbill::from_percent(90), + ceil: Perbill::from_percent(100), + }, + }, + ), + ]; + &DATA[..] + } + fn track_for(_: &Self::RuntimeOrigin) -> Result { + unimplemented!() + } + } + + assert_eq!( + BadTracksInfo::check_integrity(), + Err("The tracks that were returned by `tracks` were not sorted by `Id`") + ); + } } diff --git a/substrate/frame/referenda/src/weights.rs b/substrate/frame/referenda/src/weights.rs index 4b89379b311da6ac8cd10fd84a127e3693ab00de..b34758ee466764843210a673fa70aee0fe348d34 100644 --- a/substrate/frame/referenda/src/weights.rs +++ b/substrate/frame/referenda/src/weights.rs @@ -15,16 +15,16 @@ // See the License for the specific language governing permissions and // limitations under the License. -//! Autogenerated weights for pallet_referenda +//! Autogenerated weights for `pallet_referenda` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-06-16, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-04-09, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-e8ezs4ez-project-145-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("dev"), DB CACHE: 1024 +//! HOSTNAME: `runner-anb7yjbi-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: `1024` // Executed Command: -// ./target/production/substrate +// ./target/production/substrate-node // benchmark // pallet // --chain=dev @@ -35,12 +35,11 @@ // --no-median-slopes // --no-min-squares // --extrinsic=* -// --execution=wasm // --wasm-execution=compiled // --heap-pages=4096 -// --output=./frame/referenda/src/weights.rs -// --header=./HEADER-APACHE2 -// --template=./.maintain/frame-weight-template.hbs +// --output=./substrate/frame/referenda/src/weights.rs +// --header=./substrate/HEADER-APACHE2 +// --template=./substrate/.maintain/frame-weight-template.hbs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -50,7 +49,7 @@ use frame_support::{traits::Get, weights::{Weight, constants::RocksDbWeight}}; use core::marker::PhantomData; -/// Weight functions needed for pallet_referenda. +/// Weight functions needed for `pallet_referenda`. pub trait WeightInfo { fn submit() -> Weight; fn place_decision_deposit_preparing() -> Weight; @@ -84,842 +83,874 @@ pub trait WeightInfo { fn clear_metadata() -> Weight; } -/// Weights for pallet_referenda using the Substrate node and recommended hardware. +/// Weights for `pallet_referenda` using the Substrate node and recommended hardware. pub struct SubstrateWeight(PhantomData); impl WeightInfo for SubstrateWeight { - /// Storage: Referenda ReferendumCount (r:1 w:1) - /// Proof: Referenda ReferendumCount (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: Scheduler Agenda (r:1 w:1) - /// Proof: Scheduler Agenda (max_values: None, max_size: Some(107022), added: 109497, mode: MaxEncodedLen) - /// Storage: Referenda ReferendumInfoFor (r:0 w:1) - /// Proof: Referenda ReferendumInfoFor (max_values: None, max_size: Some(366), added: 2841, mode: MaxEncodedLen) + /// Storage: `Referenda::ReferendumCount` (r:1 w:1) + /// Proof: `Referenda::ReferendumCount` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Agenda` (r:1 w:1) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`) + /// Storage: `Referenda::ReferendumInfoFor` (r:0 w:1) + /// Proof: `Referenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(366), added: 2841, mode: `MaxEncodedLen`) fn submit() -> Weight { // Proof Size summary in bytes: - // Measured: `220` + // Measured: `286` // Estimated: `110487` - // Minimum execution time: 40_175_000 picoseconds. - Weight::from_parts(41_107_000, 110487) + // Minimum execution time: 33_162_000 picoseconds. + Weight::from_parts(34_217_000, 110487) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(3_u64)) } - /// Storage: Referenda ReferendumInfoFor (r:1 w:1) - /// Proof: Referenda ReferendumInfoFor (max_values: None, max_size: Some(366), added: 2841, mode: MaxEncodedLen) - /// Storage: Scheduler Agenda (r:2 w:2) - /// Proof: Scheduler Agenda (max_values: None, max_size: Some(107022), added: 109497, mode: MaxEncodedLen) + /// Storage: `Referenda::ReferendumInfoFor` (r:1 w:1) + /// Proof: `Referenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(366), added: 2841, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Agenda` (r:2 w:2) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Retries` (r:0 w:1) + /// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`) fn place_decision_deposit_preparing() -> Weight { // Proof Size summary in bytes: - // Measured: `473` + // Measured: `539` // Estimated: `219984` - // Minimum execution time: 50_922_000 picoseconds. - Weight::from_parts(52_179_000, 219984) + // Minimum execution time: 45_276_000 picoseconds. + Weight::from_parts(46_903_000, 219984) .saturating_add(T::DbWeight::get().reads(3_u64)) - .saturating_add(T::DbWeight::get().writes(3_u64)) + .saturating_add(T::DbWeight::get().writes(4_u64)) } - /// Storage: Referenda ReferendumInfoFor (r:1 w:1) - /// Proof: Referenda ReferendumInfoFor (max_values: None, max_size: Some(366), added: 2841, mode: MaxEncodedLen) - /// Storage: Referenda DecidingCount (r:1 w:0) - /// Proof: Referenda DecidingCount (max_values: None, max_size: Some(14), added: 2489, mode: MaxEncodedLen) - /// Storage: Referenda TrackQueue (r:1 w:1) - /// Proof: Referenda TrackQueue (max_values: None, max_size: Some(2012), added: 4487, mode: MaxEncodedLen) - /// Storage: Scheduler Agenda (r:1 w:1) - /// Proof: Scheduler Agenda (max_values: None, max_size: Some(107022), added: 109497, mode: MaxEncodedLen) + /// Storage: `Referenda::ReferendumInfoFor` (r:1 w:1) + /// Proof: `Referenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(366), added: 2841, mode: `MaxEncodedLen`) + /// Storage: `Referenda::DecidingCount` (r:1 w:0) + /// Proof: `Referenda::DecidingCount` (`max_values`: None, `max_size`: Some(14), added: 2489, mode: `MaxEncodedLen`) + /// Storage: `Referenda::TrackQueue` (r:1 w:1) + /// Proof: `Referenda::TrackQueue` (`max_values`: None, `max_size`: Some(2012), added: 4487, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Agenda` (r:1 w:1) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Retries` (r:0 w:1) + /// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`) fn place_decision_deposit_queued() -> Weight { // Proof Size summary in bytes: - // Measured: `3260` + // Measured: `3326` // Estimated: `110487` - // Minimum execution time: 69_559_000 picoseconds. - Weight::from_parts(72_143_000, 110487) + // Minimum execution time: 63_832_000 picoseconds. + Weight::from_parts(65_616_000, 110487) .saturating_add(T::DbWeight::get().reads(4_u64)) - .saturating_add(T::DbWeight::get().writes(3_u64)) + .saturating_add(T::DbWeight::get().writes(4_u64)) } - /// Storage: Referenda ReferendumInfoFor (r:1 w:1) - /// Proof: Referenda ReferendumInfoFor (max_values: None, max_size: Some(366), added: 2841, mode: MaxEncodedLen) - /// Storage: Referenda DecidingCount (r:1 w:0) - /// Proof: Referenda DecidingCount (max_values: None, max_size: Some(14), added: 2489, mode: MaxEncodedLen) - /// Storage: Referenda TrackQueue (r:1 w:1) - /// Proof: Referenda TrackQueue (max_values: None, max_size: Some(2012), added: 4487, mode: MaxEncodedLen) - /// Storage: Scheduler Agenda (r:1 w:1) - /// Proof: Scheduler Agenda (max_values: None, max_size: Some(107022), added: 109497, mode: MaxEncodedLen) + /// Storage: `Referenda::ReferendumInfoFor` (r:1 w:1) + /// Proof: `Referenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(366), added: 2841, mode: `MaxEncodedLen`) + /// Storage: `Referenda::DecidingCount` (r:1 w:0) + /// Proof: `Referenda::DecidingCount` (`max_values`: None, `max_size`: Some(14), added: 2489, mode: `MaxEncodedLen`) + /// Storage: `Referenda::TrackQueue` (r:1 w:1) + /// Proof: `Referenda::TrackQueue` (`max_values`: None, `max_size`: Some(2012), added: 4487, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Agenda` (r:1 w:1) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Retries` (r:0 w:1) + /// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`) fn place_decision_deposit_not_queued() -> Weight { // Proof Size summary in bytes: - // Measured: `3280` + // Measured: `3346` // Estimated: `110487` - // Minimum execution time: 68_833_000 picoseconds. - Weight::from_parts(70_987_000, 110487) + // Minimum execution time: 63_726_000 picoseconds. + Weight::from_parts(64_909_000, 110487) .saturating_add(T::DbWeight::get().reads(4_u64)) - .saturating_add(T::DbWeight::get().writes(3_u64)) + .saturating_add(T::DbWeight::get().writes(4_u64)) } - /// Storage: Referenda ReferendumInfoFor (r:1 w:1) - /// Proof: Referenda ReferendumInfoFor (max_values: None, max_size: Some(366), added: 2841, mode: MaxEncodedLen) - /// Storage: Referenda DecidingCount (r:1 w:1) - /// Proof: Referenda DecidingCount (max_values: None, max_size: Some(14), added: 2489, mode: MaxEncodedLen) - /// Storage: Scheduler Agenda (r:2 w:2) - /// Proof: Scheduler Agenda (max_values: None, max_size: Some(107022), added: 109497, mode: MaxEncodedLen) + /// Storage: `Referenda::ReferendumInfoFor` (r:1 w:1) + /// Proof: `Referenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(366), added: 2841, mode: `MaxEncodedLen`) + /// Storage: `Referenda::DecidingCount` (r:1 w:1) + /// Proof: `Referenda::DecidingCount` (`max_values`: None, `max_size`: Some(14), added: 2489, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Agenda` (r:2 w:2) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Retries` (r:0 w:1) + /// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`) fn place_decision_deposit_passing() -> Weight { // Proof Size summary in bytes: - // Measured: `473` + // Measured: `539` // Estimated: `219984` - // Minimum execution time: 61_794_000 picoseconds. - Weight::from_parts(62_846_000, 219984) + // Minimum execution time: 53_001_000 picoseconds. + Weight::from_parts(54_489_000, 219984) .saturating_add(T::DbWeight::get().reads(4_u64)) - .saturating_add(T::DbWeight::get().writes(4_u64)) - } - /// Storage: Referenda ReferendumInfoFor (r:1 w:1) - /// Proof: Referenda ReferendumInfoFor (max_values: None, max_size: Some(366), added: 2841, mode: MaxEncodedLen) - /// Storage: Referenda DecidingCount (r:1 w:1) - /// Proof: Referenda DecidingCount (max_values: None, max_size: Some(14), added: 2489, mode: MaxEncodedLen) - /// Storage: Scheduler Agenda (r:2 w:2) - /// Proof: Scheduler Agenda (max_values: None, max_size: Some(107022), added: 109497, mode: MaxEncodedLen) + .saturating_add(T::DbWeight::get().writes(5_u64)) + } + /// Storage: `Referenda::ReferendumInfoFor` (r:1 w:1) + /// Proof: `Referenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(366), added: 2841, mode: `MaxEncodedLen`) + /// Storage: `Referenda::DecidingCount` (r:1 w:1) + /// Proof: `Referenda::DecidingCount` (`max_values`: None, `max_size`: Some(14), added: 2489, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Agenda` (r:2 w:2) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Retries` (r:0 w:1) + /// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`) fn place_decision_deposit_failing() -> Weight { // Proof Size summary in bytes: - // Measured: `473` + // Measured: `539` // Estimated: `219984` - // Minimum execution time: 58_664_000 picoseconds. - Weight::from_parts(60_195_000, 219984) + // Minimum execution time: 51_021_000 picoseconds. + Weight::from_parts(53_006_000, 219984) .saturating_add(T::DbWeight::get().reads(4_u64)) - .saturating_add(T::DbWeight::get().writes(4_u64)) + .saturating_add(T::DbWeight::get().writes(5_u64)) } - /// Storage: Referenda ReferendumInfoFor (r:1 w:1) - /// Proof: Referenda ReferendumInfoFor (max_values: None, max_size: Some(366), added: 2841, mode: MaxEncodedLen) + /// Storage: `Referenda::ReferendumInfoFor` (r:1 w:1) + /// Proof: `Referenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(366), added: 2841, mode: `MaxEncodedLen`) fn refund_decision_deposit() -> Weight { // Proof Size summary in bytes: - // Measured: `351` + // Measured: `417` // Estimated: `3831` - // Minimum execution time: 30_850_000 picoseconds. - Weight::from_parts(32_130_000, 3831) + // Minimum execution time: 26_572_000 picoseconds. + Weight::from_parts(27_534_000, 3831) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: Referenda ReferendumInfoFor (r:1 w:1) - /// Proof: Referenda ReferendumInfoFor (max_values: None, max_size: Some(366), added: 2841, mode: MaxEncodedLen) + /// Storage: `Referenda::ReferendumInfoFor` (r:1 w:1) + /// Proof: `Referenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(366), added: 2841, mode: `MaxEncodedLen`) fn refund_submission_deposit() -> Weight { // Proof Size summary in bytes: - // Measured: `341` + // Measured: `407` // Estimated: `3831` - // Minimum execution time: 30_747_000 picoseconds. - Weight::from_parts(32_196_000, 3831) + // Minimum execution time: 26_897_000 picoseconds. + Weight::from_parts(27_883_000, 3831) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: Referenda ReferendumInfoFor (r:1 w:1) - /// Proof: Referenda ReferendumInfoFor (max_values: None, max_size: Some(366), added: 2841, mode: MaxEncodedLen) - /// Storage: Scheduler Agenda (r:2 w:2) - /// Proof: Scheduler Agenda (max_values: None, max_size: Some(107022), added: 109497, mode: MaxEncodedLen) + /// Storage: `Referenda::ReferendumInfoFor` (r:1 w:1) + /// Proof: `Referenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(366), added: 2841, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Agenda` (r:2 w:2) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Retries` (r:0 w:1) + /// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`) fn cancel() -> Weight { // Proof Size summary in bytes: - // Measured: `381` + // Measured: `447` // Estimated: `219984` - // Minimum execution time: 36_139_000 picoseconds. - Weight::from_parts(37_252_000, 219984) + // Minimum execution time: 31_767_000 picoseconds. + Weight::from_parts(33_045_000, 219984) .saturating_add(T::DbWeight::get().reads(3_u64)) - .saturating_add(T::DbWeight::get().writes(3_u64)) + .saturating_add(T::DbWeight::get().writes(4_u64)) } - /// Storage: Referenda ReferendumInfoFor (r:1 w:1) - /// Proof: Referenda ReferendumInfoFor (max_values: None, max_size: Some(366), added: 2841, mode: MaxEncodedLen) - /// Storage: Scheduler Agenda (r:2 w:2) - /// Proof: Scheduler Agenda (max_values: None, max_size: Some(107022), added: 109497, mode: MaxEncodedLen) - /// Storage: Referenda MetadataOf (r:1 w:0) - /// Proof: Referenda MetadataOf (max_values: None, max_size: Some(52), added: 2527, mode: MaxEncodedLen) + /// Storage: `Referenda::ReferendumInfoFor` (r:1 w:1) + /// Proof: `Referenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(366), added: 2841, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Agenda` (r:2 w:2) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`) + /// Storage: `Referenda::MetadataOf` (r:1 w:0) + /// Proof: `Referenda::MetadataOf` (`max_values`: None, `max_size`: Some(52), added: 2527, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Retries` (r:0 w:1) + /// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`) fn kill() -> Weight { // Proof Size summary in bytes: - // Measured: `622` + // Measured: `688` // Estimated: `219984` - // Minimum execution time: 80_862_000 picoseconds. - Weight::from_parts(83_045_000, 219984) + // Minimum execution time: 67_798_000 picoseconds. + Weight::from_parts(70_044_000, 219984) .saturating_add(T::DbWeight::get().reads(4_u64)) - .saturating_add(T::DbWeight::get().writes(3_u64)) + .saturating_add(T::DbWeight::get().writes(4_u64)) } - /// Storage: Referenda TrackQueue (r:1 w:0) - /// Proof: Referenda TrackQueue (max_values: None, max_size: Some(2012), added: 4487, mode: MaxEncodedLen) - /// Storage: Referenda DecidingCount (r:1 w:1) - /// Proof: Referenda DecidingCount (max_values: None, max_size: Some(14), added: 2489, mode: MaxEncodedLen) + /// Storage: `Referenda::TrackQueue` (r:1 w:0) + /// Proof: `Referenda::TrackQueue` (`max_values`: None, `max_size`: Some(2012), added: 4487, mode: `MaxEncodedLen`) + /// Storage: `Referenda::DecidingCount` (r:1 w:1) + /// Proof: `Referenda::DecidingCount` (`max_values`: None, `max_size`: Some(14), added: 2489, mode: `MaxEncodedLen`) fn one_fewer_deciding_queue_empty() -> Weight { // Proof Size summary in bytes: - // Measured: `174` + // Measured: `240` // Estimated: `5477` - // Minimum execution time: 10_136_000 picoseconds. - Weight::from_parts(10_638_000, 5477) + // Minimum execution time: 10_056_000 picoseconds. + Weight::from_parts(10_460_000, 5477) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: Referenda TrackQueue (r:1 w:1) - /// Proof: Referenda TrackQueue (max_values: None, max_size: Some(2012), added: 4487, mode: MaxEncodedLen) - /// Storage: Referenda ReferendumInfoFor (r:1 w:1) - /// Proof: Referenda ReferendumInfoFor (max_values: None, max_size: Some(366), added: 2841, mode: MaxEncodedLen) - /// Storage: Scheduler Agenda (r:1 w:1) - /// Proof: Scheduler Agenda (max_values: None, max_size: Some(107022), added: 109497, mode: MaxEncodedLen) + /// Storage: `Referenda::TrackQueue` (r:1 w:1) + /// Proof: `Referenda::TrackQueue` (`max_values`: None, `max_size`: Some(2012), added: 4487, mode: `MaxEncodedLen`) + /// Storage: `Referenda::ReferendumInfoFor` (r:1 w:1) + /// Proof: `Referenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(366), added: 2841, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Agenda` (r:1 w:1) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`) fn one_fewer_deciding_failing() -> Weight { // Proof Size summary in bytes: - // Measured: `3150` + // Measured: `3216` // Estimated: `110487` - // Minimum execution time: 52_022_000 picoseconds. - Weight::from_parts(53_910_000, 110487) + // Minimum execution time: 44_293_000 picoseconds. + Weight::from_parts(45_784_000, 110487) .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(3_u64)) } - /// Storage: Referenda TrackQueue (r:1 w:1) - /// Proof: Referenda TrackQueue (max_values: None, max_size: Some(2012), added: 4487, mode: MaxEncodedLen) - /// Storage: Referenda ReferendumInfoFor (r:1 w:1) - /// Proof: Referenda ReferendumInfoFor (max_values: None, max_size: Some(366), added: 2841, mode: MaxEncodedLen) - /// Storage: Scheduler Agenda (r:1 w:1) - /// Proof: Scheduler Agenda (max_values: None, max_size: Some(107022), added: 109497, mode: MaxEncodedLen) + /// Storage: `Referenda::TrackQueue` (r:1 w:1) + /// Proof: `Referenda::TrackQueue` (`max_values`: None, `max_size`: Some(2012), added: 4487, mode: `MaxEncodedLen`) + /// Storage: `Referenda::ReferendumInfoFor` (r:1 w:1) + /// Proof: `Referenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(366), added: 2841, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Agenda` (r:1 w:1) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`) fn one_fewer_deciding_passing() -> Weight { // Proof Size summary in bytes: - // Measured: `3150` + // Measured: `3216` // Estimated: `110487` - // Minimum execution time: 53_683_000 picoseconds. - Weight::from_parts(55_707_000, 110487) + // Minimum execution time: 45_642_000 picoseconds. + Weight::from_parts(47_252_000, 110487) .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(3_u64)) } - /// Storage: Referenda ReferendumInfoFor (r:1 w:0) - /// Proof: Referenda ReferendumInfoFor (max_values: None, max_size: Some(366), added: 2841, mode: MaxEncodedLen) - /// Storage: Referenda TrackQueue (r:1 w:1) - /// Proof: Referenda TrackQueue (max_values: None, max_size: Some(2012), added: 4487, mode: MaxEncodedLen) + /// Storage: `Referenda::ReferendumInfoFor` (r:1 w:0) + /// Proof: `Referenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(366), added: 2841, mode: `MaxEncodedLen`) + /// Storage: `Referenda::TrackQueue` (r:1 w:1) + /// Proof: `Referenda::TrackQueue` (`max_values`: None, `max_size`: Some(2012), added: 4487, mode: `MaxEncodedLen`) fn nudge_referendum_requeued_insertion() -> Weight { // Proof Size summary in bytes: - // Measured: `3011` + // Measured: `3077` // Estimated: `5477` - // Minimum execution time: 24_043_000 picoseconds. - Weight::from_parts(24_512_000, 5477) + // Minimum execution time: 22_096_000 picoseconds. + Weight::from_parts(22_496_000, 5477) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: Referenda ReferendumInfoFor (r:1 w:0) - /// Proof: Referenda ReferendumInfoFor (max_values: None, max_size: Some(366), added: 2841, mode: MaxEncodedLen) - /// Storage: Referenda TrackQueue (r:1 w:1) - /// Proof: Referenda TrackQueue (max_values: None, max_size: Some(2012), added: 4487, mode: MaxEncodedLen) + /// Storage: `Referenda::ReferendumInfoFor` (r:1 w:0) + /// Proof: `Referenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(366), added: 2841, mode: `MaxEncodedLen`) + /// Storage: `Referenda::TrackQueue` (r:1 w:1) + /// Proof: `Referenda::TrackQueue` (`max_values`: None, `max_size`: Some(2012), added: 4487, mode: `MaxEncodedLen`) fn nudge_referendum_requeued_slide() -> Weight { // Proof Size summary in bytes: - // Measured: `3011` + // Measured: `3077` // Estimated: `5477` - // Minimum execution time: 23_588_000 picoseconds. - Weight::from_parts(24_422_000, 5477) + // Minimum execution time: 21_931_000 picoseconds. + Weight::from_parts(22_312_000, 5477) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: Referenda ReferendumInfoFor (r:1 w:1) - /// Proof: Referenda ReferendumInfoFor (max_values: None, max_size: Some(366), added: 2841, mode: MaxEncodedLen) - /// Storage: Referenda DecidingCount (r:1 w:0) - /// Proof: Referenda DecidingCount (max_values: None, max_size: Some(14), added: 2489, mode: MaxEncodedLen) - /// Storage: Referenda TrackQueue (r:1 w:1) - /// Proof: Referenda TrackQueue (max_values: None, max_size: Some(2012), added: 4487, mode: MaxEncodedLen) + /// Storage: `Referenda::ReferendumInfoFor` (r:1 w:1) + /// Proof: `Referenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(366), added: 2841, mode: `MaxEncodedLen`) + /// Storage: `Referenda::DecidingCount` (r:1 w:0) + /// Proof: `Referenda::DecidingCount` (`max_values`: None, `max_size`: Some(14), added: 2489, mode: `MaxEncodedLen`) + /// Storage: `Referenda::TrackQueue` (r:1 w:1) + /// Proof: `Referenda::TrackQueue` (`max_values`: None, `max_size`: Some(2012), added: 4487, mode: `MaxEncodedLen`) fn nudge_referendum_queued() -> Weight { // Proof Size summary in bytes: - // Measured: `3015` + // Measured: `3081` // Estimated: `5477` - // Minimum execution time: 31_443_000 picoseconds. - Weight::from_parts(32_725_000, 5477) + // Minimum execution time: 28_890_000 picoseconds. + Weight::from_parts(29_679_000, 5477) .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } - /// Storage: Referenda ReferendumInfoFor (r:1 w:1) - /// Proof: Referenda ReferendumInfoFor (max_values: None, max_size: Some(366), added: 2841, mode: MaxEncodedLen) - /// Storage: Referenda DecidingCount (r:1 w:0) - /// Proof: Referenda DecidingCount (max_values: None, max_size: Some(14), added: 2489, mode: MaxEncodedLen) - /// Storage: Referenda TrackQueue (r:1 w:1) - /// Proof: Referenda TrackQueue (max_values: None, max_size: Some(2012), added: 4487, mode: MaxEncodedLen) + /// Storage: `Referenda::ReferendumInfoFor` (r:1 w:1) + /// Proof: `Referenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(366), added: 2841, mode: `MaxEncodedLen`) + /// Storage: `Referenda::DecidingCount` (r:1 w:0) + /// Proof: `Referenda::DecidingCount` (`max_values`: None, `max_size`: Some(14), added: 2489, mode: `MaxEncodedLen`) + /// Storage: `Referenda::TrackQueue` (r:1 w:1) + /// Proof: `Referenda::TrackQueue` (`max_values`: None, `max_size`: Some(2012), added: 4487, mode: `MaxEncodedLen`) fn nudge_referendum_not_queued() -> Weight { // Proof Size summary in bytes: - // Measured: `3035` + // Measured: `3101` // Estimated: `5477` - // Minimum execution time: 30_319_000 picoseconds. - Weight::from_parts(31_652_000, 5477) + // Minimum execution time: 28_875_000 picoseconds. + Weight::from_parts(29_492_000, 5477) .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } - /// Storage: Referenda ReferendumInfoFor (r:1 w:1) - /// Proof: Referenda ReferendumInfoFor (max_values: None, max_size: Some(366), added: 2841, mode: MaxEncodedLen) - /// Storage: Scheduler Agenda (r:1 w:1) - /// Proof: Scheduler Agenda (max_values: None, max_size: Some(107022), added: 109497, mode: MaxEncodedLen) + /// Storage: `Referenda::ReferendumInfoFor` (r:1 w:1) + /// Proof: `Referenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(366), added: 2841, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Agenda` (r:1 w:1) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`) fn nudge_referendum_no_deposit() -> Weight { // Proof Size summary in bytes: - // Measured: `333` + // Measured: `399` // Estimated: `110487` - // Minimum execution time: 23_062_000 picoseconds. - Weight::from_parts(23_614_000, 110487) + // Minimum execution time: 19_787_000 picoseconds. + Weight::from_parts(20_493_000, 110487) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } - /// Storage: Referenda ReferendumInfoFor (r:1 w:1) - /// Proof: Referenda ReferendumInfoFor (max_values: None, max_size: Some(366), added: 2841, mode: MaxEncodedLen) - /// Storage: Scheduler Agenda (r:1 w:1) - /// Proof: Scheduler Agenda (max_values: None, max_size: Some(107022), added: 109497, mode: MaxEncodedLen) + /// Storage: `Referenda::ReferendumInfoFor` (r:1 w:1) + /// Proof: `Referenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(366), added: 2841, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Agenda` (r:1 w:1) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`) fn nudge_referendum_preparing() -> Weight { // Proof Size summary in bytes: - // Measured: `381` + // Measured: `447` // Estimated: `110487` - // Minimum execution time: 23_537_000 picoseconds. - Weight::from_parts(24_267_000, 110487) + // Minimum execution time: 19_987_000 picoseconds. + Weight::from_parts(20_860_000, 110487) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } - /// Storage: Referenda ReferendumInfoFor (r:1 w:1) - /// Proof: Referenda ReferendumInfoFor (max_values: None, max_size: Some(366), added: 2841, mode: MaxEncodedLen) + /// Storage: `Referenda::ReferendumInfoFor` (r:1 w:1) + /// Proof: `Referenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(366), added: 2841, mode: `MaxEncodedLen`) fn nudge_referendum_timed_out() -> Weight { // Proof Size summary in bytes: - // Measured: `278` + // Measured: `344` // Estimated: `3831` - // Minimum execution time: 16_388_000 picoseconds. - Weight::from_parts(16_676_000, 3831) + // Minimum execution time: 13_416_000 picoseconds. + Weight::from_parts(13_857_000, 3831) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: Referenda ReferendumInfoFor (r:1 w:1) - /// Proof: Referenda ReferendumInfoFor (max_values: None, max_size: Some(366), added: 2841, mode: MaxEncodedLen) - /// Storage: Referenda DecidingCount (r:1 w:1) - /// Proof: Referenda DecidingCount (max_values: None, max_size: Some(14), added: 2489, mode: MaxEncodedLen) - /// Storage: Scheduler Agenda (r:1 w:1) - /// Proof: Scheduler Agenda (max_values: None, max_size: Some(107022), added: 109497, mode: MaxEncodedLen) + /// Storage: `Referenda::ReferendumInfoFor` (r:1 w:1) + /// Proof: `Referenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(366), added: 2841, mode: `MaxEncodedLen`) + /// Storage: `Referenda::DecidingCount` (r:1 w:1) + /// Proof: `Referenda::DecidingCount` (`max_values`: None, `max_size`: Some(14), added: 2489, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Agenda` (r:1 w:1) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`) fn nudge_referendum_begin_deciding_failing() -> Weight { // Proof Size summary in bytes: - // Measured: `381` + // Measured: `447` // Estimated: `110487` - // Minimum execution time: 32_801_000 picoseconds. - Weight::from_parts(34_053_000, 110487) + // Minimum execution time: 27_199_000 picoseconds. + Weight::from_parts(28_562_000, 110487) .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(3_u64)) } - /// Storage: Referenda ReferendumInfoFor (r:1 w:1) - /// Proof: Referenda ReferendumInfoFor (max_values: None, max_size: Some(366), added: 2841, mode: MaxEncodedLen) - /// Storage: Referenda DecidingCount (r:1 w:1) - /// Proof: Referenda DecidingCount (max_values: None, max_size: Some(14), added: 2489, mode: MaxEncodedLen) - /// Storage: Scheduler Agenda (r:1 w:1) - /// Proof: Scheduler Agenda (max_values: None, max_size: Some(107022), added: 109497, mode: MaxEncodedLen) + /// Storage: `Referenda::ReferendumInfoFor` (r:1 w:1) + /// Proof: `Referenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(366), added: 2841, mode: `MaxEncodedLen`) + /// Storage: `Referenda::DecidingCount` (r:1 w:1) + /// Proof: `Referenda::DecidingCount` (`max_values`: None, `max_size`: Some(14), added: 2489, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Agenda` (r:1 w:1) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`) fn nudge_referendum_begin_deciding_passing() -> Weight { // Proof Size summary in bytes: - // Measured: `381` + // Measured: `447` // Estimated: `110487` - // Minimum execution time: 35_704_000 picoseconds. - Weight::from_parts(36_451_000, 110487) + // Minimum execution time: 29_205_000 picoseconds. + Weight::from_parts(30_407_000, 110487) .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(3_u64)) } - /// Storage: Referenda ReferendumInfoFor (r:1 w:1) - /// Proof: Referenda ReferendumInfoFor (max_values: None, max_size: Some(366), added: 2841, mode: MaxEncodedLen) - /// Storage: Scheduler Agenda (r:1 w:1) - /// Proof: Scheduler Agenda (max_values: None, max_size: Some(107022), added: 109497, mode: MaxEncodedLen) + /// Storage: `Referenda::ReferendumInfoFor` (r:1 w:1) + /// Proof: `Referenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(366), added: 2841, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Agenda` (r:1 w:1) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`) fn nudge_referendum_begin_confirming() -> Weight { // Proof Size summary in bytes: - // Measured: `434` + // Measured: `500` // Estimated: `110487` - // Minimum execution time: 29_151_000 picoseconds. - Weight::from_parts(30_055_000, 110487) + // Minimum execution time: 24_136_000 picoseconds. + Weight::from_parts(24_868_000, 110487) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } - /// Storage: Referenda ReferendumInfoFor (r:1 w:1) - /// Proof: Referenda ReferendumInfoFor (max_values: None, max_size: Some(366), added: 2841, mode: MaxEncodedLen) - /// Storage: Scheduler Agenda (r:1 w:1) - /// Proof: Scheduler Agenda (max_values: None, max_size: Some(107022), added: 109497, mode: MaxEncodedLen) + /// Storage: `Referenda::ReferendumInfoFor` (r:1 w:1) + /// Proof: `Referenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(366), added: 2841, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Agenda` (r:1 w:1) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`) fn nudge_referendum_end_confirming() -> Weight { // Proof Size summary in bytes: - // Measured: `417` + // Measured: `483` // Estimated: `110487` - // Minimum execution time: 29_265_000 picoseconds. - Weight::from_parts(30_213_000, 110487) + // Minimum execution time: 23_860_000 picoseconds. + Weight::from_parts(24_556_000, 110487) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } - /// Storage: Referenda ReferendumInfoFor (r:1 w:1) - /// Proof: Referenda ReferendumInfoFor (max_values: None, max_size: Some(366), added: 2841, mode: MaxEncodedLen) - /// Storage: Scheduler Agenda (r:1 w:1) - /// Proof: Scheduler Agenda (max_values: None, max_size: Some(107022), added: 109497, mode: MaxEncodedLen) + /// Storage: `Referenda::ReferendumInfoFor` (r:1 w:1) + /// Proof: `Referenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(366), added: 2841, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Agenda` (r:1 w:1) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`) fn nudge_referendum_continue_not_confirming() -> Weight { // Proof Size summary in bytes: - // Measured: `434` + // Measured: `500` // Estimated: `110487` - // Minimum execution time: 27_760_000 picoseconds. - Weight::from_parts(28_381_000, 110487) + // Minimum execution time: 23_409_000 picoseconds. + Weight::from_parts(24_354_000, 110487) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } - /// Storage: Referenda ReferendumInfoFor (r:1 w:1) - /// Proof: Referenda ReferendumInfoFor (max_values: None, max_size: Some(366), added: 2841, mode: MaxEncodedLen) - /// Storage: Scheduler Agenda (r:1 w:1) - /// Proof: Scheduler Agenda (max_values: None, max_size: Some(107022), added: 109497, mode: MaxEncodedLen) + /// Storage: `Referenda::ReferendumInfoFor` (r:1 w:1) + /// Proof: `Referenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(366), added: 2841, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Agenda` (r:1 w:1) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`) fn nudge_referendum_continue_confirming() -> Weight { // Proof Size summary in bytes: - // Measured: `438` + // Measured: `504` // Estimated: `110487` - // Minimum execution time: 25_464_000 picoseconds. - Weight::from_parts(26_348_000, 110487) + // Minimum execution time: 21_947_000 picoseconds. + Weight::from_parts(22_485_000, 110487) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } - /// Storage: Referenda ReferendumInfoFor (r:1 w:1) - /// Proof: Referenda ReferendumInfoFor (max_values: None, max_size: Some(366), added: 2841, mode: MaxEncodedLen) - /// Storage: Scheduler Agenda (r:2 w:2) - /// Proof: Scheduler Agenda (max_values: None, max_size: Some(107022), added: 109497, mode: MaxEncodedLen) - /// Storage: Scheduler Lookup (r:1 w:1) - /// Proof: Scheduler Lookup (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) + /// Storage: `Referenda::ReferendumInfoFor` (r:1 w:1) + /// Proof: `Referenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(366), added: 2841, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Agenda` (r:2 w:2) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Lookup` (r:1 w:1) + /// Proof: `Scheduler::Lookup` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) fn nudge_referendum_approved() -> Weight { // Proof Size summary in bytes: - // Measured: `438` + // Measured: `504` // Estimated: `219984` - // Minimum execution time: 42_629_000 picoseconds. - Weight::from_parts(43_732_000, 219984) + // Minimum execution time: 34_643_000 picoseconds. + Weight::from_parts(36_193_000, 219984) .saturating_add(T::DbWeight::get().reads(4_u64)) .saturating_add(T::DbWeight::get().writes(4_u64)) } - /// Storage: Referenda ReferendumInfoFor (r:1 w:1) - /// Proof: Referenda ReferendumInfoFor (max_values: None, max_size: Some(366), added: 2841, mode: MaxEncodedLen) - /// Storage: Scheduler Agenda (r:1 w:1) - /// Proof: Scheduler Agenda (max_values: None, max_size: Some(107022), added: 109497, mode: MaxEncodedLen) + /// Storage: `Referenda::ReferendumInfoFor` (r:1 w:1) + /// Proof: `Referenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(366), added: 2841, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Agenda` (r:1 w:1) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`) fn nudge_referendum_rejected() -> Weight { // Proof Size summary in bytes: - // Measured: `434` + // Measured: `500` // Estimated: `110487` - // Minimum execution time: 30_015_000 picoseconds. - Weight::from_parts(30_827_000, 110487) + // Minimum execution time: 24_097_000 picoseconds. + Weight::from_parts(24_881_000, 110487) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } - /// Storage: Referenda ReferendumInfoFor (r:1 w:0) - /// Proof: Referenda ReferendumInfoFor (max_values: None, max_size: Some(366), added: 2841, mode: MaxEncodedLen) - /// Storage: Preimage StatusFor (r:1 w:0) - /// Proof: Preimage StatusFor (max_values: None, max_size: Some(91), added: 2566, mode: MaxEncodedLen) - /// Storage: Referenda MetadataOf (r:0 w:1) - /// Proof: Referenda MetadataOf (max_values: None, max_size: Some(52), added: 2527, mode: MaxEncodedLen) + /// Storage: `Referenda::ReferendumInfoFor` (r:1 w:0) + /// Proof: `Referenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(366), added: 2841, mode: `MaxEncodedLen`) + /// Storage: `Preimage::StatusFor` (r:1 w:0) + /// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) + /// Storage: `Preimage::RequestStatusFor` (r:1 w:0) + /// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) + /// Storage: `Referenda::MetadataOf` (r:0 w:1) + /// Proof: `Referenda::MetadataOf` (`max_values`: None, `max_size`: Some(52), added: 2527, mode: `MaxEncodedLen`) fn set_some_metadata() -> Weight { // Proof Size summary in bytes: - // Measured: `422` + // Measured: `555` // Estimated: `3831` - // Minimum execution time: 19_901_000 picoseconds. - Weight::from_parts(20_681_000, 3831) - .saturating_add(T::DbWeight::get().reads(2_u64)) + // Minimum execution time: 19_947_000 picoseconds. + Weight::from_parts(20_396_000, 3831) + .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: Referenda ReferendumInfoFor (r:1 w:0) - /// Proof: Referenda ReferendumInfoFor (max_values: None, max_size: Some(366), added: 2841, mode: MaxEncodedLen) - /// Storage: Referenda MetadataOf (r:1 w:1) - /// Proof: Referenda MetadataOf (max_values: None, max_size: Some(52), added: 2527, mode: MaxEncodedLen) + /// Storage: `Referenda::ReferendumInfoFor` (r:1 w:0) + /// Proof: `Referenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(366), added: 2841, mode: `MaxEncodedLen`) + /// Storage: `Referenda::MetadataOf` (r:1 w:1) + /// Proof: `Referenda::MetadataOf` (`max_values`: None, `max_size`: Some(52), added: 2527, mode: `MaxEncodedLen`) fn clear_metadata() -> Weight { // Proof Size summary in bytes: - // Measured: `355` + // Measured: `421` // Estimated: `3831` - // Minimum execution time: 17_323_000 picoseconds. - Weight::from_parts(18_227_000, 3831) + // Minimum execution time: 15_516_000 picoseconds. + Weight::from_parts(16_094_000, 3831) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } } -// For backwards compatibility and tests +// For backwards compatibility and tests. impl WeightInfo for () { - /// Storage: Referenda ReferendumCount (r:1 w:1) - /// Proof: Referenda ReferendumCount (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: Scheduler Agenda (r:1 w:1) - /// Proof: Scheduler Agenda (max_values: None, max_size: Some(107022), added: 109497, mode: MaxEncodedLen) - /// Storage: Referenda ReferendumInfoFor (r:0 w:1) - /// Proof: Referenda ReferendumInfoFor (max_values: None, max_size: Some(366), added: 2841, mode: MaxEncodedLen) + /// Storage: `Referenda::ReferendumCount` (r:1 w:1) + /// Proof: `Referenda::ReferendumCount` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Agenda` (r:1 w:1) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`) + /// Storage: `Referenda::ReferendumInfoFor` (r:0 w:1) + /// Proof: `Referenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(366), added: 2841, mode: `MaxEncodedLen`) fn submit() -> Weight { // Proof Size summary in bytes: - // Measured: `220` + // Measured: `286` // Estimated: `110487` - // Minimum execution time: 40_175_000 picoseconds. - Weight::from_parts(41_107_000, 110487) + // Minimum execution time: 33_162_000 picoseconds. + Weight::from_parts(34_217_000, 110487) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(3_u64)) } - /// Storage: Referenda ReferendumInfoFor (r:1 w:1) - /// Proof: Referenda ReferendumInfoFor (max_values: None, max_size: Some(366), added: 2841, mode: MaxEncodedLen) - /// Storage: Scheduler Agenda (r:2 w:2) - /// Proof: Scheduler Agenda (max_values: None, max_size: Some(107022), added: 109497, mode: MaxEncodedLen) + /// Storage: `Referenda::ReferendumInfoFor` (r:1 w:1) + /// Proof: `Referenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(366), added: 2841, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Agenda` (r:2 w:2) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Retries` (r:0 w:1) + /// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`) fn place_decision_deposit_preparing() -> Weight { // Proof Size summary in bytes: - // Measured: `473` + // Measured: `539` // Estimated: `219984` - // Minimum execution time: 50_922_000 picoseconds. - Weight::from_parts(52_179_000, 219984) + // Minimum execution time: 45_276_000 picoseconds. + Weight::from_parts(46_903_000, 219984) .saturating_add(RocksDbWeight::get().reads(3_u64)) - .saturating_add(RocksDbWeight::get().writes(3_u64)) + .saturating_add(RocksDbWeight::get().writes(4_u64)) } - /// Storage: Referenda ReferendumInfoFor (r:1 w:1) - /// Proof: Referenda ReferendumInfoFor (max_values: None, max_size: Some(366), added: 2841, mode: MaxEncodedLen) - /// Storage: Referenda DecidingCount (r:1 w:0) - /// Proof: Referenda DecidingCount (max_values: None, max_size: Some(14), added: 2489, mode: MaxEncodedLen) - /// Storage: Referenda TrackQueue (r:1 w:1) - /// Proof: Referenda TrackQueue (max_values: None, max_size: Some(2012), added: 4487, mode: MaxEncodedLen) - /// Storage: Scheduler Agenda (r:1 w:1) - /// Proof: Scheduler Agenda (max_values: None, max_size: Some(107022), added: 109497, mode: MaxEncodedLen) + /// Storage: `Referenda::ReferendumInfoFor` (r:1 w:1) + /// Proof: `Referenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(366), added: 2841, mode: `MaxEncodedLen`) + /// Storage: `Referenda::DecidingCount` (r:1 w:0) + /// Proof: `Referenda::DecidingCount` (`max_values`: None, `max_size`: Some(14), added: 2489, mode: `MaxEncodedLen`) + /// Storage: `Referenda::TrackQueue` (r:1 w:1) + /// Proof: `Referenda::TrackQueue` (`max_values`: None, `max_size`: Some(2012), added: 4487, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Agenda` (r:1 w:1) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Retries` (r:0 w:1) + /// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`) fn place_decision_deposit_queued() -> Weight { // Proof Size summary in bytes: - // Measured: `3260` + // Measured: `3326` // Estimated: `110487` - // Minimum execution time: 69_559_000 picoseconds. - Weight::from_parts(72_143_000, 110487) + // Minimum execution time: 63_832_000 picoseconds. + Weight::from_parts(65_616_000, 110487) .saturating_add(RocksDbWeight::get().reads(4_u64)) - .saturating_add(RocksDbWeight::get().writes(3_u64)) + .saturating_add(RocksDbWeight::get().writes(4_u64)) } - /// Storage: Referenda ReferendumInfoFor (r:1 w:1) - /// Proof: Referenda ReferendumInfoFor (max_values: None, max_size: Some(366), added: 2841, mode: MaxEncodedLen) - /// Storage: Referenda DecidingCount (r:1 w:0) - /// Proof: Referenda DecidingCount (max_values: None, max_size: Some(14), added: 2489, mode: MaxEncodedLen) - /// Storage: Referenda TrackQueue (r:1 w:1) - /// Proof: Referenda TrackQueue (max_values: None, max_size: Some(2012), added: 4487, mode: MaxEncodedLen) - /// Storage: Scheduler Agenda (r:1 w:1) - /// Proof: Scheduler Agenda (max_values: None, max_size: Some(107022), added: 109497, mode: MaxEncodedLen) + /// Storage: `Referenda::ReferendumInfoFor` (r:1 w:1) + /// Proof: `Referenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(366), added: 2841, mode: `MaxEncodedLen`) + /// Storage: `Referenda::DecidingCount` (r:1 w:0) + /// Proof: `Referenda::DecidingCount` (`max_values`: None, `max_size`: Some(14), added: 2489, mode: `MaxEncodedLen`) + /// Storage: `Referenda::TrackQueue` (r:1 w:1) + /// Proof: `Referenda::TrackQueue` (`max_values`: None, `max_size`: Some(2012), added: 4487, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Agenda` (r:1 w:1) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Retries` (r:0 w:1) + /// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`) fn place_decision_deposit_not_queued() -> Weight { // Proof Size summary in bytes: - // Measured: `3280` + // Measured: `3346` // Estimated: `110487` - // Minimum execution time: 68_833_000 picoseconds. - Weight::from_parts(70_987_000, 110487) + // Minimum execution time: 63_726_000 picoseconds. + Weight::from_parts(64_909_000, 110487) .saturating_add(RocksDbWeight::get().reads(4_u64)) - .saturating_add(RocksDbWeight::get().writes(3_u64)) + .saturating_add(RocksDbWeight::get().writes(4_u64)) } - /// Storage: Referenda ReferendumInfoFor (r:1 w:1) - /// Proof: Referenda ReferendumInfoFor (max_values: None, max_size: Some(366), added: 2841, mode: MaxEncodedLen) - /// Storage: Referenda DecidingCount (r:1 w:1) - /// Proof: Referenda DecidingCount (max_values: None, max_size: Some(14), added: 2489, mode: MaxEncodedLen) - /// Storage: Scheduler Agenda (r:2 w:2) - /// Proof: Scheduler Agenda (max_values: None, max_size: Some(107022), added: 109497, mode: MaxEncodedLen) + /// Storage: `Referenda::ReferendumInfoFor` (r:1 w:1) + /// Proof: `Referenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(366), added: 2841, mode: `MaxEncodedLen`) + /// Storage: `Referenda::DecidingCount` (r:1 w:1) + /// Proof: `Referenda::DecidingCount` (`max_values`: None, `max_size`: Some(14), added: 2489, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Agenda` (r:2 w:2) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Retries` (r:0 w:1) + /// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`) fn place_decision_deposit_passing() -> Weight { // Proof Size summary in bytes: - // Measured: `473` + // Measured: `539` // Estimated: `219984` - // Minimum execution time: 61_794_000 picoseconds. - Weight::from_parts(62_846_000, 219984) + // Minimum execution time: 53_001_000 picoseconds. + Weight::from_parts(54_489_000, 219984) .saturating_add(RocksDbWeight::get().reads(4_u64)) - .saturating_add(RocksDbWeight::get().writes(4_u64)) - } - /// Storage: Referenda ReferendumInfoFor (r:1 w:1) - /// Proof: Referenda ReferendumInfoFor (max_values: None, max_size: Some(366), added: 2841, mode: MaxEncodedLen) - /// Storage: Referenda DecidingCount (r:1 w:1) - /// Proof: Referenda DecidingCount (max_values: None, max_size: Some(14), added: 2489, mode: MaxEncodedLen) - /// Storage: Scheduler Agenda (r:2 w:2) - /// Proof: Scheduler Agenda (max_values: None, max_size: Some(107022), added: 109497, mode: MaxEncodedLen) + .saturating_add(RocksDbWeight::get().writes(5_u64)) + } + /// Storage: `Referenda::ReferendumInfoFor` (r:1 w:1) + /// Proof: `Referenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(366), added: 2841, mode: `MaxEncodedLen`) + /// Storage: `Referenda::DecidingCount` (r:1 w:1) + /// Proof: `Referenda::DecidingCount` (`max_values`: None, `max_size`: Some(14), added: 2489, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Agenda` (r:2 w:2) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Retries` (r:0 w:1) + /// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`) fn place_decision_deposit_failing() -> Weight { // Proof Size summary in bytes: - // Measured: `473` + // Measured: `539` // Estimated: `219984` - // Minimum execution time: 58_664_000 picoseconds. - Weight::from_parts(60_195_000, 219984) + // Minimum execution time: 51_021_000 picoseconds. + Weight::from_parts(53_006_000, 219984) .saturating_add(RocksDbWeight::get().reads(4_u64)) - .saturating_add(RocksDbWeight::get().writes(4_u64)) + .saturating_add(RocksDbWeight::get().writes(5_u64)) } - /// Storage: Referenda ReferendumInfoFor (r:1 w:1) - /// Proof: Referenda ReferendumInfoFor (max_values: None, max_size: Some(366), added: 2841, mode: MaxEncodedLen) + /// Storage: `Referenda::ReferendumInfoFor` (r:1 w:1) + /// Proof: `Referenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(366), added: 2841, mode: `MaxEncodedLen`) fn refund_decision_deposit() -> Weight { // Proof Size summary in bytes: - // Measured: `351` + // Measured: `417` // Estimated: `3831` - // Minimum execution time: 30_850_000 picoseconds. - Weight::from_parts(32_130_000, 3831) + // Minimum execution time: 26_572_000 picoseconds. + Weight::from_parts(27_534_000, 3831) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Referenda ReferendumInfoFor (r:1 w:1) - /// Proof: Referenda ReferendumInfoFor (max_values: None, max_size: Some(366), added: 2841, mode: MaxEncodedLen) + /// Storage: `Referenda::ReferendumInfoFor` (r:1 w:1) + /// Proof: `Referenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(366), added: 2841, mode: `MaxEncodedLen`) fn refund_submission_deposit() -> Weight { // Proof Size summary in bytes: - // Measured: `341` + // Measured: `407` // Estimated: `3831` - // Minimum execution time: 30_747_000 picoseconds. - Weight::from_parts(32_196_000, 3831) + // Minimum execution time: 26_897_000 picoseconds. + Weight::from_parts(27_883_000, 3831) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Referenda ReferendumInfoFor (r:1 w:1) - /// Proof: Referenda ReferendumInfoFor (max_values: None, max_size: Some(366), added: 2841, mode: MaxEncodedLen) - /// Storage: Scheduler Agenda (r:2 w:2) - /// Proof: Scheduler Agenda (max_values: None, max_size: Some(107022), added: 109497, mode: MaxEncodedLen) + /// Storage: `Referenda::ReferendumInfoFor` (r:1 w:1) + /// Proof: `Referenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(366), added: 2841, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Agenda` (r:2 w:2) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Retries` (r:0 w:1) + /// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`) fn cancel() -> Weight { // Proof Size summary in bytes: - // Measured: `381` + // Measured: `447` // Estimated: `219984` - // Minimum execution time: 36_139_000 picoseconds. - Weight::from_parts(37_252_000, 219984) + // Minimum execution time: 31_767_000 picoseconds. + Weight::from_parts(33_045_000, 219984) .saturating_add(RocksDbWeight::get().reads(3_u64)) - .saturating_add(RocksDbWeight::get().writes(3_u64)) + .saturating_add(RocksDbWeight::get().writes(4_u64)) } - /// Storage: Referenda ReferendumInfoFor (r:1 w:1) - /// Proof: Referenda ReferendumInfoFor (max_values: None, max_size: Some(366), added: 2841, mode: MaxEncodedLen) - /// Storage: Scheduler Agenda (r:2 w:2) - /// Proof: Scheduler Agenda (max_values: None, max_size: Some(107022), added: 109497, mode: MaxEncodedLen) - /// Storage: Referenda MetadataOf (r:1 w:0) - /// Proof: Referenda MetadataOf (max_values: None, max_size: Some(52), added: 2527, mode: MaxEncodedLen) + /// Storage: `Referenda::ReferendumInfoFor` (r:1 w:1) + /// Proof: `Referenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(366), added: 2841, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Agenda` (r:2 w:2) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`) + /// Storage: `Referenda::MetadataOf` (r:1 w:0) + /// Proof: `Referenda::MetadataOf` (`max_values`: None, `max_size`: Some(52), added: 2527, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Retries` (r:0 w:1) + /// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`) fn kill() -> Weight { // Proof Size summary in bytes: - // Measured: `622` + // Measured: `688` // Estimated: `219984` - // Minimum execution time: 80_862_000 picoseconds. - Weight::from_parts(83_045_000, 219984) + // Minimum execution time: 67_798_000 picoseconds. + Weight::from_parts(70_044_000, 219984) .saturating_add(RocksDbWeight::get().reads(4_u64)) - .saturating_add(RocksDbWeight::get().writes(3_u64)) + .saturating_add(RocksDbWeight::get().writes(4_u64)) } - /// Storage: Referenda TrackQueue (r:1 w:0) - /// Proof: Referenda TrackQueue (max_values: None, max_size: Some(2012), added: 4487, mode: MaxEncodedLen) - /// Storage: Referenda DecidingCount (r:1 w:1) - /// Proof: Referenda DecidingCount (max_values: None, max_size: Some(14), added: 2489, mode: MaxEncodedLen) + /// Storage: `Referenda::TrackQueue` (r:1 w:0) + /// Proof: `Referenda::TrackQueue` (`max_values`: None, `max_size`: Some(2012), added: 4487, mode: `MaxEncodedLen`) + /// Storage: `Referenda::DecidingCount` (r:1 w:1) + /// Proof: `Referenda::DecidingCount` (`max_values`: None, `max_size`: Some(14), added: 2489, mode: `MaxEncodedLen`) fn one_fewer_deciding_queue_empty() -> Weight { // Proof Size summary in bytes: - // Measured: `174` + // Measured: `240` // Estimated: `5477` - // Minimum execution time: 10_136_000 picoseconds. - Weight::from_parts(10_638_000, 5477) + // Minimum execution time: 10_056_000 picoseconds. + Weight::from_parts(10_460_000, 5477) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Referenda TrackQueue (r:1 w:1) - /// Proof: Referenda TrackQueue (max_values: None, max_size: Some(2012), added: 4487, mode: MaxEncodedLen) - /// Storage: Referenda ReferendumInfoFor (r:1 w:1) - /// Proof: Referenda ReferendumInfoFor (max_values: None, max_size: Some(366), added: 2841, mode: MaxEncodedLen) - /// Storage: Scheduler Agenda (r:1 w:1) - /// Proof: Scheduler Agenda (max_values: None, max_size: Some(107022), added: 109497, mode: MaxEncodedLen) + /// Storage: `Referenda::TrackQueue` (r:1 w:1) + /// Proof: `Referenda::TrackQueue` (`max_values`: None, `max_size`: Some(2012), added: 4487, mode: `MaxEncodedLen`) + /// Storage: `Referenda::ReferendumInfoFor` (r:1 w:1) + /// Proof: `Referenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(366), added: 2841, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Agenda` (r:1 w:1) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`) fn one_fewer_deciding_failing() -> Weight { // Proof Size summary in bytes: - // Measured: `3150` + // Measured: `3216` // Estimated: `110487` - // Minimum execution time: 52_022_000 picoseconds. - Weight::from_parts(53_910_000, 110487) + // Minimum execution time: 44_293_000 picoseconds. + Weight::from_parts(45_784_000, 110487) .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(3_u64)) } - /// Storage: Referenda TrackQueue (r:1 w:1) - /// Proof: Referenda TrackQueue (max_values: None, max_size: Some(2012), added: 4487, mode: MaxEncodedLen) - /// Storage: Referenda ReferendumInfoFor (r:1 w:1) - /// Proof: Referenda ReferendumInfoFor (max_values: None, max_size: Some(366), added: 2841, mode: MaxEncodedLen) - /// Storage: Scheduler Agenda (r:1 w:1) - /// Proof: Scheduler Agenda (max_values: None, max_size: Some(107022), added: 109497, mode: MaxEncodedLen) + /// Storage: `Referenda::TrackQueue` (r:1 w:1) + /// Proof: `Referenda::TrackQueue` (`max_values`: None, `max_size`: Some(2012), added: 4487, mode: `MaxEncodedLen`) + /// Storage: `Referenda::ReferendumInfoFor` (r:1 w:1) + /// Proof: `Referenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(366), added: 2841, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Agenda` (r:1 w:1) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`) fn one_fewer_deciding_passing() -> Weight { // Proof Size summary in bytes: - // Measured: `3150` + // Measured: `3216` // Estimated: `110487` - // Minimum execution time: 53_683_000 picoseconds. - Weight::from_parts(55_707_000, 110487) + // Minimum execution time: 45_642_000 picoseconds. + Weight::from_parts(47_252_000, 110487) .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(3_u64)) } - /// Storage: Referenda ReferendumInfoFor (r:1 w:0) - /// Proof: Referenda ReferendumInfoFor (max_values: None, max_size: Some(366), added: 2841, mode: MaxEncodedLen) - /// Storage: Referenda TrackQueue (r:1 w:1) - /// Proof: Referenda TrackQueue (max_values: None, max_size: Some(2012), added: 4487, mode: MaxEncodedLen) + /// Storage: `Referenda::ReferendumInfoFor` (r:1 w:0) + /// Proof: `Referenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(366), added: 2841, mode: `MaxEncodedLen`) + /// Storage: `Referenda::TrackQueue` (r:1 w:1) + /// Proof: `Referenda::TrackQueue` (`max_values`: None, `max_size`: Some(2012), added: 4487, mode: `MaxEncodedLen`) fn nudge_referendum_requeued_insertion() -> Weight { // Proof Size summary in bytes: - // Measured: `3011` + // Measured: `3077` // Estimated: `5477` - // Minimum execution time: 24_043_000 picoseconds. - Weight::from_parts(24_512_000, 5477) + // Minimum execution time: 22_096_000 picoseconds. + Weight::from_parts(22_496_000, 5477) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Referenda ReferendumInfoFor (r:1 w:0) - /// Proof: Referenda ReferendumInfoFor (max_values: None, max_size: Some(366), added: 2841, mode: MaxEncodedLen) - /// Storage: Referenda TrackQueue (r:1 w:1) - /// Proof: Referenda TrackQueue (max_values: None, max_size: Some(2012), added: 4487, mode: MaxEncodedLen) + /// Storage: `Referenda::ReferendumInfoFor` (r:1 w:0) + /// Proof: `Referenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(366), added: 2841, mode: `MaxEncodedLen`) + /// Storage: `Referenda::TrackQueue` (r:1 w:1) + /// Proof: `Referenda::TrackQueue` (`max_values`: None, `max_size`: Some(2012), added: 4487, mode: `MaxEncodedLen`) fn nudge_referendum_requeued_slide() -> Weight { // Proof Size summary in bytes: - // Measured: `3011` + // Measured: `3077` // Estimated: `5477` - // Minimum execution time: 23_588_000 picoseconds. - Weight::from_parts(24_422_000, 5477) + // Minimum execution time: 21_931_000 picoseconds. + Weight::from_parts(22_312_000, 5477) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Referenda ReferendumInfoFor (r:1 w:1) - /// Proof: Referenda ReferendumInfoFor (max_values: None, max_size: Some(366), added: 2841, mode: MaxEncodedLen) - /// Storage: Referenda DecidingCount (r:1 w:0) - /// Proof: Referenda DecidingCount (max_values: None, max_size: Some(14), added: 2489, mode: MaxEncodedLen) - /// Storage: Referenda TrackQueue (r:1 w:1) - /// Proof: Referenda TrackQueue (max_values: None, max_size: Some(2012), added: 4487, mode: MaxEncodedLen) + /// Storage: `Referenda::ReferendumInfoFor` (r:1 w:1) + /// Proof: `Referenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(366), added: 2841, mode: `MaxEncodedLen`) + /// Storage: `Referenda::DecidingCount` (r:1 w:0) + /// Proof: `Referenda::DecidingCount` (`max_values`: None, `max_size`: Some(14), added: 2489, mode: `MaxEncodedLen`) + /// Storage: `Referenda::TrackQueue` (r:1 w:1) + /// Proof: `Referenda::TrackQueue` (`max_values`: None, `max_size`: Some(2012), added: 4487, mode: `MaxEncodedLen`) fn nudge_referendum_queued() -> Weight { // Proof Size summary in bytes: - // Measured: `3015` + // Measured: `3081` // Estimated: `5477` - // Minimum execution time: 31_443_000 picoseconds. - Weight::from_parts(32_725_000, 5477) + // Minimum execution time: 28_890_000 picoseconds. + Weight::from_parts(29_679_000, 5477) .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } - /// Storage: Referenda ReferendumInfoFor (r:1 w:1) - /// Proof: Referenda ReferendumInfoFor (max_values: None, max_size: Some(366), added: 2841, mode: MaxEncodedLen) - /// Storage: Referenda DecidingCount (r:1 w:0) - /// Proof: Referenda DecidingCount (max_values: None, max_size: Some(14), added: 2489, mode: MaxEncodedLen) - /// Storage: Referenda TrackQueue (r:1 w:1) - /// Proof: Referenda TrackQueue (max_values: None, max_size: Some(2012), added: 4487, mode: MaxEncodedLen) + /// Storage: `Referenda::ReferendumInfoFor` (r:1 w:1) + /// Proof: `Referenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(366), added: 2841, mode: `MaxEncodedLen`) + /// Storage: `Referenda::DecidingCount` (r:1 w:0) + /// Proof: `Referenda::DecidingCount` (`max_values`: None, `max_size`: Some(14), added: 2489, mode: `MaxEncodedLen`) + /// Storage: `Referenda::TrackQueue` (r:1 w:1) + /// Proof: `Referenda::TrackQueue` (`max_values`: None, `max_size`: Some(2012), added: 4487, mode: `MaxEncodedLen`) fn nudge_referendum_not_queued() -> Weight { // Proof Size summary in bytes: - // Measured: `3035` + // Measured: `3101` // Estimated: `5477` - // Minimum execution time: 30_319_000 picoseconds. - Weight::from_parts(31_652_000, 5477) + // Minimum execution time: 28_875_000 picoseconds. + Weight::from_parts(29_492_000, 5477) .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } - /// Storage: Referenda ReferendumInfoFor (r:1 w:1) - /// Proof: Referenda ReferendumInfoFor (max_values: None, max_size: Some(366), added: 2841, mode: MaxEncodedLen) - /// Storage: Scheduler Agenda (r:1 w:1) - /// Proof: Scheduler Agenda (max_values: None, max_size: Some(107022), added: 109497, mode: MaxEncodedLen) + /// Storage: `Referenda::ReferendumInfoFor` (r:1 w:1) + /// Proof: `Referenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(366), added: 2841, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Agenda` (r:1 w:1) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`) fn nudge_referendum_no_deposit() -> Weight { // Proof Size summary in bytes: - // Measured: `333` + // Measured: `399` // Estimated: `110487` - // Minimum execution time: 23_062_000 picoseconds. - Weight::from_parts(23_614_000, 110487) + // Minimum execution time: 19_787_000 picoseconds. + Weight::from_parts(20_493_000, 110487) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } - /// Storage: Referenda ReferendumInfoFor (r:1 w:1) - /// Proof: Referenda ReferendumInfoFor (max_values: None, max_size: Some(366), added: 2841, mode: MaxEncodedLen) - /// Storage: Scheduler Agenda (r:1 w:1) - /// Proof: Scheduler Agenda (max_values: None, max_size: Some(107022), added: 109497, mode: MaxEncodedLen) + /// Storage: `Referenda::ReferendumInfoFor` (r:1 w:1) + /// Proof: `Referenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(366), added: 2841, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Agenda` (r:1 w:1) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`) fn nudge_referendum_preparing() -> Weight { // Proof Size summary in bytes: - // Measured: `381` + // Measured: `447` // Estimated: `110487` - // Minimum execution time: 23_537_000 picoseconds. - Weight::from_parts(24_267_000, 110487) + // Minimum execution time: 19_987_000 picoseconds. + Weight::from_parts(20_860_000, 110487) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } - /// Storage: Referenda ReferendumInfoFor (r:1 w:1) - /// Proof: Referenda ReferendumInfoFor (max_values: None, max_size: Some(366), added: 2841, mode: MaxEncodedLen) + /// Storage: `Referenda::ReferendumInfoFor` (r:1 w:1) + /// Proof: `Referenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(366), added: 2841, mode: `MaxEncodedLen`) fn nudge_referendum_timed_out() -> Weight { // Proof Size summary in bytes: - // Measured: `278` + // Measured: `344` // Estimated: `3831` - // Minimum execution time: 16_388_000 picoseconds. - Weight::from_parts(16_676_000, 3831) + // Minimum execution time: 13_416_000 picoseconds. + Weight::from_parts(13_857_000, 3831) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Referenda ReferendumInfoFor (r:1 w:1) - /// Proof: Referenda ReferendumInfoFor (max_values: None, max_size: Some(366), added: 2841, mode: MaxEncodedLen) - /// Storage: Referenda DecidingCount (r:1 w:1) - /// Proof: Referenda DecidingCount (max_values: None, max_size: Some(14), added: 2489, mode: MaxEncodedLen) - /// Storage: Scheduler Agenda (r:1 w:1) - /// Proof: Scheduler Agenda (max_values: None, max_size: Some(107022), added: 109497, mode: MaxEncodedLen) + /// Storage: `Referenda::ReferendumInfoFor` (r:1 w:1) + /// Proof: `Referenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(366), added: 2841, mode: `MaxEncodedLen`) + /// Storage: `Referenda::DecidingCount` (r:1 w:1) + /// Proof: `Referenda::DecidingCount` (`max_values`: None, `max_size`: Some(14), added: 2489, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Agenda` (r:1 w:1) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`) fn nudge_referendum_begin_deciding_failing() -> Weight { // Proof Size summary in bytes: - // Measured: `381` + // Measured: `447` // Estimated: `110487` - // Minimum execution time: 32_801_000 picoseconds. - Weight::from_parts(34_053_000, 110487) + // Minimum execution time: 27_199_000 picoseconds. + Weight::from_parts(28_562_000, 110487) .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(3_u64)) } - /// Storage: Referenda ReferendumInfoFor (r:1 w:1) - /// Proof: Referenda ReferendumInfoFor (max_values: None, max_size: Some(366), added: 2841, mode: MaxEncodedLen) - /// Storage: Referenda DecidingCount (r:1 w:1) - /// Proof: Referenda DecidingCount (max_values: None, max_size: Some(14), added: 2489, mode: MaxEncodedLen) - /// Storage: Scheduler Agenda (r:1 w:1) - /// Proof: Scheduler Agenda (max_values: None, max_size: Some(107022), added: 109497, mode: MaxEncodedLen) + /// Storage: `Referenda::ReferendumInfoFor` (r:1 w:1) + /// Proof: `Referenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(366), added: 2841, mode: `MaxEncodedLen`) + /// Storage: `Referenda::DecidingCount` (r:1 w:1) + /// Proof: `Referenda::DecidingCount` (`max_values`: None, `max_size`: Some(14), added: 2489, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Agenda` (r:1 w:1) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`) fn nudge_referendum_begin_deciding_passing() -> Weight { // Proof Size summary in bytes: - // Measured: `381` + // Measured: `447` // Estimated: `110487` - // Minimum execution time: 35_704_000 picoseconds. - Weight::from_parts(36_451_000, 110487) + // Minimum execution time: 29_205_000 picoseconds. + Weight::from_parts(30_407_000, 110487) .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(3_u64)) } - /// Storage: Referenda ReferendumInfoFor (r:1 w:1) - /// Proof: Referenda ReferendumInfoFor (max_values: None, max_size: Some(366), added: 2841, mode: MaxEncodedLen) - /// Storage: Scheduler Agenda (r:1 w:1) - /// Proof: Scheduler Agenda (max_values: None, max_size: Some(107022), added: 109497, mode: MaxEncodedLen) + /// Storage: `Referenda::ReferendumInfoFor` (r:1 w:1) + /// Proof: `Referenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(366), added: 2841, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Agenda` (r:1 w:1) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`) fn nudge_referendum_begin_confirming() -> Weight { // Proof Size summary in bytes: - // Measured: `434` + // Measured: `500` // Estimated: `110487` - // Minimum execution time: 29_151_000 picoseconds. - Weight::from_parts(30_055_000, 110487) + // Minimum execution time: 24_136_000 picoseconds. + Weight::from_parts(24_868_000, 110487) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } - /// Storage: Referenda ReferendumInfoFor (r:1 w:1) - /// Proof: Referenda ReferendumInfoFor (max_values: None, max_size: Some(366), added: 2841, mode: MaxEncodedLen) - /// Storage: Scheduler Agenda (r:1 w:1) - /// Proof: Scheduler Agenda (max_values: None, max_size: Some(107022), added: 109497, mode: MaxEncodedLen) + /// Storage: `Referenda::ReferendumInfoFor` (r:1 w:1) + /// Proof: `Referenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(366), added: 2841, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Agenda` (r:1 w:1) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`) fn nudge_referendum_end_confirming() -> Weight { // Proof Size summary in bytes: - // Measured: `417` + // Measured: `483` // Estimated: `110487` - // Minimum execution time: 29_265_000 picoseconds. - Weight::from_parts(30_213_000, 110487) + // Minimum execution time: 23_860_000 picoseconds. + Weight::from_parts(24_556_000, 110487) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } - /// Storage: Referenda ReferendumInfoFor (r:1 w:1) - /// Proof: Referenda ReferendumInfoFor (max_values: None, max_size: Some(366), added: 2841, mode: MaxEncodedLen) - /// Storage: Scheduler Agenda (r:1 w:1) - /// Proof: Scheduler Agenda (max_values: None, max_size: Some(107022), added: 109497, mode: MaxEncodedLen) + /// Storage: `Referenda::ReferendumInfoFor` (r:1 w:1) + /// Proof: `Referenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(366), added: 2841, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Agenda` (r:1 w:1) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`) fn nudge_referendum_continue_not_confirming() -> Weight { // Proof Size summary in bytes: - // Measured: `434` + // Measured: `500` // Estimated: `110487` - // Minimum execution time: 27_760_000 picoseconds. - Weight::from_parts(28_381_000, 110487) + // Minimum execution time: 23_409_000 picoseconds. + Weight::from_parts(24_354_000, 110487) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } - /// Storage: Referenda ReferendumInfoFor (r:1 w:1) - /// Proof: Referenda ReferendumInfoFor (max_values: None, max_size: Some(366), added: 2841, mode: MaxEncodedLen) - /// Storage: Scheduler Agenda (r:1 w:1) - /// Proof: Scheduler Agenda (max_values: None, max_size: Some(107022), added: 109497, mode: MaxEncodedLen) + /// Storage: `Referenda::ReferendumInfoFor` (r:1 w:1) + /// Proof: `Referenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(366), added: 2841, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Agenda` (r:1 w:1) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`) fn nudge_referendum_continue_confirming() -> Weight { // Proof Size summary in bytes: - // Measured: `438` + // Measured: `504` // Estimated: `110487` - // Minimum execution time: 25_464_000 picoseconds. - Weight::from_parts(26_348_000, 110487) + // Minimum execution time: 21_947_000 picoseconds. + Weight::from_parts(22_485_000, 110487) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } - /// Storage: Referenda ReferendumInfoFor (r:1 w:1) - /// Proof: Referenda ReferendumInfoFor (max_values: None, max_size: Some(366), added: 2841, mode: MaxEncodedLen) - /// Storage: Scheduler Agenda (r:2 w:2) - /// Proof: Scheduler Agenda (max_values: None, max_size: Some(107022), added: 109497, mode: MaxEncodedLen) - /// Storage: Scheduler Lookup (r:1 w:1) - /// Proof: Scheduler Lookup (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) + /// Storage: `Referenda::ReferendumInfoFor` (r:1 w:1) + /// Proof: `Referenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(366), added: 2841, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Agenda` (r:2 w:2) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Lookup` (r:1 w:1) + /// Proof: `Scheduler::Lookup` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) fn nudge_referendum_approved() -> Weight { // Proof Size summary in bytes: - // Measured: `438` + // Measured: `504` // Estimated: `219984` - // Minimum execution time: 42_629_000 picoseconds. - Weight::from_parts(43_732_000, 219984) + // Minimum execution time: 34_643_000 picoseconds. + Weight::from_parts(36_193_000, 219984) .saturating_add(RocksDbWeight::get().reads(4_u64)) .saturating_add(RocksDbWeight::get().writes(4_u64)) } - /// Storage: Referenda ReferendumInfoFor (r:1 w:1) - /// Proof: Referenda ReferendumInfoFor (max_values: None, max_size: Some(366), added: 2841, mode: MaxEncodedLen) - /// Storage: Scheduler Agenda (r:1 w:1) - /// Proof: Scheduler Agenda (max_values: None, max_size: Some(107022), added: 109497, mode: MaxEncodedLen) + /// Storage: `Referenda::ReferendumInfoFor` (r:1 w:1) + /// Proof: `Referenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(366), added: 2841, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Agenda` (r:1 w:1) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`) fn nudge_referendum_rejected() -> Weight { // Proof Size summary in bytes: - // Measured: `434` + // Measured: `500` // Estimated: `110487` - // Minimum execution time: 30_015_000 picoseconds. - Weight::from_parts(30_827_000, 110487) + // Minimum execution time: 24_097_000 picoseconds. + Weight::from_parts(24_881_000, 110487) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } - /// Storage: Referenda ReferendumInfoFor (r:1 w:0) - /// Proof: Referenda ReferendumInfoFor (max_values: None, max_size: Some(366), added: 2841, mode: MaxEncodedLen) - /// Storage: Preimage StatusFor (r:1 w:0) - /// Proof: Preimage StatusFor (max_values: None, max_size: Some(91), added: 2566, mode: MaxEncodedLen) - /// Storage: Referenda MetadataOf (r:0 w:1) - /// Proof: Referenda MetadataOf (max_values: None, max_size: Some(52), added: 2527, mode: MaxEncodedLen) + /// Storage: `Referenda::ReferendumInfoFor` (r:1 w:0) + /// Proof: `Referenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(366), added: 2841, mode: `MaxEncodedLen`) + /// Storage: `Preimage::StatusFor` (r:1 w:0) + /// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) + /// Storage: `Preimage::RequestStatusFor` (r:1 w:0) + /// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) + /// Storage: `Referenda::MetadataOf` (r:0 w:1) + /// Proof: `Referenda::MetadataOf` (`max_values`: None, `max_size`: Some(52), added: 2527, mode: `MaxEncodedLen`) fn set_some_metadata() -> Weight { // Proof Size summary in bytes: - // Measured: `422` + // Measured: `555` // Estimated: `3831` - // Minimum execution time: 19_901_000 picoseconds. - Weight::from_parts(20_681_000, 3831) - .saturating_add(RocksDbWeight::get().reads(2_u64)) + // Minimum execution time: 19_947_000 picoseconds. + Weight::from_parts(20_396_000, 3831) + .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Referenda ReferendumInfoFor (r:1 w:0) - /// Proof: Referenda ReferendumInfoFor (max_values: None, max_size: Some(366), added: 2841, mode: MaxEncodedLen) - /// Storage: Referenda MetadataOf (r:1 w:1) - /// Proof: Referenda MetadataOf (max_values: None, max_size: Some(52), added: 2527, mode: MaxEncodedLen) + /// Storage: `Referenda::ReferendumInfoFor` (r:1 w:0) + /// Proof: `Referenda::ReferendumInfoFor` (`max_values`: None, `max_size`: Some(366), added: 2841, mode: `MaxEncodedLen`) + /// Storage: `Referenda::MetadataOf` (r:1 w:1) + /// Proof: `Referenda::MetadataOf` (`max_values`: None, `max_size`: Some(52), added: 2527, mode: `MaxEncodedLen`) fn clear_metadata() -> Weight { // Proof Size summary in bytes: - // Measured: `355` + // Measured: `421` // Estimated: `3831` - // Minimum execution time: 17_323_000 picoseconds. - Weight::from_parts(18_227_000, 3831) + // Minimum execution time: 15_516_000 picoseconds. + Weight::from_parts(16_094_000, 3831) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } diff --git a/substrate/frame/remark/Cargo.toml b/substrate/frame/remark/Cargo.toml index 582f5958a6925c601d5b1e90c765131fc8605eca..e746b0382aea105009861aa14d4a9d9c63940556 100644 --- a/substrate/frame/remark/Cargo.toml +++ b/substrate/frame/remark/Cargo.toml @@ -17,8 +17,8 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.195", optional = true } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +serde = { optional = true, workspace = true, default-features = true } frame-benchmarking = { path = "../benchmarking", default-features = false, optional = true } frame-support = { path = "../support", default-features = false } frame-system = { path = "../system", default-features = false } diff --git a/substrate/frame/remark/src/mock.rs b/substrate/frame/remark/src/mock.rs index 5a5e6a3ccdff28ff29799ed7c31cf2c1c73c77bb..3eaac4ab43964cd16c1cd4849648a2192b23d8f8 100644 --- a/substrate/frame/remark/src/mock.rs +++ b/substrate/frame/remark/src/mock.rs @@ -18,15 +18,8 @@ //! Test environment for remarks pallet. use crate as pallet_remark; -use frame_support::{ - derive_impl, - traits::{ConstU16, ConstU32, ConstU64}, -}; -use sp_core::H256; -use sp_runtime::{ - traits::{BlakeTwo256, IdentityLookup}, - BuildStorage, -}; +use frame_support::derive_impl; +use sp_runtime::BuildStorage; pub type Block = frame_system::mocking::MockBlock; @@ -39,31 +32,9 @@ frame_support::construct_runtime!( } ); -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { - type BaseCallFilter = frame_support::traits::Everything; - type BlockWeights = (); - type BlockLength = (); - type RuntimeOrigin = RuntimeOrigin; - type RuntimeCall = RuntimeCall; - type Nonce = u64; - type Hash = H256; - type Hashing = BlakeTwo256; - type AccountId = u64; - type Lookup = IdentityLookup; type Block = Block; - type RuntimeEvent = RuntimeEvent; - type BlockHashCount = ConstU64<250>; - type DbWeight = (); - type Version = (); - type PalletInfo = PalletInfo; - type AccountData = (); - type OnNewAccount = (); - type OnKilledAccount = (); - type SystemWeightInfo = (); - type SS58Prefix = ConstU16<42>; - type OnSetCode = (); - type MaxConsumers = ConstU32<16>; } impl pallet_remark::Config for Test { diff --git a/substrate/frame/remark/src/weights.rs b/substrate/frame/remark/src/weights.rs index 46475db163ffd5827486f8ad562c2f3ecc6deb3d..8a8bdef6dd0fe74bd72d1abfa561b2b37218dafd 100644 --- a/substrate/frame/remark/src/weights.rs +++ b/substrate/frame/remark/src/weights.rs @@ -15,16 +15,16 @@ // See the License for the specific language governing permissions and // limitations under the License. -//! Autogenerated weights for pallet_remark +//! Autogenerated weights for `pallet_remark` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-06-16, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-04-09, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-e8ezs4ez-project-145-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("dev"), DB CACHE: 1024 +//! HOSTNAME: `runner-anb7yjbi-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: `1024` // Executed Command: -// ./target/production/substrate +// ./target/production/substrate-node // benchmark // pallet // --chain=dev @@ -35,12 +35,11 @@ // --no-median-slopes // --no-min-squares // --extrinsic=* -// --execution=wasm // --wasm-execution=compiled // --heap-pages=4096 -// --output=./frame/remark/src/weights.rs -// --header=./HEADER-APACHE2 -// --template=./.maintain/frame-weight-template.hbs +// --output=./substrate/frame/remark/src/weights.rs +// --header=./substrate/HEADER-APACHE2 +// --template=./substrate/.maintain/frame-weight-template.hbs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -50,12 +49,12 @@ use frame_support::{traits::Get, weights::{Weight, constants::RocksDbWeight}}; use core::marker::PhantomData; -/// Weight functions needed for pallet_remark. +/// Weight functions needed for `pallet_remark`. pub trait WeightInfo { fn store(l: u32, ) -> Weight; } -/// Weights for pallet_remark using the Substrate node and recommended hardware. +/// Weights for `pallet_remark` using the Substrate node and recommended hardware. pub struct SubstrateWeight(PhantomData); impl WeightInfo for SubstrateWeight { /// The range of component `l` is `[1, 1048576]`. @@ -63,23 +62,23 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 8_471_000 picoseconds. - Weight::from_parts(8_586_000, 0) + // Minimum execution time: 6_652_000 picoseconds. + Weight::from_parts(6_793_000, 0) // Standard Error: 0 - .saturating_add(Weight::from_parts(1_359, 0).saturating_mul(l.into())) + .saturating_add(Weight::from_parts(1_364, 0).saturating_mul(l.into())) } } -// For backwards compatibility and tests +// For backwards compatibility and tests. impl WeightInfo for () { /// The range of component `l` is `[1, 1048576]`. fn store(l: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 8_471_000 picoseconds. - Weight::from_parts(8_586_000, 0) + // Minimum execution time: 6_652_000 picoseconds. + Weight::from_parts(6_793_000, 0) // Standard Error: 0 - .saturating_add(Weight::from_parts(1_359, 0).saturating_mul(l.into())) + .saturating_add(Weight::from_parts(1_364, 0).saturating_mul(l.into())) } } diff --git a/substrate/frame/root-offences/Cargo.toml b/substrate/frame/root-offences/Cargo.toml index 80b3309506815223e77ab4658dcddaf1cef859f6..ad3dcf1f90eaf48d95cac601d397c2be673d9824 100644 --- a/substrate/frame/root-offences/Cargo.toml +++ b/substrate/frame/root-offences/Cargo.toml @@ -17,7 +17,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } pallet-session = { path = "../session", default-features = false, features = ["historical"] } pallet-staking = { path = "../staking", default-features = false } diff --git a/substrate/frame/root-offences/src/mock.rs b/substrate/frame/root-offences/src/mock.rs index b0f346032b95e79fafa189c04fb612a8f7728fa6..626db138c2bf955b5d8b6b018f28f7e01acd753a 100644 --- a/substrate/frame/root-offences/src/mock.rs +++ b/substrate/frame/root-offences/src/mock.rs @@ -27,13 +27,7 @@ use frame_support::{ traits::{ConstU32, ConstU64, Hooks, OneSessionHandler}, }; use pallet_staking::StakerStatus; -use sp_core::H256; -use sp_runtime::{ - curve::PiecewiseLinear, - testing::UintAuthorityId, - traits::{BlakeTwo256, IdentityLookup, Zero}, - BuildStorage, -}; +use sp_runtime::{curve::PiecewiseLinear, testing::UintAuthorityId, traits::Zero, BuildStorage}; use sp_staking::{EraIndex, SessionIndex}; use sp_std::collections::btree_map::BTreeMap; @@ -84,31 +78,10 @@ impl sp_runtime::BoundToRuntimeAppPublic for OtherSessionHandler { type Public = UintAuthorityId; } -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { - type BaseCallFilter = frame_support::traits::Everything; - type BlockWeights = (); - type BlockLength = (); - type DbWeight = (); - type RuntimeOrigin = RuntimeOrigin; - type Nonce = u64; - type Hash = H256; - type RuntimeCall = RuntimeCall; - type Hashing = BlakeTwo256; - type AccountId = u64; - type Lookup = IdentityLookup; type Block = Block; - type RuntimeEvent = RuntimeEvent; - type BlockHashCount = ConstU64<250>; - type Version = (); - type PalletInfo = PalletInfo; type AccountData = pallet_balances::AccountData; - type OnNewAccount = (); - type OnKilledAccount = (); - type SystemWeightInfo = (); - type SS58Prefix = (); - type OnSetCode = (); - type MaxConsumers = ConstU32<16>; } impl pallet_balances::Config for Test { diff --git a/substrate/frame/root-testing/Cargo.toml b/substrate/frame/root-testing/Cargo.toml index 51b72665b81a5edef0ec0709c26450de5a59eaeb..bf14516ee32281558cbfba28d23f1e9f8526350a 100644 --- a/substrate/frame/root-testing/Cargo.toml +++ b/substrate/frame/root-testing/Cargo.toml @@ -17,7 +17,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } frame-support = { path = "../support", default-features = false } frame-system = { path = "../system", default-features = false } sp-core = { path = "../../primitives/core", default-features = false } diff --git a/substrate/frame/root-testing/src/lib.rs b/substrate/frame/root-testing/src/lib.rs index 51fd835409aef4bfe58f8f97c4df88e130c965a5..98e1f5c5b668d04f7638087bda9be9d81bc12484 100644 --- a/substrate/frame/root-testing/src/lib.rs +++ b/substrate/frame/root-testing/src/lib.rs @@ -17,7 +17,7 @@ //! # Root Testing Pallet //! -//! Pallet that contains extrinsics that can be usefull in testing. +//! Pallet that contains extrinsics that can be useful in testing. //! //! NOTE: This pallet should only be used for testing purposes and should not be used in production //! runtimes! diff --git a/substrate/frame/safe-mode/Cargo.toml b/substrate/frame/safe-mode/Cargo.toml index 0c59740bef30a8169490ddd27be7898b975c82ff..b6b7e5a67e481a75914207410afe64a8c5b38280 100644 --- a/substrate/frame/safe-mode/Cargo.toml +++ b/substrate/frame/safe-mode/Cargo.toml @@ -16,11 +16,11 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.2.2", default-features = false, features = ["derive"] } -docify = "0.2.7" +docify = "0.2.8" frame-benchmarking = { path = "../benchmarking", default-features = false, optional = true } frame-support = { path = "../support", default-features = false } frame-system = { path = "../system", default-features = false } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } sp-arithmetic = { path = "../../primitives/arithmetic", default-features = false } sp-runtime = { path = "../../primitives/runtime", default-features = false } sp-std = { path = "../../primitives/std", default-features = false } diff --git a/substrate/frame/safe-mode/src/lib.rs b/substrate/frame/safe-mode/src/lib.rs index 325d751e17f61e6af9094fa3fc515c95a0edfdb8..2bf2ebee0a4ac88aebe6d2ccc498ac8b5d958352 100644 --- a/substrate/frame/safe-mode/src/lib.rs +++ b/substrate/frame/safe-mode/src/lib.rs @@ -79,6 +79,7 @@ pub mod mock; mod tests; pub mod weights; +use core::convert::TryInto; use frame_support::{ defensive_assert, pallet_prelude::*, @@ -96,7 +97,6 @@ use frame_support::{ use frame_system::pallet_prelude::*; use sp_arithmetic::traits::Zero; use sp_runtime::traits::Saturating; -use sp_std::{convert::TryInto, prelude::*}; pub use pallet::*; pub use weights::*; diff --git a/substrate/frame/safe-mode/src/mock.rs b/substrate/frame/safe-mode/src/mock.rs index b4d7a624ea21751fe0dc88d7059ccecc130036b4..fbfc16f4aa2881b25db9b27c3be3c53973a925ab 100644 --- a/substrate/frame/safe-mode/src/mock.rs +++ b/substrate/frame/safe-mode/src/mock.rs @@ -33,7 +33,7 @@ use sp_runtime::{ BuildStorage, }; -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { type BaseCallFilter = InsideBoth; type BlockWeights = (); diff --git a/substrate/frame/safe-mode/src/weights.rs b/substrate/frame/safe-mode/src/weights.rs index f72bebcab9a4db74fba3ef282692324e32858fc3..c2ce2cfab9b9b9c6c7343d9c75aee40b1cd6bde6 100644 --- a/substrate/frame/safe-mode/src/weights.rs +++ b/substrate/frame/safe-mode/src/weights.rs @@ -17,27 +17,29 @@ //! Autogenerated weights for `pallet_safe_mode` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-08-24, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-04-09, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-aahe6cbd-project-145-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! HOSTNAME: `runner-anb7yjbi-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: `1024` // Executed Command: -// target/production/substrate-node +// ./target/production/substrate-node // benchmark // pallet +// --chain=dev // --steps=50 // --repeat=20 +// --pallet=pallet_safe_mode +// --no-storage-info +// --no-median-slopes +// --no-min-squares // --extrinsic=* // --wasm-execution=compiled // --heap-pages=4096 -// --json-file=/builds/parity/mirrors/substrate/.git/.artifacts/bench.json -// --pallet=pallet_safe_mode -// --chain=dev -// --header=./HEADER-APACHE2 -// --output=./frame/safe-mode/src/weights.rs -// --template=./.maintain/frame-weight-template.hbs +// --output=./substrate/frame/safe-mode/src/weights.rs +// --header=./substrate/HEADER-APACHE2 +// --template=./substrate/.maintain/frame-weight-template.hbs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -70,8 +72,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `142` // Estimated: `1489` - // Minimum execution time: 2_500_000 picoseconds. - Weight::from_parts(2_594_000, 1489) + // Minimum execution time: 2_152_000 picoseconds. + Weight::from_parts(2_283_000, 1489) .saturating_add(T::DbWeight::get().reads(1_u64)) } /// Storage: `SafeMode::EnteredUntil` (r:1 w:1) @@ -80,23 +82,23 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `169` // Estimated: `1489` - // Minimum execution time: 8_868_000 picoseconds. - Weight::from_parts(9_415_000, 1489) + // Minimum execution time: 6_657_000 picoseconds. + Weight::from_parts(6_955_000, 1489) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } /// Storage: `SafeMode::EnteredUntil` (r:1 w:1) /// Proof: `SafeMode::EnteredUntil` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) /// Storage: `Balances::Holds` (r:1 w:1) - /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(85), added: 2560, mode: `MaxEncodedLen`) + /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(193), added: 2668, mode: `MaxEncodedLen`) /// Storage: `SafeMode::Deposits` (r:0 w:1) /// Proof: `SafeMode::Deposits` (`max_values`: None, `max_size`: Some(68), added: 2543, mode: `MaxEncodedLen`) fn enter() -> Weight { // Proof Size summary in bytes: // Measured: `142` - // Estimated: `3550` - // Minimum execution time: 50_541_000 picoseconds. - Weight::from_parts(51_558_000, 3550) + // Estimated: `3658` + // Minimum execution time: 49_366_000 picoseconds. + Weight::from_parts(50_506_000, 3658) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(3_u64)) } @@ -106,23 +108,23 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `142` // Estimated: `1489` - // Minimum execution time: 10_489_000 picoseconds. - Weight::from_parts(10_833_000, 1489) + // Minimum execution time: 7_843_000 picoseconds. + Weight::from_parts(8_205_000, 1489) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } /// Storage: `SafeMode::EnteredUntil` (r:1 w:1) /// Proof: `SafeMode::EnteredUntil` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) /// Storage: `Balances::Holds` (r:1 w:1) - /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(85), added: 2560, mode: `MaxEncodedLen`) + /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(193), added: 2668, mode: `MaxEncodedLen`) /// Storage: `SafeMode::Deposits` (r:0 w:1) /// Proof: `SafeMode::Deposits` (`max_values`: None, `max_size`: Some(68), added: 2543, mode: `MaxEncodedLen`) fn extend() -> Weight { // Proof Size summary in bytes: // Measured: `169` - // Estimated: `3550` - // Minimum execution time: 50_818_000 picoseconds. - Weight::from_parts(51_873_000, 3550) + // Estimated: `3658` + // Minimum execution time: 50_487_000 picoseconds. + Weight::from_parts(52_101_000, 3658) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(3_u64)) } @@ -132,8 +134,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `169` // Estimated: `1489` - // Minimum execution time: 10_843_000 picoseconds. - Weight::from_parts(11_314_000, 1489) + // Minimum execution time: 8_517_000 picoseconds. + Weight::from_parts(8_894_000, 1489) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -143,8 +145,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `169` // Estimated: `1489` - // Minimum execution time: 10_382_000 picoseconds. - Weight::from_parts(10_814_000, 1489) + // Minimum execution time: 8_451_000 picoseconds. + Weight::from_parts(8_745_000, 1489) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -153,39 +155,39 @@ impl WeightInfo for SubstrateWeight { /// Storage: `SafeMode::EnteredUntil` (r:1 w:0) /// Proof: `SafeMode::EnteredUntil` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) /// Storage: `Balances::Holds` (r:1 w:1) - /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(85), added: 2560, mode: `MaxEncodedLen`) + /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(193), added: 2668, mode: `MaxEncodedLen`) fn release_deposit() -> Weight { // Proof Size summary in bytes: // Measured: `292` - // Estimated: `3550` - // Minimum execution time: 42_828_000 picoseconds. - Weight::from_parts(43_752_000, 3550) + // Estimated: `3658` + // Minimum execution time: 42_504_000 picoseconds. + Weight::from_parts(45_493_000, 3658) .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } /// Storage: `SafeMode::Deposits` (r:1 w:1) /// Proof: `SafeMode::Deposits` (`max_values`: None, `max_size`: Some(68), added: 2543, mode: `MaxEncodedLen`) /// Storage: `Balances::Holds` (r:1 w:1) - /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(85), added: 2560, mode: `MaxEncodedLen`) + /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(193), added: 2668, mode: `MaxEncodedLen`) fn force_release_deposit() -> Weight { // Proof Size summary in bytes: // Measured: `292` - // Estimated: `3550` - // Minimum execution time: 40_196_000 picoseconds. - Weight::from_parts(41_298_000, 3550) + // Estimated: `3658` + // Minimum execution time: 40_864_000 picoseconds. + Weight::from_parts(41_626_000, 3658) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } /// Storage: `SafeMode::Deposits` (r:1 w:1) /// Proof: `SafeMode::Deposits` (`max_values`: None, `max_size`: Some(68), added: 2543, mode: `MaxEncodedLen`) /// Storage: `Balances::Holds` (r:1 w:1) - /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(85), added: 2560, mode: `MaxEncodedLen`) + /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(193), added: 2668, mode: `MaxEncodedLen`) fn force_slash_deposit() -> Weight { // Proof Size summary in bytes: // Measured: `292` - // Estimated: `3550` - // Minimum execution time: 33_660_000 picoseconds. - Weight::from_parts(34_426_000, 3550) + // Estimated: `3658` + // Minimum execution time: 31_943_000 picoseconds. + Weight::from_parts(33_033_000, 3658) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } @@ -199,8 +201,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `142` // Estimated: `1489` - // Minimum execution time: 2_500_000 picoseconds. - Weight::from_parts(2_594_000, 1489) + // Minimum execution time: 2_152_000 picoseconds. + Weight::from_parts(2_283_000, 1489) .saturating_add(RocksDbWeight::get().reads(1_u64)) } /// Storage: `SafeMode::EnteredUntil` (r:1 w:1) @@ -209,23 +211,23 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `169` // Estimated: `1489` - // Minimum execution time: 8_868_000 picoseconds. - Weight::from_parts(9_415_000, 1489) + // Minimum execution time: 6_657_000 picoseconds. + Weight::from_parts(6_955_000, 1489) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } /// Storage: `SafeMode::EnteredUntil` (r:1 w:1) /// Proof: `SafeMode::EnteredUntil` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) /// Storage: `Balances::Holds` (r:1 w:1) - /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(85), added: 2560, mode: `MaxEncodedLen`) + /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(193), added: 2668, mode: `MaxEncodedLen`) /// Storage: `SafeMode::Deposits` (r:0 w:1) /// Proof: `SafeMode::Deposits` (`max_values`: None, `max_size`: Some(68), added: 2543, mode: `MaxEncodedLen`) fn enter() -> Weight { // Proof Size summary in bytes: // Measured: `142` - // Estimated: `3550` - // Minimum execution time: 50_541_000 picoseconds. - Weight::from_parts(51_558_000, 3550) + // Estimated: `3658` + // Minimum execution time: 49_366_000 picoseconds. + Weight::from_parts(50_506_000, 3658) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(3_u64)) } @@ -235,23 +237,23 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `142` // Estimated: `1489` - // Minimum execution time: 10_489_000 picoseconds. - Weight::from_parts(10_833_000, 1489) + // Minimum execution time: 7_843_000 picoseconds. + Weight::from_parts(8_205_000, 1489) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } /// Storage: `SafeMode::EnteredUntil` (r:1 w:1) /// Proof: `SafeMode::EnteredUntil` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) /// Storage: `Balances::Holds` (r:1 w:1) - /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(85), added: 2560, mode: `MaxEncodedLen`) + /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(193), added: 2668, mode: `MaxEncodedLen`) /// Storage: `SafeMode::Deposits` (r:0 w:1) /// Proof: `SafeMode::Deposits` (`max_values`: None, `max_size`: Some(68), added: 2543, mode: `MaxEncodedLen`) fn extend() -> Weight { // Proof Size summary in bytes: // Measured: `169` - // Estimated: `3550` - // Minimum execution time: 50_818_000 picoseconds. - Weight::from_parts(51_873_000, 3550) + // Estimated: `3658` + // Minimum execution time: 50_487_000 picoseconds. + Weight::from_parts(52_101_000, 3658) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(3_u64)) } @@ -261,8 +263,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `169` // Estimated: `1489` - // Minimum execution time: 10_843_000 picoseconds. - Weight::from_parts(11_314_000, 1489) + // Minimum execution time: 8_517_000 picoseconds. + Weight::from_parts(8_894_000, 1489) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -272,8 +274,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `169` // Estimated: `1489` - // Minimum execution time: 10_382_000 picoseconds. - Weight::from_parts(10_814_000, 1489) + // Minimum execution time: 8_451_000 picoseconds. + Weight::from_parts(8_745_000, 1489) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -282,39 +284,39 @@ impl WeightInfo for () { /// Storage: `SafeMode::EnteredUntil` (r:1 w:0) /// Proof: `SafeMode::EnteredUntil` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) /// Storage: `Balances::Holds` (r:1 w:1) - /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(85), added: 2560, mode: `MaxEncodedLen`) + /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(193), added: 2668, mode: `MaxEncodedLen`) fn release_deposit() -> Weight { // Proof Size summary in bytes: // Measured: `292` - // Estimated: `3550` - // Minimum execution time: 42_828_000 picoseconds. - Weight::from_parts(43_752_000, 3550) + // Estimated: `3658` + // Minimum execution time: 42_504_000 picoseconds. + Weight::from_parts(45_493_000, 3658) .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } /// Storage: `SafeMode::Deposits` (r:1 w:1) /// Proof: `SafeMode::Deposits` (`max_values`: None, `max_size`: Some(68), added: 2543, mode: `MaxEncodedLen`) /// Storage: `Balances::Holds` (r:1 w:1) - /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(85), added: 2560, mode: `MaxEncodedLen`) + /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(193), added: 2668, mode: `MaxEncodedLen`) fn force_release_deposit() -> Weight { // Proof Size summary in bytes: // Measured: `292` - // Estimated: `3550` - // Minimum execution time: 40_196_000 picoseconds. - Weight::from_parts(41_298_000, 3550) + // Estimated: `3658` + // Minimum execution time: 40_864_000 picoseconds. + Weight::from_parts(41_626_000, 3658) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } /// Storage: `SafeMode::Deposits` (r:1 w:1) /// Proof: `SafeMode::Deposits` (`max_values`: None, `max_size`: Some(68), added: 2543, mode: `MaxEncodedLen`) /// Storage: `Balances::Holds` (r:1 w:1) - /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(85), added: 2560, mode: `MaxEncodedLen`) + /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(193), added: 2668, mode: `MaxEncodedLen`) fn force_slash_deposit() -> Weight { // Proof Size summary in bytes: // Measured: `292` - // Estimated: `3550` - // Minimum execution time: 33_660_000 picoseconds. - Weight::from_parts(34_426_000, 3550) + // Estimated: `3658` + // Minimum execution time: 31_943_000 picoseconds. + Weight::from_parts(33_033_000, 3658) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } diff --git a/substrate/frame/salary/Cargo.toml b/substrate/frame/salary/Cargo.toml index 90a44da1a10459410240506b22c944efab35a6e7..8c77edcb173a03ed4ed8a8c039c3e670d4bf02ce 100644 --- a/substrate/frame/salary/Cargo.toml +++ b/substrate/frame/salary/Cargo.toml @@ -17,8 +17,8 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } -log = { version = "0.4.16", default-features = false } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +log = { workspace = true } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } frame-benchmarking = { path = "../benchmarking", default-features = false, optional = true } frame-support = { path = "../support", default-features = false } frame-system = { path = "../system", default-features = false } diff --git a/substrate/frame/salary/src/lib.rs b/substrate/frame/salary/src/lib.rs index 18e5c624218c58e7c696129be8541934bb6ef851..efb4f5d3c5422d96b2b2038122de8c2d391cc855 100644 --- a/substrate/frame/salary/src/lib.rs +++ b/substrate/frame/salary/src/lib.rs @@ -18,13 +18,12 @@ //! Make periodic payment to members of a ranked collective according to rank. #![cfg_attr(not(feature = "std"), no_std)] -#![recursion_limit = "128"] use codec::{Decode, Encode, MaxEncodedLen}; +use core::marker::PhantomData; use scale_info::TypeInfo; use sp_arithmetic::traits::{Saturating, Zero}; use sp_runtime::{Perbill, RuntimeDebug}; -use sp_std::{marker::PhantomData, prelude::*}; use frame_support::{ defensive, diff --git a/substrate/frame/salary/src/tests/integration.rs b/substrate/frame/salary/src/tests/integration.rs index bf1e82b028c6da58e5705fae62b30b95a40e215c..124ab38c5651b1e3c57d0457952eda8cd5b92e98 100644 --- a/substrate/frame/salary/src/tests/integration.rs +++ b/substrate/frame/salary/src/tests/integration.rs @@ -26,7 +26,7 @@ use frame_support::{ use pallet_ranked_collective::{EnsureRanked, Geometric, TallyOf, Votes}; use sp_core::{ConstU16, Get}; use sp_runtime::{ - traits::{Convert, ReduceBy}, + traits::{Convert, ReduceBy, ReplaceWithDefault}, BuildStorage, DispatchError, }; @@ -50,7 +50,7 @@ parameter_types! { frame_system::limits::BlockWeights::simple_max(Weight::from_parts(1_000_000, 0)); } -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { type Block = Block; } @@ -162,12 +162,14 @@ impl pallet_ranked_collective::Config for Test { // Members can promote up to the rank of 2 below them. MapSuccess, ReduceBy>>, >; + type AddOrigin = MapSuccess>; type DemoteOrigin = EitherOf< // Root can demote arbitrarily. frame_system::EnsureRootWithSuccess>, // Members can demote up to the rank of 3 below them. MapSuccess, ReduceBy>>, >; + type RemoveOrigin = Self::DemoteOrigin; type ExchangeOrigin = EitherOf< // Root can exchange arbitrarily. frame_system::EnsureRootWithSuccess>, @@ -248,7 +250,7 @@ fn swap_exhaustive_works() { }); assert_eq!(root_add, root_swap); - // Ensure that we dont compare trivial stuff like `()` from a type error above. + // Ensure that we don't compare trivial stuff like `()` from a type error above. assert_eq!(root_add.len(), 32); }); } diff --git a/substrate/frame/salary/src/tests/unit.rs b/substrate/frame/salary/src/tests/unit.rs index 07ef5ce63d5b981ecf523632ef7754b9c599f82f..db1c8b947ef57c7c1919568f5bf0545f0449994d 100644 --- a/substrate/frame/salary/src/tests/unit.rs +++ b/substrate/frame/salary/src/tests/unit.rs @@ -19,6 +19,7 @@ use std::collections::BTreeMap; +use core::cell::RefCell; use frame_support::{ assert_noop, assert_ok, derive_impl, pallet_prelude::Weight, @@ -26,7 +27,6 @@ use frame_support::{ traits::{tokens::ConvertRank, ConstU64}, }; use sp_runtime::{traits::Identity, BuildStorage, DispatchResult}; -use sp_std::cell::RefCell; use crate as pallet_salary; use crate::*; @@ -46,7 +46,7 @@ parameter_types! { frame_system::limits::BlockWeights::simple_max(Weight::from_parts(1_000_000, 0)); } -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { type Block = Block; } @@ -508,7 +508,7 @@ fn zero_payment_fails() { } #[test] -fn unregistered_bankrupcy_fails_gracefully() { +fn unregistered_bankruptcy_fails_gracefully() { new_test_ext().execute_with(|| { assert_ok!(Salary::init(RuntimeOrigin::signed(1))); set_rank(1, 2); @@ -532,7 +532,7 @@ fn unregistered_bankrupcy_fails_gracefully() { } #[test] -fn registered_bankrupcy_fails_gracefully() { +fn registered_bankruptcy_fails_gracefully() { new_test_ext().execute_with(|| { assert_ok!(Salary::init(RuntimeOrigin::signed(1))); set_rank(1, 2); @@ -561,7 +561,7 @@ fn registered_bankrupcy_fails_gracefully() { } #[test] -fn mixed_bankrupcy_fails_gracefully() { +fn mixed_bankruptcy_fails_gracefully() { new_test_ext().execute_with(|| { assert_ok!(Salary::init(RuntimeOrigin::signed(1))); set_rank(1, 2); @@ -589,7 +589,7 @@ fn mixed_bankrupcy_fails_gracefully() { } #[test] -fn other_mixed_bankrupcy_fails_gracefully() { +fn other_mixed_bankruptcy_fails_gracefully() { new_test_ext().execute_with(|| { assert_ok!(Salary::init(RuntimeOrigin::signed(1))); set_rank(1, 2); diff --git a/substrate/frame/salary/src/weights.rs b/substrate/frame/salary/src/weights.rs index 3d3b9e315959be023cfe09ae00e993cabedea99a..d4e6331919b6042dd4762f52adfc486848bcec3a 100644 --- a/substrate/frame/salary/src/weights.rs +++ b/substrate/frame/salary/src/weights.rs @@ -15,16 +15,16 @@ // See the License for the specific language governing permissions and // limitations under the License. -//! Autogenerated weights for pallet_salary +//! Autogenerated weights for `pallet_salary` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-06-16, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-04-09, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-e8ezs4ez-project-145-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("dev"), DB CACHE: 1024 +//! HOSTNAME: `runner-anb7yjbi-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: `1024` // Executed Command: -// ./target/production/substrate +// ./target/production/substrate-node // benchmark // pallet // --chain=dev @@ -35,12 +35,11 @@ // --no-median-slopes // --no-min-squares // --extrinsic=* -// --execution=wasm // --wasm-execution=compiled // --heap-pages=4096 -// --output=./frame/salary/src/weights.rs -// --header=./HEADER-APACHE2 -// --template=./.maintain/frame-weight-template.hbs +// --output=./substrate/frame/salary/src/weights.rs +// --header=./substrate/HEADER-APACHE2 +// --template=./substrate/.maintain/frame-weight-template.hbs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -50,7 +49,7 @@ use frame_support::{traits::Get, weights::{Weight, constants::RocksDbWeight}}; use core::marker::PhantomData; -/// Weight functions needed for pallet_salary. +/// Weight functions needed for `pallet_salary`. pub trait WeightInfo { fn init() -> Weight; fn bump() -> Weight; @@ -61,204 +60,204 @@ pub trait WeightInfo { fn check_payment() -> Weight; } -/// Weights for pallet_salary using the Substrate node and recommended hardware. +/// Weights for `pallet_salary` using the Substrate node and recommended hardware. pub struct SubstrateWeight(PhantomData); impl WeightInfo for SubstrateWeight { - /// Storage: Salary Status (r:1 w:1) - /// Proof: Salary Status (max_values: Some(1), max_size: Some(56), added: 551, mode: MaxEncodedLen) + /// Storage: `Salary::Status` (r:1 w:1) + /// Proof: `Salary::Status` (`max_values`: Some(1), `max_size`: Some(56), added: 551, mode: `MaxEncodedLen`) fn init() -> Weight { // Proof Size summary in bytes: // Measured: `4` // Estimated: `1541` - // Minimum execution time: 10_778_000 picoseconds. - Weight::from_parts(11_084_000, 1541) + // Minimum execution time: 7_382_000 picoseconds. + Weight::from_parts(7_793_000, 1541) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: Salary Status (r:1 w:1) - /// Proof: Salary Status (max_values: Some(1), max_size: Some(56), added: 551, mode: MaxEncodedLen) + /// Storage: `Salary::Status` (r:1 w:1) + /// Proof: `Salary::Status` (`max_values`: Some(1), `max_size`: Some(56), added: 551, mode: `MaxEncodedLen`) fn bump() -> Weight { // Proof Size summary in bytes: // Measured: `86` // Estimated: `1541` - // Minimum execution time: 12_042_000 picoseconds. - Weight::from_parts(12_645_000, 1541) + // Minimum execution time: 8_744_000 picoseconds. + Weight::from_parts(9_216_000, 1541) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: Salary Status (r:1 w:0) - /// Proof: Salary Status (max_values: Some(1), max_size: Some(56), added: 551, mode: MaxEncodedLen) - /// Storage: RankedCollective Members (r:1 w:0) - /// Proof: RankedCollective Members (max_values: None, max_size: Some(42), added: 2517, mode: MaxEncodedLen) - /// Storage: Salary Claimant (r:1 w:1) - /// Proof: Salary Claimant (max_values: None, max_size: Some(78), added: 2553, mode: MaxEncodedLen) + /// Storage: `Salary::Status` (r:1 w:0) + /// Proof: `Salary::Status` (`max_values`: Some(1), `max_size`: Some(56), added: 551, mode: `MaxEncodedLen`) + /// Storage: `RankedCollective::Members` (r:1 w:0) + /// Proof: `RankedCollective::Members` (`max_values`: None, `max_size`: Some(42), added: 2517, mode: `MaxEncodedLen`) + /// Storage: `Salary::Claimant` (r:1 w:1) + /// Proof: `Salary::Claimant` (`max_values`: None, `max_size`: Some(78), added: 2553, mode: `MaxEncodedLen`) fn induct() -> Weight { // Proof Size summary in bytes: // Measured: `395` // Estimated: `3543` - // Minimum execution time: 18_374_000 picoseconds. - Weight::from_parts(19_200_000, 3543) + // Minimum execution time: 16_728_000 picoseconds. + Weight::from_parts(17_387_000, 3543) .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: RankedCollective Members (r:1 w:0) - /// Proof: RankedCollective Members (max_values: None, max_size: Some(42), added: 2517, mode: MaxEncodedLen) - /// Storage: Salary Status (r:1 w:1) - /// Proof: Salary Status (max_values: Some(1), max_size: Some(56), added: 551, mode: MaxEncodedLen) - /// Storage: Salary Claimant (r:1 w:1) - /// Proof: Salary Claimant (max_values: None, max_size: Some(78), added: 2553, mode: MaxEncodedLen) + /// Storage: `RankedCollective::Members` (r:1 w:0) + /// Proof: `RankedCollective::Members` (`max_values`: None, `max_size`: Some(42), added: 2517, mode: `MaxEncodedLen`) + /// Storage: `Salary::Status` (r:1 w:1) + /// Proof: `Salary::Status` (`max_values`: Some(1), `max_size`: Some(56), added: 551, mode: `MaxEncodedLen`) + /// Storage: `Salary::Claimant` (r:1 w:1) + /// Proof: `Salary::Claimant` (`max_values`: None, `max_size`: Some(78), added: 2553, mode: `MaxEncodedLen`) fn register() -> Weight { // Proof Size summary in bytes: // Measured: `462` // Estimated: `3543` - // Minimum execution time: 22_696_000 picoseconds. - Weight::from_parts(23_275_000, 3543) + // Minimum execution time: 19_744_000 picoseconds. + Weight::from_parts(20_225_000, 3543) .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } - /// Storage: Salary Status (r:1 w:1) - /// Proof: Salary Status (max_values: Some(1), max_size: Some(56), added: 551, mode: MaxEncodedLen) - /// Storage: Salary Claimant (r:1 w:1) - /// Proof: Salary Claimant (max_values: None, max_size: Some(78), added: 2553, mode: MaxEncodedLen) - /// Storage: RankedCollective Members (r:1 w:0) - /// Proof: RankedCollective Members (max_values: None, max_size: Some(42), added: 2517, mode: MaxEncodedLen) + /// Storage: `Salary::Status` (r:1 w:1) + /// Proof: `Salary::Status` (`max_values`: Some(1), `max_size`: Some(56), added: 551, mode: `MaxEncodedLen`) + /// Storage: `Salary::Claimant` (r:1 w:1) + /// Proof: `Salary::Claimant` (`max_values`: None, `max_size`: Some(78), added: 2553, mode: `MaxEncodedLen`) + /// Storage: `RankedCollective::Members` (r:1 w:0) + /// Proof: `RankedCollective::Members` (`max_values`: None, `max_size`: Some(42), added: 2517, mode: `MaxEncodedLen`) fn payout() -> Weight { // Proof Size summary in bytes: // Measured: `462` // Estimated: `3543` - // Minimum execution time: 63_660_000 picoseconds. - Weight::from_parts(65_006_000, 3543) + // Minimum execution time: 56_084_000 picoseconds. + Weight::from_parts(58_484_000, 3543) .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } - /// Storage: Salary Status (r:1 w:1) - /// Proof: Salary Status (max_values: Some(1), max_size: Some(56), added: 551, mode: MaxEncodedLen) - /// Storage: Salary Claimant (r:1 w:1) - /// Proof: Salary Claimant (max_values: None, max_size: Some(78), added: 2553, mode: MaxEncodedLen) - /// Storage: RankedCollective Members (r:1 w:0) - /// Proof: RankedCollective Members (max_values: None, max_size: Some(42), added: 2517, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: `Salary::Status` (r:1 w:1) + /// Proof: `Salary::Status` (`max_values`: Some(1), `max_size`: Some(56), added: 551, mode: `MaxEncodedLen`) + /// Storage: `Salary::Claimant` (r:1 w:1) + /// Proof: `Salary::Claimant` (`max_values`: None, `max_size`: Some(78), added: 2553, mode: `MaxEncodedLen`) + /// Storage: `RankedCollective::Members` (r:1 w:0) + /// Proof: `RankedCollective::Members` (`max_values`: None, `max_size`: Some(42), added: 2517, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) fn payout_other() -> Weight { // Proof Size summary in bytes: // Measured: `462` // Estimated: `3593` - // Minimum execution time: 64_706_000 picoseconds. - Weight::from_parts(65_763_000, 3593) + // Minimum execution time: 57_341_000 picoseconds. + Weight::from_parts(59_882_000, 3593) .saturating_add(T::DbWeight::get().reads(4_u64)) .saturating_add(T::DbWeight::get().writes(3_u64)) } - /// Storage: Salary Status (r:1 w:1) - /// Proof: Salary Status (max_values: Some(1), max_size: Some(56), added: 551, mode: MaxEncodedLen) - /// Storage: Salary Claimant (r:1 w:1) - /// Proof: Salary Claimant (max_values: None, max_size: Some(78), added: 2553, mode: MaxEncodedLen) + /// Storage: `Salary::Status` (r:1 w:1) + /// Proof: `Salary::Status` (`max_values`: Some(1), `max_size`: Some(56), added: 551, mode: `MaxEncodedLen`) + /// Storage: `Salary::Claimant` (r:1 w:1) + /// Proof: `Salary::Claimant` (`max_values`: None, `max_size`: Some(78), added: 2553, mode: `MaxEncodedLen`) fn check_payment() -> Weight { // Proof Size summary in bytes: // Measured: `170` // Estimated: `3543` - // Minimum execution time: 11_838_000 picoseconds. - Weight::from_parts(12_323_000, 3543) + // Minimum execution time: 10_788_000 picoseconds. + Weight::from_parts(11_109_000, 3543) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } } -// For backwards compatibility and tests +// For backwards compatibility and tests. impl WeightInfo for () { - /// Storage: Salary Status (r:1 w:1) - /// Proof: Salary Status (max_values: Some(1), max_size: Some(56), added: 551, mode: MaxEncodedLen) + /// Storage: `Salary::Status` (r:1 w:1) + /// Proof: `Salary::Status` (`max_values`: Some(1), `max_size`: Some(56), added: 551, mode: `MaxEncodedLen`) fn init() -> Weight { // Proof Size summary in bytes: // Measured: `4` // Estimated: `1541` - // Minimum execution time: 10_778_000 picoseconds. - Weight::from_parts(11_084_000, 1541) + // Minimum execution time: 7_382_000 picoseconds. + Weight::from_parts(7_793_000, 1541) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Salary Status (r:1 w:1) - /// Proof: Salary Status (max_values: Some(1), max_size: Some(56), added: 551, mode: MaxEncodedLen) + /// Storage: `Salary::Status` (r:1 w:1) + /// Proof: `Salary::Status` (`max_values`: Some(1), `max_size`: Some(56), added: 551, mode: `MaxEncodedLen`) fn bump() -> Weight { // Proof Size summary in bytes: // Measured: `86` // Estimated: `1541` - // Minimum execution time: 12_042_000 picoseconds. - Weight::from_parts(12_645_000, 1541) + // Minimum execution time: 8_744_000 picoseconds. + Weight::from_parts(9_216_000, 1541) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Salary Status (r:1 w:0) - /// Proof: Salary Status (max_values: Some(1), max_size: Some(56), added: 551, mode: MaxEncodedLen) - /// Storage: RankedCollective Members (r:1 w:0) - /// Proof: RankedCollective Members (max_values: None, max_size: Some(42), added: 2517, mode: MaxEncodedLen) - /// Storage: Salary Claimant (r:1 w:1) - /// Proof: Salary Claimant (max_values: None, max_size: Some(78), added: 2553, mode: MaxEncodedLen) + /// Storage: `Salary::Status` (r:1 w:0) + /// Proof: `Salary::Status` (`max_values`: Some(1), `max_size`: Some(56), added: 551, mode: `MaxEncodedLen`) + /// Storage: `RankedCollective::Members` (r:1 w:0) + /// Proof: `RankedCollective::Members` (`max_values`: None, `max_size`: Some(42), added: 2517, mode: `MaxEncodedLen`) + /// Storage: `Salary::Claimant` (r:1 w:1) + /// Proof: `Salary::Claimant` (`max_values`: None, `max_size`: Some(78), added: 2553, mode: `MaxEncodedLen`) fn induct() -> Weight { // Proof Size summary in bytes: // Measured: `395` // Estimated: `3543` - // Minimum execution time: 18_374_000 picoseconds. - Weight::from_parts(19_200_000, 3543) + // Minimum execution time: 16_728_000 picoseconds. + Weight::from_parts(17_387_000, 3543) .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: RankedCollective Members (r:1 w:0) - /// Proof: RankedCollective Members (max_values: None, max_size: Some(42), added: 2517, mode: MaxEncodedLen) - /// Storage: Salary Status (r:1 w:1) - /// Proof: Salary Status (max_values: Some(1), max_size: Some(56), added: 551, mode: MaxEncodedLen) - /// Storage: Salary Claimant (r:1 w:1) - /// Proof: Salary Claimant (max_values: None, max_size: Some(78), added: 2553, mode: MaxEncodedLen) + /// Storage: `RankedCollective::Members` (r:1 w:0) + /// Proof: `RankedCollective::Members` (`max_values`: None, `max_size`: Some(42), added: 2517, mode: `MaxEncodedLen`) + /// Storage: `Salary::Status` (r:1 w:1) + /// Proof: `Salary::Status` (`max_values`: Some(1), `max_size`: Some(56), added: 551, mode: `MaxEncodedLen`) + /// Storage: `Salary::Claimant` (r:1 w:1) + /// Proof: `Salary::Claimant` (`max_values`: None, `max_size`: Some(78), added: 2553, mode: `MaxEncodedLen`) fn register() -> Weight { // Proof Size summary in bytes: // Measured: `462` // Estimated: `3543` - // Minimum execution time: 22_696_000 picoseconds. - Weight::from_parts(23_275_000, 3543) + // Minimum execution time: 19_744_000 picoseconds. + Weight::from_parts(20_225_000, 3543) .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } - /// Storage: Salary Status (r:1 w:1) - /// Proof: Salary Status (max_values: Some(1), max_size: Some(56), added: 551, mode: MaxEncodedLen) - /// Storage: Salary Claimant (r:1 w:1) - /// Proof: Salary Claimant (max_values: None, max_size: Some(78), added: 2553, mode: MaxEncodedLen) - /// Storage: RankedCollective Members (r:1 w:0) - /// Proof: RankedCollective Members (max_values: None, max_size: Some(42), added: 2517, mode: MaxEncodedLen) + /// Storage: `Salary::Status` (r:1 w:1) + /// Proof: `Salary::Status` (`max_values`: Some(1), `max_size`: Some(56), added: 551, mode: `MaxEncodedLen`) + /// Storage: `Salary::Claimant` (r:1 w:1) + /// Proof: `Salary::Claimant` (`max_values`: None, `max_size`: Some(78), added: 2553, mode: `MaxEncodedLen`) + /// Storage: `RankedCollective::Members` (r:1 w:0) + /// Proof: `RankedCollective::Members` (`max_values`: None, `max_size`: Some(42), added: 2517, mode: `MaxEncodedLen`) fn payout() -> Weight { // Proof Size summary in bytes: // Measured: `462` // Estimated: `3543` - // Minimum execution time: 63_660_000 picoseconds. - Weight::from_parts(65_006_000, 3543) + // Minimum execution time: 56_084_000 picoseconds. + Weight::from_parts(58_484_000, 3543) .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } - /// Storage: Salary Status (r:1 w:1) - /// Proof: Salary Status (max_values: Some(1), max_size: Some(56), added: 551, mode: MaxEncodedLen) - /// Storage: Salary Claimant (r:1 w:1) - /// Proof: Salary Claimant (max_values: None, max_size: Some(78), added: 2553, mode: MaxEncodedLen) - /// Storage: RankedCollective Members (r:1 w:0) - /// Proof: RankedCollective Members (max_values: None, max_size: Some(42), added: 2517, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: `Salary::Status` (r:1 w:1) + /// Proof: `Salary::Status` (`max_values`: Some(1), `max_size`: Some(56), added: 551, mode: `MaxEncodedLen`) + /// Storage: `Salary::Claimant` (r:1 w:1) + /// Proof: `Salary::Claimant` (`max_values`: None, `max_size`: Some(78), added: 2553, mode: `MaxEncodedLen`) + /// Storage: `RankedCollective::Members` (r:1 w:0) + /// Proof: `RankedCollective::Members` (`max_values`: None, `max_size`: Some(42), added: 2517, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) fn payout_other() -> Weight { // Proof Size summary in bytes: // Measured: `462` // Estimated: `3593` - // Minimum execution time: 64_706_000 picoseconds. - Weight::from_parts(65_763_000, 3593) + // Minimum execution time: 57_341_000 picoseconds. + Weight::from_parts(59_882_000, 3593) .saturating_add(RocksDbWeight::get().reads(4_u64)) .saturating_add(RocksDbWeight::get().writes(3_u64)) } - /// Storage: Salary Status (r:1 w:1) - /// Proof: Salary Status (max_values: Some(1), max_size: Some(56), added: 551, mode: MaxEncodedLen) - /// Storage: Salary Claimant (r:1 w:1) - /// Proof: Salary Claimant (max_values: None, max_size: Some(78), added: 2553, mode: MaxEncodedLen) + /// Storage: `Salary::Status` (r:1 w:1) + /// Proof: `Salary::Status` (`max_values`: Some(1), `max_size`: Some(56), added: 551, mode: `MaxEncodedLen`) + /// Storage: `Salary::Claimant` (r:1 w:1) + /// Proof: `Salary::Claimant` (`max_values`: None, `max_size`: Some(78), added: 2553, mode: `MaxEncodedLen`) fn check_payment() -> Weight { // Proof Size summary in bytes: // Measured: `170` // Estimated: `3543` - // Minimum execution time: 11_838_000 picoseconds. - Weight::from_parts(12_323_000, 3543) + // Minimum execution time: 10_788_000 picoseconds. + Weight::from_parts(11_109_000, 3543) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } diff --git a/substrate/frame/sassafras/Cargo.toml b/substrate/frame/sassafras/Cargo.toml index 5f4900b5a29d4514ab8621e8689aba1a63bcb640..09977142efc89a95b982ddef69be8d7552e5eee7 100644 --- a/substrate/frame/sassafras/Cargo.toml +++ b/substrate/frame/sassafras/Cargo.toml @@ -18,11 +18,11 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] scale-codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } -scale-info = { version = "2.5.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } frame-benchmarking = { path = "../benchmarking", default-features = false, optional = true } frame-support = { path = "../support", default-features = false } frame-system = { path = "../system", default-features = false } -log = { version = "0.4.17", default-features = false } +log = { workspace = true } sp-consensus-sassafras = { path = "../../primitives/consensus/sassafras", default-features = false, features = ["serde"] } sp-io = { path = "../../primitives/io", default-features = false } sp-runtime = { path = "../../primitives/runtime", default-features = false } diff --git a/substrate/frame/sassafras/src/benchmarking.rs b/substrate/frame/sassafras/src/benchmarking.rs index 921f2f0793d3ce9072aa762deeb97ad7b00799d5..2b2467c6f84ddf431425605834a7f6b006795a95 100644 --- a/substrate/frame/sassafras/src/benchmarking.rs +++ b/substrate/frame/sassafras/src/benchmarking.rs @@ -84,7 +84,7 @@ mod benchmarks { // - load the full ring context. // - recompute the ring verifier. // - sorting the epoch tickets in one shot - // (here we account for the very unluky scenario where we haven't done any sort work yet) + // (here we account for the very unlucky scenario where we haven't done any sort work yet) // - pending epoch change config. // // For this bench we assume a redundancy factor of 2 (suggested value to be used in prod). @@ -139,8 +139,8 @@ mod benchmarks { TicketsIds::::insert((epoch_tag as u8, i), id); let body = TicketBody { attempt_idx: i, - erased_public: EphemeralPublic([i as u8; 32]), - revealed_public: EphemeralPublic([i as u8; 32]), + erased_public: EphemeralPublic::from([i as u8; 32]), + revealed_public: EphemeralPublic::from([i as u8; 32]), }; TicketsData::::set(id, Some(body)); }); @@ -236,8 +236,8 @@ mod benchmarks { .map(|i| { let body = TicketBody { attempt_idx: i, - erased_public: EphemeralPublic([i as u8; 32]), - revealed_public: EphemeralPublic([i as u8; 32]), + erased_public: EphemeralPublic::from([i as u8; 32]), + revealed_public: EphemeralPublic::from([i as u8; 32]), }; let id_bytes = crate::hashing::blake2_128(&i.to_le_bytes()); let id = TicketId::from_le_bytes(id_bytes); diff --git a/substrate/frame/sassafras/src/lib.rs b/substrate/frame/sassafras/src/lib.rs index 0ee8657489b7f7321d24b209dfddcd086cf1cf37..8cbf1e47e3203a208578abb1b8b8431cbfd22ebb 100644 --- a/substrate/frame/sassafras/src/lib.rs +++ b/substrate/frame/sassafras/src/lib.rs @@ -234,7 +234,7 @@ pub mod pallet { /// Epoch X first N-th ticket has key (X mod 2, N) /// /// Note that the ticket's index doesn't directly correspond to the slot index within the epoch. - /// The assigment is computed dynamically using an *outside-in* strategy. + /// The assignment is computed dynamically using an *outside-in* strategy. /// /// Be aware that entries within this map are never removed, only overwritten. /// Last element index should be fetched from the [`TicketsMeta`] value. @@ -465,7 +465,7 @@ pub mod pallet { /// Plan an epoch configuration change. /// - /// The epoch configuration change is recorded and will be announced at the begining + /// The epoch configuration change is recorded and will be announced at the beginning /// of the next epoch together with next epoch authorities information. /// In other words, the configuration will be enacted one epoch later. /// @@ -758,11 +758,11 @@ impl Pallet { let randomness = hashing::blake2_256(buf.as_slice()); RandomnessAccumulator::::put(randomness); - let next_randoness = Self::update_epoch_randomness(1); + let next_randomness = Self::update_epoch_randomness(1); // Deposit a log as this is the first block in first epoch. let next_epoch = NextEpochDescriptor { - randomness: next_randoness, + randomness: next_randomness, authorities: Self::next_authorities().into_inner(), config: None, }; diff --git a/substrate/frame/sassafras/src/mock.rs b/substrate/frame/sassafras/src/mock.rs index 82ea2fe1ef29e6cc47e2f5e972314ecef6d909a3..f145bffa3a05c1c9b05087490792245e58c2a352 100644 --- a/substrate/frame/sassafras/src/mock.rs +++ b/substrate/frame/sassafras/src/mock.rs @@ -43,7 +43,7 @@ const LOG_TARGET: &str = "sassafras::tests"; const EPOCH_LENGTH: u32 = 10; const MAX_AUTHORITIES: u32 = 100; -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { type Block = frame_system::mocking::MockBlock; } @@ -99,7 +99,7 @@ pub fn new_test_ext_with_pairs( pallet_sassafras::GenesisConfig:: { authorities: authorities.clone(), epoch_config: TEST_EPOCH_CONFIGURATION, - _phantom: sp_std::marker::PhantomData, + _phantom: core::marker::PhantomData, } .assimilate_storage(&mut storage) .unwrap(); diff --git a/substrate/frame/scheduler/Cargo.toml b/substrate/frame/scheduler/Cargo.toml index bca17242d2071e22c232baab294d8dba0a27d77c..40a71736447076d10fd6d8f668a019581f5911f3 100644 --- a/substrate/frame/scheduler/Cargo.toml +++ b/substrate/frame/scheduler/Cargo.toml @@ -14,8 +14,8 @@ workspace = true [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } -log = { version = "0.4.17", default-features = false } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +log = { workspace = true } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } frame-benchmarking = { path = "../benchmarking", default-features = false, optional = true } frame-support = { path = "../support", default-features = false } frame-system = { path = "../system", default-features = false } @@ -23,7 +23,7 @@ sp-io = { path = "../../primitives/io", default-features = false } sp-runtime = { path = "../../primitives/runtime", default-features = false } sp-std = { path = "../../primitives/std", default-features = false } sp-weights = { path = "../../primitives/weights", default-features = false } -docify = "0.2.7" +docify = "0.2.8" [dev-dependencies] pallet-preimage = { path = "../preimage" } diff --git a/substrate/frame/scheduler/README.md b/substrate/frame/scheduler/README.md index 6aec2ddb0e4325e8ec4bbe3987ad2ee16a12cd52..5e233fdbdb0e9babd08dd73c8ca4942c718c4a58 100644 --- a/substrate/frame/scheduler/README.md +++ b/substrate/frame/scheduler/README.md @@ -16,7 +16,7 @@ for the origin: namely `frame_system::Config::BaseCallFilter` for all origin except root which will get no filter. And not the filter contained in origin use to call `fn schedule`. -If a call is scheduled using proxy or whatever mecanism which adds filter, +If a call is scheduled using proxy or whatever mechanism which adds filter, then those filter will not be used when dispatching the schedule call. ## Interface diff --git a/substrate/frame/scheduler/src/benchmarking.rs b/substrate/frame/scheduler/src/benchmarking.rs index cc86a17973780870970a7b604b4fd5d30cffe263..884f78000384cf66696b22de40238bbd2e5bef95 100644 --- a/substrate/frame/scheduler/src/benchmarking.rs +++ b/substrate/frame/scheduler/src/benchmarking.rs @@ -22,12 +22,13 @@ use frame_benchmarking::v1::{account, benchmarks, BenchmarkError}; use frame_support::{ ensure, traits::{schedule::Priority, BoundedInline}, + weights::WeightMeter, }; use frame_system::{pallet_prelude::BlockNumberFor, RawOrigin}; use sp_std::{prelude::*, vec}; use crate::Pallet as Scheduler; -use frame_system::Call as SystemCall; +use frame_system::{Call as SystemCall, EventRecord}; const SEED: u32 = 0; @@ -35,6 +36,14 @@ const BLOCK_NUMBER: u32 = 2; type SystemOrigin = ::RuntimeOrigin; +fn assert_last_event(generic_event: ::RuntimeEvent) { + let events = frame_system::Pallet::::events(); + let system_event: ::RuntimeEvent = generic_event.into(); + // compare to the last event record + let EventRecord { event, .. } = &events[events.len() - 1]; + assert_eq!(event, &system_event); +} + /// Add `n` items to the schedule. /// /// For `resolved`: @@ -202,7 +211,7 @@ benchmarks! { } verify { } - // `execute_dispatch` when the origin is `Signed`, not counting the dispatable's weight. + // `execute_dispatch` when the origin is `Signed`, not counting the dispatchable's weight. execute_dispatch_signed { let mut counter = WeightMeter::new(); let origin = make_origin::(true); @@ -213,7 +222,7 @@ benchmarks! { verify { } - // `execute_dispatch` when the origin is not `Signed`, not counting the dispatable's weight. + // `execute_dispatch` when the origin is not `Signed`, not counting the dispatchable's weight. execute_dispatch_unsigned { let mut counter = WeightMeter::new(); let origin = make_origin::(false); @@ -306,5 +315,105 @@ benchmarks! { ); } + schedule_retry { + let s in 1 .. T::MaxScheduledPerBlock::get(); + let when = BLOCK_NUMBER.into(); + + fill_schedule::(when, s)?; + let name = u32_to_name(s - 1); + let address = Lookup::::get(name).unwrap(); + let period: BlockNumberFor = 1u32.into(); + let root: ::PalletsOrigin = frame_system::RawOrigin::Root.into(); + let retry_config = RetryConfig { total_retries: 10, remaining: 10, period }; + Retries::::insert(address, retry_config); + let (mut when, index) = address; + let task = Agenda::::get(when)[index as usize].clone().unwrap(); + let mut weight_counter = WeightMeter::with_limit(T::MaximumWeight::get()); + }: { + Scheduler::::schedule_retry(&mut weight_counter, when, when, index, &task, retry_config); + } verify { + when = when + BlockNumberFor::::one(); + assert_eq!( + Retries::::get((when, 0)), + Some(RetryConfig { total_retries: 10, remaining: 9, period }) + ); + } + + set_retry { + let s = T::MaxScheduledPerBlock::get(); + let when = BLOCK_NUMBER.into(); + + fill_schedule::(when, s)?; + let name = u32_to_name(s - 1); + let address = Lookup::::get(name).unwrap(); + let (when, index) = address; + let period = BlockNumberFor::::one(); + }: _(RawOrigin::Root, (when, index), 10, period) + verify { + assert_eq!( + Retries::::get((when, index)), + Some(RetryConfig { total_retries: 10, remaining: 10, period }) + ); + assert_last_event::( + Event::RetrySet { task: address, id: None, period, retries: 10 }.into(), + ); + } + + set_retry_named { + let s = T::MaxScheduledPerBlock::get(); + let when = BLOCK_NUMBER.into(); + + fill_schedule::(when, s)?; + let name = u32_to_name(s - 1); + let address = Lookup::::get(name).unwrap(); + let (when, index) = address; + let period = BlockNumberFor::::one(); + }: _(RawOrigin::Root, name, 10, period) + verify { + assert_eq!( + Retries::::get((when, index)), + Some(RetryConfig { total_retries: 10, remaining: 10, period }) + ); + assert_last_event::( + Event::RetrySet { task: address, id: Some(name), period, retries: 10 }.into(), + ); + } + + cancel_retry { + let s = T::MaxScheduledPerBlock::get(); + let when = BLOCK_NUMBER.into(); + + fill_schedule::(when, s)?; + let name = u32_to_name(s - 1); + let address = Lookup::::get(name).unwrap(); + let (when, index) = address; + let period = BlockNumberFor::::one(); + assert!(Scheduler::::set_retry(RawOrigin::Root.into(), (when, index), 10, period).is_ok()); + }: _(RawOrigin::Root, (when, index)) + verify { + assert!(!Retries::::contains_key((when, index))); + assert_last_event::( + Event::RetryCancelled { task: address, id: None }.into(), + ); + } + + cancel_retry_named { + let s = T::MaxScheduledPerBlock::get(); + let when = BLOCK_NUMBER.into(); + + fill_schedule::(when, s)?; + let name = u32_to_name(s - 1); + let address = Lookup::::get(name).unwrap(); + let (when, index) = address; + let period = BlockNumberFor::::one(); + assert!(Scheduler::::set_retry_named(RawOrigin::Root.into(), name, 10, period).is_ok()); + }: _(RawOrigin::Root, name) + verify { + assert!(!Retries::::contains_key((when, index))); + assert_last_event::( + Event::RetryCancelled { task: address, id: Some(name) }.into(), + ); + } + impl_benchmark_test_suite!(Scheduler, crate::mock::new_test_ext(), crate::mock::Test); } diff --git a/substrate/frame/scheduler/src/lib.rs b/substrate/frame/scheduler/src/lib.rs index e94f154eee32f908dc449ba7ff9e54853cc4b915..d19a1e0001dd3aed98369b8691187b5cf8dcdfc7 100644 --- a/substrate/frame/scheduler/src/lib.rs +++ b/substrate/frame/scheduler/src/lib.rs @@ -46,7 +46,7 @@ //! 1. Scheduling a runtime call at a specific block. #![doc = docify::embed!("src/tests.rs", basic_scheduling_works)] //! -//! 2. Scheduling a preimage hash of a runtime call at a specifc block +//! 2. Scheduling a preimage hash of a runtime call at a specific block #![doc = docify::embed!("src/tests.rs", scheduling_with_preimages_works)] //! @@ -122,6 +122,17 @@ pub type CallOrHashOf = pub type BoundedCallOf = Bounded<::RuntimeCall, ::Hashing>; +/// The configuration of the retry mechanism for a given task along with its current state. +#[derive(Clone, Copy, RuntimeDebug, PartialEq, Eq, Encode, Decode, MaxEncodedLen, TypeInfo)] +pub struct RetryConfig { + /// Initial amount of retries allowed. + total_retries: u8, + /// Amount of retries left. + remaining: u8, + /// Period of time between retry attempts. + period: Period, +} + #[cfg_attr(any(feature = "std", test), derive(PartialEq, Eq))] #[derive(Clone, RuntimeDebug, Encode, Decode)] struct ScheduledV1 { @@ -148,6 +159,26 @@ pub struct Scheduled { _phantom: PhantomData, } +impl + Scheduled +where + Call: Clone, + PalletsOrigin: Clone, +{ + /// Create a new task to be used for retry attempts of the original one. The cloned task will + /// have the same `priority`, `call` and `origin`, but will always be non-periodic and unnamed. + pub fn as_retry(&self) -> Self { + Self { + maybe_id: None, + priority: self.priority, + call: self.call.clone(), + maybe_periodic: None, + origin: self.origin.clone(), + _phantom: Default::default(), + } + } +} + use crate::{Scheduled as ScheduledV3, Scheduled as ScheduledV2}; pub type ScheduledV2Of = ScheduledV2< @@ -198,7 +229,7 @@ pub mod pallet { use frame_support::{dispatch::PostDispatchInfo, pallet_prelude::*}; use frame_system::pallet_prelude::*; - /// The current storage version. + /// The in-code storage version. const STORAGE_VERSION: StorageVersion = StorageVersion::new(4); #[pallet::pallet] @@ -273,6 +304,16 @@ pub mod pallet { ValueQuery, >; + /// Retry configurations for items to be executed, indexed by task address. + #[pallet::storage] + pub type Retries = StorageMap< + _, + Blake2_128Concat, + TaskAddress>, + RetryConfig>, + OptionQuery, + >; + /// Lookup from a name to the block number and index of the task. /// /// For v3 -> v4 the previously unbounded identities are Blake2-256 hashed to form the v4 @@ -295,10 +336,22 @@ pub mod pallet { id: Option, result: DispatchResult, }, + /// Set a retry configuration for some task. + RetrySet { + task: TaskAddress>, + id: Option, + period: BlockNumberFor, + retries: u8, + }, + /// Cancel a retry configuration for some task. + RetryCancelled { task: TaskAddress>, id: Option }, /// The call for the provided hash was not found so the task has been aborted. CallUnavailable { task: TaskAddress>, id: Option }, /// The given task was unable to be renewed since the agenda is full at that block. PeriodicFailed { task: TaskAddress>, id: Option }, + /// The given task was unable to be retried since the agenda is full at that block or there + /// was not enough weight to reschedule it. + RetryFailed { task: TaskAddress>, id: Option }, /// The given task can never be executed since it is overweight. PermanentlyOverweight { task: TaskAddress>, id: Option }, } @@ -440,6 +493,111 @@ pub mod pallet { )?; Ok(()) } + + /// Set a retry configuration for a task so that, in case its scheduled run fails, it will + /// be retried after `period` blocks, for a total amount of `retries` retries or until it + /// succeeds. + /// + /// Tasks which need to be scheduled for a retry are still subject to weight metering and + /// agenda space, same as a regular task. If a periodic task fails, it will be scheduled + /// normally while the task is retrying. + /// + /// Tasks scheduled as a result of a retry for a periodic task are unnamed, non-periodic + /// clones of the original task. Their retry configuration will be derived from the + /// original task's configuration, but will have a lower value for `remaining` than the + /// original `total_retries`. + #[pallet::call_index(6)] + #[pallet::weight(::WeightInfo::set_retry())] + pub fn set_retry( + origin: OriginFor, + task: TaskAddress>, + retries: u8, + period: BlockNumberFor, + ) -> DispatchResult { + T::ScheduleOrigin::ensure_origin(origin.clone())?; + let origin = ::RuntimeOrigin::from(origin); + let (when, index) = task; + let agenda = Agenda::::get(when); + let scheduled = agenda + .get(index as usize) + .and_then(Option::as_ref) + .ok_or(Error::::NotFound)?; + Self::ensure_privilege(origin.caller(), &scheduled.origin)?; + Retries::::insert( + (when, index), + RetryConfig { total_retries: retries, remaining: retries, period }, + ); + Self::deposit_event(Event::RetrySet { task, id: None, period, retries }); + Ok(()) + } + + /// Set a retry configuration for a named task so that, in case its scheduled run fails, it + /// will be retried after `period` blocks, for a total amount of `retries` retries or until + /// it succeeds. + /// + /// Tasks which need to be scheduled for a retry are still subject to weight metering and + /// agenda space, same as a regular task. If a periodic task fails, it will be scheduled + /// normally while the task is retrying. + /// + /// Tasks scheduled as a result of a retry for a periodic task are unnamed, non-periodic + /// clones of the original task. Their retry configuration will be derived from the + /// original task's configuration, but will have a lower value for `remaining` than the + /// original `total_retries`. + #[pallet::call_index(7)] + #[pallet::weight(::WeightInfo::set_retry_named())] + pub fn set_retry_named( + origin: OriginFor, + id: TaskName, + retries: u8, + period: BlockNumberFor, + ) -> DispatchResult { + T::ScheduleOrigin::ensure_origin(origin.clone())?; + let origin = ::RuntimeOrigin::from(origin); + let (when, agenda_index) = Lookup::::get(&id).ok_or(Error::::NotFound)?; + let agenda = Agenda::::get(when); + let scheduled = agenda + .get(agenda_index as usize) + .and_then(Option::as_ref) + .ok_or(Error::::NotFound)?; + Self::ensure_privilege(origin.caller(), &scheduled.origin)?; + Retries::::insert( + (when, agenda_index), + RetryConfig { total_retries: retries, remaining: retries, period }, + ); + Self::deposit_event(Event::RetrySet { + task: (when, agenda_index), + id: Some(id), + period, + retries, + }); + Ok(()) + } + + /// Removes the retry configuration of a task. + #[pallet::call_index(8)] + #[pallet::weight(::WeightInfo::cancel_retry())] + pub fn cancel_retry( + origin: OriginFor, + task: TaskAddress>, + ) -> DispatchResult { + T::ScheduleOrigin::ensure_origin(origin.clone())?; + let origin = ::RuntimeOrigin::from(origin); + Self::do_cancel_retry(origin.caller(), task)?; + Self::deposit_event(Event::RetryCancelled { task, id: None }); + Ok(()) + } + + /// Cancel the retry configuration of a named task. + #[pallet::call_index(9)] + #[pallet::weight(::WeightInfo::cancel_retry_named())] + pub fn cancel_retry_named(origin: OriginFor, id: TaskName) -> DispatchResult { + T::ScheduleOrigin::ensure_origin(origin.clone())?; + let origin = ::RuntimeOrigin::from(origin); + let task = Lookup::::get(&id).ok_or(Error::::NotFound)?; + Self::do_cancel_retry(origin.caller(), task)?; + Self::deposit_event(Event::RetryCancelled { task, id: Some(id) }); + Ok(()) + } } } @@ -838,12 +996,7 @@ impl Pallet { Ok(None), |s| -> Result>, DispatchError> { if let (Some(ref o), Some(ref s)) = (origin, s.borrow()) { - if matches!( - T::OriginPrivilegeCmp::cmp_privilege(o, &s.origin), - Some(Ordering::Less) | None - ) { - return Err(BadOrigin.into()) - } + Self::ensure_privilege(o, &s.origin)?; }; Ok(s.take()) }, @@ -854,6 +1007,7 @@ impl Pallet { if let Some(id) = s.maybe_id { Lookup::::remove(id); } + Retries::::remove((when, index)); Self::cleanup_agenda(when); Self::deposit_event(Event::Canceled { when, index }); Ok(()) @@ -931,12 +1085,8 @@ impl Pallet { Agenda::::try_mutate(when, |agenda| -> DispatchResult { if let Some(s) = agenda.get_mut(i) { if let (Some(ref o), Some(ref s)) = (origin, s.borrow()) { - if matches!( - T::OriginPrivilegeCmp::cmp_privilege(o, &s.origin), - Some(Ordering::Less) | None - ) { - return Err(BadOrigin.into()) - } + Self::ensure_privilege(o, &s.origin)?; + Retries::::remove((when, index)); T::Preimages::drop(&s.call); } *s = None; @@ -973,6 +1123,20 @@ impl Pallet { Self::deposit_event(Event::Canceled { when, index }); Self::place_task(new_time, task).map_err(|x| x.0) } + + fn do_cancel_retry( + origin: &T::PalletsOrigin, + (when, index): TaskAddress>, + ) -> Result<(), DispatchError> { + let agenda = Agenda::::get(when); + let scheduled = agenda + .get(index as usize) + .and_then(Option::as_ref) + .ok_or(Error::::NotFound)?; + Self::ensure_privilege(origin, &scheduled.origin)?; + Retries::::remove((when, index)); + Ok(()) + } } enum ServiceTaskError { @@ -1103,6 +1267,17 @@ impl Pallet { id: task.maybe_id, }); + // It was not available when we needed it, so we don't need to have requested it + // anymore. + T::Preimages::drop(&task.call); + + // We don't know why `peek` failed, thus we most account here for the "full weight". + let _ = weight.try_consume(T::WeightInfo::service_task( + task.call.lookup_len().map(|x| x as usize), + task.maybe_id.is_some(), + task.maybe_periodic.is_some(), + )); + return Err((Unavailable, Some(task))) }, }; @@ -1124,11 +1299,21 @@ impl Pallet { }, Err(()) => Err((Overweight, Some(task))), Ok(result) => { + let failed = result.is_err(); + let maybe_retry_config = Retries::::take((when, agenda_index)); Self::deposit_event(Event::Dispatched { task: (when, agenda_index), id: task.maybe_id, result, }); + + match maybe_retry_config { + Some(retry_config) if failed => { + Self::schedule_retry(weight, now, when, agenda_index, &task, retry_config); + }, + _ => {}, + } + if let &Some((period, count)) = &task.maybe_periodic { if count > 1 { task.maybe_periodic = Some((period, count - 1)); @@ -1137,7 +1322,10 @@ impl Pallet { } let wake = now.saturating_add(period); match Self::place_task(wake, task) { - Ok(_) => {}, + Ok(new_address) => + if let Some(retry_config) = maybe_retry_config { + Retries::::insert(new_address, retry_config); + }, Err((_, task)) => { // TODO: Leave task in storage somewhere for it to be rescheduled // manually. @@ -1192,8 +1380,73 @@ impl Pallet { let _ = weight.try_consume(call_weight); Ok(result) } + + /// Check if a task has a retry configuration in place and, if so, try to reschedule it. + /// + /// Possible causes for failure to schedule a retry for a task: + /// - there wasn't enough weight to run the task reschedule logic + /// - there was no retry configuration in place + /// - there were no more retry attempts left + /// - the agenda was full. + fn schedule_retry( + weight: &mut WeightMeter, + now: BlockNumberFor, + when: BlockNumberFor, + agenda_index: u32, + task: &ScheduledOf, + retry_config: RetryConfig>, + ) { + if weight + .try_consume(T::WeightInfo::schedule_retry(T::MaxScheduledPerBlock::get())) + .is_err() + { + Self::deposit_event(Event::RetryFailed { + task: (when, agenda_index), + id: task.maybe_id, + }); + return; + } + + let RetryConfig { total_retries, mut remaining, period } = retry_config; + remaining = match remaining.checked_sub(1) { + Some(n) => n, + None => return, + }; + let wake = now.saturating_add(period); + match Self::place_task(wake, task.as_retry()) { + Ok(address) => { + // Reinsert the retry config to the new address of the task after it was + // placed. + Retries::::insert(address, RetryConfig { total_retries, remaining, period }); + }, + Err((_, task)) => { + // TODO: Leave task in storage somewhere for it to be + // rescheduled manually. + T::Preimages::drop(&task.call); + Self::deposit_event(Event::RetryFailed { + task: (when, agenda_index), + id: task.maybe_id, + }); + }, + } + } + + /// Ensure that `left` has at least the same level of privilege or higher than `right`. + /// + /// Returns an error if `left` has a lower level of privilege or the two cannot be compared. + fn ensure_privilege( + left: &::PalletsOrigin, + right: &::PalletsOrigin, + ) -> Result<(), DispatchError> { + if matches!(T::OriginPrivilegeCmp::cmp_privilege(left, right), Some(Ordering::Less) | None) + { + return Err(BadOrigin.into()); + } + Ok(()) + } } +#[allow(deprecated)] impl schedule::v2::Anon, ::RuntimeCall, T::PalletsOrigin> for Pallet { @@ -1228,6 +1481,8 @@ impl schedule::v2::Anon, ::RuntimeCall } } +// TODO: migrate `schedule::v2::Anon` to `v3` +#[allow(deprecated)] impl schedule::v2::Named, ::RuntimeCall, T::PalletsOrigin> for Pallet { diff --git a/substrate/frame/scheduler/src/migration.rs b/substrate/frame/scheduler/src/migration.rs index 76e2e04b49cc6fc7d9f886090de4df44911c0333..c2e956035a767031ceb64e4e0d42cebfb527e64d 100644 --- a/substrate/frame/scheduler/src/migration.rs +++ b/substrate/frame/scheduler/src/migration.rs @@ -81,7 +81,7 @@ pub mod v3 { StorageMap, Twox64Concat, Vec, TaskAddress>>; /// Migrate the scheduler pallet from V3 to V4. - pub struct MigrateToV4(sp_std::marker::PhantomData); + pub struct MigrateToV4(core::marker::PhantomData); impl OnRuntimeUpgrade for MigrateToV4 { #[cfg(feature = "try-runtime")] @@ -194,7 +194,7 @@ pub mod v4 { /// /// This should be run on a scheduler that does not have /// since it piles up `None`-only agendas. This does not modify the pallet version. - pub struct CleanupAgendas(sp_std::marker::PhantomData); + pub struct CleanupAgendas(core::marker::PhantomData); impl OnRuntimeUpgrade for CleanupAgendas { #[cfg(feature = "try-runtime")] diff --git a/substrate/frame/scheduler/src/mock.rs b/substrate/frame/scheduler/src/mock.rs index d22b9fcf8d99e35ecc7a39ff2097676eb788eee6..8d36ca1c42e3ad916a5cd38e2ef3fa7bcfea5483 100644 --- a/substrate/frame/scheduler/src/mock.rs +++ b/substrate/frame/scheduler/src/mock.rs @@ -22,17 +22,10 @@ use super::*; use crate as scheduler; use frame_support::{ derive_impl, ord_parameter_types, parameter_types, - traits::{ - ConstU32, ConstU64, Contains, EitherOfDiverse, EqualPrivilegeOnly, OnFinalize, OnInitialize, - }, - weights::constants::RocksDbWeight, + traits::{ConstU32, Contains, EitherOfDiverse, EqualPrivilegeOnly, OnFinalize, OnInitialize}, }; use frame_system::{EnsureRoot, EnsureSignedBy}; -use sp_core::H256; -use sp_runtime::{ - traits::{BlakeTwo256, IdentityLookup}, - BuildStorage, Perbill, -}; +use sp_runtime::{BuildStorage, Perbill}; // Logger module to track execution. #[frame_support::pallet] @@ -51,6 +44,17 @@ pub mod logger { #[pallet::pallet] pub struct Pallet(_); + #[pallet::storage] + pub type Threshold = StorageValue<_, (BlockNumberFor, BlockNumberFor)>; + + #[pallet::error] + pub enum Error { + /// Under the threshold. + TooEarly, + /// Over the threshold. + TooLate, + } + #[pallet::hooks] impl Hooks> for Pallet {} @@ -89,6 +93,20 @@ pub mod logger { }); Ok(()) } + + #[pallet::call_index(2)] + #[pallet::weight(*weight)] + pub fn timed_log(origin: OriginFor, i: u32, weight: Weight) -> DispatchResult { + let now = frame_system::Pallet::::block_number(); + let (start, end) = Threshold::::get().unwrap_or((0u32.into(), u32::MAX.into())); + ensure!(now >= start, Error::::TooEarly); + ensure!(now <= end, Error::::TooLate); + Self::deposit_event(Event::Logged(i, weight)); + Log::mutate(|log| { + log.push((origin.caller().clone(), i)); + }); + Ok(()) + } } } @@ -119,31 +137,10 @@ parameter_types! { ); } -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl system::Config for Test { type BaseCallFilter = BaseFilter; - type BlockWeights = BlockWeights; - type BlockLength = (); - type DbWeight = RocksDbWeight; - type RuntimeOrigin = RuntimeOrigin; - type RuntimeCall = RuntimeCall; - type Nonce = u64; - type Hash = H256; - type Hashing = BlakeTwo256; - type AccountId = u64; - type Lookup = IdentityLookup; type Block = Block; - type RuntimeEvent = RuntimeEvent; - type BlockHashCount = ConstU64<250>; - type Version = (); - type PalletInfo = PalletInfo; - type AccountData = (); - type OnNewAccount = (); - type OnKilledAccount = (); - type SystemWeightInfo = (); - type SS58Prefix = (); - type OnSetCode = (); - type MaxConsumers = ConstU32<16>; } impl logger::Config for Test { type RuntimeEvent = RuntimeEvent; @@ -198,6 +195,21 @@ impl WeightInfo for TestWeightInfo { fn cancel_named(_s: u32) -> Weight { Weight::from_parts(50, 0) } + fn schedule_retry(_s: u32) -> Weight { + Weight::from_parts(100000, 0) + } + fn set_retry() -> Weight { + Weight::from_parts(50, 0) + } + fn set_retry_named() -> Weight { + Weight::from_parts(50, 0) + } + fn cancel_retry() -> Weight { + Weight::from_parts(50, 0) + } + fn cancel_retry_named() -> Weight { + Weight::from_parts(50, 0) + } } parameter_types! { pub MaximumSchedulerWeight: Weight = Perbill::from_percent(80) * diff --git a/substrate/frame/scheduler/src/tests.rs b/substrate/frame/scheduler/src/tests.rs index 1bf8b3e5f3a03bd2c9d233a24351d1ae2d923c45..3023a370a4b6034e4ec9366fcaa065035edccec3 100644 --- a/substrate/frame/scheduler/src/tests.rs +++ b/substrate/frame/scheduler/src/tests.rs @@ -19,7 +19,8 @@ use super::*; use crate::mock::{ - logger, new_test_ext, root, run_to_block, LoggerCall, RuntimeCall, Scheduler, Test, *, + logger::{self, Threshold}, + new_test_ext, root, run_to_block, LoggerCall, RuntimeCall, Scheduler, Test, *, }; use frame_support::{ assert_err, assert_noop, assert_ok, @@ -179,6 +180,865 @@ fn periodic_scheduling_works() { }); } +#[test] +fn retry_scheduling_works() { + new_test_ext().execute_with(|| { + // task fails until block 8 is reached + Threshold::::put((8, 100)); + // task 42 at #4 + assert_ok!(Scheduler::do_schedule( + DispatchTime::At(4), + None, + 127, + root(), + Preimage::bound(RuntimeCall::Logger(logger::Call::timed_log { + i: 42, + weight: Weight::from_parts(10, 0) + })) + .unwrap() + )); + assert!(Agenda::::get(4)[0].is_some()); + // retry 10 times every 3 blocks + assert_ok!(Scheduler::set_retry(root().into(), (4, 0), 10, 3)); + assert_eq!(Retries::::iter().count(), 1); + run_to_block(3); + assert!(logger::log().is_empty()); + assert!(Agenda::::get(4)[0].is_some()); + // task should be retried in block 7 + run_to_block(4); + assert!(Agenda::::get(4).is_empty()); + assert!(Agenda::::get(7)[0].is_some()); + assert!(logger::log().is_empty()); + run_to_block(6); + assert!(Agenda::::get(7)[0].is_some()); + assert!(logger::log().is_empty()); + // task still fails, should be retried in block 10 + run_to_block(7); + assert!(Agenda::::get(7).is_empty()); + assert!(Agenda::::get(10)[0].is_some()); + assert!(logger::log().is_empty()); + run_to_block(8); + assert!(Agenda::::get(10)[0].is_some()); + assert!(logger::log().is_empty()); + run_to_block(9); + assert!(logger::log().is_empty()); + assert_eq!(Retries::::iter().count(), 1); + // finally it should succeed + run_to_block(10); + assert_eq!(logger::log(), vec![(root(), 42u32)]); + assert_eq!(Retries::::iter().count(), 0); + run_to_block(11); + assert_eq!(logger::log(), vec![(root(), 42u32)]); + run_to_block(12); + assert_eq!(logger::log(), vec![(root(), 42u32)]); + run_to_block(100); + assert_eq!(logger::log(), vec![(root(), 42u32)]); + }); +} + +#[test] +fn named_retry_scheduling_works() { + new_test_ext().execute_with(|| { + // task fails until block 8 is reached + Threshold::::put((8, 100)); + // task 42 at #4 + let call = RuntimeCall::Logger(logger::Call::timed_log { + i: 42, + weight: Weight::from_parts(10, 0), + }); + assert_eq!( + Scheduler::do_schedule_named( + [1u8; 32], + DispatchTime::At(4), + None, + 127, + root(), + Preimage::bound(call).unwrap(), + ) + .unwrap(), + (4, 0) + ); + assert!(Agenda::::get(4)[0].is_some()); + // retry 10 times every 3 blocks + assert_ok!(Scheduler::set_retry_named(root().into(), [1u8; 32], 10, 3)); + assert_eq!(Retries::::iter().count(), 1); + run_to_block(3); + assert!(logger::log().is_empty()); + assert!(Agenda::::get(4)[0].is_some()); + // task should be retried in block 7 + run_to_block(4); + assert!(Agenda::::get(4).is_empty()); + assert!(Agenda::::get(7)[0].is_some()); + assert!(logger::log().is_empty()); + run_to_block(6); + assert!(Agenda::::get(7)[0].is_some()); + assert!(logger::log().is_empty()); + // task still fails, should be retried in block 10 + run_to_block(7); + assert!(Agenda::::get(7).is_empty()); + assert!(Agenda::::get(10)[0].is_some()); + assert!(logger::log().is_empty()); + run_to_block(8); + assert!(Agenda::::get(10)[0].is_some()); + assert!(logger::log().is_empty()); + run_to_block(9); + assert!(logger::log().is_empty()); + assert_eq!(Retries::::iter().count(), 1); + // finally it should succeed + run_to_block(10); + assert_eq!(logger::log(), vec![(root(), 42u32)]); + assert_eq!(Retries::::iter().count(), 0); + run_to_block(11); + assert_eq!(logger::log(), vec![(root(), 42u32)]); + run_to_block(12); + assert_eq!(logger::log(), vec![(root(), 42u32)]); + run_to_block(100); + assert_eq!(logger::log(), vec![(root(), 42u32)]); + }); +} + +#[test] +fn retry_scheduling_multiple_tasks_works() { + new_test_ext().execute_with(|| { + // task fails until block 8 is reached + Threshold::::put((8, 100)); + // task 20 at #4 + assert_ok!(Scheduler::do_schedule( + DispatchTime::At(4), + None, + 127, + root(), + Preimage::bound(RuntimeCall::Logger(logger::Call::timed_log { + i: 20, + weight: Weight::from_parts(10, 0) + })) + .unwrap() + )); + // task 42 at #4 + assert_ok!(Scheduler::do_schedule( + DispatchTime::At(4), + None, + 127, + root(), + Preimage::bound(RuntimeCall::Logger(logger::Call::timed_log { + i: 42, + weight: Weight::from_parts(10, 0) + })) + .unwrap() + )); + + assert_eq!(Agenda::::get(4).len(), 2); + // task 20 will be retried 3 times every block + assert_ok!(Scheduler::set_retry(root().into(), (4, 0), 3, 1)); + // task 42 will be retried 10 times every 3 blocks + assert_ok!(Scheduler::set_retry(root().into(), (4, 1), 10, 3)); + assert_eq!(Retries::::iter().count(), 2); + run_to_block(3); + assert!(logger::log().is_empty()); + assert_eq!(Agenda::::get(4).len(), 2); + // both tasks fail + run_to_block(4); + assert!(Agenda::::get(4).is_empty()); + // 20 is rescheduled for next block + assert_eq!(Agenda::::get(5).len(), 1); + // 42 is rescheduled for block 7 + assert_eq!(Agenda::::get(7).len(), 1); + assert!(logger::log().is_empty()); + // 20 still fails + run_to_block(5); + // 20 rescheduled for next block + assert_eq!(Agenda::::get(6).len(), 1); + assert_eq!(Agenda::::get(7).len(), 1); + assert_eq!(Retries::::iter().count(), 2); + assert!(logger::log().is_empty()); + // 20 still fails + run_to_block(6); + // rescheduled for next block together with 42 + assert_eq!(Agenda::::get(7).len(), 2); + assert_eq!(Retries::::iter().count(), 2); + assert!(logger::log().is_empty()); + // both tasks will fail, for 20 it was the last retry so it's dropped + run_to_block(7); + assert!(Agenda::::get(7).is_empty()); + assert!(Agenda::::get(8).is_empty()); + // 42 is rescheduled for block 10 + assert_eq!(Agenda::::get(10).len(), 1); + assert_eq!(Retries::::iter().count(), 1); + assert!(logger::log().is_empty()); + run_to_block(8); + assert_eq!(Agenda::::get(10).len(), 1); + assert!(logger::log().is_empty()); + run_to_block(9); + assert!(logger::log().is_empty()); + assert_eq!(Retries::::iter().count(), 1); + // 42 runs successfully + run_to_block(10); + assert_eq!(logger::log(), vec![(root(), 42u32)]); + assert_eq!(Retries::::iter().count(), 0); + run_to_block(11); + assert_eq!(logger::log(), vec![(root(), 42u32)]); + run_to_block(12); + assert_eq!(logger::log(), vec![(root(), 42u32)]); + run_to_block(100); + assert_eq!(logger::log(), vec![(root(), 42u32)]); + }); +} + +#[test] +fn retry_scheduling_multiple_named_tasks_works() { + new_test_ext().execute_with(|| { + // task fails until we reach block 8 + Threshold::::put((8, 100)); + // task 20 at #4 + assert_ok!(Scheduler::do_schedule_named( + [20u8; 32], + DispatchTime::At(4), + None, + 127, + root(), + Preimage::bound(RuntimeCall::Logger(logger::Call::timed_log { + i: 20, + weight: Weight::from_parts(10, 0) + })) + .unwrap() + )); + // task 42 at #4 + assert_ok!(Scheduler::do_schedule_named( + [42u8; 32], + DispatchTime::At(4), + None, + 127, + root(), + Preimage::bound(RuntimeCall::Logger(logger::Call::timed_log { + i: 42, + weight: Weight::from_parts(10, 0) + })) + .unwrap() + )); + + assert_eq!(Agenda::::get(4).len(), 2); + // task 20 will be retried 3 times every block + assert_ok!(Scheduler::set_retry_named(root().into(), [20u8; 32], 3, 1)); + // task 42 will be retried 10 times every 3 block + assert_ok!(Scheduler::set_retry_named(root().into(), [42u8; 32], 10, 3)); + assert_eq!(Retries::::iter().count(), 2); + run_to_block(3); + assert!(logger::log().is_empty()); + assert_eq!(Agenda::::get(4).len(), 2); + // both tasks fail + run_to_block(4); + assert!(Agenda::::get(4).is_empty()); + // 42 is rescheduled for block 7 + assert_eq!(Agenda::::get(7).len(), 1); + // 20 is rescheduled for next block + assert_eq!(Agenda::::get(5).len(), 1); + assert!(logger::log().is_empty()); + // 20 still fails + run_to_block(5); + // 20 rescheduled for next block + assert_eq!(Agenda::::get(6).len(), 1); + assert_eq!(Agenda::::get(7).len(), 1); + assert_eq!(Retries::::iter().count(), 2); + assert!(logger::log().is_empty()); + // 20 still fails + run_to_block(6); + // 20 rescheduled for next block together with 42 + assert_eq!(Agenda::::get(7).len(), 2); + assert_eq!(Retries::::iter().count(), 2); + assert!(logger::log().is_empty()); + // both tasks will fail, for 20 it was the last retry so it's dropped + run_to_block(7); + assert!(Agenda::::get(7).is_empty()); + assert!(Agenda::::get(8).is_empty()); + // 42 is rescheduled for block 10 + assert_eq!(Agenda::::get(10).len(), 1); + assert_eq!(Retries::::iter().count(), 1); + assert!(logger::log().is_empty()); + run_to_block(8); + assert_eq!(Agenda::::get(10).len(), 1); + assert!(logger::log().is_empty()); + run_to_block(9); + assert!(logger::log().is_empty()); + assert_eq!(Retries::::iter().count(), 1); + // 42 runs successfully + run_to_block(10); + assert_eq!(logger::log(), vec![(root(), 42u32)]); + assert_eq!(Retries::::iter().count(), 0); + run_to_block(11); + assert_eq!(logger::log(), vec![(root(), 42u32)]); + run_to_block(12); + assert_eq!(logger::log(), vec![(root(), 42u32)]); + run_to_block(100); + assert_eq!(logger::log(), vec![(root(), 42u32)]); + }); +} + +#[test] +fn retry_scheduling_with_period_works() { + new_test_ext().execute_with(|| { + // tasks fail until we reach block 4 and after we're past block 8 + Threshold::::put((4, 8)); + // task 42 at #4, every 3 blocks, 6 times + assert_ok!(Scheduler::do_schedule( + DispatchTime::At(4), + Some((3, 6)), + 127, + root(), + Preimage::bound(RuntimeCall::Logger(logger::Call::timed_log { + i: 42, + weight: Weight::from_parts(10, 0) + })) + .unwrap() + )); + + assert!(Agenda::::get(4)[0].is_some()); + // 42 will be retried 10 times every 2 blocks + assert_ok!(Scheduler::set_retry(root().into(), (4, 0), 10, 2)); + assert_eq!(Retries::::iter().count(), 1); + run_to_block(3); + assert!(logger::log().is_empty()); + assert!(Agenda::::get(4)[0].is_some()); + // 42 runs successfully once, it will run again at block 7 + run_to_block(4); + assert!(Agenda::::get(4).is_empty()); + assert!(Agenda::::get(7)[0].is_some()); + assert_eq!(Retries::::iter().count(), 1); + assert_eq!(logger::log(), vec![(root(), 42u32)]); + // nothing changed + run_to_block(6); + assert!(Agenda::::get(7)[0].is_some()); + assert_eq!(logger::log(), vec![(root(), 42u32)]); + // 42 runs successfully again, it will run again at block 10 + run_to_block(7); + assert!(Agenda::::get(7).is_empty()); + assert!(Agenda::::get(10)[0].is_some()); + assert_eq!(Retries::::iter().count(), 1); + assert_eq!(logger::log(), vec![(root(), 42u32), (root(), 42u32)]); + run_to_block(9); + assert!(Agenda::::get(10)[0].is_some()); + assert_eq!(logger::log(), vec![(root(), 42u32), (root(), 42u32)]); + // 42 has 10 retries left out of a total of 10 + assert_eq!(Retries::::get((10, 0)).unwrap().remaining, 10); + // 42 will fail because we're outside the set threshold (block number in `4..8`), so it + // should be retried in 2 blocks (at block 12) + run_to_block(10); + // should be queued for the normal period of 3 blocks + assert!(Agenda::::get(13)[0].is_some()); + // should also be queued to be retried in 2 blocks + assert!(Agenda::::get(12)[0].is_some()); + // 42 has consumed one retry attempt + assert_eq!(Retries::::get((12, 0)).unwrap().remaining, 9); + assert_eq!(Retries::::get((13, 0)).unwrap().remaining, 10); + assert_eq!(Retries::::iter().count(), 2); + assert_eq!(logger::log(), vec![(root(), 42u32), (root(), 42u32)]); + // 42 will fail again + run_to_block(12); + // should still be queued for the normal period + assert!(Agenda::::get(13)[0].is_some()); + // should be queued to be retried in 2 blocks + assert!(Agenda::::get(14)[0].is_some()); + // 42 has consumed another retry attempt + assert_eq!(Retries::::get((14, 0)).unwrap().remaining, 8); + assert_eq!(Retries::::get((13, 0)).unwrap().remaining, 10); + assert_eq!(Retries::::iter().count(), 2); + assert_eq!(logger::log(), vec![(root(), 42u32), (root(), 42u32)]); + // 42 will fail for the regular periodic run + run_to_block(13); + // should still be queued for the normal period + assert!(Agenda::::get(16)[0].is_some()); + // should still be queued to be retried next block + assert!(Agenda::::get(14)[0].is_some()); + // 42 consumed another periodic run, which failed, so another retry is queued for block 15 + assert!(Agenda::::get(16)[0].as_ref().unwrap().maybe_periodic.is_some()); + assert!(Agenda::::get(15)[0].as_ref().unwrap().maybe_periodic.is_none()); + assert!(Agenda::::get(14)[0].as_ref().unwrap().maybe_periodic.is_none()); + assert_eq!(Retries::::iter().count(), 3); + assert!(Retries::::get((14, 0)).unwrap().remaining == 8); + assert!(Retries::::get((15, 0)).unwrap().remaining == 9); + assert!(Retries::::get((16, 0)).unwrap().remaining == 10); + assert_eq!(logger::log(), vec![(root(), 42u32), (root(), 42u32)]); + // change the threshold to allow the task to succeed + Threshold::::put((14, 100)); + // first retry should now succeed + run_to_block(14); + assert!(Agenda::::get(15)[0].as_ref().unwrap().maybe_periodic.is_none()); + assert_eq!(Agenda::::get(16).iter().filter(|entry| entry.is_some()).count(), 1); + assert!(Agenda::::get(16)[0].is_some()); + assert_eq!(Retries::::get((15, 0)).unwrap().remaining, 9); + assert_eq!(Retries::::get((16, 0)).unwrap().remaining, 10); + assert_eq!(Retries::::iter().count(), 2); + assert_eq!(logger::log(), vec![(root(), 42u32), (root(), 42u32), (root(), 42u32)]); + // second retry should also succeed + run_to_block(15); + assert_eq!(Agenda::::get(16).iter().filter(|entry| entry.is_some()).count(), 1); + assert!(Agenda::::get(16)[0].is_some()); + assert!(Agenda::::get(17).is_empty()); + assert_eq!(Retries::::get((16, 0)).unwrap().remaining, 10); + assert_eq!(Retries::::iter().count(), 1); + assert_eq!( + logger::log(), + vec![(root(), 42u32), (root(), 42u32), (root(), 42u32), (root(), 42u32)] + ); + // normal periodic run on block 16 will succeed + run_to_block(16); + // next periodic run at block 19 + assert!(Agenda::::get(19)[0].is_some()); + assert!(Agenda::::get(18).is_empty()); + assert!(Agenda::::get(17).is_empty()); + assert_eq!(Retries::::get((19, 0)).unwrap().remaining, 10); + assert_eq!(Retries::::iter().count(), 1); + assert_eq!( + logger::log(), + vec![ + (root(), 42u32), + (root(), 42u32), + (root(), 42u32), + (root(), 42u32), + (root(), 42u32) + ] + ); + // final periodic run on block 19 will succeed + run_to_block(19); + // next periodic run at block 19 + assert_eq!(Agenda::::iter().count(), 0); + assert_eq!(Retries::::iter().count(), 0); + assert_eq!( + logger::log(), + vec![ + (root(), 42u32), + (root(), 42u32), + (root(), 42u32), + (root(), 42u32), + (root(), 42u32), + (root(), 42u32) + ] + ); + }); +} + +#[test] +fn named_retry_scheduling_with_period_works() { + new_test_ext().execute_with(|| { + // tasks fail until we reach block 4 and after we're past block 8 + Threshold::::put((4, 8)); + // task 42 at #4, every 3 blocks, 6 times + assert_ok!(Scheduler::do_schedule_named( + [42u8; 32], + DispatchTime::At(4), + Some((3, 6)), + 127, + root(), + Preimage::bound(RuntimeCall::Logger(logger::Call::timed_log { + i: 42, + weight: Weight::from_parts(10, 0) + })) + .unwrap() + )); + + assert!(Agenda::::get(4)[0].is_some()); + // 42 will be retried 10 times every 2 blocks + assert_ok!(Scheduler::set_retry_named(root().into(), [42u8; 32], 10, 2)); + assert_eq!(Retries::::iter().count(), 1); + run_to_block(3); + assert!(logger::log().is_empty()); + assert!(Agenda::::get(4)[0].is_some()); + // 42 runs successfully once, it will run again at block 7 + run_to_block(4); + assert!(Agenda::::get(4).is_empty()); + assert!(Agenda::::get(7)[0].is_some()); + assert_eq!(Retries::::iter().count(), 1); + assert_eq!(logger::log(), vec![(root(), 42u32)]); + // nothing changed + run_to_block(6); + assert!(Agenda::::get(7)[0].is_some()); + assert_eq!(logger::log(), vec![(root(), 42u32)]); + // 42 runs successfully again, it will run again at block 10 + run_to_block(7); + assert!(Agenda::::get(7).is_empty()); + assert!(Agenda::::get(10)[0].is_some()); + assert_eq!(Retries::::iter().count(), 1); + assert_eq!(logger::log(), vec![(root(), 42u32), (root(), 42u32)]); + run_to_block(9); + assert!(Agenda::::get(10)[0].is_some()); + assert_eq!(logger::log(), vec![(root(), 42u32), (root(), 42u32)]); + // 42 has 10 retries left out of a total of 10 + assert_eq!(Retries::::get((10, 0)).unwrap().remaining, 10); + // 42 will fail because we're outside the set threshold (block number in `4..8`), so it + // should be retried in 2 blocks (at block 12) + run_to_block(10); + // should be queued for the normal period of 3 blocks + assert!(Agenda::::get(13)[0].is_some()); + // should also be queued to be retried in 2 blocks + assert!(Agenda::::get(12)[0].is_some()); + // 42 has consumed one retry attempt + assert_eq!(Retries::::get((12, 0)).unwrap().remaining, 9); + assert_eq!(Retries::::get((13, 0)).unwrap().remaining, 10); + assert_eq!(Retries::::iter().count(), 2); + assert_eq!(Lookup::::get([42u8; 32]).unwrap(), (13, 0)); + assert_eq!(logger::log(), vec![(root(), 42u32), (root(), 42u32)]); + // 42 will fail again + run_to_block(12); + // should still be queued for the normal period + assert!(Agenda::::get(13)[0].is_some()); + // should be queued to be retried in 2 blocks + assert!(Agenda::::get(14)[0].is_some()); + // 42 has consumed another retry attempt + assert_eq!(Retries::::get((14, 0)).unwrap().remaining, 8); + assert_eq!(Retries::::get((13, 0)).unwrap().remaining, 10); + assert_eq!(Retries::::iter().count(), 2); + assert_eq!(logger::log(), vec![(root(), 42u32), (root(), 42u32)]); + // 42 will fail for the regular periodic run + run_to_block(13); + // should still be queued for the normal period + assert!(Agenda::::get(16)[0].is_some()); + // should still be queued to be retried next block + assert!(Agenda::::get(14)[0].is_some()); + // 42 consumed another periodic run, which failed, so another retry is queued for block 15 + assert!(Agenda::::get(16)[0].as_ref().unwrap().maybe_periodic.is_some()); + assert!(Agenda::::get(15)[0].as_ref().unwrap().maybe_periodic.is_none()); + assert!(Agenda::::get(14)[0].as_ref().unwrap().maybe_periodic.is_none()); + assert_eq!(Retries::::iter().count(), 3); + assert!(Retries::::get((14, 0)).unwrap().remaining == 8); + assert!(Retries::::get((15, 0)).unwrap().remaining == 9); + assert!(Retries::::get((16, 0)).unwrap().remaining == 10); + assert_eq!(Lookup::::get([42u8; 32]).unwrap(), (16, 0)); + assert_eq!(logger::log(), vec![(root(), 42u32), (root(), 42u32)]); + // change the threshold to allow the task to succeed + Threshold::::put((14, 100)); + // first retry should now succeed + run_to_block(14); + assert!(Agenda::::get(15)[0].as_ref().unwrap().maybe_periodic.is_none()); + assert_eq!(Agenda::::get(16).iter().filter(|entry| entry.is_some()).count(), 1); + assert!(Agenda::::get(16)[0].is_some()); + assert_eq!(Retries::::get((15, 0)).unwrap().remaining, 9); + assert_eq!(Retries::::get((16, 0)).unwrap().remaining, 10); + assert_eq!(Retries::::iter().count(), 2); + assert_eq!(logger::log(), vec![(root(), 42u32), (root(), 42u32), (root(), 42u32)]); + // second retry should also succeed + run_to_block(15); + assert_eq!(Agenda::::get(16).iter().filter(|entry| entry.is_some()).count(), 1); + assert!(Agenda::::get(16)[0].is_some()); + assert!(Agenda::::get(17).is_empty()); + assert_eq!(Retries::::get((16, 0)).unwrap().remaining, 10); + assert_eq!(Retries::::iter().count(), 1); + assert_eq!(Lookup::::get([42u8; 32]).unwrap(), (16, 0)); + assert_eq!( + logger::log(), + vec![(root(), 42u32), (root(), 42u32), (root(), 42u32), (root(), 42u32)] + ); + // normal periodic run on block 16 will succeed + run_to_block(16); + // next periodic run at block 19 + assert!(Agenda::::get(19)[0].is_some()); + assert!(Agenda::::get(18).is_empty()); + assert!(Agenda::::get(17).is_empty()); + assert_eq!(Retries::::get((19, 0)).unwrap().remaining, 10); + assert_eq!(Retries::::iter().count(), 1); + assert_eq!(Lookup::::get([42u8; 32]).unwrap(), (19, 0)); + assert_eq!( + logger::log(), + vec![ + (root(), 42u32), + (root(), 42u32), + (root(), 42u32), + (root(), 42u32), + (root(), 42u32) + ] + ); + // final periodic run on block 19 will succeed + run_to_block(19); + // next periodic run at block 19 + assert_eq!(Agenda::::iter().count(), 0); + assert_eq!(Retries::::iter().count(), 0); + assert_eq!(Lookup::::iter().count(), 0); + assert_eq!( + logger::log(), + vec![ + (root(), 42u32), + (root(), 42u32), + (root(), 42u32), + (root(), 42u32), + (root(), 42u32), + (root(), 42u32) + ] + ); + }); +} + +#[test] +fn retry_scheduling_expires() { + new_test_ext().execute_with(|| { + // task will fail if we're past block 3 + Threshold::::put((1, 3)); + // task 42 at #4 + assert_ok!(Scheduler::do_schedule( + DispatchTime::At(4), + None, + 127, + root(), + Preimage::bound(RuntimeCall::Logger(logger::Call::timed_log { + i: 42, + weight: Weight::from_parts(10, 0) + })) + .unwrap() + )); + assert!(Agenda::::get(4)[0].is_some()); + // task 42 will be retried 3 times every block + assert_ok!(Scheduler::set_retry(root().into(), (4, 0), 3, 1)); + assert_eq!(Retries::::iter().count(), 1); + run_to_block(3); + assert!(logger::log().is_empty()); + // task 42 is scheduled for next block + assert!(Agenda::::get(4)[0].is_some()); + // task fails because we're past block 3 + run_to_block(4); + // task is scheduled for next block + assert!(Agenda::::get(4).is_empty()); + assert!(Agenda::::get(5)[0].is_some()); + // one retry attempt is consumed + assert_eq!(Retries::::get((5, 0)).unwrap().remaining, 2); + assert!(logger::log().is_empty()); + // task fails again + run_to_block(5); + // task is scheduled for next block + assert!(Agenda::::get(5).is_empty()); + assert!(Agenda::::get(6)[0].is_some()); + // another retry attempt is consumed + assert_eq!(Retries::::get((6, 0)).unwrap().remaining, 1); + assert!(logger::log().is_empty()); + // task fails again + run_to_block(6); + // task is scheduled for next block + assert!(Agenda::::get(6).is_empty()); + assert!(Agenda::::get(7)[0].is_some()); + // another retry attempt is consumed + assert_eq!(Retries::::get((7, 0)).unwrap().remaining, 0); + assert!(logger::log().is_empty()); + // task fails again + run_to_block(7); + // task ran out of retries so it gets dropped + assert_eq!(Agenda::::iter().count(), 0); + assert_eq!(Retries::::iter().count(), 0); + assert!(logger::log().is_empty()); + }); +} + +#[test] +fn set_retry_bad_origin() { + new_test_ext().execute_with(|| { + // task 42 at #4 with account 101 as origin + assert_ok!(Scheduler::do_schedule( + DispatchTime::At(4), + None, + 127, + 101.into(), + Preimage::bound(RuntimeCall::Logger(logger::Call::timed_log { + i: 42, + weight: Weight::from_parts(10, 0) + })) + .unwrap() + )); + + assert!(Agenda::::get(4)[0].is_some()); + // try to change the retry config with a different (non-root) account + let res: Result<(), DispatchError> = + Scheduler::set_retry(RuntimeOrigin::signed(102), (4, 0), 10, 2); + assert_eq!(res, Err(BadOrigin.into())); + }); +} + +#[test] +fn set_named_retry_bad_origin() { + new_test_ext().execute_with(|| { + // task 42 at #4 with account 101 as origin + assert_ok!(Scheduler::do_schedule_named( + [42u8; 32], + DispatchTime::At(4), + None, + 127, + 101.into(), + Preimage::bound(RuntimeCall::Logger(logger::Call::timed_log { + i: 42, + weight: Weight::from_parts(10, 0) + })) + .unwrap() + )); + + assert!(Agenda::::get(4)[0].is_some()); + // try to change the retry config with a different (non-root) account + let res: Result<(), DispatchError> = + Scheduler::set_retry_named(RuntimeOrigin::signed(102), [42u8; 32], 10, 2); + assert_eq!(res, Err(BadOrigin.into())); + }); +} + +#[test] +fn set_retry_works() { + new_test_ext().execute_with(|| { + // task 42 at #4 + assert_ok!(Scheduler::do_schedule( + DispatchTime::At(4), + None, + 127, + root(), + Preimage::bound(RuntimeCall::Logger(logger::Call::timed_log { + i: 42, + weight: Weight::from_parts(10, 0) + })) + .unwrap() + )); + + assert!(Agenda::::get(4)[0].is_some()); + // make sure the retry configuration was stored + assert_ok!(Scheduler::set_retry(root().into(), (4, 0), 10, 2)); + assert_eq!( + Retries::::get((4, 0)), + Some(RetryConfig { total_retries: 10, remaining: 10, period: 2 }) + ); + }); +} + +#[test] +fn set_named_retry_works() { + new_test_ext().execute_with(|| { + // task 42 at #4 with account 101 as origin + assert_ok!(Scheduler::do_schedule_named( + [42u8; 32], + DispatchTime::At(4), + None, + 127, + root(), + Preimage::bound(RuntimeCall::Logger(logger::Call::timed_log { + i: 42, + weight: Weight::from_parts(10, 0) + })) + .unwrap() + )); + + assert!(Agenda::::get(4)[0].is_some()); + // make sure the retry configuration was stored + assert_ok!(Scheduler::set_retry_named(root().into(), [42u8; 32], 10, 2)); + let address = Lookup::::get([42u8; 32]).unwrap(); + assert_eq!( + Retries::::get(address), + Some(RetryConfig { total_retries: 10, remaining: 10, period: 2 }) + ); + }); +} + +#[test] +fn retry_periodic_full_cycle() { + new_test_ext().execute_with(|| { + // tasks fail after we pass block 1000 + Threshold::::put((1, 1000)); + // task 42 at #4, every 100 blocks, 4 times + assert_ok!(Scheduler::do_schedule_named( + [42u8; 32], + DispatchTime::At(10), + Some((100, 4)), + 127, + root(), + Preimage::bound(RuntimeCall::Logger(logger::Call::timed_log { + i: 42, + weight: Weight::from_parts(10, 0) + })) + .unwrap() + )); + + assert!(Agenda::::get(10)[0].is_some()); + // 42 will be retried 2 times every block + assert_ok!(Scheduler::set_retry_named(root().into(), [42u8; 32], 2, 1)); + assert_eq!(Retries::::iter().count(), 1); + run_to_block(9); + assert!(logger::log().is_empty()); + assert!(Agenda::::get(10)[0].is_some()); + // 42 runs successfully once, it will run again at block 110 + run_to_block(10); + assert!(Agenda::::get(10).is_empty()); + assert!(Agenda::::get(110)[0].is_some()); + assert_eq!(Retries::::iter().count(), 1); + assert_eq!(logger::log(), vec![(root(), 42u32)]); + // nothing changed + run_to_block(109); + assert!(Agenda::::get(110)[0].is_some()); + // original task still has 2 remaining retries + assert_eq!(Retries::::get((110, 0)).unwrap().remaining, 2); + assert_eq!(logger::log(), vec![(root(), 42u32)]); + // make 42 fail next block + Threshold::::put((1, 2)); + // 42 will fail because we're outside the set threshold (block number in `1..2`), so it + // should be retried next block (at block 111) + run_to_block(110); + // should be queued for the normal period of 100 blocks + assert!(Agenda::::get(210)[0].is_some()); + // should also be queued to be retried next block + assert!(Agenda::::get(111)[0].is_some()); + // 42 retry clone has consumed one retry attempt + assert_eq!(Retries::::get((111, 0)).unwrap().remaining, 1); + // 42 original task still has the original remaining attempts + assert_eq!(Retries::::get((210, 0)).unwrap().remaining, 2); + assert_eq!(Retries::::iter().count(), 2); + assert_eq!(logger::log(), vec![(root(), 42u32)]); + // 42 retry will fail again + run_to_block(111); + // should still be queued for the normal period + assert!(Agenda::::get(210)[0].is_some()); + // should be queued to be retried next block + assert!(Agenda::::get(112)[0].is_some()); + // 42 has consumed another retry attempt + assert_eq!(Retries::::get((210, 0)).unwrap().remaining, 2); + assert_eq!(Retries::::get((112, 0)).unwrap().remaining, 0); + assert_eq!(Retries::::iter().count(), 2); + assert_eq!(logger::log(), vec![(root(), 42u32)]); + // 42 retry will fail again + run_to_block(112); + // should still be queued for the normal period + assert!(Agenda::::get(210)[0].is_some()); + // 42 retry clone ran out of retries, must have been evicted + assert_eq!(Agenda::::iter().count(), 1); + + // advance + run_to_block(209); + // should still be queued for the normal period + assert!(Agenda::::get(210)[0].is_some()); + // 42 retry clone ran out of retries, must have been evicted + assert_eq!(Agenda::::iter().count(), 1); + // 42 should fail again and should spawn another retry clone + run_to_block(210); + // should be queued for the normal period of 100 blocks + assert!(Agenda::::get(310)[0].is_some()); + // should also be queued to be retried next block + assert!(Agenda::::get(211)[0].is_some()); + // 42 retry clone has consumed one retry attempt + assert_eq!(Retries::::get((211, 0)).unwrap().remaining, 1); + // 42 original task still has the original remaining attempts + assert_eq!(Retries::::get((310, 0)).unwrap().remaining, 2); + assert_eq!(Retries::::iter().count(), 2); + assert_eq!(logger::log(), vec![(root(), 42u32)]); + // make 42 run successfully again + Threshold::::put((1, 1000)); + // 42 retry clone should now succeed + run_to_block(211); + // should be queued for the normal period of 100 blocks + assert!(Agenda::::get(310)[0].is_some()); + // retry was successful, retry task should have been discarded + assert_eq!(Agenda::::iter().count(), 1); + // 42 original task still has the original remaining attempts + assert_eq!(Retries::::get((310, 0)).unwrap().remaining, 2); + assert_eq!(Retries::::iter().count(), 1); + assert_eq!(logger::log(), vec![(root(), 42u32), (root(), 42u32)]); + + // fast forward to the last periodic run of 42 + run_to_block(310); + // 42 was successful, the period ended as this was the 4th scheduled periodic run so 42 must + // have been discarded + assert_eq!(Agenda::::iter().count(), 0); + // agenda is empty so no retries should exist + assert_eq!(Retries::::iter().count(), 0); + assert_eq!(logger::log(), vec![(root(), 42u32), (root(), 42u32), (root(), 42u32)]); + }); +} + #[test] fn reschedule_works() { new_test_ext().execute_with(|| { @@ -259,7 +1119,7 @@ fn reschedule_named_works() { } #[test] -fn reschedule_named_perodic_works() { +fn reschedule_named_periodic_works() { new_test_ext().execute_with(|| { let call = RuntimeCall::Logger(LoggerCall::log { i: 42, weight: Weight::from_parts(10, 0) }); @@ -430,6 +1290,117 @@ fn scheduler_respects_weight_limits() { }); } +#[test] +fn retry_respects_weight_limits() { + let max_weight: Weight = ::MaximumWeight::get(); + new_test_ext().execute_with(|| { + // schedule 42 + let call = RuntimeCall::Logger(LoggerCall::log { i: 42, weight: max_weight / 3 * 2 }); + assert_ok!(Scheduler::do_schedule( + DispatchTime::At(8), + None, + 127, + root(), + Preimage::bound(call).unwrap(), + )); + // schedule 20 with a call that will fail until we reach block 8 + Threshold::::put((8, 100)); + let call = RuntimeCall::Logger(LoggerCall::timed_log { i: 20, weight: max_weight / 3 * 2 }); + assert_ok!(Scheduler::do_schedule( + DispatchTime::At(4), + None, + 127, + root(), + Preimage::bound(call).unwrap(), + )); + // set a retry config for 20 for 10 retries every block + assert_ok!(Scheduler::set_retry(root().into(), (4, 0), 10, 1)); + // 20 should fail and be retried later + run_to_block(4); + assert!(Agenda::::get(5)[0].is_some()); + assert!(Agenda::::get(8)[0].is_some()); + assert_eq!(Retries::::iter().count(), 1); + assert!(logger::log().is_empty()); + // 20 still fails but is scheduled next block together with 42 + run_to_block(7); + assert_eq!(Agenda::::get(8).len(), 2); + assert_eq!(Retries::::iter().count(), 1); + assert!(logger::log().is_empty()); + // 20 and 42 do not fit together + // 42 is executed as it was first in the queue + // 20 is still on the 8th block's agenda + run_to_block(8); + assert!(Agenda::::get(8)[0].is_none()); + assert!(Agenda::::get(8)[1].is_some()); + assert_eq!(Retries::::iter().count(), 1); + assert_eq!(logger::log(), vec![(root(), 42u32)]); + // 20 is executed and the schedule is cleared + run_to_block(9); + assert_eq!(Agenda::::iter().count(), 0); + assert_eq!(Retries::::iter().count(), 0); + assert_eq!(logger::log(), vec![(root(), 42u32), (root(), 20u32)]); + }); +} + +#[test] +fn try_schedule_retry_respects_weight_limits() { + let max_weight: Weight = ::MaximumWeight::get(); + new_test_ext().execute_with(|| { + let service_agendas_weight = ::WeightInfo::service_agendas_base(); + let service_agenda_weight = ::WeightInfo::service_agenda_base( + ::MaxScheduledPerBlock::get(), + ); + let actual_service_agenda_weight = ::WeightInfo::service_agenda_base(1); + // Some weight for `service_agenda` will be refunded, so we need to make sure the weight + // `try_schedule_retry` is going to ask for is greater than this difference, and we take a + // safety factor of 10 to make sure we're over that limit. + let meter = WeightMeter::with_limit( + ::WeightInfo::schedule_retry( + ::MaxScheduledPerBlock::get(), + ) / 10, + ); + assert!(meter.can_consume(service_agenda_weight - actual_service_agenda_weight)); + + let reference_call = + RuntimeCall::Logger(LoggerCall::timed_log { i: 20, weight: max_weight / 3 * 2 }); + let bounded = ::Preimages::bound(reference_call).unwrap(); + let base_weight = ::WeightInfo::service_task( + bounded.lookup_len().map(|x| x as usize), + false, + false, + ); + // we make the call cost enough so that all checks have enough weight to run aside from + // `try_schedule_retry` + let call_weight = max_weight - service_agendas_weight - service_agenda_weight - base_weight; + let call = RuntimeCall::Logger(LoggerCall::timed_log { i: 20, weight: call_weight }); + // schedule 20 with a call that will fail until we reach block 8 + Threshold::::put((8, 100)); + + assert_ok!(Scheduler::do_schedule( + DispatchTime::At(4), + None, + 127, + root(), + Preimage::bound(call).unwrap(), + )); + // set a retry config for 20 for 10 retries every block + assert_ok!(Scheduler::set_retry(root().into(), (4, 0), 10, 1)); + // 20 should fail and, because of insufficient weight, it should not be scheduled again + run_to_block(4); + // nothing else should be scheduled + assert_eq!(Agenda::::iter().count(), 0); + assert_eq!(Retries::::iter().count(), 0); + assert_eq!(logger::log(), vec![]); + // check the `RetryFailed` event happened + let events = frame_system::Pallet::::events(); + let system_event: ::RuntimeEvent = + Event::RetryFailed { task: (4, 0), id: None }.into(); + // compare to the last event record + let frame_system::EventRecord { event, .. } = &events[events.len() - 1]; + assert_eq!(event, &system_event); + }); +} + /// Permanently overweight calls are not deleted but also not executed. #[test] fn scheduler_does_not_delete_permanently_overweight_call() { @@ -530,8 +1501,11 @@ fn scheduler_handles_periodic_unavailable_preimage() { run_to_block(4); assert_eq!(logger::log().len(), 1); - // Unnote the preimage + // As the public api doesn't support to remove a noted preimage, we need to first unnote it + // and then request it again. Basically this should not happen in real life (whatever you + // call real life;). Preimage::unnote(&hash); + Preimage::request(&hash); // Does not ever execute again. run_to_block(100); @@ -877,6 +1851,134 @@ fn should_check_origin_for_cancel() { }); } +#[test] +fn cancel_removes_retry_entry() { + new_test_ext().execute_with(|| { + // task fails until block 99 is reached + Threshold::::put((99, 100)); + // task 20 at #4 + assert_ok!(Scheduler::do_schedule( + DispatchTime::At(4), + None, + 127, + root(), + Preimage::bound(RuntimeCall::Logger(logger::Call::timed_log { + i: 20, + weight: Weight::from_parts(10, 0) + })) + .unwrap() + )); + // named task 42 at #4 + assert_ok!(Scheduler::do_schedule_named( + [1u8; 32], + DispatchTime::At(4), + None, + 127, + root(), + Preimage::bound(RuntimeCall::Logger(logger::Call::timed_log { + i: 42, + weight: Weight::from_parts(10, 0) + })) + .unwrap() + )); + + assert_eq!(Agenda::::get(4).len(), 2); + // task 20 will be retried 3 times every block + assert_ok!(Scheduler::set_retry(root().into(), (4, 0), 10, 1)); + // task 42 will be retried 10 times every 3 blocks + assert_ok!(Scheduler::set_retry_named(root().into(), [1u8; 32], 10, 1)); + assert_eq!(Retries::::iter().count(), 2); + run_to_block(3); + assert!(logger::log().is_empty()); + assert_eq!(Agenda::::get(4).len(), 2); + // both tasks fail + run_to_block(4); + assert!(Agenda::::get(4).is_empty()); + // 42 and 20 are rescheduled for next block + assert_eq!(Agenda::::get(5).len(), 2); + assert!(logger::log().is_empty()); + // 42 and 20 still fail + run_to_block(5); + // 42 and 20 rescheduled for next block + assert_eq!(Agenda::::get(6).len(), 2); + assert_eq!(Retries::::iter().count(), 2); + assert!(logger::log().is_empty()); + + // even though 42 is being retried, the tasks scheduled for retries are not named + assert_eq!(Lookup::::iter().count(), 0); + assert!(Scheduler::cancel(root().into(), 6, 0).is_ok()); + + // 20 is removed, 42 still fails + run_to_block(6); + // 42 rescheduled for next block + assert_eq!(Agenda::::get(7).len(), 1); + // 20's retry entry is removed + assert!(!Retries::::contains_key((4, 0))); + assert_eq!(Retries::::iter().count(), 1); + assert!(logger::log().is_empty()); + + assert!(Scheduler::cancel(root().into(), 7, 0).is_ok()); + + // both tasks are canceled, everything is removed now + run_to_block(7); + assert!(Agenda::::get(8).is_empty()); + assert_eq!(Retries::::iter().count(), 0); + }); +} + +#[test] +fn cancel_retries_works() { + new_test_ext().execute_with(|| { + // task fails until block 99 is reached + Threshold::::put((99, 100)); + // task 20 at #4 + assert_ok!(Scheduler::do_schedule( + DispatchTime::At(4), + None, + 127, + root(), + Preimage::bound(RuntimeCall::Logger(logger::Call::timed_log { + i: 20, + weight: Weight::from_parts(10, 0) + })) + .unwrap() + )); + // named task 42 at #4 + assert_ok!(Scheduler::do_schedule_named( + [1u8; 32], + DispatchTime::At(4), + None, + 127, + root(), + Preimage::bound(RuntimeCall::Logger(logger::Call::timed_log { + i: 42, + weight: Weight::from_parts(10, 0) + })) + .unwrap() + )); + + assert_eq!(Agenda::::get(4).len(), 2); + // task 20 will be retried 3 times every block + assert_ok!(Scheduler::set_retry(root().into(), (4, 0), 10, 1)); + // task 42 will be retried 10 times every 3 blocks + assert_ok!(Scheduler::set_retry_named(root().into(), [1u8; 32], 10, 1)); + assert_eq!(Retries::::iter().count(), 2); + run_to_block(3); + assert!(logger::log().is_empty()); + assert_eq!(Agenda::::get(4).len(), 2); + // cancel the retry config for 20 + assert_ok!(Scheduler::cancel_retry(root().into(), (4, 0))); + assert_eq!(Retries::::iter().count(), 1); + // cancel the retry config for 42 + assert_ok!(Scheduler::cancel_retry_named(root().into(), [1u8; 32])); + assert_eq!(Retries::::iter().count(), 0); + run_to_block(4); + // both tasks failed and there are no more retries, so they are evicted + assert_eq!(Agenda::::get(4).len(), 0); + assert_eq!(Retries::::iter().count(), 0); + }); +} + #[test] fn migration_to_v4_works() { new_test_ext().execute_with(|| { @@ -1054,6 +2156,8 @@ fn test_migrate_origin() { match self { 3u32 => system::RawOrigin::Root.into(), 2u32 => system::RawOrigin::None.into(), + 101u32 => system::RawOrigin::Signed(101).into(), + 102u32 => system::RawOrigin::Signed(102).into(), _ => unreachable!("test make no use of it"), } } @@ -1184,9 +2288,18 @@ fn postponed_named_task_cannot_be_rescheduled() { // Run to a very large block. run_to_block(10); + // It was not executed. assert!(logger::log().is_empty()); - assert!(Preimage::is_requested(&hash)); + + // Preimage was not available + assert_eq!( + System::events().last().unwrap().event, + crate::Event::CallUnavailable { task: (4, 0), id: Some(name) }.into() + ); + + // So it should not be requested. + assert!(!Preimage::is_requested(&hash)); // Postponing removes the lookup. assert!(!Lookup::::contains_key(name)); @@ -1206,11 +2319,12 @@ fn postponed_named_task_cannot_be_rescheduled() { ); // Finally add the preimage. - assert_ok!(Preimage::note(call.encode().into())); + assert_ok!(Preimage::note_preimage(RuntimeOrigin::signed(0), call.encode())); + run_to_block(1000); // It did not execute. assert!(logger::log().is_empty()); - assert!(Preimage::is_requested(&hash)); + assert!(!Preimage::is_requested(&hash)); // Manually re-schedule the call by name does not work. assert_err!( @@ -1879,7 +2993,7 @@ fn reschedule_named_last_task_removes_agenda() { }); } -/// Ensures that an unvailable call sends an event. +/// Ensures that an unavailable call sends an event. #[test] fn unavailable_call_is_detected() { use frame_support::traits::schedule::v3::Named; @@ -1907,6 +3021,8 @@ fn unavailable_call_is_detected() { // Ensure the preimage isn't available assert!(!Preimage::have(&bound)); + // But we have requested it + assert!(Preimage::is_requested(&hash)); // Executes in block 4. run_to_block(4); @@ -1915,5 +3031,7 @@ fn unavailable_call_is_detected() { System::events().last().unwrap().event, crate::Event::CallUnavailable { task: (4, 0), id: Some(name) }.into() ); + // It should not be requested anymore. + assert!(!Preimage::is_requested(&hash)); }); } diff --git a/substrate/frame/scheduler/src/weights.rs b/substrate/frame/scheduler/src/weights.rs index 58d711862591d033b66251def364acd5ebbac7a7..62d2fe78049d333b1d252574669795f057e9658d 100644 --- a/substrate/frame/scheduler/src/weights.rs +++ b/substrate/frame/scheduler/src/weights.rs @@ -15,16 +15,16 @@ // See the License for the specific language governing permissions and // limitations under the License. -//! Autogenerated weights for pallet_scheduler +//! Autogenerated weights for `pallet_scheduler` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-06-16, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-04-09, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-e8ezs4ez-project-145-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("dev"), DB CACHE: 1024 +//! HOSTNAME: `runner-anb7yjbi-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: `1024` // Executed Command: -// ./target/production/substrate +// ./target/production/substrate-node // benchmark // pallet // --chain=dev @@ -35,12 +35,11 @@ // --no-median-slopes // --no-min-squares // --extrinsic=* -// --execution=wasm // --wasm-execution=compiled // --heap-pages=4096 -// --output=./frame/scheduler/src/weights.rs -// --header=./HEADER-APACHE2 -// --template=./.maintain/frame-weight-template.hbs +// --output=./substrate/frame/scheduler/src/weights.rs +// --header=./substrate/HEADER-APACHE2 +// --template=./substrate/.maintain/frame-weight-template.hbs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -50,7 +49,7 @@ use frame_support::{traits::Get, weights::{Weight, constants::RocksDbWeight}}; use core::marker::PhantomData; -/// Weight functions needed for pallet_scheduler. +/// Weight functions needed for `pallet_scheduler`. pub trait WeightInfo { fn service_agendas_base() -> Weight; fn service_agenda_base(s: u32, ) -> Weight; @@ -64,33 +63,38 @@ pub trait WeightInfo { fn cancel(s: u32, ) -> Weight; fn schedule_named(s: u32, ) -> Weight; fn cancel_named(s: u32, ) -> Weight; + fn schedule_retry(s: u32, ) -> Weight; + fn set_retry() -> Weight; + fn set_retry_named() -> Weight; + fn cancel_retry() -> Weight; + fn cancel_retry_named() -> Weight; } -/// Weights for pallet_scheduler using the Substrate node and recommended hardware. +/// Weights for `pallet_scheduler` using the Substrate node and recommended hardware. pub struct SubstrateWeight(PhantomData); impl WeightInfo for SubstrateWeight { - /// Storage: Scheduler IncompleteSince (r:1 w:1) - /// Proof: Scheduler IncompleteSince (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + /// Storage: `Scheduler::IncompleteSince` (r:1 w:1) + /// Proof: `Scheduler::IncompleteSince` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) fn service_agendas_base() -> Weight { // Proof Size summary in bytes: // Measured: `31` // Estimated: `1489` - // Minimum execution time: 3_991_000 picoseconds. - Weight::from_parts(4_174_000, 1489) + // Minimum execution time: 3_099_000 picoseconds. + Weight::from_parts(3_298_000, 1489) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: Scheduler Agenda (r:1 w:1) - /// Proof: Scheduler Agenda (max_values: None, max_size: Some(107022), added: 109497, mode: MaxEncodedLen) + /// Storage: `Scheduler::Agenda` (r:1 w:1) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`) /// The range of component `s` is `[0, 512]`. fn service_agenda_base(s: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `81 + s * (177 ±0)` // Estimated: `110487` - // Minimum execution time: 3_581_000 picoseconds. - Weight::from_parts(7_413_174, 110487) - // Standard Error: 971 - .saturating_add(Weight::from_parts(348_077, 0).saturating_mul(s.into())) + // Minimum execution time: 3_558_000 picoseconds. + Weight::from_parts(5_984_191, 110487) + // Standard Error: 564 + .saturating_add(Weight::from_parts(334_983, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -98,145 +102,228 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 5_250_000 picoseconds. - Weight::from_parts(5_549_000, 0) + // Minimum execution time: 3_389_000 picoseconds. + Weight::from_parts(3_609_000, 0) } - /// Storage: Preimage PreimageFor (r:1 w:1) - /// Proof: Preimage PreimageFor (max_values: None, max_size: Some(4194344), added: 4196819, mode: Measured) - /// Storage: Preimage StatusFor (r:1 w:1) - /// Proof: Preimage StatusFor (max_values: None, max_size: Some(91), added: 2566, mode: MaxEncodedLen) + /// Storage: `Preimage::PreimageFor` (r:1 w:1) + /// Proof: `Preimage::PreimageFor` (`max_values`: None, `max_size`: Some(4194344), added: 4196819, mode: `Measured`) + /// Storage: `Preimage::StatusFor` (r:1 w:0) + /// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) + /// Storage: `Preimage::RequestStatusFor` (r:1 w:1) + /// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) /// The range of component `s` is `[128, 4194304]`. fn service_task_fetched(s: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `179 + s * (1 ±0)` - // Estimated: `3644 + s * (1 ±0)` - // Minimum execution time: 20_089_000 picoseconds. - Weight::from_parts(20_376_000, 3644) - // Standard Error: 3 - .saturating_add(Weight::from_parts(1_170, 0).saturating_mul(s.into())) - .saturating_add(T::DbWeight::get().reads(2_u64)) + // Measured: `246 + s * (1 ±0)` + // Estimated: `3711 + s * (1 ±0)` + // Minimum execution time: 18_292_000 picoseconds. + Weight::from_parts(18_574_000, 3711) + // Standard Error: 1 + .saturating_add(Weight::from_parts(1_189, 0).saturating_mul(s.into())) + .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) .saturating_add(Weight::from_parts(0, 1).saturating_mul(s.into())) } - /// Storage: Scheduler Lookup (r:0 w:1) - /// Proof: Scheduler Lookup (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) + /// Storage: `Scheduler::Lookup` (r:0 w:1) + /// Proof: `Scheduler::Lookup` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) fn service_task_named() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 6_998_000 picoseconds. - Weight::from_parts(7_303_000, 0) + // Minimum execution time: 5_216_000 picoseconds. + Weight::from_parts(5_439_000, 0) .saturating_add(T::DbWeight::get().writes(1_u64)) } fn service_task_periodic() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 5_078_000 picoseconds. - Weight::from_parts(5_315_000, 0) + // Minimum execution time: 3_383_000 picoseconds. + Weight::from_parts(3_661_000, 0) } + /// Storage: `SafeMode::EnteredUntil` (r:1 w:0) + /// Proof: `SafeMode::EnteredUntil` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `TxPause::PausedCalls` (r:1 w:0) + /// Proof: `TxPause::PausedCalls` (`max_values`: None, `max_size`: Some(532), added: 3007, mode: `MaxEncodedLen`) fn execute_dispatch_signed() -> Weight { // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_228_000 picoseconds. - Weight::from_parts(2_352_000, 0) + // Measured: `145` + // Estimated: `3997` + // Minimum execution time: 6_692_000 picoseconds. + Weight::from_parts(7_069_000, 3997) + .saturating_add(T::DbWeight::get().reads(2_u64)) } fn execute_dispatch_unsigned() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_226_000 picoseconds. - Weight::from_parts(2_371_000, 0) + // Minimum execution time: 2_165_000 picoseconds. + Weight::from_parts(2_332_000, 0) } - /// Storage: Scheduler Agenda (r:1 w:1) - /// Proof: Scheduler Agenda (max_values: None, max_size: Some(107022), added: 109497, mode: MaxEncodedLen) + /// Storage: `Scheduler::Agenda` (r:1 w:1) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`) /// The range of component `s` is `[0, 511]`. fn schedule(s: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `81 + s * (177 ±0)` // Estimated: `110487` - // Minimum execution time: 12_683_000 picoseconds. - Weight::from_parts(16_951_846, 110487) - // Standard Error: 1_046 - .saturating_add(Weight::from_parts(380_842, 0).saturating_mul(s.into())) + // Minimum execution time: 10_209_000 picoseconds. + Weight::from_parts(11_235_511, 110487) + // Standard Error: 906 + .saturating_add(Weight::from_parts(375_445, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: Scheduler Agenda (r:1 w:1) - /// Proof: Scheduler Agenda (max_values: None, max_size: Some(107022), added: 109497, mode: MaxEncodedLen) - /// Storage: Scheduler Lookup (r:0 w:1) - /// Proof: Scheduler Lookup (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) + /// Storage: `Scheduler::Agenda` (r:1 w:1) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Retries` (r:0 w:1) + /// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Lookup` (r:0 w:1) + /// Proof: `Scheduler::Lookup` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) /// The range of component `s` is `[1, 512]`. fn cancel(s: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `81 + s * (177 ±0)` // Estimated: `110487` - // Minimum execution time: 16_201_000 picoseconds. - Weight::from_parts(18_259_422, 110487) - // Standard Error: 1_344 - .saturating_add(Weight::from_parts(545_863, 0).saturating_mul(s.into())) + // Minimum execution time: 15_906_000 picoseconds. + Weight::from_parts(13_697_344, 110487) + // Standard Error: 949 + .saturating_add(Weight::from_parts(564_461, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1_u64)) - .saturating_add(T::DbWeight::get().writes(2_u64)) + .saturating_add(T::DbWeight::get().writes(3_u64)) } - /// Storage: Scheduler Lookup (r:1 w:1) - /// Proof: Scheduler Lookup (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) - /// Storage: Scheduler Agenda (r:1 w:1) - /// Proof: Scheduler Agenda (max_values: None, max_size: Some(107022), added: 109497, mode: MaxEncodedLen) + /// Storage: `Scheduler::Lookup` (r:1 w:1) + /// Proof: `Scheduler::Lookup` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Agenda` (r:1 w:1) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`) /// The range of component `s` is `[0, 511]`. fn schedule_named(s: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `596 + s * (178 ±0)` // Estimated: `110487` - // Minimum execution time: 16_180_000 picoseconds. - Weight::from_parts(25_128_925, 110487) - // Standard Error: 1_118 - .saturating_add(Weight::from_parts(375_631, 0).saturating_mul(s.into())) + // Minimum execution time: 13_618_000 picoseconds. + Weight::from_parts(17_489_572, 110487) + // Standard Error: 766 + .saturating_add(Weight::from_parts(377_559, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } - /// Storage: Scheduler Lookup (r:1 w:1) - /// Proof: Scheduler Lookup (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) - /// Storage: Scheduler Agenda (r:1 w:1) - /// Proof: Scheduler Agenda (max_values: None, max_size: Some(107022), added: 109497, mode: MaxEncodedLen) + /// Storage: `Scheduler::Lookup` (r:1 w:1) + /// Proof: `Scheduler::Lookup` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Agenda` (r:1 w:1) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Retries` (r:0 w:1) + /// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`) /// The range of component `s` is `[1, 512]`. fn cancel_named(s: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `709 + s * (177 ±0)` // Estimated: `110487` - // Minimum execution time: 18_244_000 picoseconds. - Weight::from_parts(21_439_366, 110487) - // Standard Error: 1_084 - .saturating_add(Weight::from_parts(557_691, 0).saturating_mul(s.into())) + // Minimum execution time: 17_954_000 picoseconds. + Weight::from_parts(18_459_344, 110487) + // Standard Error: 835 + .saturating_add(Weight::from_parts(585_557, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(2_u64)) + .saturating_add(T::DbWeight::get().writes(3_u64)) + } + /// Storage: `Scheduler::Agenda` (r:1 w:1) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Retries` (r:0 w:1) + /// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`) + /// The range of component `s` is `[1, 512]`. + fn schedule_retry(s: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `118` + // Estimated: `110487` + // Minimum execution time: 9_446_000 picoseconds. + Weight::from_parts(10_797_672, 110487) + // Standard Error: 184 + .saturating_add(Weight::from_parts(13_971, 0).saturating_mul(s.into())) + .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } + /// Storage: `Scheduler::Agenda` (r:1 w:0) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Retries` (r:0 w:1) + /// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`) + fn set_retry() -> Weight { + // Proof Size summary in bytes: + // Measured: `90705` + // Estimated: `110487` + // Minimum execution time: 137_044_000 picoseconds. + Weight::from_parts(142_855_000, 110487) + .saturating_add(T::DbWeight::get().reads(1_u64)) + .saturating_add(T::DbWeight::get().writes(1_u64)) + } + /// Storage: `Scheduler::Lookup` (r:1 w:0) + /// Proof: `Scheduler::Lookup` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Agenda` (r:1 w:0) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Retries` (r:0 w:1) + /// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`) + fn set_retry_named() -> Weight { + // Proof Size summary in bytes: + // Measured: `91747` + // Estimated: `110487` + // Minimum execution time: 144_333_000 picoseconds. + Weight::from_parts(149_251_000, 110487) + .saturating_add(T::DbWeight::get().reads(2_u64)) + .saturating_add(T::DbWeight::get().writes(1_u64)) + } + /// Storage: `Scheduler::Agenda` (r:1 w:0) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Retries` (r:0 w:1) + /// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`) + fn cancel_retry() -> Weight { + // Proof Size summary in bytes: + // Measured: `90717` + // Estimated: `110487` + // Minimum execution time: 132_387_000 picoseconds. + Weight::from_parts(139_222_000, 110487) + .saturating_add(T::DbWeight::get().reads(1_u64)) + .saturating_add(T::DbWeight::get().writes(1_u64)) + } + /// Storage: `Scheduler::Lookup` (r:1 w:0) + /// Proof: `Scheduler::Lookup` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Agenda` (r:1 w:0) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Retries` (r:0 w:1) + /// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`) + fn cancel_retry_named() -> Weight { + // Proof Size summary in bytes: + // Measured: `91759` + // Estimated: `110487` + // Minimum execution time: 141_082_000 picoseconds. + Weight::from_parts(146_117_000, 110487) + .saturating_add(T::DbWeight::get().reads(2_u64)) + .saturating_add(T::DbWeight::get().writes(1_u64)) + } } -// For backwards compatibility and tests +// For backwards compatibility and tests. impl WeightInfo for () { - /// Storage: Scheduler IncompleteSince (r:1 w:1) - /// Proof: Scheduler IncompleteSince (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + /// Storage: `Scheduler::IncompleteSince` (r:1 w:1) + /// Proof: `Scheduler::IncompleteSince` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) fn service_agendas_base() -> Weight { // Proof Size summary in bytes: // Measured: `31` // Estimated: `1489` - // Minimum execution time: 3_991_000 picoseconds. - Weight::from_parts(4_174_000, 1489) + // Minimum execution time: 3_099_000 picoseconds. + Weight::from_parts(3_298_000, 1489) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Scheduler Agenda (r:1 w:1) - /// Proof: Scheduler Agenda (max_values: None, max_size: Some(107022), added: 109497, mode: MaxEncodedLen) + /// Storage: `Scheduler::Agenda` (r:1 w:1) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`) /// The range of component `s` is `[0, 512]`. fn service_agenda_base(s: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `81 + s * (177 ±0)` // Estimated: `110487` - // Minimum execution time: 3_581_000 picoseconds. - Weight::from_parts(7_413_174, 110487) - // Standard Error: 971 - .saturating_add(Weight::from_parts(348_077, 0).saturating_mul(s.into())) + // Minimum execution time: 3_558_000 picoseconds. + Weight::from_parts(5_984_191, 110487) + // Standard Error: 564 + .saturating_add(Weight::from_parts(334_983, 0).saturating_mul(s.into())) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -244,117 +331,200 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 5_250_000 picoseconds. - Weight::from_parts(5_549_000, 0) + // Minimum execution time: 3_389_000 picoseconds. + Weight::from_parts(3_609_000, 0) } - /// Storage: Preimage PreimageFor (r:1 w:1) - /// Proof: Preimage PreimageFor (max_values: None, max_size: Some(4194344), added: 4196819, mode: Measured) - /// Storage: Preimage StatusFor (r:1 w:1) - /// Proof: Preimage StatusFor (max_values: None, max_size: Some(91), added: 2566, mode: MaxEncodedLen) + /// Storage: `Preimage::PreimageFor` (r:1 w:1) + /// Proof: `Preimage::PreimageFor` (`max_values`: None, `max_size`: Some(4194344), added: 4196819, mode: `Measured`) + /// Storage: `Preimage::StatusFor` (r:1 w:0) + /// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) + /// Storage: `Preimage::RequestStatusFor` (r:1 w:1) + /// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) /// The range of component `s` is `[128, 4194304]`. fn service_task_fetched(s: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `179 + s * (1 ±0)` - // Estimated: `3644 + s * (1 ±0)` - // Minimum execution time: 20_089_000 picoseconds. - Weight::from_parts(20_376_000, 3644) - // Standard Error: 3 - .saturating_add(Weight::from_parts(1_170, 0).saturating_mul(s.into())) - .saturating_add(RocksDbWeight::get().reads(2_u64)) + // Measured: `246 + s * (1 ±0)` + // Estimated: `3711 + s * (1 ±0)` + // Minimum execution time: 18_292_000 picoseconds. + Weight::from_parts(18_574_000, 3711) + // Standard Error: 1 + .saturating_add(Weight::from_parts(1_189, 0).saturating_mul(s.into())) + .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) .saturating_add(Weight::from_parts(0, 1).saturating_mul(s.into())) } - /// Storage: Scheduler Lookup (r:0 w:1) - /// Proof: Scheduler Lookup (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) + /// Storage: `Scheduler::Lookup` (r:0 w:1) + /// Proof: `Scheduler::Lookup` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) fn service_task_named() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 6_998_000 picoseconds. - Weight::from_parts(7_303_000, 0) + // Minimum execution time: 5_216_000 picoseconds. + Weight::from_parts(5_439_000, 0) .saturating_add(RocksDbWeight::get().writes(1_u64)) } fn service_task_periodic() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 5_078_000 picoseconds. - Weight::from_parts(5_315_000, 0) + // Minimum execution time: 3_383_000 picoseconds. + Weight::from_parts(3_661_000, 0) } + /// Storage: `SafeMode::EnteredUntil` (r:1 w:0) + /// Proof: `SafeMode::EnteredUntil` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `TxPause::PausedCalls` (r:1 w:0) + /// Proof: `TxPause::PausedCalls` (`max_values`: None, `max_size`: Some(532), added: 3007, mode: `MaxEncodedLen`) fn execute_dispatch_signed() -> Weight { // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 2_228_000 picoseconds. - Weight::from_parts(2_352_000, 0) + // Measured: `145` + // Estimated: `3997` + // Minimum execution time: 6_692_000 picoseconds. + Weight::from_parts(7_069_000, 3997) + .saturating_add(RocksDbWeight::get().reads(2_u64)) } fn execute_dispatch_unsigned() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_226_000 picoseconds. - Weight::from_parts(2_371_000, 0) + // Minimum execution time: 2_165_000 picoseconds. + Weight::from_parts(2_332_000, 0) } - /// Storage: Scheduler Agenda (r:1 w:1) - /// Proof: Scheduler Agenda (max_values: None, max_size: Some(107022), added: 109497, mode: MaxEncodedLen) + /// Storage: `Scheduler::Agenda` (r:1 w:1) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`) /// The range of component `s` is `[0, 511]`. fn schedule(s: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `81 + s * (177 ±0)` // Estimated: `110487` - // Minimum execution time: 12_683_000 picoseconds. - Weight::from_parts(16_951_846, 110487) - // Standard Error: 1_046 - .saturating_add(Weight::from_parts(380_842, 0).saturating_mul(s.into())) + // Minimum execution time: 10_209_000 picoseconds. + Weight::from_parts(11_235_511, 110487) + // Standard Error: 906 + .saturating_add(Weight::from_parts(375_445, 0).saturating_mul(s.into())) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Scheduler Agenda (r:1 w:1) - /// Proof: Scheduler Agenda (max_values: None, max_size: Some(107022), added: 109497, mode: MaxEncodedLen) - /// Storage: Scheduler Lookup (r:0 w:1) - /// Proof: Scheduler Lookup (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) + /// Storage: `Scheduler::Agenda` (r:1 w:1) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Retries` (r:0 w:1) + /// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Lookup` (r:0 w:1) + /// Proof: `Scheduler::Lookup` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) /// The range of component `s` is `[1, 512]`. fn cancel(s: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `81 + s * (177 ±0)` // Estimated: `110487` - // Minimum execution time: 16_201_000 picoseconds. - Weight::from_parts(18_259_422, 110487) - // Standard Error: 1_344 - .saturating_add(Weight::from_parts(545_863, 0).saturating_mul(s.into())) + // Minimum execution time: 15_906_000 picoseconds. + Weight::from_parts(13_697_344, 110487) + // Standard Error: 949 + .saturating_add(Weight::from_parts(564_461, 0).saturating_mul(s.into())) .saturating_add(RocksDbWeight::get().reads(1_u64)) - .saturating_add(RocksDbWeight::get().writes(2_u64)) + .saturating_add(RocksDbWeight::get().writes(3_u64)) } - /// Storage: Scheduler Lookup (r:1 w:1) - /// Proof: Scheduler Lookup (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) - /// Storage: Scheduler Agenda (r:1 w:1) - /// Proof: Scheduler Agenda (max_values: None, max_size: Some(107022), added: 109497, mode: MaxEncodedLen) + /// Storage: `Scheduler::Lookup` (r:1 w:1) + /// Proof: `Scheduler::Lookup` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Agenda` (r:1 w:1) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`) /// The range of component `s` is `[0, 511]`. fn schedule_named(s: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `596 + s * (178 ±0)` // Estimated: `110487` - // Minimum execution time: 16_180_000 picoseconds. - Weight::from_parts(25_128_925, 110487) - // Standard Error: 1_118 - .saturating_add(Weight::from_parts(375_631, 0).saturating_mul(s.into())) + // Minimum execution time: 13_618_000 picoseconds. + Weight::from_parts(17_489_572, 110487) + // Standard Error: 766 + .saturating_add(Weight::from_parts(377_559, 0).saturating_mul(s.into())) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } - /// Storage: Scheduler Lookup (r:1 w:1) - /// Proof: Scheduler Lookup (max_values: None, max_size: Some(48), added: 2523, mode: MaxEncodedLen) - /// Storage: Scheduler Agenda (r:1 w:1) - /// Proof: Scheduler Agenda (max_values: None, max_size: Some(107022), added: 109497, mode: MaxEncodedLen) + /// Storage: `Scheduler::Lookup` (r:1 w:1) + /// Proof: `Scheduler::Lookup` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Agenda` (r:1 w:1) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Retries` (r:0 w:1) + /// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`) /// The range of component `s` is `[1, 512]`. fn cancel_named(s: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `709 + s * (177 ±0)` // Estimated: `110487` - // Minimum execution time: 18_244_000 picoseconds. - Weight::from_parts(21_439_366, 110487) - // Standard Error: 1_084 - .saturating_add(Weight::from_parts(557_691, 0).saturating_mul(s.into())) + // Minimum execution time: 17_954_000 picoseconds. + Weight::from_parts(18_459_344, 110487) + // Standard Error: 835 + .saturating_add(Weight::from_parts(585_557, 0).saturating_mul(s.into())) .saturating_add(RocksDbWeight::get().reads(2_u64)) + .saturating_add(RocksDbWeight::get().writes(3_u64)) + } + /// Storage: `Scheduler::Agenda` (r:1 w:1) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Retries` (r:0 w:1) + /// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`) + /// The range of component `s` is `[1, 512]`. + fn schedule_retry(s: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `118` + // Estimated: `110487` + // Minimum execution time: 9_446_000 picoseconds. + Weight::from_parts(10_797_672, 110487) + // Standard Error: 184 + .saturating_add(Weight::from_parts(13_971, 0).saturating_mul(s.into())) + .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } + /// Storage: `Scheduler::Agenda` (r:1 w:0) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Retries` (r:0 w:1) + /// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`) + fn set_retry() -> Weight { + // Proof Size summary in bytes: + // Measured: `90705` + // Estimated: `110487` + // Minimum execution time: 137_044_000 picoseconds. + Weight::from_parts(142_855_000, 110487) + .saturating_add(RocksDbWeight::get().reads(1_u64)) + .saturating_add(RocksDbWeight::get().writes(1_u64)) + } + /// Storage: `Scheduler::Lookup` (r:1 w:0) + /// Proof: `Scheduler::Lookup` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Agenda` (r:1 w:0) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Retries` (r:0 w:1) + /// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`) + fn set_retry_named() -> Weight { + // Proof Size summary in bytes: + // Measured: `91747` + // Estimated: `110487` + // Minimum execution time: 144_333_000 picoseconds. + Weight::from_parts(149_251_000, 110487) + .saturating_add(RocksDbWeight::get().reads(2_u64)) + .saturating_add(RocksDbWeight::get().writes(1_u64)) + } + /// Storage: `Scheduler::Agenda` (r:1 w:0) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Retries` (r:0 w:1) + /// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`) + fn cancel_retry() -> Weight { + // Proof Size summary in bytes: + // Measured: `90717` + // Estimated: `110487` + // Minimum execution time: 132_387_000 picoseconds. + Weight::from_parts(139_222_000, 110487) + .saturating_add(RocksDbWeight::get().reads(1_u64)) + .saturating_add(RocksDbWeight::get().writes(1_u64)) + } + /// Storage: `Scheduler::Lookup` (r:1 w:0) + /// Proof: `Scheduler::Lookup` (`max_values`: None, `max_size`: Some(48), added: 2523, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Agenda` (r:1 w:0) + /// Proof: `Scheduler::Agenda` (`max_values`: None, `max_size`: Some(107022), added: 109497, mode: `MaxEncodedLen`) + /// Storage: `Scheduler::Retries` (r:0 w:1) + /// Proof: `Scheduler::Retries` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`) + fn cancel_retry_named() -> Weight { + // Proof Size summary in bytes: + // Measured: `91759` + // Estimated: `110487` + // Minimum execution time: 141_082_000 picoseconds. + Weight::from_parts(146_117_000, 110487) + .saturating_add(RocksDbWeight::get().reads(2_u64)) + .saturating_add(RocksDbWeight::get().writes(1_u64)) + } } diff --git a/substrate/frame/scored-pool/Cargo.toml b/substrate/frame/scored-pool/Cargo.toml index ae6ade5189d0f51b683f35f846c5391a569b163a..92b70e01b9ab7e37d0274b434b357eb654773e83 100644 --- a/substrate/frame/scored-pool/Cargo.toml +++ b/substrate/frame/scored-pool/Cargo.toml @@ -17,7 +17,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } frame-support = { path = "../support", default-features = false } frame-system = { path = "../system", default-features = false } sp-io = { path = "../../primitives/io", default-features = false } diff --git a/substrate/frame/scored-pool/src/mock.rs b/substrate/frame/scored-pool/src/mock.rs index e767b49b983a33635ccae9086bc23fd9595f1231..9d2f5eb1099f819ad0db2ac1c6d1878a5d2df2da 100644 --- a/substrate/frame/scored-pool/src/mock.rs +++ b/substrate/frame/scored-pool/src/mock.rs @@ -25,12 +25,7 @@ use frame_support::{ traits::{ConstU32, ConstU64}, }; use frame_system::EnsureSignedBy; -use sp_core::H256; -use sp_runtime::{ - bounded_vec, - traits::{BlakeTwo256, IdentityLookup}, - BuildStorage, -}; +use sp_runtime::{bounded_vec, BuildStorage}; type Block = frame_system::mocking::MockBlock; @@ -51,31 +46,10 @@ ord_parameter_types! { pub const ScoreOrigin: u64 = 3; } -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { - type BaseCallFilter = frame_support::traits::Everything; - type BlockWeights = (); - type BlockLength = (); - type DbWeight = (); - type RuntimeOrigin = RuntimeOrigin; - type Nonce = u64; - type Hash = H256; - type RuntimeCall = RuntimeCall; - type Hashing = BlakeTwo256; - type AccountId = u64; - type Lookup = IdentityLookup; type Block = Block; - type RuntimeEvent = RuntimeEvent; - type BlockHashCount = ConstU64<250>; - type Version = (); - type PalletInfo = PalletInfo; type AccountData = pallet_balances::AccountData; - type OnNewAccount = (); - type OnKilledAccount = (); - type SystemWeightInfo = (); - type SS58Prefix = (); - type OnSetCode = (); - type MaxConsumers = ConstU32<16>; } impl pallet_balances::Config for Test { diff --git a/substrate/frame/session/Cargo.toml b/substrate/frame/session/Cargo.toml index 91ffecbf7178ec6d241ba5f4f1d6d509c3aa307c..86814f8276e7bed8625f726b17d5ea18c6cf604f 100644 --- a/substrate/frame/session/Cargo.toml +++ b/substrate/frame/session/Cargo.toml @@ -18,8 +18,8 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } impl-trait-for-tuples = "0.2.2" -log = { version = "0.4.17", default-features = false } -scale-info = { version = "2.10.0", default-features = false, features = ["derive", "serde"] } +log = { workspace = true } +scale-info = { version = "2.11.1", default-features = false, features = ["derive", "serde"] } frame-support = { path = "../support", default-features = false } frame-system = { path = "../system", default-features = false } pallet-timestamp = { path = "../timestamp", default-features = false } diff --git a/substrate/frame/session/benchmarking/Cargo.toml b/substrate/frame/session/benchmarking/Cargo.toml index 291fda3c4c7a4bfb56224593778288b7557daa95..a00fbd8f6fdf5452b1e225332efaac7f0d09adfb 100644 --- a/substrate/frame/session/benchmarking/Cargo.toml +++ b/substrate/frame/session/benchmarking/Cargo.toml @@ -29,7 +29,7 @@ sp-std = { path = "../../../primitives/std", default-features = false } [dev-dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", features = ["derive"] } -scale-info = "2.10.0" +scale-info = "2.11.1" frame-election-provider-support = { path = "../../election-provider-support" } pallet-balances = { path = "../../balances" } pallet-staking-reward-curve = { path = "../../staking/reward-curve" } diff --git a/substrate/frame/session/benchmarking/src/mock.rs b/substrate/frame/session/benchmarking/src/mock.rs index 2ef8989f4b057da5baa34c5b6ec606fd0575861a..81052141fd8650106a2bbc68a5a67f2dbf457545 100644 --- a/substrate/frame/session/benchmarking/src/mock.rs +++ b/substrate/frame/session/benchmarking/src/mock.rs @@ -45,7 +45,7 @@ frame_support::construct_runtime!( } ); -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { type BaseCallFilter = frame_support::traits::Everything; type BlockWeights = (); diff --git a/substrate/frame/session/src/historical/mod.rs b/substrate/frame/session/src/historical/mod.rs index d74e9dd0b7c54042840c62feff0693359f97c6c9..b9cecea1a7f7144fb7f846548b827455dce0a1e5 100644 --- a/substrate/frame/session/src/historical/mod.rs +++ b/substrate/frame/session/src/historical/mod.rs @@ -58,7 +58,7 @@ pub mod pallet { use super::*; use frame_support::pallet_prelude::*; - /// The current storage version. + /// The in-code storage version. const STORAGE_VERSION: StorageVersion = StorageVersion::new(1); #[pallet::pallet] diff --git a/substrate/frame/session/src/lib.rs b/substrate/frame/session/src/lib.rs index 178d43f596b2742af69d35437592d78bd030a63d..17b6aa7a4640ce764919c7e20a07cb7ba1261486 100644 --- a/substrate/frame/session/src/lib.rs +++ b/substrate/frame/session/src/lib.rs @@ -285,7 +285,11 @@ pub trait SessionHandler { /// before initialization of your pallet. /// /// `changed` is true whenever any of the session keys or underlying economic - /// identities or weightings behind those keys has changed. + /// identities or weightings behind `validators` keys has changed. `queued_validators` + /// could change without `validators` changing. Example of possible sequent calls: + /// Session N: on_new_session(false, unchanged_validators, unchanged_queued_validators) + /// Session N + 1: on_new_session(false, unchanged_validators, new_queued_validators) + /// Session N + 2: on_new_session(true, new_queued_validators, new_queued_validators) fn on_new_session( changed: bool, validators: &[(ValidatorId, Ks)], @@ -368,7 +372,7 @@ pub mod pallet { use frame_support::pallet_prelude::*; use frame_system::pallet_prelude::*; - /// The current storage version. + /// The in-code storage version. const STORAGE_VERSION: StorageVersion = StorageVersion::new(0); #[pallet::pallet] @@ -460,27 +464,13 @@ pub mod pallet { ); self.keys.iter().map(|x| x.1.clone()).collect() }); - assert!( - !initial_validators_0.is_empty(), - "Empty validator set for session 0 in genesis block!" - ); let initial_validators_1 = T::SessionManager::new_session_genesis(1) .unwrap_or_else(|| initial_validators_0.clone()); - assert!( - !initial_validators_1.is_empty(), - "Empty validator set for session 1 in genesis block!" - ); let queued_keys: Vec<_> = initial_validators_1 - .iter() - .cloned() - .map(|v| { - ( - v.clone(), - Pallet::::load_keys(&v).expect("Validator in session 1 missing keys!"), - ) - }) + .into_iter() + .filter_map(|v| Pallet::::load_keys(&v).map(|k| (v, k))) .collect(); // Tell everyone about the genesis session keys diff --git a/substrate/frame/session/src/migrations/v1.rs b/substrate/frame/session/src/migrations/v1.rs index 394a1f4a5227c2bc3bedf0d177e1f9ee88a89528..b6838099837a00a7f440cf8229fbdc2c9bd5b896 100644 --- a/substrate/frame/session/src/migrations/v1.rs +++ b/substrate/frame/session/src/migrations/v1.rs @@ -15,8 +15,8 @@ // See the License for the specific language governing permissions and // limitations under the License. +use core::str; use sp_io::hashing::twox_128; -use sp_std::str; use frame_support::{ storage::{generator::StorageValue, StoragePrefixedMap}, diff --git a/substrate/frame/session/src/mock.rs b/substrate/frame/session/src/mock.rs index eb9eddfd847e6275363ff297671d4318fefd3283..25b81668cc084cbc226b283a60ec9b3184e9cc34 100644 --- a/substrate/frame/session/src/mock.rs +++ b/substrate/frame/session/src/mock.rs @@ -24,20 +24,12 @@ use crate::historical as pallet_session_historical; use std::collections::BTreeMap; -use sp_core::{crypto::key_types::DUMMY, H256}; -use sp_runtime::{ - impl_opaque_keys, - testing::UintAuthorityId, - traits::{BlakeTwo256, IdentityLookup}, - BuildStorage, -}; +use sp_core::crypto::key_types::DUMMY; +use sp_runtime::{impl_opaque_keys, testing::UintAuthorityId, BuildStorage}; use sp_staking::SessionIndex; use sp_state_machine::BasicExternalities; -use frame_support::{ - derive_impl, parameter_types, - traits::{ConstU32, ConstU64}, -}; +use frame_support::{derive_impl, parameter_types, traits::ConstU64}; impl_opaque_keys! { pub struct MockSessionKeys { @@ -232,31 +224,9 @@ pub fn new_test_ext() -> sp_io::TestExternalities { sp_io::TestExternalities::new(t) } -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { - type BaseCallFilter = frame_support::traits::Everything; - type BlockWeights = (); - type BlockLength = (); - type DbWeight = (); - type RuntimeOrigin = RuntimeOrigin; - type Nonce = u64; - type RuntimeCall = RuntimeCall; - type Hash = H256; - type Hashing = BlakeTwo256; - type AccountId = u64; - type Lookup = IdentityLookup; type Block = Block; - type RuntimeEvent = RuntimeEvent; - type BlockHashCount = ConstU64<250>; - type Version = (); - type PalletInfo = PalletInfo; - type AccountData = (); - type OnNewAccount = (); - type OnKilledAccount = (); - type SystemWeightInfo = (); - type SS58Prefix = (); - type OnSetCode = (); - type MaxConsumers = ConstU32<16>; } impl pallet_timestamp::Config for Test { diff --git a/substrate/frame/session/src/weights.rs b/substrate/frame/session/src/weights.rs index dd9848fd2c177913f9121f98ab269bdae7e0f40e..2908a7563f0791441fad24719972b161bfcdf5df 100644 --- a/substrate/frame/session/src/weights.rs +++ b/substrate/frame/session/src/weights.rs @@ -15,16 +15,16 @@ // See the License for the specific language governing permissions and // limitations under the License. -//! Autogenerated weights for pallet_session +//! Autogenerated weights for `pallet_session` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-06-16, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-04-09, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-e8ezs4ez-project-145-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("dev"), DB CACHE: 1024 +//! HOSTNAME: `runner-anb7yjbi-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: `1024` // Executed Command: -// ./target/production/substrate +// ./target/production/substrate-node // benchmark // pallet // --chain=dev @@ -35,12 +35,11 @@ // --no-median-slopes // --no-min-squares // --extrinsic=* -// --execution=wasm // --wasm-execution=compiled // --heap-pages=4096 -// --output=./frame/session/src/weights.rs -// --header=./HEADER-APACHE2 -// --template=./.maintain/frame-weight-template.hbs +// --output=./substrate/frame/session/src/weights.rs +// --header=./substrate/HEADER-APACHE2 +// --template=./substrate/.maintain/frame-weight-template.hbs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -50,77 +49,77 @@ use frame_support::{traits::Get, weights::{Weight, constants::RocksDbWeight}}; use core::marker::PhantomData; -/// Weight functions needed for pallet_session. +/// Weight functions needed for `pallet_session`. pub trait WeightInfo { fn set_keys() -> Weight; fn purge_keys() -> Weight; } -/// Weights for pallet_session using the Substrate node and recommended hardware. +/// Weights for `pallet_session` using the Substrate node and recommended hardware. pub struct SubstrateWeight(PhantomData); impl WeightInfo for SubstrateWeight { - /// Storage: Staking Ledger (r:1 w:0) - /// Proof: Staking Ledger (max_values: None, max_size: Some(1091), added: 3566, mode: MaxEncodedLen) - /// Storage: Session NextKeys (r:1 w:1) - /// Proof Skipped: Session NextKeys (max_values: None, max_size: None, mode: Measured) - /// Storage: Session KeyOwner (r:4 w:4) - /// Proof Skipped: Session KeyOwner (max_values: None, max_size: None, mode: Measured) + /// Storage: `Staking::Ledger` (r:1 w:0) + /// Proof: `Staking::Ledger` (`max_values`: None, `max_size`: Some(1091), added: 3566, mode: `MaxEncodedLen`) + /// Storage: `Session::NextKeys` (r:1 w:1) + /// Proof: `Session::NextKeys` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Session::KeyOwner` (r:6 w:6) + /// Proof: `Session::KeyOwner` (`max_values`: None, `max_size`: None, mode: `Measured`) fn set_keys() -> Weight { // Proof Size summary in bytes: - // Measured: `1924` - // Estimated: `12814` - // Minimum execution time: 55_459_000 picoseconds. - Weight::from_parts(56_180_000, 12814) - .saturating_add(T::DbWeight::get().reads(6_u64)) - .saturating_add(T::DbWeight::get().writes(5_u64)) + // Measured: `1919` + // Estimated: `17759` + // Minimum execution time: 58_466_000 picoseconds. + Weight::from_parts(59_558_000, 17759) + .saturating_add(T::DbWeight::get().reads(8_u64)) + .saturating_add(T::DbWeight::get().writes(7_u64)) } - /// Storage: Staking Ledger (r:1 w:0) - /// Proof: Staking Ledger (max_values: None, max_size: Some(1091), added: 3566, mode: MaxEncodedLen) - /// Storage: Session NextKeys (r:1 w:1) - /// Proof Skipped: Session NextKeys (max_values: None, max_size: None, mode: Measured) - /// Storage: Session KeyOwner (r:0 w:4) - /// Proof Skipped: Session KeyOwner (max_values: None, max_size: None, mode: Measured) + /// Storage: `Staking::Ledger` (r:1 w:0) + /// Proof: `Staking::Ledger` (`max_values`: None, `max_size`: Some(1091), added: 3566, mode: `MaxEncodedLen`) + /// Storage: `Session::NextKeys` (r:1 w:1) + /// Proof: `Session::NextKeys` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Session::KeyOwner` (r:0 w:6) + /// Proof: `Session::KeyOwner` (`max_values`: None, `max_size`: None, mode: `Measured`) fn purge_keys() -> Weight { // Proof Size summary in bytes: - // Measured: `1791` - // Estimated: `5256` - // Minimum execution time: 40_194_000 picoseconds. - Weight::from_parts(41_313_000, 5256) + // Measured: `1817` + // Estimated: `5282` + // Minimum execution time: 41_730_000 picoseconds. + Weight::from_parts(42_476_000, 5282) .saturating_add(T::DbWeight::get().reads(2_u64)) - .saturating_add(T::DbWeight::get().writes(5_u64)) + .saturating_add(T::DbWeight::get().writes(7_u64)) } } -// For backwards compatibility and tests +// For backwards compatibility and tests. impl WeightInfo for () { - /// Storage: Staking Ledger (r:1 w:0) - /// Proof: Staking Ledger (max_values: None, max_size: Some(1091), added: 3566, mode: MaxEncodedLen) - /// Storage: Session NextKeys (r:1 w:1) - /// Proof Skipped: Session NextKeys (max_values: None, max_size: None, mode: Measured) - /// Storage: Session KeyOwner (r:4 w:4) - /// Proof Skipped: Session KeyOwner (max_values: None, max_size: None, mode: Measured) + /// Storage: `Staking::Ledger` (r:1 w:0) + /// Proof: `Staking::Ledger` (`max_values`: None, `max_size`: Some(1091), added: 3566, mode: `MaxEncodedLen`) + /// Storage: `Session::NextKeys` (r:1 w:1) + /// Proof: `Session::NextKeys` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Session::KeyOwner` (r:6 w:6) + /// Proof: `Session::KeyOwner` (`max_values`: None, `max_size`: None, mode: `Measured`) fn set_keys() -> Weight { // Proof Size summary in bytes: - // Measured: `1924` - // Estimated: `12814` - // Minimum execution time: 55_459_000 picoseconds. - Weight::from_parts(56_180_000, 12814) - .saturating_add(RocksDbWeight::get().reads(6_u64)) - .saturating_add(RocksDbWeight::get().writes(5_u64)) + // Measured: `1919` + // Estimated: `17759` + // Minimum execution time: 58_466_000 picoseconds. + Weight::from_parts(59_558_000, 17759) + .saturating_add(RocksDbWeight::get().reads(8_u64)) + .saturating_add(RocksDbWeight::get().writes(7_u64)) } - /// Storage: Staking Ledger (r:1 w:0) - /// Proof: Staking Ledger (max_values: None, max_size: Some(1091), added: 3566, mode: MaxEncodedLen) - /// Storage: Session NextKeys (r:1 w:1) - /// Proof Skipped: Session NextKeys (max_values: None, max_size: None, mode: Measured) - /// Storage: Session KeyOwner (r:0 w:4) - /// Proof Skipped: Session KeyOwner (max_values: None, max_size: None, mode: Measured) + /// Storage: `Staking::Ledger` (r:1 w:0) + /// Proof: `Staking::Ledger` (`max_values`: None, `max_size`: Some(1091), added: 3566, mode: `MaxEncodedLen`) + /// Storage: `Session::NextKeys` (r:1 w:1) + /// Proof: `Session::NextKeys` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Session::KeyOwner` (r:0 w:6) + /// Proof: `Session::KeyOwner` (`max_values`: None, `max_size`: None, mode: `Measured`) fn purge_keys() -> Weight { // Proof Size summary in bytes: - // Measured: `1791` - // Estimated: `5256` - // Minimum execution time: 40_194_000 picoseconds. - Weight::from_parts(41_313_000, 5256) + // Measured: `1817` + // Estimated: `5282` + // Minimum execution time: 41_730_000 picoseconds. + Weight::from_parts(42_476_000, 5282) .saturating_add(RocksDbWeight::get().reads(2_u64)) - .saturating_add(RocksDbWeight::get().writes(5_u64)) + .saturating_add(RocksDbWeight::get().writes(7_u64)) } } diff --git a/substrate/frame/society/Cargo.toml b/substrate/frame/society/Cargo.toml index 8b24f637f420012953233832f9701f050fca73ff..3d99ddba392bcee045d122e6b898552d0f5e9b75 100644 --- a/substrate/frame/society/Cargo.toml +++ b/substrate/frame/society/Cargo.toml @@ -16,9 +16,9 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -log = { version = "0.4.17", default-features = false } +log = { workspace = true } rand_chacha = { version = "0.2", default-features = false } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } sp-std = { path = "../../primitives/std", default-features = false } diff --git a/substrate/frame/society/src/lib.rs b/substrate/frame/society/src/lib.rs index 99dd580a4035ed138b494d827956435e597ebe1c..5bce245f73f17e02d1301ee9242a356ad291b3ee 100644 --- a/substrate/frame/society/src/lib.rs +++ b/substrate/frame/society/src/lib.rs @@ -1509,7 +1509,7 @@ impl, I: 'static> Pallet { // the Founder. if MemberCount::::get() > 2 { let defender = next_defender - .or_else(|| Self::pick_defendent(rng)) + .or_else(|| Self::pick_defendant(rng)) .expect("exited if members empty; qed"); let skeptic = Self::pick_member_except(rng, &defender).expect("exited if members empty; qed"); @@ -1871,7 +1871,7 @@ impl, I: 'static> Pallet { /// /// If only the Founder and Head members exist (or the state is inconsistent), then `None` /// may be returned. - fn pick_defendent(rng: &mut impl RngCore) -> Option { + fn pick_defendant(rng: &mut impl RngCore) -> Option { let member_count = MemberCount::::get(); if member_count <= 2 { return None @@ -1976,7 +1976,7 @@ impl, I: 'static> Pallet { /// Transfer some `amount` from the main account into the payouts account and reduce the Pot /// by this amount. fn reserve_payout(amount: BalanceOf) { - // Tramsfer payout from the Pot into the payouts account. + // Transfer payout from the Pot into the payouts account. Pot::::mutate(|pot| pot.saturating_reduce(amount)); // this should never fail since we ensure we can afford the payouts in a previous @@ -1988,7 +1988,7 @@ impl, I: 'static> Pallet { /// Transfer some `amount` from the main account into the payouts account and increase the Pot /// by this amount. fn unreserve_payout(amount: BalanceOf) { - // Tramsfer payout from the Pot into the payouts account. + // Transfer payout from the Pot into the payouts account. Pot::::mutate(|pot| pot.saturating_accrue(amount)); // this should never fail since we ensure we can afford the payouts in a previous diff --git a/substrate/frame/society/src/migrations.rs b/substrate/frame/society/src/migrations.rs index a995c9d7be7f2a1c46fee6d222862fcd1f03ae58..7ded1f84f5823696e922a3ef98e4cce45191d21c 100644 --- a/substrate/frame/society/src/migrations.rs +++ b/substrate/frame/society/src/migrations.rs @@ -19,7 +19,7 @@ use super::*; use codec::{Decode, Encode}; -use frame_support::traits::{Defensive, DefensiveOption, Instance, OnRuntimeUpgrade}; +use frame_support::traits::{Defensive, DefensiveOption, Instance, UncheckedOnRuntimeUpgrade}; #[cfg(feature = "try-runtime")] use sp_runtime::TryRuntimeError; @@ -29,22 +29,22 @@ const TARGET: &'static str = "runtime::society::migration"; /// This migration moves all the state to v2 of Society. pub struct VersionUncheckedMigrateToV2, I: 'static, PastPayouts>( - sp_std::marker::PhantomData<(T, I, PastPayouts)>, + core::marker::PhantomData<(T, I, PastPayouts)>, ); impl< T: Config, I: Instance + 'static, PastPayouts: Get::AccountId, BalanceOf)>>, - > OnRuntimeUpgrade for VersionUncheckedMigrateToV2 + > UncheckedOnRuntimeUpgrade for VersionUncheckedMigrateToV2 { #[cfg(feature = "try-runtime")] fn pre_upgrade() -> Result, TryRuntimeError> { - let current = Pallet::::current_storage_version(); - let onchain = Pallet::::on_chain_storage_version(); - ensure!(onchain == 0 && current == 2, "pallet_society: invalid version"); + let in_code = Pallet::::in_code_storage_version(); + let on_chain = Pallet::::on_chain_storage_version(); + ensure!(on_chain == 0 && in_code == 2, "pallet_society: invalid version"); - Ok((old::Candidates::::get(), old::Members::::get()).encode()) + Ok((v0::Candidates::::get(), v0::Members::::get()).encode()) } fn on_runtime_upgrade() -> Weight { @@ -103,7 +103,7 @@ pub type MigrateToV2 = frame_support::migrations::VersionedMi ::DbWeight, >; -pub(crate) mod old { +pub(crate) mod v0 { use super::*; use frame_support::storage_alias; @@ -230,37 +230,37 @@ pub fn assert_internal_consistency, I: Instance + 'static>() { } // We don't use these - make sure they don't exist. - assert_eq!(old::SuspendedCandidates::::iter().count(), 0); - assert_eq!(old::Strikes::::iter().count(), 0); - assert_eq!(old::Vouching::::iter().count(), 0); - assert!(!old::Defender::::exists()); - assert!(!old::Members::::exists()); + assert_eq!(v0::SuspendedCandidates::::iter().count(), 0); + assert_eq!(v0::Strikes::::iter().count(), 0); + assert_eq!(v0::Vouching::::iter().count(), 0); + assert!(!v0::Defender::::exists()); + assert!(!v0::Members::::exists()); } pub fn from_original, I: Instance + 'static>( past_payouts: &mut [(::AccountId, BalanceOf)], ) -> Result { - // Migrate Bids from old::Bids (just a trunctation). - Bids::::put(BoundedVec::<_, T::MaxBids>::truncate_from(old::Bids::::take())); + // Migrate Bids from old::Bids (just a truncation). + Bids::::put(BoundedVec::<_, T::MaxBids>::truncate_from(v0::Bids::::take())); // Initialise round counter. RoundCount::::put(0); // Migrate Candidates from old::Candidates - for Bid { who: candidate, kind, value } in old::Candidates::::take().into_iter() { + for Bid { who: candidate, kind, value } in v0::Candidates::::take().into_iter() { let mut tally = Tally::default(); // Migrate Votes from old::Votes // No need to drain, since we're overwriting values. - for (voter, vote) in old::Votes::::iter_prefix(&candidate) { + for (voter, vote) in v0::Votes::::iter_prefix(&candidate) { Votes::::insert( &candidate, &voter, - Vote { approve: vote == old::Vote::Approve, weight: 1 }, + Vote { approve: vote == v0::Vote::Approve, weight: 1 }, ); match vote { - old::Vote::Approve => tally.approvals.saturating_inc(), - old::Vote::Reject => tally.rejections.saturating_inc(), - old::Vote::Skeptic => Skeptic::::put(&voter), + v0::Vote::Approve => tally.approvals.saturating_inc(), + v0::Vote::Reject => tally.rejections.saturating_inc(), + v0::Vote::Skeptic => Skeptic::::put(&voter), } } Candidates::::insert( @@ -271,9 +271,9 @@ pub fn from_original, I: Instance + 'static>( // Migrate Members from old::Members old::Strikes old::Vouching let mut member_count = 0; - for member in old::Members::::take() { - let strikes = old::Strikes::::take(&member); - let vouching = old::Vouching::::take(&member); + for member in v0::Members::::take() { + let strikes = v0::Strikes::::take(&member); + let vouching = v0::Vouching::::take(&member); let record = MemberRecord { index: member_count, rank: 0, strikes, vouching }; Members::::insert(&member, record); MemberByIndex::::insert(member_count, &member); @@ -287,13 +287,13 @@ pub fn from_original, I: Instance + 'static>( .defensive_ok_or("member_count > 0, we must have at least 1 member")?; // Swap the founder with the first member in MemberByIndex. MemberByIndex::::swap(0, member_count); - // Update the indicies of the swapped member MemberRecords. + // Update the indices of the swapped member MemberRecords. Members::::mutate(&member, |m| { if let Some(member) = m { member.index = 0; } else { frame_support::defensive!( - "Member somehow disapeared from storage after it was inserted" + "Member somehow disappeared from storage after it was inserted" ); } }); @@ -302,7 +302,7 @@ pub fn from_original, I: Instance + 'static>( member.index = member_count; } else { frame_support::defensive!( - "Member somehow disapeared from storage after it was queried" + "Member somehow disappeared from storage after it was queried" ); } }); @@ -314,7 +314,7 @@ pub fn from_original, I: Instance + 'static>( // Migrate Payouts from: old::Payouts and raw info (needed since we can't query old chain // state). past_payouts.sort(); - for (who, mut payouts) in old::Payouts::::iter() { + for (who, mut payouts) in v0::Payouts::::iter() { payouts.truncate(T::MaxPayouts::get() as usize); // ^^ Safe since we already truncated. let paid = past_payouts @@ -329,19 +329,19 @@ pub fn from_original, I: Instance + 'static>( } // Migrate SuspendedMembers from old::SuspendedMembers old::Strikes old::Vouching. - for who in old::SuspendedMembers::::iter_keys() { - let strikes = old::Strikes::::take(&who); - let vouching = old::Vouching::::take(&who); + for who in v0::SuspendedMembers::::iter_keys() { + let strikes = v0::Strikes::::take(&who); + let vouching = v0::Vouching::::take(&who); let record = MemberRecord { index: 0, rank: 0, strikes, vouching }; SuspendedMembers::::insert(&who, record); } // Any suspended candidates remaining are rejected. - let _ = old::SuspendedCandidates::::clear(u32::MAX, None); + let _ = v0::SuspendedCandidates::::clear(u32::MAX, None); // We give the current defender the benefit of the doubt. - old::Defender::::kill(); - let _ = old::DefenderVotes::::clear(u32::MAX, None); + v0::Defender::::kill(); + let _ = v0::DefenderVotes::::clear(u32::MAX, None); Ok(T::BlockWeights::get().max_block) } diff --git a/substrate/frame/society/src/mock.rs b/substrate/frame/society/src/mock.rs index 04f3e85f539aa94dc78142d7e9e5b27736dbc2af..3c27c08a10610f44ebaf2fc72678f52be2f06507 100644 --- a/substrate/frame/society/src/mock.rs +++ b/substrate/frame/society/src/mock.rs @@ -54,7 +54,7 @@ ord_parameter_types! { pub const MaxBids: u32 = 10; } -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { type AccountId = u128; type Block = Block; @@ -62,7 +62,7 @@ impl frame_system::Config for Test { type Lookup = IdentityLookup; } -#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig as pallet_balances::DefaultConfig)] +#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] impl pallet_balances::Config for Test { type ReserveIdentifier = [u8; 8]; type AccountStore = System; diff --git a/substrate/frame/society/src/tests.rs b/substrate/frame/society/src/tests.rs index 940643168fb41fd723905497935b7cb543b7f7b7..df8e844cdad9939c9848b106ce4a097195ac2d37 100644 --- a/substrate/frame/society/src/tests.rs +++ b/substrate/frame/society/src/tests.rs @@ -18,7 +18,7 @@ //! Tests for the module. use super::*; -use migrations::old; +use migrations::v0; use mock::*; use frame_support::{assert_noop, assert_ok}; @@ -32,41 +32,41 @@ use RuntimeOrigin as Origin; #[test] fn migration_works() { EnvBuilder::new().founded(false).execute(|| { - use old::Vote::*; + use v0::Vote::*; // Initialise the old storage items. Founder::::put(10); Head::::put(30); - old::Members::::put(vec![10, 20, 30]); - old::Vouching::::insert(30, Vouching); - old::Vouching::::insert(40, Banned); - old::Strikes::::insert(20, 1); - old::Strikes::::insert(30, 2); - old::Strikes::::insert(40, 5); - old::Payouts::::insert(20, vec![(1, 1)]); - old::Payouts::::insert( + v0::Members::::put(vec![10, 20, 30]); + v0::Vouching::::insert(30, Vouching); + v0::Vouching::::insert(40, Banned); + v0::Strikes::::insert(20, 1); + v0::Strikes::::insert(30, 2); + v0::Strikes::::insert(40, 5); + v0::Payouts::::insert(20, vec![(1, 1)]); + v0::Payouts::::insert( 30, (0..=::MaxPayouts::get()) .map(|i| (i as u64, i as u64)) .collect::>(), ); - old::SuspendedMembers::::insert(40, true); + v0::SuspendedMembers::::insert(40, true); - old::Defender::::put(20); - old::DefenderVotes::::insert(10, Approve); - old::DefenderVotes::::insert(20, Approve); - old::DefenderVotes::::insert(30, Reject); + v0::Defender::::put(20); + v0::DefenderVotes::::insert(10, Approve); + v0::DefenderVotes::::insert(20, Approve); + v0::DefenderVotes::::insert(30, Reject); - old::SuspendedCandidates::::insert(50, (10, Deposit(100))); + v0::SuspendedCandidates::::insert(50, (10, Deposit(100))); - old::Candidates::::put(vec![ + v0::Candidates::::put(vec![ Bid { who: 60, kind: Deposit(100), value: 200 }, Bid { who: 70, kind: Vouch(30, 30), value: 100 }, ]); - old::Votes::::insert(60, 10, Approve); - old::Votes::::insert(70, 10, Reject); - old::Votes::::insert(70, 20, Approve); - old::Votes::::insert(70, 30, Approve); + v0::Votes::::insert(60, 10, Approve); + v0::Votes::::insert(70, 10, Reject); + v0::Votes::::insert(70, 20, Approve); + v0::Votes::::insert(70, 30, Approve); let bids = (0..=::MaxBids::get()) .map(|i| Bid { @@ -75,7 +75,7 @@ fn migration_works() { value: 10u64 + i as u64, }) .collect::>(); - old::Bids::::put(bids); + v0::Bids::::put(bids); migrations::from_original::(&mut [][..]).expect("migration failed"); migrations::assert_internal_consistency::(); @@ -541,7 +541,7 @@ fn suspended_candidate_rejected_works() { assert_ok!(Society::vote(Origin::signed(30), x, true)); } - // Voting continues, as no canidate is clearly accepted yet and the founder chooses not to + // Voting continues, as no candidate is clearly accepted yet and the founder chooses not to // act. conclude_intake(false, None); assert_eq!(members(), vec![10, 20, 30]); @@ -558,7 +558,7 @@ fn suspended_candidate_rejected_works() { assert_eq!(Balances::reserved_balance(40), 0); assert_eq!(Balances::free_balance(Society::account_id()), 9990); - // Founder manually bestows membership on 50 and and kicks 70. + // Founder manually bestows membership on 50 and kicks 70. assert_ok!(Society::bestow_membership(Origin::signed(10), 50)); assert_eq!(members(), vec![10, 20, 30, 40, 50]); assert_eq!(candidates(), vec![60, 70]); diff --git a/substrate/frame/society/src/weights.rs b/substrate/frame/society/src/weights.rs index 7c59aed8449a21c72afb39bdd11e14a315d1c659..17ff0318f6a64bf488d5243f629fd023261b6277 100644 --- a/substrate/frame/society/src/weights.rs +++ b/substrate/frame/society/src/weights.rs @@ -7,7 +7,7 @@ // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // -// http://www.apache.org/licenses/LICENSE-2.0 +// http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, @@ -15,35 +15,41 @@ // See the License for the specific language governing permissions and // limitations under the License. -//! Autogenerated weights for pallet_society +//! Autogenerated weights for `pallet_society` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2022-09-13, STEPS: `50`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("dev"), DB CACHE: 1024 +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-04-09, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `runner-anb7yjbi-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: `1024` // Executed Command: -// ./target/production/substrate +// ./target/production/substrate-node // benchmark // pallet // --chain=dev // --steps=50 // --repeat=20 // --pallet=pallet_society +// --no-storage-info +// --no-median-slopes +// --no-min-squares // --extrinsic=* -// --execution=wasm // --wasm-execution=compiled -// --template=./.maintain/frame-weight-template.hbs -// --header=./HEADER-APACHE2 -// --output=./frame/society/src/weights.rs +// --heap-pages=4096 +// --output=./substrate/frame/society/src/weights.rs +// --header=./substrate/HEADER-APACHE2 +// --template=./substrate/.maintain/frame-weight-template.hbs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] #![allow(unused_imports)] +#![allow(missing_docs)] use frame_support::{traits::Get, weights::{Weight, constants::RocksDbWeight}}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; -/// Weight functions needed for pallet_society. +/// Weight functions needed for `pallet_society`. pub trait WeightInfo { fn bid() -> Weight; fn unbid() -> Weight; @@ -67,309 +73,739 @@ pub trait WeightInfo { fn cleanup_challenge() -> Weight; } -/// Weights for pallet_society using the Substrate node and recommended hardware. +/// Weights for `pallet_society` using the Substrate node and recommended hardware. pub struct SubstrateWeight(PhantomData); impl WeightInfo for SubstrateWeight { - // Storage: Society Bids (r:1 w:1) - // Storage: Society Candidates (r:1 w:0) - // Storage: Society Members (r:1 w:0) - // Storage: Society SuspendedMembers (r:1 w:0) - // Storage: Society Parameters (r:1 w:0) + /// Storage: `Society::Bids` (r:1 w:1) + /// Proof: `Society::Bids` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Society::Candidates` (r:1 w:0) + /// Proof: `Society::Candidates` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Society::Members` (r:1 w:0) + /// Proof: `Society::Members` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Society::SuspendedMembers` (r:1 w:0) + /// Proof: `Society::SuspendedMembers` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Society::Parameters` (r:1 w:0) + /// Proof: `Society::Parameters` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) fn bid() -> Weight { - Weight::zero() - } - // Storage: Society Bids (r:1 w:1) + // Proof Size summary in bytes: + // Measured: `444` + // Estimated: `3909` + // Minimum execution time: 31_464_000 picoseconds. + Weight::from_parts(32_533_000, 3909) + .saturating_add(T::DbWeight::get().reads(5_u64)) + .saturating_add(T::DbWeight::get().writes(1_u64)) + } + /// Storage: `Society::Bids` (r:1 w:1) + /// Proof: `Society::Bids` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) fn unbid() -> Weight { - Weight::zero() - } - // Storage: Society Bids (r:1 w:1) - // Storage: Society Candidates (r:1 w:0) - // Storage: Society Members (r:2 w:1) - // Storage: Society SuspendedMembers (r:1 w:0) + // Proof Size summary in bytes: + // Measured: `461` + // Estimated: `1946` + // Minimum execution time: 24_132_000 picoseconds. + Weight::from_parts(24_936_000, 1946) + .saturating_add(T::DbWeight::get().reads(1_u64)) + .saturating_add(T::DbWeight::get().writes(1_u64)) + } + /// Storage: `Society::Bids` (r:1 w:1) + /// Proof: `Society::Bids` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Society::Candidates` (r:1 w:0) + /// Proof: `Society::Candidates` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Society::Members` (r:2 w:1) + /// Proof: `Society::Members` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Society::SuspendedMembers` (r:1 w:0) + /// Proof: `Society::SuspendedMembers` (`max_values`: None, `max_size`: None, mode: `Measured`) fn vouch() -> Weight { - Weight::zero() - } - // Storage: Society Bids (r:1 w:1) - // Storage: Society Members (r:1 w:1) + // Proof Size summary in bytes: + // Measured: `481` + // Estimated: `6421` + // Minimum execution time: 22_568_000 picoseconds. + Weight::from_parts(24_273_000, 6421) + .saturating_add(T::DbWeight::get().reads(5_u64)) + .saturating_add(T::DbWeight::get().writes(2_u64)) + } + /// Storage: `Society::Bids` (r:1 w:1) + /// Proof: `Society::Bids` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Society::Members` (r:1 w:1) + /// Proof: `Society::Members` (`max_values`: None, `max_size`: None, mode: `Measured`) fn unvouch() -> Weight { - Weight::zero() - } - // Storage: Society Candidates (r:1 w:1) - // Storage: Society Members (r:1 w:0) - // Storage: Society Votes (r:1 w:1) + // Proof Size summary in bytes: + // Measured: `535` + // Estimated: `4000` + // Minimum execution time: 15_524_000 picoseconds. + Weight::from_parts(16_324_000, 4000) + .saturating_add(T::DbWeight::get().reads(2_u64)) + .saturating_add(T::DbWeight::get().writes(2_u64)) + } + /// Storage: `Society::Candidates` (r:1 w:1) + /// Proof: `Society::Candidates` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Society::Members` (r:1 w:0) + /// Proof: `Society::Members` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Society::Votes` (r:1 w:1) + /// Proof: `Society::Votes` (`max_values`: None, `max_size`: None, mode: `Measured`) fn vote() -> Weight { - Weight::zero() - } - // Storage: Society Defending (r:1 w:1) - // Storage: Society Members (r:1 w:0) - // Storage: Society ChallengeRoundCount (r:1 w:0) - // Storage: Society DefenderVotes (r:1 w:1) + // Proof Size summary in bytes: + // Measured: `569` + // Estimated: `4034` + // Minimum execution time: 22_360_000 picoseconds. + Weight::from_parts(23_318_000, 4034) + .saturating_add(T::DbWeight::get().reads(3_u64)) + .saturating_add(T::DbWeight::get().writes(2_u64)) + } + /// Storage: `Society::Defending` (r:1 w:1) + /// Proof: `Society::Defending` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Society::Members` (r:1 w:0) + /// Proof: `Society::Members` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Society::ChallengeRoundCount` (r:1 w:0) + /// Proof: `Society::ChallengeRoundCount` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Society::DefenderVotes` (r:1 w:1) + /// Proof: `Society::DefenderVotes` (`max_values`: None, `max_size`: None, mode: `Measured`) fn defender_vote() -> Weight { - Weight::zero() - } - // Storage: Society Members (r:1 w:0) - // Storage: Society Payouts (r:1 w:1) - // Storage: System Account (r:1 w:1) + // Proof Size summary in bytes: + // Measured: `561` + // Estimated: `4026` + // Minimum execution time: 19_457_000 picoseconds. + Weight::from_parts(20_461_000, 4026) + .saturating_add(T::DbWeight::get().reads(4_u64)) + .saturating_add(T::DbWeight::get().writes(2_u64)) + } + /// Storage: `Society::Members` (r:1 w:0) + /// Proof: `Society::Members` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Society::Payouts` (r:1 w:1) + /// Proof: `Society::Payouts` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) fn payout() -> Weight { - Weight::zero() - } - // Storage: Society Members (r:1 w:1) - // Storage: Society Payouts (r:1 w:1) + // Proof Size summary in bytes: + // Measured: `650` + // Estimated: `4115` + // Minimum execution time: 52_032_000 picoseconds. + Weight::from_parts(52_912_000, 4115) + .saturating_add(T::DbWeight::get().reads(3_u64)) + .saturating_add(T::DbWeight::get().writes(2_u64)) + } + /// Storage: `Society::Members` (r:1 w:1) + /// Proof: `Society::Members` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Society::Payouts` (r:1 w:1) + /// Proof: `Society::Payouts` (`max_values`: None, `max_size`: None, mode: `Measured`) fn waive_repay() -> Weight { - Weight::zero() - } - // Storage: Society Head (r:1 w:1) - // Storage: Society MemberCount (r:1 w:1) - // Storage: Society MemberByIndex (r:0 w:1) - // Storage: Society Founder (r:0 w:1) - // Storage: Society Rules (r:0 w:1) - // Storage: Society Members (r:0 w:1) - // Storage: Society Parameters (r:0 w:1) + // Proof Size summary in bytes: + // Measured: `547` + // Estimated: `4012` + // Minimum execution time: 19_479_000 picoseconds. + Weight::from_parts(20_120_000, 4012) + .saturating_add(T::DbWeight::get().reads(2_u64)) + .saturating_add(T::DbWeight::get().writes(2_u64)) + } + /// Storage: `Society::Head` (r:1 w:1) + /// Proof: `Society::Head` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Society::MemberCount` (r:1 w:1) + /// Proof: `Society::MemberCount` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Society::MemberByIndex` (r:0 w:1) + /// Proof: `Society::MemberByIndex` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Society::Founder` (r:0 w:1) + /// Proof: `Society::Founder` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Society::Rules` (r:0 w:1) + /// Proof: `Society::Rules` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Society::Members` (r:0 w:1) + /// Proof: `Society::Members` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Society::Parameters` (r:0 w:1) + /// Proof: `Society::Parameters` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) fn found_society() -> Weight { - Weight::zero() - } - // Storage: Society Founder (r:1 w:1) - // Storage: Society MemberCount (r:1 w:1) - // Storage: Society Head (r:0 w:1) - // Storage: Society Defending (r:0 w:1) - // Storage: Society ChallengeRoundCount (r:0 w:1) - // Storage: Society MemberByIndex (r:0 w:5) - // Storage: Society Skeptic (r:0 w:1) - // Storage: Society Candidates (r:0 w:4) - // Storage: Society Pot (r:0 w:1) - // Storage: Society Rules (r:0 w:1) - // Storage: Society Votes (r:0 w:4) - // Storage: Society Members (r:0 w:5) - // Storage: Society RoundCount (r:0 w:1) - // Storage: Society Bids (r:0 w:1) - // Storage: Society Parameters (r:0 w:1) - // Storage: Society NextHead (r:0 w:1) + // Proof Size summary in bytes: + // Measured: `180` + // Estimated: `1665` + // Minimum execution time: 15_843_000 picoseconds. + Weight::from_parts(16_617_000, 1665) + .saturating_add(T::DbWeight::get().reads(2_u64)) + .saturating_add(T::DbWeight::get().writes(7_u64)) + } + /// Storage: `Society::Founder` (r:1 w:1) + /// Proof: `Society::Founder` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Society::MemberCount` (r:1 w:1) + /// Proof: `Society::MemberCount` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Society::Members` (r:5 w:5) + /// Proof: `Society::Members` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Society::MemberByIndex` (r:5 w:5) + /// Proof: `Society::MemberByIndex` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Society::Votes` (r:4 w:4) + /// Proof: `Society::Votes` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Society::Candidates` (r:4 w:4) + /// Proof: `Society::Candidates` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Society::Head` (r:0 w:1) + /// Proof: `Society::Head` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Society::Defending` (r:0 w:1) + /// Proof: `Society::Defending` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Society::ChallengeRoundCount` (r:0 w:1) + /// Proof: `Society::ChallengeRoundCount` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Society::Skeptic` (r:0 w:1) + /// Proof: `Society::Skeptic` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Society::Pot` (r:0 w:1) + /// Proof: `Society::Pot` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Society::Rules` (r:0 w:1) + /// Proof: `Society::Rules` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Society::RoundCount` (r:0 w:1) + /// Proof: `Society::RoundCount` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Society::Bids` (r:0 w:1) + /// Proof: `Society::Bids` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Society::Parameters` (r:0 w:1) + /// Proof: `Society::Parameters` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Society::NextHead` (r:0 w:1) + /// Proof: `Society::NextHead` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) fn dissolve() -> Weight { - Weight::zero() - } - // Storage: Society Founder (r:1 w:0) - // Storage: Society SuspendedMembers (r:1 w:1) - // Storage: Society Payouts (r:1 w:0) - // Storage: Society Pot (r:1 w:1) + // Proof Size summary in bytes: + // Measured: `1654` + // Estimated: `15019` + // Minimum execution time: 58_302_000 picoseconds. + Weight::from_parts(59_958_000, 15019) + .saturating_add(T::DbWeight::get().reads(20_u64)) + .saturating_add(T::DbWeight::get().writes(30_u64)) + } + /// Storage: `Society::Founder` (r:1 w:0) + /// Proof: `Society::Founder` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Society::SuspendedMembers` (r:1 w:1) + /// Proof: `Society::SuspendedMembers` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Society::Payouts` (r:1 w:0) + /// Proof: `Society::Payouts` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Society::Pot` (r:1 w:1) + /// Proof: `Society::Pot` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) fn judge_suspended_member() -> Weight { - Weight::zero() - } - // Storage: Society Founder (r:1 w:0) - // Storage: Society MemberCount (r:1 w:0) - // Storage: Society Parameters (r:0 w:1) + // Proof Size summary in bytes: + // Measured: `505` + // Estimated: `3970` + // Minimum execution time: 20_044_000 picoseconds. + Weight::from_parts(20_884_000, 3970) + .saturating_add(T::DbWeight::get().reads(4_u64)) + .saturating_add(T::DbWeight::get().writes(2_u64)) + } + /// Storage: `Society::Founder` (r:1 w:0) + /// Proof: `Society::Founder` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Society::MemberCount` (r:1 w:0) + /// Proof: `Society::MemberCount` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Society::Parameters` (r:0 w:1) + /// Proof: `Society::Parameters` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) fn set_parameters() -> Weight { - Weight::zero() - } - // Storage: Society Candidates (r:1 w:1) - // Storage: Society RoundCount (r:1 w:0) - // Storage: Society Skeptic (r:1 w:0) - // Storage: Society Votes (r:1 w:0) - // Storage: Society Members (r:1 w:1) - // Storage: Society Parameters (r:1 w:0) + // Proof Size summary in bytes: + // Measured: `387` + // Estimated: `1872` + // Minimum execution time: 11_183_000 picoseconds. + Weight::from_parts(11_573_000, 1872) + .saturating_add(T::DbWeight::get().reads(2_u64)) + .saturating_add(T::DbWeight::get().writes(1_u64)) + } + /// Storage: `Society::Candidates` (r:1 w:1) + /// Proof: `Society::Candidates` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Society::RoundCount` (r:1 w:0) + /// Proof: `Society::RoundCount` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Society::Skeptic` (r:1 w:0) + /// Proof: `Society::Skeptic` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Society::Votes` (r:1 w:0) + /// Proof: `Society::Votes` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Society::Members` (r:1 w:1) + /// Proof: `Society::Members` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Society::Parameters` (r:1 w:0) + /// Proof: `Society::Parameters` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) fn punish_skeptic() -> Weight { - Weight::zero() - } - // Storage: Society Candidates (r:1 w:1) - // Storage: Society RoundCount (r:1 w:0) - // Storage: Society Parameters (r:1 w:0) - // Storage: Society MemberCount (r:1 w:1) - // Storage: Society NextHead (r:1 w:1) - // Storage: System Account (r:1 w:1) - // Storage: Society MemberByIndex (r:0 w:1) - // Storage: Society Members (r:0 w:1) + // Proof Size summary in bytes: + // Measured: `636` + // Estimated: `4101` + // Minimum execution time: 24_149_000 picoseconds. + Weight::from_parts(25_160_000, 4101) + .saturating_add(T::DbWeight::get().reads(6_u64)) + .saturating_add(T::DbWeight::get().writes(2_u64)) + } + /// Storage: `Society::Candidates` (r:1 w:1) + /// Proof: `Society::Candidates` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Society::RoundCount` (r:1 w:0) + /// Proof: `Society::RoundCount` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Society::Parameters` (r:1 w:0) + /// Proof: `Society::Parameters` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Society::MemberCount` (r:1 w:1) + /// Proof: `Society::MemberCount` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Society::NextHead` (r:1 w:1) + /// Proof: `Society::NextHead` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `Society::MemberByIndex` (r:0 w:1) + /// Proof: `Society::MemberByIndex` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Society::Members` (r:0 w:1) + /// Proof: `Society::Members` (`max_values`: None, `max_size`: None, mode: `Measured`) fn claim_membership() -> Weight { - Weight::zero() - } - // Storage: Society Founder (r:1 w:0) - // Storage: Society Candidates (r:1 w:1) - // Storage: Society RoundCount (r:1 w:0) - // Storage: Society Parameters (r:1 w:0) - // Storage: Society MemberCount (r:1 w:1) - // Storage: Society NextHead (r:1 w:1) - // Storage: System Account (r:1 w:1) - // Storage: Society MemberByIndex (r:0 w:1) - // Storage: Society Members (r:0 w:1) + // Proof Size summary in bytes: + // Measured: `632` + // Estimated: `4097` + // Minimum execution time: 37_992_000 picoseconds. + Weight::from_parts(39_226_000, 4097) + .saturating_add(T::DbWeight::get().reads(6_u64)) + .saturating_add(T::DbWeight::get().writes(6_u64)) + } + /// Storage: `Society::Founder` (r:1 w:0) + /// Proof: `Society::Founder` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Society::Candidates` (r:1 w:1) + /// Proof: `Society::Candidates` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Society::RoundCount` (r:1 w:0) + /// Proof: `Society::RoundCount` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Society::Parameters` (r:1 w:0) + /// Proof: `Society::Parameters` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Society::MemberCount` (r:1 w:1) + /// Proof: `Society::MemberCount` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Society::NextHead` (r:1 w:1) + /// Proof: `Society::NextHead` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `Society::MemberByIndex` (r:0 w:1) + /// Proof: `Society::MemberByIndex` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Society::Members` (r:0 w:1) + /// Proof: `Society::Members` (`max_values`: None, `max_size`: None, mode: `Measured`) fn bestow_membership() -> Weight { - Weight::zero() - } - // Storage: Society Founder (r:1 w:0) - // Storage: Society Candidates (r:1 w:1) - // Storage: Society RoundCount (r:1 w:0) + // Proof Size summary in bytes: + // Measured: `650` + // Estimated: `4115` + // Minimum execution time: 39_383_000 picoseconds. + Weight::from_parts(40_367_000, 4115) + .saturating_add(T::DbWeight::get().reads(7_u64)) + .saturating_add(T::DbWeight::get().writes(6_u64)) + } + /// Storage: `Society::Founder` (r:1 w:0) + /// Proof: `Society::Founder` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Society::Candidates` (r:1 w:1) + /// Proof: `Society::Candidates` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Society::RoundCount` (r:1 w:0) + /// Proof: `Society::RoundCount` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `System::Account` (r:2 w:2) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) fn kick_candidate() -> Weight { - Weight::zero() - } - // Storage: Society Candidates (r:1 w:1) - // Storage: Society RoundCount (r:1 w:0) + // Proof Size summary in bytes: + // Measured: `776` + // Estimated: `6196` + // Minimum execution time: 40_060_000 picoseconds. + Weight::from_parts(40_836_000, 6196) + .saturating_add(T::DbWeight::get().reads(5_u64)) + .saturating_add(T::DbWeight::get().writes(3_u64)) + } + /// Storage: `Society::Candidates` (r:1 w:1) + /// Proof: `Society::Candidates` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Society::RoundCount` (r:1 w:0) + /// Proof: `Society::RoundCount` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `System::Account` (r:2 w:2) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) fn resign_candidacy() -> Weight { - Weight::zero() - } - // Storage: Society Candidates (r:1 w:1) - // Storage: Society RoundCount (r:1 w:0) + // Proof Size summary in bytes: + // Measured: `746` + // Estimated: `6196` + // Minimum execution time: 37_529_000 picoseconds. + Weight::from_parts(38_342_000, 6196) + .saturating_add(T::DbWeight::get().reads(4_u64)) + .saturating_add(T::DbWeight::get().writes(3_u64)) + } + /// Storage: `Society::Candidates` (r:1 w:1) + /// Proof: `Society::Candidates` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Society::RoundCount` (r:1 w:0) + /// Proof: `Society::RoundCount` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `System::Account` (r:2 w:2) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) fn drop_candidate() -> Weight { - Weight::zero() - } - // Storage: Society Candidates (r:1 w:0) - // Storage: Society VoteClearCursor (r:1 w:0) - // Storage: Society Votes (r:0 w:2) + // Proof Size summary in bytes: + // Measured: `758` + // Estimated: `6196` + // Minimum execution time: 37_992_000 picoseconds. + Weight::from_parts(39_002_000, 6196) + .saturating_add(T::DbWeight::get().reads(4_u64)) + .saturating_add(T::DbWeight::get().writes(3_u64)) + } + /// Storage: `Society::Candidates` (r:1 w:0) + /// Proof: `Society::Candidates` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Society::VoteClearCursor` (r:1 w:0) + /// Proof: `Society::VoteClearCursor` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Society::Votes` (r:2 w:2) + /// Proof: `Society::Votes` (`max_values`: None, `max_size`: None, mode: `Measured`) fn cleanup_candidacy() -> Weight { - Weight::zero() - } - // Storage: Society ChallengeRoundCount (r:1 w:0) - // Storage: Society DefenderVotes (r:0 w:1) + // Proof Size summary in bytes: + // Measured: `552` + // Estimated: `6492` + // Minimum execution time: 17_266_000 picoseconds. + Weight::from_parts(18_255_000, 6492) + .saturating_add(T::DbWeight::get().reads(4_u64)) + .saturating_add(T::DbWeight::get().writes(2_u64)) + } + /// Storage: `Society::ChallengeRoundCount` (r:1 w:0) + /// Proof: `Society::ChallengeRoundCount` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Society::DefenderVotes` (r:1 w:1) + /// Proof: `Society::DefenderVotes` (`max_values`: None, `max_size`: None, mode: `Measured`) fn cleanup_challenge() -> Weight { - Weight::zero() + // Proof Size summary in bytes: + // Measured: `510` + // Estimated: `3975` + // Minimum execution time: 11_636_000 picoseconds. + Weight::from_parts(12_122_000, 3975) + .saturating_add(T::DbWeight::get().reads(2_u64)) + .saturating_add(T::DbWeight::get().writes(1_u64)) } } -// For backwards compatibility and tests +// For backwards compatibility and tests. impl WeightInfo for () { - // Storage: Society Bids (r:1 w:1) - // Storage: Society Candidates (r:1 w:0) - // Storage: Society Members (r:1 w:0) - // Storage: Society SuspendedMembers (r:1 w:0) - // Storage: Society Parameters (r:1 w:0) + /// Storage: `Society::Bids` (r:1 w:1) + /// Proof: `Society::Bids` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Society::Candidates` (r:1 w:0) + /// Proof: `Society::Candidates` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Society::Members` (r:1 w:0) + /// Proof: `Society::Members` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Society::SuspendedMembers` (r:1 w:0) + /// Proof: `Society::SuspendedMembers` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Society::Parameters` (r:1 w:0) + /// Proof: `Society::Parameters` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) fn bid() -> Weight { - Weight::zero() - } - // Storage: Society Bids (r:1 w:1) + // Proof Size summary in bytes: + // Measured: `444` + // Estimated: `3909` + // Minimum execution time: 31_464_000 picoseconds. + Weight::from_parts(32_533_000, 3909) + .saturating_add(RocksDbWeight::get().reads(5_u64)) + .saturating_add(RocksDbWeight::get().writes(1_u64)) + } + /// Storage: `Society::Bids` (r:1 w:1) + /// Proof: `Society::Bids` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) fn unbid() -> Weight { - Weight::zero() - } - // Storage: Society Bids (r:1 w:1) - // Storage: Society Candidates (r:1 w:0) - // Storage: Society Members (r:2 w:1) - // Storage: Society SuspendedMembers (r:1 w:0) + // Proof Size summary in bytes: + // Measured: `461` + // Estimated: `1946` + // Minimum execution time: 24_132_000 picoseconds. + Weight::from_parts(24_936_000, 1946) + .saturating_add(RocksDbWeight::get().reads(1_u64)) + .saturating_add(RocksDbWeight::get().writes(1_u64)) + } + /// Storage: `Society::Bids` (r:1 w:1) + /// Proof: `Society::Bids` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Society::Candidates` (r:1 w:0) + /// Proof: `Society::Candidates` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Society::Members` (r:2 w:1) + /// Proof: `Society::Members` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Society::SuspendedMembers` (r:1 w:0) + /// Proof: `Society::SuspendedMembers` (`max_values`: None, `max_size`: None, mode: `Measured`) fn vouch() -> Weight { - Weight::zero() - } - // Storage: Society Bids (r:1 w:1) - // Storage: Society Members (r:1 w:1) + // Proof Size summary in bytes: + // Measured: `481` + // Estimated: `6421` + // Minimum execution time: 22_568_000 picoseconds. + Weight::from_parts(24_273_000, 6421) + .saturating_add(RocksDbWeight::get().reads(5_u64)) + .saturating_add(RocksDbWeight::get().writes(2_u64)) + } + /// Storage: `Society::Bids` (r:1 w:1) + /// Proof: `Society::Bids` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Society::Members` (r:1 w:1) + /// Proof: `Society::Members` (`max_values`: None, `max_size`: None, mode: `Measured`) fn unvouch() -> Weight { - Weight::zero() - } - // Storage: Society Candidates (r:1 w:1) - // Storage: Society Members (r:1 w:0) - // Storage: Society Votes (r:1 w:1) + // Proof Size summary in bytes: + // Measured: `535` + // Estimated: `4000` + // Minimum execution time: 15_524_000 picoseconds. + Weight::from_parts(16_324_000, 4000) + .saturating_add(RocksDbWeight::get().reads(2_u64)) + .saturating_add(RocksDbWeight::get().writes(2_u64)) + } + /// Storage: `Society::Candidates` (r:1 w:1) + /// Proof: `Society::Candidates` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Society::Members` (r:1 w:0) + /// Proof: `Society::Members` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Society::Votes` (r:1 w:1) + /// Proof: `Society::Votes` (`max_values`: None, `max_size`: None, mode: `Measured`) fn vote() -> Weight { - Weight::zero() - } - // Storage: Society Defending (r:1 w:1) - // Storage: Society Members (r:1 w:0) - // Storage: Society ChallengeRoundCount (r:1 w:0) - // Storage: Society DefenderVotes (r:1 w:1) + // Proof Size summary in bytes: + // Measured: `569` + // Estimated: `4034` + // Minimum execution time: 22_360_000 picoseconds. + Weight::from_parts(23_318_000, 4034) + .saturating_add(RocksDbWeight::get().reads(3_u64)) + .saturating_add(RocksDbWeight::get().writes(2_u64)) + } + /// Storage: `Society::Defending` (r:1 w:1) + /// Proof: `Society::Defending` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Society::Members` (r:1 w:0) + /// Proof: `Society::Members` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Society::ChallengeRoundCount` (r:1 w:0) + /// Proof: `Society::ChallengeRoundCount` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Society::DefenderVotes` (r:1 w:1) + /// Proof: `Society::DefenderVotes` (`max_values`: None, `max_size`: None, mode: `Measured`) fn defender_vote() -> Weight { - Weight::zero() - } - // Storage: Society Members (r:1 w:0) - // Storage: Society Payouts (r:1 w:1) - // Storage: System Account (r:1 w:1) + // Proof Size summary in bytes: + // Measured: `561` + // Estimated: `4026` + // Minimum execution time: 19_457_000 picoseconds. + Weight::from_parts(20_461_000, 4026) + .saturating_add(RocksDbWeight::get().reads(4_u64)) + .saturating_add(RocksDbWeight::get().writes(2_u64)) + } + /// Storage: `Society::Members` (r:1 w:0) + /// Proof: `Society::Members` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Society::Payouts` (r:1 w:1) + /// Proof: `Society::Payouts` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) fn payout() -> Weight { - Weight::zero() - } - // Storage: Society Members (r:1 w:1) - // Storage: Society Payouts (r:1 w:1) + // Proof Size summary in bytes: + // Measured: `650` + // Estimated: `4115` + // Minimum execution time: 52_032_000 picoseconds. + Weight::from_parts(52_912_000, 4115) + .saturating_add(RocksDbWeight::get().reads(3_u64)) + .saturating_add(RocksDbWeight::get().writes(2_u64)) + } + /// Storage: `Society::Members` (r:1 w:1) + /// Proof: `Society::Members` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Society::Payouts` (r:1 w:1) + /// Proof: `Society::Payouts` (`max_values`: None, `max_size`: None, mode: `Measured`) fn waive_repay() -> Weight { - Weight::zero() - } - // Storage: Society Head (r:1 w:1) - // Storage: Society MemberCount (r:1 w:1) - // Storage: Society MemberByIndex (r:0 w:1) - // Storage: Society Founder (r:0 w:1) - // Storage: Society Rules (r:0 w:1) - // Storage: Society Members (r:0 w:1) - // Storage: Society Parameters (r:0 w:1) + // Proof Size summary in bytes: + // Measured: `547` + // Estimated: `4012` + // Minimum execution time: 19_479_000 picoseconds. + Weight::from_parts(20_120_000, 4012) + .saturating_add(RocksDbWeight::get().reads(2_u64)) + .saturating_add(RocksDbWeight::get().writes(2_u64)) + } + /// Storage: `Society::Head` (r:1 w:1) + /// Proof: `Society::Head` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Society::MemberCount` (r:1 w:1) + /// Proof: `Society::MemberCount` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Society::MemberByIndex` (r:0 w:1) + /// Proof: `Society::MemberByIndex` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Society::Founder` (r:0 w:1) + /// Proof: `Society::Founder` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Society::Rules` (r:0 w:1) + /// Proof: `Society::Rules` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Society::Members` (r:0 w:1) + /// Proof: `Society::Members` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Society::Parameters` (r:0 w:1) + /// Proof: `Society::Parameters` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) fn found_society() -> Weight { - Weight::zero() - } - // Storage: Society Founder (r:1 w:1) - // Storage: Society MemberCount (r:1 w:1) - // Storage: Society Head (r:0 w:1) - // Storage: Society Defending (r:0 w:1) - // Storage: Society ChallengeRoundCount (r:0 w:1) - // Storage: Society MemberByIndex (r:0 w:5) - // Storage: Society Skeptic (r:0 w:1) - // Storage: Society Candidates (r:0 w:4) - // Storage: Society Pot (r:0 w:1) - // Storage: Society Rules (r:0 w:1) - // Storage: Society Votes (r:0 w:4) - // Storage: Society Members (r:0 w:5) - // Storage: Society RoundCount (r:0 w:1) - // Storage: Society Bids (r:0 w:1) - // Storage: Society Parameters (r:0 w:1) - // Storage: Society NextHead (r:0 w:1) + // Proof Size summary in bytes: + // Measured: `180` + // Estimated: `1665` + // Minimum execution time: 15_843_000 picoseconds. + Weight::from_parts(16_617_000, 1665) + .saturating_add(RocksDbWeight::get().reads(2_u64)) + .saturating_add(RocksDbWeight::get().writes(7_u64)) + } + /// Storage: `Society::Founder` (r:1 w:1) + /// Proof: `Society::Founder` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Society::MemberCount` (r:1 w:1) + /// Proof: `Society::MemberCount` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Society::Members` (r:5 w:5) + /// Proof: `Society::Members` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Society::MemberByIndex` (r:5 w:5) + /// Proof: `Society::MemberByIndex` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Society::Votes` (r:4 w:4) + /// Proof: `Society::Votes` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Society::Candidates` (r:4 w:4) + /// Proof: `Society::Candidates` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Society::Head` (r:0 w:1) + /// Proof: `Society::Head` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Society::Defending` (r:0 w:1) + /// Proof: `Society::Defending` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Society::ChallengeRoundCount` (r:0 w:1) + /// Proof: `Society::ChallengeRoundCount` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Society::Skeptic` (r:0 w:1) + /// Proof: `Society::Skeptic` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Society::Pot` (r:0 w:1) + /// Proof: `Society::Pot` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Society::Rules` (r:0 w:1) + /// Proof: `Society::Rules` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Society::RoundCount` (r:0 w:1) + /// Proof: `Society::RoundCount` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Society::Bids` (r:0 w:1) + /// Proof: `Society::Bids` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Society::Parameters` (r:0 w:1) + /// Proof: `Society::Parameters` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Society::NextHead` (r:0 w:1) + /// Proof: `Society::NextHead` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) fn dissolve() -> Weight { - Weight::zero() - } - // Storage: Society Founder (r:1 w:0) - // Storage: Society SuspendedMembers (r:1 w:1) - // Storage: Society Payouts (r:1 w:0) - // Storage: Society Pot (r:1 w:1) + // Proof Size summary in bytes: + // Measured: `1654` + // Estimated: `15019` + // Minimum execution time: 58_302_000 picoseconds. + Weight::from_parts(59_958_000, 15019) + .saturating_add(RocksDbWeight::get().reads(20_u64)) + .saturating_add(RocksDbWeight::get().writes(30_u64)) + } + /// Storage: `Society::Founder` (r:1 w:0) + /// Proof: `Society::Founder` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Society::SuspendedMembers` (r:1 w:1) + /// Proof: `Society::SuspendedMembers` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Society::Payouts` (r:1 w:0) + /// Proof: `Society::Payouts` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Society::Pot` (r:1 w:1) + /// Proof: `Society::Pot` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) fn judge_suspended_member() -> Weight { - Weight::zero() - } - // Storage: Society Founder (r:1 w:0) - // Storage: Society MemberCount (r:1 w:0) - // Storage: Society Parameters (r:0 w:1) + // Proof Size summary in bytes: + // Measured: `505` + // Estimated: `3970` + // Minimum execution time: 20_044_000 picoseconds. + Weight::from_parts(20_884_000, 3970) + .saturating_add(RocksDbWeight::get().reads(4_u64)) + .saturating_add(RocksDbWeight::get().writes(2_u64)) + } + /// Storage: `Society::Founder` (r:1 w:0) + /// Proof: `Society::Founder` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Society::MemberCount` (r:1 w:0) + /// Proof: `Society::MemberCount` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Society::Parameters` (r:0 w:1) + /// Proof: `Society::Parameters` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) fn set_parameters() -> Weight { - Weight::zero() - } - // Storage: Society Candidates (r:1 w:1) - // Storage: Society RoundCount (r:1 w:0) - // Storage: Society Skeptic (r:1 w:0) - // Storage: Society Votes (r:1 w:0) - // Storage: Society Members (r:1 w:1) - // Storage: Society Parameters (r:1 w:0) + // Proof Size summary in bytes: + // Measured: `387` + // Estimated: `1872` + // Minimum execution time: 11_183_000 picoseconds. + Weight::from_parts(11_573_000, 1872) + .saturating_add(RocksDbWeight::get().reads(2_u64)) + .saturating_add(RocksDbWeight::get().writes(1_u64)) + } + /// Storage: `Society::Candidates` (r:1 w:1) + /// Proof: `Society::Candidates` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Society::RoundCount` (r:1 w:0) + /// Proof: `Society::RoundCount` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Society::Skeptic` (r:1 w:0) + /// Proof: `Society::Skeptic` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Society::Votes` (r:1 w:0) + /// Proof: `Society::Votes` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Society::Members` (r:1 w:1) + /// Proof: `Society::Members` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Society::Parameters` (r:1 w:0) + /// Proof: `Society::Parameters` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) fn punish_skeptic() -> Weight { - Weight::zero() - } - // Storage: Society Candidates (r:1 w:1) - // Storage: Society RoundCount (r:1 w:0) - // Storage: Society Parameters (r:1 w:0) - // Storage: Society MemberCount (r:1 w:1) - // Storage: Society NextHead (r:1 w:1) - // Storage: System Account (r:1 w:1) - // Storage: Society MemberByIndex (r:0 w:1) - // Storage: Society Members (r:0 w:1) + // Proof Size summary in bytes: + // Measured: `636` + // Estimated: `4101` + // Minimum execution time: 24_149_000 picoseconds. + Weight::from_parts(25_160_000, 4101) + .saturating_add(RocksDbWeight::get().reads(6_u64)) + .saturating_add(RocksDbWeight::get().writes(2_u64)) + } + /// Storage: `Society::Candidates` (r:1 w:1) + /// Proof: `Society::Candidates` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Society::RoundCount` (r:1 w:0) + /// Proof: `Society::RoundCount` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Society::Parameters` (r:1 w:0) + /// Proof: `Society::Parameters` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Society::MemberCount` (r:1 w:1) + /// Proof: `Society::MemberCount` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Society::NextHead` (r:1 w:1) + /// Proof: `Society::NextHead` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `Society::MemberByIndex` (r:0 w:1) + /// Proof: `Society::MemberByIndex` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Society::Members` (r:0 w:1) + /// Proof: `Society::Members` (`max_values`: None, `max_size`: None, mode: `Measured`) fn claim_membership() -> Weight { - Weight::zero() - } - // Storage: Society Founder (r:1 w:0) - // Storage: Society Candidates (r:1 w:1) - // Storage: Society RoundCount (r:1 w:0) - // Storage: Society Parameters (r:1 w:0) - // Storage: Society MemberCount (r:1 w:1) - // Storage: Society NextHead (r:1 w:1) - // Storage: System Account (r:1 w:1) - // Storage: Society MemberByIndex (r:0 w:1) - // Storage: Society Members (r:0 w:1) + // Proof Size summary in bytes: + // Measured: `632` + // Estimated: `4097` + // Minimum execution time: 37_992_000 picoseconds. + Weight::from_parts(39_226_000, 4097) + .saturating_add(RocksDbWeight::get().reads(6_u64)) + .saturating_add(RocksDbWeight::get().writes(6_u64)) + } + /// Storage: `Society::Founder` (r:1 w:0) + /// Proof: `Society::Founder` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Society::Candidates` (r:1 w:1) + /// Proof: `Society::Candidates` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Society::RoundCount` (r:1 w:0) + /// Proof: `Society::RoundCount` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Society::Parameters` (r:1 w:0) + /// Proof: `Society::Parameters` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Society::MemberCount` (r:1 w:1) + /// Proof: `Society::MemberCount` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Society::NextHead` (r:1 w:1) + /// Proof: `Society::NextHead` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `Society::MemberByIndex` (r:0 w:1) + /// Proof: `Society::MemberByIndex` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Society::Members` (r:0 w:1) + /// Proof: `Society::Members` (`max_values`: None, `max_size`: None, mode: `Measured`) fn bestow_membership() -> Weight { - Weight::zero() - } - // Storage: Society Founder (r:1 w:0) - // Storage: Society Candidates (r:1 w:1) - // Storage: Society RoundCount (r:1 w:0) + // Proof Size summary in bytes: + // Measured: `650` + // Estimated: `4115` + // Minimum execution time: 39_383_000 picoseconds. + Weight::from_parts(40_367_000, 4115) + .saturating_add(RocksDbWeight::get().reads(7_u64)) + .saturating_add(RocksDbWeight::get().writes(6_u64)) + } + /// Storage: `Society::Founder` (r:1 w:0) + /// Proof: `Society::Founder` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Society::Candidates` (r:1 w:1) + /// Proof: `Society::Candidates` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Society::RoundCount` (r:1 w:0) + /// Proof: `Society::RoundCount` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `System::Account` (r:2 w:2) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) fn kick_candidate() -> Weight { - Weight::zero() - } - // Storage: Society Candidates (r:1 w:1) - // Storage: Society RoundCount (r:1 w:0) + // Proof Size summary in bytes: + // Measured: `776` + // Estimated: `6196` + // Minimum execution time: 40_060_000 picoseconds. + Weight::from_parts(40_836_000, 6196) + .saturating_add(RocksDbWeight::get().reads(5_u64)) + .saturating_add(RocksDbWeight::get().writes(3_u64)) + } + /// Storage: `Society::Candidates` (r:1 w:1) + /// Proof: `Society::Candidates` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Society::RoundCount` (r:1 w:0) + /// Proof: `Society::RoundCount` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `System::Account` (r:2 w:2) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) fn resign_candidacy() -> Weight { - Weight::zero() - } - // Storage: Society Candidates (r:1 w:1) - // Storage: Society RoundCount (r:1 w:0) + // Proof Size summary in bytes: + // Measured: `746` + // Estimated: `6196` + // Minimum execution time: 37_529_000 picoseconds. + Weight::from_parts(38_342_000, 6196) + .saturating_add(RocksDbWeight::get().reads(4_u64)) + .saturating_add(RocksDbWeight::get().writes(3_u64)) + } + /// Storage: `Society::Candidates` (r:1 w:1) + /// Proof: `Society::Candidates` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Society::RoundCount` (r:1 w:0) + /// Proof: `Society::RoundCount` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `System::Account` (r:2 w:2) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) fn drop_candidate() -> Weight { - Weight::zero() - } - // Storage: Society Candidates (r:1 w:0) - // Storage: Society VoteClearCursor (r:1 w:0) - // Storage: Society Votes (r:0 w:2) + // Proof Size summary in bytes: + // Measured: `758` + // Estimated: `6196` + // Minimum execution time: 37_992_000 picoseconds. + Weight::from_parts(39_002_000, 6196) + .saturating_add(RocksDbWeight::get().reads(4_u64)) + .saturating_add(RocksDbWeight::get().writes(3_u64)) + } + /// Storage: `Society::Candidates` (r:1 w:0) + /// Proof: `Society::Candidates` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Society::VoteClearCursor` (r:1 w:0) + /// Proof: `Society::VoteClearCursor` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Society::Votes` (r:2 w:2) + /// Proof: `Society::Votes` (`max_values`: None, `max_size`: None, mode: `Measured`) fn cleanup_candidacy() -> Weight { - Weight::zero() - } - // Storage: Society ChallengeRoundCount (r:1 w:0) - // Storage: Society DefenderVotes (r:0 w:1) + // Proof Size summary in bytes: + // Measured: `552` + // Estimated: `6492` + // Minimum execution time: 17_266_000 picoseconds. + Weight::from_parts(18_255_000, 6492) + .saturating_add(RocksDbWeight::get().reads(4_u64)) + .saturating_add(RocksDbWeight::get().writes(2_u64)) + } + /// Storage: `Society::ChallengeRoundCount` (r:1 w:0) + /// Proof: `Society::ChallengeRoundCount` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Society::DefenderVotes` (r:1 w:1) + /// Proof: `Society::DefenderVotes` (`max_values`: None, `max_size`: None, mode: `Measured`) fn cleanup_challenge() -> Weight { - Weight::zero() + // Proof Size summary in bytes: + // Measured: `510` + // Estimated: `3975` + // Minimum execution time: 11_636_000 picoseconds. + Weight::from_parts(12_122_000, 3975) + .saturating_add(RocksDbWeight::get().reads(2_u64)) + .saturating_add(RocksDbWeight::get().writes(1_u64)) } } diff --git a/substrate/frame/src/lib.rs b/substrate/frame/src/lib.rs index a1715ba4900102595ac6ec926a0aeeb2a2be1650..f93f4d31e777c93e999f4346b9b74e2a13979e4d 100644 --- a/substrate/frame/src/lib.rs +++ b/substrate/frame/src/lib.rs @@ -45,28 +45,32 @@ //! //! In short, this crate only re-exports types and traits from multiple sources. All of these //! sources are listed (and re-exported again) in [`deps`]. +//! +//! ## Usage +//! +//! Please note that this crate can only be imported as `polkadot-sdk-frame` or `frame`. #![cfg_attr(not(feature = "std"), no_std)] #![cfg(feature = "experimental")] -/// Exports the main pallet macro. This can wrap a `mod pallet` and will transform it into -/// being a pallet, eg `#[frame::pallet] mod pallet { .. }`. -/// -/// Note that this is not part of the prelude, in order to make it such that the common way to -/// define a macro is `#[frame::pallet] mod pallet { .. }`, followed by `#[pallet::foo]`, -/// `#[pallet::bar]` inside the mod. +#[doc(no_inline)] pub use frame_support::pallet; +#[doc(no_inline)] pub use frame_support::pallet_macros::{import_section, pallet_section}; /// The logging library of the runtime. Can normally be the classic `log` crate. pub use log; -/// A list of all macros used within the main [`pallet`] macro. +/// Macros used within the main [`pallet`] macro. /// /// Note: All of these macros are "stubs" and not really usable outside `#[pallet] mod pallet { .. /// }`. They are mainly provided for documentation and IDE support. +/// +/// To view a list of all the macros and their documentation, follow the links in the 'Re-exports' +/// section below: pub mod pallet_macros { + #[doc(no_inline)] pub use frame_support::{derive_impl, pallet, pallet_macros::*}; } @@ -75,7 +79,7 @@ pub mod pallet_macros { /// This prelude should almost always be the first line of code in any pallet or runtime. /// /// ``` -/// use frame::prelude::*; +/// use polkadot_sdk_frame::prelude::*; /// /// // rest of your pallet.. /// mod pallet {} @@ -84,7 +88,7 @@ pub mod prelude { /// `frame_system`'s parent crate, which is mandatory in all pallets build with this crate. /// /// Conveniently, the keyword `frame_system` is in scope as one uses `use - /// frame::prelude::*` + /// polkadot_sdk_frame::prelude::*` #[doc(inline)] pub use frame_system; @@ -112,7 +116,7 @@ pub mod prelude { /// A test setup typically starts with: /// /// ``` -/// use frame::testing_prelude::*; +/// use polkadot_sdk_frame::testing_prelude::*; /// // rest of your test setup. /// ``` #[cfg(feature = "std")] @@ -141,7 +145,7 @@ pub mod runtime { /// A runtime typically starts with: /// /// ``` - /// use frame::{prelude::*, runtime::prelude::*}; + /// use polkadot_sdk_frame::{prelude::*, runtime::prelude::*}; /// ``` pub mod prelude { /// All of the types related to the FRAME runtime executive. @@ -163,6 +167,12 @@ pub mod runtime { ConstU32, ConstU64, ConstU8, }; + /// Primary types used to parameterize `EnsureOrigin` and `EnsureRootWithArg`. + pub use frame_system::{ + EnsureNever, EnsureNone, EnsureRoot, EnsureRootWithSuccess, EnsureSigned, + EnsureSignedBy, + }; + /// Types to define your runtime version. pub use sp_version::{create_runtime_str, runtime_version, RuntimeVersion}; @@ -180,7 +190,7 @@ pub mod runtime { /// A non-testing runtime should have this enabled, as such: /// /// ``` - /// use frame::runtime::{prelude::*, apis::{*,}}; + /// use polkadot_sdk_frame::runtime::{prelude::*, apis::{*,}}; /// ``` // TODO: This is because of wildcard imports, and it should be not needed once we can avoid // that. Imports like that are needed because we seem to need some unknown types in the macro @@ -191,7 +201,7 @@ pub mod runtime { // Types often used in the runtime APIs. pub use sp_core::OpaqueMetadata; pub use sp_inherents::{CheckInherentsResult, InherentData}; - pub use sp_runtime::ApplyExtrinsicResult; + pub use sp_runtime::{ApplyExtrinsicResult, ExtrinsicInclusionMode}; pub use frame_system_rpc_runtime_api::*; pub use sp_api::{self, *}; @@ -324,8 +334,8 @@ pub mod derive { /// In most cases, hopefully the answer is yes. pub mod deps { // TODO: It would be great to somehow instruct RA to prefer *not* suggesting auto-imports from - // these. For example, we prefer `frame::derive::CloneNoBound` rather than - // `frame::deps::frame_support::CloneNoBound`. + // these. For example, we prefer `polkadot_sdk_frame::derive::CloneNoBound` rather than + // `polkadot_sdk_frame::deps::frame_support::CloneNoBound`. pub use frame_support; pub use frame_system; diff --git a/substrate/frame/staking/Cargo.toml b/substrate/frame/staking/Cargo.toml index 2c3f50beaeaea9981beed9d4771bc49b11d83901..4fd0cedbae63fb3c484549c2f4388f912e7a428d 100644 --- a/substrate/frame/staking/Cargo.toml +++ b/substrate/frame/staking/Cargo.toml @@ -16,11 +16,11 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -serde = { version = "1.0.195", default-features = false, features = ["alloc", "derive"] } +serde = { features = ["alloc", "derive"], workspace = true } codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = [ "derive", ] } -scale-info = { version = "2.10.0", default-features = false, features = ["derive", "serde"] } +scale-info = { version = "2.11.1", default-features = false, features = ["derive", "serde"] } sp-io = { path = "../../primitives/io", default-features = false } sp-runtime = { path = "../../primitives/runtime", default-features = false, features = ["serde"] } sp-staking = { path = "../../primitives/staking", default-features = false, features = ["serde"] } @@ -33,17 +33,17 @@ pallet-session = { path = "../session", default-features = false, features = [ pallet-authorship = { path = "../authorship", default-features = false } sp-application-crypto = { path = "../../primitives/application-crypto", default-features = false, features = ["serde"] } frame-election-provider-support = { path = "../election-provider-support", default-features = false } -log = { version = "0.4.17", default-features = false } +log = { workspace = true } # Optional imports for benchmarking frame-benchmarking = { path = "../benchmarking", default-features = false, optional = true } rand_chacha = { version = "0.2", default-features = false, optional = true } [dev-dependencies] +pallet-balances = { path = "../balances" } sp-tracing = { path = "../../primitives/tracing" } sp-core = { path = "../../primitives/core" } sp-npos-elections = { path = "../../primitives/npos-elections" } -pallet-balances = { path = "../balances" } pallet-timestamp = { path = "../timestamp" } pallet-staking-reward-curve = { path = "reward-curve" } pallet-bags-list = { path = "../bags-list" } diff --git a/substrate/frame/staking/reward-curve/Cargo.toml b/substrate/frame/staking/reward-curve/Cargo.toml index 26ffbd7efbcb57d85cc4f46607167c98d2b585c4..e2a2782db2da1527eff9d9948020fb72bd02e370 100644 --- a/substrate/frame/staking/reward-curve/Cargo.toml +++ b/substrate/frame/staking/reward-curve/Cargo.toml @@ -20,8 +20,8 @@ proc-macro = true [dependencies] proc-macro-crate = "3.0.0" proc-macro2 = "1.0.56" -quote = "1.0.28" -syn = { version = "2.0.48", features = ["full", "visit"] } +quote = { workspace = true } +syn = { features = ["full", "visit"], workspace = true } [dev-dependencies] sp-runtime = { path = "../../../primitives/runtime" } diff --git a/substrate/frame/staking/reward-fn/Cargo.toml b/substrate/frame/staking/reward-fn/Cargo.toml index 0b8903f28718cb917a9742db79380c25d62747c9..5169db5072e2fc80805605c3517d8c6e779e5620 100644 --- a/substrate/frame/staking/reward-fn/Cargo.toml +++ b/substrate/frame/staking/reward-fn/Cargo.toml @@ -17,7 +17,7 @@ targets = ["x86_64-unknown-linux-gnu"] [lib] [dependencies] -log = { version = "0.4.17", default-features = false } +log = { workspace = true } sp-arithmetic = { path = "../../../primitives/arithmetic", default-features = false } [features] diff --git a/substrate/frame/staking/src/benchmarking.rs b/substrate/frame/staking/src/benchmarking.rs index 7bcc68cdfe6f51c001959ba4f2fe2d28c9c7f0ed..3ed33ffea4223847068ded561d9a6a4748843718 100644 --- a/substrate/frame/staking/src/benchmarking.rs +++ b/substrate/frame/staking/src/benchmarking.rs @@ -855,7 +855,8 @@ benchmarks! { ConfigOp::Set(u32::MAX), ConfigOp::Set(u32::MAX), ConfigOp::Set(Percent::max_value()), - ConfigOp::Set(Perbill::max_value()) + ConfigOp::Set(Perbill::max_value()), + ConfigOp::Set(Percent::max_value()) ) verify { assert_eq!(MinNominatorBond::::get(), BalanceOf::::max_value()); assert_eq!(MinValidatorBond::::get(), BalanceOf::::max_value()); @@ -863,6 +864,7 @@ benchmarks! { assert_eq!(MaxValidatorsCount::::get(), Some(u32::MAX)); assert_eq!(ChillThreshold::::get(), Some(Percent::from_percent(100))); assert_eq!(MinCommission::::get(), Perbill::from_percent(100)); + assert_eq!(MaxStakedRewards::::get(), Some(Percent::from_percent(100))); } set_staking_configs_all_remove { @@ -873,6 +875,7 @@ benchmarks! { ConfigOp::Remove, ConfigOp::Remove, ConfigOp::Remove, + ConfigOp::Remove, ConfigOp::Remove ) verify { assert!(!MinNominatorBond::::exists()); @@ -881,6 +884,7 @@ benchmarks! { assert!(!MaxValidatorsCount::::exists()); assert!(!ChillThreshold::::exists()); assert!(!MinCommission::::exists()); + assert!(!MaxStakedRewards::::exists()); } chill_other { @@ -904,6 +908,7 @@ benchmarks! { ConfigOp::Set(0), ConfigOp::Set(Percent::from_percent(0)), ConfigOp::Set(Zero::zero()), + ConfigOp::Noop, )?; let caller = whitelisted_caller(); @@ -948,6 +953,15 @@ benchmarks! { assert_eq!(MinCommission::::get(), Perbill::from_percent(100)); } + restore_ledger { + let (stash, controller) = create_stash_controller::(0, 100, RewardDestination::Staked)?; + // corrupt ledger. + Ledger::::remove(controller); + }: _(RawOrigin::Root, stash.clone(), None, None, None) + verify { + assert_eq!(Staking::::inspect_bond_state(&stash), Ok(LedgerIntegrityState::Ok)); + } + impl_benchmark_test_suite!( Staking, crate::mock::ExtBuilder::default().has_stakers(true), @@ -1063,15 +1077,13 @@ mod tests { (frame_benchmarking::BenchmarkParameter::v, v), (frame_benchmarking::BenchmarkParameter::n, n), ]; - let closure_to_benchmark = - >::instance( + + assert_ok!( + >::unit_test_instance( &selected_benchmark, &c, - true, ) - .unwrap(); - - assert_ok!(closure_to_benchmark()); + ); }); } } diff --git a/substrate/frame/staking/src/election_size_tracker.rs b/substrate/frame/staking/src/election_size_tracker.rs index 283ae0140ee6894b19dce2f6bb67bbcc771029f0..36e7fa48fda5a48709d85ab5e53fc22eb6a61e89 100644 --- a/substrate/frame/staking/src/election_size_tracker.rs +++ b/substrate/frame/staking/src/election_size_tracker.rs @@ -84,7 +84,7 @@ use frame_election_provider_support::{ pub struct StaticTracker { pub size: usize, pub counter: usize, - _marker: sp_std::marker::PhantomData, + _marker: core::marker::PhantomData, } impl Default for StaticTracker { diff --git a/substrate/frame/staking/src/ledger.rs b/substrate/frame/staking/src/ledger.rs index 5947adb9028b3a63b9f5b75eff4190c83749895f..9461daefed65e74c778a248a0bbaeeedd3ee6222 100644 --- a/substrate/frame/staking/src/ledger.rs +++ b/substrate/frame/staking/src/ledger.rs @@ -32,8 +32,8 @@ //! state consistency. use frame_support::{ - defensive, - traits::{LockableCurrency, WithdrawReasons}, + defensive, ensure, + traits::{Defensive, LockableCurrency, WithdrawReasons}, }; use sp_staking::StakingAccount; use sp_std::prelude::*; @@ -106,18 +106,39 @@ impl StakingLedger { /// This getter can be called with either a controller or stash account, provided that the /// account is properly wrapped in the respective [`StakingAccount`] variant. This is meant to /// abstract the concept of controller/stash accounts from the caller. + /// + /// Returns [`Error::BadState`] when a bond is in "bad state". A bond is in a bad state when a + /// stash has a controller which is bonding a ledger associated with another stash. pub(crate) fn get(account: StakingAccount) -> Result, Error> { - let controller = match account { - StakingAccount::Stash(stash) => >::get(stash).ok_or(Error::::NotStash), - StakingAccount::Controller(controller) => Ok(controller), - }?; + let (stash, controller) = match account.clone() { + StakingAccount::Stash(stash) => + (stash.clone(), >::get(&stash).ok_or(Error::::NotStash)?), + StakingAccount::Controller(controller) => ( + Ledger::::get(&controller) + .map(|l| l.stash) + .ok_or(Error::::NotController)?, + controller, + ), + }; - >::get(&controller) + let ledger = >::get(&controller) .map(|mut ledger| { ledger.controller = Some(controller.clone()); ledger }) - .ok_or(Error::::NotController) + .ok_or(Error::::NotController)?; + + // if ledger bond is in a bad state, return error to prevent applying operations that may + // further spoil the ledger's state. A bond is in bad state when the bonded controller is + // associated with a different ledger (i.e. a ledger with a different stash). + // + // See for more details. + ensure!( + Bonded::::get(&stash) == Some(controller) && ledger.stash == stash, + Error::::BadState + ); + + Ok(ledger) } /// Returns the reward destination of a staking ledger, stored in [`Payee`]. @@ -201,6 +222,30 @@ impl StakingLedger { } } + /// Sets the ledger controller to its stash. + pub(crate) fn set_controller_to_stash(self) -> Result<(), Error> { + let controller = self.controller.as_ref() + .defensive_proof("Ledger's controller field didn't exist. The controller should have been fetched using StakingLedger.") + .ok_or(Error::::NotController)?; + + ensure!(self.stash != *controller, Error::::AlreadyPaired); + + // check if the ledger's stash is a controller of another ledger. + if let Some(bonded_ledger) = Ledger::::get(&self.stash) { + // there is a ledger bonded by the stash. In this case, the stash of the bonded ledger + // should be the same as the ledger's stash. Otherwise fail to prevent data + // inconsistencies. See for more + // details. + ensure!(bonded_ledger.stash == self.stash, Error::::BadState); + } + + >::remove(&controller); + >::insert(&self.stash, &self); + >::insert(&self.stash, &self.stash); + + Ok(()) + } + /// Clears all data related to a staking ledger and its bond in both [`Ledger`] and [`Bonded`] /// storage items and updates the stash staking lock. pub(crate) fn kill(stash: &T::AccountId) -> Result<(), Error> { diff --git a/substrate/frame/staking/src/lib.rs b/substrate/frame/staking/src/lib.rs index 09185a690be1657cc1fe749b00aad1b91baac76f..f5b7e3eca3de7cd49b6a5cbdef37dfa4feff80ec 100644 --- a/substrate/frame/staking/src/lib.rs +++ b/substrate/frame/staking/src/lib.rs @@ -202,6 +202,12 @@ //! ```nocompile //! remaining_payout = max_yearly_inflation * total_tokens / era_per_year - staker_payout //! ``` +//! +//! Note, however, that it is possible to set a cap on the total `staker_payout` for the era through +//! the `MaxStakersRewards` storage type. The `era_payout` implementor must ensure that the +//! `max_payout = remaining_payout + (staker_payout * max_stakers_rewards)`. The excess payout that +//! is not allocated for stakers is the era remaining reward. +//! //! The remaining reward is send to the configurable end-point [`Config::RewardRemainder`]. //! //! ### Reward Calculation @@ -485,6 +491,20 @@ pub struct StakingLedger { controller: Option, } +/// State of a ledger with regards with its data and metadata integrity. +#[derive(PartialEq, Debug)] +enum LedgerIntegrityState { + /// Ledger, bond and corresponding staking lock is OK. + Ok, + /// Ledger and/or bond is corrupted. This means that the bond has a ledger with a different + /// stash than the bonded stash. + Corrupted, + /// Ledger was corrupted and it has been killed. + CorruptedKilled, + /// Ledger and bond are OK, however the ledger's stash lock is out of sync. + LockCorrupted, +} + impl StakingLedger { /// Remove entries from `unlocking` that are sufficiently old and reduce the /// total by the sum of their balances. @@ -897,8 +917,10 @@ impl EraPayout for () { /// Adaptor to turn a `PiecewiseLinear` curve definition into an `EraPayout` impl, used for /// backwards compatibility. pub struct ConvertCurve(sp_std::marker::PhantomData); -impl>> - EraPayout for ConvertCurve +impl EraPayout for ConvertCurve +where + Balance: AtLeast32BitUnsigned + Clone + Copy, + T: Get<&'static PiecewiseLinear<'static>>, { fn era_payout( total_staked: Balance, @@ -912,7 +934,7 @@ impl = StorageValue, ObsoleteReleases, Value pub mod v14 { use super::*; - pub struct MigrateToV14(sp_std::marker::PhantomData); + pub struct MigrateToV14(core::marker::PhantomData); impl OnRuntimeUpgrade for MigrateToV14 { fn on_runtime_upgrade() -> Weight { - let current = Pallet::::current_storage_version(); + let in_code = Pallet::::in_code_storage_version(); let on_chain = Pallet::::on_chain_storage_version(); - if current == 14 && on_chain == 13 { - current.put::>(); + if in_code == 14 && on_chain == 13 { + in_code.put::>(); log!(info, "v14 applied successfully."); T::DbWeight::get().reads_writes(1, 1) @@ -95,7 +95,7 @@ pub mod v14 { pub mod v13 { use super::*; - pub struct MigrateToV13(sp_std::marker::PhantomData); + pub struct MigrateToV13(core::marker::PhantomData); impl OnRuntimeUpgrade for MigrateToV13 { #[cfg(feature = "try-runtime")] fn pre_upgrade() -> Result, TryRuntimeError> { @@ -108,12 +108,12 @@ pub mod v13 { } fn on_runtime_upgrade() -> Weight { - let current = Pallet::::current_storage_version(); + let in_code = Pallet::::in_code_storage_version(); let onchain = StorageVersion::::get(); - if current == 13 && onchain == ObsoleteReleases::V12_0_0 { + if in_code == 13 && onchain == ObsoleteReleases::V12_0_0 { StorageVersion::::kill(); - current.put::>(); + in_code.put::>(); log!(info, "v13 applied successfully"); T::DbWeight::get().reads_writes(1, 2) @@ -151,7 +151,7 @@ pub mod v12 { /// /// We will be depending on the configurable value of `T::HistoryDepth` post /// this release. - pub struct MigrateToV12(sp_std::marker::PhantomData); + pub struct MigrateToV12(core::marker::PhantomData); impl OnRuntimeUpgrade for MigrateToV12 { #[cfg(feature = "try-runtime")] fn pre_upgrade() -> Result, TryRuntimeError> { @@ -205,7 +205,7 @@ pub mod v11 { #[cfg(feature = "try-runtime")] use sp_io::hashing::twox_128; - pub struct MigrateToV11(sp_std::marker::PhantomData<(T, P, N)>); + pub struct MigrateToV11(core::marker::PhantomData<(T, P, N)>); impl> OnRuntimeUpgrade for MigrateToV11 { @@ -301,7 +301,7 @@ pub mod v10 { /// That means we might slash someone a bit too early, but we will definitely /// won't forget to slash them. The cap of 512 is somewhat randomly taken to /// prevent us from iterating over an arbitrary large number of keys `on_runtime_upgrade`. - pub struct MigrateToV10(sp_std::marker::PhantomData); + pub struct MigrateToV10(core::marker::PhantomData); impl OnRuntimeUpgrade for MigrateToV10 { fn on_runtime_upgrade() -> frame_support::weights::Weight { if StorageVersion::::get() == ObsoleteReleases::V9_0_0 { diff --git a/substrate/frame/staking/src/mock.rs b/substrate/frame/staking/src/mock.rs index 40a5be51dedf232c9a89583081f15d31f7ce159e..6db462c1a70fbce4ed2d531bf9ad4d837e83b585 100644 --- a/substrate/frame/staking/src/mock.rs +++ b/substrate/frame/staking/src/mock.rs @@ -25,20 +25,14 @@ use frame_election_provider_support::{ use frame_support::{ assert_ok, derive_impl, ord_parameter_types, parameter_types, traits::{ - ConstU64, Currency, EitherOfDiverse, FindAuthor, Get, Hooks, Imbalance, OnUnbalanced, - OneSessionHandler, + ConstU64, Currency, EitherOfDiverse, FindAuthor, Get, Hooks, Imbalance, LockableCurrency, + OnUnbalanced, OneSessionHandler, WithdrawReasons, }, weights::constants::RocksDbWeight, }; use frame_system::{EnsureRoot, EnsureSignedBy}; -use sp_core::H256; use sp_io; -use sp_runtime::{ - curve::PiecewiseLinear, - testing::UintAuthorityId, - traits::{IdentityLookup, Zero}, - BuildStorage, -}; +use sp_runtime::{curve::PiecewiseLinear, testing::UintAuthorityId, traits::Zero, BuildStorage}; use sp_staking::{ offence::{DisableStrategy, OffenceDetails, OnOffenceHandler}, OnStakingUpdate, @@ -49,7 +43,6 @@ pub const BLOCK_TIME: u64 = 1000; /// The AccountId alias in this test module. pub(crate) type AccountId = u64; -pub(crate) type Nonce = u64; pub(crate) type BlockNumber = u64; pub(crate) type Balance = u128; @@ -125,31 +118,11 @@ parameter_types! { pub static MaxControllersInDeprecationBatch: u32 = 5900; } -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { - type BaseCallFilter = frame_support::traits::Everything; - type BlockWeights = (); - type BlockLength = (); type DbWeight = RocksDbWeight; - type RuntimeOrigin = RuntimeOrigin; - type Nonce = Nonce; - type RuntimeCall = RuntimeCall; - type Hash = H256; - type Hashing = ::sp_runtime::traits::BlakeTwo256; - type AccountId = AccountId; - type Lookup = IdentityLookup; type Block = Block; - type RuntimeEvent = RuntimeEvent; - type BlockHashCount = frame_support::traits::ConstU64<250>; - type Version = (); - type PalletInfo = PalletInfo; type AccountData = pallet_balances::AccountData; - type OnNewAccount = (); - type OnKilledAccount = (); - type SystemWeightInfo = (); - type SS58Prefix = (); - type OnSetCode = (); - type MaxConsumers = frame_support::traits::ConstU32<16>; } impl pallet_balances::Config for Test { type MaxLocks = frame_support::traits::ConstU32<1024>; @@ -813,6 +786,88 @@ pub(crate) fn bond_controller_stash(controller: AccountId, stash: AccountId) -> Ok(()) } +// simulates `set_controller` without corrupted ledger checks for testing purposes. +pub(crate) fn set_controller_no_checks(stash: &AccountId) { + let controller = Bonded::::get(stash).expect("testing stash should be bonded"); + let ledger = Ledger::::get(&controller).expect("testing ledger should exist"); + + Ledger::::remove(&controller); + Ledger::::insert(stash, ledger); + Bonded::::insert(stash, stash); +} + +// simulates `bond_extra` without corrupted ledger checks for testing purposes. +pub(crate) fn bond_extra_no_checks(stash: &AccountId, amount: Balance) { + let controller = Bonded::::get(stash).expect("bond must exist to bond_extra"); + let mut ledger = Ledger::::get(&controller).expect("ledger must exist to bond_extra"); + + let new_total = ledger.total + amount; + Balances::set_lock(crate::STAKING_ID, stash, new_total, WithdrawReasons::all()); + ledger.total = new_total; + ledger.active = new_total; + Ledger::::insert(controller, ledger); +} + +pub(crate) fn setup_double_bonded_ledgers() { + let init_ledgers = Ledger::::iter().count(); + + let _ = Balances::make_free_balance_be(&333, 2000); + let _ = Balances::make_free_balance_be(&444, 2000); + let _ = Balances::make_free_balance_be(&555, 2000); + let _ = Balances::make_free_balance_be(&777, 2000); + + assert_ok!(Staking::bond(RuntimeOrigin::signed(333), 10, RewardDestination::Staked)); + assert_ok!(Staking::bond(RuntimeOrigin::signed(444), 20, RewardDestination::Staked)); + assert_ok!(Staking::bond(RuntimeOrigin::signed(555), 20, RewardDestination::Staked)); + // not relevant to the test case, but ensures try-runtime checks pass. + [333, 444, 555] + .iter() + .for_each(|s| Payee::::insert(s, RewardDestination::Staked)); + + // we want to test the case where a controller can also be a stash of another ledger. + // for that, we change the controller/stash bonding so that: + // * 444 becomes controller of 333. + // * 555 becomes controller of 444. + // * 777 becomes controller of 555. + let ledger_333 = Ledger::::get(333).unwrap(); + let ledger_444 = Ledger::::get(444).unwrap(); + let ledger_555 = Ledger::::get(555).unwrap(); + + // 777 becomes controller of 555. + Bonded::::mutate(555, |controller| *controller = Some(777)); + Ledger::::insert(777, ledger_555); + + // 555 becomes controller of 444. + Bonded::::mutate(444, |controller| *controller = Some(555)); + Ledger::::insert(555, ledger_444); + + // 444 becomes controller of 333. + Bonded::::mutate(333, |controller| *controller = Some(444)); + Ledger::::insert(444, ledger_333); + + // 333 is not controller anymore. + Ledger::::remove(333); + + // checks. now we have: + // * +3 ledgers + assert_eq!(Ledger::::iter().count(), 3 + init_ledgers); + + // * stash 333 has controller 444. + assert_eq!(Bonded::::get(333), Some(444)); + assert_eq!(StakingLedger::::paired_account(StakingAccount::Stash(333)), Some(444)); + assert_eq!(Ledger::::get(444).unwrap().stash, 333); + + // * stash 444 has controller 555. + assert_eq!(Bonded::::get(444), Some(555)); + assert_eq!(StakingLedger::::paired_account(StakingAccount::Stash(444)), Some(555)); + assert_eq!(Ledger::::get(555).unwrap().stash, 444); + + // * stash 555 has controller 777. + assert_eq!(Bonded::::get(555), Some(777)); + assert_eq!(StakingLedger::::paired_account(StakingAccount::Stash(555)), Some(777)); + assert_eq!(Ledger::::get(777).unwrap().stash, 555); +} + #[macro_export] macro_rules! assert_session_era { ($session:expr, $era:expr) => { diff --git a/substrate/frame/staking/src/pallet/impls.rs b/substrate/frame/staking/src/pallet/impls.rs index 8b45430c688ec69f975b47b4a079b450716939aa..2f43e4847e451a7cc10413bb58e3d98d82577e9f 100644 --- a/substrate/frame/staking/src/pallet/impls.rs +++ b/substrate/frame/staking/src/pallet/impls.rs @@ -27,8 +27,8 @@ use frame_support::{ dispatch::WithPostDispatchInfo, pallet_prelude::*, traits::{ - Currency, Defensive, DefensiveSaturating, EstimateNextNewSession, Get, Imbalance, Len, - OnUnbalanced, TryCollect, UnixTime, + Currency, Defensive, DefensiveSaturating, EstimateNextNewSession, Get, Imbalance, + InspectLockableCurrency, Len, OnUnbalanced, TryCollect, UnixTime, }, weights::Weight, }; @@ -36,12 +36,12 @@ use frame_system::{pallet_prelude::BlockNumberFor, RawOrigin}; use pallet_session::historical; use sp_runtime::{ traits::{Bounded, Convert, One, SaturatedConversion, Saturating, StaticLookup, Zero}, - Perbill, + Perbill, Percent, }; use sp_staking::{ currency_to_vote::CurrencyToVote, offence::{DisableStrategy, OffenceDetails, OnOffenceHandler}, - EraIndex, Page, SessionIndex, Stake, + EraIndex, OnStakingUpdate, Page, SessionIndex, Stake, StakingAccount::{self, Controller, Stash}, StakingInterface, }; @@ -50,8 +50,8 @@ use sp_std::prelude::*; use crate::{ election_size_tracker::StaticTracker, log, slashing, weights::WeightInfo, ActiveEraInfo, BalanceOf, EraInfo, EraPayout, Exposure, ExposureOf, Forcing, IndividualExposure, - MaxNominationsOf, MaxWinnersOf, Nominations, NominationsQuota, PositiveImbalanceOf, - RewardDestination, SessionInterface, StakingLedger, ValidatorPrefs, + LedgerIntegrityState, MaxNominationsOf, MaxWinnersOf, Nominations, NominationsQuota, + PositiveImbalanceOf, RewardDestination, SessionInterface, StakingLedger, ValidatorPrefs, }; use super::pallet::*; @@ -84,6 +84,38 @@ impl Pallet { StakingLedger::::paired_account(Stash(stash.clone())) } + /// Inspects and returns the corruption state of a ledger and bond, if any. + /// + /// Note: all operations in this method access directly the `Bonded` and `Ledger` storage maps + /// instead of using the [`StakingLedger`] API since the bond and/or ledger may be corrupted. + pub(crate) fn inspect_bond_state( + stash: &T::AccountId, + ) -> Result> { + let lock = T::Currency::balance_locked(crate::STAKING_ID, &stash); + + let controller = >::get(stash).ok_or_else(|| { + if lock == Zero::zero() { + Error::::NotStash + } else { + Error::::BadState + } + })?; + + match Ledger::::get(controller) { + Some(ledger) => + if ledger.stash != *stash { + Ok(LedgerIntegrityState::Corrupted) + } else { + if lock != ledger.total { + Ok(LedgerIntegrityState::LockCorrupted) + } else { + Ok(LedgerIntegrityState::Ok) + } + }, + None => Ok(LedgerIntegrityState::CorruptedKilled), + } + } + /// The total balance that can be slashed from a stash account as of right now. pub fn slashable_balance_of(stash: &T::AccountId) -> BalanceOf { // Weight note: consider making the stake accessible through stash. @@ -150,6 +182,9 @@ impl Pallet { // Already checked that this won't overflow by entry condition. let value = old_total.defensive_saturating_sub(new_total); Self::deposit_event(Event::::Withdrawn { stash, amount: value }); + + // notify listeners. + T::EventListeners::on_withdraw(controller, value); } Ok(used_weight) @@ -162,7 +197,8 @@ impl Pallet { let controller = Self::bonded(&validator_stash).ok_or_else(|| { Error::::NotStash.with_weight(T::WeightInfo::payout_stakers_alive_staked(0)) })?; - let ledger = >::get(&controller).ok_or(Error::::NotController)?; + + let ledger = Self::ledger(StakingAccount::Controller(controller))?; let page = EraInfo::::get_next_claimable_page(era, &validator_stash, &ledger) .ok_or_else(|| { Error::::AlreadyClaimed @@ -504,9 +540,18 @@ impl Pallet { .saturated_into::(); let staked = Self::eras_total_stake(&active_era.index); let issuance = T::Currency::total_issuance(); + let (validator_payout, remainder) = T::EraPayout::era_payout(staked, issuance, era_duration); + let total_payout = validator_payout.saturating_add(remainder); + let max_staked_rewards = + MaxStakedRewards::::get().unwrap_or(Percent::from_percent(100)); + + // apply cap to validators payout and add difference to remainder. + let validator_payout = validator_payout.min(max_staked_rewards * total_payout); + let remainder = total_payout.saturating_sub(validator_payout); + Self::deposit_event(Event::::EraPaid { era_index: active_era.index, validator_payout, @@ -1716,7 +1761,7 @@ impl StakingInterface for Pallet { ) -> Result { let ctrl = Self::bonded(&who).ok_or(Error::::NotStash)?; Self::withdraw_unbonded(RawOrigin::Signed(ctrl.clone()).into(), num_slashing_spans) - .map(|_| !Ledger::::contains_key(&ctrl)) + .map(|_| !StakingLedger::::is_bonded(StakingAccount::Controller(ctrl))) .map_err(|with_post| with_post.error) } @@ -1824,17 +1869,77 @@ impl Pallet { "VoterList contains non-staker" ); + Self::check_ledgers()?; + Self::check_bonded_consistency()?; Self::check_payees()?; Self::check_nominators()?; Self::check_exposures()?; Self::check_paged_exposures()?; - Self::check_ledgers()?; Self::check_count() } + /// Invariants: + /// * A controller should not be associated with more than one ledger. + /// * A bonded (stash, controller) pair should have only one associated ledger. I.e. if the + /// ledger is bonded by stash, the controller account must not bond a different ledger. + /// * A bonded (stash, controller) pair must have an associated ledger. + /// + /// NOTE: these checks result in warnings only. Once + /// is resolved, turn warns into check + /// failures. + fn check_bonded_consistency() -> Result<(), TryRuntimeError> { + use sp_std::collections::btree_set::BTreeSet; + + let mut count_controller_double = 0; + let mut count_double = 0; + let mut count_none = 0; + // sanity check to ensure that each controller in Bonded storage is associated with only one + // ledger. + let mut controllers = BTreeSet::new(); + + for (stash, controller) in >::iter() { + if !controllers.insert(controller.clone()) { + count_controller_double += 1; + } + + match (>::get(&stash), >::get(&controller)) { + (Some(_), Some(_)) => + // if stash == controller, it means that the ledger has migrated to + // post-controller. If no migration happened, we expect that the (stash, + // controller) pair has only one associated ledger. + if stash != controller { + count_double += 1; + }, + (None, None) => { + count_none += 1; + }, + _ => {}, + }; + } + + if count_controller_double != 0 { + log!( + warn, + "a controller is associated with more than one ledger ({} occurrences)", + count_controller_double + ); + }; + + if count_double != 0 { + log!(warn, "single tuple of (stash, controller) pair bonds more than one ledger ({} occurrences)", count_double); + } + + if count_none != 0 { + log!(warn, "inconsistent bonded state: (stash, controller) pair missing associated ledger ({} occurrences)", count_none); + } + + Ok(()) + } + /// Invariants: /// * A bonded ledger should always have an assigned `Payee`. /// * The number of entries in `Payee` and of bonded staking ledgers *must* match. + /// * The stash account in the ledger must match that of the bonded account. fn check_payees() -> Result<(), TryRuntimeError> { for (stash, _) in Bonded::::iter() { ensure!(Payee::::get(&stash).is_some(), "bonded ledger does not have payee set"); @@ -1849,6 +1954,11 @@ impl Pallet { Ok(()) } + /// Invariants: + /// * Number of voters in `VoterList` match that of the number of Nominators and Validators in + /// the system (validator is both voter and target). + /// * Number of targets in `TargetList` matches the number of validators in the system. + /// * Current validator count is bounded by the election provider's max winners. fn check_count() -> Result<(), TryRuntimeError> { ensure!( ::VoterList::count() == @@ -1867,15 +1977,19 @@ impl Pallet { Ok(()) } + /// Invariants: + /// * Stake consistency: ledger.total == ledger.active + sum(ledger.unlocking). + /// * The ledger's controller and stash matches the associated `Bonded` tuple. + /// * Staking locked funds for every bonded stash should be the same as its ledger's total. + /// * Staking ledger and bond are not corrupted. fn check_ledgers() -> Result<(), TryRuntimeError> { Bonded::::iter() .map(|(stash, ctrl)| { - // `ledger.controller` is never stored in raw storage. - let raw = Ledger::::get(stash).unwrap_or_else(|| { - Ledger::::get(ctrl.clone()) - .expect("try_check: bonded stash/ctrl does not have an associated ledger") - }); - ensure!(raw.controller.is_none(), "raw storage controller should be None"); + // ensure locks consistency. + ensure!( + Self::inspect_bond_state(&stash) == Ok(LedgerIntegrityState::Ok), + "bond, ledger and/or staking lock inconsistent for a bonded stash." + ); // ensure ledger consistency. Self::ensure_ledger_consistent(ctrl) @@ -1884,8 +1998,10 @@ impl Pallet { Ok(()) } + /// Invariants: + /// * For each era exposed validator, check if the exposure total is sane (exposure.total = + /// exposure.own + exposure.own). fn check_exposures() -> Result<(), TryRuntimeError> { - // a check per validator to ensure the exposure struct is always sane. let era = Self::active_era().unwrap().index; ErasStakers::::iter_prefix_values(era) .map(|expo| { @@ -1903,6 +2019,10 @@ impl Pallet { .collect::>() } + /// Invariants: + /// * For each paged era exposed validator, check if the exposure total is sane (exposure.total + /// = exposure.own + exposure.own). + /// * Paged exposures metadata (`ErasStakersOverview`) matches the paged exposures state. fn check_paged_exposures() -> Result<(), TryRuntimeError> { use sp_staking::PagedExposureMetadata; use sp_std::collections::btree_map::BTreeMap; @@ -1967,6 +2087,8 @@ impl Pallet { .collect::>() } + /// Invariants: + /// * Checks that each nominator has its entire stake correctly distributed. fn check_nominators() -> Result<(), TryRuntimeError> { // a check per nominator to ensure their entire stake is correctly distributed. Will only // kick-in if the nomination was submitted before the current era. diff --git a/substrate/frame/staking/src/pallet/mod.rs b/substrate/frame/staking/src/pallet/mod.rs index 0689418d02bd9c4863f5d5db2e2b8c546d8642cf..2e5b3aa7b873e2c123b3176a4e80d6e0cd1b6177 100644 --- a/substrate/frame/staking/src/pallet/mod.rs +++ b/substrate/frame/staking/src/pallet/mod.rs @@ -25,7 +25,7 @@ use frame_support::{ pallet_prelude::*, traits::{ Currency, Defensive, DefensiveSaturating, EnsureOrigin, EstimateNextNewSession, Get, - LockableCurrency, OnUnbalanced, UnixTime, + InspectLockableCurrency, LockableCurrency, OnUnbalanced, UnixTime, WithdrawReasons, }, weights::Weight, BoundedVec, @@ -48,13 +48,13 @@ pub use impls::*; use crate::{ slashing, weights::WeightInfo, AccountIdLookupOf, ActiveEraInfo, BalanceOf, EraPayout, - EraRewardPoints, Exposure, ExposurePage, Forcing, MaxNominationsOf, NegativeImbalanceOf, - Nominations, NominationsQuota, PositiveImbalanceOf, RewardDestination, SessionInterface, - StakingLedger, UnappliedSlash, UnlockChunk, ValidatorPrefs, + EraRewardPoints, Exposure, ExposurePage, Forcing, LedgerIntegrityState, MaxNominationsOf, + NegativeImbalanceOf, Nominations, NominationsQuota, PositiveImbalanceOf, RewardDestination, + SessionInterface, StakingLedger, UnappliedSlash, UnlockChunk, ValidatorPrefs, }; // The speculative number of spans are used as an input of the weight annotation of -// [`Call::unbond`], as the post dipatch weight may depend on the number of slashing span on the +// [`Call::unbond`], as the post dispatch weight may depend on the number of slashing span on the // account which is not provided as an input. The value set should be conservative but sensible. pub(crate) const SPECULATIVE_NUM_SPANS: u32 = 32; @@ -66,7 +66,7 @@ pub mod pallet { use super::*; - /// The current storage version. + /// The in-code storage version. const STORAGE_VERSION: StorageVersion = StorageVersion::new(14); #[pallet::pallet] @@ -88,10 +88,10 @@ pub mod pallet { pub trait Config: frame_system::Config { /// The staking balance. type Currency: LockableCurrency< - Self::AccountId, - Moment = BlockNumberFor, - Balance = Self::CurrencyBalance, - >; + Self::AccountId, + Moment = BlockNumberFor, + Balance = Self::CurrencyBalance, + > + InspectLockableCurrency; /// Just the `Currency::Balance` type; we have this item to allow us to constrain it to /// `From`. type CurrencyBalance: sp_runtime::traits::AtLeast32BitUnsigned @@ -275,7 +275,7 @@ pub mod pallet { /// Something that listens to staking updates and performs actions based on the data it /// receives. /// - /// WARNING: this only reports slashing events for the time being. + /// WARNING: this only reports slashing and withdraw events for the time being. type EventListeners: sp_staking::OnStakingUpdate>; /// Some parameters of the benchmarking. @@ -564,6 +564,12 @@ pub mod pallet { #[pallet::getter(fn force_era)] pub type ForceEra = StorageValue<_, Forcing, ValueQuery>; + /// Maximum staked rewards, i.e. the percentage of the era inflation that + /// is used for stake rewards. + /// See [Era payout](./index.html#era-payout). + #[pallet::storage] + pub type MaxStakedRewards = StorageValue<_, Percent, OptionQuery>; + /// The percentage of the slash that is distributed to reporters. /// /// The rest of the slashed value is handled by the `Slash`. @@ -785,9 +791,12 @@ pub mod pallet { SnapshotTargetsSizeExceeded { size: u32 }, /// A new force era mode was set. ForceEra { mode: Forcing }, + /// Report of a controller batch deprecation. + ControllerBatchDeprecated { failures: u32 }, } #[pallet::error] + #[derive(PartialEq)] pub enum Error { /// Not a controller account. NotController, @@ -847,6 +856,8 @@ pub mod pallet { BoundNotMet, /// Used when attempting to use deprecated controller account logic. ControllerDeprecated, + /// Cannot reset a ledger. + CannotRestoreLedger, } #[pallet::hooks] @@ -929,6 +940,11 @@ pub mod pallet { return Err(Error::::AlreadyBonded.into()) } + // An existing controller cannot become a stash. + if StakingLedger::::is_bonded(StakingAccount::Controller(stash.clone())) { + return Err(Error::::AlreadyPaired.into()) + } + // Reject a bond which is considered to be _dust_. if value < T::Currency::minimum_balance() { return Err(Error::::InsufficientBond.into()) @@ -969,7 +985,6 @@ pub mod pallet { #[pallet::compact] max_additional: BalanceOf, ) -> DispatchResult { let stash = ensure_signed(origin)?; - let mut ledger = Self::ledger(StakingAccount::Stash(stash.clone()))?; let stash_balance = T::Currency::free_balance(&stash); @@ -1122,7 +1137,7 @@ pub mod pallet { /// this call results in a complete removal of all the data related to the stash account. /// In this case, the `num_slashing_spans` must be larger or equal to the number of /// slashing spans associated with the stash account in the [`SlashingSpans`] storage type, - /// otherwise the call will fail. The call weight is directly propotional to + /// otherwise the call will fail. The call weight is directly proportional to /// `num_slashing_spans`. /// /// ## Complexity @@ -1326,8 +1341,6 @@ pub mod pallet { pub fn set_controller(origin: OriginFor) -> DispatchResult { let stash = ensure_signed(origin)?; - // The bonded map and ledger are mutated directly as this extrinsic is related to a - // (temporary) passive migration. Self::ledger(StakingAccount::Stash(stash.clone())).map(|ledger| { let controller = ledger.controller() .defensive_proof("Ledger's controller field didn't exist. The controller should have been fetched using StakingLedger.") @@ -1337,9 +1350,8 @@ pub mod pallet { // Stash is already its own controller. return Err(Error::::AlreadyPaired.into()) } - >::remove(controller); - >::insert(&stash, &stash); - >::insert(&stash, ledger); + + let _ = ledger.set_controller_to_stash()?; Ok(()) })? } @@ -1367,7 +1379,7 @@ pub mod pallet { Ok(()) } - /// Increments the ideal number of validators upto maximum of + /// Increments the ideal number of validators up to maximum of /// `ElectionProviderBase::MaxWinners`. /// /// The dispatch origin must be Root. @@ -1392,7 +1404,7 @@ pub mod pallet { Ok(()) } - /// Scale up the ideal number of validators by a factor upto maximum of + /// Scale up the ideal number of validators by a factor up to maximum of /// `ElectionProviderBase::MaxWinners`. /// /// The dispatch origin must be Root. @@ -1717,6 +1729,7 @@ pub mod pallet { max_validator_count: ConfigOp, chill_threshold: ConfigOp, min_commission: ConfigOp, + max_staked_rewards: ConfigOp, ) -> DispatchResult { ensure_root(origin)?; @@ -1736,6 +1749,7 @@ pub mod pallet { config_op_exp!(MaxValidatorsCount, max_validator_count); config_op_exp!(ChillThreshold, chill_threshold); config_op_exp!(MinCommission, min_commission); + config_op_exp!(MaxStakedRewards, max_staked_rewards); Ok(()) } /// Declare a `controller` to stop participating as either a validator or nominator. @@ -1952,7 +1966,7 @@ pub mod pallet { }; if ledger.stash != *controller && !payee_deprecated { - Some((controller.clone(), ledger)) + Some(ledger) } else { None } @@ -1961,15 +1975,116 @@ pub mod pallet { .collect(); // Update unique pairs. - for (controller, ledger) in filtered_batch_with_ledger { - let stash = ledger.stash.clone(); - - >::insert(&stash, &stash); - >::remove(controller); - >::insert(stash, ledger); + let mut failures = 0; + for ledger in filtered_batch_with_ledger { + let _ = ledger.clone().set_controller_to_stash().map_err(|_| failures += 1); } + Self::deposit_event(Event::::ControllerBatchDeprecated { failures }); + Ok(Some(T::WeightInfo::deprecate_controller_batch(controllers.len() as u32)).into()) } + + /// Restores the state of a ledger which is in an inconsistent state. + /// + /// The requirements to restore a ledger are the following: + /// * The stash is bonded; or + /// * The stash is not bonded but it has a staking lock left behind; or + /// * If the stash has an associated ledger and its state is inconsistent; or + /// * If the ledger is not corrupted *but* its staking lock is out of sync. + /// + /// The `maybe_*` input parameters will overwrite the corresponding data and metadata of the + /// ledger associated with the stash. If the input parameters are not set, the ledger will + /// be reset values from on-chain state. + #[pallet::call_index(29)] + #[pallet::weight(T::WeightInfo::restore_ledger())] + pub fn restore_ledger( + origin: OriginFor, + stash: T::AccountId, + maybe_controller: Option, + maybe_total: Option>, + maybe_unlocking: Option>, T::MaxUnlockingChunks>>, + ) -> DispatchResult { + T::AdminOrigin::ensure_origin(origin)?; + + let current_lock = T::Currency::balance_locked(crate::STAKING_ID, &stash); + let stash_balance = T::Currency::free_balance(&stash); + + let (new_controller, new_total) = match Self::inspect_bond_state(&stash) { + Ok(LedgerIntegrityState::Corrupted) => { + let new_controller = maybe_controller.unwrap_or(stash.clone()); + + let new_total = if let Some(total) = maybe_total { + let new_total = total.min(stash_balance); + // enforce lock == ledger.amount. + T::Currency::set_lock( + crate::STAKING_ID, + &stash, + new_total, + WithdrawReasons::all(), + ); + new_total + } else { + current_lock + }; + + Ok((new_controller, new_total)) + }, + Ok(LedgerIntegrityState::CorruptedKilled) => { + if current_lock == Zero::zero() { + // this case needs to restore both lock and ledger, so the new total needs + // to be given by the called since there's no way to restore the total + // on-chain. + ensure!(maybe_total.is_some(), Error::::CannotRestoreLedger); + Ok(( + stash.clone(), + maybe_total.expect("total exists as per the check above; qed."), + )) + } else { + Ok((stash.clone(), current_lock)) + } + }, + Ok(LedgerIntegrityState::LockCorrupted) => { + // ledger is not corrupted but its locks are out of sync. In this case, we need + // to enforce a new ledger.total and staking lock for this stash. + let new_total = + maybe_total.ok_or(Error::::CannotRestoreLedger)?.min(stash_balance); + T::Currency::set_lock( + crate::STAKING_ID, + &stash, + new_total, + WithdrawReasons::all(), + ); + + Ok((stash.clone(), new_total)) + }, + Err(Error::::BadState) => { + // the stash and ledger do not exist but lock is lingering. + T::Currency::remove_lock(crate::STAKING_ID, &stash); + ensure!( + Self::inspect_bond_state(&stash) == Err(Error::::NotStash), + Error::::BadState + ); + + return Ok(()); + }, + Ok(LedgerIntegrityState::Ok) | Err(_) => Err(Error::::CannotRestoreLedger), + }?; + + // re-bond stash and controller tuple. + Bonded::::insert(&stash, &new_controller); + + // resoter ledger state. + let mut ledger = StakingLedger::::new(stash.clone(), new_total); + ledger.controller = Some(new_controller); + ledger.unlocking = maybe_unlocking.unwrap_or_default(); + ledger.update()?; + + ensure!( + Self::inspect_bond_state(&stash) == Ok(LedgerIntegrityState::Ok), + Error::::BadState + ); + Ok(()) + } } } diff --git a/substrate/frame/staking/src/tests.rs b/substrate/frame/staking/src/tests.rs index 85ee7dd3bf59d9d96243f22b0463b465b4754fa7..a5c9abe2f176233f1f66e9872fde0a6bde99bbcb 100644 --- a/substrate/frame/staking/src/tests.rs +++ b/substrate/frame/staking/src/tests.rs @@ -55,6 +55,7 @@ fn set_staking_configs_works() { ConfigOp::Set(10), ConfigOp::Set(20), ConfigOp::Set(Percent::from_percent(75)), + ConfigOp::Set(Zero::zero()), ConfigOp::Set(Zero::zero()) )); assert_eq!(MinNominatorBond::::get(), 1_500); @@ -63,6 +64,7 @@ fn set_staking_configs_works() { assert_eq!(MaxValidatorsCount::::get(), Some(20)); assert_eq!(ChillThreshold::::get(), Some(Percent::from_percent(75))); assert_eq!(MinCommission::::get(), Perbill::from_percent(0)); + assert_eq!(MaxStakedRewards::::get(), Some(Percent::from_percent(0))); // noop does nothing assert_storage_noop!(assert_ok!(Staking::set_staking_configs( @@ -72,6 +74,7 @@ fn set_staking_configs_works() { ConfigOp::Noop, ConfigOp::Noop, ConfigOp::Noop, + ConfigOp::Noop, ConfigOp::Noop ))); @@ -83,6 +86,7 @@ fn set_staking_configs_works() { ConfigOp::Remove, ConfigOp::Remove, ConfigOp::Remove, + ConfigOp::Remove, ConfigOp::Remove )); assert_eq!(MinNominatorBond::::get(), 0); @@ -91,6 +95,7 @@ fn set_staking_configs_works() { assert_eq!(MaxValidatorsCount::::get(), None); assert_eq!(ChillThreshold::::get(), None); assert_eq!(MinCommission::::get(), Perbill::from_percent(0)); + assert_eq!(MaxStakedRewards::::get(), None); }); } @@ -265,7 +270,7 @@ fn change_controller_works() { assert_eq!(ledger.controller(), Some(stash)); // the raw storage ledger's controller is always `None`. however, we can still fetch the - // correct controller with `ledger.controler()`. + // correct controller with `ledger.controller()`. let raw_ledger = >::get(&stash).unwrap(); assert_eq!(raw_ledger.controller, None); @@ -1243,6 +1248,23 @@ fn bond_extra_works() { }); } +#[test] +fn bond_extra_controller_bad_state_works() { + ExtBuilder::default().try_state(false).build_and_execute(|| { + assert_eq!(StakingLedger::::get(StakingAccount::Stash(31)).unwrap().stash, 31); + + // simulate ledger in bad state: the controller 41 is associated to the stash 31 and 41. + Bonded::::insert(31, 41); + + // we confirm that the ledger is in bad state: 31 has 41 as controller and when fetching + // the ledger associated with the controller 41, its stash is 41 (and not 31). + assert_eq!(Ledger::::get(41).unwrap().stash, 41); + + // if the ledger is in this bad state, the `bond_extra` should fail. + assert_noop!(Staking::bond_extra(RuntimeOrigin::signed(31), 10), Error::::BadState); + }) +} + #[test] fn bond_extra_and_withdraw_unbonded_works() { // @@ -1739,6 +1761,74 @@ fn rebond_emits_right_value_in_event() { }); } +#[test] +fn max_staked_rewards_default_works() { + ExtBuilder::default().build_and_execute(|| { + assert_eq!(>::get(), None); + + let default_stakers_payout = current_total_payout_for_duration(reward_time_per_era()); + assert!(default_stakers_payout > 0); + start_active_era(1); + + // the final stakers reward is the same as the reward before applied the cap. + assert_eq!(ErasValidatorReward::::get(0).unwrap(), default_stakers_payout); + + // which is the same behaviour if the `MaxStakedRewards` is set to 100%. + >::set(Some(Percent::from_parts(100))); + + let default_stakers_payout = current_total_payout_for_duration(reward_time_per_era()); + assert_eq!(ErasValidatorReward::::get(0).unwrap(), default_stakers_payout); + }) +} + +#[test] +fn max_staked_rewards_works() { + ExtBuilder::default().nominate(true).build_and_execute(|| { + let max_staked_rewards = 10; + + // sets new max staked rewards through set_staking_configs. + assert_ok!(Staking::set_staking_configs( + RuntimeOrigin::root(), + ConfigOp::Noop, + ConfigOp::Noop, + ConfigOp::Noop, + ConfigOp::Noop, + ConfigOp::Noop, + ConfigOp::Noop, + ConfigOp::Set(Percent::from_percent(max_staked_rewards)), + )); + + assert_eq!(>::get(), Some(Percent::from_percent(10))); + + // check validators account state. + assert_eq!(Session::validators().len(), 2); + assert!(Session::validators().contains(&11) & Session::validators().contains(&21)); + // balance of the mock treasury account is 0 + assert_eq!(RewardRemainderUnbalanced::get(), 0); + + let max_stakers_payout = current_total_payout_for_duration(reward_time_per_era()); + + start_active_era(1); + + let treasury_payout = RewardRemainderUnbalanced::get(); + let validators_payout = ErasValidatorReward::::get(0).unwrap(); + let total_payout = treasury_payout + validators_payout; + + // max stakers payout (without max staked rewards cap applied) is larger than the final + // validator rewards. The final payment and remainder should be adjusted by redistributing + // the era inflation to apply the cap... + assert!(max_stakers_payout > validators_payout); + + // .. which means that the final validator payout is 10% of the total payout.. + assert_eq!(validators_payout, Percent::from_percent(max_staked_rewards) * total_payout); + // .. and the remainder 90% goes to the treasury. + assert_eq!( + treasury_payout, + Percent::from_percent(100 - max_staked_rewards) * (treasury_payout + validators_payout) + ); + }) +} + #[test] fn reward_to_stake_works() { ExtBuilder::default() @@ -4596,7 +4686,7 @@ fn bond_during_era_does_not_populate_legacy_claimed_rewards() { } ); - // make sure only era upto history depth is stored + // make sure only era up to history depth is stored let current_era = 99; mock::start_active_era(current_era); bond_validator(13, 1000); @@ -5322,7 +5412,7 @@ mod election_data_provider { Event::SnapshotVotersSizeExceeded { size: 75 } ); - // however, if the election voter size bounds were largers, the snapshot would + // however, if the election voter size bounds were larger, the snapshot would // include the electing voters of 70. let bounds = ElectionBoundsBuilder::default().voters_size(1_000.into()).build(); assert_eq!( @@ -5543,7 +5633,8 @@ fn chill_other_works() { ConfigOp::Remove, ConfigOp::Remove, ConfigOp::Remove, - ConfigOp::Remove + ConfigOp::Remove, + ConfigOp::Noop, )); // Still can't chill these users @@ -5564,7 +5655,8 @@ fn chill_other_works() { ConfigOp::Set(10), ConfigOp::Set(10), ConfigOp::Noop, - ConfigOp::Noop + ConfigOp::Noop, + ConfigOp::Noop, )); // Still can't chill these users @@ -5585,7 +5677,8 @@ fn chill_other_works() { ConfigOp::Remove, ConfigOp::Remove, ConfigOp::Noop, - ConfigOp::Noop + ConfigOp::Noop, + ConfigOp::Noop, )); // Still can't chill these users @@ -5606,7 +5699,8 @@ fn chill_other_works() { ConfigOp::Set(10), ConfigOp::Set(10), ConfigOp::Set(Percent::from_percent(75)), - ConfigOp::Noop + ConfigOp::Noop, + ConfigOp::Noop, )); // 16 people total because tests start with 2 active one @@ -5652,6 +5746,7 @@ fn capped_stakers_works() { ConfigOp::Set(max), ConfigOp::Remove, ConfigOp::Remove, + ConfigOp::Noop, )); // can create `max - validator_count` validators @@ -5722,6 +5817,7 @@ fn capped_stakers_works() { ConfigOp::Remove, ConfigOp::Noop, ConfigOp::Noop, + ConfigOp::Noop, )); assert_ok!(Staking::nominate(RuntimeOrigin::signed(last_nominator), vec![1])); assert_ok!(Staking::validate( @@ -5757,6 +5853,7 @@ fn min_commission_works() { ConfigOp::Remove, ConfigOp::Remove, ConfigOp::Set(Perbill::from_percent(10)), + ConfigOp::Noop, )); // can't make it less than 10 now @@ -6830,6 +6927,52 @@ mod ledger { }) } + #[test] + fn get_ledger_bad_state_fails() { + ExtBuilder::default().has_stakers(false).try_state(false).build_and_execute(|| { + setup_double_bonded_ledgers(); + + // Case 1: double bonded but not corrupted: + // stash 444 has controller 555: + assert_eq!(Bonded::::get(444), Some(555)); + assert_eq!(Ledger::::get(555).unwrap().stash, 444); + + // stash 444 is also a controller of 333: + assert_eq!(Bonded::::get(333), Some(444)); + assert_eq!( + StakingLedger::::paired_account(StakingAccount::Stash(333)), + Some(444) + ); + assert_eq!(Ledger::::get(444).unwrap().stash, 333); + + // although 444 is double bonded (it is a controller and a stash of different ledgers), + // we can safely retrieve the ledger and mutate it since the correct ledger is + // returned. + let ledger_result = StakingLedger::::get(StakingAccount::Stash(444)); + assert_eq!(ledger_result.unwrap().stash, 444); // correct ledger. + + let ledger_result = StakingLedger::::get(StakingAccount::Controller(444)); + assert_eq!(ledger_result.unwrap().stash, 333); // correct ledger. + + // fetching ledger 333 by its stash works. + let ledger_result = StakingLedger::::get(StakingAccount::Stash(333)); + assert_eq!(ledger_result.unwrap().stash, 333); + + // Case 2: corrupted ledger bonding. + // in this case, we simulate what happens when fetching a ledger by stash returns a + // ledger with a different stash. when this happens, we return an error instead of the + // ledger to prevent ledger mutations. + let mut ledger = Ledger::::get(444).unwrap(); + assert_eq!(ledger.stash, 333); + ledger.stash = 444; + Ledger::::insert(444, ledger); + + // now, we are prevented from fetching the ledger by stash from 1. It's associated + // controller (2) is now bonding a ledger with a different stash (2, not 1). + assert!(StakingLedger::::get(StakingAccount::Stash(333)).is_err()); + }) + } + #[test] fn bond_works() { ExtBuilder::default().build_and_execute(|| { @@ -6853,6 +6996,28 @@ mod ledger { }) } + #[test] + fn bond_controller_cannot_be_stash_works() { + ExtBuilder::default().build_and_execute(|| { + let (stash, controller) = testing_utils::create_unique_stash_controller::( + 0, + 10, + RewardDestination::Staked, + false, + ) + .unwrap(); + + assert_eq!(Bonded::::get(stash), Some(controller)); + assert_eq!(Ledger::::get(controller).map(|l| l.stash), Some(stash)); + + // existing controller should not be able become a stash. + assert_noop!( + Staking::bond(RuntimeOrigin::signed(controller), 10, RewardDestination::Staked), + Error::::AlreadyPaired, + ); + }) + } + #[test] fn is_bonded_works() { ExtBuilder::default().build_and_execute(|| { @@ -6907,7 +7072,7 @@ mod ledger { #[test] fn deprecate_controller_batch_works_full_weight() { - ExtBuilder::default().build_and_execute(|| { + ExtBuilder::default().try_state(false).build_and_execute(|| { // Given: let start = 1001; @@ -7081,4 +7246,464 @@ mod ledger { assert_eq!(ledger_updated.stash, stash); }) } + + #[test] + fn deprecate_controller_batch_with_bad_state_ok() { + ExtBuilder::default().has_stakers(false).nominate(false).build_and_execute(|| { + setup_double_bonded_ledgers(); + + // now let's deprecate all the controllers for all the existing ledgers. + let bounded_controllers: BoundedVec< + _, + ::MaxControllersInDeprecationBatch, + > = BoundedVec::try_from(vec![333, 444, 555, 777]).unwrap(); + + assert_ok!(Staking::deprecate_controller_batch( + RuntimeOrigin::root(), + bounded_controllers + )); + + assert_eq!( + *staking_events().last().unwrap(), + Event::ControllerBatchDeprecated { failures: 0 } + ); + }) + } + + #[test] + fn deprecate_controller_batch_with_bad_state_failures() { + ExtBuilder::default().has_stakers(false).try_state(false).build_and_execute(|| { + setup_double_bonded_ledgers(); + + // now let's deprecate all the controllers for all the existing ledgers. + let bounded_controllers: BoundedVec< + _, + ::MaxControllersInDeprecationBatch, + > = BoundedVec::try_from(vec![777, 555, 444, 333]).unwrap(); + + assert_ok!(Staking::deprecate_controller_batch( + RuntimeOrigin::root(), + bounded_controllers + )); + + assert_eq!( + *staking_events().last().unwrap(), + Event::ControllerBatchDeprecated { failures: 2 } + ); + }) + } + + #[test] + fn set_controller_with_bad_state_ok() { + ExtBuilder::default().has_stakers(false).nominate(false).build_and_execute(|| { + setup_double_bonded_ledgers(); + + // in this case, setting controller works due to the ordering of the calls. + assert_ok!(Staking::set_controller(RuntimeOrigin::signed(333))); + assert_ok!(Staking::set_controller(RuntimeOrigin::signed(444))); + assert_ok!(Staking::set_controller(RuntimeOrigin::signed(555))); + }) + } + + #[test] + fn set_controller_with_bad_state_fails() { + ExtBuilder::default().has_stakers(false).try_state(false).build_and_execute(|| { + setup_double_bonded_ledgers(); + + // setting the controller of ledger associated with stash 555 fails since its stash is a + // controller of another ledger. + assert_noop!( + Staking::set_controller(RuntimeOrigin::signed(555)), + Error::::BadState + ); + assert_noop!( + Staking::set_controller(RuntimeOrigin::signed(444)), + Error::::BadState + ); + assert_ok!(Staking::set_controller(RuntimeOrigin::signed(333))); + }) + } +} + +mod ledger_recovery { + use super::*; + use frame_support::traits::InspectLockableCurrency; + + #[test] + fn inspect_recovery_ledger_simple_works() { + ExtBuilder::default().has_stakers(true).try_state(false).build_and_execute(|| { + setup_double_bonded_ledgers(); + + // non corrupted ledger. + assert_eq!(Staking::inspect_bond_state(&11).unwrap(), LedgerIntegrityState::Ok); + + // non bonded stash. + assert!(Bonded::::get(&1111).is_none()); + assert!(Staking::inspect_bond_state(&1111).is_err()); + + // double bonded but not corrupted. + assert_eq!(Staking::inspect_bond_state(&333).unwrap(), LedgerIntegrityState::Ok); + }) + } + + #[test] + fn inspect_recovery_ledger_corupted_killed_works() { + ExtBuilder::default().has_stakers(true).try_state(false).build_and_execute(|| { + setup_double_bonded_ledgers(); + + let lock_333_before = Balances::balance_locked(crate::STAKING_ID, &333); + + // get into corrupted and killed ledger state by killing a corrupted ledger: + // init state: + // (333, 444) + // (444, 555) + // set_controller(444) to 444 + // (333, 444) -> corrupted + // (444, 444) + // kill(333) + // (444, 444) -> corrupted and None. + assert_eq!(Staking::inspect_bond_state(&333).unwrap(), LedgerIntegrityState::Ok); + set_controller_no_checks(&444); + + // now try-state fails. + assert!(Staking::do_try_state(System::block_number()).is_err()); + + // 333 is corrupted since it's controller is linking 444 ledger. + assert_eq!(Staking::inspect_bond_state(&333).unwrap(), LedgerIntegrityState::Corrupted); + // 444 however is OK. + assert_eq!(Staking::inspect_bond_state(&444).unwrap(), LedgerIntegrityState::Ok); + + // kill the corrupted ledger that is associated with stash 333. + assert_ok!(StakingLedger::::kill(&333)); + + // 333 bond is no more but it returns `BadState` because the lock on this stash is + // still set (see checks below). + assert_eq!(Staking::inspect_bond_state(&333), Err(Error::::BadState)); + // now the *other* ledger associated with 444 has been corrupted and killed (None). + assert_eq!( + Staking::inspect_bond_state(&444), + Ok(LedgerIntegrityState::CorruptedKilled) + ); + + // side effects on 333 - ledger, bonded, payee, lock should be completely empty. + // however, 333 lock remains. + assert_eq!(Balances::balance_locked(crate::STAKING_ID, &333), lock_333_before); // NOK + assert!(Bonded::::get(&333).is_none()); // OK + assert!(Payee::::get(&333).is_none()); // OK + assert!(Ledger::::get(&444).is_none()); // OK + + // side effects on 444 - ledger, bonded, payee, lock should remain be intact. + // however, 444 lock was removed. + assert_eq!(Balances::balance_locked(crate::STAKING_ID, &444), 0); // NOK + assert!(Bonded::::get(&444).is_some()); // OK + assert!(Payee::::get(&444).is_some()); // OK + assert!(Ledger::::get(&555).is_none()); // NOK + + assert!(Staking::do_try_state(System::block_number()).is_err()); + }) + } + + #[test] + fn inspect_recovery_ledger_corupted_killed_other_works() { + ExtBuilder::default().has_stakers(true).try_state(false).build_and_execute(|| { + setup_double_bonded_ledgers(); + + let lock_333_before = Balances::balance_locked(crate::STAKING_ID, &333); + + // get into corrupted and killed ledger state by killing a corrupted ledger: + // init state: + // (333, 444) + // (444, 555) + // set_controller(444) to 444 + // (333, 444) -> corrupted + // (444, 444) + // kill(444) + // (333, 444) -> corrupted and None + assert_eq!(Staking::inspect_bond_state(&333).unwrap(), LedgerIntegrityState::Ok); + set_controller_no_checks(&444); + + // now try-state fails. + assert!(Staking::do_try_state(System::block_number()).is_err()); + + // 333 is corrupted since it's controller is linking 444 ledger. + assert_eq!(Staking::inspect_bond_state(&333).unwrap(), LedgerIntegrityState::Corrupted); + // 444 however is OK. + assert_eq!(Staking::inspect_bond_state(&444).unwrap(), LedgerIntegrityState::Ok); + + // kill the *other* ledger that is double bonded but not corrupted. + assert_ok!(StakingLedger::::kill(&444)); + + // now 333 is corrupted and None through the *other* ledger being killed. + assert_eq!( + Staking::inspect_bond_state(&333).unwrap(), + LedgerIntegrityState::CorruptedKilled, + ); + // 444 is cleaned and not a stash anymore; no lock left behind. + assert_eq!(Ledger::::get(&444), None); + assert_eq!(Staking::inspect_bond_state(&444), Err(Error::::NotStash)); + + // side effects on 333 - ledger, bonded, payee, lock should be intact. + assert_eq!(Balances::balance_locked(crate::STAKING_ID, &333), lock_333_before); // OK + assert_eq!(Bonded::::get(&333), Some(444)); // OK + assert!(Payee::::get(&333).is_some()); // OK + // however, ledger associated with its controller was killed. + assert!(Ledger::::get(&444).is_none()); // NOK + + // side effects on 444 - ledger, bonded, payee, lock should be completely removed. + assert_eq!(Balances::balance_locked(crate::STAKING_ID, &444), 0); // OK + assert!(Bonded::::get(&444).is_none()); // OK + assert!(Payee::::get(&444).is_none()); // OK + assert!(Ledger::::get(&555).is_none()); // OK + + assert!(Staking::do_try_state(System::block_number()).is_err()); + }) + } + + #[test] + fn inspect_recovery_ledger_lock_corrupted_works() { + ExtBuilder::default().has_stakers(true).try_state(false).build_and_execute(|| { + setup_double_bonded_ledgers(); + + // get into lock corrupted ledger state by bond_extra on a ledger that is double bonded + // with a corrupted ledger. + // init state: + // (333, 444) + // (444, 555) + // set_controller(444) to 444 + // (333, 444) -> corrupted + // (444, 444) + // bond_extra(333, 10) -> lock corrupted on 444 + assert_eq!(Staking::inspect_bond_state(&333).unwrap(), LedgerIntegrityState::Ok); + set_controller_no_checks(&444); + bond_extra_no_checks(&333, 10); + + // now try-state fails. + assert!(Staking::do_try_state(System::block_number()).is_err()); + + // 333 is corrupted since it's controller is linking 444 ledger. + assert_eq!(Staking::inspect_bond_state(&333).unwrap(), LedgerIntegrityState::Corrupted); + // 444 ledger is not corrupted but locks got out of sync. + assert_eq!( + Staking::inspect_bond_state(&444).unwrap(), + LedgerIntegrityState::LockCorrupted + ); + }) + } + + // Corrupted ledger restore. + // + // * Double bonded and corrupted ledger. + #[test] + fn restore_ledger_corrupted_works() { + ExtBuilder::default().has_stakers(true).build_and_execute(|| { + setup_double_bonded_ledgers(); + + // get into corrupted and killed ledger state. + // init state: + // (333, 444) + // (444, 555) + // set_controller(444) to 444 + // (333, 444) -> corrupted + // (444, 444) + assert_eq!(Staking::inspect_bond_state(&333).unwrap(), LedgerIntegrityState::Ok); + set_controller_no_checks(&444); + + assert_eq!(Staking::inspect_bond_state(&333).unwrap(), LedgerIntegrityState::Corrupted); + + // now try-state fails. + assert!(Staking::do_try_state(System::block_number()).is_err()); + + // recover the ledger bonded by 333 stash. + assert_ok!(Staking::restore_ledger(RuntimeOrigin::root(), 333, None, None, None)); + + // try-state checks are ok now. + assert_ok!(Staking::do_try_state(System::block_number())); + }) + } + + // Corrupted and killed ledger restore. + // + // * Double bonded and corrupted ledger. + // * Ledger killed by own controller. + #[test] + fn restore_ledger_corrupted_killed_works() { + ExtBuilder::default().has_stakers(true).build_and_execute(|| { + setup_double_bonded_ledgers(); + + // ledger.total == lock + let total_444_before_corruption = Balances::balance_locked(crate::STAKING_ID, &444); + + // get into corrupted and killed ledger state by killing a corrupted ledger: + // init state: + // (333, 444) + // (444, 555) + // set_controller(444) to 444 + // (333, 444) -> corrupted + // (444, 444) + // kill(333) + // (444, 444) -> corrupted and None. + assert_eq!(Staking::inspect_bond_state(&333).unwrap(), LedgerIntegrityState::Ok); + set_controller_no_checks(&444); + + // kill the corrupted ledger that is associated with stash 333. + assert_ok!(StakingLedger::::kill(&333)); + + // 333 bond is no more but it returns `BadState` because the lock on this stash is + // still set (see checks below). + assert_eq!(Staking::inspect_bond_state(&333), Err(Error::::BadState)); + // now the *other* ledger associated with 444 has been corrupted and killed (None). + assert!(Staking::ledger(StakingAccount::Stash(444)).is_err()); + + // try-state should fail. + assert!(Staking::do_try_state(System::block_number()).is_err()); + + // recover the ledger bonded by 333 stash. + assert_ok!(Staking::restore_ledger(RuntimeOrigin::root(), 333, None, None, None)); + + // for the try-state checks to pass, we also need to recover the stash 444 which is + // corrupted too by proxy of kill(333). Currently, both the lock and the ledger of 444 + // have been cleared so we need to provide the new amount to restore the ledger. + assert_noop!( + Staking::restore_ledger(RuntimeOrigin::root(), 444, None, None, None), + Error::::CannotRestoreLedger + ); + + assert_ok!(Staking::restore_ledger( + RuntimeOrigin::root(), + 444, + None, + Some(total_444_before_corruption), + None, + )); + + // try-state checks are ok now. + assert_ok!(Staking::do_try_state(System::block_number())); + }) + } + + // Corrupted and killed by *other* ledger restore. + // + // * Double bonded and corrupted ledger. + // * Ledger killed by own controller. + #[test] + fn restore_ledger_corrupted_killed_other_works() { + ExtBuilder::default().has_stakers(true).build_and_execute(|| { + setup_double_bonded_ledgers(); + + // get into corrupted and killed ledger state by killing a corrupted ledger: + // init state: + // (333, 444) + // (444, 555) + // set_controller(444) to 444 + // (333, 444) -> corrupted + // (444, 444) + // kill(444) + // (333, 444) -> corrupted and None + assert_eq!(Staking::inspect_bond_state(&333).unwrap(), LedgerIntegrityState::Ok); + set_controller_no_checks(&444); + + // now try-state fails. + assert!(Staking::do_try_state(System::block_number()).is_err()); + + // 333 is corrupted since it's controller is linking 444 ledger. + assert_eq!(Staking::inspect_bond_state(&333).unwrap(), LedgerIntegrityState::Corrupted); + // 444 however is OK. + assert_eq!(Staking::inspect_bond_state(&444).unwrap(), LedgerIntegrityState::Ok); + + // kill the *other* ledger that is double bonded but not corrupted. + assert_ok!(StakingLedger::::kill(&444)); + + // recover the ledger bonded by 333 stash. + assert_ok!(Staking::restore_ledger(RuntimeOrigin::root(), 333, None, None, None)); + + // 444 does not need recover in this case since it's been killed successfully. + assert_eq!(Staking::inspect_bond_state(&444), Err(Error::::NotStash)); + + // try-state checks are ok now. + assert_ok!(Staking::do_try_state(System::block_number())); + }) + } + + // Corrupted with bond_extra. + // + // * Double bonded and corrupted ledger. + // * Corrupted ledger calls `bond_extra` + #[test] + fn restore_ledger_corrupted_bond_extra_works() { + ExtBuilder::default().has_stakers(true).build_and_execute(|| { + setup_double_bonded_ledgers(); + + let lock_333_before = Balances::balance_locked(crate::STAKING_ID, &333); + let lock_444_before = Balances::balance_locked(crate::STAKING_ID, &444); + + // get into corrupted and killed ledger state by killing a corrupted ledger: + // init state: + // (333, 444) + // (444, 555) + // set_controller(444) to 444 + // (333, 444) -> corrupted + // (444, 444) + // bond_extra(444, 40) -> OK + // bond_extra(333, 30) -> locks out of sync + + assert_eq!(Staking::inspect_bond_state(&333).unwrap(), LedgerIntegrityState::Ok); + set_controller_no_checks(&444); + + // now try-state fails. + assert!(Staking::do_try_state(System::block_number()).is_err()); + + // if 444 bonds extra, the locks remain in sync. + bond_extra_no_checks(&444, 40); + assert_eq!(Balances::balance_locked(crate::STAKING_ID, &333), lock_333_before); + assert_eq!(Balances::balance_locked(crate::STAKING_ID, &444), lock_444_before + 40); + + // however if 333 bonds extra, the wrong lock is updated. + bond_extra_no_checks(&333, 30); + assert_eq!( + Balances::balance_locked(crate::STAKING_ID, &333), + lock_444_before + 40 + 30 + ); //not OK + assert_eq!(Balances::balance_locked(crate::STAKING_ID, &444), lock_444_before + 40); // OK + + // recover the ledger bonded by 333 stash. Note that the total/lock needs to be + // re-written since on-chain data lock has become out of sync. + assert_ok!(Staking::restore_ledger( + RuntimeOrigin::root(), + 333, + None, + Some(lock_333_before + 30), + None + )); + + // now recover 444 that although it's not corrupted, its lock and ledger.total are out + // of sync. in which case, we need to explicitly set the ledger's lock and amount, + // otherwise the ledger recover will fail. + assert_noop!( + Staking::restore_ledger(RuntimeOrigin::root(), 444, None, None, None), + Error::::CannotRestoreLedger + ); + + //and enforcing a new ledger lock/total on this non-corrupted ledger will work. + assert_ok!(Staking::restore_ledger( + RuntimeOrigin::root(), + 444, + None, + Some(lock_444_before + 40), + None + )); + + // double-check that ledgers got to expected state and bond_extra done during the + // corrupted state is part of the recovered ledgers. + let ledger_333 = Bonded::::get(&333).and_then(Ledger::::get).unwrap(); + let ledger_444 = Bonded::::get(&444).and_then(Ledger::::get).unwrap(); + + assert_eq!(ledger_333.total, lock_333_before + 30); + assert_eq!(Balances::balance_locked(crate::STAKING_ID, &333), ledger_333.total); + assert_eq!(ledger_444.total, lock_444_before + 40); + assert_eq!(Balances::balance_locked(crate::STAKING_ID, &444), ledger_444.total); + + // try-state checks are ok now. + assert_ok!(Staking::do_try_state(System::block_number())); + }) + } } diff --git a/substrate/frame/staking/src/weights.rs b/substrate/frame/staking/src/weights.rs index 7c9a050016406a5ae5b8f98bcd98b0093858628a..cd4e7f973ce3371a62331663865359408afb61a8 100644 --- a/substrate/frame/staking/src/weights.rs +++ b/substrate/frame/staking/src/weights.rs @@ -17,26 +17,28 @@ //! Autogenerated weights for `pallet_staking` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-12-10, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-04-09, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-itmxxexx-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! HOSTNAME: `runner-anb7yjbi-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: `1024` // Executed Command: -// target/production/substrate-node +// ./target/production/substrate-node // benchmark // pallet +// --chain=dev // --steps=50 // --repeat=20 +// --pallet=pallet_staking +// --no-storage-info +// --no-median-slopes +// --no-min-squares // --extrinsic=* // --wasm-execution=compiled // --heap-pages=4096 -// --json-file=/builds/parity/mirrors/polkadot-sdk/.git/.artifacts/bench.json -// --pallet=pallet_staking -// --chain=dev -// --header=./substrate/HEADER-APACHE2 // --output=./substrate/frame/staking/src/weights.rs +// --header=./substrate/HEADER-APACHE2 // --template=./substrate/.maintain/frame-weight-template.hbs #![cfg_attr(rustfmt, rustfmt_skip)] @@ -80,6 +82,7 @@ pub trait WeightInfo { fn chill_other() -> Weight; fn force_apply_min_commission() -> Weight; fn set_min_commission() -> Weight; + fn restore_ledger() -> Weight; } /// Weights for `pallet_staking` using the Substrate node and recommended hardware. @@ -87,21 +90,21 @@ pub struct SubstrateWeight(PhantomData); impl WeightInfo for SubstrateWeight { /// Storage: `Staking::Bonded` (r:1 w:1) /// Proof: `Staking::Bonded` (`max_values`: None, `max_size`: Some(72), added: 2547, mode: `MaxEncodedLen`) + /// Storage: `Staking::Ledger` (r:1 w:1) + /// Proof: `Staking::Ledger` (`max_values`: None, `max_size`: Some(1091), added: 3566, mode: `MaxEncodedLen`) /// Storage: `Balances::Locks` (r:1 w:1) /// Proof: `Balances::Locks` (`max_values`: None, `max_size`: Some(1299), added: 3774, mode: `MaxEncodedLen`) /// Storage: `Balances::Freezes` (r:1 w:0) /// Proof: `Balances::Freezes` (`max_values`: None, `max_size`: Some(67), added: 2542, mode: `MaxEncodedLen`) - /// Storage: `Staking::Ledger` (r:0 w:1) - /// Proof: `Staking::Ledger` (`max_values`: None, `max_size`: Some(1091), added: 3566, mode: `MaxEncodedLen`) /// Storage: `Staking::Payee` (r:0 w:1) /// Proof: `Staking::Payee` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) fn bond() -> Weight { // Proof Size summary in bytes: - // Measured: `927` + // Measured: `1042` // Estimated: `4764` - // Minimum execution time: 42_491_000 picoseconds. - Weight::from_parts(44_026_000, 4764) - .saturating_add(T::DbWeight::get().reads(3_u64)) + // Minimum execution time: 46_504_000 picoseconds. + Weight::from_parts(48_459_000, 4764) + .saturating_add(T::DbWeight::get().reads(4_u64)) .saturating_add(T::DbWeight::get().writes(4_u64)) } /// Storage: `Staking::Bonded` (r:1 w:0) @@ -120,21 +123,21 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `1990` // Estimated: `8877` - // Minimum execution time: 88_756_000 picoseconds. - Weight::from_parts(91_000_000, 8877) + // Minimum execution time: 90_475_000 picoseconds. + Weight::from_parts(93_619_000, 8877) .saturating_add(T::DbWeight::get().reads(9_u64)) .saturating_add(T::DbWeight::get().writes(7_u64)) } /// Storage: `Staking::Ledger` (r:1 w:1) /// Proof: `Staking::Ledger` (`max_values`: None, `max_size`: Some(1091), added: 3566, mode: `MaxEncodedLen`) + /// Storage: `Staking::Bonded` (r:1 w:0) + /// Proof: `Staking::Bonded` (`max_values`: None, `max_size`: Some(72), added: 2547, mode: `MaxEncodedLen`) /// Storage: `Staking::Nominators` (r:1 w:0) /// Proof: `Staking::Nominators` (`max_values`: None, `max_size`: Some(558), added: 3033, mode: `MaxEncodedLen`) /// Storage: `Staking::MinNominatorBond` (r:1 w:0) /// Proof: `Staking::MinNominatorBond` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) /// Storage: `Staking::CurrentEra` (r:1 w:0) /// Proof: `Staking::CurrentEra` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - /// Storage: `Staking::Bonded` (r:1 w:0) - /// Proof: `Staking::Bonded` (`max_values`: None, `max_size`: Some(72), added: 2547, mode: `MaxEncodedLen`) /// Storage: `Balances::Locks` (r:1 w:1) /// Proof: `Balances::Locks` (`max_values`: None, `max_size`: Some(1299), added: 3774, mode: `MaxEncodedLen`) /// Storage: `Balances::Freezes` (r:1 w:0) @@ -147,41 +150,43 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `2195` // Estimated: `8877` - // Minimum execution time: 91_331_000 picoseconds. - Weight::from_parts(94_781_000, 8877) + // Minimum execution time: 99_335_000 picoseconds. + Weight::from_parts(101_440_000, 8877) .saturating_add(T::DbWeight::get().reads(12_u64)) .saturating_add(T::DbWeight::get().writes(7_u64)) } /// Storage: `Staking::Ledger` (r:1 w:1) /// Proof: `Staking::Ledger` (`max_values`: None, `max_size`: Some(1091), added: 3566, mode: `MaxEncodedLen`) - /// Storage: `Staking::CurrentEra` (r:1 w:0) - /// Proof: `Staking::CurrentEra` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) /// Storage: `Staking::Bonded` (r:1 w:0) /// Proof: `Staking::Bonded` (`max_values`: None, `max_size`: Some(72), added: 2547, mode: `MaxEncodedLen`) + /// Storage: `Staking::CurrentEra` (r:1 w:0) + /// Proof: `Staking::CurrentEra` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) /// Storage: `Balances::Locks` (r:1 w:1) /// Proof: `Balances::Locks` (`max_values`: None, `max_size`: Some(1299), added: 3774, mode: `MaxEncodedLen`) /// Storage: `Balances::Freezes` (r:1 w:0) /// Proof: `Balances::Freezes` (`max_values`: None, `max_size`: Some(67), added: 2542, mode: `MaxEncodedLen`) + /// Storage: `NominationPools::ReversePoolIdLookup` (r:1 w:0) + /// Proof: `NominationPools::ReversePoolIdLookup` (`max_values`: None, `max_size`: Some(44), added: 2519, mode: `MaxEncodedLen`) /// The range of component `s` is `[0, 100]`. fn withdraw_unbonded_update(s: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `1115` + // Measured: `1297` // Estimated: `4764` - // Minimum execution time: 42_495_000 picoseconds. - Weight::from_parts(44_189_470, 4764) - // Standard Error: 1_389 - .saturating_add(Weight::from_parts(47_484, 0).saturating_mul(s.into())) - .saturating_add(T::DbWeight::get().reads(5_u64)) + // Minimum execution time: 50_067_000 picoseconds. + Weight::from_parts(52_396_327, 4764) + // Standard Error: 1_419 + .saturating_add(Weight::from_parts(51_406, 0).saturating_mul(s.into())) + .saturating_add(T::DbWeight::get().reads(6_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } /// Storage: `Staking::Ledger` (r:1 w:1) /// Proof: `Staking::Ledger` (`max_values`: None, `max_size`: Some(1091), added: 3566, mode: `MaxEncodedLen`) + /// Storage: `Staking::Bonded` (r:1 w:1) + /// Proof: `Staking::Bonded` (`max_values`: None, `max_size`: Some(72), added: 2547, mode: `MaxEncodedLen`) /// Storage: `Staking::CurrentEra` (r:1 w:0) /// Proof: `Staking::CurrentEra` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) /// Storage: `Staking::SlashingSpans` (r:1 w:1) /// Proof: `Staking::SlashingSpans` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `Staking::Bonded` (r:1 w:1) - /// Proof: `Staking::Bonded` (`max_values`: None, `max_size`: Some(72), added: 2547, mode: `MaxEncodedLen`) /// Storage: `Balances::Locks` (r:1 w:1) /// Proof: `Balances::Locks` (`max_values`: None, `max_size`: Some(1299), added: 3774, mode: `MaxEncodedLen`) /// Storage: `Balances::Freezes` (r:1 w:0) @@ -207,10 +212,10 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `2196 + s * (4 ±0)` // Estimated: `6248 + s * (4 ±0)` - // Minimum execution time: 89_004_000 picoseconds. - Weight::from_parts(96_677_570, 6248) - // Standard Error: 4_635 - .saturating_add(Weight::from_parts(1_387_718, 0).saturating_mul(s.into())) + // Minimum execution time: 92_931_000 picoseconds. + Weight::from_parts(101_398_156, 6248) + // Standard Error: 4_180 + .saturating_add(Weight::from_parts(1_377_850, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(13_u64)) .saturating_add(T::DbWeight::get().writes(11_u64)) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(s.into()))) @@ -218,6 +223,8 @@ impl WeightInfo for SubstrateWeight { } /// Storage: `Staking::Ledger` (r:1 w:0) /// Proof: `Staking::Ledger` (`max_values`: None, `max_size`: Some(1091), added: 3566, mode: `MaxEncodedLen`) + /// Storage: `Staking::Bonded` (r:1 w:0) + /// Proof: `Staking::Bonded` (`max_values`: None, `max_size`: Some(72), added: 2547, mode: `MaxEncodedLen`) /// Storage: `Staking::MinValidatorBond` (r:1 w:0) /// Proof: `Staking::MinValidatorBond` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) /// Storage: `Staking::MinCommission` (r:1 w:0) @@ -228,8 +235,6 @@ impl WeightInfo for SubstrateWeight { /// Proof: `Staking::MaxValidatorsCount` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) /// Storage: `Staking::Nominators` (r:1 w:0) /// Proof: `Staking::Nominators` (`max_values`: None, `max_size`: Some(558), added: 3033, mode: `MaxEncodedLen`) - /// Storage: `Staking::Bonded` (r:1 w:0) - /// Proof: `Staking::Bonded` (`max_values`: None, `max_size`: Some(72), added: 2547, mode: `MaxEncodedLen`) /// Storage: `VoterList::ListNodes` (r:1 w:1) /// Proof: `VoterList::ListNodes` (`max_values`: None, `max_size`: Some(154), added: 2629, mode: `MaxEncodedLen`) /// Storage: `VoterList::ListBags` (r:1 w:1) @@ -242,31 +247,35 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `1372` // Estimated: `4556` - // Minimum execution time: 51_532_000 picoseconds. - Weight::from_parts(53_308_000, 4556) + // Minimum execution time: 56_291_000 picoseconds. + Weight::from_parts(58_372_000, 4556) .saturating_add(T::DbWeight::get().reads(11_u64)) .saturating_add(T::DbWeight::get().writes(5_u64)) } /// Storage: `Staking::Ledger` (r:1 w:0) /// Proof: `Staking::Ledger` (`max_values`: None, `max_size`: Some(1091), added: 3566, mode: `MaxEncodedLen`) + /// Storage: `Staking::Bonded` (r:1 w:0) + /// Proof: `Staking::Bonded` (`max_values`: None, `max_size`: Some(72), added: 2547, mode: `MaxEncodedLen`) /// Storage: `Staking::Nominators` (r:128 w:128) /// Proof: `Staking::Nominators` (`max_values`: None, `max_size`: Some(558), added: 3033, mode: `MaxEncodedLen`) /// The range of component `k` is `[1, 128]`. fn kick(k: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `1280 + k * (569 ±0)` + // Measured: `1815 + k * (572 ±0)` // Estimated: `4556 + k * (3033 ±0)` - // Minimum execution time: 28_955_000 picoseconds. - Weight::from_parts(29_609_869, 4556) - // Standard Error: 6_793 - .saturating_add(Weight::from_parts(6_412_124, 0).saturating_mul(k.into())) - .saturating_add(T::DbWeight::get().reads(1_u64)) + // Minimum execution time: 36_218_000 picoseconds. + Weight::from_parts(38_811_308, 4556) + // Standard Error: 8_352 + .saturating_add(Weight::from_parts(6_527_398, 0).saturating_mul(k.into())) + .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(k.into()))) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(k.into()))) .saturating_add(Weight::from_parts(0, 3033).saturating_mul(k.into())) } /// Storage: `Staking::Ledger` (r:1 w:0) /// Proof: `Staking::Ledger` (`max_values`: None, `max_size`: Some(1091), added: 3566, mode: `MaxEncodedLen`) + /// Storage: `Staking::Bonded` (r:1 w:0) + /// Proof: `Staking::Bonded` (`max_values`: None, `max_size`: Some(72), added: 2547, mode: `MaxEncodedLen`) /// Storage: `Staking::MinNominatorBond` (r:1 w:0) /// Proof: `Staking::MinNominatorBond` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) /// Storage: `Staking::Nominators` (r:1 w:1) @@ -277,8 +286,6 @@ impl WeightInfo for SubstrateWeight { /// Proof: `Staking::Validators` (`max_values`: None, `max_size`: Some(45), added: 2520, mode: `MaxEncodedLen`) /// Storage: `Staking::CurrentEra` (r:1 w:0) /// Proof: `Staking::CurrentEra` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - /// Storage: `Staking::Bonded` (r:1 w:0) - /// Proof: `Staking::Bonded` (`max_values`: None, `max_size`: Some(72), added: 2547, mode: `MaxEncodedLen`) /// Storage: `VoterList::ListNodes` (r:2 w:2) /// Proof: `VoterList::ListNodes` (`max_values`: None, `max_size`: Some(154), added: 2629, mode: `MaxEncodedLen`) /// Storage: `VoterList::ListBags` (r:1 w:1) @@ -292,10 +299,10 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `1866 + n * (102 ±0)` // Estimated: `6248 + n * (2520 ±0)` - // Minimum execution time: 64_080_000 picoseconds. - Weight::from_parts(61_985_382, 6248) - // Standard Error: 13_320 - .saturating_add(Weight::from_parts(4_030_513, 0).saturating_mul(n.into())) + // Minimum execution time: 68_607_000 picoseconds. + Weight::from_parts(66_831_185, 6248) + // Standard Error: 14_014 + .saturating_add(Weight::from_parts(4_031_635, 0).saturating_mul(n.into())) .saturating_add(T::DbWeight::get().reads(12_u64)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(n.into()))) .saturating_add(T::DbWeight::get().writes(6_u64)) @@ -303,6 +310,8 @@ impl WeightInfo for SubstrateWeight { } /// Storage: `Staking::Ledger` (r:1 w:0) /// Proof: `Staking::Ledger` (`max_values`: None, `max_size`: Some(1091), added: 3566, mode: `MaxEncodedLen`) + /// Storage: `Staking::Bonded` (r:1 w:0) + /// Proof: `Staking::Bonded` (`max_values`: None, `max_size`: Some(72), added: 2547, mode: `MaxEncodedLen`) /// Storage: `Staking::Validators` (r:1 w:0) /// Proof: `Staking::Validators` (`max_values`: None, `max_size`: Some(45), added: 2520, mode: `MaxEncodedLen`) /// Storage: `Staking::Nominators` (r:1 w:1) @@ -317,11 +326,11 @@ impl WeightInfo for SubstrateWeight { /// Proof: `VoterList::CounterForListNodes` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) fn chill() -> Weight { // Proof Size summary in bytes: - // Measured: `1650` + // Measured: `1816` // Estimated: `6248` - // Minimum execution time: 54_194_000 picoseconds. - Weight::from_parts(55_578_000, 6248) - .saturating_add(T::DbWeight::get().reads(8_u64)) + // Minimum execution time: 60_088_000 picoseconds. + Weight::from_parts(62_471_000, 6248) + .saturating_add(T::DbWeight::get().reads(9_u64)) .saturating_add(T::DbWeight::get().writes(6_u64)) } /// Storage: `Staking::Ledger` (r:1 w:0) @@ -334,37 +343,37 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `902` // Estimated: `4556` - // Minimum execution time: 16_597_000 picoseconds. - Weight::from_parts(16_980_000, 4556) + // Minimum execution time: 19_777_000 picoseconds. + Weight::from_parts(20_690_000, 4556) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } /// Storage: `Staking::Ledger` (r:1 w:0) /// Proof: `Staking::Ledger` (`max_values`: None, `max_size`: Some(1091), added: 3566, mode: `MaxEncodedLen`) - /// Storage: `Staking::Payee` (r:1 w:1) - /// Proof: `Staking::Payee` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) /// Storage: `Staking::Bonded` (r:1 w:0) /// Proof: `Staking::Bonded` (`max_values`: None, `max_size`: Some(72), added: 2547, mode: `MaxEncodedLen`) + /// Storage: `Staking::Payee` (r:1 w:1) + /// Proof: `Staking::Payee` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) fn update_payee() -> Weight { // Proof Size summary in bytes: // Measured: `969` // Estimated: `4556` - // Minimum execution time: 20_626_000 picoseconds. - Weight::from_parts(21_242_000, 4556) + // Minimum execution time: 23_705_000 picoseconds. + Weight::from_parts(24_409_000, 4556) .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } /// Storage: `Staking::Bonded` (r:1 w:1) /// Proof: `Staking::Bonded` (`max_values`: None, `max_size`: Some(72), added: 2547, mode: `MaxEncodedLen`) - /// Storage: `Staking::Ledger` (r:1 w:2) + /// Storage: `Staking::Ledger` (r:2 w:2) /// Proof: `Staking::Ledger` (`max_values`: None, `max_size`: Some(1091), added: 3566, mode: `MaxEncodedLen`) fn set_controller() -> Weight { // Proof Size summary in bytes: // Measured: `902` - // Estimated: `4556` - // Minimum execution time: 19_972_000 picoseconds. - Weight::from_parts(20_470_000, 4556) - .saturating_add(T::DbWeight::get().reads(2_u64)) + // Estimated: `8122` + // Minimum execution time: 23_479_000 picoseconds. + Weight::from_parts(24_502_000, 8122) + .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(3_u64)) } /// Storage: `Staking::ValidatorCount` (r:0 w:1) @@ -373,8 +382,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_571_000 picoseconds. - Weight::from_parts(2_720_000, 0) + // Minimum execution time: 2_675_000 picoseconds. + Weight::from_parts(2_802_000, 0) .saturating_add(T::DbWeight::get().writes(1_u64)) } /// Storage: `Staking::ForceEra` (r:0 w:1) @@ -383,8 +392,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 8_056_000 picoseconds. - Weight::from_parts(8_413_000, 0) + // Minimum execution time: 7_067_000 picoseconds. + Weight::from_parts(7_413_000, 0) .saturating_add(T::DbWeight::get().writes(1_u64)) } /// Storage: `Staking::ForceEra` (r:0 w:1) @@ -393,8 +402,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 8_162_000 picoseconds. - Weight::from_parts(8_497_000, 0) + // Minimum execution time: 6_977_000 picoseconds. + Weight::from_parts(7_353_000, 0) .saturating_add(T::DbWeight::get().writes(1_u64)) } /// Storage: `Staking::ForceEra` (r:0 w:1) @@ -403,8 +412,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 8_320_000 picoseconds. - Weight::from_parts(8_564_000, 0) + // Minimum execution time: 7_071_000 picoseconds. + Weight::from_parts(7_463_000, 0) .saturating_add(T::DbWeight::get().writes(1_u64)) } /// Storage: `Staking::Invulnerables` (r:0 w:1) @@ -414,30 +423,30 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_470_000 picoseconds. - Weight::from_parts(3_110_242, 0) - // Standard Error: 63 - .saturating_add(Weight::from_parts(11_786, 0).saturating_mul(v.into())) + // Minimum execution time: 2_833_000 picoseconds. + Weight::from_parts(3_328_130, 0) + // Standard Error: 30 + .saturating_add(Weight::from_parts(10_058, 0).saturating_mul(v.into())) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: `Staking::Ledger` (r:5900 w:11800) + /// Storage: `Staking::Ledger` (r:11800 w:11800) /// Proof: `Staking::Ledger` (`max_values`: None, `max_size`: Some(1091), added: 3566, mode: `MaxEncodedLen`) + /// Storage: `Staking::Bonded` (r:5900 w:5900) + /// Proof: `Staking::Bonded` (`max_values`: None, `max_size`: Some(72), added: 2547, mode: `MaxEncodedLen`) /// Storage: `Staking::Payee` (r:5900 w:0) /// Proof: `Staking::Payee` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) - /// Storage: `Staking::Bonded` (r:0 w:5900) - /// Proof: `Staking::Bonded` (`max_values`: None, `max_size`: Some(72), added: 2547, mode: `MaxEncodedLen`) /// The range of component `i` is `[0, 5900]`. fn deprecate_controller_batch(i: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `1356 + i * (151 ±0)` - // Estimated: `990 + i * (3566 ±0)` - // Minimum execution time: 2_101_000 picoseconds. - Weight::from_parts(2_238_000, 990) - // Standard Error: 56_753 - .saturating_add(Weight::from_parts(18_404_902, 0).saturating_mul(i.into())) - .saturating_add(T::DbWeight::get().reads((2_u64).saturating_mul(i.into()))) + // Measured: `1746 + i * (229 ±0)` + // Estimated: `990 + i * (7132 ±0)` + // Minimum execution time: 5_300_000 picoseconds. + Weight::from_parts(5_437_000, 990) + // Standard Error: 66_261 + .saturating_add(Weight::from_parts(30_172_457, 0).saturating_mul(i.into())) + .saturating_add(T::DbWeight::get().reads((4_u64).saturating_mul(i.into()))) .saturating_add(T::DbWeight::get().writes((3_u64).saturating_mul(i.into()))) - .saturating_add(Weight::from_parts(0, 3566).saturating_mul(i.into())) + .saturating_add(Weight::from_parts(0, 7132).saturating_mul(i.into())) } /// Storage: `Staking::SlashingSpans` (r:1 w:1) /// Proof: `Staking::SlashingSpans` (`max_values`: None, `max_size`: None, mode: `Measured`) @@ -472,10 +481,10 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `2196 + s * (4 ±0)` // Estimated: `6248 + s * (4 ±0)` - // Minimum execution time: 86_765_000 picoseconds. - Weight::from_parts(95_173_565, 6248) - // Standard Error: 4_596 - .saturating_add(Weight::from_parts(1_354_849, 0).saturating_mul(s.into())) + // Minimum execution time: 87_677_000 picoseconds. + Weight::from_parts(96_386_462, 6248) + // Standard Error: 3_717 + .saturating_add(Weight::from_parts(1_370_585, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(13_u64)) .saturating_add(T::DbWeight::get().writes(12_u64)) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(s.into()))) @@ -488,10 +497,10 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `66672` // Estimated: `70137` - // Minimum execution time: 104_490_000 picoseconds. - Weight::from_parts(1_162_956_951, 70137) - // Standard Error: 76_760 - .saturating_add(Weight::from_parts(6_485_569, 0).saturating_mul(s.into())) + // Minimum execution time: 105_086_000 picoseconds. + Weight::from_parts(1_167_895_222, 70137) + // Standard Error: 77_022 + .saturating_add(Weight::from_parts(6_487_305, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -527,11 +536,11 @@ impl WeightInfo for SubstrateWeight { fn payout_stakers_alive_staked(n: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `33297 + n * (377 ±0)` - // Estimated: `30944 + n * (3774 ±0)` - // Minimum execution time: 144_790_000 picoseconds. - Weight::from_parts(36_764_791, 30944) - // Standard Error: 89_592 - .saturating_add(Weight::from_parts(49_620_105, 0).saturating_mul(n.into())) + // Estimated: `30944 + n * (3774 ±3)` + // Minimum execution time: 154_210_000 picoseconds. + Weight::from_parts(192_836_012, 30944) + // Standard Error: 40_441 + .saturating_add(Weight::from_parts(47_646_642, 0).saturating_mul(n.into())) .saturating_add(T::DbWeight::get().reads(14_u64)) .saturating_add(T::DbWeight::get().reads((6_u64).saturating_mul(n.into()))) .saturating_add(T::DbWeight::get().writes(4_u64)) @@ -555,10 +564,10 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `1991 + l * (7 ±0)` // Estimated: `8877` - // Minimum execution time: 81_768_000 picoseconds. - Weight::from_parts(85_332_982, 8877) - // Standard Error: 5_380 - .saturating_add(Weight::from_parts(70_298, 0).saturating_mul(l.into())) + // Minimum execution time: 88_337_000 picoseconds. + Weight::from_parts(91_391_254, 8877) + // Standard Error: 4_485 + .saturating_add(Weight::from_parts(103_443, 0).saturating_mul(l.into())) .saturating_add(T::DbWeight::get().reads(9_u64)) .saturating_add(T::DbWeight::get().writes(7_u64)) } @@ -593,10 +602,10 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `2196 + s * (4 ±0)` // Estimated: `6248 + s * (4 ±0)` - // Minimum execution time: 96_123_000 picoseconds. - Weight::from_parts(100_278_672, 6248) - // Standard Error: 3_487 - .saturating_add(Weight::from_parts(1_326_503, 0).saturating_mul(s.into())) + // Minimum execution time: 98_014_000 picoseconds. + Weight::from_parts(102_537_670, 6248) + // Standard Error: 3_324 + .saturating_add(Weight::from_parts(1_353_142, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(12_u64)) .saturating_add(T::DbWeight::get().writes(11_u64)) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(s.into()))) @@ -642,12 +651,12 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `0 + n * (720 ±0) + v * (3598 ±0)` // Estimated: `512390 + n * (3566 ±0) + v * (3566 ±0)` - // Minimum execution time: 572_893_000 picoseconds. - Weight::from_parts(578_010_000, 512390) - // Standard Error: 2_094_268 - .saturating_add(Weight::from_parts(68_419_710, 0).saturating_mul(v.into())) - // Standard Error: 208_682 - .saturating_add(Weight::from_parts(18_826_175, 0).saturating_mul(n.into())) + // Minimum execution time: 608_575_000 picoseconds. + Weight::from_parts(613_663_000, 512390) + // Standard Error: 2_286_521 + .saturating_add(Weight::from_parts(72_108_001, 0).saturating_mul(v.into())) + // Standard Error: 227_839 + .saturating_add(Weight::from_parts(20_314_085, 0).saturating_mul(n.into())) .saturating_add(T::DbWeight::get().reads(206_u64)) .saturating_add(T::DbWeight::get().reads((5_u64).saturating_mul(v.into()))) .saturating_add(T::DbWeight::get().reads((4_u64).saturating_mul(n.into()))) @@ -678,12 +687,12 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `3175 + n * (911 ±0) + v * (395 ±0)` // Estimated: `512390 + n * (3566 ±0) + v * (3566 ±0)` - // Minimum execution time: 33_836_205_000 picoseconds. - Weight::from_parts(34_210_443_000, 512390) - // Standard Error: 441_692 - .saturating_add(Weight::from_parts(6_122_533, 0).saturating_mul(v.into())) - // Standard Error: 441_692 - .saturating_add(Weight::from_parts(4_418_264, 0).saturating_mul(n.into())) + // Minimum execution time: 37_173_756_000 picoseconds. + Weight::from_parts(37_488_937_000, 512390) + // Standard Error: 467_413 + .saturating_add(Weight::from_parts(8_086_367, 0).saturating_mul(v.into())) + // Standard Error: 467_413 + .saturating_add(Weight::from_parts(3_108_193, 0).saturating_mul(n.into())) .saturating_add(T::DbWeight::get().reads(201_u64)) .saturating_add(T::DbWeight::get().reads((5_u64).saturating_mul(v.into()))) .saturating_add(T::DbWeight::get().reads((4_u64).saturating_mul(n.into()))) @@ -700,10 +709,10 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `979 + v * (50 ±0)` // Estimated: `3510 + v * (2520 ±0)` - // Minimum execution time: 2_454_689_000 picoseconds. - Weight::from_parts(161_771_064, 3510) - // Standard Error: 31_022 - .saturating_add(Weight::from_parts(4_820_158, 0).saturating_mul(v.into())) + // Minimum execution time: 2_641_258_000 picoseconds. + Weight::from_parts(382_882_595, 3510) + // Standard Error: 11_991 + .saturating_add(Weight::from_parts(4_695_820, 0).saturating_mul(v.into())) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(v.into()))) .saturating_add(Weight::from_parts(0, 2520).saturating_mul(v.into())) @@ -714,6 +723,8 @@ impl WeightInfo for SubstrateWeight { /// Proof: `Staking::MinValidatorBond` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) /// Storage: `Staking::MaxValidatorsCount` (r:0 w:1) /// Proof: `Staking::MaxValidatorsCount` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `Staking::MaxStakedRewards` (r:0 w:1) + /// Proof: `Staking::MaxStakedRewards` (`max_values`: Some(1), `max_size`: Some(1), added: 496, mode: `MaxEncodedLen`) /// Storage: `Staking::ChillThreshold` (r:0 w:1) /// Proof: `Staking::ChillThreshold` (`max_values`: Some(1), `max_size`: Some(1), added: 496, mode: `MaxEncodedLen`) /// Storage: `Staking::MaxNominatorsCount` (r:0 w:1) @@ -724,9 +735,9 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 5_073_000 picoseconds. - Weight::from_parts(5_452_000, 0) - .saturating_add(T::DbWeight::get().writes(6_u64)) + // Minimum execution time: 5_753_000 picoseconds. + Weight::from_parts(6_529_000, 0) + .saturating_add(T::DbWeight::get().writes(7_u64)) } /// Storage: `Staking::MinCommission` (r:0 w:1) /// Proof: `Staking::MinCommission` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) @@ -734,6 +745,8 @@ impl WeightInfo for SubstrateWeight { /// Proof: `Staking::MinValidatorBond` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) /// Storage: `Staking::MaxValidatorsCount` (r:0 w:1) /// Proof: `Staking::MaxValidatorsCount` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `Staking::MaxStakedRewards` (r:0 w:1) + /// Proof: `Staking::MaxStakedRewards` (`max_values`: Some(1), `max_size`: Some(1), added: 496, mode: `MaxEncodedLen`) /// Storage: `Staking::ChillThreshold` (r:0 w:1) /// Proof: `Staking::ChillThreshold` (`max_values`: Some(1), `max_size`: Some(1), added: 496, mode: `MaxEncodedLen`) /// Storage: `Staking::MaxNominatorsCount` (r:0 w:1) @@ -744,9 +757,9 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_465_000 picoseconds. - Weight::from_parts(4_832_000, 0) - .saturating_add(T::DbWeight::get().writes(6_u64)) + // Minimum execution time: 5_212_000 picoseconds. + Weight::from_parts(5_451_000, 0) + .saturating_add(T::DbWeight::get().writes(7_u64)) } /// Storage: `Staking::Bonded` (r:1 w:0) /// Proof: `Staking::Bonded` (`max_values`: None, `max_size`: Some(72), added: 2547, mode: `MaxEncodedLen`) @@ -774,8 +787,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `1939` // Estimated: `6248` - // Minimum execution time: 71_239_000 picoseconds. - Weight::from_parts(74_649_000, 6248) + // Minimum execution time: 73_000_000 picoseconds. + Weight::from_parts(75_184_000, 6248) .saturating_add(T::DbWeight::get().reads(12_u64)) .saturating_add(T::DbWeight::get().writes(6_u64)) } @@ -787,8 +800,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `691` // Estimated: `3510` - // Minimum execution time: 12_525_000 picoseconds. - Weight::from_parts(13_126_000, 3510) + // Minimum execution time: 13_056_000 picoseconds. + Weight::from_parts(13_517_000, 3510) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -798,31 +811,50 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_918_000 picoseconds. - Weight::from_parts(3_176_000, 0) + // Minimum execution time: 3_201_000 picoseconds. + Weight::from_parts(3_442_000, 0) .saturating_add(T::DbWeight::get().writes(1_u64)) } + /// Storage: `Balances::Locks` (r:1 w:1) + /// Proof: `Balances::Locks` (`max_values`: None, `max_size`: Some(1299), added: 3774, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `Staking::Bonded` (r:1 w:1) + /// Proof: `Staking::Bonded` (`max_values`: None, `max_size`: Some(72), added: 2547, mode: `MaxEncodedLen`) + /// Storage: `Staking::Ledger` (r:1 w:1) + /// Proof: `Staking::Ledger` (`max_values`: None, `max_size`: Some(1091), added: 3566, mode: `MaxEncodedLen`) + /// Storage: `Balances::Freezes` (r:1 w:0) + /// Proof: `Balances::Freezes` (`max_values`: None, `max_size`: Some(67), added: 2542, mode: `MaxEncodedLen`) + fn restore_ledger() -> Weight { + // Proof Size summary in bytes: + // Measured: `1047` + // Estimated: `4764` + // Minimum execution time: 44_671_000 picoseconds. + Weight::from_parts(45_611_000, 4764) + .saturating_add(T::DbWeight::get().reads(5_u64)) + .saturating_add(T::DbWeight::get().writes(4_u64)) + } } // For backwards compatibility and tests. impl WeightInfo for () { /// Storage: `Staking::Bonded` (r:1 w:1) /// Proof: `Staking::Bonded` (`max_values`: None, `max_size`: Some(72), added: 2547, mode: `MaxEncodedLen`) + /// Storage: `Staking::Ledger` (r:1 w:1) + /// Proof: `Staking::Ledger` (`max_values`: None, `max_size`: Some(1091), added: 3566, mode: `MaxEncodedLen`) /// Storage: `Balances::Locks` (r:1 w:1) /// Proof: `Balances::Locks` (`max_values`: None, `max_size`: Some(1299), added: 3774, mode: `MaxEncodedLen`) /// Storage: `Balances::Freezes` (r:1 w:0) /// Proof: `Balances::Freezes` (`max_values`: None, `max_size`: Some(67), added: 2542, mode: `MaxEncodedLen`) - /// Storage: `Staking::Ledger` (r:0 w:1) - /// Proof: `Staking::Ledger` (`max_values`: None, `max_size`: Some(1091), added: 3566, mode: `MaxEncodedLen`) /// Storage: `Staking::Payee` (r:0 w:1) /// Proof: `Staking::Payee` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) fn bond() -> Weight { // Proof Size summary in bytes: - // Measured: `927` + // Measured: `1042` // Estimated: `4764` - // Minimum execution time: 42_491_000 picoseconds. - Weight::from_parts(44_026_000, 4764) - .saturating_add(RocksDbWeight::get().reads(3_u64)) + // Minimum execution time: 46_504_000 picoseconds. + Weight::from_parts(48_459_000, 4764) + .saturating_add(RocksDbWeight::get().reads(4_u64)) .saturating_add(RocksDbWeight::get().writes(4_u64)) } /// Storage: `Staking::Bonded` (r:1 w:0) @@ -841,21 +873,21 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `1990` // Estimated: `8877` - // Minimum execution time: 88_756_000 picoseconds. - Weight::from_parts(91_000_000, 8877) + // Minimum execution time: 90_475_000 picoseconds. + Weight::from_parts(93_619_000, 8877) .saturating_add(RocksDbWeight::get().reads(9_u64)) .saturating_add(RocksDbWeight::get().writes(7_u64)) } /// Storage: `Staking::Ledger` (r:1 w:1) /// Proof: `Staking::Ledger` (`max_values`: None, `max_size`: Some(1091), added: 3566, mode: `MaxEncodedLen`) + /// Storage: `Staking::Bonded` (r:1 w:0) + /// Proof: `Staking::Bonded` (`max_values`: None, `max_size`: Some(72), added: 2547, mode: `MaxEncodedLen`) /// Storage: `Staking::Nominators` (r:1 w:0) /// Proof: `Staking::Nominators` (`max_values`: None, `max_size`: Some(558), added: 3033, mode: `MaxEncodedLen`) /// Storage: `Staking::MinNominatorBond` (r:1 w:0) /// Proof: `Staking::MinNominatorBond` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) /// Storage: `Staking::CurrentEra` (r:1 w:0) /// Proof: `Staking::CurrentEra` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - /// Storage: `Staking::Bonded` (r:1 w:0) - /// Proof: `Staking::Bonded` (`max_values`: None, `max_size`: Some(72), added: 2547, mode: `MaxEncodedLen`) /// Storage: `Balances::Locks` (r:1 w:1) /// Proof: `Balances::Locks` (`max_values`: None, `max_size`: Some(1299), added: 3774, mode: `MaxEncodedLen`) /// Storage: `Balances::Freezes` (r:1 w:0) @@ -868,41 +900,43 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `2195` // Estimated: `8877` - // Minimum execution time: 91_331_000 picoseconds. - Weight::from_parts(94_781_000, 8877) + // Minimum execution time: 99_335_000 picoseconds. + Weight::from_parts(101_440_000, 8877) .saturating_add(RocksDbWeight::get().reads(12_u64)) .saturating_add(RocksDbWeight::get().writes(7_u64)) } /// Storage: `Staking::Ledger` (r:1 w:1) /// Proof: `Staking::Ledger` (`max_values`: None, `max_size`: Some(1091), added: 3566, mode: `MaxEncodedLen`) - /// Storage: `Staking::CurrentEra` (r:1 w:0) - /// Proof: `Staking::CurrentEra` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) /// Storage: `Staking::Bonded` (r:1 w:0) /// Proof: `Staking::Bonded` (`max_values`: None, `max_size`: Some(72), added: 2547, mode: `MaxEncodedLen`) + /// Storage: `Staking::CurrentEra` (r:1 w:0) + /// Proof: `Staking::CurrentEra` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) /// Storage: `Balances::Locks` (r:1 w:1) /// Proof: `Balances::Locks` (`max_values`: None, `max_size`: Some(1299), added: 3774, mode: `MaxEncodedLen`) /// Storage: `Balances::Freezes` (r:1 w:0) /// Proof: `Balances::Freezes` (`max_values`: None, `max_size`: Some(67), added: 2542, mode: `MaxEncodedLen`) + /// Storage: `NominationPools::ReversePoolIdLookup` (r:1 w:0) + /// Proof: `NominationPools::ReversePoolIdLookup` (`max_values`: None, `max_size`: Some(44), added: 2519, mode: `MaxEncodedLen`) /// The range of component `s` is `[0, 100]`. fn withdraw_unbonded_update(s: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `1115` + // Measured: `1297` // Estimated: `4764` - // Minimum execution time: 42_495_000 picoseconds. - Weight::from_parts(44_189_470, 4764) - // Standard Error: 1_389 - .saturating_add(Weight::from_parts(47_484, 0).saturating_mul(s.into())) - .saturating_add(RocksDbWeight::get().reads(5_u64)) + // Minimum execution time: 50_067_000 picoseconds. + Weight::from_parts(52_396_327, 4764) + // Standard Error: 1_419 + .saturating_add(Weight::from_parts(51_406, 0).saturating_mul(s.into())) + .saturating_add(RocksDbWeight::get().reads(6_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } /// Storage: `Staking::Ledger` (r:1 w:1) /// Proof: `Staking::Ledger` (`max_values`: None, `max_size`: Some(1091), added: 3566, mode: `MaxEncodedLen`) + /// Storage: `Staking::Bonded` (r:1 w:1) + /// Proof: `Staking::Bonded` (`max_values`: None, `max_size`: Some(72), added: 2547, mode: `MaxEncodedLen`) /// Storage: `Staking::CurrentEra` (r:1 w:0) /// Proof: `Staking::CurrentEra` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) /// Storage: `Staking::SlashingSpans` (r:1 w:1) /// Proof: `Staking::SlashingSpans` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `Staking::Bonded` (r:1 w:1) - /// Proof: `Staking::Bonded` (`max_values`: None, `max_size`: Some(72), added: 2547, mode: `MaxEncodedLen`) /// Storage: `Balances::Locks` (r:1 w:1) /// Proof: `Balances::Locks` (`max_values`: None, `max_size`: Some(1299), added: 3774, mode: `MaxEncodedLen`) /// Storage: `Balances::Freezes` (r:1 w:0) @@ -928,10 +962,10 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `2196 + s * (4 ±0)` // Estimated: `6248 + s * (4 ±0)` - // Minimum execution time: 89_004_000 picoseconds. - Weight::from_parts(96_677_570, 6248) - // Standard Error: 4_635 - .saturating_add(Weight::from_parts(1_387_718, 0).saturating_mul(s.into())) + // Minimum execution time: 92_931_000 picoseconds. + Weight::from_parts(101_398_156, 6248) + // Standard Error: 4_180 + .saturating_add(Weight::from_parts(1_377_850, 0).saturating_mul(s.into())) .saturating_add(RocksDbWeight::get().reads(13_u64)) .saturating_add(RocksDbWeight::get().writes(11_u64)) .saturating_add(RocksDbWeight::get().writes((1_u64).saturating_mul(s.into()))) @@ -939,6 +973,8 @@ impl WeightInfo for () { } /// Storage: `Staking::Ledger` (r:1 w:0) /// Proof: `Staking::Ledger` (`max_values`: None, `max_size`: Some(1091), added: 3566, mode: `MaxEncodedLen`) + /// Storage: `Staking::Bonded` (r:1 w:0) + /// Proof: `Staking::Bonded` (`max_values`: None, `max_size`: Some(72), added: 2547, mode: `MaxEncodedLen`) /// Storage: `Staking::MinValidatorBond` (r:1 w:0) /// Proof: `Staking::MinValidatorBond` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) /// Storage: `Staking::MinCommission` (r:1 w:0) @@ -949,8 +985,6 @@ impl WeightInfo for () { /// Proof: `Staking::MaxValidatorsCount` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) /// Storage: `Staking::Nominators` (r:1 w:0) /// Proof: `Staking::Nominators` (`max_values`: None, `max_size`: Some(558), added: 3033, mode: `MaxEncodedLen`) - /// Storage: `Staking::Bonded` (r:1 w:0) - /// Proof: `Staking::Bonded` (`max_values`: None, `max_size`: Some(72), added: 2547, mode: `MaxEncodedLen`) /// Storage: `VoterList::ListNodes` (r:1 w:1) /// Proof: `VoterList::ListNodes` (`max_values`: None, `max_size`: Some(154), added: 2629, mode: `MaxEncodedLen`) /// Storage: `VoterList::ListBags` (r:1 w:1) @@ -963,31 +997,35 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `1372` // Estimated: `4556` - // Minimum execution time: 51_532_000 picoseconds. - Weight::from_parts(53_308_000, 4556) + // Minimum execution time: 56_291_000 picoseconds. + Weight::from_parts(58_372_000, 4556) .saturating_add(RocksDbWeight::get().reads(11_u64)) .saturating_add(RocksDbWeight::get().writes(5_u64)) } /// Storage: `Staking::Ledger` (r:1 w:0) /// Proof: `Staking::Ledger` (`max_values`: None, `max_size`: Some(1091), added: 3566, mode: `MaxEncodedLen`) + /// Storage: `Staking::Bonded` (r:1 w:0) + /// Proof: `Staking::Bonded` (`max_values`: None, `max_size`: Some(72), added: 2547, mode: `MaxEncodedLen`) /// Storage: `Staking::Nominators` (r:128 w:128) /// Proof: `Staking::Nominators` (`max_values`: None, `max_size`: Some(558), added: 3033, mode: `MaxEncodedLen`) /// The range of component `k` is `[1, 128]`. fn kick(k: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `1280 + k * (569 ±0)` + // Measured: `1815 + k * (572 ±0)` // Estimated: `4556 + k * (3033 ±0)` - // Minimum execution time: 28_955_000 picoseconds. - Weight::from_parts(29_609_869, 4556) - // Standard Error: 6_793 - .saturating_add(Weight::from_parts(6_412_124, 0).saturating_mul(k.into())) - .saturating_add(RocksDbWeight::get().reads(1_u64)) + // Minimum execution time: 36_218_000 picoseconds. + Weight::from_parts(38_811_308, 4556) + // Standard Error: 8_352 + .saturating_add(Weight::from_parts(6_527_398, 0).saturating_mul(k.into())) + .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().reads((1_u64).saturating_mul(k.into()))) .saturating_add(RocksDbWeight::get().writes((1_u64).saturating_mul(k.into()))) .saturating_add(Weight::from_parts(0, 3033).saturating_mul(k.into())) } /// Storage: `Staking::Ledger` (r:1 w:0) /// Proof: `Staking::Ledger` (`max_values`: None, `max_size`: Some(1091), added: 3566, mode: `MaxEncodedLen`) + /// Storage: `Staking::Bonded` (r:1 w:0) + /// Proof: `Staking::Bonded` (`max_values`: None, `max_size`: Some(72), added: 2547, mode: `MaxEncodedLen`) /// Storage: `Staking::MinNominatorBond` (r:1 w:0) /// Proof: `Staking::MinNominatorBond` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) /// Storage: `Staking::Nominators` (r:1 w:1) @@ -998,8 +1036,6 @@ impl WeightInfo for () { /// Proof: `Staking::Validators` (`max_values`: None, `max_size`: Some(45), added: 2520, mode: `MaxEncodedLen`) /// Storage: `Staking::CurrentEra` (r:1 w:0) /// Proof: `Staking::CurrentEra` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - /// Storage: `Staking::Bonded` (r:1 w:0) - /// Proof: `Staking::Bonded` (`max_values`: None, `max_size`: Some(72), added: 2547, mode: `MaxEncodedLen`) /// Storage: `VoterList::ListNodes` (r:2 w:2) /// Proof: `VoterList::ListNodes` (`max_values`: None, `max_size`: Some(154), added: 2629, mode: `MaxEncodedLen`) /// Storage: `VoterList::ListBags` (r:1 w:1) @@ -1013,10 +1049,10 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `1866 + n * (102 ±0)` // Estimated: `6248 + n * (2520 ±0)` - // Minimum execution time: 64_080_000 picoseconds. - Weight::from_parts(61_985_382, 6248) - // Standard Error: 13_320 - .saturating_add(Weight::from_parts(4_030_513, 0).saturating_mul(n.into())) + // Minimum execution time: 68_607_000 picoseconds. + Weight::from_parts(66_831_185, 6248) + // Standard Error: 14_014 + .saturating_add(Weight::from_parts(4_031_635, 0).saturating_mul(n.into())) .saturating_add(RocksDbWeight::get().reads(12_u64)) .saturating_add(RocksDbWeight::get().reads((1_u64).saturating_mul(n.into()))) .saturating_add(RocksDbWeight::get().writes(6_u64)) @@ -1024,6 +1060,8 @@ impl WeightInfo for () { } /// Storage: `Staking::Ledger` (r:1 w:0) /// Proof: `Staking::Ledger` (`max_values`: None, `max_size`: Some(1091), added: 3566, mode: `MaxEncodedLen`) + /// Storage: `Staking::Bonded` (r:1 w:0) + /// Proof: `Staking::Bonded` (`max_values`: None, `max_size`: Some(72), added: 2547, mode: `MaxEncodedLen`) /// Storage: `Staking::Validators` (r:1 w:0) /// Proof: `Staking::Validators` (`max_values`: None, `max_size`: Some(45), added: 2520, mode: `MaxEncodedLen`) /// Storage: `Staking::Nominators` (r:1 w:1) @@ -1038,11 +1076,11 @@ impl WeightInfo for () { /// Proof: `VoterList::CounterForListNodes` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) fn chill() -> Weight { // Proof Size summary in bytes: - // Measured: `1650` + // Measured: `1816` // Estimated: `6248` - // Minimum execution time: 54_194_000 picoseconds. - Weight::from_parts(55_578_000, 6248) - .saturating_add(RocksDbWeight::get().reads(8_u64)) + // Minimum execution time: 60_088_000 picoseconds. + Weight::from_parts(62_471_000, 6248) + .saturating_add(RocksDbWeight::get().reads(9_u64)) .saturating_add(RocksDbWeight::get().writes(6_u64)) } /// Storage: `Staking::Ledger` (r:1 w:0) @@ -1055,37 +1093,37 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `902` // Estimated: `4556` - // Minimum execution time: 16_597_000 picoseconds. - Weight::from_parts(16_980_000, 4556) + // Minimum execution time: 19_777_000 picoseconds. + Weight::from_parts(20_690_000, 4556) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } /// Storage: `Staking::Ledger` (r:1 w:0) /// Proof: `Staking::Ledger` (`max_values`: None, `max_size`: Some(1091), added: 3566, mode: `MaxEncodedLen`) - /// Storage: `Staking::Payee` (r:1 w:1) - /// Proof: `Staking::Payee` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) /// Storage: `Staking::Bonded` (r:1 w:0) /// Proof: `Staking::Bonded` (`max_values`: None, `max_size`: Some(72), added: 2547, mode: `MaxEncodedLen`) + /// Storage: `Staking::Payee` (r:1 w:1) + /// Proof: `Staking::Payee` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) fn update_payee() -> Weight { // Proof Size summary in bytes: // Measured: `969` // Estimated: `4556` - // Minimum execution time: 20_626_000 picoseconds. - Weight::from_parts(21_242_000, 4556) + // Minimum execution time: 23_705_000 picoseconds. + Weight::from_parts(24_409_000, 4556) .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } /// Storage: `Staking::Bonded` (r:1 w:1) /// Proof: `Staking::Bonded` (`max_values`: None, `max_size`: Some(72), added: 2547, mode: `MaxEncodedLen`) - /// Storage: `Staking::Ledger` (r:1 w:2) + /// Storage: `Staking::Ledger` (r:2 w:2) /// Proof: `Staking::Ledger` (`max_values`: None, `max_size`: Some(1091), added: 3566, mode: `MaxEncodedLen`) fn set_controller() -> Weight { // Proof Size summary in bytes: // Measured: `902` - // Estimated: `4556` - // Minimum execution time: 19_972_000 picoseconds. - Weight::from_parts(20_470_000, 4556) - .saturating_add(RocksDbWeight::get().reads(2_u64)) + // Estimated: `8122` + // Minimum execution time: 23_479_000 picoseconds. + Weight::from_parts(24_502_000, 8122) + .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(3_u64)) } /// Storage: `Staking::ValidatorCount` (r:0 w:1) @@ -1094,8 +1132,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_571_000 picoseconds. - Weight::from_parts(2_720_000, 0) + // Minimum execution time: 2_675_000 picoseconds. + Weight::from_parts(2_802_000, 0) .saturating_add(RocksDbWeight::get().writes(1_u64)) } /// Storage: `Staking::ForceEra` (r:0 w:1) @@ -1104,8 +1142,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 8_056_000 picoseconds. - Weight::from_parts(8_413_000, 0) + // Minimum execution time: 7_067_000 picoseconds. + Weight::from_parts(7_413_000, 0) .saturating_add(RocksDbWeight::get().writes(1_u64)) } /// Storage: `Staking::ForceEra` (r:0 w:1) @@ -1114,8 +1152,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 8_162_000 picoseconds. - Weight::from_parts(8_497_000, 0) + // Minimum execution time: 6_977_000 picoseconds. + Weight::from_parts(7_353_000, 0) .saturating_add(RocksDbWeight::get().writes(1_u64)) } /// Storage: `Staking::ForceEra` (r:0 w:1) @@ -1124,8 +1162,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 8_320_000 picoseconds. - Weight::from_parts(8_564_000, 0) + // Minimum execution time: 7_071_000 picoseconds. + Weight::from_parts(7_463_000, 0) .saturating_add(RocksDbWeight::get().writes(1_u64)) } /// Storage: `Staking::Invulnerables` (r:0 w:1) @@ -1135,30 +1173,30 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_470_000 picoseconds. - Weight::from_parts(3_110_242, 0) - // Standard Error: 63 - .saturating_add(Weight::from_parts(11_786, 0).saturating_mul(v.into())) + // Minimum execution time: 2_833_000 picoseconds. + Weight::from_parts(3_328_130, 0) + // Standard Error: 30 + .saturating_add(Weight::from_parts(10_058, 0).saturating_mul(v.into())) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: `Staking::Ledger` (r:5900 w:11800) + /// Storage: `Staking::Ledger` (r:11800 w:11800) /// Proof: `Staking::Ledger` (`max_values`: None, `max_size`: Some(1091), added: 3566, mode: `MaxEncodedLen`) + /// Storage: `Staking::Bonded` (r:5900 w:5900) + /// Proof: `Staking::Bonded` (`max_values`: None, `max_size`: Some(72), added: 2547, mode: `MaxEncodedLen`) /// Storage: `Staking::Payee` (r:5900 w:0) /// Proof: `Staking::Payee` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) - /// Storage: `Staking::Bonded` (r:0 w:5900) - /// Proof: `Staking::Bonded` (`max_values`: None, `max_size`: Some(72), added: 2547, mode: `MaxEncodedLen`) /// The range of component `i` is `[0, 5900]`. fn deprecate_controller_batch(i: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `1356 + i * (151 ±0)` - // Estimated: `990 + i * (3566 ±0)` - // Minimum execution time: 2_101_000 picoseconds. - Weight::from_parts(2_238_000, 990) - // Standard Error: 56_753 - .saturating_add(Weight::from_parts(18_404_902, 0).saturating_mul(i.into())) - .saturating_add(RocksDbWeight::get().reads((2_u64).saturating_mul(i.into()))) + // Measured: `1746 + i * (229 ±0)` + // Estimated: `990 + i * (7132 ±0)` + // Minimum execution time: 5_300_000 picoseconds. + Weight::from_parts(5_437_000, 990) + // Standard Error: 66_261 + .saturating_add(Weight::from_parts(30_172_457, 0).saturating_mul(i.into())) + .saturating_add(RocksDbWeight::get().reads((4_u64).saturating_mul(i.into()))) .saturating_add(RocksDbWeight::get().writes((3_u64).saturating_mul(i.into()))) - .saturating_add(Weight::from_parts(0, 3566).saturating_mul(i.into())) + .saturating_add(Weight::from_parts(0, 7132).saturating_mul(i.into())) } /// Storage: `Staking::SlashingSpans` (r:1 w:1) /// Proof: `Staking::SlashingSpans` (`max_values`: None, `max_size`: None, mode: `Measured`) @@ -1193,10 +1231,10 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `2196 + s * (4 ±0)` // Estimated: `6248 + s * (4 ±0)` - // Minimum execution time: 86_765_000 picoseconds. - Weight::from_parts(95_173_565, 6248) - // Standard Error: 4_596 - .saturating_add(Weight::from_parts(1_354_849, 0).saturating_mul(s.into())) + // Minimum execution time: 87_677_000 picoseconds. + Weight::from_parts(96_386_462, 6248) + // Standard Error: 3_717 + .saturating_add(Weight::from_parts(1_370_585, 0).saturating_mul(s.into())) .saturating_add(RocksDbWeight::get().reads(13_u64)) .saturating_add(RocksDbWeight::get().writes(12_u64)) .saturating_add(RocksDbWeight::get().writes((1_u64).saturating_mul(s.into()))) @@ -1209,10 +1247,10 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `66672` // Estimated: `70137` - // Minimum execution time: 104_490_000 picoseconds. - Weight::from_parts(1_162_956_951, 70137) - // Standard Error: 76_760 - .saturating_add(Weight::from_parts(6_485_569, 0).saturating_mul(s.into())) + // Minimum execution time: 105_086_000 picoseconds. + Weight::from_parts(1_167_895_222, 70137) + // Standard Error: 77_022 + .saturating_add(Weight::from_parts(6_487_305, 0).saturating_mul(s.into())) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -1248,11 +1286,11 @@ impl WeightInfo for () { fn payout_stakers_alive_staked(n: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `33297 + n * (377 ±0)` - // Estimated: `30944 + n * (3774 ±0)` - // Minimum execution time: 144_790_000 picoseconds. - Weight::from_parts(36_764_791, 30944) - // Standard Error: 89_592 - .saturating_add(Weight::from_parts(49_620_105, 0).saturating_mul(n.into())) + // Estimated: `30944 + n * (3774 ±3)` + // Minimum execution time: 154_210_000 picoseconds. + Weight::from_parts(192_836_012, 30944) + // Standard Error: 40_441 + .saturating_add(Weight::from_parts(47_646_642, 0).saturating_mul(n.into())) .saturating_add(RocksDbWeight::get().reads(14_u64)) .saturating_add(RocksDbWeight::get().reads((6_u64).saturating_mul(n.into()))) .saturating_add(RocksDbWeight::get().writes(4_u64)) @@ -1276,10 +1314,10 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `1991 + l * (7 ±0)` // Estimated: `8877` - // Minimum execution time: 81_768_000 picoseconds. - Weight::from_parts(85_332_982, 8877) - // Standard Error: 5_380 - .saturating_add(Weight::from_parts(70_298, 0).saturating_mul(l.into())) + // Minimum execution time: 88_337_000 picoseconds. + Weight::from_parts(91_391_254, 8877) + // Standard Error: 4_485 + .saturating_add(Weight::from_parts(103_443, 0).saturating_mul(l.into())) .saturating_add(RocksDbWeight::get().reads(9_u64)) .saturating_add(RocksDbWeight::get().writes(7_u64)) } @@ -1314,10 +1352,10 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `2196 + s * (4 ±0)` // Estimated: `6248 + s * (4 ±0)` - // Minimum execution time: 96_123_000 picoseconds. - Weight::from_parts(100_278_672, 6248) - // Standard Error: 3_487 - .saturating_add(Weight::from_parts(1_326_503, 0).saturating_mul(s.into())) + // Minimum execution time: 98_014_000 picoseconds. + Weight::from_parts(102_537_670, 6248) + // Standard Error: 3_324 + .saturating_add(Weight::from_parts(1_353_142, 0).saturating_mul(s.into())) .saturating_add(RocksDbWeight::get().reads(12_u64)) .saturating_add(RocksDbWeight::get().writes(11_u64)) .saturating_add(RocksDbWeight::get().writes((1_u64).saturating_mul(s.into()))) @@ -1363,12 +1401,12 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `0 + n * (720 ±0) + v * (3598 ±0)` // Estimated: `512390 + n * (3566 ±0) + v * (3566 ±0)` - // Minimum execution time: 572_893_000 picoseconds. - Weight::from_parts(578_010_000, 512390) - // Standard Error: 2_094_268 - .saturating_add(Weight::from_parts(68_419_710, 0).saturating_mul(v.into())) - // Standard Error: 208_682 - .saturating_add(Weight::from_parts(18_826_175, 0).saturating_mul(n.into())) + // Minimum execution time: 608_575_000 picoseconds. + Weight::from_parts(613_663_000, 512390) + // Standard Error: 2_286_521 + .saturating_add(Weight::from_parts(72_108_001, 0).saturating_mul(v.into())) + // Standard Error: 227_839 + .saturating_add(Weight::from_parts(20_314_085, 0).saturating_mul(n.into())) .saturating_add(RocksDbWeight::get().reads(206_u64)) .saturating_add(RocksDbWeight::get().reads((5_u64).saturating_mul(v.into()))) .saturating_add(RocksDbWeight::get().reads((4_u64).saturating_mul(n.into()))) @@ -1399,12 +1437,12 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `3175 + n * (911 ±0) + v * (395 ±0)` // Estimated: `512390 + n * (3566 ±0) + v * (3566 ±0)` - // Minimum execution time: 33_836_205_000 picoseconds. - Weight::from_parts(34_210_443_000, 512390) - // Standard Error: 441_692 - .saturating_add(Weight::from_parts(6_122_533, 0).saturating_mul(v.into())) - // Standard Error: 441_692 - .saturating_add(Weight::from_parts(4_418_264, 0).saturating_mul(n.into())) + // Minimum execution time: 37_173_756_000 picoseconds. + Weight::from_parts(37_488_937_000, 512390) + // Standard Error: 467_413 + .saturating_add(Weight::from_parts(8_086_367, 0).saturating_mul(v.into())) + // Standard Error: 467_413 + .saturating_add(Weight::from_parts(3_108_193, 0).saturating_mul(n.into())) .saturating_add(RocksDbWeight::get().reads(201_u64)) .saturating_add(RocksDbWeight::get().reads((5_u64).saturating_mul(v.into()))) .saturating_add(RocksDbWeight::get().reads((4_u64).saturating_mul(n.into()))) @@ -1421,10 +1459,10 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `979 + v * (50 ±0)` // Estimated: `3510 + v * (2520 ±0)` - // Minimum execution time: 2_454_689_000 picoseconds. - Weight::from_parts(161_771_064, 3510) - // Standard Error: 31_022 - .saturating_add(Weight::from_parts(4_820_158, 0).saturating_mul(v.into())) + // Minimum execution time: 2_641_258_000 picoseconds. + Weight::from_parts(382_882_595, 3510) + // Standard Error: 11_991 + .saturating_add(Weight::from_parts(4_695_820, 0).saturating_mul(v.into())) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().reads((1_u64).saturating_mul(v.into()))) .saturating_add(Weight::from_parts(0, 2520).saturating_mul(v.into())) @@ -1435,6 +1473,8 @@ impl WeightInfo for () { /// Proof: `Staking::MinValidatorBond` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) /// Storage: `Staking::MaxValidatorsCount` (r:0 w:1) /// Proof: `Staking::MaxValidatorsCount` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `Staking::MaxStakedRewards` (r:0 w:1) + /// Proof: `Staking::MaxStakedRewards` (`max_values`: Some(1), `max_size`: Some(1), added: 496, mode: `MaxEncodedLen`) /// Storage: `Staking::ChillThreshold` (r:0 w:1) /// Proof: `Staking::ChillThreshold` (`max_values`: Some(1), `max_size`: Some(1), added: 496, mode: `MaxEncodedLen`) /// Storage: `Staking::MaxNominatorsCount` (r:0 w:1) @@ -1445,9 +1485,9 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 5_073_000 picoseconds. - Weight::from_parts(5_452_000, 0) - .saturating_add(RocksDbWeight::get().writes(6_u64)) + // Minimum execution time: 5_753_000 picoseconds. + Weight::from_parts(6_529_000, 0) + .saturating_add(RocksDbWeight::get().writes(7_u64)) } /// Storage: `Staking::MinCommission` (r:0 w:1) /// Proof: `Staking::MinCommission` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) @@ -1455,6 +1495,8 @@ impl WeightInfo for () { /// Proof: `Staking::MinValidatorBond` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) /// Storage: `Staking::MaxValidatorsCount` (r:0 w:1) /// Proof: `Staking::MaxValidatorsCount` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `Staking::MaxStakedRewards` (r:0 w:1) + /// Proof: `Staking::MaxStakedRewards` (`max_values`: Some(1), `max_size`: Some(1), added: 496, mode: `MaxEncodedLen`) /// Storage: `Staking::ChillThreshold` (r:0 w:1) /// Proof: `Staking::ChillThreshold` (`max_values`: Some(1), `max_size`: Some(1), added: 496, mode: `MaxEncodedLen`) /// Storage: `Staking::MaxNominatorsCount` (r:0 w:1) @@ -1465,9 +1507,9 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_465_000 picoseconds. - Weight::from_parts(4_832_000, 0) - .saturating_add(RocksDbWeight::get().writes(6_u64)) + // Minimum execution time: 5_212_000 picoseconds. + Weight::from_parts(5_451_000, 0) + .saturating_add(RocksDbWeight::get().writes(7_u64)) } /// Storage: `Staking::Bonded` (r:1 w:0) /// Proof: `Staking::Bonded` (`max_values`: None, `max_size`: Some(72), added: 2547, mode: `MaxEncodedLen`) @@ -1495,8 +1537,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `1939` // Estimated: `6248` - // Minimum execution time: 71_239_000 picoseconds. - Weight::from_parts(74_649_000, 6248) + // Minimum execution time: 73_000_000 picoseconds. + Weight::from_parts(75_184_000, 6248) .saturating_add(RocksDbWeight::get().reads(12_u64)) .saturating_add(RocksDbWeight::get().writes(6_u64)) } @@ -1508,8 +1550,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `691` // Estimated: `3510` - // Minimum execution time: 12_525_000 picoseconds. - Weight::from_parts(13_126_000, 3510) + // Minimum execution time: 13_056_000 picoseconds. + Weight::from_parts(13_517_000, 3510) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -1519,8 +1561,27 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_918_000 picoseconds. - Weight::from_parts(3_176_000, 0) + // Minimum execution time: 3_201_000 picoseconds. + Weight::from_parts(3_442_000, 0) .saturating_add(RocksDbWeight::get().writes(1_u64)) } + /// Storage: `Balances::Locks` (r:1 w:1) + /// Proof: `Balances::Locks` (`max_values`: None, `max_size`: Some(1299), added: 3774, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `Staking::Bonded` (r:1 w:1) + /// Proof: `Staking::Bonded` (`max_values`: None, `max_size`: Some(72), added: 2547, mode: `MaxEncodedLen`) + /// Storage: `Staking::Ledger` (r:1 w:1) + /// Proof: `Staking::Ledger` (`max_values`: None, `max_size`: Some(1091), added: 3566, mode: `MaxEncodedLen`) + /// Storage: `Balances::Freezes` (r:1 w:0) + /// Proof: `Balances::Freezes` (`max_values`: None, `max_size`: Some(67), added: 2542, mode: `MaxEncodedLen`) + fn restore_ledger() -> Weight { + // Proof Size summary in bytes: + // Measured: `1047` + // Estimated: `4764` + // Minimum execution time: 44_671_000 picoseconds. + Weight::from_parts(45_611_000, 4764) + .saturating_add(RocksDbWeight::get().reads(5_u64)) + .saturating_add(RocksDbWeight::get().writes(4_u64)) + } } diff --git a/substrate/frame/state-trie-migration/Cargo.toml b/substrate/frame/state-trie-migration/Cargo.toml index 1fb49e6256205ccc5aff3514dfa0a16ee8713265..613308c308e1f15eace901af1a192202f1aa8cad 100644 --- a/substrate/frame/state-trie-migration/Cargo.toml +++ b/substrate/frame/state-trie-migration/Cargo.toml @@ -16,9 +16,9 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false } -log = { version = "0.4.17", default-features = false } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.195", optional = true } +log = { workspace = true } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +serde = { optional = true, workspace = true, default-features = true } thousands = { version = "0.2.0", optional = true } zstd = { version = "0.12.4", default-features = false, optional = true } frame-benchmarking = { path = "../benchmarking", default-features = false, optional = true } diff --git a/substrate/frame/state-trie-migration/src/lib.rs b/substrate/frame/state-trie-migration/src/lib.rs index 6b3aa9934e070046ee694409b20faebf3934663f..5c54c27966cd6951309ff320d942fac1ba15e9c7 100644 --- a/substrate/frame/state-trie-migration/src/lib.rs +++ b/substrate/frame/state-trie-migration/src/lib.rs @@ -452,7 +452,7 @@ pub mod pallet { pub struct TestDefaultConfig; - #[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig, no_aggregated_types)] + #[derive_impl(frame_system::config_preludes::TestDefaultConfig, no_aggregated_types)] impl frame_system::DefaultConfig for TestDefaultConfig {} #[frame_support::register_default_impl(TestDefaultConfig)] @@ -1131,7 +1131,7 @@ mod mock { pub const SS58Prefix: u8 = 42; } - #[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] + #[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { type Block = Block; type BlockHashCount = ConstU32<250>; @@ -1144,7 +1144,7 @@ mod mock { pub const MigrationMaxKeyLen: u32 = 512; } - #[derive_impl(pallet_balances::config_preludes::TestDefaultConfig as pallet_balances::DefaultConfig)] + #[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] impl pallet_balances::Config for Test { type ReserveIdentifier = [u8; 8]; type AccountStore = System; @@ -1177,7 +1177,7 @@ mod mock { } } - #[derive_impl(super::config_preludes::TestDefaultConfig as pallet_state_trie_migration::DefaultConfig)] + #[derive_impl(super::config_preludes::TestDefaultConfig)] impl pallet_state_trie_migration::Config for Test { type ControlOrigin = EnsureRoot; type Currency = Balances; @@ -1698,8 +1698,10 @@ pub(crate) mod remote_tests { /// /// This will print some very useful statistics, make sure [`crate::LOG_TARGET`] is enabled. #[allow(dead_code)] - pub(crate) async fn run_with_limits(limits: MigrationLimits, mode: Mode) - where + pub(crate) async fn run_with_limits( + limits: MigrationLimits, + mode: Mode, + ) where Runtime: crate::Config, Block: BlockT + DeserializeOwned, Block::Header: serde::de::DeserializeOwned, diff --git a/substrate/frame/state-trie-migration/src/weights.rs b/substrate/frame/state-trie-migration/src/weights.rs index 8fa80b38957d9b38a40803a261d52cfe7836a990..ddc9236f7af66f559034b4f04f3a0296f340f810 100644 --- a/substrate/frame/state-trie-migration/src/weights.rs +++ b/substrate/frame/state-trie-migration/src/weights.rs @@ -17,26 +17,28 @@ //! Autogenerated weights for `pallet_state_trie_migration` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2024-01-24, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-04-09, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-grjcggob-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! HOSTNAME: `runner-anb7yjbi-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: `1024` // Executed Command: -// target/production/substrate-node +// ./target/production/substrate-node // benchmark // pallet +// --chain=dev // --steps=50 // --repeat=20 +// --pallet=pallet_state_trie_migration +// --no-storage-info +// --no-median-slopes +// --no-min-squares // --extrinsic=* // --wasm-execution=compiled // --heap-pages=4096 -// --json-file=/builds/parity/mirrors/polkadot-sdk/.git/.artifacts/bench.json -// --pallet=pallet_state_trie_migration -// --chain=dev -// --header=./substrate/HEADER-APACHE2 // --output=./substrate/frame/state-trie-migration/src/weights.rs +// --header=./substrate/HEADER-APACHE2 // --template=./substrate/.maintain/frame-weight-template.hbs #![cfg_attr(rustfmt, rustfmt_skip)] @@ -64,15 +66,15 @@ impl WeightInfo for SubstrateWeight { /// Storage: `StateTrieMigration::SignedMigrationMaxLimits` (r:1 w:0) /// Proof: `StateTrieMigration::SignedMigrationMaxLimits` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `MaxEncodedLen`) /// Storage: `Balances::Holds` (r:1 w:0) - /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(175), added: 2650, mode: `MaxEncodedLen`) + /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(193), added: 2668, mode: `MaxEncodedLen`) /// Storage: `StateTrieMigration::MigrationProcess` (r:1 w:1) /// Proof: `StateTrieMigration::MigrationProcess` (`max_values`: Some(1), `max_size`: Some(1042), added: 1537, mode: `MaxEncodedLen`) fn continue_migrate() -> Weight { // Proof Size summary in bytes: // Measured: `108` - // Estimated: `3640` - // Minimum execution time: 18_520_000 picoseconds. - Weight::from_parts(19_171_000, 3640) + // Estimated: `3658` + // Minimum execution time: 18_293_000 picoseconds. + Weight::from_parts(18_577_000, 3658) .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -82,53 +84,53 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `76` // Estimated: `1493` - // Minimum execution time: 3_786_000 picoseconds. - Weight::from_parts(4_038_000, 1493) + // Minimum execution time: 4_240_000 picoseconds. + Weight::from_parts(4_369_000, 1493) .saturating_add(T::DbWeight::get().reads(1_u64)) } /// Storage: `Balances::Holds` (r:1 w:0) - /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(175), added: 2650, mode: `MaxEncodedLen`) + /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(193), added: 2668, mode: `MaxEncodedLen`) fn migrate_custom_top_success() -> Weight { // Proof Size summary in bytes: // Measured: `0` - // Estimated: `3640` - // Minimum execution time: 11_144_000 picoseconds. - Weight::from_parts(11_556_000, 3640) + // Estimated: `3658` + // Minimum execution time: 11_909_000 picoseconds. + Weight::from_parts(12_453_000, 3658) .saturating_add(T::DbWeight::get().reads(1_u64)) } /// Storage: `Balances::Holds` (r:1 w:1) - /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(175), added: 2650, mode: `MaxEncodedLen`) + /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(193), added: 2668, mode: `MaxEncodedLen`) /// Storage: UNKNOWN KEY `0x666f6f` (r:1 w:1) /// Proof: UNKNOWN KEY `0x666f6f` (r:1 w:1) fn migrate_custom_top_fail() -> Weight { // Proof Size summary in bytes: // Measured: `113` - // Estimated: `3640` - // Minimum execution time: 59_288_000 picoseconds. - Weight::from_parts(60_276_000, 3640) + // Estimated: `3658` + // Minimum execution time: 65_631_000 picoseconds. + Weight::from_parts(66_506_000, 3658) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } /// Storage: `Balances::Holds` (r:1 w:0) - /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(175), added: 2650, mode: `MaxEncodedLen`) + /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(193), added: 2668, mode: `MaxEncodedLen`) fn migrate_custom_child_success() -> Weight { // Proof Size summary in bytes: // Measured: `0` - // Estimated: `3640` - // Minimum execution time: 11_258_000 picoseconds. - Weight::from_parts(11_626_000, 3640) + // Estimated: `3658` + // Minimum execution time: 12_208_000 picoseconds. + Weight::from_parts(12_690_000, 3658) .saturating_add(T::DbWeight::get().reads(1_u64)) } /// Storage: `Balances::Holds` (r:1 w:1) - /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(175), added: 2650, mode: `MaxEncodedLen`) + /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(193), added: 2668, mode: `MaxEncodedLen`) /// Storage: UNKNOWN KEY `0x666f6f` (r:1 w:1) /// Proof: UNKNOWN KEY `0x666f6f` (r:1 w:1) fn migrate_custom_child_fail() -> Weight { // Proof Size summary in bytes: // Measured: `106` - // Estimated: `3640` - // Minimum execution time: 61_575_000 picoseconds. - Weight::from_parts(63_454_000, 3640) + // Estimated: `3658` + // Minimum execution time: 66_988_000 picoseconds. + Weight::from_parts(68_616_000, 3658) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } @@ -139,10 +141,10 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `197 + v * (1 ±0)` // Estimated: `3662 + v * (1 ±0)` - // Minimum execution time: 5_259_000 picoseconds. - Weight::from_parts(5_433_000, 3662) + // Minimum execution time: 5_365_000 picoseconds. + Weight::from_parts(5_460_000, 3662) // Standard Error: 1 - .saturating_add(Weight::from_parts(1_159, 0).saturating_mul(v.into())) + .saturating_add(Weight::from_parts(1_150, 0).saturating_mul(v.into())) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) .saturating_add(Weight::from_parts(0, 1).saturating_mul(v.into())) @@ -154,15 +156,15 @@ impl WeightInfo for () { /// Storage: `StateTrieMigration::SignedMigrationMaxLimits` (r:1 w:0) /// Proof: `StateTrieMigration::SignedMigrationMaxLimits` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `MaxEncodedLen`) /// Storage: `Balances::Holds` (r:1 w:0) - /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(175), added: 2650, mode: `MaxEncodedLen`) + /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(193), added: 2668, mode: `MaxEncodedLen`) /// Storage: `StateTrieMigration::MigrationProcess` (r:1 w:1) /// Proof: `StateTrieMigration::MigrationProcess` (`max_values`: Some(1), `max_size`: Some(1042), added: 1537, mode: `MaxEncodedLen`) fn continue_migrate() -> Weight { // Proof Size summary in bytes: // Measured: `108` - // Estimated: `3640` - // Minimum execution time: 18_520_000 picoseconds. - Weight::from_parts(19_171_000, 3640) + // Estimated: `3658` + // Minimum execution time: 18_293_000 picoseconds. + Weight::from_parts(18_577_000, 3658) .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -172,53 +174,53 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `76` // Estimated: `1493` - // Minimum execution time: 3_786_000 picoseconds. - Weight::from_parts(4_038_000, 1493) + // Minimum execution time: 4_240_000 picoseconds. + Weight::from_parts(4_369_000, 1493) .saturating_add(RocksDbWeight::get().reads(1_u64)) } /// Storage: `Balances::Holds` (r:1 w:0) - /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(175), added: 2650, mode: `MaxEncodedLen`) + /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(193), added: 2668, mode: `MaxEncodedLen`) fn migrate_custom_top_success() -> Weight { // Proof Size summary in bytes: // Measured: `0` - // Estimated: `3640` - // Minimum execution time: 11_144_000 picoseconds. - Weight::from_parts(11_556_000, 3640) + // Estimated: `3658` + // Minimum execution time: 11_909_000 picoseconds. + Weight::from_parts(12_453_000, 3658) .saturating_add(RocksDbWeight::get().reads(1_u64)) } /// Storage: `Balances::Holds` (r:1 w:1) - /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(175), added: 2650, mode: `MaxEncodedLen`) + /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(193), added: 2668, mode: `MaxEncodedLen`) /// Storage: UNKNOWN KEY `0x666f6f` (r:1 w:1) /// Proof: UNKNOWN KEY `0x666f6f` (r:1 w:1) fn migrate_custom_top_fail() -> Weight { // Proof Size summary in bytes: // Measured: `113` - // Estimated: `3640` - // Minimum execution time: 59_288_000 picoseconds. - Weight::from_parts(60_276_000, 3640) + // Estimated: `3658` + // Minimum execution time: 65_631_000 picoseconds. + Weight::from_parts(66_506_000, 3658) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } /// Storage: `Balances::Holds` (r:1 w:0) - /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(175), added: 2650, mode: `MaxEncodedLen`) + /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(193), added: 2668, mode: `MaxEncodedLen`) fn migrate_custom_child_success() -> Weight { // Proof Size summary in bytes: // Measured: `0` - // Estimated: `3640` - // Minimum execution time: 11_258_000 picoseconds. - Weight::from_parts(11_626_000, 3640) + // Estimated: `3658` + // Minimum execution time: 12_208_000 picoseconds. + Weight::from_parts(12_690_000, 3658) .saturating_add(RocksDbWeight::get().reads(1_u64)) } /// Storage: `Balances::Holds` (r:1 w:1) - /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(175), added: 2650, mode: `MaxEncodedLen`) + /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(193), added: 2668, mode: `MaxEncodedLen`) /// Storage: UNKNOWN KEY `0x666f6f` (r:1 w:1) /// Proof: UNKNOWN KEY `0x666f6f` (r:1 w:1) fn migrate_custom_child_fail() -> Weight { // Proof Size summary in bytes: // Measured: `106` - // Estimated: `3640` - // Minimum execution time: 61_575_000 picoseconds. - Weight::from_parts(63_454_000, 3640) + // Estimated: `3658` + // Minimum execution time: 66_988_000 picoseconds. + Weight::from_parts(68_616_000, 3658) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } @@ -229,10 +231,10 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `197 + v * (1 ±0)` // Estimated: `3662 + v * (1 ±0)` - // Minimum execution time: 5_259_000 picoseconds. - Weight::from_parts(5_433_000, 3662) + // Minimum execution time: 5_365_000 picoseconds. + Weight::from_parts(5_460_000, 3662) // Standard Error: 1 - .saturating_add(Weight::from_parts(1_159, 0).saturating_mul(v.into())) + .saturating_add(Weight::from_parts(1_150, 0).saturating_mul(v.into())) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) .saturating_add(Weight::from_parts(0, 1).saturating_mul(v.into())) diff --git a/substrate/frame/statement/Cargo.toml b/substrate/frame/statement/Cargo.toml index 58f8b40dc26d0ee45ebec7b9ab018b4f9b0debd3..92bc32191ab84d41e9dd18ef5f3863d2c5502edd 100644 --- a/substrate/frame/statement/Cargo.toml +++ b/substrate/frame/statement/Cargo.toml @@ -16,7 +16,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } frame-support = { path = "../support", default-features = false } frame-system = { path = "../system", default-features = false } sp-statement-store = { path = "../../primitives/statement-store", default-features = false } @@ -25,7 +25,7 @@ sp-runtime = { path = "../../primitives/runtime", default-features = false } sp-std = { path = "../../primitives/std", default-features = false } sp-io = { path = "../../primitives/io", default-features = false } sp-core = { path = "../../primitives/core", default-features = false } -log = { version = "0.4.17", default-features = false } +log = { workspace = true } [dev-dependencies] pallet-balances = { path = "../balances" } diff --git a/substrate/frame/statement/src/mock.rs b/substrate/frame/statement/src/mock.rs index c5bee2639dcd704acdbec7e6dd6bae1c922e67d2..35d51e7a27bfc82e82d9b0b19220c31816c27e37 100644 --- a/substrate/frame/statement/src/mock.rs +++ b/substrate/frame/statement/src/mock.rs @@ -22,14 +22,10 @@ use super::*; use crate as pallet_statement; use frame_support::{ derive_impl, ord_parameter_types, - traits::{ConstU32, ConstU64, Everything}, - weights::constants::RocksDbWeight, -}; -use sp_core::{Pair, H256}; -use sp_runtime::{ - traits::{BlakeTwo256, IdentityLookup}, - AccountId32, BuildStorage, + traits::{ConstU32, ConstU64}, }; +use sp_core::Pair; +use sp_runtime::{traits::IdentityLookup, AccountId32, BuildStorage}; type Block = frame_system::mocking::MockBlock; @@ -47,31 +43,12 @@ frame_support::construct_runtime!( } ); -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { - type BaseCallFilter = Everything; - type BlockWeights = (); - type BlockLength = (); - type DbWeight = RocksDbWeight; - type RuntimeOrigin = RuntimeOrigin; - type RuntimeCall = RuntimeCall; - type Nonce = u64; - type Hash = H256; - type Hashing = BlakeTwo256; type AccountId = AccountId32; type Lookup = IdentityLookup; type Block = Block; - type RuntimeEvent = RuntimeEvent; - type BlockHashCount = ConstU64<250>; - type Version = (); - type PalletInfo = PalletInfo; type AccountData = pallet_balances::AccountData; - type OnNewAccount = (); - type OnKilledAccount = (); - type SystemWeightInfo = (); - type SS58Prefix = (); - type OnSetCode = (); - type MaxConsumers = ConstU32<16>; } impl pallet_balances::Config for Test { diff --git a/substrate/frame/sudo/Cargo.toml b/substrate/frame/sudo/Cargo.toml index 409104aeca111866c2d8023763ec4a2e47de8a3c..805f46a77f2eb0c3f7433a83659972a9d7da65c7 100644 --- a/substrate/frame/sudo/Cargo.toml +++ b/substrate/frame/sudo/Cargo.toml @@ -18,14 +18,14 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } frame-benchmarking = { path = "../benchmarking", default-features = false, optional = true } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } frame-support = { path = "../support", default-features = false } frame-system = { path = "../system", default-features = false } sp-io = { path = "../../primitives/io", default-features = false } sp-runtime = { path = "../../primitives/runtime", default-features = false } sp-std = { path = "../../primitives/std", default-features = false } -docify = "0.2.7" +docify = "0.2.8" [dev-dependencies] sp-core = { path = "../../primitives/core" } diff --git a/substrate/frame/sudo/src/extension.rs b/substrate/frame/sudo/src/extension.rs index c717ff3567268ae7bf868120d6411d1abe63c712..e90286e5a7c6bae73794bae7efd5fda4a496bb25 100644 --- a/substrate/frame/sudo/src/extension.rs +++ b/substrate/frame/sudo/src/extension.rs @@ -15,7 +15,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -use crate::{Config, Pallet}; +use crate::{Config, Key}; use codec::{Decode, Encode}; use frame_support::{dispatch::DispatchInfo, ensure}; use scale_info::TypeInfo; @@ -86,7 +86,7 @@ where info: &DispatchInfoOf, _len: usize, ) -> TransactionValidity { - let sudo_key: T::AccountId = >::key().ok_or(UnknownTransaction::CannotLookup)?; + let sudo_key: T::AccountId = Key::::get().ok_or(UnknownTransaction::CannotLookup)?; ensure!(*who == sudo_key, InvalidTransaction::BadSigner); Ok(ValidTransaction { diff --git a/substrate/frame/sudo/src/lib.rs b/substrate/frame/sudo/src/lib.rs index 4f14c32ff76b0e0038597c9d715d632985eceeea..63b68e694307ecb4ee3986118f780df1ae49f609 100644 --- a/substrate/frame/sudo/src/lib.rs +++ b/substrate/frame/sudo/src/lib.rs @@ -38,7 +38,7 @@ //! In Substrate blockchains, pallets may contain dispatchable calls that can only be called at //! the system level of the chain (i.e. dispatchables that require a `Root` origin). //! Setting a privileged account, called the _sudo key_, allows you to make such calls as an -//! extrinisic. +//! extrinsic. //! //! Here's an example of a privileged function in another pallet: //! @@ -156,7 +156,7 @@ pub mod pallet { /// Default prelude sensible to be used in a testing environment. pub struct TestDefaultConfig; - #[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig, no_aggregated_types)] + #[derive_impl(frame_system::config_preludes::TestDefaultConfig, no_aggregated_types)] impl frame_system::DefaultConfig for TestDefaultConfig {} #[frame_support::register_default_impl(TestDefaultConfig)] @@ -329,7 +329,6 @@ pub mod pallet { /// The `AccountId` of the sudo key. #[pallet::storage] - #[pallet::getter(fn key)] pub(super) type Key = StorageValue<_, T::AccountId, OptionQuery>; #[pallet::genesis_config] @@ -352,7 +351,7 @@ pub mod pallet { let sender = ensure_signed_or_root(origin)?; if let Some(sender) = sender { - if Self::key().map_or(false, |k| k == sender) { + if Key::::get().map_or(false, |k| k == sender) { Ok(()) } else { Err(Error::::RequireSudo.into()) diff --git a/substrate/frame/sudo/src/mock.rs b/substrate/frame/sudo/src/mock.rs index 9ad14804524a9400fa5e876aa9119d44ee45857c..a3a786c4af3924a4477823018a6400090b316c57 100644 --- a/substrate/frame/sudo/src/mock.rs +++ b/substrate/frame/sudo/src/mock.rs @@ -19,16 +19,9 @@ use super::*; use crate as sudo; -use frame_support::{ - derive_impl, - traits::{ConstU32, Contains}, -}; -use sp_core::{ConstU64, H256}; +use frame_support::{derive_impl, traits::Contains}; use sp_io; -use sp_runtime::{ - traits::{BlakeTwo256, IdentityLookup}, - BuildStorage, -}; +use sp_runtime::BuildStorage; // Logger module to track execution. #[frame_support::pallet] @@ -111,31 +104,9 @@ impl Contains for BlockEverything { } } -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { - type BaseCallFilter = BlockEverything; - type BlockWeights = (); - type BlockLength = (); - type DbWeight = (); - type RuntimeOrigin = RuntimeOrigin; - type RuntimeCall = RuntimeCall; - type Nonce = u64; - type Hash = H256; - type Hashing = BlakeTwo256; - type AccountId = u64; - type Lookup = IdentityLookup; type Block = Block; - type RuntimeEvent = RuntimeEvent; - type BlockHashCount = ConstU64<250>; - type Version = (); - type PalletInfo = PalletInfo; - type AccountData = (); - type OnNewAccount = (); - type OnKilledAccount = (); - type SystemWeightInfo = (); - type SS58Prefix = (); - type OnSetCode = (); - type MaxConsumers = ConstU32<16>; } // Implement the logger module's `Config` on the Test runtime. diff --git a/substrate/frame/sudo/src/tests.rs b/substrate/frame/sudo/src/tests.rs index 73689415a737fd3e2acba663099f9042f88ace4c..00bb86cc2686f2410d09077d9b388750914eb74c 100644 --- a/substrate/frame/sudo/src/tests.rs +++ b/substrate/frame/sudo/src/tests.rs @@ -28,7 +28,7 @@ use mock::{ fn test_setup_works() { // Environment setup, logger storage, and sudo `key` retrieval should work as expected. new_test_ext(1).execute_with(|| { - assert_eq!(Sudo::key(), Some(1u64)); + assert_eq!(Key::::get(), Some(1u64)); assert!(Logger::i32_log().is_empty()); assert!(Logger::account_log().is_empty()); }); @@ -135,7 +135,7 @@ fn set_key_basics() { new_test_ext(1).execute_with(|| { // A root `key` can change the root `key` assert_ok!(Sudo::set_key(RuntimeOrigin::signed(1), 2)); - assert_eq!(Sudo::key(), Some(2u64)); + assert_eq!(Key::::get(), Some(2u64)); }); new_test_ext(1).execute_with(|| { @@ -161,7 +161,7 @@ fn set_key_emits_events_correctly() { fn remove_key_works() { new_test_ext(1).execute_with(|| { assert_ok!(Sudo::remove_key(RuntimeOrigin::signed(1))); - assert!(Sudo::key().is_none()); + assert!(Key::::get().is_none()); System::assert_has_event(TestEvent::Sudo(Event::KeyRemoved {})); assert_noop!(Sudo::remove_key(RuntimeOrigin::signed(1)), Error::::RequireSudo); @@ -173,11 +173,11 @@ fn remove_key_works() { fn using_root_origin_works() { new_test_ext(1).execute_with(|| { assert_ok!(Sudo::remove_key(RuntimeOrigin::root())); - assert!(Sudo::key().is_none()); + assert!(Key::::get().is_none()); System::assert_has_event(TestEvent::Sudo(Event::KeyRemoved {})); assert_ok!(Sudo::set_key(RuntimeOrigin::root(), 1)); - assert_eq!(Some(1), Sudo::key()); + assert_eq!(Some(1), Key::::get()); }); } diff --git a/substrate/frame/sudo/src/weights.rs b/substrate/frame/sudo/src/weights.rs index 10d1a9f7a513b7ae98947e27832842a42ab0c589..c166ab442d7320cee6a435d21e1c01e1b6425645 100644 --- a/substrate/frame/sudo/src/weights.rs +++ b/substrate/frame/sudo/src/weights.rs @@ -17,26 +17,28 @@ //! Autogenerated weights for `pallet_sudo` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-11-07, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-04-09, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-yprdrvc7-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! HOSTNAME: `runner-anb7yjbi-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: `1024` // Executed Command: -// target/production/substrate-node +// ./target/production/substrate-node // benchmark // pallet +// --chain=dev // --steps=50 // --repeat=20 +// --pallet=pallet_sudo +// --no-storage-info +// --no-median-slopes +// --no-min-squares // --extrinsic=* // --wasm-execution=compiled // --heap-pages=4096 -// --json-file=/builds/parity/mirrors/polkadot-sdk/.git/.artifacts/bench.json -// --pallet=pallet_sudo -// --chain=dev -// --header=./substrate/HEADER-APACHE2 // --output=./substrate/frame/sudo/src/weights.rs +// --header=./substrate/HEADER-APACHE2 // --template=./substrate/.maintain/frame-weight-template.hbs #![cfg_attr(rustfmt, rustfmt_skip)] @@ -64,8 +66,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `165` // Estimated: `1517` - // Minimum execution time: 9_600_000 picoseconds. - Weight::from_parts(10_076_000, 1517) + // Minimum execution time: 9_486_000 picoseconds. + Weight::from_parts(9_663_000, 1517) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -75,8 +77,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `165` // Estimated: `1517` - // Minimum execution time: 10_453_000 picoseconds. - Weight::from_parts(10_931_000, 1517) + // Minimum execution time: 10_501_000 picoseconds. + Weight::from_parts(10_729_000, 1517) .saturating_add(T::DbWeight::get().reads(1_u64)) } /// Storage: `Sudo::Key` (r:1 w:0) @@ -85,8 +87,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `165` // Estimated: `1517` - // Minimum execution time: 10_202_000 picoseconds. - Weight::from_parts(10_800_000, 1517) + // Minimum execution time: 10_742_000 picoseconds. + Weight::from_parts(11_003_000, 1517) .saturating_add(T::DbWeight::get().reads(1_u64)) } /// Storage: `Sudo::Key` (r:1 w:1) @@ -95,8 +97,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `165` // Estimated: `1517` - // Minimum execution time: 8_555_000 picoseconds. - Weight::from_parts(8_846_000, 1517) + // Minimum execution time: 8_837_000 picoseconds. + Weight::from_parts(9_127_000, 1517) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -110,8 +112,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `165` // Estimated: `1517` - // Minimum execution time: 9_600_000 picoseconds. - Weight::from_parts(10_076_000, 1517) + // Minimum execution time: 9_486_000 picoseconds. + Weight::from_parts(9_663_000, 1517) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -121,8 +123,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `165` // Estimated: `1517` - // Minimum execution time: 10_453_000 picoseconds. - Weight::from_parts(10_931_000, 1517) + // Minimum execution time: 10_501_000 picoseconds. + Weight::from_parts(10_729_000, 1517) .saturating_add(RocksDbWeight::get().reads(1_u64)) } /// Storage: `Sudo::Key` (r:1 w:0) @@ -131,8 +133,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `165` // Estimated: `1517` - // Minimum execution time: 10_202_000 picoseconds. - Weight::from_parts(10_800_000, 1517) + // Minimum execution time: 10_742_000 picoseconds. + Weight::from_parts(11_003_000, 1517) .saturating_add(RocksDbWeight::get().reads(1_u64)) } /// Storage: `Sudo::Key` (r:1 w:1) @@ -141,8 +143,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `165` // Estimated: `1517` - // Minimum execution time: 8_555_000 picoseconds. - Weight::from_parts(8_846_000, 1517) + // Minimum execution time: 8_837_000 picoseconds. + Weight::from_parts(9_127_000, 1517) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } diff --git a/substrate/frame/support/Cargo.toml b/substrate/frame/support/Cargo.toml index ad97ad5146e7698dfe0dbac8331e089d093abc6f..ecdd93826327798a76b36a54dc6ad0a2b0106c24 100644 --- a/substrate/frame/support/Cargo.toml +++ b/substrate/frame/support/Cargo.toml @@ -17,14 +17,25 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] array-bytes = { version = "6.1", default-features = false } -serde = { version = "1.0.195", default-features = false, features = ["alloc", "derive"] } -codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive", "max-encoded-len"] } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -frame-metadata = { version = "16.0.0", default-features = false, features = ["current"] } -sp-api = { path = "../../primitives/api", default-features = false, features = ["frame-metadata"] } +serde = { features = ["alloc", "derive"], workspace = true } +codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = [ + "derive", + "max-encoded-len", +] } +scale-info = { version = "2.11.1", default-features = false, features = [ + "derive", +] } +frame-metadata = { version = "16.0.0", default-features = false, features = [ + "current", +] } +sp-api = { path = "../../primitives/api", default-features = false, features = [ + "frame-metadata", +] } sp-std = { path = "../../primitives/std", default-features = false } sp-io = { path = "../../primitives/io", default-features = false } -sp-runtime = { path = "../../primitives/runtime", default-features = false, features = ["serde"] } +sp-runtime = { path = "../../primitives/runtime", default-features = false, features = [ + "serde", +] } sp-tracing = { path = "../../primitives/tracing", default-features = false } sp-core = { path = "../../primitives/core", default-features = false } sp-arithmetic = { path = "../../primitives/arithmetic", default-features = false } @@ -41,13 +52,13 @@ sp-state-machine = { path = "../../primitives/state-machine", default-features = bitflags = "1.3" impl-trait-for-tuples = "0.2.2" smallvec = "1.11.0" -log = { version = "0.4.17", default-features = false } +log = { workspace = true } sp-crypto-hashing-proc-macro = { path = "../../primitives/crypto/hashing/proc-macro" } k256 = { version = "0.13.1", default-features = false, features = ["ecdsa"] } environmental = { version = "1.1.4", default-features = false } sp-genesis-builder = { path = "../../primitives/genesis-builder", default-features = false } -serde_json = { version = "1.0.111", default-features = false, features = ["alloc"] } -docify = "0.2.7" +serde_json = { features = ["alloc"], workspace = true } +docify = "0.2.8" static_assertions = "1.1.0" aquamarine = { version = "0.5.0" } @@ -55,6 +66,7 @@ aquamarine = { version = "0.5.0" } [dev-dependencies] assert_matches = "1.3.0" pretty_assertions = "1.2.1" +sp-timestamp = { path = "../../primitives/timestamp", default-features = false } frame-system = { path = "../system" } sp-crypto-hashing = { path = "../../primitives/crypto/hashing" } @@ -83,6 +95,7 @@ std = [ "sp-staking/std", "sp-state-machine/std", "sp-std/std", + "sp-timestamp/std", "sp-tracing/std", "sp-weights/std", ] @@ -96,7 +109,9 @@ try-runtime = [ "sp-debug-derive/force-debug", "sp-runtime/try-runtime", ] -experimental = [] +experimental = [ + "frame-support-procedural/experimental", +] # By default some types have documentation, `no-metadata-docs` allows to reduce the documentation # in the metadata. no-metadata-docs = [ diff --git a/substrate/frame/support/procedural/Cargo.toml b/substrate/frame/support/procedural/Cargo.toml index d77f6595db3360fa4f60362cd9bff49feb9727e7..9f8727f7adef58b68876dadc8907877c886d2d5d 100644 --- a/substrate/frame/support/procedural/Cargo.toml +++ b/substrate/frame/support/procedural/Cargo.toml @@ -18,13 +18,13 @@ targets = ["x86_64-unknown-linux-gnu"] proc-macro = true [dependencies] -derive-syn-parse = "0.1.5" +derive-syn-parse = "0.2.0" Inflector = "0.11.4" cfg-expr = "0.15.5" itertools = "0.10.3" proc-macro2 = "1.0.56" -quote = "1.0.28" -syn = { version = "2.0.48", features = ["full"] } +quote = { workspace = true } +syn = { features = ["full", "visit-mut"], workspace = true } frame-support-procedural-tools = { path = "tools" } macro_magic = { version = "0.5.0", features = ["proc_support"] } proc-macro-warning = { version = "1.0.0", default-features = false } @@ -38,6 +38,7 @@ regex = "1" default = ["std"] std = ["sp-crypto-hashing/std"] no-metadata-docs = [] +experimental = [] # Generate impl-trait for tuples with the given number of tuples. Will be needed as the number of # pallets in a runtime grows. Does increase the compile time! tuples-96 = [] diff --git a/substrate/frame/support/procedural/src/benchmark.rs b/substrate/frame/support/procedural/src/benchmark.rs index 6ded82d91aa5cd9bb9cceb4594ae9768d4948483..6ba7ad058297fd36578a40f402764b4c40a0954f 100644 --- a/substrate/frame/support/procedural/src/benchmark.rs +++ b/substrate/frame/support/procedural/src/benchmark.rs @@ -40,10 +40,14 @@ mod keywords { custom_keyword!(benchmarks); custom_keyword!(block); custom_keyword!(extra); + custom_keyword!(pov_mode); custom_keyword!(extrinsic_call); custom_keyword!(skip_meta); custom_keyword!(BenchmarkError); custom_keyword!(Result); + custom_keyword!(MaxEncodedLen); + custom_keyword!(Measured); + custom_keyword!(Ignored); pub const BENCHMARK_TOKEN: &str = stringify!(benchmark); pub const BENCHMARKS_TOKEN: &str = stringify!(benchmarks); @@ -65,6 +69,7 @@ struct RangeArgs { start: syn::GenericArgument, _comma: Comma, end: syn::GenericArgument, + _trailing_comma: Option, _gt_token: Gt, } @@ -72,51 +77,158 @@ struct RangeArgs { struct BenchmarkAttrs { skip_meta: bool, extra: bool, + pov_mode: Option, } /// Represents a single benchmark option -enum BenchmarkAttrKeyword { +enum BenchmarkAttr { Extra, SkipMeta, + /// How the PoV should be measured. + PoV(PovModeAttr), } -impl syn::parse::Parse for BenchmarkAttrKeyword { +impl syn::parse::Parse for PovModeAttr { + fn parse(input: ParseStream) -> Result { + let _pov: keywords::pov_mode = input.parse()?; + let _eq: Token![=] = input.parse()?; + let root = PovEstimationMode::parse(input)?; + + let mut maybe_content = None; + let _ = || -> Result<()> { + let content; + syn::braced!(content in input); + maybe_content = Some(content); + Ok(()) + }(); + + let per_key = match maybe_content { + Some(content) => { + let per_key = Punctuated::::parse_terminated(&content)?; + per_key.into_iter().collect() + }, + None => Vec::new(), + }; + + Ok(Self { root, per_key }) + } +} + +impl syn::parse::Parse for BenchmarkAttr { fn parse(input: ParseStream) -> Result { let lookahead = input.lookahead1(); if lookahead.peek(keywords::extra) { let _extra: keywords::extra = input.parse()?; - return Ok(BenchmarkAttrKeyword::Extra) + Ok(BenchmarkAttr::Extra) } else if lookahead.peek(keywords::skip_meta) { let _skip_meta: keywords::skip_meta = input.parse()?; - return Ok(BenchmarkAttrKeyword::SkipMeta) + Ok(BenchmarkAttr::SkipMeta) + } else if lookahead.peek(keywords::pov_mode) { + PovModeAttr::parse(input).map(BenchmarkAttr::PoV) + } else { + Err(lookahead.error()) + } + } +} + +/// A `#[pov_mode = .. { .. }]` attribute. +#[derive(Debug, Clone)] +struct PovModeAttr { + /// The root mode for this benchmarks. + root: PovEstimationMode, + /// The pov-mode for a specific key. This overwrites `root` for this key. + per_key: Vec, +} + +/// A single key-value pair inside the `{}` of a `#[pov_mode = .. { .. }]` attribute. +#[derive(Debug, Clone, derive_syn_parse::Parse)] +struct PovModeKeyAttr { + /// A specific storage key for which to set the PoV mode. + key: Path, + _underscore: Token![:], + /// The PoV mode for this key. + mode: PovEstimationMode, +} + +/// How the PoV should be estimated. +#[derive(Debug, Eq, PartialEq, Clone, Copy)] +pub enum PovEstimationMode { + /// Use the maximal encoded length as provided by [`codec::MaxEncodedLen`]. + MaxEncodedLen, + /// Measure the accessed value size in the pallet benchmarking and add some trie overhead. + Measured, + /// Do not estimate the PoV size for this storage item or benchmark. + Ignored, +} + +impl syn::parse::Parse for PovEstimationMode { + fn parse(input: ParseStream) -> Result { + let lookahead = input.lookahead1(); + if lookahead.peek(keywords::MaxEncodedLen) { + let _max_encoded_len: keywords::MaxEncodedLen = input.parse()?; + return Ok(PovEstimationMode::MaxEncodedLen) + } else if lookahead.peek(keywords::Measured) { + let _measured: keywords::Measured = input.parse()?; + return Ok(PovEstimationMode::Measured) + } else if lookahead.peek(keywords::Ignored) { + let _ignored: keywords::Ignored = input.parse()?; + return Ok(PovEstimationMode::Ignored) } else { return Err(lookahead.error()) } } } +impl ToString for PovEstimationMode { + fn to_string(&self) -> String { + match self { + PovEstimationMode::MaxEncodedLen => "MaxEncodedLen".into(), + PovEstimationMode::Measured => "Measured".into(), + PovEstimationMode::Ignored => "Ignored".into(), + } + } +} + +impl quote::ToTokens for PovEstimationMode { + fn to_tokens(&self, tokens: &mut TokenStream2) { + match self { + PovEstimationMode::MaxEncodedLen => tokens.extend(quote!(MaxEncodedLen)), + PovEstimationMode::Measured => tokens.extend(quote!(Measured)), + PovEstimationMode::Ignored => tokens.extend(quote!(Ignored)), + } + } +} + impl syn::parse::Parse for BenchmarkAttrs { fn parse(input: ParseStream) -> syn::Result { let mut extra = false; let mut skip_meta = false; - let args = Punctuated::::parse_terminated(&input)?; + let mut pov_mode = None; + let args = Punctuated::::parse_terminated(&input)?; + for arg in args.into_iter() { match arg { - BenchmarkAttrKeyword::Extra => { + BenchmarkAttr::Extra => { if extra { return Err(input.error("`extra` can only be specified once")) } extra = true; }, - BenchmarkAttrKeyword::SkipMeta => { + BenchmarkAttr::SkipMeta => { if skip_meta { return Err(input.error("`skip_meta` can only be specified once")) } skip_meta = true; }, + BenchmarkAttr::PoV(mode) => { + if pov_mode.is_some() { + return Err(input.error("`pov_mode` can only be specified once")) + } + pov_mode = Some(mode); + }, } } - Ok(BenchmarkAttrs { extra, skip_meta }) + Ok(BenchmarkAttrs { extra, skip_meta, pov_mode }) } } @@ -137,7 +249,7 @@ impl BenchmarkCallDef { } } -/// Represents a parsed `#[benchmark]` or `#[instance_banchmark]` item. +/// Represents a parsed `#[benchmark]` or `#[instance_benchmark]` item. #[derive(Clone)] struct BenchmarkDef { params: Vec, @@ -191,6 +303,24 @@ fn ensure_valid_return_type(item_fn: &ItemFn) -> Result<()> { Ok(()) } +/// Ensure that the passed statements do not contain any forbidden variable names +fn ensure_no_forbidden_variable_names(stmts: &[Stmt]) -> Result<()> { + const FORBIDDEN_VAR_NAMES: [&str; 2] = ["recording", "verify"]; + for stmt in stmts { + let Stmt::Local(l) = stmt else { continue }; + let Pat::Ident(ident) = &l.pat else { continue }; + if FORBIDDEN_VAR_NAMES.contains(&ident.ident.to_string().as_str()) { + return Err(Error::new( + ident.span(), + format!( + "Variables {FORBIDDEN_VAR_NAMES:?} are reserved for benchmarking internals.", + ), + )); + } + } + Ok(()) +} + /// Parses params such as `x: Linear<0, 1>` fn parse_params(item_fn: &ItemFn) -> Result> { let mut params: Vec = Vec::new(); @@ -324,9 +454,12 @@ impl BenchmarkDef { }, }; + let setup_stmts = Vec::from(&item_fn.block.stmts[0..i]); + ensure_no_forbidden_variable_names(&setup_stmts)?; + Ok(BenchmarkDef { params, - setup_stmts: Vec::from(&item_fn.block.stmts[0..i]), + setup_stmts, call_def, verify_stmts, last_stmt, @@ -343,6 +476,7 @@ pub fn benchmarks( tokens: TokenStream, instance: bool, ) -> syn::Result { + let krate = generate_access_from_frame_or_crate("frame-benchmarking")?; // gather module info let module: ItemMod = syn::parse(tokens)?; let mod_span = module.span(); @@ -353,7 +487,7 @@ pub fn benchmarks( let mod_vis = module.vis; let mod_name = module.ident; - // consume #[benchmarks] attribute by exclusing it from mod_attrs + // consume #[benchmarks] attribute by excluding it from mod_attrs let mod_attrs: Vec<&Attribute> = module .attrs .iter() @@ -363,6 +497,8 @@ pub fn benchmarks( let mut benchmark_names: Vec = Vec::new(); let mut extra_benchmark_names: Vec = Vec::new(); let mut skip_meta_benchmark_names: Vec = Vec::new(); + // Map benchmarks to PoV modes. + let mut pov_modes = Vec::new(); let (_brace, mut content) = module.content.ok_or(syn::Error::new(mod_span, "Module cannot be empty!"))?; @@ -399,6 +535,25 @@ pub fn benchmarks( } else if benchmark_attrs.skip_meta { skip_meta_benchmark_names.push(name.clone()); } + + if let Some(mode) = benchmark_attrs.pov_mode { + let mut modes = Vec::new(); + // We cannot expand strings here since it is no-std, but syn does not expand bytes. + let name = name.to_string(); + let m = mode.root.to_string(); + modes.push(quote!(("ALL".as_bytes().to_vec(), #m.as_bytes().to_vec()))); + + for attr in mode.per_key.iter() { + // syn always puts spaces in quoted paths: + let key = attr.key.clone().into_token_stream().to_string().replace(" ", ""); + let mode = attr.mode.to_string(); + modes.push(quote!((#key.as_bytes().to_vec(), #mode.as_bytes().to_vec()))); + } + + pov_modes.push( + quote!((#name.as_bytes().to_vec(), #krate::__private::vec![#(#modes),*])), + ); + } } // expand benchmark @@ -418,7 +573,6 @@ pub fn benchmarks( true => quote!(T: Config, I: 'static), }; - let krate = generate_access_from_frame_or_crate("frame-benchmarking")?; let frame_system = generate_access_from_frame_or_crate("frame-system")?; // benchmark name variables @@ -431,7 +585,7 @@ pub fn benchmarks( let mut benchmarks_by_name_mappings: Vec = Vec::new(); let test_idents: Vec = benchmark_names_str .iter() - .map(|n| Ident::new(format!("test_{}", n).as_str(), Span::call_site())) + .map(|n| Ident::new(format!("test_benchmark_{}", n).as_str(), Span::call_site())) .collect(); for i in 0..benchmark_names.len() { let name_ident = &benchmark_names[i]; @@ -441,6 +595,37 @@ pub fn benchmarks( benchmarks_by_name_mappings.push(quote!(#name_str => Self::#test_ident())) } + let impl_test_function = content + .iter_mut() + .find_map(|item| { + let Item::Macro(item_macro) = item else { + return None; + }; + + if !item_macro + .mac + .path + .segments + .iter() + .any(|s| s.ident == "impl_benchmark_test_suite") + { + return None; + } + + let tokens = item_macro.mac.tokens.clone(); + *item = Item::Verbatim(quote! {}); + + Some(quote! { + impl_test_function!( + (#( {} #benchmark_names )*) + (#( #extra_benchmark_names )*) + (#( #skip_meta_benchmark_names )*) + #tokens + ); + }) + }) + .unwrap_or(quote! {}); + // emit final quoted tokens let res = quote! { #(#mod_attrs) @@ -469,18 +654,16 @@ pub fn benchmarks( fn instance( &self, + recording: &mut impl #krate::Recording, components: &[(#krate::BenchmarkParameter, u32)], verify: bool, - ) -> Result< - #krate::__private::Box Result<(), #krate::BenchmarkError>>, - #krate::BenchmarkError, - > { + ) -> Result<(), #krate::BenchmarkError> { match self { #( Self::#benchmark_names => { <#benchmark_names as #krate::BenchmarkingSetup< #type_use_generics - >>::instance(&#benchmark_names, components, verify) + >>::instance(&#benchmark_names, recording, components, verify) } ) * @@ -505,6 +688,16 @@ pub fn benchmarks( ]; all_names.retain(|x| !extra.contains(x)); } + let pov_modes: + #krate::__private::Vec<( + #krate::__private::Vec, + #krate::__private::Vec<( + #krate::__private::Vec, + #krate::__private::Vec + )>, + )> = #krate::__private::vec![ + #( #pov_modes ),* + ]; all_names.into_iter().map(|benchmark| { let selected_benchmark = match benchmark { #(#selected_benchmark_mappings), @@ -512,12 +705,13 @@ pub fn benchmarks( _ => panic!("all benchmarks should be selectable") }; let components = >::components(&selected_benchmark); + let name = benchmark.as_bytes().to_vec(); + let modes = pov_modes.iter().find(|p| p.0 == name).map(|p| p.1.clone()); + #krate::BenchmarkMetadata { name: benchmark.as_bytes().to_vec(), components, - // TODO: Not supported by V2 syntax as of yet. - // https://github.com/paritytech/substrate/issues/13132 - pov_modes: #krate::__private::vec![], + pov_modes: modes.unwrap_or_default(), } }).collect::<#krate::__private::Vec<_>>() } @@ -560,17 +754,7 @@ pub fn benchmarks( #krate::benchmarking::set_whitelist(whitelist.clone()); let mut results: #krate::__private::Vec<#krate::BenchmarkResult> = #krate::__private::Vec::new(); - // Always do at least one internal repeat... - for _ in 0 .. internal_repeats.max(1) { - // Always reset the state after the benchmark. - #krate::__private::defer!(#krate::benchmarking::wipe_db()); - - // Set up the externalities environment for the setup we want to - // benchmark. - let closure_to_benchmark = < - SelectedBenchmark as #krate::BenchmarkingSetup<#type_use_generics> - >::instance(&selected_benchmark, c, verify)?; - + let on_before_start = || { // Set the block number to at least 1 so events are deposited. if #krate::__private::Zero::is_zero(&#frame_system::Pallet::::block_number()) { #frame_system::Pallet::::set_block_number(1u32.into()); @@ -588,6 +772,12 @@ pub fn benchmarks( // Reset the read/write counter so we don't count operations in the setup process. #krate::benchmarking::reset_read_write_count(); + }; + + // Always do at least one internal repeat... + for _ in 0 .. internal_repeats.max(1) { + // Always reset the state after the benchmark. + #krate::__private::defer!(#krate::benchmarking::wipe_db()); // Time the extrinsic logic. #krate::__private::log::trace!( @@ -597,20 +787,12 @@ pub fn benchmarks( c ); - let start_pov = #krate::benchmarking::proof_size(); - let start_extrinsic = #krate::benchmarking::current_time(); - - closure_to_benchmark()?; - - let finish_extrinsic = #krate::benchmarking::current_time(); - let end_pov = #krate::benchmarking::proof_size(); + let mut recording = #krate::BenchmarkRecording::new(&on_before_start); + >::instance(&selected_benchmark, &mut recording, c, verify)?; // Calculate the diff caused by the benchmark. - let elapsed_extrinsic = finish_extrinsic.saturating_sub(start_extrinsic); - let diff_pov = match (start_pov, end_pov) { - (Some(start), Some(end)) => end.saturating_sub(start), - _ => Default::default(), - }; + let elapsed_extrinsic = recording.elapsed_extrinsic().expect("elapsed time should be recorded"); + let diff_pov = recording.diff_pov().unwrap_or_default(); // Commit the changes to get proper write count #krate::benchmarking::commit_db(); @@ -676,6 +858,8 @@ pub fn benchmarks( } } } + + #impl_test_function } #mod_vis use #mod_name::*; }; @@ -733,7 +917,8 @@ fn expand_benchmark( let setup_stmts = benchmark_def.setup_stmts; let verify_stmts = benchmark_def.verify_stmts; let last_stmt = benchmark_def.last_stmt; - let test_ident = Ident::new(format!("test_{}", name.to_string()).as_str(), Span::call_site()); + let test_ident = + Ident::new(format!("test_benchmark_{}", name.to_string()).as_str(), Span::call_site()); // unroll params (prepare for quoting) let unrolled = UnrolledParams::from(&benchmark_def.params); @@ -908,9 +1093,10 @@ fn expand_benchmark( fn instance( &self, + recording: &mut impl #krate::Recording, components: &[(#krate::BenchmarkParameter, u32)], verify: bool - ) -> Result<#krate::__private::Box Result<(), #krate::BenchmarkError>>, #krate::BenchmarkError> { + ) -> Result<(), #krate::BenchmarkError> { #( // prepare instance #param_names let #param_names = components.iter() @@ -924,15 +1110,15 @@ fn expand_benchmark( #setup_stmts )* #pre_call - Ok(#krate::__private::Box::new(move || -> Result<(), #krate::BenchmarkError> { - #post_call - if verify { - #( - #verify_stmts - )* - } - #impl_last_stmt - })) + recording.start(); + #post_call + recording.stop(); + if verify { + #( + #verify_stmts + )* + } + #impl_last_stmt } } @@ -950,18 +1136,15 @@ fn expand_benchmark( // Always reset the state after the benchmark. #krate::__private::defer!(#krate::benchmarking::wipe_db()); - // Set up the benchmark, return execution + verification function. - let closure_to_verify = < - SelectedBenchmark as #krate::BenchmarkingSetup - >::instance(&selected_benchmark, &c, true)?; - - // Set the block number to at least 1 so events are deposited. - if #krate::__private::Zero::is_zero(&#frame_system::Pallet::::block_number()) { - #frame_system::Pallet::::set_block_number(1u32.into()); - } + let on_before_start = || { + // Set the block number to at least 1 so events are deposited. + if #krate::__private::Zero::is_zero(&#frame_system::Pallet::::block_number()) { + #frame_system::Pallet::::set_block_number(1u32.into()); + } + }; // Run execution + verification - closure_to_verify() + >::test_instance(&selected_benchmark, &c, &on_before_start) }; if components.is_empty() { diff --git a/substrate/frame/support/procedural/src/construct_runtime/expand/call.rs b/substrate/frame/support/procedural/src/construct_runtime/expand/call.rs index ce2aa0942794d40cc3bfe0f4d65fdd80f8140d52..b0041ccc07541966863e51d40f4b6e26e50a396f 100644 --- a/substrate/frame/support/procedural/src/construct_runtime/expand/call.rs +++ b/substrate/frame/support/procedural/src/construct_runtime/expand/call.rs @@ -178,7 +178,7 @@ pub fn expand_outer_dispatch( type PostInfo = #scrate::dispatch::PostDispatchInfo; fn dispatch(self, origin: RuntimeOrigin) -> #scrate::dispatch::DispatchResultWithPostInfo { if !::filter_call(&origin, &self) { - return #scrate::__private::sp_std::result::Result::Err( + return ::core::result::Result::Err( #system_path::Error::<#runtime>::CallFiltered.into() ); } diff --git a/substrate/frame/support/procedural/src/construct_runtime/expand/config.rs b/substrate/frame/support/procedural/src/construct_runtime/expand/config.rs index ffe55bceb80ef96bc9e7814cfbd8bec6c62ab562..dbbe6ba6e6c32ec09a8514033108617883075243 100644 --- a/substrate/frame/support/procedural/src/construct_runtime/expand/config.rs +++ b/substrate/frame/support/procedural/src/construct_runtime/expand/config.rs @@ -76,10 +76,6 @@ pub fn expand_outer_config( #fields } - #[cfg(any(feature = "std", test))] - #[deprecated(note = "GenesisConfig is planned to be removed in December 2023. Use `RuntimeGenesisConfig` instead.")] - pub type GenesisConfig = RuntimeGenesisConfig; - #[cfg(any(feature = "std", test))] impl #scrate::sp_runtime::BuildStorage for RuntimeGenesisConfig { fn assimilate_storage( @@ -99,6 +95,17 @@ pub fn expand_outer_config( ::on_genesis(); } } + + /// Test the `Default` derive impl of the `RuntimeGenesisConfig`. + #[cfg(test)] + #[test] + fn test_genesis_config_builds() { + #scrate::__private::sp_io::TestExternalities::default().execute_with(|| { + ::build( + &RuntimeGenesisConfig::default() + ); + }); + } } } diff --git a/substrate/frame/support/procedural/src/construct_runtime/expand/inherent.rs b/substrate/frame/support/procedural/src/construct_runtime/expand/inherent.rs index 34b9d21d8ce84fafb7958278227a3f572d8d2f74..da483fa6cf0b6aaa724792f724482e88027fa696 100644 --- a/substrate/frame/support/procedural/src/construct_runtime/expand/inherent.rs +++ b/substrate/frame/support/procedural/src/construct_runtime/expand/inherent.rs @@ -204,47 +204,50 @@ pub fn expand_outer_inherent( } } + impl #scrate::traits::IsInherent<<#block as #scrate::sp_runtime::traits::Block>::Extrinsic> for #runtime { + fn is_inherent(ext: &<#block as #scrate::sp_runtime::traits::Block>::Extrinsic) -> bool { + use #scrate::inherent::ProvideInherent; + use #scrate::traits::{IsSubType, ExtrinsicCall}; + + if #scrate::sp_runtime::traits::Extrinsic::is_signed(ext).unwrap_or(false) { + // Signed extrinsics are never inherents. + return false + } + + #( + #pallet_attrs + { + let call = <#unchecked_extrinsic as ExtrinsicCall>::call(ext); + if let Some(call) = IsSubType::<_>::is_sub_type(call) { + if <#pallet_names as ProvideInherent>::is_inherent(&call) { + return true; + } + } + } + )* + false + } + } + impl #scrate::traits::EnsureInherentsAreFirst<#block> for #runtime { - fn ensure_inherents_are_first(block: &#block) -> Result<(), u32> { + fn ensure_inherents_are_first(block: &#block) -> Result { use #scrate::inherent::ProvideInherent; use #scrate::traits::{IsSubType, ExtrinsicCall}; use #scrate::sp_runtime::traits::Block as _; - let mut first_signed_observed = false; + let mut num_inherents = 0u32; for (i, xt) in block.extrinsics().iter().enumerate() { - let is_signed = #scrate::sp_runtime::traits::Extrinsic::is_signed(xt) - .unwrap_or(false); - - let is_inherent = if is_signed { - // Signed extrinsics are not inherents. - false - } else { - let mut is_inherent = false; - #( - #pallet_attrs - { - let call = <#unchecked_extrinsic as ExtrinsicCall>::call(xt); - if let Some(call) = IsSubType::<_>::is_sub_type(call) { - if #pallet_names::is_inherent(&call) { - is_inherent = true; - } - } - } - )* - is_inherent - }; - - if !is_inherent { - first_signed_observed = true; - } + if >::is_inherent(xt) { + if num_inherents != i as u32 { + return Err(i as u32); + } - if first_signed_observed && is_inherent { - return Err(i as u32) + num_inherents += 1; // Safe since we are in an `enumerate` loop. } } - Ok(()) + Ok(num_inherents) } } } diff --git a/substrate/frame/support/procedural/src/construct_runtime/expand/origin.rs b/substrate/frame/support/procedural/src/construct_runtime/expand/origin.rs index b421d2aaffabe077450d81e3396976f3067b264a..83049919d01c34f05ce7be6725ab8bc60731f47b 100644 --- a/substrate/frame/support/procedural/src/construct_runtime/expand/origin.rs +++ b/substrate/frame/support/procedural/src/construct_runtime/expand/origin.rs @@ -104,7 +104,7 @@ pub fn expand_outer_origin( #[doc = #doc_string] #[derive(Clone)] pub struct RuntimeOrigin { - caller: OriginCaller, + pub caller: OriginCaller, filter: #scrate::__private::sp_std::rc::Rc::RuntimeCall) -> bool>>, } diff --git a/substrate/frame/support/procedural/src/construct_runtime/expand/outer_enums.rs b/substrate/frame/support/procedural/src/construct_runtime/expand/outer_enums.rs index df69c19a4b617bbe7194bb5958848fc04d8d546a..80b242ccbe493607a59e672b7f0958fc9d0a213c 100644 --- a/substrate/frame/support/procedural/src/construct_runtime/expand/outer_enums.rs +++ b/substrate/frame/support/procedural/src/construct_runtime/expand/outer_enums.rs @@ -134,7 +134,6 @@ pub fn expand_outer_enum( enum_ty, )); enum_conversions.extend(expand_enum_conversion( - scrate, pallet_decl, &pallet_enum, &enum_name_ident, @@ -220,7 +219,6 @@ fn expand_enum_variant( } fn expand_enum_conversion( - scrate: &TokenStream, pallet: &Pallet, pallet_enum: &TokenStream, enum_name_ident: &Ident, @@ -247,7 +245,7 @@ fn expand_enum_conversion( impl TryInto<#pallet_enum> for #enum_name_ident { type Error = (); - fn try_into(self) -> #scrate::__private::sp_std::result::Result<#pallet_enum, Self::Error> { + fn try_into(self) -> ::core::result::Result<#pallet_enum, Self::Error> { match self { Self::#variant_name(evt) => Ok(evt), _ => Err(()), diff --git a/substrate/frame/support/procedural/src/construct_runtime/mod.rs b/substrate/frame/support/procedural/src/construct_runtime/mod.rs index 54ed15f7b1d36d6ee5eb724381152af03bef60c8..b083abbb2a8db65e1abd1f0cc2e4a15dbd922e2d 100644 --- a/substrate/frame/support/procedural/src/construct_runtime/mod.rs +++ b/substrate/frame/support/procedural/src/construct_runtime/mod.rs @@ -24,7 +24,7 @@ //! - Implicitly: `System: frame_system` //! - Explicitly: `System: frame_system::{Pallet, Call}` //! -//! The `construct_runtime` transitions from the implicit definition to the explict one. +//! The `construct_runtime` transitions from the implicit definition to the explicit one. //! From the explicit state, Substrate expands the pallets with additional information //! that is to be included in the runtime metadata. This expansion makes visible some extra //! parts of the pallets, mainly the `Error` if defined. The expanded state looks like @@ -55,7 +55,7 @@ //! +----------+ +------------------+ //! ``` //! -//! When all pallet parts are implcit, then the `construct_runtime!` macro expands to its final +//! When all pallet parts are implicit, then the `construct_runtime!` macro expands to its final //! state, the `ExplicitExpanded`. Otherwise, all implicit parts are converted to an explicit //! expanded part allow the `construct_runtime!` to expand any remaining explicit parts to an //! explicit expanded part. @@ -202,14 +202,14 @@ //! Similarly to the previous transition, the macro expansion transforms `System: //! frame_system::{Pallet, Call}` into `System: frame_system expanded::{Error} ::{Pallet, Call}`. //! The `expanded` section adds extra parts that the Substrate would like to expose for each pallet -//! by default. This is done to expose the approprite types for metadata construction. +//! by default. This is done to expose the appropriate types for metadata construction. //! //! This time, instead of calling `tt_default_parts` we are using the `tt_extra_parts` macro. //! This macro returns the ` :: expanded { Error }` list of additional parts we would like to //! expose. -mod expand; -mod parse; +pub(crate) mod expand; +pub(crate) mod parse; use crate::pallet::parse::helper::two128_str; use cfg_expr::Predicate; @@ -233,25 +233,38 @@ pub fn construct_runtime(input: TokenStream) -> TokenStream { let input_copy = input.clone(); let definition = syn::parse_macro_input!(input as RuntimeDeclaration); - let res = match definition { - RuntimeDeclaration::Implicit(implicit_def) => - check_pallet_number(input_copy.clone().into(), implicit_def.pallets.len()).and_then( - |_| construct_runtime_implicit_to_explicit(input_copy.into(), implicit_def), - ), - RuntimeDeclaration::Explicit(explicit_decl) => check_pallet_number( - input_copy.clone().into(), - explicit_decl.pallets.len(), - ) - .and_then(|_| { - construct_runtime_explicit_to_explicit_expanded(input_copy.into(), explicit_decl) - }), - RuntimeDeclaration::ExplicitExpanded(explicit_decl) => - check_pallet_number(input_copy.into(), explicit_decl.pallets.len()) - .and_then(|_| construct_runtime_final_expansion(explicit_decl)), + let (check_pallet_number_res, res) = match definition { + RuntimeDeclaration::Implicit(implicit_def) => ( + check_pallet_number(input_copy.clone().into(), implicit_def.pallets.len()), + construct_runtime_implicit_to_explicit(input_copy.into(), implicit_def), + ), + RuntimeDeclaration::Explicit(explicit_decl) => ( + check_pallet_number(input_copy.clone().into(), explicit_decl.pallets.len()), + construct_runtime_explicit_to_explicit_expanded(input_copy.into(), explicit_decl), + ), + RuntimeDeclaration::ExplicitExpanded(explicit_decl) => ( + check_pallet_number(input_copy.into(), explicit_decl.pallets.len()), + construct_runtime_final_expansion(explicit_decl), + ), }; let res = res.unwrap_or_else(|e| e.to_compile_error()); + // We want to provide better error messages to the user and thus, handle the error here + // separately. If there is an error, we print the error and still generate all of the code to + // get in overall less errors for the user. + let res = if let Err(error) = check_pallet_number_res { + let error = error.to_compile_error(); + + quote! { + #error + + #res + } + } else { + res + }; + let res = expander::Expander::new("construct_runtime") .dry(std::env::var("EXPAND_MACROS").is_err()) .verbose(true) @@ -502,7 +515,7 @@ fn construct_runtime_final_expansion( Ok(res) } -fn decl_all_pallets<'a>( +pub(crate) fn decl_all_pallets<'a>( runtime: &'a Ident, pallet_declarations: impl Iterator, features: &HashSet<&str>, @@ -611,7 +624,8 @@ fn decl_all_pallets<'a>( #( #all_pallets_without_system )* ) } -fn decl_pallet_runtime_setup( + +pub(crate) fn decl_pallet_runtime_setup( runtime: &Ident, pallet_declarations: &[Pallet], scrate: &TokenStream2, @@ -717,7 +731,7 @@ fn decl_pallet_runtime_setup( ) } -fn decl_integrity_test(scrate: &TokenStream2) -> TokenStream2 { +pub(crate) fn decl_integrity_test(scrate: &TokenStream2) -> TokenStream2 { quote!( #[cfg(test)] mod __construct_runtime_integrity_test { @@ -732,7 +746,7 @@ fn decl_integrity_test(scrate: &TokenStream2) -> TokenStream2 { ) } -fn decl_static_assertions( +pub(crate) fn decl_static_assertions( runtime: &Ident, pallet_decls: &[Pallet], scrate: &TokenStream2, @@ -763,7 +777,7 @@ fn decl_static_assertions( } } -fn check_pallet_number(input: TokenStream2, pallet_num: usize) -> Result<()> { +pub(crate) fn check_pallet_number(input: TokenStream2, pallet_num: usize) -> Result<()> { let max_pallet_num = { if cfg!(feature = "tuples-96") { 96 diff --git a/substrate/frame/support/procedural/src/construct_runtime/parse.rs b/substrate/frame/support/procedural/src/construct_runtime/parse.rs index 88f3f14dc86c541ef949beced9feaf222e9a3146..31866c787b0f339d6d83b810476e840216f70bbc 100644 --- a/substrate/frame/support/procedural/src/construct_runtime/parse.rs +++ b/substrate/frame/support/procedural/src/construct_runtime/parse.rs @@ -322,7 +322,7 @@ impl Parse for PalletDeclaration { /// A struct representing a path to a pallet. `PalletPath` is almost identical to the standard /// Rust path with a few restrictions: /// - No leading colons allowed -/// - Path segments can only consist of identifers separated by colons +/// - Path segments can only consist of identifiers separated by colons #[derive(Debug, Clone)] pub struct PalletPath { pub inner: Path, @@ -595,7 +595,7 @@ pub struct Pallet { pub is_expanded: bool, /// The name of the pallet, e.g.`System` in `System: frame_system`. pub name: Ident, - /// Either automatically infered, or defined (e.g. `MyPallet ... = 3,`). + /// Either automatically inferred, or defined (e.g. `MyPallet ... = 3,`). pub index: u8, /// The path of the pallet, e.g. `frame_system` in `System: frame_system`. pub path: PalletPath, @@ -634,7 +634,7 @@ impl Pallet { /// +----------+ +----------+ +------------------+ /// ``` enum PalletsConversion { - /// Pallets implicitely declare parts. + /// Pallets implicitly declare parts. /// /// `System: frame_system`. Implicit(Vec), @@ -648,7 +648,7 @@ enum PalletsConversion { /// Pallets explicitly declare parts that are fully expanded. /// /// This is the end state that contains extra parts included by - /// default by Subtrate. + /// default by Substrate. /// /// `System: frame_system expanded::{Error} ::{Pallet, Call}` /// @@ -660,7 +660,7 @@ enum PalletsConversion { /// /// Check if all pallet have explicit declaration of their parts, if so then assign index to each /// pallet using same rules as rust for fieldless enum. I.e. implicit are assigned number -/// incrementedly from last explicit or 0. +/// incrementally from last explicit or 0. fn convert_pallets(pallets: Vec) -> syn::Result { if pallets.iter().any(|pallet| pallet.pallet_parts.is_none()) { return Ok(PalletsConversion::Implicit(pallets)) diff --git a/substrate/frame/support/procedural/src/derive_impl.rs b/substrate/frame/support/procedural/src/derive_impl.rs index d6d5bf68efd5689af2e96250e24cef3cd7faf47b..54755f1163a1de279cad99b16f9500ccb39956eb 100644 --- a/substrate/frame/support/procedural/src/derive_impl.rs +++ b/substrate/frame/support/procedural/src/derive_impl.rs @@ -172,6 +172,33 @@ fn combine_impls( final_impl } +/// Computes the disambiguation path for the `derive_impl` attribute macro. +/// +/// When specified explicitly using `as [disambiguation_path]` in the macro attr, the +/// disambiguation is used as is. If not, we infer the disambiguation path from the +/// `foreign_impl_path` and the computed scope. +fn compute_disambiguation_path( + disambiguation_path: Option, + foreign_impl: ItemImpl, + default_impl_path: Path, +) -> Result { + match (disambiguation_path, foreign_impl.clone().trait_) { + (Some(disambiguation_path), _) => Ok(disambiguation_path), + (None, Some((_, foreign_impl_path, _))) => + if default_impl_path.segments.len() > 1 { + let scope = default_impl_path.segments.first(); + Ok(parse_quote!(#scope :: #foreign_impl_path)) + } else { + Ok(foreign_impl_path) + }, + _ => Err(syn::Error::new( + default_impl_path.span(), + "Impl statement must have a defined type being implemented \ + for a defined type such as `impl A for B`", + )), + } +} + /// Internal implementation behind [`#[derive_impl(..)]`](`macro@crate::derive_impl`). /// /// `default_impl_path`: the module path of the external `impl` statement whose tokens we are @@ -194,18 +221,11 @@ pub fn derive_impl( let foreign_impl = parse2::(foreign_tokens)?; let default_impl_path = parse2::(default_impl_path)?; - // have disambiguation_path default to the item being impl'd in the foreign impl if we - // don't specify an `as [disambiguation_path]` in the macro attr - let disambiguation_path = match (disambiguation_path, foreign_impl.clone().trait_) { - (Some(disambiguation_path), _) => disambiguation_path, - (None, Some((_, foreign_impl_path, _))) => foreign_impl_path, - _ => - return Err(syn::Error::new( - foreign_impl.span(), - "Impl statement must have a defined type being implemented \ - for a defined type such as `impl A for B`", - )), - }; + let disambiguation_path = compute_disambiguation_path( + disambiguation_path, + foreign_impl.clone(), + default_impl_path.clone(), + )?; // generate the combined impl let combined_impl = combine_impls( @@ -257,3 +277,27 @@ fn test_runtime_type_with_doc() { } } } + +#[test] +fn test_disambiguation_path() { + let foreign_impl: ItemImpl = parse_quote!(impl SomeTrait for SomeType {}); + let default_impl_path: Path = parse_quote!(SomeScope::SomeType); + + // disambiguation path is specified + let disambiguation_path = compute_disambiguation_path( + Some(parse_quote!(SomeScope::SomePath)), + foreign_impl.clone(), + default_impl_path.clone(), + ); + assert_eq!(disambiguation_path.unwrap(), parse_quote!(SomeScope::SomePath)); + + // disambiguation path is not specified and the default_impl_path has more than one segment + let disambiguation_path = + compute_disambiguation_path(None, foreign_impl.clone(), default_impl_path.clone()); + assert_eq!(disambiguation_path.unwrap(), parse_quote!(SomeScope::SomeTrait)); + + // disambiguation path is not specified and the default_impl_path has only one segment + let disambiguation_path = + compute_disambiguation_path(None, foreign_impl.clone(), parse_quote!(SomeType)); + assert_eq!(disambiguation_path.unwrap(), parse_quote!(SomeTrait)); +} diff --git a/substrate/frame/support/procedural/src/dynamic_params.rs b/substrate/frame/support/procedural/src/dynamic_params.rs new file mode 100644 index 0000000000000000000000000000000000000000..29399a885bc671ddfeefe3d8eefba3d235ad4899 --- /dev/null +++ b/substrate/frame/support/procedural/src/dynamic_params.rs @@ -0,0 +1,563 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Code for the `#[dynamic_params]`, `#[dynamic_pallet_params]` and +//! `#[dynamic_aggregated_params_internal]` macros. + +use frame_support_procedural_tools::generate_access_from_frame_or_crate; +use inflector::Inflector; +use proc_macro2::{Span, TokenStream}; +use quote::{format_ident, quote, ToTokens}; +use syn::{parse2, spanned::Spanned, visit_mut, visit_mut::VisitMut, Result, Token}; + +/// Parse and expand a `#[dynamic_params(..)]` module. +pub fn dynamic_params(attr: TokenStream, item: TokenStream) -> Result { + DynamicParamModAttr::parse(attr, item).map(ToTokens::into_token_stream) +} + +/// Parse and expand `#[dynamic_pallet_params(..)]` attribute. +pub fn dynamic_pallet_params(attr: TokenStream, item: TokenStream) -> Result { + DynamicPalletParamAttr::parse(attr, item).map(ToTokens::into_token_stream) +} + +/// Parse and expand `#[dynamic_aggregated_params_internal]` attribute. +pub fn dynamic_aggregated_params_internal( + _attr: TokenStream, + item: TokenStream, +) -> Result { + parse2::(item).map(ToTokens::into_token_stream) +} + +/// A top `#[dynamic_params(..)]` attribute together with a mod. +#[derive(derive_syn_parse::Parse)] +pub struct DynamicParamModAttr { + params_mod: syn::ItemMod, + meta: DynamicParamModAttrMeta, +} + +/// The inner meta of a `#[dynamic_params(..)]` attribute. +#[derive(derive_syn_parse::Parse)] +pub struct DynamicParamModAttrMeta { + name: syn::Ident, + _comma: Option, + #[parse_if(_comma.is_some())] + params_pallet: Option, +} + +impl DynamicParamModAttr { + pub fn parse(attr: TokenStream, item: TokenStream) -> Result { + let params_mod = parse2(item)?; + let meta = parse2(attr)?; + Ok(Self { params_mod, meta }) + } + + pub fn inner_mods(&self) -> Vec { + self.params_mod.content.as_ref().map_or(Vec::new(), |(_, items)| { + items + .iter() + .filter_map(|i| match i { + syn::Item::Mod(m) => Some(m), + _ => None, + }) + .cloned() + .collect() + }) + } +} + +impl ToTokens for DynamicParamModAttr { + fn to_tokens(&self, tokens: &mut TokenStream) { + let scrate = match crate_access() { + Ok(path) => path, + Err(err) => return tokens.extend(err), + }; + let (mut params_mod, name) = (self.params_mod.clone(), &self.meta.name); + let dynam_params_ident = ¶ms_mod.ident; + + let mut quoted_enum = quote! {}; + for m in self.inner_mods() { + let aggregate_name = + syn::Ident::new(&m.ident.to_string().to_class_case(), m.ident.span()); + let mod_name = &m.ident; + + let mut attrs = m.attrs.clone(); + attrs.retain(|attr| !attr.path().is_ident("dynamic_pallet_params")); + if let Err(err) = ensure_codec_index(&attrs, m.span()) { + tokens.extend(err.into_compile_error()); + return + } + + quoted_enum.extend(quote! { + #(#attrs)* + #aggregate_name(#dynam_params_ident::#mod_name::Parameters), + }); + } + + // Inject the outer args into the inner `#[dynamic_pallet_params(..)]` attribute. + if let Some(params_pallet) = &self.meta.params_pallet { + MacroInjectArgs { runtime_params: name.clone(), params_pallet: params_pallet.clone() } + .visit_item_mod_mut(&mut params_mod); + } + + tokens.extend(quote! { + #params_mod + + #[#scrate::dynamic_params::dynamic_aggregated_params_internal] + pub enum #name { + #quoted_enum + } + }); + } +} + +/// Ensure there is a `#[codec(index = ..)]` attribute. +fn ensure_codec_index(attrs: &Vec, span: Span) -> Result<()> { + let mut found = false; + + for attr in attrs.iter() { + if attr.path().is_ident("codec") { + let meta: syn::ExprAssign = attr.parse_args()?; + if meta.left.to_token_stream().to_string() == "index" { + found = true; + break + } + } + } + + if !found { + Err(syn::Error::new(span, "Missing explicit `#[codec(index = ..)]` attribute")) + } else { + Ok(()) + } +} + +/// Used to inject arguments into the inner `#[dynamic_pallet_params(..)]` attribute. +/// +/// This allows the outer `#[dynamic_params(..)]` attribute to specify some arguments that don't +/// need to be repeated every time. +struct MacroInjectArgs { + runtime_params: syn::Ident, + params_pallet: syn::Type, +} +impl VisitMut for MacroInjectArgs { + fn visit_item_mod_mut(&mut self, item: &mut syn::ItemMod) { + // Check if the mod has a `#[dynamic_pallet_params(..)]` attribute. + let attr = item.attrs.iter_mut().find(|attr| attr.path().is_ident("dynamic_pallet_params")); + + if let Some(attr) = attr { + match &attr.meta { + syn::Meta::Path(path) => + assert_eq!(path.to_token_stream().to_string(), "dynamic_pallet_params"), + _ => (), + } + + let runtime_params = &self.runtime_params; + let params_pallet = &self.params_pallet; + + attr.meta = syn::parse2::(quote! { + dynamic_pallet_params(#runtime_params, #params_pallet) + }) + .unwrap() + .into(); + } + + visit_mut::visit_item_mod_mut(self, item); + } +} +/// The helper attribute of a `#[dynamic_pallet_params(runtime_params, params_pallet)]` +/// attribute. +#[derive(derive_syn_parse::Parse)] +pub struct DynamicPalletParamAttr { + inner_mod: syn::ItemMod, + meta: DynamicPalletParamAttrMeta, +} + +/// The inner meta of a `#[dynamic_pallet_params(..)]` attribute. +#[derive(derive_syn_parse::Parse)] +pub struct DynamicPalletParamAttrMeta { + runtime_params: syn::Ident, + _comma: Token![,], + parameter_pallet: syn::Type, +} + +impl DynamicPalletParamAttr { + pub fn parse(attr: TokenStream, item: TokenStream) -> Result { + Ok(Self { inner_mod: parse2(item)?, meta: parse2(attr)? }) + } + + pub fn statics(&self) -> Vec { + self.inner_mod.content.as_ref().map_or(Vec::new(), |(_, items)| { + items + .iter() + .filter_map(|i| match i { + syn::Item::Static(s) => Some(s), + _ => None, + }) + .cloned() + .collect() + }) + } +} + +impl ToTokens for DynamicPalletParamAttr { + fn to_tokens(&self, tokens: &mut TokenStream) { + let scrate = match crate_access() { + Ok(path) => path, + Err(err) => return tokens.extend(err), + }; + let (params_mod, parameter_pallet, runtime_params) = + (&self.inner_mod, &self.meta.parameter_pallet, &self.meta.runtime_params); + + let aggregate_name = + syn::Ident::new(¶ms_mod.ident.to_string().to_class_case(), params_mod.ident.span()); + let (mod_name, vis) = (¶ms_mod.ident, ¶ms_mod.vis); + let statics = self.statics(); + + let (mut key_names, mut key_values, mut defaults, mut attrs, mut value_types): ( + Vec<_>, + Vec<_>, + Vec<_>, + Vec<_>, + Vec<_>, + ) = Default::default(); + + for s in statics.iter() { + if let Err(err) = ensure_codec_index(&s.attrs, s.span()) { + tokens.extend(err.into_compile_error()); + return + } + + key_names.push(&s.ident); + key_values.push(format_ident!("{}Value", &s.ident)); + defaults.push(&s.expr); + attrs.push(&s.attrs); + value_types.push(&s.ty); + } + + let key_ident = syn::Ident::new("ParametersKey", params_mod.ident.span()); + let value_ident = syn::Ident::new("ParametersValue", params_mod.ident.span()); + let runtime_key_ident = format_ident!("{}Key", runtime_params); + let runtime_value_ident = format_ident!("{}Value", runtime_params); + + tokens.extend(quote! { + pub mod #mod_name { + use super::*; + + #[doc(hidden)] + #[derive( + Clone, + PartialEq, + Eq, + #scrate::__private::codec::Encode, + #scrate::__private::codec::Decode, + #scrate::__private::codec::MaxEncodedLen, + #scrate::__private::RuntimeDebug, + #scrate::__private::scale_info::TypeInfo + )] + #vis enum Parameters { + #( + #(#attrs)* + #key_names(#key_names, Option<#value_types>), + )* + } + + #[doc(hidden)] + #[derive( + Clone, + PartialEq, + Eq, + #scrate::__private::codec::Encode, + #scrate::__private::codec::Decode, + #scrate::__private::codec::MaxEncodedLen, + #scrate::__private::RuntimeDebug, + #scrate::__private::scale_info::TypeInfo + )] + #vis enum #key_ident { + #( + #(#attrs)* + #key_names(#key_names), + )* + } + + #[doc(hidden)] + #[derive( + Clone, + PartialEq, + Eq, + #scrate::__private::codec::Encode, + #scrate::__private::codec::Decode, + #scrate::__private::codec::MaxEncodedLen, + #scrate::__private::RuntimeDebug, + #scrate::__private::scale_info::TypeInfo + )] + #vis enum #value_ident { + #( + #(#attrs)* + #key_names(#value_types), + )* + } + + impl #scrate::traits::dynamic_params::AggregatedKeyValue for Parameters { + type Key = #key_ident; + type Value = #value_ident; + + fn into_parts(self) -> (Self::Key, Option) { + match self { + #( + Parameters::#key_names(key, value) => { + (#key_ident::#key_names(key), value.map(#value_ident::#key_names)) + }, + )* + } + } + } + + #( + #[doc(hidden)] + #[derive( + Clone, + PartialEq, + Eq, + #scrate::__private::codec::Encode, + #scrate::__private::codec::Decode, + #scrate::__private::codec::MaxEncodedLen, + #scrate::__private::RuntimeDebug, + #scrate::__private::scale_info::TypeInfo + )] + #vis struct #key_names; + + impl #scrate::__private::Get<#value_types> for #key_names { + fn get() -> #value_types { + match + <#parameter_pallet as + #scrate::storage::StorageMap<#runtime_key_ident, #runtime_value_ident> + >::get(#runtime_key_ident::#aggregate_name(#key_ident::#key_names(#key_names))) + { + Some(#runtime_value_ident::#aggregate_name( + #value_ident::#key_names(inner))) => inner, + Some(_) => { + #scrate::defensive!("Unexpected value type at key - returning default"); + #defaults + }, + None => #defaults, + } + } + } + + impl #scrate::traits::dynamic_params::Key for #key_names { + type Value = #value_types; + type WrappedValue = #key_values; + } + + impl From<#key_names> for #key_ident { + fn from(key: #key_names) -> Self { + #key_ident::#key_names(key) + } + } + + impl TryFrom<#key_ident> for #key_names { + type Error = (); + + fn try_from(key: #key_ident) -> Result { + match key { + #key_ident::#key_names(key) => Ok(key), + _ => Err(()), + } + } + } + + #[doc(hidden)] + #[derive( + Clone, + PartialEq, + Eq, + #scrate::sp_runtime::RuntimeDebug, + )] + #vis struct #key_values(pub #value_types); + + impl From<#key_values> for #value_ident { + fn from(value: #key_values) -> Self { + #value_ident::#key_names(value.0) + } + } + + impl From<(#key_names, #value_types)> for Parameters { + fn from((key, value): (#key_names, #value_types)) -> Self { + Parameters::#key_names(key, Some(value)) + } + } + + impl From<#key_names> for Parameters { + fn from(key: #key_names) -> Self { + Parameters::#key_names(key, None) + } + } + + impl TryFrom<#value_ident> for #key_values { + type Error = (); + + fn try_from(value: #value_ident) -> Result { + match value { + #value_ident::#key_names(value) => Ok(#key_values(value)), + _ => Err(()), + } + } + } + + impl From<#key_values> for #value_types { + fn from(value: #key_values) -> Self { + value.0 + } + } + )* + } + }); + } +} + +#[derive(derive_syn_parse::Parse)] +pub struct DynamicParamAggregatedEnum { + aggregated_enum: syn::ItemEnum, +} + +impl ToTokens for DynamicParamAggregatedEnum { + fn to_tokens(&self, tokens: &mut TokenStream) { + let scrate = match crate_access() { + Ok(path) => path, + Err(err) => return tokens.extend(err), + }; + let params_enum = &self.aggregated_enum; + let (name, vis) = (¶ms_enum.ident, ¶ms_enum.vis); + + let (mut indices, mut param_names, mut param_types): (Vec<_>, Vec<_>, Vec<_>) = + Default::default(); + let mut attributes = Vec::new(); + for (i, variant) in params_enum.variants.iter().enumerate() { + indices.push(i); + param_names.push(&variant.ident); + attributes.push(&variant.attrs); + + param_types.push(match &variant.fields { + syn::Fields::Unnamed(fields) if fields.unnamed.len() == 1 => &fields.unnamed[0].ty, + _ => { + *tokens = quote! { compile_error!("Only unnamed enum variants with one inner item are supported") }; + return + }, + }); + } + + let params_key_ident = format_ident!("{}Key", params_enum.ident); + let params_value_ident = format_ident!("{}Value", params_enum.ident); + + tokens.extend(quote! { + #[doc(hidden)] + #[derive( + Clone, + PartialEq, + Eq, + #scrate::__private::codec::Encode, + #scrate::__private::codec::Decode, + #scrate::__private::codec::MaxEncodedLen, + #scrate::sp_runtime::RuntimeDebug, + #scrate::__private::scale_info::TypeInfo + )] + #vis enum #name { + #( + //#[codec(index = #indices)] + #(#attributes)* + #param_names(#param_types), + )* + } + + #[doc(hidden)] + #[derive( + Clone, + PartialEq, + Eq, + #scrate::__private::codec::Encode, + #scrate::__private::codec::Decode, + #scrate::__private::codec::MaxEncodedLen, + #scrate::sp_runtime::RuntimeDebug, + #scrate::__private::scale_info::TypeInfo + )] + #vis enum #params_key_ident { + #( + #(#attributes)* + #param_names(<#param_types as #scrate::traits::dynamic_params::AggregatedKeyValue>::Key), + )* + } + + #[doc(hidden)] + #[derive( + Clone, + PartialEq, + Eq, + #scrate::__private::codec::Encode, + #scrate::__private::codec::Decode, + #scrate::__private::codec::MaxEncodedLen, + #scrate::sp_runtime::RuntimeDebug, + #scrate::__private::scale_info::TypeInfo + )] + #vis enum #params_value_ident { + #( + #(#attributes)* + #param_names(<#param_types as #scrate::traits::dynamic_params::AggregatedKeyValue>::Value), + )* + } + + impl #scrate::traits::dynamic_params::AggregatedKeyValue for #name { + type Key = #params_key_ident; + type Value = #params_value_ident; + + fn into_parts(self) -> (Self::Key, Option) { + match self { + #( + #name::#param_names(parameter) => { + let (key, value) = parameter.into_parts(); + (#params_key_ident::#param_names(key), value.map(#params_value_ident::#param_names)) + }, + )* + } + } + } + + #( + impl ::core::convert::From<<#param_types as #scrate::traits::dynamic_params::AggregatedKeyValue>::Key> for #params_key_ident { + fn from(key: <#param_types as #scrate::traits::dynamic_params::AggregatedKeyValue>::Key) -> Self { + #params_key_ident::#param_names(key) + } + } + + impl ::core::convert::TryFrom<#params_value_ident> for <#param_types as #scrate::traits::dynamic_params::AggregatedKeyValue>::Value { + type Error = (); + + fn try_from(value: #params_value_ident) -> Result { + match value { + #params_value_ident::#param_names(value) => Ok(value), + _ => Err(()), + } + } + } + )* + }); + } +} + +/// Get access to the current crate and convert the error to a compile error. +fn crate_access() -> core::result::Result { + generate_access_from_frame_or_crate("frame-support").map_err(|e| e.to_compile_error()) +} diff --git a/substrate/frame/support/procedural/src/lib.rs b/substrate/frame/support/procedural/src/lib.rs index 34e68966b82333f56c91c0c32b7573f2fd8284e8..53f01329d1815d280031574ca232a166e7f8148e 100644 --- a/substrate/frame/support/procedural/src/lib.rs +++ b/substrate/frame/support/procedural/src/lib.rs @@ -18,17 +18,20 @@ //! Proc macro of Support code for the runtime. #![recursion_limit = "512"] +#![deny(rustdoc::broken_intra_doc_links)] mod benchmark; mod construct_runtime; mod crate_version; mod derive_impl; mod dummy_part_checker; +mod dynamic_params; mod key_prefix; mod match_and_insert; mod no_bound; mod pallet; mod pallet_error; +mod runtime; mod storage_alias; mod transactional; mod tt_macro; @@ -134,7 +137,7 @@ fn counter_prefix(prefix: &str) -> String { /// - `Call` - If the pallet has callable functions /// - `Storage` - If the pallet uses storage /// - `Event` or `Event` (if the event is generic) - If the pallet emits events -/// - `Origin` or `Origin` (if the origin is generic) - If the pallet has instanciable origins +/// - `Origin` or `Origin` (if the origin is generic) - If the pallet has instantiable origins /// - `Config` or `Config` (if the config is generic) - If the pallet builds the genesis /// storage with `GenesisConfig` /// - `Inherent` - If the pallet provides/can check inherents. @@ -163,7 +166,7 @@ fn counter_prefix(prefix: &str) -> String { /// and `Event` are encoded, and to define the ModuleToIndex value. /// /// if `= $n` is not given, then index is resolved in the same way as fieldless enum in Rust -/// (i.e. incrementedly from previous index): +/// (i.e. incrementally from previous index): /// ```nocompile /// pallet1 .. = 2, /// pallet2 .., // Here pallet2 is given index 3 @@ -186,133 +189,10 @@ pub fn construct_runtime(input: TokenStream) -> TokenStream { construct_runtime::construct_runtime(input) } -/// The pallet struct placeholder `#[pallet::pallet]` is mandatory and allows you to specify -/// pallet information. /// -/// The struct must be defined as follows: -/// ```ignore -/// #[pallet::pallet] -/// pub struct Pallet(_); -/// ``` -/// I.e. a regular struct definition named `Pallet`, with generic T and no where clause. -/// -/// ## Macro expansion: -/// -/// The macro adds this attribute to the struct definition: -/// ```ignore -/// #[derive( -/// frame_support::CloneNoBound, -/// frame_support::EqNoBound, -/// frame_support::PartialEqNoBound, -/// frame_support::RuntimeDebugNoBound, -/// )] -/// ``` -/// and replaces the type `_` with `PhantomData`. It also implements on the pallet: -/// * `GetStorageVersion` -/// * `OnGenesis`: contains some logic to write the pallet version into storage. -/// * `PalletErrorTypeInfo`: provides the type information for the pallet error, if defined. -/// -/// It declares `type Module` type alias for `Pallet`, used by `construct_runtime`. -/// -/// It implements `PalletInfoAccess` on `Pallet` to ease access to pallet information given by -/// `frame_support::traits::PalletInfo`. (The implementation uses the associated type -/// `frame_system::Config::PalletInfo`). -/// -/// It implements `StorageInfoTrait` on `Pallet` which give information about all storages. -/// -/// If the attribute `generate_store` is set then the macro creates the trait `Store` and -/// implements it on `Pallet`. -/// -/// If the attribute `set_storage_max_encoded_len` is set then the macro calls -/// `StorageInfoTrait` for each storage in the implementation of `StorageInfoTrait` for the -/// pallet. Otherwise it implements `StorageInfoTrait` for the pallet using the -/// `PartialStorageInfoTrait` implementation of storages. -/// -/// ## Dev Mode (`#[pallet(dev_mode)]`) -/// -/// Specifying the argument `dev_mode` will allow you to enable dev mode for a pallet. The aim -/// of dev mode is to loosen some of the restrictions and requirements placed on production -/// pallets for easy tinkering and development. Dev mode pallets should not be used in -/// production. Enabling dev mode has the following effects: -/// -/// * Weights no longer need to be specified on every `#[pallet::call]` declaration. By default, dev -/// mode pallets will assume a weight of zero (`0`) if a weight is not specified. This is -/// equivalent to specifying `#[weight(0)]` on all calls that do not specify a weight. -/// * Call indices no longer need to be specified on every `#[pallet::call]` declaration. By -/// default, dev mode pallets will assume a call index based on the order of the call. -/// * All storages are marked as unbounded, meaning you do not need to implement `MaxEncodedLen` on -/// storage types. This is equivalent to specifying `#[pallet::unbounded]` on all storage type -/// definitions. -/// * Storage hashers no longer need to be specified and can be replaced by `_`. In dev mode, these -/// will be replaced by `Blake2_128Concat`. In case of explicit key-binding, `Hasher` can simply -/// be ignored when in `dev_mode`. -/// -/// Note that the `dev_mode` argument can only be supplied to the `#[pallet]` or -/// `#[frame_support::pallet]` attribute macro that encloses your pallet module. This argument -/// cannot be specified anywhere else, including but not limited to the `#[pallet::pallet]` -/// attribute macro. -/// -///

-/// WARNING:
-/// You should not deploy or use dev mode pallets in production. Doing so can break your chain
-/// and therefore should never be done. Once you are done tinkering, you should remove the
-/// 'dev_mode' argument from your #[pallet] declaration and fix any compile errors before
-/// attempting to use your pallet in a production scenario.
-/// 
-/// -/// See `frame_support::pallet` docs for more info. -/// -/// ## Runtime Metadata Documentation -/// -/// The documentation added to this pallet is included in the runtime metadata. -/// -/// The documentation can be defined in the following ways: -/// -/// ```ignore -/// #[pallet::pallet] -/// /// Documentation for pallet 1 -/// #[doc = "Documentation for pallet 2"] -/// #[doc = include_str!("../README.md")] -/// #[pallet_doc("../doc1.md")] -/// #[pallet_doc("../doc2.md")] -/// pub mod pallet {} -/// ``` -/// -/// The runtime metadata for this pallet contains the following -/// - " Documentation for pallet 1" (captured from `///`) -/// - "Documentation for pallet 2" (captured from `#[doc]`) -/// - content of ../README.md (captured from `#[doc]` with `include_str!`) -/// - content of "../doc1.md" (captured from `pallet_doc`) -/// - content of "../doc2.md" (captured from `pallet_doc`) -/// -/// ### `doc` attribute -/// -/// The value of the `doc` attribute is included in the runtime metadata, as well as -/// expanded on the pallet module. The previous example is expanded to: -/// -/// ```ignore -/// /// Documentation for pallet 1 -/// /// Documentation for pallet 2 -/// /// Content of README.md -/// pub mod pallet {} -/// ``` -/// -/// If you want to specify the file from which the documentation is loaded, you can use the -/// `include_str` macro. However, if you only want the documentation to be included in the -/// runtime metadata, use the `pallet_doc` attribute. -/// -/// ### `pallet_doc` attribute -/// -/// Unlike the `doc` attribute, the documentation provided to the `pallet_doc` attribute is -/// not inserted on the module. -/// -/// The `pallet_doc` attribute can only be provided with one argument, -/// which is the file path that holds the documentation to be added to the metadata. +/// --- /// -/// This approach is beneficial when you use the `include_str` macro at the beginning of the file -/// and want that documentation to extend to the runtime metadata, without reiterating the -/// documentation on the pallet module itself. +/// Documentation for this macro can be found at `frame_support::pallet`. #[proc_macro_attribute] pub fn pallet(attr: TokenStream, item: TokenStream) -> TokenStream { pallet::pallet(attr, item) @@ -406,19 +286,27 @@ pub fn transactional(attr: TokenStream, input: TokenStream) -> TokenStream { transactional::transactional(attr, input).unwrap_or_else(|e| e.to_compile_error().into()) } +/// +/// --- +/// +/// Documentation for this macro can be found at `frame_support::require_transactional`. #[proc_macro_attribute] pub fn require_transactional(attr: TokenStream, input: TokenStream) -> TokenStream { transactional::require_transactional(attr, input) .unwrap_or_else(|e| e.to_compile_error().into()) } -/// Derive [`Clone`] but do not bound any generic. Docs are at `frame_support::CloneNoBound`. +/// Derive [`Clone`] but do not bound any generic. +/// +/// Docs at `frame_support::CloneNoBound`. #[proc_macro_derive(CloneNoBound)] pub fn derive_clone_no_bound(input: TokenStream) -> TokenStream { no_bound::clone::derive_clone_no_bound(input) } -/// Derive [`Debug`] but do not bound any generics. Docs are at `frame_support::DebugNoBound`. +/// Derive [`Debug`] but do not bound any generics. +/// +/// Docs at `frame_support::DebugNoBound`. #[proc_macro_derive(DebugNoBound)] pub fn derive_debug_no_bound(input: TokenStream) -> TokenStream { no_bound::debug::derive_debug_no_bound(input) @@ -450,14 +338,17 @@ pub fn derive_runtime_debug_no_bound(input: TokenStream) -> TokenStream { } } -/// Derive [`PartialEq`] but do not bound any generic. Docs are at -/// `frame_support::PartialEqNoBound`. +/// Derive [`PartialEq`] but do not bound any generic. +/// +/// Docs at `frame_support::PartialEqNoBound`. #[proc_macro_derive(PartialEqNoBound)] pub fn derive_partial_eq_no_bound(input: TokenStream) -> TokenStream { no_bound::partial_eq::derive_partial_eq_no_bound(input) } -/// Derive [`Eq`] but do no bound any generic. Docs are at `frame_support::EqNoBound`. +/// DeriveEq but do no bound any generic. +/// +/// Docs at `frame_support::EqNoBound`. #[proc_macro_derive(EqNoBound)] pub fn derive_eq_no_bound(input: TokenStream) -> TokenStream { let input = syn::parse_macro_input!(input as syn::DeriveInput); @@ -492,6 +383,7 @@ pub fn derive_default_no_bound(input: TokenStream) -> TokenStream { no_bound::default::derive_default_no_bound(input) } +/// Macro used internally in FRAME to generate the crate version for a pallet. #[proc_macro] pub fn crate_to_crate_version(input: TokenStream) -> TokenStream { crate_version::crate_to_crate_version(input) @@ -553,6 +445,10 @@ pub fn __create_tt_macro(input: TokenStream) -> TokenStream { tt_macro::create_tt_return_macro(input) } +/// +/// --- +/// +/// Documentation for this macro can be found at `frame_support::pallet_macros::storage_alias`. #[proc_macro_attribute] pub fn storage_alias(attributes: TokenStream, input: TokenStream) -> TokenStream { storage_alias::storage_alias(attributes.into(), input.into()) @@ -561,7 +457,7 @@ pub fn storage_alias(attributes: TokenStream, input: TokenStream) -> TokenStream } /// This attribute can be used to derive a full implementation of a trait based on a local partial -/// impl and an external impl containing defaults that can be overriden in the local impl. +/// impl and an external impl containing defaults that can be overridden in the local impl. /// /// For a full end-to-end example, see [below](#use-case-auto-derive-test-pallet-config-traits). /// @@ -601,6 +497,11 @@ pub fn storage_alias(attributes: TokenStream, input: TokenStream) -> TokenStream /// default to `A` from the `impl A for B` part of the default impl. This is useful for scenarios /// where all of the relevant types are already in scope via `use` statements. /// +/// In case the `default_impl_path` is scoped to a different module such as +/// `some::path::TestTraitImpl`, the same scope is assumed for the `disambiguation_path`, i.e. +/// `some::A`. This enables the use of `derive_impl` attribute without having to specify the +/// `disambiguation_path` in most (if not all) uses within FRAME's context. +/// /// Conversely, the `default_impl_path` argument is required and cannot be omitted. /// /// Optionally, `no_aggregated_types` can be specified as follows: @@ -761,9 +662,9 @@ pub fn storage_alias(attributes: TokenStream, input: TokenStream) -> TokenStream "{}::macro_magic", match generate_access_from_frame_or_crate("frame-support") { Ok(path) => Ok(path), - Err(_) => generate_access_from_frame_or_crate("frame"), + Err(_) => generate_access_from_frame_or_crate("polkadot-sdk-frame"), } - .expect("Failed to find either `frame-support` or `frame` in `Cargo.toml` dependencies.") + .expect("Failed to find either `frame-support` or `polkadot-sdk-frame` in `Cargo.toml` dependencies.") .to_token_stream() .to_string() ) @@ -783,24 +684,19 @@ pub fn derive_impl(attrs: TokenStream, input: TokenStream) -> TokenStream { .into() } -/// The optional attribute `#[pallet::no_default]` can be attached to trait items within a -/// `Config` trait impl that has [`#[pallet::config(with_default)]`](`macro@config`) attached. /// -/// Attaching this attribute to a trait item ensures that that trait item will not be used as a -/// default with the [`#[derive_impl(..)]`](`macro@derive_impl`) attribute macro. +/// --- +/// +/// Documentation for this macro can be found at `frame_support::pallet_macros::no_default`. #[proc_macro_attribute] pub fn no_default(_: TokenStream, _: TokenStream) -> TokenStream { pallet_macro_stub() } -/// The optional attribute `#[pallet::no_default_bounds]` can be attached to trait items within a -/// `Config` trait impl that has [`#[pallet::config(with_default)]`](`macro@config`) attached. /// -/// Attaching this attribute to a trait item ensures that the generated trait `DefaultConfig` -/// will not have any bounds for this trait item. +/// --- /// -/// As an example, if you have a trait item `type AccountId: SomeTrait;` in your `Config` trait, -/// the generated `DefaultConfig` will only have `type AccountId;` with no trait bound. +/// Documentation for this macro can be found at `frame_support::pallet_macros::no_default_bounds`. #[proc_macro_attribute] pub fn no_default_bounds(_: TokenStream, _: TokenStream) -> TokenStream { pallet_macro_stub() @@ -880,6 +776,11 @@ pub fn register_default_impl(attrs: TokenStream, tokens: TokenStream) -> TokenSt } } +/// +/// --- +/// +/// Documentation for this macro can be found at +/// `frame_support::pallet_prelude::inject_runtime_type`. #[proc_macro_attribute] pub fn inject_runtime_type(_: TokenStream, tokens: TokenStream) -> TokenStream { let item = tokens.clone(); @@ -890,12 +791,13 @@ pub fn inject_runtime_type(_: TokenStream, tokens: TokenStream) -> TokenStream { item.ident != "RuntimeOrigin" && item.ident != "RuntimeHoldReason" && item.ident != "RuntimeFreezeReason" && + item.ident != "RuntimeParameters" && item.ident != "PalletInfo" { return syn::Error::new_spanned( item, "`#[inject_runtime_type]` can only be attached to `RuntimeCall`, `RuntimeEvent`, \ - `RuntimeTask`, `RuntimeOrigin` or `PalletInfo`", + `RuntimeTask`, `RuntimeOrigin`, `RuntimeParameters` or `PalletInfo`", ) .to_compile_error() .into() @@ -912,75 +814,10 @@ fn pallet_macro_stub() -> TokenStream { .into() } -/// The mandatory attribute `#[pallet::config]` defines the configurable options for the pallet. -/// -/// Item must be defined as: -/// -/// ```ignore -/// #[pallet::config] -/// pub trait Config: frame_system::Config + $optionally_some_other_supertraits -/// $optional_where_clause -/// { -/// ... -/// } -/// ``` -/// -/// I.e. a regular trait definition named `Config`, with the supertrait -/// `frame_system::pallet::Config`, and optionally other supertraits and a where clause. -/// (Specifying other supertraits here is known as [tight -/// coupling](https://docs.substrate.io/reference/how-to-guides/pallet-design/use-tight-coupling/)) -/// -/// The associated type `RuntimeEvent` is reserved. If defined, it must have the bounds -/// `From` and `IsType<::RuntimeEvent>`. -/// -/// [`pallet::event`](`macro@event`) must be present if `RuntimeEvent` exists as a config item -/// in your `#[pallet::config]`. -/// -/// ## Optional: `with_default` -/// -/// An optional `with_default` argument may also be specified. Doing so will automatically -/// generate a `DefaultConfig` trait inside your pallet which is suitable for use with -/// [`[#[derive_impl(..)]`](`macro@derive_impl`) to derive a default testing config: -/// -/// ```ignore -/// #[pallet::config(with_default)] -/// pub trait Config: frame_system::Config { -/// type RuntimeEvent: Parameter -/// + Member -/// + From> -/// + Debug -/// + IsType<::RuntimeEvent>; -/// -/// #[pallet::no_default] -/// type BaseCallFilter: Contains; -/// // ... -/// } -/// ``` -/// -/// As shown above, you may also attach the [`#[pallet::no_default]`](`macro@no_default`) -/// attribute to specify that a particular trait item _cannot_ be used as a default when a test -/// `Config` is derived using the [`#[derive_impl(..)]`](`macro@derive_impl`) attribute macro. -/// This will cause that particular trait item to simply not appear in default testing configs -/// based on this config (the trait item will not be included in `DefaultConfig`). -/// -/// ### `DefaultConfig` Caveats /// -/// The auto-generated `DefaultConfig` trait: -/// - is always a _subset_ of your pallet's `Config` trait. -/// - can only contain items that don't rely on externalities, such as `frame_system::Config`. -/// -/// Trait items that _do_ rely on externalities should be marked with -/// [`#[pallet::no_default]`](`macro@no_default`) -/// -/// Consequently: -/// - Any items that rely on externalities _must_ be marked with -/// [`#[pallet::no_default]`](`macro@no_default`) or your trait will fail to compile when used -/// with [`derive_impl`](`macro@derive_impl`). -/// - Items marked with [`#[pallet::no_default]`](`macro@no_default`) are entirely excluded from the -/// `DefaultConfig` trait, and therefore any impl of `DefaultConfig` doesn't need to implement -/// such items. +/// --- /// -/// For more information, see [`macro@derive_impl`]. +/// Documentation for this macro can be found at `frame_support::pallet_macros::config`. #[proc_macro_attribute] pub fn config(_: TokenStream, _: TokenStream) -> TokenStream { pallet_macro_stub() @@ -989,8 +826,7 @@ pub fn config(_: TokenStream, _: TokenStream) -> TokenStream { /// /// --- /// -/// **Rust-Analyzer users**: See the documentation of the Rust item in -/// `frame_support::pallet_macros::constant`. +/// Documentation for this macro can be found at `frame_support::pallet_macros::constant`. #[proc_macro_attribute] pub fn constant(_: TokenStream, _: TokenStream) -> TokenStream { pallet_macro_stub() @@ -999,106 +835,44 @@ pub fn constant(_: TokenStream, _: TokenStream) -> TokenStream { /// /// --- /// -/// **Rust-Analyzer users**: See the documentation of the Rust item in -/// `frame_support::pallet_macros::constant_name`. +/// Documentation for this macro can be found at `frame_support::pallet_macros::constant_name`. #[proc_macro_attribute] pub fn constant_name(_: TokenStream, _: TokenStream) -> TokenStream { pallet_macro_stub() } -/// To bypass the `frame_system::Config` supertrait check, use the attribute -/// `pallet::disable_frame_system_supertrait_check`, e.g.: /// -/// ```ignore -/// #[pallet::config] -/// #[pallet::disable_frame_system_supertrait_check] -/// pub trait Config: pallet_timestamp::Config {} -/// ``` +/// --- /// -/// NOTE: Bypassing the `frame_system::Config` supertrait check is typically desirable when you -/// want to write an alternative to the `frame_system` pallet. +/// Documentation for this macro can be found at +/// `frame_support::pallet_macros::disable_frame_system_supertrait_check`. #[proc_macro_attribute] pub fn disable_frame_system_supertrait_check(_: TokenStream, _: TokenStream) -> TokenStream { pallet_macro_stub() } -/// To generate a `Store` trait associating all storages, annotate your `Pallet` struct with -/// the attribute `#[pallet::generate_store($vis trait Store)]`, e.g.: -/// -/// ```ignore -/// #[pallet::pallet] -/// #[pallet::generate_store(pub(super) trait Store)] -/// pub struct Pallet(_); -/// ``` -/// More precisely, the `Store` trait contains an associated type for each storage. It is -/// implemented for `Pallet` allowing access to the storage from pallet struct. -/// -/// Thus when defining a storage named `Foo`, it can later be accessed from `Pallet` using -/// `::Foo`. -/// -/// NOTE: this attribute is only valid when applied _directly_ to your `Pallet` struct -/// definition. -#[proc_macro_attribute] -pub fn generate_store(_: TokenStream, _: TokenStream) -> TokenStream { - pallet_macro_stub() -} - -/// Because the `pallet::pallet` macro implements `GetStorageVersion`, the current storage -/// version needs to be communicated to the macro. This can be done by using the -/// `pallet::storage_version` attribute: /// -/// ```ignore -/// const STORAGE_VERSION: StorageVersion = StorageVersion::new(5); -/// -/// #[pallet::pallet] -/// #[pallet::storage_version(STORAGE_VERSION)] -/// pub struct Pallet(_); -/// ``` +/// --- /// -/// If not present, the current storage version is set to the default value. +/// Documentation for this macro can be found at `frame_support::pallet_macros::storage_version`. #[proc_macro_attribute] pub fn storage_version(_: TokenStream, _: TokenStream) -> TokenStream { pallet_macro_stub() } -/// The `#[pallet::hooks]` attribute allows you to specify a `Hooks` implementation for -/// `Pallet` that specifies pallet-specific logic. -/// -/// The item the attribute attaches to must be defined as follows: -/// ```ignore -/// #[pallet::hooks] -/// impl Hooks> for Pallet $optional_where_clause { -/// ... -/// } -/// ``` -/// I.e. a regular trait implementation with generic bound: `T: Config`, for the trait -/// `Hooks>` (they are defined in preludes), for the type `Pallet` and -/// with an optional where clause. -/// -/// If no `#[pallet::hooks]` exists, then the following default implementation is -/// automatically generated: -/// ```ignore -/// #[pallet::hooks] -/// impl Hooks> for Pallet {} -/// ``` /// -/// ## Macro expansion -/// -/// The macro implements the traits `OnInitialize`, `OnIdle`, `OnFinalize`, `OnRuntimeUpgrade`, -/// `OffchainWorker`, and `IntegrityTest` using the provided `Hooks` implementation. -/// -/// NOTE: `OnRuntimeUpgrade` is implemented with `Hooks::on_runtime_upgrade` and some -/// additional logic. E.g. logic to write the pallet version into storage. +/// --- /// -/// NOTE: The macro also adds some tracing logic when implementing the above traits. The -/// following hooks emit traces: `on_initialize`, `on_finalize` and `on_runtime_upgrade`. +/// Documentation for this macro can be found at `frame_support::pallet_macros::hooks`. #[proc_macro_attribute] pub fn hooks(_: TokenStream, _: TokenStream) -> TokenStream { pallet_macro_stub() } -/// Each dispatchable needs to define a weight with `#[pallet::weight($expr)]` attribute, the -/// first argument must be `origin: OriginFor`. +/// +/// --- +/// +/// Documentation for this macro can be found at `frame_support::pallet_macros::weight`. #[proc_macro_attribute] pub fn weight(_: TokenStream, _: TokenStream) -> TokenStream { pallet_macro_stub() @@ -1107,8 +881,7 @@ pub fn weight(_: TokenStream, _: TokenStream) -> TokenStream { /// /// --- /// -/// **Rust-Analyzer users**: See the documentation of the Rust item in -/// [`frame_support::pallet_macros::call`](../../frame_support/pallet_macros/attr.call.html). +/// Documentation for this macro can be found at `frame_support::pallet_macros::compact`. #[proc_macro_attribute] pub fn compact(_: TokenStream, _: TokenStream) -> TokenStream { pallet_macro_stub() @@ -1117,8 +890,7 @@ pub fn compact(_: TokenStream, _: TokenStream) -> TokenStream { /// /// --- /// -/// **Rust-Analyzer users**: See the documentation of the Rust item in -/// [`frame_support::pallet_macros::call`](../../frame_support/pallet_macros/attr.call.html). +/// Documentation for this macro can be found at `frame_support::pallet_macros::call`. #[proc_macro_attribute] pub fn call(_: TokenStream, _: TokenStream) -> TokenStream { pallet_macro_stub() @@ -1129,164 +901,52 @@ pub fn call(_: TokenStream, _: TokenStream) -> TokenStream { /// /// --- /// -/// **Rust-Analyzer users**: See the documentation of the Rust item in -/// [`frame_support::pallet_macros::call`](../../frame_support/pallet_macros/attr.call.html). +/// Documentation for this macro can be found at `frame_support::pallet_macros::call_index`. #[proc_macro_attribute] pub fn call_index(_: TokenStream, _: TokenStream) -> TokenStream { pallet_macro_stub() } -/// Each dispatchable may be annotated with the `#[pallet::feeless_if($closure)]` attribute, -/// which explicitly defines the condition for the dispatchable to be feeless. /// -/// The arguments for the closure must be the referenced arguments of the dispatchable function. -/// -/// The closure must return `bool`. -/// -/// ### Example -/// ```ignore -/// #[pallet::feeless_if(|_origin: &OriginFor, something: &u32| -> bool { -/// *something == 0 -/// })] -/// pub fn do_something(origin: OriginFor, something: u32) -> DispatchResult { -/// .... -/// } -/// ``` -/// -/// Please note that this only works for signed dispatchables and requires a signed extension -/// such as `SkipCheckIfFeeless` as defined in `pallet-skip-feeless-payment` to wrap the existing -/// payment extension. Else, this is completely ignored and the dispatchable is still charged. -/// -/// ### Macro expansion +/// --- /// -/// The macro implements the `CheckIfFeeless` trait on the dispatchable and calls the corresponding -/// closure in the implementation. +/// Documentation for this macro can be found at `frame_support::pallet_macros::feeless_if`. #[proc_macro_attribute] pub fn feeless_if(_: TokenStream, _: TokenStream) -> TokenStream { pallet_macro_stub() } -/// Allows you to define some extra constants to be added into constant metadata. /// -/// Item must be defined as: -/// -/// ```ignore -/// #[pallet::extra_constants] -/// impl Pallet where $optional_where_clause { -/// /// $some_doc -/// $vis fn $fn_name() -> $some_return_type { -/// ... -/// } -/// ... -/// } -/// ``` -/// I.e. a regular rust `impl` block with some optional where clause and functions with 0 args, -/// 0 generics, and some return type. -/// -/// ## Macro expansion +/// --- /// -/// The macro add some extra constants to pallet constant metadata. +/// Documentation for this macro can be found at `frame_support::pallet_macros::extra_constants`. #[proc_macro_attribute] pub fn extra_constants(_: TokenStream, _: TokenStream) -> TokenStream { pallet_macro_stub() } -/// The `#[pallet::error]` attribute allows you to define an error enum that will be returned -/// from the dispatchable when an error occurs. The information for this error type is then -/// stored in metadata. -/// -/// Item must be defined as: -/// -/// ```ignore -/// #[pallet::error] -/// pub enum Error { -/// /// $some_optional_doc -/// $SomeFieldLessVariant, -/// /// $some_more_optional_doc -/// $SomeVariantWithOneField(FieldType), -/// ... -/// } -/// ``` -/// I.e. a regular enum named `Error`, with generic `T` and fieldless or multiple-field -/// variants. -/// -/// Any field type in the enum variants must implement `TypeInfo` in order to be properly used -/// in the metadata, and its encoded size should be as small as possible, preferably 1 byte in -/// size in order to reduce storage size. The error enum itself has an absolute maximum encoded -/// size specified by `MAX_MODULE_ERROR_ENCODED_SIZE`. -/// -/// (1 byte can still be 256 different errors. The more specific the error, the easier it is to -/// diagnose problems and give a better experience to the user. Don't skimp on having lots of -/// individual error conditions.) -/// -/// Field types in enum variants must also implement `PalletError`, otherwise the pallet will -/// fail to compile. Rust primitive types have already implemented the `PalletError` trait -/// along with some commonly used stdlib types such as [`Option`] and `PhantomData`, and hence -/// in most use cases, a manual implementation is not necessary and is discouraged. /// -/// The generic `T` must not bound anything and a `where` clause is not allowed. That said, -/// bounds and/or a where clause should not needed for any use-case. -/// -/// ## Macro expansion -/// -/// The macro implements the [`Debug`] trait and functions `as_u8` using variant position, and -/// `as_str` using variant doc. +/// --- /// -/// The macro also implements `From>` for `&'static str` and `From>` for -/// `DispatchError`. +/// Documentation for this macro can be found at `frame_support::pallet_macros::error`. #[proc_macro_attribute] pub fn error(_: TokenStream, _: TokenStream) -> TokenStream { pallet_macro_stub() } -/// The `#[pallet::event]` attribute allows you to define pallet events. Pallet events are -/// stored under the `system` / `events` key when the block is applied (and then replaced when -/// the next block writes it's events). -/// -/// The Event enum must be defined as follows: /// -/// ```ignore -/// #[pallet::event] -/// #[pallet::generate_deposit($visibility fn deposit_event)] // Optional -/// pub enum Event<$some_generic> $optional_where_clause { -/// /// Some doc -/// $SomeName($SomeType, $YetanotherType, ...), -/// ... -/// } -/// ``` -/// -/// I.e. an enum (with named or unnamed fields variant), named `Event`, with generic: none or -/// `T` or `T: Config`, and optional w here clause. +/// --- /// -/// Each field must implement [`Clone`], [`Eq`], [`PartialEq`], `Encode`, `Decode`, and -/// [`Debug`] (on std only). For ease of use, bound by the trait `Member`, available in -/// `frame_support::pallet_prelude`. +/// Documentation for this macro can be found at `frame_support::pallet_macros::event`. #[proc_macro_attribute] pub fn event(_: TokenStream, _: TokenStream) -> TokenStream { pallet_macro_stub() } -/// The attribute `#[pallet::generate_deposit($visibility fn deposit_event)]` generates a -/// helper function on `Pallet` that handles deposit events. -/// -/// NOTE: For instantiable pallets, the event must be generic over `T` and `I`. -/// -/// ## Macro expansion -/// -/// The macro will add on enum `Event` the attributes: -/// * `#[derive(frame_support::CloneNoBound)]` -/// * `#[derive(frame_support::EqNoBound)]` -/// * `#[derive(frame_support::PartialEqNoBound)]` -/// * `#[derive(frame_support::RuntimeDebugNoBound)]` -/// * `#[derive(codec::Encode)]` -/// * `#[derive(codec::Decode)]` /// -/// The macro implements `From>` for (). -/// -/// The macro implements a metadata function on `Event` returning the `EventMetadata`. +/// --- /// -/// If `#[pallet::generate_deposit]` is present then the macro implements `fn deposit_event` on -/// `Pallet`. +/// Documentation for this macro can be found at `frame_support::pallet_macros::generate_deposit`. #[proc_macro_attribute] pub fn generate_deposit(_: TokenStream, _: TokenStream) -> TokenStream { pallet_macro_stub() @@ -1295,105 +955,62 @@ pub fn generate_deposit(_: TokenStream, _: TokenStream) -> TokenStream { /// /// --- /// -/// **Rust-Analyzer users**: See the documentation of the Rust item in -/// `frame_support::pallet_macros::storage`. +/// Documentation for this macro can be found at `frame_support::pallet_macros::storage`. #[proc_macro_attribute] pub fn storage(_: TokenStream, _: TokenStream) -> TokenStream { pallet_macro_stub() } -/// The optional attribute `#[pallet::getter(fn $my_getter_fn_name)]` allows you to define a -/// getter function on `Pallet`. /// -/// Also see [`pallet::storage`](`macro@storage`) +/// --- +/// +/// Documentation for this macro can be found at `frame_support::pallet_macros::getter`. #[proc_macro_attribute] pub fn getter(_: TokenStream, _: TokenStream) -> TokenStream { pallet_macro_stub() } -/// The optional attribute `#[pallet::storage_prefix = "SomeName"]` allows you to define the -/// storage prefix to use. This is helpful if you wish to rename the storage field but don't -/// want to perform a migration. -/// -/// E.g: -/// -/// ```ignore -/// #[pallet::storage] -/// #[pallet::storage_prefix = "foo"] -/// #[pallet::getter(fn my_storage)] -/// pub(super) type MyStorage = StorageMap; -/// ``` /// -/// or +/// --- /// -/// ```ignore -/// #[pallet::storage] -/// #[pallet::getter(fn my_storage)] -/// pub(super) type MyStorage = StorageMap<_, Blake2_128Concat, u32, u32>; -/// ``` +/// Documentation for this macro can be found at `frame_support::pallet_macros::storage_prefix`. #[proc_macro_attribute] pub fn storage_prefix(_: TokenStream, _: TokenStream) -> TokenStream { pallet_macro_stub() } -/// The optional attribute `#[pallet::unbounded]` declares the storage as unbounded. When -/// implementating the storage info (when `#[pallet::generate_storage_info]` is specified on -/// the pallet struct placeholder), the size of the storage will be declared as unbounded. This -/// can be useful for storage which can never go into PoV (Proof of Validity). +/// +/// --- +/// +/// Documentation for this macro can be found at `frame_support::pallet_macros::unbounded`. #[proc_macro_attribute] pub fn unbounded(_: TokenStream, _: TokenStream) -> TokenStream { pallet_macro_stub() } -/// The optional attribute `#[pallet::whitelist_storage]` will declare the -/// storage as whitelisted from benchmarking. Doing so will exclude reads of -/// that value's storage key from counting towards weight calculations during -/// benchmarking. /// -/// This attribute should only be attached to storages that are known to be -/// read/used in every block. This will result in a more accurate benchmarking weight. -/// -/// ### Example -/// ```ignore -/// #[pallet::storage] -/// #[pallet::whitelist_storage] -/// pub(super) type Number = StorageValue<_, frame_system::pallet_prelude::BlockNumberFor::, ValueQuery>; -/// ``` +/// --- /// -/// NOTE: As with all `pallet::*` attributes, this one _must_ be written as -/// `#[pallet::whitelist_storage]` and can only be placed inside a `pallet` module in order for -/// it to work properly. +/// Documentation for this macro can be found at `frame_support::pallet_macros::whitelist_storage`. #[proc_macro_attribute] pub fn whitelist_storage(_: TokenStream, _: TokenStream) -> TokenStream { pallet_macro_stub() } -/// The `#[pallet::type_value]` attribute lets you define a struct implementing the `Get` trait -/// to ease the use of storage types. This attribute is meant to be used alongside -/// [`#[pallet::storage]`](`macro@storage`) to define a storage's default value. This attribute -/// can be used multiple times. -/// -/// Item must be defined as: -/// -/// ```ignore -/// #[pallet::type_value] -/// fn $MyDefaultName<$some_generic>() -> $default_type $optional_where_clause { $expr } -/// ``` /// -/// I.e.: a function definition with generics none or `T: Config` and a returned type. -/// -/// E.g.: +/// --- /// -/// ```ignore -/// #[pallet::type_value] -/// fn MyDefault() -> T::Balance { 3.into() } -/// ``` +/// Documentation for this macro can be found at +/// `frame_support::pallet_macros::disable_try_decode_storage`. +#[proc_macro_attribute] +pub fn disable_try_decode_storage(_: TokenStream, _: TokenStream) -> TokenStream { + pallet_macro_stub() +} + /// -/// ## Macro expansion +/// --- /// -/// The macro renames the function to some internal name, generates a struct with the original -/// name of the function and its generic, and implements `Get<$ReturnType>` by calling the user -/// defined function. +/// Documentation for this macro can be found at `frame_support::pallet_macros::type_value`. #[proc_macro_attribute] pub fn type_value(_: TokenStream, _: TokenStream) -> TokenStream { pallet_macro_stub() @@ -1402,8 +1019,7 @@ pub fn type_value(_: TokenStream, _: TokenStream) -> TokenStream { /// /// --- /// -/// **Rust-Analyzer users**: See the documentation of the Rust item in -/// `frame_support::pallet_macros::genesis_config`. +/// Documentation for this macro can be found at `frame_support::pallet_macros::genesis_config`. #[proc_macro_attribute] pub fn genesis_config(_: TokenStream, _: TokenStream) -> TokenStream { pallet_macro_stub() @@ -1412,115 +1028,43 @@ pub fn genesis_config(_: TokenStream, _: TokenStream) -> TokenStream { /// /// --- /// -/// **Rust-Analyzer users**: See the documentation of the Rust item in -/// `frame_support::pallet_macros::genesis_build`. +/// Documentation for this macro can be found at `frame_support::pallet_macros::genesis_build`. #[proc_macro_attribute] pub fn genesis_build(_: TokenStream, _: TokenStream) -> TokenStream { pallet_macro_stub() } -/// The `#[pallet::inherent]` attribute allows the pallet to provide some -/// [inherent](https://docs.substrate.io/fundamentals/transaction-types/#inherent-transactions). -/// An inherent is some piece of data that is inserted by a block authoring node at block -/// creation time and can either be accepted or rejected by validators based on whether the -/// data falls within an acceptable range. /// -/// The most common inherent is the `timestamp` that is inserted into every block. Since there -/// is no way to validate timestamps, validators simply check that the timestamp reported by -/// the block authoring node falls within an acceptable range. -/// -/// Item must be defined as: -/// -/// ```ignore -/// #[pallet::inherent] -/// impl ProvideInherent for Pallet { -/// // ... regular trait implementation -/// } -/// ``` -/// -/// I.e. a trait implementation with bound `T: Config`, of trait `ProvideInherent` for type -/// `Pallet`, and some optional where clause. -/// -/// ## Macro expansion +/// --- /// -/// The macro currently makes no use of this information, but it might use this information in -/// the future to give information directly to `construct_runtime`. +/// Documentation for this macro can be found at `frame_support::pallet_macros::inherent`. #[proc_macro_attribute] pub fn inherent(_: TokenStream, _: TokenStream) -> TokenStream { pallet_macro_stub() } -/// The `#[pallet::validate_unsigned]` attribute allows the pallet to validate some unsigned -/// transaction: /// -/// Item must be defined as: -/// -/// ```ignore -/// #[pallet::validate_unsigned] -/// impl ValidateUnsigned for Pallet { -/// // ... regular trait implementation -/// } -/// ``` -/// -/// I.e. a trait implementation with bound `T: Config`, of trait `ValidateUnsigned` for type -/// `Pallet`, and some optional where clause. -/// -/// NOTE: There is also the `sp_runtime::traits::SignedExtension` trait that can be used to add -/// some specific logic for transaction validation. -/// -/// ## Macro expansion +/// --- /// -/// The macro currently makes no use of this information, but it might use this information in -/// the future to give information directly to `construct_runtime`. +/// Documentation for this macro can be found at `frame_support::pallet_macros::validate_unsigned`. #[proc_macro_attribute] pub fn validate_unsigned(_: TokenStream, _: TokenStream) -> TokenStream { pallet_macro_stub() } -/// The `#[pallet::origin]` attribute allows you to define some origin for the pallet. /// -/// Item must be either a type alias, an enum, or a struct. It needs to be public. -/// -/// E.g.: -/// -/// ```ignore -/// #[pallet::origin] -/// pub struct Origin(PhantomData<(T)>); -/// ``` -/// -/// **WARNING**: modifying origin changes the outer runtime origin. This outer runtime origin -/// can be stored on-chain (e.g. in `pallet-scheduler`), thus any change must be done with care -/// as it might require some migration. +/// --- /// -/// NOTE: for instantiable pallets, the origin must be generic over `T` and `I`. +/// Documentation for this macro can be found at `frame_support::pallet_macros::origin`. #[proc_macro_attribute] pub fn origin(_: TokenStream, _: TokenStream) -> TokenStream { pallet_macro_stub() } -/// The `#[pallet::composite_enum]` attribute allows you to define an enum that gets composed as an -/// aggregate enum by `construct_runtime`. This is similar in principle with `#[pallet::event]` and -/// `#[pallet::error]`. -/// -/// The attribute currently only supports enum definitions, and identifiers that are named -/// `FreezeReason`, `HoldReason`, `LockId` or `SlashReason`. Arbitrary identifiers for the enum are -/// not supported. The aggregate enum generated by `construct_runtime` will have the name of -/// `RuntimeFreezeReason`, `RuntimeHoldReason`, `RuntimeLockId` and `RuntimeSlashReason` -/// respectively. -/// -/// NOTE: The aggregate enum generated by `construct_runtime` generates a conversion function from -/// the pallet enum to the aggregate enum, and automatically derives the following traits: /// -/// ```ignore -/// Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Encode, Decode, MaxEncodedLen, TypeInfo, -/// RuntimeDebug -/// ``` +/// --- /// -/// For ease of usage, when no `#[derive]` attributes are found for the enum under -/// `#[pallet::composite_enum]`, the aforementioned traits are automatically derived for it. The -/// inverse is also true: if there are any `#[derive]` attributes found for the enum, then no traits -/// will automatically be derived for it (this implies that you need to provide the -/// `frame_support::traits::VariantCount` implementation). +/// Documentation for this macro can be found at `frame_support::pallet_macros::composite_enum`. #[proc_macro_attribute] pub fn composite_enum(_: TokenStream, _: TokenStream) -> TokenStream { pallet_macro_stub() @@ -1576,25 +1120,11 @@ pub fn task_index(_: TokenStream, _: TokenStream) -> TokenStream { pallet_macro_stub() } -/// Can be attached to a module. Doing so will declare that module as importable into a pallet -/// via [`#[import_section]`](`macro@import_section`). -/// -/// Note that sections are imported by their module name/ident, and should be referred to by -/// their _full path_ from the perspective of the target pallet. Do not attempt to make use -/// of `use` statements to bring pallet sections into scope, as this will not work (unless -/// you do so as part of a wildcard import, in which case it will work). -/// -/// ## Naming Logistics /// -/// Also note that because of how `#[pallet_section]` works, pallet section names must be -/// globally unique _within the crate in which they are defined_. For more information on -/// why this must be the case, see macro_magic's -/// [`#[export_tokens]`](https://docs.rs/macro_magic/latest/macro_magic/attr.export_tokens.html) macro. +/// --- /// -/// Optionally, you may provide an argument to `#[pallet_section]` such as -/// `#[pallet_section(some_ident)]`, in the event that there is another pallet section in -/// same crate with the same ident/name. The ident you specify can then be used instead of -/// the module's ident name when you go to import it via `#[import_section]`. +/// **Rust-Analyzer users**: See the documentation of the Rust item in +/// `frame_support::pallet_macros::pallet_section`. #[proc_macro_attribute] pub fn pallet_section(attr: TokenStream, tokens: TokenStream) -> TokenStream { let tokens_clone = tokens.clone(); @@ -1608,47 +1138,19 @@ pub fn pallet_section(attr: TokenStream, tokens: TokenStream) -> TokenStream { } } -/// An attribute macro that can be attached to a module declaration. Doing so will -/// Imports the contents of the specified external pallet section that was defined -/// previously using [`#[pallet_section]`](`macro@pallet_section`). /// -/// ## Example -/// ```ignore -/// #[import_section(some_section)] -/// #[pallet] -/// pub mod pallet { -/// // ... -/// } -/// ``` -/// where `some_section` was defined elsewhere via: -/// ```ignore -/// #[pallet_section] -/// pub mod some_section { -/// // ... -/// } -/// ``` -/// -/// This will result in the contents of `some_section` being _verbatim_ imported into -/// the pallet above. Note that since the tokens for `some_section` are essentially -/// copy-pasted into the target pallet, you cannot refer to imports that don't also -/// exist in the target pallet, but this is easily resolved by including all relevant -/// `use` statements within your pallet section, so they are imported as well, or by -/// otherwise ensuring that you have the same imports on the target pallet. -/// -/// It is perfectly permissible to import multiple pallet sections into the same pallet, -/// which can be done by having multiple `#[import_section(something)]` attributes -/// attached to the pallet. +/// --- /// -/// Note that sections are imported by their module name/ident, and should be referred to by -/// their _full path_ from the perspective of the target pallet. +/// **Rust-Analyzer users**: See the documentation of the Rust item in +/// `frame_support::pallet_macros::import_section`. #[import_tokens_attr { format!( "{}::macro_magic", match generate_access_from_frame_or_crate("frame-support") { Ok(path) => Ok(path), - Err(_) => generate_access_from_frame_or_crate("frame"), + Err(_) => generate_access_from_frame_or_crate("polkadot-sdk-frame"), } - .expect("Failed to find either `frame-support` or `frame` in `Cargo.toml` dependencies.") + .expect("Failed to find either `frame-support` or `polkadot-sdk-frame` in `Cargo.toml` dependencies.") .to_token_stream() .to_string() ) @@ -1685,3 +1187,119 @@ pub fn import_section(attr: TokenStream, tokens: TokenStream) -> TokenStream { } .into() } + +/// Construct a runtime, with the given name and the given pallets. +/// +/// # Example: +/// +/// ```ignore +/// #[frame_support::runtime] +/// mod runtime { +/// // The main runtime +/// #[runtime::runtime] +/// // Runtime Types to be generated +/// #[runtime::derive( +/// RuntimeCall, +/// RuntimeEvent, +/// RuntimeError, +/// RuntimeOrigin, +/// RuntimeFreezeReason, +/// RuntimeHoldReason, +/// RuntimeSlashReason, +/// RuntimeLockId, +/// RuntimeTask, +/// )] +/// pub struct Runtime; +/// +/// #[runtime::pallet_index(0)] +/// pub type System = frame_system; +/// +/// #[runtime::pallet_index(1)] +/// pub type Test = path::to::test; +/// +/// // Pallet with instance. +/// #[runtime::pallet_index(2)] +/// pub type Test2_Instance1 = test2; +/// +/// // Pallet with calls disabled. +/// #[runtime::pallet_index(3)] +/// #[runtime::disable_call] +/// pub type Test3 = test3; +/// +/// // Pallet with unsigned extrinsics disabled. +/// #[runtime::pallet_index(4)] +/// #[runtime::disable_unsigned] +/// pub type Test4 = test4; +/// } +/// ``` +/// +/// # Legacy Ordering +/// +/// An optional attribute can be defined as #[frame_support::runtime(legacy_ordering)] to +/// ensure that the order of hooks is same as the order of pallets (and not based on the +/// pallet_index). This is to support legacy runtimes and should be avoided for new ones. +/// +/// # Note +/// +/// The population of the genesis storage depends on the order of pallets. So, if one of your +/// pallets depends on another pallet, the pallet that is depended upon needs to come before +/// the pallet depending on it. +/// +/// # Type definitions +/// +/// * The macro generates a type alias for each pallet to their `Pallet`. E.g. `type System = +/// frame_system::Pallet` +#[cfg(feature = "experimental")] +#[proc_macro_attribute] +pub fn runtime(attr: TokenStream, item: TokenStream) -> TokenStream { + runtime::runtime(attr, item) +} + +/// Mark a module that contains dynamic parameters. +/// +/// See the `pallet_parameters` for a full example. +/// +/// # Arguments +/// +/// The macro accepts two positional arguments, of which the second is optional. +/// +/// ## Aggregated Enum Name +/// +/// This sets the name that the aggregated Key-Value enum will be named after. Common names would be +/// `RuntimeParameters`, akin to `RuntimeCall`, `RuntimeOrigin` etc. There is no default value for +/// this argument. +/// +/// ## Parameter Storage Backend +/// +/// The second argument provides access to the storage of the parameters. It can either be set on +/// on this attribute, or on the inner ones. If set on both, the inner one takes precedence. +#[proc_macro_attribute] +pub fn dynamic_params(attrs: TokenStream, input: TokenStream) -> TokenStream { + dynamic_params::dynamic_params(attrs.into(), input.into()) + .unwrap_or_else(|r| r.into_compile_error()) + .into() +} + +/// Define a module inside a [`macro@dynamic_params`] module that contains dynamic parameters. +/// +/// See the `pallet_parameters` for a full example. +/// +/// # Argument +/// +/// This attribute takes one optional argument. The argument can either be put here or on the +/// surrounding `#[dynamic_params]` attribute. If set on both, the inner one takes precedence. +#[proc_macro_attribute] +pub fn dynamic_pallet_params(attrs: TokenStream, input: TokenStream) -> TokenStream { + dynamic_params::dynamic_pallet_params(attrs.into(), input.into()) + .unwrap_or_else(|r| r.into_compile_error()) + .into() +} + +/// Used internally by [`dynamic_params`]. +#[doc(hidden)] +#[proc_macro_attribute] +pub fn dynamic_aggregated_params_internal(attrs: TokenStream, input: TokenStream) -> TokenStream { + dynamic_params::dynamic_aggregated_params_internal(attrs.into(), input.into()) + .unwrap_or_else(|r| r.into_compile_error()) + .into() +} diff --git a/substrate/frame/support/procedural/src/pallet/expand/call.rs b/substrate/frame/support/procedural/src/pallet/expand/call.rs index 90974619e8e35c4a642639b3ac1f67954dbfb2b8..f395872c8a80a6b9a2ddd391ea106284140d53ba 100644 --- a/substrate/frame/support/procedural/src/pallet/expand/call.rs +++ b/substrate/frame/support/procedural/src/pallet/expand/call.rs @@ -18,7 +18,7 @@ use crate::{ pallet::{ expand::warnings::{weight_constant_warning, weight_witness_warning}, - parse::call::{CallVariantDef, CallWeightDef}, + parse::call::CallWeightDef, Def, }, COUNTER, @@ -112,22 +112,7 @@ pub fn expand_call(def: &mut Def) -> proc_macro2::TokenStream { } debug_assert_eq!(fn_weight.len(), methods.len()); - let map_fn_docs = if !def.dev_mode { - // Emit the [`Pallet::method`] documentation only for non-dev modes. - |method: &CallVariantDef| { - let reference = format!("See [`Pallet::{}`].", method.name); - quote!(#reference) - } - } else { - // For the dev-mode do not provide a documenation link as it will break the - // `cargo doc` if the pallet is private inside a test. - |method: &CallVariantDef| { - let reference = format!("See `Pallet::{}`.", method.name); - quote!(#reference) - } - }; - - let fn_doc = methods.iter().map(map_fn_docs).collect::>(); + let fn_doc = methods.iter().map(|method| &method.docs).collect::>(); let args_name = methods .iter() @@ -304,12 +289,12 @@ pub fn expand_call(def: &mut Def) -> proc_macro2::TokenStream { #[doc(hidden)] #[codec(skip)] __Ignore( - #frame_support::__private::sp_std::marker::PhantomData<(#type_use_gen,)>, + ::core::marker::PhantomData<(#type_use_gen,)>, #frame_support::Never, ), #( #cfg_attrs - #[doc = #fn_doc] + #( #[doc = #fn_doc] )* #[codec(index = #call_index)] #fn_name { #( diff --git a/substrate/frame/support/procedural/src/pallet/expand/event.rs b/substrate/frame/support/procedural/src/pallet/expand/event.rs index 2713f45fc3d54429ccab3ba82972adddd6e13a98..655fc5507d2654cfed4db4553ce5a997e4221125 100644 --- a/substrate/frame/support/procedural/src/pallet/expand/event.rs +++ b/substrate/frame/support/procedural/src/pallet/expand/event.rs @@ -87,7 +87,7 @@ pub fn expand_event(def: &mut Def) -> proc_macro2::TokenStream { #[doc(hidden)] #[codec(skip)] __Ignore( - #frame_support::__private::sp_std::marker::PhantomData<(#event_use_gen)>, + ::core::marker::PhantomData<(#event_use_gen)>, #frame_support::Never, ) ); diff --git a/substrate/frame/support/procedural/src/pallet/expand/hooks.rs b/substrate/frame/support/procedural/src/pallet/expand/hooks.rs index 5044d4285bb64aceeccd14959743a494f3c94f85..3623b595268d081ee7b5750a5431f208383f8517 100644 --- a/substrate/frame/support/procedural/src/pallet/expand/hooks.rs +++ b/substrate/frame/support/procedural/src/pallet/expand/hooks.rs @@ -42,7 +42,7 @@ pub fn expand_hooks(def: &mut Def) -> proc_macro2::TokenStream { >::name::().unwrap_or("") }; - let initialize_on_chain_storage_version = if let Some(current_version) = + let initialize_on_chain_storage_version = if let Some(in_code_version) = &def.pallet_struct.storage_version { quote::quote! { @@ -50,9 +50,9 @@ pub fn expand_hooks(def: &mut Def) -> proc_macro2::TokenStream { target: #frame_support::LOG_TARGET, "🐥 New pallet {:?} detected in the runtime. Initializing the on-chain storage version to match the storage version defined in the pallet: {:?}", #pallet_name, - #current_version + #in_code_version ); - #current_version.put::(); + #in_code_version.put::(); } } else { quote::quote! { @@ -73,10 +73,10 @@ pub fn expand_hooks(def: &mut Def) -> proc_macro2::TokenStream { #frame_support::__private::log::info!( target: #frame_support::LOG_TARGET, "⚠️ {} declares internal migrations (which *might* execute). \ - On-chain `{:?}` vs current storage version `{:?}`", + On-chain `{:?}` vs in-code storage version `{:?}`", #pallet_name, ::on_chain_storage_version(), - ::current_storage_version(), + ::in_code_storage_version(), ); } } else { @@ -102,23 +102,23 @@ pub fn expand_hooks(def: &mut Def) -> proc_macro2::TokenStream { }; // If a storage version is set, we should ensure that the storage version on chain matches the - // current storage version. This assumes that `Executive` is running custom migrations before + // in-code storage version. This assumes that `Executive` is running custom migrations before // the pallets are called. let post_storage_version_check = if def.pallet_struct.storage_version.is_some() { quote::quote! { let on_chain_version = ::on_chain_storage_version(); - let current_version = ::current_storage_version(); + let in_code_version = ::in_code_storage_version(); - if on_chain_version != current_version { + if on_chain_version != in_code_version { #frame_support::__private::log::error!( target: #frame_support::LOG_TARGET, - "{}: On chain storage version {:?} doesn't match current storage version {:?}.", + "{}: On chain storage version {:?} doesn't match in-code storage version {:?}.", #pallet_name, on_chain_version, - current_version, + in_code_version, ); - return Err("On chain and current storage version do not match. Missing runtime upgrade?".into()); + return Err("On chain and in-code storage version do not match. Missing runtime upgrade?".into()); } } } else { @@ -175,6 +175,22 @@ pub fn expand_hooks(def: &mut Def) -> proc_macro2::TokenStream { } } + impl<#type_impl_gen> + #frame_support::traits::OnPoll<#frame_system::pallet_prelude::BlockNumberFor::> + for #pallet_ident<#type_use_gen> #where_clause + { + fn on_poll( + n: #frame_system::pallet_prelude::BlockNumberFor::, + weight: &mut #frame_support::weights::WeightMeter + ) { + < + Self as #frame_support::traits::Hooks< + #frame_system::pallet_prelude::BlockNumberFor:: + > + >::on_poll(n, weight); + } + } + impl<#type_impl_gen> #frame_support::traits::OnInitialize<#frame_system::pallet_prelude::BlockNumberFor::> for #pallet_ident<#type_use_gen> #where_clause diff --git a/substrate/frame/support/procedural/src/pallet/expand/mod.rs b/substrate/frame/support/procedural/src/pallet/expand/mod.rs index 3da7d9293c7cc1a1676e5cb0e4afe9ab08b25948..067839c2846353cb995d4c160ac2f38313c19d01 100644 --- a/substrate/frame/support/procedural/src/pallet/expand/mod.rs +++ b/substrate/frame/support/procedural/src/pallet/expand/mod.rs @@ -31,7 +31,6 @@ mod instances; mod origin; mod pallet_struct; mod storage; -mod store_trait; mod tasks; mod tt_default_parts; mod type_value; @@ -68,7 +67,6 @@ pub fn expand(mut def: Def) -> proc_macro2::TokenStream { let storages = storage::expand_storages(&mut def); let inherents = inherent::expand_inherents(&mut def); let instances = instances::expand_instances(&mut def); - let store_trait = store_trait::expand_store_trait(&mut def); let hooks = hooks::expand_hooks(&mut def); let genesis_build = genesis_build::expand_genesis_build(&mut def); let genesis_config = genesis_config::expand_genesis_config(&mut def); @@ -110,7 +108,6 @@ storage item. Otherwise, all storage items are listed among [*Type Definitions*] #storages #inherents #instances - #store_trait #hooks #genesis_build #genesis_config diff --git a/substrate/frame/support/procedural/src/pallet/expand/pallet_struct.rs b/substrate/frame/support/procedural/src/pallet/expand/pallet_struct.rs index c2102f0284dbeeadb08fc9122e5fe824032dfb82..7cdf6bde9de87d0bd4eed70de93173bc9bf4e3ff 100644 --- a/substrate/frame/support/procedural/src/pallet/expand/pallet_struct.rs +++ b/substrate/frame/support/procedural/src/pallet/expand/pallet_struct.rs @@ -160,7 +160,7 @@ pub fn expand_pallet_struct(def: &mut Def) -> proc_macro2::TokenStream { } ); - let (storage_version, current_storage_version_ty) = + let (storage_version, in_code_storage_version_ty) = if let Some(v) = def.pallet_struct.storage_version.as_ref() { (quote::quote! { #v }, quote::quote! { #frame_support::traits::StorageVersion }) } else { @@ -203,9 +203,9 @@ pub fn expand_pallet_struct(def: &mut Def) -> proc_macro2::TokenStream { for #pallet_ident<#type_use_gen> #config_where_clause { - type CurrentStorageVersion = #current_storage_version_ty; + type InCodeStorageVersion = #in_code_storage_version_ty; - fn current_storage_version() -> Self::CurrentStorageVersion { + fn in_code_storage_version() -> Self::InCodeStorageVersion { #storage_version } diff --git a/substrate/frame/support/procedural/src/pallet/expand/storage.rs b/substrate/frame/support/procedural/src/pallet/expand/storage.rs index 96c2c8e3120b8f8fb76e8ee10b067ce3f13f62e9..937b068cfabd14e04b05177be2f0242eccd3abec 100644 --- a/substrate/frame/support/procedural/src/pallet/expand/storage.rs +++ b/substrate/frame/support/procedural/src/pallet/expand/storage.rs @@ -834,7 +834,10 @@ pub fn expand_storages(def: &mut Def) -> proc_macro2::TokenStream { .storages .iter() .filter_map(|storage| { - if storage.cfg_attrs.is_empty() { + // A little hacky; don't generate for cfg gated storages to not get compile errors + // when building "frame-feature-testing" gated storages in the "frame-support-test" + // crate. + if storage.try_decode && storage.cfg_attrs.is_empty() { let ident = &storage.ident; let gen = &def.type_use_generics(storage.attr_span); Some(quote::quote_spanned!(storage.attr_span => #ident<#gen> )) diff --git a/substrate/frame/support/procedural/src/pallet/expand/store_trait.rs b/substrate/frame/support/procedural/src/pallet/expand/store_trait.rs deleted file mode 100644 index 6635adc988157361a1478a5ec06589f7988b9676..0000000000000000000000000000000000000000 --- a/substrate/frame/support/procedural/src/pallet/expand/store_trait.rs +++ /dev/null @@ -1,67 +0,0 @@ -// This file is part of Substrate. - -// Copyright (C) Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -use crate::pallet::Def; -use syn::spanned::Spanned; - -/// If attribute `#[pallet::generate_store(..)]` is defined then: -/// * generate Store trait with all storages, -/// * implement Store trait for Pallet. -pub fn expand_store_trait(def: &mut Def) -> proc_macro2::TokenStream { - let (trait_vis, trait_store, attribute_span) = - if let Some(store) = &def.pallet_struct.store { store } else { return Default::default() }; - - let type_impl_gen = &def.type_impl_generics(trait_store.span()); - let type_use_gen = &def.type_use_generics(trait_store.span()); - let pallet_ident = &def.pallet_struct.pallet; - - let mut where_clauses = vec![&def.config.where_clause]; - where_clauses.extend(def.storages.iter().map(|storage| &storage.where_clause)); - let completed_where_clause = super::merge_where_clauses(&where_clauses); - - let storage_names = &def.storages.iter().map(|storage| &storage.ident).collect::>(); - let storage_cfg_attrs = - &def.storages.iter().map(|storage| &storage.cfg_attrs).collect::>(); - let warnig_struct_name = syn::Ident::new("Store", *attribute_span); - let warning: syn::ItemStruct = syn::parse_quote!( - #[deprecated(note = r" - Use of `#[pallet::generate_store(pub(super) trait Store)]` will be removed after July 2023. - Check https://github.com/paritytech/substrate/pull/13535 for more details.")] - struct #warnig_struct_name; - ); - - quote::quote_spanned!(trait_store.span() => - const _:() = { - #warning - const _: Option<#warnig_struct_name> = None; - }; - #trait_vis trait #trait_store { - #( - #(#storage_cfg_attrs)* - type #storage_names; - )* - } - impl<#type_impl_gen> #trait_store for #pallet_ident<#type_use_gen> - #completed_where_clause - { - #( - #(#storage_cfg_attrs)* - type #storage_names = #storage_names<#type_use_gen>; - )* - } - ) -} diff --git a/substrate/frame/support/procedural/src/pallet/expand/tt_default_parts.rs b/substrate/frame/support/procedural/src/pallet/expand/tt_default_parts.rs index 7cc1415dfddf1514cf398555c650f4892097aefd..99364aaa96cd7808def45563392be207604151d7 100644 --- a/substrate/frame/support/procedural/src/pallet/expand/tt_default_parts.rs +++ b/substrate/frame/support/procedural/src/pallet/expand/tt_default_parts.rs @@ -28,6 +28,8 @@ pub fn expand_tt_default_parts(def: &mut Def) -> proc_macro2::TokenStream { syn::Ident::new(&format!("__tt_default_parts_{}", count), def.item.span()); let extra_parts_unique_id = syn::Ident::new(&format!("__tt_extra_parts_{}", count), def.item.span()); + let default_parts_unique_id_v2 = + syn::Ident::new(&format!("__tt_default_parts_v2_{}", count), def.item.span()); let call_part = def.call.as_ref().map(|_| quote::quote!(Call,)); @@ -81,6 +83,58 @@ pub fn expand_tt_default_parts(def: &mut Def) -> proc_macro2::TokenStream { .any(|c| matches!(c.composite_keyword, CompositeKeyword::SlashReason(_))) .then_some(quote::quote!(SlashReason,)); + let call_part_v2 = def.call.as_ref().map(|_| quote::quote!(+ Call)); + + let task_part_v2 = def.task_enum.as_ref().map(|_| quote::quote!(+ Task)); + + let storage_part_v2 = (!def.storages.is_empty()).then(|| quote::quote!(+ Storage)); + + let event_part_v2 = def.event.as_ref().map(|event| { + let gen = event.gen_kind.is_generic().then(|| quote::quote!()); + quote::quote!(+ Event #gen) + }); + + let error_part_v2 = def.error.as_ref().map(|_| quote::quote!(+ Error)); + + let origin_part_v2 = def.origin.as_ref().map(|origin| { + let gen = origin.is_generic.then(|| quote::quote!()); + quote::quote!(+ Origin #gen) + }); + + let config_part_v2 = def.genesis_config.as_ref().map(|genesis_config| { + let gen = genesis_config.gen_kind.is_generic().then(|| quote::quote!()); + quote::quote!(+ Config #gen) + }); + + let inherent_part_v2 = def.inherent.as_ref().map(|_| quote::quote!(+ Inherent)); + + let validate_unsigned_part_v2 = + def.validate_unsigned.as_ref().map(|_| quote::quote!(+ ValidateUnsigned)); + + let freeze_reason_part_v2 = def + .composites + .iter() + .any(|c| matches!(c.composite_keyword, CompositeKeyword::FreezeReason(_))) + .then_some(quote::quote!(+ FreezeReason)); + + let hold_reason_part_v2 = def + .composites + .iter() + .any(|c| matches!(c.composite_keyword, CompositeKeyword::HoldReason(_))) + .then_some(quote::quote!(+ HoldReason)); + + let lock_id_part_v2 = def + .composites + .iter() + .any(|c| matches!(c.composite_keyword, CompositeKeyword::LockId(_))) + .then_some(quote::quote!(+ LockId)); + + let slash_reason_part_v2 = def + .composites + .iter() + .any(|c| matches!(c.composite_keyword, CompositeKeyword::SlashReason(_))) + .then_some(quote::quote!(+ SlashReason)); + quote::quote!( // This macro follows the conventions as laid out by the `tt-call` crate. It does not // accept any arguments and simply returns the pallet parts, separated by commas, then @@ -138,5 +192,25 @@ pub fn expand_tt_default_parts(def: &mut Def) -> proc_macro2::TokenStream { } pub use #extra_parts_unique_id as tt_extra_parts; + + #[macro_export] + #[doc(hidden)] + macro_rules! #default_parts_unique_id_v2 { + { + $caller:tt + frame_support = [{ $($frame_support:ident)::* }] + } => { + $($frame_support)*::__private::tt_return! { + $caller + tokens = [{ + + Pallet #call_part_v2 #storage_part_v2 #event_part_v2 #error_part_v2 #origin_part_v2 #config_part_v2 + #inherent_part_v2 #validate_unsigned_part_v2 #freeze_reason_part_v2 #task_part_v2 + #hold_reason_part_v2 #lock_id_part_v2 #slash_reason_part_v2 + }] + } + }; + } + + pub use #default_parts_unique_id_v2 as tt_default_parts_v2; ) } diff --git a/substrate/frame/support/procedural/src/pallet/parse/composite.rs b/substrate/frame/support/procedural/src/pallet/parse/composite.rs index a744756234edea4baa773064dd02600f3d429ff5..c3ac74846bf7c664289dab8d046b51370fe28f5f 100644 --- a/substrate/frame/support/procedural/src/pallet/parse/composite.rs +++ b/substrate/frame/support/procedural/src/pallet/parse/composite.rs @@ -171,7 +171,7 @@ impl CompositeDef { #[doc(hidden)] #[codec(skip)] __Ignore( - #scrate::__private::sp_std::marker::PhantomData, + ::core::marker::PhantomData, ) }); } diff --git a/substrate/frame/support/procedural/src/pallet/parse/config.rs b/substrate/frame/support/procedural/src/pallet/parse/config.rs index fbab92db196cb33d90e88413d66e4ff75e8e3cd4..406072df4b9d60b874df83578c12df5df1216329 100644 --- a/substrate/frame/support/procedural/src/pallet/parse/config.rs +++ b/substrate/frame/support/procedural/src/pallet/parse/config.rs @@ -275,7 +275,8 @@ fn check_event_type( } /// Check that the path to `frame_system::Config` is valid, this is that the path is just -/// `frame_system::Config` or when using the `frame` crate it is `frame::xyz::frame_system::Config`. +/// `frame_system::Config` or when using the `frame` crate it is +/// `polkadot_sdk_frame::xyz::frame_system::Config`. fn has_expected_system_config(path: syn::Path, frame_system: &syn::Path) -> bool { // Check if `frame_system` is actually 'frame_system'. if path.segments.iter().all(|s| s.ident != "frame_system") { @@ -293,7 +294,7 @@ fn has_expected_system_config(path: syn::Path, frame_system: &syn::Path) -> bool // `frame` re-exports it as such. syn::parse2::(quote::quote!(frame_system)).expect("is a valid path; qed"), (_, _) => - // They are either both `frame_system` or both `frame::xyz::frame_system`. + // They are either both `frame_system` or both `polkadot_sdk_frame::xyz::frame_system`. frame_system.clone(), }; @@ -516,14 +517,28 @@ mod tests { #[test] fn has_expected_system_config_works_with_frame() { + let path = syn::parse2::(quote::quote!(frame_system::Config)).unwrap(); + + let frame_system = + syn::parse2::(quote::quote!(polkadot_sdk_frame::deps::frame_system)) + .unwrap(); + assert!(has_expected_system_config(path.clone(), &frame_system)); + let frame_system = syn::parse2::(quote::quote!(frame::deps::frame_system)).unwrap(); - let path = syn::parse2::(quote::quote!(frame_system::Config)).unwrap(); assert!(has_expected_system_config(path, &frame_system)); } #[test] fn has_expected_system_config_works_with_frame_full_path() { + let frame_system = + syn::parse2::(quote::quote!(polkadot_sdk_frame::deps::frame_system)) + .unwrap(); + let path = + syn::parse2::(quote::quote!(polkadot_sdk_frame::deps::frame_system::Config)) + .unwrap(); + assert!(has_expected_system_config(path, &frame_system)); + let frame_system = syn::parse2::(quote::quote!(frame::deps::frame_system)).unwrap(); let path = @@ -533,6 +548,13 @@ mod tests { #[test] fn has_expected_system_config_works_with_other_frame_full_path() { + let frame_system = + syn::parse2::(quote::quote!(polkadot_sdk_frame::xyz::frame_system)).unwrap(); + let path = + syn::parse2::(quote::quote!(polkadot_sdk_frame::xyz::frame_system::Config)) + .unwrap(); + assert!(has_expected_system_config(path, &frame_system)); + let frame_system = syn::parse2::(quote::quote!(frame::xyz::frame_system)).unwrap(); let path = @@ -543,18 +565,21 @@ mod tests { #[test] fn has_expected_system_config_does_not_works_with_mixed_frame_full_path() { let frame_system = - syn::parse2::(quote::quote!(frame::xyz::frame_system)).unwrap(); + syn::parse2::(quote::quote!(polkadot_sdk_frame::xyz::frame_system)).unwrap(); let path = - syn::parse2::(quote::quote!(frame::deps::frame_system::Config)).unwrap(); + syn::parse2::(quote::quote!(polkadot_sdk_frame::deps::frame_system::Config)) + .unwrap(); assert!(!has_expected_system_config(path, &frame_system)); } #[test] fn has_expected_system_config_does_not_works_with_other_mixed_frame_full_path() { let frame_system = - syn::parse2::(quote::quote!(frame::deps::frame_system)).unwrap(); + syn::parse2::(quote::quote!(polkadot_sdk_frame::deps::frame_system)) + .unwrap(); let path = - syn::parse2::(quote::quote!(frame::xyz::frame_system::Config)).unwrap(); + syn::parse2::(quote::quote!(polkadot_sdk_frame::xyz::frame_system::Config)) + .unwrap(); assert!(!has_expected_system_config(path, &frame_system)); } @@ -562,7 +587,8 @@ mod tests { fn has_expected_system_config_does_not_work_with_frame_full_path_if_not_frame_crate() { let frame_system = syn::parse2::(quote::quote!(frame_system)).unwrap(); let path = - syn::parse2::(quote::quote!(frame::deps::frame_system::Config)).unwrap(); + syn::parse2::(quote::quote!(polkadot_sdk_frame::deps::frame_system::Config)) + .unwrap(); assert!(!has_expected_system_config(path, &frame_system)); } diff --git a/substrate/frame/support/procedural/src/pallet/parse/helper.rs b/substrate/frame/support/procedural/src/pallet/parse/helper.rs index 538226a8745fe4d0792e36b9aaad9cbed9d4f88e..3187c9139c8f46c7664e96edb6870f68979146ae 100644 --- a/substrate/frame/support/procedural/src/pallet/parse/helper.rs +++ b/substrate/frame/support/procedural/src/pallet/parse/helper.rs @@ -148,6 +148,12 @@ impl MutItemAttrs for syn::ImplItemFn { } } +impl MutItemAttrs for syn::ItemType { + fn mut_item_attrs(&mut self) -> Option<&mut Vec> { + Some(&mut self.attrs) + } +} + /// Parse for `()` struct Unit; impl syn::parse::Parse for Unit { diff --git a/substrate/frame/support/procedural/src/pallet/parse/mod.rs b/substrate/frame/support/procedural/src/pallet/parse/mod.rs index e1efdbcc2027975d89a00b1037bd5d0af68998a3..6e12774611ddfd0b4cdf53468df074dc7315e382 100644 --- a/substrate/frame/support/procedural/src/pallet/parse/mod.rs +++ b/substrate/frame/support/procedural/src/pallet/parse/mod.rs @@ -321,7 +321,7 @@ impl Def { Ok(()) } - /// Tries to locate a manual tasks impl (an impl impling a trait whose last path segment is + /// Tries to locate a manual tasks impl (an impl implementing a trait whose last path segment is /// `Task`) in the event that one has not been found already via the attribute macro pub fn resolve_manual_tasks_impl( tasks: &mut Option, @@ -558,8 +558,6 @@ mod keyword { syn::custom_keyword!(validate_unsigned); syn::custom_keyword!(type_value); syn::custom_keyword!(pallet); - syn::custom_keyword!(generate_store); - syn::custom_keyword!(Store); syn::custom_keyword!(extra_constants); syn::custom_keyword!(composite_enum); } diff --git a/substrate/frame/support/procedural/src/pallet/parse/pallet_struct.rs b/substrate/frame/support/procedural/src/pallet/parse/pallet_struct.rs index f4af86aa3e9936a3e77036f062ba8d4bf1a6c601..b645760998fe1c27e48c724dcde7cfcc658bb594 100644 --- a/substrate/frame/support/procedural/src/pallet/parse/pallet_struct.rs +++ b/substrate/frame/support/procedural/src/pallet/parse/pallet_struct.rs @@ -23,10 +23,8 @@ use syn::spanned::Spanned; mod keyword { syn::custom_keyword!(pallet); syn::custom_keyword!(Pallet); - syn::custom_keyword!(generate_store); syn::custom_keyword!(without_storage_info); syn::custom_keyword!(storage_version); - syn::custom_keyword!(Store); } /// Definition of the pallet pallet. @@ -37,23 +35,19 @@ pub struct PalletStructDef { pub instances: Vec, /// The keyword Pallet used (contains span). pub pallet: keyword::Pallet, - /// Whether the trait `Store` must be generated. - pub store: Option<(syn::Visibility, keyword::Store, proc_macro2::Span)>, /// The span of the pallet::pallet attribute. pub attr_span: proc_macro2::Span, /// Whether to specify the storages max encoded len when implementing `StorageInfoTrait`. /// Contains the span of the attribute. pub without_storage_info: Option, - /// The current storage version of the pallet. + /// The in-code storage version of the pallet. pub storage_version: Option, } /// Parse for one variant of: -/// * `#[pallet::generate_store($vis trait Store)]` /// * `#[pallet::without_storage_info]` /// * `#[pallet::storage_version(STORAGE_VERSION)]` pub enum PalletStructAttr { - GenerateStore { span: proc_macro2::Span, vis: syn::Visibility, keyword: keyword::Store }, WithoutStorageInfoTrait(proc_macro2::Span), StorageVersion { storage_version: syn::Path, span: proc_macro2::Span }, } @@ -61,9 +55,7 @@ pub enum PalletStructAttr { impl PalletStructAttr { fn span(&self) -> proc_macro2::Span { match self { - Self::GenerateStore { span, .. } | - Self::WithoutStorageInfoTrait(span) | - Self::StorageVersion { span, .. } => *span, + Self::WithoutStorageInfoTrait(span) | Self::StorageVersion { span, .. } => *span, } } } @@ -77,16 +69,7 @@ impl syn::parse::Parse for PalletStructAttr { content.parse::()?; let lookahead = content.lookahead1(); - if lookahead.peek(keyword::generate_store) { - content.parse::()?; - let generate_content; - syn::parenthesized!(generate_content in content); - let vis = generate_content.parse::()?; - generate_content.parse::()?; - let keyword = generate_content.parse::()?; - let span = content.span(); - Ok(Self::GenerateStore { vis, keyword, span }) - } else if lookahead.peek(keyword::without_storage_info) { + if lookahead.peek(keyword::without_storage_info) { let span = content.parse::()?.span(); Ok(Self::WithoutStorageInfoTrait(span)) } else if lookahead.peek(keyword::storage_version) { @@ -116,16 +99,12 @@ impl PalletStructDef { return Err(syn::Error::new(item.span(), msg)) }; - let mut store = None; let mut without_storage_info = None; let mut storage_version_found = None; let struct_attrs: Vec = helper::take_item_pallet_attrs(&mut item.attrs)?; for attr in struct_attrs { match attr { - PalletStructAttr::GenerateStore { vis, keyword, span } if store.is_none() => { - store = Some((vis, keyword, span)); - }, PalletStructAttr::WithoutStorageInfoTrait(span) if without_storage_info.is_none() => { @@ -162,7 +141,6 @@ impl PalletStructDef { index, instances, pallet, - store, attr_span, without_storage_info, storage_version: storage_version_found, diff --git a/substrate/frame/support/procedural/src/pallet/parse/storage.rs b/substrate/frame/support/procedural/src/pallet/parse/storage.rs index d1c7ba2e5e3c6788827577dfa843205d0be69174..9d96a18b56943db4715fabd30e8bc0f1c0aa7d28 100644 --- a/substrate/frame/support/procedural/src/pallet/parse/storage.rs +++ b/substrate/frame/support/procedural/src/pallet/parse/storage.rs @@ -29,6 +29,7 @@ mod keyword { syn::custom_keyword!(storage_prefix); syn::custom_keyword!(unbounded); syn::custom_keyword!(whitelist_storage); + syn::custom_keyword!(disable_try_decode_storage); syn::custom_keyword!(OptionQuery); syn::custom_keyword!(ResultQuery); syn::custom_keyword!(ValueQuery); @@ -39,11 +40,13 @@ mod keyword { /// * `#[pallet::storage_prefix = "CustomName"]` /// * `#[pallet::unbounded]` /// * `#[pallet::whitelist_storage] +/// * `#[pallet::disable_try_decode_storage]` pub enum PalletStorageAttr { Getter(syn::Ident, proc_macro2::Span), StorageName(syn::LitStr, proc_macro2::Span), Unbounded(proc_macro2::Span), WhitelistStorage(proc_macro2::Span), + DisableTryDecodeStorage(proc_macro2::Span), } impl PalletStorageAttr { @@ -53,6 +56,7 @@ impl PalletStorageAttr { Self::StorageName(_, span) | Self::Unbounded(span) | Self::WhitelistStorage(span) => *span, + Self::DisableTryDecodeStorage(span) => *span, } } } @@ -93,6 +97,9 @@ impl syn::parse::Parse for PalletStorageAttr { } else if lookahead.peek(keyword::whitelist_storage) { content.parse::()?; Ok(Self::WhitelistStorage(attr_span)) + } else if lookahead.peek(keyword::disable_try_decode_storage) { + content.parse::()?; + Ok(Self::DisableTryDecodeStorage(attr_span)) } else { Err(lookahead.error()) } @@ -104,6 +111,7 @@ struct PalletStorageAttrInfo { rename_as: Option, unbounded: bool, whitelisted: bool, + try_decode: bool, } impl PalletStorageAttrInfo { @@ -112,6 +120,7 @@ impl PalletStorageAttrInfo { let mut rename_as = None; let mut unbounded = false; let mut whitelisted = false; + let mut disable_try_decode_storage = false; for attr in attrs { match attr { PalletStorageAttr::Getter(ident, ..) if getter.is_none() => getter = Some(ident), @@ -119,6 +128,8 @@ impl PalletStorageAttrInfo { rename_as = Some(name), PalletStorageAttr::Unbounded(..) if !unbounded => unbounded = true, PalletStorageAttr::WhitelistStorage(..) if !whitelisted => whitelisted = true, + PalletStorageAttr::DisableTryDecodeStorage(..) if !disable_try_decode_storage => + disable_try_decode_storage = true, attr => return Err(syn::Error::new( attr.attr_span(), @@ -127,7 +138,13 @@ impl PalletStorageAttrInfo { } } - Ok(PalletStorageAttrInfo { getter, rename_as, unbounded, whitelisted }) + Ok(PalletStorageAttrInfo { + getter, + rename_as, + unbounded, + whitelisted, + try_decode: !disable_try_decode_storage, + }) } } @@ -186,6 +203,8 @@ pub struct StorageDef { pub unbounded: bool, /// Whether or not reads to this storage key will be ignored by benchmarking pub whitelisted: bool, + /// Whether or not to try to decode the storage key when running try-runtime checks. + pub try_decode: bool, /// Whether or not a default hasher is allowed to replace `_` pub use_default_hasher: bool, } @@ -775,7 +794,7 @@ impl StorageDef { }; let attrs: Vec = helper::take_item_pallet_attrs(&mut item.attrs)?; - let PalletStorageAttrInfo { getter, rename_as, mut unbounded, whitelisted } = + let PalletStorageAttrInfo { getter, rename_as, mut unbounded, whitelisted, try_decode } = PalletStorageAttrInfo::from_attrs(attrs)?; // set all storages to be unbounded if dev_mode is enabled @@ -921,6 +940,7 @@ impl StorageDef { named_generics, unbounded, whitelisted, + try_decode, use_default_hasher, }) } diff --git a/substrate/frame/support/procedural/src/runtime/expand/mod.rs b/substrate/frame/support/procedural/src/runtime/expand/mod.rs new file mode 100644 index 0000000000000000000000000000000000000000..93c88fce94b73665efa7912b36056b661b12be1e --- /dev/null +++ b/substrate/frame/support/procedural/src/runtime/expand/mod.rs @@ -0,0 +1,320 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use super::parse::runtime_types::RuntimeType; +use crate::{ + construct_runtime::{ + check_pallet_number, decl_all_pallets, decl_integrity_test, decl_pallet_runtime_setup, + decl_static_assertions, expand, + }, + runtime::{ + parse::{ + AllPalletsDeclaration, ExplicitAllPalletsDeclaration, ImplicitAllPalletsDeclaration, + }, + Def, + }, +}; +use cfg_expr::Predicate; +use frame_support_procedural_tools::{ + generate_access_from_frame_or_crate, generate_crate_access, generate_hidden_includes, +}; +use proc_macro2::TokenStream as TokenStream2; +use quote::quote; +use std::collections::HashSet; +use syn::{Ident, Result}; + +/// The fixed name of the system pallet. +const SYSTEM_PALLET_NAME: &str = "System"; + +pub fn expand(def: Def, legacy_ordering: bool) -> TokenStream2 { + let input = def.input; + + let (check_pallet_number_res, res) = match def.pallets { + AllPalletsDeclaration::Implicit(ref decl) => ( + check_pallet_number(input.clone(), decl.pallet_count), + construct_runtime_implicit_to_explicit(input.into(), decl.clone(), legacy_ordering), + ), + AllPalletsDeclaration::Explicit(ref decl) => ( + check_pallet_number(input, decl.pallets.len()), + construct_runtime_final_expansion( + def.runtime_struct.ident.clone(), + decl.clone(), + def.runtime_types.clone(), + legacy_ordering, + ), + ), + }; + + let res = res.unwrap_or_else(|e| e.to_compile_error()); + + // We want to provide better error messages to the user and thus, handle the error here + // separately. If there is an error, we print the error and still generate all of the code to + // get in overall less errors for the user. + let res = if let Err(error) = check_pallet_number_res { + let error = error.to_compile_error(); + + quote! { + #error + + #res + } + } else { + res + }; + + let res = expander::Expander::new("construct_runtime") + .dry(std::env::var("FRAME_EXPAND").is_err()) + .verbose(true) + .write_to_out_dir(res) + .expect("Does not fail because of IO in OUT_DIR; qed"); + + res.into() +} + +fn construct_runtime_implicit_to_explicit( + input: TokenStream2, + definition: ImplicitAllPalletsDeclaration, + legacy_ordering: bool, +) -> Result { + let frame_support = generate_access_from_frame_or_crate("frame-support")?; + let attr = if legacy_ordering { quote!((legacy_ordering)) } else { quote!() }; + let mut expansion = quote::quote!( + #[frame_support::runtime #attr] + #input + ); + for pallet in definition.pallet_decls.iter() { + let pallet_path = &pallet.path; + let pallet_name = &pallet.name; + let pallet_instance = pallet.instance.as_ref().map(|instance| quote::quote!(<#instance>)); + expansion = quote::quote!( + #frame_support::__private::tt_call! { + macro = [{ #pallet_path::tt_default_parts_v2 }] + frame_support = [{ #frame_support }] + ~~> #frame_support::match_and_insert! { + target = [{ #expansion }] + pattern = [{ #pallet_name = #pallet_path #pallet_instance }] + } + } + ); + } + + Ok(expansion) +} + +fn construct_runtime_final_expansion( + name: Ident, + definition: ExplicitAllPalletsDeclaration, + runtime_types: Vec, + legacy_ordering: bool, +) -> Result { + let ExplicitAllPalletsDeclaration { mut pallets, name: pallets_name } = definition; + + if !legacy_ordering { + // Ensure that order of hooks is based on the pallet index + pallets.sort_by_key(|p| p.index); + } + + let system_pallet = + pallets.iter().find(|decl| decl.name == SYSTEM_PALLET_NAME).ok_or_else(|| { + syn::Error::new( + pallets_name.span(), + "`System` pallet declaration is missing. \ + Please add this line: `pub type System = frame_system;`", + ) + })?; + if !system_pallet.cfg_pattern.is_empty() { + return Err(syn::Error::new( + system_pallet.name.span(), + "`System` pallet declaration is feature gated, please remove any `#[cfg]` attributes", + )) + } + + let features = pallets + .iter() + .filter_map(|decl| { + (!decl.cfg_pattern.is_empty()).then(|| { + decl.cfg_pattern.iter().flat_map(|attr| { + attr.predicates().filter_map(|pred| match pred { + Predicate::Feature(feat) => Some(feat), + Predicate::Test => Some("test"), + _ => None, + }) + }) + }) + }) + .flatten() + .collect::>(); + + let hidden_crate_name = "construct_runtime"; + let scrate = generate_crate_access(hidden_crate_name, "frame-support"); + let scrate_decl = generate_hidden_includes(hidden_crate_name, "frame-support"); + + let frame_system = generate_access_from_frame_or_crate("frame-system")?; + let block = quote!(<#name as #frame_system::Config>::Block); + let unchecked_extrinsic = quote!(<#block as #scrate::sp_runtime::traits::Block>::Extrinsic); + + let mut dispatch = None; + let mut outer_event = None; + let mut outer_error = None; + let mut outer_origin = None; + let mut freeze_reason = None; + let mut hold_reason = None; + let mut slash_reason = None; + let mut lock_id = None; + let mut task = None; + + for runtime_type in runtime_types.iter() { + match runtime_type { + RuntimeType::RuntimeCall(_) => { + dispatch = + Some(expand::expand_outer_dispatch(&name, system_pallet, &pallets, &scrate)); + }, + RuntimeType::RuntimeEvent(_) => { + outer_event = Some(expand::expand_outer_enum( + &name, + &pallets, + &scrate, + expand::OuterEnumType::Event, + )?); + }, + RuntimeType::RuntimeError(_) => { + outer_error = Some(expand::expand_outer_enum( + &name, + &pallets, + &scrate, + expand::OuterEnumType::Error, + )?); + }, + RuntimeType::RuntimeOrigin(_) => { + outer_origin = + Some(expand::expand_outer_origin(&name, system_pallet, &pallets, &scrate)?); + }, + RuntimeType::RuntimeFreezeReason(_) => { + freeze_reason = Some(expand::expand_outer_freeze_reason(&pallets, &scrate)); + }, + RuntimeType::RuntimeHoldReason(_) => { + hold_reason = Some(expand::expand_outer_hold_reason(&pallets, &scrate)); + }, + RuntimeType::RuntimeSlashReason(_) => { + slash_reason = Some(expand::expand_outer_slash_reason(&pallets, &scrate)); + }, + RuntimeType::RuntimeLockId(_) => { + lock_id = Some(expand::expand_outer_lock_id(&pallets, &scrate)); + }, + RuntimeType::RuntimeTask(_) => { + task = Some(expand::expand_outer_task(&name, &pallets, &scrate)); + }, + } + } + + let all_pallets = decl_all_pallets(&name, pallets.iter(), &features); + let pallet_to_index = decl_pallet_runtime_setup(&name, &pallets, &scrate); + + let metadata = expand::expand_runtime_metadata( + &name, + &pallets, + &scrate, + &unchecked_extrinsic, + &system_pallet.path, + ); + let outer_config = expand::expand_outer_config(&name, &pallets, &scrate); + let inherent = + expand::expand_outer_inherent(&name, &block, &unchecked_extrinsic, &pallets, &scrate); + let validate_unsigned = expand::expand_outer_validate_unsigned(&name, &pallets, &scrate); + let integrity_test = decl_integrity_test(&scrate); + let static_assertions = decl_static_assertions(&name, &pallets, &scrate); + + let res = quote!( + #scrate_decl + + // Prevent UncheckedExtrinsic to print unused warning. + const _: () = { + #[allow(unused)] + type __hidden_use_of_unchecked_extrinsic = #unchecked_extrinsic; + }; + + #[derive( + Clone, Copy, PartialEq, Eq, #scrate::sp_runtime::RuntimeDebug, + #scrate::__private::scale_info::TypeInfo + )] + pub struct #name; + impl #scrate::sp_runtime::traits::GetRuntimeBlockType for #name { + type RuntimeBlock = #block; + } + + // Each runtime must expose the `runtime_metadata()` to fetch the runtime API metadata. + // The function is implemented by calling `impl_runtime_apis!`. + // + // However, the `runtime` may be used without calling `impl_runtime_apis!`. + // Rely on the `Deref` trait to differentiate between a runtime that implements + // APIs (by macro impl_runtime_apis!) and a runtime that is simply created (by macro runtime). + // + // Both `InternalConstructRuntime` and `InternalImplRuntimeApis` expose a `runtime_metadata()` function. + // `InternalConstructRuntime` is implemented by the `runtime` for Runtime references (`& Runtime`), + // while `InternalImplRuntimeApis` is implemented by the `impl_runtime_apis!` for Runtime (`Runtime`). + // + // Therefore, the `Deref` trait will resolve the `runtime_metadata` from `impl_runtime_apis!` + // when both macros are called; and will resolve an empty `runtime_metadata` when only the `runtime` + // is used. + + #[doc(hidden)] + trait InternalConstructRuntime { + #[inline(always)] + fn runtime_metadata(&self) -> #scrate::__private::sp_std::vec::Vec<#scrate::__private::metadata_ir::RuntimeApiMetadataIR> { + Default::default() + } + } + #[doc(hidden)] + impl InternalConstructRuntime for &#name {} + + #outer_event + + #outer_error + + #outer_origin + + #all_pallets + + #pallet_to_index + + #dispatch + + #task + + #metadata + + #outer_config + + #inherent + + #validate_unsigned + + #freeze_reason + + #hold_reason + + #lock_id + + #slash_reason + + #integrity_test + + #static_assertions + ); + + Ok(res) +} diff --git a/substrate/frame/support/procedural/src/runtime/mod.rs b/substrate/frame/support/procedural/src/runtime/mod.rs new file mode 100644 index 0000000000000000000000000000000000000000..aaae579eb086638f1bfacf02105a8fcd0e3d01b5 --- /dev/null +++ b/substrate/frame/support/procedural/src/runtime/mod.rs @@ -0,0 +1,236 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Implementation of `runtime`. +//! +//! `runtime` implementation is recursive and can generate code which will call itself +//! in order to get all the pallet parts for each pallet. +//! +//! Pallets can define their parts: +//! - Implicitly: `pub type System = frame_system;` +//! - Explicitly: `pub type System = frame_system + Pallet + Call;` +//! +//! The `runtime` transitions from the implicit definition to the explicit one. +//! From the explicit state, Substrate expands the pallets with additional information +//! that is to be included in the runtime metadata. +//! +//! Pallets must provide the `tt_default_parts_v2` macro for these transitions. +//! These are automatically implemented by the `#[pallet::pallet]` macro. +//! +//! This macro also generates the following enums for ease of decoding if the respective type +//! is defined inside `#[runtime::derive]`: +//! - `enum RuntimeCall`: This type contains the information needed to decode extrinsics. +//! - `enum RuntimeEvent`: This type contains the information needed to decode events. +//! - `enum RuntimeError`: While this cannot be used directly to decode `sp_runtime::DispatchError` +//! from the chain, it contains the information needed to decode the +//! `sp_runtime::DispatchError::Module`. +//! +//! # State Transitions +//! +//! ```ignore +//! +----------+ +//! | Implicit | +//! +----------+ +//! | +//! v +//! +----------+ +//! | Explicit | +//! +----------+ +//! ``` +//! +//! The `runtime` macro transforms the implicit declaration of each pallet +//! `System: frame_system` to an explicit one `System: frame_system + Pallet + Call` using the +//! `tt_default_parts_v2` macro. +//! +//! The `tt_default_parts_v2` macro exposes a plus separated list of pallet parts. For example, the +//! `Event` part is exposed only if the pallet implements an event via `#[pallet::event]` macro. +//! The tokens generated by this macro are `+ Pallet + Call` for our example. +//! +//! The `match_and_insert` macro takes in 3 arguments: +//! - target: This is the `TokenStream` that contains the `runtime` macro. +//! - pattern: The pattern to match against in the target stream. +//! - tokens: The tokens to added after the pattern match. +//! +//! The `runtime` macro uses the `tt_call` to get the default pallet parts via +//! the `tt_default_parts_v2` macro defined by each pallet. The pallet parts are then returned as +//! input to the `match_and_replace` macro. +//! The `match_and_replace` then will modify the `runtime` to expand the implicit +//! definition to the explicit one. +//! +//! For example, +//! +//! ```ignore +//! #[frame_support::runtime] +//! mod runtime { +//! //... +//! +//! #[runtime::pallet_index(0)] +//! pub type System = frame_system; // Implicit definition of parts +//! +//! #[runtime::pallet_index(1)] +//! pub type Balances = pallet_balances; // Implicit definition of parts +//! } +//! ``` +//! This call has some implicit pallet parts, thus it will expand to: +//! ```ignore +//! frame_support::__private::tt_call! { +//! macro = [{ pallet_balances::tt_default_parts_v2 }] +//! ~~> frame_support::match_and_insert! { +//! target = [{ +//! frame_support::__private::tt_call! { +//! macro = [{ frame_system::tt_default_parts_v2 }] +//! ~~> frame_support::match_and_insert! { +//! target = [{ +//! #[frame_support::runtime] +//! mod runtime { +//! //... +//! +//! #[runtime::pallet_index(0)] +//! pub type System = frame_system; +//! +//! #[runtime::pallet_index(1)] +//! pub type Balances = pallet_balances; +//! } +//! }] +//! pattern = [{ System = frame_system }] +//! } +//! } +//! }] +//! pattern = [{ Balances = pallet_balances }] +//! } +//! } +//! ``` +//! `tt_default_parts_v2` must be defined. It returns the pallet parts inside some tokens, and +//! then `tt_call` will pipe the returned pallet parts into the input of `match_and_insert`. +//! Thus `match_and_insert` will initially receive the following inputs: +//! ```ignore +//! frame_support::match_and_insert! { +//! target = [{ +//! frame_support::match_and_insert! { +//! target = [{ +//! #[frame_support::runtime] +//! mod runtime { +//! //... +//! +//! #[runtime::pallet_index(0)] +//! pub type System = frame_system; +//! +//! #[runtime::pallet_index(1)] +//! pub type Balances = pallet_balances; +//! } +//! }] +//! pattern = [{ System = frame_system }] +//! tokens = [{ ::{+ Pallet + Call} }] +//! } +//! }] +//! pattern = [{ Balances = pallet_balances }] +//! tokens = [{ ::{+ Pallet + Call} }] +//! } +//! ``` +//! After dealing with `pallet_balances`, the inner `match_and_insert` will expand to: +//! ```ignore +//! frame_support::match_and_insert! { +//! target = [{ +//! #[frame_support::runtime] +//! mod runtime { +//! //... +//! +//! #[runtime::pallet_index(0)] +//! pub type System = frame_system; // Implicit definition of parts +//! +//! #[runtime::pallet_index(1)] +//! pub type Balances = pallet_balances + Pallet + Call; // Explicit definition of parts +//! } +//! }] +//! pattern = [{ System = frame_system }] +//! tokens = [{ ::{+ Pallet + Call} }] +//! } +//! ``` +//! +//! Which will then finally expand to the following: +//! ```ignore +//! #[frame_support::runtime] +//! mod runtime { +//! //... +//! +//! #[runtime::pallet_index(0)] +//! pub type System = frame_system + Pallet + Call; +//! +//! #[runtime::pallet_index(1)] +//! pub type Balances = pallet_balances + Pallet + Call; +//! } +//! ``` +//! +//! This call has no implicit pallet parts, thus it will expand to the runtime construction: +//! ```ignore +//! pub struct Runtime { ... } +//! pub struct Call { ... } +//! impl Call ... +//! pub enum Origin { ... } +//! ... +//! ``` +//! +//! Visualizing the entire flow of `#[frame_support::runtime]`, it would look like the following: +//! +//! ```ignore +//! +----------------------+ +------------------------+ +-------------------+ +//! | | | (defined in pallet) | | | +//! | runtime | --> | tt_default_parts_v2! | --> | match_and_insert! | +//! | w/ no pallet parts | | | | | +//! +----------------------+ +------------------------+ +-------------------+ +//! +//! +----------------------+ +//! | | +//! --> | runtime | +//! | w/ pallet parts | +//! +----------------------+ +//! ``` + +#![cfg(feature = "experimental")] + +pub use parse::Def; +use proc_macro::TokenStream; +use syn::spanned::Spanned; + +mod expand; +mod parse; + +mod keyword { + syn::custom_keyword!(legacy_ordering); +} + +pub fn runtime(attr: TokenStream, tokens: TokenStream) -> TokenStream { + let mut legacy_ordering = false; + if !attr.is_empty() { + if let Ok(_) = syn::parse::(attr.clone()) { + legacy_ordering = true; + } else { + let msg = "Invalid runtime macro call: unexpected attribute. Macro call must be \ + bare, such as `#[frame_support::runtime]` or `#[runtime]`, or must specify the \ + `legacy_ordering` attribute, such as `#[frame_support::runtime(legacy_ordering)]` or \ + #[runtime(legacy_ordering)]."; + let span = proc_macro2::TokenStream::from(attr).span(); + return syn::Error::new(span, msg).to_compile_error().into() + } + } + + let item = syn::parse_macro_input!(tokens as syn::ItemMod); + match parse::Def::try_from(item) { + Ok(def) => expand::expand(def, legacy_ordering).into(), + Err(e) => e.to_compile_error().into(), + } +} diff --git a/substrate/frame/support/procedural/src/runtime/parse/helper.rs b/substrate/frame/support/procedural/src/runtime/parse/helper.rs new file mode 100644 index 0000000000000000000000000000000000000000..f05395f9b7abd55201cdfd49f80debac32fde9f4 --- /dev/null +++ b/substrate/frame/support/procedural/src/runtime/parse/helper.rs @@ -0,0 +1,37 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use crate::pallet::parse::helper::MutItemAttrs; +use quote::ToTokens; + +pub(crate) fn take_first_item_runtime_attr( + item: &mut impl MutItemAttrs, +) -> syn::Result> +where + Attr: syn::parse::Parse, +{ + let attrs = if let Some(attrs) = item.mut_item_attrs() { attrs } else { return Ok(None) }; + + if let Some(index) = attrs.iter().position(|attr| { + attr.path().segments.first().map_or(false, |segment| segment.ident == "runtime") + }) { + let runtime_attr = attrs.remove(index); + Ok(Some(syn::parse2(runtime_attr.into_token_stream())?)) + } else { + Ok(None) + } +} diff --git a/substrate/frame/support/procedural/src/runtime/parse/mod.rs b/substrate/frame/support/procedural/src/runtime/parse/mod.rs new file mode 100644 index 0000000000000000000000000000000000000000..893cb4726e2b6016fa2e728add86990e24087c42 --- /dev/null +++ b/substrate/frame/support/procedural/src/runtime/parse/mod.rs @@ -0,0 +1,266 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +pub mod helper; +pub mod pallet; +pub mod pallet_decl; +pub mod runtime_struct; +pub mod runtime_types; + +use crate::construct_runtime::parse::Pallet; +use pallet_decl::PalletDeclaration; +use proc_macro2::TokenStream as TokenStream2; +use quote::ToTokens; +use std::collections::HashMap; +use syn::{spanned::Spanned, Ident, Token}; + +use frame_support_procedural_tools::syn_ext as ext; +use runtime_types::RuntimeType; + +mod keyword { + use syn::custom_keyword; + + custom_keyword!(runtime); + custom_keyword!(derive); + custom_keyword!(pallet_index); + custom_keyword!(disable_call); + custom_keyword!(disable_unsigned); +} + +enum RuntimeAttr { + Runtime(proc_macro2::Span), + Derive(proc_macro2::Span, Vec), + PalletIndex(proc_macro2::Span, u8), + DisableCall(proc_macro2::Span), + DisableUnsigned(proc_macro2::Span), +} + +impl RuntimeAttr { + fn span(&self) -> proc_macro2::Span { + match self { + Self::Runtime(span) => *span, + Self::Derive(span, _) => *span, + Self::PalletIndex(span, _) => *span, + Self::DisableCall(span) => *span, + Self::DisableUnsigned(span) => *span, + } + } +} + +impl syn::parse::Parse for RuntimeAttr { + fn parse(input: syn::parse::ParseStream) -> syn::Result { + input.parse::()?; + let content; + syn::bracketed!(content in input); + content.parse::()?; + content.parse::()?; + + let lookahead = content.lookahead1(); + if lookahead.peek(keyword::runtime) { + Ok(RuntimeAttr::Runtime(content.parse::()?.span())) + } else if lookahead.peek(keyword::derive) { + let _ = content.parse::(); + let derive_content; + syn::parenthesized!(derive_content in content); + let runtime_types = + derive_content.parse::>()?; + let runtime_types = runtime_types.inner.into_iter().collect(); + Ok(RuntimeAttr::Derive(derive_content.span(), runtime_types)) + } else if lookahead.peek(keyword::pallet_index) { + let _ = content.parse::(); + let pallet_index_content; + syn::parenthesized!(pallet_index_content in content); + let pallet_index = pallet_index_content.parse::()?; + if !pallet_index.suffix().is_empty() { + let msg = "Number literal must not have a suffix"; + return Err(syn::Error::new(pallet_index.span(), msg)) + } + Ok(RuntimeAttr::PalletIndex(pallet_index.span(), pallet_index.base10_parse()?)) + } else if lookahead.peek(keyword::disable_call) { + Ok(RuntimeAttr::DisableCall(content.parse::()?.span())) + } else if lookahead.peek(keyword::disable_unsigned) { + Ok(RuntimeAttr::DisableUnsigned(content.parse::()?.span())) + } else { + Err(lookahead.error()) + } + } +} + +#[derive(Debug, Clone)] +pub enum AllPalletsDeclaration { + Implicit(ImplicitAllPalletsDeclaration), + Explicit(ExplicitAllPalletsDeclaration), +} + +/// Declaration of a runtime with some pallet with implicit declaration of parts. +#[derive(Debug, Clone)] +pub struct ImplicitAllPalletsDeclaration { + pub name: Ident, + pub pallet_decls: Vec, + pub pallet_count: usize, +} + +/// Declaration of a runtime with all pallet having explicit declaration of parts. +#[derive(Debug, Clone)] +pub struct ExplicitAllPalletsDeclaration { + pub name: Ident, + pub pallets: Vec, +} + +pub struct Def { + pub input: TokenStream2, + pub item: syn::ItemMod, + pub runtime_struct: runtime_struct::RuntimeStructDef, + pub pallets: AllPalletsDeclaration, + pub runtime_types: Vec, +} + +impl Def { + pub fn try_from(mut item: syn::ItemMod) -> syn::Result { + let input: TokenStream2 = item.to_token_stream().into(); + let item_span = item.span(); + let items = &mut item + .content + .as_mut() + .ok_or_else(|| { + let msg = "Invalid runtime definition, expected mod to be inlined."; + syn::Error::new(item_span, msg) + })? + .1; + + let mut runtime_struct = None; + let mut runtime_types = None; + + let mut indices = HashMap::new(); + let mut names = HashMap::new(); + + let mut pallet_decls = vec![]; + let mut pallets = vec![]; + + for item in items.iter_mut() { + let mut pallet_item = None; + let mut pallet_index = 0; + + let mut disable_call = false; + let mut disable_unsigned = false; + + while let Some(runtime_attr) = + helper::take_first_item_runtime_attr::(item)? + { + match runtime_attr { + RuntimeAttr::Runtime(span) if runtime_struct.is_none() => { + let p = runtime_struct::RuntimeStructDef::try_from(span, item)?; + runtime_struct = Some(p); + }, + RuntimeAttr::Derive(_, types) if runtime_types.is_none() => { + runtime_types = Some(types); + }, + RuntimeAttr::PalletIndex(span, index) => { + pallet_index = index; + pallet_item = if let syn::Item::Type(item) = item { + Some(item.clone()) + } else { + let msg = "Invalid runtime::pallet_index, expected type definition"; + return Err(syn::Error::new(span, msg)) + }; + }, + RuntimeAttr::DisableCall(_) => disable_call = true, + RuntimeAttr::DisableUnsigned(_) => disable_unsigned = true, + attr => { + let msg = "Invalid duplicated attribute"; + return Err(syn::Error::new(attr.span(), msg)) + }, + } + } + + if let Some(pallet_item) = pallet_item { + match *pallet_item.ty.clone() { + syn::Type::Path(ref path) => { + let pallet_decl = + PalletDeclaration::try_from(item.span(), &pallet_item, path)?; + + if let Some(used_pallet) = + names.insert(pallet_decl.name.clone(), pallet_decl.name.span()) + { + let msg = "Two pallets with the same name!"; + + let mut err = syn::Error::new(used_pallet, &msg); + err.combine(syn::Error::new(pallet_decl.name.span(), &msg)); + return Err(err) + } + + pallet_decls.push(pallet_decl); + }, + syn::Type::TraitObject(syn::TypeTraitObject { bounds, .. }) => { + let pallet = Pallet::try_from( + item.span(), + &pallet_item, + pallet_index, + disable_call, + disable_unsigned, + &bounds, + )?; + + if let Some(used_pallet) = indices.insert(pallet.index, pallet.name.clone()) + { + let msg = format!( + "Pallet indices are conflicting: Both pallets {} and {} are at index {}", + used_pallet, pallet.name, pallet.index, + ); + let mut err = syn::Error::new(used_pallet.span(), &msg); + err.combine(syn::Error::new(pallet.name.span(), msg)); + return Err(err) + } + + pallets.push(pallet); + }, + _ => continue, + } + } + } + + let name = item.ident.clone(); + let decl_count = pallet_decls.len(); + let pallets = if decl_count > 0 { + AllPalletsDeclaration::Implicit(ImplicitAllPalletsDeclaration { + name, + pallet_decls, + pallet_count: decl_count.saturating_add(pallets.len()), + }) + } else { + AllPalletsDeclaration::Explicit(ExplicitAllPalletsDeclaration { name, pallets }) + }; + + let def = Def { + input, + item, + runtime_struct: runtime_struct.ok_or_else(|| { + syn::Error::new(item_span, + "Missing Runtime. Please add a struct inside the module and annotate it with `#[runtime::runtime]`" + ) + })?, + pallets, + runtime_types: runtime_types.ok_or_else(|| { + syn::Error::new(item_span, + "Missing Runtime Types. Please annotate the runtime struct with `#[runtime::derive]`" + ) + })?, + }; + + Ok(def) + } +} diff --git a/substrate/frame/support/procedural/src/runtime/parse/pallet.rs b/substrate/frame/support/procedural/src/runtime/parse/pallet.rs new file mode 100644 index 0000000000000000000000000000000000000000..d2f1857fb2b4feec841224f28d691076c8853427 --- /dev/null +++ b/substrate/frame/support/procedural/src/runtime/parse/pallet.rs @@ -0,0 +1,99 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use crate::construct_runtime::parse::{Pallet, PalletPart, PalletPartKeyword, PalletPath}; +use quote::ToTokens; +use syn::{punctuated::Punctuated, spanned::Spanned, token, Error, Ident, PathArguments}; + +impl Pallet { + pub fn try_from( + attr_span: proc_macro2::Span, + item: &syn::ItemType, + pallet_index: u8, + disable_call: bool, + disable_unsigned: bool, + bounds: &Punctuated, + ) -> syn::Result { + let name = item.ident.clone(); + + let mut pallet_path = None; + let mut pallet_parts = vec![]; + + for (index, bound) in bounds.into_iter().enumerate() { + if let syn::TypeParamBound::Trait(syn::TraitBound { path, .. }) = bound { + if index == 0 { + pallet_path = Some(PalletPath { inner: path.clone() }); + } else { + let pallet_part = syn::parse2::(bound.into_token_stream())?; + pallet_parts.push(pallet_part); + } + } else { + return Err(Error::new( + attr_span, + "Invalid pallet declaration, expected a path or a trait object", + )) + }; + } + + let mut path = pallet_path.ok_or(Error::new( + attr_span, + "Invalid pallet declaration, expected a path or a trait object", + ))?; + + let mut instance = None; + if let Some(segment) = path.inner.segments.iter_mut().find(|seg| !seg.arguments.is_empty()) + { + if let PathArguments::AngleBracketed(syn::AngleBracketedGenericArguments { + args, .. + }) = segment.arguments.clone() + { + if let Some(syn::GenericArgument::Type(syn::Type::Path(arg_path))) = args.first() { + instance = + Some(Ident::new(&arg_path.to_token_stream().to_string(), arg_path.span())); + segment.arguments = PathArguments::None; + } + } + } + + pallet_parts = pallet_parts + .into_iter() + .filter(|part| { + if let (true, &PalletPartKeyword::Call(_)) = (disable_call, &part.keyword) { + false + } else if let (true, &PalletPartKeyword::ValidateUnsigned(_)) = + (disable_unsigned, &part.keyword) + { + false + } else { + true + } + }) + .collect(); + + let cfg_pattern = vec![]; + + Ok(Pallet { + is_expanded: true, + name, + index: pallet_index, + path, + instance, + cfg_pattern, + pallet_parts, + }) + } +} diff --git a/substrate/frame/support/procedural/src/runtime/parse/pallet_decl.rs b/substrate/frame/support/procedural/src/runtime/parse/pallet_decl.rs new file mode 100644 index 0000000000000000000000000000000000000000..437a163cfbc44973e753075d4a139fca5df81af8 --- /dev/null +++ b/substrate/frame/support/procedural/src/runtime/parse/pallet_decl.rs @@ -0,0 +1,60 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use quote::ToTokens; +use syn::{spanned::Spanned, Attribute, Ident, PathArguments}; + +/// The declaration of a pallet. +#[derive(Debug, Clone)] +pub struct PalletDeclaration { + /// The name of the pallet, e.g.`System` in `System: frame_system`. + pub name: Ident, + /// Optional attributes tagged right above a pallet declaration. + pub attrs: Vec, + /// The path of the pallet, e.g. `frame_system` in `System: frame_system`. + pub path: syn::Path, + /// The instance of the pallet, e.g. `Instance1` in `Council: pallet_collective::`. + pub instance: Option, +} + +impl PalletDeclaration { + pub fn try_from( + _attr_span: proc_macro2::Span, + item: &syn::ItemType, + path: &syn::TypePath, + ) -> syn::Result { + let name = item.ident.clone(); + + let mut path = path.path.clone(); + + let mut instance = None; + if let Some(segment) = path.segments.iter_mut().find(|seg| !seg.arguments.is_empty()) { + if let PathArguments::AngleBracketed(syn::AngleBracketedGenericArguments { + args, .. + }) = segment.arguments.clone() + { + if let Some(syn::GenericArgument::Type(syn::Type::Path(arg_path))) = args.first() { + instance = + Some(Ident::new(&arg_path.to_token_stream().to_string(), arg_path.span())); + segment.arguments = PathArguments::None; + } + } + } + + Ok(Self { name, path, instance, attrs: item.attrs.clone() }) + } +} diff --git a/substrate/frame/support/procedural/src/runtime/parse/runtime_struct.rs b/substrate/frame/support/procedural/src/runtime/parse/runtime_struct.rs new file mode 100644 index 0000000000000000000000000000000000000000..8fa746ee80727d7164d5dadb0f728fc7991362f7 --- /dev/null +++ b/substrate/frame/support/procedural/src/runtime/parse/runtime_struct.rs @@ -0,0 +1,35 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use syn::spanned::Spanned; +pub struct RuntimeStructDef { + pub ident: syn::Ident, + pub attr_span: proc_macro2::Span, +} + +impl RuntimeStructDef { + pub fn try_from(attr_span: proc_macro2::Span, item: &mut syn::Item) -> syn::Result { + let item = if let syn::Item::Struct(item) = item { + item + } else { + let msg = "Invalid runtime::runtime, expected struct definition"; + return Err(syn::Error::new(item.span(), msg)) + }; + + Ok(Self { ident: item.ident.clone(), attr_span }) + } +} diff --git a/substrate/frame/support/procedural/src/runtime/parse/runtime_types.rs b/substrate/frame/support/procedural/src/runtime/parse/runtime_types.rs new file mode 100644 index 0000000000000000000000000000000000000000..a4480e2a1fd32622bea3a7f20294b4c2bee88309 --- /dev/null +++ b/substrate/frame/support/procedural/src/runtime/parse/runtime_types.rs @@ -0,0 +1,76 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use syn::{ + parse::{Parse, ParseStream}, + Result, +}; + +mod keyword { + use syn::custom_keyword; + + custom_keyword!(RuntimeCall); + custom_keyword!(RuntimeEvent); + custom_keyword!(RuntimeError); + custom_keyword!(RuntimeOrigin); + custom_keyword!(RuntimeFreezeReason); + custom_keyword!(RuntimeHoldReason); + custom_keyword!(RuntimeSlashReason); + custom_keyword!(RuntimeLockId); + custom_keyword!(RuntimeTask); +} + +#[derive(Debug, Clone, PartialEq)] +pub enum RuntimeType { + RuntimeCall(keyword::RuntimeCall), + RuntimeEvent(keyword::RuntimeEvent), + RuntimeError(keyword::RuntimeError), + RuntimeOrigin(keyword::RuntimeOrigin), + RuntimeFreezeReason(keyword::RuntimeFreezeReason), + RuntimeHoldReason(keyword::RuntimeHoldReason), + RuntimeSlashReason(keyword::RuntimeSlashReason), + RuntimeLockId(keyword::RuntimeLockId), + RuntimeTask(keyword::RuntimeTask), +} + +impl Parse for RuntimeType { + fn parse(input: ParseStream) -> Result { + let lookahead = input.lookahead1(); + + if lookahead.peek(keyword::RuntimeCall) { + Ok(Self::RuntimeCall(input.parse()?)) + } else if lookahead.peek(keyword::RuntimeEvent) { + Ok(Self::RuntimeEvent(input.parse()?)) + } else if lookahead.peek(keyword::RuntimeError) { + Ok(Self::RuntimeError(input.parse()?)) + } else if lookahead.peek(keyword::RuntimeOrigin) { + Ok(Self::RuntimeOrigin(input.parse()?)) + } else if lookahead.peek(keyword::RuntimeFreezeReason) { + Ok(Self::RuntimeFreezeReason(input.parse()?)) + } else if lookahead.peek(keyword::RuntimeHoldReason) { + Ok(Self::RuntimeHoldReason(input.parse()?)) + } else if lookahead.peek(keyword::RuntimeSlashReason) { + Ok(Self::RuntimeSlashReason(input.parse()?)) + } else if lookahead.peek(keyword::RuntimeLockId) { + Ok(Self::RuntimeLockId(input.parse()?)) + } else if lookahead.peek(keyword::RuntimeTask) { + Ok(Self::RuntimeTask(input.parse()?)) + } else { + Err(lookahead.error()) + } + } +} diff --git a/substrate/frame/support/procedural/src/storage_alias.rs b/substrate/frame/support/procedural/src/storage_alias.rs index c0b4089a2748f0b8be6683e591a36fb496af16a4..06f62768ff80f76e3ffb38e1882eadf105cd5b3d 100644 --- a/substrate/frame/support/procedural/src/storage_alias.rs +++ b/substrate/frame/support/procedural/src/storage_alias.rs @@ -623,7 +623,7 @@ fn generate_storage_instance( quote! { #visibility struct #counter_name< #impl_generics >( - #crate_::__private::sp_std::marker::PhantomData<(#type_generics)> + ::core::marker::PhantomData<(#type_generics)> ) #where_clause; impl<#impl_generics> #crate_::traits::StorageInstance @@ -653,7 +653,7 @@ fn generate_storage_instance( let code = quote! { #[allow(non_camel_case_types)] #visibility struct #name< #impl_generics >( - #crate_::__private::sp_std::marker::PhantomData<(#type_generics)> + ::core::marker::PhantomData<(#type_generics)> ) #where_clause; impl<#impl_generics> #crate_::traits::StorageInstance diff --git a/substrate/frame/support/procedural/tools/Cargo.toml b/substrate/frame/support/procedural/tools/Cargo.toml index 0a046a164b6e1547cf318c96c90f1e48e1b5f551..a75307aca79b6ff241611b49b60c931ee1f83373 100644 --- a/substrate/frame/support/procedural/tools/Cargo.toml +++ b/substrate/frame/support/procedural/tools/Cargo.toml @@ -17,6 +17,6 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] proc-macro-crate = "3.0.0" proc-macro2 = "1.0.56" -quote = "1.0.28" -syn = { version = "2.0.48", features = ["extra-traits", "full", "visit"] } +quote = { workspace = true } +syn = { features = ["extra-traits", "full", "visit"], workspace = true } frame-support-procedural-tools-derive = { path = "derive" } diff --git a/substrate/frame/support/procedural/tools/derive/Cargo.toml b/substrate/frame/support/procedural/tools/derive/Cargo.toml index 08c6a95a34fc26c7f64286e95f729e41d46b343a..b39d99a822fb7aed533bc7795daa53c903cc2952 100644 --- a/substrate/frame/support/procedural/tools/derive/Cargo.toml +++ b/substrate/frame/support/procedural/tools/derive/Cargo.toml @@ -19,5 +19,5 @@ proc-macro = true [dependencies] proc-macro2 = "1.0.56" -quote = { version = "1.0.28", features = ["proc-macro"] } -syn = { version = "2.0.48", features = ["extra-traits", "full", "parsing", "proc-macro"] } +quote = { features = ["proc-macro"], workspace = true } +syn = { features = ["extra-traits", "full", "parsing", "proc-macro"], workspace = true } diff --git a/substrate/frame/support/procedural/tools/derive/src/lib.rs b/substrate/frame/support/procedural/tools/derive/src/lib.rs index f7c57c08674fcee985fab90225e980675cd1096e..a3590263558f491f4629eaa8b3b7997c1919b5ea 100644 --- a/substrate/frame/support/procedural/tools/derive/src/lib.rs +++ b/substrate/frame/support/procedural/tools/derive/src/lib.rs @@ -19,8 +19,6 @@ //! Use to derive parsing for parsing struct. // end::description[] -#![recursion_limit = "128"] - use proc_macro::TokenStream; use proc_macro2::Span; use quote::quote; diff --git a/substrate/frame/support/procedural/tools/src/lib.rs b/substrate/frame/support/procedural/tools/src/lib.rs index be43961336280673524071441632bbfa7f61de61..8952cd6011ff5bb717a9e731d09525d160d95739 100644 --- a/substrate/frame/support/procedural/tools/src/lib.rs +++ b/substrate/frame/support/procedural/tools/src/lib.rs @@ -54,15 +54,19 @@ pub fn generate_crate_access(unique_id: &str, def_crate: &str) -> TokenStream { /// /// This will usually check the output of [`generate_access_from_frame_or_crate`]. /// We want to know if whatever the `path` takes us to, is exported from `frame` or not. In that -/// case `path` would start with `frame`, something like `frame::x::y:z`. +/// case `path` would start with `frame`, something like `polkadot_sdk_frame::x::y:z` or +/// frame::x::y:z. pub fn is_using_frame_crate(path: &syn::Path) -> bool { - path.segments.first().map(|s| s.ident == "frame").unwrap_or(false) + path.segments + .first() + .map(|s| s.ident == "polkadot_sdk_frame" || s.ident == "frame") + .unwrap_or(false) } /// Generate the crate access for the crate using 2018 syntax. /// -/// If `frame` is in scope, it will use `frame::deps::`. Else, it will try and find -/// `` directly. +/// If `frame` is in scope, it will use `polkadot_sdk_frame::deps::`. Else, it will try +/// and find `` directly. pub fn generate_access_from_frame_or_crate(def_crate: &str) -> Result { if let Some(path) = get_frame_crate_path(def_crate) { Ok(path) @@ -114,7 +118,9 @@ pub fn generate_hidden_includes(unique_id: &str, def_crate: &str) -> TokenStream /// Generates the path to the frame crate deps. fn get_frame_crate_path(def_crate: &str) -> Option { // This does not work if the frame crate is renamed. - if let Ok(FoundCrate::Name(name)) = crate_name(&"frame") { + if let Ok(FoundCrate::Name(name)) = + crate_name(&"polkadot-sdk-frame").or_else(|_| crate_name(&"frame")) + { let path = format!("{}::deps::{}", name, def_crate.to_string().replace("-", "_")); Some(syn::parse_str::(&path).expect("is a valid path; qed")) } else { diff --git a/substrate/frame/support/src/dispatch_context.rs b/substrate/frame/support/src/dispatch_context.rs index 608187b72206399913e337a5fa9f5c1e42277978..254302c8f14d2db1987353155ab7cacde65a5bb3 100644 --- a/substrate/frame/support/src/dispatch_context.rs +++ b/substrate/frame/support/src/dispatch_context.rs @@ -18,7 +18,7 @@ //! Provides functions to interact with the dispatch context. //! //! A Dispatch context is created by calling [`run_in_context`] and then the given closure will be -//! executed in this dispatch context. Everyting run in this `closure` will have access to the same +//! executed in this dispatch context. Everything run in this `closure` will have access to the same //! dispatch context. This also applies to nested calls of [`run_in_context`]. The dispatch context //! can be used to store and retrieve information locally in this context. The dispatch context can //! be accessed by using [`with_context`]. This function will execute the given closure and give it @@ -51,7 +51,7 @@ //! //! run_in_context(|| { //! with_context::(|v| { -//! // Intitialize the value to the default value. +//! // Initialize the value to the default value. //! assert_eq!(0, v.or_default().0); //! v.or_default().0 = 10; //! }); diff --git a/substrate/frame/support/src/genesis_builder_helper.rs b/substrate/frame/support/src/genesis_builder_helper.rs index b2594d183ec5bdaa7ea2cae736ca57baada15459..7389c5a787d76d01ec759658da28857bc85ff08f 100644 --- a/substrate/frame/support/src/genesis_builder_helper.rs +++ b/substrate/frame/support/src/genesis_builder_helper.rs @@ -19,26 +19,39 @@ //! //! Provides common logic. For more info refer to [`sp_genesis_builder::GenesisBuilder`]. +extern crate alloc; + +use alloc::vec::Vec; use frame_support::traits::BuildGenesisConfig; -use sp_genesis_builder::Result as BuildResult; +use sp_genesis_builder::{PresetId, Result as BuildResult}; use sp_runtime::format_runtime_string; -/// Get the default `GenesisConfig` as a JSON blob. For more info refer to -/// [`sp_genesis_builder::GenesisBuilder::create_default_config`] -pub fn create_default_config() -> sp_std::vec::Vec -where - GC: BuildGenesisConfig + Default, -{ - serde_json::to_string(&GC::default()) - .expect("serialization to json is expected to work. qed.") - .into_bytes() -} - /// Build `GenesisConfig` from a JSON blob not using any defaults and store it in the storage. For -/// more info refer to [`sp_genesis_builder::GenesisBuilder::build_config`]. -pub fn build_config(json: sp_std::vec::Vec) -> BuildResult { +/// more info refer to [`sp_genesis_builder::GenesisBuilder::build_state`]. +pub fn build_state(json: Vec) -> BuildResult { let gc = serde_json::from_slice::(&json) .map_err(|e| format_runtime_string!("Invalid JSON blob: {}", e))?; ::build(&gc); Ok(()) } + +/// Get the default `GenesisConfig` as a JSON blob if `name` is None. +/// +/// Query of named presets is delegetaed to provided `preset_for_name` closure. For more info refer +/// to [`sp_genesis_builder::GenesisBuilder::get_preset`]. +pub fn get_preset( + name: &Option, + preset_for_name: impl FnOnce(&sp_genesis_builder::PresetId) -> Option>, +) -> Option> +where + GC: BuildGenesisConfig + Default, +{ + name.as_ref().map_or( + Some( + serde_json::to_string(&GC::default()) + .expect("serialization to json is expected to work. qed.") + .into_bytes(), + ), + preset_for_name, + ) +} diff --git a/substrate/frame/support/src/instances.rs b/substrate/frame/support/src/instances.rs index 396018d5cbd5289db9c7c6e89d861adee4b2df9a..ecb356af50b6fd2dded7bd4d7a5536f2ce7bf069 100644 --- a/substrate/frame/support/src/instances.rs +++ b/substrate/frame/support/src/instances.rs @@ -31,83 +31,83 @@ //! NOTE: [`frame_support::pallet`] will reexport them inside the module, in order to make them //! accessible to [`frame_support::construct_runtime`]. -/// `Instance1` to be used for instantiable palllets defined with the +/// `Instance1` to be used for instantiable pallets defined with the /// [`#[pallet]`](`frame_support::pallet`) macro. Instances 2-16 are also available but are hidden /// from docs. #[derive(Clone, Copy, PartialEq, Eq, crate::RuntimeDebugNoBound)] pub struct Instance1; -/// `Instance2` to be used for instantiable palllets defined with the `#[pallet]` macro. +/// `Instance2` to be used for instantiable pallets defined with the `#[pallet]` macro. #[doc(hidden)] #[derive(Clone, Copy, PartialEq, Eq, crate::RuntimeDebugNoBound)] pub struct Instance2; -/// `Instance3` to be used for instantiable palllets defined with the `#[pallet]` macro. +/// `Instance3` to be used for instantiable pallets defined with the `#[pallet]` macro. #[doc(hidden)] #[derive(Clone, Copy, PartialEq, Eq, crate::RuntimeDebugNoBound)] pub struct Instance3; -/// `Instance4` to be used for instantiable palllets defined with the `#[pallet]` macro. +/// `Instance4` to be used for instantiable pallets defined with the `#[pallet]` macro. #[doc(hidden)] #[derive(Clone, Copy, PartialEq, Eq, crate::RuntimeDebugNoBound)] pub struct Instance4; -/// `Instance5` to be used for instantiable palllets defined with the `#[pallet]` macro. +/// `Instance5` to be used for instantiable pallets defined with the `#[pallet]` macro. #[doc(hidden)] #[derive(Clone, Copy, PartialEq, Eq, crate::RuntimeDebugNoBound)] pub struct Instance5; -/// `Instance6` to be used for instantiable palllets defined with the `#[pallet]` macro. +/// `Instance6` to be used for instantiable pallets defined with the `#[pallet]` macro. #[doc(hidden)] #[derive(Clone, Copy, PartialEq, Eq, crate::RuntimeDebugNoBound)] pub struct Instance6; -/// `Instance7` to be used for instantiable palllets defined with the `#[pallet]` macro. +/// `Instance7` to be used for instantiable pallets defined with the `#[pallet]` macro. #[doc(hidden)] #[derive(Clone, Copy, PartialEq, Eq, crate::RuntimeDebugNoBound)] pub struct Instance7; -/// `Instance8` to be used for instantiable palllets defined with the `#[pallet]` macro. +/// `Instance8` to be used for instantiable pallets defined with the `#[pallet]` macro. #[doc(hidden)] #[derive(Clone, Copy, PartialEq, Eq, crate::RuntimeDebugNoBound)] pub struct Instance8; -/// `Instance9` to be used for instantiable palllets defined with the `#[pallet]` macro. +/// `Instance9` to be used for instantiable pallets defined with the `#[pallet]` macro. #[doc(hidden)] #[derive(Clone, Copy, PartialEq, Eq, crate::RuntimeDebugNoBound)] pub struct Instance9; -/// `Instance10` to be used for instantiable palllets defined with the `#[pallet]` macro. +/// `Instance10` to be used for instantiable pallets defined with the `#[pallet]` macro. #[doc(hidden)] #[derive(Clone, Copy, PartialEq, Eq, crate::RuntimeDebugNoBound)] pub struct Instance10; -/// `Instance11` to be used for instantiable palllets defined with the `#[pallet]` macro. +/// `Instance11` to be used for instantiable pallets defined with the `#[pallet]` macro. #[doc(hidden)] #[derive(Clone, Copy, PartialEq, Eq, crate::RuntimeDebugNoBound)] pub struct Instance11; -/// `Instance12` to be used for instantiable palllets defined with the `#[pallet]` macro. +/// `Instance12` to be used for instantiable pallets defined with the `#[pallet]` macro. #[doc(hidden)] #[derive(Clone, Copy, PartialEq, Eq, crate::RuntimeDebugNoBound)] pub struct Instance12; -/// `Instance13` to be used for instantiable palllets defined with the `#[pallet]` macro. +/// `Instance13` to be used for instantiable pallets defined with the `#[pallet]` macro. #[doc(hidden)] #[derive(Clone, Copy, PartialEq, Eq, crate::RuntimeDebugNoBound)] pub struct Instance13; -/// `Instance14` to be used for instantiable palllets defined with the `#[pallet]` macro. +/// `Instance14` to be used for instantiable pallets defined with the `#[pallet]` macro. #[doc(hidden)] #[derive(Clone, Copy, PartialEq, Eq, crate::RuntimeDebugNoBound)] pub struct Instance14; -/// `Instance15` to be used for instantiable palllets defined with the `#[pallet]` macro. +/// `Instance15` to be used for instantiable pallets defined with the `#[pallet]` macro. #[doc(hidden)] #[derive(Clone, Copy, PartialEq, Eq, crate::RuntimeDebugNoBound)] pub struct Instance15; -/// `Instance16` to be used for instantiable palllets defined with the `#[pallet]` macro. +/// `Instance16` to be used for instantiable pallets defined with the `#[pallet]` macro. #[doc(hidden)] #[derive(Clone, Copy, PartialEq, Eq, crate::RuntimeDebugNoBound)] pub struct Instance16; diff --git a/substrate/frame/support/src/lib.rs b/substrate/frame/support/src/lib.rs index 0f6cf05959f5113d28a250b53deec1cc7930c67d..895215d364e3dfccad33a805c6db34857c014ae8 100644 --- a/substrate/frame/support/src/lib.rs +++ b/substrate/frame/support/src/lib.rs @@ -44,7 +44,7 @@ pub mod __private { pub use paste; pub use scale_info; pub use serde; - pub use sp_core::{OpaqueMetadata, Void}; + pub use sp_core::{Get, OpaqueMetadata, Void}; pub use sp_crypto_hashing_proc_macro; pub use sp_inherents; #[cfg(feature = "std")] @@ -145,7 +145,7 @@ impl TypeId for PalletId { /// # Examples /// /// There are different ways to declare the `prefix` to use. The `prefix` type can either be -/// declared explicetly by passing it to the macro as an attribute or by letting the macro +/// declared explicitly by passing it to the macro as an attribute or by letting the macro /// guess on what the `prefix` type is. The `prefix` is always passed as the first generic /// argument to the type declaration. When using [`#[pallet::storage]`](pallet_macros::storage) /// this first generic argument is always `_`. Besides declaring the `prefix`, the rest of the @@ -175,6 +175,14 @@ pub use frame_support_procedural::storage_alias; pub use frame_support_procedural::derive_impl; +/// Experimental macros for defining dynamic params that can be used in pallet configs. +#[cfg(feature = "experimental")] +pub mod dynamic_params { + pub use frame_support_procedural::{ + dynamic_aggregated_params_internal, dynamic_pallet_params, dynamic_params, + }; +} + /// Create new implementations of the [`Get`](crate::traits::Get) trait. /// /// The so-called parameter type can be created in four different ways: @@ -500,6 +508,9 @@ pub use frame_support_procedural::{ construct_runtime, match_and_insert, transactional, PalletError, RuntimeDebugNoBound, }; +#[cfg(feature = "experimental")] +pub use frame_support_procedural::runtime; + #[doc(hidden)] pub use frame_support_procedural::{__create_tt_macro, __generate_dummy_part_checker}; @@ -692,7 +703,7 @@ pub use frame_support_procedural::crate_to_crate_version; #[macro_export] macro_rules! fail { ( $y:expr ) => {{ - return Err($y.into()) + return Err($y.into()); }}; } @@ -772,7 +783,7 @@ macro_rules! assert_err_with_weight { $crate::assert_err!($call.map(|_| ()).map_err(|e| e.error), $err); assert_eq!(dispatch_err_with_post.post_info.actual_weight, $weight); } else { - panic!("expected Err(_), got Ok(_).") + ::core::panic!("expected Err(_), got Ok(_).") } }; } @@ -892,18 +903,20 @@ pub mod pallet_prelude { }; pub use codec::{Decode, Encode, MaxEncodedLen}; pub use frame_support::pallet_macros::*; + /// The optional attribute `#[inject_runtime_type]` can be attached to `RuntimeCall`, /// `RuntimeEvent`, `RuntimeOrigin` or `PalletInfo` in an impl statement that has /// `#[register_default_impl]` attached to indicate that this item is generated by /// `construct_runtime`. /// /// Attaching this attribute to such an item ensures that the combined impl generated via - /// [`#[derive_impl(..)]`](`macro@super::derive_impl`) will use the correct type - /// auto-generated by `construct_runtime!`. + /// [`#[derive_impl(..)]`](`frame_support::derive_impl`) will use the correct + /// type auto-generated by + /// `construct_runtime!`. #[doc = docify::embed!("src/tests/inject_runtime_type.rs", derive_impl_works_with_runtime_type_injection)] /// /// However, if `no_aggregated_types` is specified while using - /// `[`#[derive_impl(..)]`](`macro@super::derive_impl`)`, then these items are attached + /// `[`#[derive_impl(..)]`](`frame_support::derive_impl`)`, then these items are attached /// verbatim to the combined impl. #[doc = docify::embed!("src/tests/inject_runtime_type.rs", derive_impl_works_with_no_aggregated_types)] pub use frame_support_procedural::inject_runtime_type; @@ -923,129 +936,26 @@ pub mod pallet_prelude { pub use sp_weights::Weight; } -/// The `pallet` attribute macro defines a pallet that can be used with -/// [`construct_runtime!`]. It must be attached to a module named `pallet` as follows: +/// The pallet struct placeholder `#[pallet::pallet]` is mandatory and allows you to +/// specify pallet information. /// -/// ```ignore -/// #[pallet] -/// pub mod pallet { -/// ... -/// } +/// The struct must be defined as follows: /// ``` +/// #[frame_support::pallet] +/// mod pallet { +/// #[pallet::pallet] // <- the macro +/// pub struct Pallet(_); // <- the struct definition /// -/// Note that various types can be automatically imported using -/// [`frame_support::pallet_prelude`] and `frame_system::pallet_prelude`: -/// -/// ```ignore -/// #[pallet] -/// pub mod pallet { -/// use frame_support::pallet_prelude::*; -/// use frame_system::pallet_prelude::*; -/// ... +/// #[pallet::config] +/// pub trait Config: frame_system::Config {} /// } /// ``` -/// -/// # pallet::* Attributes -/// -/// The `pallet` macro will parse any items within your `pallet` module that are annotated with -/// `#[pallet::*]` attributes. Some of these attributes are mandatory and some are optional, -/// and they can attach to different types of items within your pallet depending on the -/// attribute in question. The full list of `#[pallet::*]` attributes is shown below in the -/// order in which they are mentioned in this document: -/// -/// * [`pallet::pallet`](#pallet-struct-placeholder-palletpallet-mandatory) -/// * [`pallet::config`](#config-trait-palletconfig-mandatory) -/// * [`pallet::constant`](#palletconstant) -/// * [`pallet::disable_frame_system_supertrait_check`](#disable_supertrait_check) -/// * [`pallet::generate_store($vis trait Store)`](#palletgenerate_storevis-trait-store) -/// * [`pallet::storage_version`](#palletstorage_version) -/// * [`pallet::hooks`](#hooks-pallethooks-optional) -/// * [`pallet::call`](#call-palletcall-optional) -/// * [`pallet::weight($expr)`](#palletweightexpr) -/// * [`pallet::compact`](#palletcompact-some_arg-some_type) -/// * [`pallet::call_index($idx)`](#palletcall_indexidx) -/// * [`pallet::extra_constants`](#extra-constants-palletextra_constants-optional) -/// * [`pallet::error`](#error-palleterror-optional) -/// * [`pallet::event`](#event-palletevent-optional) -/// * [`pallet::generate_deposit($visibility fn -/// deposit_event)`](#palletgenerate_depositvisibility-fn-deposit_event) -/// * [`pallet::storage`](#storage-palletstorage-optional) -/// * [`pallet::getter(fn $my_getter_fn_name)`](#palletgetterfn-my_getter_fn_name-optional) -/// * [`pallet::storage_prefix = "SomeName"`](#palletstorage_prefix--somename-optional) -/// * [`pallet::unbounded`](#palletunbounded-optional) -/// * [`pallet::whitelist_storage`](#palletwhitelist_storage-optional) -/// * [`cfg(..)`](#cfg-for-storage) (on storage items) -/// * [`pallet::type_value`](#type-value-pallettype_value-optional) -/// * [`pallet::genesis_config`](#genesis-config-palletgenesis_config-optional) -/// * [`pallet::genesis_build`](#genesis-build-palletgenesis_build-optional) -/// * [`pallet::inherent`](#inherent-palletinherent-optional) -/// * [`pallet::validate_unsigned`](#validate-unsigned-palletvalidate_unsigned-optional) -/// * [`pallet::origin`](#origin-palletorigin-optional) -/// * [`pallet::composite_enum`](#composite-enum-palletcomposite_enum-optional) -/// -/// Note that at compile-time, the `#[pallet]` macro will analyze and expand all of these -/// attributes, ultimately removing their AST nodes before they can be parsed as real -/// attribute macro calls. This means that technically we do not need attribute macro -/// definitions for any of these attributes, however, for consistency and discoverability -/// reasons, we still maintain stub attribute macro definitions for all of these attributes in -/// the [`pallet_macros`] module which is automatically included in all pallets as part of the -/// pallet prelude. The actual "work" for all of these attribute macros can be found in the -/// macro expansion for `#[pallet]`. -/// -/// Also note that in this document, pallet attributes are explained using the syntax of -/// non-instantiable pallets. For an example of an instantiable pallet, see [this -/// example](#example-of-an-instantiable-pallet). -/// -/// # Dev Mode (`#[pallet(dev_mode)]`) -/// -/// Specifying the argument `dev_mode` on the `#[pallet]` or `#[frame_support::pallet]` -/// attribute attached to your pallet module will allow you to enable dev mode for a pallet. -/// The aim of dev mode is to loosen some of the restrictions and requirements placed on -/// production pallets for easy tinkering and development. Dev mode pallets should not be used -/// in production. Enabling dev mode has the following effects: -/// -/// * Weights no longer need to be specified on every `#[pallet::call]` declaration. By -/// default, dev mode pallets will assume a weight of zero (`0`) if a weight is not -/// specified. This is equivalent to specifying `#[weight(0)]` on all calls that do not -/// specify a weight. -/// * Call indices no longer need to be specified on every `#[pallet::call]` declaration. By -/// default, dev mode pallets will assume a call index based on the order of the call. -/// * All storages are marked as unbounded, meaning you do not need to implement -/// `MaxEncodedLen` on storage types. This is equivalent to specifying `#[pallet::unbounded]` -/// on all storage type definitions. -/// * Storage hashers no longer need to be specified and can be replaced by `_`. In dev mode, -/// these will be replaced by `Blake2_128Concat`. In case of explicit key-binding, `Hasher` -/// can simply be ignored when in `dev_mode`. -/// -/// Note that the `dev_mode` argument can only be supplied to the `#[pallet]` or -/// `#[frame_support::pallet]` attribute macro that encloses your pallet module. This argument -/// cannot be specified anywhere else, including but not limited to the `#[pallet::pallet]` -/// attribute macro. -/// -///
-/// WARNING:
-/// You should not deploy or use dev mode pallets in production. Doing so can break your chain
-/// and therefore should never be done. Once you are done tinkering, you should remove the
-/// 'dev_mode' argument from your #[pallet] declaration and fix any compile errors before
-/// attempting to use your pallet in a production scenario.
-/// 
-/// -/// # Pallet struct placeholder: `#[pallet::pallet]` (mandatory) -/// -/// The pallet struct placeholder `#[pallet::pallet]` is mandatory and allows you to specify -/// pallet information. -/// -/// The struct must be defined as follows: -/// ```ignore -/// #[pallet::pallet] -/// pub struct Pallet(_); -/// ``` +// /// I.e. a regular struct definition named `Pallet`, with generic T and no where clause. /// /// ## Macro expansion: /// -/// The macro adds this attribute to the struct definition: +/// The macro adds this attribute to the Pallet struct definition: /// ```ignore /// #[derive( /// frame_support::CloneNoBound, @@ -1054,1225 +964,926 @@ pub mod pallet_prelude { /// frame_support::RuntimeDebugNoBound, /// )] /// ``` -/// and replaces the type `_` with `PhantomData`. It also implements on the pallet: -/// * [`GetStorageVersion`](`traits::GetStorageVersion`) -/// * [`OnGenesis`](`traits::OnGenesis`): contains some logic to write the pallet version into -/// storage. -/// * `PalletErrorTypeInfo`: provides the type information for the pallet error, if defined. -/// -/// It declares `type Module` type alias for `Pallet`, used by `construct_runtime`. +/// and replaces the type `_` with `PhantomData`. /// -/// It implements [`PalletInfoAccess`](`traits::PalletInfoAccess') on `Pallet` to ease access -/// to pallet information given by [`frame_support::traits::PalletInfo`]. (The implementation -/// uses the associated type `frame_system::Config::PalletInfo`). +/// It also implements on the pallet: /// -/// It implements [`StorageInfoTrait`](`traits::StorageInfoTrait`) on `Pallet` which give -/// information about all storages. -/// -/// If the attribute `generate_store` is set then the macro creates the trait `Store` and -/// implements it on `Pallet`. +/// * [`GetStorageVersion`](frame_support::traits::GetStorageVersion) +/// * [`OnGenesis`](frame_support::traits::OnGenesis): contains some logic to write the pallet +/// version into storage. +/// * [`PalletInfoAccess`](frame_support::traits::PalletInfoAccess) to ease access to pallet +/// information given by [`frame_support::traits::PalletInfo`]. (The implementation uses the +/// associated type [`frame_support::traits::PalletInfo`]). +/// * [`StorageInfoTrait`](frame_support::traits::StorageInfoTrait) to give information about +/// storages. /// /// If the attribute `set_storage_max_encoded_len` is set then the macro calls -/// [`StorageInfoTrait`](`traits::StorageInfoTrait`) for each storage in the implementation of -/// [`StorageInfoTrait`](`traits::StorageInfoTrait`) for the pallet. Otherwise it implements -/// [`StorageInfoTrait`](`traits::StorageInfoTrait`) for the pallet using the -/// [`PartialStorageInfoTrait`](`traits::PartialStorageInfoTrait`) implementation of storages. -/// -/// # Config trait: `#[pallet::config]` (mandatory) -/// -/// The mandatory attribute `#[pallet::config]` defines the configurable options for the -/// pallet. -/// -/// Item must be defined as: -/// -/// ```ignore -/// #[pallet::config] -/// pub trait Config: frame_system::Config + $optionally_some_other_supertraits -/// $optional_where_clause -/// { -/// ... -/// } -/// ``` -/// -/// I.e. a regular trait definition named `Config`, with the supertrait -/// `frame_system::pallet::Config`, and optionally other supertraits and a where clause. -/// (Specifying other supertraits here is known as [tight -/// coupling](https://docs.substrate.io/reference/how-to-guides/pallet-design/use-tight-coupling/)) -/// -/// The associated type `RuntimeEvent` is reserved. If defined, it must have the bounds -/// `From` and `IsType<::RuntimeEvent>`. -/// -/// [`pallet::event`](`frame_support::pallet_macros::event`) must be present if `RuntimeEvent` -/// exists as a config item in your `#[pallet::config]`. -/// -/// Also see [`pallet::config`](`frame_support::pallet_macros::config`) -/// -/// ## `pallet::constant` -/// -/// The `#[pallet::constant]` attribute can be used to add an associated type trait bounded by -/// [`Get`](crate::traits::Get) from [`pallet::config`](#palletconfig) into metadata, e.g.: -/// -/// ```ignore -/// #[pallet::config] -/// pub trait Config: frame_system::Config { -/// #[pallet::constant] -/// type Foo: Get; -/// } -/// ``` -/// -/// Also see [`pallet::constant`](`frame_support::pallet_macros::constant`) -/// -/// ## `pallet::disable_frame_system_supertrait_check` -/// -/// -/// To bypass the `frame_system::Config` supertrait check, use the attribute -/// `pallet::disable_frame_system_supertrait_check`, e.g.: -/// -/// ```ignore -/// #[pallet::config] -/// #[pallet::disable_frame_system_supertrait_check] -/// pub trait Config: pallet_timestamp::Config {} -/// ``` -/// -/// NOTE: Bypassing the `frame_system::Config` supertrait check is typically desirable when you -/// want to write an alternative to the `frame_system` pallet. -/// -/// Also see -/// [`pallet::disable_frame_system_supertrait_check`](`frame_support::pallet_macros::disable_frame_system_supertrait_check`) -/// -/// ## Macro expansion: -/// -/// The macro expands pallet constant metadata with the information given by -/// `#[pallet::constant]`. -/// -/// # `pallet::generate_store($vis trait Store)` -/// -/// To generate a `Store` trait associating all storages, annotate your `Pallet` struct with -/// the attribute `#[pallet::generate_store($vis trait Store)]`, e.g.: -/// -/// ```ignore -/// #[pallet::pallet] -/// #[pallet::generate_store(pub(super) trait Store)] -/// pub struct Pallet(_); -/// ``` -/// More precisely, the `Store` trait contains an associated type for each storage. It is -/// implemented for `Pallet` allowing access to the storage from pallet struct. -/// -/// Thus when defining a storage named `Foo`, it can later be accessed from `Pallet` using -/// `::Foo`. -/// -/// NOTE: this attribute is only valid when applied _directly_ to your `Pallet` struct -/// definition. -/// -/// Also see [`pallet::generate_store`](`frame_support::pallet_macros::generate_store`). -/// -/// # `pallet::storage_version` -/// -/// Because the [`pallet::pallet`](#pallet-struct-placeholder-palletpallet-mandatory) macro -/// implements [`traits::GetStorageVersion`], the current storage version needs to be -/// communicated to the macro. This can be done by using the `pallet::storage_version` -/// attribute: -/// -/// ```ignore -/// const STORAGE_VERSION: StorageVersion = StorageVersion::new(5); -/// -/// #[pallet::pallet] -/// #[pallet::storage_version(STORAGE_VERSION)] -/// pub struct Pallet(_); -/// ``` -/// -/// If not present, the current storage version is set to the default value. -/// -/// Also see [`pallet::storage_version`](`frame_support::pallet_macros::storage_version`) -/// -/// # Hooks: `#[pallet::hooks]` (optional) -/// -/// The `pallet::hooks` attribute allows you to specify a `Hooks` implementation for `Pallet` -/// that specifies pallet-specific logic. -/// -/// The item the attribute attaches to must be defined as follows: -/// ```ignore -/// #[pallet::hooks] -/// impl Hooks> for Pallet $optional_where_clause { -/// ... -/// } -/// ``` -/// I.e. a regular trait implementation with generic bound: `T: Config`, for the trait -/// `Hooks>` (they are defined in preludes), for the type `Pallet` and -/// with an optional where clause. -/// -/// If no `#[pallet::hooks]` exists, then the following default implementation is -/// automatically generated: -/// ```ignore -/// #[pallet::hooks] -/// impl Hooks> for Pallet {} -/// ``` -/// -/// Also see [`pallet::hooks`](`frame_support::pallet_macros::hooks`) -/// -/// # Call: `#[pallet::call]` (optional) -/// -/// Implementation of pallet dispatchables. -/// -/// Item must be defined as: -/// ```ignore -/// #[pallet::call] -/// impl Pallet { -/// /// $some_doc -/// #[pallet::weight($ExpressionResultingInWeight)] -/// pub fn $fn_name( -/// origin: OriginFor, -/// $some_arg: $some_type, -/// // or with compact attribute: #[pallet::compact] $some_arg: $some_type, -/// ... -/// ) -> DispatchResultWithPostInfo { // or `-> DispatchResult` -/// ... -/// } -/// ... -/// } -/// ``` -/// I.e. a regular type implementation, with generic `T: Config`, on type `Pallet`, with -/// an optional where clause. -/// -/// ## `#[pallet::weight($expr)]` -/// -/// Each dispatchable needs to define a weight with `#[pallet::weight($expr)]` attribute, the -/// first argument must be `origin: OriginFor`. -/// -/// Also see [`pallet::weight`](`frame_support::pallet_macros::weight`) -/// -/// ### `#[pallet::compact] $some_arg: $some_type` -/// -/// Compact encoding for arguments can be achieved via `#[pallet::compact]`. The function must -/// return a `DispatchResultWithPostInfo` or `DispatchResult`. -/// -/// Also see [`pallet::compact`](`frame_support::pallet_macros::compact`) -/// -/// ## `#[pallet::call_index($idx)]` -/// -/// Each dispatchable may also be annotated with the `#[pallet::call_index($idx)]` attribute, -/// which explicitly defines the codec index for the dispatchable function in the `Call` enum. -/// -/// All call indexes start from 0, until it encounters a dispatchable function with a defined -/// call index. The dispatchable function that lexically follows the function with a defined -/// call index will have that call index, but incremented by 1, e.g. if there are 3 -/// dispatchable functions `fn foo`, `fn bar` and `fn qux` in that order, and only `fn bar` -/// has a call index of 10, then `fn qux` will have an index of 11, instead of 1. -/// -/// **WARNING**: modifying dispatchables, changing their order, removing some, etc., must be -/// done with care. Indeed this will change the outer runtime call type (which is an enum with -/// one variant per pallet), this outer runtime call can be stored on-chain (e.g. in -/// `pallet-scheduler`). Thus migration might be needed. To mitigate against some of this, the -/// `#[pallet::call_index($idx)]` attribute can be used to fix the order of the dispatchable so -/// that the `Call` enum encoding does not change after modification. As a general rule of -/// thumb, it is therefore adventageous to always add new calls to the end so you can maintain -/// the existing order of calls. -/// -/// Also see [`pallet::call_index`](`frame_support::pallet_macros::call_index`) -/// -/// # Extra constants: `#[pallet::extra_constants]` (optional) -/// -/// Allows you to define some extra constants to be added into constant metadata. -/// -/// Item must be defined as: -/// -/// ```ignore -/// #[pallet::extra_constants] -/// impl Pallet where $optional_where_clause { -/// /// $some_doc -/// $vis fn $fn_name() -> $some_return_type { -/// ... -/// } -/// ... -/// } -/// ``` -/// I.e. a regular rust `impl` block with some optional where clause and functions with 0 args, -/// 0 generics, and some return type. -/// -/// ## Macro expansion -/// -/// The macro add some extra constants to pallet constant metadata. -/// -/// Also see: [`pallet::extra_constants`](`frame_support::pallet_macros::extra_constants`) -/// -/// # Error: `#[pallet::error]` (optional) -/// -/// The `#[pallet::error]` attribute allows you to define an error enum that will be returned -/// from the dispatchable when an error occurs. The information for this error type is then -/// stored in metadata. -/// -/// Item must be defined as: -/// -/// ```ignore -/// #[pallet::error] -/// pub enum Error { -/// /// $some_optional_doc -/// $SomeFieldLessVariant, -/// /// $some_more_optional_doc -/// $SomeVariantWithOneField(FieldType), -/// ... -/// } -/// ``` -/// I.e. a regular enum named `Error`, with generic `T` and fieldless or multiple-field -/// variants. -/// -/// Any field type in the enum variants must implement [`scale_info::TypeInfo`] in order to be -/// properly used in the metadata, and its encoded size should be as small as possible, -/// preferably 1 byte in size in order to reduce storage size. The error enum itself has an -/// absolute maximum encoded size specified by [`MAX_MODULE_ERROR_ENCODED_SIZE`]. -/// -/// (1 byte can still be 256 different errors. The more specific the error, the easier it is to -/// diagnose problems and give a better experience to the user. Don't skimp on having lots of -/// individual error conditions.) -/// -/// Field types in enum variants must also implement [`PalletError`](traits::PalletError), -/// otherwise the pallet will fail to compile. Rust primitive types have already implemented -/// the [`PalletError`](traits::PalletError) trait along with some commonly used stdlib types -/// such as [`Option`] and -/// [`PhantomData`](`frame_support::__private::sp_std::marker::PhantomData`), and hence in most -/// use cases, a manual implementation is not necessary and is discouraged. -/// -/// The generic `T` must not bound anything and a `where` clause is not allowed. That said, -/// bounds and/or a where clause should not needed for any use-case. -/// -/// Also see: [`pallet::error`](`frame_support::pallet_macros::error`) -/// -/// # Event: `#[pallet::event]` (optional) -/// -/// Allows you to define pallet events. Pallet events are stored under the `system` / `events` -/// key when the block is applied (and then replaced when the next block writes it's events). -/// -/// The Event enum must be defined as follows: -/// -/// ```ignore -/// #[pallet::event] -/// #[pallet::generate_deposit($visibility fn deposit_event)] // Optional -/// pub enum Event<$some_generic> $optional_where_clause { -/// /// Some doc -/// $SomeName($SomeType, $YetanotherType, ...), -/// ... -/// } -/// ``` -/// -/// I.e. an enum (with named or unnamed fields variant), named `Event`, with generic: none or -/// `T` or `T: Config`, and optional w here clause. -/// -/// Each field must implement [`Clone`], [`Eq`], [`PartialEq`], [`Encode`], [`Decode`], and -/// [`Debug`] (on std only). For ease of use, bound by the trait -/// [`Member`](`frame_support::pallet_prelude::Member`), available in -/// frame_support::pallet_prelude. -/// -/// Also see [`pallet::event`](`frame_support::pallet_macros::event`) -/// -/// ## `#[pallet::generate_deposit($visibility fn deposit_event)]` -/// -/// The attribute `#[pallet::generate_deposit($visibility fn deposit_event)]` generates a -/// helper function on `Pallet` that handles deposit events. -/// -/// NOTE: For instantiable pallets, the event must be generic over `T` and `I`. -/// -/// Also see [`pallet::generate_deposit`](`frame_support::pallet_macros::generate_deposit`) -/// -/// # Storage: `#[pallet::storage]` (optional) -/// -/// The `#[pallet::storage]` attribute lets you define some abstract storage inside of runtime -/// storage and also set its metadata. This attribute can be used multiple times. -/// -/// Item should be defined as: -/// -/// ```ignore -/// #[pallet::storage] -/// #[pallet::getter(fn $getter_name)] // optional -/// $vis type $StorageName<$some_generic> $optional_where_clause -/// = $StorageType<$generic_name = $some_generics, $other_name = $some_other, ...>; -/// ``` -/// -/// or with unnamed generic: -/// -/// ```ignore -/// #[pallet::storage] -/// #[pallet::getter(fn $getter_name)] // optional -/// $vis type $StorageName<$some_generic> $optional_where_clause -/// = $StorageType<_, $some_generics, ...>; -/// ``` -/// -/// I.e. it must be a type alias, with generics: `T` or `T: Config`. The aliased type must be -/// one of [`StorageValue`](`pallet_prelude::StorageValue`), -/// [`StorageMap`](`pallet_prelude::StorageMap`) or -/// [`StorageDoubleMap`](`pallet_prelude::StorageDoubleMap`). The generic arguments of the -/// storage type can be given in two manners: named and unnamed. For named generic arguments, -/// the name for each argument should match the name defined for it on the storage struct: -/// * [`StorageValue`](`pallet_prelude::StorageValue`) expects `Value` and optionally -/// `QueryKind` and `OnEmpty`, -/// * [`StorageMap`](`pallet_prelude::StorageMap`) expects `Hasher`, `Key`, `Value` and -/// optionally `QueryKind` and `OnEmpty`, -/// * [`CountedStorageMap`](`pallet_prelude::CountedStorageMap`) expects `Hasher`, `Key`, -/// `Value` and optionally `QueryKind` and `OnEmpty`, -/// * [`StorageDoubleMap`](`pallet_prelude::StorageDoubleMap`) expects `Hasher1`, `Key1`, -/// `Hasher2`, `Key2`, `Value` and optionally `QueryKind` and `OnEmpty`. -/// -/// For unnamed generic arguments: Their first generic must be `_` as it is replaced by the -/// macro and other generic must declared as a normal generic type declaration. -/// -/// The `Prefix` generic written by the macro is generated using -/// `PalletInfo::name::>()` and the name of the storage type. E.g. if runtime names -/// the pallet "MyExample" then the storage `type Foo = ...` should use the prefix: -/// `Twox128(b"MyExample") ++ Twox128(b"Foo")`. -/// -/// For the [`CountedStorageMap`](`pallet_prelude::CountedStorageMap`) variant, the `Prefix` -/// also implements -/// [`CountedStorageMapInstance`](`frame_support::storage::types::CountedStorageMapInstance`). -/// It also associates a [`CounterPrefix`](`pallet_prelude::CounterPrefix'), which is -/// implemented the same as above, but the storage prefix is prepend with `"CounterFor"`. E.g. -/// if runtime names the pallet "MyExample" then the storage `type Foo = -/// CountedStorageaMap<...>` will store its counter at the prefix: `Twox128(b"MyExample") ++ -/// Twox128(b"CounterForFoo")`. -/// -/// E.g: -/// -/// ```ignore -/// #[pallet::storage] -/// pub(super) type MyStorage = StorageMap; -/// ``` -/// -/// In this case the final prefix used by the map is `Twox128(b"MyExample") ++ -/// Twox128(b"OtherName")`. -/// -/// Also see [`pallet::storage`](`frame_support::pallet_macros::storage`) -/// -/// ## `#[pallet::getter(fn $my_getter_fn_name)]` (optional) -/// -/// The optional attribute `#[pallet::getter(fn $my_getter_fn_name)]` allows you to define a -/// getter function on `Pallet`. -/// -/// Also see [`pallet::getter`](`frame_support::pallet_macros::getter`) -/// -/// ## `#[pallet::storage_prefix = "SomeName"]` (optional) -/// -/// The optional attribute `#[pallet::storage_prefix = "SomeName"]` allows you to define the -/// storage prefix to use, see how `Prefix` generic is implemented above. This is helpful if -/// you wish to rename the storage field but don't want to perform a migration. -/// -/// E.g: -/// -/// ```ignore -/// #[pallet::storage] -/// #[pallet::storage_prefix = "foo"] -/// #[pallet::getter(fn my_storage)] -/// pub(super) type MyStorage = StorageMap; -/// ``` -/// -/// or -/// -/// ```ignore -/// #[pallet::storage] -/// #[pallet::getter(fn my_storage)] -/// pub(super) type MyStorage = StorageMap<_, Blake2_128Concat, u32, u32>; -/// ``` -/// -/// Also see [`pallet::storage_prefix`](`frame_support::pallet_macros::storage_prefix`) -/// -/// ## `#[pallet::unbounded]` (optional) -/// -/// The optional attribute `#[pallet::unbounded]` declares the storage as unbounded. When -/// implementating the storage info (when `#[pallet::generate_storage_info]` is specified on -/// the pallet struct placeholder), the size of the storage will be declared as unbounded. This -/// can be useful for storage which can never go into PoV (Proof of Validity). -/// -/// Also see [`pallet::unbounded`](`frame_support::pallet_macros::unbounded`) -/// -/// ## `#[pallet::whitelist_storage]` (optional) -/// -/// The optional attribute `#[pallet::whitelist_storage]` will declare the storage as -/// whitelisted from benchmarking. -/// -/// See -/// [`pallet::whitelist_storage`](frame_support::pallet_macros::whitelist_storage) -/// for more info. -/// -/// ## `#[cfg(..)]` (for storage) -/// The optional attributes `#[cfg(..)]` allow conditional compilation for the storage. -/// -/// E.g: -/// -/// ```ignore -/// #[cfg(feature = "my-feature")] -/// #[pallet::storage] -/// pub(super) type MyStorage = StorageValue; -/// ``` -/// -/// All the `cfg` attributes are automatically copied to the items generated for the storage, -/// i.e. the getter, storage prefix, and the metadata element etc. -/// -/// Any type placed as the `QueryKind` parameter must implement -/// [`frame_support::storage::types::QueryKindTrait`]. There are 3 implementations of this -/// trait by default: -/// -/// 1. [`OptionQuery`](`frame_support::storage::types::OptionQuery`), the default `QueryKind` -/// used when this type parameter is omitted. Specifying this as the `QueryKind` would cause -/// storage map APIs that return a `QueryKind` to instead return an [`Option`], returning -/// `Some` when a value does exist under a specified storage key, and `None` otherwise. -/// 2. [`ValueQuery`](`frame_support::storage::types::ValueQuery`) causes storage map APIs that -/// return a `QueryKind` to instead return the value type. In cases where a value does not -/// exist under a specified storage key, the `OnEmpty` type parameter on `QueryKindTrait` is -/// used to return an appropriate value. -/// 3. [`ResultQuery`](`frame_support::storage::types::ResultQuery`) causes storage map APIs -/// that return a `QueryKind` to instead return a `Result`, with `T` being the value -/// type and `E` being the pallet error type specified by the `#[pallet::error]` attribute. -/// In cases where a value does not exist under a specified storage key, an `Err` with the -/// specified pallet error variant is returned. -/// -/// NOTE: If the `QueryKind` generic parameter is still generic at this stage or is using some -/// type alias then the generation of the getter might fail. In this case the getter can be -/// implemented manually. -/// -/// NOTE: The generic `Hasher` must implement the [`StorageHasher`] trait (or the type is not -/// usable at all). We use [`StorageHasher::METADATA`] for the metadata of the hasher of the -/// storage item. Thus generic hasher is supported. -/// -/// ## Macro expansion -/// -/// For each storage item the macro generates a struct named -/// `_GeneratedPrefixForStorage$NameOfStorage`, and implements -/// [`StorageInstance`](traits::StorageInstance) on it using the pallet and storage name. It -/// then uses it as the first generic of the aliased type. For -/// [`CountedStorageMap`](`pallet_prelude::CountedStorageMap`), -/// [`CountedStorageMapInstance`](`frame_support::storage::types::CountedStorageMapInstance`) -/// is implemented, and another similar struct is generated. -/// -/// For a named generic, the macro will reorder the generics, and remove the names. -/// -/// The macro implements the function `storage_metadata` on the `Pallet` implementing the -/// metadata for all storage items based on their kind: -/// * for a storage value, the type of the value is copied into the metadata -/// * for a storage map, the type of the values and the key's type is copied into the metadata -/// * for a storage double map, the type of the values, and the types of `key1` and `key2` are -/// copied into the metadata. -/// -/// # Type value: `#[pallet::type_value]` (optional) -/// -/// The `#[pallet::type_value]` attribute lets you define a struct implementing the -/// [`Get`](crate::traits::Get) trait to ease use of storage types. This attribute is meant to -/// be used alongside [`#[pallet::storage]`](#storage-palletstorage-optional) to define a -/// storage's default value. This attribute can be used multiple times. -/// -/// Item must be defined as: +/// [`StorageInfoTrait`](frame_support::traits::StorageInfoTrait) for each storage in the +/// implementation of [`StorageInfoTrait`](frame_support::traits::StorageInfoTrait) for the +/// pallet. Otherwise it implements +/// [`StorageInfoTrait`](frame_support::traits::StorageInfoTrait) for the pallet using the +/// [`PartialStorageInfoTrait`](frame_support::traits::PartialStorageInfoTrait) +/// implementation of storages. /// -/// ```ignore -/// #[pallet::type_value] -/// fn $MyDefaultName<$some_generic>() -> $default_type $optional_where_clause { $expr } -/// ``` -/// -/// I.e.: a function definition with generics none or `T: Config` and a returned type. -/// -/// E.g.: -/// -/// ```ignore -/// #[pallet::type_value] -/// fn MyDefault() -> T::Balance { 3.into() } -/// ``` -/// -/// Also see [`pallet::type_value`](`frame_support::pallet_macros::type_value`) -/// -/// # Genesis config: `#[pallet::genesis_config]` (optional) -/// -/// The `#[pallet::genesis_config]` attribute allows you to define the genesis configuration -/// for the pallet. -/// -/// Item is defined as either an enum or a struct. It needs to be public and implement the -/// trait [`BuildGenesisConfig`](`traits::BuildGenesisConfig`) with -/// [`#[pallet::genesis_build]`](#genesis-build-palletgenesis_build-optional). The type -/// generics are constrained to be either none, or `T` or `T: Config`. -/// -/// E.g: -/// -/// ```ignore -/// #[pallet::genesis_config] -/// pub struct GenesisConfig { -/// _myfield: BalanceOf, -/// } -/// ``` -/// -/// Also see [`pallet::genesis_config`](`frame_support::pallet_macros::genesis_config`) -/// -/// # Genesis build: `#[pallet::genesis_build]` (optional) -/// -/// The `#[pallet::genesis_build]` attribute allows you to define how `genesis_configuration` -/// is built. This takes as input the `GenesisConfig` type (as `self`) and constructs the -/// pallet's initial state. -/// -/// The impl must be defined as: -/// -/// ```ignore -/// #[pallet::genesis_build] -/// impl GenesisBuild for GenesisConfig<$maybe_generics> { -/// fn build(&self) { $expr } -/// } -/// ``` -/// -/// I.e. a trait implementation with generic `T: Config`, of trait `GenesisBuild` on -/// type `GenesisConfig` with generics none or `T`. -/// -/// E.g.: -/// -/// ```ignore -/// #[pallet::genesis_build] -/// impl GenesisBuild for GenesisConfig { -/// fn build(&self) {} -/// } -/// ``` -/// -/// Also see [`pallet::genesis_build`](`frame_support::pallet_macros::genesis_build`) -/// -/// # Inherent: `#[pallet::inherent]` (optional) +/// ## Dev Mode (`#[pallet(dev_mode)]`) /// -/// The `#[pallet::inherent]` attribute allows the pallet to provide some -/// [inherent](https://docs.substrate.io/fundamentals/transaction-types/#inherent-transactions). -/// An inherent is some piece of data that is inserted by a block authoring node at block -/// creation time and can either be accepted or rejected by validators based on whether the -/// data falls within an acceptable range. +/// Specifying the argument `dev_mode` will allow you to enable dev mode for a pallet. The +/// aim of dev mode is to loosen some of the restrictions and requirements placed on +/// production pallets for easy tinkering and development. Dev mode pallets should not be +/// used in production. Enabling dev mode has the following effects: /// -/// The most common inherent is the `timestamp` that is inserted into every block. Since there -/// is no way to validate timestamps, validators simply check that the timestamp reported by -/// the block authoring node falls within an acceptable range. -/// -/// Item must be defined as: -/// -/// ```ignore -/// #[pallet::inherent] -/// impl ProvideInherent for Pallet { -/// // ... regular trait implementation -/// } -/// ``` -/// -/// I.e. a trait implementation with bound `T: Config`, of trait -/// [`ProvideInherent`](`pallet_prelude::ProvideInherent`) for type `Pallet`, and some -/// optional where clause. -/// -/// Also see [`pallet::inherent`](`frame_support::pallet_macros::inherent`) -/// -/// # Validate unsigned: `#[pallet::validate_unsigned]` (optional) -/// -/// The `#[pallet::validate_unsigned]` attribute allows the pallet to validate some unsigned -/// transaction: -/// -/// Item must be defined as: -/// -/// ```ignore -/// #[pallet::validate_unsigned] -/// impl ValidateUnsigned for Pallet { -/// // ... regular trait implementation -/// } -/// ``` -/// -/// I.e. a trait implementation with bound `T: Config`, of trait -/// [`ValidateUnsigned`](`pallet_prelude::ValidateUnsigned`) for type `Pallet`, and some -/// optional where clause. -/// -/// NOTE: There is also the [`sp_runtime::traits::SignedExtension`] trait that can be used to -/// add some specific logic for transaction validation. -/// -/// Also see [`pallet::validate_unsigned`](`frame_support::pallet_macros::validate_unsigned`) -/// -/// # Origin: `#[pallet::origin]` (optional) -/// -/// The `#[pallet::origin]` attribute allows you to define some origin for the pallet. -/// -/// Item must be either a type alias, an enum, or a struct. It needs to be public. +/// * Weights no longer need to be specified on every `#[pallet::call]` declaration. By +/// default, dev mode pallets will assume a weight of zero (`0`) if a weight is not +/// specified. This is equivalent to specifying `#[weight(0)]` on all calls that do not +/// specify a weight. +/// * Call indices no longer need to be specified on every `#[pallet::call]` declaration. By +/// default, dev mode pallets will assume a call index based on the order of the call. +/// * All storages are marked as unbounded, meaning you do not need to implement +/// [`MaxEncodedLen`](frame_support::pallet_prelude::MaxEncodedLen) on storage types. This is +/// equivalent to specifying `#[pallet::unbounded]` on all storage type definitions. +/// * Storage hashers no longer need to be specified and can be replaced by `_`. In dev mode, +/// these will be replaced by `Blake2_128Concat`. In case of explicit key-binding, `Hasher` +/// can simply be ignored when in `dev_mode`. /// -/// E.g.: +/// Note that the `dev_mode` argument can only be supplied to the `#[pallet]` or +/// `#[frame_support::pallet]` attribute macro that encloses your pallet module. This +/// argument cannot be specified anywhere else, including but not limited to the +/// `#[pallet::pallet]` attribute macro. /// -/// ```ignore -/// #[pallet::origin] -/// pub struct Origin(PhantomData<(T)>); -/// ``` -/// -/// **WARNING**: modifying origin changes the outer runtime origin. This outer runtime origin -/// can be stored on-chain (e.g. in `pallet-scheduler`), thus any change must be done with care -/// as it might require some migration. -/// -/// NOTE: for instantiable pallets, the origin must be generic over `T` and `I`. -/// -/// Also see [`pallet::origin`](`frame_support::pallet_macros::origin`) -/// -/// # Composite enum `#[pallet::composite_enum]` (optional) -/// -/// The `#[pallet::composite_enum]` attribute allows you to define an enum on the pallet which -/// will then instruct `construct_runtime` to amalgamate all similarly-named enums from other -/// pallets into an aggregate enum. This is similar in principle with how the aggregate enum is -/// generated for `#[pallet::event]` or `#[pallet::error]`. -/// -/// The item tagged with `#[pallet::composite_enum]` MUST be an enum declaration, and can ONLY -/// be the following identifiers: `FreezeReason`, `HoldReason`, `LockId` or `SlashReason`. -/// Custom identifiers are not supported. -/// -/// NOTE: For ease of usage, when no `#[derive]` attributes are detected, the -/// `#[pallet::composite_enum]` attribute will automatically derive the following traits for -/// the enum: -/// -/// ```ignore -/// Copy, Clone, Eq, PartialEq, Encode, Decode, MaxEncodedLen, TypeInfo, RuntimeDebug -/// ``` -/// -/// The inverse is also true: if there are any #[derive] attributes present for the enum, then -/// the attribute will not automatically derive any of the traits described above. -/// -/// # General notes on instantiable pallets -/// -/// An instantiable pallet is one where Config is generic, i.e. `Config`. This allows -/// runtime to implement multiple instances of the pallet, by using different types for the -/// generic. This is the sole purpose of the generic `I`, but because -/// [`PalletInfo`](`traits::PalletInfo`) requires the `Pallet` placeholder to be static, it is -/// important to bound by `'static` whenever [`PalletInfo`](`traits::PalletInfo`) can be used. -/// Additionally, in order to make an instantiable pallet usable as a regular pallet without an -/// instance, it is important to bound by `= ()` on every type. -/// -/// Thus impl bound looks like `impl, I: 'static>`, and types look like -/// `SomeType` or `SomeType, I: 'static = ()>`. -/// -/// # Example of a non-instantiable pallet -/// -/// ``` -/// pub use pallet::*; // reexport in crate namespace for `construct_runtime!` -/// -/// #[frame_support::pallet] -/// // NOTE: The name of the pallet is provided by `construct_runtime` and is used as -/// // the unique identifier for the pallet's storage. It is not defined in the pallet itself. -/// pub mod pallet { -/// use frame_support::pallet_prelude::*; // Import various types used in the pallet definition -/// use frame_system::pallet_prelude::*; // Import some system helper types. -/// -/// type BalanceOf = ::Balance; -/// -/// // Define the generic parameter of the pallet -/// // The macro parses `#[pallet::constant]` attributes and uses them to generate metadata -/// // for the pallet's constants. -/// #[pallet::config] -/// pub trait Config: frame_system::Config { -/// #[pallet::constant] // put the constant in metadata -/// type MyGetParam: Get; -/// type Balance: Parameter + MaxEncodedLen + From; -/// type RuntimeEvent: From> + IsType<::RuntimeEvent>; -/// } -/// -/// // Define some additional constant to put into the constant metadata. -/// #[pallet::extra_constants] -/// impl Pallet { -/// /// Some description -/// fn exra_constant_name() -> u128 { 4u128 } -/// } -/// -/// // Define the pallet struct placeholder, various pallet function are implemented on it. -/// #[pallet::pallet] -/// #[pallet::generate_store(pub(super) trait Store)] -/// pub struct Pallet(_); -/// -/// // Implement the pallet hooks. -/// #[pallet::hooks] -/// impl Hooks> for Pallet { -/// fn on_initialize(_n: BlockNumberFor) -> Weight { -/// unimplemented!(); -/// } -/// -/// // can implement also: on_finalize, on_runtime_upgrade, offchain_worker, ... -/// // see `Hooks` trait -/// } -/// -/// // Declare Call struct and implement dispatchables. -/// // -/// // WARNING: Each parameter used in functions must implement: Clone, Debug, Eq, PartialEq, -/// // Codec. -/// // -/// // The macro parses `#[pallet::compact]` attributes on function arguments and implements -/// // the `Call` encoding/decoding accordingly. -/// #[pallet::call] -/// impl Pallet { -/// /// Doc comment put in metadata -/// #[pallet::weight(0)] // Defines weight for call (function parameters are in scope) -/// pub fn toto( -/// origin: OriginFor, -/// #[pallet::compact] _foo: u32, -/// ) -> DispatchResultWithPostInfo { -/// let _ = origin; -/// unimplemented!(); -/// } -/// } -/// -/// // Declare the pallet `Error` enum (this is optional). -/// // The macro generates error metadata using the doc comment on each variant. -/// #[pallet::error] -/// pub enum Error { -/// /// doc comment put into metadata -/// InsufficientProposersBalance, -/// } -/// -/// // Declare pallet Event enum (this is optional). -/// // -/// // WARNING: Each type used in variants must implement: Clone, Debug, Eq, PartialEq, Codec. -/// // -/// // The macro generates event metadata, and derive Clone, Debug, Eq, PartialEq and Codec -/// #[pallet::event] -/// // Generate a funciton on Pallet to deposit an event. -/// #[pallet::generate_deposit(pub(super) fn deposit_event)] -/// pub enum Event { -/// /// doc comment put in metadata -/// // `::AccountId` is not defined in metadata list, the last -/// // Thus the metadata is `::AccountId`. -/// Proposed(::AccountId), -/// /// doc -/// // here metadata will be `Balance` as define in metadata list -/// Spending(BalanceOf), -/// // here metadata will be `Other` as define in metadata list -/// Something(u32), -/// } -/// -/// // Define a struct which implements `frame_support::traits::Get` (optional). -/// #[pallet::type_value] -/// pub(super) fn MyDefault() -> T::Balance { 3.into() } -/// -/// // Declare a storage item. Any amount of storage items can be declared (optional). -/// // -/// // Is expected either `StorageValue`, `StorageMap` or `StorageDoubleMap`. -/// // The macro generates the prefix type and replaces the first generic `_`. -/// // -/// // The macro expands the metadata for the storage item with the type used: -/// // * for a storage value the type of the value is copied into the metadata -/// // * for a storage map the type of the values and the type of the key is copied into the metadata -/// // * for a storage double map the types of the values and keys are copied into the -/// // metadata. -/// // -/// // NOTE: The generic `Hasher` must implement the `StorageHasher` trait (or the type is not -/// // usable at all). We use [`StorageHasher::METADATA`] for the metadata of the hasher of the -/// // storage item. Thus generic hasher is supported. -/// #[pallet::storage] -/// pub(super) type MyStorageValue = -/// StorageValue>; -/// -/// // Another storage declaration -/// #[pallet::storage] -/// #[pallet::getter(fn my_storage)] -/// #[pallet::storage_prefix = "SomeOtherName"] -/// pub(super) type MyStorage = -/// StorageMap; -/// -/// // Declare the genesis config (optional). -/// // -/// // The macro accepts either a struct or an enum; it checks that generics are consistent. -/// // -/// // Type must implement the `Default` trait. -/// #[pallet::genesis_config] -/// #[derive(frame_support::DefaultNoBound)] -/// pub struct GenesisConfig { -/// _config: sp_std::marker::PhantomData, -/// _myfield: u32, -/// } -/// -/// // Declare genesis builder. (This is need only if GenesisConfig is declared) -/// #[pallet::genesis_build] -/// impl BuildGenesisConfig for GenesisConfig { -/// fn build(&self) {} -/// } -/// -/// // Declare a pallet origin (this is optional). -/// // -/// // The macro accept type alias or struct or enum, it checks generics are consistent. -/// #[pallet::origin] -/// pub struct Origin(PhantomData); -/// -/// // Declare a hold reason (this is optional). -/// // -/// // Creates a hold reason for this pallet that is aggregated by `construct_runtime`. -/// // A similar enum can be defined for `FreezeReason`, `LockId` or `SlashReason`. -/// #[pallet::composite_enum] -/// pub enum HoldReason { -/// SomeHoldReason -/// } -/// -/// // Declare validate_unsigned implementation (this is optional). -/// #[pallet::validate_unsigned] -/// impl ValidateUnsigned for Pallet { -/// type Call = Call; -/// fn validate_unsigned( -/// source: TransactionSource, -/// call: &Self::Call -/// ) -> TransactionValidity { -/// Err(TransactionValidityError::Invalid(InvalidTransaction::Call)) -/// } -/// } -/// -/// // Declare inherent provider for pallet (this is optional). -/// #[pallet::inherent] -/// impl ProvideInherent for Pallet { -/// type Call = Call; -/// type Error = InherentError; -/// -/// const INHERENT_IDENTIFIER: InherentIdentifier = INHERENT_IDENTIFIER; -/// -/// fn create_inherent(_data: &InherentData) -> Option { -/// unimplemented!(); -/// } -/// -/// fn is_inherent(_call: &Self::Call) -> bool { -/// unimplemented!(); -/// } -/// } -/// -/// // Regular rust code needed for implementing ProvideInherent trait -/// -/// #[derive(codec::Encode, sp_runtime::RuntimeDebug)] -/// #[cfg_attr(feature = "std", derive(codec::Decode))] -/// pub enum InherentError { -/// } -/// -/// impl sp_inherents::IsFatalError for InherentError { -/// fn is_fatal_error(&self) -> bool { -/// unimplemented!(); -/// } -/// } -/// -/// pub const INHERENT_IDENTIFIER: sp_inherents::InherentIdentifier = *b"testpall"; -/// } -/// ``` -/// -/// # Example of an instantiable pallet -/// -/// ``` -/// pub use pallet::*; -/// -/// #[frame_support::pallet] -/// pub mod pallet { -/// use frame_support::pallet_prelude::*; -/// use frame_system::pallet_prelude::*; -/// -/// type BalanceOf = >::Balance; -/// -/// #[pallet::config] -/// pub trait Config: frame_system::Config { -/// #[pallet::constant] -/// type MyGetParam: Get; -/// type Balance: Parameter + MaxEncodedLen + From; -/// type RuntimeEvent: From> + IsType<::RuntimeEvent>; -/// } -/// -/// #[pallet::extra_constants] -/// impl, I: 'static> Pallet { -/// /// Some description -/// fn extra_constant_name() -> u128 { 4u128 } -/// } -/// -/// #[pallet::pallet] -/// #[pallet::generate_store(pub(super) trait Store)] -/// pub struct Pallet(PhantomData<(T, I)>); -/// -/// #[pallet::hooks] -/// impl, I: 'static> Hooks> for Pallet { -/// } -/// -/// #[pallet::call] -/// impl, I: 'static> Pallet { -/// /// Doc comment put in metadata -/// #[pallet::weight(0)] -/// pub fn toto(origin: OriginFor, #[pallet::compact] _foo: u32) -> DispatchResultWithPostInfo { -/// let _ = origin; -/// unimplemented!(); -/// } -/// } -/// -/// #[pallet::error] -/// pub enum Error { -/// /// doc comment put into metadata -/// InsufficientProposersBalance, -/// } -/// -/// #[pallet::event] -/// #[pallet::generate_deposit(pub(super) fn deposit_event)] -/// pub enum Event, I: 'static = ()> { -/// /// doc comment put in metadata -/// Proposed(::AccountId), -/// /// doc -/// Spending(BalanceOf), -/// Something(u32), -/// } -/// -/// #[pallet::type_value] -/// pub(super) fn MyDefault, I: 'static>() -> T::Balance { 3.into() } -/// -/// #[pallet::storage] -/// pub(super) type MyStorageValue, I: 'static = ()> = -/// StorageValue>; -/// -/// #[pallet::storage] -/// #[pallet::getter(fn my_storage)] -/// #[pallet::storage_prefix = "SomeOtherName"] -/// pub(super) type MyStorage = -/// StorageMap; -/// -/// #[pallet::genesis_config] -/// #[derive(frame_support::DefaultNoBound)] -/// pub struct GenesisConfig, I: 'static = ()> { -/// _config: sp_std::marker::PhantomData<(T,I)>, -/// _myfield: u32, -/// } -/// -/// #[pallet::genesis_build] -/// impl, I: 'static> BuildGenesisConfig for GenesisConfig { -/// fn build(&self) {} -/// } -/// -/// #[pallet::origin] -/// pub struct Origin(PhantomData<(T, I)>); -/// -/// #[pallet::composite_enum] -/// pub enum HoldReason { -/// SomeHoldReason -/// } -/// -/// #[pallet::validate_unsigned] -/// impl, I: 'static> ValidateUnsigned for Pallet { -/// type Call = Call; -/// fn validate_unsigned( -/// source: TransactionSource, -/// call: &Self::Call -/// ) -> TransactionValidity { -/// Err(TransactionValidityError::Invalid(InvalidTransaction::Call)) -/// } -/// } -/// -/// #[pallet::inherent] -/// impl, I: 'static> ProvideInherent for Pallet { -/// type Call = Call; -/// type Error = InherentError; -/// -/// const INHERENT_IDENTIFIER: InherentIdentifier = INHERENT_IDENTIFIER; -/// -/// fn create_inherent(_data: &InherentData) -> Option { -/// unimplemented!(); -/// } -/// -/// fn is_inherent(_call: &Self::Call) -> bool { -/// unimplemented!(); -/// } -/// } -/// -/// // Regular rust code needed for implementing ProvideInherent trait -/// -/// #[derive(codec::Encode, sp_runtime::RuntimeDebug)] -/// #[cfg_attr(feature = "std", derive(codec::Decode))] -/// pub enum InherentError { -/// } -/// -/// impl sp_inherents::IsFatalError for InherentError { -/// fn is_fatal_error(&self) -> bool { -/// unimplemented!(); -/// } -/// } -/// -/// pub const INHERENT_IDENTIFIER: sp_inherents::InherentIdentifier = *b"testpall"; -/// } -/// ``` -/// -/// # Upgrade guidelines -/// -/// 1. Export the metadata of the pallet for later checks -/// - run your node with the pallet active -/// - query the metadata using the `state_getMetadata` RPC and curl, or use `subsee -p -/// > meta.json` -/// 2. Generate the template upgrade for the pallet provided by `decl_storage` with the -/// environment variable `PRINT_PALLET_UPGRADE`: `PRINT_PALLET_UPGRADE=1 cargo check -p -/// my_pallet`. This template can be used as it contains all information for storages, -/// genesis config and genesis build. -/// 3. Reorganize the pallet to have the trait `Config`, `decl_*` macros, -/// [`ValidateUnsigned`](`pallet_prelude::ValidateUnsigned`), -/// [`ProvideInherent`](`pallet_prelude::ProvideInherent`), and Origin` all together in one -/// file. Suggested order: -/// * `Config`, -/// * `decl_module`, -/// * `decl_event`, -/// * `decl_error`, -/// * `decl_storage`, -/// * `origin`, -/// * `validate_unsigned`, -/// * `provide_inherent`, so far it should compile and all be correct. -/// 4. start writing the new pallet module -/// ```ignore -/// pub use pallet::*; -/// -/// #[frame_support::pallet] -/// pub mod pallet { -/// use frame_support::pallet_prelude::*; -/// use frame_system::pallet_prelude::*; -/// use super::*; -/// -/// #[pallet::pallet] -/// #[pallet::generate_store($visibility_of_trait_store trait Store)] -/// // NOTE: if the visibility of trait store is private but you want to make it available -/// // in super, then use `pub(super)` or `pub(crate)` to make it available in crate. -/// pub struct Pallet(_); -/// // pub struct Pallet(PhantomData); // for instantiable pallet -/// } -/// ``` -/// 5. **migrate Config**: move trait into the module with -/// * all const in `decl_module` to [`#[pallet::constant]`](#palletconstant) -/// * add the bound `IsType<::RuntimeEvent>` to `type -/// RuntimeEvent` -/// 7. **migrate decl_module**: write: -/// ```ignore -/// #[pallet::hooks] -/// impl Hooks for Pallet { -/// } -/// ``` -/// and write inside `on_initialize`, `on_finalize`, `on_runtime_upgrade`, -/// `offchain_worker`, and `integrity_test`. -/// -/// then write: -/// ```ignore -/// #[pallet::call] -/// impl Pallet { -/// } -/// ``` -/// and write inside all the calls in `decl_module` with a few changes in the signature: -/// - origin must now be written completely, e.g. `origin: OriginFor` -/// - result type must be `DispatchResultWithPostInfo`, you need to write it and also you -/// might need to put `Ok(().into())` at the end or the function. -/// - `#[compact]` must now be written -/// [`#[pallet::compact]`](#palletcompact-some_arg-some_type) -/// - `#[weight = ..]` must now be written [`#[pallet::weight(..)]`](#palletweightexpr) -/// -/// 7. **migrate event**: rewrite as a simple enum with the attribute -/// [`#[pallet::event]`](#event-palletevent-optional), use [`#[pallet::generate_deposit($vis -/// fn deposit_event)]`](#event-palletevent-optional) to generate `deposit_event`, -/// 8. **migrate error**: rewrite it with attribute -/// [`#[pallet::error]`](#error-palleterror-optional). -/// 9. **migrate storage**: `decl_storage` provide an upgrade template (see 3.). All storages, -/// genesis config, genesis build and default implementation of genesis config can be taken -/// from it directly. -/// -/// Otherwise here is the manual process: -/// -/// first migrate the genesis logic. write: -/// ```ignore -/// #[pallet::genesis_config] -/// struct GenesisConfig { -/// // fields of add_extra_genesis -/// } -/// impl Default for GenesisConfig { -/// // type default or default provided for fields -/// } -/// #[pallet::genesis_build] -/// impl GenesisBuild for GenesisConfig { -/// // for instantiable pallet: -/// // `impl GenesisBuild for GenesisConfig { -/// fn build() { -/// // The add_extra_genesis build logic -/// } -/// } -/// ``` -/// for each storage, if it contains `config(..)` then add fields, and make it default to -/// the value in `= ..;` or the type default if none, if it contains no build then also add -/// the logic to build the value. for each storage if it contains `build(..)` then add the -/// logic to `genesis_build`. -/// -/// NOTE: within `decl_storage`: the individual config is executed first, followed by the -/// build and finally the `add_extra_genesis` build. -/// -/// Once this is done you can migrate storages individually, a few notes: -/// - for private storage use `pub(crate) type ` or `pub(super) type` or nothing, -/// - for storages with `get(fn ..)` use [`#[pallet::getter(fn -/// ...)]`](#palletgetterfn-my_getter_fn_name-optional) -/// - for storages with value being `Option<$something>` make generic `Value` being -/// `$something` and generic `QueryKind` being `OptionQuery` (note: this is default). -/// Otherwise make `Value` the complete value type and `QueryKind` being `ValueQuery`. -/// - for storages with default value: `= $expr;` provide some specific `OnEmpty` generic. -/// To do so use of `#[pallet::type_value]` to generate the wanted struct to put. -/// example: `MyStorage: u32 = 3u32` would be written: -/// -/// ```ignore -/// #[pallet::type_value] fn MyStorageOnEmpty() -> u32 { 3u32 } -/// #[pallet::storage] -/// pub(super) type MyStorage = StorageValue<_, u32, ValueQuery, MyStorageOnEmpty>; -/// ``` -/// -/// NOTE: `decl_storage` also generates the functions `assimilate_storage` and -/// `build_storage` directly on `GenesisConfig`, and these are sometimes used in tests. -/// In order not to break they can be implemented manually, one can implement those -/// functions by calling the `GenesisBuild` implementation. -/// 10. **migrate origin**: move the origin to the pallet module to be under a -/// [`#[pallet::origin]`](#origin-palletorigin-optional) attribute -/// 11. **migrate validate_unsigned**: move the -/// [`ValidateUnsigned`](`pallet_prelude::ValidateUnsigned`) implementation to the pallet -/// module under a -/// [`#[pallet::validate_unsigned]`](#validate-unsigned-palletvalidate_unsigned-optional) -/// attribute -/// 12. **migrate provide_inherent**: move the -/// [`ProvideInherent`](`pallet_prelude::ProvideInherent`) implementation to the pallet -/// module under a [`#[pallet::inherent]`](#inherent-palletinherent-optional) attribute -/// 13. rename the usage of `Module` to `Pallet` inside the crate. -/// 14. migration is done, now double check the migration with the checking migration -/// guidelines shown below. -/// -/// # Checking upgrade guidelines: -/// -/// * compare metadata. Use [subsee](https://github.com/ascjones/subsee) to fetch the metadata -/// and do a diff of the resulting json before and after migration. This checks for: -/// * call, names, signature, docs -/// * event names, docs -/// * error names, docs -/// * storage names, hasher, prefixes, default value -/// * error, error, constant -/// * manually check that: -/// * `Origin` was moved inside the macro under -/// [`#[pallet::origin]`](#origin-palletorigin-optional) if it exists -/// * [`ValidateUnsigned`](`pallet_prelude::ValidateUnsigned`) was moved inside the macro -/// under -/// [`#[pallet::validate_unsigned)]`](#validate-unsigned-palletvalidate_unsigned-optional) -/// if it exists -/// * [`ProvideInherent`](`pallet_prelude::ProvideInherent`) was moved inside the macro -/// under [`#[pallet::inherent)]`](#inherent-palletinherent-optional) if it exists -/// * `on_initialize` / `on_finalize` / `on_runtime_upgrade` / `offchain_worker` were moved -/// to the `Hooks` implementation -/// * storages with `config(..)` were converted to `GenesisConfig` field, and their default -/// is `= $expr;` if the storage has a default value -/// * storages with `build($expr)` or `config(..)` were built in `GenesisBuild::build` -/// * `add_extra_genesis` fields were converted to `GenesisConfig` field with their correct -/// default if specified -/// * `add_extra_genesis` build was written into `GenesisBuild::build` -/// * storage items defined with [`pallet`] use the name of the pallet provided by -/// [`traits::PalletInfo::name`] as `pallet_prefix` (in `decl_storage`, storage items used -/// the `pallet_prefix` given as input of `decl_storage` with the syntax `as Example`). Thus -/// a runtime using the pallet must be careful with this change. To handle this change: -/// * either ensure that the name of the pallet given to `construct_runtime!` is the same -/// as the name the pallet was giving to `decl_storage`, -/// * or do a storage migration from the old prefix used to the new prefix used. -/// -/// NOTE: The prefixes used by storage items are in metadata. Thus, ensuring the metadata -/// hasn't changed ensures that the `pallet_prefix`s used by the storage items haven't changed. -/// -/// # Notes when macro fails to show proper error message spans: -/// -/// Rustc loses span for some macro input. Some tips to fix it: -/// * do not use inner attribute: -/// ```ignore -/// #[pallet] -/// pub mod pallet { -/// //! This inner attribute will make span fail -/// .. -/// } -/// ``` -/// * use the newest nightly possible. +///
+/// WARNING:
+/// You should not deploy or use dev mode pallets in production. Doing so can break your
+/// chain and therefore should never be done. Once you are done tinkering, you should
+/// remove the 'dev_mode' argument from your #[pallet] declaration and fix any compile
+/// errors before attempting to use your pallet in a production scenario.
+/// 
pub use frame_support_procedural::pallet; -/// Contains macro stubs for all of the pallet:: macros +/// Contains macro stubs for all of the `pallet::` macros pub mod pallet_macros { - pub use frame_support_procedural::{ - composite_enum, config, disable_frame_system_supertrait_check, error, event, - extra_constants, feeless_if, generate_deposit, generate_store, getter, hooks, - import_section, inherent, no_default, no_default_bounds, origin, pallet_section, - storage_prefix, storage_version, type_value, unbounded, validate_unsigned, weight, - whitelist_storage, - }; + /// Declare the storage as whitelisted from benchmarking. + /// + /// Doing so will exclude reads of that value's storage key from counting towards weight + /// calculations during benchmarking. + /// + /// This attribute should only be attached to storages that are known to be + /// read/used in every block. This will result in a more accurate benchmarking weight. + /// + /// ### Example + /// ``` + /// #[frame_support::pallet] + /// mod pallet { + /// # use frame_support::pallet_prelude::*; + /// # + /// #[pallet::pallet] + /// pub struct Pallet(_); + /// + /// #[pallet::storage] + /// #[pallet::whitelist_storage] + /// pub type MyStorage = StorageValue<_, u32>; + /// # + /// # #[pallet::config] + /// # pub trait Config: frame_system::Config {} + /// } + /// ``` + pub use frame_support_procedural::whitelist_storage; + + /// Allows specifying the weight of a call. + /// + /// Each dispatchable needs to define a weight with the `#[pallet::weight($expr)]` + /// attribute. The first argument must be `origin: OriginFor`. + /// + /// ## Example + /// + /// ``` + /// #[frame_support::pallet] + /// mod pallet { + /// # use frame_support::pallet_prelude::*; + /// # use frame_system::pallet_prelude::*; + /// # + /// #[pallet::pallet] + /// pub struct Pallet(_); + /// + /// #[pallet::call] + /// impl Pallet { + /// #[pallet::weight({0})] // <- set actual weight here + /// #[pallet::call_index(0)] + /// pub fn something( + /// _: OriginFor, + /// foo: u32, + /// ) -> DispatchResult { + /// unimplemented!() + /// } + /// } + /// # + /// # #[pallet::config] + /// # pub trait Config: frame_system::Config {} + /// } + /// ``` + pub use frame_support_procedural::weight; + + /// Allows whitelisting a storage item from decoding during try-runtime checks. + /// + /// The optional attribute `#[pallet::disable_try_decode_storage]` will declare the + /// storage as whitelisted from decoding during try-runtime checks. This should only be + /// attached to transient storage which cannot be migrated during runtime upgrades. + /// + /// ### Example + /// ``` + /// #[frame_support::pallet] + /// mod pallet { + /// # use frame_support::pallet_prelude::*; + /// # + /// #[pallet::pallet] + /// pub struct Pallet(_); + /// + /// #[pallet::storage] + /// #[pallet::disable_try_decode_storage] + /// pub type MyStorage = StorageValue<_, u32>; + /// # + /// # #[pallet::config] + /// # pub trait Config: frame_system::Config {} + /// } + /// ``` + pub use frame_support_procedural::disable_try_decode_storage; + + /// Declares a storage as unbounded in potential size. + /// + /// When implementing the storage info (when `#[pallet::generate_storage_info]` is + /// specified on the pallet struct placeholder), the size of the storage will be declared + /// as unbounded. This can be useful for storage which can never go into PoV (Proof of + /// Validity). + /// + /// ## Example + /// + /// ``` + /// #[frame_support::pallet] + /// mod pallet { + /// # use frame_support::pallet_prelude::*; + /// # + /// #[pallet::pallet] + /// pub struct Pallet(_); + /// + /// #[pallet::storage] + /// #[pallet::unbounded] + /// pub type MyStorage = StorageValue<_, u32>; + /// # + /// # #[pallet::config] + /// # pub trait Config: frame_system::Config {} + /// } + /// ``` + pub use frame_support_procedural::unbounded; + + /// Defines what storage prefix to use for a storage item when building the trie. + /// + /// This is helpful if you wish to rename the storage field but don't want to perform a + /// migration. + /// + /// ## Example + /// + /// ``` + /// #[frame_support::pallet] + /// mod pallet { + /// # use frame_support::pallet_prelude::*; + /// # + /// #[pallet::pallet] + /// pub struct Pallet(_); + /// + /// #[pallet::storage] + /// #[pallet::storage_prefix = "foo"] + /// pub type MyStorage = StorageValue<_, u32>; + /// # + /// # #[pallet::config] + /// # pub trait Config: frame_system::Config {} + /// } + /// ``` + pub use frame_support_procedural::storage_prefix; + + /// Ensures the generated `DefaultConfig` will not have any bounds for + /// that trait item. + /// + /// Attaching this attribute to a trait item ensures that the generated trait + /// `DefaultConfig` will not have any bounds for this trait item. + /// + /// As an example, if you have a trait item `type AccountId: SomeTrait;` in your `Config` + /// trait, the generated `DefaultConfig` will only have `type AccountId;` with no trait + /// bound. + pub use frame_support_procedural::no_default_bounds; + + /// Ensures the trait item will not be used as a default with the + /// `#[derive_impl(..)]` attribute macro. + /// + /// The optional attribute `#[pallet::no_default]` can be attached to trait items within a + /// `Config` trait impl that has [`#[pallet::config(with_default)]`](`config`) + /// attached. + pub use frame_support_procedural::no_default; + + /// Declares a module as importable into a pallet via + /// [`#[import_section]`](`import_section`). + /// + /// Note that sections are imported by their module name/ident, and should be referred to + /// by their _full path_ from the perspective of the target pallet. Do not attempt to make + /// use of `use` statements to bring pallet sections into scope, as this will not work + /// (unless you do so as part of a wildcard import, in which case it will work). + /// + /// ## Naming Logistics + /// + /// Also note that because of how `#[pallet_section]` works, pallet section names must be + /// globally unique _within the crate in which they are defined_. For more information on + /// why this must be the case, see macro_magic's + /// [`#[export_tokens]`](https://docs.rs/macro_magic/latest/macro_magic/attr.export_tokens.html) macro. + /// + /// Optionally, you may provide an argument to `#[pallet_section]` such as + /// `#[pallet_section(some_ident)]`, in the event that there is another pallet section in + /// same crate with the same ident/name. The ident you specify can then be used instead of + /// the module's ident name when you go to import it via + /// [`#[import_section]`](`import_section`). + pub use frame_support_procedural::pallet_section; + + /// The `#[pallet::inherent]` attribute allows the pallet to provide + /// [inherents](https://docs.substrate.io/fundamentals/transaction-types/#inherent-transactions). + /// + /// An inherent is some piece of data that is inserted by a block authoring node at block + /// creation time and can either be accepted or rejected by validators based on whether the + /// data falls within an acceptable range. + /// + /// The most common inherent is the `timestamp` that is inserted into every block. Since + /// there is no way to validate timestamps, validators simply check that the timestamp + /// reported by the block authoring node falls within an acceptable range. + /// + /// Example usage: + /// + /// ``` + /// #[frame_support::pallet] + /// mod pallet { + /// # use frame_support::pallet_prelude::*; + /// # use frame_support::inherent::IsFatalError; + /// # use sp_timestamp::InherentError; + /// # use sp_std::result; + /// # + /// // Example inherent identifier + /// pub const INHERENT_IDENTIFIER: InherentIdentifier = *b"timstap0"; + /// + /// #[pallet::pallet] + /// pub struct Pallet(_); + /// + /// #[pallet::inherent] + /// impl ProvideInherent for Pallet { + /// type Call = Call; + /// type Error = InherentError; + /// const INHERENT_IDENTIFIER: InherentIdentifier = INHERENT_IDENTIFIER; + /// + /// fn create_inherent(data: &InherentData) -> Option { + /// unimplemented!() + /// } + /// + /// fn check_inherent( + /// call: &Self::Call, + /// data: &InherentData, + /// ) -> result::Result<(), Self::Error> { + /// unimplemented!() + /// } + /// + /// fn is_inherent(call: &Self::Call) -> bool { + /// unimplemented!() + /// } + /// } + /// # + /// # #[pallet::config] + /// # pub trait Config: frame_system::Config {} + /// } + /// ``` + /// + /// I.e. a trait implementation with bound `T: Config`, of trait `ProvideInherent` for type + /// `Pallet`, and some optional where clause. + /// + /// ## Macro expansion + /// + /// The macro currently makes no use of this information, but it might use this information + /// in the future to give information directly to `construct_runtime`. + pub use frame_support_procedural::inherent; + + /// Splits a pallet declaration into multiple parts. + /// + /// An attribute macro that can be attached to a module declaration. Doing so will + /// import the contents of the specified external pallet section that is defined + /// elsewhere using [`#[pallet_section]`](`pallet_section`). + /// + /// ## Example + /// ``` + /// # use frame_support::pallet_macros::pallet_section; + /// # use frame_support::pallet_macros::import_section; + /// # + /// /// A [`pallet_section`] that defines the events for a pallet. + /// /// This can later be imported into the pallet using [`import_section`]. + /// #[pallet_section] + /// mod events { + /// #[pallet::event] + /// #[pallet::generate_deposit(pub(super) fn deposit_event)] + /// pub enum Event { + /// /// Event documentation should end with an array that provides descriptive names for event + /// /// parameters. [something, who] + /// SomethingStored { something: u32, who: T::AccountId }, + /// } + /// } + /// + /// #[import_section(events)] + /// #[frame_support::pallet] + /// mod pallet { + /// # use frame_support::pallet_prelude::*; + /// # + /// #[pallet::pallet] + /// pub struct Pallet(_); + /// # + /// # #[pallet::config] + /// # pub trait Config: frame_system::Config { + /// # type RuntimeEvent: From> + IsType<::RuntimeEvent>; + /// # } + /// } + /// ``` + /// + /// This will result in the contents of `some_section` being _verbatim_ imported into + /// the pallet above. Note that since the tokens for `some_section` are essentially + /// copy-pasted into the target pallet, you cannot refer to imports that don't also + /// exist in the target pallet, but this is easily resolved by including all relevant + /// `use` statements within your pallet section, so they are imported as well, or by + /// otherwise ensuring that you have the same imports on the target pallet. + /// + /// It is perfectly permissible to import multiple pallet sections into the same pallet, + /// which can be done by having multiple `#[import_section(something)]` attributes + /// attached to the pallet. + /// + /// Note that sections are imported by their module name/ident, and should be referred to + /// by their _full path_ from the perspective of the target pallet. + pub use frame_support_procedural::import_section; + + /// Allows defining getter functions on `Pallet` storage. + /// + /// ## Example + /// + /// ``` + /// #[frame_support::pallet] + /// mod pallet { + /// # use frame_support::pallet_prelude::*; + /// # + /// #[pallet::pallet] + /// pub struct Pallet(_); + /// + /// #[pallet::storage] + /// #[pallet::getter(fn my_getter_fn_name)] + /// pub type MyStorage = StorageValue<_, u32>; + /// # + /// # #[pallet::config] + /// # pub trait Config: frame_system::Config {} + /// } + /// ``` + /// + /// See [`pallet::storage`](`frame_support::pallet_macros::storage`) for more info. + pub use frame_support_procedural::getter; + + /// Defines constants that are added to the constant field of + /// [`PalletMetadata`](frame_metadata::v15::PalletMetadata) struct for this pallet. + /// + /// Must be defined like: + /// + /// ``` + /// #[frame_support::pallet] + /// mod pallet { + /// # use frame_support::pallet_prelude::*; + /// # + /// #[pallet::pallet] + /// pub struct Pallet(_); + /// + /// # #[pallet::config] + /// # pub trait Config: frame_system::Config {} + /// # + /// #[pallet::extra_constants] + /// impl Pallet // $optional_where_clause + /// { + /// #[pallet::constant_name(SomeU32ConstantName)] + /// /// Some doc + /// fn some_u32_constant() -> u32 { + /// 100u32 + /// } + /// } + /// } + /// ``` + /// + /// I.e. a regular rust `impl` block with some optional where clause and functions with 0 + /// args, 0 generics, and some return type. + pub use frame_support_procedural::extra_constants; + + #[rustfmt::skip] + /// Allows bypassing the `frame_system::Config` supertrait check. + /// + /// To bypass the syntactic `frame_system::Config` supertrait check, use the attribute + /// `pallet::disable_frame_system_supertrait_check`. + /// + /// Note this bypass is purely syntactic, and does not actually remove the requirement that your + /// pallet implements `frame_system::Config`. When using this check, your config is still required to implement + /// `frame_system::Config` either via + /// - Implementing a trait that itself implements `frame_system::Config` + /// - Tightly coupling it with another pallet which itself implements `frame_system::Config` + /// + /// e.g. + /// + /// ``` + /// #[frame_support::pallet] + /// mod pallet { + /// # use frame_support::pallet_prelude::*; + /// # use frame_system::pallet_prelude::*; + /// trait OtherTrait: frame_system::Config {} + /// + /// #[pallet::pallet] + /// pub struct Pallet(_); + /// + /// #[pallet::config] + /// #[pallet::disable_frame_system_supertrait_check] + /// pub trait Config: OtherTrait {} + /// } + /// ``` + /// + /// To learn more about supertraits, see the + /// [trait_based_programming](../../polkadot_sdk_docs/reference_docs/trait_based_programming/index.html) + /// reference doc. + pub use frame_support_procedural::disable_frame_system_supertrait_check; + + /// The mandatory attribute allowing definition of configurable types for the pallet. + /// + /// Item must be defined as: + /// + /// ``` + /// #[frame_support::pallet] + /// mod pallet { + /// # use frame_support::pallet_prelude::*; + /// # + /// #[pallet::pallet] + /// pub struct Pallet(_); + /// + /// #[pallet::config] + /// pub trait Config: frame_system::Config // + $optionally_some_other_supertraits + /// // $optional_where_clause + /// { + /// // config items here + /// } + /// } + /// ``` + /// + /// I.e. a regular trait definition named `Config`, with the supertrait + /// [`frame_system::pallet::Config`](../../frame_system/pallet/trait.Config.html), and + /// optionally other supertraits and a where clause. (Specifying other supertraits here is + /// known as [tight coupling](https://docs.substrate.io/reference/how-to-guides/pallet-design/use-tight-coupling/)) + /// + /// The associated type `RuntimeEvent` is reserved. If defined, it must have the bounds + /// `From` and `IsType<::RuntimeEvent>`. + /// + /// [`#[pallet::event]`](`event`) must be present if `RuntimeEvent` + /// exists as a config item in your `#[pallet::config]`. + /// + /// ## Optional: `with_default` + /// + /// An optional `with_default` argument may also be specified. Doing so will automatically + /// generate a `DefaultConfig` trait inside your pallet which is suitable for use with + /// [`#[derive_impl(..)`](`frame_support::derive_impl`) to derive a default testing + /// config: + /// + /// ``` + /// #[frame_support::pallet] + /// mod pallet { + /// # use frame_support::pallet_prelude::*; + /// # use frame_system::pallet_prelude::*; + /// # use core::fmt::Debug; + /// # use frame_support::traits::Contains; + /// # + /// #[pallet::pallet] + /// pub struct Pallet(_); + /// + /// #[pallet::config(with_default)] // <- with_default is optional + /// pub trait Config: frame_system::Config { + /// /// The overarching event type. + /// #[pallet::no_default_bounds] // Default is not supported for RuntimeEvent + /// type RuntimeEvent: From> + IsType<::RuntimeEvent>; + /// + /// // ...other config items get default + /// } + /// + /// #[pallet::event] + /// pub enum Event { + /// SomeEvent(u16, u32), + /// } + /// } + /// ``` + /// + /// As shown above, you may also attach the [`#[pallet::no_default]`](`no_default`) + /// attribute to specify that a particular trait item _cannot_ be used as a default when a + /// test `Config` is derived using the [`#[derive_impl(..)]`](`frame_support::derive_impl`) + /// attribute macro. This will cause that particular trait item to simply not appear in + /// default testing configs based on this config (the trait item will not be included in + /// `DefaultConfig`). + /// + /// ### `DefaultConfig` Caveats + /// + /// The auto-generated `DefaultConfig` trait: + /// - is always a _subset_ of your pallet's `Config` trait. + /// - can only contain items that don't rely on externalities, such as + /// `frame_system::Config`. + /// + /// Trait items that _do_ rely on externalities should be marked with + /// [`#[pallet::no_default]`](`no_default`) + /// + /// Consequently: + /// - Any items that rely on externalities _must_ be marked with + /// [`#[pallet::no_default]`](`no_default`) or your trait will fail to compile when used + /// with [`derive_impl`](`frame_support::derive_impl`). + /// - Items marked with [`#[pallet::no_default]`](`no_default`) are entirely excluded from + /// the `DefaultConfig` trait, and therefore any impl of `DefaultConfig` doesn't need to + /// implement such items. + /// + /// For more information, see [`frame_support::derive_impl`]. + pub use frame_support_procedural::config; + + /// Allows defining an enum that gets composed as an aggregate enum by `construct_runtime`. + /// + /// The `#[pallet::composite_enum]` attribute allows you to define an enum that gets + /// composed as an aggregate enum by `construct_runtime`. This is similar in principle with + /// [frame_support_procedural::event] and [frame_support_procedural::error]. + /// + /// The attribute currently only supports enum definitions, and identifiers that are named + /// `FreezeReason`, `HoldReason`, `LockId` or `SlashReason`. Arbitrary identifiers for the + /// enum are not supported. The aggregate enum generated by + /// [`frame_support::construct_runtime`] will have the name of `RuntimeFreezeReason`, + /// `RuntimeHoldReason`, `RuntimeLockId` and `RuntimeSlashReason` respectively. + /// + /// NOTE: The aggregate enum generated by `construct_runtime` generates a conversion + /// function from the pallet enum to the aggregate enum, and automatically derives the + /// following traits: + /// + /// ```ignore + /// Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Encode, Decode, MaxEncodedLen, TypeInfo, + /// RuntimeDebug + /// ``` + /// + /// For ease of usage, when no `#[derive]` attributes are found for the enum under + /// [`#[pallet::composite_enum]`](composite_enum), the aforementioned traits are + /// automatically derived for it. The inverse is also true: if there are any `#[derive]` + /// attributes found for the enum, then no traits will automatically be derived for it. + /// + /// e.g, defining `HoldReason` in a pallet + /// + /// ``` + /// #[frame_support::pallet] + /// mod pallet { + /// # use frame_support::pallet_prelude::*; + /// # + /// #[pallet::pallet] + /// pub struct Pallet(_); + /// + /// #[pallet::composite_enum] + /// pub enum HoldReason { + /// /// The NIS Pallet has reserved it for a non-fungible receipt. + /// #[codec(index = 0)] + /// SomeHoldReason, + /// #[codec(index = 1)] + /// SomeOtherHoldReason, + /// } + /// # + /// # #[pallet::config] + /// # pub trait Config: frame_system::Config {} + /// } + pub use frame_support_procedural::composite_enum; + + /// Allows the pallet to validate unsigned transactions. + /// + /// Item must be defined as: + /// + /// ``` + /// #[frame_support::pallet] + /// mod pallet { + /// # use frame_support::pallet_prelude::*; + /// # + /// #[pallet::pallet] + /// pub struct Pallet(_); + /// + /// #[pallet::validate_unsigned] + /// impl sp_runtime::traits::ValidateUnsigned for Pallet { + /// type Call = Call; + /// + /// fn validate_unsigned(_source: TransactionSource, _call: &Self::Call) -> TransactionValidity { + /// // Your implementation details here + /// unimplemented!() + /// } + /// } + /// # + /// # #[pallet::config] + /// # pub trait Config: frame_system::Config {} + /// } + /// ``` + /// + /// I.e. a trait implementation with bound `T: Config`, of trait + /// [`ValidateUnsigned`](frame_support::pallet_prelude::ValidateUnsigned) for + /// type `Pallet`, and some optional where clause. + /// + /// NOTE: There is also the [`sp_runtime::traits::SignedExtension`] trait that can be used + /// to add some specific logic for transaction validation. + /// + /// ## Macro expansion + /// + /// The macro currently makes no use of this information, but it might use this information + /// in the future to give information directly to [`frame_support::construct_runtime`]. + pub use frame_support_procedural::validate_unsigned; + + /// Allows defining a struct implementing the [`Get`](frame_support::traits::Get) trait to + /// ease the use of storage types. + /// + /// This attribute is meant to be used alongside [`#[pallet::storage]`](`storage`) to + /// define a storage's default value. This attribute can be used multiple times. + /// + /// Item must be defined as: + /// + /// ``` + /// #[frame_support::pallet] + /// mod pallet { + /// # use sp_runtime::FixedU128; + /// # use frame_support::pallet_prelude::*; + /// # + /// #[pallet::pallet] + /// pub struct Pallet(_); + /// + /// #[pallet::storage] + /// pub(super) type SomeStorage = + /// StorageValue<_, FixedU128, ValueQuery, DefaultForSomeValue>; + /// + /// // Define default for ParachainId + /// #[pallet::type_value] + /// pub fn DefaultForSomeValue() -> FixedU128 { + /// FixedU128::from_u32(1) + /// } + /// # + /// # #[pallet::config] + /// # pub trait Config: frame_system::Config {} + /// } + /// ``` + /// + /// ## Macro expansion + /// + /// The macro renames the function to some internal name, generates a struct with the + /// original name of the function and its generic, and implements `Get<$ReturnType>` by + /// calling the user defined function. + pub use frame_support_procedural::type_value; + + /// Allows defining a storage version for the pallet. + /// + /// Because the `pallet::pallet` macro implements + /// [`GetStorageVersion`](frame_support::traits::GetStorageVersion), the current storage + /// version needs to be communicated to the macro. This can be done by using the + /// `pallet::storage_version` attribute: + /// + /// ``` + /// #[frame_support::pallet] + /// mod pallet { + /// # use frame_support::pallet_prelude::StorageVersion; + /// # use frame_support::traits::GetStorageVersion; + /// # + /// const STORAGE_VERSION: StorageVersion = StorageVersion::new(5); + /// + /// #[pallet::pallet] + /// #[pallet::storage_version(STORAGE_VERSION)] + /// pub struct Pallet(_); + /// # + /// # #[pallet::config] + /// # pub trait Config: frame_system::Config {} + /// } + /// ``` + /// + /// If not present, the current storage version is set to the default value. + pub use frame_support_procedural::storage_version; + + /// The `#[pallet::hooks]` attribute allows you to specify a + /// [`frame_support::traits::Hooks`] implementation for `Pallet` that specifies + /// pallet-specific logic. + /// + /// The item the attribute attaches to must be defined as follows: + /// + /// ``` + /// #[frame_support::pallet] + /// mod pallet { + /// # use frame_support::pallet_prelude::*; + /// # use frame_system::pallet_prelude::*; + /// # + /// #[pallet::pallet] + /// pub struct Pallet(_); + /// + /// #[pallet::hooks] + /// impl Hooks> for Pallet { + /// // Implement hooks here + /// } + /// # + /// # #[pallet::config] + /// # pub trait Config: frame_system::Config {} + /// } + /// ``` + /// I.e. a regular trait implementation with generic bound: `T: Config`, for the trait + /// `Hooks>` (they are defined in preludes), for the type `Pallet`. + /// + /// Optionally, you could add a where clause. + /// + /// ## Macro expansion + /// + /// The macro implements the traits + /// [`OnInitialize`](frame_support::traits::OnInitialize), + /// [`OnIdle`](frame_support::traits::OnIdle), + /// [`OnFinalize`](frame_support::traits::OnFinalize), + /// [`OnRuntimeUpgrade`](frame_support::traits::OnRuntimeUpgrade), + /// [`OffchainWorker`](frame_support::traits::OffchainWorker), and + /// [`IntegrityTest`](frame_support::traits::IntegrityTest) using + /// the provided [`Hooks`](frame_support::traits::Hooks) implementation. + /// + /// NOTE: `OnRuntimeUpgrade` is implemented with `Hooks::on_runtime_upgrade` and some + /// additional logic. E.g. logic to write the pallet version into storage. + /// + /// NOTE: The macro also adds some tracing logic when implementing the above traits. The + /// following hooks emit traces: `on_initialize`, `on_finalize` and `on_runtime_upgrade`. + pub use frame_support_procedural::hooks; + + /// Generates a helper function on `Pallet` that handles deposit events. + /// + /// NOTE: For instantiable pallets, the event must be generic over `T` and `I`. + /// + /// ## Macro expansion + /// + /// The macro will add on enum `Event` the attributes: + /// * `#[derive(`[`frame_support::CloneNoBound`]`)]` + /// * `#[derive(`[`frame_support::EqNoBound`]`)]` + /// * `#[derive(`[`frame_support::PartialEqNoBound`]`)]` + /// * `#[derive(`[`frame_support::RuntimeDebugNoBound`]`)]` + /// * `#[derive(`[`codec::Encode`]`)]` + /// * `#[derive(`[`codec::Decode`]`)]` + /// + /// The macro implements `From>` for (). + /// + /// The macro implements a metadata function on `Event` returning the `EventMetadata`. + /// + /// If `#[pallet::generate_deposit]` is present then the macro implements `fn + /// deposit_event` on `Pallet`. + pub use frame_support_procedural::generate_deposit; + + /// Allows defining logic to make an extrinsic call feeless. + /// + /// Each dispatchable may be annotated with the `#[pallet::feeless_if($closure)]` + /// attribute, which explicitly defines the condition for the dispatchable to be feeless. + /// + /// The arguments for the closure must be the referenced arguments of the dispatchable + /// function. + /// + /// The closure must return `bool`. + /// + /// ### Example + /// + /// ``` + /// #[frame_support::pallet(dev_mode)] + /// mod pallet { + /// # use frame_support::pallet_prelude::*; + /// # use frame_system::pallet_prelude::*; + /// # + /// #[pallet::pallet] + /// pub struct Pallet(_); + /// + /// #[pallet::call] + /// impl Pallet { + /// #[pallet::call_index(0)] + /// /// Marks this call as feeless if `foo` is zero. + /// #[pallet::feeless_if(|_origin: &OriginFor, foo: &u32| -> bool { + /// *foo == 0 + /// })] + /// pub fn something( + /// _: OriginFor, + /// foo: u32, + /// ) -> DispatchResult { + /// unimplemented!() + /// } + /// } + /// # + /// # #[pallet::config] + /// # pub trait Config: frame_system::Config {} + /// } + /// ``` + /// + /// Please note that this only works for signed dispatchables and requires a signed + /// extension such as [`pallet_skip_feeless_payment::SkipCheckIfFeeless`] to wrap the + /// existing payment extension. Else, this is completely ignored and the dispatchable is + /// still charged. + /// + /// ### Macro expansion + /// + /// The macro implements the [`pallet_skip_feeless_payment::CheckIfFeeless`] trait on the + /// dispatchable and calls the corresponding closure in the implementation. + /// + /// [`pallet_skip_feeless_payment::SkipCheckIfFeeless`]: ../../pallet_skip_feeless_payment/struct.SkipCheckIfFeeless.html + /// [`pallet_skip_feeless_payment::CheckIfFeeless`]: ../../pallet_skip_feeless_payment/struct.SkipCheckIfFeeless.html + pub use frame_support_procedural::feeless_if; + + /// Allows defining an error enum that will be returned from the dispatchable when an error + /// occurs. + /// + /// The information for this error type is then stored in runtime metadata. + /// + /// Item must be defined as so: + /// + /// ``` + /// #[frame_support::pallet(dev_mode)] + /// mod pallet { + /// #[pallet::pallet] + /// pub struct Pallet(_); + /// + /// #[pallet::error] + /// pub enum Error { + /// /// SomeFieldLessVariant doc + /// SomeFieldLessVariant, + /// /// SomeVariantWithOneField doc + /// SomeVariantWithOneField(u32), + /// } + /// # + /// # #[pallet::config] + /// # pub trait Config: frame_system::Config {} + /// } + /// ``` + /// I.e. a regular enum named `Error`, with generic `T` and fieldless or multiple-field + /// variants. + /// + /// Any field type in the enum variants must implement [`scale_info::TypeInfo`] in order to + /// be properly used in the metadata, and its encoded size should be as small as possible, + /// preferably 1 byte in size in order to reduce storage size. The error enum itself has an + /// absolute maximum encoded size specified by + /// [`frame_support::MAX_MODULE_ERROR_ENCODED_SIZE`]. + /// + /// (1 byte can still be 256 different errors. The more specific the error, the easier it + /// is to diagnose problems and give a better experience to the user. Don't skimp on having + /// lots of individual error conditions.) + /// + /// Field types in enum variants must also implement [`frame_support::PalletError`], + /// otherwise the pallet will fail to compile. Rust primitive types have already + /// implemented the [`frame_support::PalletError`] trait along with some commonly used + /// stdlib types such as [`Option`] and [`sp_std::marker::PhantomData`], and hence + /// in most use cases, a manual implementation is not necessary and is discouraged. + /// + /// The generic `T` must not bound anything and a `where` clause is not allowed. That said, + /// bounds and/or a where clause should not needed for any use-case. + /// + /// ## Macro expansion + /// + /// The macro implements the [`Debug`] trait and functions `as_u8` using variant position, + /// and `as_str` using variant doc. + /// + /// The macro also implements `From>` for `&'static str` and `From>` for + /// `DispatchError`. + pub use frame_support_procedural::error; - /// Allows a pallet to declare a set of functions as a *dispatchable extrinsic*. In - /// slightly simplified terms, this macro declares the set of "transactions" of a pallet. + /// Allows defining pallet events. + /// + /// Pallet events are stored under the `system` / `events` key when the block is applied + /// (and then replaced when the next block writes it's events). + /// + /// The Event enum can be defined as follows: + /// + /// ``` + /// #[frame_support::pallet(dev_mode)] + /// mod pallet { + /// # use frame_support::pallet_prelude::IsType; + /// # + /// #[pallet::pallet] + /// pub struct Pallet(_); + /// + /// #[pallet::event] + /// #[pallet::generate_deposit(fn deposit_event)] // Optional + /// pub enum Event { + /// /// SomeEvent doc + /// SomeEvent(u16, u32), // SomeEvent with two fields + /// } + /// + /// #[pallet::config] + /// pub trait Config: frame_system::Config { + /// /// The overarching runtime event type. + /// type RuntimeEvent: From> + /// + IsType<::RuntimeEvent>; + /// } + /// } + /// ``` + /// + /// I.e. an enum (with named or unnamed fields variant), named `Event`, with generic: none + /// or `T` or `T: Config`, and optional w here clause. + /// + /// `RuntimeEvent` must be defined in the `Config`, as shown in the example. + /// + /// Each field must implement [`Clone`], [`Eq`], [`PartialEq`], [`codec::Encode`], + /// [`codec::Decode`], and [`Debug`] (on std only). For ease of use, bound by the trait + /// `Member`, available in [`frame_support::pallet_prelude`]. + pub use frame_support_procedural::event; + + /// Allows a pallet to declare a set of functions as a *dispatchable extrinsic*. + /// + /// In slightly simplified terms, this macro declares the set of "transactions" of a + /// pallet. /// /// > The exact definition of **extrinsic** can be found in /// > [`sp_runtime::generic::UncheckedExtrinsic`]. @@ -2322,7 +1933,7 @@ pub mod pallet_macros { /// # use frame_support::__private::TestExternalities; /// # use frame_support::traits::UnfilteredDispatchable; /// # impl custom_pallet::Config for Runtime {} - /// # #[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] + /// # #[derive_impl(frame_system::config_preludes::TestDefaultConfig)] /// # impl frame_system::Config for Runtime { /// # type Block = frame_system::mocking::MockBlock; /// # } @@ -2374,14 +1985,24 @@ pub mod pallet_macros { /// If no `#[pallet::call]` exists, then a default implementation corresponding to the /// following code is automatically generated: /// - /// ```ignore - /// #[pallet::call] - /// impl Pallet {} + /// ``` + /// #[frame_support::pallet(dev_mode)] + /// mod pallet { + /// #[pallet::pallet] + /// pub struct Pallet(_); + /// + /// #[pallet::call] // <- automatically generated + /// impl Pallet {} // <- automatically generated + /// + /// #[pallet::config] + /// pub trait Config: frame_system::Config {} + /// } /// ``` pub use frame_support_procedural::call; - /// Enforce the index of a variant in the generated `enum Call`. See [`call`] for more - /// information. + /// Enforce the index of a variant in the generated `enum Call`. + /// + /// See [`call`] for more information. /// /// All call indexes start from 0, until it encounters a dispatchable function with a /// defined call index. The dispatchable function that lexically follows the function with @@ -2391,7 +2012,9 @@ pub mod pallet_macros { pub use frame_support_procedural::call_index; /// Declares the arguments of a [`call`] function to be encoded using - /// [`codec::Compact`]. This will results in smaller extrinsic encoding. + /// [`codec::Compact`]. + /// + /// This will results in smaller extrinsic encoding. /// /// A common example of `compact` is for numeric values that are often times far far away /// from their theoretical maximum. For example, in the context of a crypto-currency, the @@ -2487,8 +2110,8 @@ pub mod pallet_macros { /// ``` pub use frame_support_procedural::genesis_build; - /// The `#[pallet::constant]` attribute can be used to add an associated type trait bounded - /// by [`Get`](frame_support::pallet_prelude::Get) from [`pallet::config`](`macro@config`) + /// Allows adding an associated type trait bounded by + /// [`Get`](frame_support::pallet_prelude::Get) from [`pallet::config`](`macro@config`) /// into metadata. /// /// ## Example @@ -2509,9 +2132,10 @@ pub mod pallet_macros { /// ``` pub use frame_support_procedural::constant; - /// Declares a type alias as a storage item. Storage items are pointers to data stored - /// on-chain (the *blockchain state*), under a specific key. The exact key is dependent on - /// the type of the storage. + /// Declares a type alias as a storage item. + /// + /// Storage items are pointers to data stored on-chain (the *blockchain state*), under a + /// specific key. The exact key is dependent on the type of the storage. /// /// > From the perspective of this pallet, the entire blockchain state is abstracted behind /// > a key-value api, namely [`sp_io::storage`]. @@ -2691,6 +2315,8 @@ pub mod pallet_macros { /// * [`macro@getter`]: Creates a custom getter function. /// * [`macro@storage_prefix`]: Overrides the default prefix of the storage item. /// * [`macro@unbounded`]: Declares the storage item as unbounded. + /// * [`macro@disable_try_decode_storage`]: Declares that try-runtime checks should not + /// attempt to decode the storage item. /// /// #### Example /// ``` @@ -2706,11 +2332,15 @@ pub mod pallet_macros { /// #[pallet::getter(fn foo)] /// #[pallet::storage_prefix = "OtherFoo"] /// #[pallet::unbounded] + /// #[pallet::disable_try_decode_storage] /// pub type Foo = StorageValue<_, u32, ValueQuery>; /// } /// ``` pub use frame_support_procedural::storage; - /// This attribute is attached to a function inside an `impl` block annoated with + + /// Allows defining conditions for a task to run. + /// + /// This attribute is attached to a function inside an `impl` block annotated with /// [`pallet::tasks_experimental`](`tasks_experimental`) to define the conditions for a /// given work item to be valid. /// @@ -2718,29 +2348,39 @@ pub mod pallet_macros { /// should have the same signature as the function it is attached to, except that it should /// return a `bool` instead. pub use frame_support_procedural::task_condition; - /// This attribute is attached to a function inside an `impl` block annoated with + + /// Allows defining an index for a task. + /// + /// This attribute is attached to a function inside an `impl` block annotated with /// [`pallet::tasks_experimental`](`tasks_experimental`) to define the index of a given /// work item. /// /// It takes an integer literal as input, which is then used to define the index. This /// index should be unique for each function in the `impl` block. pub use frame_support_procedural::task_index; - /// This attribute is attached to a function inside an `impl` block annoated with - /// [`pallet::tasks_experimental`](`tasks_experimental`) to define an iterator over the - /// available work items for a task. + + /// Allows defining an iterator over available work items for a task. + /// + /// This attribute is attached to a function inside an `impl` block annotated with + /// [`pallet::tasks_experimental`](`tasks_experimental`). /// /// It takes an iterator as input that yields a tuple with same types as the function /// arguments. pub use frame_support_procedural::task_list; - /// This attribute is attached to a function inside an `impl` block annoated with + + /// Allows defining the weight of a task. + /// + /// This attribute is attached to a function inside an `impl` block annotated with /// [`pallet::tasks_experimental`](`tasks_experimental`) define the weight of a given work /// item. /// /// It takes a closure as input, which should return a `Weight` value. pub use frame_support_procedural::task_weight; + /// Allows you to define some service work that can be recognized by a script or an - /// off-chain worker. Such a script can then create and submit all such work items at any - /// given time. + /// off-chain worker. + /// + /// Such a script can then create and submit all such work items at any given time. /// /// These work items are defined as instances of the [`Task`](frame_support::traits::Task) /// trait. [`pallet:tasks_experimental`](`tasks_experimental`) when attached to an `impl` @@ -2765,6 +2405,64 @@ pub mod pallet_macros { /// Now, this can be executed as follows: #[doc = docify::embed!("src/tests/tasks.rs", tasks_work)] pub use frame_support_procedural::tasks_experimental; + + /// Allows a pallet to declare a type as an origin. + /// + /// If defined as such, this type will be amalgamated at the runtime level into + /// `RuntimeOrigin`, very similar to [`call`], [`error`] and [`event`]. See + /// [`composite_enum`] for similar cases. + /// + /// Origin is a complex FRAME topics and is further explained in `polkadot_sdk_docs`. + /// + /// ## Syntax Variants + /// + /// ``` + /// #[frame_support::pallet] + /// mod pallet { + /// # use frame_support::pallet_prelude::*; + /// # #[pallet::config] + /// # pub trait Config: frame_system::Config {} + /// # #[pallet::pallet] + /// # pub struct Pallet(_); + /// /// On the spot declaration. + /// #[pallet::origin] + /// #[derive(PartialEq, Eq, Clone, RuntimeDebug, Encode, Decode, TypeInfo, MaxEncodedLen)] + /// pub enum Origin { + /// Foo, + /// Bar, + /// } + /// } + /// ``` + /// + /// Or, more commonly used: + /// + /// ``` + /// #[frame_support::pallet] + /// mod pallet { + /// # use frame_support::pallet_prelude::*; + /// # #[pallet::config] + /// # pub trait Config: frame_system::Config {} + /// # #[pallet::pallet] + /// # pub struct Pallet(_); + /// #[derive(PartialEq, Eq, Clone, RuntimeDebug, Encode, Decode, TypeInfo, MaxEncodedLen)] + /// pub enum RawOrigin { + /// Foo, + /// Bar, + /// } + /// + /// #[pallet::origin] + /// pub type Origin = RawOrigin; + /// } + /// ``` + /// + /// ## Warning + /// + /// Modifying any pallet's origin type will cause the runtime level origin type to also + /// change in encoding. If stored anywhere on-chain, this will require a data migration. + /// + /// Read more about origins at the [Origin Reference + /// Docs](../../polkadot_sdk_docs/reference_docs/frame_origin/index.html). + pub use frame_support_procedural::origin; } #[deprecated(note = "Will be removed after July 2023; Use `sp_runtime::traits` directly instead.")] diff --git a/substrate/frame/support/src/migrations.rs b/substrate/frame/support/src/migrations.rs index d059a992a8664cd8c3583f7f6fd1bff6af102770..968639e02d35be13160918619a77041ceca20be6 100644 --- a/substrate/frame/support/src/migrations.rs +++ b/substrate/frame/support/src/migrations.rs @@ -16,13 +16,21 @@ // limitations under the License. use crate::{ - traits::{GetStorageVersion, NoStorageVersionSet, PalletInfoAccess, StorageVersion}, - weights::{RuntimeDbWeight, Weight}, + defensive, + storage::transactional::with_transaction_opaque_err, + traits::{ + Defensive, GetStorageVersion, NoStorageVersionSet, PalletInfoAccess, SafeMode, + StorageVersion, + }, + weights::{RuntimeDbWeight, Weight, WeightMeter}, }; +use codec::{Decode, Encode, MaxEncodedLen}; use impl_trait_for_tuples::impl_for_tuples; +use sp_arithmetic::traits::Bounded; use sp_core::Get; use sp_io::{hashing::twox_128, storage::clear_prefix, KillStorageResult}; -use sp_std::marker::PhantomData; +use sp_runtime::traits::Zero; +use sp_std::{marker::PhantomData, vec::Vec}; /// Handles storage migration pallet versioning. /// @@ -33,22 +41,40 @@ use sp_std::marker::PhantomData; /// It takes 5 type parameters: /// - `From`: The version being upgraded from. /// - `To`: The version being upgraded to. -/// - `Inner`: An implementation of `OnRuntimeUpgrade`. +/// - `Inner`: An implementation of `UncheckedOnRuntimeUpgrade`. /// - `Pallet`: The Pallet being upgraded. /// - `Weight`: The runtime's RuntimeDbWeight implementation. /// /// When a [`VersionedMigration`] `on_runtime_upgrade`, `pre_upgrade`, or `post_upgrade` method is /// called, the on-chain version of the pallet is compared to `From`. If they match, the `Inner` -/// equivalent is called and the pallets on-chain version is set to `To` after the migration. -/// Otherwise, a warning is logged notifying the developer that the upgrade was a noop and should -/// probably be removed. +/// `UncheckedOnRuntimeUpgrade` is called and the pallets on-chain version is set to `To` +/// after the migration. Otherwise, a warning is logged notifying the developer that the upgrade was +/// a noop and should probably be removed. +/// +/// By not bounding `Inner` with `OnRuntimeUpgrade`, we prevent developers from +/// accidentally using the unchecked version of the migration in a runtime upgrade instead of +/// [`VersionedMigration`]. /// /// ### Examples /// ```ignore /// // In file defining migrations -/// pub struct VersionUncheckedMigrateV5ToV6(sp_std::marker::PhantomData); -/// impl OnRuntimeUpgrade for VersionUncheckedMigrateV5ToV6 { -/// // OnRuntimeUpgrade implementation... +/// +/// /// Private module containing *version unchecked* migration logic. +/// /// +/// /// Should only be used by the [`VersionedMigration`] type in this module to create something to +/// /// export. +/// /// +/// /// We keep this private so the unversioned migration cannot accidentally be used in any runtimes. +/// /// +/// /// For more about this pattern of keeping items private, see +/// /// - https://github.com/rust-lang/rust/issues/30905 +/// /// - https://internals.rust-lang.org/t/lang-team-minutes-private-in-public-rules/4504/40 +/// mod version_unchecked { +/// use super::*; +/// pub struct VersionUncheckedMigrateV5ToV6(sp_std::marker::PhantomData); +/// impl UncheckedOnRuntimeUpgrade for VersionUncheckedMigrateV5ToV6 { +/// // `UncheckedOnRuntimeUpgrade` implementation... +/// } /// } /// /// pub type MigrateV5ToV6 = @@ -73,7 +99,7 @@ pub struct VersionedMigration), @@ -90,8 +116,8 @@ pub enum VersionedPostUpgradeData { impl< const FROM: u16, const TO: u16, - Inner: crate::traits::OnRuntimeUpgrade, - Pallet: GetStorageVersion + PalletInfoAccess, + Inner: crate::traits::UncheckedOnRuntimeUpgrade, + Pallet: GetStorageVersion + PalletInfoAccess, DbWeight: Get, > crate::traits::OnRuntimeUpgrade for VersionedMigration { @@ -100,7 +126,6 @@ impl< /// migration ran or not. #[cfg(feature = "try-runtime")] fn pre_upgrade() -> Result, sp_runtime::TryRuntimeError> { - use codec::Encode; let on_chain_version = Pallet::on_chain_storage_version(); if on_chain_version == FROM { Ok(VersionedPostUpgradeData::MigrationExecuted(Inner::pre_upgrade()?).encode()) @@ -163,25 +188,25 @@ impl< } } -/// Can store the current pallet version in storage. -pub trait StoreCurrentStorageVersion { - /// Write the current storage version to the storage. - fn store_current_storage_version(); +/// Can store the in-code pallet version on-chain. +pub trait StoreInCodeStorageVersion { + /// Write the in-code storage version on-chain. + fn store_in_code_storage_version(); } -impl + PalletInfoAccess> - StoreCurrentStorageVersion for StorageVersion +impl + PalletInfoAccess> + StoreInCodeStorageVersion for StorageVersion { - fn store_current_storage_version() { - let version = ::current_storage_version(); + fn store_in_code_storage_version() { + let version = ::in_code_storage_version(); version.put::(); } } -impl + PalletInfoAccess> - StoreCurrentStorageVersion for NoStorageVersionSet +impl + PalletInfoAccess> + StoreInCodeStorageVersion for NoStorageVersionSet { - fn store_current_storage_version() { + fn store_in_code_storage_version() { StorageVersion::default().put::(); } } @@ -193,7 +218,7 @@ pub trait PalletVersionToStorageVersionHelper { impl PalletVersionToStorageVersionHelper for T where - T::CurrentStorageVersion: StoreCurrentStorageVersion, + T::InCodeStorageVersion: StoreInCodeStorageVersion, { fn migrate(db_weight: &RuntimeDbWeight) -> Weight { const PALLET_VERSION_STORAGE_KEY_POSTFIX: &[u8] = b":__PALLET_VERSION__:"; @@ -204,8 +229,7 @@ where sp_io::storage::clear(&pallet_version_key(::name())); - >::store_current_storage_version( - ); + >::store_in_code_storage_version(); db_weight.writes(2) } @@ -226,7 +250,7 @@ impl PalletVersionToStorageVersionHelper for T { /// Migrate from the `PalletVersion` struct to the new [`StorageVersion`] struct. /// -/// This will remove all `PalletVersion's` from the state and insert the current storage version. +/// This will remove all `PalletVersion's` from the state and insert the in-code storage version. pub fn migrate_from_pallet_version_to_storage_version< Pallets: PalletVersionToStorageVersionHelper, >( @@ -344,3 +368,632 @@ impl, DbWeight: Get> frame_support::traits Ok(()) } } + +/// A migration that can proceed in multiple steps. +pub trait SteppedMigration { + /// The cursor type that stores the progress (aka. state) of this migration. + type Cursor: codec::FullCodec + codec::MaxEncodedLen; + + /// The unique identifier type of this migration. + type Identifier: codec::FullCodec + codec::MaxEncodedLen; + + /// The unique identifier of this migration. + /// + /// If two migrations have the same identifier, then they are assumed to be identical. + fn id() -> Self::Identifier; + + /// The maximum number of steps that this migration can take. + /// + /// This can be used to enforce progress and prevent migrations becoming stuck forever. A + /// migration that exceeds its max steps is treated as failed. `None` means that there is no + /// limit. + fn max_steps() -> Option { + None + } + + /// Try to migrate as much as possible with the given weight. + /// + /// **ANY STORAGE CHANGES MUST BE ROLLED-BACK BY THE CALLER UPON ERROR.** This is necessary + /// since the caller cannot return a cursor in the error case. [`Self::transactional_step`] is + /// provided as convenience for a caller. A cursor of `None` implies that the migration is at + /// its end. A migration that once returned `Nonce` is guaranteed to never be called again. + fn step( + cursor: Option, + meter: &mut WeightMeter, + ) -> Result, SteppedMigrationError>; + + /// Same as [`Self::step`], but rolls back pending changes in the error case. + fn transactional_step( + mut cursor: Option, + meter: &mut WeightMeter, + ) -> Result, SteppedMigrationError> { + with_transaction_opaque_err(move || match Self::step(cursor, meter) { + Ok(new_cursor) => { + cursor = new_cursor; + sp_runtime::TransactionOutcome::Commit(Ok(cursor)) + }, + Err(err) => sp_runtime::TransactionOutcome::Rollback(Err(err)), + }) + .map_err(|()| SteppedMigrationError::Failed)? + } +} + +/// Error that can occur during a [`SteppedMigration`]. +#[derive(Debug, Encode, Decode, MaxEncodedLen, scale_info::TypeInfo)] +pub enum SteppedMigrationError { + // Transient errors: + /// The remaining weight is not enough to do anything. + /// + /// Can be resolved by calling with at least `required` weight. Note that calling it with + /// exactly `required` weight could cause it to not make any progress. + InsufficientWeight { + /// Amount of weight required to make progress. + required: Weight, + }, + // Permanent errors: + /// The migration cannot decode its cursor and therefore not proceed. + /// + /// This should not happen unless (1) the migration itself returned an invalid cursor in a + /// previous iteration, (2) the storage got corrupted or (3) there is a bug in the caller's + /// code. + InvalidCursor, + /// The migration encountered a permanent error and cannot continue. + Failed, +} + +/// A generic migration identifier that can be used by MBMs. +/// +/// It is not required that migrations use this identifier type, but it can help. +#[derive(MaxEncodedLen, Encode, Decode)] +pub struct MigrationId { + pub pallet_id: [u8; N], + pub version_from: u8, + pub version_to: u8, +} + +/// Notification handler for status updates regarding Multi-Block-Migrations. +#[impl_trait_for_tuples::impl_for_tuples(8)] +pub trait MigrationStatusHandler { + /// Notifies of the start of a runtime migration. + fn started() {} + + /// Notifies of the completion of a runtime migration. + fn completed() {} +} + +/// Handles a failed runtime migration. +/// +/// This should never happen, but is here for completeness. +pub trait FailedMigrationHandler { + /// Infallibly handle a failed runtime migration. + /// + /// Gets passed in the optional index of the migration in the batch that caused the failure. + /// Returning `None` means that no automatic handling should take place and the callee decides + /// in the implementation what to do. + fn failed(migration: Option) -> FailedMigrationHandling; +} + +/// Do now allow any transactions to be processed after a runtime upgrade failed. +/// +/// This is **not a sane default**, since it prevents governance intervention. +pub struct FreezeChainOnFailedMigration; + +impl FailedMigrationHandler for FreezeChainOnFailedMigration { + fn failed(_migration: Option) -> FailedMigrationHandling { + FailedMigrationHandling::KeepStuck + } +} + +/// Enter safe mode on a failed runtime upgrade. +/// +/// This can be very useful to manually intervene and fix the chain state. `Else` is used in case +/// that the safe mode could not be entered. +pub struct EnterSafeModeOnFailedMigration( + PhantomData<(SM, Else)>, +); + +impl FailedMigrationHandler + for EnterSafeModeOnFailedMigration +where + ::BlockNumber: Bounded, +{ + fn failed(migration: Option) -> FailedMigrationHandling { + let entered = if SM::is_entered() { + SM::extend(Bounded::max_value()) + } else { + SM::enter(Bounded::max_value()) + }; + + // If we could not enter or extend safe mode (for whatever reason), then we try the next. + if entered.is_err() { + Else::failed(migration) + } else { + FailedMigrationHandling::KeepStuck + } + } +} + +/// How to proceed after a runtime upgrade failed. +/// +/// There is NO SANE DEFAULT HERE. All options are very dangerous and should be used with care. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum FailedMigrationHandling { + /// Resume extrinsic processing of the chain. This will not resume the upgrade. + /// + /// This should be supplemented with additional measures to ensure that the broken chain state + /// does not get further messed up by user extrinsics. + ForceUnstuck, + /// Set the cursor to `Stuck` and keep blocking extrinsics. + KeepStuck, + /// Don't do anything with the cursor and let the handler decide. + /// + /// This can be useful in cases where the other two options would overwrite any changes that + /// were done by the handler to the cursor. + Ignore, +} + +/// Something that can do multi step migrations. +pub trait MultiStepMigrator { + /// Hint for whether [`Self::step`] should be called. + fn ongoing() -> bool; + + /// Do the next step in the MBM process. + /// + /// Must gracefully handle the case that it is currently not upgrading. + fn step() -> Weight; +} + +impl MultiStepMigrator for () { + fn ongoing() -> bool { + false + } + + fn step() -> Weight { + Weight::zero() + } +} + +/// Multiple [`SteppedMigration`]. +pub trait SteppedMigrations { + /// The number of migrations that `Self` aggregates. + fn len() -> u32; + + /// The `n`th [`SteppedMigration::id`]. + /// + /// Is guaranteed to return `Some` if `n < Self::len()`. + fn nth_id(n: u32) -> Option>; + + /// The [`SteppedMigration::max_steps`] of the `n`th migration. + /// + /// Is guaranteed to return `Some` if `n < Self::len()`. + fn nth_max_steps(n: u32) -> Option>; + + /// Do a [`SteppedMigration::step`] on the `n`th migration. + /// + /// Is guaranteed to return `Some` if `n < Self::len()`. + fn nth_step( + n: u32, + cursor: Option>, + meter: &mut WeightMeter, + ) -> Option>, SteppedMigrationError>>; + + /// Do a [`SteppedMigration::transactional_step`] on the `n`th migration. + /// + /// Is guaranteed to return `Some` if `n < Self::len()`. + fn nth_transactional_step( + n: u32, + cursor: Option>, + meter: &mut WeightMeter, + ) -> Option>, SteppedMigrationError>>; + + /// The maximal encoded length across all cursors. + fn cursor_max_encoded_len() -> usize; + + /// The maximal encoded length across all identifiers. + fn identifier_max_encoded_len() -> usize; + + /// Assert the integrity of the migrations. + /// + /// Should be executed as part of a test prior to runtime usage. May or may not need + /// externalities. + #[cfg(feature = "std")] + fn integrity_test() -> Result<(), &'static str> { + use crate::ensure; + let l = Self::len(); + + for n in 0..l { + ensure!(Self::nth_id(n).is_some(), "id is None"); + ensure!(Self::nth_max_steps(n).is_some(), "steps is None"); + + // The cursor that we use does not matter. Hence use empty. + ensure!( + Self::nth_step(n, Some(vec![]), &mut WeightMeter::new()).is_some(), + "steps is None" + ); + ensure!( + Self::nth_transactional_step(n, Some(vec![]), &mut WeightMeter::new()).is_some(), + "steps is None" + ); + } + + Ok(()) + } +} + +impl SteppedMigrations for () { + fn len() -> u32 { + 0 + } + + fn nth_id(_n: u32) -> Option> { + None + } + + fn nth_max_steps(_n: u32) -> Option> { + None + } + + fn nth_step( + _n: u32, + _cursor: Option>, + _meter: &mut WeightMeter, + ) -> Option>, SteppedMigrationError>> { + None + } + + fn nth_transactional_step( + _n: u32, + _cursor: Option>, + _meter: &mut WeightMeter, + ) -> Option>, SteppedMigrationError>> { + None + } + + fn cursor_max_encoded_len() -> usize { + 0 + } + + fn identifier_max_encoded_len() -> usize { + 0 + } +} + +// A collection consisting of only a single migration. +impl SteppedMigrations for T { + fn len() -> u32 { + 1 + } + + fn nth_id(_n: u32) -> Option> { + Some(T::id().encode()) + } + + fn nth_max_steps(n: u32) -> Option> { + // It should be generally fine to call with n>0, but the code should not attempt to. + n.is_zero() + .then_some(T::max_steps()) + .defensive_proof("nth_max_steps should only be called with n==0") + } + + fn nth_step( + _n: u32, + cursor: Option>, + meter: &mut WeightMeter, + ) -> Option>, SteppedMigrationError>> { + if !_n.is_zero() { + defensive!("nth_step should only be called with n==0"); + return None + } + + let cursor = match cursor { + Some(cursor) => match T::Cursor::decode(&mut &cursor[..]) { + Ok(cursor) => Some(cursor), + Err(_) => return Some(Err(SteppedMigrationError::InvalidCursor)), + }, + None => None, + }; + + Some(T::step(cursor, meter).map(|cursor| cursor.map(|cursor| cursor.encode()))) + } + + fn nth_transactional_step( + n: u32, + cursor: Option>, + meter: &mut WeightMeter, + ) -> Option>, SteppedMigrationError>> { + if n != 0 { + defensive!("nth_transactional_step should only be called with n==0"); + return None + } + + let cursor = match cursor { + Some(cursor) => match T::Cursor::decode(&mut &cursor[..]) { + Ok(cursor) => Some(cursor), + Err(_) => return Some(Err(SteppedMigrationError::InvalidCursor)), + }, + None => None, + }; + + Some( + T::transactional_step(cursor, meter).map(|cursor| cursor.map(|cursor| cursor.encode())), + ) + } + + fn cursor_max_encoded_len() -> usize { + T::Cursor::max_encoded_len() + } + + fn identifier_max_encoded_len() -> usize { + T::Identifier::max_encoded_len() + } +} + +#[impl_trait_for_tuples::impl_for_tuples(1, 30)] +impl SteppedMigrations for Tuple { + fn len() -> u32 { + for_tuples!( #( Tuple::len() )+* ) + } + + fn nth_id(n: u32) -> Option> { + let mut i = 0; + + for_tuples!( #( + if (i + Tuple::len()) > n { + return Tuple::nth_id(n - i) + } + + i += Tuple::len(); + )* ); + + None + } + + fn nth_step( + n: u32, + cursor: Option>, + meter: &mut WeightMeter, + ) -> Option>, SteppedMigrationError>> { + let mut i = 0; + + for_tuples!( #( + if (i + Tuple::len()) > n { + return Tuple::nth_step(n - i, cursor, meter) + } + + i += Tuple::len(); + )* ); + + None + } + + fn nth_transactional_step( + n: u32, + cursor: Option>, + meter: &mut WeightMeter, + ) -> Option>, SteppedMigrationError>> { + let mut i = 0; + + for_tuples! ( #( + if (i + Tuple::len()) > n { + return Tuple::nth_transactional_step(n - i, cursor, meter) + } + + i += Tuple::len(); + )* ); + + None + } + + fn nth_max_steps(n: u32) -> Option> { + let mut i = 0; + + for_tuples!( #( + if (i + Tuple::len()) > n { + return Tuple::nth_max_steps(n - i) + } + + i += Tuple::len(); + )* ); + + None + } + + fn cursor_max_encoded_len() -> usize { + let mut max_len = 0; + + for_tuples!( #( + max_len = max_len.max(Tuple::cursor_max_encoded_len()); + )* ); + + max_len + } + + fn identifier_max_encoded_len() -> usize { + let mut max_len = 0; + + for_tuples!( #( + max_len = max_len.max(Tuple::identifier_max_encoded_len()); + )* ); + + max_len + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::{assert_ok, storage::unhashed}; + + #[derive(Decode, Encode, MaxEncodedLen, Eq, PartialEq)] + pub enum Either { + Left(L), + Right(R), + } + + pub struct M0; + impl SteppedMigration for M0 { + type Cursor = (); + type Identifier = u8; + + fn id() -> Self::Identifier { + 0 + } + + fn step( + _cursor: Option, + _meter: &mut WeightMeter, + ) -> Result, SteppedMigrationError> { + log::info!("M0"); + unhashed::put(&[0], &()); + Ok(None) + } + } + + pub struct M1; + impl SteppedMigration for M1 { + type Cursor = (); + type Identifier = u8; + + fn id() -> Self::Identifier { + 1 + } + + fn step( + _cursor: Option, + _meter: &mut WeightMeter, + ) -> Result, SteppedMigrationError> { + log::info!("M1"); + unhashed::put(&[1], &()); + Ok(None) + } + + fn max_steps() -> Option { + Some(1) + } + } + + pub struct M2; + impl SteppedMigration for M2 { + type Cursor = (); + type Identifier = u8; + + fn id() -> Self::Identifier { + 2 + } + + fn step( + _cursor: Option, + _meter: &mut WeightMeter, + ) -> Result, SteppedMigrationError> { + log::info!("M2"); + unhashed::put(&[2], &()); + Ok(None) + } + + fn max_steps() -> Option { + Some(2) + } + } + + pub struct F0; + impl SteppedMigration for F0 { + type Cursor = (); + type Identifier = u8; + + fn id() -> Self::Identifier { + 3 + } + + fn step( + _cursor: Option, + _meter: &mut WeightMeter, + ) -> Result, SteppedMigrationError> { + log::info!("F0"); + unhashed::put(&[3], &()); + Err(SteppedMigrationError::Failed) + } + } + + // Three migrations combined to execute in order: + type Triple = (M0, (M1, M2)); + // Six migrations, just concatenating the ones from before: + type Hextuple = (Triple, Triple); + + #[test] + fn singular_migrations_work() { + assert_eq!(M0::max_steps(), None); + assert_eq!(M1::max_steps(), Some(1)); + assert_eq!(M2::max_steps(), Some(2)); + + assert_eq!(<(M0, M1)>::nth_max_steps(0), Some(None)); + assert_eq!(<(M0, M1)>::nth_max_steps(1), Some(Some(1))); + assert_eq!(<(M0, M1, M2)>::nth_max_steps(2), Some(Some(2))); + + assert_eq!(<(M0, M1)>::nth_max_steps(2), None); + } + + #[test] + fn tuple_migrations_work() { + assert_eq!(<() as SteppedMigrations>::len(), 0); + assert_eq!(<((), ((), ())) as SteppedMigrations>::len(), 0); + assert_eq!(::len(), 3); + assert_eq!(::len(), 6); + + // Check the IDs. The index specific functions all return an Option, + // to account for the out-of-range case. + assert_eq!(::nth_id(0), Some(0u8.encode())); + assert_eq!(::nth_id(1), Some(1u8.encode())); + assert_eq!(::nth_id(2), Some(2u8.encode())); + + sp_io::TestExternalities::default().execute_with(|| { + for n in 0..3 { + ::nth_step( + n, + Default::default(), + &mut WeightMeter::new(), + ); + } + }); + } + + #[test] + fn integrity_test_works() { + sp_io::TestExternalities::default().execute_with(|| { + assert_ok!(<() as SteppedMigrations>::integrity_test()); + assert_ok!(::integrity_test()); + assert_ok!(::integrity_test()); + assert_ok!(::integrity_test()); + assert_ok!(::integrity_test()); + assert_ok!(::integrity_test()); + }); + } + + #[test] + fn transactional_rollback_works() { + sp_io::TestExternalities::default().execute_with(|| { + assert_ok!(<(M0, F0) as SteppedMigrations>::nth_transactional_step( + 0, + Default::default(), + &mut WeightMeter::new() + ) + .unwrap()); + assert!(unhashed::exists(&[0])); + + let _g = crate::StorageNoopGuard::new(); + assert!(<(M0, F0) as SteppedMigrations>::nth_transactional_step( + 1, + Default::default(), + &mut WeightMeter::new() + ) + .unwrap() + .is_err()); + assert!(<(F0, M1) as SteppedMigrations>::nth_transactional_step( + 0, + Default::default(), + &mut WeightMeter::new() + ) + .unwrap() + .is_err()); + }); + } +} diff --git a/substrate/frame/support/src/storage/migration.rs b/substrate/frame/support/src/storage/migration.rs index 568c475bdc69d6adc9f59bc0b059b48987bd04e3..252625cf4f7d02aa82418ca50b45334c53692766 100644 --- a/substrate/frame/support/src/storage/migration.rs +++ b/substrate/frame/support/src/storage/migration.rs @@ -303,11 +303,11 @@ pub fn take_storage_item /// Move a storage from a pallet prefix to another pallet prefix. /// /// Keys used in pallet storages always start with: -/// `concat(twox_128(pallet_name), towx_128(storage_name))`. +/// `concat(twox_128(pallet_name), twox_128(storage_name))`. /// /// This function will remove all value for which the key start with -/// `concat(twox_128(old_pallet_name), towx_128(storage_name))` and insert them at the key with -/// the start replaced by `concat(twox_128(new_pallet_name), towx_128(storage_name))`. +/// `concat(twox_128(old_pallet_name), twox_128(storage_name))` and insert them at the key with +/// the start replaced by `concat(twox_128(new_pallet_name), twox_128(storage_name))`. /// /// # Example /// @@ -339,7 +339,7 @@ pub fn move_storage_from_pallet( /// Move all storages from a pallet prefix to another pallet prefix. /// /// Keys used in pallet storages always start with: -/// `concat(twox_128(pallet_name), towx_128(storage_name))`. +/// `concat(twox_128(pallet_name), twox_128(storage_name))`. /// /// This function will remove all value for which the key start with `twox_128(old_pallet_name)` /// and insert them at the key with the start replaced by `twox_128(new_pallet_name)`. diff --git a/substrate/frame/support/src/storage/mod.rs b/substrate/frame/support/src/storage/mod.rs index 8ebe7b31da80d3511b4a0003637d1f45b52d5b11..f7d7447482d06ccd64e59c3b8e49aec18696fdee 100644 --- a/substrate/frame/support/src/storage/mod.rs +++ b/substrate/frame/support/src/storage/mod.rs @@ -159,7 +159,7 @@ pub trait StorageValue { /// /// # Warning /// - /// `None` does not mean that `get()` does not return a value. The default value is completly + /// `None` does not mean that `get()` does not return a value. The default value is completely /// ignored by this function. fn decode_len() -> Option where @@ -363,7 +363,7 @@ pub trait StorageMap { /// /// # Warning /// - /// `None` does not mean that `get()` does not return a value. The default value is completly + /// `None` does not mean that `get()` does not return a value. The default value is completely /// ignored by this function. fn decode_len>(key: KeyArg) -> Option where @@ -381,7 +381,8 @@ pub trait StorageMap { /// /// # Warning /// - /// - `None` does not mean that `get()` does not return a value. The default value is completly + /// - `None` does not mean that `get()` does not return a value. The default value is + /// completely /// ignored by this function. /// /// - The value returned is the non-deduplicated length of the underlying Vector in storage.This @@ -410,7 +411,7 @@ pub trait StorageMap { pub trait IterableStorageMap: StorageMap { /// The type that iterates over all `(key, value)`. type Iterator: Iterator; - /// The type that itereates over all `key`s. + /// The type that iterates over all `key`s. type KeyIterator: Iterator; /// Enumerate all elements in the map in lexicographical order of the encoded key. If you @@ -777,7 +778,7 @@ pub trait StorageDoubleMap { /// /// # Warning /// - /// `None` does not mean that `get()` does not return a value. The default value is completly + /// `None` does not mean that `get()` does not return a value. The default value is completely /// ignored by this function. fn decode_len(key1: KArg1, key2: KArg2) -> Option where @@ -798,7 +799,7 @@ pub trait StorageDoubleMap { /// /// # Warning /// - /// `None` does not mean that `get()` does not return a value. The default value is completly + /// `None` does not mean that `get()` does not return a value. The default value is completely /// ignored by this function. fn decode_non_dedup_len(key1: KArg1, key2: KArg2) -> Option where @@ -980,7 +981,7 @@ pub trait StorageNMap { /// /// # Warning /// - /// `None` does not mean that `get()` does not return a value. The default value is completly + /// `None` does not mean that `get()` does not return a value. The default value is completely /// ignored by this function. fn decode_len + TupleToEncodedIter>(key: KArg) -> Option where @@ -1488,8 +1489,8 @@ pub trait StorageDecodeLength: private::Sealed + codec::DecodeLength { } } -/// It is expected that the length is at the beginning of the encoded objectand that the length is a -/// `Compact`. +/// It is expected that the length is at the beginning of the encoded object and that the length is +/// a `Compact`. /// /// # Note /// The length returned by this trait is not deduplicated, i.e. it is the length of the underlying @@ -1790,7 +1791,7 @@ mod test { }); } - // This test ensures that the Digest encoding does not change without being noticied. + // This test ensures that the Digest encoding does not change without being noticed. #[test] fn digest_storage_append_works_as_expected() { TestExternalities::default().execute_with(|| { diff --git a/substrate/frame/support/src/storage/stream_iter.rs b/substrate/frame/support/src/storage/stream_iter.rs index 2205601938b880f88bcdbc20680e7d6254badc8b..529b2f387c71cc86b52f648f8630bd9f2339dd69 100644 --- a/substrate/frame/support/src/storage/stream_iter.rs +++ b/substrate/frame/support/src/storage/stream_iter.rs @@ -217,7 +217,7 @@ const STORAGE_INPUT_BUFFER_CAPACITY: usize = 2 * 1024; /// Implementation of [`codec::Input`] using [`sp_io::storage::read`]. /// /// Keeps an internal buffer with a size of [`STORAGE_INPUT_BUFFER_CAPACITY`]. All read accesses -/// are tried to be served by this buffer. If the buffer doesn't hold enough bytes to fullfill the +/// are tried to be served by this buffer. If the buffer doesn't hold enough bytes to fulfill the /// current read access, the buffer is re-filled from the state. A read request that is bigger than /// the internal buffer is directly forwarded to the state to reduce the number of reads from the /// state. diff --git a/substrate/frame/support/src/storage/transactional.rs b/substrate/frame/support/src/storage/transactional.rs index d42e1809e91292a8e0ad367af4e203b8b1b17f87..0671db4a3a86bc76f7706df6eefe28a8c34c0701 100644 --- a/substrate/frame/support/src/storage/transactional.rs +++ b/substrate/frame/support/src/storage/transactional.rs @@ -127,6 +127,22 @@ where } } +/// Same as [`with_transaction`] but casts any internal error to `()`. +/// +/// This rids `E` of the `From` bound that is required by `with_transaction`. +pub fn with_transaction_opaque_err(f: F) -> Result, ()> +where + F: FnOnce() -> TransactionOutcome>, +{ + with_transaction(move || -> TransactionOutcome, DispatchError>> { + match f() { + TransactionOutcome::Commit(res) => TransactionOutcome::Commit(Ok(res)), + TransactionOutcome::Rollback(res) => TransactionOutcome::Rollback(Ok(res)), + } + }) + .map_err(|_| ()) +} + /// Same as [`with_transaction`] but without a limit check on nested transactional layers. /// /// This is mostly for backwards compatibility before there was a transactional layer limit. diff --git a/substrate/frame/support/src/storage/types/counted_map.rs b/substrate/frame/support/src/storage/types/counted_map.rs index 04e69751c16a00e4b89fdf5907bec5be64305014..0444e269928ab68e6da1ebada37425d77bdcc288 100644 --- a/substrate/frame/support/src/storage/types/counted_map.rs +++ b/substrate/frame/support/src/storage/types/counted_map.rs @@ -310,7 +310,7 @@ where /// /// # Warning /// - /// `None` does not mean that `get()` does not return a value. The default value is completly + /// `None` does not mean that `get()` does not return a value. The default value is completely /// ignored by this function. pub fn decode_len>(key: KeyArg) -> Option where @@ -775,13 +775,13 @@ mod test { assert_eq!(A::try_get(1), Err(())); assert_eq!(A::count(), 3); - // Take exsisting. + // Take existing. assert_eq!(A::take(4), 10); assert_eq!(A::try_get(4), Err(())); assert_eq!(A::count(), 2); - // Take non-exsisting. + // Take non-existing. assert_eq!(A::take(4), ADefault::get()); assert_eq!(A::try_get(4), Err(())); @@ -1022,13 +1022,13 @@ mod test { assert_eq!(B::try_get(1), Err(())); assert_eq!(B::count(), 3); - // Take exsisting. + // Take existing. assert_eq!(B::take(4), Some(10)); assert_eq!(B::try_get(4), Err(())); assert_eq!(B::count(), 2); - // Take non-exsisting. + // Take non-existing. assert_eq!(B::take(4), None); assert_eq!(B::try_get(4), Err(())); diff --git a/substrate/frame/support/src/storage/types/counted_nmap.rs b/substrate/frame/support/src/storage/types/counted_nmap.rs index 279894ee97363b38462f83e011f8fee9f0fc233b..51cde93f28c01d8dab45da49fddb0b5eeb1c54d1 100644 --- a/substrate/frame/support/src/storage/types/counted_nmap.rs +++ b/substrate/frame/support/src/storage/types/counted_nmap.rs @@ -378,7 +378,7 @@ where /// /// # Warning /// - /// `None` does not mean that `get()` does not return a value. The default value is completly + /// `None` does not mean that `get()` does not return a value. The default value is completely /// ignored by this function. pub fn decode_len + TupleToEncodedIter>( key: KArg, diff --git a/substrate/frame/support/src/storage/types/double_map.rs b/substrate/frame/support/src/storage/types/double_map.rs index cb9479d491cff7206eb36996097e231439fd1769..2a7af7a984633ebcb79572e30595359758b50154 100644 --- a/substrate/frame/support/src/storage/types/double_map.rs +++ b/substrate/frame/support/src/storage/types/double_map.rs @@ -445,7 +445,7 @@ where /// /// # Warning /// - /// `None` does not mean that `get()` does not return a value. The default value is completly + /// `None` does not mean that `get()` does not return a value. The default value is completely /// ignored by this function. pub fn decode_len(key1: KArg1, key2: KArg2) -> Option where @@ -465,7 +465,8 @@ where /// /// # Warning /// - /// - `None` does not mean that `get()` does not return a value. The default value is completly + /// - `None` does not mean that `get()` does not return a value. The default value is + /// completely /// ignored by this function. /// /// - The value returned is the non-deduplicated length of the underlying Vector in storage.This diff --git a/substrate/frame/support/src/storage/types/map.rs b/substrate/frame/support/src/storage/types/map.rs index ee5db74583b03f8646553d7fc8c1c75042e7f68a..b79a6ae9b8482090c3f3ebe42b7b23aa8824b657 100644 --- a/substrate/frame/support/src/storage/types/map.rs +++ b/substrate/frame/support/src/storage/types/map.rs @@ -277,7 +277,7 @@ where /// /// # Warning /// - /// `None` does not mean that `get()` does not return a value. The default value is completly + /// `None` does not mean that `get()` does not return a value. The default value is completely /// ignored by this function. pub fn decode_len>(key: KeyArg) -> Option where @@ -295,7 +295,8 @@ where /// /// # Warning /// - /// - `None` does not mean that `get()` does not return a value. The default value is completly + /// - `None` does not mean that `get()` does not return a value. The default value is + /// completely /// ignored by this function. /// /// - The value returned is the non-deduplicated length of the underlying Vector in storage.This diff --git a/substrate/frame/support/src/storage/types/mod.rs b/substrate/frame/support/src/storage/types/mod.rs index 9dd6f4066e432068b97899e94017bb06fe0dc014..631410f425d17a169f16cd0380a3ffa3f22f6611 100644 --- a/substrate/frame/support/src/storage/types/mod.rs +++ b/substrate/frame/support/src/storage/types/mod.rs @@ -195,7 +195,7 @@ mod test { // result query returns error assert_eq!(C::get(), Err(())); - // value query with custom onempty returns 42 + // value query with custom on empty returns 42 assert_eq!(D::get(), 42); }); } diff --git a/substrate/frame/support/src/storage/types/nmap.rs b/substrate/frame/support/src/storage/types/nmap.rs index 0723db68900273ff729e8d7cceb4e408e18a00e3..253f02a14f0796f7ecba7e81af8e5be7b7ec0e42 100755 --- a/substrate/frame/support/src/storage/types/nmap.rs +++ b/substrate/frame/support/src/storage/types/nmap.rs @@ -348,7 +348,7 @@ where /// /// # Warning /// - /// `None` does not mean that `get()` does not return a value. The default value is completly + /// `None` does not mean that `get()` does not return a value. The default value is completely /// ignored by this function. pub fn decode_len + TupleToEncodedIter>( key: KArg, diff --git a/substrate/frame/support/src/storage/types/value.rs b/substrate/frame/support/src/storage/types/value.rs index 263091dd25237da759c54a0a7668306e5850aec9..a2d93a6a165ffca205f1597dfa0952c9c4900313 100644 --- a/substrate/frame/support/src/storage/types/value.rs +++ b/substrate/frame/support/src/storage/types/value.rs @@ -225,7 +225,7 @@ where /// /// # Warning /// - /// `None` does not mean that `get()` does not return a value. The default value is completly + /// `None` does not mean that `get()` does not return a value. The default value is completely /// ignored by this function. pub fn decode_len() -> Option where @@ -243,7 +243,8 @@ where /// /// # Warning /// - /// - `None` does not mean that `get()` does not return a value. The default value is completly + /// - `None` does not mean that `get()` does not return a value. The default value is + /// completely /// ignored by this function. /// /// - The value returned is the non-deduplicated length of the underlying Vector in storage.This diff --git a/substrate/frame/support/src/tests/mod.rs b/substrate/frame/support/src/tests/mod.rs index c6a0b6cde7737e7510ab124bacef86a1a55aca96..88afa243f0932e797516192f0fd1495f00cd69bf 100644 --- a/substrate/frame/support/src/tests/mod.rs +++ b/substrate/frame/support/src/tests/mod.rs @@ -171,7 +171,7 @@ pub mod frame_system { pub data: Vec<(u32, u64)>, pub test_config: Vec<(u32, u32, u64)>, #[serde(skip)] - pub _config: sp_std::marker::PhantomData, + pub _config: core::marker::PhantomData, } impl Default for GenesisConfig { @@ -227,7 +227,7 @@ crate::construct_runtime!( } ); -#[crate::derive_impl(self::frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[crate::derive_impl(self::frame_system::config_preludes::TestDefaultConfig as self::frame_system::DefaultConfig)] impl Config for Runtime { type Block = Block; type AccountId = AccountId; diff --git a/substrate/frame/support/src/traits.rs b/substrate/frame/support/src/traits.rs index 2a42fca76b3c57623c74e3724b342eadf57737cd..66777cef7b8e81960c1169c2fb1fd1033e58c4a2 100644 --- a/substrate/frame/support/src/traits.rs +++ b/substrate/frame/support/src/traits.rs @@ -22,8 +22,8 @@ pub mod tokens; pub use tokens::{ currency::{ - ActiveIssuanceOf, Currency, LockIdentifier, LockableCurrency, NamedReservableCurrency, - ReservableCurrency, TotalIssuanceOf, VestingSchedule, + ActiveIssuanceOf, Currency, InspectLockableCurrency, LockIdentifier, LockableCurrency, + NamedReservableCurrency, ReservableCurrency, TotalIssuanceOf, VestingSchedule, }, fungible, fungibles, imbalance::{Imbalance, OnUnbalanced, SignedImbalance}, @@ -59,10 +59,10 @@ pub use misc::{ AccountTouch, Backing, ConstBool, ConstI128, ConstI16, ConstI32, ConstI64, ConstI8, ConstU128, ConstU16, ConstU32, ConstU64, ConstU8, DefensiveMax, DefensiveMin, DefensiveSaturating, DefensiveTruncateFrom, EnsureInherentsAreFirst, EqualPrivilegeOnly, EstimateCallFee, - ExecuteBlock, ExtrinsicCall, Get, GetBacking, GetDefault, HandleLifetime, IsSubType, IsType, - Len, OffchainWorker, OnKilledAccount, OnNewAccount, PrivilegeCmp, SameOrOther, Time, - TryCollect, TryDrop, TypedGet, UnixTime, VariantCount, VariantCountOf, WrapperKeepOpaque, - WrapperOpaque, + ExecuteBlock, ExtrinsicCall, Get, GetBacking, GetDefault, HandleLifetime, IsInherent, + IsSubType, IsType, Len, OffchainWorker, OnKilledAccount, OnNewAccount, PrivilegeCmp, + SameOrOther, Time, TryCollect, TryDrop, TypedGet, UnixTime, VariantCount, VariantCountOf, + WrapperKeepOpaque, WrapperOpaque, }; #[allow(deprecated)] pub use misc::{PreimageProvider, PreimageRecipient}; @@ -86,7 +86,8 @@ mod hooks; pub use hooks::GenesisBuild; pub use hooks::{ BeforeAllRuntimeMigrations, BuildGenesisConfig, Hooks, IntegrityTest, OnFinalize, OnGenesis, - OnIdle, OnInitialize, OnRuntimeUpgrade, OnTimestampSet, + OnIdle, OnInitialize, OnPoll, OnRuntimeUpgrade, OnTimestampSet, PostInherents, + PostTransactions, PreInherents, UncheckedOnRuntimeUpgrade, }; pub mod schedule; @@ -124,6 +125,8 @@ pub use safe_mode::{SafeMode, SafeModeError, SafeModeNotify}; mod tx_pause; pub use tx_pause::{TransactionPause, TransactionPauseError}; +pub mod dynamic_params; + pub mod tasks; pub use tasks::Task; diff --git a/substrate/frame/support/src/traits/dispatch.rs b/substrate/frame/support/src/traits/dispatch.rs index facc35a77ae09fc325cc4f4292a8776f1c8438ff..7dc8d3e4f5a6e954c5eb726b257f1d2d73a29dc6 100644 --- a/substrate/frame/support/src/traits/dispatch.rs +++ b/substrate/frame/support/src/traits/dispatch.rs @@ -19,11 +19,11 @@ use crate::dispatch::{DispatchResultWithPostInfo, Parameter, RawOrigin}; use codec::MaxEncodedLen; +use core::{cmp::Ordering, marker::PhantomData}; use sp_runtime::{ traits::{BadOrigin, Get, Member, Morph, TryMorph}, Either, }; -use sp_std::{cmp::Ordering, marker::PhantomData}; use super::misc; @@ -85,7 +85,7 @@ pub trait EnsureOrigin { /// ```rust /// # use frame_support::traits::{EnsureOriginEqualOrHigherPrivilege, PrivilegeCmp, EnsureOrigin as _}; /// # use sp_runtime::traits::{parameter_types, Get}; -/// # use sp_std::cmp::Ordering; +/// # use core::cmp::Ordering; /// /// #[derive(Eq, PartialEq, Debug)] /// pub enum Origin { @@ -124,7 +124,7 @@ pub trait EnsureOrigin { /// assert!(EnsureOrigin::ensure_origin(Origin::NormalUser).is_err()); /// ``` pub struct EnsureOriginEqualOrHigherPrivilege( - sp_std::marker::PhantomData<(Origin, PrivilegeCmp)>, + core::marker::PhantomData<(Origin, PrivilegeCmp)>, ); impl EnsureOrigin @@ -218,7 +218,7 @@ macro_rules! impl_ensure_origin_with_arg_ignoring_arg { } /// [`EnsureOrigin`] implementation that always fails. -pub struct NeverEnsureOrigin(sp_std::marker::PhantomData); +pub struct NeverEnsureOrigin(core::marker::PhantomData); impl EnsureOrigin for NeverEnsureOrigin { type Success = Success; fn try_origin(o: OO) -> Result { @@ -235,7 +235,7 @@ impl_ensure_origin_with_arg_ignoring_arg! { {} } -pub struct AsEnsureOriginWithArg(sp_std::marker::PhantomData); +pub struct AsEnsureOriginWithArg(core::marker::PhantomData); impl> EnsureOriginWithArg for AsEnsureOriginWithArg { @@ -353,7 +353,7 @@ impl< /// Origin check will pass if `L` or `R` origin check passes. `L` is tested first. /// /// Successful origin is derived from the left side. -pub struct EitherOfDiverse(sp_std::marker::PhantomData<(L, R)>); +pub struct EitherOfDiverse(core::marker::PhantomData<(L, R)>); impl, R: EnsureOrigin> EnsureOrigin for EitherOfDiverse { @@ -402,7 +402,7 @@ pub type EnsureOneOf = EitherOfDiverse; /// Origin check will pass if `L` or `R` origin check passes. `L` is tested first. /// /// Successful origin is derived from the left side. -pub struct EitherOf(sp_std::marker::PhantomData<(L, R)>); +pub struct EitherOf(core::marker::PhantomData<(L, R)>); impl< OuterOrigin, L: EnsureOrigin, @@ -540,7 +540,7 @@ pub trait OriginTrait: Sized { }) } - /// Extract a reference to the sytsem origin, if that's what the caller is. + /// Extract a reference to the system origin, if that's what the caller is. fn as_system_ref(&self) -> Option<&RawOrigin> { self.caller().as_system_ref() } diff --git a/substrate/frame/support/src/traits/dynamic_params.rs b/substrate/frame/support/src/traits/dynamic_params.rs new file mode 100644 index 0000000000000000000000000000000000000000..32dae6799eaf7c9061851896ada9fe4e8a1a3e0d --- /dev/null +++ b/substrate/frame/support/src/traits/dynamic_params.rs @@ -0,0 +1,153 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Types and traits for dynamic parameters. +//! +//! Can be used by 3rd party macros to define dynamic parameters that are compatible with the the +//! `parameters` pallet. + +use codec::MaxEncodedLen; +use frame_support::Parameter; + +/// A dynamic parameter store across an aggregated KV type. +pub trait RuntimeParameterStore { + type AggregatedKeyValue: AggregatedKeyValue; + + /// Get the value of a parametrized key. + /// + /// Should return `None` if no explicit value was set instead of a default. + fn get(key: K) -> Option + where + KV: AggregatedKeyValue, + K: Key + Into<::Key>, + ::Key: IntoKey< + <::AggregatedKeyValue as AggregatedKeyValue>::Key, + >, + <::AggregatedKeyValue as AggregatedKeyValue>::Value: + TryIntoKey<::Value>, + ::Value: TryInto; +} + +/// A dynamic parameter store across a concrete KV type. +pub trait ParameterStore { + /// Get the value of a parametrized key. + fn get(key: K) -> Option + where + K: Key + Into<::Key>, + ::Value: TryInto; +} + +/// Key of a dynamic parameter. +pub trait Key { + /// The value that the key is parametrized with. + type Value; + + /// An opaque representation of `Self::Value`. + type WrappedValue: Into; +} + +/// The aggregated key-value type of a dynamic parameter store. +pub trait AggregatedKeyValue: Parameter { + /// The aggregated key type. + type Key: Parameter + MaxEncodedLen; + + /// The aggregated value type. + type Value: Parameter + MaxEncodedLen; + + /// Split the aggregated key-value type into its parts. + fn into_parts(self) -> (Self::Key, Option); +} + +impl AggregatedKeyValue for () { + type Key = (); + type Value = (); + + fn into_parts(self) -> (Self::Key, Option) { + ((), None) + } +} + +/// Allows to create a `ParameterStore` from a `RuntimeParameterStore`. +/// +/// This concretization is useful when configuring pallets, since a pallet will require a parameter +/// store for its own KV type and not the aggregated runtime-wide KV type. +pub struct ParameterStoreAdapter(sp_std::marker::PhantomData<(PS, KV)>); + +impl ParameterStore for ParameterStoreAdapter +where + PS: RuntimeParameterStore, + KV: AggregatedKeyValue, + ::Key: + IntoKey<<::AggregatedKeyValue as AggregatedKeyValue>::Key>, + ::Value: TryFromKey< + <::AggregatedKeyValue as AggregatedKeyValue>::Value, + >, +{ + fn get(key: K) -> Option + where + K: Key + Into<::Key>, + ::Value: TryInto, + { + PS::get::(key) + } +} + +// workaround for rust bug https://github.com/rust-lang/rust/issues/51445 +mod workaround { + pub trait FromKey: Sized { + #[must_use] + fn from_key(value: T) -> Self; + } + + pub trait IntoKey: Sized { + #[must_use] + fn into_key(self) -> T; + } + + impl IntoKey for T + where + U: FromKey, + { + fn into_key(self) -> U { + U::from_key(self) + } + } + + pub trait TryIntoKey: Sized { + type Error; + + fn try_into_key(self) -> Result; + } + + pub trait TryFromKey: Sized { + type Error; + + fn try_from_key(value: T) -> Result; + } + + impl TryIntoKey for T + where + U: TryFromKey, + { + type Error = U::Error; + + fn try_into_key(self) -> Result { + U::try_from_key(self) + } + } +} +pub use workaround::*; diff --git a/substrate/frame/support/src/traits/error.rs b/substrate/frame/support/src/traits/error.rs index 0f30e266da2dffebef980088e332b312187081ab..7b577fe9995a4d304c991efe92055c779e71c445 100644 --- a/substrate/frame/support/src/traits/error.rs +++ b/substrate/frame/support/src/traits/error.rs @@ -17,7 +17,7 @@ //! Traits for describing and constraining pallet error types. use codec::{Compact, Decode, Encode}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Trait indicating that the implementing type is going to be included as a field in a variant of /// the `#[pallet::error]` enum type. diff --git a/substrate/frame/support/src/traits/hooks.rs b/substrate/frame/support/src/traits/hooks.rs index 20788ce932d8b397990767c6ae8a0d82016cccbd..ccccc5063286602538c0c46293ffabe8ad01181a 100644 --- a/substrate/frame/support/src/traits/hooks.rs +++ b/substrate/frame/support/src/traits/hooks.rs @@ -25,10 +25,74 @@ use crate::weights::Weight; use impl_trait_for_tuples::impl_for_tuples; use sp_runtime::traits::AtLeast32BitUnsigned; use sp_std::prelude::*; +use sp_weights::WeightMeter; #[cfg(feature = "try-runtime")] use sp_runtime::TryRuntimeError; +/// Provides a callback to execute logic before the all inherents. +pub trait PreInherents { + /// Called before all inherents were applied but after `on_initialize`. + fn pre_inherents() {} +} + +#[cfg_attr(all(not(feature = "tuples-96"), not(feature = "tuples-128")), impl_for_tuples(64))] +#[cfg_attr(all(feature = "tuples-96", not(feature = "tuples-128")), impl_for_tuples(96))] +#[cfg_attr(feature = "tuples-128", impl_for_tuples(128))] +impl PreInherents for Tuple { + fn pre_inherents() { + for_tuples!( #( Tuple::pre_inherents(); )* ); + } +} + +/// Provides a callback to execute logic after the all inherents. +pub trait PostInherents { + /// Called after all inherents were applied. + fn post_inherents() {} +} + +#[cfg_attr(all(not(feature = "tuples-96"), not(feature = "tuples-128")), impl_for_tuples(64))] +#[cfg_attr(all(feature = "tuples-96", not(feature = "tuples-128")), impl_for_tuples(96))] +#[cfg_attr(feature = "tuples-128", impl_for_tuples(128))] +impl PostInherents for Tuple { + fn post_inherents() { + for_tuples!( #( Tuple::post_inherents(); )* ); + } +} + +/// Provides a callback to execute logic before the all transactions. +pub trait PostTransactions { + /// Called after all transactions were applied but before `on_finalize`. + fn post_transactions() {} +} + +#[cfg_attr(all(not(feature = "tuples-96"), not(feature = "tuples-128")), impl_for_tuples(64))] +#[cfg_attr(all(feature = "tuples-96", not(feature = "tuples-128")), impl_for_tuples(96))] +#[cfg_attr(feature = "tuples-128", impl_for_tuples(128))] +impl PostTransactions for Tuple { + fn post_transactions() { + for_tuples!( #( Tuple::post_transactions(); )* ); + } +} + +/// Periodically executes logic. Is not guaranteed to run within a specific timeframe and should +/// only be used on logic that has no deadline. +pub trait OnPoll { + /// Code to execute every now and then at the beginning of the block after inherent application. + /// + /// The remaining weight limit must be respected. + fn on_poll(_n: BlockNumber, _weight: &mut WeightMeter) {} +} + +#[cfg_attr(all(not(feature = "tuples-96"), not(feature = "tuples-128")), impl_for_tuples(64))] +#[cfg_attr(all(feature = "tuples-96", not(feature = "tuples-128")), impl_for_tuples(96))] +#[cfg_attr(feature = "tuples-128", impl_for_tuples(128))] +impl OnPoll for Tuple { + fn on_poll(n: BlockNumber, weight: &mut WeightMeter) { + for_tuples!( #( Tuple::on_poll(n.clone(), weight); )* ); + } +} + /// See [`Hooks::on_initialize`]. pub trait OnInitialize { /// See [`Hooks::on_initialize`]. @@ -90,7 +154,7 @@ impl OnIdle for Tuple { /// /// Implementing this trait for a pallet let's you express operations that should /// happen at genesis. It will be called in an externalities provided environment and -/// will see the genesis state after all pallets have written their genesis state. +/// will set the genesis state after all pallets have written their genesis state. #[cfg_attr(all(not(feature = "tuples-96"), not(feature = "tuples-128")), impl_for_tuples(64))] #[cfg_attr(all(feature = "tuples-96", not(feature = "tuples-128")), impl_for_tuples(96))] #[cfg_attr(feature = "tuples-128", impl_for_tuples(128))] @@ -103,7 +167,7 @@ pub trait OnGenesis { /// /// This hook is intended to be used internally in FRAME and not be exposed to FRAME developers. /// -/// It is defined as a seperate trait from [`OnRuntimeUpgrade`] precisely to not pollute the public +/// It is defined as a separate trait from [`OnRuntimeUpgrade`] precisely to not pollute the public /// API. pub trait BeforeAllRuntimeMigrations { /// Something that should happen before runtime migrations are executed. @@ -163,6 +227,30 @@ pub trait OnRuntimeUpgrade { } } +/// This trait is intended for use within `VersionedMigration` to execute storage migrations without +/// automatic version checks. Implementations should ensure migration logic is safe and idempotent. +pub trait UncheckedOnRuntimeUpgrade { + /// Called within `VersionedMigration` to execute the actual migration. It is also + /// expected that no version checks are performed within this function. + /// + /// See also [`Hooks::on_runtime_upgrade`]. + fn on_runtime_upgrade() -> Weight { + Weight::zero() + } + + /// See [`Hooks::pre_upgrade`]. + #[cfg(feature = "try-runtime")] + fn pre_upgrade() -> Result, TryRuntimeError> { + Ok(Vec::new()) + } + + /// See [`Hooks::post_upgrade`]. + #[cfg(feature = "try-runtime")] + fn post_upgrade(_state: Vec) -> Result<(), TryRuntimeError> { + Ok(()) + } +} + #[cfg_attr(all(not(feature = "tuples-96"), not(feature = "tuples-128")), impl_for_tuples(64))] #[cfg_attr(all(feature = "tuples-96", not(feature = "tuples-128")), impl_for_tuples(96))] #[cfg_attr(feature = "tuples-128", impl_for_tuples(128))] @@ -306,19 +394,23 @@ pub trait IntegrityTest { /// end /// ``` /// -/// * `OnRuntimeUpgrade` is only executed before everything else if a code -/// * `OnRuntimeUpgrade` is mandatorily at the beginning of the block body (extrinsics) being -/// processed. change is detected. -/// * Extrinsics start with inherents, and continue with other signed or unsigned extrinsics. -/// * `OnIdle` optionally comes after extrinsics. -/// `OnFinalize` mandatorily comes after `OnIdle`. +/// * [`OnRuntimeUpgrade`](Hooks::OnRuntimeUpgrade) hooks are only executed when a code change is +/// detected. +/// * [`OnRuntimeUpgrade`](Hooks::OnRuntimeUpgrade) hooks are mandatorily executed at the very +/// beginning of the block body, before any extrinsics are processed. +/// * [`Inherents`](sp_inherents) are always executed before any other other signed or unsigned +/// extrinsics. +/// * [`OnIdle`](Hooks::OnIdle) hooks are executed after extrinsics if there is weight remaining in +/// the block. +/// * [`OnFinalize`](Hooks::OnFinalize) hooks are mandatorily executed after +/// [`OnIdle`](Hooks::OnIdle). /// -/// > `OffchainWorker` is not part of this flow, as it is not really part of the consensus/main -/// > block import path, and is called optionally, and in other circumstances. See -/// > [`crate::traits::misc::OffchainWorker`] for more information. +/// > [`OffchainWorker`](crate::traits::misc::OffchainWorker) hooks are not part of this flow, +/// > because they are not part of the consensus/main block building logic. See +/// > [`OffchainWorker`](crate::traits::misc::OffchainWorker) for more information. /// -/// To learn more about the execution of hooks see `frame-executive` as this component is is charge -/// of dispatching extrinsics and placing the hooks in the correct order. +/// To learn more about the execution of hooks see the FRAME `Executive` pallet which is in charge +/// of dispatching extrinsics and calling hooks in the correct order. pub trait Hooks { /// Block initialization hook. This is called at the very beginning of block execution. /// @@ -370,30 +462,46 @@ pub trait Hooks { Weight::zero() } - /// Hook executed when a code change (aka. a "runtime upgrade") is detected by FRAME. + /// A hook to run logic after inherent application. + /// + /// Is not guaranteed to execute in a block and should therefore only be used in no-deadline + /// scenarios. + fn on_poll(_n: BlockNumber, _weight: &mut WeightMeter) {} + + /// Hook executed when a code change (aka. a "runtime upgrade") is detected by the FRAME + /// `Executive` pallet. /// /// Be aware that this is called before [`Hooks::on_initialize`] of any pallet; therefore, a lot /// of the critical storage items such as `block_number` in system pallet might have not been - /// set. + /// set yet. + /// + /// Similar to [`Hooks::on_initialize`], any code in this block is mandatory and MUST execute. + /// It is strongly recommended to dry-run the execution of these hooks using + /// [try-runtime-cli](https://github.com/paritytech/try-runtime-cli) to ensure they will not + /// produce and overweight block which can brick your chain. Use with care! /// - /// Vert similar to [`Hooks::on_initialize`], any code in this block is mandatory and MUST - /// execute. Use with care. + /// ## Implementation Note: Standalone Migrations /// - /// ## Implementation Note: Versioning + /// Additional migrations can be created by directly implementing [`OnRuntimeUpgrade`] on + /// structs and passing them to `Executive`. Or alternatively, by implementing + /// [`UncheckedOnRuntimeUpgrade`], passing it to [`crate::migrations::VersionedMigration`], + /// which already implements [`OnRuntimeUpgrade`]. /// - /// 1. An implementation of this should typically follow a pattern where the version of the - /// pallet is checked against the onchain version, and a decision is made about what needs to be - /// done. This is helpful to prevent accidental repetitive execution of this hook, which can be - /// catastrophic. + /// ## Implementation Note: Pallet Versioning /// - /// Alternatively, [`frame_support::migrations::VersionedMigration`] can be used to assist with - /// this. + /// Implementations of this hook are typically wrapped in + /// [`crate::migrations::VersionedMigration`] to ensure the migration is executed exactly + /// once and only when it is supposed to. /// - /// ## Implementation Note: Runtime Level Migration + /// Alternatively, developers can manually implement version checks. /// - /// Additional "upgrade hooks" can be created by pallets by a manual implementation of - /// [`Hooks::on_runtime_upgrade`] which can be passed on to `Executive` at the top level - /// runtime. + /// Failure to adequately check storage versions can result in accidental repetitive execution + /// of the hook, which can be catastrophic. + /// + /// ## Implementation Note: Weight + /// + /// Typically, implementations of this method are simple enough that weights can be calculated + /// manually. However, if required, a benchmark can also be used. fn on_runtime_upgrade() -> Weight { Weight::zero() } @@ -403,7 +511,7 @@ pub trait Hooks { /// It should focus on certain checks to ensure that the state is sensible. This is never /// executed in a consensus code-path, therefore it can consume as much weight as it needs. /// - /// This hook should not alter any storage. + /// This hook must not alter any storage. #[cfg(feature = "try-runtime")] fn try_state(_n: BlockNumber) -> Result<(), TryRuntimeError> { Ok(()) @@ -415,7 +523,7 @@ pub trait Hooks { /// which will be passed to `post_upgrade` after upgrading for post-check. An empty vector /// should be returned if there is no such need. /// - /// This hook is never meant to be executed on-chain but is meant to be used by testing tools. + /// This hook is never executed on-chain but instead used by testing tools. #[cfg(feature = "try-runtime")] fn pre_upgrade() -> Result, TryRuntimeError> { Ok(Vec::new()) @@ -434,7 +542,7 @@ pub trait Hooks { } /// Implementing this function on a pallet allows you to perform long-running tasks that are - /// dispatched as separate threads, and entirely independent of the main wasm runtime. + /// dispatched as separate threads, and entirely independent of the main blockchain execution. /// /// This function can freely read from the state, but any change it makes to the state is /// meaningless. Writes can be pushed back to the chain by submitting extrinsics from the diff --git a/substrate/frame/support/src/traits/messages.rs b/substrate/frame/support/src/traits/messages.rs index 995ac4f717911195e4dba202d350c6cbc09ae340..f3d893bcc1d899fce06ef00a38d687bfb3ea0181 100644 --- a/substrate/frame/support/src/traits/messages.rs +++ b/substrate/frame/support/src/traits/messages.rs @@ -123,6 +123,8 @@ impl ServiceQueues for NoopServiceQueues { pub struct QueueFootprint { /// The number of pages in the queue (including overweight pages). pub pages: u32, + /// The number of pages that are ready (not yet processed and also not overweight). + pub ready_pages: u32, /// The storage footprint of the queue (including overweight messages). pub storage: Footprint, } diff --git a/substrate/frame/support/src/traits/metadata.rs b/substrate/frame/support/src/traits/metadata.rs index 586af20511a89f82caf33297177a12f6d0988bf4..8bda4186bc967b29a6342ea96dd0a1cdc5072438 100644 --- a/substrate/frame/support/src/traits/metadata.rs +++ b/substrate/frame/support/src/traits/metadata.rs @@ -261,41 +261,64 @@ impl Add for StorageVersion { } } -/// Special marker struct if no storage version is set for a pallet. +/// Special marker struct used when [`storage_version`](crate::pallet_macros::storage_version) is +/// not defined for a pallet. /// /// If you (the reader) end up here, it probably means that you tried to compare /// [`GetStorageVersion::on_chain_storage_version`] against -/// [`GetStorageVersion::current_storage_version`]. This basically means that the -/// [`storage_version`](crate::pallet_macros::storage_version) is missing in the pallet where the -/// mentioned functions are being called. +/// [`GetStorageVersion::in_code_storage_version`]. This basically means that the +/// [`storage_version`](crate::pallet_macros::storage_version) is missing from the pallet where the +/// mentioned functions are being called, and needs to be defined. #[derive(Debug, Default)] pub struct NoStorageVersionSet; -/// Provides information about the storage version of a pallet. +/// Provides information about a pallet's storage versions. /// -/// It differentiates between current and on-chain storage version. Both should be only out of sync -/// when a new runtime upgrade was applied and the runtime migrations did not yet executed. -/// Otherwise it means that the pallet works with an unsupported storage version and unforeseen -/// stuff can happen. +/// Every pallet has two storage versions: +/// 1. An in-code storage version +/// 2. An on-chain storage version /// -/// The current storage version is the version of the pallet as supported at runtime. The active -/// storage version is the version of the pallet in the storage. +/// The in-code storage version is the version of the pallet as defined in the runtime blob, and the +/// on-chain storage version is the version of the pallet stored on-chain. /// -/// It is required to update the on-chain storage version manually when a migration was applied. +/// Storage versions should be only ever be out of sync when a pallet has been updated to a new +/// version and the in-code version is incremented, but the migration has not yet been executed +/// on-chain as part of a runtime upgrade. +/// +/// It is the responsibility of the developer to ensure that the on-chain storage version is set +/// correctly during a migration so that it matches the in-code storage version. pub trait GetStorageVersion { - /// This will be filled out by the [`pallet`](crate::pallet) macro. + /// This type is generated by the [`pallet`](crate::pallet) macro. + /// + /// If the [`storage_version`](crate::pallet_macros::storage_version) attribute isn't specified, + /// this is set to [`NoStorageVersionSet`] to signify that it is missing. + /// + /// If the [`storage_version`](crate::pallet_macros::storage_version) attribute is specified, + /// this is be set to a [`StorageVersion`] corresponding to the attribute. /// - /// If the [`storage_version`](crate::pallet_macros::storage_version) attribute isn't given - /// this is set to [`NoStorageVersionSet`] to inform the user that the attribute is missing. - /// This should prevent that the user forgets to set a storage version when required. However, - /// this will only work when the user actually tries to call [`Self::current_storage_version`] - /// to compare it against the [`Self::on_chain_storage_version`]. If the attribute is given, - /// this will be set to [`StorageVersion`]. - type CurrentStorageVersion; - - /// Returns the current storage version as supported by the pallet. - fn current_storage_version() -> Self::CurrentStorageVersion; - /// Returns the on-chain storage version of the pallet as stored in the storage. + /// The intention of using [`NoStorageVersionSet`] instead of defaulting to a [`StorageVersion`] + /// of zero is to prevent developers from forgetting to set + /// [`storage_version`](crate::pallet_macros::storage_version) when it is required, like in the + /// case that they wish to compare the in-code storage version to the on-chain storage version. + type InCodeStorageVersion; + + #[deprecated( + note = "This method has been renamed to `in_code_storage_version` and will be removed after March 2024." + )] + /// DEPRECATED: Use [`Self::current_storage_version`] instead. + /// + /// Returns the in-code storage version as specified in the + /// [`storage_version`](crate::pallet_macros::storage_version) attribute, or + /// [`NoStorageVersionSet`] if the attribute is missing. + fn current_storage_version() -> Self::InCodeStorageVersion { + Self::in_code_storage_version() + } + + /// Returns the in-code storage version as specified in the + /// [`storage_version`](crate::pallet_macros::storage_version) attribute, or + /// [`NoStorageVersionSet`] if the attribute is missing. + fn in_code_storage_version() -> Self::InCodeStorageVersion; + /// Returns the storage version of the pallet as last set in the actual on-chain storage. fn on_chain_storage_version() -> StorageVersion; } diff --git a/substrate/frame/support/src/traits/misc.rs b/substrate/frame/support/src/traits/misc.rs index eafd9c8abdd2dfc4b4174723678d94aa963ad738..bc7407a7be6248f25866a78f3b95bb0107ff19ae 100644 --- a/substrate/frame/support/src/traits/misc.rs +++ b/substrate/frame/support/src/traits/misc.rs @@ -23,6 +23,7 @@ use impl_trait_for_tuples::impl_for_tuples; use scale_info::{build::Fields, meta_type, Path, Type, TypeInfo, TypeParameter}; use sp_arithmetic::traits::{CheckedAdd, CheckedMul, CheckedSub, One, Saturating}; use sp_core::bounded::bounded_vec::TruncateFrom; + #[doc(hidden)] pub use sp_runtime::traits::{ ConstBool, ConstI128, ConstI16, ConstI32, ConstI64, ConstI8, ConstU128, ConstU16, ConstU32, @@ -895,11 +896,21 @@ pub trait GetBacking { /// A trait to ensure the inherent are before non-inherent in a block. /// /// This is typically implemented on runtime, through `construct_runtime!`. -pub trait EnsureInherentsAreFirst { +pub trait EnsureInherentsAreFirst: + IsInherent<::Extrinsic> +{ /// Ensure the position of inherent is correct, i.e. they are before non-inherents. /// - /// On error return the index of the inherent with invalid position (counting from 0). - fn ensure_inherents_are_first(block: &Block) -> Result<(), u32>; + /// On error return the index of the inherent with invalid position (counting from 0). On + /// success it returns the index of the last inherent. `0` therefore means that there are no + /// inherents. + fn ensure_inherents_are_first(block: &Block) -> Result; +} + +/// A trait to check if an extrinsic is an inherent. +pub trait IsInherent { + /// Whether this extrinsic is an inherent. + fn is_inherent(ext: &Extrinsic) -> bool; } /// An extrinsic on which we can get access to call. @@ -1413,7 +1424,7 @@ mod test { assert_eq!(>::max_encoded_len(), 2usize.pow(14) + 4); let data = 4u64; - // Ensure that we check that the `Vec` is consumed completly on decode. + // Ensure that we check that the `Vec` is consumed completely on decode. assert!(WrapperOpaque::::decode(&mut &data.encode().encode()[..]).is_err()); } diff --git a/substrate/frame/support/src/traits/schedule.rs b/substrate/frame/support/src/traits/schedule.rs index 7a7d1357da1e7dba9588866d07d734f2a8fedda8..f41c73fe69a8883d8d2ee8bb7ffcdf72bc2e5ba2 100644 --- a/substrate/frame/support/src/traits/schedule.rs +++ b/substrate/frame/support/src/traits/schedule.rs @@ -130,7 +130,7 @@ impl MaybeHashed { } } -// TODO: deprecate +#[deprecated(note = "Use `v3` instead. Will be removed after September 2024.")] pub mod v1 { use super::*; @@ -218,10 +218,12 @@ pub mod v1 { fn next_dispatch_time(id: Vec) -> Result; } + #[allow(deprecated)] impl Anon for T where T: v2::Anon, { + #[allow(deprecated)] type Address = T::Address; fn schedule( @@ -232,10 +234,13 @@ pub mod v1 { call: Call, ) -> Result { let c = MaybeHashed::::Value(call); + + #[allow(deprecated)] T::schedule(when, maybe_periodic, priority, origin, c) } fn cancel(address: Self::Address) -> Result<(), ()> { + #[allow(deprecated)] T::cancel(address) } @@ -243,18 +248,22 @@ pub mod v1 { address: Self::Address, when: DispatchTime, ) -> Result { + #[allow(deprecated)] T::reschedule(address, when) } fn next_dispatch_time(address: Self::Address) -> Result { + #[allow(deprecated)] T::next_dispatch_time(address) } } + #[allow(deprecated)] impl Named for T where T: v2::Named, { + #[allow(deprecated)] type Address = T::Address; fn schedule_named( @@ -266,10 +275,12 @@ pub mod v1 { call: Call, ) -> Result { let c = MaybeHashed::::Value(call); + #[allow(deprecated)] T::schedule_named(id, when, maybe_periodic, priority, origin, c) } fn cancel_named(id: Vec) -> Result<(), ()> { + #[allow(deprecated)] T::cancel_named(id) } @@ -277,16 +288,18 @@ pub mod v1 { id: Vec, when: DispatchTime, ) -> Result { + #[allow(deprecated)] T::reschedule_named(id, when) } fn next_dispatch_time(id: Vec) -> Result { + #[allow(deprecated)] T::next_dispatch_time(id) } } } -// TODO: deprecate +#[deprecated(note = "Use `v3` instead. Will be removed after September 2024.")] pub mod v2 { use super::*; @@ -478,4 +491,5 @@ pub mod v3 { } } +#[allow(deprecated)] pub use v1::*; diff --git a/substrate/frame/support/src/traits/stored_map.rs b/substrate/frame/support/src/traits/stored_map.rs index cbe70f29323491179d945027bfccaaf5cb880671..15df2ef0af55d49c28d271aef10f4ae018163f11 100644 --- a/substrate/frame/support/src/traits/stored_map.rs +++ b/substrate/frame/support/src/traits/stored_map.rs @@ -81,7 +81,7 @@ pub trait StoredMap { /// be the default value), or where the account is being removed or reset back to the default value /// where previously it did exist (though may have been in a default state). This works well with /// system module's `CallOnCreatedAccount` and `CallKillAccount`. -pub struct StorageMapShim(sp_std::marker::PhantomData<(S, K, T)>); +pub struct StorageMapShim(core::marker::PhantomData<(S, K, T)>); impl, K: FullCodec, T: FullCodec + Default> StoredMap for StorageMapShim { diff --git a/substrate/frame/support/src/traits/tokens/currency.rs b/substrate/frame/support/src/traits/tokens/currency.rs index 0030e1261dac1be87f572b1ee26220b2992798cd..b3db4c98001d900522b33c6a25e3e9b9119c3ea5 100644 --- a/substrate/frame/support/src/traits/tokens/currency.rs +++ b/substrate/frame/support/src/traits/tokens/currency.rs @@ -16,6 +16,9 @@ // limitations under the License. //! The Currency trait and associated types. +//! +//! Note Currency and related traits are deprecated, instead +//! [`fungible`](frame_support::traits::fungible) traits should be used. use super::{ imbalance::{Imbalance, SignedImbalance}, @@ -27,7 +30,7 @@ use sp_runtime::{traits::MaybeSerializeDeserialize, DispatchError}; mod reservable; pub use reservable::{NamedReservableCurrency, ReservableCurrency}; mod lockable; -pub use lockable::{LockIdentifier, LockableCurrency, VestingSchedule}; +pub use lockable::{InspectLockableCurrency, LockIdentifier, LockableCurrency, VestingSchedule}; /// Abstraction over a fungible assets system. pub trait Currency { @@ -211,7 +214,7 @@ pub trait Currency { /// A non-const `Get` implementation parameterised by a `Currency` impl which provides the result /// of `total_issuance`. -pub struct TotalIssuanceOf, A>(sp_std::marker::PhantomData<(C, A)>); +pub struct TotalIssuanceOf, A>(core::marker::PhantomData<(C, A)>); impl, A> Get for TotalIssuanceOf { fn get() -> C::Balance { C::total_issuance() @@ -220,7 +223,7 @@ impl, A> Get for TotalIssuanceOf { /// A non-const `Get` implementation parameterised by a `Currency` impl which provides the result /// of `active_issuance`. -pub struct ActiveIssuanceOf, A>(sp_std::marker::PhantomData<(C, A)>); +pub struct ActiveIssuanceOf, A>(core::marker::PhantomData<(C, A)>); impl, A> Get for ActiveIssuanceOf { fn get() -> C::Balance { C::active_issuance() diff --git a/substrate/frame/support/src/traits/tokens/currency/lockable.rs b/substrate/frame/support/src/traits/tokens/currency/lockable.rs index 955814f5aa9de3e8767cc9632e6a23802ed0e94f..51a48dd15ce85c8f41393164f42ca347d0114d1d 100644 --- a/substrate/frame/support/src/traits/tokens/currency/lockable.rs +++ b/substrate/frame/support/src/traits/tokens/currency/lockable.rs @@ -64,6 +64,12 @@ pub trait LockableCurrency: Currency { fn remove_lock(id: LockIdentifier, who: &AccountId); } +/// A inspect interface for a currency whose accounts can have liquidity restrictions. +pub trait InspectLockableCurrency: LockableCurrency { + /// Amount of funds locked for `who` associated with `id`. + fn balance_locked(id: LockIdentifier, who: &AccountId) -> Self::Balance; +} + /// A vesting schedule over a currency. This allows a particular currency to have vesting limits /// applied to it. pub trait VestingSchedule { diff --git a/substrate/frame/support/src/traits/tokens/fungible/conformance_tests/regular/unbalanced.rs b/substrate/frame/support/src/traits/tokens/fungible/conformance_tests/regular/unbalanced.rs index e7fcc15472e05b0600f5bfda2f6a1d524a8afbc3..a522073689879385941cfaeebe25675d3b253127 100644 --- a/substrate/frame/support/src/traits/tokens/fungible/conformance_tests/regular/unbalanced.rs +++ b/substrate/frame/support/src/traits/tokens/fungible/conformance_tests/regular/unbalanced.rs @@ -94,7 +94,7 @@ where ); assert_eq!(T::balance(&account_0), account_0_initial_balance - amount); - // Decreasing the balance below funds avalibale should fail when Precision::Exact + // Decreasing the balance below funds available should fail when Precision::Exact let balance_before = T::balance(&account_0); assert_eq!( T::decrease_balance( diff --git a/substrate/frame/support/src/traits/tokens/fungible/freeze.rs b/substrate/frame/support/src/traits/tokens/fungible/freeze.rs index 8b542ee4c6060e143ee58902a38e39cca38b109b..96efbc6ab89e154a57d88d75c65ab8c330af41eb 100644 --- a/substrate/frame/support/src/traits/tokens/fungible/freeze.rs +++ b/substrate/frame/support/src/traits/tokens/fungible/freeze.rs @@ -16,6 +16,9 @@ // limitations under the License. //! The traits for putting freezes within a single fungible token class. +//! +//! See the [`crate::traits::fungible`] doc for more information about fungible traits +//! including the place of the Freezes in FRAME. use scale_info::TypeInfo; use sp_arithmetic::{ @@ -35,7 +38,7 @@ pub trait Inspect: super::Inspect { /// An identifier for a freeze. type Id: codec::Encode + TypeInfo + 'static; - /// Amount of funds held in reserve by `who` for the given `id`. + /// Amount of funds frozen in reserve by `who` for the given `id`. fn balance_frozen(id: &Self::Id, who: &AccountId) -> Self::Balance; /// The amount of the balance which can become frozen. Defaults to `total_balance()`. @@ -45,11 +48,11 @@ pub trait Inspect: super::Inspect { /// Returns `true` if it's possible to introduce a freeze for the given `id` onto the /// account of `who`. This will be true as long as the implementor supports as many - /// concurrent freeze locks as there are possible values of `id`. + /// concurrent freezes as there are possible values of `id`. fn can_freeze(id: &Self::Id, who: &AccountId) -> bool; } -/// Trait for introducing, altering and removing locks to freeze an account's funds so they never +/// Trait for introducing, altering and removing freezes for an account for its funds never /// go below a set minimum. pub trait Mutate: Inspect { /// Prevent actions which would reduce the balance of the account of `who` below the given @@ -66,16 +69,16 @@ pub trait Mutate: Inspect { /// counteract any pre-existing freezes in place for `who` under the `id`. Also unlike /// `set_freeze`, in the case that `amount` is zero, this is no-op and never fails. /// - /// Note that more funds can be locked than the total balance, if desired. + /// Note that more funds can be frozen than the total balance, if desired. fn extend_freeze(id: &Self::Id, who: &AccountId, amount: Self::Balance) -> DispatchResult; - /// Remove an existing lock. + /// Remove an existing freeze. fn thaw(id: &Self::Id, who: &AccountId) -> DispatchResult; /// Attempt to alter the amount frozen under the given `id` to `amount`. /// /// Fail if the account of `who` has fewer freezable funds than `amount`, unless `fortitude` is - /// `Fortitude::Force`. + /// [`Fortitude::Force`]. fn set_frozen( id: &Self::Id, who: &AccountId, @@ -91,7 +94,7 @@ pub trait Mutate: Inspect { /// the amount frozen under `id`. Do nothing otherwise. /// /// Fail if the account of `who` has fewer freezable funds than `amount`, unless `fortitude` is - /// `Fortitude::Force`. + /// [`Fortitude::Force`]. fn ensure_frozen( id: &Self::Id, who: &AccountId, diff --git a/substrate/frame/support/src/traits/tokens/fungible/hold.rs b/substrate/frame/support/src/traits/tokens/fungible/hold.rs index 6da652d2998dfc18dd7da5754da7faf22abab839..28ece25c91d427146354e3ad91257e01cd9c4cb5 100644 --- a/substrate/frame/support/src/traits/tokens/fungible/hold.rs +++ b/substrate/frame/support/src/traits/tokens/fungible/hold.rs @@ -16,6 +16,9 @@ // limitations under the License. //! The traits for putting holds within a single fungible token class. +//! +//! See the [`crate::traits::fungible`] doc for more information about fungible traits +//! including the place of the Holds in FRAME. use crate::{ ensure, @@ -214,8 +217,8 @@ pub trait Mutate: /// /// The actual amount released is returned with `Ok`. /// - /// If `precision` is `BestEffort`, then the amount actually unreserved and returned as the - /// inner value of `Ok` may be smaller than the `amount` passed. + /// If `precision` is [`Precision::BestEffort`], then the amount actually unreserved and + /// returned as the inner value of `Ok` may be smaller than the `amount` passed. /// /// NOTE! The inner of the `Ok` result variant returns the *actual* amount released. This is the /// opposite of the `ReservableCurrency::unreserve()` result, which gives the amount not able diff --git a/substrate/frame/support/src/traits/tokens/fungible/imbalance.rs b/substrate/frame/support/src/traits/tokens/fungible/imbalance.rs index 0e25102197007e7ce3f38eef7417425f09dbcd2f..020dffe28c85b7a0f1bb213173342e4dd9e907d7 100644 --- a/substrate/frame/support/src/traits/tokens/fungible/imbalance.rs +++ b/substrate/frame/support/src/traits/tokens/fungible/imbalance.rs @@ -17,6 +17,8 @@ //! The imbalance type and its associates, which handles keeps everything adding up properly with //! unbalanced operations. +//! +//! See the [`crate::traits::fungible`] doc for more information about fungible traits. use super::{super::Imbalance as ImbalanceT, Balanced, *}; use crate::traits::{ diff --git a/substrate/frame/support/src/traits/tokens/fungible/item_of.rs b/substrate/frame/support/src/traits/tokens/fungible/item_of.rs index 37749d396009d8a11629d3c1f94c6ce5efbe6f21..5374cc52bab72a25270606e89f97a6f035f3a704 100644 --- a/substrate/frame/support/src/traits/tokens/fungible/item_of.rs +++ b/substrate/frame/support/src/traits/tokens/fungible/item_of.rs @@ -16,6 +16,11 @@ // limitations under the License. //! Adapter to use `fungibles::*` implementations as `fungible::*`. +//! +//! This allows for a `fungibles` asset, e.g. from the `pallet_assets` pallet, to be used when a +//! `fungible` asset is expected. +//! +//! See the [`crate::traits::fungible`] doc for more information about fungible traits. use super::*; use crate::traits::{ diff --git a/substrate/frame/support/src/traits/tokens/fungible/mod.rs b/substrate/frame/support/src/traits/tokens/fungible/mod.rs index ba4a2e5e21a2c9f5115ca6331e85df0fea58bb74..01c3b9dfe46a562ec5c0692fd51ecc0e53f83872 100644 --- a/substrate/frame/support/src/traits/tokens/fungible/mod.rs +++ b/substrate/frame/support/src/traits/tokens/fungible/mod.rs @@ -17,26 +17,135 @@ //! The traits for dealing with a single fungible token class and any associated types. //! -//! ### User-implememted traits -//! - `Inspect`: Regular balance inspector functions. -//! - `Unbalanced`: Low-level balance mutating functions. Does not guarantee proper book-keeping and -//! so should not be called into directly from application code. Other traits depend on this and -//! provide default implementations based on it. -//! - `UnbalancedHold`: Low-level balance mutating functions for balances placed on hold. Does not +//! Also see the [`frame_tokens`] reference docs for more information about the place of +//! `fungible` traits in Substrate. +//! +//! # Available Traits +//! - [`Inspect`]: Regular balance inspector functions. +//! - [`Unbalanced`]: Low-level balance mutating functions. Does not guarantee proper book-keeping +//! and so should not be called into directly from application code. Other traits depend on this +//! and provide default implementations based on it. +//! - [`UnbalancedHold`]: Low-level balance mutating functions for balances placed on hold. Does not //! guarantee proper book-keeping and so should not be called into directly from application code. //! Other traits depend on this and provide default implementations based on it. -//! - `Mutate`: Regular balance mutator functions. Pre-implemented using `Unbalanced`, though the -//! `done_*` functions should likely be reimplemented in case you want to do something following -//! the operation such as emit events. -//! - `InspectHold`: Inspector functions for balances on hold. -//! - `MutateHold`: Mutator functions for balances on hold. Mostly pre-implemented using -//! `UnbalancedHold`. -//! - `InspectFreeze`: Inspector functions for frozen balance. -//! - `MutateFreeze`: Mutator functions for frozen balance. -//! - `Balanced`: One-sided mutator functions for regular balances, which return imbalance objects +//! - [`Mutate`]: Regular balance mutator functions. Pre-implemented using [`Unbalanced`], though +//! the `done_*` functions should likely be reimplemented in case you want to do something +//! following the operation such as emit events. +//! - [`InspectHold`]: Inspector functions for balances on hold. +//! - [`MutateHold`]: Mutator functions for balances on hold. Mostly pre-implemented using +//! [`UnbalancedHold`]. +//! - [`InspectFreeze`]: Inspector functions for frozen balance. +//! - [`MutateFreeze`]: Mutator functions for frozen balance. +//! - [`Balanced`]: One-sided mutator functions for regular balances, which return imbalance objects //! which guarantee eventual book-keeping. May be useful for some sophisticated operations where //! funds must be removed from an account before it is known precisely what should be done with //! them. +//! +//! ## Terminology +//! +//! - **Total Issuance**: The total number of units in existence in a system. +//! +//! - **Total Balance**: The sum of an account's free and held balances. +//! +//! - **Free Balance**: A portion of an account's total balance that is not held. Note this is +//! distinct from the Spendable Balance, which represents how much Balance the user can actually +//! transfer. +//! +//! - **Held Balance**: Held balance still belongs to the account holder, but is suspended. It can +//! be slashed, but only after all the free balance has been slashed. +//! +//! Multiple holds stack rather than overlay. This means that if an account has +//! 3 holds for 100 units, the account can spend its funds for any reason down to 300 units, at +//! which point the holds will start to come into play. +//! +//! - **Frozen Balance**: A freeze on a specified amount of an account's free balance until a +//! specified block number. +//! +//! Multiple freezes always operate over the same funds, so they "overlay" rather than +//! "stack". This means that if an account has 3 freezes for 100 units, the account can spend its +//! funds for any reason down to 100 units, at which point the freezes will start to come into +//! play. +//! +//! - **Minimum Balance (a.k.a. Existential Deposit, a.k.a. ED)**: The minimum balance required to +//! create or keep an account open. This is to prevent "dust accounts" from filling storage. When +//! the free plus the held balance (i.e. the total balance) falls below this, then the account is +//! said to be dead. It loses its functionality as well as any prior history and all information +//! on it is removed from the chain's state. No account should ever have a total balance that is +//! strictly between 0 and the existential deposit (exclusive). If this ever happens, it indicates +//! either a bug in the implementation of this trait or an erroneous raw mutation of storage. +//! +//! - **Untouchable Balance**: The part of a user's free balance they cannot spend, due to ED or +//! Freeze(s). +//! +//! - **Spendable Balance**: The part of a user's free balance they can actually transfer, after +//! accounting for Holds and Freezes. +//! +//! - **Imbalance**: A condition when some funds were credited or debited without equal and opposite +//! accounting (i.e. a difference between total issuance and account balances). Functions that +//! result in an imbalance will return an object of the [`imbalance::Credit`] or +//! [`imbalance::Debt`] traits that can be managed within your runtime logic. +//! +//! If an imbalance is simply dropped, it should automatically maintain any book-keeping such as +//! total issuance. +//! +//! ## Visualising Balance Components Together 💫 +//! +//! ```ignore +//! |__total__________________________________| +//! |__on_hold__|_____________free____________| +//! |__________frozen___________| +//! |__on_hold__|__ed__| +//! |__untouchable__|__spendable__| +//! ``` +//! +//! ## Holds and Freezes +//! +//! Both holds and freezes are used to prevent an account from using some of its balance. +//! +//! The primary distinction between the two are that: +//! - Holds are cumulative (do not overlap) and are distinct from the free balance +//! - Freezes are not cumulative, and can overlap with each other or with holds +//! +//! ```ignore +//! |__total_____________________________| +//! |__hold_a__|__hold_b__|_____free_____| +//! |__on_hold____________| // <- the sum of all holds +//! |__freeze_a_______________| +//! |__freeze_b____| +//! |__freeze_c________| +//! |__frozen_________________| // <- the max of all freezes +//! ``` +//! +//! Holds are designed to be infallibly slashed, meaning that any logic using a `Freeze` +//! must handle the possibility of the frozen amount being reduced, potentially to zero. A +//! permissionless function should be provided in order to allow bookkeeping to be updated in this +//! instance. E.g. some balance is frozen when it is used for voting, one could use held balance for +//! voting, but nothing prevents this frozen balance from being reduced if the overlapping hold is +//! slashed. +//! +//! Every Hold and Freeze is accompanied by a unique `Reason`, making it clear for each instance +//! what the originating pallet and purpose is. These reasons are amalgomated into a single enum +//! `RuntimeHoldReason` and `RuntimeFreezeReason` respectively, when the runtime is compiled. +//! +//! Note that `Hold` and `Freeze` reasons should remain in your runtime for as long as storage +//! could exist in your runtime with those reasons, otherwise your runtime state could become +//! undecodable. +//! +//! ### Should I use a Hold or Freeze? +//! +//! If you require a balance to be infaillibly slashed, then you should use Holds. +//! +//! If you require setting a minimum account balance amount, then you should use a Freezes. Note +//! Freezes do not carry the same guarantees as Holds. Although the account cannot voluntarily +//! reduce their balance below the largest freeze, if Holds on the account are slashed then the +//! balance could drop below the freeze amount. +//! +//! ## Sets of Tokens +//! +//! For managing sets of tokens, see the [`fungibles`](`frame_support::traits::fungibles`) trait +//! which is a wrapper around this trait but supporting multiple asset instances. +//! +//! [`frame_tokens`]: ../../../../polkadot_sdk_docs/reference_docs/frame_tokens/index.html pub mod conformance_tests; pub mod freeze; diff --git a/substrate/frame/support/src/traits/tokens/fungible/regular.rs b/substrate/frame/support/src/traits/tokens/fungible/regular.rs index 0157b08bd137b2813236f34e193799cf8267b88a..4ed31dcf9fb1f099ebc576ae981d289613775b60 100644 --- a/substrate/frame/support/src/traits/tokens/fungible/regular.rs +++ b/substrate/frame/support/src/traits/tokens/fungible/regular.rs @@ -16,6 +16,8 @@ // limitations under the License. //! `Inspect` and `Mutate` traits for working with regular balances. +//! +//! See the [`crate::traits::fungible`] doc for more information about fungible traits. use crate::{ ensure, diff --git a/substrate/frame/support/src/traits/tokens/fungible/union_of.rs b/substrate/frame/support/src/traits/tokens/fungible/union_of.rs index 33711d7a16cc6e7fe40eb619f5b4aba4703163df..575b771a614480147d5afe878dc71652d278bb67 100644 --- a/substrate/frame/support/src/traits/tokens/fungible/union_of.rs +++ b/substrate/frame/support/src/traits/tokens/fungible/union_of.rs @@ -17,6 +17,8 @@ //! Types to combine some `fungible::*` and `fungibles::*` implementations into one union //! `fungibles::*` implementation. +//! +//! See the [`crate::traits::fungible`] doc for more information about fungible traits. use codec::{Decode, Encode, MaxEncodedLen}; use frame_support::traits::{ diff --git a/substrate/frame/support/src/traits/tokens/fungibles/approvals.rs b/substrate/frame/support/src/traits/tokens/fungibles/approvals.rs index 7a80279b01981420840811e550c92c106a682bef..09e3d20756a2fbb3e1dd8c08b17b38c44f82c28c 100644 --- a/substrate/frame/support/src/traits/tokens/fungibles/approvals.rs +++ b/substrate/frame/support/src/traits/tokens/fungibles/approvals.rs @@ -16,6 +16,8 @@ // limitations under the License. //! Inspect and Mutate traits for Asset approvals +//! +//! See the [`crate::traits::fungibles`] doc for more information about fungibles traits. use crate::dispatch::DispatchResult; pub trait Inspect: super::Inspect { diff --git a/substrate/frame/support/src/traits/tokens/fungibles/enumerable.rs b/substrate/frame/support/src/traits/tokens/fungibles/enumerable.rs index 08bb784a7dbf63fd39c51f0468cfe42cbcb16248..81dbb93b0b8d63fafcbd80ab64ad3aec53c40bab 100644 --- a/substrate/frame/support/src/traits/tokens/fungibles/enumerable.rs +++ b/substrate/frame/support/src/traits/tokens/fungibles/enumerable.rs @@ -15,6 +15,10 @@ // See the License for the specific language governing permissions and // limitations under the License. +//! Contains an interface for enumerating assets in existence or owned by a given account. +//! +//! See the [`crate::traits::fungibles`] doc for more information about fungibles traits. + /// Interface for enumerating assets in existence or owned by a given account. pub trait Inspect: super::Inspect { type AssetsIterator; diff --git a/substrate/frame/support/src/traits/tokens/fungibles/freeze.rs b/substrate/frame/support/src/traits/tokens/fungibles/freeze.rs index b07d20d6c41ce48c3f4face0ea4a213a3023f5e3..244f700589945d97d1d5ed2abc8326bded127d73 100644 --- a/substrate/frame/support/src/traits/tokens/fungibles/freeze.rs +++ b/substrate/frame/support/src/traits/tokens/fungibles/freeze.rs @@ -16,6 +16,8 @@ // limitations under the License. //! The traits for putting freezes within a single fungible token class. +//! +//! See the [`crate::traits::fungibles`] doc for more information about fungibles traits. use crate::{ensure, traits::tokens::Fortitude}; use scale_info::TypeInfo; diff --git a/substrate/frame/support/src/traits/tokens/fungibles/hold.rs b/substrate/frame/support/src/traits/tokens/fungibles/hold.rs index 1efd1594213c1a80eeccdd4fdf0c9f01c812794c..ef3fef7a300d96b5c741983fd0b19297b44f541c 100644 --- a/substrate/frame/support/src/traits/tokens/fungibles/hold.rs +++ b/substrate/frame/support/src/traits/tokens/fungibles/hold.rs @@ -16,6 +16,8 @@ // limitations under the License. //! The traits for putting holds within a single fungible token class. +//! +//! See the [`crate::traits::fungibles`] doc for more information about fungibles traits. use crate::{ ensure, diff --git a/substrate/frame/support/src/traits/tokens/fungibles/imbalance.rs b/substrate/frame/support/src/traits/tokens/fungibles/imbalance.rs index 54c1e900b6e3664b6fbf3470e41d17eaae37e635..bb0d83721a481e11f80f1ae9fa75292528f7c8a0 100644 --- a/substrate/frame/support/src/traits/tokens/fungibles/imbalance.rs +++ b/substrate/frame/support/src/traits/tokens/fungibles/imbalance.rs @@ -17,6 +17,8 @@ //! The imbalance type and its associates, which handles keeps everything adding up properly with //! unbalanced operations. +//! +//! See the [`crate::traits::fungibles`] doc for more information about fungibles traits. use super::*; use crate::traits::{ diff --git a/substrate/frame/support/src/traits/tokens/fungibles/lifetime.rs b/substrate/frame/support/src/traits/tokens/fungibles/lifetime.rs index 0e195a52318b7ddb34aef57e3d8742cd36952e06..49f6c846ccdd54adeceb668bb10a8cb2ca11281f 100644 --- a/substrate/frame/support/src/traits/tokens/fungibles/lifetime.rs +++ b/substrate/frame/support/src/traits/tokens/fungibles/lifetime.rs @@ -16,6 +16,8 @@ // limitations under the License. //! Traits for creating and destroying assets. +//! +//! See the [`crate::traits::fungibles`] doc for more information about fungibles traits. use sp_runtime::{DispatchError, DispatchResult}; diff --git a/substrate/frame/support/src/traits/tokens/fungibles/metadata.rs b/substrate/frame/support/src/traits/tokens/fungibles/metadata.rs index ab310119e58467da21dc9f68c84ad8dd173e8f43..ab722426dadf6fa759340ac12609e58c1139ff02 100644 --- a/substrate/frame/support/src/traits/tokens/fungibles/metadata.rs +++ b/substrate/frame/support/src/traits/tokens/fungibles/metadata.rs @@ -16,6 +16,8 @@ // limitations under the License. //! Inspect and Mutate traits for Asset metadata +//! +//! See the [`crate::traits::fungibles`] doc for more information about fungibles traits. use crate::dispatch::DispatchResult; use sp_std::vec::Vec; diff --git a/substrate/frame/support/src/traits/tokens/fungibles/mod.rs b/substrate/frame/support/src/traits/tokens/fungibles/mod.rs index 1db0706ba4fde4c3b53dbcdd5ea850a37752b1e9..2122fdeaed3f28b937fa16a2230fa0f9a56d869a 100644 --- a/substrate/frame/support/src/traits/tokens/fungibles/mod.rs +++ b/substrate/frame/support/src/traits/tokens/fungibles/mod.rs @@ -15,7 +15,16 @@ // See the License for the specific language governing permissions and // limitations under the License. -//! The traits for sets of fungible tokens and any associated types. +//! The traits for *sets* of [`fungible`](`frame_support::traits::fungible`) tokens and any +//! associated types. +//! +//! Individual tokens in the `fungibles` set may be used when a `fungible` trait is expected using +//! [`crate::traits::tokens::fungible::ItemOf`]. +//! +//! Also see the [`frame_tokens`] reference docs for more information about the place of +//! `fungible` traits in Substrate. +//! +//! [`frame_tokens`]: ../../../../polkadot_sdk_docs/reference_docs/frame_tokens/index.html pub mod approvals; mod enumerable; diff --git a/substrate/frame/support/src/traits/tokens/fungibles/regular.rs b/substrate/frame/support/src/traits/tokens/fungibles/regular.rs index 8cc97802da66e5fa192a3720cfc6381c8930818f..b30e0ae3a2a3657c1a2685fa413ff120803ae187 100644 --- a/substrate/frame/support/src/traits/tokens/fungibles/regular.rs +++ b/substrate/frame/support/src/traits/tokens/fungibles/regular.rs @@ -16,6 +16,8 @@ // limitations under the License. //! `Inspect` and `Mutate` traits for working with regular balances. +//! +//! See the [`crate::traits::fungibles`] doc for more information about fungibles traits. use sp_std::marker::PhantomData; diff --git a/substrate/frame/support/src/traits/tokens/fungibles/roles.rs b/substrate/frame/support/src/traits/tokens/fungibles/roles.rs index 5cd1228afbce72542aae333759968d5ddee6fac3..4f95ad8368c2c555e1a07f1f1b8b9ede7cf574cb 100644 --- a/substrate/frame/support/src/traits/tokens/fungibles/roles.rs +++ b/substrate/frame/support/src/traits/tokens/fungibles/roles.rs @@ -16,6 +16,8 @@ // limitations under the License. //! Inspect traits for Asset roles +//! +//! See the [`crate::traits::fungibles`] doc for more information about fungibles traits. pub trait Inspect: super::Inspect { // Get owner for an AssetId. diff --git a/substrate/frame/support/src/traits/tokens/fungibles/union_of.rs b/substrate/frame/support/src/traits/tokens/fungibles/union_of.rs index 9d2a783df2a4af0c593c784d4c4d794b0311c392..c8a1ec37e78184f36342acefd65dd1815792b257 100644 --- a/substrate/frame/support/src/traits/tokens/fungibles/union_of.rs +++ b/substrate/frame/support/src/traits/tokens/fungibles/union_of.rs @@ -16,6 +16,8 @@ // limitations under the License. //! Type to combine two `fungibles::*` implementations into one union `fungibles::*` implementation. +//! +//! See the [`crate::traits::fungibles`] doc for more information about fungibles traits. use frame_support::traits::{ tokens::{ diff --git a/substrate/frame/support/src/traits/tokens/imbalance.rs b/substrate/frame/support/src/traits/tokens/imbalance.rs index 9dd8531324dc9d4a2845fd40b09a0d32746a99b6..8eb9b355a4cf6677b1a9f3e1eb77a879a6e0dc70 100644 --- a/substrate/frame/support/src/traits/tokens/imbalance.rs +++ b/substrate/frame/support/src/traits/tokens/imbalance.rs @@ -19,8 +19,8 @@ //! with unbalanced operations. use crate::traits::misc::{SameOrOther, TryDrop}; +use core::ops::Div; use sp_runtime::traits::Saturating; -use sp_std::ops::Div; mod on_unbalanced; mod signed_imbalance; diff --git a/substrate/frame/support/src/traits/tokens/imbalance/split_two_ways.rs b/substrate/frame/support/src/traits/tokens/imbalance/split_two_ways.rs index c1afac35fc93c4ab9263a190c0adca44adad3ded..59a582389ba61f3eb65fbc7f3710b1edba0a56ab 100644 --- a/substrate/frame/support/src/traits/tokens/imbalance/split_two_ways.rs +++ b/substrate/frame/support/src/traits/tokens/imbalance/split_two_ways.rs @@ -15,7 +15,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -//! Means for splitting an imbalance into two and hanlding them differently. +//! Means for splitting an imbalance into two and handling them differently. use super::super::imbalance::{Imbalance, OnUnbalanced}; use sp_runtime::traits::Saturating; diff --git a/substrate/frame/support/src/traits/tokens/misc.rs b/substrate/frame/support/src/traits/tokens/misc.rs index fd497bc4eda6f0b66127b4fc87edacd9be76d56f..a4dd5e4914283e6da028aac038cecee501a2228f 100644 --- a/substrate/frame/support/src/traits/tokens/misc.rs +++ b/substrate/frame/support/src/traits/tokens/misc.rs @@ -130,7 +130,7 @@ impl WithdrawConsequence { pub enum DepositConsequence { /// Deposit couldn't happen due to the amount being too low. This is usually because the /// account doesn't yet exist and the deposit wouldn't bring it to at least the minimum needed - /// for existance. + /// for existence. BelowMinimum, /// Deposit cannot happen since the account cannot be created (usually because it's a consumer /// and there exists no provider reference). diff --git a/substrate/frame/support/src/weights/block_weights.rs b/substrate/frame/support/src/weights/block_weights.rs index 57a68554755abb007165e751df687d097cd48f17..38f2ba3f023d2eb748cc886decf21baa9dc09130 100644 --- a/substrate/frame/support/src/weights/block_weights.rs +++ b/substrate/frame/support/src/weights/block_weights.rs @@ -15,24 +15,23 @@ // See the License for the specific language governing permissions and // limitations under the License. -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-06-16 (Y/M/D) -//! HOSTNAME: `runner-e8ezs4ez-project-145-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-04-08 (Y/M/D) +//! HOSTNAME: `runner-anb7yjbi-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! //! SHORT-NAME: `block`, LONG-NAME: `BlockExecution`, RUNTIME: `Development` //! WARMUPS: `10`, REPEAT: `100` -//! WEIGHT-PATH: `./frame/support/src/weights/` +//! WEIGHT-PATH: `./substrate/frame/support/src/weights/` //! WEIGHT-METRIC: `Average`, WEIGHT-MUL: `1.0`, WEIGHT-ADD: `0` // Executed Command: -// ./target/production/substrate +// ./target/production/substrate-node // benchmark // overhead // --chain=dev -// --execution=wasm // --wasm-execution=compiled -// --weight-path=./frame/support/src/weights/ -// --header=./HEADER-APACHE2 +// --weight-path=./substrate/frame/support/src/weights/ +// --header=./substrate/HEADER-APACHE2 // --warmup=10 // --repeat=100 @@ -44,17 +43,17 @@ parameter_types! { /// Calculated by multiplying the *Average* with `1.0` and adding `0`. /// /// Stats nanoseconds: - /// Min, Max: 376_949, 622_462 - /// Average: 390_584 - /// Median: 386_322 - /// Std-Dev: 24792.0 + /// Min, Max: 440_235, 661_535 + /// Average: 453_383 + /// Median: 449_925 + /// Std-Dev: 22021.99 /// /// Percentiles nanoseconds: - /// 99th: 433_299 - /// 95th: 402_688 - /// 75th: 391_645 + /// 99th: 474_045 + /// 95th: 466_455 + /// 75th: 455_056 pub const BlockExecutionWeight: Weight = - Weight::from_parts(WEIGHT_REF_TIME_PER_NANOS.saturating_mul(390_584), 0); + Weight::from_parts(WEIGHT_REF_TIME_PER_NANOS.saturating_mul(453_383), 0); } #[cfg(test)] diff --git a/substrate/frame/support/src/weights/extrinsic_weights.rs b/substrate/frame/support/src/weights/extrinsic_weights.rs index a304f089ff782c34ab9941705503c5e766bb08b0..75c7ffa6070530d1b71175f93e2811f11b65787f 100644 --- a/substrate/frame/support/src/weights/extrinsic_weights.rs +++ b/substrate/frame/support/src/weights/extrinsic_weights.rs @@ -15,24 +15,23 @@ // See the License for the specific language governing permissions and // limitations under the License. -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-06-16 (Y/M/D) -//! HOSTNAME: `runner-e8ezs4ez-project-145-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-04-08 (Y/M/D) +//! HOSTNAME: `runner-anb7yjbi-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! //! SHORT-NAME: `extrinsic`, LONG-NAME: `ExtrinsicBase`, RUNTIME: `Development` //! WARMUPS: `10`, REPEAT: `100` -//! WEIGHT-PATH: `./frame/support/src/weights/` +//! WEIGHT-PATH: `./substrate/frame/support/src/weights/` //! WEIGHT-METRIC: `Average`, WEIGHT-MUL: `1.0`, WEIGHT-ADD: `0` // Executed Command: -// ./target/production/substrate +// ./target/production/substrate-node // benchmark // overhead // --chain=dev -// --execution=wasm // --wasm-execution=compiled -// --weight-path=./frame/support/src/weights/ -// --header=./HEADER-APACHE2 +// --weight-path=./substrate/frame/support/src/weights/ +// --header=./substrate/HEADER-APACHE2 // --warmup=10 // --repeat=100 @@ -44,17 +43,17 @@ parameter_types! { /// Calculated by multiplying the *Average* with `1.0` and adding `0`. /// /// Stats nanoseconds: - /// Min, Max: 123_875, 128_419 - /// Average: 124_414 - /// Median: 124_332 - /// Std-Dev: 497.74 + /// Min, Max: 106_559, 107_788 + /// Average: 107_074 + /// Median: 107_067 + /// Std-Dev: 242.67 /// /// Percentiles nanoseconds: - /// 99th: 125_245 - /// 95th: 124_989 - /// 75th: 124_498 + /// 99th: 107_675 + /// 95th: 107_513 + /// 75th: 107_225 pub const ExtrinsicBaseWeight: Weight = - Weight::from_parts(WEIGHT_REF_TIME_PER_NANOS.saturating_mul(124_414), 0); + Weight::from_parts(WEIGHT_REF_TIME_PER_NANOS.saturating_mul(107_074), 0); } #[cfg(test)] diff --git a/substrate/frame/support/test/Cargo.toml b/substrate/frame/support/test/Cargo.toml index 8b61f25f569aa51d3ac221f15d7f3ffc156b6739..88124e0a43b9cc10438e01e44d98e9f9130ca56c 100644 --- a/substrate/frame/support/test/Cargo.toml +++ b/substrate/frame/support/test/Cargo.toml @@ -16,15 +16,15 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] static_assertions = "1.1.0" -serde = { version = "1.0.195", default-features = false, features = ["derive"] } +serde = { features = ["derive"], workspace = true } codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } frame-metadata = { version = "16.0.0", default-features = false, features = ["current"] } sp-api = { path = "../../../primitives/api", default-features = false } sp-arithmetic = { path = "../../../primitives/arithmetic", default-features = false } sp-io = { path = "../../../primitives/io", default-features = false } sp-state-machine = { path = "../../../primitives/state-machine", optional = true } -frame-support = { path = "..", default-features = false } +frame-support = { path = "..", default-features = false, features = ["experimental"] } frame-benchmarking = { path = "../../benchmarking", default-features = false } sp-runtime = { path = "../../../primitives/runtime", default-features = false } sp-core = { path = "../../../primitives/core", default-features = false } diff --git a/substrate/frame/support/test/compile_pass/Cargo.toml b/substrate/frame/support/test/compile_pass/Cargo.toml index 0617aa105a21f1f3a583404465da97f0af79b176..3f52b4664b187675afd7bd13c4c96db62523a73b 100644 --- a/substrate/frame/support/test/compile_pass/Cargo.toml +++ b/substrate/frame/support/test/compile_pass/Cargo.toml @@ -16,7 +16,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } renamed-frame-support = { package = "frame-support", path = "../..", default-features = false } renamed-frame-system = { package = "frame-system", path = "../../../system", default-features = false } sp-core = { path = "../../../../primitives/core", default-features = false } diff --git a/substrate/frame/support/test/compile_pass/src/lib.rs b/substrate/frame/support/test/compile_pass/src/lib.rs index 575322df7604fe54f1194269c570653f5f141cbc..07d2f7d9ecdbe803139f6017d71f06bc278adc6a 100644 --- a/substrate/frame/support/test/compile_pass/src/lib.rs +++ b/substrate/frame/support/test/compile_pass/src/lib.rs @@ -51,7 +51,7 @@ parameter_types! { pub const Version: RuntimeVersion = VERSION; } -#[derive_impl(renamed_frame_system::config_preludes::TestDefaultConfig as renamed_frame_system::DefaultConfig)] +#[derive_impl(renamed_frame_system::config_preludes::TestDefaultConfig)] impl renamed_frame_system::Config for Runtime { type BaseCallFilter = Everything; type BlockWeights = (); diff --git a/substrate/frame/support/test/pallet/Cargo.toml b/substrate/frame/support/test/pallet/Cargo.toml index 48adbcab5826157ea3edfb4eb931f77b9b9794a1..7a20c3f2730629e709eb78c650b0ca4ca0d3e964 100644 --- a/substrate/frame/support/test/pallet/Cargo.toml +++ b/substrate/frame/support/test/pallet/Cargo.toml @@ -16,8 +16,8 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.195", default-features = false, features = ["derive"] } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +serde = { features = ["derive"], workspace = true } frame-support = { path = "../..", default-features = false } frame-system = { path = "../../../system", default-features = false } sp-runtime = { path = "../../../../primitives/runtime", default-features = false } diff --git a/substrate/frame/support/test/stg_frame_crate/Cargo.toml b/substrate/frame/support/test/stg_frame_crate/Cargo.toml index 632ea4e794f6f8edb46e57d190be108219935ea0..554c81ab43decf222b516bf8bbd7660cab399eaf 100644 --- a/substrate/frame/support/test/stg_frame_crate/Cargo.toml +++ b/substrate/frame/support/test/stg_frame_crate/Cargo.toml @@ -16,8 +16,8 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } -frame = { path = "../../..", default-features = false, features = ["experimental", "runtime"] } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +frame = { package = "polkadot-sdk-frame", path = "../../..", default-features = false, features = ["experimental", "runtime"] } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } [features] default = ["std"] diff --git a/substrate/frame/support/test/stg_frame_crate/src/lib.rs b/substrate/frame/support/test/stg_frame_crate/src/lib.rs index 59a66851f237c19ea8f95b851bf36518914b49bb..dc5fff65510e6532b8c8a9e22d82b369e00aa775 100644 --- a/substrate/frame/support/test/stg_frame_crate/src/lib.rs +++ b/substrate/frame/support/test/stg_frame_crate/src/lib.rs @@ -60,7 +60,7 @@ mod tests { impl crate::pallet::Config for Runtime {} - #[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] + #[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Runtime { type Block = Block; } diff --git a/substrate/frame/contracts/fixtures/contracts/invalid_contract_no_call.rs b/substrate/frame/support/test/tests/benchmark_ui/bad_attr_pov_mode_1.rs similarity index 80% rename from substrate/frame/contracts/fixtures/contracts/invalid_contract_no_call.rs rename to substrate/frame/support/test/tests/benchmark_ui/bad_attr_pov_mode_1.rs index 13af3eb22b1f5fd10c3e2b60061d3f7a6cc37c94..40ef884bf8577aeace86fe8f6225d18f0efde727 100644 --- a/substrate/frame/contracts/fixtures/contracts/invalid_contract_no_call.rs +++ b/substrate/frame/support/test/tests/benchmark_ui/bad_attr_pov_mode_1.rs @@ -14,12 +14,18 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. -//! Valid module but missing the call function -#![no_std] -#![no_main] -extern crate common; +use frame_benchmarking::v2::*; -#[no_mangle] -#[polkavm_derive::polkavm_export] -pub extern "C" fn deploy() {} +#[benchmarks] +mod benches { + use super::*; + + #[benchmark(pov_mode = Wrong)] + fn bench() { + #[block] + {} + } +} + +fn main() {} diff --git a/substrate/frame/support/test/tests/benchmark_ui/bad_attr_pov_mode_1.stderr b/substrate/frame/support/test/tests/benchmark_ui/bad_attr_pov_mode_1.stderr new file mode 100644 index 0000000000000000000000000000000000000000..add80da63070e47b1ce46aba23359e2e9cbd4645 --- /dev/null +++ b/substrate/frame/support/test/tests/benchmark_ui/bad_attr_pov_mode_1.stderr @@ -0,0 +1,5 @@ +error: expected one of: `MaxEncodedLen`, `Measured`, `Ignored` + --> tests/benchmark_ui/bad_attr_pov_mode_1.rs:24:25 + | +24 | #[benchmark(pov_mode = Wrong)] + | ^^^^^ diff --git a/substrate/frame/support/test/tests/pallet_ui/deprecated_store_attr.rs b/substrate/frame/support/test/tests/benchmark_ui/bad_attr_pov_mode_2.rs similarity index 76% rename from substrate/frame/support/test/tests/pallet_ui/deprecated_store_attr.rs rename to substrate/frame/support/test/tests/benchmark_ui/bad_attr_pov_mode_2.rs index 72ad7896dfec572014cb6b10dcc39bc417a275b6..151bb931e9204b17bb3789869df0e4ab96594848 100644 --- a/substrate/frame/support/test/tests/pallet_ui/deprecated_store_attr.rs +++ b/substrate/frame/support/test/tests/benchmark_ui/bad_attr_pov_mode_2.rs @@ -15,14 +15,19 @@ // See the License for the specific language governing permissions and // limitations under the License. -#[frame_support::pallet] -mod pallet { - #[pallet::config] - pub trait Config: frame_system::Config {} +use frame_benchmarking::v2::*; - #[pallet::pallet] - #[pallet::generate_store(trait Store)] - pub struct Pallet(core::marker::PhantomData); +#[benchmarks] +mod benches { + use super::*; + + #[benchmark(pov_mode = Measured { + Key: Wrong + })] + fn bench() { + #[block] + {} + } } fn main() {} diff --git a/substrate/frame/support/test/tests/benchmark_ui/bad_attr_pov_mode_2.stderr b/substrate/frame/support/test/tests/benchmark_ui/bad_attr_pov_mode_2.stderr new file mode 100644 index 0000000000000000000000000000000000000000..0f9961afd89fad0d7e7022f890a89db90ff69582 --- /dev/null +++ b/substrate/frame/support/test/tests/benchmark_ui/bad_attr_pov_mode_2.stderr @@ -0,0 +1,5 @@ +error: expected one of: `MaxEncodedLen`, `Measured`, `Ignored` + --> tests/benchmark_ui/bad_attr_pov_mode_2.rs:25:8 + | +25 | Key: Wrong + | ^^^^^ diff --git a/substrate/frame/support/test/tests/benchmark_ui/bad_attr_pov_mode_3.rs b/substrate/frame/support/test/tests/benchmark_ui/bad_attr_pov_mode_3.rs new file mode 100644 index 0000000000000000000000000000000000000000..9c5e3801b1a30d5b88662e9f691d18eccf1349ef --- /dev/null +++ b/substrate/frame/support/test/tests/benchmark_ui/bad_attr_pov_mode_3.rs @@ -0,0 +1,31 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use frame_benchmarking::v2::*; + +#[benchmarks] +mod benches { + use super::*; + + #[benchmark(pov_mode)] + fn bench() { + #[block] + {} + } +} + +fn main() {} diff --git a/substrate/frame/support/test/tests/benchmark_ui/bad_attr_pov_mode_3.stderr b/substrate/frame/support/test/tests/benchmark_ui/bad_attr_pov_mode_3.stderr new file mode 100644 index 0000000000000000000000000000000000000000..f28a993989a35a22e191c9b75cb4dc37725ffb99 --- /dev/null +++ b/substrate/frame/support/test/tests/benchmark_ui/bad_attr_pov_mode_3.stderr @@ -0,0 +1,5 @@ +error: expected `=` + --> tests/benchmark_ui/bad_attr_pov_mode_3.rs:24:22 + | +24 | #[benchmark(pov_mode)] + | ^ diff --git a/substrate/frame/support/test/tests/benchmark_ui/bad_attr_pov_mode_4.rs b/substrate/frame/support/test/tests/benchmark_ui/bad_attr_pov_mode_4.rs new file mode 100644 index 0000000000000000000000000000000000000000..11ec5124d289dc83a1d9526e7b21df3bcffebf41 --- /dev/null +++ b/substrate/frame/support/test/tests/benchmark_ui/bad_attr_pov_mode_4.rs @@ -0,0 +1,31 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use frame_benchmarking::v2::*; + +#[benchmarks] +mod benches { + use super::*; + + #[benchmark(pov_mode =)] + fn bench() { + #[block] + {} + } +} + +fn main() {} diff --git a/substrate/frame/support/test/tests/benchmark_ui/bad_attr_pov_mode_4.stderr b/substrate/frame/support/test/tests/benchmark_ui/bad_attr_pov_mode_4.stderr new file mode 100644 index 0000000000000000000000000000000000000000..572b6b0815dc1f93590b8b1505a94f2450a39953 --- /dev/null +++ b/substrate/frame/support/test/tests/benchmark_ui/bad_attr_pov_mode_4.stderr @@ -0,0 +1,5 @@ +error: unexpected end of input, expected one of: `MaxEncodedLen`, `Measured`, `Ignored` + --> tests/benchmark_ui/bad_attr_pov_mode_4.rs:24:24 + | +24 | #[benchmark(pov_mode =)] + | ^ diff --git a/substrate/frame/support/test/tests/benchmark_ui/dup_attr_pov_mode.rs b/substrate/frame/support/test/tests/benchmark_ui/dup_attr_pov_mode.rs new file mode 100644 index 0000000000000000000000000000000000000000..f49636d181a5b07c4e51e0bd9096fd2465fbcea9 --- /dev/null +++ b/substrate/frame/support/test/tests/benchmark_ui/dup_attr_pov_mode.rs @@ -0,0 +1,32 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use frame_benchmarking::v2::*; +use frame_support_test::Config; + +#[benchmarks] +mod benches { + use super::*; + + #[benchmark(pov_mode = Measured, pov_mode = MaxEncodedLen)] + fn bench() { + #[block] + {} + } +} + +fn main() {} diff --git a/substrate/frame/support/test/tests/benchmark_ui/dup_attr_pov_mode.stderr b/substrate/frame/support/test/tests/benchmark_ui/dup_attr_pov_mode.stderr new file mode 100644 index 0000000000000000000000000000000000000000..aab91d271a694309ad7ea293eb1adc19ff7a03b5 --- /dev/null +++ b/substrate/frame/support/test/tests/benchmark_ui/dup_attr_pov_mode.stderr @@ -0,0 +1,14 @@ +error: unexpected end of input, `pov_mode` can only be specified once + --> tests/benchmark_ui/dup_attr_pov_mode.rs:25:59 + | +25 | #[benchmark(pov_mode = Measured, pov_mode = MaxEncodedLen)] + | ^ + +error: unused import: `frame_support_test::Config` + --> tests/benchmark_ui/dup_attr_pov_mode.rs:19:5 + | +19 | use frame_support_test::Config; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: `-D unused-imports` implied by `-D warnings` + = help: to override `-D warnings` add `#[allow(unused_imports)]` diff --git a/substrate/frame/support/test/tests/benchmark_ui/pass/valid_attr_pov_mode.rs b/substrate/frame/support/test/tests/benchmark_ui/pass/valid_attr_pov_mode.rs new file mode 100644 index 0000000000000000000000000000000000000000..35fa1e76ae5ad8852686d7e8810f061675895e2e --- /dev/null +++ b/substrate/frame/support/test/tests/benchmark_ui/pass/valid_attr_pov_mode.rs @@ -0,0 +1,74 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use frame_benchmarking::v2::*; +use frame_support_test::Config; + +#[benchmarks] +mod benches { + use super::*; + + #[benchmark(skip_meta, extra, pov_mode = Measured)] + fn bench1() { + #[block] + {} + } + + #[benchmark(pov_mode = Measured, extra, skip_meta)] + fn bench2() { + #[block] + {} + } + + #[benchmark(extra, pov_mode = Measured { + Pallet: Measured, + Pallet::Storage: MaxEncodedLen, + }, skip_meta)] + fn bench3() { + #[block] + {} + } + + #[benchmark(skip_meta, extra, pov_mode = Measured { + Pallet::Storage: MaxEncodedLen, + Pallet::StorageSubKey: Measured, + })] + fn bench4() { + #[block] + {} + } + + #[benchmark(pov_mode = MaxEncodedLen { + Pallet::Storage: Measured, + Pallet::StorageSubKey: Measured + }, extra, skip_meta)] + fn bench5() { + #[block] + {} + } + + #[benchmark(pov_mode = MaxEncodedLen { + Pallet::Storage: Measured, + Pallet::Storage::Nested: Ignored + }, extra, skip_meta)] + fn bench6() { + #[block] + {} + } +} + +fn main() {} diff --git a/substrate/frame/support/test/tests/benchmark_ui/pass/valid_basic.rs b/substrate/frame/support/test/tests/benchmark_ui/pass/valid_basic.rs index 126cee8fa6c535f5651e083e181d58ffa13c1e73..5899eb3562a2a1791f05be7ec6e77d3d01aa2cd1 100644 --- a/substrate/frame/support/test/tests/benchmark_ui/pass/valid_basic.rs +++ b/substrate/frame/support/test/tests/benchmark_ui/pass/valid_basic.rs @@ -22,7 +22,7 @@ use frame_support_test::Config; mod benches { use super::*; - #[benchmark(skip_meta, extra)] + #[benchmark(skip_meta, pov_mode = Measured, extra)] fn bench() { let a = 2 + 2; #[block] diff --git a/substrate/frame/support/test/tests/benchmark_ui/unrecognized_option.stderr b/substrate/frame/support/test/tests/benchmark_ui/unrecognized_option.stderr index bea770b634e25495a9207be51d41c363848fdc1f..2eb06e396a8582c01df93e84572c51d001fe434e 100644 --- a/substrate/frame/support/test/tests/benchmark_ui/unrecognized_option.stderr +++ b/substrate/frame/support/test/tests/benchmark_ui/unrecognized_option.stderr @@ -1,4 +1,4 @@ -error: expected `extra` or `skip_meta` +error: expected one of: `extra`, `skip_meta`, `pov_mode` --> tests/benchmark_ui/unrecognized_option.rs:26:32 | 26 | #[benchmark(skip_meta, extra, bad)] diff --git a/substrate/frame/support/test/tests/composite_enum.rs b/substrate/frame/support/test/tests/composite_enum.rs index b9e9c23c4bca8ffb1e1a93d4800d040e010bbb13..1f937705823b38da77a989b2ba14d27570556145 100644 --- a/substrate/frame/support/test/tests/composite_enum.rs +++ b/substrate/frame/support/test/tests/composite_enum.rs @@ -114,7 +114,7 @@ frame_support::construct_runtime!( } ); -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Runtime { type Block = Block; } diff --git a/substrate/frame/support/test/tests/construct_runtime_ui/deprecated_where_block.stderr b/substrate/frame/support/test/tests/construct_runtime_ui/deprecated_where_block.stderr index 61cfc07caedc37e1a8427e8fadc61406813c52e6..09c4d290ef5c3d49d244648242e6324d4cf760e5 100644 --- a/substrate/frame/support/test/tests/construct_runtime_ui/deprecated_where_block.stderr +++ b/substrate/frame/support/test/tests/construct_runtime_ui/deprecated_where_block.stderr @@ -347,7 +347,7 @@ error[E0277]: the trait bound `Runtime: Config` is not satisfied 26 | System: frame_system::{Pallet, Call, Storage, Config, Event}, | ^^^^^^ the trait `Config` is not implemented for `Runtime` | -note: required by a bound in `frame_system::GenesisConfig` +note: required by a bound in `GenesisConfig` --> $WORKSPACE/substrate/frame/system/src/lib.rs | | pub struct GenesisConfig { diff --git a/substrate/frame/support/test/tests/construct_runtime_ui/number_of_pallets_exceeds_tuple_size.rs b/substrate/frame/support/test/tests/construct_runtime_ui/number_of_pallets_exceeds_tuple_size.rs index 78ae6f57f087c4a652a75b8636c4cbd15ab7b35f..26110810250c77ca7aaa87b881524ac2752319b7 100644 --- a/substrate/frame/support/test/tests/construct_runtime_ui/number_of_pallets_exceeds_tuple_size.rs +++ b/substrate/frame/support/test/tests/construct_runtime_ui/number_of_pallets_exceeds_tuple_size.rs @@ -36,7 +36,7 @@ pub type UncheckedExtrinsic = generic::UncheckedExtrinsic tests/construct_runtime_ui/number_of_pallets_exceeds_tuple_size.rs:35:64 - | -35 | pub type UncheckedExtrinsic = generic::UncheckedExtrinsic; - | ^^^^^^^^^^^ not found in this scope - | -help: you might be missing a type parameter - | -35 | pub type UncheckedExtrinsic = generic::UncheckedExtrinsic; - | +++++++++++++ - -error[E0412]: cannot find type `Runtime` in this scope - --> tests/construct_runtime_ui/number_of_pallets_exceeds_tuple_size.rs:37:25 - | -37 | impl pallet::Config for Runtime {} - | ^^^^^^^ not found in this scope - -error[E0412]: cannot find type `Runtime` in this scope - --> tests/construct_runtime_ui/number_of_pallets_exceeds_tuple_size.rs:40:31 - | -40 | impl frame_system::Config for Runtime { - | ^^^^^^^ not found in this scope - -error[E0412]: cannot find type `RuntimeOrigin` in this scope - --> tests/construct_runtime_ui/number_of_pallets_exceeds_tuple_size.rs:42:23 - | -42 | type RuntimeOrigin = RuntimeOrigin; - | ^^^^^^^^^^^^^ - | -help: you might have meant to use the associated type - | -42 | type RuntimeOrigin = Self::RuntimeOrigin; - | ++++++ - -error[E0412]: cannot find type `RuntimeCall` in this scope - --> tests/construct_runtime_ui/number_of_pallets_exceeds_tuple_size.rs:44:21 - | -44 | type RuntimeCall = RuntimeCall; - | ^^^^^^^^^^^ - | -help: you might have meant to use the associated type - | -44 | type RuntimeCall = Self::RuntimeCall; - | ++++++ - -error[E0412]: cannot find type `RuntimeEvent` in this scope - --> tests/construct_runtime_ui/number_of_pallets_exceeds_tuple_size.rs:50:22 - | -50 | type RuntimeEvent = RuntimeEvent; - | ^^^^^^^^^^^^ - | -help: you might have meant to use the associated type - | -50 | type RuntimeEvent = Self::RuntimeEvent; - | ++++++ - -error[E0412]: cannot find type `PalletInfo` in this scope - --> tests/construct_runtime_ui/number_of_pallets_exceeds_tuple_size.rs:56:20 - | -56 | type PalletInfo = PalletInfo; - | ^^^^^^^^^^ - | -help: you might have meant to use the associated type - | -56 | type PalletInfo = Self::PalletInfo; - | ++++++ -help: consider importing one of these items - | -18 + use frame_benchmarking::__private::traits::PalletInfo; - | -18 + use frame_support::traits::PalletInfo; - | - -error[E0412]: cannot find type `RuntimeTask` in this scope - --> tests/construct_runtime_ui/number_of_pallets_exceeds_tuple_size.rs:39:1 - | -39 | #[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | - = note: this error originates in the macro `frame_system::config_preludes::TestDefaultConfig` which comes from the expansion of the macro `frame_support::macro_magic::forward_tokens_verbatim` (in Nightly builds, run with -Z macro-backtrace for more info) -help: you might have meant to use the associated type - --> $WORKSPACE/substrate/frame/system/src/lib.rs - | - | type Self::RuntimeTask = (); - | ++++++ +error: recursion limit reached while expanding `frame_support::__private::tt_return!` + --> tests/construct_runtime_ui/number_of_pallets_exceeds_tuple_size.rs:22:1 + | +22 | / #[frame_support::pallet] +23 | | mod pallet { +24 | | #[pallet::config] +25 | | pub trait Config: frame_system::Config {} +... | +66 | |/ construct_runtime! { +67 | || pub struct Runtime +68 | || { +69 | || System: frame_system::{Pallet, Call, Storage, Config, Event}, +... || +180 | || } +181 | || } + | ||_^ + | |_| + | in this macro invocation + | + = help: consider increasing the recursion limit by adding a `#![recursion_limit = "256"]` attribute to your crate (`$CRATE`) + = note: this error originates in the macro `construct_runtime` (in Nightly builds, run with -Z macro-backtrace for more info) diff --git a/substrate/frame/support/test/tests/construct_runtime_ui/pallet_error_too_large.rs b/substrate/frame/support/test/tests/construct_runtime_ui/pallet_error_too_large.rs index d3e519af55150818c6073d7b35f845226ae1edf3..3ec1d5669618fc1a76afe195dbce9cac135e1035 100644 --- a/substrate/frame/support/test/tests/construct_runtime_ui/pallet_error_too_large.rs +++ b/substrate/frame/support/test/tests/construct_runtime_ui/pallet_error_too_large.rs @@ -61,7 +61,7 @@ pub type UncheckedExtrinsic = generic::UncheckedExtrinsic` | = help: items from traits can only be used if the trait is implemented and in scope - = note: the following trait defines an item `is_inherent`, perhaps you need to implement it: + = note: the following traits define an item `is_inherent`, perhaps you need to implement one of them: candidate #1: `ProvideInherent` + candidate #2: `IsInherent` = note: this error originates in the macro `construct_runtime` (in Nightly builds, run with -Z macro-backtrace for more info) error[E0599]: no function or associated item named `check_inherent` found for struct `pallet::Pallet` in the current scope @@ -119,3 +120,23 @@ error[E0599]: no function or associated item named `is_inherent_required` found = note: the following trait defines an item `is_inherent_required`, perhaps you need to implement it: candidate #1: `ProvideInherent` = note: this error originates in the macro `construct_runtime` (in Nightly builds, run with -Z macro-backtrace for more info) + +error[E0277]: the trait bound `pallet::Pallet: ProvideInherent` is not satisfied + --> tests/construct_runtime_ui/undefined_inherent_part.rs:70:3 + | +70 | Pallet: pallet expanded::{}::{Pallet, Inherent}, + | ^^^^^^ the trait `ProvideInherent` is not implemented for `pallet::Pallet` + +error[E0277]: the trait bound `pallet::Pallet: ProvideInherent` is not satisfied + --> tests/construct_runtime_ui/undefined_inherent_part.rs:66:1 + | +66 | / construct_runtime! { +67 | | pub struct Runtime +68 | | { +69 | | System: frame_system expanded::{}::{Pallet, Call, Storage, Config, Event}, +70 | | Pallet: pallet expanded::{}::{Pallet, Inherent}, +71 | | } +72 | | } + | |_^ the trait `ProvideInherent` is not implemented for `pallet::Pallet` + | + = note: this error originates in the macro `construct_runtime` (in Nightly builds, run with -Z macro-backtrace for more info) diff --git a/substrate/frame/support/test/tests/construct_runtime_ui/undefined_origin_part.rs b/substrate/frame/support/test/tests/construct_runtime_ui/undefined_origin_part.rs index 40a4a1ebcb5d2003a549d5197578a4154c233ea6..b113b3c79bb848cfa6dd63e4861939b564de5fd5 100644 --- a/substrate/frame/support/test/tests/construct_runtime_ui/undefined_origin_part.rs +++ b/substrate/frame/support/test/tests/construct_runtime_ui/undefined_origin_part.rs @@ -36,7 +36,7 @@ pub type UncheckedExtrinsic = generic::UncheckedExtrinsic tests/derive_impl_ui/inject_runtime_type_invalid.rs:32:5 | 32 | type RuntimeInfo = (); diff --git a/substrate/frame/support/test/tests/derive_impl_ui/missing_disambiguation_path.rs b/substrate/frame/support/test/tests/derive_impl_ui/missing_disambiguation_path.rs index f26c28313e5154a3f0a4e66d458375d0ecf59761..4914ceea0b6d0dda7e90d2240f66c122d7fc35b1 100644 --- a/substrate/frame/support/test/tests/derive_impl_ui/missing_disambiguation_path.rs +++ b/substrate/frame/support/test/tests/derive_impl_ui/missing_disambiguation_path.rs @@ -50,10 +50,10 @@ impl Animal for FourLeggedAnimal { } } -pub struct AcquaticMammal {} +pub struct AquaticMammal {} #[derive_impl(FourLeggedAnimal as)] -impl Animal for AcquaticMammal { +impl Animal for AquaticMammal { type Locomotion = (Swims, RunsOnFourLegs); type Environment = (Land, Sea); } diff --git a/substrate/frame/support/test/tests/derive_impl_ui/pass/basic_overriding.rs b/substrate/frame/support/test/tests/derive_impl_ui/pass/basic_overriding.rs index 37c0742f195d786ded121a631dbd384e48aff137..20744b8cba2676a52c7476155381d523ab4355fe 100644 --- a/substrate/frame/support/test/tests/derive_impl_ui/pass/basic_overriding.rs +++ b/substrate/frame/support/test/tests/derive_impl_ui/pass/basic_overriding.rs @@ -51,19 +51,19 @@ impl Animal for FourLeggedAnimal { } } -pub struct AcquaticMammal {} +pub struct AquaticMammal {} // without omitting the `as X` #[derive_impl(FourLeggedAnimal as Animal)] -impl Animal for AcquaticMammal { +impl Animal for AquaticMammal { type Locomotion = (Swims, RunsOnFourLegs); type Environment = (Land, Sea); } -assert_type_eq_all!(::Locomotion, (Swims, RunsOnFourLegs)); -assert_type_eq_all!(::Environment, (Land, Sea)); -assert_type_eq_all!(::Diet, Omnivore); -assert_type_eq_all!(::SleepingStrategy, Diurnal); +assert_type_eq_all!(::Locomotion, (Swims, RunsOnFourLegs)); +assert_type_eq_all!(::Environment, (Land, Sea)); +assert_type_eq_all!(::Diet, Omnivore); +assert_type_eq_all!(::SleepingStrategy, Diurnal); pub struct Lion {} diff --git a/substrate/frame/support/test/tests/final_keys.rs b/substrate/frame/support/test/tests/final_keys.rs index 38240830daa2b05f0a8426f4a2d28b3f3df3d865..a777c20a1e98f7a38c4a4cc4dead81e5565b6ebc 100644 --- a/substrate/frame/support/test/tests/final_keys.rs +++ b/substrate/frame/support/test/tests/final_keys.rs @@ -209,7 +209,7 @@ frame_support::construct_runtime!( } ); -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Runtime { type BaseCallFilter = frame_support::traits::Everything; type Block = Block; diff --git a/substrate/frame/support/test/tests/genesisconfig.rs b/substrate/frame/support/test/tests/genesisconfig.rs index c6781220692a942adfb445f8620c522b40e4e45a..a82425cf6befe3c014543943ffb6a72e9f00770b 100644 --- a/substrate/frame/support/test/tests/genesisconfig.rs +++ b/substrate/frame/support/test/tests/genesisconfig.rs @@ -79,7 +79,7 @@ frame_support::construct_runtime!( } ); -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { type BaseCallFilter = frame_support::traits::Everything; type Block = Block; diff --git a/substrate/frame/support/test/tests/instance.rs b/substrate/frame/support/test/tests/instance.rs index 7a888e5685d11748ba618c166d5ccd2d91febc28..332f5725e055eb2aa9ca70dff987f021a76d41ba 100644 --- a/substrate/frame/support/test/tests/instance.rs +++ b/substrate/frame/support/test/tests/instance.rs @@ -289,7 +289,7 @@ frame_support::construct_runtime!( } ); -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Runtime { type BaseCallFilter = frame_support::traits::Everything; type Block = Block; diff --git a/substrate/frame/support/test/tests/issue2219.rs b/substrate/frame/support/test/tests/issue2219.rs index 4c384f432762343b952e3ebd31dbc7d3b655741f..1542c4a6c434cec98547c533ba3f3530a5aff853 100644 --- a/substrate/frame/support/test/tests/issue2219.rs +++ b/substrate/frame/support/test/tests/issue2219.rs @@ -161,7 +161,7 @@ pub type Header = generic::Header; pub type UncheckedExtrinsic = generic::UncheckedExtrinsic; pub type Block = generic::Block; -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Runtime { type BaseCallFilter = frame_support::traits::Everything; type Block = Block; diff --git a/substrate/frame/support/test/tests/origin.rs b/substrate/frame/support/test/tests/origin.rs index 5682bb500c7e366ba6f6da1cd6e0b70569c4a6a7..a25c575cc5177a4511dec8a8b24918ffde6da8d3 100644 --- a/substrate/frame/support/test/tests/origin.rs +++ b/substrate/frame/support/test/tests/origin.rs @@ -170,7 +170,7 @@ frame_support::construct_runtime!( } ); -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for RuntimeOriginTest { type BaseCallFilter = BaseCallFilter; type Block = Block; diff --git a/substrate/frame/support/test/tests/pallet.rs b/substrate/frame/support/test/tests/pallet.rs index 9b4381c2f82bd4baa78fc8d175079a0e90480da3..f41e606ad7c3e927e9719afccde3d5e0266509e0 100644 --- a/substrate/frame/support/test/tests/pallet.rs +++ b/substrate/frame/support/test/tests/pallet.rs @@ -209,7 +209,7 @@ pub mod pallet { where T::AccountId: From + From + SomeAssociation1, { - /// Doc comment put in metadata + /// call foo doc comment put in metadata #[pallet::call_index(0)] #[pallet::weight(Weight::from_parts(*foo as u64, 0))] pub fn foo( @@ -225,7 +225,7 @@ pub mod pallet { Ok(().into()) } - /// Doc comment put in metadata + /// call foo_storage_layer doc comment put in metadata #[pallet::call_index(1)] #[pallet::weight({1})] pub fn foo_storage_layer( @@ -270,7 +270,7 @@ pub mod pallet { #[pallet::error] #[derive(PartialEq, Eq)] pub enum Error { - /// doc comment put into metadata + /// error doc comment put in metadata InsufficientProposersBalance, NonExistentStorageValue, Code(u8), @@ -287,9 +287,8 @@ pub mod pallet { where T::AccountId: SomeAssociation1 + From, { - /// doc comment put in metadata + /// event doc comment put in metadata Proposed(::AccountId), - /// doc Spending(BalanceOf), Something(u32), SomethingElse(::_1), @@ -590,7 +589,7 @@ pub mod pallet2 { Self::deposit_event(Event::Something(31)); if UpdateStorageVersion::get() { - Self::current_storage_version().put::(); + Self::in_code_storage_version().put::(); } Weight::zero() @@ -694,7 +693,7 @@ frame_support::parameter_types!( pub const MyGetParam3: u32 = 12; ); -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Runtime { type BaseCallFilter = frame_support::traits::Everything; type RuntimeOrigin = RuntimeOrigin; @@ -750,8 +749,7 @@ pub type UncheckedExtrinsic = sp_runtime::testing::TestXt>; frame_support::construct_runtime!( - pub struct Runtime - { + pub struct Runtime { // Exclude part `Storage` in order not to check its metadata in tests. System: frame_system exclude_parts { Pallet, Storage }, Example: pallet, @@ -772,6 +770,14 @@ fn _ensure_call_is_correctly_excluded_and_included(call: RuntimeCall) { } } +fn maybe_docs(doc: Vec<&'static str>) -> Vec<&'static str> { + if cfg!(feature = "no-metadata-docs") { + vec![] + } else { + doc + } +} + #[test] fn transactional_works() { TestExternalities::default().execute_with(|| { @@ -1310,7 +1316,7 @@ fn pallet_on_genesis() { assert_eq!(pallet::Pallet::::on_chain_storage_version(), StorageVersion::new(0)); pallet::Pallet::::on_genesis(); assert_eq!( - pallet::Pallet::::current_storage_version(), + pallet::Pallet::::in_code_storage_version(), pallet::Pallet::::on_chain_storage_version(), ); }) @@ -1362,19 +1368,47 @@ fn migrate_from_pallet_version_to_storage_version() { }); } +#[test] +fn pallet_item_docs_in_metadata() { + // call + let call_variants = match meta_type::>().type_info().type_def { + scale_info::TypeDef::Variant(variants) => variants.variants, + _ => unreachable!(), + }; + + assert_eq!(call_variants[0].docs, maybe_docs(vec!["call foo doc comment put in metadata"])); + assert_eq!( + call_variants[1].docs, + maybe_docs(vec!["call foo_storage_layer doc comment put in metadata"]) + ); + assert!(call_variants[2].docs.is_empty()); + + // event + let event_variants = match meta_type::>().type_info().type_def { + scale_info::TypeDef::Variant(variants) => variants.variants, + _ => unreachable!(), + }; + + assert_eq!(event_variants[0].docs, maybe_docs(vec!["event doc comment put in metadata"])); + assert!(event_variants[1].docs.is_empty()); + + // error + let error_variants = match meta_type::>().type_info().type_def { + scale_info::TypeDef::Variant(variants) => variants.variants, + _ => unreachable!(), + }; + + assert_eq!(error_variants[0].docs, maybe_docs(vec!["error doc comment put in metadata"])); + assert!(error_variants[1].docs.is_empty()); + + // storage is already covered in the main `fn metadata` test. +} + #[test] fn metadata() { use codec::Decode; use frame_metadata::{v15::*, *}; - fn maybe_docs(doc: Vec<&'static str>) -> Vec<&'static str> { - if cfg!(feature = "no-metadata-docs") { - vec![] - } else { - doc - } - } - let readme = "Support code for the runtime.\n\nLicense: Apache-2.0\n"; let expected_pallet_doc = vec![" Pallet documentation", readme, readme]; @@ -2257,10 +2291,10 @@ fn pallet_on_chain_storage_version_initializes_correctly() { AllPalletsWithSystem, >; - // Simple example of a pallet with current version 10 being added to the runtime for the first + // Simple example of a pallet with in-code version 10 being added to the runtime for the first // time. TestExternalities::default().execute_with(|| { - let current_version = Example::current_storage_version(); + let in_code_version = Example::in_code_storage_version(); // Check the pallet has no storage items set. let pallet_hashed_prefix = twox_128(Example::name().as_bytes()); @@ -2271,14 +2305,14 @@ fn pallet_on_chain_storage_version_initializes_correctly() { // version. Executive::execute_on_runtime_upgrade(); - // Check that the storage version was initialized to the current version + // Check that the storage version was initialized to the in-code version let on_chain_version_after = StorageVersion::get::(); - assert_eq!(on_chain_version_after, current_version); + assert_eq!(on_chain_version_after, in_code_version); }); - // Pallet with no current storage version should have the on-chain version initialized to 0. + // Pallet with no in-code storage version should have the on-chain version initialized to 0. TestExternalities::default().execute_with(|| { - // Example4 current_storage_version is NoStorageVersionSet. + // Example4 in_code_storage_version is NoStorageVersionSet. // Check the pallet has no storage items set. let pallet_hashed_prefix = twox_128(Example4::name().as_bytes()); @@ -2308,7 +2342,7 @@ fn post_runtime_upgrade_detects_storage_version_issues() { impl OnRuntimeUpgrade for CustomUpgrade { fn on_runtime_upgrade() -> Weight { - Example2::current_storage_version().put::(); + Example2::in_code_storage_version().put::(); Default::default() } @@ -2351,14 +2385,14 @@ fn post_runtime_upgrade_detects_storage_version_issues() { >; TestExternalities::default().execute_with(|| { - // Set the on-chain version to one less than the current version for `Example`, simulating a + // Set the on-chain version to one less than the in-code version for `Example`, simulating a // forgotten migration StorageVersion::new(9).put::(); // The version isn't changed, we should detect it. assert!( Executive::try_runtime_upgrade(UpgradeCheckSelect::PreAndPost).unwrap_err() == - "On chain and current storage version do not match. Missing runtime upgrade?" + "On chain and in-code storage version do not match. Missing runtime upgrade?" .into() ); }); diff --git a/substrate/frame/support/test/tests/pallet_instance.rs b/substrate/frame/support/test/tests/pallet_instance.rs index f8cc97623b8de219900e5d436a2b00d8f3c6fa91..c79cdf93e97dc5a2f257ab9ba62a5d26e078b53f 100644 --- a/substrate/frame/support/test/tests/pallet_instance.rs +++ b/substrate/frame/support/test/tests/pallet_instance.rs @@ -296,7 +296,7 @@ pub mod pallet2 { } } -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Runtime { type BaseCallFilter = frame_support::traits::Everything; type RuntimeOrigin = RuntimeOrigin; diff --git a/substrate/frame/support/test/tests/pallet_outer_enums_explicit.rs b/substrate/frame/support/test/tests/pallet_outer_enums_explicit.rs index 79e9d6786717a5a27717cda754575c2ecd478aa3..6c71b544426512c54a4320452204b0a4b62e7764 100644 --- a/substrate/frame/support/test/tests/pallet_outer_enums_explicit.rs +++ b/substrate/frame/support/test/tests/pallet_outer_enums_explicit.rs @@ -25,7 +25,7 @@ pub type Header = sp_runtime::generic::Header; pub type UncheckedExtrinsic = sp_runtime::generic::UncheckedExtrinsic; -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Runtime { type BaseCallFilter = frame_support::traits::Everything; type Block = Block; @@ -82,7 +82,7 @@ fn module_error_outer_enum_expand_explicit() { // Check that all error types are propagated match RuntimeError::Example(pallet::Error::InsufficientProposersBalance) { - // Error passed implicitely to the pallet system. + // Error passed implicitly to the pallet system. RuntimeError::System(system) => match system { frame_system::Error::InvalidSpecName => (), frame_system::Error::SpecVersionNeedsToIncrease => (), @@ -90,6 +90,7 @@ fn module_error_outer_enum_expand_explicit() { frame_system::Error::NonDefaultComposite => (), frame_system::Error::NonZeroRefCount => (), frame_system::Error::CallFiltered => (), + frame_system::Error::MultiBlockMigrationsOngoing => (), #[cfg(feature = "experimental")] frame_system::Error::InvalidTask => (), #[cfg(feature = "experimental")] diff --git a/substrate/frame/support/test/tests/pallet_outer_enums_implicit.rs b/substrate/frame/support/test/tests/pallet_outer_enums_implicit.rs index 4bd8ee0bb39a574b2ff3f59b571c1209fc675da4..79828119742c106763b97096ffaed85acf7381da 100644 --- a/substrate/frame/support/test/tests/pallet_outer_enums_implicit.rs +++ b/substrate/frame/support/test/tests/pallet_outer_enums_implicit.rs @@ -25,7 +25,7 @@ pub type Header = sp_runtime::generic::Header; pub type UncheckedExtrinsic = sp_runtime::generic::UncheckedExtrinsic; -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Runtime { type BaseCallFilter = frame_support::traits::Everything; type Block = Block; @@ -62,11 +62,11 @@ frame_support::construct_runtime!( // Exclude part `Storage` in order not to check its metadata in tests. System: frame_system exclude_parts { Storage }, - // Pallet exposes `Error` implicitely. + // Pallet exposes `Error` implicitly. Example: common::outer_enums::pallet, Instance1Example: common::outer_enums::pallet::, - // Pallet exposes `Error` implicitely. + // Pallet exposes `Error` implicitly. Example2: common::outer_enums::pallet2, Instance1Example2: common::outer_enums::pallet2::, @@ -82,7 +82,7 @@ fn module_error_outer_enum_expand_implicit() { // Check that all error types are propagated match RuntimeError::Example(pallet::Error::InsufficientProposersBalance) { - // Error passed implicitely to the pallet system. + // Error passed implicitly to the pallet system. RuntimeError::System(system) => match system { frame_system::Error::InvalidSpecName => (), frame_system::Error::SpecVersionNeedsToIncrease => (), @@ -90,6 +90,7 @@ fn module_error_outer_enum_expand_implicit() { frame_system::Error::NonDefaultComposite => (), frame_system::Error::NonZeroRefCount => (), frame_system::Error::CallFiltered => (), + frame_system::Error::MultiBlockMigrationsOngoing => (), #[cfg(feature = "experimental")] frame_system::Error::InvalidTask => (), #[cfg(feature = "experimental")] diff --git a/substrate/frame/support/test/tests/pallet_ui/compare_unset_storage_version.rs b/substrate/frame/support/test/tests/pallet_ui/compare_unset_storage_version.rs index 840a6dee20ccc7a836619a1ef334cca6e22e7887..d2ca9fc80991a87dbb6f20323f07d8adcd29449d 100644 --- a/substrate/frame/support/test/tests/pallet_ui/compare_unset_storage_version.rs +++ b/substrate/frame/support/test/tests/pallet_ui/compare_unset_storage_version.rs @@ -29,7 +29,7 @@ mod pallet { #[pallet::hooks] impl Hooks> for Pallet { fn on_runtime_upgrade() -> Weight { - if Self::current_storage_version() != Self::on_chain_storage_version() { + if Self::in_code_storage_version() != Self::on_chain_storage_version() { } diff --git a/substrate/frame/support/test/tests/pallet_ui/compare_unset_storage_version.stderr b/substrate/frame/support/test/tests/pallet_ui/compare_unset_storage_version.stderr index 1b48197cc9ed1049ea0f52bb011fbc95654c59c0..3256e69528a2d28527ccfe1fa4d77dadfc77baa1 100644 --- a/substrate/frame/support/test/tests/pallet_ui/compare_unset_storage_version.stderr +++ b/substrate/frame/support/test/tests/pallet_ui/compare_unset_storage_version.stderr @@ -1,7 +1,7 @@ error[E0369]: binary operation `!=` cannot be applied to type `NoStorageVersionSet` --> tests/pallet_ui/compare_unset_storage_version.rs:32:39 | -32 | if Self::current_storage_version() != Self::on_chain_storage_version() { +32 | if Self::in_code_storage_version() != Self::on_chain_storage_version() { | ------------------------------- ^^ -------------------------------- StorageVersion | | | NoStorageVersionSet diff --git a/substrate/frame/support/test/tests/pallet_ui/deprecated_store_attr.stderr b/substrate/frame/support/test/tests/pallet_ui/deprecated_store_attr.stderr deleted file mode 100644 index e227033d3646bac74b23267531730e0a59ce06fb..0000000000000000000000000000000000000000 --- a/substrate/frame/support/test/tests/pallet_ui/deprecated_store_attr.stderr +++ /dev/null @@ -1,10 +0,0 @@ -error: use of deprecated struct `pallet::_::Store`: - Use of `#[pallet::generate_store(pub(super) trait Store)]` will be removed after July 2023. - Check https://github.com/paritytech/substrate/pull/13535 for more details. - --> tests/pallet_ui/deprecated_store_attr.rs:24:3 - | -24 | #[pallet::generate_store(trait Store)] - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | - = note: `-D deprecated` implied by `-D warnings` - = help: to override `-D warnings` add `#[allow(deprecated)]` diff --git a/substrate/frame/support/test/tests/pallet_ui/duplicate_store_attr.stderr b/substrate/frame/support/test/tests/pallet_ui/duplicate_store_attr.stderr deleted file mode 100644 index 864b399326e19ea96afa8d76ccf9815b057ceef6..0000000000000000000000000000000000000000 --- a/substrate/frame/support/test/tests/pallet_ui/duplicate_store_attr.stderr +++ /dev/null @@ -1,5 +0,0 @@ -error: Unexpected duplicated attribute - --> tests/pallet_ui/duplicate_store_attr.rs:29:3 - | -29 | #[pallet::generate_store(trait Store)] - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/substrate/frame/support/test/tests/pallet_ui/event_type_invalid_bound_no_frame_crate.rs b/substrate/frame/support/test/tests/pallet_ui/event_type_invalid_bound_no_frame_crate.rs index 573ceb6dfab7dcfe5fb677f50be2c0c5f7e119b5..b510beb54dda0eebce159b087cf0f3dbd338eb8e 100644 --- a/substrate/frame/support/test/tests/pallet_ui/event_type_invalid_bound_no_frame_crate.rs +++ b/substrate/frame/support/test/tests/pallet_ui/event_type_invalid_bound_no_frame_crate.rs @@ -17,13 +17,13 @@ #[frame_support::pallet] mod pallet { - use frame::deps::frame_system::pallet_prelude::BlockNumberFor; + use polkadot_sdk_frame::deps::frame_system::pallet_prelude::BlockNumberFor; use frame_support::pallet_prelude::{Hooks, IsType}; #[pallet::config] - pub trait Config: frame::deps::frame_system::Config { + pub trait Config: polkadot_sdk_frame::deps::frame_system::Config { type Bar: Clone + std::fmt::Debug + Eq; - type RuntimeEvent: IsType<::RuntimeEvent> + type RuntimeEvent: IsType<::RuntimeEvent> + From>; } diff --git a/substrate/frame/support/test/tests/pallet_ui/event_type_invalid_bound_no_frame_crate.stderr b/substrate/frame/support/test/tests/pallet_ui/event_type_invalid_bound_no_frame_crate.stderr index 0f805c972e4da5f1ecfc5a7836f259c6867f0741..384e44d97a617ba1dcbe88c689d39e439dbeeb07 100644 --- a/substrate/frame/support/test/tests/pallet_ui/event_type_invalid_bound_no_frame_crate.stderr +++ b/substrate/frame/support/test/tests/pallet_ui/event_type_invalid_bound_no_frame_crate.stderr @@ -1,5 +1,5 @@ error: Invalid `type RuntimeEvent`, associated type `RuntimeEvent` is reserved and must bound: `IsType<::RuntimeEvent>` --> tests/pallet_ui/event_type_invalid_bound_no_frame_crate.rs:26:3 | -26 | type RuntimeEvent: IsType<::RuntimeEvent> +26 | type RuntimeEvent: IsType<::RuntimeEvent> | ^^^^ diff --git a/substrate/frame/support/test/tests/pallet_ui/pallet_struct_invalid_attr.stderr b/substrate/frame/support/test/tests/pallet_ui/pallet_struct_invalid_attr.stderr index 33a2d1da78608c7d97e433d03c403cf4559a79b9..6f7f5617f7e5a8b40dc5e14f8684ccc256be1994 100644 --- a/substrate/frame/support/test/tests/pallet_ui/pallet_struct_invalid_attr.stderr +++ b/substrate/frame/support/test/tests/pallet_ui/pallet_struct_invalid_attr.stderr @@ -1,4 +1,4 @@ -error: expected one of: `generate_store`, `without_storage_info`, `storage_version` +error: expected `without_storage_info` or `storage_version` --> tests/pallet_ui/pallet_struct_invalid_attr.rs:24:12 | 24 | #[pallet::generate_storage_info] // invalid diff --git a/substrate/frame/support/test/tests/pallet_ui/pass/dev_mode_valid.rs b/substrate/frame/support/test/tests/pallet_ui/pass/dev_mode_valid.rs index 4dc33991b1260d3afb5969bcd37d070f192a0268..e4ea094d0692e2f39167da014e3c3185d997ac08 100644 --- a/substrate/frame/support/test/tests/pallet_ui/pass/dev_mode_valid.rs +++ b/substrate/frame/support/test/tests/pallet_ui/pass/dev_mode_valid.rs @@ -70,7 +70,7 @@ pub mod pallet { impl Pallet {} } -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Runtime { type BaseCallFilter = frame_support::traits::Everything; type RuntimeOrigin = RuntimeOrigin; diff --git a/substrate/frame/support/test/tests/pallet_ui/pass/inherited_call_weight3.rs b/substrate/frame/support/test/tests/pallet_ui/pass/inherited_call_weight3.rs index f40d1040858f5ba47c2ffb5817a02a1035b3a87b..ddccd0b3e192c4d89bc841bfbb2bf2412d82631d 100644 --- a/substrate/frame/support/test/tests/pallet_ui/pass/inherited_call_weight3.rs +++ b/substrate/frame/support/test/tests/pallet_ui/pass/inherited_call_weight3.rs @@ -18,7 +18,7 @@ use frame_support::pallet_prelude::*; use frame_system::pallet_prelude::*; -// If, for whatever reason, you dont to not use a `WeightInfo` trait - it will still work. +// If, for whatever reason, you don't to not use a `WeightInfo` trait - it will still work. struct Impl; impl Impl { diff --git a/substrate/frame/support/test/tests/pallet_ui/pass/no_std_genesis_config.rs b/substrate/frame/support/test/tests/pallet_ui/pass/no_std_genesis_config.rs index 7e67193cc76c56fe1df8d0f2fc85e6f79d841c1e..23e411e1a0946bb26f310546c88d4d7e020ad68b 100644 --- a/substrate/frame/support/test/tests/pallet_ui/pass/no_std_genesis_config.rs +++ b/substrate/frame/support/test/tests/pallet_ui/pass/no_std_genesis_config.rs @@ -27,7 +27,7 @@ pub type UncheckedExtrinsic = generic::UncheckedExtrinsic - Rc frame_support::sp_runtime::sp_application_crypto::sp_core::Bytes + Rc Arc = note: required for `Bar` to implement `Decode` = note: required for `Bar` to implement `FullCodec` @@ -65,8 +65,8 @@ error[E0277]: the trait bound `Bar: WrapperTypeEncode` is not satisfied bytes::bytes::Bytes Cow<'a, T> parity_scale_codec::Ref<'a, T, U> - Rc frame_support::sp_runtime::sp_application_crypto::sp_core::Bytes + Rc Arc Vec and $N others @@ -106,8 +106,8 @@ error[E0277]: the trait bound `Bar: WrapperTypeDecode` is not satisfied | = help: the following other types implement trait `WrapperTypeDecode`: Box - Rc frame_support::sp_runtime::sp_application_crypto::sp_core::Bytes + Rc Arc = note: required for `Bar` to implement `Decode` = note: required for `Bar` to implement `FullCodec` @@ -148,8 +148,8 @@ error[E0277]: the trait bound `Bar: WrapperTypeEncode` is not satisfied bytes::bytes::Bytes Cow<'a, T> parity_scale_codec::Ref<'a, T, U> - Rc frame_support::sp_runtime::sp_application_crypto::sp_core::Bytes + Rc Arc Vec and $N others @@ -168,8 +168,8 @@ error[E0277]: the trait bound `Bar: WrapperTypeDecode` is not satisfied | = help: the following other types implement trait `WrapperTypeDecode`: Box - Rc frame_support::sp_runtime::sp_application_crypto::sp_core::Bytes + Rc Arc = note: required for `Bar` to implement `Decode` = note: required for `Bar` to implement `FullCodec` @@ -210,8 +210,8 @@ error[E0277]: the trait bound `Bar: WrapperTypeEncode` is not satisfied bytes::bytes::Bytes Cow<'a, T> parity_scale_codec::Ref<'a, T, U> - Rc frame_support::sp_runtime::sp_application_crypto::sp_core::Bytes + Rc Arc Vec and $N others diff --git a/substrate/frame/support/test/tests/pallet_ui/storage_ensure_span_are_ok_on_wrong_gen_unnamed.stderr b/substrate/frame/support/test/tests/pallet_ui/storage_ensure_span_are_ok_on_wrong_gen_unnamed.stderr index 855d289d0a160e08e45fa0c3b9b50616fb9c8ade..13d761d65d2012d124279cdd857aac35fcec9ac0 100644 --- a/substrate/frame/support/test/tests/pallet_ui/storage_ensure_span_are_ok_on_wrong_gen_unnamed.stderr +++ b/substrate/frame/support/test/tests/pallet_ui/storage_ensure_span_are_ok_on_wrong_gen_unnamed.stderr @@ -13,8 +13,8 @@ error[E0277]: the trait bound `Bar: WrapperTypeDecode` is not satisfied | = help: the following other types implement trait `WrapperTypeDecode`: Box - Rc frame_support::sp_runtime::sp_application_crypto::sp_core::Bytes + Rc Arc = note: required for `Bar` to implement `Decode` = note: required for `Bar` to implement `FullCodec` @@ -65,8 +65,8 @@ error[E0277]: the trait bound `Bar: WrapperTypeEncode` is not satisfied bytes::bytes::Bytes Cow<'a, T> parity_scale_codec::Ref<'a, T, U> - Rc frame_support::sp_runtime::sp_application_crypto::sp_core::Bytes + Rc Arc Vec and $N others @@ -106,8 +106,8 @@ error[E0277]: the trait bound `Bar: WrapperTypeDecode` is not satisfied | = help: the following other types implement trait `WrapperTypeDecode`: Box - Rc frame_support::sp_runtime::sp_application_crypto::sp_core::Bytes + Rc Arc = note: required for `Bar` to implement `Decode` = note: required for `Bar` to implement `FullCodec` @@ -148,8 +148,8 @@ error[E0277]: the trait bound `Bar: WrapperTypeEncode` is not satisfied bytes::bytes::Bytes Cow<'a, T> parity_scale_codec::Ref<'a, T, U> - Rc frame_support::sp_runtime::sp_application_crypto::sp_core::Bytes + Rc Arc Vec and $N others @@ -168,8 +168,8 @@ error[E0277]: the trait bound `Bar: WrapperTypeDecode` is not satisfied | = help: the following other types implement trait `WrapperTypeDecode`: Box - Rc frame_support::sp_runtime::sp_application_crypto::sp_core::Bytes + Rc Arc = note: required for `Bar` to implement `Decode` = note: required for `Bar` to implement `FullCodec` @@ -210,8 +210,8 @@ error[E0277]: the trait bound `Bar: WrapperTypeEncode` is not satisfied bytes::bytes::Bytes Cow<'a, T> parity_scale_codec::Ref<'a, T, U> - Rc frame_support::sp_runtime::sp_application_crypto::sp_core::Bytes + Rc Arc Vec and $N others diff --git a/substrate/frame/support/test/tests/pallet_ui/storage_invalid_attribute.stderr b/substrate/frame/support/test/tests/pallet_ui/storage_invalid_attribute.stderr index 7f125526edf26abddf82f2228da9a510200f0735..519fadaa6049cb26430719379d3f9847b81efb62 100644 --- a/substrate/frame/support/test/tests/pallet_ui/storage_invalid_attribute.stderr +++ b/substrate/frame/support/test/tests/pallet_ui/storage_invalid_attribute.stderr @@ -1,4 +1,4 @@ -error: expected one of: `getter`, `storage_prefix`, `unbounded`, `whitelist_storage` +error: expected one of: `getter`, `storage_prefix`, `unbounded`, `whitelist_storage`, `disable_try_decode_storage` --> tests/pallet_ui/storage_invalid_attribute.rs:33:12 | 33 | #[pallet::generate_store(pub trait Store)] diff --git a/substrate/frame/support/test/tests/pallet_ui/store_trait_leak_private.stderr b/substrate/frame/support/test/tests/pallet_ui/store_trait_leak_private.stderr deleted file mode 100644 index ccb55122e8169e84f776dd41504738ab0f1772f5..0000000000000000000000000000000000000000 --- a/substrate/frame/support/test/tests/pallet_ui/store_trait_leak_private.stderr +++ /dev/null @@ -1,19 +0,0 @@ -error: use of deprecated struct `pallet::_::Store`: - Use of `#[pallet::generate_store(pub(super) trait Store)]` will be removed after July 2023. - Check https://github.com/paritytech/substrate/pull/13535 for more details. - --> tests/pallet_ui/store_trait_leak_private.rs:28:3 - | -28 | #[pallet::generate_store(pub trait Store)] - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | - = note: `-D deprecated` implied by `-D warnings` - = help: to override `-D warnings` add `#[allow(deprecated)]` - -error[E0446]: private type `_GeneratedPrefixForStorageFoo` in public interface - --> tests/pallet_ui/store_trait_leak_private.rs:28:37 - | -28 | #[pallet::generate_store(pub trait Store)] - | ^^^^^ can't leak private type -... -37 | #[pallet::storage] - | ------- `_GeneratedPrefixForStorageFoo` declared as private diff --git a/substrate/frame/support/test/tests/runtime.rs b/substrate/frame/support/test/tests/runtime.rs new file mode 100644 index 0000000000000000000000000000000000000000..7c2a8139a1345a4903766970a13bbf955aeef7c8 --- /dev/null +++ b/substrate/frame/support/test/tests/runtime.rs @@ -0,0 +1,993 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! General tests for construct_runtime macro, test for: +//! * error declared with decl_error works +//! * integrity test is generated + +#![recursion_limit = "128"] + +use codec::MaxEncodedLen; +use frame_support::{ + derive_impl, parameter_types, traits::PalletInfo as _, weights::RuntimeDbWeight, +}; +use frame_system::limits::{BlockLength, BlockWeights}; +use scale_info::TypeInfo; +use sp_core::{sr25519, ConstU64}; +use sp_runtime::{ + generic, + traits::{BlakeTwo256, ValidateUnsigned, Verify}, + DispatchError, ModuleError, +}; +use sp_version::RuntimeVersion; + +parameter_types! { + pub static IntegrityTestExec: u32 = 0; +} + +#[frame_support::pallet(dev_mode)] +mod module1 { + use frame_support::pallet_prelude::*; + use frame_system::pallet_prelude::*; + + #[pallet::pallet] + pub struct Pallet(_); + + #[pallet::config] + pub trait Config: frame_system::Config { + type RuntimeEvent: From> + + IsType<::RuntimeEvent>; + } + + #[pallet::call] + impl, I: 'static> Pallet { + pub fn fail(_origin: OriginFor) -> DispatchResult { + Err(Error::::Something.into()) + } + } + + #[pallet::origin] + #[derive(Clone, PartialEq, Eq, RuntimeDebug, Encode, Decode, MaxEncodedLen, TypeInfo)] + #[scale_info(skip_type_params(I))] + pub struct Origin(pub PhantomData<(T, I)>); + + #[pallet::event] + pub enum Event, I: 'static = ()> { + A(::AccountId), + } + + #[pallet::error] + pub enum Error { + Something, + } +} + +#[frame_support::pallet(dev_mode)] +mod module2 { + use super::*; + use frame_support::pallet_prelude::*; + use frame_system::pallet_prelude::*; + + #[pallet::pallet] + pub struct Pallet(_); + + #[pallet::config] + pub trait Config: frame_system::Config { + type RuntimeEvent: From> + IsType<::RuntimeEvent>; + } + + #[pallet::hooks] + impl Hooks> for Pallet { + fn integrity_test() { + IntegrityTestExec::mutate(|i| *i += 1); + } + } + + #[pallet::call] + impl Pallet { + pub fn fail(_origin: OriginFor) -> DispatchResult { + Err(Error::::Something.into()) + } + } + + #[pallet::origin] + #[derive(Clone, PartialEq, Eq, RuntimeDebug, Encode, Decode, MaxEncodedLen, TypeInfo)] + pub struct Origin; + + #[pallet::event] + pub enum Event { + A, + } + + #[pallet::error] + pub enum Error { + Something, + } +} + +mod nested { + use super::*; + + #[frame_support::pallet(dev_mode)] + pub mod module3 { + use super::*; + use frame_support::pallet_prelude::*; + use frame_system::pallet_prelude::*; + + #[pallet::pallet] + pub struct Pallet(_); + + #[pallet::config] + pub trait Config: frame_system::Config { + type RuntimeEvent: From> + + IsType<::RuntimeEvent>; + } + + #[pallet::hooks] + impl Hooks> for Pallet { + fn integrity_test() { + IntegrityTestExec::mutate(|i| *i += 1); + } + } + + #[pallet::call] + impl Pallet { + pub fn fail(_origin: OriginFor) -> DispatchResult { + Err(Error::::Something.into()) + } + } + + #[pallet::origin] + #[derive(Clone, PartialEq, Eq, RuntimeDebug, Encode, Decode, MaxEncodedLen, TypeInfo)] + pub struct Origin; + + #[pallet::event] + pub enum Event { + A, + } + + #[pallet::error] + pub enum Error { + Something, + } + + #[pallet::genesis_config] + #[derive(frame_support::DefaultNoBound)] + pub struct GenesisConfig { + #[serde(skip)] + pub _config: sp_std::marker::PhantomData, + } + + #[pallet::genesis_build] + impl BuildGenesisConfig for GenesisConfig { + fn build(&self) {} + } + + #[pallet::validate_unsigned] + impl ValidateUnsigned for Pallet { + type Call = Call; + fn validate_unsigned( + _source: TransactionSource, + _call: &Self::Call, + ) -> TransactionValidity { + Err(TransactionValidityError::Invalid(InvalidTransaction::Call)) + } + } + } +} + +#[frame_support::pallet(dev_mode)] +pub mod module3 { + use super::*; + use frame_support::pallet_prelude::*; + use frame_system::pallet_prelude::*; + + #[pallet::pallet] + pub struct Pallet(_); + + #[pallet::config] + pub trait Config: frame_system::Config { + type RuntimeEvent: From> + IsType<::RuntimeEvent>; + } + + #[pallet::call] + impl Pallet { + pub fn fail(_origin: OriginFor) -> DispatchResult { + Err(Error::::Something.into()) + } + pub fn aux_1(_origin: OriginFor, #[pallet::compact] _data: u32) -> DispatchResult { + unreachable!() + } + pub fn aux_2( + _origin: OriginFor, + _data: i32, + #[pallet::compact] _data2: u32, + ) -> DispatchResult { + unreachable!() + } + #[pallet::weight(0)] + pub fn aux_3(_origin: OriginFor, _data: i32, _data2: String) -> DispatchResult { + unreachable!() + } + #[pallet::weight(3)] + pub fn aux_4(_origin: OriginFor) -> DispatchResult { + unreachable!() + } + #[pallet::weight((5, DispatchClass::Operational))] + pub fn operational(_origin: OriginFor) -> DispatchResult { + unreachable!() + } + } + + #[pallet::origin] + #[derive(Clone, PartialEq, Eq, RuntimeDebug, Encode, Decode, MaxEncodedLen, TypeInfo)] + pub struct Origin(pub PhantomData); + + #[pallet::event] + pub enum Event { + A, + } + + #[pallet::error] + pub enum Error { + Something, + } + + #[pallet::genesis_config] + #[derive(frame_support::DefaultNoBound)] + pub struct GenesisConfig { + #[serde(skip)] + pub _config: sp_std::marker::PhantomData, + } + + #[pallet::genesis_build] + impl BuildGenesisConfig for GenesisConfig { + fn build(&self) {} + } + + #[pallet::storage] + pub type Storage = StorageValue<_, u32>; + + #[pallet::validate_unsigned] + impl ValidateUnsigned for Pallet { + type Call = Call; + fn validate_unsigned( + _source: TransactionSource, + _call: &Self::Call, + ) -> TransactionValidity { + Err(TransactionValidityError::Invalid(InvalidTransaction::Call)) + } + } +} + +pub type BlockNumber = u64; +pub type Signature = sr25519::Signature; +pub type AccountId = ::Signer; +pub type Header = generic::Header; +pub type UncheckedExtrinsic = generic::UncheckedExtrinsic; +pub type Block = generic::Block; + +#[frame_support::runtime] +mod runtime { + #[runtime::runtime] + #[runtime::derive( + RuntimeCall, + RuntimeEvent, + RuntimeError, + RuntimeOrigin, + RuntimeFreezeReason, + RuntimeHoldReason, + RuntimeSlashReason, + RuntimeLockId, + RuntimeTask + )] + pub struct Runtime; + + #[runtime::pallet_index(30)] + pub type System = frame_system + Pallet + Call + Event + Origin; + + #[runtime::pallet_index(31)] + pub type Module1_1 = module1; + + #[runtime::pallet_index(32)] + pub type Module2 = module2; + + #[runtime::pallet_index(33)] + pub type Module1_2 = module1; + + #[runtime::pallet_index(34)] + pub type NestedModule3 = nested::module3; + + #[runtime::pallet_index(35)] + #[runtime::disable_unsigned] + pub type Module3 = self::module3; + + #[runtime::pallet_index(6)] + #[runtime::disable_call] + pub type Module1_3 = module1; + + #[runtime::pallet_index(3)] + pub type Module1_4 = module1; + + #[runtime::pallet_index(4)] + #[runtime::disable_call] + pub type Module1_5 = module1; + + #[runtime::pallet_index(1)] + pub type Module1_6 = module1; + + #[runtime::pallet_index(2)] + pub type Module1_7 = module1; + + #[runtime::pallet_index(12)] + pub type Module1_8 = module1; + + #[runtime::pallet_index(13)] + pub type Module1_9 = module1; +} + +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] +impl frame_system::Config for Runtime { + type AccountId = AccountId; + type Lookup = sp_runtime::traits::IdentityLookup; + type BaseCallFilter = frame_support::traits::Everything; + type RuntimeOrigin = RuntimeOrigin; + type RuntimeCall = RuntimeCall; + type RuntimeEvent = RuntimeEvent; + type PalletInfo = PalletInfo; + type OnSetCode = (); + type Block = Block; + type BlockHashCount = ConstU64<10>; +} + +impl module1::Config for Runtime { + type RuntimeEvent = RuntimeEvent; +} +impl module1::Config for Runtime { + type RuntimeEvent = RuntimeEvent; +} +impl module1::Config for Runtime { + type RuntimeEvent = RuntimeEvent; +} +impl module1::Config for Runtime { + type RuntimeEvent = RuntimeEvent; +} +impl module1::Config for Runtime { + type RuntimeEvent = RuntimeEvent; +} +impl module1::Config for Runtime { + type RuntimeEvent = RuntimeEvent; +} +impl module1::Config for Runtime { + type RuntimeEvent = RuntimeEvent; +} +impl module1::Config for Runtime { + type RuntimeEvent = RuntimeEvent; +} +impl module1::Config for Runtime { + type RuntimeEvent = RuntimeEvent; +} +impl module2::Config for Runtime { + type RuntimeEvent = RuntimeEvent; +} +impl nested::module3::Config for Runtime { + type RuntimeEvent = RuntimeEvent; +} +impl module3::Config for Runtime { + type RuntimeEvent = RuntimeEvent; +} + +fn test_pub() -> AccountId { + AccountId::from_raw([0; 32]) +} + +#[test] +fn check_modules_error_type() { + sp_io::TestExternalities::default().execute_with(|| { + assert_eq!( + Module1_1::fail(frame_system::Origin::::Root.into()), + Err(DispatchError::Module(ModuleError { + index: 31, + error: [0; 4], + message: Some("Something") + })), + ); + assert_eq!( + Module2::fail(frame_system::Origin::::Root.into()), + Err(DispatchError::Module(ModuleError { + index: 32, + error: [0; 4], + message: Some("Something") + })), + ); + assert_eq!( + Module1_2::fail(frame_system::Origin::::Root.into()), + Err(DispatchError::Module(ModuleError { + index: 33, + error: [0; 4], + message: Some("Something") + })), + ); + assert_eq!( + NestedModule3::fail(frame_system::Origin::::Root.into()), + Err(DispatchError::Module(ModuleError { + index: 34, + error: [0; 4], + message: Some("Something") + })), + ); + assert_eq!( + Module1_3::fail(frame_system::Origin::::Root.into()), + Err(DispatchError::Module(ModuleError { + index: 6, + error: [0; 4], + message: Some("Something") + })), + ); + assert_eq!( + Module1_4::fail(frame_system::Origin::::Root.into()), + Err(DispatchError::Module(ModuleError { + index: 3, + error: [0; 4], + message: Some("Something") + })), + ); + assert_eq!( + Module1_5::fail(frame_system::Origin::::Root.into()), + Err(DispatchError::Module(ModuleError { + index: 4, + error: [0; 4], + message: Some("Something") + })), + ); + assert_eq!( + Module1_6::fail(frame_system::Origin::::Root.into()), + Err(DispatchError::Module(ModuleError { + index: 1, + error: [0; 4], + message: Some("Something") + })), + ); + assert_eq!( + Module1_7::fail(frame_system::Origin::::Root.into()), + Err(DispatchError::Module(ModuleError { + index: 2, + error: [0; 4], + message: Some("Something") + })), + ); + assert_eq!( + Module1_8::fail(frame_system::Origin::::Root.into()), + Err(DispatchError::Module(ModuleError { + index: 12, + error: [0; 4], + message: Some("Something") + })), + ); + assert_eq!( + Module1_9::fail(frame_system::Origin::::Root.into()), + Err(DispatchError::Module(ModuleError { + index: 13, + error: [0; 4], + message: Some("Something") + })), + ); + }) +} + +#[test] +fn integrity_test_works() { + __construct_runtime_integrity_test::runtime_integrity_tests(); + assert_eq!(IntegrityTestExec::get(), 2); +} + +#[test] +fn origin_codec() { + use codec::Encode; + + let origin = OriginCaller::system(frame_system::RawOrigin::None); + assert_eq!(origin.encode()[0], 30); + + let origin = OriginCaller::Module1_1(module1::Origin(Default::default())); + assert_eq!(origin.encode()[0], 31); + + let origin = OriginCaller::Module2(module2::Origin); + assert_eq!(origin.encode()[0], 32); + + let origin = OriginCaller::Module1_2(module1::Origin(Default::default())); + assert_eq!(origin.encode()[0], 33); + + let origin = OriginCaller::NestedModule3(nested::module3::Origin); + assert_eq!(origin.encode()[0], 34); + + let origin = OriginCaller::Module3(module3::Origin(Default::default())); + assert_eq!(origin.encode()[0], 35); + + let origin = OriginCaller::Module1_6(module1::Origin(Default::default())); + assert_eq!(origin.encode()[0], 1); + + let origin = OriginCaller::Module1_7(module1::Origin(Default::default())); + assert_eq!(origin.encode()[0], 2); + + let origin = OriginCaller::Module1_8(module1::Origin(Default::default())); + assert_eq!(origin.encode()[0], 12); + + let origin = OriginCaller::Module1_9(module1::Origin(Default::default())); + assert_eq!(origin.encode()[0], 13); +} + +#[test] +fn event_codec() { + use codec::Encode; + + let event = + frame_system::Event::::ExtrinsicSuccess { dispatch_info: Default::default() }; + assert_eq!(RuntimeEvent::from(event).encode()[0], 30); + + let event = module1::Event::::A(test_pub()); + assert_eq!(RuntimeEvent::from(event).encode()[0], 31); + + let event = module2::Event::A; + assert_eq!(RuntimeEvent::from(event).encode()[0], 32); + + let event = module1::Event::::A(test_pub()); + assert_eq!(RuntimeEvent::from(event).encode()[0], 33); + + let event = nested::module3::Event::A; + assert_eq!(RuntimeEvent::from(event).encode()[0], 34); + + let event = module3::Event::A; + assert_eq!(RuntimeEvent::from(event).encode()[0], 35); + + let event = module1::Event::::A(test_pub()); + assert_eq!(RuntimeEvent::from(event).encode()[0], 4); + + let event = module1::Event::::A(test_pub()); + assert_eq!(RuntimeEvent::from(event).encode()[0], 1); + + let event = module1::Event::::A(test_pub()); + assert_eq!(RuntimeEvent::from(event).encode()[0], 2); + + let event = module1::Event::::A(test_pub()); + assert_eq!(RuntimeEvent::from(event).encode()[0], 12); + + let event = module1::Event::::A(test_pub()); + assert_eq!(RuntimeEvent::from(event).encode()[0], 13); +} + +#[test] +fn call_codec() { + use codec::Encode; + assert_eq!(RuntimeCall::System(frame_system::Call::remark { remark: vec![1] }).encode()[0], 30); + assert_eq!(RuntimeCall::Module1_1(module1::Call::fail {}).encode()[0], 31); + assert_eq!(RuntimeCall::Module2(module2::Call::fail {}).encode()[0], 32); + assert_eq!(RuntimeCall::Module1_2(module1::Call::fail {}).encode()[0], 33); + assert_eq!(RuntimeCall::NestedModule3(nested::module3::Call::fail {}).encode()[0], 34); + assert_eq!(RuntimeCall::Module3(module3::Call::fail {}).encode()[0], 35); + assert_eq!(RuntimeCall::Module1_4(module1::Call::fail {}).encode()[0], 3); + assert_eq!(RuntimeCall::Module1_6(module1::Call::fail {}).encode()[0], 1); + assert_eq!(RuntimeCall::Module1_7(module1::Call::fail {}).encode()[0], 2); + assert_eq!(RuntimeCall::Module1_8(module1::Call::fail {}).encode()[0], 12); + assert_eq!(RuntimeCall::Module1_9(module1::Call::fail {}).encode()[0], 13); +} + +#[test] +fn call_compact_attr() { + use codec::Encode; + let call: module3::Call = module3::Call::aux_1 { data: 1 }; + let encoded = call.encode(); + assert_eq!(2, encoded.len()); + assert_eq!(vec![1, 4], encoded); + + let call: module3::Call = module3::Call::aux_2 { data: 1, data2: 2 }; + let encoded = call.encode(); + assert_eq!(6, encoded.len()); + assert_eq!(vec![2, 1, 0, 0, 0, 8], encoded); +} + +#[test] +fn call_encode_is_correct_and_decode_works() { + use codec::{Decode, Encode}; + let call: module3::Call = module3::Call::fail {}; + let encoded = call.encode(); + assert_eq!(vec![0], encoded); + let decoded = module3::Call::::decode(&mut &encoded[..]).unwrap(); + assert_eq!(decoded, call); + + let call: module3::Call = module3::Call::aux_3 { data: 32, data2: "hello".into() }; + let encoded = call.encode(); + assert_eq!(vec![3, 32, 0, 0, 0, 20, 104, 101, 108, 108, 111], encoded); + let decoded = module3::Call::::decode(&mut &encoded[..]).unwrap(); + assert_eq!(decoded, call); +} + +#[test] +fn call_weight_should_attach_to_call_enum() { + use frame_support::{ + dispatch::{DispatchClass, DispatchInfo, GetDispatchInfo, Pays}, + weights::Weight, + }; + // operational. + assert_eq!( + module3::Call::::operational {}.get_dispatch_info(), + DispatchInfo { + weight: Weight::from_parts(5, 0), + class: DispatchClass::Operational, + pays_fee: Pays::Yes + }, + ); + // custom basic + assert_eq!( + module3::Call::::aux_4 {}.get_dispatch_info(), + DispatchInfo { + weight: Weight::from_parts(3, 0), + class: DispatchClass::Normal, + pays_fee: Pays::Yes + }, + ); +} + +#[test] +fn call_name() { + use frame_support::traits::GetCallName; + let name = module3::Call::::aux_4 {}.get_call_name(); + assert_eq!("aux_4", name); +} + +#[test] +fn call_metadata() { + use frame_support::traits::{CallMetadata, GetCallMetadata}; + let call = RuntimeCall::Module3(module3::Call::::aux_4 {}); + let metadata = call.get_call_metadata(); + let expected = CallMetadata { function_name: "aux_4".into(), pallet_name: "Module3".into() }; + assert_eq!(metadata, expected); +} + +#[test] +fn get_call_names() { + use frame_support::traits::GetCallName; + let call_names = module3::Call::::get_call_names(); + assert_eq!(["fail", "aux_1", "aux_2", "aux_3", "aux_4", "operational"], call_names); +} + +#[test] +fn get_module_names() { + use frame_support::traits::GetCallMetadata; + let module_names = RuntimeCall::get_module_names(); + assert_eq!( + [ + "Module1_6", + "Module1_7", + "Module1_4", + "Module1_8", + "Module1_9", + "System", + "Module1_1", + "Module2", + "Module1_2", + "NestedModule3", + "Module3", + ], + module_names + ); +} + +#[test] +fn call_subtype_conversion() { + use frame_support::{dispatch::CallableCallFor, traits::IsSubType}; + let call = RuntimeCall::Module3(module3::Call::::fail {}); + let subcall: Option<&CallableCallFor> = call.is_sub_type(); + let subcall_none: Option<&CallableCallFor> = call.is_sub_type(); + assert_eq!(Some(&module3::Call::::fail {}), subcall); + assert_eq!(None, subcall_none); + + let from = RuntimeCall::from(subcall.unwrap().clone()); + assert_eq!(from, call); +} + +#[test] +fn test_metadata() { + use frame_metadata::{ + v14::{StorageEntryType::Plain, *}, + *, + }; + use scale_info::meta_type; + use sp_core::Encode; + use sp_metadata_ir::StorageEntryModifierIR::Optional; + + fn maybe_docs(doc: Vec<&'static str>) -> Vec<&'static str> { + if cfg!(feature = "no-metadata-docs") { + vec![] + } else { + doc + } + } + + let pallets = vec![ + PalletMetadata { + name: "Module1_6", + storage:None, + calls: Some(meta_type::>().into()), + event: Some(meta_type::>().into()), + constants: vec![], + error: Some(meta_type::>().into()), + index: 1, + }, + PalletMetadata { + name: "Module1_7", + storage: None, + calls: Some(meta_type::>().into()), + event: Some(meta_type::>().into()), + constants: vec![], + error: Some(meta_type::>().into()), + index: 2, + }, + PalletMetadata { + name: "Module1_4", + storage: None, + calls: Some(meta_type::>().into()), + event: Some(meta_type::>().into()), + constants: vec![], + error: Some(meta_type::>().into()), + index: 3, + }, + PalletMetadata { + name: "Module1_5", + storage: None, + calls: None, + event: Some(meta_type::>().into()), + constants: vec![], + error: Some(meta_type::>().into()), + index: 4, + }, + PalletMetadata { + name: "Module1_3", + storage: None, + calls: None, + event: Some(meta_type::>().into()), + constants: vec![], + error: Some(meta_type::>().into()), + index: 6, + }, + PalletMetadata { + name: "Module1_8", + storage: None, + calls: Some(meta_type::>().into()), + event: Some(meta_type::>().into()), + constants: vec![], + error: Some(meta_type::>().into()), + index: 12, + }, + PalletMetadata { + name: "Module1_9", + storage: None, + calls: Some(meta_type::>().into()), + event: Some(meta_type::>().into()), + constants: vec![], + error: Some(meta_type::>().into()), + index: 13, + }, + PalletMetadata { + name: "System", + storage: None, + calls: Some(meta_type::>().into()), + event: Some(meta_type::>().into()), + constants: vec![ + PalletConstantMetadata { + name: "BlockWeights", + ty: meta_type::(), + value: BlockWeights::default().encode(), + docs: maybe_docs(vec![" Block & extrinsics weights: base values and limits."]), + }, + PalletConstantMetadata { + name: "BlockLength", + ty: meta_type::(), + value: BlockLength::default().encode(), + docs: maybe_docs(vec![" The maximum length of a block (in bytes)."]), + }, + PalletConstantMetadata { + name: "BlockHashCount", + ty: meta_type::(), + value: 10u64.encode(), + docs: maybe_docs(vec![" Maximum number of block number to block hash mappings to keep (oldest pruned first)."]), + }, + PalletConstantMetadata { + name: "DbWeight", + ty: meta_type::(), + value: RuntimeDbWeight::default().encode(), + docs: maybe_docs(vec![" The weight of runtime database operations the runtime can invoke.",]), + }, + PalletConstantMetadata { + name: "Version", + ty: meta_type::(), + value: RuntimeVersion::default().encode(), + docs: maybe_docs(vec![ " Get the chain's in-code version."]), + }, + PalletConstantMetadata { + name: "SS58Prefix", + ty: meta_type::(), + value: 0u16.encode(), + docs: maybe_docs(vec![ + " The designated SS58 prefix of this chain.", + "", + " This replaces the \"ss58Format\" property declared in the chain spec. Reason is", + " that the runtime should know about the prefix in order to make use of it as", + " an identifier of the chain.", + ]), + }, + ], + error: Some(meta_type::>().into()), + index: 30, + }, + PalletMetadata { + name: "Module1_1", + storage: None, + calls: Some(meta_type::>().into()), + event: Some(meta_type::>().into()), + constants: vec![], + error: Some(meta_type::>().into()), + index: 31, + }, + PalletMetadata { + name: "Module2", + storage: None, + calls: Some(meta_type::>().into()), + event: Some(meta_type::>().into()), + constants: vec![], + error: Some(meta_type::>().into()), + index: 32, + }, + PalletMetadata { + name: "Module1_2", + storage: None, + calls: Some(meta_type::>().into()), + event: Some(meta_type::>().into()), + constants: vec![], + error: Some(meta_type::>().into()), + index: 33, + }, + PalletMetadata { + name: "NestedModule3", + storage: None, + calls: Some(meta_type::>().into()), + event: Some(meta_type::>().into()), + constants: vec![], + error: Some(meta_type::>().into()), + index: 34, + }, + PalletMetadata { + name: "Module3", + storage: Some(PalletStorageMetadata { + prefix: "Module3", + entries: vec![ + StorageEntryMetadata { + name: "Storage", + modifier: Optional.into(), + ty: Plain(meta_type::().into()), + default: vec![0], + docs: vec![], + }, + ] + }), + calls: Some(meta_type::>().into()), + event: Some(meta_type::>().into()), + constants: vec![], + error: Some(meta_type::>().into()), + index: 35, + }, + ]; + + let extrinsic = ExtrinsicMetadata { + ty: meta_type::(), + version: 4, + signed_extensions: vec![SignedExtensionMetadata { + identifier: "UnitSignedExtension", + ty: meta_type::<()>(), + additional_signed: meta_type::<()>(), + }], + }; + + let expected_metadata: RuntimeMetadataPrefixed = + RuntimeMetadataLastVersion::new(pallets, extrinsic, meta_type::()).into(); + let actual_metadata = Runtime::metadata(); + + pretty_assertions::assert_eq!(actual_metadata, expected_metadata); +} + +#[test] +fn pallet_in_runtime_is_correct() { + assert_eq!(PalletInfo::index::().unwrap(), 30); + assert_eq!(PalletInfo::name::().unwrap(), "System"); + assert_eq!(PalletInfo::module_name::().unwrap(), "frame_system"); + assert!(PalletInfo::crate_version::().is_some()); + + assert_eq!(PalletInfo::index::().unwrap(), 31); + assert_eq!(PalletInfo::name::().unwrap(), "Module1_1"); + assert_eq!(PalletInfo::module_name::().unwrap(), "module1"); + assert!(PalletInfo::crate_version::().is_some()); + + assert_eq!(PalletInfo::index::().unwrap(), 32); + assert_eq!(PalletInfo::name::().unwrap(), "Module2"); + assert_eq!(PalletInfo::module_name::().unwrap(), "module2"); + assert!(PalletInfo::crate_version::().is_some()); + + assert_eq!(PalletInfo::index::().unwrap(), 33); + assert_eq!(PalletInfo::name::().unwrap(), "Module1_2"); + assert_eq!(PalletInfo::module_name::().unwrap(), "module1"); + assert!(PalletInfo::crate_version::().is_some()); + + assert_eq!(PalletInfo::index::().unwrap(), 34); + assert_eq!(PalletInfo::name::().unwrap(), "NestedModule3"); + assert_eq!(PalletInfo::module_name::().unwrap(), "nested::module3"); + assert!(PalletInfo::crate_version::().is_some()); + + assert_eq!(PalletInfo::index::().unwrap(), 35); + assert_eq!(PalletInfo::name::().unwrap(), "Module3"); + assert_eq!(PalletInfo::module_name::().unwrap(), "self::module3"); + assert!(PalletInfo::crate_version::().is_some()); + + assert_eq!(PalletInfo::index::().unwrap(), 6); + assert_eq!(PalletInfo::name::().unwrap(), "Module1_3"); + assert_eq!(PalletInfo::module_name::().unwrap(), "module1"); + assert!(PalletInfo::crate_version::().is_some()); + + assert_eq!(PalletInfo::index::().unwrap(), 3); + assert_eq!(PalletInfo::name::().unwrap(), "Module1_4"); + assert_eq!(PalletInfo::module_name::().unwrap(), "module1"); + assert!(PalletInfo::crate_version::().is_some()); + + assert_eq!(PalletInfo::index::().unwrap(), 4); + assert_eq!(PalletInfo::name::().unwrap(), "Module1_5"); + assert_eq!(PalletInfo::module_name::().unwrap(), "module1"); + assert!(PalletInfo::crate_version::().is_some()); + + assert_eq!(PalletInfo::index::().unwrap(), 1); + assert_eq!(PalletInfo::name::().unwrap(), "Module1_6"); + assert_eq!(PalletInfo::module_name::().unwrap(), "module1"); + assert!(PalletInfo::crate_version::().is_some()); + + assert_eq!(PalletInfo::index::().unwrap(), 2); + assert_eq!(PalletInfo::name::().unwrap(), "Module1_7"); + assert_eq!(PalletInfo::module_name::().unwrap(), "module1"); + assert!(PalletInfo::crate_version::().is_some()); + + assert_eq!(PalletInfo::index::().unwrap(), 12); + assert_eq!(PalletInfo::name::().unwrap(), "Module1_8"); + assert_eq!(PalletInfo::module_name::().unwrap(), "module1"); + assert!(PalletInfo::crate_version::().is_some()); + + assert_eq!(PalletInfo::index::().unwrap(), 13); + assert_eq!(PalletInfo::name::().unwrap(), "Module1_9"); + assert_eq!(PalletInfo::module_name::().unwrap(), "module1"); + assert!(PalletInfo::crate_version::().is_some()); +} + +#[test] +fn test_validate_unsigned() { + use frame_support::pallet_prelude::*; + + let call = RuntimeCall::NestedModule3(nested::module3::Call::fail {}); + let validity = Runtime::validate_unsigned(TransactionSource::Local, &call).unwrap_err(); + assert_eq!(validity, TransactionValidityError::Invalid(InvalidTransaction::Call)); + + let call = RuntimeCall::Module3(module3::Call::fail {}); + let validity = Runtime::validate_unsigned(TransactionSource::Local, &call).unwrap_err(); + assert_eq!( + validity, + TransactionValidityError::Unknown(UnknownTransaction::NoUnsignedValidator) + ); +} diff --git a/substrate/frame/support/test/tests/construct_runtime.rs b/substrate/frame/support/test/tests/runtime_legacy_ordering.rs similarity index 89% rename from substrate/frame/support/test/tests/construct_runtime.rs rename to substrate/frame/support/test/tests/runtime_legacy_ordering.rs index b8341b25cb0985915706ccb68b870474118d33cb..4c7012dca14979f0ed7f560bdc339146a676caa3 100644 --- a/substrate/frame/support/test/tests/construct_runtime.rs +++ b/substrate/frame/support/test/tests/runtime_legacy_ordering.rs @@ -30,7 +30,7 @@ use scale_info::TypeInfo; use sp_core::{sr25519, ConstU64}; use sp_runtime::{ generic, - traits::{BlakeTwo256, Verify}, + traits::{BlakeTwo256, ValidateUnsigned, Verify}, DispatchError, ModuleError, }; use sp_version::RuntimeVersion; @@ -176,6 +176,17 @@ mod nested { impl BuildGenesisConfig for GenesisConfig { fn build(&self) {} } + + #[pallet::validate_unsigned] + impl ValidateUnsigned for Pallet { + type Call = Call; + fn validate_unsigned( + _source: TransactionSource, + _call: &Self::Call, + ) -> TransactionValidity { + Err(TransactionValidityError::Invalid(InvalidTransaction::Call)) + } + } } } @@ -247,6 +258,20 @@ pub mod module3 { impl BuildGenesisConfig for GenesisConfig { fn build(&self) {} } + + #[pallet::storage] + pub type Storage = StorageValue<_, u32>; + + #[pallet::validate_unsigned] + impl ValidateUnsigned for Pallet { + type Call = Call; + fn validate_unsigned( + _source: TransactionSource, + _call: &Self::Call, + ) -> TransactionValidity { + Err(TransactionValidityError::Invalid(InvalidTransaction::Call)) + } + } } pub type BlockNumber = u64; @@ -256,24 +281,64 @@ pub type Header = generic::Header; pub type UncheckedExtrinsic = generic::UncheckedExtrinsic; pub type Block = generic::Block; -frame_support::construct_runtime!( - pub struct Runtime - { - System: frame_system::{Pallet, Call, Event, Origin} = 30, - Module1_1: module1::::{Pallet, Call, Storage, Event, Origin}, - Module2: module2::{Pallet, Call, Storage, Event, Origin}, - Module1_2: module1::::{Pallet, Call, Storage, Event, Origin}, - NestedModule3: nested::module3::{Pallet, Call, Config, Storage, Event, Origin}, - Module3: self::module3::{Pallet, Call, Config, Storage, Event, Origin}, - Module1_3: module1::::{Pallet, Storage, Event } = 6, - Module1_4: module1::::{Pallet, Call, Event } = 3, - Module1_5: module1::::{Pallet, Event}, - Module1_6: module1::::{Pallet, Call, Storage, Event, Origin} = 1, - Module1_7: module1::::{Pallet, Call, Storage, Event, Origin}, - Module1_8: module1::::{Pallet, Call, Storage, Event, Origin} = 12, - Module1_9: module1::::{Pallet, Call, Storage, Event, Origin}, - } -); +#[frame_support::runtime(legacy_ordering)] +mod runtime { + #[runtime::runtime] + #[runtime::derive( + RuntimeCall, + RuntimeEvent, + RuntimeError, + RuntimeOrigin, + RuntimeFreezeReason, + RuntimeHoldReason, + RuntimeSlashReason, + RuntimeLockId, + RuntimeTask + )] + pub struct Runtime; + + #[runtime::pallet_index(30)] + pub type System = frame_system + Pallet + Call + Event + Origin; + + #[runtime::pallet_index(31)] + pub type Module1_1 = module1; + + #[runtime::pallet_index(32)] + pub type Module2 = module2; + + #[runtime::pallet_index(33)] + pub type Module1_2 = module1; + + #[runtime::pallet_index(34)] + pub type NestedModule3 = nested::module3; + + #[runtime::pallet_index(35)] + #[runtime::disable_unsigned] + pub type Module3 = self::module3; + + #[runtime::pallet_index(6)] + #[runtime::disable_call] + pub type Module1_3 = module1; + + #[runtime::pallet_index(3)] + pub type Module1_4 = module1; + + #[runtime::pallet_index(4)] + #[runtime::disable_call] + pub type Module1_5 = module1; + + #[runtime::pallet_index(1)] + pub type Module1_6 = module1; + + #[runtime::pallet_index(2)] + pub type Module1_7 = module1; + + #[runtime::pallet_index(12)] + pub type Module1_8 = module1; + + #[runtime::pallet_index(13)] + pub type Module1_9 = module1; +} #[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] impl frame_system::Config for Runtime { @@ -636,9 +701,13 @@ fn call_subtype_conversion() { #[test] fn test_metadata() { - use frame_metadata::{v14::*, *}; + use frame_metadata::{ + v14::{StorageEntryType::Plain, *}, + *, + }; use scale_info::meta_type; use sp_core::Encode; + use sp_metadata_ir::StorageEntryModifierIR::Optional; fn maybe_docs(doc: Vec<&'static str>) -> Vec<&'static str> { if cfg!(feature = "no-metadata-docs") { @@ -683,7 +752,7 @@ fn test_metadata() { name: "Version", ty: meta_type::(), value: RuntimeVersion::default().encode(), - docs: maybe_docs(vec![ " Get the chain's current version."]), + docs: maybe_docs(vec![ " Get the chain's in-code version."]), }, PalletConstantMetadata { name: "SS58Prefix", @@ -703,7 +772,7 @@ fn test_metadata() { }, PalletMetadata { name: "Module1_1", - storage: Some(PalletStorageMetadata { prefix: "Module1_1", entries: vec![] }), + storage: None, calls: Some(meta_type::>().into()), event: Some(meta_type::>().into()), constants: vec![], @@ -712,7 +781,7 @@ fn test_metadata() { }, PalletMetadata { name: "Module2", - storage: Some(PalletStorageMetadata { prefix: "Module2", entries: vec![] }), + storage: None, calls: Some(meta_type::>().into()), event: Some(meta_type::>().into()), constants: vec![], @@ -721,7 +790,7 @@ fn test_metadata() { }, PalletMetadata { name: "Module1_2", - storage: Some(PalletStorageMetadata { prefix: "Module1_2", entries: vec![] }), + storage: None, calls: Some(meta_type::>().into()), event: Some(meta_type::>().into()), constants: vec![], @@ -730,7 +799,7 @@ fn test_metadata() { }, PalletMetadata { name: "NestedModule3", - storage: Some(PalletStorageMetadata { prefix: "NestedModule3", entries: vec![] }), + storage: None, calls: Some(meta_type::>().into()), event: Some(meta_type::>().into()), constants: vec![], @@ -739,7 +808,18 @@ fn test_metadata() { }, PalletMetadata { name: "Module3", - storage: Some(PalletStorageMetadata { prefix: "Module3", entries: vec![] }), + storage: Some(PalletStorageMetadata { + prefix: "Module3", + entries: vec![ + StorageEntryMetadata { + name: "Storage", + modifier: Optional.into(), + ty: Plain(meta_type::().into()), + default: vec![0], + docs: vec![], + }, + ] + }), calls: Some(meta_type::>().into()), event: Some(meta_type::>().into()), constants: vec![], @@ -748,7 +828,7 @@ fn test_metadata() { }, PalletMetadata { name: "Module1_3", - storage: Some(PalletStorageMetadata { prefix: "Module1_3", entries: vec![] }), + storage: None, calls: None, event: Some(meta_type::>().into()), constants: vec![], @@ -775,7 +855,7 @@ fn test_metadata() { }, PalletMetadata { name: "Module1_6", - storage: Some(PalletStorageMetadata { prefix: "Module1_6", entries: vec![] }), + storage:None, calls: Some(meta_type::>().into()), event: Some(meta_type::>().into()), constants: vec![], @@ -784,7 +864,7 @@ fn test_metadata() { }, PalletMetadata { name: "Module1_7", - storage: Some(PalletStorageMetadata { prefix: "Module1_7", entries: vec![] }), + storage: None, calls: Some(meta_type::>().into()), event: Some(meta_type::>().into()), constants: vec![], @@ -793,7 +873,7 @@ fn test_metadata() { }, PalletMetadata { name: "Module1_8", - storage: Some(PalletStorageMetadata { prefix: "Module1_8", entries: vec![] }), + storage: None, calls: Some(meta_type::>().into()), event: Some(meta_type::>().into()), constants: vec![], @@ -802,7 +882,7 @@ fn test_metadata() { }, PalletMetadata { name: "Module1_9", - storage: Some(PalletStorageMetadata { prefix: "Module1_9", entries: vec![] }), + storage: None, calls: Some(meta_type::>().into()), event: Some(meta_type::>().into()), constants: vec![], @@ -895,3 +975,19 @@ fn pallet_in_runtime_is_correct() { assert_eq!(PalletInfo::module_name::().unwrap(), "module1"); assert!(PalletInfo::crate_version::().is_some()); } + +#[test] +fn test_validate_unsigned() { + use frame_support::pallet_prelude::*; + + let call = RuntimeCall::NestedModule3(nested::module3::Call::fail {}); + let validity = Runtime::validate_unsigned(TransactionSource::Local, &call).unwrap_err(); + assert_eq!(validity, TransactionValidityError::Invalid(InvalidTransaction::Call)); + + let call = RuntimeCall::Module3(module3::Call::fail {}); + let validity = Runtime::validate_unsigned(TransactionSource::Local, &call).unwrap_err(); + assert_eq!( + validity, + TransactionValidityError::Unknown(UnknownTransaction::NoUnsignedValidator) + ); +} diff --git a/substrate/frame/support/test/tests/runtime_metadata.rs b/substrate/frame/support/test/tests/runtime_metadata.rs index bb7f7d2822e7cf1a15c41de1ca47686dd8440bfc..819ec176d2b13c3fb5c90290339ef328a4c523ff 100644 --- a/substrate/frame/support/test/tests/runtime_metadata.rs +++ b/substrate/frame/support/test/tests/runtime_metadata.rs @@ -27,7 +27,7 @@ pub type Header = sp_runtime::generic::Header; pub type UncheckedExtrinsic = sp_runtime::generic::UncheckedExtrinsic; -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Runtime { type BlockWeights = (); type BlockLength = (); @@ -101,7 +101,7 @@ sp_api::impl_runtime_apis! { fn execute_block(_: Block) { unimplemented!() } - fn initialize_block(_: &::Header) { + fn initialize_block(_: &::Header) -> sp_runtime::ExtrinsicInclusionMode { unimplemented!() } } @@ -200,8 +200,8 @@ fn runtime_metadata() { name: "header", ty: meta_type::<&::Header>(), }], - output: meta_type::<()>(), - docs: maybe_docs(vec![" Initialize a block with the given header."]), + output: meta_type::(), + docs: maybe_docs(vec![" Initialize a block with the given header and return the runtime executive mode."]), }, ], docs: maybe_docs(vec![ diff --git a/substrate/frame/support/test/tests/runtime_ui.rs b/substrate/frame/support/test/tests/runtime_ui.rs new file mode 100644 index 0000000000000000000000000000000000000000..dbe150f38ed6a3b6a45ac58e288b65c397c671f9 --- /dev/null +++ b/substrate/frame/support/test/tests/runtime_ui.rs @@ -0,0 +1,36 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#[rustversion::attr(not(stable), ignore)] +#[cfg(not(feature = "disable-ui-tests"))] +#[test] +fn ui() { + // Only run the ui tests when `RUN_UI_TESTS` is set. + if std::env::var("RUN_UI_TESTS").is_err() { + return + } + + // As trybuild is using `cargo check`, we don't need the real WASM binaries. + std::env::set_var("SKIP_WASM_BUILD", "1"); + + // Deny all warnings since we emit warnings as part of a Runtime's UI. + std::env::set_var("RUSTFLAGS", "--deny warnings"); + + let t = trybuild::TestCases::new(); + t.compile_fail("tests/runtime_ui/*.rs"); + t.pass("tests/runtime_ui/pass/*.rs"); +} diff --git a/substrate/frame/support/test/tests/runtime_ui/can_only_be_attached_to_mod.rs b/substrate/frame/support/test/tests/runtime_ui/can_only_be_attached_to_mod.rs new file mode 100644 index 0000000000000000000000000000000000000000..eb5868090418a3e10320cc4394c565d054926710 --- /dev/null +++ b/substrate/frame/support/test/tests/runtime_ui/can_only_be_attached_to_mod.rs @@ -0,0 +1,21 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#[frame_support::runtime] +fn construct_runtime() {} + +fn main() {} diff --git a/substrate/frame/support/test/tests/runtime_ui/can_only_be_attached_to_mod.stderr b/substrate/frame/support/test/tests/runtime_ui/can_only_be_attached_to_mod.stderr new file mode 100644 index 0000000000000000000000000000000000000000..7c2f0d1f1699502c8847f308e7978d988552cc47 --- /dev/null +++ b/substrate/frame/support/test/tests/runtime_ui/can_only_be_attached_to_mod.stderr @@ -0,0 +1,5 @@ +error: expected `mod` + --> tests/runtime_ui/can_only_be_attached_to_mod.rs:19:1 + | +19 | fn construct_runtime() {} + | ^^ diff --git a/substrate/frame/support/test/tests/pallet_ui/store_trait_leak_private.rs b/substrate/frame/support/test/tests/runtime_ui/conflicting_pallet_index.rs similarity index 58% rename from substrate/frame/support/test/tests/pallet_ui/store_trait_leak_private.rs rename to substrate/frame/support/test/tests/runtime_ui/conflicting_pallet_index.rs index 55dd315fb297cdf55802e25f48b53364b394dd3d..648812b52c4fe8b307b93a4e702b1ff98547e613 100644 --- a/substrate/frame/support/test/tests/pallet_ui/store_trait_leak_private.rs +++ b/substrate/frame/support/test/tests/runtime_ui/conflicting_pallet_index.rs @@ -17,26 +17,27 @@ #[frame_support::pallet] mod pallet { - use frame_support::pallet_prelude::Hooks; - use frame_system::pallet_prelude::BlockNumberFor; - use frame_support::pallet_prelude::StorageValue; + #[pallet::config] + pub trait Config: frame_system::Config {} - #[pallet::config] - pub trait Config: frame_system::Config {} + #[pallet::pallet] + pub struct Pallet(_); - #[pallet::pallet] - #[pallet::generate_store(pub trait Store)] - pub struct Pallet(core::marker::PhantomData); + #[pallet::call] + impl Pallet {} +} - #[pallet::hooks] - impl Hooks> for Pallet {} +#[frame_support::runtime] +mod runtime { + #[runtime::runtime] + #[runtime::derive(RuntimeCall)] + pub struct Runtime; - #[pallet::call] - impl Pallet {} + #[runtime::pallet_index(0)] + pub type System = frame_system; - #[pallet::storage] - type Foo = StorageValue<_, u8>; + #[runtime::pallet_index(0)] + pub type Pallet = pallet; } -fn main() { -} +fn main() {} diff --git a/substrate/frame/support/test/tests/runtime_ui/conflicting_pallet_index.stderr b/substrate/frame/support/test/tests/runtime_ui/conflicting_pallet_index.stderr new file mode 100644 index 0000000000000000000000000000000000000000..8963c5d3f265d1efb6be5fb1b820285f86d4245b --- /dev/null +++ b/substrate/frame/support/test/tests/runtime_ui/conflicting_pallet_index.stderr @@ -0,0 +1,11 @@ +error: Pallet indices are conflicting: Both pallets System and Pallet are at index 0 + --> tests/runtime_ui/conflicting_pallet_index.rs:37:14 + | +37 | pub type System = frame_system; + | ^^^^^^ + +error: Pallet indices are conflicting: Both pallets System and Pallet are at index 0 + --> tests/runtime_ui/conflicting_pallet_index.rs:40:14 + | +40 | pub type Pallet = pallet; + | ^^^^^^ diff --git a/substrate/frame/support/test/tests/runtime_ui/conflicting_pallet_name.rs b/substrate/frame/support/test/tests/runtime_ui/conflicting_pallet_name.rs new file mode 100644 index 0000000000000000000000000000000000000000..c68f9a8082b47fcd3bf306187c8f511392baf95b --- /dev/null +++ b/substrate/frame/support/test/tests/runtime_ui/conflicting_pallet_name.rs @@ -0,0 +1,43 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#[frame_support::pallet] +mod pallet { + #[pallet::config] + pub trait Config: frame_system::Config {} + + #[pallet::pallet] + pub struct Pallet(_); + + #[pallet::call] + impl Pallet {} +} + +#[frame_support::runtime] +mod runtime { + #[runtime::runtime] + #[runtime::derive(RuntimeCall)] + pub struct Runtime; + + #[runtime::pallet_index(0)] + pub type System = frame_system; + + #[runtime::pallet_index(1)] + pub type System = pallet; +} + +fn main() {} diff --git a/substrate/frame/support/test/tests/runtime_ui/conflicting_pallet_name.stderr b/substrate/frame/support/test/tests/runtime_ui/conflicting_pallet_name.stderr new file mode 100644 index 0000000000000000000000000000000000000000..c250c24e3e704136e380f91b0e74eb3c4fd4d7b7 --- /dev/null +++ b/substrate/frame/support/test/tests/runtime_ui/conflicting_pallet_name.stderr @@ -0,0 +1,11 @@ +error: Two pallets with the same name! + --> tests/runtime_ui/conflicting_pallet_name.rs:37:14 + | +37 | pub type System = frame_system; + | ^^^^^^ + +error: Two pallets with the same name! + --> tests/runtime_ui/conflicting_pallet_name.rs:40:14 + | +40 | pub type System = pallet; + | ^^^^^^ diff --git a/substrate/frame/support/test/tests/runtime_ui/invalid_attribute.rs b/substrate/frame/support/test/tests/runtime_ui/invalid_attribute.rs new file mode 100644 index 0000000000000000000000000000000000000000..5df2491cb24ba15000324efdb853e7e38af1b774 --- /dev/null +++ b/substrate/frame/support/test/tests/runtime_ui/invalid_attribute.rs @@ -0,0 +1,23 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#[frame_support::runtime(dummy)] +mod runtime { + +} + +fn main() {} diff --git a/substrate/frame/support/test/tests/runtime_ui/invalid_attribute.stderr b/substrate/frame/support/test/tests/runtime_ui/invalid_attribute.stderr new file mode 100644 index 0000000000000000000000000000000000000000..e13552413c00a094bf37cb54f0f21db4e0030231 --- /dev/null +++ b/substrate/frame/support/test/tests/runtime_ui/invalid_attribute.stderr @@ -0,0 +1,5 @@ +error: Invalid runtime macro call: unexpected attribute. Macro call must be bare, such as `#[frame_support::runtime]` or `#[runtime]`, or must specify the `legacy_ordering` attribute, such as `#[frame_support::runtime(legacy_ordering)]` or #[runtime(legacy_ordering)]. + --> tests/runtime_ui/invalid_attribute.rs:18:26 + | +18 | #[frame_support::runtime(dummy)] + | ^^^^^ diff --git a/substrate/frame/support/test/tests/runtime_ui/invalid_pallet_index.rs b/substrate/frame/support/test/tests/runtime_ui/invalid_pallet_index.rs new file mode 100644 index 0000000000000000000000000000000000000000..de89bb60224fd8fd77ac7c68f62353c6e51aafe6 --- /dev/null +++ b/substrate/frame/support/test/tests/runtime_ui/invalid_pallet_index.rs @@ -0,0 +1,28 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#[frame_support::runtime] +mod runtime { + #[runtime::runtime] + #[runtime::derive(RuntimeCall)] + pub struct Runtime; + + #[runtime::pallet_index("0")] + pub type System = frame_system; +} + +fn main() {} diff --git a/substrate/frame/support/test/tests/runtime_ui/invalid_pallet_index.stderr b/substrate/frame/support/test/tests/runtime_ui/invalid_pallet_index.stderr new file mode 100644 index 0000000000000000000000000000000000000000..1fbd086ddbe7e243dff03df1a7e91dc9d911964d --- /dev/null +++ b/substrate/frame/support/test/tests/runtime_ui/invalid_pallet_index.stderr @@ -0,0 +1,5 @@ +error: expected integer literal + --> tests/runtime_ui/invalid_pallet_index.rs:24:29 + | +24 | #[runtime::pallet_index("0")] + | ^^^ diff --git a/substrate/frame/support/test/tests/runtime_ui/invalid_runtime_type_derive.rs b/substrate/frame/support/test/tests/runtime_ui/invalid_runtime_type_derive.rs new file mode 100644 index 0000000000000000000000000000000000000000..89ba2f23bb1afbde0ff2936acd7910b2b761fff7 --- /dev/null +++ b/substrate/frame/support/test/tests/runtime_ui/invalid_runtime_type_derive.rs @@ -0,0 +1,25 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#[frame_support::runtime] +mod runtime { + #[runtime::runtime] + #[runtime::derive(RuntimeInfo)] + pub struct Runtime; +} + +fn main() {} diff --git a/substrate/frame/support/test/tests/runtime_ui/invalid_runtime_type_derive.stderr b/substrate/frame/support/test/tests/runtime_ui/invalid_runtime_type_derive.stderr new file mode 100644 index 0000000000000000000000000000000000000000..0b128c3dd4579ba93f7950f42f0ff97440eadd38 --- /dev/null +++ b/substrate/frame/support/test/tests/runtime_ui/invalid_runtime_type_derive.stderr @@ -0,0 +1,5 @@ +error: expected one of: `RuntimeCall`, `RuntimeEvent`, `RuntimeError`, `RuntimeOrigin`, `RuntimeFreezeReason`, `RuntimeHoldReason`, `RuntimeSlashReason`, `RuntimeLockId`, `RuntimeTask` + --> tests/runtime_ui/invalid_runtime_type_derive.rs:21:23 + | +21 | #[runtime::derive(RuntimeInfo)] + | ^^^^^^^^^^^ diff --git a/substrate/frame/support/test/tests/runtime_ui/missing_runtime.rs b/substrate/frame/support/test/tests/runtime_ui/missing_runtime.rs new file mode 100644 index 0000000000000000000000000000000000000000..c5febbe52876008e8a0537fece2b85806d6b323d --- /dev/null +++ b/substrate/frame/support/test/tests/runtime_ui/missing_runtime.rs @@ -0,0 +1,21 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#[frame_support::runtime] +mod runtime {} + +fn main() {} diff --git a/substrate/frame/support/test/tests/runtime_ui/missing_runtime.stderr b/substrate/frame/support/test/tests/runtime_ui/missing_runtime.stderr new file mode 100644 index 0000000000000000000000000000000000000000..9790c5dbc1a9a3f16269c4adea0b2c558bf13c08 --- /dev/null +++ b/substrate/frame/support/test/tests/runtime_ui/missing_runtime.stderr @@ -0,0 +1,5 @@ +error: Missing Runtime. Please add a struct inside the module and annotate it with `#[runtime::runtime]` + --> tests/runtime_ui/missing_runtime.rs:19:1 + | +19 | mod runtime {} + | ^^^ diff --git a/substrate/frame/support/test/tests/runtime_ui/missing_runtime_types_derive.rs b/substrate/frame/support/test/tests/runtime_ui/missing_runtime_types_derive.rs new file mode 100644 index 0000000000000000000000000000000000000000..c3fb0fd454f023fda6b442a5411087caea172c17 --- /dev/null +++ b/substrate/frame/support/test/tests/runtime_ui/missing_runtime_types_derive.rs @@ -0,0 +1,24 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#[frame_support::runtime] +mod runtime { + #[runtime::runtime] + pub struct Runtime; +} + +fn main() {} diff --git a/substrate/frame/support/test/tests/runtime_ui/missing_runtime_types_derive.stderr b/substrate/frame/support/test/tests/runtime_ui/missing_runtime_types_derive.stderr new file mode 100644 index 0000000000000000000000000000000000000000..1a8deebe5497c9c463f52140b8893b9c12529e52 --- /dev/null +++ b/substrate/frame/support/test/tests/runtime_ui/missing_runtime_types_derive.stderr @@ -0,0 +1,5 @@ +error: Missing Runtime Types. Please annotate the runtime struct with `#[runtime::derive]` + --> tests/runtime_ui/missing_runtime_types_derive.rs:19:1 + | +19 | mod runtime { + | ^^^ diff --git a/substrate/frame/support/test/tests/runtime_ui/missing_system_pallet.rs b/substrate/frame/support/test/tests/runtime_ui/missing_system_pallet.rs new file mode 100644 index 0000000000000000000000000000000000000000..f9a15fcf992a459313495562316cfa7c0ff01fde --- /dev/null +++ b/substrate/frame/support/test/tests/runtime_ui/missing_system_pallet.rs @@ -0,0 +1,25 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#[frame_support::runtime] +mod runtime { + #[runtime::runtime] + #[runtime::derive(RuntimeCall)] + pub struct Runtime; +} + +fn main() {} diff --git a/substrate/frame/support/test/tests/runtime_ui/missing_system_pallet.stderr b/substrate/frame/support/test/tests/runtime_ui/missing_system_pallet.stderr new file mode 100644 index 0000000000000000000000000000000000000000..dc3ac4cd5d560d208da05556f256498fd838da37 --- /dev/null +++ b/substrate/frame/support/test/tests/runtime_ui/missing_system_pallet.stderr @@ -0,0 +1,5 @@ +error: `System` pallet declaration is missing. Please add this line: `pub type System = frame_system;` + --> tests/runtime_ui/missing_system_pallet.rs:19:5 + | +19 | mod runtime { + | ^^^^^^^ diff --git a/substrate/frame/support/test/tests/runtime_ui/pass/basic.rs b/substrate/frame/support/test/tests/runtime_ui/pass/basic.rs new file mode 100644 index 0000000000000000000000000000000000000000..514f150180153692caf55ba9b3ecb171ca4e1a2a --- /dev/null +++ b/substrate/frame/support/test/tests/runtime_ui/pass/basic.rs @@ -0,0 +1,37 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use frame_support::derive_impl; + +pub type Block = frame_system::mocking::MockBlock; + +#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +impl frame_system::Config for Runtime { + type Block = Block; +} + +#[frame_support::runtime] +mod runtime { + #[runtime::runtime] + #[runtime::derive(RuntimeCall, RuntimeEvent, RuntimeOrigin, RuntimeError, RuntimeTask)] + pub struct Runtime; + + #[runtime::pallet_index(0)] + pub type System = frame_system; +} + +fn main() {} diff --git a/substrate/frame/support/test/tests/runtime_ui/runtime_struct.rs b/substrate/frame/support/test/tests/runtime_ui/runtime_struct.rs new file mode 100644 index 0000000000000000000000000000000000000000..bfa2fb75f04b8ce04d5aabdc83e36414f2dd3c00 --- /dev/null +++ b/substrate/frame/support/test/tests/runtime_ui/runtime_struct.rs @@ -0,0 +1,24 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#[frame_support::runtime] +mod runtime { + #[runtime::runtime] + pub enum Runtime {} +} + +fn main() {} diff --git a/substrate/frame/support/test/tests/runtime_ui/runtime_struct.stderr b/substrate/frame/support/test/tests/runtime_ui/runtime_struct.stderr new file mode 100644 index 0000000000000000000000000000000000000000..04192bcf7f192c833893f8a57536961fcd9b32ca --- /dev/null +++ b/substrate/frame/support/test/tests/runtime_ui/runtime_struct.stderr @@ -0,0 +1,5 @@ +error: Invalid runtime::runtime, expected struct definition + --> tests/runtime_ui/runtime_struct.rs:21:5 + | +21 | pub enum Runtime {} + | ^^^ diff --git a/substrate/frame/support/test/tests/storage_layers.rs b/substrate/frame/support/test/tests/storage_layers.rs index 88edd7de6ca23fd3001640daf1a62d2daa48c757..caa125153e9dc597f8ca859e2e5dd6ac16618992 100644 --- a/substrate/frame/support/test/tests/storage_layers.rs +++ b/substrate/frame/support/test/tests/storage_layers.rs @@ -64,7 +64,7 @@ pub type Header = sp_runtime::generic::Header; pub type Block = sp_runtime::generic::Block; -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Runtime { type BaseCallFilter = frame_support::traits::Everything; type BlockWeights = (); diff --git a/substrate/frame/support/test/tests/storage_transaction.rs b/substrate/frame/support/test/tests/storage_transaction.rs index c47743308609850ae480f3194773a76c36bbba58..a5bbfd24ab09a8084f58ad47e342174454133ef2 100644 --- a/substrate/frame/support/test/tests/storage_transaction.rs +++ b/substrate/frame/support/test/tests/storage_transaction.rs @@ -41,7 +41,6 @@ pub mod pallet { use frame_system::pallet_prelude::*; #[pallet::pallet] - #[pallet::generate_store(pub (super) trait Store)] pub struct Pallet(_); #[pallet::config] @@ -88,7 +87,7 @@ frame_support::construct_runtime!( } ); -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Runtime { type BaseCallFilter = frame_support::traits::Everything; type Block = Block; diff --git a/substrate/frame/support/test/tests/versioned_migration.rs b/substrate/frame/support/test/tests/versioned_migration.rs index dab5e06dc858f8ff5f7b38d2af411362a15c3442..e7d146940cb92f31020e8b27fe014983f50396f0 100644 --- a/substrate/frame/support/test/tests/versioned_migration.rs +++ b/substrate/frame/support/test/tests/versioned_migration.rs @@ -23,7 +23,7 @@ use frame_support::{ construct_runtime, derive_impl, migrations::VersionedMigration, parameter_types, - traits::{GetStorageVersion, OnRuntimeUpgrade, StorageVersion}, + traits::{GetStorageVersion, OnRuntimeUpgrade, StorageVersion, UncheckedOnRuntimeUpgrade}, weights::constants::RocksDbWeight, }; use frame_system::Config; @@ -71,7 +71,7 @@ construct_runtime!( } ); -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { type BaseCallFilter = frame_support::traits::Everything; type Block = Block; @@ -103,9 +103,11 @@ parameter_types! { static PostUpgradeCalledWith: Vec = Vec::new(); } -/// Implement `OnRuntimeUpgrade` for `SomeUnversionedMigration`. +/// Implement `UncheckedOnRuntimeUpgrade` for `SomeUnversionedMigration`. /// It sets SomeStorage to S, and returns a weight derived from UpgradeReads and UpgradeWrites. -impl OnRuntimeUpgrade for SomeUnversionedMigration { +impl UncheckedOnRuntimeUpgrade + for SomeUnversionedMigration +{ fn pre_upgrade() -> Result, sp_runtime::TryRuntimeError> { PreUpgradeCalled::set(true); Ok(PreUpgradeReturnBytes::get().to_vec()) diff --git a/substrate/frame/system/Cargo.toml b/substrate/frame/system/Cargo.toml index d4094601314873671a1c749c72b91a27452b5702..16b3b946e22125e6d844020a4a94b788dc4aa270 100644 --- a/substrate/frame/system/Cargo.toml +++ b/substrate/frame/system/Cargo.toml @@ -18,9 +18,9 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] cfg-if = "1.0" codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } -log = { version = "0.4.17", default-features = false } -scale-info = { version = "2.10.0", default-features = false, features = ["derive", "serde"] } -serde = { version = "1.0.195", default-features = false, features = ["alloc", "derive"] } +log = { workspace = true } +scale-info = { version = "2.11.1", default-features = false, features = ["derive", "serde"] } +serde = { features = ["alloc", "derive"], workspace = true } frame-support = { path = "../support", default-features = false } sp-core = { path = "../../primitives/core", default-features = false, features = ["serde"] } sp-io = { path = "../../primitives/io", default-features = false } @@ -28,7 +28,7 @@ sp-runtime = { path = "../../primitives/runtime", default-features = false, feat sp-std = { path = "../../primitives/std", default-features = false } sp-version = { path = "../../primitives/version", default-features = false, features = ["serde"] } sp-weights = { path = "../../primitives/weights", default-features = false, features = ["serde"] } -docify = "0.2.7" +docify = "0.2.8" [dev-dependencies] criterion = "0.4.0" diff --git a/substrate/frame/system/benches/bench.rs b/substrate/frame/system/benches/bench.rs index a0c567bf85273cb4c6c7839ebd8e509e92b6c9e4..87c5581b2a3409f511f0a8f83a7c7aeae7e7b2c6 100644 --- a/substrate/frame/system/benches/bench.rs +++ b/substrate/frame/system/benches/bench.rs @@ -60,7 +60,7 @@ frame_support::parameter_types! { ); } -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Runtime { type BaseCallFilter = frame_support::traits::Everything; type BlockWeights = (); diff --git a/substrate/frame/system/benchmarking/Cargo.toml b/substrate/frame/system/benchmarking/Cargo.toml index 80fdff756c02b25f8ddbf24bd75330458159d199..473a6bb132d741cf9485868201f114234be9f5d8 100644 --- a/substrate/frame/system/benchmarking/Cargo.toml +++ b/substrate/frame/system/benchmarking/Cargo.toml @@ -17,7 +17,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } frame-benchmarking = { path = "../../benchmarking", default-features = false } frame-support = { path = "../../support", default-features = false } frame-system = { path = "..", default-features = false } diff --git a/substrate/frame/system/benchmarking/src/lib.rs b/substrate/frame/system/benchmarking/src/lib.rs index 18bfb85f52dfd4c2b6a5c8a57e78494d97fbdeeb..29100faa75142a8b945bf15f1870e9c3d685d35e 100644 --- a/substrate/frame/system/benchmarking/src/lib.rs +++ b/substrate/frame/system/benchmarking/src/lib.rs @@ -21,7 +21,7 @@ #![cfg(feature = "runtime-benchmarks")] use codec::Encode; -use frame_benchmarking::{impl_benchmark_test_suite, v2::*}; +use frame_benchmarking::v2::*; use frame_support::{dispatch::DispatchClass, storage, traits::Get}; use frame_system::{Call, Pallet as System, RawOrigin}; use sp_core::storage::well_known_keys; diff --git a/substrate/frame/system/benchmarking/src/mock.rs b/substrate/frame/system/benchmarking/src/mock.rs index edbf74a9a51ac9bd90ee65f208c7d96be08430e3..39a64ff6177c38bee487fde66cbf4f7b0df77117 100644 --- a/substrate/frame/system/benchmarking/src/mock.rs +++ b/substrate/frame/system/benchmarking/src/mock.rs @@ -35,7 +35,7 @@ frame_support::construct_runtime!( } ); -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { type BaseCallFilter = frame_support::traits::Everything; type BlockWeights = (); diff --git a/substrate/frame/system/src/lib.rs b/substrate/frame/system/src/lib.rs index 069217bcee46b4663c836a750bfd90a568c1a4d2..184f27b61ed2a78fa298e4883db6d4eb39d8a184 100644 --- a/substrate/frame/system/src/lib.rs +++ b/substrate/frame/system/src/lib.rs @@ -130,11 +130,13 @@ use frame_support::{ DispatchResult, DispatchResultWithPostInfo, PerDispatchClass, PostDispatchInfo, }, ensure, impl_ensure_origin_with_arg_ignoring_arg, + migrations::MultiStepMigrator, pallet_prelude::Pays, storage::{self, StorageStreamIter}, traits::{ ConstU32, Contains, EnsureOrigin, EnsureOriginWithArg, Get, HandleLifetime, - OnKilledAccount, OnNewAccount, OriginTrait, PalletInfo, SortedMembers, StoredMap, TypedGet, + OnKilledAccount, OnNewAccount, OnRuntimeUpgrade, OriginTrait, PalletInfo, SortedMembers, + StoredMap, TypedGet, }, Parameter, }; @@ -148,6 +150,7 @@ use sp_io::TestExternalities; pub mod limits; #[cfg(test)] pub(crate) mod mock; + pub mod offchain; mod extensions; @@ -168,6 +171,7 @@ pub use extensions::{ // Backward compatible re-export. pub use extensions::check_mortality::CheckMortality as CheckEra; pub use frame_support::dispatch::RawOrigin; +use frame_support::traits::{PostInherents, PostTransactions, PreInherents}; pub use weights::WeightInfo; const LOG_TARGET: &str = "runtime::system"; @@ -298,9 +302,14 @@ pub mod pallet { type BaseCallFilter = frame_support::traits::Everything; type BlockHashCount = frame_support::traits::ConstU64<10>; type OnSetCode = (); + type SingleBlockMigrations = (); + type MultiBlockMigrator = (); + type PreInherents = (); + type PostInherents = (); + type PostTransactions = (); } - /// Default configurations of this pallet in a solo-chain environment. + /// Default configurations of this pallet in a solochain environment. /// /// ## Considerations: /// @@ -392,6 +401,11 @@ pub mod pallet { /// The set code logic, just the default since we're not a parachain. type OnSetCode = (); + type SingleBlockMigrations = (); + type MultiBlockMigrator = (); + type PreInherents = (); + type PostInherents = (); + type PostTransactions = (); } /// Default configurations of this pallet in a relay-chain environment. @@ -451,6 +465,7 @@ pub mod pallet { + Clone + OriginTrait; + #[docify::export(system_runtime_call)] /// The aggregated `RuntimeCall` type. #[pallet::no_default_bounds] type RuntimeCall: Parameter @@ -523,7 +538,7 @@ pub mod pallet { #[pallet::constant] type DbWeight: Get; - /// Get the chain's current version. + /// Get the chain's in-code version. #[pallet::constant] type Version: Get; @@ -570,6 +585,35 @@ pub mod pallet { /// The maximum number of consumers allowed on a single account. type MaxConsumers: ConsumerLimits; + + /// All migrations that should run in the next runtime upgrade. + /// + /// These used to be formerly configured in `Executive`. Parachains need to ensure that + /// running all these migrations in one block will not overflow the weight limit of a block. + /// The migrations are run *before* the pallet `on_runtime_upgrade` hooks, just like the + /// `OnRuntimeUpgrade` migrations. + type SingleBlockMigrations: OnRuntimeUpgrade; + + /// The migrator that is used to run Multi-Block-Migrations. + /// + /// Can be set to [`pallet-migrations`] or an alternative implementation of the interface. + /// The diagram in `frame_executive::block_flowchart` explains when it runs. + type MultiBlockMigrator: MultiStepMigrator; + + /// A callback that executes in *every block* directly before all inherents were applied. + /// + /// See `frame_executive::block_flowchart` for a in-depth explanation when it runs. + type PreInherents: PreInherents; + + /// A callback that executes in *every block* directly after all inherents were applied. + /// + /// See `frame_executive::block_flowchart` for a in-depth explanation when it runs. + type PostInherents: PostInherents; + + /// A callback that executes in *every block* directly after all transactions were applied. + /// + /// See `frame_executive::block_flowchart` for a in-depth explanation when it runs. + type PostTransactions: PostTransactions; } #[pallet::pallet] @@ -617,6 +661,9 @@ pub mod pallet { } /// Set the new runtime code without doing any checks of the given `code`. + /// + /// Note that runtime upgrades will not run if this is called with a not-increasing spec + /// version! #[pallet::call_index(3)] #[pallet::weight((T::SystemWeightInfo::set_code(), DispatchClass::Operational))] pub fn set_code_without_checks( @@ -812,6 +859,8 @@ pub mod pallet { NonZeroRefCount, /// The origin filter prevent the call to be dispatched. CallFiltered, + /// A multi-block migration is ongoing and prevents the current code from being replaced. + MultiBlockMigrationsOngoing, #[cfg(feature = "experimental")] /// The specified [`Task`] is not valid. InvalidTask, @@ -843,11 +892,15 @@ pub mod pallet { #[pallet::storage] pub(super) type ExtrinsicCount = StorageValue<_, u32>; + /// Whether all inherents have been applied. + #[pallet::storage] + pub type InherentsApplied = StorageValue<_, bool, ValueQuery>; + /// The current weight for the block. #[pallet::storage] #[pallet::whitelist_storage] #[pallet::getter(fn block_weight)] - pub(super) type BlockWeight = StorageValue<_, ConsumedWeight, ValueQuery>; + pub type BlockWeight = StorageValue<_, ConsumedWeight, ValueQuery>; /// Total length (in bytes) for all extrinsics put together, for the current block. #[pallet::storage] @@ -892,6 +945,7 @@ pub mod pallet { /// just in case someone still reads them from within the runtime. #[pallet::storage] #[pallet::whitelist_storage] + #[pallet::disable_try_decode_storage] #[pallet::unbounded] pub(super) type Events = StorageValue<_, Vec>>, ValueQuery>; @@ -1370,6 +1424,19 @@ impl Pallet { Self::deposit_event(Event::CodeUpdated); } + /// Whether all inherents have been applied. + pub fn inherents_applied() -> bool { + InherentsApplied::::get() + } + + /// Note that all inherents have been applied. + /// + /// Should be called immediately after all inherents have been applied. Must be called at least + /// once per block. + pub fn note_inherents_applied() { + InherentsApplied::::put(true); + } + /// Increment the reference counter on an account. #[deprecated = "Use `inc_consumers` instead"] pub fn inc_ref(who: &T::AccountId) { @@ -1689,6 +1756,7 @@ impl Pallet { >::put(digest); >::put(parent_hash); >::insert(*number - One::one(), parent_hash); + >::kill(); // Remove previous block data from storage BlockWeight::::kill(); @@ -1735,6 +1803,7 @@ impl Pallet { ExecutionPhase::::kill(); AllExtrinsicsLen::::kill(); storage::unhashed::kill(well_known_keys::INTRABLOCK_ENTROPY); + InherentsApplied::::kill(); // The following fields // @@ -1978,10 +2047,14 @@ impl Pallet { /// Determine whether or not it is possible to update the code. /// - /// Checks the given code if it is a valid runtime wasm blob by instantianting + /// Checks the given code if it is a valid runtime wasm blob by instantiating /// it and extracting the runtime version of it. It checks that the runtime version /// of the old and new runtime has the same spec name and that the spec version is increasing. pub fn can_set_code(code: &[u8]) -> Result<(), sp_runtime::DispatchError> { + if T::MultiBlockMigrator::ongoing() { + return Err(Error::::MultiBlockMigrationsOngoing.into()) + } + let current_version = T::Version::get(); let new_version = sp_io::misc::runtime_version(code) .and_then(|v| RuntimeVersion::decode(&mut &v[..]).ok()) diff --git a/substrate/frame/system/src/limits.rs b/substrate/frame/system/src/limits.rs index 5fd7a5af87571ff3a77442c1588a6f1fa5bee686..ab5a98a6b9745c044bb5d22847fb6db16cd4d573 100644 --- a/substrate/frame/system/src/limits.rs +++ b/substrate/frame/system/src/limits.rs @@ -378,7 +378,7 @@ impl BlockWeightsBuilder { /// class, based on the allowance. /// /// This is to make sure that extrinsics don't stay forever in the pool, - /// because they could seamingly fit the block (since they are below `max_block`), + /// because they could seemingly fit the block (since they are below `max_block`), /// but the cost of calling `on_initialize` always prevents them from being included. pub fn avg_block_initialization(mut self, init_cost: Perbill) -> Self { self.init_cost = Some(init_cost); diff --git a/substrate/frame/system/src/mock.rs b/substrate/frame/system/src/mock.rs index 06527a9bb2912b4253186307456ad0885cf2c17e..e1959e572e99cae45dcdf4960139298defbf81b2 100644 --- a/substrate/frame/system/src/mock.rs +++ b/substrate/frame/system/src/mock.rs @@ -16,15 +16,8 @@ // limitations under the License. use crate::{self as frame_system, *}; -use frame_support::{ - derive_impl, parameter_types, - traits::{ConstU32, ConstU64}, -}; -use sp_core::H256; -use sp_runtime::{ - traits::{BlakeTwo256, IdentityLookup}, - BuildStorage, Perbill, -}; +use frame_support::{derive_impl, parameter_types}; +use sp_runtime::{BuildStorage, Perbill}; type Block = mocking::MockBlock; @@ -85,31 +78,30 @@ impl OnKilledAccount for RecordKilled { } } -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl Config for Test { - type BaseCallFilter = frame_support::traits::Everything; type BlockWeights = RuntimeBlockWeights; type BlockLength = RuntimeBlockLength; - type RuntimeOrigin = RuntimeOrigin; - type RuntimeCall = RuntimeCall; - type Nonce = u64; - type Hash = H256; - type Hashing = BlakeTwo256; - type AccountId = u64; - type Lookup = IdentityLookup; type Block = Block; - type RuntimeEvent = RuntimeEvent; - type BlockHashCount = ConstU64<10>; - type DbWeight = DbWeight; type Version = Version; - type PalletInfo = PalletInfo; type AccountData = u32; - type OnNewAccount = (); type OnKilledAccount = RecordKilled; - type SystemWeightInfo = (); - type SS58Prefix = (); - type OnSetCode = (); - type MaxConsumers = ConstU32<16>; + type MultiBlockMigrator = MockedMigrator; +} + +parameter_types! { + pub static Ongoing: bool = false; +} + +pub struct MockedMigrator; +impl frame_support::migrations::MultiStepMigrator for MockedMigrator { + fn ongoing() -> bool { + Ongoing::get() + } + + fn step() -> Weight { + Weight::zero() + } } pub type SysEvent = frame_system::Event; diff --git a/substrate/frame/system/src/offchain.rs b/substrate/frame/system/src/offchain.rs index a019cfd666e8cb3ddccc02aa706692cbe6cee2e3..a64b326196403cb87e0970c061ac09e42136d4e1 100644 --- a/substrate/frame/system/src/offchain.rs +++ b/substrate/frame/system/src/offchain.rs @@ -22,7 +22,7 @@ //! This module provides transaction related helpers to: //! - Submit a raw unsigned transaction //! - Submit an unsigned transaction with a signed payload -//! - Submit a signed transction. +//! - Submit a signed transaction. //! //! ## Usage //! @@ -384,7 +384,7 @@ where /// /// // runtime-specific public key /// type Public = MultiSigner: From; -/// type Signature = MulitSignature: From; +/// type Signature = MultiSignature: From; /// ``` // TODO [#5662] Potentially use `IsWrappedBy` types, or find some other way to make it easy to // obtain unwrapped crypto (and wrap it back). @@ -444,7 +444,7 @@ pub trait SigningTypes: crate::Config { /// A public key that is capable of identifying `AccountId`s. /// /// Usually that's either a raw crypto public key (e.g. `sr25519::Public`) or - /// an aggregate type for multiple crypto public keys, like `MulitSigner`. + /// an aggregate type for multiple crypto public keys, like `MultiSigner`. type Public: Clone + PartialEq + IdentifyAccount diff --git a/substrate/frame/system/src/tests.rs b/substrate/frame/system/src/tests.rs index e437e7f9f39b0845d9f7eef33e3c90546c8dbbd2..b889b5ca046efe557e7706870c11febce8a358b2 100644 --- a/substrate/frame/system/src/tests.rs +++ b/substrate/frame/system/src/tests.rs @@ -675,6 +675,28 @@ fn set_code_with_real_wasm_blob() { }); } +#[test] +fn set_code_rejects_during_mbm() { + Ongoing::set(true); + + let executor = substrate_test_runtime_client::new_native_or_wasm_executor(); + let mut ext = new_test_ext(); + ext.register_extension(sp_core::traits::ReadRuntimeVersionExt::new(executor)); + ext.execute_with(|| { + System::set_block_number(1); + let res = System::set_code( + RawOrigin::Root.into(), + substrate_test_runtime_client::runtime::wasm_binary_unwrap().to_vec(), + ); + assert_eq!( + res, + Err(DispatchErrorWithPostInfo::from(Error::::MultiBlockMigrationsOngoing)) + ); + + assert!(System::events().is_empty()); + }); +} + #[test] fn set_code_via_authorization_works() { let executor = substrate_test_runtime_client::new_native_or_wasm_executor(); diff --git a/substrate/frame/system/src/weights.rs b/substrate/frame/system/src/weights.rs index 41807dea1c55f9cd246db231fc9102d4b9eb5c4f..fca14e4526579e501f83973dcfdbf43ded6af6bb 100644 --- a/substrate/frame/system/src/weights.rs +++ b/substrate/frame/system/src/weights.rs @@ -15,30 +15,31 @@ // See the License for the specific language governing permissions and // limitations under the License. -//! Autogenerated weights for frame_system +//! Autogenerated weights for `frame_system` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-06-22, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-04-08, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-s7kdgajz-project-145-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("dev"), DB CACHE: 1024 +//! HOSTNAME: `runner-anb7yjbi-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: `1024` // Executed Command: -// target/production/substrate +// ./target/production/substrate-node // benchmark // pallet +// --chain=dev // --steps=50 // --repeat=20 +// --pallet=frame_system +// --no-storage-info +// --no-median-slopes +// --no-min-squares // --extrinsic=* -// --execution=wasm // --wasm-execution=compiled // --heap-pages=4096 -// --json-file=/builds/parity/mirrors/substrate/.git/.artifacts/bench.json -// --pallet=frame-system -// --chain=dev -// --header=./HEADER-APACHE2 -// --output=./frame/system/src/weights.rs -// --template=./.maintain/frame-weight-template.hbs +// --output=./substrate/frame/system/src/weights.rs +// --header=./substrate/HEADER-APACHE2 +// --template=./substrate/.maintain/frame-weight-template.hbs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -48,7 +49,7 @@ use frame_support::{traits::Get, weights::{Weight, constants::RocksDbWeight}}; use core::marker::PhantomData; -/// Weight functions needed for frame_system. +/// Weight functions needed for `frame_system`. pub trait WeightInfo { fn remark(b: u32, ) -> Weight; fn remark_with_event(b: u32, ) -> Weight; @@ -61,7 +62,7 @@ pub trait WeightInfo { fn apply_authorized_upgrade() -> Weight; } -/// Weights for frame_system using the Substrate node and recommended hardware. +/// Weights for `frame_system` using the Substrate node and recommended hardware. pub struct SubstrateWeight(PhantomData); impl WeightInfo for SubstrateWeight { /// The range of component `b` is `[0, 3932160]`. @@ -69,84 +70,86 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_004_000 picoseconds. - Weight::from_parts(2_119_000, 0) + // Minimum execution time: 2_078_000 picoseconds. + Weight::from_parts(1_137_744, 0) // Standard Error: 0 - .saturating_add(Weight::from_parts(390, 0).saturating_mul(b.into())) + .saturating_add(Weight::from_parts(387, 0).saturating_mul(b.into())) } /// The range of component `b` is `[0, 3932160]`. fn remark_with_event(b: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 8_032_000 picoseconds. - Weight::from_parts(8_097_000, 0) - // Standard Error: 2 - .saturating_add(Weight::from_parts(1_455, 0).saturating_mul(b.into())) + // Minimum execution time: 5_980_000 picoseconds. + Weight::from_parts(2_562_415, 0) + // Standard Error: 1 + .saturating_add(Weight::from_parts(1_391, 0).saturating_mul(b.into())) } - /// Storage: System Digest (r:1 w:1) - /// Proof Skipped: System Digest (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: unknown `0x3a686561707061676573` (r:0 w:1) - /// Proof Skipped: unknown `0x3a686561707061676573` (r:0 w:1) + /// Storage: `System::Digest` (r:1 w:1) + /// Proof: `System::Digest` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: UNKNOWN KEY `0x3a686561707061676573` (r:0 w:1) + /// Proof: UNKNOWN KEY `0x3a686561707061676573` (r:0 w:1) fn set_heap_pages() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `1485` - // Minimum execution time: 4_446_000 picoseconds. - Weight::from_parts(4_782_000, 1485) + // Minimum execution time: 3_834_000 picoseconds. + Weight::from_parts(4_109_000, 1485) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } - /// Storage: System Digest (r:1 w:1) - /// Proof Skipped: System Digest (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: unknown `0x3a636f6465` (r:0 w:1) - /// Proof Skipped: unknown `0x3a636f6465` (r:0 w:1) + /// Storage: `MultiBlockMigrations::Cursor` (r:1 w:0) + /// Proof: `MultiBlockMigrations::Cursor` (`max_values`: Some(1), `max_size`: Some(65550), added: 66045, mode: `MaxEncodedLen`) + /// Storage: `System::Digest` (r:1 w:1) + /// Proof: `System::Digest` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: UNKNOWN KEY `0x3a636f6465` (r:0 w:1) + /// Proof: UNKNOWN KEY `0x3a636f6465` (r:0 w:1) fn set_code() -> Weight { // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `1485` - // Minimum execution time: 84_000_503_000 picoseconds. - Weight::from_parts(87_586_619_000, 1485) - .saturating_add(T::DbWeight::get().reads(1_u64)) + // Measured: `142` + // Estimated: `67035` + // Minimum execution time: 81_326_496_000 picoseconds. + Weight::from_parts(81_880_651_000, 67035) + .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } - /// Storage: Skipped Metadata (r:0 w:0) - /// Proof Skipped: Skipped Metadata (max_values: None, max_size: None, mode: Measured) + /// Storage: `Skipped::Metadata` (r:0 w:0) + /// Proof: `Skipped::Metadata` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `i` is `[0, 1000]`. fn set_storage(i: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_086_000 picoseconds. - Weight::from_parts(2_175_000, 0) - // Standard Error: 1_056 - .saturating_add(Weight::from_parts(841_511, 0).saturating_mul(i.into())) + // Minimum execution time: 2_059_000 picoseconds. + Weight::from_parts(2_192_000, 0) + // Standard Error: 720 + .saturating_add(Weight::from_parts(742_610, 0).saturating_mul(i.into())) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(i.into()))) } - /// Storage: Skipped Metadata (r:0 w:0) - /// Proof Skipped: Skipped Metadata (max_values: None, max_size: None, mode: Measured) + /// Storage: `Skipped::Metadata` (r:0 w:0) + /// Proof: `Skipped::Metadata` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `i` is `[0, 1000]`. fn kill_storage(i: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_000_000 picoseconds. - Weight::from_parts(2_255_000, 0) - // Standard Error: 1_425 - .saturating_add(Weight::from_parts(662_473, 0).saturating_mul(i.into())) + // Minimum execution time: 2_038_000 picoseconds. + Weight::from_parts(2_159_000, 0) + // Standard Error: 774 + .saturating_add(Weight::from_parts(569_424, 0).saturating_mul(i.into())) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(i.into()))) } - /// Storage: Skipped Metadata (r:0 w:0) - /// Proof Skipped: Skipped Metadata (max_values: None, max_size: None, mode: Measured) + /// Storage: `Skipped::Metadata` (r:0 w:0) + /// Proof: `Skipped::Metadata` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `p` is `[0, 1000]`. fn kill_prefix(p: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `115 + p * (69 ±0)` - // Estimated: `128 + p * (70 ±0)` - // Minimum execution time: 4_189_000 picoseconds. - Weight::from_parts(4_270_000, 128) - // Standard Error: 2_296 - .saturating_add(Weight::from_parts(1_389_650, 0).saturating_mul(p.into())) + // Measured: `127 + p * (69 ±0)` + // Estimated: `134 + p * (70 ±0)` + // Minimum execution time: 3_990_000 picoseconds. + Weight::from_parts(4_172_000, 134) + // Standard Error: 1_485 + .saturating_add(Weight::from_parts(1_227_281, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(p.into()))) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(p.into()))) .saturating_add(Weight::from_parts(0, 70).saturating_mul(p.into())) @@ -157,114 +160,116 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 33_027_000 picoseconds. - Weight::from_parts(33_027_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - .saturating_add(T::DbWeight::get().writes(1)) + // Minimum execution time: 8_851_000 picoseconds. + Weight::from_parts(9_643_000, 0) + .saturating_add(T::DbWeight::get().writes(1_u64)) } /// Storage: `System::AuthorizedUpgrade` (r:1 w:1) /// Proof: `System::AuthorizedUpgrade` (`max_values`: Some(1), `max_size`: Some(33), added: 528, mode: `MaxEncodedLen`) + /// Storage: `MultiBlockMigrations::Cursor` (r:1 w:0) + /// Proof: `MultiBlockMigrations::Cursor` (`max_values`: Some(1), `max_size`: Some(65550), added: 66045, mode: `MaxEncodedLen`) /// Storage: `System::Digest` (r:1 w:1) /// Proof: `System::Digest` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) /// Storage: UNKNOWN KEY `0x3a636f6465` (r:0 w:1) /// Proof: UNKNOWN KEY `0x3a636f6465` (r:0 w:1) fn apply_authorized_upgrade() -> Weight { // Proof Size summary in bytes: - // Measured: `22` - // Estimated: `1518` - // Minimum execution time: 118_101_992_000 picoseconds. - Weight::from_parts(118_101_992_000, 0) - .saturating_add(Weight::from_parts(0, 1518)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(3)) + // Measured: `164` + // Estimated: `67035` + // Minimum execution time: 86_295_879_000 picoseconds. + Weight::from_parts(87_636_595_000, 67035) + .saturating_add(T::DbWeight::get().reads(3_u64)) + .saturating_add(T::DbWeight::get().writes(3_u64)) } } -// For backwards compatibility and tests +// For backwards compatibility and tests. impl WeightInfo for () { /// The range of component `b` is `[0, 3932160]`. fn remark(b: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_004_000 picoseconds. - Weight::from_parts(2_119_000, 0) + // Minimum execution time: 2_078_000 picoseconds. + Weight::from_parts(1_137_744, 0) // Standard Error: 0 - .saturating_add(Weight::from_parts(390, 0).saturating_mul(b.into())) + .saturating_add(Weight::from_parts(387, 0).saturating_mul(b.into())) } /// The range of component `b` is `[0, 3932160]`. fn remark_with_event(b: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 8_032_000 picoseconds. - Weight::from_parts(8_097_000, 0) - // Standard Error: 2 - .saturating_add(Weight::from_parts(1_455, 0).saturating_mul(b.into())) + // Minimum execution time: 5_980_000 picoseconds. + Weight::from_parts(2_562_415, 0) + // Standard Error: 1 + .saturating_add(Weight::from_parts(1_391, 0).saturating_mul(b.into())) } - /// Storage: System Digest (r:1 w:1) - /// Proof Skipped: System Digest (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: unknown `0x3a686561707061676573` (r:0 w:1) - /// Proof Skipped: unknown `0x3a686561707061676573` (r:0 w:1) + /// Storage: `System::Digest` (r:1 w:1) + /// Proof: `System::Digest` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: UNKNOWN KEY `0x3a686561707061676573` (r:0 w:1) + /// Proof: UNKNOWN KEY `0x3a686561707061676573` (r:0 w:1) fn set_heap_pages() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `1485` - // Minimum execution time: 4_446_000 picoseconds. - Weight::from_parts(4_782_000, 1485) + // Minimum execution time: 3_834_000 picoseconds. + Weight::from_parts(4_109_000, 1485) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } - /// Storage: System Digest (r:1 w:1) - /// Proof Skipped: System Digest (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: unknown `0x3a636f6465` (r:0 w:1) - /// Proof Skipped: unknown `0x3a636f6465` (r:0 w:1) + /// Storage: `MultiBlockMigrations::Cursor` (r:1 w:0) + /// Proof: `MultiBlockMigrations::Cursor` (`max_values`: Some(1), `max_size`: Some(65550), added: 66045, mode: `MaxEncodedLen`) + /// Storage: `System::Digest` (r:1 w:1) + /// Proof: `System::Digest` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: UNKNOWN KEY `0x3a636f6465` (r:0 w:1) + /// Proof: UNKNOWN KEY `0x3a636f6465` (r:0 w:1) fn set_code() -> Weight { // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `1485` - // Minimum execution time: 84_000_503_000 picoseconds. - Weight::from_parts(87_586_619_000, 1485) - .saturating_add(RocksDbWeight::get().reads(1_u64)) + // Measured: `142` + // Estimated: `67035` + // Minimum execution time: 81_326_496_000 picoseconds. + Weight::from_parts(81_880_651_000, 67035) + .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } - /// Storage: Skipped Metadata (r:0 w:0) - /// Proof Skipped: Skipped Metadata (max_values: None, max_size: None, mode: Measured) + /// Storage: `Skipped::Metadata` (r:0 w:0) + /// Proof: `Skipped::Metadata` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `i` is `[0, 1000]`. fn set_storage(i: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_086_000 picoseconds. - Weight::from_parts(2_175_000, 0) - // Standard Error: 1_056 - .saturating_add(Weight::from_parts(841_511, 0).saturating_mul(i.into())) + // Minimum execution time: 2_059_000 picoseconds. + Weight::from_parts(2_192_000, 0) + // Standard Error: 720 + .saturating_add(Weight::from_parts(742_610, 0).saturating_mul(i.into())) .saturating_add(RocksDbWeight::get().writes((1_u64).saturating_mul(i.into()))) } - /// Storage: Skipped Metadata (r:0 w:0) - /// Proof Skipped: Skipped Metadata (max_values: None, max_size: None, mode: Measured) + /// Storage: `Skipped::Metadata` (r:0 w:0) + /// Proof: `Skipped::Metadata` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `i` is `[0, 1000]`. fn kill_storage(i: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_000_000 picoseconds. - Weight::from_parts(2_255_000, 0) - // Standard Error: 1_425 - .saturating_add(Weight::from_parts(662_473, 0).saturating_mul(i.into())) + // Minimum execution time: 2_038_000 picoseconds. + Weight::from_parts(2_159_000, 0) + // Standard Error: 774 + .saturating_add(Weight::from_parts(569_424, 0).saturating_mul(i.into())) .saturating_add(RocksDbWeight::get().writes((1_u64).saturating_mul(i.into()))) } - /// Storage: Skipped Metadata (r:0 w:0) - /// Proof Skipped: Skipped Metadata (max_values: None, max_size: None, mode: Measured) + /// Storage: `Skipped::Metadata` (r:0 w:0) + /// Proof: `Skipped::Metadata` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `p` is `[0, 1000]`. fn kill_prefix(p: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `115 + p * (69 ±0)` - // Estimated: `128 + p * (70 ±0)` - // Minimum execution time: 4_189_000 picoseconds. - Weight::from_parts(4_270_000, 128) - // Standard Error: 2_296 - .saturating_add(Weight::from_parts(1_389_650, 0).saturating_mul(p.into())) + // Measured: `127 + p * (69 ±0)` + // Estimated: `134 + p * (70 ±0)` + // Minimum execution time: 3_990_000 picoseconds. + Weight::from_parts(4_172_000, 134) + // Standard Error: 1_485 + .saturating_add(Weight::from_parts(1_227_281, 0).saturating_mul(p.into())) .saturating_add(RocksDbWeight::get().reads((1_u64).saturating_mul(p.into()))) .saturating_add(RocksDbWeight::get().writes((1_u64).saturating_mul(p.into()))) .saturating_add(Weight::from_parts(0, 70).saturating_mul(p.into())) @@ -275,25 +280,25 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 33_027_000 picoseconds. - Weight::from_parts(33_027_000, 0) - .saturating_add(Weight::from_parts(0, 0)) - .saturating_add(RocksDbWeight::get().writes(1)) + // Minimum execution time: 8_851_000 picoseconds. + Weight::from_parts(9_643_000, 0) + .saturating_add(RocksDbWeight::get().writes(1_u64)) } /// Storage: `System::AuthorizedUpgrade` (r:1 w:1) /// Proof: `System::AuthorizedUpgrade` (`max_values`: Some(1), `max_size`: Some(33), added: 528, mode: `MaxEncodedLen`) + /// Storage: `MultiBlockMigrations::Cursor` (r:1 w:0) + /// Proof: `MultiBlockMigrations::Cursor` (`max_values`: Some(1), `max_size`: Some(65550), added: 66045, mode: `MaxEncodedLen`) /// Storage: `System::Digest` (r:1 w:1) /// Proof: `System::Digest` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) /// Storage: UNKNOWN KEY `0x3a636f6465` (r:0 w:1) /// Proof: UNKNOWN KEY `0x3a636f6465` (r:0 w:1) fn apply_authorized_upgrade() -> Weight { // Proof Size summary in bytes: - // Measured: `22` - // Estimated: `1518` - // Minimum execution time: 118_101_992_000 picoseconds. - Weight::from_parts(118_101_992_000, 0) - .saturating_add(Weight::from_parts(0, 1518)) - .saturating_add(RocksDbWeight::get().reads(2)) - .saturating_add(RocksDbWeight::get().writes(3)) + // Measured: `164` + // Estimated: `67035` + // Minimum execution time: 86_295_879_000 picoseconds. + Weight::from_parts(87_636_595_000, 67035) + .saturating_add(RocksDbWeight::get().reads(3_u64)) + .saturating_add(RocksDbWeight::get().writes(3_u64)) } } diff --git a/substrate/frame/timestamp/Cargo.toml b/substrate/frame/timestamp/Cargo.toml index cd0737c6bb8fea31471e7e9ba14637588b33c4de..da49b29c89b78f26b3f5eee35e81b7d2dacf8bb8 100644 --- a/substrate/frame/timestamp/Cargo.toml +++ b/substrate/frame/timestamp/Cargo.toml @@ -18,8 +18,8 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive", "max-encoded-len"] } -log = { version = "0.4.17", default-features = false } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +log = { workspace = true } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } frame-benchmarking = { path = "../benchmarking", default-features = false, optional = true } frame-support = { path = "../support", default-features = false } frame-system = { path = "../system", default-features = false } @@ -30,7 +30,7 @@ sp-std = { path = "../../primitives/std", default-features = false } sp-storage = { path = "../../primitives/storage", default-features = false } sp-timestamp = { path = "../../primitives/timestamp", default-features = false } -docify = "0.2.7" +docify = "0.2.8" [dev-dependencies] sp-core = { path = "../../primitives/core" } diff --git a/substrate/frame/timestamp/src/lib.rs b/substrate/frame/timestamp/src/lib.rs index a62ac6d633d043d5a62cbd9f27639fc6ba0ac4bf..5269f17eca6b2151a787f91a1126c822aaf83879 100644 --- a/substrate/frame/timestamp/src/lib.rs +++ b/substrate/frame/timestamp/src/lib.rs @@ -154,7 +154,7 @@ pub mod pallet { /// Default prelude sensible to be used in a testing environment. pub struct TestDefaultConfig; - #[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig, no_aggregated_types)] + #[derive_impl(frame_system::config_preludes::TestDefaultConfig, no_aggregated_types)] impl frame_system::DefaultConfig for TestDefaultConfig {} #[frame_support::register_default_impl(TestDefaultConfig)] diff --git a/substrate/frame/timestamp/src/mock.rs b/substrate/frame/timestamp/src/mock.rs index 5cbc5211368d4e6ed8027b56a06a49f02f1d3f86..eb4fdbe71fa7fb54fecb26bd99e977cc57455883 100644 --- a/substrate/frame/timestamp/src/mock.rs +++ b/substrate/frame/timestamp/src/mock.rs @@ -20,16 +20,9 @@ use super::*; use crate as pallet_timestamp; -use frame_support::{ - derive_impl, parameter_types, - traits::{ConstU32, ConstU64}, -}; -use sp_core::H256; +use frame_support::{derive_impl, parameter_types, traits::ConstU64}; use sp_io::TestExternalities; -use sp_runtime::{ - traits::{BlakeTwo256, IdentityLookup}, - BuildStorage, -}; +use sp_runtime::BuildStorage; type Block = frame_system::mocking::MockBlock; type Moment = u64; @@ -42,31 +35,9 @@ frame_support::construct_runtime!( } ); -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { - type BaseCallFilter = frame_support::traits::Everything; - type BlockWeights = (); - type BlockLength = (); - type DbWeight = (); - type RuntimeOrigin = RuntimeOrigin; - type Nonce = u64; - type RuntimeCall = RuntimeCall; - type Hash = H256; - type Hashing = BlakeTwo256; - type AccountId = u64; - type Lookup = IdentityLookup; type Block = Block; - type RuntimeEvent = RuntimeEvent; - type BlockHashCount = ConstU64<250>; - type Version = (); - type PalletInfo = PalletInfo; - type AccountData = (); - type OnNewAccount = (); - type OnKilledAccount = (); - type SystemWeightInfo = (); - type SS58Prefix = (); - type OnSetCode = (); - type MaxConsumers = ConstU32<16>; } parameter_types! { diff --git a/substrate/frame/timestamp/src/weights.rs b/substrate/frame/timestamp/src/weights.rs index 46c544734869442c17d2be8b354bed916e197b83..9f2cbf7ccd128b8801e6a7020ea4e9ac52f71ec0 100644 --- a/substrate/frame/timestamp/src/weights.rs +++ b/substrate/frame/timestamp/src/weights.rs @@ -15,16 +15,16 @@ // See the License for the specific language governing permissions and // limitations under the License. -//! Autogenerated weights for pallet_timestamp +//! Autogenerated weights for `pallet_timestamp` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-06-16, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-04-09, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-e8ezs4ez-project-145-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("dev"), DB CACHE: 1024 +//! HOSTNAME: `runner-anb7yjbi-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: `1024` // Executed Command: -// ./target/production/substrate +// ./target/production/substrate-node // benchmark // pallet // --chain=dev @@ -35,12 +35,11 @@ // --no-median-slopes // --no-min-squares // --extrinsic=* -// --execution=wasm // --wasm-execution=compiled // --heap-pages=4096 -// --output=./frame/timestamp/src/weights.rs -// --header=./HEADER-APACHE2 -// --template=./.maintain/frame-weight-template.hbs +// --output=./substrate/frame/timestamp/src/weights.rs +// --header=./substrate/HEADER-APACHE2 +// --template=./substrate/.maintain/frame-weight-template.hbs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -50,57 +49,57 @@ use frame_support::{traits::Get, weights::{Weight, constants::RocksDbWeight}}; use core::marker::PhantomData; -/// Weight functions needed for pallet_timestamp. +/// Weight functions needed for `pallet_timestamp`. pub trait WeightInfo { fn set() -> Weight; fn on_finalize() -> Weight; } -/// Weights for pallet_timestamp using the Substrate node and recommended hardware. +/// Weights for `pallet_timestamp` using the Substrate node and recommended hardware. pub struct SubstrateWeight(PhantomData); impl WeightInfo for SubstrateWeight { - /// Storage: Timestamp Now (r:1 w:1) - /// Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - /// Storage: Babe CurrentSlot (r:1 w:0) - /// Proof: Babe CurrentSlot (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) + /// Storage: `Timestamp::Now` (r:1 w:1) + /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `MaxEncodedLen`) + /// Storage: `Babe::CurrentSlot` (r:1 w:0) + /// Proof: `Babe::CurrentSlot` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `MaxEncodedLen`) fn set() -> Weight { // Proof Size summary in bytes: - // Measured: `312` + // Measured: `345` // Estimated: `1493` - // Minimum execution time: 9_857_000 picoseconds. - Weight::from_parts(10_492_000, 1493) + // Minimum execution time: 8_356_000 picoseconds. + Weight::from_parts(8_684_000, 1493) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } fn on_finalize() -> Weight { // Proof Size summary in bytes: - // Measured: `161` + // Measured: `194` // Estimated: `0` - // Minimum execution time: 4_175_000 picoseconds. - Weight::from_parts(4_334_000, 0) + // Minimum execution time: 3_886_000 picoseconds. + Weight::from_parts(4_118_000, 0) } } -// For backwards compatibility and tests +// For backwards compatibility and tests. impl WeightInfo for () { - /// Storage: Timestamp Now (r:1 w:1) - /// Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) - /// Storage: Babe CurrentSlot (r:1 w:0) - /// Proof: Babe CurrentSlot (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) + /// Storage: `Timestamp::Now` (r:1 w:1) + /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `MaxEncodedLen`) + /// Storage: `Babe::CurrentSlot` (r:1 w:0) + /// Proof: `Babe::CurrentSlot` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `MaxEncodedLen`) fn set() -> Weight { // Proof Size summary in bytes: - // Measured: `312` + // Measured: `345` // Estimated: `1493` - // Minimum execution time: 9_857_000 picoseconds. - Weight::from_parts(10_492_000, 1493) + // Minimum execution time: 8_356_000 picoseconds. + Weight::from_parts(8_684_000, 1493) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } fn on_finalize() -> Weight { // Proof Size summary in bytes: - // Measured: `161` + // Measured: `194` // Estimated: `0` - // Minimum execution time: 4_175_000 picoseconds. - Weight::from_parts(4_334_000, 0) + // Minimum execution time: 3_886_000 picoseconds. + Weight::from_parts(4_118_000, 0) } } diff --git a/substrate/frame/tips/Cargo.toml b/substrate/frame/tips/Cargo.toml index 900cd47e0dc02afaad237b1de8c1e98c6941e672..a2acf0638ffb0717ece5c132009b983c86ef2072 100644 --- a/substrate/frame/tips/Cargo.toml +++ b/substrate/frame/tips/Cargo.toml @@ -17,9 +17,9 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } -log = { version = "0.4.17", default-features = false } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.195", features = ["derive"], optional = true } +log = { workspace = true } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +serde = { features = ["derive"], optional = true, workspace = true, default-features = true } frame-benchmarking = { path = "../benchmarking", default-features = false, optional = true } frame-support = { path = "../support", default-features = false } frame-system = { path = "../system", default-features = false } diff --git a/substrate/frame/tips/src/lib.rs b/substrate/frame/tips/src/lib.rs index 4c7cfc3028a9f04c87022ffc89892b59ce3c5610..8c360fb57d72488553529ab4264eb7f8b444c064 100644 --- a/substrate/frame/tips/src/lib.rs +++ b/substrate/frame/tips/src/lib.rs @@ -122,7 +122,7 @@ pub mod pallet { use frame_support::pallet_prelude::*; use frame_system::pallet_prelude::*; - /// The current storage version. + /// The in-code storage version. const STORAGE_VERSION: StorageVersion = StorageVersion::new(4); #[pallet::pallet] diff --git a/substrate/frame/tips/src/migrations/mod.rs b/substrate/frame/tips/src/migrations/mod.rs index 9cdd01c17fbf6009e306caff31079ca0eb7a6ea1..a7917bfce16fb0057c184b2b736ee5788f3a2fe5 100644 --- a/substrate/frame/tips/src/migrations/mod.rs +++ b/substrate/frame/tips/src/migrations/mod.rs @@ -17,7 +17,7 @@ /// Version 4. /// -/// For backward compatability reasons, pallet-tips uses `Treasury` for storage module prefix +/// For backward compatibility reasons, pallet-tips uses `Treasury` for storage module prefix /// before calling this migration. After calling this migration, it will get replaced with /// own storage identifier. pub mod v4; diff --git a/substrate/frame/tips/src/migrations/v4.rs b/substrate/frame/tips/src/migrations/v4.rs index 2404c6de1a16bb0657bd7771a3019186db8d0976..8b0e65c58dbde4b754892b09da93187a25dec087 100644 --- a/substrate/frame/tips/src/migrations/v4.rs +++ b/substrate/frame/tips/src/migrations/v4.rs @@ -15,8 +15,8 @@ // See the License for the specific language governing permissions and // limitations under the License. +use core::str; use sp_io::hashing::twox_128; -use sp_std::str; use super::super::LOG_TARGET; use frame_support::{ diff --git a/substrate/frame/tips/src/tests.rs b/substrate/frame/tips/src/tests.rs index 9d4047cd80eabb3c7c2b36382c8ec1020fc2bd6b..78df3736815a11dcc8a766e6eb88c4972157a7b3 100644 --- a/substrate/frame/tips/src/tests.rs +++ b/substrate/frame/tips/src/tests.rs @@ -57,31 +57,12 @@ parameter_types! { pub const AvailableBlockRatio: Perbill = Perbill::one(); } -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { - type BaseCallFilter = frame_support::traits::Everything; - type BlockWeights = (); - type BlockLength = (); - type DbWeight = (); - type RuntimeOrigin = RuntimeOrigin; - type Nonce = u64; - type RuntimeCall = RuntimeCall; - type Hash = H256; - type Hashing = BlakeTwo256; type AccountId = u128; // u64 is not enough to hold bytes used to generate bounty account type Lookup = IdentityLookup; type Block = Block; - type RuntimeEvent = RuntimeEvent; - type BlockHashCount = ConstU64<250>; - type Version = (); - type PalletInfo = PalletInfo; type AccountData = pallet_balances::AccountData; - type OnNewAccount = (); - type OnKilledAccount = (); - type SystemWeightInfo = (); - type SS58Prefix = (); - type OnSetCode = (); - type MaxConsumers = ConstU32<16>; } impl pallet_balances::Config for Test { diff --git a/substrate/frame/tips/src/weights.rs b/substrate/frame/tips/src/weights.rs index ec6228667159ddbdbfecd12ccb5ff6250390829a..7e1bba3c73e7dfba9c18a101025c08557a76259b 100644 --- a/substrate/frame/tips/src/weights.rs +++ b/substrate/frame/tips/src/weights.rs @@ -15,16 +15,16 @@ // See the License for the specific language governing permissions and // limitations under the License. -//! Autogenerated weights for pallet_tips +//! Autogenerated weights for `pallet_tips` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-06-16, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-04-09, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-e8ezs4ez-project-145-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("dev"), DB CACHE: 1024 +//! HOSTNAME: `runner-anb7yjbi-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: `1024` // Executed Command: -// ./target/production/substrate +// ./target/production/substrate-node // benchmark // pallet // --chain=dev @@ -35,12 +35,11 @@ // --no-median-slopes // --no-min-squares // --extrinsic=* -// --execution=wasm // --wasm-execution=compiled // --heap-pages=4096 -// --output=./frame/tips/src/weights.rs -// --header=./HEADER-APACHE2 -// --template=./.maintain/frame-weight-template.hbs +// --output=./substrate/frame/tips/src/weights.rs +// --header=./substrate/HEADER-APACHE2 +// --template=./substrate/.maintain/frame-weight-template.hbs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -50,7 +49,7 @@ use frame_support::{traits::Get, weights::{Weight, constants::RocksDbWeight}}; use core::marker::PhantomData; -/// Weight functions needed for pallet_tips. +/// Weight functions needed for `pallet_tips`. pub trait WeightInfo { fn report_awesome(r: u32, ) -> Weight; fn retract_tip() -> Weight; @@ -60,220 +59,220 @@ pub trait WeightInfo { fn slash_tip(t: u32, ) -> Weight; } -/// Weights for pallet_tips using the Substrate node and recommended hardware. +/// Weights for `pallet_tips` using the Substrate node and recommended hardware. pub struct SubstrateWeight(PhantomData); impl WeightInfo for SubstrateWeight { - /// Storage: Tips Reasons (r:1 w:1) - /// Proof Skipped: Tips Reasons (max_values: None, max_size: None, mode: Measured) - /// Storage: Tips Tips (r:1 w:1) - /// Proof Skipped: Tips Tips (max_values: None, max_size: None, mode: Measured) + /// Storage: `Tips::Reasons` (r:1 w:1) + /// Proof: `Tips::Reasons` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Tips::Tips` (r:1 w:1) + /// Proof: `Tips::Tips` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `r` is `[0, 300]`. fn report_awesome(r: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `4` // Estimated: `3469` - // Minimum execution time: 29_576_000 picoseconds. - Weight::from_parts(30_722_650, 3469) - // Standard Error: 192 - .saturating_add(Weight::from_parts(2_601, 0).saturating_mul(r.into())) + // Minimum execution time: 26_549_000 picoseconds. + Weight::from_parts(27_804_619, 3469) + // Standard Error: 173 + .saturating_add(Weight::from_parts(1_718, 0).saturating_mul(r.into())) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } - /// Storage: Tips Tips (r:1 w:1) - /// Proof Skipped: Tips Tips (max_values: None, max_size: None, mode: Measured) - /// Storage: Tips Reasons (r:0 w:1) - /// Proof Skipped: Tips Reasons (max_values: None, max_size: None, mode: Measured) + /// Storage: `Tips::Tips` (r:1 w:1) + /// Proof: `Tips::Tips` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Tips::Reasons` (r:0 w:1) + /// Proof: `Tips::Reasons` (`max_values`: None, `max_size`: None, mode: `Measured`) fn retract_tip() -> Weight { // Proof Size summary in bytes: // Measured: `221` // Estimated: `3686` - // Minimum execution time: 28_522_000 picoseconds. - Weight::from_parts(29_323_000, 3686) + // Minimum execution time: 25_430_000 picoseconds. + Weight::from_parts(26_056_000, 3686) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } - /// Storage: Elections Members (r:1 w:0) - /// Proof Skipped: Elections Members (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Tips Reasons (r:1 w:1) - /// Proof Skipped: Tips Reasons (max_values: None, max_size: None, mode: Measured) - /// Storage: Tips Tips (r:0 w:1) - /// Proof Skipped: Tips Tips (max_values: None, max_size: None, mode: Measured) + /// Storage: `Elections::Members` (r:1 w:0) + /// Proof: `Elections::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Tips::Reasons` (r:1 w:1) + /// Proof: `Tips::Reasons` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Tips::Tips` (r:0 w:1) + /// Proof: `Tips::Tips` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `r` is `[0, 300]`. /// The range of component `t` is `[1, 13]`. fn tip_new(r: u32, t: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `526 + t * (64 ±0)` // Estimated: `3991 + t * (64 ±0)` - // Minimum execution time: 19_650_000 picoseconds. - Weight::from_parts(19_837_982, 3991) - // Standard Error: 151 - .saturating_add(Weight::from_parts(1_746, 0).saturating_mul(r.into())) - // Standard Error: 3_588 - .saturating_add(Weight::from_parts(102_359, 0).saturating_mul(t.into())) + // Minimum execution time: 17_309_000 picoseconds. + Weight::from_parts(17_493_185, 3991) + // Standard Error: 126 + .saturating_add(Weight::from_parts(1_444, 0).saturating_mul(r.into())) + // Standard Error: 3_011 + .saturating_add(Weight::from_parts(88_592, 0).saturating_mul(t.into())) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) .saturating_add(Weight::from_parts(0, 64).saturating_mul(t.into())) } - /// Storage: Elections Members (r:1 w:0) - /// Proof Skipped: Elections Members (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Tips Tips (r:1 w:1) - /// Proof Skipped: Tips Tips (max_values: None, max_size: None, mode: Measured) + /// Storage: `Elections::Members` (r:1 w:0) + /// Proof: `Elections::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Tips::Tips` (r:1 w:1) + /// Proof: `Tips::Tips` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `t` is `[1, 13]`. fn tip(t: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `747 + t * (112 ±0)` // Estimated: `4212 + t * (112 ±0)` - // Minimum execution time: 15_641_000 picoseconds. - Weight::from_parts(15_745_460, 4212) - // Standard Error: 5_106 - .saturating_add(Weight::from_parts(229_475, 0).saturating_mul(t.into())) + // Minimum execution time: 14_148_000 picoseconds. + Weight::from_parts(14_434_268, 4212) + // Standard Error: 4_666 + .saturating_add(Weight::from_parts(210_867, 0).saturating_mul(t.into())) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) .saturating_add(Weight::from_parts(0, 112).saturating_mul(t.into())) } - /// Storage: Tips Tips (r:1 w:1) - /// Proof Skipped: Tips Tips (max_values: None, max_size: None, mode: Measured) - /// Storage: Elections Members (r:1 w:0) - /// Proof Skipped: Elections Members (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) - /// Storage: Tips Reasons (r:0 w:1) - /// Proof Skipped: Tips Reasons (max_values: None, max_size: None, mode: Measured) + /// Storage: `Tips::Tips` (r:1 w:1) + /// Proof: `Tips::Tips` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Elections::Members` (r:1 w:0) + /// Proof: `Elections::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `Tips::Reasons` (r:0 w:1) + /// Proof: `Tips::Reasons` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `t` is `[1, 13]`. fn close_tip(t: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `786 + t * (112 ±0)` // Estimated: `4242 + t * (112 ±0)` - // Minimum execution time: 62_059_000 picoseconds. - Weight::from_parts(64_604_554, 4242) - // Standard Error: 11_818 - .saturating_add(Weight::from_parts(116_297, 0).saturating_mul(t.into())) + // Minimum execution time: 56_060_000 picoseconds. + Weight::from_parts(57_913_972, 4242) + // Standard Error: 11_691 + .saturating_add(Weight::from_parts(229_579, 0).saturating_mul(t.into())) .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(3_u64)) .saturating_add(Weight::from_parts(0, 112).saturating_mul(t.into())) } - /// Storage: Tips Tips (r:1 w:1) - /// Proof Skipped: Tips Tips (max_values: None, max_size: None, mode: Measured) - /// Storage: Tips Reasons (r:0 w:1) - /// Proof Skipped: Tips Reasons (max_values: None, max_size: None, mode: Measured) + /// Storage: `Tips::Tips` (r:1 w:1) + /// Proof: `Tips::Tips` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Tips::Reasons` (r:0 w:1) + /// Proof: `Tips::Reasons` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `t` is `[1, 13]`. fn slash_tip(t: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `269` // Estimated: `3734` - // Minimum execution time: 14_133_000 picoseconds. - Weight::from_parts(14_957_547, 3734) - // Standard Error: 2_765 - .saturating_add(Weight::from_parts(22_138, 0).saturating_mul(t.into())) + // Minimum execution time: 12_034_000 picoseconds. + Weight::from_parts(12_934_534, 3734) + // Standard Error: 2_420 + .saturating_add(Weight::from_parts(4_167, 0).saturating_mul(t.into())) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } } -// For backwards compatibility and tests +// For backwards compatibility and tests. impl WeightInfo for () { - /// Storage: Tips Reasons (r:1 w:1) - /// Proof Skipped: Tips Reasons (max_values: None, max_size: None, mode: Measured) - /// Storage: Tips Tips (r:1 w:1) - /// Proof Skipped: Tips Tips (max_values: None, max_size: None, mode: Measured) + /// Storage: `Tips::Reasons` (r:1 w:1) + /// Proof: `Tips::Reasons` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Tips::Tips` (r:1 w:1) + /// Proof: `Tips::Tips` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `r` is `[0, 300]`. fn report_awesome(r: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `4` // Estimated: `3469` - // Minimum execution time: 29_576_000 picoseconds. - Weight::from_parts(30_722_650, 3469) - // Standard Error: 192 - .saturating_add(Weight::from_parts(2_601, 0).saturating_mul(r.into())) + // Minimum execution time: 26_549_000 picoseconds. + Weight::from_parts(27_804_619, 3469) + // Standard Error: 173 + .saturating_add(Weight::from_parts(1_718, 0).saturating_mul(r.into())) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } - /// Storage: Tips Tips (r:1 w:1) - /// Proof Skipped: Tips Tips (max_values: None, max_size: None, mode: Measured) - /// Storage: Tips Reasons (r:0 w:1) - /// Proof Skipped: Tips Reasons (max_values: None, max_size: None, mode: Measured) + /// Storage: `Tips::Tips` (r:1 w:1) + /// Proof: `Tips::Tips` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Tips::Reasons` (r:0 w:1) + /// Proof: `Tips::Reasons` (`max_values`: None, `max_size`: None, mode: `Measured`) fn retract_tip() -> Weight { // Proof Size summary in bytes: // Measured: `221` // Estimated: `3686` - // Minimum execution time: 28_522_000 picoseconds. - Weight::from_parts(29_323_000, 3686) + // Minimum execution time: 25_430_000 picoseconds. + Weight::from_parts(26_056_000, 3686) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } - /// Storage: Elections Members (r:1 w:0) - /// Proof Skipped: Elections Members (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Tips Reasons (r:1 w:1) - /// Proof Skipped: Tips Reasons (max_values: None, max_size: None, mode: Measured) - /// Storage: Tips Tips (r:0 w:1) - /// Proof Skipped: Tips Tips (max_values: None, max_size: None, mode: Measured) + /// Storage: `Elections::Members` (r:1 w:0) + /// Proof: `Elections::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Tips::Reasons` (r:1 w:1) + /// Proof: `Tips::Reasons` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Tips::Tips` (r:0 w:1) + /// Proof: `Tips::Tips` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `r` is `[0, 300]`. /// The range of component `t` is `[1, 13]`. fn tip_new(r: u32, t: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `526 + t * (64 ±0)` // Estimated: `3991 + t * (64 ±0)` - // Minimum execution time: 19_650_000 picoseconds. - Weight::from_parts(19_837_982, 3991) - // Standard Error: 151 - .saturating_add(Weight::from_parts(1_746, 0).saturating_mul(r.into())) - // Standard Error: 3_588 - .saturating_add(Weight::from_parts(102_359, 0).saturating_mul(t.into())) + // Minimum execution time: 17_309_000 picoseconds. + Weight::from_parts(17_493_185, 3991) + // Standard Error: 126 + .saturating_add(Weight::from_parts(1_444, 0).saturating_mul(r.into())) + // Standard Error: 3_011 + .saturating_add(Weight::from_parts(88_592, 0).saturating_mul(t.into())) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) .saturating_add(Weight::from_parts(0, 64).saturating_mul(t.into())) } - /// Storage: Elections Members (r:1 w:0) - /// Proof Skipped: Elections Members (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: Tips Tips (r:1 w:1) - /// Proof Skipped: Tips Tips (max_values: None, max_size: None, mode: Measured) + /// Storage: `Elections::Members` (r:1 w:0) + /// Proof: `Elections::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Tips::Tips` (r:1 w:1) + /// Proof: `Tips::Tips` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `t` is `[1, 13]`. fn tip(t: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `747 + t * (112 ±0)` // Estimated: `4212 + t * (112 ±0)` - // Minimum execution time: 15_641_000 picoseconds. - Weight::from_parts(15_745_460, 4212) - // Standard Error: 5_106 - .saturating_add(Weight::from_parts(229_475, 0).saturating_mul(t.into())) + // Minimum execution time: 14_148_000 picoseconds. + Weight::from_parts(14_434_268, 4212) + // Standard Error: 4_666 + .saturating_add(Weight::from_parts(210_867, 0).saturating_mul(t.into())) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) .saturating_add(Weight::from_parts(0, 112).saturating_mul(t.into())) } - /// Storage: Tips Tips (r:1 w:1) - /// Proof Skipped: Tips Tips (max_values: None, max_size: None, mode: Measured) - /// Storage: Elections Members (r:1 w:0) - /// Proof Skipped: Elections Members (max_values: Some(1), max_size: None, mode: Measured) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) - /// Storage: Tips Reasons (r:0 w:1) - /// Proof Skipped: Tips Reasons (max_values: None, max_size: None, mode: Measured) + /// Storage: `Tips::Tips` (r:1 w:1) + /// Proof: `Tips::Tips` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Elections::Members` (r:1 w:0) + /// Proof: `Elections::Members` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `Tips::Reasons` (r:0 w:1) + /// Proof: `Tips::Reasons` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `t` is `[1, 13]`. fn close_tip(t: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `786 + t * (112 ±0)` // Estimated: `4242 + t * (112 ±0)` - // Minimum execution time: 62_059_000 picoseconds. - Weight::from_parts(64_604_554, 4242) - // Standard Error: 11_818 - .saturating_add(Weight::from_parts(116_297, 0).saturating_mul(t.into())) + // Minimum execution time: 56_060_000 picoseconds. + Weight::from_parts(57_913_972, 4242) + // Standard Error: 11_691 + .saturating_add(Weight::from_parts(229_579, 0).saturating_mul(t.into())) .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(3_u64)) .saturating_add(Weight::from_parts(0, 112).saturating_mul(t.into())) } - /// Storage: Tips Tips (r:1 w:1) - /// Proof Skipped: Tips Tips (max_values: None, max_size: None, mode: Measured) - /// Storage: Tips Reasons (r:0 w:1) - /// Proof Skipped: Tips Reasons (max_values: None, max_size: None, mode: Measured) + /// Storage: `Tips::Tips` (r:1 w:1) + /// Proof: `Tips::Tips` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Tips::Reasons` (r:0 w:1) + /// Proof: `Tips::Reasons` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `t` is `[1, 13]`. fn slash_tip(t: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `269` // Estimated: `3734` - // Minimum execution time: 14_133_000 picoseconds. - Weight::from_parts(14_957_547, 3734) - // Standard Error: 2_765 - .saturating_add(Weight::from_parts(22_138, 0).saturating_mul(t.into())) + // Minimum execution time: 12_034_000 picoseconds. + Weight::from_parts(12_934_534, 3734) + // Standard Error: 2_420 + .saturating_add(Weight::from_parts(4_167, 0).saturating_mul(t.into())) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } diff --git a/substrate/frame/transaction-payment/Cargo.toml b/substrate/frame/transaction-payment/Cargo.toml index 4b30f8e755f5926f1cae65d73a022426bcccded9..24e5a714f0fe3aee0a5c2d74d3d837e8b969cdb1 100644 --- a/substrate/frame/transaction-payment/Cargo.toml +++ b/substrate/frame/transaction-payment/Cargo.toml @@ -19,8 +19,8 @@ targets = ["x86_64-unknown-linux-gnu"] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = [ "derive", ] } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.195", optional = true } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +serde = { optional = true, workspace = true, default-features = true } frame-support = { path = "../support", default-features = false } frame-system = { path = "../system", default-features = false } sp-core = { path = "../../primitives/core", default-features = false } @@ -29,7 +29,7 @@ sp-runtime = { path = "../../primitives/runtime", default-features = false } sp-std = { path = "../../primitives/std", default-features = false } [dev-dependencies] -serde_json = "1.0.111" +serde_json = { workspace = true, default-features = true } pallet-balances = { path = "../balances" } [features] diff --git a/substrate/frame/transaction-payment/asset-conversion-tx-payment/Cargo.toml b/substrate/frame/transaction-payment/asset-conversion-tx-payment/Cargo.toml index 7640cc815e56c7fcecbb7d09c61c81635ca22491..fef9afdee05f37cbd2999b1bbfecb07f2601d3bd 100644 --- a/substrate/frame/transaction-payment/asset-conversion-tx-payment/Cargo.toml +++ b/substrate/frame/transaction-payment/asset-conversion-tx-payment/Cargo.toml @@ -24,7 +24,7 @@ frame-system = { path = "../../system", default-features = false } pallet-asset-conversion = { path = "../../asset-conversion", default-features = false } pallet-transaction-payment = { path = "..", default-features = false } codec = { package = "parity-scale-codec", version = "3.2.2", default-features = false, features = ["derive"] } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } [dev-dependencies] sp-core = { path = "../../../primitives/core", default-features = false } diff --git a/substrate/frame/transaction-payment/asset-conversion-tx-payment/src/mock.rs b/substrate/frame/transaction-payment/asset-conversion-tx-payment/src/mock.rs index c8bf2eb8f440fd1203796fd89d9265403b3fdad0..d61558cf536362bbaa5abd4a451fa5f4589a85bd 100644 --- a/substrate/frame/transaction-payment/asset-conversion-tx-payment/src/mock.rs +++ b/substrate/frame/transaction-payment/asset-conversion-tx-payment/src/mock.rs @@ -24,6 +24,7 @@ use frame_support::{ pallet_prelude::*, parameter_types, traits::{ + fungible, tokens::{ fungible::{NativeFromLeft, NativeOrWithId, UnionOf}, imbalance::ResolveAssetTo, @@ -36,7 +37,7 @@ use frame_support::{ use frame_system as system; use frame_system::{EnsureRoot, EnsureSignedBy}; use pallet_asset_conversion::{Ascending, Chain, WithFirstAsset}; -use pallet_transaction_payment::CurrencyAdapter; +use pallet_transaction_payment::FungibleAdapter; use sp_core::H256; use sp_runtime::{ traits::{AccountIdConversion, BlakeTwo256, IdentityLookup, SaturatedConversion}, @@ -84,7 +85,7 @@ parameter_types! { pub static TransactionByteFee: u64 = 1; } -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Runtime { type BaseCallFilter = frame_support::traits::Everything; type BlockWeights = BlockWeights; @@ -155,9 +156,13 @@ parameter_types! { } pub struct DealWithFees; -impl OnUnbalanced> for DealWithFees { +impl OnUnbalanced::AccountId, Balances>> + for DealWithFees +{ fn on_unbalanceds( - mut fees_then_tips: impl Iterator>, + mut fees_then_tips: impl Iterator< + Item = fungible::Credit<::AccountId, Balances>, + >, ) { if let Some(fees) = fees_then_tips.next() { FeeUnbalancedAmount::mutate(|a| *a += fees.peek()); @@ -168,9 +173,10 @@ impl OnUnbalanced> for DealWithFees } } +#[derive_impl(pallet_transaction_payment::config_preludes::TestDefaultConfig)] impl pallet_transaction_payment::Config for Runtime { type RuntimeEvent = RuntimeEvent; - type OnChargeTransaction = CurrencyAdapter; + type OnChargeTransaction = FungibleAdapter; type WeightToFee = WeightToFee; type LengthToFee = TransactionByteFee; type FeeMultiplierUpdate = (); diff --git a/substrate/frame/transaction-payment/asset-tx-payment/Cargo.toml b/substrate/frame/transaction-payment/asset-tx-payment/Cargo.toml index f7114e8f24b6ffc8c2654895104b682457c5c45e..fc4f1aecc15ee910ef90ffd18b39173d5de096e9 100644 --- a/substrate/frame/transaction-payment/asset-tx-payment/Cargo.toml +++ b/substrate/frame/transaction-payment/asset-tx-payment/Cargo.toml @@ -29,11 +29,11 @@ frame-benchmarking = { path = "../../benchmarking", default-features = false, op # Other dependencies codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.195", optional = true } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +serde = { optional = true, workspace = true, default-features = true } [dev-dependencies] -serde_json = "1.0.111" +serde_json = { workspace = true, default-features = true } sp-storage = { path = "../../../primitives/storage", default-features = false } diff --git a/substrate/frame/transaction-payment/asset-tx-payment/src/mock.rs b/substrate/frame/transaction-payment/asset-tx-payment/src/mock.rs index 1f335b4f6c4ab5cc59a4815a2160328aa7f584df..b04d4ffd9e0b794f56fd7be0219f8150f45e7078 100644 --- a/substrate/frame/transaction-payment/asset-tx-payment/src/mock.rs +++ b/substrate/frame/transaction-payment/asset-tx-payment/src/mock.rs @@ -28,7 +28,7 @@ use frame_support::{ }; use frame_system as system; use frame_system::EnsureRoot; -use pallet_transaction_payment::CurrencyAdapter; +use pallet_transaction_payment::FungibleAdapter; use sp_core::H256; use sp_runtime::traits::{BlakeTwo256, ConvertInto, IdentityLookup, SaturatedConversion}; @@ -71,7 +71,7 @@ parameter_types! { pub static TransactionByteFee: u64 = 1; } -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Runtime { type BaseCallFilter = frame_support::traits::Everything; type BlockWeights = BlockWeights; @@ -136,9 +136,10 @@ impl WeightToFeeT for TransactionByteFee { } } +#[derive_impl(pallet_transaction_payment::config_preludes::TestDefaultConfig)] impl pallet_transaction_payment::Config for Runtime { type RuntimeEvent = RuntimeEvent; - type OnChargeTransaction = CurrencyAdapter; + type OnChargeTransaction = FungibleAdapter; type WeightToFee = WeightToFee; type LengthToFee = TransactionByteFee; type FeeMultiplierUpdate = (); diff --git a/substrate/frame/transaction-payment/rpc/Cargo.toml b/substrate/frame/transaction-payment/rpc/Cargo.toml index e7edf8a4b87920702d9669e62d611c2349bd20e4..6d7f632af82813050d4c0523dcd61dc27ea512f1 100644 --- a/substrate/frame/transaction-payment/rpc/Cargo.toml +++ b/substrate/frame/transaction-payment/rpc/Cargo.toml @@ -17,7 +17,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1" } -jsonrpsee = { version = "0.20.3", features = ["client-core", "macros", "server"] } +jsonrpsee = { version = "0.22", features = ["client-core", "macros", "server"] } pallet-transaction-payment-rpc-runtime-api = { path = "runtime-api" } sp-api = { path = "../../../primitives/api" } sp-blockchain = { path = "../../../primitives/blockchain" } diff --git a/substrate/frame/transaction-payment/skip-feeless-payment/src/lib.rs b/substrate/frame/transaction-payment/skip-feeless-payment/src/lib.rs index 6c34c26ce9236dd76ff90224d3ce2d59dbd3157a..00391d79478c72694dd269540006ceee8e19a063 100644 --- a/substrate/frame/transaction-payment/skip-feeless-payment/src/lib.rs +++ b/substrate/frame/transaction-payment/skip-feeless-payment/src/lib.rs @@ -43,7 +43,7 @@ use frame_support::{ use scale_info::{StaticTypeInfo, TypeInfo}; use sp_runtime::{ traits::{DispatchInfoOf, PostDispatchInfoOf, SignedExtension}, - transaction_validity::TransactionValidityError, + transaction_validity::{TransactionValidity, TransactionValidityError, ValidTransaction}, }; #[cfg(test)] @@ -122,6 +122,20 @@ where self.0.additional_signed() } + fn validate( + &self, + who: &Self::AccountId, + call: &Self::Call, + info: &DispatchInfoOf, + len: usize, + ) -> TransactionValidity { + if call.is_feeless(&::RuntimeOrigin::signed(who.clone())) { + Ok(ValidTransaction::default()) + } else { + self.0.validate(who, call, info, len) + } + } + fn pre_dispatch( self, who: &Self::AccountId, diff --git a/substrate/frame/transaction-payment/skip-feeless-payment/src/mock.rs b/substrate/frame/transaction-payment/skip-feeless-payment/src/mock.rs index 17c4c773997eb591c1f8aac06a607c3e35df8db0..4ddeae11fcab4cf071d17e00e6d77b4d0c4c27fe 100644 --- a/substrate/frame/transaction-payment/skip-feeless-payment/src/mock.rs +++ b/substrate/frame/transaction-payment/skip-feeless-payment/src/mock.rs @@ -22,7 +22,7 @@ use frame_system as system; type Block = frame_system::mocking::MockBlock; type AccountId = u64; -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Runtime { type Block = Block; } @@ -33,6 +33,7 @@ impl Config for Runtime { parameter_types! { pub static PreDispatchCount: u32 = 0; + pub static ValidateCount: u32 = 0; } #[derive(Clone, Eq, PartialEq, Debug, Encode, Decode, TypeInfo)] @@ -47,6 +48,18 @@ impl SignedExtension for DummyExtension { fn additional_signed(&self) -> sp_std::result::Result<(), TransactionValidityError> { Ok(()) } + + fn validate( + &self, + _who: &Self::AccountId, + _call: &Self::Call, + _info: &DispatchInfoOf, + _len: usize, + ) -> TransactionValidity { + ValidateCount::mutate(|c| *c += 1); + Ok(Default::default()) + } + fn pre_dispatch( self, _who: &Self::AccountId, diff --git a/substrate/frame/transaction-payment/skip-feeless-payment/src/tests.rs b/substrate/frame/transaction-payment/skip-feeless-payment/src/tests.rs index 4b4dd6997418f9c9e39ebe0ab294051a688f2f87..adee52d6b3cea63055b8cb6627cbd239477cc2d6 100644 --- a/substrate/frame/transaction-payment/skip-feeless-payment/src/tests.rs +++ b/substrate/frame/transaction-payment/skip-feeless-payment/src/tests.rs @@ -14,7 +14,9 @@ // limitations under the License. use super::*; -use crate::mock::{pallet_dummy::Call, DummyExtension, PreDispatchCount, Runtime, RuntimeCall}; +use crate::mock::{ + pallet_dummy::Call, DummyExtension, PreDispatchCount, Runtime, RuntimeCall, ValidateCount, +}; use frame_support::dispatch::DispatchInfo; #[test] @@ -31,3 +33,20 @@ fn skip_feeless_payment_works() { .unwrap(); assert_eq!(PreDispatchCount::get(), 1); } + +#[test] +fn validate_works() { + assert_eq!(ValidateCount::get(), 0); + + let call = RuntimeCall::DummyPallet(Call::::aux { data: 1 }); + SkipCheckIfFeeless::::from(DummyExtension) + .validate(&0, &call, &DispatchInfo::default(), 0) + .unwrap(); + assert_eq!(ValidateCount::get(), 1); + + let call = RuntimeCall::DummyPallet(Call::::aux { data: 0 }); + SkipCheckIfFeeless::::from(DummyExtension) + .validate(&0, &call, &DispatchInfo::default(), 0) + .unwrap(); + assert_eq!(ValidateCount::get(), 1); +} diff --git a/substrate/frame/transaction-payment/src/lib.rs b/substrate/frame/transaction-payment/src/lib.rs index efadfd60bdd30126f8627fccea7c02f4c42c68a3..0e440ee4e9ff5f503086a0e5c139a89fdf01a5be 100644 --- a/substrate/frame/transaction-payment/src/lib.rs +++ b/substrate/frame/transaction-payment/src/lib.rs @@ -326,7 +326,7 @@ pub mod pallet { /// Default prelude sensible to be used in a testing environment. pub struct TestDefaultConfig; - #[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig, no_aggregated_types)] + #[derive_impl(frame_system::config_preludes::TestDefaultConfig, no_aggregated_types)] impl frame_system::DefaultConfig for TestDefaultConfig {} #[frame_support::register_default_impl(TestDefaultConfig)] diff --git a/substrate/frame/transaction-payment/src/mock.rs b/substrate/frame/transaction-payment/src/mock.rs index 1ca2e3d734720455f8a2fdc9453c712d1f199796..c1bb05ab5c7eb8e03c49e5f8d789276de296bba9 100644 --- a/substrate/frame/transaction-payment/src/mock.rs +++ b/substrate/frame/transaction-payment/src/mock.rs @@ -25,7 +25,7 @@ use frame_support::{ derive_impl, dispatch::DispatchClass, parameter_types, - traits::{ConstU32, ConstU64, Imbalance, OnUnbalanced}, + traits::{fungible, ConstU32, ConstU64, Imbalance, OnUnbalanced}, weights::{Weight, WeightToFee as WeightToFeeT}, }; use frame_system as system; @@ -70,7 +70,7 @@ parameter_types! { pub static OperationalFeeMultiplier: u8 = 5; } -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Runtime { type BaseCallFilter = frame_support::traits::Everything; type BlockWeights = BlockWeights; @@ -137,9 +137,13 @@ parameter_types! { } pub struct DealWithFees; -impl OnUnbalanced> for DealWithFees { +impl OnUnbalanced::AccountId, Balances>> + for DealWithFees +{ fn on_unbalanceds( - mut fees_then_tips: impl Iterator>, + mut fees_then_tips: impl Iterator< + Item = fungible::Credit<::AccountId, Balances>, + >, ) { if let Some(fees) = fees_then_tips.next() { FeeUnbalancedAmount::mutate(|a| *a += fees.peek()); @@ -152,7 +156,7 @@ impl OnUnbalanced> for DealWithFees impl Config for Runtime { type RuntimeEvent = RuntimeEvent; - type OnChargeTransaction = CurrencyAdapter; + type OnChargeTransaction = FungibleAdapter; type OperationalFeeMultiplier = OperationalFeeMultiplier; type WeightToFee = WeightToFee; type LengthToFee = TransactionByteFee; diff --git a/substrate/frame/transaction-payment/src/payment.rs b/substrate/frame/transaction-payment/src/payment.rs index 22b0ac7c742403ac068b64a75a89e552ef06c470..0fe616782903c822eb1f1af19323af75f442adb2 100644 --- a/substrate/frame/transaction-payment/src/payment.rs +++ b/substrate/frame/transaction-payment/src/payment.rs @@ -18,14 +18,18 @@ /// ! Traits and default implementation for paying transaction fees. use crate::Config; +use core::marker::PhantomData; use sp_runtime::{ traits::{DispatchInfoOf, PostDispatchInfoOf, Saturating, Zero}, transaction_validity::InvalidTransaction, }; -use sp_std::marker::PhantomData; use frame_support::{ - traits::{Currency, ExistenceRequirement, Imbalance, OnUnbalanced, WithdrawReasons}, + traits::{ + fungible::{Balanced, Credit, Debt, Inspect}, + tokens::Precision, + Currency, ExistenceRequirement, Imbalance, OnUnbalanced, WithdrawReasons, + }, unsigned::TransactionValidityError, }; @@ -66,18 +70,95 @@ pub trait OnChargeTransaction { ) -> Result<(), TransactionValidityError>; } -/// Implements the transaction payment for a pallet implementing the `Currency` +/// Implements transaction payment for a pallet implementing the [`frame_support::traits::fungible`] +/// trait (eg. pallet_balances) using an unbalance handler (implementing +/// [`OnUnbalanced`]). +/// +/// The unbalance handler is given 2 unbalanceds in [`OnUnbalanced::on_unbalanceds`]: `fee` and +/// then `tip`. +pub struct FungibleAdapter(PhantomData<(F, OU)>); + +impl OnChargeTransaction for FungibleAdapter +where + T: Config, + F: Balanced, + OU: OnUnbalanced>, +{ + type LiquidityInfo = Option>; + type Balance = ::AccountId>>::Balance; + + fn withdraw_fee( + who: &::AccountId, + _call: &::RuntimeCall, + _dispatch_info: &DispatchInfoOf<::RuntimeCall>, + fee: Self::Balance, + _tip: Self::Balance, + ) -> Result { + if fee.is_zero() { + return Ok(None) + } + + match F::withdraw( + who, + fee, + Precision::Exact, + frame_support::traits::tokens::Preservation::Preserve, + frame_support::traits::tokens::Fortitude::Polite, + ) { + Ok(imbalance) => Ok(Some(imbalance)), + Err(_) => Err(InvalidTransaction::Payment.into()), + } + } + + fn correct_and_deposit_fee( + who: &::AccountId, + _dispatch_info: &DispatchInfoOf<::RuntimeCall>, + _post_info: &PostDispatchInfoOf<::RuntimeCall>, + corrected_fee: Self::Balance, + tip: Self::Balance, + already_withdrawn: Self::LiquidityInfo, + ) -> Result<(), TransactionValidityError> { + if let Some(paid) = already_withdrawn { + // Calculate how much refund we should return + let refund_amount = paid.peek().saturating_sub(corrected_fee); + // refund to the the account that paid the fees if it exists. otherwise, don't refind + // anything. + let refund_imbalance = if F::total_balance(who) > F::Balance::zero() { + F::deposit(who, refund_amount, Precision::BestEffort) + .unwrap_or_else(|_| Debt::::zero()) + } else { + Debt::::zero() + }; + // merge the imbalance caused by paying the fees and refunding parts of it again. + let adjusted_paid: Credit = paid + .offset(refund_imbalance) + .same() + .map_err(|_| TransactionValidityError::Invalid(InvalidTransaction::Payment))?; + // Call someone else to handle the imbalance (fee and tip separately) + let (tip, fee) = adjusted_paid.split(tip); + OU::on_unbalanceds(Some(fee).into_iter().chain(Some(tip))); + } + + Ok(()) + } +} + +/// Implements the transaction payment for a pallet implementing the [`Currency`] /// trait (eg. the pallet_balances) using an unbalance handler (implementing -/// `OnUnbalanced`). +/// [`OnUnbalanced`]). /// -/// The unbalance handler is given 2 unbalanceds in [`OnUnbalanced::on_unbalanceds`]: fee and -/// then tip. +/// The unbalance handler is given 2 unbalanceds in [`OnUnbalanced::on_unbalanceds`]: `fee` and +/// then `tip`. +#[deprecated( + note = "Please use the fungible trait and FungibleAdapter. This struct will be removed some time after March 2024." +)] pub struct CurrencyAdapter(PhantomData<(C, OU)>); /// Default implementation for a Currency and an OnUnbalanced handler. /// -/// The unbalance handler is given 2 unbalanceds in [`OnUnbalanced::on_unbalanceds`]: fee and -/// then tip. +/// The unbalance handler is given 2 unbalanceds in [`OnUnbalanced::on_unbalanceds`]: `fee` and +/// then `tip`. +#[allow(deprecated)] impl OnChargeTransaction for CurrencyAdapter where T: Config, diff --git a/substrate/frame/transaction-payment/src/tests.rs b/substrate/frame/transaction-payment/src/tests.rs index d3a1721ccb9909b2f2a705d9bb9ddc9ebc7cb5ee..bc0efd2d64a3b27f5e280a0318f1e5822d583e47 100644 --- a/substrate/frame/transaction-payment/src/tests.rs +++ b/substrate/frame/transaction-payment/src/tests.rs @@ -384,7 +384,7 @@ fn query_call_info_and_fee_details_works() { adjusted_weight_fee: info .weight .min(BlockWeights::get().max_block) - .ref_time() as u64 * 2 * 3 / 2 /* weight * weight_fee * multipler */ + .ref_time() as u64 * 2 * 3 / 2 /* weight * weight_fee * multiplier */ }), tip: 0, }, diff --git a/substrate/frame/transaction-storage/Cargo.toml b/substrate/frame/transaction-storage/Cargo.toml index c96aa91d54a8287f66ebccaa4493f8d69ab496d5..31741cf32d83edfeaa10d06060c79df07f2b50c9 100644 --- a/substrate/frame/transaction-storage/Cargo.toml +++ b/substrate/frame/transaction-storage/Cargo.toml @@ -18,8 +18,8 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] array-bytes = { version = "6.1", optional = true } codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.195", optional = true } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +serde = { optional = true, workspace = true, default-features = true } frame-benchmarking = { path = "../benchmarking", default-features = false, optional = true } frame-support = { path = "../support", default-features = false } frame-system = { path = "../system", default-features = false } @@ -29,7 +29,7 @@ sp-io = { path = "../../primitives/io", default-features = false } sp-runtime = { path = "../../primitives/runtime", default-features = false } sp-std = { path = "../../primitives/std", default-features = false } sp-transaction-storage-proof = { path = "../../primitives/transaction-storage-proof", default-features = false } -log = { version = "0.4.17", default-features = false } +log = { workspace = true } [dev-dependencies] sp-core = { path = "../../primitives/core", default-features = false } diff --git a/substrate/frame/transaction-storage/README.md b/substrate/frame/transaction-storage/README.md index 1066968469d4b7c629ac7243b9e7e20febdbdbab..b173c0a84d5a0b387a14abe0415733c603a7010a 100644 --- a/substrate/frame/transaction-storage/README.md +++ b/substrate/frame/transaction-storage/README.md @@ -79,7 +79,7 @@ ipfs block get /ipfs/ > kitten.jpeg ``` To renew data and prevent it from being disposed after the storage period, use `transactionStorage.renew(block, index)` -where `block` is the block number of the previous store or renew transction, and index is the index of that transaction +where `block` is the block number of the previous store or renew transaction, and index is the index of that transaction in the block. diff --git a/substrate/frame/transaction-storage/src/lib.rs b/substrate/frame/transaction-storage/src/lib.rs index d32cfe169ce0b3f3ef76040ea596673e7d02d2c7..398cb350c501ee18dd25073b4047b5045b69fa49 100644 --- a/substrate/frame/transaction-storage/src/lib.rs +++ b/substrate/frame/transaction-storage/src/lib.rs @@ -137,7 +137,7 @@ pub mod pallet { InvalidProof, /// Missing storage proof. MissingProof, - /// Unable to verify proof becasue state data is missing. + /// Unable to verify proof because state data is missing. MissingStateData, /// Double proof check in the block. DoubleCheck, diff --git a/substrate/frame/transaction-storage/src/mock.rs b/substrate/frame/transaction-storage/src/mock.rs index 31f539327cda2e5a8bd4593d3cbbbecc004ae296..f1e9e0591f6f521bad4fda1cb4ae4aa879efc483 100644 --- a/substrate/frame/transaction-storage/src/mock.rs +++ b/substrate/frame/transaction-storage/src/mock.rs @@ -39,7 +39,7 @@ frame_support::construct_runtime!( } ); -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { type Block = Block; type AccountData = pallet_balances::AccountData; @@ -48,7 +48,7 @@ impl frame_system::Config for Test { type Lookup = IdentityLookup; } -#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig as pallet_balances::DefaultConfig)] +#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] impl pallet_balances::Config for Test { type AccountStore = System; } diff --git a/substrate/frame/transaction-storage/src/tests.rs b/substrate/frame/transaction-storage/src/tests.rs index e17b3ca3bebd596f1d7071c45c986820169c4f94..621f74804eccae4b06f2d1f96e238334d038e68d 100644 --- a/substrate/frame/transaction-storage/src/tests.rs +++ b/substrate/frame/transaction-storage/src/tests.rs @@ -15,7 +15,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -//! Tests for transction-storage pallet. +//! Tests for transaction-storage pallet. use super::{Pallet as TransactionStorage, *}; use crate::mock::*; @@ -53,8 +53,8 @@ fn discards_data() { }; run_to_block(11, proof_provider); assert!(Transactions::::get(1).is_some()); - let transctions = Transactions::::get(1).unwrap(); - assert_eq!(transctions.len(), 2); + let transactions = Transactions::::get(1).unwrap(); + assert_eq!(transactions.len(), 2); assert_eq!(ChunkCount::::get(1), 16); run_to_block(12, proof_provider); assert!(Transactions::::get(1).is_none()); diff --git a/substrate/frame/transaction-storage/src/weights.rs b/substrate/frame/transaction-storage/src/weights.rs index 519317177c492f4e1179b9ee12f17da7d442b0e4..4d51daa17b40677faea83aeba79ccc765fad8102 100644 --- a/substrate/frame/transaction-storage/src/weights.rs +++ b/substrate/frame/transaction-storage/src/weights.rs @@ -15,16 +15,16 @@ // See the License for the specific language governing permissions and // limitations under the License. -//! Autogenerated weights for pallet_transaction_storage +//! Autogenerated weights for `pallet_transaction_storage` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-06-16, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-04-09, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-e8ezs4ez-project-145-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("dev"), DB CACHE: 1024 +//! HOSTNAME: `runner-anb7yjbi-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: `1024` // Executed Command: -// ./target/production/substrate +// ./target/production/substrate-node // benchmark // pallet // --chain=dev @@ -35,12 +35,11 @@ // --no-median-slopes // --no-min-squares // --extrinsic=* -// --execution=wasm // --wasm-execution=compiled // --heap-pages=4096 -// --output=./frame/transaction-storage/src/weights.rs -// --header=./HEADER-APACHE2 -// --template=./.maintain/frame-weight-template.hbs +// --output=./substrate/frame/transaction-storage/src/weights.rs +// --header=./substrate/HEADER-APACHE2 +// --template=./substrate/.maintain/frame-weight-template.hbs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -50,125 +49,133 @@ use frame_support::{traits::Get, weights::{Weight, constants::RocksDbWeight}}; use core::marker::PhantomData; -/// Weight functions needed for pallet_transaction_storage. +/// Weight functions needed for `pallet_transaction_storage`. pub trait WeightInfo { fn store(l: u32, ) -> Weight; fn renew() -> Weight; fn check_proof_max() -> Weight; } -/// Weights for pallet_transaction_storage using the Substrate node and recommended hardware. +/// Weights for `pallet_transaction_storage` using the Substrate node and recommended hardware. pub struct SubstrateWeight(PhantomData); impl WeightInfo for SubstrateWeight { - /// Storage: TransactionStorage ByteFee (r:1 w:0) - /// Proof: TransactionStorage ByteFee (max_values: Some(1), max_size: Some(16), added: 511, mode: MaxEncodedLen) - /// Storage: TransactionStorage EntryFee (r:1 w:0) - /// Proof: TransactionStorage EntryFee (max_values: Some(1), max_size: Some(16), added: 511, mode: MaxEncodedLen) - /// Storage: TransactionStorage BlockTransactions (r:1 w:1) - /// Proof: TransactionStorage BlockTransactions (max_values: Some(1), max_size: Some(36866), added: 37361, mode: MaxEncodedLen) + /// Storage: `TransactionStorage::ByteFee` (r:1 w:0) + /// Proof: `TransactionStorage::ByteFee` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) + /// Storage: `TransactionStorage::EntryFee` (r:1 w:0) + /// Proof: `TransactionStorage::EntryFee` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) + /// Storage: `Balances::Holds` (r:1 w:1) + /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(193), added: 2668, mode: `MaxEncodedLen`) + /// Storage: `TransactionStorage::BlockTransactions` (r:1 w:1) + /// Proof: `TransactionStorage::BlockTransactions` (`max_values`: Some(1), `max_size`: Some(36866), added: 37361, mode: `MaxEncodedLen`) /// The range of component `l` is `[1, 8388608]`. fn store(l: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `176` + // Measured: `242` // Estimated: `38351` - // Minimum execution time: 34_844_000 picoseconds. - Weight::from_parts(35_489_000, 38351) - // Standard Error: 11 - .saturating_add(Weight::from_parts(6_912, 0).saturating_mul(l.into())) - .saturating_add(T::DbWeight::get().reads(3_u64)) - .saturating_add(T::DbWeight::get().writes(1_u64)) + // Minimum execution time: 62_024_000 picoseconds. + Weight::from_parts(63_536_000, 38351) + // Standard Error: 13 + .saturating_add(Weight::from_parts(7_178, 0).saturating_mul(l.into())) + .saturating_add(T::DbWeight::get().reads(4_u64)) + .saturating_add(T::DbWeight::get().writes(2_u64)) } - /// Storage: TransactionStorage Transactions (r:1 w:0) - /// Proof: TransactionStorage Transactions (max_values: None, max_size: Some(36886), added: 39361, mode: MaxEncodedLen) - /// Storage: TransactionStorage ByteFee (r:1 w:0) - /// Proof: TransactionStorage ByteFee (max_values: Some(1), max_size: Some(16), added: 511, mode: MaxEncodedLen) - /// Storage: TransactionStorage EntryFee (r:1 w:0) - /// Proof: TransactionStorage EntryFee (max_values: Some(1), max_size: Some(16), added: 511, mode: MaxEncodedLen) - /// Storage: TransactionStorage BlockTransactions (r:1 w:1) - /// Proof: TransactionStorage BlockTransactions (max_values: Some(1), max_size: Some(36866), added: 37361, mode: MaxEncodedLen) + /// Storage: `TransactionStorage::Transactions` (r:1 w:0) + /// Proof: `TransactionStorage::Transactions` (`max_values`: None, `max_size`: Some(36886), added: 39361, mode: `MaxEncodedLen`) + /// Storage: `TransactionStorage::ByteFee` (r:1 w:0) + /// Proof: `TransactionStorage::ByteFee` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) + /// Storage: `TransactionStorage::EntryFee` (r:1 w:0) + /// Proof: `TransactionStorage::EntryFee` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) + /// Storage: `Balances::Holds` (r:1 w:1) + /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(193), added: 2668, mode: `MaxEncodedLen`) + /// Storage: `TransactionStorage::BlockTransactions` (r:1 w:1) + /// Proof: `TransactionStorage::BlockTransactions` (`max_values`: Some(1), `max_size`: Some(36866), added: 37361, mode: `MaxEncodedLen`) fn renew() -> Weight { // Proof Size summary in bytes: - // Measured: `326` + // Measured: `430` // Estimated: `40351` - // Minimum execution time: 48_244_000 picoseconds. - Weight::from_parts(50_939_000, 40351) - .saturating_add(T::DbWeight::get().reads(4_u64)) - .saturating_add(T::DbWeight::get().writes(1_u64)) + // Minimum execution time: 81_473_000 picoseconds. + Weight::from_parts(84_000_000, 40351) + .saturating_add(T::DbWeight::get().reads(5_u64)) + .saturating_add(T::DbWeight::get().writes(2_u64)) } - /// Storage: TransactionStorage ProofChecked (r:1 w:1) - /// Proof: TransactionStorage ProofChecked (max_values: Some(1), max_size: Some(1), added: 496, mode: MaxEncodedLen) - /// Storage: TransactionStorage StoragePeriod (r:1 w:0) - /// Proof: TransactionStorage StoragePeriod (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: TransactionStorage ChunkCount (r:1 w:0) - /// Proof: TransactionStorage ChunkCount (max_values: None, max_size: Some(24), added: 2499, mode: MaxEncodedLen) - /// Storage: System ParentHash (r:1 w:0) - /// Proof: System ParentHash (max_values: Some(1), max_size: Some(32), added: 527, mode: MaxEncodedLen) - /// Storage: TransactionStorage Transactions (r:1 w:0) - /// Proof: TransactionStorage Transactions (max_values: None, max_size: Some(36886), added: 39361, mode: MaxEncodedLen) + /// Storage: `TransactionStorage::ProofChecked` (r:1 w:1) + /// Proof: `TransactionStorage::ProofChecked` (`max_values`: Some(1), `max_size`: Some(1), added: 496, mode: `MaxEncodedLen`) + /// Storage: `TransactionStorage::StoragePeriod` (r:1 w:0) + /// Proof: `TransactionStorage::StoragePeriod` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `TransactionStorage::ChunkCount` (r:1 w:0) + /// Proof: `TransactionStorage::ChunkCount` (`max_values`: None, `max_size`: Some(24), added: 2499, mode: `MaxEncodedLen`) + /// Storage: `System::ParentHash` (r:1 w:0) + /// Proof: `System::ParentHash` (`max_values`: Some(1), `max_size`: Some(32), added: 527, mode: `MaxEncodedLen`) + /// Storage: `TransactionStorage::Transactions` (r:1 w:0) + /// Proof: `TransactionStorage::Transactions` (`max_values`: None, `max_size`: Some(36886), added: 39361, mode: `MaxEncodedLen`) fn check_proof_max() -> Weight { // Proof Size summary in bytes: - // Measured: `37145` + // Measured: `37211` // Estimated: `40351` - // Minimum execution time: 80_913_000 picoseconds. - Weight::from_parts(84_812_000, 40351) + // Minimum execution time: 68_167_000 picoseconds. + Weight::from_parts(75_532_000, 40351) .saturating_add(T::DbWeight::get().reads(5_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } } -// For backwards compatibility and tests +// For backwards compatibility and tests. impl WeightInfo for () { - /// Storage: TransactionStorage ByteFee (r:1 w:0) - /// Proof: TransactionStorage ByteFee (max_values: Some(1), max_size: Some(16), added: 511, mode: MaxEncodedLen) - /// Storage: TransactionStorage EntryFee (r:1 w:0) - /// Proof: TransactionStorage EntryFee (max_values: Some(1), max_size: Some(16), added: 511, mode: MaxEncodedLen) - /// Storage: TransactionStorage BlockTransactions (r:1 w:1) - /// Proof: TransactionStorage BlockTransactions (max_values: Some(1), max_size: Some(36866), added: 37361, mode: MaxEncodedLen) + /// Storage: `TransactionStorage::ByteFee` (r:1 w:0) + /// Proof: `TransactionStorage::ByteFee` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) + /// Storage: `TransactionStorage::EntryFee` (r:1 w:0) + /// Proof: `TransactionStorage::EntryFee` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) + /// Storage: `Balances::Holds` (r:1 w:1) + /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(193), added: 2668, mode: `MaxEncodedLen`) + /// Storage: `TransactionStorage::BlockTransactions` (r:1 w:1) + /// Proof: `TransactionStorage::BlockTransactions` (`max_values`: Some(1), `max_size`: Some(36866), added: 37361, mode: `MaxEncodedLen`) /// The range of component `l` is `[1, 8388608]`. fn store(l: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `176` + // Measured: `242` // Estimated: `38351` - // Minimum execution time: 34_844_000 picoseconds. - Weight::from_parts(35_489_000, 38351) - // Standard Error: 11 - .saturating_add(Weight::from_parts(6_912, 0).saturating_mul(l.into())) - .saturating_add(RocksDbWeight::get().reads(3_u64)) - .saturating_add(RocksDbWeight::get().writes(1_u64)) + // Minimum execution time: 62_024_000 picoseconds. + Weight::from_parts(63_536_000, 38351) + // Standard Error: 13 + .saturating_add(Weight::from_parts(7_178, 0).saturating_mul(l.into())) + .saturating_add(RocksDbWeight::get().reads(4_u64)) + .saturating_add(RocksDbWeight::get().writes(2_u64)) } - /// Storage: TransactionStorage Transactions (r:1 w:0) - /// Proof: TransactionStorage Transactions (max_values: None, max_size: Some(36886), added: 39361, mode: MaxEncodedLen) - /// Storage: TransactionStorage ByteFee (r:1 w:0) - /// Proof: TransactionStorage ByteFee (max_values: Some(1), max_size: Some(16), added: 511, mode: MaxEncodedLen) - /// Storage: TransactionStorage EntryFee (r:1 w:0) - /// Proof: TransactionStorage EntryFee (max_values: Some(1), max_size: Some(16), added: 511, mode: MaxEncodedLen) - /// Storage: TransactionStorage BlockTransactions (r:1 w:1) - /// Proof: TransactionStorage BlockTransactions (max_values: Some(1), max_size: Some(36866), added: 37361, mode: MaxEncodedLen) + /// Storage: `TransactionStorage::Transactions` (r:1 w:0) + /// Proof: `TransactionStorage::Transactions` (`max_values`: None, `max_size`: Some(36886), added: 39361, mode: `MaxEncodedLen`) + /// Storage: `TransactionStorage::ByteFee` (r:1 w:0) + /// Proof: `TransactionStorage::ByteFee` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) + /// Storage: `TransactionStorage::EntryFee` (r:1 w:0) + /// Proof: `TransactionStorage::EntryFee` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) + /// Storage: `Balances::Holds` (r:1 w:1) + /// Proof: `Balances::Holds` (`max_values`: None, `max_size`: Some(193), added: 2668, mode: `MaxEncodedLen`) + /// Storage: `TransactionStorage::BlockTransactions` (r:1 w:1) + /// Proof: `TransactionStorage::BlockTransactions` (`max_values`: Some(1), `max_size`: Some(36866), added: 37361, mode: `MaxEncodedLen`) fn renew() -> Weight { // Proof Size summary in bytes: - // Measured: `326` + // Measured: `430` // Estimated: `40351` - // Minimum execution time: 48_244_000 picoseconds. - Weight::from_parts(50_939_000, 40351) - .saturating_add(RocksDbWeight::get().reads(4_u64)) - .saturating_add(RocksDbWeight::get().writes(1_u64)) + // Minimum execution time: 81_473_000 picoseconds. + Weight::from_parts(84_000_000, 40351) + .saturating_add(RocksDbWeight::get().reads(5_u64)) + .saturating_add(RocksDbWeight::get().writes(2_u64)) } - /// Storage: TransactionStorage ProofChecked (r:1 w:1) - /// Proof: TransactionStorage ProofChecked (max_values: Some(1), max_size: Some(1), added: 496, mode: MaxEncodedLen) - /// Storage: TransactionStorage StoragePeriod (r:1 w:0) - /// Proof: TransactionStorage StoragePeriod (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: TransactionStorage ChunkCount (r:1 w:0) - /// Proof: TransactionStorage ChunkCount (max_values: None, max_size: Some(24), added: 2499, mode: MaxEncodedLen) - /// Storage: System ParentHash (r:1 w:0) - /// Proof: System ParentHash (max_values: Some(1), max_size: Some(32), added: 527, mode: MaxEncodedLen) - /// Storage: TransactionStorage Transactions (r:1 w:0) - /// Proof: TransactionStorage Transactions (max_values: None, max_size: Some(36886), added: 39361, mode: MaxEncodedLen) + /// Storage: `TransactionStorage::ProofChecked` (r:1 w:1) + /// Proof: `TransactionStorage::ProofChecked` (`max_values`: Some(1), `max_size`: Some(1), added: 496, mode: `MaxEncodedLen`) + /// Storage: `TransactionStorage::StoragePeriod` (r:1 w:0) + /// Proof: `TransactionStorage::StoragePeriod` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `TransactionStorage::ChunkCount` (r:1 w:0) + /// Proof: `TransactionStorage::ChunkCount` (`max_values`: None, `max_size`: Some(24), added: 2499, mode: `MaxEncodedLen`) + /// Storage: `System::ParentHash` (r:1 w:0) + /// Proof: `System::ParentHash` (`max_values`: Some(1), `max_size`: Some(32), added: 527, mode: `MaxEncodedLen`) + /// Storage: `TransactionStorage::Transactions` (r:1 w:0) + /// Proof: `TransactionStorage::Transactions` (`max_values`: None, `max_size`: Some(36886), added: 39361, mode: `MaxEncodedLen`) fn check_proof_max() -> Weight { // Proof Size summary in bytes: - // Measured: `37145` + // Measured: `37211` // Estimated: `40351` - // Minimum execution time: 80_913_000 picoseconds. - Weight::from_parts(84_812_000, 40351) + // Minimum execution time: 68_167_000 picoseconds. + Weight::from_parts(75_532_000, 40351) .saturating_add(RocksDbWeight::get().reads(5_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } diff --git a/substrate/frame/treasury/Cargo.toml b/substrate/frame/treasury/Cargo.toml index 2dc603e9f9b5bc7e4f82795dd9aedcc5f21d5393..34037338a52bac4d18130e6a3c88b3c3a5d3dc60 100644 --- a/substrate/frame/treasury/Cargo.toml +++ b/substrate/frame/treasury/Cargo.toml @@ -20,10 +20,10 @@ codec = { package = "parity-scale-codec", version = "3.6.1", default-features = "derive", "max-encoded-len", ] } -docify = "0.2.7" +docify = "0.2.8" impl-trait-for-tuples = "0.2.2" -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.195", features = ["derive"], optional = true } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +serde = { features = ["derive"], optional = true, workspace = true, default-features = true } frame-benchmarking = { path = "../benchmarking", default-features = false, optional = true } frame-support = { path = "../support", default-features = false } frame-system = { path = "../system", default-features = false } diff --git a/substrate/frame/treasury/src/lib.rs b/substrate/frame/treasury/src/lib.rs index 5e429d3914bd0c60ea24eb53825c4da4b6a07fe5..1ccd8456643233c71eb3095aa7c05980b9e52e25 100644 --- a/substrate/frame/treasury/src/lib.rs +++ b/substrate/frame/treasury/src/lib.rs @@ -76,6 +76,8 @@ mod benchmarking; #[cfg(test)] mod tests; pub mod weights; +use core::marker::PhantomData; + #[cfg(feature = "runtime-benchmarks")] pub use benchmarking::ArgumentsFactory; @@ -621,7 +623,7 @@ pub mod pallet { with_context::>, _>(|v| { let context = v.or_default(); - // We group based on `max_amount`, to dinstinguish between different kind of + // We group based on `max_amount`, to distinguish between different kind of // origins. (assumes that all origins have different `max_amount`) // // Worst case is that we reject some "valid" request. @@ -1042,7 +1044,7 @@ impl, I: 'static> Pallet { /// ### Invariants of proposal storage items /// /// 1. [`ProposalCount`] >= Number of elements in [`Proposals`]. - /// 2. Each entry in [`Proposals`] should be saved under a key stricly less than current + /// 2. Each entry in [`Proposals`] should be saved under a key strictly less than current /// [`ProposalCount`]. /// 3. Each [`ProposalIndex`] contained in [`Approvals`] should exist in [`Proposals`]. /// Note, that this automatically implies [`Approvals`].count() <= [`Proposals`].count(). @@ -1078,7 +1080,7 @@ impl, I: 'static> Pallet { /// ## Invariants of spend storage items /// /// 1. [`SpendCount`] >= Number of elements in [`Spends`]. - /// 2. Each entry in [`Spends`] should be saved under a key stricly less than current + /// 2. Each entry in [`Spends`] should be saved under a key strictly less than current /// [`SpendCount`]. /// 3. For each spend entry contained in [`Spends`] we should have spend.expire_at /// > spend.valid_from. @@ -1120,3 +1122,15 @@ impl, I: 'static> OnUnbalanced> for Palle Self::deposit_event(Event::Deposit { value: numeric_amount }); } } + +/// TypedGet implementation to get the AccountId of the Treasury. +pub struct TreasuryAccountId(PhantomData); +impl sp_runtime::traits::TypedGet for TreasuryAccountId +where + R: crate::Config, +{ + type Type = ::AccountId; + fn get() -> Self::Type { + >::account_id() + } +} diff --git a/substrate/frame/treasury/src/tests.rs b/substrate/frame/treasury/src/tests.rs index e35d50e23a3424ddb17c03acc89d42baf7429bb4..67d81cb5c30224e68a2b72bcda3255273304b14a 100644 --- a/substrate/frame/treasury/src/tests.rs +++ b/substrate/frame/treasury/src/tests.rs @@ -20,9 +20,8 @@ #![cfg(test)] use core::{cell::RefCell, marker::PhantomData}; -use sp_core::H256; use sp_runtime::{ - traits::{BadOrigin, BlakeTwo256, Dispatchable, IdentityLookup}, + traits::{BadOrigin, Dispatchable, IdentityLookup}, BuildStorage, }; @@ -54,31 +53,12 @@ frame_support::construct_runtime!( } ); -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { - type BaseCallFilter = frame_support::traits::Everything; - type BlockWeights = (); - type BlockLength = (); - type DbWeight = (); - type RuntimeOrigin = RuntimeOrigin; - type Nonce = u64; - type RuntimeCall = RuntimeCall; - type Hash = H256; - type Hashing = BlakeTwo256; type AccountId = u128; // u64 is not enough to hold bytes used to generate bounty account type Lookup = IdentityLookup; type Block = Block; - type RuntimeEvent = RuntimeEvent; - type BlockHashCount = ConstU64<250>; - type Version = (); - type PalletInfo = PalletInfo; type AccountData = pallet_balances::AccountData; - type OnNewAccount = (); - type OnKilledAccount = (); - type SystemWeightInfo = (); - type SS58Prefix = (); - type OnSetCode = (); - type MaxConsumers = ConstU32<16>; } impl pallet_balances::Config for Test { type MaxLocks = (); diff --git a/substrate/frame/treasury/src/weights.rs b/substrate/frame/treasury/src/weights.rs index 030e18980eb54f8b16452691b884e6046878aaa2..82277e2d28f6c80e2bfa040103bb4a311ca41ac1 100644 --- a/substrate/frame/treasury/src/weights.rs +++ b/substrate/frame/treasury/src/weights.rs @@ -15,27 +15,31 @@ // See the License for the specific language governing permissions and // limitations under the License. -//! Autogenerated weights for pallet_treasury +//! Autogenerated weights for `pallet_treasury` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-07, STEPS: `20`, REPEAT: `2`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-04-09, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `cob`, CPU: `` -//! EXECUTION: None, WASM-EXECUTION: Compiled, CHAIN: Some("dev"), DB CACHE: 1024 +//! HOSTNAME: `runner-anb7yjbi-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: `1024` // Executed Command: -// ./target/debug/substrate +// ./target/production/substrate-node // benchmark // pallet // --chain=dev -// --steps=20 -// --repeat=2 -// --pallet=pallet-treasury +// --steps=50 +// --repeat=20 +// --pallet=pallet_treasury +// --no-storage-info +// --no-median-slopes +// --no-min-squares // --extrinsic=* // --wasm-execution=compiled // --heap-pages=4096 -// --output=./frame/treasury/src/._weights.rs -// --template=./.maintain/frame-weight-template.hbs +// --output=./substrate/frame/treasury/src/weights.rs +// --header=./substrate/HEADER-APACHE2 +// --template=./substrate/.maintain/frame-weight-template.hbs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -45,7 +49,7 @@ use frame_support::{traits::Get, weights::{Weight, constants::RocksDbWeight}}; use core::marker::PhantomData; -/// Weight functions needed for pallet_treasury. +/// Weight functions needed for `pallet_treasury`. pub trait WeightInfo { fn spend_local() -> Weight; fn propose_spend() -> Weight; @@ -59,304 +63,304 @@ pub trait WeightInfo { fn void_spend() -> Weight; } -/// Weights for pallet_treasury using the Substrate node and recommended hardware. +/// Weights for `pallet_treasury` using the Substrate node and recommended hardware. pub struct SubstrateWeight(PhantomData); impl WeightInfo for SubstrateWeight { - /// Storage: Treasury ProposalCount (r:1 w:1) - /// Proof: Treasury ProposalCount (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: Treasury Approvals (r:1 w:1) - /// Proof: Treasury Approvals (max_values: Some(1), max_size: Some(402), added: 897, mode: MaxEncodedLen) - /// Storage: Treasury Proposals (r:0 w:1) - /// Proof: Treasury Proposals (max_values: None, max_size: Some(108), added: 2583, mode: MaxEncodedLen) + /// Storage: `Treasury::ProposalCount` (r:1 w:1) + /// Proof: `Treasury::ProposalCount` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `Treasury::Approvals` (r:1 w:1) + /// Proof: `Treasury::Approvals` (`max_values`: Some(1), `max_size`: Some(402), added: 897, mode: `MaxEncodedLen`) + /// Storage: `Treasury::Proposals` (r:0 w:1) + /// Proof: `Treasury::Proposals` (`max_values`: None, `max_size`: Some(108), added: 2583, mode: `MaxEncodedLen`) fn spend_local() -> Weight { // Proof Size summary in bytes: // Measured: `76` // Estimated: `1887` - // Minimum execution time: 179_000_000 picoseconds. - Weight::from_parts(190_000_000, 1887) + // Minimum execution time: 11_910_000 picoseconds. + Weight::from_parts(12_681_000, 1887) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(3_u64)) } - /// Storage: Treasury ProposalCount (r:1 w:1) - /// Proof: Treasury ProposalCount (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: Treasury Proposals (r:0 w:1) - /// Proof: Treasury Proposals (max_values: None, max_size: Some(108), added: 2583, mode: MaxEncodedLen) + /// Storage: `Treasury::ProposalCount` (r:1 w:1) + /// Proof: `Treasury::ProposalCount` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `Treasury::Proposals` (r:0 w:1) + /// Proof: `Treasury::Proposals` (`max_values`: None, `max_size`: Some(108), added: 2583, mode: `MaxEncodedLen`) fn propose_spend() -> Weight { // Proof Size summary in bytes: // Measured: `177` // Estimated: `1489` - // Minimum execution time: 349_000_000 picoseconds. - Weight::from_parts(398_000_000, 1489) + // Minimum execution time: 24_704_000 picoseconds. + Weight::from_parts(25_484_000, 1489) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } - /// Storage: Treasury Proposals (r:1 w:1) - /// Proof: Treasury Proposals (max_values: None, max_size: Some(108), added: 2583, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: `Treasury::Proposals` (r:1 w:1) + /// Proof: `Treasury::Proposals` (`max_values`: None, `max_size`: Some(108), added: 2583, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) fn reject_proposal() -> Weight { // Proof Size summary in bytes: // Measured: `335` // Estimated: `3593` - // Minimum execution time: 367_000_000 picoseconds. - Weight::from_parts(388_000_000, 3593) + // Minimum execution time: 26_632_000 picoseconds. + Weight::from_parts(27_325_000, 3593) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } - /// Storage: Treasury Proposals (r:1 w:0) - /// Proof: Treasury Proposals (max_values: None, max_size: Some(108), added: 2583, mode: MaxEncodedLen) - /// Storage: Treasury Approvals (r:1 w:1) - /// Proof: Treasury Approvals (max_values: Some(1), max_size: Some(402), added: 897, mode: MaxEncodedLen) + /// Storage: `Treasury::Proposals` (r:1 w:0) + /// Proof: `Treasury::Proposals` (`max_values`: None, `max_size`: Some(108), added: 2583, mode: `MaxEncodedLen`) + /// Storage: `Treasury::Approvals` (r:1 w:1) + /// Proof: `Treasury::Approvals` (`max_values`: Some(1), `max_size`: Some(402), added: 897, mode: `MaxEncodedLen`) /// The range of component `p` is `[0, 99]`. fn approve_proposal(p: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `483 + p * (9 ±0)` + // Measured: `504 + p * (8 ±0)` // Estimated: `3573` - // Minimum execution time: 111_000_000 picoseconds. - Weight::from_parts(108_813_243, 3573) - // Standard Error: 147_887 - .saturating_add(Weight::from_parts(683_216, 0).saturating_mul(p.into())) + // Minimum execution time: 8_436_000 picoseconds. + Weight::from_parts(11_268_438, 3573) + // Standard Error: 1_039 + .saturating_add(Weight::from_parts(70_903, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: Treasury Approvals (r:1 w:1) - /// Proof: Treasury Approvals (max_values: Some(1), max_size: Some(402), added: 897, mode: MaxEncodedLen) + /// Storage: `Treasury::Approvals` (r:1 w:1) + /// Proof: `Treasury::Approvals` (`max_values`: Some(1), `max_size`: Some(402), added: 897, mode: `MaxEncodedLen`) fn remove_approval() -> Weight { // Proof Size summary in bytes: // Measured: `161` // Estimated: `1887` - // Minimum execution time: 71_000_000 picoseconds. - Weight::from_parts(78_000_000, 1887) + // Minimum execution time: 6_372_000 picoseconds. + Weight::from_parts(6_567_000, 1887) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: Treasury Deactivated (r:1 w:1) - /// Proof: Treasury Deactivated (max_values: Some(1), max_size: Some(16), added: 511, mode: MaxEncodedLen) - /// Storage: Treasury Approvals (r:1 w:1) - /// Proof: Treasury Approvals (max_values: Some(1), max_size: Some(402), added: 897, mode: MaxEncodedLen) - /// Storage: Treasury Proposals (r:99 w:99) - /// Proof: Treasury Proposals (max_values: None, max_size: Some(108), added: 2583, mode: MaxEncodedLen) - /// Storage: System Account (r:198 w:198) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) - /// Storage: Bounties BountyApprovals (r:1 w:1) - /// Proof: Bounties BountyApprovals (max_values: Some(1), max_size: Some(402), added: 897, mode: MaxEncodedLen) + /// Storage: `Treasury::Deactivated` (r:1 w:1) + /// Proof: `Treasury::Deactivated` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) + /// Storage: `Treasury::Approvals` (r:1 w:1) + /// Proof: `Treasury::Approvals` (`max_values`: Some(1), `max_size`: Some(402), added: 897, mode: `MaxEncodedLen`) + /// Storage: `Treasury::Proposals` (r:99 w:99) + /// Proof: `Treasury::Proposals` (`max_values`: None, `max_size`: Some(108), added: 2583, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:198 w:198) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `Bounties::BountyApprovals` (r:1 w:1) + /// Proof: `Bounties::BountyApprovals` (`max_values`: Some(1), `max_size`: Some(402), added: 897, mode: `MaxEncodedLen`) /// The range of component `p` is `[0, 99]`. fn on_initialize_proposals(p: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `427 + p * (251 ±0)` + // Measured: `451 + p * (251 ±0)` // Estimated: `1887 + p * (5206 ±0)` - // Minimum execution time: 614_000_000 picoseconds. - Weight::from_parts(498_501_558, 1887) - // Standard Error: 1_070_260 - .saturating_add(Weight::from_parts(599_011_690, 0).saturating_mul(p.into())) + // Minimum execution time: 33_150_000 picoseconds. + Weight::from_parts(41_451_020, 1887) + // Standard Error: 19_018 + .saturating_add(Weight::from_parts(34_410_759, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().reads((3_u64).saturating_mul(p.into()))) .saturating_add(T::DbWeight::get().writes(3_u64)) .saturating_add(T::DbWeight::get().writes((3_u64).saturating_mul(p.into()))) .saturating_add(Weight::from_parts(0, 5206).saturating_mul(p.into())) } - /// Storage: AssetRate ConversionRateToNative (r:1 w:0) - /// Proof: AssetRate ConversionRateToNative (max_values: None, max_size: Some(36), added: 2511, mode: MaxEncodedLen) - /// Storage: Treasury SpendCount (r:1 w:1) - /// Proof: Treasury SpendCount (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: Treasury Spends (r:0 w:1) - /// Proof: Treasury Spends (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) + /// Storage: `AssetRate::ConversionRateToNative` (r:1 w:0) + /// Proof: `AssetRate::ConversionRateToNative` (`max_values`: None, `max_size`: Some(36), added: 2511, mode: `MaxEncodedLen`) + /// Storage: `Treasury::SpendCount` (r:1 w:1) + /// Proof: `Treasury::SpendCount` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `Treasury::Spends` (r:0 w:1) + /// Proof: `Treasury::Spends` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) fn spend() -> Weight { // Proof Size summary in bytes: // Measured: `140` // Estimated: `3501` - // Minimum execution time: 214_000_000 picoseconds. - Weight::from_parts(216_000_000, 3501) + // Minimum execution time: 14_233_000 picoseconds. + Weight::from_parts(14_842_000, 3501) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } - /// Storage: Treasury Spends (r:1 w:1) - /// Proof: Treasury Spends (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) - /// Storage: Assets Asset (r:1 w:1) - /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) - /// Storage: Assets Account (r:2 w:2) - /// Proof: Assets Account (max_values: None, max_size: Some(134), added: 2609, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: `Treasury::Spends` (r:1 w:1) + /// Proof: `Treasury::Spends` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) + /// Storage: `Assets::Asset` (r:1 w:1) + /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) + /// Storage: `Assets::Account` (r:2 w:2) + /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) fn payout() -> Weight { // Proof Size summary in bytes: - // Measured: `705` + // Measured: `709` // Estimated: `6208` - // Minimum execution time: 760_000_000 picoseconds. - Weight::from_parts(822_000_000, 6208) + // Minimum execution time: 58_857_000 picoseconds. + Weight::from_parts(61_291_000, 6208) .saturating_add(T::DbWeight::get().reads(5_u64)) .saturating_add(T::DbWeight::get().writes(5_u64)) } - /// Storage: Treasury Spends (r:1 w:1) - /// Proof: Treasury Spends (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) + /// Storage: `Treasury::Spends` (r:1 w:1) + /// Proof: `Treasury::Spends` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) fn check_status() -> Weight { // Proof Size summary in bytes: - // Measured: `194` - // Estimated: `3534` - // Minimum execution time: 153_000_000 picoseconds. - Weight::from_parts(160_000_000, 3534) + // Measured: `198` + // Estimated: `3538` + // Minimum execution time: 12_116_000 picoseconds. + Weight::from_parts(12_480_000, 3538) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } - /// Storage: Treasury Spends (r:1 w:1) - /// Proof: Treasury Spends (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) + /// Storage: `Treasury::Spends` (r:1 w:1) + /// Proof: `Treasury::Spends` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) fn void_spend() -> Weight { // Proof Size summary in bytes: - // Measured: `194` - // Estimated: `3534` - // Minimum execution time: 147_000_000 picoseconds. - Weight::from_parts(181_000_000, 3534) + // Measured: `198` + // Estimated: `3538` + // Minimum execution time: 10_834_000 picoseconds. + Weight::from_parts(11_427_000, 3538) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } } -// For backwards compatibility and tests +// For backwards compatibility and tests. impl WeightInfo for () { - /// Storage: Treasury ProposalCount (r:1 w:1) - /// Proof: Treasury ProposalCount (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: Treasury Approvals (r:1 w:1) - /// Proof: Treasury Approvals (max_values: Some(1), max_size: Some(402), added: 897, mode: MaxEncodedLen) - /// Storage: Treasury Proposals (r:0 w:1) - /// Proof: Treasury Proposals (max_values: None, max_size: Some(108), added: 2583, mode: MaxEncodedLen) + /// Storage: `Treasury::ProposalCount` (r:1 w:1) + /// Proof: `Treasury::ProposalCount` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `Treasury::Approvals` (r:1 w:1) + /// Proof: `Treasury::Approvals` (`max_values`: Some(1), `max_size`: Some(402), added: 897, mode: `MaxEncodedLen`) + /// Storage: `Treasury::Proposals` (r:0 w:1) + /// Proof: `Treasury::Proposals` (`max_values`: None, `max_size`: Some(108), added: 2583, mode: `MaxEncodedLen`) fn spend_local() -> Weight { // Proof Size summary in bytes: // Measured: `76` // Estimated: `1887` - // Minimum execution time: 179_000_000 picoseconds. - Weight::from_parts(190_000_000, 1887) + // Minimum execution time: 11_910_000 picoseconds. + Weight::from_parts(12_681_000, 1887) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(3_u64)) } - /// Storage: Treasury ProposalCount (r:1 w:1) - /// Proof: Treasury ProposalCount (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: Treasury Proposals (r:0 w:1) - /// Proof: Treasury Proposals (max_values: None, max_size: Some(108), added: 2583, mode: MaxEncodedLen) + /// Storage: `Treasury::ProposalCount` (r:1 w:1) + /// Proof: `Treasury::ProposalCount` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `Treasury::Proposals` (r:0 w:1) + /// Proof: `Treasury::Proposals` (`max_values`: None, `max_size`: Some(108), added: 2583, mode: `MaxEncodedLen`) fn propose_spend() -> Weight { // Proof Size summary in bytes: // Measured: `177` // Estimated: `1489` - // Minimum execution time: 349_000_000 picoseconds. - Weight::from_parts(398_000_000, 1489) + // Minimum execution time: 24_704_000 picoseconds. + Weight::from_parts(25_484_000, 1489) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } - /// Storage: Treasury Proposals (r:1 w:1) - /// Proof: Treasury Proposals (max_values: None, max_size: Some(108), added: 2583, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: `Treasury::Proposals` (r:1 w:1) + /// Proof: `Treasury::Proposals` (`max_values`: None, `max_size`: Some(108), added: 2583, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) fn reject_proposal() -> Weight { // Proof Size summary in bytes: // Measured: `335` // Estimated: `3593` - // Minimum execution time: 367_000_000 picoseconds. - Weight::from_parts(388_000_000, 3593) + // Minimum execution time: 26_632_000 picoseconds. + Weight::from_parts(27_325_000, 3593) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } - /// Storage: Treasury Proposals (r:1 w:0) - /// Proof: Treasury Proposals (max_values: None, max_size: Some(108), added: 2583, mode: MaxEncodedLen) - /// Storage: Treasury Approvals (r:1 w:1) - /// Proof: Treasury Approvals (max_values: Some(1), max_size: Some(402), added: 897, mode: MaxEncodedLen) + /// Storage: `Treasury::Proposals` (r:1 w:0) + /// Proof: `Treasury::Proposals` (`max_values`: None, `max_size`: Some(108), added: 2583, mode: `MaxEncodedLen`) + /// Storage: `Treasury::Approvals` (r:1 w:1) + /// Proof: `Treasury::Approvals` (`max_values`: Some(1), `max_size`: Some(402), added: 897, mode: `MaxEncodedLen`) /// The range of component `p` is `[0, 99]`. fn approve_proposal(p: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `483 + p * (9 ±0)` + // Measured: `504 + p * (8 ±0)` // Estimated: `3573` - // Minimum execution time: 111_000_000 picoseconds. - Weight::from_parts(108_813_243, 3573) - // Standard Error: 147_887 - .saturating_add(Weight::from_parts(683_216, 0).saturating_mul(p.into())) + // Minimum execution time: 8_436_000 picoseconds. + Weight::from_parts(11_268_438, 3573) + // Standard Error: 1_039 + .saturating_add(Weight::from_parts(70_903, 0).saturating_mul(p.into())) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Treasury Approvals (r:1 w:1) - /// Proof: Treasury Approvals (max_values: Some(1), max_size: Some(402), added: 897, mode: MaxEncodedLen) + /// Storage: `Treasury::Approvals` (r:1 w:1) + /// Proof: `Treasury::Approvals` (`max_values`: Some(1), `max_size`: Some(402), added: 897, mode: `MaxEncodedLen`) fn remove_approval() -> Weight { // Proof Size summary in bytes: // Measured: `161` // Estimated: `1887` - // Minimum execution time: 71_000_000 picoseconds. - Weight::from_parts(78_000_000, 1887) + // Minimum execution time: 6_372_000 picoseconds. + Weight::from_parts(6_567_000, 1887) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Treasury Deactivated (r:1 w:1) - /// Proof: Treasury Deactivated (max_values: Some(1), max_size: Some(16), added: 511, mode: MaxEncodedLen) - /// Storage: Treasury Approvals (r:1 w:1) - /// Proof: Treasury Approvals (max_values: Some(1), max_size: Some(402), added: 897, mode: MaxEncodedLen) - /// Storage: Treasury Proposals (r:99 w:99) - /// Proof: Treasury Proposals (max_values: None, max_size: Some(108), added: 2583, mode: MaxEncodedLen) - /// Storage: System Account (r:198 w:198) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) - /// Storage: Bounties BountyApprovals (r:1 w:1) - /// Proof: Bounties BountyApprovals (max_values: Some(1), max_size: Some(402), added: 897, mode: MaxEncodedLen) + /// Storage: `Treasury::Deactivated` (r:1 w:1) + /// Proof: `Treasury::Deactivated` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) + /// Storage: `Treasury::Approvals` (r:1 w:1) + /// Proof: `Treasury::Approvals` (`max_values`: Some(1), `max_size`: Some(402), added: 897, mode: `MaxEncodedLen`) + /// Storage: `Treasury::Proposals` (r:99 w:99) + /// Proof: `Treasury::Proposals` (`max_values`: None, `max_size`: Some(108), added: 2583, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:198 w:198) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `Bounties::BountyApprovals` (r:1 w:1) + /// Proof: `Bounties::BountyApprovals` (`max_values`: Some(1), `max_size`: Some(402), added: 897, mode: `MaxEncodedLen`) /// The range of component `p` is `[0, 99]`. fn on_initialize_proposals(p: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `427 + p * (251 ±0)` + // Measured: `451 + p * (251 ±0)` // Estimated: `1887 + p * (5206 ±0)` - // Minimum execution time: 614_000_000 picoseconds. - Weight::from_parts(498_501_558, 1887) - // Standard Error: 1_070_260 - .saturating_add(Weight::from_parts(599_011_690, 0).saturating_mul(p.into())) + // Minimum execution time: 33_150_000 picoseconds. + Weight::from_parts(41_451_020, 1887) + // Standard Error: 19_018 + .saturating_add(Weight::from_parts(34_410_759, 0).saturating_mul(p.into())) .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().reads((3_u64).saturating_mul(p.into()))) .saturating_add(RocksDbWeight::get().writes(3_u64)) .saturating_add(RocksDbWeight::get().writes((3_u64).saturating_mul(p.into()))) .saturating_add(Weight::from_parts(0, 5206).saturating_mul(p.into())) } - /// Storage: AssetRate ConversionRateToNative (r:1 w:0) - /// Proof: AssetRate ConversionRateToNative (max_values: None, max_size: Some(36), added: 2511, mode: MaxEncodedLen) - /// Storage: Treasury SpendCount (r:1 w:1) - /// Proof: Treasury SpendCount (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) - /// Storage: Treasury Spends (r:0 w:1) - /// Proof: Treasury Spends (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) + /// Storage: `AssetRate::ConversionRateToNative` (r:1 w:0) + /// Proof: `AssetRate::ConversionRateToNative` (`max_values`: None, `max_size`: Some(36), added: 2511, mode: `MaxEncodedLen`) + /// Storage: `Treasury::SpendCount` (r:1 w:1) + /// Proof: `Treasury::SpendCount` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `Treasury::Spends` (r:0 w:1) + /// Proof: `Treasury::Spends` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) fn spend() -> Weight { // Proof Size summary in bytes: // Measured: `140` // Estimated: `3501` - // Minimum execution time: 214_000_000 picoseconds. - Weight::from_parts(216_000_000, 3501) + // Minimum execution time: 14_233_000 picoseconds. + Weight::from_parts(14_842_000, 3501) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } - /// Storage: Treasury Spends (r:1 w:1) - /// Proof: Treasury Spends (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) - /// Storage: Assets Asset (r:1 w:1) - /// Proof: Assets Asset (max_values: None, max_size: Some(210), added: 2685, mode: MaxEncodedLen) - /// Storage: Assets Account (r:2 w:2) - /// Proof: Assets Account (max_values: None, max_size: Some(134), added: 2609, mode: MaxEncodedLen) - /// Storage: System Account (r:1 w:1) - /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: `Treasury::Spends` (r:1 w:1) + /// Proof: `Treasury::Spends` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) + /// Storage: `Assets::Asset` (r:1 w:1) + /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) + /// Storage: `Assets::Account` (r:2 w:2) + /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) fn payout() -> Weight { // Proof Size summary in bytes: - // Measured: `705` + // Measured: `709` // Estimated: `6208` - // Minimum execution time: 760_000_000 picoseconds. - Weight::from_parts(822_000_000, 6208) + // Minimum execution time: 58_857_000 picoseconds. + Weight::from_parts(61_291_000, 6208) .saturating_add(RocksDbWeight::get().reads(5_u64)) .saturating_add(RocksDbWeight::get().writes(5_u64)) } - /// Storage: Treasury Spends (r:1 w:1) - /// Proof: Treasury Spends (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) + /// Storage: `Treasury::Spends` (r:1 w:1) + /// Proof: `Treasury::Spends` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) fn check_status() -> Weight { // Proof Size summary in bytes: - // Measured: `194` - // Estimated: `3534` - // Minimum execution time: 153_000_000 picoseconds. - Weight::from_parts(160_000_000, 3534) + // Measured: `198` + // Estimated: `3538` + // Minimum execution time: 12_116_000 picoseconds. + Weight::from_parts(12_480_000, 3538) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } - /// Storage: Treasury Spends (r:1 w:1) - /// Proof: Treasury Spends (max_values: None, max_size: Some(69), added: 2544, mode: MaxEncodedLen) + /// Storage: `Treasury::Spends` (r:1 w:1) + /// Proof: `Treasury::Spends` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) fn void_spend() -> Weight { // Proof Size summary in bytes: - // Measured: `194` - // Estimated: `3534` - // Minimum execution time: 147_000_000 picoseconds. - Weight::from_parts(181_000_000, 3534) + // Measured: `198` + // Estimated: `3538` + // Minimum execution time: 10_834_000 picoseconds. + Weight::from_parts(11_427_000, 3538) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } diff --git a/substrate/frame/tx-pause/Cargo.toml b/substrate/frame/tx-pause/Cargo.toml index ace2172454eb976946c4069c7ac69f781ca47f2d..5f028179037d1214aadb460fa464b79f55c05a23 100644 --- a/substrate/frame/tx-pause/Cargo.toml +++ b/substrate/frame/tx-pause/Cargo.toml @@ -16,11 +16,11 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.2.2", default-features = false, features = ["derive"] } -docify = "0.2.7" +docify = "0.2.8" frame-benchmarking = { path = "../benchmarking", default-features = false, optional = true } frame-support = { path = "../support", default-features = false } frame-system = { path = "../system", default-features = false } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } sp-runtime = { path = "../../primitives/runtime", default-features = false } sp-std = { path = "../../primitives/std", default-features = false } pallet-balances = { path = "../balances", default-features = false, optional = true } diff --git a/substrate/frame/tx-pause/src/mock.rs b/substrate/frame/tx-pause/src/mock.rs index 8ccdc43a46cdb1b2865c768a81dc69453820d9d3..5206023838b95290d1a153b37074dccb0b5635d9 100644 --- a/substrate/frame/tx-pause/src/mock.rs +++ b/substrate/frame/tx-pause/src/mock.rs @@ -36,7 +36,7 @@ use sp_runtime::{ parameter_types! { pub const BlockHashCount: u64 = 250; } -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { type BaseCallFilter = InsideBoth; type BlockWeights = (); diff --git a/substrate/frame/tx-pause/src/weights.rs b/substrate/frame/tx-pause/src/weights.rs index b733e64b159dc40872e27dd540ed40820e5cc78d..e7837e9ca89c7893454c362b0b54b33994d17dc1 100644 --- a/substrate/frame/tx-pause/src/weights.rs +++ b/substrate/frame/tx-pause/src/weights.rs @@ -17,27 +17,29 @@ //! Autogenerated weights for `pallet_tx_pause` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-08-24, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-04-09, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-aahe6cbd-project-145-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! HOSTNAME: `runner-anb7yjbi-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: `1024` // Executed Command: -// target/production/substrate-node +// ./target/production/substrate-node // benchmark // pallet +// --chain=dev // --steps=50 // --repeat=20 +// --pallet=pallet_tx_pause +// --no-storage-info +// --no-median-slopes +// --no-min-squares // --extrinsic=* // --wasm-execution=compiled // --heap-pages=4096 -// --json-file=/builds/parity/mirrors/substrate/.git/.artifacts/bench.json -// --pallet=pallet_tx_pause -// --chain=dev -// --header=./HEADER-APACHE2 -// --output=./frame/tx-pause/src/weights.rs -// --template=./.maintain/frame-weight-template.hbs +// --output=./substrate/frame/tx-pause/src/weights.rs +// --header=./substrate/HEADER-APACHE2 +// --template=./substrate/.maintain/frame-weight-template.hbs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -62,8 +64,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `3` // Estimated: `3997` - // Minimum execution time: 15_096_000 picoseconds. - Weight::from_parts(15_437_000, 3997) + // Minimum execution time: 12_218_000 picoseconds. + Weight::from_parts(12_542_000, 3997) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -73,8 +75,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `565` // Estimated: `3997` - // Minimum execution time: 21_546_000 picoseconds. - Weight::from_parts(22_178_000, 3997) + // Minimum execution time: 18_314_000 picoseconds. + Weight::from_parts(18_990_000, 3997) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -88,8 +90,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `3` // Estimated: `3997` - // Minimum execution time: 15_096_000 picoseconds. - Weight::from_parts(15_437_000, 3997) + // Minimum execution time: 12_218_000 picoseconds. + Weight::from_parts(12_542_000, 3997) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -99,8 +101,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `565` // Estimated: `3997` - // Minimum execution time: 21_546_000 picoseconds. - Weight::from_parts(22_178_000, 3997) + // Minimum execution time: 18_314_000 picoseconds. + Weight::from_parts(18_990_000, 3997) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } diff --git a/substrate/frame/uniques/Cargo.toml b/substrate/frame/uniques/Cargo.toml index 8a5a180d75f3ab03bb0ecce8c7a337dc9f3e0c17..ee6af191d33f31142a109ad7b11b6d2ff1104759 100644 --- a/substrate/frame/uniques/Cargo.toml +++ b/substrate/frame/uniques/Cargo.toml @@ -17,8 +17,8 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false } -log = { version = "0.4.17", default-features = false } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +log = { workspace = true } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } frame-benchmarking = { path = "../benchmarking", default-features = false, optional = true } frame-support = { path = "../support", default-features = false } frame-system = { path = "../system", default-features = false } diff --git a/substrate/frame/uniques/src/lib.rs b/substrate/frame/uniques/src/lib.rs index f7cc6b044d7298704d528d9cea5de7c102cf1f24..2291d19de2bfb6941c78614558254de19e75680a 100644 --- a/substrate/frame/uniques/src/lib.rs +++ b/substrate/frame/uniques/src/lib.rs @@ -1399,7 +1399,7 @@ pub mod pallet { .map(|_| None) .or_else(|origin| ensure_signed(origin).map(Some))?; - let details = + let mut details = Collection::::get(&collection).ok_or(Error::::UnknownCollection)?; if let Some(check_owner) = &maybe_check_owner { ensure!(check_owner == &details.owner, Error::::NoPermission); @@ -1411,6 +1411,8 @@ pub mod pallet { let deposit = metadata.take().ok_or(Error::::UnknownCollection)?.deposit; T::Currency::unreserve(&details.owner, deposit); + details.total_deposit.saturating_reduce(deposit); + Collection::::insert(&collection, details); Self::deposit_event(Event::CollectionMetadataCleared { collection }); Ok(()) }) diff --git a/substrate/frame/uniques/src/migration.rs b/substrate/frame/uniques/src/migration.rs index 6b2bbf375e7541d58a30af413b6aad288d77e655..90d44e7790d6d133bde9475851557cd625e559cb 100644 --- a/substrate/frame/uniques/src/migration.rs +++ b/substrate/frame/uniques/src/migration.rs @@ -17,16 +17,16 @@ //! Various pieces of common functionality. use super::*; -use frame_support::traits::{Get, OnRuntimeUpgrade}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; +use frame_support::traits::{Get, UncheckedOnRuntimeUpgrade}; mod v1 { use super::*; /// Actual implementation of the storage migration. - pub struct MigrateToV1Impl(PhantomData<(T, I)>); + pub struct UncheckedMigrateToV1Impl(PhantomData<(T, I)>); - impl, I: 'static> OnRuntimeUpgrade for MigrateToV1Impl { + impl, I: 'static> UncheckedOnRuntimeUpgrade for UncheckedMigrateToV1Impl { fn on_runtime_upgrade() -> frame_support::weights::Weight { let mut count = 0; for (collection, detail) in Collection::::iter() { @@ -49,7 +49,7 @@ mod v1 { pub type MigrateV0ToV1 = frame_support::migrations::VersionedMigration< 0, 1, - v1::MigrateToV1Impl, + v1::UncheckedMigrateToV1Impl, Pallet, ::DbWeight, >; diff --git a/substrate/frame/uniques/src/mock.rs b/substrate/frame/uniques/src/mock.rs index 16da2b2a2e285af87d1fb392f5b17b1022ad4ef2..9fd7f87e159bb29bb7206fcba05b573ccc140115 100644 --- a/substrate/frame/uniques/src/mock.rs +++ b/substrate/frame/uniques/src/mock.rs @@ -24,11 +24,7 @@ use frame_support::{ construct_runtime, derive_impl, traits::{AsEnsureOriginWithArg, ConstU32, ConstU64}, }; -use sp_core::H256; -use sp_runtime::{ - traits::{BlakeTwo256, IdentityLookup}, - BuildStorage, -}; +use sp_runtime::BuildStorage; type Block = frame_system::mocking::MockBlock; @@ -41,31 +37,10 @@ construct_runtime!( } ); -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { - type BaseCallFilter = frame_support::traits::Everything; - type BlockWeights = (); - type BlockLength = (); - type RuntimeOrigin = RuntimeOrigin; - type RuntimeCall = RuntimeCall; - type Nonce = u64; - type Hash = H256; - type Hashing = BlakeTwo256; - type AccountId = u64; - type Lookup = IdentityLookup; type Block = Block; - type RuntimeEvent = RuntimeEvent; - type BlockHashCount = ConstU64<250>; - type DbWeight = (); - type Version = (); - type PalletInfo = PalletInfo; type AccountData = pallet_balances::AccountData; - type OnNewAccount = (); - type OnKilledAccount = (); - type SystemWeightInfo = (); - type SS58Prefix = (); - type OnSetCode = (); - type MaxConsumers = ConstU32<16>; } impl pallet_balances::Config for Test { diff --git a/substrate/frame/uniques/src/tests.rs b/substrate/frame/uniques/src/tests.rs index 351dac09f7f202a62df508fe71d26bb24662d5bc..5dfe43c96888dfb634012a460a4b9314da2a2497 100644 --- a/substrate/frame/uniques/src/tests.rs +++ b/substrate/frame/uniques/src/tests.rs @@ -289,7 +289,7 @@ fn transfer_owner_should_work() { assert_eq!(Balances::reserved_balance(&2), 0); assert_eq!(Balances::reserved_balance(&3), 45); - // 2's acceptence from before is reset when it became owner, so it cannot be transfered + // 2's acceptance from before is reset when it became owner, so it cannot be transferred // without a fresh acceptance. assert_noop!( Uniques::transfer_ownership(RuntimeOrigin::signed(3), 0, 2), @@ -692,7 +692,7 @@ fn approved_account_gets_reset_after_transfer() { assert_ok!(Uniques::approve_transfer(RuntimeOrigin::signed(2), 0, 42, 3)); assert_ok!(Uniques::transfer(RuntimeOrigin::signed(2), 0, 42, 5)); - // this shouldn't work because we have just transfered the item to another account. + // this shouldn't work because we have just transferred the item to another account. assert_noop!( Uniques::transfer(RuntimeOrigin::signed(3), 0, 42, 4), Error::::NoPermission @@ -1062,3 +1062,41 @@ fn buy_item_should_work() { } }); } + +#[test] +fn clear_collection_metadata_works() { + new_test_ext().execute_with(|| { + // Start with an account with 100 balance, 10 of which are reserved + Balances::make_free_balance_be(&1, 100); + Balances::reserve(&1, 10).unwrap(); + + // Create a Unique which increases total_deposit by 2 + assert_ok!(Uniques::create(RuntimeOrigin::signed(1), 0, 123)); + assert_eq!(Collection::::get(0).unwrap().total_deposit, 2); + assert_eq!(Balances::reserved_balance(&1), 12); + + // Set collection metadata which increases total_deposit by 10 + assert_ok!(Uniques::set_collection_metadata( + RuntimeOrigin::signed(1), + 0, + bvec![0, 0, 0, 0, 0, 0, 0, 0, 0], + false + )); + assert_eq!(Collection::::get(0).unwrap().total_deposit, 12); + assert_eq!(Balances::reserved_balance(&1), 22); + + // Clearing collection metadata reduces total_deposit by the expected amount + assert_ok!(Uniques::clear_collection_metadata(RuntimeOrigin::signed(1), 0)); + assert_eq!(Collection::::get(0).unwrap().total_deposit, 2); + assert_eq!(Balances::reserved_balance(&1), 12); + + // Destroying the collection removes it from storage + assert_ok!(Uniques::destroy( + RuntimeOrigin::signed(1), + 0, + DestroyWitness { items: 0, item_metadatas: 0, attributes: 0 } + )); + assert_eq!(Collection::::get(0), None); + assert_eq!(Balances::reserved_balance(&1), 10); + }); +} diff --git a/substrate/frame/uniques/src/weights.rs b/substrate/frame/uniques/src/weights.rs index eb80ee550a1db2d97aaed001f5041e49fdbca864..5576c8921f9ca1d02f0ebc8e275bd907323e33db 100644 --- a/substrate/frame/uniques/src/weights.rs +++ b/substrate/frame/uniques/src/weights.rs @@ -17,27 +17,29 @@ //! Autogenerated weights for `pallet_uniques` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-19, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-04-09, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-gghbxkbs-project-145-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: `1024` +//! HOSTNAME: `runner-anb7yjbi-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: `1024` // Executed Command: -// target/production/substrate +// ./target/production/substrate-node // benchmark // pallet +// --chain=dev // --steps=50 // --repeat=20 +// --pallet=pallet_uniques +// --no-storage-info +// --no-median-slopes +// --no-min-squares // --extrinsic=* // --wasm-execution=compiled // --heap-pages=4096 -// --json-file=/builds/parity/mirrors/substrate/.git/.artifacts/bench.json -// --pallet=pallet_uniques -// --chain=dev -// --header=./HEADER-APACHE2 -// --output=./frame/uniques/src/weights.rs -// --template=./.maintain/frame-weight-template.hbs +// --output=./substrate/frame/uniques/src/weights.rs +// --header=./substrate/HEADER-APACHE2 +// --template=./substrate/.maintain/frame-weight-template.hbs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -88,8 +90,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `249` // Estimated: `3643` - // Minimum execution time: 31_393_000 picoseconds. - Weight::from_parts(32_933_000, 3643) + // Minimum execution time: 27_074_000 picoseconds. + Weight::from_parts(28_213_000, 3643) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } @@ -101,8 +103,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `109` // Estimated: `3643` - // Minimum execution time: 14_827_000 picoseconds. - Weight::from_parts(15_273_000, 3643) + // Minimum execution time: 12_034_000 picoseconds. + Weight::from_parts(12_669_000, 3643) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } @@ -111,13 +113,13 @@ impl WeightInfo for SubstrateWeight { /// Storage: `Uniques::Asset` (r:1001 w:1000) /// Proof: `Uniques::Asset` (`max_values`: None, `max_size`: Some(122), added: 2597, mode: `MaxEncodedLen`) /// Storage: `Uniques::InstanceMetadataOf` (r:1000 w:1000) - /// Proof: `Uniques::InstanceMetadataOf` (`max_values`: None, `max_size`: Some(108), added: 2583, mode: `MaxEncodedLen`) + /// Proof: `Uniques::InstanceMetadataOf` (`max_values`: None, `max_size`: Some(187), added: 2662, mode: `MaxEncodedLen`) /// Storage: `Uniques::Attribute` (r:1000 w:1000) - /// Proof: `Uniques::Attribute` (`max_values`: None, `max_size`: Some(364), added: 2839, mode: `MaxEncodedLen`) + /// Proof: `Uniques::Attribute` (`max_values`: None, `max_size`: Some(172), added: 2647, mode: `MaxEncodedLen`) /// Storage: `Uniques::ClassAccount` (r:0 w:1) /// Proof: `Uniques::ClassAccount` (`max_values`: None, `max_size`: Some(68), added: 2543, mode: `MaxEncodedLen`) /// Storage: `Uniques::ClassMetadataOf` (r:0 w:1) - /// Proof: `Uniques::ClassMetadataOf` (`max_values`: None, `max_size`: Some(88), added: 2563, mode: `MaxEncodedLen`) + /// Proof: `Uniques::ClassMetadataOf` (`max_values`: None, `max_size`: Some(167), added: 2642, mode: `MaxEncodedLen`) /// Storage: `Uniques::Account` (r:0 w:1000) /// Proof: `Uniques::Account` (`max_values`: None, `max_size`: Some(88), added: 2563, mode: `MaxEncodedLen`) /// Storage: `Uniques::CollectionMaxSupply` (r:0 w:1) @@ -128,15 +130,15 @@ impl WeightInfo for SubstrateWeight { fn destroy(n: u32, m: u32, a: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `418 + a * (107 ±0) + m * (56 ±0) + n * (76 ±0)` - // Estimated: `3643 + a * (2839 ±0) + m * (2583 ±0) + n * (2597 ±0)` - // Minimum execution time: 3_281_673_000 picoseconds. - Weight::from_parts(3_443_387_000, 3643) - // Standard Error: 41_937 - .saturating_add(Weight::from_parts(7_914_842, 0).saturating_mul(n.into())) - // Standard Error: 41_937 - .saturating_add(Weight::from_parts(519_960, 0).saturating_mul(m.into())) - // Standard Error: 41_937 - .saturating_add(Weight::from_parts(462_690, 0).saturating_mul(a.into())) + // Estimated: `3643 + a * (2647 ±0) + m * (2662 ±0) + n * (2597 ±0)` + // Minimum execution time: 2_928_174_000 picoseconds. + Weight::from_parts(2_970_367_000, 3643) + // Standard Error: 30_368 + .saturating_add(Weight::from_parts(7_336_699, 0).saturating_mul(n.into())) + // Standard Error: 30_368 + .saturating_add(Weight::from_parts(401_816, 0).saturating_mul(m.into())) + // Standard Error: 30_368 + .saturating_add(Weight::from_parts(346_952, 0).saturating_mul(a.into())) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(n.into()))) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(m.into()))) @@ -145,8 +147,8 @@ impl WeightInfo for SubstrateWeight { .saturating_add(T::DbWeight::get().writes((2_u64).saturating_mul(n.into()))) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(m.into()))) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(a.into()))) - .saturating_add(Weight::from_parts(0, 2839).saturating_mul(a.into())) - .saturating_add(Weight::from_parts(0, 2583).saturating_mul(m.into())) + .saturating_add(Weight::from_parts(0, 2647).saturating_mul(a.into())) + .saturating_add(Weight::from_parts(0, 2662).saturating_mul(m.into())) .saturating_add(Weight::from_parts(0, 2597).saturating_mul(n.into())) } /// Storage: `Uniques::Asset` (r:1 w:1) @@ -161,8 +163,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `349` // Estimated: `3643` - // Minimum execution time: 38_122_000 picoseconds. - Weight::from_parts(38_924_000, 3643) + // Minimum execution time: 33_733_000 picoseconds. + Weight::from_parts(35_366_000, 3643) .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(3_u64)) } @@ -178,8 +180,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `495` // Estimated: `3643` - // Minimum execution time: 38_835_000 picoseconds. - Weight::from_parts(39_754_000, 3643) + // Minimum execution time: 35_064_000 picoseconds. + Weight::from_parts(35_747_000, 3643) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(4_u64)) } @@ -195,8 +197,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `495` // Estimated: `3643` - // Minimum execution time: 27_032_000 picoseconds. - Weight::from_parts(27_793_000, 3643) + // Minimum execution time: 24_955_000 picoseconds. + Weight::from_parts(25_661_000, 3643) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(4_u64)) } @@ -209,10 +211,10 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `805 + i * (76 ±0)` // Estimated: `3643 + i * (2597 ±0)` - // Minimum execution time: 14_737_000 picoseconds. - Weight::from_parts(15_070_000, 3643) - // Standard Error: 22_500 - .saturating_add(Weight::from_parts(18_855_468, 0).saturating_mul(i.into())) + // Minimum execution time: 12_119_000 picoseconds. + Weight::from_parts(12_490_000, 3643) + // Standard Error: 14_697 + .saturating_add(Weight::from_parts(15_720_495, 0).saturating_mul(i.into())) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(i.into()))) .saturating_add(T::DbWeight::get().writes(1_u64)) @@ -227,8 +229,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `495` // Estimated: `3643` - // Minimum execution time: 18_664_000 picoseconds. - Weight::from_parts(19_455_000, 3643) + // Minimum execution time: 16_183_000 picoseconds. + Weight::from_parts(16_716_000, 3643) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -240,8 +242,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `495` // Estimated: `3643` - // Minimum execution time: 18_247_000 picoseconds. - Weight::from_parts(18_763_000, 3643) + // Minimum execution time: 16_119_000 picoseconds. + Weight::from_parts(16_725_000, 3643) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -251,8 +253,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `349` // Estimated: `3643` - // Minimum execution time: 13_219_000 picoseconds. - Weight::from_parts(13_923_000, 3643) + // Minimum execution time: 10_889_000 picoseconds. + Weight::from_parts(11_480_000, 3643) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -262,8 +264,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `349` // Estimated: `3643` - // Minimum execution time: 13_376_000 picoseconds. - Weight::from_parts(13_904_000, 3643) + // Minimum execution time: 10_903_000 picoseconds. + Weight::from_parts(11_241_000, 3643) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -271,16 +273,18 @@ impl WeightInfo for SubstrateWeight { /// Proof: `Uniques::OwnershipAcceptance` (`max_values`: None, `max_size`: Some(52), added: 2527, mode: `MaxEncodedLen`) /// Storage: `Uniques::Class` (r:1 w:1) /// Proof: `Uniques::Class` (`max_values`: None, `max_size`: Some(178), added: 2653, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) /// Storage: `Uniques::ClassAccount` (r:0 w:2) /// Proof: `Uniques::ClassAccount` (`max_values`: None, `max_size`: Some(68), added: 2543, mode: `MaxEncodedLen`) fn transfer_ownership() -> Weight { // Proof Size summary in bytes: - // Measured: `423` + // Measured: `597` // Estimated: `3643` - // Minimum execution time: 22_353_000 picoseconds. - Weight::from_parts(23_222_000, 3643) - .saturating_add(T::DbWeight::get().reads(2_u64)) - .saturating_add(T::DbWeight::get().writes(4_u64)) + // Minimum execution time: 24_942_000 picoseconds. + Weight::from_parts(25_715_000, 3643) + .saturating_add(T::DbWeight::get().reads(3_u64)) + .saturating_add(T::DbWeight::get().writes(5_u64)) } /// Storage: `Uniques::Class` (r:1 w:1) /// Proof: `Uniques::Class` (`max_values`: None, `max_size`: Some(178), added: 2653, mode: `MaxEncodedLen`) @@ -288,8 +292,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `349` // Estimated: `3643` - // Minimum execution time: 14_072_000 picoseconds. - Weight::from_parts(14_619_000, 3643) + // Minimum execution time: 11_488_000 picoseconds. + Weight::from_parts(11_752_000, 3643) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -301,92 +305,92 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `349` // Estimated: `3643` - // Minimum execution time: 17_081_000 picoseconds. - Weight::from_parts(17_698_000, 3643) + // Minimum execution time: 14_721_000 picoseconds. + Weight::from_parts(15_187_000, 3643) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } /// Storage: `Uniques::Class` (r:1 w:1) /// Proof: `Uniques::Class` (`max_values`: None, `max_size`: Some(178), added: 2653, mode: `MaxEncodedLen`) /// Storage: `Uniques::InstanceMetadataOf` (r:1 w:0) - /// Proof: `Uniques::InstanceMetadataOf` (`max_values`: None, `max_size`: Some(108), added: 2583, mode: `MaxEncodedLen`) + /// Proof: `Uniques::InstanceMetadataOf` (`max_values`: None, `max_size`: Some(187), added: 2662, mode: `MaxEncodedLen`) /// Storage: `Uniques::Attribute` (r:1 w:1) - /// Proof: `Uniques::Attribute` (`max_values`: None, `max_size`: Some(364), added: 2839, mode: `MaxEncodedLen`) + /// Proof: `Uniques::Attribute` (`max_values`: None, `max_size`: Some(172), added: 2647, mode: `MaxEncodedLen`) fn set_attribute() -> Weight { // Proof Size summary in bytes: - // Measured: `547` - // Estimated: `3829` - // Minimum execution time: 41_501_000 picoseconds. - Weight::from_parts(43_101_000, 3829) + // Measured: `626` + // Estimated: `3652` + // Minimum execution time: 36_665_000 picoseconds. + Weight::from_parts(37_587_000, 3652) .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } /// Storage: `Uniques::Class` (r:1 w:1) /// Proof: `Uniques::Class` (`max_values`: None, `max_size`: Some(178), added: 2653, mode: `MaxEncodedLen`) /// Storage: `Uniques::InstanceMetadataOf` (r:1 w:0) - /// Proof: `Uniques::InstanceMetadataOf` (`max_values`: None, `max_size`: Some(108), added: 2583, mode: `MaxEncodedLen`) + /// Proof: `Uniques::InstanceMetadataOf` (`max_values`: None, `max_size`: Some(187), added: 2662, mode: `MaxEncodedLen`) /// Storage: `Uniques::Attribute` (r:1 w:1) - /// Proof: `Uniques::Attribute` (`max_values`: None, `max_size`: Some(364), added: 2839, mode: `MaxEncodedLen`) + /// Proof: `Uniques::Attribute` (`max_values`: None, `max_size`: Some(172), added: 2647, mode: `MaxEncodedLen`) fn clear_attribute() -> Weight { // Proof Size summary in bytes: - // Measured: `936` - // Estimated: `3829` - // Minimum execution time: 39_722_000 picoseconds. - Weight::from_parts(40_390_000, 3829) + // Measured: `823` + // Estimated: `3652` + // Minimum execution time: 35_066_000 picoseconds. + Weight::from_parts(36_380_000, 3652) .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } /// Storage: `Uniques::Class` (r:1 w:1) /// Proof: `Uniques::Class` (`max_values`: None, `max_size`: Some(178), added: 2653, mode: `MaxEncodedLen`) /// Storage: `Uniques::InstanceMetadataOf` (r:1 w:1) - /// Proof: `Uniques::InstanceMetadataOf` (`max_values`: None, `max_size`: Some(108), added: 2583, mode: `MaxEncodedLen`) + /// Proof: `Uniques::InstanceMetadataOf` (`max_values`: None, `max_size`: Some(187), added: 2662, mode: `MaxEncodedLen`) fn set_metadata() -> Weight { // Proof Size summary in bytes: // Measured: `415` - // Estimated: `3643` - // Minimum execution time: 30_726_000 picoseconds. - Weight::from_parts(31_557_000, 3643) + // Estimated: `3652` + // Minimum execution time: 27_060_000 picoseconds. + Weight::from_parts(27_813_000, 3652) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } /// Storage: `Uniques::Class` (r:1 w:1) /// Proof: `Uniques::Class` (`max_values`: None, `max_size`: Some(178), added: 2653, mode: `MaxEncodedLen`) /// Storage: `Uniques::InstanceMetadataOf` (r:1 w:1) - /// Proof: `Uniques::InstanceMetadataOf` (`max_values`: None, `max_size`: Some(108), added: 2583, mode: `MaxEncodedLen`) + /// Proof: `Uniques::InstanceMetadataOf` (`max_values`: None, `max_size`: Some(187), added: 2662, mode: `MaxEncodedLen`) fn clear_metadata() -> Weight { // Proof Size summary in bytes: - // Measured: `547` - // Estimated: `3643` - // Minimum execution time: 31_303_000 picoseconds. - Weight::from_parts(32_389_000, 3643) + // Measured: `626` + // Estimated: `3652` + // Minimum execution time: 27_776_000 picoseconds. + Weight::from_parts(28_582_000, 3652) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } /// Storage: `Uniques::Class` (r:1 w:1) /// Proof: `Uniques::Class` (`max_values`: None, `max_size`: Some(178), added: 2653, mode: `MaxEncodedLen`) /// Storage: `Uniques::ClassMetadataOf` (r:1 w:1) - /// Proof: `Uniques::ClassMetadataOf` (`max_values`: None, `max_size`: Some(88), added: 2563, mode: `MaxEncodedLen`) + /// Proof: `Uniques::ClassMetadataOf` (`max_values`: None, `max_size`: Some(167), added: 2642, mode: `MaxEncodedLen`) fn set_collection_metadata() -> Weight { // Proof Size summary in bytes: // Measured: `349` // Estimated: `3643` - // Minimum execution time: 32_155_000 picoseconds. - Weight::from_parts(32_885_000, 3643) + // Minimum execution time: 27_636_000 picoseconds. + Weight::from_parts(29_118_000, 3643) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } - /// Storage: `Uniques::Class` (r:1 w:0) + /// Storage: `Uniques::Class` (r:1 w:1) /// Proof: `Uniques::Class` (`max_values`: None, `max_size`: Some(178), added: 2653, mode: `MaxEncodedLen`) /// Storage: `Uniques::ClassMetadataOf` (r:1 w:1) - /// Proof: `Uniques::ClassMetadataOf` (`max_values`: None, `max_size`: Some(88), added: 2563, mode: `MaxEncodedLen`) + /// Proof: `Uniques::ClassMetadataOf` (`max_values`: None, `max_size`: Some(167), added: 2642, mode: `MaxEncodedLen`) fn clear_collection_metadata() -> Weight { // Proof Size summary in bytes: - // Measured: `461` + // Measured: `540` // Estimated: `3643` - // Minimum execution time: 30_044_000 picoseconds. - Weight::from_parts(31_405_000, 3643) + // Minimum execution time: 28_246_000 picoseconds. + Weight::from_parts(29_059_000, 3643) .saturating_add(T::DbWeight::get().reads(2_u64)) - .saturating_add(T::DbWeight::get().writes(1_u64)) + .saturating_add(T::DbWeight::get().writes(2_u64)) } /// Storage: `Uniques::Class` (r:1 w:0) /// Proof: `Uniques::Class` (`max_values`: None, `max_size`: Some(178), added: 2653, mode: `MaxEncodedLen`) @@ -396,8 +400,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `495` // Estimated: `3643` - // Minimum execution time: 18_904_000 picoseconds. - Weight::from_parts(19_687_000, 3643) + // Minimum execution time: 16_793_000 picoseconds. + Weight::from_parts(17_396_000, 3643) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -409,8 +413,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `528` // Estimated: `3643` - // Minimum execution time: 19_144_000 picoseconds. - Weight::from_parts(19_706_000, 3643) + // Minimum execution time: 16_726_000 picoseconds. + Weight::from_parts(17_357_000, 3643) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -420,8 +424,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `109` // Estimated: `3517` - // Minimum execution time: 15_339_000 picoseconds. - Weight::from_parts(15_918_000, 3517) + // Minimum execution time: 12_686_000 picoseconds. + Weight::from_parts(13_182_000, 3517) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -433,8 +437,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `349` // Estimated: `3643` - // Minimum execution time: 15_387_000 picoseconds. - Weight::from_parts(15_726_000, 3643) + // Minimum execution time: 13_508_000 picoseconds. + Weight::from_parts(13_906_000, 3643) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -446,8 +450,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `326` // Estimated: `3587` - // Minimum execution time: 15_873_000 picoseconds. - Weight::from_parts(16_860_000, 3587) + // Minimum execution time: 13_742_000 picoseconds. + Weight::from_parts(14_200_000, 3587) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -463,8 +467,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `607` // Estimated: `3643` - // Minimum execution time: 37_245_000 picoseconds. - Weight::from_parts(38_383_000, 3643) + // Minimum execution time: 32_931_000 picoseconds. + Weight::from_parts(34_023_000, 3643) .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(4_u64)) } @@ -480,8 +484,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `249` // Estimated: `3643` - // Minimum execution time: 31_393_000 picoseconds. - Weight::from_parts(32_933_000, 3643) + // Minimum execution time: 27_074_000 picoseconds. + Weight::from_parts(28_213_000, 3643) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } @@ -493,8 +497,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `109` // Estimated: `3643` - // Minimum execution time: 14_827_000 picoseconds. - Weight::from_parts(15_273_000, 3643) + // Minimum execution time: 12_034_000 picoseconds. + Weight::from_parts(12_669_000, 3643) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } @@ -503,13 +507,13 @@ impl WeightInfo for () { /// Storage: `Uniques::Asset` (r:1001 w:1000) /// Proof: `Uniques::Asset` (`max_values`: None, `max_size`: Some(122), added: 2597, mode: `MaxEncodedLen`) /// Storage: `Uniques::InstanceMetadataOf` (r:1000 w:1000) - /// Proof: `Uniques::InstanceMetadataOf` (`max_values`: None, `max_size`: Some(108), added: 2583, mode: `MaxEncodedLen`) + /// Proof: `Uniques::InstanceMetadataOf` (`max_values`: None, `max_size`: Some(187), added: 2662, mode: `MaxEncodedLen`) /// Storage: `Uniques::Attribute` (r:1000 w:1000) - /// Proof: `Uniques::Attribute` (`max_values`: None, `max_size`: Some(364), added: 2839, mode: `MaxEncodedLen`) + /// Proof: `Uniques::Attribute` (`max_values`: None, `max_size`: Some(172), added: 2647, mode: `MaxEncodedLen`) /// Storage: `Uniques::ClassAccount` (r:0 w:1) /// Proof: `Uniques::ClassAccount` (`max_values`: None, `max_size`: Some(68), added: 2543, mode: `MaxEncodedLen`) /// Storage: `Uniques::ClassMetadataOf` (r:0 w:1) - /// Proof: `Uniques::ClassMetadataOf` (`max_values`: None, `max_size`: Some(88), added: 2563, mode: `MaxEncodedLen`) + /// Proof: `Uniques::ClassMetadataOf` (`max_values`: None, `max_size`: Some(167), added: 2642, mode: `MaxEncodedLen`) /// Storage: `Uniques::Account` (r:0 w:1000) /// Proof: `Uniques::Account` (`max_values`: None, `max_size`: Some(88), added: 2563, mode: `MaxEncodedLen`) /// Storage: `Uniques::CollectionMaxSupply` (r:0 w:1) @@ -520,15 +524,15 @@ impl WeightInfo for () { fn destroy(n: u32, m: u32, a: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `418 + a * (107 ±0) + m * (56 ±0) + n * (76 ±0)` - // Estimated: `3643 + a * (2839 ±0) + m * (2583 ±0) + n * (2597 ±0)` - // Minimum execution time: 3_281_673_000 picoseconds. - Weight::from_parts(3_443_387_000, 3643) - // Standard Error: 41_937 - .saturating_add(Weight::from_parts(7_914_842, 0).saturating_mul(n.into())) - // Standard Error: 41_937 - .saturating_add(Weight::from_parts(519_960, 0).saturating_mul(m.into())) - // Standard Error: 41_937 - .saturating_add(Weight::from_parts(462_690, 0).saturating_mul(a.into())) + // Estimated: `3643 + a * (2647 ±0) + m * (2662 ±0) + n * (2597 ±0)` + // Minimum execution time: 2_928_174_000 picoseconds. + Weight::from_parts(2_970_367_000, 3643) + // Standard Error: 30_368 + .saturating_add(Weight::from_parts(7_336_699, 0).saturating_mul(n.into())) + // Standard Error: 30_368 + .saturating_add(Weight::from_parts(401_816, 0).saturating_mul(m.into())) + // Standard Error: 30_368 + .saturating_add(Weight::from_parts(346_952, 0).saturating_mul(a.into())) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().reads((1_u64).saturating_mul(n.into()))) .saturating_add(RocksDbWeight::get().reads((1_u64).saturating_mul(m.into()))) @@ -537,8 +541,8 @@ impl WeightInfo for () { .saturating_add(RocksDbWeight::get().writes((2_u64).saturating_mul(n.into()))) .saturating_add(RocksDbWeight::get().writes((1_u64).saturating_mul(m.into()))) .saturating_add(RocksDbWeight::get().writes((1_u64).saturating_mul(a.into()))) - .saturating_add(Weight::from_parts(0, 2839).saturating_mul(a.into())) - .saturating_add(Weight::from_parts(0, 2583).saturating_mul(m.into())) + .saturating_add(Weight::from_parts(0, 2647).saturating_mul(a.into())) + .saturating_add(Weight::from_parts(0, 2662).saturating_mul(m.into())) .saturating_add(Weight::from_parts(0, 2597).saturating_mul(n.into())) } /// Storage: `Uniques::Asset` (r:1 w:1) @@ -553,8 +557,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `349` // Estimated: `3643` - // Minimum execution time: 38_122_000 picoseconds. - Weight::from_parts(38_924_000, 3643) + // Minimum execution time: 33_733_000 picoseconds. + Weight::from_parts(35_366_000, 3643) .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(3_u64)) } @@ -570,8 +574,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `495` // Estimated: `3643` - // Minimum execution time: 38_835_000 picoseconds. - Weight::from_parts(39_754_000, 3643) + // Minimum execution time: 35_064_000 picoseconds. + Weight::from_parts(35_747_000, 3643) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(4_u64)) } @@ -587,8 +591,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `495` // Estimated: `3643` - // Minimum execution time: 27_032_000 picoseconds. - Weight::from_parts(27_793_000, 3643) + // Minimum execution time: 24_955_000 picoseconds. + Weight::from_parts(25_661_000, 3643) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(4_u64)) } @@ -601,10 +605,10 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `805 + i * (76 ±0)` // Estimated: `3643 + i * (2597 ±0)` - // Minimum execution time: 14_737_000 picoseconds. - Weight::from_parts(15_070_000, 3643) - // Standard Error: 22_500 - .saturating_add(Weight::from_parts(18_855_468, 0).saturating_mul(i.into())) + // Minimum execution time: 12_119_000 picoseconds. + Weight::from_parts(12_490_000, 3643) + // Standard Error: 14_697 + .saturating_add(Weight::from_parts(15_720_495, 0).saturating_mul(i.into())) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().reads((1_u64).saturating_mul(i.into()))) .saturating_add(RocksDbWeight::get().writes(1_u64)) @@ -619,8 +623,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `495` // Estimated: `3643` - // Minimum execution time: 18_664_000 picoseconds. - Weight::from_parts(19_455_000, 3643) + // Minimum execution time: 16_183_000 picoseconds. + Weight::from_parts(16_716_000, 3643) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -632,8 +636,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `495` // Estimated: `3643` - // Minimum execution time: 18_247_000 picoseconds. - Weight::from_parts(18_763_000, 3643) + // Minimum execution time: 16_119_000 picoseconds. + Weight::from_parts(16_725_000, 3643) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -643,8 +647,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `349` // Estimated: `3643` - // Minimum execution time: 13_219_000 picoseconds. - Weight::from_parts(13_923_000, 3643) + // Minimum execution time: 10_889_000 picoseconds. + Weight::from_parts(11_480_000, 3643) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -654,8 +658,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `349` // Estimated: `3643` - // Minimum execution time: 13_376_000 picoseconds. - Weight::from_parts(13_904_000, 3643) + // Minimum execution time: 10_903_000 picoseconds. + Weight::from_parts(11_241_000, 3643) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -663,16 +667,18 @@ impl WeightInfo for () { /// Proof: `Uniques::OwnershipAcceptance` (`max_values`: None, `max_size`: Some(52), added: 2527, mode: `MaxEncodedLen`) /// Storage: `Uniques::Class` (r:1 w:1) /// Proof: `Uniques::Class` (`max_values`: None, `max_size`: Some(178), added: 2653, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) /// Storage: `Uniques::ClassAccount` (r:0 w:2) /// Proof: `Uniques::ClassAccount` (`max_values`: None, `max_size`: Some(68), added: 2543, mode: `MaxEncodedLen`) fn transfer_ownership() -> Weight { // Proof Size summary in bytes: - // Measured: `423` + // Measured: `597` // Estimated: `3643` - // Minimum execution time: 22_353_000 picoseconds. - Weight::from_parts(23_222_000, 3643) - .saturating_add(RocksDbWeight::get().reads(2_u64)) - .saturating_add(RocksDbWeight::get().writes(4_u64)) + // Minimum execution time: 24_942_000 picoseconds. + Weight::from_parts(25_715_000, 3643) + .saturating_add(RocksDbWeight::get().reads(3_u64)) + .saturating_add(RocksDbWeight::get().writes(5_u64)) } /// Storage: `Uniques::Class` (r:1 w:1) /// Proof: `Uniques::Class` (`max_values`: None, `max_size`: Some(178), added: 2653, mode: `MaxEncodedLen`) @@ -680,8 +686,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `349` // Estimated: `3643` - // Minimum execution time: 14_072_000 picoseconds. - Weight::from_parts(14_619_000, 3643) + // Minimum execution time: 11_488_000 picoseconds. + Weight::from_parts(11_752_000, 3643) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -693,92 +699,92 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `349` // Estimated: `3643` - // Minimum execution time: 17_081_000 picoseconds. - Weight::from_parts(17_698_000, 3643) + // Minimum execution time: 14_721_000 picoseconds. + Weight::from_parts(15_187_000, 3643) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } /// Storage: `Uniques::Class` (r:1 w:1) /// Proof: `Uniques::Class` (`max_values`: None, `max_size`: Some(178), added: 2653, mode: `MaxEncodedLen`) /// Storage: `Uniques::InstanceMetadataOf` (r:1 w:0) - /// Proof: `Uniques::InstanceMetadataOf` (`max_values`: None, `max_size`: Some(108), added: 2583, mode: `MaxEncodedLen`) + /// Proof: `Uniques::InstanceMetadataOf` (`max_values`: None, `max_size`: Some(187), added: 2662, mode: `MaxEncodedLen`) /// Storage: `Uniques::Attribute` (r:1 w:1) - /// Proof: `Uniques::Attribute` (`max_values`: None, `max_size`: Some(364), added: 2839, mode: `MaxEncodedLen`) + /// Proof: `Uniques::Attribute` (`max_values`: None, `max_size`: Some(172), added: 2647, mode: `MaxEncodedLen`) fn set_attribute() -> Weight { // Proof Size summary in bytes: - // Measured: `547` - // Estimated: `3829` - // Minimum execution time: 41_501_000 picoseconds. - Weight::from_parts(43_101_000, 3829) + // Measured: `626` + // Estimated: `3652` + // Minimum execution time: 36_665_000 picoseconds. + Weight::from_parts(37_587_000, 3652) .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } /// Storage: `Uniques::Class` (r:1 w:1) /// Proof: `Uniques::Class` (`max_values`: None, `max_size`: Some(178), added: 2653, mode: `MaxEncodedLen`) /// Storage: `Uniques::InstanceMetadataOf` (r:1 w:0) - /// Proof: `Uniques::InstanceMetadataOf` (`max_values`: None, `max_size`: Some(108), added: 2583, mode: `MaxEncodedLen`) + /// Proof: `Uniques::InstanceMetadataOf` (`max_values`: None, `max_size`: Some(187), added: 2662, mode: `MaxEncodedLen`) /// Storage: `Uniques::Attribute` (r:1 w:1) - /// Proof: `Uniques::Attribute` (`max_values`: None, `max_size`: Some(364), added: 2839, mode: `MaxEncodedLen`) + /// Proof: `Uniques::Attribute` (`max_values`: None, `max_size`: Some(172), added: 2647, mode: `MaxEncodedLen`) fn clear_attribute() -> Weight { // Proof Size summary in bytes: - // Measured: `936` - // Estimated: `3829` - // Minimum execution time: 39_722_000 picoseconds. - Weight::from_parts(40_390_000, 3829) + // Measured: `823` + // Estimated: `3652` + // Minimum execution time: 35_066_000 picoseconds. + Weight::from_parts(36_380_000, 3652) .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } /// Storage: `Uniques::Class` (r:1 w:1) /// Proof: `Uniques::Class` (`max_values`: None, `max_size`: Some(178), added: 2653, mode: `MaxEncodedLen`) /// Storage: `Uniques::InstanceMetadataOf` (r:1 w:1) - /// Proof: `Uniques::InstanceMetadataOf` (`max_values`: None, `max_size`: Some(108), added: 2583, mode: `MaxEncodedLen`) + /// Proof: `Uniques::InstanceMetadataOf` (`max_values`: None, `max_size`: Some(187), added: 2662, mode: `MaxEncodedLen`) fn set_metadata() -> Weight { // Proof Size summary in bytes: // Measured: `415` - // Estimated: `3643` - // Minimum execution time: 30_726_000 picoseconds. - Weight::from_parts(31_557_000, 3643) + // Estimated: `3652` + // Minimum execution time: 27_060_000 picoseconds. + Weight::from_parts(27_813_000, 3652) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } /// Storage: `Uniques::Class` (r:1 w:1) /// Proof: `Uniques::Class` (`max_values`: None, `max_size`: Some(178), added: 2653, mode: `MaxEncodedLen`) /// Storage: `Uniques::InstanceMetadataOf` (r:1 w:1) - /// Proof: `Uniques::InstanceMetadataOf` (`max_values`: None, `max_size`: Some(108), added: 2583, mode: `MaxEncodedLen`) + /// Proof: `Uniques::InstanceMetadataOf` (`max_values`: None, `max_size`: Some(187), added: 2662, mode: `MaxEncodedLen`) fn clear_metadata() -> Weight { // Proof Size summary in bytes: - // Measured: `547` - // Estimated: `3643` - // Minimum execution time: 31_303_000 picoseconds. - Weight::from_parts(32_389_000, 3643) + // Measured: `626` + // Estimated: `3652` + // Minimum execution time: 27_776_000 picoseconds. + Weight::from_parts(28_582_000, 3652) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } /// Storage: `Uniques::Class` (r:1 w:1) /// Proof: `Uniques::Class` (`max_values`: None, `max_size`: Some(178), added: 2653, mode: `MaxEncodedLen`) /// Storage: `Uniques::ClassMetadataOf` (r:1 w:1) - /// Proof: `Uniques::ClassMetadataOf` (`max_values`: None, `max_size`: Some(88), added: 2563, mode: `MaxEncodedLen`) + /// Proof: `Uniques::ClassMetadataOf` (`max_values`: None, `max_size`: Some(167), added: 2642, mode: `MaxEncodedLen`) fn set_collection_metadata() -> Weight { // Proof Size summary in bytes: // Measured: `349` // Estimated: `3643` - // Minimum execution time: 32_155_000 picoseconds. - Weight::from_parts(32_885_000, 3643) + // Minimum execution time: 27_636_000 picoseconds. + Weight::from_parts(29_118_000, 3643) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } - /// Storage: `Uniques::Class` (r:1 w:0) + /// Storage: `Uniques::Class` (r:1 w:1) /// Proof: `Uniques::Class` (`max_values`: None, `max_size`: Some(178), added: 2653, mode: `MaxEncodedLen`) /// Storage: `Uniques::ClassMetadataOf` (r:1 w:1) - /// Proof: `Uniques::ClassMetadataOf` (`max_values`: None, `max_size`: Some(88), added: 2563, mode: `MaxEncodedLen`) + /// Proof: `Uniques::ClassMetadataOf` (`max_values`: None, `max_size`: Some(167), added: 2642, mode: `MaxEncodedLen`) fn clear_collection_metadata() -> Weight { // Proof Size summary in bytes: - // Measured: `461` + // Measured: `540` // Estimated: `3643` - // Minimum execution time: 30_044_000 picoseconds. - Weight::from_parts(31_405_000, 3643) + // Minimum execution time: 28_246_000 picoseconds. + Weight::from_parts(29_059_000, 3643) .saturating_add(RocksDbWeight::get().reads(2_u64)) - .saturating_add(RocksDbWeight::get().writes(1_u64)) + .saturating_add(RocksDbWeight::get().writes(2_u64)) } /// Storage: `Uniques::Class` (r:1 w:0) /// Proof: `Uniques::Class` (`max_values`: None, `max_size`: Some(178), added: 2653, mode: `MaxEncodedLen`) @@ -788,8 +794,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `495` // Estimated: `3643` - // Minimum execution time: 18_904_000 picoseconds. - Weight::from_parts(19_687_000, 3643) + // Minimum execution time: 16_793_000 picoseconds. + Weight::from_parts(17_396_000, 3643) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -801,8 +807,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `528` // Estimated: `3643` - // Minimum execution time: 19_144_000 picoseconds. - Weight::from_parts(19_706_000, 3643) + // Minimum execution time: 16_726_000 picoseconds. + Weight::from_parts(17_357_000, 3643) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -812,8 +818,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `109` // Estimated: `3517` - // Minimum execution time: 15_339_000 picoseconds. - Weight::from_parts(15_918_000, 3517) + // Minimum execution time: 12_686_000 picoseconds. + Weight::from_parts(13_182_000, 3517) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -825,8 +831,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `349` // Estimated: `3643` - // Minimum execution time: 15_387_000 picoseconds. - Weight::from_parts(15_726_000, 3643) + // Minimum execution time: 13_508_000 picoseconds. + Weight::from_parts(13_906_000, 3643) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -838,8 +844,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `326` // Estimated: `3587` - // Minimum execution time: 15_873_000 picoseconds. - Weight::from_parts(16_860_000, 3587) + // Minimum execution time: 13_742_000 picoseconds. + Weight::from_parts(14_200_000, 3587) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -855,8 +861,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `607` // Estimated: `3643` - // Minimum execution time: 37_245_000 picoseconds. - Weight::from_parts(38_383_000, 3643) + // Minimum execution time: 32_931_000 picoseconds. + Weight::from_parts(34_023_000, 3643) .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(4_u64)) } diff --git a/substrate/frame/utility/Cargo.toml b/substrate/frame/utility/Cargo.toml index ce5cd0fa61f2166b1993eb2150953c13fa1cc5e3..2ad575ed51ffe708b9369a81ea0a4aa5d50e600b 100644 --- a/substrate/frame/utility/Cargo.toml +++ b/substrate/frame/utility/Cargo.toml @@ -17,7 +17,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } frame-benchmarking = { path = "../benchmarking", default-features = false, optional = true } frame-support = { path = "../support", default-features = false } frame-system = { path = "../system", default-features = false } diff --git a/substrate/frame/utility/README.md b/substrate/frame/utility/README.md index 00fff76cd626bcb119f971edb910c033024b54c8..0a6769ae1c7c14a8480cd58a43c6a2e495a10906 100644 --- a/substrate/frame/utility/README.md +++ b/substrate/frame/utility/README.md @@ -17,7 +17,7 @@ This module contains two basic pieces of functionality: need multiple distinct accounts (e.g. as controllers for many staking accounts), but where it's perfectly fine to have each of them controlled by the same underlying keypair. Derivative accounts are, for the purposes of proxy filtering considered exactly the same as - the oigin and are thus hampered with the origin's filters. + the origin and are thus hampered with the origin's filters. Since proxy filters are respected in all dispatches of this module, it should never need to be filtered by any proxy. diff --git a/substrate/frame/utility/src/tests.rs b/substrate/frame/utility/src/tests.rs index 1a1196cb4c0669c279b47c48e309101e9d27e3d9..9bcbec99f3b441669eaf68433f0e88b3f5117502 100644 --- a/substrate/frame/utility/src/tests.rs +++ b/substrate/frame/utility/src/tests.rs @@ -27,13 +27,12 @@ use frame_support::{ dispatch::{DispatchErrorWithPostInfo, Pays}, error::BadOrigin, parameter_types, storage, - traits::{ConstU32, ConstU64, Contains}, + traits::{ConstU64, Contains}, weights::Weight, }; use pallet_collective::{EnsureProportionAtLeast, Instance1}; -use sp_core::H256; use sp_runtime::{ - traits::{BlakeTwo256, Dispatchable, Hash, IdentityLookup}, + traits::{BlakeTwo256, Dispatchable, Hash}, BuildStorage, DispatchError, TokenError, }; @@ -144,31 +143,12 @@ parameter_types! { pub BlockWeights: frame_system::limits::BlockWeights = frame_system::limits::BlockWeights::simple_max(Weight::MAX); } -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { type BaseCallFilter = TestBaseCallFilter; type BlockWeights = BlockWeights; - type BlockLength = (); - type DbWeight = (); - type RuntimeOrigin = RuntimeOrigin; - type Nonce = u64; - type Hash = H256; - type RuntimeCall = RuntimeCall; - type Hashing = BlakeTwo256; - type AccountId = u64; - type Lookup = IdentityLookup; type Block = Block; - type RuntimeEvent = RuntimeEvent; - type BlockHashCount = ConstU64<250>; - type Version = (); - type PalletInfo = PalletInfo; type AccountData = pallet_balances::AccountData; - type OnNewAccount = (); - type OnKilledAccount = (); - type SystemWeightInfo = frame_system::weights::SubstrateWeight; - type SS58Prefix = (); - type OnSetCode = (); - type MaxConsumers = ConstU32<16>; } impl pallet_balances::Config for Test { diff --git a/substrate/frame/utility/src/weights.rs b/substrate/frame/utility/src/weights.rs index 1a3ea6c1f7fc85df4e90a6e8552fc211a51f5405..502f85a3f178bbdd33645c11c3be661585a4807d 100644 --- a/substrate/frame/utility/src/weights.rs +++ b/substrate/frame/utility/src/weights.rs @@ -15,16 +15,16 @@ // See the License for the specific language governing permissions and // limitations under the License. -//! Autogenerated weights for pallet_utility +//! Autogenerated weights for `pallet_utility` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-06-16, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-04-09, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-e8ezs4ez-project-145-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("dev"), DB CACHE: 1024 +//! HOSTNAME: `runner-anb7yjbi-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: `1024` // Executed Command: -// ./target/production/substrate +// ./target/production/substrate-node // benchmark // pallet // --chain=dev @@ -35,12 +35,11 @@ // --no-median-slopes // --no-min-squares // --extrinsic=* -// --execution=wasm // --wasm-execution=compiled // --heap-pages=4096 -// --output=./frame/utility/src/weights.rs -// --header=./HEADER-APACHE2 -// --template=./.maintain/frame-weight-template.hbs +// --output=./substrate/frame/utility/src/weights.rs +// --header=./substrate/HEADER-APACHE2 +// --template=./substrate/.maintain/frame-weight-template.hbs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -50,7 +49,7 @@ use frame_support::{traits::Get, weights::{Weight, constants::RocksDbWeight}}; use core::marker::PhantomData; -/// Weight functions needed for pallet_utility. +/// Weight functions needed for `pallet_utility`. pub trait WeightInfo { fn batch(c: u32, ) -> Weight; fn as_derivative() -> Weight; @@ -59,99 +58,139 @@ pub trait WeightInfo { fn force_batch(c: u32, ) -> Weight; } -/// Weights for pallet_utility using the Substrate node and recommended hardware. +/// Weights for `pallet_utility` using the Substrate node and recommended hardware. pub struct SubstrateWeight(PhantomData); impl WeightInfo for SubstrateWeight { + /// Storage: `SafeMode::EnteredUntil` (r:1 w:0) + /// Proof: `SafeMode::EnteredUntil` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `TxPause::PausedCalls` (r:1 w:0) + /// Proof: `TxPause::PausedCalls` (`max_values`: None, `max_size`: Some(532), added: 3007, mode: `MaxEncodedLen`) /// The range of component `c` is `[0, 1000]`. fn batch(c: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 6_763_000 picoseconds. - Weight::from_parts(16_943_157, 0) - // Standard Error: 1_904 - .saturating_add(Weight::from_parts(4_653_855, 0).saturating_mul(c.into())) + // Measured: `145` + // Estimated: `3997` + // Minimum execution time: 5_312_000 picoseconds. + Weight::from_parts(2_694_370, 3997) + // Standard Error: 5_055 + .saturating_add(Weight::from_parts(5_005_941, 0).saturating_mul(c.into())) + .saturating_add(T::DbWeight::get().reads(2_u64)) } + /// Storage: `SafeMode::EnteredUntil` (r:1 w:0) + /// Proof: `SafeMode::EnteredUntil` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `TxPause::PausedCalls` (r:1 w:0) + /// Proof: `TxPause::PausedCalls` (`max_values`: None, `max_size`: Some(532), added: 3007, mode: `MaxEncodedLen`) fn as_derivative() -> Weight { // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 5_149_000 picoseconds. - Weight::from_parts(5_268_000, 0) + // Measured: `145` + // Estimated: `3997` + // Minimum execution time: 9_263_000 picoseconds. + Weight::from_parts(9_639_000, 3997) + .saturating_add(T::DbWeight::get().reads(2_u64)) } + /// Storage: `SafeMode::EnteredUntil` (r:1 w:0) + /// Proof: `SafeMode::EnteredUntil` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `TxPause::PausedCalls` (r:1 w:0) + /// Proof: `TxPause::PausedCalls` (`max_values`: None, `max_size`: Some(532), added: 3007, mode: `MaxEncodedLen`) /// The range of component `c` is `[0, 1000]`. fn batch_all(c: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 6_976_000 picoseconds. - Weight::from_parts(16_448_433, 0) - // Standard Error: 1_834 - .saturating_add(Weight::from_parts(4_796_983, 0).saturating_mul(c.into())) + // Measured: `145` + // Estimated: `3997` + // Minimum execution time: 5_120_000 picoseconds. + Weight::from_parts(12_948_874, 3997) + // Standard Error: 4_643 + .saturating_add(Weight::from_parts(5_162_821, 0).saturating_mul(c.into())) + .saturating_add(T::DbWeight::get().reads(2_u64)) } fn dispatch_as() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 9_102_000 picoseconds. - Weight::from_parts(9_353_000, 0) + // Minimum execution time: 7_126_000 picoseconds. + Weight::from_parts(7_452_000, 0) } + /// Storage: `SafeMode::EnteredUntil` (r:1 w:0) + /// Proof: `SafeMode::EnteredUntil` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `TxPause::PausedCalls` (r:1 w:0) + /// Proof: `TxPause::PausedCalls` (`max_values`: None, `max_size`: Some(532), added: 3007, mode: `MaxEncodedLen`) /// The range of component `c` is `[0, 1000]`. fn force_batch(c: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 6_840_000 picoseconds. - Weight::from_parts(17_748_474, 0) - // Standard Error: 2_059 - .saturating_add(Weight::from_parts(4_630_079, 0).saturating_mul(c.into())) + // Measured: `145` + // Estimated: `3997` + // Minimum execution time: 5_254_000 picoseconds. + Weight::from_parts(4_879_712, 3997) + // Standard Error: 4_988 + .saturating_add(Weight::from_parts(4_955_816, 0).saturating_mul(c.into())) + .saturating_add(T::DbWeight::get().reads(2_u64)) } } -// For backwards compatibility and tests +// For backwards compatibility and tests. impl WeightInfo for () { + /// Storage: `SafeMode::EnteredUntil` (r:1 w:0) + /// Proof: `SafeMode::EnteredUntil` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `TxPause::PausedCalls` (r:1 w:0) + /// Proof: `TxPause::PausedCalls` (`max_values`: None, `max_size`: Some(532), added: 3007, mode: `MaxEncodedLen`) /// The range of component `c` is `[0, 1000]`. fn batch(c: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 6_763_000 picoseconds. - Weight::from_parts(16_943_157, 0) - // Standard Error: 1_904 - .saturating_add(Weight::from_parts(4_653_855, 0).saturating_mul(c.into())) + // Measured: `145` + // Estimated: `3997` + // Minimum execution time: 5_312_000 picoseconds. + Weight::from_parts(2_694_370, 3997) + // Standard Error: 5_055 + .saturating_add(Weight::from_parts(5_005_941, 0).saturating_mul(c.into())) + .saturating_add(RocksDbWeight::get().reads(2_u64)) } + /// Storage: `SafeMode::EnteredUntil` (r:1 w:0) + /// Proof: `SafeMode::EnteredUntil` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `TxPause::PausedCalls` (r:1 w:0) + /// Proof: `TxPause::PausedCalls` (`max_values`: None, `max_size`: Some(532), added: 3007, mode: `MaxEncodedLen`) fn as_derivative() -> Weight { // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 5_149_000 picoseconds. - Weight::from_parts(5_268_000, 0) + // Measured: `145` + // Estimated: `3997` + // Minimum execution time: 9_263_000 picoseconds. + Weight::from_parts(9_639_000, 3997) + .saturating_add(RocksDbWeight::get().reads(2_u64)) } + /// Storage: `SafeMode::EnteredUntil` (r:1 w:0) + /// Proof: `SafeMode::EnteredUntil` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `TxPause::PausedCalls` (r:1 w:0) + /// Proof: `TxPause::PausedCalls` (`max_values`: None, `max_size`: Some(532), added: 3007, mode: `MaxEncodedLen`) /// The range of component `c` is `[0, 1000]`. fn batch_all(c: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 6_976_000 picoseconds. - Weight::from_parts(16_448_433, 0) - // Standard Error: 1_834 - .saturating_add(Weight::from_parts(4_796_983, 0).saturating_mul(c.into())) + // Measured: `145` + // Estimated: `3997` + // Minimum execution time: 5_120_000 picoseconds. + Weight::from_parts(12_948_874, 3997) + // Standard Error: 4_643 + .saturating_add(Weight::from_parts(5_162_821, 0).saturating_mul(c.into())) + .saturating_add(RocksDbWeight::get().reads(2_u64)) } fn dispatch_as() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 9_102_000 picoseconds. - Weight::from_parts(9_353_000, 0) + // Minimum execution time: 7_126_000 picoseconds. + Weight::from_parts(7_452_000, 0) } + /// Storage: `SafeMode::EnteredUntil` (r:1 w:0) + /// Proof: `SafeMode::EnteredUntil` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `TxPause::PausedCalls` (r:1 w:0) + /// Proof: `TxPause::PausedCalls` (`max_values`: None, `max_size`: Some(532), added: 3007, mode: `MaxEncodedLen`) /// The range of component `c` is `[0, 1000]`. fn force_batch(c: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `0` - // Estimated: `0` - // Minimum execution time: 6_840_000 picoseconds. - Weight::from_parts(17_748_474, 0) - // Standard Error: 2_059 - .saturating_add(Weight::from_parts(4_630_079, 0).saturating_mul(c.into())) + // Measured: `145` + // Estimated: `3997` + // Minimum execution time: 5_254_000 picoseconds. + Weight::from_parts(4_879_712, 3997) + // Standard Error: 4_988 + .saturating_add(Weight::from_parts(4_955_816, 0).saturating_mul(c.into())) + .saturating_add(RocksDbWeight::get().reads(2_u64)) } } diff --git a/substrate/frame/vesting/Cargo.toml b/substrate/frame/vesting/Cargo.toml index f81b7a122c57b82c8a8b841ca72e56d5fb275f48..e71731e397788a956bd72a74e93b9ac10d0fd7a6 100644 --- a/substrate/frame/vesting/Cargo.toml +++ b/substrate/frame/vesting/Cargo.toml @@ -19,8 +19,8 @@ targets = ["x86_64-unknown-linux-gnu"] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = [ "derive", ] } -log = { version = "0.4.17", default-features = false } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +log = { workspace = true } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } frame-benchmarking = { path = "../benchmarking", default-features = false, optional = true } frame-support = { path = "../support", default-features = false } frame-system = { path = "../system", default-features = false } diff --git a/substrate/frame/vesting/src/migrations.rs b/substrate/frame/vesting/src/migrations.rs index cac3c90b403ab4b1e037e140c0598aa83d69816e..6fe82312b637d550bfe164c62155bb9261e75801 100644 --- a/substrate/frame/vesting/src/migrations.rs +++ b/substrate/frame/vesting/src/migrations.rs @@ -29,7 +29,7 @@ pub mod v1 { log::debug!( target: "runtime::vesting", - "migration: Vesting storage version v1 PRE migration checks succesful!" + "migration: Vesting storage version v1 PRE migration checks successful!" ); Ok(()) diff --git a/substrate/frame/vesting/src/mock.rs b/substrate/frame/vesting/src/mock.rs index befe8cd3b760eddce92f7de73893df753b71546b..674a6f6e2a83677eae30fae445c05def44741e12 100644 --- a/substrate/frame/vesting/src/mock.rs +++ b/substrate/frame/vesting/src/mock.rs @@ -17,13 +17,9 @@ use frame_support::{ derive_impl, parameter_types, - traits::{ConstU32, ConstU64, WithdrawReasons}, -}; -use sp_core::H256; -use sp_runtime::{ - traits::{BlakeTwo256, Identity, IdentityLookup}, - BuildStorage, + traits::{ConstU32, WithdrawReasons}, }; +use sp_runtime::{traits::Identity, BuildStorage}; use super::*; use crate as pallet_vesting; @@ -39,31 +35,10 @@ frame_support::construct_runtime!( } ); -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { type AccountData = pallet_balances::AccountData; - type AccountId = u64; - type BaseCallFilter = frame_support::traits::Everything; - type BlockHashCount = ConstU64<250>; - type BlockLength = (); - type BlockWeights = (); - type RuntimeCall = RuntimeCall; - type DbWeight = (); - type RuntimeEvent = RuntimeEvent; - type Hash = H256; - type Hashing = BlakeTwo256; type Block = Block; - type Nonce = u64; - type Lookup = IdentityLookup; - type OnKilledAccount = (); - type OnNewAccount = (); - type OnSetCode = (); - type MaxConsumers = frame_support::traits::ConstU32<16>; - type RuntimeOrigin = RuntimeOrigin; - type PalletInfo = PalletInfo; - type SS58Prefix = (); - type SystemWeightInfo = (); - type Version = (); } impl pallet_balances::Config for Test { diff --git a/substrate/frame/vesting/src/weights.rs b/substrate/frame/vesting/src/weights.rs index ddc7db8fa61fbedef4c2629117459dc37c5f8bcd..efb8cbcc41c46a73c9028e22ade21b47fb34336f 100644 --- a/substrate/frame/vesting/src/weights.rs +++ b/substrate/frame/vesting/src/weights.rs @@ -17,26 +17,28 @@ //! Autogenerated weights for `pallet_vesting` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-10-29, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-04-09, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-vmdtonbz-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! HOSTNAME: `runner-anb7yjbi-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: `1024` // Executed Command: -// target/production/substrate-node +// ./target/production/substrate-node // benchmark // pallet +// --chain=dev // --steps=50 // --repeat=20 +// --pallet=pallet_vesting +// --no-storage-info +// --no-median-slopes +// --no-min-squares // --extrinsic=* // --wasm-execution=compiled // --heap-pages=4096 -// --json-file=/builds/parity/mirrors/polkadot-sdk/.git/.artifacts/bench.json -// --pallet=pallet_vesting -// --chain=dev -// --header=./substrate/HEADER-APACHE2 // --output=./substrate/frame/vesting/src/weights.rs +// --header=./substrate/HEADER-APACHE2 // --template=./substrate/.maintain/frame-weight-template.hbs #![cfg_attr(rustfmt, rustfmt_skip)] @@ -75,12 +77,12 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `381 + l * (25 ±0) + s * (36 ±0)` // Estimated: `4764` - // Minimum execution time: 32_846_000 picoseconds. - Weight::from_parts(30_974_459, 4764) - // Standard Error: 1_755 - .saturating_add(Weight::from_parts(73_138, 0).saturating_mul(l.into())) - // Standard Error: 3_123 - .saturating_add(Weight::from_parts(82_417, 0).saturating_mul(s.into())) + // Minimum execution time: 32_202_000 picoseconds. + Weight::from_parts(31_586_520, 4764) + // Standard Error: 1_513 + .saturating_add(Weight::from_parts(67_257, 0).saturating_mul(l.into())) + // Standard Error: 2_693 + .saturating_add(Weight::from_parts(69_725, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } @@ -96,12 +98,12 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `381 + l * (25 ±0) + s * (36 ±0)` // Estimated: `4764` - // Minimum execution time: 34_360_000 picoseconds. - Weight::from_parts(34_964_080, 4764) - // Standard Error: 1_996 - .saturating_add(Weight::from_parts(48_024, 0).saturating_mul(l.into())) - // Standard Error: 3_552 - .saturating_add(Weight::from_parts(34_411, 0).saturating_mul(s.into())) + // Minimum execution time: 34_847_000 picoseconds. + Weight::from_parts(34_690_456, 4764) + // Standard Error: 1_681 + .saturating_add(Weight::from_parts(51_103, 0).saturating_mul(l.into())) + // Standard Error: 2_991 + .saturating_add(Weight::from_parts(55_094, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } @@ -119,12 +121,12 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `484 + l * (25 ±0) + s * (36 ±0)` // Estimated: `4764` - // Minimum execution time: 33_859_000 picoseconds. - Weight::from_parts(32_950_681, 4764) - // Standard Error: 1_745 - .saturating_add(Weight::from_parts(69_323, 0).saturating_mul(l.into())) - // Standard Error: 3_105 - .saturating_add(Weight::from_parts(86_370, 0).saturating_mul(s.into())) + // Minimum execution time: 34_027_000 picoseconds. + Weight::from_parts(33_353_168, 4764) + // Standard Error: 1_477 + .saturating_add(Weight::from_parts(72_605, 0).saturating_mul(l.into())) + // Standard Error: 2_629 + .saturating_add(Weight::from_parts(64_115, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(4_u64)) .saturating_add(T::DbWeight::get().writes(3_u64)) } @@ -142,12 +144,12 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `484 + l * (25 ±0) + s * (36 ±0)` // Estimated: `4764` - // Minimum execution time: 36_239_000 picoseconds. - Weight::from_parts(36_459_756, 4764) - // Standard Error: 2_051 - .saturating_add(Weight::from_parts(56_670, 0).saturating_mul(l.into())) - // Standard Error: 3_650 - .saturating_add(Weight::from_parts(49_663, 0).saturating_mul(s.into())) + // Minimum execution time: 36_816_000 picoseconds. + Weight::from_parts(36_467_447, 4764) + // Standard Error: 1_689 + .saturating_add(Weight::from_parts(51_855, 0).saturating_mul(l.into())) + // Standard Error: 3_006 + .saturating_add(Weight::from_parts(58_233, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(4_u64)) .saturating_add(T::DbWeight::get().writes(3_u64)) } @@ -165,12 +167,12 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `555 + l * (25 ±0) + s * (36 ±0)` // Estimated: `4764` - // Minimum execution time: 70_330_000 picoseconds. - Weight::from_parts(71_196_328, 4764) - // Standard Error: 2_923 - .saturating_add(Weight::from_parts(67_238, 0).saturating_mul(l.into())) - // Standard Error: 5_201 - .saturating_add(Weight::from_parts(89_102, 0).saturating_mul(s.into())) + // Minimum execution time: 70_906_000 picoseconds. + Weight::from_parts(72_663_428, 4764) + // Standard Error: 2_877 + .saturating_add(Weight::from_parts(81_242, 0).saturating_mul(l.into())) + // Standard Error: 5_118 + .saturating_add(Weight::from_parts(103_344, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(4_u64)) .saturating_add(T::DbWeight::get().writes(3_u64)) } @@ -188,12 +190,12 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `658 + l * (25 ±0) + s * (36 ±0)` // Estimated: `6196` - // Minimum execution time: 70_235_000 picoseconds. - Weight::from_parts(71_960_020, 6196) - // Standard Error: 2_493 - .saturating_add(Weight::from_parts(64_835, 0).saturating_mul(l.into())) - // Standard Error: 4_436 - .saturating_add(Weight::from_parts(102_159, 0).saturating_mul(s.into())) + // Minimum execution time: 72_730_000 picoseconds. + Weight::from_parts(75_050_411, 6196) + // Standard Error: 2_748 + .saturating_add(Weight::from_parts(73_218, 0).saturating_mul(l.into())) + // Standard Error: 4_889 + .saturating_add(Weight::from_parts(112_868, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(5_u64)) .saturating_add(T::DbWeight::get().writes(4_u64)) } @@ -211,12 +213,12 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `482 + l * (25 ±0) + s * (36 ±0)` // Estimated: `4764` - // Minimum execution time: 34_352_000 picoseconds. - Weight::from_parts(33_697_027, 4764) - // Standard Error: 2_008 - .saturating_add(Weight::from_parts(79_270, 0).saturating_mul(l.into())) - // Standard Error: 3_710 - .saturating_add(Weight::from_parts(60_691, 0).saturating_mul(s.into())) + // Minimum execution time: 34_698_000 picoseconds. + Weight::from_parts(34_504_324, 4764) + // Standard Error: 1_703 + .saturating_add(Weight::from_parts(56_321, 0).saturating_mul(l.into())) + // Standard Error: 3_145 + .saturating_add(Weight::from_parts(55_503, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(4_u64)) .saturating_add(T::DbWeight::get().writes(3_u64)) } @@ -234,12 +236,12 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `482 + l * (25 ±0) + s * (36 ±0)` // Estimated: `4764` - // Minimum execution time: 37_467_000 picoseconds. - Weight::from_parts(36_866_847, 4764) - // Standard Error: 1_692 - .saturating_add(Weight::from_parts(57_882, 0).saturating_mul(l.into())) - // Standard Error: 3_124 - .saturating_add(Weight::from_parts(80_266, 0).saturating_mul(s.into())) + // Minimum execution time: 36_951_000 picoseconds. + Weight::from_parts(37_020_649, 4764) + // Standard Error: 1_791 + .saturating_add(Weight::from_parts(65_437, 0).saturating_mul(l.into())) + // Standard Error: 3_308 + .saturating_add(Weight::from_parts(54_146, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(4_u64)) .saturating_add(T::DbWeight::get().writes(3_u64)) } @@ -257,12 +259,12 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `555 + l * (25 ±0) + s * (36 ±0)` // Estimated: `4764` - // Minimum execution time: 41_497_000 picoseconds. - Weight::from_parts(38_763_834, 4764) - // Standard Error: 2_030 - .saturating_add(Weight::from_parts(99_580, 0).saturating_mul(l.into())) - // Standard Error: 3_750 - .saturating_add(Weight::from_parts(132_188, 0).saturating_mul(s.into())) + // Minimum execution time: 38_849_000 picoseconds. + Weight::from_parts(38_488_577, 4764) + // Standard Error: 1_911 + .saturating_add(Weight::from_parts(72_338, 0).saturating_mul(l.into())) + // Standard Error: 3_529 + .saturating_add(Weight::from_parts(62_206, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(4_u64)) .saturating_add(T::DbWeight::get().writes(3_u64)) } @@ -282,12 +284,12 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `381 + l * (25 ±0) + s * (36 ±0)` // Estimated: `4764` - // Minimum execution time: 32_846_000 picoseconds. - Weight::from_parts(30_974_459, 4764) - // Standard Error: 1_755 - .saturating_add(Weight::from_parts(73_138, 0).saturating_mul(l.into())) - // Standard Error: 3_123 - .saturating_add(Weight::from_parts(82_417, 0).saturating_mul(s.into())) + // Minimum execution time: 32_202_000 picoseconds. + Weight::from_parts(31_586_520, 4764) + // Standard Error: 1_513 + .saturating_add(Weight::from_parts(67_257, 0).saturating_mul(l.into())) + // Standard Error: 2_693 + .saturating_add(Weight::from_parts(69_725, 0).saturating_mul(s.into())) .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } @@ -303,12 +305,12 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `381 + l * (25 ±0) + s * (36 ±0)` // Estimated: `4764` - // Minimum execution time: 34_360_000 picoseconds. - Weight::from_parts(34_964_080, 4764) - // Standard Error: 1_996 - .saturating_add(Weight::from_parts(48_024, 0).saturating_mul(l.into())) - // Standard Error: 3_552 - .saturating_add(Weight::from_parts(34_411, 0).saturating_mul(s.into())) + // Minimum execution time: 34_847_000 picoseconds. + Weight::from_parts(34_690_456, 4764) + // Standard Error: 1_681 + .saturating_add(Weight::from_parts(51_103, 0).saturating_mul(l.into())) + // Standard Error: 2_991 + .saturating_add(Weight::from_parts(55_094, 0).saturating_mul(s.into())) .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } @@ -326,12 +328,12 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `484 + l * (25 ±0) + s * (36 ±0)` // Estimated: `4764` - // Minimum execution time: 33_859_000 picoseconds. - Weight::from_parts(32_950_681, 4764) - // Standard Error: 1_745 - .saturating_add(Weight::from_parts(69_323, 0).saturating_mul(l.into())) - // Standard Error: 3_105 - .saturating_add(Weight::from_parts(86_370, 0).saturating_mul(s.into())) + // Minimum execution time: 34_027_000 picoseconds. + Weight::from_parts(33_353_168, 4764) + // Standard Error: 1_477 + .saturating_add(Weight::from_parts(72_605, 0).saturating_mul(l.into())) + // Standard Error: 2_629 + .saturating_add(Weight::from_parts(64_115, 0).saturating_mul(s.into())) .saturating_add(RocksDbWeight::get().reads(4_u64)) .saturating_add(RocksDbWeight::get().writes(3_u64)) } @@ -349,12 +351,12 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `484 + l * (25 ±0) + s * (36 ±0)` // Estimated: `4764` - // Minimum execution time: 36_239_000 picoseconds. - Weight::from_parts(36_459_756, 4764) - // Standard Error: 2_051 - .saturating_add(Weight::from_parts(56_670, 0).saturating_mul(l.into())) - // Standard Error: 3_650 - .saturating_add(Weight::from_parts(49_663, 0).saturating_mul(s.into())) + // Minimum execution time: 36_816_000 picoseconds. + Weight::from_parts(36_467_447, 4764) + // Standard Error: 1_689 + .saturating_add(Weight::from_parts(51_855, 0).saturating_mul(l.into())) + // Standard Error: 3_006 + .saturating_add(Weight::from_parts(58_233, 0).saturating_mul(s.into())) .saturating_add(RocksDbWeight::get().reads(4_u64)) .saturating_add(RocksDbWeight::get().writes(3_u64)) } @@ -372,12 +374,12 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `555 + l * (25 ±0) + s * (36 ±0)` // Estimated: `4764` - // Minimum execution time: 70_330_000 picoseconds. - Weight::from_parts(71_196_328, 4764) - // Standard Error: 2_923 - .saturating_add(Weight::from_parts(67_238, 0).saturating_mul(l.into())) - // Standard Error: 5_201 - .saturating_add(Weight::from_parts(89_102, 0).saturating_mul(s.into())) + // Minimum execution time: 70_906_000 picoseconds. + Weight::from_parts(72_663_428, 4764) + // Standard Error: 2_877 + .saturating_add(Weight::from_parts(81_242, 0).saturating_mul(l.into())) + // Standard Error: 5_118 + .saturating_add(Weight::from_parts(103_344, 0).saturating_mul(s.into())) .saturating_add(RocksDbWeight::get().reads(4_u64)) .saturating_add(RocksDbWeight::get().writes(3_u64)) } @@ -395,12 +397,12 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `658 + l * (25 ±0) + s * (36 ±0)` // Estimated: `6196` - // Minimum execution time: 70_235_000 picoseconds. - Weight::from_parts(71_960_020, 6196) - // Standard Error: 2_493 - .saturating_add(Weight::from_parts(64_835, 0).saturating_mul(l.into())) - // Standard Error: 4_436 - .saturating_add(Weight::from_parts(102_159, 0).saturating_mul(s.into())) + // Minimum execution time: 72_730_000 picoseconds. + Weight::from_parts(75_050_411, 6196) + // Standard Error: 2_748 + .saturating_add(Weight::from_parts(73_218, 0).saturating_mul(l.into())) + // Standard Error: 4_889 + .saturating_add(Weight::from_parts(112_868, 0).saturating_mul(s.into())) .saturating_add(RocksDbWeight::get().reads(5_u64)) .saturating_add(RocksDbWeight::get().writes(4_u64)) } @@ -418,12 +420,12 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `482 + l * (25 ±0) + s * (36 ±0)` // Estimated: `4764` - // Minimum execution time: 34_352_000 picoseconds. - Weight::from_parts(33_697_027, 4764) - // Standard Error: 2_008 - .saturating_add(Weight::from_parts(79_270, 0).saturating_mul(l.into())) - // Standard Error: 3_710 - .saturating_add(Weight::from_parts(60_691, 0).saturating_mul(s.into())) + // Minimum execution time: 34_698_000 picoseconds. + Weight::from_parts(34_504_324, 4764) + // Standard Error: 1_703 + .saturating_add(Weight::from_parts(56_321, 0).saturating_mul(l.into())) + // Standard Error: 3_145 + .saturating_add(Weight::from_parts(55_503, 0).saturating_mul(s.into())) .saturating_add(RocksDbWeight::get().reads(4_u64)) .saturating_add(RocksDbWeight::get().writes(3_u64)) } @@ -441,12 +443,12 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `482 + l * (25 ±0) + s * (36 ±0)` // Estimated: `4764` - // Minimum execution time: 37_467_000 picoseconds. - Weight::from_parts(36_866_847, 4764) - // Standard Error: 1_692 - .saturating_add(Weight::from_parts(57_882, 0).saturating_mul(l.into())) - // Standard Error: 3_124 - .saturating_add(Weight::from_parts(80_266, 0).saturating_mul(s.into())) + // Minimum execution time: 36_951_000 picoseconds. + Weight::from_parts(37_020_649, 4764) + // Standard Error: 1_791 + .saturating_add(Weight::from_parts(65_437, 0).saturating_mul(l.into())) + // Standard Error: 3_308 + .saturating_add(Weight::from_parts(54_146, 0).saturating_mul(s.into())) .saturating_add(RocksDbWeight::get().reads(4_u64)) .saturating_add(RocksDbWeight::get().writes(3_u64)) } @@ -464,12 +466,12 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `555 + l * (25 ±0) + s * (36 ±0)` // Estimated: `4764` - // Minimum execution time: 41_497_000 picoseconds. - Weight::from_parts(38_763_834, 4764) - // Standard Error: 2_030 - .saturating_add(Weight::from_parts(99_580, 0).saturating_mul(l.into())) - // Standard Error: 3_750 - .saturating_add(Weight::from_parts(132_188, 0).saturating_mul(s.into())) + // Minimum execution time: 38_849_000 picoseconds. + Weight::from_parts(38_488_577, 4764) + // Standard Error: 1_911 + .saturating_add(Weight::from_parts(72_338, 0).saturating_mul(l.into())) + // Standard Error: 3_529 + .saturating_add(Weight::from_parts(62_206, 0).saturating_mul(s.into())) .saturating_add(RocksDbWeight::get().reads(4_u64)) .saturating_add(RocksDbWeight::get().writes(3_u64)) } diff --git a/substrate/frame/whitelist/Cargo.toml b/substrate/frame/whitelist/Cargo.toml index 1a867f8075d12a35f82e8fe37f2cf25230b710a3..5c28fe29142c786621eee8fc4355983e990a8981 100644 --- a/substrate/frame/whitelist/Cargo.toml +++ b/substrate/frame/whitelist/Cargo.toml @@ -16,7 +16,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive", "max-encoded-len"] } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } frame-benchmarking = { path = "../benchmarking", default-features = false, optional = true } frame-support = { path = "../support", default-features = false } frame-system = { path = "../system", default-features = false } diff --git a/substrate/frame/whitelist/src/benchmarking.rs b/substrate/frame/whitelist/src/benchmarking.rs index 9d356f09a9d2ec411c6af5ae73940741319ab590..7fb5632fc00247648be3238775735d0b2fdc2241 100644 --- a/substrate/frame/whitelist/src/benchmarking.rs +++ b/substrate/frame/whitelist/src/benchmarking.rs @@ -20,58 +20,57 @@ #![cfg(feature = "runtime-benchmarks")] use super::*; -use frame_benchmarking::v1::{benchmarks, BenchmarkError}; -use frame_support::{ensure, traits::EnsureOrigin}; +use frame_benchmarking::v2::*; +use frame_support::traits::EnsureOrigin; #[cfg(test)] use crate::Pallet as Whitelist; -benchmarks! { - whitelist_call { +#[benchmarks] +mod benchmarks { + use super::*; + + #[benchmark] + fn whitelist_call() -> Result<(), BenchmarkError> { let origin = T::WhitelistOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; let call_hash = Default::default(); - }: _(origin, call_hash) - verify { - ensure!( - WhitelistedCall::::contains_key(call_hash), - "call not whitelisted" - ); - ensure!( - T::Preimages::is_requested(&call_hash), - "preimage not requested" - ); + + #[extrinsic_call] + _(origin as T::RuntimeOrigin, call_hash); + + ensure!(WhitelistedCall::::contains_key(call_hash), "call not whitelisted"); + ensure!(T::Preimages::is_requested(&call_hash), "preimage not requested"); + Ok(()) } - remove_whitelisted_call { + #[benchmark] + fn remove_whitelisted_call() -> Result<(), BenchmarkError> { let origin = T::WhitelistOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; let call_hash = Default::default(); Pallet::::whitelist_call(origin.clone(), call_hash) .expect("whitelisting call must be successful"); - }: _(origin, call_hash) - verify { - ensure!( - !WhitelistedCall::::contains_key(call_hash), - "whitelist not removed" - ); - ensure!( - !T::Preimages::is_requested(&call_hash), - "preimage still requested" - ); + + #[extrinsic_call] + _(origin as T::RuntimeOrigin, call_hash); + + ensure!(!WhitelistedCall::::contains_key(call_hash), "whitelist not removed"); + ensure!(!T::Preimages::is_requested(&call_hash), "preimage still requested"); + Ok(()) } // We benchmark with the maximum possible size for a call. // If the resulting weight is too big, maybe it worth having a weight which depends // on the size of the call, with a new witness in parameter. - #[pov_mode = MaxEncodedLen { + #[benchmark(pov_mode = MaxEncodedLen { // Use measured PoV size for the Preimages since we pass in a length witness. Preimage::PreimageFor: Measured - }] - dispatch_whitelisted_call { - // NOTE: we remove `10` because we need some bytes to encode the variants and vec length - let n in 1 .. T::Preimages::MAX_LENGTH as u32 - 10; - + })] + // NOTE: we remove `10` because we need some bytes to encode the variants and vec length + fn dispatch_whitelisted_call( + n: Linear<1, { T::Preimages::MAX_LENGTH as u32 - 10 }>, + ) -> Result<(), BenchmarkError> { let origin = T::DispatchWhitelistedOrigin::try_successful_origin() .map_err(|_| BenchmarkError::Weightless)?; let remark = sp_std::vec![1u8; n as usize]; @@ -86,21 +85,16 @@ benchmarks! { T::Preimages::note(encoded_call.into()).unwrap(); - }: _(origin, call_hash, call_encoded_len, call_weight) - verify { - ensure!( - !WhitelistedCall::::contains_key(call_hash), - "whitelist not removed" - ); - ensure!( - !T::Preimages::is_requested(&call_hash), - "preimage still requested" - ); - } + #[extrinsic_call] + _(origin as T::RuntimeOrigin, call_hash, call_encoded_len, call_weight); - dispatch_whitelisted_call_with_preimage { - let n in 1 .. 10_000; + ensure!(!WhitelistedCall::::contains_key(call_hash), "whitelist not removed"); + ensure!(!T::Preimages::is_requested(&call_hash), "preimage still requested"); + Ok(()) + } + #[benchmark] + fn dispatch_whitelisted_call_with_preimage(n: Linear<1, 10_000>) -> Result<(), BenchmarkError> { let origin = T::DispatchWhitelistedOrigin::try_successful_origin() .map_err(|_| BenchmarkError::Weightless)?; let remark = sp_std::vec![1u8; n as usize]; @@ -110,16 +104,13 @@ benchmarks! { Pallet::::whitelist_call(origin.clone(), call_hash) .expect("whitelisting call must be successful"); - }: _(origin, Box::new(call)) - verify { - ensure!( - !WhitelistedCall::::contains_key(call_hash), - "whitelist not removed" - ); - ensure!( - !T::Preimages::is_requested(&call_hash), - "preimage still requested" - ); + + #[extrinsic_call] + _(origin as T::RuntimeOrigin, Box::new(call)); + + ensure!(!WhitelistedCall::::contains_key(call_hash), "whitelist not removed"); + ensure!(!T::Preimages::is_requested(&call_hash), "preimage still requested"); + Ok(()) } impl_benchmark_test_suite!(Whitelist, crate::mock::new_test_ext(), crate::mock::Test); diff --git a/substrate/frame/whitelist/src/mock.rs b/substrate/frame/whitelist/src/mock.rs index c0c38075f298909e7f918de1d74514ee0f86e16d..6fb8711057ef0cd53cc388e07cf90347c0e13000 100644 --- a/substrate/frame/whitelist/src/mock.rs +++ b/substrate/frame/whitelist/src/mock.rs @@ -21,16 +21,9 @@ use crate as pallet_whitelist; -use frame_support::{ - construct_runtime, derive_impl, - traits::{ConstU32, ConstU64, Nothing}, -}; +use frame_support::{construct_runtime, derive_impl, traits::ConstU64}; use frame_system::EnsureRoot; -use sp_core::H256; -use sp_runtime::{ - traits::{BlakeTwo256, IdentityLookup}, - BuildStorage, -}; +use sp_runtime::BuildStorage; type Block = frame_system::mocking::MockBlock; @@ -44,31 +37,10 @@ construct_runtime!( } ); -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { - type BaseCallFilter = Nothing; - type BlockWeights = (); - type BlockLength = (); - type DbWeight = (); - type RuntimeOrigin = RuntimeOrigin; - type Nonce = u64; - type Hash = H256; - type RuntimeCall = RuntimeCall; - type Hashing = BlakeTwo256; - type AccountId = u64; - type Lookup = IdentityLookup; type Block = Block; - type RuntimeEvent = RuntimeEvent; - type BlockHashCount = ConstU64<250>; - type Version = (); - type PalletInfo = PalletInfo; type AccountData = pallet_balances::AccountData; - type OnNewAccount = (); - type OnKilledAccount = (); - type SystemWeightInfo = (); - type SS58Prefix = (); - type OnSetCode = (); - type MaxConsumers = ConstU32<16>; } impl pallet_balances::Config for Test { diff --git a/substrate/frame/whitelist/src/weights.rs b/substrate/frame/whitelist/src/weights.rs index de42c5a5841cf8c2d3aea1227dafd35ec461b234..2e28d4fcf7e531cadd2d6d69f51027bff85b6b77 100644 --- a/substrate/frame/whitelist/src/weights.rs +++ b/substrate/frame/whitelist/src/weights.rs @@ -15,16 +15,16 @@ // See the License for the specific language governing permissions and // limitations under the License. -//! Autogenerated weights for pallet_whitelist +//! Autogenerated weights for `pallet_whitelist` //! -//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-06-16, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0 +//! DATE: 2024-04-09, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-e8ezs4ez-project-145-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("dev"), DB CACHE: 1024 +//! HOSTNAME: `runner-anb7yjbi-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: `1024` // Executed Command: -// ./target/production/substrate +// ./target/production/substrate-node // benchmark // pallet // --chain=dev @@ -35,12 +35,11 @@ // --no-median-slopes // --no-min-squares // --extrinsic=* -// --execution=wasm // --wasm-execution=compiled // --heap-pages=4096 -// --output=./frame/whitelist/src/weights.rs -// --header=./HEADER-APACHE2 -// --template=./.maintain/frame-weight-template.hbs +// --output=./substrate/frame/whitelist/src/weights.rs +// --header=./substrate/HEADER-APACHE2 +// --template=./substrate/.maintain/frame-weight-template.hbs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -50,7 +49,7 @@ use frame_support::{traits::Get, weights::{Weight, constants::RocksDbWeight}}; use core::marker::PhantomData; -/// Weight functions needed for pallet_whitelist. +/// Weight functions needed for `pallet_whitelist`. pub trait WeightInfo { fn whitelist_call() -> Weight; fn remove_whitelisted_call() -> Weight; @@ -58,133 +57,149 @@ pub trait WeightInfo { fn dispatch_whitelisted_call_with_preimage(n: u32, ) -> Weight; } -/// Weights for pallet_whitelist using the Substrate node and recommended hardware. +/// Weights for `pallet_whitelist` using the Substrate node and recommended hardware. pub struct SubstrateWeight(PhantomData); impl WeightInfo for SubstrateWeight { - /// Storage: Whitelist WhitelistedCall (r:1 w:1) - /// Proof: Whitelist WhitelistedCall (max_values: None, max_size: Some(40), added: 2515, mode: MaxEncodedLen) - /// Storage: Preimage StatusFor (r:1 w:1) - /// Proof: Preimage StatusFor (max_values: None, max_size: Some(91), added: 2566, mode: MaxEncodedLen) + /// Storage: `Whitelist::WhitelistedCall` (r:1 w:1) + /// Proof: `Whitelist::WhitelistedCall` (`max_values`: None, `max_size`: Some(40), added: 2515, mode: `MaxEncodedLen`) + /// Storage: `Preimage::StatusFor` (r:1 w:0) + /// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) + /// Storage: `Preimage::RequestStatusFor` (r:1 w:1) + /// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) fn whitelist_call() -> Weight { // Proof Size summary in bytes: - // Measured: `217` + // Measured: `317` // Estimated: `3556` - // Minimum execution time: 19_914_000 picoseconds. - Weight::from_parts(20_892_000, 3556) - .saturating_add(T::DbWeight::get().reads(2_u64)) + // Minimum execution time: 19_521_000 picoseconds. + Weight::from_parts(20_136_000, 3556) + .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } - /// Storage: Whitelist WhitelistedCall (r:1 w:1) - /// Proof: Whitelist WhitelistedCall (max_values: None, max_size: Some(40), added: 2515, mode: MaxEncodedLen) - /// Storage: Preimage StatusFor (r:1 w:1) - /// Proof: Preimage StatusFor (max_values: None, max_size: Some(91), added: 2566, mode: MaxEncodedLen) + /// Storage: `Whitelist::WhitelistedCall` (r:1 w:1) + /// Proof: `Whitelist::WhitelistedCall` (`max_values`: None, `max_size`: Some(40), added: 2515, mode: `MaxEncodedLen`) + /// Storage: `Preimage::StatusFor` (r:1 w:0) + /// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) + /// Storage: `Preimage::RequestStatusFor` (r:1 w:1) + /// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) fn remove_whitelisted_call() -> Weight { // Proof Size summary in bytes: - // Measured: `346` + // Measured: `446` // Estimated: `3556` - // Minimum execution time: 18_142_000 picoseconds. - Weight::from_parts(18_529_000, 3556) - .saturating_add(T::DbWeight::get().reads(2_u64)) + // Minimum execution time: 18_530_000 picoseconds. + Weight::from_parts(19_004_000, 3556) + .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } - /// Storage: Whitelist WhitelistedCall (r:1 w:1) - /// Proof: Whitelist WhitelistedCall (max_values: None, max_size: Some(40), added: 2515, mode: MaxEncodedLen) - /// Storage: Preimage PreimageFor (r:1 w:1) - /// Proof: Preimage PreimageFor (max_values: None, max_size: Some(4194344), added: 4196819, mode: Measured) - /// Storage: Preimage StatusFor (r:1 w:1) - /// Proof: Preimage StatusFor (max_values: None, max_size: Some(91), added: 2566, mode: MaxEncodedLen) + /// Storage: `Whitelist::WhitelistedCall` (r:1 w:1) + /// Proof: `Whitelist::WhitelistedCall` (`max_values`: None, `max_size`: Some(40), added: 2515, mode: `MaxEncodedLen`) + /// Storage: `Preimage::PreimageFor` (r:1 w:1) + /// Proof: `Preimage::PreimageFor` (`max_values`: None, `max_size`: Some(4194344), added: 4196819, mode: `Measured`) + /// Storage: `Preimage::StatusFor` (r:1 w:0) + /// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) + /// Storage: `Preimage::RequestStatusFor` (r:1 w:1) + /// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) /// The range of component `n` is `[1, 4194294]`. fn dispatch_whitelisted_call(n: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `422 + n * (1 ±0)` - // Estimated: `3886 + n * (1 ±0)` - // Minimum execution time: 30_671_000 picoseconds. - Weight::from_parts(31_197_000, 3886) + // Measured: `522 + n * (1 ±0)` + // Estimated: `3986 + n * (1 ±0)` + // Minimum execution time: 29_721_000 picoseconds. + Weight::from_parts(30_140_000, 3986) // Standard Error: 0 - .saturating_add(Weight::from_parts(1_163, 0).saturating_mul(n.into())) - .saturating_add(T::DbWeight::get().reads(3_u64)) + .saturating_add(Weight::from_parts(1_179, 0).saturating_mul(n.into())) + .saturating_add(T::DbWeight::get().reads(4_u64)) .saturating_add(T::DbWeight::get().writes(3_u64)) .saturating_add(Weight::from_parts(0, 1).saturating_mul(n.into())) } - /// Storage: Whitelist WhitelistedCall (r:1 w:1) - /// Proof: Whitelist WhitelistedCall (max_values: None, max_size: Some(40), added: 2515, mode: MaxEncodedLen) - /// Storage: Preimage StatusFor (r:1 w:1) - /// Proof: Preimage StatusFor (max_values: None, max_size: Some(91), added: 2566, mode: MaxEncodedLen) + /// Storage: `Whitelist::WhitelistedCall` (r:1 w:1) + /// Proof: `Whitelist::WhitelistedCall` (`max_values`: None, `max_size`: Some(40), added: 2515, mode: `MaxEncodedLen`) + /// Storage: `Preimage::StatusFor` (r:1 w:0) + /// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) + /// Storage: `Preimage::RequestStatusFor` (r:1 w:1) + /// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) /// The range of component `n` is `[1, 10000]`. fn dispatch_whitelisted_call_with_preimage(n: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `346` + // Measured: `446` // Estimated: `3556` - // Minimum execution time: 22_099_000 picoseconds. - Weight::from_parts(23_145_477, 3556) - // Standard Error: 5 - .saturating_add(Weight::from_parts(1_422, 0).saturating_mul(n.into())) - .saturating_add(T::DbWeight::get().reads(2_u64)) + // Minimum execution time: 22_608_000 picoseconds. + Weight::from_parts(23_682_511, 3556) + // Standard Error: 6 + .saturating_add(Weight::from_parts(1_420, 0).saturating_mul(n.into())) + .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } } -// For backwards compatibility and tests +// For backwards compatibility and tests. impl WeightInfo for () { - /// Storage: Whitelist WhitelistedCall (r:1 w:1) - /// Proof: Whitelist WhitelistedCall (max_values: None, max_size: Some(40), added: 2515, mode: MaxEncodedLen) - /// Storage: Preimage StatusFor (r:1 w:1) - /// Proof: Preimage StatusFor (max_values: None, max_size: Some(91), added: 2566, mode: MaxEncodedLen) + /// Storage: `Whitelist::WhitelistedCall` (r:1 w:1) + /// Proof: `Whitelist::WhitelistedCall` (`max_values`: None, `max_size`: Some(40), added: 2515, mode: `MaxEncodedLen`) + /// Storage: `Preimage::StatusFor` (r:1 w:0) + /// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) + /// Storage: `Preimage::RequestStatusFor` (r:1 w:1) + /// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) fn whitelist_call() -> Weight { // Proof Size summary in bytes: - // Measured: `217` + // Measured: `317` // Estimated: `3556` - // Minimum execution time: 19_914_000 picoseconds. - Weight::from_parts(20_892_000, 3556) - .saturating_add(RocksDbWeight::get().reads(2_u64)) + // Minimum execution time: 19_521_000 picoseconds. + Weight::from_parts(20_136_000, 3556) + .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } - /// Storage: Whitelist WhitelistedCall (r:1 w:1) - /// Proof: Whitelist WhitelistedCall (max_values: None, max_size: Some(40), added: 2515, mode: MaxEncodedLen) - /// Storage: Preimage StatusFor (r:1 w:1) - /// Proof: Preimage StatusFor (max_values: None, max_size: Some(91), added: 2566, mode: MaxEncodedLen) + /// Storage: `Whitelist::WhitelistedCall` (r:1 w:1) + /// Proof: `Whitelist::WhitelistedCall` (`max_values`: None, `max_size`: Some(40), added: 2515, mode: `MaxEncodedLen`) + /// Storage: `Preimage::StatusFor` (r:1 w:0) + /// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) + /// Storage: `Preimage::RequestStatusFor` (r:1 w:1) + /// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) fn remove_whitelisted_call() -> Weight { // Proof Size summary in bytes: - // Measured: `346` + // Measured: `446` // Estimated: `3556` - // Minimum execution time: 18_142_000 picoseconds. - Weight::from_parts(18_529_000, 3556) - .saturating_add(RocksDbWeight::get().reads(2_u64)) + // Minimum execution time: 18_530_000 picoseconds. + Weight::from_parts(19_004_000, 3556) + .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } - /// Storage: Whitelist WhitelistedCall (r:1 w:1) - /// Proof: Whitelist WhitelistedCall (max_values: None, max_size: Some(40), added: 2515, mode: MaxEncodedLen) - /// Storage: Preimage PreimageFor (r:1 w:1) - /// Proof: Preimage PreimageFor (max_values: None, max_size: Some(4194344), added: 4196819, mode: Measured) - /// Storage: Preimage StatusFor (r:1 w:1) - /// Proof: Preimage StatusFor (max_values: None, max_size: Some(91), added: 2566, mode: MaxEncodedLen) + /// Storage: `Whitelist::WhitelistedCall` (r:1 w:1) + /// Proof: `Whitelist::WhitelistedCall` (`max_values`: None, `max_size`: Some(40), added: 2515, mode: `MaxEncodedLen`) + /// Storage: `Preimage::PreimageFor` (r:1 w:1) + /// Proof: `Preimage::PreimageFor` (`max_values`: None, `max_size`: Some(4194344), added: 4196819, mode: `Measured`) + /// Storage: `Preimage::StatusFor` (r:1 w:0) + /// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) + /// Storage: `Preimage::RequestStatusFor` (r:1 w:1) + /// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) /// The range of component `n` is `[1, 4194294]`. fn dispatch_whitelisted_call(n: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `422 + n * (1 ±0)` - // Estimated: `3886 + n * (1 ±0)` - // Minimum execution time: 30_671_000 picoseconds. - Weight::from_parts(31_197_000, 3886) + // Measured: `522 + n * (1 ±0)` + // Estimated: `3986 + n * (1 ±0)` + // Minimum execution time: 29_721_000 picoseconds. + Weight::from_parts(30_140_000, 3986) // Standard Error: 0 - .saturating_add(Weight::from_parts(1_163, 0).saturating_mul(n.into())) - .saturating_add(RocksDbWeight::get().reads(3_u64)) + .saturating_add(Weight::from_parts(1_179, 0).saturating_mul(n.into())) + .saturating_add(RocksDbWeight::get().reads(4_u64)) .saturating_add(RocksDbWeight::get().writes(3_u64)) .saturating_add(Weight::from_parts(0, 1).saturating_mul(n.into())) } - /// Storage: Whitelist WhitelistedCall (r:1 w:1) - /// Proof: Whitelist WhitelistedCall (max_values: None, max_size: Some(40), added: 2515, mode: MaxEncodedLen) - /// Storage: Preimage StatusFor (r:1 w:1) - /// Proof: Preimage StatusFor (max_values: None, max_size: Some(91), added: 2566, mode: MaxEncodedLen) + /// Storage: `Whitelist::WhitelistedCall` (r:1 w:1) + /// Proof: `Whitelist::WhitelistedCall` (`max_values`: None, `max_size`: Some(40), added: 2515, mode: `MaxEncodedLen`) + /// Storage: `Preimage::StatusFor` (r:1 w:0) + /// Proof: `Preimage::StatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) + /// Storage: `Preimage::RequestStatusFor` (r:1 w:1) + /// Proof: `Preimage::RequestStatusFor` (`max_values`: None, `max_size`: Some(91), added: 2566, mode: `MaxEncodedLen`) /// The range of component `n` is `[1, 10000]`. fn dispatch_whitelisted_call_with_preimage(n: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `346` + // Measured: `446` // Estimated: `3556` - // Minimum execution time: 22_099_000 picoseconds. - Weight::from_parts(23_145_477, 3556) - // Standard Error: 5 - .saturating_add(Weight::from_parts(1_422, 0).saturating_mul(n.into())) - .saturating_add(RocksDbWeight::get().reads(2_u64)) + // Minimum execution time: 22_608_000 picoseconds. + Weight::from_parts(23_682_511, 3556) + // Standard Error: 6 + .saturating_add(Weight::from_parts(1_420, 0).saturating_mul(n.into())) + .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } } diff --git a/substrate/primitives/api/Cargo.toml b/substrate/primitives/api/Cargo.toml index cd882c7a050fee1a32cba0183adec7b1a4d323a7..544ba72141ebd22291c04a54f34adbd873b335aa 100644 --- a/substrate/primitives/api/Cargo.toml +++ b/substrate/primitives/api/Cargo.toml @@ -27,12 +27,12 @@ sp-version = { path = "../version", default-features = false } sp-state-machine = { path = "../state-machine", default-features = false, optional = true } sp-trie = { path = "../trie", default-features = false, optional = true } hash-db = { version = "0.16.0", optional = true } -thiserror = { version = "1.0.48", optional = true } -scale-info = { version = "2.10.0", default-features = false, features = [ +thiserror = { optional = true, workspace = true } +scale-info = { version = "2.11.1", default-features = false, features = [ "derive", ] } sp-metadata-ir = { path = "../metadata-ir", default-features = false, optional = true } -log = { version = "0.4.17", default-features = false } +log = { workspace = true } [dev-dependencies] sp-test-primitives = { path = "../test-primitives" } diff --git a/substrate/primitives/api/proc-macro/Cargo.toml b/substrate/primitives/api/proc-macro/Cargo.toml index 166ce55e5151c48267b799e18a403a7d0b5337b6..f5406758687ae20e9ce13a2cf02959c5cccbd576 100644 --- a/substrate/primitives/api/proc-macro/Cargo.toml +++ b/substrate/primitives/api/proc-macro/Cargo.toml @@ -19,8 +19,8 @@ targets = ["x86_64-unknown-linux-gnu"] proc-macro = true [dependencies] -quote = "1.0.28" -syn = { version = "2.0.48", features = ["extra-traits", "fold", "full", "visit"] } +quote = { workspace = true } +syn = { features = ["extra-traits", "fold", "full", "visit"], workspace = true } proc-macro2 = "1.0.56" blake2 = { version = "0.10.4", default-features = false } proc-macro-crate = "3.0.0" diff --git a/substrate/primitives/api/proc-macro/src/decl_runtime_apis.rs b/substrate/primitives/api/proc-macro/src/decl_runtime_apis.rs index 2b1e65ec88524a0236a464005fb2d1215c1157fe..e34e4c0e7672164afb41702ab3bae87082df9062 100644 --- a/substrate/primitives/api/proc-macro/src/decl_runtime_apis.rs +++ b/substrate/primitives/api/proc-macro/src/decl_runtime_apis.rs @@ -456,6 +456,7 @@ impl<'a> ToClientSideDecl<'a> { |err| #crate_::ApiError::FailedToDecodeReturnValue { function: #function_name, error: err, + raw: r.clone(), } ) ) diff --git a/substrate/primitives/api/proc-macro/src/impl_runtime_apis.rs b/substrate/primitives/api/proc-macro/src/impl_runtime_apis.rs index 79378968437d992c41879e0b9fffc1c447150ba0..87a381fd7bf92bc72e30babf018b5dcb0141e571 100644 --- a/substrate/primitives/api/proc-macro/src/impl_runtime_apis.rs +++ b/substrate/primitives/api/proc-macro/src/impl_runtime_apis.rs @@ -243,7 +243,7 @@ fn generate_wasm_interface(impls: &[ItemImpl]) -> Result { &[0u8; 0] } else { unsafe { - #c::slice::from_raw_parts(input_data, input_len) + ::core::slice::from_raw_parts(input_data, input_len) } }; @@ -345,7 +345,7 @@ fn generate_runtime_api_base_structures() -> Result { &self, backend: &B, parent_hash: Block::Hash, - ) -> core::result::Result< + ) -> ::core::result::Result< #crate_::StorageChanges, String > where Self: Sized { @@ -797,7 +797,7 @@ fn generate_runtime_api_versions(impls: &[ItemImpl]) -> Result { } Ok(quote!( - const RUNTIME_API_VERSIONS: #c::ApisVec = #c::create_apis_vec!([ #( #result ),* ]); + pub const RUNTIME_API_VERSIONS: #c::ApisVec = #c::create_apis_vec!([ #( #result ),* ]); #( #sections )* )) diff --git a/substrate/primitives/api/proc-macro/src/mock_impl_runtime_apis.rs b/substrate/primitives/api/proc-macro/src/mock_impl_runtime_apis.rs index c1339ff6621b389e32c2f9ca2a7f19079c2d269e..1761e0ac9dbf450c15adae2659119c918f300334 100644 --- a/substrate/primitives/api/proc-macro/src/mock_impl_runtime_apis.rs +++ b/substrate/primitives/api/proc-macro/src/mock_impl_runtime_apis.rs @@ -158,7 +158,7 @@ fn implement_common_api_traits(block_type: TypePath, self_ty: Type) -> Result::Hash, _: &<#block_type as #crate_::BlockT>::Header, - ) -> std::result::Result<(), #crate_::ApiError> { + ) -> std::result::Result<#crate_::__private::ExtrinsicInclusionMode, #crate_::ApiError> { unimplemented!("`Core::initialize_block` not implemented for runtime api mocks") } } diff --git a/substrate/primitives/api/proc-macro/src/utils.rs b/substrate/primitives/api/proc-macro/src/utils.rs index c8c1f12d90a1645e1bd3c7df6f91a873c5d9288f..a6570a98f1f78361398bd5a5a2c101af0a133988 100644 --- a/substrate/primitives/api/proc-macro/src/utils.rs +++ b/substrate/primitives/api/proc-macro/src/utils.rs @@ -34,7 +34,9 @@ pub fn generate_crate_access() -> TokenStream { quote!(#renamed_name::__private) }, Err(e) => - if let Ok(FoundCrate::Name(name)) = crate_name(&"frame") { + if let Ok(FoundCrate::Name(name)) = + crate_name(&"polkadot-sdk-frame").or_else(|_| crate_name(&"frame")) + { let path = format!("{}::deps::sp_api::__private", name); let path = syn::parse_str::(&path).expect("is a valid path; qed"); quote!( #path ) diff --git a/substrate/primitives/api/src/lib.rs b/substrate/primitives/api/src/lib.rs index 190de1ab3fdee0611f27071b9c769a164c3aca9d..a945b9f21f3cff60d6a9d5e24aa07704a1dc8d31 100644 --- a/substrate/primitives/api/src/lib.rs +++ b/substrate/primitives/api/src/lib.rs @@ -101,7 +101,7 @@ pub mod __private { generic::BlockId, traits::{Block as BlockT, Hash as HashT, HashingFor, Header as HeaderT, NumberFor}, transaction_validity::TransactionValidity, - RuntimeString, TransactionOutcome, + ExtrinsicInclusionMode, RuntimeString, TransactionOutcome, }; pub use sp_std::{mem, slice, vec}; pub use sp_version::{create_apis_vec, ApiId, ApisVec, RuntimeVersion}; @@ -115,11 +115,11 @@ pub use sp_core::traits::CallContext; use sp_core::OpaqueMetadata; #[cfg(feature = "std")] use sp_externalities::{Extension, Extensions}; -use sp_runtime::traits::Block as BlockT; #[cfg(feature = "std")] use sp_runtime::traits::HashingFor; #[cfg(feature = "std")] pub use sp_runtime::TransactionOutcome; +use sp_runtime::{traits::Block as BlockT, ExtrinsicInclusionMode}; #[cfg(feature = "std")] pub use sp_state_machine::StorageProof; #[cfg(feature = "std")] @@ -280,7 +280,7 @@ pub use sp_api_proc_macro::decl_runtime_apis; /// ```rust /// use sp_version::create_runtime_str; /// # -/// # use sp_runtime::traits::Block as BlockT; +/// # use sp_runtime::{ExtrinsicInclusionMode, traits::Block as BlockT}; /// # use sp_test_primitives::Block; /// # /// # /// The declaration of the `Runtime` type is done by the `construct_runtime!` macro @@ -307,7 +307,9 @@ pub use sp_api_proc_macro::decl_runtime_apis; /// # unimplemented!() /// # } /// # fn execute_block(_block: Block) {} -/// # fn initialize_block(_header: &::Header) {} +/// # fn initialize_block(_header: &::Header) -> ExtrinsicInclusionMode { +/// # unimplemented!() +/// # } /// # } /// /// impl self::Balance for Runtime { @@ -540,11 +542,12 @@ pub fn init_runtime_logger() { #[cfg(feature = "std")] #[derive(Debug, thiserror::Error)] pub enum ApiError { - #[error("Failed to decode return value of {function}")] + #[error("Failed to decode return value of {function}: {error} raw data: {raw:?}")] FailedToDecodeReturnValue { function: &'static str, #[source] error: codec::Error, + raw: Vec, }, #[error("Failed to convert return value from runtime to node of {function}")] FailedToConvertReturnValue { @@ -800,15 +803,18 @@ pub fn deserialize_runtime_api_info(bytes: [u8; RUNTIME_API_INFO_SIZE]) -> ([u8; decl_runtime_apis! { /// The `Core` runtime api that every Substrate runtime needs to implement. #[core_trait] - #[api_version(4)] + #[api_version(5)] pub trait Core { /// Returns the version of the runtime. fn version() -> RuntimeVersion; /// Execute the given block. fn execute_block(block: Block); /// Initialize a block with the given header. + #[changed_in(5)] #[renamed("initialise_block", 2)] fn initialize_block(header: &::Header); + /// Initialize a block with the given header and return the runtime executive mode. + fn initialize_block(header: &::Header) -> ExtrinsicInclusionMode; } /// The `Metadata` api trait that returns metadata for the runtime. diff --git a/substrate/primitives/api/test/Cargo.toml b/substrate/primitives/api/test/Cargo.toml index b0975082c44ecde816cfc332c940dfbd1783b04b..52a4bd7bda30b30978e15fa1277621fcdff14f59 100644 --- a/substrate/primitives/api/test/Cargo.toml +++ b/substrate/primitives/api/test/Cargo.toml @@ -26,12 +26,12 @@ codec = { package = "parity-scale-codec", version = "3.6.1" } sp-state-machine = { path = "../../state-machine" } trybuild = "1.0.88" rustversion = "1.0.6" -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } [dev-dependencies] criterion = "0.4.0" -futures = "0.3.21" -log = "0.4.17" +futures = "0.3.30" +log = { workspace = true, default-features = true } sp-core = { path = "../../core" } static_assertions = "1.1.0" diff --git a/substrate/primitives/api/test/tests/decl_and_impl.rs b/substrate/primitives/api/test/tests/decl_and_impl.rs index d68470551d20061aa09d277a9999db81654ff47d..211a08561fd4bcf601d9508d96447fc07f82657f 100644 --- a/substrate/primitives/api/test/tests/decl_and_impl.rs +++ b/substrate/primitives/api/test/tests/decl_and_impl.rs @@ -139,7 +139,7 @@ impl_runtime_apis! { fn execute_block(_: Block) { unimplemented!() } - fn initialize_block(_: &::Header) { + fn initialize_block(_: &::Header) -> sp_runtime::ExtrinsicInclusionMode { unimplemented!() } } diff --git a/substrate/primitives/api/test/tests/ui/impl_incorrect_method_signature.rs b/substrate/primitives/api/test/tests/ui/impl_incorrect_method_signature.rs index 43718e4cd04a3f25fcc805edec3c14283f1f5f56..262a874213a5662c0c87a79989b620c661e707c7 100644 --- a/substrate/primitives/api/test/tests/ui/impl_incorrect_method_signature.rs +++ b/substrate/primitives/api/test/tests/ui/impl_incorrect_method_signature.rs @@ -40,7 +40,7 @@ sp_api::impl_runtime_apis! { fn execute_block(_: Block) { unimplemented!() } - fn initialize_block(_: &::Header) { + fn initialize_block(_: &::Header) -> sp_runtime::ExtrinsicInclusionMode { unimplemented!() } } diff --git a/substrate/primitives/api/test/tests/ui/impl_missing_version.rs b/substrate/primitives/api/test/tests/ui/impl_missing_version.rs index 560257b5168c921ce112a56fcbd7e9c303363c77..58850ab343fbb7bcc2c04b01c7aec9cb881023d0 100644 --- a/substrate/primitives/api/test/tests/ui/impl_missing_version.rs +++ b/substrate/primitives/api/test/tests/ui/impl_missing_version.rs @@ -45,7 +45,7 @@ sp_api::impl_runtime_apis! { fn execute_block(_: Block) { unimplemented!() } - fn initialize_block(_: &::Header) { + fn initialize_block(_: &::Header) -> sp_runtime::ExtrinsicInclusionMode { unimplemented!() } } diff --git a/substrate/primitives/api/test/tests/ui/missing_versioned_method.rs b/substrate/primitives/api/test/tests/ui/missing_versioned_method.rs index 6ead545f85a11e8f0382331e77145acb4a053d5e..70f75d065154afcb807e1712c95fc24eca5267b1 100644 --- a/substrate/primitives/api/test/tests/ui/missing_versioned_method.rs +++ b/substrate/primitives/api/test/tests/ui/missing_versioned_method.rs @@ -44,7 +44,7 @@ sp_api::impl_runtime_apis! { fn execute_block(_: Block) { unimplemented!() } - fn initialize_block(_: &::Header) { + fn initialize_block(_: &::Header) -> sp_runtime::ExtrinsicInclusionMode { unimplemented!() } } diff --git a/substrate/primitives/api/test/tests/ui/missing_versioned_method_multiple_vers.rs b/substrate/primitives/api/test/tests/ui/missing_versioned_method_multiple_vers.rs index 8eebc1d79babcbd6fb95876a530a920397c035a6..63032000040b7d19f8e31fc4ac3221369aef9e7e 100644 --- a/substrate/primitives/api/test/tests/ui/missing_versioned_method_multiple_vers.rs +++ b/substrate/primitives/api/test/tests/ui/missing_versioned_method_multiple_vers.rs @@ -47,7 +47,7 @@ sp_api::impl_runtime_apis! { fn execute_block(_: Block) { unimplemented!() } - fn initialize_block(_: &::Header) { + fn initialize_block(_: &::Header) -> sp_runtime::ExtrinsicInclusionMode { unimplemented!() } } diff --git a/substrate/primitives/api/test/tests/ui/positive_cases/custom_where_bound.rs b/substrate/primitives/api/test/tests/ui/positive_cases/custom_where_bound.rs index 594556d57be50dbd151de486dc22a63a733b933b..0858813bc99941be005e0c0141b2defc3a96a3d3 100644 --- a/substrate/primitives/api/test/tests/ui/positive_cases/custom_where_bound.rs +++ b/substrate/primitives/api/test/tests/ui/positive_cases/custom_where_bound.rs @@ -51,7 +51,7 @@ sp_api::impl_runtime_apis! { fn execute_block(_: Block) { unimplemented!() } - fn initialize_block(_: &::Header) { + fn initialize_block(_: &::Header) -> sp_runtime::ExtrinsicInclusionMode { unimplemented!() } } diff --git a/substrate/primitives/api/test/tests/ui/positive_cases/default_impls.rs b/substrate/primitives/api/test/tests/ui/positive_cases/default_impls.rs index ae573238ffe144d26b7e5dd4528e8a9e5ab88a9e..3e0cb79156c8bf5c218e29e3024d181a69fc4da6 100644 --- a/substrate/primitives/api/test/tests/ui/positive_cases/default_impls.rs +++ b/substrate/primitives/api/test/tests/ui/positive_cases/default_impls.rs @@ -46,7 +46,7 @@ sp_api::impl_runtime_apis! { fn execute_block(_: Block) { unimplemented!() } - fn initialize_block(_: &::Header) { + fn initialize_block(_: &::Header) -> sp_runtime::ExtrinsicInclusionMode { unimplemented!() } } diff --git a/substrate/primitives/api/test/tests/ui/type_reference_in_impl_runtime_apis_call.rs b/substrate/primitives/api/test/tests/ui/type_reference_in_impl_runtime_apis_call.rs index 921bf0d04351dac4ddcdd18030619f1ebcf15008..b2caea7ab7e44d910628d0ac834017e66e7e5d2e 100644 --- a/substrate/primitives/api/test/tests/ui/type_reference_in_impl_runtime_apis_call.rs +++ b/substrate/primitives/api/test/tests/ui/type_reference_in_impl_runtime_apis_call.rs @@ -42,7 +42,7 @@ sp_api::impl_runtime_apis! { fn execute_block(_: Block) { unimplemented!() } - fn initialize_block(_: &::Header) { + fn initialize_block(_: &::Header) -> sp_runtime::ExtrinsicInclusionMode { unimplemented!() } } diff --git a/substrate/primitives/application-crypto/Cargo.toml b/substrate/primitives/application-crypto/Cargo.toml index 2b38b59b4dad5b9d2b0633b772fe7aa80cc97cdf..20e2be4d1552f4874dad7e0902ccd9c00a660976 100644 --- a/substrate/primitives/application-crypto/Cargo.toml +++ b/substrate/primitives/application-crypto/Cargo.toml @@ -20,8 +20,8 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] sp-core = { path = "../core", default-features = false } codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.195", default-features = false, optional = true, features = ["alloc", "derive"] } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +serde = { optional = true, features = ["alloc", "derive"], workspace = true } sp-std = { path = "../std", default-features = false } sp-io = { path = "../io", default-features = false } diff --git a/substrate/primitives/application-crypto/check-features-variants.sh b/substrate/primitives/application-crypto/check-features-variants.sh new file mode 100755 index 0000000000000000000000000000000000000000..dd45a212bae097beb40171295e254a601674ff00 --- /dev/null +++ b/substrate/primitives/application-crypto/check-features-variants.sh @@ -0,0 +1,12 @@ +#!/usr/bin/env -S bash -eux + +export RUSTFLAGS="-Cdebug-assertions=y -Dwarnings" +T=wasm32-unknown-unknown +cargo check --release +cargo check --release --target=$T --no-default-features +cargo check --release --target=$T --no-default-features --features="full_crypto" +cargo check --release --target=$T --no-default-features --features="serde" +cargo check --release --target=$T --no-default-features --features="serde,full_crypto" +cargo check --release --target=$T --no-default-features --features="bandersnatch-experimental" +cargo check --release --target=$T --no-default-features --features="bls-experimental" +cargo check --release --target=$T --no-default-features --features="bls-experimental,full_crypto" diff --git a/substrate/primitives/application-crypto/src/bls377.rs b/substrate/primitives/application-crypto/src/bls377.rs index ee17060564fa8bec54888c1123b7c86af13863d3..3bd01de139c9496d35b143ddeb07de1285154946 100644 --- a/substrate/primitives/application-crypto/src/bls377.rs +++ b/substrate/primitives/application-crypto/src/bls377.rs @@ -19,14 +19,13 @@ use crate::{KeyTypeId, RuntimePublic}; pub use sp_core::bls::bls377::*; +use sp_std::vec::Vec; mod app { crate::app_crypto!(super, sp_core::testing::BLS377); } -#[cfg(feature = "full_crypto")] -pub use app::Pair as AppPair; -pub use app::{Public as AppPublic, Signature as AppSignature}; +pub use app::{Pair as AppPair, Public as AppPublic, Signature as AppSignature}; impl RuntimePublic for Public { type Signature = Signature; diff --git a/substrate/primitives/application-crypto/src/ecdsa.rs b/substrate/primitives/application-crypto/src/ecdsa.rs index 27ffe12579f5591cf71a0f22cd5bb2702ce83afb..439b51dc604509788bd16b25aea2dbf6201471bd 100644 --- a/substrate/primitives/application-crypto/src/ecdsa.rs +++ b/substrate/primitives/application-crypto/src/ecdsa.rs @@ -27,9 +27,7 @@ mod app { crate::app_crypto!(super, sp_core::testing::ECDSA); } -#[cfg(feature = "full_crypto")] -pub use app::Pair as AppPair; -pub use app::{Public as AppPublic, Signature as AppSignature}; +pub use app::{Pair as AppPair, Public as AppPublic, Signature as AppSignature}; impl RuntimePublic for Public { type Signature = Signature; diff --git a/substrate/primitives/application-crypto/src/ecdsa_bls377.rs b/substrate/primitives/application-crypto/src/ecdsa_bls377.rs index 70940587cedaf6312dbc75834d2180131ca157b4..8dee73095fb2e2fcbeb968edef2aad667112767a 100644 --- a/substrate/primitives/application-crypto/src/ecdsa_bls377.rs +++ b/substrate/primitives/application-crypto/src/ecdsa_bls377.rs @@ -18,6 +18,7 @@ //! ECDSA and BLS12-377 paired crypto applications. use crate::{KeyTypeId, RuntimePublic}; +use sp_std::vec::Vec; pub use sp_core::paired_crypto::ecdsa_bls377::*; diff --git a/substrate/primitives/application-crypto/src/ed25519.rs b/substrate/primitives/application-crypto/src/ed25519.rs index bc05018370edb16c41ed1dddef2dafd7d785cc32..addefe7daf6431415f1c06727b88edd1b3bd9158 100644 --- a/substrate/primitives/application-crypto/src/ed25519.rs +++ b/substrate/primitives/application-crypto/src/ed25519.rs @@ -27,9 +27,7 @@ mod app { crate::app_crypto!(super, sp_core::testing::ED25519); } -#[cfg(feature = "full_crypto")] -pub use app::Pair as AppPair; -pub use app::{Public as AppPublic, Signature as AppSignature}; +pub use app::{Pair as AppPair, Public as AppPublic, Signature as AppSignature}; impl RuntimePublic for Public { type Signature = Signature; diff --git a/substrate/primitives/application-crypto/src/lib.rs b/substrate/primitives/application-crypto/src/lib.rs index 686b486f335301e8750253cb2e306a0f5cb222d4..2355f1ba527d5227a804fc30ae2deccc44df2152 100644 --- a/substrate/primitives/application-crypto/src/lib.rs +++ b/substrate/primitives/application-crypto/src/lib.rs @@ -20,16 +20,13 @@ #![warn(missing_docs)] #![cfg_attr(not(feature = "std"), no_std)] -pub use sp_core::crypto::{key_types, CryptoTypeId, KeyTypeId}; +pub use sp_core::crypto::{key_types, CryptoTypeId, DeriveJunction, KeyTypeId, Ss58Codec}; #[doc(hidden)] -#[cfg(feature = "full_crypto")] pub use sp_core::crypto::{DeriveError, Pair, SecretStringError}; -#[cfg(any(feature = "full_crypto", feature = "serde"))] -pub use sp_core::crypto::{DeriveJunction, Ss58Codec}; #[doc(hidden)] pub use sp_core::{ self, - crypto::{ByteArray, CryptoType, Derive, IsWrappedBy, Public, UncheckedFrom, Wraps}, + crypto::{ByteArray, CryptoType, Derive, IsWrappedBy, Public, Signature, UncheckedFrom, Wraps}, RuntimeDebug, }; @@ -85,7 +82,7 @@ macro_rules! app_crypto { $module::CRYPTO_ID ); $crate::app_crypto_signature_common!($module::Signature, $key_type); - $crate::app_crypto_pair!($module::Pair, $key_type, $module::CRYPTO_ID); + $crate::app_crypto_pair_common!($module::Pair, $key_type, $module::CRYPTO_ID); }; } @@ -116,13 +113,15 @@ macro_rules! app_crypto { $module::CRYPTO_ID ); $crate::app_crypto_signature_common!($module::Signature, $key_type); + $crate::app_crypto_pair_common!($module::Pair, $key_type, $module::CRYPTO_ID); }; } /// Declares `Pair` type which is functionally equivalent to `$pair`, but is /// new application-specific type whose identifier is `$key_type`. +/// It is a common part shared between full_crypto and non full_crypto environments. #[macro_export] -macro_rules! app_crypto_pair { +macro_rules! app_crypto_pair_common { ($pair:ty, $key_type:expr, $crypto_type:expr) => { $crate::wrap! { /// A generic `AppPublic` wrapper type over $pair crypto; this has no specific App. @@ -140,7 +139,14 @@ macro_rules! app_crypto_pair { type Signature = Signature; $crate::app_crypto_pair_functions_if_std!($pair); + $crate::app_crypto_pair_functions_if_full_crypto!($pair); + fn from_phrase( + phrase: &str, + password: Option<&str>, + ) -> Result<(Self, Self::Seed), $crate::SecretStringError> { + <$pair>::from_phrase(phrase, password).map(|r| (Self(r.0), r.1)) + } fn derive>( &self, path: Iter, @@ -154,9 +160,6 @@ macro_rules! app_crypto_pair { fn from_seed_slice(seed: &[u8]) -> Result { <$pair>::from_seed_slice(seed).map(Self) } - fn sign(&self, msg: &[u8]) -> Self::Signature { - Signature(self.0.sign(msg)) - } fn verify>( sig: &Self::Signature, message: M, @@ -203,13 +206,6 @@ macro_rules! app_crypto_pair_functions_if_std { let r = <$pair>::generate_with_phrase(password); (Self(r.0), r.1, r.2) } - - fn from_phrase( - phrase: &str, - password: Option<&str>, - ) -> Result<(Self, Self::Seed), $crate::SecretStringError> { - <$pair>::from_phrase(phrase, password).map(|r| (Self(r.0), r.1)) - } }; } @@ -220,6 +216,25 @@ macro_rules! app_crypto_pair_functions_if_std { ($pair:ty) => {}; } +/// Implements functions for the `Pair` trait when `feature = "full_crypto"` is enabled. +#[doc(hidden)] +#[cfg(feature = "full_crypto")] +#[macro_export] +macro_rules! app_crypto_pair_functions_if_full_crypto { + ($pair:ty) => { + fn sign(&self, msg: &[u8]) -> Self::Signature { + Signature(self.0.sign(msg)) + } + }; +} + +#[doc(hidden)] +#[cfg(not(feature = "full_crypto"))] +#[macro_export] +macro_rules! app_crypto_pair_functions_if_full_crypto { + ($pair:ty) => {}; +} + /// Declares `Public` type which is functionally equivalent to `$public` but is /// new application-specific type whose identifier is `$key_type`. /// For full functionality, `app_crypto_public_common!` must be called too. @@ -267,7 +282,7 @@ macro_rules! app_crypto_public_not_full_crypto { $crate::wrap! { /// A generic `AppPublic` wrapper type over $public crypto; this has no specific App. #[derive( - Clone, Eq, PartialEq, Ord, PartialOrd, + Clone, Eq, Hash, PartialEq, Ord, PartialOrd, $crate::codec::Encode, $crate::codec::Decode, $crate::RuntimeDebug, @@ -277,10 +292,13 @@ macro_rules! app_crypto_public_not_full_crypto { pub struct Public($public); } - impl $crate::CryptoType for Public {} + impl $crate::CryptoType for Public { + type Pair = Pair; + } impl $crate::AppCrypto for Public { type Public = Public; + type Pair = Pair; type Signature = Signature; const ID: $crate::KeyTypeId = $key_type; const CRYPTO_ID: $crate::CryptoTypeId = $crypto_type; @@ -452,10 +470,13 @@ macro_rules! app_crypto_signature_not_full_crypto { pub struct Signature($sig); } - impl $crate::CryptoType for Signature {} + impl $crate::CryptoType for Signature { + type Pair = Pair; + } impl $crate::AppCrypto for Signature { type Public = Public; + type Pair = Pair; type Signature = Signature; const ID: $crate::KeyTypeId = $key_type; const CRYPTO_ID: $crate::CryptoTypeId = $crypto_type; @@ -484,6 +505,12 @@ macro_rules! app_crypto_signature_common { } } + impl AsMut<[u8]> for Signature { + fn as_mut(&mut self) -> &mut [u8] { + self.0.as_mut() + } + } + impl $crate::AppSignature for Signature { type Generic = $sig; } @@ -504,6 +531,12 @@ macro_rules! app_crypto_signature_common { } } + impl $crate::Signature for Signature {} + + impl $crate::ByteArray for Signature { + const LEN: usize = <$sig>::LEN; + } + impl Signature { /// Convert into wrapped generic signature type. pub fn into_inner(self) -> $sig { diff --git a/substrate/primitives/application-crypto/src/sr25519.rs b/substrate/primitives/application-crypto/src/sr25519.rs index 7c91bfa7bb5ffe221a618769f2cb3de3e054d042..d411cc253c0d84fd0bd7f366a7dec86f4c9acc91 100644 --- a/substrate/primitives/application-crypto/src/sr25519.rs +++ b/substrate/primitives/application-crypto/src/sr25519.rs @@ -27,9 +27,7 @@ mod app { crate::app_crypto!(super, sp_core::testing::SR25519); } -#[cfg(feature = "full_crypto")] -pub use app::Pair as AppPair; -pub use app::{Public as AppPublic, Signature as AppSignature}; +pub use app::{Pair as AppPair, Public as AppPublic, Signature as AppSignature}; impl RuntimePublic for Public { type Signature = Signature; diff --git a/substrate/primitives/application-crypto/src/traits.rs b/substrate/primitives/application-crypto/src/traits.rs index e9b1080f63d9ce96ced35989cfba56887f03feb9..0b59abf272dc7761f08c8604db33762b07e31584 100644 --- a/substrate/primitives/application-crypto/src/traits.rs +++ b/substrate/primitives/application-crypto/src/traits.rs @@ -18,9 +18,7 @@ use codec::Codec; use scale_info::TypeInfo; -#[cfg(feature = "full_crypto")] -use sp_core::crypto::Pair; -use sp_core::crypto::{CryptoType, CryptoTypeId, IsWrappedBy, KeyTypeId, Public}; +use sp_core::crypto::{CryptoType, CryptoTypeId, IsWrappedBy, KeyTypeId, Pair, Public}; use sp_std::{fmt::Debug, vec::Vec}; /// Application-specific cryptographic object. @@ -45,24 +43,14 @@ pub trait AppCrypto: 'static + Sized + CryptoType { type Signature: AppSignature; /// The corresponding key pair type in this application scheme. - #[cfg(feature = "full_crypto")] type Pair: AppPair; } /// Type which implements Hash in std, not when no-std (std variant). -#[cfg(any(feature = "std", feature = "full_crypto"))] pub trait MaybeHash: sp_std::hash::Hash {} -#[cfg(any(feature = "std", feature = "full_crypto"))] impl MaybeHash for T {} -/// Type which implements Hash in std, not when no-std (no-std variant). -#[cfg(all(not(feature = "std"), not(feature = "full_crypto")))] -pub trait MaybeHash {} -#[cfg(all(not(feature = "std"), not(feature = "full_crypto")))] -impl MaybeHash for T {} - /// Application-specific key pair. -#[cfg(feature = "full_crypto")] pub trait AppPair: AppCrypto + Pair::Public, Signature = ::Signature> { diff --git a/substrate/primitives/arithmetic/Cargo.toml b/substrate/primitives/arithmetic/Cargo.toml index 332646710eab1511cd3980086ac833a123418608..16eae43c73fa60da63dd249f7934c70e805dd8f2 100644 --- a/substrate/primitives/arithmetic/Cargo.toml +++ b/substrate/primitives/arithmetic/Cargo.toml @@ -23,10 +23,11 @@ codec = { package = "parity-scale-codec", version = "3.6.1", default-features = ] } integer-sqrt = "0.1.2" num-traits = { version = "0.2.17", default-features = false } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.195", default-features = false, features = ["alloc", "derive"], optional = true } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +serde = { features = ["alloc", "derive"], optional = true, workspace = true } static_assertions = "1.1.0" sp-std = { path = "../std", default-features = false } +docify = "0.2.8" [dev-dependencies] criterion = "0.4.0" diff --git a/substrate/primitives/arithmetic/fuzzer/src/fixed_point.rs b/substrate/primitives/arithmetic/fuzzer/src/fixed_point.rs index e76dd1503e39fddb5dbfde601d5a86d28c5b1b88..e2d31065635ebc4d98edb5c6e5df39893ae65b9d 100644 --- a/substrate/primitives/arithmetic/fuzzer/src/fixed_point.rs +++ b/substrate/primitives/arithmetic/fuzzer/src/fixed_point.rs @@ -66,7 +66,7 @@ fn main() { let c = FixedI64::saturating_from_integer(x.saturating_add(y)); assert_eq!(a.saturating_add(b), c); - // Check substraction. + // Check subtraction. let a = FixedI64::saturating_from_integer(x); let b = FixedI64::saturating_from_integer(y); let c = FixedI64::saturating_from_integer(x.saturating_sub(y)); diff --git a/substrate/primitives/arithmetic/src/biguint.rs b/substrate/primitives/arithmetic/src/biguint.rs index d92b08c8eca96121ab1e9c6d54f9fca318815861..164ec67a603f7e61c6e25de1a2861822da06dcf0 100644 --- a/substrate/primitives/arithmetic/src/biguint.rs +++ b/substrate/primitives/arithmetic/src/biguint.rs @@ -17,9 +17,10 @@ //! Infinite precision unsigned integer for substrate runtime. +use alloc::{vec, vec::Vec}; use codec::{Decode, Encode}; +use core::{cell::RefCell, cmp::Ordering, ops}; use num_traits::{One, Zero}; -use sp_std::{cell::RefCell, cmp::Ordering, ops, prelude::*, vec}; // A sensible value for this would be half of the dword size of the host machine. Since the // runtime is compiled to 32bit webassembly, using 32 and 64 for single and double respectively @@ -35,7 +36,7 @@ const SHIFT: usize = 32; const B: Double = Single::max_value() as Double + 1; static_assertions::const_assert!( - sp_std::mem::size_of::() - sp_std::mem::size_of::() == SHIFT / 8 + core::mem::size_of::() - core::mem::size_of::() == SHIFT / 8 ); /// Splits a [`Double`] limb number into a tuple of two [`Single`] limb numbers. @@ -438,9 +439,9 @@ impl BigUint { } } -impl sp_std::fmt::Debug for BigUint { +impl core::fmt::Debug for BigUint { #[cfg(feature = "std")] - fn fmt(&self, f: &mut sp_std::fmt::Formatter<'_>) -> sp_std::fmt::Result { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { write!( f, "BigUint {{ {:?} ({:?})}}", @@ -450,7 +451,7 @@ impl sp_std::fmt::Debug for BigUint { } #[cfg(not(feature = "std"))] - fn fmt(&self, _: &mut sp_std::fmt::Formatter<'_>) -> sp_std::fmt::Result { + fn fmt(&self, _: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { Ok(()) } } diff --git a/substrate/primitives/arithmetic/src/fixed_point.rs b/substrate/primitives/arithmetic/src/fixed_point.rs index ce14d2957b5e216325a2af02fbb1d68af2b756bb..c4e9259c5fc94e3494a4df2bacc36fcdb562e006 100644 --- a/substrate/primitives/arithmetic/src/fixed_point.rs +++ b/substrate/primitives/arithmetic/src/fixed_point.rs @@ -16,6 +16,33 @@ // limitations under the License. //! Decimal Fixed Point implementations for Substrate runtime. +//! Similar to types that implement [`PerThing`](crate::per_things), these are also +//! fixed-point types, however, they are able to represent larger fractions: +#![doc = docify::embed!("./src/lib.rs", fixed_u64)] +//! +//! ### Fixed Point Types in Practice +//! +//! If one needs to exceed the value of one (1), then +//! [`FixedU64`](FixedU64) (and its signed and `u128` counterparts) can be utilized. +//! Take for example this very rudimentary pricing mechanism, where we wish to calculate the demand +//! / supply to get a price for some on-chain compute: +#![doc = docify::embed!( + "./src/lib.rs", + fixed_u64_block_computation_example +)] +//! +//! For a much more comprehensive example, be sure to look at the source for broker (the "coretime") +//! pallet. +//! +//! #### Fixed Point Types in Practice +//! +//! Just as with [`PerThing`](PerThing), you can also perform regular mathematical +//! expressions: +#![doc = docify::embed!( + "./src/lib.rs", + fixed_u64_operation_example +)] +//! use crate::{ helpers_128bit::{multiply_by_rational_with_rounding, sqrt}, @@ -26,17 +53,16 @@ use crate::{ PerThing, Perbill, Rounding, SignedRounding, }; use codec::{CompactAs, Decode, Encode}; -use sp_std::{ +use core::{ fmt::Debug, ops::{self, Add, Div, Mul, Sub}, - prelude::*, }; #[cfg(feature = "serde")] use serde::{de, Deserialize, Deserializer, Serialize, Serializer}; #[cfg(all(not(feature = "std"), feature = "serde"))] -use sp_std::alloc::string::{String, ToString}; +use alloc::string::{String, ToString}; /// Integer types that can be used to interact with `FixedPointNumber` implementations. pub trait FixedPointOperand: @@ -542,7 +568,7 @@ macro_rules! implement_fixed { let v = self.0 as u128; // Want x' = sqrt(x) where x = n/D and x' = n'/D (D is fixed) - // Our prefered way is: + // Our preferred way is: // sqrt(n/D) = sqrt(nD / D^2) = sqrt(nD)/sqrt(D^2) = sqrt(nD)/D // ergo n' = sqrt(nD) // but this requires nD to fit into our type. @@ -899,9 +925,9 @@ macro_rules! implement_fixed { } } - impl sp_std::fmt::Debug for $name { + impl ::core::fmt::Debug for $name { #[cfg(feature = "std")] - fn fmt(&self, f: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result { + fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result { let integral = { let int = self.0 / Self::accuracy(); let signum_for_zero = if int == 0 && self.is_negative() { "-" } else { "" }; @@ -917,7 +943,7 @@ macro_rules! implement_fixed { } #[cfg(not(feature = "std"))] - fn fmt(&self, _: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result { + fn fmt(&self, _: &mut ::core::fmt::Formatter) -> ::core::fmt::Result { Ok(()) } } @@ -933,13 +959,13 @@ macro_rules! implement_fixed { } } - impl sp_std::fmt::Display for $name { - fn fmt(&self, f: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result { + impl ::core::fmt::Display for $name { + fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result { write!(f, "{}", self.0) } } - impl sp_std::str::FromStr for $name { + impl ::core::str::FromStr for $name { type Err = &'static str; fn from_str(s: &str) -> Result { @@ -969,7 +995,7 @@ macro_rules! implement_fixed { where D: Deserializer<'de>, { - use sp_std::str::FromStr; + use ::core::str::FromStr; let s = String::deserialize(deserializer)?; $name::from_str(&s).map_err(de::Error::custom) } diff --git a/substrate/primitives/arithmetic/src/helpers_128bit.rs b/substrate/primitives/arithmetic/src/helpers_128bit.rs index 4e234d4026c9aa59091fba7a0bb9e6da28455a7b..cbbad58443f92332277210f95a032c0bf5ed8e1a 100644 --- a/substrate/primitives/arithmetic/src/helpers_128bit.rs +++ b/substrate/primitives/arithmetic/src/helpers_128bit.rs @@ -22,7 +22,7 @@ //! multiplication implementation provided there. use crate::{biguint, Rounding}; -use sp_std::cmp::{max, min}; +use core::cmp::{max, min}; /// Helper gcd function used in Rational128 implementation. pub fn gcd(a: u128, b: u128) -> u128 { diff --git a/substrate/primitives/arithmetic/src/lib.rs b/substrate/primitives/arithmetic/src/lib.rs index 900f0b75c3bf4f4e45524db7b3f0991828f03a09..01c403a7c4af284a2e6eaec65a5e5e820be9163e 100644 --- a/substrate/primitives/arithmetic/src/lib.rs +++ b/substrate/primitives/arithmetic/src/lib.rs @@ -19,6 +19,8 @@ #![cfg_attr(not(feature = "std"), no_std)] +extern crate alloc; + /// Copied from `sp-runtime` and documented there. #[macro_export] macro_rules! assert_eq_error_rate { @@ -49,7 +51,8 @@ pub use per_things::{ }; pub use rational::{MultiplyRational, Rational128, RationalInfinite}; -use sp_std::{cmp::Ordering, fmt::Debug, prelude::*}; +use alloc::vec::Vec; +use core::{cmp::Ordering, fmt::Debug}; use traits::{BaseArithmetic, One, SaturatedConversion, Unsigned, Zero}; use codec::{Decode, Encode, MaxEncodedLen}; @@ -98,7 +101,7 @@ where fn tcmp(&self, other: &T, threshold: T) -> Ordering { // early exit. if threshold.is_zero() { - return self.cmp(other) + return self.cmp(other); } let upper_bound = other.saturating_add(threshold); @@ -203,12 +206,12 @@ where // Nothing to do here. if count.is_zero() { - return Ok(Vec::::new()) + return Ok(Vec::::new()); } let diff = targeted_sum.max(sum) - targeted_sum.min(sum); if diff.is_zero() { - return Ok(input.to_vec()) + return Ok(input.to_vec()); } let needs_bump = targeted_sum > sum; @@ -251,7 +254,7 @@ where min_index += 1; min_index %= count; } - leftover -= One::one() + leftover -= One::one(); } } else { // must decrease the stakes a bit. decrement from the max element. index of maximum is now @@ -285,7 +288,7 @@ where if output_with_idx[max_index].1 <= threshold { max_index = max_index.checked_sub(1).unwrap_or(count - 1); } - leftover -= One::one() + leftover -= One::one(); } else { max_index = max_index.checked_sub(1).unwrap_or(count - 1); } @@ -297,7 +300,7 @@ where targeted_sum, "sum({:?}) != {:?}", output_with_idx, - targeted_sum, + targeted_sum ); // sort again based on the original index. @@ -353,7 +356,7 @@ mod normalize_tests { vec![ Perbill::from_parts(333333334), Perbill::from_parts(333333333), - Perbill::from_parts(333333333), + Perbill::from_parts(333333333) ] ); @@ -364,7 +367,7 @@ mod normalize_tests { vec![ Perbill::from_parts(316666668), Perbill::from_parts(383333332), - Perbill::from_parts(300000000), + Perbill::from_parts(300000000) ] ); } @@ -375,13 +378,13 @@ mod normalize_tests { // could have a situation where the sum cannot be calculated in the inner type. Calculating // using the upper type of the per_thing should assure this to be okay. assert_eq!( - vec![PerU16::from_percent(40), PerU16::from_percent(40), PerU16::from_percent(40),] + vec![PerU16::from_percent(40), PerU16::from_percent(40), PerU16::from_percent(40)] .normalize(PerU16::one()) .unwrap(), vec![ PerU16::from_parts(21845), // 33% PerU16::from_parts(21845), // 33% - PerU16::from_parts(21845), // 33% + PerU16::from_parts(21845) // 33% ] ); } @@ -425,11 +428,93 @@ mod normalize_tests { } } +#[cfg(test)] +mod per_and_fixed_examples { + use super::*; + + #[docify::export] + #[test] + fn percent_mult() { + let percent = Percent::from_rational(5u32, 100u32); // aka, 5% + let five_percent_of_100 = percent * 100u32; // 5% of 100 is 5. + assert_eq!(five_percent_of_100, 5) + } + #[docify::export] + #[test] + fn perbill_example() { + let p = Perbill::from_percent(80); + // 800000000 bil, or a representative of 0.800000000. + // Precision is in the billions place. + assert_eq!(p.deconstruct(), 800000000); + } + + #[docify::export] + #[test] + fn percent_example() { + let percent = Percent::from_rational(190u32, 400u32); + assert_eq!(percent.deconstruct(), 47); + } + + #[docify::export] + #[test] + fn fixed_u64_block_computation_example() { + // Calculate a very rudimentary on-chain price from supply / demand + // Supply: Cores available per block + // Demand: Cores being ordered per block + let price = FixedU64::from_rational(5u128, 10u128); + + // 0.5 DOT per core + assert_eq!(price, FixedU64::from_float(0.5)); + + // Now, the story has changed - lots of demand means we buy as many cores as there + // available. This also means that price goes up! For the sake of simplicity, we don't care + // about who gets a core - just about our very simple price model + + // Calculate a very rudimentary on-chain price from supply / demand + // Supply: Cores available per block + // Demand: Cores being ordered per block + let price = FixedU64::from_rational(19u128, 10u128); + + // 1.9 DOT per core + assert_eq!(price, FixedU64::from_float(1.9)); + } + + #[docify::export] + #[test] + fn fixed_u64() { + // The difference between this and perthings is perthings operates within the relam of [0, + // 1] In cases where we need > 1, we can used fixed types such as FixedU64 + + let rational_1 = FixedU64::from_rational(10, 5); //" 200%" aka 2. + let rational_2 = FixedU64::from_rational_with_rounding(5, 10, Rounding::Down); // "50%" aka 0.50... + + assert_eq!(rational_1, (2u64).into()); + assert_eq!(rational_2.into_perbill(), Perbill::from_float(0.5)); + } + + #[docify::export] + #[test] + fn fixed_u64_operation_example() { + let rational_1 = FixedU64::from_rational(10, 5); // "200%" aka 2. + let rational_2 = FixedU64::from_rational(8, 5); // "160%" aka 1.6. + + let addition = rational_1 + rational_2; + let multiplication = rational_1 * rational_2; + let division = rational_1 / rational_2; + let subtraction = rational_1 - rational_2; + + assert_eq!(addition, FixedU64::from_float(3.6)); + assert_eq!(multiplication, FixedU64::from_float(3.2)); + assert_eq!(division, FixedU64::from_float(1.25)); + assert_eq!(subtraction, FixedU64::from_float(0.4)); + } +} + #[cfg(test)] mod threshold_compare_tests { use super::*; use crate::traits::Saturating; - use sp_std::cmp::Ordering; + use core::cmp::Ordering; #[test] fn epsilon_ord_works() { @@ -437,15 +522,15 @@ mod threshold_compare_tests { let e = Perbill::from_percent(10).mul_ceil(b); // [115 - 11,5 (103,5), 115 + 11,5 (126,5)] is all equal - assert_eq!(103u32.tcmp(&b, e), Ordering::Equal); - assert_eq!(104u32.tcmp(&b, e), Ordering::Equal); - assert_eq!(115u32.tcmp(&b, e), Ordering::Equal); - assert_eq!(120u32.tcmp(&b, e), Ordering::Equal); - assert_eq!(126u32.tcmp(&b, e), Ordering::Equal); - assert_eq!(127u32.tcmp(&b, e), Ordering::Equal); - - assert_eq!(128u32.tcmp(&b, e), Ordering::Greater); - assert_eq!(102u32.tcmp(&b, e), Ordering::Less); + assert_eq!((103u32).tcmp(&b, e), Ordering::Equal); + assert_eq!((104u32).tcmp(&b, e), Ordering::Equal); + assert_eq!((115u32).tcmp(&b, e), Ordering::Equal); + assert_eq!((120u32).tcmp(&b, e), Ordering::Equal); + assert_eq!((126u32).tcmp(&b, e), Ordering::Equal); + assert_eq!((127u32).tcmp(&b, e), Ordering::Equal); + + assert_eq!((128u32).tcmp(&b, e), Ordering::Greater); + assert_eq!((102u32).tcmp(&b, e), Ordering::Less); } #[test] @@ -455,15 +540,15 @@ mod threshold_compare_tests { let e = Perbill::from_parts(100) * b; // [115 - 11,5 (103,5), 115 + 11,5 (126,5)] is all equal - assert_eq!(103u32.tcmp(&b, e), 103u32.cmp(&b)); - assert_eq!(104u32.tcmp(&b, e), 104u32.cmp(&b)); - assert_eq!(115u32.tcmp(&b, e), 115u32.cmp(&b)); - assert_eq!(120u32.tcmp(&b, e), 120u32.cmp(&b)); - assert_eq!(126u32.tcmp(&b, e), 126u32.cmp(&b)); - assert_eq!(127u32.tcmp(&b, e), 127u32.cmp(&b)); - - assert_eq!(128u32.tcmp(&b, e), 128u32.cmp(&b)); - assert_eq!(102u32.tcmp(&b, e), 102u32.cmp(&b)); + assert_eq!((103u32).tcmp(&b, e), (103u32).cmp(&b)); + assert_eq!((104u32).tcmp(&b, e), (104u32).cmp(&b)); + assert_eq!((115u32).tcmp(&b, e), (115u32).cmp(&b)); + assert_eq!((120u32).tcmp(&b, e), (120u32).cmp(&b)); + assert_eq!((126u32).tcmp(&b, e), (126u32).cmp(&b)); + assert_eq!((127u32).tcmp(&b, e), (127u32).cmp(&b)); + + assert_eq!((128u32).tcmp(&b, e), (128u32).cmp(&b)); + assert_eq!((102u32).tcmp(&b, e), (102u32).cmp(&b)); } #[test] diff --git a/substrate/primitives/arithmetic/src/per_things.rs b/substrate/primitives/arithmetic/src/per_things.rs index fe88b72e24c22158d1d35db50aebf68dec8ff191..f73dbe30cec17ea56b2c349d057df92b76edf724 100644 --- a/substrate/primitives/arithmetic/src/per_things.rs +++ b/substrate/primitives/arithmetic/src/per_things.rs @@ -15,6 +15,42 @@ // See the License for the specific language governing permissions and // limitations under the License. +//! Types that implement [`PerThing`](PerThing) can be used as a floating-point alternative for +//! numbers that operate within the realm of `[0, 1]`. The primary types may you encounter in +//! Substrate would be the following: +//! - [`Percent`](Percent) - parts of one hundred. +//! - [`Permill`](Permill) - parts of a million. +//! - [`Perbill`](Perbill) - parts of a billion. +//! +//! In use, you may see them being used as follows: +//! +//! > **[`Perbill`](Perbill), parts of a billion** +#![doc = docify::embed!("./src/lib.rs", perbill_example)] +//! > **[`Percent`](Percent), parts of a hundred** +#![doc = docify::embed!("./src/lib.rs", percent_example)] +//! +//! Note that `Percent` is represented as a _rounded down_, fixed point +//! number (see the example above). Unlike primitive types, types that implement +//! [`PerThing`](PerThing) will also not overflow, and are therefore safe to use. +//! They adopt the same behavior that a saturated calculation would provide, meaning that if one is +//! to go over "100%", it wouldn't overflow, but simply stop at the upper or lower bound. +//! +//! For use cases which require precision beyond the range of `[0, 1]`, there are fixed-point types +//! which can be used. +//! +//! Each of these can be used to construct and represent ratios within our runtime. +//! You will find types like [`Perbill`](Perbill) being used often in pallet +//! development. `pallet_referenda` is a good example of a pallet which makes good use of fixed +//! point arithmetic, as it relies on representing various curves and thresholds relating to +//! governance. +//! +//! #### Fixed Point Arithmetic with [`PerThing`](PerThing) +//! +//! As stated, one can also perform mathematics using these types directly. For example, finding the +//! percentage of a particular item: + +#![doc = docify::embed!("./src/lib.rs", percent_mult)] + #[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; @@ -23,12 +59,11 @@ use crate::traits::{ Saturating, UniqueSaturatedInto, Unsigned, Zero, }; use codec::{CompactAs, Encode}; -use num_traits::{Pow, SaturatingAdd, SaturatingSub}; -use sp_std::{ +use core::{ fmt, ops, ops::{Add, Sub}, - prelude::*, }; +use num_traits::{Pow, SaturatingAdd, SaturatingSub}; /// Get the inner type of a `PerThing`. pub type InnerOf

=

::Inner; @@ -414,7 +449,7 @@ pub trait PerThing: } /// The rounding method to use for unsigned quantities. -#[derive(Copy, Clone, sp_std::fmt::Debug)] +#[derive(Copy, Clone, core::fmt::Debug)] pub enum Rounding { // Towards infinity. Up, @@ -427,7 +462,7 @@ pub enum Rounding { } /// The rounding method to use. -#[derive(Copy, Clone, sp_std::fmt::Debug)] +#[derive(Copy, Clone, core::fmt::Debug)] pub enum SignedRounding { // Towards positive infinity. High, @@ -580,8 +615,8 @@ macro_rules! implement_per_thing { } #[cfg(feature = "std")] - impl sp_std::fmt::Debug for $name { - fn fmt(&self, fmt: &mut std::fmt::Formatter) -> std::fmt::Result { + impl core::fmt::Debug for $name { + fn fmt(&self, fmt: &mut core::fmt::Formatter) -> core::fmt::Result { if $max == <$type>::max_value() { // Not a power of ten: show as N/D and approx % let pc = (self.0 as f64) / (self.0 as f64) * 100f64; @@ -606,8 +641,8 @@ macro_rules! implement_per_thing { } #[cfg(not(feature = "std"))] - impl sp_std::fmt::Debug for $name { - fn fmt(&self, fmt: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result { + impl core::fmt::Debug for $name { + fn fmt(&self, fmt: &mut core::fmt::Formatter) -> core::fmt::Result { if $max == <$type>::max_value() { // Not a power of ten: show as N/D and approx % write!(fmt, "{}/{}", self.0, $max) diff --git a/substrate/primitives/arithmetic/src/rational.rs b/substrate/primitives/arithmetic/src/rational.rs index ebd89c615a38b3efc717fbb7051fe12ccfb22ea1..2ec83e6fd868e1b67f3c2374dc9a3171165bc8e0 100644 --- a/substrate/primitives/arithmetic/src/rational.rs +++ b/substrate/primitives/arithmetic/src/rational.rs @@ -16,8 +16,8 @@ // limitations under the License. use crate::{biguint::BigUint, helpers_128bit, Rounding}; +use core::cmp::Ordering; use num_traits::{Bounded, One, Zero}; -use sp_std::{cmp::Ordering, prelude::*}; /// A wrapper for any rational number with infinitely large numerator and denominator. /// @@ -92,15 +92,15 @@ impl From for RationalInfinite { pub struct Rational128(u128, u128); #[cfg(feature = "std")] -impl sp_std::fmt::Debug for Rational128 { - fn fmt(&self, f: &mut sp_std::fmt::Formatter<'_>) -> sp_std::fmt::Result { +impl core::fmt::Debug for Rational128 { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { write!(f, "Rational128({} / {} ≈ {:.8})", self.0, self.1, self.0 as f64 / self.1 as f64) } } #[cfg(not(feature = "std"))] -impl sp_std::fmt::Debug for Rational128 { - fn fmt(&self, f: &mut sp_std::fmt::Formatter<'_>) -> sp_std::fmt::Result { +impl core::fmt::Debug for Rational128 { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { write!(f, "Rational128({} / {})", self.0, self.1) } } diff --git a/substrate/primitives/arithmetic/src/traits.rs b/substrate/primitives/arithmetic/src/traits.rs index 6fcc8248539ca1649a11014615ad5ab48da53119..66ec19c1b573a5b308d68555713d618e2595959b 100644 --- a/substrate/primitives/arithmetic/src/traits.rs +++ b/substrate/primitives/arithmetic/src/traits.rs @@ -18,6 +18,9 @@ //! Primitive traits for the runtime arithmetic. use codec::HasCompact; +use core::ops::{ + Add, AddAssign, Div, DivAssign, Mul, MulAssign, Rem, RemAssign, Shl, Shr, Sub, SubAssign, +}; pub use ensure::{ ensure_pow, Ensure, EnsureAdd, EnsureAddAssign, EnsureDiv, EnsureDivAssign, EnsureFixedPointNumber, EnsureFrom, EnsureInto, EnsureMul, EnsureMulAssign, EnsureOp, @@ -28,9 +31,6 @@ pub use num_traits::{ checked_pow, Bounded, CheckedAdd, CheckedDiv, CheckedMul, CheckedNeg, CheckedRem, CheckedShl, CheckedShr, CheckedSub, One, Signed, Unsigned, Zero, }; -use sp_std::ops::{ - Add, AddAssign, Div, DivAssign, Mul, MulAssign, Rem, RemAssign, Shl, Shr, Sub, SubAssign, -}; use crate::MultiplyRational; @@ -262,7 +262,7 @@ pub trait Saturating { Self: One, { let mut o = Self::one(); - sp_std::mem::swap(&mut o, self); + core::mem::swap(&mut o, self); *self = o.saturating_add(One::one()); } @@ -272,7 +272,7 @@ pub trait Saturating { Self: One, { let mut o = Self::one(); - sp_std::mem::swap(&mut o, self); + core::mem::swap(&mut o, self); *self = o.saturating_sub(One::one()); } @@ -282,7 +282,7 @@ pub trait Saturating { Self: One, { let mut o = Self::one(); - sp_std::mem::swap(&mut o, self); + core::mem::swap(&mut o, self); *self = o.saturating_add(amount); } @@ -292,7 +292,7 @@ pub trait Saturating { Self: One, { let mut o = Self::one(); - sp_std::mem::swap(&mut o, self); + core::mem::swap(&mut o, self); *self = o.saturating_sub(amount); } } @@ -949,7 +949,7 @@ mod ensure { } } - impl sp_std::ops::Mul for Signum { + impl core::ops::Mul for Signum { type Output = Self; fn mul(self, rhs: Self) -> Self { diff --git a/substrate/primitives/authority-discovery/Cargo.toml b/substrate/primitives/authority-discovery/Cargo.toml index 70f00897cdd6e804c98363016a8baabc9edde415..88d93f40059625dd271b734c23fd635113dcbac9 100644 --- a/substrate/primitives/authority-discovery/Cargo.toml +++ b/substrate/primitives/authority-discovery/Cargo.toml @@ -17,11 +17,10 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } sp-api = { path = "../api", default-features = false } sp-application-crypto = { path = "../application-crypto", default-features = false } sp-runtime = { path = "../runtime", default-features = false } -sp-std = { path = "../std", default-features = false } [features] default = ["std"] @@ -31,7 +30,6 @@ std = [ "sp-api/std", "sp-application-crypto/std", "sp-runtime/std", - "sp-std/std", ] serde = [ "scale-info/serde", diff --git a/substrate/primitives/authority-discovery/src/lib.rs b/substrate/primitives/authority-discovery/src/lib.rs index 3b25e39d4045e872d2892aa7e992d4140950479e..5aba76a3abb66f11d650ad50486f7a92ed4d6051 100644 --- a/substrate/primitives/authority-discovery/src/lib.rs +++ b/substrate/primitives/authority-discovery/src/lib.rs @@ -19,7 +19,9 @@ #![cfg_attr(not(feature = "std"), no_std)] -use sp_std::vec::Vec; +extern crate alloc; + +use alloc::vec::Vec; mod app { use sp_application_crypto::{app_crypto, key_types::AUTHORITY_DISCOVERY, sr25519}; diff --git a/substrate/primitives/block-builder/Cargo.toml b/substrate/primitives/block-builder/Cargo.toml index c1317facd7fc532267c8039d71b2d78b3d3f61c4..cc4b10851544d601ef9caea512280d49b77cd443 100644 --- a/substrate/primitives/block-builder/Cargo.toml +++ b/substrate/primitives/block-builder/Cargo.toml @@ -19,8 +19,7 @@ targets = ["x86_64-unknown-linux-gnu"] sp-api = { path = "../api", default-features = false } sp-inherents = { path = "../inherents", default-features = false } sp-runtime = { path = "../runtime", default-features = false } -sp-std = { path = "../std", default-features = false } [features] default = ["std"] -std = ["sp-api/std", "sp-inherents/std", "sp-runtime/std", "sp-std/std"] +std = ["sp-api/std", "sp-inherents/std", "sp-runtime/std"] diff --git a/substrate/primitives/block-builder/src/lib.rs b/substrate/primitives/block-builder/src/lib.rs index 29e04857f463ee04c8f39b6c885437992e0d911c..9d03aa4d7a013b1d0ba71da628405a25be95ce38 100644 --- a/substrate/primitives/block-builder/src/lib.rs +++ b/substrate/primitives/block-builder/src/lib.rs @@ -19,6 +19,8 @@ #![cfg_attr(not(feature = "std"), no_std)] +extern crate alloc; + use sp_inherents::{CheckInherentsResult, InherentData}; use sp_runtime::{traits::Block as BlockT, ApplyExtrinsicResult}; @@ -44,7 +46,7 @@ sp_api::decl_runtime_apis! { /// Generate inherent extrinsics. The inherent data will vary from chain to chain. fn inherent_extrinsics( inherent: InherentData, - ) -> sp_std::vec::Vec<::Extrinsic>; + ) -> alloc::vec::Vec<::Extrinsic>; /// Check that the inherents are valid. The inherent data will vary from chain to chain. fn check_inherents(block: Block, data: InherentData) -> CheckInherentsResult; diff --git a/substrate/primitives/blockchain/Cargo.toml b/substrate/primitives/blockchain/Cargo.toml index 176e9ed6dd28f1fc55b7b237746325071d8a9e64..e716b61bfeb1668a42434aed147fa0810a1b7dca 100644 --- a/substrate/primitives/blockchain/Cargo.toml +++ b/substrate/primitives/blockchain/Cargo.toml @@ -18,11 +18,11 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } -futures = "0.3.21" -log = "0.4.17" +futures = "0.3.30" +log = { workspace = true, default-features = true } parking_lot = "0.12.1" schnellru = "0.2.1" -thiserror = "1.0.48" +thiserror = { workspace = true } sp-api = { path = "../api" } sp-consensus = { path = "../consensus/common" } sp-database = { path = "../database" } diff --git a/substrate/primitives/blockchain/src/backend.rs b/substrate/primitives/blockchain/src/backend.rs index 8208f9128e714511c2a3604d7d754e4d87d62530..7a09865f858d3faa4ec1ee1fd5a2beb84e9267d7 100644 --- a/substrate/primitives/blockchain/src/backend.rs +++ b/substrate/primitives/blockchain/src/backend.rs @@ -187,7 +187,7 @@ pub trait Backend: /// a block with the given `base_hash`. /// /// The search space is always limited to blocks which are in the finalized - /// chain or descendents of it. + /// chain or descendants of it. /// /// Returns `Ok(None)` if `base_hash` is not found in search space. // TODO: document time complexity of this, see [#1444](https://github.com/paritytech/substrate/issues/1444) diff --git a/substrate/primitives/blockchain/src/error.rs b/substrate/primitives/blockchain/src/error.rs index 74a2ed3fba50d1b349370a831a92af5d8e78950f..e8ac148d7511ec9cbbf6564015fd63e12d7ec06c 100644 --- a/substrate/primitives/blockchain/src/error.rs +++ b/substrate/primitives/blockchain/src/error.rs @@ -34,7 +34,7 @@ pub enum ApplyExtrinsicFailed { /// The transaction cannot be included into the current block. /// /// This doesn't necessary mean that the transaction itself is invalid, but it might be just - /// unappliable onto the current block. + /// unapplicable onto the current block. #[error("Extrinsic is not valid: {0:?}")] Validity(#[from] TransactionValidityError), diff --git a/substrate/primitives/blockchain/src/header_metadata.rs b/substrate/primitives/blockchain/src/header_metadata.rs index 08b3c9ab3dfbda6acc7a0ad6b575c518dc97ecc3..ccd640c0567afc6c9f9341fca754471a15a2829c 100644 --- a/substrate/primitives/blockchain/src/header_metadata.rs +++ b/substrate/primitives/blockchain/src/header_metadata.rs @@ -178,7 +178,7 @@ pub struct TreeRoute { impl TreeRoute { /// Creates a new `TreeRoute`. /// - /// To preserve the structure safety invariats it is required that `pivot < route.len()`. + /// To preserve the structure safety invariants it is required that `pivot < route.len()`. pub fn new(route: Vec>, pivot: usize) -> Result { if pivot < route.len() { Ok(TreeRoute { route, pivot }) @@ -212,7 +212,7 @@ impl TreeRoute { ) } - /// Get a slice of enacted blocks (descendents of the common ancestor) + /// Get a slice of enacted blocks (descendants of the common ancestor) pub fn enacted(&self) -> &[HashAndNumber] { &self.route[self.pivot + 1..] } diff --git a/substrate/primitives/consensus/aura/Cargo.toml b/substrate/primitives/consensus/aura/Cargo.toml index 52f6bc22ba4080fbe1fccde71cf06ffa2c1a5327..b689c84f158c7bddc1e845449654056b67e78b6f 100644 --- a/substrate/primitives/consensus/aura/Cargo.toml +++ b/substrate/primitives/consensus/aura/Cargo.toml @@ -16,15 +16,14 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -async-trait = { version = "0.1.74", optional = true } +async-trait = { version = "0.1.79", optional = true } codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } sp-api = { path = "../../api", default-features = false } sp-application-crypto = { path = "../../application-crypto", default-features = false } sp-consensus-slots = { path = "../slots", default-features = false } sp-inherents = { path = "../../inherents", default-features = false } sp-runtime = { path = "../../runtime", default-features = false } -sp-std = { path = "../../std", default-features = false } sp-timestamp = { path = "../../timestamp", default-features = false } [features] @@ -38,7 +37,6 @@ std = [ "sp-consensus-slots/std", "sp-inherents/std", "sp-runtime/std", - "sp-std/std", "sp-timestamp/std", ] diff --git a/substrate/primitives/consensus/aura/src/inherents.rs b/substrate/primitives/consensus/aura/src/inherents.rs index 1ef25feb0ad62ef71a96c9bd17a6dc3ac8385cb8..733081dd790a1e94acb8c033192727df74bfc26c 100644 --- a/substrate/primitives/consensus/aura/src/inherents.rs +++ b/substrate/primitives/consensus/aura/src/inherents.rs @@ -69,7 +69,7 @@ impl InherentDataProvider { } #[cfg(feature = "std")] -impl sp_std::ops::Deref for InherentDataProvider { +impl core::ops::Deref for InherentDataProvider { type Target = InherentType; fn deref(&self) -> &Self::Target { diff --git a/substrate/primitives/consensus/aura/src/lib.rs b/substrate/primitives/consensus/aura/src/lib.rs index 78409e84e93a377c90c4318e185cd5d4d8324781..5173d5516cfa605f7248ac0ca354b2283227d870 100644 --- a/substrate/primitives/consensus/aura/src/lib.rs +++ b/substrate/primitives/consensus/aura/src/lib.rs @@ -19,9 +19,11 @@ #![cfg_attr(not(feature = "std"), no_std)] +extern crate alloc; + +use alloc::vec::Vec; use codec::{Codec, Decode, Encode}; use sp_runtime::ConsensusEngineId; -use sp_std::vec::Vec; pub mod digests; pub mod inherents; diff --git a/substrate/primitives/consensus/babe/Cargo.toml b/substrate/primitives/consensus/babe/Cargo.toml index 9409b44ef62d38b322fca70f9abc95d72e020e58..2420f48b1f4aa97923a556de37a06a6611ba8e05 100644 --- a/substrate/primitives/consensus/babe/Cargo.toml +++ b/substrate/primitives/consensus/babe/Cargo.toml @@ -16,17 +16,16 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -async-trait = { version = "0.1.74", optional = true } +async-trait = { version = "0.1.79", optional = true } codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.195", default-features = false, features = ["alloc", "derive"], optional = true } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +serde = { features = ["alloc", "derive"], optional = true, workspace = true } sp-api = { path = "../../api", default-features = false } sp-application-crypto = { path = "../../application-crypto", default-features = false } sp-consensus-slots = { path = "../slots", default-features = false } sp-core = { path = "../../core", default-features = false } sp-inherents = { path = "../../inherents", default-features = false } sp-runtime = { path = "../../runtime", default-features = false } -sp-std = { path = "../../std", default-features = false } sp-timestamp = { path = "../../timestamp", optional = true } [features] @@ -42,7 +41,6 @@ std = [ "sp-core/std", "sp-inherents/std", "sp-runtime/std", - "sp-std/std", "sp-timestamp/std", ] diff --git a/substrate/primitives/consensus/babe/src/digests.rs b/substrate/primitives/consensus/babe/src/digests.rs index afc967e3af391dd165e6be88ffdb42918b57b130..e7af8c5763a0f93223c749cea6b21313f46ba430 100644 --- a/substrate/primitives/consensus/babe/src/digests.rs +++ b/substrate/primitives/consensus/babe/src/digests.rs @@ -22,9 +22,10 @@ use super::{ BabeEpochConfiguration, Randomness, Slot, BABE_ENGINE_ID, }; +#[cfg(not(feature = "std"))] +use alloc::vec::Vec; use sp_core::sr25519::vrf::VrfSignature; use sp_runtime::{DigestItem, RuntimeDebug}; -use sp_std::vec::Vec; use codec::{Decode, Encode, MaxEncodedLen}; use scale_info::TypeInfo; diff --git a/substrate/primitives/consensus/babe/src/inherents.rs b/substrate/primitives/consensus/babe/src/inherents.rs index b01bd1c9221f2043a799f93450280ac7b280401b..54b7b64401673927602a3e816cc9d5dcb9ede14a 100644 --- a/substrate/primitives/consensus/babe/src/inherents.rs +++ b/substrate/primitives/consensus/babe/src/inherents.rs @@ -18,7 +18,6 @@ //! Inherents for BABE use sp_inherents::{Error, InherentData, InherentIdentifier}; -use sp_std::result::Result; /// The BABE inherent identifier. pub const INHERENT_IDENTIFIER: InherentIdentifier = *b"babeslot"; @@ -75,7 +74,7 @@ impl InherentDataProvider { } #[cfg(feature = "std")] -impl sp_std::ops::Deref for InherentDataProvider { +impl core::ops::Deref for InherentDataProvider { type Target = InherentType; fn deref(&self) -> &Self::Target { diff --git a/substrate/primitives/consensus/babe/src/lib.rs b/substrate/primitives/consensus/babe/src/lib.rs index d6b2cdd55e0daddf7e49a132d48bbc8c1741736a..ee07da6829f52933424a838e36a2c1246bf9aeb7 100644 --- a/substrate/primitives/consensus/babe/src/lib.rs +++ b/substrate/primitives/consensus/babe/src/lib.rs @@ -20,15 +20,18 @@ #![forbid(unsafe_code, missing_docs, unused_variables, unused_imports)] #![cfg_attr(not(feature = "std"), no_std)] +extern crate alloc; + pub mod digests; pub mod inherents; +#[cfg(not(feature = "std"))] +use alloc::vec::Vec; use codec::{Decode, Encode, MaxEncodedLen}; use scale_info::TypeInfo; #[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; use sp_runtime::{traits::Header, ConsensusEngineId, RuntimeDebug}; -use sp_std::vec::Vec; use crate::digests::{NextConfigDescriptor, NextEpochDescriptor}; @@ -256,8 +259,14 @@ pub struct BabeEpochConfiguration { pub allowed_slots: AllowedSlots, } +impl Default for BabeEpochConfiguration { + fn default() -> Self { + Self { c: (1, 4), allowed_slots: AllowedSlots::PrimaryAndSecondaryVRFSlots } + } +} + /// Verifies the equivocation proof by making sure that: both headers have -/// different hashes, are targetting the same slot, and have valid signatures by +/// different hashes, are targeting the same slot, and have valid signatures by /// the same authority. pub fn check_equivocation_proof(proof: EquivocationProof) -> bool where @@ -289,7 +298,7 @@ where let first_pre_digest = find_pre_digest(&proof.first_header)?; let second_pre_digest = find_pre_digest(&proof.second_header)?; - // both headers must be targetting the same slot and it must + // both headers must be targeting the same slot and it must // be the same as the one in the proof. if proof.slot != first_pre_digest.slot() || first_pre_digest.slot() != second_pre_digest.slot() diff --git a/substrate/primitives/consensus/beefy/Cargo.toml b/substrate/primitives/consensus/beefy/Cargo.toml index 6953fdad53cbdffd0723792dec198b818813b7e4..a16d943b91469d0d24ba6453e6b08a6385ec2f36 100644 --- a/substrate/primitives/consensus/beefy/Cargo.toml +++ b/substrate/primitives/consensus/beefy/Cargo.toml @@ -16,8 +16,8 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.195", default-features = false, optional = true, features = ["alloc", "derive"] } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +serde = { optional = true, features = ["alloc", "derive"], workspace = true } sp-api = { path = "../../api", default-features = false } sp-application-crypto = { path = "../../application-crypto", default-features = false } sp-core = { path = "../../core", default-features = false } @@ -25,9 +25,9 @@ sp-crypto-hashing = { path = "../../crypto/hashing", default-features = false } sp-io = { path = "../../io", default-features = false } sp-mmr-primitives = { path = "../../merkle-mountain-range", default-features = false } sp-runtime = { path = "../../runtime", default-features = false } -sp-std = { path = "../../std", default-features = false } -strum = { version = "0.24.1", features = ["derive"], default-features = false } -lazy_static = "1.4.0" +sp-keystore = { path = "../../keystore", default-features = false } +strum = { version = "0.26.2", features = ["derive"], default-features = false } +lazy_static = { version = "1.4.0", optional = true } [dev-dependencies] array-bytes = "6.1" @@ -37,6 +37,7 @@ w3f-bls = { version = "0.1.3", features = ["std"] } default = ["std"] std = [ "codec/std", + "dep:lazy_static", "scale-info/std", "serde/std", "sp-api/std", @@ -44,9 +45,9 @@ std = [ "sp-core/std", "sp-crypto-hashing/std", "sp-io/std", + "sp-keystore/std", "sp-mmr-primitives/std", "sp-runtime/std", - "sp-std/std", "strum/std", ] diff --git a/substrate/primitives/consensus/beefy/src/commitment.rs b/substrate/primitives/consensus/beefy/src/commitment.rs index 37be1a4f6fc3e20977e6ee1beb90cf2cf8e67874..4fd9e1b0a6ed14ea51ef30e5d4c6748a129d5249 100644 --- a/substrate/primitives/consensus/beefy/src/commitment.rs +++ b/substrate/primitives/consensus/beefy/src/commitment.rs @@ -15,9 +15,10 @@ // See the License for the specific language governing permissions and // limitations under the License. +use alloc::{vec, vec::Vec}; use codec::{Decode, Encode, Error, Input}; +use core::cmp; use scale_info::TypeInfo; -use sp_std::{cmp, prelude::*}; use crate::{Payload, ValidatorSetId}; @@ -97,6 +98,19 @@ pub struct SignedCommitment { pub signatures: Vec>, } +impl core::fmt::Display + for SignedCommitment +{ + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + let signatures_count = self.signatures.iter().filter(|s| s.is_some()).count(); + write!( + f, + "SignedCommitment(commitment: {:?}, signatures_count: {})", + self.commitment, signatures_count + ) + } +} + impl SignedCommitment { /// Return the number of collected signatures. pub fn no_of_signatures(&self) -> usize { @@ -241,6 +255,14 @@ pub enum VersionedFinalityProof { V1(SignedCommitment), } +impl core::fmt::Display for VersionedFinalityProof { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + match self { + VersionedFinalityProof::V1(sc) => write!(f, "VersionedFinalityProof::V1({})", sc), + } + } +} + impl From> for VersionedFinalityProof { fn from(commitment: SignedCommitment) -> Self { VersionedFinalityProof::V1(commitment) @@ -398,7 +420,7 @@ mod tests { assert_eq!( encoded, array_bytes::hex2bytes_unchecked( - "046d68343048656c6c6f20576f726c642105000000000000000000000000000000000000000000000004300400000008558455ad81279df0795cc985580e4fb75d72d948d1107b2ac80a09abed4da8480c746cc321f2319a5e99a830e314d10dd3cd68ce3dc0c33c86e99bcb7816f9ba01667603fc041cf9d7147d22bf54b15e5778893d6986b71a929747befd3b4d233fbe668bc480e8865116b94db46ca25a01e03c71955f2582604e415da68f2c3c406b9d5f4ad416230ec5453f05ac16a50d8d0923dfb0413cc956ae3fa6334465bd1f2cacec8e9cd606438390fe2a29dc052d6e1f8105c337a86cdd9aaacdc496577f3db8c55ef9e6fd48f2c5c05a2274707491635d8ba3df64f324575b7b2a34487bca2324b6a0046395a71681be3d0c2a00df61d3b2be0963eb6caa243cc505d327aec73e1bb7ffe9a14b1354b0c406792ac6d6f47c06987c15dec9993f43eefa001d866fe0850d986702c414840f0d9ec0fdc04832ef91ae37c8d49e2f573ca50cb37f152801d489a19395cb04e5fc8f2ab6954b58a3bcc40ef9b6409d2ff7ef07" + "046d68343048656c6c6f20576f726c642105000000000000000000000000000000000000000000000004300400000008558455ad81279df0795cc985580e4fb75d72d948d1107b2ac80a09abed4da8480c746cc321f2319a5e99a830e314d10dd3cd68ce3dc0c33c86e99bcb7816f9ba015dd1c9b2237e54baa93d232cdf83a430b58a5efbc2f86ca1bab173a315ff6f15bef161425750c028055e9a23947b73002889a8b22168628438875a8ef25d76db998a80187b50719471286f054f3b3809b77a0cd87d7fe9c1a9d5d562683e25a70610f0804e92340549a43a7159b77b0c2d6e1f8105c337a86cdd9aaacdc496577f3db8c55ef9e6fd48f2c5c05a2274707491635d8ba3df64f324575b7b2a34487bca2324b6a0046395a71681be3d0c2a001074884b6998c82331bd57ffa0a02cbfd02483c765b9216eab6a1fc119206236bf7971be68acaebff7400edee943240006a6096c9cfa65e9eb4e67f025c27112d14b4574fb208c439500f45cf3a8060f6cf009044f3141cce0364a7c2710a19b1bdf4abf27f86e5e3db08bddd35a7d12" ) ); } diff --git a/substrate/primitives/consensus/beefy/src/lib.rs b/substrate/primitives/consensus/beefy/src/lib.rs index 68eeeb3c680071dff08aa0aac9de3bf6e62c140e..70978ca559dd2b50041c45d9cab3c874e8bcc852 100644 --- a/substrate/primitives/consensus/beefy/src/lib.rs +++ b/substrate/primitives/consensus/beefy/src/lib.rs @@ -31,24 +31,28 @@ //! it will use a different set of keys. For Polkadot use case we plan to use `secp256k1` for BEEFY, //! while GRANDPA uses `ed25519`. +extern crate alloc; + mod commitment; -pub mod mmr; mod payload; -#[cfg(feature = "std")] -mod test_utils; + +pub mod mmr; pub mod witness; +/// Test utilities +#[cfg(feature = "std")] +pub mod test_utils; + pub use commitment::{Commitment, SignedCommitment, VersionedFinalityProof}; pub use payload::{known_payloads, BeefyPayloadId, Payload, PayloadProvider}; -#[cfg(feature = "std")] -pub use test_utils::*; +use alloc::vec::Vec; use codec::{Codec, Decode, Encode}; +use core::fmt::{Debug, Display}; use scale_info::TypeInfo; -use sp_application_crypto::RuntimeAppPublic; +use sp_application_crypto::{AppCrypto, AppPublic, ByteArray, RuntimeAppPublic}; use sp_core::H256; use sp_runtime::traits::{Hash, Keccak256, NumberFor}; -use sp_std::prelude::*; /// Key type for BEEFY module. pub const KEY_TYPE: sp_core::crypto::KeyTypeId = sp_application_crypto::key_types::BEEFY; @@ -63,6 +67,25 @@ pub trait BeefyAuthorityId: RuntimeAppPublic { fn verify(&self, signature: &::Signature, msg: &[u8]) -> bool; } +/// Hasher used for BEEFY signatures. +pub type BeefySignatureHasher = sp_runtime::traits::Keccak256; + +/// A trait bound which lists all traits which are required to be implemented by +/// a BEEFY AuthorityId type in order to be able to be used in BEEFY Keystore +pub trait AuthorityIdBound: + Codec + + Debug + + Clone + + AsRef<[u8]> + + ByteArray + + AppPublic + + AppCrypto + + RuntimeAppPublic + + Display + + BeefyAuthorityId +{ +} + /// BEEFY cryptographic types for ECDSA crypto /// /// This module basically introduces four crypto types: @@ -74,7 +97,7 @@ pub trait BeefyAuthorityId: RuntimeAppPublic { /// Your code should use the above types as concrete types for all crypto related /// functionality. pub mod ecdsa_crypto { - use super::{BeefyAuthorityId, Hash, RuntimeAppPublic, KEY_TYPE}; + use super::{AuthorityIdBound, BeefyAuthorityId, Hash, RuntimeAppPublic, KEY_TYPE}; use sp_application_crypto::{app_crypto, ecdsa}; use sp_core::crypto::Wraps; @@ -101,6 +124,7 @@ pub mod ecdsa_crypto { } } } + impl AuthorityIdBound for AuthorityId {} } /// BEEFY cryptographic types for BLS crypto @@ -116,7 +140,7 @@ pub mod ecdsa_crypto { #[cfg(feature = "bls-experimental")] pub mod bls_crypto { - use super::{BeefyAuthorityId, Hash, RuntimeAppPublic, KEY_TYPE}; + use super::{AuthorityIdBound, BeefyAuthorityId, Hash, RuntimeAppPublic, KEY_TYPE}; use sp_application_crypto::{app_crypto, bls377}; use sp_core::{bls377::Pair as BlsPair, crypto::Wraps, Pair as _}; @@ -134,13 +158,14 @@ pub mod bls_crypto { { fn verify(&self, signature: &::Signature, msg: &[u8]) -> bool { // `w3f-bls` library uses IETF hashing standard and as such does not expose - // a choice of hash to field function. + // a choice of hash-to-field function. // We are directly calling into the library to avoid introducing new host call. // and because BeefyAuthorityId::verify is being called in the runtime so we don't have BlsPair::verify(signature.as_inner_ref(), msg, self.as_inner_ref()) } } + impl AuthorityIdBound for AuthorityId {} } /// BEEFY cryptographic types for (ECDSA,BLS) crypto pair @@ -155,7 +180,7 @@ pub mod bls_crypto { /// functionality. #[cfg(feature = "bls-experimental")] pub mod ecdsa_bls_crypto { - use super::{BeefyAuthorityId, Hash, RuntimeAppPublic, KEY_TYPE}; + use super::{AuthorityIdBound, BeefyAuthorityId, Hash, RuntimeAppPublic, KEY_TYPE}; use sp_application_crypto::{app_crypto, ecdsa_bls377}; use sp_core::{crypto::Wraps, ecdsa_bls377::Pair as EcdsaBlsPair}; @@ -175,7 +200,7 @@ pub mod ecdsa_bls_crypto { fn verify(&self, signature: &::Signature, msg: &[u8]) -> bool { // We can not simply call // `EcdsaBlsPair::verify(signature.as_inner_ref(), msg, self.as_inner_ref())` - // because that invokes ECDSA default verification which perfoms Blake2b hash + // because that invokes ECDSA default verification which performs Blake2b hash // which we don't want. This is because ECDSA signatures are meant to be verified // on Ethereum network where Keccak hasher is significantly cheaper than Blake2b. // See Figure 3 of [OnSc21](https://www.scitepress.org/Papers/2021/106066/106066.pdf) @@ -187,6 +212,8 @@ pub mod ecdsa_bls_crypto { ) } } + + impl AuthorityIdBound for AuthorityId {} } /// The `ConsensusEngineId` of BEEFY. diff --git a/substrate/primitives/consensus/beefy/src/mmr.rs b/substrate/primitives/consensus/beefy/src/mmr.rs index 1b9a45f86878fa6d35fa0d150146e6c94c7154fe..0bc303d51c01409253ac2de1a34430fd085b7f1a 100644 --- a/substrate/primitives/consensus/beefy/src/mmr.rs +++ b/substrate/primitives/consensus/beefy/src/mmr.rs @@ -15,7 +15,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -//! BEEFY + MMR utilties. +//! BEEFY + MMR utilities. //! //! While BEEFY can be used completely independently as an additional consensus gadget, //! it is designed around a main use case of bridging standalone networks together. @@ -26,7 +26,8 @@ //! but we imagine they will be useful for other chains that either want to bridge with Polkadot //! or are completely standalone, but heavily inspired by Polkadot. -use crate::{ecdsa_crypto::AuthorityId, ConsensusLog, MmrRootHash, Vec, BEEFY_ENGINE_ID}; +use crate::{ecdsa_crypto::AuthorityId, ConsensusLog, MmrRootHash, BEEFY_ENGINE_ID}; +use alloc::vec::Vec; use codec::{Decode, Encode, MaxEncodedLen}; use scale_info::TypeInfo; use sp_runtime::{ @@ -76,7 +77,7 @@ pub struct MmrLeaf { /// /// Given that adding new struct elements in SCALE is backward compatible (i.e. old format can be /// still decoded, the new fields will simply be ignored). We expect the major version to be bumped -/// very rarely (hopefuly never). +/// very rarely (hopefully never). #[derive(Debug, Default, PartialEq, Eq, Clone, Encode, Decode, TypeInfo)] pub struct MmrLeafVersion(u8); impl MmrLeafVersion { @@ -150,10 +151,11 @@ pub use mmr_root_provider::MmrRootProvider; mod mmr_root_provider { use super::*; use crate::{known_payloads, payload::PayloadProvider, Payload}; + use alloc::sync::Arc; + use core::marker::PhantomData; use sp_api::ProvideRuntimeApi; use sp_mmr_primitives::MmrApi; use sp_runtime::traits::NumberFor; - use sp_std::{marker::PhantomData, sync::Arc}; /// A [`crate::Payload`] provider where payload is Merkle Mountain Range root hash. /// diff --git a/substrate/primitives/consensus/beefy/src/payload.rs b/substrate/primitives/consensus/beefy/src/payload.rs index d520de445c95aed210c61e67f7e09be8b676442b..1a06e620e7ad400ed10c5451d453f403da1f3688 100644 --- a/substrate/primitives/consensus/beefy/src/payload.rs +++ b/substrate/primitives/consensus/beefy/src/payload.rs @@ -15,10 +15,10 @@ // See the License for the specific language governing permissions and // limitations under the License. +use alloc::{vec, vec::Vec}; use codec::{Decode, Encode}; use scale_info::TypeInfo; use sp_runtime::traits::Block; -use sp_std::prelude::*; /// Id of different payloads in the [`crate::Commitment`] data. pub type BeefyPayloadId = [u8; 2]; @@ -43,7 +43,7 @@ pub mod known_payloads { pub struct Payload(Vec<(BeefyPayloadId, Vec)>); impl Payload { - /// Construct a new payload given an initial vallue + /// Construct a new payload given an initial value pub fn from_single_entry(id: BeefyPayloadId, value: Vec) -> Self { Self(vec![(id, value)]) } diff --git a/substrate/primitives/consensus/beefy/src/test_utils.rs b/substrate/primitives/consensus/beefy/src/test_utils.rs index a6e65e5bff0b0d6bc75d93ea3d5fc7b49741287f..ec13c9c690046ae795fe50af3bfc775721dfb6ee 100644 --- a/substrate/primitives/consensus/beefy/src/test_utils.rs +++ b/substrate/primitives/consensus/beefy/src/test_utils.rs @@ -15,18 +15,24 @@ // See the License for the specific language governing permissions and // limitations under the License. -#![cfg(feature = "std")] +#[cfg(feature = "bls-experimental")] +use crate::ecdsa_bls_crypto; +use crate::{ + ecdsa_crypto, AuthorityIdBound, BeefySignatureHasher, Commitment, EquivocationProof, Payload, + ValidatorSetId, VoteMessage, +}; +use sp_application_crypto::{AppCrypto, AppPair, RuntimeAppPublic, Wraps}; +use sp_core::{ecdsa, Pair}; +use sp_runtime::traits::Hash; -use crate::{ecdsa_crypto, Commitment, EquivocationProof, Payload, ValidatorSetId, VoteMessage}; use codec::Encode; -use sp_core::{ecdsa, Pair}; -use std::collections::HashMap; +use std::{collections::HashMap, marker::PhantomData}; use strum::IntoEnumIterator; /// Set of test accounts using [`crate::ecdsa_crypto`] types. #[allow(missing_docs)] #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, strum::Display, strum::EnumIter)] -pub enum Keyring { +pub enum Keyring { Alice, Bob, Charlie, @@ -35,71 +41,110 @@ pub enum Keyring { Ferdie, One, Two, + _Marker(PhantomData), +} + +/// Trait representing BEEFY specific generation and signing behavior of authority id +/// +/// Accepts custom hashing fn for the message and custom convertor fn for the signer. +pub trait BeefySignerAuthority: AppPair { + /// Generate and return signature for `message` using custom hashing `MsgHash` + fn sign_with_hasher(&self, message: &[u8]) -> ::Signature; +} + +impl BeefySignerAuthority for ::Pair +where + MsgHash: Hash, + ::Output: Into<[u8; 32]>, +{ + fn sign_with_hasher(&self, message: &[u8]) -> ::Signature { + let hashed_message = ::hash(message).into(); + self.as_inner_ref().sign_prehashed(&hashed_message).into() + } +} + +#[cfg(feature = "bls-experimental")] +impl BeefySignerAuthority for ::Pair +where + MsgHash: Hash, + ::Output: Into<[u8; 32]>, +{ + fn sign_with_hasher(&self, message: &[u8]) -> ::Signature { + self.as_inner_ref().sign_with_hasher::(&message).into() + } } -impl Keyring { +/// Implement Keyring functionalities generically over AuthorityId +impl Keyring +where + AuthorityId: AuthorityIdBound + From<<::Pair as AppCrypto>::Public>, + ::Pair: BeefySignerAuthority, + ::Signature: + Send + Sync + From<<::Pair as AppCrypto>::Signature>, +{ /// Sign `msg`. - pub fn sign(self, msg: &[u8]) -> ecdsa_crypto::Signature { - // todo: use custom signature hashing type - let msg = sp_crypto_hashing::keccak_256(msg); - ecdsa::Pair::from(self).sign_prehashed(&msg).into() + pub fn sign(&self, msg: &[u8]) -> ::Signature { + let key_pair: ::Pair = self.pair(); + key_pair.sign_with_hasher(&msg).into() } /// Return key pair. - pub fn pair(self) -> ecdsa_crypto::Pair { - ecdsa::Pair::from_string(self.to_seed().as_str(), None).unwrap().into() + pub fn pair(&self) -> ::Pair { + ::Pair::from_string(self.to_seed().as_str(), None) + .unwrap() + .into() } /// Return public key. - pub fn public(self) -> ecdsa_crypto::Public { - self.pair().public() + pub fn public(&self) -> AuthorityId { + self.pair().public().into() } /// Return seed string. - pub fn to_seed(self) -> String { + pub fn to_seed(&self) -> String { format!("//{}", self) } /// Get Keyring from public key. - pub fn from_public(who: &ecdsa_crypto::Public) -> Option { - Self::iter().find(|&k| &ecdsa_crypto::Public::from(k) == who) + pub fn from_public(who: &AuthorityId) -> Option> { + Self::iter().find(|k| k.public() == *who) } } lazy_static::lazy_static! { - static ref PRIVATE_KEYS: HashMap = - Keyring::iter().map(|i| (i, i.pair())).collect(); - static ref PUBLIC_KEYS: HashMap = - PRIVATE_KEYS.iter().map(|(&name, pair)| (name, pair.public())).collect(); + static ref PRIVATE_KEYS: HashMap, ecdsa_crypto::Pair> = + Keyring::iter().map(|i| (i.clone(), i.pair())).collect(); + static ref PUBLIC_KEYS: HashMap, ecdsa_crypto::Public> = + PRIVATE_KEYS.iter().map(|(name, pair)| (name.clone(), sp_application_crypto::Pair::public(pair))).collect(); } -impl From for ecdsa_crypto::Pair { - fn from(k: Keyring) -> Self { +impl From> for ecdsa_crypto::Pair { + fn from(k: Keyring) -> Self { k.pair() } } -impl From for ecdsa::Pair { - fn from(k: Keyring) -> Self { +impl From> for ecdsa::Pair { + fn from(k: Keyring) -> Self { k.pair().into() } } -impl From for ecdsa_crypto::Public { - fn from(k: Keyring) -> Self { +impl From> for ecdsa_crypto::Public { + fn from(k: Keyring) -> Self { (*PUBLIC_KEYS).get(&k).cloned().unwrap() } } /// Create a new `EquivocationProof` based on given arguments. pub fn generate_equivocation_proof( - vote1: (u64, Payload, ValidatorSetId, &Keyring), - vote2: (u64, Payload, ValidatorSetId, &Keyring), + vote1: (u64, Payload, ValidatorSetId, &Keyring), + vote2: (u64, Payload, ValidatorSetId, &Keyring), ) -> EquivocationProof { let signed_vote = |block_number: u64, payload: Payload, validator_set_id: ValidatorSetId, - keyring: &Keyring| { + keyring: &Keyring| { let commitment = Commitment { validator_set_id, block_number, payload }; let signature = keyring.sign(&commitment.encode()); VoteMessage { commitment, id: keyring.public(), signature } diff --git a/substrate/primitives/consensus/beefy/src/witness.rs b/substrate/primitives/consensus/beefy/src/witness.rs index b633453340bbee211f49bc5afcdf5867570cf7c0..cfffc94254a4c6caa9c7748b5e48b71fd71792fe 100644 --- a/substrate/primitives/consensus/beefy/src/witness.rs +++ b/substrate/primitives/consensus/beefy/src/witness.rs @@ -23,9 +23,8 @@ //! verification. This allows lowering the data and computation cost of verifying the //! signed commitment. -use sp_std::prelude::*; - use crate::commitment::{Commitment, SignedCommitment}; +use alloc::vec::Vec; /// A light form of [SignedCommitment]. /// diff --git a/substrate/primitives/consensus/common/Cargo.toml b/substrate/primitives/consensus/common/Cargo.toml index 00c2fca5e22f05cb5fd0f00880ca346ba012dd24..90aeadd5055e6e17107b70070ca30e17dd6b1c7c 100644 --- a/substrate/primitives/consensus/common/Cargo.toml +++ b/substrate/primitives/consensus/common/Cargo.toml @@ -17,17 +17,17 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -async-trait = "0.1.74" -futures = { version = "0.3.21", features = ["thread-pool"] } -log = "0.4.17" -thiserror = "1.0.48" +async-trait = "0.1.79" +futures = { version = "0.3.30", features = ["thread-pool"] } +log = { workspace = true, default-features = true } +thiserror = { workspace = true } sp-core = { path = "../../core" } sp-inherents = { path = "../../inherents" } sp-runtime = { path = "../../runtime" } sp-state-machine = { path = "../../state-machine" } [dev-dependencies] -futures = "0.3.21" +futures = "0.3.30" sp-test-primitives = { path = "../../test-primitives" } [features] diff --git a/substrate/primitives/consensus/common/src/lib.rs b/substrate/primitives/consensus/common/src/lib.rs index 6505d005deb8df42c04252be85afd7e7b55924b9..01d3b7a24f9c143201f07092c7484e72f513d8f0 100644 --- a/substrate/primitives/consensus/common/src/lib.rs +++ b/substrate/primitives/consensus/common/src/lib.rs @@ -182,7 +182,7 @@ pub trait Proposer { + Send + Unpin + 'static; - /// The supported proof recording by the implementator of this trait. See [`ProofRecording`] + /// The supported proof recording by the implementor of this trait. See [`ProofRecording`] /// for more information. type ProofRecording: self::ProofRecording + Send + Sync + 'static; /// The proof type used by [`Self::ProofRecording`]. diff --git a/substrate/primitives/consensus/grandpa/Cargo.toml b/substrate/primitives/consensus/grandpa/Cargo.toml index de02b1890703c22265c8f2e71a43a473d926b02a..6c228383d003fbafa879a88577b37609ce9d0278 100644 --- a/substrate/primitives/consensus/grandpa/Cargo.toml +++ b/substrate/primitives/consensus/grandpa/Cargo.toml @@ -19,15 +19,14 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } grandpa = { package = "finality-grandpa", version = "0.16.2", default-features = false, features = ["derive-codec"] } -log = { version = "0.4.17", default-features = false } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.195", features = ["alloc", "derive"], default-features = false, optional = true } +log = { workspace = true } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +serde = { features = ["alloc", "derive"], optional = true, workspace = true } sp-api = { path = "../../api", default-features = false } sp-application-crypto = { path = "../../application-crypto", default-features = false } sp-core = { path = "../../core", default-features = false } sp-keystore = { path = "../../keystore", default-features = false, optional = true } sp-runtime = { path = "../../runtime", default-features = false } -sp-std = { path = "../../std", default-features = false } [features] default = ["std"] @@ -42,7 +41,6 @@ std = [ "sp-core/std", "sp-keystore/std", "sp-runtime/std", - "sp-std/std", ] # Serde support without relying on std features. diff --git a/substrate/primitives/consensus/grandpa/src/lib.rs b/substrate/primitives/consensus/grandpa/src/lib.rs index 1cf5504c5e7d1b0f17e248e6be45829e6ef15655..75ed81894c259ad7102b9b98bb3e6e29bea4cdcd 100644 --- a/substrate/primitives/consensus/grandpa/src/lib.rs +++ b/substrate/primitives/consensus/grandpa/src/lib.rs @@ -19,9 +19,12 @@ #![cfg_attr(not(feature = "std"), no_std)] +extern crate alloc; + #[cfg(feature = "serde")] use serde::Serialize; +use alloc::vec::Vec; use codec::{Codec, Decode, Encode}; use scale_info::TypeInfo; #[cfg(feature = "std")] @@ -30,7 +33,6 @@ use sp_runtime::{ traits::{Header as HeaderT, NumberFor}, ConsensusEngineId, RuntimeDebug, }; -use sp_std::vec::Vec; /// The log target to be used by client code. pub const CLIENT_LOG_TARGET: &str = "grandpa"; diff --git a/substrate/primitives/consensus/pow/Cargo.toml b/substrate/primitives/consensus/pow/Cargo.toml index 8147b063f6d3324b1e942d825c272f94720854c0..7a884f865fbeea0d6e7c0fd6a6699e0a5b513769 100644 --- a/substrate/primitives/consensus/pow/Cargo.toml +++ b/substrate/primitives/consensus/pow/Cargo.toml @@ -20,7 +20,6 @@ codec = { package = "parity-scale-codec", version = "3.6.1", default-features = sp-api = { path = "../../api", default-features = false } sp-core = { path = "../../core", default-features = false } sp-runtime = { path = "../../runtime", default-features = false } -sp-std = { path = "../../std", default-features = false } [features] default = ["std"] @@ -29,5 +28,4 @@ std = [ "sp-api/std", "sp-core/std", "sp-runtime/std", - "sp-std/std", ] diff --git a/substrate/primitives/consensus/pow/src/lib.rs b/substrate/primitives/consensus/pow/src/lib.rs index f37aae1c5c012900b4220e2cdf9e1ab5edd188b0..c14d23cf068f23e48d03544e5a16b775245f451c 100644 --- a/substrate/primitives/consensus/pow/src/lib.rs +++ b/substrate/primitives/consensus/pow/src/lib.rs @@ -19,9 +19,12 @@ #![cfg_attr(not(feature = "std"), no_std)] +extern crate alloc; + +#[cfg(not(feature = "std"))] +use alloc::vec::Vec; use codec::Decode; use sp_runtime::ConsensusEngineId; -use sp_std::vec::Vec; /// The `ConsensusEngineId` of PoW. pub const POW_ENGINE_ID: ConsensusEngineId = [b'p', b'o', b'w', b'_']; diff --git a/substrate/primitives/consensus/sassafras/Cargo.toml b/substrate/primitives/consensus/sassafras/Cargo.toml index 6d44bc6c5a8fe9b879962e1ddb102b5638d9dc1b..07304ed9b2401bfb40ac321ba476be0fd304d14e 100644 --- a/substrate/primitives/consensus/sassafras/Cargo.toml +++ b/substrate/primitives/consensus/sassafras/Cargo.toml @@ -19,14 +19,13 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] scale-codec = { package = "parity-scale-codec", version = "3.2.2", default-features = false } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.195", default-features = false, features = ["derive"], optional = true } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +serde = { features = ["derive"], optional = true, workspace = true } sp-api = { path = "../../api", default-features = false } sp-application-crypto = { path = "../../application-crypto", default-features = false, features = ["bandersnatch-experimental"] } sp-consensus-slots = { path = "../slots", default-features = false } sp-core = { path = "../../core", default-features = false, features = ["bandersnatch-experimental"] } sp-runtime = { path = "../../runtime", default-features = false } -sp-std = { path = "../../std", default-features = false } [features] default = ["std"] @@ -39,7 +38,6 @@ std = [ "sp-consensus-slots/std", "sp-core/std", "sp-runtime/std", - "sp-std/std", ] # Serde support without relying on std features. diff --git a/substrate/primitives/consensus/sassafras/src/digests.rs b/substrate/primitives/consensus/sassafras/src/digests.rs index 5274f1309d8251977fe3bf30f2209bf8538f5e19..64190a41ce1c95d5251f25f0991daf2bed4cc802 100644 --- a/substrate/primitives/consensus/sassafras/src/digests.rs +++ b/substrate/primitives/consensus/sassafras/src/digests.rs @@ -25,8 +25,9 @@ use crate::{ use scale_codec::{Decode, Encode, MaxEncodedLen}; use scale_info::TypeInfo; +#[cfg(not(feature = "std"))] +use alloc::vec::Vec; use sp_runtime::{DigestItem, RuntimeDebug}; -use sp_std::vec::Vec; /// Epoch slot claim digest entry. /// diff --git a/substrate/primitives/consensus/sassafras/src/lib.rs b/substrate/primitives/consensus/sassafras/src/lib.rs index 1752f76588635f5a80fddabc86023a439361643c..c1fea74d04522896b249979caac7658cb5f8a6a8 100644 --- a/substrate/primitives/consensus/sassafras/src/lib.rs +++ b/substrate/primitives/consensus/sassafras/src/lib.rs @@ -21,11 +21,13 @@ #![forbid(unsafe_code, missing_docs, unused_variables, unused_imports)] #![cfg_attr(not(feature = "std"), no_std)] +extern crate alloc; + +use alloc::vec::Vec; use scale_codec::{Decode, Encode, MaxEncodedLen}; use scale_info::TypeInfo; use sp_core::crypto::KeyTypeId; use sp_runtime::{ConsensusEngineId, RuntimeDebug}; -use sp_std::vec::Vec; pub use sp_consensus_slots::{Slot, SlotDuration}; diff --git a/substrate/primitives/consensus/sassafras/src/ticket.rs b/substrate/primitives/consensus/sassafras/src/ticket.rs index dc0a61990d3ea7248a4bbbbf69a6eed72942719f..345de99be28d88ec5125067f0eaaa838b13373fd 100644 --- a/substrate/primitives/consensus/sassafras/src/ticket.rs +++ b/substrate/primitives/consensus/sassafras/src/ticket.rs @@ -115,7 +115,7 @@ mod tests { let threshold = ticket_id_threshold(redundancy, slots, attempts, validators); let threshold = threshold as f64 / TicketId::MAX as f64; - // We expect that the total number of tickets allowed to be submited + // We expect that the total number of tickets allowed to be submitted // is slots*redundancy let avt = ((attempts * validators) as f64 * threshold) as u32; assert_eq!(avt, slots * redundancy); diff --git a/substrate/primitives/consensus/sassafras/src/vrf.rs b/substrate/primitives/consensus/sassafras/src/vrf.rs index 5deacd8e9945bf9dbcc05a0664029e3a2c57c1c0..537cff52ab6fb7e42c0309431e5dc4b5a767716a 100644 --- a/substrate/primitives/consensus/sassafras/src/vrf.rs +++ b/substrate/primitives/consensus/sassafras/src/vrf.rs @@ -18,9 +18,10 @@ //! Utilities related to VRF input, pre-output and signatures. use crate::{Randomness, TicketBody, TicketId}; +#[cfg(not(feature = "std"))] +use alloc::vec::Vec; use scale_codec::Encode; use sp_consensus_slots::Slot; -use sp_std::vec::Vec; pub use sp_core::bandersnatch::{ ring_vrf::{RingProver, RingVerifier, RingVerifierData, RingVrfSignature}, @@ -100,7 +101,7 @@ pub fn make_ticket_id(input: &VrfInput, pre_output: &VrfPreOutput) -> TicketId { u128::from_le_bytes(bytes) } -/// Make revealed key seed from a given VRF input and pre-ouput. +/// Make revealed key seed from a given VRF input and pre-output. /// /// Input should have been obtained via [`revealed_key_input`]. /// Pre-output should have been obtained from the input directly using the vrf diff --git a/substrate/primitives/consensus/slots/Cargo.toml b/substrate/primitives/consensus/slots/Cargo.toml index fadcd1215eee8f4780457ec50052413512812af0..a8b12900617960f953726d1b4eac5bf585b1f6bf 100644 --- a/substrate/primitives/consensus/slots/Cargo.toml +++ b/substrate/primitives/consensus/slots/Cargo.toml @@ -17,9 +17,8 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive", "max-encoded-len"] } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0", default-features = false, features = ["alloc", "derive"], optional = true } -sp-std = { path = "../../std", default-features = false } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +serde = { features = ["alloc", "derive"], optional = true, workspace = true } sp-timestamp = { path = "../../timestamp", default-features = false } [features] @@ -28,7 +27,6 @@ std = [ "codec/std", "scale-info/std", "serde/std", - "sp-std/std", "sp-timestamp/std", ] diff --git a/substrate/primitives/consensus/slots/src/lib.rs b/substrate/primitives/consensus/slots/src/lib.rs index 23cb7f7365adaa431e84c268c3210f4c6dfa42c8..eb3b3d3a449f2f8279f7183446941c4dedd2610a 100644 --- a/substrate/primitives/consensus/slots/src/lib.rs +++ b/substrate/primitives/consensus/slots/src/lib.rs @@ -155,9 +155,9 @@ impl SlotDuration { #[cfg(feature = "std")] impl SlotDuration { - /// Returns `self` as [`sp_std::time::Duration`]. - pub const fn as_duration(&self) -> sp_std::time::Duration { - sp_std::time::Duration::from_millis(self.0) + /// Returns `self` as [`core::time::Duration`]. + pub const fn as_duration(&self) -> core::time::Duration { + core::time::Duration::from_millis(self.0) } } diff --git a/substrate/primitives/core/Cargo.toml b/substrate/primitives/core/Cargo.toml index f5914049f41a6c5eefe0b4ebd362d7d762c2e101..833b2af95cd10c5b533f56affb7a50f237d54905 100644 --- a/substrate/primitives/core/Cargo.toml +++ b/substrate/primitives/core/Cargo.toml @@ -18,8 +18,8 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive", "max-encoded-len"] } scale-info = { version = "2.5.0", default-features = false, features = ["derive"] } -log = { version = "0.4.17", default-features = false } -serde = { version = "1.0.195", optional = true, default-features = false, features = ["alloc", "derive"] } +log = { workspace = true } +serde = { optional = true, features = ["alloc", "derive"], workspace = true } bounded-collections = { version = "0.2.0", default-features = false } primitive-types = { version = "0.12.0", default-features = false, features = ["codec", "scale-info"] } impl-serde = { version = "0.4.0", default-features = false, optional = true } @@ -27,34 +27,38 @@ hash-db = { version = "0.16.0", default-features = false } hash256-std-hasher = { version = "0.15.2", default-features = false } bs58 = { version = "0.5.0", default-features = false, optional = true } rand = { version = "0.8.5", features = ["small_rng"], optional = true } -substrate-bip39 = { version = "0.4.5", optional = true } -bip39 = { version = "2.0.0", default-features = false } +substrate-bip39 = { path = "../../utils/substrate-bip39", default-features = false } +# personal fork here as workaround for: https://github.com/rust-bitcoin/rust-bip39/pull/64 +bip39 = { package = "parity-bip39", version = "2.0.1", default-features = false, features = ["alloc"] } zeroize = { version = "1.4.3", default-features = false } -secrecy = { version = "0.8.0", default-features = false } +secrecy = { version = "0.8.0", default-features = false, features = ["alloc"] } parking_lot = { version = "0.12.1", optional = true } ss58-registry = { version = "1.34.0", default-features = false } sp-std = { path = "../std", default-features = false } sp-debug-derive = { path = "../debug-derive", default-features = false } sp-storage = { path = "../storage", default-features = false } sp-externalities = { path = "../externalities", optional = true } -futures = { version = "0.3.21", optional = true } +futures = { version = "0.3.30", optional = true } dyn-clonable = { version = "0.9.0", optional = true } -thiserror = { version = "1.0.48", optional = true } +thiserror = { optional = true, workspace = true } tracing = { version = "0.1.29", optional = true } bitflags = "1.3" paste = "1.0.7" itertools = { version = "0.10.3", optional = true } # full crypto -array-bytes = { version = "6.1", optional = true } -ed25519-zebra = { version = "3.1.0", default-features = false, optional = true } +array-bytes = { version = "6.1" } +ed25519-zebra = { version = "3.1.0", default-features = false } blake2 = { version = "0.10.4", default-features = false, optional = true } -libsecp256k1 = { version = "0.7", default-features = false, features = ["static-context"], optional = true } +libsecp256k1 = { version = "0.7", default-features = false, features = ["static-context"] } schnorrkel = { version = "0.11.4", features = ["preaudit_deprecated"], default-features = false } merlin = { version = "3.0", default-features = false } -secp256k1 = { version = "0.28.0", default-features = false, features = ["alloc", "recovery"], optional = true } -sp-crypto-hashing = { path = "../crypto/hashing", default-features = false, optional = true } +sp-crypto-hashing = { path = "../crypto/hashing", default-features = false } sp-runtime-interface = { path = "../runtime-interface", default-features = false } +# k256 crate, better portability, intended to be used in substrate-runtimes (no-std) +k256 = { version = "0.13.3", features = ["alloc", "ecdsa"], default-features = false } +# secp256k1 crate, better performance, intended to be used on host side (std) +secp256k1 = { version = "0.28.0", default-features = false, features = ["alloc", "recovery"], optional = true } # bls crypto w3f-bls = { version = "0.1.3", default-features = false, optional = true } @@ -63,7 +67,7 @@ bandersnatch_vrfs = { git = "https://github.com/w3f/ring-vrf", rev = "e9782f9", [dev-dependencies] criterion = "0.4.0" -serde_json = "1.0.111" +serde_json = { workspace = true, default-features = true } lazy_static = "1.4.0" regex = "1.6.0" @@ -76,8 +80,8 @@ bench = false [features] default = ["std"] + std = [ - "array-bytes", "bandersnatch_vrfs?/std", "bip39/rand", "bip39/std", @@ -94,6 +98,7 @@ std = [ "hash256-std-hasher/std", "impl-serde/std", "itertools", + "k256/std", "libsecp256k1/std", "log/std", "merlin/std", @@ -107,7 +112,6 @@ std = [ "schnorrkel/std", "secp256k1/global-context", "secp256k1/std", - "secrecy/alloc", "serde/std", "sp-crypto-hashing/std", "sp-debug-derive/std", @@ -116,7 +120,7 @@ std = [ "sp-std/std", "sp-storage/std", "ss58-registry/std", - "substrate-bip39", + "substrate-bip39/std", "thiserror", "tracing", "w3f-bls?/std", @@ -126,16 +130,14 @@ std = [ # Serde support without relying on std features. serde = [ - "array-bytes", "blake2", "bounded-collections/serde", "bs58/alloc", "dep:serde", "impl-serde", + "k256/serde", "primitive-types/serde_no_std", "scale-info/serde", - "secrecy/alloc", - "sp-crypto-hashing", "sp-storage/serde", ] @@ -143,12 +145,7 @@ serde = [ # or Intel SGX. # For the regular wasm runtime builds this should not be used. full_crypto = [ - "array-bytes", "blake2", - "ed25519-zebra", - "libsecp256k1", - "secp256k1", - "sp-crypto-hashing", "sp-runtime-interface/disable_target_static_assertions", ] diff --git a/substrate/primitives/core/check-features-variants.sh b/substrate/primitives/core/check-features-variants.sh new file mode 100755 index 0000000000000000000000000000000000000000..6d28212065a623096202f9da483aead71806c513 --- /dev/null +++ b/substrate/primitives/core/check-features-variants.sh @@ -0,0 +1,13 @@ +#!/usr/bin/env -S bash -eux + +export RUSTFLAGS="-Cdebug-assertions=y -Dwarnings" +T=wasm32-unknown-unknown + +cargo check --target=$T --release --no-default-features --features="bls-experimental" +cargo check --target=$T --release --no-default-features --features="full_crypto,bls-experimental" +cargo check --target=$T --release --no-default-features --features="bandersnatch-experimental" +cargo check --target=$T --release --no-default-features --features="full_crypto,serde,bandersnatch-experimental" +cargo check --target=$T --release --no-default-features --features="full_crypto,serde" +cargo check --target=$T --release --no-default-features --features="full_crypto" +cargo check --target=$T --release --no-default-features --features="serde" +cargo check --target=$T --release --no-default-features diff --git a/substrate/primitives/core/src/address_uri.rs b/substrate/primitives/core/src/address_uri.rs index 211d47c0093d8800646c9a47273128af18edbad5..d44f3c0c87c40dd447ca0e3123b74f9464408666 100644 --- a/substrate/primitives/core/src/address_uri.rs +++ b/substrate/primitives/core/src/address_uri.rs @@ -17,7 +17,7 @@ //! Little util for parsing an address URI. Replaces regular expressions. -#[cfg(all(not(feature = "std"), any(feature = "serde", feature = "full_crypto")))] +#[cfg(not(feature = "std"))] use sp_std::{ alloc::string::{String, ToString}, vec::Vec, @@ -85,7 +85,7 @@ impl Error { /// Complementary error information. /// -/// Strucutre contains complementary information about parsing address URI string. +/// Structure contains complementary information about parsing address URI string. /// String contains a copy of an original URI string, 0-based integer indicates position of invalid /// character. #[derive(Debug, PartialEq, Eq, Clone)] diff --git a/substrate/primitives/core/src/bandersnatch.rs b/substrate/primitives/core/src/bandersnatch.rs index 96b0ff19e561a41a43584142e62f8bc6d8e886b1..71ee2da5383489a42f1c3a961089b031e2764964 100644 --- a/substrate/primitives/core/src/bandersnatch.rs +++ b/substrate/primitives/core/src/bandersnatch.rs @@ -20,209 +20,67 @@ //! //! The primitive can operate both as a regular VRF or as an anonymized Ring VRF. -#[cfg(feature = "serde")] -use crate::crypto::Ss58Codec; +#[cfg(feature = "full_crypto")] +use crate::crypto::VrfSecret; use crate::crypto::{ - ByteArray, CryptoType, CryptoTypeId, Derive, Public as TraitPublic, UncheckedFrom, VrfPublic, + ByteArray, CryptoType, CryptoTypeId, DeriveError, DeriveJunction, Pair as TraitPair, + PublicBytes, SecretStringError, SignatureBytes, UncheckedFrom, VrfPublic, }; -#[cfg(feature = "full_crypto")] -use crate::crypto::{DeriveError, DeriveJunction, Pair as TraitPair, SecretStringError, VrfSecret}; -#[cfg(feature = "serde")] -use serde::{de, Deserialize, Deserializer, Serialize, Serializer}; -#[cfg(all(not(feature = "std"), feature = "serde"))] -use sp_std::alloc::{format, string::String}; -use bandersnatch_vrfs::CanonicalSerialize; -#[cfg(feature = "full_crypto")] -use bandersnatch_vrfs::SecretKey; +use bandersnatch_vrfs::{CanonicalSerialize, SecretKey}; use codec::{Decode, Encode, EncodeLike, MaxEncodedLen}; use scale_info::TypeInfo; -use sp_runtime_interface::pass_by::PassByInner; use sp_std::{vec, vec::Vec}; /// Identifier used to match public keys against bandersnatch-vrf keys. pub const CRYPTO_ID: CryptoTypeId = CryptoTypeId(*b"band"); /// Context used to produce a plain signature without any VRF input/output. -#[cfg(feature = "full_crypto")] pub const SIGNING_CTX: &[u8] = b"BandersnatchSigningContext"; -#[cfg(feature = "full_crypto")] -const SEED_SERIALIZED_SIZE: usize = 32; +/// The byte length of secret key seed. +pub const SEED_SERIALIZED_SIZE: usize = 32; -const PUBLIC_SERIALIZED_SIZE: usize = 33; -const SIGNATURE_SERIALIZED_SIZE: usize = 65; -const PREOUT_SERIALIZED_SIZE: usize = 33; - -/// Bandersnatch public key. -#[cfg_attr(feature = "full_crypto", derive(Hash))] -#[derive( - Clone, - Copy, - PartialEq, - Eq, - PartialOrd, - Ord, - Encode, - Decode, - PassByInner, - MaxEncodedLen, - TypeInfo, -)] -pub struct Public(pub [u8; PUBLIC_SERIALIZED_SIZE]); - -impl UncheckedFrom<[u8; PUBLIC_SERIALIZED_SIZE]> for Public { - fn unchecked_from(raw: [u8; PUBLIC_SERIALIZED_SIZE]) -> Self { - Public(raw) - } -} - -impl AsRef<[u8; PUBLIC_SERIALIZED_SIZE]> for Public { - fn as_ref(&self) -> &[u8; PUBLIC_SERIALIZED_SIZE] { - &self.0 - } -} - -impl AsRef<[u8]> for Public { - fn as_ref(&self) -> &[u8] { - &self.0[..] - } -} - -impl AsMut<[u8]> for Public { - fn as_mut(&mut self) -> &mut [u8] { - &mut self.0[..] - } -} +/// The byte length of serialized public key. +pub const PUBLIC_SERIALIZED_SIZE: usize = 33; -impl TryFrom<&[u8]> for Public { - type Error = (); +/// The byte length of serialized signature. +pub const SIGNATURE_SERIALIZED_SIZE: usize = 65; - fn try_from(data: &[u8]) -> Result { - if data.len() != PUBLIC_SERIALIZED_SIZE { - return Err(()) - } - let mut r = [0u8; PUBLIC_SERIALIZED_SIZE]; - r.copy_from_slice(data); - Ok(Self::unchecked_from(r)) - } -} +/// The byte length of serialized pre-output. +pub const PREOUT_SERIALIZED_SIZE: usize = 33; -impl ByteArray for Public { - const LEN: usize = PUBLIC_SERIALIZED_SIZE; -} +#[doc(hidden)] +pub struct BandersnatchTag; -impl TraitPublic for Public {} +/// Bandersnatch public key. +pub type Public = PublicBytes; impl CryptoType for Public { - #[cfg(feature = "full_crypto")] type Pair = Pair; } -impl Derive for Public {} - -impl sp_std::fmt::Debug for Public { - #[cfg(feature = "std")] - fn fmt(&self, f: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result { - let s = self.to_ss58check(); - write!(f, "{} ({}...)", crate::hexdisplay::HexDisplay::from(&self.as_ref()), &s[0..8]) - } - - #[cfg(not(feature = "std"))] - fn fmt(&self, _: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result { - Ok(()) - } -} - -#[cfg(feature = "serde")] -impl Serialize for Public { - fn serialize(&self, serializer: S) -> Result { - serializer.serialize_str(&self.to_ss58check()) - } -} - -#[cfg(feature = "serde")] -impl<'de> Deserialize<'de> for Public { - fn deserialize>(deserializer: D) -> Result { - Public::from_ss58check(&String::deserialize(deserializer)?) - .map_err(|e| de::Error::custom(format!("{:?}", e))) - } -} - /// Bandersnatch signature. /// /// The signature is created via the [`VrfSecret::vrf_sign`] using [`SIGNING_CTX`] as transcript /// `label`. -#[cfg_attr(feature = "full_crypto", derive(Hash))] -#[derive(Clone, Copy, PartialEq, Eq, Encode, Decode, PassByInner, MaxEncodedLen, TypeInfo)] -pub struct Signature([u8; SIGNATURE_SERIALIZED_SIZE]); - -impl UncheckedFrom<[u8; SIGNATURE_SERIALIZED_SIZE]> for Signature { - fn unchecked_from(raw: [u8; SIGNATURE_SERIALIZED_SIZE]) -> Self { - Signature(raw) - } -} - -impl AsRef<[u8]> for Signature { - fn as_ref(&self) -> &[u8] { - &self.0[..] - } -} - -impl AsMut<[u8]> for Signature { - fn as_mut(&mut self) -> &mut [u8] { - &mut self.0[..] - } -} - -impl TryFrom<&[u8]> for Signature { - type Error = (); - - fn try_from(data: &[u8]) -> Result { - if data.len() != SIGNATURE_SERIALIZED_SIZE { - return Err(()) - } - let mut r = [0u8; SIGNATURE_SERIALIZED_SIZE]; - r.copy_from_slice(data); - Ok(Self::unchecked_from(r)) - } -} - -impl ByteArray for Signature { - const LEN: usize = SIGNATURE_SERIALIZED_SIZE; -} +pub type Signature = SignatureBytes; impl CryptoType for Signature { - #[cfg(feature = "full_crypto")] type Pair = Pair; } -impl sp_std::fmt::Debug for Signature { - #[cfg(feature = "std")] - fn fmt(&self, f: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result { - write!(f, "{}", crate::hexdisplay::HexDisplay::from(&self.0)) - } - - #[cfg(not(feature = "std"))] - fn fmt(&self, _: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result { - Ok(()) - } -} - /// The raw secret seed, which can be used to reconstruct the secret [`Pair`]. -#[cfg(feature = "full_crypto")] type Seed = [u8; SEED_SERIALIZED_SIZE]; /// Bandersnatch secret key. -#[cfg(feature = "full_crypto")] #[derive(Clone)] pub struct Pair { secret: SecretKey, seed: Seed, } -#[cfg(feature = "full_crypto")] impl Pair { /// Get the key seed. pub fn seed(&self) -> Seed { @@ -230,7 +88,6 @@ impl Pair { } } -#[cfg(feature = "full_crypto")] impl TraitPair for Pair { type Seed = Seed; type Public = Public; @@ -287,6 +144,7 @@ impl TraitPair for Pair { /// the constant label [`SIGNING_CTX`] and `data` without any additional data. /// /// See [`vrf::VrfSignData`] for additional details. + #[cfg(feature = "full_crypto")] fn sign(&self, data: &[u8]) -> Signature { let data = vrf::VrfSignData::new_unchecked(SIGNING_CTX, &[data], None); self.vrf_sign(&data).signature @@ -305,7 +163,6 @@ impl TraitPair for Pair { } } -#[cfg(feature = "full_crypto")] impl CryptoType for Pair { type Pair = Pair; } @@ -392,7 +249,7 @@ pub mod vrf { /// /// The `transcript` summarizes a set of messages which are defining a particular /// protocol by automating the Fiat-Shamir transform for challenge generation. - /// A good explaination of the topic can be found in Merlin [docs](https://merlin.cool/) + /// A good explanation of the topic can be found in Merlin [docs](https://merlin.cool/) /// /// The `inputs` is a sequence of [`VrfInput`]s which, during the signing procedure, are /// first transformed to [`VrfPreOutput`]s. Both inputs and pre-outputs are then appended to @@ -550,8 +407,7 @@ pub mod vrf { thin_signature.preouts.into_iter().map(VrfPreOutput).collect(); let pre_outputs = VrfIosVec::truncate_from(pre_outputs); - let mut signature = - VrfSignature { signature: Signature([0; SIGNATURE_SERIALIZED_SIZE]), pre_outputs }; + let mut signature = VrfSignature { signature: Signature::default(), pre_outputs }; thin_signature .proof @@ -590,7 +446,7 @@ pub mod vrf { // This is another hack used because backend signature type is generic over // the number of ios. let Ok(proof) = ThinVrfSignature::<0>::deserialize_compressed_unchecked( - signature.signature.as_ref(), + signature.signature.as_slice(), ) .map(|s| s.proof) else { return false @@ -985,6 +841,19 @@ mod tests { assert!(res.is_err()); } + #[test] + fn generate_with_phrase_should_be_recoverable_with_from_string() { + let (pair, phrase, seed) = Pair::generate_with_phrase(None); + let repair_seed = Pair::from_seed_slice(seed.as_ref()).expect("seed slice is valid"); + assert_eq!(pair.public(), repair_seed.public()); + let (repair_phrase, reseed) = + Pair::from_phrase(phrase.as_ref(), None).expect("seed slice is valid"); + assert_eq!(seed, reseed); + assert_eq!(pair.public(), repair_phrase.public()); + let repair_string = Pair::from_string(phrase.as_str(), None).expect("seed slice is valid"); + assert_eq!(pair.public(), repair_string.public()); + } + #[test] fn sign_verify() { let pair = Pair::from_seed(DEV_SEED); diff --git a/substrate/primitives/core/src/bls.rs b/substrate/primitives/core/src/bls.rs index 452c6372d16b3b2dccf60ac0e7bdde01f24f8cc1..bb04babb3f180f3728c3a0e8159b725aeb7a2d47 100644 --- a/substrate/primitives/core/src/bls.rs +++ b/substrate/primitives/core/src/bls.rs @@ -15,31 +15,25 @@ // See the License for the specific language governing permissions and // limitations under the License. -//! Simple BLS (Boneh–Lynn–Shacham) Signature API. +//! BLS (Boneh–Lynn–Shacham) Signature along with efficiently verifiable Chaum-Pedersen proof API. +//! Signatures are implemented according to +//! [Efficient Aggregatable BLS Signatures with Chaum-Pedersen Proofs](https://eprint.iacr.org/2022/1611) +//! Hash-to-BLS-curve is using Simplified SWU for AB == 0 +//! [RFC 9380](https://datatracker.ietf.org/doc/rfc9380/) Sect 6.6.3. +//! Chaum-Pedersen proof uses the same hash-to-field specified in RFC 9380 for the field of the BLS +//! curve. + +use crate::crypto::{ + CryptoType, DeriveError, DeriveJunction, Pair as TraitPair, PublicBytes, SecretStringError, + SignatureBytes, UncheckedFrom, +}; -#[cfg(feature = "serde")] -use crate::crypto::Ss58Codec; -use crate::crypto::{ByteArray, CryptoType, Derive, Public as TraitPublic, UncheckedFrom}; -#[cfg(feature = "full_crypto")] -use crate::crypto::{DeriveError, DeriveJunction, Pair as TraitPair, SecretStringError}; - -#[cfg(feature = "full_crypto")] use sp_std::vec::Vec; -use codec::{Decode, Encode, MaxEncodedLen}; -use scale_info::TypeInfo; - -#[cfg(feature = "serde")] -use serde::{de, Deserialize, Deserializer, Serialize, Serializer}; -#[cfg(all(not(feature = "std"), feature = "serde"))] -use sp_std::alloc::{format, string::String}; - -use w3f_bls::{DoublePublicKey, DoubleSignature, EngineBLS, SerializableToBytes, TinyBLS381}; -#[cfg(feature = "full_crypto")] -use w3f_bls::{DoublePublicKeyScheme, Keypair, Message, SecretKey}; - -use sp_runtime_interface::pass_by::{self, PassBy, PassByInner}; -use sp_std::{convert::TryFrom, marker::PhantomData, ops::Deref}; +use w3f_bls::{ + DoublePublicKey, DoublePublicKeyScheme, DoubleSignature, EngineBLS, Keypair, Message, + SecretKey, SerializableToBytes, TinyBLS381, +}; /// BLS-377 specialized types pub mod bls377 { @@ -50,8 +44,10 @@ pub mod bls377 { /// An identifier used to match public keys against BLS12-377 keys pub const CRYPTO_ID: CryptoTypeId = CryptoTypeId(*b"bls7"); + #[doc(hidden)] + pub type Bls377Tag = TinyBLS377; + /// BLS12-377 key pair. - #[cfg(feature = "full_crypto")] pub type Pair = super::Pair; /// BLS12-377 public key. pub type Public = super::Public; @@ -73,7 +69,6 @@ pub mod bls381 { pub const CRYPTO_ID: CryptoTypeId = CryptoTypeId(*b"bls8"); /// BLS12-381 key pair. - #[cfg(feature = "full_crypto")] pub type Pair = super::Pair; /// BLS12-381 public key. pub type Public = super::Public; @@ -90,7 +85,6 @@ trait BlsBound: EngineBLS + HardJunctionId + Send + Sync + 'static {} impl BlsBound for T {} /// Secret key serialized size -#[cfg(feature = "full_crypto")] const SECRET_KEY_SERIALIZED_SIZE: usize = as SerializableToBytes>::SERIALIZED_BYTES_SIZE; @@ -107,314 +101,28 @@ pub const SIGNATURE_SERIALIZED_SIZE: usize = /// It's not called a "secret key" because ring doesn't expose the secret keys /// of the key pair (yeah, dumb); as such we're forced to remember the seed manually if we /// will need it later (such as for HDKD). -#[cfg(feature = "full_crypto")] type Seed = [u8; SECRET_KEY_SERIALIZED_SIZE]; -/// A public key. -#[derive(Copy, Encode, Decode, MaxEncodedLen, TypeInfo)] -#[scale_info(skip_type_params(T))] -pub struct Public { - inner: [u8; PUBLIC_KEY_SERIALIZED_SIZE], - _phantom: PhantomData T>, -} - -impl Clone for Public { - fn clone(&self) -> Self { - Self { inner: self.inner, _phantom: PhantomData } - } -} - -impl PartialEq for Public { - fn eq(&self, other: &Self) -> bool { - self.inner == other.inner - } -} - -impl Eq for Public {} - -impl PartialOrd for Public { - fn partial_cmp(&self, other: &Self) -> Option { - Some(self.cmp(other)) - } -} - -impl Ord for Public { - fn cmp(&self, other: &Self) -> sp_std::cmp::Ordering { - self.inner.cmp(&other.inner) - } -} - -#[cfg(feature = "full_crypto")] -impl sp_std::hash::Hash for Public { - fn hash(&self, state: &mut H) { - self.inner.hash(state) - } -} - -impl ByteArray for Public { - const LEN: usize = PUBLIC_KEY_SERIALIZED_SIZE; -} - -impl PassByInner for Public { - type Inner = [u8; PUBLIC_KEY_SERIALIZED_SIZE]; - - fn into_inner(self) -> Self::Inner { - self.inner - } - - fn inner(&self) -> &Self::Inner { - &self.inner - } - - fn from_inner(inner: Self::Inner) -> Self { - Self { inner, _phantom: PhantomData } - } -} - -impl PassBy for Public { - type PassBy = pass_by::Inner; -} - -impl AsRef<[u8; PUBLIC_KEY_SERIALIZED_SIZE]> for Public { - fn as_ref(&self) -> &[u8; PUBLIC_KEY_SERIALIZED_SIZE] { - &self.inner - } -} - -impl AsRef<[u8]> for Public { - fn as_ref(&self) -> &[u8] { - &self.inner[..] - } -} - -impl AsMut<[u8]> for Public { - fn as_mut(&mut self) -> &mut [u8] { - &mut self.inner[..] - } -} - -impl Deref for Public { - type Target = [u8]; - - fn deref(&self) -> &Self::Target { - &self.inner - } -} - -impl TryFrom<&[u8]> for Public { - type Error = (); - - fn try_from(data: &[u8]) -> Result { - if data.len() != PUBLIC_KEY_SERIALIZED_SIZE { - return Err(()) - } - let mut r = [0u8; PUBLIC_KEY_SERIALIZED_SIZE]; - r.copy_from_slice(data); - Ok(Self::unchecked_from(r)) - } -} - -impl From> for [u8; PUBLIC_KEY_SERIALIZED_SIZE] { - fn from(x: Public) -> Self { - x.inner - } -} - -#[cfg(feature = "full_crypto")] -impl From> for Public { - fn from(x: Pair) -> Self { - x.public() - } -} - -impl UncheckedFrom<[u8; PUBLIC_KEY_SERIALIZED_SIZE]> for Public { - fn unchecked_from(data: [u8; PUBLIC_KEY_SERIALIZED_SIZE]) -> Self { - Public { inner: data, _phantom: PhantomData } - } -} - -#[cfg(feature = "std")] -impl std::str::FromStr for Public { - type Err = crate::crypto::PublicError; - - fn from_str(s: &str) -> Result { - Self::from_ss58check(s) - } -} - -#[cfg(feature = "std")] -impl std::fmt::Display for Public { - fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { - write!(f, "{}", self.to_ss58check()) - } -} - -#[cfg(feature = "std")] -impl sp_std::fmt::Debug for Public { - fn fmt(&self, f: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result { - let s = self.to_ss58check(); - write!(f, "{} ({}...)", crate::hexdisplay::HexDisplay::from(&self.inner), &s[0..8]) - } -} - -#[cfg(not(feature = "std"))] -impl sp_std::fmt::Debug for Public { - fn fmt(&self, _: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result { - Ok(()) - } -} - -#[cfg(feature = "serde")] -impl Serialize for Public { - fn serialize(&self, serializer: S) -> Result - where - S: Serializer, - { - serializer.serialize_str(&self.to_ss58check()) - } -} - -#[cfg(feature = "serde")] -impl<'de, T: BlsBound> Deserialize<'de> for Public { - fn deserialize(deserializer: D) -> Result - where - D: Deserializer<'de>, - { - Public::from_ss58check(&String::deserialize(deserializer)?) - .map_err(|e| de::Error::custom(format!("{:?}", e))) - } -} +#[doc(hidden)] +pub struct BlsTag; -impl TraitPublic for Public {} - -impl Derive for Public {} +/// A public key. +pub type Public = PublicBytes; impl CryptoType for Public { - #[cfg(feature = "full_crypto")] type Pair = Pair; } /// A generic BLS signature. -#[derive(Copy, Encode, Decode, MaxEncodedLen, TypeInfo)] -#[scale_info(skip_type_params(T))] -pub struct Signature { - inner: [u8; SIGNATURE_SERIALIZED_SIZE], - _phantom: PhantomData T>, -} - -impl Clone for Signature { - fn clone(&self) -> Self { - Self { inner: self.inner, _phantom: PhantomData } - } -} - -impl PartialEq for Signature { - fn eq(&self, other: &Self) -> bool { - self.inner == other.inner - } -} - -impl Eq for Signature {} - -#[cfg(feature = "full_crypto")] -impl sp_std::hash::Hash for Signature { - fn hash(&self, state: &mut H) { - self.inner.hash(state) - } -} - -impl ByteArray for Signature { - const LEN: usize = SIGNATURE_SERIALIZED_SIZE; -} - -impl TryFrom<&[u8]> for Signature { - type Error = (); - - fn try_from(data: &[u8]) -> Result { - if data.len() != SIGNATURE_SERIALIZED_SIZE { - return Err(()) - } - let mut inner = [0u8; SIGNATURE_SERIALIZED_SIZE]; - inner.copy_from_slice(data); - Ok(Signature::unchecked_from(inner)) - } -} - -#[cfg(feature = "serde")] -impl Serialize for Signature { - fn serialize(&self, serializer: S) -> Result - where - S: Serializer, - { - serializer.serialize_str(&array_bytes::bytes2hex("", self)) - } -} - -#[cfg(feature = "serde")] -impl<'de, T> Deserialize<'de> for Signature { - fn deserialize(deserializer: D) -> Result - where - D: Deserializer<'de>, - { - let signature_hex = array_bytes::hex2bytes(&String::deserialize(deserializer)?) - .map_err(|e| de::Error::custom(format!("{:?}", e)))?; - Signature::try_from(signature_hex.as_ref()) - .map_err(|e| de::Error::custom(format!("{:?}", e))) - } -} - -impl From> for [u8; SIGNATURE_SERIALIZED_SIZE] { - fn from(signature: Signature) -> [u8; SIGNATURE_SERIALIZED_SIZE] { - signature.inner - } -} - -impl AsRef<[u8; SIGNATURE_SERIALIZED_SIZE]> for Signature { - fn as_ref(&self) -> &[u8; SIGNATURE_SERIALIZED_SIZE] { - &self.inner - } -} - -impl AsRef<[u8]> for Signature { - fn as_ref(&self) -> &[u8] { - &self.inner[..] - } -} - -impl AsMut<[u8]> for Signature { - fn as_mut(&mut self) -> &mut [u8] { - &mut self.inner[..] - } -} - -impl sp_std::fmt::Debug for Signature { - #[cfg(feature = "std")] - fn fmt(&self, f: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result { - write!(f, "{}", crate::hexdisplay::HexDisplay::from(&self.inner)) - } - - #[cfg(not(feature = "std"))] - fn fmt(&self, _: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result { - Ok(()) - } -} - -impl UncheckedFrom<[u8; SIGNATURE_SERIALIZED_SIZE]> for Signature { - fn unchecked_from(data: [u8; SIGNATURE_SERIALIZED_SIZE]) -> Self { - Signature { inner: data, _phantom: PhantomData } - } -} +pub type Signature = SignatureBytes; impl CryptoType for Signature { - #[cfg(feature = "full_crypto")] type Pair = Pair; } /// A key pair. -#[cfg(feature = "full_crypto")] pub struct Pair(Keypair); -#[cfg(feature = "full_crypto")] impl Clone for Pair { fn clone(&self) -> Self { Pair(self.0.clone()) @@ -426,15 +134,13 @@ trait HardJunctionId { } /// Derive a single hard junction. -#[cfg(feature = "full_crypto")] fn derive_hard_junction(secret_seed: &Seed, cc: &[u8; 32]) -> Seed { + use codec::Encode; (T::ID, secret_seed, cc).using_encoded(sp_crypto_hashing::blake2_256) } -#[cfg(feature = "full_crypto")] impl Pair {} -#[cfg(feature = "full_crypto")] impl TraitPair for Pair { type Seed = Seed; type Public = Public; @@ -452,11 +158,12 @@ impl TraitPair for Pair { fn derive>( &self, path: Iter, - _seed: Option, + seed: Option, ) -> Result<(Self, Option), DeriveError> { - let mut acc: [u8; SECRET_KEY_SERIALIZED_SIZE] = self.0.secret.to_bytes().try_into().expect( - "Secret key serializer returns a vector of SECRET_KEY_SERIALIZED_SIZE size; qed", - ); + let mut acc: [u8; SECRET_KEY_SERIALIZED_SIZE] = + seed.unwrap_or(self.0.secret.to_bytes().try_into().expect( + "Secret key serializer returns a vector of SECRET_KEY_SERIALIZED_SIZE size; qed", + )); for j in path { match j { DeriveJunction::Soft(_cc) => return Err(DeriveError::SoftKeyInPath), @@ -473,6 +180,7 @@ impl TraitPair for Pair { Self::Public::unchecked_from(raw) } + #[cfg(feature = "full_crypto")] fn sign(&self, message: &[u8]) -> Self::Signature { let mut mutable_self = self.clone(); let r: [u8; SIGNATURE_SERIALIZED_SIZE] = @@ -494,7 +202,7 @@ impl TraitPair for Pair { Err(_) => return false, }; - let sig_array = match sig.inner[..].try_into() { + let sig_array = match sig.0[..].try_into() { Ok(s) => s, Err(_) => return false, }; @@ -516,15 +224,16 @@ impl TraitPair for Pair { } } -#[cfg(feature = "full_crypto")] impl CryptoType for Pair { type Pair = Pair; } // Test set exercising the BLS12-377 implementation #[cfg(test)] -mod test { +mod tests { use super::*; + #[cfg(feature = "serde")] + use crate::crypto::Ss58Codec; use crate::crypto::DEV_PHRASE; use bls377::{Pair, Signature}; @@ -544,7 +253,7 @@ mod test { "9d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f60", ); let pair = Pair::from_seed(&seed); - // we are using hash to field so this is not going to work + // we are using hash-to-field so this is not going to work // assert_eq!(pair.seed(), seed); let path = vec![DeriveJunction::Hard([0u8; 32])]; let derived = pair.derive(path.into_iter(), None).ok().unwrap().0; @@ -588,12 +297,12 @@ mod test { assert_eq!( public, Public::unchecked_from(array_bytes::hex2array_unchecked( - "6dc6be608fab3c6bd894a606be86db346cc170db85c733853a371f3db54ae1b12052c0888d472760c81b537572a26f00db865e5963aef8634f9917571c51b538b564b2a9ceda938c8b930969ee3b832448e08e33a79e9ddd28af419a3ce45300f5dbc768b067781f44f3fe05a19e6b07b1c4196151ec3f8ea37e4f89a8963030d2101e931276bb9ebe1f20102239d780" + "7a84ca8ce4c37c93c95ecee6a3c0c9a7b9c225093cf2f12dc4f69cbfb847ef9424a18f5755d5a742247d386ff2aabb806bcf160eff31293ea9616976628f77266c8a8cc1d8753be04197bd6cdd8c5c87a148f782c4c1568d599b48833fd539001e580cff64bbc71850605433fcd051f3afc3b74819786f815ffb5272030a8d03e5df61e6183f8fd8ea85f26defa83400" )) ); let message = b""; let signature = - array_bytes::hex2array_unchecked("bbb395bbdee1a35930912034f5fde3b36df2835a0536c865501b0675776a1d5931a3bea2e66eff73b2546c6af2061a8019223e4ebbbed661b2538e0f5823f2c708eb89c406beca8fcb53a5c13dbc7c0c42e4cf2be2942bba96ea29297915a06bd2b1b979c0e2ac8fd4ec684a6b5d110c" + array_bytes::hex2array_unchecked("d1e3013161991e142d8751017d4996209c2ff8a9ee160f373733eda3b4b785ba6edce9f45f87104bbe07aa6aa6eb2780aa705efb2c13d3b317d6409d159d23bdc7cdd5c2a832d1551cf49d811d49c901495e527dbd532e3a462335ce2686009104aba7bc11c5b22be78f3198d2727a0b" ); let expected_signature = Signature::unchecked_from(signature); println!("signature is {:?}", pair.sign(&message[..])); @@ -647,12 +356,30 @@ mod test { assert_eq!(pair1.public(), pair2.public()); } + #[test] + fn generate_with_phrase_should_be_recoverable_with_from_string() { + let (pair, phrase, seed) = Pair::generate_with_phrase(None); + let repair_seed = Pair::from_seed_slice(seed.as_ref()).expect("seed slice is valid"); + assert_eq!(pair.public(), repair_seed.public()); + assert_eq!(pair.to_raw_vec(), repair_seed.to_raw_vec()); + let (repair_phrase, reseed) = + Pair::from_phrase(phrase.as_ref(), None).expect("seed slice is valid"); + assert_eq!(seed, reseed); + assert_eq!(pair.public(), repair_phrase.public()); + assert_eq!(pair.to_raw_vec(), repair_seed.to_raw_vec()); + + let repair_string = Pair::from_string(phrase.as_str(), None).expect("seed slice is valid"); + assert_eq!(pair.public(), repair_string.public()); + assert_eq!(pair.to_raw_vec(), repair_seed.to_raw_vec()); + } + #[test] fn password_does_something() { let (pair1, phrase, _) = Pair::generate_with_phrase(Some("password")); let (pair2, _) = Pair::from_phrase(&phrase, None).unwrap(); assert_ne!(pair1.public(), pair2.public()); + assert_ne!(pair1.to_raw_vec(), pair2.to_raw_vec()); } #[test] diff --git a/substrate/primitives/core/src/crypto.rs b/substrate/primitives/core/src/crypto.rs index d8436d2a96cb1a380bc2534a94e50fa5940d4fc5..b13899fff5176eb76defa5ef32f840ad2c8c0ceb 100644 --- a/substrate/primitives/core/src/crypto.rs +++ b/substrate/primitives/core/src/crypto.rs @@ -18,7 +18,6 @@ //! Cryptographic utilities. use crate::{ed25519, sr25519}; -#[cfg(feature = "std")] use bip39::{Language, Mnemonic}; use codec::{Decode, Encode, MaxEncodedLen}; #[cfg(feature = "std")] @@ -26,7 +25,6 @@ use itertools::Itertools; #[cfg(feature = "std")] use rand::{rngs::OsRng, RngCore}; use scale_info::TypeInfo; -#[cfg(feature = "std")] pub use secrecy::{ExposeSecret, SecretString}; use sp_runtime_interface::pass_by::PassByInner; #[doc(hidden)] @@ -41,10 +39,10 @@ pub use ss58_registry::{from_known_address_format, Ss58AddressFormat, Ss58Addres /// Trait to zeroize a memory buffer. pub use zeroize::Zeroize; -#[cfg(feature = "std")] -pub use crate::address_uri::AddressUri; -#[cfg(any(feature = "std", feature = "full_crypto"))] -pub use crate::address_uri::Error as AddressUriError; +pub use crate::{ + address_uri::{AddressUri, Error as AddressUriError}, + crypto_bytes::{CryptoBytes, PublicBytes, SignatureBytes}, +}; /// The root phrase for our publicly known keys. pub const DEV_PHRASE: &str = @@ -82,7 +80,6 @@ impl> UncheckedInto for S { /// An error with the interpretation of a secret. #[cfg_attr(feature = "std", derive(thiserror::Error))] #[derive(Debug, Clone, PartialEq, Eq)] -#[cfg(feature = "full_crypto")] pub enum SecretStringError { /// The overall format was invalid (e.g. the seed phrase contained symbols). #[cfg_attr(feature = "std", error("Invalid format {0}"))] @@ -104,7 +101,6 @@ pub enum SecretStringError { InvalidPath, } -#[cfg(any(feature = "std", feature = "full_crypto"))] impl From for SecretStringError { fn from(e: AddressUriError) -> Self { Self::InvalidFormat(e) @@ -114,7 +110,6 @@ impl From for SecretStringError { /// An error when deriving a key. #[cfg_attr(feature = "std", derive(thiserror::Error))] #[derive(Debug, Clone, PartialEq, Eq)] -#[cfg(feature = "full_crypto")] pub enum DeriveError { /// A soft key was found in the path (and is unsupported). #[cfg_attr(feature = "std", error("Soft key in path"))] @@ -125,7 +120,6 @@ pub enum DeriveError { /// a new secret key from an existing secret key and, in the case of `SoftRaw` and `SoftIndex` /// a new public key from an existing public key. #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug, Encode, Decode)] -#[cfg(any(feature = "full_crypto", feature = "serde"))] pub enum DeriveJunction { /// Soft (vanilla) derivation. Public keys have a correspondent derivation. Soft([u8; JUNCTION_ID_LEN]), @@ -133,7 +127,6 @@ pub enum DeriveJunction { Hard([u8; JUNCTION_ID_LEN]), } -#[cfg(any(feature = "full_crypto", feature = "serde"))] impl DeriveJunction { /// Consume self to return a soft derive junction with the same chain code. pub fn soften(self) -> Self { @@ -192,7 +185,6 @@ impl DeriveJunction { } } -#[cfg(any(feature = "full_crypto", feature = "serde"))] impl> From for DeriveJunction { fn from(j: T) -> DeriveJunction { let j = j.as_ref(); @@ -493,8 +485,11 @@ pub trait ByteArray: AsRef<[u8]> + AsMut<[u8]> + for<'a> TryFrom<&'a [u8], Error } } -/// Trait suitable for typical cryptographic key public type. -pub trait Public: CryptoType + ByteArray + Derive + PartialEq + Eq + Clone + Send + Sync {} +/// Trait suitable for cryptographic public keys. +pub trait Public: CryptoType + ByteArray + PartialEq + Eq + Clone + Send + Sync + Derive {} + +/// Trait suitable for cryptographic signatures. +pub trait Signature: CryptoType + ByteArray + PartialEq + Eq + Clone + Send + Sync {} /// An opaque 32-byte cryptographic identifier. #[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Encode, Decode, MaxEncodedLen, TypeInfo)] @@ -656,32 +651,11 @@ pub use self::dummy::*; mod dummy { use super::*; - /// Dummy cryptography. Doesn't do anything. - #[derive(Clone, Hash, Default, Eq, PartialEq)] - pub struct Dummy; - - impl AsRef<[u8]> for Dummy { - fn as_ref(&self) -> &[u8] { - &b""[..] - } - } - - impl AsMut<[u8]> for Dummy { - fn as_mut(&mut self) -> &mut [u8] { - unsafe { - #[allow(mutable_transmutes)] - sp_std::mem::transmute::<_, &'static mut [u8]>(&b""[..]) - } - } - } - - impl<'a> TryFrom<&'a [u8]> for Dummy { - type Error = (); + #[doc(hidden)] + pub struct DummyTag; - fn try_from(_: &'a [u8]) -> Result { - Ok(Self) - } - } + /// Dummy cryptography. Doesn't do anything. + pub type Dummy = CryptoBytes<0, DummyTag>; impl CryptoType for Dummy { type Pair = Dummy; @@ -689,21 +663,10 @@ mod dummy { impl Derive for Dummy {} - impl ByteArray for Dummy { - const LEN: usize = 0; - fn from_slice(_: &[u8]) -> Result { - Ok(Self) - } - #[cfg(feature = "std")] - fn to_raw_vec(&self) -> Vec { - vec![] - } - fn as_slice(&self) -> &[u8] { - b"" - } - } impl Public for Dummy {} + impl Signature for Dummy {} + impl Pair for Dummy { type Public = Dummy; type Seed = Dummy; @@ -724,15 +687,15 @@ mod dummy { _: Iter, _: Option, ) -> Result<(Self, Option), DeriveError> { - Ok((Self, None)) + Ok((Self::default(), None)) } fn from_seed_slice(_: &[u8]) -> Result { - Ok(Self) + Ok(Self::default()) } fn sign(&self, _: &[u8]) -> Self::Signature { - Self + Self::default() } fn verify>(_: &Self::Signature, _: M, _: &Self::Public) -> bool { @@ -740,11 +703,11 @@ mod dummy { } fn public(&self) -> Self::Public { - Self + Self::default() } fn to_raw_vec(&self) -> Vec { - vec![] + Default::default() } } } @@ -773,6 +736,8 @@ mod dummy { /// Similarly an empty password (ending the `SURI` with `///`) is perfectly valid and will /// generally be equivalent to no password at all. /// +/// The `password` is used as salt when generating the seed from the BIP-39 key phrase. +/// /// # Example /// /// Parse [`DEV_PHRASE`] secret uri with junction: @@ -810,7 +775,6 @@ mod dummy { /// assert_eq!("0xe5be9a5092b81bca64be81d212e7f2f9eba183bb7a90954f7b76361f6edb5c0a", suri.phrase.expose_secret()); /// assert!(suri.password.is_none()); /// ``` -#[cfg(feature = "std")] pub struct SecretUri { /// The phrase to derive the private key. /// @@ -822,7 +786,6 @@ pub struct SecretUri { pub junctions: Vec, } -#[cfg(feature = "std")] impl sp_std::str::FromStr for SecretUri { type Err = SecretStringError; @@ -843,7 +806,6 @@ impl sp_std::str::FromStr for SecretUri { /// Trait suitable for typical cryptographic PKI key pair type. /// /// For now it just specifies how to create a key from a phrase and derivation path. -#[cfg(feature = "full_crypto")] pub trait Pair: CryptoType + Sized { /// The type which is used to encode a public key. type Public: Public + Hash; @@ -854,7 +816,7 @@ pub trait Pair: CryptoType + Sized { /// The type used to represent a signature. Can be created from a key pair and a message /// and verified with the message and a public key. - type Signature: AsRef<[u8]>; + type Signature: Signature; /// Generate new secure (random) key pair. /// @@ -876,21 +838,19 @@ pub trait Pair: CryptoType + Sized { #[cfg(feature = "std")] fn generate_with_phrase(password: Option<&str>) -> (Self, String, Self::Seed) { let mnemonic = Mnemonic::generate(12).expect("Mnemonic generation always works; qed"); - let phrase = mnemonic.word_iter().join(" "); + let phrase = mnemonic.words().join(" "); let (pair, seed) = Self::from_phrase(&phrase, password) .expect("All phrases generated by Mnemonic are valid; qed"); (pair, phrase.to_owned(), seed) } /// Returns the KeyPair from the English BIP39 seed `phrase`, or an error if it's invalid. - #[cfg(feature = "std")] fn from_phrase( phrase: &str, password: Option<&str>, ) -> Result<(Self, Self::Seed), SecretStringError> { let mnemonic = Mnemonic::parse_in(Language::English, phrase) .map_err(|_| SecretStringError::InvalidPhrase)?; - let (entropy, entropy_len) = mnemonic.to_entropy_array(); let big_seed = substrate_bip39::seed_from_entropy(&entropy[0..entropy_len], password.unwrap_or("")) @@ -926,6 +886,7 @@ pub trait Pair: CryptoType + Sized { fn from_seed_slice(seed: &[u8]) -> Result; /// Sign a message. + #[cfg(feature = "full_crypto")] fn sign(&self, message: &[u8]) -> Self::Signature; /// Verify a signature on a message. Returns true if the signature is good. @@ -960,7 +921,6 @@ pub trait Pair: CryptoType + Sized { /// Notably, integer junction indices may be legally prefixed with arbitrary number of zeros. /// Similarly an empty password (ending the SURI with `///`) is perfectly valid and will /// generally be equivalent to no password at all. - #[cfg(feature = "std")] fn from_string_with_seed( s: &str, password_override: Option<&str>, @@ -994,7 +954,6 @@ pub trait Pair: CryptoType + Sized { /// Interprets the string `s` in order to generate a key pair. /// /// See [`from_string_with_seed`](Pair::from_string_with_seed) for more extensive documentation. - #[cfg(feature = "std")] fn from_string(s: &str, password_override: Option<&str>) -> Result { Self::from_string_with_seed(s, password_override).map(|x| x.0) } @@ -1052,7 +1011,6 @@ where /// Type which has a particular kind of crypto associated with it. pub trait CryptoType { /// The pair key type of this crypto. - #[cfg(feature = "full_crypto")] type Pair: Pair; } @@ -1231,6 +1189,8 @@ mod tests { use super::*; use crate::DeriveJunction; + struct TestCryptoTag; + #[derive(Clone, Eq, PartialEq, Debug)] enum TestPair { Generated, @@ -1239,59 +1199,33 @@ mod tests { Standard { phrase: String, password: Option, path: Vec }, Seed(Vec), } + impl Default for TestPair { fn default() -> Self { TestPair::Generated } } + impl CryptoType for TestPair { type Pair = Self; } - #[derive(Clone, PartialEq, Eq, Hash, Default)] - struct TestPublic; - impl AsRef<[u8]> for TestPublic { - fn as_ref(&self) -> &[u8] { - &[] - } - } - impl AsMut<[u8]> for TestPublic { - fn as_mut(&mut self) -> &mut [u8] { - &mut [] - } - } - impl<'a> TryFrom<&'a [u8]> for TestPublic { - type Error = (); + type TestPublic = PublicBytes<0, TestCryptoTag>; - fn try_from(data: &'a [u8]) -> Result { - Self::from_slice(data) - } - } impl CryptoType for TestPublic { type Pair = TestPair; } - impl Derive for TestPublic {} - impl ByteArray for TestPublic { - const LEN: usize = 0; - fn from_slice(bytes: &[u8]) -> Result { - if bytes.is_empty() { - Ok(Self) - } else { - Err(()) - } - } - fn as_slice(&self) -> &[u8] { - &[] - } - fn to_raw_vec(&self) -> Vec { - vec![] - } + + type TestSignature = SignatureBytes<0, TestCryptoTag>; + + impl CryptoType for TestSignature { + type Pair = TestPair; } - impl Public for TestPublic {} + impl Pair for TestPair { type Public = TestPublic; type Seed = [u8; 8]; - type Signature = [u8; 0]; + type Signature = TestSignature; fn generate() -> (Self, ::Seed) { (TestPair::Generated, [0u8; 8]) @@ -1340,7 +1274,7 @@ mod tests { } fn sign(&self, _message: &[u8]) -> Self::Signature { - [] + TestSignature::default() } fn verify>(_: &Self::Signature, _: M, _: &Self::Public) -> bool { @@ -1348,7 +1282,7 @@ mod tests { } fn public(&self) -> Self::Public { - TestPublic + TestPublic::default() } fn from_seed_slice(seed: &[u8]) -> Result { diff --git a/substrate/primitives/core/src/crypto_bytes.rs b/substrate/primitives/core/src/crypto_bytes.rs new file mode 100644 index 0000000000000000000000000000000000000000..ee5f3482f743a6a63b3465c75fcdb6d2d82ab6e7 --- /dev/null +++ b/substrate/primitives/core/src/crypto_bytes.rs @@ -0,0 +1,379 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Generic byte array which can be specialized with a marker type. + +use crate::{ + crypto::{CryptoType, Derive, FromEntropy, Public, Signature, UncheckedFrom}, + hash::{H256, H512}, +}; + +use codec::{Decode, Encode, MaxEncodedLen}; +use core::marker::PhantomData; +use scale_info::TypeInfo; + +use sp_runtime_interface::pass_by::{self, PassBy, PassByInner}; + +#[cfg(feature = "serde")] +use crate::crypto::Ss58Codec; +#[cfg(feature = "serde")] +use serde::{de, Deserialize, Deserializer, Serialize, Serializer}; + +#[cfg(all(not(feature = "std"), feature = "serde"))] +use sp_std::alloc::{format, string::String}; + +pub use public_bytes::*; +pub use signature_bytes::*; + +/// Generic byte array holding some crypto-related raw data. +/// +/// The type is generic over a constant length `N` and a "tag" `T` which +/// can be used to specialize the byte array without requiring newtypes. +/// +/// The tag `T` is held in a `PhantomDataT>`, a trick allowing +/// `CryptoBytes` to be `Send` and `Sync` regardless of `T` properties +/// ([ref](https://doc.rust-lang.org/nomicon/phantom-data.html#table-of-phantomdata-patterns)). +#[derive(Encode, Decode, MaxEncodedLen)] +#[repr(transparent)] +pub struct CryptoBytes(pub [u8; N], PhantomData T>); + +impl Copy for CryptoBytes {} + +impl Clone for CryptoBytes { + fn clone(&self) -> Self { + Self(self.0, PhantomData) + } +} + +impl TypeInfo for CryptoBytes { + type Identity = [u8; N]; + + fn type_info() -> scale_info::Type { + Self::Identity::type_info() + } +} + +impl PartialOrd for CryptoBytes { + fn partial_cmp(&self, other: &Self) -> Option { + self.0.partial_cmp(&other.0) + } +} + +impl Ord for CryptoBytes { + fn cmp(&self, other: &Self) -> core::cmp::Ordering { + self.0.cmp(&other.0) + } +} + +impl PartialEq for CryptoBytes { + fn eq(&self, other: &Self) -> bool { + self.0.eq(&other.0) + } +} + +impl core::hash::Hash for CryptoBytes { + fn hash(&self, state: &mut H) { + self.0.hash(state) + } +} + +impl Eq for CryptoBytes {} + +impl Default for CryptoBytes { + fn default() -> Self { + Self([0_u8; N], PhantomData) + } +} + +impl PassByInner for CryptoBytes { + type Inner = [u8; N]; + + fn into_inner(self) -> Self::Inner { + self.0 + } + + fn inner(&self) -> &Self::Inner { + &self.0 + } + + fn from_inner(inner: Self::Inner) -> Self { + Self(inner, PhantomData) + } +} + +impl PassBy for CryptoBytes { + type PassBy = pass_by::Inner; +} + +impl AsRef<[u8]> for CryptoBytes { + fn as_ref(&self) -> &[u8] { + &self.0[..] + } +} + +impl AsMut<[u8]> for CryptoBytes { + fn as_mut(&mut self) -> &mut [u8] { + &mut self.0[..] + } +} + +impl From> for [u8; N] { + fn from(v: CryptoBytes) -> [u8; N] { + v.0 + } +} + +impl AsRef<[u8; N]> for CryptoBytes { + fn as_ref(&self) -> &[u8; N] { + &self.0 + } +} + +impl AsMut<[u8; N]> for CryptoBytes { + fn as_mut(&mut self) -> &mut [u8; N] { + &mut self.0 + } +} + +impl From<[u8; N]> for CryptoBytes { + fn from(value: [u8; N]) -> Self { + Self::from_raw(value) + } +} + +impl TryFrom<&[u8]> for CryptoBytes { + type Error = (); + + fn try_from(data: &[u8]) -> Result { + if data.len() != N { + return Err(()) + } + let mut r = [0u8; N]; + r.copy_from_slice(data); + Ok(Self::from_raw(r)) + } +} + +impl UncheckedFrom<[u8; N]> for CryptoBytes { + fn unchecked_from(data: [u8; N]) -> Self { + Self::from_raw(data) + } +} + +impl core::ops::Deref for CryptoBytes { + type Target = [u8]; + + fn deref(&self) -> &Self::Target { + &self.0 + } +} + +impl CryptoBytes { + /// Construct from raw array. + pub fn from_raw(inner: [u8; N]) -> Self { + Self(inner, PhantomData) + } + + /// Construct from raw array. + pub fn to_raw(self) -> [u8; N] { + self.0 + } + + /// Return a slice filled with raw data. + pub fn as_array_ref(&self) -> &[u8; N] { + &self.0 + } +} + +impl crate::ByteArray for CryptoBytes { + const LEN: usize = N; +} + +impl FromEntropy for CryptoBytes { + fn from_entropy(input: &mut impl codec::Input) -> Result { + let mut result = Self::default(); + input.read(result.as_mut())?; + Ok(result) + } +} + +impl From> for H256 { + fn from(x: CryptoBytes<32, T>) -> H256 { + H256::from(x.0) + } +} + +impl From> for H512 { + fn from(x: CryptoBytes<64, T>) -> H512 { + H512::from(x.0) + } +} + +impl UncheckedFrom for CryptoBytes<32, T> { + fn unchecked_from(x: H256) -> Self { + Self::from_h256(x) + } +} + +impl CryptoBytes<32, T> { + /// A new instance from an H256. + pub fn from_h256(x: H256) -> Self { + Self::from_raw(x.into()) + } +} + +impl CryptoBytes<64, T> { + /// A new instance from an H512. + pub fn from_h512(x: H512) -> Self { + Self::from_raw(x.into()) + } +} + +mod public_bytes { + use super::*; + + /// Tag used for generic public key bytes. + pub struct PublicTag; + + /// Generic encoded public key. + pub type PublicBytes = CryptoBytes; + + impl Derive for PublicBytes where Self: CryptoType {} + + impl Public for PublicBytes where Self: CryptoType {} + + impl sp_std::fmt::Debug for PublicBytes + where + Self: CryptoType, + { + #[cfg(feature = "std")] + fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { + let s = self.to_ss58check(); + write!(f, "{} ({}...)", crate::hexdisplay::HexDisplay::from(&self.as_ref()), &s[0..8]) + } + + #[cfg(not(feature = "std"))] + fn fmt(&self, _: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result { + Ok(()) + } + } + + #[cfg(feature = "std")] + impl std::fmt::Display for PublicBytes + where + Self: CryptoType, + { + fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { + write!(f, "{}", self.to_ss58check()) + } + } + + #[cfg(feature = "std")] + impl std::str::FromStr for PublicBytes + where + Self: CryptoType, + { + type Err = crate::crypto::PublicError; + + fn from_str(s: &str) -> Result { + Self::from_ss58check(s) + } + } + + #[cfg(feature = "serde")] + impl Serialize for PublicBytes + where + Self: CryptoType, + { + fn serialize(&self, serializer: S) -> Result + where + S: Serializer, + { + serializer.serialize_str(&self.to_ss58check()) + } + } + + #[cfg(feature = "serde")] + impl<'de, const N: usize, SubTag> Deserialize<'de> for PublicBytes + where + Self: CryptoType, + { + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + Self::from_ss58check(&String::deserialize(deserializer)?) + .map_err(|e| de::Error::custom(format!("{:?}", e))) + } + } +} + +mod signature_bytes { + use super::*; + + /// Tag used for generic signature bytes. + pub struct SignatureTag; + + /// Generic encoded signature. + pub type SignatureBytes = CryptoBytes; + + impl Signature for SignatureBytes where Self: CryptoType {} + + #[cfg(feature = "serde")] + impl Serialize for SignatureBytes + where + Self: CryptoType, + { + fn serialize(&self, serializer: S) -> Result + where + S: Serializer, + { + serializer.serialize_str(&array_bytes::bytes2hex("", self)) + } + } + + #[cfg(feature = "serde")] + impl<'de, const N: usize, SubTag> Deserialize<'de> for SignatureBytes + where + Self: CryptoType, + { + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + let signature_hex = array_bytes::hex2bytes(&String::deserialize(deserializer)?) + .map_err(|e| de::Error::custom(format!("{:?}", e)))?; + Self::try_from(signature_hex.as_ref()) + .map_err(|e| de::Error::custom(format!("{:?}", e))) + } + } + + impl sp_std::fmt::Debug for SignatureBytes + where + Self: CryptoType, + { + #[cfg(feature = "std")] + fn fmt(&self, f: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result { + write!(f, "{}", crate::hexdisplay::HexDisplay::from(&&self.0[..])) + } + + #[cfg(not(feature = "std"))] + fn fmt(&self, _: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result { + Ok(()) + } + } +} diff --git a/substrate/primitives/core/src/ecdsa.rs b/substrate/primitives/core/src/ecdsa.rs index 1b63db7af7f2b73f41766fc31061e7333af922a2..9cba8cc3d352a0b60317f570827015f4c11d5313 100644 --- a/substrate/primitives/core/src/ecdsa.rs +++ b/substrate/primitives/core/src/ecdsa.rs @@ -17,31 +17,19 @@ //! Simple ECDSA secp256k1 API. -use codec::{Decode, Encode, MaxEncodedLen}; -use scale_info::TypeInfo; -use sp_runtime_interface::pass_by::PassByInner; - -#[cfg(feature = "serde")] -use crate::crypto::Ss58Codec; use crate::crypto::{ - ByteArray, CryptoType, CryptoTypeId, Derive, Public as TraitPublic, UncheckedFrom, + CryptoType, CryptoTypeId, DeriveError, DeriveJunction, Pair as TraitPair, PublicBytes, + SecretStringError, SignatureBytes, }; -#[cfg(feature = "full_crypto")] -use crate::crypto::{DeriveError, DeriveJunction, Pair as TraitPair, SecretStringError}; -#[cfg(all(feature = "full_crypto", not(feature = "std")))] -use secp256k1::Secp256k1; + +#[cfg(not(feature = "std"))] +use k256::ecdsa::{SigningKey as SecretKey, VerifyingKey}; #[cfg(feature = "std")] -use secp256k1::SECP256K1; -#[cfg(feature = "full_crypto")] use secp256k1::{ ecdsa::{RecoverableSignature, RecoveryId}, - Message, PublicKey, SecretKey, + Message, PublicKey, SecretKey, SECP256K1, }; -#[cfg(feature = "serde")] -use serde::{de, Deserialize, Deserializer, Serialize, Serializer}; -#[cfg(all(not(feature = "std"), feature = "serde"))] -use sp_std::alloc::{format, string::String}; -#[cfg(feature = "full_crypto")] +#[cfg(not(feature = "std"))] use sp_std::vec::Vec; /// An identifier used to match public keys against ecdsa keys @@ -53,94 +41,51 @@ pub const PUBLIC_KEY_SERIALIZED_SIZE: usize = 33; /// The byte length of signature pub const SIGNATURE_SERIALIZED_SIZE: usize = 65; -/// A secret seed (which is bytewise essentially equivalent to a SecretKey). +#[doc(hidden)] +pub struct EcdsaTag; + +/// The secret seed. /// -/// We need it as a different type because `Seed` is expected to be AsRef<[u8]>. -#[cfg(feature = "full_crypto")] +/// The raw secret seed, which can be used to create the `Pair`. type Seed = [u8; 32]; /// The ECDSA compressed public key. -#[cfg_attr(feature = "full_crypto", derive(Hash))] -#[derive( - Clone, - Copy, - Encode, - Decode, - PassByInner, - MaxEncodedLen, - TypeInfo, - Eq, - PartialEq, - PartialOrd, - Ord, -)] -pub struct Public(pub [u8; PUBLIC_KEY_SERIALIZED_SIZE]); - -impl crate::crypto::FromEntropy for Public { - fn from_entropy(input: &mut impl codec::Input) -> Result { - let mut result = Self([0u8; PUBLIC_KEY_SERIALIZED_SIZE]); - input.read(&mut result.0[..])?; - Ok(result) - } -} +pub type Public = PublicBytes; impl Public { - /// A new instance from the given 33-byte `data`. - /// - /// NOTE: No checking goes on to ensure this is a real public key. Only use it if - /// you are certain that the array actually is a pubkey. GIGO! - pub fn from_raw(data: [u8; PUBLIC_KEY_SERIALIZED_SIZE]) -> Self { - Self(data) - } - /// Create a new instance from the given full public key. /// /// This will convert the full public key into the compressed format. - #[cfg(feature = "std")] pub fn from_full(full: &[u8]) -> Result { - let pubkey = if full.len() == 64 { + let mut tagged_full = [0u8; 65]; + let full = if full.len() == 64 { // Tag it as uncompressed public key. - let mut tagged_full = [0u8; 65]; tagged_full[0] = 0x04; tagged_full[1..].copy_from_slice(full); - secp256k1::PublicKey::from_slice(&tagged_full) + &tagged_full } else { - secp256k1::PublicKey::from_slice(full) + full }; - pubkey.map(|k| Self(k.serialize())).map_err(|_| ()) - } -} - -impl ByteArray for Public { - const LEN: usize = PUBLIC_KEY_SERIALIZED_SIZE; -} - -impl TraitPublic for Public {} - -impl Derive for Public {} - -impl AsRef<[u8]> for Public { - fn as_ref(&self) -> &[u8] { - &self.0[..] + #[cfg(feature = "std")] + let pubkey = PublicKey::from_slice(&full); + #[cfg(not(feature = "std"))] + let pubkey = VerifyingKey::from_sec1_bytes(&full); + pubkey.map(|k| k.into()).map_err(|_| ()) } } -impl AsMut<[u8]> for Public { - fn as_mut(&mut self) -> &mut [u8] { - &mut self.0[..] +#[cfg(feature = "std")] +impl From for Public { + fn from(pubkey: PublicKey) -> Self { + Self::from(pubkey.serialize()) } } -impl TryFrom<&[u8]> for Public { - type Error = (); - - fn try_from(data: &[u8]) -> Result { - if data.len() != Self::LEN { - return Err(()) - } - let mut r = [0u8; Self::LEN]; - r.copy_from_slice(data); - Ok(Self::unchecked_from(r)) +#[cfg(not(feature = "std"))] +impl From for Public { + fn from(pubkey: VerifyingKey) -> Self { + Self::try_from(&pubkey.to_sec1_bytes()[..]) + .expect("Valid key is serializable to [u8; 33]. qed.") } } @@ -151,203 +96,46 @@ impl From for Public { } } -impl UncheckedFrom<[u8; PUBLIC_KEY_SERIALIZED_SIZE]> for Public { - fn unchecked_from(x: [u8; PUBLIC_KEY_SERIALIZED_SIZE]) -> Self { - Public(x) - } -} - -#[cfg(feature = "std")] -impl std::fmt::Display for Public { - fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { - write!(f, "{}", self.to_ss58check()) - } -} - -impl sp_std::fmt::Debug for Public { - #[cfg(feature = "std")] - fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { - let s = self.to_ss58check(); - write!(f, "{} ({}...)", crate::hexdisplay::HexDisplay::from(&self.as_ref()), &s[0..8]) - } - - #[cfg(not(feature = "std"))] - fn fmt(&self, _: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result { - Ok(()) - } -} - -#[cfg(feature = "serde")] -impl Serialize for Public { - fn serialize(&self, serializer: S) -> Result - where - S: Serializer, - { - serializer.serialize_str(&self.to_ss58check()) - } -} - -#[cfg(feature = "serde")] -impl<'de> Deserialize<'de> for Public { - fn deserialize(deserializer: D) -> Result - where - D: Deserializer<'de>, - { - Public::from_ss58check(&String::deserialize(deserializer)?) - .map_err(|e| de::Error::custom(format!("{:?}", e))) - } -} - /// A signature (a 512-bit value, plus 8 bits for recovery ID). -#[cfg_attr(feature = "full_crypto", derive(Hash))] -#[derive(Encode, Decode, MaxEncodedLen, PassByInner, TypeInfo, PartialEq, Eq)] -pub struct Signature(pub [u8; SIGNATURE_SERIALIZED_SIZE]); - -impl ByteArray for Signature { - const LEN: usize = SIGNATURE_SERIALIZED_SIZE; -} - -impl TryFrom<&[u8]> for Signature { - type Error = (); - - fn try_from(data: &[u8]) -> Result { - if data.len() == SIGNATURE_SERIALIZED_SIZE { - let mut inner = [0u8; SIGNATURE_SERIALIZED_SIZE]; - inner.copy_from_slice(data); - Ok(Signature(inner)) - } else { - Err(()) - } - } -} - -#[cfg(feature = "serde")] -impl Serialize for Signature { - fn serialize(&self, serializer: S) -> Result - where - S: Serializer, - { - serializer.serialize_str(&array_bytes::bytes2hex("", self)) - } -} - -#[cfg(feature = "serde")] -impl<'de> Deserialize<'de> for Signature { - fn deserialize(deserializer: D) -> Result - where - D: Deserializer<'de>, - { - let signature_hex = array_bytes::hex2bytes(&String::deserialize(deserializer)?) - .map_err(|e| de::Error::custom(format!("{:?}", e)))?; - Signature::try_from(signature_hex.as_ref()) - .map_err(|e| de::Error::custom(format!("{:?}", e))) - } -} - -impl Clone for Signature { - fn clone(&self) -> Self { - let mut r = [0u8; SIGNATURE_SERIALIZED_SIZE]; - r.copy_from_slice(&self.0[..]); - Signature(r) - } -} - -impl Default for Signature { - fn default() -> Self { - Signature([0u8; SIGNATURE_SERIALIZED_SIZE]) - } -} - -impl From for [u8; SIGNATURE_SERIALIZED_SIZE] { - fn from(v: Signature) -> [u8; SIGNATURE_SERIALIZED_SIZE] { - v.0 - } -} - -impl AsRef<[u8; SIGNATURE_SERIALIZED_SIZE]> for Signature { - fn as_ref(&self) -> &[u8; SIGNATURE_SERIALIZED_SIZE] { - &self.0 - } -} - -impl AsRef<[u8]> for Signature { - fn as_ref(&self) -> &[u8] { - &self.0[..] - } -} - -impl AsMut<[u8]> for Signature { - fn as_mut(&mut self) -> &mut [u8] { - &mut self.0[..] - } -} - -impl sp_std::fmt::Debug for Signature { - #[cfg(feature = "std")] - fn fmt(&self, f: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result { - write!(f, "{}", crate::hexdisplay::HexDisplay::from(&self.0)) - } - - #[cfg(not(feature = "std"))] - fn fmt(&self, _: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result { - Ok(()) - } -} - -impl UncheckedFrom<[u8; SIGNATURE_SERIALIZED_SIZE]> for Signature { - fn unchecked_from(data: [u8; SIGNATURE_SERIALIZED_SIZE]) -> Signature { - Signature(data) - } -} +pub type Signature = SignatureBytes; impl Signature { - /// A new instance from the given 65-byte `data`. - /// - /// NOTE: No checking goes on to ensure this is a real signature. Only use it if - /// you are certain that the array actually is a signature. GIGO! - pub fn from_raw(data: [u8; SIGNATURE_SERIALIZED_SIZE]) -> Signature { - Signature(data) - } - - /// A new instance from the given slice that should be 65 bytes long. - /// - /// NOTE: No checking goes on to ensure this is a real signature. Only use it if - /// you are certain that the array actually is a signature. GIGO! - pub fn from_slice(data: &[u8]) -> Option { - if data.len() != SIGNATURE_SERIALIZED_SIZE { - return None - } - let mut r = [0u8; SIGNATURE_SERIALIZED_SIZE]; - r.copy_from_slice(data); - Some(Signature(r)) - } - /// Recover the public key from this signature and a message. - #[cfg(feature = "full_crypto")] pub fn recover>(&self, message: M) -> Option { self.recover_prehashed(&sp_crypto_hashing::blake2_256(message.as_ref())) } /// Recover the public key from this signature and a pre-hashed message. - #[cfg(feature = "full_crypto")] pub fn recover_prehashed(&self, message: &[u8; 32]) -> Option { - let rid = RecoveryId::from_i32(self.0[64] as i32).ok()?; - let sig = RecoverableSignature::from_compact(&self.0[..64], rid).ok()?; - let message = Message::from_digest_slice(message).expect("Message is 32 bytes; qed"); - #[cfg(feature = "std")] - let context = SECP256K1; + { + let rid = RecoveryId::from_i32(self.0[64] as i32).ok()?; + let sig = RecoverableSignature::from_compact(&self.0[..64], rid).ok()?; + let message = + Message::from_digest_slice(message).expect("Message is a 32 bytes hash; qed"); + SECP256K1.recover_ecdsa(&message, &sig).ok().map(Public::from) + } + #[cfg(not(feature = "std"))] - let context = Secp256k1::verification_only(); + { + let rid = k256::ecdsa::RecoveryId::from_byte(self.0[64])?; + let sig = k256::ecdsa::Signature::from_bytes((&self.0[..64]).into()).ok()?; + VerifyingKey::recover_from_prehash(message, &sig, rid).map(Public::from).ok() + } + } +} - context - .recover_ecdsa(&message, &sig) - .ok() - .map(|pubkey| Public(pubkey.serialize())) +#[cfg(not(feature = "std"))] +impl From<(k256::ecdsa::Signature, k256::ecdsa::RecoveryId)> for Signature { + fn from(recsig: (k256::ecdsa::Signature, k256::ecdsa::RecoveryId)) -> Signature { + let mut r = Self::default(); + r.0[..64].copy_from_slice(&recsig.0.to_bytes()); + r.0[64] = recsig.1.to_byte(); + r } } -#[cfg(feature = "full_crypto")] +#[cfg(feature = "std")] impl From for Signature { fn from(recsig: RecoverableSignature) -> Signature { let mut r = Self::default(); @@ -360,20 +148,18 @@ impl From for Signature { } /// Derive a single hard junction. -#[cfg(feature = "full_crypto")] fn derive_hard_junction(secret_seed: &Seed, cc: &[u8; 32]) -> Seed { + use codec::Encode; ("Secp256k1HDKD", secret_seed, cc).using_encoded(sp_crypto_hashing::blake2_256) } /// A key pair. -#[cfg(feature = "full_crypto")] #[derive(Clone)] pub struct Pair { public: Public, secret: SecretKey, } -#[cfg(feature = "full_crypto")] impl TraitPair for Pair { type Public = Public; type Seed = Seed; @@ -384,17 +170,19 @@ impl TraitPair for Pair { /// /// You should never need to use this; generate(), generate_with_phrase fn from_seed_slice(seed_slice: &[u8]) -> Result { - let secret = - SecretKey::from_slice(seed_slice).map_err(|_| SecretStringError::InvalidSeedLength)?; - #[cfg(feature = "std")] - let context = SECP256K1; - #[cfg(not(feature = "std"))] - let context = Secp256k1::signing_only(); + { + let secret = SecretKey::from_slice(seed_slice) + .map_err(|_| SecretStringError::InvalidSeedLength)?; + Ok(Pair { public: PublicKey::from_secret_key(&SECP256K1, &secret).into(), secret }) + } - let public = PublicKey::from_secret_key(&context, &secret); - let public = Public(public.serialize()); - Ok(Pair { public, secret }) + #[cfg(not(feature = "std"))] + { + let secret = SecretKey::from_slice(seed_slice) + .map_err(|_| SecretStringError::InvalidSeedLength)?; + Ok(Pair { public: VerifyingKey::from(&secret).into(), secret }) + } } /// Derive a child key from a series of given junctions. @@ -419,6 +207,7 @@ impl TraitPair for Pair { } /// Sign a message. + #[cfg(feature = "full_crypto")] fn sign(&self, message: &[u8]) -> Signature { self.sign_prehashed(&sp_crypto_hashing::blake2_256(message)) } @@ -434,11 +223,17 @@ impl TraitPair for Pair { } } -#[cfg(feature = "full_crypto")] impl Pair { /// Get the seed for this key. pub fn seed(&self) -> Seed { - self.secret.secret_bytes() + #[cfg(feature = "std")] + { + self.secret.secret_bytes() + } + #[cfg(not(feature = "std"))] + { + self.secret.to_bytes().into() + } } /// Exactly as `from_string` except that if no matches are found then, the the first 32 @@ -454,15 +249,24 @@ impl Pair { } /// Sign a pre-hashed message + #[cfg(feature = "full_crypto")] pub fn sign_prehashed(&self, message: &[u8; 32]) -> Signature { - let message = Message::from_digest_slice(message).expect("Message is 32 bytes; qed"); - #[cfg(feature = "std")] - let context = SECP256K1; - #[cfg(not(feature = "std"))] - let context = Secp256k1::signing_only(); + { + let message = + Message::from_digest_slice(message).expect("Message is a 32 bytes hash; qed"); + SECP256K1.sign_ecdsa_recoverable(&message, &self.secret).into() + } - context.sign_ecdsa_recoverable(&message, &self.secret).into() + #[cfg(not(feature = "std"))] + { + // Signing fails only if the `message` number of bytes is less than the field length + // (unfallible as we're using a fixed message length of 32). + self.secret + .sign_prehash_recoverable(message) + .expect("Signing can't fail when using 32 bytes message hash. qed.") + .into() + } } /// Verify a signature on a pre-hashed message. Return `true` if the signature is valid @@ -503,7 +307,7 @@ impl Pair { // NOTE: this solution is not effective when `Pair` is moved around memory. // The very same problem affects other cryptographic backends that are just using // `zeroize`for their secrets. -#[cfg(feature = "full_crypto")] +#[cfg(feature = "std")] impl Drop for Pair { fn drop(&mut self) { self.secret.non_secure_erase() @@ -511,16 +315,13 @@ impl Drop for Pair { } impl CryptoType for Public { - #[cfg(feature = "full_crypto")] type Pair = Pair; } impl CryptoType for Signature { - #[cfg(feature = "full_crypto")] type Pair = Pair; } -#[cfg(feature = "full_crypto")] impl CryptoType for Pair { type Pair = Pair; } @@ -530,7 +331,7 @@ mod test { use super::*; use crate::crypto::{ set_default_ss58_version, PublicError, Ss58AddressFormat, Ss58AddressFormatRegistry, - DEV_PHRASE, + Ss58Codec, DEV_PHRASE, }; use serde_json; @@ -644,12 +445,29 @@ mod test { assert_eq!(pair1.public(), pair2.public()); } + #[test] + fn generate_with_phrase_should_be_recoverable_with_from_string() { + let (pair, phrase, seed) = Pair::generate_with_phrase(None); + let repair_seed = Pair::from_seed_slice(seed.as_ref()).expect("seed slice is valid"); + assert_eq!(pair.public(), repair_seed.public()); + assert_eq!(pair.secret, repair_seed.secret); + let (repair_phrase, reseed) = + Pair::from_phrase(phrase.as_ref(), None).expect("seed slice is valid"); + assert_eq!(seed, reseed); + assert_eq!(pair.public(), repair_phrase.public()); + assert_eq!(pair.secret, repair_phrase.secret); + let repair_string = Pair::from_string(phrase.as_str(), None).expect("seed slice is valid"); + assert_eq!(pair.public(), repair_string.public()); + assert_eq!(pair.secret, repair_string.secret); + } + #[test] fn password_does_something() { let (pair1, phrase, _) = Pair::generate_with_phrase(Some("password")); let (pair2, _) = Pair::from_phrase(&phrase, None).unwrap(); assert_ne!(pair1.public(), pair2.public()); + assert_ne!(pair1.secret, pair2.secret); } #[test] @@ -753,8 +571,18 @@ mod test { let msg = [0u8; 32]; let sig1 = pair.sign_prehashed(&msg); let sig2: Signature = { - let message = Message::from_digest_slice(&msg).unwrap(); - SECP256K1.sign_ecdsa_recoverable(&message, &pair.secret).into() + #[cfg(feature = "std")] + { + let message = Message::from_digest_slice(&msg).unwrap(); + SECP256K1.sign_ecdsa_recoverable(&message, &pair.secret).into() + } + #[cfg(not(feature = "std"))] + { + pair.secret + .sign_prehash_recoverable(&msg) + .expect("signing may not fail (???). qed.") + .into() + } }; assert_eq!(sig1, sig2); diff --git a/substrate/primitives/core/src/ed25519.rs b/substrate/primitives/core/src/ed25519.rs index aa0d77510bd81efdd9186e730842622f65620558..a9494f2860b4c018d465eecb9eafe825e169292c 100644 --- a/substrate/primitives/core/src/ed25519.rs +++ b/substrate/primitives/core/src/ed25519.rs @@ -15,367 +15,53 @@ // See the License for the specific language governing permissions and // limitations under the License. -// tag::description[] //! Simple Ed25519 API. -// end::description[] -#[cfg(feature = "full_crypto")] -use sp_std::vec::Vec; - -use crate::{ - crypto::ByteArray, - hash::{H256, H512}, -}; -use codec::{Decode, Encode, MaxEncodedLen}; -use scale_info::TypeInfo; - -#[cfg(feature = "serde")] -use crate::crypto::Ss58Codec; use crate::crypto::{ - CryptoType, CryptoTypeId, Derive, FromEntropy, Public as TraitPublic, UncheckedFrom, + ByteArray, CryptoType, CryptoTypeId, DeriveError, DeriveJunction, Pair as TraitPair, + PublicBytes, SecretStringError, SignatureBytes, }; -#[cfg(feature = "full_crypto")] -use crate::crypto::{DeriveError, DeriveJunction, Pair as TraitPair, SecretStringError}; -#[cfg(feature = "full_crypto")] -use core::convert::TryFrom; -#[cfg(feature = "full_crypto")] + use ed25519_zebra::{SigningKey, VerificationKey}; -#[cfg(feature = "serde")] -use serde::{de, Deserialize, Deserializer, Serialize, Serializer}; -use sp_runtime_interface::pass_by::PassByInner; -#[cfg(all(not(feature = "std"), feature = "serde"))] -use sp_std::alloc::{format, string::String}; -use sp_std::ops::Deref; + +use sp_std::vec::Vec; /// An identifier used to match public keys against ed25519 keys pub const CRYPTO_ID: CryptoTypeId = CryptoTypeId(*b"ed25"); +/// The byte length of public key +pub const PUBLIC_KEY_SERIALIZED_SIZE: usize = 32; + +/// The byte length of signature +pub const SIGNATURE_SERIALIZED_SIZE: usize = 64; + /// A secret seed. It's not called a "secret key" because ring doesn't expose the secret keys /// of the key pair (yeah, dumb); as such we're forced to remember the seed manually if we /// will need it later (such as for HDKD). -#[cfg(feature = "full_crypto")] type Seed = [u8; 32]; +#[doc(hidden)] +pub struct Ed25519Tag; + /// A public key. -#[cfg_attr(feature = "full_crypto", derive(Hash))] -#[derive( - PartialEq, - Eq, - PartialOrd, - Ord, - Clone, - Copy, - Encode, - Decode, - PassByInner, - MaxEncodedLen, - TypeInfo, -)] -pub struct Public(pub [u8; 32]); +pub type Public = PublicBytes; + +/// A signature. +pub type Signature = SignatureBytes; /// A key pair. -#[cfg(feature = "full_crypto")] #[derive(Copy, Clone)] pub struct Pair { public: VerificationKey, secret: SigningKey, } -impl FromEntropy for Public { - fn from_entropy(input: &mut impl codec::Input) -> Result { - let mut result = Self([0u8; 32]); - input.read(&mut result.0[..])?; - Ok(result) - } -} - -impl AsRef<[u8; 32]> for Public { - fn as_ref(&self) -> &[u8; 32] { - &self.0 - } -} - -impl AsRef<[u8]> for Public { - fn as_ref(&self) -> &[u8] { - &self.0[..] - } -} - -impl AsMut<[u8]> for Public { - fn as_mut(&mut self) -> &mut [u8] { - &mut self.0[..] - } -} - -impl Deref for Public { - type Target = [u8]; - - fn deref(&self) -> &Self::Target { - &self.0 - } -} - -impl TryFrom<&[u8]> for Public { - type Error = (); - - fn try_from(data: &[u8]) -> Result { - if data.len() != Self::LEN { - return Err(()) - } - let mut r = [0u8; Self::LEN]; - r.copy_from_slice(data); - Ok(Self::unchecked_from(r)) - } -} - -impl From for [u8; 32] { - fn from(x: Public) -> Self { - x.0 - } -} - -#[cfg(feature = "full_crypto")] -impl From for Public { - fn from(x: Pair) -> Self { - x.public() - } -} - -impl From for H256 { - fn from(x: Public) -> Self { - x.0.into() - } -} - -#[cfg(feature = "std")] -impl std::str::FromStr for Public { - type Err = crate::crypto::PublicError; - - fn from_str(s: &str) -> Result { - Self::from_ss58check(s) - } -} - -impl UncheckedFrom<[u8; 32]> for Public { - fn unchecked_from(x: [u8; 32]) -> Self { - Public::from_raw(x) - } -} - -impl UncheckedFrom for Public { - fn unchecked_from(x: H256) -> Self { - Public::from_h256(x) - } -} - -#[cfg(feature = "std")] -impl std::fmt::Display for Public { - fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { - write!(f, "{}", self.to_ss58check()) - } -} - -impl sp_std::fmt::Debug for Public { - #[cfg(feature = "std")] - fn fmt(&self, f: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result { - let s = self.to_ss58check(); - write!(f, "{} ({}...)", crate::hexdisplay::HexDisplay::from(&self.0), &s[0..8]) - } - - #[cfg(not(feature = "std"))] - fn fmt(&self, _: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result { - Ok(()) - } -} - -#[cfg(feature = "serde")] -impl Serialize for Public { - fn serialize(&self, serializer: S) -> Result - where - S: Serializer, - { - serializer.serialize_str(&self.to_ss58check()) - } -} - -#[cfg(feature = "serde")] -impl<'de> Deserialize<'de> for Public { - fn deserialize(deserializer: D) -> Result - where - D: Deserializer<'de>, - { - Public::from_ss58check(&String::deserialize(deserializer)?) - .map_err(|e| de::Error::custom(format!("{:?}", e))) - } -} - -/// A signature (a 512-bit value). -#[cfg_attr(feature = "full_crypto", derive(Hash))] -#[derive(Encode, Decode, MaxEncodedLen, PassByInner, TypeInfo, PartialEq, Eq)] -pub struct Signature(pub [u8; 64]); - -impl TryFrom<&[u8]> for Signature { - type Error = (); - - fn try_from(data: &[u8]) -> Result { - if data.len() == 64 { - let mut inner = [0u8; 64]; - inner.copy_from_slice(data); - Ok(Signature(inner)) - } else { - Err(()) - } - } -} - -#[cfg(feature = "serde")] -impl Serialize for Signature { - fn serialize(&self, serializer: S) -> Result - where - S: Serializer, - { - serializer.serialize_str(&array_bytes::bytes2hex("", self)) - } -} - -#[cfg(feature = "serde")] -impl<'de> Deserialize<'de> for Signature { - fn deserialize(deserializer: D) -> Result - where - D: Deserializer<'de>, - { - let signature_hex = array_bytes::hex2bytes(&String::deserialize(deserializer)?) - .map_err(|e| de::Error::custom(format!("{:?}", e)))?; - Signature::try_from(signature_hex.as_ref()) - .map_err(|e| de::Error::custom(format!("{:?}", e))) - } -} - -impl Clone for Signature { - fn clone(&self) -> Self { - let mut r = [0u8; 64]; - r.copy_from_slice(&self.0[..]); - Signature(r) - } -} - -impl From for H512 { - fn from(v: Signature) -> H512 { - H512::from(v.0) - } -} - -impl From for [u8; 64] { - fn from(v: Signature) -> [u8; 64] { - v.0 - } -} - -impl AsRef<[u8; 64]> for Signature { - fn as_ref(&self) -> &[u8; 64] { - &self.0 - } -} - -impl AsRef<[u8]> for Signature { - fn as_ref(&self) -> &[u8] { - &self.0[..] - } -} - -impl AsMut<[u8]> for Signature { - fn as_mut(&mut self) -> &mut [u8] { - &mut self.0[..] - } -} - -impl sp_std::fmt::Debug for Signature { - #[cfg(feature = "std")] - fn fmt(&self, f: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result { - write!(f, "{}", crate::hexdisplay::HexDisplay::from(&self.0)) - } - - #[cfg(not(feature = "std"))] - fn fmt(&self, _: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result { - Ok(()) - } -} - -impl UncheckedFrom<[u8; 64]> for Signature { - fn unchecked_from(data: [u8; 64]) -> Signature { - Signature(data) - } -} - -impl Signature { - /// A new instance from the given 64-byte `data`. - /// - /// NOTE: No checking goes on to ensure this is a real signature. Only use it if - /// you are certain that the array actually is a signature. GIGO! - pub fn from_raw(data: [u8; 64]) -> Signature { - Signature(data) - } - - /// A new instance from the given slice that should be 64 bytes long. - /// - /// NOTE: No checking goes on to ensure this is a real signature. Only use it if - /// you are certain that the array actually is a signature. GIGO! - pub fn from_slice(data: &[u8]) -> Option { - if data.len() != 64 { - return None - } - let mut r = [0u8; 64]; - r.copy_from_slice(data); - Some(Signature(r)) - } - - /// A new instance from an H512. - /// - /// NOTE: No checking goes on to ensure this is a real signature. Only use it if - /// you are certain that the array actually is a signature. GIGO! - pub fn from_h512(v: H512) -> Signature { - Signature(v.into()) - } -} - -impl Public { - /// A new instance from the given 32-byte `data`. - /// - /// NOTE: No checking goes on to ensure this is a real public key. Only use it if - /// you are certain that the array actually is a pubkey. GIGO! - pub fn from_raw(data: [u8; 32]) -> Self { - Public(data) - } - - /// A new instance from an H256. - /// - /// NOTE: No checking goes on to ensure this is a real public key. Only use it if - /// you are certain that the array actually is a pubkey. GIGO! - pub fn from_h256(x: H256) -> Self { - Public(x.into()) - } - - /// Return a slice filled with raw data. - pub fn as_array_ref(&self) -> &[u8; 32] { - self.as_ref() - } -} - -impl ByteArray for Public { - const LEN: usize = 32; -} - -impl TraitPublic for Public {} - -impl Derive for Public {} - /// Derive a single hard junction. -#[cfg(feature = "full_crypto")] fn derive_hard_junction(secret_seed: &Seed, cc: &[u8; 32]) -> Seed { + use codec::Encode; ("Ed25519HDKD", secret_seed, cc).using_encoded(sp_crypto_hashing::blake2_256) } -#[cfg(feature = "full_crypto")] impl TraitPair for Pair { type Public = Public; type Seed = Seed; @@ -410,10 +96,11 @@ impl TraitPair for Pair { /// Get the public key. fn public(&self) -> Public { - Public(self.public.into()) + Public::from_raw(self.public.into()) } /// Sign a message. + #[cfg(feature = "full_crypto")] fn sign(&self, message: &[u8]) -> Signature { Signature::from_raw(self.secret.sign(message).into()) } @@ -433,7 +120,6 @@ impl TraitPair for Pair { } } -#[cfg(feature = "full_crypto")] impl Pair { /// Get the seed for this key. pub fn seed(&self) -> Seed { @@ -454,23 +140,22 @@ impl Pair { } impl CryptoType for Public { - #[cfg(feature = "full_crypto")] type Pair = Pair; } impl CryptoType for Signature { - #[cfg(feature = "full_crypto")] type Pair = Pair; } -#[cfg(feature = "full_crypto")] impl CryptoType for Pair { type Pair = Pair; } #[cfg(test)] -mod test { +mod tests { use super::*; + #[cfg(feature = "serde")] + use crate::crypto::Ss58Codec; use crate::crypto::DEV_PHRASE; use serde_json; @@ -501,6 +186,22 @@ mod test { ); } + #[test] + fn generate_with_phrase_should_be_recoverable_with_from_string() { + let (pair, phrase, seed) = Pair::generate_with_phrase(None); + let repair_seed = Pair::from_seed_slice(seed.as_ref()).expect("seed slice is valid"); + assert_eq!(pair.public(), repair_seed.public()); + assert_eq!(pair.to_raw_vec(), repair_seed.to_raw_vec()); + let (repair_phrase, reseed) = + Pair::from_phrase(phrase.as_ref(), None).expect("seed slice is valid"); + assert_eq!(seed, reseed); + assert_eq!(pair.public(), repair_phrase.public()); + assert_eq!(pair.to_raw_vec(), repair_seed.to_raw_vec()); + let repair_string = Pair::from_string(phrase.as_str(), None).expect("seed slice is valid"); + assert_eq!(pair.public(), repair_string.public()); + assert_eq!(pair.to_raw_vec(), repair_seed.to_raw_vec()); + } + #[test] fn test_vector_should_work() { let pair = Pair::from_seed(&array_bytes::hex2array_unchecked( @@ -590,6 +291,7 @@ mod test { let (pair2, _) = Pair::from_phrase(&phrase, None).unwrap(); assert_ne!(pair1.public(), pair2.public()); + assert_ne!(pair1.to_raw_vec(), pair2.to_raw_vec()); } #[test] diff --git a/substrate/primitives/core/src/lib.rs b/substrate/primitives/core/src/lib.rs index 0d43eea99629915715f452da409d53522d199e53..098bd135bfebba0d83bb2f58e72b4779bdf441b7 100644 --- a/substrate/primitives/core/src/lib.rs +++ b/substrate/primitives/core/src/lib.rs @@ -46,7 +46,6 @@ pub use sp_debug_derive::RuntimeDebug; #[cfg(feature = "serde")] pub use impl_serde::serialize as bytes; -#[cfg(feature = "full_crypto")] #[deprecated( since = "27.0.0", note = "`sp-crypto-hashing` re-exports will be removed after June 2024. Use `sp-crypto-hashing` instead." @@ -57,27 +56,27 @@ pub mod const_hex2array; pub mod crypto; pub mod hexdisplay; pub use paste; - -#[cfg(any(feature = "full_crypto", feature = "std"))] mod address_uri; -#[cfg(feature = "bandersnatch-experimental")] -pub mod bandersnatch; -#[cfg(feature = "bls-experimental")] -pub mod bls; pub mod defer; -pub mod ecdsa; -pub mod ed25519; pub mod hash; #[cfg(feature = "std")] mod hasher; pub mod offchain; -pub mod paired_crypto; -pub mod sr25519; pub mod testing; #[cfg(feature = "std")] pub mod traits; pub mod uint; +#[cfg(feature = "bandersnatch-experimental")] +pub mod bandersnatch; +#[cfg(feature = "bls-experimental")] +pub mod bls; +pub mod crypto_bytes; +pub mod ecdsa; +pub mod ed25519; +pub mod paired_crypto; +pub mod sr25519; + #[cfg(feature = "bls-experimental")] pub use bls::{bls377, bls381}; #[cfg(feature = "bls-experimental")] @@ -87,7 +86,6 @@ pub use self::{ hash::{convert_hash, H160, H256, H512}, uint::{U256, U512}, }; -#[cfg(feature = "full_crypto")] pub use crypto::{ByteArray, DeriveJunction, Pair, Public}; #[cfg(feature = "std")] diff --git a/substrate/primitives/core/src/paired_crypto.rs b/substrate/primitives/core/src/paired_crypto.rs index 960b8469249e22b10352545f26d3940df3da2e77..260e86b6ff9c4d759fd3794c6a91cc77aebd8dc0 100644 --- a/substrate/primitives/core/src/paired_crypto.rs +++ b/substrate/primitives/core/src/paired_crypto.rs @@ -17,34 +17,23 @@ //! API for using a pair of crypto schemes together. -#[cfg(feature = "serde")] -use crate::crypto::Ss58Codec; -use crate::crypto::{ByteArray, CryptoType, Derive, Public as PublicT, UncheckedFrom}; -#[cfg(feature = "full_crypto")] -use crate::crypto::{DeriveError, DeriveJunction, Pair as PairT, SecretStringError}; +use core::marker::PhantomData; -#[cfg(feature = "full_crypto")] -use sp_std::vec::Vec; - -use codec::{Decode, Encode, MaxEncodedLen}; -use scale_info::TypeInfo; -#[cfg(feature = "serde")] -use serde::{de, Deserialize, Deserializer, Serialize, Serializer}; -#[cfg(all(not(feature = "std"), feature = "serde"))] -use sp_std::alloc::{format, string::String}; +use crate::crypto::{ + ByteArray, CryptoType, DeriveError, DeriveJunction, Pair as PairT, Public as PublicT, + PublicBytes, SecretStringError, Signature as SignatureT, SignatureBytes, UncheckedFrom, +}; -use sp_runtime_interface::pass_by::{self, PassBy, PassByInner}; -use sp_std::convert::TryFrom; +use sp_std::vec::Vec; /// ECDSA and BLS12-377 paired crypto scheme #[cfg(feature = "bls-experimental")] pub mod ecdsa_bls377 { + use crate::{bls377, crypto::CryptoTypeId, ecdsa}; #[cfg(feature = "full_crypto")] - use crate::Hasher; use crate::{ - bls377, - crypto::{CryptoTypeId, Pair as PairT, UncheckedFrom}, - ecdsa, + crypto::{Pair as PairT, UncheckedFrom}, + Hasher, }; /// An identifier used to match public keys against BLS12-377 keys @@ -55,32 +44,36 @@ pub mod ecdsa_bls377 { const SIGNATURE_LEN: usize = ecdsa::SIGNATURE_SERIALIZED_SIZE + bls377::SIGNATURE_SERIALIZED_SIZE; + #[doc(hidden)] + pub struct EcdsaBls377Tag(ecdsa::EcdsaTag, bls377::Bls377Tag); + + impl super::PairedCryptoSubTagBound for EcdsaBls377Tag {} + /// (ECDSA,BLS12-377) key-pair pair. - #[cfg(feature = "full_crypto")] - pub type Pair = super::Pair; + pub type Pair = + super::Pair; + /// (ECDSA,BLS12-377) public key pair. - pub type Public = super::Public; + pub type Public = super::Public; + /// (ECDSA,BLS12-377) signature pair. - pub type Signature = super::Signature; + pub type Signature = super::Signature; impl super::CryptoType for Public { - #[cfg(feature = "full_crypto")] type Pair = Pair; } impl super::CryptoType for Signature { - #[cfg(feature = "full_crypto")] type Pair = Pair; } - #[cfg(feature = "full_crypto")] impl super::CryptoType for Pair { type Pair = Pair; } #[cfg(feature = "full_crypto")] impl Pair { - /// Hashes the `message` with the specified [`Hasher`] before signing sith the ECDSA secret + /// Hashes the `message` with the specified [`Hasher`] before signing with the ECDSA secret /// component. /// /// The hasher does not affect the BLS12-377 component. This generates BLS12-377 Signature @@ -115,7 +108,7 @@ pub mod ecdsa_bls377 { let Ok(left_pub) = public.0[..ecdsa::PUBLIC_KEY_SERIALIZED_SIZE].try_into() else { return false }; - let Ok(left_sig) = sig.0[0..ecdsa::SIGNATURE_SERIALIZED_SIZE].try_into() else { + let Ok(left_sig) = sig.0[..ecdsa::SIGNATURE_SERIALIZED_SIZE].try_into() else { return false }; if !ecdsa::Pair::verify_prehashed(&left_sig, &msg_hash, &left_pub) { @@ -136,7 +129,6 @@ pub mod ecdsa_bls377 { /// Secure seed length. /// /// Currently only supporting sub-schemes whose seed is a 32-bytes array. -#[cfg(feature = "full_crypto")] const SECURE_SEED_LEN: usize = 32; /// A secret seed. @@ -144,303 +136,83 @@ const SECURE_SEED_LEN: usize = 32; /// It's not called a "secret key" because ring doesn't expose the secret keys /// of the key pair (yeah, dumb); as such we're forced to remember the seed manually if we /// will need it later (such as for HDKD). -#[cfg(feature = "full_crypto")] type Seed = [u8; SECURE_SEED_LEN]; -/// A public key. -#[derive(Clone, Encode, Decode, MaxEncodedLen, TypeInfo, PartialEq, Eq, PartialOrd, Ord)] -pub struct Public([u8; LEFT_PLUS_RIGHT_LEN]); - -#[cfg(feature = "full_crypto")] -impl sp_std::hash::Hash for Public { - fn hash(&self, state: &mut H) { - self.0.hash(state); - } -} - -impl ByteArray for Public { - const LEN: usize = LEFT_PLUS_RIGHT_LEN; -} - -impl TryFrom<&[u8]> for Public { - type Error = (); - - fn try_from(data: &[u8]) -> Result { - if data.len() != LEFT_PLUS_RIGHT_LEN { - return Err(()) - } - let mut inner = [0u8; LEFT_PLUS_RIGHT_LEN]; - inner.copy_from_slice(data); - Ok(Public(inner)) - } -} - -impl AsRef<[u8; LEFT_PLUS_RIGHT_LEN]> - for Public -{ - fn as_ref(&self) -> &[u8; LEFT_PLUS_RIGHT_LEN] { - &self.0 - } -} - -impl AsRef<[u8]> for Public { - fn as_ref(&self) -> &[u8] { - &self.0[..] - } -} - -impl AsMut<[u8]> for Public { - fn as_mut(&mut self) -> &mut [u8] { - &mut self.0[..] - } -} - -impl PassByInner for Public { - type Inner = [u8; LEFT_PLUS_RIGHT_LEN]; - - fn into_inner(self) -> Self::Inner { - self.0 - } - - fn inner(&self) -> &Self::Inner { - &self.0 - } - - fn from_inner(inner: Self::Inner) -> Self { - Self(inner) - } -} +#[doc(hidden)] +pub trait PairedCryptoSubTagBound {} +#[doc(hidden)] +pub struct PairedCryptoTag; -impl PassBy for Public { - type PassBy = pass_by::Inner; -} +/// A public key. +pub type Public = + PublicBytes; -#[cfg(feature = "full_crypto")] impl< LeftPair: PairT, RightPair: PairT, const LEFT_PLUS_RIGHT_PUBLIC_LEN: usize, const SIGNATURE_LEN: usize, - > From> - for Public + SubTag: PairedCryptoSubTagBound, + > From> + for Public where - Pair: - PairT>, + Pair: + PairT>, { - fn from(x: Pair) -> Self { + fn from( + x: Pair, + ) -> Self { x.public() } } -impl UncheckedFrom<[u8; LEFT_PLUS_RIGHT_LEN]> - for Public -{ - fn unchecked_from(data: [u8; LEFT_PLUS_RIGHT_LEN]) -> Self { - Public(data) - } -} - -#[cfg(feature = "std")] -impl std::fmt::Display for Public -where - Public: CryptoType, -{ - fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { - write!(f, "{}", self.to_ss58check()) - } -} - -impl sp_std::fmt::Debug for Public -where - Public: CryptoType, - [u8; LEFT_PLUS_RIGHT_LEN]: crate::hexdisplay::AsBytesRef, -{ - #[cfg(feature = "std")] - fn fmt(&self, f: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result { - let s = self.to_ss58check(); - write!(f, "{} ({}...)", crate::hexdisplay::HexDisplay::from(&self.0), &s[0..8]) - } - - #[cfg(not(feature = "std"))] - fn fmt(&self, _: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result { - Ok(()) - } -} - -#[cfg(feature = "serde")] -impl Serialize for Public -where - Public: CryptoType, -{ - fn serialize(&self, serializer: S) -> Result - where - S: Serializer, - { - serializer.serialize_str(&self.to_ss58check()) - } -} - -#[cfg(feature = "serde")] -impl<'de, const LEFT_PLUS_RIGHT_LEN: usize> Deserialize<'de> for Public -where - Public: CryptoType, -{ - fn deserialize(deserializer: D) -> Result - where - D: Deserializer<'de>, - { - Public::from_ss58check(&String::deserialize(deserializer)?) - .map_err(|e| de::Error::custom(format!("{:?}", e))) - } -} - -impl PublicT for Public where - Public: CryptoType -{ -} - -impl Derive for Public {} - -/// Trait characterizing a signature which could be used as individual component of an -/// `paired_crypto:Signature` pair. -pub trait SignatureBound: ByteArray {} - -impl SignatureBound for T {} - /// A pair of signatures of different types -#[derive(Clone, Encode, Decode, MaxEncodedLen, TypeInfo, PartialEq, Eq)] -pub struct Signature([u8; LEFT_PLUS_RIGHT_LEN]); - -#[cfg(feature = "full_crypto")] -impl sp_std::hash::Hash for Signature { - fn hash(&self, state: &mut H) { - self.0.hash(state); - } -} - -impl ByteArray for Signature { - const LEN: usize = LEFT_PLUS_RIGHT_LEN; -} - -impl TryFrom<&[u8]> for Signature { - type Error = (); - - fn try_from(data: &[u8]) -> Result { - if data.len() != LEFT_PLUS_RIGHT_LEN { - return Err(()) - } - let mut inner = [0u8; LEFT_PLUS_RIGHT_LEN]; - inner.copy_from_slice(data); - Ok(Signature(inner)) - } -} - -impl AsMut<[u8]> for Signature { - fn as_mut(&mut self) -> &mut [u8] { - &mut self.0[..] - } -} - -impl AsRef<[u8; LEFT_PLUS_RIGHT_LEN]> - for Signature -{ - fn as_ref(&self) -> &[u8; LEFT_PLUS_RIGHT_LEN] { - &self.0 - } -} - -impl AsRef<[u8]> for Signature { - fn as_ref(&self) -> &[u8] { - &self.0[..] - } -} - -#[cfg(feature = "serde")] -impl Serialize for Signature { - fn serialize(&self, serializer: S) -> Result - where - S: Serializer, - { - serializer.serialize_str(&array_bytes::bytes2hex("", self)) - } -} - -#[cfg(feature = "serde")] -impl<'de, const LEFT_PLUS_RIGHT_LEN: usize> Deserialize<'de> for Signature { - fn deserialize(deserializer: D) -> Result - where - D: Deserializer<'de>, - { - let bytes = array_bytes::hex2bytes(&String::deserialize(deserializer)?) - .map_err(|e| de::Error::custom(format!("{:?}", e)))?; - Signature::::try_from(bytes.as_ref()).map_err(|e| { - de::Error::custom(format!("Error converting deserialized data into signature: {:?}", e)) - }) - } -} - -impl From> - for [u8; LEFT_PLUS_RIGHT_LEN] -{ - fn from(signature: Signature) -> [u8; LEFT_PLUS_RIGHT_LEN] { - signature.0 - } -} - -impl sp_std::fmt::Debug for Signature -where - [u8; LEFT_PLUS_RIGHT_LEN]: crate::hexdisplay::AsBytesRef, -{ - #[cfg(feature = "std")] - fn fmt(&self, f: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result { - write!(f, "{}", crate::hexdisplay::HexDisplay::from(&self.0)) - } - - #[cfg(not(feature = "std"))] - fn fmt(&self, _: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result { - Ok(()) - } -} - -impl UncheckedFrom<[u8; LEFT_PLUS_RIGHT_LEN]> - for Signature -{ - fn unchecked_from(data: [u8; LEFT_PLUS_RIGHT_LEN]) -> Self { - Signature(data) - } -} +pub type Signature = + SignatureBytes; /// A key pair. -#[cfg(feature = "full_crypto")] -#[derive(Clone)] pub struct Pair< LeftPair: PairT, RightPair: PairT, const PUBLIC_KEY_LEN: usize, const SIGNATURE_LEN: usize, + SubTag, > { left: LeftPair, right: RightPair, + _phantom: PhantomData SubTag>, +} + +impl< + LeftPair: PairT + Clone, + RightPair: PairT + Clone, + const PUBLIC_KEY_LEN: usize, + const SIGNATURE_LEN: usize, + SubTag, + > Clone for Pair +{ + fn clone(&self) -> Self { + Self { left: self.left.clone(), right: self.right.clone(), _phantom: PhantomData } + } } -#[cfg(feature = "full_crypto")] impl< LeftPair: PairT, RightPair: PairT, const PUBLIC_KEY_LEN: usize, const SIGNATURE_LEN: usize, - > PairT for Pair + SubTag: PairedCryptoSubTagBound, + > PairT for Pair where - Pair: CryptoType, - LeftPair::Signature: SignatureBound, - RightPair::Signature: SignatureBound, - Public: CryptoType, + Pair: CryptoType, + Public: PublicT, + Signature: SignatureT, LeftPair::Seed: From + Into, RightPair::Seed: From + Into, { type Seed = Seed; - type Public = Public; - type Signature = Signature; + type Public = Public; + type Signature = Signature; fn from_seed_slice(seed_slice: &[u8]) -> Result { if seed_slice.len() != SECURE_SEED_LEN { @@ -448,7 +220,7 @@ where } let left = LeftPair::from_seed_slice(&seed_slice)?; let right = RightPair::from_seed_slice(&seed_slice)?; - Ok(Pair { left, right }) + Ok(Pair { left, right, _phantom: PhantomData }) } /// Derive a child key from a series of given junctions. @@ -460,17 +232,18 @@ where path: Iter, seed: Option, ) -> Result<(Self, Option), DeriveError> { - let path: Vec<_> = path.collect(); + let left_path: Vec<_> = path.collect(); + let right_path: Vec<_> = left_path.clone(); - let left = self.left.derive(path.iter().cloned(), seed.map(|s| s.into()))?; - let right = self.right.derive(path.into_iter(), seed.map(|s| s.into()))?; + let left = self.left.derive(left_path.into_iter(), seed.map(|s| s.into()))?; + let right = self.right.derive(right_path.into_iter(), seed.map(|s| s.into()))?; let seed = match (left.1, right.1) { (Some(l), Some(r)) if l.as_ref() == r.as_ref() => Some(l.into()), _ => None, }; - Ok((Self { left: left.0, right: right.0 }, seed)) + Ok((Self { left: left.0, right: right.0, _phantom: PhantomData }, seed)) } fn public(&self) -> Self::Public { @@ -482,6 +255,7 @@ where Self::Public::unchecked_from(raw) } + #[cfg(feature = "full_crypto")] fn sign(&self, message: &[u8]) -> Self::Signature { let mut raw: [u8; SIGNATURE_LEN] = [0u8; SIGNATURE_LEN]; raw[..LeftPair::Signature::LEN].copy_from_slice(self.left.sign(message).as_ref()); @@ -489,16 +263,18 @@ where Self::Signature::unchecked_from(raw) } - fn verify>(sig: &Self::Signature, message: M, public: &Self::Public) -> bool { + fn verify>( + sig: &Self::Signature, + message: Msg, + public: &Self::Public, + ) -> bool { let Ok(left_pub) = public.0[..LeftPair::Public::LEN].try_into() else { return false }; let Ok(left_sig) = sig.0[0..LeftPair::Signature::LEN].try_into() else { return false }; if !LeftPair::verify(&left_sig, message.as_ref(), &left_pub) { return false } - let Ok(right_pub) = public.0[LeftPair::Public::LEN..PUBLIC_KEY_LEN].try_into() else { - return false - }; + let Ok(right_pub) = public.0[LeftPair::Public::LEN..].try_into() else { return false }; let Ok(right_sig) = sig.0[LeftPair::Signature::LEN..].try_into() else { return false }; RightPair::verify(&right_sig, message.as_ref(), &right_pub) } @@ -513,13 +289,14 @@ where // Test set exercising the (ECDSA,BLS12-377) implementation #[cfg(all(test, feature = "bls-experimental"))] -mod test { +mod tests { use super::*; - use crate::{crypto::DEV_PHRASE, KeccakHasher}; + #[cfg(feature = "serde")] + use crate::crypto::Ss58Codec; + use crate::{bls377, crypto::DEV_PHRASE, ecdsa, KeccakHasher}; + use codec::{Decode, Encode}; use ecdsa_bls377::{Pair, Signature}; - use crate::{bls377, ecdsa}; - #[test] fn test_length_of_paired_ecdsa_and_bls377_public_key_and_signature_is_correct() { assert_eq!( @@ -542,13 +319,30 @@ mod test { ); } + #[test] + fn generate_with_phrase_should_be_recoverable_with_from_string() { + let (pair, phrase, seed) = Pair::generate_with_phrase(None); + let repair_seed = Pair::from_seed_slice(seed.as_ref()).expect("seed slice is valid"); + assert_eq!(pair.public(), repair_seed.public()); + assert_eq!(pair.to_raw_vec(), repair_seed.to_raw_vec()); + + let (repair_phrase, reseed) = + Pair::from_phrase(phrase.as_ref(), None).expect("seed slice is valid"); + assert_eq!(seed, reseed); + assert_eq!(pair.public(), repair_phrase.public()); + assert_eq!(pair.to_raw_vec(), repair_seed.to_raw_vec()); + let repair_string = Pair::from_string(phrase.as_str(), None).expect("seed slice is valid"); + assert_eq!(pair.public(), repair_string.public()); + assert_eq!(pair.to_raw_vec(), repair_seed.to_raw_vec()); + } + #[test] fn seed_and_derive_should_work() { let seed_for_right_and_left: [u8; SECURE_SEED_LEN] = array_bytes::hex2array_unchecked( "9d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f60", ); let pair = Pair::from_seed(&seed_for_right_and_left); - // we are using hash to field so this is not going to work + // we are using hash-to-field so this is not going to work // assert_eq!(pair.seed(), seed); let path = vec![DeriveJunction::Hard([0u8; 32])]; let derived = pair.derive(path.into_iter(), None).ok().unwrap().0; @@ -599,13 +393,13 @@ mod test { assert_eq!( public, Public::unchecked_from( - array_bytes::hex2array_unchecked("028db55b05db86c0b1786ca49f095d76344c9e6056b2f02701a7e7f3c20aabfd916dc6be608fab3c6bd894a606be86db346cc170db85c733853a371f3db54ae1b12052c0888d472760c81b537572a26f00db865e5963aef8634f9917571c51b538b564b2a9ceda938c8b930969ee3b832448e08e33a79e9ddd28af419a3ce45300f5dbc768b067781f44f3fe05a19e6b07b1c4196151ec3f8ea37e4f89a8963030d2101e931276bb9ebe1f20102239d780" + array_bytes::hex2array_unchecked("028db55b05db86c0b1786ca49f095d76344c9e6056b2f02701a7e7f3c20aabfd917a84ca8ce4c37c93c95ecee6a3c0c9a7b9c225093cf2f12dc4f69cbfb847ef9424a18f5755d5a742247d386ff2aabb806bcf160eff31293ea9616976628f77266c8a8cc1d8753be04197bd6cdd8c5c87a148f782c4c1568d599b48833fd539001e580cff64bbc71850605433fcd051f3afc3b74819786f815ffb5272030a8d03e5df61e6183f8fd8ea85f26defa83400" ), ), ); let message = b""; let signature = - array_bytes::hex2array_unchecked("3dde91174bd9359027be59a428b8146513df80a2a3c7eda2194f64de04a69ab97b753169e94db6ffd50921a2668a48b94ca11e3d32c1ff19cfe88890aa7e8f3c00bbb395bbdee1a35930912034f5fde3b36df2835a0536c865501b0675776a1d5931a3bea2e66eff73b2546c6af2061a8019223e4ebbbed661b2538e0f5823f2c708eb89c406beca8fcb53a5c13dbc7c0c42e4cf2be2942bba96ea29297915a06bd2b1b979c0e2ac8fd4ec684a6b5d110c" + array_bytes::hex2array_unchecked("3dde91174bd9359027be59a428b8146513df80a2a3c7eda2194f64de04a69ab97b753169e94db6ffd50921a2668a48b94ca11e3d32c1ff19cfe88890aa7e8f3c00d1e3013161991e142d8751017d4996209c2ff8a9ee160f373733eda3b4b785ba6edce9f45f87104bbe07aa6aa6eb2780aa705efb2c13d3b317d6409d159d23bdc7cdd5c2a832d1551cf49d811d49c901495e527dbd532e3a462335ce2686009104aba7bc11c5b22be78f3198d2727a0b" ); let signature = Signature::unchecked_from(signature); assert!(pair.sign(&message[..]) == signature); @@ -664,6 +458,7 @@ mod test { let (pair2, _) = Pair::from_phrase(&phrase, None).unwrap(); assert_ne!(pair1.public(), pair2.public()); + assert_ne!(pair1.to_raw_vec(), pair2.to_raw_vec()); } #[test] diff --git a/substrate/primitives/core/src/sr25519.rs b/substrate/primitives/core/src/sr25519.rs index b821055e2c56713067bf096899c2b10b6155c877..54b9a98db3d2ca2b69af5ab77701e4e8c0b70a83 100644 --- a/substrate/primitives/core/src/sr25519.rs +++ b/substrate/primitives/core/src/sr25519.rs @@ -19,124 +19,68 @@ //! //! Note: `CHAIN_CODE_LENGTH` must be equal to `crate::crypto::JUNCTION_ID_LEN` //! for this to work. -#[cfg(any(feature = "full_crypto", feature = "serde"))] -use crate::crypto::DeriveJunction; + #[cfg(feature = "serde")] use crate::crypto::Ss58Codec; -#[cfg(feature = "full_crypto")] -use crate::crypto::{DeriveError, Pair as TraitPair, SecretStringError}; -#[cfg(feature = "full_crypto")] -use schnorrkel::{ - derive::CHAIN_CODE_LENGTH, signing_context, ExpansionMode, Keypair, MiniSecretKey, SecretKey, +use crate::crypto::{ + CryptoBytes, DeriveError, DeriveJunction, Pair as TraitPair, SecretStringError, }; -#[cfg(any(feature = "full_crypto", feature = "serde"))] +#[cfg(feature = "full_crypto")] +use schnorrkel::signing_context; use schnorrkel::{ - derive::{ChainCode, Derivation}, - PublicKey, + derive::{ChainCode, Derivation, CHAIN_CODE_LENGTH}, + ExpansionMode, Keypair, MiniSecretKey, PublicKey, SecretKey, }; use sp_std::vec::Vec; -use crate::{ - crypto::{ - ByteArray, CryptoType, CryptoTypeId, Derive, FromEntropy, Public as TraitPublic, - UncheckedFrom, - }, - hash::{H256, H512}, -}; +use crate::crypto::{CryptoType, CryptoTypeId, Derive, Public as TraitPublic, SignatureBytes}; use codec::{Decode, Encode, MaxEncodedLen}; use scale_info::TypeInfo; -use sp_std::ops::Deref; -#[cfg(feature = "full_crypto")] use schnorrkel::keys::{MINI_SECRET_KEY_LENGTH, SECRET_KEY_LENGTH}; #[cfg(feature = "serde")] use serde::{de, Deserialize, Deserializer, Serialize, Serializer}; +#[cfg(feature = "std")] use sp_runtime_interface::pass_by::PassByInner; #[cfg(all(not(feature = "std"), feature = "serde"))] use sp_std::alloc::{format, string::String}; // signing context -#[cfg(feature = "full_crypto")] const SIGNING_CTX: &[u8] = b"substrate"; /// An identifier used to match public keys against sr25519 keys pub const CRYPTO_ID: CryptoTypeId = CryptoTypeId(*b"sr25"); -/// An Schnorrkel/Ristretto x25519 ("sr25519") public key. -#[cfg_attr(feature = "full_crypto", derive(Hash))] -#[derive( - PartialEq, - Eq, - PartialOrd, - Ord, - Clone, - Copy, - Encode, - Decode, - PassByInner, - MaxEncodedLen, - TypeInfo, -)] -pub struct Public(pub [u8; 32]); +/// The byte length of public key +pub const PUBLIC_KEY_SERIALIZED_SIZE: usize = 32; -/// An Schnorrkel/Ristretto x25519 ("sr25519") key pair. -#[cfg(feature = "full_crypto")] -pub struct Pair(Keypair); +/// The byte length of signature +pub const SIGNATURE_SERIALIZED_SIZE: usize = 64; -#[cfg(feature = "full_crypto")] -impl Clone for Pair { - fn clone(&self) -> Self { - Pair(schnorrkel::Keypair { - public: self.0.public, - secret: schnorrkel::SecretKey::from_bytes(&self.0.secret.to_bytes()[..]) - .expect("key is always the correct size; qed"), - }) - } -} +#[doc(hidden)] +pub struct Sr25519Tag; +#[doc(hidden)] +pub struct Sr25519PublicTag; -impl FromEntropy for Public { - fn from_entropy(input: &mut impl codec::Input) -> Result { - let mut result = Self([0u8; 32]); - input.read(&mut result.0[..])?; - Ok(result) - } -} - -impl AsRef<[u8; 32]> for Public { - fn as_ref(&self) -> &[u8; 32] { - &self.0 - } -} - -impl AsRef<[u8]> for Public { - fn as_ref(&self) -> &[u8] { - &self.0[..] - } -} - -impl AsMut<[u8]> for Public { - fn as_mut(&mut self) -> &mut [u8] { - &mut self.0[..] - } -} - -impl Deref for Public { - type Target = [u8]; - - fn deref(&self) -> &Self::Target { - &self.0 - } -} +/// An Schnorrkel/Ristretto x25519 ("sr25519") public key. +pub type Public = CryptoBytes; -impl From for [u8; 32] { - fn from(x: Public) -> [u8; 32] { - x.0 - } -} +impl TraitPublic for Public {} -impl From for H256 { - fn from(x: Public) -> H256 { - x.0.into() +impl Derive for Public { + /// Derive a child key from a series of given junctions. + /// + /// `None` if there are any hard junctions in there. + #[cfg(feature = "serde")] + fn derive>(&self, path: Iter) -> Option { + let mut acc = PublicKey::from_bytes(self.as_ref()).ok()?; + for j in path { + match j { + DeriveJunction::Soft(cc) => acc = acc.derived_key_simple(ChainCode(cc), &[]).0, + DeriveJunction::Hard(_cc) => return None, + } + } + Some(Self::from(acc.to_bytes())) } } @@ -149,31 +93,6 @@ impl std::str::FromStr for Public { } } -impl TryFrom<&[u8]> for Public { - type Error = (); - - fn try_from(data: &[u8]) -> Result { - if data.len() != Self::LEN { - return Err(()) - } - let mut r = [0u8; 32]; - r.copy_from_slice(data); - Ok(Self::unchecked_from(r)) - } -} - -impl UncheckedFrom<[u8; 32]> for Public { - fn unchecked_from(x: [u8; 32]) -> Self { - Public::from_raw(x) - } -} - -impl UncheckedFrom for Public { - fn unchecked_from(x: H256) -> Self { - Public::from_h256(x) - } -} - #[cfg(feature = "std")] impl std::fmt::Display for Public { fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { @@ -185,7 +104,7 @@ impl sp_std::fmt::Debug for Public { #[cfg(feature = "std")] fn fmt(&self, f: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result { let s = self.to_ss58check(); - write!(f, "{} ({}...)", crate::hexdisplay::HexDisplay::from(&self.0), &s[0..8]) + write!(f, "{} ({}...)", crate::hexdisplay::HexDisplay::from(self.inner()), &s[0..8]) } #[cfg(not(feature = "std"))] @@ -216,189 +135,28 @@ impl<'de> Deserialize<'de> for Public { } /// An Schnorrkel/Ristretto x25519 ("sr25519") signature. -#[cfg_attr(feature = "full_crypto", derive(Hash))] -#[derive(Encode, Decode, MaxEncodedLen, PassByInner, TypeInfo, PartialEq, Eq)] -pub struct Signature(pub [u8; 64]); - -impl TryFrom<&[u8]> for Signature { - type Error = (); - - fn try_from(data: &[u8]) -> Result { - if data.len() == 64 { - let mut inner = [0u8; 64]; - inner.copy_from_slice(data); - Ok(Signature(inner)) - } else { - Err(()) - } - } -} - -#[cfg(feature = "serde")] -impl Serialize for Signature { - fn serialize(&self, serializer: S) -> Result - where - S: Serializer, - { - serializer.serialize_str(&array_bytes::bytes2hex("", self)) - } -} - -#[cfg(feature = "serde")] -impl<'de> Deserialize<'de> for Signature { - fn deserialize(deserializer: D) -> Result - where - D: Deserializer<'de>, - { - let signature_hex = array_bytes::hex2bytes(&String::deserialize(deserializer)?) - .map_err(|e| de::Error::custom(format!("{:?}", e)))?; - Signature::try_from(signature_hex.as_ref()) - .map_err(|e| de::Error::custom(format!("{:?}", e))) - } -} - -impl Clone for Signature { - fn clone(&self) -> Self { - let mut r = [0u8; 64]; - r.copy_from_slice(&self.0[..]); - Signature(r) - } -} - -impl From for [u8; 64] { - fn from(v: Signature) -> [u8; 64] { - v.0 - } -} - -impl From for H512 { - fn from(v: Signature) -> H512 { - H512::from(v.0) - } -} - -impl AsRef<[u8; 64]> for Signature { - fn as_ref(&self) -> &[u8; 64] { - &self.0 - } -} - -impl AsRef<[u8]> for Signature { - fn as_ref(&self) -> &[u8] { - &self.0[..] - } -} - -impl AsMut<[u8]> for Signature { - fn as_mut(&mut self) -> &mut [u8] { - &mut self.0[..] - } -} +pub type Signature = SignatureBytes; #[cfg(feature = "full_crypto")] impl From for Signature { fn from(s: schnorrkel::Signature) -> Signature { - Signature(s.to_bytes()) - } -} - -impl sp_std::fmt::Debug for Signature { - #[cfg(feature = "std")] - fn fmt(&self, f: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result { - write!(f, "{}", crate::hexdisplay::HexDisplay::from(&self.0)) - } - - #[cfg(not(feature = "std"))] - fn fmt(&self, _: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result { - Ok(()) - } -} - -impl UncheckedFrom<[u8; 64]> for Signature { - fn unchecked_from(data: [u8; 64]) -> Signature { - Signature(data) - } -} - -impl Signature { - /// A new instance from the given 64-byte `data`. - /// - /// NOTE: No checking goes on to ensure this is a real signature. Only use - /// it if you are certain that the array actually is a signature, or if you - /// immediately verify the signature. All functions that verify signatures - /// will fail if the `Signature` is not actually a valid signature. - pub fn from_raw(data: [u8; 64]) -> Signature { - Signature(data) - } - - /// A new instance from the given slice that should be 64 bytes long. - /// - /// NOTE: No checking goes on to ensure this is a real signature. Only use it if - /// you are certain that the array actually is a signature. GIGO! - pub fn from_slice(data: &[u8]) -> Option { - if data.len() != 64 { - return None - } - let mut r = [0u8; 64]; - r.copy_from_slice(data); - Some(Signature(r)) - } - - /// A new instance from an H512. - /// - /// NOTE: No checking goes on to ensure this is a real signature. Only use it if - /// you are certain that the array actually is a signature. GIGO! - pub fn from_h512(v: H512) -> Signature { - Signature(v.into()) - } -} - -impl Derive for Public { - /// Derive a child key from a series of given junctions. - /// - /// `None` if there are any hard junctions in there. - #[cfg(feature = "serde")] - fn derive>(&self, path: Iter) -> Option { - let mut acc = PublicKey::from_bytes(self.as_ref()).ok()?; - for j in path { - match j { - DeriveJunction::Soft(cc) => acc = acc.derived_key_simple(ChainCode(cc), &[]).0, - DeriveJunction::Hard(_cc) => return None, - } - } - Some(Self(acc.to_bytes())) + Signature::from(s.to_bytes()) } } -impl Public { - /// A new instance from the given 32-byte `data`. - /// - /// NOTE: No checking goes on to ensure this is a real public key. Only use it if - /// you are certain that the array actually is a pubkey. GIGO! - pub fn from_raw(data: [u8; 32]) -> Self { - Public(data) - } - - /// A new instance from an H256. - /// - /// NOTE: No checking goes on to ensure this is a real public key. Only use it if - /// you are certain that the array actually is a pubkey. GIGO! - pub fn from_h256(x: H256) -> Self { - Public(x.into()) - } +/// An Schnorrkel/Ristretto x25519 ("sr25519") key pair. +pub struct Pair(Keypair); - /// Return a slice filled with raw data. - pub fn as_array_ref(&self) -> &[u8; 32] { - self.as_ref() +impl Clone for Pair { + fn clone(&self) -> Self { + Pair(schnorrkel::Keypair { + public: self.0.public, + secret: schnorrkel::SecretKey::from_bytes(&self.0.secret.to_bytes()[..]) + .expect("key is always the correct size; qed"), + }) } } -impl ByteArray for Public { - const LEN: usize = 32; -} - -impl TraitPublic for Public {} - #[cfg(feature = "std")] impl From for Pair { fn from(sec: MiniSecretKey) -> Pair { @@ -435,16 +193,13 @@ impl AsRef for Pair { } /// Derive a single hard junction. -#[cfg(feature = "full_crypto")] fn derive_hard_junction(secret: &SecretKey, cc: &[u8; CHAIN_CODE_LENGTH]) -> MiniSecretKey { secret.hard_derive_mini_secret_key(Some(ChainCode(*cc)), b"").0 } /// The raw secret seed, which can be used to recreate the `Pair`. -#[cfg(feature = "full_crypto")] type Seed = [u8; MINI_SECRET_KEY_LENGTH]; -#[cfg(feature = "full_crypto")] impl TraitPair for Pair { type Public = Public; type Seed = Seed; @@ -452,9 +207,7 @@ impl TraitPair for Pair { /// Get the public key. fn public(&self) -> Public { - let mut pk = [0u8; 32]; - pk.copy_from_slice(&self.0.public.to_bytes()); - Public(pk) + Public::from(self.0.public.to_bytes()) } /// Make a new key pair from raw secret seed material. @@ -499,6 +252,7 @@ impl TraitPair for Pair { Ok((Self(result.into()), seed.map(|s| MiniSecretKey::to_bytes(&s)))) } + #[cfg(feature = "full_crypto")] fn sign(&self, message: &[u8]) -> Signature { let context = signing_context(SIGNING_CTX); self.0.sign(context.bytes(message)).into() @@ -533,16 +287,13 @@ impl Pair { } impl CryptoType for Public { - #[cfg(feature = "full_crypto")] type Pair = Pair; } impl CryptoType for Signature { - #[cfg(feature = "full_crypto")] type Pair = Pair; } -#[cfg(feature = "full_crypto")] impl CryptoType for Pair { type Pair = Pair; } @@ -736,7 +487,7 @@ pub mod vrf { impl VrfPublic for Public { fn vrf_verify(&self, data: &Self::VrfSignData, signature: &Self::VrfSignature) -> bool { let do_verify = || { - let public = schnorrkel::PublicKey::from_bytes(self)?; + let public = schnorrkel::PublicKey::from_bytes(&self.0)?; let inout = signature.pre_output.0.attach_input_hash(&public, data.transcript.0.clone())?; @@ -836,7 +587,10 @@ pub mod vrf { #[cfg(test)] mod tests { use super::{vrf::*, *}; - use crate::crypto::{Ss58Codec, VrfPublic, VrfSecret, DEV_ADDRESS, DEV_PHRASE}; + use crate::{ + crypto::{Ss58Codec, VrfPublic, VrfSecret, DEV_ADDRESS, DEV_PHRASE}, + ByteArray as _, + }; use serde_json; #[test] @@ -970,6 +724,22 @@ mod tests { assert!(Pair::verify(&signature, &message[..], &public)); } + #[test] + fn generate_with_phrase_should_be_recoverable_with_from_string() { + let (pair, phrase, seed) = Pair::generate_with_phrase(None); + let repair_seed = Pair::from_seed_slice(seed.as_ref()).expect("seed slice is valid"); + assert_eq!(pair.public(), repair_seed.public()); + assert_eq!(pair.to_raw_vec(), repair_seed.to_raw_vec()); + let (repair_phrase, reseed) = + Pair::from_phrase(phrase.as_ref(), None).expect("seed slice is valid"); + assert_eq!(seed, reseed); + assert_eq!(pair.public(), repair_phrase.public()); + assert_eq!(pair.to_raw_vec(), repair_seed.to_raw_vec()); + let repair_string = Pair::from_string(phrase.as_str(), None).expect("seed slice is valid"); + assert_eq!(pair.public(), repair_string.public()); + assert_eq!(pair.to_raw_vec(), repair_seed.to_raw_vec()); + } + #[test] fn generated_pair_should_work() { let (pair, _) = Pair::generate(); @@ -984,10 +754,10 @@ mod tests { let (pair, _) = Pair::generate(); let public = pair.public(); let message = b"Signed payload"; - let Signature(mut bytes) = pair.sign(&message[..]); + let mut signature = pair.sign(&message[..]); + let bytes = &mut signature.0; bytes[0] = !bytes[0]; bytes[2] = !bytes[2]; - let signature = Signature(bytes); assert!(!Pair::verify(&signature, &message[..], &public)); } diff --git a/substrate/primitives/core/src/testing.rs b/substrate/primitives/core/src/testing.rs index 947dcc387fc79605e4c51d9c28e88c2664dd28c7..c26e23d442f1f584ed888de7e65b5b81a230f70e 100644 --- a/substrate/primitives/core/src/testing.rs +++ b/substrate/primitives/core/src/testing.rs @@ -89,7 +89,7 @@ macro_rules! wasm_export_functions { &[0u8; 0] } else { unsafe { - $crate::sp_std::slice::from_raw_parts(input_data, input_len) + ::core::slice::from_raw_parts(input_data, input_len) } }; @@ -117,7 +117,7 @@ macro_rules! wasm_export_functions { &[0u8; 0] } else { unsafe { - $crate::sp_std::slice::from_raw_parts(input_data, input_len) + ::core::slice::from_raw_parts(input_data, input_len) } }; diff --git a/substrate/primitives/crypto/ec-utils/Cargo.toml b/substrate/primitives/crypto/ec-utils/Cargo.toml index 43daad0892187ff34c94c1fbc657534f071dc6f2..142a5abf9b30d660077d39c12808a26d47bd41b6 100644 --- a/substrate/primitives/crypto/ec-utils/Cargo.toml +++ b/substrate/primitives/crypto/ec-utils/Cargo.toml @@ -28,7 +28,6 @@ ark-ed-on-bls12-377-ext = { version = "0.4.1", default-features = false, optiona ark-ed-on-bls12-377 = { version = "0.4.0", default-features = false, optional = true } ark-scale = { version = "0.0.12", default-features = false, features = ["hazmat"], optional = true } sp-runtime-interface = { path = "../../runtime-interface", default-features = false, optional = true } -sp-std = { path = "../../std", default-features = false, optional = true } [features] default = ["std"] @@ -47,9 +46,8 @@ std = [ "ark-ed-on-bls12-381-bandersnatch?/std", "ark-scale?/std", "sp-runtime-interface?/std", - "sp-std?/std", ] -common = ["ark-ec", "ark-scale", "sp-runtime-interface", "sp-std"] +common = ["ark-ec", "ark-scale", "sp-runtime-interface"] bls12-377 = ["ark-bls12-377", "ark-bls12-377-ext", "common"] bls12-381 = ["ark-bls12-381", "ark-bls12-381-ext", "common"] bw6-761 = ["ark-bw6-761", "ark-bw6-761-ext", "common"] diff --git a/substrate/primitives/crypto/ec-utils/src/bls12_377.rs b/substrate/primitives/crypto/ec-utils/src/bls12_377.rs index 8f19a2c4a1911f0d1045d0eebf98958236830e0f..a1ea5dbbf935a48ebc5fc971517657c8210c8deb 100644 --- a/substrate/primitives/crypto/ec-utils/src/bls12_377.rs +++ b/substrate/primitives/crypto/ec-utils/src/bls12_377.rs @@ -18,10 +18,10 @@ //! *BLS12-377* types and host functions. use crate::utils; +use alloc::vec::Vec; use ark_bls12_377_ext::CurveHooks; use ark_ec::{pairing::Pairing, CurveConfig}; use sp_runtime_interface::runtime_interface; -use sp_std::vec::Vec; /// First pairing group definitions. pub mod g1 { diff --git a/substrate/primitives/crypto/ec-utils/src/bls12_381.rs b/substrate/primitives/crypto/ec-utils/src/bls12_381.rs index 99a0289b7ad26b09bcb39e469ec8bf5203e47cb2..5e02862ed7ba53fcf3c25d037683bad0059496d3 100644 --- a/substrate/primitives/crypto/ec-utils/src/bls12_381.rs +++ b/substrate/primitives/crypto/ec-utils/src/bls12_381.rs @@ -18,10 +18,10 @@ //! *BLS12-381* types and host functions. use crate::utils; +use alloc::vec::Vec; use ark_bls12_381_ext::CurveHooks; use ark_ec::{pairing::Pairing, CurveConfig}; use sp_runtime_interface::runtime_interface; -use sp_std::vec::Vec; /// First pairing group definitions. pub mod g1 { diff --git a/substrate/primitives/crypto/ec-utils/src/bw6_761.rs b/substrate/primitives/crypto/ec-utils/src/bw6_761.rs index a68abf6e43e0384a1afe6beafdd99963a6fc48ff..4ee1035f670f8a9607df4fc9a513abdab73d454a 100644 --- a/substrate/primitives/crypto/ec-utils/src/bw6_761.rs +++ b/substrate/primitives/crypto/ec-utils/src/bw6_761.rs @@ -18,10 +18,10 @@ //! *BW6-761* types and host functions. use crate::utils; +use alloc::vec::Vec; use ark_bw6_761_ext::CurveHooks; use ark_ec::{pairing::Pairing, CurveConfig}; use sp_runtime_interface::runtime_interface; -use sp_std::vec::Vec; /// First pairing group definitions. pub mod g1 { diff --git a/substrate/primitives/crypto/ec-utils/src/ed_on_bls12_377.rs b/substrate/primitives/crypto/ec-utils/src/ed_on_bls12_377.rs index a03be41b854284d5a02956f5ae099f1b2c21d4ed..e068507b3473e68671f00be314a6167a874a2ce0 100644 --- a/substrate/primitives/crypto/ec-utils/src/ed_on_bls12_377.rs +++ b/substrate/primitives/crypto/ec-utils/src/ed_on_bls12_377.rs @@ -18,10 +18,10 @@ //! *Ed-on-BLS12-377* types and host functions. use crate::utils; +use alloc::vec::Vec; use ark_ec::CurveConfig; use ark_ed_on_bls12_377_ext::CurveHooks; use sp_runtime_interface::runtime_interface; -use sp_std::vec::Vec; /// Curve hooks jumping into [`host_calls`] host functions. #[derive(Copy, Clone)] diff --git a/substrate/primitives/crypto/ec-utils/src/ed_on_bls12_381_bandersnatch.rs b/substrate/primitives/crypto/ec-utils/src/ed_on_bls12_381_bandersnatch.rs index 9d63f35876521091fd757c9e7ca15a446fd1f1e9..487ad98dac657e5ed5ea01f045c82f60185f549c 100644 --- a/substrate/primitives/crypto/ec-utils/src/ed_on_bls12_381_bandersnatch.rs +++ b/substrate/primitives/crypto/ec-utils/src/ed_on_bls12_381_bandersnatch.rs @@ -19,10 +19,10 @@ //! computationally expensive operations. use crate::utils; +use alloc::vec::Vec; use ark_ec::CurveConfig; use ark_ed_on_bls12_381_bandersnatch_ext::CurveHooks; use sp_runtime_interface::runtime_interface; -use sp_std::vec::Vec; /// Curve hooks jumping into [`host_calls`] host functions. #[derive(Copy, Clone)] diff --git a/substrate/primitives/crypto/ec-utils/src/lib.rs b/substrate/primitives/crypto/ec-utils/src/lib.rs index 970ad71765a5b27791a84a4fb963f8e4386b9297..3254bbe648f4f2e8fae02c33d03d50e10c0a91cb 100644 --- a/substrate/primitives/crypto/ec-utils/src/lib.rs +++ b/substrate/primitives/crypto/ec-utils/src/lib.rs @@ -32,6 +32,8 @@ #![warn(missing_docs)] #![cfg_attr(not(feature = "std"), no_std)] +extern crate alloc; + #[cfg(feature = "bls12-377")] pub mod bls12_377; #[cfg(feature = "bls12-381")] diff --git a/substrate/primitives/crypto/ec-utils/src/utils.rs b/substrate/primitives/crypto/ec-utils/src/utils.rs index d0dd8ed8131c4d40b68bdbc0a1f7155318a9c449..47a49fe16cc2405c3edc9a1ffe6dfb86e19fe183 100644 --- a/substrate/primitives/crypto/ec-utils/src/utils.rs +++ b/substrate/primitives/crypto/ec-utils/src/utils.rs @@ -21,6 +21,7 @@ // curve may be excluded by the build we resort to `#[allow(unused)]` to // suppress the expected warning. +use alloc::vec::Vec; use ark_ec::{ pairing::{MillerLoopOutput, Pairing}, short_weierstrass::{Affine as SWAffine, Projective as SWProjective, SWCurveConfig}, @@ -31,7 +32,6 @@ use ark_scale::{ ark_serialize::{CanonicalDeserialize, CanonicalSerialize, Compress, Validate}, scale::{Decode, Encode}, }; -use sp_std::vec::Vec; // SCALE encoding parameters shared by all the enabled modules const SCALE_USAGE: u8 = ark_scale::make_usage(Compress::No, Validate::No); diff --git a/substrate/primitives/crypto/hashing/Cargo.toml b/substrate/primitives/crypto/hashing/Cargo.toml index 3077e1e715e158322ce66882d725e19694bd6879..096650e231c8f218966883c503e21ba15e197d9b 100644 --- a/substrate/primitives/crypto/hashing/Cargo.toml +++ b/substrate/primitives/crypto/hashing/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-crypto-hashing" -version = "0.0.0" +version = "0.1.0" authors.workspace = true edition.workspace = true license = "Apache-2.0" diff --git a/substrate/primitives/crypto/hashing/proc-macro/Cargo.toml b/substrate/primitives/crypto/hashing/proc-macro/Cargo.toml index 179b70048a754799fd3b3693f934a0807cb872a6..f988042d3075933bda6ae62b48291be8ebc80936 100644 --- a/substrate/primitives/crypto/hashing/proc-macro/Cargo.toml +++ b/substrate/primitives/crypto/hashing/proc-macro/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "sp-crypto-hashing-proc-macro" -version = "0.0.0" +version = "0.1.0" authors.workspace = true edition.workspace = true license = "Apache-2.0" @@ -19,6 +19,6 @@ targets = ["x86_64-unknown-linux-gnu"] proc-macro = true [dependencies] -quote = "1.0.28" -syn = { version = "2.0.48", features = ["full", "parsing"] } +quote = { workspace = true } +syn = { features = ["full", "parsing"], workspace = true } sp-crypto-hashing = { path = "..", default-features = false } diff --git a/substrate/primitives/debug-derive/Cargo.toml b/substrate/primitives/debug-derive/Cargo.toml index 2a18f505fcbc8ad1f61449a20a58b1d8bc2aaa94..debf964aa3dfdf7cebd23e0f1d24e74b0d880ec0 100644 --- a/substrate/primitives/debug-derive/Cargo.toml +++ b/substrate/primitives/debug-derive/Cargo.toml @@ -19,8 +19,8 @@ targets = ["x86_64-unknown-linux-gnu"] proc-macro = true [dependencies] -quote = "1.0.28" -syn = "2.0.48" +quote = { workspace = true } +syn = { workspace = true } proc-macro2 = "1.0.56" [features] diff --git a/substrate/primitives/externalities/Cargo.toml b/substrate/primitives/externalities/Cargo.toml index 6dc4f0a0dadf7d4ab906c21edca72cc3ac69a51a..20fa3e3e397c23632a67ca86cecf1a593e48a0e2 100644 --- a/substrate/primitives/externalities/Cargo.toml +++ b/substrate/primitives/externalities/Cargo.toml @@ -19,9 +19,8 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false } environmental = { version = "1.1.3", default-features = false } -sp-std = { path = "../std", default-features = false } sp-storage = { path = "../storage", default-features = false } [features] default = ["std"] -std = ["codec/std", "environmental/std", "sp-std/std", "sp-storage/std"] +std = ["codec/std", "environmental/std", "sp-storage/std"] diff --git a/substrate/primitives/externalities/src/extensions.rs b/substrate/primitives/externalities/src/extensions.rs index 282e6ea914a84caae6a1c63af8d9ff0e125176fc..a4aa847a1aa8495763e4da7862e907256cf678c4 100644 --- a/substrate/primitives/externalities/src/extensions.rs +++ b/substrate/primitives/externalities/src/extensions.rs @@ -23,10 +23,12 @@ //! It is required that each extension implements the [`Extension`] trait. use crate::Error; -use sp_std::{ - any::{Any, TypeId}, +use alloc::{ boxed::Box, collections::btree_map::{BTreeMap, Entry}, +}; +use core::{ + any::{Any, TypeId}, ops::DerefMut, }; @@ -78,16 +80,16 @@ macro_rules! decl_extension { $vis struct $ext_name (pub $inner); impl $crate::Extension for $ext_name { - fn as_mut_any(&mut self) -> &mut dyn std::any::Any { + fn as_mut_any(&mut self) -> &mut dyn core::any::Any { self } - fn type_id(&self) -> std::any::TypeId { - std::any::Any::type_id(self) + fn type_id(&self) -> core::any::TypeId { + core::any::Any::type_id(self) } } - impl std::ops::Deref for $ext_name { + impl core::ops::Deref for $ext_name { type Target = $inner; fn deref(&self) -> &Self::Target { @@ -95,7 +97,7 @@ macro_rules! decl_extension { } } - impl std::ops::DerefMut for $ext_name { + impl core::ops::DerefMut for $ext_name { fn deref_mut(&mut self) -> &mut Self::Target { &mut self.0 } @@ -115,12 +117,12 @@ macro_rules! decl_extension { $vis struct $ext_name; impl $crate::Extension for $ext_name { - fn as_mut_any(&mut self) -> &mut dyn std::any::Any { + fn as_mut_any(&mut self) -> &mut dyn core::any::Any { self } - fn type_id(&self) -> std::any::TypeId { - std::any::Any::type_id(self) + fn type_id(&self) -> core::any::TypeId { + core::any::Any::type_id(self) } } } diff --git a/substrate/primitives/externalities/src/lib.rs b/substrate/primitives/externalities/src/lib.rs index 411ec97a6b82423ee6053027f03deeb802f361d0..142200f614a69d8a5e195db8d434fba4bb5a83b7 100644 --- a/substrate/primitives/externalities/src/lib.rs +++ b/substrate/primitives/externalities/src/lib.rs @@ -25,11 +25,10 @@ //! //! This crate exposes the main [`Externalities`] trait. -use sp_std::{ - any::{Any, TypeId}, - boxed::Box, - vec::Vec, -}; +extern crate alloc; + +use alloc::{boxed::Box, vec::Vec}; +use core::any::{Any, TypeId}; use sp_storage::{ChildInfo, StateVersion, TrackedStorageKey}; diff --git a/substrate/primitives/genesis-builder/Cargo.toml b/substrate/primitives/genesis-builder/Cargo.toml index 1967e9ff8856eed3f930ef50b027dd68c41ca870..96e99553294120698ae69d70e9da609326fc3489 100644 --- a/substrate/primitives/genesis-builder/Cargo.toml +++ b/substrate/primitives/genesis-builder/Cargo.toml @@ -1,12 +1,12 @@ [package] name = "sp-genesis-builder" -version = "0.7.0" +version = "0.8.0" authors.workspace = true edition.workspace = true license = "Apache-2.0" homepage = "https://substrate.io" repository.workspace = true -description = "Substrate GenesisConfig builder API" +description = "Substrate RuntimeGenesisConfig builder API" readme = "README.md" [lints] @@ -16,11 +16,19 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] +codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["bytes"] } +scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } + sp-api = { path = "../api", default-features = false } sp-runtime = { path = "../runtime", default-features = false } -sp-std = { path = "../std", default-features = false } -serde_json = { version = "1.0.111", default-features = false, features = ["alloc", "arbitrary_precision"] } +serde_json = { features = ["alloc", "arbitrary_precision"], workspace = true } [features] default = ["std"] -std = ["serde_json/std", "sp-api/std", "sp-runtime/std", "sp-std/std"] +std = [ + "codec/std", + "scale-info/std", + "serde_json/std", + "sp-api/std", + "sp-runtime/std", +] diff --git a/substrate/primitives/genesis-builder/src/lib.rs b/substrate/primitives/genesis-builder/src/lib.rs index e002cd3aa6f704d8889fd35d04fdd65b46a1b754..2cbac305b4d97438389b288c804152462769501e 100644 --- a/substrate/primitives/genesis-builder/src/lib.rs +++ b/substrate/primitives/genesis-builder/src/lib.rs @@ -19,36 +19,83 @@ //! Substrate genesis config builder //! -//! This Runtime API allows to construct `GenesisConfig`, in particular: -//! - serialize the runtime default `GenesisConfig` struct into json format, -//! - put the GenesisConfig struct into the storage. Internally this operation calls -//! `GenesisBuild::build` function for all runtime pallets, which is typically provided by -//! pallet's author. -//! - deserialize the `GenesisConfig` from given json blob and put `GenesisConfig` into the state -//! storage. Allows to build customized configuration. +//! For FRAME based runtimes, this runtime interface provides means to interact with +//! `RuntimeGenesisConfig`. Runtime provides a default `RuntimeGenesisConfig` structure in a form of +//! the JSON blob. //! -//! Providing externalities with empty storage and putting `GenesisConfig` into storage allows to -//! catch and build the raw storage of `GenesisConfig` which is the foundation for genesis block. +//! For non-FRAME runtimes this interface is intended to build genesis state of the runtime basing +//! on some input arbitrary bytes array. This documentation uses term `RuntimeGenesisConfig`, which +//! for non-FRAME runtimes may be understood as the runtime-side entity representing initial runtime +//! configuration. The representation of the preset is an arbitrary `Vec` and does not +//! necessarily have to represent a JSON blob. +//! +//! The runtime may provide a number of partial predefined `RuntimeGenesisConfig` configurations in +//! the form of patches which shall be applied on top of the default `RuntimeGenesisConfig`. The +//! patch is a JSON blob, which essentially comprises the list of key-value pairs that are to be +//! customized in the default runtime genesis config. These predefined configurations are referred +//! to as presets. +//! +//! This allows the runtime to provide a number of predefined configs (e.g. for different +//! testnets or development) without neccessity to leak the runtime types outside the itself (e.g. +//! node or chain-spec related tools). +//! +//! This Runtime API allows to interact with `RuntimeGenesisConfig`, in particular: +//! - provide the list of available preset names, +//! - provide a number of named presets of `RuntimeGenesisConfig`, +//! - provide a JSON represention of the default `RuntimeGenesisConfig` (by simply serializing the +//! default `RuntimeGenesisConfig` struct into JSON format), +//! - deserialize the full `RuntimeGenesisConfig` from given JSON blob and put the resulting +//! `RuntimeGenesisConfig` structure into the state storage creating the initial runtime's state. +//! Allows to build customized genesis. This operation internally calls `GenesisBuild::build` +//! function for all runtime pallets. +//! +//! Providing externalities with an empty storage and putting `RuntimeGenesisConfig` into storage +//! (by calling `build_state`) allows to construct the raw storage of `RuntimeGenesisConfig` +//! which is the foundation for genesis block. + +extern crate alloc; +use alloc::vec::Vec; /// The result type alias, used in build methods. `Err` contains formatted error message. pub type Result = core::result::Result<(), sp_runtime::RuntimeString>; +/// The type representing preset ID. +pub type PresetId = sp_runtime::RuntimeString; + sp_api::decl_runtime_apis! { - /// API to interact with GenesisConfig for the runtime + /// API to interact with RuntimeGenesisConfig for the runtime pub trait GenesisBuilder { - /// Creates the default `GenesisConfig` and returns it as a JSON blob. + /// Build `RuntimeGenesisConfig` from a JSON blob not using any defaults and store it in the + /// storage. + /// + /// In the case of a FRAME-based runtime, this function deserializes the full `RuntimeGenesisConfig` from the given JSON blob and + /// puts it into the storage. If the provided JSON blob is incorrect or incomplete or the + /// deserialization fails, an error is returned. /// - /// This function instantiates the default `GenesisConfig` struct for the runtime and serializes it into a JSON - /// blob. It returns a `Vec` containing the JSON representation of the default `GenesisConfig`. - fn create_default_config() -> sp_std::vec::Vec; + /// Please note that provided JSON blob must contain all `RuntimeGenesisConfig` fields, no + /// defaults will be used. + fn build_state(json: Vec) -> Result; - /// Build `GenesisConfig` from a JSON blob not using any defaults and store it in the storage. + /// Returns a JSON blob representation of the built-in `RuntimeGenesisConfig` identified by + /// `id`. /// - /// This function deserializes the full `GenesisConfig` from the given JSON blob and puts it into the storage. - /// If the provided JSON blob is incorrect or incomplete or the deserialization fails, an error is returned. - /// It is recommended to log any errors encountered during the process. + /// If `id` is `None` the function returns JSON blob representation of the default + /// `RuntimeGenesisConfig` struct of the runtime. Implementation must provide default + /// `RuntimeGenesisConfig`. + /// + /// Otherwise function returns a JSON representation of the built-in, named + /// `RuntimeGenesisConfig` preset identified by `id`, or `None` if such preset does not + /// exists. Returned `Vec` contains bytes of JSON blob (patch) which comprises a list of + /// (potentially nested) key-value pairs that are intended for customizing the default + /// runtime genesis config. The patch shall be merged (rfc7386) with the JSON representation + /// of the default `RuntimeGenesisConfig` to create a comprehensive genesis config that can + /// be used in `build_state` method. + fn get_preset(id: &Option) -> Option>; + + /// Returns a list of identifiers for available builtin `RuntimeGenesisConfig` presets. /// - /// Please note that provided json blob must contain all `GenesisConfig` fields, no defaults will be used. - fn build_config(json: sp_std::vec::Vec) -> Result; + /// The presets from the list can be queried with [`GenesisBuilder::get_preset`] method. If + /// no named presets are provided by the runtime the list is empty. + fn preset_names() -> Vec; } } diff --git a/substrate/primitives/inherents/Cargo.toml b/substrate/primitives/inherents/Cargo.toml index 2a9d205e16642d3565a941f0a2969fadc43895cb..c08ac459de530e55d0064561fe7171e811840c8f 100644 --- a/substrate/primitives/inherents/Cargo.toml +++ b/substrate/primitives/inherents/Cargo.toml @@ -17,16 +17,15 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -async-trait = { version = "0.1.74", optional = true } +async-trait = { version = "0.1.79", optional = true } codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } impl-trait-for-tuples = "0.2.2" -thiserror = { version = "1.0.48", optional = true } +thiserror = { optional = true, workspace = true } sp-runtime = { path = "../runtime", default-features = false, optional = true } -sp-std = { path = "../std", default-features = false } [dev-dependencies] -futures = "0.3.21" +futures = "0.3.30" [features] default = ["std"] @@ -35,6 +34,5 @@ std = [ "codec/std", "scale-info/std", "sp-runtime/std", - "sp-std/std", "thiserror", ] diff --git a/substrate/primitives/inherents/src/client_side.rs b/substrate/primitives/inherents/src/client_side.rs index 27479de136f2dedb333883e642d7ddc899446c45..3c299dfa4eea0203e7853a437c712c6618c09b00 100644 --- a/substrate/primitives/inherents/src/client_side.rs +++ b/substrate/primitives/inherents/src/client_side.rs @@ -23,7 +23,7 @@ use sp_runtime::traits::Block as BlockT; /// It is possible for the caller to provide custom arguments to the callee by setting the /// `ExtraArgs` generic parameter. /// -/// The crate already provides some convience implementations of this trait for +/// The crate already provides some convince implementations of this trait for /// `Box` and closures. So, it should not be required to implement /// this trait manually. #[async_trait::async_trait] diff --git a/substrate/primitives/inherents/src/lib.rs b/substrate/primitives/inherents/src/lib.rs index dd7c294f1e245126bd02ef14a470595dc13841bb..80787669856ffc46af28207d2cec787e5ed78d5c 100644 --- a/substrate/primitives/inherents/src/lib.rs +++ b/substrate/primitives/inherents/src/lib.rs @@ -162,9 +162,11 @@ #![cfg_attr(not(feature = "std"), no_std)] #![warn(missing_docs)] +extern crate alloc; + use codec::{Decode, Encode}; -use sp_std::{ +use alloc::{ collections::btree_map::{BTreeMap, Entry, IntoIter}, vec::Vec, }; diff --git a/substrate/primitives/io/Cargo.toml b/substrate/primitives/io/Cargo.toml index d2d56b831532a4fdbf6e3ca70cf52820b2dc42fc..dddea4ffa232541023c91d354aa6fb2013332a98 100644 --- a/substrate/primitives/io/Cargo.toml +++ b/substrate/primitives/io/Cargo.toml @@ -30,7 +30,7 @@ sp-runtime-interface = { path = "../runtime-interface", default-features = false sp-trie = { path = "../trie", default-features = false, optional = true } sp-externalities = { path = "../externalities", default-features = false } sp-tracing = { path = "../tracing", default-features = false } -log = { version = "0.4.17", optional = true } +log = { optional = true, workspace = true, default-features = true } secp256k1 = { version = "0.28.0", features = ["global-context", "recovery"], optional = true } tracing = { version = "0.1.29", default-features = false } tracing-core = { version = "0.1.32", default-features = false } @@ -38,6 +38,9 @@ tracing-core = { version = "0.1.32", default-features = false } # Required for backwards compatibility reason, but only used for verifying when `UseDalekExt` is set. ed25519-dalek = { version = "2.1", default-features = false, optional = true } +[target.'cfg(all(any(target_arch = "riscv32", target_arch = "riscv64"), substrate_runtime))'.dependencies] +polkavm-derive = { workspace = true } + [build-dependencies] rustversion = "1.0.6" @@ -82,7 +85,7 @@ disable_allocator = [] # This gives the caller direct programmatic access to the error message. # # When disabled the error message will only be printed out in the -# logs, with the caller receving a generic "wasm `unreachable` instruction executed" +# logs, with the caller receiving a generic "wasm `unreachable` instruction executed" # error message. # # This has no effect if both `disable_panic_handler` and `disable_oom` diff --git a/substrate/primitives/io/src/global_alloc_riscv.rs b/substrate/primitives/io/src/global_alloc_riscv.rs new file mode 100644 index 0000000000000000000000000000000000000000..8d7c69c20945946a352238dc8a94ecaba2f2a266 --- /dev/null +++ b/substrate/primitives/io/src/global_alloc_riscv.rs @@ -0,0 +1,19 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#[global_allocator] +static ALLOCATOR: polkavm_derive::LeakingAllocator = polkavm_derive::LeakingAllocator; diff --git a/substrate/primitives/io/src/global_alloc_wasm.rs b/substrate/primitives/io/src/global_alloc_wasm.rs new file mode 100644 index 0000000000000000000000000000000000000000..cf19a6e21a2d26f20d7989a9b155709b2afa73ac --- /dev/null +++ b/substrate/primitives/io/src/global_alloc_wasm.rs @@ -0,0 +1,34 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use core::alloc::{GlobalAlloc, Layout}; + +/// Allocator used by Substrate from within the runtime. +struct RuntimeAllocator; + +#[global_allocator] +static ALLOCATOR: RuntimeAllocator = RuntimeAllocator; + +unsafe impl GlobalAlloc for RuntimeAllocator { + unsafe fn alloc(&self, layout: Layout) -> *mut u8 { + crate::allocator::malloc(layout.size() as u32) + } + + unsafe fn dealloc(&self, ptr: *mut u8, _: Layout) { + crate::allocator::free(ptr) + } +} diff --git a/substrate/primitives/io/src/lib.rs b/substrate/primitives/io/src/lib.rs index 6d34199416a36deeb011003989f6e361d535a0e6..ec32b7290330fc7a1fd76dc4d7ce86210bcceba0 100644 --- a/substrate/primitives/io/src/lib.rs +++ b/substrate/primitives/io/src/lib.rs @@ -129,6 +129,16 @@ use sp_externalities::{Externalities, ExternalitiesExt}; pub use sp_externalities::MultiRemovalResults; +#[cfg(all(not(feature = "disable_allocator"), substrate_runtime, target_family = "wasm"))] +mod global_alloc_wasm; + +#[cfg(all( + not(feature = "disable_allocator"), + substrate_runtime, + any(target_arch = "riscv32", target_arch = "riscv64") +))] +mod global_alloc_riscv; + #[cfg(feature = "std")] const LOG_TARGET: &str = "runtime::io"; @@ -1071,7 +1081,7 @@ pub trait Crypto { /// Register a `ecdsa` signature for batch verification. /// /// Batch verification must be enabled by calling [`start_batch_verify`]. - /// If batch verification is not enabled, the signature will be verified immediatley. + /// If batch verification is not enabled, the signature will be verified immediately. /// To get the result of the batch verification, [`finish_batch_verify`] /// needs to be called. /// @@ -1686,9 +1696,9 @@ mod tracing_setup { /// The PassingTracingSubscriber implements `tracing_core::Subscriber` /// and pushes the information across the runtime interface to the host - struct PassingTracingSubsciber; + struct PassingTracingSubscriber; - impl tracing_core::Subscriber for PassingTracingSubsciber { + impl tracing_core::Subscriber for PassingTracingSubscriber { fn enabled(&self, metadata: &Metadata<'_>) -> bool { wasm_tracing::enabled(Crossing(metadata.into())) } @@ -1721,7 +1731,7 @@ mod tracing_setup { /// set the global bridging subscriber once. pub fn init_tracing() { if TRACING_SET.load(Ordering::Relaxed) == false { - set_global_default(Dispatch::new(PassingTracingSubsciber {})) + set_global_default(Dispatch::new(PassingTracingSubscriber {})) .expect("We only ever call this once"); TRACING_SET.store(true, Ordering::Relaxed); } @@ -1737,30 +1747,6 @@ mod tracing_setup { pub use tracing_setup::init_tracing; -/// Allocator used by Substrate from within the runtime. -#[cfg(substrate_runtime)] -struct RuntimeAllocator; - -#[cfg(all(not(feature = "disable_allocator"), substrate_runtime))] -#[global_allocator] -static ALLOCATOR: RuntimeAllocator = RuntimeAllocator; - -#[cfg(substrate_runtime)] -mod allocator_impl { - use super::*; - use core::alloc::{GlobalAlloc, Layout}; - - unsafe impl GlobalAlloc for RuntimeAllocator { - unsafe fn alloc(&self, layout: Layout) -> *mut u8 { - allocator::malloc(layout.size() as u32) - } - - unsafe fn dealloc(&self, ptr: *mut u8, _: Layout) { - allocator::free(ptr) - } - } -} - /// Crashes the execution of the program. /// /// Equivalent to the WASM `unreachable` instruction, RISC-V `unimp` instruction, diff --git a/substrate/primitives/keyring/Cargo.toml b/substrate/primitives/keyring/Cargo.toml index 1c936b6685be86c54a70824ab902f616c0639945..7471e9cf8ffa77d0115192f97f9edcc541640794 100644 --- a/substrate/primitives/keyring/Cargo.toml +++ b/substrate/primitives/keyring/Cargo.toml @@ -17,11 +17,14 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -strum = { version = "0.24.1", features = ["derive"], default-features = false } -sp-core = { path = "../core" } -sp-runtime = { path = "../runtime" } +strum = { version = "0.26.2", features = ["derive"], default-features = false } +sp-core = { path = "../core", default-features = false } +sp-runtime = { path = "../runtime", default-features = false } [features] +default = ["std"] +std = ["sp-core/std", "sp-runtime/std", "strum/std"] + # This feature adds Bandersnatch crypto primitives. # It should not be used in production since the implementation and interface may still # be subject to significant changes. diff --git a/substrate/primitives/keyring/check-features-variants.sh b/substrate/primitives/keyring/check-features-variants.sh new file mode 100755 index 0000000000000000000000000000000000000000..9c28d83589465483a290b6485f9c77fa7dbdb5a8 --- /dev/null +++ b/substrate/primitives/keyring/check-features-variants.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env -S bash -eux + +export RUSTFLAGS="-Cdebug-assertions=y -Dwarnings" +T=wasm32-unknown-unknown + +cargo check --release +cargo check --release --features="bandersnatch-experimental" +cargo check --release --target=$T --no-default-features diff --git a/substrate/primitives/keyring/src/bandersnatch.rs b/substrate/primitives/keyring/src/bandersnatch.rs index eb60f85632725ca9efbac46c63222fc71609d74f..67fc5c47df643ee4b45b8ebbb99089abdb466d96 100644 --- a/substrate/primitives/keyring/src/bandersnatch.rs +++ b/substrate/primitives/keyring/src/bandersnatch.rs @@ -18,14 +18,21 @@ //! A set of well-known keys used for testing. pub use sp_core::bandersnatch; +#[cfg(feature = "std")] +use sp_core::bandersnatch::Signature; use sp_core::{ - bandersnatch::{Pair, Public, Signature}, + bandersnatch::{Pair, Public}, crypto::UncheckedFrom, hex2array, ByteArray, Pair as PairT, }; +extern crate alloc; +use alloc::{fmt, format, str::FromStr, string::String, vec::Vec}; + /// Set of test accounts. -#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, strum::Display, strum::EnumIter)] +#[derive( + Debug, Clone, Copy, PartialEq, Eq, Hash, strum::Display, strum::EnumIter, Ord, PartialOrd, +)] pub enum Keyring { Alice, Bob, @@ -56,6 +63,7 @@ impl Keyring { Public::from(self).to_raw_vec() } + #[cfg(feature = "std")] pub fn sign(self, msg: &[u8]) -> Signature { Pair::from(self).sign(msg) } @@ -102,16 +110,16 @@ impl From for &'static str { #[derive(Debug)] pub struct ParseKeyringError; -impl std::fmt::Display for ParseKeyringError { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { +impl fmt::Display for ParseKeyringError { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(f, "ParseKeyringError") } } -impl std::str::FromStr for Keyring { +impl FromStr for Keyring { type Err = ParseKeyringError; - fn from_str(s: &str) -> Result::Err> { + fn from_str(s: &str) -> Result::Err> { match s { "Alice" => Ok(Keyring::Alice), "Bob" => Ok(Keyring::Bob), diff --git a/substrate/primitives/keyring/src/ed25519.rs b/substrate/primitives/keyring/src/ed25519.rs index ade42b294940213664d0553a4e4ec537ce553f15..98ca368e53caac26ae690b76500475b1749a07b1 100644 --- a/substrate/primitives/keyring/src/ed25519.rs +++ b/substrate/primitives/keyring/src/ed25519.rs @@ -18,14 +18,21 @@ //! Support code for the runtime. A set of test accounts. pub use sp_core::ed25519; +#[cfg(feature = "std")] +use sp_core::ed25519::Signature; use sp_core::{ - ed25519::{Pair, Public, Signature}, + ed25519::{Pair, Public}, hex2array, ByteArray, Pair as PairT, H256, }; use sp_runtime::AccountId32; +extern crate alloc; +use alloc::{format, string::String, vec::Vec}; + /// Set of test accounts. -#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, strum::Display, strum::EnumIter)] +#[derive( + Debug, Clone, Copy, PartialEq, Eq, Hash, strum::Display, strum::EnumIter, Ord, PartialOrd, +)] pub enum Keyring { Alice, Bob, @@ -76,6 +83,7 @@ impl Keyring { self.to_raw_public().into() } + #[cfg(feature = "std")] pub fn sign(self, msg: &[u8]) -> Signature { Pair::from(self).sign(msg) } diff --git a/substrate/primitives/keyring/src/lib.rs b/substrate/primitives/keyring/src/lib.rs index ee7fd56ba11bf5855d8ae648f073ea004bb257aa..f753bf4b0dd684d0aa292eeca1f97ad9f5cafdda 100644 --- a/substrate/primitives/keyring/src/lib.rs +++ b/substrate/primitives/keyring/src/lib.rs @@ -17,6 +17,8 @@ //! Support code for the runtime. A set of test accounts. +#![cfg_attr(not(feature = "std"), no_std)] + /// Test account crypto for sr25519. pub mod sr25519; diff --git a/substrate/primitives/keyring/src/sr25519.rs b/substrate/primitives/keyring/src/sr25519.rs index 1c2a2526efb1eccb16cb0696f89cb3fc7583357b..a3a506152d7d6f0b76b366a930860e39f3f8fae0 100644 --- a/substrate/primitives/keyring/src/sr25519.rs +++ b/substrate/primitives/keyring/src/sr25519.rs @@ -18,15 +18,22 @@ //! Support code for the runtime. A set of test accounts. pub use sp_core::sr25519; +#[cfg(feature = "std")] +use sp_core::sr25519::Signature; use sp_core::{ hex2array, - sr25519::{Pair, Public, Signature}, + sr25519::{Pair, Public}, ByteArray, Pair as PairT, H256, }; use sp_runtime::AccountId32; +extern crate alloc; +use alloc::{fmt, format, str::FromStr, string::String, vec::Vec}; + /// Set of test accounts. -#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, strum::Display, strum::EnumIter)] +#[derive( + Debug, Clone, Copy, PartialEq, Eq, Hash, strum::Display, strum::EnumIter, Ord, PartialOrd, +)] pub enum Keyring { Alice, Bob, @@ -77,6 +84,7 @@ impl Keyring { self.to_raw_public().into() } + #[cfg(feature = "std")] pub fn sign(self, msg: &[u8]) -> Signature { Pair::from(self).sign(msg) } @@ -140,16 +148,16 @@ impl From for sp_runtime::MultiSigner { #[derive(Debug)] pub struct ParseKeyringError; -impl std::fmt::Display for ParseKeyringError { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { +impl fmt::Display for ParseKeyringError { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(f, "ParseKeyringError") } } -impl std::str::FromStr for Keyring { +impl FromStr for Keyring { type Err = ParseKeyringError; - fn from_str(s: &str) -> Result::Err> { + fn from_str(s: &str) -> Result::Err> { match s { "alice" => Ok(Keyring::Alice), "bob" => Ok(Keyring::Bob), diff --git a/substrate/primitives/keystore/Cargo.toml b/substrate/primitives/keystore/Cargo.toml index 139f04beb205f5dd72c1549c680dedfe4685d63e..a34839358e18333154962f71e1957f9884a71a2f 100644 --- a/substrate/primitives/keystore/Cargo.toml +++ b/substrate/primitives/keystore/Cargo.toml @@ -17,8 +17,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } -parking_lot = { version = "0.12.1", default-features = false } -thiserror = "1.0" +parking_lot = { version = "0.12.1", default-features = false, optional = true } sp-core = { path = "../core", default-features = false } sp-externalities = { path = "../externalities", default-features = false } @@ -28,7 +27,7 @@ rand_chacha = "0.2.2" [features] default = ["std"] -std = ["codec/std", "sp-core/std", "sp-externalities/std"] +std = ["codec/std", "dep:parking_lot", "sp-core/std", "sp-externalities/std"] # This feature adds BLS crypto primitives. # It should not be used in production since the implementation and interface may still diff --git a/substrate/primitives/keystore/src/lib.rs b/substrate/primitives/keystore/src/lib.rs index 07c4e2d5fd1dc4b8cc903d34154dbc51a050426c..64f0e3ea49e8bd3a7e682ad024cd7c28fbcd3abd 100644 --- a/substrate/primitives/keystore/src/lib.rs +++ b/substrate/primitives/keystore/src/lib.rs @@ -17,6 +17,10 @@ //! Keystore traits +#![cfg_attr(not(feature = "std"), no_std)] + +extern crate alloc; + #[cfg(feature = "std")] pub mod testing; @@ -29,25 +33,35 @@ use sp_core::{ ecdsa, ed25519, sr25519, }; -use std::sync::Arc; +use alloc::{string::String, sync::Arc, vec::Vec}; /// Keystore error -#[derive(Debug, thiserror::Error)] +#[derive(Debug)] pub enum Error { /// Public key type is not supported - #[error("Key not supported: {0:?}")] KeyNotSupported(KeyTypeId), /// Validation error - #[error("Validation error: {0}")] ValidationError(String), /// Keystore unavailable - #[error("Keystore unavailable")] Unavailable, /// Programming errors - #[error("An unknown keystore error occurred: {0}")] Other(String), } +impl core::fmt::Display for Error { + fn fmt(&self, fmt: &mut core::fmt::Formatter) -> core::fmt::Result { + match self { + Error::KeyNotSupported(key_type) => write!(fmt, "Key not supported: {key_type:?}"), + Error::ValidationError(error) => write!(fmt, "Validation error: {error}"), + Error::Unavailable => fmt.write_str("Keystore unavailable"), + Error::Other(error) => write!(fmt, "An unknown keystore error occurred: {error}"), + } + } +} + +#[cfg(feature = "std")] +impl std::error::Error for Error {} + /// Something that generates, stores and provides access to secret keys. pub trait Keystore: Send + Sync { /// Returns all the sr25519 public keys for the given key type. @@ -355,6 +369,24 @@ pub trait Keystore: Send + Sync { msg: &[u8], ) -> Result, Error>; + /// Hashes the `message` using keccak256 and then signs it using ECDSA + /// algorithm. It does not affect the behavior of BLS12-377 component. It generates + /// BLS12-377 Signature according to IETF standard. + /// + /// Receives [`KeyTypeId`] and a [`ecdsa_bls377::Public`] key to be able to map + /// them to a private key that exists in the keystore. + /// + /// Returns an [`ecdsa_bls377::Signature`] or `None` in case the given `key_type` + /// and `public` combination doesn't exist in the keystore. + /// An `Err` will be returned if generating the signature itself failed. + #[cfg(feature = "bls-experimental")] + fn ecdsa_bls377_sign_with_keccak256( + &self, + key_type: KeyTypeId, + public: &ecdsa_bls377::Public, + msg: &[u8], + ) -> Result, Error>; + /// Insert a new secret key. fn insert(&self, key_type: KeyTypeId, suri: &str, public: &[u8]) -> Result<(), ()>; @@ -661,6 +693,16 @@ impl Keystore for Arc { (**self).ecdsa_bls377_sign(key_type, public, msg) } + #[cfg(feature = "bls-experimental")] + fn ecdsa_bls377_sign_with_keccak256( + &self, + key_type: KeyTypeId, + public: &ecdsa_bls377::Public, + msg: &[u8], + ) -> Result, Error> { + (**self).ecdsa_bls377_sign_with_keccak256(key_type, public, msg) + } + fn insert(&self, key_type: KeyTypeId, suri: &str, public: &[u8]) -> Result<(), ()> { (**self).insert(key_type, suri, public) } diff --git a/substrate/primitives/keystore/src/testing.rs b/substrate/primitives/keystore/src/testing.rs index 2879c458b4f68c40338b544532bdf80b9bf1d32f..d8610ecfa5b60d8891b6690e00ce6efb55342983 100644 --- a/substrate/primitives/keystore/src/testing.rs +++ b/substrate/primitives/keystore/src/testing.rs @@ -22,7 +22,7 @@ use crate::{Error, Keystore, KeystorePtr}; #[cfg(feature = "bandersnatch-experimental")] use sp_core::bandersnatch; #[cfg(feature = "bls-experimental")] -use sp_core::{bls377, bls381, ecdsa_bls377}; +use sp_core::{bls377, bls381, ecdsa_bls377, KeccakHasher}; use sp_core::{ crypto::{ByteArray, KeyTypeId, Pair, VrfSecret}, ecdsa, ed25519, sr25519, @@ -346,6 +346,19 @@ impl Keystore for MemoryKeystore { self.sign::(key_type, public, msg) } + #[cfg(feature = "bls-experimental")] + fn ecdsa_bls377_sign_with_keccak256( + &self, + key_type: KeyTypeId, + public: &ecdsa_bls377::Public, + msg: &[u8], + ) -> Result, Error> { + let sig = self + .pair::(key_type, public) + .map(|pair| pair.sign_with_hasher::(msg)); + Ok(sig) + } + fn insert(&self, key_type: KeyTypeId, suri: &str, public: &[u8]) -> Result<(), ()> { self.keys .write() @@ -493,6 +506,38 @@ mod tests { assert!(res.is_some()); } + #[test] + #[cfg(feature = "bls-experimental")] + fn ecdsa_bls377_sign_with_keccak_works() { + use sp_core::testing::ECDSA_BLS377; + + let store = MemoryKeystore::new(); + + let suri = "//Alice"; + let pair = ecdsa_bls377::Pair::from_string(suri, None).unwrap(); + + let msg = b"this should be a normal unhashed message not "; + + // insert key, sign again + store.insert(ECDSA_BLS377, suri, pair.public().as_ref()).unwrap(); + + let res = store + .ecdsa_bls377_sign_with_keccak256(ECDSA_BLS377, &pair.public(), &msg[..]) + .unwrap(); + + assert!(res.is_some()); + + // does not verify with default out-of-the-box verification + assert!(!ecdsa_bls377::Pair::verify(&res.unwrap(), &msg[..], &pair.public())); + + // should verify using keccak256 as hasher + assert!(ecdsa_bls377::Pair::verify_with_hasher::( + &res.unwrap(), + msg, + &pair.public() + )); + } + #[test] #[cfg(feature = "bandersnatch-experimental")] fn bandersnatch_vrf_sign() { diff --git a/substrate/primitives/maybe-compressed-blob/Cargo.toml b/substrate/primitives/maybe-compressed-blob/Cargo.toml index 84a5592dcaf2702497cecf6e26d9878cf62a9c6b..178c915ce837efeccad42e52e1cb57bf30d5ff72 100644 --- a/substrate/primitives/maybe-compressed-blob/Cargo.toml +++ b/substrate/primitives/maybe-compressed-blob/Cargo.toml @@ -6,7 +6,7 @@ edition.workspace = true license = "Apache-2.0" homepage = "https://substrate.io" repository.workspace = true -description = "Handling of blobs, usually Wasm code, which may be compresed" +description = "Handling of blobs, usually Wasm code, which may be compressed" documentation = "https://docs.rs/sp-maybe-compressed-blob" readme = "README.md" @@ -14,5 +14,5 @@ readme = "README.md" workspace = true [dependencies] -thiserror = "1.0" +thiserror = { workspace = true } zstd = { version = "0.12.4", default-features = false } diff --git a/substrate/primitives/merkle-mountain-range/Cargo.toml b/substrate/primitives/merkle-mountain-range/Cargo.toml index 59b48b1b83937389550b626d6d6f9cdbecfa76cc..891f893a0c96e5d10cdb953190a1830b31ef56e4 100644 --- a/substrate/primitives/merkle-mountain-range/Cargo.toml +++ b/substrate/primitives/merkle-mountain-range/Cargo.toml @@ -16,16 +16,15 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -log = { version = "0.4.17", default-features = false } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +log = { workspace = true } mmr-lib = { package = "ckb-merkle-mountain-range", version = "0.5.2", default-features = false } -serde = { version = "1.0.195", features = ["alloc", "derive"], default-features = false, optional = true } +serde = { features = ["alloc", "derive"], optional = true, workspace = true } sp-api = { path = "../api", default-features = false } sp-core = { path = "../core", default-features = false } sp-debug-derive = { path = "../debug-derive", default-features = false } sp-runtime = { path = "../runtime", default-features = false } -sp-std = { path = "../std", default-features = false } -thiserror = "1.0" +thiserror = { optional = true, workspace = true } [dev-dependencies] array-bytes = "6.1" @@ -34,6 +33,7 @@ array-bytes = "6.1" default = ["std"] std = [ "codec/std", + "dep:thiserror", "log/std", "mmr-lib/std", "scale-info/std", @@ -42,7 +42,6 @@ std = [ "sp-core/std", "sp-debug-derive/std", "sp-runtime/std", - "sp-std/std", ] # Serde support without relying on std features. diff --git a/substrate/primitives/merkle-mountain-range/src/lib.rs b/substrate/primitives/merkle-mountain-range/src/lib.rs index 6c0e75005ead8609a597735ef3ed19a85076dc89..c76d66bb08ea700bd6bcc1272d56310bda51881f 100644 --- a/substrate/primitives/merkle-mountain-range/src/lib.rs +++ b/substrate/primitives/merkle-mountain-range/src/lib.rs @@ -20,14 +20,16 @@ #![cfg_attr(not(feature = "std"), no_std)] #![warn(missing_docs)] +extern crate alloc; + pub use mmr_lib; +#[cfg(not(feature = "std"))] +use alloc::vec::Vec; +use core::fmt; use scale_info::TypeInfo; use sp_debug_derive::RuntimeDebug; use sp_runtime::traits; -use sp_std::fmt; -#[cfg(not(feature = "std"))] -use sp_std::prelude::Vec; pub mod utils; @@ -248,10 +250,10 @@ impl DataOrHash { pub struct Compact { /// Internal tuple representation. pub tuple: T, - _hash: sp_std::marker::PhantomData, + _hash: core::marker::PhantomData, } -impl sp_std::ops::Deref for Compact { +impl core::ops::Deref for Compact { type Target = T; fn deref(&self) -> &Self::Target { diff --git a/substrate/primitives/merkle-mountain-range/src/utils.rs b/substrate/primitives/merkle-mountain-range/src/utils.rs index b9171c96a6201eb99a63355841245a2a7853513b..72674e24a272849fcabf16f243764dbb2858c0fa 100644 --- a/substrate/primitives/merkle-mountain-range/src/utils.rs +++ b/substrate/primitives/merkle-mountain-range/src/utils.rs @@ -20,9 +20,9 @@ use codec::Encode; use mmr_lib::helper; -use sp_runtime::traits::{CheckedAdd, CheckedSub, Header, One}; #[cfg(not(feature = "std"))] -use sp_std::prelude::Vec; +use alloc::vec::Vec; +use sp_runtime::traits::{CheckedAdd, CheckedSub, Header, One}; use crate::{Error, LeafIndex, NodeIndex}; @@ -131,7 +131,7 @@ impl NodesUtils { /// Used for nodes added by now finalized blocks. /// Never read keys using `node_canon_offchain_key` unless you sure that /// there's no `node_offchain_key` key in the storage. - pub fn node_canon_offchain_key(prefix: &[u8], pos: NodeIndex) -> sp_std::prelude::Vec { + pub fn node_canon_offchain_key(prefix: &[u8], pos: NodeIndex) -> alloc::vec::Vec { (prefix, pos).encode() } } diff --git a/substrate/primitives/metadata-ir/Cargo.toml b/substrate/primitives/metadata-ir/Cargo.toml index e4203d0e378efb557ace209761e012bc571400fa..ca8408d0ad97c0c5b880b8b60b59d693e7652b2f 100644 --- a/substrate/primitives/metadata-ir/Cargo.toml +++ b/substrate/primitives/metadata-ir/Cargo.toml @@ -18,9 +18,8 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false } frame-metadata = { version = "16.0.0", default-features = false, features = ["current"] } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -sp-std = { path = "../std", default-features = false } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } [features] default = ["std"] -std = ["codec/std", "frame-metadata/std", "scale-info/std", "sp-std/std"] +std = ["codec/std", "frame-metadata/std", "scale-info/std"] diff --git a/substrate/primitives/metadata-ir/src/lib.rs b/substrate/primitives/metadata-ir/src/lib.rs index edfa58f8618942e34b6937733cbd2a5f5c4dffbb..18b20f2ccaac31a92175a420d0f569ef7dd1677b 100644 --- a/substrate/primitives/metadata-ir/src/lib.rs +++ b/substrate/primitives/metadata-ir/src/lib.rs @@ -20,6 +20,8 @@ #![cfg_attr(not(feature = "std"), no_std)] #![warn(missing_docs)] +extern crate alloc; + // Re-export. #[doc(hidden)] pub use frame_metadata; @@ -52,8 +54,8 @@ pub fn into_version(metadata: MetadataIR, version: u32) -> Option sp_std::vec::Vec { - sp_std::vec![V14, V15] +pub fn supported_versions() -> alloc::vec::Vec { + alloc::vec![V14, V15] } /// Transform the IR to the latest stable metadata version. diff --git a/substrate/primitives/metadata-ir/src/types.rs b/substrate/primitives/metadata-ir/src/types.rs index b107d20a8e2bfbf55d0d558bb60346cb7a52dd70..b05f26ff55d4e408e1d8459ba5539f44423b2c18 100644 --- a/substrate/primitives/metadata-ir/src/types.rs +++ b/substrate/primitives/metadata-ir/src/types.rs @@ -160,7 +160,7 @@ pub struct ExtrinsicMetadataIR { pub ty: T::Type, /// Extrinsic version. pub version: u8, - /// The type of the address that signes the extrinsic + /// The type of the address that signs the extrinsic pub address_ty: T::Type, /// The type of the outermost Call enum. pub call_ty: T::Type, diff --git a/substrate/primitives/mixnet/Cargo.toml b/substrate/primitives/mixnet/Cargo.toml index 39cf684b9772a60f0b8b0932470ccdaf3e4d89ac..07840ca63cb2b8eeaa1773146cf34a74d889b4c8 100644 --- a/substrate/primitives/mixnet/Cargo.toml +++ b/substrate/primitives/mixnet/Cargo.toml @@ -17,10 +17,9 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } sp-api = { default-features = false, path = "../api" } sp-application-crypto = { default-features = false, path = "../application-crypto" } -sp-std = { default-features = false, path = "../std" } [features] default = ["std"] @@ -29,5 +28,4 @@ std = [ "scale-info/std", "sp-api/std", "sp-application-crypto/std", - "sp-std/std", ] diff --git a/substrate/primitives/mixnet/src/lib.rs b/substrate/primitives/mixnet/src/lib.rs index 58b8a10f0cd8d5d4198e6fcf7b75e09d4f639827..462d7fc61f217e7496f76b7113b3a62345a6288b 100644 --- a/substrate/primitives/mixnet/src/lib.rs +++ b/substrate/primitives/mixnet/src/lib.rs @@ -20,5 +20,7 @@ #![warn(missing_docs)] #![cfg_attr(not(feature = "std"), no_std)] +extern crate alloc; + pub mod runtime_api; pub mod types; diff --git a/substrate/primitives/mixnet/src/runtime_api.rs b/substrate/primitives/mixnet/src/runtime_api.rs index 28ab40e633787545c4710043d746a9de3295d232..f3260782b0b9a42b15d2b68d705802186fc50cc5 100644 --- a/substrate/primitives/mixnet/src/runtime_api.rs +++ b/substrate/primitives/mixnet/src/runtime_api.rs @@ -18,7 +18,7 @@ //! Runtime API for querying mixnet configuration and registering mixnodes. use super::types::{Mixnode, MixnodesErr, SessionIndex, SessionStatus}; -use sp_std::vec::Vec; +use alloc::vec::Vec; sp_api::decl_runtime_apis! { /// API to query the mixnet session status and mixnode sets, and to register mixnodes. diff --git a/substrate/primitives/mixnet/src/types.rs b/substrate/primitives/mixnet/src/types.rs index fc214f94d1cbf2e4063efdf09dcdbc1e0aceb258..3b069e1fb3ad7f92dcd32867d2ffe51890579cf6 100644 --- a/substrate/primitives/mixnet/src/types.rs +++ b/substrate/primitives/mixnet/src/types.rs @@ -17,9 +17,9 @@ //! Mixnet types used by both host and runtime. +use alloc::vec::Vec; use codec::{Decode, Encode}; use scale_info::TypeInfo; -use sp_std::vec::Vec; mod app { use sp_application_crypto::{app_crypto, key_types::MIXNET, sr25519}; @@ -90,8 +90,8 @@ pub enum MixnodesErr { }, } -impl sp_std::fmt::Display for MixnodesErr { - fn fmt(&self, fmt: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result { +impl core::fmt::Display for MixnodesErr { + fn fmt(&self, fmt: &mut core::fmt::Formatter) -> core::fmt::Result { match self { MixnodesErr::InsufficientRegistrations { num, min } => write!(fmt, "{num} mixnode(s) registered; {min} is the minimum"), diff --git a/substrate/primitives/npos-elections/Cargo.toml b/substrate/primitives/npos-elections/Cargo.toml index 74423ea556c2c841c2415dd7af8776fac5e6891b..afa59af64d6d8599a9835f448f9a2031831dc694 100644 --- a/substrate/primitives/npos-elections/Cargo.toml +++ b/substrate/primitives/npos-elections/Cargo.toml @@ -17,12 +17,11 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.195", default-features = false, features = ["alloc", "derive"], optional = true } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +serde = { features = ["alloc", "derive"], optional = true, workspace = true } sp-arithmetic = { path = "../arithmetic", default-features = false } sp-core = { path = "../core", default-features = false } sp-runtime = { path = "../runtime", default-features = false } -sp-std = { path = "../std", default-features = false } [dev-dependencies] rand = "0.8.5" @@ -38,7 +37,6 @@ std = [ "sp-arithmetic/std", "sp-core/std", "sp-runtime/std", - "sp-std/std", ] # Serde support without relying on std features. diff --git a/substrate/primitives/npos-elections/fuzzer/Cargo.toml b/substrate/primitives/npos-elections/fuzzer/Cargo.toml index 931773254365f82566b37c766046fcb2aacca653..8e1dbaf2377e7583fb9d37f1d43170fe6ca9edca 100644 --- a/substrate/primitives/npos-elections/fuzzer/Cargo.toml +++ b/substrate/primitives/npos-elections/fuzzer/Cargo.toml @@ -17,7 +17,7 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -clap = { version = "4.4.18", features = ["derive"] } +clap = { version = "4.5.3", features = ["derive"] } honggfuzz = "0.5" rand = { version = "0.8", features = ["small_rng", "std"] } sp-npos-elections = { path = ".." } diff --git a/substrate/primitives/npos-elections/src/assignments.rs b/substrate/primitives/npos-elections/src/assignments.rs index 2ac2b9bebd771cf480a36e128133387026681f7e..0686fdda643bd471b3cc2e23c5d6aa6b0222ca5e 100644 --- a/substrate/primitives/npos-elections/src/assignments.rs +++ b/substrate/primitives/npos-elections/src/assignments.rs @@ -18,6 +18,7 @@ //! Structs and helpers for distributing a voter's stake among various winners. use crate::{ExtendedBalance, IdentifierT, PerThing128}; +use alloc::vec::Vec; #[cfg(feature = "serde")] use codec::{Decode, Encode}; use sp_arithmetic::{ @@ -25,7 +26,6 @@ use sp_arithmetic::{ Normalizable, PerThing, }; use sp_core::RuntimeDebug; -use sp_std::vec::Vec; /// A voter's stake assignment among a set of targets, represented as ratios. #[derive(RuntimeDebug, Clone, Default)] diff --git a/substrate/primitives/npos-elections/src/balancing.rs b/substrate/primitives/npos-elections/src/balancing.rs index 90dbe7eb7147817882eb85f9ba321619ac74150e..fb14c8686581977974145b4b082c2dc6d401182e 100644 --- a/substrate/primitives/npos-elections/src/balancing.rs +++ b/substrate/primitives/npos-elections/src/balancing.rs @@ -27,8 +27,8 @@ //! See [`balance`] for more information. use crate::{BalancingConfig, Edge, ExtendedBalance, IdentifierT, Voter}; +use alloc::vec::Vec; use sp_arithmetic::traits::Zero; -use sp_std::prelude::*; /// Balance the weight distribution of a given `voters` at most `iterations` times, or up until the /// point where the biggest difference created per iteration of all stakes is `tolerance`. If this diff --git a/substrate/primitives/npos-elections/src/helpers.rs b/substrate/primitives/npos-elections/src/helpers.rs index 082491ea04281b5ebb73c33e7cb970ebc4c18071..7df6ec9d9dbaaffcf6e3966a7adf87cb521982b8 100644 --- a/substrate/primitives/npos-elections/src/helpers.rs +++ b/substrate/primitives/npos-elections/src/helpers.rs @@ -18,8 +18,8 @@ //! Helper methods for npos-elections. use crate::{Assignment, Error, IdentifierT, PerThing128, StakedAssignment, VoteWeight}; +use alloc::vec::Vec; use sp_arithmetic::PerThing; -use sp_std::prelude::*; /// Converts a vector of ratio assignments into ones with absolute budget value. /// diff --git a/substrate/primitives/npos-elections/src/lib.rs b/substrate/primitives/npos-elections/src/lib.rs index 8d741f4130d9ca724dc6a7566edf8ed6a483e7fa..82ac40fe273780ab33b84f752cea8a876f61b6a6 100644 --- a/substrate/primitives/npos-elections/src/lib.rs +++ b/substrate/primitives/npos-elections/src/lib.rs @@ -74,15 +74,16 @@ #![cfg_attr(not(feature = "std"), no_std)] +extern crate alloc; + +use alloc::{collections::btree_map::BTreeMap, rc::Rc, vec, vec::Vec}; use codec::{Decode, Encode, MaxEncodedLen}; +use core::{cell::RefCell, cmp::Ordering}; use scale_info::TypeInfo; #[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; use sp_arithmetic::{traits::Zero, Normalizable, PerThing, Rational128, ThresholdOrd}; use sp_core::{bounded::BoundedVec, RuntimeDebug}; -use sp_std::{ - cell::RefCell, cmp::Ordering, collections::btree_map::BTreeMap, prelude::*, rc::Rc, vec, -}; #[cfg(test)] mod mock; @@ -198,7 +199,7 @@ impl ElectionScore { } } -impl sp_std::cmp::Ord for ElectionScore { +impl core::cmp::Ord for ElectionScore { fn cmp(&self, other: &Self) -> Ordering { // we delegate this to the lexicographic cmp of slices`, and to incorporate that we want the // third element to be minimized, we swap them. @@ -210,7 +211,7 @@ impl sp_std::cmp::Ord for ElectionScore { } } -impl sp_std::cmp::PartialOrd for ElectionScore { +impl core::cmp::PartialOrd for ElectionScore { fn partial_cmp(&self, other: &Self) -> Option { Some(self.cmp(other)) } @@ -278,8 +279,8 @@ impl Edge { } #[cfg(feature = "std")] -impl sp_std::fmt::Debug for Edge { - fn fmt(&self, f: &mut sp_std::fmt::Formatter<'_>) -> sp_std::fmt::Result { +impl core::fmt::Debug for Edge { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { write!(f, "Edge({:?}, weight = {:?})", self.who, self.weight) } } @@ -299,7 +300,7 @@ pub struct Voter { #[cfg(feature = "std")] impl std::fmt::Debug for Voter { - fn fmt(&self, f: &mut sp_std::fmt::Formatter<'_>) -> sp_std::fmt::Result { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!(f, "Voter({:?}, budget = {}, edges = {:?})", self.who, self.budget, self.edges) } } diff --git a/substrate/primitives/npos-elections/src/mock.rs b/substrate/primitives/npos-elections/src/mock.rs index 2fc49fd72cd03874c33ddfab637eb1870a3d52dc..91757404145f3e86e2dbe414441b567edea63638 100644 --- a/substrate/primitives/npos-elections/src/mock.rs +++ b/substrate/primitives/npos-elections/src/mock.rs @@ -19,12 +19,12 @@ #![cfg(test)] +use alloc::collections::btree_map::BTreeMap; use sp_arithmetic::{ traits::{One, SaturatedConversion, Zero}, PerThing, }; use sp_runtime::assert_eq_error_rate; -use sp_std::collections::btree_map::BTreeMap; use crate::{seq_phragmen, Assignment, ElectionResult, ExtendedBalance, PerThing128, VoteWeight}; @@ -131,7 +131,7 @@ where if let Some(winner) = candidates .iter_mut() .filter(|c| !c.elected) - .min_by(|x, y| x.score.partial_cmp(&y.score).unwrap_or(sp_std::cmp::Ordering::Equal)) + .min_by(|x, y| x.score.partial_cmp(&y.score).unwrap_or(core::cmp::Ordering::Equal)) { winner.elected = true; for n in &mut voters { @@ -226,10 +226,10 @@ where if backing_backed_stake.len() > 0 { let max_stake = backing_backed_stake .iter() - .max_by(|x, y| x.partial_cmp(&y).unwrap_or(sp_std::cmp::Ordering::Equal)) + .max_by(|x, y| x.partial_cmp(&y).unwrap_or(core::cmp::Ordering::Equal)) .expect("vector with positive length will have a max; qed"); let min_stake = backed_stakes_iter - .min_by(|x, y| x.partial_cmp(&y).unwrap_or(sp_std::cmp::Ordering::Equal)) + .min_by(|x, y| x.partial_cmp(&y).unwrap_or(core::cmp::Ordering::Equal)) .expect("iterator with positive length will have a min; qed"); difference = max_stake - min_stake; @@ -254,7 +254,7 @@ where support_map .get(&x.0) .and_then(|x| support_map.get(&y.0).and_then(|y| x.total.partial_cmp(&y.total))) - .unwrap_or(sp_std::cmp::Ordering::Equal) + .unwrap_or(core::cmp::Ordering::Equal) }); let mut cumulative_stake = 0.0; diff --git a/substrate/primitives/npos-elections/src/node.rs b/substrate/primitives/npos-elections/src/node.rs index caca9561d83970ec935ce8dc86d4415280dedfea..6fe50ad1d0acf124d2a91e86c666fe31046d442c 100644 --- a/substrate/primitives/npos-elections/src/node.rs +++ b/substrate/primitives/npos-elections/src/node.rs @@ -17,7 +17,8 @@ //! (very) Basic implementation of a graph node used in the reduce algorithm. -use sp_std::{cell::RefCell, fmt, prelude::*, rc::Rc}; +use alloc::{rc::Rc, vec::Vec}; +use core::{cell::RefCell, fmt}; /// The role that a node can accept. #[derive(PartialEq, Eq, Ord, PartialOrd, Clone, Debug)] @@ -49,8 +50,8 @@ impl NodeId { } #[cfg(feature = "std")] -impl sp_std::fmt::Debug for NodeId { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> sp_std::fmt::Result { +impl fmt::Debug for NodeId { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!( f, "Node({:?}, {:?})", diff --git a/substrate/primitives/npos-elections/src/phragmen.rs b/substrate/primitives/npos-elections/src/phragmen.rs index c3578065f364cd9eac0a82bc7c6bbf5daef3b632..f331152e722a2205064e7ab291b445897758034c 100644 --- a/substrate/primitives/npos-elections/src/phragmen.rs +++ b/substrate/primitives/npos-elections/src/phragmen.rs @@ -24,12 +24,12 @@ use crate::{ balancing, setup_inputs, BalancingConfig, CandidatePtr, ElectionResult, ExtendedBalance, IdentifierT, PerThing128, VoteWeight, Voter, }; +use alloc::vec::Vec; use sp_arithmetic::{ helpers_128bit::multiply_by_rational_with_rounding, traits::{Bounded, Zero}, Rational128, Rounding, }; -use sp_std::prelude::*; /// The denominator used for loads. Since votes are collected as u64, the smallest ratio that we /// might collect is `1/approval_stake` where approval stake is the sum of votes. Hence, some number diff --git a/substrate/primitives/npos-elections/src/phragmms.rs b/substrate/primitives/npos-elections/src/phragmms.rs index df6becf47472f6b6663f217ff6b8a08cd5bf78f9..9a17f0dfa7ce972531640887b2c4bc3e734c6bbe 100644 --- a/substrate/primitives/npos-elections/src/phragmms.rs +++ b/substrate/primitives/npos-elections/src/phragmms.rs @@ -25,8 +25,8 @@ use crate::{ balance, setup_inputs, BalancingConfig, CandidatePtr, ElectionResult, ExtendedBalance, IdentifierT, PerThing128, VoteWeight, Voter, }; +use alloc::{rc::Rc, vec, vec::Vec}; use sp_arithmetic::{traits::Bounded, PerThing, Rational128}; -use sp_std::{prelude::*, rc::Rc}; /// Execute the phragmms method. /// @@ -232,8 +232,8 @@ pub(crate) fn apply_elected( mod tests { use super::*; use crate::{Assignment, ElectionResult}; + use alloc::rc::Rc; use sp_runtime::{Perbill, Percent}; - use sp_std::rc::Rc; #[test] fn basic_election_manual_works() { diff --git a/substrate/primitives/npos-elections/src/pjr.rs b/substrate/primitives/npos-elections/src/pjr.rs index f0e59a25d440b67f65656d7eb04f16743bc1c353..6e3775199a21944a96b908536485009204c14b4d 100644 --- a/substrate/primitives/npos-elections/src/pjr.rs +++ b/substrate/primitives/npos-elections/src/pjr.rs @@ -26,8 +26,8 @@ use crate::{ Candidate, CandidatePtr, Edge, ExtendedBalance, IdentifierT, Support, SupportMap, Supports, VoteWeight, Voter, }; +use alloc::{collections::btree_map::BTreeMap, rc::Rc, vec::Vec}; use sp_arithmetic::{traits::Zero, Perbill}; -use sp_std::{collections::btree_map::BTreeMap, rc::Rc, vec::Vec}; /// The type used as the threshold. /// /// Just some reading sugar; Must always be same as [`ExtendedBalance`]; @@ -261,7 +261,7 @@ fn prepare_pjr_input( } } - // Convert Suppports into a SupportMap + // Convert Supports into a SupportMap // // As a flat list, we're limited to linear search. That gives the production of `candidates`, // below, a complexity of `O(s*c)`, where `s == supports.len()` and `c == all_candidates.len()`. diff --git a/substrate/primitives/npos-elections/src/reduce.rs b/substrate/primitives/npos-elections/src/reduce.rs index 6a5a0159e4efb9ee6d742d94adc1cc328c24aef1..7e1ff8d978f3b75f2e05ee446f2e0ed45ce6e685 100644 --- a/substrate/primitives/npos-elections/src/reduce.rs +++ b/substrate/primitives/npos-elections/src/reduce.rs @@ -51,11 +51,12 @@ use crate::{ node::{Node, NodeId, NodeRef, NodeRole}, ExtendedBalance, IdentifierT, StakedAssignment, }; -use sp_arithmetic::traits::{Bounded, Zero}; -use sp_std::{ +use alloc::{ collections::btree_map::{BTreeMap, Entry::*}, - prelude::*, + vec, + vec::Vec, }; +use sp_arithmetic::traits::{Bounded, Zero}; /// Map type used for reduce_4. Can be easily swapped with HashMap. type Map = BTreeMap<(A, A), A>; @@ -318,7 +319,7 @@ fn reduce_all(assignments: &mut Vec>) -> u32 let mut tree: BTreeMap, NodeRef> = BTreeMap::new(); // NOTE: This code can heavily use an index cache. Looking up a pair of (voter, target) in the - // assignments happens numerous times and and we can save time. For now it is written as such + // assignments happens numerous times and we can save time. For now it is written as such // because abstracting some of this code into a function/closure is super hard due to borrow // checks (and most likely needs unsafe code at the end). For now I will keep it as it and // refactor later. @@ -392,7 +393,7 @@ fn reduce_all(assignments: &mut Vec>) -> u32 // voter_root_path.last().unwrap()); TODO: @kian // the common path must be non-void.. debug_assert!(common_count > 0); - // and smaller than btoh + // and smaller than both debug_assert!(common_count <= voter_root_path.len()); debug_assert!(common_count <= target_root_path.len()); diff --git a/substrate/primitives/npos-elections/src/traits.rs b/substrate/primitives/npos-elections/src/traits.rs index d49970873b7072c364e1bf26d713a4498a92578b..afa6ac70880a5ac0f32e4c3b00ec8f40beefc52d 100644 --- a/substrate/primitives/npos-elections/src/traits.rs +++ b/substrate/primitives/npos-elections/src/traits.rs @@ -18,8 +18,8 @@ //! Traits for the npos-election operations. use crate::ExtendedBalance; +use core::{fmt::Debug, ops::Mul}; use sp_arithmetic::PerThing; -use sp_std::{fmt::Debug, ops::Mul, prelude::*}; /// an aggregator trait for a generic type of a voter/target identifier. This usually maps to /// substrate's account id. diff --git a/substrate/primitives/rpc/Cargo.toml b/substrate/primitives/rpc/Cargo.toml index 735f8ed32da1ffa77a4a2ba693e1c20209478a76..dce0eeee9f99bd9cd544e584e07cd3c29ca20ae1 100644 --- a/substrate/primitives/rpc/Cargo.toml +++ b/substrate/primitives/rpc/Cargo.toml @@ -17,8 +17,8 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] rustc-hash = "1.1.0" -serde = { version = "1.0.195", features = ["derive"] } +serde = { features = ["derive"], workspace = true, default-features = true } sp-core = { path = "../core" } [dev-dependencies] -serde_json = "1.0.111" +serde_json = { workspace = true, default-features = true } diff --git a/substrate/primitives/runtime-interface/proc-macro/Cargo.toml b/substrate/primitives/runtime-interface/proc-macro/Cargo.toml index c453f9079bbde85176463d130bbed9e22ce736dd..7dbd810fea932fd4bf284f80c1de976be7009b6d 100644 --- a/substrate/primitives/runtime-interface/proc-macro/Cargo.toml +++ b/substrate/primitives/runtime-interface/proc-macro/Cargo.toml @@ -22,6 +22,6 @@ proc-macro = true Inflector = "0.11.4" proc-macro-crate = "3.0.0" proc-macro2 = "1.0.56" -quote = "1.0.28" +quote = { workspace = true } expander = "2.0.0" -syn = { version = "2.0.48", features = ["extra-traits", "fold", "full", "visit"] } +syn = { features = ["extra-traits", "fold", "full", "visit"], workspace = true } diff --git a/substrate/primitives/runtime-interface/src/lib.rs b/substrate/primitives/runtime-interface/src/lib.rs index 8b0edf1ec818e57237e6170c8d27f2d1f492cc46..f6ef27789b36f08a6a5e7a58035304cab345737e 100644 --- a/substrate/primitives/runtime-interface/src/lib.rs +++ b/substrate/primitives/runtime-interface/src/lib.rs @@ -283,7 +283,7 @@ pub use sp_std; /// /// `key` holds the pointer and the length to the `data` slice. /// pub fn call(data: &[u8]) -> Vec { /// extern "C" { pub fn ext_call_version_2(key: u64); } -/// // Should call into extenal `ext_call_version_2(<[u8] as IntoFFIValue>::into_ffi_value(key))` +/// // Should call into external `ext_call_version_2(<[u8] as IntoFFIValue>::into_ffi_value(key))` /// // But this is too much to replicate in a doc test so here we just return a dummy vector. /// // Note that we jump into the latest version not marked as `register_only` (i.e. version 2). /// Vec::new() diff --git a/substrate/primitives/runtime-interface/src/util.rs b/substrate/primitives/runtime-interface/src/util.rs index 8db32271a0e7e7b682fb4b7012ea897ca8d02640..86c8e4b50e29310358dd90dca772a9714d986a38 100644 --- a/substrate/primitives/runtime-interface/src/util.rs +++ b/substrate/primitives/runtime-interface/src/util.rs @@ -21,7 +21,7 @@ pub fn pack_ptr_and_len(ptr: u32, len: u32) -> u64 { // The static assertions from above are changed into a runtime check. #[cfg(all(not(feature = "std"), feature = "disable_target_static_assertions"))] - assert_eq!(4, sp_std::mem::size_of::()); + assert_eq!(4, core::mem::size_of::()); (u64::from(len) << 32) | u64::from(ptr) } @@ -34,7 +34,7 @@ pub fn pack_ptr_and_len(ptr: u32, len: u32) -> u64 { pub fn unpack_ptr_and_len(val: u64) -> (u32, u32) { // The static assertions from above are changed into a runtime check. #[cfg(all(not(feature = "std"), feature = "disable_target_static_assertions"))] - assert_eq!(4, sp_std::mem::size_of::()); + assert_eq!(4, core::mem::size_of::()); let ptr = (val & (!0u32 as u64)) as u32; let len = (val >> 32) as u32; diff --git a/substrate/primitives/runtime-interface/src/wasm.rs b/substrate/primitives/runtime-interface/src/wasm.rs index 91205addf21a0fead6c36391c24ff77ee97c951e..10bb50c64039895dd4e5fc6f738f0d249652bbe9 100644 --- a/substrate/primitives/runtime-interface/src/wasm.rs +++ b/substrate/primitives/runtime-interface/src/wasm.rs @@ -19,7 +19,7 @@ use crate::RIType; -use sp_std::cell::Cell; +use core::cell::Cell; /// Something that can be created from a ffi value. /// diff --git a/substrate/primitives/runtime-interface/test-wasm-deprecated/src/lib.rs b/substrate/primitives/runtime-interface/test-wasm-deprecated/src/lib.rs index 2f42e60504eb77af41c9107f9a5bb1178ffaf0ea..871a4922ce3ab13e147f1b4f5039021e309b1132 100644 --- a/substrate/primitives/runtime-interface/test-wasm-deprecated/src/lib.rs +++ b/substrate/primitives/runtime-interface/test-wasm-deprecated/src/lib.rs @@ -45,19 +45,19 @@ pub fn import_sp_io() { #[runtime_interface] pub trait TestApi { - fn test_versionning(&self, _data: u32) -> bool { + fn test_versioning(&self, _data: u32) -> bool { // should not be called unimplemented!() } } wasm_export_functions! { - fn test_versionning_works() { + fn test_versioning_works() { // old api allows only 42 and 50 - assert!(test_api::test_versionning(42)); - assert!(test_api::test_versionning(50)); + assert!(test_api::test_versioning(42)); + assert!(test_api::test_versioning(50)); - assert!(!test_api::test_versionning(142)); - assert!(!test_api::test_versionning(0)); + assert!(!test_api::test_versioning(142)); + assert!(!test_api::test_versioning(0)); } } diff --git a/substrate/primitives/runtime-interface/test-wasm/src/lib.rs b/substrate/primitives/runtime-interface/test-wasm/src/lib.rs index cf1ff3bca088fa7ba25047f48a452d775679c0fc..2b3fc728f6ff46cc1332e413d8dee965f6ec7e3d 100644 --- a/substrate/primitives/runtime-interface/test-wasm/src/lib.rs +++ b/substrate/primitives/runtime-interface/test-wasm/src/lib.rs @@ -126,21 +126,21 @@ pub trait TestApi { val } - fn test_versionning(&self, data: u32) -> bool { + fn test_versioning(&self, data: u32) -> bool { data == 42 || data == 50 } #[version(2)] - fn test_versionning(&self, data: u32) -> bool { + fn test_versioning(&self, data: u32) -> bool { data == 42 } - fn test_versionning_register_only(&self, data: u32) -> bool { + fn test_versioning_register_only(&self, data: u32) -> bool { data == 80 } #[version(2, register_only)] - fn test_versionning_register_only(&self, data: u32) -> bool { + fn test_versioning_register_only(&self, data: u32) -> bool { data == 42 } @@ -282,21 +282,21 @@ wasm_export_functions! { assert_eq!(0, len); } - fn test_versionning_works() { + fn test_versioning_works() { // we fix new api to accept only 42 as a proper input // as opposed to sp-runtime-interface-test-wasm-deprecated::test_api::verify_input // which accepted 42 and 50. - assert!(test_api::test_versionning(42)); + assert!(test_api::test_versioning(42)); - assert!(!test_api::test_versionning(50)); - assert!(!test_api::test_versionning(102)); + assert!(!test_api::test_versioning(50)); + assert!(!test_api::test_versioning(102)); } - fn test_versionning_register_only_works() { + fn test_versioning_register_only_works() { // Ensure that we will import the version of the runtime interface function that // isn't tagged with `register_only`. - assert!(!test_api::test_versionning_register_only(42)); - assert!(test_api::test_versionning_register_only(80)); + assert!(!test_api::test_versioning_register_only(42)); + assert!(test_api::test_versioning_register_only(80)); } fn test_return_input_as_tuple() { diff --git a/substrate/primitives/runtime-interface/test/src/lib.rs b/substrate/primitives/runtime-interface/test/src/lib.rs index 215704a1121543f8290623273a1ad6be8295389d..05a955fbe3f86106ab1e95a67e6c7c0074770ac4 100644 --- a/substrate/primitives/runtime-interface/test/src/lib.rs +++ b/substrate/primitives/runtime-interface/test/src/lib.rs @@ -163,18 +163,18 @@ fn test_array_return_value_memory_is_freed() { } #[test] -fn test_versionining_with_new_host_works() { +fn test_versioning_with_new_host_works() { // We call to the new wasm binary with new host function. - call_wasm_method::(wasm_binary_unwrap(), "test_versionning_works"); + call_wasm_method::(wasm_binary_unwrap(), "test_versioning_works"); // we call to the old wasm binary with a new host functions // old versions of host functions should be called and test should be ok! - call_wasm_method::(wasm_binary_deprecated_unwrap(), "test_versionning_works"); + call_wasm_method::(wasm_binary_deprecated_unwrap(), "test_versioning_works"); } #[test] -fn test_versionining_register_only() { - call_wasm_method::(wasm_binary_unwrap(), "test_versionning_register_only_works"); +fn test_versioning_register_only() { + call_wasm_method::(wasm_binary_unwrap(), "test_versioning_register_only_works"); } fn run_test_in_another_process( diff --git a/substrate/primitives/runtime/Cargo.toml b/substrate/primitives/runtime/Cargo.toml index f4b1158242941286e539c9a87bbc16d57ab1b3af..fb5fd60fbbfd90260127fc8ec9d3750badc4b5ba 100644 --- a/substrate/primitives/runtime/Cargo.toml +++ b/substrate/primitives/runtime/Cargo.toml @@ -21,24 +21,24 @@ codec = { package = "parity-scale-codec", version = "3.6.1", default-features = either = { version = "1.5", default-features = false } hash256-std-hasher = { version = "0.15.2", default-features = false } impl-trait-for-tuples = "0.2.2" -log = { version = "0.4.17", default-features = false } +log = { workspace = true } paste = "1.0" rand = { version = "0.8.5", optional = true } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.195", default-features = false, features = ["alloc", "derive"], optional = true } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +serde = { features = ["alloc", "derive"], optional = true, workspace = true } sp-application-crypto = { path = "../application-crypto", default-features = false } sp-arithmetic = { path = "../arithmetic", default-features = false } sp-core = { path = "../core", default-features = false } sp-io = { path = "../io", default-features = false } sp-std = { path = "../std", default-features = false } sp-weights = { path = "../weights", default-features = false } -docify = { version = "0.2.7" } +docify = "0.2.8" -simple-mermaid = { git = "https://github.com/kianenigma/simple-mermaid.git", rev = "e48b187bcfd5cc75111acd9d241f1bd36604344b", optional = true } +simple-mermaid = { version = "0.1.1", optional = true } [dev-dependencies] rand = "0.8.5" -serde_json = "1.0.111" +serde_json = { workspace = true, default-features = true } zstd = { version = "0.12.4", default-features = false } sp-api = { path = "../api" } sp-state-machine = { path = "../state-machine" } diff --git a/substrate/primitives/runtime/src/generic/header.rs b/substrate/primitives/runtime/src/generic/header.rs index 0eeef363a06dc95e999a0277563e1c86f46e7028..d78aa5c8d3c29ea35eacecdbd0c40ebe0bfec926 100644 --- a/substrate/primitives/runtime/src/generic/header.rs +++ b/substrate/primitives/runtime/src/generic/header.rs @@ -133,7 +133,7 @@ where impl Header where Number: Member - + sp_std::hash::Hash + + core::hash::Hash + Copy + MaybeDisplay + AtLeast32BitUnsigned diff --git a/substrate/primitives/runtime/src/generic/unchecked_extrinsic.rs b/substrate/primitives/runtime/src/generic/unchecked_extrinsic.rs index 5b54caf597b7396dd5f32b0f695db2e011a9fca1..8f6c0c6f650daa36f18f132e3fc0fa13eaa76621 100644 --- a/substrate/primitives/runtime/src/generic/unchecked_extrinsic.rs +++ b/substrate/primitives/runtime/src/generic/unchecked_extrinsic.rs @@ -40,7 +40,7 @@ use sp_std::{fmt, prelude::*}; /// the decoding fails. const EXTRINSIC_FORMAT_VERSION: u8 = 4; -/// The `SingaturePayload` of `UncheckedExtrinsic`. +/// The `SignaturePayload` of `UncheckedExtrinsic`. type UncheckedSignaturePayload = (Address, Signature, Extra); /// An extrinsic right from the external world. This is unchecked and so can contain a signature. diff --git a/substrate/primitives/runtime/src/lib.rs b/substrate/primitives/runtime/src/lib.rs index ddf92554c83056f192015a26285408b7fdf33695..44bf3c969e5441245d1547e779195cdb68a83599 100644 --- a/substrate/primitives/runtime/src/lib.rs +++ b/substrate/primitives/runtime/src/lib.rs @@ -998,6 +998,16 @@ impl TransactionOutcome { } } +/// Confines the kind of extrinsics that can be included in a block. +#[derive(Debug, Default, PartialEq, Eq, Clone, Copy, Encode, Decode, TypeInfo)] +pub enum ExtrinsicInclusionMode { + /// All extrinsics are allowed to be included in this block. + #[default] + AllExtrinsics, + /// Inherents are allowed to be included. + OnlyInherents, +} + #[cfg(test)] mod tests { use crate::traits::BlakeTwo256; diff --git a/substrate/primitives/runtime/src/multiaddress.rs b/substrate/primitives/runtime/src/multiaddress.rs index 89b0a3bcf8cccb0d740aa5f7bc4e750a6e9aaa08..c435606312e43ab0772ac71dd06f62489b416248 100644 --- a/substrate/primitives/runtime/src/multiaddress.rs +++ b/substrate/primitives/runtime/src/multiaddress.rs @@ -32,7 +32,7 @@ pub enum MultiAddress { Raw(Vec), /// It's a 32 byte representation. Address32([u8; 32]), - /// Its a 20 byte representation. + /// It's a 20 byte representation. Address20([u8; 20]), } diff --git a/substrate/primitives/runtime/src/offchain/storage_lock.rs b/substrate/primitives/runtime/src/offchain/storage_lock.rs index a2da48721e7591909932e58cb20fffbeedb5f88d..cfdaa954fe5e8e79e276f3e29bd0df7a1cc63267 100644 --- a/substrate/primitives/runtime/src/offchain/storage_lock.rs +++ b/substrate/primitives/runtime/src/offchain/storage_lock.rs @@ -66,9 +66,9 @@ use crate::{ traits::BlockNumberProvider, }; use codec::{Codec, Decode, Encode}; +use core::fmt; use sp_core::offchain::{Duration, Timestamp}; use sp_io::offchain; -use sp_std::fmt; /// Default expiry duration for time based locks in milliseconds. const STORAGE_LOCK_DEFAULT_EXPIRY_DURATION: Duration = Duration::from_millis(20_000); @@ -556,7 +556,7 @@ mod tests { let res = lock.try_lock(); assert_eq!(res.is_ok(), false); - // sleep again untill sleep_until > deadline + // sleep again until sleep_until > deadline offchain::sleep_until(offchain::timestamp().add(Duration::from_millis(200))); // the lock has expired, failed to extend it diff --git a/substrate/primitives/runtime/src/runtime_string.rs b/substrate/primitives/runtime/src/runtime_string.rs index aa0bd52e56fe49a96bd2bd4ea87bf0d62ee2be34..607ae59db632f7d5044d48cae4dab4b78d24ad41 100644 --- a/substrate/primitives/runtime/src/runtime_string.rs +++ b/substrate/primitives/runtime/src/runtime_string.rs @@ -61,6 +61,19 @@ impl From<&'static str> for RuntimeString { } } +impl<'a> TryFrom<&'a RuntimeString> for &'a str { + type Error = core::str::Utf8Error; + fn try_from(from: &'a RuntimeString) -> core::result::Result<&'a str, Self::Error> { + match from { + #[cfg(feature = "std")] + RuntimeString::Owned(string) => Ok(string.as_str()), + #[cfg(not(feature = "std"))] + RuntimeString::Owned(vec) => core::str::from_utf8(&vec), + RuntimeString::Borrowed(str) => Ok(str), + } + } +} + #[cfg(feature = "std")] impl From for String { fn from(string: RuntimeString) -> Self { diff --git a/substrate/primitives/runtime/src/testing.rs b/substrate/primitives/runtime/src/testing.rs index 5f94c834a8f295bee945e9d772019e12ed37c828..b4aeda5a0e7a3e75a44c9d50b4ed22788d1f96e8 100644 --- a/substrate/primitives/runtime/src/testing.rs +++ b/substrate/primitives/runtime/src/testing.rs @@ -284,9 +284,9 @@ where } /// The signature payload of a `TestXt`. -type TxSingaturePayload = (u64, Extra); +type TxSignaturePayload = (u64, Extra); -impl SignaturePayload for TxSingaturePayload { +impl SignaturePayload for TxSignaturePayload { type SignatureAddress = u64; type Signature = (); type SignatureExtra = Extra; @@ -299,7 +299,7 @@ impl SignaturePayload for TxSingaturePayload { #[derive(PartialEq, Eq, Clone, Encode, Decode, TypeInfo)] pub struct TestXt { /// Signature of the extrinsic. - pub signature: Option>, + pub signature: Option>, /// Call of the extrinsic. pub call: Call, } @@ -348,7 +348,7 @@ impl traits::Extrinsic for TestXt { type Call = Call; - type SignaturePayload = TxSingaturePayload; + type SignaturePayload = TxSignaturePayload; fn is_signed(&self) -> Option { Some(self.signature.is_some()) diff --git a/substrate/primitives/runtime/src/traits.rs b/substrate/primitives/runtime/src/traits.rs index 4213117334ee7860f0600af2e8033c24b550938b..d023aa045dbe09e492bac2c8a8150d620348c37e 100644 --- a/substrate/primitives/runtime/src/traits.rs +++ b/substrate/primitives/runtime/src/traits.rs @@ -133,7 +133,7 @@ impl Verify for sp_core::ecdsa::Signature { self.as_ref(), &sp_io::hashing::blake2_256(msg.get()), ) { - Ok(pubkey) => signer.as_ref() == &pubkey[..], + Ok(pubkey) => signer.0 == pubkey, _ => false, } } @@ -330,7 +330,7 @@ impl> Morph for MorphInto { } } -/// Implementation of `TryMorph` which attmepts to convert between types using `TryInto`. +/// Implementation of `TryMorph` which attempts to convert between types using `TryInto`. pub struct TryMorphInto(sp_std::marker::PhantomData); impl> TryMorph for TryMorphInto { type Outcome = T; @@ -540,6 +540,9 @@ morph_types! { /// Morpher to disregard the source value and replace with another. pub type Replace = |_| -> V::Type { V::get() }; + /// Morpher to disregard the source value and replace with the default of `V`. + pub type ReplaceWithDefault = |_| -> V { Default::default() }; + /// Mutator which reduces a scalar by a particular amount. pub type ReduceBy = |r: N::Type| -> N::Type { r.checked_sub(&N::get()).unwrap_or(Zero::zero()) @@ -1446,7 +1449,7 @@ pub trait Dispatchable { /// to represent the dispatch class and weight. type Info; /// Additional information that is returned by `dispatch`. Can be used to supply the caller - /// with information about a `Dispatchable` that is ownly known post dispatch. + /// with information about a `Dispatchable` that is only known post dispatch. type PostInfo: Eq + PartialEq + Clone + Copy + Encode + Decode + Printable; /// Actually dispatch this call and return the result of it. fn dispatch(self, origin: Self::RuntimeOrigin) @@ -2319,12 +2322,12 @@ pub trait BlockNumberProvider { /// . fn current_block_number() -> Self::BlockNumber; - /// Utility function only to be used in benchmarking scenarios, to be implemented optionally, - /// else a noop. + /// Utility function only to be used in benchmarking scenarios or tests, to be implemented + /// optionally, else a noop. /// /// It allows for setting the block number that will later be fetched /// This is useful in case the block number provider is different than System - #[cfg(feature = "runtime-benchmarks")] + #[cfg(any(feature = "std", feature = "runtime-benchmarks"))] fn set_block_number(_block: Self::BlockNumber) {} } diff --git a/substrate/primitives/session/Cargo.toml b/substrate/primitives/session/Cargo.toml index 99764c0a17f92b4772ee64a134633403835b1348..cdee4fb03e1254e04e0a068908a380ed28350bee 100644 --- a/substrate/primitives/session/Cargo.toml +++ b/substrate/primitives/session/Cargo.toml @@ -17,12 +17,11 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } sp-api = { path = "../api", default-features = false } sp-core = { path = "../core", default-features = false } sp-runtime = { path = "../runtime", optional = true } sp-staking = { path = "../staking", default-features = false } -sp-std = { path = "../std", default-features = false } sp-keystore = { path = "../keystore", optional = true } [features] @@ -35,5 +34,4 @@ std = [ "sp-keystore/std", "sp-runtime/std", "sp-staking/std", - "sp-std/std", ] diff --git a/substrate/primitives/session/src/lib.rs b/substrate/primitives/session/src/lib.rs index 9933495fd60135c826d822cc3d3e1471492797fb..fe7a38047338d92d18e5427587c7e46bdee11829 100644 --- a/substrate/primitives/session/src/lib.rs +++ b/substrate/primitives/session/src/lib.rs @@ -19,6 +19,8 @@ #![cfg_attr(not(feature = "std"), no_std)] +extern crate alloc; + use codec::{Decode, Encode}; #[cfg(feature = "std")] @@ -26,9 +28,9 @@ use sp_api::ProvideRuntimeApi; #[cfg(feature = "std")] use sp_runtime::traits::Block as BlockT; +use alloc::vec::Vec; use sp_core::RuntimeDebug; use sp_staking::SessionIndex; -use sp_std::vec::Vec; pub mod runtime_api; pub use runtime_api::*; diff --git a/substrate/primitives/session/src/runtime_api.rs b/substrate/primitives/session/src/runtime_api.rs index 5e508cd3dbd3872bc5a5cf99b80e0eed1f755116..3acc882aabcff943fc78d886d0c6a112d9687e00 100644 --- a/substrate/primitives/session/src/runtime_api.rs +++ b/substrate/primitives/session/src/runtime_api.rs @@ -15,8 +15,8 @@ // See the License for the specific language governing permissions and // limitations under the License. +use alloc::vec::Vec; pub use sp_core::crypto::KeyTypeId; -use sp_std::prelude::*; sp_api::decl_runtime_apis! { /// Session keys runtime api. diff --git a/substrate/primitives/staking/Cargo.toml b/substrate/primitives/staking/Cargo.toml index e1ab87bef0999d89a6b496f8acef640e15de36f1..e380abb6a8c070a861b8a84db473a66173aeaacd 100644 --- a/substrate/primitives/staking/Cargo.toml +++ b/substrate/primitives/staking/Cargo.toml @@ -16,14 +16,13 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -serde = { version = "1.0.195", default-features = false, features = ["alloc", "derive"], optional = true } +serde = { features = ["alloc", "derive"], optional = true, workspace = true } codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } impl-trait-for-tuples = "0.2.2" sp-core = { path = "../core", default-features = false } sp-runtime = { path = "../runtime", default-features = false } -sp-std = { path = "../std", default-features = false } [features] default = ["std"] @@ -33,6 +32,5 @@ std = [ "serde/std", "sp-core/std", "sp-runtime/std", - "sp-std/std", ] runtime-benchmarks = ["sp-runtime/runtime-benchmarks"] diff --git a/substrate/primitives/staking/src/lib.rs b/substrate/primitives/staking/src/lib.rs index c2ac5ae004b1b7621341020e614a9c769e27d2dd..11b7ef41b9a7b06e1b67d43abb58e9aacc33d8ab 100644 --- a/substrate/primitives/staking/src/lib.rs +++ b/substrate/primitives/staking/src/lib.rs @@ -20,14 +20,17 @@ //! A crate which contains primitives that are useful for implementation that uses staking //! approaches in general. Definitions related to sessions, slashing, etc go here. +extern crate alloc; + use crate::currency_to_vote::CurrencyToVote; +use alloc::{collections::btree_map::BTreeMap, vec, vec::Vec}; use codec::{Decode, Encode, FullCodec, HasCompact, MaxEncodedLen}; +use core::ops::Sub; use scale_info::TypeInfo; use sp_runtime::{ traits::{AtLeast32BitUnsigned, Zero}, DispatchError, DispatchResult, RuntimeDebug, Saturating, }; -use sp_std::{collections::btree_map::BTreeMap, ops::Sub, vec, vec::Vec}; pub mod offence; @@ -150,6 +153,9 @@ pub trait OnStakingUpdate { _slashed_total: Balance, ) { } + + /// Fired when a portion of a staker's balance has been withdrawn. + fn on_withdraw(_stash: &AccountId, _amount: Balance) {} } /// A generic representation of a staking implementation. @@ -169,7 +175,7 @@ pub trait StakingInterface { + Saturating; /// AccountId type used by the staking system. - type AccountId: Clone + sp_std::fmt::Debug; + type AccountId: Clone + core::fmt::Debug; /// Means of converting Currency to VoteWeight. type CurrencyToVote: CurrencyToVote; diff --git a/substrate/primitives/staking/src/offence.rs b/substrate/primitives/staking/src/offence.rs index 8013166374e064ab1b573e57991449567e3845da..30d96d0cbafce9f0540ffbb49cf15c7375ea405f 100644 --- a/substrate/primitives/staking/src/offence.rs +++ b/substrate/primitives/staking/src/offence.rs @@ -18,10 +18,10 @@ //! Common traits and types that are useful for describing offences for usage in environments //! that use staking. +use alloc::vec::Vec; use codec::{Decode, Encode}; use sp_core::Get; use sp_runtime::{transaction_validity::TransactionValidityError, DispatchError, Perbill}; -use sp_std::vec::Vec; use crate::SessionIndex; @@ -117,7 +117,7 @@ pub trait Offence { /// Errors that may happen on offence reports. #[derive(PartialEq, sp_runtime::RuntimeDebug)] pub enum OffenceError { - /// The report has already been sumbmitted. + /// The report has already been submitted. DuplicateReport, /// Other error has happened. diff --git a/substrate/primitives/state-machine/Cargo.toml b/substrate/primitives/state-machine/Cargo.toml index b63d5685a331a88d659e13ea9d15b9f17becc402..63251bbd181d4b6ef63661e1b568d1929d619a3c 100644 --- a/substrate/primitives/state-machine/Cargo.toml +++ b/substrate/primitives/state-machine/Cargo.toml @@ -19,18 +19,17 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false } hash-db = { version = "0.16.0", default-features = false } -log = { version = "0.4.17", default-features = false } +log = { workspace = true } parking_lot = { version = "0.12.1", optional = true } rand = { version = "0.8.5", optional = true } smallvec = "1.11.0" -thiserror = { version = "1.0.48", optional = true } +thiserror = { optional = true, workspace = true } tracing = { version = "0.1.29", optional = true } sp-core = { path = "../core", default-features = false } sp-externalities = { path = "../externalities", default-features = false } sp-panic-handler = { path = "../panic-handler", optional = true } -sp-std = { path = "../std", default-features = false } sp-trie = { path = "../trie", default-features = false } -trie-db = { version = "0.28.0", default-features = false } +trie-db = { version = "0.29.0", default-features = false } [dev-dependencies] array-bytes = "6.1" @@ -51,7 +50,6 @@ std = [ "sp-externalities/std", "sp-panic-handler", "sp-runtime/std", - "sp-std/std", "sp-trie/std", "thiserror", "tracing", diff --git a/substrate/primitives/state-machine/src/backend.rs b/substrate/primitives/state-machine/src/backend.rs index ea9cd442d70ba55056d2ebdc27fa1eb26d0ba9c9..90be55d58a4ed87aa31b875ab0ffd13a7d2ea78a 100644 --- a/substrate/primitives/state-machine/src/backend.rs +++ b/substrate/primitives/state-machine/src/backend.rs @@ -23,13 +23,13 @@ use crate::{ trie_backend_essence::TrieBackendStorage, ChildStorageCollection, StorageCollection, StorageKey, StorageValue, UsageInfo, }; +use alloc::vec::Vec; use codec::Encode; use core::marker::PhantomData; use hash_db::Hasher; use sp_core::storage::{ChildInfo, StateVersion, TrackedStorageKey}; #[cfg(feature = "std")] use sp_core::traits::RuntimeCode; -use sp_std::vec::Vec; use sp_trie::{MerkleValue, PrefixedMemoryDB}; /// A struct containing arguments for iterating over the storage. @@ -179,7 +179,7 @@ pub type BackendTransaction = PrefixedMemoryDB; /// to it. /// /// The clone operation (if implemented) should be cheap. -pub trait Backend: sp_std::fmt::Debug { +pub trait Backend: core::fmt::Debug { /// An error type when fetching data is not possible. type Error: super::Error; diff --git a/substrate/primitives/state-machine/src/error.rs b/substrate/primitives/state-machine/src/error.rs index 4e8e02a26025ca9ef0f6899d3870e9e96c96da22..cf8ca4425c119e8960f33def2e6b2eaa35afbd44 100644 --- a/substrate/primitives/state-machine/src/error.rs +++ b/substrate/primitives/state-machine/src/error.rs @@ -16,7 +16,7 @@ // limitations under the License. /// State Machine Errors -use sp_std::fmt; +use core::fmt; /// State Machine Error bound. /// diff --git a/substrate/primitives/state-machine/src/ext.rs b/substrate/primitives/state-machine/src/ext.rs index 11df46f2a4a3a901753c10a5acf1b6535e61f8ea..9aa32bc866cfab9e2db44959c93bc4fe0b11e120 100644 --- a/substrate/primitives/state-machine/src/ext.rs +++ b/substrate/primitives/state-machine/src/ext.rs @@ -32,12 +32,10 @@ use sp_core::storage::{ use sp_externalities::{Extension, ExtensionStore, Externalities, MultiRemovalResults}; use crate::{log_error, trace, warn}; -use sp_std::{ +use alloc::{boxed::Box, vec, vec::Vec}; +use core::{ any::{Any, TypeId}, - boxed::Box, cmp::Ordering, - vec, - vec::Vec, }; #[cfg(feature = "std")] use std::error; @@ -46,7 +44,7 @@ const EXT_NOT_ALLOWED_TO_FAIL: &str = "Externalities not allowed to fail within const BENCHMARKING_FN: &str = "\ This is a special fn only for benchmarking where a database commit happens from the runtime. For that reason client started transactions before calling into runtime are not allowed. - Without client transactions the loop condition garantuees the success of the tx close."; + Without client transactions the loop condition guarantees the success of the tx close."; #[cfg(feature = "std")] fn guard() -> sp_panic_handler::AbortGuard { @@ -724,7 +722,7 @@ impl Encode for EncodeOpaqueValue { } } -/// Auxialiary structure for appending a value to a storage item. +/// Auxiliary structure for appending a value to a storage item. pub(crate) struct StorageAppend<'a>(&'a mut Vec); impl<'a> StorageAppend<'a> { @@ -739,7 +737,7 @@ impl<'a> StorageAppend<'a> { pub fn append(&mut self, value: Vec) { let value = vec![EncodeOpaqueValue(value)]; - let item = sp_std::mem::take(self.0); + let item = core::mem::take(self.0); *self.0 = match Vec::::append_or_new(item, &value) { Ok(item) => item, diff --git a/substrate/primitives/state-machine/src/in_memory_backend.rs b/substrate/primitives/state-machine/src/in_memory_backend.rs index ce551cec2a473ceacbc1ab99984af2e5ed4b64f4..06fe6d4162a7f4c920c8f09c2e4e8b05a3c72c03 100644 --- a/substrate/primitives/state-machine/src/in_memory_backend.rs +++ b/substrate/primitives/state-machine/src/in_memory_backend.rs @@ -79,7 +79,7 @@ where /// Apply the given transaction to this backend and set the root to the given value. pub fn apply_transaction(&mut self, root: H::Out, transaction: PrefixedMemoryDB) { - let mut storage = sp_std::mem::take(self).into_storage(); + let mut storage = core::mem::take(self).into_storage(); storage.consolidate(transaction); *self = TrieBackendBuilder::new(storage, root).build(); diff --git a/substrate/primitives/state-machine/src/lib.rs b/substrate/primitives/state-machine/src/lib.rs index 5909a30a814c32686acbb6c369831a6d43649a5d..13087431d387b9e986519bbdcabfe9eb3c4fe5c5 100644 --- a/substrate/primitives/state-machine/src/lib.rs +++ b/substrate/primitives/state-machine/src/lib.rs @@ -20,6 +20,8 @@ #![warn(missing_docs)] #![cfg_attr(not(feature = "std"), no_std)] +extern crate alloc; + pub mod backend; #[cfg(feature = "std")] mod basic; @@ -118,8 +120,8 @@ pub type DefaultError = String; pub struct DefaultError; #[cfg(not(feature = "std"))] -impl sp_std::fmt::Display for DefaultError { - fn fmt(&self, f: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result { +impl core::fmt::Display for DefaultError { + fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result { write!(f, "DefaultError") } } @@ -1449,7 +1451,7 @@ mod tests { enum Item { InitializationItem, DiscardedItem, - CommitedItem, + CommittedItem, } let key = b"events".to_vec(); @@ -1486,21 +1488,21 @@ mod tests { assert_eq!(ext.storage(key.as_slice()), Some(vec![Item::InitializationItem].encode())); - ext.storage_append(key.clone(), Item::CommitedItem.encode()); + ext.storage_append(key.clone(), Item::CommittedItem.encode()); assert_eq!( ext.storage(key.as_slice()), - Some(vec![Item::InitializationItem, Item::CommitedItem].encode()), + Some(vec![Item::InitializationItem, Item::CommittedItem].encode()), ); } overlay.start_transaction(); - // Then only initlaization item and second (committed) item should persist. + // Then only initialization item and second (committed) item should persist. { let ext = Ext::new(&mut overlay, backend, None); assert_eq!( ext.storage(key.as_slice()), - Some(vec![Item::InitializationItem, Item::CommitedItem].encode()), + Some(vec![Item::InitializationItem, Item::CommittedItem].encode()), ); } } @@ -1864,7 +1866,7 @@ mod tests { // a inner hashable node (&b"k"[..], Some(&long_vec[..])), // need to ensure this is not an inline node - // otherwhise we do not know what is accessed when + // otherwise we do not know what is accessed when // storing proof. (&b"key1"[..], Some(&vec![5u8; 32][..])), (&b"key2"[..], Some(&b"val3"[..])), diff --git a/substrate/primitives/state-machine/src/overlayed_changes/changeset.rs b/substrate/primitives/state-machine/src/overlayed_changes/changeset.rs index 59589dbbb37e8c37022ab176df0b02c25d53b3b6..601bc2e29198561d501e1f20b11c2323c0064989 100644 --- a/substrate/primitives/state-machine/src/overlayed_changes/changeset.rs +++ b/substrate/primitives/state-machine/src/overlayed_changes/changeset.rs @@ -20,16 +20,14 @@ use super::{Extrinsics, StorageKey, StorageValue}; #[cfg(not(feature = "std"))] -use sp_std::collections::btree_set::BTreeSet as Set; +use alloc::collections::btree_set::BTreeSet as Set; #[cfg(feature = "std")] use std::collections::HashSet as Set; use crate::warn; +use alloc::collections::{btree_map::BTreeMap, btree_set::BTreeSet}; +use core::hash::Hash; use smallvec::SmallVec; -use sp_std::{ - collections::{btree_map::BTreeMap, btree_set::BTreeSet}, - hash::Hash, -}; const PROOF_OVERLAY_NON_EMPTY: &str = "\ An OverlayValue is always created with at least one transaction and dropped as soon @@ -49,7 +47,7 @@ pub struct NoOpenTransaction; #[cfg_attr(test, derive(PartialEq))] pub struct AlreadyInRuntime; -/// Error when calling `exit_runtime` when not being in runtime exection mdde. +/// Error when calling `exit_runtime` when not being in runtime execution mode. #[derive(Debug)] #[cfg_attr(test, derive(PartialEq))] pub struct NotInRuntime; @@ -225,7 +223,7 @@ impl OverlayedMap { /// This changeset might be created when there are already open transactions. /// We need to catch up here so that the child is at the same transaction depth. pub fn spawn_child(&self) -> Self { - use sp_std::iter::repeat; + use core::iter::repeat; Self { changes: Default::default(), dirty_keys: repeat(Set::new()).take(self.transaction_depth()).collect(), @@ -242,7 +240,7 @@ impl OverlayedMap { /// Get an optional reference to the value stored for the specified key. pub fn get(&self, key: &Q) -> Option<&OverlayedEntry> where - K: sp_std::borrow::Borrow, + K: core::borrow::Borrow, Q: Ord + ?Sized, { self.changes.get(key) @@ -271,7 +269,7 @@ impl OverlayedMap { /// /// Panics: /// Panics if there are open transactions: `transaction_depth() > 0` - pub fn drain_commited(self) -> impl Iterator { + pub fn drain_committed(self) -> impl Iterator { assert!(self.transaction_depth() == 0, "Drain is not allowed with open transactions."); self.changes.into_iter().map(|(k, mut v)| (k, v.pop_transaction().value)) } @@ -283,7 +281,7 @@ impl OverlayedMap { self.dirty_keys.len() } - /// Call this before transfering control to the runtime. + /// Call this before transferring control to the runtime. /// /// This protects all existing transactions from being removed by the runtime. /// Calling this while already inside the runtime will return an error. @@ -448,7 +446,7 @@ impl OverlayedChangeSet { /// Get the iterator over all changes that follow the supplied `key`. pub fn changes_after(&self, key: &[u8]) -> impl Iterator { - use sp_std::ops::Bound; + use core::ops::Bound; let range = (Bound::Excluded(key), Bound::Unbounded); self.changes.range::<[u8], _>(range).map(|(k, v)| (k.as_slice(), v)) } @@ -473,7 +471,7 @@ mod test { } fn assert_drained_changes(is: OverlayedChangeSet, expected: Changes) { - let is = is.drain_commited().collect::>(); + let is = is.drain_committed().collect::>(); let expected = expected .iter() .map(|(k, v)| (k.to_vec(), v.0.map(From::from))) @@ -482,7 +480,7 @@ mod test { } fn assert_drained(is: OverlayedChangeSet, expected: Drained) { - let is = is.drain_commited().collect::>(); + let is = is.drain_committed().collect::>(); let expected = expected .iter() .map(|(k, v)| (k.to_vec(), v.map(From::from))) @@ -528,7 +526,7 @@ mod test { changeset.set(b"key0".to_vec(), Some(b"val0-rolled".to_vec()), Some(1000)); changeset.set(b"key5".to_vec(), Some(b"val5-rolled".to_vec()), None); - // changes contain all changes not only the commmited ones. + // changes contain all changes not only the committed ones. let all_changes: Changes = vec![ (b"key0", (Some(b"val0-rolled"), vec![1, 10, 1000])), (b"key1", (Some(b"val1"), vec![1])), @@ -809,7 +807,7 @@ mod test { fn drain_with_open_transaction_panics() { let mut changeset = OverlayedChangeSet::default(); changeset.start_transaction(); - let _ = changeset.drain_commited(); + let _ = changeset.drain_committed(); } #[test] diff --git a/substrate/primitives/state-machine/src/overlayed_changes/mod.rs b/substrate/primitives/state-machine/src/overlayed_changes/mod.rs index 626cf6c3cafe128c98f6c5bedfe5d6cbe1ab958d..d6fc404e84fb5256656c5849d8f52894f37bfa02 100644 --- a/substrate/primitives/state-machine/src/overlayed_changes/mod.rs +++ b/substrate/primitives/state-machine/src/overlayed_changes/mod.rs @@ -22,6 +22,7 @@ mod offchain; use self::changeset::OverlayedChangeSet; use crate::{backend::Backend, stats::StateMachineStats, BackendTransaction, DefaultError}; +use alloc::{collections::btree_set::BTreeSet, vec::Vec}; use codec::{Decode, Encode}; use hash_db::Hasher; pub use offchain::OffchainOverlayedChanges; @@ -31,12 +32,13 @@ use sp_core::{ }; #[cfg(feature = "std")] use sp_externalities::{Extension, Extensions}; -#[cfg(not(feature = "std"))] -use sp_std::collections::btree_map::BTreeMap as Map; -use sp_std::{collections::btree_set::BTreeSet, vec::Vec}; use sp_trie::{empty_child_trie_root, LayoutV1}; + +#[cfg(not(feature = "std"))] +use alloc::collections::btree_map::BTreeMap as Map; #[cfg(feature = "std")] use std::collections::{hash_map::Entry as MapEntry, HashMap as Map}; + #[cfg(feature = "std")] use std::{ any::{Any, TypeId}, @@ -136,7 +138,7 @@ impl Clone for OverlayedChanges { } } -impl sp_std::fmt::Debug for OverlayedChanges { +impl core::fmt::Debug for OverlayedChanges { fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { f.debug_struct("OverlayedChanges") .field("top", &self.top) @@ -259,7 +261,7 @@ impl Clone for StorageTransactionCache { } } -impl sp_std::fmt::Debug for StorageTransactionCache { +impl core::fmt::Debug for StorageTransactionCache { fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { let mut debug = f.debug_struct("StorageTransactionCache"); @@ -478,7 +480,7 @@ impl OverlayedChanges { Ok(()) } - /// Call this before transfering control to the runtime. + /// Call this before transferring control to the runtime. /// /// This protects all existing transactions from being removed by the runtime. /// Calling this while already inside the runtime will return an error. @@ -572,11 +574,11 @@ impl OverlayedChanges { }, }; - use sp_std::mem::take; - let main_storage_changes = take(&mut self.top).drain_commited(); + use core::mem::take; + let main_storage_changes = take(&mut self.top).drain_committed(); let child_storage_changes = take(&mut self.children) .into_iter() - .map(|(key, (val, info))| (key, (val.drain_commited(), info))); + .map(|(key, (val, info))| (key, (val.drain_committed(), info))); let offchain_storage_changes = self.offchain_drain_committed().collect(); @@ -777,7 +779,7 @@ where K: Ord, F: FnMut(&K, &mut V) -> bool, { - let old = sp_std::mem::replace(map, Map::default()); + let old = core::mem::replace(map, Map::default()); for (k, mut v) in old.into_iter() { if f(&k, &mut v) { map.insert(k, v); @@ -807,7 +809,7 @@ pub struct OverlayedExtensions<'a> { #[cfg(feature = "std")] impl<'a> OverlayedExtensions<'a> { - /// Create a new instance of overalyed extensions from the given extensions. + /// Create a new instance of overlaid extensions from the given extensions. pub fn new(extensions: &'a mut Extensions) -> Self { Self { extensions: extensions diff --git a/substrate/primitives/state-machine/src/overlayed_changes/offchain.rs b/substrate/primitives/state-machine/src/overlayed_changes/offchain.rs index 66e7ab5864c065f4d335b7daae9e3c686d9c3ec8..1e6965e874759e30b415783a560192af8412027d 100644 --- a/substrate/primitives/state-machine/src/overlayed_changes/offchain.rs +++ b/substrate/primitives/state-machine/src/overlayed_changes/offchain.rs @@ -18,8 +18,8 @@ //! Overlayed changes for offchain indexing. use super::changeset::OverlayedMap; +use alloc::vec::Vec; use sp_core::offchain::OffchainOverlayedChange; -use sp_std::prelude::Vec; /// In-memory storage for offchain workers recoding changes for the actual offchain storage /// implementation. @@ -48,7 +48,7 @@ impl OffchainOverlayedChanges { /// Drain all elements of changeset. pub fn drain(&mut self) -> impl Iterator { - sp_std::mem::take(self).into_iter() + core::mem::take(self).into_iter() } /// Remove a key and its associated value from the offchain database. diff --git a/substrate/primitives/state-machine/src/stats.rs b/substrate/primitives/state-machine/src/stats.rs index 7c5510961a373268ca44693489bed842209c1e03..84ab7725660da607442b55c4015be656dcd4fa55 100644 --- a/substrate/primitives/state-machine/src/stats.rs +++ b/substrate/primitives/state-machine/src/stats.rs @@ -17,7 +17,7 @@ //! Usage statistics for state db -use sp_std::cell::RefCell; +use core::cell::RefCell; #[cfg(feature = "std")] use std::time::{Duration, Instant}; diff --git a/substrate/primitives/state-machine/src/testing.rs b/substrate/primitives/state-machine/src/testing.rs index 0eb7b6d1118f9aa3cff1caee089d526b3f711d94..e19ba95755c1b16f5cc6a2d59a8ede48997707f0 100644 --- a/substrate/primitives/state-machine/src/testing.rs +++ b/substrate/primitives/state-machine/src/testing.rs @@ -417,7 +417,7 @@ mod tests { original_ext.backend.clone().into_storage(), ); - // Ensure all have the correct ref counrt + // Ensure all have the correct ref count assert!(original_ext.backend.backend_storage().keys().values().all(|r| *r == 2)); // Drain the raw storage and root. diff --git a/substrate/primitives/state-machine/src/trie_backend.rs b/substrate/primitives/state-machine/src/trie_backend.rs index 7496463e642100dd6cd6908525e29ee5fc34bf9a..f91ce5d2e52f6df1a4a3f61231691e9105118167 100644 --- a/substrate/primitives/state-machine/src/trie_backend.rs +++ b/substrate/primitives/state-machine/src/trie_backend.rs @@ -297,7 +297,7 @@ struct CachedIter where H: Hasher, { - last_key: sp_std::vec::Vec, + last_key: alloc::vec::Vec, iter: RawIter, } @@ -390,9 +390,9 @@ where } impl, H: Hasher, C: TrieCacheProvider, R: TrieRecorderProvider> - sp_std::fmt::Debug for TrieBackend + core::fmt::Debug for TrieBackend { - fn fmt(&self, f: &mut sp_std::fmt::Formatter<'_>) -> sp_std::fmt::Result { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { write!(f, "TrieBackend") } } diff --git a/substrate/primitives/state-machine/src/trie_backend_essence.rs b/substrate/primitives/state-machine/src/trie_backend_essence.rs index 3f789111deeffe27ea4e8d8f7c47de8ea61eb082..a1f0057987411fc14d96c0c817659d585c4477f0 100644 --- a/substrate/primitives/state-machine/src/trie_backend_essence.rs +++ b/substrate/primitives/state-machine/src/trie_backend_essence.rs @@ -23,18 +23,19 @@ use crate::{ trie_backend::TrieCacheProvider, warn, StorageKey, StorageValue, }; +#[cfg(feature = "std")] +use alloc::sync::Arc; +use alloc::{boxed::Box, vec::Vec}; use codec::Codec; +use core::marker::PhantomData; use hash_db::{self, AsHashDB, HashDB, HashDBRef, Hasher, Prefix}; #[cfg(feature = "std")] use parking_lot::RwLock; use sp_core::storage::{ChildInfo, ChildType, StateVersion}; -#[cfg(feature = "std")] -use sp_std::sync::Arc; -use sp_std::{boxed::Box, marker::PhantomData, vec::Vec}; use sp_trie::{ child_delta_trie_root, delta_trie_root, empty_child_trie_root, - read_child_trie_first_descedant_value, read_child_trie_hash, read_child_trie_value, - read_trie_first_descedant_value, read_trie_value, + read_child_trie_first_descendant_value, read_child_trie_hash, read_child_trie_value, + read_trie_first_descendant_value, read_trie_value, trie_types::{TrieDBBuilder, TrieError}, DBValue, KeySpacedDB, MerkleValue, NodeCodec, PrefixedMemoryDB, Trie, TrieCache, TrieDBRawIterator, TrieRecorder, TrieRecorderProvider, @@ -55,7 +56,7 @@ macro_rules! format { }; } -type Result = sp_std::result::Result; +type Result = core::result::Result; /// Patricia trie-based storage trait. pub trait Storage: Send + Sync { @@ -553,7 +554,7 @@ where let map_e = |e| format!("Trie lookup error: {}", e); self.with_recorder_and_cache(None, |recorder, cache| { - read_trie_first_descedant_value::, _>(self, &self.root, key, recorder, cache) + read_trie_first_descendant_value::, _>(self, &self.root, key, recorder, cache) .map_err(map_e) }) } @@ -569,7 +570,7 @@ where let map_e = |e| format!("Trie lookup error: {}", e); self.with_recorder_and_cache(Some(child_root), |recorder, cache| { - read_child_trie_first_descedant_value::, _>( + read_child_trie_first_descendant_value::, _>( child_info.keyspace(), self, &child_root, diff --git a/substrate/primitives/statement-store/Cargo.toml b/substrate/primitives/statement-store/Cargo.toml index 14af57a7b419b5a5db29065106a8853a6a9bf493..b36bff69a007c669724950ca94f2cebc859890ed 100644 --- a/substrate/primitives/statement-store/Cargo.toml +++ b/substrate/primitives/statement-store/Cargo.toml @@ -17,16 +17,15 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } sp-core = { path = "../core", default-features = false } sp-crypto-hashing = { path = "../crypto/hashing", default-features = false } sp-runtime = { path = "../runtime", default-features = false } -sp-std = { path = "../std", default-features = false } sp-api = { path = "../api", default-features = false } sp-application-crypto = { path = "../application-crypto", default-features = false } sp-runtime-interface = { path = "../runtime-interface", default-features = false } sp-externalities = { path = "../externalities", default-features = false } -thiserror = { version = "1.0", optional = true } +thiserror = { optional = true, workspace = true } # ECIES dependencies ed25519-dalek = { version = "2.1", optional = true } @@ -57,7 +56,6 @@ std = [ "sp-externalities/std", "sp-runtime-interface/std", "sp-runtime/std", - "sp-std/std", "thiserror", "x25519-dalek", ] diff --git a/substrate/primitives/statement-store/src/ecies.rs b/substrate/primitives/statement-store/src/ecies.rs index 80a040fd4c8e03de91bdd851bb635d506c20208f..6fa16658e0071c78d99fd3b88f4bdbca6af551a6 100644 --- a/substrate/primitives/statement-store/src/ecies.rs +++ b/substrate/primitives/statement-store/src/ecies.rs @@ -148,7 +148,7 @@ mod test { #[test] fn basic_ed25519_encryption() { let (pair, _) = sp_core::ed25519::Pair::generate(); - let pk = pair.into(); + let pk = pair.public(); let plain_message = b"An important secret message"; let encrypted = encrypt_ed25519(&pk, plain_message).unwrap(); diff --git a/substrate/primitives/statement-store/src/lib.rs b/substrate/primitives/statement-store/src/lib.rs index 04175f6d6160e50985673338c7b187539570bdfa..dbac017ff6493e1da04251b33da9510d12eed078 100644 --- a/substrate/primitives/statement-store/src/lib.rs +++ b/substrate/primitives/statement-store/src/lib.rs @@ -20,13 +20,15 @@ //! A crate which contains statement-store primitives. +extern crate alloc; + +use alloc::vec::Vec; use codec::{Decode, Encode}; use scale_info::TypeInfo; use sp_application_crypto::RuntimeAppPublic; #[cfg(feature = "std")] use sp_core::Pair; use sp_runtime_interface::pass_by::PassByCodec; -use sp_std::vec::Vec; /// Statement topic. pub type Topic = [u8; 32]; @@ -338,8 +340,8 @@ impl Statement { Some(Proof::OnChain { .. }) | None => SignatureVerificationResult::NoSignature, Some(Proof::Sr25519 { signature, signer }) => { let to_sign = self.signature_material(); - let signature = sp_core::sr25519::Signature(*signature); - let public = sp_core::sr25519::Public(*signer); + let signature = sp_core::sr25519::Signature::from(*signature); + let public = sp_core::sr25519::Public::from(*signer); if signature.verify(to_sign.as_slice(), &public) { SignatureVerificationResult::Valid(*signer) } else { @@ -348,8 +350,8 @@ impl Statement { }, Some(Proof::Ed25519 { signature, signer }) => { let to_sign = self.signature_material(); - let signature = sp_core::ed25519::Signature(*signature); - let public = sp_core::ed25519::Public(*signer); + let signature = sp_core::ed25519::Signature::from(*signature); + let public = sp_core::ed25519::Public::from(*signer); if signature.verify(to_sign.as_slice(), &public) { SignatureVerificationResult::Valid(*signer) } else { @@ -358,8 +360,8 @@ impl Statement { }, Some(Proof::Secp256k1Ecdsa { signature, signer }) => { let to_sign = self.signature_material(); - let signature = sp_core::ecdsa::Signature(*signature); - let public = sp_core::ecdsa::Public(*signer); + let signature = sp_core::ecdsa::Signature::from(*signature); + let public = sp_core::ecdsa::Public::from(*signer); if signature.verify(to_sign.as_slice(), &public) { let sender_hash = ::hash(signer); diff --git a/substrate/primitives/statement-store/src/runtime_api.rs b/substrate/primitives/statement-store/src/runtime_api.rs index 13f88bc977e9efc8f9be5f9fdcfdd8ac098c8de2..4d25576c801fa608aed18884bbe9b9ca7b5023de 100644 --- a/substrate/primitives/statement-store/src/runtime_api.rs +++ b/substrate/primitives/statement-store/src/runtime_api.rs @@ -18,11 +18,11 @@ //! Runtime support for the statement store. use crate::{Hash, Statement, Topic}; +use alloc::vec::Vec; use codec::{Decode, Encode}; use scale_info::TypeInfo; use sp_runtime::RuntimeDebug; use sp_runtime_interface::{pass_by::PassByEnum, runtime_interface}; -use sp_std::vec::Vec; #[cfg(feature = "std")] use sp_externalities::ExternalitiesExt; diff --git a/substrate/primitives/storage/Cargo.toml b/substrate/primitives/storage/Cargo.toml index 4c2f7cadefeb5a4100006f73fa595854fffa539e..acedc8d0004970fc10f5771ba4b4e2cb87a55198 100644 --- a/substrate/primitives/storage/Cargo.toml +++ b/substrate/primitives/storage/Cargo.toml @@ -20,9 +20,8 @@ targets = ["x86_64-unknown-linux-gnu"] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } impl-serde = { version = "0.4.0", optional = true, default-features = false } ref-cast = "1.0.0" -serde = { version = "1.0.195", default-features = false, features = ["alloc", "derive"], optional = true } +serde = { features = ["alloc", "derive"], optional = true, workspace = true } sp-debug-derive = { path = "../debug-derive", default-features = false } -sp-std = { path = "../std", default-features = false } [features] default = ["std"] @@ -31,7 +30,6 @@ std = [ "impl-serde/std", "serde/std", "sp-debug-derive/std", - "sp-std/std", ] # Serde support without relying on std features. diff --git a/substrate/primitives/storage/src/lib.rs b/substrate/primitives/storage/src/lib.rs index 79c090cabf8dbd686f6b92e3770c1944ed1feb05..197994f574719ec0b000b8dbd79f333c71291708 100644 --- a/substrate/primitives/storage/src/lib.rs +++ b/substrate/primitives/storage/src/lib.rs @@ -19,18 +19,19 @@ #![cfg_attr(not(feature = "std"), no_std)] -use core::fmt::Display; +extern crate alloc; #[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; use sp_debug_derive::RuntimeDebug; +use alloc::vec::Vec; use codec::{Decode, Encode}; -use ref_cast::RefCast; -use sp_std::{ +use core::{ + fmt::Display, ops::{Deref, DerefMut}, - vec::Vec, }; +use ref_cast::RefCast; /// Storage key. #[derive(PartialEq, Eq, RuntimeDebug)] @@ -49,9 +50,7 @@ impl AsRef<[u8]> for StorageKey { } /// Storage key with read/write tracking information. -#[derive( - PartialEq, Eq, Ord, PartialOrd, sp_std::hash::Hash, RuntimeDebug, Clone, Encode, Decode, -)] +#[derive(PartialEq, Eq, Ord, PartialOrd, core::hash::Hash, RuntimeDebug, Clone, Encode, Decode)] pub struct TrackedStorageKey { pub key: Vec, pub reads: u32, @@ -441,7 +440,7 @@ impl From for u8 { impl TryFrom for StateVersion { type Error = (); - fn try_from(val: u8) -> sp_std::result::Result { + fn try_from(val: u8) -> core::result::Result { match val { 0 => Ok(StateVersion::V0), 1 => Ok(StateVersion::V1), @@ -453,7 +452,7 @@ impl TryFrom for StateVersion { impl StateVersion { /// If defined, values in state of size bigger or equal /// to this threshold will use a separate trie node. - /// Otherwhise, value will be inlined in branch or leaf + /// Otherwise, value will be inlined in branch or leaf /// node. pub fn state_value_threshold(&self) -> Option { match self { diff --git a/substrate/primitives/test-primitives/Cargo.toml b/substrate/primitives/test-primitives/Cargo.toml index 3649217cf74e136f88860d0c69466d3de9ef5a06..0513555431561a4adb12f5e2b373859df1272af2 100644 --- a/substrate/primitives/test-primitives/Cargo.toml +++ b/substrate/primitives/test-primitives/Cargo.toml @@ -16,12 +16,11 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.195", default-features = false, features = ["derive"], optional = true } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +serde = { features = ["derive"], optional = true, workspace = true } sp-application-crypto = { path = "../application-crypto", default-features = false } sp-core = { path = "../core", default-features = false } sp-runtime = { path = "../runtime", default-features = false } -sp-std = { path = "../std", default-features = false } [features] default = ["std"] @@ -32,7 +31,6 @@ std = [ "sp-application-crypto/std", "sp-core/std", "sp-runtime/std", - "sp-std/std", ] # Serde support without relying on std features. diff --git a/substrate/primitives/test-primitives/src/lib.rs b/substrate/primitives/test-primitives/src/lib.rs index 82bdb6967b842914799493c6143a2287c85919e7..1e3b912eaf48911a3d9ca2ce6d93dec917482071 100644 --- a/substrate/primitives/test-primitives/src/lib.rs +++ b/substrate/primitives/test-primitives/src/lib.rs @@ -19,14 +19,16 @@ #![cfg_attr(not(feature = "std"), no_std)] +extern crate alloc; + use codec::{Decode, Encode}; pub use sp_application_crypto; use sp_application_crypto::sr25519; +use alloc::vec::Vec; pub use sp_core::{hash::H256, RuntimeDebug}; use sp_runtime::traits::{BlakeTwo256, Extrinsic as ExtrinsicT, Verify}; -use sp_std::vec::Vec; /// Extrinsic for test-runtime. #[derive(Clone, PartialEq, Eq, Encode, Decode, RuntimeDebug, scale_info::TypeInfo)] diff --git a/substrate/primitives/timestamp/Cargo.toml b/substrate/primitives/timestamp/Cargo.toml index 914c1e7865e972eb5f8acdba7d4cc9103ceb18f6..5a1d4fcc985c520eede135b59d8fe5311fd8feac 100644 --- a/substrate/primitives/timestamp/Cargo.toml +++ b/substrate/primitives/timestamp/Cargo.toml @@ -16,12 +16,11 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -async-trait = { version = "0.1.74", optional = true } +async-trait = { version = "0.1.79", optional = true } codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } -thiserror = { version = "1.0.48", optional = true } +thiserror = { optional = true, workspace = true } sp-inherents = { path = "../inherents", default-features = false } sp-runtime = { path = "../runtime", default-features = false } -sp-std = { path = "../std", default-features = false } [features] default = ["std"] @@ -30,6 +29,5 @@ std = [ "codec/std", "sp-inherents/std", "sp-runtime/std", - "sp-std/std", "thiserror", ] diff --git a/substrate/primitives/timestamp/src/lib.rs b/substrate/primitives/timestamp/src/lib.rs index d1bd2a3446e6b65ea2bf7a35942cae5f10f599be..a91ee16afe8e33a2ad2faa719db8c3a168540589 100644 --- a/substrate/primitives/timestamp/src/lib.rs +++ b/substrate/primitives/timestamp/src/lib.rs @@ -20,8 +20,8 @@ #![cfg_attr(not(feature = "std"), no_std)] use codec::{Decode, Encode}; +use core::time::Duration; use sp_inherents::{InherentData, InherentIdentifier, IsFatalError}; -use sp_std::time::Duration; /// The identifier for the `timestamp` inherent. pub const INHERENT_IDENTIFIER: InherentIdentifier = *b"timstap0"; @@ -69,7 +69,7 @@ impl Timestamp { } } -impl sp_std::ops::Deref for Timestamp { +impl core::ops::Deref for Timestamp { type Target = u64; fn deref(&self) -> &Self::Target { @@ -219,7 +219,7 @@ impl InherentDataProvider { } #[cfg(feature = "std")] -impl sp_std::ops::Deref for InherentDataProvider { +impl core::ops::Deref for InherentDataProvider { type Target = InherentType; fn deref(&self) -> &Self::Target { diff --git a/substrate/primitives/tracing/Cargo.toml b/substrate/primitives/tracing/Cargo.toml index 58b1e48c4622c3b2ddd97072a7e2c3524110e613..ce30302d4bb0a7166ceb820e72bdc1de0b31cbc3 100644 --- a/substrate/primitives/tracing/Cargo.toml +++ b/substrate/primitives/tracing/Cargo.toml @@ -21,13 +21,13 @@ features = ["with-tracing"] targets = ["wasm32-unknown-unknown", "x86_64-unknown-linux-gnu"] [dependencies] -sp-std = { path = "../std", default-features = false } codec = { version = "3.6.1", package = "parity-scale-codec", default-features = false, features = [ "derive", ] } tracing = { version = "0.1.29", default-features = false } tracing-core = { version = "0.1.32", default-features = false } -tracing-subscriber = { version = "0.2.25", optional = true, features = [ +tracing-subscriber = { workspace = true, optional = true, features = [ + "env-filter", "tracing-log", ] } @@ -36,7 +36,6 @@ default = ["std"] with-tracing = ["codec/derive", "codec/full"] std = [ "codec/std", - "sp-std/std", "tracing-core/std", "tracing-subscriber", "tracing/std", diff --git a/substrate/primitives/tracing/src/lib.rs b/substrate/primitives/tracing/src/lib.rs index cc65183684667b404d88a2b61ef6105f176b6336..34ed088aed0b9d648f429b6558846332cbed35e3 100644 --- a/substrate/primitives/tracing/src/lib.rs +++ b/substrate/primitives/tracing/src/lib.rs @@ -17,7 +17,7 @@ //! Substrate tracing primitives and macros. //! -//! To trace functions or invidual code in Substrate, this crate provides [`within_span`] +//! To trace functions or individual code in Substrate, this crate provides [`within_span`] //! and [`enter_span`]. See the individual docs for how to use these macros. //! //! Note that to allow traces from wasm execution environment there are @@ -37,6 +37,8 @@ #![cfg_attr(not(feature = "std"), no_std)] +extern crate alloc; + #[cfg(feature = "std")] use tracing; pub use tracing::{ @@ -68,7 +70,7 @@ pub use crate::types::{WASM_NAME_KEY, WASM_TARGET_KEY, WASM_TRACE_IDENTIFIER}; /// directly as they yield nothing without the feature present. Instead you should use /// `enter_span!` and `within_span!` – which would strip away even any parameter conversion /// you do within the span-definition (and thus optimise your performance). For your -/// convineience you directly specify the `Level` and name of the span or use the full +/// convenience you directly specify the `Level` and name of the span or use the full /// feature set of `span!`/`span_*!` on it: /// /// # Example @@ -96,7 +98,7 @@ pub use crate::types::{WASM_NAME_KEY, WASM_TARGET_KEY, WASM_TRACE_IDENTIFIER}; /// This project only provides the macros and facilities to manage tracing /// it doesn't implement the tracing subscriber or backend directly – that is /// up to the developer integrating it into a specific environment. In native -/// this can and must be done through the regular `tracing`-facitilies, please +/// this can and must be done through the regular `tracing`-facilities, please /// see their documentation for details. /// /// On the wasm-side we've adopted a similar approach of having a global @@ -137,7 +139,7 @@ pub fn init_for_tests() { /// Runs given code within a tracing span, measuring it's execution time. /// /// If tracing is not enabled, the code is still executed. Pass in level and name or -/// use any valid `sp_tracing::Span`followe by `;` and the code to execute, +/// use any valid `sp_tracing::Span`followed by `;` and the code to execute, /// /// # Example /// diff --git a/substrate/primitives/tracing/src/types.rs b/substrate/primitives/tracing/src/types.rs index 003787f310d8c73637189189e58297b2bc5345e4..46f38383d98063469b9f889ee1debabb34ad8f15 100644 --- a/substrate/primitives/tracing/src/types.rs +++ b/substrate/primitives/tracing/src/types.rs @@ -15,11 +15,11 @@ // See the License for the specific language governing permissions and // limitations under the License. +use alloc::{vec, vec::Vec}; use codec::{Decode, Encode}; -/// Types for wasm based tracing. Loosly inspired by `tracing-core` but +/// Types for wasm based tracing. Loosely inspired by `tracing-core` but /// optimised for the specific use case. use core::{fmt::Debug, format_args}; -use sp_std::{vec, vec::Vec, Writer}; /// The Tracing Level – the user can filter by this #[derive(Clone, Encode, Decode, Debug)] @@ -54,7 +54,7 @@ impl core::default::Default for WasmLevel { } } -/// A paramter value provided to the span/event +/// A parameter value provided to the span/event #[derive(Encode, Decode, Clone)] pub enum WasmValue { U8(u8), @@ -132,9 +132,9 @@ impl From for WasmValue { impl From> for WasmValue { fn from(inp: core::fmt::Arguments<'_>) -> WasmValue { - let mut buf = Writer::default(); + let mut buf = alloc::string::String::default(); core::fmt::write(&mut buf, inp).expect("Writing of arguments doesn't fail"); - WasmValue::Formatted(buf.into_inner()) + WasmValue::Formatted(buf.into_bytes()) } } @@ -180,9 +180,9 @@ impl From for WasmValue { } } -/// The name of a field provided as the argument name when contstructing an +/// The name of a field provided as the argument name when constructing an /// `event!` or `span!`. -/// Generally generated automaticaly via `stringify` from an `'static &str`. +/// Generally generated automatically via `stringify` from an `'static &str`. /// Likely print-able. #[derive(Encode, Decode, Clone)] pub struct WasmFieldName(Vec); @@ -320,7 +320,7 @@ impl tracing_core::field::Visit for WasmValuesSet { self.0.push((field.name().into(), Some(WasmValue::from(value)))) } } -/// Metadata provides generic information about the specifc location of the +/// Metadata provides generic information about the specific location of the /// `span!` or `event!` call on the wasm-side. #[derive(Encode, Decode, Clone)] pub struct WasmMetadata { diff --git a/substrate/primitives/transaction-pool/src/lib.rs b/substrate/primitives/transaction-pool/src/lib.rs index 431f429e29f9f12545375e799d753dd9c5864850..2ce735491b2c9e087147c01231c3feb59bcd743c 100644 --- a/substrate/primitives/transaction-pool/src/lib.rs +++ b/substrate/primitives/transaction-pool/src/lib.rs @@ -20,4 +20,6 @@ #![warn(missing_docs)] #![cfg_attr(not(feature = "std"), no_std)] +extern crate alloc; + pub mod runtime_api; diff --git a/substrate/primitives/transaction-storage-proof/Cargo.toml b/substrate/primitives/transaction-storage-proof/Cargo.toml index e2fb54dafdf1c97f5ebc0bb8662a213803f0901e..137a232fce73b9937158afba0059b05aefea10bc 100644 --- a/substrate/primitives/transaction-storage-proof/Cargo.toml +++ b/substrate/primitives/transaction-storage-proof/Cargo.toml @@ -16,13 +16,12 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -async-trait = { version = "0.1.74", optional = true } +async-trait = { version = "0.1.79", optional = true } codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } sp-core = { path = "../core", optional = true } sp-inherents = { path = "../inherents", default-features = false } sp-runtime = { path = "../runtime", default-features = false } -sp-std = { path = "../std", default-features = false } sp-trie = { path = "../trie", optional = true } [features] @@ -34,6 +33,5 @@ std = [ "sp-core/std", "sp-inherents/std", "sp-runtime/std", - "sp-std/std", "sp-trie/std", ] diff --git a/substrate/primitives/transaction-storage-proof/src/lib.rs b/substrate/primitives/transaction-storage-proof/src/lib.rs index 9d540ae68d163f3d9477c121ec616b7db1dd0c78..893b2e33bee6ca21bd900e485d482cb0acba3cc7 100644 --- a/substrate/primitives/transaction-storage-proof/src/lib.rs +++ b/substrate/primitives/transaction-storage-proof/src/lib.rs @@ -15,13 +15,16 @@ // See the License for the specific language governing permissions and // limitations under the License. -//! Storage proof primitives. Constains types and basic code to extract storage +//! Storage proof primitives. Contains types and basic code to extract storage //! proofs for indexed transactions. #![cfg_attr(not(feature = "std"), no_std)] -use sp_std::{prelude::*, result::Result}; +extern crate alloc; +use core::result::Result; + +use alloc::vec::Vec; use codec::{Decode, Encode}; use sp_inherents::{InherentData, InherentIdentifier, IsFatalError}; use sp_runtime::traits::{Block as BlockT, NumberFor}; diff --git a/substrate/primitives/trie/Cargo.toml b/substrate/primitives/trie/Cargo.toml index f871f462d363375ac85cbceb2c1687b0a5daacc6..6469a59e0d10b2f598dd423976136481688bea7d 100644 --- a/substrate/primitives/trie/Cargo.toml +++ b/substrate/primitives/trie/Cargo.toml @@ -29,20 +29,19 @@ memory-db = { version = "0.32.0", default-features = false } nohash-hasher = { version = "0.2.0", optional = true } parking_lot = { version = "0.12.1", optional = true } rand = { version = "0.8", optional = true } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -thiserror = { version = "1.0.48", optional = true } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +thiserror = { optional = true, workspace = true } tracing = { version = "0.1.29", optional = true } -trie-db = { version = "0.28.0", default-features = false } +trie-db = { version = "0.29.0", default-features = false } trie-root = { version = "0.18.0", default-features = false } sp-core = { path = "../core", default-features = false } -sp-std = { path = "../std", default-features = false } sp-externalities = { path = "../externalities", default-features = false } schnellru = { version = "0.2.1", optional = true } [dev-dependencies] array-bytes = "6.1" -criterion = "0.4.0" -trie-bench = "0.38.0" +criterion = "0.5.1" +trie-bench = "0.39.0" trie-standardmap = "0.16.0" sp-runtime = { path = "../runtime" } @@ -62,7 +61,6 @@ std = [ "sp-core/std", "sp-externalities/std", "sp-runtime/std", - "sp-std/std", "thiserror", "tracing", "trie-db/std", diff --git a/substrate/primitives/trie/src/cache/mod.rs b/substrate/primitives/trie/src/cache/mod.rs index 01f08a78adcf2fff3612b7dfe0aebc83b2b17658..32078169b50305ad08ecaf4b07679a792411dff0 100644 --- a/substrate/primitives/trie/src/cache/mod.rs +++ b/substrate/primitives/trie/src/cache/mod.rs @@ -323,7 +323,7 @@ type ValueAccessSet = /// /// This cache should be used per state instance created by the backend. One state instance is /// referring to the state of one block. It will cache all the accesses that are done to the state -/// which could not be fullfilled by the [`SharedTrieCache`]. These locally cached items are merged +/// which could not be fulfilled by the [`SharedTrieCache`]. These locally cached items are merged /// back to the shared trie cache when this instance is dropped. /// /// When using [`Self::as_trie_db_cache`] or [`Self::as_trie_db_mut_cache`], it will lock Mutexes. diff --git a/substrate/primitives/trie/src/error.rs b/substrate/primitives/trie/src/error.rs index 17be556d3489ab03856a66498ba69de165a1a191..e3986e50b08ef5e0565f09636bc4ab90489a551f 100644 --- a/substrate/primitives/trie/src/error.rs +++ b/substrate/primitives/trie/src/error.rs @@ -15,7 +15,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -use sp_std::{boxed::Box, vec::Vec}; +use alloc::{boxed::Box, vec::Vec}; /// Error type used for trie related errors. #[derive(Debug, PartialEq, Eq, Clone)] diff --git a/substrate/primitives/trie/src/lib.rs b/substrate/primitives/trie/src/lib.rs index fd1320b3fbcb1a6c0aa7c7ece504ec2da7c34c24..54f202eda0c9ac3d3991c094b3f406f8d78d4c4d 100644 --- a/substrate/primitives/trie/src/lib.rs +++ b/substrate/primitives/trie/src/lib.rs @@ -19,6 +19,8 @@ #![cfg_attr(not(feature = "std"), no_std)] +extern crate alloc; + #[cfg(feature = "std")] pub mod cache; mod error; @@ -33,6 +35,8 @@ mod trie_stream; #[cfg(feature = "std")] pub mod proof_size_extension; +use alloc::{borrow::Borrow, boxed::Box, vec, vec::Vec}; +use core::marker::PhantomData; /// Our `NodeCodec`-specific error. pub use error::Error; /// Various re-exports from the `hash-db` crate. @@ -42,7 +46,6 @@ use hash_db::{Hasher, Prefix}; pub use memory_db::{prefixed_key, HashKey, KeyFunction, PrefixedKey}; /// The Substrate format implementation of `NodeCodec`. pub use node_codec::NodeCodec; -use sp_std::{borrow::Borrow, boxed::Box, marker::PhantomData, vec::Vec}; pub use storage_proof::{CompactProof, StorageProof}; /// Trie codec reexport, mainly child trie support /// for trie compact proof. @@ -52,8 +55,10 @@ use trie_db::proof::{generate_proof, verify_proof}; pub use trie_db::{ nibble_ops, node::{NodePlan, ValuePlan}, + triedb::{TrieDBDoubleEndedIterator, TrieDBKeyDoubleEndedIterator}, CError, DBValue, Query, Recorder, Trie, TrieCache, TrieConfiguration, TrieDBIterator, - TrieDBKeyIterator, TrieDBRawIterator, TrieLayout, TrieMut, TrieRecorder, + TrieDBKeyIterator, TrieDBNodeDoubleEndedIterator, TrieDBRawIterator, TrieLayout, TrieMut, + TrieRecorder, }; pub use trie_db::{proof::VerifyError, MerkleValue}; /// The Substrate format implementation of `TrieStream`. @@ -323,7 +328,7 @@ pub fn read_trie_value( +pub fn read_trie_first_descendant_value( db: &DB, root: &TrieHash, key: &[u8], @@ -444,7 +449,7 @@ where /// Read the [`trie_db::MerkleValue`] of the node that is the closest descendant for /// the provided child key. -pub fn read_child_trie_first_descedant_value( +pub fn read_child_trie_first_descendant_value( keyspace: &[u8], db: &DB, root: &TrieHash, @@ -500,7 +505,7 @@ pub struct KeySpacedDBMut<'a, DB: ?Sized, H>(&'a mut DB, &'a [u8], PhantomData (Vec, Option) { - let mut result = sp_std::vec![0; ks.len() + prefix.0.len()]; + let mut result = vec![0; ks.len() + prefix.0.len()]; result[..ks.len()].copy_from_slice(ks); result[ks.len()..].copy_from_slice(prefix.0); (result, prefix.1) diff --git a/substrate/primitives/trie/src/node_codec.rs b/substrate/primitives/trie/src/node_codec.rs index 46acde77c0543af88e6f3d62cbfb460fe88c117a..78896988ec4c6027c201aafd05e8d45a47b84157 100644 --- a/substrate/primitives/trie/src/node_codec.rs +++ b/substrate/primitives/trie/src/node_codec.rs @@ -19,9 +19,10 @@ use super::node_header::{NodeHeader, NodeKind}; use crate::{error::Error, trie_constants}; +use alloc::{borrow::Borrow, vec::Vec}; use codec::{Compact, Decode, Encode, Input}; +use core::{marker::PhantomData, ops::Range}; use hash_db::Hasher; -use sp_std::{borrow::Borrow, marker::PhantomData, ops::Range, vec::Vec}; use trie_db::{ nibble_ops, node::{NibbleSlicePlan, NodeHandlePlan, NodePlan, Value, ValuePlan}, @@ -30,7 +31,7 @@ use trie_db::{ /// Helper struct for trie node decoder. This implements `codec::Input` on a byte slice, while /// tracking the absolute position. This is similar to `std::io::Cursor` but does not implement -/// `Read` and `io` is not in `sp-std`. +/// `Read` and `io` are not in `core` or `alloc`. struct ByteSliceInput<'a> { data: &'a [u8], offset: usize, diff --git a/substrate/primitives/trie/src/node_header.rs b/substrate/primitives/trie/src/node_header.rs index c118ee07b8cbd362b457d4b496861beec435d34d..dc33e6bd614928bef05c9c840b9708ca80f065f2 100644 --- a/substrate/primitives/trie/src/node_header.rs +++ b/substrate/primitives/trie/src/node_header.rs @@ -19,7 +19,7 @@ use crate::trie_constants; use codec::{Decode, Encode, Input, Output}; -use sp_std::iter::once; +use core::iter::once; /// A node header #[derive(Copy, Clone, PartialEq, Eq, sp_core::RuntimeDebug)] @@ -118,7 +118,7 @@ pub(crate) fn size_and_prefix_iterator( prefix_mask: usize, ) -> impl Iterator { let max_value = 255u8 >> prefix_mask; - let l1 = sp_std::cmp::min((max_value as usize).saturating_sub(1), size); + let l1 = core::cmp::min((max_value as usize).saturating_sub(1), size); let (first_byte, mut rem) = if size == l1 { (once(prefix + l1 as u8), 0) } else { @@ -138,7 +138,7 @@ pub(crate) fn size_and_prefix_iterator( None } }; - first_byte.chain(sp_std::iter::from_fn(next_bytes)) + first_byte.chain(core::iter::from_fn(next_bytes)) } /// Encodes size and prefix to a stream output. diff --git a/substrate/primitives/trie/src/storage_proof.rs b/substrate/primitives/trie/src/storage_proof.rs index 6c871d73b043a997820b9a5645e459d7739dfc48..e46c49be19cb84af46f63003abcdb56ca421d9d0 100644 --- a/substrate/primitives/trie/src/storage_proof.rs +++ b/substrate/primitives/trie/src/storage_proof.rs @@ -15,14 +15,12 @@ // See the License for the specific language governing permissions and // limitations under the License. +use alloc::{collections::btree_set::BTreeSet, vec::Vec}; use codec::{Decode, Encode}; +use core::iter::{DoubleEndedIterator, IntoIterator}; use hash_db::{HashDB, Hasher}; use scale_info::TypeInfo; -use sp_std::{ - collections::btree_set::BTreeSet, - iter::{DoubleEndedIterator, IntoIterator}, - vec::Vec, -}; + // Note that `LayoutV1` usage here (proof compaction) is compatible // with `LayoutV0`. use crate::LayoutV1 as Layout; diff --git a/substrate/primitives/trie/src/trie_codec.rs b/substrate/primitives/trie/src/trie_codec.rs index f29e009c4761e8503b57fde00bb2af6cb3b3330d..65b4f50535990222aa269eee44813eaae9d8b9b7 100644 --- a/substrate/primitives/trie/src/trie_codec.rs +++ b/substrate/primitives/trie/src/trie_codec.rs @@ -21,7 +21,7 @@ //! it to substrate specific layout and child trie system. use crate::{CompactProof, HashDBT, TrieConfiguration, TrieHash, EMPTY_PREFIX}; -use sp_std::{boxed::Box, vec::Vec}; +use alloc::{boxed::Box, vec::Vec}; use trie_db::{CError, Trie}; /// Error for trie node decoding. diff --git a/substrate/primitives/trie/src/trie_stream.rs b/substrate/primitives/trie/src/trie_stream.rs index f57b80f978ffb1484b2301fdb612cf6b805c4321..459b5895f207e927161820a984f92daca7e4cea5 100644 --- a/substrate/primitives/trie/src/trie_stream.rs +++ b/substrate/primitives/trie/src/trie_stream.rs @@ -21,9 +21,9 @@ use crate::{ node_header::{size_and_prefix_iterator, NodeKind}, trie_constants, }; +use alloc::vec::Vec; use codec::{Compact, Encode}; use hash_db::Hasher; -use sp_std::vec::Vec; use trie_root; /// Codec-flavored TrieStream. diff --git a/substrate/primitives/version/Cargo.toml b/substrate/primitives/version/Cargo.toml index 7de762d71e9948d8a36b93a21ef2acf7c3b459f8..d686b0c75512dac9931c46ffb41c4e4a11522718 100644 --- a/substrate/primitives/version/Cargo.toml +++ b/substrate/primitives/version/Cargo.toml @@ -20,9 +20,9 @@ targets = ["x86_64-unknown-linux-gnu"] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } impl-serde = { version = "0.4.0", default-features = false, optional = true } parity-wasm = { version = "0.45", optional = true } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.195", default-features = false, features = ["alloc", "derive"], optional = true } -thiserror = { version = "1.0.48", optional = true } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +serde = { features = ["alloc", "derive"], optional = true, workspace = true } +thiserror = { optional = true, workspace = true } sp-crypto-hashing-proc-macro = { path = "../crypto/hashing/proc-macro" } sp-runtime = { path = "../runtime", default-features = false } sp-std = { path = "../std", default-features = false } diff --git a/substrate/primitives/version/proc-macro/Cargo.toml b/substrate/primitives/version/proc-macro/Cargo.toml index 9e90940825d5f12b76ca2e46e0593da65f6d1036..f7abf88c9a67b7e3102d44254b520a9bbeb7a8a8 100644 --- a/substrate/primitives/version/proc-macro/Cargo.toml +++ b/substrate/primitives/version/proc-macro/Cargo.toml @@ -21,8 +21,8 @@ proc-macro = true [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", features = ["derive"] } proc-macro2 = "1.0.56" -quote = "1.0.28" -syn = { version = "2.0.48", features = ["extra-traits", "fold", "full", "visit"] } +quote = { workspace = true } +syn = { features = ["extra-traits", "fold", "full", "visit"], workspace = true } [dev-dependencies] sp-version = { path = ".." } diff --git a/substrate/primitives/version/proc-macro/src/decl_runtime_version.rs b/substrate/primitives/version/proc-macro/src/decl_runtime_version.rs index 7ca2d9b71f60a8059b4b3004ef3c089f3d110002..3671d4aff6bb0d14dd100427340f366b92b5b3a1 100644 --- a/substrate/primitives/version/proc-macro/src/decl_runtime_version.rs +++ b/substrate/primitives/version/proc-macro/src/decl_runtime_version.rs @@ -52,7 +52,7 @@ fn decl_runtime_version_impl_inner(item: ItemConst) -> Result { /// enable `std` feature even for `no_std` wasm runtime builds. /// /// One difference from the original definition is the `apis` field. Since we don't actually parse -/// `apis` from this macro it will always be emitteed as empty. An empty vector can be encoded as +/// `apis` from this macro it will always be emitted as empty. An empty vector can be encoded as /// a zero-byte, thus `u8` is sufficient here. #[derive(Encode)] struct RuntimeVersion { diff --git a/substrate/primitives/version/src/lib.rs b/substrate/primitives/version/src/lib.rs index 9b14a809ac100de9e7a0655fdd7d5e55d23fbc0e..789c507742f779983b478ccd8bc9ff87a87d7165 100644 --- a/substrate/primitives/version/src/lib.rs +++ b/substrate/primitives/version/src/lib.rs @@ -327,7 +327,7 @@ impl RuntimeVersion { /// /// For runtime with core api version less than 4, /// V0 trie version will be applied to state. - /// Otherwhise, V1 trie version will be use. + /// Otherwise, V1 trie version will be use. pub fn state_version(&self) -> StateVersion { // If version > than 1, keep using latest version. self.state_version.try_into().unwrap_or(StateVersion::V1) diff --git a/substrate/primitives/wasm-interface/Cargo.toml b/substrate/primitives/wasm-interface/Cargo.toml index ccd2a3043c5c9f319681ae9306c82ad0336f9a2b..15a20fab5e5d83aa4635a38c43738a3007847481 100644 --- a/substrate/primitives/wasm-interface/Cargo.toml +++ b/substrate/primitives/wasm-interface/Cargo.toml @@ -19,12 +19,11 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } impl-trait-for-tuples = "0.2.2" -log = { version = "0.4.17", optional = true } +log = { optional = true, workspace = true, default-features = true } wasmtime = { version = "8.0.1", default-features = false, optional = true } -anyhow = { version = "1.0.68", optional = true } -sp-std = { path = "../std", default-features = false } +anyhow = { version = "1.0.81", optional = true } [features] default = ["std"] -std = ["codec/std", "log/std", "sp-std/std", "wasmtime"] +std = ["codec/std", "log/std"] wasmtime = ["anyhow", "dep:wasmtime"] diff --git a/substrate/primitives/wasm-interface/src/lib.rs b/substrate/primitives/wasm-interface/src/lib.rs index 9d5d2bb358d57926bedd69ce5b38132df8761151..4fc78ca15535ba942cbd4eb4cd59697290ffac68 100644 --- a/substrate/primitives/wasm-interface/src/lib.rs +++ b/substrate/primitives/wasm-interface/src/lib.rs @@ -19,7 +19,10 @@ #![cfg_attr(not(feature = "std"), no_std)] -use sp_std::{borrow::Cow, iter::Iterator, marker::PhantomData, mem, result, vec, vec::Vec}; +extern crate alloc; + +use alloc::{borrow::Cow, vec, vec::Vec}; +use core::{iter::Iterator, marker::PhantomData, mem, result}; #[cfg(not(all(feature = "std", feature = "wasmtime")))] #[macro_export] @@ -76,7 +79,7 @@ impl From for u8 { impl TryFrom for ValueType { type Error = (); - fn try_from(val: u8) -> sp_std::result::Result { + fn try_from(val: u8) -> core::result::Result { match val { 0 => Ok(Self::I32), 1 => Ok(Self::I64), diff --git a/substrate/primitives/weights/Cargo.toml b/substrate/primitives/weights/Cargo.toml index 3a57720b964e4bffd9929547d3f519453ea0b8b7..e73d4a702b42e4ac5b0cd0a37f1c15eb70bec5e2 100644 --- a/substrate/primitives/weights/Cargo.toml +++ b/substrate/primitives/weights/Cargo.toml @@ -18,12 +18,11 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] bounded-collections = { version = "0.2.0", default-features = false } codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.195", default-features = false, optional = true, features = ["alloc", "derive"] } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } +serde = { optional = true, features = ["alloc", "derive"], workspace = true } smallvec = "1.11.0" sp-arithmetic = { path = "../arithmetic", default-features = false } sp-debug-derive = { path = "../debug-derive", default-features = false } -sp-std = { path = "../std", default-features = false } schemars = { version = "0.8.3", default-features = false, optional = true } [features] @@ -35,7 +34,6 @@ std = [ "serde/std", "sp-arithmetic/std", "sp-debug-derive/std", - "sp-std/std", ] # By default some types have documentation, `full-metadata-docs` allows to add documentation to # more types in the metadata. diff --git a/substrate/primitives/weights/src/lib.rs b/substrate/primitives/weights/src/lib.rs index ef431bddee265fab663efd1e5b039a1c3e78bdc4..b2c956266e2c3a346ca32c7b74ceb7f4c5cc2c0c 100644 --- a/substrate/primitives/weights/src/lib.rs +++ b/substrate/primitives/weights/src/lib.rs @@ -18,9 +18,6 @@ //! # Primitives for transaction weighting. #![cfg_attr(not(feature = "std"), no_std)] -// TODO remove once `OldWeight` is gone. I dont know why this is needed, maybe by one of the macros -// of `OldWeight`. -#![allow(deprecated)] extern crate self as sp_weights; @@ -28,7 +25,7 @@ mod weight_meter; mod weight_v2; use bounded_collections::Get; -use codec::{CompactAs, Decode, Encode, MaxEncodedLen}; +use codec::{Decode, Encode}; use scale_info::TypeInfo; #[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; @@ -52,28 +49,6 @@ pub mod constants { pub const WEIGHT_PROOF_SIZE_PER_KB: u64 = 1024; } -/// The old weight type. -/// -/// NOTE: This type exists purely for compatibility purposes! Use [`weight_v2::Weight`] in all other -/// cases. -#[derive( - Decode, - Encode, - CompactAs, - PartialEq, - Eq, - Clone, - Copy, - RuntimeDebug, - Default, - MaxEncodedLen, - TypeInfo, -)] -#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -#[cfg_attr(feature = "serde", serde(transparent))] -#[deprecated(note = "Will be removed soon; use `Weight` instead.")] -pub struct OldWeight(pub u64); - /// The weight of database operations that the runtime can invoke. /// /// NOTE: This is currently only measured in computational time, and will probably @@ -235,7 +210,7 @@ where } /// Implementor of `WeightToFee` that maps one unit of weight to one unit of fee. -pub struct IdentityFee(sp_std::marker::PhantomData); +pub struct IdentityFee(core::marker::PhantomData); impl WeightToFee for IdentityFee where @@ -249,7 +224,7 @@ where } /// Implementor of [`WeightToFee`] such that it maps any unit of weight to a fixed fee. -pub struct FixedFee(sp_std::marker::PhantomData); +pub struct FixedFee(core::marker::PhantomData); impl WeightToFee for FixedFee where @@ -275,7 +250,7 @@ pub type NoFee = FixedFee<0, T>; /// // Results in a multiplier of 10 for each unit of weight (or length) /// type LengthToFee = ConstantMultiplier::>; /// ``` -pub struct ConstantMultiplier(sp_std::marker::PhantomData<(T, M)>); +pub struct ConstantMultiplier(core::marker::PhantomData<(T, M)>); impl WeightToFee for ConstantMultiplier where diff --git a/substrate/primitives/weights/src/weight_meter.rs b/substrate/primitives/weights/src/weight_meter.rs index 584d22304c3ae33ece669bc69927a2568fb9b288..cfe8396ae6d67ed36d038f6afc2a7700c56b815a 100644 --- a/substrate/primitives/weights/src/weight_meter.rs +++ b/substrate/primitives/weights/src/weight_meter.rs @@ -118,13 +118,6 @@ impl WeightMeter { debug_assert!(self.consumed.all_lte(self.limit), "Weight counter overflow"); } - /// Consume the given weight after checking that it can be consumed and return `true`. Otherwise - /// do nothing and return `false`. - #[deprecated(note = "Use `try_consume` instead. Will be removed after December 2023.")] - pub fn check_accrue(&mut self, w: Weight) -> bool { - self.try_consume(w).is_ok() - } - /// Consume the given weight after checking that it can be consumed. /// /// Returns `Ok` if the weight can be consumed or otherwise an `Err`. @@ -139,16 +132,15 @@ impl WeightMeter { }) } - /// Check if the given weight can be consumed. - #[deprecated(note = "Use `can_consume` instead. Will be removed after December 2023.")] - pub fn can_accrue(&self, w: Weight) -> bool { - self.can_consume(w) - } - /// Check if the given weight can be consumed. pub fn can_consume(&self, w: Weight) -> bool { self.consumed.checked_add(&w).map_or(false, |t| t.all_lte(self.limit)) } + + /// Reclaim the given weight. + pub fn reclaim_proof_size(&mut self, s: u64) { + self.consumed.saturating_reduce(Weight::from_parts(0, s)); + } } #[cfg(test)] @@ -160,80 +152,80 @@ mod tests { fn weight_meter_remaining_works() { let mut meter = WeightMeter::with_limit(Weight::from_parts(10, 20)); - assert!(meter.check_accrue(Weight::from_parts(5, 0))); + assert_eq!(meter.try_consume(Weight::from_parts(5, 0)), Ok(())); assert_eq!(meter.consumed, Weight::from_parts(5, 0)); assert_eq!(meter.remaining(), Weight::from_parts(5, 20)); - assert!(meter.check_accrue(Weight::from_parts(2, 10))); + assert_eq!(meter.try_consume(Weight::from_parts(2, 10)), Ok(())); assert_eq!(meter.consumed, Weight::from_parts(7, 10)); assert_eq!(meter.remaining(), Weight::from_parts(3, 10)); - assert!(meter.check_accrue(Weight::from_parts(3, 10))); + assert_eq!(meter.try_consume(Weight::from_parts(3, 10)), Ok(())); assert_eq!(meter.consumed, Weight::from_parts(10, 20)); assert_eq!(meter.remaining(), Weight::from_parts(0, 0)); } #[test] - fn weight_meter_can_accrue_works() { + fn weight_meter_can_consume_works() { let meter = WeightMeter::with_limit(Weight::from_parts(1, 1)); - assert!(meter.can_accrue(Weight::from_parts(0, 0))); - assert!(meter.can_accrue(Weight::from_parts(1, 1))); - assert!(!meter.can_accrue(Weight::from_parts(0, 2))); - assert!(!meter.can_accrue(Weight::from_parts(2, 0))); - assert!(!meter.can_accrue(Weight::from_parts(2, 2))); + assert!(meter.can_consume(Weight::from_parts(0, 0))); + assert!(meter.can_consume(Weight::from_parts(1, 1))); + assert!(!meter.can_consume(Weight::from_parts(0, 2))); + assert!(!meter.can_consume(Weight::from_parts(2, 0))); + assert!(!meter.can_consume(Weight::from_parts(2, 2))); } #[test] - fn weight_meter_check_accrue_works() { + fn weight_meter_try_consume_works() { let mut meter = WeightMeter::with_limit(Weight::from_parts(2, 2)); - assert!(meter.check_accrue(Weight::from_parts(0, 0))); - assert!(meter.check_accrue(Weight::from_parts(1, 1))); - assert!(!meter.check_accrue(Weight::from_parts(0, 2))); - assert!(!meter.check_accrue(Weight::from_parts(2, 0))); - assert!(!meter.check_accrue(Weight::from_parts(2, 2))); - assert!(meter.check_accrue(Weight::from_parts(0, 1))); - assert!(meter.check_accrue(Weight::from_parts(1, 0))); + assert_eq!(meter.try_consume(Weight::from_parts(0, 0)), Ok(())); + assert_eq!(meter.try_consume(Weight::from_parts(1, 1)), Ok(())); + assert_eq!(meter.try_consume(Weight::from_parts(0, 2)), Err(())); + assert_eq!(meter.try_consume(Weight::from_parts(2, 0)), Err(())); + assert_eq!(meter.try_consume(Weight::from_parts(2, 2)), Err(())); + assert_eq!(meter.try_consume(Weight::from_parts(0, 1)), Ok(())); + assert_eq!(meter.try_consume(Weight::from_parts(1, 0)), Ok(())); } #[test] - fn weight_meter_check_and_can_accrue_works() { + fn weight_meter_check_and_can_consume_works() { let mut meter = WeightMeter::new(); - assert!(meter.can_accrue(Weight::from_parts(u64::MAX, 0))); - assert!(meter.check_accrue(Weight::from_parts(u64::MAX, 0))); + assert!(meter.can_consume(Weight::from_parts(u64::MAX, 0))); + assert_eq!(meter.try_consume(Weight::from_parts(u64::MAX, 0)), Ok(())); - assert!(meter.can_accrue(Weight::from_parts(0, u64::MAX))); - assert!(meter.check_accrue(Weight::from_parts(0, u64::MAX))); + assert!(meter.can_consume(Weight::from_parts(0, u64::MAX))); + assert_eq!(meter.try_consume(Weight::from_parts(0, u64::MAX)), Ok(())); - assert!(!meter.can_accrue(Weight::from_parts(0, 1))); - assert!(!meter.check_accrue(Weight::from_parts(0, 1))); + assert!(!meter.can_consume(Weight::from_parts(0, 1))); + assert_eq!(meter.try_consume(Weight::from_parts(0, 1)), Err(())); - assert!(!meter.can_accrue(Weight::from_parts(1, 0))); - assert!(!meter.check_accrue(Weight::from_parts(1, 0))); + assert!(!meter.can_consume(Weight::from_parts(1, 0))); + assert_eq!(meter.try_consume(Weight::from_parts(1, 0)), Err(())); - assert!(meter.can_accrue(Weight::zero())); - assert!(meter.check_accrue(Weight::zero())); + assert!(meter.can_consume(Weight::zero())); + assert_eq!(meter.try_consume(Weight::zero()), Ok(())); } #[test] fn consumed_ratio_works() { let mut meter = WeightMeter::with_limit(Weight::from_parts(10, 20)); - assert!(meter.check_accrue(Weight::from_parts(5, 0))); + assert_eq!(meter.try_consume(Weight::from_parts(5, 0)), Ok(())); assert_eq!(meter.consumed_ratio(), Perbill::from_percent(50)); - assert!(meter.check_accrue(Weight::from_parts(0, 12))); + assert_eq!(meter.try_consume(Weight::from_parts(0, 12)), Ok(())); assert_eq!(meter.consumed_ratio(), Perbill::from_percent(60)); - assert!(meter.check_accrue(Weight::from_parts(2, 0))); + assert_eq!(meter.try_consume(Weight::from_parts(2, 0)), Ok(())); assert_eq!(meter.consumed_ratio(), Perbill::from_percent(70)); - assert!(meter.check_accrue(Weight::from_parts(0, 4))); + assert_eq!(meter.try_consume(Weight::from_parts(0, 4)), Ok(())); assert_eq!(meter.consumed_ratio(), Perbill::from_percent(80)); - assert!(meter.check_accrue(Weight::from_parts(3, 0))); + assert_eq!(meter.try_consume(Weight::from_parts(3, 0)), Ok(())); assert_eq!(meter.consumed_ratio(), Perbill::from_percent(100)); - assert!(meter.check_accrue(Weight::from_parts(0, 4))); + assert_eq!(meter.try_consume(Weight::from_parts(0, 4)), Ok(())); assert_eq!(meter.consumed_ratio(), Perbill::from_percent(100)); } @@ -277,6 +269,21 @@ mod tests { assert_eq!(meter.consumed(), Weight::from_parts(5, 10)); } + #[test] + #[cfg(debug_assertions)] + fn reclaim_works() { + let mut meter = WeightMeter::with_limit(Weight::from_parts(5, 10)); + + meter.consume(Weight::from_parts(5, 10)); + assert_eq!(meter.consumed(), Weight::from_parts(5, 10)); + + meter.reclaim_proof_size(3); + assert_eq!(meter.consumed(), Weight::from_parts(5, 7)); + + meter.reclaim_proof_size(10); + assert_eq!(meter.consumed(), Weight::from_parts(5, 0)); + } + #[test] #[cfg(debug_assertions)] #[should_panic(expected = "Weight counter overflow")] diff --git a/substrate/scripts/ci/deny.toml b/substrate/scripts/ci/deny.toml index b1dbf773e31f5297f42da64795a0cb5388d986ef..2e1701f3c60da3d2bebbafdbf1290a8e37bac859 100644 --- a/substrate/scripts/ci/deny.toml +++ b/substrate/scripts/ci/deny.toml @@ -69,7 +69,6 @@ exceptions = [ { allow = ["GPL-3.0 WITH Classpath-exception-2.0"], name = "sc-keystore" }, { allow = ["GPL-3.0 WITH Classpath-exception-2.0"], name = "sc-mixnet" }, { allow = ["GPL-3.0 WITH Classpath-exception-2.0"], name = "sc-network" }, - { allow = ["GPL-3.0 WITH Classpath-exception-2.0"], name = "sc-network-bitswap" }, { allow = ["GPL-3.0 WITH Classpath-exception-2.0"], name = "sc-network-common" }, { allow = ["GPL-3.0 WITH Classpath-exception-2.0"], name = "sc-network-gossip" }, { allow = ["GPL-3.0 WITH Classpath-exception-2.0"], name = "sc-network-light" }, diff --git a/substrate/scripts/ci/node-template-release/Cargo.toml b/substrate/scripts/ci/node-template-release/Cargo.toml index a0b93184546288b1c326e1f2584545dc12a0c7d6..4327b6857433f40482b21a91e116479ba05da121 100644 --- a/substrate/scripts/ci/node-template-release/Cargo.toml +++ b/substrate/scripts/ci/node-template-release/Cargo.toml @@ -14,7 +14,7 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -clap = { version = "4.4.18", features = ["derive"] } +clap = { version = "4.5.3", features = ["derive"] } flate2 = "1.0" fs_extra = "1.3" glob = "0.3" diff --git a/substrate/scripts/ci/node-template-release/src/main.rs b/substrate/scripts/ci/node-template-release/src/main.rs index fc8089f3051fe14a7608bcfad1418069d3bfcff9..2bcda2944fc90e62ed947af54c7be680c1038f38 100644 --- a/substrate/scripts/ci/node-template-release/src/main.rs +++ b/substrate/scripts/ci/node-template-release/src/main.rs @@ -18,6 +18,7 @@ use std::{ collections::HashMap, + ffi::OsString, fs::{self, File, OpenOptions}, path::{Path, PathBuf}, process::Command, @@ -56,9 +57,24 @@ struct Options { } /// Copy the `node-template` to the given path. -fn copy_node_template(node_template: &Path, dest_path: &Path) { +fn copy_node_template(node_template: &Path, node_template_folder: &OsString, dest_path: &Path) { let options = CopyOptions::new(); dir::copy(node_template, dest_path, &options).expect("Copies node-template to tmp dir"); + + let dest_path = dest_path.join(node_template_folder); + + dir::get_dir_content(dest_path.join("env-setup")) + .expect("`env-setup` directory should exist") + .files + .iter() + .for_each(|f| { + fs::copy( + f, + dest_path.join(PathBuf::from(f).file_name().expect("File has a file name.")), + ) + .expect("Copying from `env-setup` directory works"); + }); + dir::remove(dest_path.join("env-setup")).expect("Deleting `env-setup works`"); } /// Find all `Cargo.toml` files in the given path. @@ -195,6 +211,9 @@ fn update_root_cargo_toml( commit_id: &str, ) { let mut workspace = Table::new(); + + workspace.insert("resolver", value("2")); + workspace.insert("members", value(Array::from_iter(members.iter()))); let mut workspace_dependencies = Table::new(); deps.values() @@ -216,6 +235,8 @@ fn update_root_cargo_toml( workspace.insert("package", Item::Table(package)); workspace.insert("dependencies", Item::Table(workspace_dependencies)); + + workspace.insert("lints", Item::Table(Table::new())); cargo_toml.insert("workspace", Item::Table(workspace)); let mut panic_unwind = Table::new(); @@ -294,7 +315,7 @@ fn main() { .file_name() .expect("Node template folder is last element of path") .to_owned(); - copy_node_template(&options.node_template, build_dir.path()); + copy_node_template(&options.node_template, &node_template_folder, build_dir.path()); // The path to the node-template in the build dir. let node_template_path = build_dir.path().join(node_template_folder); @@ -429,6 +450,7 @@ frame-system = { workspace = true } ); let expected_toml = r#"[workspace] +resolver = "2" members = ["node", "pallets/template", "runtime"] [workspace.package] @@ -438,6 +460,8 @@ edition = "2021" frame-system = { version = "4.0.0-dev", default-features = true, git = "https://github.com/paritytech/polkadot-sdk.git", rev = "commit_id" } sp-io = { version = "7.0.0", git = "https://github.com/paritytech/polkadot-sdk.git", rev = "commit_id" } +[workspace.lints] + [profile] [profile.release] diff --git a/substrate/scripts/run_all_benchmarks.sh b/substrate/scripts/run_all_benchmarks.sh index 83848100a7e5189f312411fb42eae7d4eb6a43c4..6dd7cede319f974a074d951d34ec3c970f02c32f 100755 --- a/substrate/scripts/run_all_benchmarks.sh +++ b/substrate/scripts/run_all_benchmarks.sh @@ -59,11 +59,12 @@ done if [ "$skip_build" != true ] then echo "[+] Compiling Substrate benchmarks..." - cargo build --profile=production --locked --features=runtime-benchmarks --bin substrate + cargo build --profile=production --locked --features=runtime-benchmarks --bin substrate-node fi # The executable to use. -SUBSTRATE=./target/production/substrate +# Parent directory because of the monorepo structure. +SUBSTRATE=../target/production/substrate-node # Manually exclude some pallets. EXCLUDED_PALLETS=( @@ -80,11 +81,7 @@ EXCLUDED_PALLETS=( # Load all pallet names in an array. ALL_PALLETS=($( - $SUBSTRATE benchmark pallet --list --chain=dev |\ - tail -n+2 |\ - cut -d',' -f1 |\ - sort |\ - uniq + $SUBSTRATE benchmark pallet --list=pallets --no-csv-header --chain=dev )) # Filter out the excluded pallets by concatenating the arrays and discarding duplicates. diff --git a/substrate/test-utils/Cargo.toml b/substrate/test-utils/Cargo.toml index af8b01cdef087396a36ccd2b5c14f9c9640443c4..56b1c038199a81fb84c03474f0d7c5bbf5ab2c67 100644 --- a/substrate/test-utils/Cargo.toml +++ b/substrate/test-utils/Cargo.toml @@ -16,7 +16,7 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -futures = "0.3.16" +futures = "0.3.30" tokio = { version = "1.22.0", features = ["macros", "time"] } [dev-dependencies] diff --git a/substrate/test-utils/client/Cargo.toml b/substrate/test-utils/client/Cargo.toml index 14f55f6454659efb6abf4d0eabf4f37dc53212c9..4e4e65314fc3d0d1b6af4f0645c81e2a25835c68 100644 --- a/substrate/test-utils/client/Cargo.toml +++ b/substrate/test-utils/client/Cargo.toml @@ -17,11 +17,11 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] array-bytes = "6.1" -async-trait = "0.1.74" +async-trait = "0.1.79" codec = { package = "parity-scale-codec", version = "3.6.1" } -futures = "0.3.21" -serde = "1.0.195" -serde_json = "1.0.111" +futures = "0.3.30" +serde = { workspace = true, default-features = true } +serde_json = { workspace = true, default-features = true } sc-client-api = { path = "../../client/api" } sc-client-db = { path = "../../client/db", default-features = false, features = [ "test-helpers", diff --git a/substrate/test-utils/client/src/lib.rs b/substrate/test-utils/client/src/lib.rs index e3f06e27563581b100f489072d939b02d99a3247..d283b24f286aed743ba613f095f2cd319caba263 100644 --- a/substrate/test-utils/client/src/lib.rs +++ b/substrate/test-utils/client/src/lib.rs @@ -72,6 +72,7 @@ pub struct TestClientBuilder, bad_blocks: BadBlocks, enable_offchain_indexing_api: bool, + enable_import_proof_recording: bool, no_genesis: bool, } @@ -120,6 +121,7 @@ impl bad_blocks: None, enable_offchain_indexing_api: false, no_genesis: false, + enable_import_proof_recording: false, } } @@ -165,6 +167,12 @@ impl self } + /// Enable proof recording on import. + pub fn enable_import_proof_recording(mut self) -> Self { + self.enable_import_proof_recording = true; + self + } + /// Disable writing genesis. pub fn set_no_genesis(mut self) -> Self { self.no_genesis = true; @@ -202,6 +210,7 @@ impl }; let client_config = ClientConfig { + enable_import_proof_recording: self.enable_import_proof_recording, offchain_indexing_api: self.enable_offchain_indexing_api, no_genesis: self.no_genesis, ..Default::default() diff --git a/substrate/test-utils/runtime/Cargo.toml b/substrate/test-utils/runtime/Cargo.toml index 589686c1229432acbbeac9885213a019531174a9..28c1b22f976b61e1ab287be5a2700a71be1de0f9 100644 --- a/substrate/test-utils/runtime/Cargo.toml +++ b/substrate/test-utils/runtime/Cargo.toml @@ -22,13 +22,12 @@ sp-consensus-babe = { path = "../../primitives/consensus/babe", default-features sp-genesis-builder = { path = "../../primitives/genesis-builder", default-features = false } sp-block-builder = { path = "../../primitives/block-builder", default-features = false } codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.11.1", default-features = false, features = ["derive"] } sp-inherents = { path = "../../primitives/inherents", default-features = false } -sp-keyring = { path = "../../primitives/keyring", optional = true } +sp-keyring = { path = "../../primitives/keyring", default-features = false } sp-offchain = { path = "../../primitives/offchain", default-features = false } -sp-core = { path = "../../primitives/core", default-features = false } +sp-core = { path = "../../primitives/core", default-features = false, features = ["serde"] } sp-crypto-hashing = { path = "../../primitives/crypto/hashing", default-features = false } -sp-std = { path = "../../primitives/std", default-features = false } sp-io = { path = "../../primitives/io", default-features = false } frame-support = { path = "../../frame/support", default-features = false } sp-version = { path = "../../primitives/version", default-features = false } @@ -44,17 +43,19 @@ pallet-timestamp = { path = "../../frame/timestamp", default-features = false } sp-consensus-grandpa = { path = "../../primitives/consensus/grandpa", default-features = false, features = ["serde"] } sp-trie = { path = "../../primitives/trie", default-features = false } sp-transaction-pool = { path = "../../primitives/transaction-pool", default-features = false } -trie-db = { version = "0.28.0", default-features = false } +trie-db = { version = "0.29.0", default-features = false } sc-service = { path = "../../client/service", default-features = false, features = ["test-helpers"], optional = true } sp-state-machine = { path = "../../primitives/state-machine", default-features = false } sp-externalities = { path = "../../primitives/externalities", default-features = false } # 3rd party array-bytes = { version = "6.1", optional = true } -log = { version = "0.4.17", default-features = false } +serde_json = { workspace = true, features = ["alloc"] } +log = { workspace = true } +hex-literal = { version = "0.4.1" } [dev-dependencies] -futures = "0.3.21" +futures = "0.3.30" sc-block-builder = { path = "../../client/block-builder" } sc-chain-spec = { path = "../../client/chain-spec" } sc-executor = { path = "../../client/executor" } @@ -62,8 +63,8 @@ sc-executor-common = { path = "../../client/executor/common" } sp-consensus = { path = "../../primitives/consensus/common" } substrate-test-runtime-client = { path = "client" } sp-tracing = { path = "../../primitives/tracing" } -serde = { version = "1.0.195", features = ["alloc", "derive"], default-features = false } -serde_json = { version = "1.0.111", default-features = false, features = ["alloc"] } +serde = { features = ["alloc", "derive"], workspace = true } +serde_json = { features = ["alloc"], workspace = true } [build-dependencies] substrate-wasm-builder = { path = "../../utils/wasm-builder", optional = true } @@ -99,12 +100,11 @@ std = [ "sp-genesis-builder/std", "sp-inherents/std", "sp-io/std", - "sp-keyring", + "sp-keyring/std", "sp-offchain/std", "sp-runtime/std", "sp-session/std", "sp-state-machine/std", - "sp-std/std", "sp-tracing/std", "sp-transaction-pool/std", "sp-trie/std", diff --git a/substrate/test-utils/runtime/client/Cargo.toml b/substrate/test-utils/runtime/client/Cargo.toml index cbb964f6785237ff45b58f6b702b9a3e4a3abbbe..5ca24fea33edab61162ea1e98a20bf8eb7e2b2cf 100644 --- a/substrate/test-utils/runtime/client/Cargo.toml +++ b/substrate/test-utils/runtime/client/Cargo.toml @@ -15,7 +15,7 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -futures = "0.3.21" +futures = "0.3.30" sc-block-builder = { path = "../../../client/block-builder" } sc-client-api = { path = "../../../client/api" } sc-consensus = { path = "../../../client/consensus/common" } diff --git a/substrate/test-utils/runtime/src/extrinsic.rs b/substrate/test-utils/runtime/src/extrinsic.rs index 05ffb7db5d5b95d6d6dbadf5f48da563c04a4c59..e355e5d099ad5a01c74512f79d722fdf968af02e 100644 --- a/substrate/test-utils/runtime/src/extrinsic.rs +++ b/substrate/test-utils/runtime/src/extrinsic.rs @@ -26,7 +26,6 @@ use frame_system::{CheckNonce, CheckWeight}; use sp_core::crypto::Pair as TraitPair; use sp_keyring::AccountKeyring; use sp_runtime::{transaction_validity::TransactionPriority, Perbill}; -use sp_std::prelude::*; /// Transfer used in test substrate pallet. Extrinsic is created and signed using this data. #[derive(Clone)] diff --git a/substrate/test-utils/runtime/src/genesismap.rs b/substrate/test-utils/runtime/src/genesismap.rs index 5ed9c8a645886f741611bc9fdc5d4eae01ae2704..9e972886b3771469284a7ee66e5f823623a75b07 100644 --- a/substrate/test-utils/runtime/src/genesismap.rs +++ b/substrate/test-utils/runtime/src/genesismap.rs @@ -124,7 +124,6 @@ impl GenesisStorageBuilder { .into_iter() .map(|x| (x.into(), 1)) .collect(), - epoch_config: Some(crate::TEST_RUNTIME_BABE_EPOCH_CONFIGURATION), ..Default::default() }, substrate_test: substrate_test_pallet::GenesisConfig { diff --git a/substrate/test-utils/runtime/src/lib.rs b/substrate/test-utils/runtime/src/lib.rs index 8bc6f72a82ec2d0690c24565e841931bada92f05..370aa0034fcd10db18007050c8b0701810655ada 100644 --- a/substrate/test-utils/runtime/src/lib.rs +++ b/substrate/test-utils/runtime/src/lib.rs @@ -19,17 +19,22 @@ #![cfg_attr(not(feature = "std"), no_std)] +extern crate alloc; + #[cfg(feature = "std")] pub mod extrinsic; #[cfg(feature = "std")] pub mod genesismap; pub mod substrate_test_pallet; +use alloc::boxed::Box; +#[cfg(not(feature = "std"))] +use alloc::{vec, vec::Vec}; use codec::{Decode, Encode}; use frame_support::{ construct_runtime, derive_impl, dispatch::DispatchClass, - genesis_builder_helper::{build_config, create_default_config}, + genesis_builder_helper::{build_state, get_preset}, parameter_types, traits::{ConstU32, ConstU64}, weights::{ @@ -42,9 +47,8 @@ use frame_system::{ CheckNonce, CheckWeight, }; use scale_info::TypeInfo; -use sp_std::prelude::*; -#[cfg(not(feature = "std"))] -use sp_std::vec; +use sp_application_crypto::Ss58Codec; +use sp_keyring::AccountKeyring; use sp_application_crypto::{ecdsa, ed25519, sr25519, RuntimeAppPublic}; use sp_core::{OpaqueMetadata, RuntimeDebug}; @@ -54,14 +58,16 @@ use sp_trie::{ }; use trie_db::{Trie, TrieMut}; +use serde_json::json; use sp_api::{decl_runtime_apis, impl_runtime_apis}; pub use sp_core::hash::H256; +use sp_genesis_builder::PresetId; use sp_inherents::{CheckInherentsResult, InherentData}; use sp_runtime::{ create_runtime_str, impl_opaque_keys, traits::{BlakeTwo256, Block as BlockT, DispatchInfoOf, NumberFor, Verify}, transaction_validity::{TransactionSource, TransactionValidity, TransactionValidityError}, - ApplyExtrinsicResult, Perbill, + ApplyExtrinsicResult, ExtrinsicInclusionMode, Perbill, }; #[cfg(any(feature = "std", test))] use sp_version::NativeVersion; @@ -90,7 +96,7 @@ pub mod wasm_binary_logging_disabled { #[cfg(feature = "std")] pub fn wasm_binary_unwrap() -> &'static [u8] { WASM_BINARY.expect( - "Development wasm binary is not available. Testing is only supported with the flag \ + "Development wasm binary is not available. Testing is only supported with the flag disabled.", ) } @@ -99,7 +105,7 @@ pub fn wasm_binary_unwrap() -> &'static [u8] { #[cfg(feature = "std")] pub fn wasm_binary_logging_disabled_unwrap() -> &'static [u8] { wasm_binary_logging_disabled::WASM_BINARY.expect( - "Development wasm binary is not available. Testing is only supported with the flag \ + "Development wasm binary is not available. Testing is only supported with the flag disabled.", ) } @@ -265,7 +271,7 @@ impl sp_runtime::traits::SignedExtension for CheckSubstrateCall { fn additional_signed( &self, - ) -> sp_std::result::Result { + ) -> core::result::Result { Ok(()) } @@ -342,7 +348,7 @@ parameter_types! { .build_or_panic(); } -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::pallet::Config for Runtime { type BaseCallFilter = frame_support::traits::Everything; type BlockWeights = RuntimeBlockWeights; @@ -440,7 +446,7 @@ fn code_using_trie() -> u64 { .to_vec(); let mut mdb = PrefixedMemoryDB::default(); - let mut root = sp_std::default::Default::default(); + let mut root = core::default::Default::default(); { let mut t = TrieDBMutBuilderV1::::new(&mut mdb, &mut root).build(); for (key, value) in &pairs { @@ -480,9 +486,9 @@ impl_runtime_apis! { Executive::execute_block(block); } - fn initialize_block(header: &::Header) { + fn initialize_block(header: &::Header) -> ExtrinsicInclusionMode { log::trace!(target: LOG_TARGET, "initialize_block: {header:#?}"); - Executive::initialize_block(header); + Executive::initialize_block(header) } } @@ -494,7 +500,7 @@ impl_runtime_apis! { fn metadata_at_version(_version: u32) -> Option { unimplemented!() } - fn metadata_versions() -> sp_std::vec::Vec { + fn metadata_versions() -> alloc::vec::Vec { unimplemented!() } } @@ -722,12 +728,42 @@ impl_runtime_apis! { } impl sp_genesis_builder::GenesisBuilder for Runtime { - fn create_default_config() -> Vec { - create_default_config::() + fn build_state(config: Vec) -> sp_genesis_builder::Result { + build_state::(config) + } + + fn get_preset(name: &Option) -> Option> { + get_preset::(name, |name| { + let patch = match name.try_into() { + Ok("staging") => { + let endowed_accounts: Vec = vec![ + AccountKeyring::Bob.public().into(), + AccountKeyring::Charlie.public().into(), + ]; + + json!({ + "balances": { + "balances": endowed_accounts.into_iter().map(|k| (k, 10 * currency::DOLLARS)).collect::>(), + }, + "substrateTest": { + "authorities": [ + AccountKeyring::Alice.public().to_ss58check(), + AccountKeyring::Ferdie.public().to_ss58check() + ], + } + }) + }, + Ok("foobar") => json!({"foo":"bar"}), + _ => return None, + }; + Some(serde_json::to_string(&patch) + .expect("serialization to json is expected to work. qed.") + .into_bytes()) + }) } - fn build_config(config: Vec) -> sp_genesis_builder::Result { - build_config::(config) + fn preset_names() -> Vec { + vec![PresetId::from("foobar"), PresetId::from("staging")] } } } @@ -833,7 +869,6 @@ fn test_witness(proof: StorageProof, root: crate::Hash) { pub mod storage_key_generator { use super::*; use sp_core::Pair; - use sp_keyring::AccountKeyring; /// Generate hex string without prefix pub(super) fn hex(x: T) -> String @@ -1023,7 +1058,6 @@ mod tests { use sp_api::{ApiExt, ProvideRuntimeApi}; use sp_consensus::BlockOrigin; use sp_core::{storage::well_known_keys::HEAP_PAGES, traits::CallContext}; - use sp_keyring::AccountKeyring; use sp_runtime::{ traits::{Hash as _, SignedExtension}, transaction_validity::{InvalidTransaction, ValidTransaction}, @@ -1174,7 +1208,7 @@ mod tests { fn check_substrate_check_signed_extension_works() { sp_tracing::try_init_simple(); new_test_ext().execute_with(|| { - let x = sp_keyring::AccountKeyring::Alice.into(); + let x = AccountKeyring::Alice.into(); let info = DispatchInfo::default(); let len = 0_usize; assert_eq!( @@ -1239,7 +1273,7 @@ mod tests { let default_minimal_json = r#"{"system":{},"babe":{"authorities":[],"epochConfig":{"c": [ 3, 10 ],"allowed_slots":"PrimaryAndSecondaryPlainSlots"}},"substrateTest":{"authorities":[]},"balances":{"balances":[]}}"#; let mut t = BasicExternalities::new_empty(); - executor_call(&mut t, "GenesisBuilder_build_config", &default_minimal_json.encode()) + executor_call(&mut t, "GenesisBuilder_build_state", &default_minimal_json.encode()) .unwrap(); let mut keys = t.into_storages().top.keys().cloned().map(hex).collect::>(); @@ -1287,21 +1321,60 @@ mod tests { fn default_config_as_json_works() { sp_tracing::try_init_simple(); let mut t = BasicExternalities::new_empty(); - let r = executor_call(&mut t, "GenesisBuilder_create_default_config", &vec![]).unwrap(); - let r = Vec::::decode(&mut &r[..]).unwrap(); + let r = executor_call(&mut t, "GenesisBuilder_get_preset", &None::<&PresetId>.encode()) + .unwrap(); + let r = Option::>::decode(&mut &r[..]) + .unwrap() + .expect("default config is there"); let json = String::from_utf8(r.into()).expect("returned value is json. qed."); - let expected = r#"{"system":{},"babe":{"authorities":[],"epochConfig":null},"substrateTest":{"authorities":[]},"balances":{"balances":[]}}"#; + let expected = r#"{"system":{},"babe":{"authorities":[],"epochConfig":{"c":[1,4],"allowed_slots":"PrimaryAndSecondaryVRFSlots"}},"substrateTest":{"authorities":[]},"balances":{"balances":[]}}"#; assert_eq!(expected.to_string(), json); } + #[test] + fn preset_names_listing_works() { + sp_tracing::try_init_simple(); + let mut t = BasicExternalities::new_empty(); + let r = executor_call(&mut t, "GenesisBuilder_preset_names", &vec![]).unwrap(); + let r = Vec::::decode(&mut &r[..]).unwrap(); + assert_eq!(r, vec![PresetId::from("foobar"), PresetId::from("staging"),]); + log::info!("r: {:#?}", r); + } + + #[test] + fn named_config_works() { + sp_tracing::try_init_simple(); + let f = |cfg_name: &str, expected: &str| { + let mut t = BasicExternalities::new_empty(); + let name = cfg_name.to_string(); + let r = executor_call( + &mut t, + "GenesisBuilder_get_preset", + &Some(name.as_bytes()).encode(), + ) + .unwrap(); + let r = Option::>::decode(&mut &r[..]).unwrap(); + let json = + String::from_utf8(r.unwrap().into()).expect("returned value is json. qed."); + log::info!("json: {:#?}", json); + assert_eq!(expected.to_string(), json); + }; + + f("foobar", r#"{"foo":"bar"}"#); + f( + "staging", + r#"{"balances":{"balances":[["5FHneW46xGXgs5mUiveU4sbTyGBzmstUspZC92UhjJM694ty",1000000000000000],["5FLSigC9HGRKVhB9FiEo4Y3koPsNmBmLJbpXg2mp1hXcS59Y",1000000000000000]]},"substrateTest":{"authorities":["5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY","5CiPPseXPECbkjWCa6MnjNokrgYjMqmKndv2rSnekmSK2DjL"]}}"#, + ); + } + #[test] fn build_config_from_json_works() { sp_tracing::try_init_simple(); let j = include_str!("../res/default_genesis_config.json"); let mut t = BasicExternalities::new_empty(); - let r = executor_call(&mut t, "GenesisBuilder_build_config", &j.encode()).unwrap(); + let r = executor_call(&mut t, "GenesisBuilder_build_state", &j.encode()).unwrap(); let r = BuildResult::decode(&mut &r[..]); assert!(r.is_ok()); @@ -1320,7 +1393,7 @@ mod tests { sp_tracing::try_init_simple(); let j = include_str!("../res/default_genesis_config_invalid.json"); let mut t = BasicExternalities::new_empty(); - let r = executor_call(&mut t, "GenesisBuilder_build_config", &j.encode()).unwrap(); + let r = executor_call(&mut t, "GenesisBuilder_build_state", &j.encode()).unwrap(); let r = BuildResult::decode(&mut &r[..]).unwrap(); log::info!("result: {:#?}", r); assert_eq!(r, Err( @@ -1335,7 +1408,7 @@ mod tests { sp_tracing::try_init_simple(); let j = include_str!("../res/default_genesis_config_invalid_2.json"); let mut t = BasicExternalities::new_empty(); - let r = executor_call(&mut t, "GenesisBuilder_build_config", &j.encode()).unwrap(); + let r = executor_call(&mut t, "GenesisBuilder_build_state", &j.encode()).unwrap(); let r = BuildResult::decode(&mut &r[..]).unwrap(); assert_eq!(r, Err( sp_runtime::RuntimeString::Owned( @@ -1350,7 +1423,7 @@ mod tests { let j = include_str!("../res/default_genesis_config_incomplete.json"); let mut t = BasicExternalities::new_empty(); - let r = executor_call(&mut t, "GenesisBuilder_build_config", &j.encode()).unwrap(); + let r = executor_call(&mut t, "GenesisBuilder_build_state", &j.encode()).unwrap(); let r = core::result::Result::<(), sp_runtime::RuntimeString>::decode(&mut &r[..]).unwrap(); assert_eq!( @@ -1385,8 +1458,11 @@ mod tests { sp_tracing::try_init_simple(); let mut t = BasicExternalities::new_empty(); - let r = executor_call(&mut t, "GenesisBuilder_create_default_config", &vec![]).unwrap(); - let r = Vec::::decode(&mut &r[..]).unwrap(); + let r = executor_call(&mut t, "GenesisBuilder_get_preset", &None::<&PresetId>.encode()) + .unwrap(); + let r = Option::>::decode(&mut &r[..]) + .unwrap() + .expect("default config is there"); let mut default_config: serde_json::Value = serde_json::from_slice(&r[..]).expect("returned value is json. qed."); @@ -1415,7 +1491,7 @@ mod tests { let mut t = BasicExternalities::new_empty(); executor_call( &mut t, - "GenesisBuilder_build_config", + "GenesisBuilder_build_state", &default_config.to_string().encode(), ) .unwrap(); @@ -1433,8 +1509,8 @@ mod tests { let authority_key_vec = Vec::::decode(&mut &value[..]).unwrap(); assert_eq!(authority_key_vec.len(), 2); - assert_eq!(authority_key_vec[0], sp_keyring::AccountKeyring::Ferdie.public()); - assert_eq!(authority_key_vec[1], sp_keyring::AccountKeyring::Alice.public()); + assert_eq!(authority_key_vec[0], AccountKeyring::Ferdie.public()); + assert_eq!(authority_key_vec[1], AccountKeyring::Alice.public()); //Babe|Authorities let value: Vec = get_from_storage( diff --git a/substrate/test-utils/runtime/src/substrate_test_pallet.rs b/substrate/test-utils/runtime/src/substrate_test_pallet.rs index ed1ad990472ba2053998f4d5ac4944ec91b4b7d7..8375a68c8ff2f8111c68ddb7e15c91ea7fcb314a 100644 --- a/substrate/test-utils/runtime/src/substrate_test_pallet.rs +++ b/substrate/test-utils/runtime/src/substrate_test_pallet.rs @@ -21,6 +21,7 @@ //! functioning runtime. Some calls are allowed to be submitted as unsigned extrinsics, however most //! of them requires signing. Refer to `pallet::Call` for further details. +use alloc::{vec, vec::Vec}; use frame_support::{pallet_prelude::*, storage}; use sp_core::sr25519::Public; use sp_runtime::{ @@ -29,7 +30,6 @@ use sp_runtime::{ InvalidTransaction, TransactionSource, TransactionValidity, ValidTransaction, }, }; -use sp_std::prelude::*; pub use self::pallet::*; @@ -59,7 +59,7 @@ pub mod pallet { pub struct GenesisConfig { pub authorities: Vec, #[serde(skip)] - pub _config: sp_std::marker::PhantomData, + pub _config: core::marker::PhantomData, } #[pallet::genesis_build] diff --git a/substrate/test-utils/runtime/transaction-pool/Cargo.toml b/substrate/test-utils/runtime/transaction-pool/Cargo.toml index b52a897438b6854a066a95e51ba49bd0eddd7f84..9b52706c739915690c7f734c399a3071b30a3630 100644 --- a/substrate/test-utils/runtime/transaction-pool/Cargo.toml +++ b/substrate/test-utils/runtime/transaction-pool/Cargo.toml @@ -16,9 +16,9 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1" } -futures = "0.3.21" +futures = "0.3.30" parking_lot = "0.12.1" -thiserror = "1.0" +thiserror = { workspace = true } sc-transaction-pool = { path = "../../../client/transaction-pool" } sc-transaction-pool-api = { path = "../../../client/transaction-pool/api" } sp-blockchain = { path = "../../../primitives/blockchain" } diff --git a/substrate/test-utils/runtime/transaction-pool/src/lib.rs b/substrate/test-utils/runtime/transaction-pool/src/lib.rs index 8c8345b06bd32e4efbe2f721ddebe2cc2f2f9c4e..5202e6e65154d62085a0656cc780cc39452e0ed9 100644 --- a/substrate/test-utils/runtime/transaction-pool/src/lib.rs +++ b/substrate/test-utils/runtime/transaction-pool/src/lib.rs @@ -81,6 +81,7 @@ pub struct ChainState { pub block_by_hash: HashMap, pub nonces: HashMap, pub invalid_hashes: HashSet, + pub priorities: HashMap, } /// Test Api for transaction pool. @@ -214,6 +215,22 @@ impl TestApi { self.chain.write().invalid_hashes.insert(Self::hash_and_length_inner(xts).0); } + /// Remove a transaction that was previously declared as invalid via `[Self::add_invalid]`. + /// + /// Next time transaction pool will try to validate this + /// extrinsic, api will succeed. + pub fn remove_invalid(&self, xts: &Extrinsic) { + self.chain.write().invalid_hashes.remove(&Self::hash_and_length_inner(xts).0); + } + + /// Set a transaction priority. + pub fn set_priority(&self, xts: &Extrinsic, priority: u64) { + self.chain + .write() + .priorities + .insert(Self::hash_and_length_inner(xts).0, priority); + } + /// Query validation requests received. pub fn validation_requests(&self) -> Vec { self.validation_requests.read().clone() @@ -300,8 +317,14 @@ impl ChainApi for TestApi { return ready(Ok(Err(TransactionValidityError::Invalid(InvalidTransaction::Custom(0))))) } - let mut validity = - ValidTransaction { priority: 1, requires, provides, longevity: 64, propagate: true }; + let priority = self.chain.read().priorities.get(&self.hash_and_length(&uxt).0).cloned(); + let mut validity = ValidTransaction { + priority: priority.unwrap_or(1), + requires, + provides, + longevity: 64, + propagate: true, + }; (self.valid_modifier.read())(&mut validity); diff --git a/substrate/utils/binary-merkle-tree/Cargo.toml b/substrate/utils/binary-merkle-tree/Cargo.toml index b0b870823fbf42b1dc3790978f460c66dac1e8f5..a89006d94dc199951ffd5381ff7f51446a21acd6 100644 --- a/substrate/utils/binary-merkle-tree/Cargo.toml +++ b/substrate/utils/binary-merkle-tree/Cargo.toml @@ -13,12 +13,12 @@ workspace = true [dependencies] array-bytes = { version = "6.1", optional = true } -log = { version = "0.4", default-features = false, optional = true } +log = { optional = true, workspace = true } hash-db = { version = "0.16.0", default-features = false } [dev-dependencies] array-bytes = "6.1" -env_logger = "0.9" +env_logger = "0.11" sp-core = { path = "../../primitives/core" } sp-runtime = { path = "../../primitives/runtime" } diff --git a/substrate/utils/fork-tree/src/lib.rs b/substrate/utils/fork-tree/src/lib.rs index cd175166b9cdf4129b4718592dc2277b8c78103f..ff86467c85d5445a66b3d86cc04f83fcf5a110c7 100644 --- a/substrate/utils/fork-tree/src/lib.rs +++ b/substrate/utils/fork-tree/src/lib.rs @@ -683,7 +683,7 @@ where node.data }); - // Retain only roots that are descendents of the finalized block (this + // Retain only roots that are descendants of the finalized block (this // happens if the node has been properly finalized) or that are // ancestors (or equal) to the finalized block (in this case the node // wasn't finalized earlier presumably because the predicate didn't @@ -1168,7 +1168,7 @@ mod test { Ok(Some(false)), ); - // finalizing "E" is not allowed since there are not finalized anchestors. + // finalizing "E" is not allowed since there are not finalized ancestors. assert_eq!( tree.finalizes_any_with_descendent_if(&"E", 15, &is_descendent_of, |c| c.effective == 10), @@ -1309,7 +1309,7 @@ mod test { fn map_works() { let (mut tree, _) = test_fork_tree(); - // Extend the single root fork-tree to also excercise the roots order during map. + // Extend the single root fork-tree to also exercise the roots order during map. let is_descendent_of = |_: &&str, _: &&str| -> Result { Ok(false) }; let is_root = tree.import("A1", 10, 1, &is_descendent_of).unwrap(); assert!(is_root); diff --git a/substrate/utils/frame/benchmarking-cli/Cargo.toml b/substrate/utils/frame/benchmarking-cli/Cargo.toml index e4daecb00f6a9172d8f6cb09a5ae5a1134900249..55c271ce3a818d27a99dc8c57afa00f6f8765bae 100644 --- a/substrate/utils/frame/benchmarking-cli/Cargo.toml +++ b/substrate/utils/frame/benchmarking-cli/Cargo.toml @@ -18,26 +18,27 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] array-bytes = "6.1" chrono = "0.4" -clap = { version = "4.4.18", features = ["derive"] } +clap = { version = "4.5.3", features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.6.1" } comfy-table = { version = "7.1.0", default-features = false } color-print = "0.3.4" -handlebars = "4.2.2" +handlebars = "5.1.0" Inflector = "0.11.4" itertools = "0.10.3" lazy_static = "1.4.0" linked-hash-map = "0.5.4" -log = "0.4.17" +log = { workspace = true, default-features = true } rand = { version = "0.8.5", features = ["small_rng"] } rand_pcg = "0.3.1" -serde = "1.0.195" -serde_json = "1.0.111" -thiserror = "1.0.48" +serde = { workspace = true, default-features = true } +serde_json = { workspace = true, default-features = true } +thiserror = { workspace = true } thousands = "0.2.0" frame-benchmarking = { path = "../../../frame/benchmarking" } frame-support = { path = "../../../frame/support" } frame-system = { path = "../../../frame/system" } sc-block-builder = { path = "../../../client/block-builder" } +sc-chain-spec = { path = "../../../client/chain-spec", default-features = false } sc-cli = { path = "../../../client/cli", default-features = false } sc-client-api = { path = "../../../client/api" } sc-client-db = { path = "../../../client/db", default-features = false } @@ -49,6 +50,7 @@ sp-blockchain = { path = "../../../primitives/blockchain" } sp-core = { path = "../../../primitives/core" } sp-database = { path = "../../../primitives/database" } sp-externalities = { path = "../../../primitives/externalities" } +sp-genesis-builder = { path = "../../../primitives/genesis-builder" } sp-inherents = { path = "../../../primitives/inherents" } sp-keystore = { path = "../../../primitives/keystore" } sp-runtime = { path = "../../../primitives/runtime" } diff --git a/substrate/utils/frame/benchmarking-cli/README.md b/substrate/utils/frame/benchmarking-cli/README.md index 27673ea9580d7a24bb9af4a538dda77ebf6a1ccc..5deb5098b5bf22aad8935aa5ab44887e4694267e 100644 --- a/substrate/utils/frame/benchmarking-cli/README.md +++ b/substrate/utils/frame/benchmarking-cli/README.md @@ -1,13 +1,23 @@ -# The Benchmarking CLI +# The FRAME Benchmarking CLI -This crate contains commands to benchmark various aspects of Substrate and the hardware. -All commands are exposed by the Substrate node but can be exposed by any Substrate client. +This crate contains commands to benchmark various aspects of Substrate and the hardware. The goal is to have a comprehensive suite of benchmarks that cover all aspects of Substrate and the hardware that its -running on. +running on. +There exist fundamentally two ways to use this crate. A node-integrated CLI version, and a freestanding CLI. If you are +only interested in pallet benchmarking, then skip ahead to the [Freestanding CLI](#freestanding-cli). + +# Node Integrated CLI + +Mostly all Substrate nodes will expose some commands for benchmarking. You can refer to the `staging-node-cli` crate as +an example on how to integrate those. Note that for solely benchmarking pallets, the freestanding CLI is more suitable. + +## Usage + +Here we invoke the root command on the `staging-node-cli`. Most Substrate nodes should have a similar output, depending +on their integration of these commands. -Invoking the root benchmark command prints a help menu: ```sh -$ cargo run --profile=production -- benchmark +$ cargo run -p staging-node-cli --profile=production --features=runtime-benchmarks -- benchmark Sub-commands concerned with benchmarking. @@ -31,7 +41,46 @@ use `--release`. For the final results the `production` profile and reference hardware should be used, otherwise the results are not comparable. -The sub-commands are explained in depth here: +# Freestanding CLI + +The freestanding is a standalone CLI that does not rely on any node integration. It can be used to benchmark pallets of +any FRAME runtime that does not utilize 3rd party host functions. +It currently only supports pallet benchmarking, since the other commands still rely on a node. + +## Installation + +Installing from local source repository: + +```sh +cargo install --locked --path substrate/utils/frame/omni-bencher --profile=production +``` + +## Usage + +The exposed pallet sub-command is identical as the node-integrated CLI. The only difference is that it needs to be prefixed +with a `v1` to ensure drop-in compatibility. + +First we need to ensure that there is a runtime available. As example we will build the Westend runtime: + +```sh +cargo build -p westend-runtime --profile production --features runtime-benchmarks +``` + +Now the benchmarking can be started with: + +```sh +frame-omni-bencher v1 \ + benchmark pallet \ + --runtime target/release/wbuild/westend-runtime/westend-runtime.compact.compressed.wasm \ + --pallet "pallet_balances" --extrinsic "" +``` + +For the exact arguments of the `pallet` command, please refer to the [pallet] sub-module. + +# Commands + +The sub-commands of both CLIs have the same semantics and are documented in their respective sub-modules: + - [block] Compare the weight of a historic block to its actual resource usage - [machine] Gauges the speed of the hardware - [overhead] Creates weight files for the *Block*- and *Extrinsic*-base weights diff --git a/substrate/utils/frame/benchmarking-cli/src/pallet/command.rs b/substrate/utils/frame/benchmarking-cli/src/pallet/command.rs index 943449fe396c3e4bfe03f6b53885df9c0f0c7a16..3af884d91dcb80cb98f190b80da19c94e4bfae02 100644 --- a/substrate/utils/frame/benchmarking-cli/src/pallet/command.rs +++ b/substrate/utils/frame/benchmarking-cli/src/pallet/command.rs @@ -15,7 +15,11 @@ // See the License for the specific language governing permissions and // limitations under the License. -use super::{writer, PalletCmd}; +use super::{ + types::{ComponentRange, ComponentRangeMap}, + writer, ListOutput, PalletCmd, +}; +use crate::pallet::{types::FetchedCode, GenesisBuilder}; use codec::{Decode, Encode}; use frame_benchmarking::{ Analysis, AnalysisChoice, BenchmarkBatch, BenchmarkBatchSplitResults, BenchmarkList, @@ -26,7 +30,8 @@ use frame_support::{ weights::{RuntimeDbWeight, Weight}, }; use linked_hash_map::LinkedHashMap; -use sc_cli::{execution_method_from_cli, CliConfiguration, Result, SharedParams}; +use sc_chain_spec::json_patch::merge as json_merge; +use sc_cli::{execution_method_from_cli, ChainSpec, CliConfiguration, Result, SharedParams}; use sc_client_db::BenchmarkingState; use sc_executor::{HeapAllocStrategy, RuntimeVersion, WasmExecutor, DEFAULT_HEAP_ALLOC_STRATEGY}; use sc_service::Configuration; @@ -37,16 +42,22 @@ use sp_core::{ testing::{TestOffchainExt, TestTransactionPoolExt}, OffchainDbExt, OffchainWorkerExt, TransactionPoolExt, }, - traits::{CallContext, ReadRuntimeVersionExt}, + traits::{CallContext, CodeExecutor, ReadRuntimeVersionExt, WrappedRuntimeCode}, }; use sp_externalities::Extensions; +use sp_genesis_builder::{PresetId, Result as GenesisBuildResult}; use sp_keystore::{testing::MemoryKeystore, KeystoreExt}; -use sp_runtime::traits::{Block as BlockT, Header as HeaderT}; -use sp_state_machine::StateMachine; -use std::{collections::HashMap, fmt::Debug, fs, str::FromStr, time}; - -/// Logging target -const LOG_TARGET: &'static str = "frame::benchmark::pallet"; +use sp_runtime::traits::Hash; +use sp_state_machine::{OverlayedChanges, StateMachine}; +use sp_wasm_interface::HostFunctions; +use std::{ + borrow::Cow, + collections::{BTreeMap, BTreeSet, HashMap}, + fmt::Debug, + fs, + str::FromStr, + time, +}; /// The inclusive range of a component. #[derive(Serialize, Debug, Clone, Eq, PartialEq)] @@ -58,6 +69,7 @@ pub(crate) struct ComponentRange { /// Maximal valid value of the component. pub(crate) max: u32, } +const LOG_TARGET: &'static str = "polkadot_sdk_frame::benchmark::pallet"; /// How the PoV size of a storage item should be estimated. #[derive(clap::ValueEnum, Debug, Eq, PartialEq, Clone, Copy)] @@ -85,7 +97,15 @@ impl FromStr for PovEstimationMode { /// Maps (pallet, benchmark) -> ((pallet, storage) -> PovEstimationMode) pub(crate) type PovModesMap = - HashMap<(Vec, Vec), HashMap<(String, String), PovEstimationMode>>; + HashMap<(String, String), HashMap<(String, String), PovEstimationMode>>; + +#[derive(Debug, Clone)] +struct SelectedBenchmark { + pallet: String, + extrinsic: String, + components: Vec<(BenchmarkParameter, u32, u32)>, + pov_modes: Vec<(String, String)>, +} // This takes multiple benchmark batches and combines all the results where the pallet, instance, // and benchmark are the same. @@ -143,57 +163,80 @@ This could mean that you either did not build the node correctly with the \ `--features runtime-benchmarks` flag, or the chain spec that you are using was \ not created by a node that was compiled with the flag"; +/// When the runtime could not build the genesis storage. +const ERROR_CANNOT_BUILD_GENESIS: &str = "The runtime returned \ +an error when trying to build the genesis storage. Please ensure that all pallets \ +define a genesis config that can be built. This can be tested with: \ +https://github.com/paritytech/polkadot-sdk/pull/3412"; + +/// Warn when using the chain spec to generate the genesis state. +const WARN_SPEC_GENESIS_CTOR: &'static str = "Using the chain spec instead of the runtime to \ +generate the genesis state is deprecated. Please remove the `--chain`/`--dev`/`--local` argument, \ +point `--runtime` to your runtime blob and set `--genesis-builder=runtime`. This warning may \ +become a hard error any time after December 2024."; + /// Could not query `RuntimeVersion`, which is required const ERROR_RUNTIME_VERSION_NOT_FOUND: &'static str = "Could not query the runtime version. \ This should never happen, please report this issue."; +/// The preset that we expect to find in the GenesisBuilder runtime API. +const GENESIS_PRESET: &str = "development"; + impl PalletCmd { - /// Runs the command and benchmarks the chain. - pub fn run(&self, config: Configuration) -> Result<()> + /// Runs the command and benchmarks a pallet. + #[deprecated( + note = "`run` will be removed after December 2024. Use `run_with_spec` instead or \ + completely remove the code and use the `frame-benchmarking-cli` instead (see \ + https://github.com/paritytech/polkadot-sdk/pull/3512)." + )] + pub fn run(&self, config: sc_service::Configuration) -> Result<()> where - BB: BlockT + Debug, - <<::Header as HeaderT>::Number as std::str::FromStr>::Err: std::fmt::Debug, - ExtraHostFunctions: sp_wasm_interface::HostFunctions, + Hasher: Hash, + ExtraHostFunctions: HostFunctions, { + self.run_with_spec::(Some(config.chain_spec)) + } + + /// Runs the pallet benchmarking command. + pub fn run_with_spec( + &self, + chain_spec: Option>, + ) -> Result<()> + where + Hasher: Hash, + ExtraHostFunctions: HostFunctions, + { + self.check_args()?; let _d = self.execution.as_ref().map(|exec| { - // We print the warning at the end, since there is often A LOT of output. + // We print the error at the end, since there is often A LOT of output. sp_core::defer::DeferGuard::new(move || { - log::warn!( + log::error!( target: LOG_TARGET, "⚠️ Argument `--execution` is deprecated. Its value of `{exec}` has on effect.", ) }) }); - if let Some(output_path) = &self.output { - if !output_path.is_dir() && output_path.file_name().is_none() { - return Err("Output file or path is invalid!".into()) - } - } - - if let Some(header_file) = &self.header { - if !header_file.is_file() { - return Err("Header file is invalid!".into()) + if let Some(json_input) = &self.json_input { + let raw_data = match std::fs::read(json_input) { + Ok(raw_data) => raw_data, + Err(error) => + return Err(format!("Failed to read {:?}: {}", json_input, error).into()), }; - } - - if let Some(handlebars_template_file) = &self.template { - if !handlebars_template_file.is_file() { - return Err("Handlebars template file is invalid!".into()) + let batches: Vec = match serde_json::from_slice(&raw_data) { + Ok(batches) => batches, + Err(error) => + return Err(format!("Failed to deserialize {:?}: {}", json_input, error).into()), }; + return self.output_from_results(&batches) } - let spec = config.chain_spec; - let pallet = self.pallet.clone().unwrap_or_default(); - let pallet = pallet.as_bytes(); - let extrinsic = self.extrinsic.clone().unwrap_or_default(); - let extrinsic_split: Vec<&str> = extrinsic.split(',').collect(); - let extrinsics: Vec<_> = extrinsic_split.iter().map(|x| x.trim().as_bytes()).collect(); + let (genesis_storage, genesis_changes) = + self.genesis_storage::(&chain_spec)?; + let mut changes = genesis_changes.clone(); - let genesis_storage = spec.build_storage()?; - let mut changes = Default::default(); let cache_size = Some(self.database_cache_size as usize); - let state_with_tracking = BenchmarkingState::::new( + let state_with_tracking = BenchmarkingState::::new( genesis_storage.clone(), cache_size, // Record proof size @@ -201,7 +244,7 @@ impl PalletCmd { // Enable storage tracking true, )?; - let state_without_tracking = BenchmarkingState::::new( + let state_without_tracking = BenchmarkingState::::new( genesis_storage, cache_size, // Do not record proof size @@ -213,11 +256,10 @@ impl PalletCmd { let method = execution_method_from_cli(self.wasm_method, self.wasmtime_instantiation_strategy); - let heap_pages = - self.heap_pages - .map_or(DEFAULT_HEAP_ALLOC_STRATEGY, |p| HeapAllocStrategy::Static { - extra_pages: p as _, - }); + let state = &state_without_tracking; + let runtime = self.runtime_blob(&state_without_tracking)?; + let runtime_code = runtime.code()?; + let alloc_strategy = Self::alloc_strategy(runtime_code.heap_pages); let executor = WasmExecutor::<( sp_io::SubstrateHostFunctions, @@ -225,40 +267,28 @@ impl PalletCmd { ExtraHostFunctions, )>::builder() .with_execution_method(method) - .with_onchain_heap_alloc_strategy(heap_pages) - .with_offchain_heap_alloc_strategy(heap_pages) + .with_allow_missing_host_functions(self.allow_missing_host_functions) + .with_onchain_heap_alloc_strategy(alloc_strategy) + .with_offchain_heap_alloc_strategy(alloc_strategy) .with_max_runtime_instances(2) .with_runtime_cache_size(2) .build(); - let extensions = || -> Extensions { - let mut extensions = Extensions::default(); - let (offchain, _) = TestOffchainExt::new(); - let (pool, _) = TestTransactionPoolExt::new(); - let keystore = MemoryKeystore::new(); - extensions.register(KeystoreExt::new(keystore)); - extensions.register(OffchainWorkerExt::new(offchain.clone())); - extensions.register(OffchainDbExt::new(offchain)); - extensions.register(TransactionPoolExt::new(pool)); - extensions.register(ReadRuntimeVersionExt::new(executor.clone())); - extensions - }; - let state = &state_without_tracking; - // Get runtime version - let runtime_version_raw = StateMachine::new( - state, - &mut changes, - &executor, - "Core_version", - &[], - &mut extensions(), - &sp_state_machine::backend::BackendRuntimeCode::new(state).runtime_code()?, - CallContext::Offchain, - ) - .execute() - .map_err(|e| format!("{}: {}", ERROR_RUNTIME_VERSION_NOT_FOUND, e))?; + let runtime_version_raw = Self::exec_state_machine( + StateMachine::new( + state, + &mut changes, + &executor, + "Core_version", + &(self.extra).encode(), + &mut Self::build_extensions(executor.clone()), + &runtime_code, + CallContext::Offchain, + ), + ERROR_RUNTIME_VERSION_NOT_FOUND, + )?; let runtime_version = ::decode(&mut &runtime_version_raw[..]) .map_err(|e| format!("Failed to decode runtime version: {:?}", e))?; @@ -271,27 +301,30 @@ impl PalletCmd { .ok_or("Benchmark API not found in runtime version apis")?; // Get Benchmark List - let result = StateMachine::new( - state, - &mut changes, - &executor, - "Benchmark_benchmark_metadata", - &(self.extra).encode(), - &mut extensions(), - &sp_state_machine::backend::BackendRuntimeCode::new(state).runtime_code()?, - CallContext::Offchain, - ) - .execute() - .map_err(|e| format!("{}: {}", ERROR_METADATA_NOT_FOUND, e))?; + let benchmarks_metadata = Self::exec_state_machine( + StateMachine::new( + state, + &mut changes, + &executor, + "Benchmark_benchmark_metadata", + &(self.extra).encode(), + &mut Self::build_extensions(executor.clone()), + &runtime_code, + CallContext::Offchain, + ), + ERROR_METADATA_NOT_FOUND, + )?; let RuntimeBenchmarkInfo { list, storage_info, max_extrinsic_weight, db_weight } = { - if *version == 2 { - ::decode(&mut &result[..]) - .map_err(|e| format!("Failed to decode benchmark metadata: {:?}", e))? + if *version == 1 { + <(Vec, Vec) as Decode>::decode( + &mut &benchmarks_metadata[..], + ) + .map_err(|e| format!("Failed to decode benchmark metadata: {:?}", e))? + .into() } else { - <(Vec, Vec) as Decode>::decode(&mut &result[..]) + ::decode(&mut &benchmarks_metadata[..]) .map_err(|e| format!("Failed to decode benchmark metadata: {:?}", e))? - .into() } }; @@ -310,49 +343,10 @@ impl PalletCmd { } // Use the benchmark list and the user input to determine the set of benchmarks to run. - let mut benchmarks_to_run = Vec::new(); - list.iter() - .filter(|item| pallet.is_empty() || pallet == &b"*"[..] || pallet == &item.pallet[..]) - .for_each(|item| { - for benchmark in &item.benchmarks { - let benchmark_name = &benchmark.name; - if extrinsic.is_empty() || - extrinsic.as_bytes() == &b"*"[..] || - extrinsics.contains(&&benchmark_name[..]) - { - benchmarks_to_run.push(( - item.pallet.clone(), - benchmark.name.clone(), - benchmark.components.clone(), - benchmark.pov_modes.clone(), - )) - } - } - }); - // Convert `Vec` to `String` for better readability. - let benchmarks_to_run: Vec<_> = benchmarks_to_run - .into_iter() - .map(|b| { - ( - b.0, - b.1, - b.2, - b.3.into_iter() - .map(|(p, s)| { - (String::from_utf8(p).unwrap(), String::from_utf8(s).unwrap()) - }) - .collect(), - ) - }) - .collect(); - - if benchmarks_to_run.is_empty() { - return Err("No benchmarks found which match your input.".into()) - } + let benchmarks_to_run = self.select_benchmarks_to_run(list)?; - if self.list { - // List benchmarks instead of running them - list_benchmark(benchmarks_to_run); + if let Some(list_output) = self.list { + list_benchmark(benchmarks_to_run, list_output, self.no_csv_header); return Ok(()) } @@ -361,15 +355,17 @@ impl PalletCmd { let mut batches_db = Vec::new(); let mut timer = time::SystemTime::now(); // Maps (pallet, extrinsic) to its component ranges. - let mut component_ranges = HashMap::<(Vec, Vec), Vec>::new(); + let mut component_ranges = HashMap::<(String, String), Vec>::new(); let pov_modes = Self::parse_pov_modes(&benchmarks_to_run)?; + let mut failed = Vec::<(String, String)>::new(); - for (pallet, extrinsic, components, _) in benchmarks_to_run.clone() { + 'outer: for (i, SelectedBenchmark { pallet, extrinsic, components, .. }) in + benchmarks_to_run.clone().into_iter().enumerate() + { log::info!( target: LOG_TARGET, - "Starting benchmark: {}::{}", - String::from_utf8(pallet.clone()).expect("Encoded from String; qed"), - String::from_utf8(extrinsic.clone()).expect("Encoded from String; qed"), + "[{: >3} % ] Starting benchmark: {pallet}::{extrinsic}", + (i * 100) / benchmarks_to_run.len(), ); let all_components = if components.is_empty() { vec![Default::default()] @@ -420,105 +416,127 @@ impl PalletCmd { for (s, selected_components) in all_components.iter().enumerate() { // First we run a verification if !self.no_verify { + let mut changes = genesis_changes.clone(); let state = &state_without_tracking; - let result = StateMachine::new( - state, - &mut changes, - &executor, - "Benchmark_dispatch_benchmark", - &( - &pallet, - &extrinsic, - &selected_components.clone(), - true, // run verification code - 1, // no need to do internal repeats - ) - .encode(), - &mut extensions(), - &sp_state_machine::backend::BackendRuntimeCode::new(state) - .runtime_code()?, - CallContext::Offchain, - ) - .execute() - .map_err(|e| { - format!("Error executing and verifying runtime benchmark: {}", e) - })?; - // Dont use these results since verification code will add overhead. - let _batch = - , String> as Decode>::decode( - &mut &result[..], - ) - .map_err(|e| format!("Failed to decode benchmark results: {:?}", e))? - .map_err(|e| { - format!( - "Benchmark {}::{} failed: {}", - String::from_utf8_lossy(&pallet), - String::from_utf8_lossy(&extrinsic), - e + // Don't use these results since verification code will add overhead. + let _batch: Vec = match Self::exec_state_machine::< + std::result::Result, String>, + _, + _, + >( + StateMachine::new( + state, + &mut changes, + &executor, + "Benchmark_dispatch_benchmark", + &( + pallet.as_bytes(), + extrinsic.as_bytes(), + &selected_components.clone(), + true, // run verification code + 1, // no need to do internal repeats ) - })?; + .encode(), + &mut Self::build_extensions(executor.clone()), + &runtime_code, + CallContext::Offchain, + ), + "dispatch a benchmark", + ) { + Err(e) => { + log::error!("Error executing and verifying runtime benchmark: {}", e); + failed.push((pallet.clone(), extrinsic.clone())); + continue 'outer + }, + Ok(Err(e)) => { + log::error!("Error executing and verifying runtime benchmark: {}", e); + failed.push((pallet.clone(), extrinsic.clone())); + continue 'outer + }, + Ok(Ok(b)) => b, + }; } // Do one loop of DB tracking. { + let mut changes = genesis_changes.clone(); let state = &state_with_tracking; - let result = StateMachine::new( - state, // todo remove tracking - &mut changes, - &executor, - "Benchmark_dispatch_benchmark", - &( - &pallet.clone(), - &extrinsic.clone(), - &selected_components.clone(), - false, // dont run verification code for final values - self.repeat, - ) - .encode(), - &mut extensions(), - &sp_state_machine::backend::BackendRuntimeCode::new(state) - .runtime_code()?, - CallContext::Offchain, - ) - .execute() - .map_err(|e| format!("Error executing runtime benchmark: {}", e))?; - - let batch = - , String> as Decode>::decode( - &mut &result[..], - ) - .map_err(|e| format!("Failed to decode benchmark results: {:?}", e))??; + let batch: Vec = match Self::exec_state_machine::< + std::result::Result, String>, + _, + _, + >( + StateMachine::new( + state, // todo remove tracking + &mut changes, + &executor, + "Benchmark_dispatch_benchmark", + &( + pallet.as_bytes(), + extrinsic.as_bytes(), + &selected_components.clone(), + false, // don't run verification code for final values + self.repeat, + ) + .encode(), + &mut Self::build_extensions(executor.clone()), + &runtime_code, + CallContext::Offchain, + ), + "dispatch a benchmark", + ) { + Err(e) => { + log::error!("Error executing runtime benchmark: {}", e); + failed.push((pallet.clone(), extrinsic.clone())); + continue 'outer + }, + Ok(Err(e)) => { + log::error!("Benchmark {pallet}::{extrinsic} failed: {e}",); + failed.push((pallet.clone(), extrinsic.clone())); + continue 'outer + }, + Ok(Ok(b)) => b, + }; batches_db.extend(batch); } // Finally run a bunch of loops to get extrinsic timing information. for r in 0..self.external_repeat { + let mut changes = genesis_changes.clone(); let state = &state_without_tracking; - let result = StateMachine::new( - state, // todo remove tracking - &mut changes, - &executor, - "Benchmark_dispatch_benchmark", - &( - &pallet.clone(), - &extrinsic.clone(), - &selected_components.clone(), - false, // dont run verification code for final values - self.repeat, - ) - .encode(), - &mut extensions(), - &sp_state_machine::backend::BackendRuntimeCode::new(state) - .runtime_code()?, - CallContext::Offchain, - ) - .execute() - .map_err(|e| format!("Error executing runtime benchmark: {}", e))?; - - let batch = - , String> as Decode>::decode( - &mut &result[..], - ) - .map_err(|e| format!("Failed to decode benchmark results: {:?}", e))??; + let batch = match Self::exec_state_machine::< + std::result::Result, String>, + _, + _, + >( + StateMachine::new( + state, // todo remove tracking + &mut changes, + &executor, + "Benchmark_dispatch_benchmark", + &( + pallet.as_bytes(), + extrinsic.as_bytes(), + &selected_components.clone(), + false, // don't run verification code for final values + self.repeat, + ) + .encode(), + &mut Self::build_extensions(executor.clone()), + &runtime_code, + CallContext::Offchain, + ), + "dispatch a benchmark", + ) { + Err(e) => { + return Err(format!("Error executing runtime benchmark: {e}",).into()); + }, + Ok(Err(e)) => { + return Err( + format!("Benchmark {pallet}::{extrinsic} failed: {e}",).into() + ); + }, + Ok(Ok(b)) => b, + }; batches.extend(batch); @@ -529,11 +547,8 @@ impl PalletCmd { log::info!( target: LOG_TARGET, - "Running benchmark: {}.{}({} args) {}/{} {}/{}", - String::from_utf8(pallet.clone()) - .expect("Encoded from String; qed"), - String::from_utf8(extrinsic.clone()) - .expect("Encoded from String; qed"), + "[{: >3} % ] Running benchmark: {pallet}::{extrinsic}({} args) {}/{} {}/{}", + (i * 100) / benchmarks_to_run.len(), components.len(), s + 1, // s starts at 0. all_components.len(), @@ -546,6 +561,18 @@ impl PalletCmd { } } + assert!(batches_db.len() == batches.len() / self.external_repeat as usize); + + if !failed.is_empty() { + failed.sort(); + eprintln!( + "The following {} benchmarks failed:\n{}", + failed.len(), + failed.iter().map(|(p, e)| format!("- {p}::{e}")).collect::>().join("\n") + ); + return Err(format!("{} benchmarks failed", failed.len()).into()) + } + // Combine all of the benchmark results, so that benchmarks of the same pallet/function // are together. let batches = combine_batches(batches, batches_db); @@ -559,17 +586,260 @@ impl PalletCmd { ) } + fn select_benchmarks_to_run(&self, list: Vec) -> Result> { + let pallet = self.pallet.clone().unwrap_or_default(); + let pallet = pallet.as_bytes(); + + let extrinsic = self.extrinsic.clone().unwrap_or_default(); + let extrinsic_split: Vec<&str> = extrinsic.split(',').collect(); + let extrinsics: Vec<_> = extrinsic_split.iter().map(|x| x.trim().as_bytes()).collect(); + + // Use the benchmark list and the user input to determine the set of benchmarks to run. + let mut benchmarks_to_run = Vec::new(); + list.iter() + .filter(|item| pallet.is_empty() || pallet == &b"*"[..] || pallet == &item.pallet[..]) + .for_each(|item| { + for benchmark in &item.benchmarks { + let benchmark_name = &benchmark.name; + if extrinsic.is_empty() || + extrinsic.as_bytes() == &b"*"[..] || + extrinsics.contains(&&benchmark_name[..]) + { + benchmarks_to_run.push(( + item.pallet.clone(), + benchmark.name.clone(), + benchmark.components.clone(), + benchmark.pov_modes.clone(), + )) + } + } + }); + // Convert `Vec` to `String` for better readability. + let benchmarks_to_run: Vec<_> = benchmarks_to_run + .into_iter() + .map(|(pallet, extrinsic, components, pov_modes)| { + let pallet = String::from_utf8(pallet.clone()).expect("Encoded from String; qed"); + let extrinsic = + String::from_utf8(extrinsic.clone()).expect("Encoded from String; qed"); + + SelectedBenchmark { + pallet, + extrinsic, + components, + pov_modes: pov_modes + .into_iter() + .map(|(p, s)| { + (String::from_utf8(p).unwrap(), String::from_utf8(s).unwrap()) + }) + .collect(), + } + }) + .collect(); + + if benchmarks_to_run.is_empty() { + return Err("No benchmarks found which match your input.".into()) + } + + Ok(benchmarks_to_run) + } + + /// Produce a genesis storage and genesis changes. + /// + /// It would be easier to only return one type, but there is no easy way to convert them. + // TODO: Re-write `BenchmarkingState` to not be such a clusterfuck and only accept + // `OverlayedChanges` instead of a mix between `OverlayedChanges` and `State`. But this can only + // be done once we deprecated and removed the legacy interface :( + fn genesis_storage( + &self, + chain_spec: &Option>, + ) -> Result<(sp_storage::Storage, OverlayedChanges)> { + Ok(match (self.genesis_builder, self.runtime.is_some()) { + (Some(GenesisBuilder::None), _) => Default::default(), + (Some(GenesisBuilder::Spec), _) | (None, false) => { + log::warn!("{WARN_SPEC_GENESIS_CTOR}"); + let Some(chain_spec) = chain_spec else { + return Err("No chain spec specified to generate the genesis state".into()); + }; + + let storage = chain_spec + .build_storage() + .map_err(|e| format!("{ERROR_CANNOT_BUILD_GENESIS}\nError: {e}"))?; + + (storage, Default::default()) + }, + (Some(GenesisBuilder::Runtime), _) | (None, true) => + (Default::default(), self.genesis_from_runtime::()?), + }) + } + + /// Generate the genesis changeset by the runtime API. + fn genesis_from_runtime(&self) -> Result> { + let state = BenchmarkingState::::new( + Default::default(), + Some(self.database_cache_size as usize), + false, + false, + )?; + + // Create a dummy WasmExecutor just to build the genesis storage. + let method = + execution_method_from_cli(self.wasm_method, self.wasmtime_instantiation_strategy); + let executor = WasmExecutor::<( + sp_io::SubstrateHostFunctions, + frame_benchmarking::benchmarking::HostFunctions, + F, + )>::builder() + .with_execution_method(method) + .with_allow_missing_host_functions(self.allow_missing_host_functions) + .build(); + + let runtime = self.runtime_blob(&state)?; + let runtime_code = runtime.code()?; + + // We cannot use the `GenesisConfigBuilderRuntimeCaller` here since it returns the changes + // as `Storage` item, but we need it as `OverlayedChanges`. + let genesis_json: Option> = Self::exec_state_machine( + StateMachine::new( + &state, + &mut Default::default(), + &executor, + "GenesisBuilder_get_preset", + &None::.encode(), // Use the default preset + &mut Self::build_extensions(executor.clone()), + &runtime_code, + CallContext::Offchain, + ), + "build the genesis spec", + )?; + + let Some(base_genesis_json) = genesis_json else { + return Err("GenesisBuilder::get_preset returned no data".into()) + }; + + let base_genesis_json = serde_json::from_slice::(&base_genesis_json) + .map_err(|e| format!("GenesisBuilder::get_preset returned invalid JSON: {:?}", e))?; + + let dev_genesis_json: Option> = Self::exec_state_machine( + StateMachine::new( + &state, + &mut Default::default(), + &executor, + "GenesisBuilder_get_preset", + &Some::(GENESIS_PRESET.into()).encode(), // Use the default preset + &mut Self::build_extensions(executor.clone()), + &runtime_code, + CallContext::Offchain, + ), + "build the genesis spec", + )?; + + let mut genesis_json = serde_json::Value::default(); + json_merge(&mut genesis_json, base_genesis_json); + + if let Some(dev) = dev_genesis_json { + let dev: serde_json::Value = serde_json::from_slice(&dev).map_err(|e| { + format!("GenesisBuilder::get_preset returned invalid JSON: {:?}", e) + })?; + json_merge(&mut genesis_json, dev); + } else { + log::warn!( + "Could not find genesis preset '{GENESIS_PRESET}'. Falling back to default." + ); + } + + let json_pretty_str = serde_json::to_string_pretty(&genesis_json) + .map_err(|e| format!("json to string failed: {e}"))?; + + let mut changes = Default::default(); + let build_res: GenesisBuildResult = Self::exec_state_machine( + StateMachine::new( + &state, + &mut changes, + &executor, + "GenesisBuilder_build_state", + &json_pretty_str.encode(), + &mut Extensions::default(), + &runtime_code, + CallContext::Offchain, + ), + "populate the genesis state", + )?; + + if let Err(e) = build_res { + return Err(format!("GenesisBuilder::build_state failed: {}", e).into()) + } + + Ok(changes) + } + + /// Execute a state machine and decode its return value as `R`. + fn exec_state_machine( + mut machine: StateMachine, H, Exec>, + hint: &str, + ) -> Result { + let res = machine + .execute() + .map_err(|e| format!("Could not call runtime API to {hint}: {}", e))?; + let res = R::decode(&mut &res[..]) + .map_err(|e| format!("Failed to decode runtime API result to {hint}: {:?}", e))?; + Ok(res) + } + + /// Build the extension that are available for pallet benchmarks. + fn build_extensions(exe: E) -> Extensions { + let mut extensions = Extensions::default(); + let (offchain, _) = TestOffchainExt::new(); + let (pool, _) = TestTransactionPoolExt::new(); + let keystore = MemoryKeystore::new(); + extensions.register(KeystoreExt::new(keystore)); + extensions.register(OffchainWorkerExt::new(offchain.clone())); + extensions.register(OffchainDbExt::new(offchain)); + extensions.register(TransactionPoolExt::new(pool)); + extensions.register(ReadRuntimeVersionExt::new(exe)); + extensions + } + + /// Load the runtime blob for this benchmark. + /// + /// The blob will either be loaded from the `:code` key out of the chain spec, or from a file + /// when specified with `--runtime`. + fn runtime_blob<'a, H: Hash>( + &self, + state: &'a BenchmarkingState, + ) -> Result, H>> { + if let Some(runtime) = &self.runtime { + log::info!("Loading WASM from {}", runtime.display()); + let code = fs::read(runtime)?; + let hash = sp_core::blake2_256(&code).to_vec(); + let wrapped_code = WrappedRuntimeCode(Cow::Owned(code)); + + Ok(FetchedCode::FromFile { wrapped_code, heap_pages: self.heap_pages, hash }) + } else { + log::info!("Loading WASM from genesis state"); + let state = sp_state_machine::backend::BackendRuntimeCode::new(state); + + Ok(FetchedCode::FromGenesis { state }) + } + } + + /// Allocation strategy for pallet benchmarking. + fn alloc_strategy(heap_pages: Option) -> HeapAllocStrategy { + heap_pages.map_or(DEFAULT_HEAP_ALLOC_STRATEGY, |p| HeapAllocStrategy::Static { + extra_pages: p as _, + }) + } + fn output( &self, batches: &[BenchmarkBatchSplitResults], storage_info: &[StorageInfo], - component_ranges: &HashMap<(Vec, Vec), Vec>, + component_ranges: &ComponentRangeMap, pov_modes: PovModesMap, max_extrinsic_weight: Option, db_weight: Option, ) -> Result<()> { // Jsonify the result and write it to a file or stdout if desired. - if !self.jsonify(&batches)? { + if !self.jsonify(&batches)? && !self.quiet { // Print the summary only if `jsonify` did not write to stdout. self.print_summary(&batches, &storage_info, pov_modes.clone()) } @@ -622,7 +892,10 @@ impl PalletCmd { HashMap::<(Vec, Vec), HashMap>::new(); for batch in batches { let range = component_ranges - .entry((batch.pallet.clone(), batch.benchmark.clone())) + .entry(( + String::from_utf8(batch.pallet.clone()).unwrap(), + String::from_utf8(batch.benchmark.clone()).unwrap(), + )) .or_default(); for result in &batch.time_results { for (param, value) in &result.components { @@ -687,10 +960,13 @@ impl PalletCmd { ) { for batch in batches.iter() { // Print benchmark metadata + let pallet = String::from_utf8(batch.pallet.clone()).expect("Encoded from String; qed"); + let benchmark = + String::from_utf8(batch.benchmark.clone()).expect("Encoded from String; qed"); println!( "Pallet: {:?}, Extrinsic: {:?}, Lowest values: {:?}, Highest values: {:?}, Steps: {:?}, Repeat: {:?}", - String::from_utf8(batch.pallet.clone()).expect("Encoded from String; qed"), - String::from_utf8(batch.benchmark.clone()).expect("Encoded from String; qed"), + pallet, + benchmark, self.lowest_range_values, self.highest_range_values, self.steps, @@ -704,10 +980,7 @@ impl PalletCmd { if !self.no_storage_info { let mut storage_per_prefix = HashMap::, Vec>::new(); - let pov_mode = pov_modes - .get(&(batch.pallet.clone(), batch.benchmark.clone())) - .cloned() - .unwrap_or_default(); + let pov_mode = pov_modes.get(&(pallet, benchmark)).cloned().unwrap_or_default(); let comments = writer::process_storage_results( &mut storage_per_prefix, @@ -778,18 +1051,11 @@ impl PalletCmd { } /// Parses the PoV modes per benchmark that were specified by the `#[pov_mode]` attribute. - fn parse_pov_modes( - benchmarks: &Vec<( - Vec, - Vec, - Vec<(BenchmarkParameter, u32, u32)>, - Vec<(String, String)>, - )>, - ) -> Result { + fn parse_pov_modes(benchmarks: &Vec) -> Result { use std::collections::hash_map::Entry; let mut parsed = PovModesMap::new(); - for (pallet, call, _components, pov_modes) in benchmarks { + for SelectedBenchmark { pallet, extrinsic, pov_modes, .. } in benchmarks { for (pallet_storage, mode) in pov_modes { let mode = PovEstimationMode::from_str(&mode)?; let splits = pallet_storage.split("::").collect::>(); @@ -803,7 +1069,7 @@ impl PalletCmd { let (pov_pallet, pov_storage) = (splits[0], splits.get(1).unwrap_or(&"ALL")); match parsed - .entry((pallet.clone(), call.clone())) + .entry((pallet.clone(), extrinsic.clone())) .or_default() .entry((pov_pallet.to_string(), pov_storage.to_string())) { @@ -821,6 +1087,33 @@ impl PalletCmd { } Ok(parsed) } + + /// Sanity check the CLI arguments. + fn check_args(&self) -> Result<()> { + if self.runtime.is_some() && self.shared_params.chain.is_some() { + unreachable!("Clap should not allow both `--runtime` and `--chain` to be provided.") + } + + if let Some(output_path) = &self.output { + if !output_path.is_dir() && output_path.file_name().is_none() { + return Err("Output file or path is invalid!".into()) + } + } + + if let Some(header_file) = &self.header { + if !header_file.is_file() { + return Err("Header file is invalid!".into()) + }; + } + + if let Some(handlebars_template_file) = &self.template { + if !handlebars_template_file.is_file() { + return Err("Handlebars template file is invalid!".into()) + }; + } + + Ok(()) + } } impl CliConfiguration for PalletCmd { @@ -838,19 +1131,38 @@ impl CliConfiguration for PalletCmd { /// List the benchmarks available in the runtime, in a CSV friendly format. fn list_benchmark( - mut benchmarks_to_run: Vec<( - Vec, - Vec, - Vec<(BenchmarkParameter, u32, u32)>, - Vec<(String, String)>, - )>, + benchmarks_to_run: Vec, + list_output: ListOutput, + no_csv_header: bool, ) { - // Sort and de-dub by pallet and function name. - benchmarks_to_run.sort_by(|(pa, sa, _, _), (pb, sb, _, _)| (pa, sa).cmp(&(pb, sb))); - benchmarks_to_run.dedup_by(|(pa, sa, _, _), (pb, sb, _, _)| (pa, sa) == (pb, sb)); + let mut benchmarks = BTreeMap::new(); - println!("pallet, benchmark"); - for (pallet, extrinsic, _, _) in benchmarks_to_run { - println!("{}, {}", String::from_utf8_lossy(&pallet), String::from_utf8_lossy(&extrinsic)); + // Sort and de-dub by pallet and function name. + benchmarks_to_run.iter().for_each(|bench| { + benchmarks + .entry(&bench.pallet) + .or_insert_with(BTreeSet::new) + .insert(&bench.extrinsic); + }); + + match list_output { + ListOutput::All => { + if !no_csv_header { + println!("pallet, extrinsic"); + } + for (pallet, extrinsics) in benchmarks { + for extrinsic in extrinsics { + println!("{pallet}, {extrinsic}"); + } + } + }, + ListOutput::Pallets => { + if !no_csv_header { + println!("pallet"); + }; + for pallet in benchmarks.keys() { + println!("{pallet}"); + } + }, } } diff --git a/substrate/utils/frame/benchmarking-cli/src/pallet/mod.rs b/substrate/utils/frame/benchmarking-cli/src/pallet/mod.rs index c69ce1765fc9dc490f1e0f40966ca07948b6b523..d05b52f1ac87080f0e8db33df8563261b9fda5f4 100644 --- a/substrate/utils/frame/benchmarking-cli/src/pallet/mod.rs +++ b/substrate/utils/frame/benchmarking-cli/src/pallet/mod.rs @@ -16,9 +16,11 @@ // limitations under the License. mod command; +mod types; mod writer; -use crate::shared::HostInfoParams; +use crate::{pallet::types::GenesisBuilder, shared::HostInfoParams}; +use clap::ValueEnum; use sc_cli::{ WasmExecutionMethod, WasmtimeInstantiationStrategy, DEFAULT_WASMTIME_INSTANTIATION_STRATEGY, DEFAULT_WASM_EXECUTION_METHOD, @@ -31,17 +33,32 @@ fn parse_pallet_name(pallet: &str) -> std::result::Result { Ok(pallet.replace("-", "_")) } +/// List options for available benchmarks. +#[derive(Debug, Clone, Copy, ValueEnum)] +pub enum ListOutput { + /// List all available pallets and extrinsics. + All, + /// List all available pallets only. + Pallets, +} + /// Benchmark the extrinsic weight of FRAME Pallets. #[derive(Debug, clap::Parser)] pub struct PalletCmd { /// Select a FRAME Pallet to benchmark, or `*` for all (in which case `extrinsic` must be `*`). - #[arg(short, long, value_parser = parse_pallet_name, required_unless_present_any = ["list", "json_input"])] + #[arg(short, long, value_parser = parse_pallet_name, required_unless_present_any = ["list", "json_input", "all"], default_value_if("all", "true", Some("*".into())))] pub pallet: Option, /// Select an extrinsic inside the pallet to benchmark, or `*` for all. - #[arg(short, long, required_unless_present_any = ["list", "json_input"])] + #[arg(short, long, required_unless_present_any = ["list", "json_input", "all"], default_value_if("all", "true", Some("*".into())))] pub extrinsic: Option, + /// Run benchmarks for all pallets and extrinsics. + /// + /// This is equivalent to running `--pallet * --extrinsic *`. + #[arg(long)] + pub all: bool, + /// Select how many samples we should take across the variable components. #[arg(short, long, default_value_t = 50)] pub steps: u32, @@ -150,6 +167,20 @@ pub struct PalletCmd { )] pub wasmtime_instantiation_strategy: WasmtimeInstantiationStrategy, + /// Optional runtime blob to use instead of the one from the genesis config. + #[arg(long, conflicts_with = "chain")] + pub runtime: Option, + + /// Do not fail if there are unknown but also unused host functions in the runtime. + #[arg(long)] + pub allow_missing_host_functions: bool, + + /// How to construct the genesis state. + /// + /// Uses `GenesisBuilder::Spec` by default and `GenesisBuilder::Runtime` if `runtime` is set. + #[arg(long, value_enum)] + pub genesis_builder: Option, + /// DEPRECATED: This argument has no effect. #[arg(long = "execution")] pub execution: Option, @@ -158,11 +189,15 @@ pub struct PalletCmd { #[arg(long = "db-cache", value_name = "MiB", default_value_t = 1024)] pub database_cache_size: u32, - /// List the benchmarks that match your query rather than running them. + /// List and print available benchmarks in a csv-friendly format. /// - /// When nothing is provided, we list all benchmarks. - #[arg(long)] - pub list: bool, + /// NOTE: `num_args` and `require_equals` are required to allow `--list` + #[arg(long, value_enum, ignore_case = true, num_args = 0..=1, require_equals = true, default_missing_value("All"))] + pub list: Option, + + /// Don't include csv header when listing benchmarks. + #[arg(long, requires("list"))] + pub no_csv_header: bool, /// If enabled, the storage info is not displayed in the output next to the analysis. /// @@ -201,4 +236,11 @@ pub struct PalletCmd { /// This exists only to restore legacy behaviour. It should never actually be needed. #[arg(long)] pub unsafe_overwrite_results: bool, + + /// Do not print a summary at the end of the run. + /// + /// These summaries can be very long when benchmarking multiple pallets at once. For CI + /// use-cases, this option reduces the noise. + #[arg(long)] + quiet: bool, } diff --git a/substrate/utils/frame/benchmarking-cli/src/pallet/types.rs b/substrate/utils/frame/benchmarking-cli/src/pallet/types.rs new file mode 100644 index 0000000000000000000000000000000000000000..2bb00d66560f3ed09aea5398837e90687eb28630 --- /dev/null +++ b/substrate/utils/frame/benchmarking-cli/src/pallet/types.rs @@ -0,0 +1,78 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Various types used by this crate. + +use sc_cli::Result; +use sp_core::traits::{RuntimeCode, WrappedRuntimeCode}; +use sp_runtime::traits::Hash; + +/// How the genesis state for benchmarking should be build. +#[derive(clap::ValueEnum, Debug, Eq, PartialEq, Clone, Copy)] +#[clap(rename_all = "kebab-case")] +pub enum GenesisBuilder { + /// Do not provide any genesis state. + /// + /// Benchmarks are advised to function with this, since they should setup their own required + /// state. However, to keep backwards compatibility, this is not the default. + None, + /// Let the runtime build the genesis state through its `BuildGenesisConfig` runtime API. + Runtime, + /// Use the spec file to build the genesis state. This fails when there is no spec. + Spec, +} + +/// A runtime blob that was either fetched from genesis storage or loaded from a file. +// NOTE: This enum is only needed for the annoying lifetime bounds on `RuntimeCode`. Otherwise we +// could just directly return the blob. +pub enum FetchedCode<'a, B, H> { + FromGenesis { state: sp_state_machine::backend::BackendRuntimeCode<'a, B, H> }, + FromFile { wrapped_code: WrappedRuntimeCode<'a>, heap_pages: Option, hash: Vec }, +} + +impl<'a, B, H> FetchedCode<'a, B, H> +where + H: Hash, + B: sc_client_api::StateBackend, +{ + /// The runtime blob. + pub fn code(&'a self) -> Result> { + match self { + Self::FromGenesis { state } => state.runtime_code().map_err(Into::into), + Self::FromFile { wrapped_code, heap_pages, hash } => Ok(RuntimeCode { + code_fetcher: wrapped_code, + heap_pages: *heap_pages, + hash: hash.clone(), + }), + } + } +} + +/// Maps a (pallet, benchmark) to its component ranges. +pub(crate) type ComponentRangeMap = + std::collections::HashMap<(String, String), Vec>; + +/// The inclusive range of a component. +#[derive(serde::Serialize, Debug, Clone, Eq, PartialEq)] +pub(crate) struct ComponentRange { + /// Name of the component. + pub(crate) name: String, + /// Minimal valid value of the component. + pub(crate) min: u32, + /// Maximal valid value of the component. + pub(crate) max: u32, +} diff --git a/substrate/utils/frame/benchmarking-cli/src/pallet/writer.rs b/substrate/utils/frame/benchmarking-cli/src/pallet/writer.rs index 70f3f24fa9f63f31b7d64883a09dfb71a3d56d11..92cd37344631e1a538101b807ea90042360f9fa2 100644 --- a/substrate/utils/frame/benchmarking-cli/src/pallet/writer.rs +++ b/substrate/utils/frame/benchmarking-cli/src/pallet/writer.rs @@ -29,7 +29,10 @@ use sc_cli::SanityWeightCheck; use serde::Serialize; use crate::{ - pallet::command::{ComponentRange, PovEstimationMode, PovModesMap}, + pallet::{ + command::{PovEstimationMode, PovModesMap}, + types::{ComponentRange, ComponentRangeMap}, + }, shared::UnderscoreHelper, PalletCmd, }; @@ -136,7 +139,7 @@ pub(crate) fn io_error(s: &str) -> std::io::Error { pub(crate) fn map_results( batches: &[BenchmarkBatchSplitResults], storage_info: &[StorageInfo], - component_ranges: &HashMap<(Vec, Vec), Vec>, + component_ranges: &ComponentRangeMap, pov_modes: PovModesMap, default_pov_mode: PovEstimationMode, analysis_choice: &AnalysisChoice, @@ -157,8 +160,8 @@ pub(crate) fn map_results( continue } - let pallet_string = String::from_utf8(batch.pallet.clone()).unwrap(); - let instance_string = String::from_utf8(batch.instance.clone()).unwrap(); + let pallet_name = String::from_utf8(batch.pallet.clone()).unwrap(); + let instance_name = String::from_utf8(batch.instance.clone()).unwrap(); let benchmark_data = get_benchmark_data( batch, storage_info, @@ -170,7 +173,7 @@ pub(crate) fn map_results( worst_case_map_values, additional_trie_layers, ); - let pallet_benchmarks = all_benchmarks.entry((pallet_string, instance_string)).or_default(); + let pallet_benchmarks = all_benchmarks.entry((pallet_name, instance_name)).or_default(); pallet_benchmarks.push(benchmark_data); } Ok(all_benchmarks) @@ -304,7 +307,7 @@ fn get_benchmark_data( batch: &BenchmarkBatchSplitResults, storage_info: &[StorageInfo], // Per extrinsic component ranges. - component_ranges: &HashMap<(Vec, Vec), Vec>, + component_ranges: &ComponentRangeMap, pov_modes: PovModesMap, default_pov_mode: PovEstimationMode, analysis_choice: &AnalysisChoice, @@ -323,6 +326,8 @@ fn get_benchmark_data( AnalysisChoice::MedianSlopes => Analysis::median_slopes, AnalysisChoice::Max => Analysis::max, }; + let pallet = String::from_utf8(batch.pallet.clone()).unwrap(); + let benchmark = String::from_utf8(batch.benchmark.clone()).unwrap(); let extrinsic_time = analysis_function(&batch.time_results, BenchmarkSelector::ExtrinsicTime) .expect("analysis function should return an extrinsic time for valid inputs"); @@ -398,10 +403,7 @@ fn get_benchmark_data( // We add additional comments showing which storage items were touched. // We find the worst case proof size, and use that as the final proof size result. let mut storage_per_prefix = HashMap::, Vec>::new(); - let pov_mode = pov_modes - .get(&(batch.pallet.clone(), batch.benchmark.clone())) - .cloned() - .unwrap_or_default(); + let pov_mode = pov_modes.get(&(pallet.clone(), benchmark.clone())).cloned().unwrap_or_default(); let comments = process_storage_results( &mut storage_per_prefix, &batch.db_results, @@ -467,12 +469,12 @@ fn get_benchmark_data( .collect::>(); let component_ranges = component_ranges - .get(&(batch.pallet.clone(), batch.benchmark.clone())) + .get(&(pallet.clone(), benchmark.clone())) .map(|c| c.clone()) .unwrap_or_default(); BenchmarkData { - name: String::from_utf8(batch.benchmark.clone()).unwrap(), + name: benchmark, components, base_weight: extrinsic_time.base, base_reads: reads.base, @@ -666,19 +668,22 @@ pub(crate) fn process_storage_results( let mut prefix_result = result.clone(); let key_info = storage_info_map.get(&prefix); + let pallet_name = match key_info { + Some(k) => String::from_utf8(k.pallet_name.clone()).expect("encoded from string"), + None => "".to_string(), + }; + let storage_name = match key_info { + Some(k) => String::from_utf8(k.storage_name.clone()).expect("encoded from string"), + None => "".to_string(), + }; let max_size = key_info.and_then(|k| k.max_size); let override_pov_mode = match key_info { - Some(StorageInfo { pallet_name, storage_name, .. }) => { - let pallet_name = - String::from_utf8(pallet_name.clone()).expect("encoded from string"); - let storage_name = - String::from_utf8(storage_name.clone()).expect("encoded from string"); - + Some(_) => { // Is there an override for the storage key? - pov_modes.get(&(pallet_name.clone(), storage_name)).or( + pov_modes.get(&(pallet_name.clone(), storage_name.clone())).or( // .. or for the storage prefix? - pov_modes.get(&(pallet_name, "ALL".to_string())).or( + pov_modes.get(&(pallet_name.clone(), "ALL".to_string())).or( // .. or for the benchmark? pov_modes.get(&("ALL".to_string(), "ALL".to_string())), ), @@ -757,15 +762,10 @@ pub(crate) fn process_storage_results( // writes. if !is_prefix_identified { match key_info { - Some(key_info) => { + Some(_) => { let comment = format!( "Storage: `{}::{}` (r:{} w:{})", - String::from_utf8(key_info.pallet_name.clone()) - .expect("encoded from string"), - String::from_utf8(key_info.storage_name.clone()) - .expect("encoded from string"), - reads, - writes, + pallet_name, storage_name, reads, writes, ); comments.push(comment) }, @@ -793,11 +793,7 @@ pub(crate) fn process_storage_results( ) { Some(new_pov) => { let comment = format!( - "Proof: `{}::{}` (`max_values`: {:?}, `max_size`: {:?}, added: {}, mode: `{:?}`)", - String::from_utf8(key_info.pallet_name.clone()) - .expect("encoded from string"), - String::from_utf8(key_info.storage_name.clone()) - .expect("encoded from string"), + "Proof: `{pallet_name}::{storage_name}` (`max_values`: {:?}, `max_size`: {:?}, added: {}, mode: `{:?}`)", key_info.max_values, key_info.max_size, new_pov, @@ -806,13 +802,9 @@ pub(crate) fn process_storage_results( comments.push(comment) }, None => { - let pallet = String::from_utf8(key_info.pallet_name.clone()) - .expect("encoded from string"); - let item = String::from_utf8(key_info.storage_name.clone()) - .expect("encoded from string"); let comment = format!( "Proof: `{}::{}` (`max_values`: {:?}, `max_size`: {:?}, mode: `{:?}`)", - pallet, item, key_info.max_values, key_info.max_size, + pallet_name, storage_name, key_info.max_values, key_info.max_size, used_pov_mode, ); comments.push(comment); @@ -976,10 +968,10 @@ mod test { fn test_pov_mode() -> PovModesMap { let mut map = PovModesMap::new(); - map.entry((b"scheduler".to_vec(), b"first_benchmark".to_vec())) + map.entry(("scheduler".into(), "first_benchmark".into())) .or_default() .insert(("scheduler".into(), "mel".into()), PovEstimationMode::MaxEncodedLen); - map.entry((b"scheduler".to_vec(), b"first_benchmark".to_vec())) + map.entry(("scheduler".into(), "first_benchmark".into())) .or_default() .insert(("scheduler".into(), "measured".into()), PovEstimationMode::Measured); map diff --git a/substrate/utils/frame/benchmarking-cli/src/storage/write.rs b/substrate/utils/frame/benchmarking-cli/src/storage/write.rs index 65941497bda41f94b1230f73d59b187895cee4d9..4fa56b6e818f8d90103eb080db2e071ba2a240eb 100644 --- a/substrate/utils/frame/benchmarking-cli/src/storage/write.rs +++ b/substrate/utils/frame/benchmarking-cli/src/storage/write.rs @@ -57,7 +57,7 @@ impl StorageCmd { let best_hash = client.usage_info().chain.best_hash; let header = client.header(best_hash)?.ok_or("Header not found")?; let original_root = *header.state_root(); - let trie = DbStateBuilder::::new(storage.clone(), original_root).build(); + let trie = DbStateBuilder::>::new(storage.clone(), original_root).build(); info!("Preparing keys from block {}", best_hash); // Load all KV pairs and randomly shuffle them. @@ -189,7 +189,7 @@ fn convert_tx( /// if `child_info` exist then it means this is a child tree key fn measure_write( db: Arc>, - trie: &DbState, + trie: &DbState>, key: Vec, new_v: Vec, version: StateVersion, @@ -220,7 +220,7 @@ fn measure_write( /// if `child_info` exist then it means this is a child tree key fn check_new_value( db: Arc>, - trie: &DbState, + trie: &DbState>, key: &Vec, new_v: &Vec, version: StateVersion, diff --git a/substrate/utils/frame/frame-utilities-cli/Cargo.toml b/substrate/utils/frame/frame-utilities-cli/Cargo.toml index 87e3a50753f734950791f617063e03f418ab4390..3952c9fd219f495270c811f0f849eb4178a96a92 100644 --- a/substrate/utils/frame/frame-utilities-cli/Cargo.toml +++ b/substrate/utils/frame/frame-utilities-cli/Cargo.toml @@ -14,7 +14,7 @@ readme = "README.md" workspace = true [dependencies] -clap = { version = "4.4.18", features = ["derive"] } +clap = { version = "4.5.3", features = ["derive"] } frame-support = { path = "../../../frame/support" } frame-system = { path = "../../../frame/system" } sc-cli = { path = "../../../client/cli" } diff --git a/substrate/utils/frame/generate-bags/node-runtime/Cargo.toml b/substrate/utils/frame/generate-bags/node-runtime/Cargo.toml index b35e06879df7ebb493ea09a9d4be2b32b3e6128c..37d96d7e12b963b7777ac4f21e70e5c419515d37 100644 --- a/substrate/utils/frame/generate-bags/node-runtime/Cargo.toml +++ b/substrate/utils/frame/generate-bags/node-runtime/Cargo.toml @@ -17,4 +17,4 @@ kitchensink-runtime = { path = "../../../../bin/node/runtime" } generate-bags = { path = ".." } # third-party -clap = { version = "4.4.18", features = ["derive"] } +clap = { version = "4.5.3", features = ["derive"] } diff --git a/substrate/utils/frame/generate-bags/src/lib.rs b/substrate/utils/frame/generate-bags/src/lib.rs index 923017261a44b3ce065dab99a55046ebfdcae594..62485c442d3654441765331f73d52951db014ee9 100644 --- a/substrate/utils/frame/generate-bags/src/lib.rs +++ b/substrate/utils/frame/generate-bags/src/lib.rs @@ -183,7 +183,7 @@ pub fn generate_thresholds( total_issuance: u128, minimum_balance: u128, ) -> Result<(), std::io::Error> { - // ensure the file is accessable + // ensure the file is accessible if let Some(parent) = output.parent() { if !parent.exists() { std::fs::create_dir_all(parent)?; diff --git a/substrate/utils/frame/omni-bencher/Cargo.toml b/substrate/utils/frame/omni-bencher/Cargo.toml new file mode 100644 index 0000000000000000000000000000000000000000..0c2d1a1b32b1f973955795a7d883a3ef72b268aa --- /dev/null +++ b/substrate/utils/frame/omni-bencher/Cargo.toml @@ -0,0 +1,21 @@ +[package] +name = "frame-omni-bencher" +version = "0.1.0" +description = "Freestanding benchmark runner for any Polkadot runtime." +authors.workspace = true +edition.workspace = true +repository.workspace = true +license.workspace = true + +[lints] +workspace = true + +[dependencies] +clap = { version = "4.5.2", features = ["derive"] } +cumulus-primitives-proof-size-hostfunction = { path = "../../../../cumulus/primitives/proof-size-hostfunction" } +frame-benchmarking-cli = { path = "../benchmarking-cli", default-features = false } +sc-cli = { path = "../../../client/cli" } +sp-runtime = { path = "../../../primitives/runtime" } +sp-statement-store = { path = "../../../primitives/statement-store" } +env_logger = "0.11.2" +log = { workspace = true } diff --git a/substrate/utils/frame/omni-bencher/src/command.rs b/substrate/utils/frame/omni-bencher/src/command.rs new file mode 100644 index 0000000000000000000000000000000000000000..f0159f4307d6108f54be028c2a5bd10773aa3a79 --- /dev/null +++ b/substrate/utils/frame/omni-bencher/src/command.rs @@ -0,0 +1,149 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use clap::Parser; +use frame_benchmarking_cli::BenchmarkCmd; +use sc_cli::Result; +use sp_runtime::traits::BlakeTwo256; + +/// # Polkadot Omni Benchmarking CLI +/// +/// The Polkadot Omni benchmarker allows to benchmark the extrinsics of any Polkadot runtime. It is +/// meant to replace the current manual integration of the `benchmark pallet` into every parachain +/// node. This reduces duplicate code and makes maintenance for builders easier. The CLI is +/// currently only able to benchmark extrinsics. In the future it is planned to extend this to some +/// other areas. +/// +/// General FRAME runtimes could also be used with this benchmarker, as long as they don't utilize +/// any host functions that are not part of the Polkadot host specification. +/// +/// ## Installation +/// +/// Directly via crates.io: +/// +/// ```sh +/// cargo install --locked frame-omni-bencher +/// ``` +/// +/// or when the sources are locally checked out: +/// +/// ```sh +/// cargo install --locked --path substrate/utils/frame/omni-bencher --profile=production +/// ``` +/// +/// Check the installed version and print the docs: +/// +/// ```sh +/// frame-omni-bencher --help +/// ``` +/// +/// ## Usage +/// +/// First we need to ensure that there is a runtime available. As example we will build the Westend +/// runtime: +/// +/// ```sh +/// cargo build -p westend-runtime --profile production --features runtime-benchmarks +/// ``` +/// +/// Now as example we benchmark `pallet_balances`: +/// +/// ```sh +/// frame-omni-bencher v1 benchmark pallet \ +/// --runtime target/release/wbuild/westend-runtime/westend-runtime.compact.compressed.wasm \ +/// --pallet "pallet_balances" --extrinsic "" +/// ``` +/// +/// For the exact arguments of the `pallet` command, please refer to the `pallet` sub-module. +/// +/// ## Backwards Compatibility +/// +/// The exposed pallet sub-command is identical as the node-integrated CLI. The only difference is +/// that it needs to be prefixed with a `v1` to ensure drop-in compatibility. +#[derive(Parser, Debug)] +#[clap(author, version, about, verbatim_doc_comment)] +pub struct Command { + #[command(subcommand)] + sub: SubCommand, +} + +/// Root-level subcommands. +#[derive(Debug, clap::Subcommand)] +pub enum SubCommand { + /// Compatibility syntax with the old benchmark runner. + V1(V1Command), + // NOTE: Here we can add new commands in a forward-compatible way. For example when + // transforming the CLI from a monolithic design to a data driven pipeline, there could be + // commands like `measure`, `analyze` and `render`. +} + +/// A command that conforms to the legacy `benchmark` argument syntax. +#[derive(Parser, Debug)] +pub struct V1Command { + #[command(subcommand)] + sub: V1SubCommand, +} + +/// The `v1 benchmark` subcommand. +#[derive(Debug, clap::Subcommand)] +pub enum V1SubCommand { + Benchmark(V1BenchmarkCommand), +} + +/// Subcommands for `v1 benchmark`. +#[derive(Parser, Debug)] +pub struct V1BenchmarkCommand { + #[command(subcommand)] + sub: BenchmarkCmd, +} + +type HostFunctions = ( + sp_statement_store::runtime_api::HostFunctions, + cumulus_primitives_proof_size_hostfunction::storage_proof_size::HostFunctions, +); + +impl Command { + pub fn run(self) -> Result<()> { + match self.sub { + SubCommand::V1(V1Command { sub }) => sub.run(), + } + } +} + +impl V1SubCommand { + pub fn run(self) -> Result<()> { + let pallet = match self { + V1SubCommand::Benchmark(V1BenchmarkCommand { sub }) => match sub { + BenchmarkCmd::Pallet(pallet) => pallet, + _ => + return Err( + "Only the `v1 benchmark pallet` command is currently supported".into() + ), + }, + }; + + if let Some(spec) = pallet.shared_params.chain { + return Err(format!( + "Chain specs are not supported. Please remove `--chain={spec}` and use \ + `--runtime=` instead" + ) + .into()) + } + + pallet.run_with_spec::(None) + } +} diff --git a/substrate/utils/frame/omni-bencher/src/main.rs b/substrate/utils/frame/omni-bencher/src/main.rs new file mode 100644 index 0000000000000000000000000000000000000000..c148403f2970586fd4f0cd425ccb1d5688c69da8 --- /dev/null +++ b/substrate/utils/frame/omni-bencher/src/main.rs @@ -0,0 +1,29 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +mod command; + +use clap::Parser; +use env_logger::Env; +use sc_cli::Result; + +fn main() -> Result<()> { + env_logger::Builder::from_env(Env::default().default_filter_or("info")).init(); + log::warn!("The FRAME omni-bencher is not yet battle tested - double check the results.",); + + command::Command::parse().run() +} diff --git a/substrate/utils/frame/remote-externalities/Cargo.toml b/substrate/utils/frame/remote-externalities/Cargo.toml index ff0b7572d334ca219b0aa007277a06e7aec24824..82b019154832aee4202d60d3a1a2b9015b7b774a 100644 --- a/substrate/utils/frame/remote-externalities/Cargo.toml +++ b/substrate/utils/frame/remote-externalities/Cargo.toml @@ -15,10 +15,10 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -jsonrpsee = { version = "0.20.3", features = ["http-client"] } +jsonrpsee = { version = "0.22", features = ["http-client"] } codec = { package = "parity-scale-codec", version = "3.6.1" } -log = "0.4.17" -serde = "1.0.195" +log = { workspace = true, default-features = true } +serde = { workspace = true, default-features = true } sp-core = { path = "../../../primitives/core" } sp-crypto-hashing = { path = "../../../primitives/crypto/hashing" } sp-state-machine = { path = "../../../primitives/state-machine" } @@ -26,7 +26,7 @@ sp-io = { path = "../../../primitives/io" } sp-runtime = { path = "../../../primitives/runtime" } tokio = { version = "1.22.0", features = ["macros", "rt-multi-thread"] } substrate-rpc-client = { path = "../rpc/client" } -futures = "0.3" +futures = "0.3.30" indicatif = "0.17.7" spinners = "4.1.0" tokio-retry = "0.3.0" diff --git a/substrate/utils/frame/remote-externalities/src/lib.rs b/substrate/utils/frame/remote-externalities/src/lib.rs index 47c0508485cd367da4627bdbca446c52e5974f45..e429d39669f1b35f73e114df31e997f96c19945c 100644 --- a/substrate/utils/frame/remote-externalities/src/lib.rs +++ b/substrate/utils/frame/remote-externalities/src/lib.rs @@ -36,7 +36,7 @@ use sp_core::{ }, }; use sp_runtime::{ - traits::{Block as BlockT, HashingFor}, + traits::{Block as BlockT, Hash, HashingFor}, StateVersion, }; use sp_state_machine::TestExternalities; @@ -63,21 +63,21 @@ const SNAPSHOT_VERSION: SnapshotVersion = Compact(3); /// The snapshot that we store on disk. #[derive(Decode, Encode)] -struct Snapshot { +struct Snapshot { snapshot_version: SnapshotVersion, state_version: StateVersion, - block_hash: B::Hash, + block_hash: H, // > raw_storage: Vec<(Vec, (Vec, i32))>, - storage_root: B::Hash, + storage_root: H, } -impl Snapshot { +impl Snapshot { pub fn new( state_version: StateVersion, - block_hash: B::Hash, + block_hash: H, raw_storage: Vec<(Vec, (Vec, i32))>, - storage_root: B::Hash, + storage_root: H, ) -> Self { Self { snapshot_version: SNAPSHOT_VERSION, @@ -88,7 +88,7 @@ impl Snapshot { } } - fn load(path: &PathBuf) -> Result, &'static str> { + fn load(path: &PathBuf) -> Result, &'static str> { let bytes = fs::read(path).map_err(|_| "fs::read failed.")?; // The first item in the SCALE encoded struct bytes is the snapshot version. We decode and // check that first, before proceeding to decode the rest of the snapshot. @@ -105,21 +105,21 @@ impl Snapshot { /// An externalities that acts exactly the same as [`sp_io::TestExternalities`] but has a few extra /// bits and pieces to it, and can be loaded remotely. -pub struct RemoteExternalities { +pub struct RemoteExternalities { /// The inner externalities. - pub inner_ext: TestExternalities>, - /// The block hash it which we created this externality env. - pub block_hash: B::Hash, + pub inner_ext: TestExternalities, + /// The block hash with which we created this externality env. + pub block_hash: H::Out, } -impl Deref for RemoteExternalities { - type Target = TestExternalities>; +impl Deref for RemoteExternalities { + type Target = TestExternalities; fn deref(&self) -> &Self::Target { &self.inner_ext } } -impl DerefMut for RemoteExternalities { +impl DerefMut for RemoteExternalities { fn deref_mut(&mut self) -> &mut Self::Target { &mut self.inner_ext } @@ -127,16 +127,16 @@ impl DerefMut for RemoteExternalities { /// The execution mode. #[derive(Clone)] -pub enum Mode { +pub enum Mode { /// Online. Potentially writes to a snapshot file. - Online(OnlineConfig), + Online(OnlineConfig), /// Offline. Uses a state snapshot file and needs not any client config. Offline(OfflineConfig), /// Prefer using a snapshot file if it exists, else use a remote server. - OfflineOrElseOnline(OfflineConfig, OnlineConfig), + OfflineOrElseOnline(OfflineConfig, OnlineConfig), } -impl Default for Mode { +impl Default for Mode { fn default() -> Self { Mode::Online(OnlineConfig::default()) } @@ -221,10 +221,10 @@ impl From for Transport { /// /// A state snapshot config may be present and will be written to in that case. #[derive(Clone)] -pub struct OnlineConfig { +pub struct OnlineConfig { /// The block hash at which to get the runtime state. Will be latest finalized head if not /// provided. - pub at: Option, + pub at: Option, /// An optional state snapshot file to WRITE to, not for reading. Not written if set to `None`. pub state_snapshot: Option, /// The pallets to scrape. These values are hashed and added to `hashed_prefix`. @@ -240,7 +240,7 @@ pub struct OnlineConfig { pub hashed_keys: Vec>, } -impl OnlineConfig { +impl OnlineConfig { /// Return rpc (http) client reference. fn rpc_client(&self) -> &HttpClient { self.transport @@ -248,12 +248,12 @@ impl OnlineConfig { .expect("http client must have been initialized by now; qed.") } - fn at_expected(&self) -> B::Hash { - self.at.expect("block at must be initialized; qed") + fn at_expected(&self) -> H { + self.at.clone().expect("block at must be initialized; qed") } } -impl Default for OnlineConfig { +impl Default for OnlineConfig { fn default() -> Self { Self { transport: Transport::from(DEFAULT_HTTP_ENDPOINT.to_owned()), @@ -267,7 +267,7 @@ impl Default for OnlineConfig { } } -impl From for OnlineConfig { +impl From for OnlineConfig { fn from(t: String) -> Self { Self { transport: t.into(), ..Default::default() } } @@ -307,7 +307,7 @@ pub struct Builder { /// The keys that will be excluded from the final externality. The *hashed* key must be given. hashed_blacklist: Vec>, /// Connectivity mode, online or offline. - mode: Mode, + mode: Mode, /// If provided, overwrite the state version with this. Otherwise, the state_version of the /// remote node is used. All cache files also store their state version. /// @@ -328,7 +328,7 @@ impl Default for Builder { // Mode methods impl Builder { - fn as_online(&self) -> &OnlineConfig { + fn as_online(&self) -> &OnlineConfig { match &self.mode { Mode::Online(config) => config, Mode::OfflineOrElseOnline(_, config) => config, @@ -336,7 +336,7 @@ impl Builder { } } - fn as_online_mut(&mut self) -> &mut OnlineConfig { + fn as_online_mut(&mut self) -> &mut OnlineConfig { match &mut self.mode { Mode::Online(config) => config, Mode::OfflineOrElseOnline(_, config) => config, @@ -762,7 +762,7 @@ where let mut sp = Spinner::with_timer(Spinners::Dots, "Inserting keys into DB...".into()); let start = Instant::now(); pending_ext.batch_insert(key_values.clone().into_iter().filter_map(|(k, v)| { - // Don't insert the child keys here, they need to be inserted seperately with all their + // Don't insert the child keys here, they need to be inserted separately with all their // data in the load_child_remote function. match is_default_child_storage_key(&k.0) { true => None, @@ -1055,7 +1055,7 @@ where // If we need to save a snapshot, save the raw storage and root hash to the snapshot. if let Some(path) = self.as_online().state_snapshot.clone().map(|c| c.path) { let (raw_storage, storage_root) = pending_ext.into_raw_snapshot(); - let snapshot = Snapshot::::new( + let snapshot = Snapshot::::new( state_version, self.as_online() .at @@ -1083,7 +1083,7 @@ where Ok(pending_ext) } - async fn do_load_remote(&mut self) -> Result, &'static str> { + async fn do_load_remote(&mut self) -> Result>, &'static str> { self.init_remote_client().await?; let block_hash = self.as_online().at_expected(); let inner_ext = self.load_remote_and_maybe_save().await?; @@ -1093,12 +1093,12 @@ where fn do_load_offline( &mut self, config: OfflineConfig, - ) -> Result, &'static str> { + ) -> Result>, &'static str> { let mut sp = Spinner::with_timer(Spinners::Dots, "Loading snapshot...".into()); let start = Instant::now(); info!(target: LOG_TARGET, "Loading snapshot from {:?}", &config.state_snapshot.path); let Snapshot { snapshot_version: _, block_hash, state_version, raw_storage, storage_root } = - Snapshot::::load(&config.state_snapshot.path)?; + Snapshot::::load(&config.state_snapshot.path)?; let inner_ext = TestExternalities::from_raw_snapshot( raw_storage, @@ -1110,7 +1110,9 @@ where Ok(RemoteExternalities { inner_ext, block_hash }) } - pub(crate) async fn pre_build(mut self) -> Result, &'static str> { + pub(crate) async fn pre_build( + mut self, + ) -> Result>, &'static str> { let mut ext = match self.mode.clone() { Mode::Offline(config) => self.do_load_offline(config)?, Mode::Online(_) => self.do_load_remote().await?, @@ -1175,7 +1177,7 @@ where } /// Configure a state snapshot to be used. - pub fn mode(mut self, mode: Mode) -> Self { + pub fn mode(mut self, mode: Mode) -> Self { self.mode = mode; self } @@ -1186,7 +1188,7 @@ where self } - pub async fn build(self) -> Result, &'static str> { + pub async fn build(self) -> Result>, &'static str> { let mut ext = self.pre_build().await?; ext.commit_all().unwrap(); @@ -1263,7 +1265,11 @@ mod tests { #[cfg(all(test, feature = "remote-test"))] mod remote_tests { use super::test_prelude::*; - use std::os::unix::fs::MetadataExt; + use std::{env, os::unix::fs::MetadataExt}; + + fn endpoint() -> String { + env::var("TEST_WS").unwrap_or_else(|_| DEFAULT_HTTP_ENDPOINT.to_string()) + } #[tokio::test] async fn state_version_is_kept_and_can_be_altered() { @@ -1273,6 +1279,7 @@ mod remote_tests { // first, build a snapshot. let ext = Builder::::new() .mode(Mode::Online(OnlineConfig { + transport: endpoint().clone().into(), pallets: vec!["Proxy".to_owned()], child_trie: false, state_snapshot: Some(SnapshotConfig::new(CACHE)), @@ -1314,6 +1321,7 @@ mod remote_tests { // first, build a snapshot. let ext = Builder::::new() .mode(Mode::Online(OnlineConfig { + transport: endpoint().clone().into(), pallets: vec!["Proxy".to_owned()], child_trie: false, state_snapshot: Some(SnapshotConfig::new(CACHE)), @@ -1341,6 +1349,7 @@ mod remote_tests { // create an ext with children keys let child_ext = Builder::::new() .mode(Mode::Online(OnlineConfig { + transport: endpoint().clone().into(), pallets: vec!["Proxy".to_owned()], child_trie: true, state_snapshot: Some(SnapshotConfig::new(CACHE)), @@ -1353,6 +1362,7 @@ mod remote_tests { // create an ext without children keys let ext = Builder::::new() .mode(Mode::Online(OnlineConfig { + transport: endpoint().clone().into(), pallets: vec!["Proxy".to_owned()], child_trie: false, state_snapshot: Some(SnapshotConfig::new(CACHE)), @@ -1378,6 +1388,7 @@ mod remote_tests { .mode(Mode::OfflineOrElseOnline( OfflineConfig { state_snapshot: SnapshotConfig::new(CACHE) }, OnlineConfig { + transport: endpoint().clone().into(), pallets: vec!["Proxy".to_owned()], child_trie: false, state_snapshot: Some(SnapshotConfig::new(CACHE)), @@ -1419,6 +1430,7 @@ mod remote_tests { init_logger(); Builder::::new() .mode(Mode::Online(OnlineConfig { + transport: endpoint().clone().into(), pallets: vec!["Proxy".to_owned()], child_trie: false, ..Default::default() @@ -1434,6 +1446,7 @@ mod remote_tests { init_logger(); Builder::::new() .mode(Mode::Online(OnlineConfig { + transport: endpoint().clone().into(), pallets: vec!["Proxy".to_owned(), "Multisig".to_owned()], child_trie: false, ..Default::default() @@ -1451,6 +1464,7 @@ mod remote_tests { Builder::::new() .mode(Mode::Online(OnlineConfig { + transport: endpoint().clone().into(), state_snapshot: Some(SnapshotConfig::new(CACHE)), pallets: vec!["Proxy".to_owned()], child_trie: false, @@ -1480,6 +1494,7 @@ mod remote_tests { init_logger(); Builder::::new() .mode(Mode::Online(OnlineConfig { + transport: endpoint().clone().into(), state_snapshot: Some(SnapshotConfig::new(CACHE)), pallets: vec!["Crowdloan".to_owned()], child_trie: true, @@ -1511,7 +1526,7 @@ mod remote_tests { init_logger(); Builder::::new() .mode(Mode::Online(OnlineConfig { - transport: std::option_env!("TEST_WS").unwrap().to_owned().into(), + transport: endpoint().clone().into(), pallets: vec!["Staking".to_owned()], child_trie: false, ..Default::default() @@ -1530,7 +1545,7 @@ mod remote_tests { init_logger(); Builder::::new() .mode(Mode::Online(OnlineConfig { - transport: std::option_env!("TEST_WS").unwrap().to_owned().into(), + transport: endpoint().clone().into(), ..Default::default() })) .build() @@ -1543,9 +1558,10 @@ mod remote_tests { async fn can_fetch_in_parallel() { init_logger(); - let uri = String::from("wss://kusama-bridge-hub-rpc.polkadot.io:443"); - let mut builder = Builder::::new() - .mode(Mode::Online(OnlineConfig { transport: uri.into(), ..Default::default() })); + let mut builder = Builder::::new().mode(Mode::Online(OnlineConfig { + transport: endpoint().clone().into(), + ..Default::default() + })); builder.init_remote_client().await.unwrap(); let at = builder.as_online().at.unwrap(); diff --git a/substrate/utils/frame/rpc/client/Cargo.toml b/substrate/utils/frame/rpc/client/Cargo.toml index a97bc77b00f531d9dd0fc816a04a59a4ea73142f..501bb95b257949f2b91678d361d210c440057906 100644 --- a/substrate/utils/frame/rpc/client/Cargo.toml +++ b/substrate/utils/frame/rpc/client/Cargo.toml @@ -15,12 +15,12 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -jsonrpsee = { version = "0.20.3", features = ["ws-client"] } +jsonrpsee = { version = "0.22", features = ["ws-client"] } sc-rpc-api = { path = "../../../../client/rpc-api" } -async-trait = "0.1.74" -serde = "1" +async-trait = "0.1.79" +serde = { workspace = true, default-features = true } sp-runtime = { path = "../../../../primitives/runtime" } -log = "0.4" +log = { workspace = true, default-features = true } [dev-dependencies] tokio = { version = "1.22.0", features = ["macros", "rt-multi-thread", "sync"] } diff --git a/substrate/utils/frame/rpc/client/src/lib.rs b/substrate/utils/frame/rpc/client/src/lib.rs index 9349ee2d357b2b8c608e722ea0100b790c509991..221f260b156699f012e17d5eecd8c311066d2902 100644 --- a/substrate/utils/frame/rpc/client/src/lib.rs +++ b/substrate/utils/frame/rpc/client/src/lib.rs @@ -44,9 +44,9 @@ use std::collections::VecDeque; pub use jsonrpsee::{ core::{ - client::{ClientT, Subscription, SubscriptionClientT}, + client::{ClientT, Error, Subscription, SubscriptionClientT}, params::BatchRequestBuilder, - Error, RpcResult, + RpcResult, }, rpc_params, ws_client::{WsClient, WsClientBuilder}, diff --git a/substrate/utils/frame/rpc/state-trie-migration-rpc/Cargo.toml b/substrate/utils/frame/rpc/state-trie-migration-rpc/Cargo.toml index 83afff94a8dc06defc2abb90c4626d9acb633af7..98a87b7d5b200f632cf599dd7fa741f3a804dd0b 100644 --- a/substrate/utils/frame/rpc/state-trie-migration-rpc/Cargo.toml +++ b/substrate/utils/frame/rpc/state-trie-migration-rpc/Cargo.toml @@ -17,13 +17,14 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false } -serde = { version = "1", features = ["derive"] } +serde = { features = ["derive"], workspace = true, default-features = true } sp-core = { path = "../../../../primitives/core" } sp-state-machine = { path = "../../../../primitives/state-machine" } sp-trie = { path = "../../../../primitives/trie" } -trie-db = "0.28.0" -jsonrpsee = { version = "0.20.3", features = ["client-core", "macros", "server"] } +trie-db = "0.29.0" + +jsonrpsee = { version = "0.22", features = ["client-core", "macros", "server"] } # Substrate Dependencies sc-client-api = { path = "../../../../client/api" } @@ -31,4 +32,4 @@ sc-rpc-api = { path = "../../../../client/rpc-api" } sp-runtime = { path = "../../../../primitives/runtime" } [dev-dependencies] -serde_json = "1.0.111" +serde_json = { workspace = true, default-features = true } diff --git a/substrate/utils/frame/rpc/state-trie-migration-rpc/src/lib.rs b/substrate/utils/frame/rpc/state-trie-migration-rpc/src/lib.rs index f45258ea593d74c417bcb301c8ca755f0d396945..c0333bb7dac0f19ed30adc108845f88c918c900f 100644 --- a/substrate/utils/frame/rpc/state-trie-migration-rpc/src/lib.rs +++ b/substrate/utils/frame/rpc/state-trie-migration-rpc/src/lib.rs @@ -132,7 +132,7 @@ pub trait StateMigrationApi { /// Check current migration state. /// /// This call is performed locally without submitting any transactions. Thus executing this - /// won't change any state. Nonetheless it is a VERY costy call that should be + /// won't change any state. Nonetheless it is a VERY costly call that should be /// only exposed to trusted peers. #[method(name = "state_trieMigrationStatus")] fn call(&self, at: Option) -> RpcResult; diff --git a/substrate/utils/frame/rpc/support/Cargo.toml b/substrate/utils/frame/rpc/support/Cargo.toml index 3750e3272c90d56cc47b31b75a262477cf410360..84db06da7b0d26fa52f066dc7ef9f6d879bcc34c 100644 --- a/substrate/utils/frame/rpc/support/Cargo.toml +++ b/substrate/utils/frame/rpc/support/Cargo.toml @@ -16,16 +16,16 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1" } -jsonrpsee = { version = "0.20.3", features = ["jsonrpsee-types"] } -serde = "1" +jsonrpsee = { version = "0.22", features = ["jsonrpsee-types"] } +serde = { workspace = true, default-features = true } frame-support = { path = "../../../../frame/support" } sc-rpc-api = { path = "../../../../client/rpc-api" } sp-storage = { path = "../../../../primitives/storage" } [dev-dependencies] -scale-info = "2.10.0" -jsonrpsee = { version = "0.20.3", features = ["jsonrpsee-types", "ws-client"] } -tokio = "1.22.0" +scale-info = "2.11.1" +jsonrpsee = { version = "0.22", features = ["jsonrpsee-types", "ws-client"] } +tokio = "1.37" sp-core = { path = "../../../../primitives/core" } sp-runtime = { path = "../../../../primitives/runtime" } frame-system = { path = "../../../../frame/system" } diff --git a/substrate/utils/frame/rpc/support/src/lib.rs b/substrate/utils/frame/rpc/support/src/lib.rs index e3ccbd6965893ed81b9698e4ff0b4caebba3830c..dea822167ff350ffa2060be9eef328e9f04347b6 100644 --- a/substrate/utils/frame/rpc/support/src/lib.rs +++ b/substrate/utils/frame/rpc/support/src/lib.rs @@ -23,7 +23,7 @@ use codec::{DecodeAll, FullCodec, FullEncode}; use core::marker::PhantomData; use frame_support::storage::generator::{StorageDoubleMap, StorageMap, StorageValue}; -use jsonrpsee::core::Error as RpcError; +use jsonrpsee::core::ClientError as RpcError; use sc_rpc_api::state::StateApiClient; use serde::{de::DeserializeOwned, Serialize}; use sp_storage::{StorageData, StorageKey}; @@ -31,7 +31,7 @@ use sp_storage::{StorageData, StorageKey}; /// A typed query on chain state usable from an RPC client. /// /// ```no_run -/// # use jsonrpsee::core::Error as RpcError; +/// # use jsonrpsee::core::ClientError as RpcError; /// # use jsonrpsee::ws_client::WsClientBuilder; /// # use codec::Encode; /// # use frame_support::{construct_runtime, derive_impl, traits::ConstU32}; @@ -49,7 +49,7 @@ use sp_storage::{StorageData, StorageKey}; /// # /// # type Hash = sp_core::H256; /// # -/// # #[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +/// # #[derive_impl(frame_system::config_preludes::TestDefaultConfig)] /// # impl frame_system::Config for TestRuntime { /// # type BaseCallFilter = (); /// # type BlockWeights = (); @@ -161,7 +161,7 @@ impl StorageQuery { /// Send this query over RPC, await the typed result. /// - /// Hash should be `::Hash`. + /// Hash should be `::Hash`. /// /// # Arguments /// diff --git a/substrate/utils/frame/rpc/system/Cargo.toml b/substrate/utils/frame/rpc/system/Cargo.toml index 3f06ffe2bc2ee4ce5e96cb8e1e25bb7affff1779..9e571bef9d04fd6025990755a2ecae79e180f335 100644 --- a/substrate/utils/frame/rpc/system/Cargo.toml +++ b/substrate/utils/frame/rpc/system/Cargo.toml @@ -17,9 +17,9 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1" } -jsonrpsee = { version = "0.20.3", features = ["client-core", "macros", "server"] } -futures = "0.3.21" -log = "0.4.17" +jsonrpsee = { version = "0.22", features = ["client-core", "macros", "server"] } +futures = "0.3.30" +log = { workspace = true, default-features = true } frame-system-rpc-runtime-api = { path = "../../../../frame/system/rpc/runtime-api" } sc-rpc-api = { path = "../../../../client/rpc-api" } sc-transaction-pool-api = { path = "../../../../client/transaction-pool/api" } @@ -31,7 +31,7 @@ sp-runtime = { path = "../../../../primitives/runtime" } [dev-dependencies] sc-transaction-pool = { path = "../../../../client/transaction-pool" } -tokio = "1.22.0" +tokio = "1.37" assert_matches = "1.3.0" sp-tracing = { path = "../../../../primitives/tracing" } substrate-test-runtime-client = { path = "../../../../test-utils/runtime/client" } diff --git a/substrate/utils/frame/try-runtime/cli/Cargo.toml b/substrate/utils/frame/try-runtime/cli/Cargo.toml deleted file mode 100644 index 1550a2cec4b054a5d8b9dc3874855dc705cc5336..0000000000000000000000000000000000000000 --- a/substrate/utils/frame/try-runtime/cli/Cargo.toml +++ /dev/null @@ -1,63 +0,0 @@ -[package] -name = "try-runtime-cli" -version = "0.38.0" -authors.workspace = true -edition.workspace = true -license = "Apache-2.0" -homepage = "https://substrate.io" -repository.workspace = true -description = "Cli command runtime testing and dry-running" - -[lints] -workspace = true - -[package.metadata.docs.rs] -targets = ["x86_64-unknown-linux-gnu"] - -[dependencies] -remote-externalities = { package = "frame-remote-externalities", path = "../../remote-externalities" } -sc-cli = { path = "../../../../client/cli" } -sc-executor = { path = "../../../../client/executor" } -sp-consensus-aura = { path = "../../../../primitives/consensus/aura" } -sp-consensus-babe = { path = "../../../../primitives/consensus/babe" } -sp-core = { path = "../../../../primitives/core" } -sp-externalities = { path = "../../../../primitives/externalities" } -sp-inherents = { path = "../../../../primitives/inherents" } -sp-io = { path = "../../../../primitives/io" } -sp-keystore = { path = "../../../../primitives/keystore" } -sp-runtime = { path = "../../../../primitives/runtime" } -sp-rpc = { path = "../../../../primitives/rpc" } -sp-state-machine = { path = "../../../../primitives/state-machine" } -sp-timestamp = { path = "../../../../primitives/timestamp" } -sp-transaction-storage-proof = { path = "../../../../primitives/transaction-storage-proof" } -sp-version = { path = "../../../../primitives/version" } -sp-debug-derive = { path = "../../../../primitives/debug-derive" } -sp-api = { path = "../../../../primitives/api" } -sp-weights = { path = "../../../../primitives/weights" } -frame-try-runtime = { path = "../../../../frame/try-runtime", optional = true } -substrate-rpc-client = { path = "../../rpc/client" } - -async-trait = "0.1.74" -clap = { version = "4.4.18", features = ["derive"] } -hex = { version = "0.4.3", default-features = false } -log = "0.4.17" -parity-scale-codec = "3.6.1" -serde = "1.0.195" -serde_json = "1.0.111" -zstd = { version = "0.12.4", default-features = false } - -[dev-dependencies] -assert_cmd = "2.0.10" -node-primitives = { path = "../../../../bin/node/primitives" } -regex = "1.7.3" -substrate-cli-test-utils = { path = "../../../../test-utils/cli" } -tempfile = "3.1.0" -tokio = "1.27.0" - -[features] -try-runtime = [ - "frame-try-runtime/try-runtime", - "sp-debug-derive/force-debug", - "sp-runtime/try-runtime", - "substrate-cli-test-utils/try-runtime", -] diff --git a/substrate/utils/frame/try-runtime/cli/src/block_building_info.rs b/substrate/utils/frame/try-runtime/cli/src/block_building_info.rs deleted file mode 100644 index db24d06ef0a157c81bc2f114b76352117a671a3a..0000000000000000000000000000000000000000 --- a/substrate/utils/frame/try-runtime/cli/src/block_building_info.rs +++ /dev/null @@ -1,152 +0,0 @@ -// This file is part of Substrate. - -// Copyright (C) Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -use crate::BlockT; -use parity_scale_codec::Encode; -use sc_cli::Result; -use sp_consensus_aura::{Slot, SlotDuration, AURA_ENGINE_ID}; -use sp_consensus_babe::{ - digests::{PreDigest, SecondaryPlainPreDigest}, - BABE_ENGINE_ID, -}; -use sp_inherents::{InherentData, InherentDataProvider}; -use sp_runtime::{Digest, DigestItem}; -use sp_timestamp::TimestampInherentData; - -/// Something that can create inherent data providers and pre-runtime digest. -/// -/// It is possible for the caller to provide custom arguments to the callee by setting the -/// `ExtraArgs` generic parameter. -/// -/// This module already provides some convenience implementation of this trait for closures. So, it -/// should not be required to implement it directly. -#[async_trait::async_trait] -pub trait BlockBuildingInfoProvider { - type InherentDataProviders: InherentDataProvider; - - async fn get_inherent_providers_and_pre_digest( - &self, - parent_hash: Block::Hash, - extra_args: ExtraArgs, - ) -> Result<(Self::InherentDataProviders, Vec)>; -} - -#[async_trait::async_trait] -impl BlockBuildingInfoProvider for F -where - Block: BlockT, - F: Fn(Block::Hash, ExtraArgs) -> Fut + Sync + Send, - Fut: std::future::Future)>> + Send + 'static, - IDP: InherentDataProvider + 'static, - ExtraArgs: Send + 'static, -{ - type InherentDataProviders = IDP; - - async fn get_inherent_providers_and_pre_digest( - &self, - parent: Block::Hash, - extra_args: ExtraArgs, - ) -> Result<(Self::InherentDataProviders, Vec)> { - (*self)(parent, extra_args).await - } -} - -/// Provides [`BlockBuildingInfoProvider`] implementation for chains that include timestamp inherent -/// and use Aura for a block production. -/// -/// It depends only on the expected block production frequency, i.e. `blocktime_millis`. -pub fn timestamp_with_aura_info( - blocktime_millis: u64, -) -> impl BlockBuildingInfoProvider> { - move |_, maybe_prev_info: Option<(InherentData, Digest)>| async move { - let timestamp_idp = match maybe_prev_info { - Some((inherent_data, _)) => sp_timestamp::InherentDataProvider::new( - inherent_data.timestamp_inherent_data().unwrap().unwrap() + blocktime_millis, - ), - None => sp_timestamp::InherentDataProvider::from_system_time(), - }; - - let slot = - Slot::from_timestamp(*timestamp_idp, SlotDuration::from_millis(blocktime_millis)); - let digest = vec![DigestItem::PreRuntime(AURA_ENGINE_ID, slot.encode())]; - - Ok((timestamp_idp, digest)) - } -} - -/// Provides [`BlockBuildingInfoProvider`] implementation for chains that include timestamp inherent -/// and use Babe for a block production. -/// -/// It depends only on the expected block production frequency, i.e. `blocktime_millis`. -pub fn timestamp_with_babe_info( - blocktime_millis: u64, -) -> impl BlockBuildingInfoProvider> { - move |_, maybe_prev_info: Option<(InherentData, Digest)>| async move { - let timestamp_idp = match maybe_prev_info { - Some((inherent_data, _)) => sp_timestamp::InherentDataProvider::new( - inherent_data.timestamp_inherent_data().unwrap().unwrap() + blocktime_millis, - ), - None => sp_timestamp::InherentDataProvider::from_system_time(), - }; - - let slot = - Slot::from_timestamp(*timestamp_idp, SlotDuration::from_millis(blocktime_millis)); - let slot_idp = sp_consensus_babe::inherents::InherentDataProvider::new(slot); - - let digest = vec![DigestItem::PreRuntime( - BABE_ENGINE_ID, - PreDigest::SecondaryPlain(SecondaryPlainPreDigest { slot, authority_index: 0 }) - .encode(), - )]; - - Ok(((slot_idp, timestamp_idp), digest)) - } -} - -/// Provides [`BlockBuildingInfoProvider`] implementation for chains that use: -/// - timestamp inherent, -/// - Babe for a block production (inherent + digest), -/// - uncles inherent, -/// - storage proof inherent -/// -/// It depends only on the expected block production frequency, i.e. `blocktime_millis`. -pub fn substrate_info( - blocktime_millis: u64, -) -> impl BlockBuildingInfoProvider> { - move |_, maybe_prev_info: Option<(InherentData, Digest)>| async move { - let timestamp_idp = match maybe_prev_info { - Some((inherent_data, _)) => sp_timestamp::InherentDataProvider::new( - inherent_data.timestamp_inherent_data().unwrap().unwrap() + blocktime_millis, - ), - None => sp_timestamp::InherentDataProvider::from_system_time(), - }; - - let slot = - Slot::from_timestamp(*timestamp_idp, SlotDuration::from_millis(blocktime_millis)); - let slot_idp = sp_consensus_babe::inherents::InherentDataProvider::new(slot); - - let storage_proof_idp = sp_transaction_storage_proof::InherentDataProvider::new(None); - - let digest = vec![DigestItem::PreRuntime( - BABE_ENGINE_ID, - PreDigest::SecondaryPlain(SecondaryPlainPreDigest { slot, authority_index: 0 }) - .encode(), - )]; - - Ok(((slot_idp, timestamp_idp, storage_proof_idp), digest)) - } -} diff --git a/substrate/utils/frame/try-runtime/cli/src/commands/create_snapshot.rs b/substrate/utils/frame/try-runtime/cli/src/commands/create_snapshot.rs deleted file mode 100644 index 102336d644219aae35c84d6aa3de4838bd527ef2..0000000000000000000000000000000000000000 --- a/substrate/utils/frame/try-runtime/cli/src/commands/create_snapshot.rs +++ /dev/null @@ -1,78 +0,0 @@ -// This file is part of Substrate. - -// Copyright (C) Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -use crate::{build_executor, LiveState, SharedParams, State, LOG_TARGET}; -use sc_executor::sp_wasm_interface::HostFunctions; -use sp_runtime::traits::{Block as BlockT, NumberFor}; -use std::{fmt::Debug, str::FromStr}; -use substrate_rpc_client::{ws_client, StateApi}; - -/// Configurations of the [`crate::Command::CreateSnapshot`]. -#[derive(Debug, Clone, clap::Parser)] -pub struct CreateSnapshotCmd { - /// The source of the snapshot. Must be a remote node. - #[clap(flatten)] - pub from: LiveState, - - /// The snapshot path to write to. - /// - /// If not provided `-@.snap` will be used. - pub snapshot_path: Option, -} - -/// inner command for `Command::CreateSnapshot`. -pub(crate) async fn create_snapshot( - shared: SharedParams, - command: CreateSnapshotCmd, -) -> sc_cli::Result<()> -where - Block: BlockT + serde::de::DeserializeOwned, - Block::Hash: serde::de::DeserializeOwned, - Block::Header: serde::de::DeserializeOwned, - ::Err: Debug, - NumberFor: FromStr, - as FromStr>::Err: Debug, - HostFns: HostFunctions, -{ - let snapshot_path = command.snapshot_path; - if !matches!(shared.runtime, crate::Runtime::Existing) { - return Err("creating a snapshot is only possible with --runtime existing.".into()) - } - - let path = match snapshot_path { - Some(path) => path, - None => { - let rpc = ws_client(&command.from.uri).await.unwrap(); - let remote_spec = StateApi::::runtime_version(&rpc, None).await.unwrap(); - let path_str = format!( - "{}-{}@{}.snap", - remote_spec.spec_name.to_lowercase(), - remote_spec.spec_version, - command.from.at.clone().unwrap_or("latest".to_owned()) - ); - log::info!(target: LOG_TARGET, "snapshot path not provided (-s), using '{}'", path_str); - path_str.into() - }, - }; - - let executor = build_executor::(&shared); - let _ = State::Live(command.from) - .into_ext::(&shared, &executor, Some(path.into()), false) - .await?; - - Ok(()) -} diff --git a/substrate/utils/frame/try-runtime/cli/src/commands/execute_block.rs b/substrate/utils/frame/try-runtime/cli/src/commands/execute_block.rs deleted file mode 100644 index 1f1b6ec7d9b910feab8591afa8358d1cfbfef811..0000000000000000000000000000000000000000 --- a/substrate/utils/frame/try-runtime/cli/src/commands/execute_block.rs +++ /dev/null @@ -1,170 +0,0 @@ -// This file is part of Substrate. - -// Copyright (C) Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -use crate::{ - build_executor, full_extensions, rpc_err_handler, state_machine_call_with_proof, LiveState, - SharedParams, State, LOG_TARGET, -}; -use parity_scale_codec::Encode; -use sc_executor::sp_wasm_interface::HostFunctions; -use sp_rpc::{list::ListOrValue, number::NumberOrHex}; -use sp_runtime::{ - generic::SignedBlock, - traits::{Block as BlockT, Header as HeaderT, NumberFor}, -}; -use std::{fmt::Debug, str::FromStr}; -use substrate_rpc_client::{ws_client, ChainApi}; - -/// Configurations of the [`crate::Command::ExecuteBlock`]. -/// -/// This will always call into `TryRuntime_execute_block`, which can optionally skip the state-root -/// check (useful for trying a unreleased runtime), and can execute runtime sanity checks as well. -#[derive(Debug, Clone, clap::Parser)] -pub struct ExecuteBlockCmd { - /// Which try-state targets to execute when running this command. - /// - /// Expected values: - /// - `all` - /// - `none` - /// - A comma separated list of pallets, as per pallet names in `construct_runtime!()` (e.g. - /// `Staking, System`). - /// - `rr-[x]` where `[x]` is a number. Then, the given number of pallets are checked in a - /// round-robin fashion. - #[arg(long, default_value = "all")] - pub try_state: frame_try_runtime::TryStateSelect, - - /// The ws uri from which to fetch the block. - /// - /// This will always fetch the next block of whatever `state` is referring to, because this is - /// the only sensible combination. In other words, if you have the state of block `n`, you - /// should execute block `n+1` on top of it. - /// - /// If `state` is `Live`, this can be ignored and the same uri is used for both. - #[arg( - long, - value_parser = crate::parse::url - )] - pub block_ws_uri: Option, - - /// The state type to use. - #[command(subcommand)] - pub state: State, -} - -impl ExecuteBlockCmd { - fn block_ws_uri(&self) -> String - where - ::Err: Debug, - { - match (&self.block_ws_uri, &self.state) { - (Some(block_ws_uri), State::Snap { .. }) => block_ws_uri.to_owned(), - (Some(block_ws_uri), State::Live { .. }) => { - log::error!(target: LOG_TARGET, "--block-uri is provided while state type is live, Are you sure you know what you are doing?"); - block_ws_uri.to_owned() - }, - (None, State::Live(LiveState { uri, .. })) => uri.clone(), - (None, State::Snap { .. }) => { - panic!("either `--block-uri` must be provided, or state must be `live`"); - }, - } - } -} - -pub(crate) async fn execute_block( - shared: SharedParams, - command: ExecuteBlockCmd, -) -> sc_cli::Result<()> -where - Block: BlockT + serde::de::DeserializeOwned, - ::Err: Debug, - Block::Hash: serde::de::DeserializeOwned, - Block::Header: serde::de::DeserializeOwned, - as TryInto>::Error: Debug, - HostFns: HostFunctions, -{ - let executor = build_executor::(&shared); - let ext = command.state.into_ext::(&shared, &executor, None, true).await?; - - // get the block number associated with this block. - let block_ws_uri = command.block_ws_uri::(); - let rpc = ws_client(&block_ws_uri).await?; - let next_hash = next_hash_of::(&rpc, ext.block_hash).await?; - - log::info!(target: LOG_TARGET, "fetching next block: {:?} ", next_hash); - - let block = ChainApi::<(), Block::Hash, Block::Header, SignedBlock>::block( - &rpc, - Some(next_hash), - ) - .await - .map_err(rpc_err_handler)? - .expect("header exists, block should also exist; qed") - .block; - - // A digest item gets added when the runtime is processing the block, so we need to pop - // the last one to be consistent with what a gossiped block would contain. - let (mut header, extrinsics) = block.deconstruct(); - header.digest_mut().pop(); - let block = Block::new(header, extrinsics); - - // for now, hardcoded for the sake of simplicity. We might customize them one day. - let state_root_check = false; - let signature_check = false; - let payload = (block.clone(), state_root_check, signature_check, command.try_state).encode(); - - let _ = state_machine_call_with_proof::( - &ext, - &executor, - "TryRuntime_execute_block", - &payload, - full_extensions(executor.clone()), - shared.export_proof, - )?; - - Ok(()) -} - -pub(crate) async fn next_hash_of( - rpc: &substrate_rpc_client::WsClient, - hash: Block::Hash, -) -> sc_cli::Result -where - Block: BlockT + serde::de::DeserializeOwned, - Block::Header: serde::de::DeserializeOwned, -{ - let number = ChainApi::<(), Block::Hash, Block::Header, ()>::header(rpc, Some(hash)) - .await - .map_err(rpc_err_handler) - .and_then(|maybe_header| maybe_header.ok_or("header_not_found").map(|h| *h.number()))?; - - let next = number + sp_runtime::traits::One::one(); - - let next_hash = match ChainApi::<(), Block::Hash, Block::Header, ()>::block_hash( - rpc, - Some(ListOrValue::Value(NumberOrHex::Number( - next.try_into().map_err(|_| "failed to convert number to block number")?, - ))), - ) - .await - .map_err(rpc_err_handler)? - { - ListOrValue::Value(t) => t.expect("value passed in; value comes out; qed"), - _ => unreachable!(), - }; - - Ok(next_hash) -} diff --git a/substrate/utils/frame/try-runtime/cli/src/commands/fast_forward.rs b/substrate/utils/frame/try-runtime/cli/src/commands/fast_forward.rs deleted file mode 100644 index f1dee16debe7339edc4f3cc1ba01829f2fbacc99..0000000000000000000000000000000000000000 --- a/substrate/utils/frame/try-runtime/cli/src/commands/fast_forward.rs +++ /dev/null @@ -1,262 +0,0 @@ -// This file is part of Substrate. - -// Copyright (C) Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -use crate::{ - block_building_info::BlockBuildingInfoProvider, build_executor, full_extensions, - rpc_err_handler, state_machine_call, BlockT, LiveState, SharedParams, State, -}; -use parity_scale_codec::{Decode, Encode}; -use sc_cli::Result; -use sc_executor::{sp_wasm_interface::HostFunctions, WasmExecutor}; -use serde::de::DeserializeOwned; -use sp_core::H256; -use sp_inherents::{InherentData, InherentDataProvider}; -use sp_runtime::{ - traits::{HashingFor, Header, NumberFor, One}, - Digest, -}; -use sp_state_machine::TestExternalities; -use std::{fmt::Debug, str::FromStr}; -use substrate_rpc_client::{ws_client, ChainApi}; - -/// Configurations of the [`crate::Command::FastForward`]. -#[derive(Debug, Clone, clap::Parser)] -pub struct FastForwardCmd { - /// How many blocks should be processed. If `None`, then blocks will be produced and processed - /// in a loop. - #[arg(long)] - n_blocks: Option, - - /// The state type to use. - #[command(subcommand)] - state: State, - - /// The ws uri from which to fetch the block. - /// - /// If `state` is `Live`, this is ignored. Otherwise, it must not be empty. - #[arg(long, value_parser = crate::parse::url)] - block_ws_uri: Option, - - /// Which try-state targets to execute when running this command. - /// - /// Expected values: - /// - `all` - /// - `none` - /// - A comma separated list of pallets, as per pallet names in `construct_runtime!()` (e.g. - /// `Staking, System`). - /// - `rr-[x]` where `[x]` is a number. Then, the given number of pallets are checked in a - /// round-robin fashion. - #[arg(long, default_value = "all")] - try_state: frame_try_runtime::TryStateSelect, -} - -impl FastForwardCmd { - fn block_ws_uri(&self) -> &str { - match self.state { - State::Live(LiveState { ref uri, .. }) => &uri, - _ => self - .block_ws_uri - .as_ref() - .expect("Either `--block-uri` must be provided, or state must be `live`"), - } - } -} - -/// Read the block number corresponding to `hash` with an RPC call to `ws_uri`. -async fn get_block_number( - hash: Block::Hash, - ws_uri: &str, -) -> Result> -where - Block::Header: DeserializeOwned, -{ - let rpc = ws_client(ws_uri).await?; - Ok(ChainApi::<(), Block::Hash, Block::Header, ()>::header(&rpc, Some(hash)) - .await - .map_err(rpc_err_handler) - .and_then(|maybe_header| maybe_header.ok_or("header_not_found").map(|h| *h.number()))?) -} - -/// Call `method` with `data` and return the result. `externalities` will not change. -fn dry_run( - externalities: &TestExternalities>, - executor: &WasmExecutor, - method: &'static str, - data: &[u8], -) -> Result { - let (_, result) = state_machine_call::( - externalities, - executor, - method, - data, - full_extensions(executor.clone()), - )?; - - Ok(::decode(&mut &*result)?) -} - -/// Call `method` with `data` and actually save storage changes to `externalities`. -async fn run( - externalities: &mut TestExternalities>, - executor: &WasmExecutor, - method: &'static str, - data: &[u8], -) -> Result<()> { - let (mut changes, _) = state_machine_call::( - externalities, - executor, - method, - data, - full_extensions(executor.clone()), - )?; - - let storage_changes = - changes.drain_storage_changes(&externalities.backend, externalities.state_version)?; - - externalities - .backend - .apply_transaction(storage_changes.transaction_storage_root, storage_changes.transaction); - - Ok(()) -} - -/// Produce next empty block. -async fn next_empty_block< - Block: BlockT, - HostFns: HostFunctions, - BBIP: BlockBuildingInfoProvider>, ->( - externalities: &mut TestExternalities>, - executor: &WasmExecutor, - parent_height: NumberFor, - parent_hash: Block::Hash, - block_building_info_provider: &Option, - previous_block_building_info: Option<(InherentData, Digest)>, -) -> Result<(Block, Option<(InherentData, Digest)>)> { - let (maybe_inherent_data, pre_digest) = match &block_building_info_provider { - None => (None, Default::default()), - Some(bbip) => { - let (inherent_data_provider, pre_digest) = bbip - .get_inherent_providers_and_pre_digest(parent_hash, previous_block_building_info) - .await?; - let inherent_data = inherent_data_provider - .create_inherent_data() - .await - .map_err(|e| sc_cli::Error::Input(format!("I don't know how to convert {e:?}")))?; - - (Some(inherent_data), Digest { logs: pre_digest }) - }, - }; - - let header = Block::Header::new( - parent_height + One::one(), - Default::default(), - Default::default(), - parent_hash, - pre_digest.clone(), - ); - let mut extrinsics = >::new(); - - run::(externalities, executor, "Core_initialize_block", &header.encode()).await?; - - if let Some(ref inherent_data) = maybe_inherent_data { - extrinsics = dry_run::, Block, _>( - externalities, - executor, - "BlockBuilder_inherent_extrinsics", - &inherent_data.encode(), - )?; - } - - for xt in &extrinsics { - run::(externalities, executor, "BlockBuilder_apply_extrinsic", &xt.encode()) - .await?; - } - - let header = dry_run::( - externalities, - executor, - "BlockBuilder_finalize_block", - &[0u8; 0], - )?; - - run::(externalities, executor, "BlockBuilder_finalize_block", &[0u8; 0]).await?; - - Ok((Block::new(header, extrinsics), (maybe_inherent_data.map(|id| (id, pre_digest))))) -} - -pub(crate) async fn fast_forward( - shared: SharedParams, - command: FastForwardCmd, - block_building_info_provider: Option, -) -> Result<()> -where - Block: BlockT + DeserializeOwned, - Block::Header: DeserializeOwned, - ::Err: Debug, - NumberFor: FromStr, - as FromStr>::Err: Debug, - HostFns: HostFunctions, - BBIP: BlockBuildingInfoProvider>, -{ - let executor = build_executor::(&shared); - let ext = command.state.into_ext::(&shared, &executor, None, true).await?; - - let mut last_block_hash = ext.block_hash; - let mut last_block_number = - get_block_number::(last_block_hash, command.block_ws_uri()).await?; - let mut prev_block_building_info = None; - - let mut ext = ext.inner_ext; - - for _ in 1..=command.n_blocks.unwrap_or(u64::MAX) { - // We are saving state before we overwrite it while producing new block. - let backend = ext.as_backend(); - - log::info!("Producing new empty block at height {:?}", last_block_number + One::one()); - - let (next_block, new_block_building_info) = next_empty_block::( - &mut ext, - &executor, - last_block_number, - last_block_hash, - &block_building_info_provider, - prev_block_building_info, - ) - .await?; - - log::info!("Produced a new block: {:?}", next_block.header()); - - // And now we restore previous state. - ext.backend = backend; - - let state_root_check = true; - let signature_check = true; - let payload = - (next_block.clone(), state_root_check, signature_check, command.try_state.clone()) - .encode(); - run::(&mut ext, &executor, "TryRuntime_execute_block", &payload).await?; - - log::info!("Executed the new block"); - - prev_block_building_info = new_block_building_info; - last_block_hash = next_block.hash(); - last_block_number += One::one(); - } - - Ok(()) -} diff --git a/substrate/utils/frame/try-runtime/cli/src/commands/follow_chain.rs b/substrate/utils/frame/try-runtime/cli/src/commands/follow_chain.rs deleted file mode 100644 index 53db5e64346326944554b82dcb572f3fe0299e7c..0000000000000000000000000000000000000000 --- a/substrate/utils/frame/try-runtime/cli/src/commands/follow_chain.rs +++ /dev/null @@ -1,203 +0,0 @@ -// This file is part of Substrate. - -// Copyright (C) Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -use crate::{ - build_executor, full_extensions, parse, rpc_err_handler, state_machine_call_with_proof, - LiveState, SharedParams, State, LOG_TARGET, -}; -use parity_scale_codec::{Decode, Encode}; -use sc_executor::sp_wasm_interface::HostFunctions; -use serde::{de::DeserializeOwned, Serialize}; -use sp_core::H256; -use sp_runtime::{ - generic::SignedBlock, - traits::{Block as BlockT, Header as HeaderT, NumberFor}, -}; -use std::{fmt::Debug, str::FromStr}; -use substrate_rpc_client::{ws_client, ChainApi, FinalizedHeaders, Subscription, WsClient}; - -const SUB: &str = "chain_subscribeFinalizedHeads"; -const UN_SUB: &str = "chain_unsubscribeFinalizedHeads"; - -/// Configurations of the [`crate::Command::FollowChain`]. -#[derive(Debug, Clone, clap::Parser)] -pub struct FollowChainCmd { - /// The url to connect to. - #[arg(short, long, value_parser = parse::url)] - pub uri: String, - - /// If set, then the state root check is enabled. - #[arg(long)] - pub state_root_check: bool, - - /// Which try-state targets to execute when running this command. - /// - /// Expected values: - /// - `all` - /// - `none` - /// - A comma separated list of pallets, as per pallet names in `construct_runtime!()` (e.g. - /// `Staking, System`). - /// - `rr-[x]` where `[x]` is a number. Then, the given number of pallets are checked in a - /// round-robin fashion. - #[arg(long, default_value = "all")] - pub try_state: frame_try_runtime::TryStateSelect, - - /// If present, a single connection to a node will be kept and reused for fetching blocks. - #[arg(long)] - pub keep_connection: bool, -} - -/// Start listening for with `SUB` at `url`. -/// -/// Returns a pair `(client, subscription)` - `subscription` alone will be useless, because it -/// relies on the related alive `client`. -async fn start_subscribing( - url: &str, -) -> sc_cli::Result<(WsClient, Subscription

)> { - let client = ws_client(url).await.map_err(|e| sc_cli::Error::Application(e.into()))?; - - log::info!(target: LOG_TARGET, "subscribing to {:?} / {:?}", SUB, UN_SUB); - - let sub = ChainApi::<(), (), Header, ()>::subscribe_finalized_heads(&client) - .await - .map_err(|e| sc_cli::Error::Application(e.into()))?; - Ok((client, sub)) -} - -pub(crate) async fn follow_chain( - shared: SharedParams, - command: FollowChainCmd, -) -> sc_cli::Result<()> -where - Block: BlockT + DeserializeOwned, - Block::Header: DeserializeOwned, - ::Err: Debug, - NumberFor: FromStr, - as FromStr>::Err: Debug, - HostFns: HostFunctions, -{ - let (rpc, subscription) = start_subscribing::(&command.uri).await?; - let mut finalized_headers: FinalizedHeaders = - FinalizedHeaders::new(&rpc, subscription); - - let mut maybe_state_ext = None; - let executor = build_executor::(&shared); - - while let Some(header) = finalized_headers.next().await { - let hash = header.hash(); - let number = header.number(); - - let block = - ChainApi::<(), Block::Hash, Block::Header, SignedBlock>::block(&rpc, Some(hash)) - .await - .or_else(|e| { - if matches!(e, substrate_rpc_client::Error::ParseError(_)) { - log::error!( - target: LOG_TARGET, - "failed to parse the block format of remote against the local \ - codebase. The block format has changed, and follow-chain cannot run in \ - this case. Try running this command in a branch of your codebase that - has the same block format as the remote chain. For now, we replace the \ - block with an empty one." - ); - } - Err(rpc_err_handler(e)) - })? - .expect("if header exists, block should also exist.") - .block; - - log::debug!( - target: LOG_TARGET, - "new block event: {:?} => {:?}, extrinsics: {}", - hash, - number, - block.extrinsics().len() - ); - - // create an ext at the state of this block, whatever is the first subscription event. - if maybe_state_ext.is_none() { - let state = State::Live(LiveState { - uri: command.uri.clone(), - // a bit dodgy, we have to un-parse the has to a string again and re-parse it - // inside. - at: Some(hex::encode(header.parent_hash().encode())), - pallet: vec![], - child_tree: true, - }); - let ext = state.into_ext::(&shared, &executor, None, true).await?; - maybe_state_ext = Some(ext); - } - - let state_ext = - maybe_state_ext.as_mut().expect("state_ext either existed or was just created"); - - let result = state_machine_call_with_proof::( - state_ext, - &executor, - "TryRuntime_execute_block", - (block, command.state_root_check, true, command.try_state.clone()) - .encode() - .as_ref(), - full_extensions(executor.clone()), - shared - .export_proof - .as_ref() - .map(|path| path.as_path().join(&format!("{}.json", number))), - ); - - if let Err(why) = result { - log::error!( - target: LOG_TARGET, - "failed to execute block {:?} due to {:?}", - number, - why - ); - continue - } - - let (mut changes, encoded_result) = result.expect("checked to be Ok; qed"); - - let consumed_weight = ::decode(&mut &*encoded_result) - .map_err(|e| format!("failed to decode weight: {:?}", e))?; - - let storage_changes = changes - .drain_storage_changes( - &state_ext.backend, - // Note that in case a block contains a runtime upgrade, state version could - // potentially be incorrect here, this is very niche and would only result in - // unaligned roots, so this use case is ignored for now. - state_ext.state_version, - ) - .unwrap(); - - state_ext.backend.apply_transaction( - storage_changes.transaction_storage_root, - storage_changes.transaction, - ); - - log::info!( - target: LOG_TARGET, - "executed block {}, consumed weight {}, new storage root {:?}", - number, - consumed_weight, - state_ext.as_backend().root(), - ); - } - - log::error!(target: LOG_TARGET, "ws subscription must have terminated."); - Ok(()) -} diff --git a/substrate/utils/frame/try-runtime/cli/src/commands/offchain_worker.rs b/substrate/utils/frame/try-runtime/cli/src/commands/offchain_worker.rs deleted file mode 100644 index ac95384fb8aa5a128a116e5f7e6bc2ec3b23aa6d..0000000000000000000000000000000000000000 --- a/substrate/utils/frame/try-runtime/cli/src/commands/offchain_worker.rs +++ /dev/null @@ -1,102 +0,0 @@ -// This file is part of Substrate. - -// Copyright (C) Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -use crate::{ - build_executor, commands::execute_block::next_hash_of, full_extensions, parse, rpc_err_handler, - state_machine_call, LiveState, SharedParams, State, LOG_TARGET, -}; -use parity_scale_codec::Encode; -use sc_executor::sp_wasm_interface::HostFunctions; -use sp_runtime::traits::{Block as BlockT, NumberFor}; -use std::{fmt::Debug, str::FromStr}; -use substrate_rpc_client::{ws_client, ChainApi}; - -/// Configurations of the [`crate::Command::OffchainWorker`]. -#[derive(Debug, Clone, clap::Parser)] -pub struct OffchainWorkerCmd { - /// The ws uri from which to fetch the header. - /// - /// If the `live` state type is being used, then this can be omitted, and is equal to whatever - /// the `state::uri` is. Only use this (with care) when combined with a snapshot. - #[arg( - long, - value_parser = parse::url - )] - pub header_ws_uri: Option, - - /// The state type to use. - #[command(subcommand)] - pub state: State, -} - -impl OffchainWorkerCmd { - fn header_ws_uri(&self) -> String - where - ::Err: Debug, - { - match (&self.header_ws_uri, &self.state) { - (Some(header_ws_uri), State::Snap { .. }) => header_ws_uri.to_owned(), - (Some(header_ws_uri), State::Live { .. }) => { - log::error!(target: LOG_TARGET, "--header-uri is provided while state type is live, this will most likely lead to a nonsensical result."); - header_ws_uri.to_owned() - }, - (None, State::Live(LiveState { uri, .. })) => uri.clone(), - (None, State::Snap { .. }) => { - panic!("either `--header-uri` must be provided, or state must be `live`"); - }, - } - } -} - -pub(crate) async fn offchain_worker( - shared: SharedParams, - command: OffchainWorkerCmd, -) -> sc_cli::Result<()> -where - Block: BlockT + serde::de::DeserializeOwned, - Block::Header: serde::de::DeserializeOwned, - ::Err: Debug, - NumberFor: FromStr, - as FromStr>::Err: Debug, - HostFns: HostFunctions, -{ - let executor = build_executor(&shared); - // we first build the externalities with the remote code. - let ext = command.state.into_ext::(&shared, &executor, None, true).await?; - - let header_ws_uri = command.header_ws_uri::(); - - let rpc = ws_client(&header_ws_uri).await?; - let next_hash = next_hash_of::(&rpc, ext.block_hash).await?; - log::info!(target: LOG_TARGET, "fetching next header: {:?} ", next_hash); - - let header = ChainApi::<(), Block::Hash, Block::Header, ()>::header(&rpc, Some(next_hash)) - .await - .map_err(rpc_err_handler) - .map(|maybe_header| maybe_header.ok_or("Header does not exist"))??; - let payload = header.encode(); - - let _ = state_machine_call::( - &ext, - &executor, - "OffchainWorkerApi_offchain_worker", - &payload, - full_extensions(executor.clone()), - )?; - - Ok(()) -} diff --git a/substrate/utils/frame/try-runtime/cli/src/commands/on_runtime_upgrade.rs b/substrate/utils/frame/try-runtime/cli/src/commands/on_runtime_upgrade.rs deleted file mode 100644 index 67988a3d1aadad2d53778e1626166c4a00a47584..0000000000000000000000000000000000000000 --- a/substrate/utils/frame/try-runtime/cli/src/commands/on_runtime_upgrade.rs +++ /dev/null @@ -1,89 +0,0 @@ -// This file is part of Substrate. - -// Copyright (C) Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -use crate::{build_executor, state_machine_call_with_proof, SharedParams, State, LOG_TARGET}; -use frame_try_runtime::UpgradeCheckSelect; -use parity_scale_codec::{Decode, Encode}; -use sc_executor::sp_wasm_interface::HostFunctions; -use sp_runtime::traits::{Block as BlockT, NumberFor}; -use sp_weights::Weight; -use std::{fmt::Debug, str::FromStr}; - -/// Configurations of the [`crate::Command::OnRuntimeUpgrade`]. -#[derive(Debug, Clone, clap::Parser)] -pub struct OnRuntimeUpgradeCmd { - /// The state type to use. - #[command(subcommand)] - pub state: State, - - /// Select which optional checks to perform. Selects all when no value is given. - /// - /// - `none`: Perform no checks. - /// - `all`: Perform all checks (default when --checks is present with no value). - /// - `pre-and-post`: Perform pre- and post-upgrade checks (default when the arg is not - /// present). - /// - `try-state`: Perform the try-state checks. - /// - /// Performing any checks will potentially invalidate the measured PoV/Weight. - // NOTE: The clap attributes make it backwards compatible with the previous `--checks` flag. - #[clap(long, - default_value = "pre-and-post", - default_missing_value = "all", - num_args = 0..=1, - require_equals = true, - verbatim_doc_comment)] - pub checks: UpgradeCheckSelect, -} - -pub(crate) async fn on_runtime_upgrade( - shared: SharedParams, - command: OnRuntimeUpgradeCmd, -) -> sc_cli::Result<()> -where - Block: BlockT + serde::de::DeserializeOwned, - ::Err: Debug, - Block::Header: serde::de::DeserializeOwned, - NumberFor: FromStr, - as FromStr>::Err: Debug, - HostFns: HostFunctions, -{ - let executor = build_executor(&shared); - let ext = command.state.into_ext::(&shared, &executor, None, true).await?; - - let (_, encoded_result) = state_machine_call_with_proof::( - &ext, - &executor, - "TryRuntime_on_runtime_upgrade", - command.checks.encode().as_ref(), - Default::default(), // we don't really need any extensions here. - shared.export_proof, - )?; - - let (weight, total_weight) = <(Weight, Weight) as Decode>::decode(&mut &*encoded_result) - .map_err(|e| format!("failed to decode weight: {:?}", e))?; - - log::info!( - target: LOG_TARGET, - "TryRuntime_on_runtime_upgrade executed without errors. Consumed weight = ({} ps, {} byte), total weight = ({} ps, {} byte) ({:.2} %, {:.2} %).", - weight.ref_time(), weight.proof_size(), - total_weight.ref_time(), total_weight.proof_size(), - (weight.ref_time() as f64 / total_weight.ref_time().max(1) as f64) * 100.0, - (weight.proof_size() as f64 / total_weight.proof_size().max(1) as f64) * 100.0, - ); - - Ok(()) -} diff --git a/substrate/utils/frame/try-runtime/cli/src/lib.rs b/substrate/utils/frame/try-runtime/cli/src/lib.rs deleted file mode 100644 index 73952ce816af426e8ff6749879269cd2fe378abe..0000000000000000000000000000000000000000 --- a/substrate/utils/frame/try-runtime/cli/src/lib.rs +++ /dev/null @@ -1,701 +0,0 @@ -// This file is part of Substrate. - -// Copyright (C) Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -//! # Try-runtime -//! -//! Substrate's `try-runtime` subcommand has been migrated to a [standalone -//! CLI](https://github.com/paritytech/try-runtime-cli). -//! -//! It is no longer maintained here and will be removed in the future. - -#![cfg(feature = "try-runtime")] - -use crate::block_building_info::BlockBuildingInfoProvider; -use parity_scale_codec::Decode; -use remote_externalities::{ - Builder, Mode, OfflineConfig, OnlineConfig, RemoteExternalities, SnapshotConfig, -}; -use sc_cli::{ - execution_method_from_cli, CliConfiguration, RuntimeVersion, WasmExecutionMethod, - WasmtimeInstantiationStrategy, DEFAULT_WASMTIME_INSTANTIATION_STRATEGY, - DEFAULT_WASM_EXECUTION_METHOD, -}; -use sc_executor::{ - sp_wasm_interface::HostFunctions, HeapAllocStrategy, WasmExecutor, DEFAULT_HEAP_ALLOC_STRATEGY, -}; -use sp_core::{ - hexdisplay::HexDisplay, - offchain::{ - testing::{TestOffchainExt, TestTransactionPoolExt}, - OffchainDbExt, OffchainWorkerExt, TransactionPoolExt, - }, - storage::well_known_keys, - traits::{CallContext, ReadRuntimeVersion, ReadRuntimeVersionExt}, - twox_128, H256, -}; -use sp_externalities::Extensions; -use sp_inherents::InherentData; -use sp_keystore::{testing::MemoryKeystore, KeystoreExt}; -use sp_runtime::{ - traits::{BlakeTwo256, Block as BlockT, Hash as HashT, HashingFor, NumberFor}, - DeserializeOwned, Digest, -}; -use sp_state_machine::{ - CompactProof, OverlayedChanges, StateMachine, TestExternalities, TrieBackendBuilder, -}; -use sp_version::StateVersion; -use std::{fmt::Debug, path::PathBuf, str::FromStr}; - -pub mod block_building_info; -pub mod commands; -pub(crate) mod parse; -pub(crate) const LOG_TARGET: &str = "try-runtime::cli"; - -/// Possible commands of `try-runtime`. -#[derive(Debug, Clone, clap::Subcommand)] -pub enum Command { - /// Execute the migrations of the given runtime - /// - /// This uses a custom runtime api call, namely "TryRuntime_on_runtime_upgrade". The code path - /// only triggers all of the `on_runtime_upgrade` hooks in the runtime, and optionally - /// `try_state`. - /// - /// See [`frame_try_runtime::TryRuntime`] and - /// [`commands::on_runtime_upgrade::OnRuntimeUpgradeCmd`] for more information. - OnRuntimeUpgrade(commands::on_runtime_upgrade::OnRuntimeUpgradeCmd), - - /// Executes the given block against some state. - /// - /// This uses a custom runtime api call, namely "TryRuntime_execute_block". Some checks, such - /// as state-root and signature checks are always disabled, and additional checks like - /// `try-state` can be enabled. - /// - /// See [`frame_try_runtime::TryRuntime`] and [`commands::execute_block::ExecuteBlockCmd`] for - /// more information. - ExecuteBlock(commands::execute_block::ExecuteBlockCmd), - - /// Executes *the offchain worker hooks* of a given block against some state. - /// - /// This executes the same runtime api as normal block import, namely - /// `OffchainWorkerApi_offchain_worker`. - /// - /// See [`frame_try_runtime::TryRuntime`] and [`commands::offchain_worker::OffchainWorkerCmd`] - /// for more information. - OffchainWorker(commands::offchain_worker::OffchainWorkerCmd), - - /// Follow the given chain's finalized blocks and apply all of its extrinsics. - /// - /// This is essentially repeated calls to [`Command::ExecuteBlock`]. - /// - /// This allows the behavior of a new runtime to be inspected over a long period of time, with - /// realistic transactions coming as input. - /// - /// NOTE: this does NOT execute the offchain worker hooks of mirrored blocks. This might be - /// added in the future. - /// - /// This does not support snapshot states, and can only work with a remote chain. Upon first - /// connections, starts listening for finalized block events. Upon first block notification, it - /// initializes the state from the remote node, and starts applying that block, plus all the - /// blocks that follow, to the same growing state. - /// - /// This can only work if the block format between the remote chain and the new runtime being - /// tested has remained the same, otherwise block decoding might fail. - FollowChain(commands::follow_chain::FollowChainCmd), - - /// Produce a series of empty, consecutive blocks and execute them one-by-one. - /// - /// To compare it with [`Command::FollowChain`]: - /// - we don't have the delay of the original blocktime (for Polkadot 6s), but instead, we - /// execute every block immediately - /// - the only data that will be put into blocks are pre-runtime digest items and inherent - /// extrinsics; both things should be defined in your node CLI handling level - FastForward(commands::fast_forward::FastForwardCmd), - - /// Create a new snapshot file. - CreateSnapshot(commands::create_snapshot::CreateSnapshotCmd), -} - -#[derive(Debug, Clone)] -pub enum Runtime { - /// Use the given path to the wasm binary file. - /// - /// It must have been compiled with `try-runtime`. - Path(PathBuf), - - /// Use the code of the remote node, or the snapshot. - /// - /// In almost all cases, this is not what you want, because the code in the remote node does - /// not have any of the try-runtime custom runtime APIs. - Existing, -} - -impl FromStr for Runtime { - type Err = String; - - fn from_str(s: &str) -> Result { - Ok(match s.to_lowercase().as_ref() { - "existing" => Runtime::Existing, - x @ _ => Runtime::Path(x.into()), - }) - } -} - -/// Shared parameters of the `try-runtime` commands -#[derive(Debug, Clone, clap::Parser)] -#[group(skip)] -pub struct SharedParams { - /// Shared parameters of substrate cli. - /// - /// TODO: this is only needed because try-runtime is embedded in the substrate CLI. It should - /// go away. - #[allow(missing_docs)] - #[clap(flatten)] - pub shared_params: sc_cli::SharedParams, - - /// The runtime to use. - /// - /// Must be a path to a wasm blob, compiled with `try-runtime` feature flag. - /// - /// Or, `existing`, indicating that you don't want to overwrite the runtime. This will use - /// whatever comes from the remote node, or the snapshot file. This will most likely not work - /// against a remote node, as no (sane) blockchain should compile its onchain wasm with - /// `try-runtime` feature. - #[arg(long)] - pub runtime: Runtime, - - /// Type of wasm execution used. - #[arg( - long = "wasm-execution", - value_name = "METHOD", - value_enum, - ignore_case = true, - default_value_t = DEFAULT_WASM_EXECUTION_METHOD, - )] - pub wasm_method: WasmExecutionMethod, - - /// The WASM instantiation method to use. - /// - /// Only has an effect when `wasm-execution` is set to `compiled`. - #[arg( - long = "wasm-instantiation-strategy", - value_name = "STRATEGY", - default_value_t = DEFAULT_WASMTIME_INSTANTIATION_STRATEGY, - value_enum, - )] - pub wasmtime_instantiation_strategy: WasmtimeInstantiationStrategy, - - /// The number of 64KB pages to allocate for Wasm execution. Defaults to - /// [`sc_service::Configuration.default_heap_pages`]. - #[arg(long)] - pub heap_pages: Option, - - /// Path to a file to export the storage proof into (as a JSON). - /// If several blocks are executed, the path is interpreted as a folder - /// where one file per block will be written (named `{block_number}-{block_hash}`). - #[clap(long)] - pub export_proof: Option, - - /// Overwrite the `state_version`. - /// - /// Otherwise `remote-externalities` will automatically set the correct state version. - #[arg(long, value_parser = parse::state_version)] - pub overwrite_state_version: Option, -} - -/// Our `try-runtime` command. -/// -/// See [`Command`] for more info. -#[derive(Debug, Clone, clap::Parser)] -pub struct TryRuntimeCmd { - #[clap(flatten)] - pub shared: SharedParams, - - #[command(subcommand)] - pub command: Command, -} - -/// A `Live` variant [`State`] -#[derive(Debug, Clone, clap::Args)] -pub struct LiveState { - /// The url to connect to. - #[arg( - short, - long, - value_parser = parse::url, - )] - uri: String, - - /// The block hash at which to fetch the state. - /// - /// If non provided, then the latest finalized head is used. - #[arg( - short, - long, - value_parser = parse::hash, - )] - at: Option, - - /// A pallet to scrape. Can be provided multiple times. If empty, entire chain state will - /// be scraped. - #[arg(short, long, num_args = 1..)] - pallet: Vec, - - /// Fetch the child-keys as well. - /// - /// Default is `false`, if specific `--pallets` are specified, `true` otherwise. In other - /// words, if you scrape the whole state the child tree data is included out of the box. - /// Otherwise, it must be enabled explicitly using this flag. - #[arg(long)] - child_tree: bool, -} - -/// The source of runtime *state* to use. -#[derive(Debug, Clone, clap::Subcommand)] -pub enum State { - /// Use a state snapshot as the source of runtime state. - Snap { - #[arg(short, long)] - snapshot_path: PathBuf, - }, - - /// Use a live chain as the source of runtime state. - Live(LiveState), -} - -impl State { - /// Create the [`remote_externalities::RemoteExternalities`] using [`remote-externalities`] from - /// self. - /// - /// This will override the code as it sees fit based on [`SharedParams::Runtime`]. It will also - /// check the spec-version and name. - pub(crate) async fn into_ext( - &self, - shared: &SharedParams, - executor: &WasmExecutor, - state_snapshot: Option, - try_runtime_check: bool, - ) -> sc_cli::Result> - where - Block::Header: DeserializeOwned, - ::Err: Debug, - { - let builder = match self { - State::Snap { snapshot_path } => - Builder::::new().mode(Mode::Offline(OfflineConfig { - state_snapshot: SnapshotConfig::new(snapshot_path), - })), - State::Live(LiveState { pallet, uri, at, child_tree }) => { - let at = match at { - Some(at_str) => Some(hash_of::(at_str)?), - None => None, - }; - Builder::::new().mode(Mode::Online(OnlineConfig { - at, - transport: uri.to_owned().into(), - state_snapshot, - pallets: pallet.clone(), - child_trie: *child_tree, - hashed_keys: vec![ - // we always download the code, but we almost always won't use it, based on - // `Runtime`. - well_known_keys::CODE.to_vec(), - // we will always download this key, since it helps detect if we should do - // runtime migration or not. - [twox_128(b"System"), twox_128(b"LastRuntimeUpgrade")].concat(), - [twox_128(b"System"), twox_128(b"Number")].concat(), - ], - hashed_prefixes: vec![], - })) - }, - }; - - // possibly overwrite the state version, should hardly be needed. - let builder = if let Some(state_version) = shared.overwrite_state_version { - log::warn!( - target: LOG_TARGET, - "overwriting state version to {:?}, you better know what you are doing.", - state_version - ); - builder.overwrite_state_version(state_version) - } else { - builder - }; - - // then, we prepare to replace the code based on what the CLI wishes. - let maybe_code_to_overwrite = match shared.runtime { - Runtime::Path(ref path) => Some(std::fs::read(path).map_err(|e| { - format!("error while reading runtime file from {:?}: {:?}", path, e) - })?), - Runtime::Existing => None, - }; - - // build the main ext. - let mut ext = builder.build().await?; - - // actually replace the code if needed. - if let Some(new_code) = maybe_code_to_overwrite { - let original_code = ext - .execute_with(|| sp_io::storage::get(well_known_keys::CODE)) - .expect("':CODE:' is always downloaded in try-runtime-cli; qed"); - - // NOTE: see the impl notes of `read_runtime_version`, the ext is almost not used here, - // only as a backup. - ext.insert(well_known_keys::CODE.to_vec(), new_code.clone()); - let old_version = ::decode( - &mut &*executor.read_runtime_version(&original_code, &mut ext.ext()).unwrap(), - ) - .unwrap(); - log::info!( - target: LOG_TARGET, - "original spec: {:?}-{:?}, code hash: {:?}", - old_version.spec_name, - old_version.spec_version, - HexDisplay::from(BlakeTwo256::hash(&original_code).as_fixed_bytes()), - ); - let new_version = ::decode( - &mut &*executor.read_runtime_version(&new_code, &mut ext.ext()).unwrap(), - ) - .unwrap(); - log::info!( - target: LOG_TARGET, - "new spec: {:?}-{:?}, code hash: {:?}", - new_version.spec_name, - new_version.spec_version, - HexDisplay::from(BlakeTwo256::hash(&new_code).as_fixed_bytes()) - ); - - if new_version.spec_name != old_version.spec_name { - return Err("Spec names must match.".into()) - } - } - - // whatever runtime we have in store now must have been compiled with try-runtime feature. - if try_runtime_check { - if !ensure_try_runtime::(&executor, &mut ext) { - return Err("given runtime is NOT compiled with try-runtime feature!".into()) - } - } - - Ok(ext) - } -} - -pub const DEPRECATION_NOTICE: &str = "Substrate's `try-runtime` subcommand has been migrated to a standalone CLI (https://github.com/paritytech/try-runtime-cli). It is no longer being maintained here and will be removed entirely some time after January 2024. Please remove this subcommand from your runtime and use the standalone CLI."; - -impl TryRuntimeCmd { - // Can't reuse DEPRECATION_NOTICE in the deprecated macro - #[deprecated( - note = "Substrate's `try-runtime` subcommand has been migrated to a standalone CLI (https://github.com/paritytech/try-runtime-cli). It is no longer being maintained here and will be removed entirely some time after January 2024. Please remove this subcommand from your runtime and use the standalone CLI." - )] - pub async fn run( - &self, - block_building_info_provider: Option, - ) -> sc_cli::Result<()> - where - Block: BlockT + DeserializeOwned, - Block::Header: DeserializeOwned, - ::Err: Debug, - as FromStr>::Err: Debug, - as TryInto>::Error: Debug, - NumberFor: FromStr, - HostFns: HostFunctions, - BBIP: BlockBuildingInfoProvider>, - { - match &self.command { - Command::OnRuntimeUpgrade(ref cmd) => - commands::on_runtime_upgrade::on_runtime_upgrade::( - self.shared.clone(), - cmd.clone(), - ) - .await, - Command::OffchainWorker(cmd) => - commands::offchain_worker::offchain_worker::( - self.shared.clone(), - cmd.clone(), - ) - .await, - Command::ExecuteBlock(cmd) => - commands::execute_block::execute_block::( - self.shared.clone(), - cmd.clone(), - ) - .await, - Command::FollowChain(cmd) => - commands::follow_chain::follow_chain::( - self.shared.clone(), - cmd.clone(), - ) - .await, - Command::FastForward(cmd) => - commands::fast_forward::fast_forward::( - self.shared.clone(), - cmd.clone(), - block_building_info_provider, - ) - .await, - Command::CreateSnapshot(cmd) => - commands::create_snapshot::create_snapshot::( - self.shared.clone(), - cmd.clone(), - ) - .await, - } - } -} - -impl CliConfiguration for TryRuntimeCmd { - fn shared_params(&self) -> &sc_cli::SharedParams { - &self.shared.shared_params - } - - fn chain_id(&self, _is_dev: bool) -> sc_cli::Result { - Ok(match self.shared.shared_params.chain { - Some(ref chain) => chain.clone(), - None => "dev".into(), - }) - } -} - -/// Get the hash type of the generic `Block` from a `hash_str`. -pub(crate) fn hash_of(hash_str: &str) -> sc_cli::Result -where - ::Err: Debug, -{ - hash_str - .parse::<::Hash>() - .map_err(|e| format!("Could not parse block hash: {:?}", e).into()) -} - -/// Build all extensions that we typically use. -pub(crate) fn full_extensions(wasm_executor: WasmExecutor) -> Extensions { - let mut extensions = Extensions::default(); - let (offchain, _offchain_state) = TestOffchainExt::new(); - let (pool, _pool_state) = TestTransactionPoolExt::new(); - let keystore = MemoryKeystore::new(); - extensions.register(OffchainDbExt::new(offchain.clone())); - extensions.register(OffchainWorkerExt::new(offchain)); - extensions.register(KeystoreExt::new(keystore)); - extensions.register(TransactionPoolExt::new(pool)); - extensions.register(ReadRuntimeVersionExt::new(wasm_executor)); - - extensions -} - -/// Build wasm executor by default config. -pub(crate) fn build_executor(shared: &SharedParams) -> WasmExecutor { - let heap_pages = shared - .heap_pages - .map_or(DEFAULT_HEAP_ALLOC_STRATEGY, |p| HeapAllocStrategy::Static { extra_pages: p as _ }); - - WasmExecutor::builder() - .with_execution_method(execution_method_from_cli( - shared.wasm_method, - shared.wasmtime_instantiation_strategy, - )) - .with_onchain_heap_alloc_strategy(heap_pages) - .with_offchain_heap_alloc_strategy(heap_pages) - .build() -} - -/// Ensure that the given `ext` is compiled with `try-runtime` -fn ensure_try_runtime( - executor: &WasmExecutor, - ext: &mut TestExternalities>, -) -> bool { - use sp_api::RuntimeApiInfo; - let final_code = ext - .execute_with(|| sp_io::storage::get(well_known_keys::CODE)) - .expect("':CODE:' is always downloaded in try-runtime-cli; qed"); - let final_version = ::decode( - &mut &*executor.read_runtime_version(&final_code, &mut ext.ext()).unwrap(), - ) - .unwrap(); - final_version - .api_version(&>::ID) - .is_some() -} - -/// Execute the given `method` and `data` on top of `ext`, returning the results (encoded) and the -/// state `changes`. -pub(crate) fn state_machine_call( - ext: &TestExternalities>, - executor: &WasmExecutor, - method: &'static str, - data: &[u8], - mut extensions: Extensions, -) -> sc_cli::Result<(OverlayedChanges>, Vec)> { - let mut changes = Default::default(); - let encoded_results = StateMachine::new( - &ext.backend, - &mut changes, - executor, - method, - data, - &mut extensions, - &sp_state_machine::backend::BackendRuntimeCode::new(&ext.backend).runtime_code()?, - CallContext::Offchain, - ) - .execute() - .map_err(|e| format!("failed to execute '{}': {}", method, e)) - .map_err::(Into::into)?; - - Ok((changes, encoded_results)) -} - -/// Same as [`state_machine_call`], but it also computes and prints the storage proof in different -/// size and formats. -/// -/// Make sure [`LOG_TARGET`] is enabled in logging. -pub(crate) fn state_machine_call_with_proof( - ext: &TestExternalities>, - executor: &WasmExecutor, - method: &'static str, - data: &[u8], - mut extensions: Extensions, - maybe_export_proof: Option, -) -> sc_cli::Result<(OverlayedChanges>, Vec)> { - use parity_scale_codec::Encode; - - let mut changes = Default::default(); - let backend = ext.backend.clone(); - let runtime_code_backend = sp_state_machine::backend::BackendRuntimeCode::new(&backend); - let proving_backend = - TrieBackendBuilder::wrap(&backend).with_recorder(Default::default()).build(); - let runtime_code = runtime_code_backend.runtime_code()?; - - let pre_root = *backend.root(); - let encoded_results = StateMachine::new( - &proving_backend, - &mut changes, - executor, - method, - data, - &mut extensions, - &runtime_code, - CallContext::Offchain, - ) - .execute() - .map_err(|e| format!("failed to execute {}: {}", method, e)) - .map_err::(Into::into)?; - - let proof = proving_backend - .extract_proof() - .expect("A recorder was set and thus, a storage proof can be extracted; qed"); - - if let Some(path) = maybe_export_proof { - let mut file = std::fs::File::create(&path).map_err(|e| { - log::error!( - target: LOG_TARGET, - "Failed to create file {}: {:?}", - path.to_string_lossy(), - e - ); - e - })?; - - log::info!(target: LOG_TARGET, "Writing storage proof to {}", path.to_string_lossy()); - - use std::io::Write as _; - file.write_all(storage_proof_to_raw_json(&proof).as_bytes()).map_err(|e| { - log::error!( - target: LOG_TARGET, - "Failed to write storage proof to {}: {:?}", - path.to_string_lossy(), - e - ); - e - })?; - } - - let proof_size = proof.encoded_size(); - let compact_proof = proof - .clone() - .into_compact_proof::>(pre_root) - .map_err(|e| { - log::error!(target: LOG_TARGET, "failed to generate compact proof {}: {:?}", method, e); - e - }) - .unwrap_or(CompactProof { encoded_nodes: Default::default() }); - - let compact_proof_size = compact_proof.encoded_size(); - let compressed_proof = zstd::stream::encode_all(&compact_proof.encode()[..], 0) - .map_err(|e| { - log::error!( - target: LOG_TARGET, - "failed to generate compressed proof {}: {:?}", - method, - e - ); - e - }) - .unwrap_or_default(); - - let proof_nodes = proof.into_nodes(); - - let humanize = |s| { - if s < 1024 * 1024 { - format!("{:.2} KB ({} bytes)", s as f64 / 1024f64, s) - } else { - format!( - "{:.2} MB ({} KB) ({} bytes)", - s as f64 / (1024f64 * 1024f64), - s as f64 / 1024f64, - s - ) - } - }; - log::debug!( - target: LOG_TARGET, - "proof: 0x{}... / {} nodes", - HexDisplay::from(&proof_nodes.iter().flatten().cloned().take(10).collect::>()), - proof_nodes.len() - ); - log::debug!(target: LOG_TARGET, "proof size: {}", humanize(proof_size)); - log::debug!(target: LOG_TARGET, "compact proof size: {}", humanize(compact_proof_size),); - log::debug!( - target: LOG_TARGET, - "zstd-compressed compact proof {}", - humanize(compressed_proof.len()), - ); - - log::debug!(target: LOG_TARGET, "{} executed without errors.", method); - - Ok((changes, encoded_results)) -} - -pub(crate) fn rpc_err_handler(error: impl Debug) -> &'static str { - log::error!(target: LOG_TARGET, "rpc error: {:?}", error); - "rpc error." -} - -/// Converts a [`sp_state_machine::StorageProof`] into a JSON string. -fn storage_proof_to_raw_json(storage_proof: &sp_state_machine::StorageProof) -> String { - serde_json::Value::Object( - storage_proof - .to_memory_db::() - .drain() - .iter() - .map(|(key, (value, _n))| { - ( - format!("0x{}", hex::encode(key.as_bytes())), - serde_json::Value::String(format!("0x{}", hex::encode(value))), - ) - }) - .collect(), - ) - .to_string() -} diff --git a/substrate/utils/frame/try-runtime/cli/src/parse.rs b/substrate/utils/frame/try-runtime/cli/src/parse.rs deleted file mode 100644 index 336a36baf2416a4e538ca650eb163fc1f9e53686..0000000000000000000000000000000000000000 --- a/substrate/utils/frame/try-runtime/cli/src/parse.rs +++ /dev/null @@ -1,53 +0,0 @@ -// This file is part of Substrate. - -// Copyright (C) Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -//! Utils for parsing user input - -use sp_version::StateVersion; - -pub(crate) fn hash(block_hash: &str) -> Result { - let (block_hash, offset) = if let Some(block_hash) = block_hash.strip_prefix("0x") { - (block_hash, 2) - } else { - (block_hash, 0) - }; - - if let Some(pos) = block_hash.chars().position(|c| !c.is_ascii_hexdigit()) { - Err(format!( - "Expected block hash, found illegal hex character at position: {}", - offset + pos, - )) - } else { - Ok(block_hash.into()) - } -} - -pub(crate) fn url(s: &str) -> Result { - if s.starts_with("ws://") || s.starts_with("wss://") { - // could use Url crate as well, but lets keep it simple for now. - Ok(s.to_string()) - } else { - Err("not a valid WS(S) url: must start with 'ws://' or 'wss://'") - } -} - -pub(crate) fn state_version(s: &str) -> Result { - s.parse::() - .map_err(|_| ()) - .and_then(StateVersion::try_from) - .map_err(|_| "Invalid state version.") -} diff --git a/substrate/utils/prometheus/Cargo.toml b/substrate/utils/prometheus/Cargo.toml index 5ce943fbc598faf21af32f86edb81d7abe187a91..36527ac6183bb921266023320345afb9f6a89246 100644 --- a/substrate/utils/prometheus/Cargo.toml +++ b/substrate/utils/prometheus/Cargo.toml @@ -17,9 +17,9 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] hyper = { version = "0.14.16", default-features = false, features = ["http1", "server", "tcp"] } -log = "0.4.17" +log = { workspace = true, default-features = true } prometheus = { version = "0.13.0", default-features = false } -thiserror = "1.0" +thiserror = { workspace = true } tokio = { version = "1.22.0", features = ["parking_lot"] } [dev-dependencies] diff --git a/substrate/utils/substrate-bip39/Cargo.toml b/substrate/utils/substrate-bip39/Cargo.toml new file mode 100644 index 0000000000000000000000000000000000000000..a46f81ee24d96d666495ee5cea5ca58b415a9cb0 --- /dev/null +++ b/substrate/utils/substrate-bip39/Cargo.toml @@ -0,0 +1,31 @@ +[package] +name = "substrate-bip39" +version = "0.4.7" +license = "Apache-2.0" +description = "Converting BIP39 entropy to valid Substrate (sr25519) SecretKeys" +documentation = "https://docs.rs/substrate-bip39" +authors.workspace = true +edition.workspace = true +repository.workspace = true + +[dependencies] +hmac = "0.12.1" +pbkdf2 = { version = "0.12.2", default-features = false } +schnorrkel = { version = "0.11.4", default-features = false } +sha2 = { version = "0.10.7", default-features = false } +zeroize = { version = "1.4.3", default-features = false } + +[dev-dependencies] +bip39 = "2.0.0" +rustc-hex = "2.1.0" + +[features] +default = ["std"] +std = [ + "hmac/std", + "pbkdf2/std", + "schnorrkel/std", + "sha2/std", + "zeroize/alloc", + "zeroize/std", +] diff --git a/substrate/utils/substrate-bip39/README.md b/substrate/utils/substrate-bip39/README.md new file mode 100644 index 0000000000000000000000000000000000000000..e7a80ca5f2cf8c4924cfb2629ce6e3ad97c295cc --- /dev/null +++ b/substrate/utils/substrate-bip39/README.md @@ -0,0 +1,55 @@ +# Substrate BIP39 + +This is a crate for deriving secret keys for Ristretto compressed Ed25519 (should be compatible with Ed25519 at this +time) from BIP39 phrases. + +## Why? + +The natural approach here would be to use the 64-byte seed generated from the BIP39 phrase, and use that to construct +the key. This approach, while reasonable and fairly straight forward to implement, also means we would have to inherit +all the characteristics of seed generation. Since we are breaking compatibility with both BIP32 and BIP44 anyway (which +we are free to do as we are no longer using the Secp256k1 curve), there is also no reason why we should adhere to BIP39 +seed generation from the mnemonic. + +BIP39 seed generation was designed to be compatible with user supplied brain wallet phrases as well as being extensible +to wallets providing their own dictionaries and checksum mechanism. Issues with those two points: + +1. Brain wallets are a horrible idea, simply because humans are bad entropy generators. It's next to impossible to + educate users on how to use that feature in a secure manner. The 2048 rounds of PBKDF2 is a mere inconvenience that + offers no real protection against dictionary attacks for anyone equipped with modern consumer hardware. Brain wallets + have given users false sense of security. _People have lost money_ this way and wallet providers today tend to stick + to CSPRNG supplied dictionary phrases. + +2. Providing own dictionaries felt into the _you ain't gonna need it_ anti-pattern category on day 1. Wallet providers + (be it hardware or software) typically want their products to be compatible with other wallets so that users can + migrate to their product without having to migrate all their assets. + +To achieve the above phrases have to be precisely encoded in _The One True Canonical Encoding_, for which UTF-8 NFKD was +chosen. This is largely irrelevant (and even ignored) for English phrases, as they encode to basically just ASCII in +virtually every character encoding known to mankind, but immediately becomes a problem for dictionaries that do use +non-ASCII characters. Even if the right encoding is used and implemented correctly, there are still [other caveats +present for some non-english dictionaries](https://github.com/bitcoin/bips/blob/master/bip-0039/bip-0039-wordlists.md), +such as normalizing spaces to a canonical form, or making some latin based characters equivalent to their base in +dictionary lookups (eg. Spanish `ñ` and `n` are meant to be interchangeable). Thinking about all of this gives me a +headache, and opens doors for disagreements between buggy implementations, breaking compatibility. + +BIP39 does already provide a form of the mnemonic that is free from all of these issues: the entropy byte array. Since +verifying the checksum requires that we recover the entropy from which the phrase was generated, no extra work is +actually needed here. Wallet implementors can encode the dictionaries in whatever encoding they find convenient (as +long as they are the standard BIP39 dictionaries), no harm in using UTF-16 string primitives that Java and JavaScript +provide. Since the dictionary is fixed and known, and the checksum is done on the entropy itself, the exact character +encoding used becomes irrelevant, as are the precise codepoints and amount of whitespace around the words. It is thus +much harder to create a buggy implementation. + +PBKDF2 was kept in place, along with the password. Using 24 words (with its 256 bits entropy) makes the extra hashing +redundant (if you could brute force 256 bit entropy, you can also just brute force secret keys), however some users +might be still using 12 word phrases from other applications. There is no good reason to prohibit users from recovering +their old wallets using 12 words that I can see, in which case the extra hashing does provide _some_ protection. +Passwords are also a feature that some power users find useful - particularly for creating a decoy address with a small +balance with empty password, while the funds proper are stored on an address that requires a password to be entered. + +## Why not ditch BIP39 altogether? + +Because there are hardware wallets that use a single phrase for the entire device, and operate multiple accounts on +multiple networks using that. A completely different wordlist would make their life much harder when it comes to +providing future Substrate support. diff --git a/substrate/utils/substrate-bip39/src/lib.rs b/substrate/utils/substrate-bip39/src/lib.rs new file mode 100644 index 0000000000000000000000000000000000000000..5b68bef0c390e364f4c87cbfe0d1b7723b1f54f0 --- /dev/null +++ b/substrate/utils/substrate-bip39/src/lib.rs @@ -0,0 +1,232 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#![cfg_attr(not(feature = "std"), no_std)] + +#[cfg(not(feature = "std"))] +extern crate alloc; +#[cfg(not(feature = "std"))] +use alloc::string::String; + +use hmac::Hmac; +use pbkdf2::pbkdf2; +use schnorrkel::keys::MiniSecretKey; +use sha2::Sha512; +use zeroize::Zeroize; + +#[derive(Clone, Copy, PartialEq, Eq, Debug)] +pub enum Error { + InvalidEntropy, +} + +/// `entropy` should be a byte array from a correctly recovered and checksumed BIP39. +/// +/// This function accepts slices of different length for different word lengths: +/// +/// + 16 bytes for 12 words. +/// + 20 bytes for 15 words. +/// + 24 bytes for 18 words. +/// + 28 bytes for 21 words. +/// + 32 bytes for 24 words. +/// +/// Any other length will return an error. +/// +/// `password` is analog to BIP39 seed generation itself, with an empty string being default. +pub fn mini_secret_from_entropy(entropy: &[u8], password: &str) -> Result { + let seed = seed_from_entropy(entropy, password)?; + Ok(MiniSecretKey::from_bytes(&seed[..32]).expect("Length is always correct; qed")) +} + +/// Similar to `mini_secret_from_entropy`, except that it provides the 64-byte seed directly. +pub fn seed_from_entropy(entropy: &[u8], password: &str) -> Result<[u8; 64], Error> { + if entropy.len() < 16 || entropy.len() > 32 || entropy.len() % 4 != 0 { + return Err(Error::InvalidEntropy); + } + + let mut salt = String::with_capacity(8 + password.len()); + salt.push_str("mnemonic"); + salt.push_str(password); + + let mut seed = [0u8; 64]; + + pbkdf2::>(entropy, salt.as_bytes(), 2048, &mut seed) + .map_err(|_| Error::InvalidEntropy)?; + + salt.zeroize(); + + Ok(seed) +} + +#[cfg(test)] +mod test { + use super::*; + + #[cfg(not(feature = "std"))] + use alloc::vec::Vec; + + use bip39::{Language, Mnemonic}; + use rustc_hex::FromHex; + + // phrase, entropy, seed, expanded secret_key + // + // ALL SEEDS GENERATED USING "Substrate" PASSWORD! + static VECTORS: &[[&str; 3]] = &[ + [ + "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about", + "00000000000000000000000000000000", + "44e9d125f037ac1d51f0a7d3649689d422c2af8b1ec8e00d71db4d7bf6d127e33f50c3d5c84fa3e5399c72d6cbbbbc4a49bf76f76d952f479d74655a2ef2d453", + ], + [ + "legal winner thank year wave sausage worth useful legal winner thank yellow", + "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f", + "4313249608fe8ac10fd5886c92c4579007272cb77c21551ee5b8d60b780416850f1e26c1f4b8d88ece681cb058ab66d6182bc2ce5a03181f7b74c27576b5c8bf", + ], + [ + "letter advice cage absurd amount doctor acoustic avoid letter advice cage above", + "80808080808080808080808080808080", + "27f3eb595928c60d5bc91a4d747da40ed236328183046892ed6cd5aa9ae38122acd1183adf09a89839acb1e6eaa7fb563cc958a3f9161248d5a036e0d0af533d", + ], + [ + "zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo wrong", + "ffffffffffffffffffffffffffffffff", + "227d6256fd4f9ccaf06c45eaa4b2345969640462bbb00c5f51f43cb43418c7a753265f9b1e0c0822c155a9cabc769413ecc14553e135fe140fc50b6722c6b9df", + ], + [ + "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon agent", + "000000000000000000000000000000000000000000000000", + "44e9d125f037ac1d51f0a7d3649689d422c2af8b1ec8e00d71db4d7bf6d127e33f50c3d5c84fa3e5399c72d6cbbbbc4a49bf76f76d952f479d74655a2ef2d453", + ], + [ + "legal winner thank year wave sausage worth useful legal winner thank year wave sausage worth useful legal will", + "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f", + "cb1d50e14101024a88905a098feb1553d4306d072d7460e167a60ccb3439a6817a0afc59060f45d999ddebc05308714733c9e1e84f30feccddd4ad6f95c8a445", + ], + [ + "letter advice cage absurd amount doctor acoustic avoid letter advice cage absurd amount doctor acoustic avoid letter always", + "808080808080808080808080808080808080808080808080", + "9ddecf32ce6bee77f867f3c4bb842d1f0151826a145cb4489598fe71ac29e3551b724f01052d1bc3f6d9514d6df6aa6d0291cfdf997a5afdb7b6a614c88ab36a", + ], + [ + "zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo when", + "ffffffffffffffffffffffffffffffffffffffffffffffff", + "8971cb290e7117c64b63379c97ed3b5c6da488841bd9f95cdc2a5651ac89571e2c64d391d46e2475e8b043911885457cd23e99a28b5a18535fe53294dc8e1693", + ], + [ + "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon art", + "0000000000000000000000000000000000000000000000000000000000000000", + "44e9d125f037ac1d51f0a7d3649689d422c2af8b1ec8e00d71db4d7bf6d127e33f50c3d5c84fa3e5399c72d6cbbbbc4a49bf76f76d952f479d74655a2ef2d453", + ], + [ + "legal winner thank year wave sausage worth useful legal winner thank year wave sausage worth useful legal winner thank year wave sausage worth title", + "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f", + "3037276a5d05fcd7edf51869eb841bdde27c574dae01ac8cfb1ea476f6bea6ef57ab9afe14aea1df8a48f97ae25b37d7c8326e49289efb25af92ba5a25d09ed3", + ], + [ + "letter advice cage absurd amount doctor acoustic avoid letter advice cage absurd amount doctor acoustic avoid letter advice cage absurd amount doctor acoustic bless", + "8080808080808080808080808080808080808080808080808080808080808080", + "2c9c6144a06ae5a855453d98c3dea470e2a8ffb78179c2e9eb15208ccca7d831c97ddafe844ab933131e6eb895f675ede2f4e39837bb5769d4e2bc11df58ac42", + ], + [ + "zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo vote", + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "047e89ef7739cbfe30da0ad32eb1720d8f62441dd4f139b981b8e2d0bd412ed4eb14b89b5098c49db2301d4e7df4e89c21e53f345138e56a5e7d63fae21c5939", + ], + [ + "ozone drill grab fiber curtain grace pudding thank cruise elder eight picnic", + "9e885d952ad362caeb4efe34a8e91bd2", + "f4956be6960bc145cdab782e649a5056598fd07cd3f32ceb73421c3da27833241324dc2c8b0a4d847eee457e6d4c5429f5e625ece22abaa6a976e82f1ec5531d", + ], + [ + "gravity machine north sort system female filter attitude volume fold club stay feature office ecology stable narrow fog", + "6610b25967cdcca9d59875f5cb50b0ea75433311869e930b", + "fbcc5229ade0c0ff018cb7a329c5459f91876e4dde2a97ddf03c832eab7f26124366a543f1485479c31a9db0d421bda82d7e1fe562e57f3533cb1733b001d84d", + ], + [ + "hamster diagram private dutch cause delay private meat slide toddler razor book happy fancy gospel tennis maple dilemma loan word shrug inflict delay length", + "68a79eaca2324873eacc50cb9c6eca8cc68ea5d936f98787c60c7ebc74e6ce7c", + "7c60c555126c297deddddd59f8cdcdc9e3608944455824dd604897984b5cc369cad749803bb36eb8b786b570c9cdc8db275dbe841486676a6adf389f3be3f076", + ], + [ + "scheme spot photo card baby mountain device kick cradle pact join borrow", + "c0ba5a8e914111210f2bd131f3d5e08d", + "c12157bf2506526c4bd1b79a056453b071361538e9e2c19c28ba2cfa39b5f23034b974e0164a1e8acd30f5b4c4de7d424fdb52c0116bfc6a965ba8205e6cc121", + ], + [ + "horn tenant knee talent sponsor spell gate clip pulse soap slush warm silver nephew swap uncle crack brave", + "6d9be1ee6ebd27a258115aad99b7317b9c8d28b6d76431c3", + "23766723e970e6b79dec4d5e4fdd627fd27d1ee026eb898feb9f653af01ad22080c6f306d1061656d01c4fe9a14c05f991d2c7d8af8730780de4f94cd99bd819", + ], + [ + "panda eyebrow bullet gorilla call smoke muffin taste mesh discover soft ostrich alcohol speed nation flash devote level hobby quick inner drive ghost inside", + "9f6a2878b2520799a44ef18bc7df394e7061a224d2c33cd015b157d746869863", + "f4c83c86617cb014d35cd87d38b5ef1c5d5c3d58a73ab779114438a7b358f457e0462c92bddab5a406fe0e6b97c71905cf19f925f356bc673ceb0e49792f4340", + ], + [ + "cat swing flag economy stadium alone churn speed unique patch report train", + "23db8160a31d3e0dca3688ed941adbf3", + "719d4d4de0638a1705bf5237262458983da76933e718b2d64eb592c470f3c5d222e345cc795337bb3da393b94375ff4a56cfcd68d5ea25b577ee9384d35f4246", + ], + [ + "light rule cinnamon wrap drastic word pride squirrel upgrade then income fatal apart sustain crack supply proud access", + "8197a4a47f0425faeaa69deebc05ca29c0a5b5cc76ceacc0", + "7ae1291db32d16457c248567f2b101e62c5549d2a64cd2b7605d503ec876d58707a8d663641e99663bc4f6cc9746f4852e75e7e54de5bc1bd3c299c9a113409e", + ], + [ + "all hour make first leader extend hole alien behind guard gospel lava path output census museum junior mass reopen famous sing advance salt reform", + "066dca1a2bb7e8a1db2832148ce9933eea0f3ac9548d793112d9a95c9407efad", + "a911a5f4db0940b17ecb79c4dcf9392bf47dd18acaebdd4ef48799909ebb49672947cc15f4ef7e8ef47103a1a91a6732b821bda2c667e5b1d491c54788c69391", + ], + [ + "vessel ladder alter error federal sibling chat ability sun glass valve picture", + "f30f8c1da665478f49b001d94c5fc452", + "4e2314ca7d9eebac6fe5a05a5a8d3546bc891785414d82207ac987926380411e559c885190d641ff7e686ace8c57db6f6e4333c1081e3d88d7141a74cf339c8f", + ], + [ + "scissors invite lock maple supreme raw rapid void congress muscle digital elegant little brisk hair mango congress clump", + "c10ec20dc3cd9f652c7fac2f1230f7a3c828389a14392f05", + "7a83851102849edc5d2a3ca9d8044d0d4f00e5c4a292753ed3952e40808593251b0af1dd3c9ed9932d46e8608eb0b928216a6160bd4fc775a6e6fbd493d7c6b2", + ], + [ + "void come effort suffer camp survey warrior heavy shoot primary clutch crush open amazing screen patrol group space point ten exist slush involve unfold", + "f585c11aec520db57dd353c69554b21a89b20fb0650966fa0a9d6f74fd989d8f", + "938ba18c3f521f19bd4a399c8425b02c716844325b1a65106b9d1593fbafe5e0b85448f523f91c48e331995ff24ae406757cff47d11f240847352b348ff436ed", + ] + ]; + + #[test] + fn vectors_are_correct() { + for vector in VECTORS { + let phrase = vector[0]; + + let expected_entropy: Vec = vector[1].from_hex().unwrap(); + let expected_seed: Vec = vector[2].from_hex().unwrap(); + + let mnemonic = Mnemonic::parse_in(Language::English, phrase).unwrap(); + let seed = seed_from_entropy(&mnemonic.to_entropy(), "Substrate").unwrap(); + let secret = mini_secret_from_entropy(&mnemonic.to_entropy(), "Substrate") + .unwrap() + .to_bytes(); + + assert_eq!( + mnemonic.to_entropy(), + &expected_entropy[..], + "Entropy is incorrect for {}", + phrase + ); + assert_eq!(&seed[..], &expected_seed[..], "Seed is incorrect for {}", phrase); + assert_eq!(&secret[..], &expected_seed[..32], "Secret is incorrect for {}", phrase); + } + } +} diff --git a/substrate/utils/wasm-builder/Cargo.toml b/substrate/utils/wasm-builder/Cargo.toml index 7abd1a202848f6159ef33bb9efe06de61cac797c..bac323e2e6a0905cf1d956589235c196ef2881a4 100644 --- a/substrate/utils/wasm-builder/Cargo.toml +++ b/substrate/utils/wasm-builder/Cargo.toml @@ -18,7 +18,7 @@ targets = ["x86_64-unknown-linux-gnu"] build-helper = "0.1.1" cargo_metadata = "0.15.4" console = "0.15.8" -strum = { version = "0.24.1", features = ["derive"] } +strum = { version = "0.26.2", features = ["derive"] } tempfile = "3.1.0" toml = "0.8.8" walkdir = "2.4.0" diff --git a/substrate/utils/wasm-builder/src/lib.rs b/substrate/utils/wasm-builder/src/lib.rs index 5cde48c0950b341cd36f3a5594620be683c799ea..178e499e8f5bb6d7531d73004e2f37e1e9b1d146 100644 --- a/substrate/utils/wasm-builder/src/lib.rs +++ b/substrate/utils/wasm-builder/src/lib.rs @@ -207,7 +207,7 @@ fn get_cargo_command(target: RuntimeTarget) -> CargoCommand { } else { // If no command before provided us with a cargo that supports our Substrate wasm env, we // try to search one with rustup. If that fails as well, we return the default cargo and let - // the prequisities check fail. + // the perquisites check fail. get_rustup_command(target).unwrap_or(default_cargo) } } diff --git a/substrate/utils/wasm-builder/src/prerequisites.rs b/substrate/utils/wasm-builder/src/prerequisites.rs index a601e3210dd0c2b89beffa1d5d6b788cb35fd6a3..22caf8950637960310c62eb98c5358de55c1662d 100644 --- a/substrate/utils/wasm-builder/src/prerequisites.rs +++ b/substrate/utils/wasm-builder/src/prerequisites.rs @@ -149,6 +149,14 @@ impl<'a> DummyCrate<'a> { sysroot_cmd.output().ok().and_then(|o| String::from_utf8(o.stdout).ok()) } + fn get_toolchain(&self) -> Option { + let sysroot = self.get_sysroot()?; + Path::new(sysroot.trim()) + .file_name() + .and_then(|s| s.to_str()) + .map(|s| s.to_string()) + } + fn try_build(&self) -> Result<(), Option> { let Ok(result) = self.prepare_command("build").output() else { return Err(None) }; if !result.status.success() { @@ -164,14 +172,15 @@ fn check_wasm_toolchain_installed( let dummy_crate = DummyCrate::new(&cargo_command, RuntimeTarget::Wasm); if let Err(error) = dummy_crate.try_build() { + let toolchain = dummy_crate.get_toolchain().unwrap_or("".to_string()); let basic_error_message = colorize_error_message( - "Rust WASM toolchain is not properly installed; please install it!", + &format!("Rust WASM target for toolchain {toolchain} is not properly installed; please install it!") ); return match error { None => Err(basic_error_message), Some(error) if error.contains("the `wasm32-unknown-unknown` target may not be installed") => { - Err(colorize_error_message("Cannot compile the WASM runtime: the `wasm32-unknown-unknown` target is not installed!\n\ - You can install it with `rustup target add wasm32-unknown-unknown` if you're using `rustup`.")) + Err(colorize_error_message(&format!("Cannot compile the WASM runtime: the `wasm32-unknown-unknown` target is not installed!\n\ + You can install it with `rustup target add wasm32-unknown-unknown --toolchain {toolchain}` if you're using `rustup`."))) }, // Apparently this can happen when we're running on a non Tier 1 platform. Some(ref error) if error.contains("linker `rust-lld` not found") => @@ -193,9 +202,10 @@ fn check_wasm_toolchain_installed( let src_path = Path::new(sysroot.trim()).join("lib").join("rustlib").join("src").join("rust"); if !src_path.exists() { + let toolchain = dummy_crate.get_toolchain().unwrap_or("".to_string()); return Err(colorize_error_message( - "Cannot compile the WASM runtime: no standard library sources found!\n\ - You can install them with `rustup component add rust-src` if you're using `rustup`.", + &format!("Cannot compile the WASM runtime: no standard library sources found at {}!\n\ + You can install them with `rustup component add rust-src --toolchain {toolchain}` if you're using `rustup`.", src_path.display()), )) } } diff --git a/substrate/utils/wasm-builder/src/wasm_project.rs b/substrate/utils/wasm-builder/src/wasm_project.rs index 99e072f26825fb9216cec6260a29ba5901d5ef1d..b58e6bfa36b478b91995789a148b042d167d9f3f 100644 --- a/substrate/utils/wasm-builder/src/wasm_project.rs +++ b/substrate/utils/wasm-builder/src/wasm_project.rs @@ -462,6 +462,18 @@ fn create_project_cargo_toml( wasm_workspace_toml.insert("workspace".into(), Table::new().into()); + if target == RuntimeTarget::Riscv { + // This dependency currently doesn't compile under RISC-V, so patch it with our own fork. + // + // TODO: Remove this once a new version of `bitvec` (which uses a new version of `radium` + // which doesn't have this problem) is released on crates.io. + let patch = toml::toml! { + [crates-io] + radium = { git = "https://github.com/paritytech/radium-0.7-fork.git", rev = "a5da15a15c90fd169d661d206cf0db592487f52b" } + }; + wasm_workspace_toml.insert("patch".into(), patch.into()); + } + write_file_if_changed( wasm_workspace.join("Cargo.toml"), toml::to_string_pretty(&wasm_workspace_toml).expect("Wasm workspace toml is valid; qed"), @@ -683,7 +695,7 @@ impl BuildConfiguration { /// "production". It would only contain the builtin profile where the custom profile /// inherits from. This is why we inspect the build path to learn which profile is used. /// - /// When not overriden by a env variable we always default to building wasm with the `Release` + /// When not overridden by a env variable we always default to building wasm with the `Release` /// profile even when the main build uses the debug build. This is because wasm built with the /// `Debug` profile is too slow for normal development activities and almost never intended. /// @@ -692,9 +704,9 @@ impl BuildConfiguration { /// /// # Note /// - /// Can be overriden by setting [`crate::WASM_BUILD_TYPE_ENV`]. + /// Can be overridden by setting [`crate::WASM_BUILD_TYPE_ENV`]. fn detect(target: RuntimeTarget, wasm_project: &Path) -> Self { - let (name, overriden) = if let Ok(name) = env::var(crate::WASM_BUILD_TYPE_ENV) { + let (name, overridden) = if let Ok(name) = env::var(crate::WASM_BUILD_TYPE_ENV) { (name, true) } else { // First go backwards to the beginning of the target directory. @@ -719,14 +731,14 @@ impl BuildConfiguration { (name, false) }; let outer_build_profile = Profile::iter().find(|p| p.directory() == name); - let blob_build_profile = match (outer_build_profile.clone(), overriden) { - // When not overriden by a env variable we default to using the `Release` profile + let blob_build_profile = match (outer_build_profile.clone(), overridden) { + // When not overridden by a env variable we default to using the `Release` profile // for the wasm build even when the main build uses the debug build. This // is because the `Debug` profile is too slow for normal development activities. (Some(Profile::Debug), false) => Profile::Release, - // For any other profile or when overriden we take it at face value. + // For any other profile or when overridden we take it at face value. (Some(profile), _) => profile, - // For non overriden unknown profiles we fall back to `Release`. + // For non overridden unknown profiles we fall back to `Release`. // This allows us to continue building when a custom profile is used for the // main builds cargo. When explicitly passing a profile via env variable we are // not doing a fallback. @@ -843,7 +855,7 @@ fn build_bloaty_blob( println!("{} {}", colorize_info_message("Using rustc version:"), cargo_cmd.rustc_version()); // Use `process::exit(1)` to have a clean error output. - if build_cmd.status().map(|s| s.success()).is_err() { + if !build_cmd.status().map_or(false, |s| s.success()) { process::exit(1); } @@ -865,7 +877,7 @@ fn build_bloaty_blob( if polkavm_path .metadata() .map(|polkavm_metadata| { - polkavm_metadata.modified().unwrap() >= elf_metadata.modified().unwrap() + polkavm_metadata.modified().unwrap() < elf_metadata.modified().unwrap() }) .unwrap_or(true) { diff --git a/substrate/zombienet/0002-validators-warp-sync/test-validators-warp-sync.zndsl b/substrate/zombienet/0002-validators-warp-sync/test-validators-warp-sync.zndsl index ea0f15e5d8ace1315e231c6db2e01399e0ce44f3..b68bce508c008396d699e67e08b98cdf74ba5138 100644 --- a/substrate/zombienet/0002-validators-warp-sync/test-validators-warp-sync.zndsl +++ b/substrate/zombienet/0002-validators-warp-sync/test-validators-warp-sync.zndsl @@ -34,8 +34,8 @@ bob: reports block height is at least {{DB_BLOCK_HEIGHT}} within 10 seconds alice: reports substrate_beefy_best_block is at least {{DB_BLOCK_HEIGHT}} within 180 seconds bob: reports substrate_beefy_best_block is at least {{DB_BLOCK_HEIGHT}} within 180 seconds -alice: reports substrate_beefy_best_block is greater than {{DB_BLOCK_HEIGHT}} within 60 seconds -bob: reports substrate_beefy_best_block is greater than {{DB_BLOCK_HEIGHT}} within 60 seconds +alice: reports substrate_beefy_best_block is greater than {{DB_BLOCK_HEIGHT}} within 180 seconds +bob: reports substrate_beefy_best_block is greater than {{DB_BLOCK_HEIGHT}} within 180 seconds alice: count of log lines containing "error" is 0 within 10 seconds bob: count of log lines containing "verification failed" is 0 within 10 seconds diff --git a/templates/minimal/README.md b/templates/minimal/README.md new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/templates/minimal/node/Cargo.toml b/templates/minimal/node/Cargo.toml new file mode 100644 index 0000000000000000000000000000000000000000..606fd05803562abe7dc85b35c6a4c0b7c15a320c --- /dev/null +++ b/templates/minimal/node/Cargo.toml @@ -0,0 +1,62 @@ +[package] +name = "minimal-template-node" +description = "A minimal Substrate-based Substrate node, ready for hacking." +version = "0.0.0" +license = "MIT-0" +authors.workspace = true +homepage.workspace = true +repository.workspace = true +edition.workspace = true +publish = false +build = "build.rs" + +[lints] +workspace = true + +[package.metadata.docs.rs] +targets = ["x86_64-unknown-linux-gnu"] + +[dependencies] +clap = { version = "4.5.3", features = ["derive"] } +futures = { version = "0.3.30", features = ["thread-pool"] } +futures-timer = "3.0.1" +jsonrpsee = { version = "0.22", features = ["server"] } +serde_json = { workspace = true, default-features = true } + +sc-cli = { path = "../../../substrate/client/cli" } +sc-executor = { path = "../../../substrate/client/executor" } +sc-network = { path = "../../../substrate/client/network" } +sc-service = { path = "../../../substrate/client/service" } +sc-telemetry = { path = "../../../substrate/client/telemetry" } +sc-transaction-pool = { path = "../../../substrate/client/transaction-pool" } +sc-transaction-pool-api = { path = "../../../substrate/client/transaction-pool/api" } +sc-consensus = { path = "../../../substrate/client/consensus/common" } +sc-consensus-manual-seal = { path = "../../../substrate/client/consensus/manual-seal" } +sc-rpc-api = { path = "../../../substrate/client/rpc-api" } +sc-basic-authorship = { path = "../../../substrate/client/basic-authorship" } +sc-offchain = { path = "../../../substrate/client/offchain" } +sc-client-api = { path = "../../../substrate/client/api" } + +sp-timestamp = { path = "../../../substrate/primitives/timestamp" } +sp-keyring = { path = "../../../substrate/primitives/keyring" } +sp-api = { path = "../../../substrate/primitives/api" } +sp-blockchain = { path = "../../../substrate/primitives/blockchain" } +sp-block-builder = { path = "../../../substrate/primitives/block-builder" } +sp-io = { path = "../../../substrate/primitives/io" } +sp-runtime = { path = "../../../substrate/primitives/runtime" } + +substrate-frame-rpc-system = { path = "../../../substrate/utils/frame/rpc/system" } + +# Once the native runtime is gone, there should be little to no dependency on FRAME here, and +# certainly no dependency on the runtime. +frame = { package = "polkadot-sdk-frame", path = "../../../substrate/frame", features = [ + "experimental", + "runtime", +] } +runtime = { package = "minimal-template-runtime", path = "../runtime" } + +[build-dependencies] +substrate-build-script-utils = { path = "../../../substrate/utils/build-script-utils" } + +[features] +default = [] diff --git a/substrate/bin/minimal/node/build.rs b/templates/minimal/node/build.rs similarity index 100% rename from substrate/bin/minimal/node/build.rs rename to templates/minimal/node/build.rs diff --git a/substrate/bin/minimal/node/src/chain_spec.rs b/templates/minimal/node/src/chain_spec.rs similarity index 100% rename from substrate/bin/minimal/node/src/chain_spec.rs rename to templates/minimal/node/src/chain_spec.rs diff --git a/substrate/bin/minimal/node/src/cli.rs b/templates/minimal/node/src/cli.rs similarity index 100% rename from substrate/bin/minimal/node/src/cli.rs rename to templates/minimal/node/src/cli.rs diff --git a/substrate/bin/minimal/node/src/command.rs b/templates/minimal/node/src/command.rs similarity index 90% rename from substrate/bin/minimal/node/src/command.rs rename to templates/minimal/node/src/command.rs index a985370c2d87f4d0e86191a79bd88db484953355..432add922a7b585bba9be071a0a82dcd34e02dd7 100644 --- a/substrate/bin/minimal/node/src/command.rs +++ b/templates/minimal/node/src/command.rs @@ -119,7 +119,15 @@ pub fn run() -> sc_cli::Result<()> { None => { let runner = cli.create_runner(&cli.run)?; runner.run_node_until_exit(|config| async move { - service::new_full(config, cli.consensus).map_err(sc_cli::Error::Service) + match config.network.network_backend { + sc_network::config::NetworkBackendType::Libp2p => + service::new_full::>(config, cli.consensus) + .map_err(sc_cli::Error::Service), + sc_network::config::NetworkBackendType::Litep2p => service::new_full::< + sc_network::Litep2pNetworkBackend, + >(config, cli.consensus) + .map_err(sc_cli::Error::Service), + } }) }, } diff --git a/substrate/bin/minimal/node/src/lib.rs b/templates/minimal/node/src/lib.rs similarity index 94% rename from substrate/bin/minimal/node/src/lib.rs rename to templates/minimal/node/src/lib.rs index c2065def736aeeb3b1102bade04063532128f3cd..cb8ed3bd209dd24d1bfa9d53b904d411acbea02e 100644 --- a/substrate/bin/minimal/node/src/lib.rs +++ b/templates/minimal/node/src/lib.rs @@ -1,4 +1,4 @@ -// This file is part of Substrate. +// This file is part of Polkadot Sdk. // Copyright (C) Parity Technologies (UK) Ltd. // SPDX-License-Identifier: Apache-2.0 diff --git a/substrate/bin/minimal/node/src/main.rs b/templates/minimal/node/src/main.rs similarity index 100% rename from substrate/bin/minimal/node/src/main.rs rename to templates/minimal/node/src/main.rs diff --git a/substrate/bin/minimal/node/src/rpc.rs b/templates/minimal/node/src/rpc.rs similarity index 100% rename from substrate/bin/minimal/node/src/rpc.rs rename to templates/minimal/node/src/rpc.rs diff --git a/substrate/bin/minimal/node/src/service.rs b/templates/minimal/node/src/service.rs similarity index 93% rename from substrate/bin/minimal/node/src/service.rs rename to templates/minimal/node/src/service.rs index 08db8b5936148c45870489ae11b0c9263078a8f6..d84df95dc1924edf8077783aed4f2ce80a803f14 100644 --- a/substrate/bin/minimal/node/src/service.rs +++ b/templates/minimal/node/src/service.rs @@ -22,6 +22,7 @@ use sc_executor::WasmExecutor; use sc_service::{error::Error as ServiceError, Configuration, TaskManager}; use sc_telemetry::{Telemetry, TelemetryWorker}; use sc_transaction_pool_api::OffchainTransactionPoolFactory; +use sp_runtime::traits::Block as BlockT; use std::sync::Arc; use crate::cli::Consensus; @@ -104,7 +105,10 @@ pub fn new_partial(config: &Configuration) -> Result { } /// Builds a new service for a full client. -pub fn new_full(config: Configuration, consensus: Consensus) -> Result { +pub fn new_full::Hash>>( + config: Configuration, + consensus: Consensus, +) -> Result { let sc_service::PartialComponents { client, backend, @@ -116,7 +120,14 @@ pub fn new_full(config: Configuration, consensus: Consensus) -> Result::Hash, + Network, + >::new(&config.network); + let metrics = Network::register_notification_metrics( + config.prometheus_config.as_ref().map(|cfg| &cfg.registry), + ); let (network, system_rpc_tx, tx_handler_controller, network_starter, sync_service) = sc_service::build_network(sc_service::BuildNetworkParams { @@ -129,6 +140,7 @@ pub fn new_full(config: Configuration, consensus: Consensus) -> Result Result(_); +} diff --git a/templates/minimal/runtime/Cargo.toml b/templates/minimal/runtime/Cargo.toml new file mode 100644 index 0000000000000000000000000000000000000000..ceac8a49853369a6a882e32f13cc4728aa3c29ad --- /dev/null +++ b/templates/minimal/runtime/Cargo.toml @@ -0,0 +1,61 @@ +[package] +name = "minimal-template-runtime" +description = "A solochain runtime template built with Substrate, part of Polkadot Sdk." +version = "0.0.0" +license = "MIT-0" +authors.workspace = true +homepage.workspace = true +repository.workspace = true +edition.workspace = true +publish = false + +[lints] +workspace = true + +[dependencies] +parity-scale-codec = { version = "3.0.0", default-features = false } +scale-info = { version = "2.6.0", default-features = false } + +# this is a frame-based runtime, thus importing `frame` with runtime feature enabled. +frame = { package = "polkadot-sdk-frame", path = "../../../substrate/frame", default-features = false, features = [ + "experimental", + "runtime", +] } + +# pallets that we want to use +pallet-balances = { path = "../../../substrate/frame/balances", default-features = false } +pallet-sudo = { path = "../../../substrate/frame/sudo", default-features = false } +pallet-timestamp = { path = "../../../substrate/frame/timestamp", default-features = false } +pallet-transaction-payment = { path = "../../../substrate/frame/transaction-payment", default-features = false } +pallet-transaction-payment-rpc-runtime-api = { path = "../../../substrate/frame/transaction-payment/rpc/runtime-api", default-features = false } + +# genesis builder that allows us to interact with runtime genesis config +sp-genesis-builder = { path = "../../../substrate/primitives/genesis-builder", default-features = false } +sp-runtime = { path = "../../../substrate/primitives/runtime", default-features = false, features = ["serde"] } + +# local pallet templates +pallet-minimal-template = { path = "../pallets/template", default-features = false } + +[build-dependencies] +substrate-wasm-builder = { path = "../../../substrate/utils/wasm-builder", optional = true } + +[features] +default = ["std"] +std = [ + "parity-scale-codec/std", + "scale-info/std", + + "frame/std", + + "pallet-balances/std", + "pallet-sudo/std", + "pallet-timestamp/std", + "pallet-transaction-payment-rpc-runtime-api/std", + "pallet-transaction-payment/std", + + "pallet-minimal-template/std", + + "sp-genesis-builder/std", + "sp-runtime/std", + "substrate-wasm-builder", +] diff --git a/substrate/bin/minimal/runtime/build.rs b/templates/minimal/runtime/build.rs similarity index 100% rename from substrate/bin/minimal/runtime/build.rs rename to templates/minimal/runtime/build.rs diff --git a/substrate/bin/minimal/runtime/src/lib.rs b/templates/minimal/runtime/src/lib.rs similarity index 87% rename from substrate/bin/minimal/runtime/src/lib.rs rename to templates/minimal/runtime/src/lib.rs index 610289693d91b778295b3e48569fc887f805a204..794f30a054a8e3ef9b50bd3f29e83dc572f62005 100644 --- a/substrate/bin/minimal/runtime/src/lib.rs +++ b/templates/minimal/runtime/src/lib.rs @@ -22,21 +22,24 @@ include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs")); use frame::{ - deps::frame_support::weights::{FixedFee, NoFee}, + deps::frame_support::{ + genesis_builder_helper::{build_state, get_preset}, + weights::{FixedFee, NoFee}, + }, prelude::*, runtime::{ apis::{ - self, impl_runtime_apis, ApplyExtrinsicResult, CheckInherentsResult, OpaqueMetadata, + self, impl_runtime_apis, ApplyExtrinsicResult, CheckInherentsResult, + ExtrinsicInclusionMode, OpaqueMetadata, }, prelude::*, }, }; -use frame_support::genesis_builder_helper::{build_config, create_default_config}; #[runtime_version] pub const VERSION: RuntimeVersion = RuntimeVersion { - spec_name: create_runtime_str!("minimal-runtime"), - impl_name: create_runtime_str!("minimal-runtime"), + spec_name: create_runtime_str!("minimal-template-runtime"), + impl_name: create_runtime_str!("minimal-template-runtime"), authoring_version: 1, spec_version: 0, impl_version: 1, @@ -70,6 +73,9 @@ construct_runtime!( Balances: pallet_balances, Sudo: pallet_sudo, TransactionPayment: pallet_transaction_payment, + + // our local pallet + Template: pallet_minimal_template, } ); @@ -77,7 +83,7 @@ parameter_types! { pub const Version: RuntimeVersion = VERSION; } -#[derive_impl(frame_system::config_preludes::SolochainDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::SolochainDefaultConfig)] impl frame_system::Config for Runtime { type Block = Block; type Version = Version; @@ -85,24 +91,26 @@ impl frame_system::Config for Runtime { type AccountData = pallet_balances::AccountData<::Balance>; } -#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig as pallet_balances::DefaultConfig)] +#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)] impl pallet_balances::Config for Runtime { type AccountStore = System; } -#[derive_impl(pallet_sudo::config_preludes::TestDefaultConfig as pallet_sudo::DefaultConfig)] +#[derive_impl(pallet_sudo::config_preludes::TestDefaultConfig)] impl pallet_sudo::Config for Runtime {} -#[derive_impl(pallet_timestamp::config_preludes::TestDefaultConfig as pallet_timestamp::DefaultConfig)] +#[derive_impl(pallet_timestamp::config_preludes::TestDefaultConfig)] impl pallet_timestamp::Config for Runtime {} -#[derive_impl(pallet_transaction_payment::config_preludes::TestDefaultConfig as pallet_transaction_payment::DefaultConfig)] +#[derive_impl(pallet_transaction_payment::config_preludes::TestDefaultConfig)] impl pallet_transaction_payment::Config for Runtime { - type OnChargeTransaction = pallet_transaction_payment::CurrencyAdapter; + type OnChargeTransaction = pallet_transaction_payment::FungibleAdapter; type WeightToFee = NoFee<::Balance>; type LengthToFee = FixedFee<1, ::Balance>; } +impl pallet_minimal_template::Config for Runtime {} + type Block = frame::runtime::types_common::BlockOf; type Header = HeaderFor; @@ -121,7 +129,7 @@ impl_runtime_apis! { RuntimeExecutive::execute_block(block) } - fn initialize_block(header: &Header) { + fn initialize_block(header: &Header) -> ExtrinsicInclusionMode { RuntimeExecutive::initialize_block(header) } } @@ -213,12 +221,16 @@ impl_runtime_apis! { } impl sp_genesis_builder::GenesisBuilder for Runtime { - fn create_default_config() -> Vec { - create_default_config::() + fn build_state(config: Vec) -> sp_genesis_builder::Result { + build_state::(config) + } + + fn get_preset(id: &Option) -> Option> { + get_preset::(id, |_| None) } - fn build_config(config: Vec) -> sp_genesis_builder::Result { - build_config::(config) + fn preset_names() -> Vec { + vec![] } } } diff --git a/cumulus/parachain-template/LICENSE b/templates/parachain/LICENSE similarity index 100% rename from cumulus/parachain-template/LICENSE rename to templates/parachain/LICENSE diff --git a/cumulus/parachain-template/README.md b/templates/parachain/README.md similarity index 100% rename from cumulus/parachain-template/README.md rename to templates/parachain/README.md diff --git a/cumulus/parachain-template/node/Cargo.toml b/templates/parachain/node/Cargo.toml similarity index 72% rename from cumulus/parachain-template/node/Cargo.toml rename to templates/parachain/node/Cargo.toml index c66c96056b956f8ebb4cecff39f2ecf0269dc12c..63267acdbca83fb7035b51bd100a1fd13ee2d8e7 100644 --- a/cumulus/parachain-template/node/Cargo.toml +++ b/templates/parachain/node/Cargo.toml @@ -1,26 +1,29 @@ [package] name = "parachain-template-node" -version = "0.1.0" -authors = ["Anonymous"] -description = "A new Cumulus FRAME-based Substrate Node, ready for hacking together a parachain." -license = "Unlicense" -homepage = "https://substrate.io" +description = "A parachain node template built with Substrate and Cumulus, part of Polkadot Sdk." +version = "0.0.0" +license = "MIT-0" +authors.workspace = true +homepage.workspace = true repository.workspace = true edition.workspace = true -build = "build.rs" publish = false +build = "build.rs" [lints] workspace = true +# [[bin]] +# name = "parachain-template-node" + [dependencies] -clap = { version = "4.4.18", features = ["derive"] } -log = "0.4.20" +clap = { version = "4.5.3", features = ["derive"] } +log = { workspace = true, default-features = true } codec = { package = "parity-scale-codec", version = "3.0.0" } -serde = { version = "1.0.195", features = ["derive"] } -jsonrpsee = { version = "0.20.3", features = ["server"] } +serde = { features = ["derive"], workspace = true, default-features = true } +jsonrpsee = { version = "0.22", features = ["server"] } futures = "0.3.28" -serde_json = "1.0.111" +serde_json = { workspace = true, default-features = true } # Local parachain-template-runtime = { path = "../runtime" } @@ -63,15 +66,15 @@ polkadot-primitives = { path = "../../../polkadot/primitives" } xcm = { package = "staging-xcm", path = "../../../polkadot/xcm", default-features = false } # Cumulus -cumulus-client-cli = { path = "../../client/cli" } -cumulus-client-collator = { path = "../../client/collator" } -cumulus-client-consensus-aura = { path = "../../client/consensus/aura" } -cumulus-client-consensus-common = { path = "../../client/consensus/common" } -cumulus-client-consensus-proposer = { path = "../../client/consensus/proposer" } -cumulus-client-service = { path = "../../client/service" } -cumulus-primitives-core = { path = "../../primitives/core" } -cumulus-primitives-parachain-inherent = { path = "../../primitives/parachain-inherent" } -cumulus-relay-chain-interface = { path = "../../client/relay-chain-interface" } +cumulus-client-cli = { path = "../../../cumulus/client/cli" } +cumulus-client-collator = { path = "../../../cumulus/client/collator" } +cumulus-client-consensus-aura = { path = "../../../cumulus/client/consensus/aura" } +cumulus-client-consensus-common = { path = "../../../cumulus/client/consensus/common" } +cumulus-client-consensus-proposer = { path = "../../../cumulus/client/consensus/proposer" } +cumulus-client-service = { path = "../../../cumulus/client/service" } +cumulus-primitives-core = { path = "../../../cumulus/primitives/core" } +cumulus-primitives-parachain-inherent = { path = "../../../cumulus/primitives/parachain-inherent" } +cumulus-relay-chain-interface = { path = "../../../cumulus/client/relay-chain-interface" } color-print = "0.3.4" [build-dependencies] diff --git a/cumulus/parachain-template/node/build.rs b/templates/parachain/node/build.rs similarity index 100% rename from cumulus/parachain-template/node/build.rs rename to templates/parachain/node/build.rs diff --git a/cumulus/parachain-template/node/src/chain_spec.rs b/templates/parachain/node/src/chain_spec.rs similarity index 93% rename from cumulus/parachain-template/node/src/chain_spec.rs rename to templates/parachain/node/src/chain_spec.rs index a79c78699c07102aca27ed06c73f93ccf86ed3ce..16c91865cdb4aa9ae3c5882652100f5ef56a988c 100644 --- a/cumulus/parachain-template/node/src/chain_spec.rs +++ b/templates/parachain/node/src/chain_spec.rs @@ -1,5 +1,6 @@ use cumulus_primitives_core::ParaId; -use parachain_template_runtime::{AccountId, AuraId, Signature, EXISTENTIAL_DEPOSIT}; +use parachain_template_runtime as runtime; +use runtime::{AccountId, AuraId, Signature, EXISTENTIAL_DEPOSIT}; use sc_chain_spec::{ChainSpecExtension, ChainSpecGroup}; use sc_service::ChainType; use serde::{Deserialize, Serialize}; @@ -56,8 +57,8 @@ where /// Generate the session keys from individual elements. /// /// The input must be a tuple of individual keys (a single arg for now since we have just one key). -pub fn template_session_keys(keys: AuraId) -> parachain_template_runtime::SessionKeys { - parachain_template_runtime::SessionKeys { aura: keys } +pub fn template_session_keys(keys: AuraId) -> runtime::SessionKeys { + runtime::SessionKeys { aura: keys } } pub fn development_config() -> ChainSpec { @@ -68,8 +69,7 @@ pub fn development_config() -> ChainSpec { properties.insert("ss58Format".into(), 42.into()); ChainSpec::builder( - parachain_template_runtime::WASM_BINARY - .expect("WASM binary was not built, please build it!"), + runtime::WASM_BINARY.expect("WASM binary was not built, please build it!"), Extensions { relay_chain: "rococo-local".into(), // You MUST set this to the correct network! @@ -120,8 +120,7 @@ pub fn local_testnet_config() -> ChainSpec { #[allow(deprecated)] ChainSpec::builder( - parachain_template_runtime::WASM_BINARY - .expect("WASM binary was not built, please build it!"), + runtime::WASM_BINARY.expect("WASM binary was not built, please build it!"), Extensions { relay_chain: "rococo-local".into(), // You MUST set this to the correct network! diff --git a/cumulus/parachain-template/node/src/cli.rs b/templates/parachain/node/src/cli.rs similarity index 93% rename from cumulus/parachain-template/node/src/cli.rs rename to templates/parachain/node/src/cli.rs index 73ef996b7504114b3578604a8d2c37661c9261fc..cffbfbc1db23f8b28d234e78f781977d7face5ab 100644 --- a/cumulus/parachain-template/node/src/cli.rs +++ b/templates/parachain/node/src/cli.rs @@ -37,11 +37,6 @@ pub enum Subcommand { /// The pallet benchmarking moved to the `pallet` sub-command. #[command(subcommand)] Benchmark(frame_benchmarking_cli::BenchmarkCmd), - - /// Try-runtime has migrated to a standalone - /// [CLI](). The subcommand exists as a stub and - /// deprecation notice. It will be removed entirely some time after Janurary 2024. - TryRuntime, } const AFTER_HELP_EXAMPLE: &str = color_print::cstr!( diff --git a/cumulus/parachain-template/node/src/command.rs b/templates/parachain/node/src/command.rs similarity index 94% rename from cumulus/parachain-template/node/src/command.rs rename to templates/parachain/node/src/command.rs index 6ddb68a359a786be617e384b16d7292c3db45a88..56ae022cad2b22757af87cef08d179433e9db509 100644 --- a/cumulus/parachain-template/node/src/command.rs +++ b/templates/parachain/node/src/command.rs @@ -1,5 +1,6 @@ use std::net::SocketAddr; +use cumulus_client_service::storage_proof_size::HostFunctions as ReclaimHostFunctions; use cumulus_primitives_core::ParaId; use frame_benchmarking_cli::{BenchmarkCmd, SUBSTRATE_REFERENCE_HARDWARE}; use log::info; @@ -9,7 +10,6 @@ use sc_cli::{ NetworkParams, Result, SharedParams, SubstrateCli, }; use sc_service::config::{BasePath, PrometheusConfig}; -use sp_runtime::traits::AccountIdConversion; use crate::{ chain_spec, @@ -183,7 +183,7 @@ pub fn run() -> Result<()> { match cmd { BenchmarkCmd::Pallet(cmd) => if cfg!(feature = "runtime-benchmarks") { - runner.sync_run(|config| cmd.run::(config)) + runner.sync_run(|config| cmd.run_with_spec::, ReclaimHostFunctions>(Some(config.chain_spec))) } else { Err("Benchmarking wasn't enabled when building the node. \ You can enable it with `--features runtime-benchmarks`." @@ -216,7 +216,6 @@ pub fn run() -> Result<()> { _ => Err("Benchmarking sub-command unsupported".into()), } }, - Some(Subcommand::TryRuntime) => Err("The `try-runtime` subcommand has been migrated to a standalone CLI (https://github.com/paritytech/try-runtime-cli). It is no longer being maintained here and will be removed entirely some time after January 2024. Please remove this subcommand from your runtime and use the standalone CLI.".into()), None => { let runner = cli.create_runner(&cli.run.normalize())?; let collator_options = cli.run.collator_options(); @@ -240,17 +239,11 @@ pub fn run() -> Result<()> { let id = ParaId::from(para_id); - let parachain_account = - AccountIdConversion::::into_account_truncating( - &id, - ); - let tokio_handle = config.tokio_handle.clone(); let polkadot_config = SubstrateCli::create_configuration(&polkadot_cli, &polkadot_cli, tokio_handle) .map_err(|err| format!("Relay chain argument error: {}", err))?; - info!("Parachain Account: {parachain_account}"); info!("Is collating: {}", if config.role.is_authority() { "yes" } else { "no" }); crate::service::start_parachain_node( diff --git a/cumulus/parachain-template/node/src/main.rs b/templates/parachain/node/src/main.rs similarity index 100% rename from cumulus/parachain-template/node/src/main.rs rename to templates/parachain/node/src/main.rs diff --git a/cumulus/parachain-template/node/src/rpc.rs b/templates/parachain/node/src/rpc.rs similarity index 100% rename from cumulus/parachain-template/node/src/rpc.rs rename to templates/parachain/node/src/rpc.rs diff --git a/cumulus/parachain-template/node/src/service.rs b/templates/parachain/node/src/service.rs similarity index 87% rename from cumulus/parachain-template/node/src/service.rs rename to templates/parachain/node/src/service.rs index 830b6e82f969190b69425bd59a939c49372bf9f3..373df01b0c435d0a79092bb18460c3051b1f9519 100644 --- a/cumulus/parachain-template/node/src/service.rs +++ b/templates/parachain/node/src/service.rs @@ -6,8 +6,8 @@ use std::{sync::Arc, time::Duration}; use cumulus_client_cli::CollatorOptions; // Local Runtime Types use parachain_template_runtime::{ + apis::RuntimeApi, opaque::{Block, Hash}, - RuntimeApi, }; // Cumulus Imports @@ -16,7 +16,8 @@ use cumulus_client_consensus_common::ParachainBlockImport as TParachainBlockImpo use cumulus_client_consensus_proposer::Proposer; use cumulus_client_service::{ build_network, build_relay_chain_interface, prepare_node_config, start_relay_chain_tasks, - BuildNetworkParams, CollatorSybilResistance, DARecoveryProfile, StartRelayChainTasksParams, + BuildNetworkParams, CollatorSybilResistance, DARecoveryProfile, ParachainHostFunctions, + StartRelayChainTasksParams, }; use cumulus_primitives_core::{relay_chain::CollatorPair, ParaId}; use cumulus_relay_chain_interface::{OverseerHandle, RelayChainInterface}; @@ -25,9 +26,7 @@ use cumulus_relay_chain_interface::{OverseerHandle, RelayChainInterface}; use frame_benchmarking_cli::SUBSTRATE_REFERENCE_HARDWARE; use sc_client_api::Backend; use sc_consensus::ImportQueue; -use sc_executor::{ - HeapAllocStrategy, NativeElseWasmExecutor, WasmExecutor, DEFAULT_HEAP_ALLOC_STRATEGY, -}; +use sc_executor::{HeapAllocStrategy, WasmExecutor, DEFAULT_HEAP_ALLOC_STRATEGY}; use sc_network::NetworkBlock; use sc_network_sync::SyncingService; use sc_service::{Configuration, PartialComponents, TFullBackend, TFullClient, TaskManager}; @@ -36,22 +35,7 @@ use sc_transaction_pool_api::OffchainTransactionPoolFactory; use sp_keystore::KeystorePtr; use substrate_prometheus_endpoint::Registry; -/// Native executor type. -pub struct ParachainNativeExecutor; - -impl sc_executor::NativeExecutionDispatch for ParachainNativeExecutor { - type ExtendHostFunctions = frame_benchmarking::benchmarking::HostFunctions; - - fn dispatch(method: &str, data: &[u8]) -> Option> { - parachain_template_runtime::api::dispatch(method, data) - } - - fn native_version() -> sc_executor::NativeVersion { - parachain_template_runtime::native_version() - } -} - -type ParachainExecutor = NativeElseWasmExecutor; +type ParachainExecutor = WasmExecutor; type ParachainClient = TFullClient; @@ -89,7 +73,7 @@ pub fn new_partial(config: &Configuration) -> Result .default_heap_pages .map_or(DEFAULT_HEAP_ALLOC_STRATEGY, |h| HeapAllocStrategy::Static { extra_pages: h as _ }); - let wasm = WasmExecutor::builder() + let executor = ParachainExecutor::builder() .with_execution_method(config.wasm_method) .with_onchain_heap_alloc_strategy(heap_pages) .with_offchain_heap_alloc_strategy(heap_pages) @@ -97,13 +81,12 @@ pub fn new_partial(config: &Configuration) -> Result .with_runtime_cache_size(config.runtime_cache_size) .build(); - let executor = ParachainExecutor::new_with_wasm_executor(wasm); - let (client, backend, keystore_container, task_manager) = - sc_service::new_full_parts::( + sc_service::new_full_parts_record_import::( config, telemetry.as_ref().map(|(_, telemetry)| telemetry.handle()), executor, + true, )?; let client = Arc::new(client); @@ -130,7 +113,7 @@ pub fn new_partial(config: &Configuration) -> Result config, telemetry.as_ref().map(|telemetry| telemetry.handle()), &task_manager, - )?; + ); Ok(PartialComponents { backend, @@ -144,11 +127,100 @@ pub fn new_partial(config: &Configuration) -> Result }) } +/// Build the import queue for the parachain runtime. +fn build_import_queue( + client: Arc, + block_import: ParachainBlockImport, + config: &Configuration, + telemetry: Option, + task_manager: &TaskManager, +) -> sc_consensus::DefaultImportQueue { + cumulus_client_consensus_aura::equivocation_import_queue::fully_verifying_import_queue::< + sp_consensus_aura::sr25519::AuthorityPair, + _, + _, + _, + _, + >( + client, + block_import, + move |_, _| async move { + let timestamp = sp_timestamp::InherentDataProvider::from_system_time(); + Ok(timestamp) + }, + &task_manager.spawn_essential_handle(), + config.prometheus_registry(), + telemetry, + ) +} + +fn start_consensus( + client: Arc, + block_import: ParachainBlockImport, + prometheus_registry: Option<&Registry>, + telemetry: Option, + task_manager: &TaskManager, + relay_chain_interface: Arc, + transaction_pool: Arc>, + sync_oracle: Arc>, + keystore: KeystorePtr, + relay_chain_slot_duration: Duration, + para_id: ParaId, + collator_key: CollatorPair, + overseer_handle: OverseerHandle, + announce_block: Arc>) + Send + Sync>, +) -> Result<(), sc_service::Error> { + use cumulus_client_consensus_aura::collators::basic::{ + self as basic_aura, Params as BasicAuraParams, + }; + + let proposer_factory = sc_basic_authorship::ProposerFactory::with_proof_recording( + task_manager.spawn_handle(), + client.clone(), + transaction_pool, + prometheus_registry, + telemetry.clone(), + ); + + let proposer = Proposer::new(proposer_factory); + + let collator_service = CollatorService::new( + client.clone(), + Arc::new(task_manager.spawn_handle()), + announce_block, + client.clone(), + ); + + let params = BasicAuraParams { + create_inherent_data_providers: move |_, ()| async move { Ok(()) }, + block_import, + para_client: client, + relay_client: relay_chain_interface, + sync_oracle, + keystore, + collator_key, + para_id, + overseer_handle, + relay_chain_slot_duration, + proposer, + collator_service, + // Very limited proposal time. + authoring_duration: Duration::from_millis(500), + collation_request_receiver: None, + }; + + let fut = + basic_aura::run::( + params, + ); + task_manager.spawn_essential_handle().spawn("aura", None, fut); + + Ok(()) +} + /// Start a node with the given parachain `Configuration` and relay chain `Configuration`. -/// -/// This is the actual implementation that is abstract over the executor and the runtime api. #[sc_tracing::logging::prefix_logs_with("Parachain")] -async fn start_node_impl( +pub async fn start_parachain_node( parachain_config: Configuration, polkadot_config: Configuration, collator_options: CollatorOptions, @@ -159,7 +231,11 @@ async fn start_node_impl( let params = new_partial(¶chain_config)?; let (block_import, mut telemetry, telemetry_worker_handle) = params.other; - let net_config = sc_network::config::FullNetworkConfiguration::new(¶chain_config.network); + let net_config = sc_network::config::FullNetworkConfiguration::< + _, + _, + sc_network::NetworkWorker, + >::new(¶chain_config.network); let client = params.client.clone(); let backend = params.backend.clone(); @@ -181,6 +257,8 @@ async fn start_node_impl( let transaction_pool = params.transaction_pool.clone(); let import_queue_service = params.import_queue.service(); + // NOTE: because we use Aura here explicitly, we can use `CollatorSybilResistance::Resistant` + // when starting the network. let (network, system_rpc_tx, tx_handler_controller, start_network, sync_service) = build_network(BuildNetworkParams { parachain_config: ¶chain_config, @@ -208,7 +286,7 @@ async fn start_node_impl( transaction_pool: Some(OffchainTransactionPoolFactory::new( transaction_pool.clone(), )), - network_provider: network.clone(), + network_provider: Arc::new(network.clone()), is_validator: parachain_config.role.is_authority(), enable_http_requests: false, custom_extensions: move |_| vec![], @@ -324,114 +402,3 @@ async fn start_node_impl( Ok((task_manager, client)) } - -/// Build the import queue for the parachain runtime. -fn build_import_queue( - client: Arc, - block_import: ParachainBlockImport, - config: &Configuration, - telemetry: Option, - task_manager: &TaskManager, -) -> Result, sc_service::Error> { - let slot_duration = cumulus_client_consensus_aura::slot_duration(&*client)?; - - Ok(cumulus_client_consensus_aura::equivocation_import_queue::fully_verifying_import_queue::< - sp_consensus_aura::sr25519::AuthorityPair, - _, - _, - _, - _, - >( - client, - block_import, - move |_, _| async move { - let timestamp = sp_timestamp::InherentDataProvider::from_system_time(); - Ok(timestamp) - }, - slot_duration, - &task_manager.spawn_essential_handle(), - config.prometheus_registry(), - telemetry, - )) -} - -fn start_consensus( - client: Arc, - block_import: ParachainBlockImport, - prometheus_registry: Option<&Registry>, - telemetry: Option, - task_manager: &TaskManager, - relay_chain_interface: Arc, - transaction_pool: Arc>, - sync_oracle: Arc>, - keystore: KeystorePtr, - relay_chain_slot_duration: Duration, - para_id: ParaId, - collator_key: CollatorPair, - overseer_handle: OverseerHandle, - announce_block: Arc>) + Send + Sync>, -) -> Result<(), sc_service::Error> { - use cumulus_client_consensus_aura::collators::basic::{ - self as basic_aura, Params as BasicAuraParams, - }; - - // NOTE: because we use Aura here explicitly, we can use `CollatorSybilResistance::Resistant` - // when starting the network. - - let slot_duration = cumulus_client_consensus_aura::slot_duration(&*client)?; - - let proposer_factory = sc_basic_authorship::ProposerFactory::with_proof_recording( - task_manager.spawn_handle(), - client.clone(), - transaction_pool, - prometheus_registry, - telemetry.clone(), - ); - - let proposer = Proposer::new(proposer_factory); - - let collator_service = CollatorService::new( - client.clone(), - Arc::new(task_manager.spawn_handle()), - announce_block, - client.clone(), - ); - - let params = BasicAuraParams { - create_inherent_data_providers: move |_, ()| async move { Ok(()) }, - block_import, - para_client: client, - relay_client: relay_chain_interface, - sync_oracle, - keystore, - collator_key, - para_id, - overseer_handle, - slot_duration, - relay_chain_slot_duration, - proposer, - collator_service, - // Very limited proposal time. - authoring_duration: Duration::from_millis(500), - collation_request_receiver: None, - }; - - let fut = - basic_aura::run::( - params, - ); - task_manager.spawn_essential_handle().spawn("aura", None, fut); - - Ok(()) -} - -/// Start a parachain node. -pub async fn start_parachain_node( - parachain_config: Configuration, - polkadot_config: Configuration, - collator_options: CollatorOptions, - para_id: ParaId, - hwbench: Option, -) -> sc_service::error::Result<(TaskManager, Arc)> { - start_node_impl(parachain_config, polkadot_config, collator_options, para_id, hwbench).await -} diff --git a/cumulus/parachain-template/pallets/template/Cargo.toml b/templates/parachain/pallets/template/Cargo.toml similarity index 65% rename from cumulus/parachain-template/pallets/template/Cargo.toml rename to templates/parachain/pallets/template/Cargo.toml index 2318375fec9c8d338e9e83ba12fa7b65449c41a9..199da2f12d2c691ba6d51d009c6b20734b1c4c46 100644 --- a/cumulus/parachain-template/pallets/template/Cargo.toml +++ b/templates/parachain/pallets/template/Cargo.toml @@ -1,12 +1,13 @@ [package] name = "pallet-parachain-template" -authors = ["Anonymous"] description = "FRAME pallet template for defining custom runtime logic." -version = "0.7.0" -license = "Unlicense" -homepage = "https://substrate.io" +version = "0.0.0" +license = "MIT-0" +authors.workspace = true +homepage.workspace = true repository.workspace = true edition.workspace = true +publish = false [lints] workspace = true @@ -15,21 +16,22 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -codec = { package = "parity-scale-codec", version = "3.0.0", features = ["derive"], default-features = false } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = [ + "derive", +] } +scale-info = { version = "2.11.1", default-features = false, features = [ + "derive", +] } -# Substrate +# frame deps frame-benchmarking = { path = "../../../../substrate/frame/benchmarking", default-features = false, optional = true } frame-support = { path = "../../../../substrate/frame/support", default-features = false } frame-system = { path = "../../../../substrate/frame/system", default-features = false } [dev-dependencies] -serde = { version = "1.0.195" } - -# Substrate -sp-core = { path = "../../../../substrate/primitives/core", default-features = false } -sp-io = { path = "../../../../substrate/primitives/io", default-features = false } -sp-runtime = { path = "../../../../substrate/primitives/runtime", default-features = false } +sp-core = { path = "../../../../substrate/primitives/core" } +sp-io = { path = "../../../../substrate/primitives/io" } +sp-runtime = { path = "../../../../substrate/primitives/runtime" } [features] default = ["std"] @@ -41,7 +43,7 @@ runtime-benchmarks = [ ] std = [ "codec/std", - "frame-benchmarking/std", + "frame-benchmarking?/std", "frame-support/std", "frame-system/std", "scale-info/std", diff --git a/substrate/bin/node-template/pallets/template/README.md b/templates/parachain/pallets/template/README.md similarity index 100% rename from substrate/bin/node-template/pallets/template/README.md rename to templates/parachain/pallets/template/README.md diff --git a/substrate/bin/node-template/pallets/template/src/benchmarking.rs b/templates/parachain/pallets/template/src/benchmarking.rs similarity index 100% rename from substrate/bin/node-template/pallets/template/src/benchmarking.rs rename to templates/parachain/pallets/template/src/benchmarking.rs diff --git a/cumulus/parachain-template/pallets/template/src/lib.rs b/templates/parachain/pallets/template/src/lib.rs similarity index 96% rename from cumulus/parachain-template/pallets/template/src/lib.rs rename to templates/parachain/pallets/template/src/lib.rs index 5f3252bfc3a70aa731bf572493a3797bfef574bb..11587d1df426f485139eab9e333b292768c6c571 100644 --- a/cumulus/parachain-template/pallets/template/src/lib.rs +++ b/templates/parachain/pallets/template/src/lib.rs @@ -11,6 +11,8 @@ mod mock; #[cfg(test)] mod tests; +pub mod weights; + #[cfg(feature = "runtime-benchmarks")] mod benchmarking; @@ -24,6 +26,8 @@ pub mod pallet { pub trait Config: frame_system::Config { /// Because this pallet emits events, it depends on the runtime's definition of an event. type RuntimeEvent: From> + IsType<::RuntimeEvent>; + /// A type representing the weights required by the dispatchables of this pallet. + type WeightInfo: crate::weights::WeightInfo; } #[pallet::pallet] @@ -32,7 +36,6 @@ pub mod pallet { // The pallet's runtime storage items. // https://docs.substrate.io/v3/runtime/storage #[pallet::storage] - #[pallet::getter(fn something)] // Learn more about declaring storage items: // https://docs.substrate.io/v3/runtime/storage#declaring-storage-items pub type Something = StorageValue<_, u32>; diff --git a/cumulus/parachain-template/pallets/template/src/mock.rs b/templates/parachain/pallets/template/src/mock.rs similarity index 94% rename from cumulus/parachain-template/pallets/template/src/mock.rs rename to templates/parachain/pallets/template/src/mock.rs index 411a16b116c8f94757c29a686022842e159e6924..8a88be3e3e9f6d08137ae1bb16767145e2d84aa9 100644 --- a/cumulus/parachain-template/pallets/template/src/mock.rs +++ b/templates/parachain/pallets/template/src/mock.rs @@ -22,7 +22,7 @@ parameter_types! { pub const SS58Prefix: u8 = 42; } -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl system::Config for Test { type BaseCallFilter = Everything; type BlockWeights = (); @@ -51,6 +51,7 @@ impl system::Config for Test { impl crate::Config for Test { type RuntimeEvent = RuntimeEvent; + type WeightInfo = (); } // Build genesis storage according to the mock runtime. diff --git a/cumulus/parachain-template/pallets/template/src/tests.rs b/templates/parachain/pallets/template/src/tests.rs similarity index 86% rename from cumulus/parachain-template/pallets/template/src/tests.rs rename to templates/parachain/pallets/template/src/tests.rs index 527aec8ed00c058e5a9329a50d60267d7f9d1851..9ad3076be2cc9927063e1b50c293cafadf8f3361 100644 --- a/cumulus/parachain-template/pallets/template/src/tests.rs +++ b/templates/parachain/pallets/template/src/tests.rs @@ -1,4 +1,4 @@ -use crate::{mock::*, Error}; +use crate::{mock::*, Error, Something}; use frame_support::{assert_noop, assert_ok}; #[test] @@ -7,7 +7,7 @@ fn it_works_for_default_value() { // Dispatch a signed extrinsic. assert_ok!(TemplateModule::do_something(RuntimeOrigin::signed(1), 42)); // Read pallet storage and assert an expected result. - assert_eq!(TemplateModule::something(), Some(42)); + assert_eq!(Something::::get(), Some(42)); }); } diff --git a/substrate/bin/node-template/pallets/template/src/weights.rs b/templates/parachain/pallets/template/src/weights.rs similarity index 100% rename from substrate/bin/node-template/pallets/template/src/weights.rs rename to templates/parachain/pallets/template/src/weights.rs diff --git a/cumulus/parachain-template/polkadot-launch/config.json b/templates/parachain/polkadot-launch/config.json similarity index 100% rename from cumulus/parachain-template/polkadot-launch/config.json rename to templates/parachain/polkadot-launch/config.json diff --git a/cumulus/parachain-template/runtime/Cargo.toml b/templates/parachain/runtime/Cargo.toml similarity index 80% rename from cumulus/parachain-template/runtime/Cargo.toml rename to templates/parachain/runtime/Cargo.toml index e4575d196c799e82049ecc69cba03174c16e4a88..0d985796a11e880123f9b7ca71bf123fe1b48184 100644 --- a/cumulus/parachain-template/runtime/Cargo.toml +++ b/templates/parachain/runtime/Cargo.toml @@ -1,12 +1,13 @@ [package] name = "parachain-template-runtime" -version = "0.7.0" -authors = ["Anonymous"] -description = "A new Cumulus FRAME-based Substrate Runtime, ready for hacking together a parachain." -license = "Unlicense" -homepage = "https://substrate.io" +description = "A parachain runtime template built with Substrate and Cumulus, part of Polkadot Sdk." +version = "0.0.0" +license = "MIT-0" +authors.workspace = true +homepage.workspace = true repository.workspace = true edition.workspace = true +publish = false [lints] workspace = true @@ -18,16 +19,20 @@ targets = ["x86_64-unknown-linux-gnu"] substrate-wasm-builder = { path = "../../../substrate/utils/wasm-builder", optional = true } [dependencies] -codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } +codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = [ + "derive", +] } hex-literal = { version = "0.4.1", optional = true } -log = { version = "0.4.20", default-features = false } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +log = { workspace = true } +scale-info = { version = "2.11.1", default-features = false, features = [ + "derive", +] } smallvec = "1.11.0" # Local pallet-parachain-template = { path = "../pallets/template", default-features = false } -# Substrate +# Substrate / FRAME frame-benchmarking = { path = "../../../substrate/frame/benchmarking", default-features = false, optional = true } frame-executive = { path = "../../../substrate/frame/executive", default-features = false } frame-support = { path = "../../../substrate/frame/support", default-features = false } @@ -35,6 +40,8 @@ frame-system = { path = "../../../substrate/frame/system", default-features = fa frame-system-benchmarking = { path = "../../../substrate/frame/system/benchmarking", default-features = false, optional = true } frame-system-rpc-runtime-api = { path = "../../../substrate/frame/system/rpc/runtime-api", default-features = false } frame-try-runtime = { path = "../../../substrate/frame/try-runtime", default-features = false, optional = true } + +# FRAME Pallets pallet-aura = { path = "../../../substrate/frame/aura", default-features = false } pallet-authorship = { path = "../../../substrate/frame/authorship", default-features = false } pallet-balances = { path = "../../../substrate/frame/balances", default-features = false } @@ -44,6 +51,8 @@ pallet-sudo = { path = "../../../substrate/frame/sudo", default-features = false pallet-timestamp = { path = "../../../substrate/frame/timestamp", default-features = false } pallet-transaction-payment = { path = "../../../substrate/frame/transaction-payment", default-features = false } pallet-transaction-payment-rpc-runtime-api = { path = "../../../substrate/frame/transaction-payment/rpc/runtime-api", default-features = false } + +# Substrate Primitives sp-api = { path = "../../../substrate/primitives/api", default-features = false } sp-block-builder = { path = "../../../substrate/primitives/block-builder", default-features = false } sp-consensus-aura = { path = "../../../substrate/primitives/consensus/aura", default-features = false } @@ -66,16 +75,19 @@ xcm-builder = { package = "staging-xcm-builder", path = "../../../polkadot/xcm/x xcm-executor = { package = "staging-xcm-executor", path = "../../../polkadot/xcm/xcm-executor", default-features = false } # Cumulus -cumulus-pallet-aura-ext = { path = "../../pallets/aura-ext", default-features = false } -cumulus-pallet-parachain-system = { path = "../../pallets/parachain-system", default-features = false, features = ["parameterized-consensus-hook"] } -cumulus-pallet-session-benchmarking = { path = "../../pallets/session-benchmarking", default-features = false } -cumulus-pallet-xcm = { path = "../../pallets/xcm", default-features = false } -cumulus-pallet-xcmp-queue = { path = "../../pallets/xcmp-queue", default-features = false } -cumulus-primitives-core = { path = "../../primitives/core", default-features = false } -cumulus-primitives-utility = { path = "../../primitives/utility", default-features = false } -pallet-collator-selection = { path = "../../pallets/collator-selection", default-features = false } -parachains-common = { path = "../../parachains/common", default-features = false } -parachain-info = { package = "staging-parachain-info", path = "../../parachains/pallets/parachain-info", default-features = false } +cumulus-pallet-aura-ext = { path = "../../../cumulus/pallets/aura-ext", default-features = false } +cumulus-pallet-parachain-system = { path = "../../../cumulus/pallets/parachain-system", default-features = false, features = [ + "parameterized-consensus-hook", +] } +cumulus-pallet-session-benchmarking = { path = "../../../cumulus/pallets/session-benchmarking", default-features = false } +cumulus-pallet-xcm = { path = "../../../cumulus/pallets/xcm", default-features = false } +cumulus-pallet-xcmp-queue = { path = "../../../cumulus/pallets/xcmp-queue", default-features = false } +cumulus-primitives-core = { path = "../../../cumulus/primitives/core", default-features = false } +cumulus-primitives-utility = { path = "../../../cumulus/primitives/utility", default-features = false } +cumulus-primitives-storage-weight-reclaim = { path = "../../../cumulus/primitives/storage-weight-reclaim", default-features = false } +pallet-collator-selection = { path = "../../../cumulus/pallets/collator-selection", default-features = false } +parachains-common = { path = "../../../cumulus/parachains/common", default-features = false } +parachain-info = { package = "staging-parachain-info", path = "../../../cumulus/parachains/pallets/parachain-info", default-features = false } [features] default = ["std"] @@ -87,6 +99,7 @@ std = [ "cumulus-pallet-xcm/std", "cumulus-pallet-xcmp-queue/std", "cumulus-primitives-core/std", + "cumulus-primitives-storage-weight-reclaim/std", "cumulus-primitives-utility/std", "frame-benchmarking?/std", "frame-executive/std", @@ -181,5 +194,3 @@ try-runtime = [ "polkadot-runtime-common/try-runtime", "sp-runtime/try-runtime", ] - -experimental = ["pallet-aura/experimental"] diff --git a/cumulus/parachain-template/runtime/build.rs b/templates/parachain/runtime/build.rs similarity index 100% rename from cumulus/parachain-template/runtime/build.rs rename to templates/parachain/runtime/build.rs diff --git a/templates/parachain/runtime/src/apis.rs b/templates/parachain/runtime/src/apis.rs new file mode 100644 index 0000000000000000000000000000000000000000..b13ba278fae607c9e585ad04618d1651293436e1 --- /dev/null +++ b/templates/parachain/runtime/src/apis.rs @@ -0,0 +1,279 @@ +// This is free and unencumbered software released into the public domain. +// +// Anyone is free to copy, modify, publish, use, compile, sell, or +// distribute this software, either in source code form or as a compiled +// binary, for any purpose, commercial or non-commercial, and by any +// means. +// +// In jurisdictions that recognize copyright laws, the author or authors +// of this software dedicate any and all copyright interest in the +// software to the public domain. We make this dedication for the benefit +// of the public at large and to the detriment of our heirs and +// successors. We intend this dedication to be an overt act of +// relinquishment in perpetuity of all present and future rights to this +// software under copyright law. +// +// 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 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. +// +// For more information, please refer to + +// External crates imports +use frame_support::{ + genesis_builder_helper::{build_state, get_preset}, + weights::Weight, +}; +use pallet_aura::Authorities; +use sp_api::impl_runtime_apis; +use sp_consensus_aura::sr25519::AuthorityId as AuraId; +use sp_core::{crypto::KeyTypeId, OpaqueMetadata}; +use sp_runtime::{ + traits::Block as BlockT, + transaction_validity::{TransactionSource, TransactionValidity}, + ApplyExtrinsicResult, +}; +use sp_std::prelude::Vec; +use sp_version::RuntimeVersion; + +// Local module imports +use super::{ + AccountId, Aura, Balance, Block, Executive, InherentDataExt, Nonce, ParachainSystem, Runtime, + RuntimeCall, RuntimeGenesisConfig, SessionKeys, System, TransactionPayment, VERSION, +}; + +impl_runtime_apis! { + impl sp_consensus_aura::AuraApi for Runtime { + fn slot_duration() -> sp_consensus_aura::SlotDuration { + sp_consensus_aura::SlotDuration::from_millis(Aura::slot_duration()) + } + + fn authorities() -> Vec { + Authorities::::get().into_inner() + } + } + + impl sp_api::Core for Runtime { + fn version() -> RuntimeVersion { + VERSION + } + + fn execute_block(block: Block) { + Executive::execute_block(block) + } + + fn initialize_block(header: &::Header) -> sp_runtime::ExtrinsicInclusionMode { + Executive::initialize_block(header) + } + } + + impl sp_api::Metadata for Runtime { + fn metadata() -> OpaqueMetadata { + OpaqueMetadata::new(Runtime::metadata().into()) + } + + fn metadata_at_version(version: u32) -> Option { + Runtime::metadata_at_version(version) + } + + fn metadata_versions() -> sp_std::vec::Vec { + Runtime::metadata_versions() + } + } + + impl sp_block_builder::BlockBuilder for Runtime { + fn apply_extrinsic(extrinsic: ::Extrinsic) -> ApplyExtrinsicResult { + Executive::apply_extrinsic(extrinsic) + } + + fn finalize_block() -> ::Header { + Executive::finalize_block() + } + + fn inherent_extrinsics(data: sp_inherents::InherentData) -> Vec<::Extrinsic> { + data.create_extrinsics() + } + + fn check_inherents( + block: Block, + data: sp_inherents::InherentData, + ) -> sp_inherents::CheckInherentsResult { + data.check_extrinsics(&block) + } + } + + impl sp_transaction_pool::runtime_api::TaggedTransactionQueue for Runtime { + fn validate_transaction( + source: TransactionSource, + tx: ::Extrinsic, + block_hash: ::Hash, + ) -> TransactionValidity { + Executive::validate_transaction(source, tx, block_hash) + } + } + + impl sp_offchain::OffchainWorkerApi for Runtime { + fn offchain_worker(header: &::Header) { + Executive::offchain_worker(header) + } + } + + impl sp_session::SessionKeys for Runtime { + fn generate_session_keys(seed: Option>) -> Vec { + SessionKeys::generate(seed) + } + + fn decode_session_keys( + encoded: Vec, + ) -> Option, KeyTypeId)>> { + SessionKeys::decode_into_raw_public_keys(&encoded) + } + } + + impl frame_system_rpc_runtime_api::AccountNonceApi for Runtime { + fn account_nonce(account: AccountId) -> Nonce { + System::account_nonce(account) + } + } + + impl pallet_transaction_payment_rpc_runtime_api::TransactionPaymentApi for Runtime { + fn query_info( + uxt: ::Extrinsic, + len: u32, + ) -> pallet_transaction_payment_rpc_runtime_api::RuntimeDispatchInfo { + TransactionPayment::query_info(uxt, len) + } + fn query_fee_details( + uxt: ::Extrinsic, + len: u32, + ) -> pallet_transaction_payment::FeeDetails { + TransactionPayment::query_fee_details(uxt, len) + } + fn query_weight_to_fee(weight: Weight) -> Balance { + TransactionPayment::weight_to_fee(weight) + } + fn query_length_to_fee(length: u32) -> Balance { + TransactionPayment::length_to_fee(length) + } + } + + impl pallet_transaction_payment_rpc_runtime_api::TransactionPaymentCallApi + for Runtime + { + fn query_call_info( + call: RuntimeCall, + len: u32, + ) -> pallet_transaction_payment::RuntimeDispatchInfo { + TransactionPayment::query_call_info(call, len) + } + fn query_call_fee_details( + call: RuntimeCall, + len: u32, + ) -> pallet_transaction_payment::FeeDetails { + TransactionPayment::query_call_fee_details(call, len) + } + fn query_weight_to_fee(weight: Weight) -> Balance { + TransactionPayment::weight_to_fee(weight) + } + fn query_length_to_fee(length: u32) -> Balance { + TransactionPayment::length_to_fee(length) + } + } + + impl cumulus_primitives_core::CollectCollationInfo for Runtime { + fn collect_collation_info(header: &::Header) -> cumulus_primitives_core::CollationInfo { + ParachainSystem::collect_collation_info(header) + } + } + + #[cfg(feature = "try-runtime")] + impl frame_try_runtime::TryRuntime for Runtime { + fn on_runtime_upgrade(checks: frame_try_runtime::UpgradeCheckSelect) -> (Weight, Weight) { + use super::configs::RuntimeBlockWeights; + + let weight = Executive::try_runtime_upgrade(checks).unwrap(); + (weight, RuntimeBlockWeights::get().max_block) + } + + fn execute_block( + block: Block, + state_root_check: bool, + signature_check: bool, + select: frame_try_runtime::TryStateSelect, + ) -> Weight { + // NOTE: intentional unwrap: we don't want to propagate the error backwards, and want to + // have a backtrace here. + Executive::try_execute_block(block, state_root_check, signature_check, select).unwrap() + } + } + + #[cfg(feature = "runtime-benchmarks")] + impl frame_benchmarking::Benchmark for Runtime { + fn benchmark_metadata(extra: bool) -> ( + Vec, + Vec, + ) { + use frame_benchmarking::{Benchmarking, BenchmarkList}; + use frame_support::traits::StorageInfoTrait; + use frame_system_benchmarking::Pallet as SystemBench; + use cumulus_pallet_session_benchmarking::Pallet as SessionBench; + use super::*; + + let mut list = Vec::::new(); + list_benchmarks!(list, extra); + + let storage_info = AllPalletsWithSystem::storage_info(); + (list, storage_info) + } + + fn dispatch_benchmark( + config: frame_benchmarking::BenchmarkConfig + ) -> Result, sp_runtime::RuntimeString> { + use frame_benchmarking::{BenchmarkError, Benchmarking, BenchmarkBatch}; + use super::*; + + use frame_system_benchmarking::Pallet as SystemBench; + impl frame_system_benchmarking::Config for Runtime { + fn setup_set_code_requirements(code: &sp_std::vec::Vec) -> Result<(), BenchmarkError> { + ParachainSystem::initialize_for_set_code_benchmark(code.len() as u32); + Ok(()) + } + + fn verify_set_code() { + System::assert_last_event(cumulus_pallet_parachain_system::Event::::ValidationFunctionStored.into()); + } + } + + use cumulus_pallet_session_benchmarking::Pallet as SessionBench; + impl cumulus_pallet_session_benchmarking::Config for Runtime {} + + use frame_support::traits::WhitelistedStorageKeys; + let whitelist = AllPalletsWithSystem::whitelisted_storage_keys(); + + let mut batches = Vec::::new(); + let params = (&config, &whitelist); + add_benchmarks!(params, batches); + + if batches.is_empty() { return Err("Benchmark not found for this pallet.".into()) } + Ok(batches) + } + } + + impl sp_genesis_builder::GenesisBuilder for Runtime { + fn build_state(config: Vec) -> sp_genesis_builder::Result { + build_state::(config) + } + + fn get_preset(id: &Option) -> Option> { + get_preset::(id, |_| None) + } + + fn preset_names() -> Vec { + Default::default() + } + } +} diff --git a/templates/parachain/runtime/src/benchmarks.rs b/templates/parachain/runtime/src/benchmarks.rs new file mode 100644 index 0000000000000000000000000000000000000000..9fbf1ad82bdb854cbd68d0fa07a33e0de2a2ae43 --- /dev/null +++ b/templates/parachain/runtime/src/benchmarks.rs @@ -0,0 +1,36 @@ +// This is free and unencumbered software released into the public domain. +// +// Anyone is free to copy, modify, publish, use, compile, sell, or +// distribute this software, either in source code form or as a compiled +// binary, for any purpose, commercial or non-commercial, and by any +// means. +// +// In jurisdictions that recognize copyright laws, the author or authors +// of this software dedicate any and all copyright interest in the +// software to the public domain. We make this dedication for the benefit +// of the public at large and to the detriment of our heirs and +// successors. We intend this dedication to be an overt act of +// relinquishment in perpetuity of all present and future rights to this +// software under copyright law. +// +// 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 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. +// +// For more information, please refer to + +frame_benchmarking::define_benchmarks!( + [frame_system, SystemBench::] + [pallet_balances, Balances] + [pallet_session, SessionBench::] + [pallet_timestamp, Timestamp] + [pallet_message_queue, MessageQueue] + [pallet_sudo, Sudo] + [pallet_collator_selection, CollatorSelection] + [cumulus_pallet_parachain_system, ParachainSystem] + [cumulus_pallet_xcmp_queue, XcmpQueue] +); diff --git a/templates/parachain/runtime/src/configs/mod.rs b/templates/parachain/runtime/src/configs/mod.rs new file mode 100644 index 0000000000000000000000000000000000000000..f1aea481ee277c5b753452bab315175cb4afb741 --- /dev/null +++ b/templates/parachain/runtime/src/configs/mod.rs @@ -0,0 +1,311 @@ +// This is free and unencumbered software released into the public domain. +// +// Anyone is free to copy, modify, publish, use, compile, sell, or +// distribute this software, either in source code form or as a compiled +// binary, for any purpose, commercial or non-commercial, and by any +// means. +// +// In jurisdictions that recognize copyright laws, the author or authors +// of this software dedicate any and all copyright interest in the +// software to the public domain. We make this dedication for the benefit +// of the public at large and to the detriment of our heirs and +// successors. We intend this dedication to be an overt act of +// relinquishment in perpetuity of all present and future rights to this +// software under copyright law. +// +// 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 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. +// +// For more information, please refer to + +mod xcm_config; + +// Substrate and Polkadot dependencies +use cumulus_pallet_parachain_system::RelayNumberStrictlyIncreases; +use cumulus_primitives_core::{AggregateMessageOrigin, ParaId}; +use frame_support::{ + derive_impl, + dispatch::DispatchClass, + parameter_types, + traits::{ConstBool, ConstU32, ConstU64, ConstU8, EitherOfDiverse, TransformOrigin}, + weights::{ConstantMultiplier, Weight}, + PalletId, +}; +use frame_system::{ + limits::{BlockLength, BlockWeights}, + EnsureRoot, +}; +use pallet_xcm::{EnsureXcm, IsVoiceOfBody}; +use parachains_common::message_queue::{NarrowOriginToSibling, ParaIdToSibling}; +use polkadot_runtime_common::{ + xcm_sender::NoPriceForMessageDelivery, BlockHashCount, SlowAdjustingFeeUpdate, +}; +use sp_consensus_aura::sr25519::AuthorityId as AuraId; +use sp_runtime::Perbill; +use sp_version::RuntimeVersion; +use xcm::latest::prelude::BodyId; + +// Local module imports +use super::{ + weights::{BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight}, + AccountId, Aura, Balance, Balances, Block, BlockNumber, CollatorSelection, Hash, MessageQueue, + Nonce, PalletInfo, ParachainSystem, Runtime, RuntimeCall, RuntimeEvent, RuntimeFreezeReason, + RuntimeHoldReason, RuntimeOrigin, RuntimeTask, Session, SessionKeys, System, WeightToFee, + XcmpQueue, AVERAGE_ON_INITIALIZE_RATIO, BLOCK_PROCESSING_VELOCITY, EXISTENTIAL_DEPOSIT, HOURS, + MAXIMUM_BLOCK_WEIGHT, MICROUNIT, NORMAL_DISPATCH_RATIO, RELAY_CHAIN_SLOT_DURATION_MILLIS, + SLOT_DURATION, UNINCLUDED_SEGMENT_CAPACITY, VERSION, +}; +use xcm_config::{RelayLocation, XcmOriginToTransactDispatchOrigin}; + +parameter_types! { + pub const Version: RuntimeVersion = VERSION; + + // This part is copied from Substrate's `bin/node/runtime/src/lib.rs`. + // The `RuntimeBlockLength` and `RuntimeBlockWeights` exist here because the + // `DeletionWeightLimit` and `DeletionQueueDepth` depend on those to parameterize + // the lazy contract deletion. + pub RuntimeBlockLength: BlockLength = + BlockLength::max_with_normal_ratio(5 * 1024 * 1024, NORMAL_DISPATCH_RATIO); + pub RuntimeBlockWeights: BlockWeights = BlockWeights::builder() + .base_block(BlockExecutionWeight::get()) + .for_class(DispatchClass::all(), |weights| { + weights.base_extrinsic = ExtrinsicBaseWeight::get(); + }) + .for_class(DispatchClass::Normal, |weights| { + weights.max_total = Some(NORMAL_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT); + }) + .for_class(DispatchClass::Operational, |weights| { + weights.max_total = Some(MAXIMUM_BLOCK_WEIGHT); + // Operational transactions have some extra reserved space, so that they + // are included even if block reached `MAXIMUM_BLOCK_WEIGHT`. + weights.reserved = Some( + MAXIMUM_BLOCK_WEIGHT - NORMAL_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT + ); + }) + .avg_block_initialization(AVERAGE_ON_INITIALIZE_RATIO) + .build_or_panic(); + pub const SS58Prefix: u16 = 42; +} + +/// The default types are being injected by [`derive_impl`](`frame_support::derive_impl`) from +/// [`ParaChainDefaultConfig`](`struct@frame_system::config_preludes::ParaChainDefaultConfig`), +/// but overridden as needed. +#[derive_impl(frame_system::config_preludes::ParaChainDefaultConfig)] +impl frame_system::Config for Runtime { + /// The identifier used to distinguish between accounts. + type AccountId = AccountId; + /// The index type for storing how many extrinsics an account has signed. + type Nonce = Nonce; + /// The type for hashing blocks and tries. + type Hash = Hash; + /// The block type. + type Block = Block; + /// Maximum number of block number to block hash mappings to keep (oldest pruned first). + type BlockHashCount = BlockHashCount; + /// Runtime version. + type Version = Version; + /// The data to be stored in an account. + type AccountData = pallet_balances::AccountData; + /// The weight of database operations that the runtime can invoke. + type DbWeight = RocksDbWeight; + /// Block & extrinsics weights: base values and limits. + type BlockWeights = RuntimeBlockWeights; + /// The maximum length of a block (in bytes). + type BlockLength = RuntimeBlockLength; + /// This is used as an identifier of the chain. 42 is the generic substrate prefix. + type SS58Prefix = SS58Prefix; + /// The action to take on a Runtime Upgrade + type OnSetCode = cumulus_pallet_parachain_system::ParachainSetCode; + type MaxConsumers = frame_support::traits::ConstU32<16>; +} + +impl pallet_timestamp::Config for Runtime { + /// A timestamp: milliseconds since the unix epoch. + type Moment = u64; + type OnTimestampSet = Aura; + type MinimumPeriod = ConstU64<{ SLOT_DURATION / 2 }>; + type WeightInfo = (); +} + +impl pallet_authorship::Config for Runtime { + type FindAuthor = pallet_session::FindAccountFromAuthorIndex; + type EventHandler = (CollatorSelection,); +} + +parameter_types! { + pub const ExistentialDeposit: Balance = EXISTENTIAL_DEPOSIT; +} + +impl pallet_balances::Config for Runtime { + type MaxLocks = ConstU32<50>; + /// The type for recording an account's balance. + type Balance = Balance; + /// The ubiquitous event type. + type RuntimeEvent = RuntimeEvent; + type DustRemoval = (); + type ExistentialDeposit = ExistentialDeposit; + type AccountStore = System; + type WeightInfo = pallet_balances::weights::SubstrateWeight; + type MaxReserves = ConstU32<50>; + type ReserveIdentifier = [u8; 8]; + type RuntimeHoldReason = RuntimeHoldReason; + type RuntimeFreezeReason = RuntimeFreezeReason; + type FreezeIdentifier = (); + type MaxFreezes = ConstU32<0>; +} + +parameter_types! { + /// Relay Chain `TransactionByteFee` / 10 + pub const TransactionByteFee: Balance = 10 * MICROUNIT; +} + +impl pallet_transaction_payment::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type OnChargeTransaction = pallet_transaction_payment::FungibleAdapter; + type WeightToFee = WeightToFee; + type LengthToFee = ConstantMultiplier; + type FeeMultiplierUpdate = SlowAdjustingFeeUpdate; + type OperationalFeeMultiplier = ConstU8<5>; +} + +impl pallet_sudo::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type RuntimeCall = RuntimeCall; + type WeightInfo = (); +} + +parameter_types! { + pub const ReservedXcmpWeight: Weight = MAXIMUM_BLOCK_WEIGHT.saturating_div(4); + pub const ReservedDmpWeight: Weight = MAXIMUM_BLOCK_WEIGHT.saturating_div(4); + pub const RelayOrigin: AggregateMessageOrigin = AggregateMessageOrigin::Parent; +} + +impl cumulus_pallet_parachain_system::Config for Runtime { + type WeightInfo = (); + type RuntimeEvent = RuntimeEvent; + type OnSystemEvent = (); + type SelfParaId = parachain_info::Pallet; + type OutboundXcmpMessageSource = XcmpQueue; + type DmpQueue = frame_support::traits::EnqueueWithOrigin; + type ReservedDmpWeight = ReservedDmpWeight; + type XcmpMessageHandler = XcmpQueue; + type ReservedXcmpWeight = ReservedXcmpWeight; + type CheckAssociatedRelayNumber = RelayNumberStrictlyIncreases; + type ConsensusHook = cumulus_pallet_aura_ext::FixedVelocityConsensusHook< + Runtime, + RELAY_CHAIN_SLOT_DURATION_MILLIS, + BLOCK_PROCESSING_VELOCITY, + UNINCLUDED_SEGMENT_CAPACITY, + >; +} + +impl parachain_info::Config for Runtime {} + +parameter_types! { + pub MessageQueueServiceWeight: Weight = Perbill::from_percent(35) * RuntimeBlockWeights::get().max_block; +} + +impl pallet_message_queue::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type WeightInfo = (); + #[cfg(feature = "runtime-benchmarks")] + type MessageProcessor = pallet_message_queue::mock_helpers::NoopMessageProcessor< + cumulus_primitives_core::AggregateMessageOrigin, + >; + #[cfg(not(feature = "runtime-benchmarks"))] + type MessageProcessor = xcm_builder::ProcessXcmMessage< + AggregateMessageOrigin, + xcm_executor::XcmExecutor, + RuntimeCall, + >; + type Size = u32; + // The XCMP queue pallet is only ever able to handle the `Sibling(ParaId)` origin: + type QueueChangeHandler = NarrowOriginToSibling; + type QueuePausedQuery = NarrowOriginToSibling; + type HeapSize = sp_core::ConstU32<{ 64 * 1024 }>; + type MaxStale = sp_core::ConstU32<8>; + type ServiceWeight = MessageQueueServiceWeight; + type IdleMaxServiceWeight = (); +} + +impl cumulus_pallet_aura_ext::Config for Runtime {} + +impl cumulus_pallet_xcmp_queue::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type ChannelInfo = ParachainSystem; + type VersionWrapper = (); + // Enqueue XCMP messages from siblings for later processing. + type XcmpQueue = TransformOrigin; + type MaxInboundSuspended = sp_core::ConstU32<1_000>; + type ControllerOrigin = EnsureRoot; + type ControllerOriginConverter = XcmOriginToTransactDispatchOrigin; + type WeightInfo = (); + type PriceForSiblingDelivery = NoPriceForMessageDelivery; +} + +parameter_types! { + pub const Period: u32 = 6 * HOURS; + pub const Offset: u32 = 0; +} + +impl pallet_session::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type ValidatorId = ::AccountId; + // we don't have stash and controller, thus we don't need the convert as well. + type ValidatorIdOf = pallet_collator_selection::IdentityCollator; + type ShouldEndSession = pallet_session::PeriodicSessions; + type NextSessionRotation = pallet_session::PeriodicSessions; + type SessionManager = CollatorSelection; + // Essentially just Aura, but let's be pedantic. + type SessionHandler = ::KeyTypeIdProviders; + type Keys = SessionKeys; + type WeightInfo = (); +} + +impl pallet_aura::Config for Runtime { + type AuthorityId = AuraId; + type DisabledValidators = (); + type MaxAuthorities = ConstU32<100_000>; + type AllowMultipleBlocksPerSlot = ConstBool; + type SlotDuration = pallet_aura::MinimumPeriodTimesTwo; +} + +parameter_types! { + pub const PotId: PalletId = PalletId(*b"PotStake"); + pub const SessionLength: BlockNumber = 6 * HOURS; + // StakingAdmin pluralistic body. + pub const StakingAdminBodyId: BodyId = BodyId::Defense; +} + +/// We allow root and the StakingAdmin to execute privileged collator selection operations. +pub type CollatorSelectionUpdateOrigin = EitherOfDiverse< + EnsureRoot, + EnsureXcm>, +>; + +impl pallet_collator_selection::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type Currency = Balances; + type UpdateOrigin = CollatorSelectionUpdateOrigin; + type PotId = PotId; + type MaxCandidates = ConstU32<100>; + type MinEligibleCollators = ConstU32<4>; + type MaxInvulnerables = ConstU32<20>; + // should be a multiple of session or things will get inconsistent + type KickThreshold = Period; + type ValidatorId = ::AccountId; + type ValidatorIdOf = pallet_collator_selection::IdentityCollator; + type ValidatorRegistration = Session; + type WeightInfo = (); +} + +/// Configure the pallet template in pallets/template. +impl pallet_parachain_template::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type WeightInfo = pallet_parachain_template::weights::SubstrateWeight; +} diff --git a/cumulus/parachain-template/runtime/src/xcm_config.rs b/templates/parachain/runtime/src/configs/xcm_config.rs similarity index 93% rename from cumulus/parachain-template/runtime/src/xcm_config.rs rename to templates/parachain/runtime/src/configs/xcm_config.rs index 9dd08dc7f3ea570f796a43915d290b78fa070d3c..13da2363b053467ab02c689dfc14ee67118f543e 100644 --- a/cumulus/parachain-template/runtime/src/xcm_config.rs +++ b/templates/parachain/runtime/src/configs/xcm_config.rs @@ -1,4 +1,4 @@ -use super::{ +use crate::{ AccountId, AllPalletsWithSystem, Balances, ParachainInfo, ParachainSystem, PolkadotXcm, Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, WeightToFee, XcmpQueue, }; @@ -12,15 +12,13 @@ use pallet_xcm::XcmPassthrough; use polkadot_parachain_primitives::primitives::Sibling; use polkadot_runtime_common::impls::ToAuthor; use xcm::latest::prelude::*; -#[allow(deprecated)] -use xcm_builder::CurrencyAdapter; use xcm_builder::{ AccountId32Aliases, AllowExplicitUnpaidExecutionFrom, AllowTopLevelPaidExecutionFrom, DenyReserveTransferToRelayChain, DenyThenTry, EnsureXcmOrigin, FixedWeightBounds, - FrameTransactionalProcessor, IsConcrete, NativeAsset, ParentIsPreset, RelayChainAsNative, - SiblingParachainAsNative, SiblingParachainConvertsVia, SignedAccountId32AsNative, - SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit, TrailingSetTopicAsId, - UsingComponents, WithComputedOrigin, WithUniqueTopic, + FrameTransactionalProcessor, FungibleAdapter, IsConcrete, NativeAsset, ParentIsPreset, + RelayChainAsNative, SiblingParachainAsNative, SiblingParachainConvertsVia, + SignedAccountId32AsNative, SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit, + TrailingSetTopicAsId, UsingComponents, WithComputedOrigin, WithUniqueTopic, }; use xcm_executor::XcmExecutor; @@ -44,8 +42,7 @@ pub type LocationToAccountId = ( ); /// Means for transacting assets on this chain. -#[allow(deprecated)] -pub type LocalAssetTransactor = CurrencyAdapter< +pub type LocalAssetTransactor = FungibleAdapter< // Use this currency: Balances, // Use this currency when it is a fungible asset matching the given location or name: @@ -140,6 +137,9 @@ impl xcm_executor::Config for XcmConfig { type SafeCallFilter = Everything; type Aliasers = Nothing; type TransactionalProcessor = FrameTransactionalProcessor; + type HrmpNewChannelOpenRequestHandler = (); + type HrmpChannelAcceptedHandler = (); + type HrmpChannelClosingHandler = (); } /// No local origins on this chain are allowed to dispatch XCM sends/executions. diff --git a/templates/parachain/runtime/src/lib.rs b/templates/parachain/runtime/src/lib.rs new file mode 100644 index 0000000000000000000000000000000000000000..5bfd6f290c1b9839f4e19c0c21984f258512dd37 --- /dev/null +++ b/templates/parachain/runtime/src/lib.rs @@ -0,0 +1,264 @@ +#![cfg_attr(not(feature = "std"), no_std)] +// `construct_runtime!` does a lot of recursion and requires us to increase the limit to 256. +#![recursion_limit = "256"] + +// Make the WASM binary available. +#[cfg(feature = "std")] +include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs")); + +pub mod apis; +mod configs; +mod weights; + +use smallvec::smallvec; +use sp_runtime::{ + create_runtime_str, generic, impl_opaque_keys, + traits::{BlakeTwo256, IdentifyAccount, Verify}, + MultiSignature, +}; + +use sp_std::prelude::*; +#[cfg(feature = "std")] +use sp_version::NativeVersion; +use sp_version::RuntimeVersion; + +use frame_support::{ + construct_runtime, + weights::{ + constants::WEIGHT_REF_TIME_PER_SECOND, Weight, WeightToFeeCoefficient, + WeightToFeeCoefficients, WeightToFeePolynomial, + }, +}; +pub use sp_consensus_aura::sr25519::AuthorityId as AuraId; +pub use sp_runtime::{MultiAddress, Perbill, Permill}; + +#[cfg(any(feature = "std", test))] +pub use sp_runtime::BuildStorage; + +use weights::ExtrinsicBaseWeight; + +/// Import the template pallet. +pub use pallet_parachain_template; + +/// Alias to 512-bit hash when used in the context of a transaction signature on the chain. +pub type Signature = MultiSignature; + +/// Some way of identifying an account on the chain. We intentionally make it equivalent +/// to the public key of our transaction signing scheme. +pub type AccountId = <::Signer as IdentifyAccount>::AccountId; + +/// Balance of an account. +pub type Balance = u128; + +/// Index of a transaction in the chain. +pub type Nonce = u32; + +/// A hash of some data used by the chain. +pub type Hash = sp_core::H256; + +/// An index to a block. +pub type BlockNumber = u32; + +/// The address format for describing accounts. +pub type Address = MultiAddress; + +/// Block header type as expected by this runtime. +pub type Header = generic::Header; + +/// Block type as expected by this runtime. +pub type Block = generic::Block; + +/// A Block signed with a Justification +pub type SignedBlock = generic::SignedBlock; + +/// BlockId type as expected by this runtime. +pub type BlockId = generic::BlockId; + +/// The SignedExtension to the basic transaction logic. +pub type SignedExtra = ( + frame_system::CheckNonZeroSender, + frame_system::CheckSpecVersion, + frame_system::CheckTxVersion, + frame_system::CheckGenesis, + frame_system::CheckEra, + frame_system::CheckNonce, + frame_system::CheckWeight, + pallet_transaction_payment::ChargeTransactionPayment, + cumulus_primitives_storage_weight_reclaim::StorageWeightReclaim, +); + +/// Unchecked extrinsic type as expected by this runtime. +pub type UncheckedExtrinsic = + generic::UncheckedExtrinsic; + +/// Executive: handles dispatch to the various modules. +pub type Executive = frame_executive::Executive< + Runtime, + Block, + frame_system::ChainContext, + Runtime, + AllPalletsWithSystem, +>; + +/// Handles converting a weight scalar to a fee value, based on the scale and granularity of the +/// node's balance type. +/// +/// This should typically create a mapping between the following ranges: +/// - `[0, MAXIMUM_BLOCK_WEIGHT]` +/// - `[Balance::min, Balance::max]` +/// +/// Yet, it can be used for any other sort of change to weight-fee. Some examples being: +/// - Setting it to `0` will essentially disable the weight fee. +/// - Setting it to `1` will cause the literal `#[weight = x]` values to be charged. +pub struct WeightToFee; +impl WeightToFeePolynomial for WeightToFee { + type Balance = Balance; + fn polynomial() -> WeightToFeeCoefficients { + // in Rococo, extrinsic base weight (smallest non-zero weight) is mapped to 1 MILLIUNIT: + // in our template, we map to 1/10 of that, or 1/10 MILLIUNIT + let p = MILLIUNIT / 10; + let q = 100 * Balance::from(ExtrinsicBaseWeight::get().ref_time()); + smallvec![WeightToFeeCoefficient { + degree: 1, + negative: false, + coeff_frac: Perbill::from_rational(p % q, q), + coeff_integer: p / q, + }] + } +} + +/// Opaque types. These are used by the CLI to instantiate machinery that don't need to know +/// the specifics of the runtime. They can then be made to be agnostic over specific formats +/// of data like extrinsics, allowing for them to continue syncing the network through upgrades +/// to even the core data structures. +pub mod opaque { + use super::*; + use sp_runtime::{ + generic, + traits::{BlakeTwo256, Hash as HashT}, + }; + + pub use sp_runtime::OpaqueExtrinsic as UncheckedExtrinsic; + /// Opaque block header type. + pub type Header = generic::Header; + /// Opaque block type. + pub type Block = generic::Block; + /// Opaque block identifier type. + pub type BlockId = generic::BlockId; + /// Opaque block hash type. + pub type Hash = ::Output; +} + +impl_opaque_keys! { + pub struct SessionKeys { + pub aura: Aura, + } +} + +#[sp_version::runtime_version] +pub const VERSION: RuntimeVersion = RuntimeVersion { + spec_name: create_runtime_str!("parachain-template-runtime"), + impl_name: create_runtime_str!("parachain-template-runtime"), + authoring_version: 1, + spec_version: 1, + impl_version: 0, + apis: apis::RUNTIME_API_VERSIONS, + transaction_version: 1, + state_version: 1, +}; + +/// This determines the average expected block time that we are targeting. +/// Blocks will be produced at a minimum duration defined by `SLOT_DURATION`. +/// `SLOT_DURATION` is picked up by `pallet_timestamp` which is in turn picked +/// up by `pallet_aura` to implement `fn slot_duration()`. +/// +/// Change this to adjust the block time. +pub const MILLISECS_PER_BLOCK: u64 = 12000; + +// NOTE: Currently it is not possible to change the slot duration after the chain has started. +// Attempting to do so will brick block production. +pub const SLOT_DURATION: u64 = MILLISECS_PER_BLOCK; + +// Time is measured by number of blocks. +pub const MINUTES: BlockNumber = 60_000 / (MILLISECS_PER_BLOCK as BlockNumber); +pub const HOURS: BlockNumber = MINUTES * 60; +pub const DAYS: BlockNumber = HOURS * 24; + +// Unit = the base number of indivisible units for balances +pub const UNIT: Balance = 1_000_000_000_000; +pub const MILLIUNIT: Balance = 1_000_000_000; +pub const MICROUNIT: Balance = 1_000_000; + +/// The existential deposit. Set to 1/10 of the Connected Relay Chain. +pub const EXISTENTIAL_DEPOSIT: Balance = MILLIUNIT; + +/// We assume that ~5% of the block weight is consumed by `on_initialize` handlers. This is +/// used to limit the maximal weight of a single extrinsic. +const AVERAGE_ON_INITIALIZE_RATIO: Perbill = Perbill::from_percent(5); + +/// We allow `Normal` extrinsics to fill up the block up to 75%, the rest can be used by +/// `Operational` extrinsics. +const NORMAL_DISPATCH_RATIO: Perbill = Perbill::from_percent(75); + +/// We allow for 0.5 of a second of compute with a 12 second average block time. +const MAXIMUM_BLOCK_WEIGHT: Weight = Weight::from_parts( + WEIGHT_REF_TIME_PER_SECOND.saturating_div(2), + cumulus_primitives_core::relay_chain::MAX_POV_SIZE as u64, +); + +/// Maximum number of blocks simultaneously accepted by the Runtime, not yet included +/// into the relay chain. +const UNINCLUDED_SEGMENT_CAPACITY: u32 = 1; +/// How many parachain blocks are processed by the relay chain per parent. Limits the +/// number of blocks authored per slot. +const BLOCK_PROCESSING_VELOCITY: u32 = 1; +/// Relay chain slot duration, in milliseconds. +const RELAY_CHAIN_SLOT_DURATION_MILLIS: u32 = 6000; + +/// The version information used to identify this runtime when compiled natively. +#[cfg(feature = "std")] +pub fn native_version() -> NativeVersion { + NativeVersion { runtime_version: VERSION, can_author_with: Default::default() } +} + +// Create the runtime by composing the FRAME pallets that were previously configured. +construct_runtime!( + pub enum Runtime { + // System support stuff. + System: frame_system = 0, + ParachainSystem: cumulus_pallet_parachain_system = 1, + Timestamp: pallet_timestamp = 2, + ParachainInfo: parachain_info = 3, + + // Monetary stuff. + Balances: pallet_balances = 10, + TransactionPayment: pallet_transaction_payment = 11, + + // Governance + Sudo: pallet_sudo = 15, + + // Collator support. The order of these 4 are important and shall not change. + Authorship: pallet_authorship = 20, + CollatorSelection: pallet_collator_selection = 21, + Session: pallet_session = 22, + Aura: pallet_aura = 23, + AuraExt: cumulus_pallet_aura_ext = 24, + + // XCM helpers. + XcmpQueue: cumulus_pallet_xcmp_queue = 30, + PolkadotXcm: pallet_xcm = 31, + CumulusXcm: cumulus_pallet_xcm = 32, + MessageQueue: pallet_message_queue = 33, + + // Template + TemplatePallet: pallet_parachain_template = 50, + } +); + +cumulus_pallet_parachain_system::register_validate_block! { + Runtime = Runtime, + BlockExecutor = cumulus_pallet_aura_ext::BlockExecutor::, +} + +#[cfg(feature = "runtime-benchmarks")] +mod benchmarks; diff --git a/cumulus/parachain-template/runtime/src/weights/block_weights.rs b/templates/parachain/runtime/src/weights/block_weights.rs similarity index 100% rename from cumulus/parachain-template/runtime/src/weights/block_weights.rs rename to templates/parachain/runtime/src/weights/block_weights.rs diff --git a/cumulus/parachain-template/runtime/src/weights/extrinsic_weights.rs b/templates/parachain/runtime/src/weights/extrinsic_weights.rs similarity index 100% rename from cumulus/parachain-template/runtime/src/weights/extrinsic_weights.rs rename to templates/parachain/runtime/src/weights/extrinsic_weights.rs diff --git a/cumulus/parachain-template/runtime/src/weights/mod.rs b/templates/parachain/runtime/src/weights/mod.rs similarity index 100% rename from cumulus/parachain-template/runtime/src/weights/mod.rs rename to templates/parachain/runtime/src/weights/mod.rs diff --git a/cumulus/parachain-template/runtime/src/weights/paritydb_weights.rs b/templates/parachain/runtime/src/weights/paritydb_weights.rs similarity index 100% rename from cumulus/parachain-template/runtime/src/weights/paritydb_weights.rs rename to templates/parachain/runtime/src/weights/paritydb_weights.rs diff --git a/cumulus/parachain-template/runtime/src/weights/rocksdb_weights.rs b/templates/parachain/runtime/src/weights/rocksdb_weights.rs similarity index 100% rename from cumulus/parachain-template/runtime/src/weights/rocksdb_weights.rs rename to templates/parachain/runtime/src/weights/rocksdb_weights.rs diff --git a/substrate/bin/node-template/LICENSE b/templates/solochain/LICENSE similarity index 100% rename from substrate/bin/node-template/LICENSE rename to templates/solochain/LICENSE diff --git a/substrate/bin/node-template/README.md b/templates/solochain/README.md similarity index 100% rename from substrate/bin/node-template/README.md rename to templates/solochain/README.md diff --git a/substrate/bin/node-template/docs/rust-setup.md b/templates/solochain/docs/rust-setup.md similarity index 100% rename from substrate/bin/node-template/docs/rust-setup.md rename to templates/solochain/docs/rust-setup.md diff --git a/templates/solochain/env-setup/README.md b/templates/solochain/env-setup/README.md new file mode 100644 index 0000000000000000000000000000000000000000..a7955872d3ff2172bc1c818e597a5b165005bb62 --- /dev/null +++ b/templates/solochain/env-setup/README.md @@ -0,0 +1,9 @@ +# Env setup + +Special files for setting up an environment to work with the template: + +- `rust-toolchain.toml` when working with `rustup`. +- `flake.nix` when working with `nix`. + +These files will be copied by the installer script to the main directory. They are +put into this special directory to not interfere with the normal CI. diff --git a/substrate/bin/node-template/flake.lock b/templates/solochain/env-setup/flake.lock similarity index 100% rename from substrate/bin/node-template/flake.lock rename to templates/solochain/env-setup/flake.lock diff --git a/substrate/bin/node-template/flake.nix b/templates/solochain/env-setup/flake.nix similarity index 100% rename from substrate/bin/node-template/flake.nix rename to templates/solochain/env-setup/flake.nix diff --git a/substrate/bin/node-template/rust-toolchain.toml b/templates/solochain/env-setup/rust-toolchain.toml similarity index 90% rename from substrate/bin/node-template/rust-toolchain.toml rename to templates/solochain/env-setup/rust-toolchain.toml index 2a35c6ed07c1c2a667729d1fa558e3da0cd0457f..f81199a2249993fce8c98bc4a721d77c6c91d3d7 100644 --- a/substrate/bin/node-template/rust-toolchain.toml +++ b/templates/solochain/env-setup/rust-toolchain.toml @@ -1,5 +1,5 @@ [toolchain] -channel = "nightly" +channel = "stable" components = [ "cargo", "clippy", diff --git a/templates/solochain/node/Cargo.toml b/templates/solochain/node/Cargo.toml new file mode 100644 index 0000000000000000000000000000000000000000..9332da3a6549c90fe3eebfcda3fbb51dc49c57d6 --- /dev/null +++ b/templates/solochain/node/Cargo.toml @@ -0,0 +1,87 @@ +[package] +name = "solochain-template-node" +description = "A solochain node template built with Substrate, part of Polkadot Sdk." +version = "0.0.0" +license = "MIT-0" +authors.workspace = true +homepage.workspace = true +repository.workspace = true +edition.workspace = true +publish = false + +build = "build.rs" + +[lints] +workspace = true + +[package.metadata.docs.rs] +targets = ["x86_64-unknown-linux-gnu"] + +[dependencies] +clap = { version = "4.5.3", features = ["derive"] } +futures = { version = "0.3.30", features = ["thread-pool"] } +serde_json = { workspace = true, default-features = true } +jsonrpsee = { version = "0.22", features = ["server"] } + +# substrate client +sc-cli = { path = "../../../substrate/client/cli" } +sp-core = { path = "../../../substrate/primitives/core" } +sc-executor = { path = "../../../substrate/client/executor" } +sc-network = { path = "../../../substrate/client/network" } +sc-service = { path = "../../../substrate/client/service" } +sc-telemetry = { path = "../../../substrate/client/telemetry" } +sc-transaction-pool = { path = "../../../substrate/client/transaction-pool" } +sc-transaction-pool-api = { path = "../../../substrate/client/transaction-pool/api" } +sc-offchain = { path = "../../../substrate/client/offchain" } +sc-consensus-aura = { path = "../../../substrate/client/consensus/aura" } +sp-consensus-aura = { path = "../../../substrate/primitives/consensus/aura" } +sc-consensus = { path = "../../../substrate/client/consensus/common" } +sc-consensus-grandpa = { path = "../../../substrate/client/consensus/grandpa" } +sp-consensus-grandpa = { path = "../../../substrate/primitives/consensus/grandpa" } +sc-client-api = { path = "../../../substrate/client/api" } +sc-rpc-api = { path = "../../../substrate/client/rpc-api" } +sc-basic-authorship = { path = "../../../substrate/client/basic-authorship" } + +# substrate primitives +sp-runtime = { path = "../../../substrate/primitives/runtime" } +sp-io = { path = "../../../substrate/primitives/io" } +sp-timestamp = { path = "../../../substrate/primitives/timestamp" } +sp-inherents = { path = "../../../substrate/primitives/inherents" } +sp-keyring = { path = "../../../substrate/primitives/keyring" } +sp-api = { path = "../../../substrate/primitives/api" } +sp-blockchain = { path = "../../../substrate/primitives/blockchain" } +sp-block-builder = { path = "../../../substrate/primitives/block-builder" } + +# frame and pallets +frame-system = { path = "../../../substrate/frame/system" } +pallet-transaction-payment = { path = "../../../substrate/frame/transaction-payment", default-features = false } +pallet-transaction-payment-rpc = { path = "../../../substrate/frame/transaction-payment/rpc" } +substrate-frame-rpc-system = { path = "../../../substrate/utils/frame/rpc/system" } + +# These dependencies are used for runtime benchmarking +frame-benchmarking-cli = { path = "../../../substrate/utils/frame/benchmarking-cli" } + +# Local Dependencies +solochain-template-runtime = { path = "../runtime" } + +[build-dependencies] +substrate-build-script-utils = { path = "../../../substrate/utils/build-script-utils" } + +[features] +default = [] +# Dependencies that are only required if runtime benchmarking should be build. +runtime-benchmarks = [ + "frame-benchmarking-cli/runtime-benchmarks", + "frame-system/runtime-benchmarks", + "sc-service/runtime-benchmarks", + "solochain-template-runtime/runtime-benchmarks", + "sp-runtime/runtime-benchmarks", +] +# Enable features that allow the runtime to be tried and debugged. Name might be subject to change +# in the near future. +try-runtime = [ + "frame-system/try-runtime", + "pallet-transaction-payment/try-runtime", + "solochain-template-runtime/try-runtime", + "sp-runtime/try-runtime", +] diff --git a/substrate/bin/node-template/node/build.rs b/templates/solochain/node/build.rs similarity index 100% rename from substrate/bin/node-template/node/build.rs rename to templates/solochain/node/build.rs diff --git a/substrate/bin/node-template/node/src/benchmarking.rs b/templates/solochain/node/src/benchmarking.rs similarity index 99% rename from substrate/bin/node-template/node/src/benchmarking.rs rename to templates/solochain/node/src/benchmarking.rs index 6e29ad1a123118d953c1fad654bad9343fd8ca53..d1d8c2ccabaf64c730e14eb32e076052ae4a9e2b 100644 --- a/substrate/bin/node-template/node/src/benchmarking.rs +++ b/templates/solochain/node/src/benchmarking.rs @@ -4,10 +4,10 @@ use crate::service::FullClient; -use node_template_runtime as runtime; use runtime::{AccountId, Balance, BalancesCall, SystemCall}; use sc_cli::Result; use sc_client_api::BlockBackend; +use solochain_template_runtime as runtime; use sp_core::{Encode, Pair}; use sp_inherents::{InherentData, InherentDataProvider}; use sp_keyring::Sr25519Keyring; diff --git a/substrate/bin/node-template/node/src/chain_spec.rs b/templates/solochain/node/src/chain_spec.rs similarity index 97% rename from substrate/bin/node-template/node/src/chain_spec.rs rename to templates/solochain/node/src/chain_spec.rs index 6e0d78f647a594d7e3c247041a7499691edaad1e..be49f2c1fc731ee4e5ece7841151068abf0f0790 100644 --- a/substrate/bin/node-template/node/src/chain_spec.rs +++ b/templates/solochain/node/src/chain_spec.rs @@ -1,5 +1,5 @@ -use node_template_runtime::{AccountId, RuntimeGenesisConfig, Signature, WASM_BINARY}; use sc_service::ChainType; +use solochain_template_runtime::{AccountId, RuntimeGenesisConfig, Signature, WASM_BINARY}; use sp_consensus_aura::sr25519::AuthorityId as AuraId; use sp_consensus_grandpa::AuthorityId as GrandpaId; use sp_core::{sr25519, Pair, Public}; diff --git a/substrate/bin/node-template/node/src/cli.rs b/templates/solochain/node/src/cli.rs similarity index 81% rename from substrate/bin/node-template/node/src/cli.rs rename to templates/solochain/node/src/cli.rs index 98037eb886a8ec04ee78bc8f0b21b2269872d0fc..b2c53aa70949de71960bc5b102bbafba560ae86a 100644 --- a/substrate/bin/node-template/node/src/cli.rs +++ b/templates/solochain/node/src/cli.rs @@ -41,11 +41,6 @@ pub enum Subcommand { #[command(subcommand)] Benchmark(frame_benchmarking_cli::BenchmarkCmd), - /// Try-runtime has migrated to a standalone CLI - /// (). The subcommand exists as a stub and - /// deprecation notice. It will be removed entirely some time after Janurary 2024. - TryRuntime, - /// Db meta columns information. ChainInfo(sc_cli::ChainInfoCmd), } diff --git a/substrate/bin/node-template/node/src/command.rs b/templates/solochain/node/src/command.rs similarity index 88% rename from substrate/bin/node-template/node/src/command.rs rename to templates/solochain/node/src/command.rs index a25157693cd4392072703c28b14310f16dc01030..e46fedc91f0e26fb9e4e36dbbc45a3cc0c0c7310 100644 --- a/substrate/bin/node-template/node/src/command.rs +++ b/templates/solochain/node/src/command.rs @@ -5,9 +5,9 @@ use crate::{ service, }; use frame_benchmarking_cli::{BenchmarkCmd, ExtrinsicFactory, SUBSTRATE_REFERENCE_HARDWARE}; -use node_template_runtime::{Block, EXISTENTIAL_DEPOSIT}; use sc_cli::SubstrateCli; use sc_service::PartialComponents; +use solochain_template_runtime::{Block, EXISTENTIAL_DEPOSIT}; use sp_keyring::Sr25519Keyring; impl SubstrateCli for Cli { @@ -117,7 +117,9 @@ pub fn run() -> sc_cli::Result<()> { ) } - cmd.run::(config) + cmd.run_with_spec::, ()>(Some( + config.chain_spec, + )) }, BenchmarkCmd::Block(cmd) => { let PartialComponents { client, .. } = service::new_partial(&config)?; @@ -168,12 +170,6 @@ pub fn run() -> sc_cli::Result<()> { } }) }, - #[cfg(feature = "try-runtime")] - Some(Subcommand::TryRuntime) => Err(try_runtime_cli::DEPRECATION_NOTICE.into()), - #[cfg(not(feature = "try-runtime"))] - Some(Subcommand::TryRuntime) => Err("TryRuntime wasn't enabled when building the node. \ - You can enable it with `--features try-runtime`." - .into()), Some(Subcommand::ChainInfo(cmd)) => { let runner = cli.create_runner(cmd)?; runner.sync_run(|config| cmd.run::(&config)) @@ -181,7 +177,18 @@ pub fn run() -> sc_cli::Result<()> { None => { let runner = cli.create_runner(&cli.run)?; runner.run_node_until_exit(|config| async move { - service::new_full(config).map_err(sc_cli::Error::Service) + match config.network.network_backend { + sc_network::config::NetworkBackendType::Libp2p => service::new_full::< + sc_network::NetworkWorker< + solochain_template_runtime::opaque::Block, + ::Hash, + >, + >(config) + .map_err(sc_cli::Error::Service), + sc_network::config::NetworkBackendType::Litep2p => + service::new_full::(config) + .map_err(sc_cli::Error::Service), + } }) }, } diff --git a/substrate/bin/node-template/node/src/main.rs b/templates/solochain/node/src/main.rs similarity index 100% rename from substrate/bin/node-template/node/src/main.rs rename to templates/solochain/node/src/main.rs diff --git a/substrate/bin/node-template/node/src/rpc.rs b/templates/solochain/node/src/rpc.rs similarity index 96% rename from substrate/bin/node-template/node/src/rpc.rs rename to templates/solochain/node/src/rpc.rs index 246391adcbbe88a03b6cf9cf9043d82b8de18b60..fe2b6ca72ede5c8d9f8d878db88efa2da5c5ac97 100644 --- a/substrate/bin/node-template/node/src/rpc.rs +++ b/templates/solochain/node/src/rpc.rs @@ -8,8 +8,8 @@ use std::sync::Arc; use jsonrpsee::RpcModule; -use node_template_runtime::{opaque::Block, AccountId, Balance, Nonce}; use sc_transaction_pool_api::TransactionPool; +use solochain_template_runtime::{opaque::Block, AccountId, Balance, Nonce}; use sp_api::ProvideRuntimeApi; use sp_block_builder::BlockBuilder; use sp_blockchain::{Error as BlockChainError, HeaderBackend, HeaderMetadata}; diff --git a/substrate/bin/node-template/node/src/service.rs b/templates/solochain/node/src/service.rs similarity index 88% rename from substrate/bin/node-template/node/src/service.rs rename to templates/solochain/node/src/service.rs index 25cd651178411c6338a2b0d1e7836804a3a5b676..06d4b8ab7a59b936612eacec1a278e61161ecf3b 100644 --- a/substrate/bin/node-template/node/src/service.rs +++ b/templates/solochain/node/src/service.rs @@ -1,13 +1,13 @@ //! Service and ServiceFactory implementation. Specialized wrapper over substrate service. use futures::FutureExt; -use node_template_runtime::{self, opaque::Block, RuntimeApi}; use sc_client_api::{Backend, BlockBackend}; use sc_consensus_aura::{ImportQueueParams, SlotProportion, StartAuraParams}; use sc_consensus_grandpa::SharedVoterState; use sc_service::{error::Error as ServiceError, Configuration, TaskManager, WarpSyncParams}; use sc_telemetry::{Telemetry, TelemetryWorker}; use sc_transaction_pool_api::OffchainTransactionPoolFactory; +use solochain_template_runtime::{self, opaque::Block, RuntimeApi}; use sp_consensus_aura::sr25519::AuthorityPair as AuraPair; use std::{sync::Arc, time::Duration}; @@ -80,23 +80,29 @@ pub fn new_partial(config: &Configuration) -> Result { telemetry.as_ref().map(|x| x.handle()), )?; - let slot_duration = sc_consensus_aura::slot_duration(&*client)?; - + let cidp_client = client.clone(); let import_queue = sc_consensus_aura::import_queue::(ImportQueueParams { block_import: grandpa_block_import.clone(), justification_import: Some(Box::new(grandpa_block_import.clone())), client: client.clone(), - create_inherent_data_providers: move |_, ()| async move { - let timestamp = sp_timestamp::InherentDataProvider::from_system_time(); + create_inherent_data_providers: move |parent_hash, _| { + let cidp_client = cidp_client.clone(); + async move { + let slot_duration = sc_consensus_aura::standalone::slot_duration_at( + &*cidp_client, + parent_hash, + )?; + let timestamp = sp_timestamp::InherentDataProvider::from_system_time(); - let slot = - sp_consensus_aura::inherents::InherentDataProvider::from_timestamp_and_slot_duration( - *timestamp, - slot_duration, - ); + let slot = + sp_consensus_aura::inherents::InherentDataProvider::from_timestamp_and_slot_duration( + *timestamp, + slot_duration, + ); - Ok((slot, timestamp)) + Ok((slot, timestamp)) + } }, spawner: &task_manager.spawn_essential_handle(), registry: config.prometheus_registry(), @@ -118,7 +124,11 @@ pub fn new_partial(config: &Configuration) -> Result { } /// Builds a new service for a full client. -pub fn new_full(config: Configuration) -> Result { +pub fn new_full< + N: sc_network::NetworkBackend::Hash>, +>( + config: Configuration, +) -> Result { let sc_service::PartialComponents { client, backend, @@ -130,14 +140,24 @@ pub fn new_full(config: Configuration) -> Result { other: (block_import, grandpa_link, mut telemetry), } = new_partial(&config)?; - let mut net_config = sc_network::config::FullNetworkConfiguration::new(&config.network); + let mut net_config = sc_network::config::FullNetworkConfiguration::< + Block, + ::Hash, + N, + >::new(&config.network); + let metrics = N::register_notification_metrics(config.prometheus_registry()); + let peer_store_handle = net_config.peer_store_handle(); let grandpa_protocol_name = sc_consensus_grandpa::protocol_standard_name( &client.block_hash(0).ok().flatten().expect("Genesis block exists; qed"), &config.chain_spec, ); let (grandpa_protocol_config, grandpa_notification_service) = - sc_consensus_grandpa::grandpa_peers_set_config(grandpa_protocol_name.clone()); + sc_consensus_grandpa::grandpa_peers_set_config::<_, N>( + grandpa_protocol_name.clone(), + metrics.clone(), + peer_store_handle, + ); net_config.add_notification_protocol(grandpa_protocol_config); let warp_sync = Arc::new(sc_consensus_grandpa::warp_proof::NetworkProvider::new( @@ -157,6 +177,7 @@ pub fn new_full(config: Configuration) -> Result { block_announce_validator_builder: None, warp_sync_params: Some(WarpSyncParams::WithProvider(warp_sync)), block_relay: None, + metrics, })?; if config.offchain_worker.enabled { @@ -171,7 +192,7 @@ pub fn new_full(config: Configuration) -> Result { transaction_pool: Some(OffchainTransactionPoolFactory::new( transaction_pool.clone(), )), - network_provider: network.clone(), + network_provider: Arc::new(network.clone()), enable_http_requests: true, custom_extensions: |_| vec![], }) @@ -199,7 +220,7 @@ pub fn new_full(config: Configuration) -> Result { }; let _rpc_handlers = sc_service::spawn_tasks(sc_service::SpawnTasksParams { - network: network.clone(), + network: Arc::new(network.clone()), client: client.clone(), keystore: keystore_container.keystore(), task_manager: &mut task_manager, diff --git a/substrate/bin/node-template/pallets/template/Cargo.toml b/templates/solochain/pallets/template/Cargo.toml similarity index 52% rename from substrate/bin/node-template/pallets/template/Cargo.toml rename to templates/solochain/pallets/template/Cargo.toml index 51410a71c7bcee0267f36bbfcf20c616a5537ce3..24519f1d22e0d214e418974de65c7f77588498c4 100644 --- a/substrate/bin/node-template/pallets/template/Cargo.toml +++ b/templates/solochain/pallets/template/Cargo.toml @@ -1,13 +1,13 @@ [package] name = "pallet-template" -version = "4.0.0-dev" description = "FRAME pallet template for defining custom runtime logic." -authors = ["Substrate DevHub "] -homepage = "https://substrate.io" -edition.workspace = true +version = "0.0.0" license = "MIT-0" +authors.workspace = true +homepage.workspace = true +repository.workspace = true +edition.workspace = true publish = false -repository = "https://github.com/substrate-developer-hub/substrate-node-template/" [lints] workspace = true @@ -19,16 +19,19 @@ targets = ["x86_64-unknown-linux-gnu"] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = [ "derive", ] } -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -frame-benchmarking = { path = "../../../../frame/benchmarking", default-features = false, optional = true } -frame-support = { path = "../../../../frame/support", default-features = false } -frame-system = { path = "../../../../frame/system", default-features = false } -sp-std = { path = "../../../../primitives/std", default-features = false } +scale-info = { version = "2.11.1", default-features = false, features = [ + "derive", +] } + +# frame deps +frame-benchmarking = { path = "../../../../substrate/frame/benchmarking", default-features = false, optional = true } +frame-support = { path = "../../../../substrate/frame/support", default-features = false } +frame-system = { path = "../../../../substrate/frame/system", default-features = false } [dev-dependencies] -sp-core = { path = "../../../../primitives/core" } -sp-io = { path = "../../../../primitives/io" } -sp-runtime = { path = "../../../../primitives/runtime" } +sp-core = { path = "../../../../substrate/primitives/core" } +sp-io = { path = "../../../../substrate/primitives/io" } +sp-runtime = { path = "../../../../substrate/primitives/runtime" } [features] default = ["std"] @@ -41,7 +44,6 @@ std = [ "sp-core/std", "sp-io/std", "sp-runtime/std", - "sp-std/std", ] runtime-benchmarks = [ "frame-benchmarking/runtime-benchmarks", diff --git a/templates/solochain/pallets/template/README.md b/templates/solochain/pallets/template/README.md new file mode 100644 index 0000000000000000000000000000000000000000..9e4dc55267d69c47fff971cb0427bcb2e0ff871c --- /dev/null +++ b/templates/solochain/pallets/template/README.md @@ -0,0 +1 @@ +License: MIT-0 diff --git a/templates/solochain/pallets/template/src/benchmarking.rs b/templates/solochain/pallets/template/src/benchmarking.rs new file mode 100644 index 0000000000000000000000000000000000000000..5a262417629c579c6ecf5ada30ae803217623766 --- /dev/null +++ b/templates/solochain/pallets/template/src/benchmarking.rs @@ -0,0 +1,35 @@ +//! Benchmarking setup for pallet-template +#![cfg(feature = "runtime-benchmarks")] +use super::*; + +#[allow(unused)] +use crate::Pallet as Template; +use frame_benchmarking::v2::*; +use frame_system::RawOrigin; + +#[benchmarks] +mod benchmarks { + use super::*; + + #[benchmark] + fn do_something() { + let value = 100u32.into(); + let caller: T::AccountId = whitelisted_caller(); + #[extrinsic_call] + do_something(RawOrigin::Signed(caller), value); + + assert_eq!(Something::::get(), Some(value)); + } + + #[benchmark] + fn cause_error() { + Something::::put(100u32); + let caller: T::AccountId = whitelisted_caller(); + #[extrinsic_call] + cause_error(RawOrigin::Signed(caller)); + + assert_eq!(Something::::get(), Some(101u32)); + } + + impl_benchmark_test_suite!(Template, crate::mock::new_test_ext(), crate::mock::Test); +} diff --git a/substrate/bin/node-template/pallets/template/src/lib.rs b/templates/solochain/pallets/template/src/lib.rs similarity index 98% rename from substrate/bin/node-template/pallets/template/src/lib.rs rename to templates/solochain/pallets/template/src/lib.rs index 4a2e53baa774ee5ca333602024d458aa078f9c10..90dfe370145856cc08483cdbce2bbc542b21b2b9 100644 --- a/substrate/bin/node-template/pallets/template/src/lib.rs +++ b/templates/solochain/pallets/template/src/lib.rs @@ -90,9 +90,7 @@ pub mod pallet { /// /// In this template, we are declaring a storage item called `Something` that stores a single /// `u32` value. Learn more about runtime storage here: - /// The [`getter`] macro generates a function to conveniently retrieve the value from storage. #[pallet::storage] - #[pallet::getter(fn something)] pub type Something = StorageValue<_, u32>; /// Events that functions in this pallet can emit. @@ -187,7 +185,7 @@ pub mod pallet { let _who = ensure_signed(origin)?; // Read a value from storage. - match Pallet::::something() { + match Something::::get() { // Return an error if the value has not been set. None => Err(Error::::NoneValue.into()), Some(old) => { diff --git a/substrate/bin/node-template/pallets/template/src/mock.rs b/templates/solochain/pallets/template/src/mock.rs similarity index 93% rename from substrate/bin/node-template/pallets/template/src/mock.rs rename to templates/solochain/pallets/template/src/mock.rs index 8346461e6ed9bd97ff306bc69f11876a5b3391be..3f1fd2dd6d4441c2177d3f44a0f377b3ab2edc72 100644 --- a/substrate/bin/node-template/pallets/template/src/mock.rs +++ b/templates/solochain/pallets/template/src/mock.rs @@ -20,7 +20,7 @@ frame_support::construct_runtime!( } ); -#[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::TestDefaultConfig)] impl frame_system::Config for Test { type BaseCallFilter = frame_support::traits::Everything; type BlockWeights = (); diff --git a/substrate/bin/node-template/pallets/template/src/tests.rs b/templates/solochain/pallets/template/src/tests.rs similarity index 88% rename from substrate/bin/node-template/pallets/template/src/tests.rs rename to templates/solochain/pallets/template/src/tests.rs index 7c2b853ee4dc56fdf526a17557fe37281a50e803..83e4bea7377b348d8ac1d389813a788f79b81970 100644 --- a/substrate/bin/node-template/pallets/template/src/tests.rs +++ b/templates/solochain/pallets/template/src/tests.rs @@ -1,4 +1,4 @@ -use crate::{mock::*, Error, Event}; +use crate::{mock::*, Error, Event, Something}; use frame_support::{assert_noop, assert_ok}; #[test] @@ -9,7 +9,7 @@ fn it_works_for_default_value() { // Dispatch a signed extrinsic. assert_ok!(TemplateModule::do_something(RuntimeOrigin::signed(1), 42)); // Read pallet storage and assert an expected result. - assert_eq!(TemplateModule::something(), Some(42)); + assert_eq!(Something::::get(), Some(42)); // Assert that the correct event was deposited System::assert_last_event(Event::SomethingStored { something: 42, who: 1 }.into()); }); diff --git a/templates/solochain/pallets/template/src/weights.rs b/templates/solochain/pallets/template/src/weights.rs new file mode 100644 index 0000000000000000000000000000000000000000..7c42936e09f292de831d28460a3bc39436c3323f --- /dev/null +++ b/templates/solochain/pallets/template/src/weights.rs @@ -0,0 +1,90 @@ + +//! Autogenerated weights for pallet_template +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-04-06, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `Alexs-MacBook-Pro-2.local`, CPU: `` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("dev"), DB CACHE: 1024 + +// Executed Command: +// ../../target/release/node-template +// benchmark +// pallet +// --chain +// dev +// --pallet +// pallet_template +// --extrinsic +// * +// --steps=50 +// --repeat=20 +// --wasm-execution=compiled +// --output +// pallets/template/src/weights.rs +// --template +// ../../.maintain/frame-weight-template.hbs + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::{Weight, constants::RocksDbWeight}}; +use core::marker::PhantomData; + +/// Weight functions needed for pallet_template. +pub trait WeightInfo { + fn do_something() -> Weight; + fn cause_error() -> Weight; +} + +/// Weights for pallet_template using the Substrate node and recommended hardware. +pub struct SubstrateWeight(PhantomData); +impl WeightInfo for SubstrateWeight { + /// Storage: TemplateModule Something (r:0 w:1) + /// Proof: TemplateModule Something (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + fn do_something() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 8_000_000 picoseconds. + Weight::from_parts(9_000_000, 0) + .saturating_add(T::DbWeight::get().writes(1_u64)) + } + /// Storage: TemplateModule Something (r:1 w:1) + /// Proof: TemplateModule Something (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + fn cause_error() -> Weight { + // Proof Size summary in bytes: + // Measured: `32` + // Estimated: `1489` + // Minimum execution time: 6_000_000 picoseconds. + Weight::from_parts(6_000_000, 1489) + .saturating_add(T::DbWeight::get().reads(1_u64)) + .saturating_add(T::DbWeight::get().writes(1_u64)) + } +} + +// For backwards compatibility and tests +impl WeightInfo for () { + /// Storage: TemplateModule Something (r:0 w:1) + /// Proof: TemplateModule Something (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + fn do_something() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 8_000_000 picoseconds. + Weight::from_parts(9_000_000, 0) + .saturating_add(RocksDbWeight::get().writes(1_u64)) + } + /// Storage: TemplateModule Something (r:1 w:1) + /// Proof: TemplateModule Something (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + fn cause_error() -> Weight { + // Proof Size summary in bytes: + // Measured: `32` + // Estimated: `1489` + // Minimum execution time: 6_000_000 picoseconds. + Weight::from_parts(6_000_000, 1489) + .saturating_add(RocksDbWeight::get().reads(1_u64)) + .saturating_add(RocksDbWeight::get().writes(1_u64)) + } +} diff --git a/templates/solochain/runtime/Cargo.toml b/templates/solochain/runtime/Cargo.toml new file mode 100644 index 0000000000000000000000000000000000000000..7a81f192043f5bc516ca774e1cebf8c039f06ceb --- /dev/null +++ b/templates/solochain/runtime/Cargo.toml @@ -0,0 +1,149 @@ +[package] +name = "solochain-template-runtime" +description = "A solochain runtime template built with Substrate, part of Polkadot Sdk." +version = "0.0.0" +license = "MIT-0" +authors.workspace = true +homepage.workspace = true +repository.workspace = true +edition.workspace = true +publish = false + +[lints] +workspace = true + +[package.metadata.docs.rs] +targets = ["x86_64-unknown-linux-gnu"] + +[dependencies] +codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = [ + "derive", +] } +scale-info = { version = "2.11.1", default-features = false, features = [ + "derive", + "serde", +] } + +# frame +frame-support = { path = "../../../substrate/frame/support", default-features = false, features = ["experimental"] } +frame-system = { path = "../../../substrate/frame/system", default-features = false } +frame-try-runtime = { path = "../../../substrate/frame/try-runtime", default-features = false, optional = true } +frame-executive = { path = "../../../substrate/frame/executive", default-features = false } + +# frame pallets +pallet-aura = { path = "../../../substrate/frame/aura", default-features = false } +pallet-balances = { path = "../../../substrate/frame/balances", default-features = false } +pallet-grandpa = { path = "../../../substrate/frame/grandpa", default-features = false } +pallet-sudo = { path = "../../../substrate/frame/sudo", default-features = false } +pallet-timestamp = { path = "../../../substrate/frame/timestamp", default-features = false } +pallet-transaction-payment = { path = "../../../substrate/frame/transaction-payment", default-features = false } + +# primitives +sp-api = { path = "../../../substrate/primitives/api", default-features = false } +sp-block-builder = { path = "../../../substrate/primitives/block-builder", default-features = false } +sp-consensus-aura = { path = "../../../substrate/primitives/consensus/aura", default-features = false, features = [ + "serde", +] } +sp-consensus-grandpa = { path = "../../../substrate/primitives/consensus/grandpa", default-features = false, features = [ + "serde", +] } +sp-core = { path = "../../../substrate/primitives/core", default-features = false, features = [ + "serde", +] } +sp-inherents = { path = "../../../substrate/primitives/inherents", default-features = false } +sp-offchain = { path = "../../../substrate/primitives/offchain", default-features = false } +sp-runtime = { path = "../../../substrate/primitives/runtime", default-features = false, features = [ + "serde", +] } +sp-session = { path = "../../../substrate/primitives/session", default-features = false } +sp-std = { path = "../../../substrate/primitives/std", default-features = false } +sp-storage = { path = "../../../substrate/primitives/storage", default-features = false } +sp-transaction-pool = { path = "../../../substrate/primitives/transaction-pool", default-features = false } +sp-version = { path = "../../../substrate/primitives/version", default-features = false, features = [ + "serde", +] } +sp-genesis-builder = { path = "../../../substrate/primitives/genesis-builder", default-features = false } + +# RPC related +frame-system-rpc-runtime-api = { path = "../../../substrate/frame/system/rpc/runtime-api", default-features = false } +pallet-transaction-payment-rpc-runtime-api = { path = "../../../substrate/frame/transaction-payment/rpc/runtime-api", default-features = false } + +# Used for runtime benchmarking +frame-benchmarking = { path = "../../../substrate/frame/benchmarking", default-features = false, optional = true } +frame-system-benchmarking = { path = "../../../substrate/frame/system/benchmarking", default-features = false, optional = true } + +# The pallet in this template. +pallet-template = { path = "../pallets/template", default-features = false } + +[build-dependencies] +substrate-wasm-builder = { path = "../../../substrate/utils/wasm-builder", optional = true } + +[features] +default = ["std"] +std = [ + "codec/std", + "scale-info/std", + + "frame-executive/std", + "frame-support/std", + "frame-system-benchmarking?/std", + "frame-system-rpc-runtime-api/std", + "frame-system/std", + + "frame-benchmarking?/std", + "frame-try-runtime?/std", + + "pallet-aura/std", + "pallet-balances/std", + "pallet-grandpa/std", + "pallet-sudo/std", + "pallet-template/std", + "pallet-timestamp/std", + "pallet-transaction-payment-rpc-runtime-api/std", + "pallet-transaction-payment/std", + + "sp-api/std", + "sp-block-builder/std", + "sp-consensus-aura/std", + "sp-consensus-grandpa/std", + "sp-core/std", + "sp-genesis-builder/std", + "sp-inherents/std", + "sp-offchain/std", + "sp-runtime/std", + "sp-session/std", + "sp-std/std", + "sp-storage/std", + "sp-transaction-pool/std", + "sp-version/std", + + "substrate-wasm-builder", +] + +runtime-benchmarks = [ + "frame-benchmarking/runtime-benchmarks", + "frame-support/runtime-benchmarks", + "frame-system-benchmarking/runtime-benchmarks", + "frame-system/runtime-benchmarks", + "pallet-balances/runtime-benchmarks", + "pallet-grandpa/runtime-benchmarks", + "pallet-sudo/runtime-benchmarks", + "pallet-template/runtime-benchmarks", + "pallet-timestamp/runtime-benchmarks", + "sp-runtime/runtime-benchmarks", +] + +try-runtime = [ + "frame-executive/try-runtime", + "frame-support/try-runtime", + "frame-system/try-runtime", + "frame-try-runtime/try-runtime", + "pallet-aura/try-runtime", + "pallet-balances/try-runtime", + "pallet-grandpa/try-runtime", + "pallet-sudo/try-runtime", + "pallet-template/try-runtime", + "pallet-timestamp/try-runtime", + "pallet-transaction-payment/try-runtime", + "sp-runtime/try-runtime", +] diff --git a/substrate/bin/node-template/runtime/build.rs b/templates/solochain/runtime/build.rs similarity index 100% rename from substrate/bin/node-template/runtime/build.rs rename to templates/solochain/runtime/build.rs diff --git a/substrate/bin/node-template/runtime/src/lib.rs b/templates/solochain/runtime/src/lib.rs similarity index 91% rename from substrate/bin/node-template/runtime/src/lib.rs rename to templates/solochain/runtime/src/lib.rs index 0ecd17282f06d2e7fcf4409271cfaea5afa14c41..9966115c9d15d1888d48115f3d59ae64441a58ec 100644 --- a/substrate/bin/node-template/runtime/src/lib.rs +++ b/templates/solochain/runtime/src/lib.rs @@ -1,8 +1,5 @@ #![cfg_attr(not(feature = "std"), no_std)] -// `construct_runtime!` does a lot of recursion and requires us to increase the limit to 256. -#![recursion_limit = "256"] -// Make the WASM binary available. #[cfg(feature = "std")] include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs")); @@ -21,8 +18,7 @@ use sp_std::prelude::*; use sp_version::NativeVersion; use sp_version::RuntimeVersion; -use frame_support::genesis_builder_helper::{build_config, create_default_config}; -// A few exports that help ease life for downstream crates. +use frame_support::genesis_builder_helper::{build_state, get_preset}; pub use frame_support::{ construct_runtime, derive_impl, dispatch::DispatchClass, @@ -42,7 +38,7 @@ pub use frame_support::{ pub use frame_system::Call as SystemCall; pub use pallet_balances::Call as BalancesCall; pub use pallet_timestamp::Call as TimestampCall; -use pallet_transaction_payment::{ConstFeeMultiplier, CurrencyAdapter, Multiplier}; +use pallet_transaction_payment::{ConstFeeMultiplier, FungibleAdapter, Multiplier}; #[cfg(any(feature = "std", test))] pub use sp_runtime::BuildStorage; pub use sp_runtime::{Perbill, Permill}; @@ -97,8 +93,8 @@ pub mod opaque { // https://docs.substrate.io/main-docs/build/upgrade#runtime-versioning #[sp_version::runtime_version] pub const VERSION: RuntimeVersion = RuntimeVersion { - spec_name: create_runtime_str!("node-template"), - impl_name: create_runtime_str!("node-template"), + spec_name: create_runtime_str!("solochain-template-runtime"), + impl_name: create_runtime_str!("solochain-template-runtime"), authoring_version: 1, // The version of the runtime specification. A full node will not attempt to use its native // runtime in substitute for the on-chain Wasm runtime unless all of `spec_name`, @@ -154,7 +150,7 @@ parameter_types! { /// The default types are being injected by [`derive_impl`](`frame_support::derive_impl`) from /// [`SoloChainDefaultConfig`](`struct@frame_system::config_preludes::SolochainDefaultConfig`), /// but overridden as needed. -#[derive_impl(frame_system::config_preludes::SolochainDefaultConfig as frame_system::DefaultConfig)] +#[derive_impl(frame_system::config_preludes::SolochainDefaultConfig)] impl frame_system::Config for Runtime { /// The block type for the runtime. type Block = Block; @@ -186,8 +182,6 @@ impl pallet_aura::Config for Runtime { type DisabledValidators = (); type MaxAuthorities = ConstU32<32>; type AllowMultipleBlocksPerSlot = ConstBool; - - #[cfg(feature = "experimental")] type SlotDuration = pallet_aura::MinimumPeriodTimesTwo; } @@ -238,7 +232,7 @@ parameter_types! { impl pallet_transaction_payment::Config for Runtime { type RuntimeEvent = RuntimeEvent; - type OnChargeTransaction = CurrencyAdapter; + type OnChargeTransaction = FungibleAdapter; type OperationalFeeMultiplier = ConstU8<5>; type WeightToFee = IdentityFee; type LengthToFee = IdentityFee; @@ -258,19 +252,47 @@ impl pallet_template::Config for Runtime { } // Create the runtime by composing the FRAME pallets that were previously configured. -construct_runtime!( - pub struct Runtime { - System: frame_system, - Timestamp: pallet_timestamp, - Aura: pallet_aura, - Grandpa: pallet_grandpa, - Balances: pallet_balances, - TransactionPayment: pallet_transaction_payment, - Sudo: pallet_sudo, - // Include the custom logic from the pallet-template in the runtime. - TemplateModule: pallet_template, - } -); +#[frame_support::runtime] +mod runtime { + #[runtime::runtime] + #[runtime::derive( + RuntimeCall, + RuntimeEvent, + RuntimeError, + RuntimeOrigin, + RuntimeFreezeReason, + RuntimeHoldReason, + RuntimeSlashReason, + RuntimeLockId, + RuntimeTask + )] + pub struct Runtime; + + #[runtime::pallet_index(0)] + pub type System = frame_system; + + #[runtime::pallet_index(1)] + pub type Timestamp = pallet_timestamp; + + #[runtime::pallet_index(2)] + pub type Aura = pallet_aura; + + #[runtime::pallet_index(3)] + pub type Grandpa = pallet_grandpa; + + #[runtime::pallet_index(4)] + pub type Balances = pallet_balances; + + #[runtime::pallet_index(5)] + pub type TransactionPayment = pallet_transaction_payment; + + #[runtime::pallet_index(6)] + pub type Sudo = pallet_sudo; + + // Include the custom logic from the pallet-template in the runtime. + #[runtime::pallet_index(7)] + pub type TemplateModule = pallet_template; +} /// The address format for describing accounts. pub type Address = sp_runtime::MultiAddress; @@ -333,7 +355,7 @@ impl_runtime_apis! { Executive::execute_block(block); } - fn initialize_block(header: &::Header) { + fn initialize_block(header: &::Header) -> sp_runtime::ExtrinsicInclusionMode { Executive::initialize_block(header) } } @@ -395,7 +417,7 @@ impl_runtime_apis! { } fn authorities() -> Vec { - Aura::authorities().into_inner() + pallet_aura::Authorities::::get().into_inner() } } @@ -553,12 +575,16 @@ impl_runtime_apis! { } impl sp_genesis_builder::GenesisBuilder for Runtime { - fn create_default_config() -> Vec { - create_default_config::() + fn build_state(config: Vec) -> sp_genesis_builder::Result { + build_state::(config) + } + + fn get_preset(id: &Option) -> Option> { + get_preset::(id, |_| None) } - fn build_config(config: Vec) -> sp_genesis_builder::Result { - build_config::(config) + fn preset_names() -> Vec { + vec![] } } }